MCPcopy
hub / github.com/danvk/source-map-explorer / LP

Function LP

tests/data/big.js:1–1  ·  view source on GitHub ↗
(t,e)

Source from the content-addressed store, hash-verified

1(()=>{var t={69495:(t,e,i)=>{i(73906),i(499),i(88392),i(55977),i(53382),i(9246),i(15693),i(82110),i(80780),i(75370),i(99019),i(65991),i(65040),i(82011),i(70661),i(37007),i(33639),i(34895),i(66412),i(44157),i(38300),i(58503),i(59500),i(20791),i(22473),i(79062),i(23946),i(76973),i(65679),i(88263),i(57425),i(25699),i(81736),i(10070),i(50031),i(3930),i(72814),i(37621),i(95773),i(26485),i(34913),i(68071),i(46441),i(2506),i(9413),i(67081),i(87391),i(43664),i(83528),i(69050),i(20770),i(97307),i(44841),i(17093),i(81548),i(63327),i(93606),i(41988),i(66957),i(74410),i(55882),i(17448),i(78384),i(29578),i(50300),i(44316),i(94093),i(33453),i(72006),i(57500),i(2613),i(55495),i(41499),i(18670),i(40989),i(19569),i(23372),i(75560),i(48075),i(28828),i(45539),i(97027),i(12778),i(4350),i(12755),i(168),i(52325),i(54503),i(20075),i(19133),i(770),i(32975),i(4184),i(9613),i(99334),i(72046),i(84531),i(3573),i(26463),i(19584),i(95917),i(672),i(90982),i(60365),i(83813),i(99058),i(21413),i(31113),i(78526),i(80181),i(36672),i(84317),i(76515),i(93189),i(99042),i(31116),i(87294),i(2877),i(60242),i(75737),i(55515),i(34825),i(67401),i(3398),i(37401),i(58137),i(14107),i(79427),i(57090),i(66060),i(68176),i(19476),i(12386),i(93113),i(42376),i(41398),i(68162),i(71070),i(99476),i(3186),i(4407),i(39053),i(7083),i(58008),i(11904),i(36472),i(76536),i(37692),i(91702),i(91772),i(8378),i(80149),i(65017),i(31417),i(35075),i(98510),i(60471),i(31023),i(79368),i(54093),i(58976),i(21785),i(87731),i(12223),i(80714),i(24878),i(3140),i(68377),i(21972),i(79544),i(28006),i(67619),i(969),i(1558),i(38954),i(61264),i(6551),i(87189),i(28581),i(77923),i(44016),i(92626),i(26737),i(82361),i(77673),i(51699),i(77257),i(6171),i(68816),i(4661),i(92811),i(69535),i(5912),i(2470),i(83771),i(1789),i(27942),i(40080),i(58347),i(94022),i(53043),i(41841),i(60142),i(85529),i(41454),i(3994),i(8014);var n=i(29467);t.exports=n},81444:(t,e,i)=>{i(69495),i(72368),i(83582);var n=i(29467);t.exports=n},23775:t=>{t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},66020:(t,e,i)=>{var n=i(68580);t.exports=function(t){if(!n(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},35240:(t,e,i)=>{var n=i(10548),r=i(37602),s=i(64774),o=n("unscopables"),a=Array.prototype;null==a[o]&&s.f(a,o,{configurable:!0,value:r(null)}),t.exports=function(t){a[o][t]=!0}},64334:(t,e,i)=>{"use strict";var n=i(17933).charAt;t.exports=function(t,e,i){return e+(i?n(t,e).length:1)}},31057:t=>{t.exports=function(t,e,i){if(!(t instanceof e))throw TypeError("Incorrect "+(i?i+" ":"")+"invocation");return t}},13980:(t,e,i)=>{var n=i(68580);t.exports=function(t){if(!n(t))throw TypeError(String(t)+" is not an object");return t}},73409:t=>{t.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},81609:(t,e,i)=>{"use strict";var n,r=i(73409),s=i(56617),o=i(33386),a=i(68580),h=i(54585),u=i(16385),l=i(17182),c=i(18957),d=i(64774).f,p=i(29528),f=i(15456),m=i(10548),v=i(37645),g=o.Int8Array,y=g&&g.prototype,_=o.Uint8ClampedArray,x=_&&_.prototype,b=g&&p(g),w=y&&p(y),T=Object.prototype,M=T.isPrototypeOf,S=m("toStringTag"),E=v("TYPED_ARRAY_TAG"),L=r&&!!f&&"Opera"!==u(o.opera),A=!1,D={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},P=function(t){return a(t)&&h(D,u(t))};for(n in D)o[n]||(L=!1);if((!L||"function"!=typeof b||b===Function.prototype)&&(b=function(){throw TypeError("Incorrect invocation")},L))for(n in D)o[n]&&f(o[n],b);if((!L||!w||w===T)&&(w=b.prototype,L))for(n in D)o[n]&&f(o[n].prototype,w);if(L&&p(x)!==w&&f(x,w),s&&!h(w,S))for(n in A=!0,d(w,S,{get:function(){return a(this)?this[E]:void 0}}),D)o[n]&&l(o[n],E,n);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:L,TYPED_ARRAY_TAG:A&&E,aTypedArray:function(t){if(P(t))return t;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(t){if(f){if(M.call(b,t))return t}else for(var e in D)if(h(D,n)){var i=o[e];if(i&&(t===i||M.call(i,t)))return t}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(t,e,i){if(s){if(i)for(var n in D){var r=o[n];r&&h(r.prototype,t)&&delete r.prototype[t]}w[t]&&!i||c(w,t,i?e:L&&y[t]||e)}},exportTypedArrayStaticMethod:function(t,e,i){var n,r;if(s){if(f){if(i)for(n in D)(r=o[n])&&h(r,t)&&delete r[t];if(b[t]&&!i)return;try{return c(b,t,i?e:L&&g[t]||e)}catch(t){}}for(n in D)!(r=o[n])||r[t]&&!i||c(r,t,e)}},isView:function(t){var e=u(t);return"DataView"===e||h(D,e)},isTypedArray:P,TypedArray:b,TypedArrayPrototype:w}},50539:(t,e,i)=>{"use strict";var n=i(33386),r=i(56617),s=i(73409),o=i(17182),a=i(11432),h=i(38493),u=i(31057),l=i(1557),c=i(7933),d=i(30035),p=i(31787),f=i(29528),m=i(15456),v=i(74562).f,g=i(64774).f,y=i(53009),_=i(39893),x=i(97030),b=x.get,w=x.set,T="ArrayBuffer",M="DataView",S="Wrong index",E=n.ArrayBuffer,L=E,A=n.DataView,D=A&&A.prototype,P=Object.prototype,C=n.RangeError,O=p.pack,k=p.unpack,R=function(t){return[255&t]},I=function(t){return[255&t,t>>8&255]},Y=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},F=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},N=function(t){return O(t,23,4)},B=function(t){return O(t,52,8)},U=function(t,e){g(t.prototype,e,{get:function(){return b(this)[e]}})},j=function(t,e,i,n){var r=d(i),s=b(t);if(r+e>s.byteLength)throw C(S);var o=b(s.buffer).bytes,a=r+s.byteOffset,h=o.slice(a,a+e);return n?h:h.reverse()},H=function(t,e,i,n,r,s){var o=d(i),a=b(t);if(o+e>a.byteLength)throw C(S);for(var h=b(a.buffer).bytes,u=o+a.byteOffset,l=n(+r),c=0;c<e;c++)h[u+c]=l[s?c:e-c-1]};if(s){if(!h((function(){E(1)}))||!h((function(){new E(-1)}))||h((function(){return new E,new E(1.5),new E(NaN),E.name!=T}))){for(var z,W=(L=function(t){return u(this,L),new E(d(t))}).prototype=E.prototype,G=v(E),V=0;G.length>V;)(z=G[V++])in L||o(L,z,E[z]);W.constructor=L}m&&f(D)!==P&&m(D,P);var X=new A(new L(2)),q=D.setInt8;X.setInt8(0,2147483648),X.setInt8(1,2147483649),!X.getInt8(0)&&X.getInt8(1)||a(D,{setInt8:function(t,e){q.call(this,t,e<<24>>24)},setUint8:function(t,e){q.call(this,t,e<<24>>24)}},{unsafe:!0})}else L=function(t){u(this,L,T);var e=d(t);w(this,{bytes:y.call(new Array(e),0),byteLength:e}),r||(this.byteLength=e)},A=function(t,e,i){u(this,A,M),u(t,L,M);var n=b(t).byteLength,s=l(e);if(s<0||s>n)throw C("Wrong offset");if(s+(i=void 0===i?n-s:c(i))>n)throw C("Wrong length");w(this,{buffer:t,byteLength:i,byteOffset:s}),r||(this.buffer=t,this.byteLength=i,this.byteOffset=s)},r&&(U(L,"byteLength"),U(A,"buffer"),U(A,"byteLength"),U(A,"byteOffset")),a(A.prototype,{getInt8:function(t){return j(this,1,t)[0]<<24>>24},getUint8:function(t){return j(this,1,t)[0]},getInt16:function(t){var e=j(this,2,t,arguments.length>1?arguments[1]:void 0);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=j(this,2,t,arguments.length>1?arguments[1]:void 0);return e[1]<<8|e[0]},getInt32:function(t){return F(j(this,4,t,arguments.length>1?arguments[1]:void 0))},getUint32:function(t){return F(j(this,4,t,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(t){return k(j(this,4,t,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(t){return k(j(this,8,t,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(t,e){H(this,1,t,R,e)},setUint8:function(t,e){H(this,1,t,R,e)},setInt16:function(t,e){H(this,2,t,I,e,arguments.length>2?arguments[2]:void 0)},setUint16:function(t,e){H(this,2,t,I,e,arguments.length>2?arguments[2]:void 0)},setInt32:function(t,e){H(this,4,t,Y,e,arguments.length>2?arguments[2]:void 0)},setUint32:function(t,e){H(this,4,t,Y,e,arguments.length>2?arguments[2]:void 0)},setFloat32:function(t,e){H(this,4,t,N,e,arguments.length>2?arguments[2]:void 0)},setFloat64:function(t,e){H(this,8,t,B,e,arguments.length>2?arguments[2]:void 0)}});_(L,T),_(A,M),t.exports={ArrayBuffer:L,DataView:A}},69801:(t,e,i)=>{"use strict";var n=i(51223),r=i(11486),s=i(7933),o=Math.min;t.exports=[].copyWithin||function(t,e){var i=n(this),a=s(i.length),h=r(t,a),u=r(e,a),l=arguments.length>2?arguments[2]:void 0,c=o((void 0===l?a:r(l,a))-u,a-h),d=1;for(u<h&&h<u+c&&(d=-1,u+=c-1,h+=c-1);c-- >0;)u in i?i[h]=i[u]:delete i[h],h+=d,u+=d;return i}},53009:(t,e,i)=>{"use strict";var n=i(51223),r=i(11486),s=i(7933);t.exports=function(t){for(var e=n(this),i=s(e.length),o=arguments.length,a=r(o>1?arguments[1]:void 0,i),h=o>2?arguments[2]:void 0,u=void 0===h?i:r(h,i);u>a;)e[a++]=t;return e}},64902:(t,e,i)=>{"use strict";var n=i(7622).forEach,r=i(91649),s=i(12797),o=r("forEach"),a=s("forEach");t.exports=o&&a?[].forEach:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}},83601:(t,e,i)=>{"use strict";var n=i(39181),r=i(51223),s=i(31404),o=i(31243),a=i(7933),h=i(73685),u=i(99683);t.exports=function(t){var e,i,l,c,d,p,f=r(t),m="function"==typeof this?this:Array,v=arguments.length,g=v>1?arguments[1]:void 0,y=void 0!==g,_=u(f),x=0;if(y&&(g=n(g,v>2?arguments[2]:void 0,2)),null==_||m==Array&&o(_))for(i=new m(e=a(f.length));e>x;x++)p=y?g(f[x],x):f[x],h(i,x,p);else for(d=(c=_.call(f)).next,i=new m;!(l=d.call(c)).done;x++)p=y?s(c,g,[l.value,x],!0):l.value,h(i,x,p);return i.length=x,i}},93289:(t,e,i)=>{var n=i(86939),r=i(7933),s=i(11486),o=function(t){return function(e,i,o){var a,h=n(e),u=r(h.length),l=s(o,u);if(t&&i!=i){for(;u>l;)if((a=h[l++])!=a)return!0}else for(;u>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},7622:(t,e,i)=>{var n=i(39181),r=i(11749),s=i(51223),o=i(7933),a=i(44359),h=[].push,u=function(t){var e=1==t,i=2==t,u=3==t,l=4==t,c=6==t,d=5==t||c;return function(p,f,m,v){for(var g,y,_=s(p),x=r(_),b=n(f,m,3),w=o(x.length),T=0,M=v||a,S=e?M(p,w):i?M(p,0):void 0;w>T;T++)if((d||T in x)&&(y=b(g=x[T],T,_),t))if(e)S[T]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return T;case 2:h.call(S,g)}else if(l)return!1;return c?-1:u||l?l:S}};t.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6)}},8287:(t,e,i)=>{"use strict";var n=i(86939),r=i(1557),s=i(7933),o=i(91649),a=i(12797),h=Math.min,u=[].lastIndexOf,l=!!u&&1/[1].lastIndexOf(1,-0)<0,c=o("lastIndexOf"),d=a("indexOf",{ACCESSORS:!0,1:0}),p=l||!c||!d;t.exports=p?function(t){if(l)return u.apply(this,arguments)||0;var e=n(this),i=s(e.length),o=i-1;for(arguments.length>1&&(o=h(o,r(arguments[1]))),o<0&&(o=i+o);o>=0;o--)if(o in e&&e[o]===t)return o||0;return-1}:u},46453:(t,e,i)=>{var n=i(38493),r=i(10548),s=i(80823),o=r("species");t.exports=function(t){return s>=51||!n((function(){var e=[];return(e.constructor={})[o]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},91649:(t,e,i)=>{"use strict";var n=i(38493);t.exports=function(t,e){var i=[][t];return!!i&&n((function(){i.call(null,e||function(){throw 1},1)}))}},12797:(t,e,i)=>{var n=i(56617),r=i(38493),s=i(54585),o=Object.defineProperty,a={},h=function(t){throw t};t.exports=function(t,e){if(s(a,t))return a[t];e||(e={});var i=[][t],u=!!s(e,"ACCESSORS")&&e.ACCESSORS,l=s(e,0)?e[0]:h,c=s(e,1)?e[1]:void 0;return a[t]=!!i&&!r((function(){if(u&&!n)return!0;var t={length:-1};u?o(t,1,{enumerable:!0,get:h}):t[1]=1,i.call(t,l,c)}))}},22164:(t,e,i)=>{var n=i(23775),r=i(51223),s=i(11749),o=i(7933),a=function(t){return function(e,i,a,h){n(i);var u=r(e),l=s(u),c=o(u.length),d=t?c-1:0,p=t?-1:1;if(a<2)for(;;){if(d in l){h=l[d],d+=p;break}if(d+=p,t?d<0:c<=d)throw TypeError("Reduce of empty array with no initial value")}for(;t?d>=0:c>d;d+=p)d in l&&(h=i(h,l[d],d,u));return h}};t.exports={left:a(!1),right:a(!0)}},44359:(t,e,i)=>{var n=i(68580),r=i(20351),s=i(10548)("species");t.exports=function(t,e){var i;return r(t)&&("function"!=typeof(i=t.constructor)||i!==Array&&!r(i.prototype)?n(i)&&null===(i=i[s])&&(i=void 0):i=void 0),new(void 0===i?Array:i)(0===e?0:e)}},25542:(t,e,i)=>{"use strict";var n=i(29467),r=i(23775),s=i(13980),o=i(37602),a=i(17182),h=i(11432),u=i(10548),l=i(97030),c=i(27623)("Promise"),d=l.set,p=l.get,f=u("toStringTag"),m=function(t){var e=p(this).iterator,i=e.return;return void 0===i?c.resolve({done:!0,value:t}):s(i.call(e,t))},v=function(t){var e=p(this).iterator,i=e.throw;return void 0===i?c.reject(t):i.call(e,t)};t.exports=function(t,e){var i=function(t){t.next=r(t.iterator.next),t.done=!1,d(this,t)};return i.prototype=h(o(n.AsyncIterator.prototype),{next:function(e){var i=p(this);if(i.done)return c.resolve({done:!0,value:void 0});try{return c.resolve(s(t.call(i,e,c)))}catch(t){return c.reject(t)}},return:m,throw:v}),e||a(i.prototype,f,"Generator"),i}},87505:(t,e,i)=>{"use strict";var n=i(23775),r=i(13980),s=i(27623)("Promise"),o=[].push,a=function(t){var e=0==t,i=1==t,a=2==t,h=3==t;return function(t,u){r(t);var l=n(t.next),c=e?[]:void 0;return e||n(u),new s((function(n,d){var p=function(){try{s.resolve(r(l.call(t))).then((function(t){try{if(r(t).done)n(e?c:!h&&(a||void 0));else{var l=t.value;e?(o.call(c,l),p()):s.resolve(u(l)).then((function(t){i?p():a?t?p():n(!1):t?n(h||l):p()}),d)}}catch(t){d(t)}}),d)}catch(t){d(t)}};p()}))}};t.exports={toArray:a(0),forEach:a(1),every:a(2),some:a(3),find:a(4)}},45535:(t,e,i)=>{var n,r,s=i(33386),o=i(50671),a=i(29528),h=i(54585),u=i(17182),l=i(10548),c=i(51104),d=l("asyncIterator"),p=s.AsyncIterator,f=o.AsyncIteratorPrototype;if(!c)if(f)n=f;else if("function"==typeof p)n=p.prototype;else if(o.USE_FUNCTION_CONSTRUCTOR||s.USE_FUNCTION_CONSTRUCTOR)try{r=a(a(a(Function("return async function*(){}()")()))),a(r)===Object.prototype&&(n=r)}catch(t){}n||(n={}),h(n,d)||u(n,d,(function(){return this})),t.exports=n},31404:(t,e,i)=>{var n=i(13980);t.exports=function(t,e,i,r){try{return r?e(n(i)[0],i[1]):e(i)}catch(e){var s=t.return;throw void 0!==s&&n(s.call(t)),e}}},92916:(t,e,i)=>{var n=i(10548)("iterator"),r=!1;try{var s=0,o={next:function(){return{done:!!s++}},return:function(){r=!0}};o[n]=function(){return this},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!r)return!1;var i=!1;try{var s={};s[n]=function(){return{next:function(){return{done:i=!0}}}},t(s)}catch(t){}return i}},2178:t=>{var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},16385:(t,e,i)=>{var n=i(29100),r=i(2178),s=i(10548)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=n?r:function(t){var e,i,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),s))?i:o?r(e):"Object"==(n=r(e))&&"function"==typeof e.callee?"Arguments":n}},31553:(t,e,i)=>{"use strict";var n=i(13980),r=i(23775);t.exports=function(){for(var t=n(this),e=r(t.add),i=0,s=arguments.length;i<s;i++)e.call(t,arguments[i]);return t}},84537:(t,e,i)=>{"use strict";var n=i(13980),r=i(23775);t.exports=function(){for(var t,e=n(this),i=r(e.delete),s=!0,o=0,a=arguments.length;o<a;o++)t=i.call(e,arguments[o]),s=s&&t;return!!s}},63842:(t,e,i)=>{"use strict";var n=i(23775),r=i(39181),s=i(76808);t.exports=function(t){var e,i,o,a,h=arguments.length,u=h>1?arguments[1]:void 0;return n(this),(e=void 0!==u)&&n(u),null==t?new this:(i=[],e?(o=0,a=r(u,h>2?arguments[2]:void 0,2),s(t,(function(t){i.push(a(t,o++))}))):s(t,i.push,i),new this(i))}},96089:t=>{"use strict";t.exports=function(){for(var t=arguments.length,e=new Array(t);t--;)e[t]=arguments[t];return new this(e)}},5749:(t,e,i)=>{"use strict";var n=i(64774).f,r=i(37602),s=i(11432),o=i(39181),a=i(31057),h=i(76808),u=i(7693),l=i(16906),c=i(56617),d=i(8080).fastKey,p=i(97030),f=p.set,m=p.getterFor;t.exports={getConstructor:function(t,e,i,u){var l=t((function(t,n){a(t,l,e),f(t,{type:e,index:r(null),first:void 0,last:void 0,size:0}),c||(t.size=0),null!=n&&h(n,t[u],t,i)})),p=m(e),v=function(t,e,i){var n,r,s=p(t),o=g(t,e);return o?o.value=i:(s.last=o={index:r=d(e,!0),key:e,value:i,previous:n=s.last,next:void 0,removed:!1},s.first||(s.first=o),n&&(n.next=o),c?s.size++:t.size++,"F"!==r&&(s.index[r]=o)),t},g=function(t,e){var i,n=p(t),r=d(e);if("F"!==r)return n.index[r];for(i=n.first;i;i=i.next)if(i.key==e)return i};return s(l.prototype,{clear:function(){for(var t=p(this),e=t.index,i=t.first;i;)i.removed=!0,i.previous&&(i.previous=i.previous.next=void 0),delete e[i.index],i=i.next;t.first=t.last=void 0,c?t.size=0:this.size=0},delete:function(t){var e=this,i=p(e),n=g(e,t);if(n){var r=n.next,s=n.previous;delete i.index[n.index],n.removed=!0,s&&(s.next=r),r&&(r.previous=s),i.first==n&&(i.first=r),i.last==n&&(i.last=s),c?i.size--:e.size--}return!!n},forEach:function(t){for(var e,i=p(this),n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.next:i.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!g(this,t)}}),s(l.prototype,i?{get:function(t){var e=g(this,t);return e&&e.value},set:function(t,e){return v(this,0===t?0:t,e)}}:{add:function(t){return v(this,t=0===t?0:t,t)}}),c&&n(l.prototype,"size",{get:function(){return p(this).size}}),l},setStrong:function(t,e,i){var n=e+" Iterator",r=m(e),s=m(n);u(t,e,(function(t,e){f(this,{type:n,target:t,state:r(t),kind:e,last:void 0})}),(function(){for(var t=s(this),e=t.kind,i=t.last;i&&i.removed;)i=i.previous;return t.target&&(t.last=i=i?i.next:t.state.first)?"keys"==e?{value:i.key,done:!1}:"values"==e?{value:i.value,done:!1}:{value:[i.key,i.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),i?"entries":"values",!i,!0),l(e)}}},8929:(t,e,i)=>{"use strict";var n=i(11432),r=i(8080).getWeakData,s=i(13980),o=i(68580),a=i(31057),h=i(76808),u=i(7622),l=i(54585),c=i(97030),d=c.set,p=c.getterFor,f=u.find,m=u.findIndex,v=0,g=function(t){return t.frozen||(t.frozen=new y)},y=function(){this.entries=[]},_=function(t,e){return f(t.entries,(function(t){return t[0]===e}))};y.prototype={get:function(t){var e=_(this,t);if(e)return e[1]},has:function(t){return!!_(this,t)},set:function(t,e){var i=_(this,t);i?i[1]=e:this.entries.push([t,e])},delete:function(t){var e=m(this.entries,(function(e){return e[0]===t}));return~e&&this.entries.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,i,u){var c=t((function(t,n){a(t,c,e),d(t,{type:e,id:v++,frozen:void 0}),null!=n&&h(n,t[u],t,i)})),f=p(e),m=function(t,e,i){var n=f(t),o=r(s(e),!0);return!0===o?g(n).set(e,i):o[n.id]=i,t};return n(c.prototype,{delete:function(t){var e=f(this);if(!o(t))return!1;var i=r(t);return!0===i?g(e).delete(t):i&&l(i,e.id)&&delete i[e.id]},has:function(t){var e=f(this);if(!o(t))return!1;var i=r(t);return!0===i?g(e).has(t):i&&l(i,e.id)}}),n(c.prototype,i?{get:function(t){var e=f(this);if(o(t)){var i=r(t);return!0===i?g(e).get(t):i?i[e.id]:void 0}},set:function(t,e){return m(this,t,e)}}:{add:function(t){return m(this,t,!0)}}),c}}},93574:(t,e,i)=>{"use strict";var n=i(23889),r=i(33386),s=i(60995),o=i(18957),a=i(8080),h=i(76808),u=i(31057),l=i(68580),c=i(38493),d=i(92916),p=i(39893),f=i(27541);t.exports=function(t,e,i){var m=-1!==t.indexOf("Map"),v=-1!==t.indexOf("Weak"),g=m?"set":"add",y=r[t],_=y&&y.prototype,x=y,b={},w=function(t){var e=_[t];o(_,t,"add"==t?function(t){return e.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(v&&!l(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!l(t)?void 0:e.call(this,0===t?0:t)}:"has"==t?function(t){return!(v&&!l(t))&&e.call(this,0===t?0:t)}:function(t,i){return e.call(this,0===t?0:t,i),this})};if(s(t,"function"!=typeof y||!(v||_.forEach&&!c((function(){(new y).entries().next()})))))x=i.getConstructor(e,t,m,g),a.REQUIRED=!0;else if(s(t,!0)){var T=new x,M=T[g](v?{}:-0,1)!=T,S=c((function(){T.has(1)})),E=d((function(t){new y(t)})),L=!v&&c((function(){for(var t=new y,e=5;e--;)t[g](e,e);return!t.has(-0)}));E||((x=e((function(e,i){u(e,x,t);var n=f(new y,e,x);return null!=i&&h(i,n[g],n,m),n}))).prototype=_,_.constructor=x),(S||L)&&(w("delete"),w("has"),m&&w("get")),(L||M)&&w(g),v&&_.clear&&delete _.clear}return b[t]=x,n({global:!0,forced:x!=y},b),p(x,t),v||i.setStrong(x,t,m),x}},19388:(t,e,i)=>{var n=i(65017),r=i(35075),s=i(37602),o=i(68580),a=function(){this.object=null,this.symbol=null,this.primitives=null,this.objectsByIndex=s(null)};a.prototype.get=function(t,e){return this[t]||(this[t]=e())},a.prototype.next=function(t,e,i){var s=i?this.objectsByIndex[t]||(this.objectsByIndex[t]=new r):this.primitives||(this.primitives=new n),o=s.get(e);return o||s.set(e,o=new a),o};var h=new a;t.exports=function(){var t,e,i=h,n=arguments.length;for(t=0;t<n;t++)o(e=arguments[t])&&(i=i.next(t,e,!0));if(this===Object&&i===h)throw TypeError("Composite keys must contain a non-primitive component");for(t=0;t<n;t++)o(e=arguments[t])||(i=i.next(t,e,!1));return i}},27367:(t,e,i)=>{var n=i(54585),r=i(54327),s=i(91211),o=i(64774);t.exports=function(t,e){for(var i=r(e),a=o.f,h=s.f,u=0;u<i.length;u++){var l=i[u];n(t,l)||a(t,l,h(e,l))}}},43728:(t,e,i)=>{var n=i(10548)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(i){try{return e[n]=!1,"/./"[t](e)}catch(t){}}return!1}},5331:(t,e,i)=>{var n=i(38493);t.exports=!n((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},66421:(t,e,i)=>{var n=i(86608),r=/"/g;t.exports=function(t,e,i,s){var o=String(n(t)),a="<"+e;return""!==i&&(a+=" "+i+'="'+String(s).replace(r,"&quot;")+'"'),a+">"+o+"</"+e+">"}},2395:(t,e,i)=>{"use strict";var n=i(91706).IteratorPrototype,r=i(37602),s=i(36846),o=i(39893),a=i(15926),h=function(){return this};t.exports=function(t,e,i){var u=e+" Iterator";return t.prototype=r(n,{next:s(1,i)}),o(t,u,!1,!0),a[u]=h,t}},17182:(t,e,i)=>{var n=i(56617),r=i(64774),s=i(36846);t.exports=n?function(t,e,i){return r.f(t,e,s(1,i))}:function(t,e,i){return t[e]=i,t}},36846:t=>{t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},73685:(t,e,i)=>{"use strict";var n=i(33196),r=i(64774),s=i(36846);t.exports=function(t,e,i){var o=n(e);o in t?r.f(t,o,s(0,i)):t[o]=i}},87124:(t,e,i)=>{"use strict";var n=i(38493),r=i(76940).start,s=Math.abs,o=Date.prototype,a=o.getTime,h=o.toISOString;t.exports=n((function(){return"0385-07-25T07:06:39.999Z"!=h.call(new Date(-50000000000001))}))||!n((function(){h.call(new Date(NaN))}))?function(){if(!isFinite(a.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),i=t.getUTCMilliseconds(),n=e<0?"-":e>9999?"+":"";return n+r(s(e),n?6:4,0)+"-"+r(t.getUTCMonth()+1,2,0)+"-"+r(t.getUTCDate(),2,0)+"T"+r(t.getUTCHours(),2,0)+":"+r(t.getUTCMinutes(),2,0)+":"+r(t.getUTCSeconds(),2,0)+"."+r(i,3,0)+"Z"}:h},22853:(t,e,i)=>{"use strict";var n=i(13980),r=i(33196);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return r(n(this),"number"!==t)}},7693:(t,e,i)=>{"use strict";var n=i(23889),r=i(2395),s=i(29528),o=i(15456),a=i(39893),h=i(17182),u=i(18957),l=i(10548),c=i(51104),d=i(15926),p=i(91706),f=p.IteratorPrototype,m=p.BUGGY_SAFARI_ITERATORS,v=l("iterator"),g="keys",y="values",_="entries",x=function(){return this};t.exports=function(t,e,i,l,p,b,w){r(i,e,l);var T,M,S,E=function(t){if(t===p&&C)return C;if(!m&&t in D)return D[t];switch(t){case g:case y:case _:return function(){return new i(this,t)}}return function(){return new i(this)}},L=e+" Iterator",A=!1,D=t.prototype,P=D[v]||D["@@iterator"]||p&&D[p],C=!m&&P||E(p),O="Array"==e&&D.entries||P;if(O&&(T=s(O.call(new t)),f!==Object.prototype&&T.next&&(c||s(T)===f||(o?o(T,f):"function"!=typeof T[v]&&h(T,v,x)),a(T,L,!0,!0),c&&(d[L]=x))),p==y&&P&&P.name!==y&&(A=!0,C=function(){return P.call(this)}),c&&!w||D[v]===C||h(D,v,C),d[e]=C,p)if(M={values:E(y),keys:b?C:E(g),entries:E(_)},w)for(S in M)(m||A||!(S in D))&&u(D,S,M[S]);else n({target:e,proto:!0,forced:m||A},M);return M}},62646:(t,e,i)=>{var n=i(29467),r=i(54585),s=i(71317),o=i(64774).f;t.exports=function(t){var e=n.Symbol||(n.Symbol={});r(e,t)||o(e,t,{value:s.f(t)})}},56617:(t,e,i)=>{var n=i(38493);t.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},507:(t,e,i)=>{var n=i(33386),r=i(68580),s=n.document,o=r(s)&&r(s.createElement);t.exports=function(t){return o?s.createElement(t):{}}},52889:t=>{t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},4010:(t,e,i)=>{var n=i(66499);t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(n)},66499:(t,e,i)=>{var n=i(27623);t.exports=n("navigator","userAgent")||""},80823:(t,e,i)=>{var n,r,s=i(33386),o=i(66499),a=s.process,h=a&&a.versions,u=h&&h.v8;u?r=(n=u.split("."))[0]+n[1]:o&&(!(n=o.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=o.match(/Chrome\/(\d+)/))&&(r=n[1]),t.exports=r&&+r},53838:t=>{t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},23889:(t,e,i)=>{var n=i(33386),r=i(91211).f,s=i(17182),o=i(18957),a=i(29764),h=i(27367),u=i(60995);t.exports=function(t,e){var i,l,c,d,p,f=t.target,m=t.global,v=t.stat;if(i=m?n:v?n[f]||a(f,{}):(n[f]||{}).prototype)for(l in e){if(d=e[l],c=t.noTargetGet?(p=r(i,l))&&p.value:i[l],!u(m?l:f+(v?".":"#")+l,t.forced)&&void 0!==c){if(typeof d==typeof c)continue;h(d,c)}(t.sham||c&&c.sham)&&s(d,"sham",!0),o(i,l,d,t)}}},38493:t=>{t.exports=function(t){try{return!!t()}catch(t){return!0}}},57937:(t,e,i)=>{"use strict";i(99058);var n=i(18957),r=i(38493),s=i(10548),o=i(83815),a=i(17182),h=s("species"),u=!r((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),l="$0"==="a".replace(/./,"$0"),c=s("replace"),d=!!/./[c]&&""===/./[c]("a","$0"),p=!r((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var i="ab".split(t);return 2!==i.length||"a"!==i[0]||"b"!==i[1]}));t.exports=function(t,e,i,c){var f=s(t),m=!r((function(){var e={};return e[f]=function(){return 7},7!=""[t](e)})),v=m&&!r((function(){var e=!1,i=/a/;return"split"===t&&((i={}).constructor={},i.constructor[h]=function(){return i},i.flags="",i[f]=/./[f]),i.exec=function(){return e=!0,null},i[f](""),!e}));if(!m||!v||"replace"===t&&(!u||!l||d)||"split"===t&&!p){var g=/./[f],y=i(f,""[t],(function(t,e,i,n,r){return e.exec===o?m&&!r?{done:!0,value:g.call(e,i,n)}:{done:!0,value:t.call(i,e,n)}:{done:!1}}),{REPLACE_KEEPS_$0:l,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:d}),_=y[0],x=y[1];n(String.prototype,t,_),n(RegExp.prototype,f,2==e?function(t,e){return x.call(t,this,e)}:function(t){return x.call(t,this)})}c&&a(RegExp.prototype[f],"sham",!0)}},70623:(t,e,i)=>{"use strict";var n=i(20351),r=i(7933),s=i(39181),o=function(t,e,i,a,h,u,l,c){for(var d,p=h,f=0,m=!!l&&s(l,c,3);f<a;){if(f in i){if(d=m?m(i[f],f,e):i[f],u>0&&n(d))p=o(t,e,d,r(d.length),p,u-1)-1;else{if(p>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[p]=d}p++}f++}return p};t.exports=o},37235:(t,e,i)=>{var n=i(38493);t.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},39181:(t,e,i)=>{var n=i(23775);t.exports=function(t,e,i){if(n(t),void 0===e)return t;switch(i){case 0:return function(){return t.call(e)};case 1:return function(i){return t.call(e,i)};case 2:return function(i,n){return t.call(e,i,n)};case 3:return function(i,n,r){return t.call(e,i,n,r)}}return function(){return t.apply(e,arguments)}}},31078:(t,e,i)=>{"use strict";var n=i(23775),r=i(68580),s=[].slice,o={},a=function(t,e,i){if(!(e in o)){for(var n=[],r=0;r<e;r++)n[r]="a["+r+"]";o[e]=Function("C,a","return new C("+n.join(",")+")")}return o[e](t,i)};t.exports=Function.bind||function(t){var e=n(this),i=s.call(arguments,1),o=function(){var n=i.concat(s.call(arguments));return this instanceof o?a(e,n.length,n):e.apply(t,n)};return r(e.prototype)&&(o.prototype=e.prototype),o}},6178:(t,e,i)=>{var n=i(99683),r=i(10548)("asyncIterator");t.exports=function(t){var e=t[r];return void 0===e?n(t):e}},27623:(t,e,i)=>{var n=i(29467),r=i(33386),s=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?s(n[t])||s(r[t]):n[t]&&n[t][e]||r[t]&&r[t][e]}},99683:(t,e,i)=>{var n=i(16385),r=i(15926),s=i(10548)("iterator");t.exports=function(t){if(null!=t)return t[s]||t["@@iterator"]||r[n(t)]}},62389:(t,e,i)=>{var n=i(13980),r=i(99683);t.exports=function(t){var e=r(t);if("function"!=typeof e)throw TypeError(String(t)+" is not iterable");return n(e.call(t))}},81709:(t,e,i)=>{var n=i(51104),r=i(62389);t.exports=n?r:function(t){return Map.prototype.entries.call(t)}},82091:(t,e,i)=>{var n=i(51104),r=i(62389);t.exports=n?r:function(t){return Set.prototype.values.call(t)}},33386:t=>{var e=function(t){return t&&t.Math==Math&&t};t.exports=e("object"==typeof globalThis&&globalThis)||e("object"==typeof window&&window)||e("object"==typeof self&&self)||e("object"==typeof global&&global)||Function("return this")()},54585:t=>{var e={}.hasOwnProperty;t.exports=function(t,i){return e.call(t,i)}},26007:t=>{t.exports={}},98684:(t,e,i)=>{var n=i(33386);t.exports=function(t,e){var i=n.console;i&&i.error&&(1===arguments.length?i.error(t):i.error(t,e))}},21974:(t,e,i)=>{var n=i(27623);t.exports=n("document","documentElement")},80416:(t,e,i)=>{var n=i(56617),r=i(38493),s=i(507);t.exports=!n&&!r((function(){return 7!=Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},31787:t=>{var e=1/0,i=Math.abs,n=Math.pow,r=Math.floor,s=Math.log,o=Math.LN2;t.exports={pack:function(t,a,h){var u,l,c,d=new Array(h),p=8*h-a-1,f=(1<<p)-1,m=f>>1,v=23===a?n(2,-24)-n(2,-77):0,g=t<0||0===t&&1/t<0?1:0,y=0;for((t=i(t))!=t||t===e?(l=t!=t?1:0,u=f):(u=r(s(t)/o),t*(c=n(2,-u))<1&&(u--,c*=2),(t+=u+m>=1?v/c:v*n(2,1-m))*c>=2&&(u++,c/=2),u+m>=f?(l=0,u=f):u+m>=1?(l=(t*c-1)*n(2,a),u+=m):(l=t*n(2,m-1)*n(2,a),u=0));a>=8;d[y++]=255&l,l/=256,a-=8);for(u=u<<a|l,p+=a;p>0;d[y++]=255&u,u/=256,p-=8);return d[--y]|=128*g,d},unpack:function(t,i){var r,s=t.length,o=8*s-i-1,a=(1<<o)-1,h=a>>1,u=o-7,l=s-1,c=t[l--],d=127&c;for(c>>=7;u>0;d=256*d+t[l],l--,u-=8);for(r=d&(1<<-u)-1,d>>=-u,u+=i;u>0;r=256*r+t[l],l--,u-=8);if(0===d)d=1-h;else{if(d===a)return r?NaN:c?-1/0:e;r+=n(2,i),d-=h}return(c?-1:1)*r*n(2,d-i)}}},11749:(t,e,i)=>{var n=i(38493),r=i(2178),s="".split;t.exports=n((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==r(t)?s.call(t,""):Object(t)}:Object},27541:(t,e,i)=>{var n=i(68580),r=i(15456);t.exports=function(t,e,i){var s,o;return r&&"function"==typeof(s=e.constructor)&&s!==i&&n(o=s.prototype)&&o!==i.prototype&&r(t,o),t}},82133:(t,e,i)=>{var n=i(50671),r=Function.toString;"function"!=typeof n.inspectSource&&(n.inspectSource=function(t){return r.call(t)}),t.exports=n.inspectSource},8080:(t,e,i)=>{var n=i(26007),r=i(68580),s=i(54585),o=i(64774).f,a=i(37645),h=i(37235),u=a("meta"),l=0,c=Object.isExtensible||function(){return!0},d=function(t){o(t,u,{value:{objectID:"O"+ ++l,weakData:{}}})},p=t.exports={REQUIRED:!1,fastKey:function(t,e){if(!r(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,u)){if(!c(t))return"F";if(!e)return"E";d(t)}return t[u].objectID},getWeakData:function(t,e){if(!s(t,u)){if(!c(t))return!0;if(!e)return!1;d(t)}return t[u].weakData},onFreeze:function(t){return h&&p.REQUIRED&&c(t)&&!s(t,u)&&d(t),t}};n[u]=!0},97030:(t,e,i)=>{var n,r,s,o=i(85721),a=i(33386),h=i(68580),u=i(17182),l=i(54585),c=i(31059),d=i(26007),p=a.WeakMap;if(o){var f=new p,m=f.get,v=f.has,g=f.set;n=function(t,e){return g.call(f,t,e),e},r=function(t){return m.call(f,t)||{}},s=function(t){return v.call(f,t)}}else{var y=c("state");d[y]=!0,n=function(t,e){return u(t,y,e),e},r=function(t){return l(t,y)?t[y]:{}},s=function(t){return l(t,y)}}t.exports={set:n,get:r,has:s,enforce:function(t){return s(t)?r(t):n(t,{})},getterFor:function(t){return function(e){var i;if(!h(e)||(i=r(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return i}}}},31243:(t,e,i)=>{var n=i(10548),r=i(15926),s=n("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[s]===t)}},20351:(t,e,i)=>{var n=i(2178);t.exports=Array.isArray||function(t){return"Array"==n(t)}},60995:(t,e,i)=>{var n=i(38493),r=/#|\.prototype\./,s=function(t,e){var i=a[o(t)];return i==u||i!=h&&("function"==typeof e?n(e):!!e)},o=s.normalize=function(t){return String(t).replace(r,".").toLowerCase()},a=s.data={},h=s.NATIVE="N",u=s.POLYFILL="P";t.exports=s},33054:(t,e,i)=>{var n=i(68580),r=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&r(t)===t}},68580:t=>{t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},51104:t=>{t.exports=!1},39376:(t,e,i)=>{var n=i(68580),r=i(2178),s=i(10548)("match");t.exports=function(t){var e;return n(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==r(t))}},76808:(t,e,i)=>{var n=i(13980),r=i(31243),s=i(7933),o=i(39181),a=i(99683),h=i(31404),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,i,l,c){var d,p,f,m,v,g,y,_=o(e,i,l?2:1);if(c)d=t;else{if("function"!=typeof(p=a(t)))throw TypeError("Target is not iterable");if(r(p)){for(f=0,m=s(t.length);m>f;f++)if((v=l?_(n(y=t[f])[0],y[1]):_(t[f]))&&v instanceof u)return v;return new u(!1)}d=p.call(t)}for(g=d.next;!(y=g.call(d)).done;)if("object"==typeof(v=h(d,_,y.value,l))&&v&&v instanceof u)return v;return new u(!1)}).stop=function(t){return new u(!0,t)}},79596:(t,e,i)=>{"use strict";var n=i(29467),r=i(23775),s=i(13980),o=i(37602),a=i(17182),h=i(11432),u=i(10548),l=i(97030),c=l.set,d=l.get,p=u("toStringTag"),f=function(t){var e=d(this).iterator,i=e.return;return void 0===i?{done:!0,value:t}:s(i.call(e,t))},m=function(t){var e=d(this).iterator,i=e.throw;if(void 0===i)throw t;return i.call(e,t)};t.exports=function(t,e){var i=function(t){t.next=r(t.iterator.next),t.done=!1,c(this,t)};return i.prototype=h(o(n.Iterator.prototype),{next:function(){var e=d(this),i=e.done?void 0:t.apply(e,arguments);return{done:e.done,value:i}},return:f,throw:m}),e||a(i.prototype,p,"Generator"),i}},91706:(t,e,i)=>{"use strict";var n,r,s,o=i(29528),a=i(17182),h=i(54585),u=i(10548),l=i(51104),c=u("iterator"),d=!1;[].keys&&("next"in(s=[].keys())?(r=o(o(s)))!==Object.prototype&&(n=r):d=!0),null==n&&(n={}),l||h(n,c)||a(n,c,(function(){return this})),t.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:d}},15926:t=>{t.exports={}},35913:(t,e,i)=>{"use strict";var n=i(13980);t.exports=function(t,e){var i,r=n(this),s=arguments.length>2?arguments[2]:void 0;if("function"!=typeof e&&"function"!=typeof s)throw TypeError("At least one callback required");return r.has(t)?(i=r.get(t),"function"==typeof e&&(i=e(i),r.set(t,i))):"function"==typeof s&&(i=s(),r.set(t,i)),i}},12224:t=>{var e=Math.expm1,i=Math.exp;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:i(t)-1}:e},89492:(t,e,i)=>{var n=i(98514),r=Math.abs,s=Math.pow,o=s(2,-52),a=s(2,-23),h=s(2,127)*(2-a),u=s(2,-126);t.exports=Math.fround||function(t){var e,i,s=r(t),l=n(t);return s<u?l*(s/u/a+1/o-1/o)*u*a:(i=(e=(1+a/o)*s)-(e-s))>h||i!=i?l*(1/0):l*i}},22224:t=>{var e=Math.log;t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:e(1+t)}},94602:t=>{t.exports=Math.scale||function(t,e,i,n,r){return 0===arguments.length||t!=t||e!=e||i!=i||n!=n||r!=r?NaN:t===1/0||t===-1/0?t:(t-e)*(r-n)/(i-e)+n}},98514:t=>{t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},65516:(t,e,i)=>{var n,r,s,o,a,h,u,l,c=i(33386),d=i(91211).f,p=i(2178),f=i(39331).set,m=i(4010),v=c.MutationObserver||c.WebKitMutationObserver,g=c.process,y=c.Promise,_="process"==p(g),x=d(c,"queueMicrotask"),b=x&&x.value;b||(n=function(){var t,e;for(_&&(t=g.domain)&&t.exit();r;){e=r.fn,r=r.next;try{e()}catch(t){throw r?o():s=void 0,t}}s=void 0,t&&t.enter()},_?o=function(){g.nextTick(n)}:v&&!m?(a=!0,h=document.createTextNode(""),new v(n).observe(h,{characterData:!0}),o=function(){h.data=a=!a}):y&&y.resolve?(u=y.resolve(void 0),l=u.then,o=function(){l.call(u,n)}):o=function(){f.call(c,n)}),t.exports=b||function(t){var e={fn:t,next:void 0};s&&(s.next=e),r||(r=e,o()),s=e}},25306:(t,e,i)=>{var n=i(33386);t.exports=n.Promise},77802:(t,e,i)=>{var n=i(38493);t.exports=!!Object.getOwnPropertySymbols&&!n((function(){return!String(Symbol())}))},80781:(t,e,i)=>{var n=i(38493),r=i(10548),s=i(51104),o=r("iterator");t.exports=!n((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),e=t.searchParams,i="";return t.pathname="c%20d",e.forEach((function(t,n){e.delete("b"),i+=n+t})),s&&!t.toJSON||!e.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[o]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://\u0442\u0435\u0441\u0442").host||"#%D0%B1"!==new URL("http://a#\u0431").hash||"a1c3"!==i||"x"!==new URL("http://x",void 0).host}))},85721:(t,e,i)=>{var n=i(33386),r=i(82133),s=n.WeakMap;t.exports="function"==typeof s&&/native code/.test(r(s))},8168:(t,e,i)=>{"use strict";var n=i(23775),r=function(t){var e,i;this.promise=new t((function(t,n){if(void 0!==e||void 0!==i)throw TypeError("Bad Promise constructor");e=t,i=n})),this.resolve=n(e),this.reject=n(i)};t.exports.f=function(t){return new r(t)}},89109:(t,e,i)=>{var n=i(39376);t.exports=function(t){if(n(t))throw TypeError("The method doesn't accept regular expressions");return t}},48682:(t,e,i)=>{var n=i(33386).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&n(t)}},2463:(t,e,i)=>{var n=i(33386),r=i(66672).trim,s=i(71388),o=n.parseFloat,a=1/o(s+"-0")!=-1/0;t.exports=a?function(t){var e=r(String(t)),i=o(e);return 0===i&&"-"==e.charAt(0)?-0:i}:o},62229:(t,e,i)=>{var n=i(33386),r=i(66672).trim,s=i(71388),o=n.parseInt,a=/^[+-]?0[Xx]/,h=8!==o(s+"08")||22!==o(s+"0x16");t.exports=h?function(t,e){var i=r(String(t));return o(i,e>>>0||(a.test(i)?16:10))}:o},98466:(t,e,i)=>{"use strict";var n=i(56617),r=i(38493),s=i(64855),o=i(50169),a=i(58399),h=i(51223),u=i(11749),l=Object.assign,c=Object.defineProperty;t.exports=!l||r((function(){if(n&&1!==l({b:1},l(c({},"a",{enumerable:!0,get:function(){c(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},i=Symbol(),r="abcdefghijklmnopqrst";return t[i]=7,r.split("").forEach((function(t){e[t]=t})),7!=l({},t)[i]||s(l({},e)).join("")!=r}))?function(t,e){for(var i=h(t),r=arguments.length,l=1,c=o.f,d=a.f;r>l;)for(var p,f=u(arguments[l++]),m=c?s(f).concat(c(f)):s(f),v=m.length,g=0;v>g;)p=m[g++],n&&!d.call(f,p)||(i[p]=f[p]);return i}:l},37602:(t,e,i)=>{var n,r=i(13980),s=i(23702),o=i(53838),a=i(26007),h=i(21974),u=i(507),l=i(31059),c=l("IE_PROTO"),d=function(){},p=function(t){return"<script>"+t+"</"+"script>"},f=function(){try{n=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,e;f=n?function(t){t.write(p("")),t.close();var e=t.parentWindow.Object;return t=null,e}(n):((e=u("iframe")).style.display="none",h.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(p("document.F=Object")),t.close(),t.F);for(var i=o.length;i--;)delete f.prototype[o[i]];return f()};a[c]=!0,t.exports=Object.create||function(t,e){var i;return null!==t?(d.prototype=r(t),i=new d,d.prototype=null,i[c]=t):i=f(),void 0===e?i:s(i,e)}},23702:(t,e,i)=>{var n=i(56617),r=i(64774),s=i(13980),o=i(64855);t.exports=n?Object.defineProperties:function(t,e){s(t);for(var i,n=o(e),a=n.length,h=0;a>h;)r.f(t,i=n[h++],e[i]);return t}},64774:(t,e,i)=>{var n=i(56617),r=i(80416),s=i(13980),o=i(33196),a=Object.defineProperty;e.f=n?a:function(t,e,i){if(s(t),e=o(e,!0),s(i),r)try{return a(t,e,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(t[e]=i.value),t}},91211:(t,e,i)=>{var n=i(56617),r=i(58399),s=i(36846),o=i(86939),a=i(33196),h=i(54585),u=i(80416),l=Object.getOwnPropertyDescriptor;e.f=n?l:function(t,e){if(t=o(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(h(t,e))return s(!r.f.call(t,e),t[e])}},74720:(t,e,i)=>{var n=i(86939),r=i(74562).f,s={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return o&&"[object Window]"==s.call(t)?function(t){try{return r(t)}catch(t){return o.slice()}}(t):r(n(t))}},74562:(t,e,i)=>{var n=i(49372),r=i(53838).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return n(t,r)}},50169:(t,e)=>{e.f=Object.getOwnPropertySymbols},29528:(t,e,i)=>{var n=i(54585),r=i(51223),s=i(31059),o=i(5331),a=s("IE_PROTO"),h=Object.prototype;t.exports=o?Object.getPrototypeOf:function(t){return t=r(t),n(t,a)?t[a]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?h:null}},30863:(t,e,i)=>{"use strict";var n=i(97030),r=i(2395),s=i(54585),o=i(64855),a=i(51223),h="Object Iterator",u=n.set,l=n.getterFor(h);t.exports=r((function(t,e){var i=a(t);u(this,{type:h,mode:e,object:i,keys:o(i),index:0})}),"Object",(function(){for(var t=l(this),e=t.keys;;){if(null===e||t.index>=e.length)return t.object=t.keys=null,{value:void 0,done:!0};var i=e[t.index++],n=t.object;if(s(n,i)){switch(t.mode){case"keys":return{value:i,done:!1};case"values":return{value:n[i],done:!1}}return{value:[i,n[i]],done:!1}}}}))},49372:(t,e,i)=>{var n=i(54585),r=i(86939),s=i(93289).indexOf,o=i(26007);t.exports=function(t,e){var i,a=r(t),h=0,u=[];for(i in a)!n(o,i)&&n(a,i)&&u.push(i);for(;e.length>h;)n(a,i=e[h++])&&(~s(u,i)||u.push(i));return u}},64855:(t,e,i)=>{var n=i(49372),r=i(53838);t.exports=Object.keys||function(t){return n(t,r)}},58399:(t,e)=>{"use strict";var i={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,r=n&&!i.call({1:2},1);e.f=r?function(t){var e=n(this,t);return!!e&&e.enumerable}:i},36061:(t,e,i)=>{"use strict";var n=i(51104),r=i(33386),s=i(38493);t.exports=n||!s((function(){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete r[t]}))},15456:(t,e,i)=>{var n=i(13980),r=i(66020);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,i={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(i,[]),e=i instanceof Array}catch(t){}return function(i,s){return n(i),r(s),e?t.call(i,s):i.__proto__=s,i}}():void 0)},38509:(t,e,i)=>{var n=i(56617),r=i(64855),s=i(86939),o=i(58399).f,a=function(t){return function(e){for(var i,a=s(e),h=r(a),u=h.length,l=0,c=[];u>l;)i=h[l++],n&&!o.call(a,i)||c.push(t?[i,a[i]]:a[i]);return c}};t.exports={entries:a(!0),values:a(!1)}},27148:(t,e,i)=>{"use strict";var n=i(29100),r=i(16385);t.exports=n?{}.toString:function(){return"[object "+r(this)+"]"}},54327:(t,e,i)=>{var n=i(27623),r=i(74562),s=i(50169),o=i(13980);t.exports=n("Reflect","ownKeys")||function(t){var e=r.f(o(t)),i=s.f;return i?e.concat(i(t)):e}},29467:(t,e,i)=>{var n=i(33386);t.exports=n},70595:t=>{t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},39230:(t,e,i)=>{var n=i(13980),r=i(68580),s=i(8168);t.exports=function(t,e){if(n(t),r(e)&&e.constructor===t)return e;var i=s.f(t);return(0,i.resolve)(e),i.promise}},11432:(t,e,i)=>{var n=i(18957);t.exports=function(t,e,i){for(var r in e)n(t,r,e[r],i);return t}},18957:(t,e,i)=>{var n=i(33386),r=i(17182),s=i(54585),o=i(29764),a=i(82133),h=i(97030),u=h.get,l=h.enforce,c=String(String).split("String");(t.exports=function(t,e,i,a){var h=!!a&&!!a.unsafe,u=!!a&&!!a.enumerable,d=!!a&&!!a.noTargetGet;"function"==typeof i&&("string"!=typeof e||s(i,"name")||r(i,"name",e),l(i).source=c.join("string"==typeof e?e:"")),t!==n?(h?!d&&t[e]&&(u=!0):delete t[e],u?t[e]=i:r(t,e,i)):u?t[e]=i:o(e,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&u(this).source||a(this)}))},38758:(t,e,i)=>{var n=i(65017),r=i(35075),s=i(31416)("metadata"),o=s.store||(s.store=new r),a=function(t,e,i){var r=o.get(t);if(!r){if(!i)return;o.set(t,r=new n)}var s=r.get(e);if(!s){if(!i)return;r.set(e,s=new n)}return s};t.exports={store:o,getMap:a,has:function(t,e,i){var n=a(e,i,!1);return void 0!==n&&n.has(t)},get:function(t,e,i){var n=a(e,i,!1);return void 0===n?void 0:n.get(t)},set:function(t,e,i,n){a(i,n,!0).set(t,e)},keys:function(t,e){var i=a(t,e,!1),n=[];return i&&i.forEach((function(t,e){n.push(e)})),n},toKey:function(t){return void 0===t||"symbol"==typeof t?t:String(t)}}},30584:(t,e,i)=>{var n=i(2178),r=i(83815);t.exports=function(t,e){var i=t.exec;if("function"==typeof i){var s=i.call(t,e);if("object"!=typeof s)throw TypeError("RegExp exec method returned something other than an Object or null");return s}if("RegExp"!==n(t))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(t,e)}},83815:(t,e,i)=>{"use strict";var n,r,s=i(21068),o=i(97262),a=RegExp.prototype.exec,h=String.prototype.replace,u=a,l=(n=/a/,r=/b*/g,a.call(n,"a"),a.call(r,"a"),0!==n.lastIndex||0!==r.lastIndex),c=o.UNSUPPORTED_Y||o.BROKEN_CARET,d=void 0!==/()??/.exec("")[1];(l||d||c)&&(u=function(t){var e,i,n,r,o=this,u=c&&o.sticky,p=s.call(o),f=o.source,m=0,v=t;return u&&(-1===(p=p.replace("y","")).indexOf("g")&&(p+="g"),v=String(t).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==t[o.lastIndex-1])&&(f="(?: "+f+")",v=" "+v,m++),i=new RegExp("^(?:"+f+")",p)),d&&(i=new RegExp("^"+f+"$(?!\\s)",p)),l&&(e=o.lastIndex),n=a.call(u?i:o,v),u?n?(n.input=n.input.slice(m),n[0]=n[0].slice(m),n.index=o.lastIndex,o.lastIndex+=n[0].length):o.lastIndex=0:l&&n&&(o.lastIndex=o.global?n.index+n[0].length:e),d&&n&&n.length>1&&h.call(n[0],i,(function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(n[r]=void 0)})),n}),t.exports=u},21068:(t,e,i)=>{"use strict";var n=i(13980);t.exports=function(){var t=n(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},97262:(t,e,i)=>{"use strict";var n=i(38493);function r(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=n((function(){var t=r("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=n((function(){var t=r("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},86608:t=>{t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},68790:t=>{t.exports=function(t,e){return t===e||t!=t&&e!=e}},12195:t=>{t.exports=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}},29764:(t,e,i)=>{var n=i(33386),r=i(17182);t.exports=function(t,e){try{r(n,t,e)}catch(i){n[t]=e}return e}},16906:(t,e,i)=>{"use strict";var n=i(27623),r=i(64774),s=i(10548),o=i(56617),a=s("species");t.exports=function(t){var e=n(t),i=r.f;o&&e&&!e[a]&&i(e,a,{configurable:!0,get:function(){return this}})}},39893:(t,e,i)=>{var n=i(64774).f,r=i(54585),s=i(10548)("toStringTag");t.exports=function(t,e,i){t&&!r(t=i?t:t.prototype,s)&&n(t,s,{configurable:!0,value:e})}},31059:(t,e,i)=>{var n=i(31416),r=i(37645),s=n("keys");t.exports=function(t){return s[t]||(s[t]=r(t))}},50671:(t,e,i)=>{var n=i(33386),r=i(29764),s="__core-js_shared__",o=n[s]||r(s,{});t.exports=o},31416:(t,e,i)=>{var n=i(51104),r=i(50671);(t.exports=function(t,e){return r[t]||(r[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:n?"pure":"global",copyright:"\xa9 2020 Denis Pushkarev (zloirock.ru)"})},7350:(t,e,i)=>{var n=i(13980),r=i(23775),s=i(10548)("species");t.exports=function(t,e){var i,o=n(t).constructor;return void 0===o||null==(i=n(o)[s])?e:r(i)}},50979:(t,e,i)=>{var n=i(38493);t.exports=function(t){return n((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},17933:(t,e,i)=>{var n=i(1557),r=i(86608),s=function(t){return function(e,i){var s,o,a=String(r(e)),h=n(i),u=a.length;return h<0||h>=u?t?"":void 0:(s=a.charCodeAt(h))<55296||s>56319||h+1===u||(o=a.charCodeAt(h+1))<56320||o>57343?t?a.charAt(h):s:t?a.slice(h,h+2):o-56320+(s-55296<<10)+65536}};t.exports={codeAt:s(!1),charAt:s(!0)}},60285:(t,e,i)=>{var n=i(66499);t.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(n)},76940:(t,e,i)=>{var n=i(7933),r=i(71804),s=i(86608),o=Math.ceil,a=function(t){return function(e,i,a){var h,u,l=String(s(e)),c=l.length,d=void 0===a?" ":String(a),p=n(i);return p<=c||""==d?l:(h=p-c,(u=r.call(d,o(h/d.length))).length>h&&(u=u.slice(0,h)),t?l+u:u+l)}};t.exports={start:a(!1),end:a(!0)}},32937:t=>{"use strict";var e=2147483647,i=/[^\0-\u007E]/,n=/[.\u3002\uFF0E\uFF61]/g,r="Overflow: input needs wider integers to process",s=Math.floor,o=String.fromCharCode,a=function(t){return t+22+75*(t<26)},h=function(t,e,i){var n=0;for(t=i?s(t/700):t>>1,t+=s(t/e);t>455;n+=36)t=s(t/35);return s(n+36*t/(t+38))},u=function(t){var i,n,u=[],l=(t=function(t){for(var e=[],i=0,n=t.length;i<n;){var r=t.charCodeAt(i++);if(r>=55296&&r<=56319&&i<n){var s=t.charCodeAt(i++);56320==(64512&s)?e.push(((1023&r)<<10)+(1023&s)+65536):(e.push(r),i--)}else e.push(r)}return e}(t)).length,c=128,d=0,p=72;for(i=0;i<t.length;i++)(n=t[i])<128&&u.push(o(n));var f=u.length,m=f;for(f&&u.push("-");m<l;){var v=e;for(i=0;i<t.length;i++)(n=t[i])>=c&&n<v&&(v=n);var g=m+1;if(v-c>s((e-d)/g))throw RangeError(r);for(d+=(v-c)*g,c=v,i=0;i<t.length;i++){if((n=t[i])<c&&++d>e)throw RangeError(r);if(n==c){for(var y=d,_=36;;_+=36){var x=_<=p?1:_>=p+26?26:_-p;if(y<x)break;var b=y-x,w=36-x;u.push(o(a(x+b%w))),y=s(b/w)}u.push(o(a(y))),p=h(d,g,m==f),d=0,++m}}++d,++c}return u.join("")};t.exports=function(t){var e,r,s=[],o=t.toLowerCase().replace(n,".").split(".");for(e=0;e<o.length;e++)r=o[e],s.push(i.test(r)?"xn--"+u(r):r);return s.join(".")}},71804:(t,e,i)=>{"use strict";var n=i(1557),r=i(86608);t.exports="".repeat||function(t){var e=String(r(this)),i="",s=n(t);if(s<0||s==1/0)throw RangeError("Wrong number of repetitions");for(;s>0;(s>>>=1)&&(e+=e))1&s&&(i+=e);return i}},4212:(t,e,i)=>{var n=i(38493),r=i(71388);t.exports=function(t){return n((function(){return!!r[t]()||"\u200b\x85\u180e"!="\u200b\x85\u180e"[t]()||r[t].name!==t}))}},66672:(t,e,i)=>{var n=i(86608),r="["+i(71388)+"]",s=RegExp("^"+r+r+"*"),o=RegExp(r+r+"*$"),a=function(t){return function(e){var i=String(n(e));return 1&t&&(i=i.replace(s,"")),2&t&&(i=i.replace(o,"")),i}};t.exports={start:a(1),end:a(2),trim:a(3)}},39331:(t,e,i)=>{var n,r,s,o=i(33386),a=i(38493),h=i(2178),u=i(39181),l=i(21974),c=i(507),d=i(4010),p=o.location,f=o.setImmediate,m=o.clearImmediate,v=o.process,g=o.MessageChannel,y=o.Dispatch,_=0,x={},b="onreadystatechange",w=function(t){if(x.hasOwnProperty(t)){var e=x[t];delete x[t],e()}},T=function(t){return function(){w(t)}},M=function(t){w(t.data)},S=function(t){o.postMessage(t+"",p.protocol+"//"+p.host)};f&&m||(f=function(t){for(var e=[],i=1;arguments.length>i;)e.push(arguments[i++]);return x[++_]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},n(_),_},m=function(t){delete x[t]},"process"==h(v)?n=function(t){v.nextTick(T(t))}:y&&y.now?n=function(t){y.now(T(t))}:g&&!d?(s=(r=new g).port2,r.port1.onmessage=M,n=u(s.postMessage,s,1)):!o.addEventListener||"function"!=typeof postMessage||o.importScripts||a(S)||"file:"===p.protocol?n=b in c("script")?function(t){l.appendChild(c("script")).onreadystatechange=function(){l.removeChild(this),w(t)}}:function(t){setTimeout(T(t),0)}:(n=S,o.addEventListener("message",M,!1))),t.exports={set:f,clear:m}},85550:(t,e,i)=>{var n=i(2178);t.exports=function(t){if("number"!=typeof t&&"Number"!=n(t))throw TypeError("Incorrect invocation");return+t}},11486:(t,e,i)=>{var n=i(1557),r=Math.max,s=Math.min;t.exports=function(t,e){var i=n(t);return i<0?r(i+e,0):s(i,e)}},30035:(t,e,i)=>{var n=i(1557),r=i(7933);t.exports=function(t){if(void 0===t)return 0;var e=n(t),i=r(e);if(e!==i)throw RangeError("Wrong length or index");return i}},86939:(t,e,i)=>{var n=i(11749),r=i(86608);t.exports=function(t){return n(r(t))}},1557:t=>{var e=Math.ceil,i=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?i:e)(t)}},7933:(t,e,i)=>{var n=i(1557),r=Math.min;t.exports=function(t){return t>0?r(n(t),9007199254740991):0}},51223:(t,e,i)=>{var n=i(86608);t.exports=function(t){return Object(n(t))}},25803:(t,e,i)=>{var n=i(17138);t.exports=function(t,e){var i=n(t);if(i%e)throw RangeError("Wrong offset");return i}},17138:(t,e,i)=>{var n=i(1557);t.exports=function(t){var e=n(t);if(e<0)throw RangeError("The argument can't be less than 0");return e}},33196:(t,e,i)=>{var n=i(68580);t.exports=function(t,e){if(!n(t))return t;var i,r;if(e&&"function"==typeof(i=t.toString)&&!n(r=i.call(t)))return r;if("function"==typeof(i=t.valueOf)&&!n(r=i.call(t)))return r;if(!e&&"function"==typeof(i=t.toString)&&!n(r=i.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},29100:(t,e,i)=>{var n={};n[i(10548)("toStringTag")]="z",t.exports="[object z]"===String(n)},19497:(t,e,i)=>{"use strict";var n=i(23889),r=i(33386),s=i(56617),o=i(95329),a=i(81609),h=i(50539),u=i(31057),l=i(36846),c=i(17182),d=i(7933),p=i(30035),f=i(25803),m=i(33196),v=i(54585),g=i(16385),y=i(68580),_=i(37602),x=i(15456),b=i(74562).f,w=i(55066),T=i(7622).forEach,M=i(16906),S=i(64774),E=i(91211),L=i(97030),A=i(27541),D=L.get,P=L.set,C=S.f,O=E.f,k=Math.round,R=r.RangeError,I=h.ArrayBuffer,Y=h.DataView,F=a.NATIVE_ARRAY_BUFFER_VIEWS,N=a.TYPED_ARRAY_TAG,B=a.TypedArray,U=a.TypedArrayPrototype,j=a.aTypedArrayConstructor,H=a.isTypedArray,z="BYTES_PER_ELEMENT",W="Wrong length",G=function(t,e){for(var i=0,n=e.length,r=new(j(t))(n);n>i;)r[i]=e[i++];return r},V=function(t,e){C(t,e,{get:function(){return D(this)[e]}})},X=function(t){var e;return t instanceof I||"ArrayBuffer"==(e=g(t))||"SharedArrayBuffer"==e},q=function(t,e){return H(t)&&"symbol"!=typeof e&&e in t&&String(+e)==String(e)},J=function(t,e){return q(t,e=m(e,!0))?l(2,t[e]):O(t,e)},Z=function(t,e,i){return!(q(t,e=m(e,!0))&&y(i)&&v(i,"value"))||v(i,"get")||v(i,"set")||i.configurable||v(i,"writable")&&!i.writable||v(i,"enumerable")&&!i.enumerable?C(t,e,i):(t[e]=i.value,t)};s?(F||(E.f=J,S.f=Z,V(U,"buffer"),V(U,"byteOffset"),V(U,"byteLength"),V(U,"length")),n({target:"Object",stat:!0,forced:!F},{getOwnPropertyDescriptor:J,defineProperty:Z}),t.exports=function(t,e,i){var s=t.match(/\d+$/)[0]/8,a=t+(i?"Clamped":"")+"Array",h="get"+t,l="set"+t,m=r[a],v=m,g=v&&v.prototype,S={},E=function(t,e){C(t,e,{get:function(){return function(t,e){var i=D(t);return i.view[h](e*s+i.byteOffset,!0)}(this,e)},set:function(t){return function(t,e,n){var r=D(t);i&&(n=(n=k(n))<0?0:n>255?255:255&n),r.view[l](e*s+r.byteOffset,n,!0)}(this,e,t)},enumerable:!0})};F?o&&(v=e((function(t,e,i,n){return u(t,v,a),A(y(e)?X(e)?void 0!==n?new m(e,f(i,s),n):void 0!==i?new m(e,f(i,s)):new m(e):H(e)?G(v,e):w.call(v,e):new m(p(e)),t,v)})),x&&x(v,B),T(b(m),(function(t){t in v||c(v,t,m[t])})),v.prototype=g):(v=e((function(t,e,i,n){u(t,v,a);var r,o,h,l=0,c=0;if(y(e)){if(!X(e))return H(e)?G(v,e):w.call(v,e);r=e,c=f(i,s);var m=e.byteLength;if(void 0===n){if(m%s)throw R(W);if((o=m-c)<0)throw R(W)}else if((o=d(n)*s)+c>m)throw R(W);h=o/s}else h=p(e),r=new I(o=h*s);for(P(t,{buffer:r,byteOffset:c,byteLength:o,length:h,view:new Y(r)});l<h;)E(t,l++)})),x&&x(v,B),g=v.prototype=_(U)),g.constructor!==v&&c(g,"constructor",v),N&&c(g,N,a),S[a]=v,n({global:!0,forced:v!=m,sham:!F},S),z in v||c(v,z,s),z in g||c(g,z,s),M(a)}):t.exports=function(){}},95329:(t,e,i)=>{var n=i(33386),r=i(38493),s=i(92916),o=i(81609).NATIVE_ARRAY_BUFFER_VIEWS,a=n.ArrayBuffer,h=n.Int8Array;t.exports=!o||!r((function(){h(1)}))||!r((function(){new h(-1)}))||!s((function(t){new h,new h(null),new h(1.5),new h(t)}),!0)||r((function(){return 1!==new h(new a(2),1,void 0).length}))},55066:(t,e,i)=>{var n=i(51223),r=i(7933),s=i(99683),o=i(31243),a=i(39181),h=i(81609).aTypedArrayConstructor;t.exports=function(t){var e,i,u,l,c,d,p=n(t),f=arguments.length,m=f>1?arguments[1]:void 0,v=void 0!==m,g=s(p);if(null!=g&&!o(g))for(d=(c=g.call(p)).next,p=[];!(l=d.call(c)).done;)p.push(l.value);for(v&&f>2&&(m=a(m,arguments[2],2)),i=r(p.length),u=new(h(this))(i),e=0;i>e;e++)u[e]=v?m(p[e],e):p[e];return u}},37645:t=>{var e=0,i=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++e+i).toString(36)}},73018:(t,e,i)=>{var n=i(77802);t.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},71317:(t,e,i)=>{var n=i(10548);e.f=n},10548:(t,e,i)=>{var n=i(33386),r=i(31416),s=i(54585),o=i(37645),a=i(77802),h=i(73018),u=r("wks"),l=n.Symbol,c=h?l:l&&l.withoutSetter||o;t.exports=function(t){return s(u,t)||(a&&s(l,t)?u[t]=l[t]:u[t]=c("Symbol."+t)),u[t]}},71388:t=>{t.exports="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff"},60471:(t,e,i)=>{"use strict";var n=i(23889),r=i(33386),s=i(50539),o=i(16906),a="ArrayBuffer",h=s.ArrayBuffer;n({global:!0,forced:r.ArrayBuffer!==h},{ArrayBuffer:h}),o(a)},31023:(t,e,i)=>{var n=i(23889),r=i(81609);n({target:"ArrayBuffer",stat:!0,forced:!r.NATIVE_ARRAY_BUFFER_VIEWS},{isView:r.isView})},79368:(t,e,i)=>{"use strict";var n=i(23889),r=i(38493),s=i(50539),o=i(13980),a=i(11486),h=i(7933),u=i(7350),l=s.ArrayBuffer,c=s.DataView,d=l.prototype.slice;n({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:r((function(){return!new l(2).slice(1,void 0).byteLength}))},{slice:function(t,e){if(void 0!==d&&void 0===e)return d.call(o(this),t);for(var i=o(this).byteLength,n=a(t,i),r=a(void 0===e?i:e,i),s=new(u(this,l))(h(r-n)),p=new c(this),f=new c(s),m=0;n<r;)f.setUint8(m++,p.getUint8(n++));return s}})},43664:(t,e,i)=>{"use strict";var n=i(23889),r=i(38493),s=i(20351),o=i(68580),a=i(51223),h=i(7933),u=i(73685),l=i(44359),c=i(46453),d=i(10548),p=i(80823),f=d("isConcatSpreadable"),m=9007199254740991,v="Maximum allowed index exceeded",g=p>=51||!r((function(){var t=[];return t[f]=!1,t.concat()[0]!==t})),y=c("concat"),_=function(t){if(!o(t))return!1;var e=t[f];return void 0!==e?!!e:s(t)};n({target:"Array",proto:!0,forced:!g||!y},{concat:function(t){var e,i,n,r,s,o=a(this),c=l(o,0),d=0;for(e=-1,n=arguments.length;e<n;e++)if(_(s=-1===e?o:arguments[e])){if(d+(r=h(s.length))>m)throw TypeError(v);for(i=0;i<r;i++,d++)i in s&&u(c,d,s[i])}else{if(d>=m)throw TypeError(v);u(c,d++,s)}return c.length=d,c}})},83528:(t,e,i)=>{var n=i(23889),r=i(69801),s=i(35240);n({target:"Array",proto:!0},{copyWithin:r}),s("copyWithin")},69050:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).every,s=i(91649),o=i(12797),a=s("every"),h=o("every");n({target:"Array",proto:!0,forced:!a||!h},{every:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},20770:(t,e,i)=>{var n=i(23889),r=i(53009),s=i(35240);n({target:"Array",proto:!0},{fill:r}),s("fill")},97307:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).filter,s=i(46453),o=i(12797),a=s("filter"),h=o("filter");n({target:"Array",proto:!0,forced:!a||!h},{filter:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},17093:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).findIndex,s=i(35240),o=i(12797),a="findIndex",h=!0,u=o(a);a in[]&&Array(1).findIndex((function(){h=!1})),n({target:"Array",proto:!0,forced:h||!u},{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},44841:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).find,s=i(35240),o=i(12797),a="find",h=!0,u=o(a);a in[]&&Array(1).find((function(){h=!1})),n({target:"Array",proto:!0,forced:h||!u},{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),s(a)},63327:(t,e,i)=>{"use strict";var n=i(23889),r=i(70623),s=i(51223),o=i(7933),a=i(23775),h=i(44359);n({target:"Array",proto:!0},{flatMap:function(t){var e,i=s(this),n=o(i.length);return a(t),(e=h(i,0)).length=r(e,i,i,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}})},81548:(t,e,i)=>{"use strict";var n=i(23889),r=i(70623),s=i(51223),o=i(7933),a=i(1557),h=i(44359);n({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=s(this),i=o(e.length),n=h(e,0);return n.length=r(n,e,e,i,0,void 0===t?1:a(t)),n}})},93606:(t,e,i)=>{"use strict";var n=i(23889),r=i(64902);n({target:"Array",proto:!0,forced:[].forEach!=r},{forEach:r})},9413:(t,e,i)=>{var n=i(23889),r=i(83601);n({target:"Array",stat:!0,forced:!i(92916)((function(t){Array.from(t)}))},{from:r})},41988:(t,e,i)=>{"use strict";var n=i(23889),r=i(93289).includes,s=i(35240);n({target:"Array",proto:!0,forced:!i(12797)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),s("includes")},66957:(t,e,i)=>{"use strict";var n=i(23889),r=i(93289).indexOf,s=i(91649),o=i(12797),a=[].indexOf,h=!!a&&1/[1].indexOf(1,-0)<0,u=s("indexOf"),l=o("indexOf",{ACCESSORS:!0,1:0});n({target:"Array",proto:!0,forced:h||!u||!l},{indexOf:function(t){return h?a.apply(this,arguments)||0:r(this,t,arguments.length>1?arguments[1]:void 0)}})},67081:(t,e,i)=>{i(23889)({target:"Array",stat:!0},{isArray:i(20351)})},41499:(t,e,i)=>{"use strict";var n=i(86939),r=i(35240),s=i(15926),o=i(97030),a=i(7693),h="Array Iterator",u=o.set,l=o.getterFor(h);t.exports=a(Array,"Array",(function(t,e){u(this,{type:h,target:n(t),index:0,kind:e})}),(function(){var t=l(this),e=t.target,i=t.kind,n=t.index++;return!e||n>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==i?{value:n,done:!1}:"values"==i?{value:e[n],done:!1}:{value:[n,e[n]],done:!1}}),"values"),s.Arguments=s.Array,r("keys"),r("values"),r("entries")},74410:(t,e,i)=>{"use strict";var n=i(23889),r=i(11749),s=i(86939),o=i(91649),a=[].join,h=r!=Object,u=o("join",",");n({target:"Array",proto:!0,forced:h||!u},{join:function(t){return a.call(s(this),void 0===t?",":t)}})},55882:(t,e,i)=>{var n=i(23889),r=i(8287);n({target:"Array",proto:!0,forced:r!==[].lastIndexOf},{lastIndexOf:r})},17448:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).map,s=i(46453),o=i(12797),a=s("map"),h=o("map");n({target:"Array",proto:!0,forced:!a||!h},{map:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},87391:(t,e,i)=>{"use strict";var n=i(23889),r=i(38493),s=i(73685);n({target:"Array",stat:!0,forced:r((function(){function t(){}return!(Array.of.call(t)instanceof t)}))},{of:function(){for(var t=0,e=arguments.length,i=new("function"==typeof this?this:Array)(e);e>t;)s(i,t,arguments[t++]);return i.length=e,i}})},29578:(t,e,i)=>{"use strict";var n=i(23889),r=i(22164).right,s=i(91649),o=i(12797),a=s("reduceRight"),h=o("reduce",{1:0});n({target:"Array",proto:!0,forced:!a||!h},{reduceRight:function(t){return r(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},78384:(t,e,i)=>{"use strict";var n=i(23889),r=i(22164).left,s=i(91649),o=i(12797),a=s("reduce"),h=o("reduce",{1:0});n({target:"Array",proto:!0,forced:!a||!h},{reduce:function(t){return r(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},50300:(t,e,i)=>{"use strict";var n=i(23889),r=i(20351),s=[].reverse,o=[1,2];n({target:"Array",proto:!0,forced:String(o)===String(o.reverse())},{reverse:function(){return r(this)&&(this.length=this.length),s.call(this)}})},44316:(t,e,i)=>{"use strict";var n=i(23889),r=i(68580),s=i(20351),o=i(11486),a=i(7933),h=i(86939),u=i(73685),l=i(10548),c=i(46453),d=i(12797),p=c("slice"),f=d("slice",{ACCESSORS:!0,0:0,1:2}),m=l("species"),v=[].slice,g=Math.max;n({target:"Array",proto:!0,forced:!p||!f},{slice:function(t,e){var i,n,l,c=h(this),d=a(c.length),p=o(t,d),f=o(void 0===e?d:e,d);if(s(c)&&("function"!=typeof(i=c.constructor)||i!==Array&&!s(i.prototype)?r(i)&&null===(i=i[m])&&(i=void 0):i=void 0,i===Array||void 0===i))return v.call(c,p,f);for(n=new(void 0===i?Array:i)(g(f-p,0)),l=0;p<f;p++,l++)p in c&&u(n,l,c[p]);return n.length=l,n}})},94093:(t,e,i)=>{"use strict";var n=i(23889),r=i(7622).some,s=i(91649),o=i(12797),a=s("some"),h=o("some");n({target:"Array",proto:!0,forced:!a||!h},{some:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},33453:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(51223),o=i(38493),a=i(91649),h=[],u=h.sort,l=o((function(){h.sort(void 0)})),c=o((function(){h.sort(null)})),d=a("sort");n({target:"Array",proto:!0,forced:l||!c||!d},{sort:function(t){return void 0===t?u.call(s(this)):u.call(s(this),r(t))}})},57500:(t,e,i)=>{i(16906)("Array")},72006:(t,e,i)=>{"use strict";var n=i(23889),r=i(11486),s=i(1557),o=i(7933),a=i(51223),h=i(44359),u=i(73685),l=i(46453),c=i(12797),d=l("splice"),p=c("splice",{ACCESSORS:!0,0:0,1:2}),f=Math.max,m=Math.min,v=9007199254740991,g="Maximum allowed length exceeded";n({target:"Array",proto:!0,forced:!d||!p},{splice:function(t,e){var i,n,l,c,d,p,y=a(this),_=o(y.length),x=r(t,_),b=arguments.length;if(0===b?i=n=0:1===b?(i=0,n=_-x):(i=b-2,n=m(f(s(e),0),_-x)),_+i-n>v)throw TypeError(g);for(l=h(y,n),c=0;c<n;c++)(d=x+c)in y&&u(l,c,y[d]);if(l.length=n,i<n){for(c=x;c<_-n;c++)p=c+i,(d=c+n)in y?y[p]=y[d]:delete y[p];for(c=_;c>_-n+i;c--)delete y[c-1]}else if(i>n)for(c=_-n;c>x;c--)p=c+i-1,(d=c+n-1)in y?y[p]=y[d]:delete y[p];for(c=0;c<i;c++)y[c+x]=arguments[c+2];return y.length=_-n+i,l}})},55495:(t,e,i)=>{i(35240)("flatMap")},2613:(t,e,i)=>{i(35240)("flat")},54093:(t,e,i)=>{var n=i(23889),r=i(50539);n({global:!0,forced:!i(73409)},{DataView:r.DataView})},7083:(t,e,i)=>{i(23889)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},11904:(t,e,i)=>{var n=i(23889),r=i(87124);n({target:"Date",proto:!0,forced:Date.prototype.toISOString!==r},{toISOString:r})},58008:(t,e,i)=>{"use strict";var n=i(23889),r=i(38493),s=i(51223),o=i(33196);n({target:"Date",proto:!0,forced:r((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(t){var e=s(this),i=o(e);return"number"!=typeof i||isFinite(i)?e.toISOString():null}})},76536:(t,e,i)=>{var n=i(17182),r=i(22853),s=i(10548)("toPrimitive"),o=Date.prototype;s in o||n(o,s,r)},36472:(t,e,i)=>{var n=i(18957),r=Date.prototype,s="Invalid Date",o="toString",a=r.toString,h=r.getTime;new Date(NaN)+""!=s&&n(r,o,(function(){var t=h.call(this);return t==t?a.call(this):s}))},34913:(t,e,i)=>{i(23889)({target:"Function",proto:!0},{bind:i(31078)})},46441:(t,e,i)=>{"use strict";var n=i(68580),r=i(64774),s=i(29528),o=i(10548)("hasInstance"),a=Function.prototype;o in a||r.f(a,o,{value:function(t){if("function"!=typeof this||!n(t))return!1;if(!n(this.prototype))return t instanceof this;for(;t=s(t);)if(this.prototype===t)return!0;return!1}})},68071:(t,e,i)=>{var n=i(56617),r=i(64774).f,s=Function.prototype,o=s.toString,a=/^\s*function ([^ (]*)/,h="name";n&&!(h in s)&&r(s,h,{configurable:!0,get:function(){try{return o.call(this).match(a)[1]}catch(t){return""}}})},2506:(t,e,i)=>{i(23889)({global:!0},{globalThis:i(33386)})},37692:(t,e,i)=>{var n=i(23889),r=i(27623),s=i(38493),o=r("JSON","stringify"),a=/[\uD800-\uDFFF]/g,h=/^[\uD800-\uDBFF]$/,u=/^[\uDC00-\uDFFF]$/,l=function(t,e,i){var n=i.charAt(e-1),r=i.charAt(e+1);return h.test(t)&&!u.test(r)||u.test(t)&&!h.test(n)?"\\u"+t.charCodeAt(0).toString(16):t},c=s((function(){return'"\\udf06\\ud834"'!==o("\udf06\ud834")||'"\\udead"'!==o("\udead")}));o&&n({target:"JSON",stat:!0,forced:c},{stringify:function(t,e,i){var n=o.apply(null,arguments);return"string"==typeof n?n.replace(a,l):n}})},91702:(t,e,i)=>{var n=i(33386);i(39893)(n.JSON,"JSON",!0)},65017:(t,e,i)=>{"use strict";var n=i(93574),r=i(5749);t.exports=n("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),r)},37401:(t,e,i)=>{var n=i(23889),r=i(22224),s=Math.acosh,o=Math.log,a=Math.sqrt,h=Math.LN2;n({target:"Math",stat:!0,forced:!s||710!=Math.floor(s(Number.MAX_VALUE))||s(1/0)!=1/0},{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?o(t)+h:r(t-1+a(t-1)*a(t+1))}})},58137:(t,e,i)=>{var n=i(23889),r=Math.asinh,s=Math.log,o=Math.sqrt;n({target:"Math",stat:!0,forced:!(r&&1/r(0)>0)},{asinh:function t(e){return isFinite(e=+e)&&0!=e?e<0?-t(-e):s(e+o(e*e+1)):e}})},14107:(t,e,i)=>{var n=i(23889),r=Math.atanh,s=Math.log;n({target:"Math",stat:!0,forced:!(r&&1/r(-0)<0)},{atanh:function(t){return 0==(t=+t)?t:s((1+t)/(1-t))/2}})},79427:(t,e,i)=>{var n=i(23889),r=i(98514),s=Math.abs,o=Math.pow;n({target:"Math",stat:!0},{cbrt:function(t){return r(t=+t)*o(s(t),1/3)}})},57090:(t,e,i)=>{var n=i(23889),r=Math.floor,s=Math.log,o=Math.LOG2E;n({target:"Math",stat:!0},{clz32:function(t){return(t>>>=0)?31-r(s(t+.5)*o):32}})},66060:(t,e,i)=>{var n=i(23889),r=i(12224),s=Math.cosh,o=Math.abs,a=Math.E;n({target:"Math",stat:!0,forced:!s||s(710)===1/0},{cosh:function(t){var e=r(o(t)-1)+1;return(e+1/(e*a*a))*(a/2)}})},68176:(t,e,i)=>{var n=i(23889),r=i(12224);n({target:"Math",stat:!0,forced:r!=Math.expm1},{expm1:r})},19476:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{fround:i(89492)})},12386:(t,e,i)=>{var n=i(23889),r=Math.hypot,s=Math.abs,o=Math.sqrt;n({target:"Math",stat:!0,forced:!!r&&r(1/0,NaN)!==1/0},{hypot:function(t,e){for(var i,n,r=0,a=0,h=arguments.length,u=0;a<h;)u<(i=s(arguments[a++]))?(r=r*(n=u/i)*n+1,u=i):r+=i>0?(n=i/u)*n:i;return u===1/0?1/0:u*o(r)}})},93113:(t,e,i)=>{var n=i(23889),r=i(38493),s=Math.imul;n({target:"Math",stat:!0,forced:r((function(){return-5!=s(4294967295,5)||2!=s.length}))},{imul:function(t,e){var i=65535,n=+t,r=+e,s=i&n,o=i&r;return 0|s*o+((i&n>>>16)*o+s*(i&r>>>16)<<16>>>0)}})},42376:(t,e,i)=>{var n=i(23889),r=Math.log,s=Math.LOG10E;n({target:"Math",stat:!0},{log10:function(t){return r(t)*s}})},41398:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{log1p:i(22224)})},68162:(t,e,i)=>{var n=i(23889),r=Math.log,s=Math.LN2;n({target:"Math",stat:!0},{log2:function(t){return r(t)/s}})},71070:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{sign:i(98514)})},99476:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(12224),o=Math.abs,a=Math.exp,h=Math.E;n({target:"Math",stat:!0,forced:r((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(t){return o(t=+t)<1?(s(t)-s(-t))/2:(a(t-1)-a(-t-1))*(h/2)}})},3186:(t,e,i)=>{var n=i(23889),r=i(12224),s=Math.exp;n({target:"Math",stat:!0},{tanh:function(t){var e=r(t=+t),i=r(-t);return e==1/0?1:i==1/0?-1:(e-i)/(s(t)+s(-t))}})},4407:(t,e,i)=>{i(39893)(Math,"Math",!0)},39053:(t,e,i)=>{var n=i(23889),r=Math.ceil,s=Math.floor;n({target:"Math",stat:!0},{trunc:function(t){return(t>0?s:r)(t)}})},76515:(t,e,i)=>{"use strict";var n=i(56617),r=i(33386),s=i(60995),o=i(18957),a=i(54585),h=i(2178),u=i(27541),l=i(33196),c=i(38493),d=i(37602),p=i(74562).f,f=i(91211).f,m=i(64774).f,v=i(66672).trim,g="Number",y=r.Number,_=y.prototype,x=h(d(_))==g,b=function(t){var e,i,n,r,s,o,a,h,u=l(t,!1);if("string"==typeof u&&u.length>2)if(43===(e=(u=v(u)).charCodeAt(0))||45===e){if(88===(i=u.charCodeAt(2))||120===i)return NaN}else if(48===e){switch(u.charCodeAt(1)){case 66:case 98:n=2,r=49;break;case 79:case 111:n=8,r=55;break;default:return+u}for(o=(s=u.slice(2)).length,a=0;a<o;a++)if((h=s.charCodeAt(a))<48||h>r)return NaN;return parseInt(s,n)}return+u};if(s(g,!y(" 0o1")||!y("0b1")||y("+0x1"))){for(var w,T=function(t){var e=arguments.length<1?0:t,i=this;return i instanceof T&&(x?c((function(){_.valueOf.call(i)})):h(i)!=g)?u(new y(b(e)),i,T):b(e)},M=n?p(y):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),S=0;M.length>S;S++)a(y,w=M[S])&&!a(T,w)&&m(T,w,f(y,w));T.prototype=_,_.constructor=T,o(r,g,T)}},93189:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},99042:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{isFinite:i(48682)})},31116:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{isInteger:i(33054)})},87294:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},2877:(t,e,i)=>{var n=i(23889),r=i(33054),s=Math.abs;n({target:"Number",stat:!0},{isSafeInteger:function(t){return r(t)&&s(t)<=9007199254740991}})},60242:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},75737:(t,e,i)=>{i(23889)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},55515:(t,e,i)=>{var n=i(23889),r=i(2463);n({target:"Number",stat:!0,forced:Number.parseFloat!=r},{parseFloat:r})},34825:(t,e,i)=>{var n=i(23889),r=i(62229);n({target:"Number",stat:!0,forced:Number.parseInt!=r},{parseInt:r})},67401:(t,e,i)=>{"use strict";var n=i(23889),r=i(1557),s=i(85550),o=i(71804),a=i(38493),h=1..toFixed,u=Math.floor,l=function(t,e,i){return 0===e?i:e%2==1?l(t,e-1,i*t):l(t*t,e/2,i)};n({target:"Number",proto:!0,forced:h&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!a((function(){h.call({})}))},{toFixed:function(t){var e,i,n,a,h=s(this),c=r(t),d=[0,0,0,0,0,0],p="",f="0",m=function(t,e){for(var i=-1,n=e;++i<6;)n+=t*d[i],d[i]=n%1e7,n=u(n/1e7)},v=function(t){for(var e=6,i=0;--e>=0;)i+=d[e],d[e]=u(i/t),i=i%t*1e7},g=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==d[t]){var i=String(d[t]);e=""===e?i:e+o.call("0",7-i.length)+i}return e};if(c<0||c>20)throw RangeError("Incorrect fraction digits");if(h!=h)return"NaN";if(h<=-1e21||h>=1e21)return String(h);if(h<0&&(p="-",h=-h),h>1e-21)if(i=(e=function(t){for(var e=0,i=t;i>=4096;)e+=12,i/=4096;for(;i>=2;)e+=1,i/=2;return e}(h*l(2,69,1))-69)<0?h*l(2,-e,1):h/l(2,e,1),i*=4503599627370496,(e=52-e)>0){for(m(0,i),n=c;n>=7;)m(1e7,0),n-=7;for(m(l(10,n,1),0),n=e-1;n>=23;)v(1<<23),n-=23;v(1<<n),m(1,1),v(2),f=g()}else m(0,i),m(1<<-e,0),f=g()+o.call("0",c);return f=c>0?p+((a=f.length)<=c?"0."+o.call("0",c-a)+f:f.slice(0,a-c)+"."+f.slice(a-c)):p+f}})},3398:(t,e,i)=>{"use strict";var n=i(23889),r=i(38493),s=i(85550),o=1..toPrecision;n({target:"Number",proto:!0,forced:r((function(){return"1"!==o.call(1,void 0)}))||!r((function(){o.call({})}))},{toPrecision:function(t){return void 0===t?o.call(s(this)):o.call(s(this),t)}})},37007:(t,e,i)=>{var n=i(23889),r=i(98466);n({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},33639:(t,e,i)=>{i(23889)({target:"Object",stat:!0,sham:!i(56617)},{create:i(37602)})},72814:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(36061),o=i(51223),a=i(23775),h=i(64774);r&&n({target:"Object",proto:!0,forced:s},{__defineGetter__:function(t,e){h.f(o(this),t,{get:a(e),enumerable:!0,configurable:!0})}})},66412:(t,e,i)=>{var n=i(23889),r=i(56617);n({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperties:i(23702)})},34895:(t,e,i)=>{var n=i(23889),r=i(56617);n({target:"Object",stat:!0,forced:!r,sham:!r},{defineProperty:i(64774).f})},37621:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(36061),o=i(51223),a=i(23775),h=i(64774);r&&n({target:"Object",proto:!0,forced:s},{__defineSetter__:function(t,e){h.f(o(this),t,{set:a(e),enumerable:!0,configurable:!0})}})},44157:(t,e,i)=>{var n=i(23889),r=i(38509).entries;n({target:"Object",stat:!0},{entries:function(t){return r(t)}})},38300:(t,e,i)=>{var n=i(23889),r=i(37235),s=i(38493),o=i(68580),a=i(8080).onFreeze,h=Object.freeze;n({target:"Object",stat:!0,forced:s((function(){h(1)})),sham:!r},{freeze:function(t){return h&&o(t)?h(a(t)):t}})},58503:(t,e,i)=>{var n=i(23889),r=i(76808),s=i(73685);n({target:"Object",stat:!0},{fromEntries:function(t){var e={};return r(t,(function(t,i){s(e,t,i)}),void 0,!0),e}})},59500:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(86939),o=i(91211).f,a=i(56617),h=r((function(){o(1)}));n({target:"Object",stat:!0,forced:!a||h,sham:!a},{getOwnPropertyDescriptor:function(t,e){return o(s(t),e)}})},20791:(t,e,i)=>{var n=i(23889),r=i(56617),s=i(54327),o=i(86939),a=i(91211),h=i(73685);n({target:"Object",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(t){for(var e,i,n=o(t),r=a.f,u=s(n),l={},c=0;u.length>c;)void 0!==(i=r(n,e=u[c++]))&&h(l,e,i);return l}})},22473:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(74720).f;n({target:"Object",stat:!0,forced:r((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:s})},79062:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(51223),o=i(29528),a=i(5331);n({target:"Object",stat:!0,forced:r((function(){o(1)})),sham:!a},{getPrototypeOf:function(t){return o(s(t))}})},76973:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(68580),o=Object.isExtensible;n({target:"Object",stat:!0,forced:r((function(){o(1)}))},{isExtensible:function(t){return!!s(t)&&(!o||o(t))}})},65679:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(68580),o=Object.isFrozen;n({target:"Object",stat:!0,forced:r((function(){o(1)}))},{isFrozen:function(t){return!s(t)||!!o&&o(t)}})},88263:(t,e,i)=>{var n=i(23889),r=i(38493),s=i(68580),o=Object.isSealed;n({target:"Object",stat:!0,forced:r((function(){o(1)}))},{isSealed:function(t){return!s(t)||!!o&&o(t)}})},23946:(t,e,i)=>{i(23889)({target:"Object",stat:!0},{is:i(12195)})},57425:(t,e,i)=>{var n=i(23889),r=i(51223),s=i(64855);n({target:"Object",stat:!0,forced:i(38493)((function(){s(1)}))},{keys:function(t){return s(r(t))}})},95773:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(36061),o=i(51223),a=i(33196),h=i(29528),u=i(91211).f;r&&n({target:"Object",proto:!0,forced:s},{__lookupGetter__:function(t){var e,i=o(this),n=a(t,!0);do{if(e=u(i,n))return e.get}while(i=h(i))}})},26485:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(36061),o=i(51223),a=i(33196),h=i(29528),u=i(91211).f;r&&n({target:"Object",proto:!0,forced:s},{__lookupSetter__:function(t){var e,i=o(this),n=a(t,!0);do{if(e=u(i,n))return e.set}while(i=h(i))}})},25699:(t,e,i)=>{var n=i(23889),r=i(68580),s=i(8080).onFreeze,o=i(37235),a=i(38493),h=Object.preventExtensions;n({target:"Object",stat:!0,forced:a((function(){h(1)})),sham:!o},{preventExtensions:function(t){return h&&r(t)?h(s(t)):t}})},81736:(t,e,i)=>{var n=i(23889),r=i(68580),s=i(8080).onFreeze,o=i(37235),a=i(38493),h=Object.seal;n({target:"Object",stat:!0,forced:a((function(){h(1)})),sham:!o},{seal:function(t){return h&&r(t)?h(s(t)):t}})},10070:(t,e,i)=>{i(23889)({target:"Object",stat:!0},{setPrototypeOf:i(15456)})},3930:(t,e,i)=>{var n=i(29100),r=i(18957),s=i(27148);n||r(Object.prototype,"toString",s,{unsafe:!0})},50031:(t,e,i)=>{var n=i(23889),r=i(38509).values;n({target:"Object",stat:!0},{values:function(t){return r(t)}})},84317:(t,e,i)=>{var n=i(23889),r=i(2463);n({global:!0,forced:parseFloat!=r},{parseFloat:r})},36672:(t,e,i)=>{var n=i(23889),r=i(62229);n({global:!0,forced:parseInt!=r},{parseInt:r})},8378:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(8168),o=i(70595),a=i(76808);n({target:"Promise",stat:!0},{allSettled:function(t){var e=this,i=s.f(e),n=i.resolve,h=i.reject,u=o((function(){var i=r(e.resolve),s=[],o=0,h=1;a(t,(function(t){var r=o++,a=!1;s.push(void 0),h++,i.call(e,t).then((function(t){a||(a=!0,s[r]={status:"fulfilled",value:t},--h||n(s))}),(function(t){a||(a=!0,s[r]={status:"rejected",reason:t},--h||n(s))}))})),--h||n(s)}));return u.error&&h(u.value),i.promise}})},80149:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(25306),o=i(38493),a=i(27623),h=i(7350),u=i(39230),l=i(18957);n({target:"Promise",proto:!0,real:!0,forced:!!s&&o((function(){s.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var e=h(this,a("Promise")),i="function"==typeof t;return this.then(i?function(i){return u(e,t()).then((function(){return i}))}:t,i?function(i){return u(e,t()).then((function(){throw i}))}:t)}}),r||"function"!=typeof s||s.prototype.finally||l(s.prototype,"finally",a("Promise").prototype.finally)},91772:(t,e,i)=>{"use strict";var n,r,s,o,a=i(23889),h=i(51104),u=i(33386),l=i(27623),c=i(25306),d=i(18957),p=i(11432),f=i(39893),m=i(16906),v=i(68580),g=i(23775),y=i(31057),_=i(2178),x=i(82133),b=i(76808),w=i(92916),T=i(7350),M=i(39331).set,S=i(65516),E=i(39230),L=i(98684),A=i(8168),D=i(70595),P=i(97030),C=i(60995),O=i(10548),k=i(80823),R=O("species"),I="Promise",Y=P.get,F=P.set,N=P.getterFor(I),B=c,U=u.TypeError,j=u.document,H=u.process,z=l("fetch"),W=A.f,G=W,V="process"==_(H),X=!!(j&&j.createEvent&&u.dispatchEvent),q="unhandledrejection",J=C(I,(function(){if(!(x(B)!==String(B))){if(66===k)return!0;if(!V&&"function"!=typeof PromiseRejectionEvent)return!0}if(h&&!B.prototype.finally)return!0;if(k>=51&&/native code/.test(B))return!1;var t=B.resolve(1),e=function(t){t((function(){}),(function(){}))};return(t.constructor={})[R]=e,!(t.then((function(){}))instanceof e)})),Z=J||!w((function(t){B.all(t).catch((function(){}))})),K=function(t){var e;return!(!v(t)||"function"!=typeof(e=t.then))&&e},Q=function(t,e,i){if(!e.notified){e.notified=!0;var n=e.reactions;S((function(){for(var r=e.value,s=1==e.state,o=0;n.length>o;){var a,h,u,l=n[o++],c=s?l.ok:l.fail,d=l.resolve,p=l.reject,f=l.domain;try{c?(s||(2===e.rejection&&it(t,e),e.rejection=1),!0===c?a=r:(f&&f.enter(),a=c(r),f&&(f.exit(),u=!0)),a===l.promise?p(U("Promise-chain cycle")):(h=K(a))?h.call(a,d,p):d(a)):p(r)}catch(t){f&&!u&&f.exit(),p(t)}}e.reactions=[],e.notified=!1,i&&!e.rejection&&tt(t,e)}))}},$=function(t,e,i){var n,r;X?((n=j.createEvent("Event")).promise=e,n.reason=i,n.initEvent(t,!1,!0),u.dispatchEvent(n)):n={promise:e,reason:i},(r=u["on"+t])?r(n):t===q&&L("Unhandled promise rejection",i)},tt=function(t,e){M.call(u,(function(){var i,n=e.value;if(et(e)&&(i=D((function(){V?H.emit("unhandledRejection",n,t):$(q,t,n)})),e.rejection=V||et(e)?2:1,i.error))throw i.value}))},et=function(t){return 1!==t.rejection&&!t.parent},it=function(t,e){M.call(u,(function(){V?H.emit("rejectionHandled",t):$("rejectionhandled",t,e.value)}))},nt=function(t,e,i,n){return function(r){t(e,i,r,n)}},rt=function(t,e,i,n){e.done||(e.done=!0,n&&(e=n),e.value=i,e.state=2,Q(t,e,!0))},st=function(t,e,i,n){if(!e.done){e.done=!0,n&&(e=n);try{if(t===i)throw U("Promise can't be resolved itself");var r=K(i);r?S((function(){var n={done:!1};try{r.call(i,nt(st,t,n,e),nt(rt,t,n,e))}catch(i){rt(t,n,i,e)}})):(e.value=i,e.state=1,Q(t,e,!1))}catch(i){rt(t,{done:!1},i,e)}}};J&&(B=function(t){y(this,B,I),g(t),n.call(this);var e=Y(this);try{t(nt(st,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(n=function(t){F(this,{type:I,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=p(B.prototype,{then:function(t,e){var i=N(this),n=W(T(this,B));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=V?H.domain:void 0,i.parent=!0,i.reactions.push(n),0!=i.state&&Q(this,i,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),r=function(){var t=new n,e=Y(t);this.promise=t,this.resolve=nt(st,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===B||t===s?new r(t):G(t)},h||"function"!=typeof c||(o=c.prototype.then,d(c.prototype,"then",(function(t,e){var i=this;return new B((function(t,e){o.call(i,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof z&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return E(B,z.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:J},{Promise:B}),f(B,I,!1,!0),m(I),s=l(I),a({target:I,stat:!0,forced:J},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:I,stat:!0,forced:h||J},{resolve:function(t){return E(h&&this===s?B:this,t)}}),a({target:I,stat:!0,forced:Z},{all:function(t){var e=this,i=W(e),n=i.resolve,r=i.reject,s=D((function(){var i=g(e.resolve),s=[],o=0,a=1;b(t,(function(t){var h=o++,u=!1;s.push(void 0),a++,i.call(e,t).then((function(t){u||(u=!0,s[h]=t,--a||n(s))}),r)})),--a||n(s)}));return s.error&&r(s.value),i.promise},race:function(t){var e=this,i=W(e),n=i.reject,r=D((function(){var r=g(e.resolve);b(t,(function(t){r.call(e,t).then(i.resolve,n)}))}));return r.error&&n(r.value),i.promise}})},83771:(t,e,i)=>{var n=i(23889),r=i(27623),s=i(23775),o=i(13980),a=i(38493),h=r("Reflect","apply"),u=Function.apply;n({target:"Reflect",stat:!0,forced:!a((function(){h((function(){}))}))},{apply:function(t,e,i){return s(t),o(i),h?h(t,e,i):u.call(t,e,i)}})},1789:(t,e,i)=>{var n=i(23889),r=i(27623),s=i(23775),o=i(13980),a=i(68580),h=i(37602),u=i(31078),l=i(38493),c=r("Reflect","construct"),d=l((function(){function t(){}return!(c((function(){}),[],t)instanceof t)})),p=!l((function(){c((function(){}))})),f=d||p;n({target:"Reflect",stat:!0,forced:f,sham:f},{construct:function(t,e){s(t),o(e);var i=arguments.length<3?t:s(arguments[2]);if(p&&!d)return c(t,e,i);if(t==i){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var n=[null];return n.push.apply(n,e),new(u.apply(t,n))}var r=i.prototype,l=h(a(r)?r:Object.prototype),f=Function.apply.call(t,l,e);return a(f)?f:l}})},27942:(t,e,i)=>{var n=i(23889),r=i(56617),s=i(13980),o=i(33196),a=i(64774);n({target:"Reflect",stat:!0,forced:i(38493)((function(){Reflect.defineProperty(a.f({},1,{value:1}),1,{value:2})})),sham:!r},{defineProperty:function(t,e,i){s(t);var n=o(e,!0);s(i);try{return a.f(t,n,i),!0}catch(t){return!1}}})},40080:(t,e,i)=>{var n=i(23889),r=i(13980),s=i(91211).f;n({target:"Reflect",stat:!0},{deleteProperty:function(t,e){var i=s(r(t),e);return!(i&&!i.configurable)&&delete t[e]}})},94022:(t,e,i)=>{var n=i(23889),r=i(56617),s=i(13980),o=i(91211);n({target:"Reflect",stat:!0,sham:!r},{getOwnPropertyDescriptor:function(t,e){return o.f(s(t),e)}})},53043:(t,e,i)=>{var n=i(23889),r=i(13980),s=i(29528);n({target:"Reflect",stat:!0,sham:!i(5331)},{getPrototypeOf:function(t){return s(r(t))}})},58347:(t,e,i)=>{var n=i(23889),r=i(68580),s=i(13980),o=i(54585),a=i(91211),h=i(29528);n({target:"Reflect",stat:!0},{get:function t(e,i){var n,u,l=arguments.length<3?e:arguments[2];return s(e)===l?e[i]:(n=a.f(e,i))?o(n,"value")?n.value:void 0===n.get?void 0:n.get.call(l):r(u=h(e))?t(u,i,l):void 0}})},41841:(t,e,i)=>{i(23889)({target:"Reflect",stat:!0},{has:function(t,e){return e in t}})},60142:(t,e,i)=>{var n=i(23889),r=i(13980),s=Object.isExtensible;n({target:"Reflect",stat:!0},{isExtensible:function(t){return r(t),!s||s(t)}})},85529:(t,e,i)=>{i(23889)({target:"Reflect",stat:!0},{ownKeys:i(54327)})},41454:(t,e,i)=>{var n=i(23889),r=i(27623),s=i(13980);n({target:"Reflect",stat:!0,sham:!i(37235)},{preventExtensions:function(t){s(t);try{var e=r("Object","preventExtensions");return e&&e(t),!0}catch(t){return!1}}})},8014:(t,e,i)=>{var n=i(23889),r=i(13980),s=i(66020),o=i(15456);o&&n({target:"Reflect",stat:!0},{setPrototypeOf:function(t,e){r(t),s(e);try{return o(t,e),!0}catch(t){return!1}}})},3994:(t,e,i)=>{var n=i(23889),r=i(13980),s=i(68580),o=i(54585),a=i(38493),h=i(64774),u=i(91211),l=i(29528),c=i(36846);n({target:"Reflect",stat:!0,forced:a((function(){var t=h.f({},"a",{configurable:!0});return!1!==Reflect.set(l(t),"a",1,t)}))},{set:function t(e,i,n){var a,d,p=arguments.length<4?e:arguments[3],f=u.f(r(e),i);if(!f){if(s(d=l(e)))return t(d,i,n,p);f=c(0)}if(o(f,"value")){if(!1===f.writable||!s(p))return!1;if(a=u.f(p,i)){if(a.get||a.set||!1===a.writable)return!1;a.value=n,h.f(p,i,a)}else h.f(p,i,c(0,n));return!0}return void 0!==f.set&&(f.set.call(p,n),!0)}})},83813:(t,e,i)=>{var n=i(56617),r=i(33386),s=i(60995),o=i(27541),a=i(64774).f,h=i(74562).f,u=i(39376),l=i(21068),c=i(97262),d=i(18957),p=i(38493),f=i(97030).set,m=i(16906),v=i(10548)("match"),g=r.RegExp,y=g.prototype,_=/a/g,x=/a/g,b=new g(_)!==_,w=c.UNSUPPORTED_Y;if(n&&s("RegExp",!b||w||p((function(){return x[v]=!1,g(_)!=_||g(x)==x||"/a/i"!=g(_,"i")})))){for(var T=function(t,e){var i,n=this instanceof T,r=u(t),s=void 0===e;if(!n&&r&&t.constructor===T&&s)return t;b?r&&!s&&(t=t.source):t instanceof T&&(s&&(e=l.call(t)),t=t.source),w&&(i=!!e&&e.indexOf("y")>-1)&&(e=e.replace(/y/g,""));var a=o(b?new g(t,e):g(t,e),n?this:y,T);return w&&i&&f(a,{sticky:i}),a},M=function(t){t in T||a(T,t,{configurable:!0,get:function(){return g[t]},set:function(e){g[t]=e}})},S=h(g),E=0;S.length>E;)M(S[E++]);y.constructor=T,T.prototype=y,d(r,"RegExp",T)}m("RegExp")},99058:(t,e,i)=>{"use strict";var n=i(23889),r=i(83815);n({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},21413:(t,e,i)=>{var n=i(56617),r=i(64774),s=i(21068),o=i(97262).UNSUPPORTED_Y;n&&("g"!=/./g.flags||o)&&r.f(RegExp.prototype,"flags",{configurable:!0,get:s})},31113:(t,e,i)=>{var n=i(56617),r=i(97262).UNSUPPORTED_Y,s=i(64774).f,o=i(97030).get,a=RegExp.prototype;n&&r&&s(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==a){if(this instanceof RegExp)return!!o(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}})},78526:(t,e,i)=>{"use strict";i(99058);var n,r,s=i(23889),o=i(68580),a=(n=!1,(r=/[ac]/).exec=function(){return n=!0,/./.exec.apply(this,arguments)},!0===r.test("abc")&&n),h=/./.test;s({target:"RegExp",proto:!0,forced:!a},{test:function(t){if("function"!=typeof this.exec)return h.call(this,t);var e=this.exec(t);if(null!==e&&!o(e))throw new Error("RegExp exec method returned something other than an Object or null");return!!e}})},80181:(t,e,i)=>{"use strict";var n=i(18957),r=i(13980),s=i(38493),o=i(21068),a="toString",h=RegExp.prototype,u=h.toString,l=s((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),c=u.name!=a;(l||c)&&n(RegExp.prototype,a,(function(){var t=r(this),e=String(t.source),i=t.flags;return"/"+e+"/"+String(void 0===i&&t instanceof RegExp&&!("flags"in h)?o.call(t):i)}),{unsafe:!0})},31417:(t,e,i)=>{"use strict";var n=i(93574),r=i(5749);t.exports=n("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),r)},32975:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("anchor")},{anchor:function(t){return r(this,"a","name",t)}})},4184:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("big")},{big:function(){return r(this,"big","","")}})},9613:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("blink")},{blink:function(){return r(this,"blink","","")}})},99334:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("bold")},{bold:function(){return r(this,"b","","")}})},19569:(t,e,i)=>{"use strict";var n=i(23889),r=i(17933).codeAt;n({target:"String",proto:!0},{codePointAt:function(t){return r(this,t)}})},23372:(t,e,i)=>{"use strict";var n,r=i(23889),s=i(91211).f,o=i(7933),a=i(89109),h=i(86608),u=i(43728),l=i(51104),c="".endsWith,d=Math.min,p=u("endsWith");r({target:"String",proto:!0,forced:!!(l||p||(n=s(String.prototype,"endsWith"),!n||n.writable))&&!p},{endsWith:function(t){var e=String(h(this));a(t);var i=arguments.length>1?arguments[1]:void 0,n=o(e.length),r=void 0===i?n:d(o(i),n),s=String(t);return c?c.call(e,s,r):e.slice(r-s.length,r)===s}})},72046:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("fixed")},{fixed:function(){return r(this,"tt","","")}})},84531:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("fontcolor")},{fontcolor:function(t){return r(this,"font","color",t)}})},3573:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("fontsize")},{fontsize:function(t){return r(this,"font","size",t)}})},18670:(t,e,i)=>{var n=i(23889),r=i(11486),s=String.fromCharCode,o=String.fromCodePoint;n({target:"String",stat:!0,forced:!!o&&1!=o.length},{fromCodePoint:function(t){for(var e,i=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");i.push(e<65536?s(e):s(55296+((e-=65536)>>10),e%1024+56320))}return i.join("")}})},75560:(t,e,i)=>{"use strict";var n=i(23889),r=i(89109),s=i(86608);n({target:"String",proto:!0,forced:!i(43728)("includes")},{includes:function(t){return!!~String(s(this)).indexOf(r(t),arguments.length>1?arguments[1]:void 0)}})},26463:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("italics")},{italics:function(){return r(this,"i","","")}})},770:(t,e,i)=>{"use strict";var n=i(17933).charAt,r=i(97030),s=i(7693),o="String Iterator",a=r.set,h=r.getterFor(o);s(String,"String",(function(t){a(this,{type:o,string:String(t),index:0})}),(function(){var t,e=h(this),i=e.string,r=e.index;return r>=i.length?{value:void 0,done:!0}:(t=n(i,r),e.index+=t.length,{value:t,done:!1})}))},19584:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("link")},{link:function(t){return r(this,"a","href",t)}})},28828:(t,e,i)=>{"use strict";var n=i(23889),r=i(2395),s=i(86608),o=i(7933),a=i(23775),h=i(13980),u=i(2178),l=i(39376),c=i(21068),d=i(17182),p=i(38493),f=i(10548),m=i(7350),v=i(64334),g=i(97030),y=i(51104),_=f("matchAll"),x="RegExp String",b="RegExp String Iterator",w=g.set,T=g.getterFor(b),M=RegExp.prototype,S=M.exec,E="".matchAll,L=!!E&&!p((function(){"a".matchAll(/./)})),A=r((function(t,e,i,n){w(this,{type:b,regexp:t,string:e,global:i,unicode:n,done:!1})}),x,(function(){var t=T(this);if(t.done)return{value:void 0,done:!0};var e=t.regexp,i=t.string,n=function(t,e){var i,n=t.exec;if("function"==typeof n){if("object"!=typeof(i=n.call(t,e)))throw TypeError("Incorrect exec result");return i}return S.call(t,e)}(e,i);return null===n?{value:void 0,done:t.done=!0}:t.global?(""==String(n[0])&&(e.lastIndex=v(i,o(e.lastIndex),t.unicode)),{value:n,done:!1}):(t.done=!0,{value:n,done:!1})})),D=function(t){var e,i,n,r,s,a,u=h(this),l=String(t);return e=m(u,RegExp),void 0===(i=u.flags)&&u instanceof RegExp&&!("flags"in M)&&(i=c.call(u)),n=void 0===i?"":String(i),r=new e(e===RegExp?u.source:u,n),s=!!~n.indexOf("g"),a=!!~n.indexOf("u"),r.lastIndex=o(u.lastIndex),new A(r,l,s,a)};n({target:"String",proto:!0,forced:L},{matchAll:function(t){var e,i,n,r=s(this);if(null!=t){if(l(t)&&!~String(s("flags"in M?t.flags:c.call(t))).indexOf("g"))throw TypeError("`.matchAll` does not allow non-global regexes");if(L)return E.apply(r,arguments);if(void 0===(i=t[_])&&y&&"RegExp"==u(t)&&(i=D),null!=i)return a(i).call(t,r)}else if(L)return E.apply(r,arguments);return e=String(r),n=new RegExp(t,"g"),y?D.call(n,e):n[_](e)}}),y||_ in M||d(M,_,D)},48075:(t,e,i)=>{"use strict";var n=i(57937),r=i(13980),s=i(7933),o=i(86608),a=i(64334),h=i(30584);n("match",1,(function(t,e,i){return[function(e){var i=o(this),n=null==e?void 0:e[t];return void 0!==n?n.call(e,i):new RegExp(e)[t](String(i))},function(t){var n=i(e,t,this);if(n.done)return n.value;var o=r(t),u=String(this);if(!o.global)return h(o,u);var l=o.unicode;o.lastIndex=0;for(var c,d=[],p=0;null!==(c=h(o,u));){var f=String(c[0]);d[p]=f,""===f&&(o.lastIndex=a(u,s(o.lastIndex),l)),p++}return 0===p?null:d}]}))},45539:(t,e,i)=>{"use strict";var n=i(23889),r=i(76940).end;n({target:"String",proto:!0,forced:i(60285)},{padEnd:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},97027:(t,e,i)=>{"use strict";var n=i(23889),r=i(76940).start;n({target:"String",proto:!0,forced:i(60285)},{padStart:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},40989:(t,e,i)=>{var n=i(23889),r=i(86939),s=i(7933);n({target:"String",stat:!0},{raw:function(t){for(var e=r(t.raw),i=s(e.length),n=arguments.length,o=[],a=0;i>a;)o.push(String(e[a++])),a<n&&o.push(String(arguments[a]));return o.join("")}})},12778:(t,e,i)=>{i(23889)({target:"String",proto:!0},{repeat:i(71804)})},4350:(t,e,i)=>{"use strict";var n=i(57937),r=i(13980),s=i(51223),o=i(7933),a=i(1557),h=i(86608),u=i(64334),l=i(30584),c=Math.max,d=Math.min,p=Math.floor,f=/\$([$&'`]|\d\d?|<[^>]*>)/g,m=/\$([$&'`]|\d\d?)/g;n("replace",2,(function(t,e,i,n){var v=n.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,g=n.REPLACE_KEEPS_$0,y=v?"$":"$0";return[function(i,n){var r=h(this),s=null==i?void 0:i[t];return void 0!==s?s.call(i,r,n):e.call(String(r),i,n)},function(t,n){if(!v&&g||"string"==typeof n&&-1===n.indexOf(y)){var s=i(e,t,this,n);if(s.done)return s.value}var h=r(t),p=String(this),f="function"==typeof n;f||(n=String(n));var m=h.global;if(m){var x=h.unicode;h.lastIndex=0}for(var b=[];;){var w=l(h,p);if(null===w)break;if(b.push(w),!m)break;""===String(w[0])&&(h.lastIndex=u(p,o(h.lastIndex),x))}for(var T,M="",S=0,E=0;E<b.length;E++){w=b[E];for(var L=String(w[0]),A=c(d(a(w.index),p.length),0),D=[],P=1;P<w.length;P++)D.push(void 0===(T=w[P])?T:String(T));var C=w.groups;if(f){var O=[L].concat(D,A,p);void 0!==C&&O.push(C);var k=String(n.apply(void 0,O))}else k=_(L,p,A,D,C,n);A>=S&&(M+=p.slice(S,A)+k,S=A+L.length)}return M+p.slice(S)}];function _(t,i,n,r,o,a){var h=n+t.length,u=r.length,l=m;return void 0!==o&&(o=s(o),l=f),e.call(a,l,(function(e,s){var a;switch(s.charAt(0)){case"$":return"$";case"&":return t;case"`":return i.slice(0,n);case"'":return i.slice(h);case"<":a=o[s.slice(1,-1)];break;default:var l=+s;if(0===l)return e;if(l>u){var c=p(l/10);return 0===c?e:c<=u?void 0===r[c-1]?s.charAt(1):r[c-1]+s.charAt(1):e}a=r[l-1]}return void 0===a?"":a}))}}))},12755:(t,e,i)=>{"use strict";var n=i(57937),r=i(13980),s=i(86608),o=i(12195),a=i(30584);n("search",1,(function(t,e,i){return[function(e){var i=s(this),n=null==e?void 0:e[t];return void 0!==n?n.call(e,i):new RegExp(e)[t](String(i))},function(t){var n=i(e,t,this);if(n.done)return n.value;var s=r(t),h=String(this),u=s.lastIndex;o(u,0)||(s.lastIndex=0);var l=a(s,h);return o(s.lastIndex,u)||(s.lastIndex=u),null===l?-1:l.index}]}))},95917:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("small")},{small:function(){return r(this,"small","","")}})},168:(t,e,i)=>{"use strict";var n=i(57937),r=i(39376),s=i(13980),o=i(86608),a=i(7350),h=i(64334),u=i(7933),l=i(30584),c=i(83815),d=i(38493),p=[].push,f=Math.min,m=4294967295,v=!d((function(){return!RegExp(m,"y")}));n("split",2,(function(t,e,i){var n;return n="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,i){var n=String(o(this)),s=void 0===i?m:i>>>0;if(0===s)return[];if(void 0===t)return[n];if(!r(t))return e.call(n,t,s);for(var a,h,u,l=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),f=0,v=new RegExp(t.source,d+"g");(a=c.call(v,n))&&!((h=v.lastIndex)>f&&(l.push(n.slice(f,a.index)),a.length>1&&a.index<n.length&&p.apply(l,a.slice(1)),u=a[0].length,f=h,l.length>=s));)v.lastIndex===a.index&&v.lastIndex++;return f===n.length?!u&&v.test("")||l.push(""):l.push(n.slice(f)),l.length>s?l.slice(0,s):l}:"0".split(void 0,0).length?function(t,i){return void 0===t&&0===i?[]:e.call(this,t,i)}:e,[function(e,i){var r=o(this),s=null==e?void 0:e[t];return void 0!==s?s.call(e,r,i):n.call(String(r),e,i)},function(t,r){var o=i(n,t,this,r,n!==e);if(o.done)return o.value;var c=s(t),d=String(this),p=a(c,RegExp),g=c.unicode,y=(c.ignoreCase?"i":"")+(c.multiline?"m":"")+(c.unicode?"u":"")+(v?"y":"g"),_=new p(v?c:"^(?:"+c.source+")",y),x=void 0===r?m:r>>>0;if(0===x)return[];if(0===d.length)return null===l(_,d)?[d]:[];for(var b=0,w=0,T=[];w<d.length;){_.lastIndex=v?w:0;var M,S=l(_,v?d:d.slice(w));if(null===S||(M=f(u(_.lastIndex+(v?0:w)),d.length))===b)w=h(d,w,g);else{if(T.push(d.slice(b,w)),T.length===x)return T;for(var E=1;E<=S.length-1;E++)if(T.push(S[E]),T.length===x)return T;w=b=M}}return T.push(d.slice(b)),T}]}),!v)},52325:(t,e,i)=>{"use strict";var n,r=i(23889),s=i(91211).f,o=i(7933),a=i(89109),h=i(86608),u=i(43728),l=i(51104),c="".startsWith,d=Math.min,p=u("startsWith");r({target:"String",proto:!0,forced:!!(l||p||(n=s(String.prototype,"startsWith"),!n||n.writable))&&!p},{startsWith:function(t){var e=String(h(this));a(t);var i=o(d(arguments.length>1?arguments[1]:void 0,e.length)),n=String(t);return c?c.call(e,n,i):e.slice(i,i+n.length)===n}})},672:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("strike")},{strike:function(){return r(this,"strike","","")}})},90982:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("sub")},{sub:function(){return r(this,"sub","","")}})},60365:(t,e,i)=>{"use strict";var n=i(23889),r=i(66421);n({target:"String",proto:!0,forced:i(50979)("sup")},{sup:function(){return r(this,"sup","","")}})},19133:(t,e,i)=>{"use strict";var n=i(23889),r=i(66672).end,s=i(4212)("trimEnd"),o=s?function(){return r(this)}:"".trimEnd;n({target:"String",proto:!0,forced:s},{trimEnd:o,trimRight:o})},20075:(t,e,i)=>{"use strict";var n=i(23889),r=i(66672).start,s=i(4212)("trimStart"),o=s?function(){return r(this)}:"".trimStart;n({target:"String",proto:!0,forced:s},{trimStart:o,trimLeft:o})},54503:(t,e,i)=>{"use strict";var n=i(23889),r=i(66672).trim;n({target:"String",proto:!0,forced:i(4212)("trim")},{trim:function(){return r(this)}})},499:(t,e,i)=>{i(62646)("asyncIterator")},88392:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(33386),o=i(54585),a=i(68580),h=i(64774).f,u=i(27367),l=s.Symbol;if(r&&"function"==typeof l&&(!("description"in l.prototype)||void 0!==l().description)){var c={},d=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof d?new l(t):void 0===t?l():l(t);return""===t&&(c[e]=!0),e};u(d,l);var p=d.prototype=l.prototype;p.constructor=d;var f=p.toString,m="Symbol(test)"==String(l("test")),v=/^Symbol\((.*)\)[^)]+$/;h(p,"description",{configurable:!0,get:function(){var t=a(this)?this.valueOf():this,e=f.call(t);if(o(c,t))return"";var i=m?e.slice(7,-1):e.replace(v,"$1");return""===i?void 0:i}}),n({global:!0,forced:!0},{Symbol:d})}},55977:(t,e,i)=>{i(62646)("hasInstance")},53382:(t,e,i)=>{i(62646)("isConcatSpreadable")},9246:(t,e,i)=>{i(62646)("iterator")},73906:(t,e,i)=>{"use strict";var n=i(23889),r=i(33386),s=i(27623),o=i(51104),a=i(56617),h=i(77802),u=i(73018),l=i(38493),c=i(54585),d=i(20351),p=i(68580),f=i(13980),m=i(51223),v=i(86939),g=i(33196),y=i(36846),_=i(37602),x=i(64855),b=i(74562),w=i(74720),T=i(50169),M=i(91211),S=i(64774),E=i(58399),L=i(17182),A=i(18957),D=i(31416),P=i(31059),C=i(26007),O=i(37645),k=i(10548),R=i(71317),I=i(62646),Y=i(39893),F=i(97030),N=i(7622).forEach,B=P("hidden"),U="Symbol",j=k("toPrimitive"),H=F.set,z=F.getterFor(U),W=Object.prototype,G=r.Symbol,V=s("JSON","stringify"),X=M.f,q=S.f,J=w.f,Z=E.f,K=D("symbols"),Q=D("op-symbols"),$=D("string-to-symbol-registry"),tt=D("symbol-to-string-registry"),et=D("wks"),it=r.QObject,nt=!it||!it.prototype||!it.prototype.findChild,rt=a&&l((function(){return 7!=_(q({},"a",{get:function(){return q(this,"a",{value:7}).a}})).a}))?function(t,e,i){var n=X(W,e);n&&delete W[e],q(t,e,i),n&&t!==W&&q(W,e,n)}:q,st=function(t,e){var i=K[t]=_(G.prototype);return H(i,{type:U,tag:t,description:e}),a||(i.description=e),i},ot=u?function(t){return"symbol"==typeof t}:function(t){return Object(t)instanceof G},at=function(t,e,i){t===W&&at(Q,e,i),f(t);var n=g(e,!0);return f(i),c(K,n)?(i.enumerable?(c(t,B)&&t[B][n]&&(t[B][n]=!1),i=_(i,{enumerable:y(0,!1)})):(c(t,B)||q(t,B,y(1,{})),t[B][n]=!0),rt(t,n,i)):q(t,n,i)},ht=function(t,e){f(t);var i=v(e),n=x(i).concat(dt(i));return N(n,(function(e){a&&!ut.call(i,e)||at(t,e,i[e])})),t},ut=function(t){var e=g(t,!0),i=Z.call(this,e);return!(this===W&&c(K,e)&&!c(Q,e))&&(!(i||!c(this,e)||!c(K,e)||c(this,B)&&this[B][e])||i)},lt=function(t,e){var i=v(t),n=g(e,!0);if(i!==W||!c(K,n)||c(Q,n)){var r=X(i,n);return!r||!c(K,n)||c(i,B)&&i[B][n]||(r.enumerable=!0),r}},ct=function(t){var e=J(v(t)),i=[];return N(e,(function(t){c(K,t)||c(C,t)||i.push(t)})),i},dt=function(t){var e=t===W,i=J(e?Q:v(t)),n=[];return N(i,(function(t){!c(K,t)||e&&!c(W,t)||n.push(K[t])})),n};(h||(A((G=function(){if(this instanceof G)throw TypeError("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=O(t),i=function(t){this===W&&i.call(Q,t),c(this,B)&&c(this[B],e)&&(this[B][e]=!1),rt(this,e,y(1,t))};return a&&nt&&rt(W,e,{configurable:!0,set:i}),st(e,t)}).prototype,"toString",(function(){return z(this).tag})),A(G,"withoutSetter",(function(t){return st(O(t),t)})),E.f=ut,S.f=at,M.f=lt,b.f=w.f=ct,T.f=dt,R.f=function(t){return st(k(t),t)},a&&(q(G.prototype,"description",{configurable:!0,get:function(){return z(this).description}}),o||A(W,"propertyIsEnumerable",ut,{unsafe:!0}))),n({global:!0,wrap:!0,forced:!h,sham:!h},{Symbol:G}),N(x(et),(function(t){I(t)})),n({target:U,stat:!0,forced:!h},{for:function(t){var e=String(t);if(c($,e))return $[e];var i=G(e);return $[e]=i,tt[i]=e,i},keyFor:function(t){if(!ot(t))throw TypeError(t+" is not a symbol");if(c(tt,t))return tt[t]},useSetter:function(){nt=!0},useSimple:function(){nt=!1}}),n({target:"Object",stat:!0,forced:!h,sham:!a},{create:function(t,e){return void 0===e?_(t):ht(_(t),e)},defineProperty:at,defineProperties:ht,getOwnPropertyDescriptor:lt}),n({target:"Object",stat:!0,forced:!h},{getOwnPropertyNames:ct,getOwnPropertySymbols:dt}),n({target:"Object",stat:!0,forced:l((function(){T.f(1)}))},{getOwnPropertySymbols:function(t){return T.f(m(t))}}),V)&&n({target:"JSON",stat:!0,forced:!h||l((function(){var t=G();return"[null]"!=V([t])||"{}"!=V({a:t})||"{}"!=V(Object(t))}))},{stringify:function(t,e,i){for(var n,r=[t],s=1;arguments.length>s;)r.push(arguments[s++]);if(n=e,(p(e)||void 0!==t)&&!ot(t))return d(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!ot(e))return e}),r[1]=e,V.apply(null,r)}});G.prototype[j]||L(G.prototype,j,G.prototype.valueOf),Y(G,U),C[B]=!0},82110:(t,e,i)=>{i(62646)("matchAll")},15693:(t,e,i)=>{i(62646)("match")},80780:(t,e,i)=>{i(62646)("replace")},75370:(t,e,i)=>{i(62646)("search")},99019:(t,e,i)=>{i(62646)("species")},65991:(t,e,i)=>{i(62646)("split")},65040:(t,e,i)=>{i(62646)("toPrimitive")},82011:(t,e,i)=>{i(62646)("toStringTag")},70661:(t,e,i)=>{i(62646)("unscopables")},67619:(t,e,i)=>{"use strict";var n=i(81609),r=i(69801),s=n.aTypedArray;(0,n.exportTypedArrayMethod)("copyWithin",(function(t,e){return r.call(s(this),t,e,arguments.length>2?arguments[2]:void 0)}))},969:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).every,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("every",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},1558:(t,e,i)=>{"use strict";var n=i(81609),r=i(53009),s=n.aTypedArray;(0,n.exportTypedArrayMethod)("fill",(function(t){return r.apply(s(this),arguments)}))},38954:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).filter,s=i(7350),o=n.aTypedArray,a=n.aTypedArrayConstructor;(0,n.exportTypedArrayMethod)("filter",(function(t){for(var e=r(o(this),t,arguments.length>1?arguments[1]:void 0),i=s(this,this.constructor),n=0,h=e.length,u=new(a(i))(h);h>n;)u[n]=e[n++];return u}))},6551:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).findIndex,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("findIndex",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},61264:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).find,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("find",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},68377:(t,e,i)=>{i(19497)("Float32",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},21972:(t,e,i)=>{i(19497)("Float64",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},87189:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).forEach,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("forEach",(function(t){r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},79544:(t,e,i)=>{"use strict";var n=i(95329);(0,i(81609).exportTypedArrayStaticMethod)("from",i(55066),n)},28581:(t,e,i)=>{"use strict";var n=i(81609),r=i(93289).includes,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("includes",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},77923:(t,e,i)=>{"use strict";var n=i(81609),r=i(93289).indexOf,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("indexOf",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},12223:(t,e,i)=>{i(19497)("Int16",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},24878:(t,e,i)=>{i(19497)("Int32",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},58976:(t,e,i)=>{i(19497)("Int8",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},44016:(t,e,i)=>{"use strict";var n=i(33386),r=i(81609),s=i(41499),o=i(10548)("iterator"),a=n.Uint8Array,h=s.values,u=s.keys,l=s.entries,c=r.aTypedArray,d=r.exportTypedArrayMethod,p=a&&a.prototype[o],f=!!p&&("values"==p.name||null==p.name),m=function(){return h.call(c(this))};d("entries",(function(){return l.call(c(this))})),d("keys",(function(){return u.call(c(this))})),d("values",m,!f),d(o,m,!f)},92626:(t,e,i)=>{"use strict";var n=i(81609),r=n.aTypedArray,s=n.exportTypedArrayMethod,o=[].join;s("join",(function(t){return o.apply(r(this),arguments)}))},26737:(t,e,i)=>{"use strict";var n=i(81609),r=i(8287),s=n.aTypedArray;(0,n.exportTypedArrayMethod)("lastIndexOf",(function(t){return r.apply(s(this),arguments)}))},82361:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).map,s=i(7350),o=n.aTypedArray,a=n.aTypedArrayConstructor;(0,n.exportTypedArrayMethod)("map",(function(t){return r(o(this),t,arguments.length>1?arguments[1]:void 0,(function(t,e){return new(a(s(t,t.constructor)))(e)}))}))},28006:(t,e,i)=>{"use strict";var n=i(81609),r=i(95329),s=n.aTypedArrayConstructor;(0,n.exportTypedArrayStaticMethod)("of",(function(){for(var t=0,e=arguments.length,i=new(s(this))(e);e>t;)i[t]=arguments[t++];return i}),r)},51699:(t,e,i)=>{"use strict";var n=i(81609),r=i(22164).right,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduceRight",(function(t){return r(s(this),t,arguments.length,arguments.length>1?arguments[1]:void 0)}))},77673:(t,e,i)=>{"use strict";var n=i(81609),r=i(22164).left,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduce",(function(t){return r(s(this),t,arguments.length,arguments.length>1?arguments[1]:void 0)}))},77257:(t,e,i)=>{"use strict";var n=i(81609),r=n.aTypedArray,s=n.exportTypedArrayMethod,o=Math.floor;s("reverse",(function(){for(var t,e=this,i=r(e).length,n=o(i/2),s=0;s<n;)t=e[s],e[s++]=e[--i],e[i]=t;return e}))},6171:(t,e,i)=>{"use strict";var n=i(81609),r=i(7933),s=i(25803),o=i(51223),a=i(38493),h=n.aTypedArray;(0,n.exportTypedArrayMethod)("set",(function(t){h(this);var e=s(arguments.length>1?arguments[1]:void 0,1),i=this.length,n=o(t),a=r(n.length),u=0;if(a+e>i)throw RangeError("Wrong length");for(;u<a;)this[e+u]=n[u++]}),a((function(){new Int8Array(1).set({})})))},68816:(t,e,i)=>{"use strict";var n=i(81609),r=i(7350),s=i(38493),o=n.aTypedArray,a=n.aTypedArrayConstructor,h=n.exportTypedArrayMethod,u=[].slice;h("slice",(function(t,e){for(var i=u.call(o(this),t,e),n=r(this,this.constructor),s=0,h=i.length,l=new(a(n))(h);h>s;)l[s]=i[s++];return l}),s((function(){new Int8Array(1).slice()})))},4661:(t,e,i)=>{"use strict";var n=i(81609),r=i(7622).some,s=n.aTypedArray;(0,n.exportTypedArrayMethod)("some",(function(t){return r(s(this),t,arguments.length>1?arguments[1]:void 0)}))},92811:(t,e,i)=>{"use strict";var n=i(81609),r=n.aTypedArray,s=n.exportTypedArrayMethod,o=[].sort;s("sort",(function(t){return o.call(r(this),t)}))},69535:(t,e,i)=>{"use strict";var n=i(81609),r=i(7933),s=i(11486),o=i(7350),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("subarray",(function(t,e){var i=a(this),n=i.length,h=s(t,n);return new(o(i,i.constructor))(i.buffer,i.byteOffset+h*i.BYTES_PER_ELEMENT,r((void 0===e?n:s(e,n))-h))}))},5912:(t,e,i)=>{"use strict";var n=i(33386),r=i(81609),s=i(38493),o=n.Int8Array,a=r.aTypedArray,h=r.exportTypedArrayMethod,u=[].toLocaleString,l=[].slice,c=!!o&&s((function(){u.call(new o(1))}));h("toLocaleString",(function(){return u.apply(c?l.call(a(this)):a(this),arguments)}),s((function(){return[1,2].toLocaleString()!=new o([1,2]).toLocaleString()}))||!s((function(){o.prototype.toLocaleString.call([1,2])})))},2470:(t,e,i)=>{"use strict";var n=i(81609).exportTypedArrayMethod,r=i(38493),s=i(33386).Uint8Array,o=s&&s.prototype||{},a=[].toString,h=[].join;r((function(){a.call({})}))&&(a=function(){return h.call(this)});var u=o.toString!=a;n("toString",a,u)},80714:(t,e,i)=>{i(19497)("Uint16",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},3140:(t,e,i)=>{i(19497)("Uint32",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},21785:(t,e,i)=>{i(19497)("Uint8",(function(t){return function(e,i,n){return t(this,e,i,n)}}))},87731:(t,e,i)=>{i(19497)("Uint8",(function(t){return function(e,i,n){return t(this,e,i,n)}}),!0)},35075:(t,e,i)=>{"use strict";var n,r=i(33386),s=i(11432),o=i(8080),a=i(93574),h=i(8929),u=i(68580),l=i(97030).enforce,c=i(85721),d=!r.ActiveXObject&&"ActiveXObject"in r,p=Object.isExtensible,f=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},m=t.exports=a("WeakMap",f,h);if(c&&d){n=h.getConstructor(f,"WeakMap",!0),o.REQUIRED=!0;var v=m.prototype,g=v.delete,y=v.has,_=v.get,x=v.set;s(v,{delete:function(t){if(u(t)&&!p(t)){var e=l(this);return e.frozen||(e.frozen=new n),g.call(this,t)||e.frozen.delete(t)}return g.call(this,t)},has:function(t){if(u(t)&&!p(t)){var e=l(this);return e.frozen||(e.frozen=new n),y.call(this,t)||e.frozen.has(t)}return y.call(this,t)},get:function(t){if(u(t)&&!p(t)){var e=l(this);return e.frozen||(e.frozen=new n),y.call(this,t)?_.call(this,t):e.frozen.get(t)}return _.call(this,t)},set:function(t,e){if(u(t)&&!p(t)){var i=l(this);i.frozen||(i.frozen=new n),y.call(this,t)?x.call(this,t,e):i.frozen.set(t,e)}else x.call(this,t,e);return this}})}},98510:(t,e,i)=>{"use strict";i(93574)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(8929))},45633:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(29528),o=i(15456),a=i(37602),h=i(64774),u=i(36846),l=i(76808),c=i(17182),d=i(97030),p=d.set,f=d.getterFor("AggregateError"),m=function(t,e){var i=this;if(!(i instanceof m))return new m(t,e);o&&(i=o(new Error(e),s(i)));var n=[];return l(t,n.push,n),r?p(i,{errors:n,type:"AggregateError"}):i.errors=n,void 0!==e&&c(i,"message",String(e)),i};m.prototype=a(Error.prototype,{constructor:u(5,m),message:u(5,""),name:u(5,"AggregateError")}),r&&h.f(m.prototype,"errors",{get:function(){return f(this).errors},configurable:!0}),n({global:!0},{AggregateError:m})},65071:(t,e,i)=>{var n=i(23889),r=i(20351),s=Object.isFrozen,o=function(t,e){if(!s||!r(t)||!s(t))return!1;for(var i,n=0,o=t.length;n<o;)if(!("string"==typeof(i=t[n++])||e&&void 0===i))return!1;return 0!==o};n({target:"Array",stat:!0},{isTemplateObject:function(t){if(!o(t,!0))return!1;var e=t.raw;return!(e.length!==t.length||!o(e,!1))}})},78843:(t,e,i)=>{"use strict";var n=i(56617),r=i(35240),s=i(51223),o=i(7933),a=i(64774).f;n&&!("lastIndex"in[])&&(a(Array.prototype,"lastIndex",{configurable:!0,get:function(){var t=s(this),e=o(t.length);return 0==e?0:e-1}}),r("lastIndex"))},62274:(t,e,i)=>{"use strict";var n=i(56617),r=i(35240),s=i(51223),o=i(7933),a=i(64774).f;n&&!("lastItem"in[])&&(a(Array.prototype,"lastItem",{configurable:!0,get:function(){var t=s(this),e=o(t.length);return 0==e?void 0:t[e-1]},set:function(t){var e=s(this),i=o(e.length);return e[0==i?0:i-1]=t}}),r("lastItem"))},10717:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(25542)((function(t,e){var i=this,n=i.iterator;return e.resolve(r(i.next.call(n,t))).then((function(t){return r(t).done?(i.done=!0,{done:!0,value:void 0}):{done:!1,value:[i.index++,t.value]}}))}));n({target:"AsyncIterator",proto:!0,real:!0},{asIndexedPairs:function(){return new s({iterator:r(this),index:0})}})},48614:(t,e,i)=>{"use strict";var n=i(23889),r=i(31057),s=i(17182),o=i(54585),a=i(10548),h=i(45535),u=i(51104),l=a("toStringTag"),c=function(){r(this,c)};c.prototype=h,o(h,l)||s(h,l,"AsyncIterator"),o(h,"constructor")&&h.constructor!==Object||s(h,"constructor",c),n({global:!0,forced:u},{AsyncIterator:c})},6847:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(17138),o=i(25542)((function(t,e){var i=this;return new e((function(n,s){var o=function(){try{e.resolve(r(i.next.call(i.iterator,i.remaining?void 0:t))).then((function(t){try{r(t).done?(i.done=!0,n({done:!0,value:void 0})):i.remaining?(i.remaining--,o()):n({done:!1,value:t.value})}catch(t){s(t)}}),s)}catch(t){s(t)}};o()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{drop:function(t){return new o({iterator:r(this),remaining:s(t)})}})},16348:(t,e,i)=>{"use strict";var n=i(23889),r=i(87505).every;n({target:"AsyncIterator",proto:!0,real:!0},{every:function(t){return r(this,t)}})},349:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(25542)((function(t,e){var i=this,n=i.filterer;return new e((function(r,o){var a=function(){try{e.resolve(s(i.next.call(i.iterator,t))).then((function(t){try{if(s(t).done)i.done=!0,r({done:!0,value:void 0});else{var h=t.value;e.resolve(n(h)).then((function(t){t?r({done:!1,value:h}):a()}),o)}}catch(t){o(t)}}),o)}catch(t){o(t)}};a()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{filter:function(t){return new o({iterator:s(this),filterer:r(t)})}})},96653:(t,e,i)=>{"use strict";var n=i(23889),r=i(87505).find;n({target:"AsyncIterator",proto:!0,real:!0},{find:function(t){return r(this,t)}})},27646:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(25542),a=i(6178),h=o((function(t,e){var i,n,o=this,h=o.mapper;return new e((function(u,l){var c=function(){try{e.resolve(s(o.next.call(o.iterator,t))).then((function(t){try{s(t).done?(o.done=!0,u({done:!0,value:void 0})):e.resolve(h(t.value)).then((function(t){try{if(void 0!==(n=a(t)))return o.innerIterator=i=s(n.call(t)),o.innerNext=r(i.next),d();l(TypeError(".flatMap callback should return an iterable object"))}catch(t){l(t)}}),l)}catch(t){l(t)}}),l)}catch(t){l(t)}},d=function(){if(i=o.innerIterator)try{e.resolve(s(o.innerNext.call(i))).then((function(t){try{s(t).done?(o.innerIterator=o.innerNext=null,c()):u({done:!1,value:t.value})}catch(t){l(t)}}),l)}catch(t){l(t)}else c()};d()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{flatMap:function(t){return new h({iterator:s(this),mapper:r(t),innerIterator:null,innerNext:null})}})},56978:(t,e,i)=>{"use strict";var n=i(23889),r=i(87505).forEach;n({target:"AsyncIterator",proto:!0,real:!0},{forEach:function(t){return r(this,t)}})},1996:(t,e,i)=>{var n=i(23889),r=i(29467),s=i(23775),o=i(13980),a=i(51223),h=i(25542),u=i(6178),l=r.AsyncIterator,c=h((function(t){return o(this.next.call(this.iterator,t))}),!0);n({target:"AsyncIterator",stat:!0},{from:function(t){var e,i=a(t),n=u(i);if(null!=n){if((e=s(n).call(i))instanceof l)return e}else e=i;return new c({iterator:e})}})},517:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(25542)((function(t,e){var i=this,n=i.mapper;return e.resolve(s(i.next.call(i.iterator,t))).then((function(t){return s(t).done?(i.done=!0,{done:!0,value:void 0}):e.resolve(n(t.value)).then((function(t){return{done:!1,value:t}}))}))}));n({target:"AsyncIterator",proto:!0,real:!0},{map:function(t){return new o({iterator:s(this),mapper:r(t)})}})},51811:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(27623)("Promise");n({target:"AsyncIterator",proto:!0,real:!0},{reduce:function(t){var e=s(this),i=r(e.next),n=arguments.length<2,a=n?void 0:arguments[1];return r(t),new o((function(r,h){var u=function(){try{o.resolve(s(i.call(e))).then((function(e){try{if(s(e).done)n?h(TypeError("Reduce of empty iterator with no initial value")):r(a);else{var i=e.value;n?(n=!1,a=i,u()):o.resolve(t(a,i)).then((function(t){a=t,u()}),h)}}catch(t){h(t)}}),h)}catch(t){h(t)}};u()}))}})},30580:(t,e,i)=>{"use strict";var n=i(23889),r=i(87505).some;n({target:"AsyncIterator",proto:!0,real:!0},{some:function(t){return r(this,t)}})},6839:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(17138),o=i(25542)((function(t){return this.remaining--?this.next.call(this.iterator,t):(this.done=!0,{done:!0,value:void 0})}));n({target:"AsyncIterator",proto:!0,real:!0},{take:function(t){return new o({iterator:r(this),remaining:s(t)})}})},24837:(t,e,i)=>{"use strict";var n=i(23889),r=i(87505).toArray;n({target:"AsyncIterator",proto:!0,real:!0},{toArray:function(){return r(this)}})},95327:(t,e,i)=>{var n=i(23889),r=i(19388),s=i(27623),o=i(37602),a=function(){var t=s("Object","freeze");return t?t(o(null)):o(null)};n({global:!0},{compositeKey:function(){return r.apply(Object,arguments).get("object",a)}})},22401:(t,e,i)=>{var n=i(23889),r=i(19388),s=i(27623);n({global:!0},{compositeSymbol:function(){return 1===arguments.length&&"string"==typeof arguments[0]?s("Symbol").for(arguments[0]):r.apply(null,arguments).get("symbol",s("Symbol"))}})},63101:(t,e,i)=>{i(2506)},85750:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(79596)((function(t){var e=r(this.next.call(this.iterator,t));if(!(this.done=!!e.done))return[this.index++,e.value]}));n({target:"Iterator",proto:!0,real:!0},{asIndexedPairs:function(){return new s({iterator:r(this),index:0})}})},7902:(t,e,i)=>{"use strict";var n=i(23889),r=i(33386),s=i(31057),o=i(17182),a=i(38493),h=i(54585),u=i(10548),l=i(91706).IteratorPrototype,c=i(51104),d=u("iterator"),p=u("toStringTag"),f=r.Iterator,m=c||"function"!=typeof f||f.prototype!==l||!a((function(){f({})})),v=function(){s(this,v)};c&&o(l={},d,(function(){return this})),h(l,p)||o(l,p,"Iterator"),!m&&h(l,"constructor")&&l.constructor!==Object||o(l,"constructor",v),v.prototype=l,n({global:!0,forced:m},{Iterator:v})},53866:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(17138),o=i(79596)((function(t){for(var e,i=this.iterator,n=this.next;this.remaining;)if(this.remaining--,e=r(n.call(i)),this.done=!!e.done)return;if(e=r(n.call(i,t)),!(this.done=!!e.done))return e.value}));n({target:"Iterator",proto:!0,real:!0},{drop:function(t){return new o({iterator:r(this),remaining:s(t)})}})},81192:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775),o=i(13980);n({target:"Iterator",proto:!0,real:!0},{every:function(t){return o(this),s(t),!r(this,(function(e){if(!t(e))return r.stop()}),void 0,!1,!0).stopped}})},13193:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(79596),a=i(31404),h=o((function(t){for(var e,i,n=this.iterator,r=this.filterer,o=this.next;;){if(e=s(o.call(n,t)),this.done=!!e.done)return;if(i=e.value,a(n,r,i))return i}}));n({target:"Iterator",proto:!0,real:!0},{filter:function(t){return new h({iterator:s(this),filterer:r(t)})}})},12122:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775),o=i(13980);n({target:"Iterator",proto:!0,real:!0},{find:function(t){return o(this),s(t),r(this,(function(e){if(t(e))return r.stop(e)}),void 0,!1,!0).result}})},4780:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(99683),a=i(79596),h=i(31404),u=a((function(t){for(var e,i,n,a,u=this.iterator;;){if(a=this.innerIterator){if(!(e=s(this.innerNext.call(a))).done)return e.value;this.innerIterator=this.innerNext=null}if(e=s(this.next.call(u,t)),this.done=!!e.done)return;if(i=h(u,this.mapper,e.value),void 0===(n=o(i)))throw TypeError(".flatMap callback should return an iterable object");this.innerIterator=a=s(n.call(i)),this.innerNext=r(a.next)}}));n({target:"Iterator",proto:!0,real:!0},{flatMap:function(t){return new u({iterator:s(this),mapper:r(t),innerIterator:null,innerNext:null})}})},78496:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(13980);n({target:"Iterator",proto:!0,real:!0},{forEach:function(t){r(s(this),t,void 0,!1,!0)}})},25420:(t,e,i)=>{var n=i(23889),r=i(29467),s=i(23775),o=i(13980),a=i(51223),h=i(79596),u=i(99683),l=r.Iterator,c=h((function(t){var e=o(this.next.call(this.iterator,t));if(!(this.done=!!e.done))return e.value}),!0);n({target:"Iterator",stat:!0},{from:function(t){var e,i=a(t),n=u(i);if(null!=n){if((e=s(n).call(i))instanceof l)return e}else e=i;return new c({iterator:e})}})},23451:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(13980),o=i(79596),a=i(31404),h=o((function(t){var e=this.iterator,i=s(this.next.call(e,t));if(!(this.done=!!i.done))return a(e,this.mapper,i.value)}));n({target:"Iterator",proto:!0,real:!0},{map:function(t){return new h({iterator:s(this),mapper:r(t)})}})},90430:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775),o=i(13980);n({target:"Iterator",proto:!0,real:!0},{reduce:function(t){o(this),s(t);var e=arguments.length<2,i=e?void 0:arguments[1];if(r(this,(function(n){e?(e=!1,i=n):i=t(i,n)}),void 0,!1,!0),e)throw TypeError("Reduce of empty iterator with no initial value");return i}})},7857:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775),o=i(13980);n({target:"Iterator",proto:!0,real:!0},{some:function(t){return o(this),s(t),r(this,(function(e){if(t(e))return r.stop()}),void 0,!1,!0).stopped}})},67942:(t,e,i)=>{"use strict";var n=i(23889),r=i(13980),s=i(17138),o=i(79596)((function(t){if(this.remaining--){var e=r(this.next.call(this.iterator,t));return(this.done=!!e.done)?void 0:e.value}this.done=!0}));n({target:"Iterator",proto:!0,real:!0},{take:function(t){return new o({iterator:r(this),remaining:s(t)})}})},65499:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(13980),o=[].push;n({target:"Iterator",proto:!0,real:!0},{toArray:function(){var t=[];return r(s(this),o,t,!1,!0),t}})},86779:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(84537);n({target:"Map",proto:!0,real:!0,forced:r},{deleteAll:function(){return s.apply(this,arguments)}})},20240:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(81709),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{every:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return!h(i,(function(t,i){if(!n(i,t,e))return h.stop()}),void 0,!0,!0).stopped}})},15201:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(39181),u=i(7350),l=i(81709),c=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{filter:function(t){var e=o(this),i=l(e),n=h(t,arguments.length>1?arguments[1]:void 0,3),r=new(u(e,s("Map"))),d=a(r.set);return c(i,(function(t,i){n(i,t,e)&&d.call(r,t,i)}),void 0,!0,!0),r}})},20981:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(81709),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{findKey:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return h(i,(function(t,i){if(n(i,t,e))return h.stop(t)}),void 0,!0,!0).result}})},20880:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(81709),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{find:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return h(i,(function(t,i){if(n(i,t,e))return h.stop(i)}),void 0,!0,!0).result}})},98871:(t,e,i)=>{i(23889)({target:"Map",stat:!0},{from:i(63842)})},69795:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775);n({target:"Map",stat:!0},{groupBy:function(t,e){var i=new this;s(e);var n=s(i.has),o=s(i.get),a=s(i.set);return r(t,(function(t){var r=e(t);n.call(i,r)?o.call(i,r).push(t):a.call(i,r,[t])})),i}})},40137:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(81709),a=i(68790),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{includes:function(t){return h(o(s(this)),(function(e,i){if(a(i,t))return h.stop()}),void 0,!0,!0).stopped}})},53976:(t,e,i)=>{"use strict";var n=i(23889),r=i(76808),s=i(23775);n({target:"Map",stat:!0},{keyBy:function(t,e){var i=new this;s(e);var n=s(i.set);return r(t,(function(t){n.call(i,e(t),t)})),i}})},15240:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(81709),a=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{keyOf:function(t){return a(o(s(this)),(function(e,i){if(i===t)return a.stop(e)}),void 0,!0,!0).result}})},79286:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(39181),u=i(7350),l=i(81709),c=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{mapKeys:function(t){var e=o(this),i=l(e),n=h(t,arguments.length>1?arguments[1]:void 0,3),r=new(u(e,s("Map"))),d=a(r.set);return c(i,(function(t,i){d.call(r,n(i,t,e),i)}),void 0,!0,!0),r}})},23574:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(39181),u=i(7350),l=i(81709),c=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{mapValues:function(t){var e=o(this),i=l(e),n=h(t,arguments.length>1?arguments[1]:void 0,3),r=new(u(e,s("Map"))),d=a(r.set);return c(i,(function(t,i){d.call(r,t,n(i,t,e))}),void 0,!0,!0),r}})},32931:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775),a=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{merge:function(t){for(var e=s(this),i=o(e.set),n=0;n<arguments.length;)a(arguments[n++],i,e,!0);return e}})},98983:(t,e,i)=>{i(23889)({target:"Map",stat:!0},{of:i(96089)})},11924:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775),a=i(81709),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{reduce:function(t){var e=s(this),i=a(e),n=arguments.length<2,r=n?void 0:arguments[1];if(o(t),h(i,(function(i,s){n?(n=!1,r=s):r=t(r,s,i,e)}),void 0,!0,!0),n)throw TypeError("Reduce of empty map with no initial value");return r}})},10435:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(81709),h=i(76808);n({target:"Map",proto:!0,real:!0,forced:r},{some:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return h(i,(function(t,i){if(n(i,t,e))return h.stop()}),void 0,!0,!0).stopped}})},62469:(t,e,i)=>{"use strict";i(23889)({target:"Map",proto:!0,real:!0,forced:i(51104)},{updateOrInsert:i(35913)})},39316:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775);n({target:"Map",proto:!0,real:!0,forced:r},{update:function(t,e){var i=s(this),n=arguments.length;o(e);var r=i.has(t);if(!r&&n<3)throw TypeError("Updating absent value");var a=r?i.get(t):o(n>2?arguments[2]:void 0)(t,i);return i.set(t,e(a,t,i)),i}})},83830:(t,e,i)=>{"use strict";i(23889)({target:"Map",proto:!0,real:!0,forced:i(51104)},{upsert:i(35913)})},50946:(t,e,i)=>{var n=i(23889),r=Math.min,s=Math.max;n({target:"Math",stat:!0},{clamp:function(t,e,i){return r(i,s(e,t))}})},89119:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{DEG_PER_RAD:Math.PI/180})},91996:(t,e,i)=>{var n=i(23889),r=180/Math.PI;n({target:"Math",stat:!0},{degrees:function(t){return t*r}})},65916:(t,e,i)=>{var n=i(23889),r=i(94602),s=i(89492);n({target:"Math",stat:!0},{fscale:function(t,e,i,n,o){return s(r(t,e,i,n,o))}})},10464:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{iaddh:function(t,e,i,n){var r=t>>>0,s=i>>>0;return(e>>>0)+(n>>>0)+((r&s|(r|s)&~(r+s>>>0))>>>31)|0}})},63562:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{imulh:function(t,e){var i=65535,n=+t,r=+e,s=n&i,o=r&i,a=n>>16,h=r>>16,u=(a*o>>>0)+(s*o>>>16);return a*h+(u>>16)+((s*h>>>0)+(u&i)>>16)}})},15434:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{isubh:function(t,e,i,n){var r=t>>>0,s=i>>>0;return(e>>>0)-(n>>>0)-((~r&s|~(r^s)&r-s>>>0)>>>31)|0}})},98013:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{RAD_PER_DEG:180/Math.PI})},3172:(t,e,i)=>{var n=i(23889),r=Math.PI/180;n({target:"Math",stat:!0},{radians:function(t){return t*r}})},63566:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{scale:i(94602)})},41876:(t,e,i)=>{var n=i(23889),r=i(13980),s=i(48682),o=i(2395),a=i(97030),h="Seeded Random",u="Seeded Random Generator",l=a.set,c=a.getterFor(u),d=o((function(t){l(this,{type:u,seed:t%2147483647})}),h,(function(){var t=c(this);return{value:(1073741823&(t.seed=(1103515245*t.seed+12345)%2147483647))/1073741823,done:!1}}));n({target:"Math",stat:!0,forced:!0},{seededPRNG:function(t){var e=r(t).seed;if(!s(e))throw TypeError('Math.seededPRNG() argument should have a "seed" field with a finite value.');return new d(e)}})},37726:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{signbit:function(t){return(t=+t)==t&&0==t?1/t==-1/0:t<0}})},36823:(t,e,i)=>{i(23889)({target:"Math",stat:!0},{umulh:function(t,e){var i=65535,n=+t,r=+e,s=n&i,o=r&i,a=n>>>16,h=r>>>16,u=(a*o>>>0)+(s*o>>>16);return a*h+(u>>>16)+((s*h>>>0)+(u&i)>>>16)}})},79708:(t,e,i)=>{"use strict";var n=i(23889),r=i(1557),s=i(62229),o="Invalid number representation",a=/^[\da-z]+$/;n({target:"Number",stat:!0},{fromString:function(t,e){var i,n,h=1;if("string"!=typeof t)throw TypeError(o);if(!t.length)throw SyntaxError(o);if("-"==t.charAt(0)&&(h=-1,!(t=t.slice(1)).length))throw SyntaxError(o);if((i=void 0===e?10:r(e))<2||i>36)throw RangeError("Invalid radix");if(!a.test(t)||(n=s(t,i)).toString(i)!==t)throw SyntaxError(o);return h*n}})},6884:(t,e,i)=>{"use strict";var n=i(23889),r=i(30863);n({target:"Object",stat:!0},{iterateEntries:function(t){return new r(t,"entries")}})},39682:(t,e,i)=>{"use strict";var n=i(23889),r=i(30863);n({target:"Object",stat:!0},{iterateKeys:function(t){return new r(t,"keys")}})},8069:(t,e,i)=>{"use strict";var n=i(23889),r=i(30863);n({target:"Object",stat:!0},{iterateValues:function(t){return new r(t,"values")}})},30138:(t,e,i)=>{"use strict";var n=i(23889),r=i(56617),s=i(16906),o=i(23775),a=i(13980),h=i(68580),u=i(31057),l=i(64774).f,c=i(17182),d=i(11432),p=i(62389),f=i(76808),m=i(98684),v=i(10548),g=i(97030),y=v("observable"),_=g.get,x=g.set,b=function(t){return null==t?void 0:o(t)},w=function(t){var e=t.cleanup;if(e){t.cleanup=void 0;try{e()}catch(t){m(t)}}},T=function(t){return void 0===t.observer},M=function(t,e){if(!r){t.closed=!0;var i=e.subscriptionObserver;i&&(i.closed=!0)}e.observer=void 0},S=function(t,e){var i,n=x(this,{cleanup:void 0,observer:a(t),subscriptionObserver:void 0});r||(this.closed=!1);try{(i=b(t.start))&&i.call(t,this)}catch(t){m(t)}if(!T(n)){var s=n.subscriptionObserver=new E(this);try{var h=e(s),u=h;null!=h&&(n.cleanup="function"==typeof h.unsubscribe?function(){u.unsubscribe()}:o(h))}catch(t){return void s.error(t)}T(n)&&w(n)}};S.prototype=d({},{unsubscribe:function(){var t=_(this);T(t)||(M(this,t),w(t))}}),r&&l(S.prototype,"closed",{configurable:!0,get:function(){return T(_(this))}});var E=function(t){x(this,{subscription:t}),r||(this.closed=!1)};E.prototype=d({},{next:function(t){var e=_(_(this).subscription);if(!T(e)){var i=e.observer;try{var n=b(i.next);n&&n.call(i,t)}catch(t){m(t)}}},error:function(t){var e=_(this).subscription,i=_(e);if(!T(i)){var n=i.observer;M(e,i);try{var r=b(n.error);r?r.call(n,t):m(t)}catch(t){m(t)}w(i)}},complete:function(){var t=_(this).subscription,e=_(t);if(!T(e)){var i=e.observer;M(t,e);try{var n=b(i.complete);n&&n.call(i)}catch(t){m(t)}w(e)}}}),r&&l(E.prototype,"closed",{configurable:!0,get:function(){return T(_(_(this).subscription))}});var L=function(t){u(this,L,"Observable"),x(this,{subscriber:o(t)})};d(L.prototype,{subscribe:function(t){var e=arguments.length;return new S("function"==typeof t?{next:t,error:e>1?arguments[1]:void 0,complete:e>2?arguments[2]:void 0}:h(t)?t:{},_(this).subscriber)}}),d(L,{from:function(t){var e="function"==typeof this?this:L,i=b(a(t)[y]);if(i){var n=a(i.call(t));return n.constructor===e?n:new e((function(t){return n.subscribe(t)}))}var r=p(t);return new e((function(t){f(r,(function(e){if(t.next(e),t.closed)return f.stop()}),void 0,!1,!0),t.complete()}))},of:function(){for(var t="function"==typeof this?this:L,e=arguments.length,i=new Array(e),n=0;n<e;)i[n]=arguments[n++];return new t((function(t){for(var n=0;n<e;n++)if(t.next(i[n]),t.closed)return;t.complete()}))}}),c(L.prototype,y,(function(){return this})),n({global:!0},{Observable:L}),s("Observable")},3254:(t,e,i)=>{i(8378)},87589:(t,e,i)=>{"use strict";var n=i(23889),r=i(23775),s=i(27623),o=i(8168),a=i(70595),h=i(76808),u="No one promise resolved";n({target:"Promise",stat:!0},{any:function(t){var e=this,i=o.f(e),n=i.resolve,l=i.reject,c=a((function(){var i=r(e.resolve),o=[],a=0,c=1,d=!1;h(t,(function(t){var r=a++,h=!1;o.push(void 0),c++,i.call(e,t).then((function(t){h||d||(d=!0,n(t))}),(function(t){h||d||(h=!0,o[r]=t,--c||l(new(s("AggregateError"))(o,u)))}))})),--c||l(new(s("AggregateError"))(o,u))}));return c.error&&l(c.value),i.promise}})},77304:(t,e,i)=>{"use strict";var n=i(23889),r=i(8168),s=i(70595);n({target:"Promise",stat:!0},{try:function(t){var e=r.f(this),i=s(t);return(i.error?e.reject:e.resolve)(i.value),e.promise}})},38536:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.toKey,a=r.set;n({target:"Reflect",stat:!0},{defineMetadata:function(t,e,i){var n=arguments.length<4?void 0:o(arguments[3]);a(t,e,s(i),n)}})},83452:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.toKey,a=r.getMap,h=r.store;n({target:"Reflect",stat:!0},{deleteMetadata:function(t,e){var i=arguments.length<3?void 0:o(arguments[2]),n=a(s(e),i,!1);if(void 0===n||!n.delete(t))return!1;if(n.size)return!0;var r=h.get(e);return r.delete(i),!!r.size||h.delete(e)}})},66881:(t,e,i)=>{var n=i(23889),r=i(31417),s=i(38758),o=i(13980),a=i(29528),h=i(76808),u=s.keys,l=s.toKey,c=function(t,e){var i=u(t,e),n=a(t);if(null===n)return i;var s,o,l=c(n,e);return l.length?i.length?(s=new r(i.concat(l)),h(s,(o=[]).push,o),o):l:i};n({target:"Reflect",stat:!0},{getMetadataKeys:function(t){var e=arguments.length<2?void 0:l(arguments[1]);return c(o(t),e)}})},62616:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=i(29528),a=r.has,h=r.get,u=r.toKey,l=function(t,e,i){if(a(t,e,i))return h(t,e,i);var n=o(e);return null!==n?l(t,n,i):void 0};n({target:"Reflect",stat:!0},{getMetadata:function(t,e){var i=arguments.length<3?void 0:u(arguments[2]);return l(t,s(e),i)}})},40754:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.keys,a=r.toKey;n({target:"Reflect",stat:!0},{getOwnMetadataKeys:function(t){var e=arguments.length<2?void 0:a(arguments[1]);return o(s(t),e)}})},58173:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.get,a=r.toKey;n({target:"Reflect",stat:!0},{getOwnMetadata:function(t,e){var i=arguments.length<3?void 0:a(arguments[2]);return o(t,s(e),i)}})},15100:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=i(29528),a=r.has,h=r.toKey,u=function(t,e,i){if(a(t,e,i))return!0;var n=o(e);return null!==n&&u(t,n,i)};n({target:"Reflect",stat:!0},{hasMetadata:function(t,e){var i=arguments.length<3?void 0:h(arguments[2]);return u(t,s(e),i)}})},40969:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.has,a=r.toKey;n({target:"Reflect",stat:!0},{hasOwnMetadata:function(t,e){var i=arguments.length<3?void 0:a(arguments[2]);return o(t,s(e),i)}})},76247:(t,e,i)=>{var n=i(23889),r=i(38758),s=i(13980),o=r.toKey,a=r.set;n({target:"Reflect",stat:!0},{metadata:function(t,e){return function(i,n){a(t,e,s(i),o(n))}}})},66169:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(31553);n({target:"Set",proto:!0,real:!0,forced:r},{addAll:function(){return s.apply(this,arguments)}})},75295:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(84537);n({target:"Set",proto:!0,real:!0,forced:r},{deleteAll:function(){return s.apply(this,arguments)}})},59070:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(7350),u=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{difference:function(t){var e=o(this),i=new(h(e,s("Set")))(e),n=a(i.delete);return u(t,(function(t){n.call(i,t)})),i}})},77280:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(82091),h=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{every:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return!h(i,(function(t){if(!n(t,t,e))return h.stop()}),void 0,!1,!0).stopped}})},56409:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(39181),u=i(7350),l=i(82091),c=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{filter:function(t){var e=o(this),i=l(e),n=h(t,arguments.length>1?arguments[1]:void 0,3),r=new(u(e,s("Set"))),d=a(r.add);return c(i,(function(t){n(t,t,e)&&d.call(r,t)}),void 0,!1,!0),r}})},33041:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(82091),h=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{find:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return h(i,(function(t){if(n(t,t,e))return h.stop(t)}),void 0,!1,!0).result}})},6507:(t,e,i)=>{i(23889)({target:"Set",stat:!0},{from:i(63842)})},93988:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(7350),u=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{intersection:function(t){var e=o(this),i=new(h(e,s("Set"))),n=a(e.has),r=a(i.add);return u(t,(function(t){n.call(e,t)&&r.call(i,t)})),i}})},91755:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775),a=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{isDisjointFrom:function(t){var e=s(this),i=o(e.has);return!a(t,(function(t){if(!0===i.call(e,t))return a.stop()})).stopped}})},26883:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(62389),u=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{isSubsetOf:function(t){var e=h(this),i=o(t),n=i.has;return"function"!=typeof n&&(i=new(s("Set"))(t),n=a(i.has)),!u(e,(function(t){if(!1===n.call(i,t))return u.stop()}),void 0,!1,!0).stopped}})},4999:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775),a=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{isSupersetOf:function(t){var e=s(this),i=o(e.has);return!a(t,(function(t){if(!1===i.call(e,t))return a.stop()})).stopped}})},4047:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(82091),a=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{join:function(t){var e=s(this),i=o(e),n=void 0===t?",":String(t),r=[];return a(i,r.push,r,!1,!0),r.join(n)}})},12407:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(39181),u=i(7350),l=i(82091),c=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{map:function(t){var e=o(this),i=l(e),n=h(t,arguments.length>1?arguments[1]:void 0,3),r=new(u(e,s("Set"))),d=a(r.add);return c(i,(function(t){d.call(r,n(t,t,e))}),void 0,!1,!0),r}})},60201:(t,e,i)=>{i(23889)({target:"Set",stat:!0},{of:i(96089)})},73827:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(23775),a=i(82091),h=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{reduce:function(t){var e=s(this),i=a(e),n=arguments.length<2,r=n?void 0:arguments[1];if(o(t),h(i,(function(i){n?(n=!1,r=i):r=t(r,i,i,e)}),void 0,!1,!0),n)throw TypeError("Reduce of empty set with no initial value");return r}})},14424:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(13980),o=i(39181),a=i(82091),h=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{some:function(t){var e=s(this),i=a(e),n=o(t,arguments.length>1?arguments[1]:void 0,3);return h(i,(function(t){if(n(t,t,e))return h.stop()}),void 0,!1,!0).stopped}})},35456:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(7350),u=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{symmetricDifference:function(t){var e=o(this),i=new(h(e,s("Set")))(e),n=a(i.delete),r=a(i.add);return u(t,(function(t){n.call(i,t)||r.call(i,t)})),i}})},11218:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(27623),o=i(13980),a=i(23775),h=i(7350),u=i(76808);n({target:"Set",proto:!0,real:!0,forced:r},{union:function(t){var e=o(this),i=new(h(e,s("Set")))(e);return u(t,a(i.add),i),i}})},46303:(t,e,i)=>{"use strict";var n=i(23889),r=i(17933).charAt;n({target:"String",proto:!0},{at:function(t){return r(this,t)}})},74735:(t,e,i)=>{"use strict";var n=i(23889),r=i(2395),s=i(86608),o=i(97030),a=i(17933),h=a.codeAt,u=a.charAt,l="String Iterator",c=o.set,d=o.getterFor(l),p=r((function(t){c(this,{type:l,string:t,index:0})}),"String",(function(){var t,e=d(this),i=e.string,n=e.index;return n>=i.length?{value:void 0,done:!0}:(t=u(i,n),e.index+=t.length,{value:{codePoint:h(t,0),position:n},done:!1})}));n({target:"String",proto:!0},{codePoints:function(){return new p(String(s(this)))}})},11890:(t,e,i)=>{i(28828)},19150:(t,e,i)=>{"use strict";var n=i(23889),r=i(86608),s=i(39376),o=i(21068),a=i(10548),h=i(51104),u=a("replace"),l=RegExp.prototype;n({target:"String",proto:!0},{replaceAll:function t(e,i){var n,a,c,d,p,f,m,v,g=r(this);if(null!=e){if((n=s(e))&&!~String(r("flags"in l?e.flags:o.call(e))).indexOf("g"))throw TypeError("`.replaceAll` does not allow non-global regexes");if(void 0!==(a=e[u]))return a.call(e,g,i);if(h&&n)return String(g).replace(e,i)}if(c=String(g),""===(d=String(e)))return t.call(c,/(?:)/g,i);if(p=c.split(d),"function"!=typeof i)return p.join(String(i));for(m=(f=p[0]).length,v=1;v<p.length;v++)f+=String(i(d,m,c)),m+=d.length+p[v].length,f+=p[v];return f}})},22399:(t,e,i)=>{i(62646)("asyncDispose")},55930:(t,e,i)=>{i(62646)("dispose")},57535:(t,e,i)=>{i(62646)("observable")},13177:(t,e,i)=>{i(62646)("patternMatch")},17654:(t,e,i)=>{i(62646)("replaceAll")},69663:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(84537);n({target:"WeakMap",proto:!0,real:!0,forced:r},{deleteAll:function(){return s.apply(this,arguments)}})},90331:(t,e,i)=>{i(23889)({target:"WeakMap",stat:!0},{from:i(63842)})},55093:(t,e,i)=>{i(23889)({target:"WeakMap",stat:!0},{of:i(96089)})},15517:(t,e,i)=>{"use strict";i(23889)({target:"WeakMap",proto:!0,real:!0,forced:i(51104)},{upsert:i(35913)})},6835:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(31553);n({target:"WeakSet",proto:!0,real:!0,forced:r},{addAll:function(){return s.apply(this,arguments)}})},88894:(t,e,i)=>{"use strict";var n=i(23889),r=i(51104),s=i(84537);n({target:"WeakSet",proto:!0,real:!0,forced:r},{deleteAll:function(){return s.apply(this,arguments)}})},22333:(t,e,i)=>{i(23889)({target:"WeakSet",stat:!0},{from:i(63842)})},50310:(t,e,i)=>{i(23889)({target:"WeakSet",stat:!0},{of:i(96089)})},40870:(t,e,i)=>{var n=i(33386),r=i(52889),s=i(64902),o=i(17182);for(var a in r){var h=n[a],u=h&&h.prototype;if(u&&u.forEach!==s)try{o(u,"forEach",s)}catch(t){u.forEach=s}}},21781:(t,e,i)=>{var n=i(33386),r=i(52889),s=i(41499),o=i(17182),a=i(10548),h=a("iterator"),u=a("toStringTag"),l=s.values;for(var c in r){var d=n[c],p=d&&d.prototype;if(p){if(p[h]!==l)try{o(p,h,l)}catch(t){p[h]=l}if(p[u]||o(p,u,c),r[c])for(var f in s)if(p[f]!==s[f])try{o(p,f,s[f])}catch(t){p[f]=s[f]}}}},79400:(t,e,i)=>{var n=i(23889),r=i(33386),s=i(39331);n({global:!0,bind:!0,enumerable:!0,forced:!r.setImmediate||!r.clearImmediate},{setImmediate:s.set,clearImmediate:s.clear})},62094:(t,e,i)=>{var n=i(23889),r=i(33386),s=i(65516),o=i(2178),a=r.process,h="process"==o(a);n({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(t){var e=h&&a.domain;s(e?e.bind(t):t)}})},49473:(t,e,i)=>{var n=i(23889),r=i(33386),s=i(66499),o=[].slice,a=function(t){return function(e,i){var n=arguments.length>2,r=n?o.call(arguments,2):void 0;return t(n?function(){("function"==typeof e?e:Function(e)).apply(this,r)}:e,i)}};n({global:!0,bind:!0,forced:/MSIE .\./.test(s)},{setTimeout:a(r.setTimeout),setInterval:a(r.setInterval)})},30524:(t,e,i)=>{"use strict";i(41499);var n=i(23889),r=i(27623),s=i(80781),o=i(18957),a=i(11432),h=i(39893),u=i(2395),l=i(97030),c=i(31057),d=i(54585),p=i(39181),f=i(16385),m=i(13980),v=i(68580),g=i(37602),y=i(36846),_=i(62389),x=i(99683),b=i(10548),w=r("fetch"),T=r("Headers"),M=b("iterator"),S="URLSearchParams",E="URLSearchParamsIterator",L=l.set,A=l.getterFor(S),D=l.getterFor(E),P=/\+/g,C=Array(4),O=function(t){return C[t-1]||(C[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},k=function(t){try{return decodeURIComponent(t)}catch(e){return t}},R=function(t){var e=t.replace(P," "),i=4;try{return decodeURIComponent(e)}catch(t){for(;i;)e=e.replace(O(i--),k);return e}},I=/[!'()~]|%20/g,Y={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},F=function(t){return Y[t]},N=function(t){return encodeURIComponent(t).replace(I,F)},B=function(t,e){if(e)for(var i,n,r=e.split("&"),s=0;s<r.length;)(i=r[s++]).length&&(n=i.split("="),t.push({key:R(n.shift()),value:R(n.join("="))}))},U=function(t){this.entries.length=0,B(this.entries,t)},j=function(t,e){if(t<e)throw TypeError("Not enough arguments")},H=u((function(t,e){L(this,{type:E,iterator:_(A(t).entries),kind:e})}),"Iterator",(function(){var t=D(this),e=t.kind,i=t.iterator.next(),n=i.value;return i.done||(i.value="keys"===e?n.key:"values"===e?n.value:[n.key,n.value]),i})),z=function(){c(this,z,S);var t,e,i,n,r,s,o,a,h,u=arguments.length>0?arguments[0]:void 0,l=this,p=[];if(L(l,{type:S,entries:p,updateURL:function(){},updateSearchParams:U}),void 0!==u)if(v(u))if("function"==typeof(t=x(u)))for(i=(e=t.call(u)).next;!(n=i.call(e)).done;){if((o=(s=(r=_(m(n.value))).next).call(r)).done||(a=s.call(r)).done||!s.call(r).done)throw TypeError("Expected sequence with length 2");p.push({key:o.value+"",value:a.value+""})}else for(h in u)d(u,h)&&p.push({key:h,value:u[h]+""});else B(p,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},W=z.prototype;a(W,{append:function(t,e){j(arguments.length,2);var i=A(this);i.entries.push({key:t+"",value:e+""}),i.updateURL()},delete:function(t){j(arguments.length,1);for(var e=A(this),i=e.entries,n=t+"",r=0;r<i.length;)i[r].key===n?i.splice(r,1):r++;e.updateURL()},get:function(t){j(arguments.length,1);for(var e=A(this).entries,i=t+"",n=0;n<e.length;n++)if(e[n].key===i)return e[n].value;return null},getAll:function(t){j(arguments.length,1);for(var e=A(this).entries,i=t+"",n=[],r=0;r<e.length;r++)e[r].key===i&&n.push(e[r].value);return n},has:function(t){j(arguments.length,1);for(var e=A(this).entries,i=t+"",n=0;n<e.length;)if(e[n++].key===i)return!0;return!1},set:function(t,e){j(arguments.length,1);for(var i,n=A(this),r=n.entries,s=!1,o=t+"",a=e+"",h=0;h<r.length;h++)(i=r[h]).key===o&&(s?r.splice(h--,1):(s=!0,i.value=a));s||r.push({key:o,value:a}),n.updateURL()},sort:function(){var t,e,i,n=A(this),r=n.entries,s=r.slice();for(r.length=0,i=0;i<s.length;i++){for(t=s[i],e=0;e<i;e++)if(r[e].key>t.key){r.splice(e,0,t);break}e===i&&r.push(t)}n.updateURL()},forEach:function(t){for(var e,i=A(this).entries,n=p(t,arguments.length>1?arguments[1]:void 0,3),r=0;r<i.length;)n((e=i[r++]).value,e.key,this)},keys:function(){return new H(this,"keys")},values:function(){return new H(this,"values")},entries:function(){return new H(this,"entries")}},{enumerable:!0}),o(W,M,W.entries),o(W,"toString",(function(){for(var t,e=A(this).entries,i=[],n=0;n<e.length;)t=e[n++],i.push(N(t.key)+"="+N(t.value));return i.join("&")}),{enumerable:!0}),h(z,S),n({global:!0,forced:!s},{URLSearchParams:z}),s||"function"!=typeof w||"function"!=typeof T||n({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var e,i,n,r=[t];return arguments.length>1&&(v(e=arguments[1])&&(i=e.body,f(i)===S&&((n=e.headers?new T(e.headers):new T).has("content-type")||n.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),e=g(e,{body:y(0,String(i)),headers:y(0,n)}))),r.push(e)),w.apply(this,r)}}),t.exports={URLSearchParams:z,getState:A}},98636:(t,e,i)=>{"use strict";i(770);var n,r=i(23889),s=i(56617),o=i(80781),a=i(33386),h=i(23702),u=i(18957),l=i(31057),c=i(54585),d=i(98466),p=i(83601),f=i(17933).codeAt,m=i(32937),v=i(39893),g=i(30524),y=i(97030),_=a.URL,x=g.URLSearchParams,b=g.getState,w=y.set,T=y.getterFor("URL"),M=Math.floor,S=Math.pow,E="Invalid scheme",L="Invalid host",A="Invalid port",D=/[A-Za-z]/,P=/[\d+-.A-Za-z]/,C=/\d/,O=/^(0x|0X)/,k=/^[0-7]+$/,R=/^\d+$/,I=/^[\dA-Fa-f]+$/,Y=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,F=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,B=/[\u0009\u000A\u000D]/g,U=function(t,e){var i,n,r;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return L;if(!(i=H(e.slice(1,-1))))return L;t.host=i}else if(Z(t)){if(e=m(e),Y.test(e))return L;if(null===(i=j(e)))return L;t.host=i}else{if(F.test(e))return L;for(i="",n=p(e),r=0;r<n.length;r++)i+=q(n[r],W);t.host=i}},j=function(t){var e,i,n,r,s,o,a,h=t.split(".");if(h.length&&""==h[h.length-1]&&h.pop(),(e=h.length)>4)return t;for(i=[],n=0;n<e;n++){if(""==(r=h[n]))return t;if(s=10,r.length>1&&"0"==r.charAt(0)&&(s=O.test(r)?16:8,r=r.slice(8==s?1:2)),""===r)o=0;else{if(!(10==s?R:8==s?k:I).test(r))return t;o=parseInt(r,s)}i.push(o)}for(n=0;n<e;n++)if(o=i[n],n==e-1){if(o>=S(256,5-e))return null}else if(o>255)return null;for(a=i.pop(),n=0;n<i.length;n++)a+=i[n]*S(256,3-n);return a},H=function(t){var e,i,n,r,s,o,a,h=[0,0,0,0,0,0,0,0],u=0,l=null,c=0,d=function(){return t.charAt(c)};if(":"==d()){if(":"!=t.charAt(1))return;c+=2,l=++u}for(;d();){if(8==u)return;if(":"!=d()){for(e=i=0;i<4&&I.test(d());)e=16*e+parseInt(d(),16),c++,i++;if("."==d()){if(0==i)return;if(c-=i,u>6)return;for(n=0;d();){if(r=null,n>0){if(!("."==d()&&n<4))return;c++}if(!C.test(d()))return;for(;C.test(d());){if(s=parseInt(d(),10),null===r)r=s;else{if(0==r)return;r=10*r+s}if(r>255)return;c++}h[u]=256*h[u]+r,2!=++n&&4!=n||u++}if(4!=n)return;break}if(":"==d()){if(c++,!d())return}else if(d())return;h[u++]=e}else{if(null!==l)return;c++,l=++u}}if(null!==l)for(o=u-l,u=7;0!=u&&o>0;)a=h[u],h[u--]=h[l+o-1],h[l+--o]=a;else if(8!=u)return;return h},z=function(t){var e,i,n,r;if("number"==typeof t){for(e=[],i=0;i<4;i++)e.unshift(t%256),t=M(t/256);return e.join(".")}if("object"==typeof t){for(e="",n=function(t){for(var e=null,i=1,n=null,r=0,s=0;s<8;s++)0!==t[s]?(r>i&&(e=n,i=r),n=null,r=0):(null===n&&(n=s),++r);return r>i&&(e=n,i=r),e}(t),i=0;i<8;i++)r&&0===t[i]||(r&&(r=!1),n===i?(e+=i?":":"::",r=!0):(e+=t[i].toString(16),i<7&&(e+=":")));return"["+e+"]"}return t},W={},G=d({},W,{" ":1,'"':1,"<":1,">":1,"`":1}),V=d({},G,{"#":1,"?":1,"{":1,"}":1}),X=d({},V,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),q=function(t,e){var i=f(t,0);return i>32&&i<127&&!c(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Z=function(t){return c(J,t.scheme)},K=function(t){return""!=t.username||""!=t.password},Q=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},$=function(t,e){var i;return 2==t.length&&D.test(t.charAt(0))&&(":"==(i=t.charAt(1))||!e&&"|"==i)},tt=function(t){var e;return t.length>1&&$(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},et=function(t){var e=t.path,i=e.length;!i||"file"==t.scheme&&1==i&&$(e[0],!0)||e.pop()},it=function(t){return"."===t||"%2e"===t.toLowerCase()},nt={},rt={},st={},ot={},at={},ht={},ut={},lt={},ct={},dt={},pt={},ft={},mt={},vt={},gt={},yt={},_t={},xt={},bt={},wt={},Tt={},Mt=function(t,e,i,r){var s,o,a,h,u,l=i||nt,d=0,f="",m=!1,v=!1,g=!1;for(i||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(B,""),s=p(e);d<=s.length;){switch(o=s[d],l){case nt:if(!o||!D.test(o)){if(i)return E;l=st;continue}f+=o.toLowerCase(),l=rt;break;case rt:if(o&&(P.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(i)return E;f="",l=st,d=0;continue}if(i&&(Z(t)!=c(J,f)||"file"==f&&(K(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=f,i)return void(Z(t)&&J[t.scheme]==t.port&&(t.port=null));f="","file"==t.scheme?l=vt:Z(t)&&r&&r.scheme==t.scheme?l=ot:Z(t)?l=lt:"/"==s[d+1]?(l=at,d++):(t.cannotBeABaseURL=!0,t.path.push(""),l=bt)}break;case st:if(!r||r.cannotBeABaseURL&&"#"!=o)return E;if(r.cannotBeABaseURL&&"#"==o){t.scheme=r.scheme,t.path=r.path.slice(),t.query=r.query,t.fragment="",t.cannotBeABaseURL=!0,l=Tt;break}l="file"==r.scheme?vt:ht;continue;case ot:if("/"!=o||"/"!=s[d+1]){l=ht;continue}l=ct,d++;break;case at:if("/"==o){l=dt;break}l=xt;continue;case ht:if(t.scheme=r.scheme,o==n)t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query=r.query;else if("/"==o||"\\"==o&&Z(t))l=ut;else if("?"==o)t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query="",l=wt;else{if("#"!=o){t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.path.pop(),l=xt;continue}t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query=r.query,t.fragment="",l=Tt}break;case ut:if(!Z(t)||"/"!=o&&"\\"!=o){if("/"!=o){t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,l=xt;continue}l=dt}else l=ct;break;case lt:if(l=ct,"/"!=o||"/"!=f.charAt(d+1))continue;d++;break;case ct:if("/"!=o&&"\\"!=o){l=dt;continue}break;case dt:if("@"==o){m&&(f="%40"+f),m=!0,a=p(f);for(var y=0;y<a.length;y++){var _=a[y];if(":"!=_||g){var x=q(_,X);g?t.password+=x:t.username+=x}else g=!0}f=""}else if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&Z(t)){if(m&&""==f)return"Invalid authority";d-=p(f).length+1,f="",l=pt}else f+=o;break;case pt:case ft:if(i&&"file"==t.scheme){l=yt;continue}if(":"!=o||v){if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&Z(t)){if(Z(t)&&""==f)return L;if(i&&""==f&&(K(t)||null!==t.port))return;if(h=U(t,f))return h;if(f="",l=_t,i)return;continue}"["==o?v=!0:"]"==o&&(v=!1),f+=o}else{if(""==f)return L;if(h=U(t,f))return h;if(f="",l=mt,i==ft)return}break;case mt:if(!C.test(o)){if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&Z(t)||i){if(""!=f){var b=parseInt(f,10);if(b>65535)return A;t.port=Z(t)&&b===J[t.scheme]?null:b,f=""}if(i)return;l=_t;continue}return A}f+=o;break;case vt:if(t.scheme="file","/"==o||"\\"==o)l=gt;else{if(!r||"file"!=r.scheme){l=xt;continue}if(o==n)t.host=r.host,t.path=r.path.slice(),t.query=r.query;else if("?"==o)t.host=r.host,t.path=r.path.slice(),t.query="",l=wt;else{if("#"!=o){tt(s.slice(d).join(""))||(t.host=r.host,t.path=r.path.slice(),et(t)),l=xt;continue}t.host=r.host,t.path=r.path.slice(),t.query=r.query,t.fragment="",l=Tt}}break;case gt:if("/"==o||"\\"==o){l=yt;break}r&&"file"==r.scheme&&!tt(s.slice(d).join(""))&&($(r.path[0],!0)?t.path.push(r.path[0]):t.host=r.host),l=xt;continue;case yt:if(o==n||"/"==o||"\\"==o||"?"==o||"#"==o){if(!i&&$(f))l=xt;else if(""==f){if(t.host="",i)return;l=_t}else{if(h=U(t,f))return h;if("localhost"==t.host&&(t.host=""),i)return;f="",l=_t}continue}f+=o;break;case _t:if(Z(t)){if(l=xt,"/"!=o&&"\\"!=o)continue}else if(i||"?"!=o)if(i||"#"!=o){if(o!=n&&(l=xt,"/"!=o))continue}else t.fragment="",l=Tt;else t.query="",l=wt;break;case xt:if(o==n||"/"==o||"\\"==o&&Z(t)||!i&&("?"==o||"#"==o)){if(".."===(u=(u=f).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(et(t),"/"==o||"\\"==o&&Z(t)||t.path.push("")):it(f)?"/"==o||"\\"==o&&Z(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&$(f)&&(t.host&&(t.host=""),f=f.charAt(0)+":"),t.path.push(f)),f="","file"==t.scheme&&(o==n||"?"==o||"#"==o))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==o?(t.query="",l=wt):"#"==o&&(t.fragment="",l=Tt)}else f+=q(o,V);break;case bt:"?"==o?(t.query="",l=wt):"#"==o?(t.fragment="",l=Tt):o!=n&&(t.path[0]+=q(o,W));break;case wt:i||"#"!=o?o!=n&&("'"==o&&Z(t)?t.query+="%27":t.query+="#"==o?"%23":q(o,W)):(t.fragment="",l=Tt);break;case Tt:o!=n&&(t.fragment+=q(o,G))}d++}},St=function(t){var e,i,n=l(this,St,"URL"),r=arguments.length>1?arguments[1]:void 0,o=String(t),a=w(n,{type:"URL"});if(void 0!==r)if(r instanceof St)e=T(r);else if(i=Mt(e={},String(r)))throw TypeError(i);if(i=Mt(a,o,null,e))throw TypeError(i);var h=a.searchParams=new x,u=b(h);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(h)||null},s||(n.href=Lt.call(n),n.origin=At.call(n),n.protocol=Dt.call(n),n.username=Pt.call(n),n.password=Ct.call(n),n.host=Ot.call(n),n.hostname=kt.call(n),n.port=Rt.call(n),n.pathname=It.call(n),n.search=Yt.call(n),n.searchParams=Ft.call(n),n.hash=Nt.call(n))},Et=St.prototype,Lt=function(){var t=T(this),e=t.scheme,i=t.username,n=t.password,r=t.host,s=t.port,o=t.path,a=t.query,h=t.fragment,u=e+":";return null!==r?(u+="//",K(t)&&(u+=i+(n?":"+n:"")+"@"),u+=z(r),null!==s&&(u+=":"+s)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?o[0]:o.length?"/"+o.join("/"):"",null!==a&&(u+="?"+a),null!==h&&(u+="#"+h),u},At=function(){var t=T(this),e=t.scheme,i=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&Z(t)?e+"://"+z(t.host)+(null!==i?":"+i:""):"null"},Dt=function(){return T(this).scheme+":"},Pt=function(){return T(this).username},Ct=function(){return T(this).password},Ot=function(){var t=T(this),e=t.host,i=t.port;return null===e?"":null===i?z(e):z(e)+":"+i},kt=function(){var t=T(this).host;return null===t?"":z(t)},Rt=function(){var t=T(this).port;return null===t?"":String(t)},It=function(){var t=T(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Yt=function(){var t=T(this).query;return t?"?"+t:""},Ft=function(){return T(this).searchParams},Nt=function(){var t=T(this).fragment;return t?"#"+t:""},Bt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(s&&h(Et,{href:Bt(Lt,(function(t){var e=T(this),i=String(t),n=Mt(e,i);if(n)throw TypeError(n);b(e.searchParams).updateSearchParams(e.query)})),origin:Bt(At),protocol:Bt(Dt,(function(t){var e=T(this);Mt(e,String(t)+":",nt)})),username:Bt(Pt,(function(t){var e=T(this),i=p(String(t));if(!Q(e)){e.username="";for(var n=0;n<i.length;n++)e.username+=q(i[n],X)}})),password:Bt(Ct,(function(t){var e=T(this),i=p(String(t));if(!Q(e)){e.password="";for(var n=0;n<i.length;n++)e.password+=q(i[n],X)}})),host:Bt(Ot,(function(t){var e=T(this);e.cannotBeABaseURL||Mt(e,String(t),pt)})),hostname:Bt(kt,(function(t){var e=T(this);e.cannotBeABaseURL||Mt(e,String(t),ft)})),port:Bt(Rt,(function(t){var e=T(this);Q(e)||(""==(t=String(t))?e.port=null:Mt(e,t,mt))})),pathname:Bt(It,(function(t){var e=T(this);e.cannotBeABaseURL||(e.path=[],Mt(e,t+"",_t))})),search:Bt(Yt,(function(t){var e=T(this);""==(t=String(t))?e.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),e.query="",Mt(e,t,wt)),b(e.searchParams).updateSearchParams(e.query)})),searchParams:Bt(Ft),hash:Bt(Nt,(function(t){var e=T(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),e.fragment="",Mt(e,t,Tt)):e.fragment=null}))}),u(Et,"toJSON",(function(){return Lt.call(this)}),{enumerable:!0}),u(Et,"toString",(function(){return Lt.call(this)}),{enumerable:!0}),_){var Ut=_.createObjectURL,jt=_.revokeObjectURL;Ut&&u(St,"createObjectURL",(function(t){return Ut.apply(_,arguments)})),jt&&u(St,"revokeObjectURL",(function(t){return jt.apply(_,arguments)}))}v(St,"URL"),r({global:!0,forced:!o,sham:!s},{URL:St})},67652:(t,e,i)=>{"use strict";i(23889)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},21562:(t,e,i)=>{i(65071)},24460:(t,e,i)=>{i(78843),i(62274)},84369:(t,e,i)=>{i(69795),i(53976),i(86779),i(20240),i(15201),i(20880),i(20981),i(40137),i(15240),i(79286),i(23574),i(32931),i(11924),i(10435),i(39316),i(66169),i(75295),i(77280),i(56409),i(33041),i(4047),i(12407),i(73827),i(14424),i(69663),i(6835),i(88894)},44283:(t,e,i)=>{i(98871),i(98983),i(6507),i(60201),i(90331),i(55093),i(22333),i(50310)},19880:(t,e,i)=>{i(10464),i(15434),i(63562),i(36823)},34128:(t,e,i)=>{i(63101);var n=i(33386);t.exports=n},72368:(t,e,i)=>{i(11652)},14529:(t,e,i)=>{i(48614),i(10717),i(6847),i(16348),i(349),i(96653),i(27646),i(56978),i(1996),i(517),i(51811),i(30580),i(6839),i(24837),i(7902),i(85750),i(53866),i(81192),i(13193),i(12122),i(4780),i(78496),i(25420),i(23451),i(90430),i(7857),i(67942),i(65499)},13868:(t,e,i)=>{i(95327),i(22401)},31064:(t,e,i)=>{i(62469),i(83830),i(15517)},99526:(t,e,i)=>{i(50946),i(89119),i(91996),i(65916),i(98013),i(3172),i(63566)},33613:(t,e,i)=>{i(37726)},20385:(t,e,i)=>{i(79708)},54554:(t,e,i)=>{i(6884),i(39682),i(8069)},1202:(t,e,i)=>{i(30138),i(57535)},79586:(t,e,i)=>{i(13177)},93784:(t,e,i)=>{i(3254)},22350:(t,e,i)=>{i(45633),i(87589)},76635:(t,e,i)=>{i(77304)},7318:(t,e,i)=>{i(38536),i(83452),i(62616),i(66881),i(58173),i(40754),i(15100),i(40969),i(76247)},35360:(t,e,i)=>{i(41876)},68814:(t,e,i)=>{i(59070),i(93988),i(91755),i(26883),i(4999),i(11218),i(35456)},28603:(t,e,i)=>{i(46303)},9201:(t,e,i)=>{i(74735)},46746:(t,e,i)=>{i(11890)},83839:(t,e,i)=>{i(19150),i(17654)},2314:(t,e,i)=>{i(98636),i(67652),i(30524)},9481:(t,e,i)=>{i(22399),i(55930)},20717:(t,e,i)=>{i(19880),i(28603),i(2314);var n=i(75448);t.exports=n},75448:(t,e,i)=>{i(24460),i(84369),i(44283),i(13868),i(99526),i(33613),i(20385),i(54554),i(1202),i(79586),i(76635),i(35360),i(9201);var n=i(88550);t.exports=n},88550:(t,e,i)=>{i(21562),i(14529),i(31064),i(68814),i(9481);var n=i(60515);t.exports=n},60515:(t,e,i)=>{i(22350),i(83839);var n=i(4636);t.exports=n},4636:(t,e,i)=>{i(34128),i(93784),i(46746);var n=i(29467);t.exports=n},11652:(t,e,i)=>{var n=i(63863);t.exports=n},63863:(t,e,i)=>{i(7318);var n=i(20717);t.exports=n},83582:(t,e,i)=>{i(40870),i(21781),i(79400),i(62094),i(49473),i(98636),i(67652),i(30524);var n=i(29467);t.exports=n},8799:t=>{"use strict";function e(t,e,s){s=s||2;var o,a,h,c,d,f,m,v=e&&e.length,g=v?e[0]*s:t.length,y=i(t,0,g,s,!0),_=[];if(!y||y.next===y.prev)return _;if(v&&(y=function(t,e,r,s){var o,a,h,c=[];for(o=0,a=e.length;o<a;o++)(h=i(t,e[o]*s,o<a-1?e[o+1]*s:t.length,s,!1))===h.next&&(h.steiner=!0),c.push(p(h));for(c.sort(u),o=0;o<c.length;o++)l(c[o],r),r=n(r,r.next);return r}(t,e,y,s)),t.length>80*s){o=h=t[0],a=c=t[1];for(var x=s;x<g;x+=s)(d=t[x])<o&&(o=d),(f=t[x+1])<a&&(a=f),d>h&&(h=d),f>c&&(c=f);m=0!==(m=Math.max(h-o,c-a))?1/m:0}return r(y,_,s,o,a,m),_}function i(t,e,i,n,r){var s,o;if(r===E(t,e,i,n)>0)for(s=e;s<i;s+=n)o=T(s,t[s],t[s+1],o);else for(s=i-n;s>=e;s-=n)o=T(s,t[s],t[s+1],o);return o&&g(o,o.next)&&(M(o),o=o.next),o}function n(t,e){if(!t)return t;e||(e=t);var i,n=t;do{if(i=!1,n.steiner||!g(n,n.next)&&0!==v(n.prev,n,n.next))n=n.next;else{if(M(n),(n=e=n.prev)===n.next)break;i=!0}}while(i||n!==e);return e}function r(t,e,i,u,l,c,p){if(t){!p&&c&&function(t,e,i,n){var r=t;do{null===r.z&&(r.z=d(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){var e,i,n,r,s,o,a,h,u=1;do{for(i=t,t=null,s=null,o=0;i;){for(o++,n=i,a=0,e=0;e<u&&(a++,n=n.nextZ);e++);for(h=u;a>0||h>0&&n;)0!==a&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,a--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,u*=2}while(o>1)}(r)}(t,u,l,c);for(var f,m,v=t;t.prev!==t.next;)if(f=t.prev,m=t.next,c?o(t,u,l,c):s(t))e.push(f.i/i),e.push(t.i/i),e.push(m.i/i),M(t),t=m.next,v=m.next;else if((t=m)===v){p?1===p?r(t=a(n(t),e,i),e,i,u,l,c,2):2===p&&h(t,e,i,u,l,c):r(n(t),e,i,u,l,c,1);break}}}function s(t){var e=t.prev,i=t,n=t.next;if(v(e,i,n)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(f(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&v(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function o(t,e,i,n){var r=t.prev,s=t,o=t.next;if(v(r,s,o)>=0)return!1;for(var a=r.x<s.x?r.x<o.x?r.x:o.x:s.x<o.x?s.x:o.x,h=r.y<s.y?r.y<o.y?r.y:o.y:s.y<o.y?s.y:o.y,u=r.x>s.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,l=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,c=d(a,h,e,i,n),p=d(u,l,e,i,n),m=t.prevZ,g=t.nextZ;m&&m.z>=c&&g&&g.z<=p;){if(m!==t.prev&&m!==t.next&&f(r.x,r.y,s.x,s.y,o.x,o.y,m.x,m.y)&&v(m.prev,m,m.next)>=0)return!1;if(m=m.prevZ,g!==t.prev&&g!==t.next&&f(r.x,r.y,s.x,s.y,o.x,o.y,g.x,g.y)&&v(g.prev,g,g.next)>=0)return!1;g=g.nextZ}for(;m&&m.z>=c;){if(m!==t.prev&&m!==t.next&&f(r.x,r.y,s.x,s.y,o.x,o.y,m.x,m.y)&&v(m.prev,m,m.next)>=0)return!1;m=m.prevZ}for(;g&&g.z<=p;){if(g!==t.prev&&g!==t.next&&f(r.x,r.y,s.x,s.y,o.x,o.y,g.x,g.y)&&v(g.prev,g,g.next)>=0)return!1;g=g.nextZ}return!0}function a(t,e,i){var r=t;do{var s=r.prev,o=r.next.next;!g(s,o)&&y(s,r,r.next,o)&&b(s,o)&&b(o,s)&&(e.push(s.i/i),e.push(r.i/i),e.push(o.i/i),M(r),M(r.next),r=t=o),r=r.next}while(r!==t);return n(r)}function h(t,e,i,s,o,a){var h=t;do{for(var u=h.next.next;u!==h.prev;){if(h.i!==u.i&&m(h,u)){var l=w(h,u);return h=n(h,h.next),l=n(l,l.next),r(h,e,i,s,o,a),void r(l,e,i,s,o,a)}u=u.next}h=h.next}while(h!==t)}function u(t,e){return t.x-e.x}function l(t,e){if(e=function(t,e){var i,n=e,r=t.x,s=t.y,o=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var a=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=r&&a>o){if(o=a,a===r){if(s===n.y)return n;if(s===n.next.y)return n.next}i=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!i)return null;if(r===o)return i;var h,u=i,l=i.x,d=i.y,p=1/0;n=i;do{r>=n.x&&n.x>=l&&r!==n.x&&f(s<d?r:o,s,l,d,s<d?o:r,s,n.x,n.y)&&(h=Math.abs(s-n.y)/(r-n.x),b(n,t)&&(h<p||h===p&&(n.x>i.x||n.x===i.x&&c(i,n)))&&(i=n,p=h)),n=n.next}while(n!==u);return i}(t,e)){var i=w(e,t);n(e,e.next),n(i,i.next)}}function c(t,e){return v(t.prev,t,e.prev)<0&&v(e.next,t,t.next)<0}function d(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function p(t){var e=t,i=t;do{(e.x<i.x||e.x===i.x&&e.y<i.y)&&(i=e),e=e.next}while(e!==t);return i}function f(t,e,i,n,r,s,o,a){return(r-o)*(e-a)-(t-o)*(s-a)>=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(s-a)-(r-o)*(n-a)>=0}function m(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&y(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(b(t,e)&&b(e,t)&&function(t,e){var i=t,n=!1,r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)&&(v(t.prev,t,e.prev)||v(t,e.prev,e))||g(t,e)&&v(t.prev,t,t.next)>0&&v(e.prev,e,e.next)>0)}function v(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function g(t,e){return t.x===e.x&&t.y===e.y}function y(t,e,i,n){var r=x(v(t,e,i)),s=x(v(t,e,n)),o=x(v(i,n,t)),a=x(v(i,n,e));return r!==s&&o!==a||(!(0!==r||!_(t,i,e))||(!(0!==s||!_(t,n,e))||(!(0!==o||!_(i,t,n))||!(0!==a||!_(i,e,n)))))}function _(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function x(t){return t>0?1:t<0?-1:0}function b(t,e){return v(t.prev,t,t.next)<0?v(t,e,t.next)>=0&&v(t,t.prev,e)>=0:v(t,e,t.prev)<0||v(t,t.next,e)<0}function w(t,e){var i=new S(t.i,t.x,t.y),n=new S(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function T(t,e,i,n){var r=new S(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function M(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function S(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function E(t,e,i,n){for(var r=0,s=e,o=i-n;s<i;s+=n)r+=(t[o]-t[s])*(t[s+1]+t[o+1]),o=s;return r}t.exports=e,t.exports.default=e,e.deviation=function(t,e,i,n){var r=e&&e.length,s=r?e[0]*i:t.length,o=Math.abs(E(t,0,s,i));if(r)for(var a=0,h=e.length;a<h;a++){var u=e[a]*i,l=a<h-1?e[a+1]*i:t.length;o-=Math.abs(E(t,u,l,i))}var c=0;for(a=0;a<n.length;a+=3){var d=n[a]*i,p=n[a+1]*i,f=n[a+2]*i;c+=Math.abs((t[d]-t[f])*(t[p+1]-t[d+1])-(t[d]-t[p])*(t[f+1]-t[d+1]))}return 0===o&&0===c?0:Math.abs((c-o)/o)},e.flatten=function(t){for(var e=t[0][0].length,i={vertices:[],holes:[],dimensions:e},n=0,r=0;r<t.length;r++){for(var s=0;s<t[r].length;s++)for(var o=0;o<e;o++)i.vertices.push(t[r][s][o]);r>0&&(n+=t[r-1].length,i.holes.push(n))}return i}},17583:function(t,e,i){var n;!function(r){var s=r.Promise,o=s&&"resolve"in s&&"reject"in s&&"all"in s&&"race"in s&&function(){var t;return new s((function(e){t=e})),"function"==typeof t}();e?(e.Promise=o?s:E,e.Polyfill=E):void 0===(n=function(){return o?s:E}.call(e,i,e,t))||(t.exports=n);var a="pending",h="sealed",u="fulfilled",l="rejected",c=function(){};function d(t){return"[object Array]"===Object.prototype.toString.call(t)}var p,f="undefined"!=typeof setImmediate?setImmediate:setTimeout,m=[];function v(){for(var t=0;t<m.length;t++)m[t][0](m[t][1]);m=[],p=!1}function g(t,e){m.push([t,e]),p||(p=!0,f(v,0))}function y(t){var e=t.owner,i=e.state_,n=e.data_,r=t[i],s=t.then;if("function"==typeof r){i=u;try{n=r(n)}catch(t){w(s,t)}}_(s,n)||(i===u&&x(s,n),i===l&&w(s,n))}function _(t,e){var i;try{if(t===e)throw new TypeError("A promises callback cannot return that same promise.");if(e&&("function"==typeof e||"object"==typeof e)){var n=e.then;if("function"==typeof n)return n.call(e,(function(n){i||(i=!0,e!==n?x(t,n):b(t,n))}),(function(e){i||(i=!0,w(t,e))})),!0}}catch(e){return i||w(t,e),!0}return!1}function x(t,e){t!==e&&_(t,e)||b(t,e)}function b(t,e){t.state_===a&&(t.state_=h,t.data_=e,g(M,t))}function w(t,e){t.state_===a&&(t.state_=h,t.data_=e,g(S,t))}function T(t){var e=t.then_;t.then_=void 0;for(var i=0;i<e.length;i++)y(e[i])}function M(t){t.state_=u,T(t)}function S(t){t.state_=l,T(t)}function E(t){if("function"!=typeof t)throw new TypeError("Promise constructor takes a function argument");if(this instanceof E==!1)throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this.then_=[],function(t,e){function i(t){w(e,t)}try{t((function(t){x(e,t)}),i)}catch(t){i(t)}}(t,this)}E.prototype={constructor:E,state_:a,then_:null,data_:void 0,then:function(t,e){var i={owner:this,then:new this.constructor(c),fulfilled:t,rejected:e};return this.state_===u||this.state_===l?g(y,i):this.then_.push(i),i.then},catch:function(t){return this.then(null,t)}},E.all=function(t){if(!d(t))throw new TypeError("You must pass an array to Promise.all().");return new this((function(e,i){var n=[],r=0;function s(t){return r++,function(i){n[t]=i,--r||e(n)}}for(var o,a=0;a<t.length;a++)(o=t[a])&&"function"==typeof o.then?o.then(s(a),i):n[a]=o;r||e(n)}))},E.race=function(t){if(!d(t))throw new TypeError("You must pass an array to Promise.race().");return new this((function(e,i){for(var n,r=0;r<t.length;r++)(n=t[r])&&"function"==typeof n.then?n.then(e,i):e(n)}))},E.resolve=function(t){return t&&"object"==typeof t&&t.constructor===this?t:new this((function(e){e(t)}))},E.reject=function(t){return new this((function(e,i){i(t)}))}}("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this)},17168:t=>{"use strict";var e=Object.prototype.hasOwnProperty,i="~";function n(){}function r(t,e,i){this.fn=t,this.context=e,this.once=i||!1}function s(t,e,n,s,o){if("function"!=typeof n)throw new TypeError("The listener must be a function");var a=new r(n,s||t,o),h=i?i+e:e;return t._events[h]?t._events[h].fn?t._events[h]=[t._events[h],a]:t._events[h].push(a):(t._events[h]=a,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new n:delete t._events[e]}function a(){this._events=new n,this._eventsCount=0}Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(i=!1)),a.prototype.eventNames=function(){var t,n,r=[];if(0===this._eventsCount)return r;for(n in t=this._events)e.call(t,n)&&r.push(i?n.slice(1):n);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},a.prototype.listeners=function(t){var e=i?i+t:t,n=this._events[e];if(!n)return[];if(n.fn)return[n.fn];for(var r=0,s=n.length,o=new Array(s);r<s;r++)o[r]=n[r].fn;return o},a.prototype.listenerCount=function(t){var e=i?i+t:t,n=this._events[e];return n?n.fn?1:n.length:0},a.prototype.emit=function(t,e,n,r,s,o){var a=i?i+t:t;if(!this._events[a])return!1;var h,u,l=this._events[a],c=arguments.length;if(l.fn){switch(l.once&&this.removeListener(t,l.fn,void 0,!0),c){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,e),!0;case 3:return l.fn.call(l.context,e,n),!0;case 4:return l.fn.call(l.context,e,n,r),!0;case 5:return l.fn.call(l.context,e,n,r,s),!0;case 6:return l.fn.call(l.context,e,n,r,s,o),!0}for(u=1,h=new Array(c-1);u<c;u++)h[u-1]=arguments[u];l.fn.apply(l.context,h)}else{var d,p=l.length;for(u=0;u<p;u++)switch(l[u].once&&this.removeListener(t,l[u].fn,void 0,!0),c){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,e);break;case 3:l[u].fn.call(l[u].context,e,n);break;case 4:l[u].fn.call(l[u].context,e,n,r);break;default:if(!h)for(d=1,h=new Array(c-1);d<c;d++)h[d-1]=arguments[d];l[u].fn.apply(l[u].context,h)}}return!0},a.prototype.on=function(t,e,i){return s(this,t,e,i,!1)},a.prototype.once=function(t,e,i){return s(this,t,e,i,!0)},a.prototype.removeListener=function(t,e,n,r){var s=i?i+t:t;if(!this._events[s])return this;if(!e)return o(this,s),this;var a=this._events[s];if(a.fn)a.fn!==e||r&&!a.once||n&&a.context!==n||o(this,s);else{for(var h=0,u=[],l=a.length;h<l;h++)(a[h].fn!==e||r&&!a[h].once||n&&a[h].context!==n)&&u.push(a[h]);u.length?this._events[s]=1===u.length?u[0]:u:o(this,s)}return this},a.prototype.removeAllListeners=function(t){var e;return t?(e=i?i+t:t,this._events[e]&&o(this,e)):(this._events=new n,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=i,a.EventEmitter=a,t.exports=a},75586:function(t,e){var i;!function(e,i){"use strict";"object"==typeof t.exports?t.exports=e.document?i(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return i(t)}:i(e)}("undefined"!=typeof window?window:this,(function(n,r){"use strict";var s=[],o=Object.getPrototypeOf,a=s.slice,h=s.flat?function(t){return s.flat.call(t)}:function(t){return s.concat.apply([],t)},u=s.push,l=s.indexOf,c={},d=c.toString,p=c.hasOwnProperty,f=p.toString,m=f.call(Object),v={},g=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function(t){return null!=t&&t===t.window},_=n.document,x={type:!0,src:!0,nonce:!0,noModule:!0};function b(t,e,i){var n,r,s=(i=i||_).createElement("script");if(s.text=t,e)for(n in x)(r=e[n]||e.getAttribute&&e.getAttribute(n))&&s.setAttribute(n,r);i.head.appendChild(s).parentNode.removeChild(s)}function w(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?c[d.call(t)]||"object":typeof t}var T="3.5.0",M=function(t,e){return new M.fn.init(t,e)};function S(t){var e=!!t&&"length"in t&&t.length,i=w(t);return!g(t)&&!y(t)&&("array"===i||0===e||"number"==typeof e&&e>0&&e-1 in t)}M.fn=M.prototype={jquery:T,constructor:M,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=M.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return M.each(this,t)},map:function(t){return this.pushStack(M.map(this,(function(e,i){return t.call(e,i,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(M.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(M.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,i=+t+(t<0?e:0);return this.pushStack(i>=0&&i<e?[this[i]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:s.sort,splice:s.splice},M.extend=M.fn.extend=function(){var t,e,i,n,r,s,o=arguments[0]||{},a=1,h=arguments.length,u=!1;for("boolean"==typeof o&&(u=o,o=arguments[a]||{},a++),"object"==typeof o||g(o)||(o={}),a===h&&(o=this,a--);a<h;a++)if(null!=(t=arguments[a]))for(e in t)n=t[e],"__proto__"!==e&&o!==n&&(u&&n&&(M.isPlainObject(n)||(r=Array.isArray(n)))?(i=o[e],s=r&&!Array.isArray(i)?[]:r||M.isPlainObject(i)?i:{},r=!1,o[e]=M.extend(u,s,n)):void 0!==n&&(o[e]=n));return o},M.extend({expando:"jQuery"+(T+Math.random()).replace(/\D/g,""),isReady:!0,error:function(t){throw new Error(t)},noop:function(){},isPlainObject:function(t){var e,i;return!(!t||"[object Object]"!==d.call(t))&&(!(e=o(t))||"function"==typeof(i=p.call(e,"constructor")&&e.constructor)&&f.call(i)===m)},isEmptyObject:function(t){var e;for(e in t)return!1;return!0},globalEval:function(t,e,i){b(t,{nonce:e&&e.nonce},i)},each:function(t,e){var i,n=0;if(S(t))for(i=t.length;n<i&&!1!==e.call(t[n],n,t[n]);n++);else for(n in t)if(!1===e.call(t[n],n,t[n]))break;return t},makeArray:function(t,e){var i=e||[];return null!=t&&(S(Object(t))?M.merge(i,"string"==typeof t?[t]:t):u.call(i,t)),i},inArray:function(t,e,i){return null==e?-1:l.call(e,t,i)},merge:function(t,e){for(var i=+e.length,n=0,r=t.length;n<i;n++)t[r++]=e[n];return t.length=r,t},grep:function(t,e,i){for(var n=[],r=0,s=t.length,o=!i;r<s;r++)!e(t[r],r)!==o&&n.push(t[r]);return n},map:function(t,e,i){var n,r,s=0,o=[];if(S(t))for(n=t.length;s<n;s++)null!=(r=e(t[s],s,i))&&o.push(r);else for(s in t)null!=(r=e(t[s],s,i))&&o.push(r);return h(o)},guid:1,support:v}),"function"==typeof Symbol&&(M.fn[Symbol.iterator]=s[Symbol.iterator]),M.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),(function(t,e){c["[object "+e+"]"]=e.toLowerCase()}));var E=function(t){var e,i,n,r,s,o,a,h,u,l,c,d,p,f,m,v,g,y,_,x="sizzle"+1*new Date,b=t.document,w=0,T=0,M=ht(),S=ht(),E=ht(),L=ht(),A=function(t,e){return t===e&&(c=!0),0},D={}.hasOwnProperty,P=[],C=P.pop,O=P.push,k=P.push,R=P.slice,I=function(t,e){for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i;return-1},Y="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",F="[\\x20\\t\\r\\n\\f]",N="(?:\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",B="\\[[\\x20\\t\\r\\n\\f]*("+N+")(?:"+F+"*([*^$|!~]?=)"+F+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+F+"*\\]",U=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+B+")*)|.*)\\)|)",j=new RegExp(F+"+","g"),H=new RegExp("^[\\x20\\t\\r\\n\\f]+|((?:^|[^\\\\])(?:\\\\.)*)[\\x20\\t\\r\\n\\f]+$","g"),z=new RegExp("^[\\x20\\t\\r\\n\\f]*,[\\x20\\t\\r\\n\\f]*"),W=new RegExp("^[\\x20\\t\\r\\n\\f]*([>+~]|[\\x20\\t\\r\\n\\f])[\\x20\\t\\r\\n\\f]*"),G=new RegExp(F+"|>"),V=new RegExp(U),X=new RegExp("^"+N+"$"),q={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+U),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:new RegExp("^(?:"+Y+")$","i"),needsContext:new RegExp("^[\\x20\\t\\r\\n\\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?=[^-]|$)","i")},J=/HTML$/i,Z=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|\\\\([^\\r\\n\\f])","g"),it=function(t,e){var i="0x"+t.slice(1)-65536;return e||(i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320))},nt=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,rt=function(t,e){return e?"\0"===t?"\ufffd":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},st=function(){d()},ot=xt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{k.apply(P=R.call(b.childNodes),b.childNodes),P[b.childNodes.length].nodeType}catch(t){k={apply:P.length?function(t,e){O.apply(t,R.call(e))}:function(t,e){for(var i=t.length,n=0;t[i++]=e[n++];);t.length=i-1}}}function at(t,e,n,r){var s,a,u,l,c,f,g,y=e&&e.ownerDocument,b=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==b&&9!==b&&11!==b)return n;if(!r&&(d(e),e=e||p,m)){if(11!==b&&(c=$.exec(t)))if(s=c[1]){if(9===b){if(!(u=e.getElementById(s)))return n;if(u.id===s)return n.push(u),n}else if(y&&(u=y.getElementById(s))&&_(e,u)&&u.id===s)return n.push(u),n}else{if(c[2])return k.apply(n,e.getElementsByTagName(t)),n;if((s=c[3])&&i.getElementsByClassName&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(s)),n}if(i.qsa&&!L[t+" "]&&(!v||!v.test(t))&&(1!==b||"object"!==e.nodeName.toLowerCase())){if(g=t,y=e,1===b&&(G.test(t)||W.test(t))){for((y=tt.test(t)&&gt(e.parentNode)||e)===e&&i.scope||((l=e.getAttribute("id"))?l=l.replace(nt,rt):e.setAttribute("id",l=x)),a=(f=o(t)).length;a--;)f[a]=(l?"#"+l:":scope")+" "+_t(f[a]);g=f.join(",")}try{return k.apply(n,y.querySelectorAll(g)),n}catch(e){L(t,!0)}finally{l===x&&e.removeAttribute("id")}}}return h(t.replace(H,"$1"),e,n,r)}function ht(){var t=[];return function e(i,r){return t.push(i+" ")>n.cacheLength&&delete e[t.shift()],e[i+" "]=r}}function ut(t){return t[x]=!0,t}function lt(t){var e=p.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ct(t,e){for(var i=t.split("|"),r=i.length;r--;)n.attrHandle[i[r]]=e}function dt(t,e){var i=e&&t,n=i&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(n)return n;if(i)for(;i=i.nextSibling;)if(i===e)return-1;return t?1:-1}function pt(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function ft(t){return function(e){var i=e.nodeName.toLowerCase();return("input"===i||"button"===i)&&e.type===t}}function mt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ot(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function vt(t){return ut((function(e){return e=+e,ut((function(i,n){for(var r,s=t([],i.length,e),o=s.length;o--;)i[r=s[o]]&&(i[r]=!(n[r]=i[r]))}))}))}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in i=at.support={},s=at.isXML=function(t){var e=t.namespaceURI,i=(t.ownerDocument||t).documentElement;return!J.test(e||i&&i.nodeName||"HTML")},d=at.setDocument=function(t){var e,r,o=t?t.ownerDocument||t:b;return o!=p&&9===o.nodeType&&o.documentElement?(f=(p=o).documentElement,m=!s(p),b!=p&&(r=p.defaultView)&&r.top!==r&&(r.addEventListener?r.addEventListener("unload",st,!1):r.attachEvent&&r.attachEvent("onunload",st)),i.scope=lt((function(t){return f.appendChild(t).appendChild(p.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),i.attributes=lt((function(t){return t.className="i",!t.getAttribute("className")})),i.getElementsByTagName=lt((function(t){return t.appendChild(p.createComment("")),!t.getElementsByTagName("*").length})),i.getElementsByClassName=Q.test(p.getElementsByClassName),i.getById=lt((function(t){return f.appendChild(t).id=x,!p.getElementsByName||!p.getElementsByName(x).length})),i.getById?(n.filter.ID=function(t){var e=t.replace(et,it);return function(t){return t.getAttribute("id")===e}},n.find.ID=function(t,e){if(void 0!==e.getElementById&&m){var i=e.getElementById(t);return i?[i]:[]}}):(n.filter.ID=function(t){var e=t.replace(et,it);return function(t){var i=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return i&&i.value===e}},n.find.ID=function(t,e){if(void 0!==e.getElementById&&m){var i,n,r,s=e.getElementById(t);if(s){if((i=s.getAttributeNode("id"))&&i.value===t)return[s];for(r=e.getElementsByName(t),n=0;s=r[n++];)if((i=s.getAttributeNode("id"))&&i.value===t)return[s]}return[]}}),n.find.TAG=i.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):i.qsa?e.querySelectorAll(t):void 0}:function(t,e){var i,n=[],r=0,s=e.getElementsByTagName(t);if("*"===t){for(;i=s[r++];)1===i.nodeType&&n.push(i);return n}return s},n.find.CLASS=i.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&m)return e.getElementsByClassName(t)},g=[],v=[],(i.qsa=Q.test(p.querySelectorAll))&&(lt((function(t){var e;f.appendChild(t).innerHTML="<a id='"+x+"'></a><select id='"+x+"-\r\\' msallowcapture=''><option selected=''></option></select>",t.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll("[selected]").length||v.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|"+Y+")"),t.querySelectorAll("[id~="+x+"-]").length||v.push("~="),(e=p.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||v.push("\\[[\\x20\\t\\r\\n\\f]*name[\\x20\\t\\r\\n\\f]*=[\\x20\\t\\r\\n\\f]*(?:''|\"\")"),t.querySelectorAll(":checked").length||v.push(":checked"),t.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]"),t.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")})),lt((function(t){t.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var e=p.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&v.push("name[\\x20\\t\\r\\n\\f]*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),f.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),v.push(",.*:")}))),(i.matchesSelector=Q.test(y=f.matches||f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&lt((function(t){i.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),g.push("!=",U)})),v=v.length&&new RegExp(v.join("|")),g=g.length&&new RegExp(g.join("|")),e=Q.test(f.compareDocumentPosition),_=e||Q.test(f.contains)?function(t,e){var i=9===t.nodeType?t.documentElement:t,n=e&&e.parentNode;return t===n||!(!n||1!==n.nodeType||!(i.contains?i.contains(n):t.compareDocumentPosition&&16&t.compareDocumentPosition(n)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},A=e?function(t,e){if(t===e)return c=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!i.sortDetached&&e.compareDocumentPosition(t)===n?t==p||t.ownerDocument==b&&_(b,t)?-1:e==p||e.ownerDocument==b&&_(b,e)?1:l?I(l,t)-I(l,e):0:4&n?-1:1)}:function(t,e){if(t===e)return c=!0,0;var i,n=0,r=t.parentNode,s=e.parentNode,o=[t],a=[e];if(!r||!s)return t==p?-1:e==p?1:r?-1:s?1:l?I(l,t)-I(l,e):0;if(r===s)return dt(t,e);for(i=t;i=i.parentNode;)o.unshift(i);for(i=e;i=i.parentNode;)a.unshift(i);for(;o[n]===a[n];)n++;return n?dt(o[n],a[n]):o[n]==b?-1:a[n]==b?1:0},p):p},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(d(t),i.matchesSelector&&m&&!L[e+" "]&&(!g||!g.test(e))&&(!v||!v.test(e)))try{var n=y.call(t,e);if(n||i.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){L(e,!0)}return at(e,p,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=p&&d(t),_(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=p&&d(t);var r=n.attrHandle[e.toLowerCase()],s=r&&D.call(n.attrHandle,e.toLowerCase())?r(t,e,!m):void 0;return void 0!==s?s:i.attributes||!m?t.getAttribute(e):(s=t.getAttributeNode(e))&&s.specified?s.value:null},at.escape=function(t){return(t+"").replace(nt,rt)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,n=[],r=0,s=0;if(c=!i.detectDuplicates,l=!i.sortStable&&t.slice(0),t.sort(A),c){for(;e=t[s++];)e===t[s]&&(r=n.push(s));for(;r--;)t.splice(n[r],1)}return l=null,t},r=at.getText=function(t){var e,i="",n=0,s=t.nodeType;if(s){if(1===s||9===s||11===s){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)i+=r(t)}else if(3===s||4===s)return t.nodeValue}else for(;e=t[n++];)i+=r(e);return i},(n=at.selectors={cacheLength:50,createPseudo:ut,match:q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,it),t[3]=(t[3]||t[4]||t[5]||"").replace(et,it),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,i=!t[6]&&t[2];return q.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":i&&V.test(i)&&(e=o(i,!0))&&(e=i.indexOf(")",i.length-e)-i.length)&&(t[0]=t[0].slice(0,e),t[2]=i.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,it).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=M[t+" "];return e||(e=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+t+"("+F+"|$)"))&&M(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,i){return function(n){var r=at.attr(n,t);return null==r?"!="===e:!e||(r+="","="===e?r===i:"!="===e?r!==i:"^="===e?i&&0===r.indexOf(i):"*="===e?i&&r.indexOf(i)>-1:"$="===e?i&&r.slice(-i.length)===i:"~="===e?(" "+r.replace(j," ")+" ").indexOf(i)>-1:"|="===e&&(r===i||r.slice(0,i.length+1)===i+"-"))}},CHILD:function(t,e,i,n,r){var s="nth"!==t.slice(0,3),o="last"!==t.slice(-4),a="of-type"===e;return 1===n&&0===r?function(t){return!!t.parentNode}:function(e,i,h){var u,l,c,d,p,f,m=s!==o?"nextSibling":"previousSibling",v=e.parentNode,g=a&&e.nodeName.toLowerCase(),y=!h&&!a,_=!1;if(v){if(s){for(;m;){for(d=e;d=d[m];)if(a?d.nodeName.toLowerCase()===g:1===d.nodeType)return!1;f=m="only"===t&&!f&&"nextSibling"}return!0}if(f=[o?v.firstChild:v.lastChild],o&&y){for(_=(p=(u=(l=(c=(d=v)[x]||(d[x]={}))[d.uniqueID]||(c[d.uniqueID]={}))[t]||[])[0]===w&&u[1])&&u[2],d=p&&v.childNodes[p];d=++p&&d&&d[m]||(_=p=0)||f.pop();)if(1===d.nodeType&&++_&&d===e){l[t]=[w,p,_];break}}else if(y&&(_=p=(u=(l=(c=(d=e)[x]||(d[x]={}))[d.uniqueID]||(c[d.uniqueID]={}))[t]||[])[0]===w&&u[1]),!1===_)for(;(d=++p&&d&&d[m]||(_=p=0)||f.pop())&&((a?d.nodeName.toLowerCase()!==g:1!==d.nodeType)||!++_||(y&&((l=(c=d[x]||(d[x]={}))[d.uniqueID]||(c[d.uniqueID]={}))[t]=[w,_]),d!==e)););return(_-=r)===n||_%n==0&&_/n>=0}}},PSEUDO:function(t,e){var i,r=n.pseudos[t]||n.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return r[x]?r(e):r.length>1?(i=[t,t,"",e],n.setFilters.hasOwnProperty(t.toLowerCase())?ut((function(t,i){for(var n,s=r(t,e),o=s.length;o--;)t[n=I(t,s[o])]=!(i[n]=s[o])})):function(t){return r(t,0,i)}):r}},pseudos:{not:ut((function(t){var e=[],i=[],n=a(t.replace(H,"$1"));return n[x]?ut((function(t,e,i,r){for(var s,o=n(t,null,r,[]),a=t.length;a--;)(s=o[a])&&(t[a]=!(e[a]=s))})):function(t,r,s){return e[0]=t,n(e,null,s,i),e[0]=null,!i.pop()}})),has:ut((function(t){return function(e){return at(t,e).length>0}})),contains:ut((function(t){return t=t.replace(et,it),function(e){return(e.textContent||r(e)).indexOf(t)>-1}})),lang:ut((function(t){return X.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,it).toLowerCase(),function(e){var i;do{if(i=m?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(i=i.toLowerCase())===t||0===i.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var i=t.location&&t.location.hash;return i&&i.slice(1)===e.id},root:function(t){return t===f},focus:function(t){return t===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:mt(!1),disabled:mt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!n.pseudos.empty(t)},header:function(t){return K.test(t.nodeName)},input:function(t){return Z.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:vt((function(){return[0]})),last:vt((function(t,e){return[e-1]})),eq:vt((function(t,e,i){return[i<0?i+e:i]})),even:vt((function(t,e){for(var i=0;i<e;i+=2)t.push(i);return t})),odd:vt((function(t,e){for(var i=1;i<e;i+=2)t.push(i);return t})),lt:vt((function(t,e,i){for(var n=i<0?i+e:i>e?e:i;--n>=0;)t.push(n);return t})),gt:vt((function(t,e,i){for(var n=i<0?i+e:i;++n<e;)t.push(n);return t}))}}).pseudos.nth=n.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})n.pseudos[e]=pt(e);for(e in{submit:!0,reset:!0})n.pseudos[e]=ft(e);function yt(){}function _t(t){for(var e=0,i=t.length,n="";e<i;e++)n+=t[e].value;return n}function xt(t,e,i){var n=e.dir,r=e.next,s=r||n,o=i&&"parentNode"===s,a=T++;return e.first?function(e,i,r){for(;e=e[n];)if(1===e.nodeType||o)return t(e,i,r);return!1}:function(e,i,h){var u,l,c,d=[w,a];if(h){for(;e=e[n];)if((1===e.nodeType||o)&&t(e,i,h))return!0}else for(;e=e[n];)if(1===e.nodeType||o)if(l=(c=e[x]||(e[x]={}))[e.uniqueID]||(c[e.uniqueID]={}),r&&r===e.nodeName.toLowerCase())e=e[n]||e;else{if((u=l[s])&&u[0]===w&&u[1]===a)return d[2]=u[2];if(l[s]=d,d[2]=t(e,i,h))return!0}return!1}}function bt(t){return t.length>1?function(e,i,n){for(var r=t.length;r--;)if(!t[r](e,i,n))return!1;return!0}:t[0]}function wt(t,e,i,n,r){for(var s,o=[],a=0,h=t.length,u=null!=e;a<h;a++)(s=t[a])&&(i&&!i(s,n,r)||(o.push(s),u&&e.push(a)));return o}function Tt(t,e,i,n,r,s){return n&&!n[x]&&(n=Tt(n)),r&&!r[x]&&(r=Tt(r,s)),ut((function(s,o,a,h){var u,l,c,d=[],p=[],f=o.length,m=s||function(t,e,i){for(var n=0,r=e.length;n<r;n++)at(t,e[n],i);return i}(e||"*",a.nodeType?[a]:a,[]),v=!t||!s&&e?m:wt(m,d,t,a,h),g=i?r||(s?t:f||n)?[]:o:v;if(i&&i(v,g,a,h),n)for(u=wt(g,p),n(u,[],a,h),l=u.length;l--;)(c=u[l])&&(g[p[l]]=!(v[p[l]]=c));if(s){if(r||t){if(r){for(u=[],l=g.length;l--;)(c=g[l])&&u.push(v[l]=c);r(null,g=[],u,h)}for(l=g.length;l--;)(c=g[l])&&(u=r?I(s,c):d[l])>-1&&(s[u]=!(o[u]=c))}}else g=wt(g===o?g.splice(f,g.length):g),r?r(null,o,g,h):k.apply(o,g)}))}function Mt(t){for(var e,i,r,s=t.length,o=n.relative[t[0].type],a=o||n.relative[" "],h=o?1:0,l=xt((function(t){return t===e}),a,!0),c=xt((function(t){return I(e,t)>-1}),a,!0),d=[function(t,i,n){var r=!o&&(n||i!==u)||((e=i).nodeType?l(t,i,n):c(t,i,n));return e=null,r}];h<s;h++)if(i=n.relative[t[h].type])d=[xt(bt(d),i)];else{if((i=n.filter[t[h].type].apply(null,t[h].matches))[x]){for(r=++h;r<s&&!n.relative[t[r].type];r++);return Tt(h>1&&bt(d),h>1&&_t(t.slice(0,h-1).concat({value:" "===t[h-2].type?"*":""})).replace(H,"$1"),i,h<r&&Mt(t.slice(h,r)),r<s&&Mt(t=t.slice(r)),r<s&&_t(t))}d.push(i)}return bt(d)}return yt.prototype=n.filters=n.pseudos,n.setFilters=new yt,o=at.tokenize=function(t,e){var i,r,s,o,a,h,u,l=S[t+" "];if(l)return e?0:l.slice(0);for(a=t,h=[],u=n.preFilter;a;){for(o in i&&!(r=z.exec(a))||(r&&(a=a.slice(r[0].length)||a),h.push(s=[])),i=!1,(r=W.exec(a))&&(i=r.shift(),s.push({value:i,type:r[0].replace(H," ")}),a=a.slice(i.length)),n.filter)!(r=q[o].exec(a))||u[o]&&!(r=u[o](r))||(i=r.shift(),s.push({value:i,type:o,matches:r}),a=a.slice(i.length));if(!i)break}return e?a.length:a?at.error(t):S(t,h).slice(0)},a=at.compile=function(t,e){var i,r=[],s=[],a=E[t+" "];if(!a){for(e||(e=o(t)),i=e.length;i--;)(a=Mt(e[i]))[x]?r.push(a):s.push(a);(a=E(t,function(t,e){var i=e.length>0,r=t.length>0,s=function(s,o,a,h,l){var c,f,v,g=0,y="0",_=s&&[],x=[],b=u,T=s||r&&n.find.TAG("*",l),M=w+=null==b?1:Math.random()||.1,S=T.length;for(l&&(u=o==p||o||l);y!==S&&null!=(c=T[y]);y++){if(r&&c){for(f=0,o||c.ownerDocument==p||(d(c),a=!m);v=t[f++];)if(v(c,o||p,a)){h.push(c);break}l&&(w=M)}i&&((c=!v&&c)&&g--,s&&_.push(c))}if(g+=y,i&&y!==g){for(f=0;v=e[f++];)v(_,x,o,a);if(s){if(g>0)for(;y--;)_[y]||x[y]||(x[y]=C.call(h));x=wt(x)}k.apply(h,x),l&&!s&&x.length>0&&g+e.length>1&&at.uniqueSort(h)}return l&&(w=M,u=b),_};return i?ut(s):s}(s,r))).selector=t}return a},h=at.select=function(t,e,i,r){var s,h,u,l,c,d="function"==typeof t&&t,p=!r&&o(t=d.selector||t);if(i=i||[],1===p.length){if((h=p[0]=p[0].slice(0)).length>2&&"ID"===(u=h[0]).type&&9===e.nodeType&&m&&n.relative[h[1].type]){if(!(e=(n.find.ID(u.matches[0].replace(et,it),e)||[])[0]))return i;d&&(e=e.parentNode),t=t.slice(h.shift().value.length)}for(s=q.needsContext.test(t)?0:h.length;s--&&(u=h[s],!n.relative[l=u.type]);)if((c=n.find[l])&&(r=c(u.matches[0].replace(et,it),tt.test(h[0].type)&&gt(e.parentNode)||e))){if(h.splice(s,1),!(t=r.length&&_t(h)))return k.apply(i,r),i;break}}return(d||a(t,p))(r,e,!m,i,!e||tt.test(t)&&gt(e.parentNode)||e),i},i.sortStable=x.split("").sort(A).join("")===x,i.detectDuplicates=!!c,d(),i.sortDetached=lt((function(t){return 1&t.compareDocumentPosition(p.createElement("fieldset"))})),lt((function(t){return t.innerHTML="<a href='#'></a>","#"===t.firstChild.getAttribute("href")}))||ct("type|href|height|width",(function(t,e,i){if(!i)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),i.attributes&&lt((function(t){return t.innerHTML="<input/>",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||ct("value",(function(t,e,i){if(!i&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),lt((function(t){return null==t.getAttribute("disabled")}))||ct(Y,(function(t,e,i){var n;if(!i)return!0===t[e]?e.toLowerCase():(n=t.getAttributeNode(e))&&n.specified?n.value:null})),at}(n);M.find=E,M.expr=E.selectors,M.expr[":"]=M.expr.pseudos,M.uniqueSort=M.unique=E.uniqueSort,M.text=E.getText,M.isXMLDoc=E.isXML,M.contains=E.contains,M.escapeSelector=E.escape;var L=function(t,e,i){for(var n=[],r=void 0!==i;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(r&&M(t).is(i))break;n.push(t)}return n},A=function(t,e){for(var i=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&i.push(t);return i},D=M.expr.match.needsContext;function P(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function O(t,e,i){return g(e)?M.grep(t,(function(t,n){return!!e.call(t,n,t)!==i})):e.nodeType?M.grep(t,(function(t){return t===e!==i})):"string"!=typeof e?M.grep(t,(function(t){return l.call(e,t)>-1!==i})):M.filter(e,t,i)}M.filter=function(t,e,i){var n=e[0];return i&&(t=":not("+t+")"),1===e.length&&1===n.nodeType?M.find.matchesSelector(n,t)?[n]:[]:M.find.matches(t,M.grep(e,(function(t){return 1===t.nodeType})))},M.fn.extend({find:function(t){var e,i,n=this.length,r=this;if("string"!=typeof t)return this.pushStack(M(t).filter((function(){for(e=0;e<n;e++)if(M.contains(r[e],this))return!0})));for(i=this.pushStack([]),e=0;e<n;e++)M.find(t,r[e],i);return n>1?M.uniqueSort(i):i},filter:function(t){return this.pushStack(O(this,t||[],!1))},not:function(t){return this.pushStack(O(this,t||[],!0))},is:function(t){return!!O(this,"string"==typeof t&&D.test(t)?M(t):t||[],!1).length}});var k,R=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(M.fn.init=function(t,e,i){var n,r;if(!t)return this;if(i=i||k,"string"==typeof t){if(!(n="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:R.exec(t))||!n[1]&&e)return!e||e.jquery?(e||i).find(t):this.constructor(e).find(t);if(n[1]){if(e=e instanceof M?e[0]:e,M.merge(this,M.parseHTML(n[1],e&&e.nodeType?e.ownerDocument||e:_,!0)),C.test(n[1])&&M.isPlainObject(e))for(n in e)g(this[n])?this[n](e[n]):this.attr(n,e[n]);return this}return(r=_.getElementById(n[2]))&&(this[0]=r,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==i.ready?i.ready(t):t(M):M.makeArray(t,this)}).prototype=M.fn,k=M(_);var I=/^(?:parents|prev(?:Until|All))/,Y={children:!0,contents:!0,next:!0,prev:!0};function F(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}M.fn.extend({has:function(t){var e=M(t,this),i=e.length;return this.filter((function(){for(var t=0;t<i;t++)if(M.contains(this,e[t]))return!0}))},closest:function(t,e){var i,n=0,r=this.length,s=[],o="string"!=typeof t&&M(t);if(!D.test(t))for(;n<r;n++)for(i=this[n];i&&i!==e;i=i.parentNode)if(i.nodeType<11&&(o?o.index(i)>-1:1===i.nodeType&&M.find.matchesSelector(i,t))){s.push(i);break}return this.pushStack(s.length>1?M.uniqueSort(s):s)},index:function(t){return t?"string"==typeof t?l.call(M(t),this[0]):l.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(M.uniqueSort(M.merge(this.get(),M(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),M.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return L(t,"parentNode")},parentsUntil:function(t,e,i){return L(t,"parentNode",i)},next:function(t){return F(t,"nextSibling")},prev:function(t){return F(t,"previousSibling")},nextAll:function(t){return L(t,"nextSibling")},prevAll:function(t){return L(t,"previousSibling")},nextUntil:function(t,e,i){return L(t,"nextSibling",i)},prevUntil:function(t,e,i){return L(t,"previousSibling",i)},siblings:function(t){return A((t.parentNode||{}).firstChild,t)},children:function(t){return A(t.firstChild)},contents:function(t){return null!=t.contentDocument&&o(t.contentDocument)?t.contentDocument:(P(t,"template")&&(t=t.content||t),M.merge([],t.childNodes))}},(function(t,e){M.fn[t]=function(i,n){var r=M.map(this,e,i);return"Until"!==t.slice(-5)&&(n=i),n&&"string"==typeof n&&(r=M.filter(n,r)),this.length>1&&(Y[t]||M.uniqueSort(r),I.test(t)&&r.reverse()),this.pushStack(r)}}));var N=/[^\x20\t\r\n\f]+/g;function B(t){return t}function U(t){throw t}function j(t,e,i,n){var r;try{t&&g(r=t.promise)?r.call(t).done(e).fail(i):t&&g(r=t.then)?r.call(t,e,i):e.apply(void 0,[t].slice(n))}catch(t){i.apply(void 0,[t])}}M.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return M.each(t.match(N)||[],(function(t,i){e[i]=!0})),e}(t):M.extend({},t);var e,i,n,r,s=[],o=[],a=-1,h=function(){for(r=r||t.once,n=e=!0;o.length;a=-1)for(i=o.shift();++a<s.length;)!1===s[a].apply(i[0],i[1])&&t.stopOnFalse&&(a=s.length,i=!1);t.memory||(i=!1),e=!1,r&&(s=i?[]:"")},u={add:function(){return s&&(i&&!e&&(a=s.length-1,o.push(i)),function e(i){M.each(i,(function(i,n){g(n)?t.unique&&u.has(n)||s.push(n):n&&n.length&&"string"!==w(n)&&e(n)}))}(arguments),i&&!e&&h()),this},remove:function(){return M.each(arguments,(function(t,e){for(var i;(i=M.inArray(e,s,i))>-1;)s.splice(i,1),i<=a&&a--})),this},has:function(t){return t?M.inArray(t,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return r=o=[],s=i="",this},disabled:function(){return!s},lock:function(){return r=o=[],i||e||(s=i=""),this},locked:function(){return!!r},fireWith:function(t,i){return r||(i=[t,(i=i||[]).slice?i.slice():i],o.push(i),e||h()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!n}};return u},M.extend({Deferred:function(t){var e=[["notify","progress",M.Callbacks("memory"),M.Callbacks("memory"),2],["resolve","done",M.Callbacks("once memory"),M.Callbacks("once memory"),0,"resolved"],["reject","fail",M.Callbacks("once memory"),M.Callbacks("once memory"),1,"rejected"]],i="pending",r={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},catch:function(t){return r.then(null,t)},pipe:function(){var t=arguments;return M.Deferred((function(i){M.each(e,(function(e,n){var r=g(t[n[4]])&&t[n[4]];s[n[1]]((function(){var t=r&&r.apply(this,arguments);t&&g(t.promise)?t.promise().progress(i.notify).done(i.resolve).fail(i.reject):i[n[0]+"With"](this,r?[t]:arguments)}))})),t=null})).promise()},then:function(t,i,r){var s=0;function o(t,e,i,r){return function(){var a=this,h=arguments,u=function(){var n,u;if(!(t<s)){if((n=i.apply(a,h))===e.promise())throw new TypeError("Thenable self-resolution");u=n&&("object"==typeof n||"function"==typeof n)&&n.then,g(u)?r?u.call(n,o(s,e,B,r),o(s,e,U,r)):(s++,u.call(n,o(s,e,B,r),o(s,e,U,r),o(s,e,B,e.notifyWith))):(i!==B&&(a=void 0,h=[n]),(r||e.resolveWith)(a,h))}},l=r?u:function(){try{u()}catch(n){M.Deferred.exceptionHook&&M.Deferred.exceptionHook(n,l.stackTrace),t+1>=s&&(i!==U&&(a=void 0,h=[n]),e.rejectWith(a,h))}};t?l():(M.Deferred.getStackHook&&(l.stackTrace=M.Deferred.getStackHook()),n.setTimeout(l))}}return M.Deferred((function(n){e[0][3].add(o(0,n,g(r)?r:B,n.notifyWith)),e[1][3].add(o(0,n,g(t)?t:B)),e[2][3].add(o(0,n,g(i)?i:U))})).promise()},promise:function(t){return null!=t?M.extend(t,r):r}},s={};return M.each(e,(function(t,n){var o=n[2],a=n[5];r[n[1]]=o.add,a&&o.add((function(){i=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),o.add(n[3].fire),s[n[0]]=function(){return s[n[0]+"With"](this===s?void 0:this,arguments),this},s[n[0]+"With"]=o.fireWith})),r.promise(s),t&&t.call(s,s),s},when:function(t){var e=arguments.length,i=e,n=Array(i),r=a.call(arguments),s=M.Deferred(),o=function(t){return function(i){n[t]=this,r[t]=arguments.length>1?a.call(arguments):i,--e||s.resolveWith(n,r)}};if(e<=1&&(j(t,s.done(o(i)).resolve,s.reject,!e),"pending"===s.state()||g(r[i]&&r[i].then)))return s.then();for(;i--;)j(r[i],o(i),s.reject);return s.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;M.Deferred.exceptionHook=function(t,e){n.console&&n.console.warn&&t&&H.test(t.name)&&n.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},M.readyException=function(t){n.setTimeout((function(){throw t}))};var z=M.Deferred();function W(){_.removeEventListener("DOMContentLoaded",W),n.removeEventListener("load",W),M.ready()}M.fn.ready=function(t){return z.then(t).catch((function(t){M.readyException(t)})),this},M.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--M.readyWait:M.isReady)||(M.isReady=!0,!0!==t&&--M.readyWait>0||z.resolveWith(_,[M]))}}),M.ready.then=z.then,"complete"===_.readyState||"loading"!==_.readyState&&!_.documentElement.doScroll?n.setTimeout(M.ready):(_.addEventListener("DOMContentLoaded",W),n.addEventListener("load",W));var G=function(t,e,i,n,r,s,o){var a=0,h=t.length,u=null==i;if("object"===w(i))for(a in r=!0,i)G(t,e,a,i[a],!0,s,o);else if(void 0!==n&&(r=!0,g(n)||(o=!0),u&&(o?(e.call(t,n),e=null):(u=e,e=function(t,e,i){return u.call(M(t),i)})),e))for(;a<h;a++)e(t[a],i,o?n:n.call(t[a],a,e(t[a],i)));return r?t:u?e.call(t):h?e(t[0],i):s},V=/^-ms-/,X=/-([a-z])/g;function q(t,e){return e.toUpperCase()}function J(t){return t.replace(V,"ms-").replace(X,q)}var Z=function(t){return 1===t.nodeType||9===t.nodeType||!+t.nodeType};function K(){this.expando=M.expando+K.uid++}K.uid=1,K.prototype={cache:function(t){var e=t[this.expando];return e||(e=Object.create(null),Z(t)&&(t.nodeType?t[this.expando]=e:Object.defineProperty(t,this.expando,{value:e,configurable:!0}))),e},set:function(t,e,i){var n,r=this.cache(t);if("string"==typeof e)r[J(e)]=i;else for(n in e)r[J(n)]=e[n];return r},get:function(t,e){return void 0===e?this.cache(t):t[this.expando]&&t[this.expando][J(e)]},access:function(t,e,i){return void 0===e||e&&"string"==typeof e&&void 0===i?this.get(t,e):(this.set(t,e,i),void 0!==i?i:e)},remove:function(t,e){var i,n=t[this.expando];if(void 0!==n){if(void 0!==e){i=(e=Array.isArray(e)?e.map(J):(e=J(e))in n?[e]:e.match(N)||[]).length;for(;i--;)delete n[e[i]]}(void 0===e||M.isEmptyObject(n))&&(t.nodeType?t[this.expando]=void 0:delete t[this.expando])}},hasData:function(t){var e=t[this.expando];return void 0!==e&&!M.isEmptyObject(e)}};var Q=new K,$=new K,tt=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,et=/[A-Z]/g;function it(t,e,i){var n;if(void 0===i&&1===t.nodeType)if(n="data-"+e.replace(et,"-$&").toLowerCase(),"string"==typeof(i=t.getAttribute(n))){try{i=function(t){return"true"===t||"false"!==t&&("null"===t?null:t===+t+""?+t:tt.test(t)?JSON.parse(t):t)}(i)}catch(t){}$.set(t,e,i)}else i=void 0;return i}M.extend({hasData:function(t){return $.hasData(t)||Q.hasData(t)},data:function(t,e,i){return $.access(t,e,i)},removeData:function(t,e){$.remove(t,e)},_data:function(t,e,i){return Q.access(t,e,i)},_removeData:function(t,e){Q.remove(t,e)}}),M.fn.extend({data:function(t,e){var i,n,r,s=this[0],o=s&&s.attributes;if(void 0===t){if(this.length&&(r=$.get(s),1===s.nodeType&&!Q.get(s,"hasDataAttrs"))){for(i=o.length;i--;)o[i]&&0===(n=o[i].name).indexOf("data-")&&(n=J(n.slice(5)),it(s,n,r[n]));Q.set(s,"hasDataAttrs",!0)}return r}return"object"==typeof t?this.each((function(){$.set(this,t)})):G(this,(function(e){var i;if(s&&void 0===e)return void 0!==(i=$.get(s,t))||void 0!==(i=it(s,t))?i:void 0;this.each((function(){$.set(this,t,e)}))}),null,e,arguments.length>1,null,!0)},removeData:function(t){return this.each((function(){$.remove(this,t)}))}}),M.extend({queue:function(t,e,i){var n;if(t)return e=(e||"fx")+"queue",n=Q.get(t,e),i&&(!n||Array.isArray(i)?n=Q.access(t,e,M.makeArray(i)):n.push(i)),n||[]},dequeue:function(t,e){e=e||"fx";var i=M.queue(t,e),n=i.length,r=i.shift(),s=M._queueHooks(t,e);"inprogress"===r&&(r=i.shift(),n--),r&&("fx"===e&&i.unshift("inprogress"),delete s.stop,r.call(t,(function(){M.dequeue(t,e)}),s)),!n&&s&&s.empty.fire()},_queueHooks:function(t,e){var i=e+"queueHooks";return Q.get(t,i)||Q.access(t,i,{empty:M.Callbacks("once memory").add((function(){Q.remove(t,[e+"queue",i])}))})}}),M.fn.extend({queue:function(t,e){var i=2;return"string"!=typeof t&&(e=t,t="fx",i--),arguments.length<i?M.queue(this[0],t):void 0===e?this:this.each((function(){var i=M.queue(this,t,e);M._queueHooks(this,t),"fx"===t&&"inprogress"!==i[0]&&M.dequeue(this,t)}))},dequeue:function(t){return this.each((function(){M.dequeue(this,t)}))},clearQueue:function(t){return this.queue(t||"fx",[])},promise:function(t,e){var i,n=1,r=M.Deferred(),s=this,o=this.length,a=function(){--n||r.resolveWith(s,[s])};for("string"!=typeof t&&(e=t,t=void 0),t=t||"fx";o--;)(i=Q.get(s[o],t+"queueHooks"))&&i.empty&&(n++,i.empty.add(a));return a(),r.promise(e)}});var nt=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,rt=new RegExp("^(?:([+-])=|)("+nt+")([a-z%]*)$","i"),st=["Top","Right","Bottom","Left"],ot=_.documentElement,at=function(t){return M.contains(t.ownerDocument,t)},ht={composed:!0};ot.getRootNode&&(at=function(t){return M.contains(t.ownerDocument,t)||t.getRootNode(ht)===t.ownerDocument});var ut=function(t,e){return"none"===(t=e||t).style.display||""===t.style.display&&at(t)&&"none"===M.css(t,"display")};function lt(t,e,i,n){var r,s,o=20,a=n?function(){return n.cur()}:function(){return M.css(t,e,"")},h=a(),u=i&&i[3]||(M.cssNumber[e]?"":"px"),l=t.nodeType&&(M.cssNumber[e]||"px"!==u&&+h)&&rt.exec(M.css(t,e));if(l&&l[3]!==u){for(h/=2,u=u||l[3],l=+h||1;o--;)M.style(t,e,l+u),(1-s)*(1-(s=a()/h||.5))<=0&&(o=0),l/=s;l*=2,M.style(t,e,l+u),i=i||[]}return i&&(l=+l||+h||0,r=i[1]?l+(i[1]+1)*i[2]:+i[2],n&&(n.unit=u,n.start=l,n.end=r)),r}var ct={};function dt(t){var e,i=t.ownerDocument,n=t.nodeName,r=ct[n];return r||(e=i.body.appendChild(i.createElement(n)),r=M.css(e,"display"),e.parentNode.removeChild(e),"none"===r&&(r="block"),ct[n]=r,r)}function pt(t,e){for(var i,n,r=[],s=0,o=t.length;s<o;s++)(n=t[s]).style&&(i=n.style.display,e?("none"===i&&(r[s]=Q.get(n,"display")||null,r[s]||(n.style.display="")),""===n.style.display&&ut(n)&&(r[s]=dt(n))):"none"!==i&&(r[s]="none",Q.set(n,"display",i)));for(s=0;s<o;s++)null!=r[s]&&(t[s].style.display=r[s]);return t}M.fn.extend({show:function(){return pt(this,!0)},hide:function(){return pt(this)},toggle:function(t){return"boolean"==typeof t?t?this.show():this.hide():this.each((function(){ut(this)?M(this).show():M(this).hide()}))}});var ft,mt,vt=/^(?:checkbox|radio)$/i,gt=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;ft=_.createDocumentFragment().appendChild(_.createElement("div")),(mt=_.createElement("input")).setAttribute("type","radio"),mt.setAttribute("checked","checked"),mt.setAttribute("name","t"),ft.appendChild(mt),v.checkClone=ft.cloneNode(!0).cloneNode(!0).lastChild.checked,ft.innerHTML="<textarea>x</textarea>",v.noCloneChecked=!!ft.cloneNode(!0).lastChild.defaultValue,ft.innerHTML="<option></option>",v.option=!!ft.lastChild;var _t={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function xt(t,e){var i;return i=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&P(t,e)?M.merge([t],i):i}function bt(t,e){for(var i=0,n=t.length;i<n;i++)Q.set(t[i],"globalEval",!e||Q.get(e[i],"globalEval"))}_t.tbody=_t.tfoot=_t.colgroup=_t.caption=_t.thead,_t.th=_t.td,v.option||(_t.optgroup=_t.option=[1,"<select multiple='multiple'>","</select>"]);var wt=/<|&#?\w+;/;function Tt(t,e,i,n,r){for(var s,o,a,h,u,l,c=e.createDocumentFragment(),d=[],p=0,f=t.length;p<f;p++)if((s=t[p])||0===s)if("object"===w(s))M.merge(d,s.nodeType?[s]:s);else if(wt.test(s)){for(o=o||c.appendChild(e.createElement("div")),a=(gt.exec(s)||["",""])[1].toLowerCase(),h=_t[a]||_t._default,o.innerHTML=h[1]+M.htmlPrefilter(s)+h[2],l=h[0];l--;)o=o.lastChild;M.merge(d,o.childNodes),(o=c.firstChild).textContent=""}else d.push(e.createTextNode(s));for(c.textContent="",p=0;s=d[p++];)if(n&&M.inArray(s,n)>-1)r&&r.push(s);else if(u=at(s),o=xt(c.appendChild(s),"script"),u&&bt(o),i)for(l=0;s=o[l++];)yt.test(s.type||"")&&i.push(s);return c}var Mt=/^key/,St=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Et=/^([^.]*)(?:\.(.+)|)/;function Lt(){return!0}function At(){return!1}function Dt(t,e){return t===function(){try{return _.activeElement}catch(t){}}()==("focus"===e)}function Pt(t,e,i,n,r,s){var o,a;if("object"==typeof e){for(a in"string"!=typeof i&&(n=n||i,i=void 0),e)Pt(t,a,i,n,e[a],s);return t}if(null==n&&null==r?(r=i,n=i=void 0):null==r&&("string"==typeof i?(r=n,n=void 0):(r=n,n=i,i=void 0)),!1===r)r=At;else if(!r)return t;return 1===s&&(o=r,(r=function(t){return M().off(t),o.apply(this,arguments)}).guid=o.guid||(o.guid=M.guid++)),t.each((function(){M.event.add(this,e,r,n,i)}))}function Ct(t,e,i){i?(Q.set(t,e,!1),M.event.add(t,e,{namespace:!1,handler:function(t){var n,r,s=Q.get(this,e);if(1&t.isTrigger&&this[e]){if(s.length)(M.event.special[e]||{}).delegateType&&t.stopPropagation();else if(s=a.call(arguments),Q.set(this,e,s),n=i(this,e),this[e](),s!==(r=Q.get(this,e))||n?Q.set(this,e,!1):r={},s!==r)return t.stopImmediatePropagation(),t.preventDefault(),r.value}else s.length&&(Q.set(this,e,{value:M.event.trigger(M.extend(s[0],M.Event.prototype),s.slice(1),this)}),t.stopImmediatePropagation())}})):void 0===Q.get(t,e)&&M.event.add(t,e,Lt)}M.event={global:{},add:function(t,e,i,n,r){var s,o,a,h,u,l,c,d,p,f,m,v=Q.get(t);if(Z(t))for(i.handler&&(i=(s=i).handler,r=s.selector),r&&M.find.matchesSelector(ot,r),i.guid||(i.guid=M.guid++),(h=v.events)||(h=v.events=Object.create(null)),(o=v.handle)||(o=v.handle=function(e){return void 0!==M&&M.event.triggered!==e.type?M.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(N)||[""]).length;u--;)p=m=(a=Et.exec(e[u])||[])[1],f=(a[2]||"").split(".").sort(),p&&(c=M.event.special[p]||{},p=(r?c.delegateType:c.bindType)||p,c=M.event.special[p]||{},l=M.extend({type:p,origType:m,data:n,handler:i,guid:i.guid,selector:r,needsContext:r&&M.expr.match.needsContext.test(r),namespace:f.join(".")},s),(d=h[p])||((d=h[p]=[]).delegateCount=0,c.setup&&!1!==c.setup.call(t,n,f,o)||t.addEventListener&&t.addEventListener(p,o)),c.add&&(c.add.call(t,l),l.handler.guid||(l.handler.guid=i.guid)),r?d.splice(d.delegateCount++,0,l):d.push(l),M.event.global[p]=!0)},remove:function(t,e,i,n,r){var s,o,a,h,u,l,c,d,p,f,m,v=Q.hasData(t)&&Q.get(t);if(v&&(h=v.events)){for(u=(e=(e||"").match(N)||[""]).length;u--;)if(p=m=(a=Et.exec(e[u])||[])[1],f=(a[2]||"").split(".").sort(),p){for(c=M.event.special[p]||{},d=h[p=(n?c.delegateType:c.bindType)||p]||[],a=a[2]&&new RegExp("(^|\\.)"+f.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=s=d.length;s--;)l=d[s],!r&&m!==l.origType||i&&i.guid!==l.guid||a&&!a.test(l.namespace)||n&&n!==l.selector&&("**"!==n||!l.selector)||(d.splice(s,1),l.selector&&d.delegateCount--,c.remove&&c.remove.call(t,l));o&&!d.length&&(c.teardown&&!1!==c.teardown.call(t,f,v.handle)||M.removeEvent(t,p,v.handle),delete h[p])}else for(p in h)M.event.remove(t,p+e[u],i,n,!0);M.isEmptyObject(h)&&Q.remove(t,"handle events")}},dispatch:function(t){var e,i,n,r,s,o,a=new Array(arguments.length),h=M.event.fix(t),u=(Q.get(this,"events")||Object.create(null))[h.type]||[],l=M.event.special[h.type]||{};for(a[0]=h,e=1;e<arguments.length;e++)a[e]=arguments[e];if(h.delegateTarget=this,!l.preDispatch||!1!==l.preDispatch.call(this,h)){for(o=M.event.handlers.call(this,h,u),e=0;(r=o[e++])&&!h.isPropagationStopped();)for(h.currentTarget=r.elem,i=0;(s=r.handlers[i++])&&!h.isImmediatePropagationStopped();)h.rnamespace&&!1!==s.namespace&&!h.rnamespace.test(s.namespace)||(h.handleObj=s,h.data=s.data,void 0!==(n=((M.event.special[s.origType]||{}).handle||s.handler).apply(r.elem,a))&&!1===(h.result=n)&&(h.preventDefault(),h.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,h),h.result}},handlers:function(t,e){var i,n,r,s,o,a=[],h=e.delegateCount,u=t.target;if(h&&u.nodeType&&!("click"===t.type&&t.button>=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(s=[],o={},i=0;i<h;i++)void 0===o[r=(n=e[i]).selector+" "]&&(o[r]=n.needsContext?M(r,this).index(u)>-1:M.find(r,this,null,[u]).length),o[r]&&s.push(n);s.length&&a.push({elem:u,handlers:s})}return u=this,h<e.length&&a.push({elem:u,handlers:e.slice(h)}),a},addProp:function(t,e){Object.defineProperty(M.Event.prototype,t,{enumerable:!0,configurable:!0,get:g(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(t){return t[M.expando]?t:new M.Event(t)},special:{load:{noBubble:!0},click:{setup:function(t){var e=this||t;return vt.test(e.type)&&e.click&&P(e,"input")&&Ct(e,"click",Lt),!1},trigger:function(t){var e=this||t;return vt.test(e.type)&&e.click&&P(e,"input")&&Ct(e,"click"),!0},_default:function(t){var e=t.target;return vt.test(e.type)&&e.click&&P(e,"input")&&Q.get(e,"click")||P(e,"a")}},beforeunload:{postDispatch:function(t){void 0!==t.result&&t.originalEvent&&(t.originalEvent.returnValue=t.result)}}}},M.removeEvent=function(t,e,i){t.removeEventListener&&t.removeEventListener(e,i)},M.Event=function(t,e){if(!(this instanceof M.Event))return new M.Event(t,e);t&&t.type?(this.originalEvent=t,this.type=t.type,this.isDefaultPrevented=t.defaultPrevented||void 0===t.defaultPrevented&&!1===t.returnValue?Lt:At,this.target=t.target&&3===t.target.nodeType?t.target.parentNode:t.target,this.currentTarget=t.currentTarget,this.relatedTarget=t.relatedTarget):this.type=t,e&&M.extend(this,e),this.timeStamp=t&&t.timeStamp||Date.now(),this[M.expando]=!0},M.Event.prototype={constructor:M.Event,isDefaultPrevented:At,isPropagationStopped:At,isImmediatePropagationStopped:At,isSimulated:!1,preventDefault:function(){var t=this.originalEvent;this.isDefaultPrevented=Lt,t&&!this.isSimulated&&t.preventDefault()},stopPropagation:function(){var t=this.originalEvent;this.isPropagationStopped=Lt,t&&!this.isSimulated&&t.stopPropagation()},stopImmediatePropagation:function(){var t=this.originalEvent;this.isImmediatePropagationStopped=Lt,t&&!this.isSimulated&&t.stopImmediatePropagation(),this.stopPropagation()}},M.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(t){var e=t.button;return null==t.which&&Mt.test(t.type)?null!=t.charCode?t.charCode:t.keyCode:!t.which&&void 0!==e&&St.test(t.type)?1&e?1:2&e?3:4&e?2:0:t.which}},M.event.addProp),M.each({focus:"focusin",blur:"focusout"},(function(t,e){M.event.special[t]={setup:function(){return Ct(this,t,Dt),!1},trigger:function(){return Ct(this,t),!0},delegateType:e}})),M.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},(function(t,e){M.event.special[t]={delegateType:e,bindType:e,handle:function(t){var i,n=this,r=t.relatedTarget,s=t.handleObj;return r&&(r===n||M.contains(n,r))||(t.type=s.origType,i=s.handler.apply(this,arguments),t.type=e),i}}})),M.fn.extend({on:function(t,e,i,n){return Pt(this,t,e,i,n)},one:function(t,e,i,n){return Pt(this,t,e,i,n,1)},off:function(t,e,i){var n,r;if(t&&t.preventDefault&&t.handleObj)return n=t.handleObj,M(t.delegateTarget).off(n.namespace?n.origType+"."+n.namespace:n.origType,n.selector,n.handler),this;if("object"==typeof t){for(r in t)this.off(r,e,t[r]);return this}return!1!==e&&"function"!=typeof e||(i=e,e=void 0),!1===i&&(i=At),this.each((function(){M.event.remove(this,t,i,e)}))}});var Ot=/<script|<style|<link/i,kt=/checked\s*(?:[^=]|=\s*.checked.)/i,Rt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function It(t,e){return P(t,"table")&&P(11!==e.nodeType?e:e.firstChild,"tr")&&M(t).children("tbody")[0]||t}function Yt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Ft(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Nt(t,e){var i,n,r,s,o,a;if(1===e.nodeType){if(Q.hasData(t)&&(a=Q.get(t).events))for(r in Q.remove(e,"handle events"),a)for(i=0,n=a[r].length;i<n;i++)M.event.add(e,r,a[r][i]);$.hasData(t)&&(s=$.access(t),o=M.extend({},s),$.set(e,o))}}function Bt(t,e){var i=e.nodeName.toLowerCase();"input"===i&&vt.test(t.type)?e.checked=t.checked:"input"!==i&&"textarea"!==i||(e.defaultValue=t.defaultValue)}function Ut(t,e,i,n){e=h(e);var r,s,o,a,u,l,c=0,d=t.length,p=d-1,f=e[0],m=g(f);if(m||d>1&&"string"==typeof f&&!v.checkClone&&kt.test(f))return t.each((function(r){var s=t.eq(r);m&&(e[0]=f.call(this,r,s.html())),Ut(s,e,i,n)}));if(d&&(s=(r=Tt(e,t[0].ownerDocument,!1,t,n)).firstChild,1===r.childNodes.length&&(r=s),s||n)){for(a=(o=M.map(xt(r,"script"),Yt)).length;c<d;c++)u=r,c!==p&&(u=M.clone(u,!0,!0),a&&M.merge(o,xt(u,"script"))),i.call(t[c],u,c);if(a)for(l=o[o.length-1].ownerDocument,M.map(o,Ft),c=0;c<a;c++)u=o[c],yt.test(u.type||"")&&!Q.access(u,"globalEval")&&M.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?M._evalUrl&&!u.noModule&&M._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Rt,""),u,l))}return t}function jt(t,e,i){for(var n,r=e?M.filter(e,t):t,s=0;null!=(n=r[s]);s++)i||1!==n.nodeType||M.cleanData(xt(n)),n.parentNode&&(i&&at(n)&&bt(xt(n,"script")),n.parentNode.removeChild(n));return t}M.extend({htmlPrefilter:function(t){return t},clone:function(t,e,i){var n,r,s,o,a=t.cloneNode(!0),h=at(t);if(!(v.noCloneChecked||1!==t.nodeType&&11!==t.nodeType||M.isXMLDoc(t)))for(o=xt(a),n=0,r=(s=xt(t)).length;n<r;n++)Bt(s[n],o[n]);if(e)if(i)for(s=s||xt(t),o=o||xt(a),n=0,r=s.length;n<r;n++)Nt(s[n],o[n]);else Nt(t,a);return(o=xt(a,"script")).length>0&&bt(o,!h&&xt(t,"script")),a},cleanData:function(t){for(var e,i,n,r=M.event.special,s=0;void 0!==(i=t[s]);s++)if(Z(i)){if(e=i[Q.expando]){if(e.events)for(n in e.events)r[n]?M.event.remove(i,n):M.removeEvent(i,n,e.handle);i[Q.expando]=void 0}i[$.expando]&&(i[$.expando]=void 0)}}}),M.fn.extend({detach:function(t){return jt(this,t,!0)},remove:function(t){return jt(this,t)},text:function(t){return G(this,(function(t){return void 0===t?M.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Ut(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||It(this,t).appendChild(t)}))},prepend:function(){return Ut(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=It(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Ut(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Ut(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(M.cleanData(xt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return M.clone(this,t,e)}))},html:function(t){return G(this,(function(t){var e=this[0]||{},i=0,n=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ot.test(t)&&!_t[(gt.exec(t)||["",""])[1].toLowerCase()]){t=M.htmlPrefilter(t);try{for(;i<n;i++)1===(e=this[i]||{}).nodeType&&(M.cleanData(xt(e,!1)),e.innerHTML=t);e=0}catch(t){}}e&&this.empty().append(t)}),null,t,arguments.length)},replaceWith:function(){var t=[];return Ut(this,arguments,(function(e){var i=this.parentNode;M.inArray(this,t)<0&&(M.cleanData(xt(this)),i&&i.replaceChild(e,this))}),t)}}),M.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},(function(t,e){M.fn[t]=function(t){for(var i,n=[],r=M(t),s=r.length-1,o=0;o<=s;o++)i=o===s?this:this.clone(!0),M(r[o])[e](i),u.apply(n,i.get());return this.pushStack(n)}}));var Ht=new RegExp("^("+nt+")(?!px)[a-z%]+$","i"),zt=function(t){var e=t.ownerDocument.defaultView;return e&&e.opener||(e=n),e.getComputedStyle(t)},Wt=function(t,e,i){var n,r,s={};for(r in e)s[r]=t.style[r],t.style[r]=e[r];for(r in n=i.call(t),e)t.style[r]=s[r];return n},Gt=new RegExp(st.join("|"),"i");function Vt(t,e,i){var n,r,s,o,a=t.style;return(i=i||zt(t))&&(""!==(o=i.getPropertyValue(e)||i[e])||at(t)||(o=M.style(t,e)),!v.pixelBoxStyles()&&Ht.test(o)&&Gt.test(e)&&(n=a.width,r=a.minWidth,s=a.maxWidth,a.minWidth=a.maxWidth=a.width=o,o=i.width,a.width=n,a.minWidth=r,a.maxWidth=s)),void 0!==o?o+"":o}function Xt(t,e){return{get:function(){if(!t())return(this.get=e).apply(this,arguments);delete this.get}}}!function(){function t(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ot.appendChild(u).appendChild(l);var t=n.getComputedStyle(l);i="1%"!==t.top,h=12===e(t.marginLeft),l.style.right="60%",o=36===e(t.right),r=36===e(t.width),l.style.position="absolute",s=12===e(l.offsetWidth/3),ot.removeChild(u),l=null}}function e(t){return Math.round(parseFloat(t))}var i,r,s,o,a,h,u=_.createElement("div"),l=_.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",v.clearCloneStyle="content-box"===l.style.backgroundClip,M.extend(v,{boxSizingReliable:function(){return t(),r},pixelBoxStyles:function(){return t(),o},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),h},scrollboxSize:function(){return t(),s},reliableTrDimensions:function(){var t,e,i,r;return null==a&&(t=_.createElement("table"),e=_.createElement("tr"),i=_.createElement("div"),t.style.cssText="position:absolute;left:-11111px",e.style.height="1px",i.style.height="9px",ot.appendChild(t).appendChild(e).appendChild(i),r=n.getComputedStyle(e),a=parseInt(r.height)>3,ot.removeChild(t)),a}}))}();var qt=["Webkit","Moz","ms"],Jt=_.createElement("div").style,Zt={};function Kt(t){var e=M.cssProps[t]||Zt[t];return e||(t in Jt?t:Zt[t]=function(t){for(var e=t[0].toUpperCase()+t.slice(1),i=qt.length;i--;)if((t=qt[i]+e)in Jt)return t}(t)||t)}var Qt=/^(none|table(?!-c[ea]).+)/,$t=/^--/,te={position:"absolute",visibility:"hidden",display:"block"},ee={letterSpacing:"0",fontWeight:"400"};function ie(t,e,i){var n=rt.exec(e);return n?Math.max(0,n[2]-(i||0))+(n[3]||"px"):e}function ne(t,e,i,n,r,s){var o="width"===e?1:0,a=0,h=0;if(i===(n?"border":"content"))return 0;for(;o<4;o+=2)"margin"===i&&(h+=M.css(t,i+st[o],!0,r)),n?("content"===i&&(h-=M.css(t,"padding"+st[o],!0,r)),"margin"!==i&&(h-=M.css(t,"border"+st[o]+"Width",!0,r))):(h+=M.css(t,"padding"+st[o],!0,r),"padding"!==i?h+=M.css(t,"border"+st[o]+"Width",!0,r):a+=M.css(t,"border"+st[o]+"Width",!0,r));return!n&&s>=0&&(h+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-s-h-a-.5))||0),h}function re(t,e,i){var n=zt(t),r=(!v.boxSizingReliable()||i)&&"border-box"===M.css(t,"boxSizing",!1,n),s=r,o=Vt(t,e,n),a="offset"+e[0].toUpperCase()+e.slice(1);if(Ht.test(o)){if(!i)return o;o="auto"}return(!v.boxSizingReliable()&&r||!v.reliableTrDimensions()&&P(t,"tr")||"auto"===o||!parseFloat(o)&&"inline"===M.css(t,"display",!1,n))&&t.getClientRects().length&&(r="border-box"===M.css(t,"boxSizing",!1,n),(s=a in t)&&(o=t[a])),(o=parseFloat(o)||0)+ne(t,e,i||(r?"border":"content"),s,n,o)+"px"}function se(t,e,i,n,r){return new se.prototype.init(t,e,i,n,r)}M.extend({cssHooks:{opacity:{get:function(t,e){if(e){var i=Vt(t,"opacity");return""===i?"1":i}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(t,e,i,n){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var r,s,o,a=J(e),h=$t.test(e),u=t.style;if(h||(e=Kt(a)),o=M.cssHooks[e]||M.cssHooks[a],void 0===i)return o&&"get"in o&&void 0!==(r=o.get(t,!1,n))?r:u[e];"string"===(s=typeof i)&&(r=rt.exec(i))&&r[1]&&(i=lt(t,e,r),s="number"),null!=i&&i==i&&("number"!==s||h||(i+=r&&r[3]||(M.cssNumber[a]?"":"px")),v.clearCloneStyle||""!==i||0!==e.indexOf("background")||(u[e]="inherit"),o&&"set"in o&&void 0===(i=o.set(t,i,n))||(h?u.setProperty(e,i):u[e]=i))}},css:function(t,e,i,n){var r,s,o,a=J(e);return $t.test(e)||(e=Kt(a)),(o=M.cssHooks[e]||M.cssHooks[a])&&"get"in o&&(r=o.get(t,!0,i)),void 0===r&&(r=Vt(t,e,n)),"normal"===r&&e in ee&&(r=ee[e]),""===i||i?(s=parseFloat(r),!0===i||isFinite(s)?s||0:r):r}}),M.each(["height","width"],(function(t,e){M.cssHooks[e]={get:function(t,i,n){if(i)return!Qt.test(M.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?re(t,e,n):Wt(t,te,(function(){return re(t,e,n)}))},set:function(t,i,n){var r,s=zt(t),o=!v.scrollboxSize()&&"absolute"===s.position,a=(o||n)&&"border-box"===M.css(t,"boxSizing",!1,s),h=n?ne(t,e,n,a,s):0;return a&&o&&(h-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(s[e])-ne(t,e,"border",!1,s)-.5)),h&&(r=rt.exec(i))&&"px"!==(r[3]||"px")&&(t.style[e]=i,i=M.css(t,e)),ie(0,i,h)}}})),M.cssHooks.marginLeft=Xt(v.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Vt(t,"marginLeft"))||t.getBoundingClientRect().left-Wt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),M.each({margin:"",padding:"",border:"Width"},(function(t,e){M.cssHooks[t+e]={expand:function(i){for(var n=0,r={},s="string"==typeof i?i.split(" "):[i];n<4;n++)r[t+st[n]+e]=s[n]||s[n-2]||s[0];return r}},"margin"!==t&&(M.cssHooks[t+e].set=ie)})),M.fn.extend({css:function(t,e){return G(this,(function(t,e,i){var n,r,s={},o=0;if(Array.isArray(e)){for(n=zt(t),r=e.length;o<r;o++)s[e[o]]=M.css(t,e[o],!1,n);return s}return void 0!==i?M.style(t,e,i):M.css(t,e)}),t,e,arguments.length>1)}}),M.Tween=se,se.prototype={constructor:se,init:function(t,e,i,n,r,s){this.elem=t,this.prop=i,this.easing=r||M.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=n,this.unit=s||(M.cssNumber[i]?"":"px")},cur:function(){var t=se.propHooks[this.prop];return t&&t.get?t.get(this):se.propHooks._default.get(this)},run:function(t){var e,i=se.propHooks[this.prop];return this.options.duration?this.pos=e=M.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),i&&i.set?i.set(this):se.propHooks._default.set(this),this}},se.prototype.init.prototype=se.prototype,se.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=M.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){M.fx.step[t.prop]?M.fx.step[t.prop](t):1!==t.elem.nodeType||!M.cssHooks[t.prop]&&null==t.elem.style[Kt(t.prop)]?t.elem[t.prop]=t.now:M.style(t.elem,t.prop,t.now+t.unit)}}},se.propHooks.scrollTop=se.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},M.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},M.fx=se.prototype.init,M.fx.step={};var oe,ae,he=/^(?:toggle|show|hide)$/,ue=/queueHooks$/;function le(){ae&&(!1===_.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(le):n.setTimeout(le,M.fx.interval),M.fx.tick())}function ce(){return n.setTimeout((function(){oe=void 0})),oe=Date.now()}function de(t,e){var i,n=0,r={height:t};for(e=e?1:0;n<4;n+=2-e)r["margin"+(i=st[n])]=r["padding"+i]=t;return e&&(r.opacity=r.width=t),r}function pe(t,e,i){for(var n,r=(fe.tweeners[e]||[]).concat(fe.tweeners["*"]),s=0,o=r.length;s<o;s++)if(n=r[s].call(i,e,t))return n}function fe(t,e,i){var n,r,s=0,o=fe.prefilters.length,a=M.Deferred().always((function(){delete h.elem})),h=function(){if(r)return!1;for(var e=oe||ce(),i=Math.max(0,u.startTime+u.duration-e),n=1-(i/u.duration||0),s=0,o=u.tweens.length;s<o;s++)u.tweens[s].run(n);return a.notifyWith(t,[u,n,i]),n<1&&o?i:(o||a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u]),!1)},u=a.promise({elem:t,props:M.extend({},e),opts:M.extend(!0,{specialEasing:{},easing:M.easing._default},i),originalProperties:e,originalOptions:i,startTime:oe||ce(),duration:i.duration,tweens:[],createTween:function(e,i){var n=M.Tween(t,u.opts,e,i,u.opts.specialEasing[e]||u.opts.easing);return u.tweens.push(n),n},stop:function(e){var i=0,n=e?u.tweens.length:0;if(r)return this;for(r=!0;i<n;i++)u.tweens[i].run(1);return e?(a.notifyWith(t,[u,1,0]),a.resolveWith(t,[u,e])):a.rejectWith(t,[u,e]),this}}),l=u.props;for(!function(t,e){var i,n,r,s,o;for(i in t)if(r=e[n=J(i)],s=t[i],Array.isArray(s)&&(r=s[1],s=t[i]=s[0]),i!==n&&(t[n]=s,delete t[i]),(o=M.cssHooks[n])&&"expand"in o)for(i in s=o.expand(s),delete t[n],s)i in t||(t[i]=s[i],e[i]=r);else e[n]=r}(l,u.opts.specialEasing);s<o;s++)if(n=fe.prefilters[s].call(u,t,l,u.opts))return g(n.stop)&&(M._queueHooks(u.elem,u.opts.queue).stop=n.stop.bind(n)),n;return M.map(l,pe,u),g(u.opts.start)&&u.opts.start.call(t,u),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always),M.fx.timer(M.extend(h,{elem:t,anim:u,queue:u.opts.queue})),u}M.Animation=M.extend(fe,{tweeners:{"*":[function(t,e){var i=this.createTween(t,e);return lt(i.elem,t,rt.exec(e),i),i}]},tweener:function(t,e){g(t)?(e=t,t=["*"]):t=t.match(N);for(var i,n=0,r=t.length;n<r;n++)i=t[n],fe.tweeners[i]=fe.tweeners[i]||[],fe.tweeners[i].unshift(e)},prefilters:[function(t,e,i){var n,r,s,o,a,h,u,l,c="width"in e||"height"in e,d=this,p={},f=t.style,m=t.nodeType&&ut(t),v=Q.get(t,"fxshow");for(n in i.queue||(null==(o=M._queueHooks(t,"fx")).unqueued&&(o.unqueued=0,a=o.empty.fire,o.empty.fire=function(){o.unqueued||a()}),o.unqueued++,d.always((function(){d.always((function(){o.unqueued--,M.queue(t,"fx").length||o.empty.fire()}))}))),e)if(r=e[n],he.test(r)){if(delete e[n],s=s||"toggle"===r,r===(m?"hide":"show")){if("show"!==r||!v||void 0===v[n])continue;m=!0}p[n]=v&&v[n]||M.style(t,n)}if((h=!M.isEmptyObject(e))||!M.isEmptyObject(p))for(n in c&&1===t.nodeType&&(i.overflow=[f.overflow,f.overflowX,f.overflowY],null==(u=v&&v.display)&&(u=Q.get(t,"display")),"none"===(l=M.css(t,"display"))&&(u?l=u:(pt([t],!0),u=t.style.display||u,l=M.css(t,"display"),pt([t]))),("inline"===l||"inline-block"===l&&null!=u)&&"none"===M.css(t,"float")&&(h||(d.done((function(){f.display=u})),null==u&&(l=f.display,u="none"===l?"":l)),f.display="inline-block")),i.overflow&&(f.overflow="hidden",d.always((function(){f.overflow=i.overflow[0],f.overflowX=i.overflow[1],f.overflowY=i.overflow[2]}))),h=!1,p)h||(v?"hidden"in v&&(m=v.hidden):v=Q.access(t,"fxshow",{display:u}),s&&(v.hidden=!m),m&&pt([t],!0),d.done((function(){for(n in m||pt([t]),Q.remove(t,"fxshow"),p)M.style(t,n,p[n])}))),h=pe(m?v[n]:0,n,d),n in v||(v[n]=h.start,m&&(h.end=h.start,h.start=0))}],prefilter:function(t,e){e?fe.prefilters.unshift(t):fe.prefilters.push(t)}}),M.speed=function(t,e,i){var n=t&&"object"==typeof t?M.extend({},t):{complete:i||!i&&e||g(t)&&t,duration:t,easing:i&&e||e&&!g(e)&&e};return M.fx.off?n.duration=0:"number"!=typeof n.duration&&(n.duration in M.fx.speeds?n.duration=M.fx.speeds[n.duration]:n.duration=M.fx.speeds._default),null!=n.queue&&!0!==n.queue||(n.queue="fx"),n.old=n.complete,n.complete=function(){g(n.old)&&n.old.call(this),n.queue&&M.dequeue(this,n.queue)},n},M.fn.extend({fadeTo:function(t,e,i,n){return this.filter(ut).css("opacity",0).show().end().animate({opacity:e},t,i,n)},animate:function(t,e,i,n){var r=M.isEmptyObject(t),s=M.speed(e,i,n),o=function(){var e=fe(this,M.extend({},t),s);(r||Q.get(this,"finish"))&&e.stop(!0)};return o.finish=o,r||!1===s.queue?this.each(o):this.queue(s.queue,o)},stop:function(t,e,i){var n=function(t){var e=t.stop;delete t.stop,e(i)};return"string"!=typeof t&&(i=e,e=t,t=void 0),e&&this.queue(t||"fx",[]),this.each((function(){var e=!0,r=null!=t&&t+"queueHooks",s=M.timers,o=Q.get(this);if(r)o[r]&&o[r].stop&&n(o[r]);else for(r in o)o[r]&&o[r].stop&&ue.test(r)&&n(o[r]);for(r=s.length;r--;)s[r].elem!==this||null!=t&&s[r].queue!==t||(s[r].anim.stop(i),e=!1,s.splice(r,1));!e&&i||M.dequeue(this,t)}))},finish:function(t){return!1!==t&&(t=t||"fx"),this.each((function(){var e,i=Q.get(this),n=i[t+"queue"],r=i[t+"queueHooks"],s=M.timers,o=n?n.length:0;for(i.finish=!0,M.queue(this,t,[]),r&&r.stop&&r.stop.call(this,!0),e=s.length;e--;)s[e].elem===this&&s[e].queue===t&&(s[e].anim.stop(!0),s.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete i.finish}))}}),M.each(["toggle","show","hide"],(function(t,e){var i=M.fn[e];M.fn[e]=function(t,n,r){return null==t||"boolean"==typeof t?i.apply(this,arguments):this.animate(de(e,!0),t,n,r)}})),M.each({slideDown:de("show"),slideUp:de("hide"),slideToggle:de("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},(function(t,e){M.fn[t]=function(t,i,n){return this.animate(e,t,i,n)}})),M.timers=[],M.fx.tick=function(){var t,e=0,i=M.timers;for(oe=Date.now();e<i.length;e++)(t=i[e])()||i[e]!==t||i.splice(e--,1);i.length||M.fx.stop(),oe=void 0},M.fx.timer=function(t){M.timers.push(t),M.fx.start()},M.fx.interval=13,M.fx.start=function(){ae||(ae=!0,le())},M.fx.stop=function(){ae=null},M.fx.speeds={slow:600,fast:200,_default:400},M.fn.delay=function(t,e){return t=M.fx&&M.fx.speeds[t]||t,e=e||"fx",this.queue(e,(function(e,i){var r=n.setTimeout(e,t);i.stop=function(){n.clearTimeout(r)}}))},function(){var t=_.createElement("input"),e=_.createElement("select").appendChild(_.createElement("option"));t.type="checkbox",v.checkOn=""!==t.value,v.optSelected=e.selected,(t=_.createElement("input")).value="t",t.type="radio",v.radioValue="t"===t.value}();var me,ve=M.expr.attrHandle;M.fn.extend({attr:function(t,e){return G(this,M.attr,t,e,arguments.length>1)},removeAttr:function(t){return this.each((function(){M.removeAttr(this,t)}))}}),M.extend({attr:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return void 0===t.getAttribute?M.prop(t,e,i):(1===s&&M.isXMLDoc(t)||(r=M.attrHooks[e.toLowerCase()]||(M.expr.match.bool.test(e)?me:void 0)),void 0!==i?null===i?void M.removeAttr(t,e):r&&"set"in r&&void 0!==(n=r.set(t,i,e))?n:(t.setAttribute(e,i+""),i):r&&"get"in r&&null!==(n=r.get(t,e))?n:null==(n=M.find.attr(t,e))?void 0:n)},attrHooks:{type:{set:function(t,e){if(!v.radioValue&&"radio"===e&&P(t,"input")){var i=t.value;return t.setAttribute("type",e),i&&(t.value=i),e}}}},removeAttr:function(t,e){var i,n=0,r=e&&e.match(N);if(r&&1===t.nodeType)for(;i=r[n++];)t.removeAttribute(i)}}),me={set:function(t,e,i){return!1===e?M.removeAttr(t,i):t.setAttribute(i,i),i}},M.each(M.expr.match.bool.source.match(/\w+/g),(function(t,e){var i=ve[e]||M.find.attr;ve[e]=function(t,e,n){var r,s,o=e.toLowerCase();return n||(s=ve[o],ve[o]=r,r=null!=i(t,e,n)?o:null,ve[o]=s),r}}));var ge=/^(?:input|select|textarea|button)$/i,ye=/^(?:a|area)$/i;function _e(t){return(t.match(N)||[]).join(" ")}function xe(t){return t.getAttribute&&t.getAttribute("class")||""}function be(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(N)||[]}M.fn.extend({prop:function(t,e){return G(this,M.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[M.propFix[t]||t]}))}}),M.extend({prop:function(t,e,i){var n,r,s=t.nodeType;if(3!==s&&8!==s&&2!==s)return 1===s&&M.isXMLDoc(t)||(e=M.propFix[e]||e,r=M.propHooks[e]),void 0!==i?r&&"set"in r&&void 0!==(n=r.set(t,i,e))?n:t[e]=i:r&&"get"in r&&null!==(n=r.get(t,e))?n:t[e]},propHooks:{tabIndex:{get:function(t){var e=M.find.attr(t,"tabindex");return e?parseInt(e,10):ge.test(t.nodeName)||ye.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),v.optSelected||(M.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),M.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){M.propFix[this.toLowerCase()]=this})),M.fn.extend({addClass:function(t){var e,i,n,r,s,o,a,h=0;if(g(t))return this.each((function(e){M(this).addClass(t.call(this,e,xe(this)))}));if((e=be(t)).length)for(;i=this[h++];)if(r=xe(i),n=1===i.nodeType&&" "+_e(r)+" "){for(o=0;s=e[o++];)n.indexOf(" "+s+" ")<0&&(n+=s+" ");r!==(a=_e(n))&&i.setAttribute("class",a)}return this},removeClass:function(t){var e,i,n,r,s,o,a,h=0;if(g(t))return this.each((function(e){M(this).removeClass(t.call(this,e,xe(this)))}));if(!arguments.length)return this.attr("class","");if((e=be(t)).length)for(;i=this[h++];)if(r=xe(i),n=1===i.nodeType&&" "+_e(r)+" "){for(o=0;s=e[o++];)for(;n.indexOf(" "+s+" ")>-1;)n=n.replace(" "+s+" "," ");r!==(a=_e(n))&&i.setAttribute("class",a)}return this},toggleClass:function(t,e){var i=typeof t,n="string"===i||Array.isArray(t);return"boolean"==typeof e&&n?e?this.addClass(t):this.removeClass(t):g(t)?this.each((function(i){M(this).toggleClass(t.call(this,i,xe(this),e),e)})):this.each((function(){var e,r,s,o;if(n)for(r=0,s=M(this),o=be(t);e=o[r++];)s.hasClass(e)?s.removeClass(e):s.addClass(e);else void 0!==t&&"boolean"!==i||((e=xe(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===t?"":Q.get(this,"__className__")||""))}))},hasClass:function(t){var e,i,n=0;for(e=" "+t+" ";i=this[n++];)if(1===i.nodeType&&(" "+_e(xe(i))+" ").indexOf(e)>-1)return!0;return!1}});var we=/\r/g;M.fn.extend({val:function(t){var e,i,n,r=this[0];return arguments.length?(n=g(t),this.each((function(i){var r;1===this.nodeType&&(null==(r=n?t.call(this,i,M(this).val()):t)?r="":"number"==typeof r?r+="":Array.isArray(r)&&(r=M.map(r,(function(t){return null==t?"":t+""}))),(e=M.valHooks[this.type]||M.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,r,"value")||(this.value=r))}))):r?(e=M.valHooks[r.type]||M.valHooks[r.nodeName.toLowerCase()])&&"get"in e&&void 0!==(i=e.get(r,"value"))?i:"string"==typeof(i=r.value)?i.replace(we,""):null==i?"":i:void 0}}),M.extend({valHooks:{option:{get:function(t){var e=M.find.attr(t,"value");return null!=e?e:_e(M.text(t))}},select:{get:function(t){var e,i,n,r=t.options,s=t.selectedIndex,o="select-one"===t.type,a=o?null:[],h=o?s+1:r.length;for(n=s<0?h:o?s:0;n<h;n++)if(((i=r[n]).selected||n===s)&&!i.disabled&&(!i.parentNode.disabled||!P(i.parentNode,"optgroup"))){if(e=M(i).val(),o)return e;a.push(e)}return a},set:function(t,e){for(var i,n,r=t.options,s=M.makeArray(e),o=r.length;o--;)((n=r[o]).selected=M.inArray(M.valHooks.option.get(n),s)>-1)&&(i=!0);return i||(t.selectedIndex=-1),s}}}}),M.each(["radio","checkbox"],(function(){M.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=M.inArray(M(t).val(),e)>-1}},v.checkOn||(M.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})})),v.focusin="onfocusin"in n;var Te=/^(?:focusinfocus|focusoutblur)$/,Me=function(t){t.stopPropagation()};M.extend(M.event,{trigger:function(t,e,i,r){var s,o,a,h,u,l,c,d,f=[i||_],m=p.call(t,"type")?t.type:t,v=p.call(t,"namespace")?t.namespace.split("."):[];if(o=d=a=i=i||_,3!==i.nodeType&&8!==i.nodeType&&!Te.test(m+M.event.triggered)&&(m.indexOf(".")>-1&&(v=m.split("."),m=v.shift(),v.sort()),u=m.indexOf(":")<0&&"on"+m,(t=t[M.expando]?t:new M.Event(m,"object"==typeof t&&t)).isTrigger=r?2:3,t.namespace=v.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),e=null==e?[t]:M.makeArray(e,[t]),c=M.event.special[m]||{},r||!c.trigger||!1!==c.trigger.apply(i,e))){if(!r&&!c.noBubble&&!y(i)){for(h=c.delegateType||m,Te.test(h+m)||(o=o.parentNode);o;o=o.parentNode)f.push(o),a=o;a===(i.ownerDocument||_)&&f.push(a.defaultView||a.parentWindow||n)}for(s=0;(o=f[s++])&&!t.isPropagationStopped();)d=o,t.type=s>1?h:c.bindType||m,(l=(Q.get(o,"events")||Object.create(null))[t.type]&&Q.get(o,"handle"))&&l.apply(o,e),(l=u&&o[u])&&l.apply&&Z(o)&&(t.result=l.apply(o,e),!1===t.result&&t.preventDefault());return t.type=m,r||t.isDefaultPrevented()||c._default&&!1!==c._default.apply(f.pop(),e)||!Z(i)||u&&g(i[m])&&!y(i)&&((a=i[u])&&(i[u]=null),M.event.triggered=m,t.isPropagationStopped()&&d.addEventListener(m,Me),i[m](),t.isPropagationStopped()&&d.removeEventListener(m,Me),M.event.triggered=void 0,a&&(i[u]=a)),t.result}},simulate:function(t,e,i){var n=M.extend(new M.Event,i,{type:t,isSimulated:!0});M.event.trigger(n,null,e)}}),M.fn.extend({trigger:function(t,e){return this.each((function(){M.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var i=this[0];if(i)return M.event.trigger(t,e,i,!0)}}),v.focusin||M.each({focus:"focusin",blur:"focusout"},(function(t,e){var i=function(t){M.event.simulate(e,t.target,M.event.fix(t))};M.event.special[e]={setup:function(){var n=this.ownerDocument||this.document||this,r=Q.access(n,e);r||n.addEventListener(t,i,!0),Q.access(n,e,(r||0)+1)},teardown:function(){var n=this.ownerDocument||this.document||this,r=Q.access(n,e)-1;r?Q.access(n,e,r):(n.removeEventListener(t,i,!0),Q.remove(n,e))}}}));var Se=n.location,Ee={guid:Date.now()},Le=/\?/;M.parseXML=function(t){var e;if(!t||"string"!=typeof t)return null;try{e=(new n.DOMParser).parseFromString(t,"text/xml")}catch(t){e=void 0}return e&&!e.getElementsByTagName("parsererror").length||M.error("Invalid XML: "+t),e};var Ae=/\[\]$/,De=/\r?\n/g,Pe=/^(?:submit|button|image|reset|file)$/i,Ce=/^(?:input|select|textarea|keygen)/i;function Oe(t,e,i,n){var r;if(Array.isArray(e))M.each(e,(function(e,r){i||Ae.test(t)?n(t,r):Oe(t+"["+("object"==typeof r&&null!=r?e:"")+"]",r,i,n)}));else if(i||"object"!==w(e))n(t,e);else for(r in e)Oe(t+"["+r+"]",e[r],i,n)}M.param=function(t,e){var i,n=[],r=function(t,e){var i=g(e)?e():e;n[n.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==i?"":i)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!M.isPlainObject(t))M.each(t,(function(){r(this.name,this.value)}));else for(i in t)Oe(i,t[i],e,r);return n.join("&")},M.fn.extend({serialize:function(){return M.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=M.prop(this,"elements");return t?M.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!M(this).is(":disabled")&&Ce.test(this.nodeName)&&!Pe.test(t)&&(this.checked||!vt.test(t))})).map((function(t,e){var i=M(this).val();return null==i?null:Array.isArray(i)?M.map(i,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:i.replace(De,"\r\n")}})).get()}});var ke=/%20/g,Re=/#.*$/,Ie=/([?&])_=[^&]*/,Ye=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fe=/^(?:GET|HEAD)$/,Ne=/^\/\//,Be={},Ue={},je="*/".concat("*"),He=_.createElement("a");function ze(t){return function(e,i){"string"!=typeof e&&(i=e,e="*");var n,r=0,s=e.toLowerCase().match(N)||[];if(g(i))for(;n=s[r++];)"+"===n[0]?(n=n.slice(1)||"*",(t[n]=t[n]||[]).unshift(i)):(t[n]=t[n]||[]).push(i)}}function We(t,e,i,n){var r={},s=t===Ue;function o(a){var h;return r[a]=!0,M.each(t[a]||[],(function(t,a){var u=a(e,i,n);return"string"!=typeof u||s||r[u]?s?!(h=u):void 0:(e.dataTypes.unshift(u),o(u),!1)})),h}return o(e.dataTypes[0])||!r["*"]&&o("*")}function Ge(t,e){var i,n,r=M.ajaxSettings.flatOptions||{};for(i in e)void 0!==e[i]&&((r[i]?t:n||(n={}))[i]=e[i]);return n&&M.extend(!0,t,n),t}He.href=Se.href,M.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":je,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":M.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Ge(Ge(t,M.ajaxSettings),e):Ge(M.ajaxSettings,t)},ajaxPrefilter:ze(Be),ajaxTransport:ze(Ue),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var i,r,s,o,a,h,u,l,c,d,p=M.ajaxSetup({},e),f=p.context||p,m=p.context&&(f.nodeType||f.jquery)?M(f):M.event,v=M.Deferred(),g=M.Callbacks("once memory"),y=p.statusCode||{},x={},b={},w="canceled",T={readyState:0,getResponseHeader:function(t){var e;if(u){if(!o)for(o={};e=Ye.exec(s);)o[e[1].toLowerCase()+" "]=(o[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=o[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?s:null},setRequestHeader:function(t,e){return null==u&&(t=b[t.toLowerCase()]=b[t.toLowerCase()]||t,x[t]=e),this},overrideMimeType:function(t){return null==u&&(p.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)T.always(t[T.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||w;return i&&i.abort(e),S(0,e),this}};if(v.promise(T),p.url=((t||p.url||Se.href)+"").replace(Ne,Se.protocol+"//"),p.type=e.method||e.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(N)||[""],null==p.crossDomain){h=_.createElement("a");try{h.href=p.url,h.href=h.href,p.crossDomain=He.protocol+"//"+He.host!=h.protocol+"//"+h.host}catch(t){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=M.param(p.data,p.traditional)),We(Be,p,e,T),u)return T;for(c in(l=M.event&&p.global)&&0==M.active++&&M.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Fe.test(p.type),r=p.url.replace(Re,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(ke,"+")):(d=p.url.slice(r.length),p.data&&(p.processData||"string"==typeof p.data)&&(r+=(Le.test(r)?"&":"?")+p.data,delete p.data),!1===p.cache&&(r=r.replace(Ie,"$1"),d=(Le.test(r)?"&":"?")+"_="+Ee.guid+++d),p.url=r+d),p.ifModified&&(M.lastModified[r]&&T.setRequestHeader("If-Modified-Since",M.lastModified[r]),M.etag[r]&&T.setRequestHeader("If-None-Match",M.etag[r])),(p.data&&p.hasContent&&!1!==p.contentType||e.contentType)&&T.setRequestHeader("Content-Type",p.contentType),T.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+je+"; q=0.01":""):p.accepts["*"]),p.headers)T.setRequestHeader(c,p.headers[c]);if(p.beforeSend&&(!1===p.beforeSend.call(f,T,p)||u))return T.abort();if(w="abort",g.add(p.complete),T.done(p.success),T.fail(p.error),i=We(Ue,p,e,T)){if(T.readyState=1,l&&m.trigger("ajaxSend",[T,p]),u)return T;p.async&&p.timeout>0&&(a=n.setTimeout((function(){T.abort("timeout")}),p.timeout));try{u=!1,i.send(x,S)}catch(t){if(u)throw t;S(-1,t)}}else S(-1,"No Transport");function S(t,e,o,h){var c,d,_,x,b,w=e;u||(u=!0,a&&n.clearTimeout(a),i=void 0,s=h||"",T.readyState=t>0?4:0,c=t>=200&&t<300||304===t,o&&(x=function(t,e,i){for(var n,r,s,o,a=t.contents,h=t.dataTypes;"*"===h[0];)h.shift(),void 0===n&&(n=t.mimeType||e.getResponseHeader("Content-Type"));if(n)for(r in a)if(a[r]&&a[r].test(n)){h.unshift(r);break}if(h[0]in i)s=h[0];else{for(r in i){if(!h[0]||t.converters[r+" "+h[0]]){s=r;break}o||(o=r)}s=s||o}if(s)return s!==h[0]&&h.unshift(s),i[s]}(p,T,o)),!c&&M.inArray("script",p.dataTypes)>-1&&(p.converters["text script"]=function(){}),x=function(t,e,i,n){var r,s,o,a,h,u={},l=t.dataTypes.slice();if(l[1])for(o in t.converters)u[o.toLowerCase()]=t.converters[o];for(s=l.shift();s;)if(t.responseFields[s]&&(i[t.responseFields[s]]=e),!h&&n&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),h=s,s=l.shift())if("*"===s)s=h;else if("*"!==h&&h!==s){if(!(o=u[h+" "+s]||u["* "+s]))for(r in u)if((a=r.split(" "))[1]===s&&(o=u[h+" "+a[0]]||u["* "+a[0]])){!0===o?o=u[r]:!0!==u[r]&&(s=a[0],l.unshift(a[1]));break}if(!0!==o)if(o&&t.throws)e=o(e);else try{e=o(e)}catch(t){return{state:"parsererror",error:o?t:"No conversion from "+h+" to "+s}}}return{state:"success",data:e}}(p,x,T,c),c?(p.ifModified&&((b=T.getResponseHeader("Last-Modified"))&&(M.lastModified[r]=b),(b=T.getResponseHeader("etag"))&&(M.etag[r]=b)),204===t||"HEAD"===p.type?w="nocontent":304===t?w="notmodified":(w=x.state,d=x.data,c=!(_=x.error))):(_=w,!t&&w||(w="error",t<0&&(t=0))),T.status=t,T.statusText=(e||w)+"",c?v.resolveWith(f,[d,w,T]):v.rejectWith(f,[T,w,_]),T.statusCode(y),y=void 0,l&&m.trigger(c?"ajaxSuccess":"ajaxError",[T,p,c?d:_]),g.fireWith(f,[T,w]),l&&(m.trigger("ajaxComplete",[T,p]),--M.active||M.event.trigger("ajaxStop")))}return T},getJSON:function(t,e,i){return M.get(t,e,i,"json")},getScript:function(t,e){return M.get(t,void 0,e,"script")}}),M.each(["get","post"],(function(t,e){M[e]=function(t,i,n,r){return g(i)&&(r=r||n,n=i,i=void 0),M.ajax(M.extend({url:t,type:e,dataType:r,data:i,success:n},M.isPlainObject(t)&&t))}})),M.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),M._evalUrl=function(t,e,i){return M.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){M.globalEval(t,e,i)}})},M.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=M(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){M(this).wrapInner(t.call(this,e))})):this.each((function(){var e=M(this),i=e.contents();i.length?i.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(i){M(this).wrapAll(e?t.call(this,i):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){M(this).replaceWith(this.childNodes)})),this}}),M.expr.pseudos.hidden=function(t){return!M.expr.pseudos.visible(t)},M.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},M.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(t){}};var Ve={0:200,1223:204},Xe=M.ajaxSettings.xhr();v.cors=!!Xe&&"withCredentials"in Xe,v.ajax=Xe=!!Xe,M.ajaxTransport((function(t){var e,i;if(v.cors||Xe&&!t.crossDomain)return{send:function(r,s){var o,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];for(o in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest"),r)a.setRequestHeader(o,r[o]);e=function(t){return function(){e&&(e=i=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?s(0,"error"):s(a.status,a.statusText):s(Ve[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),i=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=i:a.onreadystatechange=function(){4===a.readyState&&n.setTimeout((function(){e&&i()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),M.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),M.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return M.globalEval(t),t}}}),M.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),M.ajaxTransport("script",(function(t){var e,i;if(t.crossDomain||t.scriptAttrs)return{send:function(n,r){e=M("<script>").attr(t.scriptAttrs||{}).prop({charset:t.scriptCharset,src:t.url}).on("load error",i=function(t){e.remove(),i=null,t&&r("error"===t.type?404:200,t.type)}),_.head.appendChild(e[0])},abort:function(){i&&i()}}}));var qe,Je=[],Ze=/(=)\?(?=&|$)|\?\?/;M.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var t=Je.pop()||M.expando+"_"+Ee.guid++;return this[t]=!0,t}}),M.ajaxPrefilter("json jsonp",(function(t,e,i){var r,s,o,a=!1!==t.jsonp&&(Ze.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ze.test(t.data)&&"data");if(a||"jsonp"===t.dataTypes[0])return r=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(Ze,"$1"+r):!1!==t.jsonp&&(t.url+=(Le.test(t.url)?"&":"?")+t.jsonp+"="+r),t.converters["script json"]=function(){return o||M.error(r+" was not called"),o[0]},t.dataTypes[0]="json",s=n[r],n[r]=function(){o=arguments},i.always((function(){void 0===s?M(n).removeProp(r):n[r]=s,t[r]&&(t.jsonpCallback=e.jsonpCallback,Je.push(r)),o&&g(s)&&s(o[0]),o=s=void 0})),"script"})),v.createHTMLDocument=((qe=_.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===qe.childNodes.length),M.parseHTML=function(t,e,i){return"string"!=typeof t?[]:("boolean"==typeof e&&(i=e,e=!1),e||(v.createHTMLDocument?((n=(e=_.implementation.createHTMLDocument("")).createElement("base")).href=_.location.href,e.head.appendChild(n)):e=_),s=!i&&[],(r=C.exec(t))?[e.createElement(r[1])]:(r=Tt([t],e,s),s&&s.length&&M(s).remove(),M.merge([],r.childNodes)));var n,r,s},M.fn.load=function(t,e,i){var n,r,s,o=this,a=t.indexOf(" ");return a>-1&&(n=_e(t.slice(a)),t=t.slice(0,a)),g(e)?(i=e,e=void 0):e&&"object"==typeof e&&(r="POST"),o.length>0&&M.ajax({url:t,type:r||"GET",dataType:"html",data:e}).done((function(t){s=arguments,o.html(n?M("<div>").append(M.parseHTML(t)).find(n):t)})).always(i&&function(t,e){o.each((function(){i.apply(this,s||[t.responseText,e,t])}))}),this},M.expr.pseudos.animated=function(t){return M.grep(M.timers,(function(e){return t===e.elem})).length},M.offset={setOffset:function(t,e,i){var n,r,s,o,a,h,u=M.css(t,"position"),l=M(t),c={};"static"===u&&(t.style.position="relative"),a=l.offset(),s=M.css(t,"top"),h=M.css(t,"left"),("absolute"===u||"fixed"===u)&&(s+h).indexOf("auto")>-1?(o=(n=l.position()).top,r=n.left):(o=parseFloat(s)||0,r=parseFloat(h)||0),g(e)&&(e=e.call(t,i,M.extend({},a))),null!=e.top&&(c.top=e.top-a.top+o),null!=e.left&&(c.left=e.left-a.left+r),"using"in e?e.using.call(t,c):("number"==typeof c.top&&(c.top+="px"),"number"==typeof c.left&&(c.left+="px"),l.css(c))}},M.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each((function(e){M.offset.setOffset(this,t,e)}));var e,i,n=this[0];return n?n.getClientRects().length?(e=n.getBoundingClientRect(),i=n.ownerDocument.defaultView,{top:e.top+i.pageYOffset,left:e.left+i.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var t,e,i,n=this[0],r={top:0,left:0};if("fixed"===M.css(n,"position"))e=n.getBoundingClientRect();else{for(e=this.offset(),i=n.ownerDocument,t=n.offsetParent||i.documentElement;t&&(t===i.body||t===i.documentElement)&&"static"===M.css(t,"position");)t=t.parentNode;t&&t!==n&&1===t.nodeType&&((r=M(t).offset()).top+=M.css(t,"borderTopWidth",!0),r.left+=M.css(t,"borderLeftWidth",!0))}return{top:e.top-r.top-M.css(n,"marginTop",!0),left:e.left-r.left-M.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map((function(){for(var t=this.offsetParent;t&&"static"===M.css(t,"position");)t=t.offsetParent;return t||ot}))}}),M.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},(function(t,e){var i="pageYOffset"===e;M.fn[t]=function(n){return G(this,(function(t,n,r){var s;if(y(t)?s=t:9===t.nodeType&&(s=t.defaultView),void 0===r)return s?s[e]:t[n];s?s.scrollTo(i?s.pageXOffset:r,i?r:s.pageYOffset):t[n]=r}),t,n,arguments.length)}})),M.each(["top","left"],(function(t,e){M.cssHooks[e]=Xt(v.pixelPosition,(function(t,i){if(i)return i=Vt(t,e),Ht.test(i)?M(t).position()[e]+"px":i}))})),M.each({Height:"height",Width:"width"},(function(t,e){M.each({padding:"inner"+t,content:e,"":"outer"+t},(function(i,n){M.fn[n]=function(r,s){var o=arguments.length&&(i||"boolean"!=typeof r),a=i||(!0===r||!0===s?"margin":"border");return G(this,(function(e,i,r){var s;return y(e)?0===n.indexOf("outer")?e["inner"+t]:e.document.documentElement["client"+t]:9===e.nodeType?(s=e.documentElement,Math.max(e.body["scroll"+t],s["scroll"+t],e.body["offset"+t],s["offset"+t],s["client"+t])):void 0===r?M.css(e,i,a):M.style(e,i,r,a)}),e,o?r:void 0,o)}}))})),M.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],(function(t,e){M.fn[e]=function(t){return this.on(e,t)}})),M.fn.extend({bind:function(t,e,i){return this.on(t,null,e,i)},unbind:function(t,e){return this.off(t,null,e)},delegate:function(t,e,i,n){return this.on(e,t,i,n)},undelegate:function(t,e,i){return 1===arguments.length?this.off(t,"**"):this.off(e,t||"**",i)},hover:function(t,e){return this.mouseenter(t).mouseleave(e||t)}}),M.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),(function(t,e){M.fn[e]=function(t,i){return arguments.length>0?this.on(e,null,t,i):this.trigger(e)}}));var Ke=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;M.proxy=function(t,e){var i,n,r;if("string"==typeof e&&(i=t[e],e=t,t=i),g(t))return n=a.call(arguments,2),(r=function(){return t.apply(e||this,n.concat(a.call(arguments)))}).guid=t.guid=t.guid||M.guid++,r},M.holdReady=function(t){t?M.readyWait++:M.ready(!0)},M.isArray=Array.isArray,M.parseJSON=JSON.parse,M.nodeName=P,M.isFunction=g,M.isWindow=y,M.camelCase=J,M.type=w,M.now=Date.now,M.isNumeric=function(t){var e=M.type(t);return("number"===e||"string"===e)&&!isNaN(t-parseFloat(t))},M.trim=function(t){return null==t?"":(t+"").replace(Ke,"")},void 0===(i=function(){return M}.apply(e,[]))||(t.exports=i);var Qe=n.jQuery,$e=n.$;return M.noConflict=function(t){return n.$===M&&(n.$=$e),t&&n.jQuery===M&&(n.jQuery=Qe),M},void 0===r&&(n.jQuery=n.$=M),M}))},49455:(t,e,i)=>{"use strict";i.d(e,{Z:()=>h});var n=i(19327);t=i.hmd(t);var r="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=r&&t&&!t.nodeType&&t,o=s&&s.exports===r?n.Z.Buffer:void 0,a=o?o.allocUnsafe:void 0;const h=function(t,e){if(e)return t.slice();var i=t.length,n=a?a(i):new t.constructor(i);return t.copy(n),n}},17039:(t,e,i)=>{"use strict";i.d(e,{Z:()=>n});const n="object"==typeof global&&global&&global.Object===Object&&global},55580:(t,e,i)=>{"use strict";i.d(e,{Z:()=>a});var n=i(17039);t=i.hmd(t);var r="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=r&&t&&!t.nodeType&&t,o=s&&s.exports===r&&n.Z.process;const a=function(){try{var t=s&&s.require&&s.require("util").types;return t||o&&o.binding&&o.binding("util")}catch(t){}}()},19327:(t,e,i)=>{"use strict";i.d(e,{Z:()=>s});var n=i(17039),r="object"==typeof self&&self&&self.Object===Object&&self;const s=n.Z||r||Function("return this")()},9511:(t,e,i)=>{"use strict";i.d(e,{Z:()=>h});var n=i(19327),r=i(60880);t=i.hmd(t);var s="object"==typeof exports&&exports&&!exports.nodeType&&exports,o=s&&t&&!t.nodeType&&t,a=o&&o.exports===s?n.Z.Buffer:void 0;const h=(a?a.isBuffer:void 0)||r.Z},60880:(t,e,i)=>{"use strict";i.d(e,{Z:()=>n});const n=function(){return!1}},82474:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}();function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=function(){function t(e,i,r){void 0===i&&(i=!1),n(this,t),this._fn=e,this._once=i,this._thisArg=r,this._next=this._prev=this._owner=null}return i(t,[{key:"detach",value:function(){return null!==this._owner&&(this._owner.detach(this),!0)}}]),t}();function s(t,e){return t._head?(t._tail._next=e,e._prev=t._tail,t._tail=e):(t._head=e,t._tail=e),e._owner=t,e}var o=function(){function t(){n(this,t),this._head=this._tail=void 0}return i(t,[{key:"handlers",value:function(){var t=!(arguments.length<=0||void 0===arguments[0])&&arguments[0],e=this._head;if(t)return!!e;for(var i=[];e;)i.push(e),e=e._next;return i}},{key:"has",value:function(t){if(!(t instanceof r))throw new Error("MiniSignal#has(): First arg must be a MiniSignalBinding object.");return t._owner===this}},{key:"dispatch",value:function(){var t=this._head;if(!t)return!1;for(;t;)t._once&&this.detach(t),t._fn.apply(t._thisArg,arguments),t=t._next;return!0}},{key:"add",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1];if("function"!=typeof t)throw new Error("MiniSignal#add(): First arg must be a Function.");return s(this,new r(t,!1,e))}},{key:"once",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1];if("function"!=typeof t)throw new Error("MiniSignal#once(): First arg must be a Function.");return s(this,new r(t,!0,e))}},{key:"detach",value:function(t){if(!(t instanceof r))throw new Error("MiniSignal#detach(): First arg must be a MiniSignalBinding object.");return t._owner!==this||(t._prev&&(t._prev._next=t._next),t._next&&(t._next._prev=t._prev),t===this._head?(this._head=t._next,null===t._next&&(this._tail=null)):t===this._tail&&(this._tail=t._prev,this._tail._next=null),t._owner=null),this}},{key:"detachAll",value:function(){var t=this._head;if(!t)return this;for(this._head=this._tail=null;t;)t._owner=null,t=t._next;return this}}]),t}();o.MiniSignalBinding=r,e.default=o,t.exports=e.default},90137:function(t,e,i){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,i){return t<12?i?"vm":"VM":i?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(76474))},88464:function(t,e,i){!function(t){"use strict";t.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(i(76474))},22477:function(t,e,i){!function(t){"use strict";t.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(i(76474))},79500:function(t,e,i){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},i=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},n={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(t){return function(e,r,s,o){var a=i(e),h=n[t][i(e)];return 2===a&&(h=h[r?0:1]),h.replace(/%d/i,e)}},s=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar-ly",{months:s,monthsShort:s,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,i){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(76474))},49548:function(t,e,i){!function(t){"use strict";t.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:6,doy:12}})}(i(76474))},45463:function(t,e,i){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},i={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};t.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,i){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,(function(t){return i[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(i(76474))},39066:function(t,e,i){!function(t){"use strict";t.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(i(76474))},75378:function(t,e,i){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},i={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},s=function(t){return function(e,i,s,o){var a=n(e),h=r[t][n(e)];return 2===a&&(h=h[i?0:1]),h.replace(/%d/i,e)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,i){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:s("s"),ss:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,(function(t){return i[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(76474))},51636:function(t,e,i){!function(t){"use strict";var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};t.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"birne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(t){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(t)},meridiem:function(t,e,i){return t<4?"gec\u0259":t<12?"s\u0259h\u0259r":t<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(t){if(0===t)return t+"-\u0131nc\u0131";var i=t%10,n=t%100-i,r=t>=100?100:null;return t+(e[i]||e[n]||e[r])},week:{dow:1,doy:7}})}(i(76474))},39609:function(t,e,i){!function(t){"use strict";function e(t,e){var i=t.split("_");return e%10==1&&e%100!=11?i[0]:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?i[1]:i[2]}function i(t,i,n){return"m"===n?i?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?i?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":t+" "+e({ss:i?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:i?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:i?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n],+t)}t.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:i,mm:i,h:i,hh:i,d:"\u0434\u0437\u0435\u043d\u044c",dd:i,M:"\u043c\u0435\u0441\u044f\u0446",MM:i,y:"\u0433\u043e\u0434",yy:i},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(t)},meridiem:function(t,e,i){return t<4?"\u043d\u043e\u0447\u044b":t<12?"\u0440\u0430\u043d\u0456\u0446\u044b":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-\u044b":t+"-\u0456";case"D":return t+"-\u0433\u0430";default:return t}},week:{dow:1,doy:7}})}(i(76474))},63069:function(t,e,i){!function(t){"use strict";t.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-\u0435\u0432":0===i?t+"-\u0435\u043d":i>10&&i<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(76474))},35554:function(t,e,i){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(i(76474))},75221:function(t,e,i){!function(t){"use strict";var e={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},i={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};t.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(t){return t.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u09b0\u09be\u09a4"===e&&t>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===e&&t<5||"\u09ac\u09bf\u0995\u09be\u09b2"===e?t+12:t},meridiem:function(t,e,i){return t<4?"\u09b0\u09be\u09a4":t<10?"\u09b8\u0995\u09be\u09b2":t<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":t<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(i(76474))},29832:function(t,e,i){!function(t){"use strict";var e={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},i={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};t.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(t){return t.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===e&&t>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===e&&t<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===e?t+12:t},meridiem:function(t,e,i){return t<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":t<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":t<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":t<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(i(76474))},68685:function(t,e,i){!function(t){"use strict";function e(t,e,i){return t+" "+r({mm:"munutenn",MM:"miz",dd:"devezh"}[i],t)}function i(t){switch(n(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}function n(t){return t>9?n(t%10):t}function r(t,e){return 2===e?s(t):t}function s(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}t.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:i},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(t){return t+(1===t?"a\xf1":"vet")},week:{dow:1,doy:4}})}(i(76474))},1322:function(t,e,i){!function(t){"use strict";function e(t,e,i){var n=t+" ";switch(i){case"ss":return n+=1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi";case"m":return e?"jedna minuta":"jedne minute";case"mm":return n+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return n+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return n+=1===t?"dan":"dana";case"MM":return n+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return n+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},21081:function(t,e,i){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(t,e){var i=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"\xe8";return"w"!==e&&"W"!==e||(i="a"),t+i},week:{dow:1,doy:4}})}(i(76474))},78998:function(t,e,i){!function(t){"use strict";var e="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),i="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),n=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],r=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function s(t){return t>1&&t<5&&1!=~~(t/10)}function o(t,e,i,n){var r=t+" ";switch(i){case"s":return e||n?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return e||n?r+(s(t)?"sekundy":"sekund"):r+"sekundami";case"m":return e?"minuta":n?"minutu":"minutou";case"mm":return e||n?r+(s(t)?"minuty":"minut"):r+"minutami";case"h":return e?"hodina":n?"hodinu":"hodinou";case"hh":return e||n?r+(s(t)?"hodiny":"hodin"):r+"hodinami";case"d":return e||n?"den":"dnem";case"dd":return e||n?r+(s(t)?"dny":"dn\xed"):r+"dny";case"M":return e||n?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return e||n?r+(s(t)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):r+"m\u011bs\xedci";case"y":return e||n?"rok":"rokem";case"yy":return e||n?r+(s(t)?"roky":"let"):r+"lety"}}t.defineLocale("cs",{months:e,monthsShort:i,monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:o,ss:o,m:o,mm:o,h:o,hh:o,d:o,dd:o,M:o,MM:o,y:o,yy:o},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},60494:function(t,e,i){!function(t){"use strict";t.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(t){return t+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(t)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(t)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(i(76474))},66035:function(t,e,i){!function(t){"use strict";t.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(t){var e="";return t>20?e=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),t+e},week:{dow:1,doy:4}})}(i(76474))},26036:function(t,e,i){!function(t){"use strict";t.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},5745:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[i][0]:r[i][1]}t.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},89061:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[i][0]:r[i][1]}t.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},13039:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?r[i][0]:r[i][1]}t.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},57036:function(t,e,i){!function(t){"use strict";var e=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],i=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:i,weekdaysShort:i,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(t){return"\u0789\u078a"===t},meridiem:function(t,e,i){return t<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(i(76474))},55553:function(t,e,i){!function(t){"use strict";function e(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}t.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(t,e,i){return t>11?i?"\u03bc\u03bc":"\u039c\u039c":i?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(t){return"\u03bc"===(t+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,i){var n=this._calendarEl[t],r=i&&i.hours();return e(n)&&(n=n.apply(i)),n.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(i(76474))},85192:function(t,e,i){!function(t){"use strict";t.defineLocale("en-SG",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},86695:function(t,e,i){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},24491:function(t,e,i){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(i(76474))},31724:function(t,e,i){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},28790:function(t,e,i){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},14166:function(t,e,i){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(i(76474))},96970:function(t,e,i){!function(t){"use strict";t.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},18076:function(t,e,i){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,i){return t>11?i?"p.t.m.":"P.T.M.":i?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(i(76474))},24902:function(t,e,i){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},92905:function(t,e,i){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(i(76474))},27777:function(t,e,i){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},25309:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[t+"sekundi",t+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[t+" minuti",t+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[t+" tunni",t+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[t+" kuu",t+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[t+" aasta",t+" aastat"]};return e?r[i][2]?r[i][2]:r[i][1]:n?r[i][0]:r[i][1]}t.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d p\xe4eva",M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},36354:function(t,e,i){!function(t){"use strict";t.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},28507:function(t,e,i){!function(t){"use strict";var e={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},i={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};t.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(t){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(t)},meridiem:function(t,e,i){return t<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/[\u06f0-\u06f9]/g,(function(t){return i[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(i(76474))},75691:function(t,e,i){!function(t){"use strict";var e="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),i=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",e[7],e[8],e[9]];function n(t,e,i,n){var s="";switch(i){case"s":return n?"muutaman sekunnin":"muutama sekunti";case"ss":return n?"sekunnin":"sekuntia";case"m":return n?"minuutin":"minuutti";case"mm":s=n?"minuutin":"minuuttia";break;case"h":return n?"tunnin":"tunti";case"hh":s=n?"tunnin":"tuntia";break;case"d":return n?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":s=n?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return n?"kuukauden":"kuukausi";case"MM":s=n?"kuukauden":"kuukautta";break;case"y":return n?"vuoden":"vuosi";case"yy":s=n?"vuoden":"vuotta"}return s=r(t,n)+" "+s}function r(t,n){return t<10?n?i[t]:e[t]:t}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},48155:function(t,e,i){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},93773:function(t,e,i){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(i(76474))},21333:function(t,e,i){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(i(76474))},83671:function(t,e,i){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(i(76474))},44731:function(t,e,i){!function(t){"use strict";var e="jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_"),i="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");t.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(76474))},47389:function(t,e,i){!function(t){"use strict";var e=["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","M\xe9itheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deaireadh F\xf3mhair","Samhain","Nollaig"],i=["Ean\xe1","Feab","M\xe1rt","Aibr","Beal","M\xe9it","I\xfail","L\xfana","Me\xe1n","Deai","Samh","Noll"],n=["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Satharn"],r=["Dom","Lua","M\xe1i","C\xe9a","D\xe9a","hAo","Sat"],s=["Do","Lu","M\xe1","Ce","D\xe9","hA","Sa"];t.defineLocale("ga",{months:e,monthsShort:i,monthsParseExact:!0,weekdays:n,weekdaysShort:r,weekdaysMin:s,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 aig] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xed",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(76474))},10002:function(t,e,i){!function(t){"use strict";var e=["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],i=["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],n=["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],r=["Did","Dil","Dim","Dic","Dia","Dih","Dis"],s=["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"];t.defineLocale("gd",{months:e,monthsShort:i,monthsParseExact:!0,weekdays:n,weekdaysShort:r,weekdaysMin:s,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(i(76474))},91812:function(t,e,i){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},8958:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={s:["thodde secondanim","thodde second"],ss:[t+" secondanim",t+" second"],m:["eka mintan","ek minute"],mm:[t+" mintanim",t+" mintam"],h:["eka voran","ek vor"],hh:[t+" voranim",t+" voram"],d:["eka disan","ek dis"],dd:[t+" disanim",t+" dis"],M:["eka mhoinean","ek mhoino"],MM:[t+" mhoineanim",t+" mhoine"],y:["eka vorsan","ek voros"],yy:[t+" vorsanim",t+" vorsam"]};return e?r[i][0]:r[i][1]}t.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(t,e){switch(e){case"D":return t+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return t}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(t,e){return 12===t&&(t=0),"rati"===e?t<4?t:t+12:"sokalli"===e?t:"donparam"===e?t>12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(i(76474))},80295:function(t,e,i){!function(t){"use strict";var e={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},i={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};t.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(t){return t.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0ab0\u0abe\u0aa4"===e?t<4?t:t+12:"\u0ab8\u0ab5\u0abe\u0ab0"===e?t:"\u0aac\u0aaa\u0acb\u0ab0"===e?t>=10?t:t+12:"\u0ab8\u0abe\u0a82\u0a9c"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0ab0\u0abe\u0aa4":t<10?"\u0ab8\u0ab5\u0abe\u0ab0":t<17?"\u0aac\u0aaa\u0acb\u0ab0":t<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(i(76474))},48767:function(t,e,i){!function(t){"use strict";t.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(t){return 2===t?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":t+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(t){return 2===t?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":t+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(t){return 2===t?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":t+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(t){return 2===t?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":t%10==0&&10!==t?t+" \u05e9\u05e0\u05d4":t+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(t){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(t)},meridiem:function(t,e,i){return t<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":t<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":t<12?i?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":t<18?i?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(i(76474))},95543:function(t,e,i){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},i={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924"===e?t<4?t:t+12:"\u0938\u0941\u092c\u0939"===e?t:"\u0926\u094b\u092a\u0939\u0930"===e?t>=10?t:t+12:"\u0936\u093e\u092e"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0930\u093e\u0924":t<10?"\u0938\u0941\u092c\u0939":t<17?"\u0926\u094b\u092a\u0939\u0930":t<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(i(76474))},24706:function(t,e,i){!function(t){"use strict";function e(t,e,i){var n=t+" ";switch(i){case"ss":return n+=1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi";case"m":return e?"jedna minuta":"jedne minute";case"mm":return n+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return n+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return n+=1===t?"dan":"dana";case"MM":return n+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return n+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}t.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},72177:function(t,e,i){!function(t){"use strict";var e="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function i(t,e,i,n){var r=t;switch(i){case"s":return n||e?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return r+(n||e)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(n||e?" perc":" perce");case"mm":return r+(n||e?" perc":" perce");case"h":return"egy"+(n||e?" \xf3ra":" \xf3r\xe1ja");case"hh":return r+(n||e?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(n||e?" nap":" napja");case"dd":return r+(n||e?" nap":" napja");case"M":return"egy"+(n||e?" h\xf3nap":" h\xf3napja");case"MM":return r+(n||e?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(n||e?" \xe9v":" \xe9ve");case"yy":return r+(n||e?" \xe9v":" \xe9ve")}return""}function n(t){return(t?"":"[m\xfalt] ")+"["+e[this.day()]+"] LT[-kor]"}t.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan_feb_m\xe1rc_\xe1pr_m\xe1j_j\xfan_j\xfal_aug_szept_okt_nov_dec".split("_"),weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(t){return"u"===t.charAt(1).toLowerCase()},meridiem:function(t,e,i){return t<12?!0===i?"de":"DE":!0===i?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return n.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return n.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},54748:function(t,e,i){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(t){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(t)},meridiem:function(t){return t<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":t<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":t<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-\u056b\u0576":t+"-\u0580\u0564";default:return t}},week:{dow:1,doy:7}})}(i(76474))},58713:function(t,e,i){!function(t){"use strict";t.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"siang"===e?t>=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,i){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(76474))},94336:function(t,e,i){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function i(t,i,n,r){var s=t+" ";switch(n){case"s":return i||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return e(t)?s+(i||r?"sek\xfandur":"sek\xfandum"):s+"sek\xfanda";case"m":return i?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return e(t)?s+(i||r?"m\xedn\xfatur":"m\xedn\xfatum"):i?s+"m\xedn\xfata":s+"m\xedn\xfatu";case"hh":return e(t)?s+(i||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return i?"dagur":r?"dag":"degi";case"dd":return e(t)?i?s+"dagar":s+(r?"daga":"d\xf6gum"):i?s+"dagur":s+(r?"dag":"degi");case"M":return i?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return e(t)?i?s+"m\xe1nu\xf0ir":s+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):i?s+"m\xe1nu\xf0ur":s+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return i||r?"\xe1r":"\xe1ri";case"yy":return e(t)?s+(i||r?"\xe1r":"\xe1rum"):s+(i||r?"\xe1r":"\xe1ri")}}t.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:i,ss:i,m:i,mm:i,h:"klukkustund",hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},18562:function(t,e,i){!function(t){"use strict";t.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},48328:function(t,e,i){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},31560:function(t,e,i){!function(t){"use strict";t.defineLocale("ja",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(t){return"\u5348\u5f8c"===t},meridiem:function(t,e,i){return t<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(t){return t.week()<this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(t){return this.week()<t.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";default:return t}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(i(76474))},34404:function(t,e,i){!function(t){"use strict";t.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(t,e){return 12===t&&(t=0),"enjing"===e?t:"siyang"===e?t>=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,i){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(i(76474))},75989:function(t,e,i){!function(t){"use strict";t.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(t)?t.replace(/\u10d8$/,"\u10e8\u10d8"):t+"\u10e8\u10d8"},past:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(t)?t.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(t)?t.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(t){return 0===t?t:1===t?t+"-\u10da\u10d8":t<20||t<=100&&t%20==0||t%100==0?"\u10db\u10d4-"+t:t+"-\u10d4"},week:{dow:1,doy:7}})}(i(76474))},20747:function(t,e,i){!function(t){"use strict";var e={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};t.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(t){var i=t%10,n=t>=100?100:null;return t+(e[t]||e[i]||e[n])},week:{dow:1,doy:7}})}(i(76474))},21868:function(t,e,i){!function(t){"use strict";var e={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},i={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};t.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(t){return"\u179b\u17d2\u1784\u17b6\u1785"===t},meridiem:function(t,e,i){return t<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(t){return t.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},week:{dow:1,doy:4}})}(i(76474))},94997:function(t,e,i){!function(t){"use strict";var e={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},i={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};t.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(t){return t.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===e?t<4?t:t+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===e?t:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===e?t>=10?t:t+12:"\u0cb8\u0c82\u0c9c\u0cc6"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":t<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":t<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":t<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(t){return t+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(i(76474))},89154:function(t,e,i){!function(t){"use strict";t.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\uc77c";case"M":return t+"\uc6d4";case"w":case"W":return t+"\uc8fc";default:return t}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(t){return"\uc624\ud6c4"===t},meridiem:function(t,e,i){return t<12?"\uc624\uc804":"\uc624\ud6c4"}})}(i(76474))},48220:function(t,e,i){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},i={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},n=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"];t.defineLocale("ku",{months:n,monthsShort:n,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(t){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(t)},meridiem:function(t,e,i){return t<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,(function(t){return i[t]})).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]})).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(i(76474))},73665:function(t,e,i){!function(t){"use strict";var e={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};t.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(t){var i=t%10,n=t>=100?100:null;return t+(e[t]||e[i]||e[n])},week:{dow:1,doy:7}})}(i(76474))},5358:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?r[i][0]:r[i][1]}function i(t){return r(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t}function n(t){return r(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t}function r(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10;return r(0===e?t/10:e)}if(t<1e4){for(;t>=10;)t/=10;return r(t)}return r(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:i,past:n,s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d M\xe9int",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},5047:function(t,e,i){!function(t){"use strict";t.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(t){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===t},meridiem:function(t,e,i){return t<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(t){return"\u0e97\u0eb5\u0ec8"+t}})}(i(76474))},63572:function(t,e,i){!function(t){"use strict";var e={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function i(t,e,i,n){return e?"kelios sekund\u0117s":n?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"}function n(t,e,i,n){return e?s(i)[0]:n?s(i)[1]:s(i)[2]}function r(t){return t%10==0||t>10&&t<20}function s(t){return e[t].split("_")}function o(t,e,i,o){var a=t+" ";return 1===t?a+n(t,e,i[0],o):e?a+(r(t)?s(i)[1]:s(i)[0]):o?a+s(i)[1]:a+(r(t)?s(i)[1]:s(i)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:i,ss:o,m:n,mm:o,h:n,hh:o,d:n,dd:o,M:n,MM:o,y:n,yy:o},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(i(76474))},36638:function(t,e,i){!function(t){"use strict";var e={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function i(t,e,i){return i?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function n(t,n,r){return t+" "+i(e[r],t,n)}function r(t,n,r){return i(e[r],t,n)}function s(t,e){return e?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"}t.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s,ss:n,m:r,mm:n,h:r,hh:n,d:r,dd:n,M:r,MM:n,y:r,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},19978:function(t,e,i){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,i,n){var r=e.words[n];return 1===n.length?i?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},17472:function(t,e,i){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},60968:function(t,e,i){!function(t){"use strict";t.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-\u0435\u0432":0===i?t+"-\u0435\u043d":i>10&&i<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(i(76474))},53126:function(t,e,i){!function(t){"use strict";t.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===e&&t>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===e||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===e?t+12:t},meridiem:function(t,e,i){return t<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":t<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":t<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":t<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(i(76474))},74277:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){switch(i){case"s":return e?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return t+(e?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return t+(e?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return t+(e?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return t+(e?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return t+(e?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return t+(e?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return t}}t.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(t){return"\u04ae\u0425"===t},meridiem:function(t,e,i){return t<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+" \u04e9\u0434\u04e9\u0440";default:return t}}})}(i(76474))},26078:function(t,e,i){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},i={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function n(t,e,i,n){var r="";if(e)switch(i){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(i){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,t)}t.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:n,ss:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===e?t<4?t:t+12:"\u0938\u0915\u093e\u0933\u0940"===e?t:"\u0926\u0941\u092a\u093e\u0930\u0940"===e?t>=10?t:t+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0930\u093e\u0924\u094d\u0930\u0940":t<10?"\u0938\u0915\u093e\u0933\u0940":t<17?"\u0926\u0941\u092a\u093e\u0930\u0940":t<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(i(76474))},30141:function(t,e,i){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,i){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(76474))},52364:function(t,e,i){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,i){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(i(76474))},92914:function(t,e,i){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},15334:function(t,e,i){!function(t){"use strict";var e={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},i={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};t.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(t){return t.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},week:{dow:1,doy:4}})}(i(76474))},93417:function(t,e,i){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},69459:function(t,e,i){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},i={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u093f"===e?t<4?t:t+12:"\u092c\u093f\u0939\u093e\u0928"===e?t:"\u0926\u093f\u0909\u0901\u0938\u094b"===e?t>=10?t:t+12:"\u0938\u093e\u0901\u091d"===e?t+12:void 0},meridiem:function(t,e,i){return t<3?"\u0930\u093e\u0924\u093f":t<12?"\u092c\u093f\u0939\u093e\u0928":t<16?"\u0926\u093f\u0909\u0901\u0938\u094b":t<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(i(76474))},22374:function(t,e,i){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),i="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(76474))},82054:function(t,e,i){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),i="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,n){return t?/-MMM-/.test(n)?i[t.month()]:e[t.month()]:e},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(i(76474))},34295:function(t,e,i){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},29074:function(t,e,i){!function(t){"use strict";var e={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},i={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};t.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(t){return t.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0a30\u0a3e\u0a24"===e?t<4?t:t+12:"\u0a38\u0a35\u0a47\u0a30"===e?t:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===e?t>=10?t:t+12:"\u0a38\u0a3c\u0a3e\u0a2e"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0a30\u0a3e\u0a24":t<10?"\u0a38\u0a35\u0a47\u0a30":t<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":t<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(i(76474))},15963:function(t,e,i){!function(t){"use strict";var e="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),i="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function n(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function r(t,e,i){var r=t+" ";switch(i){case"ss":return r+(n(t)?"sekundy":"sekund");case"m":return e?"minuta":"minut\u0119";case"mm":return r+(n(t)?"minuty":"minut");case"h":return e?"godzina":"godzin\u0119";case"hh":return r+(n(t)?"godziny":"godzin");case"MM":return r+(n(t)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(n(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,n){return t?""===n?"("+i[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(n)?i[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},63344:function(t,e,i){!function(t){"use strict";t.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Mar\xe7o_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(i(76474))},37259:function(t,e,i){!function(t){"use strict";t.defineLocale("pt",{months:"Janeiro_Fevereiro_Mar\xe7o_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(i(76474))},11451:function(t,e,i){!function(t){"use strict";function e(t,e,i){var n=" ";return(t%100>=20||t>=100&&t%100==0)&&(n=" de "),t+n+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[i]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:e,m:"un minut",mm:e,h:"o or\u0103",hh:e,d:"o zi",dd:e,M:"o lun\u0103",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(i(76474))},93612:function(t,e,i){!function(t){"use strict";function e(t,e){var i=t.split("_");return e%10==1&&e%100!=11?i[0]:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?i[1]:i[2]}function i(t,i,n){return"m"===n?i?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":t+" "+e({ss:i?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:i?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n],+t)}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];t.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:i,m:i,mm:i,h:"\u0447\u0430\u0441",hh:i,d:"\u0434\u0435\u043d\u044c",dd:i,M:"\u043c\u0435\u0441\u044f\u0446",MM:i,y:"\u0433\u043e\u0434",yy:i},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(t)},meridiem:function(t,e,i){return t<4?"\u043d\u043e\u0447\u0438":t<12?"\u0443\u0442\u0440\u0430":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-\u0439";case"D":return t+"-\u0433\u043e";case"w":case"W":return t+"-\u044f";default:return t}},week:{dow:1,doy:4}})}(i(76474))},67958:function(t,e,i){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],i=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"];t.defineLocale("sd",{months:e,monthsShort:e,weekdays:i,weekdaysShort:i,weekdaysMin:i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,i){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(76474))},17652:function(t,e,i){!function(t){"use strict";t.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},10314:function(t,e,i){!function(t){"use strict";t.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(t){return t+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(t){return"\u0db4.\u0dc0."===t||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===t},meridiem:function(t,e,i){return t>11?i?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":i?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(i(76474))},55386:function(t,e,i){!function(t){"use strict";var e="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),i="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function n(t){return t>1&&t<5}function r(t,e,i,r){var s=t+" ";switch(i){case"s":return e||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return e||r?s+(n(t)?"sekundy":"sek\xfand"):s+"sekundami";case"m":return e?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return e||r?s+(n(t)?"min\xfaty":"min\xfat"):s+"min\xfatami";case"h":return e?"hodina":r?"hodinu":"hodinou";case"hh":return e||r?s+(n(t)?"hodiny":"hod\xedn"):s+"hodinami";case"d":return e||r?"de\u0148":"d\u0148om";case"dd":return e||r?s+(n(t)?"dni":"dn\xed"):s+"d\u0148ami";case"M":return e||r?"mesiac":"mesiacom";case"MM":return e||r?s+(n(t)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return e||r?"rok":"rokom";case"yy":return e||r?s+(n(t)?"roky":"rokov"):s+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:i,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},48738:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r=t+" ";switch(i){case"s":return e||n?"nekaj sekund":"nekaj sekundami";case"ss":return r+=1===t?e?"sekundo":"sekundi":2===t?e||n?"sekundi":"sekundah":t<5?e||n?"sekunde":"sekundah":"sekund";case"m":return e?"ena minuta":"eno minuto";case"mm":return r+=1===t?e?"minuta":"minuto":2===t?e||n?"minuti":"minutama":t<5?e||n?"minute":"minutami":e||n?"minut":"minutami";case"h":return e?"ena ura":"eno uro";case"hh":return r+=1===t?e?"ura":"uro":2===t?e||n?"uri":"urama":t<5?e||n?"ure":"urami":e||n?"ur":"urami";case"d":return e||n?"en dan":"enim dnem";case"dd":return r+=1===t?e||n?"dan":"dnem":2===t?e||n?"dni":"dnevoma":e||n?"dni":"dnevi";case"M":return e||n?"en mesec":"enim mesecem";case"MM":return r+=1===t?e||n?"mesec":"mesecem":2===t?e||n?"meseca":"mesecema":t<5?e||n?"mesece":"meseci":e||n?"mesecev":"meseci";case"y":return e||n?"eno leto":"enim letom";case"yy":return r+=1===t?e||n?"leto":"letom":2===t?e||n?"leti":"letoma":t<5?e||n?"leta":"leti":e||n?"let":"leti"}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},53343:function(t,e,i){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,i){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},85784:function(t,e,i){!function(t){"use strict";var e={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,i,n){var r=e.words[n];return 1===n.length?i?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"\u0434\u0430\u043d",dd:e.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:e.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},19583:function(t,e,i){!function(t){"use strict";var e={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,i,n){var r=e.words[n];return 1===n.length?i?r[0]:r[1]:t+" "+e.correctGrammaticalCase(t,r)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(i(76474))},95148:function(t,e,i){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,i){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(i(76474))},1609:function(t,e,i){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"e":1===e||2===e?"a":"e")},week:{dow:1,doy:4}})}(i(76474))},18785:function(t,e,i){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(i(76474))},90025:function(t,e,i){!function(t){"use strict";var e={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},i={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};t.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(t){return t+"\u0bb5\u0ba4\u0bc1"},preparse:function(t){return t.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,(function(t){return i[t]}))},postformat:function(t){return t.replace(/\d/g,(function(t){return e[t]}))},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(t,e,i){return t<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":t<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":t<10?" \u0b95\u0bbe\u0bb2\u0bc8":t<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":t<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":t<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(t,e){return 12===t&&(t=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===e?t<2?t:t+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===e||"\u0b95\u0bbe\u0bb2\u0bc8"===e||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(i(76474))},16228:function(t,e,i){!function(t){"use strict";t.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===e?t<4?t:t+12:"\u0c09\u0c26\u0c2f\u0c02"===e?t:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===e?t>=10?t:t+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":t<10?"\u0c09\u0c26\u0c2f\u0c02":t<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":t<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(i(76474))},26136:function(t,e,i){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},1614:function(t,e,i){!function(t){"use strict";var e={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};t.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0448\u0430\u0431"===e?t<4?t:t+12:"\u0441\u0443\u0431\u04b3"===e?t:"\u0440\u04ef\u0437"===e?t>=11?t:t+12:"\u0431\u0435\u0433\u043e\u04b3"===e?t+12:void 0},meridiem:function(t,e,i){return t<4?"\u0448\u0430\u0431":t<11?"\u0441\u0443\u0431\u04b3":t<16?"\u0440\u04ef\u0437":t<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(t){var i=t%10,n=t>=100?100:null;return t+(e[t]||e[i]||e[n])},week:{dow:1,doy:7}})}(i(76474))},1838:function(t,e,i){!function(t){"use strict";t.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(t){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===t},meridiem:function(t,e,i){return t<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}})}(i(76474))},39964:function(t,e,i){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(i(76474))},77561:function(t,e,i){!function(t){"use strict";var e="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function i(t){var e=t;return e=-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"}function n(t){var e=t;return e=-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu\u2019":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"}function r(t,e,i,n){var r=s(t);switch(i){case"ss":return r+" lup";case"mm":return r+" tup";case"hh":return r+" rep";case"dd":return r+" jaj";case"MM":return r+" jar";case"yy":return r+" DIS"}}function s(t){var i=Math.floor(t%1e3/100),n=Math.floor(t%100/10),r=t%10,s="";return i>0&&(s+=e[i]+"vatlh"),n>0&&(s+=(""!==s?" ":"")+e[n]+"maH"),r>0&&(s+=(""!==s?" ":"")+e[r]),""===s?"pagh":s}t.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:i,past:n,s:"puS lup",ss:r,m:"wa\u2019 tup",mm:r,h:"wa\u2019 rep",hh:r,d:"wa\u2019 jaj",dd:r,M:"wa\u2019 jar",MM:r,y:"wa\u2019 DIS",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},28367:function(t,e,i){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};t.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(t,i){switch(i){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'\u0131nc\u0131";var n=t%10,r=t%100-n,s=t>=100?100:null;return t+(e[n]||e[r]||e[s])}},week:{dow:1,doy:7}})}(i(76474))},74001:function(t,e,i){!function(t){"use strict";function e(t,e,i,n){var r={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[t+" m\xeduts",t+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[t+" \xfeoras",t+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return n||e?r[i][0]:r[i][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,i){return t>11?i?"d'o":"D'O":i?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(i(76474))},19183:function(t,e,i){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(i(76474))},67519:function(t,e,i){!function(t){"use strict";t.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(i(76474))},35046:function(t,e,i){!function(t){"use strict";t.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===e||"\u0633\u06d5\u06be\u06d5\u0631"===e||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===e?t:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===e||"\u0643\u06d5\u0686"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,i){var n=100*t+e;return n<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":n<900?"\u0633\u06d5\u06be\u06d5\u0631":n<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":n<1230?"\u0686\u06c8\u0634":n<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return t+"-\u06be\u06d5\u067e\u062a\u06d5";default:return t}},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(i(76474))},19506:function(t,e,i){!function(t){"use strict";function e(t,e){var i=t.split("_");return e%10==1&&e%100!=11?i[0]:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?i[1]:i[2]}function i(t,i,n){return"m"===n?i?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?i?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":t+" "+e({ss:i?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:i?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:i?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n],+t)}function n(t,e){var i={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===t?i.nominative.slice(1,7).concat(i.nominative.slice(0,1)):t?i[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(e)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:i.nominative}function r(t){return function(){return t+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}t.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:n,weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:r("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:r("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:r("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:r("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return r("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:i,m:i,mm:i,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:i,d:"\u0434\u0435\u043d\u044c",dd:i,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:i,y:"\u0440\u0456\u043a",yy:i},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(t)},meridiem:function(t,e,i){return t<4?"\u043d\u043e\u0447\u0456":t<12?"\u0440\u0430\u043d\u043a\u0443":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-\u0439";case"D":return t+"-\u0433\u043e";default:return t}},week:{dow:1,doy:7}})}(i(76474))},77815:function(t,e,i){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],i=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:i,weekdaysShort:i,weekdaysMin:i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,i){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(i(76474))},47817:function(t,e,i){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(i(76474))},87947:function(t,e,i){!function(t){"use strict";t.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}})}(i(76474))},648:function(t,e,i){!function(t){"use strict";t.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,i){return t<12?i?"sa":"SA":i?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(i(76474))},26671:function(t,e,i){!function(t){"use strict";t.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(i(76474))},87858:function(t,e,i){!function(t){"use strict";t.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}})}(i(76474))},3895:function(t,e,i){!function(t){"use strict";t.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,i){var n=100*t+e;return n<600?"\u51cc\u6668":n<900?"\u65e9\u4e0a":n<1130?"\u4e0a\u5348":n<1230?"\u4e2d\u5348":n<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u5468";default:return t}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(i(76474))},22357:function(t,e,i){!function(t){"use strict";t.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,i){var n=100*t+e;return n<600?"\u51cc\u6668":n<900?"\u65e9\u4e0a":n<1130?"\u4e0a\u5348":n<1230?"\u4e2d\u5348":n<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(76474))},81833:function(t,e,i){!function(t){"use strict";t.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,i){var n=100*t+e;return n<600?"\u51cc\u6668":n<900?"\u65e9\u4e0a":n<1130?"\u4e0a\u5348":n<1230?"\u4e2d\u5348":n<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(i(76474))},99459:(t,e,i)=>{var n={"./af":90137,"./af.js":90137,"./ar":75378,"./ar-dz":88464,"./ar-dz.js":88464,"./ar-kw":22477,"./ar-kw.js":22477,"./ar-ly":79500,"./ar-ly.js":79500,"./ar-ma":49548,"./ar-ma.js":49548,"./ar-sa":45463,"./ar-sa.js":45463,"./ar-tn":39066,"./ar-tn.js":39066,"./ar.js":75378,"./az":51636,"./az.js":51636,"./be":39609,"./be.js":39609,"./bg":63069,"./bg.js":63069,"./bm":35554,"./bm.js":35554,"./bn":75221,"./bn.js":75221,"./bo":29832,"./bo.js":29832,"./br":68685,"./br.js":68685,"./bs":1322,"./bs.js":1322,"./ca":21081,"./ca.js":21081,"./cs":78998,"./cs.js":78998,"./cv":60494,"./cv.js":60494,"./cy":66035,"./cy.js":66035,"./da":26036,"./da.js":26036,"./de":13039,"./de-at":5745,"./de-at.js":5745,"./de-ch":89061,"./de-ch.js":89061,"./de.js":13039,"./dv":57036,"./dv.js":57036,"./el":55553,"./el.js":55553,"./en-SG":85192,"./en-SG.js":85192,"./en-au":86695,"./en-au.js":86695,"./en-ca":24491,"./en-ca.js":24491,"./en-gb":31724,"./en-gb.js":31724,"./en-ie":28790,"./en-ie.js":28790,"./en-il":14166,"./en-il.js":14166,"./en-nz":96970,"./en-nz.js":96970,"./eo":18076,"./eo.js":18076,"./es":27777,"./es-do":24902,"./es-do.js":24902,"./es-us":92905,"./es-us.js":92905,"./es.js":27777,"./et":25309,"./et.js":25309,"./eu":36354,"./eu.js":36354,"./fa":28507,"./fa.js":28507,"./fi":75691,"./fi.js":75691,"./fo":48155,"./fo.js":48155,"./fr":83671,"./fr-ca":93773,"./fr-ca.js":93773,"./fr-ch":21333,"./fr-ch.js":21333,"./fr.js":83671,"./fy":44731,"./fy.js":44731,"./ga":47389,"./ga.js":47389,"./gd":10002,"./gd.js":10002,"./gl":91812,"./gl.js":91812,"./gom-latn":8958,"./gom-latn.js":8958,"./gu":80295,"./gu.js":80295,"./he":48767,"./he.js":48767,"./hi":95543,"./hi.js":95543,"./hr":24706,"./hr.js":24706,"./hu":72177,"./hu.js":72177,"./hy-am":54748,"./hy-am.js":54748,"./id":58713,"./id.js":58713,"./is":94336,"./is.js":94336,"./it":48328,"./it-ch":18562,"./it-ch.js":18562,"./it.js":48328,"./ja":31560,"./ja.js":31560,"./jv":34404,"./jv.js":34404,"./ka":75989,"./ka.js":75989,"./kk":20747,"./kk.js":20747,"./km":21868,"./km.js":21868,"./kn":94997,"./kn.js":94997,"./ko":89154,"./ko.js":89154,"./ku":48220,"./ku.js":48220,"./ky":73665,"./ky.js":73665,"./lb":5358,"./lb.js":5358,"./lo":5047,"./lo.js":5047,"./lt":63572,"./lt.js":63572,"./lv":36638,"./lv.js":36638,"./me":19978,"./me.js":19978,"./mi":17472,"./mi.js":17472,"./mk":60968,"./mk.js":60968,"./ml":53126,"./ml.js":53126,"./mn":74277,"./mn.js":74277,"./mr":26078,"./mr.js":26078,"./ms":52364,"./ms-my":30141,"./ms-my.js":30141,"./ms.js":52364,"./mt":92914,"./mt.js":92914,"./my":15334,"./my.js":15334,"./nb":93417,"./nb.js":93417,"./ne":69459,"./ne.js":69459,"./nl":82054,"./nl-be":22374,"./nl-be.js":22374,"./nl.js":82054,"./nn":34295,"./nn.js":34295,"./pa-in":29074,"./pa-in.js":29074,"./pl":15963,"./pl.js":15963,"./pt":37259,"./pt-br":63344,"./pt-br.js":63344,"./pt.js":37259,"./ro":11451,"./ro.js":11451,"./ru":93612,"./ru.js":93612,"./sd":67958,"./sd.js":67958,"./se":17652,"./se.js":17652,"./si":10314,"./si.js":10314,"./sk":55386,"./sk.js":55386,"./sl":48738,"./sl.js":48738,"./sq":53343,"./sq.js":53343,"./sr":19583,"./sr-cyrl":85784,"./sr-cyrl.js":85784,"./sr.js":19583,"./ss":95148,"./ss.js":95148,"./sv":1609,"./sv.js":1609,"./sw":18785,"./sw.js":18785,"./ta":90025,"./ta.js":90025,"./te":16228,"./te.js":16228,"./tet":26136,"./tet.js":26136,"./tg":1614,"./tg.js":1614,"./th":1838,"./th.js":1838,"./tl-ph":39964,"./tl-ph.js":39964,"./tlh":77561,"./tlh.js":77561,"./tr":28367,"./tr.js":28367,"./tzl":74001,"./tzl.js":74001,"./tzm":67519,"./tzm-latn":19183,"./tzm-latn.js":19183,"./tzm.js":67519,"./ug-cn":35046,"./ug-cn.js":35046,"./uk":19506,"./uk.js":19506,"./ur":77815,"./ur.js":77815,"./uz":87947,"./uz-latn":47817,"./uz-latn.js":47817,"./uz.js":87947,"./vi":648,"./vi.js":648,"./x-pseudo":26671,"./x-pseudo.js":26671,"./yo":87858,"./yo.js":87858,"./zh-cn":3895,"./zh-cn.js":3895,"./zh-hk":22357,"./zh-hk.js":22357,"./zh-tw":81833,"./zh-tw.js":81833};function r(t){var e=s(t);return i(e)}function s(t){if(!i.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}r.keys=function(){return Object.keys(n)},r.resolve=s,t.exports=r,r.id=99459},76474:function(t,e,i){(t=i.nmd(t)).exports=function(){"use strict";var e,n;function r(){return e.apply(null,arguments)}function s(t){e=t}function o(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function a(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function h(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function u(t){return void 0===t}function l(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function c(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function d(t,e){var i,n=[];for(i=0;i<t.length;++i)n.push(e(t[i],i));return n}function p(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function f(t,e){for(var i in e)p(e,i)&&(t[i]=e[i]);return p(e,"toString")&&(t.toString=e.toString),p(e,"valueOf")&&(t.valueOf=e.valueOf),t}function m(t,e,i,n){return Xi(t,e,i,n,!0).utc()}function v(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function g(t){return null==t._pf&&(t._pf=v()),t._pf}function y(t){if(null==t._isValid){var e=g(t),i=n.call(e.parsedDateParts,(function(t){return null!=t})),r=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i);if(t._strict&&(r=r&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return r;t._isValid=r}return t._isValid}function _(t){var e=m(NaN);return null!=t?f(g(e),t):g(e).userInvalidated=!0,e}n=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,n=0;n<i;n++)if(n in e&&t.call(this,e[n],n,e))return!0;return!1};var x=r.momentProperties=[];function b(t,e){var i,n,r;if(u(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),u(e._i)||(t._i=e._i),u(e._f)||(t._f=e._f),u(e._l)||(t._l=e._l),u(e._strict)||(t._strict=e._strict),u(e._tzm)||(t._tzm=e._tzm),u(e._isUTC)||(t._isUTC=e._isUTC),u(e._offset)||(t._offset=e._offset),u(e._pf)||(t._pf=g(e)),u(e._locale)||(t._locale=e._locale),x.length>0)for(i=0;i<x.length;i++)u(r=e[n=x[i]])||(t[n]=r);return t}var w=!1;function T(t){b(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===w&&(w=!0,r.updateOffset(this),w=!1)}function M(t){return t instanceof T||null!=t&&null!=t._isAMomentObject}function S(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function E(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=S(e)),i}function L(t,e,i){var n,r=Math.min(t.length,e.length),s=Math.abs(t.length-e.length),o=0;for(n=0;n<r;n++)(i&&t[n]!==e[n]||!i&&E(t[n])!==E(e[n]))&&o++;return o+s}function A(t){!1===r.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function D(t,e){var i=!0;return f((function(){if(null!=r.deprecationHandler&&r.deprecationHandler(null,t),i){for(var n,s=[],o=0;o<arguments.length;o++){if(n="","object"==typeof arguments[o]){for(var a in n+="\n["+o+"] ",arguments[0])n+=a+": "+arguments[0][a]+", ";n=n.slice(0,-2)}else n=arguments[o];s.push(n)}A(t+"\nArguments: "+Array.prototype.slice.call(s).join("")+"\n"+(new Error).stack),i=!1}return e.apply(this,arguments)}),e)}var P,C={};function O(t,e){null!=r.deprecationHandler&&r.deprecationHandler(t,e),C[t]||(A(e),C[t]=!0)}function k(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function R(t){var e,i;for(i in t)k(e=t[i])?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function I(t,e){var i,n=f({},t);for(i in e)p(e,i)&&(a(t[i])&&a(e[i])?(n[i]={},f(n[i],t[i]),f(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)p(t,i)&&!p(e,i)&&a(t[i])&&(n[i]=f({},n[i]));return n}function Y(t){null!=t&&this.set(t)}r.suppressDeprecationWarnings=!1,r.deprecationHandler=null,P=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)p(t,e)&&i.push(e);return i};var F={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function N(t,e,i){var n=this._calendar[t]||this._calendar.sameElse;return k(n)?n.call(e,i):n}var B={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function U(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,(function(t){return t.slice(1)})),this._longDateFormat[t])}var j="Invalid date";function H(){return this._invalidDate}var z="%d",W=/\d{1,2}/;function G(t){return this._ordinal.replace("%d",t)}var V={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function X(t,e,i,n){var r=this._relativeTime[i];return k(r)?r(t,e,i,n):r.replace(/%d/i,t)}function q(t,e){var i=this._relativeTime[t>0?"future":"past"];return k(i)?i(e):i.replace(/%s/i,e)}var J={};function Z(t,e){var i=t.toLowerCase();J[i]=J[i+"s"]=J[e]=t}function K(t){return"string"==typeof t?J[t]||J[t.toLowerCase()]:void 0}function Q(t){var e,i,n={};for(i in t)p(t,i)&&(e=K(i))&&(n[e]=t[i]);return n}var $={};function tt(t,e){$[t]=e}function et(t){var e=[];for(var i in t)e.push({unit:i,priority:$[i]});return e.sort((function(t,e){return t.priority-e.priority})),e}function it(t,e,i){var n=""+Math.abs(t),r=e-n.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,r)).toString().substr(1)+n}var nt=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,rt=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,st={},ot={};function at(t,e,i,n){var r=n;"string"==typeof n&&(r=function(){return this[n]()}),t&&(ot[t]=r),e&&(ot[e[0]]=function(){return it(r.apply(this,arguments),e[1],e[2])}),i&&(ot[i]=function(){return this.localeData().ordinal(r.apply(this,arguments),t)})}function ht(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function ut(t){var e,i,n=t.match(nt);for(e=0,i=n.length;e<i;e++)ot[n[e]]?n[e]=ot[n[e]]:n[e]=ht(n[e]);return function(e){var r,s="";for(r=0;r<i;r++)s+=k(n[r])?n[r].call(e,t):n[r];return s}}function lt(t,e){return t.isValid()?(e=ct(e,t.localeData()),st[e]=st[e]||ut(e),st[e](t)):t.localeData().invalidDate()}function ct(t,e){var i=5;function n(t){return e.longDateFormat(t)||t}for(rt.lastIndex=0;i>=0&&rt.test(t);)t=t.replace(rt,n),rt.lastIndex=0,i-=1;return t}var dt=/\d/,pt=/\d\d/,ft=/\d{3}/,mt=/\d{4}/,vt=/[+-]?\d{6}/,gt=/\d\d?/,yt=/\d\d\d\d?/,_t=/\d\d\d\d\d\d?/,xt=/\d{1,3}/,bt=/\d{1,4}/,wt=/[+-]?\d{1,6}/,Tt=/\d+/,Mt=/[+-]?\d+/,St=/Z|[+-]\d\d:?\d\d/gi,Et=/Z|[+-]\d\d(?::?\d\d)?/gi,Lt=/[+-]?\d+(\.\d{1,3})?/,At=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,Dt={};function Pt(t,e,i){Dt[t]=k(e)?e:function(t,n){return t&&i?i:e}}function Ct(t,e){return p(Dt,t)?Dt[t](e._strict,e._locale):new RegExp(Ot(t))}function Ot(t){return kt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(t,e,i,n,r){return e||i||n||r})))}function kt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var Rt={};function It(t,e){var i,n=e;for("string"==typeof t&&(t=[t]),l(e)&&(n=function(t,i){i[e]=E(t)}),i=0;i<t.length;i++)Rt[t[i]]=n}function Yt(t,e){It(t,(function(t,i,n,r){n._w=n._w||{},e(t,n._w,n,r)}))}function Ft(t,e,i){null!=e&&p(Rt,t)&&Rt[t](e,i._a,i,t)}var Nt=0,Bt=1,Ut=2,jt=3,Ht=4,zt=5,Wt=6,Gt=7,Vt=8;function Xt(t){return qt(t)?366:365}function qt(t){return t%4==0&&t%100!=0||t%400==0}at("Y",0,0,(function(){var t=this.year();return t<=9999?""+t:"+"+t})),at(0,["YY",2],0,(function(){return this.year()%100})),at(0,["YYYY",4],0,"year"),at(0,["YYYYY",5],0,"year"),at(0,["YYYYYY",6,!0],0,"year"),Z("year","y"),tt("year",1),Pt("Y",Mt),Pt("YY",gt,pt),Pt("YYYY",bt,mt),Pt("YYYYY",wt,vt),Pt("YYYYYY",wt,vt),It(["YYYYY","YYYYYY"],Nt),It("YYYY",(function(t,e){e[Nt]=2===t.length?r.parseTwoDigitYear(t):E(t)})),It("YY",(function(t,e){e[Nt]=r.parseTwoDigitYear(t)})),It("Y",(function(t,e){e[Nt]=parseInt(t,10)})),r.parseTwoDigitYear=function(t){return E(t)+(E(t)>68?1900:2e3)};var Jt,Zt=Qt("FullYear",!0);function Kt(){return qt(this.year())}function Qt(t,e){return function(i){return null!=i?(te(this,t,i),r.updateOffset(this,e),this):$t(this,t)}}function $t(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function te(t,e,i){t.isValid()&&!isNaN(i)&&("FullYear"===e&&qt(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](i,t.month(),re(i,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](i))}function ee(t){return k(this[t=K(t)])?this[t]():this}function ie(t,e){if("object"==typeof t)for(var i=et(t=Q(t)),n=0;n<i.length;n++)this[i[n].unit](t[i[n].unit]);else if(k(this[t=K(t)]))return this[t](e);return this}function ne(t,e){return(t%e+e)%e}function re(t,e){if(isNaN(t)||isNaN(e))return NaN;var i=ne(e,12);return t+=(e-i)/12,1===i?qt(t)?29:28:31-i%7%2}Jt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},at("M",["MM",2],"Mo",(function(){return this.month()+1})),at("MMM",0,0,(function(t){return this.localeData().monthsShort(this,t)})),at("MMMM",0,0,(function(t){return this.localeData().months(this,t)})),Z("month","M"),tt("month",8),Pt("M",gt),Pt("MM",gt,pt),Pt("MMM",(function(t,e){return e.monthsShortRegex(t)})),Pt("MMMM",(function(t,e){return e.monthsRegex(t)})),It(["M","MM"],(function(t,e){e[Bt]=E(t)-1})),It(["MMM","MMMM"],(function(t,e,i,n){var r=i._locale.monthsParse(t,n,i._strict);null!=r?e[Bt]=r:g(i).invalidMonth=t}));var se=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,oe="January_February_March_April_May_June_July_August_September_October_November_December".split("_");function ae(t,e){return t?o(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||se).test(e)?"format":"standalone"][t.month()]:o(this._months)?this._months:this._months.standalone}var he="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function ue(t,e){return t?o(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[se.test(e)?"format":"standalone"][t.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function le(t,e,i){var n,r,s,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],n=0;n<12;++n)s=m([2e3,n]),this._shortMonthsParse[n]=this.monthsShort(s,"").toLocaleLowerCase(),this._longMonthsParse[n]=this.months(s,"").toLocaleLowerCase();return i?"MMM"===e?-1!==(r=Jt.call(this._shortMonthsParse,o))?r:null:-1!==(r=Jt.call(this._longMonthsParse,o))?r:null:"MMM"===e?-1!==(r=Jt.call(this._shortMonthsParse,o))||-1!==(r=Jt.call(this._longMonthsParse,o))?r:null:-1!==(r=Jt.call(this._longMonthsParse,o))||-1!==(r=Jt.call(this._shortMonthsParse,o))?r:null}function ce(t,e,i){var n,r,s;if(this._monthsParseExact)return le.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;n<12;n++){if(r=m([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[n]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),i||this._monthsParse[n]||(s="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[n]=new RegExp(s.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[n].test(t))return n;if(i&&"MMM"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}}function de(t,e){var i;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=E(e);else if(!l(e=t.localeData().monthsParse(e)))return t;return i=Math.min(t.date(),re(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t}function pe(t){return null!=t?(de(this,t),r.updateOffset(this,!0),this):$t(this,"Month")}function fe(){return re(this.year(),this.month())}var me=At;function ve(t){return this._monthsParseExact?(p(this,"_monthsRegex")||_e.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(p(this,"_monthsShortRegex")||(this._monthsShortRegex=me),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}var ge=At;function ye(t){return this._monthsParseExact?(p(this,"_monthsRegex")||_e.call(this),t?this._monthsStrictRegex:this._monthsRegex):(p(this,"_monthsRegex")||(this._monthsRegex=ge),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function _e(){function t(t,e){return e.length-t.length}var e,i,n=[],r=[],s=[];for(e=0;e<12;e++)i=m([2e3,e]),n.push(this.monthsShort(i,"")),r.push(this.months(i,"")),s.push(this.months(i,"")),s.push(this.monthsShort(i,""));for(n.sort(t),r.sort(t),s.sort(t),e=0;e<12;e++)n[e]=kt(n[e]),r[e]=kt(r[e]);for(e=0;e<24;e++)s[e]=kt(s[e]);this._monthsRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function xe(t,e,i,n,r,s,o){var a;return t<100&&t>=0?(a=new Date(t+400,e,i,n,r,s,o),isFinite(a.getFullYear())&&a.setFullYear(t)):a=new Date(t,e,i,n,r,s,o),a}function be(t){var e;if(t<100&&t>=0){var i=Array.prototype.slice.call(arguments);i[0]=t+400,e=new Date(Date.UTC.apply(null,i)),isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t)}else e=new Date(Date.UTC.apply(null,arguments));return e}function we(t,e,i){var n=7+e-i;return-(7+be(t,0,n).getUTCDay()-e)%7+n-1}function Te(t,e,i,n,r){var s,o,a=1+7*(e-1)+(7+i-n)%7+we(t,n,r);return a<=0?o=Xt(s=t-1)+a:a>Xt(t)?(s=t+1,o=a-Xt(t)):(s=t,o=a),{year:s,dayOfYear:o}}function Me(t,e,i){var n,r,s=we(t.year(),e,i),o=Math.floor((t.dayOfYear()-s-1)/7)+1;return o<1?n=o+Se(r=t.year()-1,e,i):o>Se(t.year(),e,i)?(n=o-Se(t.year(),e,i),r=t.year()+1):(r=t.year(),n=o),{week:n,year:r}}function Se(t,e,i){var n=we(t,e,i),r=we(t+1,e,i);return(Xt(t)-n+r)/7}function Ee(t){return Me(t,this._week.dow,this._week.doy).week}at("w",["ww",2],"wo","week"),at("W",["WW",2],"Wo","isoWeek"),Z("week","w"),Z("isoWeek","W"),tt("week",5),tt("isoWeek",5),Pt("w",gt),Pt("ww",gt,pt),Pt("W",gt),Pt("WW",gt,pt),Yt(["w","ww","W","WW"],(function(t,e,i,n){e[n.substr(0,1)]=E(t)}));var Le={dow:0,doy:6};function Ae(){return this._week.dow}function De(){return this._week.doy}function Pe(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Ce(t){var e=Me(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Oe(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}function ke(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Re(t,e){return t.slice(e,7).concat(t.slice(0,e))}at("d",0,"do","day"),at("dd",0,0,(function(t){return this.localeData().weekdaysMin(this,t)})),at("ddd",0,0,(function(t){return this.localeData().weekdaysShort(this,t)})),at("dddd",0,0,(function(t){return this.localeData().weekdays(this,t)})),at("e",0,0,"weekday"),at("E",0,0,"isoWeekday"),Z("day","d"),Z("weekday","e"),Z("isoWeekday","E"),tt("day",11),tt("weekday",11),tt("isoWeekday",11),Pt("d",gt),Pt("e",gt),Pt("E",gt),Pt("dd",(function(t,e){return e.weekdaysMinRegex(t)})),Pt("ddd",(function(t,e){return e.weekdaysShortRegex(t)})),Pt("dddd",(function(t,e){return e.weekdaysRegex(t)})),Yt(["dd","ddd","dddd"],(function(t,e,i,n){var r=i._locale.weekdaysParse(t,n,i._strict);null!=r?e.d=r:g(i).invalidWeekday=t})),Yt(["d","e","E"],(function(t,e,i,n){e[n]=E(t)}));var Ie="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");function Ye(t,e){var i=o(this._weekdays)?this._weekdays:this._weekdays[t&&!0!==t&&this._weekdays.isFormat.test(e)?"format":"standalone"];return!0===t?Re(i,this._week.dow):t?i[t.day()]:i}var Fe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");function Ne(t){return!0===t?Re(this._weekdaysShort,this._week.dow):t?this._weekdaysShort[t.day()]:this._weekdaysShort}var Be="Su_Mo_Tu_We_Th_Fr_Sa".split("_");function Ue(t){return!0===t?Re(this._weekdaysMin,this._week.dow):t?this._weekdaysMin[t.day()]:this._weekdaysMin}function je(t,e,i){var n,r,s,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)s=m([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?-1!==(r=Jt.call(this._weekdaysParse,o))?r:null:"ddd"===e?-1!==(r=Jt.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=Jt.call(this._minWeekdaysParse,o))?r:null:"dddd"===e?-1!==(r=Jt.call(this._weekdaysParse,o))||-1!==(r=Jt.call(this._shortWeekdaysParse,o))||-1!==(r=Jt.call(this._minWeekdaysParse,o))?r:null:"ddd"===e?-1!==(r=Jt.call(this._shortWeekdaysParse,o))||-1!==(r=Jt.call(this._weekdaysParse,o))||-1!==(r=Jt.call(this._minWeekdaysParse,o))?r:null:-1!==(r=Jt.call(this._minWeekdaysParse,o))||-1!==(r=Jt.call(this._weekdaysParse,o))||-1!==(r=Jt.call(this._shortWeekdaysParse,o))?r:null}function He(t,e,i){var n,r,s;if(this._weekdaysParseExact)return je.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(r=m([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(r,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(r,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(r,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(s="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[n]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&"ddd"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&"dd"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}}function ze(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Oe(t,this.localeData()),this.add(t-e,"d")):e}function We(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Ge(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=ke(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}var Ve=At;function Xe(t){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Qe.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(p(this,"_weekdaysRegex")||(this._weekdaysRegex=Ve),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}var qe=At;function Je(t){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Qe.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(p(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}var Ze=At;function Ke(t){return this._weekdaysParseExact?(p(this,"_weekdaysRegex")||Qe.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(p(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ze),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qe(){function t(t,e){return e.length-t.length}var e,i,n,r,s,o=[],a=[],h=[],u=[];for(e=0;e<7;e++)i=m([2e3,1]).day(e),n=this.weekdaysMin(i,""),r=this.weekdaysShort(i,""),s=this.weekdays(i,""),o.push(n),a.push(r),h.push(s),u.push(n),u.push(r),u.push(s);for(o.sort(t),a.sort(t),h.sort(t),u.sort(t),e=0;e<7;e++)a[e]=kt(a[e]),h[e]=kt(h[e]),u[e]=kt(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function $e(){return this.hours()%12||12}function ti(){return this.hours()||24}function ei(t,e){at(t,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)}))}function ii(t,e){return e._meridiemParse}function ni(t){return"p"===(t+"").toLowerCase().charAt(0)}at("H",["HH",2],0,"hour"),at("h",["hh",2],0,$e),at("k",["kk",2],0,ti),at("hmm",0,0,(function(){return""+$e.apply(this)+it(this.minutes(),2)})),at("hmmss",0,0,(function(){return""+$e.apply(this)+it(this.minutes(),2)+it(this.seconds(),2)})),at("Hmm",0,0,(function(){return""+this.hours()+it(this.minutes(),2)})),at("Hmmss",0,0,(function(){return""+this.hours()+it(this.minutes(),2)+it(this.seconds(),2)})),ei("a",!0),ei("A",!1),Z("hour","h"),tt("hour",13),Pt("a",ii),Pt("A",ii),Pt("H",gt),Pt("h",gt),Pt("k",gt),Pt("HH",gt,pt),Pt("hh",gt,pt),Pt("kk",gt,pt),Pt("hmm",yt),Pt("hmmss",_t),Pt("Hmm",yt),Pt("Hmmss",_t),It(["H","HH"],jt),It(["k","kk"],(function(t,e,i){var n=E(t);e[jt]=24===n?0:n})),It(["a","A"],(function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t})),It(["h","hh"],(function(t,e,i){e[jt]=E(t),g(i).bigHour=!0})),It("hmm",(function(t,e,i){var n=t.length-2;e[jt]=E(t.substr(0,n)),e[Ht]=E(t.substr(n)),g(i).bigHour=!0})),It("hmmss",(function(t,e,i){var n=t.length-4,r=t.length-2;e[jt]=E(t.substr(0,n)),e[Ht]=E(t.substr(n,2)),e[zt]=E(t.substr(r)),g(i).bigHour=!0})),It("Hmm",(function(t,e,i){var n=t.length-2;e[jt]=E(t.substr(0,n)),e[Ht]=E(t.substr(n))})),It("Hmmss",(function(t,e,i){var n=t.length-4,r=t.length-2;e[jt]=E(t.substr(0,n)),e[Ht]=E(t.substr(n,2)),e[zt]=E(t.substr(r))}));var ri=/[ap]\.?m?\.?/i;function si(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}var oi,ai=Qt("Hours",!0),hi={calendar:F,longDateFormat:B,invalidDate:j,ordinal:z,dayOfMonthOrdinalParse:W,relativeTime:V,months:oe,monthsShort:he,week:Le,weekdays:Ie,weekdaysMin:Be,weekdaysShort:Fe,meridiemParse:ri},ui={},li={};function ci(t){return t?t.toLowerCase().replace("_","-"):t}function di(t){for(var e,i,n,r,s=0;s<t.length;){for(e=(r=ci(t[s]).split("-")).length,i=(i=ci(t[s+1]))?i.split("-"):null;e>0;){if(n=pi(r.slice(0,e).join("-")))return n;if(i&&i.length>=e&&L(r,i,!0)>=e-1)break;e--}s++}return oi}function pi(e){var n=null;if(!ui[e]&&t&&t.exports)try{n=oi._abbr,i(99459)("./"+e),fi(n)}catch(t){}return ui[e]}function fi(t,e){var i;return t&&((i=u(e)?gi(t):mi(t,e))?oi=i:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),oi._abbr}function mi(t,e){if(null!==e){var i,n=hi;if(e.abbr=t,null!=ui[t])O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=ui[t]._config;else if(null!=e.parentLocale)if(null!=ui[e.parentLocale])n=ui[e.parentLocale]._config;else{if(null==(i=pi(e.parentLocale)))return li[e.parentLocale]||(li[e.parentLocale]=[]),li[e.parentLocale].push({name:t,config:e}),null;n=i._config}return ui[t]=new Y(I(n,e)),li[t]&&li[t].forEach((function(t){mi(t.name,t.config)})),fi(t),ui[t]}return delete ui[t],null}function vi(t,e){if(null!=e){var i,n,r=hi;null!=(n=pi(t))&&(r=n._config),(i=new Y(e=I(r,e))).parentLocale=ui[t],ui[t]=i,fi(t)}else null!=ui[t]&&(null!=ui[t].parentLocale?ui[t]=ui[t].parentLocale:null!=ui[t]&&delete ui[t]);return ui[t]}function gi(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return oi;if(!o(t)){if(e=pi(t))return e;t=[t]}return di(t)}function yi(){return P(ui)}function _i(t){var e,i=t._a;return i&&-2===g(t).overflow&&(e=i[Bt]<0||i[Bt]>11?Bt:i[Ut]<1||i[Ut]>re(i[Nt],i[Bt])?Ut:i[jt]<0||i[jt]>24||24===i[jt]&&(0!==i[Ht]||0!==i[zt]||0!==i[Wt])?jt:i[Ht]<0||i[Ht]>59?Ht:i[zt]<0||i[zt]>59?zt:i[Wt]<0||i[Wt]>999?Wt:-1,g(t)._overflowDayOfYear&&(e<Nt||e>Ut)&&(e=Ut),g(t)._overflowWeeks&&-1===e&&(e=Gt),g(t)._overflowWeekday&&-1===e&&(e=Vt),g(t).overflow=e),t}function xi(t,e,i){return null!=t?t:null!=e?e:i}function bi(t){var e=new Date(r.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function wi(t){var e,i,n,r,s,o=[];if(!t._d){for(n=bi(t),t._w&&null==t._a[Ut]&&null==t._a[Bt]&&Ti(t),null!=t._dayOfYear&&(s=xi(t._a[Nt],n[Nt]),(t._dayOfYear>Xt(s)||0===t._dayOfYear)&&(g(t)._overflowDayOfYear=!0),i=be(s,0,t._dayOfYear),t._a[Bt]=i.getUTCMonth(),t._a[Ut]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=o[e]=n[e];for(;e<7;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[jt]&&0===t._a[Ht]&&0===t._a[zt]&&0===t._a[Wt]&&(t._nextDay=!0,t._a[jt]=0),t._d=(t._useUTC?be:xe).apply(null,o),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[jt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(g(t).weekdayMismatch=!0)}}function Ti(t){var e,i,n,r,s,o,a,h;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)s=1,o=4,i=xi(e.GG,t._a[Nt],Me(qi(),1,4).year),n=xi(e.W,1),((r=xi(e.E,1))<1||r>7)&&(h=!0);else{s=t._locale._week.dow,o=t._locale._week.doy;var u=Me(qi(),s,o);i=xi(e.gg,t._a[Nt],u.year),n=xi(e.w,u.week),null!=e.d?((r=e.d)<0||r>6)&&(h=!0):null!=e.e?(r=e.e+s,(e.e<0||e.e>6)&&(h=!0)):r=s}n<1||n>Se(i,s,o)?g(t)._overflowWeeks=!0:null!=h?g(t)._overflowWeekday=!0:(a=Te(i,n,r,s,o),t._a[Nt]=a.year,t._dayOfYear=a.dayOfYear)}var Mi=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Si=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ei=/Z|[+-]\d\d(?::?\d\d)?/,Li=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ai=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Di=/^\/?Date\((\-?\d+)/i;function Pi(t){var e,i,n,r,s,o,a=t._i,h=Mi.exec(a)||Si.exec(a);if(h){for(g(t).iso=!0,e=0,i=Li.length;e<i;e++)if(Li[e][1].exec(h[1])){r=Li[e][0],n=!1!==Li[e][2];break}if(null==r)return void(t._isValid=!1);if(h[3]){for(e=0,i=Ai.length;e<i;e++)if(Ai[e][1].exec(h[3])){s=(h[2]||" ")+Ai[e][0];break}if(null==s)return void(t._isValid=!1)}if(!n&&null!=s)return void(t._isValid=!1);if(h[4]){if(!Ei.exec(h[4]))return void(t._isValid=!1);o="Z"}t._f=r+(s||"")+(o||""),Ui(t)}else t._isValid=!1}var Ci=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Oi(t,e,i,n,r,s){var o=[ki(t),he.indexOf(e),parseInt(i,10),parseInt(n,10),parseInt(r,10)];return s&&o.push(parseInt(s,10)),o}function ki(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}function Ri(t){return t.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function Ii(t,e,i){return!t||Fe.indexOf(t)===new Date(e[0],e[1],e[2]).getDay()||(g(i).weekdayMismatch=!0,i._isValid=!1,!1)}var Yi={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Fi(t,e,i){if(t)return Yi[t];if(e)return 0;var n=parseInt(i,10),r=n%100;return(n-r)/100*60+r}function Ni(t){var e=Ci.exec(Ri(t._i));if(e){var i=Oi(e[4],e[3],e[2],e[5],e[6],e[7]);if(!Ii(e[1],i,t))return;t._a=i,t._tzm=Fi(e[8],e[9],e[10]),t._d=be.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),g(t).rfc2822=!0}else t._isValid=!1}function Bi(t){var e=Di.exec(t._i);null===e?(Pi(t),!1===t._isValid&&(delete t._isValid,Ni(t),!1===t._isValid&&(delete t._isValid,r.createFromInputFallback(t)))):t._d=new Date(+e[1])}function Ui(t){if(t._f!==r.ISO_8601)if(t._f!==r.RFC_2822){t._a=[],g(t).empty=!0;var e,i,n,s,o,a=""+t._i,h=a.length,u=0;for(n=ct(t._f,t._locale).match(nt)||[],e=0;e<n.length;e++)s=n[e],(i=(a.match(Ct(s,t))||[])[0])&&((o=a.substr(0,a.indexOf(i))).length>0&&g(t).unusedInput.push(o),a=a.slice(a.indexOf(i)+i.length),u+=i.length),ot[s]?(i?g(t).empty=!1:g(t).unusedTokens.push(s),Ft(s,i,t)):t._strict&&!i&&g(t).unusedTokens.push(s);g(t).charsLeftOver=h-u,a.length>0&&g(t).unusedInput.push(a),t._a[jt]<=12&&!0===g(t).bigHour&&t._a[jt]>0&&(g(t).bigHour=void 0),g(t).parsedDateParts=t._a.slice(0),g(t).meridiem=t._meridiem,t._a[jt]=ji(t._locale,t._a[jt],t._meridiem),wi(t),_i(t)}else Ni(t);else Pi(t)}function ji(t,e,i){var n;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?((n=t.isPM(i))&&e<12&&(e+=12),n||12!==e||(e=0),e):e}function Hi(t){var e,i,n,r,s;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(r=0;r<t._f.length;r++)s=0,e=b({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[r],Ui(e),y(e)&&(s+=g(e).charsLeftOver,s+=10*g(e).unusedTokens.length,g(e).score=s,(null==n||s<n)&&(n=s,i=e));f(t,i||e)}function zi(t){if(!t._d){var e=Q(t._i);t._a=d([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],(function(t){return t&&parseInt(t,10)})),wi(t)}}function Wi(t){var e=new T(_i(Gi(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function Gi(t){var e=t._i,i=t._f;return t._locale=t._locale||gi(t._l),null===e||void 0===i&&""===e?_({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),M(e)?new T(_i(e)):(c(e)?t._d=e:o(i)?Hi(t):i?Ui(t):Vi(t),y(t)||(t._d=null),t))}function Vi(t){var e=t._i;u(e)?t._d=new Date(r.now()):c(e)?t._d=new Date(e.valueOf()):"string"==typeof e?Bi(t):o(e)?(t._a=d(e.slice(0),(function(t){return parseInt(t,10)})),wi(t)):a(e)?zi(t):l(e)?t._d=new Date(e):r.createFromInputFallback(t)}function Xi(t,e,i,n,r){var s={};return!0!==i&&!1!==i||(n=i,i=void 0),(a(t)&&h(t)||o(t)&&0===t.length)&&(t=void 0),s._isAMomentObject=!0,s._useUTC=s._isUTC=r,s._l=i,s._i=t,s._f=e,s._strict=n,Wi(s)}function qi(t,e,i,n){return Xi(t,e,i,n,!1)}r.createFromInputFallback=D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))})),r.ISO_8601=function(){},r.RFC_2822=function(){};var Ji=D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=qi.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:_()})),Zi=D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var t=qi.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:_()}));function Ki(t,e){var i,n;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return qi();for(i=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](i)||(i=e[n]);return i}function Qi(){return Ki("isBefore",[].slice.call(arguments,0))}function $i(){return Ki("isAfter",[].slice.call(arguments,0))}var tn=function(){return Date.now?Date.now():+new Date},en=["year","quarter","month","week","day","hour","minute","second","millisecond"];function nn(t){for(var e in t)if(-1===Jt.call(en,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,n=0;n<en.length;++n)if(t[en[n]]){if(i)return!1;parseFloat(t[en[n]])!==E(t[en[n]])&&(i=!0)}return!0}function rn(){return this._isValid}function sn(){return Ln(NaN)}function on(t){var e=Q(t),i=e.year||0,n=e.quarter||0,r=e.month||0,s=e.week||e.isoWeek||0,o=e.day||0,a=e.hour||0,h=e.minute||0,u=e.second||0,l=e.millisecond||0;this._isValid=nn(e),this._milliseconds=+l+1e3*u+6e4*h+1e3*a*60*60,this._days=+o+7*s,this._months=+r+3*n+12*i,this._data={},this._locale=gi(),this._bubble()}function an(t){return t instanceof on}function hn(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function un(t,e){at(t,0,0,(function(){var t=this.utcOffset(),i="+";return t<0&&(t=-t,i="-"),i+it(~~(t/60),2)+e+it(~~t%60,2)}))}un("Z",":"),un("ZZ",""),Pt("Z",Et),Pt("ZZ",Et),It(["Z","ZZ"],(function(t,e,i){i._useUTC=!0,i._tzm=cn(Et,t)}));var ln=/([\+\-]|\d\d)/gi;function cn(t,e){var i=(e||"").match(t);if(null===i)return null;var n=((i[i.length-1]||[])+"").match(ln)||["-",0,0],r=60*n[1]+E(n[2]);return 0===r?0:"+"===n[0]?r:-r}function dn(t,e){var i,n;return e._isUTC?(i=e.clone(),n=(M(t)||c(t)?t.valueOf():qi(t).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+n),r.updateOffset(i,!1),i):qi(t).local()}function pn(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function fn(t,e,i){var n,s=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=cn(Et,t)))return this}else Math.abs(t)<16&&!i&&(t*=60);return!this._isUTC&&e&&(n=pn(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),s!==t&&(!e||this._changeInProgress?On(this,Ln(t-s,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?s:pn(this)}function mn(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function vn(t){return this.utcOffset(0,t)}function gn(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(pn(this),"m")),this}function yn(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=cn(St,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this}function _n(t){return!!this.isValid()&&(t=t?qi(t).utcOffset():0,(this.utcOffset()-t)%60==0)}function xn(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function bn(){if(!u(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),(t=Gi(t))._a){var e=t._isUTC?m(t._a):qi(t._a);this._isDSTShifted=this.isValid()&&L(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function wn(){return!!this.isValid()&&!this._isUTC}function Tn(){return!!this.isValid()&&this._isUTC}function Mn(){return!!this.isValid()&&this._isUTC&&0===this._offset}r.updateOffset=function(){};var Sn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,En=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Ln(t,e){var i,n,r,s=t,o=null;return an(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:l(t)?(s={},e?s[e]=t:s.milliseconds=t):(o=Sn.exec(t))?(i="-"===o[1]?-1:1,s={y:0,d:E(o[Ut])*i,h:E(o[jt])*i,m:E(o[Ht])*i,s:E(o[zt])*i,ms:E(hn(1e3*o[Wt]))*i}):(o=En.exec(t))?(i="-"===o[1]?-1:1,s={y:An(o[2],i),M:An(o[3],i),w:An(o[4],i),d:An(o[5],i),h:An(o[6],i),m:An(o[7],i),s:An(o[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(r=Pn(qi(s.from),qi(s.to)),(s={}).ms=r.milliseconds,s.M=r.months),n=new on(s),an(t)&&p(t,"_locale")&&(n._locale=t._locale),n}function An(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function Dn(t,e){var i={};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Pn(t,e){var i;return t.isValid()&&e.isValid()?(e=dn(e,t),t.isBefore(e)?i=Dn(t,e):((i=Dn(e,t)).milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function Cn(t,e){return function(i,n){var r;return null===n||isNaN(+n)||(O(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),r=i,i=n,n=r),On(this,Ln(i="string"==typeof i?+i:i,n),t),this}}function On(t,e,i,n){var s=e._milliseconds,o=hn(e._days),a=hn(e._months);t.isValid()&&(n=null==n||n,a&&de(t,$t(t,"Month")+a*i),o&&te(t,"Date",$t(t,"Date")+o*i),s&&t._d.setTime(t._d.valueOf()+s*i),n&&r.updateOffset(t,o||a))}Ln.fn=on.prototype,Ln.invalid=sn;var kn=Cn(1,"add"),Rn=Cn(-1,"subtract");function In(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function Yn(t,e){var i=t||qi(),n=dn(i,this).startOf("day"),s=r.calendarFormat(this,n)||"sameElse",o=e&&(k(e[s])?e[s].call(this,i):e[s]);return this.format(o||this.localeData().calendar(s,this,qi(i)))}function Fn(){return new T(this)}function Nn(t,e){var i=M(t)?t:qi(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf())}function Bn(t,e){var i=M(t)?t:qi(t);return!(!this.isValid()||!i.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf())}function Un(t,e,i,n){var r=M(t)?t:qi(t),s=M(e)?e:qi(e);return!!(this.isValid()&&r.isValid()&&s.isValid())&&("("===(n=n||"()")[0]?this.isAfter(r,i):!this.isBefore(r,i))&&(")"===n[1]?this.isBefore(s,i):!this.isAfter(s,i))}function jn(t,e){var i,n=M(t)?t:qi(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=K(e)||"millisecond")?this.valueOf()===n.valueOf():(i=n.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf()))}function Hn(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function zn(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function Wn(t,e,i){var n,r,s;if(!this.isValid())return NaN;if(!(n=dn(t,this)).isValid())return NaN;switch(r=6e4*(n.utcOffset()-this.utcOffset()),e=K(e)){case"year":s=Gn(this,n)/12;break;case"month":s=Gn(this,n);break;case"quarter":s=Gn(this,n)/3;break;case"second":s=(this-n)/1e3;break;case"minute":s=(this-n)/6e4;break;case"hour":s=(this-n)/36e5;break;case"day":s=(this-n-r)/864e5;break;case"week":s=(this-n-r)/6048e5;break;default:s=this-n}return i?s:S(s)}function Gn(t,e){var i=12*(e.year()-t.year())+(e.month()-t.month()),n=t.clone().add(i,"months");return-(i+(e-n<0?(e-n)/(n-t.clone().add(i-1,"months")):(e-n)/(t.clone().add(i+1,"months")-n)))||0}function Vn(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function Xn(t){if(!this.isValid())return null;var e=!0!==t,i=e?this.clone().utc():this;return i.year()<0||i.year()>9999?lt(i,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):k(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",lt(i,"Z")):lt(i,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function qn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",r="-MM-DD[T]HH:mm:ss.SSS",s=e+'[")]';return this.format(i+n+r+s)}function Jn(t){t||(t=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var e=lt(this,t);return this.localeData().postformat(e)}function Zn(t,e){return this.isValid()&&(M(t)&&t.isValid()||qi(t).isValid())?Ln({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Kn(t){return this.from(qi(),t)}function Qn(t,e){return this.isValid()&&(M(t)&&t.isValid()||qi(t).isValid())?Ln({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function $n(t){return this.to(qi(),t)}function tr(t){var e;return void 0===t?this._locale._abbr:(null!=(e=gi(t))&&(this._locale=e),this)}r.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",r.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var er=D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(t){return void 0===t?this.localeData():this.locale(t)}));function ir(){return this._locale}var nr=1e3,rr=60*nr,sr=60*rr,or=3506328*sr;function ar(t,e){return(t%e+e)%e}function hr(t,e,i){return t<100&&t>=0?new Date(t+400,e,i)-or:new Date(t,e,i).valueOf()}function ur(t,e,i){return t<100&&t>=0?Date.UTC(t+400,e,i)-or:Date.UTC(t,e,i)}function lr(t){var e;if(void 0===(t=K(t))||"millisecond"===t||!this.isValid())return this;var i=this._isUTC?ur:hr;switch(t){case"year":e=i(this.year(),0,1);break;case"quarter":e=i(this.year(),this.month()-this.month()%3,1);break;case"month":e=i(this.year(),this.month(),1);break;case"week":e=i(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":e=i(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":e=i(this.year(),this.month(),this.date());break;case"hour":e=this._d.valueOf(),e-=ar(e+(this._isUTC?0:this.utcOffset()*rr),sr);break;case"minute":e=this._d.valueOf(),e-=ar(e,rr);break;case"second":e=this._d.valueOf(),e-=ar(e,nr)}return this._d.setTime(e),r.updateOffset(this,!0),this}function cr(t){var e;if(void 0===(t=K(t))||"millisecond"===t||!this.isValid())return this;var i=this._isUTC?ur:hr;switch(t){case"year":e=i(this.year()+1,0,1)-1;break;case"quarter":e=i(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":e=i(this.year(),this.month()+1,1)-1;break;case"week":e=i(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":e=i(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":e=i(this.year(),this.month(),this.date()+1)-1;break;case"hour":e=this._d.valueOf(),e+=sr-ar(e+(this._isUTC?0:this.utcOffset()*rr),sr)-1;break;case"minute":e=this._d.valueOf(),e+=rr-ar(e,rr)-1;break;case"second":e=this._d.valueOf(),e+=nr-ar(e,nr)-1}return this._d.setTime(e),r.updateOffset(this,!0),this}function dr(){return this._d.valueOf()-6e4*(this._offset||0)}function pr(){return Math.floor(this.valueOf()/1e3)}function fr(){return new Date(this.valueOf())}function mr(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function vr(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function gr(){return this.isValid()?this.toISOString():null}function yr(){return y(this)}function _r(){return f({},g(this))}function xr(){return g(this).overflow}function br(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function wr(t,e){at(0,[t,t.length],0,e)}function Tr(t){return Lr.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Mr(t){return Lr.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Sr(){return Se(this.year(),1,4)}function Er(){var t=this.localeData()._week;return Se(this.year(),t.dow,t.doy)}function Lr(t,e,i,n,r){var s;return null==t?Me(this,n,r).year:(e>(s=Se(t,n,r))&&(e=s),Ar.call(this,t,e,i,n,r))}function Ar(t,e,i,n,r){var s=Te(t,e,i,n,r),o=be(s.year,0,s.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function Dr(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}at(0,["gg",2],0,(function(){return this.weekYear()%100})),at(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),wr("gggg","weekYear"),wr("ggggg","weekYear"),wr("GGGG","isoWeekYear"),wr("GGGGG","isoWeekYear"),Z("weekYear","gg"),Z("isoWeekYear","GG"),tt("weekYear",1),tt("isoWeekYear",1),Pt("G",Mt),Pt("g",Mt),Pt("GG",gt,pt),Pt("gg",gt,pt),Pt("GGGG",bt,mt),Pt("gggg",bt,mt),Pt("GGGGG",wt,vt),Pt("ggggg",wt,vt),Yt(["gggg","ggggg","GGGG","GGGGG"],(function(t,e,i,n){e[n.substr(0,2)]=E(t)})),Yt(["gg","GG"],(function(t,e,i,n){e[n]=r.parseTwoDigitYear(t)})),at("Q",0,"Qo","quarter"),Z("quarter","Q"),tt("quarter",7),Pt("Q",dt),It("Q",(function(t,e){e[Bt]=3*(E(t)-1)})),at("D",["DD",2],"Do","date"),Z("date","D"),tt("date",9),Pt("D",gt),Pt("DD",gt,pt),Pt("Do",(function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient})),It(["D","DD"],Ut),It("Do",(function(t,e){e[Ut]=E(t.match(gt)[0])}));var Pr=Qt("Date",!0);function Cr(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}at("DDD",["DDDD",3],"DDDo","dayOfYear"),Z("dayOfYear","DDD"),tt("dayOfYear",4),Pt("DDD",xt),Pt("DDDD",ft),It(["DDD","DDDD"],(function(t,e,i){i._dayOfYear=E(t)})),at("m",["mm",2],0,"minute"),Z("minute","m"),tt("minute",14),Pt("m",gt),Pt("mm",gt,pt),It(["m","mm"],Ht);var Or=Qt("Minutes",!1);at("s",["ss",2],0,"second"),Z("second","s"),tt("second",15),Pt("s",gt),Pt("ss",gt,pt),It(["s","ss"],zt);var kr,Rr=Qt("Seconds",!1);for(at("S",0,0,(function(){return~~(this.millisecond()/100)})),at(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),at(0,["SSS",3],0,"millisecond"),at(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),at(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),at(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),at(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),at(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),at(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),Z("millisecond","ms"),tt("millisecond",16),Pt("S",xt,dt),Pt("SS",xt,pt),Pt("SSS",xt,ft),kr="SSSS";kr.length<=9;kr+="S")Pt(kr,Tt);function Ir(t,e){e[Wt]=E(1e3*("0."+t))}for(kr="S";kr.length<=9;kr+="S")It(kr,Ir);var Yr=Qt("Milliseconds",!1);function Fr(){return this._isUTC?"UTC":""}function Nr(){return this._isUTC?"Coordinated Universal Time":""}at("z",0,0,"zoneAbbr"),at("zz",0,0,"zoneName");var Br=T.prototype;function Ur(t){return qi(1e3*t)}function jr(){return qi.apply(null,arguments).parseZone()}function Hr(t){return t}Br.add=kn,Br.calendar=Yn,Br.clone=Fn,Br.diff=Wn,Br.endOf=cr,Br.format=Jn,Br.from=Zn,Br.fromNow=Kn,Br.to=Qn,Br.toNow=$n,Br.get=ee,Br.invalidAt=xr,Br.isAfter=Nn,Br.isBefore=Bn,Br.isBetween=Un,Br.isSame=jn,Br.isSameOrAfter=Hn,Br.isSameOrBefore=zn,Br.isValid=yr,Br.lang=er,Br.locale=tr,Br.localeData=ir,Br.max=Zi,Br.min=Ji,Br.parsingFlags=_r,Br.set=ie,Br.startOf=lr,Br.subtract=Rn,Br.toArray=mr,Br.toObject=vr,Br.toDate=fr,Br.toISOString=Xn,Br.inspect=qn,Br.toJSON=gr,Br.toString=Vn,Br.unix=pr,Br.valueOf=dr,Br.creationData=br,Br.year=Zt,Br.isLeapYear=Kt,Br.weekYear=Tr,Br.isoWeekYear=Mr,Br.quarter=Br.quarters=Dr,Br.month=pe,Br.daysInMonth=fe,Br.week=Br.weeks=Pe,Br.isoWeek=Br.isoWeeks=Ce,Br.weeksInYear=Er,Br.isoWeeksInYear=Sr,Br.date=Pr,Br.day=Br.days=ze,Br.weekday=We,Br.isoWeekday=Ge,Br.dayOfYear=Cr,Br.hour=Br.hours=ai,Br.minute=Br.minutes=Or,Br.second=Br.seconds=Rr,Br.millisecond=Br.milliseconds=Yr,Br.utcOffset=fn,Br.utc=vn,Br.local=gn,Br.parseZone=yn,Br.hasAlignedHourOffset=_n,Br.isDST=xn,Br.isLocal=wn,Br.isUtcOffset=Tn,Br.isUtc=Mn,Br.isUTC=Mn,Br.zoneAbbr=Fr,Br.zoneName=Nr,Br.dates=D("dates accessor is deprecated. Use date instead.",Pr),Br.months=D("months accessor is deprecated. Use month instead",pe),Br.years=D("years accessor is deprecated. Use year instead",Zt),Br.zone=D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",mn),Br.isDSTShifted=D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",bn);var zr=Y.prototype;function Wr(t,e,i,n){var r=gi(),s=m().set(n,e);return r[i](s,t)}function Gr(t,e,i){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return Wr(t,e,i,"month");var n,r=[];for(n=0;n<12;n++)r[n]=Wr(t,n,i,"month");return r}function Vr(t,e,i,n){"boolean"==typeof t?(l(e)&&(i=e,e=void 0),e=e||""):(i=e=t,t=!1,l(e)&&(i=e,e=void 0),e=e||"");var r,s=gi(),o=t?s._week.dow:0;if(null!=i)return Wr(e,(i+o)%7,n,"day");var a=[];for(r=0;r<7;r++)a[r]=Wr(e,(r+o)%7,n,"day");return a}function Xr(t,e){return Gr(t,e,"months")}function qr(t,e){return Gr(t,e,"monthsShort")}function Jr(t,e,i){return Vr(t,e,i,"weekdays")}function Zr(t,e,i){return Vr(t,e,i,"weekdaysShort")}function Kr(t,e,i){return Vr(t,e,i,"weekdaysMin")}zr.calendar=N,zr.longDateFormat=U,zr.invalidDate=H,zr.ordinal=G,zr.preparse=Hr,zr.postformat=Hr,zr.relativeTime=X,zr.pastFuture=q,zr.set=R,zr.months=ae,zr.monthsShort=ue,zr.monthsParse=ce,zr.monthsRegex=ye,zr.monthsShortRegex=ve,zr.week=Ee,zr.firstDayOfYear=De,zr.firstDayOfWeek=Ae,zr.weekdays=Ye,zr.weekdaysMin=Ue,zr.weekdaysShort=Ne,zr.weekdaysParse=He,zr.weekdaysRegex=Xe,zr.weekdaysShortRegex=Je,zr.weekdaysMinRegex=Ke,zr.isPM=ni,zr.meridiem=si,fi("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===E(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),r.lang=D("moment.lang is deprecated. Use moment.locale instead.",fi),r.langData=D("moment.langData is deprecated. Use moment.localeData instead.",gi);var Qr=Math.abs;function $r(){var t=this._data;return this._milliseconds=Qr(this._milliseconds),this._days=Qr(this._days),this._months=Qr(this._months),t.milliseconds=Qr(t.milliseconds),t.seconds=Qr(t.seconds),t.minutes=Qr(t.minutes),t.hours=Qr(t.hours),t.months=Qr(t.months),t.years=Qr(t.years),this}function ts(t,e,i,n){var r=Ln(e,i);return t._milliseconds+=n*r._milliseconds,t._days+=n*r._days,t._months+=n*r._months,t._bubble()}function es(t,e){return ts(this,t,e,1)}function is(t,e){return ts(this,t,e,-1)}function ns(t){return t<0?Math.floor(t):Math.ceil(t)}function rs(){var t,e,i,n,r,s=this._milliseconds,o=this._days,a=this._months,h=this._data;return s>=0&&o>=0&&a>=0||s<=0&&o<=0&&a<=0||(s+=864e5*ns(os(a)+o),o=0,a=0),h.milliseconds=s%1e3,t=S(s/1e3),h.seconds=t%60,e=S(t/60),h.minutes=e%60,i=S(e/60),h.hours=i%24,o+=S(i/24),a+=r=S(ss(o)),o-=ns(os(r)),n=S(a/12),a%=12,h.days=o,h.months=a,h.years=n,this}function ss(t){return 4800*t/146097}function os(t){return 146097*t/4800}function as(t){if(!this.isValid())return NaN;var e,i,n=this._milliseconds;if("month"===(t=K(t))||"quarter"===t||"year"===t)switch(e=this._days+n/864e5,i=this._months+ss(e),t){case"month":return i;case"quarter":return i/3;case"year":return i/12}else switch(e=this._days+Math.round(os(this._months)),t){case"week":return e/7+n/6048e5;case"day":return e+n/864e5;case"hour":return 24*e+n/36e5;case"minute":return 1440*e+n/6e4;case"second":return 86400*e+n/1e3;case"millisecond":return Math.floor(864e5*e)+n;default:throw new Error("Unknown unit "+t)}}function hs(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*E(this._months/12):NaN}function us(t){return function(){return this.as(t)}}var ls=us("ms"),cs=us("s"),ds=us("m"),ps=us("h"),fs=us("d"),ms=us("w"),vs=us("M"),gs=us("Q"),ys=us("y");function _s(){return Ln(this)}function xs(t){return t=K(t),this.isValid()?this[t+"s"]():NaN}function bs(t){return function(){return this.isValid()?this._data[t]:NaN}}var ws=bs("milliseconds"),Ts=bs("seconds"),Ms=bs("minutes"),Ss=bs("hours"),Es=bs("days"),Ls=bs("months"),As=bs("years");function Ds(){return S(this.days()/7)}var Ps=Math.round,Cs={ss:44,s:45,m:45,h:22,d:26,M:11};function Os(t,e,i,n,r){return r.relativeTime(e||1,!!i,t,n)}function ks(t,e,i){var n=Ln(t).abs(),r=Ps(n.as("s")),s=Ps(n.as("m")),o=Ps(n.as("h")),a=Ps(n.as("d")),h=Ps(n.as("M")),u=Ps(n.as("y")),l=r<=Cs.ss&&["s",r]||r<Cs.s&&["ss",r]||s<=1&&["m"]||s<Cs.m&&["mm",s]||o<=1&&["h"]||o<Cs.h&&["hh",o]||a<=1&&["d"]||a<Cs.d&&["dd",a]||h<=1&&["M"]||h<Cs.M&&["MM",h]||u<=1&&["y"]||["yy",u];return l[2]=e,l[3]=+t>0,l[4]=i,Os.apply(null,l)}function Rs(t){return void 0===t?Ps:"function"==typeof t&&(Ps=t,!0)}function Is(t,e){return void 0!==Cs[t]&&(void 0===e?Cs[t]:(Cs[t]=e,"s"===t&&(Cs.ss=e-1),!0))}function Ys(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=ks(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}var Fs=Math.abs;function Ns(t){return(t>0)-(t<0)||+t}function Bs(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i=Fs(this._milliseconds)/1e3,n=Fs(this._days),r=Fs(this._months);t=S(i/60),e=S(t/60),i%=60,t%=60;var s=S(r/12),o=r%=12,a=n,h=e,u=t,l=i?i.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var d=c<0?"-":"",p=Ns(this._months)!==Ns(c)?"-":"",f=Ns(this._days)!==Ns(c)?"-":"",m=Ns(this._milliseconds)!==Ns(c)?"-":"";return d+"P"+(s?p+s+"Y":"")+(o?p+o+"M":"")+(a?f+a+"D":"")+(h||u||l?"T":"")+(h?m+h+"H":"")+(u?m+u+"M":"")+(l?m+l+"S":"")}var Us=on.prototype;return Us.isValid=rn,Us.abs=$r,Us.add=es,Us.subtract=is,Us.as=as,Us.asMilliseconds=ls,Us.asSeconds=cs,Us.asMinutes=ds,Us.asHours=ps,Us.asDays=fs,Us.asWeeks=ms,Us.asMonths=vs,Us.asQuarters=gs,Us.asYears=ys,Us.valueOf=hs,Us._bubble=rs,Us.clone=_s,Us.get=xs,Us.milliseconds=ws,Us.seconds=Ts,Us.minutes=Ms,Us.hours=Ss,Us.days=Es,Us.weeks=Ds,Us.months=Ls,Us.years=As,Us.humanize=Ys,Us.toISOString=Bs,Us.toString=Bs,Us.toJSON=Bs,Us.locale=tr,Us.localeData=ir,Us.toIsoString=D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Bs),Us.lang=er,at("X",0,0,"unix"),at("x",0,0,"valueOf"),Pt("x",Mt),Pt("X",Lt),It("X",(function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))})),It("x",(function(t,e,i){i._d=new Date(E(t))})),r.version="2.24.0",s(qi),r.fn=Br,r.min=Qi,r.max=$i,r.now=tn,r.utc=m,r.unix=Ur,r.months=Xr,r.isDate=c,r.locale=fi,r.invalid=_,r.duration=Ln,r.isMoment=M,r.weekdays=Jr,r.parseZone=jr,r.localeData=gi,r.isDuration=an,r.monthsShort=qr,r.weekdaysMin=Kr,r.defineLocale=mi,r.updateLocale=vi,r.locales=yi,r.weekdaysShort=Zr,r.normalizeUnits=K,r.relativeTimeRounding=Rs,r.relativeTimeThreshold=Is,r.calendarFormat=In,r.prototype=Br,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},r}()},33915:t=>{"use strict";var e=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;function r(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}t.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},i=0;i<10;i++)e["_"+String.fromCharCode(i)]=i;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,s){for(var o,a,h=r(t),u=1;u<arguments.length;u++){for(var l in o=Object(arguments[u]))i.call(o,l)&&(h[l]=o[l]);if(e){a=e(o);for(var c=0;c<a.length;c++)n.call(o,a[c])&&(h[a[c]]=o[a[c]])}}return h}},21639:t=>{"use strict";t.exports=function(t,e){e=e||{};for(var i={key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},n=i.parser[e.strictMode?"strict":"loose"].exec(t),r={},s=14;s--;)r[i.key[s]]=n[s]||"";return r[i.q.name]={},r[i.key[12]].replace(i.q.parser,(function(t,e,n){e&&(r[i.q.name][e]=n)})),r}},2859:(t,e,i)=>{var n=i(47379),r=i(27314),s=i(60932),o=i(47708),a=i(73818),h=i(69347),u=i(56218),l=i(57148),c=i(19531),d=i(68970),p=new c,f=new d,m=new c,v=new c,g=new r,y=new n({initialize:function(t){this.scene=t,this.displayList=t.sys.displayList,this.updateList=t.sys.updateList,this.name="",this.direction=new c(0,0,-1),this.up=new c(0,1,0),this.position=new c,this.pixelScale=128,this.projection=new r,this.view=new r,this.combined=new r,this.invProjectionView=new r,this.near=1,this.far=100,this.ray={origin:new c,direction:new c},this.viewportWidth=0,this.viewportHeight=0,this.billboardMatrixDirty=!0,this.children=new h},setPosition:function(t,e,i){return this.position.set(t,e,i),this.update()},setScene:function(t){return this.scene=t,this},setPixelScale:function(t){return this.pixelScale=t,this.update()},add:function(t){return this.children.set(t),this.displayList.add(t.gameObject),this.updateList.add(t.gameObject),this.updateChildren(),t},remove:function(t){return this.displayList.remove(t.gameObject),this.updateList.remove(t.gameObject),this.children.delete(t),this},clear:function(){for(var t=this.getChildren(),e=0;e<t.length;e++)this.remove(t[e]);return this},getChildren:function(){return this.children.entries},create:function(t,e,i,n,r,s){void 0===s&&(s=!0);var o=new u(this.scene,t,e,i,n,r);return this.displayList.add(o.gameObject),this.updateList.add(o.gameObject),o.visible=s,this.children.set(o),this.updateChildren(),o},createMultiple:function(t,e,i,n){void 0===n&&(n=!0);for(var r=[],s=0;s<t;s++){var o=new u(this.scene,0,0,0,e,i);this.displayList.add(o.gameObject),this.updateList.add(o.gameObject),o.visible=n,this.children.set(o),r.push(o)}return r},createRect:function(t,e,i,n){"number"==typeof t&&(t={x:t,y:t,z:t}),"number"==typeof e&&(e={x:e,y:e,z:e});for(var r=t.x*t.y*t.z,s=this.createMultiple(r,i,n),o=0,a=.5-t.z/2;a<t.z/2;a++)for(var h=.5-t.y/2;h<t.y/2;h++)for(var u=.5-t.x/2;u<t.x/2;u++){var l=u*e.x,c=h*e.y,d=a*e.z;s[o].position.set(l,c,d),o++}return this.update(),s},randomSphere:function(t,e){void 0===e&&(e=this.getChildren());for(var i=0;i<e.length;i++)s(e[i].position,t);return this.update()},randomCube:function(t,e){void 0===e&&(e=this.getChildren());for(var i=0;i<e.length;i++)o(e[i].position,t);return this.update()},translateChildren:function(t,e){void 0===e&&(e=this.getChildren());for(var i=0;i<e.length;i++)e[i].position.add(t);return this.update()},transformChildren:function(t,e){void 0===e&&(e=this.getChildren());for(var i=0;i<e.length;i++)e[i].position.transformMat4(t);return this.update()},setViewport:function(t,e){return this.viewportWidth=t,this.viewportHeight=e,this.update()},translate:function(t,e,i){return"object"==typeof t?(this.position.x+=t.x||0,this.position.y+=t.y||0,this.position.z+=t.z||0):(this.position.x+=t||0,this.position.y+=e||0,this.position.z+=i||0),this.update()},lookAt:function(t,e,i){var n=this.direction,r=this.up;return"object"==typeof t?n.copy(t):n.set(t,e,i),n.subtract(this.position).normalize(),p.copy(n).cross(r).normalize(),r.copy(p).cross(n).normalize(),this.update()},rotate:function(t,e){return a(this.direction,e,t),a(this.up,e,t),this.update()},rotateAround:function(t,e,i){return p.copy(t).subtract(this.position),this.translate(p),this.rotate(e,i),this.translate(p.negate()),this.update()},project:function(t,e){void 0===e&&(e=new d);var i=this.viewportWidth,n=this.viewportHeight,r=y.NEAR_RANGE,s=y.FAR_RANGE;return f.set(t.x,t.y,t.z,1),f.transformMat4(this.combined),0===f.w&&(f.w=1),f.x=f.x/f.w,f.y=f.y/f.w,f.z=f.z/f.w,e.x=i/2*f.x+(0+i/2),e.y=n/2*f.y+(0+n/2),e.z=(s-r)/2*f.z+(s+r)/2,(0===e.w||e.w)&&(e.w=1/f.w),e},unproject:function(t,e){void 0===e&&(e=new c);var i=f.set(0,0,this.viewportWidth,this.viewportHeight);return e.copy(t).unproject(i,this.invProjectionView)},getPickRay:function(t,e){var i=this.ray.origin.set(t,e,0),n=this.ray.direction.set(t,e,1),r=f.set(0,0,this.viewportWidth,this.viewportHeight),s=this.invProjectionView;return i.unproject(r,s),n.unproject(r,s),n.subtract(i).normalize(),this.ray},updateChildren:function(){for(var t=this.children.entries,e=0;e<t.length;e++)t[e].project(this);return this},update:function(){return this.updateChildren()},updateBillboardMatrix:function(){var t=m.set(this.direction).negate(),e=v.set(this.up).cross(t).normalize(),i=p.set(t).cross(e).normalize(),n=g.val;n[0]=e.x,n[1]=e.y,n[2]=e.z,n[3]=0,n[4]=i.x,n[5]=i.y,n[6]=i.z,n[7]=0,n[8]=t.x,n[9]=t.y,n[10]=t.z,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this.billboardMatrixDirty=!1},getPointSize:function(t,e,i){void 0===i&&(i=new l),this.billboardMatrixDirty&&this.updateBillboardMatrix();var n=p,r=e.x/this.pixelScale/2,s=e.y/this.pixelScale/2;n.set(-r,-s,0).transformMat4(g).add(t),this.project(n,n);var o=n.x,a=n.y;n.set(r,s,0).transformMat4(g).add(t),this.project(n,n);var h=n.x-o,u=n.y-a;return i.set(h,u)},destroy:function(){this.children.clear(),this.scene=void 0,this.children=void 0},setX:function(t){return this.position.x=t,this.update()},setY:function(t){return this.position.y=t,this.update()},setZ:function(t){return this.position.z=t,this.update()},x:{get:function(){return this.position.x},set:function(t){this.position.x=t,this.update()}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t,this.update()}},z:{get:function(){return this.position.z},set:function(t){this.position.z=t,this.update()}}});y.FAR_RANGE=1,y.NEAR_RANGE=0,t.exports=y},22510:(t,e,i)=>{var n=i(47379),r=i(74353),s=i(42862),o=i(50354),a=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.cameras=[],t.sys.events.once("boot",this.boot,this),t.sys.events.on("start",this.start,this)},boot:function(){this.systems.events.once("destroy",this.destroy,this)},start:function(){var t=this.systems.events;t.on("update",this.update,this),t.once("shutdown",this.shutdown,this)},add:function(t,e,i){return this.addPerspectiveCamera(t,e,i)},addOrthographicCamera:function(t,e){var i=this.scene.sys.game.config;void 0===t&&(t=i.width),void 0===e&&(e=i.height);var n=new r(this.scene,t,e);return this.cameras.push(n),n},addPerspectiveCamera:function(t,e,i){var n=this.scene.sys.game.config;void 0===t&&(t=80),void 0===e&&(e=n.width),void 0===i&&(i=n.height);var r=new s(this.scene,t,e,i);return this.cameras.push(r),r},getCamera:function(t){for(var e=0;e<this.cameras.length;e++)if(this.cameras[e].name===t)return this.cameras[e];return null},removeCamera:function(t){var e=this.cameras.indexOf(t);-1!==e&&this.cameras.splice(e,1)},removeAll:function(){for(;this.cameras.length>0;){this.cameras.pop().destroy()}return this.main},update:function(t,e){for(var i=0,n=this.cameras.length;i<n;++i)this.cameras[i].update(t,e)},shutdown:function(){var t=this.systems.events;t.off("update",this.update,this),t.off("shutdown",this.shutdown,this),this.removeAll()},destroy:function(){this.shutdown(),this.scene.sys.events.off("start",this.start,this),this.scene=null,this.systems=null}});o.register("CameraManager3D",a,"cameras3d"),t.exports=a},74353:(t,e,i)=>{var n=i(2859),r=i(47379),s=new(i(19531)),o=new r({Extends:n,initialize:function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=0),n.call(this,t),this.viewportWidth=e,this.viewportHeight=i,this._zoom=1,this.near=0,this.update()},setToOrtho:function(t,e,i){void 0===e&&(e=this.viewportWidth),void 0===i&&(i=this.viewportHeight);var n=this.zoom;return this.up.set(0,t?-1:1,0),this.direction.set(0,0,t?1:-1),this.position.set(n*e/2,n*i/2,0),this.viewportWidth=e,this.viewportHeight=i,this.update()},update:function(){var t=this.viewportWidth,e=this.viewportHeight,i=Math.abs(this.near),n=Math.abs(this.far),r=this.zoom;return 0===t||0===e||(this.projection.ortho(r*-t/2,r*t/2,r*-e/2,r*e/2,i,n),s.copy(this.position).add(this.direction),this.view.lookAt(this.position,s,this.up),this.combined.copy(this.projection).multiply(this.view),this.invProjectionView.copy(this.combined).invert(),this.billboardMatrixDirty=!0,this.updateChildren()),this},zoom:{get:function(){return this._zoom},set:function(t){this._zoom=t,this.update()}}});t.exports=o},42862:(t,e,i)=>{var n=i(2859),r=i(47379),s=new(i(19531)),o=new r({Extends:n,initialize:function(t,e,i,r){void 0===e&&(e=80),void 0===i&&(i=0),void 0===r&&(r=0),n.call(this,t),this.viewportWidth=i,this.viewportHeight=r,this.fieldOfView=e*Math.PI/180,this.update()},setFOV:function(t){return this.fieldOfView=t*Math.PI/180,this},update:function(){var t=this.viewportWidth/this.viewportHeight;return this.projection.perspective(this.fieldOfView,t,Math.abs(this.near),Math.abs(this.far)),s.copy(this.position).add(this.direction),this.view.lookAt(this.position,s,this.up),this.combined.copy(this.projection).multiply(this.view),this.invProjectionView.copy(this.combined).invert(),this.billboardMatrixDirty=!0,this.updateChildren(),this}});t.exports=o},66005:(t,e,i)=>{t.exports={Camera:i(2859),CameraManager:i(22510),OrthographicCamera:i(74353),PerspectiveCamera:i(42862)}},56218:(t,e,i)=>{var n=i(47379),r=i(90554),s=i(95681),o=i(57148),a=i(68970),h=new n({Extends:r,initialize:function(t,e,i,n,h,u){r.call(this,t,"Sprite3D"),this.gameObject=new s(t,0,0,h,u),this.position=new a(e,i,n),this.size=new o(this.gameObject.width,this.gameObject.height),this.scale=new o(1,1),this.adjustScaleX=!0,this.adjustScaleY=!0,this._visible=!0},project:function(t){var e=this.position,i=this.gameObject;t.project(e,i),t.getPointSize(e,this.size,this.scale),this.scale.x<=0||this.scale.y<=0?i.setVisible(!1):(i.visible||i.setVisible(!0),this.adjustScaleX&&(i.scaleX=this.scale.x),this.adjustScaleY&&(i.scaleY=this.scale.y),i.setDepth(-1*i.z))},setVisible:function(t){return this.visible=t,this},visible:{get:function(){return this._visible},set:function(t){this._visible=t,this.gameObject.visible=t}},x:{get:function(){return this.position.x},set:function(t){this.position.x=t}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t}},z:{get:function(){return this.position.z},set:function(t){this.position.z=t}}});t.exports=h},47712:(t,e,i)=>{var n=i(74865),r=i(4777),s=i(17517),o=i(57687),a=i(56218);s.register("sprite3D",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),s=o(t,"frame",null),h=new a(this.scene,0,0,i,s);return void 0!==e&&(t.add=e),n(this.scene,h,t),r(h,t),h}))},79465:(t,e,i)=>{var n=i(56218);i(81342).register("sprite3D",(function(t,e,i,r,s){var o=new n(this.scene,t,e,i,r,s);return this.displayList.add(o.gameObject),this.updateList.add(o.gameObject),o}))},17108:t=>{t.exports=function(t,e,i){return{instance:e,placementID:t,shown:!1,video:i}}},75329:(t,e,i)=>{var n=i(17108),r=i(47379),s=i(3881),o=i(17168),a=i(88559),h=i(5523),u=i(14879),l=new r({Extends:o,initialize:function(t){o.call(this),this.game=t,this.data=new s(this),this.on("setdata",this.setDataHandler,this),this.on("changedata",this.changeDataHandler,this),this.hasLoaded=!1,this.dataLocked=!1,this.supportedAPIs=[],this.entryPoint="",this.entryPointData=null,this.contextID=null,this.contextType=null,this.locale=null,this.platform=null,this.version=null,this.playerID=null,this.playerName=null,this.playerPhotoURL=null,this.playerCanSubscribeBot=!1,this.paymentsReady=!1,this.catalog=[],this.purchases=[],this.leaderboards={},this.ads=[]},setDataHandler:function(t,e,i){if(!this.dataLocked){var n={};n[e]=i;var r=this;FBInstant.player.setDataAsync(n).then((function(){r.emit("savedata",n)}))}},changeDataHandler:function(t,e,i){if(!this.dataLocked){var n={};n[e]=i;var r=this;FBInstant.player.setDataAsync(n).then((function(){r.emit("savedata",n)}))}},showLoadProgress:function(t){return t.load.on("progress",(function(t){this.hasLoaded||FBInstant.setLoadingProgress(100*t)}),this),t.load.on("complete",(function(){this.hasLoaded||(this.hasLoaded=!0,FBInstant.startGameAsync().then(this.gameStartedHandler.bind(this)))}),this),this},gameStarted:function(){this.hasLoaded?this.gameStartedHandler():(this.hasLoaded=!0,FBInstant.startGameAsync().then(this.gameStartedHandler.bind(this)))},gameStartedHandler:function(){var t=FBInstant.getSupportedAPIs(),e={},i=function(t){return t[1].toUpperCase()};t.forEach((function(t){t=t.replace(/\../g,i),e[t]=!0})),this.supportedAPIs=e,this.getID(),this.getType(),this.getLocale(),this.getPlatform(),this.getSDKVersion(),this.getPlayerID(),this.getPlayerName(),this.getPlayerPhotoURL();var n=this;FBInstant.onPause((function(){n.emit("pause")})),FBInstant.getEntryPointAsync().then((function(t){n.entryPoint=t,n.entryPointData=FBInstant.getEntryPointData(),n.emit("startgame")})).catch((function(t){console.warn(t)})),this.supportedAPIs.paymentsPurchaseAsync&&FBInstant.payments.onReady((function(){n.paymentsReady=!0})).catch((function(t){console.warn(t)}))},checkAPI:function(t){return!!this.supportedAPIs[t]},getID:function(){return!this.contextID&&this.supportedAPIs.contextGetID&&(this.contextID=FBInstant.context.getID()),this.contextID},getType:function(){return!this.contextType&&this.supportedAPIs.contextGetType&&(this.contextType=FBInstant.context.getType()),this.contextType},getLocale:function(){return!this.locale&&this.supportedAPIs.getLocale&&(this.locale=FBInstant.getLocale()),this.locale},getPlatform:function(){return!this.platform&&this.supportedAPIs.getPlatform&&(this.platform=FBInstant.getPlatform()),this.platform},getSDKVersion:function(){return!this.version&&this.supportedAPIs.getSDKVersion&&(this.version=FBInstant.getSDKVersion()),this.version},getPlayerID:function(){return!this.playerID&&this.supportedAPIs.playerGetID&&(this.playerID=FBInstant.player.getID()),this.playerID},getPlayerName:function(){return!this.playerName&&this.supportedAPIs.playerGetName&&(this.playerName=FBInstant.player.getName()),this.playerName},getPlayerPhotoURL:function(){return!this.playerPhotoURL&&this.supportedAPIs.playerGetPhoto&&(this.playerPhotoURL=FBInstant.player.getPhoto()),this.playerPhotoURL},loadPlayerPhoto:function(t,e){return this.playerPhotoURL&&(t.load.setCORS("anonymous"),t.load.image(e,this.playerPhotoURL),t.load.once("filecomplete-image-"+e,(function(){this.emit("photocomplete",e)}),this),t.load.start()),this},canSubscribeBot:function(){if(this.supportedAPIs.playerCanSubscribeBotAsync){var t=this;FBInstant.player.canSubscribeBotAsync().then((function(){t.playerCanSubscribeBot=!0,t.emit("cansubscribebot")})).catch((function(e){t.emit("cansubscribebotfail",e)}))}else this.emit("cansubscribebotfail");return this},subscribeBot:function(){if(this.playerCanSubscribeBot){var t=this;FBInstant.player.subscribeBotAsync().then((function(){t.emit("subscribebot")})).catch((function(e){t.emit("subscribebotfail",e)}))}else this.emit("subscribebotfail");return this},getData:function(t){if(!this.checkAPI("playerGetDataAsync"))return this;Array.isArray(t)||(t=[t]);var e=this;return FBInstant.player.getDataAsync(t).then((function(t){for(var i in e.dataLocked=!0,t)e.data.set(i,t[i]);e.dataLocked=!1,e.emit("getdata",t)})),this},saveData:function(t){if(!this.checkAPI("playerSetDataAsync"))return this;var e=this;return FBInstant.player.setDataAsync(t).then((function(){e.emit("savedata",t)})).catch((function(t){e.emit("savedatafail",t)})),this},flushData:function(){if(!this.checkAPI("playerFlushDataAsync"))return this;var t=this;return FBInstant.player.flushDataAsync().then((function(){t.emit("flushdata")})).catch((function(e){t.emit("flushdatafail",e)})),this},getStats:function(t){if(!this.checkAPI("playerGetStatsAsync"))return this;var e=this;return FBInstant.player.getStatsAsync(t).then((function(t){e.emit("getstats",t)})).catch((function(t){e.emit("getstatsfail",t)})),this},saveStats:function(t){if(!this.checkAPI("playerSetStatsAsync"))return this;var e={};for(var i in t)"number"==typeof t[i]&&(e[i]=t[i]);var n=this;return FBInstant.player.setStatsAsync(e).then((function(){n.emit("savestats",e)})).catch((function(t){n.emit("savestatsfail",t)})),this},incStats:function(t){if(!this.checkAPI("playerIncrementStatsAsync"))return this;var e={};for(var i in t)"number"==typeof t[i]&&(e[i]=t[i]);var n=this;return FBInstant.player.incrementStatsAsync(e).then((function(t){n.emit("incstats",t)})).catch((function(t){n.emit("incstatsfail",t)})),this},saveSession:function(t){return this.checkAPI("setSessionData")?(JSON.stringify(t).length<=1e3?FBInstant.setSessionData(t):console.warn("Session data too long. Max 1000 chars."),this):this},openShare:function(t,e,i,n){return this._share("SHARE",t,e,i,n)},openInvite:function(t,e,i,n){return this._share("INVITE",t,e,i,n)},openRequest:function(t,e,i,n){return this._share("REQUEST",t,e,i,n)},openChallenge:function(t,e,i,n){return this._share("CHALLENGE",t,e,i,n)},_share:function(t,e,i,n,r){if(!this.checkAPI("shareAsync"))return this;if(void 0===r&&(r={}),i)var s=this.game.textures.getBase64(i,n);var o={intent:t,image:s,text:e,data:r},a=this;return FBInstant.shareAsync(o).then((function(){a.emit("resume")})),this},isSizeBetween:function(t,e){return this.checkAPI("contextIsSizeBetween")?FBInstant.context.isSizeBetween(t,e):this},switchContext:function(t){if(!this.checkAPI("contextSwitchAsync"))return this;if(t!==this.contextID){var e=this;FBInstant.context.switchAsync(t).then((function(){e.contextID=FBInstant.context.getID(),e.emit("switch",e.contextID)})).catch((function(t){e.emit("switchfail",t)}))}return this},chooseContext:function(t){if(!this.checkAPI("contextChooseAsync"))return this;var e=this;return FBInstant.context.chooseAsync(t).then((function(){e.contextID=FBInstant.context.getID(),e.emit("choose",e.contextID)})).catch((function(t){e.emit("choosefail",t)})),this},createContext:function(t){if(!this.checkAPI("contextCreateAsync"))return this;var e=this;return FBInstant.context.createAsync(t).then((function(){e.contextID=FBInstant.context.getID(),e.emit("create",e.contextID)})).catch((function(t){e.emit("createfail",t)})),this},getPlayers:function(){if(!this.checkAPI("playerGetConnectedPlayersAsync"))return this;var t=this;return FBInstant.player.getConnectedPlayersAsync().then((function(e){t.emit("players",e)})).catch((function(e){t.emit("playersfail",e)})),this},getCatalog:function(){if(!this.paymentsReady)return this;var t=this,e=this.catalog;return FBInstant.payments.getCatalogAsync().then((function(i){e=[],i.forEach((function(t){e.push(h(t))})),t.emit("getcatalog",e)})).catch((function(e){t.emit("getcatalogfail",e)})),this},getProduct:function(t){for(var e=0;e<this.catalog.length;e++)if(this.catalog[e].productID===t)return this.catalog[e];return null},purchase:function(t,e){if(!this.paymentsReady)return this;var i={productID:t};e&&(i.developerPayload=e);var n=this;return FBInstant.payments.purchaseAsync(i).then((function(t){var e=u(t);n.emit("purchase",e)})).catch((function(t){n.emit("purchasefail",t)})),this},getPurchases:function(){if(!this.paymentsReady)return this;var t=this,e=this.purchases;return FBInstant.payments.getPurchasesAsync().then((function(i){e=[],i.forEach((function(t){e.push(u(t))})),t.emit("getpurchases",e)})).catch((function(e){t.emit("getpurchasesfail",e)})),this},consumePurchase:function(t){if(!this.paymentsReady)return this;var e=this;return FBInstant.payments.consumePurchaseAsync(t).then((function(){e.emit("consumepurchase",t)})).catch((function(t){e.emit("consumepurchasefail",t)})),this},update:function(t,e,i,n,r,s){return this._update("CUSTOM",t,e,i,n,r,s)},updateLeaderboard:function(t,e,i,n,r,s){return this._update("LEADERBOARD",t,e,i,n,r,s)},_update:function(t,e,i,n,r,s,o){if(!this.checkAPI("shareAsync"))return this;if(void 0===e&&(e=""),"string"==typeof i&&(i={default:i}),void 0===o&&(o={}),n)var a=this.game.textures.getBase64(n,r);var h={action:t,cta:e,image:a,text:i,template:s,data:o,strategy:"IMMEDIATE",notification:"NO_PUSH"},u=this;return FBInstant.updateAsync(h).then((function(){u.emit("update")})).catch((function(t){u.emit("updatefail",t)})),this},switchGame:function(t,e){if(!this.checkAPI("switchGameAsync"))return this;if(e&&JSON.stringify(e).length>1e3)return console.warn("Switch Game data too long. Max 1000 chars."),this;var i=this;return FBInstant.switchGameAsync(t,e).then((function(){i.emit("switchgame",t)})).catch((function(t){i.emit("switchgamefail",t)})),this},createShortcut:function(){var t=this;return FBInstant.canCreateShortcutAsync().then((function(e){e&&FBInstant.createShortcutAsync().then((function(){t.emit("shortcutcreated")})).catch((function(e){t.emit("shortcutfailed",e)}))})),this},quit:function(){FBInstant.quit()},log:function(t,e,i){return this.checkAPI("logEvent")?(void 0===i&&(i={}),t.length>=2&&t.length<=40&&FBInstant.logEvent(t,parseFloat(e),i),this):this},preloadAds:function(t){if(!this.checkAPI("getInterstitialAdAsync"))return this;var e;Array.isArray(t)||(t=[t]);var i=this,r=0;for(e=0;e<this.ads.length;e++)this.ads[e].shown||r++;if(r+t.length>=3)return console.warn("Too many AdInstances. Show an ad before loading more"),this;for(e=0;e<t.length;e++){var s,o=t[e];FBInstant.getInterstitialAdAsync(o).then((function(t){return s=t,t.loadAsync()})).then((function(){var t=n(o,s,!1);i.ads.push(t),i.emit("adloaded",t)})).catch((function(t){"ADS_NO_FILL"===t.code?i.emit("adsnofill",o):"ADS_FREQUENT_LOAD"===t.code?i.emit("adsfrequentload",o):console.warn(t)}))}return this},preloadVideoAds:function(t){if(!this.checkAPI("getRewardedVideoAsync"))return this;var e;Array.isArray(t)||(t=[t]);var i=this,r=0;for(e=0;e<this.ads.length;e++)this.ads[e].shown||r++;if(r+t.length>=3)return console.warn("Too many AdInstances. Show an ad before loading more"),this;for(e=0;e<t.length;e++){var s,o=t[e];FBInstant.getRewardedVideoAsync(o).then((function(t){return s=t,t.loadAsync()})).then((function(){var t=n(o,s,!0);i.ads.push(t),i.emit("adloaded",t)})).catch((function(t){"ADS_NO_FILL"===t.code?i.emit("adsnofill",o):"ADS_FREQUENT_LOAD"===t.code?i.emit("adsfrequentload",o):console.warn(t)}))}return this},showAd:function(t){for(var e=this,i=0;i<this.ads.length;i++){var n=this.ads[i];if(n.placementID===t&&!n.shown){n.instance.showAsync().then((function(){n.shown=!0,e.emit("adfinished",n)})).catch((function(t){"ADS_NOT_LOADED"===t.code?e.emit("adsnotloaded",n):"RATE_LIMITED"===t.code&&e.emit("adratelimited",n),e.emit("adshowerror",t,n)}));break}}return this},showVideo:function(t){for(var e=this,i=0;i<this.ads.length;i++){var n=this.ads[i];if(n.placementID===t&&n.video&&!n.shown){n.instance.showAsync().then((function(){n.shown=!0,e.emit("adfinished",n)})).catch((function(t){"ADS_NOT_LOADED"===t.code?e.emit("adsnotloaded",n):"RATE_LIMITED"===t.code&&e.emit("adratelimited",n),e.emit("adshowerror",t,n)}));break}}return this},matchPlayer:function(t,e){if(void 0===t&&(t=null),void 0===e&&(e=!1),!this.checkAPI("matchPlayerAsync"))return this;var i=this;return FBInstant.matchPlayerAsync(t,e).then((function(){i.getID(),i.getType(),i.emit("matchplayer",i.contextID,i.contextType)})),this},getLeaderboard:function(t){if(!this.checkAPI("getLeaderboardAsync"))return this;var e=this;return FBInstant.getLeaderboardAsync(t).then((function(i){var n=new a(e,i);e.leaderboards[t]=n,e.emit("getleaderboard",n)})).catch((function(t){console.warn(t)})),this},destroy:function(){FBInstant.quit(),this.data.destroy(),this.removeAllListeners(),this.catalog=[],this.purchases=[],this.leaderboards=[],this.ads=[],this.game=null}});t.exports=l},88559:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(1891),o=new n({Extends:r,initialize:function(t,e){r.call(this),this.plugin=t,this.ref=e,this.name=e.getName(),this.contextID=e.getContextID(),this.entryCount=0,this.playerScore=null,this.scores=[],this.getEntryCount()},getEntryCount:function(){var t=this;return this.ref.getEntryCountAsync().then((function(e){t.entryCount=e,t.emit("getentrycount",e,t.name)})).catch((function(t){console.warn(t)})),this},setScore:function(t,e){void 0===e&&(e=""),"object"==typeof e&&(e=JSON.stringify(e));var i=this;return this.ref.setScoreAsync(t,e).then((function(t){if(t){var e=s(t);i.playerScore=e,i.emit("setscore",e,i.name)}else i.emit("setscore",null,i.name)})).catch((function(t){console.warn(t)})),this},getPlayerScore:function(){var t=this;return this.ref.getPlayerEntryAsync().then((function(e){if(e){var i=s(e);t.playerScore=i,t.emit("getplayerscore",i,t.name)}else t.emit("getplayerscore",null,t.name)})).catch((function(t){console.warn(t)})),this},getScores:function(t,e){void 0===t&&(t=10),void 0===e&&(e=0);var i=this;return this.ref.getEntriesAsync(t,e).then((function(t){i.scores=[],t.forEach((function(t){i.scores.push(s(t))})),i.emit("getscores",i.scores,i.name)})).catch((function(t){console.warn(t)})),this},getConnectedScores:function(){var t=this;return this.ref.getConnectedPlayerEntriesAsync().then((function(e){t.scores=[],e.forEach((function(e){t.scores.push(s(e))})),t.emit("getconnectedscores",t.scores,t.name)})).catch((function(t){console.warn(t)})),this}});t.exports=o},1891:t=>{t.exports=function(t){return{score:t.getScore(),scoreFormatted:t.getFormattedScore(),timestamp:t.getTimestamp(),rank:t.getRank(),data:t.getExtraData(),playerName:t.getPlayer().getName(),playerPhotoURL:t.getPlayer().getPhoto(),playerID:t.getPlayer().getID()}}},5523:(t,e,i)=>{var n=i(81769);t.exports=function(t){return{title:n(t,"title",""),productID:n(t,"productID",""),description:n(t,"description",""),imageURI:n(t,"imageURI",""),price:n(t,"price",""),priceCurrencyCode:n(t,"priceCurrencyCode","")}}},14879:(t,e,i)=>{var n=i(81769);t.exports=function(t){return{developerPayload:n(t,"developerPayload",""),paymentID:n(t,"paymentID",""),productID:n(t,"productID",""),purchaseTime:n(t,"purchaseTime",""),purchaseToken:n(t,"purchaseToken",""),signedRequest:n(t,"signedRequest","")}}},75423:(t,e,i)=>{var n=i(82526);t.exports=function(t,e,i,r){for(var s=t[0],o=1;o<t.length;o++){var a=t[o];n(a,s,e,i,r),s=a}return t}},98429:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"angle",e,i,r,s)}},1510:t=>{t.exports=function(t,e,i){for(var n=0;n<t.length;n++){var r=t[n];e.call(i,r)}return t}},92254:t=>{t.exports=function(t,e,i){void 0===i&&(i=0);for(var n=i;n<t.length;n++){var r=t[n],s=!0;for(var o in e)r[o]!==e[o]&&(s=!1);if(s)return r}return null}},80501:t=>{t.exports=function(t,e,i){void 0===i&&(i=0);for(var n=i;n<t.length;n++){var r=t[n],s=!0;for(var o in e)r[o]!==e[o]&&(s=!1);if(s)return r}return null}},65922:(t,e,i)=>{var n=i(4026),r=i(1174),s=i(81769),o=i(49035),a=new(i(24860))({sys:{queueDepthSort:o,events:{once:o}}},0,0,1,1);t.exports=function(t,e){void 0===e&&(e={});var i=e.hasOwnProperty("width"),o=e.hasOwnProperty("height"),h=s(e,"width",-1),u=s(e,"height",-1),l=s(e,"cellWidth",1),c=s(e,"cellHeight",l),d=s(e,"position",r.TOP_LEFT),p=s(e,"x",0),f=s(e,"y",0),m=0,v=0,g=h*l,y=u*c;a.setPosition(p,f),a.setSize(l,c);for(var _=0;_<t.length;_++)if(n(t[_],a,d),i&&-1===h)a.x+=l;else if(o&&-1===u)a.y+=c;else if(m+=l,a.x+=l,m===g&&(m=0,v+=c,a.x=p,a.y+=c,v===y))break;return t}},15085:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"alpha",e,i,r,s)}},69585:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"x",e,i,r,s)}},48618:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"x",e,r,o,a),n(t,"y",i,s,o,a)}},90670:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"y",e,i,r,s)}},11778:t=>{t.exports=function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=6.28);for(var r=i,s=(n-i)/t.length,o=0;o<t.length;o++)t[o].x=e.x+e.radius*Math.cos(r),t[o].y=e.y+e.radius*Math.sin(r),r+=s;return t}},12844:t=>{t.exports=function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=6.28);for(var r=i,s=(n-i)/t.length,o=e.width/2,a=e.height/2,h=0;h<t.length;h++)t[h].x=e.x+o*Math.cos(r),t[h].y=e.y+a*Math.sin(r),r+=s;return t}},75178:(t,e,i)=>{var n=i(63280);t.exports=function(t,e){for(var i=n(e,t.length),r=0;r<t.length;r++){var s=t[r],o=i[r];s.x=o.x,s.y=o.y}return t}},39663:(t,e,i)=>{var n=i(56080),r=i(52521),s=i(90387);t.exports=function(t,e,i){void 0===i&&(i=0);var o=n(e,!1,t.length);i>0?r(o,i):i<0&&s(o,Math.abs(i));for(var a=0;a<t.length;a++)t[a].x=o[a].x,t[a].y=o[a].y;return t}},53040:(t,e,i)=>{var n=i(25501);t.exports=function(t,e,i){var r=n({x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},i),s=n({x1:e.x2,y1:e.y2,x2:e.x3,y2:e.y3},i),o=n({x1:e.x3,y1:e.y3,x2:e.x1,y2:e.y1},i);r.pop(),s.pop(),o.pop();for(var a=(r=r.concat(s,o)).length/t.length,h=0,u=0;u<t.length;u++){var l=t[u],c=r[Math.floor(h)];l.x=c.x,l.y=c.y,h+=a}return t}},85272:t=>{t.exports=function(t,e,i){for(var n=0;n<t.length;n++)t[n].anims.play(e,i);return t}},5334:t=>{t.exports=function(t,e,i,n,r,s){var o;void 0===n&&(n=0),void 0===r&&(r=0),void 0===s&&(s=1);var a=0,h=t.length;if(1===s)for(o=r;o<h;o++)t[o][e]+=i+a*n,a++;else for(o=r;o>=0;o--)t[o][e]+=i+a*n,a++;return t}},3224:t=>{t.exports=function(t,e,i,n,r,s){var o;void 0===n&&(n=0),void 0===r&&(r=0),void 0===s&&(s=1);var a=0,h=t.length;if(1===s)for(o=r;o<h;o++)t[o][e]=i+a*n,a++;else for(o=r;o>=0;o--)t[o][e]=i+a*n,a++;return t}},59192:(t,e,i)=>{var n=i(49642);t.exports=function(t,e){for(var i=0;i<t.length;i++)n(e,t[i]);return t}},79532:(t,e,i)=>{var n=i(6129);t.exports=function(t,e){for(var i=0;i<t.length;i++)n(e,t[i]);return t}},40971:(t,e,i)=>{var n=i(89357);t.exports=function(t,e){for(var i=0;i<t.length;i++)n(e,t[i]);return t}},88694:(t,e,i)=>{var n=i(69633);t.exports=function(t,e){for(var i=0;i<t.length;i++)n(e,t[i]);return t}},66381:(t,e,i)=>{var n=i(40471);t.exports=function(t,e){for(var i=0;i<t.length;i++)n(e,t[i]);return t}},68242:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"rotation",e,i,r,s)}},86231:(t,e,i)=>{var n=i(81771),r=i(73587);t.exports=function(t,e,i){for(var s=e.x,o=e.y,a=0;a<t.length;a++){var h=t[a];n(h,s,o,i,Math.max(1,r(h.x,h.y,s,o)))}return t}},81453:(t,e,i)=>{var n=i(81771);t.exports=function(t,e,i,r){var s=e.x,o=e.y;if(0===r)return t;for(var a=0;a<t.length;a++)n(t[a],s,o,i,r);return t}},11319:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"scaleX",e,i,r,s)}},31485:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"scaleX",e,r,o,a),n(t,"scaleY",i,s,o,a)}},19366:(t,e,i)=>{var n=i(5334);t.exports=function(t,e,i,r,s){return n(t,"scaleY",e,i,r,s)}},87583:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"alpha",e,i,r,s)}},18701:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r){return n(t,"blendMode",e,0,i,r)}},85288:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"depth",e,i,r,s)}},91709:t=>{t.exports=function(t,e,i){for(var n=0;n<t.length;n++)t[n].setInteractive(e,i);return t}},21464:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"originX",e,r,o,a),n(t,"originY",i,s,o,a)}},78976:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"rotation",e,i,r,s)}},29437:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"scaleX",e,r,o,a),n(t,"scaleY",i,s,o,a)}},43709:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"scaleX",e,i,r,s)}},95833:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"scaleY",e,i,r,s)}},43795:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"scrollFactorX",e,r,o,a),n(t,"scrollFactorY",i,s,o,a)}},14586:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"scrollFactorX",e,i,r,s)}},8186:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"scrollFactorY",e,i,r,s)}},47939:t=>{t.exports=function(t,e,i,n,r){for(var s=0;s<t.length;s++)t[s].setTint(e,i,n,r);return t}},98344:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r){return n(t,"visible",e,0,i,r)}},3956:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"x",e,i,r,s)}},78511:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s,o,a){return null==i&&(i=e),n(t,"x",e,r,o,a),n(t,"y",i,s,o,a)}},2758:(t,e,i)=>{var n=i(3224);t.exports=function(t,e,i,r,s){return n(t,"y",e,i,r,s)}},76740:(t,e,i)=>{var n=i(57148);t.exports=function(t,e,i,r,s){var o,a,h,u,l,c;if(void 0===r&&(r=0),void 0===s&&(s=new n),t.length>1)if(0===r){var d=t.length-1;for(o=t[d].x,a=t[d].y,h=d-1;h>=0;h--)u=(c=t[h]).x,l=c.y,c.x=o,c.y=a,o=u,a=l;t[d].x=e,t[d].y=i}else{for(o=t[0].x,a=t[0].y,h=1;h<t.length;h++)u=(c=t[h]).x,l=c.y,c.x=o,c.y=a,o=u,a=l;t[0].x=e,t[0].y=i}else o=t[0].x,a=t[0].y,t[0].x=e,t[0].y=i;return s.x=o,s.y=a,s}},94020:(t,e,i)=>{var n=i(84851);t.exports=function(t){return n(t)}},62946:(t,e,i)=>{var n=i(7695);t.exports=function(t,e,i,r,s){void 0===s&&(s=!1);var o,a=Math.abs(r-i)/t.length;if(s)for(o=0;o<t.length;o++)t[o][e]+=n(o*a,i,r);else for(o=0;o<t.length;o++)t[o][e]=n(o*a,i,r);return t}},85997:(t,e,i)=>{var n=i(83088);t.exports=function(t,e,i,r,s){void 0===s&&(s=!1);var o,a=Math.abs(r-i)/t.length;if(s)for(o=0;o<t.length;o++)t[o][e]+=n(o*a,i,r);else for(o=0;o<t.length;o++)t[o][e]=n(o*a,i,r);return t}},50312:t=>{t.exports=function(t,e,i,n,r){void 0===r&&(r=!1);var s,o=Math.abs(n-i)/t.length;if(r)for(s=0;s<t.length;s++)t[s][e]+=s*o+i;else for(s=0;s<t.length;s++)t[s][e]=s*o+i;return t}},37442:t=>{t.exports=function(t){for(var e=0;e<t.length;e++)t[e].visible=!t[e].visible;return t}},12131:(t,e,i)=>{var n=i(62951);t.exports=function(t,e,i){void 0===i&&(i=0);for(var r=0;r<t.length;r++){var s=t[r];s.x=n(s.x,e.left-i,e.right+i),s.y=n(s.y,e.top-i,e.bottom+i)}return t}},5490:(t,e,i)=>{t.exports={AlignTo:i(75423),Angle:i(98429),Call:i(1510),GetFirst:i(92254),GetLast:i(80501),GridAlign:i(65922),IncAlpha:i(15085),IncX:i(69585),IncXY:i(48618),IncY:i(90670),PlaceOnCircle:i(11778),PlaceOnEllipse:i(12844),PlaceOnLine:i(75178),PlaceOnRectangle:i(39663),PlaceOnTriangle:i(53040),PlayAnimation:i(85272),PropertyValueInc:i(5334),PropertyValueSet:i(3224),RandomCircle:i(59192),RandomEllipse:i(79532),RandomLine:i(40971),RandomRectangle:i(88694),RandomTriangle:i(66381),Rotate:i(68242),RotateAround:i(86231),RotateAroundDistance:i(81453),ScaleX:i(11319),ScaleXY:i(31485),ScaleY:i(19366),SetAlpha:i(87583),SetBlendMode:i(18701),SetDepth:i(85288),SetHitArea:i(91709),SetOrigin:i(21464),SetRotation:i(78976),SetScale:i(29437),SetScaleX:i(43709),SetScaleY:i(95833),SetScrollFactor:i(43795),SetScrollFactorX:i(14586),SetScrollFactorY:i(8186),SetTint:i(47939),SetVisible:i(98344),SetX:i(3956),SetXY:i(78511),SetY:i(2758),ShiftPosition:i(76740),Shuffle:i(94020),SmootherStep:i(85997),SmoothStep:i(62946),Spread:i(50312),ToggleVisible:i(37442),WrapInRectangle:i(12131)}},78010:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(17168),o=i(31045),a=i(87559),h=i(68463),u=i(86652),l=new r({Extends:s,initialize:function(t,e,i){s.call(this),this.manager=t,this.key=e,this.type="frame",this.frames=this.getFrames(t.textureManager,u(i,"frames",[]),u(i,"defaultTextureKey",null)),this.frameRate=u(i,"frameRate",null),this.duration=u(i,"duration",null),null===this.duration&&null===this.frameRate?(this.frameRate=24,this.duration=this.frameRate/this.frames.length*1e3):this.duration&&null===this.frameRate?this.frameRate=this.frames.length/(this.duration/1e3):this.duration=this.frames.length/this.frameRate*1e3,this.msPerFrame=1e3/this.frameRate,this.skipMissedFrames=u(i,"skipMissedFrames",!0),this.delay=u(i,"delay",0),this.repeat=u(i,"repeat",0),this.repeatDelay=u(i,"repeatDelay",0),this.yoyo=u(i,"yoyo",!1),this.showOnStart=u(i,"showOnStart",!1),this.hideOnComplete=u(i,"hideOnComplete",!1),this.paused=!1,this.manager.on(o.PAUSE_ALL,this.pause,this),this.manager.on(o.RESUME_ALL,this.resume,this)},addFrame:function(t){return this.addFrameAt(this.frames.length,t)},addFrameAt:function(t,e){var i=this.getFrames(this.manager.textureManager,e);if(i.length>0){if(0===t)this.frames=i.concat(this.frames);else if(t===this.frames.length)this.frames=this.frames.concat(i);else{var n=this.frames.slice(0,t),r=this.frames.slice(t);this.frames=n.concat(i,r)}this.updateFrameSequence()}return this},checkFrame:function(t){return t>=0&&t<this.frames.length},completeAnimation:function(t){this.hideOnComplete&&(t.parent.visible=!1),t.stop()},getFirstTick:function(t,e){void 0===e&&(e=!0),t.accumulator=0,t.nextTick=t.msPerFrame+t.currentFrame.duration,e&&(t.nextTick+=t._delay)},getFrameAt:function(t){return this.frames[t]},getFrames:function(t,e,i){var n,r,s,o,a=[],l=1;if("string"==typeof e){o=e;var c=t.get(o).getFrameNames();e=[],c.forEach((function(t,i){e.push({key:o,frame:i})}))}if(!Array.isArray(e)||0===e.length)return a;for(s=0;s<e.length;s++){var d=e[s],p=u(d,"key",i);if(p){var f=u(d,"frame",0),m=t.getFrame(p,f);(r=new h(p,f,l,m)).duration=u(d,"duration",0),r.isFirst=!n,n&&(n.nextFrame=r,r.prevFrame=n),a.push(r),n=r,l++}}if(a.length>0){r.isLast=!0,r.nextFrame=a[0],a[0].prevFrame=r;var v=1/(a.length-1);for(s=0;s<a.length;s++)a[s].progress=s*v}return a},getNextTick:function(t){t.accumulator-=t.nextTick,t.nextTick=t.msPerFrame+t.currentFrame.duration},load:function(t,e){e>=this.frames.length&&(e=0),t.currentAnim!==this&&(t.currentAnim=this,t.frameRate=this.frameRate,t.duration=this.duration,t.msPerFrame=this.msPerFrame,t.skipMissedFrames=this.skipMissedFrames,t._delay=this.delay,t._repeat=this.repeat,t._repeatDelay=this.repeatDelay,t._yoyo=this.yoyo);var i=this.frames[e];0!==e||t.forward||(i=this.getLastFrame()),t.updateFrame(i)},getFrameByProgress:function(t){return t=n(t,0,1),a(t,this.frames,"progress")},nextFrame:function(t){var e=t.currentFrame;e.isLast?t._yoyo?this.handleYoyoFrame(t,!1):t.repeatCounter>0?t._reverse&&t.forward?t.forward=!1:this.repeatAnimation(t):this.completeAnimation(t):this.updateAndGetNextTick(t,e.nextFrame)},handleYoyoFrame:function(t,e){if(e||(e=!1),t._reverse===!e&&t.repeatCounter>0)return t._repeatDelay&&!t.pendingRepeat||(t.forward=e),void this.repeatAnimation(t);if(t._reverse===e||0!==t.repeatCounter){t.forward=e;var i=e?t.currentFrame.nextFrame:t.currentFrame.prevFrame;this.updateAndGetNextTick(t,i)}else this.completeAnimation(t)},getLastFrame:function(){return this.frames[this.frames.length-1]},previousFrame:function(t){var e=t.currentFrame;e.isFirst?t._yoyo?this.handleYoyoFrame(t,!0):t.repeatCounter>0?t._reverse&&!t.forward?(t.currentFrame=this.getLastFrame(),this.repeatAnimation(t)):(t.forward=!0,this.repeatAnimation(t)):this.completeAnimation(t):this.updateAndGetNextTick(t,e.prevFrame)},updateAndGetNextTick:function(t,e){t.updateFrame(e),this.getNextTick(t)},removeFrame:function(t){var e=this.frames.indexOf(t);return-1!==e&&this.removeFrameAt(e),this},removeFrameAt:function(t){return this.frames.splice(t,1),this.updateFrameSequence(),this},repeatAnimation:function(t){if(2===t._pendingStop)return this.completeAnimation(t);if(t._repeatDelay>0&&!1===t.pendingRepeat)t.pendingRepeat=!0,t.accumulator-=t.nextTick,t.nextTick+=t._repeatDelay;else if(t.repeatCounter--,t.updateFrame(t.currentFrame[t.forward?"nextFrame":"prevFrame"]),t.isPlaying){this.getNextTick(t),t.pendingRepeat=!1;var e=t.currentFrame,i=t.parent;this.emit(o.ANIMATION_REPEAT,this,e),i.emit(o.SPRITE_ANIMATION_KEY_REPEAT+this.key,this,e,t.repeatCounter,i),i.emit(o.SPRITE_ANIMATION_REPEAT,this,e,t.repeatCounter,i)}},setFrame:function(t){t.forward?this.nextFrame(t):this.previousFrame(t)},toJSON:function(){var t={key:this.key,type:this.type,frames:[],frameRate:this.frameRate,duration:this.duration,skipMissedFrames:this.skipMissedFrames,delay:this.delay,repeat:this.repeat,repeatDelay:this.repeatDelay,yoyo:this.yoyo,showOnStart:this.showOnStart,hideOnComplete:this.hideOnComplete};return this.frames.forEach((function(e){t.frames.push(e.toJSON())})),t},updateFrameSequence:function(){for(var t,e=this.frames.length,i=1/(e-1),n=0;n<e;n++)(t=this.frames[n]).index=n+1,t.isFirst=!1,t.isLast=!1,t.progress=n*i,0===n?(t.isFirst=!0,1===e?(t.isLast=!0,t.nextFrame=t,t.prevFrame=t):(t.isLast=!1,t.prevFrame=this.frames[e-1],t.nextFrame=this.frames[n+1])):n===e-1&&e>1?(t.isLast=!0,t.prevFrame=this.frames[e-2],t.nextFrame=this.frames[0]):e>1&&(t.prevFrame=this.frames[n-1],t.nextFrame=this.frames[n+1]);return this},pause:function(){return this.paused=!0,this},resume:function(){return this.paused=!1,this},destroy:function(){this.removeAllListeners(),this.manager.off(o.PAUSE_ALL,this.pause,this),this.manager.off(o.RESUME_ALL,this.resume,this),this.manager.remove(this.key);for(var t=0;t<this.frames.length;t++)this.frames[t].destroy();this.frames=[],this.manager=null}});t.exports=l},68463:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n){this.textureKey=t,this.textureFrame=e,this.index=i,this.frame=n,this.isFirst=!1,this.isLast=!1,this.prevFrame=null,this.nextFrame=null,this.duration=0,this.progress=0},toJSON:function(){return{key:this.textureKey,frame:this.textureFrame,duration:this.duration}},destroy:function(){this.frame=void 0}});t.exports=n},32472:(t,e,i)=>{var n=i(78010),r=i(47379),s=i(25094),o=i(17168),a=i(31045),h=i(80827),u=i(86652),l=i(10872),c=new r({Extends:o,initialize:function(t){o.call(this),this.game=t,this.textureManager=null,this.globalTimeScale=1,this.anims=new s,this.paused=!1,this.name="AnimationManager",t.events.once(h.BOOT,this.boot,this)},boot:function(){this.textureManager=this.game.textures,this.game.events.once(h.DESTROY,this.destroy,this)},add:function(t,e){return this.anims.has(t)?(console.warn("Animation key exists: "+t),this):(e.key=t,this.anims.set(t,e),this.emit(a.ADD_ANIMATION,t,e),this)},exists:function(t){return this.anims.has(t)},create:function(t){var e=t.key,i=!1;return e&&((i=this.get(e))||(i=new n(this,e,t),this.anims.set(e,i),this.emit(a.ADD_ANIMATION,e,i))),i},fromJSON:function(t,e){void 0===e&&(e=!1),e&&this.anims.clear(),"string"==typeof t&&(t=JSON.parse(t));var i=[];if(t.hasOwnProperty("anims")&&Array.isArray(t.anims)){for(var n=0;n<t.anims.length;n++)i.push(this.create(t.anims[n]));t.hasOwnProperty("globalTimeScale")&&(this.globalTimeScale=t.globalTimeScale)}else t.hasOwnProperty("key")&&"frame"===t.type&&i.push(this.create(t));return i},generateFrameNames:function(t,e){var i=u(e,"prefix",""),n=u(e,"start",0),r=u(e,"end",0),s=u(e,"suffix",""),o=u(e,"zeroPad",0),a=u(e,"outputArray",[]),h=u(e,"frames",!1),c=this.textureManager.get(t);if(!c)return a;var d,p,f=n<r?1:-1;if(r+=f,e)if(Array.isArray(h))for(d=0;d<h.length;d++)p=i+l(h[d],o,"0",1)+s,c.has(p)&&a.push({key:t,frame:p});else for(d=n;d!==r;d+=f)p=i+l(d,o,"0",1)+s,c.has(p)&&a.push({key:t,frame:p});else for(h=c.getFrameNames(),d=0;d<h.length;d++)a.push({key:t,frame:h[d]});return a},generateFrameNumbers:function(t,e){var i,n=u(e,"start",0),r=u(e,"end",-1),s=u(e,"first",!1),o=u(e,"outputArray",[]),a=u(e,"frames",!1),h=this.textureManager.get(t);if(!h)return o;if(s&&h.has(s)&&o.push({key:t,frame:s}),Array.isArray(a))for(i=0;i<a.length;i++)h.has(a[i])&&o.push({key:t,frame:a[i]});else{-1===r&&(r=h.frameTotal);var l=n<r?1:-1;for(r+=l,i=n;i!==r;i+=l)h.has(i)&&o.push({key:t,frame:i})}return o},get:function(t){return this.anims.get(t)},load:function(t,e,i){var n=this.get(e);return n?n.load(t,i):console.warn("Missing animation: "+e),t},pauseAll:function(){return this.paused||(this.paused=!0,this.emit(a.PAUSE_ALL)),this},play:function(t,e){if(Array.isArray(e)||(e=[e]),!this.get(t))return this;for(var i=0;i<e.length;i++)e[i].anims.play(t);return this},remove:function(t){var e=this.get(t);return e&&(this.emit(a.REMOVE_ANIMATION,t,e),this.anims.delete(t)),e},resumeAll:function(){return this.paused&&(this.paused=!1,this.emit(a.RESUME_ALL)),this},staggerPlay:function(t,e,i){if(void 0===i&&(i=0),Array.isArray(e)||(e=[e]),!this.get(t))return this;for(var n=0;n<e.length;n++)e[n].anims.delayedPlay(i*n,t);return this},toJSON:function(t){var e={anims:[],globalTimeScale:this.globalTimeScale};return void 0!==t&&""!==t?e.anims.push(this.anims.get(t).toJSON()):this.anims.each((function(t,i){e.anims.push(i.toJSON())})),e},destroy:function(){this.anims.clear(),this.textureManager=null,this.game=null}});t.exports=c},80052:t=>{t.exports="add"},19926:t=>{t.exports="complete"},3768:t=>{t.exports="repeat"},59968:t=>{t.exports="restart"},44563:t=>{t.exports="start"},99802:t=>{t.exports="pauseall"},80380:t=>{t.exports="remove"},94711:t=>{t.exports="resumeall"},96903:t=>{t.exports="animationcomplete"},82342:t=>{t.exports="animationcomplete-"},21379:t=>{t.exports="animationrepeat-"},93167:t=>{t.exports="animationrestart-"},75002:t=>{t.exports="animationstart-"},75226:t=>{t.exports="animationupdate-"},65410:t=>{t.exports="animationrepeat"},8862:t=>{t.exports="animationrestart"},26627:t=>{t.exports="animationstart"},1379:t=>{t.exports="animationupdate"},31045:(t,e,i)=>{t.exports={ADD_ANIMATION:i(80052),ANIMATION_COMPLETE:i(19926),ANIMATION_REPEAT:i(3768),ANIMATION_RESTART:i(59968),ANIMATION_START:i(44563),PAUSE_ALL:i(99802),REMOVE_ANIMATION:i(80380),RESUME_ALL:i(94711),SPRITE_ANIMATION_COMPLETE:i(96903),SPRITE_ANIMATION_KEY_COMPLETE:i(82342),SPRITE_ANIMATION_KEY_REPEAT:i(21379),SPRITE_ANIMATION_KEY_RESTART:i(93167),SPRITE_ANIMATION_KEY_START:i(75002),SPRITE_ANIMATION_KEY_UPDATE:i(75226),SPRITE_ANIMATION_REPEAT:i(65410),SPRITE_ANIMATION_RESTART:i(8862),SPRITE_ANIMATION_START:i(26627),SPRITE_ANIMATION_UPDATE:i(1379)}},53781:(t,e,i)=>{t.exports={Animation:i(78010),AnimationFrame:i(68463),AnimationManager:i(32472),Events:i(31045)}},65462:(t,e,i)=>{var n=i(47379),r=i(25094),s=i(17168),o=i(93887),a=new n({initialize:function(){this.entries=new r,this.events=new s},add:function(t,e){return this.entries.set(t,e),this.events.emit(o.ADD,this,t,e),this},has:function(t){return this.entries.has(t)},exists:function(t){return this.entries.has(t)},get:function(t){return this.entries.get(t)},remove:function(t){var e=this.get(t);return e&&(this.entries.delete(t),this.events.emit(o.REMOVE,this,t,e.data)),this},getKeys:function(){return this.entries.keys()},destroy:function(){this.entries.clear(),this.events.removeAllListeners(),this.entries=null,this.events=null}});t.exports=a},27378:(t,e,i)=>{var n=i(65462),r=i(47379),s=i(80827),o=new r({initialize:function(t){this.game=t,this.binary=new n,this.bitmapFont=new n,this.json=new n,this.physics=new n,this.shader=new n,this.audio=new n,this.video=new n,this.text=new n,this.html=new n,this.obj=new n,this.tilemap=new n,this.xml=new n,this.custom={},this.game.events.once(s.DESTROY,this.destroy,this)},addCustom:function(t){return this.custom.hasOwnProperty(t)||(this.custom[t]=new n),this.custom[t]},destroy:function(){for(var t=["binary","bitmapFont","json","physics","shader","audio","video","text","html","obj","tilemap","xml"],e=0;e<t.length;e++)this[t[e]].destroy(),this[t[e]]=null;for(var i in this.custom)this.custom[i].destroy();this.custom=null,this.game=null}});t.exports=o},28994:t=>{t.exports="add"},36030:t=>{t.exports="remove"},93887:(t,e,i)=>{t.exports={ADD:i(28994),REMOVE:i(36030)}},95865:(t,e,i)=>{t.exports={BaseCache:i(65462),CacheManager:i(27378),Events:i(93887)}},22190:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(98436),o=i(17168),a=i(25920),h=i(38092),u=i(65492),l=i(64031),c=i(57148),d=new n({Extends:o,Mixins:[r.Alpha,r.Visible],initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),o.call(this),this.scene,this.sceneManager,this.scaleManager,this.cameraManager,this.id=0,this.name="",this.resolution=1,this.roundPixels=!1,this.useBounds=!1,this.worldView=new h,this.dirty=!0,this._x=t,this._y=e,this._cx=0,this._cy=0,this._cw=0,this._ch=0,this._width=i,this._height=n,this._bounds=new h,this._scrollX=0,this._scrollY=0,this._zoom=1,this._rotation=0,this.matrix=new u,this.transparent=!0,this.backgroundColor=l("rgba(0,0,0,0)"),this.disableCull=!1,this.culledObjects=[],this.midPoint=new c(i/2,n/2),this.originX=.5,this.originY=.5,this._customViewport=!1,this.mask=null,this._maskCamera=null},setOrigin:function(t,e){return void 0===t&&(t=.5),void 0===e&&(e=t),this.originX=t,this.originY=e,this},getScroll:function(t,e,i){void 0===i&&(i=new c);var n=.5*this.width,r=.5*this.height;return i.x=t-n,i.y=e-r,this.useBounds&&(i.x=this.clampX(i.x),i.y=this.clampY(i.y)),i},centerOnX:function(t){var e=.5*this.width;return this.midPoint.x=t,this.scrollX=t-e,this.useBounds&&(this.scrollX=this.clampX(this.scrollX)),this},centerOnY:function(t){var e=.5*this.height;return this.midPoint.y=t,this.scrollY=t-e,this.useBounds&&(this.scrollY=this.clampY(this.scrollY)),this},centerOn:function(t,e){return this.centerOnX(t),this.centerOnY(e),this},centerToBounds:function(){if(this.useBounds){var t=this._bounds,e=.5*this.width,i=.5*this.height;this.midPoint.set(t.centerX,t.centerY),this.scrollX=t.centerX-e,this.scrollY=t.centerY-i}return this},centerToSize:function(){return this.scrollX=.5*this.width,this.scrollY=.5*this.height,this},cull:function(t){if(this.disableCull)return t;var e=this.matrix.matrix,i=e[0],n=e[1],r=e[2],s=e[3],o=i*s-n*r;if(!o)return t;var a=e[4],h=e[5],u=this.scrollX,l=this.scrollY,c=this.width,d=this.height,p=this.culledObjects,f=t.length;o=1/o,p.length=0;for(var m=0;m<f;++m){var v=t[m];if(v.hasOwnProperty("width")&&!v.parentContainer){var g=v.width,y=v.height,_=v.x-u*v.scrollFactorX-g*v.originX,x=v.y-l*v.scrollFactorY-y*v.originY,b=_*i+x*r+a,w=_*n+x*s+h,T=(_+g)*i+(x+y)*r+a,M=(_+g)*n+(x+y)*s+h,S=this.y,E=S+d,L=this.x;T>L&&b<L+c&&M>S&&w<E&&p.push(v)}else p.push(v)}return p},getWorldPoint:function(t,e,i){void 0===i&&(i=new c);var n=this.matrix.matrix,r=n[0],s=n[1],o=n[2],a=n[3],h=n[4],u=n[5],l=r*a-s*o;if(!l)return i.x=t,i.y=e,i;var d=a*(l=1/l),p=-s*l,f=-o*l,m=r*l,v=(o*u-a*h)*l,g=(s*h-r*u)*l,y=Math.cos(this.rotation),_=Math.sin(this.rotation),x=this.zoom,b=this.resolution,w=this.scrollX,T=this.scrollY,M=t+(w*y-T*_)*x,S=e+(w*_+T*y)*x;return i.x=(M*d+S*f)*b+v,i.y=(M*p+S*m)*b+g,i},ignore:function(t){var e=this.id;Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i];Array.isArray(n)?this.ignore(n):n.isParent?this.ignore(n.getChildren()):n.cameraFilter|=e}return this},preRender:function(t){var e=this.width,i=this.height,n=.5*e,r=.5*i,s=this.zoom*t,o=this.matrix,a=e*this.originX,h=i*this.originY,u=this.scrollX,l=this.scrollY;this.useBounds&&(u=this.clampX(u),l=this.clampY(l)),this.roundPixels&&(a=Math.round(a),h=Math.round(h)),this.scrollX=u,this.scrollY=l;var c=u+n,d=l+r;this.midPoint.set(c,d);var p=e/s,f=i/s;this.worldView.setTo(c-p/2,d-f/2,p,f),o.applyITRS(this.x+a,this.y+h,this.rotation,s,s),o.translate(-a,-h)},clampX:function(t){var e=this._bounds,i=this.displayWidth,n=e.x+(i-this.width)/2,r=Math.max(n,n+e.width-i);return t<n?t=n:t>r&&(t=r),t},clampY:function(t){var e=this._bounds,i=this.displayHeight,n=e.y+(i-this.height)/2,r=Math.max(n,n+e.height-i);return t<n?t=n:t>r&&(t=r),t},removeBounds:function(){return this.useBounds=!1,this.dirty=!0,this._bounds.setEmpty(),this},setAngle:function(t){return void 0===t&&(t=0),this.rotation=s(t),this},setBackgroundColor:function(t){return void 0===t&&(t="rgba(0,0,0,0)"),this.backgroundColor=l(t),this.transparent=0===this.backgroundColor.alpha,this},setBounds:function(t,e,i,n,r){return void 0===r&&(r=!1),this._bounds.setTo(t,e,i,n),this.dirty=!0,this.useBounds=!0,r?this.centerToBounds():(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},getBounds:function(t){void 0===t&&(t=new h);var e=this._bounds;return t.setTo(e.x,e.y,e.width,e.height),t},setName:function(t){return void 0===t&&(t=""),this.name=t,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setRotation:function(t){return void 0===t&&(t=0),this.rotation=t,this},setRoundPixels:function(t){return this.roundPixels=t,this},setScene:function(t){this.scene&&this._customViewport&&this.sceneManager.customViewports--,this.scene=t;var e=t.sys;this.sceneManager=e.game.scene,this.scaleManager=e.scale,this.cameraManager=e.cameras;var i=this.scaleManager.resolution;return this.resolution=i,this._cx=this._x*i,this._cy=this._y*i,this._cw=this._width*i,this._ch=this._height*i,this.updateSystem(),this},setScroll:function(t,e){return void 0===e&&(e=t),this.scrollX=t,this.scrollY=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},setViewport:function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},setZoom:function(t){return void 0===t&&(t=1),0===t&&(t=.001),this.zoom=t,this},setMask:function(t,e){return void 0===e&&(e=!0),this.mask=t,this._maskCamera=e?this.cameraManager.default:this,this},clearMask:function(t){return void 0===t&&(t=!1),t&&this.mask&&this.mask.destroy(),this.mask=null,this},toJSON:function(){var t={name:this.name,x:this.x,y:this.y,width:this.width,height:this.height,zoom:this.zoom,rotation:this.rotation,roundPixels:this.roundPixels,scrollX:this.scrollX,scrollY:this.scrollY,backgroundColor:this.backgroundColor.rgba};return this.useBounds&&(t.bounds={x:this._bounds.x,y:this._bounds.y,width:this._bounds.width,height:this._bounds.height}),t},update:function(){},updateSystem:function(){if(this.scaleManager){var t=0!==this._x||0!==this._y||this.scaleManager.width!==this._width||this.scaleManager.height!==this._height,e=this.sceneManager;t&&!this._customViewport?e.customViewports++:!t&&this._customViewport&&e.customViewports--,this.dirty=!0,this._customViewport=t}},destroy:function(){this.emit(a.DESTROY,this),this.removeAllListeners(),this.matrix.destroy(),this.culledObjects=[],this._customViewport&&this.sceneManager.customViewports--,this._bounds=null,this.scene=null,this.scaleManager=null,this.sceneManager=null,this.cameraManager=null},x:{get:function(){return this._x},set:function(t){this._x=t,this._cx=t*this.resolution,this.updateSystem()}},y:{get:function(){return this._y},set:function(t){this._y=t,this._cy=t*this.resolution,this.updateSystem()}},width:{get:function(){return this._width},set:function(t){this._width=t,this._cw=t*this.resolution,this.updateSystem()}},height:{get:function(){return this._height},set:function(t){this._height=t,this._ch=t*this.resolution,this.updateSystem()}},scrollX:{get:function(){return this._scrollX},set:function(t){this._scrollX=t,this.dirty=!0}},scrollY:{get:function(){return this._scrollY},set:function(t){this._scrollY=t,this.dirty=!0}},zoom:{get:function(){return this._zoom},set:function(t){this._zoom=t,this.dirty=!0}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=t,this.dirty=!0}},centerX:{get:function(){return this.x+.5*this.width}},centerY:{get:function(){return this.y+.5*this.height}},displayWidth:{get:function(){return this.width/this.zoom}},displayHeight:{get:function(){return this.height/this.zoom}}});t.exports=d},29854:(t,e,i)=>{var n=i(22190),r=i(89429),s=i(23389),o=i(90487),a=i(47379),h=i(23096),u=i(97061),l=i(57459),c=i(38092),d=i(57148),p=new a({Extends:n,Mixins:[h.Flip,h.Tint],initialize:function(t,e,i,r){n.call(this,t,e,i,r),this.inputEnabled=!0,this.fadeEffect=new u.Fade(this),this.flashEffect=new u.Flash(this),this.shakeEffect=new u.Shake(this),this.panEffect=new u.Pan(this),this.rotateToEffect=new u.RotateTo(this),this.zoomEffect=new u.Zoom(this),this.lerp=new d(1,1),this.followOffset=new d,this.deadzone=null,this._follow=null,this.renderToTexture=!1,this.renderToGame=!0,this.canvas=null,this.context=null,this.glTexture=null,this.framebuffer=null,this.pipeline=null},setRenderToTexture:function(t,e){void 0===e&&(e=!0);var i=this.scene.sys.game.renderer;return i.gl?(this.glTexture=i.createTextureFromSource(null,this.width,this.height,0),this.framebuffer=i.createFramebuffer(this.width,this.height,this.glTexture,!1)):(this.canvas=r.create2D(this,this.width,this.height),this.context=this.canvas.getContext("2d")),this.renderToTexture=!0,this.renderToGame=e,t&&this.setPipeline(t),this},setPipeline:function(t){if("string"==typeof t){var e=this.scene.sys.game.renderer;e.gl&&e.hasPipeline(t)&&(this.pipeline=e.getPipeline(t))}else this.pipeline=t;return this},clearRenderToTexture:function(){if(this.scene){var t=this.scene.sys.game.renderer;if(t)return t.gl?(this.framebuffer&&t.deleteFramebuffer(this.framebuffer),this.glTexture&&t.deleteTexture(this.glTexture),this.framebuffer=null,this.glTexture=null,this.pipeline=null):(r.remove(this),this.canvas=null,this.context=null),this.renderToTexture=!1,this}},setDeadzone:function(t,e){if(void 0===t)this.deadzone=null;else{if(this.deadzone?(this.deadzone.width=t,this.deadzone.height=e):this.deadzone=new c(0,0,t,e),this._follow){var i=this.width/2,n=this.height/2,r=this._follow.x-this.followOffset.x,o=this._follow.y-this.followOffset.y;this.midPoint.set(r,o),this.scrollX=r-i,this.scrollY=o-n}s(this.deadzone,this.midPoint.x,this.midPoint.y)}return this},fadeIn:function(t,e,i,n,r,s){return this.fadeEffect.start(!1,t,e,i,n,!0,r,s)},fadeOut:function(t,e,i,n,r,s){return this.fadeEffect.start(!0,t,e,i,n,!0,r,s)},fadeFrom:function(t,e,i,n,r,s,o){return this.fadeEffect.start(!1,t,e,i,n,r,s,o)},fade:function(t,e,i,n,r,s,o){return this.fadeEffect.start(!0,t,e,i,n,r,s,o)},flash:function(t,e,i,n,r,s,o){return this.flashEffect.start(t,e,i,n,r,s,o)},shake:function(t,e,i,n,r){return this.shakeEffect.start(t,e,i,n,r)},pan:function(t,e,i,n,r,s,o){return this.panEffect.start(t,e,i,n,r,s,o)},rotateTo:function(t,e,i,n,r,s,o){return this.rotateToEffect.start(t,e,i,n,r,s,o)},zoomTo:function(t,e,i,n,r,s){return this.zoomEffect.start(t,e,i,n,r,s)},preRender:function(t){var e=this.width,i=this.height,n=.5*e,r=.5*i,o=this.zoom*t,a=this.matrix,h=e*this.originX,u=i*this.originY,c=this._follow,d=this.deadzone,p=this.scrollX,f=this.scrollY;if(d&&s(d,this.midPoint.x,this.midPoint.y),c&&!this.panEffect.isRunning){var m=c.x-this.followOffset.x,v=c.y-this.followOffset.y;d?(m<d.x?p=l(p,p-(d.x-m),this.lerp.x):m>d.right&&(p=l(p,p+(m-d.right),this.lerp.x)),v<d.y?f=l(f,f-(d.y-v),this.lerp.y):v>d.bottom&&(f=l(f,f+(v-d.bottom),this.lerp.y))):(p=l(p,m-h,this.lerp.x),f=l(f,v-u,this.lerp.y))}this.useBounds&&(p=this.clampX(p),f=this.clampY(f)),this.roundPixels&&(h=Math.round(h),u=Math.round(u)),this.scrollX=p,this.scrollY=f;var g=p+n,y=f+r;this.midPoint.set(g,y);var _=e/o,x=i/o;this.worldView.setTo(g-_/2,y-x/2,_,x),a.applyITRS(this.x+h,this.y+u,this.rotation,o,o),a.translate(-h,-u),this.shakeEffect.preRender()},setLerp:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.lerp.set(t,e),this},setFollowOffset:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=0),this.followOffset.set(t,e),this},startFollow:function(t,e,i,n,r,s){void 0===e&&(e=!1),void 0===i&&(i=1),void 0===n&&(n=i),void 0===r&&(r=0),void 0===s&&(s=r),this._follow=t,this.roundPixels=e,i=o(i,0,1),n=o(n,0,1),this.lerp.set(i,n),this.followOffset.set(r,s);var a=this.width/2,h=this.height/2,u=t.x-r,l=t.y-s;return this.midPoint.set(u,l),this.scrollX=u-a,this.scrollY=l-h,this.useBounds&&(this.scrollX=this.clampX(this.scrollX),this.scrollY=this.clampY(this.scrollY)),this},stopFollow:function(){return this._follow=null,this},resetFX:function(){return this.rotateToEffect.reset(),this.panEffect.reset(),this.shakeEffect.reset(),this.flashEffect.reset(),this.fadeEffect.reset(),this},update:function(t,e){this.visible&&(this.rotateToEffect.update(t,e),this.panEffect.update(t,e),this.zoomEffect.update(t,e),this.shakeEffect.update(t,e),this.flashEffect.update(t,e),this.fadeEffect.update(t,e))},destroy:function(){this.clearRenderToTexture(),this.resetFX(),n.prototype.destroy.call(this),this._follow=null,this.deadzone=null}});t.exports=p},88063:(t,e,i)=>{var n=i(29854),r=i(47379),s=i(81769),o=i(50354),a=i(38593),h=i(66144),u=i(88637),l=new r({initialize:function(t){this.scene=t,this.systems=t.sys,this.roundPixels=t.sys.game.config.roundPixels,this.cameras=[],this.main,this.default,t.sys.events.once(u.BOOT,this.boot,this),t.sys.events.on(u.START,this.start,this)},boot:function(){var t=this.systems;t.settings.cameras?this.fromJSON(t.settings.cameras):this.add(),this.main=this.cameras[0],this.default=new n(0,0,t.scale.width,t.scale.height).setScene(this.scene),t.game.scale.on(h.RESIZE,this.onResize,this),this.systems.events.once(u.DESTROY,this.destroy,this)},start:function(){if(!this.main){var t=this.systems;t.settings.cameras?this.fromJSON(t.settings.cameras):this.add(),this.main=this.cameras[0]}var e=this.systems.events;e.on(u.UPDATE,this.update,this),e.once(u.SHUTDOWN,this.shutdown,this)},add:function(t,e,i,r,s,o){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===r&&(r=this.scene.sys.scale.height),void 0===s&&(s=!1),void 0===o&&(o="");var a=new n(t,e,i,r);return a.setName(o),a.setScene(this.scene),a.setRoundPixels(this.roundPixels),a.id=this.getNextID(),this.cameras.push(a),s&&(this.main=a),a},addExisting:function(t,e){return void 0===e&&(e=!1),-1===this.cameras.indexOf(t)?(t.id=this.getNextID(),t.setRoundPixels(this.roundPixels),this.cameras.push(t),e&&(this.main=t),t):null},getNextID:function(){for(var t=this.cameras,e=1,i=0;i<32;i++){for(var n=!1,r=0;r<t.length;r++){var s=t[r];s&&s.id===e&&(n=!0)}if(!n)return e;e<<=1}return 0},getTotal:function(t){void 0===t&&(t=!1);for(var e=0,i=this.cameras,n=0;n<i.length;n++){var r=i[n];(!t||t&&r.visible)&&e++}return e},fromJSON:function(t){Array.isArray(t)||(t=[t]);for(var e=this.scene.sys.scale.width,i=this.scene.sys.scale.height,n=0;n<t.length;n++){var r=t[n],o=s(r,"x",0),a=s(r,"y",0),h=s(r,"width",e),u=s(r,"height",i),l=this.add(o,a,h,u);l.name=s(r,"name",""),l.zoom=s(r,"zoom",1),l.rotation=s(r,"rotation",0),l.scrollX=s(r,"scrollX",0),l.scrollY=s(r,"scrollY",0),l.roundPixels=s(r,"roundPixels",!1),l.visible=s(r,"visible",!0);var c=s(r,"backgroundColor",!1);c&&l.setBackgroundColor(c);var d=s(r,"bounds",null);if(d){var p=s(d,"x",0),f=s(d,"y",0),m=s(d,"width",e),v=s(d,"height",i);l.setBounds(p,f,m,v)}}return this},getCamera:function(t){for(var e=this.cameras,i=0;i<e.length;i++)if(e[i].name===t)return e[i];return null},getCamerasBelowPointer:function(t){for(var e=this.cameras,i=t.x,n=t.y,r=[],s=0;s<e.length;s++){var o=e[s];o.visible&&o.inputEnabled&&a(o,i,n)&&r.unshift(o)}return r},remove:function(t,e){void 0===e&&(e=!0),Array.isArray(t)||(t=[t]);for(var i=0,n=this.cameras,r=0;r<t.length;r++){var s=n.indexOf(t[r]);-1!==s&&(e&&n[s].destroy(),n.splice(s,1),i++)}return!this.main&&n[0]&&(this.main=n[0]),i},render:function(t,e,i){for(var n=this.scene,r=this.cameras,s=0;s<this.cameras.length;s++){var o=r[s];o.visible&&o.alpha>0&&(o.preRender(1),t.render(n,e,i,o))}},resetAll:function(){for(var t=0;t<this.cameras.length;t++)this.cameras[t].destroy();return this.cameras=[],this.main=this.add(),this.main},update:function(t,e){for(var i=0;i<this.cameras.length;i++)this.cameras[i].update(t,e)},onResize:function(t,e,i,n,r,s){for(var o=0;o<this.cameras.length;o++){var a=this.cameras[o];0===a._x&&0===a._y&&a._width===r&&a._height===s&&a.setSize(e.width,e.height)}},resize:function(t,e){for(var i=0;i<this.cameras.length;i++)this.cameras[i].setSize(t,e)},shutdown:function(){this.main=void 0;for(var t=0;t<this.cameras.length;t++)this.cameras[t].destroy();this.cameras=[];var e=this.systems.events;e.off(u.UPDATE,this.update,this),e.off(u.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.default.destroy(),this.scene.sys.events.off(u.START,this.start,this),this.scene=null,this.systems=null}});o.register("CameraManager",l,"cameras"),t.exports=l},89361:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(25920),o=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.isComplete=!1,this.direction=!0,this.duration=0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,n,r,o,a,h){if(void 0===t&&(t=!0),void 0===e&&(e=1e3),void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=0),void 0===o&&(o=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene),!o&&this.isRunning)return this.camera;this.isRunning=!0,this.isComplete=!1,this.duration=e,this.direction=t,this.progress=0,this.red=i,this.green=n,this.blue=r,this.alpha=t?Number.MIN_VALUE:1,this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h;var u=t?s.FADE_OUT_START:s.FADE_IN_START;return this.camera.emit(u,this.camera,this,e,i,n,r),this.camera},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=n(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed<this.duration?this.alpha=this.direction?this.progress:1-this.progress:(this.alpha=this.direction?1:0,this.effectComplete()))},postRenderCanvas:function(t){if(!this.isRunning&&!this.isComplete)return!1;var e=this.camera;return t.fillStyle="rgba("+this.red+","+this.green+","+this.blue+","+this.alpha+")",t.fillRect(e._cx,e._cy,e._cw,e._ch),!0},postRenderWebGL:function(t,e){if(!this.isRunning&&!this.isComplete)return!1;var i=this.camera,n=this.red/255,r=this.blue/255,s=this.green/255;return t.drawFillRect(i._cx,i._cy,i._cw,i._ch,e(n,s,r,1),this.alpha),!0},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.isComplete=!0;var t=this.direction?s.FADE_OUT_COMPLETE:s.FADE_IN_COMPLETE;this.camera.emit(t,this.camera,this)},reset:function(){this.isRunning=!1,this.isComplete=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null}});t.exports=o},828:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(25920),o=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,n,r,o,a){return void 0===t&&(t=250),void 0===e&&(e=255),void 0===i&&(i=255),void 0===n&&(n=255),void 0===r&&(r=!1),void 0===o&&(o=null),void 0===a&&(a=this.camera.scene),!r&&this.isRunning||(this.isRunning=!0,this.duration=t,this.progress=0,this.red=e,this.green=i,this.blue=n,this.alpha=1,this._elapsed=0,this._onUpdate=o,this._onUpdateScope=a,this.camera.emit(s.FLASH_START,this.camera,this,t,e,i,n)),this.camera},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=n(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed<this.duration?this.alpha=1-this.progress:this.effectComplete())},postRenderCanvas:function(t){if(!this.isRunning)return!1;var e=this.camera;return t.fillStyle="rgba("+this.red+","+this.green+","+this.blue+","+this.alpha+")",t.fillRect(e._cx,e._cy,e._cw,e._ch),!0},postRenderWebGL:function(t,e){if(!this.isRunning)return!1;var i=this.camera,n=this.red/255,r=this.blue/255,s=this.green/255;return t.drawFillRect(i._cx,i._cy,i._cw,i._ch,e(n,s,r,1),this.alpha),!0},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(s.FLASH_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null}});t.exports=o},19651:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(21623),o=i(25920),a=i(57148),h=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=new a,this.current=new a,this.destination=new a,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,n,r,a,h){void 0===i&&(i=1e3),void 0===n&&(n=s.Linear),void 0===r&&(r=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene);var u=this.camera;return!r&&this.isRunning||(this.isRunning=!0,this.duration=i,this.progress=0,this.source.set(u.scrollX,u.scrollY),this.destination.set(t,e),u.getScroll(t,e,this.current),"string"==typeof n&&s.hasOwnProperty(n)?this.ease=s[n]:"function"==typeof n&&(this.ease=n),this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h,this.camera.emit(o.PAN_START,this.camera,this,i,t,e)),u},update:function(t,e){if(this.isRunning){this._elapsed+=e;var i=n(this._elapsed/this.duration,0,1);this.progress=i;var r=this.camera;if(this._elapsed<this.duration){var s=this.ease(i);r.getScroll(this.destination.x,this.destination.y,this.current);var o=this.source.x+(this.current.x-this.source.x)*s,a=this.source.y+(this.current.y-this.source.y)*s;r.setScroll(o,a),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,r,i,o,a)}else r.centerOn(this.destination.x,this.destination.y),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,r,i,r.scrollX,r.scrollY),this.effectComplete()}},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(o.PAN_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null,this.source=null,this.destination=null}});t.exports=h},97277:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(25920),o=i(21623),a=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=0,this.current=0,this.destination=0,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope,this.clockwise=!0,this.shortestPath=!1},start:function(t,e,i,n,r,a,h){void 0===i&&(i=1e3),void 0===n&&(n=o.Linear),void 0===r&&(r=!1),void 0===a&&(a=null),void 0===h&&(h=this.camera.scene),void 0===e&&(e=!1),this.shortestPath=e;var u=t;t<0?(u=-1*t,this.clockwise=!1):this.clockwise=!0;var l=360*Math.PI/180;u-=Math.floor(u/l)*l;var c=this.camera;if(!r&&this.isRunning)return c;if(this.isRunning=!0,this.duration=i,this.progress=0,this.source=c.rotation,this.destination=u,"string"==typeof n&&o.hasOwnProperty(n)?this.ease=o[n]:"function"==typeof n&&(this.ease=n),this._elapsed=0,this._onUpdate=a,this._onUpdateScope=h,this.shortestPath){var d=0,p=0;(d=this.destination>this.source?Math.abs(this.destination-this.source):Math.abs(this.destination+l)-this.source)<(p=this.source>this.destination?Math.abs(this.source-this.destination):Math.abs(this.source+l)-this.destination)?this.clockwise=!0:d>p&&(this.clockwise=!1)}return this.camera.emit(s.ROTATE_START,this.camera,this,i,u),c},update:function(t,e){if(this.isRunning){this._elapsed+=e;var i=n(this._elapsed/this.duration,0,1);this.progress=i;var r=this.camera;if(this._elapsed<this.duration){var s=this.ease(i);this.current=r.rotation;var o=0,a=360*Math.PI/180,h=this.destination,u=this.current;!1===this.clockwise&&(h=this.current,u=this.destination),o=h>=u?Math.abs(h-u):Math.abs(h+a)-u;var l=0;l=this.clockwise?r.rotation+o*s:r.rotation-o*s,r.rotation=l,this._onUpdate&&this._onUpdate.call(this._onUpdateScope,r,i,l)}else r.rotation=this.destination,this._onUpdate&&this._onUpdate.call(this._onUpdateScope,r,i,this.destination),this.effectComplete()}},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(s.ROTATE_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null,this.source=null,this.destination=null}});t.exports=a},28350:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(25920),o=i(57148),a=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.intensity=new o,this.progress=0,this._elapsed=0,this._offsetX=0,this._offsetY=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,n,r){return void 0===t&&(t=100),void 0===e&&(e=.05),void 0===i&&(i=!1),void 0===n&&(n=null),void 0===r&&(r=this.camera.scene),!i&&this.isRunning||(this.isRunning=!0,this.duration=t,this.progress=0,"number"==typeof e?this.intensity.set(e):this.intensity.set(e.x,e.y),this._elapsed=0,this._offsetX=0,this._offsetY=0,this._onUpdate=n,this._onUpdateScope=r,this.camera.emit(s.SHAKE_START,this.camera,this,t,e)),this.camera},preRender:function(){this.isRunning&&this.camera.matrix.translate(this._offsetX,this._offsetY)},update:function(t,e){if(this.isRunning)if(this._elapsed+=e,this.progress=n(this._elapsed/this.duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress),this._elapsed<this.duration){var i=this.intensity,r=this.camera._cw,s=this.camera._ch,o=this.camera.zoom;this._offsetX=(Math.random()*i.x*r*2-i.x*r)*o,this._offsetY=(Math.random()*i.y*s*2-i.y*s)*o,this.camera.roundPixels&&(this._offsetX=Math.round(this._offsetX),this._offsetY=Math.round(this._offsetY))}else this.effectComplete()},effectComplete:function(){this._offsetX=0,this._offsetY=0,this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(s.SHAKE_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._offsetX=0,this._offsetY=0,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null,this.intensity=null}});t.exports=a},34879:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(21623),o=i(25920),a=new r({initialize:function(t){this.camera=t,this.isRunning=!1,this.duration=0,this.source=1,this.destination=1,this.ease,this.progress=0,this._elapsed=0,this._onUpdate,this._onUpdateScope},start:function(t,e,i,n,r,a){void 0===e&&(e=1e3),void 0===i&&(i=s.Linear),void 0===n&&(n=!1),void 0===r&&(r=null),void 0===a&&(a=this.camera.scene);var h=this.camera;return!n&&this.isRunning||(this.isRunning=!0,this.duration=e,this.progress=0,this.source=h.zoom,this.destination=t,"string"==typeof i&&s.hasOwnProperty(i)?this.ease=s[i]:"function"==typeof i&&(this.ease=i),this._elapsed=0,this._onUpdate=r,this._onUpdateScope=a,this.camera.emit(o.ZOOM_START,this.camera,this,e,t)),h},update:function(t,e){this.isRunning&&(this._elapsed+=e,this.progress=n(this._elapsed/this.duration,0,1),this._elapsed<this.duration?(this.camera.zoom=this.source+(this.destination-this.source)*this.ease(this.progress),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress,this.camera.zoom)):(this.camera.zoom=this.destination,this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.camera,this.progress,this.destination),this.effectComplete()))},effectComplete:function(){this._onUpdate=null,this._onUpdateScope=null,this.isRunning=!1,this.camera.emit(o.ZOOM_COMPLETE,this.camera,this)},reset:function(){this.isRunning=!1,this._onUpdate=null,this._onUpdateScope=null},destroy:function(){this.reset(),this.camera=null}});t.exports=a},97061:(t,e,i)=>{t.exports={Fade:i(89361),Flash:i(828),Pan:i(19651),Shake:i(28350),RotateTo:i(97277),Zoom:i(34879)}},66010:t=>{t.exports="cameradestroy"},49476:t=>{t.exports="camerafadeincomplete"},48674:t=>{t.exports="camerafadeinstart"},56369:t=>{t.exports="camerafadeoutcomplete"},74485:t=>{t.exports="camerafadeoutstart"},5195:t=>{t.exports="cameraflashcomplete"},51676:t=>{t.exports="cameraflashstart"},30223:t=>{t.exports="camerapancomplete"},37340:t=>{t.exports="camerapanstart"},14051:t=>{t.exports="postrender"},92241:t=>{t.exports="prerender"},21253:t=>{t.exports="camerarotatecomplete"},95749:t=>{t.exports="camerarotatestart"},39031:t=>{t.exports="camerashakecomplete"},43081:t=>{t.exports="camerashakestart"},10058:t=>{t.exports="camerazoomcomplete"},74685:t=>{t.exports="camerazoomstart"},25920:(t,e,i)=>{t.exports={DESTROY:i(66010),FADE_IN_COMPLETE:i(49476),FADE_IN_START:i(48674),FADE_OUT_COMPLETE:i(56369),FADE_OUT_START:i(74485),FLASH_COMPLETE:i(5195),FLASH_START:i(51676),PAN_COMPLETE:i(30223),PAN_START:i(37340),POST_RENDER:i(14051),PRE_RENDER:i(92241),ROTATE_COMPLETE:i(21253),ROTATE_START:i(95749),SHAKE_COMPLETE:i(39031),SHAKE_START:i(43081),ZOOM_COMPLETE:i(10058),ZOOM_START:i(74685)}},73013:(t,e,i)=>{t.exports={Camera:i(29854),BaseCamera:i(22190),CameraManager:i(88063),Effects:i(97061),Events:i(25920)}},87705:(t,e,i)=>{var n=i(47379),r=i(86652),s=new n({initialize:function(t){this.camera=r(t,"camera",null),this.left=r(t,"left",null),this.right=r(t,"right",null),this.up=r(t,"up",null),this.down=r(t,"down",null),this.zoomIn=r(t,"zoomIn",null),this.zoomOut=r(t,"zoomOut",null),this.zoomSpeed=r(t,"zoomSpeed",.01),this.speedX=0,this.speedY=0;var e=r(t,"speed",null);"number"==typeof e?(this.speedX=e,this.speedY=e):(this.speedX=r(t,"speed.x",0),this.speedY=r(t,"speed.y",0)),this._zoom=0,this.active=null!==this.camera},start:function(){return this.active=null!==this.camera,this},stop:function(){return this.active=!1,this},setCamera:function(t){return this.camera=t,this},update:function(t){if(this.active){void 0===t&&(t=1);var e=this.camera;this.up&&this.up.isDown?e.scrollY-=this.speedY*t|0:this.down&&this.down.isDown&&(e.scrollY+=this.speedY*t|0),this.left&&this.left.isDown?e.scrollX-=this.speedX*t|0:this.right&&this.right.isDown&&(e.scrollX+=this.speedX*t|0),this.zoomIn&&this.zoomIn.isDown?(e.zoom-=this.zoomSpeed,e.zoom<.1&&(e.zoom=.1)):this.zoomOut&&this.zoomOut.isDown&&(e.zoom+=this.zoomSpeed)}},destroy:function(){this.camera=null,this.left=null,this.right=null,this.up=null,this.down=null,this.zoomIn=null,this.zoomOut=null}});t.exports=s},40324:(t,e,i)=>{var n=i(47379),r=i(86652),s=new n({initialize:function(t){this.camera=r(t,"camera",null),this.left=r(t,"left",null),this.right=r(t,"right",null),this.up=r(t,"up",null),this.down=r(t,"down",null),this.zoomIn=r(t,"zoomIn",null),this.zoomOut=r(t,"zoomOut",null),this.zoomSpeed=r(t,"zoomSpeed",.01),this.accelX=0,this.accelY=0;var e=r(t,"acceleration",null);"number"==typeof e?(this.accelX=e,this.accelY=e):(this.accelX=r(t,"acceleration.x",0),this.accelY=r(t,"acceleration.y",0)),this.dragX=0,this.dragY=0;var i=r(t,"drag",null);"number"==typeof i?(this.dragX=i,this.dragY=i):(this.dragX=r(t,"drag.x",0),this.dragY=r(t,"drag.y",0)),this.maxSpeedX=0,this.maxSpeedY=0;var n=r(t,"maxSpeed",null);"number"==typeof n?(this.maxSpeedX=n,this.maxSpeedY=n):(this.maxSpeedX=r(t,"maxSpeed.x",0),this.maxSpeedY=r(t,"maxSpeed.y",0)),this._speedX=0,this._speedY=0,this._zoom=0,this.active=null!==this.camera},start:function(){return this.active=null!==this.camera,this},stop:function(){return this.active=!1,this},setCamera:function(t){return this.camera=t,this},update:function(t){if(this.active){void 0===t&&(t=1);var e=this.camera;this._speedX>0?(this._speedX-=this.dragX*t,this._speedX<0&&(this._speedX=0)):this._speedX<0&&(this._speedX+=this.dragX*t,this._speedX>0&&(this._speedX=0)),this._speedY>0?(this._speedY-=this.dragY*t,this._speedY<0&&(this._speedY=0)):this._speedY<0&&(this._speedY+=this.dragY*t,this._speedY>0&&(this._speedY=0)),this.up&&this.up.isDown?(this._speedY+=this.accelY,this._speedY>this.maxSpeedY&&(this._speedY=this.maxSpeedY)):this.down&&this.down.isDown&&(this._speedY-=this.accelY,this._speedY<-this.maxSpeedY&&(this._speedY=-this.maxSpeedY)),this.left&&this.left.isDown?(this._speedX+=this.accelX,this._speedX>this.maxSpeedX&&(this._speedX=this.maxSpeedX)):this.right&&this.right.isDown&&(this._speedX-=this.accelX,this._speedX<-this.maxSpeedX&&(this._speedX=-this.maxSpeedX)),this.zoomIn&&this.zoomIn.isDown?this._zoom=-this.zoomSpeed:this.zoomOut&&this.zoomOut.isDown?this._zoom=this.zoomSpeed:this._zoom=0,0!==this._speedX&&(e.scrollX-=this._speedX*t|0),0!==this._speedY&&(e.scrollY-=this._speedY*t|0),0!==this._zoom&&(e.zoom+=this._zoom,e.zoom<.001&&(e.zoom=.001))}},destroy:function(){this.camera=null,this.left=null,this.right=null,this.up=null,this.down=null,this.zoomIn=null,this.zoomOut=null}});t.exports=s},60277:(t,e,i)=>{t.exports={FixedKeyControl:i(87705),SmoothedKeyControl:i(40324)}},49357:(t,e,i)=>{t.exports={Controls:i(60277),Scene2D:i(73013)}},50460:(t,e,i)=>{var n={VERSION:"3.23.0",BlendModes:i(35869),ScaleModes:i(28425),AUTO:0,CANVAS:1,WEBGL:2,HEADLESS:3,FOREVER:-1,NONE:4,UP:5,DOWN:6,LEFT:7,RIGHT:8};t.exports=n},2192:(t,e,i)=>{var n=i(47379),r=i(50460),s=i(82113),o=i(81769),a=i(86652),h=i(28621),u=i(39899),l=i(49035),c=i(97713),d=i(64031),p=new n({initialize:function(t){void 0===t&&(t={});this.width=a(t,"width",1024),this.height=a(t,"height",768),this.zoom=a(t,"zoom",1),this.resolution=a(t,"resolution",1),this.parent=a(t,"parent",void 0),this.scaleMode=a(t,"scaleMode",0),this.expandParent=a(t,"expandParent",!0),this.autoRound=a(t,"autoRound",!1),this.autoCenter=a(t,"autoCenter",0),this.resizeInterval=a(t,"resizeInterval",500),this.fullscreenTarget=a(t,"fullscreenTarget",null),this.minWidth=a(t,"minWidth",0),this.maxWidth=a(t,"maxWidth",0),this.minHeight=a(t,"minHeight",0),this.maxHeight=a(t,"maxHeight",0);var e=a(t,"scale",null);e&&(this.width=a(e,"width",this.width),this.height=a(e,"height",this.height),this.zoom=a(e,"zoom",this.zoom),this.resolution=a(e,"resolution",this.resolution),this.parent=a(e,"parent",this.parent),this.scaleMode=a(e,"mode",this.scaleMode),this.expandParent=a(e,"expandParent",this.expandParent),this.autoRound=a(e,"autoRound",this.autoRound),this.autoCenter=a(e,"autoCenter",this.autoCenter),this.resizeInterval=a(e,"resizeInterval",this.resizeInterval),this.fullscreenTarget=a(e,"fullscreenTarget",this.fullscreenTarget),this.minWidth=a(e,"min.width",this.minWidth),this.maxWidth=a(e,"max.width",this.maxWidth),this.minHeight=a(e,"min.height",this.minHeight),this.maxHeight=a(e,"max.height",this.maxHeight)),this.renderType=a(t,"type",r.AUTO),this.canvas=a(t,"canvas",null),this.context=a(t,"context",null),this.canvasStyle=a(t,"canvasStyle",null),this.customEnvironment=a(t,"customEnvironment",!1),this.sceneConfig=a(t,"scene",null),this.seed=a(t,"seed",[(Date.now()*Math.random()).toString()]),u.RND=new u.RandomDataGenerator(this.seed),this.gameTitle=a(t,"title",""),this.gameURL=a(t,"url","https://phaser.io"),this.gameVersion=a(t,"version",""),this.autoFocus=a(t,"autoFocus",!0),this.domCreateContainer=a(t,"dom.createContainer",!1),this.domBehindCanvas=a(t,"dom.behindCanvas",!1),this.inputKeyboard=a(t,"input.keyboard",!0),this.inputKeyboardEventTarget=a(t,"input.keyboard.target",window),this.inputKeyboardCapture=a(t,"input.keyboard.capture",[]),this.inputMouse=a(t,"input.mouse",!0),this.inputMouseEventTarget=a(t,"input.mouse.target",null),this.inputMouseCapture=a(t,"input.mouse.capture",!0),this.inputTouch=a(t,"input.touch",s.input.touch),this.inputTouchEventTarget=a(t,"input.touch.target",null),this.inputTouchCapture=a(t,"input.touch.capture",!0),this.inputActivePointers=a(t,"input.activePointers",1),this.inputSmoothFactor=a(t,"input.smoothFactor",0),this.inputWindowEvents=a(t,"input.windowEvents",!0),this.inputGamepad=a(t,"input.gamepad",!1),this.inputGamepadEventTarget=a(t,"input.gamepad.target",window),this.disableContextMenu=a(t,"disableContextMenu",!1),this.audio=a(t,"audio"),this.hideBanner=!1===a(t,"banner",null),this.hidePhaser=a(t,"banner.hidePhaser",!1),this.bannerTextColor=a(t,"banner.text","#ffffff"),this.bannerBackgroundColor=a(t,"banner.background",["#ff0000","#ffff00","#00ff00","#00ffff","#000000"]),""===this.gameTitle&&this.hidePhaser&&(this.hideBanner=!0),this.fps=a(t,"fps",null);var i=a(t,"render",t);this.antialias=a(i,"antialias",!0),this.antialiasGL=a(i,"antialiasGL",!0),this.mipmapFilter=a(i,"mipmapFilter","LINEAR"),this.desynchronized=a(i,"desynchronized",!1),this.roundPixels=a(i,"roundPixels",!1),this.pixelArt=a(i,"pixelArt",1!==this.zoom),this.pixelArt&&(this.antialias=!1,this.roundPixels=!0),this.transparent=a(i,"transparent",!1),this.clearBeforeRender=a(i,"clearBeforeRender",!0),this.premultipliedAlpha=a(i,"premultipliedAlpha",!0),this.failIfMajorPerformanceCaveat=a(i,"failIfMajorPerformanceCaveat",!1),this.powerPreference=a(i,"powerPreference","default"),this.batchSize=a(i,"batchSize",2e3),this.maxLights=a(i,"maxLights",10);var n=a(t,"backgroundColor",0);this.backgroundColor=d(n),0===n&&this.transparent&&(this.backgroundColor.alpha=0),this.preBoot=a(t,"callbacks.preBoot",l),this.postBoot=a(t,"callbacks.postBoot",l),this.physics=a(t,"physics",{}),this.defaultPhysicsSystem=a(this.physics,"default",!1),this.loaderBaseURL=a(t,"loader.baseURL",""),this.loaderPath=a(t,"loader.path",""),this.loaderMaxParallelDownloads=a(t,"loader.maxParallelDownloads",32),this.loaderCrossOrigin=a(t,"loader.crossOrigin",void 0),this.loaderResponseType=a(t,"loader.responseType",""),this.loaderAsync=a(t,"loader.async",!0),this.loaderUser=a(t,"loader.user",""),this.loaderPassword=a(t,"loader.password",""),this.loaderTimeout=a(t,"loader.timeout",0),this.loaderWithCredentials=a(t,"loader.withCredentials",!1),this.installGlobalPlugins=[],this.installScenePlugins=[];var p=a(t,"plugins",null),f=c.DefaultScene;p&&(Array.isArray(p)?this.defaultPlugins=p:h(p)&&(this.installGlobalPlugins=o(p,"global",[]),this.installScenePlugins=o(p,"scene",[]),Array.isArray(p.default)?f=p.default:Array.isArray(p.defaultMerge)&&(f=f.concat(p.defaultMerge)))),this.defaultPlugins=f;var m="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg";this.defaultImage=a(t,"images.default",m+"AQMAAABJtOi3AAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAABVJREFUeF7NwIEAAAAAgKD9qdeocAMAoAABm3DkcAAAAABJRU5ErkJggg=="),this.missingImage=a(t,"images.missing",m+"CAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg=="),window&&(window.FORCE_WEBGL?this.renderType=r.WEBGL:window.FORCE_CANVAS&&(this.renderType=r.CANVAS))}});t.exports=p},64310:(t,e,i)=>{var n=i(13227),r=i(89429),s=i(50460),o=i(33789);t.exports=function(t){var e=t.config;if((e.customEnvironment||e.canvas)&&e.renderType===s.AUTO)throw new Error("Must set explicit renderType in custom environment");if(!e.customEnvironment&&!e.canvas&&e.renderType!==s.HEADLESS)if(e.renderType===s.CANVAS||e.renderType!==s.CANVAS&&!o.webGL){if(!o.canvas)throw new Error("Cannot create Canvas or WebGL context, aborting.");e.renderType=s.CANVAS}else e.renderType=s.WEBGL;e.antialias||r.disableSmoothing();var a,h,u=t.scale.baseSize,l=u.width,c=u.height;(e.canvas?(t.canvas=e.canvas,t.canvas.width=l,t.canvas.height=c):t.canvas=r.create(t,l,c,e.renderType),e.canvasStyle&&(t.canvas.style=e.canvasStyle),e.antialias||n.setCrisp(t.canvas),e.renderType!==s.HEADLESS)&&(a=i(308),h=i(36010),e.renderType===s.WEBGL?t.renderer=new h(t):(t.renderer=new a(t),t.context=t.renderer.gameContext))}},86274:(t,e,i)=>{var n=i(50460);t.exports=function(t){var e=t.config;if(!e.hideBanner){var i="WebGL";e.renderType===n.CANVAS?i="Canvas":e.renderType===n.HEADLESS&&(i="Headless");var r,s=e.audio,o=t.device.audio;if(r=!o.webAudio||s&&s.disableWebAudio?s&&s.noAudio||!o.webAudio&&!o.audioData?"No Audio":"HTML5 Audio":"Web Audio",t.device.browser.ie)window.console&&console.log("Phaser v"+n.VERSION+" / https://phaser.io");else{var a,h="",u=[h];if(Array.isArray(e.bannerBackgroundColor))e.bannerBackgroundColor.forEach((function(t){h=h.concat("%c "),u.push("background: "+t),a=t})),u[u.length-1]="color: "+e.bannerTextColor+"; background: "+a;else h=h.concat("%c "),u.push("color: "+e.bannerTextColor+"; background: "+e.bannerBackgroundColor);u.push("background: #fff"),e.gameTitle&&(h=h.concat(e.gameTitle),e.gameVersion&&(h=h.concat(" v"+e.gameVersion)),e.hidePhaser||(h=h.concat(" / ")));e.hidePhaser||(h=h.concat("Phaser v"+n.VERSION+"-FB ("+i+" | "+r+")")),h=h.concat(" %c "+e.gameURL),u[0]=h,console.log.apply(console,u)}}}},72937:(t,e,i)=>{var n=i(99641),r=i(32472),s=i(27378),o=i(89429),a=i(47379),h=i(2192),u=i(36141),l=i(64310),c=i(3881),d=i(86274),p=i(82113),f=i(71602),m=i(17168),v=i(80827),g=i(80771),y=i(50354),_=i(18261),x=i(92499),b=i(73091),w=i(2931),T=i(4907),M=i(86910),S=i(58320),E=i(66466),L=i(75329),A=new a({initialize:function(t){this.config=new h(t),this.renderer=null,this.domContainer=null,this.canvas=null,this.context=null,this.isBooted=!1,this.isRunning=!1,this.events=new m,this.anims=new r(this),this.textures=new T(this),this.cache=new s(this),this.registry=new c(this),this.input=new g(this,this.config),this.scene=new b(this,this.config.sceneConfig),this.device=p,this.scale=new x(this,this.config),this.sound=null,this.sound=E.create(this),this.loop=new M(this,this.config.fps),this.plugins=new _(this,this.config),this.facebook=new L(this),this.pendingDestroy=!1,this.removeCanvas=!1,this.noReturn=!1,this.hasFocus=!1,f(this.boot.bind(this))},boot:function(){y.hasCore("EventEmitter")?(this.isBooted=!0,this.config.preBoot(this),this.scale.preBoot(),l(this),u(this),d(this),n(this.canvas,this.config.parent),this.textures.once(w.READY,this.texturesReady,this),this.events.emit(v.BOOT)):console.warn("Aborting. Core Plugins missing.")},texturesReady:function(){this.events.emit(v.READY),this.start()},start:function(){this.isRunning=!0,this.config.postBoot(this),this.renderer?this.loop.start(this.step.bind(this)):this.loop.start(this.headlessStep.bind(this)),S(this);var t=this.events;t.on(v.HIDDEN,this.onHidden,this),t.on(v.VISIBLE,this.onVisible,this),t.on(v.BLUR,this.onBlur,this),t.on(v.FOCUS,this.onFocus,this)},step:function(t,e){if(this.pendingDestroy)return this.runDestroy();var i=this.events;i.emit(v.PRE_STEP,t,e),i.emit(v.STEP,t,e),this.scene.update(t,e),i.emit(v.POST_STEP,t,e);var n=this.renderer;n.preRender(),i.emit(v.PRE_RENDER,n,t,e),this.scene.render(n),n.postRender(),i.emit(v.POST_RENDER,n,t,e)},headlessStep:function(t,e){if(this.pendingDestroy)return this.runDestroy();var i=this.events;i.emit(v.PRE_STEP,t,e),i.emit(v.STEP,t,e),this.scene.update(t,e),i.emit(v.POST_STEP,t,e),i.emit(v.PRE_RENDER),i.emit(v.POST_RENDER)},onHidden:function(){this.loop.pause(),this.events.emit(v.PAUSE)},onVisible:function(){this.loop.resume(),this.events.emit(v.RESUME)},onBlur:function(){this.hasFocus=!1,this.loop.blur()},onFocus:function(){this.hasFocus=!0,this.loop.focus()},getFrame:function(){return this.loop.frame},getTime:function(){return this.loop.now},destroy:function(t,e){void 0===e&&(e=!1),this.pendingDestroy=!0,this.removeCanvas=t,this.noReturn=e},runDestroy:function(){this.scene.destroy(),this.events.emit(v.DESTROY),this.events.removeAllListeners(),this.renderer&&this.renderer.destroy(),this.removeCanvas&&this.canvas&&(o.remove(this.canvas),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)),this.domContainer&&this.domContainer.parentNode.removeChild(this.domContainer),this.loop.destroy(),this.pendingDestroy=!1}});t.exports=A},86910:(t,e,i)=>{var n=i(47379),r=i(86652),s=i(49035),o=i(41797),a=new n({initialize:function(t,e){this.game=t,this.raf=new o,this.started=!1,this.running=!1,this.minFps=r(e,"min",5),this.targetFps=r(e,"target",60),this._min=1e3/this.minFps,this._target=1e3/this.targetFps,this.actualFps=this.targetFps,this.nextFpsUpdate=0,this.framesThisSecond=0,this.callback=s,this.forceSetTimeOut=r(e,"forceSetTimeOut",!1),this.time=0,this.startTime=0,this.lastTime=0,this.frame=0,this.inFocus=!0,this._pauseTime=0,this._coolDown=0,this.delta=0,this.deltaIndex=0,this.deltaHistory=[],this.deltaSmoothingMax=r(e,"deltaHistory",10),this.panicMax=r(e,"panicMax",120),this.rawDelta=0,this.now=0,this.smoothStep=r(e,"smoothStep",!0)},blur:function(){this.inFocus=!1},focus:function(){this.inFocus=!0,this.resetDelta()},pause:function(){this._pauseTime=window.performance.now()},resume:function(){this.resetDelta(),this.startTime+=this.time-this._pauseTime},resetDelta:function(){var t=window.performance.now();this.time=t,this.lastTime=t,this.nextFpsUpdate=t+1e3,this.framesThisSecond=0;for(var e=0;e<this.deltaSmoothingMax;e++)this.deltaHistory[e]=Math.min(this._target,this.deltaHistory[e]);this.delta=0,this.deltaIndex=0,this._coolDown=this.panicMax},start:function(t){if(this.started)return this;this.started=!0,this.running=!0;for(var e=0;e<this.deltaSmoothingMax;e++)this.deltaHistory[e]=this._target;this.resetDelta(),this.startTime=window.performance.now(),this.callback=t,this.raf.start(this.step.bind(this),this.forceSetTimeOut,this._target)},step:function(){var t=window.performance.now();this.now=t;var e=t-this.lastTime;e<0&&(e=0),this.rawDelta=e;var i=this.deltaIndex,n=this.deltaHistory,r=this.deltaSmoothingMax,s=e,o=e;if(this.smoothStep){(this._coolDown>0||!this.inFocus)&&(this._coolDown--,s=Math.min(s,this._target)),s>this._min&&(s=n[i],s=Math.min(s,this._min)),n[i]=s,this.deltaIndex++,this.deltaIndex>r&&(this.deltaIndex=0),o=0;for(var a=0;a<r;a++)o+=n[a];o/=r}this.delta=o,this.time+=this.rawDelta,t>this.nextFpsUpdate&&(this.actualFps=.25*this.framesThisSecond+.75*this.actualFps,this.nextFpsUpdate=t+1e3,this.framesThisSecond=0),this.framesThisSecond++;var h=o/this._target;this.callback(t,o,h),this.lastTime=t,this.frame++},tick:function(){this.step()},sleep:function(){this.running&&(this.raf.stop(),this.running=!1)},wake:function(t){this.running?this.sleep():t&&(this.startTime+=-this.lastTime+(this.lastTime+window.performance.now())),this.raf.start(this.step.bind(this),this.useRAF),this.running=!0,this.step()},getDuration:function(){return Math.round(this.lastTime-this.startTime)/1e3},getDurationMS:function(){return Math.round(this.lastTime-this.startTime)},stop:function(){return this.running=!1,this.started=!1,this.raf.stop(),this},destroy:function(){this.stop(),this.callback=s,this.raf=null,this.game=null}});t.exports=a},58320:(t,e,i)=>{var n=i(80827);t.exports=function(t){var e,i=t.events;if(void 0!==document.hidden)e="visibilitychange";else{["webkit","moz","ms"].forEach((function(t){void 0!==document[t+"Hidden"]&&(document.hidden=function(){return document[t+"Hidden"]},e=t+"visibilitychange")}))}e&&document.addEventListener(e,(function(t){document.hidden||"pause"===t.type?i.emit(n.HIDDEN):i.emit(n.VISIBLE)}),!1),window.onblur=function(){i.emit(n.BLUR)},window.onfocus=function(){i.emit(n.FOCUS)},window.focus&&t.config.autoFocus&&window.focus()}},23523:t=>{t.exports="blur"},74714:t=>{t.exports="boot"},36679:t=>{t.exports="contextlost"},15806:t=>{t.exports="contextrestored"},50836:t=>{t.exports="destroy"},84158:t=>{t.exports="focus"},55780:t=>{t.exports="hidden"},16134:t=>{t.exports="pause"},77451:t=>{t.exports="postrender"},77593:t=>{t.exports="poststep"},38256:t=>{t.exports="prerender"},2571:t=>{t.exports="prestep"},43943:t=>{t.exports="ready"},54040:t=>{t.exports="resume"},96897:t=>{t.exports="step"},2508:t=>{t.exports="visible"},80827:(t,e,i)=>{t.exports={BLUR:i(23523),BOOT:i(74714),CONTEXT_LOST:i(36679),CONTEXT_RESTORED:i(15806),DESTROY:i(50836),FOCUS:i(84158),HIDDEN:i(55780),PAUSE:i(16134),POST_RENDER:i(77451),POST_STEP:i(77593),PRE_RENDER:i(38256),PRE_STEP:i(2571),READY:i(43943),RESUME:i(54040),STEP:i(96897),VISIBLE:i(2508)}},81189:(t,e,i)=>{t.exports={Config:i(2192),CreateRenderer:i(64310),DebugHeader:i(86274),Events:i(80827),TimeStep:i(86910),VisibilityHandler:i(58320)}},37644:(t,e,i)=>{var n=i(40813),r=i(89429),s=i(86652);t.exports=function(t){var e=s(t,"data",[]),i=s(t,"canvas",null),o=s(t,"palette",n),a=s(t,"pixelWidth",1),h=s(t,"pixelHeight",a),u=s(t,"resizeCanvas",!0),l=s(t,"clearCanvas",!0),c=s(t,"preRender",null),d=s(t,"postRender",null),p=Math.floor(Math.abs(e[0].length*a)),f=Math.floor(Math.abs(e.length*h));i||(i=r.create2D(this,p,f),u=!1,l=!1),u&&(i.width=p,i.height=f);var m=i.getContext("2d");l&&m.clearRect(0,0,p,f),c&&c(i,m);for(var v=0;v<e.length;v++)for(var g=e[v],y=0;y<g.length;y++){var _=g[y];"."!==_&&" "!==_&&(m.fillStyle=o[_],m.fillRect(y*a,v*h,a,h))}return d&&d(i,m),i}},88165:(t,e,i)=>{t.exports={GenerateTexture:i(37644),Palettes:i(3691)}},40813:t=>{t.exports={0:"#000",1:"#9D9D9D",2:"#FFF",3:"#BE2633",4:"#E06F8B",5:"#493C2B",6:"#A46422",7:"#EB8931",8:"#F7E26B",9:"#2F484E",A:"#44891A",B:"#A3CE27",C:"#1B2632",D:"#005784",E:"#31A2F2",F:"#B2DCEF"}},9101:t=>{t.exports={0:"#000",1:"#fff",2:"#8b4131",3:"#7bbdc5",4:"#8b41ac",5:"#6aac41",6:"#3931a4",7:"#d5de73",8:"#945a20",9:"#5a4100",A:"#bd736a",B:"#525252",C:"#838383",D:"#acee8b",E:"#7b73de",F:"#acacac"}},94012:t=>{t.exports={0:"#000",1:"#2234d1",2:"#0c7e45",3:"#44aacc",4:"#8a3622",5:"#5c2e78",6:"#aa5c3d",7:"#b5b5b5",8:"#5e606e",9:"#4c81fb",A:"#6cd947",B:"#7be2f9",C:"#eb8a60",D:"#e23d69",E:"#ffd93f",F:"#fff"}},12078:t=>{t.exports={0:"#000",1:"#191028",2:"#46af45",3:"#a1d685",4:"#453e78",5:"#7664fe",6:"#833129",7:"#9ec2e8",8:"#dc534b",9:"#e18d79",A:"#d6b97b",B:"#e9d8a1",C:"#216c4b",D:"#d365c8",E:"#afaab9",F:"#f5f4eb"}},23784:t=>{t.exports={0:"#000",1:"#191028",2:"#46af45",3:"#a1d685",4:"#453e78",5:"#7664fe",6:"#833129",7:"#9ec2e8",8:"#dc534b",9:"#e18d79",A:"#d6b97b",B:"#e9d8a1",C:"#216c4b",D:"#d365c8",E:"#afaab9",F:"#fff"}},3691:(t,e,i)=>{t.exports={ARNE16:i(40813),C64:i(9101),CGA:i(94012),JMP:i(12078),MSX:i(23784)}},79834:(t,e,i)=>{var n=i(47379),r=i(97800),s=i(70584),o=i(57148),a=new n({Extends:s,initialize:function(t,e,i,n){s.call(this,"CubicBezierCurve"),Array.isArray(t)&&(n=new o(t[6],t[7]),i=new o(t[4],t[5]),e=new o(t[2],t[3]),t=new o(t[0],t[1])),this.p0=t,this.p1=e,this.p2=i,this.p3=n},getStartPoint:function(t){return void 0===t&&(t=new o),t.copy(this.p0)},getResolution:function(t){return t},getPoint:function(t,e){void 0===e&&(e=new o);var i=this.p0,n=this.p1,s=this.p2,a=this.p3;return e.set(r(t,i.x,n.x,s.x,a.x),r(t,i.y,n.y,s.y,a.y))},draw:function(t,e){void 0===e&&(e=32);var i=this.getPoints(e);t.beginPath(),t.moveTo(this.p0.x,this.p0.y);for(var n=1;n<i.length;n++)t.lineTo(i[n].x,i[n].y);return t.strokePath(),t},toJSON:function(){return{type:this.type,points:[this.p0.x,this.p0.y,this.p1.x,this.p1.y,this.p2.x,this.p2.y,this.p3.x,this.p3.y]}}});a.fromJSON=function(t){var e=t.points,i=new o(e[0],e[1]),n=new o(e[2],e[3]),r=new o(e[4],e[5]),s=new o(e[6],e[7]);return new a(i,n,r,s)},t.exports=a},70584:(t,e,i)=>{var n=i(47379),r=i(46141),s=i(38092),o=i(57148),a=new n({initialize:function(t){this.type=t,this.defaultDivisions=5,this.arcLengthDivisions=100,this.cacheArcLengths=[],this.needsUpdate=!0,this.active=!0,this._tmpVec2A=new o,this._tmpVec2B=new o},draw:function(t,e){return void 0===e&&(e=32),t.strokePoints(this.getPoints(e))},getBounds:function(t,e){t||(t=new s),void 0===e&&(e=16);var i=this.getLength();e>i&&(e=i/2);var n=Math.max(1,Math.round(i/e));return r(this.getSpacedPoints(n),t)},getDistancePoints:function(t){var e=this.getLength(),i=Math.max(1,e/t);return this.getSpacedPoints(i)},getEndPoint:function(t){return void 0===t&&(t=new o),this.getPointAt(1,t)},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,i=[],n=this.getPoint(0,this._tmpVec2A),r=0;i.push(0);for(var s=1;s<=t;s++)r+=(e=this.getPoint(s/t,this._tmpVec2B)).distance(n),i.push(r),n.copy(e);return this.cacheArcLengths=i,i},getPointAt:function(t,e){var i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t,e,i){void 0===i&&(i=[]),t||(t=e?this.getLength()/e:this.defaultDivisions);for(var n=0;n<=t;n++)i.push(this.getPoint(n/t));return i},getRandomPoint:function(t){return void 0===t&&(t=new o),this.getPoint(Math.random(),t)},getSpacedPoints:function(t,e,i){void 0===i&&(i=[]),t||(t=e?this.getLength()/e:this.defaultDivisions);for(var n=0;n<=t;n++){var r=this.getUtoTmapping(n/t,null,t);i.push(this.getPoint(r))}return i},getStartPoint:function(t){return void 0===t&&(t=new o),this.getPointAt(0,t)},getTangent:function(t,e){void 0===e&&(e=new o);var i=1e-4,n=t-i,r=t+i;return n<0&&(n=0),r>1&&(r=1),this.getPoint(n,this._tmpVec2A),this.getPoint(r,e),e.subtract(this._tmpVec2A).normalize()},getTangentAt:function(t,e){var i=this.getUtoTmapping(t);return this.getTangent(i,e)},getTFromDistance:function(t,e){return t<=0?0:this.getUtoTmapping(0,t,e)},getUtoTmapping:function(t,e,i){var n,r=this.getLengths(i),s=0,o=r.length;n=e?Math.min(e,r[o-1]):t*r[o-1];for(var a,h=0,u=o-1;h<=u;)if((a=r[s=Math.floor(h+(u-h)/2)]-n)<0)h=s+1;else{if(!(a>0)){u=s;break}u=s-1}if(r[s=u]===n)return s/(o-1);var l=r[s];return(s+(n-l)/(r[s+1]-l))/(o-1)},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()}});t.exports=a},37567:(t,e,i)=>{var n=i(47379),r=i(70584),s=i(98436),o=i(86652),a=i(12756),h=i(57148),u=new n({Extends:r,initialize:function(t,e,i,n,a,u,l,c){if("object"==typeof t){var d=t;t=o(d,"x",0),e=o(d,"y",0),i=o(d,"xRadius",0),n=o(d,"yRadius",i),a=o(d,"startAngle",0),u=o(d,"endAngle",360),l=o(d,"clockwise",!1),c=o(d,"rotation",0)}else void 0===n&&(n=i),void 0===a&&(a=0),void 0===u&&(u=360),void 0===l&&(l=!1),void 0===c&&(c=0);r.call(this,"EllipseCurve"),this.p0=new h(t,e),this._xRadius=i,this._yRadius=n,this._startAngle=s(a),this._endAngle=s(u),this._clockwise=l,this._rotation=s(c)},getStartPoint:function(t){return void 0===t&&(t=new h),this.getPoint(0,t)},getResolution:function(t){return 2*t},getPoint:function(t,e){void 0===e&&(e=new h);for(var i=2*Math.PI,n=this._endAngle-this._startAngle,r=Math.abs(n)<Number.EPSILON;n<0;)n+=i;for(;n>i;)n-=i;n<Number.EPSILON&&(n=r?0:i),this._clockwise&&!r&&(n===i?n=-i:n-=i);var s=this._startAngle+t*n,o=this.p0.x+this._xRadius*Math.cos(s),a=this.p0.y+this._yRadius*Math.sin(s);if(0!==this._rotation){var u=Math.cos(this._rotation),l=Math.sin(this._rotation),c=o-this.p0.x,d=a-this.p0.y;o=c*u-d*l+this.p0.x,a=c*l+d*u+this.p0.y}return e.set(o,a)},setXRadius:function(t){return this.xRadius=t,this},setYRadius:function(t){return this.yRadius=t,this},setWidth:function(t){return this.xRadius=2*t,this},setHeight:function(t){return this.yRadius=2*t,this},setStartAngle:function(t){return this.startAngle=t,this},setEndAngle:function(t){return this.endAngle=t,this},setClockwise:function(t){return this.clockwise=t,this},setRotation:function(t){return this.rotation=t,this},x:{get:function(){return this.p0.x},set:function(t){this.p0.x=t}},y:{get:function(){return this.p0.y},set:function(t){this.p0.y=t}},xRadius:{get:function(){return this._xRadius},set:function(t){this._xRadius=t}},yRadius:{get:function(){return this._yRadius},set:function(t){this._yRadius=t}},startAngle:{get:function(){return a(this._startAngle)},set:function(t){this._startAngle=s(t)}},endAngle:{get:function(){return a(this._endAngle)},set:function(t){this._endAngle=s(t)}},clockwise:{get:function(){return this._clockwise},set:function(t){this._clockwise=t}},angle:{get:function(){return a(this._rotation)},set:function(t){this._rotation=s(t)}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=t}},toJSON:function(){return{type:this.type,x:this.p0.x,y:this.p0.y,xRadius:this._xRadius,yRadius:this._yRadius,startAngle:a(this._startAngle),endAngle:a(this._endAngle),clockwise:this._clockwise,rotation:a(this._rotation)}}});u.fromJSON=function(t){return new u(t)},t.exports=u},64071:(t,e,i)=>{var n=i(47379),r=i(70584),s=i(46141),o=i(38092),a=i(57148),h=new a,u=new n({Extends:r,initialize:function(t,e){r.call(this,"LineCurve"),Array.isArray(t)&&(e=new a(t[2],t[3]),t=new a(t[0],t[1])),this.p0=t,this.p1=e,this.arcLengthDivisions=1},getBounds:function(t){return void 0===t&&(t=new o),s([this.p0,this.p1],t)},getStartPoint:function(t){return void 0===t&&(t=new a),t.copy(this.p0)},getResolution:function(t){return void 0===t&&(t=1),t},getPoint:function(t,e){return void 0===e&&(e=new a),1===t?e.copy(this.p1):(e.copy(this.p1).subtract(this.p0).scale(t).add(this.p0),e)},getPointAt:function(t,e){return this.getPoint(t,e)},getTangent:function(){return h.copy(this.p1).subtract(this.p0).normalize()},getUtoTmapping:function(t,e,i){var n;if(e){var r=this.getLengths(i),s=r[r.length-1];n=Math.min(e,s)/s}else n=t;return n},draw:function(t){return t.lineBetween(this.p0.x,this.p0.y,this.p1.x,this.p1.y),t},toJSON:function(){return{type:this.type,points:[this.p0.x,this.p0.y,this.p1.x,this.p1.y]}}});u.fromJSON=function(t){var e=t.points,i=new a(e[0],e[1]),n=new a(e[2],e[3]);return new u(i,n)},t.exports=u},56401:(t,e,i)=>{var n=i(47379),r=i(70584),s=i(16585),o=i(57148),a=new n({Extends:r,initialize:function(t,e,i){r.call(this,"QuadraticBezier"),Array.isArray(t)&&(i=new o(t[4],t[5]),e=new o(t[2],t[3]),t=new o(t[0],t[1])),this.p0=t,this.p1=e,this.p2=i},getStartPoint:function(t){return void 0===t&&(t=new o),t.copy(this.p0)},getResolution:function(t){return t},getPoint:function(t,e){void 0===e&&(e=new o);var i=this.p0,n=this.p1,r=this.p2;return e.set(s(t,i.x,n.x,r.x),s(t,i.y,n.y,r.y))},draw:function(t,e){void 0===e&&(e=32);var i=this.getPoints(e);t.beginPath(),t.moveTo(this.p0.x,this.p0.y);for(var n=1;n<i.length;n++)t.lineTo(i[n].x,i[n].y);return t.strokePath(),t},toJSON:function(){return{type:this.type,points:[this.p0.x,this.p0.y,this.p1.x,this.p1.y,this.p2.x,this.p2.y]}}});a.fromJSON=function(t){var e=t.points,i=new o(e[0],e[1]),n=new o(e[2],e[3]),r=new o(e[4],e[5]);return new a(i,n,r)},t.exports=a},28666:(t,e,i)=>{var n=i(21934),r=i(47379),s=i(70584),o=i(57148),a=new r({Extends:s,initialize:function(t){void 0===t&&(t=[]),s.call(this,"SplineCurve"),this.points=[],this.addPoints(t)},addPoints:function(t){for(var e=0;e<t.length;e++){var i=new o;"number"==typeof t[e]?(i.x=t[e],i.y=t[e+1],e++):Array.isArray(t[e])?(i.x=t[e][0],i.y=t[e][1]):(i.x=t[e].x,i.y=t[e].y),this.points.push(i)}return this},addPoint:function(t,e){var i=new o(t,e);return this.points.push(i),i},getStartPoint:function(t){return void 0===t&&(t=new o),t.copy(this.points[0])},getResolution:function(t){return t*this.points.length},getPoint:function(t,e){void 0===e&&(e=new o);var i=this.points,r=(i.length-1)*t,s=Math.floor(r),a=r-s,h=i[0===s?s:s-1],u=i[s],l=i[s>i.length-2?i.length-1:s+1],c=i[s>i.length-3?i.length-1:s+2];return e.set(n(a,h.x,u.x,l.x,c.x),n(a,h.y,u.y,l.y,c.y))},toJSON:function(){for(var t=[],e=0;e<this.points.length;e++)t.push(this.points[e].x),t.push(this.points[e].y);return{type:this.type,points:t}}});a.fromJSON=function(t){return new a(t.points)},t.exports=a},95398:(t,e,i)=>{t.exports={Path:i(80566),CubicBezier:i(79834),Curve:i(70584),Ellipse:i(37567),Line:i(64071),QuadraticBezier:i(56401),Spline:i(28666)}},36640:(t,e,i)=>{var n=i(47379),r=i(57148),s=new n({initialize:function(t,e){this.active=!1,this.p0=new r(t,e)},getPoint:function(t,e){return void 0===e&&(e=new r),e.copy(this.p0)},getPointAt:function(t,e){return this.getPoint(t,e)},getResolution:function(){return 1},getLength:function(){return 0},toJSON:function(){return{type:"MoveTo",points:[this.p0.x,this.p0.y]}}});t.exports=s},80566:(t,e,i)=>{var n=i(47379),r=i(79834),s=i(37567),o=i(81342),a=i(64071),h=i(36640),u=i(56401),l=i(38092),c=i(28666),d=i(57148),p=i(14302),f=new n({initialize:function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.name="",this.curves=[],this.cacheLengths=[],this.autoClose=!1,this.startPoint=new d,this._tmpVec2A=new d,this._tmpVec2B=new d,"object"==typeof t?this.fromJSON(t):this.startPoint.set(t,e)},add:function(t){return this.curves.push(t),this},circleTo:function(t,e,i){return void 0===e&&(e=!1),this.ellipseTo(t,t,0,360,e,i)},closePath:function(){var t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);return t.equals(e)||this.curves.push(new a(e,t)),this},cubicBezierTo:function(t,e,i,n,s,o){var a,h,u,l=this.getEndPoint();return t instanceof d?(a=t,h=e,u=i):(a=new d(i,n),h=new d(s,o),u=new d(t,e)),this.add(new r(l,a,h,u))},quadraticBezierTo:function(t,e,i,n){var r,s,o=this.getEndPoint();return t instanceof d?(r=t,s=e):(r=new d(i,n),s=new d(t,e)),this.add(new u(o,r,s))},draw:function(t,e){for(var i=0;i<this.curves.length;i++){var n=this.curves[i];n.active&&n.draw(t,e)}return t},ellipseTo:function(t,e,i,n,r,o){var a=new s(0,0,t,e,i,n,r,o),h=this.getEndPoint(this._tmpVec2A),u=a.getStartPoint(this._tmpVec2B);return h.subtract(u),a.x=h.x,a.y=h.y,this.add(a)},fromJSON:function(t){this.curves=[],this.cacheLengths=[],this.startPoint.set(t.x,t.y),this.autoClose=t.autoClose;for(var e=0;e<t.curves.length;e++){var i=t.curves[e];switch(i.type){case"LineCurve":this.add(a.fromJSON(i));break;case"EllipseCurve":this.add(s.fromJSON(i));break;case"SplineCurve":this.add(c.fromJSON(i));break;case"CubicBezierCurve":this.add(r.fromJSON(i));break;case"QuadraticBezierCurve":this.add(u.fromJSON(i))}}return this},getBounds:function(t,e){void 0===t&&(t=new l),void 0===e&&(e=16),t.x=Number.MAX_VALUE,t.y=Number.MAX_VALUE;for(var i=new l,n=p.MIN_SAFE_INTEGER,r=p.MIN_SAFE_INTEGER,s=0;s<this.curves.length;s++){var o=this.curves[s];o.active&&(o.getBounds(i,e),t.x=Math.min(t.x,i.x),t.y=Math.min(t.y,i.y),n=Math.max(n,i.right),r=Math.max(r,i.bottom))}return t.right=n,t.bottom=r,t},getCurveLengths:function(){if(this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,i=0;i<this.curves.length;i++)e+=this.curves[i].getLength(),t.push(e);return this.cacheLengths=t,t},getEndPoint:function(t){return void 0===t&&(t=new d),this.curves.length>0?this.curves[this.curves.length-1].getPoint(1,t):t.copy(this.startPoint),t},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},getPoint:function(t,e){void 0===e&&(e=new d);for(var i=t*this.getLength(),n=this.getCurveLengths(),r=0;r<n.length;){if(n[r]>=i){var s=n[r]-i,o=this.curves[r],a=o.getLength(),h=0===a?0:1-s/a;return o.getPointAt(h,e)}r++}return null},getPoints:function(t){void 0===t&&(t=12);for(var e,i=[],n=0;n<this.curves.length;n++){var r=this.curves[n];if(r.active)for(var s=r.getResolution(t),o=r.getPoints(s),a=0;a<o.length;a++){var h=o[a];e&&e.equals(h)||(i.push(h),e=h)}}return this.autoClose&&i.length>1&&!i[i.length-1].equals(i[0])&&i.push(i[0]),i},getRandomPoint:function(t){return void 0===t&&(t=new d),this.getPoint(Math.random(),t)},getSpacedPoints:function(t){void 0===t&&(t=40);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return this.autoClose&&e.push(e[0]),e},getStartPoint:function(t){return void 0===t&&(t=new d),t.copy(this.startPoint)},getTangent:function(t,e){void 0===e&&(e=new d);for(var i=t*this.getLength(),n=this.getCurveLengths(),r=0;r<n.length;){if(n[r]>=i){var s=n[r]-i,o=this.curves[r],a=o.getLength(),h=0===a?0:1-s/a;return o.getTangentAt(h,e)}r++}return null},lineTo:function(t,e){t instanceof d?this._tmpVec2B.copy(t):this._tmpVec2B.set(t,e);var i=this.getEndPoint(this._tmpVec2A);return this.add(new a([i.x,i.y,this._tmpVec2B.x,this._tmpVec2B.y]))},splineTo:function(t){return t.unshift(this.getEndPoint()),this.add(new c(t))},moveTo:function(t,e){return t instanceof d?this.add(new h(t.x,t.y)):this.add(new h(t,e))},toJSON:function(){for(var t=[],e=0;e<this.curves.length;e++)t.push(this.curves[e].toJSON());return{type:"Path",x:this.startPoint.x,y:this.startPoint.y,autoClose:this.autoClose,curves:t}},updateArcLengths:function(){this.cacheLengths=[],this.getCurveLengths()},destroy:function(){this.curves.length=0,this.cacheLengths.length=0,this.startPoint=void 0}});o.register("path",(function(t,e){return new f(t,e)})),t.exports=f},3881:(t,e,i)=>{var n=i(47379),r=i(33930),s=new n({initialize:function(t,e){this.parent=t,this.events=e,e||(this.events=t.events?t.events:t),this.list={},this.values={},this._frozen=!1,!t.hasOwnProperty("sys")&&this.events&&this.events.once("destroy",this.destroy,this)},get:function(t){var e=this.list;if(Array.isArray(t)){for(var i=[],n=0;n<t.length;n++)i.push(e[t[n]]);return i}return e[t]},getAll:function(){var t={};for(var e in this.list)this.list.hasOwnProperty(e)&&(t[e]=this.list[e]);return t},query:function(t){var e={};for(var i in this.list)this.list.hasOwnProperty(i)&&i.match(t)&&(e[i]=this.list[i]);return e},set:function(t,e){if(this._frozen)return this;if("string"==typeof t)return this.setValue(t,e);for(var i in t)this.setValue(i,t[i]);return this},inc:function(t,e){if(this._frozen)return this;void 0===e&&(e=1);var i=this.get(t);return void 0===i&&(i=0),this.set(t,i+e),this},toggle:function(t){return this._frozen||this.set(t,!this.get(t)),this},setValue:function(t,e){if(this._frozen)return this;if(this.has(t))this.values[t]=e;else{var i=this,n=this.list,s=this.events,o=this.parent;Object.defineProperty(this.values,t,{enumerable:!0,configurable:!0,get:function(){return n[t]},set:function(e){if(!i._frozen){var a=n[t];n[t]=e,s.emit(r.CHANGE_DATA,o,t,e,a),s.emit(r.CHANGE_DATA_KEY+t,o,e,a)}}}),n[t]=e,s.emit(r.SET_DATA,o,t,e)}return this},each:function(t,e){for(var i=[this.parent,null,void 0],n=1;n<arguments.length;n++)i.push(arguments[n]);for(var r in this.list)i[1]=r,i[2]=this.list[r],t.apply(e,i);return this},merge:function(t,e){for(var i in void 0===e&&(e=!0),t)t.hasOwnProperty(i)&&(e||!e&&!this.has(i))&&this.setValue(i,t[i]);return this},remove:function(t){if(this._frozen)return this;if(!Array.isArray(t))return this.removeValue(t);for(var e=0;e<t.length;e++)this.removeValue(t[e]);return this},removeValue:function(t){if(this.has(t)){var e=this.list[t];delete this.list[t],delete this.values[t],this.events.emit(r.REMOVE_DATA,this.parent,t,e)}return this},pop:function(t){var e=void 0;return!this._frozen&&this.has(t)&&(e=this.list[t],delete this.list[t],delete this.values[t],this.events.emit(r.REMOVE_DATA,this.parent,t,e)),e},has:function(t){return this.list.hasOwnProperty(t)},setFreeze:function(t){return this._frozen=t,this},reset:function(){for(var t in this.list)delete this.list[t],delete this.values[t];return this._frozen=!1,this},destroy:function(){this.reset(),this.events.off(r.CHANGE_DATA),this.events.off(r.SET_DATA),this.events.off(r.REMOVE_DATA),this.parent=null},freeze:{get:function(){return this._frozen},set:function(t){this._frozen=!!t}},count:{get:function(){var t=0;for(var e in this.list)void 0!==this.list[e]&&t++;return t}}});t.exports=s},787:(t,e,i)=>{var n=i(47379),r=i(3881),s=i(50354),o=i(88637),a=new n({Extends:r,initialize:function(t){r.call(this,t,t.sys.events),this.scene=t,this.systems=t.sys,t.sys.events.once(o.BOOT,this.boot,this),t.sys.events.on(o.START,this.start,this)},boot:function(){this.events=this.systems.events,this.events.once(o.DESTROY,this.destroy,this)},start:function(){this.events.once(o.SHUTDOWN,this.shutdown,this)},shutdown:function(){this.systems.events.off(o.SHUTDOWN,this.shutdown,this)},destroy:function(){r.prototype.destroy.call(this),this.events.off(o.START,this.start,this),this.scene=null,this.systems=null}});s.register("DataManagerPlugin",a,"data"),t.exports=a},25962:t=>{t.exports="changedata"},25256:t=>{t.exports="changedata-"},94357:t=>{t.exports="removedata"},85366:t=>{t.exports="setdata"},33930:(t,e,i)=>{t.exports={CHANGE_DATA:i(25962),CHANGE_DATA_KEY:i(25256),REMOVE_DATA:i(94357),SET_DATA:i(85366)}},69783:(t,e,i)=>{t.exports={DataManager:i(3881),DataManagerPlugin:i(787),Events:i(33930)}},9715:(t,e,i)=>{var n=i(95653),r={audioData:!1,dolby:!1,m4a:!1,mp3:!1,ogg:!1,opus:!1,wav:!1,webAudio:!1,webm:!1};t.exports=function(){r.audioData=!!window.Audio,r.webAudio=!(!window.AudioContext&&!window.webkitAudioContext);var t=document.createElement("audio"),e=!!t.canPlayType;try{if(e&&(t.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,"")&&(r.ogg=!0),(t.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,"")||t.canPlayType("audio/opus;").replace(/^no$/,""))&&(r.opus=!0),t.canPlayType("audio/mpeg;").replace(/^no$/,"")&&(r.mp3=!0),t.canPlayType('audio/wav; codecs="1"').replace(/^no$/,"")&&(r.wav=!0),(t.canPlayType("audio/x-m4a;")||t.canPlayType("audio/aac;").replace(/^no$/,""))&&(r.m4a=!0),t.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")&&(r.webm=!0),""!==t.canPlayType('audio/mp4;codecs="ec-3"')))if(n.edge)r.dolby=!0;else if(n.safari&&n.safariVersion>=9&&/Mac OS X (\d+)_(\d+)/.test(navigator.userAgent)){var i=parseInt(RegExp.$1,10),s=parseInt(RegExp.$2,10);(10===i&&s>=11||i>10)&&(r.dolby=!0)}}catch(t){}return r}()},95653:(t,e,i)=>{var n,r=i(60236),s={chrome:!1,chromeVersion:0,edge:!1,firefox:!1,firefoxVersion:0,ie:!1,ieVersion:0,mobileSafari:!1,opera:!1,safari:!1,safariVersion:0,silk:!1,trident:!1,tridentVersion:0};t.exports=(n=navigator.userAgent,/Edge\/\d+/.test(n)?s.edge=!0:/Chrome\/(\d+)/.test(n)&&!r.windowsPhone?(s.chrome=!0,s.chromeVersion=parseInt(RegExp.$1,10)):/Firefox\D+(\d+)/.test(n)?(s.firefox=!0,s.firefoxVersion=parseInt(RegExp.$1,10)):/AppleWebKit/.test(n)&&r.iOS?s.mobileSafari=!0:/MSIE (\d+\.\d+);/.test(n)?(s.ie=!0,s.ieVersion=parseInt(RegExp.$1,10)):/Opera/.test(n)?s.opera=!0:/Safari/.test(n)&&!r.windowsPhone?s.safari=!0:/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/.test(n)&&(s.ie=!0,s.trident=!0,s.tridentVersion=parseInt(RegExp.$1,10),s.ieVersion=parseInt(RegExp.$3,10)),/Silk/.test(n)&&(s.silk=!0),s)},86877:(t,e,i)=>{var n,r,s,o=i(89429),a={supportInverseAlpha:!1,supportNewBlendModes:!1};t.exports=(void 0!==document&&(a.supportNewBlendModes=(n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/",r="AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==",(s=new Image).onload=function(){var t=new Image;t.onload=function(){var e=o.create(t,6,1).getContext("2d");if(e.globalCompositeOperation="multiply",e.drawImage(s,0,0),e.drawImage(t,2,0),!e.getImageData(2,0,1,1))return!1;var i=e.getImageData(2,0,1,1).data;o.remove(t),a.supportNewBlendModes=255===i[0]&&0===i[1]&&0===i[2]},t.src=n+"/wCKxvRF"+r},s.src=n+"AP804Oa6"+r,!1),a.supportInverseAlpha=function(){var t=o.create(this,2,1).getContext("2d");t.fillStyle="rgba(10, 20, 30, 0.5)",t.fillRect(0,0,1,1);var e=t.getImageData(0,0,1,1);if(null===e)return!1;t.putImageData(e,1,0);var i=t.getImageData(1,0,1,1);return i.data[0]===e.data[0]&&i.data[1]===e.data[1]&&i.data[2]===e.data[2]&&i.data[3]===e.data[3]}()),a)},33789:(t,e,i)=>{var n=i(60236),r=i(95653),s=i(89429),o={canvas:!1,canvasBitBltShift:null,file:!1,fileSystem:!1,getUserMedia:!0,littleEndian:!1,localStorage:!1,pointerLock:!1,support32bit:!1,vibration:!1,webGL:!1,worker:!1};t.exports=function(){o.canvas=!!window.CanvasRenderingContext2D;try{o.localStorage=!!localStorage.getItem}catch(t){o.localStorage=!1}o.file=!!(window.File&&window.FileReader&&window.FileList&&window.Blob),o.fileSystem=!!window.requestFileSystem;var t,e,i,a=!1;return o.webGL=function(){if(window.WebGLRenderingContext)try{var t=s.createWebGL(this),e=t.getContext("webgl")||t.getContext("experimental-webgl"),i=s.create2D(this),n=i.getContext("2d").createImageData(1,1);return a=n.data instanceof Uint8ClampedArray,s.remove(t),s.remove(i),!!e}catch(t){return!1}return!1}(),o.worker=!!window.Worker,o.pointerLock="pointerLockElement"in document||"mozPointerLockElement"in document||"webkitPointerLockElement"in document,navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia||navigator.oGetUserMedia,window.URL=window.URL||window.webkitURL||window.mozURL||window.msURL,o.getUserMedia=o.getUserMedia&&!!navigator.getUserMedia&&!!window.URL,r.firefox&&r.firefoxVersion<21&&(o.getUserMedia=!1),!n.iOS&&(r.ie||r.firefox||r.chrome)&&(o.canvasBitBltShift=!0),(r.safari||r.mobileSafari)&&(o.canvasBitBltShift=!1),navigator.vibrate=navigator.vibrate||navigator.webkitVibrate||navigator.mozVibrate||navigator.msVibrate,navigator.vibrate&&(o.vibration=!0),"undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint32Array&&(o.littleEndian=(t=new ArrayBuffer(4),e=new Uint8Array(t),i=new Uint32Array(t),e[0]=161,e[1]=178,e[2]=195,e[3]=212,3569595041===i[0]||2712847316!==i[0]&&null)),o.support32bit="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof Int32Array&&null!==o.littleEndian&&a,o}()},22513:t=>{var e={available:!1,cancel:"",keyboard:!1,request:""};t.exports=function(){var t,i="Fullscreen",n="FullScreen",r=["request"+i,"request"+n,"webkitRequest"+i,"webkitRequest"+n,"msRequest"+i,"msRequest"+n,"mozRequest"+n,"mozRequest"+i];for(t=0;t<r.length;t++)if(document.documentElement[r[t]]){e.available=!0,e.request=r[t];break}var s=["cancel"+n,"exit"+i,"webkitCancel"+n,"webkitExit"+i,"msCancel"+n,"msExit"+i,"mozCancel"+n,"mozExit"+i];if(e.available)for(t=0;t<s.length;t++)if(document[s[t]]){e.cancel=s[t];break}return window.Element&&Element.ALLOW_KEYBOARD_INPUT&&!/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)&&(e.keyboard=!0),Object.defineProperty(e,"active",{get:function(){return!!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement)}}),e}()},59188:(t,e,i)=>{var n=i(95653),r={gamepads:!1,mspointer:!1,touch:!1,wheelEvent:null};t.exports=(("ontouchstart"in document.documentElement||navigator.maxTouchPoints&&navigator.maxTouchPoints>=1)&&(r.touch=!0),(navigator.msPointerEnabled||navigator.pointerEnabled)&&(r.mspointer=!0),navigator.getGamepads&&(r.gamepads=!0),"onwheel"in window||n.ie&&"WheelEvent"in window?r.wheelEvent="wheel":"onmousewheel"in window?r.wheelEvent="mousewheel":n.firefox&&"MouseScrollEvent"in window&&(r.wheelEvent="DOMMouseScroll"),r)},60236:t=>{var e={android:!1,chromeOS:!1,cordova:!1,crosswalk:!1,desktop:!1,ejecta:!1,electron:!1,iOS:!1,iOSVersion:0,iPad:!1,iPhone:!1,kindle:!1,linux:!1,macOS:!1,node:!1,nodeWebkit:!1,pixelRatio:1,webApp:!1,windows:!1,windowsPhone:!1};t.exports=function(){var t=navigator.userAgent;/Windows/.test(t)?e.windows=!0:/Mac OS/.test(t)&&!/like Mac OS/.test(t)?e.macOS=!0:/Android/.test(t)?e.android=!0:/Linux/.test(t)?e.linux=!0:/iP[ao]d|iPhone/i.test(t)?(e.iOS=!0,navigator.appVersion.match(/OS (\d+)/),e.iOSVersion=parseInt(RegExp.$1,10),e.iPhone=-1!==t.toLowerCase().indexOf("iphone"),e.iPad=-1!==t.toLowerCase().indexOf("ipad")):/Kindle/.test(t)||/\bKF[A-Z][A-Z]+/.test(t)||/Silk.*Mobile Safari/.test(t)?e.kindle=!0:/CrOS/.test(t)&&(e.chromeOS=!0),(/Windows Phone/i.test(t)||/IEMobile/i.test(t))&&(e.android=!1,e.iOS=!1,e.macOS=!1,e.windows=!0,e.windowsPhone=!0);var i=/Silk/.test(t);return(e.windows||e.macOS||e.linux&&!i||e.chromeOS)&&(e.desktop=!0),(e.windowsPhone||/Windows NT/i.test(t)&&/Touch/i.test(t))&&(e.desktop=!1),navigator.standalone&&(e.webApp=!0),void 0!==window.cordova&&(e.cordova=!0),"undefined"!=typeof process&&process.versions&&process.versions.node&&(e.node=!0),e.node&&"object"==typeof process.versions&&(e.nodeWebkit=!!process.versions["node-webkit"],e.electron=!!process.versions.electron),void 0!==window.ejecta&&(e.ejecta=!0),/Crosswalk/.test(t)&&(e.crosswalk=!0),e.pixelRatio=window.devicePixelRatio||1,e}()},14677:t=>{var e={h264:!1,hls:!1,mp4:!1,ogg:!1,vp9:!1,webm:!1};t.exports=function(){var t=document.createElement("video"),i=!!t.canPlayType;try{i&&(t.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,"")&&(e.ogg=!0),t.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,"")&&(e.h264=!0,e.mp4=!0),t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")&&(e.webm=!0),t.canPlayType('video/webm; codecs="vp9"').replace(/^no$/,"")&&(e.vp9=!0),t.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/,"")&&(e.hls=!0))}catch(t){}return e}()},82113:(t,e,i)=>{t.exports={os:i(60236),browser:i(95653),features:i(33789),input:i(59188),audio:i(9715),video:i(14677),fullscreen:i(22513),canvasFeatures:i(86877)}},1174:t=>{t.exports={TOP_LEFT:0,TOP_CENTER:1,TOP_RIGHT:2,LEFT_TOP:3,LEFT_CENTER:4,LEFT_BOTTOM:5,CENTER:6,RIGHT_TOP:7,RIGHT_CENTER:8,RIGHT_BOTTOM:9,BOTTOM_LEFT:10,BOTTOM_CENTER:11,BOTTOM_RIGHT:12}},21041:(t,e,i)=>{var n=i(28589),r=i(53309),s=i(5382),o=i(29763);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)+i),s(t,n(e)+a),t}},1775:(t,e,i)=>{var n=i(28589),r=i(80891),s=i(5382),o=i(314);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)-i),s(t,n(e)+a),t}},59:(t,e,i)=>{var n=i(28589),r=i(32018),s=i(5382),o=i(73659);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)+i),s(t,n(e)+a),t}},25798:(t,e,i)=>{var n=i(47742),r=i(53309),s=i(99128);t.exports=function(t,e,i,o){return void 0===i&&(i=0),void 0===o&&(o=0),n(t,r(e)+i,s(e)+o),t}},61968:(t,e,i)=>{var n=i(99128),r=i(80891),s=i(54869),o=i(314);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)-i),s(t,n(e)+a),t}},4026:(t,e,i)=>{var n=i(1174),r=[];r[n.BOTTOM_CENTER]=i(21041),r[n.BOTTOM_LEFT]=i(1775),r[n.BOTTOM_RIGHT]=i(59),r[n.CENTER]=i(25798),r[n.LEFT_CENTER]=i(61968),r[n.RIGHT_CENTER]=i(1681),r[n.TOP_CENTER]=i(44215),r[n.TOP_LEFT]=i(44053),r[n.TOP_RIGHT]=i(9451),r[n.LEFT_BOTTOM]=r[n.BOTTOM_LEFT],r[n.LEFT_TOP]=r[n.TOP_LEFT],r[n.RIGHT_BOTTOM]=r[n.BOTTOM_RIGHT],r[n.RIGHT_TOP]=r[n.TOP_RIGHT];t.exports=function(t,e,i,n,s){return r[i](t,e,n,s)}},1681:(t,e,i)=>{var n=i(99128),r=i(32018),s=i(54869),o=i(73659);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)+i),s(t,n(e)+a),t}},44215:(t,e,i)=>{var n=i(53309),r=i(44290),s=i(29763),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,n(e)+i),o(t,r(e)-a),t}},44053:(t,e,i)=>{var n=i(80891),r=i(44290),s=i(314),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,n(e)-i),o(t,r(e)-a),t}},9451:(t,e,i)=>{var n=i(32018),r=i(44290),s=i(73659),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,n(e)+i),o(t,r(e)-a),t}},61993:(t,e,i)=>{t.exports={BottomCenter:i(21041),BottomLeft:i(1775),BottomRight:i(59),Center:i(25798),LeftCenter:i(61968),QuickSet:i(4026),RightCenter:i(1681),TopCenter:i(44215),TopLeft:i(44053),TopRight:i(9451)}},7854:(t,e,i)=>{var n=i(1174),r=i(80933),s={In:i(61993),To:i(53361)};s=r(!1,s,n),t.exports=s},75421:(t,e,i)=>{var n=i(28589),r=i(53309),s=i(29763),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,r(e)+i),o(t,n(e)+a),t}},54728:(t,e,i)=>{var n=i(28589),r=i(80891),s=i(314),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,r(e)-i),o(t,n(e)+a),t}},77792:(t,e,i)=>{var n=i(28589),r=i(32018),s=i(73659),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,r(e)+i),o(t,n(e)+a),t}},38726:(t,e,i)=>{var n=i(28589),r=i(80891),s=i(5382),o=i(73659);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)-i),s(t,n(e)+a),t}},85362:(t,e,i)=>{var n=i(99128),r=i(80891),s=i(54869),o=i(73659);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)-i),s(t,n(e)+a),t}},2912:(t,e,i)=>{var n=i(80891),r=i(44290),s=i(73659),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,n(e)-i),o(t,r(e)-a),t}},82526:(t,e,i)=>{var n=i(1174),r=[];r[n.BOTTOM_CENTER]=i(75421),r[n.BOTTOM_LEFT]=i(54728),r[n.BOTTOM_RIGHT]=i(77792),r[n.LEFT_BOTTOM]=i(38726),r[n.LEFT_CENTER]=i(85362),r[n.LEFT_TOP]=i(2912),r[n.RIGHT_BOTTOM]=i(42418),r[n.RIGHT_CENTER]=i(97786),r[n.RIGHT_TOP]=i(39322),r[n.TOP_CENTER]=i(33677),r[n.TOP_LEFT]=i(33886),r[n.TOP_RIGHT]=i(84653);t.exports=function(t,e,i,n,s){return r[i](t,e,n,s)}},42418:(t,e,i)=>{var n=i(28589),r=i(32018),s=i(5382),o=i(314);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)+i),s(t,n(e)+a),t}},97786:(t,e,i)=>{var n=i(99128),r=i(32018),s=i(54869),o=i(314);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,r(e)+i),s(t,n(e)+a),t}},39322:(t,e,i)=>{var n=i(32018),r=i(44290),s=i(314),o=i(48703);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),s(t,n(e)+i),o(t,r(e)-a),t}},33677:(t,e,i)=>{var n=i(53309),r=i(44290),s=i(5382),o=i(29763);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),s(t,r(e)-a),t}},33886:(t,e,i)=>{var n=i(80891),r=i(44290),s=i(5382),o=i(314);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)-i),s(t,r(e)-a),t}},84653:(t,e,i)=>{var n=i(32018),r=i(44290),s=i(5382),o=i(73659);t.exports=function(t,e,i,a){return void 0===i&&(i=0),void 0===a&&(a=0),o(t,n(e)+i),s(t,r(e)-a),t}},53361:(t,e,i)=>{t.exports={BottomCenter:i(75421),BottomLeft:i(54728),BottomRight:i(77792),LeftBottom:i(38726),LeftCenter:i(85362),LeftTop:i(2912),QuickSet:i(82526),RightBottom:i(42418),RightCenter:i(97786),RightTop:i(39322),TopCenter:i(33677),TopLeft:i(33886),TopRight:i(84653)}},47742:(t,e,i)=>{var n=i(29763),r=i(54869);t.exports=function(t,e,i){return n(t,e),r(t,i)}},28589:t=>{t.exports=function(t){return t.y+t.height-t.height*t.originY}},53309:t=>{t.exports=function(t){return t.x-t.width*t.originX+.5*t.width}},99128:t=>{t.exports=function(t){return t.y-t.height*t.originY+.5*t.height}},80891:t=>{t.exports=function(t){return t.x-t.width*t.originX}},73678:t=>{t.exports=function(t){return t.width*t.originX}},60199:t=>{t.exports=function(t){return t.height*t.originY}},32018:t=>{t.exports=function(t){return t.x+t.width-t.width*t.originX}},44290:t=>{t.exports=function(t){return t.y-t.height*t.originY}},5382:t=>{t.exports=function(t,e){return t.y=e-t.height+t.height*t.originY,t}},29763:t=>{t.exports=function(t,e){var i=t.width*t.originX;return t.x=e+i-.5*t.width,t}},54869:t=>{t.exports=function(t,e){var i=t.height*t.originY;return t.y=e+i-.5*t.height,t}},314:t=>{t.exports=function(t,e){return t.x=e+t.width*t.originX,t}},73659:t=>{t.exports=function(t,e){return t.x=e-t.width+t.width*t.originX,t}},48703:t=>{t.exports=function(t,e){return t.y=e+t.height*t.originY,t}},50342:(t,e,i)=>{t.exports={CenterOn:i(47742),GetBottom:i(28589),GetCenterX:i(53309),GetCenterY:i(99128),GetLeft:i(80891),GetOffsetX:i(73678),GetOffsetY:i(60199),GetRight:i(32018),GetTop:i(44290),SetBottom:i(5382),SetCenterX:i(29763),SetCenterY:i(54869),SetLeft:i(314),SetRight:i(73659),SetTop:i(48703)}},13227:t=>{t.exports={setCrisp:function(t){return["optimizeSpeed","-moz-crisp-edges","-o-crisp-edges","-webkit-optimize-contrast","optimize-contrast","crisp-edges","pixelated"].forEach((function(e){t.style["image-rendering"]=e})),t.style.msInterpolationMode="nearest-neighbor",t},setBicubic:function(t){return t.style["image-rendering"]="auto",t.style.msInterpolationMode="bicubic",t}}},89429:(t,e,i)=>{var n,r,s,o=i(50460),a=i(505),h=[],u=!1;t.exports=(s=function(){var t=0;return h.forEach((function(e){e.parent&&t++})),t},{create2D:function(t,e,i){return n(t,e,i,o.CANVAS)},create:n=function(t,e,i,n,s){var l;void 0===e&&(e=1),void 0===i&&(i=1),void 0===n&&(n=o.CANVAS),void 0===s&&(s=!1);var c=r(n);return null===c?(c={parent:t,canvas:document.createElement("canvas"),type:n},n===o.CANVAS&&h.push(c),l=c.canvas):(c.parent=t,l=c.canvas),s&&(c.parent=l),l.width=e,l.height=i,u&&n===o.CANVAS&&a.disable(l.getContext("2d")),l},createWebGL:function(t,e,i){return n(t,e,i,o.WEBGL)},disableSmoothing:function(){u=!0},enableSmoothing:function(){u=!1},first:r=function(t){if(void 0===t&&(t=o.CANVAS),t===o.WEBGL)return null;for(var e=0;e<h.length;e++){var i=h[e];if(!i.parent&&i.type===t)return i}return null},free:function(){return h.length-s()},pool:h,remove:function(t){var e=t instanceof HTMLCanvasElement;h.forEach((function(i){(e&&i.canvas===t||!e&&i.parent===t)&&(i.parent=null,i.canvas.width=1,i.canvas.height=1)}))},total:s})},505:t=>{var e,i="";t.exports={disable:function(t){return""===i&&(i=e(t)),i&&(t[i]=!1),t},enable:function(t){return""===i&&(i=e(t)),i&&(t[i]=!0),t},getPrefix:e=function(t){for(var e=["i","webkitI","msI","mozI","oI"],i=0;i<e.length;i++){var n=e[i]+"mageSmoothingEnabled";if(n in t)return n}return null},isEnabled:function(t){return null!==i?t[i]:null}}},63812:t=>{t.exports=function(t,e){return void 0===e&&(e="none"),t.style.msTouchAction=e,t.style["ms-touch-action"]=e,t.style["touch-action"]=e,t}},71748:t=>{t.exports=function(t,e){void 0===e&&(e="none");return["-webkit-","-khtml-","-moz-","-ms-",""].forEach((function(i){t.style[i+"user-select"]=e})),t.style["-webkit-touch-callout"]=e,t.style["-webkit-tap-highlight-color"]="rgba(0, 0, 0, 0)",t}},52015:(t,e,i)=>{t.exports={CanvasInterpolation:i(13227),CanvasPool:i(89429),Smoothing:i(505),TouchAction:i(63812),UserSelect:i(71748)}},81615:(t,e,i)=>{var n=i(47379),r=i(27994),s=i(30264),o=i(87198),a=i(13977),h=new n({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=255),this.r=0,this.g=0,this.b=0,this.a=255,this._h=0,this._s=0,this._v=0,this._locked=!1,this.gl=[0,0,0,1],this._color=0,this._color32=0,this._rgba="",this.setTo(t,e,i,n)},transparent:function(){return this._locked=!0,this.red=0,this.green=0,this.blue=0,this.alpha=0,this._locked=!1,this.update(!0)},setTo:function(t,e,i,n,r){return void 0===n&&(n=255),void 0===r&&(r=!0),this._locked=!0,this.red=t,this.green=e,this.blue=i,this.alpha=n,this._locked=!1,this.update(r)},setGLTo:function(t,e,i,n){return void 0===n&&(n=1),this._locked=!0,this.redGL=t,this.greenGL=e,this.blueGL=i,this.alphaGL=n,this._locked=!1,this.update(!0)},setFromRGB:function(t){return this._locked=!0,this.red=t.r,this.green=t.g,this.blue=t.b,t.hasOwnProperty("a")&&(this.alpha=t.a),this._locked=!1,this.update(!0)},setFromHSV:function(t,e,i){return o(t,e,i,this)},update:function(t){if(void 0===t&&(t=!1),this._locked)return this;var e=this.r,i=this.g,n=this.b,o=this.a;return this._color=r(e,i,n),this._color32=s(e,i,n,o),this._rgba="rgba("+e+","+i+","+n+","+o/255+")",t&&a(e,i,n,this),this},updateHSV:function(){var t=this.r,e=this.g,i=this.b;return a(t,e,i,this),this},clone:function(){return new h(this.r,this.g,this.b,this.a)},gray:function(t){return this.setTo(t,t,t)},random:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t)),n=Math.floor(t+Math.random()*(e-t)),r=Math.floor(t+Math.random()*(e-t));return this.setTo(i,n,r)},randomGray:function(t,e){void 0===t&&(t=0),void 0===e&&(e=255);var i=Math.floor(t+Math.random()*(e-t));return this.setTo(i,i,i)},saturate:function(t){return this.s+=t/100,this},desaturate:function(t){return this.s-=t/100,this},lighten:function(t){return this.v+=t/100,this},darken:function(t){return this.v-=t/100,this},brighten:function(t){var e=this.r,i=this.g,n=this.b;return e=Math.max(0,Math.min(255,e-Math.round(-t/100*255))),i=Math.max(0,Math.min(255,i-Math.round(-t/100*255))),n=Math.max(0,Math.min(255,n-Math.round(-t/100*255))),this.setTo(e,i,n)},color:{get:function(){return this._color}},color32:{get:function(){return this._color32}},rgba:{get:function(){return this._rgba}},redGL:{get:function(){return this.gl[0]},set:function(t){this.gl[0]=Math.min(Math.abs(t),1),this.r=Math.floor(255*this.gl[0]),this.update(!0)}},greenGL:{get:function(){return this.gl[1]},set:function(t){this.gl[1]=Math.min(Math.abs(t),1),this.g=Math.floor(255*this.gl[1]),this.update(!0)}},blueGL:{get:function(){return this.gl[2]},set:function(t){this.gl[2]=Math.min(Math.abs(t),1),this.b=Math.floor(255*this.gl[2]),this.update(!0)}},alphaGL:{get:function(){return this.gl[3]},set:function(t){this.gl[3]=Math.min(Math.abs(t),1),this.a=Math.floor(255*this.gl[3]),this.update()}},red:{get:function(){return this.r},set:function(t){t=Math.floor(Math.abs(t)),this.r=Math.min(t,255),this.gl[0]=t/255,this.update(!0)}},green:{get:function(){return this.g},set:function(t){t=Math.floor(Math.abs(t)),this.g=Math.min(t,255),this.gl[1]=t/255,this.update(!0)}},blue:{get:function(){return this.b},set:function(t){t=Math.floor(Math.abs(t)),this.b=Math.min(t,255),this.gl[2]=t/255,this.update(!0)}},alpha:{get:function(){return this.a},set:function(t){t=Math.floor(Math.abs(t)),this.a=Math.min(t,255),this.gl[3]=t/255,this.update()}},h:{get:function(){return this._h},set:function(t){this._h=t,o(t,this._s,this._v,this)}},s:{get:function(){return this._s},set:function(t){this._s=t,o(this._h,t,this._v,this)}},v:{get:function(){return this._v},set:function(t){this._v=t,o(this._h,this._s,t,this)}}});t.exports=h},97591:t=>{t.exports=function(t){var e={r:t>>16&255,g:t>>8&255,b:255&t,a:255};return t>16777215&&(e.a=t>>>24),e}},73502:t=>{t.exports=function(t){var e=t.toString(16);return 1===e.length?"0"+e:e}},27994:t=>{t.exports=function(t,e,i){return t<<16|e<<8|i}},30264:t=>{t.exports=function(t,e,i,n){return n<<24|t<<16|e<<8|i}},14832:(t,e,i)=>{var n=i(81615),r=i(92660);t.exports=function(t,e,i){var s=i,o=i,a=i;if(0!==e){var h=i<.5?i*(1+e):i+e-i*e,u=2*i-h;s=r(u,h,t+1/3),o=r(u,h,t),a=r(u,h,t-1/3)}return(new n).setGLTo(s,o,a,1)}},15878:(t,e,i)=>{var n=i(87198);t.exports=function(t,e){void 0===t&&(t=1),void 0===e&&(e=1);for(var i=[],r=0;r<=359;r++)i.push(n(r/359,t,e));return i}},87198:(t,e,i)=>{var n=i(27994);t.exports=function(t,e,i,r){void 0===e&&(e=1),void 0===i&&(i=1);var s=Math.floor(6*t),o=6*t-s,a=Math.floor(i*(1-e)*255),h=Math.floor(i*(1-o*e)*255),u=Math.floor(i*(1-(1-o)*e)*255),l=i=Math.floor(i*=255),c=i,d=i,p=s%6;return 0===p?(c=u,d=a):1===p?(l=h,d=a):2===p?(l=a,d=u):3===p?(l=a,c=h):4===p?(l=u,c=a):5===p&&(c=a,d=h),r?r.setTo?r.setTo(l,c,d,r.alpha,!1):(r.r=l,r.g=c,r.b=d,r.color=n(l,c,d),r):{r:l,g:c,b:d,color:n(l,c,d)}}},54984:(t,e,i)=>{var n=i(81615);t.exports=function(t){var e=new n;t=t.replace(/^(?:#|0x)?([a-f\d])([a-f\d])([a-f\d])$/i,(function(t,e,i,n){return e+e+i+i+n+n}));var i=/^(?:#|0x)?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);if(i){var r=parseInt(i[1],16),s=parseInt(i[2],16),o=parseInt(i[3],16);e.setTo(r,s,o)}return e}},92660:t=>{t.exports=function(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}},55568:(t,e,i)=>{var n=i(81615),r=i(88095);t.exports=function(t){var e=r(t);return new n(e.r,e.g,e.b,e.a)}},88095:t=>{t.exports=function(t){return t>16777215?{a:t>>>24,r:t>>16&255,g:t>>8&255,b:255&t}:{a:255,r:t>>16&255,g:t>>8&255,b:255&t}}},66791:(t,e,i)=>{var n=i(57459),r=function(t,e,i,r,s,o,a,h){void 0===a&&(a=100),void 0===h&&(h=0);var u=h/a;return{r:n(t,r,u),g:n(e,s,u),b:n(i,o,u)}};t.exports={RGBWithRGB:r,ColorWithRGB:function(t,e,i,n,s,o){return void 0===s&&(s=100),void 0===o&&(o=0),r(t.r,t.g,t.b,e,i,n,s,o)},ColorWithColor:function(t,e,i,n){return void 0===i&&(i=100),void 0===n&&(n=0),r(t.r,t.g,t.b,e.r,e.g,e.b,i,n)}}},10480:(t,e,i)=>{var n=i(81615);t.exports=function(t){return new n(t.r,t.g,t.b,t.a)}},84367:(t,e,i)=>{var n=i(81615);t.exports=function(t){var e=new n,i=/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?))?\s*\)$/.exec(t.toLowerCase());if(i){var r=parseInt(i[1],10),s=parseInt(i[2],10),o=parseInt(i[3],10),a=void 0!==i[4]?parseFloat(i[4]):1;e.setTo(r,s,o,255*a)}return e}},13977:t=>{t.exports=function(t,e,i,n){void 0===n&&(n={h:0,s:0,v:0}),t/=255,e/=255,i/=255;var r=Math.min(t,e,i),s=Math.max(t,e,i),o=s-r,a=0,h=0===s?0:o/s,u=s;return s!==r&&(s===t?a=(e-i)/o+(e<i?6:0):s===e?a=(i-t)/o+2:s===i&&(a=(t-e)/o+4),a/=6),n.hasOwnProperty("_h")?(n._h=a,n._s=h,n._v=u):(n.h=a,n.s=h,n.v=u),n}},51923:(t,e,i)=>{var n=i(73502);t.exports=function(t,e,i,r,s){return void 0===r&&(r=255),void 0===s&&(s="#"),"#"===s?"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1):"0x"+n(r)+n(t)+n(e)+n(i)}},74697:(t,e,i)=>{var n=i(67630),r=i(81615);t.exports=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=255),new r(n(t,e),n(t,e),n(t,e))}},64031:(t,e,i)=>{var n=i(54984),r=i(55568),s=i(10480),o=i(84367);t.exports=function(t){switch(typeof t){case"string":return"rgb"===t.substr(0,3).toLowerCase()?o(t):n(t);case"number":return r(t);case"object":return s(t)}}},82532:(t,e,i)=>{var n=i(81615);n.ColorToRGBA=i(97591),n.ComponentToHex=i(73502),n.GetColor=i(27994),n.GetColor32=i(30264),n.HexStringToColor=i(54984),n.HSLToColor=i(14832),n.HSVColorWheel=i(15878),n.HSVToRGB=i(87198),n.HueToComponent=i(92660),n.IntegerToColor=i(55568),n.IntegerToRGB=i(88095),n.Interpolate=i(66791),n.ObjectToColor=i(10480),n.RandomRGB=i(74697),n.RGBStringToColor=i(84367),n.RGBToHSV=i(13977),n.RGBToString=i(51923),n.ValueToColor=i(64031),t.exports=n},33798:(t,e,i)=>{t.exports={Align:i(7854),BaseShader:i(86381),Bounds:i(50342),Canvas:i(52015),Color:i(82532),Masks:i(31289)}},35615:(t,e,i)=>{var n=i(47379),r=i(80827),s=new n({initialize:function(t,e){var i=t.sys.game.renderer;if(this.renderer=i,this.bitmapMask=e,this.maskTexture=null,this.mainTexture=null,this.dirty=!0,this.mainFramebuffer=null,this.maskFramebuffer=null,this.prevFramebuffer=null,this.invertAlpha=!1,this.isStencil=!1,i&&i.gl){var n=i.width,s=i.height,o=0==(n&n-1)&&0==(s&s-1),a=i.gl,h=o?a.REPEAT:a.CLAMP_TO_EDGE,u=a.LINEAR;this.mainTexture=i.createTexture2D(0,u,u,h,h,a.RGBA,null,n,s),this.maskTexture=i.createTexture2D(0,u,u,h,h,a.RGBA,null,n,s),this.mainFramebuffer=i.createFramebuffer(n,s,this.mainTexture,!0),this.maskFramebuffer=i.createFramebuffer(n,s,this.maskTexture,!0),t.sys.game.events.on(r.CONTEXT_RESTORED,(function(t){var e=t.width,i=t.height,n=0==(e&e-1)&&0==(i&i-1),r=t.gl,s=n?r.REPEAT:r.CLAMP_TO_EDGE,o=r.LINEAR;this.mainTexture=t.createTexture2D(0,o,o,s,s,r.RGBA,null,e,i),this.maskTexture=t.createTexture2D(0,o,o,s,s,r.RGBA,null,e,i),this.mainFramebuffer=t.createFramebuffer(e,i,this.mainTexture,!0),this.maskFramebuffer=t.createFramebuffer(e,i,this.maskTexture,!0)}),this)}},setBitmap:function(t){this.bitmapMask=t},preRenderWebGL:function(t,e,i){t.pipelines.BitmapMaskPipeline.beginMask(this,e,i)},postRenderWebGL:function(t,e){t.pipelines.BitmapMaskPipeline.endMask(this,e)},preRenderCanvas:function(){},postRenderCanvas:function(){},destroy:function(){this.bitmapMask=null;var t=this.renderer;t&&t.gl&&(t.deleteTexture(this.mainTexture),t.deleteTexture(this.maskTexture),t.deleteFramebuffer(this.mainFramebuffer),t.deleteFramebuffer(this.maskFramebuffer)),this.mainTexture=null,this.maskTexture=null,this.mainFramebuffer=null,this.maskFramebuffer=null,this.prevFramebuffer=null,this.renderer=null}});t.exports=s},48315:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e){this.geometryMask=e,this.invertAlpha=!1,this.isStencil=!0,this.level=0},setShape:function(t){return this.geometryMask=t,this},setInvertAlpha:function(t){return void 0===t&&(t=!0),this.invertAlpha=t,this},preRenderWebGL:function(t,e,i){var n=t.gl;t.flush(),0===t.maskStack.length&&(n.enable(n.STENCIL_TEST),n.clear(n.STENCIL_BUFFER_BIT),t.maskCount=0),t.currentCameraMask.mask!==this&&(t.currentMask.mask=this),t.maskStack.push({mask:this,camera:i}),this.applyStencil(t,i,!0),t.maskCount++},applyStencil:function(t,e,i){var n=t.gl,r=this.geometryMask,s=t.maskCount;n.colorMask(!1,!1,!1,!1),i?(n.stencilFunc(n.EQUAL,s,255),n.stencilOp(n.KEEP,n.KEEP,n.INCR)):(n.stencilFunc(n.EQUAL,s+1,255),n.stencilOp(n.KEEP,n.KEEP,n.DECR)),r.renderWebGL(t,r,0,e),t.flush(),n.colorMask(!0,!0,!0,!0),n.stencilOp(n.KEEP,n.KEEP,n.KEEP),i?this.invertAlpha?n.stencilFunc(n.NOTEQUAL,s+1,255):n.stencilFunc(n.EQUAL,s+1,255):this.invertAlpha?n.stencilFunc(n.NOTEQUAL,s,255):n.stencilFunc(n.EQUAL,s,255)},postRenderWebGL:function(t){var e=t.gl;if(t.maskStack.pop(),t.maskCount--,0===t.maskStack.length)t.flush(),t.currentMask.mask=null,e.disable(e.STENCIL_TEST);else{t.flush();var i=t.maskStack[t.maskStack.length-1];i.mask.applyStencil(t,i.camera,!1),t.currentCameraMask.mask!==i.mask?(t.currentMask.mask=i.mask,t.currentMask.camera=i.camera):t.currentMask.mask=null}},preRenderCanvas:function(t,e,i){var n=this.geometryMask;t.currentContext.save(),n.renderCanvas(t,n,0,i,null,null,!0),t.currentContext.clip()},postRenderCanvas:function(t){t.currentContext.restore()},destroy:function(){this.geometryMask=null}});t.exports=n},31289:(t,e,i)=>{t.exports={BitmapMask:i(35615),GeometryMask:i(48315)}},86381:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n){e&&""!==e||(e=["precision mediump float;","uniform vec2 resolution;","varying vec2 fragCoord;","void main () {"," vec2 uv = fragCoord / resolution.xy;"," gl_FragColor = vec4(uv.xyx, 1.0);","}"].join("\n")),i&&""!==i||(i=["precision mediump float;","uniform mat4 uProjectionMatrix;","uniform mat4 uViewMatrix;","uniform vec2 uResolution;","attribute vec2 inPosition;","varying vec2 fragCoord;","void main () {","gl_Position = uProjectionMatrix * uViewMatrix * vec4(inPosition, 1.0, 1.0);","fragCoord = vec2(inPosition.x, uResolution.y - inPosition.y);","}"].join("\n")),void 0===n&&(n=null),this.key=t,this.fragmentSrc=e,this.vertexSrc=i,this.uniforms=n}});t.exports=n},99641:t=>{t.exports=function(t,e){var i;if(e)"string"==typeof e?i=document.getElementById(e):"object"==typeof e&&1===e.nodeType&&(i=e);else if(t.parentElement)return t;return i||(i=document.body),i.appendChild(t),t}},36141:(t,e,i)=>{var n=i(99641);t.exports=function(t){var e=t.config;if(e.parent&&e.domCreateContainer){var i=document.createElement("div");i.style.cssText=["display: block;","width: "+t.scale.width+"px;","height: "+t.scale.height+"px;","padding: 0; margin: 0;","position: absolute;","overflow: hidden;","pointer-events: none;","transform: scale(1);","transform-origin: left top;"].join(" "),t.domContainer=i,n(i,e.parent)}}},71602:(t,e,i)=>{var n=i(60236);t.exports=function(t){if("complete"!==document.readyState&&"interactive"!==document.readyState){var e=function(){document.removeEventListener("deviceready",e,!0),document.removeEventListener("DOMContentLoaded",e,!0),window.removeEventListener("load",e,!0),t()};document.body?n.cordova?document.addEventListener("deviceready",e,!1):(document.addEventListener("DOMContentLoaded",e,!0),window.addEventListener("load",e,!0)):window.setTimeout(e,20)}else t()}},6056:t=>{t.exports=function(t){if(!t)return window.innerHeight;var e=Math.abs(window.orientation),i={w:0,h:0},n=document.createElement("div");return n.setAttribute("style","position: fixed; height: 100vh; width: 0; top: 0"),document.documentElement.appendChild(n),i.w=90===e?n.offsetHeight:window.innerWidth,i.h=90===e?window.innerWidth:n.offsetHeight,document.documentElement.removeChild(n),n=null,90!==Math.abs(window.orientation)?i.h:i.w}},16070:(t,e,i)=>{var n=i(67467);t.exports=function(t,e){var i=window.screen,r=!!i&&(i.orientation||i.mozOrientation||i.msOrientation);if(r&&"string"==typeof r.type)return r.type;if("string"==typeof r)return r;if(i)return i.height>i.width?n.ORIENTATION.PORTRAIT:n.ORIENTATION.LANDSCAPE;if("number"==typeof window.orientation)return 0===window.orientation||180===window.orientation?n.ORIENTATION.PORTRAIT:n.ORIENTATION.LANDSCAPE;if(window.matchMedia){if(window.matchMedia("(orientation: portrait)").matches)return n.ORIENTATION.PORTRAIT;if(window.matchMedia("(orientation: landscape)").matches)return n.ORIENTATION.LANDSCAPE}return e>t?n.ORIENTATION.PORTRAIT:n.ORIENTATION.LANDSCAPE}},74537:t=>{t.exports=function(t){var e;return""!==t&&("string"==typeof t?e=document.getElementById(t):t&&1===t.nodeType&&(e=t)),e||(e=document.body),e}},78403:t=>{t.exports=function(t){var e="";try{if(window.DOMParser)e=(new DOMParser).parseFromString(t,"text/xml");else(e=new ActiveXObject("Microsoft.XMLDOM")).loadXML(t)}catch(t){e=null}return e&&e.documentElement&&!e.getElementsByTagName("parsererror").length?e:null}},68791:t=>{t.exports=function(t){t.parentNode&&t.parentNode.removeChild(t)}},41797:(t,e,i)=>{var n=i(47379),r=i(49035),s=new n({initialize:function(){this.isRunning=!1,this.callback=r,this.tick=0,this.isSetTimeOut=!1,this.timeOutID=null,this.lastTime=0,this.target=0;var t=this;this.step=function e(){var i=window.performance.now();t.lastTime=t.tick,t.tick=i,t.callback(i),t.timeOutID=window.requestAnimationFrame(e)},this.stepTimeout=function e(){var i=Date.now(),n=Math.min(Math.max(2*t.target+t.tick-i,0),t.target);t.lastTime=t.tick,t.tick=i,t.callback(i),t.timeOutID=window.setTimeout(e,n)}},start:function(t,e,i){this.isRunning||(this.callback=t,this.isSetTimeOut=e,this.target=i,this.isRunning=!0,this.timeOutID=e?window.setTimeout(this.stepTimeout,0):window.requestAnimationFrame(this.step))},stop:function(){this.isRunning=!1,this.isSetTimeOut?clearTimeout(this.timeOutID):window.cancelAnimationFrame(this.timeOutID)},destroy:function(){this.stop(),this.callback=r}});t.exports=s},69887:(t,e,i)=>{var n={AddToDOM:i(99641),DOMContentLoaded:i(71602),GetScreenOrientation:i(16070),GetTarget:i(74537),ParseXML:i(78403),RemoveFromDOM:i(68791),RequestAnimationFrame:i(41797)};t.exports=n},53912:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(50354),o=new n({Extends:r,initialize:function(){r.call(this)},shutdown:function(){this.removeAllListeners()},destroy:function(){this.removeAllListeners()}});s.register("EventEmitter",o,"events"),t.exports=o},27408:(t,e,i)=>{t.exports={EventEmitter:i(53912)}},74865:(t,e,i)=>{var n=i(35869),r=i(57687);t.exports=function(t,e,i){e.x=r(i,"x",0),e.y=r(i,"y",0),e.depth=r(i,"depth",0),e.flipX=r(i,"flipX",!1),e.flipY=r(i,"flipY",!1);var s=r(i,"scale",null);"number"==typeof s?e.setScale(s):null!==s&&(e.scaleX=r(s,"x",1),e.scaleY=r(s,"y",1));var o=r(i,"scrollFactor",null);"number"==typeof o?e.setScrollFactor(o):null!==o&&(e.scrollFactorX=r(o,"x",1),e.scrollFactorY=r(o,"y",1)),e.rotation=r(i,"rotation",0);var a=r(i,"angle",null);null!==a&&(e.angle=a),e.alpha=r(i,"alpha",1);var h=r(i,"origin",null);if("number"==typeof h)e.setOrigin(h);else if(null!==h){var u=r(h,"x",.5),l=r(h,"y",.5);e.setOrigin(u,l)}return e.blendMode=r(i,"blendMode",n.NORMAL),e.visible=r(i,"visible",!0),r(i,"add",!0)&&t.sys.displayList.add(e),e.preUpdate&&t.sys.updateList.add(e),e}},4777:(t,e,i)=>{var n=i(57687);t.exports=function(t,e){var i=n(e,"anims",null);if(null===i)return t;if("string"==typeof i)t.anims.play(i);else if("object"==typeof i){var r=t.anims,s=n(i,"key",void 0),o=n(i,"startFrame",void 0),a=n(i,"delay",0),h=n(i,"repeat",0),u=n(i,"repeatDelay",0),l=n(i,"yoyo",!1),c=n(i,"play",!1),d=n(i,"delayedPlay",0);r.setDelay(a),r.setRepeat(h),r.setRepeatDelay(u),r.setYoyo(l),c?r.play(s,o):d>0?r.delayedPlay(d,s,o):r.load(s)}return t}},28983:(t,e,i)=>{var n=i(47379),r=i(29365),s=i(50354),o=i(88637),a=i(59199),h=new n({Extends:r,initialize:function(t){r.call(this,t),this.sortChildrenFlag=!1,this.scene=t,this.systems=t.sys,t.sys.events.once(o.BOOT,this.boot,this),t.sys.events.on(o.START,this.start,this)},boot:function(){this.systems.events.once(o.DESTROY,this.destroy,this)},start:function(){this.systems.events.once(o.SHUTDOWN,this.shutdown,this)},queueDepthSort:function(){this.sortChildrenFlag=!0},depthSort:function(){this.sortChildrenFlag&&(a.inplace(this.list,this.sortByDepth),this.sortChildrenFlag=!1)},sortByDepth:function(t,e){return t._depth-e._depth},getChildren:function(){return this.list},shutdown:function(){for(var t=this.list.length;t--;)this.list[t].destroy(!0);this.list.length=0,this.systems.events.off(o.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.scene.sys.events.off(o.START,this.start,this),this.scene=null,this.systems=null}});s.register("DisplayList",h,"displayList"),t.exports=h},90554:(t,e,i)=>{var n=i(47379),r=i(82046),s=i(3881),o=i(17168),a=i(6783),h=new n({Extends:o,initialize:function(t,e){o.call(this),this.scene=t,this.type=e,this.state=0,this.parentContainer=null,this.name="",this.active=!0,this.tabIndex=-1,this.data=null,this.renderFlags=15,this.cameraFilter=0,this.input=null,this.body=null,this.ignoreDestroy=!1,t.sys.queueDepthSort()},setActive:function(t){return this.active=t,this},setName:function(t){return this.name=t,this},setState:function(t){return this.state=t,this},setDataEnabled:function(){return this.data||(this.data=new s(this)),this},setData:function(t,e){return this.data||(this.data=new s(this)),this.data.set(t,e),this},incData:function(t,e){return this.data||(this.data=new s(this)),this.data.inc(t,e),this},toggleData:function(t){return this.data||(this.data=new s(this)),this.data.toggle(t),this},getData:function(t){return this.data||(this.data=new s(this)),this.data.get(t)},setInteractive:function(t,e,i){return this.scene.sys.input.enable(this,t,e,i),this},disableInteractive:function(){return this.input&&(this.input.enabled=!1),this},removeInteractive:function(){return this.scene.sys.input.clear(this),this.input=void 0,this},update:function(){},toJSON:function(){return r(this)},willRender:function(t){return!(h.RENDER_MASK!==this.renderFlags||0!==this.cameraFilter&&this.cameraFilter&t.id)},getIndexList:function(){for(var t=this,e=this.parentContainer,i=[];e&&(i.unshift(e.getIndex(t)),t=e,e.parentContainer);)e=e.parentContainer;return i.unshift(this.scene.sys.displayList.getIndex(t)),i},destroy:function(t){if(void 0===t&&(t=!1),this.scene&&!this.ignoreDestroy){this.preDestroy&&this.preDestroy.call(this),this.emit(a.DESTROY,this);var e=this.scene.sys;t||(e.displayList.remove(this),e.updateList.remove(this)),this.input&&(e.input.clear(this),this.input=void 0),this.data&&(this.data.destroy(),this.data=void 0),this.body&&(this.body.destroy(),this.body=void 0),t||e.queueDepthSort(),this.active=!1,this.visible=!1,this.scene=void 0,this.parentContainer=void 0,this.removeAllListeners()}}});h.RENDER_MASK=15,t.exports=h},17517:(t,e,i)=>{var n=i(47379),r=i(50354),s=i(88637),o=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.displayList,this.updateList,t.sys.events.once(s.BOOT,this.boot,this),t.sys.events.on(s.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.systems.events.once(s.DESTROY,this.destroy,this)},start:function(){this.systems.events.once(s.SHUTDOWN,this.shutdown,this)},shutdown:function(){this.systems.events.off(s.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.scene.sys.events.off(s.START,this.start,this),this.scene=null,this.systems=null,this.displayList=null,this.updateList=null}});o.register=function(t,e){o.prototype.hasOwnProperty(t)||(o.prototype[t]=e)},o.remove=function(t){o.prototype.hasOwnProperty(t)&&delete o.prototype[t]},r.register("GameObjectCreator",o,"make"),t.exports=o},81342:(t,e,i)=>{var n=i(47379),r=i(50354),s=i(88637),o=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.displayList,this.updateList,t.sys.events.once(s.BOOT,this.boot,this),t.sys.events.on(s.START,this.start,this)},boot:function(){this.displayList=this.systems.displayList,this.updateList=this.systems.updateList,this.systems.events.once(s.DESTROY,this.destroy,this)},start:function(){this.systems.events.once(s.SHUTDOWN,this.shutdown,this)},existing:function(t){return(t.renderCanvas||t.renderWebGL)&&this.displayList.add(t),t.preUpdate&&this.updateList.add(t),t},shutdown:function(){this.systems.events.off(s.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.scene.sys.events.off(s.START,this.start,this),this.scene=null,this.systems=null,this.displayList=null,this.updateList=null}});o.register=function(t,e){o.prototype.hasOwnProperty(t)||(o.prototype[t]=e)},o.remove=function(t){o.prototype.hasOwnProperty(t)&&delete o.prototype[t]},r.register("GameObjectFactory",o,"add"),t.exports=o},61118:(t,e,i)=>{var n=i(47379),r=i(7674),s=i(50354),o=i(88637),a=new n({Extends:r,initialize:function(t){r.call(this),this.scene=t,this.systems=t.sys,t.sys.events.once(o.BOOT,this.boot,this),t.sys.events.on(o.START,this.start,this)},boot:function(){this.systems.events.once(o.DESTROY,this.destroy,this)},start:function(){var t=this.systems.events;t.on(o.PRE_UPDATE,this.update,this),t.on(o.UPDATE,this.sceneUpdate,this),t.once(o.SHUTDOWN,this.shutdown,this)},sceneUpdate:function(t,e){for(var i=this._active,n=i.length,r=0;r<n;r++){var s=i[r];s.active&&s.preUpdate.call(s,t,e)}},shutdown:function(){for(var t=this._active.length;t--;)this._active[t].destroy(!0);for(t=this._pending.length;t--;)this._pending[t].destroy(!0);for(t=this._destroy.length;t--;)this._destroy[t].destroy(!0);this._toProcess=0,this._pending=[],this._active=[],this._destroy=[],this.removeAllListeners();var e=this.systems.events;e.off(o.PRE_UPDATE,this.preUpdate,this),e.off(o.UPDATE,this.sceneUpdate,this),e.off(o.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.systems.events.off(o.START,this.start,this),this.scene=null,this.systems=null}});s.register("UpdateList",a,"updateList"),t.exports=a},79268:t=>{t.exports=function(t,e,i){if(void 0===i)return i={local:{x:0,y:0,width:0,height:0},global:{x:0,y:0,width:0,height:0},lines:{shortest:0,longest:0,lengths:null,height:0},wrappedText:"",words:[],scaleX:0,scaleY:0};var n,r,s,o,a=t.text,h=a.length,u=t.maxWidth,l=t.wordWrapCharCode,c=Number.MAX_VALUE,d=Number.MAX_VALUE,p=0,f=0,m=t.fontData.chars,v=t.fontData.lineHeight,g=t.letterSpacing,y=0,_=0,x=0,b=null,w=0,T=0,M=t.fontSize/t.fontData.size,S=M*t.scaleX,E=M*t.scaleY,L=null,A=0,D=[],P=Number.MAX_VALUE,C=0,O=0,k=0,R=[],I=null;if(u>0){for(n=0;n<h;n++)if(10!==(x=a.charCodeAt(n))){if(b=m[x]){if(null!==L)var Y=b.kerning[A];x===l?null!==I&&(R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E,cr:!1}),I=null):(null===I&&(I={word:"",i:n,x:y,y:_,w:0,h:v,cr:!1}),I.word=I.word.concat(a[n]),I.w+=b.xOffset+b.xAdvance+(void 0!==Y?Y:0)),y+=b.xAdvance+g,L=b,A=x}}else null!==I&&(R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E,cr:!0}),I=null),y=0,_+=v,L=null;var F;null!==I&&R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E,cr:!1}),y=0,_=0,L=null,A=0;var N=0,B=[];for(n=0;n<R.length;n++){var U=R[n],j=U.x,H=U.x+U.w;if(F)N=j-(j-(F.x+F.w)+F.w),F=null;j-N>u||H-N>u?(B.push(U.i-1),U.cr?(B.push(U.i+U.word.length),N=0,F=null):F=U):U.cr&&(B.push(U.i+U.word.length),N=0,F=null)}for(n=B.length-1;n>=0;n--)r=a,s=B[n],o="\n",a=r.substr(0,s)+o+r.substr(s+1);i.wrappedText=a,h=a.length,R=[],I=null}for(n=0;n<h;n++)if(10!==(x=a.charCodeAt(n))){if(b=m[x]){if(w=y,T=_,null!==L){var z=b.kerning[A];w+=void 0!==z?z:0}c>w&&(c=w),d>T&&(d=T);var W=w+b.xAdvance,G=T+v;p<W&&(p=W),f<G&&(f=G),x===l?null!==I&&(R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E}),I=null):(null===I&&(I={word:"",i:n,x:y,y:_,w:0,h:v}),I.word=I.word.concat(a[n]),I.w+=b.xOffset+b.xAdvance+(void 0!==z?z:0)),y+=b.xAdvance+g,L=b,A=x,k=W*M}}else null!==I&&(R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E}),I=null),y=0,_+=v,L=null,D[O]=k,k>C&&(C=k),k<P&&(P=k),O++,k=0;null!==I&&R.push({word:I.word,i:I.i,x:I.x*S,y:I.y*E,w:I.w*S,h:I.h*E}),D[O]=k,k>C&&(C=k),k<P&&(P=k);var V=i.local,X=i.global,q=i.lines;return V.x=c*M,V.y=d*M,V.width=p*M,V.height=f*M,X.x=t.x-t.displayOriginX+c*S,X.y=t.y-t.displayOriginY+d*E,X.width=p*S,X.height=f*E,q.shortest=P,q.longest=C,q.lengths=D,e&&(V.x=Math.round(V.x),V.y=Math.round(V.y),V.width=Math.round(V.width),V.height=Math.round(V.height),X.x=Math.round(X.x),X.y=Math.round(X.y),X.width=Math.round(X.width),X.height=Math.round(X.height),q.shortest=Math.round(P),q.longest=Math.round(C)),i.words=R,i.lines.height=v,i.scaleX=t.scaleX,i.scaleY=t.scaleY,i}},82849:(t,e,i)=>{var n=i(40419);t.exports=function(t,e,i,r,s,o,a){var h=t.sys.textures.getFrame(i,r),u=t.sys.cache.xml.get(s);if(h&&u){var l=n(u,o,a,h);return t.sys.cache.bitmapFont.add(e,{data:l,texture:i,frame:r}),!0}return!1}},41414:(t,e,i)=>{var n=i(86652);t.exports=function(t,e){var i=e.width,r=e.height,s=Math.floor(i/2),o=Math.floor(r/2),a=n(e,"chars","");if(""!==a){var h=n(e,"image",""),u=n(e,"offset.x",0),l=n(e,"offset.y",0),c=n(e,"spacing.x",0),d=n(e,"spacing.y",0),p=n(e,"lineSpacing",0),f=n(e,"charsPerRow",null);null===f&&(f=t.sys.textures.getFrame(h).width/i)>a.length&&(f=a.length);for(var m=u,v=l,g={retroFont:!0,font:h,size:i,lineHeight:r+p,chars:{}},y=0,_=0;_<a.length;_++){var x=a.charCodeAt(_);g.chars[x]={x:m,y:v,width:i,height:r,centerX:s,centerY:o,xOffset:0,yOffset:0,xAdvance:i,data:{},kerning:{}},++y===f?(y=0,m=u,v+=r+d):m+=i+c}return{data:g,frame:null,texture:h}}}},40419:t=>{function e(t,e){return parseInt(t.getAttribute(e),10)}t.exports=function(t,i,n,r){void 0===i&&(i=0),void 0===n&&(n=0);var s={},o=t.getElementsByTagName("info")[0],a=t.getElementsByTagName("common")[0];s.font=o.getAttribute("face"),s.size=e(o,"size"),s.lineHeight=e(a,"lineHeight")+n,s.chars={};var h=t.getElementsByTagName("char"),u=void 0!==r&&r.trimmed;if(u)var l=r.height,c=r.width;for(var d=0;d<h.length;d++){var p=h[d],f=e(p,"id"),m=e(p,"x"),v=e(p,"y"),g=e(p,"width"),y=e(p,"height");u&&(m<c&&(c=m),v<l&&(l=v)),s.chars[f]={x:m,y:v,width:g,height:y,centerX:Math.floor(g/2),centerY:Math.floor(y/2),xOffset:e(p,"xoffset"),yOffset:e(p,"yoffset"),xAdvance:e(p,"xadvance")+i,data:{},kerning:{}}}if(u&&0!==l&&0!==c)for(var _ in s.chars){var x=s.chars[_];x.x-=r.x,x.y-=r.y}var b=t.getElementsByTagName("kerning");for(d=0;d<b.length;d++){var w=b[d],T=e(w,"first"),M=e(w,"second"),S=e(w,"amount");s.chars[M].kerning[T]=S}return s}},89193:(t,e,i)=>{var n=i(44808),r=i(80933),s={Parse:i(41414)};s=r(!1,s,n),t.exports=s},44808:t=>{t.exports={TEXT_SET1:" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",TEXT_SET2:" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET3:"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ",TEXT_SET4:"ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789",TEXT_SET5:"ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789",TEXT_SET6:"ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789\"(),-.' ",TEXT_SET7:"AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW\")28FLRX-'39",TEXT_SET8:"0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET9:"ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'\"?!",TEXT_SET10:"ABCDEFGHIJKLMNOPQRSTUVWXYZ",TEXT_SET11:"ABCDEFGHIJKLMNOPQRSTUVWXYZ.,\"-+!?()':;0123456789"}},16175:(t,e,i)=>{var n=i(56956),r=i(47379),s=i(37444),o=new r({Extends:n,Mixins:[s],initialize:function(t,e,i,r,s,o,a){n.call(this,t,e,i,r,s,o,a),this.type="DynamicBitmapText",this.scrollX=0,this.scrollY=0,this.cropWidth=0,this.cropHeight=0,this.displayCallback,this.callbackData={parent:this,color:0,tint:{topLeft:0,topRight:0,bottomLeft:0,bottomRight:0},index:0,charCode:0,x:0,y:0,scale:0,rotation:0,data:0}},setSize:function(t,e){return this.cropWidth=t,this.cropHeight=e,this},setDisplayCallback:function(t){return this.displayCallback=t,this},setScrollX:function(t){return this.scrollX=t,this},setScrollY:function(t){return this.scrollY=t,this}});t.exports=o},94028:(t,e,i)=>{var n=i(55468);t.exports=function(t,e,i,r,s){var o=e._text,a=o.length,h=t.currentContext;if(0!==a&&n(t,h,e,r,s)){var u=e.frame,l=e.displayCallback,c=e.callbackData,d=e.fontData.chars,p=e.fontData.lineHeight,f=e._letterSpacing,m=0,v=0,g=0,y=null,_=0,x=0,b=0,w=0,T=0,M=0,S=null,E=0,L=e.frame.source.image,A=u.cutX,D=u.cutY,P=0,C=0,O=e._fontSize/e.fontData.size,k=e._align,R=0,I=0;e.getTextBounds(!1);var Y=e._bounds.lines;1===k?I=(Y.longest-Y.lengths[0])/2:2===k&&(I=Y.longest-Y.lengths[0]),h.translate(-e.displayOriginX,-e.displayOriginY);var F=r.roundPixels;e.cropWidth>0&&e.cropHeight>0&&(h.beginPath(),h.rect(0,0,e.cropWidth,e.cropHeight),h.clip());for(var N=0;N<a;N++)if(C=O,P=0,10!==(g=o.charCodeAt(N))){if(y=d[g]){if(_=A+y.x,x=D+y.y,b=y.width,w=y.height,T=y.xOffset+m-e.scrollX,M=y.yOffset+v-e.scrollY,null!==S){var B=y.kerning[E];T+=void 0!==B?B:0}if(l){c.index=N,c.charCode=g,c.x=T,c.y=M,c.scale=C,c.rotation=P,c.data=y.data;var U=l(c);T=U.x,M=U.y,C=U.scale,P=U.rotation}T*=C,M*=C,T+=I,m+=y.xAdvance+f,S=y,E=g,0!==b&&0!==w&&32!==g&&(F&&(T=Math.round(T),M=Math.round(M)),h.save(),h.translate(T,M),h.rotate(P),h.scale(C,C),h.drawImage(L,_,x,b,w,0,0,b,w),h.restore())}}else R++,1===k?I=(Y.longest-Y.lengths[R])/2:2===k&&(I=Y.longest-Y.lengths[R]),m=0,v+=p,S=null;h.restore()}}},29036:(t,e,i)=>{var n=i(16175),r=i(74865),s=i(17517),o=i(57687);s.register("dynamicBitmapText",(function(t,e){void 0===t&&(t={});var i=o(t,"font",""),s=o(t,"text",""),a=o(t,"size",!1),h=new n(this.scene,0,0,i,s,a);return void 0!==e&&(t.add=e),r(this.scene,h,t),h}))},60094:(t,e,i)=>{var n=i(16175);i(81342).register("dynamicBitmapText",(function(t,e,i,r,s){return this.displayList.add(new n(this.scene,t,e,i,r,s))}))},37444:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(22896),r=i(94028),t.exports={renderWebGL:n,renderCanvas:r}},22896:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e.text,a=o.length;if(0!==a){var h=this.pipeline;t.setPipeline(h,e);var u=e.cropWidth>0||e.cropHeight>0;u&&(h.flush(),t.pushScissor(e.x,e.y,e.cropWidth*e.scaleX,e.cropHeight*e.scaleY));var l=h._tempMatrix1,c=h._tempMatrix2,d=h._tempMatrix3,p=h._tempMatrix4;c.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),l.copyFrom(r.matrix),s?(l.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),c.e=e.x,c.f=e.y,l.multiply(c,d)):(c.e-=r.scrollX*e.scrollFactorX,c.f-=r.scrollY*e.scrollFactorY,l.multiply(c,d));var f=e.frame,m=f.glTexture,v=f.cutX,g=f.cutY,y=m.width,_=m.height,x=e._isTinted&&e.tintFill,b=n.getTintAppendFloatAlpha(e._tintTL,r.alpha*e._alphaTL),w=n.getTintAppendFloatAlpha(e._tintTR,r.alpha*e._alphaTR),T=n.getTintAppendFloatAlpha(e._tintBL,r.alpha*e._alphaBL),M=n.getTintAppendFloatAlpha(e._tintBR,r.alpha*e._alphaBR);h.setTexture2D(m,0);var S,E,L=0,A=0,D=0,P=0,C=e.letterSpacing,O=0,k=0,R=0,I=0,Y=e.scrollX,F=e.scrollY,N=e.fontData,B=N.chars,U=N.lineHeight,j=e.fontSize/N.size,H=0,z=e._align,W=0,G=0;e.getTextBounds(!1);var V=e._bounds.lines;1===z?G=(V.longest-V.lengths[0])/2:2===z&&(G=V.longest-V.lengths[0]);for(var X=r.roundPixels,q=e.displayCallback,J=e.callbackData,Z=0;Z<a;Z++)if(10!==(D=o.charCodeAt(Z))){if(S=B[D]){O=v+S.x,k=g+S.y,R=S.width,I=S.height;var K=S.xOffset+L-Y,Q=S.yOffset+A-F;if(null!==E){var $=S.kerning[P];K+=void 0!==$?$:0}if(L+=S.xAdvance+C,E=S,P=D,0!==R&&0!==I&&32!==D){if(j=e.fontSize/e.fontData.size,H=0,q){J.color=0,J.tint.topLeft=b,J.tint.topRight=w,J.tint.bottomLeft=T,J.tint.bottomRight=M,J.index=Z,J.charCode=D,J.x=K,J.y=Q,J.scale=j,J.rotation=H,J.data=S.data;var tt=q(J);K=tt.x,Q=tt.y,j=tt.scale,H=tt.rotation,tt.color?(b=tt.color,w=tt.color,T=tt.color,M=tt.color):(b=tt.tint.topLeft,w=tt.tint.topRight,T=tt.tint.bottomLeft,M=tt.tint.bottomRight),b=n.getTintAppendFloatAlpha(b,r.alpha*e._alphaTL),w=n.getTintAppendFloatAlpha(w,r.alpha*e._alphaTR),T=n.getTintAppendFloatAlpha(T,r.alpha*e._alphaBL),M=n.getTintAppendFloatAlpha(M,r.alpha*e._alphaBR)}K*=j,Q*=j,K-=e.displayOriginX,Q-=e.displayOriginY,K+=G,p.applyITRS(K,Q,H,j,j),d.multiply(p,c);var et=O/y,it=k/_,nt=(O+R)/y,rt=(k+I)/_,st=R,ot=I,at=c.e,ht=c.f,ut=ot*c.c+c.e,lt=ot*c.d+c.f,ct=st*c.a+ot*c.c+c.e,dt=st*c.b+ot*c.d+c.f,pt=st*c.a+c.e,ft=st*c.b+c.f;X&&(at=Math.round(at),ht=Math.round(ht),ut=Math.round(ut),lt=Math.round(lt),ct=Math.round(ct),dt=Math.round(dt),pt=Math.round(pt),ft=Math.round(ft)),h.batchQuad(at,ht,ut,lt,ct,dt,pt,ft,et,it,nt,rt,b,w,T,M,x,m,0)}}}else W++,1===z?G=(V.longest-V.lengths[W])/2:2===z&&(G=V.longest-V.lengths[W]),L=0,A+=U,E=null;u&&(h.flush(),t.popScissor())}}},56956:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(79268),a=i(82849),h=i(40419),u=i(22749),l=new n({Extends:s,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.Mask,r.Origin,r.Pipeline,r.ScrollFactor,r.Texture,r.Tint,r.Transform,r.Visible,u],initialize:function(t,e,i,n,r,a,h){void 0===r&&(r=""),void 0===h&&(h=0),s.call(this,t,"BitmapText"),this.font=n;var u=this.scene.sys.cache.bitmapFont.get(n);this.fontData=u.data,this._text="",this._fontSize=a||this.fontData.size,this._letterSpacing=0,this._align=h,this._bounds=o(),this._dirty=!0,this._maxWidth=0,this.wordWrapCharCode=32,this.setTexture(u.texture,u.frame),this.setPosition(e,i),this.setOrigin(0,0),this.initPipeline(),this.setText(r)},setLeftAlign:function(){return this._align=l.ALIGN_LEFT,this._dirty=!0,this},setCenterAlign:function(){return this._align=l.ALIGN_CENTER,this._dirty=!0,this},setRightAlign:function(){return this._align=l.ALIGN_RIGHT,this._dirty=!0,this},setFontSize:function(t){return this._fontSize=t,this._dirty=!0,this},setLetterSpacing:function(t){return void 0===t&&(t=0),this._letterSpacing=t,this._dirty=!0,this},setText:function(t){return t||0===t||(t=""),Array.isArray(t)&&(t=t.join("\n")),t!==this.text&&(this._text=t.toString(),this._dirty=!0,this.updateDisplayOrigin()),this},getTextBounds:function(t){var e=this._bounds;return(this._dirty||this.scaleX!==e.scaleX||this.scaleY!==e.scaleY)&&(o(this,t,e),this._dirty=!1,this.updateDisplayOrigin()),e},setFont:function(t,e,i){if(void 0===e&&(e=this._fontSize),void 0===i&&(i=this._align),t!==this.font){var n=this.scene.sys.cache.bitmapFont.get(t);n&&(this.font=t,this.fontData=n.data,this._fontSize=e,this._align=i,this.setTexture(n.texture,n.frame),o(this,!1,this._bounds))}return this},setMaxWidth:function(t,e){return this._maxWidth=t,this._dirty=!0,void 0!==e&&(this.wordWrapCharCode=e),this},align:{set:function(t){this._align=t,this._dirty=!0},get:function(){return this._align}},text:{set:function(t){this.setText(t)},get:function(){return this._text}},fontSize:{set:function(t){this._fontSize=t,this._dirty=!0},get:function(){return this._fontSize}},letterSpacing:{set:function(t){this._letterSpacing=t,this._dirty=!0},get:function(){return this._letterSpacing}},maxWidth:{set:function(t){this._maxWidth=t,this._dirty=!0},get:function(){return this._maxWidth}},width:{get:function(){return this.getTextBounds(!1),this._bounds.global.width}},height:{get:function(){return this.getTextBounds(!1),this._bounds.global.height}},toJSON:function(){var t=r.ToJSON(this),e={font:this.font,text:this.text,fontSize:this.fontSize,letterSpacing:this.letterSpacing,align:this.align};return t.data=e,t}});l.ALIGN_LEFT=0,l.ALIGN_CENTER=1,l.ALIGN_RIGHT=2,l.ParseFromAtlas=a,l.ParseXMLBitmapFont=h,t.exports=l},5371:(t,e,i)=>{var n=i(55468);t.exports=function(t,e,i,r,s){var o=e._text,a=o.length,h=t.currentContext;if(0!==a&&n(t,h,e,r,s)){var u=e.frame,l=e.fontData.chars,c=e.fontData.lineHeight,d=e._letterSpacing,p=0,f=0,m=0,v=null,g=0,y=0,_=0,x=0,b=0,w=0,T=null,M=0,S=e.frame.source.image,E=u.cutX,L=u.cutY,A=e._fontSize/e.fontData.size,D=e._align,P=0,C=0,O=e.getTextBounds(!1);e.maxWidth>0&&(a=(o=O.wrappedText).length);var k=e._bounds.lines;1===D?C=(k.longest-k.lengths[0])/2:2===D&&(C=k.longest-k.lengths[0]),h.translate(-e.displayOriginX,-e.displayOriginY);for(var R=r.roundPixels,I=0;I<a;I++)if(10!==(m=o.charCodeAt(I))){if(v=l[m]){if(g=E+v.x,y=L+v.y,_=v.width,x=v.height,b=v.xOffset+p,w=v.yOffset+f,null!==T){var Y=v.kerning[M];b+=void 0!==Y?Y:0}b*=A,w*=A,b+=C,p+=v.xAdvance+d,T=v,M=m,0!==_&&0!==x&&32!==m&&(R&&(b=Math.round(b),w=Math.round(w)),h.save(),h.translate(b,w),h.scale(A,A),h.drawImage(S,g,y,_,x,0,0,_,x),h.restore())}}else P++,1===D?C=(k.longest-k.lengths[P])/2:2===D&&(C=k.longest-k.lengths[P]),p=0,f+=c,T=null;h.restore()}}},21296:(t,e,i)=>{var n=i(56956),r=i(74865),s=i(17517),o=i(57687),a=i(86652);s.register("bitmapText",(function(t,e){void 0===t&&(t={});var i=a(t,"font",""),s=o(t,"text",""),h=o(t,"size",!1),u=a(t,"align",0),l=new n(this.scene,0,0,i,s,h,u);return void 0!==e&&(t.add=e),r(this.scene,l,t),l}))},41547:(t,e,i)=>{var n=i(56956);i(81342).register("bitmapText",(function(t,e,i,r,s,o){return this.displayList.add(new n(this.scene,t,e,i,r,s,o))}))},22749:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(47801),r=i(5371),t.exports={renderWebGL:n,renderCanvas:r}},47801:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e._text,a=o.length;if(0!==a){var h=this.pipeline;t.setPipeline(h,e);var u=h._tempMatrix1,l=h._tempMatrix2,c=h._tempMatrix3;l.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),u.copyFrom(r.matrix),s?(u.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),l.e=e.x,l.f=e.y,u.multiply(l,c)):(l.e-=r.scrollX*e.scrollFactorX,l.f-=r.scrollY*e.scrollFactorY,u.multiply(l,c));var d=e.frame,p=d.glTexture,f=d.cutX,m=d.cutY,v=p.width,g=p.height,y=e._isTinted&&e.tintFill,_=n.getTintAppendFloatAlpha(e._tintTL,r.alpha*e._alphaTL),x=n.getTintAppendFloatAlpha(e._tintTR,r.alpha*e._alphaTR),b=n.getTintAppendFloatAlpha(e._tintBL,r.alpha*e._alphaBL),w=n.getTintAppendFloatAlpha(e._tintBR,r.alpha*e._alphaBR);h.setTexture2D(p,0);var T,M,S=0,E=0,L=0,A=0,D=e._letterSpacing,P=0,C=0,O=0,k=0,R=e.fontData,I=R.chars,Y=R.lineHeight,F=e._fontSize/R.size,N=e._align,B=0,U=0,j=e.getTextBounds(!1);e.maxWidth>0&&(a=(o=j.wrappedText).length);var H=e._bounds.lines;1===N?U=(H.longest-H.lengths[0])/2:2===N&&(U=H.longest-H.lengths[0]);for(var z=r.roundPixels,W=0;W<a;W++)if(10!==(L=o.charCodeAt(W))){if(T=I[L]){P=f+T.x,C=m+T.y,O=T.width,k=T.height;var G=T.xOffset+S,V=T.yOffset+E;if(null!==M){var X=T.kerning[A];G+=void 0!==X?X:0}if(S+=T.xAdvance+D,M=T,A=L,0!==O&&0!==k&&32!==L){G*=F,V*=F,G-=e.displayOriginX;var q=P/v,J=C/g,Z=(P+O)/v,K=(C+k)/g,Q=(G+=U)+O*F,$=(V-=e.displayOriginY)+k*F,tt=c.getX(G,V),et=c.getY(G,V),it=c.getX(G,$),nt=c.getY(G,$),rt=c.getX(Q,$),st=c.getY(Q,$),ot=c.getX(Q,V),at=c.getY(Q,V);z&&(tt=Math.round(tt),et=Math.round(et),it=Math.round(it),nt=Math.round(nt),rt=Math.round(rt),st=Math.round(st),ot=Math.round(ot),at=Math.round(at)),h.batchQuad(tt,et,it,nt,rt,st,ot,at,q,J,Z,K,_,x,b,w,y,p,0)}}}else B++,1===N?U=(H.longest-H.lengths[B])/2:2===N&&(U=H.longest-H.lengths[B]),S=0,E+=Y,M=null}}},92139:(t,e,i)=>{var n=i(4953),r=i(90051),s=i(47379),o=i(23096),a=i(48165),h=i(90554),u=i(29365),l=new s({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.Depth,o.Mask,o.Pipeline,o.ScrollFactor,o.Size,o.Texture,o.Transform,o.Visible,n],initialize:function(t,e,i,n,r){h.call(this,t,"Blitter"),this.setTexture(n,r),this.setPosition(e,i),this.initPipeline(),this.children=new u,this.renderList=[],this.dirty=!1},create:function(t,e,i,n,s){void 0===n&&(n=!0),void 0===s&&(s=this.children.length),void 0===i?i=this.frame:i instanceof a||(i=this.texture.get(i));var o=new r(this,t,e,i,n);return this.children.addAt(o,s,!1),this.dirty=!0,o},createFromCallback:function(t,e,i,n){for(var r=this.createMultiple(e,i,n),s=0;s<r.length;s++){var o=r[s];t.call(this,o,s)}return r},createMultiple:function(t,e,i){void 0===e&&(e=this.frame.name),void 0===i&&(i=!0),Array.isArray(e)||(e=[e]);var n=[],r=this;return e.forEach((function(e){for(var s=0;s<t;s++)n.push(r.create(0,0,e,i))})),n},childCanRender:function(t){return t.visible&&t.alpha>0},getRenderList:function(){return this.dirty&&(this.renderList=this.children.list.filter(this.childCanRender,this),this.dirty=!1),this.renderList},clear:function(){this.children.removeAll(),this.dirty=!0},preDestroy:function(){this.children.destroy(),this.renderList=[]}});t.exports=l},91946:t=>{t.exports=function(t,e,i,n,r){var s=e.getRenderList();if(0!==s.length){var o=t.currentContext,a=n.alpha*e.alpha;if(0!==a){o.globalCompositeOperation=t.blendModes[e.blendMode],o.imageSmoothingEnabled=!(!t.antialias||e.frame.source.scaleMode);var h=e.x-n.scrollX*e.scrollFactorX,u=e.y-n.scrollY*e.scrollFactorY;o.save(),r&&r.copyToContext(o);for(var l=n.roundPixels,c=0;c<s.length;c++){var d=s[c],p=d.flipX||d.flipY,f=d.frame,m=f.canvasData,v=f.x,g=f.y,y=1,_=1,x=d.alpha*a;0!==x&&(o.globalAlpha=x,p?(d.flipX&&(y=-1,v-=m.width),d.flipY&&(_=-1,g-=m.height),o.save(),o.translate(d.x+h,d.y+u),o.scale(y,_),o.drawImage(f.source.image,m.x,m.y,m.width,m.height,v,g,m.width,m.height),o.restore()):(l&&(v=Math.round(v),g=Math.round(g)),o.drawImage(f.source.image,m.x,m.y,m.width,m.height,v+d.x+h,g+d.y+u,m.width,m.height)))}o.restore()}}}},53674:(t,e,i)=>{var n=i(92139),r=i(74865),s=i(17517),o=i(57687);s.register("blitter",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),s=o(t,"frame",null),a=new n(this.scene,0,0,i,s);return void 0!==e&&(t.add=e),r(this.scene,a,t),a}))},306:(t,e,i)=>{var n=i(92139);i(81342).register("blitter",(function(t,e,i,r){return this.displayList.add(new n(this.scene,t,e,i,r))}))},4953:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(87635),r=i(91946),t.exports={renderWebGL:n,renderCanvas:r}},87635:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e.getRenderList();if(0!==o.length){var a=this.pipeline;t.setPipeline(a,e);var h=r.scrollX*e.scrollFactorX,u=r.scrollY*e.scrollFactorY,l=a._tempMatrix1;l.copyFrom(r.matrix),s&&(l.multiplyWithOffset(s,-h,-u),h=0,u=0);for(var c=e.x-h,d=e.y-u,p=-1,f=r.alpha*e.alpha,m=r.roundPixels,v=0;v<o.length;v++){var g=o[v],y=g.frame,_=g.alpha*f;if(0!==_){var x=y.width,b=y.height,w=c+g.x+y.x,T=d+g.y+y.y;g.flipX&&(x*=-1,w+=y.width),g.flipY&&(b*=-1,T+=y.height);var M=w+x,S=T+b,E=l.getX(w,T),L=l.getY(w,T),A=l.getX(M,S),D=l.getY(M,S),P=n.getTintAppendFloatAlpha(g.tint,_);y.sourceIndex!==p&&(a.setTexture2D(y.glTexture,0),p=y.sourceIndex),m&&(E=Math.round(E),L=Math.round(L),A=Math.round(A),D=Math.round(D)),a.batchQuad(E,L,E,D,A,D,A,L,y.u0,y.v0,y.u1,y.v1,P,P,P,P,false,y.glTexture,0)&&(p=-1)}}}}},90051:(t,e,i)=>{var n=i(47379),r=i(48165),s=new n({initialize:function(t,e,i,n,r){this.parent=t,this.x=e,this.y=i,this.frame=n,this.data={},this.tint=16777215,this._visible=r,this._alpha=1,this.flipX=!1,this.flipY=!1},setFrame:function(t){return void 0===t?this.frame=this.parent.frame:t instanceof r&&t.texture===this.parent.texture?this.frame=t:this.frame=this.parent.texture.get(t),this},resetFlip:function(){return this.flipX=!1,this.flipY=!1,this},reset:function(t,e,i){return this.x=t,this.y=e,this.flipX=!1,this.flipY=!1,this._alpha=1,this._visible=!0,this.parent.dirty=!0,i&&this.setFrame(i),this},setPosition:function(t,e){return this.x=t,this.y=e,this},setFlipX:function(t){return this.flipX=t,this},setFlipY:function(t){return this.flipY=t,this},setFlip:function(t,e){return this.flipX=t,this.flipY=e,this},setVisible:function(t){return this.visible=t,this},setAlpha:function(t){return this.alpha=t,this},setTint:function(t){return this.tint=t,this},destroy:function(){this.parent.dirty=!0,this.parent.children.remove(this),this.parent=void 0,this.frame=void 0,this.data=void 0},visible:{get:function(){return this._visible},set:function(t){this.parent.dirty|=this._visible!==t,this._visible=t}},alpha:{get:function(){return this._alpha},set:function(t){this.parent.dirty|=this._alpha>0!=t>0,this._alpha=t}}});t.exports=s},55957:(t,e,i)=>{var n=i(90487),r={_alpha:1,_alphaTL:1,_alphaTR:1,_alphaBL:1,_alphaBR:1,clearAlpha:function(){return this.setAlpha(1)},setAlpha:function(t,e,i,r){return void 0===t&&(t=1),void 0===e?this.alpha=t:(this._alphaTL=n(t,0,1),this._alphaTR=n(e,0,1),this._alphaBL=n(i,0,1),this._alphaBR=n(r,0,1)),this},alpha:{get:function(){return this._alpha},set:function(t){var e=n(t,0,1);this._alpha=e,this._alphaTL=e,this._alphaTR=e,this._alphaBL=e,this._alphaBR=e,0===e?this.renderFlags&=-3:this.renderFlags|=2}},alphaTopLeft:{get:function(){return this._alphaTL},set:function(t){var e=n(t,0,1);this._alphaTL=e,0!==e&&(this.renderFlags|=2)}},alphaTopRight:{get:function(){return this._alphaTR},set:function(t){var e=n(t,0,1);this._alphaTR=e,0!==e&&(this.renderFlags|=2)}},alphaBottomLeft:{get:function(){return this._alphaBL},set:function(t){var e=n(t,0,1);this._alphaBL=e,0!==e&&(this.renderFlags|=2)}},alphaBottomRight:{get:function(){return this._alphaBR},set:function(t){var e=n(t,0,1);this._alphaBR=e,0!==e&&(this.renderFlags|=2)}}};t.exports=r},34613:(t,e,i)=>{var n=i(90487),r={_alpha:1,clearAlpha:function(){return this.setAlpha(1)},setAlpha:function(t){return void 0===t&&(t=1),this.alpha=t,this},alpha:{get:function(){return this._alpha},set:function(t){var e=n(t,0,1);this._alpha=e,0===e?this.renderFlags&=-3:this.renderFlags|=2}}};t.exports=r},23765:(t,e,i)=>{var n=i(78010),r=i(47379),s=i(31045),o=new r({initialize:function(t){this.parent=t,this.animationManager=t.scene.sys.anims,this.animationManager.once(s.REMOVE_ANIMATION,this.remove,this),this.isPlaying=!1,this.currentAnim=null,this.currentFrame=null,this.nextAnim=null,this._timeScale=1,this.frameRate=0,this.duration=0,this.msPerFrame=0,this.skipMissedFrames=!0,this._delay=0,this._repeat=0,this._repeatDelay=0,this._yoyo=!1,this.forward=!0,this._reverse=!1,this.accumulator=0,this.nextTick=0,this.repeatCounter=0,this.pendingRepeat=!1,this._paused=!1,this._wasPlaying=!1,this._pendingStop=0,this._pendingStopValue},chain:function(t){return t instanceof n&&(t=t.key),this.nextAnim=t,this.parent},setDelay:function(t){return void 0===t&&(t=0),this._delay=t,this.parent},getDelay:function(){return this._delay},delayedPlay:function(t,e,i){return this.play(e,!0,i),this.nextTick+=t,this.parent},getCurrentKey:function(){if(this.currentAnim)return this.currentAnim.key},load:function(t,e){return void 0===e&&(e=0),this.isPlaying&&this.stop(),this.animationManager.load(this,t,e),this.parent},pause:function(t){return this._paused||(this._paused=!0,this._wasPlaying=this.isPlaying,this.isPlaying=!1),void 0!==t&&this.updateFrame(t),this.parent},resume:function(t){return this._paused&&(this._paused=!1,this.isPlaying=this._wasPlaying),void 0!==t&&this.updateFrame(t),this.parent},isPaused:{get:function(){return this._paused}},play:function(t,e,i){return void 0===e&&(e=!1),void 0===i&&(i=0),t instanceof n&&(t=t.key),e&&this.isPlaying&&this.currentAnim.key===t?this.parent:(this.forward=!0,this._reverse=!1,this._paused=!1,this._wasPlaying=!0,this._startAnimation(t,i))},playReverse:function(t,e,i){return void 0===e&&(e=!1),void 0===i&&(i=0),t instanceof n&&(t=t.key),e&&this.isPlaying&&this.currentAnim.key===t?this.parent:(this.forward=!1,this._reverse=!0,this._startAnimation(t,i))},_startAnimation:function(t,e){this.load(t,e);var i=this.currentAnim,n=this.parent;if(!i)return n;this.repeatCounter=-1===this._repeat?Number.MAX_VALUE:this._repeat,i.getFirstTick(this),this.isPlaying=!0,this.pendingRepeat=!1,i.showOnStart&&(n.visible=!0);var r=this.currentFrame;return i.emit(s.ANIMATION_START,i,r,n),n.emit(s.SPRITE_ANIMATION_KEY_START+t,i,r,n),n.emit(s.SPRITE_ANIMATION_START,i,r,n),n},reverse:function(){return this.isPlaying&&(this._reverse=!this._reverse,this.forward=!this.forward),this.parent},getProgress:function(){var t=this.currentFrame.progress;return this.forward||(t=1-t),t},setProgress:function(t){return this.forward||(t=1-t),this.setCurrentFrame(this.currentAnim.getFrameByProgress(t)),this.parent},remove:function(t,e){void 0===e&&(e=this.currentAnim),this.isPlaying&&e.key===this.currentAnim.key&&(this.stop(),this.setCurrentFrame(this.currentAnim.frames[0]))},getRepeat:function(){return this._repeat},setRepeat:function(t){return this._repeat=t,this.repeatCounter=-1===t?Number.MAX_VALUE:t,this.parent},getRepeatDelay:function(){return this._repeatDelay},setRepeatDelay:function(t){return this._repeatDelay=t,this.parent},restart:function(t){void 0===t&&(t=!1);var e=this.currentAnim;e.getFirstTick(this,t),this.forward=!0,this.isPlaying=!0,this.pendingRepeat=!1,this._paused=!1,this.updateFrame(e.frames[0]);var i=this.parent,n=this.currentFrame;return e.emit(s.ANIMATION_RESTART,e,n,i),i.emit(s.SPRITE_ANIMATION_KEY_RESTART+e.key,e,n,i),i.emit(s.SPRITE_ANIMATION_RESTART,e,n,i),this.parent},stop:function(){this._pendingStop=0,this.isPlaying=!1;var t=this.parent,e=this.currentAnim,i=this.currentFrame;if(e&&(e.emit(s.ANIMATION_COMPLETE,e,i,t),t.emit(s.SPRITE_ANIMATION_KEY_COMPLETE+e.key,e,i,t),t.emit(s.SPRITE_ANIMATION_COMPLETE,e,i,t)),this.nextAnim){var n=this.nextAnim;this.nextAnim=null,this.play(n)}return t},stopAfterDelay:function(t){return this._pendingStop=1,this._pendingStopValue=t,this.parent},stopOnRepeat:function(){return this._pendingStop=2,this.parent},stopOnFrame:function(t){return this._pendingStop=3,this._pendingStopValue=t,this.parent},setTimeScale:function(t){return void 0===t&&(t=1),this._timeScale=t,this.parent},getTimeScale:function(){return this._timeScale},getTotalFrames:function(){return this.currentAnim.frames.length},update:function(t,e){if(this.currentAnim&&this.isPlaying&&!this.currentAnim.paused){if(this.accumulator+=e*this._timeScale,1===this._pendingStop&&(this._pendingStopValue-=e,this._pendingStopValue<=0))return this.currentAnim.completeAnimation(this);this.accumulator>=this.nextTick&&this.currentAnim.setFrame(this)}},setCurrentFrame:function(t){var e=this.parent;return this.currentFrame=t,e.texture=t.frame.texture,e.frame=t.frame,e.isCropped&&e.frame.updateCropUVs(e._crop,e.flipX,e.flipY),e.setSizeToFrame(),e._originComponent&&(t.frame.customPivot?e.setOrigin(t.frame.pivotX,t.frame.pivotY):e.updateDisplayOrigin()),e},updateFrame:function(t){var e=this.setCurrentFrame(t);if(this.isPlaying){t.setAlpha&&(e.alpha=t.alpha);var i=this.currentAnim;e.emit(s.SPRITE_ANIMATION_KEY_UPDATE+i.key,i,t,e),e.emit(s.SPRITE_ANIMATION_UPDATE,i,t,e),3===this._pendingStop&&this._pendingStopValue===t&&this.currentAnim.completeAnimation(this)}},nextFrame:function(){return this.currentAnim&&this.currentAnim.nextFrame(this),this.parent},previousFrame:function(){return this.currentAnim&&this.currentAnim.previousFrame(this),this.parent},setYoyo:function(t){return void 0===t&&(t=!1),this._yoyo=t,this.parent},getYoyo:function(){return this._yoyo},destroy:function(){this.animationManager.off(s.REMOVE_ANIMATION,this.remove,this),this.animationManager=null,this.parent=null,this.currentAnim=null,this.currentFrame=null}});t.exports=o},64379:(t,e,i)=>{var n=i(35869),r={_blendMode:n.NORMAL,blendMode:{get:function(){return this._blendMode},set:function(t){"string"==typeof t&&(t=n[t]),(t|=0)>=-1&&(this._blendMode=t)}},setBlendMode:function(t){return this.blendMode=t,this}};t.exports=r},99144:t=>{t.exports={width:0,height:0,displayWidth:{get:function(){return this.scaleX*this.width},set:function(t){this.scaleX=t/this.width}},displayHeight:{get:function(){return this.scaleY*this.height},set:function(t){this.scaleY=t/this.height}},setSize:function(t,e){return this.width=t,this.height=e,this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this}}},84890:t=>{var e={texture:null,frame:null,isCropped:!1,setCrop:function(t,e,i,n){if(void 0===t)this.isCropped=!1;else if(this.frame){if("number"==typeof t)this.frame.setCropUVs(this._crop,t,e,i,n,this.flipX,this.flipY);else{var r=t;this.frame.setCropUVs(this._crop,r.x,r.y,r.width,r.height,this.flipX,this.flipY)}this.isCropped=!0}return this},resetCropObject:function(){return{u0:0,v0:0,u1:0,v1:0,width:0,height:0,x:0,y:0,flipX:!1,flipY:!1,cx:0,cy:0,cw:0,ch:0}}};t.exports=e},56011:t=>{var e={_depth:0,depth:{get:function(){return this._depth},set:function(t){this.scene.sys.queueDepthSort(),this._depth=t}},setDepth:function(t){return void 0===t&&(t=0),this.depth=t,this}};t.exports=e},34042:t=>{t.exports={flipX:!1,flipY:!1,toggleFlipX:function(){return this.flipX=!this.flipX,this},toggleFlipY:function(){return this.flipY=!this.flipY,this},setFlipX:function(t){return this.flipX=t,this},setFlipY:function(t){return this.flipY=t,this},setFlip:function(t,e){return this.flipX=t,this.flipY=e,this},resetFlip:function(){return this.flipX=!1,this.flipY=!1,this}}},24584:(t,e,i)=>{var n=i(38092),r=i(36833),s=i(57148),o={prepareBoundsOutput:function(t,e){(void 0===e&&(e=!1),0!==this.rotation&&r(t,this.x,this.y,this.rotation),e&&this.parentContainer)&&this.parentContainer.getBoundsTransformMatrix().transformPoint(t.x,t.y,t);return t},getCenter:function(t){return void 0===t&&(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,t},getTopLeft:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getTopCenter:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getTopRight:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY,this.prepareBoundsOutput(t,e)},getLeftCenter:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,this.prepareBoundsOutput(t,e)},getRightCenter:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY+this.displayHeight/2,this.prepareBoundsOutput(t,e)},getBottomLeft:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBottomCenter:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth/2,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBottomRight:function(t,e){return t||(t=new s),t.x=this.x-this.displayWidth*this.originX+this.displayWidth,t.y=this.y-this.displayHeight*this.originY+this.displayHeight,this.prepareBoundsOutput(t,e)},getBounds:function(t){var e,i,r,s,o,a,h,u;if(void 0===t&&(t=new n),this.parentContainer){var l=this.parentContainer.getBoundsTransformMatrix();this.getTopLeft(t),l.transformPoint(t.x,t.y,t),e=t.x,i=t.y,this.getTopRight(t),l.transformPoint(t.x,t.y,t),r=t.x,s=t.y,this.getBottomLeft(t),l.transformPoint(t.x,t.y,t),o=t.x,a=t.y,this.getBottomRight(t),l.transformPoint(t.x,t.y,t),h=t.x,u=t.y}else this.getTopLeft(t),e=t.x,i=t.y,this.getTopRight(t),r=t.x,s=t.y,this.getBottomLeft(t),o=t.x,a=t.y,this.getBottomRight(t),h=t.x,u=t.y;return t.x=Math.min(e,r,o,h),t.y=Math.min(i,s,a,u),t.width=Math.max(e,r,o,h)-t.x,t.height=Math.max(i,s,a,u)-t.y,t}};t.exports=o},75878:(t,e,i)=>{var n=i(35615),r=i(48315),s={mask:null,setMask:function(t){return this.mask=t,this},clearMask:function(t){return void 0===t&&(t=!1),t&&this.mask&&this.mask.destroy(),this.mask=null,this},createBitmapMask:function(t){return void 0===t&&(this.texture||this.shader)&&(t=this),new n(this.scene,t)},createGeometryMask:function(t){return void 0===t&&"Graphics"===this.type&&(t=this),new r(this.scene,t)}};t.exports=s},27510:t=>{var e={_originComponent:!0,originX:.5,originY:.5,_displayOriginX:0,_displayOriginY:0,displayOriginX:{get:function(){return this._displayOriginX},set:function(t){this._displayOriginX=t,this.originX=t/this.width}},displayOriginY:{get:function(){return this._displayOriginY},set:function(t){this._displayOriginY=t,this.originY=t/this.height}},setOrigin:function(t,e){return void 0===t&&(t=.5),void 0===e&&(e=t),this.originX=t,this.originY=e,this.updateDisplayOrigin()},setOriginFromFrame:function(){return this.frame&&this.frame.customPivot?(this.originX=this.frame.pivotX,this.originY=this.frame.pivotY,this.updateDisplayOrigin()):this.setOrigin()},setDisplayOrigin:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.displayOriginX=t,this.displayOriginY=e,this},updateDisplayOrigin:function(){return this._displayOriginX=this.originX*this.width,this._displayOriginY=this.originY*this.height,this}};t.exports=e},72664:(t,e,i)=>{var n=i(98436),r=i(32336),s=i(86652),o=i(3926),a=i(57148),h={path:null,rotateToPath:!1,pathRotationOffset:0,pathOffset:null,pathVector:null,pathDelta:null,pathTween:null,pathConfig:null,_prevDirection:o.PLAYING_FORWARD,setPath:function(t,e){void 0===e&&(e=this.pathConfig);var i=this.pathTween;return i&&i.isPlaying()&&i.stop(),this.path=t,e&&this.startFollow(e),this},setRotateToPath:function(t,e){return void 0===e&&(e=0),this.rotateToPath=t,this.pathRotationOffset=e,this},isFollowing:function(){var t=this.pathTween;return t&&t.isPlaying()},startFollow:function(t,e){void 0===t&&(t={}),void 0===e&&(e=0);var i=this.pathTween;i&&i.isPlaying()&&i.stop(),"number"==typeof t&&(t={duration:t}),t.from=s(t,"from",0),t.to=s(t,"to",1);var h=r(t,"positionOnPath",!1);this.rotateToPath=r(t,"rotateToPath",!1),this.pathRotationOffset=s(t,"rotationOffset",0);var u=s(t,"startAt",e);if(u&&(t.onStart=function(t){var e=t.data[0];e.progress=u,e.elapsed=e.duration*u;var i=e.ease(e.progress);e.current=e.start+(e.end-e.start)*i,e.target[e.key]=e.current}),this.pathOffset||(this.pathOffset=new a(this.x,this.y)),this.pathVector||(this.pathVector=new a),this.pathDelta||(this.pathDelta=new a),this.pathDelta.reset(),this.pathTween=this.scene.sys.tweens.addCounter(t),this.path.getStartPoint(this.pathOffset),h&&(this.x=this.pathOffset.x,this.y=this.pathOffset.y),this.pathOffset.x=this.x-this.pathOffset.x,this.pathOffset.y=this.y-this.pathOffset.y,this._prevDirection=o.PLAYING_FORWARD,this.rotateToPath){var l=this.path.getPoint(.1);this.rotation=Math.atan2(l.y-this.y,l.x-this.x)+n(this.pathRotationOffset)}return this.pathConfig=t,this},pauseFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.pause(),this},resumeFollow:function(){var t=this.pathTween;return t&&t.isPaused()&&t.resume(),this},stopFollow:function(){var t=this.pathTween;return t&&t.isPlaying()&&t.stop(),this},pathUpdate:function(){var t=this.pathTween;if(t){var e=t.data[0],i=this.pathDelta,r=this.pathVector;if(i.copy(r).negate(),e.state===o.COMPLETE)return this.path.getPoint(1,r),i.add(r),r.add(this.pathOffset),void this.setPosition(r.x,r.y);if(e.state!==o.PLAYING_FORWARD&&e.state!==o.PLAYING_BACKWARD)return;this.path.getPoint(t.getValue(),r),i.add(r),r.add(this.pathOffset);var s=this.x,a=this.y;this.setPosition(r.x,r.y);var h=this.x-s,u=this.y-a;if(0===h&&0===u)return;if(e.state!==this._prevDirection)return void(this._prevDirection=e.state);this.rotateToPath&&(this.rotation=Math.atan2(u,h)+n(this.pathRotationOffset))}}};t.exports=h},76923:t=>{var e={defaultPipeline:null,pipeline:null,initPipeline:function(t){void 0===t&&(t="TextureTintPipeline");var e=this.scene.sys.game.renderer;return!!(e&&e.gl&&e.hasPipeline(t))&&(this.defaultPipeline=e.getPipeline(t),this.pipeline=this.defaultPipeline,!0)},setPipeline:function(t){var e=this.scene.sys.game.renderer;return e&&e.gl&&e.hasPipeline(t)&&(this.pipeline=e.getPipeline(t)),this},resetPipeline:function(){return this.pipeline=this.defaultPipeline,null!==this.pipeline},getPipelineName:function(){return this.pipeline.name}};t.exports=e},90099:t=>{var e={scrollFactorX:1,scrollFactorY:1,setScrollFactor:function(t,e){return void 0===e&&(e=t),this.scrollFactorX=t,this.scrollFactorY=e,this}};t.exports=e},20622:t=>{var e={_sizeComponent:!0,width:0,height:0,displayWidth:{get:function(){return Math.abs(this.scaleX*this.frame.realWidth)},set:function(t){this.scaleX=t/this.frame.realWidth}},displayHeight:{get:function(){return Math.abs(this.scaleY*this.frame.realHeight)},set:function(t){this.scaleY=t/this.frame.realHeight}},setSizeToFrame:function(t){return void 0===t&&(t=this.frame),this.width=t.realWidth,this.height=t.realHeight,this},setSize:function(t,e){return this.width=t,this.height=e,this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this}};t.exports=e},81822:t=>{var e={texture:null,frame:null,isCropped:!1,setTexture:function(t,e){return this.texture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!0),this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this._sizeComponent&&e&&this.setSizeToFrame(),this._originComponent&&i&&(this.frame.customPivot?this.setOrigin(this.frame.pivotX,this.frame.pivotY):this.updateDisplayOrigin()),this}};t.exports=e},24280:t=>{var e={texture:null,frame:null,isCropped:!1,setCrop:function(t,e,i,n){if(void 0===t)this.isCropped=!1;else if(this.frame){if("number"==typeof t)this.frame.setCropUVs(this._crop,t,e,i,n,this.flipX,this.flipY);else{var r=t;this.frame.setCropUVs(this._crop,r.x,r.y,r.width,r.height,this.flipX,this.flipY)}this.isCropped=!0}return this},setTexture:function(t,e){return this.texture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!0),this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this._sizeComponent&&e&&this.setSizeToFrame(),this._originComponent&&i&&(this.frame.customPivot?this.setOrigin(this.frame.pivotX,this.frame.pivotY):this.updateDisplayOrigin()),this.isCropped&&this.frame.updateCropUVs(this._crop,this.flipX,this.flipY),this},resetCropObject:function(){return{u0:0,v0:0,u1:0,v1:0,width:0,height:0,x:0,y:0,flipX:!1,flipY:!1,cx:0,cy:0,cw:0,ch:0}}};t.exports=e},97446:t=>{var e=function(t){return(t>>16)+(65280&t)+((255&t)<<16)},i={_tintTL:16777215,_tintTR:16777215,_tintBL:16777215,_tintBR:16777215,_isTinted:!1,tintFill:!1,clearTint:function(){return this.setTint(16777215),this._isTinted=!1,this},setTint:function(t,i,n,r){return void 0===t&&(t=16777215),void 0===i&&(i=t,n=t,r=t),this._tintTL=e(t),this._tintTR=e(i),this._tintBL=e(n),this._tintBR=e(r),this._isTinted=!0,this.tintFill=!1,this},setTintFill:function(t,e,i,n){return this.setTint(t,e,i,n),this.tintFill=!0,this},tintTopLeft:{get:function(){return this._tintTL},set:function(t){this._tintTL=e(t),this._isTinted=!0}},tintTopRight:{get:function(){return this._tintTR},set:function(t){this._tintTR=e(t),this._isTinted=!0}},tintBottomLeft:{get:function(){return this._tintBL},set:function(t){this._tintBL=e(t),this._isTinted=!0}},tintBottomRight:{get:function(){return this._tintBR},set:function(t){this._tintBR=e(t),this._isTinted=!0}},tint:{set:function(t){this.setTint(t,t,t,t)}},isTinted:{get:function(){return this._isTinted}}};t.exports=i},82046:t=>{t.exports=function(t){var e={name:t.name,type:t.type,x:t.x,y:t.y,depth:t.depth,scale:{x:t.scaleX,y:t.scaleY},origin:{x:t.originX,y:t.originY},flipX:t.flipX,flipY:t.flipY,rotation:t.rotation,alpha:t.alpha,visible:t.visible,blendMode:t.blendMode,textureKey:"",frameKey:"",data:{}};return t.texture&&(e.textureKey=t.texture.key,e.frameKey=t.frame.name),e}},7560:(t,e,i)=>{var n=i(14302),r=i(65492),s=i(23882),o=i(74771),a={_scaleX:1,_scaleY:1,_rotation:0,x:0,y:0,z:0,w:0,scale:{get:function(){return(this._scaleX+this._scaleY)/2},set:function(t){this._scaleX=t,this._scaleY=t,0===t?this.renderFlags&=-5:this.renderFlags|=4}},scaleX:{get:function(){return this._scaleX},set:function(t){this._scaleX=t,0===t?this.renderFlags&=-5:this.renderFlags|=4}},scaleY:{get:function(){return this._scaleY},set:function(t){this._scaleY=t,0===t?this.renderFlags&=-5:this.renderFlags|=4}},angle:{get:function(){return o(this._rotation*n.RAD_TO_DEG)},set:function(t){this.rotation=o(t)*n.DEG_TO_RAD}},rotation:{get:function(){return this._rotation},set:function(t){this._rotation=s(t)}},setPosition:function(t,e,i,n){return void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=0),void 0===n&&(n=0),this.x=t,this.y=e,this.z=i,this.w=n,this},setRandomPosition:function(t,e,i,n){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===n&&(n=this.scene.sys.scale.height),this.x=t+Math.random()*i,this.y=e+Math.random()*n,this},setRotation:function(t){return void 0===t&&(t=0),this.rotation=t,this},setAngle:function(t){return void 0===t&&(t=0),this.angle=t,this},setScale:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.scaleX=t,this.scaleY=e,this},setX:function(t){return void 0===t&&(t=0),this.x=t,this},setY:function(t){return void 0===t&&(t=0),this.y=t,this},setZ:function(t){return void 0===t&&(t=0),this.z=t,this},setW:function(t){return void 0===t&&(t=0),this.w=t,this},getLocalTransformMatrix:function(t){return void 0===t&&(t=new r),t.applyITRS(this.x,this.y,this._rotation,this._scaleX,this._scaleY)},getWorldTransformMatrix:function(t,e){void 0===t&&(t=new r),void 0===e&&(e=new r);var i=this.parentContainer;if(!i)return this.getLocalTransformMatrix(t);for(t.applyITRS(this.x,this.y,this._rotation,this._scaleX,this._scaleY);i;)e.applyITRS(i.x,i.y,i._rotation,i._scaleX,i._scaleY),e.multiply(t,t),i=i.parentContainer;return t},getParentRotation:function(){for(var t=0,e=this.parentContainer;e;)t+=e.rotation,e=e.parentContainer;return t}};t.exports=a},65492:(t,e,i)=>{var n=i(47379),r=i(14302),s=i(57148),o=new n({initialize:function(t,e,i,n,r,s){void 0===t&&(t=1),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=1),void 0===r&&(r=0),void 0===s&&(s=0),this.matrix=new Float32Array([t,e,i,n,r,s,0,0,1]),this.decomposedMatrix={translateX:0,translateY:0,scaleX:1,scaleY:1,rotation:0}},a:{get:function(){return this.matrix[0]},set:function(t){this.matrix[0]=t}},b:{get:function(){return this.matrix[1]},set:function(t){this.matrix[1]=t}},c:{get:function(){return this.matrix[2]},set:function(t){this.matrix[2]=t}},d:{get:function(){return this.matrix[3]},set:function(t){this.matrix[3]=t}},e:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},f:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},tx:{get:function(){return this.matrix[4]},set:function(t){this.matrix[4]=t}},ty:{get:function(){return this.matrix[5]},set:function(t){this.matrix[5]=t}},rotation:{get:function(){return Math.acos(this.a/this.scaleX)*(Math.atan(-this.c/this.a)<0?-1:1)}},rotationNormalized:{get:function(){var t=this.matrix,e=t[0],i=t[1],n=t[2],s=t[3];return e||i?i>0?Math.acos(e/this.scaleX):-Math.acos(e/this.scaleX):n||s?r.TAU-(s>0?Math.acos(-n/this.scaleY):-Math.acos(n/this.scaleY)):0}},scaleX:{get:function(){return Math.sqrt(this.a*this.a+this.b*this.b)}},scaleY:{get:function(){return Math.sqrt(this.c*this.c+this.d*this.d)}},loadIdentity:function(){var t=this.matrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,this},translate:function(t,e){var i=this.matrix;return i[4]=i[0]*t+i[2]*e+i[4],i[5]=i[1]*t+i[3]*e+i[5],this},scale:function(t,e){var i=this.matrix;return i[0]*=t,i[1]*=t,i[2]*=e,i[3]*=e,this},rotate:function(t){var e=Math.sin(t),i=Math.cos(t),n=this.matrix,r=n[0],s=n[1],o=n[2],a=n[3];return n[0]=r*i+o*e,n[1]=s*i+a*e,n[2]=r*-e+o*i,n[3]=s*-e+a*i,this},multiply:function(t,e){var i=this.matrix,n=t.matrix,r=i[0],s=i[1],o=i[2],a=i[3],h=i[4],u=i[5],l=n[0],c=n[1],d=n[2],p=n[3],f=n[4],m=n[5],v=void 0===e?this:e;return v.a=l*r+c*o,v.b=l*s+c*a,v.c=d*r+p*o,v.d=d*s+p*a,v.e=f*r+m*o+h,v.f=f*s+m*a+u,v},multiplyWithOffset:function(t,e,i){var n=this.matrix,r=t.matrix,s=n[0],o=n[1],a=n[2],h=n[3],u=e*s+i*a+n[4],l=e*o+i*h+n[5],c=r[0],d=r[1],p=r[2],f=r[3],m=r[4],v=r[5];return n[0]=c*s+d*a,n[1]=c*o+d*h,n[2]=p*s+f*a,n[3]=p*o+f*h,n[4]=m*s+v*a+u,n[5]=m*o+v*h+l,this},transform:function(t,e,i,n,r,s){var o=this.matrix,a=o[0],h=o[1],u=o[2],l=o[3],c=o[4],d=o[5];return o[0]=t*a+e*u,o[1]=t*h+e*l,o[2]=i*a+n*u,o[3]=i*h+n*l,o[4]=r*a+s*u+c,o[5]=r*h+s*l+d,this},transformPoint:function(t,e,i){void 0===i&&(i={x:0,y:0});var n=this.matrix,r=n[0],s=n[1],o=n[2],a=n[3],h=n[4],u=n[5];return i.x=t*r+e*o+h,i.y=t*s+e*a+u,i},invert:function(){var t=this.matrix,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=e*r-i*n;return t[0]=r/a,t[1]=-i/a,t[2]=-n/a,t[3]=e/a,t[4]=(n*o-r*s)/a,t[5]=-(e*o-i*s)/a,this},copyFrom:function(t){var e=this.matrix;return e[0]=t.a,e[1]=t.b,e[2]=t.c,e[3]=t.d,e[4]=t.e,e[5]=t.f,this},copyFromArray:function(t){var e=this.matrix;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],this},copyToContext:function(t){var e=this.matrix;return t.transform(e[0],e[1],e[2],e[3],e[4],e[5]),t},setToContext:function(t){var e=this.matrix;return t.setTransform(e[0],e[1],e[2],e[3],e[4],e[5]),t},copyToArray:function(t){var e=this.matrix;return void 0===t?t=[e[0],e[1],e[2],e[3],e[4],e[5]]:(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5]),t},setTransform:function(t,e,i,n,r,s){var o=this.matrix;return o[0]=t,o[1]=e,o[2]=i,o[3]=n,o[4]=r,o[5]=s,this},decomposeMatrix:function(){var t=this.decomposedMatrix,e=this.matrix,i=e[0],n=e[1],r=e[2],s=e[3],o=i*s-n*r;if(t.translateX=e[4],t.translateY=e[5],i||n){var a=Math.sqrt(i*i+n*n);t.rotation=n>0?Math.acos(i/a):-Math.acos(i/a),t.scaleX=a,t.scaleY=o/a}else if(r||s){var h=Math.sqrt(r*r+s*s);t.rotation=.5*Math.PI-(s>0?Math.acos(-r/h):-Math.acos(r/h)),t.scaleX=o/h,t.scaleY=h}else t.rotation=0,t.scaleX=0,t.scaleY=0;return t},applyITRS:function(t,e,i,n,r){var s=this.matrix,o=Math.sin(i),a=Math.cos(i);return s[4]=t,s[5]=e,s[0]=a*n,s[1]=o*n,s[2]=-o*r,s[3]=a*r,this},applyInverse:function(t,e,i){void 0===i&&(i=new s);var n=this.matrix,r=n[0],o=n[1],a=n[2],h=n[3],u=n[4],l=n[5],c=1/(r*h+a*-o);return i.x=h*c*t+-a*c*e+(l*a-u*h)*c,i.y=r*c*e+-o*c*t+(-l*r+u*o)*c,i},getX:function(t,e){return t*this.a+e*this.c+this.e},getY:function(t,e){return t*this.b+e*this.d+this.f},getCSSMatrix:function(){var t=this.matrix;return"matrix("+t[0]+","+t[1]+","+t[2]+","+t[3]+","+t[4]+","+t[5]+")"},destroy:function(){this.matrix=null,this.decomposedMatrix=null}});t.exports=o},17938:t=>{var e={_visible:!0,visible:{get:function(){return this._visible},set:function(t){t?(this._visible=!0,this.renderFlags|=1):(this._visible=!1,this.renderFlags&=-2)}},setVisible:function(t){return this.visible=t,this}};t.exports=e},23096:(t,e,i)=>{t.exports={Alpha:i(55957),AlphaSingle:i(34613),Animation:i(23765),BlendMode:i(64379),ComputedSize:i(99144),Crop:i(84890),Depth:i(56011),Flip:i(34042),GetBounds:i(24584),Mask:i(75878),Origin:i(27510),PathFollower:i(72664),Pipeline:i(76923),ScrollFactor:i(90099),Size:i(20622),Texture:i(81822),TextureCrop:i(24280),Tint:i(97446),ToJSON:i(82046),Transform:i(7560),TransformMatrix:i(65492),Visible:i(17938)}},8676:(t,e,i)=>{var n=i(37931),r=i(35869),s=i(47379),o=i(23096),a=i(6783),h=i(90554),u=i(38092),l=i(59614),c=i(71768),d=i(57148),p=new s({Extends:h,Mixins:[o.AlphaSingle,o.BlendMode,o.ComputedSize,o.Depth,o.Mask,o.Transform,o.Visible,l],initialize:function(t,e,i,n){h.call(this,t,"Container"),this.list=[],this.exclusive=!0,this.maxSize=-1,this.position=0,this.localTransform=new o.TransformMatrix,this.tempTransformMatrix=new o.TransformMatrix,this._displayList=t.sys.displayList,this._sortKey="",this._sysEvents=t.sys.events,this.scrollFactorX=1,this.scrollFactorY=1,this.setPosition(e,i),this.clearAlpha(),this.setBlendMode(r.SKIP_CHECK),n&&this.add(n)},originX:{get:function(){return.5}},originY:{get:function(){return.5}},displayOriginX:{get:function(){return.5*this.width}},displayOriginY:{get:function(){return.5*this.height}},setExclusive:function(t){return void 0===t&&(t=!0),this.exclusive=t,this},getBounds:function(t){if(void 0===t&&(t=new u),t.setTo(this.x,this.y,0,0),this.parentContainer){var e=this.parentContainer.getBoundsTransformMatrix().transformPoint(this.x,this.y);t.setTo(e.x,e.y,0,0)}if(this.list.length>0){var i=this.list,n=new u,r=i[0].getBounds();t.setTo(r.x,r.y,r.width,r.height);for(var s=1;s<i.length;s++){var o=i[s];o.getBounds&&(o.getBounds(n),c(n,t,t))}}return t},addHandler:function(t){t.once(a.DESTROY,this.remove,this),this.exclusive&&(this._displayList.remove(t),t.parentContainer&&t.parentContainer.remove(t),t.parentContainer=this)},removeHandler:function(t){t.off(a.DESTROY,this.remove),this.exclusive&&(t.parentContainer=null)},pointToContainer:function(t,e){void 0===e&&(e=new d),this.parentContainer?this.parentContainer.pointToContainer(t,e):e=new d(t.x,t.y);var i=this.tempTransformMatrix;return i.applyITRS(this.x,this.y,this.rotation,this.scaleX,this.scaleY),i.invert(),i.transformPoint(t.x,t.y,e),e},getBoundsTransformMatrix:function(){return this.getWorldTransformMatrix(this.tempTransformMatrix,this.localTransform)},add:function(t){return n.Add(this.list,t,this.maxSize,this.addHandler,this),this},addAt:function(t,e){return n.AddAt(this.list,t,e,this.maxSize,this.addHandler,this),this},getAt:function(t){return this.list[t]},getIndex:function(t){return this.list.indexOf(t)},sort:function(t,e){return t?(void 0===e&&(e=function(e,i){return e[t]-i[t]}),n.StableSort.inplace(this.list,e),this):this},getByName:function(t){return n.GetFirst(this.list,"name",t)},getRandom:function(t,e){return n.GetRandom(this.list,t,e)},getFirst:function(t,e,i,r){return n.GetFirst(this.list,t,e,i,r)},getAll:function(t,e,i,r){return n.GetAll(this.list,t,e,i,r)},count:function(t,e,i,r){return n.CountAllMatching(this.list,t,e,i,r)},swap:function(t,e){return n.Swap(this.list,t,e),this},moveTo:function(t,e){return n.MoveTo(this.list,t,e),this},remove:function(t,e){var i=n.Remove(this.list,t,this.removeHandler,this);if(e&&i){Array.isArray(i)||(i=[i]);for(var r=0;r<i.length;r++)i[r].destroy()}return this},removeAt:function(t,e){var i=n.RemoveAt(this.list,t,this.removeHandler,this);return e&&i&&i.destroy(),this},removeBetween:function(t,e,i){var r=n.RemoveBetween(this.list,t,e,this.removeHandler,this);if(i)for(var s=0;s<r.length;s++)r[s].destroy();return this},removeAll:function(t){var e=n.RemoveBetween(this.list,0,this.list.length,this.removeHandler,this);if(t)for(var i=0;i<e.length;i++)e[i].destroy();return this},bringToTop:function(t){return n.BringToTop(this.list,t),this},sendToBack:function(t){return n.SendToBack(this.list,t),this},moveUp:function(t){return n.MoveUp(this.list,t),this},moveDown:function(t){return n.MoveDown(this.list,t),this},reverse:function(){return this.list.reverse(),this},shuffle:function(){return n.Shuffle(this.list),this},replace:function(t,e,i){return n.Replace(this.list,t,e)&&(this.addHandler(e),this.removeHandler(t),i&&t.destroy()),this},exists:function(t){return this.list.indexOf(t)>-1},setAll:function(t,e,i,r){return n.SetAll(this.list,t,e,i,r),this},each:function(t,e){var i,n=[null],r=this.list.slice(),s=r.length;for(i=2;i<arguments.length;i++)n.push(arguments[i]);for(i=0;i<s;i++)n[0]=r[i],t.apply(e,n);return this},iterate:function(t,e){var i,n=[null];for(i=2;i<arguments.length;i++)n.push(arguments[i]);for(i=0;i<this.list.length;i++)n[0]=this.list[i],t.apply(e,n);return this},setScrollFactor:function(t,e,i){return void 0===e&&(e=t),void 0===i&&(i=!1),this.scrollFactorX=t,this.scrollFactorY=e,i&&(n.SetAll(this.list,"scrollFactorX",t),n.SetAll(this.list,"scrollFactorY",e)),this},length:{get:function(){return this.list.length}},first:{get:function(){return this.position=0,this.list.length>0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position<this.list.length?(this.position++,this.list[this.position]):null}},previous:{get:function(){return this.position>0?(this.position--,this.list[this.position]):null}},preDestroy:function(){this.removeAll(!!this.exclusive),this.localTransform.destroy(),this.tempTransformMatrix.destroy(),this.list=[],this._displayList=null}});t.exports=p},91283:t=>{t.exports=function(t,e,i,n,r){var s=e.list;if(0!==s.length){var o=e.localTransform;r?(o.loadIdentity(),o.multiply(r),o.translate(e.x,e.y),o.rotate(e.rotation),o.scale(e.scaleX,e.scaleY)):o.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var a=-1!==e.blendMode;a||t.setBlendMode(0);for(var h=e._alpha,u=e.scrollFactorX,l=e.scrollFactorY,c=0;c<s.length;c++){var d=s[c];if(d.willRender(n)){var p=d.alpha,f=d.scrollFactorX,m=d.scrollFactorY;a||d.blendMode===t.currentBlendMode||t.setBlendMode(d.blendMode),d.setScrollFactor(f*u,m*l),d.setAlpha(p*h),d.renderCanvas(t,d,i,n,o),d.setAlpha(p),d.setScrollFactor(f,m)}}}}},30814:(t,e,i)=>{var n=i(74865),r=i(8676),s=i(17517),o=i(57687);s.register("container",(function(t,e){void 0===t&&(t={});var i=o(t,"x",0),s=o(t,"y",0),a=new r(this.scene,i,s);return void 0!==e&&(t.add=e),n(this.scene,a,t),a}))},502:(t,e,i)=>{var n=i(8676);i(81342).register("container",(function(t,e,i){return this.displayList.add(new n(this.scene,t,e,i))}))},59614:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(89218),r=i(91283),t.exports={renderWebGL:n,renderCanvas:r}},89218:t=>{t.exports=function(t,e,i,n,r){var s=e.list;if(0!==s.length){var o=e.localTransform;r?(o.loadIdentity(),o.multiply(r),o.translate(e.x,e.y),o.rotate(e.rotation),o.scale(e.scaleX,e.scaleY)):o.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);var a=-1!==e.blendMode;a||t.setBlendMode(0);for(var h=e.alpha,u=e.scrollFactorX,l=e.scrollFactorY,c=s,d=s.length,p=0;p<d;p++){var f=s[p];if(f.willRender(n)){var m,v,g,y;if(void 0!==f.alphaTopLeft)m=f.alphaTopLeft,v=f.alphaTopRight,g=f.alphaBottomLeft,y=f.alphaBottomRight;else{var _=f.alpha;m=_,v=_,g=_,y=_}var x=f.scrollFactorX,b=f.scrollFactorY;a||f.blendMode===t.currentBlendMode||t.setBlendMode(f.blendMode);var w=f.mask;w&&w.preRenderWebGL(t,f,n);var T=f.type;T!==t.currentType&&(t.newType=!0,t.currentType=T),t.nextTypeMatch=p<d-1&&c[p+1].type===t.currentType,f.setScrollFactor(x*u,b*l),f.setAlpha(m*h,v*h,g*h,y*h),f.renderWebGL(t,f,i,n,o),f.setAlpha(m,v,g,y),f.setScrollFactor(x,b),w&&w.postRenderWebGL(t,n),t.newType=!1}}}}},53358:t=>{t.exports=["normal","multiply","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"]},4533:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(12062),o=i(90554),a=i(28621),h=i(68791),u=i(88637),l=i(68970),c=new n({Extends:o,Mixins:[r.AlphaSingle,r.BlendMode,r.Depth,r.Origin,r.ScrollFactor,r.Transform,r.Visible,s],initialize:function(t,e,i,n,r,s){o.call(this,t,"DOMElement"),this.parent=t.sys.game.domContainer,this.cache=t.sys.cache.html,this.node,this.transformOnly=!1,this.skewX=0,this.skewY=0,this.rotate3d=new l,this.rotate3dAngle="deg",this.width=0,this.height=0,this.displayWidth=0,this.displayHeight=0,this.handler=this.dispatchNativeEvent.bind(this),this.setPosition(e,i),"string"==typeof n?"#"===n[0]?this.setElement(n.substr(1),r,s):this.createElement(n,r,s):n&&this.setElement(n,r,s),t.sys.events.on(u.SLEEP,this.handleSceneEvent,this),t.sys.events.on(u.WAKE,this.handleSceneEvent,this)},handleSceneEvent:function(t){var e=this.node,i=e.style;e&&(i.display=t.settings.visible?"block":"none")},setSkew:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.skewX=t,this.skewY=e,this},setPerspective:function(t){return this.parent.style.perspective=t+"px",this},perspective:{get:function(){return parseFloat(this.parent.style.perspective)},set:function(t){this.parent.style.perspective=t+"px"}},addListener:function(t){if(this.node){t=t.split(" ");for(var e=0;e<t.length;e++)this.node.addEventListener(t[e],this.handler,!1)}return this},removeListener:function(t){if(this.node){t=t.split(" ");for(var e=0;e<t.length;e++)this.node.removeEventListener(t[e],this.handler)}return this},dispatchNativeEvent:function(t){this.emit(t.type,t)},createElement:function(t,e,i){return this.setElement(document.createElement(t),e,i)},setElement:function(t,e,i){var n;if(this.removeElement(),"string"==typeof t?("#"===t[0]&&(t=t.substr(1)),n=document.getElementById(t)):"object"==typeof t&&1===t.nodeType&&(n=t),!n)return this;if(this.node=n,e&&a(e))for(var r in e)n.style[r]=e[r];else"string"==typeof e&&(n.style=e);return n.style.zIndex="0",n.style.display="inline",n.style.position="absolute",n.phaser=this,this.parent&&this.parent.appendChild(n),i&&(n.innerText=i),this.updateSize()},createFromCache:function(t,e){var i=this.cache.get(t);return i&&this.createFromHTML(i,e),this},createFromHTML:function(t,e){void 0===e&&(e="div"),this.removeElement();var i=document.createElement(e);return this.node=i,i.style.zIndex="0",i.style.display="inline",i.style.position="absolute",i.phaser=this,this.parent&&this.parent.appendChild(i),i.innerHTML=t,this.updateSize()},removeElement:function(){return this.node&&(h(this.node),this.node=null),this},updateSize:function(){var t=this.node,e=t.getBoundingClientRect();return this.width=t.clientWidth,this.height=t.clientHeight,this.displayWidth=e.width||0,this.displayHeight=e.height||0,this},getChildByProperty:function(t,e){if(this.node)for(var i=this.node.querySelectorAll("*"),n=0;n<i.length;n++)if(i[n][t]===e)return i[n];return null},getChildByID:function(t){return this.getChildByProperty("id",t)},getChildByName:function(t){return this.getChildByProperty("name",t)},setClassName:function(t){return this.node&&(this.node.className=t,this.updateSize()),this},setText:function(t){return this.node&&(this.node.innerText=t,this.updateSize()),this},setHTML:function(t){return this.node&&(this.node.innerHTML=t,this.updateSize()),this},preUpdate:function(){var t=this.parentContainer,e=this.node;e&&t&&!t.willRender()&&(e.style.display="none")},willRender:function(){return!0},preDestroy:function(){this.removeElement(),this.scene.sys.events.off(u.SLEEP,this.handleSceneEvent,this),this.scene.sys.events.off(u.WAKE,this.handleSceneEvent,this)}});t.exports=c},72988:(t,e,i)=>{var n=i(53358),r=i(90554);t.exports=function(t,e,i,s,o){var a=e.node,h=a.style,u=e.scene.sys.settings;if(!(a&&h&&u.visible&&r.RENDER_MASK===e.renderFlags)||0!==e.cameraFilter&&e.cameraFilter&s.id||e.parentContainer&&!e.parentContainer.willRender())a&&(h.display="none");else{var l=e.parentContainer,c=s.alpha*e.alpha;l&&(c*=l.alpha);var d=t._tempMatrix1,p=t._tempMatrix2,f=t._tempMatrix3,m=0,v=0,g="0%",y="0%";o?(m=e.width*e.scaleX*e.originX,v=e.height*e.scaleY*e.originY,p.applyITRS(e.x-m,e.y-v,e.rotation,e.scaleX,e.scaleY),d.copyFrom(s.matrix),d.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),p.e=e.x-m,p.f=e.y-v,d.multiply(p,f)):(m=e.width*e.originX,v=e.height*e.originY,p.applyITRS(e.x-m,e.y-v,e.rotation,e.scaleX,e.scaleY),d.copyFrom(s.matrix),g=100*e.originX+"%",y=100*e.originY+"%",p.e-=s.scrollX*e.scrollFactorX,p.f-=s.scrollY*e.scrollFactorY,d.multiply(p,f)),e.transformOnly||(h.display="block",h.opacity=c,h.zIndex=e._depth,h.pointerEvents="auto",h.mixBlendMode=n[e._blendMode]),h.transform=f.getCSSMatrix()+" skew("+e.skewX+"rad, "+e.skewY+"rad) rotate3d("+e.rotate3d.x+","+e.rotate3d.y+","+e.rotate3d.z+","+e.rotate3d.w+e.rotate3dAngle+")",h.transformOrigin=g+" "+y}}},91893:(t,e,i)=>{var n=i(4533);i(81342).register("dom",(function(t,e,i,r,s){var o=new n(this.scene,t,e,i,r,s);return this.displayList.add(o),this.updateList.add(o),o}))},12062:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(72988),r=i(72988),t.exports={renderWebGL:n,renderCanvas:r}},47419:t=>{t.exports="destroy"},37704:t=>{t.exports="complete"},10589:t=>{t.exports="created"},90233:t=>{t.exports="error"},31425:t=>{t.exports="loop"},34849:t=>{t.exports="play"},64448:t=>{t.exports="seeked"},87392:t=>{t.exports="seeking"},95841:t=>{t.exports="stop"},56201:t=>{t.exports="timeout"},84651:t=>{t.exports="unlocked"},6783:(t,e,i)=>{t.exports={DESTROY:i(47419),VIDEO_COMPLETE:i(37704),VIDEO_CREATED:i(10589),VIDEO_ERROR:i(90233),VIDEO_LOOP:i(31425),VIDEO_PLAY:i(34849),VIDEO_SEEKED:i(64448),VIDEO_SEEKING:i(87392),VIDEO_STOP:i(95841),VIDEO_TIMEOUT:i(56201),VIDEO_UNLOCKED:i(84651)}},54259:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(85048),a=new n({Extends:s,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.Flip,r.Origin,r.ScrollFactor,r.Size,r.Texture,r.Tint,r.Transform,r.Visible,o],initialize:function(t){s.call(this,t,"Extern")},preUpdate:function(){},render:function(){}});t.exports=a},37911:()=>{},20773:(t,e,i)=>{var n=i(54259);i(81342).register("extern",(function(){var t=new n(this.scene);return this.displayList.add(t),this.updateList.add(t),t}))},85048:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(16798),r=i(37911),t.exports={renderWebGL:n,renderCanvas:r}},16798:t=>{t.exports=function(t,e,i,n,r){var s=t.currentPipeline;t.clearPipeline();var o=t._tempMatrix1,a=t._tempMatrix2,h=t._tempMatrix3;a.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),o.copyFrom(n.matrix),r?(o.multiplyWithOffset(r,-n.scrollX*e.scrollFactorX,-n.scrollY*e.scrollFactorY),a.e=e.x,a.f=e.y,o.multiply(a,h)):(a.e-=n.scrollX*e.scrollFactorX,a.f-=n.scrollY*e.scrollFactorY,o.multiply(a,h)),e.render.call(e,t,n,h),t.rebindPipeline(s)}},95832:t=>{t.exports={ARC:0,BEGIN_PATH:1,CLOSE_PATH:2,FILL_RECT:3,LINE_TO:4,MOVE_TO:5,LINE_STYLE:6,FILL_STYLE:7,FILL_PATH:8,STROKE_PATH:9,FILL_TRIANGLE:10,STROKE_TRIANGLE:11,SAVE:14,RESTORE:15,TRANSLATE:16,SCALE:17,ROTATE:18,SET_TEXTURE:19,CLEAR_TEXTURE:20,GRADIENT_FILL_STYLE:21,GRADIENT_LINE_STYLE:22}},65726:(t,e,i)=>{var n=i(22190),r=i(47379),s=i(95832),o=i(34613),a=i(64379),h=i(56011),u=i(75878),l=i(76923),c=i(7560),d=i(17938),p=i(90099),f=i(65492),m=i(38341),v=i(90554),g=i(81769),y=i(86652),_=i(14302),x=i(90909),b=new r({Extends:v,Mixins:[o,a,h,u,l,c,d,p,x],initialize:function(t,e){var i=y(e,"x",0),n=y(e,"y",0);v.call(this,t,"Graphics"),this.setPosition(i,n),this.initPipeline(),this.displayOriginX=0,this.displayOriginY=0,this.commandBuffer=[],this.defaultFillColor=-1,this.defaultFillAlpha=1,this.defaultStrokeWidth=1,this.defaultStrokeColor=-1,this.defaultStrokeAlpha=1,this._lineWidth=1,this._tempMatrix1=new f,this._tempMatrix2=new f,this._tempMatrix3=new f,this.setDefaultStyles(e)},setDefaultStyles:function(t){return y(t,"lineStyle",null)&&(this.defaultStrokeWidth=y(t,"lineStyle.width",1),this.defaultStrokeColor=y(t,"lineStyle.color",16777215),this.defaultStrokeAlpha=y(t,"lineStyle.alpha",1),this.lineStyle(this.defaultStrokeWidth,this.defaultStrokeColor,this.defaultStrokeAlpha)),y(t,"fillStyle",null)&&(this.defaultFillColor=y(t,"fillStyle.color",16777215),this.defaultFillAlpha=y(t,"fillStyle.alpha",1),this.fillStyle(this.defaultFillColor,this.defaultFillAlpha)),this},lineStyle:function(t,e,i){return void 0===i&&(i=1),this.commandBuffer.push(s.LINE_STYLE,t,e,i),this._lineWidth=t,this},fillStyle:function(t,e){return void 0===e&&(e=1),this.commandBuffer.push(s.FILL_STYLE,t,e),this},fillGradientStyle:function(t,e,i,n,r){return void 0===r&&(r=1),this.commandBuffer.push(s.GRADIENT_FILL_STYLE,r,t,e,i,n),this},lineGradientStyle:function(t,e,i,n,r,o){return void 0===o&&(o=1),this.commandBuffer.push(s.GRADIENT_LINE_STYLE,t,o,e,i,n,r),this},setTexture:function(t,e,i){if(void 0===i&&(i=0),void 0===t)this.commandBuffer.push(s.CLEAR_TEXTURE);else{var n=this.scene.sys.textures.getFrame(t,e);n&&(2===i&&(i=3),this.commandBuffer.push(s.SET_TEXTURE,n,i))}return this},beginPath:function(){return this.commandBuffer.push(s.BEGIN_PATH),this},closePath:function(){return this.commandBuffer.push(s.CLOSE_PATH),this},fillPath:function(){return this.commandBuffer.push(s.FILL_PATH),this},fill:function(){return this.commandBuffer.push(s.FILL_PATH),this},strokePath:function(){return this.commandBuffer.push(s.STROKE_PATH),this},stroke:function(){return this.commandBuffer.push(s.STROKE_PATH),this},fillCircleShape:function(t){return this.fillCircle(t.x,t.y,t.radius)},strokeCircleShape:function(t){return this.strokeCircle(t.x,t.y,t.radius)},fillCircle:function(t,e,i){return this.beginPath(),this.arc(t,e,i,0,_.PI2),this.fillPath(),this},strokeCircle:function(t,e,i){return this.beginPath(),this.arc(t,e,i,0,_.PI2),this.strokePath(),this},fillRectShape:function(t){return this.fillRect(t.x,t.y,t.width,t.height)},strokeRectShape:function(t){return this.strokeRect(t.x,t.y,t.width,t.height)},fillRect:function(t,e,i,n){return this.commandBuffer.push(s.FILL_RECT,t,e,i,n),this},strokeRect:function(t,e,i,n){var r=this._lineWidth/2,s=t-r,o=t+r;return this.beginPath(),this.moveTo(t,e),this.lineTo(t,e+n),this.strokePath(),this.beginPath(),this.moveTo(t+i,e),this.lineTo(t+i,e+n),this.strokePath(),this.beginPath(),this.moveTo(s,e),this.lineTo(o+i,e),this.strokePath(),this.beginPath(),this.moveTo(s,e+n),this.lineTo(o+i,e+n),this.strokePath(),this},fillRoundedRect:function(t,e,i,n,r){void 0===r&&(r=20);var s=r,o=r,a=r,h=r;return"number"!=typeof r&&(s=g(r,"tl",20),o=g(r,"tr",20),a=g(r,"bl",20),h=g(r,"br",20)),this.beginPath(),this.moveTo(t+s,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,-_.TAU,0),this.lineTo(t+i,e+n-h),this.arc(t+i-h,e+n-h,h,0,_.TAU),this.lineTo(t+a,e+n),this.arc(t+a,e+n-a,a,_.TAU,Math.PI),this.lineTo(t,e+s),this.arc(t+s,e+s,s,-Math.PI,-_.TAU),this.fillPath(),this},strokeRoundedRect:function(t,e,i,n,r){void 0===r&&(r=20);var s=r,o=r,a=r,h=r;return"number"!=typeof r&&(s=g(r,"tl",20),o=g(r,"tr",20),a=g(r,"bl",20),h=g(r,"br",20)),this.beginPath(),this.moveTo(t+s,e),this.lineTo(t+i-o,e),this.arc(t+i-o,e+o,o,-_.TAU,0),this.lineTo(t+i,e+n-h),this.arc(t+i-h,e+n-h,h,0,_.TAU),this.lineTo(t+a,e+n),this.arc(t+a,e+n-a,a,_.TAU,Math.PI),this.lineTo(t,e+s),this.arc(t+s,e+s,s,-Math.PI,-_.TAU),this.strokePath(),this},fillPointShape:function(t,e){return this.fillPoint(t.x,t.y,e)},fillPoint:function(t,e,i){return!i||i<1?i=1:(t-=i/2,e-=i/2),this.commandBuffer.push(s.FILL_RECT,t,e,i,i),this},fillTriangleShape:function(t){return this.fillTriangle(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)},strokeTriangleShape:function(t){return this.strokeTriangle(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)},fillTriangle:function(t,e,i,n,r,o){return this.commandBuffer.push(s.FILL_TRIANGLE,t,e,i,n,r,o),this},strokeTriangle:function(t,e,i,n,r,o){return this.commandBuffer.push(s.STROKE_TRIANGLE,t,e,i,n,r,o),this},strokeLineShape:function(t){return this.lineBetween(t.x1,t.y1,t.x2,t.y2)},lineBetween:function(t,e,i,n){return this.beginPath(),this.moveTo(t,e),this.lineTo(i,n),this.strokePath(),this},lineTo:function(t,e){return this.commandBuffer.push(s.LINE_TO,t,e),this},moveTo:function(t,e){return this.commandBuffer.push(s.MOVE_TO,t,e),this},strokePoints:function(t,e,i,n){void 0===e&&(e=!1),void 0===i&&(i=!1),void 0===n&&(n=t.length),this.beginPath(),this.moveTo(t[0].x,t[0].y);for(var r=1;r<n;r++)this.lineTo(t[r].x,t[r].y);return e&&this.lineTo(t[0].x,t[0].y),i&&this.closePath(),this.strokePath(),this},fillPoints:function(t,e,i,n){void 0===e&&(e=!1),void 0===i&&(i=!1),void 0===n&&(n=t.length),this.beginPath(),this.moveTo(t[0].x,t[0].y);for(var r=1;r<n;r++)this.lineTo(t[r].x,t[r].y);return e&&this.lineTo(t[0].x,t[0].y),i&&this.closePath(),this.fillPath(),this},strokeEllipseShape:function(t,e){void 0===e&&(e=32);var i=t.getPoints(e);return this.strokePoints(i,!0)},strokeEllipse:function(t,e,i,n,r){void 0===r&&(r=32);var s=new m(t,e,i,n).getPoints(r);return this.strokePoints(s,!0)},fillEllipseShape:function(t,e){void 0===e&&(e=32);var i=t.getPoints(e);return this.fillPoints(i,!0)},fillEllipse:function(t,e,i,n,r){void 0===r&&(r=32);var s=new m(t,e,i,n).getPoints(r);return this.fillPoints(s,!0)},arc:function(t,e,i,n,r,o,a){return void 0===o&&(o=!1),void 0===a&&(a=0),this.commandBuffer.push(s.ARC,t,e,i,n,r,o,a),this},slice:function(t,e,i,n,r,o,a){return void 0===o&&(o=!1),void 0===a&&(a=0),this.commandBuffer.push(s.BEGIN_PATH),this.commandBuffer.push(s.MOVE_TO,t,e),this.commandBuffer.push(s.ARC,t,e,i,n,r,o,a),this.commandBuffer.push(s.CLOSE_PATH),this},save:function(){return this.commandBuffer.push(s.SAVE),this},restore:function(){return this.commandBuffer.push(s.RESTORE),this},translateCanvas:function(t,e){return this.commandBuffer.push(s.TRANSLATE,t,e),this},scaleCanvas:function(t,e){return this.commandBuffer.push(s.SCALE,t,e),this},rotateCanvas:function(t){return this.commandBuffer.push(s.ROTATE,t),this},clear:function(){return this.commandBuffer.length=0,this.defaultFillColor>-1&&this.fillStyle(this.defaultFillColor,this.defaultFillAlpha),this.defaultStrokeColor>-1&&this.lineStyle(this.defaultStrokeWidth,this.defaultStrokeColor,this.defaultStrokeAlpha),this},generateTexture:function(t,e,i){var n,r,s=this.scene.sys,o=s.game.renderer;if(void 0===e&&(e=s.scale.width),void 0===i&&(i=s.scale.height),b.TargetCamera.setScene(this.scene),b.TargetCamera.setViewport(0,0,e,i),b.TargetCamera.scrollX=this.x,b.TargetCamera.scrollY=this.y,"string"==typeof t)if(s.textures.exists(t)){var a=(n=s.textures.get(t)).getSourceImage();a instanceof HTMLCanvasElement&&(r=a.getContext("2d"))}else r=(n=s.textures.createCanvas(t,e,i)).getSourceImage().getContext("2d");else t instanceof HTMLCanvasElement&&(r=t.getContext("2d"));return r&&(this.renderCanvas(o,this,0,b.TargetCamera,null,r,!1),n&&n.refresh()),this},preDestroy:function(){this.commandBuffer=[]}});b.TargetCamera=new n,t.exports=b},85068:(t,e,i)=>{var n=i(95832),r=i(55468);t.exports=function(t,e,i,s,o,a,h){var u=e.commandBuffer,l=u.length,c=a||t.currentContext;if(0!==l&&r(t,c,e,s,o)){var d=1,p=1,f=0,m=0,v=1,g=0,y=0,_=0;c.beginPath();for(var x=0;x<l;++x){switch(u[x]){case n.ARC:c.arc(u[x+1],u[x+2],u[x+3],u[x+4],u[x+5],u[x+6]),x+=7;break;case n.LINE_STYLE:v=u[x+1],f=u[x+2],d=u[x+3],g=(16711680&f)>>>16,y=(65280&f)>>>8,_=255&f,c.strokeStyle="rgba("+g+","+y+","+_+","+d+")",c.lineWidth=v,x+=3;break;case n.FILL_STYLE:m=u[x+1],p=u[x+2],g=(16711680&m)>>>16,y=(65280&m)>>>8,_=255&m,c.fillStyle="rgba("+g+","+y+","+_+","+p+")",x+=2;break;case n.BEGIN_PATH:c.beginPath();break;case n.CLOSE_PATH:c.closePath();break;case n.FILL_PATH:h||c.fill();break;case n.STROKE_PATH:h||c.stroke();break;case n.FILL_RECT:h?c.rect(u[x+1],u[x+2],u[x+3],u[x+4]):c.fillRect(u[x+1],u[x+2],u[x+3],u[x+4]),x+=4;break;case n.FILL_TRIANGLE:c.beginPath(),c.moveTo(u[x+1],u[x+2]),c.lineTo(u[x+3],u[x+4]),c.lineTo(u[x+5],u[x+6]),c.closePath(),h||c.fill(),x+=6;break;case n.STROKE_TRIANGLE:c.beginPath(),c.moveTo(u[x+1],u[x+2]),c.lineTo(u[x+3],u[x+4]),c.lineTo(u[x+5],u[x+6]),c.closePath(),h||c.stroke(),x+=6;break;case n.LINE_TO:c.lineTo(u[x+1],u[x+2]),x+=2;break;case n.MOVE_TO:c.moveTo(u[x+1],u[x+2]),x+=2;break;case n.LINE_FX_TO:c.lineTo(u[x+1],u[x+2]),x+=5;break;case n.MOVE_FX_TO:c.moveTo(u[x+1],u[x+2]),x+=5;break;case n.SAVE:c.save();break;case n.RESTORE:c.restore();break;case n.TRANSLATE:c.translate(u[x+1],u[x+2]),x+=2;break;case n.SCALE:c.scale(u[x+1],u[x+2]),x+=2;break;case n.ROTATE:c.rotate(u[x+1]),x+=1;break;case n.GRADIENT_FILL_STYLE:x+=5;break;case n.GRADIENT_LINE_STYLE:x+=6;break;case n.SET_TEXTURE:x+=2}}c.restore()}}},85389:(t,e,i)=>{var n=i(17517),r=i(65726);n.register("graphics",(function(t,e){void 0===t&&(t={}),void 0!==e&&(t.add=e);var i=new r(this.scene,t);return t.add&&this.scene.sys.displayList.add(i),i}))},97111:(t,e,i)=>{var n=i(65726);i(81342).register("graphics",(function(t){return this.displayList.add(new n(this.scene,t))}))},90909:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(41783),r=i(85068),r=i(85068),t.exports={renderWebGL:n,renderCanvas:r}},41783:(t,e,i)=>{var n=i(95832),r=i(19298),s=function(t,e,i){this.x=t,this.y=e,this.width=i},o=function(t,e,i){this.points=[],this.pointsLength=1,this.points[0]=new s(t,e,i)},a=[];t.exports=function(t,e,i,h,u){if(0!==e.commandBuffer.length){var l=this.pipeline;t.setPipeline(l,e);var c=e._tempMatrix1,d=e._tempMatrix2,p=e._tempMatrix3;p.loadIdentity(),d.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),c.copyFrom(h.matrix),u?(c.multiplyWithOffset(u,-h.scrollX*e.scrollFactorX,-h.scrollY*e.scrollFactorY),d.e=e.x,d.f=e.y,c.multiply(d)):(d.e-=h.scrollX*e.scrollFactorX,d.f-=h.scrollY*e.scrollFactorY,c.multiply(d));for(var f=e.commandBuffer,m=h.alpha*e.alpha,v=1,g=l.fillTint,y=l.strokeTint,_=0,x=0,b=0,w=2*Math.PI,T=[],M=0,S=!1,E=null,L=r.getTintAppendFloatAlphaAndSwap,A=t.blankTexture.glTexture,D=0;D<f.length;D++)switch(f[D]){case n.BEGIN_PATH:T.length=0,E=null,S=!0;break;case n.CLOSE_PATH:S=!1,E&&E.points.length&&E.points.push(E.points[0]);break;case n.FILL_PATH:for(M=0;M<T.length;M++)l.setTexture2D(A),l.batchFillPath(T[M].points,p,c);break;case n.STROKE_PATH:for(M=0;M<T.length;M++)l.setTexture2D(A),l.batchStrokePath(T[M].points,v,S,p,c);break;case n.LINE_STYLE:v=f[++D];var P=L(f[++D],f[++D]*m);y.TL=P,y.TR=P,y.BL=P,y.BR=P;break;case n.FILL_STYLE:var C=L(f[++D],f[++D]*m);g.TL=C,g.TR=C,g.BL=C,g.BR=C;break;case n.GRADIENT_FILL_STYLE:var O=f[++D]*m;g.TL=L(f[++D],O),g.TR=L(f[++D],O),g.BL=L(f[++D],O),g.BR=L(f[++D],O);break;case n.GRADIENT_LINE_STYLE:v=f[++D];var k=f[++D]*m;y.TL=L(f[++D],k),y.TR=L(f[++D],k),y.BL=L(f[++D],k),y.BR=L(f[++D],k);break;case n.ARC:var R=0,I=f[++D],Y=f[++D],F=f[++D],N=f[++D],B=f[++D],U=f[++D],j=f[++D];for(B-=N,U?B<-w?B=-w:B>0&&(B=B%w-w):B>w?B=w:B<0&&(B=w+B%w),null===E&&(E=new o(I+Math.cos(N)*F,Y+Math.sin(N)*F,v),T.push(E),R+=.01);R<1+j;)b=B*R+N,_=I+Math.cos(b)*F,x=Y+Math.sin(b)*F,E.points.push(new s(_,x,v)),R+=.01;b=B+N,_=I+Math.cos(b)*F,x=Y+Math.sin(b)*F,E.points.push(new s(_,x,v));break;case n.FILL_RECT:l.setTexture2D(A),l.batchFillRect(f[++D],f[++D],f[++D],f[++D],p,c);break;case n.FILL_TRIANGLE:l.setTexture2D(A),l.batchFillTriangle(f[++D],f[++D],f[++D],f[++D],f[++D],f[++D],p,c);break;case n.STROKE_TRIANGLE:l.setTexture2D(A),l.batchStrokeTriangle(f[++D],f[++D],f[++D],f[++D],f[++D],f[++D],v,p,c);break;case n.LINE_TO:null!==E?E.points.push(new s(f[++D],f[++D],v)):(E=new o(f[++D],f[++D],v),T.push(E));break;case n.MOVE_TO:E=new o(f[++D],f[++D],v),T.push(E);break;case n.SAVE:a.push(p.copyToArray());break;case n.RESTORE:p.copyFromArray(a.pop());break;case n.TRANSLATE:I=f[++D],Y=f[++D],p.translate(I,Y);break;case n.SCALE:I=f[++D],Y=f[++D],p.scale(I,Y);break;case n.ROTATE:p.rotate(f[++D]);break;case n.SET_TEXTURE:var H=f[++D],z=f[++D];l.currentFrame=H,l.setTexture2D(H.glTexture,0),l.tintEffect=z,A=H.glTexture;break;case n.CLEAR_TEXTURE:l.currentFrame=t.blankTexture,l.tintEffect=2,A=t.blankTexture.glTexture}}}},55815:(t,e,i)=>{var n=i(5490),r=i(47379),s=i(6783),o=i(81769),a=i(86652),h=i(28621),u=i(81903),l=i(69347),c=i(95681),d=new r({initialize:function(t,e,i){i?e&&!Array.isArray(e)&&(e=[e]):Array.isArray(e)?h(e[0])&&(i=e,e=null):h(e)&&(i=e,e=null),this.scene=t,this.children=new l(e),this.isParent=!0,this.type="Group",this.classType=o(i,"classType",c),this.name=o(i,"name",""),this.active=o(i,"active",!0),this.maxSize=o(i,"maxSize",-1),this.defaultKey=o(i,"defaultKey",null),this.defaultFrame=o(i,"defaultFrame",null),this.runChildUpdate=o(i,"runChildUpdate",!1),this.createCallback=o(i,"createCallback",null),this.removeCallback=o(i,"removeCallback",null),this.createMultipleCallback=o(i,"createMultipleCallback",null),this.internalCreateCallback=o(i,"internalCreateCallback",null),this.internalRemoveCallback=o(i,"internalRemoveCallback",null),i&&this.createMultiple(i)},create:function(t,e,i,n,r,s){if(void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.defaultKey),void 0===n&&(n=this.defaultFrame),void 0===r&&(r=!0),void 0===s&&(s=!0),this.isFull())return null;var o=new this.classType(this.scene,t,e,i,n);return this.scene.sys.displayList.add(o),o.preUpdate&&this.scene.sys.updateList.add(o),o.visible=r,o.setActive(s),this.add(o),o},createMultiple:function(t){if(this.isFull())return[];Array.isArray(t)||(t=[t]);var e=[];if(t[0].key)for(var i=0;i<t.length;i++){var n=this.createFromConfig(t[i]);e=e.concat(n)}return e},createFromConfig:function(t){if(this.isFull())return[];this.classType=o(t,"classType",this.classType);var e=o(t,"key",void 0),i=o(t,"frame",null),r=o(t,"visible",!0),s=o(t,"active",!0),h=[];if(void 0===e)return h;Array.isArray(e)||(e=[e]),Array.isArray(i)||(i=[i]);var l=o(t,"repeat",0),c=o(t,"randomKey",!1),d=o(t,"randomFrame",!1),p=o(t,"yoyo",!1),f=o(t,"quantity",!1),m=o(t,"frameQuantity",1),v=o(t,"max",0),g=u(e,i,{max:v,qty:f||m,random:c,randomB:d,repeat:l,yoyo:p});t.createCallback&&(this.createCallback=t.createCallback),t.removeCallback&&(this.removeCallback=t.removeCallback);for(var y=0;y<g.length;y++){var _=this.create(0,0,g[y].a,g[y].b,r,s);if(!_)break;h.push(_)}var x=a(t,"setXY.x",0),b=a(t,"setXY.y",0),w=a(t,"setXY.stepX",0),T=a(t,"setXY.stepY",0);n.SetXY(h,x,b,w,T);var M=a(t,"setRotation.value",0),S=a(t,"setRotation.step",0);n.SetRotation(h,M,S);var E=a(t,"setScale.x",1),L=a(t,"setScale.y",E),A=a(t,"setScale.stepX",0),D=a(t,"setScale.stepY",0);n.SetScale(h,E,L,A,D);var P=a(t,"setAlpha.value",1),C=a(t,"setAlpha.step",0);n.SetAlpha(h,P,C);var O=a(t,"setDepth.value",0),k=a(t,"setDepth.step",0);n.SetDepth(h,O,k);var R=a(t,"setScrollFactor.x",1),I=a(t,"setScrollFactor.y",R),Y=a(t,"setScrollFactor.stepX",0),F=a(t,"setScrollFactor.stepY",0);n.SetScrollFactor(h,R,I,Y,F);var N=o(t,"hitArea",null),B=o(t,"hitAreaCallback",null);N&&n.SetHitArea(h,N,B);var U=o(t,"gridAlign",!1);return U&&n.GridAlign(h,U),this.createMultipleCallback&&this.createMultipleCallback.call(this,h),h},preUpdate:function(t,e){if(this.runChildUpdate&&0!==this.children.size)for(var i=this.children.entries.slice(),n=0;n<i.length;n++){var r=i[n];r.active&&r.update(t,e)}},add:function(t,e){return void 0===e&&(e=!1),this.isFull()||(this.children.set(t),this.internalCreateCallback&&this.internalCreateCallback.call(this,t),this.createCallback&&this.createCallback.call(this,t),e&&(this.scene.sys.displayList.add(t),t.preUpdate&&this.scene.sys.updateList.add(t)),t.on(s.DESTROY,this.remove,this)),this},addMultiple:function(t,e){if(void 0===e&&(e=!1),Array.isArray(t))for(var i=0;i<t.length;i++)this.add(t[i],e);return this},remove:function(t,e,i){return void 0===e&&(e=!1),void 0===i&&(i=!1),this.children.contains(t)?(this.children.delete(t),this.internalRemoveCallback&&this.internalRemoveCallback.call(this,t),this.removeCallback&&this.removeCallback.call(this,t),t.off(s.DESTROY,this.remove,this),i?t.destroy():e&&(t.scene.sys.displayList.remove(t),t.preUpdate&&t.scene.sys.updateList.remove(t)),this):this},clear:function(t,e){void 0===t&&(t=!1),void 0===e&&(e=!1);for(var i=this.children,n=0;n<i.size;n++){var r=i.entries[n];r.off(s.DESTROY,this.remove,this),e?r.destroy():t&&(r.scene.sys.displayList.remove(r),r.preUpdate&&r.scene.sys.updateList.remove(r))}return this.children.clear(),this},contains:function(t){return this.children.contains(t)},getChildren:function(){return this.children.entries},getLength:function(){return this.children.size},getFirst:function(t,e,i,n,r,s,o){return this.getHandler(!0,1,t,e,i,n,r,s,o)},getFirstNth:function(t,e,i,n,r,s,o,a){return this.getHandler(!0,t,e,i,n,r,s,o,a)},getLast:function(t,e,i,n,r,s,o){return this.getHandler(!1,1,t,e,i,n,r,s,o)},getLastNth:function(t,e,i,n,r,s,o,a){return this.getHandler(!1,t,e,i,n,r,s,o,a)},getHandler:function(t,e,i,n,r,s,o,a,h){var u,l;void 0===i&&(i=!1),void 0===n&&(n=!1);var c=0,d=this.children.entries;if(t)for(l=0;l<d.length;l++)if((u=d[l]).active===i){if(++c===e)break}else u=null;else for(l=d.length-1;l>=0;l--)if((u=d[l]).active===i){if(++c===e)break}else u=null;return u?("number"==typeof r&&(u.x=r),"number"==typeof s&&(u.y=s),u):n?this.create(r,s,o,a,h):null},get:function(t,e,i,n,r){return this.getFirst(!1,!0,t,e,i,n,r)},getFirstAlive:function(t,e,i,n,r,s){return this.getFirst(!0,t,e,i,n,r,s)},getFirstDead:function(t,e,i,n,r,s){return this.getFirst(!1,t,e,i,n,r,s)},playAnimation:function(t,e){return n.PlayAnimation(this.children.entries,t,e),this},isFull:function(){return-1!==this.maxSize&&this.children.size>=this.maxSize},countActive:function(t){void 0===t&&(t=!0);for(var e=0,i=0;i<this.children.size;i++)this.children.entries[i].active===t&&e++;return e},getTotalUsed:function(){return this.countActive()},getTotalFree:function(){var t=this.getTotalUsed();return(-1===this.maxSize?999999999999:this.maxSize)-t},propertyValueSet:function(t,e,i,r,s){return n.PropertyValueSet(this.children.entries,t,e,i,r,s),this},propertyValueInc:function(t,e,i,r,s){return n.PropertyValueInc(this.children.entries,t,e,i,r,s),this},setX:function(t,e){return n.SetX(this.children.entries,t,e),this},setY:function(t,e){return n.SetY(this.children.entries,t,e),this},setXY:function(t,e,i,r){return n.SetXY(this.children.entries,t,e,i,r),this},incX:function(t,e){return n.IncX(this.children.entries,t,e),this},incY:function(t,e){return n.IncY(this.children.entries,t,e),this},incXY:function(t,e,i,r){return n.IncXY(this.children.entries,t,e,i,r),this},shiftPosition:function(t,e,i){return n.ShiftPosition(this.children.entries,t,e,i),this},angle:function(t,e){return n.Angle(this.children.entries,t,e),this},rotate:function(t,e){return n.Rotate(this.children.entries,t,e),this},rotateAround:function(t,e){return n.RotateAround(this.children.entries,t,e),this},rotateAroundDistance:function(t,e,i){return n.RotateAroundDistance(this.children.entries,t,e,i),this},setAlpha:function(t,e){return n.SetAlpha(this.children.entries,t,e),this},setTint:function(t,e,i,r){return n.SetTint(this.children.entries,t,e,i,r),this},setOrigin:function(t,e,i,r){return n.SetOrigin(this.children.entries,t,e,i,r),this},scaleX:function(t,e){return n.ScaleX(this.children.entries,t,e),this},scaleY:function(t,e){return n.ScaleY(this.children.entries,t,e),this},scaleXY:function(t,e,i,r){return n.ScaleXY(this.children.entries,t,e,i,r),this},setDepth:function(t,e){return n.SetDepth(this.children.entries,t,e),this},setBlendMode:function(t){return n.SetBlendMode(this.children.entries,t),this},setHitArea:function(t,e){return n.SetHitArea(this.children.entries,t,e),this},shuffle:function(){return n.Shuffle(this.children.entries),this},kill:function(t){this.children.contains(t)&&t.setActive(!1)},killAndHide:function(t){this.children.contains(t)&&(t.setActive(!1),t.setVisible(!1))},setVisible:function(t,e,i){return n.SetVisible(this.children.entries,t,e,i),this},toggleVisible:function(){return n.ToggleVisible(this.children.entries),this},destroy:function(t){void 0===t&&(t=!1),this.scene&&!this.ignoreDestroy&&(this.clear(!1,t),this.scene=void 0,this.children=void 0)}});t.exports=d},22168:(t,e,i)=>{var n=i(17517),r=i(55815);n.register("group",(function(t){return new r(this.scene,null,t)}))},44902:(t,e,i)=>{var n=i(55815);i(81342).register("group",(function(t,e){return this.updateList.add(new n(this.scene,t,e))}))},59525:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(86171),a=new n({Extends:s,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.ScrollFactor,r.Size,r.TextureCrop,r.Tint,r.Transform,r.Visible,o],initialize:function(t,e,i,n,r){s.call(this,t,"Image"),this._crop=this.resetCropObject(),this.setTexture(n,r),this.setPosition(e,i),this.setSizeToFrame(),this.setOriginFromFrame(),this.initPipeline()}});t.exports=a},81044:t=>{t.exports=function(t,e,i,n,r){t.batchSprite(e,e.frame,n,r)}},71241:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(59525);r.register("image",(function(t,e){void 0===t&&(t={});var i=s(t,"key",null),r=s(t,"frame",null),a=new o(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),n(this.scene,a,t),a}))},43483:(t,e,i)=>{var n=i(59525);i(81342).register("image",(function(t,e,i,r){return this.displayList.add(new n(this.scene,t,e,i,r))}))},86171:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(18042),r=i(81044),t.exports={renderWebGL:n,renderCanvas:r}},18042:t=>{t.exports=function(t,e,i,n,r){this.pipeline.batchSprite(e,n,r)}},5837:(t,e,i)=>{var n={Events:i(6783),DisplayList:i(28983),GameObjectCreator:i(17517),GameObjectFactory:i(81342),UpdateList:i(61118),Components:i(23096),BuildGameObject:i(74865),BuildGameObjectAnimation:i(4777),GameObject:i(90554),BitmapText:i(56956),Blitter:i(92139),Container:i(8676),DOMElement:i(4533),DynamicBitmapText:i(16175),Extern:i(54259),Graphics:i(65726),Group:i(55815),Image:i(59525),Particles:i(88842),PathFollower:i(95473),RenderTexture:i(68343),RetroFont:i(89193),Rope:i(18741),Sprite:i(95681),Text:i(52986),TileSprite:i(20003),Zone:i(24860),Video:i(44336),Shape:i(31641),Arc:i(66082),Curve:i(56653),Ellipse:i(62291),Grid:i(12086),IsoBox:i(46221),IsoTriangle:i(39994),Line:i(21211),Polygon:i(32330),Rectangle:i(13056),Star:i(85864),Triangle:i(82379),Factories:{Blitter:i(306),Container:i(502),DOMElement:i(91893),DynamicBitmapText:i(60094),Extern:i(20773),Graphics:i(97111),Group:i(44902),Image:i(43483),Particles:i(262),PathFollower:i(19541),RenderTexture:i(89107),Rope:i(17100),Sprite:i(88984),StaticBitmapText:i(41547),Text:i(44229),TileSprite:i(26241),Zone:i(3242),Video:i(38020),Arc:i(44729),Curve:i(18164),Ellipse:i(70608),Grid:i(85357),IsoBox:i(37349),IsoTriangle:i(57084),Line:i(74347),Polygon:i(42275),Rectangle:i(23738),Star:i(11242),Triangle:i(80888)},Creators:{Blitter:i(53674),Container:i(30814),DynamicBitmapText:i(29036),Graphics:i(85389),Group:i(22168),Image:i(71241),Particles:i(41887),RenderTexture:i(49830),Rope:i(56546),Sprite:i(69045),StaticBitmapText:i(21296),Text:i(19086),TileSprite:i(94938),Zone:i(90932),Video:i(48200)}};n.Mesh=i(32507),n.Quad=i(34500),n.Shader=i(29274),n.Factories.Mesh=i(91336),n.Factories.Quad=i(57367),n.Factories.Shader=i(61785),n.Creators.Mesh=i(17306),n.Creators.Quad=i(70121),n.Creators.Shader=i(34386),n.Light=i(90302),i(38812),i(59484),t.exports=n},90302:(t,e,i)=>{var n=i(47379),r=i(19298),s=new n({initialize:function(t,e,i,n,r,s,o){this.x=t,this.y=e,this.radius=i,this.r=n,this.g=r,this.b=s,this.intensity=o,this.scrollFactorX=1,this.scrollFactorY=1},set:function(t,e,i,n,r,s,o){return this.x=t,this.y=e,this.radius=i,this.r=n,this.g=r,this.b=s,this.intensity=o,this.scrollFactorX=1,this.scrollFactorY=1,this},setScrollFactor:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=t),this.scrollFactorX=t,this.scrollFactorY=e,this},setColor:function(t){var e=r.getFloatsFromUintRGB(t);return this.r=e[0],this.g=e[1],this.b=e[2],this},setIntensity:function(t){return this.intensity=t,this},setPosition:function(t,e){return this.x=t,this.y=e,this},setRadius:function(t){return this.radius=t,this}});t.exports=s},38812:(t,e,i)=>{var n=i(47379),r=i(90302),s=i(19298),o=new n({initialize:function(){this.lightPool=[],this.lights=[],this.culledLights=[],this.ambientColor={r:.1,g:.1,b:.1},this.active=!1,this.maxLights=-1},enable:function(){return-1===this.maxLights&&(this.maxLights=this.scene.sys.game.renderer.config.maxLights),this.active=!0,this},disable:function(){return this.active=!1,this},cull:function(t){var e=this.lights,i=this.culledLights,n=e.length,r=t.x+t.width/2,s=t.y+t.height/2,o=(t.width+t.height)/2,a={x:0,y:0},h=t.matrix,u=this.systems.game.config.height;i.length=0;for(var l=0;l<n&&i.length<this.maxLights;l++){var c=e[l];h.transformPoint(c.x,c.y,a);var d=r-(a.x-t.scrollX*c.scrollFactorX*t.zoom),p=s-(u-(a.y-t.scrollY*c.scrollFactorY*t.zoom));Math.sqrt(d*d+p*p)<c.radius+o&&i.push(e[l])}return i},forEachLight:function(t){if(t){for(var e=this.lights,i=e.length,n=0;n<i;++n)t(e[n]);return this}},setAmbientColor:function(t){var e=s.getFloatsFromUintRGB(t);return this.ambientColor.r=e[0],this.ambientColor.g=e[1],this.ambientColor.b=e[2],this},getMaxVisibleLights:function(){return 10},getLightCount:function(){return this.lights.length},addLight:function(t,e,i,n,o){var a,h=null;return t=void 0===t?0:t,e=void 0===e?0:e,n=void 0===n?16777215:n,i=void 0===i?100:i,o=void 0===o?1:o,a=s.getFloatsFromUintRGB(n),h=null,this.lightPool.length>0?(h=this.lightPool.pop()).set(t,e,i,a[0],a[1],a[2],o):h=new r(t,e,i,a[0],a[1],a[2],o),this.lights.push(h),h},removeLight:function(t){var e=this.lights.indexOf(t);return e>=0&&(this.lightPool.push(t),this.lights.splice(e,1)),this},shutdown:function(){for(;this.lights.length>0;)this.lightPool.push(this.lights.pop());this.ambientColor={r:.1,g:.1,b:.1},this.culledLights.length=0,this.lights.length=0},destroy:function(){this.shutdown()}});t.exports=o},59484:(t,e,i)=>{var n=i(47379),r=i(38812),s=i(50354),o=i(88637),a=new n({Extends:r,initialize:function(t){this.scene=t,this.systems=t.sys,t.sys.settings.isBooted||t.sys.events.once(o.BOOT,this.boot,this),r.call(this)},boot:function(){var t=this.systems.events;t.on(o.SHUTDOWN,this.shutdown,this),t.on(o.DESTROY,this.destroy,this)},destroy:function(){this.shutdown(),this.scene=void 0,this.systems=void 0}});s.register("LightsPlugin",a,"lights"),t.exports=a},32507:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(36196),a=i(49035),h=new n({Extends:s,Mixins:[r.BlendMode,r.Depth,r.Mask,r.Pipeline,r.Size,r.Texture,r.Transform,r.Visible,r.ScrollFactor,o],initialize:function(t,e,i,n,r,o,a,h,u){if(s.call(this,t,"Mesh"),n.length!==r.length)throw new Error("Mesh Vertex count must match UV count");var l,c=n.length/2|0;if(o.length>0&&o.length<c)throw new Error("Mesh Color count must match Vertex count");if(a.length>0&&a.length<c)throw new Error("Mesh Alpha count must match Vertex count");if(0===o.length)for(l=0;l<c;++l)o[l]=16777215;if(0===a.length)for(l=0;l<c;++l)a[l]=1;this.vertices=new Float32Array(n),this.uv=new Float32Array(r),this.colors=new Uint32Array(o),this.alphas=new Float32Array(a),this.tintFill=!1,this.setTexture(h,u),this.setPosition(e,i),this.setSizeToFrame(),this.initPipeline()},setAlpha:a});t.exports=h},16624:t=>{t.exports=function(){}},17306:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(86652),a=i(32507);r.register("mesh",(function(t,e){void 0===t&&(t={});var i=s(t,"key",null),r=s(t,"frame",null),h=o(t,"vertices",[]),u=o(t,"colors",[]),l=o(t,"alphas",[]),c=o(t,"uv",[]),d=new a(this.scene,0,0,h,c,u,l,i,r);return void 0!==e&&(t.add=e),n(this.scene,d,t),d}))},91336:(t,e,i)=>{var n=i(32507);i(81342).register("mesh",(function(t,e,i,r,s,o,a,h){return this.displayList.add(new n(this.scene,t,e,i,r,s,o,a,h))}))},36196:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(11880),r=i(16624),t.exports={renderWebGL:n,renderCanvas:r}},11880:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=this.pipeline;t.setPipeline(o,e);var a=o._tempMatrix1,h=o._tempMatrix2,u=o._tempMatrix3;h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y,a.multiply(h,u)):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY,a.multiply(h,u));var l=e.frame.glTexture,c=e.vertices,d=e.uv,p=e.colors,f=e.alphas,m=c.length,v=Math.floor(.5*m);o.vertexCount+v>o.vertexCapacity&&o.flush(),o.setTexture2D(l,0);for(var g=o.vertexViewF32,y=o.vertexViewU32,_=o.vertexCount*o.vertexComponentCount-1,x=0,b=e.tintFill,w=0;w<m;w+=2){var T=c[w+0],M=c[w+1],S=T*u.a+M*u.c+u.e,E=T*u.b+M*u.d+u.f;r.roundPixels&&(S=Math.round(S),E=Math.round(E)),g[++_]=S,g[++_]=E,g[++_]=d[w+0],g[++_]=d[w+1],g[++_]=b,y[++_]=n.getTintAppendFloatAlpha(p[x],r.alpha*f[x]),x++}o.vertexCount+=v}},32497:(t,e,i)=>{var n=i(47379),r=i(31657),s=i(38852),o=i(81769),a=i(62951),h=new n({initialize:function(t,e,i,n){void 0===n&&(n=!1),this.propertyKey=e,this.propertyValue=i,this.defaultValue=i,this.steps=0,this.counter=0,this.start=0,this.end=0,this.ease,this.emitOnly=n,this.onEmit=this.defaultEmit,this.onUpdate=this.defaultUpdate,this.loadConfig(t)},loadConfig:function(t,e){void 0===t&&(t={}),e&&(this.propertyKey=e),this.propertyValue=o(t,this.propertyKey,this.defaultValue),this.setMethods(),this.emitOnly&&(this.onUpdate=this.defaultUpdate)},toJSON:function(){return this.propertyValue},onChange:function(t){return this.propertyValue=t,this.setMethods()},setMethods:function(){var t=this.propertyValue,e=typeof t;if("number"===e)this.onEmit=this.staticValueEmit,this.onUpdate=this.staticValueUpdate;else if(Array.isArray(t))this.onEmit=this.randomStaticValueEmit;else if("function"===e)this.emitOnly?this.onEmit=t:this.onUpdate=t;else if("object"===e&&(this.has(t,"random")||this.hasBoth(t,"start","end")||this.hasBoth(t,"min","max"))){this.start=this.has(t,"start")?t.start:t.min,this.end=this.has(t,"end")?t.end:t.max;var i=this.hasBoth(t,"min","max")||!!t.random;if(i){var n=t.random;Array.isArray(n)&&(this.start=n[0],this.end=n[1]),this.onEmit=this.randomRangedValueEmit}if(this.has(t,"steps"))this.steps=t.steps,this.counter=this.start,this.onEmit=this.steppedEmit;else{var r=this.has(t,"ease")?t.ease:"Linear";this.ease=s(r),i||(this.onEmit=this.easedValueEmit),this.onUpdate=this.easeValueUpdate}}else"object"===e&&this.hasEither(t,"onEmit","onUpdate")&&(this.has(t,"onEmit")&&(this.onEmit=t.onEmit),this.has(t,"onUpdate")&&(this.onUpdate=t.onUpdate));return this},has:function(t,e){return t.hasOwnProperty(e)},hasBoth:function(t,e,i){return t.hasOwnProperty(e)&&t.hasOwnProperty(i)},hasEither:function(t,e,i){return t.hasOwnProperty(e)||t.hasOwnProperty(i)},defaultEmit:function(t,e,i){return i},defaultUpdate:function(t,e,i,n){return n},staticValueEmit:function(){return this.propertyValue},staticValueUpdate:function(){return this.propertyValue},randomStaticValueEmit:function(){var t=Math.floor(Math.random()*this.propertyValue.length);return this.propertyValue[t]},randomRangedValueEmit:function(t,e){var i=r(this.start,this.end);return t&&t.data[e]&&(t.data[e].min=i),i},steppedEmit:function(){var t=this.counter,e=this.counter+(this.end-this.start)/this.steps;return this.counter=a(e,this.start,this.end),t},easedValueEmit:function(t,e){if(t&&t.data[e]){var i=t.data[e];i.min=this.start,i.max=this.end}return this.start},easeValueUpdate:function(t,e,i){var n=t.data[e];return(n.max-n.min)*this.ease(i)+n.min}});t.exports=h},50007:(t,e,i)=>{var n=i(47379),r=i(81769),s=new n({initialize:function(t,e,i,n,s){if("object"==typeof t){var o=t;t=r(o,"x",0),e=r(o,"y",0),i=r(o,"power",0),n=r(o,"epsilon",100),s=r(o,"gravity",50)}else void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=100),void 0===s&&(s=50);this.x=t,this.y=e,this.active=!0,this._gravity=s,this._power=0,this._epsilon=0,this.power=i,this.epsilon=n},update:function(t,e){var i=this.x-t.x,n=this.y-t.y,r=i*i+n*n;if(0!==r){var s=Math.sqrt(r);r<this._epsilon&&(r=this._epsilon);var o=this._power*e/(r*s)*100;t.velocityX+=i*o,t.velocityY+=n*o}},epsilon:{get:function(){return Math.sqrt(this._epsilon)},set:function(t){this._epsilon=t*t}},power:{get:function(){return this._power/this._gravity},set:function(t){this._power=t*this._gravity}},gravity:{get:function(){return this._gravity},set:function(t){var e=this.power;this._gravity=t,this.power=e}}});t.exports=s},95423:(t,e,i)=>{var n=i(47379),r=i(98436),s=i(73587),o=new n({initialize:function(t){this.emitter=t,this.frame=null,this.x=0,this.y=0,this.velocityX=0,this.velocityY=0,this.accelerationX=0,this.accelerationY=0,this.maxVelocityX=1e4,this.maxVelocityY=1e4,this.bounce=0,this.scaleX=1,this.scaleY=1,this.alpha=1,this.angle=0,this.rotation=0,this.tint=16777215,this.life=1e3,this.lifeCurrent=1e3,this.delayCurrent=0,this.lifeT=0,this.data={tint:{min:16777215,max:16777215,current:16777215},alpha:{min:1,max:1},rotate:{min:0,max:0},scaleX:{min:1,max:1},scaleY:{min:1,max:1}}},isAlive:function(){return this.lifeCurrent>0},resetPosition:function(){this.x=0,this.y=0},fire:function(t,e){var i=this.emitter;this.frame=i.getFrame(),i.emitZone&&i.emitZone.getPoint(this),void 0===t?(i.follow&&(this.x+=i.follow.x+i.followOffset.x),this.x+=i.x.onEmit(this,"x")):this.x+=t,void 0===e?(i.follow&&(this.y+=i.follow.y+i.followOffset.y),this.y+=i.y.onEmit(this,"y")):this.y+=e,this.life=i.lifespan.onEmit(this,"lifespan"),this.lifeCurrent=this.life,this.lifeT=0;var n=i.speedX.onEmit(this,"speedX"),o=i.speedY?i.speedY.onEmit(this,"speedY"):n;if(i.radial){var a=r(i.angle.onEmit(this,"angle"));this.velocityX=Math.cos(a)*Math.abs(n),this.velocityY=Math.sin(a)*Math.abs(o)}else if(i.moveTo){var h=i.moveToX.onEmit(this,"moveToX"),u=i.moveToY?i.moveToY.onEmit(this,"moveToY"):h,l=Math.atan2(u-this.y,h-this.x),c=s(this.x,this.y,h,u)/(this.life/1e3);this.velocityX=Math.cos(l)*c,this.velocityY=Math.sin(l)*c}else this.velocityX=n,this.velocityY=o;i.acceleration&&(this.accelerationX=i.accelerationX.onEmit(this,"accelerationX"),this.accelerationY=i.accelerationY.onEmit(this,"accelerationY")),this.maxVelocityX=i.maxVelocityX.onEmit(this,"maxVelocityX"),this.maxVelocityY=i.maxVelocityY.onEmit(this,"maxVelocityY"),this.delayCurrent=i.delay.onEmit(this,"delay"),this.scaleX=i.scaleX.onEmit(this,"scaleX"),this.scaleY=i.scaleY?i.scaleY.onEmit(this,"scaleY"):this.scaleX,this.angle=i.rotate.onEmit(this,"rotate"),this.rotation=r(this.angle),this.bounce=i.bounce.onEmit(this,"bounce"),this.alpha=i.alpha.onEmit(this,"alpha"),this.tint=i.tint.onEmit(this,"tint")},computeVelocity:function(t,e,i,n){var r=this.velocityX,s=this.velocityY,o=this.accelerationX,a=this.accelerationY,h=this.maxVelocityX,u=this.maxVelocityY;r+=t.gravityX*i,s+=t.gravityY*i,o&&(r+=o*i),a&&(s+=a*i),r>h?r=h:r<-h&&(r=-h),s>u?s=u:s<-u&&(s=-u),this.velocityX=r,this.velocityY=s;for(var l=0;l<n.length;l++)n[l].update(this,e,i)},checkBounds:function(t){var e=t.bounds,i=-this.bounce;this.x<e.x&&t.collideLeft?(this.x=e.x,this.velocityX*=i):this.x>e.right&&t.collideRight&&(this.x=e.right,this.velocityX*=i),this.y<e.y&&t.collideTop?(this.y=e.y,this.velocityY*=i):this.y>e.bottom&&t.collideBottom&&(this.y=e.bottom,this.velocityY*=i)},update:function(t,e,i){if(this.delayCurrent>0)return this.delayCurrent-=t,!1;var n=this.emitter,s=1-this.lifeCurrent/this.life;return this.lifeT=s,this.computeVelocity(n,t,e,i),this.x+=this.velocityX*e,this.y+=this.velocityY*e,n.bounds&&this.checkBounds(n),n.deathZone&&n.deathZone.willKill(this)?(this.lifeCurrent=0,!0):(this.scaleX=n.scaleX.onUpdate(this,"scaleX",s,this.scaleX),n.scaleY?this.scaleY=n.scaleY.onUpdate(this,"scaleY",s,this.scaleY):this.scaleY=this.scaleX,this.angle=n.rotate.onUpdate(this,"rotate",s,this.angle),this.rotation=r(this.angle),this.alpha=n.alpha.onUpdate(this,"alpha",s,this.alpha),this.tint=n.tint.onUpdate(this,"tint",s,this.tint),this.lifeCurrent-=t,this.lifeCurrent<=0)}});t.exports=o},3631:(t,e,i)=>{var n=i(35869),r=i(47379),s=i(23096),o=i(72347),a=i(71521),h=i(32497),u=i(81769),l=i(51750),c=i(97639),d=i(64036),p=i(95423),f=i(46744),m=i(38092),v=i(59199),g=i(57148),y=i(62951),_=new r({Mixins:[s.BlendMode,s.Mask,s.ScrollFactor,s.Visible],initialize:function(t,e){this.manager=t,this.texture=t.texture,this.frames=[t.defaultFrame],this.defaultFrame=t.defaultFrame,this.configFastMap=["active","blendMode","collideBottom","collideLeft","collideRight","collideTop","deathCallback","deathCallbackScope","emitCallback","emitCallbackScope","follow","frequency","gravityX","gravityY","maxParticles","name","on","particleBringToTop","particleClass","radial","timeScale","trackVisible","visible"],this.configOpMap=["accelerationX","accelerationY","angle","alpha","bounce","delay","lifespan","maxVelocityX","maxVelocityY","moveToX","moveToY","quantity","rotate","scaleX","scaleY","speedX","speedY","tint","x","y"],this.name="",this.particleClass=p,this.x=new h(e,"x",0,!0),this.y=new h(e,"y",0,!0),this.radial=!0,this.gravityX=0,this.gravityY=0,this.acceleration=!1,this.accelerationX=new h(e,"accelerationX",0,!0),this.accelerationY=new h(e,"accelerationY",0,!0),this.maxVelocityX=new h(e,"maxVelocityX",1e4,!0),this.maxVelocityY=new h(e,"maxVelocityY",1e4,!0),this.speedX=new h(e,"speedX",0,!0),this.speedY=new h(e,"speedY",0,!0),this.moveTo=!1,this.moveToX=new h(e,"moveToX",0,!0),this.moveToY=new h(e,"moveToY",0,!0),this.bounce=new h(e,"bounce",0,!0),this.scaleX=new h(e,"scaleX",1),this.scaleY=new h(e,"scaleY",1),this.tint=new h(e,"tint",4294967295),this.alpha=new h(e,"alpha",1),this.lifespan=new h(e,"lifespan",1e3,!0),this.angle=new h(e,"angle",{min:0,max:360},!0),this.rotate=new h(e,"rotate",0),this.emitCallback=null,this.emitCallbackScope=null,this.deathCallback=null,this.deathCallbackScope=null,this.maxParticles=0,this.quantity=new h(e,"quantity",1,!0),this.delay=new h(e,"delay",0,!0),this.frequency=0,this.on=!0,this.particleBringToTop=!0,this.timeScale=1,this.emitZone=null,this.deathZone=null,this.bounds=null,this.collideLeft=!0,this.collideRight=!0,this.collideTop=!0,this.collideBottom=!0,this.active=!0,this.visible=!0,this.blendMode=n.NORMAL,this.follow=null,this.followOffset=new g,this.trackVisible=!1,this.currentFrame=0,this.randomFrame=!0,this.frameQuantity=1,this.dead=[],this.alive=[],this._counter=0,this._frameCounter=0,e&&this.fromJSON(e)},fromJSON:function(t){if(!t)return this;var e=0,i="";for(e=0;e<this.configFastMap.length;e++)i=this.configFastMap[e],d(t,i)&&(this[i]=u(t,i));for(e=0;e<this.configOpMap.length;e++)i=this.configOpMap[e],d(t,i)&&this[i].loadConfig(t);if(this.acceleration=0!==this.accelerationX.propertyValue||0!==this.accelerationY.propertyValue,this.moveTo=0!==this.moveToX.propertyValue||0!==this.moveToY.propertyValue,d(t,"speed")&&(this.speedX.loadConfig(t,"speed"),this.speedY=null),(c(t,["speedX","speedY"])||this.moveTo)&&(this.radial=!1),d(t,"scale")&&(this.scaleX.loadConfig(t,"scale"),this.scaleY=null),d(t,"callbackScope")){var n=u(t,"callbackScope",null);this.emitCallbackScope=n,this.deathCallbackScope=n}return d(t,"emitZone")&&this.setEmitZone(t.emitZone),d(t,"deathZone")&&this.setDeathZone(t.deathZone),d(t,"bounds")&&this.setBounds(t.bounds),d(t,"followOffset")&&this.followOffset.setFromObject(u(t,"followOffset",0)),d(t,"frame")&&this.setFrame(t.frame),this},toJSON:function(t){void 0===t&&(t={});var e=0,i="";for(e=0;e<this.configFastMap.length;e++)t[i=this.configFastMap[e]]=this[i];for(e=0;e<this.configOpMap.length;e++)this[i=this.configOpMap[e]]&&(t[i]=this[i].toJSON());return this.speedY||(delete t.speedX,t.speed=this.speedX.toJSON()),this.scaleY||(delete t.scaleX,t.scale=this.scaleX.toJSON()),t},startFollow:function(t,e,i,n){return void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=!1),this.follow=t,this.followOffset.set(e,i),this.trackVisible=n,this},stopFollow:function(){return this.follow=null,this.followOffset.set(0,0),this.trackVisible=!1,this},getFrame:function(){if(1===this.frames.length)return this.defaultFrame;if(this.randomFrame)return l(this.frames);var t=this.frames[this.currentFrame];return this._frameCounter++,this._frameCounter===this.frameQuantity&&(this._frameCounter=0,this.currentFrame=y(this.currentFrame+1,0,this._frameLength)),t},setFrame:function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=1),this.randomFrame=e,this.frameQuantity=i,this.currentFrame=0,this._frameCounter=0;var n=typeof t;if(Array.isArray(t)||"string"===n||"number"===n)this.manager.setEmitterFrames(t,this);else if("object"===n){var r=t;(t=u(r,"frames",null))&&this.manager.setEmitterFrames(t,this);var s=u(r,"cycle",!1);this.randomFrame=!s,this.frameQuantity=u(r,"quantity",i)}return this._frameLength=this.frames.length,1===this._frameLength&&(this.frameQuantity=1,this.randomFrame=!1),this},setRadial:function(t){return void 0===t&&(t=!0),this.radial=t,this},setPosition:function(t,e){return this.x.onChange(t),this.y.onChange(e),this},setBounds:function(t,e,i,n){if("object"==typeof t){var r=t;t=r.x,e=r.y,i=d(r,"w")?r.w:r.width,n=d(r,"h")?r.h:r.height}return this.bounds?this.bounds.setTo(t,e,i,n):this.bounds=new m(t,e,i,n),this},setSpeedX:function(t){return this.speedX.onChange(t),this.radial=!1,this},setSpeedY:function(t){return this.speedY&&(this.speedY.onChange(t),this.radial=!1),this},setSpeed:function(t){return this.speedX.onChange(t),this.speedY=null,this.radial=!0,this},setScaleX:function(t){return this.scaleX.onChange(t),this},setScaleY:function(t){return this.scaleY.onChange(t),this},setScale:function(t){return this.scaleX.onChange(t),this.scaleY=null,this},setGravityX:function(t){return this.gravityX=t,this},setGravityY:function(t){return this.gravityY=t,this},setGravity:function(t,e){return this.gravityX=t,this.gravityY=e,this},setAlpha:function(t){return this.alpha.onChange(t),this},setTint:function(t){return this.tint.onChange(t),this},setEmitterAngle:function(t){return this.angle.onChange(t),this},setAngle:function(t){return this.angle.onChange(t),this},setLifespan:function(t){return this.lifespan.onChange(t),this},setQuantity:function(t){return this.quantity.onChange(t),this},setFrequency:function(t,e){return this.frequency=t,this._counter=0,e&&this.quantity.onChange(e),this},setEmitZone:function(t){if(void 0===t)this.emitZone=null;else{var e=u(t,"type","random"),i=u(t,"source",null);switch(e){case"random":this.emitZone=new f(i);break;case"edge":var n=u(t,"quantity",1),r=u(t,"stepRate",0),s=u(t,"yoyo",!1),o=u(t,"seamless",!0);this.emitZone=new a(i,n,r,s,o)}}return this},setDeathZone:function(t){if(void 0===t)this.deathZone=null;else{var e=u(t,"type","onEnter"),i=u(t,"source",null);if(i&&"function"==typeof i.contains){var n="onEnter"===e;this.deathZone=new o(i,n)}}return this},reserve:function(t){for(var e=this.dead,i=0;i<t;i++)e.push(new this.particleClass(this));return this},getAliveParticleCount:function(){return this.alive.length},getDeadParticleCount:function(){return this.dead.length},getParticleCount:function(){return this.getAliveParticleCount()+this.getDeadParticleCount()},atLimit:function(){return this.maxParticles>0&&this.getParticleCount()===this.maxParticles},onParticleEmit:function(t,e){return void 0===t?(this.emitCallback=null,this.emitCallbackScope=null):"function"==typeof t&&(this.emitCallback=t,e&&(this.emitCallbackScope=e)),this},onParticleDeath:function(t,e){return void 0===t?(this.deathCallback=null,this.deathCallbackScope=null):"function"==typeof t&&(this.deathCallback=t,e&&(this.deathCallbackScope=e)),this},killAll:function(){for(var t=this.dead,e=this.alive;e.length>0;)t.push(e.pop());return this},forEachAlive:function(t,e){for(var i=this.alive,n=i.length,r=0;r<n;++r)t.call(e,i[r],this);return this},forEachDead:function(t,e){for(var i=this.dead,n=i.length,r=0;r<n;++r)t.call(e,i[r],this);return this},start:function(){return this.on=!0,this._counter=0,this},stop:function(){return this.on=!1,this},pause:function(){return this.active=!1,this},resume:function(){return this.active=!0,this},remove:function(){return this.manager.removeEmitter(this),this},depthSort:function(){return v.inplace(this.alive,this.depthSortCallback),this},flow:function(t,e){return void 0===e&&(e=1),this.frequency=t,this.quantity.onChange(e),this.start()},explode:function(t,e,i){return this.frequency=-1,this.emitParticle(t,e,i)},emitParticleAt:function(t,e,i){return this.emitParticle(i,t,e)},emitParticle:function(t,e,i){if(!this.atLimit()){void 0===t&&(t=this.quantity.onEmit());for(var n=this.dead,r=0;r<t;r++){var s=n.pop();if(s||(s=new this.particleClass(this)),s.fire(e,i),this.particleBringToTop?this.alive.push(s):this.alive.unshift(s),this.emitCallback&&this.emitCallback.call(this.emitCallbackScope,s,this),this.atLimit())break}return s}},preUpdate:function(t,e){var i=(e*=this.timeScale)/1e3;this.trackVisible&&(this.visible=this.follow.visible);var n=this.manager.getProcessors(),r=this.alive,s=this.dead,o=0,a=[],h=r.length;for(o=0;o<h;o++){var u=r[o];u.update(e,i,n)&&a.push({index:o,particle:u})}if((h=a.length)>0){var l=this.deathCallback,c=this.deathCallbackScope;for(o=h-1;o>=0;o--){var d=a[o];r.splice(d.index,1),s.push(d.particle),l&&l.call(c,d.particle),d.particle.resetPosition()}}this.on&&(0===this.frequency?this.emitParticle():this.frequency>0&&(this._counter-=e,this._counter<=0&&(this.emitParticle(),this._counter=this.frequency-Math.abs(this._counter))))},depthSortCallback:function(t,e){return t.y-e.y}});t.exports=_},14765:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(50007),a=i(29365),h=i(3631),u=i(78129),l=new n({Extends:s,Mixins:[r.Depth,r.Mask,r.Pipeline,r.Transform,r.Visible,u],initialize:function(t,e,i,n){if(s.call(this,t,"ParticleEmitterManager"),this.blendMode=-1,this.timeScale=1,this.texture=null,this.frame=null,this.frameNames=[],null===i||"object"!=typeof i&&!Array.isArray(i)||(n=i,i=null),this.setTexture(e,i),this.initPipeline(),this.emitters=new a(this),this.wells=new a(this),n){Array.isArray(n)||(n=[n]);for(var r=0;r<n.length;r++)this.createEmitter(n[r])}},setTexture:function(t,e){return this.texture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t){this.frame=this.texture.get(t);var e=this.texture.getFramesFromTextureSource(this.frame.sourceIndex),i=[];return e.forEach((function(t){i.push(t.name)})),this.frameNames=i,this.defaultFrame=this.frame,this},setEmitterFrames:function(t,e){Array.isArray(t)||(t=[t]);var i=e.frames;i.length=0;for(var n=0;n<t.length;n++){var r=t[n];-1!==this.frameNames.indexOf(r)&&i.push(this.texture.get(r))}return i.length>0?e.defaultFrame=i[0]:e.defaultFrame=this.defaultFrame,this},addEmitter:function(t){return this.emitters.add(t)},createEmitter:function(t){return this.addEmitter(new h(this,t))},removeEmitter:function(t){return this.emitters.remove(t,!0)},addGravityWell:function(t){return this.wells.add(t)},createGravityWell:function(t){return this.addGravityWell(new o(t))},emitParticle:function(t,e,i){for(var n=this.emitters.list,r=0;r<n.length;r++){var s=n[r];s.active&&s.emitParticle(t,e,i)}return this},emitParticleAt:function(t,e,i){return this.emitParticle(i,t,e)},pause:function(){return this.active=!1,this},resume:function(){return this.active=!0,this},getProcessors:function(){return this.wells.getAll("active",!0)},preUpdate:function(t,e){e*=this.timeScale;for(var i=this.emitters.list,n=0;n<i.length;n++){var r=i[n];r.active&&r.preUpdate(t,e)}},setAlpha:function(){},setScrollFactor:function(){},setBlendMode:function(){}});t.exports=l},10536:t=>{t.exports=function(t,e,i,n,r){var s=e.emitters.list,o=s.length;if(0!==o){var a=t._tempMatrix1.copyFrom(n.matrix),h=t._tempMatrix2,u=t._tempMatrix3,l=t._tempMatrix4.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);a.multiply(l);var c=n.roundPixels,d=t.currentContext;d.save();for(var p=0;p<o;p++){var f=s[p],m=f.alive,v=m.length;if(f.visible&&0!==v){var g=n.scrollX*f.scrollFactorX,y=n.scrollY*f.scrollFactorY;r&&(a.multiplyWithOffset(r,-g,-y),g=0,y=0),d.globalCompositeOperation=t.blendModes[f.blendMode];for(var _=0;_<v;_++){var x=m[_],b=x.alpha*n.alpha;if(!(b<=0)){var w=x.frame,T=w.canvasData,M=-w.halfWidth,S=-w.halfHeight;u.applyITRS(0,0,x.rotation,x.scaleX,x.scaleY),u.e=x.x-g,u.f=x.y-y,a.multiply(u,h),d.globalAlpha=b,d.save(),h.copyToContext(d),c&&(M=Math.round(M),S=Math.round(S)),d.imageSmoothingEnabled=!(!t.antialias||w.source.scaleMode),d.drawImage(w.source.image,T.x,T.y,T.width,T.height,M,S,T.width,T.height),d.restore()}}}}d.restore()}}},41887:(t,e,i)=>{var n=i(17517),r=i(57687),s=i(81769),o=i(14765);n.register("particles",(function(t,e){void 0===t&&(t={});var i=r(t,"key",null),n=r(t,"frame",null),a=s(t,"emitters",null),h=new o(this.scene,i,n,a);return void 0!==e&&(t.add=e),s(t,"add",!1)&&this.displayList.add(h),this.updateList.add(h),h}))},262:(t,e,i)=>{var n=i(81342),r=i(14765);n.register("particles",(function(t,e,i){var n=new r(this.scene,t,e,i);return this.displayList.add(n),this.updateList.add(n),n}))},78129:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(94782),r=i(10536),t.exports={renderWebGL:n,renderCanvas:r}},94782:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e.emitters.list,a=o.length;if(0!==a){var h=this.pipeline,u=h._tempMatrix1.copyFrom(r.matrix),l=h._tempMatrix2,c=h._tempMatrix3,d=h._tempMatrix4.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY);u.multiply(d),t.setPipeline(h);var p=r.roundPixels,f=e.defaultFrame.glTexture,m=n.getTintAppendFloatAlphaAndSwap;h.setTexture2D(f,0);for(var v=0;v<a;v++){var g=o[v],y=g.alive,_=y.length;if(g.visible&&0!==_){var x=r.scrollX*g.scrollFactorX,b=r.scrollY*g.scrollFactorY;s&&(u.multiplyWithOffset(s,-x,-b),x=0,b=0),t.setBlendMode(g.blendMode)&&h.setTexture2D(f,0),g.mask&&(g.mask.preRenderWebGL(t,g,r),h.setTexture2D(f,0));for(var w=0;w<_;w++){var T=y[w],M=T.alpha*r.alpha;if(!(M<=0)){var S=T.frame,E=-S.halfWidth,L=-S.halfHeight,A=E+S.width,D=L+S.height;c.applyITRS(0,0,T.rotation,T.scaleX,T.scaleY),c.e=T.x-x,c.f=T.y-b,u.multiply(c,l);var P=l.getX(E,L),C=l.getY(E,L),O=l.getX(E,D),k=l.getY(E,D),R=l.getX(A,D),I=l.getY(A,D),Y=l.getX(A,L),F=l.getY(A,L);p&&(P=Math.round(P),C=Math.round(C),O=Math.round(O),k=Math.round(k),R=Math.round(R),I=Math.round(I),Y=Math.round(Y),F=Math.round(F));var N=m(T.tint,M);h.batchQuad(P,C,O,k,R,I,Y,F,S.u0,S.v0,S.u1,S.v1,N,N,N,N,0,f,0)}}g.mask&&(g.mask.postRenderWebGL(t,r),h.setTexture2D(f,0))}}}}},88842:(t,e,i)=>{t.exports={GravityWell:i(50007),Particle:i(95423),ParticleEmitter:i(3631),ParticleEmitterManager:i(14765),Zones:i(82767)}},72347:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e){this.source=t,this.killOnEnter=e},willKill:function(t){var e=this.source.contains(t.x,t.y);return e&&this.killOnEnter||!e&&!this.killOnEnter}});t.exports=n},71521:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n,r){void 0===n&&(n=!1),void 0===r&&(r=!0),this.source=t,this.points=[],this.quantity=e,this.stepRate=i,this.yoyo=n,this.counter=-1,this.seamless=r,this._length=0,this._direction=0,this.updateSource()},updateSource:function(){if(this.points=this.source.getPoints(this.quantity,this.stepRate),this.seamless){var t=this.points[0],e=this.points[this.points.length-1];t.x===e.x&&t.y===e.y&&this.points.pop()}var i=this._length;return this._length=this.points.length,this._length<i&&this.counter>this._length&&(this.counter=this._length-1),this},changeSource:function(t){return this.source=t,this.updateSource()},getPoint:function(t){0===this._direction?(this.counter++,this.counter>=this._length&&(this.yoyo?(this._direction=1,this.counter=this._length-1):this.counter=0)):(this.counter--,-1===this.counter&&(this.yoyo?(this._direction=0,this.counter=0):this.counter=this._length-1));var e=this.points[this.counter];e&&(t.x=e.x,t.y=e.y)}});t.exports=n},46744:(t,e,i)=>{var n=i(47379),r=i(57148),s=new n({initialize:function(t){this.source=t,this._tempVec=new r},getPoint:function(t){var e=this._tempVec;this.source.getRandomPoint(e),t.x=e.x,t.y=e.y}});t.exports=s},82767:(t,e,i)=>{t.exports={DeathZone:i(72347),EdgeZone:i(71521),RandomZone:i(46744)}},95473:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(95681),o=new n({Extends:s,Mixins:[r.PathFollower],initialize:function(t,e,i,n,r,o){s.call(this,t,i,n,r,o),this.path=e},preUpdate:function(t,e){this.anims.update(t,e),this.pathUpdate(t)}});t.exports=o},19541:(t,e,i)=>{var n=i(81342),r=i(95473);n.register("follower",(function(t,e,i,n,s){var o=new r(this.scene,t,e,i,n,s);return this.displayList.add(o),this.updateList.add(o),o}))},34500:(t,e,i)=>{var n=i(47379),r=i(32507),s=new n({Extends:r,initialize:function(t,e,i,n,s){r.call(this,t,e,i,[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,1,1,1,0,0,1,1,1,0],[16777215,16777215,16777215,16777215,16777215,16777215],[1,1,1,1,1,1],n,s),this.resetPosition()},setFrame:function(t){return this.frame=this.texture.get(t),this.frame.cutWidth&&this.frame.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,t=this.frame,this.uv[0]=t.u0,this.uv[1]=t.v0,this.uv[2]=t.u0,this.uv[3]=t.v1,this.uv[4]=t.u1,this.uv[5]=t.v1,this.uv[6]=t.u0,this.uv[7]=t.v0,this.uv[8]=t.u1,this.uv[9]=t.v1,this.uv[10]=t.u1,this.uv[11]=t.v0,this},topLeftX:{get:function(){return this.x+this.vertices[0]},set:function(t){this.vertices[0]=t-this.x,this.vertices[6]=t-this.x}},topLeftY:{get:function(){return this.y+this.vertices[1]},set:function(t){this.vertices[1]=t-this.y,this.vertices[7]=t-this.y}},topRightX:{get:function(){return this.x+this.vertices[10]},set:function(t){this.vertices[10]=t-this.x}},topRightY:{get:function(){return this.y+this.vertices[11]},set:function(t){this.vertices[11]=t-this.y}},bottomLeftX:{get:function(){return this.x+this.vertices[2]},set:function(t){this.vertices[2]=t-this.x}},bottomLeftY:{get:function(){return this.y+this.vertices[3]},set:function(t){this.vertices[3]=t-this.y}},bottomRightX:{get:function(){return this.x+this.vertices[4]},set:function(t){this.vertices[4]=t-this.x,this.vertices[8]=t-this.x}},bottomRightY:{get:function(){return this.y+this.vertices[5]},set:function(t){this.vertices[5]=t-this.y,this.vertices[9]=t-this.y}},topLeftAlpha:{get:function(){return this.alphas[0]},set:function(t){this.alphas[0]=t,this.alphas[3]=t}},topRightAlpha:{get:function(){return this.alphas[5]},set:function(t){this.alphas[5]=t}},bottomLeftAlpha:{get:function(){return this.alphas[1]},set:function(t){this.alphas[1]=t}},bottomRightAlpha:{get:function(){return this.alphas[2]},set:function(t){this.alphas[2]=t,this.alphas[4]=t}},topLeftColor:{get:function(){return this.colors[0]},set:function(t){this.colors[0]=t,this.colors[3]=t}},topRightColor:{get:function(){return this.colors[5]},set:function(t){this.colors[5]=t}},bottomLeftColor:{get:function(){return this.colors[1]},set:function(t){this.colors[1]=t}},bottomRightColor:{get:function(){return this.colors[2]},set:function(t){this.colors[2]=t,this.colors[4]=t}},setTopLeft:function(t,e){return this.topLeftX=t,this.topLeftY=e,this},setTopRight:function(t,e){return this.topRightX=t,this.topRightY=e,this},setBottomLeft:function(t,e){return this.bottomLeftX=t,this.bottomLeftY=e,this},setBottomRight:function(t,e){return this.bottomRightX=t,this.bottomRightY=e,this},resetPosition:function(){var t=this.x,e=this.y,i=Math.floor(this.width/2),n=Math.floor(this.height/2);return this.setTopLeft(t-i,e-n),this.setTopRight(t+i,e-n),this.setBottomLeft(t-i,e+n),this.setBottomRight(t+i,e+n),this},resetAlpha:function(){var t=this.alphas;return t[0]=1,t[1]=1,t[2]=1,t[3]=1,t[4]=1,t[5]=1,this},resetColors:function(){var t=this.colors;return t[0]=16777215,t[1]=16777215,t[2]=16777215,t[3]=16777215,t[4]=16777215,t[5]=16777215,this},reset:function(){return this.resetPosition(),this.resetAlpha(),this.resetColors()}});t.exports=s},70121:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(34500);r.register("quad",(function(t,e){void 0===t&&(t={});var i=s(t,"x",0),r=s(t,"y",0),a=s(t,"key",null),h=s(t,"frame",null),u=new o(this.scene,i,r,a,h);return void 0!==e&&(t.add=e),n(this.scene,u,t),u}))},57367:(t,e,i)=>{var n=i(34500);i(81342).register("quad",(function(t,e,i,r){return this.displayList.add(new n(this.scene,t,e,i,r))}))},68343:(t,e,i)=>{var n=i(35869),r=i(22190),s=i(89429),o=i(47379),a=i(23096),h=i(50460),u=i(48165),l=i(90554),c=i(28544),d=i(19298),p=i(31027),f=new o({Extends:l,Mixins:[a.Alpha,a.BlendMode,a.ComputedSize,a.Crop,a.Depth,a.Flip,a.GetBounds,a.Mask,a.Origin,a.Pipeline,a.ScrollFactor,a.Tint,a.Transform,a.Visible,c],initialize:function(t,e,i,n,o,a,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=32),void 0===o&&(o=32),l.call(this,t,"RenderTexture"),this.renderer=t.sys.game.renderer,this.textureManager=t.sys.textures,this.globalTint=16777215,this.globalAlpha=1,this.canvas=null,this.framebuffer=null,this.dirty=!1,this._crop=this.resetCropObject(),this.texture=null,this.frame=null,this._saved=!1,void 0===a?(this.canvas=s.create2D(this,n,o),this.texture=t.sys.textures.addCanvas(p(),this.canvas),this.frame=this.texture.get()):(this.texture=t.sys.textures.get(a),this.frame=this.texture.get(u),this.canvas=this.frame.source.image,this._saved=!0,this.dirty=!0,this.width=this.frame.cutWidth,this.height=this.frame.cutHeight),this.context=this.canvas.getContext("2d"),this._eraseMode=!1,this.camera=new r(0,0,n,o),this.gl=null,this.glTexture=null;var c=this.renderer;if(c.type===h.WEBGL){var d=c.gl;this.gl=d,this.glTexture=this.frame.source.glTexture,this.drawGameObject=this.batchGameObjectWebGL,this.framebuffer=c.createFramebuffer(n,o,this.glTexture,!1)}else c.type===h.CANVAS&&(this.drawGameObject=this.batchGameObjectCanvas);this.camera.setScene(t),this.setPosition(e,i),void 0===a&&this.setSize(n,o),this.setOrigin(0,0),this.initPipeline()},setSize:function(t,e){return this.resize(t,e)},resize:function(t,e){if(void 0===e&&(e=t),t!==this.width||e!==this.height){if("__BASE"===this.frame.name){if(this.canvas.width=t,this.canvas.height=e,this.texture.width=t,this.texture.height=e,this.gl){var i=this.gl;this.renderer.deleteTexture(this.frame.source.glTexture),this.renderer.deleteFramebuffer(this.framebuffer);var n=this.renderer.createTexture2D(0,i.NEAREST,i.NEAREST,i.CLAMP_TO_EDGE,i.CLAMP_TO_EDGE,i.RGBA,null,t,e,!1);this.framebuffer=this.renderer.createFramebuffer(t,e,n,!1),this.frame.source.isRenderTexture=!0,this.frame.glTexture=n,this.glTexture=n}this.frame.source.width=t,this.frame.source.height=e,this.camera.setSize(t,e),this.frame.setSize(t,e),this.width=t,this.height=e}}else{var r=this.texture.getSourceImage();this.frame.cutX+t>r.width&&(t=r.width-this.frame.cutX),this.frame.cutY+e>r.height&&(e=r.height-this.frame.cutY),this.frame.setSize(t,e,this.frame.cutX,this.frame.cutY)}this.updateDisplayOrigin();var s=this.input;return s&&!s.customHitArea&&(s.hitArea.width=t,s.hitArea.height=e),this},setGlobalTint:function(t){return this.globalTint=t,this},setGlobalAlpha:function(t){return this.globalAlpha=t,this},saveTexture:function(t){return this.textureManager.renameTexture(this.texture.key,t),this._saved=!0,this.texture},fill:function(t,e,i,n,r,s){void 0===e&&(e=1),void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=this.frame.cutWidth),void 0===s&&(s=this.frame.cutHeight);var o=255&(t>>16|0),a=255&(t>>8|0),h=255&(0|t),u=this.gl,l=this.frame;if(this.camera.preRender(1,1),u){var c=this.camera._cx,p=this.camera._cy,f=this.camera._cw,m=this.camera._ch;this.renderer.setFramebuffer(this.framebuffer,!1),this.renderer.pushScissor(c,p,f,m,m);var v=this.pipeline;v.projOrtho(0,this.texture.width,0,this.texture.height,-1e3,1e3),v.drawFillRect(i,n,r,s,d.getTintFromFloats(o/255,a/255,h/255,1),e),this.renderer.setFramebuffer(null,!1),this.renderer.popScissor(),v.projOrtho(0,v.width,v.height,0,-1e3,1e3)}else this.renderer.setContext(this.context),this.context.fillStyle="rgba("+o+","+a+","+h+","+e+")",this.context.fillRect(i+l.cutX,n+l.cutY,r,s),this.renderer.setContext();return this.dirty=!0,this},clear:function(){if(this.dirty){var t=this.gl;if(t){var e=this.renderer;e.setFramebuffer(this.framebuffer,!0),this.frame.cutWidth===this.canvas.width&&this.frame.cutHeight===this.canvas.height||t.scissor(this.frame.cutX,this.frame.cutY,this.frame.cutWidth,this.frame.cutHeight),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT),e.setFramebuffer(null,!0)}else{var i=this.context;i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(this.frame.cutX,this.frame.cutY,this.frame.cutWidth,this.frame.cutHeight),i.restore()}this.dirty=!1}return this},erase:function(t,e,i){this._eraseMode=!0;var r=this.renderer.currentBlendMode;return this.renderer.setBlendMode(n.ERASE),this.draw(t,e,i,1,16777215),this.renderer.setBlendMode(r),this._eraseMode=!1,this},draw:function(t,e,i,n,r){void 0===n&&(n=this.globalAlpha),r=void 0===r?(this.globalTint>>16)+(65280&this.globalTint)+((255&this.globalTint)<<16):(r>>16)+(65280&r)+((255&r)<<16),Array.isArray(t)||(t=[t]);var s=this.gl;if(this.camera.preRender(1,1),s){var o=this.camera._cx,a=this.camera._cy,h=this.camera._cw,u=this.camera._ch;this.renderer.setFramebuffer(this.framebuffer,!1),this.renderer.pushScissor(o,a,h,u,u);var l=this.pipeline;l.projOrtho(0,this.texture.width,0,this.texture.height,-1e3,1e3),this.batchList(t,e,i,n,r),l.flush(),this.renderer.setFramebuffer(null,!1),this.renderer.popScissor(),l.projOrtho(0,l.width,l.height,0,-1e3,1e3)}else this.renderer.setContext(this.context),this.batchList(t,e,i,n,r),this.renderer.setContext();return this.dirty=!0,this},drawFrame:function(t,e,i,n,r,s){void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=this.globalAlpha),s=void 0===s?(this.globalTint>>16)+(65280&this.globalTint)+((255&this.globalTint)<<16):(s>>16)+(65280&s)+((255&s)<<16);var o=this.gl,a=this.textureManager.getFrame(t,e);if(a){if(this.camera.preRender(1,1),o){var h=this.camera._cx,u=this.camera._cy,l=this.camera._cw,c=this.camera._ch;this.renderer.setFramebuffer(this.framebuffer,!1),this.renderer.pushScissor(h,u,l,c,c);var d=this.pipeline;d.projOrtho(0,this.texture.width,0,this.texture.height,-1e3,1e3),d.batchTextureFrame(a,i+this.frame.cutX,n+this.frame.cutY,s,r,this.camera.matrix,null),d.flush(),this.renderer.setFramebuffer(null,!1),this.renderer.popScissor(),d.projOrtho(0,d.width,d.height,0,-1e3,1e3)}else this.batchTextureFrame(a,i+this.frame.cutX,n+this.frame.cutY,r,s);this.dirty=!0}return this},batchList:function(t,e,i,n,r){for(var s=0;s<t.length;s++){var o=t[s];o&&o!==this&&(o.renderWebGL||o.renderCanvas?this.drawGameObject(o,e,i):o.isParent||o.list?this.batchGroup(o.getChildren(),e,i):"string"==typeof o?this.batchTextureFrameKey(o,null,e,i,n,r):o instanceof u?this.batchTextureFrame(o,e,i,n,r):Array.isArray(o)&&this.batchList(o,e,i,n,r))}},batchGroup:function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=0),e+=this.frame.cutX,i+=this.frame.cutY;for(var n=0;n<t.length;n++){var r=t[n];if(r.willRender()){var s=r.x+e,o=r.y+i;this.drawGameObject(r,s,o)}}},batchGameObjectWebGL:function(t,e,i){void 0===e&&(e=t.x),void 0===i&&(i=t.y);var n=t.x,r=t.y;this._eraseMode||this.renderer.setBlendMode(t.blendMode),t.setPosition(e+this.frame.cutX,i+this.frame.cutY),t.renderWebGL(this.renderer,t,0,this.camera,null),t.setPosition(n,r)},batchGameObjectCanvas:function(t,e,i){void 0===e&&(e=t.x),void 0===i&&(i=t.y);var r=t.x,s=t.y;if(this._eraseMode){var o=t.blendMode;t.blendMode=n.ERASE}t.setPosition(e+this.frame.cutX,i+this.frame.cutY),t.renderCanvas(this.renderer,t,0,this.camera,null),t.setPosition(r,s),this._eraseMode&&(t.blendMode=o)},batchTextureFrameKey:function(t,e,i,n,r,s){var o=this.textureManager.getFrame(t,e);o&&this.batchTextureFrame(o,i,n,r,s)},batchTextureFrame:function(t,e,i,n,r){if(void 0===e&&(e=0),void 0===i&&(i=0),e+=this.frame.cutX,i+=this.frame.cutY,this.gl)this.pipeline.batchTextureFrame(t,e,i,r,n,this.camera.matrix,null);else{var s=this.context,o=t.canvasData,a=t.source.image,h=this.camera.matrix;s.globalAlpha=this.globalAlpha,s.setTransform(h[0],h[1],h[2],h[3],h[4],h[5]),s.drawImage(a,o.x,o.y,o.width,o.height,e,i,o.width,o.height)}},snapshotArea:function(t,e,i,n,r,s,o){return this.gl?this.renderer.snapshotFramebuffer(this.framebuffer,this.width,this.height,r,!1,t,e,i,n,s,o):this.renderer.snapshotCanvas(this.canvas,r,!1,t,e,i,n,s,o),this},snapshot:function(t,e,i){return this.gl?this.renderer.snapshotFramebuffer(this.framebuffer,this.width,this.height,t,!1,0,0,this.width,this.height,e,i):this.renderer.snapshotCanvas(this.canvas,t,!1,0,0,this.width,this.height,e,i),this},snapshotPixel:function(t,e,i){return this.gl?this.renderer.snapshotFramebuffer(this.framebuffer,this.width,this.height,i,!0,t,e):this.renderer.snapshotCanvas(this.canvas,i,!0,t,e),this},preDestroy:function(){this._saved||(s.remove(this.canvas),this.gl&&this.renderer.deleteFramebuffer(this.framebuffer),this.texture.destroy(),this.camera.destroy(),this.canvas=null,this.context=null,this.framebuffer=null,this.texture=null,this.glTexture=null)}});t.exports=f},26999:t=>{t.exports=function(t,e,i,n,r){t.batchSprite(e,e.frame,n,r)}},49830:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(68343);r.register("renderTexture",(function(t,e){void 0===t&&(t={});var i=s(t,"x",0),r=s(t,"y",0),a=s(t,"width",32),h=s(t,"height",32),u=s(t,"key",void 0),l=s(t,"frame",void 0),c=new o(this.scene,i,r,a,h,u,l);return void 0!==e&&(t.add=e),n(this.scene,c,t),c}))},89107:(t,e,i)=>{var n=i(81342),r=i(68343);n.register("renderTexture",(function(t,e,i,n,s,o){return this.displayList.add(new r(this.scene,t,e,i,n,s,o))}))},28544:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(1500),r=i(26999),t.exports={renderWebGL:n,renderCanvas:r}},1500:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e.frame,a=o.width,h=o.height,u=n.getTintAppendFloatAlpha;this.pipeline.batchTexture(e,o.glTexture,a,h,e.x,e.y,a,h,e.scaleX,e.scaleY,e.rotation,e.flipX,!e.flipY,e.scrollFactorX,e.scrollFactorY,e.displayOriginX,e.displayOriginY,0,0,a,h,u(e._tintTL,r.alpha*e._alphaTL),u(e._tintTR,r.alpha*e._alphaTR),u(e._tintBL,r.alpha*e._alphaBL),u(e._tintBR,r.alpha*e._alphaBR),e._isTinted&&e.tintFill,0,0,r,s),t.setBlankTexture(!0)}},18741:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(93953),a=i(57148),h=new n({Extends:s,Mixins:[r.AlphaSingle,r.BlendMode,r.Depth,r.Flip,r.Mask,r.Pipeline,r.Size,r.Texture,r.Transform,r.Visible,r.ScrollFactor,o],initialize:function(t,e,i,n,o,h,u,l,c){void 0===n&&(n="__DEFAULT"),void 0===h&&(h=2),void 0===u&&(u=!0),s.call(this,t,"Rope"),this.anims=new r.Animation(this),this.points=h,this.vertices,this.uv,this.colors,this.alphas,this.tintFill="__DEFAULT"===n?2:0,this.dirty=!1,this.horizontal=u,this._flipX=!1,this._flipY=!1,this._perp=new a,this.debugCallback=null,this.debugGraphic=null,this.setTexture(n,o),this.setPosition(e,i),this.setSizeToFrame(),this.initPipeline("TextureTintStripPipeline"),Array.isArray(h)&&this.resizeArrays(h.length),this.setPoints(h,l,c),this.updateVertices()},preUpdate:function(t,e){var i=this.anims.currentFrame;this.anims.update(t,e),this.anims.currentFrame!==i&&(this.updateUVs(),this.updateVertices())},play:function(t,e,i){return this.anims.play(t,e,i),this},setDirty:function(){return this.dirty=!0,this},setHorizontal:function(t,e,i){return void 0===t&&(t=this.points.length),this.horizontal?this:(this.horizontal=!0,this.setPoints(t,e,i))},setVertical:function(t,e,i){return void 0===t&&(t=this.points.length),this.horizontal?(this.horizontal=!1,this.setPoints(t,e,i)):this},setTintFill:function(t){return void 0===t&&(t=0),this.tintFill=t,this},setAlphas:function(t,e){var i=this.points.length;if(i<1)return this;var n,r=this.alphas;void 0===t?t=[1]:Array.isArray(t)||void 0!==e||(t=[t]);var s=0;if(void 0!==e)for(n=0;n<i;n++)r[s=2*n]=t,r[s+1]=e;else if(t.length===i)for(n=0;n<i;n++)r[s=2*n]=t[n],r[s+1]=t[n];else{var o=t[0];for(n=0;n<i;n++)s=2*n,t.length>s&&(o=t[s]),r[s]=o,t.length>s+1&&(o=t[s+1]),r[s+1]=o}return this},setColors:function(t){var e=this.points.length;if(e<1)return this;var i,n=this.colors;void 0===t?t=[16777215]:Array.isArray(t)||(t=[t]);var r=0;if(t.length===e)for(i=0;i<e;i++)n[r=2*i]=t[i],n[r+1]=t[i];else{var s=t[0];for(i=0;i<e;i++)r=2*i,t.length>r&&(s=t[r]),n[r]=s,t.length>r+1&&(s=t[r+1]),n[r+1]=s}return this},setPoints:function(t,e,i){if(void 0===t&&(t=2),"number"==typeof t){var n,r,s,o=t;if(o<2&&(o=2),t=[],this.horizontal)for(s=-this.frame.halfWidth,r=this.frame.width/(o-1),n=0;n<o;n++)t.push({x:s+n*r,y:0});else for(s=-this.frame.halfHeight,r=this.frame.height/(o-1),n=0;n<o;n++)t.push({x:0,y:s+n*r})}var a=t.length,h=this.points.length;return a<1?(console.warn("Rope: Not enough points given"),this):(1===a&&(t.unshift({x:0,y:0}),a++),h!==a&&this.resizeArrays(a),this.points=t,this.updateUVs(),null!=e&&this.setColors(e),null!=i&&this.setAlphas(i),this)},updateUVs:function(){for(var t=this.uv,e=this.points.length,i=this.frame.u0,n=this.frame.v0,r=this.frame.u1,s=this.frame.v1,o=(r-i)/(e-1),a=(s-n)/(e-1),h=0;h<e;h++){var u,l,c,d,p=4*h;this.horizontal?(this._flipX?(u=r-h*o,c=r-h*o):(u=i+h*o,c=i+h*o),this._flipY?(l=s,d=n):(l=n,d=s)):(this._flipX?(u=i,c=r):(u=r,c=i),this._flipY?(l=s-h*a,d=s-h*a):(l=n+h*a,d=n+h*a)),t[p+0]=u,t[p+1]=l,t[p+2]=c,t[p+3]=d}return this},resizeArrays:function(t){var e=this.colors,i=this.alphas;this.vertices=new Float32Array(4*t),this.uv=new Float32Array(4*t),e=new Uint32Array(2*t),i=new Float32Array(2*t);for(var n=0;n<2*t;n++)e[n]=16777215,i[n]=1;return this.colors=e,this.alphas=i,this.dirty=!0,this},updateVertices:function(){var t=this._perp,e=this.points,i=this.vertices,n=e.length;if(this.dirty=!1,!(n<1)){for(var r,s=e[0],o=this.horizontal?this.frame.halfHeight:this.frame.halfWidth,a=0;a<n;a++){var h=e[a],u=4*a;r=a<n-1?e[a+1]:h,t.x=r.y-s.y,t.y=-(r.x-s.x);var l=t.length();t.x/=l,t.y/=l,t.x*=o,t.y*=o,i[u]=h.x+t.x,i[u+1]=h.y+t.y,i[u+2]=h.x-t.x,i[u+3]=h.y-t.y,s=h}return this}},setDebug:function(t,e){return this.debugGraphic=t,this.debugCallback=t||e?e||this.renderDebugVerts:null,this},renderDebugVerts:function(t,e,i){var n=t.debugGraphic,r=i[0],s=i[1],o=i[2],a=i[3];n.lineBetween(r,s,o,a);for(var h=4;h<e;h+=4){var u=i[h+0],l=i[h+1],c=i[h+2],d=i[h+3];n.lineBetween(r,s,u,l),n.lineBetween(o,a,c,d),n.lineBetween(o,a,u,l),n.lineBetween(u,l,c,d),r=u,s=l,o=c,a=d}},preDestroy:function(){this.anims.destroy(),this.anims=void 0,this.points=null,this.vertices=null,this.uv=null,this.colors=null,this.alphas=null,this.debugCallback=null,this.debugGraphic=null},flipX:{get:function(){return this._flipX},set:function(t){return this._flipX=t,this.updateUVs()}},flipY:{get:function(){return this._flipY},set:function(t){return this._flipY=t,this.updateUVs()}}});t.exports=h},3904:t=>{t.exports=function(){}},56546:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(86652),a=i(18741);r.register("rope",(function(t,e){void 0===t&&(t={});var i=s(t,"key",null),r=s(t,"frame",null),h=s(t,"horizontal",!0),u=o(t,"points",void 0),l=o(t,"colors",void 0),c=o(t,"alphas",void 0),d=new a(this.scene,0,0,i,r,u,h,l,c);return void 0!==e&&(t.add=e),n(this.scene,d,t),d}))},17100:(t,e,i)=>{var n=i(18741);i(81342).register("rope",(function(t,e,i,r,s,o,a,h){var u=new n(this.scene,t,e,i,r,s,o,a,h);return this.displayList.add(u),this.updateList.add(u)}))},93953:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(16682),r=i(3904),t.exports={renderWebGL:n,renderCanvas:r}},16682:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=e.pipeline;t.setPipeline(o,e);var a=o._tempMatrix1,h=o._tempMatrix2,u=o._tempMatrix3;h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y,a.multiply(h,u)):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY,a.multiply(h,u));var l=e.frame.glTexture,c=e.vertices,d=e.uv,p=e.colors,f=e.alphas,m=e.alpha,v=n.getTintAppendFloatAlphaAndSwap,g=r.roundPixels,y=c.length,_=Math.floor(.5*y);o.flush(),o.setTexture2D(l,0);var x=o.vertexViewF32,b=o.vertexViewU32,w=o.vertexCount*o.vertexComponentCount-1,T=0,M=e.tintFill;e.dirty&&e.updateVertices();for(var S=e.debugCallback,E=[],L=0;L<y;L+=2){var A=c[L+0],D=c[L+1],P=A*u.a+D*u.c+u.e,C=A*u.b+D*u.d+u.f;g&&(P=Math.round(P),C=Math.round(C)),x[++w]=P,x[++w]=C,x[++w]=d[L+0],x[++w]=d[L+1],x[++w]=M,b[++w]=v(p[T],r.alpha*(f[T]*m)),T++,S&&(E[L+0]=P,E[L+1]=C)}S&&S.call(e,e,y,E),o.vertexCount+=_}},29274:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(81769),a=i(80933),h=i(68968),u=i(53887),l=i(65492),c=new n({Extends:s,Mixins:[r.ComputedSize,r.Depth,r.GetBounds,r.Mask,r.Origin,r.ScrollFactor,r.Transform,r.Visible,u],initialize:function(t,e,i,n,r,o,a,h){void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=128),void 0===o&&(o=128),s.call(this,t,"Shader"),this.blendMode=-1,this.shader;var u=t.sys.renderer;this.renderer=u,this.gl=u.gl,this.vertexData=new ArrayBuffer(2*Float32Array.BYTES_PER_ELEMENT*6),this.vertexBuffer=u.createVertexBuffer(this.vertexData.byteLength,this.gl.STREAM_DRAW),this.program=null,this.bytes=new Uint8Array(this.vertexData),this.vertexViewF32=new Float32Array(this.vertexData),this._tempMatrix1=new l,this._tempMatrix2=new l,this._tempMatrix3=new l,this.viewMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.projectionMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.uniforms={},this.pointer=null,this._rendererWidth=u.width,this._rendererHeight=u.height,this._textureCount=0,this.framebuffer=null,this.glTexture=null,this.renderToTexture=!1,this.texture=null,this.setPosition(i,n),this.setSize(r,o),this.setOrigin(.5,.5),this.setShader(e,a,h)},willRender:function(t){return!!this.renderToTexture||!(s.RENDER_MASK!==this.renderFlags||0!==this.cameraFilter&&this.cameraFilter&t.id)},setRenderToTexture:function(t,e){if(void 0===e&&(e=!1),!this.renderToTexture){var i=this.width,n=this.height,r=this.renderer;this.glTexture=r.createTextureFromSource(null,i,n,0),this.glTexture.flipY=e,this.framebuffer=r.createFramebuffer(i,n,this.glTexture,!1),this._rendererWidth=i,this._rendererHeight=n,this.renderToTexture=!0,this.projOrtho(0,this.width,this.height,0),t&&(this.texture=this.scene.sys.textures.addGLTexture(t,this.glTexture,i,n))}if(this.shader){var s=r.currentPipeline;r.clearPipeline(),this.load(),this.flush(),r.rebindPipeline(s)}return this},setShader:function(t,e,i){if(void 0===e&&(e=[]),"string"==typeof t){var n=this.scene.sys.cache.shader;if(!n.has(t))return console.warn("Shader missing: "+t),this;this.shader=n.get(t)}else this.shader=t;var r=this.gl,s=this.renderer;this.program&&r.deleteProgram(this.program);var o=s.createProgram(this.shader.vertexSrc,this.shader.fragmentSrc);s.setMatrix4(o,"uViewMatrix",!1,this.viewMatrix),s.setMatrix4(o,"uProjectionMatrix",!1,this.projectionMatrix),s.setFloat2(o,"uResolution",this.width,this.height),this.program=o;var h=new Date,u={resolution:{type:"2f",value:{x:this.width,y:this.height}},time:{type:"1f",value:0},mouse:{type:"2f",value:{x:this.width/2,y:this.height/2}},date:{type:"4fv",value:[h.getFullYear(),h.getMonth(),h.getDate(),60*h.getHours()*60+60*h.getMinutes()+h.getSeconds()]},sampleRate:{type:"1f",value:44100},iChannel0:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel1:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel2:{type:"sampler2D",value:null,textureData:{repeat:!0}},iChannel3:{type:"sampler2D",value:null,textureData:{repeat:!0}}};this.shader.uniforms?this.uniforms=a(!0,{},this.shader.uniforms,u):this.uniforms=u;for(var l=0;l<4;l++)e[l]&&this.setSampler2D("iChannel"+l,e[l],l,i);return this.initUniforms(),this.projOrtho(0,this._rendererWidth,this._rendererHeight,0),this},setPointer:function(t){return this.pointer=t,this},projOrtho:function(t,e,i,n){var r=1/(t-e),s=1/(i-n),o=this.projectionMatrix;o[0]=-2*r,o[5]=-2*s,o[10]=-.001,o[12]=(t+e)*r,o[13]=(n+i)*s,o[14]=-0;var a=this.program;this.renderer.setMatrix4(a,"uProjectionMatrix",!1,this.projectionMatrix),this._rendererWidth=e,this._rendererHeight=i},initUniforms:function(){var t=this.gl,e=this.renderer.glFuncMap,i=this.program;for(var n in this._textureCount=0,this.uniforms){var r=this.uniforms[n],s=r.type,o=e[s];r.uniformLocation=t.getUniformLocation(i,n),"sampler2D"!==s&&(r.glMatrix=o.matrix,r.glValueLength=o.length,r.glFunc=o.func)}},setSampler2DBuffer:function(t,e,i,n,r,s){void 0===r&&(r=0),void 0===s&&(s={});var o=this.uniforms[t];return o.value=e,s.width=i,s.height=n,o.textureData=s,this._textureCount=r,this.initSampler2D(o),this},setSampler2D:function(t,e,i,n){void 0===i&&(i=0);var r=this.scene.sys.textures;if(r.exists(e)){var s=r.getFrame(e),o=this.uniforms[t],a=s.source;o.textureKey=e,o.source=a.image,o.value=s.glTexture,a.isGLTexture&&(n||(n={}),n.width=a.width,n.height=a.height),n&&(o.textureData=n),this._textureCount=i,this.initSampler2D(o)}return this},setUniform:function(t,e){return h(this.uniforms,t,e),this},getUniform:function(t){return o(this.uniforms,t,null)},setChannel0:function(t,e){return this.setSampler2D("iChannel0",t,0,e)},setChannel1:function(t,e){return this.setSampler2D("iChannel1",t,1,e)},setChannel2:function(t,e){return this.setSampler2D("iChannel2",t,2,e)},setChannel3:function(t,e){return this.setSampler2D("iChannel3",t,3,e)},initSampler2D:function(t){if(t.value){var e=this.gl;e.activeTexture(e.TEXTURE0+this._textureCount),e.bindTexture(e.TEXTURE_2D,t.value);var i=t.textureData;if(i){var n=e[o(i,"magFilter","linear").toUpperCase()],r=e[o(i,"minFilter","linear").toUpperCase()],s=e[o(i,"wrapS","repeat").toUpperCase()],a=e[o(i,"wrapT","repeat").toUpperCase()],h=e[o(i,"format","rgba").toUpperCase()];if(i.repeat&&(s=e.REPEAT,a=e.REPEAT),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!!i.flipY),i.width){var u=o(i,"width",512),l=o(i,"height",2),c=o(i,"border",0);e.texImage2D(e.TEXTURE_2D,0,h,u,l,c,h,e.UNSIGNED_BYTE,null)}else e.texImage2D(e.TEXTURE_2D,0,h,e.RGBA,e.UNSIGNED_BYTE,t.source);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,r),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,s),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,a)}this.renderer.setProgram(this.program),e.uniform1i(t.uniformLocation,this._textureCount),this._textureCount++}},syncUniforms:function(){var t,e,i,n,r,s=this.gl,o=this.uniforms,a=0;for(var h in o)i=(t=o[h]).glFunc,e=t.glValueLength,n=t.uniformLocation,null!==(r=t.value)&&(1===e?t.glMatrix?i.call(s,n,t.transpose,r):i.call(s,n,r):2===e?i.call(s,n,r.x,r.y):3===e?i.call(s,n,r.x,r.y,r.z):4===e?i.call(s,n,r.x,r.y,r.z,r.w):"sampler2D"===t.type&&(s.activeTexture(s["TEXTURE"+a]),s.bindTexture(s.TEXTURE_2D,r),s.uniform1i(n,a),a++))},load:function(t){var e=this.gl,i=this.width,n=this.height,r=this.renderer,s=this.program,o=this.viewMatrix;if(!this.renderToTexture){var a=-this._displayOriginX,h=-this._displayOriginY;o[0]=t[0],o[1]=t[1],o[4]=t[2],o[5]=t[3],o[8]=t[4],o[9]=t[5],o[12]=o[0]*a+o[4]*h,o[13]=o[1]*a+o[5]*h}e.useProgram(s),e.uniformMatrix4fv(e.getUniformLocation(s,"uViewMatrix"),!1,o),e.uniform2f(e.getUniformLocation(s,"uResolution"),this.width,this.height);var u=this.uniforms,l=u.resolution;l.value.x=i,l.value.y=n,u.time.value=r.game.loop.getDuration();var c=this.pointer;if(c){var d=u.mouse,p=c.x/i,f=1-c.y/n;d.value.x=p.toFixed(2),d.value.y=f.toFixed(2)}this.syncUniforms()},flush:function(){var t=this.width,e=this.height,i=this.program,n=this.gl,r=this.vertexBuffer,s=this.renderer,o=2*Float32Array.BYTES_PER_ELEMENT;this.renderToTexture&&(s.setFramebuffer(this.framebuffer),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT)),n.bindBuffer(n.ARRAY_BUFFER,r);var a=n.getAttribLocation(i,"inPosition");-1!==a&&(n.enableVertexAttribArray(a),n.vertexAttribPointer(a,2,n.FLOAT,!1,o,0));var h=this.vertexViewF32;h[3]=e,h[4]=t,h[5]=e,h[8]=t,h[9]=e,h[10]=t;n.bufferSubData(n.ARRAY_BUFFER,0,this.bytes.subarray(0,6*o)),n.drawArrays(n.TRIANGLES,0,6),this.renderToTexture&&s.setFramebuffer(null,!1)},setAlpha:function(){},setBlendMode:function(){},preDestroy:function(){var t=this.gl;t.deleteProgram(this.program),t.deleteBuffer(this.vertexBuffer),this.renderToTexture&&(this.renderer.deleteFramebuffer(this.framebuffer),this.texture.destroy(),this.framebuffer=null,this.glTexture=null,this.texture=null)}});t.exports=c},89752:t=>{t.exports=function(){}},34386:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(29274);r.register("shader",(function(t,e){void 0===t&&(t={});var i=s(t,"key",null),r=s(t,"x",0),a=s(t,"y",0),h=s(t,"width",128),u=s(t,"height",128),l=new o(this.scene,i,r,a,h,u);return void 0!==e&&(t.add=e),n(this.scene,l,t),l}))},61785:(t,e,i)=>{var n=i(29274);i(81342).register("shader",(function(t,e,i,r,s,o,a){return this.displayList.add(new n(this.scene,t,e,i,r,s,o,a))}))},53887:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(3362),r=i(89752),t.exports={renderWebGL:n,renderCanvas:r}},3362:t=>{t.exports=function(t,e,i,n,r){if(e.shader){var s=t.currentPipeline;if(t.clearPipeline(),e.renderToTexture)e.load(),e.flush();else{var o=e._tempMatrix1,a=e._tempMatrix2,h=e._tempMatrix3;a.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),o.copyFrom(n.matrix),r?(o.multiplyWithOffset(r,-n.scrollX*e.scrollFactorX,-n.scrollY*e.scrollFactorY),a.e=e.x,a.f=e.y):(a.e-=n.scrollX*e.scrollFactorX,a.f-=n.scrollY*e.scrollFactorY),o.multiply(a,h),t.width===e._rendererWidth&&t.height===e._rendererHeight||e.projOrtho(0,t.width,t.height,0),e.load(h.matrix),e.flush()}t.rebindPipeline(s)}}},94849:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s,o){for(var a=n.getTintAppendFloatAlphaAndSwap(i.fillColor,i.fillAlpha*r),h=i.pathData,u=i.pathIndexes,l=0;l<u.length;l+=3){var c=2*u[l],d=2*u[l+1],p=2*u[l+2],f=h[c+0]-s,m=h[c+1]-o,v=h[d+0]-s,g=h[d+1]-o,y=h[p+0]-s,_=h[p+1]-o,x=e.getX(f,m),b=e.getY(f,m),w=e.getX(v,g),T=e.getY(v,g),M=e.getX(y,_),S=e.getY(y,_);t.setTexture2D(),t.batchTri(x,b,w,T,M,S,0,0,1,1,a,a,a,t.tintEffect)}}},71805:t=>{t.exports=function(t,e,i,n){var r=i||e.fillColor,s=n||e.fillAlpha,o=(16711680&r)>>>16,a=(65280&r)>>>8,h=255&r;t.fillStyle="rgba("+o+","+a+","+h+","+s+")"}},84233:t=>{t.exports=function(t,e,i,n){var r=i||e.strokeColor,s=n||e.strokeAlpha,o=(16711680&r)>>>16,a=(65280&r)>>>8,h=255&r;t.strokeStyle="rgba("+o+","+a+","+h+","+s+")",t.lineWidth=e.lineWidth}},31641:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(1137),a=new n({Extends:s,Mixins:[r.AlphaSingle,r.BlendMode,r.ComputedSize,r.Depth,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.ScrollFactor,r.Transform,r.Visible],initialize:function(t,e,i){void 0===e&&(e="Shape"),s.call(this,t,e),this.geom=i,this.pathData=[],this.pathIndexes=[],this.fillColor=16777215,this.fillAlpha=1,this.strokeColor=16777215,this.strokeAlpha=1,this.lineWidth=1,this.isFilled=!1,this.isStroked=!1,this.closePath=!0,this._tempLine=new o,this.initPipeline()},setFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.isFilled=!1:(this.fillColor=t,this.fillAlpha=e,this.isFilled=!0),this},setStrokeStyle:function(t,e,i){return void 0===i&&(i=1),void 0===t?this.isStroked=!1:(this.lineWidth=t,this.strokeColor=e,this.strokeAlpha=i,this.isStroked=!0),this},setClosePath:function(t){return this.closePath=t,this},preDestroy:function(){this.geom=null,this._tempLine=null,this.pathData=[],this.pathIndexes=[]}});t.exports=a},17331:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=t.strokeTint,a=n.getTintAppendFloatAlphaAndSwap(e.strokeColor,e.strokeAlpha*i);o.TL=a,o.TR=a,o.BL=a,o.BR=a;var h=e.pathData,u=h.length-1,l=e.lineWidth,c=l/2,d=h[0]-r,p=h[1]-s;e.closePath||(u-=2);for(var f=2;f<u;f+=2){var m=h[f]-r,v=h[f+1]-s;t.setTexture2D(),t.batchLine(d,p,m,v,c,c,l,f-2,!!e.closePath&&f===u-1),d=m,p=v}}},66082:(t,e,i)=>{var n=i(86583),r=i(47379),s=i(98436),o=i(43574),a=i(78265),h=i(14302),u=i(31641),l=new r({Extends:u,Mixins:[n],initialize:function(t,e,i,n,r,s,o,h,l){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=128),void 0===r&&(r=0),void 0===s&&(s=360),void 0===o&&(o=!1),u.call(this,t,"Arc",new a(0,0,n)),this._startAngle=r,this._endAngle=s,this._anticlockwise=o,this._iterations=.01,this.setPosition(e,i);var c=2*this.geom.radius;this.setSize(c,c),void 0!==h&&this.setFillStyle(h,l),this.updateDisplayOrigin(),this.updateData()},iterations:{get:function(){return this._iterations},set:function(t){this._iterations=t,this.updateData()}},radius:{get:function(){return this.geom.radius},set:function(t){this.geom.radius=t;var e=2*t;this.setSize(e,e),this.updateDisplayOrigin(),this.updateData()}},startAngle:{get:function(){return this._startAngle},set:function(t){this._startAngle=t,this.updateData()}},endAngle:{get:function(){return this._endAngle},set:function(t){this._endAngle=t,this.updateData()}},anticlockwise:{get:function(){return this._anticlockwise},set:function(t){this._anticlockwise=t,this.updateData()}},setRadius:function(t){return this.radius=t,this},setIterations:function(t){return void 0===t&&(t=.01),this.iterations=t,this},setStartAngle:function(t,e){return this._startAngle=t,void 0!==e&&(this._anticlockwise=e),this.updateData()},setEndAngle:function(t,e){return this._endAngle=t,void 0!==e&&(this._anticlockwise=e),this.updateData()},updateData:function(){var t=this._iterations,e=t,i=this.geom.radius,n=s(this._startAngle),r=s(this._endAngle),a=i,u=i;r-=n,this._anticlockwise?r<-h.PI2?r=-h.PI2:r>0&&(r=-h.PI2+r%h.PI2):r>h.PI2?r=h.PI2:r<0&&(r=h.PI2+r%h.PI2);for(var l,c=[a+Math.cos(n)*i,u+Math.sin(n)*i];e<1;)l=r*e+n,c.push(a+Math.cos(l)*i,u+Math.sin(l)*i),e+=t;return l=r+n,c.push(a+Math.cos(l)*i,u+Math.sin(l)*i),c.push(a+Math.cos(n)*i,u+Math.sin(n)*i),this.pathIndexes=o(c),this.pathData=c,this}});t.exports=l},21749:(t,e,i)=>{var n=i(98436),r=i(71805),s=i(84233),o=i(55468);t.exports=function(t,e,i,a,h){var u=t.currentContext;if(o(t,u,e,a,h)){var l=e.radius;u.beginPath(),u.arc(l-e.originX*(2*l),l-e.originY*(2*l),l,n(e._startAngle),n(e._endAngle),e.anticlockwise),e.closePath&&u.closePath(),e.isFilled&&(r(u,e),u.fill()),e.isStroked&&(s(u,e),u.stroke()),u.restore()}}},44729:(t,e,i)=>{var n=i(66082),r=i(81342);r.register("arc",(function(t,e,i,r,s,o,a,h){return this.displayList.add(new n(this.scene,t,e,i,r,s,o,a,h))})),r.register("circle",(function(t,e,i,r,s){return this.displayList.add(new n(this.scene,t,e,i,0,360,!1,r,s))}))},86583:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(40945),r=i(21749),t.exports={renderWebGL:n,renderCanvas:r}},40945:(t,e,i)=>{var n=i(94849),r=i(17331);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;e.isFilled&&n(a,l,e,p,c,d),e.isStroked&&r(a,e,p,c,d)}},56653:(t,e,i)=>{var n=i(47379),r=i(46917),s=i(43574),o=i(38092),a=i(31641),h=new n({Extends:a,Mixins:[r],initialize:function(t,e,i,n,r,s){void 0===e&&(e=0),void 0===i&&(i=0),a.call(this,t,"Curve",n),this._smoothness=32,this._curveBounds=new o,this.closePath=!1,this.setPosition(e,i),void 0!==r&&this.setFillStyle(r,s),this.updateData()},smoothness:{get:function(){return this._smoothness},set:function(t){this._smoothness=t,this.updateData()}},setSmoothness:function(t){return this._smoothness=t,this.updateData()},updateData:function(){var t=this._curveBounds,e=this._smoothness;this.geom.getBounds(t,e),this.setSize(t.width,t.height),this.updateDisplayOrigin();for(var i=[],n=this.geom.getPoints(e),r=0;r<n.length;r++)i.push(n[r].x,n[r].y);return i.push(n[0].x,n[0].y),this.pathIndexes=s(i),this.pathData=i,this}});t.exports=h},44381:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX+e._curveBounds.x,l=e._displayOriginY+e._curveBounds.y,c=e.pathData,d=c.length-1,p=c[0]-u,f=c[1]-l;h.beginPath(),h.moveTo(p,f),e.closePath||(d-=2);for(var m=2;m<d;m+=2){var v=c[m]-u,g=c[m+1]-l;h.lineTo(v,g)}e.closePath&&h.closePath(),e.isFilled&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},18164:(t,e,i)=>{var n=i(81342),r=i(56653);n.register("curve",(function(t,e,i,n,s){return this.displayList.add(new r(this.scene,t,e,i,n,s))}))},46917:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(64700),r=i(44381),t.exports={renderWebGL:n,renderCanvas:r}},64700:(t,e,i)=>{var n=i(94849),r=i(17331);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX+e._curveBounds.x,d=e._displayOriginY+e._curveBounds.y,p=s.alpha*e.alpha;e.isFilled&&n(a,l,e,p,c,d),e.isStroked&&r(a,e,p,c,d)}},62291:(t,e,i)=>{var n=i(47379),r=i(43574),s=i(9469),o=i(38341),a=i(31641),h=new n({Extends:a,Mixins:[s],initialize:function(t,e,i,n,r,s,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=128),void 0===r&&(r=128),a.call(this,t,"Ellipse",new o(n/2,r/2,n,r)),this._smoothness=64,this.setPosition(e,i),this.width=n,this.height=r,void 0!==s&&this.setFillStyle(s,h),this.updateDisplayOrigin(),this.updateData()},smoothness:{get:function(){return this._smoothness},set:function(t){this._smoothness=t,this.updateData()}},setSize:function(t,e){return this.geom.setSize(t,e),this.updateData()},setSmoothness:function(t){return this._smoothness=t,this.updateData()},updateData:function(){for(var t=[],e=this.geom.getPoints(this._smoothness),i=0;i<e.length;i++)t.push(e[i].x,e[i].y);return t.push(e[0].x,e[0].y),this.pathIndexes=r(t),this.pathData=t,this}});t.exports=h},43186:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX,l=e._displayOriginY,c=e.pathData,d=c.length-1,p=c[0]-u,f=c[1]-l;h.beginPath(),h.moveTo(p,f),e.closePath||(d-=2);for(var m=2;m<d;m+=2){var v=c[m]-u,g=c[m+1]-l;h.lineTo(v,g)}h.closePath(),e.isFilled&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},70608:(t,e,i)=>{var n=i(62291);i(81342).register("ellipse",(function(t,e,i,r,s,o){return this.displayList.add(new n(this.scene,t,e,i,r,s,o))}))},9469:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(28484),r=i(43186),t.exports={renderWebGL:n,renderCanvas:r}},28484:(t,e,i)=>{var n=i(94849),r=i(17331);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;e.isFilled&&n(a,l,e,p,c,d),e.isStroked&&r(a,e,p,c,d)}},12086:(t,e,i)=>{var n=i(47379),r=i(31641),s=i(78404),o=new n({Extends:r,Mixins:[s],initialize:function(t,e,i,n,s,o,a,h,u,l,c){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=128),void 0===s&&(s=128),void 0===o&&(o=32),void 0===a&&(a=32),r.call(this,t,"Grid",null),this.cellWidth=o,this.cellHeight=a,this.showCells=!0,this.outlineFillColor=0,this.outlineFillAlpha=0,this.showOutline=!0,this.showAltCells=!1,this.altFillColor,this.altFillAlpha,this.setPosition(e,i),this.setSize(n,s),void 0!==h&&this.setFillStyle(h,u),void 0!==l&&this.setOutlineStyle(l,c),this.updateDisplayOrigin()},setFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showCells=!1:(this.fillColor=t,this.fillAlpha=e,this.showCells=!0),this},setAltFillStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showAltCells=!1:(this.altFillColor=t,this.altFillAlpha=e,this.showAltCells=!0),this},setOutlineStyle:function(t,e){return void 0===e&&(e=1),void 0===t?this.showOutline=!1:(this.outlineFillColor=t,this.outlineFillAlpha=e,this.showOutline=!0),this}});t.exports=o},29385:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=-e._displayOriginX,l=-e._displayOriginY,c=o.alpha*e.alpha,d=e.width,p=e.height,f=e.cellWidth,m=e.cellHeight,v=Math.ceil(d/f),g=Math.ceil(p/m),y=f,_=m,x=f-(v*f-d),b=m-(g*m-p),w=e.showCells,T=e.showAltCells,M=e.showOutline,S=0,E=0,L=0,A=0,D=0;if(M&&(y--,_--,x===f&&x--,b===m&&b--),w&&e.fillAlpha>0)for(n(h,e),E=0;E<g;E++)for(T&&(L=E%2),S=0;S<v;S++)T&&L?L=0:(L++,A=S<v-1?y:x,D=E<g-1?_:b,h.fillRect(u+S*f,l+E*m,A,D));if(T&&e.altFillAlpha>0)for(n(h,e,e.altFillColor,e.altFillAlpha*c),E=0;E<g;E++)for(T&&(L=E%2),S=0;S<v;S++)!T||L?(L=0,A=S<v-1?y:x,D=E<g-1?_:b,h.fillRect(u+S*f,l+E*m,A,D)):L=1;if(M&&e.outlineFillAlpha>0){for(r(h,e,e.outlineFillColor,e.outlineFillAlpha*c),S=1;S<v;S++){var P=S*f;h.beginPath(),h.moveTo(P+u,l),h.lineTo(P+u,p+l),h.stroke()}for(E=1;E<g;E++){var C=E*m;h.beginPath(),h.moveTo(u,C+l),h.lineTo(u+d,C+l),h.stroke()}}h.restore()}}},85357:(t,e,i)=>{var n=i(81342),r=i(12086);n.register("grid",(function(t,e,i,n,s,o,a,h,u,l){return this.displayList.add(new r(this.scene,t,e,i,n,s,o,a,h,u,l))}))},78404:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(82422),r=i(29385),t.exports={renderWebGL:n,renderCanvas:r}},82422:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=this.pipeline,a=o._tempMatrix1,h=o._tempMatrix2,u=o._tempMatrix3;t.setPipeline(o),h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY),a.multiply(h,u),u.translate(-e._displayOriginX,-e._displayOriginY);var l,c,d=r.alpha*e.alpha,p=e.width,f=e.height,m=e.cellWidth,v=e.cellHeight,g=Math.ceil(p/m),y=Math.ceil(f/v),_=m,x=v,b=m-(g*m-p),w=v-(y*v-f),T=e.showCells,M=e.showAltCells,S=e.showOutline,E=0,L=0,A=0,D=0,P=0;if(S&&(_--,x--,b===m&&b--,w===v&&w--),T&&e.fillAlpha>0)for(l=o.fillTint,c=n.getTintAppendFloatAlphaAndSwap(e.fillColor,e.fillAlpha*d),l.TL=c,l.TR=c,l.BL=c,l.BR=c,L=0;L<y;L++)for(M&&(A=L%2),E=0;E<g;E++)M&&A?A=0:(A++,D=E<g-1?_:b,P=L<y-1?x:w,o.setTexture2D(),o.batchFillRect(E*m,L*v,D,P));if(M&&e.altFillAlpha>0)for(l=o.fillTint,c=n.getTintAppendFloatAlphaAndSwap(e.altFillColor,e.altFillAlpha*d),l.TL=c,l.TR=c,l.BL=c,l.BR=c,L=0;L<y;L++)for(M&&(A=L%2),E=0;E<g;E++)!M||A?(A=0,D=E<g-1?_:b,P=L<y-1?x:w,o.setTexture2D(),o.batchFillRect(E*m,L*v,D,P)):A=1;if(S&&e.outlineFillAlpha>0){var C=o.strokeTint,O=n.getTintAppendFloatAlphaAndSwap(e.outlineFillColor,e.outlineFillAlpha*d);for(C.TL=O,C.TR=O,C.BL=O,C.BR=O,E=1;E<g;E++){var k=E*m;o.setTexture2D(),o.batchLine(k,0,k,f,1,1,1,0,!1)}for(L=1;L<y;L++){var R=L*v;o.setTexture2D(),o.batchLine(0,R,p,R,1,1,1,0,!1)}}}},46221:(t,e,i)=>{var n=i(7822),r=i(47379),s=i(31641),o=new r({Extends:s,Mixins:[n],initialize:function(t,e,i,n,r,o,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=48),void 0===r&&(r=32),void 0===o&&(o=15658734),void 0===a&&(a=10066329),void 0===h&&(h=13421772),s.call(this,t,"IsoBox",null),this.projection=4,this.fillTop=o,this.fillLeft=a,this.fillRight=h,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isFilled=!0,this.setPosition(e,i),this.setSize(n,r),this.updateDisplayOrigin()},setProjection:function(t){return this.projection=t,this},setFaces:function(t,e,i){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===i&&(i=!0),this.showTop=t,this.showLeft=e,this.showRight=i,this},setFillStyle:function(t,e,i){return this.fillTop=t,this.fillLeft=e,this.fillRight=i,this.isFilled=!0,this}});t.exports=o},83181:(t,e,i)=>{var n=i(71805),r=i(55468);t.exports=function(t,e,i,s,o){var a=t.currentContext;if(r(t,a,e,s,o)&&e.isFilled){var h=e.width,u=e.height,l=h/2,c=h/e.projection;e.showTop&&(n(a,e,e.fillTop),a.beginPath(),a.moveTo(-l,-u),a.lineTo(0,-c-u),a.lineTo(l,-u),a.lineTo(l,-1),a.lineTo(0,c-1),a.lineTo(-l,-1),a.lineTo(-l,-u),a.fill()),e.showLeft&&(n(a,e,e.fillLeft),a.beginPath(),a.moveTo(-l,0),a.lineTo(0,c),a.lineTo(0,c-u),a.lineTo(-l,-u),a.lineTo(-l,0),a.fill()),e.showRight&&(n(a,e,e.fillRight),a.beginPath(),a.moveTo(l,0),a.lineTo(0,c),a.lineTo(0,c-u),a.lineTo(l,-u),a.lineTo(l,0),a.fill()),a.restore()}}},37349:(t,e,i)=>{var n=i(81342),r=i(46221);n.register("isobox",(function(t,e,i,n,s,o,a){return this.displayList.add(new r(this.scene,t,e,i,n,s,o,a))}))},7822:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(27612),r=i(83181),t.exports={renderWebGL:n,renderCanvas:r}},27612:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=this.pipeline,a=o._tempMatrix1,h=o._tempMatrix2,u=o._tempMatrix3;t.setPipeline(o),h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY),a.multiply(h,u);var l,c,d,p,f,m,v,g,y,_=e.width,x=e.height,b=_/2,w=_/e.projection,T=r.alpha*e.alpha;e.isFilled&&(e.showTop&&(l=n.getTintAppendFloatAlphaAndSwap(e.fillTop,T),c=u.getX(-b,-x),d=u.getY(-b,-x),p=u.getX(0,-w-x),f=u.getY(0,-w-x),m=u.getX(b,-x),v=u.getY(b,-x),g=u.getX(0,w-x),y=u.getY(0,w-x),o.setTexture2D(),o.batchQuad(c,d,p,f,m,v,g,y,0,0,1,1,l,l,l,l,2)),e.showLeft&&(l=n.getTintAppendFloatAlphaAndSwap(e.fillLeft,T),c=u.getX(-b,0),d=u.getY(-b,0),p=u.getX(0,w),f=u.getY(0,w),m=u.getX(0,w-x),v=u.getY(0,w-x),g=u.getX(-b,-x),y=u.getY(-b,-x),o.setTexture2D(),o.batchQuad(c,d,p,f,m,v,g,y,0,0,1,1,l,l,l,l,2)),e.showRight&&(l=n.getTintAppendFloatAlphaAndSwap(e.fillRight,T),c=u.getX(b,0),d=u.getY(b,0),p=u.getX(0,w),f=u.getY(0,w),m=u.getX(0,w-x),v=u.getY(0,w-x),g=u.getX(b,-x),y=u.getY(b,-x),o.setTexture2D(),o.batchQuad(c,d,p,f,m,v,g,y,0,0,1,1,l,l,l,l,2)))}},39994:(t,e,i)=>{var n=i(47379),r=i(57287),s=i(31641),o=new n({Extends:s,Mixins:[r],initialize:function(t,e,i,n,r,o,a,h,u){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=48),void 0===r&&(r=32),void 0===o&&(o=!1),void 0===a&&(a=15658734),void 0===h&&(h=10066329),void 0===u&&(u=13421772),s.call(this,t,"IsoTriangle",null),this.projection=4,this.fillTop=a,this.fillLeft=h,this.fillRight=u,this.showTop=!0,this.showLeft=!0,this.showRight=!0,this.isReversed=o,this.isFilled=!0,this.setPosition(e,i),this.setSize(n,r),this.updateDisplayOrigin()},setProjection:function(t){return this.projection=t,this},setReversed:function(t){return this.isReversed=t,this},setFaces:function(t,e,i){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===i&&(i=!0),this.showTop=t,this.showLeft=e,this.showRight=i,this},setFillStyle:function(t,e,i){return this.fillTop=t,this.fillLeft=e,this.fillRight=i,this.isFilled=!0,this}});t.exports=o},27017:(t,e,i)=>{var n=i(71805),r=i(55468);t.exports=function(t,e,i,s,o){var a=t.currentContext;if(r(t,a,e,s,o)&&e.isFilled){var h=e.width,u=e.height,l=h/2,c=h/e.projection,d=e.isReversed;e.showTop&&d&&(n(a,e,e.fillTop),a.beginPath(),a.moveTo(-l,-u),a.lineTo(0,-c-u),a.lineTo(l,-u),a.lineTo(0,c-u),a.fill()),e.showLeft&&(n(a,e,e.fillLeft),a.beginPath(),d?(a.moveTo(-l,-u),a.lineTo(0,c),a.lineTo(0,c-u)):(a.moveTo(-l,0),a.lineTo(0,c),a.lineTo(0,c-u)),a.fill()),e.showRight&&(n(a,e,e.fillRight),a.beginPath(),d?(a.moveTo(l,-u),a.lineTo(0,c),a.lineTo(0,c-u)):(a.moveTo(l,0),a.lineTo(0,c),a.lineTo(0,c-u)),a.fill()),a.restore()}}},57084:(t,e,i)=>{var n=i(81342),r=i(39994);n.register("isotriangle",(function(t,e,i,n,s,o,a,h){return this.displayList.add(new r(this.scene,t,e,i,n,s,o,a,h))}))},57287:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(45848),r=i(27017),t.exports={renderWebGL:n,renderCanvas:r}},45848:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=this.pipeline,a=o._tempMatrix1,h=o._tempMatrix2,u=o._tempMatrix3;t.setPipeline(o),h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY),a.multiply(h,u);var l=e.width,c=e.height,d=l/2,p=l/e.projection,f=e.isReversed,m=r.alpha*e.alpha;if(e.isFilled){var v,g,y,_,x,b,w;if(e.showTop&&f){v=n.getTintAppendFloatAlphaAndSwap(e.fillTop,m),g=u.getX(-d,-c),y=u.getY(-d,-c),_=u.getX(0,-p-c),x=u.getY(0,-p-c),b=u.getX(d,-c),w=u.getY(d,-c);var T=u.getX(0,p-c),M=u.getY(0,p-c);o.setTexture2D(),o.batchQuad(g,y,_,x,b,w,T,M,0,0,1,1,v,v,v,v,2)}e.showLeft&&(v=n.getTintAppendFloatAlphaAndSwap(e.fillLeft,m),f?(g=u.getX(-d,-c),y=u.getY(-d,-c),_=u.getX(0,p),x=u.getY(0,p),b=u.getX(0,p-c),w=u.getY(0,p-c)):(g=u.getX(-d,0),y=u.getY(-d,0),_=u.getX(0,p),x=u.getY(0,p),b=u.getX(0,p-c),w=u.getY(0,p-c)),o.batchTri(g,y,_,x,b,w,0,0,1,1,v,v,v,2)),e.showRight&&(v=n.getTintAppendFloatAlphaAndSwap(e.fillRight,m),f?(g=u.getX(d,-c),y=u.getY(d,-c),_=u.getX(0,p),x=u.getY(0,p),b=u.getX(0,p-c),w=u.getY(0,p-c)):(g=u.getX(d,0),y=u.getY(d,0),_=u.getX(0,p),x=u.getY(0,p),b=u.getX(0,p-c),w=u.getY(0,p-c)),o.setTexture2D(),o.batchTri(g,y,_,x,b,w,0,0,1,1,v,v,v,2))}}},21211:(t,e,i)=>{var n=i(47379),r=i(31641),s=i(1137),o=i(51957),a=new n({Extends:r,Mixins:[o],initialize:function(t,e,i,n,o,a,h,u,l){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===o&&(o=0),void 0===a&&(a=128),void 0===h&&(h=0),r.call(this,t,"Line",new s(n,o,a,h));var c=this.geom.right-this.geom.left,d=this.geom.bottom-this.geom.top;this.lineWidth=1,this._startWidth=1,this._endWidth=1,this.setPosition(e,i),this.setSize(c,d),void 0!==u&&this.setStrokeStyle(1,u,l),this.updateDisplayOrigin()},setLineWidth:function(t,e){return void 0===e&&(e=t),this._startWidth=t,this._endWidth=e,this.lineWidth=t,this},setTo:function(t,e,i,n){return this.geom.setTo(t,e,i,n),this}});t.exports=a},85451:(t,e,i)=>{var n=i(84233),r=i(55468);t.exports=function(t,e,i,s,o){var a=t.currentContext;if(r(t,a,e,s,o)){var h=e._displayOriginX,u=e._displayOriginY;e.isStroked&&(n(a,e),a.beginPath(),a.moveTo(e.geom.x1-h,e.geom.y1-u),a.lineTo(e.geom.x2-h,e.geom.y2-u),a.stroke()),a.restore()}}},74347:(t,e,i)=>{var n=i(81342),r=i(21211);n.register("line",(function(t,e,i,n,s,o,a,h){return this.displayList.add(new r(this.scene,t,e,i,n,s,o,a,h))}))},51957:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(60751),r=i(85451),t.exports={renderWebGL:n,renderCanvas:r}},60751:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){var o=this.pipeline,a=o._tempMatrix1,h=o._tempMatrix2;t.setPipeline(o),h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(r.matrix),s?(a.multiplyWithOffset(s,-r.scrollX*e.scrollFactorX,-r.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y):(h.e-=r.scrollX*e.scrollFactorX,h.f-=r.scrollY*e.scrollFactorY);var u=e._displayOriginX,l=e._displayOriginY,c=r.alpha*e.alpha;if(e.isStroked){var d=o.strokeTint,p=n.getTintAppendFloatAlphaAndSwap(e.strokeColor,e.strokeAlpha*c);d.TL=p,d.TR=p,d.BL=p,d.BR=p;var f=e._startWidth,m=e._endWidth;o.setTexture2D(),o.batchLine(e.geom.x1-u,e.geom.y1-l,e.geom.x2-u,e.geom.y2-l,f,m,1,0,!1,h,a)}}},32330:(t,e,i)=>{var n=i(98586),r=i(47379),s=i(43574),o=i(9248),a=i(72064),h=i(31641),u=i(92556),l=new r({Extends:h,Mixins:[n],initialize:function(t,e,i,n,r,s){void 0===e&&(e=0),void 0===i&&(i=0),h.call(this,t,"Polygon",new a(n));var u=o(this.geom);this.setPosition(e,i),this.setSize(u.width,u.height),void 0!==r&&this.setFillStyle(r,s),this.updateDisplayOrigin(),this.updateData()},smooth:function(t){void 0===t&&(t=1);for(var e=0;e<t;e++)u(this.geom);return this.updateData()},updateData:function(){for(var t=[],e=this.geom.points,i=0;i<e.length;i++)t.push(e[i].x,e[i].y);return t.push(e[0].x,e[0].y),this.pathIndexes=s(t),this.pathData=t,this}});t.exports=l},96513:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX,l=e._displayOriginY,c=e.pathData,d=c.length-1,p=c[0]-u,f=c[1]-l;h.beginPath(),h.moveTo(p,f),e.closePath||(d-=2);for(var m=2;m<d;m+=2){var v=c[m]-u,g=c[m+1]-l;h.lineTo(v,g)}h.closePath(),e.isFilled&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},42275:(t,e,i)=>{var n=i(81342),r=i(32330);n.register("polygon",(function(t,e,i,n,s){return this.displayList.add(new r(this.scene,t,e,i,n,s))}))},98586:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(92729),r=i(96513),t.exports={renderWebGL:n,renderCanvas:r}},92729:(t,e,i)=>{var n=i(94849),r=i(17331);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;e.isFilled&&n(a,l,e,p,c,d),e.isStroked&&r(a,e,p,c,d)}},13056:(t,e,i)=>{var n=i(47379),r=i(38092),s=i(31641),o=i(50901),a=new n({Extends:s,Mixins:[o],initialize:function(t,e,i,n,o,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=128),void 0===o&&(o=128),s.call(this,t,"Rectangle",new r(0,0,n,o)),this.setPosition(e,i),this.setSize(n,o),void 0!==a&&this.setFillStyle(a,h),this.updateDisplayOrigin(),this.updateData()},updateData:function(){var t=[],e=this.geom,i=this._tempLine;return e.getLineA(i),t.push(i.x1,i.y1,i.x2,i.y2),e.getLineB(i),t.push(i.x2,i.y2),e.getLineC(i),t.push(i.x2,i.y2),e.getLineD(i),t.push(i.x2,i.y2),this.pathData=t,this}});t.exports=a},34145:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX,l=e._displayOriginY;e.isFilled&&(n(h,e),h.fillRect(-u,-l,e.width,e.height)),e.isStroked&&(r(h,e),h.beginPath(),h.rect(-u,-l,e.width,e.height),h.stroke()),h.restore()}}},23738:(t,e,i)=>{var n=i(81342),r=i(13056);n.register("rectangle",(function(t,e,i,n,s,o){return this.displayList.add(new r(this.scene,t,e,i,n,s,o))}))},50901:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(7838),r=i(34145),t.exports={renderWebGL:n,renderCanvas:r}},7838:(t,e,i)=>{var n=i(17331),r=i(19298);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;if(e.isFilled){var f=a.fillTint,m=r.getTintAppendFloatAlphaAndSwap(e.fillColor,e.fillAlpha*p);f.TL=m,f.TR=m,f.BL=m,f.BR=m,a.setTexture2D(),a.batchFillRect(-c,-d,e.width,e.height)}e.isStroked&&n(a,e,p,c,d)}},85864:(t,e,i)=>{var n=i(68137),r=i(47379),s=i(43574),o=i(31641),a=new r({Extends:o,Mixins:[n],initialize:function(t,e,i,n,r,s,a,h){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=5),void 0===r&&(r=32),void 0===s&&(s=64),o.call(this,t,"Star",null),this._points=n,this._innerRadius=r,this._outerRadius=s,this.setPosition(e,i),this.setSize(2*s,2*s),void 0!==a&&this.setFillStyle(a,h),this.updateDisplayOrigin(),this.updateData()},setPoints:function(t){return this._points=t,this.updateData()},setInnerRadius:function(t){return this._innerRadius=t,this.updateData()},setOuterRadius:function(t){return this._outerRadius=t,this.updateData()},points:{get:function(){return this._points},set:function(t){this._points=t,this.updateData()}},innerRadius:{get:function(){return this._innerRadius},set:function(t){this._innerRadius=t,this.updateData()}},outerRadius:{get:function(){return this._outerRadius},set:function(t){this._outerRadius=t,this.updateData()}},updateData:function(){var t=[],e=this._points,i=this._innerRadius,n=this._outerRadius,r=Math.PI/2*3,o=Math.PI/e,a=n,h=n;t.push(a,h+-n);for(var u=0;u<e;u++)t.push(a+Math.cos(r)*n,h+Math.sin(r)*n),r+=o,t.push(a+Math.cos(r)*i,h+Math.sin(r)*i),r+=o;return t.push(a,h+-n),this.pathIndexes=s(t),this.pathData=t,this}});t.exports=a},4417:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX,l=e._displayOriginY,c=e.pathData,d=c.length-1,p=c[0]-u,f=c[1]-l;h.beginPath(),h.moveTo(p,f),e.closePath||(d-=2);for(var m=2;m<d;m+=2){var v=c[m]-u,g=c[m+1]-l;h.lineTo(v,g)}h.closePath(),e.isFilled&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},11242:(t,e,i)=>{var n=i(85864);i(81342).register("star",(function(t,e,i,r,s,o,a){return this.displayList.add(new n(this.scene,t,e,i,r,s,o,a))}))},68137:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(45610),r=i(4417),t.exports={renderWebGL:n,renderCanvas:r}},45610:(t,e,i)=>{var n=i(94849),r=i(17331);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;e.isFilled&&n(a,l,e,p,c,d),e.isStroked&&r(a,e,p,c,d)}},82379:(t,e,i)=>{var n=i(47379),r=i(31641),s=i(50730),o=i(28835),a=new n({Extends:r,Mixins:[o],initialize:function(t,e,i,n,o,a,h,u,l,c,d){void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===o&&(o=128),void 0===a&&(a=64),void 0===h&&(h=0),void 0===u&&(u=128),void 0===l&&(l=128),r.call(this,t,"Triangle",new s(n,o,a,h,u,l));var p=this.geom.right-this.geom.left,f=this.geom.bottom-this.geom.top;this.setPosition(e,i),this.setSize(p,f),void 0!==c&&this.setFillStyle(c,d),this.updateDisplayOrigin(),this.updateData()},setTo:function(t,e,i,n,r,s){return this.geom.setTo(t,e,i,n,r,s),this.updateData()},updateData:function(){var t=[],e=this.geom,i=this._tempLine;return e.getLineA(i),t.push(i.x1,i.y1,i.x2,i.y2),e.getLineB(i),t.push(i.x2,i.y2),e.getLineC(i),t.push(i.x2,i.y2),this.pathData=t,this}});t.exports=a},71568:(t,e,i)=>{var n=i(71805),r=i(84233),s=i(55468);t.exports=function(t,e,i,o,a){var h=t.currentContext;if(s(t,h,e,o,a)){var u=e._displayOriginX,l=e._displayOriginY,c=e.geom.x1-u,d=e.geom.y1-l,p=e.geom.x2-u,f=e.geom.y2-l,m=e.geom.x3-u,v=e.geom.y3-l;h.beginPath(),h.moveTo(c,d),h.lineTo(p,f),h.lineTo(m,v),h.closePath(),e.isFilled&&(n(h,e),h.fill()),e.isStroked&&(r(h,e),h.stroke()),h.restore()}}},80888:(t,e,i)=>{var n=i(81342),r=i(82379);n.register("triangle",(function(t,e,i,n,s,o,a,h,u,l){return this.displayList.add(new r(this.scene,t,e,i,n,s,o,a,h,u,l))}))},28835:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(58515),r=i(71568),t.exports={renderWebGL:n,renderCanvas:r}},58515:(t,e,i)=>{var n=i(17331),r=i(19298);t.exports=function(t,e,i,s,o){var a=this.pipeline,h=a._tempMatrix1,u=a._tempMatrix2,l=a._tempMatrix3;t.setPipeline(a),u.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),h.copyFrom(s.matrix),o?(h.multiplyWithOffset(o,-s.scrollX*e.scrollFactorX,-s.scrollY*e.scrollFactorY),u.e=e.x,u.f=e.y):(u.e-=s.scrollX*e.scrollFactorX,u.f-=s.scrollY*e.scrollFactorY),h.multiply(u,l);var c=e._displayOriginX,d=e._displayOriginY,p=s.alpha*e.alpha;if(e.isFilled){var f=a.fillTint,m=r.getTintAppendFloatAlphaAndSwap(e.fillColor,e.fillAlpha*p);f.TL=m,f.TR=m,f.BL=m,f.BR=m;var v=e.geom.x1-c,g=e.geom.y1-d,y=e.geom.x2-c,_=e.geom.y2-d,x=e.geom.x3-c,b=e.geom.y3-d;a.setTexture2D(),a.batchFillTriangle(v,g,y,_,x,b,u,h)}e.isStroked&&n(a,e,p,c,d)}},95681:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(90554),o=i(80244),a=new n({Extends:s,Mixins:[r.Alpha,r.BlendMode,r.Depth,r.Flip,r.GetBounds,r.Mask,r.Origin,r.Pipeline,r.ScrollFactor,r.Size,r.TextureCrop,r.Tint,r.Transform,r.Visible,o],initialize:function(t,e,i,n,o){s.call(this,t,"Sprite"),this._crop=this.resetCropObject(),this.anims=new r.Animation(this),this.setTexture(n,o),this.setPosition(e,i),this.setSizeToFrame(),this.setOriginFromFrame(),this.initPipeline()},preUpdate:function(t,e){this.anims.update(t,e)},play:function(t,e,i){return this.anims.play(t,e,i),this},toJSON:function(){return r.ToJSON(this)},preDestroy:function(){this.anims.destroy(),this.anims=void 0}});t.exports=a},29877:t=>{t.exports=function(t,e,i,n,r){t.batchSprite(e,e.frame,n,r)}},69045:(t,e,i)=>{var n=i(74865),r=i(4777),s=i(17517),o=i(57687),a=i(95681);s.register("sprite",(function(t,e){void 0===t&&(t={});var i=o(t,"key",null),s=o(t,"frame",null),h=new a(this.scene,0,0,i,s);return void 0!==e&&(t.add=e),n(this.scene,h,t),r(h,t),h}))},88984:(t,e,i)=>{var n=i(81342),r=i(95681);n.register("sprite",(function(t,e,i,n){var s=new r(this.scene,t,e,i,n);return this.displayList.add(s),this.updateList.add(s),s}))},80244:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(972),r=i(29877),t.exports={renderWebGL:n,renderCanvas:r}},972:t=>{t.exports=function(t,e,i,n,r){this.pipeline.batchSprite(e,n,r)}},2307:t=>{t.exports=function(t,e,i){var n=t.canvas,r=t.context,s=t.style,o=[],a=0,h=i.length;s.maxLines>0&&s.maxLines<i.length&&(h=s.maxLines),s.syncFont(n,r);for(var u=0;u<h;u++){var l=s.strokeThickness;l+=r.measureText(i[u]).width,s.wordWrap&&(l-=r.measureText(" ").width),o[u]=Math.ceil(l),a=Math.max(a,o[u])}var c=e.fontSize+s.strokeThickness,d=c*h,p=t.lineSpacing;return h>1&&(d+=p*(h-1)),{width:a,height:d,lines:h,lineWidths:o,lineSpacing:p,lineHeight:c}}},86300:(t,e,i)=>{var n=i(89429);t.exports=function(t){var e=n.create(this),i=e.getContext("2d");t.syncFont(e,i);var r=Math.ceil(i.measureText(t.testString).width*t.baselineX),s=r,o=2*s;s=s*t.baselineY|0,e.width=r,e.height=o,i.fillStyle="#f00",i.fillRect(0,0,r,o),i.font=t._font,i.textBaseline="alphabetic",i.fillStyle="#000",i.fillText(t.testString,0,s);var a={ascent:0,descent:0,fontSize:0};if(!i.getImageData(0,0,r,o))return a.ascent=s,a.descent=s+6,a.fontSize=a.ascent+a.descent,n.remove(e),a;var h,u,l=i.getImageData(0,0,r,o).data,c=l.length,d=4*r,p=0,f=!1;for(h=0;h<s;h++){for(u=0;u<d;u+=4)if(255!==l[p+u]){f=!0;break}if(f)break;p+=d}for(a.ascent=s-h,p=c-d,f=!1,h=o;h>s;h--){for(u=0;u<d;u+=4)if(255!==l[p+u]){f=!0;break}if(f)break;p-=d}return a.descent=h-s,a.fontSize=a.ascent+a.descent,n.remove(e),a}},68982:(t,e,i)=>{var n=i(47379),r=i(57687),s=i(86652),o=i(86300),a={fontFamily:["fontFamily","Courier"],fontSize:["fontSize","16px"],fontStyle:["fontStyle",""],backgroundColor:["backgroundColor",null],color:["color","#fff"],stroke:["stroke","#fff"],strokeThickness:["strokeThickness",0],shadowOffsetX:["shadow.offsetX",0],shadowOffsetY:["shadow.offsetY",0],shadowColor:["shadow.color","#000"],shadowBlur:["shadow.blur",0],shadowStroke:["shadow.stroke",!1],shadowFill:["shadow.fill",!1],align:["align","left"],maxLines:["maxLines",0],fixedWidth:["fixedWidth",0],fixedHeight:["fixedHeight",0],resolution:["resolution",0],rtl:["rtl",!1],testString:["testString","|M\xc3\u2030qgy"],baselineX:["baselineX",1.2],baselineY:["baselineY",1.4],wordWrapWidth:["wordWrap.width",null],wordWrapCallback:["wordWrap.callback",null],wordWrapCallbackScope:["wordWrap.callbackScope",null],wordWrapUseAdvanced:["wordWrap.useAdvancedWrap",!1]},h=new n({initialize:function(t,e){this.parent=t,this.fontFamily,this.fontSize,this.fontStyle,this.backgroundColor,this.color,this.stroke,this.strokeThickness,this.shadowOffsetX,this.shadowOffsetY,this.shadowColor,this.shadowBlur,this.shadowStroke,this.shadowFill,this.align,this.maxLines,this.fixedWidth,this.fixedHeight,this.resolution,this.rtl,this.testString,this.baselineX,this.baselineY,this._font,this.setStyle(e,!1,!0);var i=s(e,"metrics",!1);this.metrics=i?{ascent:s(i,"ascent",0),descent:s(i,"descent",0),fontSize:s(i,"fontSize",0)}:o(this)},setStyle:function(t,e,i){for(var n in void 0===e&&(e=!0),void 0===i&&(i=!1),t&&t.hasOwnProperty("fontSize")&&"number"==typeof t.fontSize&&(t.fontSize=t.fontSize.toString()+"px"),a){var o=i?a[n][1]:this[n];this[n]="wordWrapCallback"===n||"wordWrapCallbackScope"===n?s(t,a[n][0],o):r(t,a[n][0],o)}var h=s(t,"font",null);null!==h&&this.setFont(h,!1),this._font=[this.fontStyle,this.fontSize,this.fontFamily].join(" ").trim();var u=s(t,"fill",null);return null!==u&&(this.color=u),e?this.update(!0):this.parent},syncFont:function(t,e){e.font=this._font},syncStyle:function(t,e){e.textBaseline="alphabetic",e.fillStyle=this.color,e.strokeStyle=this.stroke,e.lineWidth=this.strokeThickness,e.lineCap="round",e.lineJoin="round"},syncShadow:function(t,e){e?(t.shadowOffsetX=this.shadowOffsetX,t.shadowOffsetY=this.shadowOffsetY,t.shadowColor=this.shadowColor,t.shadowBlur=this.shadowBlur):(t.shadowOffsetX=0,t.shadowOffsetY=0,t.shadowColor=0,t.shadowBlur=0)},update:function(t){return t&&(this._font=[this.fontStyle,this.fontSize,this.fontFamily].join(" ").trim(),this.metrics=o(this)),this.parent.updateText()},setFont:function(t,e){void 0===e&&(e=!0);var i=t,n="",r="";if("string"!=typeof t)i=s(t,"fontFamily","Courier"),n=s(t,"fontSize","16px"),r=s(t,"fontStyle","");else{var o=t.split(" "),a=0;r=o.length>2?o[a++]:"",n=o[a++]||"16px",i=o[a++]||"Courier"}return i===this.fontFamily&&n===this.fontSize&&r===this.fontStyle||(this.fontFamily=i,this.fontSize=n,this.fontStyle=r,e&&this.update(!0)),this.parent},setFontFamily:function(t){return this.fontFamily!==t&&(this.fontFamily=t,this.update(!0)),this.parent},setFontStyle:function(t){return this.fontStyle!==t&&(this.fontStyle=t,this.update(!0)),this.parent},setFontSize:function(t){return"number"==typeof t&&(t=t.toString()+"px"),this.fontSize!==t&&(this.fontSize=t,this.update(!0)),this.parent},setTestString:function(t){return this.testString=t,this.update(!0)},setFixedSize:function(t,e){return this.fixedWidth=t,this.fixedHeight=e,t&&(this.parent.width=t),e&&(this.parent.height=e),this.update(!1)},setBackgroundColor:function(t){return this.backgroundColor=t,this.update(!1)},setFill:function(t){return this.color=t,this.update(!1)},setColor:function(t){return this.color=t,this.update(!1)},setResolution:function(t){return this.resolution=t,this.update(!1)},setStroke:function(t,e){return void 0===e&&(e=this.strokeThickness),void 0===t&&0!==this.strokeThickness?(this.strokeThickness=0,this.update(!0)):this.stroke===t&&this.strokeThickness===e||(this.stroke=t,this.strokeThickness=e,this.update(!0)),this.parent},setShadow:function(t,e,i,n,r,s){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i="#000"),void 0===n&&(n=0),void 0===r&&(r=!1),void 0===s&&(s=!0),this.shadowOffsetX=t,this.shadowOffsetY=e,this.shadowColor=i,this.shadowBlur=n,this.shadowStroke=r,this.shadowFill=s,this.update(!1)},setShadowOffset:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.shadowOffsetX=t,this.shadowOffsetY=e,this.update(!1)},setShadowColor:function(t){return void 0===t&&(t="#000"),this.shadowColor=t,this.update(!1)},setShadowBlur:function(t){return void 0===t&&(t=0),this.shadowBlur=t,this.update(!1)},setShadowStroke:function(t){return this.shadowStroke=t,this.update(!1)},setShadowFill:function(t){return this.shadowFill=t,this.update(!1)},setWordWrapWidth:function(t,e){return void 0===e&&(e=!1),this.wordWrapWidth=t,this.wordWrapUseAdvanced=e,this.update(!1)},setWordWrapCallback:function(t,e){return void 0===e&&(e=null),this.wordWrapCallback=t,this.wordWrapCallbackScope=e,this.update(!1)},setAlign:function(t){return void 0===t&&(t="left"),this.align=t,this.update(!1)},setMaxLines:function(t){return void 0===t&&(t=0),this.maxLines=t,this.update(!1)},getTextMetrics:function(){var t=this.metrics;return{ascent:t.ascent,descent:t.descent,fontSize:t.fontSize}},toJSON:function(){var t={};for(var e in a)t[e]=this[e];return t.metrics=this.getTextMetrics(),t},destroy:function(){this.parent=void 0}});t.exports=h},52986:(t,e,i)=>{var n=i(99641),r=i(89429),s=i(47379),o=i(23096),a=i(80827),h=i(90554),u=i(2307),l=i(86652),c=i(68791),d=i(98889),p=i(68982),f=new s({Extends:h,Mixins:[o.Alpha,o.BlendMode,o.ComputedSize,o.Crop,o.Depth,o.Flip,o.GetBounds,o.Mask,o.Origin,o.Pipeline,o.ScrollFactor,o.Tint,o.Transform,o.Visible,d],initialize:function(t,e,i,n,s){void 0===e&&(e=0),void 0===i&&(i=0),h.call(this,t,"Text"),this.renderer=t.sys.game.renderer,this.setPosition(e,i),this.setOrigin(0,0),this.initPipeline(),this.canvas=r.create(this),this.context=this.canvas.getContext("2d"),this.style=new p(this,s),this.autoRound=!0,this.splitRegExp=/(?:\r\n|\r|\n)/,this._text=void 0,this.padding={left:0,right:0,top:0,bottom:0},this.width=1,this.height=1,this.lineSpacing=0,this.dirty=!1,0===this.style.resolution&&(this.style.resolution=t.sys.game.config.resolution),this._crop=this.resetCropObject(),this.texture=t.sys.textures.addCanvas(null,this.canvas,!0),this.frame=this.texture.get(),this.frame.source.resolution=this.style.resolution,this.renderer&&this.renderer.gl&&(this.renderer.deleteTexture(this.frame.source.glTexture),this.frame.source.glTexture=null),this.initRTL(),this.setText(n),s&&s.padding&&this.setPadding(s.padding),s&&s.lineSpacing&&this.setLineSpacing(s.lineSpacing),t.sys.game.events.on(a.CONTEXT_RESTORED,(function(){this.dirty=!0}),this)},initRTL:function(){this.style.rtl&&(this.canvas.dir="rtl",this.context.direction="rtl",this.canvas.style.display="none",n(this.canvas,this.scene.sys.canvas),this.originX=1)},runWordWrap:function(t){var e=this.style;if(e.wordWrapCallback){var i=e.wordWrapCallback.call(e.wordWrapCallbackScope,t,this);return Array.isArray(i)&&(i=i.join("\n")),i}return e.wordWrapWidth?e.wordWrapUseAdvanced?this.advancedWordWrap(t,this.context,this.style.wordWrapWidth):this.basicWordWrap(t,this.context,this.style.wordWrapWidth):t},advancedWordWrap:function(t,e,i){for(var n="",r=t.replace(/ +/gi," ").split(this.splitRegExp),s=r.length,o=0;o<s;o++){var a=r[o],h="";if(a=a.replace(/^ *|\s*$/gi,""),e.measureText(a).width<i)n+=a+"\n";else{for(var u=i,l=a.split(" "),c=0;c<l.length;c++){var d=l[c],p=d+" ",f=e.measureText(p).width;if(f>u){if(0===c){for(var m=p;m.length&&(m=m.slice(0,-1),!((f=e.measureText(m).width)<=u)););if(!m.length)throw new Error("This text's wordWrapWidth setting is less than a single character!");var v=d.substr(m.length);l[c]=v,h+=m}var g=l[c].length?c:c+1,y=l.slice(g).join(" ").replace(/[ \n]*$/gi,"");r[o+1]=y+" "+(r[o+1]||""),s=r.length;break}h+=p,u-=f}n+=h.replace(/[ \n]*$/gi,"")+"\n"}}return n=n.replace(/[\s|\n]*$/gi,"")},basicWordWrap:function(t,e,i){for(var n="",r=t.split(this.splitRegExp),s=r.length-1,o=e.measureText(" ").width,a=0;a<=s;a++){for(var h=i,u=r[a].split(" "),l=u.length-1,c=0;c<=l;c++){var d=u[c],p=e.measureText(d).width,f=p+o;f>h&&c>0&&(n+="\n",h=i),n+=d,c<l?(n+=" ",h-=f):h-=p}a<s&&(n+="\n")}return n},getWrappedText:function(t){return void 0===t&&(t=this._text),this.style.syncFont(this.canvas,this.context),this.runWordWrap(t).split(this.splitRegExp)},setText:function(t){return t||0===t||(t=""),Array.isArray(t)&&(t=t.join("\n")),t!==this._text&&(this._text=t.toString(),this.updateText()),this},setStyle:function(t){return this.style.setStyle(t)},setFont:function(t){return this.style.setFont(t)},setFontFamily:function(t){return this.style.setFontFamily(t)},setFontSize:function(t){return this.style.setFontSize(t)},setFontStyle:function(t){return this.style.setFontStyle(t)},setFixedSize:function(t,e){return this.style.setFixedSize(t,e)},setBackgroundColor:function(t){return this.style.setBackgroundColor(t)},setFill:function(t){return this.style.setFill(t)},setColor:function(t){return this.style.setColor(t)},setStroke:function(t,e){return this.style.setStroke(t,e)},setShadow:function(t,e,i,n,r,s){return this.style.setShadow(t,e,i,n,r,s)},setShadowOffset:function(t,e){return this.style.setShadowOffset(t,e)},setShadowColor:function(t){return this.style.setShadowColor(t)},setShadowBlur:function(t){return this.style.setShadowBlur(t)},setShadowStroke:function(t){return this.style.setShadowStroke(t)},setShadowFill:function(t){return this.style.setShadowFill(t)},setWordWrapWidth:function(t,e){return this.style.setWordWrapWidth(t,e)},setWordWrapCallback:function(t,e){return this.style.setWordWrapCallback(t,e)},setAlign:function(t){return this.style.setAlign(t)},setResolution:function(t){return this.style.setResolution(t)},setLineSpacing:function(t){return this.lineSpacing=t,this.updateText()},setPadding:function(t,e,i,n){if("object"==typeof t){var r=t,s=l(r,"x",null);null!==s?(t=s,i=s):(t=l(r,"left",0),i=l(r,"right",t));var o=l(r,"y",null);null!==o?(e=o,n=o):(e=l(r,"top",0),n=l(r,"bottom",e))}else void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=t),void 0===n&&(n=e);return this.padding.left=t,this.padding.top=e,this.padding.right=i,this.padding.bottom=n,this.updateText()},setMaxLines:function(t){return this.style.setMaxLines(t)},updateText:function(){var t=this.canvas,e=this.context,i=this.style,n=i.resolution,r=i.metrics;i.syncFont(t,e);var s=this._text;(i.wordWrapWidth||i.wordWrapCallback)&&(s=this.runWordWrap(this._text));var o,a=s.split(this.splitRegExp),h=u(this,r,a),l=this.padding;0===i.fixedWidth?(this.width=h.width+l.left+l.right,o=h.width):(this.width=i.fixedWidth,(o=this.width-l.left-l.right)<h.width&&(o=h.width)),0===i.fixedHeight?this.height=h.height+l.top+l.bottom:this.height=i.fixedHeight;var c,d,p=this.width,f=this.height;this.updateDisplayOrigin(),p*=n,f*=n,p=Math.max(p,1),f=Math.max(f,1),t.width!==p||t.height!==f?(t.width=p,t.height=f,this.frame.setSize(p,f),i.syncFont(t,e)):e.clearRect(0,0,p,f),e.save(),e.scale(n,n),i.backgroundColor&&(e.fillStyle=i.backgroundColor,e.fillRect(0,0,p,f)),i.syncStyle(t,e),e.textBaseline="alphabetic",e.translate(l.left,l.top);for(var m=0;m<h.lines;m++){if(c=i.strokeThickness/2,d=i.strokeThickness/2+m*h.lineHeight+r.ascent,m>0&&(d+=h.lineSpacing*m),i.rtl)c=p-c;else if("right"===i.align)c+=o-h.lineWidths[m];else if("center"===i.align)c+=(o-h.lineWidths[m])/2;else if("justify"===i.align){if(h.lineWidths[m]/h.width>=.85){var v=h.width-h.lineWidths[m],g=e.measureText(" ").width,y=a[m].trim(),_=y.split(" ");v+=(a[m].length-y.length)*g;for(var x=Math.floor(v/g),b=0;x>0;)_[b]+=" ",b=(b+1)%(_.length-1||1),--x;a[m]=_.join(" ")}}this.autoRound&&(c=Math.round(c),d=Math.round(d)),i.strokeThickness&&(this.style.syncShadow(e,i.shadowStroke),e.strokeText(a[m],c,d)),i.color&&(this.style.syncShadow(e,i.shadowFill),e.fillText(a[m],c,d))}e.restore(),this.renderer&&this.renderer.gl&&(this.frame.source.glTexture=this.renderer.canvasToTexture(t,this.frame.source.glTexture,!0),this.frame.glTexture=this.frame.source.glTexture),this.dirty=!0;var w=this.input;return w&&!w.customHitArea&&(w.hitArea.width=this.width,w.hitArea.height=this.height),this},getTextMetrics:function(){return this.style.getTextMetrics()},text:{get:function(){return this._text},set:function(t){this.setText(t)}},toJSON:function(){var t=o.ToJSON(this),e={autoRound:this.autoRound,text:this._text,style:this.style.toJSON(),padding:{left:this.padding.left,right:this.padding.right,top:this.padding.top,bottom:this.padding.bottom}};return t.data=e,t},preDestroy:function(){this.style.rtl&&c(this.canvas),r.remove(this.canvas),this.texture.destroy()}});t.exports=f},72200:t=>{t.exports=function(t,e,i,n,r){0!==e.width&&0!==e.height&&t.batchSprite(e,e.frame,n,r)}},19086:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(52986);r.register("text",(function(t,e){void 0===t&&(t={});var i=s(t,"text",""),r=s(t,"style",null),a=s(t,"padding",null);null!==a&&(r.padding=a);var h=new o(this.scene,0,0,i,r);return void 0!==e&&(t.add=e),n(this.scene,h,t),h.autoRound=s(t,"autoRound",!0),h.resolution=s(t,"resolution",1),h}))},44229:(t,e,i)=>{var n=i(52986);i(81342).register("text",(function(t,e,i,r){return this.displayList.add(new n(this.scene,t,e,i,r))}))},98889:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(81277),r=i(72200),t.exports={renderWebGL:n,renderCanvas:r}},81277:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){if(0!==e.width&&0!==e.height){var o=e.frame,a=o.width,h=o.height,u=n.getTintAppendFloatAlpha;this.pipeline.batchTexture(e,o.glTexture,a,h,e.x,e.y,a/e.style.resolution,h/e.style.resolution,e.scaleX,e.scaleY,e.rotation,e.flipX,e.flipY,e.scrollFactorX,e.scrollFactorY,e.displayOriginX,e.displayOriginY,0,0,a,h,u(e._tintTL,r.alpha*e._alphaTL),u(e._tintTR,r.alpha*e._alphaTR),u(e._tintBL,r.alpha*e._alphaBL),u(e._tintBR,r.alpha*e._alphaBR),e._isTinted&&e.tintFill,0,0,r,s)}}},20003:(t,e,i)=>{var n=i(89429),r=i(47379),s=i(23096),o=i(80827),a=i(90554),h=i(60712),u=i(505),l=i(8914),c=i(57148),d=new r({Extends:a,Mixins:[s.Alpha,s.BlendMode,s.ComputedSize,s.Crop,s.Depth,s.Flip,s.GetBounds,s.Mask,s.Origin,s.Pipeline,s.ScrollFactor,s.Tint,s.Transform,s.Visible,l],initialize:function(t,e,i,r,s,u,l){var d=t.sys.game.renderer;a.call(this,t,"TileSprite");var p=t.sys.textures.get(u),f=p.get(l);r&&s?(r=Math.floor(r),s=Math.floor(s)):(r=f.width,s=f.height),this._tilePosition=new c,this._tileScale=new c(1,1),this.dirty=!1,this.renderer=d,this.canvas=n.create(this,r,s),this.context=this.canvas.getContext("2d"),this.displayTexture=p,this.displayFrame=f,this._crop=this.resetCropObject(),this.texture=t.sys.textures.addCanvas(null,this.canvas,!0),this.frame=this.texture.get(),this.potWidth=h(f.width),this.potHeight=h(f.height),this.fillCanvas=n.create2D(this,this.potWidth,this.potHeight),this.fillContext=this.fillCanvas.getContext("2d"),this.fillPattern=null,this.setPosition(e,i),this.setSize(r,s),this.setFrame(l),this.setOriginFromFrame(),this.initPipeline(),t.sys.game.events.on(o.CONTEXT_RESTORED,(function(t){var e=t.gl;this.dirty=!0,this.fillPattern=null,this.fillPattern=t.createTexture2D(0,e.LINEAR,e.LINEAR,e.REPEAT,e.REPEAT,e.RGBA,this.fillCanvas,this.potWidth,this.potHeight)}),this)},setTexture:function(t,e){return this.displayTexture=this.scene.sys.textures.get(t),this.setFrame(e)},setFrame:function(t){var e=this.displayTexture.get(t);return this.potWidth=h(e.width),this.potHeight=h(e.height),this.canvas.width=0,e.cutWidth&&e.cutHeight?this.renderFlags|=8:this.renderFlags&=-9,this.displayFrame=e,this.dirty=!0,this.updateTileTexture(),this},setTilePosition:function(t,e){return void 0!==t&&(this.tilePositionX=t),void 0!==e&&(this.tilePositionY=e),this},setTileScale:function(t,e){return void 0===t&&(t=this.tileScaleX),void 0===e&&(e=t),this.tileScaleX=t,this.tileScaleY=e,this},updateTileTexture:function(){if(this.dirty&&this.renderer){var t=this.displayFrame;if(t.source.isRenderTexture||t.source.isGLTexture)return console.warn("TileSprites can only use Image or Canvas based textures"),void(this.dirty=!1);var e=this.fillContext,i=this.fillCanvas,n=this.potWidth,r=this.potHeight;this.renderer.gl||(n=t.cutWidth,r=t.cutHeight),e.clearRect(0,0,n,r),i.width=n,i.height=r,e.drawImage(t.source.image,t.cutX,t.cutY,t.cutWidth,t.cutHeight,0,0,n,r),this.renderer.gl?this.fillPattern=this.renderer.canvasToTexture(i,this.fillPattern):this.fillPattern=e.createPattern(i,"repeat"),this.updateCanvas(),this.dirty=!1}},updateCanvas:function(){var t=this.canvas;if(t.width===this.width&&t.height===this.height||(t.width=this.width,t.height=this.height,this.frame.setSize(this.width,this.height),this.updateDisplayOrigin(),this.dirty=!0),!this.dirty||this.renderer&&this.renderer.gl)this.dirty=!1;else{var e=this.context;this.scene.sys.game.config.antialias||u.disable(e);var i=this._tileScale.x,n=this._tileScale.y,r=this._tilePosition.x,s=this._tilePosition.y;e.clearRect(0,0,this.width,this.height),e.save(),e.scale(i,n),e.translate(-r,-s),e.fillStyle=this.fillPattern,e.fillRect(r,s,this.width/i,this.height/n),e.restore(),this.dirty=!1}},preDestroy:function(){this.renderer&&this.renderer.gl&&this.renderer.deleteTexture(this.fillPattern),n.remove(this.canvas),n.remove(this.fillCanvas),this.fillPattern=null,this.fillContext=null,this.fillCanvas=null,this.displayTexture=null,this.displayFrame=null,this.texture.destroy(),this.renderer=null},tilePositionX:{get:function(){return this._tilePosition.x},set:function(t){this._tilePosition.x=t,this.dirty=!0}},tilePositionY:{get:function(){return this._tilePosition.y},set:function(t){this._tilePosition.y=t,this.dirty=!0}},tileScaleX:{get:function(){return this._tileScale.x},set:function(t){this._tileScale.x=t,this.dirty=!0}},tileScaleY:{get:function(){return this._tileScale.y},set:function(t){this._tileScale.y=t,this.dirty=!0}}});t.exports=d},4019:t=>{t.exports=function(t,e,i,n,r){e.updateCanvas(),t.batchSprite(e,e.frame,n,r)}},94938:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(20003);r.register("tileSprite",(function(t,e){void 0===t&&(t={});var i=s(t,"x",0),r=s(t,"y",0),a=s(t,"width",512),h=s(t,"height",512),u=s(t,"key",""),l=s(t,"frame",""),c=new o(this.scene,i,r,a,h,u,l);return void 0!==e&&(t.add=e),n(this.scene,c,t),c}))},26241:(t,e,i)=>{var n=i(20003);i(81342).register("tileSprite",(function(t,e,i,r,s,o){return this.displayList.add(new n(this.scene,t,e,i,r,s,o))}))},8914:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(46661),r=i(4019),t.exports={renderWebGL:n,renderCanvas:r}},46661:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r,s){e.updateCanvas();var o=n.getTintAppendFloatAlpha;this.pipeline.batchTexture(e,e.fillPattern,e.displayFrame.width*e.tileScaleX,e.displayFrame.height*e.tileScaleY,e.x,e.y,e.width,e.height,e.scaleX,e.scaleY,e.rotation,e.flipX,e.flipY,e.scrollFactorX,e.scrollFactorY,e.originX*e.width,e.originY*e.height,0,0,e.width,e.height,o(e._tintTL,r.alpha*e._alphaTL),o(e._tintTR,r.alpha*e._alphaTR),o(e._tintBL,r.alpha*e._alphaBL),o(e._tintBR,r.alpha*e._alphaBR),e._isTinted&&e.tintFill,e.tilePositionX%e.displayFrame.width/e.displayFrame.width,e.tilePositionY%e.displayFrame.height/e.displayFrame.height,r,s)}},44336:(t,e,i)=>{var n=i(47379),r=i(90487),s=i(23096),o=i(6783),a=i(80827),h=i(90554),u=i(71700),l=i(31027),c=i(60519),d=i(14302),p=new n({Extends:h,Mixins:[s.Alpha,s.BlendMode,s.Depth,s.Flip,s.GetBounds,s.Mask,s.Origin,s.Pipeline,s.ScrollFactor,s.Size,s.TextureCrop,s.Tint,s.Transform,s.Visible,c],initialize:function(t,e,i,n){h.call(this,t,"Video"),this.video=null,this.videoTexture=null,this.videoTextureSource=null,this.snapshotTexture=null,this.flipY=!1,this._key=l(),this.touchLocked=!0,this.playWhenUnlocked=!1,this.retryLimit=20,this.retry=0,this.retryInterval=500,this._retryID=null,this._systemMuted=!1,this._codeMuted=!1,this._systemPaused=!1,this._codePaused=!1,this._callbacks={play:this.playHandler.bind(this),error:this.loadErrorHandler.bind(this),end:this.completeHandler.bind(this),time:this.timeUpdateHandler.bind(this),seeking:this.seekingHandler.bind(this),seeked:this.seekedHandler.bind(this)},this._crop=this.resetCropObject(),this.markers={},this._markerIn=-1,this._markerOut=d.MAX_SAFE_INTEGER,this._lastUpdate=0,this._cacheKey="",this._isSeeking=!1,this.removeVideoElementOnDestroy=!1,this.setPosition(e,i),this.initPipeline(),n&&this.changeSource(n,!1);var r=t.sys.game.events;r.on(a.PAUSE,this.globalPause,this),r.on(a.RESUME,this.globalResume,this);var s=t.sys.sound;s&&s.on(u.GLOBAL_MUTE,this.globalMute,this)},play:function(t,e,i){if(this.touchLocked&&this.playWhenUnlocked||this.isPlaying())return this;var n=this.video;if(!n)return console.warn("Video not loaded"),this;void 0===t&&(t=n.loop);var r=this.scene.sys.sound;r&&r.mute&&this.setMute(!0),isNaN(e)||(this._markerIn=e),!isNaN(i)&&i>e&&(this._markerOut=i),n.loop=t;var s=this._callbacks,o=n.play();return void 0!==o?o.then(this.playPromiseSuccessHandler.bind(this)).catch(this.playPromiseErrorHandler.bind(this)):(n.addEventListener("playing",s.play,!0),n.readyState<2&&(this.retry=this.retryLimit,this._retryID=window.setTimeout(this.checkVideoProgress.bind(this),this.retryInterval))),n.addEventListener("ended",s.end,!0),n.addEventListener("timeupdate",s.time,!0),n.addEventListener("seeking",s.seeking,!0),n.addEventListener("seeked",s.seeked,!0),this},changeSource:function(t,e,i,n,r){void 0===e&&(e=!0),this.video&&this.stop();var s=this.scene.sys.cache.video.get(t);return s?(this.video=s,this._cacheKey=t,this._codePaused=s.paused,this._codeMuted=s.muted,this.videoTexture?(this.scene.sys.textures.remove(this._key),this.videoTexture=this.scene.sys.textures.create(this._key,s,s.videoWidth,s.videoHeight),this.videoTextureSource=this.videoTexture.source[0],this.videoTexture.add("__BASE",0,0,0,s.videoWidth,s.videoHeight),this.setTexture(this.videoTexture),this.setSizeToFrame(),this.updateDisplayOrigin(),this.emit(o.VIDEO_CREATED,this,s.videoWidth,s.videoHeight)):this.updateTexture(),s.currentTime=0,this._lastUpdate=0,e&&this.play(i,n,r)):this.video=null,this},addMarker:function(t,e,i){return!isNaN(e)&&e>=0&&!isNaN(i)&&(this.markers[t]=[e,i]),this},playMarker:function(t,e){var i=this.markers[t];return i&&this.play(e,i[0],i[1]),this},removeMarker:function(t){return delete this.markers[t],this},snapshot:function(t,e){return void 0===t&&(t=this.width),void 0===e&&(e=this.height),this.snapshotArea(0,0,this.width,this.height,t,e)},snapshotArea:function(t,e,i,n,r,s){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===n&&(n=this.height),void 0===r&&(r=i),void 0===s&&(s=n);var o=this.video,a=this.snapshotTexture;return a?(a.setSize(r,s),o&&a.context.drawImage(o,t,e,i,n,0,0,r,s)):(a=this.scene.sys.textures.createCanvas(l(),r,s),this.snapshotTexture=a,o&&a.context.drawImage(o,t,e,i,n,0,0,r,s)),a.update()},saveSnapshotTexture:function(t){return this.snapshotTexture?this.scene.sys.textures.renameTexture(this.snapshotTexture.key,t):this.snapshotTexture=this.scene.sys.textures.createCanvas(t,this.width,this.height),this.snapshotTexture},loadURL:function(t,e,i){void 0===e&&(e="loadeddata"),void 0===i&&(i=!1),this.video&&this.stop(),this.videoTexture&&this.scene.sys.textures.remove(this._key);var n=document.createElement("video");return n.controls=!1,i&&(n.muted=!0,n.defaultMuted=!0,n.setAttribute("autoplay","autoplay")),n.setAttribute("playsinline","playsinline"),n.setAttribute("preload","auto"),n.addEventListener("error",this._callbacks.error,!0),n.src=t,n.load(),this.video=n,this},playPromiseSuccessHandler:function(){this.touchLocked=!1,this.emit(o.VIDEO_PLAY,this),this._markerIn>-1&&(this.video.currentTime=this._markerIn)},playPromiseErrorHandler:function(t){this.scene.sys.input.once("pointerdown",this.unlockHandler,this),this.touchLocked=!0,this.playWhenUnlocked=!0,this.emit(o.VIDEO_ERROR,this,t)},playHandler:function(){this.touchLocked=!1,this.emit(o.VIDEO_PLAY,this),this.video.removeEventListener("playing",this._callbacks.play,!0)},loadErrorHandler:function(t){this.stop(),this.emit(o.VIDEO_ERROR,this,t)},unlockHandler:function(){this.touchLocked=!1,this.playWhenUnlocked=!1,this.emit(o.VIDEO_UNLOCKED,this),this._markerIn>-1&&(this.video.currentTime=this._markerIn),this.video.play(),this.emit(o.VIDEO_PLAY,this)},completeHandler:function(){this.emit(o.VIDEO_COMPLETE,this)},timeUpdateHandler:function(){this.video&&this.video.currentTime<this._lastUpdate&&(this.emit(o.VIDEO_LOOP,this),this._lastUpdate=0)},preUpdate:function(){var t=this.video;if(t){var e=t.currentTime;e!==this._lastUpdate&&(this._lastUpdate=e,this.updateTexture(),e>=this._markerOut&&(t.loop?(t.currentTime=this._markerIn,this.updateTexture(),this._lastUpdate=e,this.emit(o.VIDEO_LOOP,this)):(this.emit(o.VIDEO_COMPLETE,this),this.stop())))}},checkVideoProgress:function(){this.video.readyState>=2?this.updateTexture():(this.retry--,this.retry>0?this._retryID=window.setTimeout(this.checkVideoProgress.bind(this),this.retryInterval):this.emit(o.VIDEO_TIMEOUT,this))},updateTexture:function(){var t=this.video,e=t.videoWidth,i=t.videoHeight;if(this.videoTexture){var n=this.videoTextureSource;n.source!==t&&(n.source=t,n.width=e,n.height=i),n.update()}else this.videoTexture=this.scene.sys.textures.create(this._key,t,e,i),this.videoTextureSource=this.videoTexture.source[0],this.videoTexture.add("__BASE",0,0,0,e,i),this.setTexture(this.videoTexture),this.setSizeToFrame(),this.updateDisplayOrigin(),this.emit(o.VIDEO_CREATED,this,e,i)},getVideoKey:function(){return this._cacheKey},seekTo:function(t){var e=this.video;if(e){var i=e.duration;if(i!==1/0&&!isNaN(i)){var n=i*t;this.setCurrentTime(n)}}return this},getCurrentTime:function(){return this.video?this.video.currentTime:0},setCurrentTime:function(t){var e=this.video;if(e){if("string"==typeof t){var i=t[0],n=parseFloat(t.substr(1));"+"===i?t=e.currentTime+n:"-"===i&&(t=e.currentTime-n)}e.currentTime=t,this._lastUpdate=t}return this},isSeeking:function(){return this._isSeeking},seekingHandler:function(){this._isSeeking=!0,this.emit(o.VIDEO_SEEKING,this)},seekedHandler:function(){this._isSeeking=!1,this.emit(o.VIDEO_SEEKED,this),this.video&&this.updateTexture()},getProgress:function(){var t=this.video;if(t){var e=t.currentTime,i=t.duration;if(i!==1/0&&!isNaN(i))return e/i}return 0},getDuration:function(){return this.video?this.video.duration:0},setMute:function(t){void 0===t&&(t=!0),this._codeMuted=t;var e=this.video;return e&&(e.muted=!!this._systemMuted||t),this},isMuted:function(){return this._codeMuted},globalMute:function(t,e){this._systemMuted=e;var i=this.video;i&&(i.muted=!!this._codeMuted||e)},globalPause:function(){this._systemPaused=!0,this.video&&this.video.pause()},globalResume:function(){this._systemPaused=!1,this.video&&!this._codePaused&&this.video.play()},setPaused:function(t){void 0===t&&(t=!0);var e=this.video;return this._codePaused=t,e&&(t?e.paused||e.pause():t||e.paused&&!this._systemPaused&&e.play()),this},getVolume:function(){return this.video?this.video.volume:1},setVolume:function(t){return void 0===t&&(t=1),this.video&&(this.video.volume=r(t,0,1)),this},getPlaybackRate:function(){return this.video?this.video.playbackRate:1},setPlaybackRate:function(t){return this.video&&(this.video.playbackRate=t),this},getLoop:function(){return!!this.video&&this.video.loop},setLoop:function(t){return void 0===t&&(t=!0),this.video&&(this.video.loop=t),this},isPlaying:function(){return!!this.video&&!(this.video.paused||this.video.ended)},isPaused:function(){return this.video&&this.video.paused||this._codePaused||this._systemPaused},saveTexture:function(t,e){return void 0===e&&(e=!1),this.videoTexture&&this.scene.sys.textures.renameTexture(this._key,t),this._key=t,this.flipY=e,this.videoTextureSource&&this.videoTextureSource.setFlipY(e),this.videoTexture},stop:function(){var t=this.video;if(t){var e=this._callbacks;for(var i in e)t.removeEventListener(i,e[i],!0);t.pause()}return this._retryID&&window.clearTimeout(this._retryID),this.emit(o.VIDEO_STOP,this),this},removeVideoElement:function(){var t=this.video;if(t){for(t.parentNode&&t.parentNode.removeChild(t);t.hasChildNodes();)t.removeChild(t.firstChild);t.removeAttribute("autoplay"),t.removeAttribute("src"),this.video=null}},preDestroy:function(){this.stop(),this.removeVideoElementOnDestroy&&this.removeVideoElement();var t=this.scene.sys.game.events;t.off(a.PAUSE,this.globalPause,this),t.off(a.RESUME,this.globalResume,this);var e=this.scene.sys.sound;e&&e.off(u.GLOBAL_MUTE,this.globalMute,this),this._retryID&&window.clearTimeout(this._retryID)}});t.exports=p},45319:t=>{t.exports=function(t,e,i,n,r){e.videoTexture&&t.batchSprite(e,e.frame,n,r)}},48200:(t,e,i)=>{var n=i(74865),r=i(17517),s=i(57687),o=i(44336);r.register("video",(function(t,e){void 0===t&&(t={});var i=s(t,"key",null),r=new o(this.scene,0,0,i);return void 0!==e&&(t.add=e),n(this.scene,r,t),r}))},38020:(t,e,i)=>{var n=i(44336);i(81342).register("video",(function(t,e,i){var r=new n(this.scene,t,e,i);return this.displayList.add(r),this.updateList.add(r),r}))},60519:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(97315),r=i(45319),t.exports={renderWebGL:n,renderCanvas:r}},97315:t=>{t.exports=function(t,e,i,n,r){e.videoTexture&&this.pipeline.batchSprite(e,n,r)}},24860:(t,e,i)=>{var n=i(35869),r=i(78265),s=i(59623),o=i(47379),a=i(23096),h=i(90554),u=i(38092),l=i(38593),c=new o({Extends:h,Mixins:[a.Depth,a.GetBounds,a.Origin,a.Transform,a.ScrollFactor,a.Visible],initialize:function(t,e,i,r,s){void 0===r&&(r=1),void 0===s&&(s=r),h.call(this,t,"Zone"),this.setPosition(e,i),this.width=r,this.height=s,this.blendMode=n.NORMAL,this.updateDisplayOrigin()},displayWidth:{get:function(){return this.scaleX*this.width},set:function(t){this.scaleX=t/this.width}},displayHeight:{get:function(){return this.scaleY*this.height},set:function(t){this.scaleY=t/this.height}},setSize:function(t,e,i){void 0===i&&(i=!0),this.width=t,this.height=e,this.updateDisplayOrigin();var n=this.input;return i&&n&&!n.customHitArea&&(n.hitArea.width=t,n.hitArea.height=e),this},setDisplaySize:function(t,e){return this.displayWidth=t,this.displayHeight=e,this},setCircleDropZone:function(t){return this.setDropZone(new r(0,0,t),s)},setRectangleDropZone:function(t,e){return this.setDropZone(new u(0,0,t,e),l)},setDropZone:function(t,e){return void 0===t?this.setRectangleDropZone(this.width,this.height):this.input||this.setInteractive(t,e,!0),this},setAlpha:function(){},setBlendMode:function(){},renderCanvas:function(){},renderWebGL:function(){}});t.exports=c},90932:(t,e,i)=>{var n=i(17517),r=i(57687),s=i(24860);n.register("zone",(function(t){var e=r(t,"x",0),i=r(t,"y",0),n=r(t,"width",1),o=r(t,"height",n);return new s(this.scene,e,i,n,o)}))},3242:(t,e,i)=>{var n=i(24860);i(81342).register("zone",(function(t,e,i,r){return this.displayList.add(new n(this.scene,t,e,i,r))}))},37907:t=>{t.exports=function(t){return t.radius>0?Math.PI*t.radius*t.radius:0}},78265:(t,e,i)=>{var n=i(47379),r=i(59623),s=i(27455),o=i(16469),a=i(67155),h=i(49642),u=new n({initialize:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),this.type=a.CIRCLE,this.x=t,this.y=e,this._radius=i,this._diameter=2*i},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return s(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return h(this,t)},setTo:function(t,e,i){return this.x=t,this.y=e,this._radius=i,this._diameter=2*i,this},setEmpty:function(){return this._radius=0,this._diameter=0,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},isEmpty:function(){return this._radius<=0},radius:{get:function(){return this._radius},set:function(t){this._radius=t,this._diameter=2*t}},diameter:{get:function(){return this._diameter},set:function(t){this._diameter=t,this._radius=.5*t}},left:{get:function(){return this.x-this._radius},set:function(t){this.x=t+this._radius}},right:{get:function(){return this.x+this._radius},set:function(t){this.x=t-this._radius}},top:{get:function(){return this.y-this._radius},set:function(t){this.y=t+this._radius}},bottom:{get:function(){return this.y+this._radius},set:function(t){this.y=t-this._radius}}});t.exports=u},79610:t=>{t.exports=function(t){return Math.PI*t.radius*2}},91900:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){return void 0===i&&(i=new n),i.x=t.x+t.radius*Math.cos(e),i.y=t.y+t.radius*Math.sin(e),i}},85218:(t,e,i)=>{var n=i(78265);t.exports=function(t){return new n(t.x,t.y,t.radius)}},59623:t=>{t.exports=function(t,e,i){return t.radius>0&&e>=t.left&&e<=t.right&&i>=t.top&&i<=t.bottom&&(t.x-e)*(t.x-e)+(t.y-i)*(t.y-i)<=t.radius*t.radius}},61125:(t,e,i)=>{var n=i(59623);t.exports=function(t,e){return n(t,e.x,e.y)}},93778:(t,e,i)=>{var n=i(59623);t.exports=function(t,e){return n(t,e.x,e.y)&&n(t,e.right,e.y)&&n(t,e.x,e.bottom)&&n(t,e.right,e.bottom)}},27903:t=>{t.exports=function(t,e){return e.setTo(t.x,t.y,t.radius)}},78327:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.radius===e.radius}},26854:(t,e,i)=>{var n=i(38092);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.left,e.y=t.top,e.width=t.diameter,e.height=t.diameter,e}},27455:(t,e,i)=>{var n=i(91900),r=i(96210),s=i(14302),o=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new o);var a=r(e,0,s.PI2);return n(t,a,i)}},16469:(t,e,i)=>{var n=i(79610),r=i(91900),s=i(96210),o=i(14302);t.exports=function(t,e,i,a){void 0===a&&(a=[]),!e&&i>0&&(e=n(t)/i);for(var h=0;h<e;h++){var u=s(h/e,0,o.PI2);a.push(r(t,u))}return a}},55195:t=>{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},32373:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},49642:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){void 0===e&&(e=new n);var i=2*Math.PI*Math.random(),r=Math.random()+Math.random(),s=r>1?2-r:r,o=s*Math.cos(i),a=s*Math.sin(i);return e.x=t.x+o*t.radius,e.y=t.y+a*t.radius,e}},14102:(t,e,i)=>{var n=i(78265);n.Area=i(37907),n.Circumference=i(79610),n.CircumferencePoint=i(91900),n.Clone=i(85218),n.Contains=i(59623),n.ContainsPoint=i(61125),n.ContainsRect=i(93778),n.CopyFrom=i(27903),n.Equals=i(78327),n.GetBounds=i(26854),n.GetPoint=i(27455),n.GetPoints=i(16469),n.Offset=i(55195),n.OffsetPoint=i(32373),n.Random=i(49642),t.exports=n},67155:t=>{t.exports={CIRCLE:0,ELLIPSE:1,LINE:2,POINT:3,POLYGON:4,RECTANGLE:5,TRIANGLE:6}},3220:t=>{t.exports=function(t){return t.isEmpty()?0:t.getMajorRadius()*t.getMinorRadius()*Math.PI}},9978:t=>{t.exports=function(t){var e=t.width/2,i=t.height/2,n=Math.pow(e-i,2)/Math.pow(e+i,2);return Math.PI*(e+i)*(1+3*n/(10+Math.sqrt(4-3*n)))}},59200:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=t.width/2,s=t.height/2;return i.x=t.x+r*Math.cos(e),i.y=t.y+s*Math.sin(e),i}},4116:(t,e,i)=>{var n=i(38341);t.exports=function(t){return new n(t.x,t.y,t.width,t.height)}},12930:t=>{t.exports=function(t,e,i){if(t.width<=0||t.height<=0)return!1;var n=(e-t.x)/t.width,r=(i-t.y)/t.height;return(n*=n)+(r*=r)<.25}},82584:(t,e,i)=>{var n=i(12930);t.exports=function(t,e){return n(t,e.x,e.y)}},81677:(t,e,i)=>{var n=i(12930);t.exports=function(t,e){return n(t,e.x,e.y)&&n(t,e.right,e.y)&&n(t,e.x,e.bottom)&&n(t,e.right,e.bottom)}},95696:t=>{t.exports=function(t,e){return e.setTo(t.x,t.y,t.width,t.height)}},38341:(t,e,i)=>{var n=i(47379),r=i(12930),s=i(68516),o=i(3389),a=i(67155),h=i(6129),u=new n({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.type=a.ELLIPSE,this.x=t,this.y=e,this.width=i,this.height=n},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return s(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return h(this,t)},setTo:function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},setEmpty:function(){return this.width=0,this.height=0,this},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},isEmpty:function(){return this.width<=0||this.height<=0},getMinorRadius:function(){return Math.min(this.width,this.height)/2},getMajorRadius:function(){return Math.max(this.width,this.height)/2},left:{get:function(){return this.x-this.width/2},set:function(t){this.x=t+this.width/2}},right:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},top:{get:function(){return this.y-this.height/2},set:function(t){this.y=t+this.height/2}},bottom:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}});t.exports=u},1459:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}},54445:(t,e,i)=>{var n=i(38092);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.left,e.y=t.top,e.width=t.width,e.height=t.height,e}},68516:(t,e,i)=>{var n=i(59200),r=i(96210),s=i(14302),o=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new o);var a=r(e,0,s.PI2);return n(t,a,i)}},3389:(t,e,i)=>{var n=i(9978),r=i(59200),s=i(96210),o=i(14302);t.exports=function(t,e,i,a){void 0===a&&(a=[]),!e&&i>0&&(e=n(t)/i);for(var h=0;h<e;h++){var u=s(h/e,0,o.PI2);a.push(r(t,u))}return a}},90608:t=>{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},19219:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},6129:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){void 0===e&&(e=new n);var i=Math.random()*Math.PI*2,r=Math.sqrt(Math.random());return e.x=t.x+r*Math.cos(i)*t.width/2,e.y=t.y+r*Math.sin(i)*t.height/2,e}},93216:(t,e,i)=>{var n=i(38341);n.Area=i(3220),n.Circumference=i(9978),n.CircumferencePoint=i(59200),n.Clone=i(4116),n.Contains=i(12930),n.ContainsPoint=i(82584),n.ContainsRect=i(81677),n.CopyFrom=i(95696),n.Equals=i(1459),n.GetBounds=i(54445),n.GetPoint=i(68516),n.GetPoints=i(3389),n.Offset=i(90608),n.OffsetPoint=i(19219),n.Random=i(6129),t.exports=n},96285:(t,e,i)=>{var n=i(67155),r=i(80933),s={Circle:i(14102),Ellipse:i(93216),Intersects:i(60583),Line:i(87107),Point:i(38060),Polygon:i(6832),Rectangle:i(35064),Triangle:i(77791)};s=r(!1,s,n),t.exports=s},71011:(t,e,i)=>{var n=i(73587);t.exports=function(t,e){return n(t.x,t.y,e.x,e.y)<=t.radius+e.radius}},90866:t=>{t.exports=function(t,e){var i=e.width/2,n=e.height/2,r=Math.abs(t.x-e.x-i),s=Math.abs(t.y-e.y-n),o=i+t.radius,a=n+t.radius;if(r>o||s>a)return!1;if(r<=i||s<=n)return!0;var h=r-i,u=s-n;return h*h+u*u<=t.radius*t.radius}},16470:(t,e,i)=>{var n=i(40062),r=i(71011);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var s,o,a,h,u=t.x,l=t.y,c=t.radius,d=e.x,p=e.y,f=e.radius;if(l===p)0===(a=(o=-2*p)*o-4*(s=1)*(d*d+(h=(f*f-c*c-d*d+u*u)/(2*(u-d)))*h-2*d*h+p*p-f*f))?i.push(new n(h,-o/(2*s))):a>0&&(i.push(new n(h,(-o+Math.sqrt(a))/(2*s))),i.push(new n(h,(-o-Math.sqrt(a))/(2*s))));else{var m=(u-d)/(l-p),v=(f*f-c*c-d*d+u*u-p*p+l*l)/(2*(l-p));0===(a=(o=2*l*m-2*v*m-2*u)*o-4*(s=m*m+1)*(u*u+l*l+v*v-c*c-2*l*v))?(h=-o/(2*s),i.push(new n(h,v-h*m))):a>0&&(h=(-o+Math.sqrt(a))/(2*s),i.push(new n(h,v-h*m)),h=(-o-Math.sqrt(a))/(2*s),i.push(new n(h,v-h*m)))}}return i}},53690:(t,e,i)=>{var n=i(18559),r=i(90866);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var s=e.getLineA(),o=e.getLineB(),a=e.getLineC(),h=e.getLineD();n(s,t,i),n(o,t,i),n(a,t,i),n(h,t,i)}return i}},18559:(t,e,i)=>{var n=i(40062),r=i(82801);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var s,o,a=t.x1,h=t.y1,u=t.x2,l=t.y2,c=e.x,d=e.y,p=e.radius,f=u-a,m=l-h,v=a-c,g=h-d,y=f*f+m*m,_=2*(f*v+m*g),x=_*_-4*y*(v*v+g*g-p*p);if(0===x){var b=-_/(2*y);s=a+b*f,o=h+b*m,b>=0&&b<=1&&i.push(new n(s,o))}else if(x>0){var w=(-_-Math.sqrt(x))/(2*y);s=a+w*f,o=h+w*m,w>=0&&w<=1&&i.push(new n(s,o));var T=(-_+Math.sqrt(x))/(2*y);s=a+T*f,o=h+T*m,T>=0&&T<=1&&i.push(new n(s,o))}}return i}},49264:(t,e,i)=>{var n=i(40062),r=i(39558),s=i(93403);t.exports=function(t,e,i){if(void 0===i&&(i=[]),s(t,e))for(var o=e.getLineA(),a=e.getLineB(),h=e.getLineC(),u=e.getLineD(),l=[new n,new n,new n,new n],c=[r(o,t,l[0]),r(a,t,l[1]),r(h,t,l[2]),r(u,t,l[3])],d=0;d<4;d++)c[d]&&i.push(l[d]);return i}},1039:(t,e,i)=>{var n=i(38092),r=i(14198);t.exports=function(t,e,i){return void 0===i&&(i=new n),r(t,e)&&(i.x=Math.max(t.x,e.x),i.y=Math.max(t.y,e.y),i.width=Math.min(t.right,e.right)-i.x,i.height=Math.min(t.bottom,e.bottom)-i.y),i}},83150:(t,e,i)=>{var n=i(49264),r=i(14198);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var s=t.getLineA(),o=t.getLineB(),a=t.getLineC(),h=t.getLineD();n(s,e,i),n(o,e,i),n(a,e,i),n(h,e,i)}return i}},59292:(t,e,i)=>{var n=i(89134),r=i(49264);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var s=e.getLineA(),o=e.getLineB(),a=e.getLineC();r(s,t,i),r(o,t,i),r(a,t,i)}return i}},74649:(t,e,i)=>{var n=i(18559),r=i(24144);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e)){var s=t.getLineA(),o=t.getLineB(),a=t.getLineC();n(s,e,i),n(o,e,i),n(a,e,i)}return i}},10858:(t,e,i)=>{var n=i(40062),r=i(61225),s=i(39558);t.exports=function(t,e,i){if(void 0===i&&(i=[]),r(t,e))for(var o=t.getLineA(),a=t.getLineB(),h=t.getLineC(),u=[new n,new n,new n],l=[s(o,e,u[0]),s(a,e,u[1]),s(h,e,u[2])],c=0;c<3;c++)l[c]&&i.push(u[c]);return i}},55116:(t,e,i)=>{var n=i(24888),r=i(10858);t.exports=function(t,e,i){if(void 0===i&&(i=[]),n(t,e)){var s=e.getLineA(),o=e.getLineB(),a=e.getLineC();r(t,s,i),r(t,o,i),r(t,a,i)}return i}},82801:(t,e,i)=>{var n=i(59623),r=new(i(40062));t.exports=function(t,e,i){if(void 0===i&&(i=r),n(e,t.x1,t.y1))return i.x=t.x1,i.y=t.y1,!0;if(n(e,t.x2,t.y2))return i.x=t.x2,i.y=t.y2,!0;var s=t.x2-t.x1,o=t.y2-t.y1,a=e.x-t.x1,h=e.y-t.y1,u=s*s+o*o,l=s,c=o;if(u>0){var d=(a*s+h*o)/u;l*=d,c*=d}return i.x=t.x1+l,i.y=t.y1+c,l*l+c*c<=u&&l*s+c*o>=0&&n(e,i.x,i.y)}},39558:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=t.x1,s=t.y1,o=t.x2,a=t.y2,h=e.x1,u=e.y1,l=e.x2,c=e.y2,d=(c-u)*(o-r)-(l-h)*(a-s);if(0===d)return!1;var p=((l-h)*(s-u)-(c-u)*(r-h))/d,f=((o-r)*(s-u)-(a-s)*(r-h))/d;return p>=0&&p<=1&&f>=0&&f<=1&&(i.x=r+p*(o-r),i.y=s+p*(a-s),!0)}},93403:t=>{t.exports=function(t,e){var i=t.x1,n=t.y1,r=t.x2,s=t.y2,o=e.x,a=e.y,h=e.right,u=e.bottom,l=0;if(i>=o&&i<=h&&n>=a&&n<=u||r>=o&&r<=h&&s>=a&&s<=u)return!0;if(i<o&&r>=o){if((l=n+(s-n)*(o-i)/(r-i))>a&&l<=u)return!0}else if(i>h&&r<=h&&(l=n+(s-n)*(h-i)/(r-i))>=a&&l<=u)return!0;if(n<a&&s>=a){if((l=i+(r-i)*(a-n)/(s-n))>=o&&l<=h)return!0}else if(n>u&&s<=u&&(l=i+(r-i)*(u-n)/(s-n))>=o&&l<=h)return!0;return!1}},9535:t=>{t.exports=function(t,e,i){void 0===i&&(i=1);var n=e.x1,r=e.y1,s=e.x2,o=e.y2,a=t.x,h=t.y,u=(s-n)*(s-n)+(o-r)*(o-r);if(0===u)return!1;var l=((a-n)*(s-n)+(h-r)*(o-r))/u;if(l<0)return Math.sqrt((n-a)*(n-a)+(r-h)*(r-h))<=i;if(l>=0&&l<=1){var c=((r-h)*(s-n)-(n-a)*(o-r))/u;return Math.abs(c)*Math.sqrt(u)<=i}return Math.sqrt((s-a)*(s-a)+(o-h)*(o-h))<=i}},36213:(t,e,i)=>{var n=i(9535);t.exports=function(t,e){if(!n(t,e))return!1;var i=Math.min(e.x1,e.x2),r=Math.max(e.x1,e.x2),s=Math.min(e.y1,e.y2),o=Math.max(e.y1,e.y2);return t.x>=i&&t.x<=r&&t.y>=s&&t.y<=o}},14198:t=>{t.exports=function(t,e){return!(t.width<=0||t.height<=0||e.width<=0||e.height<=0)&&!(t.right<e.x||t.bottom<e.y||t.x>e.right||t.y>e.bottom)}},89134:(t,e,i)=>{var n=i(39558),r=i(38593),s=i(82290),o=i(45109);t.exports=function(t,e){if(e.left>t.right||e.right<t.left||e.top>t.bottom||e.bottom<t.top)return!1;var i=e.getLineA(),a=e.getLineB(),h=e.getLineC();if(r(t,i.x1,i.y1)||r(t,i.x2,i.y2))return!0;if(r(t,a.x1,a.y1)||r(t,a.x2,a.y2))return!0;if(r(t,h.x1,h.y1)||r(t,h.x2,h.y2))return!0;var u=t.getLineA(),l=t.getLineB(),c=t.getLineC(),d=t.getLineD();if(n(i,u)||n(i,l)||n(i,c)||n(i,d))return!0;if(n(a,u)||n(a,l)||n(a,c)||n(a,d))return!0;if(n(h,u)||n(h,l)||n(h,c)||n(h,d))return!0;var p=o(t);return s(e,p,!0).length>0}},61096:t=>{t.exports=function(t,e,i,n,r,s){return void 0===s&&(s=0),!(e>t.right+s||i<t.left-s||n>t.bottom+s||r<t.top-s)}},24144:(t,e,i)=>{var n=i(82801),r=i(92501);t.exports=function(t,e){return!(t.left>e.right||t.right<e.left||t.top>e.bottom||t.bottom<e.top)&&(!!r(t,e.x,e.y)||(!!n(t.getLineA(),e)||(!!n(t.getLineB(),e)||!!n(t.getLineC(),e))))}},61225:(t,e,i)=>{var n=i(92501),r=i(39558);t.exports=function(t,e){return!(!n(t,e.getPointA())&&!n(t,e.getPointB()))||(!!r(t.getLineA(),e)||(!!r(t.getLineB(),e)||!!r(t.getLineC(),e)))}},24888:(t,e,i)=>{var n=i(82290),r=i(17746),s=i(39558);t.exports=function(t,e){if(t.left>e.right||t.right<e.left||t.top>e.bottom||t.bottom<e.top)return!1;var i=t.getLineA(),o=t.getLineB(),a=t.getLineC(),h=e.getLineA(),u=e.getLineB(),l=e.getLineC();if(s(i,h)||s(i,u)||s(i,l))return!0;if(s(o,h)||s(o,u)||s(o,l))return!0;if(s(a,h)||s(a,u)||s(a,l))return!0;var c=r(t),d=n(e,c,!0);return d.length>0||(c=r(e),(d=n(t,c,!0)).length>0)}},60583:(t,e,i)=>{t.exports={CircleToCircle:i(71011),CircleToRectangle:i(90866),GetCircleToCircle:i(16470),GetCircleToRectangle:i(53690),GetLineToCircle:i(18559),GetLineToRectangle:i(49264),GetRectangleIntersection:i(1039),GetRectangleToRectangle:i(83150),GetRectangleToTriangle:i(59292),GetTriangleToCircle:i(74649),GetTriangleToLine:i(10858),GetTriangleToTriangle:i(55116),LineToCircle:i(82801),LineToLine:i(39558),LineToRectangle:i(93403),PointToLine:i(9535),PointToLineSegment:i(36213),RectangleToRectangle:i(14198),RectangleToTriangle:i(89134),RectangleToValues:i(61096),TriangleToCircle:i(24144),TriangleToLine:i(61225),TriangleToTriangle:i(24888)}},57764:t=>{t.exports=function(t){return Math.atan2(t.y2-t.y1,t.x2-t.x1)}},25501:t=>{t.exports=function(t,e,i){void 0===e&&(e=1),void 0===i&&(i=[]);var n=Math.round(t.x1),r=Math.round(t.y1),s=Math.round(t.x2),o=Math.round(t.y2),a=Math.abs(s-n),h=Math.abs(o-r),u=n<s?1:-1,l=r<o?1:-1,c=a-h;i.push({x:n,y:r});for(var d=1;n!==s||r!==o;){var p=c<<1;p>-h&&(c-=h,n+=u),p<a&&(c+=a,r+=l),d%e==0&&i.push({x:n,y:r}),d++}return i}},86724:t=>{t.exports=function(t,e,i){var n=e-(t.x1+t.x2)/2,r=i-(t.y1+t.y2)/2;return t.x1+=n,t.y1+=r,t.x2+=n,t.y2+=r,t}},38114:(t,e,i)=>{var n=i(1137);t.exports=function(t){return new n(t.x1,t.y1,t.x2,t.y2)}},51654:t=>{t.exports=function(t,e){return e.setTo(t.x1,t.y1,t.x2,t.y2)}},88728:t=>{t.exports=function(t,e){return t.x1===e.x1&&t.y1===e.y1&&t.x2===e.x2&&t.y2===e.y2}},50775:(t,e,i)=>{var n=i(53255);t.exports=function(t,e,i){void 0===i&&(i=e);var r=n(t),s=t.x2-t.x1,o=t.y2-t.y1;return e&&(t.x1=t.x1-s/r*e,t.y1=t.y1-o/r*e),i&&(t.x2=t.x2+s/r*i,t.y2=t.y2+o/r*i),t}},2591:(t,e,i)=>{var n=i(25049),r=i(38852),s=i(40062);t.exports=function(t,e,i,o,a){void 0===o&&(o=0),void 0===a&&(a=[]);var h,u,l=[],c=t.x1,d=t.y1,p=t.x2-c,f=t.y2-d,m=r(e,a),v=i-1;for(h=0;h<v;h++)u=m(h/v),l.push(new s(c+p*u,d+f*u));if(u=m(1),l.push(new s(c+p*u,d+f*u)),o>0){var g=l[0],y=[g];for(h=1;h<l.length-1;h++){var _=l[h];n(g,_)>=o&&(y.push(_),g=_)}var x=l[l.length-1];return n(g,x)<o&&y.pop(),y.push(x),y}return l}},92431:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=(t.x1+t.x2)/2,e.y=(t.y1+t.y2)/2,e}},84029:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=t.x1,s=t.y1,o=t.x2,a=t.y2,h=(o-r)*(o-r)+(a-s)*(a-s);if(0===h)return i;var u=((e.x-r)*(o-r)+(e.y-s)*(a-s))/h;return i.x=r+u*(o-r),i.y=s+u*(a-s),i}},11081:(t,e,i)=>{var n=i(14302),r=i(57764),s=i(40062);t.exports=function(t,e){void 0===e&&(e=new s);var i=r(t)-n.TAU;return e.x=Math.cos(i),e.y=Math.sin(i),e}},4652:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){return void 0===i&&(i=new n),i.x=t.x1+(t.x2-t.x1)*e,i.y=t.y1+(t.y2-t.y1)*e,i}},63280:(t,e,i)=>{var n=i(53255),r=i(40062);t.exports=function(t,e,i,s){void 0===s&&(s=[]),!e&&i>0&&(e=n(t)/i);for(var o=t.x1,a=t.y1,h=t.x2,u=t.y2,l=0;l<e;l++){var c=l/e,d=o+(h-o)*c,p=a+(u-a)*c;s.push(new r(d,p))}return s}},99726:t=>{t.exports=function(t,e){var i=t.x1,n=t.y1,r=t.x2,s=t.y2,o=(r-i)*(r-i)+(s-n)*(s-n);if(0===o)return!1;var a=((n-e.y)*(r-i)-(i-e.x)*(s-n))/o;return Math.abs(a)*Math.sqrt(o)}},42961:t=>{t.exports=function(t){return Math.abs(t.y1-t.y2)}},53255:t=>{t.exports=function(t){return Math.sqrt((t.x2-t.x1)*(t.x2-t.x1)+(t.y2-t.y1)*(t.y2-t.y1))}},1137:(t,e,i)=>{var n=i(47379),r=i(4652),s=i(63280),o=i(67155),a=i(89357),h=i(57148),u=new n({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.type=o.LINE,this.x1=t,this.y1=e,this.x2=i,this.y2=n},getPoint:function(t,e){return r(this,t,e)},getPoints:function(t,e,i){return s(this,t,e,i)},getRandomPoint:function(t){return a(this,t)},setTo:function(t,e,i,n){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.x1=t,this.y1=e,this.x2=i,this.y2=n,this},getPointA:function(t){return void 0===t&&(t=new h),t.set(this.x1,this.y1),t},getPointB:function(t){return void 0===t&&(t=new h),t.set(this.x2,this.y2),t},left:{get:function(){return Math.min(this.x1,this.x2)},set:function(t){this.x1<=this.x2?this.x1=t:this.x2=t}},right:{get:function(){return Math.max(this.x1,this.x2)},set:function(t){this.x1>this.x2?this.x1=t:this.x2=t}},top:{get:function(){return Math.min(this.y1,this.y2)},set:function(t){this.y1<=this.y2?this.y1=t:this.y2=t}},bottom:{get:function(){return Math.max(this.y1,this.y2)},set:function(t){this.y1>this.y2?this.y1=t:this.y2=t}}});t.exports=u},69122:(t,e,i)=>{var n=i(14302),r=i(62951),s=i(57764);t.exports=function(t){var e=s(t)-n.TAU;return r(e,-Math.PI,Math.PI)}},26725:(t,e,i)=>{var n=i(14302),r=i(57764);t.exports=function(t){return Math.cos(r(t)-n.TAU)}},75130:(t,e,i)=>{var n=i(14302),r=i(57764);t.exports=function(t){return Math.sin(r(t)-n.TAU)}},97778:t=>{t.exports=function(t,e,i){return t.x1+=e,t.y1+=i,t.x2+=e,t.y2+=i,t}},63142:t=>{t.exports=function(t){return-(t.x2-t.x1)/(t.y2-t.y1)}},89357:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){void 0===e&&(e=new n);var i=Math.random();return e.x=t.x1+i*(t.x2-t.x1),e.y=t.y1+i*(t.y2-t.y1),e}},60297:(t,e,i)=>{var n=i(57764),r=i(69122);t.exports=function(t,e){return 2*r(e)-Math.PI-n(t)}},41353:(t,e,i)=>{var n=i(23145);t.exports=function(t,e){var i=(t.x1+t.x2)/2,r=(t.y1+t.y2)/2;return n(t,i,r,e)}},59193:(t,e,i)=>{var n=i(23145);t.exports=function(t,e,i){return n(t,e.x,e.y,i)}},23145:t=>{t.exports=function(t,e,i,n){var r=Math.cos(n),s=Math.sin(n),o=t.x1-e,a=t.y1-i;return t.x1=o*r-a*s+e,t.y1=o*s+a*r+i,o=t.x2-e,a=t.y2-i,t.x2=o*r-a*s+e,t.y2=o*s+a*r+i,t}},96562:t=>{t.exports=function(t,e,i,n,r){return t.x1=e,t.y1=i,t.x2=e+Math.cos(n)*r,t.y2=i+Math.sin(n)*r,t}},41764:t=>{t.exports=function(t){return(t.y2-t.y1)/(t.x2-t.x1)}},32901:t=>{t.exports=function(t){return Math.abs(t.x1-t.x2)}},87107:(t,e,i)=>{var n=i(1137);n.Angle=i(57764),n.BresenhamPoints=i(25501),n.CenterOn=i(86724),n.Clone=i(38114),n.CopyFrom=i(51654),n.Equals=i(88728),n.Extend=i(50775),n.GetEasedPoints=i(2591),n.GetMidPoint=i(92431),n.GetNearestPoint=i(84029),n.GetNormal=i(11081),n.GetPoint=i(4652),n.GetPoints=i(63280),n.GetShortestDistance=i(99726),n.Height=i(42961),n.Length=i(53255),n.NormalAngle=i(69122),n.NormalX=i(26725),n.NormalY=i(75130),n.Offset=i(97778),n.PerpSlope=i(63142),n.Random=i(89357),n.ReflectAngle=i(60297),n.Rotate=i(41353),n.RotateAroundPoint=i(59193),n.RotateAroundXY=i(23145),n.SetToAngle=i(96562),n.Slope=i(41764),n.Width=i(32901),t.exports=n},43516:t=>{t.exports=function(t){return t.setTo(Math.ceil(t.x),Math.ceil(t.y))}},97105:(t,e,i)=>{var n=i(40062);t.exports=function(t){return new n(t.x,t.y)}},50272:t=>{t.exports=function(t,e){return e.setTo(t.x,t.y)}},72873:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y}},77702:t=>{t.exports=function(t){return t.setTo(Math.floor(t.x),Math.floor(t.y))}},80974:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){if(void 0===e&&(e=new n),!Array.isArray(t))throw new Error("GetCentroid points argument must be an array");var i=t.length;if(i<1)throw new Error("GetCentroid points array must not be empty");if(1===i)e.x=t[0].x,e.y=t[0].y;else{for(var r=0;r<i;r++)e.x+=t[r].x,e.y+=t[r].y;e.x/=i,e.y/=i}return e}},68285:t=>{t.exports=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)}},13796:t=>{t.exports=function(t){return t.x*t.x+t.y*t.y}},74240:(t,e,i)=>{var n=i(38092);t.exports=function(t,e){void 0===e&&(e=new n);for(var i=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=0;a<t.length;a++){var h=t[a];h.x>i&&(i=h.x),h.x<r&&(r=h.x),h.y>s&&(s=h.y),h.y<o&&(o=h.y)}return e.x=r,e.y=o,e.width=i-r,e.height=s-o,e}},5987:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i,r){return void 0===i&&(i=0),void 0===r&&(r=new n),r.x=t.x+(e.x-t.x)*i,r.y=t.y+(e.y-t.y)*i,r}},958:t=>{t.exports=function(t){return t.setTo(t.y,t.x)}},13260:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.setTo(-t.x,-t.y)}},40062:(t,e,i)=>{var n=i(47379),r=i(67155),s=new n({initialize:function(t,e){void 0===t&&(t=0),void 0===e&&(e=t),this.type=r.POINT,this.x=t,this.y=e},setTo:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x=t,this.y=e,this}});t.exports=s},38372:(t,e,i)=>{var n=i(40062),r=i(13796);t.exports=function(t,e,i){void 0===i&&(i=new n);var s=(t.x*e.x+t.y*e.y)/r(e);return 0!==s&&(i.x=s*e.x,i.y=s*e.y),i}},78231:(t,e,i)=>{var n=i(40062);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=t.x*e.x+t.y*e.y;return 0!==r&&(i.x=r*e.x,i.y=r*e.y),i}},38736:(t,e,i)=>{var n=i(68285);t.exports=function(t,e){if(0!==t.x||0!==t.y){var i=n(t);t.x/=i,t.y/=i}return t.x*=e,t.y*=e,t}},38060:(t,e,i)=>{var n=i(40062);n.Ceil=i(43516),n.Clone=i(97105),n.CopyFrom=i(50272),n.Equals=i(72873),n.Floor=i(77702),n.GetCentroid=i(80974),n.GetMagnitude=i(68285),n.GetMagnitudeSq=i(13796),n.GetRectangleFromPoints=i(74240),n.Interpolate=i(5987),n.Invert=i(958),n.Negative=i(13260),n.Project=i(38372),n.ProjectUnit=i(78231),n.SetMagnitude=i(38736),t.exports=n},92605:(t,e,i)=>{var n=i(72064);t.exports=function(t){return new n(t.points)}},65733:t=>{t.exports=function(t,e,i){for(var n=!1,r=-1,s=t.points.length-1;++r<t.points.length;s=r){var o=t.points[r].x,a=t.points[r].y,h=t.points[s].x,u=t.points[s].y;(a<=i&&i<u||u<=i&&i<a)&&e<(h-o)*(i-a)/(u-a)+o&&(n=!n)}return n}},72386:(t,e,i)=>{var n=i(65733);t.exports=function(t,e){return n(t,e.x,e.y)}},43574:t=>{"use strict";function e(t,e,s){s=s||2;var o,a,h,c,p,f,m,v=e&&e.length,g=v?e[0]*s:t.length,y=i(t,0,g,s,!0),_=[];if(!y||y.next===y.prev)return _;if(v&&(y=function(t,e,r,s){var o,a,h,c=[];for(o=0,a=e.length;o<a;o++)(h=i(t,e[o]*s,o<a-1?e[o+1]*s:t.length,s,!1))===h.next&&(h.steiner=!0),c.push(d(h));for(c.sort(u),o=0;o<c.length;o++)l(c[o],r),r=n(r,r.next);return r}(t,e,y,s)),t.length>80*s){o=h=t[0],a=c=t[1];for(var x=s;x<g;x+=s)(p=t[x])<o&&(o=p),(f=t[x+1])<a&&(a=f),p>h&&(h=p),f>c&&(c=f);m=0!==(m=Math.max(h-o,c-a))?1/m:0}return r(y,_,s,o,a,m),_}function i(t,e,i,n,r){var s,o;if(r===T(t,e,i,n)>0)for(s=e;s<i;s+=n)o=x(s,t[s],t[s+1],o);else for(s=i-n;s>=e;s-=n)o=x(s,t[s],t[s+1],o);return o&&v(o,o.next)&&(b(o),o=o.next),o}function n(t,e){if(!t)return t;e||(e=t);var i,n=t;do{if(i=!1,n.steiner||!v(n,n.next)&&0!==m(n.prev,n,n.next))n=n.next;else{if(b(n),(n=e=n.prev)===n.next)break;i=!0}}while(i||n!==e);return e}function r(t,e,i,u,l,d,p){if(t){!p&&d&&function(t,e,i,n){var r=t;do{null===r.z&&(r.z=c(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){var e,i,n,r,s,o,a,h,u=1;do{for(i=t,t=null,s=null,o=0;i;){for(o++,n=i,a=0,e=0;e<u&&(a++,n=n.nextZ);e++);for(h=u;a>0||h>0&&n;)0!==a&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,a--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,u*=2}while(o>1)}(r)}(t,u,l,d);for(var f,m,v=t;t.prev!==t.next;)if(f=t.prev,m=t.next,d?o(t,u,l,d):s(t))e.push(f.i/i),e.push(t.i/i),e.push(m.i/i),b(t),t=m.next,v=m.next;else if((t=m)===v){p?1===p?r(t=a(t,e,i),e,i,u,l,d,2):2===p&&h(t,e,i,u,l,d):r(n(t),e,i,u,l,d,1);break}}}function s(t){var e=t.prev,i=t,n=t.next;if(m(e,i,n)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(p(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&m(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function o(t,e,i,n){var r=t.prev,s=t,o=t.next;if(m(r,s,o)>=0)return!1;for(var a=r.x<s.x?r.x<o.x?r.x:o.x:s.x<o.x?s.x:o.x,h=r.y<s.y?r.y<o.y?r.y:o.y:s.y<o.y?s.y:o.y,u=r.x>s.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,l=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,d=c(a,h,e,i,n),f=c(u,l,e,i,n),v=t.prevZ,g=t.nextZ;v&&v.z>=d&&g&&g.z<=f;){if(v!==t.prev&&v!==t.next&&p(r.x,r.y,s.x,s.y,o.x,o.y,v.x,v.y)&&m(v.prev,v,v.next)>=0)return!1;if(v=v.prevZ,g!==t.prev&&g!==t.next&&p(r.x,r.y,s.x,s.y,o.x,o.y,g.x,g.y)&&m(g.prev,g,g.next)>=0)return!1;g=g.nextZ}for(;v&&v.z>=d;){if(v!==t.prev&&v!==t.next&&p(r.x,r.y,s.x,s.y,o.x,o.y,v.x,v.y)&&m(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;g&&g.z<=f;){if(g!==t.prev&&g!==t.next&&p(r.x,r.y,s.x,s.y,o.x,o.y,g.x,g.y)&&m(g.prev,g,g.next)>=0)return!1;g=g.nextZ}return!0}function a(t,e,i){var n=t;do{var r=n.prev,s=n.next.next;!v(r,s)&&g(r,n,n.next,s)&&y(r,s)&&y(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),b(n),b(n.next),n=t=s),n=n.next}while(n!==t);return n}function h(t,e,i,s,o,a){var h=t;do{for(var u=h.next.next;u!==h.prev;){if(h.i!==u.i&&f(h,u)){var l=_(h,u);return h=n(h,h.next),l=n(l,l.next),r(h,e,i,s,o,a),void r(l,e,i,s,o,a)}u=u.next}h=h.next}while(h!==t)}function u(t,e){return t.x-e.x}function l(t,e){if(e=function(t,e){var i,n=e,r=t.x,s=t.y,o=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var a=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=r&&a>o){if(o=a,a===r){if(s===n.y)return n;if(s===n.next.y)return n.next}i=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!i)return null;if(r===o)return i.prev;var h,u=i,l=i.x,c=i.y,d=1/0;n=i.next;for(;n!==u;)r>=n.x&&n.x>=l&&r!==n.x&&p(s<c?r:o,s,l,c,s<c?o:r,s,n.x,n.y)&&((h=Math.abs(s-n.y)/(r-n.x))<d||h===d&&n.x>i.x)&&y(n,t)&&(i=n,d=h),n=n.next;return i}(t,e)){var i=_(e,t);n(i,i.next)}}function c(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function d(t){var e=t,i=t;do{e.x<i.x&&(i=e),e=e.next}while(e!==t);return i}function p(t,e,i,n,r,s,o,a){return(r-o)*(e-a)-(t-o)*(s-a)>=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(s-a)-(r-o)*(n-a)>=0}function f(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&g(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&y(t,e)&&y(e,t)&&function(t,e){var i=t,n=!1,r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)}function m(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function v(t,e){return t.x===e.x&&t.y===e.y}function g(t,e,i,n){return!!(v(t,e)&&v(i,n)||v(t,n)&&v(i,e))||m(t,e,i)>0!=m(t,e,n)>0&&m(i,n,t)>0!=m(i,n,e)>0}function y(t,e){return m(t.prev,t,t.next)<0?m(t,e,t.next)>=0&&m(t,t.prev,e)>=0:m(t,e,t.prev)<0||m(t,t.next,e)<0}function _(t,e){var i=new w(t.i,t.x,t.y),n=new w(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function x(t,e,i,n){var r=new w(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function b(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function w(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function T(t,e,i,n){for(var r=0,s=e,o=i-n;s<i;s+=n)r+=(t[o]-t[s])*(t[s+1]+t[o+1]),o=s;return r}t.exports=e,e.deviation=function(t,e,i,n){var r=e&&e.length,s=r?e[0]*i:t.length,o=Math.abs(T(t,0,s,i));if(r)for(var a=0,h=e.length;a<h;a++){var u=e[a]*i,l=a<h-1?e[a+1]*i:t.length;o-=Math.abs(T(t,u,l,i))}var c=0;for(a=0;a<n.length;a+=3){var d=n[a]*i,p=n[a+1]*i,f=n[a+2]*i;c+=Math.abs((t[d]-t[f])*(t[p+1]-t[d+1])-(t[d]-t[p])*(t[f+1]-t[d+1]))}return 0===o&&0===c?0:Math.abs((c-o)/o)},e.flatten=function(t){for(var e=t[0][0].length,i={vertices:[],holes:[],dimensions:e},n=0,r=0;r<t.length;r++){for(var s=0;s<t[r].length;s++)for(var o=0;o<e;o++)i.vertices.push(t[r][s][o]);r>0&&(n+=t[r-1].length,i.holes.push(n))}return i}},9248:(t,e,i)=>{var n=i(38092);t.exports=function(t,e){void 0===e&&(e=new n);for(var i,r=1/0,s=1/0,o=-r,a=-s,h=0;h<t.points.length;h++)i=t.points[h],r=Math.min(r,i.x),s=Math.min(s,i.y),o=Math.max(o,i.x),a=Math.max(a,i.y);return e.x=r,e.y=s,e.width=o-r,e.height=a-s,e}},83352:t=>{t.exports=function(t,e){void 0===e&&(e=[]);for(var i=0;i<t.points.length;i++)e.push(t.points[i].x),e.push(t.points[i].y);return e}},45583:(t,e,i)=>{var n=i(53255),r=i(1137),s=i(6818);t.exports=function(t,e,i,o){void 0===o&&(o=[]);var a=t.points,h=s(t);!e&&i>0&&(e=h/i);for(var u=0;u<e;u++)for(var l=h*(u/e),c=0,d=0;d<a.length;d++){var p=a[d],f=a[(d+1)%a.length],m=new r(p.x,p.y,f.x,f.y),v=n(m);if(!(l<c||l>c+v)){var g=m.getPoint((l-c)/v);o.push(g);break}c+=v}return o}},6818:(t,e,i)=>{var n=i(53255),r=i(1137);t.exports=function(t){for(var e=t.points,i=0,s=0;s<e.length;s++){var o=e[s],a=e[(s+1)%e.length],h=new r(o.x,o.y,a.x,a.y);i+=n(h)}return i}},72064:(t,e,i)=>{var n=i(47379),r=i(65733),s=i(45583),o=i(67155),a=new n({initialize:function(t){this.type=o.POLYGON,this.area=0,this.points=[],t&&this.setTo(t)},contains:function(t,e){return r(this,t,e)},setTo:function(t){if(this.area=0,this.points=[],"string"==typeof t&&(t=t.split(" ")),!Array.isArray(t))return this;for(var e,i=Number.MAX_VALUE,n=0;n<t.length;n++)e={x:0,y:0},"number"==typeof t[n]||"string"==typeof t[n]?(e.x=parseFloat(t[n]),e.y=parseFloat(t[n+1]),n++):Array.isArray(t[n])?(e.x=t[n][0],e.y=t[n][1]):(e.x=t[n].x,e.y=t[n].y),this.points.push(e),e.y<i&&(i=e.y);return this.calculateArea(i),this},calculateArea:function(){if(this.points.length<3)return this.area=0,this.area;for(var t,e,i=0,n=0;n<this.points.length-1;n++)t=this.points[n],i+=((e=this.points[n+1]).x-t.x)*(t.y+e.y);return t=this.points[0],e=this.points[this.points.length-1],i+=(t.x-e.x)*(e.y+t.y),this.area=.5*-i,this.area},getPoints:function(t,e,i){return s(this,t,e,i)}});t.exports=a},3780:t=>{t.exports=function(t){return t.points.reverse(),t}},92556:t=>{var e=function(t,e){return t[0]=e[0],t[1]=e[1],t};t.exports=function(t){var i,n=[],r=t.points;for(i=0;i<r.length;i++)n.push([r[i].x,r[i].y]);var s=[];for(n.length>0&&s.push(e([0,0],n[0])),i=0;i<n.length-1;i++){var o=n[i],a=n[i+1],h=o[0],u=o[1],l=a[0],c=a[1];s.push([.85*h+.15*l,.85*u+.15*c]),s.push([.15*h+.85*l,.15*u+.85*c])}return n.length>1&&s.push(e([0,0],n[n.length-1])),t.setTo(s)}},6832:(t,e,i)=>{var n=i(72064);n.Clone=i(92605),n.Contains=i(65733),n.ContainsPoint=i(72386),n.GetAABB=i(9248),n.GetNumberArray=i(83352),n.GetPoints=i(45583),n.Perimeter=i(6818),n.Reverse=i(3780),n.Smooth=i(92556),t.exports=n},79084:t=>{t.exports=function(t){return t.width*t.height}},95500:t=>{t.exports=function(t){return t.x=Math.ceil(t.x),t.y=Math.ceil(t.y),t}},3592:t=>{t.exports=function(t){return t.x=Math.ceil(t.x),t.y=Math.ceil(t.y),t.width=Math.ceil(t.width),t.height=Math.ceil(t.height),t}},23389:t=>{t.exports=function(t,e,i){return t.x=e-t.width/2,t.y=i-t.height/2,t}},3598:(t,e,i)=>{var n=i(38092);t.exports=function(t){return new n(t.x,t.y,t.width,t.height)}},38593:t=>{t.exports=function(t,e,i){return!(t.width<=0||t.height<=0)&&(t.x<=e&&t.x+t.width>=e&&t.y<=i&&t.y+t.height>=i)}},68407:(t,e,i)=>{var n=i(38593);t.exports=function(t,e){return n(t,e.x,e.y)}},19019:t=>{t.exports=function(t,e){return!(e.width*e.height>t.width*t.height)&&(e.x>t.x&&e.x<t.right&&e.right>t.x&&e.right<t.right&&e.y>t.y&&e.y<t.bottom&&e.bottom>t.y&&e.bottom<t.bottom)}},72806:t=>{t.exports=function(t,e){return e.setTo(t.x,t.y,t.width,t.height)}},45109:t=>{t.exports=function(t,e){return void 0===e&&(e=[]),e.push({x:t.x,y:t.y}),e.push({x:t.right,y:t.y}),e.push({x:t.right,y:t.bottom}),e.push({x:t.x,y:t.bottom}),e}},66907:t=>{t.exports=function(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}},18782:(t,e,i)=>{var n=i(26114);t.exports=function(t,e){var i=n(t);return i<n(e)?t.setSize(e.height*i,e.height):t.setSize(e.width,e.width/i),t.setPosition(e.centerX-t.width/2,e.centerY-t.height/2)}},91536:(t,e,i)=>{var n=i(26114);t.exports=function(t,e){var i=n(t);return i>n(e)?t.setSize(e.height*i,e.height):t.setSize(e.width,e.width/i),t.setPosition(e.centerX-t.width/2,e.centerY-t.height/2)}},4232:t=>{t.exports=function(t){return t.x=Math.floor(t.x),t.y=Math.floor(t.y),t}},13421:t=>{t.exports=function(t){return t.x=Math.floor(t.x),t.y=Math.floor(t.y),t.width=Math.floor(t.width),t.height=Math.floor(t.height),t}},46141:(t,e,i)=>{var n=i(38092),r=i(14302);t.exports=function(t,e){if(void 0===e&&(e=new n),0===t.length)return e;for(var i,s,o,a=Number.MAX_VALUE,h=Number.MAX_VALUE,u=r.MIN_SAFE_INTEGER,l=r.MIN_SAFE_INTEGER,c=0;c<t.length;c++)i=t[c],Array.isArray(i)?(s=i[0],o=i[1]):(s=i.x,o=i.y),a=Math.min(a,s),h=Math.min(h,o),u=Math.max(u,s),l=Math.max(l,o);return e.x=a,e.y=h,e.width=u-a,e.height=l-h,e}},37632:(t,e,i)=>{var n=i(38092);t.exports=function(t,e,i,r,s){return void 0===s&&(s=new n),s.setTo(Math.min(t,i),Math.min(e,r),Math.abs(t-i),Math.abs(e-r))}},26114:t=>{t.exports=function(t){return 0===t.height?NaN:t.width/t.height}},5959:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.centerX,e.y=t.centerY,e}},34508:(t,e,i)=>{var n=i(31773),r=i(40062);t.exports=function(t,e,i){if(void 0===i&&(i=new r),e<=0||e>=1)return i.x=t.x,i.y=t.y,i;var s=n(t)*e;return e>.5?(s-=t.width+t.height)<=t.width?(i.x=t.right-s,i.y=t.bottom):(i.x=t.x,i.y=t.bottom-(s-t.width)):s<=t.width?(i.x=t.x+s,i.y=t.y):(i.x=t.right,i.y=t.y+(s-t.width)),i}},10824:(t,e,i)=>{var n=i(34508),r=i(31773);t.exports=function(t,e,i,s){void 0===s&&(s=[]),!e&&i>0&&(e=r(t)/i);for(var o=0;o<e;o++){var a=o/e;s.push(n(t,a))}return s}},37962:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.width,e.y=t.height,e}},66310:(t,e,i)=>{var n=i(23389);t.exports=function(t,e,i){var r=t.centerX,s=t.centerY;return t.setSize(t.width+2*e,t.height+2*i),n(t,r,s)}},49916:(t,e,i)=>{var n=i(38092),r=i(14198);t.exports=function(t,e,i){return void 0===i&&(i=new n),r(t,e)?(i.x=Math.max(t.x,e.x),i.y=Math.max(t.y,e.y),i.width=Math.min(t.right,e.right)-i.x,i.height=Math.min(t.bottom,e.bottom)-i.y):i.setEmpty(),i}},56080:(t,e,i)=>{var n=i(31773),r=i(40062);t.exports=function(t,e,i,s){if(void 0===s&&(s=[]),!e&&!i)return s;e?i=Math.round(n(t)/e):e=n(t)/i;for(var o=t.x,a=t.y,h=0,u=0;u<i;u++)switch(s.push(new r(o,a)),h){case 0:(o+=e)>=t.right&&(h=1,a+=o-t.right,o=t.right);break;case 1:(a+=e)>=t.bottom&&(h=2,o-=a-t.bottom,a=t.bottom);break;case 2:(o-=e)<=t.left&&(h=3,a-=t.left-o,o=t.left);break;case 3:(a-=e)<=t.top&&(h=0,a=t.top)}return s}},62854:t=>{t.exports=function(t,e){for(var i=t.x,n=t.right,r=t.y,s=t.bottom,o=0;o<e.length;o++)i=Math.min(i,e[o].x),n=Math.max(n,e[o].x),r=Math.min(r,e[o].y),s=Math.max(s,e[o].y);return t.x=i,t.y=r,t.width=n-i,t.height=s-r,t}},78008:t=>{t.exports=function(t,e){var i=Math.min(t.x,e.x),n=Math.max(t.right,e.right);t.x=i,t.width=n-i;var r=Math.min(t.y,e.y),s=Math.max(t.bottom,e.bottom);return t.y=r,t.height=s-r,t}},91609:t=>{t.exports=function(t,e,i){var n=Math.min(t.x,e),r=Math.max(t.right,e);t.x=n,t.width=r-n;var s=Math.min(t.y,i),o=Math.max(t.bottom,i);return t.y=s,t.height=o-s,t}},16949:t=>{t.exports=function(t,e,i){return t.x+=e,t.y+=i,t}},74450:t=>{t.exports=function(t,e){return t.x+=e.x,t.y+=e.y,t}},94794:t=>{t.exports=function(t,e){return t.x<e.right&&t.right>e.x&&t.y<e.bottom&&t.bottom>e.y}},31773:t=>{t.exports=function(t){return 2*(t.width+t.height)}},50563:(t,e,i)=>{var n=i(40062),r=i(98436);t.exports=function(t,e,i){void 0===i&&(i=new n),e=r(e);var s=Math.sin(e),o=Math.cos(e),a=o>0?t.width/2:t.width/-2,h=s>0?t.height/2:t.height/-2;return Math.abs(a*s)<Math.abs(h*o)?h=a*s/o:a=h*o/s,i.x=a+t.centerX,i.y=h+t.centerY,i}},69633:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=t.x+Math.random()*t.width,e.y=t.y+Math.random()*t.height,e}},62148:(t,e,i)=>{var n=i(67630),r=i(19019),s=i(40062);t.exports=function(t,e,i){if(void 0===i&&(i=new s),r(t,e))switch(n(0,3)){case 0:i.x=t.x+Math.random()*(e.right-t.x),i.y=t.y+Math.random()*(e.top-t.y);break;case 1:i.x=e.x+Math.random()*(t.right-e.x),i.y=e.bottom+Math.random()*(t.bottom-e.bottom);break;case 2:i.x=t.x+Math.random()*(e.x-t.x),i.y=e.y+Math.random()*(t.bottom-e.y);break;case 3:i.x=e.right+Math.random()*(t.right-e.right),i.y=t.y+Math.random()*(e.bottom-t.y)}return i}},38092:(t,e,i)=>{var n=i(47379),r=i(38593),s=i(34508),o=i(10824),a=i(67155),h=i(1137),u=i(69633),l=new n({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.type=a.RECTANGLE,this.x=t,this.y=e,this.width=i,this.height=n},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return s(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return u(this,t)},setTo:function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},setEmpty:function(){return this.setTo(0,0,0,0)},setPosition:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setSize:function(t,e){return void 0===e&&(e=t),this.width=t,this.height=e,this},isEmpty:function(){return this.width<=0||this.height<=0},getLineA:function(t){return void 0===t&&(t=new h),t.setTo(this.x,this.y,this.right,this.y),t},getLineB:function(t){return void 0===t&&(t=new h),t.setTo(this.right,this.y,this.right,this.bottom),t},getLineC:function(t){return void 0===t&&(t=new h),t.setTo(this.right,this.bottom,this.x,this.bottom),t},getLineD:function(t){return void 0===t&&(t=new h),t.setTo(this.x,this.bottom,this.x,this.y),t},left:{get:function(){return this.x},set:function(t){t>=this.right?this.width=0:this.width=this.right-t,this.x=t}},right:{get:function(){return this.x+this.width},set:function(t){t<=this.x?this.width=0:this.width=t-this.x}},top:{get:function(){return this.y},set:function(t){t>=this.bottom?this.height=0:this.height=this.bottom-t,this.y=t}},bottom:{get:function(){return this.y+this.height},set:function(t){t<=this.y?this.height=0:this.height=t-this.y}},centerX:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}});t.exports=l},2780:t=>{t.exports=function(t,e){return t.width===e.width&&t.height===e.height}},26296:t=>{t.exports=function(t,e,i){return void 0===i&&(i=e),t.width*=e,t.height*=i,t}},71768:(t,e,i)=>{var n=i(38092);t.exports=function(t,e,i){void 0===i&&(i=new n);var r=Math.min(t.x,e.x),s=Math.min(t.y,e.y),o=Math.max(t.right,e.right)-r,a=Math.max(t.bottom,e.bottom)-s;return i.setTo(r,s,o,a)}},35064:(t,e,i)=>{var n=i(38092);n.Area=i(79084),n.Ceil=i(95500),n.CeilAll=i(3592),n.CenterOn=i(23389),n.Clone=i(3598),n.Contains=i(38593),n.ContainsPoint=i(68407),n.ContainsRect=i(19019),n.CopyFrom=i(72806),n.Decompose=i(45109),n.Equals=i(66907),n.FitInside=i(18782),n.FitOutside=i(91536),n.Floor=i(4232),n.FloorAll=i(13421),n.FromPoints=i(46141),n.FromXY=i(37632),n.GetAspectRatio=i(26114),n.GetCenter=i(5959),n.GetPoint=i(34508),n.GetPoints=i(10824),n.GetSize=i(37962),n.Inflate=i(66310),n.Intersection=i(49916),n.MarchingAnts=i(56080),n.MergePoints=i(62854),n.MergeRect=i(78008),n.MergeXY=i(91609),n.Offset=i(16949),n.OffsetPoint=i(74450),n.Overlaps=i(94794),n.Perimeter=i(31773),n.PerimeterPoint=i(50563),n.Random=i(69633),n.RandomOutside=i(62148),n.SameDimensions=i(2780),n.Scale=i(26296),n.Union=i(71768),t.exports=n},29635:t=>{t.exports=function(t){var e=t.x1,i=t.y1,n=t.x2,r=t.y2,s=t.x3,o=t.y3;return Math.abs(((s-e)*(r-i)-(n-e)*(o-i))/2)}},43316:(t,e,i)=>{var n=i(50730);t.exports=function(t,e,i){var r=i*(Math.sqrt(3)/2);return new n(t,e,t+i/2,e+r,t-i/2,e+r)}},28073:(t,e,i)=>{var n=i(43574),r=i(50730);t.exports=function(t,e,i,s,o){void 0===e&&(e=null),void 0===i&&(i=1),void 0===s&&(s=1),void 0===o&&(o=[]);for(var a,h,u,l,c,d,p,f,m,v=n(t,e),g=0;g<v.length;g+=3)a=v[g],h=v[g+1],u=v[g+2],l=t[2*a]*i,c=t[2*a+1]*s,d=t[2*h]*i,p=t[2*h+1]*s,f=t[2*u]*i,m=t[2*u+1]*s,o.push(new r(l,c,d,p,f,m));return o}},22121:(t,e,i)=>{var n=i(50730);t.exports=function(t,e,i,r){return void 0===r&&(r=i),new n(t,e,t,e-r,t+i,e)}},32748:(t,e,i)=>{var n=i(78661),r=i(29725);t.exports=function(t,e,i,s){void 0===s&&(s=n);var o=s(t),a=e-o.x,h=i-o.y;return r(t,a,h)}},78661:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){return void 0===e&&(e=new n),e.x=(t.x1+t.x2+t.x3)/3,e.y=(t.y1+t.y2+t.y3)/3,e}},52100:(t,e,i)=>{var n=i(57148);function r(t,e,i,n){return t*n-e*i}t.exports=function(t,e){void 0===e&&(e=new n);var i=t.x3,s=t.y3,o=t.x1-i,a=t.y1-s,h=t.x2-i,u=t.y2-s,l=2*r(o,a,h,u),c=r(a,o*o+a*a,u,h*h+u*u),d=r(o,o*o+a*a,h,h*h+u*u);return e.x=i-c/l,e.y=s+d/l,e}},76602:(t,e,i)=>{var n=i(78265);t.exports=function(t,e){void 0===e&&(e=new n);var i,r,s=t.x1,o=t.y1,a=t.x2,h=t.y2,u=t.x3,l=t.y3,c=a-s,d=h-o,p=u-s,f=l-o,m=c*(s+a)+d*(o+h),v=p*(s+u)+f*(o+l),g=2*(c*(l-h)-d*(u-a));if(Math.abs(g)<1e-6){var y=Math.min(s,a,u),_=Math.min(o,h,l);i=.5*(Math.max(s,a,u)-y),r=.5*(Math.max(o,h,l)-_),e.x=y+i,e.y=_+r,e.radius=Math.sqrt(i*i+r*r)}else e.x=(f*m-d*v)/g,e.y=(c*v-p*m)/g,i=e.x-s,r=e.y-o,e.radius=Math.sqrt(i*i+r*r);return e}},65638:(t,e,i)=>{var n=i(50730);t.exports=function(t){return new n(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)}},92501:t=>{t.exports=function(t,e,i){var n=t.x3-t.x1,r=t.y3-t.y1,s=t.x2-t.x1,o=t.y2-t.y1,a=e-t.x1,h=i-t.y1,u=n*n+r*r,l=n*s+r*o,c=n*a+r*h,d=s*s+o*o,p=s*a+o*h,f=u*d-l*l,m=0===f?0:1/f,v=(d*c-l*p)*m,g=(u*p-l*c)*m;return v>=0&&g>=0&&v+g<1}},82290:t=>{t.exports=function(t,e,i,n){void 0===i&&(i=!1),void 0===n&&(n=[]);for(var r,s,o,a,h,u,l=t.x3-t.x1,c=t.y3-t.y1,d=t.x2-t.x1,p=t.y2-t.y1,f=l*l+c*c,m=l*d+c*p,v=d*d+p*p,g=f*v-m*m,y=0===g?0:1/g,_=t.x1,x=t.y1,b=0;b<e.length&&(s=(f*(u=d*(o=e[b].x-_)+p*(a=e[b].y-x))-m*(h=l*o+c*a))*y,!((r=(v*h-m*u)*y)>=0&&s>=0&&r+s<1&&(n.push({x:e[b].x,y:e[b].y}),i)));b++);return n}},22995:(t,e,i)=>{var n=i(92501);t.exports=function(t,e){return n(t,e.x,e.y)}},36855:t=>{t.exports=function(t,e){return e.setTo(t.x1,t.y1,t.x2,t.y2,t.x3,t.y3)}},17746:t=>{t.exports=function(t,e){return void 0===e&&(e=[]),e.push({x:t.x1,y:t.y1}),e.push({x:t.x2,y:t.y2}),e.push({x:t.x3,y:t.y3}),e}},17048:t=>{t.exports=function(t,e){return t.x1===e.x1&&t.y1===e.y1&&t.x2===e.x2&&t.y2===e.y2&&t.x3===e.x3&&t.y3===e.y3}},51681:(t,e,i)=>{var n=i(40062),r=i(53255);t.exports=function(t,e,i){void 0===i&&(i=new n);var s=t.getLineA(),o=t.getLineB(),a=t.getLineC();if(e<=0||e>=1)return i.x=s.x1,i.y=s.y1,i;var h=r(s),u=r(o),l=r(a),c=(h+u+l)*e,d=0;return c<h?(d=c/h,i.x=s.x1+(s.x2-s.x1)*d,i.y=s.y1+(s.y2-s.y1)*d):c>h+u?(d=(c-=h+u)/l,i.x=a.x1+(a.x2-a.x1)*d,i.y=a.y1+(a.y2-a.y1)*d):(d=(c-=h)/u,i.x=o.x1+(o.x2-o.x1)*d,i.y=o.y1+(o.y2-o.y1)*d),i}},79485:(t,e,i)=>{var n=i(53255),r=i(40062);t.exports=function(t,e,i,s){void 0===s&&(s=[]);var o=t.getLineA(),a=t.getLineB(),h=t.getLineC(),u=n(o),l=n(a),c=n(h),d=u+l+c;!e&&i>0&&(e=d/i);for(var p=0;p<e;p++){var f=d*(p/e),m=0,v=new r;f<u?(m=f/u,v.x=o.x1+(o.x2-o.x1)*m,v.y=o.y1+(o.y2-o.y1)*m):f>u+l?(m=(f-=u+l)/c,v.x=h.x1+(h.x2-h.x1)*m,v.y=h.y1+(h.y2-h.y1)*m):(m=(f-=u)/l,v.x=a.x1+(a.x2-a.x1)*m,v.y=a.y1+(a.y2-a.y1)*m),s.push(v)}return s}},36738:(t,e,i)=>{var n=i(40062);function r(t,e,i,n){var r=t-i,s=e-n,o=r*r+s*s;return Math.sqrt(o)}t.exports=function(t,e){void 0===e&&(e=new n);var i=t.x1,s=t.y1,o=t.x2,a=t.y2,h=t.x3,u=t.y3,l=r(h,u,o,a),c=r(i,s,h,u),d=r(o,a,i,s),p=l+c+d;return e.x=(i*l+o*c+h*d)/p,e.y=(s*l+a*c+u*d)/p,e}},29725:t=>{t.exports=function(t,e,i){return t.x1+=e,t.y1+=i,t.x2+=e,t.y2+=i,t.x3+=e,t.y3+=i,t}},71019:(t,e,i)=>{var n=i(53255);t.exports=function(t){var e=t.getLineA(),i=t.getLineB(),r=t.getLineC();return n(e)+n(i)+n(r)}},40471:(t,e,i)=>{var n=i(40062);t.exports=function(t,e){void 0===e&&(e=new n);var i=t.x2-t.x1,r=t.y2-t.y1,s=t.x3-t.x1,o=t.y3-t.y1,a=Math.random(),h=Math.random();return a+h>=1&&(a=1-a,h=1-h),e.x=t.x1+(i*a+s*h),e.y=t.y1+(r*a+o*h),e}},88141:(t,e,i)=>{var n=i(19860),r=i(36738);t.exports=function(t,e){var i=r(t);return n(t,i.x,i.y,e)}},58935:(t,e,i)=>{var n=i(19860);t.exports=function(t,e,i){return n(t,e.x,e.y,i)}},19860:t=>{t.exports=function(t,e,i,n){var r=Math.cos(n),s=Math.sin(n),o=t.x1-e,a=t.y1-i;return t.x1=o*r-a*s+e,t.y1=o*s+a*r+i,o=t.x2-e,a=t.y2-i,t.x2=o*r-a*s+e,t.y2=o*s+a*r+i,o=t.x3-e,a=t.y3-i,t.x3=o*r-a*s+e,t.y3=o*s+a*r+i,t}},50730:(t,e,i)=>{var n=i(47379),r=i(92501),s=i(51681),o=i(79485),a=i(67155),h=i(1137),u=i(40471),l=new n({initialize:function(t,e,i,n,r,s){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=0),void 0===s&&(s=0),this.type=a.TRIANGLE,this.x1=t,this.y1=e,this.x2=i,this.y2=n,this.x3=r,this.y3=s},contains:function(t,e){return r(this,t,e)},getPoint:function(t,e){return s(this,t,e)},getPoints:function(t,e,i){return o(this,t,e,i)},getRandomPoint:function(t){return u(this,t)},setTo:function(t,e,i,n,r,s){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=0),void 0===s&&(s=0),this.x1=t,this.y1=e,this.x2=i,this.y2=n,this.x3=r,this.y3=s,this},getLineA:function(t){return void 0===t&&(t=new h),t.setTo(this.x1,this.y1,this.x2,this.y2),t},getLineB:function(t){return void 0===t&&(t=new h),t.setTo(this.x2,this.y2,this.x3,this.y3),t},getLineC:function(t){return void 0===t&&(t=new h),t.setTo(this.x3,this.y3,this.x1,this.y1),t},left:{get:function(){return Math.min(this.x1,this.x2,this.x3)},set:function(t){var e=0;e=this.x1<=this.x2&&this.x1<=this.x3?this.x1-t:this.x2<=this.x1&&this.x2<=this.x3?this.x2-t:this.x3-t,this.x1-=e,this.x2-=e,this.x3-=e}},right:{get:function(){return Math.max(this.x1,this.x2,this.x3)},set:function(t){var e=0;e=this.x1>=this.x2&&this.x1>=this.x3?this.x1-t:this.x2>=this.x1&&this.x2>=this.x3?this.x2-t:this.x3-t,this.x1-=e,this.x2-=e,this.x3-=e}},top:{get:function(){return Math.min(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1<=this.y2&&this.y1<=this.y3?this.y1-t:this.y2<=this.y1&&this.y2<=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}},bottom:{get:function(){return Math.max(this.y1,this.y2,this.y3)},set:function(t){var e=0;e=this.y1>=this.y2&&this.y1>=this.y3?this.y1-t:this.y2>=this.y1&&this.y2>=this.y3?this.y2-t:this.y3-t,this.y1-=e,this.y2-=e,this.y3-=e}}});t.exports=l},77791:(t,e,i)=>{var n=i(50730);n.Area=i(29635),n.BuildEquilateral=i(43316),n.BuildFromPolygon=i(28073),n.BuildRight=i(22121),n.CenterOn=i(32748),n.Centroid=i(78661),n.CircumCenter=i(52100),n.CircumCircle=i(76602),n.Clone=i(65638),n.Contains=i(92501),n.ContainsArray=i(82290),n.ContainsPoint=i(22995),n.CopyFrom=i(36855),n.Decompose=i(17746),n.Equals=i(17048),n.GetPoint=i(51681),n.GetPoints=i(79485),n.InCenter=i(36738),n.Perimeter=i(71019),n.Offset=i(29725),n.Random=i(40471),n.Rotate=i(88141),n.RotateAroundPoint=i(58935),n.RotateAroundXY=i(19860),t.exports=n},91188:t=>{t.exports=function(t,e,i){return{gameObject:t,enabled:!0,alwaysEnabled:!1,draggable:!1,dropZone:!1,cursor:!1,target:null,camera:null,hitArea:e,hitAreaCallback:i,hitAreaDebug:null,customHitArea:!1,localX:0,localY:0,dragState:0,dragStartX:0,dragStartY:0,dragStartXGlobal:0,dragStartYGlobal:0,dragX:0,dragY:0}}},76550:t=>{t.exports=function(t,e){return function(i,n,r,s){var o=t.getPixelAlpha(n,r,s.texture.key,s.frame.name);return o&&o>=e}}},80771:(t,e,i)=>{var n=i(47379),r=i(77625),s=i(17168),o=i(22620),a=i(80827),h=i(72493),u=i(43236),l=i(94661),c=i(42380),d=i(65492),p=i(16300),f=new n({initialize:function(t,e){this.game=t,this.scaleManager,this.canvas,this.config=e,this.enabled=!0,this.events=new s,this.isOver=!0,this.defaultCursor="",this.keyboard=e.inputKeyboard?new h(this):null,this.mouse=e.inputMouse?new u(this):null,this.touch=e.inputTouch?new c(this):null,this.pointers=[],this.pointersTotal=e.inputActivePointers,e.inputTouch&&1===this.pointersTotal&&(this.pointersTotal=2);for(var i=0;i<=this.pointersTotal;i++){var n=new l(this,i);n.smoothFactor=e.inputSmoothFactor,this.pointers.push(n)}this.mousePointer=e.inputMouse?this.pointers[0]:null,this.activePointer=this.pointers[0],this.globalTopOnly=!0,this.time=0,this._tempPoint={x:0,y:0},this._tempHitTest=[],this._tempMatrix=new d,this._tempMatrix2=new d,this._tempSkip=!1,this.mousePointerContainer=[this.mousePointer],t.events.once(a.BOOT,this.boot,this)},boot:function(){this.canvas=this.game.canvas,this.scaleManager=this.game.scale,this.events.emit(o.MANAGER_BOOT),this.game.events.on(a.PRE_RENDER,this.preRender,this),this.game.events.once(a.DESTROY,this.destroy,this)},setCanvasOver:function(t){this.isOver=!0,this.events.emit(o.GAME_OVER,t)},setCanvasOut:function(t){this.isOver=!1,this.events.emit(o.GAME_OUT,t)},preRender:function(){var t=this.game.loop.now,e=this.game.loop.delta,i=this.game.scene.getScenes(!0,!0);this.time=t,this.events.emit(o.MANAGER_UPDATE);for(var n=0;n<i.length;n++){var r=i[n];if(r.sys.input&&r.sys.input.updatePoll(t,e)&&this.globalTopOnly)return}},setDefaultCursor:function(t){this.defaultCursor=t,this.canvas.style.cursor!==t&&(this.canvas.style.cursor=t)},setCursor:function(t){t.cursor&&(this.canvas.style.cursor=t.cursor)},resetCursor:function(t){t.cursor&&this.canvas&&(this.canvas.style.cursor=this.defaultCursor)},addPointer:function(t){void 0===t&&(t=1);var e=[];this.pointersTotal+t>10&&(t=10-this.pointersTotal);for(var i=0;i<t;i++){var n=this.pointers.length,r=new l(this,n);r.smoothFactor=this.config.inputSmoothFactor,this.pointers.push(r),this.pointersTotal++,e.push(r)}return e},updateInputPlugins:function(t,e){var i=this.game.scene.getScenes(!0,!0);this._tempSkip=!1;for(var n=0;n<i.length;n++){var r=i[n];if(r.sys.input)if(r.sys.input.update(t,e)&&this.globalTopOnly||this._tempSkip)return}},onTouchStart:function(t){for(var e=this.pointers,i=[],n=0;n<t.changedTouches.length;n++)for(var s=t.changedTouches[n],o=1;o<this.pointersTotal;o++){var a=e[o];if(!a.active){a.touchstart(s,t),this.activePointer=a,i.push(a);break}}this.updateInputPlugins(r.TOUCH_START,i)},onTouchMove:function(t){for(var e=this.pointers,i=[],n=0;n<t.changedTouches.length;n++)for(var s=t.changedTouches[n],o=1;o<this.pointersTotal;o++){var a=e[o];if(a.active&&a.identifier===s.identifier){a.touchmove(s,t),this.activePointer=a,i.push(a);break}}this.updateInputPlugins(r.TOUCH_MOVE,i)},onTouchEnd:function(t){for(var e=this.pointers,i=[],n=0;n<t.changedTouches.length;n++)for(var s=t.changedTouches[n],o=1;o<this.pointersTotal;o++){var a=e[o];if(a.active&&a.identifier===s.identifier){a.touchend(s,t),i.push(a);break}}this.updateInputPlugins(r.TOUCH_END,i)},onTouchCancel:function(t){for(var e=this.pointers,i=[],n=0;n<t.changedTouches.length;n++)for(var s=t.changedTouches[n],o=1;o<this.pointersTotal;o++){var a=e[o];if(a.active&&a.identifier===s.identifier){a.touchcancel(s,t),i.push(a);break}}this.updateInputPlugins(r.TOUCH_CANCEL,i)},onMouseDown:function(t){this.mousePointer.down(t),this.mousePointer.updateMotion(),this.updateInputPlugins(r.MOUSE_DOWN,this.mousePointerContainer)},onMouseMove:function(t){this.mousePointer.move(t),this.mousePointer.updateMotion(),this.updateInputPlugins(r.MOUSE_MOVE,this.mousePointerContainer)},onMouseUp:function(t){this.mousePointer.up(t),this.mousePointer.updateMotion(),this.updateInputPlugins(r.MOUSE_UP,this.mousePointerContainer)},onMouseWheel:function(t){this.mousePointer.wheel(t),this.updateInputPlugins(r.MOUSE_WHEEL,this.mousePointerContainer)},onPointerLockChange:function(t){var e=this.mouse.locked;this.mousePointer.locked=e,this.events.emit(o.POINTERLOCK_CHANGE,t,e)},inputCandidate:function(t,e){var i=t.input;if(!i||!i.enabled||!i.alwaysEnabled&&!t.willRender(e))return!1;var n=!0,r=t.parentContainer;if(r)do{if(!r.willRender(e)){n=!1;break}r=r.parentContainer}while(r);return n},hitTest:function(t,e,i,n){void 0===n&&(n=this._tempHitTest);var r=this._tempPoint,s=i.scrollX,o=i.scrollY;n.length=0;var a=t.x,h=t.y;1!==i.resolution&&(a+=i._x,h+=i._y),i.getWorldPoint(a,h,r),t.worldX=r.x,t.worldY=r.y;for(var u={x:0,y:0},l=this._tempMatrix,c=this._tempMatrix2,d=0;d<e.length;d++){var f=e[d];if(this.inputCandidate(f,i)){var m=r.x+s*f.scrollFactorX-s,v=r.y+o*f.scrollFactorY-o;f.parentContainer?(f.getWorldTransformMatrix(l,c),l.applyInverse(m,v,u)):p(m,v,f.x,f.y,f.rotation,f.scaleX,f.scaleY,u),this.pointWithinHitArea(f,u.x,u.y)&&n.push(f)}}return n},pointWithinHitArea:function(t,e,i){e+=t.displayOriginX,i+=t.displayOriginY;var n=t.input;return!(!n||!n.hitAreaCallback(n.hitArea,e,i,t))&&(n.localX=e,n.localY=i,!0)},pointWithinInteractiveObject:function(t,e,i){return!!t.hitArea&&(e+=t.gameObject.displayOriginX,i+=t.gameObject.displayOriginY,t.localX=e,t.localY=i,t.hitAreaCallback(t.hitArea,e,i,t))},transformPointer:function(t,e,i,n){var r=t.position,s=t.prevPosition;s.x=r.x,s.y=r.y;var o=this.scaleManager.transformX(e),a=this.scaleManager.transformY(i),h=t.smoothFactor;n&&0!==h?(r.x=o*h+s.x*(1-h),r.y=a*h+s.y*(1-h)):(r.x=o,r.y=a)},destroy:function(){this.events.removeAllListeners(),this.game.events.off(a.PRE_RENDER),this.keyboard&&this.keyboard.destroy(),this.mouse&&this.mouse.destroy(),this.touch&&this.touch.destroy();for(var t=0;t<this.pointers.length;t++)this.pointers[t].destroy();this.pointers=[],this._tempHitTest=[],this._tempMatrix.destroy(),this.canvas=null,this.game=null}});t.exports=f},98964:(t,e,i)=>{var n=i(78265),r=i(59623),s=i(47379),o=i(77625),a=i(91188),h=i(76550),u=i(73587),l=i(38341),c=i(12930),d=i(22620),p=i(17168),f=i(81769),m=i(67155),v=i(54471),g=i(28621),y=i(50354),_=i(38092),x=i(38593),b=i(88637),w=i(50730),T=i(92501),M=new s({Extends:p,initialize:function(t){p.call(this),this.scene=t,this.systems=t.sys,this.settings=t.sys.settings,this.manager=t.sys.game.input,this.pluginEvents=new p,this.enabled=!0,this.displayList,this.cameras,v.install(this),this.mouse=this.manager.mouse,this.topOnly=!0,this.pollRate=-1,this._pollTimer=0;var e={cancelled:!1};this._eventContainer={stopPropagation:function(){e.cancelled=!0}},this._eventData=e,this.dragDistanceThreshold=0,this.dragTimeThreshold=0,this._temp=[],this._tempZones=[],this._list=[],this._pendingInsertion=[],this._pendingRemoval=[],this._draggable=[],this._drag={0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],10:[]},this._dragState=[],this._over={0:[],1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],10:[]},this._validTypes=["onDown","onUp","onOver","onOut","onMove","onDragStart","onDrag","onDragEnd","onDragEnter","onDragLeave","onDragOver","onDrop"],this._updatedThisFrame=!1,t.sys.events.once(b.BOOT,this.boot,this),t.sys.events.on(b.START,this.start,this)},boot:function(){this.cameras=this.systems.cameras,this.displayList=this.systems.displayList,this.systems.events.once(b.DESTROY,this.destroy,this),this.pluginEvents.emit(d.BOOT)},start:function(){var t=this.systems.events;t.on(b.TRANSITION_START,this.transitionIn,this),t.on(b.TRANSITION_OUT,this.transitionOut,this),t.on(b.TRANSITION_COMPLETE,this.transitionComplete,this),t.on(b.PRE_UPDATE,this.preUpdate,this),t.once(b.SHUTDOWN,this.shutdown,this),this.manager.events.on(d.GAME_OUT,this.onGameOut,this),this.manager.events.on(d.GAME_OVER,this.onGameOver,this),this.enabled=!0,this._dragState=[0,0,0,0,0,0,0,0,0,0],this.pluginEvents.emit(d.START)},onGameOver:function(t){this.isActive()&&this.emit(d.GAME_OVER,t.timeStamp,t)},onGameOut:function(t){this.isActive()&&this.emit(d.GAME_OUT,t.timeStamp,t)},preUpdate:function(){this.pluginEvents.emit(d.PRE_UPDATE);var t=this._pendingRemoval,e=this._pendingInsertion,i=t.length,n=e.length;if(0!==i||0!==n){for(var r=this._list,s=0;s<i;s++){var o=t[s],a=r.indexOf(o);a>-1&&(r.splice(a,1),this.clear(o,!0))}t.length=0,this._pendingRemoval.length=0,this._list=r.concat(e.splice(0))}},isActive:function(){return this.enabled&&this.scene.sys.isActive()},updatePoll:function(t,e){if(!this.isActive())return!1;if(this.pluginEvents.emit(d.UPDATE,t,e),this._updatedThisFrame)return this._updatedThisFrame=!1,!1;var i,n=this.manager,r=n.pointers,s=n.pointersTotal;for(i=0;i<s;i++)r[i].updateMotion();if(0===this._list.length)return!1;var o=this.pollRate;if(-1===o)return!1;if(o>0){if(this._pollTimer-=e,!(this._pollTimer<0))return!1;this._pollTimer=this.pollRate}var a=!1;for(i=0;i<s;i++){var h=0,u=r[i];this._tempZones=[],this._temp=this.hitTestPointer(u),this.sortGameObjects(this._temp),this.sortGameObjects(this._tempZones),this.topOnly&&(this._temp.length&&this._temp.splice(1),this._tempZones.length&&this._tempZones.splice(1)),h+=this.processOverOutEvents(u),2===this.getDragState(u)&&this.processDragThresholdEvent(u,t),h>0&&(a=!0)}return a},update:function(t,e){if(!this.isActive())return!1;for(var i=e.length,n=!1,r=0;r<i;r++){var s=0,a=e[r];switch(this._tempZones=[],this._temp=this.hitTestPointer(a),this.sortGameObjects(this._temp),this.sortGameObjects(this._tempZones),this.topOnly&&(this._temp.length&&this._temp.splice(1),this._tempZones.length&&this._tempZones.splice(1)),t){case o.MOUSE_DOWN:s+=this.processDragDownEvent(a),s+=this.processDownEvents(a),s+=this.processOverOutEvents(a);break;case o.MOUSE_UP:s+=this.processDragUpEvent(a),s+=this.processUpEvents(a),s+=this.processOverOutEvents(a);break;case o.TOUCH_START:s+=this.processDragDownEvent(a),s+=this.processDownEvents(a),s+=this.processOverEvents(a);break;case o.TOUCH_END:case o.TOUCH_CANCEL:s+=this.processDragUpEvent(a),s+=this.processUpEvents(a),s+=this.processOutEvents(a);break;case o.MOUSE_MOVE:case o.TOUCH_MOVE:s+=this.processDragMoveEvent(a),s+=this.processMoveEvents(a),s+=this.processOverOutEvents(a);break;case o.MOUSE_WHEEL:s+=this.processWheelEvent(a)}s>0&&(n=!0)}return this._updatedThisFrame=!0,n},clear:function(t,e){void 0===e&&(e=!1);var i=t.input;if(i){e||this.queueForRemoval(t),i.gameObject=void 0,i.target=void 0,i.hitArea=void 0,i.hitAreaCallback=void 0,i.callbackContext=void 0,this.manager.resetCursor(i),t.input=null;var n=this._draggable.indexOf(t);return n>-1&&this._draggable.splice(n,1),(n=this._drag[0].indexOf(t))>-1&&this._drag[0].splice(n,1),(n=this._over[0].indexOf(t))>-1&&this._over[0].splice(n,1),t}},disable:function(t){t.input.enabled=!1},enable:function(t,e,i,n){return void 0===n&&(n=!1),t.input?t.input.enabled=!0:this.setHitArea(t,e,i),t.input&&n&&!t.input.dropZone&&(t.input.dropZone=n),this},hitTestPointer:function(t){for(var e=this.cameras.getCamerasBelowPointer(t),i=0;i<e.length;i++){for(var n=e[i],r=this.manager.hitTest(t,this._list,n),s=0;s<r.length;s++){var o=r[s];o.input.dropZone&&this._tempZones.push(o)}if(r.length>0)return t.camera=n,r}return t.camera=e[0],[]},processDownEvents:function(t){var e=0,i=this._temp,n=this._eventData,r=this._eventContainer;n.cancelled=!1;for(var s=!1,o=0;o<i.length;o++){var a=i[o];if(a.input){if(e++,a.emit(d.GAMEOBJECT_POINTER_DOWN,t,a.input.localX,a.input.localY,r),n.cancelled||!a.input){s=!0;break}if(this.emit(d.GAMEOBJECT_DOWN,t,a,r),n.cancelled||!a.input){s=!0;break}}}return!s&&this.manager&&(t.downElement===this.manager.game.canvas?this.emit(d.POINTER_DOWN,t,i):this.emit(d.POINTER_DOWN_OUTSIDE,t)),e},getDragState:function(t){return this._dragState[t.id]},setDragState:function(t,e){this._dragState[t.id]=e},processDragThresholdEvent:function(t,e){var i=!1,n=this.dragTimeThreshold,r=this.dragDistanceThreshold;if((r>0&&u(t.x,t.y,t.downX,t.downY)>=r||n>0&&e>=t.downTime+n)&&(i=!0),i)return this.setDragState(t,3),this.processDragStartList(t)},processDragStartList:function(t){if(3!==this.getDragState(t))return 0;for(var e=this._drag[t.id],i=0;i<e.length;i++){var n=e[i],r=n.input;r.dragState=2,r.dragStartX=n.x,r.dragStartY=n.y,r.dragStartXGlobal=t.x,r.dragStartYGlobal=t.y,r.dragX=r.dragStartXGlobal-r.dragStartX,r.dragY=r.dragStartYGlobal-r.dragStartY,n.emit(d.GAMEOBJECT_DRAG_START,t,r.dragX,r.dragY),this.emit(d.DRAG_START,t,n)}return this.setDragState(t,4),e.length},processDragDownEvent:function(t){var e=this._temp;if(0===this._draggable.length||0===e.length||!t.primaryDown||0!==this.getDragState(t))return 0;this.setDragState(t,1);for(var i=[],n=0;n<e.length;n++){var r=e[n];r.input.draggable&&0===r.input.dragState&&i.push(r)}return 0===i.length?(this.setDragState(t,0),0):(i.length>1&&(this.sortGameObjects(i),this.topOnly&&i.splice(1)),this._drag[t.id]=i,0===this.dragDistanceThreshold&&0===this.dragTimeThreshold?(this.setDragState(t,3),this.processDragStartList(t)):(this.setDragState(t,2),0))},processDragMoveEvent:function(t){if(2===this.getDragState(t)&&this.processDragThresholdEvent(t,this.manager.game.loop.now),4!==this.getDragState(t))return 0;for(var e=this._tempZones,i=this._drag[t.id],n=0;n<i.length;n++){var r,s,o=i[n],a=o.input,h=a.target;if(h){var u=e.indexOf(h);0===u?(o.emit(d.GAMEOBJECT_DRAG_OVER,t,h),this.emit(d.DRAG_OVER,t,o,h)):u>0?(o.emit(d.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(d.DRAG_LEAVE,t,o,h),a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h)):(o.emit(d.GAMEOBJECT_DRAG_LEAVE,t,h),this.emit(d.DRAG_LEAVE,t,o,h),e[0]?(a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h)):a.target=null)}else!h&&e[0]&&(a.target=e[0],h=a.target,o.emit(d.GAMEOBJECT_DRAG_ENTER,t,h),this.emit(d.DRAG_ENTER,t,o,h));if(o.parentContainer){var l=t.x-a.dragStartXGlobal,c=t.y-a.dragStartYGlobal,p=o.getParentRotation(),f=l*Math.cos(p)+c*Math.sin(p),m=c*Math.cos(p)-l*Math.sin(p);f*=1/o.parentContainer.scaleX,m*=1/o.parentContainer.scaleY,r=f+a.dragStartX,s=m+a.dragStartY}else r=t.x-a.dragX,s=t.y-a.dragY;o.emit(d.GAMEOBJECT_DRAG,t,r,s),this.emit(d.DRAG,t,o,r,s)}return i.length},processDragUpEvent:function(t){for(var e=this._drag[t.id],i=0;i<e.length;i++){var n=e[i],r=n.input;if(r&&2===r.dragState){r.dragState=0,r.dragX=r.localX-n.displayOriginX,r.dragY=r.localY-n.displayOriginY;var s=!1,o=r.target;o&&(n.emit(d.GAMEOBJECT_DROP,t,o),this.emit(d.DROP,t,n,o),r.target=null,s=!0),n.input&&(n.emit(d.GAMEOBJECT_DRAG_END,t,r.dragX,r.dragY,s),this.emit(d.DRAG_END,t,n,s))}}return this.setDragState(t,0),e.splice(0),0},processMoveEvents:function(t){var e=0,i=this._temp,n=this._eventData,r=this._eventContainer;n.cancelled=!1;for(var s=!1,o=0;o<i.length;o++){var a=i[o];if(a.input){if(e++,a.emit(d.GAMEOBJECT_POINTER_MOVE,t,a.input.localX,a.input.localY,r),n.cancelled||!a.input){s=!0;break}if(this.emit(d.GAMEOBJECT_MOVE,t,a,r),n.cancelled||!a.input){s=!0;break}if(this.topOnly)break}}return s||this.emit(d.POINTER_MOVE,t,i),e},processWheelEvent:function(t){var e=0,i=this._temp,n=this._eventData,r=this._eventContainer;n.cancelled=!1;for(var s=!1,o=t.deltaX,a=t.deltaY,h=t.deltaZ,u=0;u<i.length;u++){var l=i[u];if(l.input){if(e++,l.emit(d.GAMEOBJECT_POINTER_WHEEL,t,o,a,h,r),n.cancelled||!l.input){s=!0;break}if(this.emit(d.GAMEOBJECT_WHEEL,t,l,o,a,h,r),n.cancelled||!l.input){s=!0;break}}}return s||this.emit(d.POINTER_WHEEL,t,i,o,a,h),e},processOverEvents:function(t){var e=this._temp,i=0,n=e.length,r=[];if(n>0){var s=this.manager,o=this._eventData,a=this._eventContainer;o.cancelled=!1;for(var h=!1,u=0;u<n;u++){var l=e[u];if(l.input){if(r.push(l),s.setCursor(l.input),l.emit(d.GAMEOBJECT_POINTER_OVER,t,l.input.localX,l.input.localY,a),i++,o.cancelled||!l.input){h=!0;break}if(this.emit(d.GAMEOBJECT_OVER,t,l,a),o.cancelled||!l.input){h=!0;break}}}h||this.emit(d.POINTER_OVER,t,r)}return this._over[t.id]=r,i},processOutEvents:function(t){var e=this._over[t.id],i=0,n=e.length;if(n>0){var r=this.manager,s=this._eventData,o=this._eventContainer;s.cancelled=!1;var a=!1;this.sortGameObjects(e);for(var h=0;h<n;h++){var u=e[h];for(h=0;h<n;h++)if((u=e[h]).input){if(r.resetCursor(u.input),u.emit(d.GAMEOBJECT_POINTER_OUT,t,o),i++,s.cancelled||!u.input){a=!0;break}if(this.emit(d.GAMEOBJECT_OUT,t,u,o),s.cancelled||!u.input){a=!0;break}}a||this.emit(d.POINTER_OUT,t,e)}this._over[t.id]=[]}return i},processOverOutEvents:function(t){var e,i,n=this._temp,r=[],s=[],o=[],a=this._over[t.id],h=this._drag[t.id],u=this.manager;for(e=0;e<a.length;e++)i=a[e],-1===n.indexOf(i)&&-1===h.indexOf(i)?r.push(i):o.push(i);for(e=0;e<n.length;e++)i=n[e],-1===a.indexOf(i)&&s.push(i);var l=r.length,c=0,p=this._eventData,f=this._eventContainer;p.cancelled=!1;var m=!1;if(l>0){for(this.sortGameObjects(r),e=0;e<l;e++)if((i=r[e]).input){if(u.resetCursor(i.input),i.emit(d.GAMEOBJECT_POINTER_OUT,t,f),c++,p.cancelled||!i.input){m=!0;break}if(this.emit(d.GAMEOBJECT_OUT,t,i,f),p.cancelled||!i.input){m=!0;break}}m||this.emit(d.POINTER_OUT,t,r)}if(l=s.length,p.cancelled=!1,m=!1,l>0){for(this.sortGameObjects(s),e=0;e<l;e++)if((i=s[e]).input){if(u.setCursor(i.input),i.emit(d.GAMEOBJECT_POINTER_OVER,t,i.input.localX,i.input.localY,f),c++,p.cancelled||!i.input){m=!0;break}if(this.emit(d.GAMEOBJECT_OVER,t,i,f),p.cancelled||!i.input){m=!0;break}}m||this.emit(d.POINTER_OVER,t,s)}return a=o.concat(s),this._over[t.id]=this.sortGameObjects(a),c},processUpEvents:function(t){var e=this._temp,i=this._eventData,n=this._eventContainer;i.cancelled=!1;for(var r=!1,s=0;s<e.length;s++){var o=e[s];if(o.input){if(o.emit(d.GAMEOBJECT_POINTER_UP,t,o.input.localX,o.input.localY,n),i.cancelled||!o.input){r=!0;break}if(this.emit(d.GAMEOBJECT_UP,t,o,n),i.cancelled||!o.input){r=!0;break}}}return!r&&this.manager&&(t.upElement===this.manager.game.canvas?this.emit(d.POINTER_UP,t,e):this.emit(d.POINTER_UP_OUTSIDE,t)),e.length},queueForInsertion:function(t){return-1===this._pendingInsertion.indexOf(t)&&-1===this._list.indexOf(t)&&this._pendingInsertion.push(t),this},queueForRemoval:function(t){return this._pendingRemoval.push(t),this},setDraggable:function(t,e){void 0===e&&(e=!0),Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i];n.input.draggable=e;var r=this._draggable.indexOf(n);e&&-1===r?this._draggable.push(n):!e&&r>-1&&this._draggable.splice(r,1)}return this},makePixelPerfect:function(t){void 0===t&&(t=1);var e=this.systems.textures;return h(e,t)},setHitArea:function(t,e,i){if(void 0===e)return this.setHitAreaFromTexture(t);Array.isArray(t)||(t=[t]);var n=!1,r=!1,s=!1,o=!1,h=!1,u=!0;if(g(e)){var l=e;e=f(l,"hitArea",null),i=f(l,"hitAreaCallback",null),n=f(l,"draggable",!1),r=f(l,"dropZone",!1),s=f(l,"cursor",!1),o=f(l,"useHandCursor",!1),h=f(l,"pixelPerfect",!1);var c=f(l,"alphaTolerance",1);h&&(e={},i=this.makePixelPerfect(c)),e&&i||(this.setHitAreaFromTexture(t),u=!1)}else"function"!=typeof e||i||(i=e,e={});for(var d=0;d<t.length;d++){var p=t[d];if(h&&"Container"===p.type)console.warn("Cannot pixelPerfect test a Container. Use a custom callback.");else{var m=p.input?p.input:a(p,e,i);m.customHitArea=u,m.dropZone=r,m.cursor=o?"pointer":s,p.input=m,n&&this.setDraggable(p),this.queueForInsertion(p)}}return this},setHitAreaCircle:function(t,e,i,s,o){void 0===o&&(o=r);var a=new n(e,i,s);return this.setHitArea(t,a,o)},setHitAreaEllipse:function(t,e,i,n,r,s){void 0===s&&(s=c);var o=new l(e,i,n,r);return this.setHitArea(t,o,s)},setHitAreaFromTexture:function(t,e){void 0===e&&(e=x),Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i],r=n.frame,s=0,o=0;n.width?(s=n.width,o=n.height):r&&(s=r.realWidth,o=r.realHeight),"Container"!==n.type||0!==s&&0!==o?0!==s&&0!==o&&(n.input=a(n,new _(0,0,s,o),e),this.queueForInsertion(n)):console.warn("Container.setInteractive must specify a Shape or call setSize() first")}return this},setHitAreaRectangle:function(t,e,i,n,r,s){void 0===s&&(s=x);var o=new _(e,i,n,r);return this.setHitArea(t,o,s)},setHitAreaTriangle:function(t,e,i,n,r,s,o,a){void 0===a&&(a=T);var h=new w(e,i,n,r,s,o);return this.setHitArea(t,h,a)},enableDebug:function(t,e){void 0===e&&(e=65280);var i=t.input;if(!i||!i.hitArea)return this;var n=i.hitArea,r=n.type,s=i.hitAreaDebug,o=this.systems.add,a=this.systems.updateList;s&&(a.remove(s),s.destroy(),s=null);var h=0,u=0;switch(r){case m.CIRCLE:s=o.arc(0,0,n.radius),h=n.x-n.radius,u=n.y-n.radius;break;case m.ELLIPSE:s=o.ellipse(0,0,n.width,n.height),h=n.x-n.width/2,u=n.y-n.height/2;break;case m.LINE:s=o.line(0,0,n.x1,n.y1,n.x2,n.y2);break;case m.POLYGON:s=o.polygon(0,0,n.points);break;case m.RECTANGLE:s=o.rectangle(0,0,n.width,n.height),h=n.x,u=n.y;break;case m.TRIANGLE:s=o.triangle(0,0,n.x1,n.y1,n.x2,n.y2,n.x3,n.y3)}return s&&(s.isFilled=!1,s.preUpdate=function(){s.setStrokeStyle(1/t.scale,e),s.setDisplayOrigin(t.displayOriginX,t.displayOriginY);var i=t.x,n=t.y,r=t.rotation,o=t.scaleX,a=t.scaleY;if(t.parentContainer){var l=t.getWorldTransformMatrix();i=l.tx,n=l.ty,r=l.rotation,o=l.scaleX,a=l.scaleY}s.setRotation(r),s.setScale(o,a),s.setPosition(i+h,n+u),s.setScrollFactor(t.scrollFactorX,t.scrollFactorY),s.setDepth(t.depth)},a.add(s),i.hitAreaDebug=s),this},removeDebug:function(t){var e=t.input;if(e&&e.hitAreaDebug){var i=e.hitAreaDebug;this.systems.updateList.remove(i),i.destroy(),e.hitAreaDebug=null}return this},setPollAlways:function(){return this.setPollRate(0)},setPollOnMove:function(){return this.setPollRate(-1)},setPollRate:function(t){return this.pollRate=t,this._pollTimer=0,this},setGlobalTopOnly:function(t){return this.manager.globalTopOnly=t,this},setTopOnly:function(t){return this.topOnly=t,this},sortGameObjects:function(t){return t.length<2?t:(this.scene.sys.depthSort(),t.sort(this.sortHandlerGO.bind(this)))},sortHandlerGO:function(t,e){if(t.parentContainer||e.parentContainer){if(t.parentContainer===e.parentContainer)return e.parentContainer.getIndex(e)-t.parentContainer.getIndex(t);if(t.parentContainer===e)return-1;if(e.parentContainer===t)return 1;for(var i=t.getIndexList(),n=e.getIndexList(),r=Math.min(i.length,n.length),s=0;s<r;s++){var o=i[s],a=n[s];if(o!==a)return a-o}return n.length-i.length}return this.displayList.getIndex(e)-this.displayList.getIndex(t)},stopPropagation:function(){return this.manager._tempSkip=!0,this},addPointer:function(t){return this.manager.addPointer(t)},setDefaultCursor:function(t){return this.manager.setDefaultCursor(t),this},transitionIn:function(){this.enabled=this.settings.transitionAllowInput},transitionComplete:function(){this.settings.transitionAllowInput||(this.enabled=!0)},transitionOut:function(){this.enabled=this.settings.transitionAllowInput},shutdown:function(){this.pluginEvents.emit(d.SHUTDOWN),this._temp.length=0,this._list.length=0,this._draggable.length=0,this._pendingRemoval.length=0,this._pendingInsertion.length=0,this._dragState.length=0;for(var t=0;t<10;t++)this._drag[t]=[],this._over[t]=[];this.removeAllListeners();var e=this.systems.events;e.off(b.TRANSITION_START,this.transitionIn,this),e.off(b.TRANSITION_OUT,this.transitionOut,this),e.off(b.TRANSITION_COMPLETE,this.transitionComplete,this),e.off(b.PRE_UPDATE,this.preUpdate,this),this.manager.events.off(d.GAME_OUT,this.onGameOut,this),this.manager.events.off(d.GAME_OVER,this.onGameOver,this),e.off(b.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.pluginEvents.emit(d.DESTROY),this.pluginEvents.removeAllListeners(),this.scene.sys.events.off(b.START,this.start,this),this.scene=null,this.cameras=null,this.manager=null,this.events=null,this.mouse=null},x:{get:function(){return this.manager.activePointer.x}},y:{get:function(){return this.manager.activePointer.y}},isOver:{get:function(){return this.manager.isOver}},mousePointer:{get:function(){return this.manager.mousePointer}},activePointer:{get:function(){return this.manager.activePointer}},pointer1:{get:function(){return this.manager.pointers[1]}},pointer2:{get:function(){return this.manager.pointers[2]}},pointer3:{get:function(){return this.manager.pointers[3]}},pointer4:{get:function(){return this.manager.pointers[4]}},pointer5:{get:function(){return this.manager.pointers[5]}},pointer6:{get:function(){return this.manager.pointers[6]}},pointer7:{get:function(){return this.manager.pointers[7]}},pointer8:{get:function(){return this.manager.pointers[8]}},pointer9:{get:function(){return this.manager.pointers[9]}},pointer10:{get:function(){return this.manager.pointers[10]}}});y.register("InputPlugin",M,"input"),t.exports=M},54471:(t,e,i)=>{var n=i(86652),r={},s={register:function(t,e,i,n,s){r[t]={plugin:e,mapping:i,settingsKey:n,configKey:s}},getPlugin:function(t){return r[t]},install:function(t){var e=t.scene.sys,i=e.settings.input,s=e.game.config;for(var o in r){var a=r[o].plugin,h=r[o].mapping,u=r[o].settingsKey,l=r[o].configKey;n(i,u,s[l])&&(t[h]=new a(t))}},remove:function(t){r.hasOwnProperty(t)&&delete r[t]}};t.exports=s},94661:(t,e,i)=>{var n=i(72124),r=i(47379),s=i(73587),o=i(70077),a=i(15579),h=i(57148),u=new r({initialize:function(t,e){this.manager=t,this.id=e,this.event,this.downElement,this.upElement,this.camera=null,this.button=0,this.buttons=0,this.position=new h,this.prevPosition=new h,this.midPoint=new h(-1,-1),this.velocity=new h,this.angle=0,this.distance=0,this.smoothFactor=0,this.motionFactor=.2,this.worldX=0,this.worldY=0,this.moveTime=0,this.downX=0,this.downY=0,this.downTime=0,this.upX=0,this.upY=0,this.upTime=0,this.primaryDown=!1,this.isDown=!1,this.wasTouch=!1,this.wasCanceled=!1,this.movementX=0,this.movementY=0,this.identifier=0,this.pointerId=null,this.active=0===e,this.locked=!1,this.deltaX=0,this.deltaY=0,this.deltaZ=0},updateWorldPoint:function(t){var e=this.x,i=this.y;1!==t.resolution&&(e+=t._x,i+=t._y);var n=t.getWorldPoint(e,i);return this.worldX=n.x,this.worldY=n.y,this},positionToCamera:function(t,e){return t.getWorldPoint(this.x,this.y,e)},updateMotion:function(){var t=this.position.x,e=this.position.y,i=this.midPoint.x,r=this.midPoint.y;if(t!==i||e!==r){var s=a(this.motionFactor,i,t),h=a(this.motionFactor,r,e);o(s,t,.1)&&(s=t),o(h,e,.1)&&(h=e),this.midPoint.set(s,h);var u=t-s,l=e-h;this.velocity.set(u,l),this.angle=n(s,h,t,e),this.distance=Math.sqrt(u*u+l*l)}},up:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.button=t.button,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),0===t.button&&(this.primaryDown=!1,this.upX=this.x,this.upY=this.y,this.upTime=t.timeStamp),this.isDown=!1,this.wasTouch=!1},down:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.button=t.button,this.downElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),0===t.button&&(this.primaryDown=!0,this.downX=this.x,this.downY=this.y,this.downTime=t.timeStamp),this.isDown=!0,this.wasTouch=!1},move:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.manager.transformPointer(this,t.pageX,t.pageY,!0),this.locked&&(this.movementX=t.movementX||t.mozMovementX||t.webkitMovementX||0,this.movementY=t.movementY||t.mozMovementY||t.webkitMovementY||0),this.moveTime=t.timeStamp,this.wasTouch=!1},wheel:function(t){"buttons"in t&&(this.buttons=t.buttons),this.event=t,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.deltaX=t.deltaX,this.deltaY=t.deltaY,this.deltaZ=t.deltaZ,this.wasTouch=!1},touchstart:function(t,e){t.pointerId&&(this.pointerId=t.pointerId),this.identifier=t.identifier,this.target=t.target,this.active=!0,this.buttons=1,this.event=e,this.downElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!0,this.downX=this.x,this.downY=this.y,this.downTime=e.timeStamp,this.isDown=!0,this.wasTouch=!0,this.wasCanceled=!1,this.updateMotion()},touchmove:function(t,e){this.event=e,this.manager.transformPointer(this,t.pageX,t.pageY,!0),this.moveTime=e.timeStamp,this.wasTouch=!0,this.updateMotion()},touchend:function(t,e){this.buttons=0,this.event=e,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!1,this.upX=this.x,this.upY=this.y,this.upTime=e.timeStamp,this.isDown=!1,this.wasTouch=!0,this.wasCanceled=!1,this.active=!1,this.updateMotion()},touchcancel:function(t,e){this.buttons=0,this.event=e,this.upElement=t.target,this.manager.transformPointer(this,t.pageX,t.pageY,!1),this.primaryDown=!1,this.upX=this.x,this.upY=this.y,this.upTime=e.timeStamp,this.isDown=!1,this.wasTouch=!0,this.wasCanceled=!0,this.active=!1},noButtonDown:function(){return 0===this.buttons},leftButtonDown:function(){return!!(1&this.buttons)},rightButtonDown:function(){return!!(2&this.buttons)},middleButtonDown:function(){return!!(4&this.buttons)},backButtonDown:function(){return!!(8&this.buttons)},forwardButtonDown:function(){return!!(16&this.buttons)},leftButtonReleased:function(){return 0===this.button&&!this.isDown},rightButtonReleased:function(){return 2===this.button&&!this.isDown},middleButtonReleased:function(){return 1===this.button&&!this.isDown},backButtonReleased:function(){return 3===this.button&&!this.isDown},forwardButtonReleased:function(){return 4===this.button&&!this.isDown},getDistance:function(){return this.isDown?s(this.downX,this.downY,this.x,this.y):s(this.downX,this.downY,this.upX,this.upY)},getDistanceX:function(){return this.isDown?Math.abs(this.downX-this.x):Math.abs(this.downX-this.upX)},getDistanceY:function(){return this.isDown?Math.abs(this.downY-this.y):Math.abs(this.downY-this.upY)},getDuration:function(){return this.isDown?this.manager.time-this.downTime:this.upTime-this.downTime},getAngle:function(){return this.isDown?n(this.downX,this.downY,this.x,this.y):n(this.downX,this.downY,this.upX,this.upY)},getInterpolatedPosition:function(t,e){void 0===t&&(t=10),void 0===e&&(e=[]);for(var i=this.prevPosition.x,n=this.prevPosition.y,r=this.position.x,s=this.position.y,o=0;o<t;o++){var h=1/t*o;e[o]={x:a(h,i,r),y:a(h,n,s)}}return e},destroy:function(){this.camera=null,this.manager=null,this.position=null},x:{get:function(){return this.position.x},set:function(t){this.position.x=t}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t}},time:{get:function(){return this.event?this.event.timeStamp:0}}});t.exports=u},77625:t=>{t.exports={MOUSE_DOWN:0,MOUSE_MOVE:1,MOUSE_UP:2,TOUCH_START:3,TOUCH_MOVE:4,TOUCH_END:5,POINTER_LOCK_CHANGE:6,TOUCH_CANCEL:7,MOUSE_WHEEL:8}},8112:t=>{t.exports="boot"},58234:t=>{t.exports="destroy"},41978:t=>{t.exports="dragend"},43587:t=>{t.exports="dragenter"},88172:t=>{t.exports="drag"},99870:t=>{t.exports="dragleave"},43861:t=>{t.exports="dragover"},88173:t=>{t.exports="dragstart"},33064:t=>{t.exports="drop"},79859:t=>{t.exports="gameobjectdown"},29170:t=>{t.exports="dragend"},83829:t=>{t.exports="dragenter"},20604:t=>{t.exports="drag"},78516:t=>{t.exports="dragleave"},35251:t=>{t.exports="dragover"},6147:t=>{t.exports="dragstart"},31175:t=>{t.exports="drop"},45439:t=>{t.exports="gameobjectmove"},60078:t=>{t.exports="gameobjectout"},23424:t=>{t.exports="gameobjectover"},50:t=>{t.exports="pointerdown"},49432:t=>{t.exports="pointermove"},82037:t=>{t.exports="pointerout"},51667:t=>{t.exports="pointerover"},63883:t=>{t.exports="pointerup"},14790:t=>{t.exports="wheel"},94745:t=>{t.exports="gameobjectup"},40390:t=>{t.exports="gameobjectwheel"},8694:t=>{t.exports="gameout"},9284:t=>{t.exports="gameover"},97430:t=>{t.exports="boot"},911:t=>{t.exports="process"},24527:t=>{t.exports="update"},43982:t=>{t.exports="pointerlockchange"},83217:t=>{t.exports="pointerdown"},52825:t=>{t.exports="pointerdownoutside"},32619:t=>{t.exports="pointermove"},89407:t=>{t.exports="pointerout"},64076:t=>{t.exports="pointerover"},66038:t=>{t.exports="pointerup"},79657:t=>{t.exports="pointerupoutside"},22553:t=>{t.exports="wheel"},1222:t=>{t.exports="preupdate"},66301:t=>{t.exports="shutdown"},33538:t=>{t.exports="start"},85279:t=>{t.exports="update"},22620:(t,e,i)=>{t.exports={BOOT:i(8112),DESTROY:i(58234),DRAG_END:i(41978),DRAG_ENTER:i(43587),DRAG:i(88172),DRAG_LEAVE:i(99870),DRAG_OVER:i(43861),DRAG_START:i(88173),DROP:i(33064),GAME_OUT:i(8694),GAME_OVER:i(9284),GAMEOBJECT_DOWN:i(79859),GAMEOBJECT_DRAG_END:i(29170),GAMEOBJECT_DRAG_ENTER:i(83829),GAMEOBJECT_DRAG:i(20604),GAMEOBJECT_DRAG_LEAVE:i(78516),GAMEOBJECT_DRAG_OVER:i(35251),GAMEOBJECT_DRAG_START:i(6147),GAMEOBJECT_DROP:i(31175),GAMEOBJECT_MOVE:i(45439),GAMEOBJECT_OUT:i(60078),GAMEOBJECT_OVER:i(23424),GAMEOBJECT_POINTER_DOWN:i(50),GAMEOBJECT_POINTER_MOVE:i(49432),GAMEOBJECT_POINTER_OUT:i(82037),GAMEOBJECT_POINTER_OVER:i(51667),GAMEOBJECT_POINTER_UP:i(63883),GAMEOBJECT_POINTER_WHEEL:i(14790),GAMEOBJECT_UP:i(94745),GAMEOBJECT_WHEEL:i(40390),MANAGER_BOOT:i(97430),MANAGER_PROCESS:i(911),MANAGER_UPDATE:i(24527),POINTER_DOWN:i(83217),POINTER_DOWN_OUTSIDE:i(52825),POINTER_MOVE:i(32619),POINTER_OUT:i(89407),POINTER_OVER:i(64076),POINTER_UP:i(66038),POINTER_UP_OUTSIDE:i(79657),POINTER_WHEEL:i(22553),POINTERLOCK_CHANGE:i(43982),PRE_UPDATE:i(1222),SHUTDOWN:i(66301),START:i(33538),UPDATE:i(85279)}},63259:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e){this.pad=t,this.events=t.events,this.index=e,this.value=0,this.threshold=.1},update:function(t){this.value=t},getValue:function(){return Math.abs(this.value)<this.threshold?0:this.value},destroy:function(){this.pad=null,this.events=null}});t.exports=n},66792:(t,e,i)=>{var n=i(47379),r=i(29916),s=new n({initialize:function(t,e){this.pad=t,this.events=t.manager,this.index=e,this.value=0,this.threshold=1,this.pressed=!1},update:function(t){this.value=t;var e=this.pad,i=this.index;t>=this.threshold?this.pressed||(this.pressed=!0,this.events.emit(r.BUTTON_DOWN,e,this,t),this.pad.emit(r.GAMEPAD_BUTTON_DOWN,i,t,this)):this.pressed&&(this.pressed=!1,this.events.emit(r.BUTTON_UP,e,this,t),this.pad.emit(r.GAMEPAD_BUTTON_UP,i,t,this))},destroy:function(){this.pad=null,this.events=null}});t.exports=s},2115:(t,e,i)=>{var n=i(63259),r=i(66792),s=i(47379),o=i(17168),a=i(57148),h=new s({Extends:o,initialize:function(t,e){o.call(this),this.manager=t,this.pad=e,this.id=e.id,this.index=e.index;for(var i=[],s=0;s<e.buttons.length;s++)i.push(new r(this,s));this.buttons=i;var h=[];for(s=0;s<e.axes.length;s++)h.push(new n(this,s));this.axes=h,this.vibration=e.vibrationActuator;var u={value:0,pressed:!1};this._LCLeft=i[14]?i[14]:u,this._LCRight=i[15]?i[15]:u,this._LCTop=i[12]?i[12]:u,this._LCBottom=i[13]?i[13]:u,this._RCLeft=i[2]?i[2]:u,this._RCRight=i[1]?i[1]:u,this._RCTop=i[3]?i[3]:u,this._RCBottom=i[0]?i[0]:u,this._FBLeftTop=i[4]?i[4]:u,this._FBLeftBottom=i[6]?i[6]:u,this._FBRightTop=i[5]?i[5]:u,this._FBRightBottom=i[7]?i[7]:u;var l={value:0};this._HAxisLeft=h[0]?h[0]:l,this._VAxisLeft=h[1]?h[1]:l,this._HAxisRight=h[2]?h[2]:l,this._VAxisRight=h[3]?h[3]:l,this.leftStick=new a,this.rightStick=new a},getAxisTotal:function(){return this.axes.length},getAxisValue:function(t){return this.axes[t].getValue()},setAxisThreshold:function(t){for(var e=0;e<this.axes.length;e++)this.axes[e].threshold=t},getButtonTotal:function(){return this.buttons.length},getButtonValue:function(t){return this.buttons[t].value},isButtonDown:function(t){return this.buttons[t].pressed},update:function(t){var e,i=this.buttons,n=t.buttons,r=i.length;for(e=0;e<r;e++)i[e].update(n[e].value);var s=this.axes,o=t.axes;for(r=s.length,e=0;e<r;e++)s[e].update(o[e]);r>=2&&(this.leftStick.set(s[0].getValue(),s[1].getValue()),r>=4&&this.rightStick.set(s[2].getValue(),s[3].getValue()))},destroy:function(){var t;for(this.removeAllListeners(),this.manager=null,this.pad=null,t=0;t<this.buttons.length;t++)this.buttons[t].destroy();for(t=0;t<this.axes.length;t++)this.axes[t].destroy();this.buttons=[],this.axes=[]},connected:{get:function(){return this.pad.connected}},timestamp:{get:function(){return this.pad.timestamp}},left:{get:function(){return this._LCLeft.pressed}},right:{get:function(){return this._LCRight.pressed}},up:{get:function(){return this._LCTop.pressed}},down:{get:function(){return this._LCBottom.pressed}},A:{get:function(){return this._RCBottom.pressed}},Y:{get:function(){return this._RCTop.pressed}},X:{get:function(){return this._RCLeft.pressed}},B:{get:function(){return this._RCRight.pressed}},L1:{get:function(){return this._FBLeftTop.value}},L2:{get:function(){return this._FBLeftBottom.value}},R1:{get:function(){return this._FBRightTop.value}},R2:{get:function(){return this._FBRightBottom.value}}});t.exports=h},96151:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(29916),o=i(2115),a=i(86652),h=i(54471),u=i(22620),l=new n({Extends:r,initialize:function(t){r.call(this),this.scene=t.scene,this.settings=this.scene.sys.settings,this.sceneInputPlugin=t,this.enabled=!0,this.target,this.gamepads=[],this.queue=[],this.onGamepadHandler,this._pad1,this._pad2,this._pad3,this._pad4,t.pluginEvents.once(u.BOOT,this.boot,this),t.pluginEvents.on(u.START,this.start,this)},boot:function(){var t=this.scene.sys.game,e=this.settings.input,i=t.config;this.enabled=a(e,"gamepad",i.inputGamepad)&&t.device.input.gamepads,this.target=a(e,"gamepad.target",i.inputGamepadEventTarget),this.sceneInputPlugin.pluginEvents.once(u.DESTROY,this.destroy,this)},start:function(){this.enabled&&this.startListeners(),this.sceneInputPlugin.pluginEvents.once(u.SHUTDOWN,this.shutdown,this)},isActive:function(){return this.enabled&&this.scene.sys.isActive()},startListeners:function(){var t=this,e=this.target,i=function(e){!e.defaultPrevented&&t.isActive()&&(t.refreshPads(),t.queue.push(e))};this.onGamepadHandler=i,e.addEventListener("gamepadconnected",i,!1),e.addEventListener("gamepaddisconnected",i,!1),this.sceneInputPlugin.pluginEvents.on(u.UPDATE,this.update,this)},stopListeners:function(){this.target.removeEventListener("gamepadconnected",this.onGamepadHandler),this.target.removeEventListener("gamepaddisconnected",this.onGamepadHandler),this.sceneInputPlugin.pluginEvents.off(u.UPDATE,this.update)},disconnectAll:function(){for(var t=0;t<this.gamepads.length;t++)this.gamepads.connected=!1},refreshPads:function(){var t=navigator.getGamepads();if(t)for(var e=this.gamepads,i=0;i<t.length;i++){var n=t[i];if(n){var r=n.id,s=n.index,a=e[s];if(a)a.id!==r?(a.destroy(),e[s]=new o(this,n)):a.update(n);else{var h=new o(this,n);e[s]=h,this._pad1?this._pad2?this._pad3?this._pad4||(this._pad4=h):this._pad3=h:this._pad2=h:this._pad1=h}}}else this.disconnectAll()},getAll:function(){for(var t=[],e=this.gamepads,i=0;i<e.length;i++)e[i]&&t.push(e[i]);return t},getPad:function(t){for(var e=this.gamepads,i=0;i<e.length;i++)if(e[i]&&e[i].index===t)return e[i]},update:function(){if(this.enabled){this.refreshPads();var t=this.queue.length;if(0!==t)for(var e=this.queue.splice(0,t),i=0;i<t;i++){var n=e[i],r=this.getPad(n.gamepad.index);"gamepadconnected"===n.type?this.emit(s.CONNECTED,r,n):"gamepaddisconnected"===n.type&&this.emit(s.DISCONNECTED,r,n)}}},shutdown:function(){this.stopListeners(),this.disconnectAll(),this.removeAllListeners()},destroy:function(){this.shutdown();for(var t=0;t<this.gamepads.length;t++)this.gamepads[t]&&this.gamepads[t].destroy();this.gamepads=[],this.scene=null,this.settings=null,this.sceneInputPlugin=null,this.target=null},total:{get:function(){return this.gamepads.length}},pad1:{get:function(){return this._pad1}},pad2:{get:function(){return this._pad2}},pad3:{get:function(){return this._pad3}},pad4:{get:function(){return this._pad4}}});h.register("GamepadPlugin",l,"gamepad","gamepad","inputGamepad"),t.exports=l},53724:t=>{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,SELECT:8,START:9,B:0,A:1,Y:2,X:3,LEFT_SHOULDER:4,RIGHT_SHOULDER:5}},51264:t=>{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,SHARE:8,OPTIONS:9,PS:16,TOUCHBAR:17,X:0,CIRCLE:1,SQUARE:2,TRIANGLE:3,L1:4,R1:5,L2:6,R2:7,L3:10,R3:11,LEFT_STICK_H:0,LEFT_STICK_V:1,RIGHT_STICK_H:2,RIGHT_STICK_V:3}},2695:t=>{t.exports={UP:12,DOWN:13,LEFT:14,RIGHT:15,MENU:16,A:0,B:1,X:2,Y:3,LB:4,RB:5,LT:6,RT:7,BACK:8,START:9,LS:10,RS:11,LEFT_STICK_H:0,LEFT_STICK_V:1,RIGHT_STICK_H:2,RIGHT_STICK_V:3}},96126:(t,e,i)=>{t.exports={DUALSHOCK_4:i(51264),SNES_USB:i(53724),XBOX_360:i(2695)}},69941:t=>{t.exports="down"},35831:t=>{t.exports="up"},76402:t=>{t.exports="connected"},32880:t=>{t.exports="disconnected"},52369:t=>{t.exports="down"},60560:t=>{t.exports="up"},29916:(t,e,i)=>{t.exports={BUTTON_DOWN:i(69941),BUTTON_UP:i(35831),CONNECTED:i(76402),DISCONNECTED:i(32880),GAMEPAD_BUTTON_DOWN:i(52369),GAMEPAD_BUTTON_UP:i(60560)}},95521:(t,e,i)=>{t.exports={Axis:i(63259),Button:i(66792),Events:i(29916),Gamepad:i(2115),GamepadPlugin:i(96151),Configs:i(96126)}},26417:(t,e,i)=>{var n=i(77625),r=i(80933),s={CreateInteractiveObject:i(91188),Events:i(22620),Gamepad:i(95521),InputManager:i(80771),InputPlugin:i(98964),InputPluginCache:i(54471),Keyboard:i(87626),Mouse:i(32879),Pointer:i(94661),Touch:i(71793)};s=r(!1,s,n),t.exports=s},72493:(t,e,i)=>{var n=i(60625),r=i(47379),s=i(80827),o=i(22620),a=i(25302),h=i(47379),u=new r({initialize:function(t){this.manager=t,this.queue=[],this.preventDefault=!0,this.captures=[],this.enabled=!1,this.target,this.onKeyDown=h,this.onKeyUp=h,t.events.once(o.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputKeyboard,this.target=t.inputKeyboardEventTarget,this.addCapture(t.inputKeyboardCapture),!this.target&&window&&(this.target=window),this.enabled&&this.target&&this.startListeners(),this.manager.game.events.on(s.POST_STEP,this.postUpdate,this)},startListeners:function(){var t=this;this.onKeyDown=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.useQueue||t.manager.events.emit(o.MANAGER_PROCESS);var i=e.altKey||e.ctrlKey||e.shiftKey||e.metaKey;t.preventDefault&&!i&&t.captures.indexOf(e.keyCode)>-1&&e.preventDefault()}},this.onKeyUp=function(e){if(!e.defaultPrevented&&t.enabled&&t.manager){t.queue.push(e),t.manager.useQueue||t.manager.events.emit(o.MANAGER_PROCESS);var i=e.altKey||e.ctrlKey||e.shiftKey||e.metaKey;t.preventDefault&&!i&&t.captures.indexOf(e.keyCode)>-1&&e.preventDefault()}};var e=this.target;e&&(e.addEventListener("keydown",this.onKeyDown,!1),e.addEventListener("keyup",this.onKeyUp,!1),this.enabled=!0)},stopListeners:function(){var t=this.target;t.removeEventListener("keydown",this.onKeyDown,!1),t.removeEventListener("keyup",this.onKeyUp,!1),this.enabled=!1},postUpdate:function(){this.queue=[]},addCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i<t.length;i++){var n=t[i];"string"==typeof n&&(n=a[n.trim().toUpperCase()]),-1===e.indexOf(n)&&e.push(n)}this.preventDefault=e.length>0},removeCapture:function(t){"string"==typeof t&&(t=t.split(",")),Array.isArray(t)||(t=[t]);for(var e=this.captures,i=0;i<t.length;i++){var r=t[i];"string"==typeof r&&(r=a[r.toUpperCase()]),n(e,r)}this.preventDefault=e.length>0},clearCaptures:function(){this.captures=[],this.preventDefault=!1},destroy:function(){this.stopListeners(),this.clearCaptures(),this.queue=[],this.manager.game.events.off(s.POST_RENDER,this.postUpdate,this),this.target=null,this.enabled=!1,this.manager=null}});t.exports=u},54917:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(33583),o=i(80827),a=i(86652),h=i(22620),u=i(54471),l=i(19577),c=i(25302),d=i(76085),p=i(59564),f=i(88168),m=new n({Extends:r,initialize:function(t){r.call(this),this.game=t.systems.game,this.scene=t.scene,this.settings=this.scene.sys.settings,this.sceneInputPlugin=t,this.manager=t.manager.keyboard,this.enabled=!0,this.keys=[],this.combos=[],t.pluginEvents.once(h.BOOT,this.boot,this),t.pluginEvents.on(h.START,this.start,this)},boot:function(){var t=this.settings.input;this.enabled=a(t,"keyboard",!0);var e=a(t,"keyboard.capture",null);e&&this.addCaptures(e),this.sceneInputPlugin.pluginEvents.once(h.DESTROY,this.destroy,this)},start:function(){this.sceneInputPlugin.manager.useQueue?this.sceneInputPlugin.pluginEvents.on(h.UPDATE,this.update,this):this.sceneInputPlugin.manager.events.on(h.MANAGER_PROCESS,this.update,this),this.sceneInputPlugin.pluginEvents.once(h.SHUTDOWN,this.shutdown,this),this.game.events.on(o.BLUR,this.resetKeys,this)},isActive:function(){return this.enabled&&this.scene.sys.isActive()},addCapture:function(t){return this.manager.addCapture(t),this},removeCapture:function(t){return this.manager.removeCapture(t),this},getCaptures:function(){return this.manager.captures},enableGlobalCapture:function(){return this.manager.preventDefault=!0,this},disableGlobalCapture:function(){return this.manager.preventDefault=!1,this},clearCaptures:function(){return this.manager.clearCaptures(),this},createCursorKeys:function(){return this.addKeys({up:c.UP,down:c.DOWN,left:c.LEFT,right:c.RIGHT,space:c.SPACE,shift:c.SHIFT})},addKeys:function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=!1);var n={};if("string"==typeof t){t=t.split(",");for(var r=0;r<t.length;r++){var s=t[r].trim();s&&(n[s]=this.addKey(s,e,i))}}else for(var o in t)n[o]=this.addKey(t[o],e,i);return n},addKey:function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=!1);var n=this.keys;if(t instanceof l){var r=n.indexOf(t);return r>-1?n[r]=t:n[t.keyCode]=t,e&&this.addCapture(t.keyCode),t.setEmitOnRepeat(i),t}return"string"==typeof t&&(t=c[t.toUpperCase()]),n[t]||(n[t]=new l(this,t),e&&this.addCapture(t),n[t].setEmitOnRepeat(i)),n[t]},removeKey:function(t,e){void 0===e&&(e=!1);var i,n=this.keys;if(t instanceof l){var r=n.indexOf(t);r>-1&&(i=this.keys[r],this.keys[r]=void 0)}else"string"==typeof t&&(t=c[t.toUpperCase()]);return n[t]&&(i=n[t],n[t]=void 0),i&&(i.plugin=null,e&&i.destroy()),this},createCombo:function(t,e){return new d(this,t,e)},checkDown:function(t,e){if(this.enabled&&t.isDown){var i=f(this.time-t.timeDown,e);if(i>t._tick)return t._tick=i,!0}return!1},update:function(){var t=this.manager.queue,e=t.length;if(this.isActive()&&0!==e)for(var i=this.keys,n=0;n<e;n++){var r=t[n],o=r.keyCode,a=i[o],h=!1;void 0===r.cancelled&&(r.cancelled=0,r.stopImmediatePropagation=function(){r.cancelled=1},r.stopPropagation=function(){r.cancelled=-1}),-1!==r.cancelled&&("keydown"===r.type?(a&&(h=a.isDown,a.onDown(r)),r.cancelled||a&&h||(p[o]&&(this.emit(s.KEY_DOWN+p[o],r),this.emit("keydown_"+p[o],r)),r.cancelled||this.emit(s.ANY_KEY_DOWN,r))):(a&&a.onUp(r),r.cancelled||(p[o]&&(this.emit(s.KEY_UP+p[o],r),this.emit("keyup_"+p[o],r)),r.cancelled||this.emit(s.ANY_KEY_UP,r))),1===r.cancelled&&(r.cancelled=0))}},resetKeys:function(){for(var t=this.keys,e=0;e<t.length;e++)t[e]&&t[e].reset();return this},shutdown:function(){this.resetKeys(),this.sceneInputPlugin.manager.useQueue?this.sceneInputPlugin.pluginEvents.off(h.UPDATE,this.update,this):this.sceneInputPlugin.manager.events.off(h.MANAGER_PROCESS,this.update,this),this.game.events.off(o.BLUR,this.resetKeys),this.removeAllListeners(),this.queue=[]},destroy:function(){this.shutdown();for(var t=this.keys,e=0;e<t.length;e++)t[e]&&t[e].destroy();this.keys=[],this.combos=[],this.queue=[],this.scene=null,this.settings=null,this.sceneInputPlugin=null,this.manager=null},time:{get:function(){return this.sceneInputPlugin.manager.time}}});u.register("KeyboardPlugin",m,"keyboard","keyboard","inputKeyboard"),t.exports=m},44893:t=>{t.exports=function(t,e){return e.timeLastMatched=t.timeStamp,e.index++,e.index===e.size||(e.current=e.keyCodes[e.index],!1)}},76085:(t,e,i)=>{var n=i(47379),r=i(33583),s=i(81769),o=i(55847),a=i(76251),h=new n({initialize:function(t,e,i){if(void 0===i&&(i={}),e.length<2)return!1;this.manager=t,this.enabled=!0,this.keyCodes=[];for(var n=0;n<e.length;n++){var h=e[n];"string"==typeof h?this.keyCodes.push(h.toUpperCase().charCodeAt(0)):"number"==typeof h?this.keyCodes.push(h):h.hasOwnProperty("keyCode")&&this.keyCodes.push(h.keyCode)}this.current=this.keyCodes[0],this.index=0,this.size=this.keyCodes.length,this.timeLastMatched=0,this.matched=!1,this.timeMatched=0,this.resetOnWrongKey=s(i,"resetOnWrongKey",!0),this.maxKeyDelay=s(i,"maxKeyDelay",0),this.resetOnMatch=s(i,"resetOnMatch",!1),this.deleteOnMatch=s(i,"deleteOnMatch",!1);var u=this;this.onKeyDown=function(t){!u.matched&&u.enabled&&(o(t,u)&&(u.manager.emit(r.COMBO_MATCH,u,t),u.resetOnMatch?a(u):u.deleteOnMatch&&u.destroy()))},this.manager.on(r.ANY_KEY_DOWN,this.onKeyDown)},progress:{get:function(){return this.index/this.size}},destroy:function(){this.enabled=!1,this.keyCodes=[],this.manager.off(r.ANY_KEY_DOWN,this.onKeyDown),this.manager=null}});t.exports=h},55847:(t,e,i)=>{var n=i(44893);t.exports=function(t,e){if(e.matched)return!0;var i=!1,r=!1;if(t.keyCode===e.current)if(e.index>0&&e.maxKeyDelay>0){var s=e.timeLastMatched+e.maxKeyDelay;t.timeStamp<=s&&(r=!0,i=n(t,e))}else r=!0,i=n(t,e);return!r&&e.resetOnWrongKey&&(e.index=0,e.current=e.keyCodes[0]),i&&(e.timeLastMatched=t.timeStamp,e.matched=!0,e.timeMatched=t.timeStamp),i}},76251:t=>{t.exports=function(t){return t.current=t.keyCodes[0],t.index=0,t.timeLastMatched=0,t.matched=!1,t.timeMatched=0,t}},37944:t=>{t.exports="keydown"},37791:t=>{t.exports="keyup"},4260:t=>{t.exports="keycombomatch"},67901:t=>{t.exports="down"},38178:t=>{t.exports="keydown-"},10900:t=>{t.exports="keyup-"},75546:t=>{t.exports="up"},33583:(t,e,i)=>{t.exports={ANY_KEY_DOWN:i(37944),ANY_KEY_UP:i(37791),COMBO_MATCH:i(4260),DOWN:i(67901),KEY_DOWN:i(38178),KEY_UP:i(10900),UP:i(75546)}},87626:(t,e,i)=>{t.exports={Events:i(33583),KeyboardManager:i(72493),KeyboardPlugin:i(54917),Key:i(19577),KeyCodes:i(25302),KeyCombo:i(76085),JustDown:i(40070),JustUp:i(86806),DownDuration:i(42637),UpDuration:i(77715)}},42637:t=>{t.exports=function(t,e){void 0===e&&(e=50);var i=t.plugin.game.loop.time-t.timeDown;return t.isDown&&i<e}},40070:t=>{t.exports=function(t){return!!t._justDown&&(t._justDown=!1,!0)}},86806:t=>{t.exports=function(t){return!!t._justUp&&(t._justUp=!1,!0)}},19577:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(33583),o=new n({Extends:r,initialize:function(t,e){r.call(this),this.plugin=t,this.keyCode=e,this.originalEvent=void 0,this.enabled=!0,this.isDown=!1,this.isUp=!0,this.altKey=!1,this.ctrlKey=!1,this.shiftKey=!1,this.metaKey=!1,this.location=0,this.timeDown=0,this.duration=0,this.timeUp=0,this.emitOnRepeat=!1,this.repeats=0,this._justDown=!1,this._justUp=!1,this._tick=-1},setEmitOnRepeat:function(t){return this.emitOnRepeat=t,this},onDown:function(t){this.originalEvent=t,this.enabled&&(this.altKey=t.altKey,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.metaKey=t.metaKey,this.location=t.location,this.repeats++,this.isDown?this.emitOnRepeat&&this.emit(s.DOWN,this,t):(this.isDown=!0,this.isUp=!1,this.timeDown=t.timeStamp,this.duration=0,this._justDown=!0,this._justUp=!1,this.emit(s.DOWN,this,t)))},onUp:function(t){this.originalEvent=t,this.enabled&&(this.isDown=!1,this.isUp=!0,this.timeUp=t.timeStamp,this.duration=this.timeUp-this.timeDown,this.repeats=0,this._justDown=!1,this._justUp=!0,this._tick=-1,this.emit(s.UP,this,t))},reset:function(){return this.preventDefault=!0,this.enabled=!0,this.isDown=!1,this.isUp=!0,this.altKey=!1,this.ctrlKey=!1,this.shiftKey=!1,this.metaKey=!1,this.timeDown=0,this.duration=0,this.timeUp=0,this.repeats=0,this._justDown=!1,this._justUp=!1,this._tick=-1,this},getDuration:function(){return this.isDown?this.plugin.game.loop.time-this.timeDown:0},destroy:function(){this.removeAllListeners(),this.originalEvent=null,this.plugin=null}});t.exports=o},25302:t=>{t.exports={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:42,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,NUMPAD_ZERO:96,NUMPAD_ONE:97,NUMPAD_TWO:98,NUMPAD_THREE:99,NUMPAD_FOUR:100,NUMPAD_FIVE:101,NUMPAD_SIX:102,NUMPAD_SEVEN:103,NUMPAD_EIGHT:104,NUMPAD_NINE:105,NUMPAD_ADD:107,NUMPAD_SUBTRACT:109,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,SEMICOLON:186,PLUS:187,COMMA:188,MINUS:189,PERIOD:190,FORWARD_SLASH:191,BACK_SLASH:220,QUOTES:222,BACKTICK:192,OPEN_BRACKET:219,CLOSED_BRACKET:221,SEMICOLON_FIREFOX:59,COLON:58,COMMA_FIREFOX_WINDOWS:60,COMMA_FIREFOX:62,BRACKET_RIGHT_FIREFOX:174,BRACKET_LEFT_FIREFOX:175}},59564:(t,e,i)=>{var n=i(25302),r={};for(var s in n)r[n[s]]=s;t.exports=r},77715:t=>{t.exports=function(t,e){void 0===e&&(e=50);var i=t.plugin.game.loop.time-t.timeUp;return t.isUp&&i<e}},43236:(t,e,i)=>{var n=i(47379),r=i(33789),s=i(22620),o=i(47379),a=new n({initialize:function(t){this.manager=t,this.capture=!0,this.enabled=!1,this.target,this.locked=!1,this.onMouseMove=o,this.onMouseDown=o,this.onMouseUp=o,this.onMouseDownWindow=o,this.onMouseUpWindow=o,this.onMouseOver=o,this.onMouseOut=o,this.onMouseWheel=o,this.pointerLockChange=o,t.events.once(s.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputMouse,this.target=t.inputMouseEventTarget,this.capture=t.inputMouseCapture,this.target?"string"==typeof this.target&&(this.target=document.getElementById(this.target)):this.target=this.manager.game.canvas,t.disableContextMenu&&this.disableContextMenu(),this.enabled&&this.target&&this.startListeners()},disableContextMenu:function(){return document.body.addEventListener("contextmenu",(function(t){return t.preventDefault(),!1})),this},requestPointerLock:function(){if(r.pointerLock){var t=this.target;t.requestPointerLock=t.requestPointerLock||t.mozRequestPointerLock||t.webkitRequestPointerLock,t.requestPointerLock()}},releasePointerLock:function(){r.pointerLock&&(document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock,document.exitPointerLock())},startListeners:function(){var t=this,e=this.manager.canvas,i=window&&window.focus&&this.manager.game.config.autoFocus;this.onMouseMove=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onMouseMove(e),t.capture&&e.preventDefault())},this.onMouseDown=function(n){i&&window.focus(),!n.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onMouseDown(n),t.capture&&n.target===e&&n.preventDefault())},this.onMouseDownWindow=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&i.target!==e&&t.manager.onMouseDown(i)},this.onMouseUp=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onMouseUp(i),t.capture&&i.target===e&&i.preventDefault())},this.onMouseUpWindow=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&i.target!==e&&t.manager.onMouseUp(i)},this.onMouseOver=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.setCanvasOver(e)},this.onMouseOut=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.setCanvasOut(e)},this.onMouseWheel=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.onMouseWheel(e)};var n=this.target;if(n){var s={passive:!0},o={passive:!1};n.addEventListener("mousemove",this.onMouseMove,this.capture?o:s),n.addEventListener("mousedown",this.onMouseDown,this.capture?o:s),n.addEventListener("mouseup",this.onMouseUp,this.capture?o:s),n.addEventListener("mouseover",this.onMouseOver,this.capture?o:s),n.addEventListener("mouseout",this.onMouseOut,this.capture?o:s),n.addEventListener("wheel",this.onMouseWheel,this.capture?o:s),window&&this.manager.game.config.inputWindowEvents&&(window.addEventListener("mousedown",this.onMouseDownWindow,o),window.addEventListener("mouseup",this.onMouseUpWindow,o)),r.pointerLock&&(this.pointerLockChange=function(e){var i=t.target;t.locked=document.pointerLockElement===i||document.mozPointerLockElement===i||document.webkitPointerLockElement===i,t.manager.onPointerLockChange(e)},document.addEventListener("pointerlockchange",this.pointerLockChange,!0),document.addEventListener("mozpointerlockchange",this.pointerLockChange,!0),document.addEventListener("webkitpointerlockchange",this.pointerLockChange,!0)),this.enabled=!0}},stopListeners:function(){var t=this.target;t.removeEventListener("mousemove",this.onMouseMove),t.removeEventListener("mousedown",this.onMouseDown),t.removeEventListener("mouseup",this.onMouseUp),t.removeEventListener("mouseover",this.onMouseOver),t.removeEventListener("mouseout",this.onMouseOut),window&&(window.removeEventListener("mousedown",this.onMouseDownWindow),window.removeEventListener("mouseup",this.onMouseUpWindow)),r.pointerLock&&(document.removeEventListener("pointerlockchange",this.pointerLockChange,!0),document.removeEventListener("mozpointerlockchange",this.pointerLockChange,!0),document.removeEventListener("webkitpointerlockchange",this.pointerLockChange,!0))},destroy:function(){this.stopListeners(),this.target=null,this.enabled=!1,this.manager=null}});t.exports=a},32879:(t,e,i)=>{t.exports={MouseManager:i(43236)}},42380:(t,e,i)=>{var n=i(47379),r=i(22620),s=i(49035),o=new n({initialize:function(t){this.manager=t,this.capture=!0,this.enabled=!1,this.target,this.onTouchStart=s,this.onTouchStartWindow=s,this.onTouchMove=s,this.onTouchEnd=s,this.onTouchEndWindow=s,this.onTouchCancel=s,this.onTouchCancelWindow=s,this.onTouchOver=s,this.onTouchOut=s,t.events.once(r.MANAGER_BOOT,this.boot,this)},boot:function(){var t=this.manager.config;this.enabled=t.inputTouch,this.target=t.inputTouchEventTarget,this.capture=t.inputTouchCapture,this.target||(this.target=this.manager.game.canvas),t.disableContextMenu&&this.disableContextMenu(),this.enabled&&this.target&&this.startListeners()},disableContextMenu:function(){return document.body.addEventListener("contextmenu",(function(t){return t.preventDefault(),!1})),this},startListeners:function(){var t=this,e=this.manager.canvas,i=window&&window.focus&&this.manager.game.config.autoFocus;this.onTouchStart=function(n){i&&window.focus(),!n.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onTouchStart(n),t.capture&&n.cancelable&&n.target===e&&n.preventDefault())},this.onTouchStartWindow=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&i.target!==e&&t.manager.onTouchStart(i)},this.onTouchMove=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onTouchMove(e),t.capture&&e.cancelable&&e.preventDefault())},this.onTouchEnd=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onTouchEnd(i),t.capture&&i.cancelable&&i.target===e&&i.preventDefault())},this.onTouchEndWindow=function(i){!i.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&i.target!==e&&t.manager.onTouchEnd(i)},this.onTouchCancel=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&(t.manager.onTouchCancel(e),t.capture&&e.preventDefault())},this.onTouchCancelWindow=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.onTouchCancel(e)},this.onTouchOver=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.setCanvasOver(e)},this.onTouchOut=function(e){!e.defaultPrevented&&t.enabled&&t.manager&&t.manager.enabled&&t.manager.setCanvasOut(e)};var n=this.target;if(n){var r={passive:!0},s={passive:!1};n.addEventListener("touchstart",this.onTouchStart,this.capture?s:r),n.addEventListener("touchmove",this.onTouchMove,this.capture?s:r),n.addEventListener("touchend",this.onTouchEnd,this.capture?s:r),n.addEventListener("touchcancel",this.onTouchCancel,this.capture?s:r),n.addEventListener("touchover",this.onTouchOver,this.capture?s:r),n.addEventListener("touchout",this.onTouchOut,this.capture?s:r),window&&this.manager.game.config.inputWindowEvents&&(window.addEventListener("touchstart",this.onTouchStartWindow,s),window.addEventListener("touchend",this.onTouchEndWindow,s),window.addEventListener("touchcancel",this.onTouchCancelWindow,s)),this.enabled=!0}},stopListeners:function(){var t=this.target;t.removeEventListener("touchstart",this.onTouchStart),t.removeEventListener("touchmove",this.onTouchMove),t.removeEventListener("touchend",this.onTouchEnd),t.removeEventListener("touchcancel",this.onTouchCancel),t.removeEventListener("touchover",this.onTouchOver),t.removeEventListener("touchout",this.onTouchOut),window&&(window.removeEventListener("touchstart",this.onTouchStartWindow),window.removeEventListener("touchend",this.onTouchEndWindow))},destroy:function(){this.stopListeners(),this.target=null,this.enabled=!1,this.manager=null}});t.exports=o},71793:(t,e,i)=>{t.exports={TouchManager:i(42380)}},21301:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(88275),o=i(81769),a=i(1429),h=i(36404),u=i(13872),l=i(20270),c=new n({initialize:function(t,e){this.loader=t,this.cache=o(e,"cache",!1),this.type=o(e,"type",!1),this.key=o(e,"key",!1);var i=this.key;if(t.prefix&&""!==t.prefix&&(this.key=t.prefix+i),!this.type||!this.key)throw new Error("Error calling 'Loader."+this.type+"' invalid key provided.");this.url=o(e,"url"),void 0===this.url?this.url=t.path+i+"."+o(e,"extension",""):"function"!=typeof this.url&&0!==this.url.indexOf("blob:")&&0!==this.url.indexOf("data:")&&(this.url=t.path+this.url),this.src="",this.xhrSettings=l(o(e,"responseType",void 0)),o(e,"xhrSettings",!1)&&(this.xhrSettings=h(this.xhrSettings,o(e,"xhrSettings",{}))),this.xhrLoader=null,this.state="function"==typeof this.url?r.FILE_POPULATED:r.FILE_PENDING,this.bytesTotal=0,this.bytesLoaded=-1,this.percentComplete=-1,this.crossOrigin=void 0,this.data=void 0,this.config=o(e,"config",{}),this.multiFile,this.linkFile},setLink:function(t){this.linkFile=t,t.linkFile=this},resetXHR:function(){this.xhrLoader&&(this.xhrLoader.onload=void 0,this.xhrLoader.onerror=void 0,this.xhrLoader.onprogress=void 0)},load:function(){this.state===r.FILE_POPULATED?this.loader.nextFile(this,!0):(this.src=a(this,this.loader.baseURL),0===this.src.indexOf("data:")?console.warn("Local data URIs are not supported: "+this.key):this.xhrLoader=u(this,this.loader.xhr))},onLoad:function(t,e){var i=t.responseURL&&0===t.responseURL.indexOf("file://")&&0===e.target.status,n=!(e.target&&200!==e.target.status)||i;4===t.readyState&&t.status>=400&&t.status<=599&&(n=!1),this.resetXHR(),this.loader.nextFile(this,n)},onError:function(){this.resetXHR(),this.loader.nextFile(this,!1)},onProgress:function(t){t.lengthComputable&&(this.bytesLoaded=t.loaded,this.bytesTotal=t.total,this.percentComplete=Math.min(this.bytesLoaded/this.bytesTotal,1),this.loader.emit(s.FILE_PROGRESS,this,this.percentComplete))},onProcess:function(){this.state=r.FILE_PROCESSING,this.onProcessComplete()},onProcessComplete:function(){this.state=r.FILE_COMPLETE,this.multiFile&&this.multiFile.onFileComplete(this),this.loader.fileProcessComplete(this)},onProcessError:function(){this.state=r.FILE_ERRORED,this.multiFile&&this.multiFile.onFileFailed(this),this.loader.fileProcessComplete(this)},hasCacheConflict:function(){return this.cache&&this.cache.exists(this.key)},addToCache:function(){this.cache&&this.cache.add(this.key,this.data),this.pendingDestroy()},pendingDestroy:function(t){void 0===t&&(t=this.data);var e=this.key,i=this.type;this.loader.emit(s.FILE_COMPLETE,e,i,t),this.loader.emit(s.FILE_KEY_COMPLETE+i+"-"+e,e,i,t),this.loader.flagForRemoval(this)},destroy:function(){this.loader=null,this.cache=null,this.xhrSettings=null,this.multiFile=null,this.linkFile=null,this.data=null}});c.createObjectURL=function(t,e,i){if("function"==typeof URL)t.src=URL.createObjectURL(e);else{var n=new FileReader;n.onload=function(){t.removeAttribute("crossOrigin"),t.src="data:"+(e.type||i)+";base64,"+n.result.split(",")[1]},n.onerror=t.onerror,n.readAsDataURL(e)}},c.revokeObjectURL=function(t){"function"==typeof URL&&URL.revokeObjectURL(t.src)},t.exports=c},16656:t=>{var e={},i={install:function(t){for(var i in e)t[i]=e[i]},register:function(t,i){e[t]=i},destroy:function(){e={}}};t.exports=i},1429:t=>{t.exports=function(t,e){return!!t.url&&(t.url.match(/^(?:blob:|data:|http:\/\/|https:\/\/|\/\/)/)?t.url:e+t.url)}},91315:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(69347),o=i(17168),a=i(88275),h=i(16656),u=i(81769),l=i(50354),c=i(88637),d=i(20270),p=new n({Extends:o,initialize:function(t){o.call(this);var e=t.sys.game.config,i=t.sys.settings.loader;this.scene=t,this.systems=t.sys,this.cacheManager=t.sys.cache,this.textureManager=t.sys.textures,this.sceneManager=t.sys.game.scene,h.install(this),this.prefix="",this.path="",this.baseURL="",this.setBaseURL(u(i,"baseURL",e.loaderBaseURL)),this.setPath(u(i,"path",e.loaderPath)),this.setPrefix(u(i,"prefix",e.loaderPrefix)),this.maxParallelDownloads=u(i,"maxParallelDownloads",e.loaderMaxParallelDownloads),this.xhr=d(u(i,"responseType",e.loaderResponseType),u(i,"async",e.loaderAsync),u(i,"user",e.loaderUser),u(i,"password",e.loaderPassword),u(i,"timeout",e.loaderTimeout),u(i,"withCredentials",e.loaderWithCredentials)),this.crossOrigin=u(i,"crossOrigin",e.loaderCrossOrigin),this.totalToLoad=0,this.progress=0,this.list=new s,this.inflight=new s,this.queue=new s,this._deleteQueue=new s,this.totalFailed=0,this.totalComplete=0,this.state=r.LOADER_IDLE,this.multiKeyIndex=0,t.sys.events.once(c.BOOT,this.boot,this),t.sys.events.on(c.START,this.pluginStart,this)},boot:function(){this.systems.events.once(c.DESTROY,this.destroy,this)},pluginStart:function(){this.systems.events.once(c.SHUTDOWN,this.shutdown,this)},setBaseURL:function(t){return void 0===t&&(t=""),""!==t&&"/"!==t.substr(-1)&&(t=t.concat("/")),this.baseURL=t,this},setPath:function(t){return void 0===t&&(t=""),""!==t&&"/"!==t.substr(-1)&&(t=t.concat("/")),this.path=t,this},setPrefix:function(t){return void 0===t&&(t=""),this.prefix=t,this},setCORS:function(t){return this.crossOrigin=t,this},addFile:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e<t.length;e++){var i=t[e];this.keyExists(i)||(this.list.set(i),this.emit(a.ADD,i.key,i.type,this,i),this.isLoading()&&(this.totalToLoad++,this.updateProgress()))}},keyExists:function(t){var e=t.hasCacheConflict();return e||this.list.iterate((function(i){if(i.type===t.type&&i.key===t.key)return e=!0,!1})),!e&&this.isLoading()&&(this.inflight.iterate((function(i){if(i.type===t.type&&i.key===t.key)return e=!0,!1})),this.queue.iterate((function(i){if(i.type===t.type&&i.key===t.key)return e=!0,!1}))),e},addPack:function(t,e){e&&t.hasOwnProperty(e)&&(t={packKey:t[e]});var i=0,n=this.baseURL,r=this.path,s=this.prefix;for(var o in t)if(Object.prototype.hasOwnProperty.call(t,o)){var a=t[o],h=u(a,"baseURL",n),l=u(a,"path",r),c=u(a,"prefix",s),d=u(a,"files",null),p=u(a,"defaultType","void");if(Array.isArray(d)){this.setBaseURL(h),this.setPath(l),this.setPrefix(c);for(var f=0;f<d.length;f++){var m=d[f],v=m.hasOwnProperty("type")?m.type:p;this[v]&&(this[v](m),i++)}}}return this.setBaseURL(n),this.setPath(r),this.setPrefix(s),i>0},isLoading:function(){return this.state===r.LOADER_LOADING||this.state===r.LOADER_PROCESSING},isReady:function(){return this.state===r.LOADER_IDLE||this.state===r.LOADER_COMPLETE},start:function(){this.isReady()&&(this.progress=0,this.totalFailed=0,this.totalComplete=0,this.totalToLoad=this.list.size,this.emit(a.START,this),0===this.list.size?this.loadComplete():(this.state=r.LOADER_LOADING,this.inflight.clear(),this.queue.clear(),this.updateProgress(),this.checkLoadQueue(),this.systems.events.on(c.UPDATE,this.update,this)))},updateProgress:function(){this.progress=1-(this.list.size+this.inflight.size)/this.totalToLoad,this.emit(a.PROGRESS,this.progress)},update:function(){this.state===r.LOADER_LOADING&&this.list.size>0&&this.inflight.size<this.maxParallelDownloads&&this.checkLoadQueue()},checkLoadQueue:function(){this.list.each((function(t){if((t.state===r.FILE_POPULATED||t.state===r.FILE_PENDING&&this.inflight.size<this.maxParallelDownloads)&&(this.inflight.set(t),this.list.delete(t),t.crossOrigin||(t.crossOrigin=this.crossOrigin),t.load()),this.inflight.size===this.maxParallelDownloads)return!1}),this)},nextFile:function(t,e){this.inflight&&(this.inflight.delete(t),this.updateProgress(),e?(this.totalComplete++,this.queue.set(t),this.emit(a.FILE_LOAD,t),t.onProcess()):(this.totalFailed++,this._deleteQueue.set(t),this.emit(a.FILE_LOAD_ERROR,t),this.fileProcessComplete(t)))},fileProcessComplete:function(t){this.scene&&this.systems&&this.systems.game&&!this.systems.game.pendingDestroy&&(t.state===r.FILE_ERRORED?t.multiFile&&t.multiFile.onFileFailed(t):t.state===r.FILE_COMPLETE&&(t.multiFile?t.multiFile.isReadyToProcess()&&t.multiFile.addToCache():t.addToCache()),this.queue.delete(t),0===this.list.size&&0===this.inflight.size&&0===this.queue.size&&this.loadComplete())},loadComplete:function(){this.emit(a.POST_PROCESS,this),this.list.clear(),this.inflight.clear(),this.queue.clear(),this.progress=1,this.state=r.LOADER_COMPLETE,this.systems.events.off(c.UPDATE,this.update,this),this._deleteQueue.iterateLocal("destroy"),this._deleteQueue.clear(),this.emit(a.COMPLETE,this,this.totalComplete,this.totalFailed)},flagForRemoval:function(t){this._deleteQueue.set(t)},saveJSON:function(t,e){return this.save(JSON.stringify(t),e)},save:function(t,e,i){void 0===e&&(e="file.json"),void 0===i&&(i="application/json");var n=new Blob([t],{type:i}),r=URL.createObjectURL(n),s=document.createElement("a");return s.download=e,s.textContent="Download "+e,s.href=r,s.click(),this},reset:function(){this.list.clear(),this.inflight.clear(),this.queue.clear();var t=this.systems.game.config,e=this.systems.settings.loader;this.setBaseURL(u(e,"baseURL",t.loaderBaseURL)),this.setPath(u(e,"path",t.loaderPath)),this.setPrefix(u(e,"prefix",t.loaderPrefix)),this.state=r.LOADER_IDLE},shutdown:function(){this.reset(),this.state=r.LOADER_SHUTDOWN,this.systems.events.off(c.UPDATE,this.update,this),this.systems.events.off(c.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.state=r.LOADER_DESTROYED,this.systems.events.off(c.UPDATE,this.update,this),this.systems.events.off(c.START,this.pluginStart,this),this.list=null,this.inflight=null,this.queue=null,this.scene=null,this.systems=null,this.textureManager=null,this.cacheManager=null,this.sceneManager=null}});l.register("Loader",p,"load"),t.exports=p},36404:(t,e,i)=>{var n=i(80933),r=i(20270);t.exports=function(t,e){var i=void 0===t?r():n({},t);if(e)for(var s in e)void 0!==e[s]&&(i[s]=e[s]);return i}},11611:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n){this.loader=t,this.type=e,this.key=i,this.multiKeyIndex=t.multiKeyIndex++,this.files=n,this.complete=!1,this.pending=n.length,this.failed=0,this.config={},this.baseURL=t.baseURL,this.path=t.path,this.prefix=t.prefix;for(var r=0;r<n.length;r++)n[r].multiFile=this},isReadyToProcess:function(){return 0===this.pending&&0===this.failed&&!this.complete},addToMultiFile:function(t){return this.files.push(t),t.multiFile=this,this.pending++,this.complete=!1,this},onFileComplete:function(t){-1!==this.files.indexOf(t)&&this.pending--},onFileFailed:function(t){-1!==this.files.indexOf(t)&&this.failed++}});t.exports=n},13872:(t,e,i)=>{var n=i(36404);t.exports=function(t,e){var i=n(e,t.xhrSettings),r=new XMLHttpRequest;if(r.open("GET",t.src,i.async,i.user,i.password),r.responseType=t.xhrSettings.responseType,r.timeout=i.timeout,i.headers)for(var s in i.headers)r.setRequestHeader(s,i.headers[s]);return i.header&&i.headerValue&&r.setRequestHeader(i.header,i.headerValue),i.requestedWith&&r.setRequestHeader("X-Requested-With",i.requestedWith),i.overrideMimeType&&r.overrideMimeType(i.overrideMimeType),i.withCredentials&&(r.withCredentials=!0),r.onload=t.onLoad.bind(t,r),r.onerror=t.onError.bind(t,r),r.onprogress=t.onProgress.bind(t),r.send(),r}},20270:t=>{t.exports=function(t,e,i,n,r,s){return void 0===t&&(t=""),void 0===e&&(e=!0),void 0===i&&(i=""),void 0===n&&(n=""),void 0===r&&(r=0),void 0===s&&(s=!1),{responseType:t,async:e,user:i,password:n,timeout:r,headers:void 0,header:void 0,headerValue:void 0,requestedWith:!1,overrideMimeType:void 0,withCredentials:s}}},78146:t=>{t.exports={LOADER_IDLE:0,LOADER_LOADING:1,LOADER_PROCESSING:2,LOADER_COMPLETE:3,LOADER_SHUTDOWN:4,LOADER_DESTROYED:5,FILE_PENDING:10,FILE_LOADING:11,FILE_LOADED:12,FILE_FAILED:13,FILE_PROCESSING:14,FILE_ERRORED:16,FILE_COMPLETE:17,FILE_DESTROYED:18,FILE_POPULATED:19}},76283:t=>{t.exports="addfile"},23827:t=>{t.exports="complete"},51651:t=>{t.exports="filecomplete"},59573:t=>{t.exports="filecomplete-"},64193:t=>{t.exports="loaderror"},80809:t=>{t.exports="load"},97341:t=>{t.exports="fileprogress"},88966:t=>{t.exports="postprocess"},51904:t=>{t.exports="progress"},87803:t=>{t.exports="start"},88275:(t,e,i)=>{t.exports={ADD:i(76283),COMPLETE:i(23827),FILE_COMPLETE:i(51651),FILE_KEY_COMPLETE:i(59573),FILE_LOAD_ERROR:i(64193),FILE_LOAD:i(80809),FILE_PROGRESS:i(97341),POST_PROCESS:i(88966),PROGRESS:i(51904),START:i(87803)}},28955:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(22102),o=i(88275),a=new n({Extends:s,initialize:function(t,e,i,n,r){s.call(this,t,e,i,n,r),this.type="animationJSON"},onProcess:function(){this.loader.once(o.POST_PROCESS,this.onLoadComplete,this),s.prototype.onProcess.call(this)},onLoadComplete:function(){this.loader.systems.anims.fromJSON(this.data)}});r.register("animation",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new a(this,t[r]));else this.addFile(new a(this,t,e,n,i));return this})),t.exports=a},5084:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(85458),a=i(28621),h=i(22102),u=i(11611),l=new n({Extends:u,initialize:function(t,e,i,n,r,l){var c,d;if(a(e)){var p=e;e=s(p,"key"),c=new o(t,{key:e,url:s(p,"textureURL"),extension:s(p,"textureExtension","png"),normalMap:s(p,"normalMap"),xhrSettings:s(p,"textureXhrSettings")}),d=new h(t,{key:e,url:s(p,"atlasURL"),extension:s(p,"atlasExtension","json"),xhrSettings:s(p,"atlasXhrSettings")})}else c=new o(t,e,i,r),d=new h(t,e,n,l);c.linkFile?u.call(this,t,"atlasjson",e,[c,d,c.linkFile]):u.call(this,t,"atlasjson",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addAtlas(t.key,t.data,e.data,i),e.addToCache(),this.complete=!0}}});r.register("atlas",(function(t,e,i,n,r){var s;if(Array.isArray(t))for(var o=0;o<t.length;o++)s=new l(this,t[o]),this.addFile(s.files);else s=new l(this,t,e,i,n,r),this.addFile(s.files);return this})),t.exports=l},44468:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(85458),a=i(28621),h=i(11611),u=i(56126),l=new n({Extends:h,initialize:function(t,e,i,n,r,l){var c,d;if(a(e)){var p=e;e=s(p,"key"),c=new o(t,{key:e,url:s(p,"textureURL"),extension:s(p,"textureExtension","png"),normalMap:s(p,"normalMap"),xhrSettings:s(p,"textureXhrSettings")}),d=new u(t,{key:e,url:s(p,"atlasURL"),extension:s(p,"atlasExtension","xml"),xhrSettings:s(p,"atlasXhrSettings")})}else c=new o(t,e,i,r),d=new u(t,e,n,l);c.linkFile?h.call(this,t,"atlasxml",e,[c,d,c.linkFile]):h.call(this,t,"atlasxml",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addAtlasXML(t.key,t.data,e.data,i),e.addToCache(),this.complete=!0}}});r.register("atlasXML",(function(t,e,i,n,r){var s;if(Array.isArray(t))for(var o=0;o<t.length;o++)s=new l(this,t[o]),this.addFile(s.files);else s=new l(this,t,e,i,n,r),this.addFile(s.files);return this})),t.exports=l},92500:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(43070),u=i(28621),l=new n({Extends:s,initialize:function(t,e,i,n,r){if(u(e)){var o=e;e=a(o,"key"),n=a(o,"xhrSettings"),r=a(o,"context",r)}var h={type:"audio",cache:t.cacheManager.audio,extension:i.type,responseType:"arraybuffer",key:e,url:i.url,xhrSettings:n,config:{context:r}};s.call(this,t,h)},onProcess:function(){this.state=r.FILE_PROCESSING;var t=this;this.config.context.decodeAudioData(this.xhrLoader.response,(function(e){t.data=e,t.onProcessComplete()}),(function(e){console.error("Error decoding audio: "+this.key+" - ",e?e.message:null),t.onProcessError()})),this.config.context=null}});l.create=function(t,e,i,n,r){var s=t.systems.game,o=s.config.audio,c=s.device.audio;u(e)&&(i=a(e,"url",[]),n=a(e,"config",{}));var d=l.getAudioURL(s,i);return d?!c.webAudio||o&&o.disableWebAudio?new h(t,e,d,n):new l(t,e,d,r,s.sound.context):null},l.getAudioURL=function(t,e){Array.isArray(e)||(e=[e]);for(var i=0;i<e.length;i++){var n=a(e[i],"url",e[i]);if(0===n.indexOf("blob:")||0===n.indexOf("data:"))return{url:n,type:""};var r=n.match(/\.([a-zA-Z0-9]+)($|\?)/);if(r=a(e[i],"type",r?r[1]:"").toLowerCase(),t.device.audio[r])return{url:n,type:r}}return null},o.register("audio",(function(t,e,i,n){var r,s=this.systems.game,o=s.config.audio,a=s.device.audio;if(o&&o.noAudio||!a.webAudio&&!a.audioData)return this;if(Array.isArray(t))for(var h=0;h<t.length;h++)(r=l.create(this,t[h]))&&this.addFile(r);else(r=l.create(this,t,e,i,n))&&this.addFile(r);return this})),t.exports=l},33714:(t,e,i)=>{var n=i(92500),r=i(47379),s=i(16656),o=i(81769),a=i(28621),h=i(22102),u=i(11611),l=new r({Extends:u,initialize:function(t,e,i,r,s,l,c){if(a(e)){var d=e;e=o(d,"key"),i=o(d,"jsonURL"),r=o(d,"audioURL"),s=o(d,"audioConfig"),l=o(d,"audioXhrSettings"),c=o(d,"jsonXhrSettings")}var p;if(r){var f=n.create(t,e,r,s,l);f&&(p=new h(t,e,i,c),u.call(this,t,"audiosprite",e,[f,p]),this.config.resourceLoad=!1)}else p=new h(t,e,i,c),u.call(this,t,"audiosprite",e,[p]),this.config.resourceLoad=!0,this.config.audioConfig=s,this.config.audioXhrSettings=l},onFileComplete:function(t){if(-1!==this.files.indexOf(t)&&(this.pending--,this.config.resourceLoad&&"json"===t.type&&t.data.hasOwnProperty("resources"))){var e=t.data.resources,i=o(this.config,"audioConfig"),r=o(this.config,"audioXhrSettings"),s=n.create(this.loader,t.key,e,i,r);s&&(this.addToMultiFile(s),this.loader.addFile(s))}},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1];t.addToCache(),e.addToCache(),this.complete=!0}}});s.register("audioSprite",(function(t,e,i,n,r,s){var o,a=this.systems.game,h=a.config.audio,u=a.device.audio;if(h&&h.noAudio||!u.webAudio&&!u.audioData)return this;if(Array.isArray(t))for(var c=0;c<t.length;c++)(o=new l(this,t[c])).files&&this.addFile(o.files);else(o=new l(this,t,e,i,n,r,s)).files&&this.addFile(o.files);return this}))},19132:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n,r){var o="bin";if(h(e)){var u=e;e=a(u,"key"),i=a(u,"url"),n=a(u,"xhrSettings"),o=a(u,"extension",o),r=a(u,"dataType",r)}var l={type:"binary",cache:t.cacheManager.binary,extension:o,responseType:"arraybuffer",key:e,url:i,xhrSettings:n,config:{dataType:r}};s.call(this,t,l)},onProcess:function(){this.state=r.FILE_PROCESSING;var t=this.config.dataType;this.data=t?new t(this.xhrLoader.response):this.xhrLoader.response,this.onProcessComplete()}});o.register("binary",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new u(this,t[r]));else this.addFile(new u(this,t,e,n,i));return this})),t.exports=u},70589:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(85458),a=i(28621),h=i(11611),u=i(40419),l=i(56126),c=new n({Extends:h,initialize:function(t,e,i,n,r,u){var c,d;if(a(e)){var p=e;e=s(p,"key"),c=new o(t,{key:e,url:s(p,"textureURL"),extension:s(p,"textureExtension","png"),normalMap:s(p,"normalMap"),xhrSettings:s(p,"textureXhrSettings")}),d=new l(t,{key:e,url:s(p,"fontDataURL"),extension:s(p,"fontDataExtension","xml"),xhrSettings:s(p,"fontDataXhrSettings")})}else c=new o(t,e,i,r),d=new l(t,e,n,u);c.linkFile?h.call(this,t,"bitmapfont",e,[c,d,c.linkFile]):h.call(this,t,"bitmapfont",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1];t.addToCache(),e.addToCache(),this.loader.cacheManager.bitmapFont.add(t.key,{data:u(e.data),texture:t.key,frame:null}),this.complete=!0}}});r.register("bitmapFont",(function(t,e,i,n,r){var s;if(Array.isArray(t))for(var o=0;o<t.length;o++)s=new c(this,t[o]),this.addFile(s.files);else s=new c(this,t,e,i,n,r),this.addFile(s.files);return this})),t.exports=c},60647:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){var r="css";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"script",cache:!1,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=document.createElement("style"),this.data.defer=!1,this.data.innerHTML=this.xhrLoader.responseText,document.head.appendChild(this.data),this.onProcessComplete()}});o.register("css",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},29608:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=i(86381),l=new n({Extends:s,initialize:function(t,e,i,n,r){var o="glsl";if(h(e)){var u=e;e=a(u,"key"),i=a(u,"url"),n=a(u,"shaderType","fragment"),r=a(u,"xhrSettings"),o=a(u,"extension",o)}else void 0===n&&(n="fragment");var l={type:"glsl",cache:t.cacheManager.shader,extension:o,responseType:"text",key:e,url:i,config:{shaderType:n},xhrSettings:r};s.call(this,t,l)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t=this.data.split("\n"),e=this.extractBlock(t,0);if(e)for(;e;){var i=this.getShaderName(e.header),n=this.getShaderType(e.header),r=this.getShaderUniforms(e.header),s=e.shader;if(this.cache.has(i)){var o=this.cache.get(i);"fragment"===n?o.fragmentSrc=s:o.vertexSrc=s,o.uniforms||(o.uniforms=r)}else"fragment"===n?this.cache.add(i,new u(i,s,"",r)):this.cache.add(i,new u(i,"",s,r));e=this.extractBlock(t,e.offset)}else"fragment"===this.config.shaderType?this.cache.add(this.key,new u(this.key,this.data)):this.cache.add(this.key,new u(this.key,"",this.data));this.pendingDestroy()},getShaderName:function(t){for(var e=0;e<t.length;e++){var i=t[e].trim();if("name:"===i.substring(0,5))return i.substring(5).trim()}return this.key},getShaderType:function(t){for(var e=0;e<t.length;e++){var i=t[e].trim();if("type:"===i.substring(0,5))return i.substring(5).trim()}return this.config.shaderType},getShaderUniforms:function(t){for(var e={},i=0;i<t.length;i++){var n=t[i].trim();if("uniform."===n.substring(0,8)){var r=n.indexOf(":");if(r){var s=n.substring(8,r);try{e[s]=JSON.parse(n.substring(r+1))}catch(t){console.warn("Invalid uniform JSON: "+s)}}}}return e},extractBlock:function(t,e){for(var i=-1,n=-1,r=-1,s=!1,o=!1,a=[],h=[],u=e;u<t.length;u++){var l=t[u].trim();if("---"===l)if(-1===i)i=u,s=!0;else{if(!s){o=!1;break}n=u,s=!1,o=!0}else s?a.push(l):o&&(h.push(l),r=u)}return s||-1===n?null:{header:a,shader:h.join("\n"),offset:r}}});o.register("glsl",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new l(this,t[r]));else this.addFile(new l(this,t,e,i,n));return this})),t.exports=l},43070:(t,e,i)=>{var n=i(47379),r=i(88275),s=i(21301),o=i(81769),a=i(1429),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){if(h(e)){var r=e;e=o(r,"key"),n=o(r,"config",n)}var a={type:"audio",cache:t.cacheManager.audio,extension:i.type,key:e,url:i.url,config:n};s.call(this,t,a),this.locked="ontouchstart"in window,this.loaded=!1,this.filesLoaded=0,this.filesTotal=0},onLoad:function(){this.loaded||(this.loaded=!0,this.loader.nextFile(this,!0))},onError:function(){for(var t=0;t<this.data.length;t++){var e=this.data[t];e.oncanplaythrough=null,e.onerror=null}this.loader.nextFile(this,!1)},onProgress:function(t){var e=t.target;e.oncanplaythrough=null,e.onerror=null,this.filesLoaded++,this.percentComplete=Math.min(this.filesLoaded/this.filesTotal,1),this.loader.emit(r.FILE_PROGRESS,this,this.percentComplete),this.filesLoaded===this.filesTotal&&this.onLoad()},load:function(){this.data=[];var t=this.config&&this.config.instances||1;this.filesTotal=t,this.filesLoaded=0,this.percentComplete=0;for(var e=0;e<t;e++){var i=new Audio;i.dataset||(i.dataset={}),i.dataset.name=this.key+("0"+e).slice(-2),i.dataset.used="false",this.locked?i.dataset.locked="true":(i.dataset.locked="false",i.preload="auto",i.oncanplaythrough=this.onProgress.bind(this),i.onerror=this.onError.bind(this)),this.data.push(i)}for(e=0;e<this.data.length;e++)(i=this.data[e]).src=a(this,this.loader.baseURL),this.locked||i.load();this.locked&&setTimeout(this.onLoad.bind(this))}});t.exports=u},1622:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){var r="html";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"text",cache:t.cacheManager.html,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()}});o.register("html",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},14964:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n,r,o){void 0===n&&(n=512),void 0===r&&(r=512);var u="html";if(h(e)){var l=e;e=a(l,"key"),i=a(l,"url"),o=a(l,"xhrSettings"),u=a(l,"extension",u),n=a(l,"width",n),r=a(l,"height",r)}var c={type:"html",cache:t.textureManager,extension:u,responseType:"text",key:e,url:i,xhrSettings:o,config:{width:n,height:r}};s.call(this,t,c)},onProcess:function(){this.state=r.FILE_PROCESSING;var t=this.config.width,e=this.config.height,i=[];i.push('<svg width="'+t+'px" height="'+e+'px" viewBox="0 0 '+t+" "+e+'" xmlns="http://www.w3.org/2000/svg">'),i.push('<foreignObject width="100%" height="100%">'),i.push('<body xmlns="http://www.w3.org/1999/xhtml">'),i.push(this.xhrLoader.responseText),i.push("</body>"),i.push("</foreignObject>"),i.push("</svg>");var n=[i.join("\n")],o=this;try{var a=new window.Blob(n,{type:"image/svg+xml;charset=utf-8"})}catch(t){return o.state=r.FILE_ERRORED,void o.onProcessComplete()}this.data=new Image,this.data.crossOrigin=this.crossOrigin,this.data.onload=function(){s.revokeObjectURL(o.data),o.onProcessComplete()},this.data.onerror=function(){s.revokeObjectURL(o.data),o.onProcessError()},s.createObjectURL(this.data,a,"image/svg+xml")},addToCache:function(){var t=this.cache.addImage(this.key,this.data);this.pendingDestroy(t)}});o.register("htmlTexture",(function(t,e,i,n,r){if(Array.isArray(t))for(var s=0;s<t.length;s++)this.addFile(new u(this,t[s]));else this.addFile(new u(this,t,e,i,n,r));return this})),t.exports=u},85458:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function t(e,i,n,r,o){var u,l="png";if(h(i)){var c=i;i=a(c,"key"),n=a(c,"url"),u=a(c,"normalMap"),r=a(c,"xhrSettings"),l=a(c,"extension",l),o=a(c,"frameConfig")}Array.isArray(n)&&(u=n[1],n=n[0]);var d={type:"image",cache:e.textureManager,extension:l,responseType:"blob",key:i,url:n,xhrSettings:r,config:o};if(s.call(this,e,d),u){var p=new t(e,this.key,u,r,o);p.type="normalMap",this.setLink(p),e.addFile(p)}},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=new Image,this.data.crossOrigin=this.crossOrigin;var t=this;this.data.onload=function(){s.revokeObjectURL(t.data),t.onProcessComplete()},this.data.onerror=function(){s.revokeObjectURL(t.data),t.onProcessError()},s.createObjectURL(this.data,this.xhrLoader.response,"image/png")},addToCache:function(){var t,e=this.linkFile;e&&e.state===r.FILE_COMPLETE?(t="image"===this.type?this.cache.addImage(this.key,this.data,e.data):this.cache.addImage(e.key,e.data,this.data),this.pendingDestroy(t),e.pendingDestroy(t)):e||(t=this.cache.addImage(this.key,this.data),this.pendingDestroy(t))}});o.register("image",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},22102:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(86652),u=i(28621),l=new n({Extends:s,initialize:function(t,e,i,n,o){var l="json";if(u(e)){var c=e;e=a(c,"key"),i=a(c,"url"),n=a(c,"xhrSettings"),l=a(c,"extension",l),o=a(c,"dataKey",o)}var d={type:"json",cache:t.cacheManager.json,extension:l,responseType:"text",key:e,url:i,xhrSettings:n,config:o};s.call(this,t,d),u(i)&&(this.data=o?h(i,o):i,this.state=r.FILE_POPULATED)},onProcess:function(){if(this.state!==r.FILE_POPULATED){this.state=r.FILE_PROCESSING;var t=JSON.parse(this.xhrLoader.responseText),e=this.config;this.data="string"==typeof e?h(t,e,t):t}this.onProcessComplete()}});o.register("json",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new l(this,t[r]));else this.addFile(new l(this,t,e,n,i));return this})),t.exports=l},27467:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(85458),a=i(28621),h=i(22102),u=i(11611),l=new n({Extends:u,initialize:function(t,e,i,n,r,o,l){if(a(e)){var c=e;e=s(c,"key"),i=s(c,"url",!1)?s(c,"url"):s(c,"atlasURL"),o=s(c,"xhrSettings"),n=s(c,"path"),r=s(c,"baseURL"),l=s(c,"textureXhrSettings")}var d=new h(t,e,i,o);u.call(this,t,"multiatlas",e,[d]),this.config.path=n,this.config.baseURL=r,this.config.textureXhrSettings=l},onFileComplete:function(t){if(-1!==this.files.indexOf(t)&&(this.pending--,"json"===t.type&&t.data.hasOwnProperty("textures"))){var e=t.data.textures,i=this.config,n=this.loader,r=n.baseURL,a=n.path,h=n.prefix,u=s(i,"baseURL",this.baseURL),l=s(i,"path",this.path),c=s(i,"prefix",this.prefix),d=s(i,"textureXhrSettings");n.setBaseURL(u),n.setPath(l),n.setPrefix(c);for(var p=0;p<e.length;p++){var f=e[p].image,m="MA"+this.multiKeyIndex+"_"+f,v=new o(n,m,f,d);if(this.addToMultiFile(v),n.addFile(v),e[p].normalMap){var g=new o(n,m,e[p].normalMap,d);g.type="normalMap",v.setLink(g),this.addToMultiFile(g),n.addFile(g)}}n.setBaseURL(r),n.setPath(a),n.setPrefix(h)}},addToCache:function(){if(this.isReadyToProcess()){for(var t=this.files[0],e=[],i=[],n=[],r=1;r<this.files.length;r++){var s=this.files[r];if("normalMap"!==s.type)for(var o=s.key.indexOf("_"),a=s.key.substr(o+1),h=s.data,u=0;u<t.data.textures.length;u++){var l=t.data.textures[u];if(l.image===a){i.push(h),e.push(l),s.linkFile&&n.push(s.linkFile.data);break}}}for(0===n.length&&(n=void 0),this.loader.textureManager.addAtlasJSONArray(this.key,i,e,n),this.complete=!0,r=0;r<this.files.length;r++)this.files[r].pendingDestroy()}}});r.register("multiatlas",(function(t,e,i,n,r){var s;if(Array.isArray(t))for(var o=0;o<t.length;o++)s=new l(this,t[o]),this.addFile(s.files);else s=new l(this,t,e,i,n,r),this.addFile(s.files);return this})),t.exports=l},49023:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(28621),a=i(11611),h=i(52378),u=new n({Extends:a,initialize:function(t,e,i,n){var r="js",u=[];if(o(e)){var l=e;e=s(l,"key"),i=s(l,"url"),n=s(l,"xhrSettings"),r=s(l,"extension",r)}Array.isArray(i)||(i=[i]);for(var c=0;c<i.length;c++){var d=new h(t,{key:e+"_"+c.toString(),url:i[c],extension:r,xhrSettings:n});d.onProcess=function(){this.onProcessComplete()},u.push(d)}a.call(this,t,"scripts",e,u)},addToCache:function(){if(this.isReadyToProcess()){for(var t=0;t<this.files.length;t++){var e=this.files[t];e.data=document.createElement("script"),e.data.language="javascript",e.data.type="text/javascript",e.data.defer=!1,e.data.text=e.xhrLoader.responseText,document.head.appendChild(e.data)}this.complete=!0}}});r.register("scripts",(function(t,e,i){var n;if(Array.isArray(t))for(var r=0;r<t.length;r++)n=new u(this,t[r]),this.addFile(n.files);else n=new u(this,t,e,i),this.addFile(n.files);return this})),t.exports=u},84975:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(16656),o=i(22102),a=new n({Extends:o,initialize:function(t,e,i,n,r){o.call(this,t,e,i,n,r),this.type="packfile"},onProcess:function(){this.state!==r.FILE_POPULATED&&(this.state=r.FILE_PROCESSING,this.data=JSON.parse(this.xhrLoader.responseText)),this.loader.addPack(this.data,this.config),this.onProcessComplete()}});s.register("pack",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new a(this,t[r]));else this.addFile(new a(this,t,e,n,i));return this})),t.exports=a},34665:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n,o,u){var l="js";if(h(e)){var c=e;e=a(c,"key"),i=a(c,"url"),u=a(c,"xhrSettings"),l=a(c,"extension",l),n=a(c,"start"),o=a(c,"mapping")}var d={type:"plugin",cache:!1,extension:l,responseType:"text",key:e,url:i,xhrSettings:u,config:{start:n,mapping:o}};s.call(this,t,d),"function"==typeof i&&(this.data=i,this.state=r.FILE_POPULATED)},onProcess:function(){var t=this.loader.systems.plugins,e=this.config,i=a(e,"start",!1),n=a(e,"mapping",null);if(this.state===r.FILE_POPULATED)t.install(this.key,this.data,i,n);else{this.state=r.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data);var s=t.install(this.key,window[this.key],i,n);(i||n)&&(this.loader.systems[n]=s,this.loader.scene[n]=s)}this.onProcessComplete()}});o.register("plugin",(function(t,e,i,n,r){if(Array.isArray(t))for(var s=0;s<t.length;s++)this.addFile(new u(this,t[s]));else this.addFile(new u(this,t,e,i,n,r));return this})),t.exports=u},13081:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n,r){var o="svg";if(h(e)){var u=e;e=a(u,"key"),i=a(u,"url"),n=a(u,"svgConfig",{}),r=a(u,"xhrSettings"),o=a(u,"extension",o)}var l={type:"svg",cache:t.textureManager,extension:o,responseType:"text",key:e,url:i,xhrSettings:r,config:{width:a(n,"width"),height:a(n,"height"),scale:a(n,"scale")}};s.call(this,t,l)},onProcess:function(){this.state=r.FILE_PROCESSING;var t=this.xhrLoader.responseText,e=[t],i=this.config.width,n=this.config.height,o=this.config.scale;t:if(i&&n||o){var a=(new DOMParser).parseFromString(t,"text/xml").getElementsByTagName("svg")[0],h=a.hasAttribute("viewBox"),u=parseFloat(a.getAttribute("width")),l=parseFloat(a.getAttribute("height"));if(!h&&u&&l)a.setAttribute("viewBox","0 0 "+u+" "+l);else if(h&&!u&&!l){var c=a.getAttribute("viewBox").split(/\s+|,/);u=c[2],l=c[3]}if(o){if(!u||!l)break t;i=u*o,n=l*o}a.setAttribute("width",i.toString()+"px"),a.setAttribute("height",n.toString()+"px"),e=[(new XMLSerializer).serializeToString(a)]}try{var d=new window.Blob(e,{type:"image/svg+xml;charset=utf-8"})}catch(t){return void this.onProcessError()}this.data=new Image,this.data.crossOrigin=this.crossOrigin;var p=this,f=!1;this.data.onload=function(){f||s.revokeObjectURL(p.data),p.onProcessComplete()},this.data.onerror=function(){f?p.onProcessError():(f=!0,s.revokeObjectURL(p.data),p.data.src="data:image/svg+xml,"+encodeURIComponent(e.join("")))},s.createObjectURL(this.data,d,"image/svg+xml")},addToCache:function(){var t=this.cache.addImage(this.key,this.data);this.pendingDestroy(t)}});o.register("svg",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new u(this,t[r]));else this.addFile(new u(this,t,e,i,n));return this})),t.exports=u},47398:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){var r="js";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"text",cache:t.cacheManager.text,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t=this.data.concat("(function(){\nreturn new "+this.key+"();\n}).call(this);"),e=eval;this.loader.sceneManager.add(this.key,e(t)),this.complete=!0}});o.register("sceneFile",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},85762:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n,o,u){var l="js";if(h(e)){var c=e;e=a(c,"key"),i=a(c,"url"),u=a(c,"xhrSettings"),l=a(c,"extension",l),n=a(c,"systemKey"),o=a(c,"sceneKey")}var d={type:"scenePlugin",cache:!1,extension:l,responseType:"text",key:e,url:i,xhrSettings:u,config:{systemKey:n,sceneKey:o}};s.call(this,t,d),"function"==typeof i&&(this.data=i,this.state=r.FILE_POPULATED)},onProcess:function(){var t=this.loader.systems.plugins,e=this.config,i=this.key,n=a(e,"systemKey",i),s=a(e,"sceneKey",i);this.state===r.FILE_POPULATED?t.installScenePlugin(n,this.data,s,this.loader.scene,!0):(this.state=r.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data),t.installScenePlugin(n,window[this.key],s,this.loader.scene,!0)),this.onProcessComplete()}});o.register("scenePlugin",(function(t,e,i,n,r){if(Array.isArray(t))for(var s=0;s<t.length;s++)this.addFile(new u(this,t[s]));else this.addFile(new u(this,t,e,i,n,r));return this})),t.exports=u},52378:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){var r="js";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"script",cache:!1,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=document.createElement("script"),this.data.language="javascript",this.data.type="text/javascript",this.data.defer=!1,this.data.text=this.xhrLoader.responseText,document.head.appendChild(this.data),this.onProcessComplete()}});o.register("script",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},10108:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(85458),o=new n({Extends:s,initialize:function(t,e,i,n,r){s.call(this,t,e,i,r,n),this.type="spritesheet"},addToCache:function(){var t=this.cache.addSpriteSheet(this.key,this.data,this.config);this.pendingDestroy(t)}});r.register("spritesheet",(function(t,e,i,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)this.addFile(new o(this,t[r]));else this.addFile(new o(this,t,e,i,n));return this})),t.exports=o},39517:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=new n({Extends:s,initialize:function(t,e,i,n){var r="txt";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"text",cache:t.cacheManager.text,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()}});o.register("text",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new u(this,t[n]));else this.addFile(new u(this,t,e,i));return this})),t.exports=u},88553:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=i(16092),l=new n({Extends:s,initialize:function(t,e,i,n){var r="csv";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var l={type:"tilemapCSV",cache:t.cacheManager.tilemap,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,l),this.tilemapFormat=u.CSV},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=this.xhrLoader.responseText,this.onProcessComplete()},addToCache:function(){var t={format:this.tilemapFormat,data:this.data};this.cache.add(this.key,t),this.pendingDestroy(t)}});o.register("tilemapCSV",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new l(this,t[n]));else this.addFile(new l(this,t,e,i));return this})),t.exports=l},78704:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(22102),o=i(16092),a=new n({Extends:s,initialize:function(t,e,i,n){s.call(this,t,e,i,n),this.type="tilemapJSON",this.cache=t.cacheManager.tilemap},addToCache:function(){var t={format:o.WELTMEISTER,data:this.data};this.cache.add(this.key,t),this.pendingDestroy(t)}});r.register("tilemapImpact",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new a(this,t[n]));else this.addFile(new a(this,t,e,i));return this})),t.exports=a},9435:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(22102),o=i(16092),a=new n({Extends:s,initialize:function(t,e,i,n){s.call(this,t,e,i,n),this.type="tilemapJSON",this.cache=t.cacheManager.tilemap},addToCache:function(){var t={format:o.TILED_JSON,data:this.data};this.cache.add(this.key,t),this.pendingDestroy(t)}});r.register("tilemapTiledJSON",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new a(this,t[n]));else this.addFile(new a(this,t,e,i));return this})),t.exports=a},78221:(t,e,i)=>{var n=i(47379),r=i(16656),s=i(81769),o=i(85458),a=i(28621),h=i(11611),u=i(39517),l=new n({Extends:h,initialize:function(t,e,i,n,r,l){var c,d;if(a(e)){var p=e;e=s(p,"key"),c=new o(t,{key:e,url:s(p,"textureURL"),extension:s(p,"textureExtension","png"),normalMap:s(p,"normalMap"),xhrSettings:s(p,"textureXhrSettings")}),d=new u(t,{key:e,url:s(p,"atlasURL"),extension:s(p,"atlasExtension","txt"),xhrSettings:s(p,"atlasXhrSettings")})}else c=new o(t,e,i,r),d=new u(t,e,n,l);c.linkFile?h.call(this,t,"unityatlas",e,[c,d,c.linkFile]):h.call(this,t,"unityatlas",e,[c,d])},addToCache:function(){if(this.isReadyToProcess()){var t=this.files[0],e=this.files[1],i=this.files[2]?this.files[2].data:null;this.loader.textureManager.addUnityAtlas(t.key,t.data,e.data,i),e.addToCache(),this.complete=!0}}});r.register("unityAtlas",(function(t,e,i,n,r){var s;if(Array.isArray(t))for(var o=0;o<t.length;o++)s=new l(this,t[o]),this.addFile(s.files);else s=new l(this,t,e,i,n,r),this.addFile(s.files);return this})),t.exports=l},72845:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(1429),h=i(81769),u=i(28621),l=new n({Extends:s,initialize:function(t,e,i,n,r,o,a){void 0===n&&(n="loadeddata"),void 0===r&&(r=!1),void 0===o&&(o=!1),"loadeddata"!==n&&"canplay"!==n&&"canplaythrough"!==n&&(n="loadeddata");var h={type:"video",cache:t.cacheManager.video,extension:i.type,responseType:"blob",key:e,url:i.url,xhrSettings:a,config:{loadEvent:n,asBlob:r,noAudio:o}};this.onLoadCallback=this.onVideoLoadHandler.bind(this),this.onErrorCallback=this.onVideoErrorHandler.bind(this),s.call(this,t,h)},onProcess:function(){if(this.state=r.FILE_PROCESSING,this.config.asBlob){var t=this.createVideoElement();this.data=t;var e=this;this.data.onloadeddata=function(){e.onProcessComplete()},this.data.onerror=function(){s.revokeObjectURL(e.data),e.onProcessError()},s.createObjectURL(t,this.xhrLoader.response,""),t.load()}else this.onProcessComplete()},createVideoElement:function(){var t=document.createElement("video");return t.controls=!1,t.crossOrigin=this.loader.crossOrigin,this.config.noAudio&&(t.muted=!0,t.defaultMuted=!0,t.setAttribute("autoplay","autoplay")),t.setAttribute("playsinline","playsinline"),t.setAttribute("preload","auto"),t},onVideoLoadHandler:function(t){var e=t.target;e.removeEventListener(this.config.loadEvent,this.onLoadCallback,!0),e.removeEventListener("error",this.onErrorCallback,!0),this.data=e,this.resetXHR(),this.loader.nextFile(this,!0)},onVideoErrorHandler:function(t){var e=t.target;e&&(e.removeEventListener(this.config.loadEvent,this.onLoadCallback,!0),e.removeEventListener("error",this.onErrorCallback,!0)),this.resetXHR(),this.loader.nextFile(this,!1)},load:function(){var t=this.config.loadEvent;if(this.config.asBlob)s.prototype.load.call(this);else{this.percentComplete=0;var e=this.createVideoElement();e.addEventListener(t,this.onLoadCallback,!0),e.addEventListener("error",this.onErrorCallback,!0),e.src=a(this,this.loader.baseURL),e.load()}}});l.create=function(t,e,i,n,r,s,o){var a=t.systems.game;u(e)&&(i=h(e,"url",[]),n=h(e,"loadEvent","loadeddata"),r=h(e,"asBlob",!1),s=h(e,"noAudio",!1),o=h(e,"xhrSettings"));var c=l.getVideoURL(a,i);if(c)return new l(t,e,c,n,r,s,o)},l.getVideoURL=function(t,e){Array.isArray(e)||(e=[e]);for(var i=0;i<e.length;i++){var n,r=h(e[i],"url",e[i]);if(0===r.indexOf("blob:"))return{url:r,type:""};if(n=0===r.indexOf("data:")?r.split(",")[0].match(/\/(.*?);/):r.match(/\.([a-zA-Z0-9]+)($|\?)/),n=h(e[i],"type",n?n[1]:"").toLowerCase(),t.device.video[n])return{url:r,type:n}}return null},o.register("video",(function(t,e,i,n,r,s){var o;if(Array.isArray(t))for(var a=0;a<t.length;a++)(o=l.create(this,t[a]))&&this.addFile(o);else(o=l.create(this,t,e,i,n,r,s))&&this.addFile(o);return this})),t.exports=l},56126:(t,e,i)=>{var n=i(47379),r=i(78146),s=i(21301),o=i(16656),a=i(81769),h=i(28621),u=i(78403),l=new n({Extends:s,initialize:function(t,e,i,n){var r="xml";if(h(e)){var o=e;e=a(o,"key"),i=a(o,"url"),n=a(o,"xhrSettings"),r=a(o,"extension",r)}var u={type:"xml",cache:t.cacheManager.xml,extension:r,responseType:"text",key:e,url:i,xhrSettings:n};s.call(this,t,u)},onProcess:function(){this.state=r.FILE_PROCESSING,this.data=u(this.xhrLoader.responseText),this.data?this.onProcessComplete():(console.warn("Invalid XMLFile: "+this.key),this.onProcessError())}});o.register("xml",(function(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)this.addFile(new l(this,t[n]));else this.addFile(new l(this,t,e,i));return this})),t.exports=l},91291:(t,e,i)=>{t.exports={AnimationJSONFile:i(28955),AtlasJSONFile:i(5084),AtlasXMLFile:i(44468),AudioFile:i(92500),AudioSpriteFile:i(33714),BinaryFile:i(19132),BitmapFontFile:i(70589),CSSFile:i(60647),GLSLFile:i(29608),HTML5AudioFile:i(43070),HTMLFile:i(1622),HTMLTextureFile:i(14964),ImageFile:i(85458),JSONFile:i(22102),MultiAtlasFile:i(27467),MultiScriptFile:i(49023),PackFile:i(84975),PluginFile:i(34665),SceneFile:i(47398),ScenePluginFile:i(85762),ScriptFile:i(52378),SpriteSheetFile:i(10108),SVGFile:i(13081),TextFile:i(39517),TilemapCSVFile:i(88553),TilemapImpactFile:i(78704),TilemapJSONFile:i(9435),UnityAtlasFile:i(78221),VideoFile:i(72845),XMLFile:i(56126)}},42430:(t,e,i)=>{var n=i(78146),r=i(80933),s={Events:i(88275),FileTypes:i(91291),File:i(21301),FileTypesManager:i(16656),GetURL:i(1429),LoaderPlugin:i(91315),MergeXHRSettings:i(36404),MultiFile:i(11611),XHRLoader:i(13872),XHRSettings:i(20270)};s=r(!1,s,n),t.exports=s},44962:t=>{t.exports=function(t){for(var e=0,i=0;i<t.length;i++)e+=+t[i];return e/t.length}},70890:(t,e,i)=>{var n=i(3211);t.exports=function(t,e){return n(t)/n(e)/n(t-e)}},67630:t=>{t.exports=function(t,e){return Math.floor(Math.random()*(e-t+1)+t)}},21934:t=>{t.exports=function(t,e,i,n,r){var s=.5*(n-e),o=.5*(r-i),a=t*t;return(2*i-2*n+s+o)*(t*a)+(-3*i+3*n-2*s-o)*a+s*t+i}},74018:t=>{t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=10);var n=Math.pow(i,-e);return Math.ceil(t*n)/n}},90487:t=>{t.exports=function(t,e,i){return Math.max(e,Math.min(i,t))}},98436:(t,e,i)=>{var n=i(14302);t.exports=function(t){return t*n.DEG_TO_RAD}},60669:t=>{t.exports=function(t,e){return Math.abs(t-e)}},3211:t=>{t.exports=function(t){if(0===t)return 1;for(var e=t;--t;)e*=t;return e}},31657:t=>{t.exports=function(t,e){return Math.random()*(e-t)+t}},51228:t=>{t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=10);var n=Math.pow(i,-e);return Math.floor(t*n)/n}},96210:(t,e,i)=>{var n=i(90487);t.exports=function(t,e,i){return(i-e)*(t=n(t,0,1))}},89478:t=>{t.exports=function(t,e){return t/e/1e3}},67781:t=>{t.exports=function(t){return t==parseFloat(t)?!(t%2):void 0}},60602:t=>{t.exports=function(t){return t===parseFloat(t)?!(t%2):void 0}},57459:t=>{t.exports=function(t,e,i){return(e-t)*i+t}},45201:(t,e,i)=>{var n=new(i(47379))({initialize:function(t){this.val=new Float32Array(9),t?this.copy(t):this.identity()},clone:function(){return new n(this)},set:function(t){return this.copy(t)},copy:function(t){var e=this.val,i=t.val;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this},fromMat4:function(t){var e=t.val,i=this.val;return i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[4],i[4]=e[5],i[5]=e[6],i[6]=e[8],i[7]=e[9],i[8]=e[10],this},fromArray:function(t){var e=this.val;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],this},identity:function(){var t=this.val;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,this},transpose:function(){var t=this.val,e=t[1],i=t[2],n=t[5];return t[1]=t[3],t[2]=t[6],t[3]=e,t[5]=t[7],t[6]=i,t[7]=n,this},invert:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8],l=u*s-o*h,c=-u*r+o*a,d=h*r-s*a,p=e*l+i*c+n*d;return p?(p=1/p,t[0]=l*p,t[1]=(-u*i+n*h)*p,t[2]=(o*i-n*s)*p,t[3]=c*p,t[4]=(u*e-n*a)*p,t[5]=(-o*e+n*r)*p,t[6]=d*p,t[7]=(-h*e+i*a)*p,t[8]=(s*e-i*r)*p,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8];return t[0]=s*u-o*h,t[1]=n*h-i*u,t[2]=i*o-n*s,t[3]=o*a-r*u,t[4]=e*u-n*a,t[5]=n*r-e*o,t[6]=r*h-s*a,t[7]=i*a-e*h,t[8]=e*s-i*r,this},determinant:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8];return e*(u*s-o*h)+i*(-u*r+o*a)+n*(h*r-s*a)},multiply:function(t){var e=this.val,i=e[0],n=e[1],r=e[2],s=e[3],o=e[4],a=e[5],h=e[6],u=e[7],l=e[8],c=t.val,d=c[0],p=c[1],f=c[2],m=c[3],v=c[4],g=c[5],y=c[6],_=c[7],x=c[8];return e[0]=d*i+p*s+f*h,e[1]=d*n+p*o+f*u,e[2]=d*r+p*a+f*l,e[3]=m*i+v*s+g*h,e[4]=m*n+v*o+g*u,e[5]=m*r+v*a+g*l,e[6]=y*i+_*s+x*h,e[7]=y*n+_*o+x*u,e[8]=y*r+_*a+x*l,this},translate:function(t){var e=this.val,i=t.x,n=t.y;return e[6]=i*e[0]+n*e[3]+e[6],e[7]=i*e[1]+n*e[4]+e[7],e[8]=i*e[2]+n*e[5]+e[8],this},rotate:function(t){var e=this.val,i=e[0],n=e[1],r=e[2],s=e[3],o=e[4],a=e[5],h=Math.sin(t),u=Math.cos(t);return e[0]=u*i+h*s,e[1]=u*n+h*o,e[2]=u*r+h*a,e[3]=u*s-h*i,e[4]=u*o-h*n,e[5]=u*a-h*r,this},scale:function(t){var e=this.val,i=t.x,n=t.y;return e[0]=i*e[0],e[1]=i*e[1],e[2]=i*e[2],e[3]=n*e[3],e[4]=n*e[4],e[5]=n*e[5],this},fromQuat:function(t){var e=t.x,i=t.y,n=t.z,r=t.w,s=e+e,o=i+i,a=n+n,h=e*s,u=e*o,l=e*a,c=i*o,d=i*a,p=n*a,f=r*s,m=r*o,v=r*a,g=this.val;return g[0]=1-(c+p),g[3]=u+v,g[6]=l-m,g[1]=u-v,g[4]=1-(h+p),g[7]=d+f,g[2]=l+m,g[5]=d-f,g[8]=1-(h+c),this},normalFromMat4:function(t){var e=t.val,i=this.val,n=e[0],r=e[1],s=e[2],o=e[3],a=e[4],h=e[5],u=e[6],l=e[7],c=e[8],d=e[9],p=e[10],f=e[11],m=e[12],v=e[13],g=e[14],y=e[15],_=n*h-r*a,x=n*u-s*a,b=n*l-o*a,w=r*u-s*h,T=r*l-o*h,M=s*l-o*u,S=c*v-d*m,E=c*g-p*m,L=c*y-f*m,A=d*g-p*v,D=d*y-f*v,P=p*y-f*g,C=_*P-x*D+b*A+w*L-T*E+M*S;return C?(C=1/C,i[0]=(h*P-u*D+l*A)*C,i[1]=(u*L-a*P-l*E)*C,i[2]=(a*D-h*L+l*S)*C,i[3]=(s*D-r*P-o*A)*C,i[4]=(n*P-s*L+o*E)*C,i[5]=(r*L-n*D-o*S)*C,i[6]=(v*M-g*T+y*w)*C,i[7]=(g*b-m*M-y*x)*C,i[8]=(m*T-v*b+y*_)*C,this):null}});t.exports=n},27314:(t,e,i)=>{var n=i(47379),r=1e-6,s=new n({initialize:function(t){this.val=new Float32Array(16),t?this.copy(t):this.identity()},clone:function(){return new s(this)},set:function(t){return this.copy(t)},copy:function(t){var e=this.val,i=t.val;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this},fromArray:function(t){var e=this.val;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],this},zero:function(){var t=this.val;return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=0,this},xyz:function(t,e,i){this.identity();var n=this.val;return n[12]=t,n[13]=e,n[14]=i,this},scaling:function(t,e,i){this.zero();var n=this.val;return n[0]=t,n[5]=e,n[10]=i,n[15]=1,this},identity:function(){var t=this.val;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this},transpose:function(){var t=this.val,e=t[1],i=t[2],n=t[3],r=t[6],s=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=e,t[6]=t[9],t[7]=t[13],t[8]=i,t[9]=r,t[11]=t[14],t[12]=n,t[13]=s,t[14]=o,this},invert:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8],l=t[9],c=t[10],d=t[11],p=t[12],f=t[13],m=t[14],v=t[15],g=e*o-i*s,y=e*a-n*s,_=e*h-r*s,x=i*a-n*o,b=i*h-r*o,w=n*h-r*a,T=u*f-l*p,M=u*m-c*p,S=u*v-d*p,E=l*m-c*f,L=l*v-d*f,A=c*v-d*m,D=g*A-y*L+_*E+x*S-b*M+w*T;return D?(D=1/D,t[0]=(o*A-a*L+h*E)*D,t[1]=(n*L-i*A-r*E)*D,t[2]=(f*w-m*b+v*x)*D,t[3]=(c*b-l*w-d*x)*D,t[4]=(a*S-s*A-h*M)*D,t[5]=(e*A-n*S+r*M)*D,t[6]=(m*_-p*w-v*y)*D,t[7]=(u*w-c*_+d*y)*D,t[8]=(s*L-o*S+h*T)*D,t[9]=(i*S-e*L-r*T)*D,t[10]=(p*b-f*_+v*g)*D,t[11]=(l*_-u*b-d*g)*D,t[12]=(o*M-s*E-a*T)*D,t[13]=(e*E-i*M+n*T)*D,t[14]=(f*y-p*x-m*g)*D,t[15]=(u*x-l*y+c*g)*D,this):null},adjoint:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8],l=t[9],c=t[10],d=t[11],p=t[12],f=t[13],m=t[14],v=t[15];return t[0]=o*(c*v-d*m)-l*(a*v-h*m)+f*(a*d-h*c),t[1]=-(i*(c*v-d*m)-l*(n*v-r*m)+f*(n*d-r*c)),t[2]=i*(a*v-h*m)-o*(n*v-r*m)+f*(n*h-r*a),t[3]=-(i*(a*d-h*c)-o*(n*d-r*c)+l*(n*h-r*a)),t[4]=-(s*(c*v-d*m)-u*(a*v-h*m)+p*(a*d-h*c)),t[5]=e*(c*v-d*m)-u*(n*v-r*m)+p*(n*d-r*c),t[6]=-(e*(a*v-h*m)-s*(n*v-r*m)+p*(n*h-r*a)),t[7]=e*(a*d-h*c)-s*(n*d-r*c)+u*(n*h-r*a),t[8]=s*(l*v-d*f)-u*(o*v-h*f)+p*(o*d-h*l),t[9]=-(e*(l*v-d*f)-u*(i*v-r*f)+p*(i*d-r*l)),t[10]=e*(o*v-h*f)-s*(i*v-r*f)+p*(i*h-r*o),t[11]=-(e*(o*d-h*l)-s*(i*d-r*l)+u*(i*h-r*o)),t[12]=-(s*(l*m-c*f)-u*(o*m-a*f)+p*(o*c-a*l)),t[13]=e*(l*m-c*f)-u*(i*m-n*f)+p*(i*c-n*l),t[14]=-(e*(o*m-a*f)-s*(i*m-n*f)+p*(i*a-n*o)),t[15]=e*(o*c-a*l)-s*(i*c-n*l)+u*(i*a-n*o),this},determinant:function(){var t=this.val,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8],l=t[9],c=t[10],d=t[11],p=t[12],f=t[13],m=t[14],v=t[15];return(e*o-i*s)*(c*v-d*m)-(e*a-n*s)*(l*v-d*f)+(e*h-r*s)*(l*m-c*f)+(i*a-n*o)*(u*v-d*p)-(i*h-r*o)*(u*m-c*p)+(n*h-r*a)*(u*f-l*p)},multiply:function(t){var e=this.val,i=e[0],n=e[1],r=e[2],s=e[3],o=e[4],a=e[5],h=e[6],u=e[7],l=e[8],c=e[9],d=e[10],p=e[11],f=e[12],m=e[13],v=e[14],g=e[15],y=t.val,_=y[0],x=y[1],b=y[2],w=y[3];return e[0]=_*i+x*o+b*l+w*f,e[1]=_*n+x*a+b*c+w*m,e[2]=_*r+x*h+b*d+w*v,e[3]=_*s+x*u+b*p+w*g,_=y[4],x=y[5],b=y[6],w=y[7],e[4]=_*i+x*o+b*l+w*f,e[5]=_*n+x*a+b*c+w*m,e[6]=_*r+x*h+b*d+w*v,e[7]=_*s+x*u+b*p+w*g,_=y[8],x=y[9],b=y[10],w=y[11],e[8]=_*i+x*o+b*l+w*f,e[9]=_*n+x*a+b*c+w*m,e[10]=_*r+x*h+b*d+w*v,e[11]=_*s+x*u+b*p+w*g,_=y[12],x=y[13],b=y[14],w=y[15],e[12]=_*i+x*o+b*l+w*f,e[13]=_*n+x*a+b*c+w*m,e[14]=_*r+x*h+b*d+w*v,e[15]=_*s+x*u+b*p+w*g,this},multiplyLocal:function(t){var e=[],i=this.val,n=t.val;return e[0]=i[0]*n[0]+i[1]*n[4]+i[2]*n[8]+i[3]*n[12],e[1]=i[0]*n[1]+i[1]*n[5]+i[2]*n[9]+i[3]*n[13],e[2]=i[0]*n[2]+i[1]*n[6]+i[2]*n[10]+i[3]*n[14],e[3]=i[0]*n[3]+i[1]*n[7]+i[2]*n[11]+i[3]*n[15],e[4]=i[4]*n[0]+i[5]*n[4]+i[6]*n[8]+i[7]*n[12],e[5]=i[4]*n[1]+i[5]*n[5]+i[6]*n[9]+i[7]*n[13],e[6]=i[4]*n[2]+i[5]*n[6]+i[6]*n[10]+i[7]*n[14],e[7]=i[4]*n[3]+i[5]*n[7]+i[6]*n[11]+i[7]*n[15],e[8]=i[8]*n[0]+i[9]*n[4]+i[10]*n[8]+i[11]*n[12],e[9]=i[8]*n[1]+i[9]*n[5]+i[10]*n[9]+i[11]*n[13],e[10]=i[8]*n[2]+i[9]*n[6]+i[10]*n[10]+i[11]*n[14],e[11]=i[8]*n[3]+i[9]*n[7]+i[10]*n[11]+i[11]*n[15],e[12]=i[12]*n[0]+i[13]*n[4]+i[14]*n[8]+i[15]*n[12],e[13]=i[12]*n[1]+i[13]*n[5]+i[14]*n[9]+i[15]*n[13],e[14]=i[12]*n[2]+i[13]*n[6]+i[14]*n[10]+i[15]*n[14],e[15]=i[12]*n[3]+i[13]*n[7]+i[14]*n[11]+i[15]*n[15],this.fromArray(e)},translate:function(t){var e=t.x,i=t.y,n=t.z,r=this.val;return r[12]=r[0]*e+r[4]*i+r[8]*n+r[12],r[13]=r[1]*e+r[5]*i+r[9]*n+r[13],r[14]=r[2]*e+r[6]*i+r[10]*n+r[14],r[15]=r[3]*e+r[7]*i+r[11]*n+r[15],this},translateXYZ:function(t,e,i){var n=this.val;return n[12]=n[0]*t+n[4]*e+n[8]*i+n[12],n[13]=n[1]*t+n[5]*e+n[9]*i+n[13],n[14]=n[2]*t+n[6]*e+n[10]*i+n[14],n[15]=n[3]*t+n[7]*e+n[11]*i+n[15],this},scale:function(t){var e=t.x,i=t.y,n=t.z,r=this.val;return r[0]=r[0]*e,r[1]=r[1]*e,r[2]=r[2]*e,r[3]=r[3]*e,r[4]=r[4]*i,r[5]=r[5]*i,r[6]=r[6]*i,r[7]=r[7]*i,r[8]=r[8]*n,r[9]=r[9]*n,r[10]=r[10]*n,r[11]=r[11]*n,this},scaleXYZ:function(t,e,i){var n=this.val;return n[0]=n[0]*t,n[1]=n[1]*t,n[2]=n[2]*t,n[3]=n[3]*t,n[4]=n[4]*e,n[5]=n[5]*e,n[6]=n[6]*e,n[7]=n[7]*e,n[8]=n[8]*i,n[9]=n[9]*i,n[10]=n[10]*i,n[11]=n[11]*i,this},makeRotationAxis:function(t,e){var i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,o=t.y,a=t.z,h=r*s,u=r*o;return this.fromArray([h*s+i,h*o-n*a,h*a+n*o,0,h*o+n*a,u*o+i,u*a-n*s,0,h*a-n*o,u*a+n*s,r*a*a+i,0,0,0,0,1]),this},rotate:function(t,e){var i=this.val,n=e.x,s=e.y,o=e.z,a=Math.sqrt(n*n+s*s+o*o);if(Math.abs(a)<r)return null;n*=a=1/a,s*=a,o*=a;var h=Math.sin(t),u=Math.cos(t),l=1-u,c=i[0],d=i[1],p=i[2],f=i[3],m=i[4],v=i[5],g=i[6],y=i[7],_=i[8],x=i[9],b=i[10],w=i[11],T=n*n*l+u,M=s*n*l+o*h,S=o*n*l-s*h,E=n*s*l-o*h,L=s*s*l+u,A=o*s*l+n*h,D=n*o*l+s*h,P=s*o*l-n*h,C=o*o*l+u;return i[0]=c*T+m*M+_*S,i[1]=d*T+v*M+x*S,i[2]=p*T+g*M+b*S,i[3]=f*T+y*M+w*S,i[4]=c*E+m*L+_*A,i[5]=d*E+v*L+x*A,i[6]=p*E+g*L+b*A,i[7]=f*E+y*L+w*A,i[8]=c*D+m*P+_*C,i[9]=d*D+v*P+x*C,i[10]=p*D+g*P+b*C,i[11]=f*D+y*P+w*C,this},rotateX:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),r=e[4],s=e[5],o=e[6],a=e[7],h=e[8],u=e[9],l=e[10],c=e[11];return e[4]=r*n+h*i,e[5]=s*n+u*i,e[6]=o*n+l*i,e[7]=a*n+c*i,e[8]=h*n-r*i,e[9]=u*n-s*i,e[10]=l*n-o*i,e[11]=c*n-a*i,this},rotateY:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[8],u=e[9],l=e[10],c=e[11];return e[0]=r*n-h*i,e[1]=s*n-u*i,e[2]=o*n-l*i,e[3]=a*n-c*i,e[8]=r*i+h*n,e[9]=s*i+u*n,e[10]=o*i+l*n,e[11]=a*i+c*n,this},rotateZ:function(t){var e=this.val,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[4],u=e[5],l=e[6],c=e[7];return e[0]=r*n+h*i,e[1]=s*n+u*i,e[2]=o*n+l*i,e[3]=a*n+c*i,e[4]=h*n-r*i,e[5]=u*n-s*i,e[6]=l*n-o*i,e[7]=c*n-a*i,this},fromRotationTranslation:function(t,e){var i=this.val,n=t.x,r=t.y,s=t.z,o=t.w,a=n+n,h=r+r,u=s+s,l=n*a,c=n*h,d=n*u,p=r*h,f=r*u,m=s*u,v=o*a,g=o*h,y=o*u;return i[0]=1-(p+m),i[1]=c+y,i[2]=d-g,i[3]=0,i[4]=c-y,i[5]=1-(l+m),i[6]=f+v,i[7]=0,i[8]=d+g,i[9]=f-v,i[10]=1-(l+p),i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this},fromQuat:function(t){var e=this.val,i=t.x,n=t.y,r=t.z,s=t.w,o=i+i,a=n+n,h=r+r,u=i*o,l=i*a,c=i*h,d=n*a,p=n*h,f=r*h,m=s*o,v=s*a,g=s*h;return e[0]=1-(d+f),e[1]=l+g,e[2]=c-v,e[3]=0,e[4]=l-g,e[5]=1-(u+f),e[6]=p+m,e[7]=0,e[8]=c+v,e[9]=p-m,e[10]=1-(u+d),e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},frustum:function(t,e,i,n,r,s){var o=this.val,a=1/(e-t),h=1/(n-i),u=1/(r-s);return o[0]=2*r*a,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=2*r*h,o[6]=0,o[7]=0,o[8]=(e+t)*a,o[9]=(n+i)*h,o[10]=(s+r)*u,o[11]=-1,o[12]=0,o[13]=0,o[14]=s*r*2*u,o[15]=0,this},perspective:function(t,e,i,n){var r=this.val,s=1/Math.tan(t/2),o=1/(i-n);return r[0]=s/e,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=s,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=(n+i)*o,r[11]=-1,r[12]=0,r[13]=0,r[14]=2*n*i*o,r[15]=0,this},perspectiveLH:function(t,e,i,n){var r=this.val;return r[0]=2*i/t,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=2*i/e,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=-n/(i-n),r[11]=1,r[12]=0,r[13]=0,r[14]=i*n/(i-n),r[15]=0,this},ortho:function(t,e,i,n,r,s){var o=this.val,a=t-e,h=i-n,u=r-s;return a=0===a?a:1/a,h=0===h?h:1/h,u=0===u?u:1/u,o[0]=-2*a,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=-2*h,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=2*u,o[11]=0,o[12]=(t+e)*a,o[13]=(n+i)*h,o[14]=(s+r)*u,o[15]=1,this},lookAt:function(t,e,i){var n=this.val,s=t.x,o=t.y,a=t.z,h=i.x,u=i.y,l=i.z,c=e.x,d=e.y,p=e.z;if(Math.abs(s-c)<r&&Math.abs(o-d)<r&&Math.abs(a-p)<r)return this.identity();var f=s-c,m=o-d,v=a-p,g=1/Math.sqrt(f*f+m*m+v*v),y=u*(v*=g)-l*(m*=g),_=l*(f*=g)-h*v,x=h*m-u*f;(g=Math.sqrt(y*y+_*_+x*x))?(y*=g=1/g,_*=g,x*=g):(y=0,_=0,x=0);var b=m*x-v*_,w=v*y-f*x,T=f*_-m*y;return(g=Math.sqrt(b*b+w*w+T*T))?(b*=g=1/g,w*=g,T*=g):(b=0,w=0,T=0),n[0]=y,n[1]=b,n[2]=f,n[3]=0,n[4]=_,n[5]=w,n[6]=m,n[7]=0,n[8]=x,n[9]=T,n[10]=v,n[11]=0,n[12]=-(y*s+_*o+x*a),n[13]=-(b*s+w*o+T*a),n[14]=-(f*s+m*o+v*a),n[15]=1,this},yawPitchRoll:function(t,e,i){this.zero(),o.zero(),a.zero();var n=this.val,r=o.val,s=a.val,h=Math.sin(i),u=Math.cos(i);return n[10]=1,n[15]=1,n[0]=u,n[1]=h,n[4]=-h,n[5]=u,h=Math.sin(e),u=Math.cos(e),r[0]=1,r[15]=1,r[5]=u,r[10]=u,r[9]=-h,r[6]=h,h=Math.sin(t),u=Math.cos(t),s[5]=1,s[15]=1,s[0]=u,s[2]=-h,s[8]=h,s[10]=u,this.multiplyLocal(o),this.multiplyLocal(a),this},setWorldMatrix:function(t,e,i,n,r){return this.yawPitchRoll(t.y,t.x,t.z),o.scaling(i.x,i.y,i.z),a.xyz(e.x,e.y,e.z),this.multiplyLocal(o),this.multiplyLocal(a),void 0!==n&&this.multiplyLocal(n),void 0!==r&&this.multiplyLocal(r),this}}),o=new s,a=new s;t.exports=s},20683:t=>{t.exports=function(t,e,i){return Math.min(t+e,i)}},31305:t=>{t.exports=function(t,e,i){return Math.max(t-e,i)}},36696:t=>{t.exports=function(t,e,i,n){void 0===i&&(i=e+1);var r=(t-e)/(i-e);return r>1?void 0!==n?(r=(n-t)/(n-i))<0&&(r=0):r=1:r<0&&(r=0),r}},36650:(t,e,i)=>{var n=i(47379),r=i(19531),s=i(45201),o=1e-6,a=new Int8Array([1,2,0]),h=new Float32Array([0,0,0]),u=new r(1,0,0),l=new r(0,1,0),c=new r,d=new s,p=new n({initialize:function(t,e,i,n){"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w,this},set:function(t,e,i,n){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0),this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this},scale:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},length:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return Math.sqrt(t*t+e*e+i*i+n*n)},lengthSq:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return t*t+e*e+i*i+n*n},normalize:function(){var t=this.x,e=this.y,i=this.z,n=this.w,r=t*t+e*e+i*i+n*n;return r>0&&(r=1/Math.sqrt(r),this.x=t*r,this.y=e*r,this.z=i*r,this.w=n*r),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y,r=this.z,s=this.w;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this.z=r+e*(t.z-r),this.w=s+e*(t.w-s),this},rotationTo:function(t,e){var i=t.x*e.x+t.y*e.y+t.z*e.z;return i<-.999999?(c.copy(u).cross(t).length()<o&&c.copy(l).cross(t),c.normalize(),this.setAxisAngle(c,Math.PI)):i>.999999?(this.x=0,this.y=0,this.z=0,this.w=1,this):(c.copy(t).cross(e),this.x=c.x,this.y=c.y,this.z=c.z,this.w=1+i,this.normalize())},setAxes:function(t,e,i){var n=d.val;return n[0]=e.x,n[3]=e.y,n[6]=e.z,n[1]=i.x,n[4]=i.y,n[7]=i.z,n[2]=-t.x,n[5]=-t.y,n[8]=-t.z,this.fromMat3(d).normalize()},identity:function(){return this.x=0,this.y=0,this.z=0,this.w=1,this},setAxisAngle:function(t,e){e*=.5;var i=Math.sin(e);return this.x=i*t.x,this.y=i*t.y,this.z=i*t.z,this.w=Math.cos(e),this},multiply:function(t){var e=this.x,i=this.y,n=this.z,r=this.w,s=t.x,o=t.y,a=t.z,h=t.w;return this.x=e*h+r*s+i*a-n*o,this.y=i*h+r*o+n*s-e*a,this.z=n*h+r*a+e*o-i*s,this.w=r*h-e*s-i*o-n*a,this},slerp:function(t,e){var i=this.x,n=this.y,r=this.z,s=this.w,a=t.x,h=t.y,u=t.z,l=t.w,c=i*a+n*h+r*u+s*l;c<0&&(c=-c,a=-a,h=-h,u=-u,l=-l);var d=1-e,p=e;if(1-c>o){var f=Math.acos(c),m=Math.sin(f);d=Math.sin((1-e)*f)/m,p=Math.sin(e*f)/m}return this.x=d*i+p*a,this.y=d*n+p*h,this.z=d*r+p*u,this.w=d*s+p*l,this},invert:function(){var t=this.x,e=this.y,i=this.z,n=this.w,r=t*t+e*e+i*i+n*n,s=r?1/r:0;return this.x=-t*s,this.y=-e*s,this.z=-i*s,this.w=n*s,this},conjugate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},rotateX:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,r=this.w,s=Math.sin(t),o=Math.cos(t);return this.x=e*o+r*s,this.y=i*o+n*s,this.z=n*o-i*s,this.w=r*o-e*s,this},rotateY:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,r=this.w,s=Math.sin(t),o=Math.cos(t);return this.x=e*o-n*s,this.y=i*o+r*s,this.z=n*o+e*s,this.w=r*o-i*s,this},rotateZ:function(t){t*=.5;var e=this.x,i=this.y,n=this.z,r=this.w,s=Math.sin(t),o=Math.cos(t);return this.x=e*o+i*s,this.y=i*o-e*s,this.z=n*o+r*s,this.w=r*o-n*s,this},calculateW:function(){var t=this.x,e=this.y,i=this.z;return this.w=-Math.sqrt(1-t*t-e*e-i*i),this},fromMat3:function(t){var e,i=t.val,n=i[0]+i[4]+i[8];if(n>0)e=Math.sqrt(n+1),this.w=.5*e,e=.5/e,this.x=(i[7]-i[5])*e,this.y=(i[2]-i[6])*e,this.z=(i[3]-i[1])*e;else{var r=0;i[4]>i[0]&&(r=1),i[8]>i[3*r+r]&&(r=2);var s=a[r],o=a[s];e=Math.sqrt(i[3*r+r]-i[3*s+s]-i[3*o+o]+1),h[r]=.5*e,e=.5/e,h[s]=(i[3*s+r]+i[3*r+s])*e,h[o]=(i[3*o+r]+i[3*r+o])*e,this.x=h[0],this.y=h[1],this.z=h[2],this.w=(i[3*o+s]-i[3*s+o])*e}return this}});t.exports=p},12756:(t,e,i)=>{var n=i(14302);t.exports=function(t){return t*n.RAD_TO_DEG}},37291:t=>{t.exports=function(t,e){void 0===e&&(e=1);var i=2*Math.random()*Math.PI;return t.x=Math.cos(i)*e,t.y=Math.sin(i)*e,t}},60932:t=>{t.exports=function(t,e){void 0===e&&(e=1);var i=2*Math.random()*Math.PI,n=2*Math.random()-1,r=Math.sqrt(1-n*n)*e;return t.x=Math.cos(i)*r,t.y=Math.sin(i)*r,t.z=n*e,t}},47708:t=>{t.exports=function(t,e){return void 0===e&&(e=1),t.x=(2*Math.random()-1)*e,t.y=(2*Math.random()-1)*e,t.z=(2*Math.random()-1)*e,t.w=(2*Math.random()-1)*e,t}},10461:t=>{t.exports=function(t,e){var i=t.x,n=t.y;return t.x=i*Math.cos(e)-n*Math.sin(e),t.y=i*Math.sin(e)+n*Math.cos(e),t}},36833:t=>{t.exports=function(t,e,i,n){var r=Math.cos(n),s=Math.sin(n),o=t.x-e,a=t.y-i;return t.x=o*r-a*s+e,t.y=o*s+a*r+i,t}},81771:t=>{t.exports=function(t,e,i,n,r){var s=n+Math.atan2(t.y-i,t.x-e);return t.x=e+r*Math.cos(s),t.y=i+r*Math.sin(s),t}},73818:(t,e,i)=>{var n=i(19531),r=i(27314),s=i(36650),o=new r,a=new s,h=new n;t.exports=function(t,e,i){return a.setAxisAngle(e,i),o.fromRotationTranslation(a,h.set(0,0,0)),t.transformMat4(o)}},8682:t=>{t.exports=function(t){return t>0?Math.ceil(t):Math.floor(t)}},67264:t=>{t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=10);var n=Math.pow(i,-e);return Math.round(t*n)/n}},13747:t=>{t.exports=function(t,e,i,n){void 0===e&&(e=1),void 0===i&&(i=1),void 0===n&&(n=1),n*=Math.PI/t;for(var r=[],s=[],o=0;o<t;o++)e+=(i-=e*n)*n,r[o]=i,s[o]=e;return{sin:s,cos:r,length:t}}},7695:t=>{t.exports=function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}},83088:t=>{t.exports=function(t,e,i){return(t=Math.max(0,Math.min(1,(t-e)/(i-e))))*t*t*(t*(6*t-15)+10)}},77475:(t,e,i)=>{var n=i(57148);t.exports=function(t,e,i,r){void 0===r&&(r=new n);var s=0,o=0;return t>0&&t<=e*i&&(s=t>e-1?t-(o=Math.floor(t/e))*e:t,r.set(s,o)),r}},16300:(t,e,i)=>{var n=i(57148);t.exports=function(t,e,i,r,s,o,a,h){void 0===h&&(h=new n);var u=Math.sin(s),l=Math.cos(s),c=l*o,d=u*o,p=-u*a,f=l*a,m=1/(c*f+p*-d);return h.x=f*m*t+-p*m*e+(r*p-i*f)*m,h.y=c*m*e+-d*m*t+(-r*c+i*d)*m,h}},57148:(t,e,i)=>{var n=i(47379),r=i(70077),s=new n({initialize:function(t,e){this.x=0,this.y=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0):(void 0===e&&(e=t),this.x=t||0,this.y=e||0)},clone:function(){return new s(this.x,this.y)},copy:function(t){return this.x=t.x||0,this.y=t.y||0,this},setFromObject:function(t){return this.x=t.x||0,this.y=t.y||0,this},set:function(t,e){return void 0===e&&(e=t),this.x=t,this.y=e,this},setTo:function(t,e){return this.set(t,e)},setToPolar:function(t,e){return null==e&&(e=1),this.x=Math.cos(t)*e,this.y=Math.sin(t)*e,this},equals:function(t){return this.x===t.x&&this.y===t.y},fuzzyEquals:function(t,e){return r(this.x,t.x,e)&&r(this.y,t.y,e)},angle:function(){var t=Math.atan2(this.y,this.x);return t<0&&(t+=2*Math.PI),t},setAngle:function(t){return this.setToPolar(t,this.length())},add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this},scale:function(t){return isFinite(t)?(this.x*=t,this.y*=t):(this.x=0,this.y=0),this},divide:function(t){return this.x/=t.x,this.y/=t.y,this},negate:function(){return this.x=-this.x,this.y=-this.y,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y;return e*e+i*i},length:function(){var t=this.x,e=this.y;return Math.sqrt(t*t+e*e)},setLength:function(t){return this.normalize().scale(t)},lengthSq:function(){var t=this.x,e=this.y;return t*t+e*e},normalize:function(){var t=this.x,e=this.y,i=t*t+e*e;return i>0&&(i=1/Math.sqrt(i),this.x=t*i,this.y=e*i),this},normalizeRightHand:function(){var t=this.x;return this.x=-1*this.y,this.y=t,this},normalizeLeftHand:function(){var t=this.x;return this.x=this.y,this.y=-1*t,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this},transformMat3:function(t){var e=this.x,i=this.y,n=t.val;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this},transformMat4:function(t){var e=this.x,i=this.y,n=t.val;return this.x=n[0]*e+n[4]*i+n[12],this.y=n[1]*e+n[5]*i+n[13],this},reset:function(){return this.x=0,this.y=0,this},limit:function(t){var e=this.length();return e&&e>t&&this.scale(t/e),this},reflect:function(t){return t=t.clone().normalize(),this.subtract(t.scale(2*this.dot(t)))},mirror:function(t){return this.reflect(t).negate()},rotate:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e*this.x-i*this.y,i*this.x+e*this.y)}});s.ZERO=new s,s.RIGHT=new s(1,0),s.LEFT=new s(-1,0),s.UP=new s(0,-1),s.DOWN=new s(0,1),s.ONE=new s(1,1),t.exports=s},19531:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i){this.x=0,this.y=0,this.z=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0):(this.x=t||0,this.y=e||0,this.z=i||0)},up:function(){return this.x=0,this.y=1,this.z=0,this},clone:function(){return new n(this.x,this.y,this.z)},crossVectors:function(t,e){var i=t.x,n=t.y,r=t.z,s=e.x,o=e.y,a=e.z;return this.x=n*a-r*o,this.y=r*s-i*a,this.z=i*o-n*s,this},equals:function(t){return this.x===t.x&&this.y===t.y&&this.z===t.z},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z||0,this},set:function(t,e,i){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0):(this.x=t||0,this.y=e||0,this.z=i||0),this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z||0,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z||0,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z||1,this},scale:function(t){return isFinite(t)?(this.x*=t,this.y*=t,this.z*=t):(this.x=0,this.y=0,this.z=0),this},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z||1,this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y,n=t.z-this.z||0;return Math.sqrt(e*e+i*i+n*n)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y,n=t.z-this.z||0;return e*e+i*i+n*n},length:function(){var t=this.x,e=this.y,i=this.z;return Math.sqrt(t*t+e*e+i*i)},lengthSq:function(){var t=this.x,e=this.y,i=this.z;return t*t+e*e+i*i},normalize:function(){var t=this.x,e=this.y,i=this.z,n=t*t+e*e+i*i;return n>0&&(n=1/Math.sqrt(n),this.x=t*n,this.y=e*n,this.z=i*n),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},cross:function(t){var e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,o=t.z;return this.x=i*o-n*s,this.y=n*r-e*o,this.z=e*s-i*r,this},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y,r=this.z;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this.z=r+e*(t.z-r),this},transformMat3:function(t){var e=this.x,i=this.y,n=this.z,r=t.val;return this.x=e*r[0]+i*r[3]+n*r[6],this.y=e*r[1]+i*r[4]+n*r[7],this.z=e*r[2]+i*r[5]+n*r[8],this},transformMat4:function(t){var e=this.x,i=this.y,n=this.z,r=t.val;return this.x=r[0]*e+r[4]*i+r[8]*n+r[12],this.y=r[1]*e+r[5]*i+r[9]*n+r[13],this.z=r[2]*e+r[6]*i+r[10]*n+r[14],this},transformCoordinates:function(t){var e=this.x,i=this.y,n=this.z,r=t.val,s=e*r[0]+i*r[4]+n*r[8]+r[12],o=e*r[1]+i*r[5]+n*r[9]+r[13],a=e*r[2]+i*r[6]+n*r[10]+r[14],h=e*r[3]+i*r[7]+n*r[11]+r[15];return this.x=s/h,this.y=o/h,this.z=a/h,this},transformQuat:function(t){var e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,o=t.z,a=t.w,h=a*e+s*n-o*i,u=a*i+o*e-r*n,l=a*n+r*i-s*e,c=-r*e-s*i-o*n;return this.x=h*a+c*-r+u*-o-l*-s,this.y=u*a+c*-s+l*-r-h*-o,this.z=l*a+c*-o+h*-s-u*-r,this},project:function(t){var e=this.x,i=this.y,n=this.z,r=t.val,s=r[0],o=r[1],a=r[2],h=r[3],u=r[4],l=r[5],c=r[6],d=r[7],p=r[8],f=r[9],m=r[10],v=r[11],g=r[12],y=r[13],_=r[14],x=1/(e*h+i*d+n*v+r[15]);return this.x=(e*s+i*u+n*p+g)*x,this.y=(e*o+i*l+n*f+y)*x,this.z=(e*a+i*c+n*m+_)*x,this},unproject:function(t,e){var i=t.x,n=t.y,r=t.z,s=t.w,o=this.x-i,a=s-this.y-1-n,h=this.z;return this.x=2*o/r-1,this.y=2*a/s-1,this.z=2*h-1,this.project(e)},reset:function(){return this.x=0,this.y=0,this.z=0,this}});n.ZERO=new n,n.RIGHT=new n(1,0,0),n.LEFT=new n(-1,0,0),n.UP=new n(0,-1,0),n.DOWN=new n(0,1,0),n.FORWARD=new n(0,0,1),n.BACK=new n(0,0,-1),n.ONE=new n(1,1,1),t.exports=n},68970:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n){this.x=0,this.y=0,this.z=0,this.w=0,"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0)},clone:function(){return new n(this.x,this.y,this.z,this.w)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z||0,this.w=t.w||0,this},equals:function(t){return this.x===t.x&&this.y===t.y&&this.z===t.z&&this.w===t.w},set:function(t,e,i,n){return"object"==typeof t?(this.x=t.x||0,this.y=t.y||0,this.z=t.z||0,this.w=t.w||0):(this.x=t||0,this.y=e||0,this.z=i||0,this.w=n||0),this},add:function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z||0,this.w+=t.w||0,this},subtract:function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z||0,this.w-=t.w||0,this},scale:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},length:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return Math.sqrt(t*t+e*e+i*i+n*n)},lengthSq:function(){var t=this.x,e=this.y,i=this.z,n=this.w;return t*t+e*e+i*i+n*n},normalize:function(){var t=this.x,e=this.y,i=this.z,n=this.w,r=t*t+e*e+i*i+n*n;return r>0&&(r=1/Math.sqrt(r),this.x=t*r,this.y=e*r,this.z=i*r,this.w=n*r),this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lerp:function(t,e){void 0===e&&(e=0);var i=this.x,n=this.y,r=this.z,s=this.w;return this.x=i+e*(t.x-i),this.y=n+e*(t.y-n),this.z=r+e*(t.z-r),this.w=s+e*(t.w-s),this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z||1,this.w*=t.w||1,this},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z||1,this.w/=t.w||1,this},distance:function(t){var e=t.x-this.x,i=t.y-this.y,n=t.z-this.z||0,r=t.w-this.w||0;return Math.sqrt(e*e+i*i+n*n+r*r)},distanceSq:function(t){var e=t.x-this.x,i=t.y-this.y,n=t.z-this.z||0,r=t.w-this.w||0;return e*e+i*i+n*n+r*r},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},transformMat4:function(t){var e=this.x,i=this.y,n=this.z,r=this.w,s=t.val;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this},transformQuat:function(t){var e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,o=t.z,a=t.w,h=a*e+s*n-o*i,u=a*i+o*e-r*n,l=a*n+r*i-s*e,c=-r*e-s*i-o*n;return this.x=h*a+c*-r+u*-o-l*-s,this.y=u*a+c*-s+l*-r-h*-o,this.z=l*a+c*-o+h*-s-u*-r,this},reset:function(){return this.x=0,this.y=0,this.z=0,this.w=0,this}});n.prototype.sub=n.prototype.subtract,n.prototype.mul=n.prototype.multiply,n.prototype.div=n.prototype.divide,n.prototype.dist=n.prototype.distance,n.prototype.distSq=n.prototype.distanceSq,n.prototype.len=n.prototype.length,n.prototype.lenSq=n.prototype.lengthSq,t.exports=n},33381:t=>{t.exports=function(t,e,i){return Math.abs(t-e)<=i}},62951:t=>{t.exports=function(t,e,i){var n=i-e;return e+((t-e)%n+n)%n}},72124:t=>{t.exports=function(t,e,i,n){return Math.atan2(n-e,i-t)}},99729:t=>{t.exports=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)}},59091:t=>{t.exports=function(t,e){return Math.atan2(e.x-t.x,e.y-t.y)}},8827:t=>{t.exports=function(t,e,i,n){return Math.atan2(i-t,n-e)}},23838:(t,e,i)=>{var n=i(14302);t.exports=function(t){return t>Math.PI&&(t-=n.PI2),Math.abs(((t+n.TAU)%n.PI2-n.PI2)%n.PI2)}},59867:t=>{t.exports=function(t){return(t%=2*Math.PI)>=0?t:t+2*Math.PI}},64463:(t,e,i)=>{var n=i(31657);t.exports=function(){return n(-Math.PI,Math.PI)}},98877:(t,e,i)=>{var n=i(31657);t.exports=function(){return n(-180,180)}},76949:(t,e,i)=>{var n=i(59867);t.exports=function(t){return n(t+Math.PI)}},10616:(t,e,i)=>{var n=i(14302);t.exports=function(t,e,i){return void 0===i&&(i=.05),t===e||(Math.abs(e-t)<=i||Math.abs(e-t)>=n.PI2-i?t=e:(Math.abs(e-t)>Math.PI&&(e<t?e+=n.PI2:e-=n.PI2),e>t?t+=i:e<t&&(t-=i))),t}},86248:t=>{t.exports=function(t,e){var i=e-t;return 0===i?0:i-360*Math.floor((i- -180)/360)}},23882:(t,e,i)=>{var n=i(62951);t.exports=function(t){return n(t,-Math.PI,Math.PI)}},74771:(t,e,i)=>{var n=i(62951);t.exports=function(t){return n(t,-180,180)}},7893:(t,e,i)=>{t.exports={Between:i(72124),BetweenPoints:i(99729),BetweenPointsY:i(59091),BetweenY:i(8827),CounterClockwise:i(23838),Normalize:i(59867),Random:i(64463),RandomDegrees:i(98877),Reverse:i(76949),RotateTo:i(10616),ShortestBetween:i(86248),Wrap:i(23882),WrapDegrees:i(74771)}},14302:t=>{var e={PI2:2*Math.PI,TAU:.5*Math.PI,EPSILON:1e-6,DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,RND:null,MIN_SAFE_INTEGER:Number.MIN_SAFE_INTEGER||-9007199254740991,MAX_SAFE_INTEGER:Number.MAX_SAFE_INTEGER||9007199254740991};t.exports=e},73587:t=>{t.exports=function(t,e,i,n){var r=t-i,s=e-n;return Math.sqrt(r*r+s*s)}},25049:t=>{t.exports=function(t,e){var i=t.x-e.x,n=t.y-e.y;return Math.sqrt(i*i+n*n)}},69644:t=>{t.exports=function(t,e){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},66216:t=>{t.exports=function(t,e,i,n){return Math.max(Math.abs(t-i),Math.abs(e-n))}},88716:t=>{t.exports=function(t,e,i,n,r){return void 0===r&&(r=2),Math.sqrt(Math.pow(i-t,r)+Math.pow(n-e,r))}},37935:t=>{t.exports=function(t,e,i,n){return Math.abs(t-i)+Math.abs(e-n)}},23601:t=>{t.exports=function(t,e,i,n){var r=t-i,s=e-n;return r*r+s*s}},13894:(t,e,i)=>{t.exports={Between:i(73587),BetweenPoints:i(25049),BetweenPointsSquared:i(69644),Chebyshev:i(66216),Power:i(88716),Snake:i(37935),Squared:i(23601)}},21623:(t,e,i)=>{var n=i(70369),r=i(73158),s=i(82219),o=i(53802),a=i(6503),h=i(79710),u=i(65507),l=i(12451),c=i(25576),d=i(27751),p=i(14699),f=i(34201);t.exports={Power0:u,Power1:l.Out,Power2:o.Out,Power3:c.Out,Power4:d.Out,Linear:u,Quad:l.Out,Cubic:o.Out,Quart:c.Out,Quint:d.Out,Sine:p.Out,Expo:h.Out,Circ:s.Out,Elastic:a.Out,Back:n.Out,Bounce:r.Out,Stepped:f,"Quad.easeIn":l.In,"Cubic.easeIn":o.In,"Quart.easeIn":c.In,"Quint.easeIn":d.In,"Sine.easeIn":p.In,"Expo.easeIn":h.In,"Circ.easeIn":s.In,"Elastic.easeIn":a.In,"Back.easeIn":n.In,"Bounce.easeIn":r.In,"Quad.easeOut":l.Out,"Cubic.easeOut":o.Out,"Quart.easeOut":c.Out,"Quint.easeOut":d.Out,"Sine.easeOut":p.Out,"Expo.easeOut":h.Out,"Circ.easeOut":s.Out,"Elastic.easeOut":a.Out,"Back.easeOut":n.Out,"Bounce.easeOut":r.Out,"Quad.easeInOut":l.InOut,"Cubic.easeInOut":o.InOut,"Quart.easeInOut":c.InOut,"Quint.easeInOut":d.InOut,"Sine.easeInOut":p.InOut,"Expo.easeInOut":h.InOut,"Circ.easeInOut":s.InOut,"Elastic.easeInOut":a.InOut,"Back.easeInOut":n.InOut,"Bounce.easeInOut":r.InOut}},17526:t=>{t.exports=function(t,e){return void 0===e&&(e=1.70158),t*t*((e+1)*t-e)}},61697:t=>{t.exports=function(t,e){void 0===e&&(e=1.70158);var i=1.525*e;return(t*=2)<1?t*t*((i+1)*t-i)*.5:.5*((t-=2)*t*((i+1)*t+i)+2)}},75881:t=>{t.exports=function(t,e){return void 0===e&&(e=1.70158),--t*t*((e+1)*t+e)+1}},70369:(t,e,i)=>{t.exports={In:i(17526),Out:i(75881),InOut:i(61697)}},4340:t=>{t.exports=function(t){return(t=1-t)<1/2.75?1-7.5625*t*t:t<2/2.75?1-(7.5625*(t-=1.5/2.75)*t+.75):t<2.5/2.75?1-(7.5625*(t-=2.25/2.75)*t+.9375):1-(7.5625*(t-=2.625/2.75)*t+.984375)}},22288:t=>{t.exports=function(t){var e=!1;return t<.5?(t=1-2*t,e=!0):t=2*t-1,t<1/2.75?t*=7.5625*t:t=t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,e?.5*(1-t):.5*t+.5}},19314:t=>{t.exports=function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}},73158:(t,e,i)=>{t.exports={In:i(4340),Out:i(19314),InOut:i(22288)}},66803:t=>{t.exports=function(t){return 1-Math.sqrt(1-t*t)}},36584:t=>{t.exports=function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)}},28056:t=>{t.exports=function(t){return Math.sqrt(1- --t*t)}},82219:(t,e,i)=>{t.exports={In:i(66803),Out:i(28056),InOut:i(36584)}},10772:t=>{t.exports=function(t){return t*t*t}},21473:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)}},85e3:t=>{t.exports=function(t){return--t*t*t+1}},53802:(t,e,i)=>{t.exports={In:i(10772),Out:i(85e3),InOut:i(21473)}},1942:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var n=i/4;return e<1?e=1:n=i*Math.asin(1/e)/(2*Math.PI),-e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/i)}},63590:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var n=i/4;return e<1?e=1:n=i*Math.asin(1/e)/(2*Math.PI),(t*=2)<1?e*Math.pow(2,10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/i)*-.5:e*Math.pow(2,-10*(t-=1))*Math.sin((t-n)*(2*Math.PI)/i)*.5+1}},48720:t=>{t.exports=function(t,e,i){if(void 0===e&&(e=.1),void 0===i&&(i=.1),0===t)return 0;if(1===t)return 1;var n=i/4;return e<1?e=1:n=i*Math.asin(1/e)/(2*Math.PI),e*Math.pow(2,-10*t)*Math.sin((t-n)*(2*Math.PI)/i)+1}},6503:(t,e,i)=>{t.exports={In:i(1942),Out:i(48720),InOut:i(63590)}},97359:t=>{t.exports=function(t){return Math.pow(2,10*(t-1))-.001}},92002:t=>{t.exports=function(t){return(t*=2)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*(t-1)))}},579:t=>{t.exports=function(t){return 1-Math.pow(2,-10*t)}},79710:(t,e,i)=>{t.exports={In:i(97359),Out:i(579),InOut:i(92002)}},59342:(t,e,i)=>{t.exports={Back:i(70369),Bounce:i(73158),Circular:i(82219),Cubic:i(53802),Elastic:i(6503),Expo:i(79710),Linear:i(65507),Quadratic:i(12451),Quartic:i(25576),Quintic:i(27751),Sine:i(14699),Stepped:i(34201)}},309:t=>{t.exports=function(t){return t}},65507:(t,e,i)=>{t.exports=i(309)},49988:t=>{t.exports=function(t){return t*t}},50494:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)}},39033:t=>{t.exports=function(t){return t*(2-t)}},12451:(t,e,i)=>{t.exports={In:i(49988),Out:i(39033),InOut:i(50494)}},4691:t=>{t.exports=function(t){return t*t*t*t}},51364:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)}},52399:t=>{t.exports=function(t){return 1- --t*t*t*t}},25576:(t,e,i)=>{t.exports={In:i(4691),Out:i(52399),InOut:i(51364)}},27850:t=>{t.exports=function(t){return t*t*t*t*t}},90881:t=>{t.exports=function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)}},3167:t=>{t.exports=function(t){return--t*t*t*t*t+1}},27751:(t,e,i)=>{t.exports={In:i(27850),Out:i(3167),InOut:i(90881)}},32981:t=>{t.exports=function(t){return 0===t?0:1===t?1:1-Math.cos(t*Math.PI/2)}},87652:t=>{t.exports=function(t){return 0===t?0:1===t?1:.5*(1-Math.cos(Math.PI*t))}},33022:t=>{t.exports=function(t){return 0===t?0:1===t?1:Math.sin(t*Math.PI/2)}},14699:(t,e,i)=>{t.exports={In:i(32981),Out:i(33022),InOut:i(87652)}},16740:t=>{t.exports=function(t,e){return void 0===e&&(e=1),t<=0?0:t>=1?1:1/e*(1+(e*t|0))}},34201:(t,e,i)=>{t.exports=i(16740)},66394:t=>{t.exports=function(t,e){return void 0===e&&(e=1e-4),Math.ceil(t-e)}},70077:t=>{t.exports=function(t,e,i){return void 0===i&&(i=1e-4),Math.abs(t-e)<i}},42679:t=>{t.exports=function(t,e){return void 0===e&&(e=1e-4),Math.floor(t+e)}},60710:t=>{t.exports=function(t,e,i){return void 0===i&&(i=1e-4),t>e-i}},17373:t=>{t.exports=function(t,e,i){return void 0===i&&(i=1e-4),t<e+i}},47832:(t,e,i)=>{t.exports={Ceil:i(66394),Equal:i(70077),Floor:i(42679),GreaterThan:i(60710),LessThan:i(17373)}},39899:(t,e,i)=>{var n=i(14302),r=i(80933),s={Angle:i(7893),Distance:i(13894),Easing:i(59342),Fuzzy:i(47832),Interpolation:i(92245),Pow2:i(98779),Snap:i(81414),RandomDataGenerator:i(4791),Average:i(44962),Bernstein:i(70890),Between:i(67630),CatmullRom:i(21934),CeilTo:i(74018),Clamp:i(90487),DegToRad:i(98436),Difference:i(60669),Factorial:i(3211),FloatBetween:i(31657),FloorTo:i(51228),FromPercent:i(96210),GetSpeed:i(89478),IsEven:i(67781),IsEvenStrict:i(60602),Linear:i(57459),MaxAdd:i(20683),MinSub:i(31305),Percent:i(36696),RadToDeg:i(12756),RandomXY:i(37291),RandomXYZ:i(60932),RandomXYZW:i(47708),Rotate:i(10461),RotateAround:i(36833),RotateAroundDistance:i(81771),RoundAwayFromZero:i(8682),RoundTo:i(67264),SinCosTableGenerator:i(13747),SmootherStep:i(83088),SmoothStep:i(7695),ToXY:i(77475),TransformXY:i(16300),Within:i(33381),Wrap:i(62951),Vector2:i(57148),Vector3:i(19531),Vector4:i(68970),Matrix3:i(45201),Matrix4:i(27314),Quaternion:i(36650),RotateVec3:i(73818)};s=r(!1,s,n),t.exports=s},64288:(t,e,i)=>{var n=i(70890);t.exports=function(t,e){for(var i=0,r=t.length-1,s=0;s<=r;s++)i+=Math.pow(1-e,r-s)*Math.pow(e,s)*t[s]*n(r,s);return i}},43660:(t,e,i)=>{var n=i(21934);t.exports=function(t,e){var i=t.length-1,r=i*e,s=Math.floor(r);return t[0]===t[i]?(e<0&&(s=Math.floor(r=i*(1+e))),n(r-s,t[(s-1+i)%i],t[s],t[(s+1)%i],t[(s+2)%i])):e<0?t[0]-(n(-r,t[0],t[0],t[1],t[1])-t[0]):e>1?t[i]-(n(r-i,t[i],t[i],t[i-1],t[i-1])-t[i]):n(r-s,t[s?s-1:0],t[s],t[i<s+1?i:s+1],t[i<s+2?i:s+2])}},97800:t=>{t.exports=function(t,e,i,n,r){return function(t,e){var i=1-t;return i*i*i*e}(t,e)+function(t,e){var i=1-t;return 3*i*i*t*e}(t,i)+function(t,e){return 3*(1-t)*t*t*e}(t,n)+function(t,e){return t*t*t*e}(t,r)}},24253:(t,e,i)=>{var n=i(57459);t.exports=function(t,e){var i=t.length-1,r=i*e,s=Math.floor(r);return e<0?n(t[0],t[1],r):e>1?n(t[i],t[i-1],i-r):n(t[s],t[s+1>i?i:s+1],r-s)}},16585:t=>{t.exports=function(t,e,i,n){return function(t,e){var i=1-t;return i*i*e}(t,e)+function(t,e){return 2*(1-t)*t*e}(t,i)+function(t,e){return t*t*e}(t,n)}},15579:(t,e,i)=>{var n=i(7695);t.exports=function(t,e,i){return e+(i-e)*n(t,0,1)}},17995:(t,e,i)=>{var n=i(83088);t.exports=function(t,e,i){return e+(i-e)*n(t,0,1)}},92245:(t,e,i)=>{t.exports={Bezier:i(64288),CatmullRom:i(43660),CubicBezier:i(97800),Linear:i(24253),QuadraticBezier:i(16585),SmoothStep:i(15579),SmootherStep:i(17995)}},60712:t=>{t.exports=function(t){var e=Math.log(t)/.6931471805599453;return 1<<Math.ceil(e)}},2244:t=>{t.exports=function(t,e){return t>0&&0==(t&t-1)&&e>0&&0==(e&e-1)}},37489:t=>{t.exports=function(t){return t>0&&0==(t&t-1)}},98779:(t,e,i)=>{t.exports={GetNext:i(60712),IsSize:i(2244),IsValue:i(37489)}},4791:(t,e,i)=>{var n=new(i(47379))({initialize:function(t){void 0===t&&(t=[(Date.now()*Math.random()).toString()]),this.c=1,this.s0=0,this.s1=0,this.s2=0,this.n=0,this.signs=[-1,1],t&&this.init(t)},rnd:function(){var t=2091639*this.s0+2.3283064365386963e-10*this.c;return this.c=0|t,this.s0=this.s1,this.s1=this.s2,this.s2=t-this.c,this.s2},hash:function(t){var e,i=this.n;t=t.toString();for(var n=0;n<t.length;n++)e=.02519603282416938*(i+=t.charCodeAt(n)),e-=i=e>>>0,i=(e*=i)>>>0,i+=4294967296*(e-=i);return this.n=i,2.3283064365386963e-10*(i>>>0)},init:function(t){"string"==typeof t?this.state(t):this.sow(t)},sow:function(t){if(this.n=4022871197,this.s0=this.hash(" "),this.s1=this.hash(" "),this.s2=this.hash(" "),this.c=1,t)for(var e=0;e<t.length&&null!=t[e];e++){var i=t[e];this.s0-=this.hash(i),this.s0+=~~(this.s0<0),this.s1-=this.hash(i),this.s1+=~~(this.s1<0),this.s2-=this.hash(i),this.s2+=~~(this.s2<0)}},integer:function(){return 4294967296*this.rnd()},frac:function(){return this.rnd()+11102230246251565e-32*(2097152*this.rnd()|0)},real:function(){return this.integer()+this.frac()},integerInRange:function(t,e){return Math.floor(this.realInRange(0,e-t+1)+t)},between:function(t,e){return Math.floor(this.realInRange(0,e-t+1)+t)},realInRange:function(t,e){return this.frac()*(e-t)+t},normal:function(){return 1-2*this.frac()},uuid:function(){var t="",e="";for(e=t="";t++<36;e+=~t%5|3*t&4?(15^t?8^this.frac()*(20^t?16:4):4).toString(16):"-");return e},pick:function(t){return t[this.integerInRange(0,t.length-1)]},sign:function(){return this.pick(this.signs)},weightedPick:function(t){return t[~~(Math.pow(this.frac(),2)*(t.length-1)+.5)]},timestamp:function(t,e){return this.realInRange(t||9466848e5,e||1577862e6)},angle:function(){return this.integerInRange(-180,180)},rotation:function(){return this.realInRange(-3.1415926,3.1415926)},state:function(t){return"string"==typeof t&&t.match(/^!rnd/)&&(t=t.split(","),this.c=parseFloat(t[1]),this.s0=parseFloat(t[2]),this.s1=parseFloat(t[3]),this.s2=parseFloat(t[4])),["!rnd",this.c,this.s0,this.s1,this.s2].join(",")},shuffle:function(t){for(var e=t.length-1;e>0;e--){var i=Math.floor(this.frac()*(e+1)),n=t[i];t[i]=t[e],t[e]=n}return t}});t.exports=n},70346:t=>{t.exports=function(t,e,i,n){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.ceil(t/e),n?(i+t)/e:i+t)}},88168:t=>{t.exports=function(t,e,i,n){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.floor(t/e),n?(i+t)/e:i+t)}},56748:t=>{t.exports=function(t,e,i,n){return void 0===i&&(i=0),0===e?t:(t-=i,t=e*Math.round(t/e),n?(i+t)/e:i+t)}},81414:(t,e,i)=>{t.exports={Ceil:i(70346),Floor:i(88168),To:i(56748)}},57005:(t,e,i)=>{i(81194);var n=i(50460),r=i(80933),s={Actions:i(5490),Animations:i(53781),BlendModes:i(35869),Cache:i(95865),Cameras:i(49357),Core:i(81189),Class:i(47379),Create:i(88165),Curves:i(95398),Data:i(69783),Display:i(33798),DOM:i(69887),Events:i(27408),Game:i(72937),GameObjects:i(5837),Geom:i(96285),Input:i(26417),Loader:i(42430),Math:i(39899),Physics:i(34775),Plugins:i(65604),Renderer:i(8270),Scale:i(45192),ScaleModes:i(28425),Scene:i(5155),Scenes:i(6397),Structs:i(97548),Textures:i(1274),Tilemaps:i(81241),Time:i(46547),Tweens:i(93226),Utils:i(83484)};s.Sound=i(73125),s.Cameras.Sprite3D=i(66005),s.GameObjects.Sprite3D=i(56218),s.GameObjects.Factories.Sprite3D=i(79465),s.GameObjects.Creators.Sprite3D=i(47712),s.FacebookInstantGamesPlugin=i(75329),s=r(!1,s,n),t.exports=s,global.Phaser=s},89428:(t,e,i)=>{var n=i(47379),r=i(14682),s=i(59525),o=new n({Extends:s,Mixins:[r.Acceleration,r.Angular,r.Bounce,r.Debug,r.Drag,r.Enable,r.Friction,r.Gravity,r.Immovable,r.Mass,r.Size,r.Velocity],initialize:function(t,e,i,n,r){s.call(this,t,e,i,n,r),this.body=null}});t.exports=o},47653:(t,e,i)=>{var n=i(47379),r=i(98436),s=i(73587),o=i(23601),a=i(29548),h=i(81769),u=i(92974),l=i(79004),c=i(82124),d=i(50354),p=i(88637),f=i(57148),m=i(87573),v=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.config=this.getConfig(),this.world,this.add,t.sys.events.once(p.BOOT,this.boot,this),t.sys.events.on(p.START,this.start,this)},boot:function(){this.world=new m(this.scene,this.config),this.add=new a(this.world),this.systems.events.once(p.DESTROY,this.destroy,this)},start:function(){this.world||(this.world=new m(this.scene,this.config),this.add=new a(this.world));var t=this.systems.events;t.on(p.UPDATE,this.world.update,this.world),t.on(p.POST_UPDATE,this.world.postUpdate,this.world),t.once(p.SHUTDOWN,this.shutdown,this)},getConfig:function(){var t=this.systems.game.config.physics,e=this.systems.settings.physics;return u(h(e,"arcade",{}),h(t,"arcade",{}))},overlap:function(t,e,i,n,r){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i),this.world.collideObjects(t,e,i,n,r,!0)},collide:function(t,e,i,n,r){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i),this.world.collideObjects(t,e,i,n,r,!1)},collideTiles:function(t,e,i,n,r){return this.world.collideTiles(t,e,i,n,r)},overlapTiles:function(t,e,i,n,r){return this.world.overlapTiles(t,e,i,n,r)},pause:function(){return this.world.pause()},resume:function(){return this.world.resume()},accelerateTo:function(t,e,i,n,r,s){void 0===n&&(n=60);var o=Math.atan2(i-t.y,e-t.x);return t.body.acceleration.setToPolar(o,n),void 0!==r&&void 0!==s&&t.body.maxVelocity.set(r,s),o},accelerateToObject:function(t,e,i,n,r){return this.accelerateTo(t,e.x,e.y,i,n,r)},closest:function(t,e){e||(e=this.world.bodies.entries);for(var i=Number.MAX_VALUE,n=null,r=t.x,s=t.y,a=e.length,h=0;h<a;h++){var u=e[h],l=u.body||u;if(t!==u&&t!==l&&t!==l.gameObject&&t!==l.center){var c=o(r,s,l.center.x,l.center.y);c<i&&(n=u,i=c)}}return n},furthest:function(t,e){e||(e=this.world.bodies.entries);for(var i=-1,n=null,r=t.x,s=t.y,a=e.length,h=0;h<a;h++){var u=e[h],l=u.body||u;if(t!==u&&t!==l&&t!==l.gameObject&&t!==l.center){var c=o(r,s,l.center.x,l.center.y);c>i&&(n=u,i=c)}}return n},moveTo:function(t,e,i,n,r){void 0===n&&(n=60),void 0===r&&(r=0);var o=Math.atan2(i-t.y,e-t.x);return r>0&&(n=s(t.x,t.y,e,i)/(r/1e3)),t.body.velocity.setToPolar(o,n),o},moveToObject:function(t,e,i,n){return this.moveTo(t,e.x,e.y,i,n)},velocityFromAngle:function(t,e,i){return void 0===e&&(e=60),void 0===i&&(i=new f),i.setToPolar(r(t),e)},velocityFromRotation:function(t,e,i){return void 0===e&&(e=60),void 0===i&&(i=new f),i.setToPolar(t,e)},overlapRect:function(t,e,i,n,r,s){return c(this.world,t,e,i,n,r,s)},overlapCirc:function(t,e,i,n,r){return l(this.world,t,e,i,n,r)},shutdown:function(){if(this.world){var t=this.systems.events;t.off(p.UPDATE,this.world.update,this.world),t.off(p.POST_UPDATE,this.world.postUpdate,this.world),t.off(p.SHUTDOWN,this.shutdown,this),this.add.destroy(),this.world.destroy(),this.add=null,this.world=null}},destroy:function(){this.shutdown(),this.scene.sys.events.off(p.START,this.start,this),this.scene=null,this.systems=null}});d.register("ArcadePhysics",v,"arcadePhysics"),t.exports=v},44133:(t,e,i)=>{var n=i(47379),r=i(14682),s=i(95681),o=new n({Extends:s,Mixins:[r.Acceleration,r.Angular,r.Bounce,r.Debug,r.Drag,r.Enable,r.Friction,r.Gravity,r.Immovable,r.Mass,r.Size,r.Velocity],initialize:function(t,e,i,n,r){s.call(this,t,e,i,n,r),this.body=null}});t.exports=o},94772:(t,e,i)=>{var n=i(47379),r=i(7365),s=i(72207),o=i(12756),a=i(38092),h=i(38593),u=i(57148),l=new n({initialize:function(t,e){var i=e.displayWidth?e.displayWidth:64,n=e.displayHeight?e.displayHeight:64;this.world=t,this.gameObject=e,this.transform={x:e.x,y:e.y,rotation:e.angle,scaleX:e.scaleX,scaleY:e.scaleY,displayOriginX:e.displayOriginX,displayOriginY:e.displayOriginY},this.debugShowBody=t.defaults.debugShowBody,this.debugShowVelocity=t.defaults.debugShowVelocity,this.debugBodyColor=t.defaults.bodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new u,this.position=new u(e.x-e.scaleX*e.displayOriginX,e.y-e.scaleY*e.displayOriginY),this.prev=new u(e.x,e.y),this.prevFrame=new u(e.x,e.y),this.allowRotation=!0,this.rotation=e.angle,this.preRotation=e.angle,this.width=i,this.height=n,this.sourceWidth=i,this.sourceHeight=n,e.frame&&(this.sourceWidth=e.frame.realWidth,this.sourceHeight=e.frame.realHeight),this.halfWidth=Math.abs(i/2),this.halfHeight=Math.abs(n/2),this.center=new u(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.velocity=new u,this.newVelocity=new u,this.deltaMax=new u,this.acceleration=new u,this.allowDrag=!0,this.drag=new u,this.allowGravity=!0,this.gravity=new u,this.bounce=new u,this.worldBounce=null,this.customBoundsRectangle=t.bounds,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.maxVelocity=new u(1e4,1e4),this.maxSpeed=-1,this.friction=new u(1,0),this.useDamping=!1,this.angularVelocity=0,this.angularAcceleration=0,this.angularDrag=0,this.maxAngular=1e3,this.mass=1,this.angle=0,this.speed=0,this.facing=r.FACING_NONE,this.immovable=!1,this.moves=!0,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision={none:!1,up:!0,down:!0,left:!0,right:!0},this.touching={none:!0,up:!1,down:!1,left:!1,right:!1},this.wasTouching={none:!0,up:!1,down:!1,left:!1,right:!1},this.blocked={none:!0,up:!1,down:!1,left:!1,right:!1},this.syncBounds=!1,this.physicsType=r.DYNAMIC_BODY,this._sx=e.scaleX,this._sy=e.scaleY,this._dx=0,this._dy=0,this._tx=0,this._ty=0,this._bounds=new a},updateBounds:function(){var t=this.gameObject,e=this.transform;if(t.parentContainer){var i=t.getWorldTransformMatrix(this.world._tempMatrix,this.world._tempMatrix2);e.x=i.tx,e.y=i.ty,e.rotation=o(i.rotation),e.scaleX=i.scaleX,e.scaleY=i.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY}else e.x=t.x,e.y=t.y,e.rotation=t.angle,e.scaleX=t.scaleX,e.scaleY=t.scaleY,e.displayOriginX=t.displayOriginX,e.displayOriginY=t.displayOriginY;var n=!1;if(this.syncBounds){var r=t.getBounds(this._bounds);this.width=r.width,this.height=r.height,n=!0}else{var s=Math.abs(e.scaleX),a=Math.abs(e.scaleY);this._sx===s&&this._sy===a||(this.width=this.sourceWidth*s,this.height=this.sourceHeight*a,this._sx=s,this._sy=a,n=!0)}n&&(this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter())},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},resetFlags:function(){var t=this.wasTouching,e=this.touching,i=this.blocked;t.none=e.none,t.up=e.up,t.down=e.down,t.left=e.left,t.right=e.right,e.none=!0,e.up=!1,e.down=!1,e.left=!1,e.right=!1,i.none=!0,i.up=!1,i.down=!1,i.left=!1,i.right=!1,this.overlapR=0,this.overlapX=0,this.overlapY=0,this.embedded=!1},preUpdate:function(t,e){t&&this.resetFlags(),this.updateBounds();var i=this.transform;this.position.x=i.x+i.scaleX*(this.offset.x-i.displayOriginX),this.position.y=i.y+i.scaleY*(this.offset.y-i.displayOriginY),this.updateCenter(),this.rotation=i.rotation,this.preRotation=this.rotation,this.moves&&(this.prev.x=this.position.x,this.prev.y=this.position.y,this.prevFrame.x=this.position.x,this.prevFrame.y=this.position.y),t&&this.update(e)},update:function(t){if(this.prev.x=this.position.x,this.prev.y=this.position.y,this.moves){this.world.updateMotion(this,t);var e=this.velocity.x,i=this.velocity.y;this.newVelocity.set(e*t,i*t),this.position.add(this.newVelocity),this.updateCenter(),this.angle=Math.atan2(i,e),this.speed=Math.sqrt(e*e+i*i),this.collideWorldBounds&&this.checkWorldBounds()&&this.onWorldBounds&&this.world.emit(s.WORLD_BOUNDS,this,this.blocked.up,this.blocked.down,this.blocked.left,this.blocked.right)}this._dx=this.position.x-this.prev.x,this._dy=this.position.y-this.prev.y},postUpdate:function(){var t=this.position.x-this.prevFrame.x,e=this.position.y-this.prevFrame.y;if(this.moves){var i=this.deltaMax.x,n=this.deltaMax.y;0!==i&&0!==t&&(t<0&&t<-i?t=-i:t>0&&t>i&&(t=i)),0!==n&&0!==e&&(e<0&&e<-n?e=-n:e>0&&e>n&&(e=n)),this.gameObject.x+=t,this.gameObject.y+=e}t<0?this.facing=r.FACING_LEFT:t>0&&(this.facing=r.FACING_RIGHT),e<0?this.facing=r.FACING_UP:e>0&&(this.facing=r.FACING_DOWN),this.allowRotation&&(this.gameObject.angle+=this.deltaZ()),this._tx=t,this._ty=e},setBoundsRectangle:function(t){return this.customBoundsRectangle=t||this.world.bounds,this},checkWorldBounds:function(){var t=this.position,e=this.customBoundsRectangle,i=this.world.checkCollision,n=this.worldBounce?-this.worldBounce.x:-this.bounce.x,r=this.worldBounce?-this.worldBounce.y:-this.bounce.y,s=!1;return t.x<e.x&&i.left?(t.x=e.x,this.velocity.x*=n,this.blocked.left=!0,s=!0):this.right>e.right&&i.right&&(t.x=e.right-this.width,this.velocity.x*=n,this.blocked.right=!0,s=!0),t.y<e.y&&i.up?(t.y=e.y,this.velocity.y*=r,this.blocked.up=!0,s=!0):this.bottom>e.bottom&&i.down&&(t.y=e.bottom-this.height,this.velocity.y*=r,this.blocked.down=!0,s=!0),s&&(this.blocked.none=!1),s},setOffset:function(t,e){return void 0===e&&(e=t),this.offset.set(t,e),this.updateCenter(),this},setSize:function(t,e,i){void 0===i&&(i=!0);var n=this.gameObject;if(!t&&n.frame&&(t=n.frame.realWidth),!e&&n.frame&&(e=n.frame.realHeight),this.sourceWidth=t,this.sourceHeight=e,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.updateCenter(),i&&n.getCenter){var r=(n.width-t)/2,s=(n.height-e)/2;this.offset.set(r,s)}return this.isCircle=!1,this.radius=0,this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.isCircle=!0,this.radius=t,this.sourceWidth=2*t,this.sourceHeight=2*t,this.width=this.sourceWidth*this._sx,this.height=this.sourceHeight*this._sy,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter()):this.isCircle=!1,this},reset:function(t,e){this.stop();var i=this.gameObject;i.setPosition(t,e),i.getTopLeft?i.getTopLeft(this.position):this.position.set(t,e),this.prev.copy(this.position),this.prevFrame.copy(this.position),this.rotation=i.angle,this.preRotation=i.angle,this.updateBounds(),this.updateCenter()},stop:function(){return this.velocity.set(0),this.acceleration.set(0),this.speed=0,this.angularVelocity=0,this.angularAcceleration=0,this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?this.radius>0&&t>=this.left&&t<=this.right&&e>=this.top&&e<=this.bottom&&(this.center.x-t)*(this.center.x-t)+(this.center.y-e)*(this.center.y-e)<=this.radius*this.radius:h(this,t,e)},onFloor:function(){return this.blocked.down},onCeiling:function(){return this.blocked.up},onWall:function(){return this.blocked.left||this.blocked.right},deltaAbsX:function(){return this._dx>0?this._dx:-this._dx},deltaAbsY:function(){return this._dy>0?this._dy:-this._dy},deltaX:function(){return this._dx},deltaY:function(){return this._dy},deltaXFinal:function(){return this._tx},deltaYFinal:function(){return this._ty},deltaZ:function(){return this.rotation-this.preRotation},destroy:function(){this.enable=!1,this.world&&this.world.pendingDestroy.set(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,n=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(t.defaultStrokeWidth,this.debugBodyColor),this.isCircle?t.strokeCircle(i,n,this.width/2):(this.checkCollision.up&&t.lineBetween(e.x,e.y,e.x+this.width,e.y),this.checkCollision.right&&t.lineBetween(e.x+this.width,e.y,e.x+this.width,e.y+this.height),this.checkCollision.down&&t.lineBetween(e.x,e.y+this.height,e.x+this.width,e.y+this.height),this.checkCollision.left&&t.lineBetween(e.x,e.y,e.x,e.y+this.height))),this.debugShowVelocity&&(t.lineStyle(t.defaultStrokeWidth,this.world.defaults.velocityDebugColor,1),t.lineBetween(i,n,i+this.velocity.x/2,n+this.velocity.y/2))},willDrawDebug:function(){return this.debugShowBody||this.debugShowVelocity},setCollideWorldBounds:function(t,e,i){void 0===t&&(t=!0),this.collideWorldBounds=t;var n=void 0!==e,r=void 0!==i;return(n||r)&&(this.worldBounce||(this.worldBounce=new u),n&&(this.worldBounce.x=e),r&&(this.worldBounce.y=i)),this},setVelocity:function(t,e){return this.velocity.set(t,e),t=this.velocity.x,e=this.velocity.y,this.speed=Math.sqrt(t*t+e*e),this},setVelocityX:function(t){this.velocity.x=t;var e=t,i=this.velocity.y;return this.speed=Math.sqrt(e*e+i*i),this},setVelocityY:function(t){this.velocity.y=t;var e=this.velocity.x,i=t;return this.speed=Math.sqrt(e*e+i*i),this},setMaxVelocity:function(t,e){return this.maxVelocity.set(t,e),this},setMaxSpeed:function(t){return this.maxSpeed=t,this},setBounce:function(t,e){return this.bounce.set(t,e),this},setBounceX:function(t){return this.bounce.x=t,this},setBounceY:function(t){return this.bounce.y=t,this},setAcceleration:function(t,e){return this.acceleration.set(t,e),this},setAccelerationX:function(t){return this.acceleration.x=t,this},setAccelerationY:function(t){return this.acceleration.y=t,this},setAllowDrag:function(t){return void 0===t&&(t=!0),this.allowDrag=t,this},setAllowGravity:function(t){return void 0===t&&(t=!0),this.allowGravity=t,this},setAllowRotation:function(t){return void 0===t&&(t=!0),this.allowRotation=t,this},setDrag:function(t,e){return this.drag.set(t,e),this},setDragX:function(t){return this.drag.x=t,this},setDragY:function(t){return this.drag.y=t,this},setGravity:function(t,e){return this.gravity.set(t,e),this},setGravityX:function(t){return this.gravity.x=t,this},setGravityY:function(t){return this.gravity.y=t,this},setFriction:function(t,e){return this.friction.set(t,e),this},setFrictionX:function(t){return this.friction.x=t,this},setFrictionY:function(t){return this.friction.y=t,this},setAngularVelocity:function(t){return this.angularVelocity=t,this},setAngularAcceleration:function(t){return this.angularAcceleration=t,this},setAngularDrag:function(t){return this.angularDrag=t,this},setMass:function(t){return this.mass=t,this},setImmovable:function(t){return void 0===t&&(t=!0),this.immovable=t,this},setEnable:function(t){return void 0===t&&(t=!0),this.enable=t,this},x:{get:function(){return this.position.x},set:function(t){this.position.x=t}},y:{get:function(){return this.position.y},set:function(t){this.position.y=t}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=l},61990:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n,r,s,o){this.world=t,this.name="",this.active=!0,this.overlapOnly=e,this.object1=i,this.object2=n,this.collideCallback=r,this.processCallback=s,this.callbackContext=o},setName:function(t){return this.name=t,this},update:function(){this.world.collideObjects(this.object1,this.object2,this.collideCallback,this.processCallback,this.callbackContext,this.overlapOnly)},destroy:function(){this.world.removeCollider(this),this.active=!1,this.world=null,this.object1=null,this.object2=null,this.collideCallback=null,this.processCallback=null,this.callbackContext=null}});t.exports=n},29548:(t,e,i)=>{var n=i(89428),r=i(44133),s=i(47379),o=i(7365),a=i(50143),h=i(73111),u=new s({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},collider:function(t,e,i,n,r){return this.world.addCollider(t,e,i,n,r)},overlap:function(t,e,i,n,r){return this.world.addOverlap(t,e,i,n,r)},existing:function(t,e){var i=e?o.STATIC_BODY:o.DYNAMIC_BODY;return this.world.enableBody(t,i),t},staticImage:function(t,e,i,r){var s=new n(this.scene,t,e,i,r);return this.sys.displayList.add(s),this.world.enableBody(s,o.STATIC_BODY),s},image:function(t,e,i,r){var s=new n(this.scene,t,e,i,r);return this.sys.displayList.add(s),this.world.enableBody(s,o.DYNAMIC_BODY),s},staticSprite:function(t,e,i,n){var s=new r(this.scene,t,e,i,n);return this.sys.displayList.add(s),this.sys.updateList.add(s),this.world.enableBody(s,o.STATIC_BODY),s},sprite:function(t,e,i,n){var s=new r(this.scene,t,e,i,n);return this.sys.displayList.add(s),this.sys.updateList.add(s),this.world.enableBody(s,o.DYNAMIC_BODY),s},staticGroup:function(t,e){return this.sys.updateList.add(new h(this.world,this.world.scene,t,e))},group:function(t,e){return this.sys.updateList.add(new a(this.world,this.world.scene,t,e))},destroy:function(){this.world=null,this.scene=null,this.sys=null}});t.exports=u},83753:(t,e,i)=>{var n=i(7365);t.exports=function(t,e,i,r){var s=0,o=t.deltaAbsX()+e.deltaAbsX()+r;return 0===t._dx&&0===e._dx?(t.embedded=!0,e.embedded=!0):t._dx>e._dx?(s=t.right-e.x)>o&&!i||!1===t.checkCollision.right||!1===e.checkCollision.left?s=0:(t.touching.none=!1,t.touching.right=!0,e.touching.none=!1,e.touching.left=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.right=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.left=!0)):t._dx<e._dx&&(-(s=t.x-e.width-e.x)>o&&!i||!1===t.checkCollision.left||!1===e.checkCollision.right?s=0:(t.touching.none=!1,t.touching.left=!0,e.touching.none=!1,e.touching.right=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.left=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.right=!0))),t.overlapX=s,e.overlapX=s,s}},82268:(t,e,i)=>{var n=i(7365);t.exports=function(t,e,i,r){var s=0,o=t.deltaAbsY()+e.deltaAbsY()+r;return 0===t._dy&&0===e._dy?(t.embedded=!0,e.embedded=!0):t._dy>e._dy?(s=t.bottom-e.y)>o&&!i||!1===t.checkCollision.down||!1===e.checkCollision.up?s=0:(t.touching.none=!1,t.touching.down=!0,e.touching.none=!1,e.touching.up=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.down=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.up=!0)):t._dy<e._dy&&(-(s=t.y-e.bottom)>o&&!i||!1===t.checkCollision.up||!1===e.checkCollision.down?s=0:(t.touching.none=!1,t.touching.up=!0,e.touching.none=!1,e.touching.down=!0,e.physicsType===n.STATIC_BODY&&(t.blocked.none=!1,t.blocked.up=!0),t.physicsType===n.STATIC_BODY&&(e.blocked.none=!1,e.blocked.down=!0))),t.overlapY=s,e.overlapY=s,s}},50143:(t,e,i)=>{var n=i(44133),r=i(47379),s=i(7365),o=i(81769),a=i(55815),h=i(28621),u=new r({Extends:a,initialize:function(t,e,i,r){if(i||r)if(h(i))r=i,i=null,r.internalCreateCallback=this.createCallbackHandler,r.internalRemoveCallback=this.removeCallbackHandler;else if(Array.isArray(i)&&h(i[0])){r=i[0];var u=this;i.forEach((function(t){t.internalCreateCallback=u.createCallbackHandler,t.internalRemoveCallback=u.removeCallbackHandler}))}else r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};else r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler};this.world=t,r.classType=o(r,"classType",n),this.physicsType=s.DYNAMIC_BODY,this.defaults={setCollideWorldBounds:o(r,"collideWorldBounds",!1),setBoundsRectangle:o(r,"customBoundsRectangle",null),setAccelerationX:o(r,"accelerationX",0),setAccelerationY:o(r,"accelerationY",0),setAllowDrag:o(r,"allowDrag",!0),setAllowGravity:o(r,"allowGravity",!0),setAllowRotation:o(r,"allowRotation",!0),setBounceX:o(r,"bounceX",0),setBounceY:o(r,"bounceY",0),setDragX:o(r,"dragX",0),setDragY:o(r,"dragY",0),setEnable:o(r,"enable",!0),setGravityX:o(r,"gravityX",0),setGravityY:o(r,"gravityY",0),setFrictionX:o(r,"frictionX",0),setFrictionY:o(r,"frictionY",0),setVelocityX:o(r,"velocityX",0),setVelocityY:o(r,"velocityY",0),setAngularVelocity:o(r,"angularVelocity",0),setAngularAcceleration:o(r,"angularAcceleration",0),setAngularDrag:o(r,"angularDrag",0),setMass:o(r,"mass",1),setImmovable:o(r,"immovable",!1)},Array.isArray(i)&&(r=null),a.call(this,e,i,r),this.type="PhysicsGroup"},createCallbackHandler:function(t){t.body||this.world.enableBody(t,s.DYNAMIC_BODY);var e=t.body;for(var i in this.defaults)e[i](this.defaults[i])},removeCallbackHandler:function(t){t.body&&this.world.disableBody(t)},setVelocity:function(t,e,i){void 0===i&&(i=0);for(var n=this.getChildren(),r=0;r<n.length;r++)n[r].body.velocity.set(t+r*i,e+r*i);return this},setVelocityX:function(t,e){void 0===e&&(e=0);for(var i=this.getChildren(),n=0;n<i.length;n++)i[n].body.velocity.x=t+n*e;return this},setVelocityY:function(t,e){void 0===e&&(e=0);for(var i=this.getChildren(),n=0;n<i.length;n++)i[n].body.velocity.y=t+n*e;return this}});t.exports=u},30725:(t,e,i)=>{var n=i(83753);t.exports=function(t,e,i,r){var s=n(t,e,i,r);if(i||0===s||t.immovable&&e.immovable||t.customSeparateX||e.customSeparateX)return 0!==s||t.embedded&&e.embedded;var o=t.velocity.x,a=e.velocity.x;if(t.immovable||e.immovable)t.immovable?(e.x+=s,e.velocity.x=o-a*e.bounce.x,t.moves&&(e.y+=(t.y-t.prev.y)*t.friction.y)):(t.x-=s,t.velocity.x=a-o*t.bounce.x,e.moves&&(t.y+=(e.y-e.prev.y)*e.friction.y));else{s*=.5,t.x-=s,e.x+=s;var h=Math.sqrt(a*a*e.mass/t.mass)*(a>0?1:-1),u=Math.sqrt(o*o*t.mass/e.mass)*(o>0?1:-1),l=.5*(h+u);h-=l,u-=l,t.velocity.x=l+h*t.bounce.x,e.velocity.x=l+u*e.bounce.x}return!0}},42717:(t,e,i)=>{var n=i(82268);t.exports=function(t,e,i,r){var s=n(t,e,i,r);if(i||0===s||t.immovable&&e.immovable||t.customSeparateY||e.customSeparateY)return 0!==s||t.embedded&&e.embedded;var o=t.velocity.y,a=e.velocity.y;if(t.immovable||e.immovable)t.immovable?(e.y+=s,e.velocity.y=o-a*e.bounce.y,t.moves&&(e.x+=(t.x-t.prev.x)*t.friction.x)):(t.y-=s,t.velocity.y=a-o*t.bounce.y,e.moves&&(t.x+=(e.x-e.prev.x)*e.friction.x));else{s*=.5,t.y-=s,e.y+=s;var h=Math.sqrt(a*a*e.mass/t.mass)*(a>0?1:-1),u=Math.sqrt(o*o*t.mass/e.mass)*(o>0?1:-1),l=.5*(h+u);h-=l,u-=l,t.velocity.y=l+h*t.bounce.y,e.velocity.y=l+u*e.bounce.y}return!0}},18137:(t,e,i)=>{var n=i(59623),r=i(47379),s=i(7365),o=i(38593),a=i(57148),h=new r({initialize:function(t,e){var i=e.displayWidth?e.displayWidth:64,n=e.displayHeight?e.displayHeight:64;this.world=t,this.gameObject=e,this.debugShowBody=t.defaults.debugShowStaticBody,this.debugBodyColor=t.defaults.staticBodyDebugColor,this.enable=!0,this.isCircle=!1,this.radius=0,this.offset=new a,this.position=new a(e.x-e.displayOriginX,e.y-e.displayOriginY),this.width=i,this.height=n,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center=new a(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.velocity=a.ZERO,this.allowGravity=!1,this.gravity=a.ZERO,this.bounce=a.ZERO,this.onWorldBounds=!1,this.onCollide=!1,this.onOverlap=!1,this.mass=1,this.immovable=!0,this.customSeparateX=!1,this.customSeparateY=!1,this.overlapX=0,this.overlapY=0,this.overlapR=0,this.embedded=!1,this.collideWorldBounds=!1,this.checkCollision={none:!1,up:!0,down:!0,left:!0,right:!0},this.touching={none:!0,up:!1,down:!1,left:!1,right:!1},this.wasTouching={none:!0,up:!1,down:!1,left:!1,right:!1},this.blocked={none:!0,up:!1,down:!1,left:!1,right:!1},this.physicsType=s.STATIC_BODY,this._dx=0,this._dy=0},setGameObject:function(t,e){return t&&t!==this.gameObject&&(this.gameObject.body=null,t.body=this,this.gameObject=t),e&&this.updateFromGameObject(),this},updateFromGameObject:function(){this.world.staticTree.remove(this);var t=this.gameObject;return t.getTopLeft(this.position),this.width=t.displayWidth,this.height=t.displayHeight,this.halfWidth=Math.abs(this.width/2),this.halfHeight=Math.abs(this.height/2),this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight),this.world.staticTree.insert(this),this},setOffset:function(t,e){return void 0===e&&(e=t),this.world.staticTree.remove(this),this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(t,e),this.position.x+=this.offset.x,this.position.y+=this.offset.y,this.updateCenter(),this.world.staticTree.insert(this),this},setSize:function(t,e,i){void 0===i&&(i=!0);var n=this.gameObject;if(!t&&n.frame&&(t=n.frame.realWidth),!e&&n.frame&&(e=n.frame.realHeight),this.world.staticTree.remove(this),this.width=t,this.height=e,this.halfWidth=Math.floor(t/2),this.halfHeight=Math.floor(e/2),i&&n.getCenter){var r=n.displayWidth/2,s=n.displayHeight/2;this.position.x-=this.offset.x,this.position.y-=this.offset.y,this.offset.set(r-this.halfWidth,s-this.halfHeight),this.position.x+=this.offset.x,this.position.y+=this.offset.y}return this.updateCenter(),this.isCircle=!1,this.radius=0,this.world.staticTree.insert(this),this},setCircle:function(t,e,i){return void 0===e&&(e=this.offset.x),void 0===i&&(i=this.offset.y),t>0?(this.world.staticTree.remove(this),this.isCircle=!0,this.radius=t,this.width=2*t,this.height=2*t,this.halfWidth=Math.floor(this.width/2),this.halfHeight=Math.floor(this.height/2),this.offset.set(e,i),this.updateCenter(),this.world.staticTree.insert(this)):this.isCircle=!1,this},updateCenter:function(){this.center.set(this.position.x+this.halfWidth,this.position.y+this.halfHeight)},reset:function(t,e){var i=this.gameObject;void 0===t&&(t=i.x),void 0===e&&(e=i.y),this.world.staticTree.remove(this),i.setPosition(t,e),i.getTopLeft(this.position),this.updateCenter(),this.world.staticTree.insert(this)},stop:function(){return this},getBounds:function(t){return t.x=this.x,t.y=this.y,t.right=this.right,t.bottom=this.bottom,t},hitTest:function(t,e){return this.isCircle?n(this,t,e):o(this,t,e)},postUpdate:function(){},deltaAbsX:function(){return 0},deltaAbsY:function(){return 0},deltaX:function(){return 0},deltaY:function(){return 0},deltaZ:function(){return 0},destroy:function(){this.enable=!1,this.world.pendingDestroy.set(this)},drawDebug:function(t){var e=this.position,i=e.x+this.halfWidth,n=e.y+this.halfHeight;this.debugShowBody&&(t.lineStyle(t.defaultStrokeWidth,this.debugBodyColor,1),this.isCircle?t.strokeCircle(i,n,this.width/2):t.strokeRect(e.x,e.y,this.width,this.height))},willDrawDebug:function(){return this.debugShowBody},setMass:function(t){return t<=0&&(t=.1),this.mass=t,this},x:{get:function(){return this.position.x},set:function(t){this.world.staticTree.remove(this),this.position.x=t,this.world.staticTree.insert(this)}},y:{get:function(){return this.position.y},set:function(t){this.world.staticTree.remove(this),this.position.y=t,this.world.staticTree.insert(this)}},left:{get:function(){return this.position.x}},right:{get:function(){return this.position.x+this.width}},top:{get:function(){return this.position.y}},bottom:{get:function(){return this.position.y+this.height}}});t.exports=h},73111:(t,e,i)=>{var n=i(44133),r=i(47379),s=i(7365),o=i(81769),a=i(55815),h=i(28621),u=new r({Extends:a,initialize:function(t,e,i,r){i||r?h(i)?(r=i,i=null,r.internalCreateCallback=this.createCallbackHandler,r.internalRemoveCallback=this.removeCallbackHandler,r.createMultipleCallback=this.createMultipleCallbackHandler,r.classType=o(r,"classType",n)):Array.isArray(i)&&h(i[0])&&(r=i,i=null,r.forEach((function(t){t.internalCreateCallback=this.createCallbackHandler,t.internalRemoveCallback=this.removeCallbackHandler,t.createMultipleCallback=this.createMultipleCallbackHandler,t.classType=o(t,"classType",n)}))):r={internalCreateCallback:this.createCallbackHandler,internalRemoveCallback:this.removeCallbackHandler,createMultipleCallback:this.createMultipleCallbackHandler,classType:n},this.world=t,this.physicsType=s.STATIC_BODY,a.call(this,e,i,r),this.type="StaticPhysicsGroup"},createCallbackHandler:function(t){t.body||this.world.enableBody(t,s.STATIC_BODY)},removeCallbackHandler:function(t){t.body&&this.world.disableBody(t)},createMultipleCallbackHandler:function(){this.refresh()},refresh:function(){for(var t=this.children.entries,e=0;e<t.length;e++)t[e].body.reset();return this}});t.exports=u},87573:(t,e,i)=>{var n=i(94772),r=i(90487),s=i(47379),o=i(61990),a=i(7365),h=i(73587),u=i(17168),l=i(72207),c=i(70077),d=i(60710),p=i(17373),f=i(83753),m=i(82268),v=i(86652),g=i(7674),y=i(66290),_=i(38092),x=i(41088),b=i(68808),w=i(30725),T=i(42717),M=i(69347),S=i(18137),E=i(77865),L=i(65492),A=i(57148),D=i(62951),P=new s({Extends:u,initialize:function(t,e){u.call(this),this.scene=t,this.bodies=new M,this.staticBodies=new M,this.pendingDestroy=new M,this.colliders=new g,this.gravity=new A(v(e,"gravity.x",0),v(e,"gravity.y",0)),this.bounds=new _(v(e,"x",0),v(e,"y",0),v(e,"width",t.sys.scale.width),v(e,"height",t.sys.scale.height)),this.checkCollision={up:v(e,"checkCollision.up",!0),down:v(e,"checkCollision.down",!0),left:v(e,"checkCollision.left",!0),right:v(e,"checkCollision.right",!0)},this.fps=v(e,"fps",60),this.fixedStep=!0,this._elapsed=0,this._frameTime=1/this.fps,this._frameTimeMS=1e3*this._frameTime,this.stepsLastFrame=0,this.timeScale=v(e,"timeScale",1),this.OVERLAP_BIAS=v(e,"overlapBias",4),this.TILE_BIAS=v(e,"tileBias",16),this.forceX=v(e,"forceX",!1),this.isPaused=v(e,"isPaused",!1),this._total=0,this.drawDebug=v(e,"debug",!1),this.debugGraphic,this.defaults={debugShowBody:v(e,"debugShowBody",!0),debugShowStaticBody:v(e,"debugShowStaticBody",!0),debugShowVelocity:v(e,"debugShowVelocity",!0),bodyDebugColor:v(e,"debugBodyColor",16711935),staticBodyDebugColor:v(e,"debugStaticBodyColor",255),velocityDebugColor:v(e,"debugVelocityColor",65280)},this.maxEntries=v(e,"maxEntries",16),this.useTree=v(e,"useTree",!0),this.tree=new x(this.maxEntries),this.staticTree=new x(this.maxEntries),this.treeMinMax={minX:0,minY:0,maxX:0,maxY:0},this._tempMatrix=new L,this._tempMatrix2=new L,this.drawDebug&&this.createDebugGraphic()},enable:function(t,e){void 0===e&&(e=a.DYNAMIC_BODY),Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i];if(n.isParent)for(var r=n.getChildren(),s=0;s<r.length;s++){var o=r[s];o.isParent?this.enable(o,e):this.enableBody(o,e)}else this.enableBody(n,e)}},enableBody:function(t,e){return void 0===e&&(e=a.DYNAMIC_BODY),t.body||(e===a.DYNAMIC_BODY?t.body=new n(this,t):e===a.STATIC_BODY&&(t.body=new S(this,t))),this.add(t.body),t},add:function(t){return t.physicsType===a.DYNAMIC_BODY?this.bodies.set(t):t.physicsType===a.STATIC_BODY&&(this.staticBodies.set(t),this.staticTree.insert(t)),t.enable=!0,t},disable:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e<t.length;e++){var i=t[e];if(i.isParent)for(var n=i.getChildren(),r=0;r<n.length;r++){var s=n[r];s.isParent?this.disable(s):this.disableBody(s.body)}else this.disableBody(i.body)}},disableBody:function(t){this.remove(t),t.enable=!1},remove:function(t){t.physicsType===a.DYNAMIC_BODY?(this.tree.remove(t),this.bodies.delete(t)):t.physicsType===a.STATIC_BODY&&(this.staticBodies.delete(t),this.staticTree.remove(t))},createDebugGraphic:function(){var t=this.scene.sys.add.graphics({x:0,y:0});return t.setDepth(Number.MAX_VALUE),this.debugGraphic=t,this.drawDebug=!0,t},setBounds:function(t,e,i,n,r,s,o,a){return this.bounds.setTo(t,e,i,n),void 0!==r&&this.setBoundsCollision(r,s,o,a),this},setBoundsCollision:function(t,e,i,n){return void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===i&&(i=!0),void 0===n&&(n=!0),this.checkCollision.left=t,this.checkCollision.right=e,this.checkCollision.up=i,this.checkCollision.down=n,this},pause:function(){return this.isPaused=!0,this.emit(l.PAUSE),this},resume:function(){return this.isPaused=!1,this.emit(l.RESUME),this},addCollider:function(t,e,i,n,r){void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i);var s=new o(this,!1,t,e,i,n,r);return this.colliders.add(s),s},addOverlap:function(t,e,i,n,r){void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i);var s=new o(this,!0,t,e,i,n,r);return this.colliders.add(s),s},removeCollider:function(t){return this.colliders.remove(t),this},setFPS:function(t){return this.fps=t,this._frameTime=1/this.fps,this._frameTimeMS=1e3*this._frameTime,this},update:function(t,e){if(!this.isPaused&&0!==this.bodies.size){var i,n,r=this._frameTime,s=this._frameTimeMS*this.timeScale;this._elapsed+=e;var o=this.bodies.entries,a=this._elapsed>=s;for(this.fixedStep||(r=.001*e,a=!0,this._elapsed=0),i=0;i<o.length;i++)(n=o[i]).enable&&n.preUpdate(a,r);if(a){this._elapsed-=s,this.stepsLastFrame=1,this.useTree&&(this.tree.clear(),this.tree.load(o));var h=this.colliders.update();for(i=0;i<h.length;i++){var u=h[i];u.active&&u.update()}this.emit(l.WORLD_STEP)}for(;this._elapsed>=s;)this._elapsed-=s,this.step(r)}},step:function(t){var e,i,n=this.bodies.entries,r=n.length;for(e=0;e<r;e++)(i=n[e]).enable&&i.update(t);this.useTree&&(this.tree.clear(),this.tree.load(n));var s=this.colliders.update();for(e=0;e<s.length;e++){var o=s[e];o.active&&o.update()}this.emit(l.WORLD_STEP),this.stepsLastFrame++},postUpdate:function(){var t,e,i=this.bodies.entries,n=i.length,r=this.bodies,s=this.staticBodies;if(this.stepsLastFrame)for(this.stepsLastFrame=0,t=0;t<n;t++)(e=i[t]).enable&&e.postUpdate();if(this.drawDebug){var o=this.debugGraphic;for(o.clear(),t=0;t<n;t++)(e=i[t]).willDrawDebug()&&e.drawDebug(o);for(n=(i=s.entries).length,t=0;t<n;t++)(e=i[t]).willDrawDebug()&&e.drawDebug(o)}var h=this.pendingDestroy;if(h.size>0){var u=this.tree,l=this.staticTree;for(n=(i=h.entries).length,t=0;t<n;t++)(e=i[t]).physicsType===a.DYNAMIC_BODY?(u.remove(e),r.delete(e)):e.physicsType===a.STATIC_BODY&&(l.remove(e),s.delete(e)),e.world=void 0,e.gameObject=void 0;h.clear()}},updateMotion:function(t,e){t.allowRotation&&this.computeAngularVelocity(t,e),this.computeVelocity(t,e)},computeAngularVelocity:function(t,e){var i=t.angularVelocity,n=t.angularAcceleration,s=t.angularDrag,o=t.maxAngular;n?i+=n*e:t.allowDrag&&s&&(d(i-(s*=e),0,.1)?i-=s:p(i+s,0,.1)?i+=s:i=0);var a=(i=r(i,-o,o))-t.angularVelocity;t.angularVelocity+=a,t.rotation+=t.angularVelocity*e},computeVelocity:function(t,e){var i=t.velocity.x,n=t.acceleration.x,s=t.drag.x,o=t.maxVelocity.x,a=t.velocity.y,h=t.acceleration.y,u=t.drag.y,l=t.maxVelocity.y,f=t.speed,m=t.maxSpeed,v=t.allowDrag,g=t.useDamping;t.allowGravity&&(i+=(this.gravity.x+t.gravity.x)*e,a+=(this.gravity.y+t.gravity.y)*e),n?i+=n*e:v&&s&&(g?(i*=s,f=Math.sqrt(i*i+a*a),c(f,0,.001)&&(i=0)):d(i-(s*=e),0,.01)?i-=s:p(i+s,0,.01)?i+=s:i=0),h?a+=h*e:v&&u&&(g?(a*=u,f=Math.sqrt(i*i+a*a),c(f,0,.001)&&(a=0)):d(a-(u*=e),0,.01)?a-=u:p(a+u,0,.01)?a+=u:a=0),i=r(i,-o,o),a=r(a,-l,l),t.velocity.set(i,a),m>-1&&f>m&&(t.velocity.normalize().scale(m),f=m),t.speed=f},separate:function(t,e,i,n,r){if(!t.enable||!e.enable||t.checkCollision.none||e.checkCollision.none||!this.intersects(t,e))return!1;if(i&&!1===i.call(n,t.gameObject,e.gameObject))return!1;if(t.isCircle&&e.isCircle)return this.separateCircle(t,e,r);if(t.isCircle!==e.isCircle){var s=t.isCircle?e:t,o=t.isCircle?t:e,a={x:s.x,y:s.y,right:s.right,bottom:s.bottom},h=o.center;if((h.y<a.y||h.y>a.bottom)&&(h.x<a.x||h.x>a.right))return this.separateCircle(t,e,r)}var u=!1,c=!1;this.forceX||Math.abs(this.gravity.y+t.gravity.y)<Math.abs(this.gravity.x+t.gravity.x)?(u=w(t,e,r,this.OVERLAP_BIAS),this.intersects(t,e)&&(c=T(t,e,r,this.OVERLAP_BIAS))):(c=T(t,e,r,this.OVERLAP_BIAS),this.intersects(t,e)&&(u=w(t,e,r,this.OVERLAP_BIAS)));var d=u||c;return d&&(r?(t.onOverlap||e.onOverlap)&&this.emit(l.OVERLAP,t.gameObject,e.gameObject,t,e):(t.onCollide||e.onCollide)&&this.emit(l.COLLIDE,t.gameObject,e.gameObject,t,e)),d},separateCircle:function(t,e,i,n){f(t,e,!1,n),m(t,e,!1,n);var r=0;if(t.isCircle!==e.isCircle){var s={x:e.isCircle?t.position.x:e.position.x,y:e.isCircle?t.position.y:e.position.y,right:e.isCircle?t.right:e.right,bottom:e.isCircle?t.bottom:e.bottom},o={x:t.isCircle?t.center.x:e.center.x,y:t.isCircle?t.center.y:e.center.y,radius:t.isCircle?t.halfWidth:e.halfWidth};o.y<s.y?o.x<s.x?r=h(o.x,o.y,s.x,s.y)-o.radius:o.x>s.right&&(r=h(o.x,o.y,s.right,s.y)-o.radius):o.y>s.bottom&&(o.x<s.x?r=h(o.x,o.y,s.x,s.bottom)-o.radius:o.x>s.right&&(r=h(o.x,o.y,s.right,s.bottom)-o.radius)),r*=-1}else r=t.halfWidth+e.halfWidth-h(t.center.x,t.center.y,e.center.x,e.center.y);if(i||0===r||t.immovable&&e.immovable||t.customSeparateX||e.customSeparateX)return 0!==r&&(t.onOverlap||e.onOverlap)&&this.emit(l.OVERLAP,t.gameObject,e.gameObject,t,e),0!==r;var a=t.center.x-e.center.x,u=t.center.y-e.center.y,c=Math.sqrt(Math.pow(a,2)+Math.pow(u,2)),d=(e.center.x-t.center.x)/c||0,p=(e.center.y-t.center.y)/c||0,v=2*(t.velocity.x*d+t.velocity.y*p-e.velocity.x*d-e.velocity.y*p)/(t.mass+e.mass);t.immovable||(t.velocity.x=t.velocity.x-v*t.mass*d,t.velocity.y=t.velocity.y-v*t.mass*p),e.immovable||(e.velocity.x=e.velocity.x+v*e.mass*d,e.velocity.y=e.velocity.y+v*e.mass*p);var g=e.velocity.x-t.velocity.x,y=e.velocity.y-t.velocity.y,_=Math.atan2(y,g),x=this._frameTime;return t.immovable||e.immovable||(r/=2),t.immovable||(t.x+=t.velocity.x*x-r*Math.cos(_),t.y+=t.velocity.y*x-r*Math.sin(_)),e.immovable||(e.x+=e.velocity.x*x+r*Math.cos(_),e.y+=e.velocity.y*x+r*Math.sin(_)),t.velocity.x*=t.bounce.x,t.velocity.y*=t.bounce.y,e.velocity.x*=e.bounce.x,e.velocity.y*=e.bounce.y,(t.onCollide||e.onCollide)&&this.emit(l.COLLIDE,t.gameObject,e.gameObject,t,e),!0},intersects:function(t,e){return t!==e&&(t.isCircle||e.isCircle?t.isCircle?e.isCircle?h(t.center.x,t.center.y,e.center.x,e.center.y)<=t.halfWidth+e.halfWidth:this.circleBodyIntersects(t,e):this.circleBodyIntersects(e,t):!(t.right<=e.position.x||t.bottom<=e.position.y||t.position.x>=e.right||t.position.y>=e.bottom))},circleBodyIntersects:function(t,e){var i=r(t.center.x,e.left,e.right),n=r(t.center.y,e.top,e.bottom);return(t.center.x-i)*(t.center.x-i)+(t.center.y-n)*(t.center.y-n)<=t.halfWidth*t.halfWidth},overlap:function(t,e,i,n,r){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i),this.collideObjects(t,e,i,n,r,!0)},collide:function(t,e,i,n,r){return void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i),this.collideObjects(t,e,i,n,r,!1)},collideObjects:function(t,e,i,n,r,s){var o,a;t.isParent&&void 0===t.physicsType&&(t=t.children.entries),e&&e.isParent&&void 0===e.physicsType&&(e=e.children.entries);var h=Array.isArray(t),u=Array.isArray(e);if(this._total=0,h||u)if(!h&&u)for(o=0;o<e.length;o++)this.collideHandler(t,e[o],i,n,r,s);else if(h&&!u)if(e)for(o=0;o<t.length;o++)this.collideHandler(t[o],e,i,n,r,s);else for(o=0;o<t.length;o++){var l=t[o];for(a=o+1;a<t.length;a++)o!==a&&this.collideHandler(l,t[a],i,n,r,s)}else for(o=0;o<t.length;o++)for(a=0;a<e.length;a++)this.collideHandler(t[o],e[a],i,n,r,s);else this.collideHandler(t,e,i,n,r,s);return this._total>0},collideHandler:function(t,e,i,n,r,s){if(void 0===e&&t.isParent)return this.collideGroupVsGroup(t,t,i,n,r,s);if(!t||!e)return!1;if(t.body){if(e.body)return this.collideSpriteVsSprite(t,e,i,n,r,s);if(e.isParent)return this.collideSpriteVsGroup(t,e,i,n,r,s);if(e.isTilemap)return this.collideSpriteVsTilemapLayer(t,e,i,n,r,s)}else if(t.isParent){if(e.body)return this.collideSpriteVsGroup(e,t,i,n,r,s);if(e.isParent)return this.collideGroupVsGroup(t,e,i,n,r,s);if(e.isTilemap)return this.collideGroupVsTilemapLayer(t,e,i,n,r,s)}else if(t.isTilemap){if(e.body)return this.collideSpriteVsTilemapLayer(e,t,i,n,r,s);if(e.isParent)return this.collideGroupVsTilemapLayer(e,t,i,n,r,s)}},collideSpriteVsSprite:function(t,e,i,n,r,s){return!(!t.body||!e.body)&&(this.separate(t.body,e.body,n,r,s)&&(i&&i.call(r,t,e),this._total++),!0)},collideSpriteVsGroup:function(t,e,i,n,r,s){var o,h,u,l=t.body;if(0!==e.length&&l&&l.enable&&!l.checkCollision.none)if(this.useTree){var c=this.treeMinMax;c.minX=l.left,c.minY=l.top,c.maxX=l.right,c.maxY=l.bottom;var d=e.physicsType===a.DYNAMIC_BODY?this.tree.search(c):this.staticTree.search(c);for(h=d.length,o=0;o<h;o++)l!==(u=d[o])&&u.enable&&!u.checkCollision.none&&e.contains(u.gameObject)&&this.separate(l,u,n,r,s)&&(i&&i.call(r,l.gameObject,u.gameObject),this._total++)}else{var p=e.getChildren(),f=e.children.entries.indexOf(t);for(h=p.length,o=0;o<h;o++)(u=p[o].body)&&o!==f&&u.enable&&this.separate(l,u,n,r,s)&&(i&&i.call(r,l.gameObject,u.gameObject),this._total++)}},collideGroupVsTilemapLayer:function(t,e,i,n,r,s){var o=t.getChildren();if(0===o.length)return!1;for(var a=!1,h=0;h<o.length;h++)o[h].body&&this.collideSpriteVsTilemapLayer(o[h],e,i,n,r,s)&&(a=!0);return a},collideTiles:function(t,e,i,n,r){return!(!t.body.enable||0===e.length)&&this.collideSpriteVsTilesHandler(t,e,i,n,r,!1,!1)},overlapTiles:function(t,e,i,n,r){return!(!t.body.enable||0===e.length)&&this.collideSpriteVsTilesHandler(t,e,i,n,r,!0,!1)},collideSpriteVsTilemapLayer:function(t,e,i,n,r,s){var o=t.body;if(!o.enable||o.checkCollision.none)return!1;var a=o.position.x,h=o.position.y,u=o.width,l=o.height,c=e.layer;if(c.tileWidth>c.baseTileWidth){var d=(c.tileWidth-c.baseTileWidth)*e.scaleX;a-=d,u+=d}c.tileHeight>c.baseTileHeight&&(l+=(c.tileHeight-c.baseTileHeight)*e.scaleY);var p=e.getTilesWithinWorldXY(a,h,u,l);return 0!==p.length&&this.collideSpriteVsTilesHandler(t,p,i,n,r,s,!0)},collideSpriteVsTilesHandler:function(t,e,i,n,r,s,o){for(var a,h,u=t.body,c={left:0,right:0,top:0,bottom:0},d=!1,p=0;p<e.length;p++)h=(a=e[p]).tilemapLayer,c.left=h.tileToWorldX(a.x),c.top=h.tileToWorldY(a.y),a.baseHeight!==a.height&&(c.top-=(a.height-a.baseHeight)*h.scaleY),c.right=c.left+a.width*h.scaleX,c.bottom=c.top+a.height*h.scaleY,E(c,u)&&(!n||n.call(r,t,a))&&y(a,t)&&(s||b(p,u,a,c,h,this.TILE_BIAS,o))&&(this._total++,d=!0,i&&i.call(r,t,a),s&&u.onOverlap?this.emit(l.TILE_OVERLAP,t,a,u):u.onCollide&&this.emit(l.TILE_COLLIDE,t,a,u));return d},collideGroupVsGroup:function(t,e,i,n,r,s){if(0!==t.length&&0!==e.length)for(var o=t.getChildren(),a=0;a<o.length;a++)this.collideSpriteVsGroup(o[a],e,i,n,r,s)},wrap:function(t,e){t.body?this.wrapObject(t,e):t.getChildren?this.wrapArray(t.getChildren(),e):Array.isArray(t)?this.wrapArray(t,e):this.wrapObject(t,e)},wrapArray:function(t,e){for(var i=0;i<t.length;i++)this.wrapObject(t[i],e)},wrapObject:function(t,e){void 0===e&&(e=0),t.x=D(t.x,this.bounds.left-e,this.bounds.right+e),t.y=D(t.y,this.bounds.top-e,this.bounds.bottom+e)},shutdown:function(){this.tree.clear(),this.staticTree.clear(),this.bodies.clear(),this.staticBodies.clear(),this.colliders.destroy(),this.removeAllListeners()},destroy:function(){this.shutdown(),this.scene=null}});t.exports=P},27243:t=>{t.exports={setAcceleration:function(t,e){return this.body.acceleration.set(t,e),this},setAccelerationX:function(t){return this.body.acceleration.x=t,this},setAccelerationY:function(t){return this.body.acceleration.y=t,this}}},30300:t=>{t.exports={setAngularVelocity:function(t){return this.body.angularVelocity=t,this},setAngularAcceleration:function(t){return this.body.angularAcceleration=t,this},setAngularDrag:function(t){return this.body.angularDrag=t,this}}},55464:t=>{t.exports={setBounce:function(t,e){return this.body.bounce.set(t,e),this},setBounceX:function(t){return this.body.bounce.x=t,this},setBounceY:function(t){return this.body.bounce.y=t,this},setCollideWorldBounds:function(t,e,i){return this.body.setCollideWorldBounds(t,e,i),this}}},4160:t=>{t.exports={setDebug:function(t,e,i){return this.debugShowBody=t,this.debugShowVelocity=e,this.debugBodyColor=i,this},setDebugBodyColor:function(t){return this.body.debugBodyColor=t,this},debugShowBody:{get:function(){return this.body.debugShowBody},set:function(t){this.body.debugShowBody=t}},debugShowVelocity:{get:function(){return this.body.debugShowVelocity},set:function(t){this.body.debugShowVelocity=t}},debugBodyColor:{get:function(){return this.body.debugBodyColor},set:function(t){this.body.debugBodyColor=t}}}},40260:t=>{t.exports={setDrag:function(t,e){return this.body.drag.set(t,e),this},setDragX:function(t){return this.body.drag.x=t,this},setDragY:function(t){return this.body.drag.y=t,this},setDamping:function(t){return this.body.useDamping=t,this}}},23638:t=>{var e={enableBody:function(t,e,i,n,r){return t&&this.body.reset(e,i),n&&(this.body.gameObject.active=!0),r&&(this.body.gameObject.visible=!0),this.body.enable=!0,this},disableBody:function(t,e){return void 0===t&&(t=!1),void 0===e&&(e=!1),this.body.stop(),this.body.enable=!1,t&&(this.body.gameObject.active=!1),e&&(this.body.gameObject.visible=!1),this},refreshBody:function(){return this.body.updateFromGameObject(),this}};t.exports=e},73490:t=>{t.exports={setFriction:function(t,e){return this.body.friction.set(t,e),this},setFrictionX:function(t){return this.body.friction.x=t,this},setFrictionY:function(t){return this.body.friction.y=t,this}}},28786:t=>{t.exports={setGravity:function(t,e){return this.body.gravity.set(t,e),this},setGravityX:function(t){return this.body.gravity.x=t,this},setGravityY:function(t){return this.body.gravity.y=t,this}}},60409:t=>{var e={setImmovable:function(t){return void 0===t&&(t=!0),this.body.immovable=t,this}};t.exports=e},19295:t=>{t.exports={setMass:function(t){return this.body.mass=t,this}}},79004:(t,e,i)=>{var n=i(82124),r=i(78265),s=i(71011),o=i(90866);t.exports=function(t,e,i,a,h,u){var l=n(t,e-a,i-a,2*a,2*a,h,u);if(0===l.length)return l;for(var c=new r(e,i,a),d=new r,p=[],f=0;f<l.length;f++){var m=l[f];m.isCircle?(d.setTo(m.center.x,m.center.y,m.halfWidth),s(c,d)&&p.push(m)):o(c,m)&&p.push(m)}return p}},82124:t=>{t.exports=function(t,e,i,n,r,s,o){void 0===s&&(s=!0),void 0===o&&(o=!1);var a=[],h=[],u=t.treeMinMax;if(u.minX=e,u.minY=i,u.maxX=e+n,u.maxY=i+r,o&&(h=t.staticTree.search(u)),s&&t.useTree)a=t.tree.search(u);else if(s){var l=t.bodies,c={position:{x:e,y:i},left:e,top:i,right:e+n,bottom:i+r,isCircle:!1},d=t.intersects;l.iterate((function(t){d(t,c)&&a.push(t)}))}return h.concat(a)}},38487:t=>{t.exports={setOffset:function(t,e){return this.body.setOffset(t,e),this},setSize:function(t,e,i){return this.body.setSize(t,e,i),this},setCircle:function(t,e,i){return this.body.setCircle(t,e,i),this}}},40799:t=>{t.exports={setVelocity:function(t,e){return this.body.setVelocity(t,e),this},setVelocityX:function(t){return this.body.setVelocityX(t),this},setVelocityY:function(t){return this.body.setVelocityY(t),this},setMaxVelocity:function(t,e){return this.body.maxVelocity.set(t,e),this}}},14682:(t,e,i)=>{t.exports={Acceleration:i(27243),Angular:i(30300),Bounce:i(55464),Debug:i(4160),Drag:i(40260),Enable:i(23638),Friction:i(73490),Gravity:i(28786),Immovable:i(60409),Mass:i(19295),Size:i(38487),Velocity:i(40799)}},7365:t=>{t.exports={DYNAMIC_BODY:0,STATIC_BODY:1,GROUP:2,TILEMAPLAYER:3,FACING_NONE:10,FACING_UP:11,FACING_DOWN:12,FACING_LEFT:13,FACING_RIGHT:14}},77826:t=>{t.exports="collide"},8044:t=>{t.exports="overlap"},37874:t=>{t.exports="pause"},14966:t=>{t.exports="resume"},24256:t=>{t.exports="tilecollide"},1620:t=>{t.exports="tileoverlap"},58641:t=>{t.exports="worldbounds"},35487:t=>{t.exports="worldstep"},72207:(t,e,i)=>{t.exports={COLLIDE:i(77826),OVERLAP:i(8044),PAUSE:i(37874),RESUME:i(14966),TILE_COLLIDE:i(24256),TILE_OVERLAP:i(1620),WORLD_BOUNDS:i(58641),WORLD_STEP:i(35487)}},88869:(t,e,i)=>{var n=i(7365),r=i(80933),s={ArcadePhysics:i(47653),Body:i(94772),Collider:i(61990),Components:i(14682),Events:i(72207),Factory:i(29548),Group:i(50143),Image:i(89428),Sprite:i(44133),StaticBody:i(18137),StaticGroup:i(73111),World:i(87573)};s=r(!1,s,n),t.exports=s},66290:t=>{t.exports=function(t,e){return t.collisionCallback?!t.collisionCallback.call(t.collisionCallbackContext,e,t):!t.layer.callbacks[t.index]||!t.layer.callbacks[t.index].callback.call(t.layer.callbacks[t.index].callbackContext,e,t)}},39264:t=>{t.exports=function(t,e){e<0?(t.blocked.none=!1,t.blocked.left=!0):e>0&&(t.blocked.none=!1,t.blocked.right=!0),t.position.x-=e,0===t.bounce.x?t.velocity.x=0:t.velocity.x=-t.velocity.x*t.bounce.x}},50301:t=>{t.exports=function(t,e){e<0?(t.blocked.none=!1,t.blocked.up=!0):e>0&&(t.blocked.none=!1,t.blocked.down=!0),t.position.y-=e,0===t.bounce.y?t.velocity.y=0:t.velocity.y=-t.velocity.y*t.bounce.y}},68808:(t,e,i)=>{var n=i(62036),r=i(40937),s=i(77865);t.exports=function(t,e,i,o,a,h,u){var l=o.left,c=o.top,d=o.right,p=o.bottom,f=i.faceLeft||i.faceRight,m=i.faceTop||i.faceBottom;if(u||(f=!0,m=!0),!f&&!m)return!1;var v=0,g=0,y=0,_=1;if(e.deltaAbsX()>e.deltaAbsY()?y=-1:e.deltaAbsX()<e.deltaAbsY()&&(_=-1),0!==e.deltaX()&&0!==e.deltaY()&&f&&m&&(y=Math.min(Math.abs(e.position.x-d),Math.abs(e.right-l)),_=Math.min(Math.abs(e.position.y-p),Math.abs(e.bottom-c))),y<_){if(f&&0!==(v=n(e,i,l,d,h,u))&&!s(o,e))return!0;m&&(g=r(e,i,c,p,h,u))}else{if(m&&0!==(g=r(e,i,c,p,h,u))&&!s(o,e))return!0;f&&(v=n(e,i,l,d,h,u))}return 0!==v||0!==g}},62036:(t,e,i)=>{var n=i(39264);t.exports=function(t,e,i,r,s,o){var a=0,h=e.faceLeft,u=e.faceRight,l=e.collideLeft,c=e.collideRight;return o||(h=!0,u=!0,l=!0,c=!0),t.deltaX()<0&&c&&t.checkCollision.left?u&&t.x<r&&(a=t.x-r)<-s&&(a=0):t.deltaX()>0&&l&&t.checkCollision.right&&h&&t.right>i&&(a=t.right-i)>s&&(a=0),0!==a&&(t.customSeparateX?t.overlapX=a:n(t,a)),a}},40937:(t,e,i)=>{var n=i(50301);t.exports=function(t,e,i,r,s,o){var a=0,h=e.faceTop,u=e.faceBottom,l=e.collideUp,c=e.collideDown;return o||(h=!0,u=!0,l=!0,c=!0),t.deltaY()<0&&c&&t.checkCollision.up?u&&t.y<r&&(a=t.y-r)<-s&&(a=0):t.deltaY()>0&&l&&t.checkCollision.down&&h&&t.bottom>i&&(a=t.bottom-i)>s&&(a=0),0!==a&&(t.customSeparateY?t.overlapY=a:n(t,a)),a}},77865:t=>{t.exports=function(t,e){return!(e.right<=t.left||e.bottom<=t.top||e.position.x>=t.right||e.position.y>=t.bottom)}},34775:(t,e,i)=>{t.exports={Arcade:i(88869),Matter:i(23903)}},34862:(t,e,i)=>{var n=i(47379),r=i(57148),s=new n({initialize:function(){this.boundsCenter=new r,this.centerDiff=new r},parseBody:function(t){if(!(t=t.hasOwnProperty("body")?t.body:t).hasOwnProperty("bounds")||!t.hasOwnProperty("centerOfMass"))return!1;var e=this.boundsCenter,i=this.centerDiff,n=t.bounds.max.x-t.bounds.min.x,r=t.bounds.max.y-t.bounds.min.y,s=n*t.centerOfMass.x,o=r*t.centerOfMass.y;return e.set(n/2,r/2),i.set(s-e.x,o-e.y),!0},getTopLeft:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e+n.x+s.x,i+n.y+s.y)}return!1},getTopCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e+s.x,i+n.y+s.y)}return!1},getTopRight:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e-(n.x-s.x),i+n.y+s.y)}return!1},getLeftCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e+n.x+s.x,i+s.y)}return!1},getCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.centerDiff;return new r(e+n.x,i+n.y)}return!1},getRightCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e-(n.x-s.x),i+s.y)}return!1},getBottomLeft:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e+n.x+s.x,i-(n.y-s.y))}return!1},getBottomCenter:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e+s.x,i-(n.y-s.y))}return!1},getBottomRight:function(t,e,i){if(void 0===e&&(e=0),void 0===i&&(i=0),this.parseBody(t)){var n=this.boundsCenter,s=this.centerDiff;return new r(e-(n.x-s.x),i-(n.y-s.y))}return!1}});t.exports=s},97461:(t,e,i)=>{var n=i(66995);n.Body=i(32663),n.Composite=i(69643),n.World=i(36606),n.Detector=i(17964),n.Grid=i(88424),n.Pairs=i(31796),n.Pair=i(37849),n.Query=i(44542),n.Resolver=i(28720),n.SAT=i(3946),n.Constraint=i(69436),n.Common=i(13991),n.Engine=i(10153),n.Events=i(84900),n.Sleeping=i(59114),n.Plugin=i(41880),n.Bodies=i(41422),n.Composites=i(36162),n.Axes=i(58383),n.Bounds=i(17983),n.Svg=i(34968),n.Vector=i(39646),n.Vertices=i(65714),n.World.add=n.Composite.add,n.World.remove=n.Composite.remove,n.World.addComposite=n.Composite.addComposite,n.World.addBody=n.Composite.addBody,n.World.addConstraint=n.Composite.addConstraint,n.World.clear=n.Composite.clear,t.exports=n},22718:(t,e,i)=>{var n=i(41422),r=i(47379),s=i(36162),o=i(69436),a=i(34968),h=i(20312),u=i(21372),l=i(1731),c=i(57564),d=i(49765),p=i(88470),f=i(58691),m=i(65714),v=new r({initialize:function(t){this.world=t,this.scene=t.scene,this.sys=t.scene.sys},rectangle:function(t,e,i,r,s){var o=n.rectangle(t,e,i,r,s);return this.world.add(o),o},trapezoid:function(t,e,i,r,s,o){var a=n.trapezoid(t,e,i,r,s,o);return this.world.add(a),a},circle:function(t,e,i,r,s){var o=n.circle(t,e,i,r,s);return this.world.add(o),o},polygon:function(t,e,i,r,s){var o=n.polygon(t,e,i,r,s);return this.world.add(o),o},fromVertices:function(t,e,i,r,s,o,a){"string"==typeof i&&(i=m.fromPath(i));var h=n.fromVertices(t,e,i,r,s,o,a);return this.world.add(h),h},fromPhysicsEditor:function(t,e,i,n,r){void 0===r&&(r=!0);var s=d.parseBody(t,e,i,n);return r&&!this.world.has(s)&&this.world.add(s),s},fromSVG:function(t,e,i,r,s,o){void 0===r&&(r=1),void 0===s&&(s={}),void 0===o&&(o=!0);for(var h=i.getElementsByTagName("path"),u=[],l=0;l<h.length;l++){var c=a.pathToVertices(h[l],30);1!==r&&m.scale(c,r,r),u.push(c)}var d=n.fromVertices(t,e,u,s);return o&&this.world.add(d),d},fromJSON:function(t,e,i,n,r){void 0===n&&(n={}),void 0===r&&(r=!0);var s=p.parseBody(t,e,i,n);return s&&r&&this.world.add(s),s},imageStack:function(t,e,i,n,r,o,a,h,l){void 0===a&&(a=0),void 0===h&&(h=0),void 0===l&&(l={});var c=this.world,d=this.sys.displayList;l.addToWorld=!1;var p=s.stack(i,n,r,o,a,h,(function(i,n){var r=new u(c,i,n,t,e,l);return d.add(r),r.body}));return c.add(p),p},stack:function(t,e,i,n,r,o,a){var h=s.stack(t,e,i,n,r,o,a);return this.world.add(h),h},pyramid:function(t,e,i,n,r,o,a){var h=s.pyramid(t,e,i,n,r,o,a);return this.world.add(h),h},chain:function(t,e,i,n,r,o){return s.chain(t,e,i,n,r,o)},mesh:function(t,e,i,n,r){return s.mesh(t,e,i,n,r)},newtonsCradle:function(t,e,i,n,r){var o=s.newtonsCradle(t,e,i,n,r);return this.world.add(o),o},car:function(t,e,i,n,r){var o=s.car(t,e,i,n,r);return this.world.add(o),o},softBody:function(t,e,i,n,r,o,a,h,u,l){var c=s.softBody(t,e,i,n,r,o,a,h,u,l);return this.world.add(c),c},joint:function(t,e,i,n,r){return this.constraint(t,e,i,n,r)},spring:function(t,e,i,n,r){return this.constraint(t,e,i,n,r)},constraint:function(t,e,i,n,r){void 0===n&&(n=1),void 0===r&&(r={}),r.bodyA="body"===t.type?t:t.body,r.bodyB="body"===e.type?e:e.body,isNaN(i)||(r.length=i),r.stiffness=n;var s=o.create(r);return this.world.add(s),s},worldConstraint:function(t,e,i,n){void 0===i&&(i=1),void 0===n&&(n={}),n.bodyB="body"===t.type?t:t.body,isNaN(e)||(n.length=e),n.stiffness=i;var r=o.create(n);return this.world.add(r),r},mouseSpring:function(t){return this.pointerConstraint(t)},pointerConstraint:function(t){void 0===t&&(t={}),t.hasOwnProperty("render")||(t.render={visible:!1});var e=new f(this.scene,this.world,t);return this.world.add(e.constraint),e},image:function(t,e,i,n,r){var s=new u(this.world,t,e,i,n,r);return this.sys.displayList.add(s),s},tileBody:function(t,e){return new c(this.world,t,e)},sprite:function(t,e,i,n,r){var s=new l(this.world,t,e,i,n,r);return this.sys.displayList.add(s),this.sys.updateList.add(s),s},gameObject:function(t,e,i){return h(this.world,t,e,i)},destroy:function(){this.world=null,this.scene=null,this.sys=null}});t.exports=v},20312:(t,e,i)=>{var n=i(86845),r=i(81769),s=i(57148);t.exports=function(t,e,i,o){void 0===i&&(i={}),void 0===o&&(o=!0);var a=e.x,h=e.y;if(e.body={temp:!0,position:{x:a,y:h}},[n.Bounce,n.Collision,n.Force,n.Friction,n.Gravity,n.Mass,n.Sensor,n.SetBody,n.Sleep,n.Static,n.Transform,n.Velocity].forEach((function(t){for(var i in t)(n=t[i]).get&&"function"==typeof n.get||n.set&&"function"==typeof n.set?Object.defineProperty(e,i,{get:t[i].get,set:t[i].set}):Object.defineProperty(e,i,{value:t[i]});var n})),e.world=t,e._tempVec2=new s(a,h),i.hasOwnProperty("type")&&"body"===i.type)e.setExistingBody(i,o);else{var u=r(i,"shape",null);u||(u="rectangle"),i.addToWorld=o,e.setBody(u,i)}return e}},21372:(t,e,i)=>{var n=i(47379),r=i(86845),s=i(90554),o=i(81769),a=i(59525),h=i(76923),u=i(57148),l=new n({Extends:a,Mixins:[r.Bounce,r.Collision,r.Force,r.Friction,r.Gravity,r.Mass,r.Sensor,r.SetBody,r.Sleep,r.Static,r.Transform,r.Velocity,h],initialize:function(t,e,i,n,r,a){s.call(this,t.scene,"Image"),this.setTexture(n,r),this.setSizeToFrame(),this.setOrigin(),this.world=t,this._tempVec2=new u(e,i);var h=o(a,"shape",null);h?this.setBody(h,a):this.setRectangle(this.width,this.height,a),this.setPosition(e,i),this.initPipeline("TextureTintPipeline")}});t.exports=l},96506:(t,e,i)=>{var n=i(1174),r=i(58383),s=i(41422),o=i(32663),a=i(34862),h=i(17983),u=i(47379),l=i(69643),c=i(36162),d=i(69436),p=i(17964),f=i(73587),m=i(22718),v=i(81769),g=i(86652),y=i(88424),_=i(94323),x=i(35169),b=i(66995),w=i(98439),T=i(92974),M=i(37849),S=i(31796),E=i(41880),L=i(50354),A=i(44542),D=i(28720),P=i(3946),C=i(88637),O=i(34968),k=i(39646),R=i(65714),I=i(41491),Y=new u({initialize:function(t){this.scene=t,this.systems=t.sys,this.config=this.getConfig(),this.world,this.add,this.bodyBounds,this.body=o,this.composite=l,this.detector=p,this.grid=y,this.pair=M,this.pairs=S,this.query=A,this.resolver=D,this.sat=P,this.constraint=d,this.bodies=s,this.composites=c,this.axes=r,this.bounds=h,this.svg=O,this.vector=k,this.vertices=R,this.verts=R,this._tempVec2=k.create(),g(this.config,"plugins.collisionevents",!0)&&this.enableCollisionEventsPlugin(),g(this.config,"plugins.attractors",!1)&&this.enableAttractorPlugin(),g(this.config,"plugins.wrap",!1)&&this.enableWrapPlugin(),D._restingThresh=g(this.config,"restingThresh",4),D._restingThreshTangent=g(this.config,"restingThreshTangent",6),D._positionDampen=g(this.config,"positionDampen",.9),D._positionWarming=g(this.config,"positionWarming",.8),D._frictionNormalMultiplier=g(this.config,"frictionNormalMultiplier",5),t.sys.events.once(C.BOOT,this.boot,this),t.sys.events.on(C.START,this.start,this)},boot:function(){this.world=new I(this.scene,this.config),this.add=new m(this.world),this.bodyBounds=new a,this.systems.events.once(C.DESTROY,this.destroy,this)},start:function(){this.world||(this.world=new I(this.scene,this.config),this.add=new m(this.world));var t=this.systems.events;t.on(C.UPDATE,this.world.update,this.world),t.on(C.POST_UPDATE,this.world.postUpdate,this.world),t.once(C.SHUTDOWN,this.shutdown,this)},getConfig:function(){var t=this.systems.game.config.physics,e=this.systems.settings.physics;return T(v(e,"matter",{}),v(t,"matter",{}))},enableAttractorPlugin:function(){return E.register(_),E.use(b,_),this},enableWrapPlugin:function(){return E.register(w),E.use(b,w),this},enableCollisionEventsPlugin:function(){return E.register(x),E.use(b,x),this},pause:function(){return this.world.pause()},resume:function(){return this.world.resume()},set60Hz:function(){return this.world.getDelta=this.world.update60Hz,this.world.autoUpdate=!0,this},set30Hz:function(){return this.world.getDelta=this.world.update30Hz,this.world.autoUpdate=!0,this},step:function(t,e){this.world.step(t,e)},containsPoint:function(t,e,i){t=this.getMatterBodies(t);var n=k.create(e,i);return A.point(t,n).length>0},intersectPoint:function(t,e,i){i=this.getMatterBodies(i);var n=k.create(t,e),r=[];return A.point(i,n).forEach((function(t){-1===r.indexOf(t)&&r.push(t)})),r},intersectRect:function(t,e,i,n,r,s){void 0===r&&(r=!1),s=this.getMatterBodies(s);var o={min:{x:t,y:e},max:{x:t+i,y:e+n}},a=[];return A.region(s,o,r).forEach((function(t){-1===a.indexOf(t)&&a.push(t)})),a},intersectRay:function(t,e,i,n,r,s){void 0===r&&(r=1),s=this.getMatterBodies(s);for(var o=[],a=A.ray(s,k.create(t,e),k.create(i,n),r),h=0;h<a.length;h++)o.push(a[h].body);return o},intersectBody:function(t,e){e=this.getMatterBodies(e);for(var i=[],n=A.collides(t,e),r=0;r<n.length;r++){var s=n[r];s.bodyA===t?i.push(s.bodyB):i.push(s.bodyA)}return i},overlap:function(t,e,i,n,r){void 0===i&&(i=null),void 0===n&&(n=null),void 0===r&&(r=i),Array.isArray(t)||(t=[t]),t=this.getMatterBodies(t),e=this.getMatterBodies(e);for(var s=!1,o=0;o<t.length;o++)for(var a=t[o],h=A.collides(a,e),u=0;u<h.length;u++){var l=h[u],c=l.bodyA.id===a.id?l.bodyB:l.bodyA;if(!n||n.call(r,a,c,l))if(s=!0,i)i.call(r,a,c,l);else if(!n)return!0}return s},setCollisionCategory:function(t,e){return(t=this.getMatterBodies(t)).forEach((function(t){t.collisionFilter.category=e})),this},setCollisionGroup:function(t,e){return(t=this.getMatterBodies(t)).forEach((function(t){t.collisionFilter.group=e})),this},setCollidesWith:function(t,e){t=this.getMatterBodies(t);var i=0;if(Array.isArray(e))for(var n=0;n<e.length;n++)i|=e[n];else i=e;return t.forEach((function(t){t.collisionFilter.mask=i})),this},getMatterBodies:function(t){if(!t)return this.world.getAllBodies();Array.isArray(t)||(t=[t]);for(var e=[],i=0;i<t.length;i++){var n=t[i].hasOwnProperty("body")?t[i].body:t[i];e.push(n)}return e},setVelocity:function(t,e,i){t=this.getMatterBodies(t);var n=this._tempVec2;return n.x=e,n.y=i,t.forEach((function(t){o.setVelocity(t,n)})),this},setVelocityX:function(t,e){t=this.getMatterBodies(t);var i=this._tempVec2;return i.x=e,t.forEach((function(t){i.y=t.velocity.y,o.setVelocity(t,i)})),this},setVelocityY:function(t,e){t=this.getMatterBodies(t);var i=this._tempVec2;return i.y=e,t.forEach((function(t){i.x=t.velocity.x,o.setVelocity(t,i)})),this},setAngularVelocity:function(t,e){return(t=this.getMatterBodies(t)).forEach((function(t){o.setAngularVelocity(t,e)})),this},applyForce:function(t,e){t=this.getMatterBodies(t);var i=this._tempVec2;return t.forEach((function(t){i.x=t.position.x,i.y=t.position.y,o.applyForce(t,i,e)})),this},applyForceFromPosition:function(t,e,i,n){t=this.getMatterBodies(t);var r=this._tempVec2;return t.forEach((function(t){void 0===n&&(n=t.angle),r.x=i*Math.cos(n),r.y=i*Math.sin(n),o.applyForce(t,e,r)})),this},applyForceFromAngle:function(t,e,i){t=this.getMatterBodies(t);var n=this._tempVec2;return t.forEach((function(t){void 0===i&&(i=t.angle),n.x=e*Math.cos(i),n.y=e*Math.sin(i),o.applyForce(t,{x:t.position.x,y:t.position.y},n)})),this},getConstraintLength:function(t){var e=t.pointA.x,i=t.pointA.y,n=t.pointB.x,r=t.pointB.y;return t.bodyA&&(e+=t.bodyA.position.x,i+=t.bodyA.position.y),t.bodyB&&(n+=t.bodyB.position.x,r+=t.bodyB.position.y),f(e,i,n,r)},alignBody:function(t,e,i,r){var s;switch(t=t.hasOwnProperty("body")?t.body:t,r){case n.TOP_LEFT:case n.LEFT_TOP:s=this.bodyBounds.getTopLeft(t,e,i);break;case n.TOP_CENTER:s=this.bodyBounds.getTopCenter(t,e,i);break;case n.TOP_RIGHT:case n.RIGHT_TOP:s=this.bodyBounds.getTopRight(t,e,i);break;case n.LEFT_CENTER:s=this.bodyBounds.getLeftCenter(t,e,i);break;case n.CENTER:s=this.bodyBounds.getCenter(t,e,i);break;case n.RIGHT_CENTER:s=this.bodyBounds.getRightCenter(t,e,i);break;case n.LEFT_BOTTOM:case n.BOTTOM_LEFT:s=this.bodyBounds.getBottomLeft(t,e,i);break;case n.BOTTOM_CENTER:s=this.bodyBounds.getBottomCenter(t,e,i);break;case n.BOTTOM_RIGHT:case n.RIGHT_BOTTOM:s=this.bodyBounds.getBottomRight(t,e,i)}return s&&o.setPosition(t,s),this},shutdown:function(){var t=this.systems.events;this.world&&(t.off(C.UPDATE,this.world.update,this.world),t.off(C.POST_UPDATE,this.world.postUpdate,this.world)),t.off(C.SHUTDOWN,this.shutdown,this),this.add&&this.add.destroy(),this.world&&this.world.destroy(),this.add=null,this.world=null},destroy:function(){this.shutdown(),this.scene.sys.events.off(C.START,this.start,this),this.scene=null,this.systems=null}});L.register("MatterPhysics",Y,"matterPhysics"),t.exports=Y},1731:(t,e,i)=>{var n=i(23765),r=i(47379),s=i(86845),o=i(90554),a=i(81769),h=i(76923),u=i(95681),l=i(57148),c=new r({Extends:u,Mixins:[s.Bounce,s.Collision,s.Force,s.Friction,s.Gravity,s.Mass,s.Sensor,s.SetBody,s.Sleep,s.Static,s.Transform,s.Velocity,h],initialize:function(t,e,i,r,s,h){o.call(this,t.scene,"Sprite"),this.anims=new n(this),this.setTexture(r,s),this.setSizeToFrame(),this.setOrigin(),this.world=t,this._tempVec2=new l(e,i);var u=a(h,"shape",null);u?this.setBody(u,h):this.setRectangle(this.width,this.height,h),this.setPosition(e,i),this.initPipeline("TextureTintPipeline")}});t.exports=c},57564:(t,e,i)=>{var n=i(41422),r=i(32663),s=i(47379),o=i(86845),a=i(17168),h=i(81769),u=i(64036),l=i(65714),c=new s({Extends:a,Mixins:[o.Bounce,o.Collision,o.Friction,o.Gravity,o.Mass,o.Sensor,o.Sleep,o.Static],initialize:function(t,e,i){a.call(this),this.tile=e,this.world=t,e.physics.matterBody&&e.physics.matterBody.destroy(),e.physics.matterBody=this;var n=h(i,"body",null),r=h(i,"addToWorld",!0);if(n)this.setBody(n,r);else{var s=e.getCollisionGroup();h(s,"objects",[]).length>0?this.setFromTileCollision(i):this.setFromTileRectangle(i)}},setFromTileRectangle:function(t){void 0===t&&(t={}),u(t,"isStatic")||(t.isStatic=!0),u(t,"addToWorld")||(t.addToWorld=!0);var e=this.tile.getBounds(),i=e.x+e.width/2,r=e.y+e.height/2,s=n.rectangle(i,r,e.width,e.height,t);return this.setBody(s,t.addToWorld),this},setFromTileCollision:function(t){void 0===t&&(t={}),u(t,"isStatic")||(t.isStatic=!0),u(t,"addToWorld")||(t.addToWorld=!0);for(var e=this.tile.tilemapLayer.scaleX,i=this.tile.tilemapLayer.scaleY,s=this.tile.getLeft(),o=this.tile.getTop(),a=this.tile.getCollisionGroup(),c=h(a,"objects",[]),d=[],p=0;p<c.length;p++){var f=c[p],m=s+f.x*e,v=o+f.y*i,g=f.width*e,y=f.height*i,_=null;if(f.rectangle)_=n.rectangle(m+g/2,v+y/2,g,y,t);else if(f.ellipse)_=n.circle(m+g/2,v+y/2,g/2,t);else if(f.polygon||f.polyline){var x=(f.polygon?f.polygon:f.polyline).map((function(t){return{x:t.x*e,y:t.y*i}})),b=l.create(x),w=l.centre(b);m+=w.x,v+=w.y,_=n.fromVertices(m,v,b,t)}_&&d.push(_)}return 1===d.length?this.setBody(d[0],t.addToWorld):d.length>1&&(t.parts=d,this.setBody(r.create(t),t.addToWorld)),this},setBody:function(t,e){return void 0===e&&(e=!0),this.body&&this.removeBody(),this.body=t,this.body.gameObject=this,e&&this.world.add(this.body),this},removeBody:function(){return this.body&&(this.world.remove(this.body),this.body.gameObject=void 0,this.body=void 0),this},destroy:function(){this.removeBody(),this.tile.physics.matterBody=void 0,this.removeAllListeners()}});t.exports=c},49765:(t,e,i)=>{var n=i(41422),r=i(32663),s=i(13991),o=i(81769),a=i(65714),h={parseBody:function(t,e,i,n){void 0===n&&(n={});for(var a=o(i,"fixtures",[]),h=[],u=0;u<a.length;u++)for(var l=this.parseFixture(a[u]),c=0;c<l.length;c++)h.push(l[c]);var d=s.clone(i,!0);s.extend(d,n,!0),delete d.fixtures,delete d.type;var p=r.create(d);return r.setParts(p,h),r.setPosition(p,{x:t,y:e}),p},parseFixture:function(t){var e,i=s.extend({},!1,t);if(delete i.circle,delete i.vertices,t.circle){var r=o(t.circle,"x"),a=o(t.circle,"y"),h=o(t.circle,"radius");e=[n.circle(r,a,h,i)]}else t.vertices&&(e=this.parseVertices(t.vertices,i));return e},parseVertices:function(t,e){void 0===e&&(e={});for(var i=[],o=0;o<t.length;o++)a.clockwiseSort(t[o]),i.push(r.create(s.extend({position:a.centre(t[o]),vertices:t[o]},e)));return n.flagCoincidentParts(i)}};t.exports=h},88470:(t,e,i)=>{var n=i(41422),r=i(32663),s={parseBody:function(t,e,i,s){var o;void 0===s&&(s={});var a=i.vertices;if(1===a.length)s.vertices=a[0],o=r.create(s),n.flagCoincidentParts(o.parts);else{for(var h=[],u=0;u<a.length;u++){var l=r.create({vertices:a[u]});h.push(l)}n.flagCoincidentParts(h),s.parts=h,o=r.create(s)}return o.label=i.label,r.setPosition(o,{x:t,y:e}),o}};t.exports=s},58691:(t,e,i)=>{var n=i(17983),r=i(47379),s=i(69643),o=i(69436),a=i(17964),h=i(52712),u=i(22620),l=i(92974),c=i(59114),d=i(57148),p=i(65714),f=new r({initialize:function(t,e,i){void 0===i&&(i={});this.scene=t,this.world=e,this.camera=null,this.pointer=null,this.active=!0,this.position=new d,this.body=null,this.part=null,this.constraint=o.create(l(i,{label:"Pointer Constraint",pointA:{x:0,y:0},pointB:{x:0,y:0},length:.01,stiffness:.1,angularStiffness:1,collisionFilter:{category:1,mask:4294967295,group:0}})),this.world.on(h.BEFORE_UPDATE,this.update,this),t.sys.input.on(u.POINTER_DOWN,this.onDown,this),t.sys.input.on(u.POINTER_UP,this.onUp,this)},onDown:function(t){this.pointer||(this.pointer=t,this.camera=t.camera)},onUp:function(t){t===this.pointer&&(this.pointer=null)},getBody:function(t){var e=this.position,i=this.constraint;this.camera.getWorldPoint(t.x,t.y,e);for(var r=s.allBodies(this.world.localWorld),o=0;o<r.length;o++){var u=r[o];if(!u.ignorePointer&&n.contains(u.bounds,e)&&a.canCollide(u.collisionFilter,i.collisionFilter)&&this.hitTestBody(u,e))return this.world.emit(h.DRAG_START,u,this.part,this),!0}return!1},hitTestBody:function(t,e){for(var i=this.constraint,n=t.parts.length,r=n>1?1:0;r<n;r++){var s=t.parts[r];if(p.contains(s.vertices,e))return i.pointA=e,i.pointB={x:e.x-t.position.x,y:e.y-t.position.y},i.bodyB=t,i.angleB=t.angle,c.set(t,!1),this.part=s,this.body=t,!0}return!1},update:function(){var t=this.pointer,e=this.body;if(this.active&&t)if(t.isDown||!e){if(t.isDown){if(!e&&!this.getBody(t))return;e=this.body;var i=this.position,n=this.constraint;this.camera.getWorldPoint(t.x,t.y,i),n.pointA.x=i.x,n.pointA.y=i.y,c.set(e,!1),this.world.emit(h.DRAG,e,this)}}else this.stopDrag();else e&&this.stopDrag()},stopDrag:function(){var t=this.body,e=this.constraint;e.bodyB=null,e.pointB=null,this.pointer=null,this.body=null,this.part=null,t&&this.world.emit(h.DRAG_END,t,this)},destroy:function(){this.world.removeConstraint(this.constraint),this.pointer=null,this.constraint=null,this.body=null,this.part=null,this.world.off(h.BEFORE_UPDATE,this.update),this.scene.sys.input.off(u.POINTER_DOWN,this.onDown,this),this.scene.sys.input.off(u.POINTER_UP,this.onUp,this)}});t.exports=f},41491:(t,e,i)=>{var n=i(41422),r=i(32663),s=i(47379),o=i(13991),a=i(69643),h=i(10153),u=i(17168),l=i(52712),c=i(81769),d=i(86652),p=i(32663),f=i(84900),m=i(57564),v=i(36606),g=i(39646),y=new s({Extends:u,initialize:function(t,e){u.call(this),this.scene=t,this.engine=h.create(e),this.localWorld=this.engine.world;var i=d(e,"gravity",null);i?this.setGravity(i.x,i.y,i.scale):!1===i&&this.setGravity(0,0,0),this.walls={left:null,right:null,top:null,bottom:null},this.enabled=d(e,"enabled",!0),this.correction=d(e,"correction",1),this.getDelta=d(e,"getDelta",this.update60Hz);var n=c(e,"runner",{}),r=c(n,"fps",!1),s=c(n,"fps",60),o=c(n,"delta",1e3/s),a=c(n,"deltaMin",1e3/s),l=c(n,"deltaMax",1e3/(.5*s));r||(s=1e3/o),this.runner={fps:s,correction:c(n,"correction",1),deltaSampleSize:c(n,"deltaSampleSize",60),counterTimestamp:0,frameCounter:0,deltaHistory:[],timePrev:null,timeScalePrev:1,frameRequestId:null,isFixed:c(n,"isFixed",!1),delta:o,deltaMin:a,deltaMax:l},this.autoUpdate=d(e,"autoUpdate",!0);var p=d(e,"debug",!1);if(this.drawDebug="object"==typeof p||p,this.debugGraphic,this.debugConfig={showAxes:c(p,"showAxes",!1),showAngleIndicator:c(p,"showAngleIndicator",!1),angleColor:c(p,"angleColor",15208787),showBroadphase:c(p,"showBroadphase",!1),broadphaseColor:c(p,"broadphaseColor",16757760),showBounds:c(p,"showBounds",!1),boundsColor:c(p,"boundsColor",16777215),showVelocity:c(p,"showVelocity",!1),velocityColor:c(p,"velocityColor",44783),showCollisions:c(p,"showCollisions",!1),collisionColor:c(p,"collisionColor",16094476),showSeparations:c(p,"showSeparations",!1),separationColor:c(p,"separationColor",16753920),showBody:c(p,"showBody",!0),showStaticBody:c(p,"showStaticBody",!0),showInternalEdges:c(p,"showInternalEdges",!1),renderFill:c(p,"renderFill",!1),renderLine:c(p,"renderLine",!0),fillColor:c(p,"fillColor",1075465),fillOpacity:c(p,"fillOpacity",1),lineColor:c(p,"lineColor",2678297),lineOpacity:c(p,"lineOpacity",1),lineThickness:c(p,"lineThickness",1),staticFillColor:c(p,"staticFillColor",857979),staticLineColor:c(p,"staticLineColor",1255396),showSleeping:c(p,"showSleeping",!1),staticBodySleepOpacity:c(p,"staticBodySleepOpacity",.7),sleepFillColor:c(p,"sleepFillColor",4605510),sleepLineColor:c(p,"sleepLineColor",10066585),showSensors:c(p,"showSensors",!0),sensorFillColor:c(p,"sensorFillColor",857979),sensorLineColor:c(p,"sensorLineColor",1255396),showPositions:c(p,"showPositions",!0),positionSize:c(p,"positionSize",4),positionColor:c(p,"positionColor",14697178),showJoint:c(p,"showJoint",!0),jointColor:c(p,"jointColor",14737474),jointLineOpacity:c(p,"jointLineOpacity",1),jointLineThickness:c(p,"jointLineThickness",2),pinSize:c(p,"pinSize",4),pinColor:c(p,"pinColor",4382944),springColor:c(p,"springColor",14697184),anchorColor:c(p,"anchorColor",15724527),anchorSize:c(p,"anchorSize",4),showConvexHulls:c(p,"showConvexHulls",!1),hullColor:c(p,"hullColor",14091216)},this.drawDebug&&this.createDebugGraphic(),this.setEventsProxy(),c(e,"setBounds",!1)){var f=e.setBounds;if("boolean"==typeof f)this.setBounds();else{var m=c(f,"x",0),v=c(f,"y",0),g=c(f,"width",t.sys.scale.width),y=c(f,"height",t.sys.scale.height),_=c(f,"thickness",64),x=c(f,"left",!0),b=c(f,"right",!0),w=c(f,"top",!0),T=c(f,"bottom",!0);this.setBounds(m,v,g,y,_,x,b,w,T)}}},setCompositeRenderStyle:function(t){var e,i,n,r=t.bodies,s=t.constraints,o=t.composites;for(e=0;e<r.length;e++)n=(i=r[e]).render,this.setBodyRenderStyle(i,n.lineColor,n.lineOpacity,n.lineThickness,n.fillColor,n.fillOpacity);for(e=0;e<s.length;e++)n=(i=s[e]).render,this.setConstraintRenderStyle(i,n.lineColor,n.lineOpacity,n.lineThickness,n.pinSize,n.anchorColor,n.anchorSize);for(e=0;e<o.length;e++)i=o[e],this.setCompositeRenderStyle(i);return this},setBodyRenderStyle:function(t,e,i,n,r,s){var o=t.render,a=this.debugConfig;return o?(null==e&&(e=t.isStatic?a.staticLineColor:a.lineColor),null==i&&(i=a.lineOpacity),null==n&&(n=a.lineThickness),null==r&&(r=t.isStatic?a.staticFillColor:a.fillColor),null==s&&(s=a.fillOpacity),!1!==e&&(o.lineColor=e),!1!==i&&(o.lineOpacity=i),!1!==n&&(o.lineThickness=n),!1!==r&&(o.fillColor=r),!1!==s&&(o.fillOpacity=s),this):this},setConstraintRenderStyle:function(t,e,i,n,r,s,o){var a=t.render,h=this.debugConfig;if(!a)return this;if(null==e){var u=a.type;"line"===u?e=h.jointColor:"pin"===u?e=h.pinColor:"spring"===u&&(e=h.springColor)}return null==i&&(i=h.jointLineOpacity),null==n&&(n=h.jointLineThickness),null==r&&(r=h.pinSize),null==s&&(s=h.anchorColor),null==o&&(o=h.anchorSize),!1!==e&&(a.lineColor=e),!1!==i&&(a.lineOpacity=i),!1!==n&&(a.lineThickness=n),!1!==r&&(a.pinSize=r),!1!==s&&(a.anchorColor=s),!1!==o&&(a.anchorSize=o),this},setEventsProxy:function(){var t=this,e=this.engine,i=this.localWorld;this.drawDebug&&(f.on(i,"compositeModified",(function(e){t.setCompositeRenderStyle(e)})),f.on(i,"beforeAdd",(function(e){for(var i=[].concat(e.object),n=0;n<i.length;n++){var r=i[n],s=r.render;"body"===r.type?t.setBodyRenderStyle(r,s.lineColor,s.lineOpacity,s.lineThickness,s.fillColor,s.fillOpacity):"composite"===r.type?t.setCompositeRenderStyle(r):"constraint"===r.type&&t.setConstraintRenderStyle(r,s.lineColor,s.lineOpacity,s.lineThickness,s.pinSize,s.anchorColor,s.anchorSize)}}))),f.on(i,"beforeAdd",(function(e){t.emit(l.BEFORE_ADD,e)})),f.on(i,"afterAdd",(function(e){t.emit(l.AFTER_ADD,e)})),f.on(i,"beforeRemove",(function(e){t.emit(l.BEFORE_REMOVE,e)})),f.on(i,"afterRemove",(function(e){t.emit(l.AFTER_REMOVE,e)})),f.on(e,"beforeUpdate",(function(e){t.emit(l.BEFORE_UPDATE,e)})),f.on(e,"afterUpdate",(function(e){t.emit(l.AFTER_UPDATE,e)})),f.on(e,"collisionStart",(function(e){var i,n,r=e.pairs;r.length>0&&(i=r[0].bodyA,n=r[0].bodyB),t.emit(l.COLLISION_START,e,i,n)})),f.on(e,"collisionActive",(function(e){var i,n,r=e.pairs;r.length>0&&(i=r[0].bodyA,n=r[0].bodyB),t.emit(l.COLLISION_ACTIVE,e,i,n)})),f.on(e,"collisionEnd",(function(e){var i,n,r=e.pairs;r.length>0&&(i=r[0].bodyA,n=r[0].bodyB),t.emit(l.COLLISION_END,e,i,n)}))},setBounds:function(t,e,i,n,r,s,o,a,h){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.scene.sys.scale.width),void 0===n&&(n=this.scene.sys.scale.height),void 0===r&&(r=64),void 0===s&&(s=!0),void 0===o&&(o=!0),void 0===a&&(a=!0),void 0===h&&(h=!0),this.updateWall(s,"left",t-r,e-r,r,n+2*r),this.updateWall(o,"right",t+i,e-r,r,n+2*r),this.updateWall(a,"top",t,e-r,i,r),this.updateWall(h,"bottom",t,e+n,i,r),this},updateWall:function(t,e,i,n,r,s){var o=this.walls[e];t?(o&&v.remove(this.localWorld,o),i+=r/2,n+=s/2,this.walls[e]=this.create(i,n,r,s,{isStatic:!0,friction:0,frictionStatic:0})):(o&&v.remove(this.localWorld,o),this.walls[e]=null)},createDebugGraphic:function(){var t=this.scene.sys.add.graphics({x:0,y:0});return t.setDepth(Number.MAX_VALUE),this.debugGraphic=t,this.drawDebug=!0,t},disableGravity:function(){return this.localWorld.gravity.x=0,this.localWorld.gravity.y=0,this.localWorld.gravity.scale=0,this},setGravity:function(t,e,i){return void 0===t&&(t=0),void 0===e&&(e=1),this.localWorld.gravity.x=t,this.localWorld.gravity.y=e,void 0!==i&&(this.localWorld.gravity.scale=i),this},create:function(t,e,i,r,s){var o=n.rectangle(t,e,i,r,s);return v.add(this.localWorld,o),o},add:function(t){return v.add(this.localWorld,t),this},remove:function(t,e){Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i],r=n.body?n.body:n;a.remove(this.localWorld,r,e)}return this},removeConstraint:function(t,e){return a.remove(this.localWorld,t,e),this},convertTilemapLayer:function(t,e){var i=t.layer,n=t.getTilesWithin(0,0,i.width,i.height,{isColliding:!0});return this.convertTiles(n,e),this},convertTiles:function(t,e){if(0===t.length)return this;for(var i=0;i<t.length;i++)new m(this,t[i],e);return this},nextGroup:function(t){return p.nextGroup(t)},nextCategory:function(){return p.nextCategory()},pause:function(){return this.enabled=!1,this.emit(l.PAUSE),this},resume:function(){return this.enabled=!0,this.emit(l.RESUME),this},update:function(t,e){if(this.enabled&&this.autoUpdate){var i=this.engine,n=this.runner,r=i.timing,s=this.correction;n.isFixed?e=this.getDelta(t,e):(e=t-n.timePrev||n.delta,n.timePrev=t,n.deltaHistory.push(e),n.deltaHistory=n.deltaHistory.slice(-n.deltaSampleSize),s=(e=(e=(e=Math.min.apply(null,n.deltaHistory))<n.deltaMin?n.deltaMin:e)>n.deltaMax?n.deltaMax:e)/n.delta,n.delta=e),0!==n.timeScalePrev&&(s*=r.timeScale/n.timeScalePrev),0===r.timeScale&&(s=0),n.timeScalePrev=r.timeScale,n.correction=s,n.frameCounter+=1,t-n.counterTimestamp>=1e3&&(n.fps=n.frameCounter*((t-n.counterTimestamp)/1e3),n.counterTimestamp=t,n.frameCounter=0),h.update(i,e,s)}},step:function(t,e){h.update(this.engine,t,e)},update60Hz:function(){return 1e3/60},update30Hz:function(){return 1e3/30},has:function(t){var e=t.hasOwnProperty("body")?t.body:t;return null!==a.get(this.localWorld,e.id,e.type)},getAllBodies:function(){return a.allBodies(this.localWorld)},getAllConstraints:function(){return a.allConstraints(this.localWorld)},getAllComposites:function(){return a.allComposites(this.localWorld)},postUpdate:function(){if(this.drawDebug){var t=this.debugConfig,e=this.engine,i=this.debugGraphic,n=a.allBodies(this.localWorld);this.debugGraphic.clear(),t.showBroadphase&&e.broadphase.controller&&this.renderGrid(e.broadphase,i,t.broadphaseColor,.5),t.showBounds&&this.renderBodyBounds(n,i,t.boundsColor,.5),(t.showBody||t.showStaticBody)&&this.renderBodies(n),t.showJoint&&this.renderJoints(),(t.showAxes||t.showAngleIndicator)&&this.renderBodyAxes(n,i,t.showAxes,t.angleColor,.5),t.showVelocity&&this.renderBodyVelocity(n,i,t.velocityColor,1,2),t.showSeparations&&this.renderSeparations(e.pairs.list,i,t.separationColor),t.showCollisions&&this.renderCollisions(e.pairs.list,i,t.collisionColor)}},renderGrid:function(t,e,i,n){e.lineStyle(1,i,n);for(var r=o.keys(t.buckets),s=0;s<r.length;s++){var a=r[s];if(!(t.buckets[a].length<2)){var h=a.split(/C|R/);e.strokeRect(parseInt(h[1],10)*t.bucketWidth,parseInt(h[2],10)*t.bucketHeight,t.bucketWidth,t.bucketHeight)}}return this},renderSeparations:function(t,e,i){e.lineStyle(1,i,1);for(var n=0;n<t.length;n++){var r=t[n];if(r.isActive){var s=r.collision,o=s.bodyA,a=s.bodyB,h=o.position,u=a.position,l=s.penetration,c=o.isStatic||a.isStatic?1:4;a.isStatic&&(c=0),e.lineBetween(u.x,u.y,u.x-l.x*c,u.y-l.y*c),c=o.isStatic||a.isStatic?1:4,o.isStatic&&(c=0),e.lineBetween(h.x,h.y,h.x-l.x*c,h.y-l.y*c)}}return this},renderCollisions:function(t,e,i){var n,r;for(e.lineStyle(1,i,.5),e.fillStyle(i,1),n=0;n<t.length;n++)if((r=t[n]).isActive)for(var s=0;s<r.activeContacts.length;s++){var o=r.activeContacts[s].vertex;e.fillRect(o.x-2,o.y-2,5,5)}for(n=0;n<t.length;n++)if((r=t[n]).isActive){var a=r.collision,h=r.activeContacts;if(h.length>0){var u=h[0].vertex.x,l=h[0].vertex.y;2===h.length&&(u=(h[0].vertex.x+h[1].vertex.x)/2,l=(h[0].vertex.y+h[1].vertex.y)/2),a.bodyB===a.supports[0].body||a.bodyA.isStatic?e.lineBetween(u-8*a.normal.x,l-8*a.normal.y,u,l):e.lineBetween(u+8*a.normal.x,l+8*a.normal.y,u,l)}}return this},renderBodyBounds:function(t,e,i,n){e.lineStyle(1,i,n);for(var r=0;r<t.length;r++){var s=t[r];if(s.render.visible){var o=s.bounds;if(o)e.strokeRect(o.min.x,o.min.y,o.max.x-o.min.x,o.max.y-o.min.y);else for(var a=s.parts,h=a.length>1?1:0;h<a.length;h++){var u=a[h];e.strokeRect(u.bounds.min.x,u.bounds.min.y,u.bounds.max.x-u.bounds.min.x,u.bounds.max.y-u.bounds.min.y)}}}return this},renderBodyAxes:function(t,e,i,n,r){e.lineStyle(1,n,r);for(var s=0;s<t.length;s++){var o,a,h,u=t[s],l=u.parts;if(u.render.visible)if(i)for(a=l.length>1?1:0;a<l.length;a++)for(o=l[a],h=0;h<o.axes.length;h++){var c=o.axes[h];e.lineBetween(o.position.x,o.position.y,o.position.x+20*c.x,o.position.y+20*c.y)}else for(a=l.length>1?1:0;a<l.length;a++)for(o=l[a],h=0;h<o.axes.length;h++)e.lineBetween(o.position.x,o.position.y,(o.vertices[0].x+o.vertices[o.vertices.length-1].x)/2,(o.vertices[0].y+o.vertices[o.vertices.length-1].y)/2)}return this},renderBodyVelocity:function(t,e,i,n,r){e.lineStyle(r,i,n);for(var s=0;s<t.length;s++){var o=t[s];o.render.visible&&e.lineBetween(o.position.x,o.position.y,o.position.x+2*(o.position.x-o.positionPrev.x),o.position.y+2*(o.position.y-o.positionPrev.y))}return this},renderBodies:function(t){for(var e=this.debugGraphic,i=this.debugConfig,n=i.showBody,r=i.showStaticBody,s=i.showSleeping,o=i.showInternalEdges,a=i.showConvexHulls,h=i.renderFill,u=i.renderLine,l=i.staticBodySleepOpacity,c=i.sleepFillColor,d=i.sleepLineColor,p=i.hullColor,f=0;f<t.length;f++){var m=t[f];if(m.render.visible&&((r||!m.isStatic)&&(n||m.isStatic))){var v=m.render.lineColor,g=m.render.lineOpacity,y=m.render.lineThickness,_=m.render.fillColor,x=m.render.fillOpacity;s&&m.isSleeping&&(m.isStatic?(g*=l,x*=l):(v=d,_=c)),h||(_=null),u||(v=null),this.renderBody(m,e,o,v,g,y,_,x);var b=m.parts.length;a&&b>1&&this.renderConvexHull(m,e,p,y)}}},renderBody:function(t,e,i,n,r,s,o,a){void 0===n&&(n=null),void 0===r&&(r=null),void 0===s&&(s=1),void 0===o&&(o=null),void 0===a&&(a=null);for(var h=this.debugConfig,u=h.sensorFillColor,l=h.sensorLineColor,c=t.parts,d=c.length,p=d>1?1:0;p<d;p++){var f=c[p],m=f.render,v=m.opacity;if(m.visible&&0!==v&&(!f.isSensor||h.showSensors)){var g=f.circleRadius;if(e.beginPath(),f.isSensor?(null!==o&&e.fillStyle(u,a*v),null!==n&&e.lineStyle(s,l,r*v)):(null!==o&&e.fillStyle(o,a*v),null!==n&&e.lineStyle(s,n,r*v)),g)e.arc(f.position.x,f.position.y,g,0,2*Math.PI);else{var y=f.vertices,_=y.length;e.moveTo(y[0].x,y[0].y);for(var x=1;x<_;x++){var b=y[x];if(!y[x-1].isInternal||i?e.lineTo(b.x,b.y):e.moveTo(b.x,b.y),x<_&&b.isInternal&&!i){var w=(x+1)%_;e.moveTo(y[w].x,y[w].y)}}e.closePath()}null!==o&&e.fillPath(),null!==n&&e.strokePath()}}if(h.showPositions&&!t.isStatic){var T=t.position.x,M=t.position.y,S=Math.ceil(h.positionSize/2);e.fillStyle(h.positionColor,1),e.fillRect(T-S,M-S,h.positionSize,h.positionSize)}return this},renderConvexHull:function(t,e,i,n){if(void 0===n&&(n=1),t.parts.length>1){var r=t.vertices;e.lineStyle(n,i),e.beginPath(),e.moveTo(r[0].x,r[0].y);for(var s=1;s<r.length;s++)e.lineTo(r[s].x,r[s].y);e.lineTo(r[0].x,r[0].y),e.strokePath()}return this},renderJoints:function(){for(var t=this.debugGraphic,e=a.allConstraints(this.localWorld),i=0;i<e.length;i++){var n=e[i].render,r=n.lineColor,s=n.lineOpacity,o=n.lineThickness,h=n.pinSize,u=n.anchorColor,l=n.anchorSize;this.renderConstraint(e[i],t,r,s,o,h,u,l)}},renderConstraint:function(t,e,i,n,r,s,a,h){var u=t.render;if(!u.visible||!t.pointA||!t.pointB)return this;e.lineStyle(r,i,n);var l,c,d=t.bodyA,p=t.bodyB;if(l=d?g.add(d.position,t.pointA):t.pointA,"pin"===u.type)e.strokeCircle(l.x,l.y,s);else{if(c=p?g.add(p.position,t.pointB):t.pointB,e.beginPath(),e.moveTo(l.x,l.y),"spring"===u.type)for(var f,m=g.sub(c,l),v=g.perp(g.normalise(m)),y=Math.ceil(o.clamp(t.length/5,12,20)),_=1;_<y;_+=1)f=_%2==0?1:-1,e.lineTo(l.x+m.x*(_/y)+v.x*f*4,l.y+m.y*(_/y)+v.y*f*4);e.lineTo(c.x,c.y)}return e.strokePath(),u.anchors&&h>0&&(e.fillStyle(a),e.fillCircle(l.x,l.y,h),e.fillCircle(c.x,c.y,h)),this},resetCollisionIDs:function(){return r._nextCollidingGroupId=1,r._nextNonCollidingGroupId=-1,r._nextCategory=1,this},shutdown:function(){f.off(this.engine),this.removeAllListeners(),v.clear(this.localWorld,!1),h.clear(this.engine),this.drawDebug&&this.debugGraphic.destroy()},destroy:function(){this.shutdown()}});t.exports=y},58048:t=>{t.exports={setBounce:function(t){return this.body.restitution=t,this}}},90852:t=>{var e={setCollisionCategory:function(t){return this.body.collisionFilter.category=t,this},setCollisionGroup:function(t){return this.body.collisionFilter.group=t,this},setCollidesWith:function(t){var e=0;if(Array.isArray(t))for(var i=0;i<t.length;i++)e|=t[i];else e=t;return this.body.collisionFilter.mask=e,this},setOnCollide:function(t){return this.body.onCollideCallback=t,this},setOnCollideEnd:function(t){return this.body.onCollideEndCallback=t,this},setOnCollideActive:function(t){return this.body.onCollideActiveCallback=t,this},setOnCollideWith:function(t,e){Array.isArray(t)||(t=[t]);for(var i=0;i<t.length;i++){var n=t[i].hasOwnProperty("body")?t[i].body:t[i];this.body.setOnCollideWith(n,e)}return this}};t.exports=e},75287:(t,e,i)=>{var n=i(32663),r={applyForce:function(t){return this._tempVec2.set(this.body.position.x,this.body.position.y),n.applyForce(this.body,this._tempVec2,t),this},applyForceFrom:function(t,e){return n.applyForce(this.body,t,e),this},thrust:function(t){var e=this.body.angle;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),n.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustLeft:function(t){var e=this.body.angle-Math.PI/2;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),n.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustRight:function(t){var e=this.body.angle+Math.PI/2;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),n.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this},thrustBack:function(t){var e=this.body.angle-Math.PI;return this._tempVec2.set(t*Math.cos(e),t*Math.sin(e)),n.applyForce(this.body,{x:this.body.position.x,y:this.body.position.y},this._tempVec2),this}};t.exports=r},69289:t=>{var e={setFriction:function(t,e,i){return this.body.friction=t,void 0!==e&&(this.body.frictionAir=e),void 0!==i&&(this.body.frictionStatic=i),this},setFrictionAir:function(t){return this.body.frictionAir=t,this},setFrictionStatic:function(t){return this.body.frictionStatic=t,this}};t.exports=e},41568:t=>{t.exports={setIgnoreGravity:function(t){return this.body.ignoreGravity=t,this}}},16272:(t,e,i)=>{var n=i(32663),r=i(57148),s={setMass:function(t){return n.setMass(this.body,t),this},setDensity:function(t){return n.setDensity(this.body,t),this},centerOfMass:{get:function(){return new r(this.body.centerOfMass.x,this.body.centerOfMass.y)}}};t.exports=s},20602:t=>{t.exports={setSensor:function(t){return this.body.isSensor=t,this},isSensor:function(){return this.body.isSensor}}},27823:(t,e,i)=>{var n=i(41422),r=i(32663),s=i(70077),o=i(81769),a=i(49765),h=i(88470),u=i(65714),l={setRectangle:function(t,e,i){return this.setBody({type:"rectangle",width:t,height:e},i)},setCircle:function(t,e){return this.setBody({type:"circle",radius:t},e)},setPolygon:function(t,e,i){return this.setBody({type:"polygon",sides:e,radius:t},i)},setTrapezoid:function(t,e,i,n){return this.setBody({type:"trapezoid",width:t,height:e,slope:i},n)},setExistingBody:function(t,e){void 0===e&&(e=!0),this.body&&this.world.remove(this.body,!0),this.body=t;for(var i=0;i<t.parts.length;i++)t.parts[i].gameObject=this;var n=this;if(t.destroy=function(){n.world.remove(n.body,!0),n.body.gameObject=null},e&&(this.world.has(t)&&this.world.remove(t,!0),this.world.add(t)),this._originComponent){var r=t.render.sprite.xOffset,o=t.render.sprite.yOffset,a=t.centerOfMass.x,h=t.centerOfMass.y;if(s(a,.5)&&s(h,.5))this.setOrigin(r+.5,o+.5);else{var u=t.centerOffset.x,l=t.centerOffset.y;this.setOrigin(r+u/this.displayWidth,o+l/this.displayHeight)}}return this},setBody:function(t,e){if(!t)return this;var i;"string"==typeof t&&(t={type:t});var s=o(t,"type","rectangle"),l=o(t,"x",this._tempVec2.x),c=o(t,"y",this._tempVec2.y),d=o(t,"width",this.width),p=o(t,"height",this.height);switch(s){case"rectangle":i=n.rectangle(l,c,d,p,e);break;case"circle":var f=o(t,"radius",Math.max(d,p)/2),m=o(t,"maxSides",25);i=n.circle(l,c,f,e,m);break;case"trapezoid":var v=o(t,"slope",.5);i=n.trapezoid(l,c,d,p,v,e);break;case"polygon":var g=o(t,"sides",5),y=o(t,"radius",Math.max(d,p)/2);i=n.polygon(l,c,g,y,e);break;case"fromVertices":case"fromVerts":var _=o(t,"verts",null);if(_)if("string"==typeof _&&(_=u.fromPath(_)),this.body&&!this.body.hasOwnProperty("temp"))r.setVertices(this.body,_),i=this.body;else{var x=o(t,"flagInternal",!1),b=o(t,"removeCollinear",.01),w=o(t,"minimumArea",10);i=n.fromVertices(l,c,_,e,x,b,w)}break;case"fromPhysicsEditor":i=a.parseBody(l,c,t,e);break;case"fromPhysicsTracer":i=h.parseBody(l,c,t,e)}return i&&this.setExistingBody(i,t.addToWorld),this}};t.exports=l},56636:(t,e,i)=>{var n=i(52712),r=i(59114),s=i(84900),o={setToSleep:function(){r.set(this.body,!0)},setAwake:function(){r.set(this.body,!1)},setSleepThreshold:function(t){return void 0===t&&(t=60),this.body.sleepThreshold=t,this},setSleepEvents:function(t,e){return this.setSleepStartEvent(t),this.setSleepEndEvent(e),this},setSleepStartEvent:function(t){if(t){var e=this.world;s.on(this.body,"sleepStart",(function(t){e.emit(n.SLEEP_START,t,this)}))}else s.off(this.body,"sleepStart");return this},setSleepEndEvent:function(t){if(t){var e=this.world;s.on(this.body,"sleepEnd",(function(t){e.emit(n.SLEEP_END,t,this)}))}else s.off(this.body,"sleepEnd");return this}};t.exports=o},10359:(t,e,i)=>{var n=i(32663),r={setStatic:function(t){return n.setStatic(this.body,t),this},isStatic:function(){return this.body.isStatic}};t.exports=r},76875:(t,e,i)=>{var n=i(32663),r=i(14302),s=i(23882),o=i(74771),a={x:{get:function(){return this.body.position.x},set:function(t){this._tempVec2.set(t,this.y),n.setPosition(this.body,this._tempVec2)}},y:{get:function(){return this.body.position.y},set:function(t){this._tempVec2.set(this.x,t),n.setPosition(this.body,this._tempVec2)}},scaleX:{get:function(){return this._scaleX},set:function(t){var e=1/this._scaleX,i=1/this._scaleY;this._scaleX=t,0===this._scaleX?this.renderFlags&=-5:this.renderFlags|=4,n.scale(this.body,e,i),n.scale(this.body,t,this._scaleY)}},scaleY:{get:function(){return this._scaleY},set:function(t){var e=1/this._scaleX,i=1/this._scaleY;this._scaleY=t,0===this._scaleY?this.renderFlags&=-5:this.renderFlags|=4,n.scale(this.body,e,i),n.scale(this.body,this._scaleX,t)}},angle:{get:function(){return o(this.body.angle*r.RAD_TO_DEG)},set:function(t){this.rotation=o(t)*r.DEG_TO_RAD}},rotation:{get:function(){return this.body.angle},set:function(t){this._rotation=s(t),n.setAngle(this.body,this._rotation)}},setPosition:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this._tempVec2.set(t,e),n.setPosition(this.body,this._tempVec2),this},setRotation:function(t){return void 0===t&&(t=0),this._rotation=s(t),n.setAngle(this.body,t),this},setFixedRotation:function(){return n.setInertia(this.body,1/0),this},setAngle:function(t){return void 0===t&&(t=0),this.angle=t,n.setAngle(this.body,this.rotation),this},setScale:function(t,e,i){void 0===t&&(t=1),void 0===e&&(e=t);var r=1/this._scaleX,s=1/this._scaleY;return this._scaleX=t,this._scaleY=e,n.scale(this.body,r,s,i),n.scale(this.body,t,e,i),this}};t.exports=a},776:(t,e,i)=>{var n=i(32663),r={setAngularVelocity:function(t){return n.setAngularVelocity(this.body,t),this},setVelocityX:function(t){return this._tempVec2.set(t,this.body.velocity.y),n.setVelocity(this.body,this._tempVec2),this},setVelocityY:function(t){return this._tempVec2.set(this.body.velocity.x,t),n.setVelocity(this.body,this._tempVec2),this},setVelocity:function(t,e){return this._tempVec2.set(t,e),n.setVelocity(this.body,this._tempVec2),this}};t.exports=r},86845:(t,e,i)=>{t.exports={Bounce:i(58048),Collision:i(90852),Force:i(75287),Friction:i(69289),Gravity:i(41568),Mass:i(16272),Static:i(10359),Sensor:i(20602),SetBody:i(27823),Sleep:i(56636),Transform:i(76875),Velocity:i(776)}},18883:t=>{t.exports="afteradd"},94837:t=>{t.exports="afterremove"},54349:t=>{t.exports="afterupdate"},96325:t=>{t.exports="beforeadd"},7167:t=>{t.exports="beforeremove"},99692:t=>{t.exports="beforeupdate"},86882:t=>{t.exports="collisionactive"},8818:t=>{t.exports="collisionend"},61735:t=>{t.exports="collisionstart"},6644:t=>{t.exports="dragend"},4521:t=>{t.exports="drag"},26378:t=>{t.exports="dragstart"},44986:t=>{t.exports="pause"},95591:t=>{t.exports="resume"},48612:t=>{t.exports="sleepend"},95411:t=>{t.exports="sleepstart"},52712:(t,e,i)=>{t.exports={AFTER_ADD:i(18883),AFTER_REMOVE:i(94837),AFTER_UPDATE:i(54349),BEFORE_ADD:i(96325),BEFORE_REMOVE:i(7167),BEFORE_UPDATE:i(99692),COLLISION_ACTIVE:i(86882),COLLISION_END:i(8818),COLLISION_START:i(61735),DRAG_END:i(6644),DRAG:i(4521),DRAG_START:i(26378),PAUSE:i(44986),RESUME:i(95591),SLEEP_END:i(48612),SLEEP_START:i(95411)}},23903:(t,e,i)=>{t.exports={BodyBounds:i(34862),Factory:i(22718),Image:i(21372),Matter:i(97461),MatterPhysics:i(96506),PolyDecomp:i(6384),Sprite:i(1731),TileBody:i(57564),PhysicsEditorParser:i(49765),PhysicsJSONParser:i(88470),World:i(41491)}},32663:(t,e,i)=>{var n={};t.exports=n;var r=i(65714),s=i(39646),o=i(59114),a=i(13991),h=i(17983),u=i(58383);!function(){n._inertiaScale=4,n._nextCollidingGroupId=1,n._nextNonCollidingGroupId=-1,n._nextCategory=1,n.create=function(e){var i={id:a.nextId(),type:"body",label:"Body",parts:[],plugin:{},angle:0,vertices:null,position:{x:0,y:0},force:{x:0,y:0},torque:0,positionImpulse:{x:0,y:0},previousPositionImpulse:{x:0,y:0},constraintImpulse:{x:0,y:0,angle:0},totalContacts:0,speed:0,angularSpeed:0,velocity:{x:0,y:0},angularVelocity:0,isSensor:!1,isStatic:!1,isSleeping:!1,motion:0,sleepThreshold:60,density:.001,restitution:0,friction:.1,frictionStatic:.5,frictionAir:.01,collisionFilter:{category:1,mask:4294967295,group:0},slop:.05,timeScale:1,events:null,bounds:null,chamfer:null,circleRadius:0,positionPrev:null,anglePrev:0,parent:null,axes:null,area:0,mass:0,inverseMass:0,inertia:0,inverseInertia:0,_original:null,render:{visible:!0,opacity:1,sprite:{xOffset:0,yOffset:0},fillColor:null,fillOpacity:null,lineColor:null,lineOpacity:null,lineThickness:null},gameObject:null,scale:{x:1,y:1},centerOfMass:{x:0,y:0},centerOffset:{x:0,y:0},gravityScale:{x:1,y:1},ignoreGravity:!1,ignorePointer:!1,onCollideCallback:null,onCollideEndCallback:null,onCollideActiveCallback:null,onCollideWith:{}};!e.hasOwnProperty("position")&&e.hasOwnProperty("vertices")?e.position=r.centre(e.vertices):e.hasOwnProperty("vertices")||(i.vertices=r.fromPath("L 0 0 L 40 0 L 40 40 L 0 40"));var n=a.extend(i,e);return t(n,e),n.setOnCollideWith=function(t,e){return e?this.onCollideWith[t.id]=e:delete this.onCollideWith[t.id],this},n},n.nextGroup=function(t){return t?n._nextNonCollidingGroupId--:n._nextCollidingGroupId++},n.nextCategory=function(){return n._nextCategory=n._nextCategory<<1,n._nextCategory};var t=function(t,e){e=e||{},n.set(t,{bounds:t.bounds||h.create(t.vertices),positionPrev:t.positionPrev||s.clone(t.position),anglePrev:t.anglePrev||t.angle,vertices:t.vertices,parts:t.parts||[t],isStatic:t.isStatic,isSleeping:t.isSleeping,parent:t.parent||t});var i=t.bounds;if(r.rotate(t.vertices,t.angle,t.position),u.rotate(t.axes,t.angle),h.update(i,t.vertices,t.velocity),n.set(t,{axes:e.axes||t.axes,area:e.area||t.area,mass:e.mass||t.mass,inertia:e.inertia||t.inertia}),1===t.parts.length){var o=t.centerOfMass,a=t.centerOffset,l=i.max.x-i.min.x,c=i.max.y-i.min.y;o.x=-(i.min.x-t.position.x)/l,o.y=-(i.min.y-t.position.y)/c,a.x=l*o.x,a.y=c*o.y}};n.set=function(t,e,i){var r;for(r in"string"==typeof e&&(r=e,(e={})[r]=i),e)if(Object.prototype.hasOwnProperty.call(e,r))switch(i=e[r],r){case"isStatic":n.setStatic(t,i);break;case"isSleeping":o.set(t,i);break;case"mass":n.setMass(t,i);break;case"density":n.setDensity(t,i);break;case"inertia":n.setInertia(t,i);break;case"vertices":n.setVertices(t,i);break;case"position":n.setPosition(t,i);break;case"angle":n.setAngle(t,i);break;case"velocity":n.setVelocity(t,i);break;case"angularVelocity":n.setAngularVelocity(t,i);break;case"parts":n.setParts(t,i);break;case"centre":n.setCentre(t,i);break;default:t[r]=i}},n.setStatic=function(t,e){for(var i=0;i<t.parts.length;i++){var n=t.parts[i];n.isStatic=e,e?(n._original={restitution:n.restitution,friction:n.friction,mass:n.mass,inertia:n.inertia,density:n.density,inverseMass:n.inverseMass,inverseInertia:n.inverseInertia},n.restitution=0,n.friction=1,n.mass=n.inertia=n.density=1/0,n.inverseMass=n.inverseInertia=0,n.positionPrev.x=n.position.x,n.positionPrev.y=n.position.y,n.anglePrev=n.angle,n.angularVelocity=0,n.speed=0,n.angularSpeed=0,n.motion=0):n._original&&(n.restitution=n._original.restitution,n.friction=n._original.friction,n.mass=n._original.mass,n.inertia=n._original.inertia,n.density=n._original.density,n.inverseMass=n._original.inverseMass,n.inverseInertia=n._original.inverseInertia,n._original=null)}},n.setMass=function(t,e){var i=t.inertia/(t.mass/6);t.inertia=i*(e/6),t.inverseInertia=1/t.inertia,t.mass=e,t.inverseMass=1/t.mass,t.density=t.mass/t.area},n.setDensity=function(t,e){n.setMass(t,e*t.area),t.density=e},n.setInertia=function(t,e){t.inertia=e,t.inverseInertia=1/t.inertia},n.setVertices=function(t,e){e[0].body===t?t.vertices=e:t.vertices=r.create(e,t),t.axes=u.fromVertices(t.vertices),t.area=r.area(t.vertices),n.setMass(t,t.density*t.area);var i=r.centre(t.vertices);r.translate(t.vertices,i,-1),n.setInertia(t,n._inertiaScale*r.inertia(t.vertices,t.mass)),r.translate(t.vertices,t.position),h.update(t.bounds,t.vertices,t.velocity)},n.setParts=function(t,e,i){var s;for(e=e.slice(0),t.parts.length=0,t.parts.push(t),t.parent=t,s=0;s<e.length;s++){var o=e[s];o!==t&&(o.parent=t,t.parts.push(o))}if(1!==t.parts.length){if(i=void 0===i||i){var a=[];for(s=0;s<e.length;s++)a=a.concat(e[s].vertices);r.clockwiseSort(a);var u=r.hull(a),l=r.centre(u);n.setVertices(t,u),r.translate(t.vertices,l)}var c=n._totalProperties(t),d=c.centre.x,p=c.centre.y,f=t.bounds,m=t.centerOfMass,v=t.centerOffset;h.update(f,t.vertices,t.velocity),m.x=-(f.min.x-d)/(f.max.x-f.min.x),m.y=-(f.min.y-p)/(f.max.y-f.min.y),v.x=d,v.y=p,t.area=c.area,t.parent=t,t.position.x=d,t.position.y=p,t.positionPrev.x=d,t.positionPrev.y=p,n.setMass(t,c.mass),n.setInertia(t,c.inertia),n.setPosition(t,c.centre)}},n.setCentre=function(t,e,i){i?(t.positionPrev.x+=e.x,t.positionPrev.y+=e.y,t.position.x+=e.x,t.position.y+=e.y):(t.positionPrev.x=e.x-(t.position.x-t.positionPrev.x),t.positionPrev.y=e.y-(t.position.y-t.positionPrev.y),t.position.x=e.x,t.position.y=e.y)},n.setPosition=function(t,e){var i=s.sub(e,t.position);t.positionPrev.x+=i.x,t.positionPrev.y+=i.y;for(var n=0;n<t.parts.length;n++){var o=t.parts[n];o.position.x+=i.x,o.position.y+=i.y,r.translate(o.vertices,i),h.update(o.bounds,o.vertices,t.velocity)}},n.setAngle=function(t,e){var i=e-t.angle;t.anglePrev+=i;for(var n=0;n<t.parts.length;n++){var o=t.parts[n];o.angle+=i,r.rotate(o.vertices,i,t.position),u.rotate(o.axes,i),h.update(o.bounds,o.vertices,t.velocity),n>0&&s.rotateAbout(o.position,i,t.position,o.position)}},n.setVelocity=function(t,e){t.positionPrev.x=t.position.x-e.x,t.positionPrev.y=t.position.y-e.y,t.velocity.x=e.x,t.velocity.y=e.y,t.speed=s.magnitude(t.velocity)},n.setAngularVelocity=function(t,e){t.anglePrev=t.angle-e,t.angularVelocity=e,t.angularSpeed=Math.abs(t.angularVelocity)},n.translate=function(t,e){n.setPosition(t,s.add(t.position,e))},n.rotate=function(t,e,i){if(i){var r=Math.cos(e),s=Math.sin(e),o=t.position.x-i.x,a=t.position.y-i.y;n.setPosition(t,{x:i.x+(o*r-a*s),y:i.y+(o*s+a*r)}),n.setAngle(t,t.angle+e)}else n.setAngle(t,t.angle+e)},n.scale=function(t,e,i,s){var o=0,a=0;s=s||t.position;for(var l=0;l<t.parts.length;l++){var c=t.parts[l];c.scale.x=e,c.scale.y=i,r.scale(c.vertices,e,i,s),c.axes=u.fromVertices(c.vertices),c.area=r.area(c.vertices),n.setMass(c,t.density*c.area),r.translate(c.vertices,{x:-c.position.x,y:-c.position.y}),n.setInertia(c,n._inertiaScale*r.inertia(c.vertices,c.mass)),r.translate(c.vertices,{x:c.position.x,y:c.position.y}),l>0&&(o+=c.area,a+=c.inertia),c.position.x=s.x+(c.position.x-s.x)*e,c.position.y=s.y+(c.position.y-s.y)*i,h.update(c.bounds,c.vertices,t.velocity)}t.parts.length>1&&(t.area=o,t.isStatic||(n.setMass(t,t.density*o),n.setInertia(t,a))),t.circleRadius&&(e===i?t.circleRadius*=e:t.circleRadius=null)},n.update=function(t,e,i,n){var o=Math.pow(e*i*t.timeScale,2),a=1-t.frictionAir*i*t.timeScale,l=t.position.x-t.positionPrev.x,c=t.position.y-t.positionPrev.y;t.velocity.x=l*a*n+t.force.x/t.mass*o,t.velocity.y=c*a*n+t.force.y/t.mass*o,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.position.x+=t.velocity.x,t.position.y+=t.velocity.y,t.angularVelocity=(t.angle-t.anglePrev)*a*n+t.torque/t.inertia*o,t.anglePrev=t.angle,t.angle+=t.angularVelocity,t.speed=s.magnitude(t.velocity),t.angularSpeed=Math.abs(t.angularVelocity);for(var d=0;d<t.parts.length;d++){var p=t.parts[d];r.translate(p.vertices,t.velocity),d>0&&(p.position.x+=t.velocity.x,p.position.y+=t.velocity.y),0!==t.angularVelocity&&(r.rotate(p.vertices,t.angularVelocity,t.position),u.rotate(p.axes,t.angularVelocity),d>0&&s.rotateAbout(p.position,t.angularVelocity,t.position,p.position)),h.update(p.bounds,p.vertices,t.velocity)}},n.applyForce=function(t,e,i){t.force.x+=i.x,t.force.y+=i.y;var n=e.x-t.position.x,r=e.y-t.position.y;t.torque+=n*i.y-r*i.x},n._totalProperties=function(t){for(var e={mass:0,area:0,inertia:0,centre:{x:0,y:0}},i=1===t.parts.length?0:1;i<t.parts.length;i++){var n=t.parts[i],r=n.mass!==1/0?n.mass:1;e.mass+=r,e.area+=n.area,e.inertia+=n.inertia,e.centre=s.add(e.centre,s.mult(n.position,r))}return e.centre=s.div(e.centre,e.mass),e}}()},69643:(t,e,i)=>{var n={};t.exports=n;var r=i(84900),s=i(13991),o=i(17983),a=i(32663);n.create=function(t){return s.extend({id:s.nextId(),type:"composite",parent:null,isModified:!1,bodies:[],constraints:[],composites:[],label:"Composite",plugin:{}},t)},n.setModified=function(t,e,i,s){if(r.trigger(t,"compositeModified",t),t.isModified=e,i&&t.parent&&n.setModified(t.parent,e,i,s),s)for(var o=0;o<t.composites.length;o++){var a=t.composites[o];n.setModified(a,e,i,s)}},n.add=function(t,e){var i=[].concat(e);r.trigger(t,"beforeAdd",{object:e});for(var o=0;o<i.length;o++){var a=i[o];switch(a.type){case"body":if(a.parent!==a){s.warn("Composite.add: skipped adding a compound body part (you must add its parent instead)");break}n.addBody(t,a);break;case"constraint":n.addConstraint(t,a);break;case"composite":n.addComposite(t,a);break;case"mouseConstraint":n.addConstraint(t,a.constraint)}}return r.trigger(t,"afterAdd",{object:e}),t},n.remove=function(t,e,i){var s=[].concat(e);r.trigger(t,"beforeRemove",{object:e});for(var o=0;o<s.length;o++){var a=s[o];switch(a.type){case"body":n.removeBody(t,a,i);break;case"constraint":n.removeConstraint(t,a,i);break;case"composite":n.removeComposite(t,a,i);break;case"mouseConstraint":n.removeConstraint(t,a.constraint)}}return r.trigger(t,"afterRemove",{object:e}),t},n.addComposite=function(t,e){return t.composites.push(e),e.parent=t,n.setModified(t,!0,!0,!1),t},n.removeComposite=function(t,e,i){var r=t.composites.indexOf(e);if(-1!==r&&(n.removeCompositeAt(t,r),n.setModified(t,!0,!0,!1)),i)for(var s=0;s<t.composites.length;s++)n.removeComposite(t.composites[s],e,!0);return t},n.removeCompositeAt=function(t,e){return t.composites.splice(e,1),n.setModified(t,!0,!0,!1),t},n.addBody=function(t,e){return t.bodies.push(e),n.setModified(t,!0,!0,!1),t},n.removeBody=function(t,e,i){var r=t.bodies.indexOf(e);if(-1!==r&&(n.removeBodyAt(t,r),n.setModified(t,!0,!0,!1)),i)for(var s=0;s<t.composites.length;s++)n.removeBody(t.composites[s],e,!0);return t},n.removeBodyAt=function(t,e){return t.bodies.splice(e,1),n.setModified(t,!0,!0,!1),t},n.addConstraint=function(t,e){return t.constraints.push(e),n.setModified(t,!0,!0,!1),t},n.removeConstraint=function(t,e,i){var r=t.constraints.indexOf(e);if(-1!==r&&n.removeConstraintAt(t,r),i)for(var s=0;s<t.composites.length;s++)n.removeConstraint(t.composites[s],e,!0);return t},n.removeConstraintAt=function(t,e){return t.constraints.splice(e,1),n.setModified(t,!0,!0,!1),t},n.clear=function(t,e,i){if(i)for(var r=0;r<t.composites.length;r++)n.clear(t.composites[r],e,!0);return e?t.bodies=t.bodies.filter((function(t){return t.isStatic})):t.bodies.length=0,t.constraints.length=0,t.composites.length=0,n.setModified(t,!0,!0,!1),t},n.allBodies=function(t){for(var e=[].concat(t.bodies),i=0;i<t.composites.length;i++)e=e.concat(n.allBodies(t.composites[i]));return e},n.allConstraints=function(t){for(var e=[].concat(t.constraints),i=0;i<t.composites.length;i++)e=e.concat(n.allConstraints(t.composites[i]));return e},n.allComposites=function(t){for(var e=[].concat(t.composites),i=0;i<t.composites.length;i++)e=e.concat(n.allComposites(t.composites[i]));return e},n.get=function(t,e,i){var r,s;switch(i){case"body":r=n.allBodies(t);break;case"constraint":r=n.allConstraints(t);break;case"composite":r=n.allComposites(t).concat(t)}return r?0===(s=r.filter((function(t){return t.id.toString()===e.toString()}))).length?null:s[0]:null},n.move=function(t,e,i){return n.remove(t,e),n.add(i,e),t},n.rebase=function(t){for(var e=n.allBodies(t).concat(n.allConstraints(t)).concat(n.allComposites(t)),i=0;i<e.length;i++)e[i].id=s.nextId();return n.setModified(t,!0,!0,!1),t},n.translate=function(t,e,i){for(var r=i?n.allBodies(t):t.bodies,s=0;s<r.length;s++)a.translate(r[s],e);return n.setModified(t,!0,!0,!1),t},n.rotate=function(t,e,i,r){for(var s=Math.cos(e),o=Math.sin(e),h=r?n.allBodies(t):t.bodies,u=0;u<h.length;u++){var l=h[u],c=l.position.x-i.x,d=l.position.y-i.y;a.setPosition(l,{x:i.x+(c*s-d*o),y:i.y+(c*o+d*s)}),a.rotate(l,e)}return n.setModified(t,!0,!0,!1),t},n.scale=function(t,e,i,r,s){for(var o=s?n.allBodies(t):t.bodies,h=0;h<o.length;h++){var u=o[h],l=u.position.x-r.x,c=u.position.y-r.y;a.setPosition(u,{x:r.x+l*e,y:r.y+c*i}),a.scale(u,e,i)}return n.setModified(t,!0,!0,!1),t},n.bounds=function(t){for(var e=n.allBodies(t),i=[],r=0;r<e.length;r+=1){var s=e[r];i.push(s.bounds.min,s.bounds.max)}return o.create(i)}},36606:(t,e,i)=>{var n={};t.exports=n;var r=i(69643),s=(i(69436),i(13991));n.create=function(t){var e=r.create(),i={label:"World",gravity:{x:0,y:1,scale:.001},bounds:{min:{x:-1/0,y:-1/0},max:{x:1/0,y:1/0}}};return s.extend(e,i,t)}},17964:(t,e,i)=>{var n={};t.exports=n;var r=i(3946),s=i(37849),o=i(17983);n.collisions=function(t,e){for(var i=[],a=e.pairs.table,h=e.metrics,u=0;u<t.length;u++){var l=t[u][0],c=t[u][1];if((!l.isStatic&&!l.isSleeping||!c.isStatic&&!c.isSleeping)&&n.canCollide(l.collisionFilter,c.collisionFilter)&&(h.midphaseTests+=1,o.overlaps(l.bounds,c.bounds)))for(var d=l.parts.length>1?1:0;d<l.parts.length;d++)for(var p=l.parts[d],f=c.parts.length>1?1:0;f<c.parts.length;f++){var m=c.parts[f];if(p===l&&m===c||o.overlaps(p.bounds,m.bounds)){var v,g=a[s.id(p,m)];v=g&&g.isActive?g.collision:null;var y=r.collides(p,m,v);h.narrowphaseTests+=1,y.reused&&(h.narrowReuseCount+=1),y.collided&&(i.push(y),h.narrowDetections+=1)}}}return i},n.canCollide=function(t,e){return t.group===e.group&&0!==t.group?t.group>0:0!=(t.mask&e.category)&&0!=(e.mask&t.category)}},88424:(t,e,i)=>{var n={};t.exports=n;var r=i(37849),s=i(17964),o=i(13991);n.create=function(t){var e={controller:n,detector:s.collisions,buckets:{},pairs:{},pairsList:[],bucketWidth:48,bucketHeight:48};return o.extend(e,t)},n.update=function(t,e,i,r){var s,o,a,h,u,l=i.world,c=t.buckets,d=!1,p=i.metrics;for(p.broadphaseTests=0,s=0;s<e.length;s++){var f=e[s];if((!f.isSleeping||r)&&!(f.bounds.max.x<l.bounds.min.x||f.bounds.min.x>l.bounds.max.x||f.bounds.max.y<l.bounds.min.y||f.bounds.min.y>l.bounds.max.y)){var m=n._getRegion(t,f);if(!f.region||m.id!==f.region.id||r){p.broadphaseTests+=1,f.region&&!r||(f.region=m);var v=n._regionUnion(m,f.region);for(o=v.startCol;o<=v.endCol;o++)for(a=v.startRow;a<=v.endRow;a++){h=c[u=n._getBucketId(o,a)];var g=o>=m.startCol&&o<=m.endCol&&a>=m.startRow&&a<=m.endRow,y=o>=f.region.startCol&&o<=f.region.endCol&&a>=f.region.startRow&&a<=f.region.endRow;!g&&y&&y&&h&&n._bucketRemoveBody(t,h,f),(f.region===m||g&&!y||r)&&(h||(h=n._createBucket(c,u)),n._bucketAddBody(t,h,f))}f.region=m,d=!0}}}d&&(t.pairsList=n._createActivePairsList(t))},n.clear=function(t){t.buckets={},t.pairs={},t.pairsList=[]},n._regionUnion=function(t,e){var i=Math.min(t.startCol,e.startCol),r=Math.max(t.endCol,e.endCol),s=Math.min(t.startRow,e.startRow),o=Math.max(t.endRow,e.endRow);return n._createRegion(i,r,s,o)},n._getRegion=function(t,e){var i=e.bounds,r=Math.floor(i.min.x/t.bucketWidth),s=Math.floor(i.max.x/t.bucketWidth),o=Math.floor(i.min.y/t.bucketHeight),a=Math.floor(i.max.y/t.bucketHeight);return n._createRegion(r,s,o,a)},n._createRegion=function(t,e,i,n){return{id:t+","+e+","+i+","+n,startCol:t,endCol:e,startRow:i,endRow:n}},n._getBucketId=function(t,e){return"C"+t+"R"+e},n._createBucket=function(t,e){return t[e]=[]},n._bucketAddBody=function(t,e,i){for(var n=0;n<e.length;n++){var s=e[n];if(!(i.id===s.id||i.isStatic&&s.isStatic)){var o=r.id(i,s),a=t.pairs[o];a?a[2]+=1:t.pairs[o]=[i,s,1]}}e.push(i)},n._bucketRemoveBody=function(t,e,i){e.splice(e.indexOf(i),1);for(var n=0;n<e.length;n++){var s=e[n],o=r.id(i,s),a=t.pairs[o];a&&(a[2]-=1)}},n._createActivePairsList=function(t){var e,i,n=[];e=o.keys(t.pairs);for(var r=0;r<e.length;r++)(i=t.pairs[e[r]])[2]>0?n.push(i):delete t.pairs[e[r]];return n}},37849:t=>{var e={};t.exports=e,e.create=function(t,i){var n=t.bodyA,r=t.bodyB,s={id:e.id(n,r),bodyA:n,bodyB:r,activeContacts:[],separation:0,isActive:!0,confirmedActive:!0,isSensor:n.isSensor||r.isSensor,timeCreated:i,timeUpdated:i,collision:null,inverseMass:0,friction:0,frictionStatic:0,restitution:0,slop:0};return e.update(s,t,i),s},e.update=function(t,i,n){if(t.collision=i,i.collided){var r=i.supports,s=t.activeContacts,o=i.parentA,a=i.parentB;t.inverseMass=o.inverseMass+a.inverseMass,t.friction=Math.min(o.friction,a.friction),t.frictionStatic=Math.max(o.frictionStatic,a.frictionStatic),t.restitution=Math.max(o.restitution,a.restitution),t.slop=Math.max(o.slop,a.slop);for(var h=0;h<r.length;h++)s[h]=r[h].contact;var u=r.length;u<s.length&&(s.length=u),t.separation=i.depth,e.setActive(t,!0,n)}else!0===t.isActive&&e.setActive(t,!1,n)},e.setActive=function(t,e,i){e?(t.isActive=!0,t.timeUpdated=i):(t.isActive=!1,t.activeContacts.length=0)},e.id=function(t,e){return t.id<e.id?"A"+t.id+"B"+e.id:"A"+e.id+"B"+t.id}},31796:(t,e,i)=>{var n={};t.exports=n;var r=i(37849),s=i(13991);n._pairMaxIdleLife=1e3,n.create=function(t){return s.extend({table:{},list:[],collisionStart:[],collisionActive:[],collisionEnd:[]},t)},n.update=function(t,e,i){var n,s,o,a,h=t.list,u=t.table,l=t.collisionStart,c=t.collisionEnd,d=t.collisionActive;for(l.length=0,c.length=0,d.length=0,a=0;a<h.length;a++)h[a].confirmedActive=!1;for(a=0;a<e.length;a++)(n=e[a]).collided&&((o=u[s=r.id(n.bodyA,n.bodyB)])?(o.isActive?d.push(o):l.push(o),r.update(o,n,i),o.confirmedActive=!0):(o=r.create(n,i),u[s]=o,l.push(o),h.push(o)));for(a=0;a<h.length;a++)(o=h[a]).isActive&&!o.confirmedActive&&(r.setActive(o,!1,i),c.push(o))},n.removeOld=function(t,e){var i,r,s,o,a=t.list,h=t.table,u=[];for(o=0;o<a.length;o++)(r=(i=a[o]).collision).bodyA.isSleeping||r.bodyB.isSleeping?i.timeUpdated=e:e-i.timeUpdated>n._pairMaxIdleLife&&u.push(o);for(o=0;o<u.length;o++)delete h[(i=a[s=u[o]-o]).id],a.splice(s,1)},n.clear=function(t){return t.table={},t.list.length=0,t.collisionStart.length=0,t.collisionActive.length=0,t.collisionEnd.length=0,t}},44542:(t,e,i)=>{var n={};t.exports=n;var r=i(39646),s=i(3946),o=i(17983),a=i(41422),h=i(65714);n.collides=function(t,e){for(var i=[],n=0;n<e.length;n++){var r=e[n];if(t!==r&&o.overlaps(r.bounds,t.bounds))for(var a=1===r.parts.length?0:1;a<r.parts.length;a++){var h=r.parts[a];if(o.overlaps(h.bounds,t.bounds)){var u=s.collides(h,t);if(u.collided){i.push(u);break}}}}return i},n.ray=function(t,e,i,s){s=s||1e-100;for(var o=r.angle(e,i),h=r.magnitude(r.sub(e,i)),u=.5*(i.x+e.x),l=.5*(i.y+e.y),c=a.rectangle(u,l,h,s,{angle:o}),d=n.collides(c,t),p=0;p<d.length;p+=1){var f=d[p];f.body=f.bodyB=f.bodyA}return d},n.region=function(t,e,i){for(var n=[],r=0;r<t.length;r++){var s=t[r],a=o.overlaps(s.bounds,e);(a&&!i||!a&&i)&&n.push(s)}return n},n.point=function(t,e){for(var i=[],n=0;n<t.length;n++){var r=t[n];if(o.contains(r.bounds,e))for(var s=1===r.parts.length?0:1;s<r.parts.length;s++){var a=r.parts[s];if(o.contains(a.bounds,e)&&h.contains(a.vertices,e)){i.push(r);break}}}return i}},28720:(t,e,i)=>{var n={};t.exports=n;var r=i(65714),s=i(39646),o=i(13991),a=i(17983);n._restingThresh=4,n._restingThreshTangent=6,n._positionDampen=.9,n._positionWarming=.8,n._frictionNormalMultiplier=5,n.preSolvePosition=function(t){var e,i,n;for(e=0;e<t.length;e++)(i=t[e]).isActive&&(n=i.activeContacts.length,i.collision.parentA.totalContacts+=n,i.collision.parentB.totalContacts+=n)},n.solvePosition=function(t,e,i){var r,s,o,a,h,u,l,c,d,p,f,m,v,g,y,_,x=i*n._positionDampen;for(r=0;r<e.length;r++){var b=e[r];b.previousPositionImpulse.x=b.positionImpulse.x,b.previousPositionImpulse.y=b.positionImpulse.y}for(r=0;r<t.length;r++)(a=t[r]).isActive&&!a.isSensor&&(u=(h=a.collision).parentA,l=h.parentB,c=h.normal,f=u.previousPositionImpulse,m=l.previousPositionImpulse,p=h.penetration,g=m.x-f.x+p.x,y=m.y-f.y+p.y,d=(s=c.x)*g+(o=c.y)*y,a.separation=d,_=(d-a.slop)*x,(u.isStatic||l.isStatic)&&(_*=2),u.isStatic||u.isSleeping||(v=_/u.totalContacts,u.positionImpulse.x+=s*v,u.positionImpulse.y+=o*v),l.isStatic||l.isSleeping||(v=_/l.totalContacts,l.positionImpulse.x-=s*v,l.positionImpulse.y-=o*v))},n.postSolvePosition=function(t){for(var e=0;e<t.length;e++){var i=t[e];if(i.totalContacts=0,0!==i.positionImpulse.x||0!==i.positionImpulse.y){for(var o=0;o<i.parts.length;o++){var h=i.parts[o];r.translate(h.vertices,i.positionImpulse),a.update(h.bounds,h.vertices,i.velocity),h.position.x+=i.positionImpulse.x,h.position.y+=i.positionImpulse.y}i.positionPrev.x+=i.positionImpulse.x,i.positionPrev.y+=i.positionImpulse.y,s.dot(i.positionImpulse,i.velocity)<0?(i.positionImpulse.x=0,i.positionImpulse.y=0):(i.positionImpulse.x*=n._positionWarming,i.positionImpulse.y*=n._positionWarming)}}},n.preSolveVelocity=function(t){var e,i,n,r,o,a,h,u,l,c,d,p,f,m,v=s._temp[0],g=s._temp[1];for(e=0;e<t.length;e++)if((n=t[e]).isActive&&!n.isSensor)for(r=n.activeContacts,a=(o=n.collision).parentA,h=o.parentB,u=o.normal,l=o.tangent,i=0;i<r.length;i++)d=(c=r[i]).vertex,p=c.normalImpulse,f=c.tangentImpulse,0===p&&0===f||(v.x=u.x*p+l.x*f,v.y=u.y*p+l.y*f,a.isStatic||a.isSleeping||(m=s.sub(d,a.position,g),a.positionPrev.x+=v.x*a.inverseMass,a.positionPrev.y+=v.y*a.inverseMass,a.anglePrev+=s.cross(m,v)*a.inverseInertia),h.isStatic||h.isSleeping||(m=s.sub(d,h.position,g),h.positionPrev.x-=v.x*h.inverseMass,h.positionPrev.y-=v.y*h.inverseMass,h.anglePrev-=s.cross(m,v)*h.inverseInertia))},n.solveVelocity=function(t,e){for(var i=e*e,r=s._temp[0],a=s._temp[1],h=s._temp[2],u=s._temp[3],l=s._temp[4],c=s._temp[5],d=0;d<t.length;d++){var p=t[d];if(p.isActive&&!p.isSensor){var f=p.collision,m=f.parentA,v=f.parentB,g=f.normal,y=f.tangent,_=p.activeContacts,x=1/_.length;m.velocity.x=m.position.x-m.positionPrev.x,m.velocity.y=m.position.y-m.positionPrev.y,v.velocity.x=v.position.x-v.positionPrev.x,v.velocity.y=v.position.y-v.positionPrev.y,m.angularVelocity=m.angle-m.anglePrev,v.angularVelocity=v.angle-v.anglePrev;for(var b=0;b<_.length;b++){var w=_[b],T=w.vertex,M=s.sub(T,m.position,a),S=s.sub(T,v.position,h),E=s.add(m.velocity,s.mult(s.perp(M),m.angularVelocity),u),L=s.add(v.velocity,s.mult(s.perp(S),v.angularVelocity),l),A=s.sub(E,L,c),D=s.dot(g,A),P=s.dot(y,A),C=Math.abs(P),O=o.sign(P),k=(1+p.restitution)*D,R=o.clamp(p.separation+D,0,1)*n._frictionNormalMultiplier,I=P,Y=1/0;C>p.friction*p.frictionStatic*R*i&&(Y=C,I=o.clamp(p.friction*O*i,-Y,Y));var F=s.cross(M,g),N=s.cross(S,g),B=x/(m.inverseMass+v.inverseMass+m.inverseInertia*F*F+v.inverseInertia*N*N);if(k*=B,I*=B,D<0&&D*D>n._restingThresh*i)w.normalImpulse=0;else{var U=w.normalImpulse;w.normalImpulse=Math.min(w.normalImpulse+k,0),k=w.normalImpulse-U}if(P*P>n._restingThreshTangent*i)w.tangentImpulse=0;else{var j=w.tangentImpulse;w.tangentImpulse=o.clamp(w.tangentImpulse+I,-Y,Y),I=w.tangentImpulse-j}r.x=g.x*k+y.x*I,r.y=g.y*k+y.y*I,m.isStatic||m.isSleeping||(m.positionPrev.x+=r.x*m.inverseMass,m.positionPrev.y+=r.y*m.inverseMass,m.anglePrev+=s.cross(M,r)*m.inverseInertia),v.isStatic||v.isSleeping||(v.positionPrev.x-=r.x*v.inverseMass,v.positionPrev.y-=r.y*v.inverseMass,v.anglePrev-=s.cross(S,r)*v.inverseInertia)}}}}},3946:(t,e,i)=>{var n={};t.exports=n;var r=i(65714),s=i(39646);n.collides=function(t,e,i){var o,a,h,u,l=!1;if(i){var c=t.parent,d=e.parent,p=c.speed*c.speed+c.angularSpeed*c.angularSpeed+d.speed*d.speed+d.angularSpeed*d.angularSpeed;l=i&&i.collided&&p<.2,u=i}else u={collided:!1,bodyA:t,bodyB:e};if(i&&l){var f=u.axisBody,m=f===t?e:t,v=[f.axes[i.axisNumber]];if(h=n._overlapAxes(f.vertices,m.vertices,v),u.reused=!0,h.overlap<=0)return u.collided=!1,u}else{if((o=n._overlapAxes(t.vertices,e.vertices,t.axes)).overlap<=0)return u.collided=!1,u;if((a=n._overlapAxes(e.vertices,t.vertices,e.axes)).overlap<=0)return u.collided=!1,u;o.overlap<a.overlap?(h=o,u.axisBody=t):(h=a,u.axisBody=e),u.axisNumber=h.axisNumber}u.bodyA=t.id<e.id?t:e,u.bodyB=t.id<e.id?e:t,u.collided=!0,u.depth=h.overlap,u.parentA=u.bodyA.parent,u.parentB=u.bodyB.parent,t=u.bodyA,e=u.bodyB,s.dot(h.axis,s.sub(e.position,t.position))<0?u.normal={x:h.axis.x,y:h.axis.y}:u.normal={x:-h.axis.x,y:-h.axis.y},u.tangent=s.perp(u.normal),u.penetration=u.penetration||{},u.penetration.x=u.normal.x*u.depth,u.penetration.y=u.normal.y*u.depth;var g=n._findSupports(t,e,u.normal),y=[];if(r.contains(t.vertices,g[0])&&y.push(g[0]),r.contains(t.vertices,g[1])&&y.push(g[1]),y.length<2){var _=n._findSupports(e,t,s.neg(u.normal));r.contains(e.vertices,_[0])&&y.push(_[0]),y.length<2&&r.contains(e.vertices,_[1])&&y.push(_[1])}return y.length<1&&(y=[g[0]]),u.supports=y,u},n._overlapAxes=function(t,e,i){for(var r,o,a=s._temp[0],h=s._temp[1],u={overlap:Number.MAX_VALUE},l=0;l<i.length;l++){if(o=i[l],n._projectToAxis(a,t,o),n._projectToAxis(h,e,o),(r=Math.min(a.max-h.min,h.max-a.min))<=0)return u.overlap=r,u;r<u.overlap&&(u.overlap=r,u.axis=o,u.axisNumber=l)}return u},n._projectToAxis=function(t,e,i){for(var n=s.dot(e[0],i),r=n,o=1;o<e.length;o+=1){var a=s.dot(e[o],i);a>r?r=a:a<n&&(n=a)}t.min=n,t.max=r},n._findSupports=function(t,e,i){for(var n,r,o,a,h=Number.MAX_VALUE,u=s._temp[0],l=e.vertices,c=t.position,d=0;d<l.length;d++)r=l[d],u.x=r.x-c.x,u.y=r.y-c.y,(n=-s.dot(i,u))<h&&(h=n,o=r);return r=l[o.index-1>=0?o.index-1:l.length-1],u.x=r.x-c.x,u.y=r.y-c.y,h=-s.dot(i,u),a=r,r=l[(o.index+1)%l.length],u.x=r.x-c.x,u.y=r.y-c.y,(n=-s.dot(i,u))<h&&(a=r),[o,a]}},69436:(t,e,i)=>{var n={};t.exports=n;var r=i(65714),s=i(39646),o=i(59114),a=i(17983),h=i(58383),u=i(13991);n._warming=.4,n._torqueDampen=1,n._minLength=1e-6,n.create=function(t){var e=t;e.bodyA&&!e.pointA&&(e.pointA={x:0,y:0}),e.bodyB&&!e.pointB&&(e.pointB={x:0,y:0});var i=e.bodyA?s.add(e.bodyA.position,e.pointA):e.pointA,n=e.bodyB?s.add(e.bodyB.position,e.pointB):e.pointB,r=s.magnitude(s.sub(i,n));e.length=void 0!==e.length?e.length:r,e.id=e.id||u.nextId(),e.label=e.label||"Constraint",e.type="constraint",e.stiffness=e.stiffness||(e.length>0?1:.7),e.damping=e.damping||0,e.angularStiffness=e.angularStiffness||0,e.angleA=e.bodyA?e.bodyA.angle:e.angleA,e.angleB=e.bodyB?e.bodyB.angle:e.angleB,e.plugin={};var o={visible:!0,type:"line",anchors:!0,lineColor:null,lineOpacity:null,lineThickness:null,pinSize:null,anchorColor:null,anchorSize:null};return 0===e.length&&e.stiffness>.1?(o.type="pin",o.anchors=!1):e.stiffness<.9&&(o.type="spring"),e.render=u.extend(o,e.render),e},n.preSolveAll=function(t){for(var e=0;e<t.length;e+=1){var i=t[e],n=i.constraintImpulse;i.isStatic||0===n.x&&0===n.y&&0===n.angle||(i.position.x+=n.x,i.position.y+=n.y,i.angle+=n.angle)}},n.solveAll=function(t,e){for(var i=0;i<t.length;i+=1){var r=t[i],s=!r.bodyA||r.bodyA&&r.bodyA.isStatic,o=!r.bodyB||r.bodyB&&r.bodyB.isStatic;(s||o)&&n.solve(t[i],e)}for(i=0;i<t.length;i+=1)s=!(r=t[i]).bodyA||r.bodyA&&r.bodyA.isStatic,o=!r.bodyB||r.bodyB&&r.bodyB.isStatic,s||o||n.solve(t[i],e)},n.solve=function(t,e){var i=t.bodyA,r=t.bodyB,o=t.pointA,a=t.pointB;if(i||r){i&&!i.isStatic&&(s.rotate(o,i.angle-t.angleA,o),t.angleA=i.angle),r&&!r.isStatic&&(s.rotate(a,r.angle-t.angleB,a),t.angleB=r.angle);var h=o,u=a;if(i&&(h=s.add(i.position,o)),r&&(u=s.add(r.position,a)),h&&u){var l=s.sub(h,u),c=s.magnitude(l);c<n._minLength&&(c=n._minLength);var d,p,f,m,v,g=(c-t.length)/c,y=t.stiffness<1?t.stiffness*e:t.stiffness,_=s.mult(l,g*y),x=(i?i.inverseMass:0)+(r?r.inverseMass:0),b=x+((i?i.inverseInertia:0)+(r?r.inverseInertia:0));if(t.damping){var w=s.create();f=s.div(l,c),v=s.sub(r&&s.sub(r.position,r.positionPrev)||w,i&&s.sub(i.position,i.positionPrev)||w),m=s.dot(f,v)}i&&!i.isStatic&&(p=i.inverseMass/x,i.constraintImpulse.x-=_.x*p,i.constraintImpulse.y-=_.y*p,i.position.x-=_.x*p,i.position.y-=_.y*p,t.damping&&(i.positionPrev.x-=t.damping*f.x*m*p,i.positionPrev.y-=t.damping*f.y*m*p),d=s.cross(o,_)/b*n._torqueDampen*i.inverseInertia*(1-t.angularStiffness),i.constraintImpulse.angle-=d,i.angle-=d),r&&!r.isStatic&&(p=r.inverseMass/x,r.constraintImpulse.x+=_.x*p,r.constraintImpulse.y+=_.y*p,r.position.x+=_.x*p,r.position.y+=_.y*p,t.damping&&(r.positionPrev.x+=t.damping*f.x*m*p,r.positionPrev.y+=t.damping*f.y*m*p),d=s.cross(a,_)/b*n._torqueDampen*r.inverseInertia*(1-t.angularStiffness),r.constraintImpulse.angle+=d,r.angle+=d)}}},n.postSolveAll=function(t){for(var e=0;e<t.length;e++){var i=t[e],u=i.constraintImpulse;if(!(i.isStatic||0===u.x&&0===u.y&&0===u.angle)){o.set(i,!1);for(var l=0;l<i.parts.length;l++){var c=i.parts[l];r.translate(c.vertices,u),l>0&&(c.position.x+=u.x,c.position.y+=u.y),0!==u.angle&&(r.rotate(c.vertices,u.angle,i.position),h.rotate(c.axes,u.angle),l>0&&s.rotateAbout(c.position,u.angle,i.position,c.position)),a.update(c.bounds,c.vertices,i.velocity)}u.angle*=n._warming,u.x*=n._warming,u.y*=n._warming}}},n.pointAWorld=function(t){return{x:(t.bodyA?t.bodyA.position.x:0)+t.pointA.x,y:(t.bodyA?t.bodyA.position.y:0)+t.pointA.y}},n.pointBWorld=function(t){return{x:(t.bodyB?t.bodyB.position.x:0)+t.pointB.x,y:(t.bodyB?t.bodyB.position.y:0)+t.pointB.y}}},13991:t=>{var e={};t.exports=e,function(){e._nextId=0,e._seed=0,e._nowStartTime=+new Date,e.extend=function(t,i){var n,r;"boolean"==typeof i?(n=2,r=i):(n=1,r=!0);for(var s=n;s<arguments.length;s++){var o=arguments[s];if(o)for(var a in o)r&&o[a]&&o[a].constructor===Object?t[a]&&t[a].constructor!==Object?t[a]=o[a]:(t[a]=t[a]||{},e.extend(t[a],r,o[a])):t[a]=o[a]}return t},e.clone=function(t,i){return e.extend({},i,t)},e.keys=function(t){if(Object.keys)return Object.keys(t);var e=[];for(var i in t)e.push(i);return e},e.values=function(t){var e=[];if(Object.keys){for(var i=Object.keys(t),n=0;n<i.length;n++)e.push(t[i[n]]);return e}for(var r in t)e.push(t[r]);return e},e.get=function(t,e,i,n){e=e.split(".").slice(i,n);for(var r=0;r<e.length;r+=1)t=t[e[r]];return t},e.set=function(t,i,n,r,s){var o=i.split(".").slice(r,s);return e.get(t,i,0,-1)[o[o.length-1]]=n,n},e.shuffle=function(t){for(var i=t.length-1;i>0;i--){var n=Math.floor(e.random()*(i+1)),r=t[i];t[i]=t[n],t[n]=r}return t},e.choose=function(t){return t[Math.floor(e.random()*t.length)]},e.isElement=function(t){return"undefined"!=typeof HTMLElement?t instanceof HTMLElement:!!(t&&t.nodeType&&t.nodeName)},e.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},e.isFunction=function(t){return"function"==typeof t},e.isPlainObject=function(t){return"object"==typeof t&&t.constructor===Object},e.isString=function(t){return"[object String]"===Object.prototype.toString.call(t)},e.clamp=function(t,e,i){return t<e?e:t>i?i:t},e.sign=function(t){return t<0?-1:1},e.now=function(){if("undefined"!=typeof window&&window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return new Date-e._nowStartTime},e.random=function(e,i){return i=void 0!==i?i:1,(e=void 0!==e?e:0)+t()*(i-e)};var t=function(){return e._seed=(9301*e._seed+49297)%233280,e._seed/233280};e.colorToNumber=function(t){return 3==(t=t.replace("#","")).length&&(t=t.charAt(0)+t.charAt(0)+t.charAt(1)+t.charAt(1)+t.charAt(2)+t.charAt(2)),parseInt(t,16)},e.logLevel=1,e.log=function(){console&&e.logLevel>0&&e.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},e.info=function(){console&&e.logLevel>0&&e.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},e.warn=function(){console&&e.logLevel>0&&e.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},e.nextId=function(){return e._nextId++},e.indexOf=function(t,e){if(t.indexOf)return t.indexOf(e);for(var i=0;i<t.length;i++)if(t[i]===e)return i;return-1},e.map=function(t,e){if(t.map)return t.map(e);for(var i=[],n=0;n<t.length;n+=1)i.push(e(t[n]));return i},e.topologicalSort=function(t){var i=[],n=[],r=[];for(var s in t)n[s]||r[s]||e._topologicalSort(s,n,r,t,i);return i},e._topologicalSort=function(t,i,n,r,s){var o=r[t]||[];n[t]=!0;for(var a=0;a<o.length;a+=1){var h=o[a];n[h]||(i[h]||e._topologicalSort(h,i,n,r,s))}n[t]=!1,i[t]=!0,s.push(t)},e.chain=function(){for(var t=[],e=0;e<arguments.length;e+=1){var i=arguments[e];i._chained?t.push.apply(t,i._chained):t.push(i)}var n=function(){for(var e,i=new Array(arguments.length),n=0,r=arguments.length;n<r;n++)i[n]=arguments[n];for(n=0;n<t.length;n+=1){var s=t[n].apply(e,i);void 0!==s&&(e=s)}return e};return n._chained=t,n},e.chainPathBefore=function(t,i,n){return e.set(t,i,e.chain(n,e.get(t,i)))},e.chainPathAfter=function(t,i,n){return e.set(t,i,e.chain(e.get(t,i),n))}}()},10153:(t,e,i)=>{var n={};t.exports=n;var r=i(36606),s=i(59114),o=i(28720),a=i(31796),h=i(50284),u=i(88424),l=i(84900),c=i(69643),d=i(69436),p=i(13991),f=i(32663);n.create=function(t,e){e=(e=p.isElement(t)?e:t)||{},((t=p.isElement(t)?t:null)||e.render)&&p.warn("Engine.create: engine.render is deprecated (see docs)");var i={positionIterations:6,velocityIterations:4,constraintIterations:2,enableSleeping:!1,events:[],plugin:{},timing:{timestamp:0,timeScale:1},broadphase:{controller:u}},n=p.extend(i,e);return n.world=e.world||r.create(n.world),n.pairs=a.create(),n.broadphase=n.broadphase.controller.create(n.broadphase),n.metrics=n.metrics||{extended:!1},n.metrics=h.create(n.metrics),n},n.update=function(t,e,i){e=e||1e3/60,i=i||1;var r,u=t.world,p=t.timing,f=t.broadphase,m=[];p.timestamp+=e*p.timeScale;var v={timestamp:p.timestamp};l.trigger(t,"beforeUpdate",v);var g=c.allBodies(u),y=c.allConstraints(u);for(h.reset(t.metrics),t.enableSleeping&&s.update(g,p.timeScale),n._bodiesApplyGravity(g,u.gravity),n._bodiesUpdate(g,e,p.timeScale,i,u.bounds),d.preSolveAll(g),r=0;r<t.constraintIterations;r++)d.solveAll(y,p.timeScale);d.postSolveAll(g),f.controller?(u.isModified&&f.controller.clear(f),f.controller.update(f,g,t,u.isModified),m=f.pairsList):m=g,u.isModified&&c.setModified(u,!1,!1,!0);var _=f.detector(m,t),x=t.pairs,b=p.timestamp;for(a.update(x,_,b),a.removeOld(x,b),t.enableSleeping&&s.afterCollisions(x.list,p.timeScale),x.collisionStart.length>0&&l.trigger(t,"collisionStart",{pairs:x.collisionStart}),o.preSolvePosition(x.list),r=0;r<t.positionIterations;r++)o.solvePosition(x.list,g,p.timeScale);for(o.postSolvePosition(g),d.preSolveAll(g),r=0;r<t.constraintIterations;r++)d.solveAll(y,p.timeScale);for(d.postSolveAll(g),o.preSolveVelocity(x.list),r=0;r<t.velocityIterations;r++)o.solveVelocity(x.list,p.timeScale);return x.collisionActive.length>0&&l.trigger(t,"collisionActive",{pairs:x.collisionActive}),x.collisionEnd.length>0&&l.trigger(t,"collisionEnd",{pairs:x.collisionEnd}),h.update(t.metrics,t),n._bodiesClearForces(g),l.trigger(t,"afterUpdate",v),t},n.merge=function(t,e){if(p.extend(t,e),e.world){t.world=e.world,n.clear(t);for(var i=c.allBodies(t.world),r=0;r<i.length;r++){var o=i[r];s.set(o,!1),o.id=p.nextId()}}},n.clear=function(t){var e=t.world;a.clear(t.pairs);var i=t.broadphase;if(i.controller){var n=c.allBodies(e);i.controller.clear(i),i.controller.update(i,n,t,!0)}},n._bodiesClearForces=function(t){for(var e=0;e<t.length;e++){var i=t[e];i.force.x=0,i.force.y=0,i.torque=0}},n._bodiesApplyGravity=function(t,e){var i=void 0!==e.scale?e.scale:.001;if((0!==e.x||0!==e.y)&&0!==i)for(var n=0;n<t.length;n++){var r=t[n];r.ignoreGravity||r.isStatic||r.isSleeping||(r.force.x+=r.mass*e.x*i*r.gravityScale.x,r.force.y+=r.mass*e.y*i*r.gravityScale.y)}},n._bodiesUpdate=function(t,e,i,n,r){for(var s=0;s<t.length;s++){var o=t[s];o.isStatic||o.isSleeping||f.update(o,e,i,n)}}},84900:(t,e,i)=>{var n={};t.exports=n;var r=i(13991);n.on=function(t,e,i){for(var n,r=e.split(" "),s=0;s<r.length;s++)n=r[s],t.events=t.events||{},t.events[n]=t.events[n]||[],t.events[n].push(i);return i},n.off=function(t,e,i){if(e){"function"==typeof e&&(i=e,e=r.keys(t.events).join(" "));for(var n=e.split(" "),s=0;s<n.length;s++){var o=t.events[n[s]],a=[];if(i&&o)for(var h=0;h<o.length;h++)o[h]!==i&&a.push(o[h]);t.events[n[s]]=a}}else t.events={}},n.trigger=function(t,e,i){var n,s,o,a,h=t.events;if(h&&r.keys(h).length>0){i||(i={}),n=e.split(" ");for(var u=0;u<n.length;u++)if(o=h[s=n[u]]){(a=r.clone(i,!1)).name=s,a.source=t;for(var l=0;l<o.length;l++)o[l].apply(t,[a])}}}},66995:(t,e,i)=>{var n={};t.exports=n;var r=i(41880),s=i(13991);n.name="matter-js",n.version="0.14.2",n.uses=[],n.used=[],n.use=function(){r.use(n,Array.prototype.slice.call(arguments))},n.before=function(t,e){return t=t.replace(/^Matter./,""),s.chainPathBefore(n,t,e)},n.after=function(t,e){return t=t.replace(/^Matter./,""),s.chainPathAfter(n,t,e)}},50284:(t,e,i)=>{var n={};t.exports=n;var r=i(69643),s=i(13991);n.create=function(t){return s.extend({extended:!1,narrowDetections:0,narrowphaseTests:0,narrowReuse:0,narrowReuseCount:0,midphaseTests:0,broadphaseTests:0,narrowEff:1e-4,midEff:1e-4,broadEff:1e-4,collisions:0,buckets:0,bodies:0,pairs:0},!1,t)},n.reset=function(t){t.extended&&(t.narrowDetections=0,t.narrowphaseTests=0,t.narrowReuse=0,t.narrowReuseCount=0,t.midphaseTests=0,t.broadphaseTests=0,t.narrowEff=0,t.midEff=0,t.broadEff=0,t.collisions=0,t.buckets=0,t.pairs=0,t.bodies=0)},n.update=function(t,e){if(t.extended){var i=e.world,n=r.allBodies(i);t.collisions=t.narrowDetections,t.pairs=e.pairs.list.length,t.bodies=n.length,t.midEff=(t.narrowDetections/(t.midphaseTests||1)).toFixed(2),t.narrowEff=(t.narrowDetections/(t.narrowphaseTests||1)).toFixed(2),t.broadEff=(1-t.broadphaseTests/(n.length||1)).toFixed(2),t.narrowReuse=(t.narrowReuseCount/(t.narrowphaseTests||1)).toFixed(2)}}},41880:(t,e,i)=>{var n={};t.exports=n;var r=i(13991);n._registry={},n.register=function(t){if(n.isPlugin(t)||r.warn("Plugin.register:",n.toString(t),"does not implement all required fields."),t.name in n._registry){var e=n._registry[t.name],i=n.versionParse(t.version).number,s=n.versionParse(e.version).number;i>s?(r.warn("Plugin.register:",n.toString(e),"was upgraded to",n.toString(t)),n._registry[t.name]=t):i<s?r.warn("Plugin.register:",n.toString(e),"can not be downgraded to",n.toString(t)):t!==e&&r.warn("Plugin.register:",n.toString(t),"is already registered to different plugin object")}else n._registry[t.name]=t;return t},n.resolve=function(t){return n._registry[n.dependencyParse(t).name]},n.toString=function(t){return"string"==typeof t?t:(t.name||"anonymous")+"@"+(t.version||t.range||"0.0.0")},n.isPlugin=function(t){return t&&t.name&&t.version&&t.install},n.isUsed=function(t,e){return t.used.indexOf(e)>-1},n.isFor=function(t,e){var i=t.for&&n.dependencyParse(t.for);return!t.for||e.name===i.name&&n.versionSatisfies(e.version,i.range)},n.use=function(t,e){if(t.uses=(t.uses||[]).concat(e||[]),0!==t.uses.length){for(var i=n.dependencies(t),s=r.topologicalSort(i),o=[],a=0;a<s.length;a+=1)if(s[a]!==t.name){var h=n.resolve(s[a]);h?n.isUsed(t,h.name)||(n.isFor(h,t)||(r.warn("Plugin.use:",n.toString(h),"is for",h.for,"but installed on",n.toString(t)+"."),h._warned=!0),h.install?h.install(t):(r.warn("Plugin.use:",n.toString(h),"does not specify an install function."),h._warned=!0),h._warned?(o.push("\u{1f536} "+n.toString(h)),delete h._warned):o.push("\u2705 "+n.toString(h)),t.used.push(h.name)):o.push("\u274c "+s[a])}o.length>0&&!h.silent&&r.info(o.join(" "))}else r.warn("Plugin.use:",n.toString(t),"does not specify any dependencies to install.")},n.dependencies=function(t,e){var i=n.dependencyParse(t),s=i.name;if(!(s in(e=e||{}))){t=n.resolve(t)||t,e[s]=r.map(t.uses||[],(function(e){n.isPlugin(e)&&n.register(e);var s=n.dependencyParse(e),o=n.resolve(e);return o&&!n.versionSatisfies(o.version,s.range)?(r.warn("Plugin.dependencies:",n.toString(o),"does not satisfy",n.toString(s),"used by",n.toString(i)+"."),o._warned=!0,t._warned=!0):o||(r.warn("Plugin.dependencies:",n.toString(e),"used by",n.toString(i),"could not be resolved."),t._warned=!0),s.name}));for(var o=0;o<e[s].length;o+=1)n.dependencies(e[s][o],e);return e}},n.dependencyParse=function(t){return r.isString(t)?(/^[\w-]+(@(\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?))?$/.test(t)||r.warn("Plugin.dependencyParse:",t,"is not a valid dependency string."),{name:t.split("@")[0],range:t.split("@")[1]||"*"}):{name:t.name,range:t.range||t.version}},n.versionParse=function(t){/^\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?$/.test(t)||r.warn("Plugin.versionParse:",t,"is not a valid version or range.");var e=t.split("-");t=e[0];var i=isNaN(Number(t[0])),n=i?t.substr(1):t,s=r.map(n.split("."),(function(t){return Number(t)}));return{isRange:i,version:n,range:t,operator:i?t[0]:"",parts:s,prerelease:e[1],number:1e8*s[0]+1e4*s[1]+s[2]}},n.versionSatisfies=function(t,e){e=e||"*";var i=n.versionParse(e),r=i.parts,s=n.versionParse(t),o=s.parts;if(i.isRange){if("*"===i.operator||"*"===t)return!0;if("~"===i.operator)return o[0]===r[0]&&o[1]===r[1]&&o[2]>=r[2];if("^"===i.operator)return r[0]>0?o[0]===r[0]&&s.number>=i.number:r[1]>0?o[1]===r[1]&&o[2]>=r[2]:o[2]===r[2]}return t===e||"*"===t}},59114:(t,e,i)=>{var n={};t.exports=n;var r=i(84900);n._motionWakeThreshold=.18,n._motionSleepThreshold=.08,n._minBias=.9,n.update=function(t,e){for(var i=e*e*e,r=0;r<t.length;r++){var s=t[r],o=s.speed*s.speed+s.angularSpeed*s.angularSpeed;if(0===s.force.x&&0===s.force.y){var a=Math.min(s.motion,o),h=Math.max(s.motion,o);s.motion=n._minBias*a+(1-n._minBias)*h,s.sleepThreshold>0&&s.motion<n._motionSleepThreshold*i?(s.sleepCounter+=1,s.sleepCounter>=s.sleepThreshold&&n.set(s,!0)):s.sleepCounter>0&&(s.sleepCounter-=1)}else n.set(s,!1)}},n.afterCollisions=function(t,e){for(var i=e*e*e,r=0;r<t.length;r++){var s=t[r];if(s.isActive){var o=s.collision,a=o.bodyA.parent,h=o.bodyB.parent;if(!(a.isSleeping&&h.isSleeping||a.isStatic||h.isStatic)&&(a.isSleeping||h.isSleeping)){var u=a.isSleeping&&!a.isStatic?a:h,l=u===a?h:a;!u.isStatic&&l.motion>n._motionWakeThreshold*i&&n.set(u,!1)}}}},n.set=function(t,e){var i=t.isSleeping;e?(t.isSleeping=!0,t.sleepCounter=t.sleepThreshold,t.positionImpulse.x=0,t.positionImpulse.y=0,t.positionPrev.x=t.position.x,t.positionPrev.y=t.position.y,t.anglePrev=t.angle,t.speed=0,t.angularSpeed=0,t.motion=0,i||r.trigger(t,"sleepStart")):(t.isSleeping=!1,t.sleepCounter=0,i&&r.trigger(t,"sleepEnd"))}},41422:(t,e,i)=>{var n={};t.exports=n;var r=i(65714),s=i(13991),o=i(32663),a=i(17983),h=i(39646),u=i(6384);n.rectangle=function(t,e,i,n,a){a=a||{};var h={label:"Rectangle Body",position:{x:t,y:e},vertices:r.fromPath("L 0 0 L "+i+" 0 L "+i+" "+n+" L 0 "+n)};if(a.chamfer){var u=a.chamfer;h.vertices=r.chamfer(h.vertices,u.radius,u.quality,u.qualityMin,u.qualityMax),delete a.chamfer}return o.create(s.extend({},h,a))},n.trapezoid=function(t,e,i,n,a,h){h=h||{};var u,l=i*(a*=.5),c=l+(1-2*a)*i,d=c+l;u=a<.5?"L 0 0 L "+l+" "+-n+" L "+c+" "+-n+" L "+d+" 0":"L 0 0 L "+c+" "+-n+" L "+d+" 0";var p={label:"Trapezoid Body",position:{x:t,y:e},vertices:r.fromPath(u)};if(h.chamfer){var f=h.chamfer;p.vertices=r.chamfer(p.vertices,f.radius,f.quality,f.qualityMin,f.qualityMax),delete h.chamfer}return o.create(s.extend({},p,h))},n.circle=function(t,e,i,r,o){r=r||{};var a={label:"Circle Body",circleRadius:i};o=o||25;var h=Math.ceil(Math.max(10,Math.min(o,i)));return h%2==1&&(h+=1),n.polygon(t,e,h,i,s.extend({},a,r))},n.polygon=function(t,e,i,a,h){if(h=h||{},i<3)return n.circle(t,e,a,h);for(var u=2*Math.PI/i,l="",c=.5*u,d=0;d<i;d+=1){var p=c+d*u,f=Math.cos(p)*a,m=Math.sin(p)*a;l+="L "+f.toFixed(3)+" "+m.toFixed(3)+" "}var v={label:"Polygon Body",position:{x:t,y:e},vertices:r.fromPath(l)};if(h.chamfer){var g=h.chamfer;v.vertices=r.chamfer(v.vertices,g.radius,g.quality,g.qualityMin,g.qualityMax),delete h.chamfer}return o.create(s.extend({},v,h))},n.fromVertices=function(t,e,i,a,h,l,c){var d,p,f,m,v,g;for(a=a||{},p=[],h=void 0!==h&&h,l=void 0!==l?l:.01,c=void 0!==c?c:10,u||s.warn("Bodies.fromVertices: poly-decomp.js required. Could not decompose vertices. Fallback to convex hull."),s.isArray(i[0])||(i=[i]),g=0;g<i.length;g+=1)if(m=i[g],(f=r.isConvex(m))||!u)m=f?r.clockwiseSort(m):r.hull(m),p.push({position:{x:t,y:e},vertices:m});else{var y=m.map((function(t){return[t.x,t.y]}));u.makeCCW(y),!1!==l&&u.removeCollinearPoints(y,l);var _=u.quickDecomp(y);for(v=0;v<_.length;v++){var x=_[v].map((function(t){return{x:t[0],y:t[1]}}));c>0&&r.area(x)<c||p.push({position:r.centre(x),vertices:x})}}for(v=0;v<p.length;v++)p[v]=o.create(s.extend(p[v],a));return h&&n.flagCoincidentParts(p,5),p.length>1?(d=o.create(s.extend({parts:p.slice(0)},a)),o.setPosition(d,{x:t,y:e}),d):p[0]},n.flagCoincidentParts=function(t,e){void 0===e&&(e=5);for(var i=0;i<t.length;i++)for(var n=t[i],r=i+1;r<t.length;r++){var s=t[r];if(a.overlaps(n.bounds,s.bounds))for(var o=n.vertices,u=s.vertices,l=0;l<n.vertices.length;l++)for(var c=0;c<s.vertices.length;c++){var d=h.magnitudeSquared(h.sub(o[(l+1)%o.length],u[c])),p=h.magnitudeSquared(h.sub(o[l],u[(c+1)%u.length]));d<e&&p<e&&(o[l].isInternal=!0,u[c].isInternal=!0)}}return t}},36162:(t,e,i)=>{var n={};t.exports=n;var r=i(69643),s=i(69436),o=i(13991),a=i(32663),h=i(41422);n.stack=function(t,e,i,n,s,o,h){for(var u,l=r.create({label:"Stack"}),c=t,d=e,p=0,f=0;f<n;f++){for(var m=0,v=0;v<i;v++){var g=h(c,d,v,f,u,p);if(g){var y=g.bounds.max.y-g.bounds.min.y,_=g.bounds.max.x-g.bounds.min.x;y>m&&(m=y),a.translate(g,{x:.5*_,y:.5*y}),c=g.bounds.max.x+s,r.addBody(l,g),u=g,p+=1}else c+=s}d+=m+o,c=t}return l},n.chain=function(t,e,i,n,a,h){for(var u=t.bodies,l=1;l<u.length;l++){var c=u[l-1],d=u[l],p=c.bounds.max.y-c.bounds.min.y,f=c.bounds.max.x-c.bounds.min.x,m=d.bounds.max.y-d.bounds.min.y,v={bodyA:c,pointA:{x:f*e,y:p*i},bodyB:d,pointB:{x:(d.bounds.max.x-d.bounds.min.x)*n,y:m*a}},g=o.extend(v,h);r.addConstraint(t,s.create(g))}return t.label+=" Chain",t},n.mesh=function(t,e,i,n,a){var h,u,l,c,d,p=t.bodies;for(h=0;h<i;h++){for(u=1;u<e;u++)l=p[u-1+h*e],c=p[u+h*e],r.addConstraint(t,s.create(o.extend({bodyA:l,bodyB:c},a)));if(h>0)for(u=0;u<e;u++)l=p[u+(h-1)*e],c=p[u+h*e],r.addConstraint(t,s.create(o.extend({bodyA:l,bodyB:c},a))),n&&u>0&&(d=p[u-1+(h-1)*e],r.addConstraint(t,s.create(o.extend({bodyA:d,bodyB:c},a)))),n&&u<e-1&&(d=p[u+1+(h-1)*e],r.addConstraint(t,s.create(o.extend({bodyA:d,bodyB:c},a))))}return t.label+=" Mesh",t},n.pyramid=function(t,e,i,r,s,o,h){return n.stack(t,e,i,r,s,o,(function(e,n,o,u,l,c){var d=Math.min(r,Math.ceil(i/2)),p=l?l.bounds.max.x-l.bounds.min.x:0;if(!(u>d||o<(u=d-u)||o>i-1-u))return 1===c&&a.translate(l,{x:(o+(i%2==1?1:-1))*p,y:0}),h(t+(l?o*p:0)+o*s,n,o,u,l,c)}))},n.newtonsCradle=function(t,e,i,n,o){for(var a=r.create({label:"Newtons Cradle"}),u=0;u<i;u++){var l=h.circle(t+u*(1.9*n),e+o,n,{inertia:1/0,restitution:1,friction:0,frictionAir:1e-4,slop:1}),c=s.create({pointA:{x:t+u*(1.9*n),y:e},bodyB:l});r.addBody(a,l),r.addConstraint(a,c)}return a},n.car=function(t,e,i,n,o){var u=a.nextGroup(!0),l=.5*-i+20,c=.5*i-20,d=r.create({label:"Car"}),p=h.rectangle(t,e,i,n,{collisionFilter:{group:u},chamfer:{radius:.5*n},density:2e-4}),f=h.circle(t+l,e+0,o,{collisionFilter:{group:u},friction:.8}),m=h.circle(t+c,e+0,o,{collisionFilter:{group:u},friction:.8}),v=s.create({bodyB:p,pointB:{x:l,y:0},bodyA:f,stiffness:1,length:0}),g=s.create({bodyB:p,pointB:{x:c,y:0},bodyA:m,stiffness:1,length:0});return r.addBody(d,p),r.addBody(d,f),r.addBody(d,m),r.addConstraint(d,v),r.addConstraint(d,g),d},n.softBody=function(t,e,i,r,s,a,u,l,c,d){c=o.extend({inertia:1/0},c),d=o.extend({stiffness:.2,render:{type:"line",anchors:!1}},d);var p=n.stack(t,e,i,r,s,a,(function(t,e){return h.circle(t,e,l,c)}));return n.mesh(p,i,r,u,d),p.label="Soft Body",p}},58383:(t,e,i)=>{var n={};t.exports=n;var r=i(39646),s=i(13991);n.fromVertices=function(t){for(var e={},i=0;i<t.length;i++){var n=(i+1)%t.length,o=r.normalise({x:t[n].y-t[i].y,y:t[i].x-t[n].x}),a=0===o.y?1/0:o.x/o.y;e[a=a.toFixed(3).toString()]=o}return s.values(e)},n.rotate=function(t,e){if(0!==e)for(var i=Math.cos(e),n=Math.sin(e),r=0;r<t.length;r++){var s,o=t[r];s=o.x*i-o.y*n,o.y=o.x*n+o.y*i,o.x=s}}},17983:t=>{var e={};t.exports=e,e.create=function(t){var i={min:{x:0,y:0},max:{x:0,y:0}};return t&&e.update(i,t),i},e.update=function(t,e,i){t.min.x=1/0,t.max.x=-1/0,t.min.y=1/0,t.max.y=-1/0;for(var n=0;n<e.length;n++){var r=e[n];r.x>t.max.x&&(t.max.x=r.x),r.x<t.min.x&&(t.min.x=r.x),r.y>t.max.y&&(t.max.y=r.y),r.y<t.min.y&&(t.min.y=r.y)}i&&(i.x>0?t.max.x+=i.x:t.min.x+=i.x,i.y>0?t.max.y+=i.y:t.min.y+=i.y)},e.contains=function(t,e){return e.x>=t.min.x&&e.x<=t.max.x&&e.y>=t.min.y&&e.y<=t.max.y},e.overlaps=function(t,e){return t.min.x<=e.max.x&&t.max.x>=e.min.x&&t.max.y>=e.min.y&&t.min.y<=e.max.y},e.translate=function(t,e){t.min.x+=e.x,t.max.x+=e.x,t.min.y+=e.y,t.max.y+=e.y},e.shift=function(t,e){var i=t.max.x-t.min.x,n=t.max.y-t.min.y;t.min.x=e.x,t.max.x=e.x+i,t.min.y=e.y,t.max.y=e.y+n}},34968:(t,e,i)=>{var n={};t.exports=n;i(17983);var r=i(13991);n.pathToVertices=function(t,e){"undefined"==typeof window||"SVGPathSeg"in window||r.warn("Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.");var i,s,o,a,h,u,l,c,d,p,f,m=[],v=0,g=0,y=0;e=e||15;var _=function(t,e,i){var n=i%2==1&&i>1;if(!d||t!=d.x||e!=d.y){d&&n?(p=d.x,f=d.y):(p=0,f=0);var r={x:p+t,y:f+e};!n&&d||(d=r),m.push(r),g=p+t,y=f+e}},x=function(t){var e=t.pathSegTypeAsLetter.toUpperCase();if("Z"!==e){switch(e){case"M":case"L":case"T":case"C":case"S":case"Q":g=t.x,y=t.y;break;case"H":g=t.x;break;case"V":y=t.y}_(g,y,t.pathSegType)}};for(n._svgPathToAbsolute(t),o=t.getTotalLength(),u=[],i=0;i<t.pathSegList.numberOfItems;i+=1)u.push(t.pathSegList.getItem(i));for(l=u.concat();v<o;){if((h=u[t.getPathSegAtLength(v)])!=c){for(;l.length&&l[0]!=h;)x(l.shift());c=h}switch(h.pathSegTypeAsLetter.toUpperCase()){case"C":case"T":case"S":case"Q":case"A":a=t.getPointAtLength(v),_(a.x,a.y,0)}v+=e}for(i=0,s=l.length;i<s;++i)x(l[i]);return m},n._svgPathToAbsolute=function(t){for(var e,i,n,r,s,o,a=t.pathSegList,h=0,u=0,l=a.numberOfItems,c=0;c<l;++c){var d=a.getItem(c),p=d.pathSegTypeAsLetter;if(/[MLHVCSQTA]/.test(p))"x"in d&&(h=d.x),"y"in d&&(u=d.y);else switch("x1"in d&&(n=h+d.x1),"x2"in d&&(s=h+d.x2),"y1"in d&&(r=u+d.y1),"y2"in d&&(o=u+d.y2),"x"in d&&(h+=d.x),"y"in d&&(u+=d.y),p){case"m":a.replaceItem(t.createSVGPathSegMovetoAbs(h,u),c);break;case"l":a.replaceItem(t.createSVGPathSegLinetoAbs(h,u),c);break;case"h":a.replaceItem(t.createSVGPathSegLinetoHorizontalAbs(h),c);break;case"v":a.replaceItem(t.createSVGPathSegLinetoVerticalAbs(u),c);break;case"c":a.replaceItem(t.createSVGPathSegCurvetoCubicAbs(h,u,n,r,s,o),c);break;case"s":a.replaceItem(t.createSVGPathSegCurvetoCubicSmoothAbs(h,u,s,o),c);break;case"q":a.replaceItem(t.createSVGPathSegCurvetoQuadraticAbs(h,u,n,r),c);break;case"t":a.replaceItem(t.createSVGPathSegCurvetoQuadraticSmoothAbs(h,u),c);break;case"a":a.replaceItem(t.createSVGPathSegArcAbs(h,u,d.r1,d.r2,d.angle,d.largeArcFlag,d.sweepFlag),c);break;case"z":case"Z":h=e,u=i}"M"!=p&&"m"!=p||(e=h,i=u)}}},39646:t=>{var e={};t.exports=e,e.create=function(t,e){return{x:t||0,y:e||0}},e.clone=function(t){return{x:t.x,y:t.y}},e.magnitude=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},e.magnitudeSquared=function(t){return t.x*t.x+t.y*t.y},e.rotate=function(t,e,i){var n=Math.cos(e),r=Math.sin(e);i||(i={});var s=t.x*n-t.y*r;return i.y=t.x*r+t.y*n,i.x=s,i},e.rotateAbout=function(t,e,i,n){var r=Math.cos(e),s=Math.sin(e);n||(n={});var o=i.x+((t.x-i.x)*r-(t.y-i.y)*s);return n.y=i.y+((t.x-i.x)*s+(t.y-i.y)*r),n.x=o,n},e.normalise=function(t){var i=e.magnitude(t);return 0===i?{x:0,y:0}:{x:t.x/i,y:t.y/i}},e.dot=function(t,e){return t.x*e.x+t.y*e.y},e.cross=function(t,e){return t.x*e.y-t.y*e.x},e.cross3=function(t,e,i){return(e.x-t.x)*(i.y-t.y)-(e.y-t.y)*(i.x-t.x)},e.add=function(t,e,i){return i||(i={}),i.x=t.x+e.x,i.y=t.y+e.y,i},e.sub=function(t,e,i){return i||(i={}),i.x=t.x-e.x,i.y=t.y-e.y,i},e.mult=function(t,e){return{x:t.x*e,y:t.y*e}},e.div=function(t,e){return{x:t.x/e,y:t.y/e}},e.perp=function(t,e){return{x:(e=!0===e?-1:1)*-t.y,y:e*t.x}},e.neg=function(t){return{x:-t.x,y:-t.y}},e.angle=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)},e._temp=[e.create(),e.create(),e.create(),e.create(),e.create(),e.create()]},65714:(t,e,i)=>{var n={};t.exports=n;var r=i(39646),s=i(13991);n.create=function(t,e){for(var i=[],n=0;n<t.length;n++){var r=t[n],s={x:r.x,y:r.y,index:n,body:e,isInternal:!1,contact:null,offset:null};s.contact={vertex:s,normalImpulse:0,tangentImpulse:0},i.push(s)}return i},n.fromPath=function(t,e){var i=[];return t.replace(/L?\s*([-\d.e]+)[\s,]*([-\d.e]+)*/gi,(function(t,e,n){i.push({x:parseFloat(e),y:parseFloat(n)})})),n.create(i,e)},n.centre=function(t){for(var e,i,s,o=n.area(t,!0),a={x:0,y:0},h=0;h<t.length;h++)s=(h+1)%t.length,e=r.cross(t[h],t[s]),i=r.mult(r.add(t[h],t[s]),e),a=r.add(a,i);return r.div(a,6*o)},n.mean=function(t){for(var e={x:0,y:0},i=0;i<t.length;i++)e.x+=t[i].x,e.y+=t[i].y;return r.div(e,t.length)},n.area=function(t,e){for(var i=0,n=t.length-1,r=0;r<t.length;r++)i+=(t[n].x-t[r].x)*(t[n].y+t[r].y),n=r;return e?i/2:Math.abs(i)/2},n.inertia=function(t,e){for(var i,n,s=0,o=0,a=t,h=0;h<a.length;h++)n=(h+1)%a.length,s+=(i=Math.abs(r.cross(a[n],a[h])))*(r.dot(a[n],a[n])+r.dot(a[n],a[h])+r.dot(a[h],a[h])),o+=i;return e/6*(s/o)},n.translate=function(t,e,i){var n;if(i)for(n=0;n<t.length;n++)t[n].x+=e.x*i,t[n].y+=e.y*i;else for(n=0;n<t.length;n++)t[n].x+=e.x,t[n].y+=e.y;return t},n.rotate=function(t,e,i){if(0!==e){for(var n=Math.cos(e),r=Math.sin(e),s=0;s<t.length;s++){var o=t[s],a=o.x-i.x,h=o.y-i.y;o.x=i.x+(a*n-h*r),o.y=i.y+(a*r+h*n)}return t}},n.contains=function(t,e){for(var i=0;i<t.length;i++){var n=t[i],r=t[(i+1)%t.length];if((e.x-n.x)*(r.y-n.y)+(e.y-n.y)*(n.x-r.x)>0)return!1}return!0},n.scale=function(t,e,i,s){if(1===e&&1===i)return t;var o,a;s=s||n.centre(t);for(var h=0;h<t.length;h++)o=t[h],a=r.sub(o,s),t[h].x=s.x+a.x*e,t[h].y=s.y+a.y*i;return t},n.chamfer=function(t,e,i,n,o){e="number"==typeof e?[e]:e||[8],i=void 0!==i?i:-1,n=n||2,o=o||14;for(var a=[],h=0;h<t.length;h++){var u=t[h-1>=0?h-1:t.length-1],l=t[h],c=t[(h+1)%t.length],d=e[h<e.length?h:e.length-1];if(0!==d){var p=r.normalise({x:l.y-u.y,y:u.x-l.x}),f=r.normalise({x:c.y-l.y,y:l.x-c.x}),m=Math.sqrt(2*Math.pow(d,2)),v=r.mult(s.clone(p),d),g=r.normalise(r.mult(r.add(p,f),.5)),y=r.sub(l,r.mult(g,m)),_=i;-1===i&&(_=1.75*Math.pow(d,.32)),(_=s.clamp(_,n,o))%2==1&&(_+=1);for(var x=Math.acos(r.dot(p,f))/_,b=0;b<_;b++)a.push(r.add(r.rotate(v,x*b),y))}else a.push(l)}return a},n.clockwiseSort=function(t){var e=n.mean(t);return t.sort((function(t,i){return r.angle(e,t)-r.angle(e,i)})),t},n.isConvex=function(t){var e,i,n,r,s=0,o=t.length;if(o<3)return null;for(e=0;e<o;e++)if(n=(e+2)%o,r=(t[i=(e+1)%o].x-t[e].x)*(t[n].y-t[i].y),(r-=(t[i].y-t[e].y)*(t[n].x-t[i].x))<0?s|=1:r>0&&(s|=2),3===s)return!1;return 0!==s||null},n.hull=function(t){var e,i,n=[],s=[];for((t=t.slice(0)).sort((function(t,e){var i=t.x-e.x;return 0!==i?i:t.y-e.y})),i=0;i<t.length;i+=1){for(e=t[i];s.length>=2&&r.cross3(s[s.length-2],s[s.length-1],e)<=0;)s.pop();s.push(e)}for(i=t.length-1;i>=0;i-=1){for(e=t[i];n.length>=2&&r.cross3(n[n.length-2],n[n.length-1],e)<=0;)n.pop();n.push(e)}return n.pop(),s.pop(),n.concat(s)}},94323:(t,e,i)=>{var n=i(97461),r={name:"matter-attractors",version:"0.1.7",for:"matter-js@^0.14.2",silent:!0,install:function(t){t.after("Body.create",(function(){r.Body.init(this)})),t.before("Engine.update",(function(t){r.Engine.update(t)}))},Body:{init:function(t){t.plugin.attractors=t.plugin.attractors||[]}},Engine:{update:function(t){for(var e=t.world,i=n.Composite.allBodies(e),r=0;r<i.length;r+=1){var s=i[r],o=s.plugin.attractors;if(o&&o.length>0)for(var a=r+1;a<i.length;a+=1)for(var h=i[a],u=0;u<o.length;u+=1){var l=o[u],c=l;n.Common.isFunction(l)&&(c=l(s,h)),c&&n.Body.applyForce(h,h.position,c)}}}},Attractors:{gravityConstant:.001,gravity:function(t,e){var i=n.Vector.sub(e.position,t.position),s=n.Vector.magnitudeSquared(i)||1e-4,o=n.Vector.normalise(i),a=-r.Attractors.gravityConstant*(t.mass*e.mass/s),h=n.Vector.mult(o,a);n.Body.applyForce(t,t.position,n.Vector.neg(h)),n.Body.applyForce(e,e.position,h)}}};t.exports=r},35169:t=>{t.exports={name:"matter-collision-events",version:"0.1.6",for:"matter-js@^0.14.2",silent:!0,install:function(t){t.after("Engine.create",(function(){t.Events.on(this,"collisionStart",(function(e){e.pairs.map((function(e){var i=e.bodyA,n=e.bodyB;i.gameObject&&i.gameObject.emit("collide",i,n,e),n.gameObject&&n.gameObject.emit("collide",n,i,e),t.Events.trigger(i,"onCollide",{pair:e}),t.Events.trigger(n,"onCollide",{pair:e}),i.onCollideCallback&&i.onCollideCallback(e),n.onCollideCallback&&n.onCollideCallback(e),i.onCollideWith[n.id]&&i.onCollideWith[n.id](n,e),n.onCollideWith[i.id]&&n.onCollideWith[i.id](i,e)}))})),t.Events.on(this,"collisionActive",(function(e){e.pairs.map((function(e){var i=e.bodyA,n=e.bodyB;i.gameObject&&i.gameObject.emit("collideActive",i,n,e),n.gameObject&&n.gameObject.emit("collideActive",n,i,e),t.Events.trigger(i,"onCollideActive",{pair:e}),t.Events.trigger(n,"onCollideActive",{pair:e}),i.onCollideActiveCallback&&i.onCollideActiveCallback(e),n.onCollideActiveCallback&&n.onCollideActiveCallback(e)}))})),t.Events.on(this,"collisionEnd",(function(e){e.pairs.map((function(e){var i=e.bodyA,n=e.bodyB;i.gameObject&&i.gameObject.emit("collideEnd",i,n,e),n.gameObject&&n.gameObject.emit("collideEnd",n,i,e),t.Events.trigger(i,"onCollideEnd",{pair:e}),t.Events.trigger(n,"onCollideEnd",{pair:e}),i.onCollideEndCallback&&i.onCollideEndCallback(e),n.onCollideEndCallback&&n.onCollideEndCallback(e)}))}))}))}}},98439:(t,e,i)=>{var n=i(97461),r={name:"matter-wrap",version:"0.1.4",for:"matter-js@^0.14.2",silent:!0,install:function(t){t.after("Engine.update",(function(){r.Engine.update(this)}))},Engine:{update:function(t){for(var e=t.world,i=n.Composite.allBodies(e),s=n.Composite.allComposites(e),o=0;o<i.length;o+=1){var a=i[o];a.plugin.wrap&&r.Body.wrap(a,a.plugin.wrap)}for(o=0;o<s.length;o+=1){var h=s[o];h.plugin.wrap&&r.Composite.wrap(h,h.plugin.wrap)}}},Bounds:{wrap:function(t,e){var i=null,n=null;if(void 0!==e.min.x&&void 0!==e.max.x&&(t.min.x>e.max.x?i=e.min.x-t.max.x:t.max.x<e.min.x&&(i=e.max.x-t.min.x)),void 0!==e.min.y&&void 0!==e.max.y&&(t.min.y>e.max.y?n=e.min.y-t.max.y:t.max.y<e.min.y&&(n=e.max.y-t.min.y)),null!==i||null!==n)return{x:i||0,y:n||0}}},Body:{wrap:function(t,e){var i=r.Bounds.wrap(t.bounds,e);return i&&n.Body.translate(t,i),i}},Composite:{bounds:function(t){for(var e=n.Composite.allBodies(t),i=[],r=0;r<e.length;r+=1){var s=e[r];i.push(s.bounds.min,s.bounds.max)}return n.Bounds.create(i)},wrap:function(t,e){var i=r.Bounds.wrap(r.Composite.bounds(t),e);return i&&n.Composite.translate(t,i),i}}};t.exports=r},6384:t=>{function e(t,e,i){i=i||0;var n,r,s,o,a,h,u,l=[0,0];return n=t[1][1]-t[0][1],r=t[0][0]-t[1][0],s=n*t[0][0]+r*t[0][1],o=e[1][1]-e[0][1],a=e[0][0]-e[1][0],h=o*e[0][0]+a*e[0][1],T(u=n*a-o*r,0,i)||(l[0]=(a*s-r*h)/u,l[1]=(n*h-o*s)/u),l}function i(t,e,i,n){var r=e[0]-t[0],s=e[1]-t[1],o=n[0]-i[0],a=n[1]-i[1];if(o*s-a*r==0)return!1;var h=(r*(i[1]-t[1])+s*(t[0]-i[0]))/(o*s-a*r),u=(o*(t[1]-i[1])+a*(i[0]-t[0]))/(a*r-o*s);return h>=0&&h<=1&&u>=0&&u<=1}function n(t,e,i){return(e[0]-t[0])*(i[1]-t[1])-(i[0]-t[0])*(e[1]-t[1])}function r(t,e,i){return n(t,e,i)>0}function s(t,e,i){return n(t,e,i)>=0}function o(t,e,i){return n(t,e,i)<0}function a(t,e,i){return n(t,e,i)<=0}t.exports={decomp:function(t){var e=x(t);return e.length>0?b(t,e):[t]},quickDecomp:function t(e,i,n,h,u,l,m){l=l||100,m=m||0,u=u||25,i=void 0!==i?i:[],n=n||[],h=h||[];var v=[0,0],g=[0,0],_=[0,0],x=0,b=0,T=0,M=0,S=0,E=0,L=0,A=[],D=[],P=e,C=e;if(C.length<3)return i;if(++m>l)return console.warn("quickDecomp: max level ("+l+") reached."),i;for(var O=0;O<e.length;++O)if(f(P,O)){n.push(P[O]),x=b=Number.MAX_VALUE;for(var k=0;k<e.length;++k)r(d(P,O-1),d(P,O),d(P,k))&&a(d(P,O-1),d(P,O),d(P,k-1))&&(_=w(d(P,O-1),d(P,O),d(P,k),d(P,k-1)),o(d(P,O+1),d(P,O),_)&&(T=c(P[O],_))<b&&(b=T,g=_,E=k)),r(d(P,O+1),d(P,O),d(P,k+1))&&a(d(P,O+1),d(P,O),d(P,k))&&(_=w(d(P,O+1),d(P,O),d(P,k),d(P,k+1)),r(d(P,O-1),d(P,O),_)&&(T=c(P[O],_))<x&&(x=T,v=_,S=k));if(E===(S+1)%e.length)_[0]=(g[0]+v[0])/2,_[1]=(g[1]+v[1])/2,h.push(_),O<S?(p(A,P,O,S+1),A.push(_),D.push(_),0!==E&&p(D,P,E,P.length),p(D,P,0,O+1)):(0!==O&&p(A,P,O,P.length),p(A,P,0,S+1),A.push(_),D.push(_),p(D,P,E,O+1));else{if(E>S&&(S+=e.length),M=Number.MAX_VALUE,S<E)return i;for(k=E;k<=S;++k)s(d(P,O-1),d(P,O),d(P,k))&&a(d(P,O+1),d(P,O),d(P,k))&&(T=c(d(P,O),d(P,k)))<M&&y(P,O,k)&&(M=T,L=k%e.length);O<L?(p(A,P,O,L+1),0!==L&&p(D,P,L,C.length),p(D,P,0,O+1)):(0!==O&&p(A,P,O,C.length),p(A,P,0,L+1),p(D,P,L,O+1))}return A.length<D.length?(t(A,i,n,h,u,l,m),t(D,i,n,h,u,l,m)):(t(D,i,n,h,u,l,m),t(A,i,n,h,u,l,m)),i}return i.push(e),i},isSimple:function(t){var e,n=t;for(e=0;e<n.length-1;e++)for(var r=0;r<e-1;r++)if(i(n[e],n[e+1],n[r],n[r+1]))return!1;for(e=1;e<n.length-2;e++)if(i(n[0],n[n.length-1],n[e],n[e+1]))return!1;return!0},removeCollinearPoints:function(t,e){for(var i=0,n=t.length-1;t.length>3&&n>=0;--n)l(d(t,n-1),d(t,n),d(t,n+1),e)&&(t.splice(n%t.length,1),i++);return i},removeDuplicatePoints:function(t,e){for(var i=t.length-1;i>=1;--i)for(var n=t[i],r=i-1;r>=0;--r)M(n,t[r],e)&&t.splice(i,1)},makeCCW:function(t){for(var e=0,i=t,n=1;n<t.length;++n)(i[n][1]<i[e][1]||i[n][1]===i[e][1]&&i[n][0]>i[e][0])&&(e=n);return!r(d(t,e-1),d(t,e),d(t,e+1))&&(function(t){for(var e=[],i=t.length,n=0;n!==i;n++)e.push(t.pop());for(n=0;n!==i;n++)t[n]=e[n]}(t),!0)}};var h=[],u=[];function l(t,e,i,r){if(r){var s=h,o=u;s[0]=e[0]-t[0],s[1]=e[1]-t[1],o[0]=i[0]-e[0],o[1]=i[1]-e[1];var a=s[0]*o[0]+s[1]*o[1],l=Math.sqrt(s[0]*s[0]+s[1]*s[1]),c=Math.sqrt(o[0]*o[0]+o[1]*o[1]);return Math.acos(a/(l*c))<r}return 0===n(t,e,i)}function c(t,e){var i=e[0]-t[0],n=e[1]-t[1];return i*i+n*n}function d(t,e){var i=t.length;return t[e<0?e%i+i:e%i]}function p(t,e,i,n){for(var r=i;r<n;r++)t.push(e[r])}function f(t,e){return o(d(t,e-1),d(t,e),d(t,e+1))}var m=[],v=[];function g(t,i,n){var r,o,h=m,u=v;if(s(d(t,i+1),d(t,i),d(t,n))&&a(d(t,i-1),d(t,i),d(t,n)))return!1;o=c(d(t,i),d(t,n));for(var l=0;l!==t.length;++l)if((l+1)%t.length!==i&&l!==i&&s(d(t,i),d(t,n),d(t,l+1))&&a(d(t,i),d(t,n),d(t,l))&&(h[0]=d(t,i),h[1]=d(t,n),u[0]=d(t,l),u[1]=d(t,l+1),r=e(h,u),c(d(t,i),r)<o))return!1;return!0}function y(t,e,n){for(var r=0;r!==t.length;++r)if(r!==e&&r!==n&&(r+1)%t.length!==e&&(r+1)%t.length!==n&&i(d(t,e),d(t,n),d(t,r),d(t,r+1)))return!1;return!0}function _(t,e,i,n){var r=n||[];if(function(t){t.length=0}(r),e<i)for(var s=e;s<=i;s++)r.push(t[s]);else{for(s=0;s<=i;s++)r.push(t[s]);for(s=e;s<t.length;s++)r.push(t[s])}return r}function x(t){for(var e=[],i=[],n=[],r=[],s=Number.MAX_VALUE,o=0;o<t.length;++o)if(f(t,o))for(var a=0;a<t.length;++a)if(g(t,o,a)){i=x(_(t,o,a,r)),n=x(_(t,a,o,r));for(var h=0;h<n.length;h++)i.push(n[h]);i.length<s&&(e=i,s=i.length,e.push([d(t,o),d(t,a)]))}return e}function b(t,e){if(0===e.length)return[t];if(e instanceof Array&&e.length&&e[0]instanceof Array&&2===e[0].length&&e[0][0]instanceof Array){for(var i=[t],n=0;n<e.length;n++)for(var r=e[n],s=0;s<i.length;s++){var o=b(i[s],r);if(o){i.splice(s,1),i.push(o[0],o[1]);break}}return i}r=e,n=t.indexOf(r[0]),s=t.indexOf(r[1]);return-1!==n&&-1!==s&&[_(t,n,s),_(t,s,n)]}function w(t,e,i,n,r){r=r||0;var s=e[1]-t[1],o=t[0]-e[0],a=s*t[0]+o*t[1],h=n[1]-i[1],u=i[0]-n[0],l=h*i[0]+u*i[1],c=s*u-h*o;return T(c,0,r)?[0,0]:[(u*a-o*l)/c,(s*l-h*a)/c]}function T(t,e,i){return i=i||0,Math.abs(t-e)<=i}function M(t,e,i){return T(t[0],e[0],i)&&T(t[1],e[1],i)}},80565:(t,e,i)=>{var n=new(i(47379))({initialize:function(t){this.pluginManager=t,this.game=t.game},init:function(){},start:function(){},stop:function(){},destroy:function(){this.pluginManager=null,this.game=null,this.scene=null,this.systems=null}});t.exports=n},97713:t=>{var e={Global:["game","anims","cache","plugins","registry","scale","sound","textures"],CoreScene:["EventEmitter","CameraManager","GameObjectCreator","GameObjectFactory","ScenePlugin","DisplayList","UpdateList"],DefaultScene:["Clock","DataManagerPlugin","InputPlugin","Loader","TweenManager","LightsPlugin"]};e.DefaultScene.push("CameraManager3D"),e.Global.push("facebook"),t.exports=e},50354:t=>{var e={},i={},n={register:function(t,i,n,r){void 0===r&&(r=!1),e[t]={plugin:i,mapping:n,custom:r}},registerCustom:function(t,e,n,r){i[t]={plugin:e,mapping:n,data:r}},hasCore:function(t){return e.hasOwnProperty(t)},hasCustom:function(t){return i.hasOwnProperty(t)},getCore:function(t){return e[t]},getCustom:function(t){return i[t]},getCustomClass:function(t){return i.hasOwnProperty(t)?i[t].plugin:null},remove:function(t){e.hasOwnProperty(t)&&delete e[t]},removeCustom:function(t){i.hasOwnProperty(t)&&delete i[t]},destroyCorePlugins:function(){for(var t in e)e.hasOwnProperty(t)&&delete e[t]},destroyCustomPlugins:function(){for(var t in i)i.hasOwnProperty(t)&&delete i[t]}};t.exports=n},18261:(t,e,i)=>{var n=i(47379),r=i(80827),s=i(17168),o=i(16656),a=i(17517),h=i(81342),u=i(81769),l=i(50354),c=i(60625),d=new n({Extends:s,initialize:function(t){s.call(this),this.game=t,this.plugins=[],this.scenePlugins=[],this._pendingGlobal=[],this._pendingScene=[],t.isBooted?this.boot():t.events.once(r.BOOT,this.boot,this)},boot:function(){var t,e,i,n,s,o,a,h=this.game.config,l=h.installGlobalPlugins;for(l=l.concat(this._pendingGlobal),t=0;t<l.length;t++)e=l[t],i=u(e,"key",null),n=u(e,"plugin",null),s=u(e,"start",!1),o=u(e,"mapping",null),a=u(e,"data",null),i&&(n?this.install(i,n,s,o,a):console.warn("Missing `plugin` for key: "+i));for(l=(l=h.installScenePlugins).concat(this._pendingScene),t=0;t<l.length;t++)e=l[t],i=u(e,"key",null),n=u(e,"plugin",null),o=u(e,"mapping",null),i&&(n?this.installScenePlugin(i,n,o):console.warn("Missing `plugin` for key: "+i));this._pendingGlobal=[],this._pendingScene=[],this.game.events.once(r.DESTROY,this.destroy,this)},addToScene:function(t,e,i){var n,r,s,o=this.game,a=t.scene,h=t.settings.map,u=t.settings.isBooted;for(n=0;n<e.length;n++)o[r=e[n]]?(t[r]=o[r],h.hasOwnProperty(r)&&(a[h[r]]=t[r])):"game"===r&&h.hasOwnProperty(r)&&(a[h[r]]=o);for(var c=0;c<i.length;c++)for(s=i[c],n=0;n<s.length;n++)if(r=s[n],l.hasCore(r)){var d=l.getCore(r),p=new d.plugin(a,this);t[d.mapping]=p,d.custom?a[d.mapping]=p:h.hasOwnProperty(d.mapping)&&(a[h[d.mapping]]=p),u&&p.boot()}for(s=this.plugins,n=0;n<s.length;n++){var f=s[n];f.mapping&&(a[f.mapping]=f.plugin)}},getDefaultScenePlugins:function(){var t=this.game.config.defaultPlugins;return t=t.concat(this.scenePlugins)},installScenePlugin:function(t,e,i,n,r){if(void 0===r&&(r=!1),"function"==typeof e){if(l.hasCore(t)){if(!r&&l.hasCore(t))return void console.warn("Scene Plugin key in use: "+t)}else l.register(t,e,i,!0),this.scenePlugins.push(t);if(n){var s=new e(n,this);n.sys[t]=s,i&&""!==i&&(n[i]=s),s.boot()}}else console.warn("Invalid Scene Plugin: "+t)},install:function(t,e,i,n,r){if(void 0===i&&(i=!1),void 0===n&&(n=null),void 0===r&&(r=null),"function"!=typeof e)return console.warn("Invalid Plugin: "+t),null;if(l.hasCustom(t))return console.warn("Plugin key in use: "+t),null;if(null!==n&&(i=!0),this.game.isBooted){if(l.registerCustom(t,e,n,r),i)return this.start(t)}else this._pendingGlobal.push({key:t,plugin:e,start:i,mapping:n,data:r});return null},getIndex:function(t){for(var e=this.plugins,i=0;i<e.length;i++){if(e[i].key===t)return i}return-1},getEntry:function(t){var e=this.getIndex(t);if(-1!==e)return this.plugins[e]},isActive:function(t){var e=this.getEntry(t);return e&&e.active},start:function(t,e){void 0===e&&(e=t);var i=this.getEntry(e);return i&&!i.active?(i.active=!0,i.plugin.start()):i||(i=this.createEntry(t,e)),i?i.plugin:null},createEntry:function(t,e){var i=l.getCustom(t);if(i){var n=new i.plugin(this);i={key:e,plugin:n,active:!0,mapping:i.mapping,data:i.data},this.plugins.push(i),n.init(i.data),n.start()}return i},stop:function(t){var e=this.getEntry(t);return e&&e.active&&(e.active=!1,e.plugin.stop()),this},get:function(t,e){void 0===e&&(e=!0);var i=this.getEntry(t);if(i)return i.plugin;var n=this.getClass(t);return n&&e?(i=this.createEntry(t,t))?i.plugin:null:n||null},getClass:function(t){return l.getCustomClass(t)},removeGlobalPlugin:function(t){var e=this.getEntry(t);e&&c(this.plugins,e),l.removeCustom(t)},removeScenePlugin:function(t){c(this.scenePlugins,t),l.remove(t)},registerGameObject:function(t,e,i){return e&&h.register(t,e),i&&a.register(t,i),this},removeGameObject:function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!0),e&&h.remove(t),i&&a.remove(t),this},registerFileType:function(t,e,i){o.register(t,e),i&&i.sys.load&&(i.sys.load[t]=e)},destroy:function(){for(var t=0;t<this.plugins.length;t++)this.plugins[t].plugin.destroy();l.destroyCustomPlugins(),this.game.noReturn&&l.destroyCorePlugins(),this.game=null,this.plugins=[],this.scenePlugins=[]}});t.exports=d},94869:(t,e,i)=>{var n=i(80565),r=i(47379),s=i(88637),o=new r({Extends:n,initialize:function(t,e){n.call(this,e),this.scene=t,this.systems=t.sys,t.sys.events.once(s.BOOT,this.boot,this)},boot:function(){},destroy:function(){this.pluginManager=null,this.game=null,this.scene=null,this.systems=null}});t.exports=o},65604:(t,e,i)=>{t.exports={BasePlugin:i(80565),DefaultPlugins:i(97713),PluginCache:i(50354),PluginManager:i(18261),ScenePlugin:i(94869)}},76736:()=>{Array.prototype.forEach||(Array.prototype.forEach=function(t){"use strict";if(null==this)throw new TypeError;var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError;for(var n=arguments.length>=2?arguments[1]:void 0,r=0;r<i;r++)r in e&&t.call(n,e[r],r,e)})},50083:()=>{Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)})},72618:()=>{!function(){function t(t){t&&(t.setTargetAtTime||(t.setTargetAtTime=t.setTargetValueAtTime))}window.hasOwnProperty("webkitAudioContext")&&!window.hasOwnProperty("AudioContext")&&(window.AudioContext=webkitAudioContext,AudioContext.prototype.hasOwnProperty("createGain")||(AudioContext.prototype.createGain=AudioContext.prototype.createGainNode),AudioContext.prototype.hasOwnProperty("createDelay")||(AudioContext.prototype.createDelay=AudioContext.prototype.createDelayNode),AudioContext.prototype.hasOwnProperty("createScriptProcessor")||(AudioContext.prototype.createScriptProcessor=AudioContext.prototype.createJavaScriptNode),AudioContext.prototype.hasOwnProperty("createPeriodicWave")||(AudioContext.prototype.createPeriodicWave=AudioContext.prototype.createWaveTable),AudioContext.prototype.internal_createGain=AudioContext.prototype.createGain,AudioContext.prototype.createGain=function(){var e=this.internal_createGain();return t(e.gain),e},AudioContext.prototype.internal_createDelay=AudioContext.prototype.createDelay,AudioContext.prototype.createDelay=function(e){var i=e?this.internal_createDelay(e):this.internal_createDelay();return t(i.delayTime),i},AudioContext.prototype.internal_createBufferSource=AudioContext.prototype.createBufferSource,AudioContext.prototype.createBufferSource=function(){var e=this.internal_createBufferSource();return e.start?(e.internal_start=e.start,e.start=function(t,i,n){void 0!==n?e.internal_start(t||0,i,n):e.internal_start(t||0,i||0)}):e.start=function(t,e,i){e||i?this.noteGrainOn(t||0,e,i):this.noteOn(t||0)},e.stop?(e.internal_stop=e.stop,e.stop=function(t){e.internal_stop(t||0)}):e.stop=function(t){this.noteOff(t||0)},t(e.playbackRate),e},AudioContext.prototype.internal_createDynamicsCompressor=AudioContext.prototype.createDynamicsCompressor,AudioContext.prototype.createDynamicsCompressor=function(){var e=this.internal_createDynamicsCompressor();return t(e.threshold),t(e.knee),t(e.ratio),t(e.reduction),t(e.attack),t(e.release),e},AudioContext.prototype.internal_createBiquadFilter=AudioContext.prototype.createBiquadFilter,AudioContext.prototype.createBiquadFilter=function(){var e=this.internal_createBiquadFilter();return t(e.frequency),t(e.detune),t(e.Q),t(e.gain),e},AudioContext.prototype.hasOwnProperty("createOscillator")&&(AudioContext.prototype.internal_createOscillator=AudioContext.prototype.createOscillator,AudioContext.prototype.createOscillator=function(){var e=this.internal_createOscillator();return e.start?(e.internal_start=e.start,e.start=function(t){e.internal_start(t||0)}):e.start=function(t){this.noteOn(t||0)},e.stop?(e.internal_stop=e.stop,e.stop=function(t){e.internal_stop(t||0)}):e.stop=function(t){this.noteOff(t||0)},e.setPeriodicWave||(e.setPeriodicWave=e.setWaveTable),t(e.frequency),t(e.detune),e})),window.hasOwnProperty("webkitOfflineAudioContext")&&!window.hasOwnProperty("OfflineAudioContext")&&(window.OfflineAudioContext=webkitOfflineAudioContext)}()},31925:()=>{Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)})},37563:()=>{if("function"!=typeof window.Uint32Array&&"object"!=typeof window.Uint32Array){var t=function(t){var e=new Array;window[t]=function(t){if("number"==typeof t){Array.call(this,t),this.length=t;for(var e=0;e<this.length;e++)this[e]=0}else{Array.call(this,t.length),this.length=t.length;for(e=0;e<this.length;e++)this[e]=t[e]}},window[t].prototype=e,window[t].constructor=window[t]};t("Float32Array"),t("Uint32Array"),t("Uint16Array"),t("Int16Array"),t("ArrayBuffer")}},99625:()=>{window.console||(window.console={},window.console.log=window.console.assert=function(){},window.console.warn=window.console.assert=function(){})},81194:(t,e,i)=>{i(76736),i(50083),i(72618),i(99625),i(31925),i(8432),i(56140),i(37563)},8432:()=>{!function(){if("performance"in window==!1&&(window.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in window.performance==!1){var t=Date.now();performance.timing&&performance.timing.navigationStart&&(t=performance.timing.navigationStart),window.performance.now=function(){return Date.now()-t}}}()},56140:()=>{for(var t=Date.now(),e=["ms","moz","webkit","o"],i=0;i<e.length&&!window.requestAnimationFrame;i++)window.requestAnimationFrame=window[e[i]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[i]+"CancelAnimationFrame"]||window[e[i]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){if("function"!=typeof e)throw new TypeError(e+"is not a function");var i=Date.now(),n=16+t-i;return n<0&&(n=0),t=i,setTimeout((function(){t=Date.now(),e(performance.now())}),n)}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})},35869:t=>{t.exports={SKIP_CHECK:-1,NORMAL:0,ADD:1,MULTIPLY:2,SCREEN:3,OVERLAY:4,DARKEN:5,LIGHTEN:6,COLOR_DODGE:7,COLOR_BURN:8,HARD_LIGHT:9,SOFT_LIGHT:10,DIFFERENCE:11,EXCLUSION:12,HUE:13,SATURATION:14,COLOR:15,LUMINOSITY:16,ERASE:17,SOURCE_IN:18,SOURCE_OUT:19,SOURCE_ATOP:20,DESTINATION_OVER:21,DESTINATION_IN:22,DESTINATION_OUT:23,DESTINATION_ATOP:24,LIGHTER:25,COPY:26,XOR:27}},28425:t=>{t.exports={DEFAULT:0,LINEAR:0,NEAREST:1}},308:(t,e,i)=>{var n=i(31615),r=i(25920),s=i(47379),o=i(50460),a=i(79129),h=i(66144),u=i(65492),l=new s({initialize:function(t){this.game=t,this.type=o.CANVAS,this.drawCount=0,this.width=0,this.height=0,this.config={clearBeforeRender:t.config.clearBeforeRender,backgroundColor:t.config.backgroundColor,resolution:t.config.resolution,antialias:t.config.antialias,roundPixels:t.config.roundPixels},this.gameCanvas=t.canvas;var e={alpha:t.config.transparent,desynchronized:t.config.desynchronized};this.gameContext=this.game.config.context?this.game.config.context:this.gameCanvas.getContext("2d",e),this.currentContext=this.gameContext,this.antialias=t.config.antialias,this.blendModes=a(),this.snapshotState={x:0,y:0,width:1,height:1,getPixel:!1,callback:null,type:"image/png",encoder:.92},this._tempMatrix1=new u,this._tempMatrix2=new u,this._tempMatrix3=new u,this._tempMatrix4=new u,this.init()},init:function(){this.game.scale.on(h.RESIZE,this.onResize,this);var t=this.game.scale.baseSize;this.resize(t.width,t.height)},onResize:function(t,e){e.width===this.width&&e.height===this.height||this.resize(e.width,e.height)},resize:function(t,e){this.width=t,this.height=e},resetTransform:function(){this.currentContext.setTransform(1,0,0,1,0,0)},setBlendMode:function(t){return this.currentContext.globalCompositeOperation=t,this},setContext:function(t){return this.currentContext=t||this.gameContext,this},setAlpha:function(t){return this.currentContext.globalAlpha=t,this},preRender:function(){var t=this.gameContext,e=this.config,i=this.width,n=this.height;t.globalAlpha=1,t.globalCompositeOperation="source-over",t.setTransform(1,0,0,1,0,0),e.clearBeforeRender&&t.clearRect(0,0,i,n),e.transparent||(t.fillStyle=e.backgroundColor.rgba,t.fillRect(0,0,i,n)),t.save(),this.drawCount=0},render:function(t,e,i,n){var s=e.list,o=s.length,a=n._cx,h=n._cy,u=n._cw,l=n._ch,c=n.renderToTexture?n.context:t.sys.context;c.save(),this.game.scene.customViewports&&(c.beginPath(),c.rect(a,h,u,l),c.clip()),this.currentContext=c;var d=n.mask;d&&d.preRenderCanvas(this,null,n._maskCamera),n.transparent||(c.fillStyle=n.backgroundColor.rgba,c.fillRect(a,h,u,l)),c.globalAlpha=n.alpha,c.globalCompositeOperation="source-over",this.drawCount+=s.length,n.renderToTexture&&n.emit(r.PRE_RENDER,n),n.matrix.copyToContext(c);for(var p=0;p<o;p++){var f=s[p];f.willRender(n)&&(f.mask&&f.mask.preRenderCanvas(this,f,n),f.renderCanvas(this,f,i,n),f.mask&&f.mask.postRenderCanvas(this,f,n))}c.setTransform(1,0,0,1,0,0),c.globalCompositeOperation="source-over",c.globalAlpha=1,n.flashEffect.postRenderCanvas(c),n.fadeEffect.postRenderCanvas(c),n.dirty=!1,d&&d.postRenderCanvas(this),c.restore(),n.renderToTexture&&(n.emit(r.POST_RENDER,n),n.renderToGame&&t.sys.context.drawImage(n.canvas,a,h))},postRender:function(){this.gameContext.restore();var t=this.snapshotState;t.callback&&(n(this.gameCanvas,t),t.callback=null)},snapshotCanvas:function(t,e,i,r,s,o,a,h,u){void 0===i&&(i=!1),this.snapshotArea(r,s,o,a,e,h,u);var l=this.snapshotState;return l.getPixel=i,n(this.canvas,l),l.callback=null,this},snapshot:function(t,e,i){return this.snapshotArea(0,0,this.gameCanvas.width,this.gameCanvas.height,t,e,i)},snapshotArea:function(t,e,i,n,r,s,o){var a=this.snapshotState;return a.callback=r,a.type=s,a.encoder=o,a.getPixel=!1,a.x=t,a.y=e,a.width=Math.min(i,this.gameCanvas.width),a.height=Math.min(n,this.gameCanvas.height),this},snapshotPixel:function(t,e,i){return this.snapshotArea(t,e,1,1,i),this.snapshotState.getPixel=!0,this},batchSprite:function(t,e,i,n){var r=i.alpha*t.alpha;if(0!==r){var s=this.currentContext,o=this._tempMatrix1,a=this._tempMatrix2,h=this._tempMatrix3,u=e.canvasData,l=u.x,c=u.y,d=e.cutWidth,p=e.cutHeight,f=e.customPivot,m=e.source.resolution,v=t.displayOriginX,g=t.displayOriginY,y=-v+e.x,_=-g+e.y;if(t.isCropped){var x=t._crop;x.flipX===t.flipX&&x.flipY===t.flipY||e.updateCropUVs(x,t.flipX,t.flipY),d=x.cw,p=x.ch,l=x.cx,c=x.cy,y=-v+x.x,_=-g+x.y,t.flipX&&(y>=0?y=-(y+d):y<0&&(y=Math.abs(y)-d)),t.flipY&&(_>=0?_=-(_+p):_<0&&(_=Math.abs(_)-p))}var b=1,w=1;t.flipX&&(f||(y+=-e.realWidth+2*v),b=-1),t.flipY&&(f||(_+=-e.realHeight+2*g),w=-1),a.applyITRS(t.x,t.y,t.rotation,t.scaleX*b,t.scaleY*w),o.copyFrom(i.matrix),n?(o.multiplyWithOffset(n,-i.scrollX*t.scrollFactorX,-i.scrollY*t.scrollFactorY),a.e=t.x,a.f=t.y,o.multiply(a,h)):(a.e-=i.scrollX*t.scrollFactorX,a.f-=i.scrollY*t.scrollFactorY,o.multiply(a,h)),s.save(),h.setToContext(s),s.globalCompositeOperation=this.blendModes[t.blendMode],s.globalAlpha=r,s.imageSmoothingEnabled=!(!this.antialias||e.source.scaleMode),s.drawImage(e.source.image,l,c,d,p,y,_,d/m,p/m),s.restore()}},destroy:function(){this.gameCanvas=null,this.gameContext=null,this.game=null}});t.exports=l},78889:(t,e,i)=>{t.exports={CanvasRenderer:i(308),GetBlendModes:i(79129),SetTransform:i(55468)}},79129:(t,e,i)=>{var n=i(35869),r=i(86877);t.exports=function(){var t=[],e=r.supportNewBlendModes,i="source-over";return t[n.NORMAL]=i,t[n.ADD]="lighter",t[n.MULTIPLY]=e?"multiply":i,t[n.SCREEN]=e?"screen":i,t[n.OVERLAY]=e?"overlay":i,t[n.DARKEN]=e?"darken":i,t[n.LIGHTEN]=e?"lighten":i,t[n.COLOR_DODGE]=e?"color-dodge":i,t[n.COLOR_BURN]=e?"color-burn":i,t[n.HARD_LIGHT]=e?"hard-light":i,t[n.SOFT_LIGHT]=e?"soft-light":i,t[n.DIFFERENCE]=e?"difference":i,t[n.EXCLUSION]=e?"exclusion":i,t[n.HUE]=e?"hue":i,t[n.SATURATION]=e?"saturation":i,t[n.COLOR]=e?"color":i,t[n.LUMINOSITY]=e?"luminosity":i,t[n.ERASE]="destination-out",t[n.SOURCE_IN]="source-in",t[n.SOURCE_OUT]="source-out",t[n.SOURCE_ATOP]="source-atop",t[n.DESTINATION_OVER]="destination-over",t[n.DESTINATION_IN]="destination-in",t[n.DESTINATION_OUT]="destination-out",t[n.DESTINATION_ATOP]="destination-atop",t[n.LIGHTER]="lighter",t[n.COPY]="copy",t[n.XOR]="xor",t}},55468:t=>{t.exports=function(t,e,i,n,r){var s=n.alpha*i.alpha;if(s<=0)return!1;var o=t._tempMatrix1.copyFromArray(n.matrix.matrix),a=t._tempMatrix2.applyITRS(i.x,i.y,i.rotation,i.scaleX,i.scaleY),h=t._tempMatrix3;return r?(o.multiplyWithOffset(r,-n.scrollX*i.scrollFactorX,-n.scrollY*i.scrollFactorY),a.e=i.x,a.f=i.y,o.multiply(a,h)):(a.e-=n.scrollX*i.scrollFactorX,a.f-=n.scrollY*i.scrollFactorY,o.multiply(a,h)),e.globalCompositeOperation=t.blendModes[i.blendMode],e.globalAlpha=s,e.save(),h.setToContext(e),e.imageSmoothingEnabled=!(!t.antialias||i.frame&&i.frame.source.scaleMode),!0}},8270:(t,e,i)=>{t.exports={Canvas:i(78889),Snapshot:i(3006),WebGL:i(51087)}},31615:(t,e,i)=>{var n=i(89429),r=i(81615),s=i(81769);t.exports=function(t,e){var i=s(e,"callback"),o=s(e,"type","image/png"),a=s(e,"encoder",.92),h=Math.abs(Math.round(s(e,"x",0))),u=Math.abs(Math.round(s(e,"y",0))),l=s(e,"width",t.width),c=s(e,"height",t.height);if(s(e,"getPixel",!1)){var d=t.getContext("2d").getImageData(h,u,1,1).data;i.call(null,new r(d[0],d[1],d[2],d[3]/255))}else if(0!==h||0!==u||l!==t.width||c!==t.height){var p=n.createWebGL(this,l,c);p.getContext("2d").drawImage(t,h,u,l,c,0,0,l,c);var f=new Image;f.onerror=function(){i.call(null),n.remove(p)},f.onload=function(){i.call(null,f),n.remove(p)},f.src=p.toDataURL(o,a)}else{var m=new Image;m.onerror=function(){i.call(null)},m.onload=function(){i.call(null,m)},m.src=t.toDataURL(o,a)}}},83814:(t,e,i)=>{var n=i(89429),r=i(81615),s=i(81769);t.exports=function(t,e){var i=t.getContext("experimental-webgl"),o=s(e,"callback"),a=s(e,"type","image/png"),h=s(e,"encoder",.92),u=s(e,"x",0),l=s(e,"y",0),c=s(e,"getPixel",!1),d=s(e,"isFramebuffer",!1),p=d?s(e,"bufferWidth",1):i.drawingBufferWidth,f=d?s(e,"bufferHeight",1):i.drawingBufferHeight;if(c){var m=new Uint8Array(4),v=d?l:f-l;i.readPixels(u,v,1,1,i.RGBA,i.UNSIGNED_BYTE,m),o.call(null,new r(m[0],m[1],m[2],m[3]/255))}else{var g=s(e,"width",p),y=s(e,"height",f),_=g*y*4,x=new Uint8Array(_);i.readPixels(u,f-l-y,g,y,i.RGBA,i.UNSIGNED_BYTE,x);for(var b=n.createWebGL(this,g,y),w=b.getContext("2d"),T=w.getImageData(0,0,g,y),M=T.data,S=0;S<y;S++)for(var E=0;E<g;E++){var L=4*((y-S)*g+E),A=d?_-4*(S*g+(g-E)):4*(S*g+E);M[A+0]=x[L+0],M[A+1]=x[L+1],M[A+2]=x[L+2],M[A+3]=x[L+3]}w.putImageData(T,0,0);var D=new Image;D.onerror=function(){o.call(null),n.remove(b)},D.onload=function(){o.call(null,D),n.remove(b)},D.src=b.toDataURL(a,h)}}},3006:(t,e,i)=>{t.exports={Canvas:i(31615),WebGL:i(83814)}},19298:t=>{t.exports={getTintFromFloats:function(t,e,i,n){return((255&(255*n|0))<<24|(255&(255*t|0))<<16|(255&(255*e|0))<<8|255&(255*i|0))>>>0},getTintAppendFloatAlpha:function(t,e){return((255&(255*e|0))<<24|t)>>>0},getTintAppendFloatAlphaAndSwap:function(t,e){return((255&(255*e|0))<<24|(255&(0|t))<<16|(255&(t>>8|0))<<8|255&(t>>16|0))>>>0},getFloatsFromUintRGB:function(t){return[(255&(t>>16|0))/255,(255&(t>>8|0))/255,(255&(0|t))/255]},getComponentCount:function(t,e){for(var i=0,n=0;n<t.length;++n){var r=t[n];r.type===e.FLOAT?i+=r.size:i+=1}return i}}},69241:(t,e,i)=>{var n=i(47379),r=i(19298),s=new n({initialize:function(t){this.name="WebGLPipeline",this.game=t.game,this.view=t.game.canvas,this.resolution=1,this.width=0,this.height=0,this.gl=t.gl,this.vertexCount=0,this.vertexCapacity=t.vertexCapacity,this.renderer=t.renderer,this.vertexData=t.vertices?t.vertices:new ArrayBuffer(t.vertexCapacity*t.vertexSize),this.vertexBuffer=this.renderer.createVertexBuffer(t.vertices?t.vertices:this.vertexData.byteLength,this.gl.STREAM_DRAW),this.program=this.renderer.createProgram(t.vertShader,t.fragShader),this.attributes=t.attributes,this.vertexSize=t.vertexSize,this.topology=t.topology,this.bytes=new Uint8Array(this.vertexData),this.vertexComponentCount=r.getComponentCount(t.attributes,this.gl),this.flushLocked=!1,this.active=!1},boot:function(){},addAttribute:function(t,e,i,n,s){return this.attributes.push({name:t,size:e,type:this.renderer.glFormats[i],normalized:n,offset:s}),this.vertexComponentCount=r.getComponentCount(this.attributes,this.gl),this},shouldFlush:function(){return this.vertexCount>=this.vertexCapacity},resize:function(t,e,i){return this.width=t*i,this.height=e*i,this.resolution=i,this},bind:function(){var t=this.gl,e=this.vertexBuffer,i=this.attributes,n=this.program,r=this.renderer,s=this.vertexSize;r.setProgram(n),r.setVertexBuffer(e);for(var o=0;o<i.length;++o){var a=i[o],h=t.getAttribLocation(n,a.name);h>=0?(t.enableVertexAttribArray(h),t.vertexAttribPointer(h,a.size,a.type,a.normalized,s,a.offset)):-1!==h&&t.disableVertexAttribArray(h)}return this},onBind:function(){return this},onPreRender:function(){return this},onRender:function(){return this},onPostRender:function(){return this},flush:function(){if(this.flushLocked)return this;this.flushLocked=!0;var t=this.gl,e=this.vertexCount,i=this.topology,n=this.vertexSize;if(0!==e)return t.bufferSubData(t.ARRAY_BUFFER,0,this.bytes.subarray(0,e*n)),t.drawArrays(i,0,e),this.vertexCount=0,this.flushLocked=!1,this;this.flushLocked=!1},destroy:function(){var t=this.gl;return t.deleteProgram(this.program),t.deleteBuffer(this.vertexBuffer),delete this.program,delete this.vertexBuffer,delete this.gl,this},setFloat1:function(t,e){return this.renderer.setFloat1(this.program,t,e),this},setFloat2:function(t,e,i){return this.renderer.setFloat2(this.program,t,e,i),this},setFloat3:function(t,e,i,n){return this.renderer.setFloat3(this.program,t,e,i,n),this},setFloat4:function(t,e,i,n,r){return this.renderer.setFloat4(this.program,t,e,i,n,r),this},setFloat1v:function(t,e){return this.renderer.setFloat1v(this.program,t,e),this},setFloat2v:function(t,e){return this.renderer.setFloat2v(this.program,t,e),this},setFloat3v:function(t,e){return this.renderer.setFloat3v(this.program,t,e),this},setFloat4v:function(t,e){return this.renderer.setFloat4v(this.program,t,e),this},setInt1:function(t,e){return this.renderer.setInt1(this.program,t,e),this},setInt2:function(t,e,i){return this.renderer.setInt2(this.program,t,e,i),this},setInt3:function(t,e,i,n){return this.renderer.setInt3(this.program,t,e,i,n),this},setInt4:function(t,e,i,n,r){return this.renderer.setInt4(this.program,t,e,i,n,r),this},setMatrix2:function(t,e,i){return this.renderer.setMatrix2(this.program,t,e,i),this},setMatrix3:function(t,e,i){return this.renderer.setMatrix3(this.program,t,e,i),this},setMatrix4:function(t,e,i){return this.renderer.setMatrix4(this.program,t,e,i),this}});t.exports=s},36010:(t,e,i)=>{var n=i(22190),r=i(25920),s=i(47379),o=i(50460),a=i(80827),h=i(2244),u=i(49035),l=i(66144),c=i(75670),d=i(2931),p=i(65492),f=i(19298),m=i(83814),v=i(51043),g=i(74612),y=i(38383),_=i(14421),x=new s({initialize:function(t){var e=t.config,i={alpha:e.transparent,desynchronized:e.desynchronized,depth:!1,antialias:e.antialiasGL,premultipliedAlpha:e.premultipliedAlpha,stencil:!0,failIfMajorPerformanceCaveat:e.failIfMajorPerformanceCaveat,powerPreference:e.powerPreference};this.config={clearBeforeRender:e.clearBeforeRender,antialias:e.antialias,backgroundColor:e.backgroundColor,contextCreation:i,resolution:e.resolution,roundPixels:e.roundPixels,maxTextures:e.maxTextures,maxTextureSize:e.maxTextureSize,batchSize:e.batchSize,maxLights:e.maxLights,mipmapFilter:e.mipmapFilter},this.game=t,this.type=o.WEBGL,this.width=0,this.height=0,this.canvas=t.canvas,this.blendModes=[],this.nativeTextures=[],this.contextLost=!1,this.pipelines=null,this.snapshotState={x:0,y:0,width:1,height:1,getPixel:!1,callback:null,type:"image/png",encoder:.92,isFramebuffer:!1,bufferWidth:0,bufferHeight:0},this.currentActiveTextureUnit=0,this.currentTextures=new Array(16),this.currentFramebuffer=null,this.currentPipeline=null,this.currentProgram=null,this.currentVertexBuffer=null,this.currentIndexBuffer=null,this.currentBlendMode=1/0,this.currentScissorEnabled=!1,this.currentScissor=null,this.scissorStack=[],this.contextLostHandler=u,this.contextRestoredHandler=u,this.gl=null,this.supportedExtensions=null,this.extensions={},this.glFormats=[],this.compression={ETC1:!1,PVRTC:!1,S3TC:!1},this.drawingBufferHeight=0,this.blankTexture=null,this.defaultCamera=new n(0,0,0,0),this._tempMatrix1=new p,this._tempMatrix2=new p,this._tempMatrix3=new p,this._tempMatrix4=new p,this.maskCount=0,this.maskStack=[],this.currentMask={mask:null,camera:null},this.currentCameraMask={mask:null,camera:null},this.glFuncMap=null,this.currentType="",this.newType=!1,this.nextTypeMatch=!1,this.mipmapFilter=null,this.init(this.config)},init:function(t){var e,i=this.game,n=this.canvas,r=t.backgroundColor;if(!(e=i.config.context?i.config.context:n.getContext("webgl",t.contextCreation)||n.getContext("experimental-webgl",t.contextCreation))||e.isContextLost())throw this.contextLost=!0,new Error("WebGL unsupported");this.gl=e;var s=this;this.contextLostHandler=function(t){s.contextLost=!0,s.game.events.emit(a.CONTEXT_LOST,s),t.preventDefault()},this.contextRestoredHandler=function(){s.contextLost=!1,s.init(s.config),s.game.events.emit(a.CONTEXT_RESTORED,s)},n.addEventListener("webglcontextlost",this.contextLostHandler,!1),n.addEventListener("webglcontextrestored",this.contextRestoredHandler,!1),i.context=e;for(var h=0;h<=27;h++)this.blendModes.push({func:[e.ONE,e.ONE_MINUS_SRC_ALPHA],equation:e.FUNC_ADD});this.blendModes[1].func=[e.ONE,e.DST_ALPHA],this.blendModes[2].func=[e.DST_COLOR,e.ONE_MINUS_SRC_ALPHA],this.blendModes[3].func=[e.ONE,e.ONE_MINUS_SRC_COLOR],this.blendModes[17]={func:[e.ZERO,e.ONE_MINUS_SRC_ALPHA],equation:e.FUNC_REVERSE_SUBTRACT},this.glFormats[0]=e.BYTE,this.glFormats[1]=e.SHORT,this.glFormats[2]=e.UNSIGNED_BYTE,this.glFormats[3]=e.UNSIGNED_SHORT,this.glFormats[4]=e.FLOAT,this.glFuncMap={mat2:{func:e.uniformMatrix2fv,length:1,matrix:!0},mat3:{func:e.uniformMatrix3fv,length:1,matrix:!0},mat4:{func:e.uniformMatrix4fv,length:1,matrix:!0},"1f":{func:e.uniform1f,length:1},"1fv":{func:e.uniform1fv,length:1},"1i":{func:e.uniform1i,length:1},"1iv":{func:e.uniform1iv,length:1},"2f":{func:e.uniform2f,length:2},"2fv":{func:e.uniform2fv,length:1},"2i":{func:e.uniform2i,length:2},"2iv":{func:e.uniform2iv,length:1},"3f":{func:e.uniform3f,length:3},"3fv":{func:e.uniform3fv,length:1},"3i":{func:e.uniform3i,length:3},"3iv":{func:e.uniform3iv,length:1},"4f":{func:e.uniform4f,length:4},"4fv":{func:e.uniform4fv,length:1},"4i":{func:e.uniform4i,length:4},"4iv":{func:e.uniform4iv,length:1}};var u=e.getSupportedExtensions();t.maxTextures||(t.maxTextures=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)),t.maxTextureSize||(t.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE));var l="WEBGL_compressed_texture_",c="WEBKIT_"+l;this.compression.ETC1=e.getExtension(l+"etc1")||e.getExtension(c+"etc1"),this.compression.PVRTC=e.getExtension(l+"pvrtc")||e.getExtension(c+"pvrtc"),this.compression.S3TC=e.getExtension(l+"s3tc")||e.getExtension(c+"s3tc"),this.supportedExtensions=u,e.disable(e.DEPTH_TEST),e.disable(e.CULL_FACE),e.enable(e.BLEND),e.clearColor(r.redGL,r.greenGL,r.blueGL,r.alphaGL),this.mipmapFilter=e[t.mipmapFilter];for(var p=0;p<this.currentTextures.length;++p)this.currentTextures[p]=null;return this.pipelines={},this.addPipeline("TextureTintPipeline",new y({game:i,renderer:this})),this.addPipeline("TextureTintStripPipeline",new _({game:i,renderer:this})),this.addPipeline("BitmapMaskPipeline",new v({game:i,renderer:this})),this.addPipeline("Light2D",new g({game:i,renderer:this,maxLights:t.maxLights})),this.setBlendMode(o.BlendModes.NORMAL),i.textures.once(d.READY,this.boot,this),this},boot:function(){for(var t in this.pipelines)this.pipelines[t].boot();var e=this.game.textures.getFrame("__DEFAULT");this.pipelines.TextureTintPipeline.currentFrame=e,this.blankTexture=e;var i=this.gl;i.bindFramebuffer(i.FRAMEBUFFER,null),i.enable(i.SCISSOR_TEST),this.setPipeline(this.pipelines.TextureTintPipeline),this.game.scale.on(l.RESIZE,this.onResize,this);var n=this.game.scale.baseSize;this.resize(n.width,n.height,this.game.scale.resolution)},onResize:function(t,e,i,n){e.width===this.width&&e.height===this.height&&n===this.resolution||this.resize(e.width,e.height,n)},resize:function(t,e,i){var n=this.gl,r=this.pipelines;for(var s in this.width=t,this.height=e,this.resolution=i,n.viewport(0,0,t,e),r)r[s].resize(t,e,i);return this.drawingBufferHeight=n.drawingBufferHeight,n.scissor(0,n.drawingBufferHeight-e,t,e),this.defaultCamera.setSize(t,e),this},hasExtension:function(t){return!!this.supportedExtensions&&this.supportedExtensions.indexOf(t)},getExtension:function(t){return this.hasExtension(t)?(t in this.extensions||(this.extensions[t]=this.gl.getExtension(t)),this.extensions[t]):null},flush:function(){this.currentPipeline&&this.currentPipeline.flush()},hasPipeline:function(t){return t in this.pipelines},getPipeline:function(t){return this.hasPipeline(t)?this.pipelines[t]:null},removePipeline:function(t){return delete this.pipelines[t],this},addPipeline:function(t,e){return this.hasPipeline(t)?console.warn("Pipeline exists: "+t):this.pipelines[t]=e,e.name=t,this.pipelines[t].resize(this.width,this.height,this.config.resolution),e},pushScissor:function(t,e,i,n,r){void 0===r&&(r=this.drawingBufferHeight);var s=[t,e,i,n];return this.scissorStack.push(s),this.setScissor(t,e,i,n,r),this.currentScissor=s,s},setScissor:function(t,e,i,n,r){void 0===r&&(r=this.drawingBufferHeight);var s=this.gl,o=this.currentScissor,a=i>0&&n>0;if(o&&a){var h=o[0],u=o[1],l=o[2],c=o[3];a=h!==t||u!==e||l!==i||c!==n}a&&(this.flush(),s.scissor(t,r-e-n,i,n))},popScissor:function(){var t=this.scissorStack;t.pop();var e=t[t.length-1];e&&this.setScissor(e[0],e[1],e[2],e[3]),this.currentScissor=e},setPipeline:function(t,e){return this.currentPipeline===t&&this.currentPipeline.vertexBuffer===this.currentVertexBuffer&&this.currentPipeline.program===this.currentProgram||(this.flush(),this.currentPipeline=t,this.currentPipeline.bind()),this.currentPipeline.onBind(e),this.currentPipeline},hasActiveStencilMask:function(){var t=this.currentMask.mask,e=this.currentCameraMask.mask;return t&&t.isStencil||e&&e.isStencil},rebindPipeline:function(t){var e=this.gl;e.disable(e.DEPTH_TEST),e.disable(e.CULL_FACE),this.hasActiveStencilMask()?e.clear(e.DEPTH_BUFFER_BIT):(e.disable(e.STENCIL_TEST),e.clear(e.DEPTH_BUFFER_BIT|e.STENCIL_BUFFER_BIT)),e.viewport(0,0,this.width,this.height),this.setBlendMode(0,!0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,this.blankTexture.glTexture),this.currentActiveTextureUnit=0,this.currentTextures[0]=this.blankTexture.glTexture,this.currentPipeline=t,this.currentPipeline.bind(),this.currentPipeline.onBind()},clearPipeline:function(){this.flush(),this.currentPipeline=null,this.currentProgram=null,this.currentVertexBuffer=null,this.currentIndexBuffer=null,this.setBlendMode(0,!0)},setBlendMode:function(t,e){void 0===e&&(e=!1);var i=this.gl,n=this.blendModes[t];return!!(e||t!==o.BlendModes.SKIP_CHECK&&this.currentBlendMode!==t)&&(this.flush(),i.enable(i.BLEND),i.blendEquation(n.equation),n.func.length>2?i.blendFuncSeparate(n.func[0],n.func[1],n.func[2],n.func[3]):i.blendFunc(n.func[0],n.func[1]),this.currentBlendMode=t,!0)},addBlendMode:function(t,e){return this.blendModes.push({func:t,equation:e})-1},updateBlendMode:function(t,e,i){return this.blendModes[t]&&(this.blendModes[t].func=e,i&&(this.blendModes[t].equation=i)),this},removeBlendMode:function(t){return t>17&&this.blendModes[t]&&this.blendModes.splice(t,1),this},setBlankTexture:function(t){void 0===t&&(t=!1),!t&&0===this.currentActiveTextureUnit&&this.currentTextures[0]||this.setTexture2D(this.blankTexture.glTexture,0)},setTexture2D:function(t,e,i){void 0===i&&(i=!0);var n=this.gl;return t!==this.currentTextures[e]&&(i&&this.flush(),this.currentActiveTextureUnit!==e&&(n.activeTexture(n.TEXTURE0+e),this.currentActiveTextureUnit=e),n.bindTexture(n.TEXTURE_2D,t),this.currentTextures[e]=t),this},setFramebuffer:function(t,e){void 0===e&&(e=!1);var i=this.gl,n=this.width,r=this.height;return t!==this.currentFramebuffer&&(t&&t.renderTexture?(n=t.renderTexture.width,r=t.renderTexture.height):this.flush(),i.bindFramebuffer(i.FRAMEBUFFER,t),i.viewport(0,0,n,r),e&&(t?(this.drawingBufferHeight=r,this.pushScissor(0,0,n,r)):(this.drawingBufferHeight=this.height,this.popScissor())),this.currentFramebuffer=t),this},setProgram:function(t){var e=this.gl;return t!==this.currentProgram&&(this.flush(),e.useProgram(t),this.currentProgram=t),this},setVertexBuffer:function(t){var e=this.gl;return t!==this.currentVertexBuffer&&(this.flush(),e.bindBuffer(e.ARRAY_BUFFER,t),this.currentVertexBuffer=t),this},setIndexBuffer:function(t){var e=this.gl;return t!==this.currentIndexBuffer&&(this.flush(),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),this.currentIndexBuffer=t),this},createTextureFromSource:function(t,e,i,n){var r=this.gl,s=r.NEAREST,a=r.NEAREST,u=r.CLAMP_TO_EDGE;e=t?t.width:e,i=t?t.height:i;var l=h(e,i);return l&&(u=r.REPEAT),n===o.ScaleModes.LINEAR&&this.config.antialias&&(s=l?this.mipmapFilter:r.LINEAR,a=r.LINEAR),t||"number"!=typeof e||"number"!=typeof i?this.createTexture2D(0,s,a,u,u,r.RGBA,t):this.createTexture2D(0,s,a,u,u,r.RGBA,null,e,i)},createTexture2D:function(t,e,i,n,r,s,o,a,u,l,c,d){l=null==l||l,void 0===c&&(c=!1),void 0===d&&(d=!1);var p=this.gl,f=p.createTexture();return this.setTexture2D(f,0),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MIN_FILTER,e),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_MAG_FILTER,i),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_S,r),p.texParameteri(p.TEXTURE_2D,p.TEXTURE_WRAP_T,n),p.pixelStorei(p.UNPACK_PREMULTIPLY_ALPHA_WEBGL,l),p.pixelStorei(p.UNPACK_FLIP_Y_WEBGL,d),null==o?p.texImage2D(p.TEXTURE_2D,t,s,a,u,0,s,p.UNSIGNED_BYTE,null):(c||(a=o.width,u=o.height),p.texImage2D(p.TEXTURE_2D,t,s,s,p.UNSIGNED_BYTE,o)),h(a,u)&&p.generateMipmap(p.TEXTURE_2D),this.setTexture2D(null,0),f.isAlphaPremultiplied=l,f.isRenderTexture=!1,f.width=a,f.height=u,this.nativeTextures.push(f),f},createFramebuffer:function(t,e,i,n){var r,s=this.gl,o=s.createFramebuffer();if(this.setFramebuffer(o),n){var a=s.createRenderbuffer();s.bindRenderbuffer(s.RENDERBUFFER,a),s.renderbufferStorage(s.RENDERBUFFER,s.DEPTH_STENCIL,t,e),s.framebufferRenderbuffer(s.FRAMEBUFFER,s.DEPTH_STENCIL_ATTACHMENT,s.RENDERBUFFER,a)}if(i.isRenderTexture=!0,i.isAlphaPremultiplied=!1,s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,i,0),(r=s.checkFramebufferStatus(s.FRAMEBUFFER))!==s.FRAMEBUFFER_COMPLETE){throw new Error("Framebuffer incomplete. Framebuffer status: "+{36054:"Incomplete Attachment",36055:"Missing Attachment",36057:"Incomplete Dimensions",36061:"Framebuffer Unsupported"}[r])}return o.renderTexture=i,this.setFramebuffer(null),o},createProgram:function(t,e){var i=this.gl,n=i.createProgram(),r=i.createShader(i.VERTEX_SHADER),s=i.createShader(i.FRAGMENT_SHADER);if(i.shaderSource(r,t),i.shaderSource(s,e),i.compileShader(r),i.compileShader(s),!i.getShaderParameter(r,i.COMPILE_STATUS))throw new Error("Failed to compile Vertex Shader:\n"+i.getShaderInfoLog(r));if(!i.getShaderParameter(s,i.COMPILE_STATUS))throw new Error("Failed to compile Fragment Shader:\n"+i.getShaderInfoLog(s));if(i.attachShader(n,r),i.attachShader(n,s),i.linkProgram(n),!i.getProgramParameter(n,i.LINK_STATUS))throw new Error("Failed to link program:\n"+i.getProgramInfoLog(n));return n},createVertexBuffer:function(t,e){var i=this.gl,n=i.createBuffer();return this.setVertexBuffer(n),i.bufferData(i.ARRAY_BUFFER,t,e),this.setVertexBuffer(null),n},createIndexBuffer:function(t,e){var i=this.gl,n=i.createBuffer();return this.setIndexBuffer(n),i.bufferData(i.ELEMENT_ARRAY_BUFFER,t,e),this.setIndexBuffer(null),n},deleteTexture:function(t){var e=this.nativeTextures.indexOf(t);return-1!==e&&c(this.nativeTextures,e),this.gl.deleteTexture(t),this.currentTextures[0]!==t||this.game.pendingDestroy||this.setBlankTexture(!0),this},deleteFramebuffer:function(t){return this.gl.deleteFramebuffer(t),this},deleteProgram:function(t){return this.gl.deleteProgram(t),this},deleteBuffer:function(t){return this.gl.deleteBuffer(t),this},preRenderCamera:function(t){var e=t._cx,i=t._cy,n=t._cw,s=t._ch,o=this.pipelines.TextureTintPipeline,a=t.backgroundColor;if(t.renderToTexture){this.flush(),this.pushScissor(e,i,n,-s),this.setFramebuffer(t.framebuffer);var h=this.gl;h.clearColor(0,0,0,0),h.clear(h.COLOR_BUFFER_BIT),o.projOrtho(e,n+e,i,s+i,-1e3,1e3),t.mask&&(this.currentCameraMask.mask=t.mask,this.currentCameraMask.camera=t._maskCamera,t.mask.preRenderWebGL(this,t,t._maskCamera)),a.alphaGL>0&&o.drawFillRect(e,i,n+e,s+i,f.getTintFromFloats(a.redGL,a.greenGL,a.blueGL,1),a.alphaGL),t.emit(r.PRE_RENDER,t)}else this.pushScissor(e,i,n,s),t.mask&&(this.currentCameraMask.mask=t.mask,this.currentCameraMask.camera=t._maskCamera,t.mask.preRenderWebGL(this,t,t._maskCamera)),a.alphaGL>0&&o.drawFillRect(e,i,n,s,f.getTintFromFloats(a.redGL,a.greenGL,a.blueGL,1),a.alphaGL)},getCurrentStencilMask:function(){var t=null,e=this.maskStack,i=this.currentCameraMask;return e.length>0?t=e[e.length-1]:i.mask&&i.mask.isStencil&&(t=i),t},postRenderCamera:function(t){this.setPipeline(this.pipelines.TextureTintPipeline);var e=this.pipelines.TextureTintPipeline;if(t.flashEffect.postRenderWebGL(e,f.getTintFromFloats),t.fadeEffect.postRenderWebGL(e,f.getTintFromFloats),t.dirty=!1,this.popScissor(),t.renderToTexture){if(e.flush(),this.setFramebuffer(null),t.emit(r.POST_RENDER,t),t.renderToGame){e.projOrtho(0,e.width,e.height,0,-1e3,1e3);var i=f.getTintAppendFloatAlpha;(t.pipeline?t.pipeline:e).batchTexture(t,t.glTexture,t.width,t.height,t.x,t.y,t.width,t.height,t.zoom,t.zoom,t.rotation,t.flipX,!t.flipY,1,1,0,0,0,0,t.width,t.height,i(t._tintTL,t._alphaTL),i(t._tintTR,t._alphaTR),i(t._tintBL,t._alphaBL),i(t._tintBR,t._alphaBR),t._isTinted&&t.tintFill,0,0,this.defaultCamera,null)}this.setBlankTexture(!0)}t.mask&&(this.currentCameraMask.mask=null,t.mask.postRenderWebGL(this,t._maskCamera))},preRender:function(){if(!this.contextLost){var t=this.gl,e=this.pipelines;if(t.bindFramebuffer(t.FRAMEBUFFER,null),this.config.clearBeforeRender){var i=this.config.backgroundColor;t.clearColor(i.redGL,i.greenGL,i.blueGL,i.alphaGL),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT|t.STENCIL_BUFFER_BIT)}for(var n in t.enable(t.SCISSOR_TEST),e)e[n].onPreRender();this.currentScissor=[0,0,this.width,this.height],this.scissorStack=[this.currentScissor],this.game.scene.customViewports&&t.scissor(0,this.drawingBufferHeight-this.height,this.width,this.height),this.currentMask.mask=null,this.currentCameraMask.mask=null,this.maskStack.length=0,this.setPipeline(this.pipelines.TextureTintPipeline)}},render:function(t,e,i,n){if(!this.contextLost){var r=e.list,s=r.length,a=this.pipelines;for(var h in a)a[h].onRender(t,n);if(this.preRenderCamera(n),0===s)return this.setBlendMode(o.BlendModes.NORMAL),void this.postRenderCamera(n);this.currentType="";for(var u=this.currentMask,l=0;l<s;l++){var c=r[l];if(c.willRender(n)){c.blendMode!==this.currentBlendMode&&this.setBlendMode(c.blendMode);var d=c.mask;(u=this.currentMask).mask&&u.mask!==d&&u.mask.postRenderWebGL(this,u.camera),d&&u.mask!==d&&d.preRenderWebGL(this,c,n);var p=c.type;p!==this.currentType&&(this.newType=!0,this.currentType=p),this.nextTypeMatch=l<s-1&&r[l+1].type===this.currentType,c.renderWebGL(this,c,i,n),this.newType=!1}}(u=this.currentMask).mask&&u.mask.postRenderWebGL(this,u.camera),this.setBlendMode(o.BlendModes.NORMAL),this.postRenderCamera(n)}},postRender:function(){if(!this.contextLost){this.flush();var t=this.snapshotState;t.callback&&(m(this.canvas,t),t.callback=null);var e=this.pipelines;for(var i in e)e[i].onPostRender()}},snapshot:function(t,e,i){return this.snapshotArea(0,0,this.gl.drawingBufferWidth,this.gl.drawingBufferHeight,t,e,i)},snapshotArea:function(t,e,i,n,r,s,o){var a=this.snapshotState;return a.callback=r,a.type=s,a.encoder=o,a.getPixel=!1,a.x=t,a.y=e,a.width=Math.min(i,this.gl.drawingBufferWidth),a.height=Math.min(n,this.gl.drawingBufferHeight),this},snapshotPixel:function(t,e,i){return this.snapshotArea(t,e,1,1,i),this.snapshotState.getPixel=!0,this},snapshotFramebuffer:function(t,e,i,n,r,s,o,a,h,u,l){void 0===r&&(r=!1),void 0===s&&(s=0),void 0===o&&(o=0),void 0===a&&(a=e),void 0===h&&(h=i);var c=this.currentFramebuffer;this.snapshotArea(s,o,a,h,n,u,l);var d=this.snapshotState;return d.getPixel=r,d.isFramebuffer=!0,d.bufferWidth=e,d.bufferHeight=i,this.setFramebuffer(t),m(this.canvas,d),this.setFramebuffer(c),d.callback=null,d.isFramebuffer=!1,this},canvasToTexture:function(t,e,i,n){return void 0===i&&(i=!1),void 0===n&&(n=!1),e?this.updateCanvasTexture(t,e,n):this.createCanvasTexture(t,i,n)},createCanvasTexture:function(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=this.gl,r=n.NEAREST,s=n.NEAREST,o=t.width,a=t.height,u=n.CLAMP_TO_EDGE,l=h(o,a);return!e&&l&&(u=n.REPEAT),this.config.antialias&&(r=l?this.mipmapFilter:n.LINEAR,s=n.LINEAR),this.createTexture2D(0,r,s,u,u,n.RGBA,t,o,a,!0,!1,i)},updateCanvasTexture:function(t,e,i){void 0===i&&(i=!1);var n=this.gl,r=t.width,s=t.height;return r>0&&s>0&&(this.setTexture2D(e,0),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,i),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,t),e.width=r,e.height=s,this.setTexture2D(null,0)),e},createVideoTexture:function(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=this.gl,r=n.NEAREST,s=n.NEAREST,o=t.videoWidth,a=t.videoHeight,u=n.CLAMP_TO_EDGE,l=h(o,a);return!e&&l&&(u=n.REPEAT),this.config.antialias&&(r=l?this.mipmapFilter:n.LINEAR,s=n.LINEAR),this.createTexture2D(0,r,s,u,u,n.RGBA,t,o,a,!0,!0,i)},updateVideoTexture:function(t,e,i){void 0===i&&(i=!1);var n=this.gl,r=t.videoWidth,s=t.videoHeight;return r>0&&s>0&&(this.setTexture2D(e,0),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,i),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,t),e.width=r,e.height=s,this.setTexture2D(null,0)),e},setTextureFilter:function(t,e){var i=this.gl,n=[i.LINEAR,i.NEAREST][e];return this.setTexture2D(t,0),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,n),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,n),this.setTexture2D(null,0),this},setFloat1:function(t,e,i){return this.setProgram(t),this.gl.uniform1f(this.gl.getUniformLocation(t,e),i),this},setFloat2:function(t,e,i,n){return this.setProgram(t),this.gl.uniform2f(this.gl.getUniformLocation(t,e),i,n),this},setFloat3:function(t,e,i,n,r){return this.setProgram(t),this.gl.uniform3f(this.gl.getUniformLocation(t,e),i,n,r),this},setFloat4:function(t,e,i,n,r,s){return this.setProgram(t),this.gl.uniform4f(this.gl.getUniformLocation(t,e),i,n,r,s),this},setFloat1v:function(t,e,i){return this.setProgram(t),this.gl.uniform1fv(this.gl.getUniformLocation(t,e),i),this},setFloat2v:function(t,e,i){return this.setProgram(t),this.gl.uniform2fv(this.gl.getUniformLocation(t,e),i),this},setFloat3v:function(t,e,i){return this.setProgram(t),this.gl.uniform3fv(this.gl.getUniformLocation(t,e),i),this},setFloat4v:function(t,e,i){return this.setProgram(t),this.gl.uniform4fv(this.gl.getUniformLocation(t,e),i),this},setInt1:function(t,e,i){return this.setProgram(t),this.gl.uniform1i(this.gl.getUniformLocation(t,e),i),this},setInt2:function(t,e,i,n){return this.setProgram(t),this.gl.uniform2i(this.gl.getUniformLocation(t,e),i,n),this},setInt3:function(t,e,i,n,r){return this.setProgram(t),this.gl.uniform3i(this.gl.getUniformLocation(t,e),i,n,r),this},setInt4:function(t,e,i,n,r,s){return this.setProgram(t),this.gl.uniform4i(this.gl.getUniformLocation(t,e),i,n,r,s),this},setMatrix2:function(t,e,i,n){return this.setProgram(t),this.gl.uniformMatrix2fv(this.gl.getUniformLocation(t,e),i,n),this},setMatrix3:function(t,e,i,n){return this.setProgram(t),this.gl.uniformMatrix3fv(this.gl.getUniformLocation(t,e),i,n),this},setMatrix4:function(t,e,i,n){return this.setProgram(t),this.gl.uniformMatrix4fv(this.gl.getUniformLocation(t,e),i,n),this},getMaxTextures:function(){return this.config.maxTextures},getMaxTextureSize:function(){return this.config.maxTextureSize},destroy:function(){for(var t=0;t<this.nativeTextures.length;t++)this.gl.deleteTexture(this.nativeTextures[t]);for(var e in this.nativeTextures=[],this.pipelines)this.pipelines[e].destroy(),delete this.pipelines[e];this.defaultCamera.destroy(),this.currentMask=null,this.currentCameraMask=null,this.canvas.removeEventListener("webglcontextlost",this.contextLostHandler,!1),this.canvas.removeEventListener("webglcontextrestored",this.contextRestoredHandler,!1),this.game=null,this.gl=null,this.canvas=null,this.maskStack=[],this.contextLost=!0,this.extensions={}}});t.exports=x},51087:(t,e,i)=>{t.exports={Utils:i(19298),WebGLPipeline:i(69241),WebGLRenderer:i(36010),Pipelines:i(60487),BYTE:0,SHORT:1,UNSIGNED_BYTE:2,UNSIGNED_SHORT:3,FLOAT:4}},51043:(t,e,i)=>{var n=i(47379),r=i(10042),s=i(89781),o=i(69241),a=new n({Extends:o,initialize:function(t){o.call(this,{game:t.game,renderer:t.renderer,gl:t.renderer.gl,topology:t.topology?t.topology:t.renderer.gl.TRIANGLES,vertShader:t.vertShader?t.vertShader:s,fragShader:t.fragShader?t.fragShader:r,vertexCapacity:t.vertexCapacity?t.vertexCapacity:3,vertexSize:t.vertexSize?t.vertexSize:2*Float32Array.BYTES_PER_ELEMENT,vertices:new Float32Array([-1,1,-1,-7,7,1]).buffer,attributes:[{name:"inPosition",size:2,type:t.renderer.gl.FLOAT,normalized:!1,offset:0}]}),this.vertexViewF32=new Float32Array(this.vertexData),this.maxQuads=1,this.resolutionDirty=!0},onBind:function(){o.prototype.onBind.call(this);var t=this.renderer,e=this.program;return this.resolutionDirty&&(t.setFloat2(e,"uResolution",this.width,this.height),t.setInt1(e,"uMainSampler",0),t.setInt1(e,"uMaskSampler",1),this.resolutionDirty=!1),this},resize:function(t,e,i){return o.prototype.resize.call(this,t,e,i),this.resolutionDirty=!0,this},beginMask:function(t,e,i){var n=this.renderer,r=this.gl;t.bitmapMask&&r&&(n.flush(),t.prevFramebuffer=n.currentFramebuffer,n.setFramebuffer(t.mainFramebuffer),r.disable(r.STENCIL_TEST),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT),n.currentCameraMask.mask!==t&&(n.currentMask.mask=t,n.currentMask.camera=i))},endMask:function(t,e){var i=this.gl,n=this.renderer,r=t.bitmapMask;if(r&&i){n.flush(),n.setFramebuffer(t.maskFramebuffer),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT),n.setBlendMode(0,!0),r.renderWebGL(n,r,0,e),n.flush(),n.setFramebuffer(t.prevFramebuffer);var s=n.getCurrentStencilMask();s?(i.enable(i.STENCIL_TEST),s.mask.applyStencil(n,s.camera,!0)):n.currentMask.mask=null,n.setPipeline(this),i.activeTexture(i.TEXTURE1),i.bindTexture(i.TEXTURE_2D,t.maskTexture),i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,t.mainTexture),i.uniform1i(i.getUniformLocation(this.program,"uInvertMaskAlpha"),t.invertAlpha),i.drawArrays(this.topology,0,3)}}});t.exports=a},74612:(t,e,i)=>{var n=i(47379),r=i(74934),s=i(38383),o=10,a=new n({Extends:s,initialize:function(t){o=t.maxLights,t.fragShader=r.replace("%LIGHT_COUNT%",o.toString()),s.call(this,t),this.defaultNormalMap,this.inverseRotationMatrix=new Float32Array([1,0,0,0,1,0,0,0,1])},boot:function(){this.defaultNormalMap=this.game.textures.getFrame("__DEFAULT")},onBind:function(t){s.prototype.onBind.call(this);var e=this.renderer,i=this.program;return this.mvpUpdate(),e.setInt1(i,"uNormSampler",1),e.setFloat2(i,"uResolution",this.width,this.height),t&&this.setNormalMap(t),this},onRender:function(t,e){this.active=!1;var i=t.sys.lights;if(!i||i.lights.length<=0||!i.active)return this;var n=i.cull(e),r=Math.min(n.length,o);if(0===r)return this;this.active=!0;var s,a=this.renderer,h=this.program,u=e.matrix,l={x:0,y:0},c=a.height;for(s=0;s<o;++s)a.setFloat1(h,"uLights["+s+"].radius",0);for(a.setFloat4(h,"uCamera",e.x,e.y,e.rotation,e.zoom),a.setFloat3(h,"uAmbientLightColor",i.ambientColor.r,i.ambientColor.g,i.ambientColor.b),s=0;s<r;++s){var d=n[s],p="uLights["+s+"].";u.transformPoint(d.x,d.y,l),a.setFloat2(h,p+"position",l.x-e.scrollX*d.scrollFactorX*e.zoom,c-(l.y-e.scrollY*d.scrollFactorY*e.zoom)),a.setFloat3(h,p+"color",d.r,d.g,d.b),a.setFloat1(h,p+"intensity",d.intensity),a.setFloat1(h,p+"radius",d.radius)}return this.currentNormalMapRotation=null,this},batchTexture:function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f,m,v,g,y,_,x,b,w,T,M,S,E,L,A,D){var P;if(this.active)if(this.renderer.setPipeline(this),t.displayTexture?P=t.displayTexture.dataSource[t.displayFrame.sourceIndex]:t.texture?P=t.texture.dataSource[t.frame.sourceIndex]:t.tileset&&(P=Array.isArray(t.tileset)?t.tileset[0].image.dataSource[0]:t.tileset.image.dataSource[0]),P){this.setTexture2D(P.glTexture,1),this.setNormalMapRotation(l);var C=this._tempMatrix1,O=this._tempMatrix2,k=this._tempMatrix3,R=g/i+E,I=y/n+L,Y=(g+_)/i+E,F=(y+x)/n+L,N=o,B=a,U=-m,j=-v;if(t.isCropped){var H=t._crop;N=H.width,B=H.height,o=H.width,a=H.height;var z=g=H.x,W=y=H.y;c&&(z=_-H.x-H.width),d&&!e.isRenderTexture&&(W=x-H.y-H.height),R=z/i+E,I=W/n+L,Y=(z+H.width)/i+E,F=(W+H.height)/n+L,U=-m+g,j=-v+y}c&&(N*=-1,U+=o),(d^=e.isRenderTexture?1:0)&&(B*=-1,j+=a);var G=U+N,V=j+B;O.applyITRS(r,s,l,h,u),C.copyFrom(A.matrix),D?(C.multiplyWithOffset(D,-A.scrollX*p,-A.scrollY*f),O.e=r,O.f=s,C.multiply(O,k)):(O.e-=A.scrollX*p,O.f-=A.scrollY*f,C.multiply(O,k));var X=k.getX(U,j),q=k.getY(U,j),J=k.getX(U,V),Z=k.getY(U,V),K=k.getX(G,V),Q=k.getY(G,V),$=k.getX(G,j),tt=k.getY(G,j);A.roundPixels&&(X=Math.round(X),q=Math.round(q),J=Math.round(J),Z=Math.round(Z),K=Math.round(K),Q=Math.round(Q),$=Math.round($),tt=Math.round(tt)),this.setTexture2D(e,0),this.batchQuad(X,q,J,Z,K,Q,$,tt,R,I,Y,F,b,w,T,M,S,e,0)}else console.warn("Normal map missing or invalid")},setNormalMap:function(t){var e;this.active&&t&&(t.texture&&(e=t.texture.dataSource[t.frame.sourceIndex]),e||(e=this.defaultNormalMap),this.setTexture2D(e.glTexture,1),this.renderer.setPipeline(t.defaultPipeline))},setNormalMapRotation:function(t){if(t!==this.currentNormalMapRotation||0===this.batches.length){this.batches.length>0&&this.flush();var e=this.inverseRotationMatrix;if(t){var i=-t,n=Math.cos(i),r=Math.sin(i);e[1]=r,e[3]=-r,e[0]=e[4]=n}else e[0]=e[4]=1,e[1]=e[3]=0;this.renderer.setMatrix3(this.program,"uInverseRotationMatrix",!1,e),this.currentNormalMapRotation=t}},batchSprite:function(t,e,i){if(this.active){var n=t.texture.dataSource[t.frame.sourceIndex];n&&(this.renderer.setPipeline(this),this.setTexture2D(n.glTexture,1),this.setNormalMapRotation(t.rotation),s.prototype.batchSprite.call(this,t,e,i))}}});a.LIGHT_COUNT=o,t.exports=a},38383:(t,e,i)=>{var n=i(47379),r=i(43574),s=i(81769),o=i(77266),a=i(73914),h=i(29757),u=i(65492),l=i(19298),c=i(69241),d=new n({Extends:c,Mixins:[o],initialize:function(t){var e=t.renderer.config;c.call(this,{game:t.game,renderer:t.renderer,gl:t.renderer.gl,topology:s(t,"topology",t.renderer.gl.TRIANGLES),vertShader:s(t,"vertShader",h),fragShader:s(t,"fragShader",a),vertexCapacity:s(t,"vertexCapacity",6*e.batchSize),vertexSize:s(t,"vertexSize",5*Float32Array.BYTES_PER_ELEMENT+4*Uint8Array.BYTES_PER_ELEMENT),attributes:[{name:"inPosition",size:2,type:t.renderer.gl.FLOAT,normalized:!1,offset:0},{name:"inTexCoord",size:2,type:t.renderer.gl.FLOAT,normalized:!1,offset:2*Float32Array.BYTES_PER_ELEMENT},{name:"inTintEffect",size:1,type:t.renderer.gl.FLOAT,normalized:!1,offset:4*Float32Array.BYTES_PER_ELEMENT},{name:"inTint",size:4,type:t.renderer.gl.UNSIGNED_BYTE,normalized:!0,offset:5*Float32Array.BYTES_PER_ELEMENT}]}),this.vertexViewF32=new Float32Array(this.vertexData),this.vertexViewU32=new Uint32Array(this.vertexData),this.maxQuads=e.batchSize,this.batches=[],this._tempMatrix1=new u,this._tempMatrix2=new u,this._tempMatrix3=new u,this._tempMatrix4=new u,this.tempTriangle=[{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0},{x:0,y:0,width:0}],this.tintEffect=2,this.strokeTint={TL:0,TR:0,BL:0,BR:0},this.fillTint={TL:0,TR:0,BL:0,BR:0},this.currentFrame={u0:0,v0:0,u1:1,v1:1},this.firstQuad=[0,0,0,0,0],this.prevQuad=[0,0,0,0,0],this.polygonCache=[],this.mvpInit()},onBind:function(){return c.prototype.onBind.call(this),this.mvpUpdate(),this},resize:function(t,e,i){return c.prototype.resize.call(this,t,e,i),this.projOrtho(0,this.width,this.height,0,-1e3,1e3),this},setTexture2D:function(t,e){return void 0===t&&(t=this.renderer.blankTexture.glTexture),void 0===e&&(e=0),this.requireTextureBatch(t,e)&&this.pushBatch(t,e),this},requireTextureBatch:function(t,e){var i=this.batches,n=i.length;return!(n>0)||!((e>0?i[n-1].textures[e-1]:i[n-1].texture)===t)},pushBatch:function(t,e){if(0===e)this.batches.push({first:this.vertexCount,texture:t,textures:[]});else{var i=[];i[e-1]=t,this.batches.push({first:this.vertexCount,texture:null,textures:i})}},flush:function(){if(this.flushLocked)return this;this.flushLocked=!0;var t,e,i,n=this.gl,r=this.vertexCount,s=this.topology,o=this.vertexSize,a=this.renderer,h=this.batches,u=h.length,l=0,c=null;if(0===u||0===r)return this.flushLocked=!1,this;n.bufferSubData(n.ARRAY_BUFFER,0,this.bytes.subarray(0,r*o));for(var d=0;d<u-1;d++){if(c=h[d],t=h[d+1],c.textures.length>0){for(e=0;e<c.textures.length;++e)(i=c.textures[e])&&a.setTexture2D(i,1+e,!1);n.activeTexture(n.TEXTURE0)}l=t.first-c.first,null===c.texture||l<=0||(a.setTexture2D(c.texture,0,!1),n.drawArrays(s,c.first,l))}if((c=h[u-1]).textures.length>0){for(e=0;e<c.textures.length;++e)(i=c.textures[e])&&a.setTexture2D(i,1+e,!1);n.activeTexture(n.TEXTURE0)}return l=r-c.first,c.texture&&l>0&&(a.setTexture2D(c.texture,0,!1),n.drawArrays(s,c.first,l)),this.vertexCount=0,h.length=0,this.flushLocked=!1,this},batchSprite:function(t,e,i){this.renderer.setPipeline(this);var n=this._tempMatrix1,r=this._tempMatrix2,s=this._tempMatrix3,o=t.frame,a=o.glTexture,h=o.u0,u=o.v0,c=o.u1,d=o.v1,p=o.x,f=o.y,m=o.cutWidth,v=o.cutHeight,g=o.customPivot,y=t.displayOriginX,_=t.displayOriginY,x=-y+p,b=-_+f;if(t.isCropped){var w=t._crop;w.flipX===t.flipX&&w.flipY===t.flipY||o.updateCropUVs(w,t.flipX,t.flipY),h=w.u0,u=w.v0,c=w.u1,d=w.v1,m=w.width,v=w.height,x=-y+(p=w.x),b=-_+(f=w.y)}var T=1,M=1;t.flipX&&(g||(x+=-o.realWidth+2*y),T=-1),(t.flipY||o.source.isGLTexture&&!a.flipY)&&(g||(b+=-o.realHeight+2*_),M=-1),r.applyITRS(t.x,t.y,t.rotation,t.scaleX*T,t.scaleY*M),n.copyFrom(e.matrix),i?(n.multiplyWithOffset(i,-e.scrollX*t.scrollFactorX,-e.scrollY*t.scrollFactorY),r.e=t.x,r.f=t.y,n.multiply(r,s)):(r.e-=e.scrollX*t.scrollFactorX,r.f-=e.scrollY*t.scrollFactorY,n.multiply(r,s));var S=x+m,E=b+v,L=s.getX(x,b),A=s.getY(x,b),D=s.getX(x,E),P=s.getY(x,E),C=s.getX(S,E),O=s.getY(S,E),k=s.getX(S,b),R=s.getY(S,b),I=l.getTintAppendFloatAlpha(t._tintTL,e.alpha*t._alphaTL),Y=l.getTintAppendFloatAlpha(t._tintTR,e.alpha*t._alphaTR),F=l.getTintAppendFloatAlpha(t._tintBL,e.alpha*t._alphaBL),N=l.getTintAppendFloatAlpha(t._tintBR,e.alpha*t._alphaBR);e.roundPixels&&(L=Math.round(L),A=Math.round(A),D=Math.round(D),P=Math.round(P),C=Math.round(C),O=Math.round(O),k=Math.round(k),R=Math.round(R)),this.setTexture2D(a,0);var B=t._isTinted&&t.tintFill;this.batchQuad(L,A,D,P,C,O,k,R,h,u,c,d,I,Y,F,N,B,a,0)},batchQuad:function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f,m,v,g,y){var _=!1;this.vertexCount+6>this.vertexCapacity&&(this.flush(),_=!0,this.setTexture2D(g,y));var x=this.vertexViewF32,b=this.vertexViewU32,w=this.vertexCount*this.vertexComponentCount-1;return x[++w]=t,x[++w]=e,x[++w]=h,x[++w]=u,x[++w]=v,b[++w]=d,x[++w]=i,x[++w]=n,x[++w]=h,x[++w]=c,x[++w]=v,b[++w]=f,x[++w]=r,x[++w]=s,x[++w]=l,x[++w]=c,x[++w]=v,b[++w]=m,x[++w]=t,x[++w]=e,x[++w]=h,x[++w]=u,x[++w]=v,b[++w]=d,x[++w]=r,x[++w]=s,x[++w]=l,x[++w]=c,x[++w]=v,b[++w]=m,x[++w]=o,x[++w]=a,x[++w]=l,x[++w]=u,x[++w]=v,b[++w]=p,this.vertexCount+=6,_},batchTri:function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f,m){var v=!1;this.vertexCount+3>this.vertexCapacity&&(this.flush(),this.setTexture2D(f,m),v=!0);var g=this.vertexViewF32,y=this.vertexViewU32,_=this.vertexCount*this.vertexComponentCount-1;return g[++_]=t,g[++_]=e,g[++_]=o,g[++_]=a,g[++_]=p,y[++_]=l,g[++_]=i,g[++_]=n,g[++_]=o,g[++_]=u,g[++_]=p,y[++_]=c,g[++_]=r,g[++_]=s,g[++_]=h,g[++_]=u,g[++_]=p,y[++_]=d,this.vertexCount+=3,v},batchTexture:function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f,m,v,g,y,_,x,b,w,T,M,S,E,L,A,D,P){this.renderer.setPipeline(this,t);var C=this._tempMatrix1,O=this._tempMatrix2,k=this._tempMatrix3,R=g/i+E,I=y/n+L,Y=(g+_)/i+E,F=(y+x)/n+L,N=o,B=a,U=-m,j=-v;if(t.isCropped){var H=t._crop;N=H.width,B=H.height,o=H.width,a=H.height;var z=g=H.x,W=y=H.y;c&&(z=_-H.x-H.width),d&&!e.isRenderTexture&&(W=x-H.y-H.height),R=z/i+E,I=W/n+L,Y=(z+H.width)/i+E,F=(W+H.height)/n+L,U=-m+g,j=-v+y}c&&(N*=-1,U+=o),(d^=!P&&e.isRenderTexture?1:0)&&(B*=-1,j+=a);var G=U+N,V=j+B;O.applyITRS(r,s,l,h,u),C.copyFrom(A.matrix),D?(C.multiplyWithOffset(D,-A.scrollX*p,-A.scrollY*f),O.e=r,O.f=s,C.multiply(O,k)):(O.e-=A.scrollX*p,O.f-=A.scrollY*f,C.multiply(O,k));var X=k.getX(U,j),q=k.getY(U,j),J=k.getX(U,V),Z=k.getY(U,V),K=k.getX(G,V),Q=k.getY(G,V),$=k.getX(G,j),tt=k.getY(G,j);A.roundPixels&&(X=Math.round(X),q=Math.round(q),J=Math.round(J),Z=Math.round(Z),K=Math.round(K),Q=Math.round(Q),$=Math.round($),tt=Math.round(tt)),this.setTexture2D(e,0),this.batchQuad(X,q,J,Z,K,Q,$,tt,R,I,Y,F,b,w,T,M,S,e,0)},batchTextureFrame:function(t,e,i,n,r,s,o){this.renderer.setPipeline(this);var a=this._tempMatrix1.copyFrom(s),h=this._tempMatrix2,u=e+t.width,c=i+t.height;o?a.multiply(o,h):h=a;var d=h.getX(e,i),p=h.getY(e,i),f=h.getX(e,c),m=h.getY(e,c),v=h.getX(u,c),g=h.getY(u,c),y=h.getX(u,i),_=h.getY(u,i);this.setTexture2D(t.glTexture,0),n=l.getTintAppendFloatAlpha(n,r),this.batchQuad(d,p,f,m,v,g,y,_,t.u0,t.v0,t.u1,t.v1,n,n,n,n,0,t.glTexture,0)},drawFillRect:function(t,e,i,n,r,s){var o=t+i,a=e+n;this.setTexture2D();var h=l.getTintAppendFloatAlphaAndSwap(r,s);this.batchQuad(t,e,t,a,o,a,o,e,0,0,1,1,h,h,h,h,2)},batchFillRect:function(t,e,i,n,r,s){this.renderer.setPipeline(this);var o=this._tempMatrix3;s&&s.multiply(r,o);var a=t+i,h=e+n,u=o.getX(t,e),l=o.getY(t,e),c=o.getX(t,h),d=o.getY(t,h),p=o.getX(a,h),f=o.getY(a,h),m=o.getX(a,e),v=o.getY(a,e),g=this.currentFrame,y=g.u0,_=g.v0,x=g.u1,b=g.v1;this.batchQuad(u,l,c,d,p,f,m,v,y,_,x,b,this.fillTint.TL,this.fillTint.TR,this.fillTint.BL,this.fillTint.BR,this.tintEffect)},batchFillTriangle:function(t,e,i,n,r,s,o,a){this.renderer.setPipeline(this);var h=this._tempMatrix3;a&&a.multiply(o,h);var u=h.getX(t,e),l=h.getY(t,e),c=h.getX(i,n),d=h.getY(i,n),p=h.getX(r,s),f=h.getY(r,s),m=this.currentFrame,v=m.u0,g=m.v0,y=m.u1,_=m.v1;this.batchTri(u,l,c,d,p,f,v,g,y,_,this.fillTint.TL,this.fillTint.TR,this.fillTint.BL,this.tintEffect)},batchStrokeTriangle:function(t,e,i,n,r,s,o,a,h){var u=this.tempTriangle;u[0].x=t,u[0].y=e,u[0].width=o,u[1].x=i,u[1].y=n,u[1].width=o,u[2].x=r,u[2].y=s,u[2].width=o,u[3].x=t,u[3].y=e,u[3].width=o,this.batchStrokePath(u,o,!1,a,h)},batchFillPath:function(t,e,i){this.renderer.setPipeline(this);var n=this._tempMatrix3;i&&i.multiply(e,n);for(var s,o,a=t.length,h=this.polygonCache,u=this.fillTint.TL,l=this.fillTint.TR,c=this.fillTint.BL,d=this.tintEffect,p=0;p<a;++p)o=t[p],h.push(o.x,o.y);a=(s=r(h)).length;for(var f=this.currentFrame,m=0;m<a;m+=3){var v=2*s[m+0],g=2*s[m+1],y=2*s[m+2],_=h[v+0],x=h[v+1],b=h[g+0],w=h[g+1],T=h[y+0],M=h[y+1],S=n.getX(_,x),E=n.getY(_,x),L=n.getX(b,w),A=n.getY(b,w),D=n.getX(T,M),P=n.getY(T,M),C=f.u0,O=f.v0,k=f.u1,R=f.v1;this.batchTri(S,E,L,A,D,P,C,O,k,R,u,l,c,d)}h.length=0},batchStrokePath:function(t,e,i,n,r){this.renderer.setPipeline(this),this.prevQuad[4]=0,this.firstQuad[4]=0;for(var s=t.length-1,o=0;o<s;o++){var a=t[o],h=t[o+1];this.batchLine(a.x,a.y,h.x,h.y,a.width/2,h.width/2,e,o,!i&&o===s-1,n,r)}},batchLine:function(t,e,i,n,r,s,o,a,h,u,l){this.renderer.setPipeline(this);var c=this._tempMatrix3;l&&l.multiply(u,c);var d=i-t,p=n-e,f=Math.sqrt(d*d+p*p),m=r*(n-e)/f,v=r*(t-i)/f,g=s*(n-e)/f,y=s*(t-i)/f,_=i-g,x=n-y,b=t-m,w=e-v,T=i+g,M=n+y,S=t+m,E=e+v,L=c.getX(_,x),A=c.getY(_,x),D=c.getX(b,w),P=c.getY(b,w),C=c.getX(T,M),O=c.getY(T,M),k=c.getX(S,E),R=c.getY(S,E),I=this.strokeTint,Y=this.tintEffect,F=I.TL,N=I.TR,B=I.BL,U=I.BR,j=this.currentFrame,H=j.u0,z=j.v0,W=j.u1,G=j.v1;if(this.batchQuad(k,R,D,P,L,A,C,O,H,z,W,G,F,N,B,U,Y),!(o<=2)){var V=this.prevQuad,X=this.firstQuad;a>0&&V[4]?this.batchQuad(k,R,D,P,V[0],V[1],V[2],V[3],H,z,W,G,F,N,B,U,Y):(X[0]=k,X[1]=R,X[2]=D,X[3]=P,X[4]=1),h&&X[4]?this.batchQuad(L,A,C,O,X[0],X[1],X[2],X[3],H,z,W,G,F,N,B,U,Y):(V[0]=L,V[1]=A,V[2]=C,V[3]=O,V[4]=1)}}});t.exports=d},14421:(t,e,i)=>{var n=i(47379),r=i(81769),s=i(77266),o=i(73914),a=i(29757),h=i(65492),u=i(69241),l=new n({Extends:u,Mixins:[s],initialize:function(t){var e=t.renderer.config;u.call(this,{game:t.game,renderer:t.renderer,gl:t.renderer.gl,topology:t.renderer.gl.TRIANGLE_STRIP,vertShader:r(t,"vertShader",a),fragShader:r(t,"fragShader",o),vertexCapacity:r(t,"vertexCapacity",6*e.batchSize),vertexSize:r(t,"vertexSize",5*Float32Array.BYTES_PER_ELEMENT+4*Uint8Array.BYTES_PER_ELEMENT),attributes:[{name:"inPosition",size:2,type:t.renderer.gl.FLOAT,normalized:!1,offset:0},{name:"inTexCoord",size:2,type:t.renderer.gl.FLOAT,normalized:!1,offset:2*Float32Array.BYTES_PER_ELEMENT},{name:"inTintEffect",size:1,type:t.renderer.gl.FLOAT,normalized:!1,offset:4*Float32Array.BYTES_PER_ELEMENT},{name:"inTint",size:4,type:t.renderer.gl.UNSIGNED_BYTE,normalized:!0,offset:5*Float32Array.BYTES_PER_ELEMENT}]}),this.vertexViewF32=new Float32Array(this.vertexData),this.vertexViewU32=new Uint32Array(this.vertexData),this.maxQuads=e.batchSize,this.batches=[],this._tempMatrix1=new h,this._tempMatrix2=new h,this._tempMatrix3=new h,this.mvpInit()},onBind:function(){return u.prototype.onBind.call(this),this.mvpUpdate(),this},resize:function(t,e,i){return u.prototype.resize.call(this,t,e,i),this.projOrtho(0,this.width,this.height,0,-1e3,1e3),this},setTexture2D:function(t,e){return void 0===t&&(t=this.renderer.blankTexture.glTexture),void 0===e&&(e=0),this.requireTextureBatch(t,e)&&this.pushBatch(t,e),this},requireTextureBatch:function(t,e){var i=this.batches,n=i.length;return!(n>0)||!((e>0?i[n-1].textures[e-1]:i[n-1].texture)===t)},pushBatch:function(t,e){if(0===e)this.batches.push({first:this.vertexCount,texture:t,textures:[]});else{var i=[];i[e-1]=t,this.batches.push({first:this.vertexCount,texture:null,textures:i})}},flush:function(){if(this.flushLocked)return this;this.flushLocked=!0;var t,e,i,n=this.gl,r=this.vertexCount,s=this.topology,o=this.vertexSize,a=this.renderer,h=this.batches,u=h.length,l=0,c=null;if(0===u||0===r)return this.flushLocked=!1,this;n.bufferSubData(n.ARRAY_BUFFER,0,this.bytes.subarray(0,r*o));for(var d=0;d<u-1;d++){if(c=h[d],t=h[d+1],c.textures.length>0){for(e=0;e<c.textures.length;++e)(i=c.textures[e])&&a.setTexture2D(i,1+e,!1);n.activeTexture(n.TEXTURE0)}l=t.first-c.first,null===c.texture||l<=0||(a.setTexture2D(c.texture,0,!1),n.drawArrays(s,c.first,l))}if((c=h[u-1]).textures.length>0){for(e=0;e<c.textures.length;++e)(i=c.textures[e])&&a.setTexture2D(i,1+e,!1);n.activeTexture(n.TEXTURE0)}return l=r-c.first,c.texture&&l>0&&(a.setTexture2D(c.texture,0,!1),n.drawArrays(s,c.first,l)),this.vertexCount=0,h.length=0,this.flushLocked=!1,this}});t.exports=l},77266:t=>{var e={modelMatrixDirty:!1,viewMatrixDirty:!1,projectionMatrixDirty:!1,modelMatrix:null,viewMatrix:null,projectionMatrix:null,mvpInit:function(){return this.modelMatrixDirty=!0,this.viewMatrixDirty=!0,this.projectionMatrixDirty=!0,this.modelMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.viewMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this.projectionMatrix=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),this},mvpUpdate:function(){var t=this.program;return this.modelMatrixDirty&&(this.renderer.setMatrix4(t,"uModelMatrix",!1,this.modelMatrix),this.modelMatrixDirty=!1),this.viewMatrixDirty&&(this.renderer.setMatrix4(t,"uViewMatrix",!1,this.viewMatrix),this.viewMatrixDirty=!1),this.projectionMatrixDirty&&(this.renderer.setMatrix4(t,"uProjectionMatrix",!1,this.projectionMatrix),this.projectionMatrixDirty=!1),this},modelIdentity:function(){var t=this.modelMatrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this.modelMatrixDirty=!0,this},modelScale:function(t,e,i){var n=this.modelMatrix;return n[0]=n[0]*t,n[1]=n[1]*t,n[2]=n[2]*t,n[3]=n[3]*t,n[4]=n[4]*e,n[5]=n[5]*e,n[6]=n[6]*e,n[7]=n[7]*e,n[8]=n[8]*i,n[9]=n[9]*i,n[10]=n[10]*i,n[11]=n[11]*i,this.modelMatrixDirty=!0,this},modelTranslate:function(t,e,i){var n=this.modelMatrix;return n[12]=n[0]*t+n[4]*e+n[8]*i+n[12],n[13]=n[1]*t+n[5]*e+n[9]*i+n[13],n[14]=n[2]*t+n[6]*e+n[10]*i+n[14],n[15]=n[3]*t+n[7]*e+n[11]*i+n[15],this.modelMatrixDirty=!0,this},modelRotateX:function(t){var e=this.modelMatrix,i=Math.sin(t),n=Math.cos(t),r=e[4],s=e[5],o=e[6],a=e[7],h=e[8],u=e[9],l=e[10],c=e[11];return e[4]=r*n+h*i,e[5]=s*n+u*i,e[6]=o*n+l*i,e[7]=a*n+c*i,e[8]=h*n-r*i,e[9]=u*n-s*i,e[10]=l*n-o*i,e[11]=c*n-a*i,this.modelMatrixDirty=!0,this},modelRotateY:function(t){var e=this.modelMatrix,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[8],u=e[9],l=e[10],c=e[11];return e[0]=r*n-h*i,e[1]=s*n-u*i,e[2]=o*n-l*i,e[3]=a*n-c*i,e[8]=r*i+h*n,e[9]=s*i+u*n,e[10]=o*i+l*n,e[11]=a*i+c*n,this.modelMatrixDirty=!0,this},modelRotateZ:function(t){var e=this.modelMatrix,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[4],u=e[5],l=e[6],c=e[7];return e[0]=r*n+h*i,e[1]=s*n+u*i,e[2]=o*n+l*i,e[3]=a*n+c*i,e[4]=h*n-r*i,e[5]=u*n-s*i,e[6]=l*n-o*i,e[7]=c*n-a*i,this.modelMatrixDirty=!0,this},viewIdentity:function(){var t=this.viewMatrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this.viewMatrixDirty=!0,this},viewScale:function(t,e,i){var n=this.viewMatrix;return n[0]=n[0]*t,n[1]=n[1]*t,n[2]=n[2]*t,n[3]=n[3]*t,n[4]=n[4]*e,n[5]=n[5]*e,n[6]=n[6]*e,n[7]=n[7]*e,n[8]=n[8]*i,n[9]=n[9]*i,n[10]=n[10]*i,n[11]=n[11]*i,this.viewMatrixDirty=!0,this},viewTranslate:function(t,e,i){var n=this.viewMatrix;return n[12]=n[0]*t+n[4]*e+n[8]*i+n[12],n[13]=n[1]*t+n[5]*e+n[9]*i+n[13],n[14]=n[2]*t+n[6]*e+n[10]*i+n[14],n[15]=n[3]*t+n[7]*e+n[11]*i+n[15],this.viewMatrixDirty=!0,this},viewRotateX:function(t){var e=this.viewMatrix,i=Math.sin(t),n=Math.cos(t),r=e[4],s=e[5],o=e[6],a=e[7],h=e[8],u=e[9],l=e[10],c=e[11];return e[4]=r*n+h*i,e[5]=s*n+u*i,e[6]=o*n+l*i,e[7]=a*n+c*i,e[8]=h*n-r*i,e[9]=u*n-s*i,e[10]=l*n-o*i,e[11]=c*n-a*i,this.viewMatrixDirty=!0,this},viewRotateY:function(t){var e=this.viewMatrix,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[8],u=e[9],l=e[10],c=e[11];return e[0]=r*n-h*i,e[1]=s*n-u*i,e[2]=o*n-l*i,e[3]=a*n-c*i,e[8]=r*i+h*n,e[9]=s*i+u*n,e[10]=o*i+l*n,e[11]=a*i+c*n,this.viewMatrixDirty=!0,this},viewRotateZ:function(t){var e=this.viewMatrix,i=Math.sin(t),n=Math.cos(t),r=e[0],s=e[1],o=e[2],a=e[3],h=e[4],u=e[5],l=e[6],c=e[7];return e[0]=r*n+h*i,e[1]=s*n+u*i,e[2]=o*n+l*i,e[3]=a*n+c*i,e[4]=h*n-r*i,e[5]=u*n-s*i,e[6]=l*n-o*i,e[7]=c*n-a*i,this.viewMatrixDirty=!0,this},viewLoad2D:function(t){var e=this.viewMatrix;return e[0]=t[0],e[1]=t[1],e[2]=0,e[3]=0,e[4]=t[2],e[5]=t[3],e[6]=0,e[7]=0,e[8]=t[4],e[9]=t[5],e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this.viewMatrixDirty=!0,this},viewLoad:function(t){var e=this.viewMatrix;return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],this.viewMatrixDirty=!0,this},projIdentity:function(){var t=this.projectionMatrix;return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this.projectionMatrixDirty=!0,this},projOrtho:function(t,e,i,n,r,s){var o=this.projectionMatrix,a=1/(t-e),h=1/(i-n),u=1/(r-s);return o[0]=-2*a,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=-2*h,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=2*u,o[11]=0,o[12]=(t+e)*a,o[13]=(n+i)*h,o[14]=(s+r)*u,o[15]=1,this.projectionMatrixDirty=!0,this},projPersp:function(t,e,i,n){var r=this.projectionMatrix,s=1/Math.tan(t/2),o=1/(i-n);return r[0]=s/e,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=s,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=(n+i)*o,r[11]=-1,r[12]=0,r[13]=0,r[14]=2*n*i*o,r[15]=0,this.projectionMatrixDirty=!0,this}};t.exports=e},60487:(t,e,i)=>{t.exports={BitmapMaskPipeline:i(51043),ForwardDiffuseLightPipeline:i(74612),TextureTintPipeline:i(38383),TextureTintStripPipeline:i(14421),ModelViewProjection:i(77266)}},10042:t=>{t.exports=["#define SHADER_NAME PHASER_BITMAP_MASK_FS","","precision mediump float;","","uniform vec2 uResolution;","uniform sampler2D uMainSampler;","uniform sampler2D uMaskSampler;","uniform bool uInvertMaskAlpha;","","void main()","{"," vec2 uv = gl_FragCoord.xy / uResolution;"," vec4 mainColor = texture2D(uMainSampler, uv);"," vec4 maskColor = texture2D(uMaskSampler, uv);"," float alpha = mainColor.a;",""," if (!uInvertMaskAlpha)"," {"," alpha *= (maskColor.a);"," }"," else"," {"," alpha *= (1.0 - maskColor.a);"," }",""," gl_FragColor = vec4(mainColor.rgb * alpha, alpha);","}",""].join("\n")},89781:t=>{t.exports=["#define SHADER_NAME PHASER_BITMAP_MASK_VS","","precision mediump float;","","attribute vec2 inPosition;","","void main()","{"," gl_Position = vec4(inPosition, 0.0, 1.0);","}",""].join("\n")},74934:t=>{t.exports=["#define SHADER_NAME PHASER_FORWARD_DIFFUSE_FS","","precision mediump float;","","struct Light","{"," vec2 position;"," vec3 color;"," float intensity;"," float radius;","};","","const int kMaxLights = %LIGHT_COUNT%;","","uniform vec4 uCamera; /* x, y, rotation, zoom */","uniform vec2 uResolution;","uniform sampler2D uMainSampler;","uniform sampler2D uNormSampler;","uniform vec3 uAmbientLightColor;","uniform Light uLights[kMaxLights];","uniform mat3 uInverseRotationMatrix;","","varying vec2 outTexCoord;","varying vec4 outTint;","","void main()","{"," vec3 finalColor = vec3(0.0, 0.0, 0.0);"," vec4 color = texture2D(uMainSampler, outTexCoord) * vec4(outTint.rgb * outTint.a, outTint.a);"," vec3 normalMap = texture2D(uNormSampler, outTexCoord).rgb;"," vec3 normal = normalize(uInverseRotationMatrix * vec3(normalMap * 2.0 - 1.0));"," vec2 res = vec2(min(uResolution.x, uResolution.y)) * uCamera.w;",""," for (int index = 0; index < kMaxLights; ++index)"," {"," Light light = uLights[index];"," vec3 lightDir = vec3((light.position.xy / res) - (gl_FragCoord.xy / res), 0.1);"," vec3 lightNormal = normalize(lightDir);"," float distToSurf = length(lightDir) * uCamera.w;"," float diffuseFactor = max(dot(normal, lightNormal), 0.0);"," float radius = (light.radius / res.x * uCamera.w) * uCamera.w;"," float attenuation = clamp(1.0 - distToSurf * distToSurf / (radius * radius), 0.0, 1.0);"," vec3 diffuse = light.color * diffuseFactor;"," finalColor += (attenuation * diffuse) * light.intensity;"," }",""," vec4 colorOutput = vec4(uAmbientLightColor + finalColor, 1.0);"," gl_FragColor = color * vec4(colorOutput.rgb * colorOutput.a, colorOutput.a);","","}",""].join("\n")},73914:t=>{t.exports=["#define SHADER_NAME PHASER_TEXTURE_TINT_FS","","precision mediump float;","","uniform sampler2D uMainSampler;","","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","","void main()","{"," vec4 texture = texture2D(uMainSampler, outTexCoord);"," vec4 texel = vec4(outTint.rgb * outTint.a, outTint.a);"," vec4 color = texture;",""," if (outTintEffect == 0.0)"," {"," // Multiply texture tint"," color = texture * texel;"," }"," else if (outTintEffect == 1.0)"," {"," // Solid color + texture alpha"," color.rgb = mix(texture.rgb, outTint.rgb * outTint.a, texture.a);"," color.a = texture.a * texel.a;"," }"," else if (outTintEffect == 2.0)"," {"," // Solid color, no texture"," color = texel;"," }",""," gl_FragColor = color;","}",""].join("\n")},29757:t=>{t.exports=["#define SHADER_NAME PHASER_TEXTURE_TINT_VS","","precision mediump float;","","uniform mat4 uProjectionMatrix;","uniform mat4 uViewMatrix;","uniform mat4 uModelMatrix;","","attribute vec2 inPosition;","attribute vec2 inTexCoord;","attribute float inTintEffect;","attribute vec4 inTint;","","varying vec2 outTexCoord;","varying float outTintEffect;","varying vec4 outTint;","","void main ()","{"," gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * vec4(inPosition, 1.0, 1.0);",""," outTexCoord = inTexCoord;"," outTint = inTint;"," outTintEffect = inTintEffect;","}","",""].join("\n")},92499:(t,e,i)=>{var n=i(67467),r=i(47379),s=i(17168),o=i(66144),a=i(80827),h=i(6056),u=i(74537),l=i(16070),c=i(49035),d=i(38092),p=i(4977),f=i(88168),m=i(57148),v=new r({Extends:s,initialize:function(t){s.call(this),this.game=t,this.canvas,this.canvasBounds=new d,this.parent=null,this.parentIsWindow=!1,this.parentSize=new p,this.gameSize=new p,this.baseSize=new p,this.displaySize=new p,this.scaleMode=n.SCALE_MODE.NONE,this.resolution=1,this.zoom=1,this._resetZoom=!1,this.displayScale=new m(1,1),this.autoRound=!1,this.autoCenter=n.CENTER.NO_CENTER,this.orientation=n.ORIENTATION.LANDSCAPE,this.fullscreen,this.fullscreenTarget=null,this._createdFullscreenTarget=!1,this.dirty=!1,this.resizeInterval=500,this._lastCheck=0,this._checkOrientation=!1,this.listeners={orientationChange:c,windowResize:c,fullScreenChange:c,fullScreenError:c}},preBoot:function(){this.parseConfig(this.game.config),this.game.events.once("boot",this.boot,this)},boot:function(){var t=this.game;this.canvas=t.canvas,this.fullscreen=t.device.fullscreen,this.scaleMode!==n.SCALE_MODE.RESIZE&&this.displaySize.setAspectMode(this.scaleMode),this.scaleMode===n.SCALE_MODE.NONE?this.resize(this.width,this.height):(this.getParentBounds(),this.parentSize.width>0&&this.parentSize.height>0&&this.displaySize.setParent(this.parentSize),this.refresh()),t.events.on(a.PRE_STEP,this.step,this),t.events.once(a.DESTROY,this.destroy,this),this.startListeners()},parseConfig:function(t){this.getParent(t),this.getParentBounds();var e=t.width,i=t.height,r=t.scaleMode,s=t.resolution,o=t.zoom,a=t.autoRound;if("string"==typeof e){var h=this.parentSize.width;0===h&&(h=window.innerWidth);var u=parseInt(e,10)/100;e=Math.floor(h*u)}if("string"==typeof i){var c=this.parentSize.height;0===c&&(c=window.innerHeight);var d=parseInt(i,10)/100;i=Math.floor(c*d)}this.resolution=1,this.scaleMode=r,this.autoRound=a,this.autoCenter=t.autoCenter,this.resizeInterval=t.resizeInterval,a&&(e=Math.floor(e),i=Math.floor(i)),this.gameSize.setSize(e,i),o===n.ZOOM.MAX_ZOOM&&(o=this.getMaxZoom()),this.zoom=o,1!==o&&(this._resetZoom=!0),this.baseSize.setSize(e*s,i*s),a&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),t.minWidth>0&&this.displaySize.setMin(t.minWidth*o,t.minHeight*o),t.maxWidth>0&&this.displaySize.setMax(t.maxWidth*o,t.maxHeight*o),this.displaySize.setSize(e,i),this.orientation=l(e,i)},getParent:function(t){var e=t.parent;if(null!==e){if(this.parent=u(e),this.parentIsWindow=this.parent===document.body,t.expandParent&&t.scaleMode!==n.SCALE_MODE.NONE){var i=this.parent.getBoundingClientRect();(this.parentIsWindow||0===i.height)&&(document.documentElement.style.height="100%",document.body.style.height="100%",i=this.parent.getBoundingClientRect(),this.parentIsWindow||0!==i.height||(this.parent.style.overflow="hidden",this.parent.style.width="100%",this.parent.style.height="100%"))}t.fullscreenTarget&&!this.fullscreenTarget&&(this.fullscreenTarget=u(t.fullscreenTarget))}},getParentBounds:function(){if(!this.parent)return!1;var t=this.parentSize,e=this.parent.getBoundingClientRect();this.parentIsWindow&&this.game.device.os.iOS&&(e.height=h(!0));var i=this.resolution,n=e.width*i,r=e.height*i;return(t.width!==n||t.height!==r)&&(t.setSize(n,r),!0)},lockOrientation:function(t){var e=screen.lockOrientation||screen.mozLockOrientation||screen.msLockOrientation;return!!e&&e.call(screen,t)},setParentSize:function(t,e){return this.parentSize.setSize(t,e),this.refresh()},setGameSize:function(t,e){var i=this.autoRound,n=this.resolution;i&&(t=Math.floor(t),e=Math.floor(e));var r=this.width,s=this.height;return this.gameSize.resize(t,e),this.baseSize.resize(t*n,e*n),i&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),this.displaySize.setAspectRatio(t/e),this.canvas.width=this.baseSize.width,this.canvas.height=this.baseSize.height,this.refresh(r,s)},resize:function(t,e){var i=this.zoom,n=this.resolution,r=this.autoRound;r&&(t=Math.floor(t),e=Math.floor(e));var s=this.width,o=this.height;this.gameSize.resize(t,e),this.baseSize.resize(t*n,e*n),r&&(this.baseSize.width=Math.floor(this.baseSize.width),this.baseSize.height=Math.floor(this.baseSize.height)),this.displaySize.setSize(t*i*n,e*i*n),this.canvas.width=this.baseSize.width,this.canvas.height=this.baseSize.height;var a=this.canvas.style,h=t*i,u=e*i;return r&&(h=Math.floor(h),u=Math.floor(u)),h===t&&u===e||(a.width=h+"px",a.height=u+"px"),this.refresh(s,o)},setZoom:function(t){return this.zoom=t,this._resetZoom=!0,this.refresh()},setMaxZoom:function(){return this.zoom=this.getMaxZoom(),this._resetZoom=!0,this.refresh()},refresh:function(t,e){void 0===t&&(t=this.width),void 0===e&&(e=this.height),this.updateScale(),this.updateBounds(),this.updateOrientation(),this.displayScale.set(this.baseSize.width/this.canvasBounds.width,this.baseSize.height/this.canvasBounds.height);var i=this.game.domContainer;if(i){this.baseSize.setCSS(i);var n=this.canvas.style,r=i.style;r.transform="scale("+this.displaySize.width/this.baseSize.width+","+this.displaySize.height/this.baseSize.height+")",r.marginLeft=n.marginLeft,r.marginTop=n.marginTop}return this.emit(o.RESIZE,this.gameSize,this.baseSize,this.displaySize,this.resolution,t,e),this},updateOrientation:function(){if(this._checkOrientation){this._checkOrientation=!1;var t=l(this.width,this.height);t!==this.orientation&&(this.orientation=t,this.emit(o.ORIENTATION_CHANGE,t))}},updateScale:function(){var t,e,i=this.canvas.style,r=this.gameSize.width,s=this.gameSize.height,o=this.zoom,a=this.autoRound;this.scaleMode===n.SCALE_MODE.NONE?(this.displaySize.setSize(r*o*1,s*o*1),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),this._resetZoom&&(i.width=t+"px",i.height=e+"px",this._resetZoom=!1)):this.scaleMode===n.SCALE_MODE.RESIZE?(this.displaySize.setSize(this.parentSize.width,this.parentSize.height),this.gameSize.setSize(this.displaySize.width,this.displaySize.height),this.baseSize.setSize(1*this.displaySize.width,1*this.displaySize.height),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),this.canvas.width=t,this.canvas.height=e):(this.displaySize.setSize(this.parentSize.width,this.parentSize.height),t=this.displaySize.width/1,e=this.displaySize.height/1,a&&(t=Math.floor(t),e=Math.floor(e)),i.width=t+"px",i.height=e+"px"),this.getParentBounds(),this.updateCenter()},getMaxZoom:function(){var t=f(this.parentSize.width,this.gameSize.width,0,!0),e=f(this.parentSize.height,this.gameSize.height,0,!0);return Math.max(Math.min(t,e),1)},updateCenter:function(){var t=this.autoCenter;if(t!==n.CENTER.NO_CENTER){var e=this.canvas,i=e.style,r=e.getBoundingClientRect(),s=r.width,o=r.height,a=Math.floor((this.parentSize.width-s)/2),h=Math.floor((this.parentSize.height-o)/2);t===n.CENTER.CENTER_HORIZONTALLY?h=0:t===n.CENTER.CENTER_VERTICALLY&&(a=0),i.marginLeft=a+"px",i.marginTop=h+"px"}},updateBounds:function(){var t=this.canvasBounds,e=this.canvas.getBoundingClientRect();t.x=e.left+(window.pageXOffset||0)-(document.documentElement.clientLeft||0),t.y=e.top+(window.pageYOffset||0)-(document.documentElement.clientTop||0),t.width=e.width,t.height=e.height},transformX:function(t){return(t-this.canvasBounds.left)*this.displayScale.x},transformY:function(t){return(t-this.canvasBounds.top)*this.displayScale.y},startFullscreen:function(t){void 0===t&&(t={navigationUI:"hide"});var e=this.fullscreen;if(e.available){if(!e.active){var i,n=this.getFullscreenTarget();(i=e.keyboard?n[e.request](Element.ALLOW_KEYBOARD_INPUT):n[e.request](t))?i.then(this.fullscreenSuccessHandler.bind(this)).catch(this.fullscreenErrorHandler.bind(this)):e.active?this.fullscreenSuccessHandler():this.fullscreenErrorHandler()}}else this.emit(o.FULLSCREEN_UNSUPPORTED)},fullscreenSuccessHandler:function(){this.getParentBounds(),this.refresh(),this.emit(o.ENTER_FULLSCREEN)},fullscreenErrorHandler:function(t){this.removeFullscreenTarget(),this.emit(o.FULLSCREEN_FAILED,t)},getFullscreenTarget:function(){if(!this.fullscreenTarget){var t=document.createElement("div");t.style.margin="0",t.style.padding="0",t.style.width="100%",t.style.height="100%",this.fullscreenTarget=t,this._createdFullscreenTarget=!0}this._createdFullscreenTarget&&(this.canvas.parentNode.insertBefore(this.fullscreenTarget,this.canvas),this.fullscreenTarget.appendChild(this.canvas));return this.fullscreenTarget},removeFullscreenTarget:function(){if(this._createdFullscreenTarget){var t=this.fullscreenTarget;if(t&&t.parentNode){var e=t.parentNode;e.insertBefore(this.canvas,t),e.removeChild(t)}}},stopFullscreen:function(){var t=this.fullscreen;if(!t.available)return this.emit(o.FULLSCREEN_UNSUPPORTED),!1;t.active&&document[t.cancel](),this.removeFullscreenTarget(),this.getParentBounds(),this.emit(o.LEAVE_FULLSCREEN),this.refresh()},toggleFullscreen:function(t){this.fullscreen.active?this.stopFullscreen():this.startFullscreen(t)},startListeners:function(){var t=this,e=this.listeners;if(e.orientationChange=function(){t._checkOrientation=!0,t.dirty=!0},e.windowResize=function(){t.dirty=!0},window.addEventListener("orientationchange",e.orientationChange,!1),window.addEventListener("resize",e.windowResize,!1),this.fullscreen.available){e.fullScreenChange=function(e){return t.onFullScreenChange(e)},e.fullScreenError=function(e){return t.onFullScreenError(e)};["webkit","moz",""].forEach((function(t){document.addEventListener(t+"fullscreenchange",e.fullScreenChange,!1),document.addEventListener(t+"fullscreenerror",e.fullScreenError,!1)})),document.addEventListener("MSFullscreenChange",e.fullScreenChange,!1),document.addEventListener("MSFullscreenError",e.fullScreenError,!1)}},onFullScreenChange:function(){document.fullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement||document.mozFullScreenElement||this.stopFullscreen()},onFullScreenError:function(){this.removeFullscreenTarget()},step:function(t,e){this.parent&&(this._lastCheck+=e,(this.dirty||this._lastCheck>this.resizeInterval)&&(this.getParentBounds()&&this.refresh(),this.dirty=!1,this._lastCheck=0))},stopListeners:function(){var t=this.listeners;window.removeEventListener("orientationchange",t.orientationChange,!1),window.removeEventListener("resize",t.windowResize,!1);["webkit","moz",""].forEach((function(e){document.removeEventListener(e+"fullscreenchange",t.fullScreenChange,!1),document.removeEventListener(e+"fullscreenerror",t.fullScreenError,!1)})),document.removeEventListener("MSFullscreenChange",t.fullScreenChange,!1),document.removeEventListener("MSFullscreenError",t.fullScreenError,!1)},destroy:function(){this.removeAllListeners(),this.stopListeners(),this.game=null,this.canvas=null,this.canvasBounds=null,this.parent=null,this.fullscreenTarget=null,this.parentSize.destroy(),this.gameSize.destroy(),this.baseSize.destroy(),this.displaySize.destroy()},isFullscreen:{get:function(){return this.fullscreen.active}},width:{get:function(){return this.gameSize.width}},height:{get:function(){return this.gameSize.height}},isPortrait:{get:function(){return this.orientation===n.ORIENTATION.PORTRAIT}},isLandscape:{get:function(){return this.orientation===n.ORIENTATION.LANDSCAPE}},isGamePortrait:{get:function(){return this.height>this.width}},isGameLandscape:{get:function(){return this.width>this.height}}});t.exports=v},57345:t=>{t.exports={NO_CENTER:0,CENTER_BOTH:1,CENTER_HORIZONTALLY:2,CENTER_VERTICALLY:3}},7880:t=>{t.exports={LANDSCAPE:"landscape-primary",PORTRAIT:"portrait-primary"}},95829:t=>{t.exports={NONE:0,WIDTH_CONTROLS_HEIGHT:1,HEIGHT_CONTROLS_WIDTH:2,FIT:3,ENVELOP:4,RESIZE:5}},38518:t=>{t.exports={NO_ZOOM:1,ZOOM_2X:2,ZOOM_4X:4,MAX_ZOOM:-1}},67467:(t,e,i)=>{var n={CENTER:i(57345),ORIENTATION:i(7880),SCALE_MODE:i(95829),ZOOM:i(38518)};t.exports=n},89493:t=>{t.exports="enterfullscreen"},80170:t=>{t.exports="fullscreenfailed"},12420:t=>{t.exports="fullscreenunsupported"},58550:t=>{t.exports="leavefullscreen"},36089:t=>{t.exports="orientationchange"},231:t=>{t.exports="resize"},66144:(t,e,i)=>{t.exports={ENTER_FULLSCREEN:i(89493),FULLSCREEN_FAILED:i(80170),FULLSCREEN_UNSUPPORTED:i(12420),LEAVE_FULLSCREEN:i(58550),ORIENTATION_CHANGE:i(36089),RESIZE:i(231)}},45192:(t,e,i)=>{var n=i(80933),r=i(67467),s={Center:i(57345),Events:i(66144),Orientation:i(7880),ScaleManager:i(92499),ScaleModes:i(95829),Zoom:i(38518)};s=n(!1,s,r.CENTER),s=n(!1,s,r.ORIENTATION),s=n(!1,s,r.SCALE_MODE),s=n(!1,s,r.ZOOM),t.exports=s},14863:(t,e,i)=>{var n=i(81769),r=i(93225);t.exports=function(t){var e=t.game.config.defaultPhysicsSystem,i=n(t.settings,"physics",!1);if(e||i){var s=[];if(e&&s.push(r(e+"Physics")),i)for(var o in i)o=r(o.concat("Physics")),-1===s.indexOf(o)&&s.push(o);return s}}},55576:(t,e,i)=>{var n=i(81769);t.exports=function(t){var e=t.plugins.getDefaultScenePlugins(),i=n(t.settings,"plugins",!1);return Array.isArray(i)?i:e||[]}},57711:t=>{var e={game:"game",anims:"anims",cache:"cache",plugins:"plugins",registry:"registry",scale:"scale",sound:"sound",textures:"textures",events:"events",cameras:"cameras",add:"add",make:"make",scenePlugin:"scene",displayList:"children",lights:"lights",data:"data",input:"input",load:"load",time:"time",tweens:"tweens",arcadePhysics:"physics",impactPhysics:"impact",matterPhysics:"matter",cameras3d:"cameras3d",facebook:"facebook"};t.exports=e},5155:(t,e,i)=>{var n=i(47379),r=i(81466),s=new n({initialize:function(t){this.sys=new r(this,t),this.game,this.anims,this.cache,this.registry,this.sound,this.textures,this.events,this.cameras,this.add,this.make,this.scene,this.children,this.lights,this.data,this.input,this.load,this.time,this.tweens,this.physics,this.matter,this.facebook,this.scale,this.plugins},update:function(){}});t.exports=s},73091:(t,e,i)=>{var n=i(47379),r=i(73913),s=i(88637),o=i(80827),a=i(86652),h=i(88275),u=i(49035),l=i(5155),c=i(81466),d=new n({initialize:function(t,e){if(this.game=t,this.keys={},this.scenes=[],this._pending=[],this._start=[],this._queue=[],this._data={},this.isProcessing=!1,this.isBooted=!1,this.customViewports=0,e){Array.isArray(e)||(e=[e]);for(var i=0;i<e.length;i++)this._pending.push({key:"default",scene:e[i],autoStart:0===i,data:{}})}t.events.once(o.READY,this.bootQueue,this)},bootQueue:function(){if(!this.isBooted){var t,e,i,n;for(t=0;t<this._pending.length;t++){var r;i=(e=this._pending[t]).key,(n=e.scene)instanceof l?r=this.createSceneFromInstance(i,n):"object"==typeof n?r=this.createSceneFromObject(i,n):"function"==typeof n&&(r=this.createSceneFromFunction(i,n)),i=r.sys.settings.key,this.keys[i]=r,this.scenes.push(r),this._data[i]&&(r.sys.settings.data=this._data[i].data,this._data[i].autoStart&&(e.autoStart=!0)),(e.autoStart||r.sys.settings.active)&&this._start.push(i)}for(this._pending.length=0,this._data={},this.isBooted=!0,t=0;t<this._start.length;t++)e=this._start[t],this.start(e);this._start.length=0}},processQueue:function(){var t=this._pending.length,e=this._queue.length;if(0!==t||0!==e){var i,n;if(t){for(i=0;i<t;i++)n=this._pending[i],this.add(n.key,n.scene,n.autoStart,n.data);for(i=0;i<this._start.length;i++)n=this._start[i],this.start(n);return this._start.length=0,void(this._pending.length=0)}for(i=0;i<this._queue.length;i++)this[(n=this._queue[i]).op](n.keyA,n.keyB);this._queue.length=0}},add:function(t,e,i,n){return void 0===i&&(i=!1),void 0===n&&(n={}),this.isProcessing||!this.isBooted?(this._pending.push({key:t,scene:e,autoStart:i,data:n}),this.isBooted||(this._data[t]={data:n}),null):(t=this.getKey(t,e),e instanceof l?r=this.createSceneFromInstance(t,e):"object"==typeof e?(e.key=t,r=this.createSceneFromObject(t,e)):"function"==typeof e&&(r=this.createSceneFromFunction(t,e)),r.sys.settings.data=n,t=r.sys.settings.key,this.keys[t]=r,this.scenes.push(r),(i||r.sys.settings.active)&&(this._pending.length?this._start.push(t):this.start(t)),r);var r},remove:function(t){if(this.isProcessing)this._queue.push({op:"remove",keyA:t,keyB:null});else{var e=this.getScene(t);if(!e||e.sys.isTransitioning())return this;var i=this.scenes.indexOf(e),n=e.sys.settings.key;i>-1&&(delete this.keys[n],this.scenes.splice(i,1),this._start.indexOf(n)>-1&&(i=this._start.indexOf(n),this._start.splice(i,1)),e.sys.destroy())}return this},bootScene:function(t){var e,i=t.sys,n=i.settings;i.sceneUpdate=u,t.init&&(t.init.call(t,n.data),n.status=r.INIT,n.isTransition&&i.events.emit(s.TRANSITION_INIT,n.transitionFrom,n.transitionDuration)),i.load&&(e=i.load).reset(),e&&t.preload?(t.preload.call(t),0===e.list.size?this.create(t):(n.status=r.LOADING,e.once(h.COMPLETE,this.loadComplete,this),e.start())):this.create(t)},loadComplete:function(t){var e=t.scene;this.game.sound&&this.game.sound.onBlurPausedSounds&&this.game.sound.unlock(),this.create(e)},payloadComplete:function(t){this.bootScene(t.scene)},update:function(t,e){this.processQueue(),this.isProcessing=!0;for(var i=this.scenes.length-1;i>=0;i--){var n=this.scenes[i].sys;n.settings.status>r.START&&n.settings.status<=r.RUNNING&&n.step(t,e)}},render:function(t){for(var e=0;e<this.scenes.length;e++){var i=this.scenes[e].sys;i.settings.visible&&i.settings.status>=r.LOADING&&i.settings.status<r.SLEEPING&&i.render(t)}this.isProcessing=!1},create:function(t){var e=t.sys,i=e.settings;t.create&&(i.status=r.CREATING,t.create.call(t,i.data),i.status===r.DESTROYED)||(i.isTransition&&e.events.emit(s.TRANSITION_START,i.transitionFrom,i.transitionDuration),t.update&&(e.sceneUpdate=t.update),i.status=r.RUNNING,e.events.emit(s.CREATE,t))},createSceneFromFunction:function(t,e){var i=new e;if(i instanceof l){var n=i.sys.settings.key;if(""!==n&&(t=n),this.keys.hasOwnProperty(t))throw new Error("Cannot add a Scene with duplicate key: "+t);return this.createSceneFromInstance(t,i)}return i.sys=new c(i),i.sys.settings.key=t,i.sys.init(this.game),i},createSceneFromInstance:function(t,e){var i=e.sys.settings.key;return""!==i?t=i:e.sys.settings.key=t,e.sys.init(this.game),e},createSceneFromObject:function(t,e){var i=new l(e),n=i.sys.settings.key;""!==n?t=n:i.sys.settings.key=t,i.sys.init(this.game);for(var r=["init","preload","create","update","render"],s=0;s<r.length;s++){var o=a(e,r[s],null);o&&(i[r[s]]=o)}if(e.hasOwnProperty("extend"))for(var h in e.extend)if(e.extend.hasOwnProperty(h)){var u=e.extend[h];"data"===h&&i.hasOwnProperty("data")&&"object"==typeof u?i.data.merge(u):"sys"!==h&&(i[h]=u)}return i},getKey:function(t,e){if(t||(t="default"),"function"==typeof e)return t;if(e instanceof l?t=e.sys.settings.key:"object"==typeof e&&e.hasOwnProperty("key")&&(t=e.key),this.keys.hasOwnProperty(t))throw new Error("Cannot add a Scene with duplicate key: "+t);return t},getScenes:function(t,e){void 0===t&&(t=!0),void 0===e&&(e=!1);for(var i=[],n=this.scenes,r=0;r<n.length;r++){var s=n[r];s&&(!t||t&&s.sys.isActive())&&i.push(s)}return e?i.reverse():i},getScene:function(t){if("string"==typeof t){if(this.keys[t])return this.keys[t]}else for(var e=0;e<this.scenes.length;e++)if(t===this.scenes[e])return t;return null},isActive:function(t){var e=this.getScene(t);return e?e.sys.isActive():null},isPaused:function(t){var e=this.getScene(t);return e?e.sys.isPaused():null},isVisible:function(t){var e=this.getScene(t);return e?e.sys.isVisible():null},isSleeping:function(t){var e=this.getScene(t);return e?e.sys.isSleeping():null},pause:function(t,e){var i=this.getScene(t);return i&&i.sys.pause(e),this},resume:function(t,e){var i=this.getScene(t);return i&&i.sys.resume(e),this},sleep:function(t,e){var i=this.getScene(t);return i&&!i.sys.isTransitioning()&&i.sys.sleep(e),this},wake:function(t,e){var i=this.getScene(t);return i&&i.sys.wake(e),this},run:function(t,e){var i=this.getScene(t);if(!i){for(var n=0;n<this._pending.length;n++)if(this._pending[n].key===t){this.queueOp("start",t,e);break}return this}i.sys.isSleeping()?i.sys.wake(e):i.sys.isPaused()?i.sys.resume(e):this.start(t,e)},start:function(t,e){if(!this.isBooted)return this._data[t]={autoStart:!0,data:e},this;var i=this.getScene(t);if(i){var n;if(i.sys.isActive()||i.sys.isPaused())i.sys.shutdown(),i.sys.start(e);else if(i.sys.start(e),i.sys.load&&(n=i.sys.load),n&&i.sys.settings.hasOwnProperty("pack")&&(n.reset(),n.addPack({payload:i.sys.settings.pack})))return i.sys.settings.status=r.LOADING,n.once(h.COMPLETE,this.payloadComplete,this),n.start(),this;this.bootScene(i)}return this},stop:function(t,e){var i=this.getScene(t);return i&&!i.sys.isTransitioning()&&i.sys.shutdown(e),this},switch:function(t,e){var i=this.getScene(t),n=this.getScene(e);return i&&n&&i!==n&&(this.sleep(t),this.isSleeping(e)?this.wake(e):this.start(e)),this},getAt:function(t){return this.scenes[t]},getIndex:function(t){var e=this.getScene(t);return this.scenes.indexOf(e)},bringToTop:function(t){if(this.isProcessing)this._queue.push({op:"bringToTop",keyA:t,keyB:null});else{var e=this.getIndex(t);if(-1!==e&&e<this.scenes.length){var i=this.getScene(t);this.scenes.splice(e,1),this.scenes.push(i)}}return this},sendToBack:function(t){if(this.isProcessing)this._queue.push({op:"sendToBack",keyA:t,keyB:null});else{var e=this.getIndex(t);if(-1!==e&&e>0){var i=this.getScene(t);this.scenes.splice(e,1),this.scenes.unshift(i)}}return this},moveDown:function(t){if(this.isProcessing)this._queue.push({op:"moveDown",keyA:t,keyB:null});else{var e=this.getIndex(t);if(e>0){var i=e-1,n=this.getScene(t),r=this.getAt(i);this.scenes[e]=r,this.scenes[i]=n}}return this},moveUp:function(t){if(this.isProcessing)this._queue.push({op:"moveUp",keyA:t,keyB:null});else{var e=this.getIndex(t);if(e<this.scenes.length-1){var i=e+1,n=this.getScene(t),r=this.getAt(i);this.scenes[e]=r,this.scenes[i]=n}}return this},moveAbove:function(t,e){if(t===e)return this;if(this.isProcessing)this._queue.push({op:"moveAbove",keyA:t,keyB:e});else{var i=this.getIndex(t),n=this.getIndex(e);if(-1!==i&&-1!==n){var r=this.getAt(n);this.scenes.splice(n,1),this.scenes.splice(i+1,0,r)}}return this},moveBelow:function(t,e){if(t===e)return this;if(this.isProcessing)this._queue.push({op:"moveBelow",keyA:t,keyB:e});else{var i=this.getIndex(t),n=this.getIndex(e);if(-1!==i&&-1!==n){var r=this.getAt(n);this.scenes.splice(n,1),0===i?this.scenes.unshift(r):this.scenes.splice(i,0,r)}}return this},queueOp:function(t,e,i){return this._queue.push({op:t,keyA:e,keyB:i}),this},swapPosition:function(t,e){if(t===e)return this;if(this.isProcessing)this._queue.push({op:"swapPosition",keyA:t,keyB:e});else{var i=this.getIndex(t),n=this.getIndex(e);if(i!==n&&-1!==i&&-1!==n){var r=this.getAt(i);this.scenes[i]=this.scenes[n],this.scenes[n]=r}}return this},dump:function(){for(var t=[],e=["pending","init","start","loading","creating","running","paused","sleeping","shutdown","destroyed"],i=0;i<this.scenes.length;i++){var n=this.scenes[i].sys,s=!n.settings.visible||n.settings.status!==r.RUNNING&&n.settings.status!==r.PAUSED?"[-] ":"[*] ";s+=n.settings.key+" ("+e[n.settings.status]+")",t.push(s)}console.log(t.join("\n"))},destroy:function(){for(var t=0;t<this.scenes.length;t++){this.scenes[t].sys.destroy()}this.update=u,this.scenes=[],this._pending=[],this._start=[],this._queue=[],this.game=null}});t.exports=d},18139:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(88637),o=i(81769),a=i(50354),h=new r({initialize:function(t){this.scene=t,this.systems=t.sys,this.settings=t.sys.settings,this.key=t.sys.settings.key,this.manager=t.sys.game.scene,this.transitionProgress=0,this._elapsed=0,this._target=null,this._duration=0,this._onUpdate,this._onUpdateScope,this._willSleep=!1,this._willRemove=!1,t.sys.events.once(s.BOOT,this.boot,this),t.sys.events.on(s.START,this.pluginStart,this)},boot:function(){this.systems.events.once(s.DESTROY,this.destroy,this)},pluginStart:function(){this._target=null,this.systems.events.once(s.SHUTDOWN,this.shutdown,this)},start:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("stop",this.key),this.manager.queueOp("start",t,e),this},restart:function(t){var e=this.key;return this.manager.queueOp("stop",e),this.manager.queueOp("start",e,t),this},transition:function(t){void 0===t&&(t={});var e=o(t,"target",!1),i=this.manager.getScene(e);if(!e||!this.checkValidTransition(i))return!1;var n=o(t,"duration",1e3);this._elapsed=0,this._target=i,this._duration=n,this._willSleep=o(t,"sleep",!1),this._willRemove=o(t,"remove",!1);var r=o(t,"onUpdate",null);r&&(this._onUpdate=r,this._onUpdateScope=o(t,"onUpdateScope",this.scene));var a=o(t,"allowInput",!1);this.settings.transitionAllowInput=a;var h=i.sys.settings;return h.isTransition=!0,h.transitionFrom=this.scene,h.transitionDuration=n,h.transitionAllowInput=a,o(t,"moveAbove",!1)?this.manager.moveAbove(this.key,e):o(t,"moveBelow",!1)&&this.manager.moveBelow(this.key,e),i.sys.isSleeping()?i.sys.wake(o(t,"data")):this.manager.start(e,o(t,"data")),this.systems.events.emit(s.TRANSITION_OUT,i,n),this.systems.events.on(s.UPDATE,this.step,this),!0},checkValidTransition:function(t){return!(!t||t.sys.isActive()||t.sys.isTransitioning()||t===this.scene||this.systems.isTransitioning())},step:function(t,e){this._elapsed+=e,this.transitionProgress=n(this._elapsed/this._duration,0,1),this._onUpdate&&this._onUpdate.call(this._onUpdateScope,this.transitionProgress),this._elapsed>=this._duration&&this.transitionComplete()},transitionComplete:function(){var t=this._target.sys,e=this._target.sys.settings;this.systems.events.off(s.UPDATE,this.step,this),t.events.emit(s.TRANSITION_COMPLETE,this.scene),e.isTransition=!1,e.transitionFrom=null,this._duration=0,this._target=null,this._onUpdate=null,this._onUpdateScope=null,this._willRemove?this.manager.remove(this.key):this._willSleep?this.systems.sleep():this.manager.stop(this.key)},add:function(t,e,i,n){return this.manager.add(t,e,i,n)},launch:function(t,e){return t&&t!==this.key&&this.manager.queueOp("start",t,e),this},run:function(t,e){return t&&t!==this.key&&this.manager.queueOp("run",t,e),this},pause:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("pause",t,e),this},resume:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("resume",t,e),this},sleep:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("sleep",t,e),this},wake:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("wake",t,e),this},switch:function(t){return t!==this.key&&this.manager.queueOp("switch",this.key,t),this},stop:function(t,e){return void 0===t&&(t=this.key),this.manager.queueOp("stop",t,e),this},setActive:function(t,e,i){void 0===e&&(e=this.key);var n=this.manager.getScene(e);return n&&n.sys.setActive(t,i),this},setVisible:function(t,e){void 0===e&&(e=this.key);var i=this.manager.getScene(e);return i&&i.sys.setVisible(t),this},isSleeping:function(t){return void 0===t&&(t=this.key),this.manager.isSleeping(t)},isActive:function(t){return void 0===t&&(t=this.key),this.manager.isActive(t)},isPaused:function(t){return void 0===t&&(t=this.key),this.manager.isPaused(t)},isVisible:function(t){return void 0===t&&(t=this.key),this.manager.isVisible(t)},swapPosition:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.swapPosition(t,e),this},moveAbove:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.moveAbove(t,e),this},moveBelow:function(t,e){return void 0===e&&(e=this.key),t!==e&&this.manager.moveBelow(t,e),this},remove:function(t){return void 0===t&&(t=this.key),this.manager.remove(t),this},moveUp:function(t){return void 0===t&&(t=this.key),this.manager.moveUp(t),this},moveDown:function(t){return void 0===t&&(t=this.key),this.manager.moveDown(t),this},bringToTop:function(t){return void 0===t&&(t=this.key),this.manager.bringToTop(t),this},sendToBack:function(t){return void 0===t&&(t=this.key),this.manager.sendToBack(t),this},get:function(t){return this.manager.getScene(t)},getIndex:function(t){return void 0===t&&(t=this.key),this.manager.getIndex(t)},shutdown:function(){var t=this.systems.events;t.off(s.SHUTDOWN,this.shutdown,this),t.off(s.POST_UPDATE,this.step,this),t.off(s.TRANSITION_OUT)},destroy:function(){this.shutdown(),this.scene.sys.events.off(s.START,this.start,this),this.scene=null,this.systems=null,this.settings=null,this.manager=null}});a.register("ScenePlugin",h,"scenePlugin"),t.exports=h},81378:(t,e,i)=>{var n=i(73913),r=i(86652),s=i(92974),o=i(57711),a={create:function(t){return"string"==typeof t?t={key:t}:void 0===t&&(t={}),{status:n.PENDING,key:r(t,"key",""),active:r(t,"active",!1),visible:r(t,"visible",!0),isBooted:!1,isTransition:!1,transitionFrom:null,transitionDuration:0,transitionAllowInput:!0,data:{},pack:r(t,"pack",!1),cameras:r(t,"cameras",null),map:r(t,"map",s(o,r(t,"mapAdd",{}))),physics:r(t,"physics",{}),loader:r(t,"loader",{}),plugins:r(t,"plugins",!1),input:r(t,"input",{})}}};t.exports=a},81466:(t,e,i)=>{var n=i(47379),r=i(73913),s=i(97713),o=i(88637),a=i(14863),h=i(55576),u=i(49035),l=i(81378),c=new n({initialize:function(t,e){this.scene=t,this.game,this.renderer,this.facebook,this.config=e,this.settings=l.create(e),this.canvas,this.context,this.anims,this.cache,this.plugins,this.registry,this.scale,this.sound,this.textures,this.add,this.cameras,this.displayList,this.events,this.make,this.scenePlugin,this.updateList,this.sceneUpdate=u},init:function(t){this.settings.status=r.INIT,this.sceneUpdate=u,this.game=t,this.renderer=t.renderer,this.canvas=t.canvas,this.context=t.context;var e=t.plugins;this.plugins=e,e.addToScene(this,s.Global,[s.CoreScene,h(this),a(this)]),this.events.emit(o.BOOT,this),this.settings.isBooted=!0},install:function(t){Array.isArray(t)||(t=[t]),this.plugins.installLocal(this,t)},step:function(t,e){this.events.emit(o.PRE_UPDATE,t,e),this.events.emit(o.UPDATE,t,e),this.sceneUpdate.call(this.scene,t,e),this.events.emit(o.POST_UPDATE,t,e)},render:function(t){var e=this.displayList;e.depthSort(),this.cameras.render(t,e),this.events.emit(o.RENDER,t)},queueDepthSort:function(){this.displayList.queueDepthSort()},depthSort:function(){this.displayList.depthSort()},pause:function(t){return this.settings.active&&(this.settings.status=r.PAUSED,this.settings.active=!1,this.events.emit(o.PAUSE,this,t)),this},resume:function(t){return this.settings.active||(this.settings.status=r.RUNNING,this.settings.active=!0,this.events.emit(o.RESUME,this,t)),this},sleep:function(t){return this.settings.status=r.SLEEPING,this.settings.active=!1,this.settings.visible=!1,this.events.emit(o.SLEEP,this,t),this},wake:function(t){var e=this.settings;return e.status=r.RUNNING,e.active=!0,e.visible=!0,this.events.emit(o.WAKE,this,t),e.isTransition&&this.events.emit(o.TRANSITION_WAKE,e.transitionFrom,e.transitionDuration),this},getData:function(){return this.settings.data},isSleeping:function(){return this.settings.status===r.SLEEPING},isActive:function(){return this.settings.status===r.RUNNING},isPaused:function(){return this.settings.status===r.PAUSED},isTransitioning:function(){return this.settings.isTransition||null!==this.scenePlugin._target},isTransitionOut:function(){return null!==this.scenePlugin._target&&this.scenePlugin._duration>0},isTransitionIn:function(){return this.settings.isTransition},isVisible:function(){return this.settings.visible},setVisible:function(t){return this.settings.visible=t,this},setActive:function(t,e){return t?this.resume(e):this.pause(e)},start:function(t){t&&(this.settings.data=t),this.settings.status=r.START,this.settings.active=!0,this.settings.visible=!0,this.events.emit(o.START,this),this.events.emit(o.READY,this,t)},shutdown:function(t){this.events.off(o.TRANSITION_INIT),this.events.off(o.TRANSITION_START),this.events.off(o.TRANSITION_COMPLETE),this.events.off(o.TRANSITION_OUT),this.settings.status=r.SHUTDOWN,this.settings.active=!1,this.settings.visible=!1,this.events.emit(o.SHUTDOWN,this,t)},destroy:function(){this.settings.status=r.DESTROYED,this.settings.active=!1,this.settings.visible=!1,this.events.emit(o.DESTROY,this),this.events.removeAllListeners();for(var t=["scene","game","anims","cache","plugins","registry","sound","textures","add","camera","displayList","events","make","scenePlugin","updateList"],e=0;e<t.length;e++)this[t[e]]=null}});t.exports=c},73913:t=>{t.exports={PENDING:0,INIT:1,START:2,LOADING:3,CREATING:4,RUNNING:5,PAUSED:6,SLEEPING:7,SHUTDOWN:8,DESTROYED:9}},29671:t=>{t.exports="boot"},41795:t=>{t.exports="create"},49942:t=>{t.exports="destroy"},31557:t=>{t.exports="pause"},41843:t=>{t.exports="postupdate"},35878:t=>{t.exports="preupdate"},1487:t=>{t.exports="ready"},24454:t=>{t.exports="render"},12252:t=>{t.exports="resume"},13098:t=>{t.exports="shutdown"},85084:t=>{t.exports="sleep"},10222:t=>{t.exports="start"},94499:t=>{t.exports="transitioncomplete"},55486:t=>{t.exports="transitioninit"},5067:t=>{t.exports="transitionout"},8653:t=>{t.exports="transitionstart"},23815:t=>{t.exports="transitionwake"},50078:t=>{t.exports="update"},29829:t=>{t.exports="wake"},88637:(t,e,i)=>{t.exports={BOOT:i(29671),CREATE:i(41795),DESTROY:i(49942),PAUSE:i(31557),POST_UPDATE:i(41843),PRE_UPDATE:i(35878),READY:i(1487),RENDER:i(24454),RESUME:i(12252),SHUTDOWN:i(13098),SLEEP:i(85084),START:i(10222),TRANSITION_COMPLETE:i(94499),TRANSITION_INIT:i(55486),TRANSITION_OUT:i(5067),TRANSITION_START:i(8653),TRANSITION_WAKE:i(23815),UPDATE:i(50078),WAKE:i(29829)}},6397:(t,e,i)=>{var n=i(73913),r=i(80933),s={Events:i(88637),SceneManager:i(73091),ScenePlugin:i(18139),Settings:i(81378),Systems:i(81466)};s=r(!1,s,n),t.exports=s},95754:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(71700),o=i(80933),a=i(49035),h=new n({Extends:r,initialize:function(t,e,i){r.call(this),this.manager=t,this.key=e,this.isPlaying=!1,this.isPaused=!1,this.totalRate=1,this.duration=this.duration||0,this.totalDuration=this.totalDuration||0,this.config={mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0},this.currentConfig=this.config,this.config=o(this.config,i),this.markers={},this.currentMarker=null,this.pendingRemove=!1},addMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(console.error("addMarker "+t.name+" already exists in Sound"),!1):(t=o(!0,{name:"",start:0,duration:this.totalDuration-(t.start||0),config:{mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0}},t),this.markers[t.name]=t,!0))},updateMarker:function(t){return!(!t||!t.name||"string"!=typeof t.name)&&(this.markers[t.name]?(this.markers[t.name]=o(!0,this.markers[t.name],t),!0):(console.warn("Audio Marker: "+t.name+" missing in Sound: "+this.key),!1))},removeMarker:function(t){var e=this.markers[t];return e?(this.markers[t]=null,e):null},play:function(t,e){if(void 0===t&&(t=""),"object"==typeof t&&(e=t,t=""),"string"!=typeof t)return!1;if(t){if(!this.markers[t])return console.warn("Marker: "+t+" missing in Sound: "+this.key),!1;this.currentMarker=this.markers[t],this.currentConfig=this.currentMarker.config,this.duration=this.currentMarker.duration}else this.currentMarker=null,this.currentConfig=this.config,this.duration=this.totalDuration;return this.resetConfig(),this.currentConfig=o(this.currentConfig,e),this.isPlaying=!0,this.isPaused=!1,!0},pause:function(){return!(this.isPaused||!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!0,!0)},resume:function(){return!(!this.isPaused||this.isPlaying)&&(this.isPlaying=!0,this.isPaused=!1,!0)},stop:function(){return!(!this.isPaused&&!this.isPlaying)&&(this.isPlaying=!1,this.isPaused=!1,this.resetConfig(),!0)},applyConfig:function(){this.mute=this.currentConfig.mute,this.volume=this.currentConfig.volume,this.rate=this.currentConfig.rate,this.detune=this.currentConfig.detune,this.loop=this.currentConfig.loop},resetConfig:function(){this.currentConfig.seek=0,this.currentConfig.delay=0},update:a,calculateRate:function(){var t=this.currentConfig.detune+this.manager.detune,e=Math.pow(1.0005777895065548,t);this.totalRate=this.currentConfig.rate*this.manager.rate*e},destroy:function(){this.pendingRemove||(this.emit(s.DESTROY,this),this.pendingRemove=!0,this.manager=null,this.key="",this.removeAllListeners(),this.isPlaying=!1,this.isPaused=!1,this.config=null,this.currentConfig=null,this.markers=null,this.currentMarker=null)}});t.exports=h},40750:(t,e,i)=>{var n=i(47379),r=i(18438),s=i(17168),o=i(71700),a=i(80827),h=i(49035),u=i(50774),l=i(56606),c=new n({Extends:s,initialize:function(t){s.call(this),this.game=t,this.jsonCache=t.cache.json,this.sounds=[],this.mute=!1,this.volume=1,this.pauseOnBlur=!0,this._rate=1,this._detune=0,this.locked=this.locked||!1,this.unlocked=!1,t.events.on(a.BLUR,this.onGameBlur,this),t.events.on(a.FOCUS,this.onGameFocus,this),t.events.on(a.PRE_STEP,this.update,this),t.events.once(a.DESTROY,this.destroy,this)},add:h,addAudioSprite:function(t,e){void 0===e&&(e={});var i=this.add(t,e);for(var n in i.spritemap=this.jsonCache.get(t).spritemap,i.spritemap)if(i.spritemap.hasOwnProperty(n)){var s=r(e),o=i.spritemap[n];s.loop=!!o.hasOwnProperty("loop")&&o.loop,i.addMarker({name:n,start:o.start,duration:o.end-o.start,config:s})}return i},get:function(t){return l(this.sounds,"key",t)},getAll:function(t){return u(this.sounds,"key",t)},play:function(t,e){var i=this.add(t);return i.once(o.COMPLETE,i.destroy,i),e?e.name?(i.addMarker(e),i.play(e.name)):i.play(e):i.play()},playAudioSprite:function(t,e,i){var n=this.addAudioSprite(t);return n.once(o.COMPLETE,n.destroy,n),n.play(e,i)},remove:function(t){var e=this.sounds.indexOf(t);return-1!==e&&(t.destroy(),this.sounds.splice(e,1),!0)},removeAll:function(){this.sounds.forEach((function(t){t.destroy()})),this.sounds.length=0},removeByKey:function(t){for(var e=0,i=this.sounds.length-1;i>=0;i--){var n=this.sounds[i];n.key===t&&(n.destroy(),this.sounds.splice(i,1),e++)}return e},pauseAll:function(){this.forEachActiveSound((function(t){t.pause()})),this.emit(o.PAUSE_ALL,this)},resumeAll:function(){this.forEachActiveSound((function(t){t.resume()})),this.emit(o.RESUME_ALL,this)},stopAll:function(){this.forEachActiveSound((function(t){t.stop()})),this.emit(o.STOP_ALL,this)},stopByKey:function(t){var e=0;return this.getAll(t).forEach((function(t){t.stop()&&e++})),e},unlock:h,onBlur:h,onFocus:h,onGameBlur:function(){this.pauseOnBlur&&this.onBlur()},onGameFocus:function(){this.pauseOnBlur&&this.onFocus()},update:function(t,e){this.unlocked&&(this.unlocked=!1,this.locked=!1,this.emit(o.UNLOCKED,this));for(var i=this.sounds.length-1;i>=0;i--)this.sounds[i].pendingRemove&&this.sounds.splice(i,1);this.sounds.forEach((function(i){i.update(t,e)}))},destroy:function(){this.game.events.off(a.BLUR,this.onGameBlur,this),this.game.events.off(a.FOCUS,this.onGameFocus,this),this.game.events.off(a.PRE_STEP,this.update,this),this.removeAllListeners(),this.removeAll(),this.sounds.length=0,this.sounds=null,this.game=null},forEachActiveSound:function(t,e){var i=this;this.sounds.forEach((function(n,r){n&&!n.pendingRemove&&t.call(e||i,n,r,i.sounds)}))},setRate:function(t){return this.rate=t,this},rate:{get:function(){return this._rate},set:function(t){this._rate=t,this.forEachActiveSound((function(t){t.calculateRate()})),this.emit(o.GLOBAL_RATE,this,t)}},setDetune:function(t){return this.detune=t,this},detune:{get:function(){return this._detune},set:function(t){this._detune=t,this.forEachActiveSound((function(t){t.calculateRate()})),this.emit(o.GLOBAL_DETUNE,this,t)}}});t.exports=c},66466:(t,e,i)=>{var n=i(55243),r=i(99878),s=i(6181),o={create:function(t){var e=t.config.audio,i=t.device.audio;return e&&e.noAudio||!i.webAudio&&!i.audioData?new r(t):!i.webAudio||e&&e.disableWebAudio?new n(t):new s(t)}};t.exports=o},14604:t=>{t.exports="complete"},59490:t=>{t.exports="decodedall"},12848:t=>{t.exports="decoded"},89593:t=>{t.exports="destroy"},44742:t=>{t.exports="detune"},33333:t=>{t.exports="detune"},7085:t=>{t.exports="mute"},85449:t=>{t.exports="rate"},8604:t=>{t.exports="volume"},97417:t=>{t.exports="looped"},59740:t=>{t.exports="loop"},39853:t=>{t.exports="mute"},64863:t=>{t.exports="pauseall"},18358:t=>{t.exports="pause"},90943:t=>{t.exports="play"},74197:t=>{t.exports="rate"},79029:t=>{t.exports="resumeall"},93990:t=>{t.exports="resume"},93781:t=>{t.exports="seek"},59766:t=>{t.exports="stopall"},17166:t=>{t.exports="stop"},71530:t=>{t.exports="unlocked"},90305:t=>{t.exports="volume"},71700:(t,e,i)=>{t.exports={COMPLETE:i(14604),DECODED:i(12848),DECODED_ALL:i(59490),DESTROY:i(89593),DETUNE:i(44742),GLOBAL_DETUNE:i(33333),GLOBAL_MUTE:i(7085),GLOBAL_RATE:i(85449),GLOBAL_VOLUME:i(8604),LOOP:i(59740),LOOPED:i(97417),MUTE:i(39853),PAUSE_ALL:i(64863),PAUSE:i(18358),PLAY:i(90943),RATE:i(74197),RESUME_ALL:i(79029),RESUME:i(93990),SEEK:i(93781),STOP_ALL:i(59766),STOP:i(17166),UNLOCKED:i(71530),VOLUME:i(90305)}},67472:(t,e,i)=>{var n=i(95754),r=i(47379),s=i(71700),o=i(90487),a=new r({Extends:n,initialize:function(t,e,i){if(void 0===i&&(i={}),this.tags=t.game.cache.audio.get(e),!this.tags)throw new Error('There is no audio asset with key "'+e+'" in the audio cache');this.audio=null,this.startTime=0,this.previousTime=0,this.duration=this.tags[0].duration,this.totalDuration=this.tags[0].duration,n.call(this,t,e,i)},play:function(t,e){return!this.manager.isLocked(this,"play",[t,e])&&(!!n.prototype.play.call(this,t,e)&&(!!this.pickAndPlayAudioTag()&&(this.emit(s.PLAY,this),!0)))},pause:function(){return!this.manager.isLocked(this,"pause")&&(!(this.startTime>0)&&(!!n.prototype.pause.call(this)&&(this.currentConfig.seek=this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0),this.stopAndReleaseAudioTag(),this.emit(s.PAUSE,this),!0)))},resume:function(){return!this.manager.isLocked(this,"resume")&&(!(this.startTime>0)&&(!!n.prototype.resume.call(this)&&(!!this.pickAndPlayAudioTag()&&(this.emit(s.RESUME,this),!0))))},stop:function(){return!this.manager.isLocked(this,"stop")&&(!!n.prototype.stop.call(this)&&(this.stopAndReleaseAudioTag(),this.emit(s.STOP,this),!0))},pickAndPlayAudioTag:function(){if(!this.pickAudioTag())return this.reset(),!1;var t=this.currentConfig.seek,e=this.currentConfig.delay,i=(this.currentMarker?this.currentMarker.start:0)+t;return this.previousTime=i,this.audio.currentTime=i,this.applyConfig(),0===e?(this.startTime=0,this.audio.paused&&this.playCatchPromise()):(this.startTime=window.performance.now()+1e3*e,this.audio.paused||this.audio.pause()),this.resetConfig(),!0},pickAudioTag:function(){if(this.audio)return!0;for(var t=0;t<this.tags.length;t++){var e=this.tags[t];if("false"===e.dataset.used)return e.dataset.used="true",this.audio=e,!0}if(!this.manager.override)return!1;var i=[];this.manager.forEachActiveSound((function(t){t.key===this.key&&t.audio&&i.push(t)}),this),i.sort((function(t,e){return t.loop===e.loop?e.seek/e.duration-t.seek/t.duration:t.loop?1:-1}));var n=i[0];return this.audio=n.audio,n.reset(),n.audio=null,n.startTime=0,n.previousTime=0,!0},playCatchPromise:function(){var t=this.audio.play();t&&t.catch((function(t){console.warn(t)}))},stopAndReleaseAudioTag:function(){this.audio.pause(),this.audio.dataset.used="false",this.audio=null,this.startTime=0,this.previousTime=0},reset:function(){n.prototype.stop.call(this)},onBlur:function(){this.isPlaying=!1,this.isPaused=!0,this.currentConfig.seek=this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0),this.currentConfig.delay=Math.max(0,(this.startTime-window.performance.now())/1e3),this.stopAndReleaseAudioTag()},onFocus:function(){this.isPlaying=!0,this.isPaused=!1,this.pickAndPlayAudioTag()},update:function(t,e){if(this.isPlaying)if(this.startTime>0)this.startTime<t-this.manager.audioPlayDelay&&(this.audio.currentTime+=Math.max(0,t-this.startTime)/1e3,this.startTime=0,this.previousTime=this.audio.currentTime,this.playCatchPromise());else{var i=this.currentMarker?this.currentMarker.start:0,n=i+this.duration,r=this.audio.currentTime;if(this.currentConfig.loop)r>=n-this.manager.loopEndOffset?(this.audio.currentTime=i+Math.max(0,r-n),r=this.audio.currentTime):r<i&&(this.audio.currentTime+=i,r=this.audio.currentTime),r<this.previousTime&&this.emit(s.LOOPED,this);else if(r>=n)return this.reset(),this.stopAndReleaseAudioTag(),void this.emit(s.COMPLETE,this);this.previousTime=r}},destroy:function(){n.prototype.destroy.call(this),this.tags=null,this.audio&&this.stopAndReleaseAudioTag()},updateMute:function(){this.audio&&(this.audio.muted=this.currentConfig.mute||this.manager.mute)},updateVolume:function(){this.audio&&(this.audio.volume=o(this.currentConfig.volume*this.manager.volume,0,1))},calculateRate:function(){n.prototype.calculateRate.call(this),this.audio&&(this.audio.playbackRate=this.totalRate)},mute:{get:function(){return this.currentConfig.mute},set:function(t){this.currentConfig.mute=t,this.manager.isLocked(this,"mute",t)||(this.updateMute(),this.emit(s.MUTE,this,t))}},setMute:function(t){return this.mute=t,this},volume:{get:function(){return this.currentConfig.volume},set:function(t){this.currentConfig.volume=t,this.manager.isLocked(this,"volume",t)||(this.updateVolume(),this.emit(s.VOLUME,this,t))}},setVolume:function(t){return this.volume=t,this},rate:{get:function(){return this.currentConfig.rate},set:function(t){this.currentConfig.rate=t,this.manager.isLocked(this,s.RATE,t)||(this.calculateRate(),this.emit(s.RATE,this,t))}},setRate:function(t){return this.rate=t,this},detune:{get:function(){return this.currentConfig.detune},set:function(t){this.currentConfig.detune=t,this.manager.isLocked(this,s.DETUNE,t)||(this.calculateRate(),this.emit(s.DETUNE,this,t))}},setDetune:function(t){return this.detune=t,this},seek:{get:function(){return this.isPlaying?this.audio.currentTime-(this.currentMarker?this.currentMarker.start:0):this.isPaused?this.currentConfig.seek:0},set:function(t){this.manager.isLocked(this,"seek",t)||this.startTime>0||(this.isPlaying||this.isPaused)&&(t=Math.min(Math.max(0,t),this.duration),this.isPlaying?(this.previousTime=t,this.audio.currentTime=t):this.isPaused&&(this.currentConfig.seek=t),this.emit(s.SEEK,this,t))}},setSeek:function(t){return this.seek=t,this},loop:{get:function(){return this.currentConfig.loop},set:function(t){this.currentConfig.loop=t,this.manager.isLocked(this,"loop",t)||(this.audio&&(this.audio.loop=t),this.emit(s.LOOP,this,t))}},setLoop:function(t){return this.loop=t,this}});t.exports=a},55243:(t,e,i)=>{var n=i(40750),r=i(47379),s=i(71700),o=i(67472),a=new r({Extends:n,initialize:function(t){this.override=!0,this.audioPlayDelay=.1,this.loopEndOffset=.05,this.onBlurPausedSounds=[],this.locked="ontouchstart"in window,this.lockedActionsQueue=this.locked?[]:null,this._mute=!1,this._volume=1,n.call(this,t)},add:function(t,e){var i=new o(this,t,e);return this.sounds.push(i),i},unlock:function(){this.locked=!1;var t=this;if(this.game.cache.audio.entries.each((function(e,i){for(var n=0;n<i.length;n++)if("true"===i[n].dataset.locked)return t.locked=!0,!1;return!0})),this.locked){var e=!1,i=function(){e=!0},n=function(){if(e)e=!1;else{document.body.removeEventListener("touchmove",i),document.body.removeEventListener("touchend",n);var r=[];if(t.game.cache.audio.entries.each((function(t,e){for(var i=0;i<e.length;i++){var n=e[i];"true"===n.dataset.locked&&r.push(n)}return!0})),0!==r.length){var s=r[r.length-1];s.oncanplaythrough=function(){s.oncanplaythrough=null,r.forEach((function(t){t.dataset.locked="false"})),t.unlocked=!0},r.forEach((function(t){t.load()}))}}};this.once(s.UNLOCKED,(function(){for(this.forEachActiveSound((function(t){null===t.currentMarker&&0===t.duration&&(t.duration=t.tags[0].duration),t.totalDuration=t.tags[0].duration}));this.lockedActionsQueue.length;){var t=this.lockedActionsQueue.shift();t.sound[t.prop].apply?t.sound[t.prop].apply(t.sound,t.value||[]):t.sound[t.prop]=t.value}}),this),document.body.addEventListener("touchmove",i,!1),document.body.addEventListener("touchend",n,!1)}},onBlur:function(){this.forEachActiveSound((function(t){t.isPlaying&&(this.onBlurPausedSounds.push(t),t.onBlur())}))},onFocus:function(){this.onBlurPausedSounds.forEach((function(t){t.onFocus()})),this.onBlurPausedSounds.length=0},destroy:function(){n.prototype.destroy.call(this),this.onBlurPausedSounds.length=0,this.onBlurPausedSounds=null},isLocked:function(t,e,i){return"true"===t.tags[0].dataset.locked&&(this.lockedActionsQueue.push({sound:t,prop:e,value:i}),!0)},setMute:function(t){return this.mute=t,this},mute:{get:function(){return this._mute},set:function(t){this._mute=t,this.forEachActiveSound((function(t){t.updateMute()})),this.emit(s.GLOBAL_MUTE,this,t)}},setVolume:function(t){return this.volume=t,this},volume:{get:function(){return this._volume},set:function(t){this._volume=t,this.forEachActiveSound((function(t){t.updateVolume()})),this.emit(s.GLOBAL_VOLUME,this,t)}}});t.exports=a},73125:(t,e,i)=>{t.exports={SoundManagerCreator:i(66466),Events:i(71700),BaseSound:i(95754),BaseSoundManager:i(40750),WebAudioSound:i(35906),WebAudioSoundManager:i(6181),HTML5AudioSound:i(67472),HTML5AudioSoundManager:i(55243),NoAudioSound:i(65703),NoAudioSoundManager:i(99878)}},65703:(t,e,i)=>{var n=i(95754),r=i(47379),s=i(17168),o=i(80933),a=function(){return!1},h=function(){return this},u=new r({Extends:s,initialize:function(t,e,i){void 0===i&&(i={}),s.call(this),this.manager=t,this.key=e,this.isPlaying=!1,this.isPaused=!1,this.totalRate=1,this.duration=0,this.totalDuration=0,this.config=o({mute:!1,volume:1,rate:1,detune:0,seek:0,loop:!1,delay:0},i),this.currentConfig=this.config,this.mute=!1,this.volume=1,this.rate=1,this.detune=0,this.seek=0,this.loop=!1,this.markers={},this.currentMarker=null,this.pendingRemove=!1},addMarker:a,updateMarker:a,removeMarker:function(){return null},play:a,pause:a,resume:a,stop:a,destroy:function(){n.prototype.destroy.call(this)},setMute:h,setVolume:h,setRate:h,setDetune:h,setSeek:h,setLoop:h});t.exports=u},99878:(t,e,i)=>{var n=i(40750),r=i(47379),s=i(17168),o=i(65703),a=i(49035),h=new r({Extends:s,initialize:function(t){s.call(this),this.game=t,this.sounds=[],this.mute=!1,this.volume=1,this.rate=1,this.detune=0,this.pauseOnBlur=!0,this.locked=!1},add:function(t,e){var i=new o(this,t,e);return this.sounds.push(i),i},addAudioSprite:function(t,e){var i=this.add(t,e);return i.spritemap={},i},play:function(t,e){return!1},playAudioSprite:function(t,e,i){return!1},remove:function(t){return n.prototype.remove.call(this,t)},removeByKey:function(t){return n.prototype.removeByKey.call(this,t)},pauseAll:a,resumeAll:a,stopAll:a,update:a,setRate:a,setDetune:a,setMute:a,setVolume:a,forEachActiveSound:function(t,e){n.prototype.forEachActiveSound.call(this,t,e)},destroy:function(){n.prototype.destroy.call(this)}});t.exports=h},35906:(t,e,i)=>{var n=i(95754),r=i(47379),s=i(71700),o=new r({Extends:n,initialize:function(t,e,i){if(void 0===i&&(i={}),this.audioBuffer=t.game.cache.audio.get(e),!this.audioBuffer)throw new Error('There is no audio asset with key "'+e+'" in the audio cache');this.source=null,this.loopSource=null,this.muteNode=t.context.createGain(),this.volumeNode=t.context.createGain(),this.playTime=0,this.startTime=0,this.loopTime=0,this.rateUpdates=[],this.hasEnded=!1,this.hasLooped=!1,this.muteNode.connect(this.volumeNode),this.volumeNode.connect(t.destination),this.duration=this.audioBuffer.duration,this.totalDuration=this.audioBuffer.duration,n.call(this,t,e,i)},play:function(t,e){return!!n.prototype.play.call(this,t,e)&&(this.stopAndRemoveBufferSource(),this.createAndStartBufferSource(),this.emit(s.PLAY,this),!0)},pause:function(){return!(this.manager.context.currentTime<this.startTime)&&(!!n.prototype.pause.call(this)&&(this.currentConfig.seek=this.getCurrentTime(),this.stopAndRemoveBufferSource(),this.emit(s.PAUSE,this),!0))},resume:function(){return!(this.manager.context.currentTime<this.startTime)&&(!!n.prototype.resume.call(this)&&(this.createAndStartBufferSource(),this.emit(s.RESUME,this),!0))},stop:function(){return!!n.prototype.stop.call(this)&&(this.stopAndRemoveBufferSource(),this.emit(s.STOP,this),!0)},createAndStartBufferSource:function(){var t=this.currentConfig.seek,e=this.currentConfig.delay,i=this.manager.context.currentTime+e,n=(this.currentMarker?this.currentMarker.start:0)+t,r=this.duration-t;this.playTime=i-t,this.startTime=i,this.source=this.createBufferSource(),this.applyConfig(),this.source.start(Math.max(0,i),Math.max(0,n),Math.max(0,r)),this.resetConfig()},createAndStartLoopBufferSource:function(){var t=this.getLoopTime(),e=this.currentMarker?this.currentMarker.start:0,i=this.duration;this.loopTime=t,this.loopSource=this.createBufferSource(),this.loopSource.playbackRate.setValueAtTime(this.totalRate,0),this.loopSource.start(Math.max(0,t),Math.max(0,e),Math.max(0,i))},createBufferSource:function(){var t=this,e=this.manager.context.createBufferSource();return e.buffer=this.audioBuffer,e.connect(this.muteNode),e.onended=function(e){e.target===t.source&&(t.currentConfig.loop?t.hasLooped=!0:t.hasEnded=!0)},e},stopAndRemoveBufferSource:function(){this.source&&(this.source.stop(),this.source.disconnect(),this.source=null),this.playTime=0,this.startTime=0,this.stopAndRemoveLoopBufferSource()},stopAndRemoveLoopBufferSource:function(){this.loopSource&&(this.loopSource.stop(),this.loopSource.disconnect(),this.loopSource=null),this.loopTime=0},applyConfig:function(){this.rateUpdates.length=0,this.rateUpdates.push({time:0,rate:1}),n.prototype.applyConfig.call(this)},update:function(t,e){this.hasEnded?(this.hasEnded=!1,n.prototype.stop.call(this),this.stopAndRemoveBufferSource(),this.emit(s.COMPLETE,this)):this.hasLooped&&(this.hasLooped=!1,this.source=this.loopSource,this.loopSource=null,this.playTime=this.startTime=this.loopTime,this.rateUpdates.length=0,this.rateUpdates.push({time:0,rate:this.totalRate}),this.createAndStartLoopBufferSource(),this.emit(s.LOOPED,this))},destroy:function(){n.prototype.destroy.call(this),this.audioBuffer=null,this.stopAndRemoveBufferSource(),this.muteNode.disconnect(),this.muteNode=null,this.volumeNode.disconnect(),this.volumeNode=null,this.rateUpdates.length=0,this.rateUpdates=null},calculateRate:function(){n.prototype.calculateRate.call(this);var t=this.manager.context.currentTime;this.source&&"number"==typeof this.totalRate&&this.source.playbackRate.setValueAtTime(this.totalRate,t),this.isPlaying&&(this.rateUpdates.push({time:Math.max(this.startTime,t)-this.playTime,rate:this.totalRate}),this.loopSource&&(this.stopAndRemoveLoopBufferSource(),this.createAndStartLoopBufferSource()))},getCurrentTime:function(){for(var t=0,e=0;e<this.rateUpdates.length;e++){t+=((e<this.rateUpdates.length-1?this.rateUpdates[e+1].time:this.manager.context.currentTime-this.playTime)-this.rateUpdates[e].time)*this.rateUpdates[e].rate}return t},getLoopTime:function(){for(var t=0,e=0;e<this.rateUpdates.length-1;e++)t+=(this.rateUpdates[e+1].time-this.rateUpdates[e].time)*this.rateUpdates[e].rate;var i=this.rateUpdates[this.rateUpdates.length-1];return this.playTime+i.time+(this.duration-t)/i.rate},rate:{get:function(){return this.currentConfig.rate},set:function(t){this.currentConfig.rate=t,this.calculateRate(),this.emit(s.RATE,this,t)}},setRate:function(t){return this.rate=t,this},detune:{get:function(){return this.currentConfig.detune},set:function(t){this.currentConfig.detune=t,this.calculateRate(),this.emit(s.DETUNE,this,t)}},setDetune:function(t){return this.detune=t,this},mute:{get:function(){return 0===this.muteNode.gain.value},set:function(t){this.currentConfig.mute=t,this.muteNode.gain.setValueAtTime(t?0:1,0),this.emit(s.MUTE,this,t)}},setMute:function(t){return this.mute=t,this},volume:{get:function(){return this.volumeNode.gain.value},set:function(t){this.currentConfig.volume=t,this.volumeNode.gain.setValueAtTime(t,0),this.emit(s.VOLUME,this,t)}},setVolume:function(t){return this.volume=t,this},seek:{get:function(){return this.isPlaying?this.manager.context.currentTime<this.startTime?this.startTime-this.playTime:this.getCurrentTime():this.isPaused?this.currentConfig.seek:0},set:function(t){this.manager.context.currentTime<this.startTime||(this.isPlaying||this.isPaused)&&(t=Math.min(Math.max(0,t),this.duration),this.currentConfig.seek=t,this.isPlaying&&(this.stopAndRemoveBufferSource(),this.createAndStartBufferSource()),this.emit(s.SEEK,this,t))}},setSeek:function(t){return this.seek=t,this},loop:{get:function(){return this.currentConfig.loop},set:function(t){this.currentConfig.loop=t,this.isPlaying&&(this.stopAndRemoveLoopBufferSource(),t&&this.createAndStartLoopBufferSource()),this.emit(s.LOOP,this,t)}},setLoop:function(t){return this.loop=t,this}});t.exports=o},6181:(t,e,i)=>{var n=i(31021),r=i(40750),s=i(47379),o=i(71700),a=i(35906),h=new s({Extends:r,initialize:function(t){this.context=this.createAudioContext(t),this.masterMuteNode=this.context.createGain(),this.masterVolumeNode=this.context.createGain(),this.masterMuteNode.connect(this.masterVolumeNode),this.masterVolumeNode.connect(this.context.destination),this.destination=this.masterMuteNode,this.locked="suspended"===this.context.state&&("ontouchstart"in window||"onclick"in window),r.call(this,t),this.locked&&this.unlock()},createAudioContext:function(t){var e=t.config.audio;return e&&e.context?(e.context.resume(),e.context):new AudioContext},setAudioContext:function(t){return this.context&&this.context.close(),this.masterMuteNode&&this.masterMuteNode.disconnect(),this.masterVolumeNode&&this.masterVolumeNode.disconnect(),this.context=t,this.masterMuteNode=t.createGain(),this.masterVolumeNode=t.createGain(),this.masterMuteNode.connect(this.masterVolumeNode),this.masterVolumeNode.connect(t.destination),this.destination=this.masterMuteNode,this},add:function(t,e){var i=new a(this,t,e);return this.sounds.push(i),i},decodeAudio:function(t,e){var i;i=Array.isArray(t)?t:[{key:t,data:e}];for(var r=this.game.cache.audio,s=i.length,a=0;a<i.length;a++){var h=i[a],u=h.key,l=h.data;"string"==typeof l&&(l=n(l));var c=function(t,e){r.add(t,e),this.emit(o.DECODED,t),0===--s&&this.emit(o.DECODED_ALL)}.bind(this,u),d=function(t,e){console.error("Error decoding audio: "+t+" - ",e?e.message:""),0===--s&&this.emit(o.DECODED_ALL)}.bind(this,u);this.context.decodeAudioData(l,c,d)}},unlock:function(){var t=this,e=document.body,i=function i(){t.context&&t.context.resume().then((function(){e.removeEventListener("touchstart",i),e.removeEventListener("touchend",i),e.removeEventListener("click",i),e.removeEventListener("keydown",i),t.unlocked=!0}),(function(){e.removeEventListener("touchstart",i),e.removeEventListener("touchend",i),e.removeEventListener("click",i),e.removeEventListener("keydown",i)}))};e&&(e.addEventListener("touchstart",i,!1),e.addEventListener("touchend",i,!1),e.addEventListener("click",i,!1),e.addEventListener("keydown",i,!1))},onBlur:function(){this.locked||this.context.suspend()},onFocus:function(){this.locked||this.context.resume()},destroy:function(){if(this.destination=null,this.masterVolumeNode.disconnect(),this.masterVolumeNode=null,this.masterMuteNode.disconnect(),this.masterMuteNode=null,this.game.config.audio&&this.game.config.audio.context)this.context.suspend();else{var t=this;this.context.close().then((function(){t.context=null}))}r.prototype.destroy.call(this)},setMute:function(t){return this.mute=t,this},mute:{get:function(){return 0===this.masterMuteNode.gain.value},set:function(t){this.masterMuteNode.gain.setValueAtTime(t?0:1,0),this.emit(o.GLOBAL_MUTE,this,t)}},setVolume:function(t){return this.volume=t,this},volume:{get:function(){return this.masterVolumeNode.gain.value},set:function(t){this.masterVolumeNode.gain.setValueAtTime(t,0),this.emit(o.GLOBAL_VOLUME,this,t)}}});t.exports=h},29365:(t,e,i)=>{var n=i(37931),r=i(47379),s=i(49035),o=i(59199),a=new r({initialize:function(t){this.parent=t,this.list=[],this.position=0,this.addCallback=s,this.removeCallback=s,this._sortKey=""},add:function(t,e){return e?n.Add(this.list,t):n.Add(this.list,t,0,this.addCallback,this)},addAt:function(t,e,i){return i?n.AddAt(this.list,t,e):n.AddAt(this.list,t,e,0,this.addCallback,this)},getAt:function(t){return this.list[t]},getIndex:function(t){return this.list.indexOf(t)},sort:function(t,e){return t?(void 0===e&&(e=function(e,i){return e[t]-i[t]}),o.inplace(this.list,e),this):this},getByName:function(t){return n.GetFirst(this.list,"name",t)},getRandom:function(t,e){return n.GetRandom(this.list,t,e)},getFirst:function(t,e,i,r){return n.GetFirst(this.list,t,e,i,r)},getAll:function(t,e,i,r){return n.GetAll(this.list,t,e,i,r)},count:function(t,e){return n.CountAllMatching(this.list,t,e)},swap:function(t,e){n.Swap(this.list,t,e)},moveTo:function(t,e){return n.MoveTo(this.list,t,e)},remove:function(t,e){return e?n.Remove(this.list,t):n.Remove(this.list,t,this.removeCallback,this)},removeAt:function(t,e){return e?n.RemoveAt(this.list,t):n.RemoveAt(this.list,t,this.removeCallback,this)},removeBetween:function(t,e,i){return i?n.RemoveBetween(this.list,t,e):n.RemoveBetween(this.list,t,e,this.removeCallback,this)},removeAll:function(t){for(var e=this.list.length;e--;)this.remove(this.list[e],t);return this},bringToTop:function(t){return n.BringToTop(this.list,t)},sendToBack:function(t){return n.SendToBack(this.list,t)},moveUp:function(t){return n.MoveUp(this.list,t),t},moveDown:function(t){return n.MoveDown(this.list,t),t},reverse:function(){return this.list.reverse(),this},shuffle:function(){return n.Shuffle(this.list),this},replace:function(t,e){return n.Replace(this.list,t,e)},exists:function(t){return this.list.indexOf(t)>-1},setAll:function(t,e,i,r){return n.SetAll(this.list,t,e,i,r),this},each:function(t,e){for(var i=[null],n=2;n<arguments.length;n++)i.push(arguments[n]);for(n=0;n<this.list.length;n++)i[0]=this.list[n],t.apply(e,i)},shutdown:function(){this.removeAll(),this.list=[]},destroy:function(){this.removeAll(),this.parent=null,this.addCallback=null,this.removeCallback=null},length:{get:function(){return this.list.length}},first:{get:function(){return this.position=0,this.list.length>0?this.list[0]:null}},last:{get:function(){return this.list.length>0?(this.position=this.list.length-1,this.list[this.position]):null}},next:{get:function(){return this.position<this.list.length?(this.position++,this.list[this.position]):null}},previous:{get:function(){return this.position>0?(this.position--,this.list[this.position]):null}}});t.exports=a},25094:(t,e,i)=>{var n=new(i(47379))({initialize:function(t){if(this.entries={},this.size=0,Array.isArray(t))for(var e=0;e<t.length;e++)this.set(t[e][0],t[e][1])},set:function(t,e){return this.has(t)||this.size++,this.entries[t]=e,this},get:function(t){if(this.has(t))return this.entries[t]},getArray:function(){var t=[],e=this.entries;for(var i in e)t.push(e[i]);return t},has:function(t){return this.entries.hasOwnProperty(t)},delete:function(t){return this.has(t)&&(delete this.entries[t],this.size--),this},clear:function(){return Object.keys(this.entries).forEach((function(t){delete this.entries[t]}),this),this.size=0,this},keys:function(){return Object.keys(this.entries)},values:function(){var t=[],e=this.entries;for(var i in e)t.push(e[i]);return t},dump:function(){var t=this.entries;for(var e in console.group("Map"),t)console.log(e,t[e]);console.groupEnd()},each:function(t){var e=this.entries;for(var i in e)if(!1===t(i,e[i]))break;return this},contains:function(t){var e=this.entries;for(var i in e)if(e[i]===t)return!0;return!1},merge:function(t,e){void 0===e&&(e=!1);var i=this.entries,n=t.entries;for(var r in n)i.hasOwnProperty(r)&&e?i[r]=n[r]:this.set(r,n[r]);return this}});t.exports=n},7674:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(92081),o=new n({Extends:r,initialize:function(){r.call(this),this._pending=[],this._active=[],this._destroy=[],this._toProcess=0},add:function(t){return this._pending.push(t),this._toProcess++,t},remove:function(t){return this._destroy.push(t),this._toProcess++,t},removeAll:function(){for(var t=this._active,e=this._destroy,i=t.length;i--;)e.push(t[i]),this._toProcess++;return this},update:function(){if(0===this._toProcess)return this._active;var t,e,i=this._destroy,n=this._active;for(t=0;t<i.length;t++){e=i[t];var r=n.indexOf(e);-1!==r&&(n.splice(r,1),this.emit(s.REMOVE,e))}for(i.length=0,i=this._pending,t=0;t<i.length;t++)e=i[t],this._active.push(e),this.emit(s.ADD,e);return i.length=0,this._toProcess=0,this._active},getActive:function(){return this._active},length:{get:function(){return this._active.length}},destroy:function(){this._toProcess=0,this._pending=[],this._active=[],this._destroy=[]}});t.exports=o},41088:(t,e,i)=>{var n=i(33366);function r(t){if(!(this instanceof r))return new r(t,[".left",".top",".right",".bottom"]);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}function s(t,e,i){if(!i)return e.indexOf(t);for(var n=0;n<e.length;n++)if(i(t,e[n]))return n;return-1}function o(t,e){a(t,0,t.children.length,e,t)}function a(t,e,i,n,r){r||(r=m(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(var s,o=e;o<i;o++)s=t.children[o],h(r,t.leaf?n(s):s);return r}function h(t,e){return t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),t}function u(t,e){return t.minX-e.minX}function l(t,e){return t.minY-e.minY}function c(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function d(t){return t.maxX-t.minX+(t.maxY-t.minY)}function p(t,e){return t.minX<=e.minX&&t.minY<=e.minY&&e.maxX<=t.maxX&&e.maxY<=t.maxY}function f(t,e){return e.minX<=t.maxX&&e.minY<=t.maxY&&e.maxX>=t.minX&&e.maxY>=t.minY}function m(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function v(t,e,i,r,s){for(var o,a=[e,i];a.length;)(i=a.pop())-(e=a.pop())<=r||(o=e+Math.ceil((i-e)/r/2)*r,n(t,o,e,i,s),a.push(e,o,o,i))}r.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,i=[],n=this.toBBox;if(!f(t,e))return i;for(var r,s,o,a,h=[];e;){for(r=0,s=e.children.length;r<s;r++)o=e.children[r],f(t,a=e.leaf?n(o):o)&&(e.leaf?i.push(o):p(t,a)?this._all(o,i):h.push(o));e=h.pop()}return i},collides:function(t){var e=this.data,i=this.toBBox;if(!f(t,e))return!1;for(var n,r,s,o,a=[];e;){for(n=0,r=e.children.length;n<r;n++)if(s=e.children[n],f(t,o=e.leaf?i(s):s)){if(e.leaf||p(t,o))return!0;a.push(s)}e=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var e=0,i=t.length;e<i;e++)this.insert(t[e]);return this}var n=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===n.height)this._splitRoot(this.data,n);else{if(this.data.height<n.height){var r=this.data;this.data=n,n=r}this._insert(n,this.data.height-n.height-1,!0)}else this.data=n;return this},insert:function(t){return t&&this._insert(t,this.data.height-1),this},clear:function(){return this.data=m([]),this},remove:function(t,e){if(!t)return this;for(var i,n,r,o,a=this.data,h=this.toBBox(t),u=[],l=[];a||u.length;){if(a||(a=u.pop(),n=u[u.length-1],i=l.pop(),o=!0),a.leaf&&-1!==(r=s(t,a.children,e)))return a.children.splice(r,1),u.push(a),this._condense(u),this;o||a.leaf||!p(a,h)?n?(i++,a=n.children[i],o=!1):a=null:(u.push(a),l.push(i),i=0,n=a,a=a.children[0])}return this},toBBox:function(t){return t},compareMinX:u,compareMinY:l,toJSON:function(){return this.data},fromJSON:function(t){return this.data=t,this},_all:function(t,e){for(var i=[];t;)t.leaf?e.push.apply(e,t.children):i.push.apply(i,t.children),t=i.pop();return e},_build:function(t,e,i,n){var r,s=i-e+1,a=this._maxEntries;if(s<=a)return o(r=m(t.slice(e,i+1)),this.toBBox),r;n||(n=Math.ceil(Math.log(s)/Math.log(a)),a=Math.ceil(s/Math.pow(a,n-1))),(r=m([])).leaf=!1,r.height=n;var h,u,l,c,d=Math.ceil(s/a),p=d*Math.ceil(Math.sqrt(a));for(v(t,e,i,p,this.compareMinX),h=e;h<=i;h+=p)for(v(t,h,l=Math.min(h+p-1,i),d,this.compareMinY),u=h;u<=l;u+=d)c=Math.min(u+d-1,l),r.children.push(this._build(t,u,c,n-1));return o(r,this.toBBox),r},_chooseSubtree:function(t,e,i,n){for(var r,s,o,a,h,u,l,d,p,f;n.push(e),!e.leaf&&n.length-1!==i;){for(l=d=1/0,r=0,s=e.children.length;r<s;r++)h=c(o=e.children[r]),p=t,f=o,(u=(Math.max(f.maxX,p.maxX)-Math.min(f.minX,p.minX))*(Math.max(f.maxY,p.maxY)-Math.min(f.minY,p.minY))-h)<d?(d=u,l=h<l?h:l,a=o):u===d&&h<l&&(l=h,a=o);e=a||e.children[0]}return e},_insert:function(t,e,i){var n=this.toBBox,r=i?t:n(t),s=[],o=this._chooseSubtree(r,this.data,e,s);for(o.children.push(t),h(o,r);e>=0&&s[e].children.length>this._maxEntries;)this._split(s,e),e--;this._adjustParentBBoxes(r,s,e)},_split:function(t,e){var i=t[e],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);var s=this._chooseSplitIndex(i,r,n),a=m(i.children.splice(s,i.children.length-s));a.height=i.height,a.leaf=i.leaf,o(i,this.toBBox),o(a,this.toBBox),e?t[e-1].children.push(a):this._splitRoot(i,a)},_splitRoot:function(t,e){this.data=m([t,e]),this.data.height=t.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,i){var n,r,s,o,h,u,l,d,p,f,m,v,g,y;for(u=l=1/0,n=e;n<=i-e;n++)r=a(t,0,n,this.toBBox),s=a(t,n,i,this.toBBox),p=r,f=s,m=void 0,v=void 0,g=void 0,y=void 0,m=Math.max(p.minX,f.minX),v=Math.max(p.minY,f.minY),g=Math.min(p.maxX,f.maxX),y=Math.min(p.maxY,f.maxY),o=Math.max(0,g-m)*Math.max(0,y-v),h=c(r)+c(s),o<u?(u=o,d=n,l=h<l?h:l):o===u&&h<l&&(l=h,d=n);return d},_chooseSplitAxis:function(t,e,i){var n=t.leaf?this.compareMinX:u,r=t.leaf?this.compareMinY:l;this._allDistMargin(t,e,i,n)<this._allDistMargin(t,e,i,r)&&t.children.sort(n)},_allDistMargin:function(t,e,i,n){t.children.sort(n);var r,s,o=this.toBBox,u=a(t,0,e,o),l=a(t,i-e,i,o),c=d(u)+d(l);for(r=e;r<i-e;r++)s=t.children[r],h(u,t.leaf?o(s):s),c+=d(u);for(r=i-e-1;r>=e;r--)s=t.children[r],h(l,t.leaf?o(s):s),c+=d(l);return c},_adjustParentBBoxes:function(t,e,i){for(var n=i;n>=0;n--)h(e[n],t)},_condense:function(t){for(var e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children).splice(e.indexOf(t[i]),1):this.clear():o(t[i],this.toBBox)},compareMinX:function(t,e){return t.left-e.left},compareMinY:function(t,e){return t.top-e.top},toBBox:function(t){return{minX:t.left,minY:t.top,maxX:t.right,maxY:t.bottom}}},t.exports=r},69347:(t,e,i)=>{var n=new(i(47379))({initialize:function(t){if(this.entries=[],Array.isArray(t))for(var e=0;e<t.length;e++)this.set(t[e])},set:function(t){return-1===this.entries.indexOf(t)&&this.entries.push(t),this},get:function(t,e){for(var i=0;i<this.entries.length;i++){var n=this.entries[i];if(n[t]===e)return n}},getArray:function(){return this.entries.slice(0)},delete:function(t){var e=this.entries.indexOf(t);return e>-1&&this.entries.splice(e,1),this},dump:function(){console.group("Set");for(var t=0;t<this.entries.length;t++){var e=this.entries[t];console.log(e)}console.groupEnd()},each:function(t,e){var i,n=this.entries.slice(),r=n.length;if(e)for(i=0;i<r&&!1!==t.call(e,n[i],i);i++);else for(i=0;i<r&&!1!==t(n[i],i);i++);return this},iterate:function(t,e){var i,n=this.entries.length;if(e)for(i=0;i<n&&!1!==t.call(e,this.entries[i],i);i++);else for(i=0;i<n&&!1!==t(this.entries[i],i);i++);return this},iterateLocal:function(t){var e,i=[];for(e=1;e<arguments.length;e++)i.push(arguments[e]);var n=this.entries.length;for(e=0;e<n;e++){var r=this.entries[e];r[t].apply(r,i)}return this},clear:function(){return this.entries.length=0,this},contains:function(t){return this.entries.indexOf(t)>-1},union:function(t){var e=new n;return t.entries.forEach((function(t){e.set(t)})),this.entries.forEach((function(t){e.set(t)})),e},intersect:function(t){var e=new n;return this.entries.forEach((function(i){t.contains(i)&&e.set(i)})),e},difference:function(t){var e=new n;return this.entries.forEach((function(i){t.contains(i)||e.set(i)})),e},size:{get:function(){return this.entries.length},set:function(t){return t<this.entries.length?this.entries.length=t:this.entries.length}}});t.exports=n},4977:(t,e,i)=>{var n=i(90487),r=i(47379),s=i(88168),o=i(57148),a=new r({initialize:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=0),void 0===n&&(n=null),this._width=t,this._height=e,this._parent=n,this.aspectMode=i,this.aspectRatio=0===e?1:t/e,this.minWidth=0,this.minHeight=0,this.maxWidth=Number.MAX_VALUE,this.maxHeight=Number.MAX_VALUE,this.snapTo=new o},setAspectMode:function(t){return void 0===t&&(t=0),this.aspectMode=t,this.setSize(this._width,this._height)},setSnap:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.snapTo.set(t,e),this.setSize(this._width,this._height)},setParent:function(t){return this._parent=t,this.setSize(this._width,this._height)},setMin:function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.minWidth=n(t,0,this.maxWidth),this.minHeight=n(e,0,this.maxHeight),this.setSize(this._width,this._height)},setMax:function(t,e){return void 0===t&&(t=Number.MAX_VALUE),void 0===e&&(e=t),this.maxWidth=n(t,this.minWidth,Number.MAX_VALUE),this.maxHeight=n(e,this.minHeight,Number.MAX_VALUE),this.setSize(this._width,this._height)},setSize:function(t,e){switch(void 0===t&&(t=0),void 0===e&&(e=t),this.aspectMode){case a.NONE:this._width=this.getNewWidth(s(t,this.snapTo.x)),this._height=this.getNewHeight(s(e,this.snapTo.y)),this.aspectRatio=0===this._height?1:this._width/this._height;break;case a.WIDTH_CONTROLS_HEIGHT:this._width=this.getNewWidth(s(t,this.snapTo.x)),this._height=this.getNewHeight(this._width*(1/this.aspectRatio),!1);break;case a.HEIGHT_CONTROLS_WIDTH:this._height=this.getNewHeight(s(e,this.snapTo.y)),this._width=this.getNewWidth(this._height*this.aspectRatio,!1);break;case a.FIT:this.constrain(t,e,!0);break;case a.ENVELOP:this.constrain(t,e,!1)}return this},setAspectRatio:function(t){return this.aspectRatio=t,this.setSize(this._width,this._height)},resize:function(t,e){return this._width=this.getNewWidth(s(t,this.snapTo.x)),this._height=this.getNewHeight(s(e,this.snapTo.y)),this.aspectRatio=0===this._height?1:this._width/this._height,this},getNewWidth:function(t,e){return void 0===e&&(e=!0),t=n(t,this.minWidth,this.maxWidth),e&&this._parent&&t>this._parent.width&&(t=Math.max(this.minWidth,this._parent.width)),t},getNewHeight:function(t,e){return void 0===e&&(e=!0),t=n(t,this.minHeight,this.maxHeight),e&&this._parent&&t>this._parent.height&&(t=Math.max(this.minHeight,this._parent.height)),t},constrain:function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=t),void 0===i&&(i=!0),t=this.getNewWidth(t),e=this.getNewHeight(e);var n=this.snapTo,r=0===e?1:t/e;return i&&this.aspectRatio>r||!i&&this.aspectRatio<r?(e=(t=s(t,n.x))/this.aspectRatio,n.y>0&&(t=(e=s(e,n.y))*this.aspectRatio)):(i&&this.aspectRatio<r||!i&&this.aspectRatio>r)&&(t=(e=s(e,n.y))*this.aspectRatio,n.x>0&&(e=(t=s(t,n.x))*(1/this.aspectRatio))),this._width=t,this._height=e,this},fitTo:function(t,e){return this.constrain(t,e,!0)},envelop:function(t,e){return this.constrain(t,e,!1)},setWidth:function(t){return this.setSize(t,this._height)},setHeight:function(t){return this.setSize(this._width,t)},toString:function(){return"[{ Size (width="+this._width+" height="+this._height+" aspectRatio="+this.aspectRatio+" aspectMode="+this.aspectMode+") }]"},setCSS:function(t){t&&t.style&&(t.style.width=this._width+"px",t.style.height=this._height+"px")},copy:function(t){return t.setAspectMode(this.aspectMode),t.aspectRatio=this.aspectRatio,t.setSize(this.width,this.height)},destroy:function(){this._parent=null,this.snapTo=null},width:{get:function(){return this._width},set:function(t){this.setSize(t,this._height)}},height:{get:function(){return this._height},set:function(t){this.setSize(this._width,t)}}});a.NONE=0,a.WIDTH_CONTROLS_HEIGHT=1,a.HEIGHT_CONTROLS_WIDTH=2,a.FIT=3,a.ENVELOP=4,t.exports=a},60719:t=>{t.exports="add"},92798:t=>{t.exports="remove"},92081:(t,e,i)=>{t.exports={PROCESS_QUEUE_ADD:i(60719),PROCESS_QUEUE_REMOVE:i(92798)}},97548:(t,e,i)=>{t.exports={List:i(29365),Map:i(25094),ProcessQueue:i(7674),RTree:i(41088),Set:i(69347),Size:i(4977)}},17372:(t,e,i)=>{var n=i(47379),r=i(90487),s=i(81615),o=i(50460),a=i(2244),h=i(71201),u=new n({Extends:h,initialize:function(t,e,i,n,r){h.call(this,t,e,i,n,r),this.add("__BASE",0,0,0,n,r),this._source=this.frames.__BASE.source,this.canvas=this._source.image,this.context=this.canvas.getContext("2d"),this.width=n,this.height=r,this.imageData=this.context.getImageData(0,0,n,r),this.data=null,this.imageData&&(this.data=this.imageData.data),this.pixels=null,this.buffer,this.data&&(this.imageData.data.buffer?(this.buffer=this.imageData.data.buffer,this.pixels=new Uint32Array(this.buffer)):window.ArrayBuffer?(this.buffer=new ArrayBuffer(this.imageData.data.length),this.pixels=new Uint32Array(this.buffer)):this.pixels=this.imageData.data)},update:function(){return this.imageData=this.context.getImageData(0,0,this.width,this.height),this.data=this.imageData.data,this.imageData.data.buffer?(this.buffer=this.imageData.data.buffer,this.pixels=new Uint32Array(this.buffer)):window.ArrayBuffer?(this.buffer=new ArrayBuffer(this.imageData.data.length),this.pixels=new Uint32Array(this.buffer)):this.pixels=this.imageData.data,this.manager.game.config.renderType===o.WEBGL&&this.refresh(),this},draw:function(t,e,i){return this.context.drawImage(i,t,e),this.update()},drawFrame:function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=0);var r=this.manager.getFrame(t,e);if(r){var s=r.canvasData,o=r.cutWidth,a=r.cutHeight,h=r.source.resolution;return this.context.drawImage(r.source.image,s.x,s.y,o,a,i,n,o/h,a/h),this.update()}return this},setPixel:function(t,e,i,n,r,s){if(void 0===s&&(s=255),t=Math.abs(Math.floor(t)),e=Math.abs(Math.floor(e)),this.getIndex(t,e)>-1){var o=this.context.getImageData(t,e,1,1);o.data[0]=i,o.data[1]=n,o.data[2]=r,o.data[3]=s,this.context.putImageData(o,t,e)}return this},putData:function(t,e,i,n,r,s,o){return void 0===n&&(n=0),void 0===r&&(r=0),void 0===s&&(s=t.width),void 0===o&&(o=t.height),this.context.putImageData(t,e,i,n,r,s,o),this},getData:function(t,e,i,n){return t=r(Math.floor(t),0,this.width-1),e=r(Math.floor(e),0,this.height-1),i=r(i,1,this.width-t),n=r(n,1,this.height-e),this.context.getImageData(t,e,i,n)},getPixel:function(t,e,i){i||(i=new s);var n=this.getIndex(t,e);if(n>-1){var r=this.data,o=r[n+0],a=r[n+1],h=r[n+2],u=r[n+3];i.setTo(o,a,h,u)}return i},getPixels:function(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===n&&(n=i),t=Math.abs(Math.round(t)),e=Math.abs(Math.round(e));for(var o=r(t,0,this.width),a=r(t+i,0,this.width),h=r(e,0,this.height),u=r(e+n,0,this.height),l=new s,c=[],d=h;d<u;d++){for(var p=[],f=o;f<a;f++)l=this.getPixel(f,d,l),p.push({x:f,y:d,color:l.color,alpha:l.alphaGL});c.push(p)}return c},getIndex:function(t,e){return t=Math.abs(Math.round(t)),e=Math.abs(Math.round(e)),t<this.width&&e<this.height?4*(t+e*this.width):-1},refresh:function(){return this._source.update(),this},getCanvas:function(){return this.canvas},getContext:function(){return this.context},clear:function(t,e,i,n){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=this.width),void 0===n&&(n=this.height),this.context.clearRect(t,e,i,n),this.update()},setSize:function(t,e){return void 0===e&&(e=t),t===this.width&&e===this.height||(this.canvas.width=t,this.canvas.height=e,this._source.width=t,this._source.height=e,this._source.isPowerOf2=a(t,e),this.frames.__BASE.setSize(t,e,0,0),this.width=t,this.height=e,this.refresh()),this},destroy:function(){h.prototype.destroy.call(this),this._source=null,this.canvas=null,this.context=null,this.imageData=null,this.data=null,this.pixels=null,this.buffer=null}});t.exports=u},48165:(t,e,i)=>{var n=i(47379),r=i(90487),s=i(80933),o=new n({initialize:function(t,e,i,n,r,s,o){this.texture=t,this.name=e,this.source=t.source[i],this.sourceIndex=i,this.glTexture=this.source.glTexture,this.cutX,this.cutY,this.cutWidth,this.cutHeight,this.x=0,this.y=0,this.width,this.height,this.halfWidth,this.halfHeight,this.centerX,this.centerY,this.pivotX=0,this.pivotY=0,this.customPivot=!1,this.rotated=!1,this.autoRound=-1,this.customData={},this.u0=0,this.v0=0,this.u1=0,this.v1=0,this.data={cut:{x:0,y:0,w:0,h:0,r:0,b:0},trim:!1,sourceSize:{w:0,h:0},spriteSourceSize:{x:0,y:0,w:0,h:0,r:0,b:0},radius:0,drawImage:{x:0,y:0,width:0,height:0}},this.setSize(s,o,n,r)},setSize:function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=0),this.cutX=i,this.cutY=n,this.cutWidth=t,this.cutHeight=e,this.width=t,this.height=e,this.halfWidth=Math.floor(.5*t),this.halfHeight=Math.floor(.5*e),this.centerX=Math.floor(t/2),this.centerY=Math.floor(e/2);var r=this.data,s=r.cut;s.x=i,s.y=n,s.w=t,s.h=e,s.r=i+t,s.b=n+e,r.sourceSize.w=t,r.sourceSize.h=e,r.spriteSourceSize.w=t,r.spriteSourceSize.h=e,r.radius=.5*Math.sqrt(t*t+e*e);var o=r.drawImage;return o.x=i,o.y=n,o.width=t,o.height=e,this.updateUVs()},setTrim:function(t,e,i,n,r,s){var o=this.data,a=o.spriteSourceSize;return o.trim=!0,o.sourceSize.w=t,o.sourceSize.h=e,a.x=i,a.y=n,a.w=r,a.h=s,a.r=i+r,a.b=n+s,this.x=i,this.y=n,this.width=r,this.height=s,this.halfWidth=.5*r,this.halfHeight=.5*s,this.centerX=Math.floor(r/2),this.centerY=Math.floor(s/2),this.updateUVs()},setCropUVs:function(t,e,i,n,s,o,a){var h=this.cutX,u=this.cutY,l=this.cutWidth,c=this.cutHeight,d=this.realWidth,p=this.realHeight,f=h+(e=r(e,0,d)),m=u+(i=r(i,0,p)),v=n=r(n,0,d-e),g=s=r(s,0,p-i),y=this.data;if(y.trim){var _=y.spriteSourceSize,x=e+(n=r(n,0,l-e)),b=i+(s=r(s,0,c-i));if(!(_.r<e||_.b<i||_.x>x||_.y>b)){var w=Math.max(_.x,e),T=Math.max(_.y,i),M=Math.min(_.r,x)-w,S=Math.min(_.b,b)-T;v=M,g=S,f=o?h+(l-(w-_.x)-M):h+(w-_.x),m=a?u+(c-(T-_.y)-S):u+(T-_.y),e=w,i=T,n=M,s=S}else f=0,m=0,v=0,g=0}else o&&(f=h+(l-e-n)),a&&(m=u+(c-i-s));var E=this.source.width,L=this.source.height;return t.u0=Math.max(0,f/E),t.v0=Math.max(0,m/L),t.u1=Math.min(1,(f+v)/E),t.v1=Math.min(1,(m+g)/L),t.x=e,t.y=i,t.cx=f,t.cy=m,t.cw=v,t.ch=g,t.width=n,t.height=s,t.flipX=o,t.flipY=a,t},updateCropUVs:function(t,e,i){return this.setCropUVs(t,t.x,t.y,t.width,t.height,e,i)},updateUVs:function(){var t=this.cutX,e=this.cutY,i=this.cutWidth,n=this.cutHeight,r=this.data.drawImage;r.width=i,r.height=n;var s=this.source.width,o=this.source.height;return this.u0=t/s,this.v0=e/o,this.u1=(t+i)/s,this.v1=(e+n)/o,this},updateUVsInverted:function(){var t=this.source.width,e=this.source.height;return this.u0=(this.cutX+this.cutHeight)/t,this.v0=this.cutY/e,this.u1=this.cutX/t,this.v1=(this.cutY+this.cutWidth)/e,this},clone:function(){var t=new o(this.texture,this.name,this.sourceIndex);return t.cutX=this.cutX,t.cutY=this.cutY,t.cutWidth=this.cutWidth,t.cutHeight=this.cutHeight,t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t.halfWidth=this.halfWidth,t.halfHeight=this.halfHeight,t.centerX=this.centerX,t.centerY=this.centerY,t.rotated=this.rotated,t.data=s(!0,t.data,this.data),t.updateUVs(),t},destroy:function(){this.source=null,this.texture=null,this.glTexture=null,this.customData=null,this.data=null},realWidth:{get:function(){return this.data.sourceSize.w}},realHeight:{get:function(){return this.data.sourceSize.h}},radius:{get:function(){return this.data.radius}},trimmed:{get:function(){return this.data.trim}},canvasData:{get:function(){return this.data.drawImage}}});t.exports=o},71201:(t,e,i)=>{var n=i(47379),r=i(48165),s=i(93369),o="Texture.frame missing: ",a=new n({initialize:function(t,e,i,n,r){Array.isArray(i)||(i=[i]),this.manager=t,this.key=e,this.source=[],this.dataSource=[],this.frames={},this.customData={},this.firstFrame="__BASE",this.frameTotal=0;for(var o=0;o<i.length;o++)this.source.push(new s(this,i[o],n,r))},add:function(t,e,i,n,s,o){if(this.has(t))return null;var a=new r(this,t,e,i,n,s,o);return this.frames[t]=a,"__BASE"===this.firstFrame&&(this.firstFrame=t),this.frameTotal++,a},remove:function(t){return!!this.has(t)&&(this.get(t).destroy(),delete this.frames[t],!0)},has:function(t){return this.frames[t]},get:function(t){t||(t=this.firstFrame);var e=this.frames[t];return e||(console.warn(o+t),e=this.frames[this.firstFrame]),e},getTextureSourceIndex:function(t){for(var e=0;e<this.source.length;e++)if(this.source[e]===t)return e;return-1},getFramesFromTextureSource:function(t,e){void 0===e&&(e=!1);var i=[];for(var n in this.frames)if("__BASE"!==n||e){var r=this.frames[n];r.sourceIndex===t&&i.push(r)}return i},getFrameNames:function(t){void 0===t&&(t=!1);var e=Object.keys(this.frames);if(!t){var i=e.indexOf("__BASE");-1!==i&&e.splice(i,1)}return e},getSourceImage:function(t){null!=t&&1!==this.frameTotal||(t="__BASE");var e=this.frames[t];return e?e.source.image:(console.warn(o+t),this.frames.__BASE.source.image)},getDataSourceImage:function(t){null!=t&&1!==this.frameTotal||(t="__BASE");var e,i=this.frames[t];return i?e=i.sourceIndex:(console.warn(o+t),e=this.frames.__BASE.sourceIndex),this.dataSource[e].image},setDataSource:function(t){Array.isArray(t)||(t=[t]);for(var e=0;e<t.length;e++){var i=this.source[e];this.dataSource.push(new s(this,t[e],i.width,i.height))}},setFilter:function(t){var e;for(e=0;e<this.source.length;e++)this.source[e].setFilter(t);for(e=0;e<this.dataSource.length;e++)this.dataSource[e].setFilter(t)},destroy:function(){var t;for(t=0;t<this.source.length;t++)this.source[t].destroy();for(t=0;t<this.dataSource.length;t++)this.dataSource[t].destroy();for(var e in this.frames){this.frames[e].destroy()}this.source=[],this.dataSource=[],this.frames={},this.manager.removeKey(this.key),this.manager=null}});t.exports=a},4907:(t,e,i)=>{var n=i(89429),r=i(17372),s=i(47379),o=i(81615),a=i(50460),h=i(17168),u=i(2931),l=i(80827),c=i(37644),d=i(86652),p=i(63083),f=i(71201),m=new s({Extends:h,initialize:function(t){h.call(this),this.game=t,this.name="TextureManager",this.list={},this._tempCanvas=n.create2D(this,1,1),this._tempContext=this._tempCanvas.getContext("2d"),this._pending=0,t.events.once(l.BOOT,this.boot,this)},boot:function(){this._pending=2,this.on(u.LOAD,this.updatePending,this),this.on(u.ERROR,this.updatePending,this),this.addBase64("__DEFAULT",this.game.config.defaultImage),this.addBase64("__MISSING",this.game.config.missingImage),this.game.events.once(l.DESTROY,this.destroy,this)},updatePending:function(){this._pending--,0===this._pending&&(this.off(u.LOAD),this.off(u.ERROR),this.emit(u.READY))},checkKey:function(t){return!this.exists(t)||(console.error("Texture key already in use: "+t),!1)},remove:function(t){if("string"==typeof t){if(!this.exists(t))return console.warn("No texture found matching key: "+t),this;t=this.get(t)}return this.list.hasOwnProperty(t.key)&&(t.destroy(),this.emit(u.REMOVE,t.key)),this},removeKey:function(t){return this.list.hasOwnProperty(t)&&delete this.list[t],this},addBase64:function(t,e){if(this.checkKey(t)){var i=this,n=new Image;n.onerror=function(){i.emit(u.ERROR,t)},n.onload=function(){var e=i.create(t,n);p.Image(e,0),i.emit(u.ADD,t,e),i.emit(u.LOAD,t,e)},n.src=e}return this},getBase64:function(t,e,i,r){void 0===i&&(i="image/png"),void 0===r&&(r=.92);var s="",o=this.getFrame(t,e);if(o&&(o.source.isRenderTexture||o.source.isGLTexture))console.warn("Cannot getBase64 from WebGL Texture");else if(o){var a=o.canvasData,h=n.create2D(this,a.width,a.height);h.getContext("2d").drawImage(o.source.image,a.x,a.y,a.width,a.height,0,0,a.width,a.height),s=h.toDataURL(i,r),n.remove(h)}return s},addImage:function(t,e,i){var n=null;return this.checkKey(t)&&(n=this.create(t,e),p.Image(n,0),i&&n.setDataSource(i),this.emit(u.ADD,t,n)),n},addGLTexture:function(t,e,i,n){var r=null;return this.checkKey(t)&&((r=this.create(t,e,i,n)).add("__BASE",0,0,0,i,n),this.emit(u.ADD,t,r)),r},addRenderTexture:function(t,e){var i=null;return this.checkKey(t)&&((i=this.create(t,e)).add("__BASE",0,0,0,e.width,e.height),this.emit(u.ADD,t,i)),i},generate:function(t,e){if(this.checkKey(t)){var i=n.create(this,1,1);return e.canvas=i,c(e),this.addCanvas(t,i)}return null},createCanvas:function(t,e,i){if(void 0===e&&(e=256),void 0===i&&(i=256),this.checkKey(t)){var r=n.create(this,e,i,a.CANVAS,!0);return this.addCanvas(t,r)}return null},addCanvas:function(t,e,i){void 0===i&&(i=!1);var n=null;return i?n=new r(this,t,e,e.width,e.height):this.checkKey(t)&&(n=new r(this,t,e,e.width,e.height),this.list[t]=n,this.emit(u.ADD,t,n)),n},addAtlas:function(t,e,i,n){return Array.isArray(i.textures)||Array.isArray(i.frames)?this.addAtlasJSONArray(t,e,i,n):this.addAtlasJSONHash(t,e,i,n)},addAtlasJSONArray:function(t,e,i,n){var r=null;if(this.checkKey(t)){if(r=this.create(t,e),Array.isArray(i))for(var s=1===i.length,o=0;o<r.source.length;o++){var a=s?i[0]:i[o];p.JSONArray(r,o,a)}else p.JSONArray(r,0,i);n&&r.setDataSource(n),this.emit(u.ADD,t,r)}return r},addAtlasJSONHash:function(t,e,i,n){var r=null;if(this.checkKey(t)){if(r=this.create(t,e),Array.isArray(i))for(var s=0;s<i.length;s++)p.JSONHash(r,s,i[s]);else p.JSONHash(r,0,i);n&&r.setDataSource(n),this.emit(u.ADD,t,r)}return r},addAtlasXML:function(t,e,i,n){var r=null;return this.checkKey(t)&&(r=this.create(t,e),p.AtlasXML(r,0,i),n&&r.setDataSource(n),this.emit(u.ADD,t,r)),r},addUnityAtlas:function(t,e,i,n){var r=null;return this.checkKey(t)&&(r=this.create(t,e),p.UnityYAML(r,0,i),n&&r.setDataSource(n),this.emit(u.ADD,t,r)),r},addSpriteSheet:function(t,e,i){var n=null;if(this.checkKey(t)){var r=(n=this.create(t,e)).source[0].width,s=n.source[0].height;p.SpriteSheet(n,0,0,0,r,s,i),this.emit(u.ADD,t,n)}return n},addSpriteSheetFromAtlas:function(t,e){if(!this.checkKey(t))return null;var i=d(e,"atlas",null),n=d(e,"frame",null);if(i&&n){var r=this.get(i).get(n);if(r){var s=this.create(t,r.source.image);return r.trimmed?p.SpriteSheetFromAtlas(s,r,e):p.SpriteSheet(s,0,r.cutX,r.cutY,r.cutWidth,r.cutHeight,e),this.emit(u.ADD,t,s),s}}},create:function(t,e,i,n){var r=null;return this.checkKey(t)&&(r=new f(this,t,e,i,n),this.list[t]=r),r},exists:function(t){return this.list.hasOwnProperty(t)},get:function(t){return void 0===t&&(t="__DEFAULT"),this.list[t]?this.list[t]:t instanceof f?t:this.list.__MISSING},cloneFrame:function(t,e){if(this.list[t])return this.list[t].get(e).clone()},getFrame:function(t,e){if(this.list[t])return this.list[t].get(e)},getTextureKeys:function(){var t=[];for(var e in this.list)"__DEFAULT"!==e&&"__MISSING"!==e&&t.push(e);return t},getPixel:function(t,e,i,n){var r=this.getFrame(i,n);if(r){t-=r.x,e-=r.y;var s=r.data.cut;if(t+=s.x,e+=s.y,t>=s.x&&t<s.r&&e>=s.y&&e<s.b){var a=this._tempContext;a.clearRect(0,0,1,1),a.drawImage(r.source.image,t,e,1,1,0,0,1,1);var h=a.getImageData(0,0,1,1);return new o(h.data[0],h.data[1],h.data[2],h.data[3])}}return null},getPixelAlpha:function(t,e,i,n){var r=this.getFrame(i,n);if(r){t-=r.x,e-=r.y;var s=r.data.cut;if(t+=s.x,e+=s.y,t>=s.x&&t<s.r&&e>=s.y&&e<s.b){var o=this._tempContext;return o.clearRect(0,0,1,1),o.drawImage(r.source.image,t,e,1,1,0,0,1,1),o.getImageData(0,0,1,1).data[3]}}return null},setTexture:function(t,e,i){return this.list[e]&&(t.texture=this.list[e],t.frame=t.texture.get(i)),t},renameTexture:function(t,e){var i=this.get(t);return!(!i||t===e)&&(i.key=e,this.list[e]=i,delete this.list[t],!0)},each:function(t,e){for(var i=[null],n=1;n<arguments.length;n++)i.push(arguments[n]);for(var r in this.list)i[0]=this.list[r],t.apply(e,i)},destroy:function(){for(var t in this.list)this.list[t].destroy();this.list={},this.game=null,n.remove(this._tempCanvas)}});t.exports=m},93369:(t,e,i)=>{var n=i(89429),r=i(47379),s=i(2244),o=i(28425),a=new r({initialize:function(t,e,i,n,r){void 0===r&&(r=!1);var a=t.manager.game;this.renderer=a.renderer,this.texture=t,this.source=e,this.image=e,this.compressionAlgorithm=null,this.resolution=1,this.width=i||e.naturalWidth||e.videoWidth||e.width||0,this.height=n||e.naturalHeight||e.videoHeight||e.height||0,this.scaleMode=o.DEFAULT,this.isCanvas=e instanceof HTMLCanvasElement,this.isVideo=window.hasOwnProperty("HTMLVideoElement")&&e instanceof HTMLVideoElement,this.isRenderTexture="RenderTexture"===e.type,this.isGLTexture=window.hasOwnProperty("WebGLTexture")&&e instanceof WebGLTexture,this.isPowerOf2=s(this.width,this.height),this.glTexture=null,this.flipY=r,this.init(a)},init:function(t){this.renderer&&(this.renderer.gl?this.isCanvas?this.glTexture=this.renderer.createCanvasTexture(this.image,!1,this.flipY):this.isVideo?this.glTexture=this.renderer.createVideoTexture(this.image,!1,this.flipY):this.isRenderTexture?(this.image=this.source.canvas,this.glTexture=this.renderer.createTextureFromSource(null,this.width,this.height,this.scaleMode)):this.isGLTexture?this.glTexture=this.source:this.glTexture=this.renderer.createTextureFromSource(this.image,this.width,this.height,this.scaleMode):this.isRenderTexture&&(this.image=this.source.canvas)),t.config.antialias||this.setFilter(1)},setFilter:function(t){this.renderer.gl&&this.renderer.setTextureFilter(this.glTexture,t),this.scaleMode=t},setFlipY:function(t){return void 0===t&&(t=!0),this.flipY=t,this},update:function(){var t=this.renderer.gl;t&&this.isCanvas?this.glTexture=this.renderer.updateCanvasTexture(this.image,this.glTexture,this.flipY):t&&this.isVideo&&(this.glTexture=this.renderer.updateVideoTexture(this.image,this.glTexture,this.flipY))},destroy:function(){this.glTexture&&this.renderer.deleteTexture(this.glTexture),this.isCanvas&&n.remove(this.image),this.renderer=null,this.texture=null,this.source=null,this.image=null,this.glTexture=null}});t.exports=a},78007:t=>{t.exports={LINEAR:0,NEAREST:1}},26798:t=>{t.exports="addtexture"},47958:t=>{t.exports="onerror"},22589:t=>{t.exports="onload"},30177:t=>{t.exports="ready"},38442:t=>{t.exports="removetexture"},2931:(t,e,i)=>{t.exports={ADD:i(26798),ERROR:i(47958),LOAD:i(22589),READY:i(30177),REMOVE:i(38442)}},1274:(t,e,i)=>{var n=i(80933),r=i(78007),s={CanvasTexture:i(17372),Events:i(2931),FilterMode:r,Frame:i(48165),Parsers:i(63083),Texture:i(71201),TextureManager:i(4907),TextureSource:i(93369)};s=n(!1,s,r),t.exports=s},50321:t=>{t.exports=function(t,e,i){if(i.getElementsByTagName("TextureAtlas")){var n=t.source[e];t.add("__BASE",e,0,0,n.width,n.height);for(var r,s=i.getElementsByTagName("SubTexture"),o=0;o<s.length;o++){var a=s[o].attributes,h=a.name.value,u=parseInt(a.x.value,10),l=parseInt(a.y.value,10),c=parseInt(a.width.value,10),d=parseInt(a.height.value,10);if(r=t.add(h,e,u,l,c,d),a.frameX){var p=Math.abs(parseInt(a.frameX.value,10)),f=Math.abs(parseInt(a.frameY.value,10)),m=parseInt(a.frameWidth.value,10),v=parseInt(a.frameHeight.value,10);r.setTrim(c,d,p,f,m,v)}}return t}console.warn("Invalid Texture Atlas XML given")}},45431:t=>{t.exports=function(t,e){var i=t.source[e];return t.add("__BASE",e,0,0,i.width,i.height),t}},52692:t=>{t.exports=function(t,e){var i=t.source[e];return t.add("__BASE",e,0,0,i.width,i.height),t}},56171:(t,e,i)=>{var n=i(18438);t.exports=function(t,e,i){if(i.frames||i.textures){var r=t.source[e];t.add("__BASE",e,0,0,r.width,r.height);for(var s,o=Array.isArray(i.textures)?i.textures[e].frames:i.frames,a=0;a<o.length;a++){var h=o[a];s=t.add(h.filename,e,h.frame.x,h.frame.y,h.frame.w,h.frame.h),h.trimmed&&s.setTrim(h.sourceSize.w,h.sourceSize.h,h.spriteSourceSize.x,h.spriteSourceSize.y,h.spriteSourceSize.w,h.spriteSourceSize.h),h.rotated&&(s.rotated=!0,s.updateUVsInverted());var u=h.anchor||h.pivot;u&&(s.customPivot=!0,s.pivotX=u.x,s.pivotY=u.y),s.customData=n(h)}for(var l in i)"frames"!==l&&(Array.isArray(i[l])?t.customData[l]=i[l].slice(0):t.customData[l]=i[l]);return t}console.warn("Invalid Texture Atlas JSON Array")}},7396:(t,e,i)=>{var n=i(18438);t.exports=function(t,e,i){if(i.frames){var r=t.source[e];t.add("__BASE",e,0,0,r.width,r.height);var s,o=i.frames;for(var a in o){var h=o[a];s=t.add(a,e,h.frame.x,h.frame.y,h.frame.w,h.frame.h),h.trimmed&&s.setTrim(h.sourceSize.w,h.sourceSize.h,h.spriteSourceSize.x,h.spriteSourceSize.y,h.spriteSourceSize.w,h.spriteSourceSize.h),h.rotated&&(s.rotated=!0,s.updateUVsInverted());var u=h.anchor||h.pivot;u&&(s.customPivot=!0,s.pivotX=u.x,s.pivotY=u.y),s.customData=n(h)}for(var l in i)"frames"!==l&&(Array.isArray(i[l])?t.customData[l]=i[l].slice(0):t.customData[l]=i[l]);return t}console.warn("Invalid Texture Atlas JSON Hash given, missing 'frames' Object")}},77357:(t,e,i)=>{var n=i(81769);t.exports=function(t,e,i,r,s,o,a){var h=n(a,"frameWidth",null),u=n(a,"frameHeight",h);if(null===h)throw new Error("TextureManager.SpriteSheet: Invalid frameWidth given.");var l=t.source[e];t.add("__BASE",e,0,0,l.width,l.height);var c=n(a,"startFrame",0),d=n(a,"endFrame",-1),p=n(a,"margin",0),f=n(a,"spacing",0),m=Math.floor((s-p+f)/(h+f))*Math.floor((o-p+f)/(u+f));0===m&&console.warn("SpriteSheet frame dimensions will result in zero frames."),(c>m||c<-m)&&(c=0),c<0&&(c=m+c),-1!==d&&(m=c+(d+1));for(var v=p,g=p,y=0,_=0,x=0;x<m;x++){y=0,_=0;var b=v+h,w=g+u;b>s&&(y=b-s),w>o&&(_=w-o),t.add(x,e,i+v,r+g,h-y,u-_),(v+=h+f)+h>s&&(v=p,g+=u+f)}return t}},98384:(t,e,i)=>{var n=i(81769);t.exports=function(t,e,i){var r=n(i,"frameWidth",null),s=n(i,"frameHeight",r);if(!r)throw new Error("TextureManager.SpriteSheetFromAtlas: Invalid frameWidth given.");var o=t.source[0];t.add("__BASE",0,0,0,o.width,o.height);var a,h=n(i,"startFrame",0),u=n(i,"endFrame",-1),l=n(i,"margin",0),c=n(i,"spacing",0),d=e.cutX,p=e.cutY,f=e.cutWidth,m=e.cutHeight,v=e.realWidth,g=e.realHeight,y=Math.floor((v-l+c)/(r+c)),_=Math.floor((g-l+c)/(s+c)),x=y*_,b=e.x,w=r-b,T=r-(v-f-b),M=e.y,S=s-M,E=s-(g-m-M);(h>x||h<-x)&&(h=0),h<0&&(h=x+h),-1!==u&&(x=h+(u+1));for(var L=l,A=l,D=0,P=e.sourceIndex,C=0;C<_;C++){for(var O=0===C,k=C===_-1,R=0;R<y;R++){var I=0===R,Y=R===y-1;if(a=t.add(D,P,d+L,p+A,r,s),I||O||Y||k){var F=I?b:0,N=O?M:0,B=0,U=0;I&&(B+=r-w),Y&&(B+=r-T),O&&(U+=s-S),k&&(U+=s-E);var j=r-B,H=s-U;a.cutWidth=j,a.cutHeight=H,a.setTrim(r,s,F,N,j,H)}L+=c,L+=I?w:Y?T:r,D++}L=l,A+=c,A+=O?S:k?E:s}return t}},5519:t=>{var e=0,i=function(t,i,n,r){var s=e-r.y-r.height;t.add(n,i,r.x,s,r.width,r.height)};t.exports=function(t,n,r){var s=t.source[n];t.add("__BASE",n,0,0,s.width,s.height),e=s.height;for(var o=r.split("\n"),a=/^[ ]*(- )*(\w+)+[: ]+(.*)/,h="",u="",l={x:0,y:0,width:0,height:0},c=0;c<o.length;c++){var d=o[c].match(a);if(d){var p="- "===d[1],f=d[2],m=d[3];if(p&&(u!==h&&(i(t,n,u,l),h=u),l={x:0,y:0,width:0,height:0}),"name"!==f)switch(f){case"x":case"y":case"width":case"height":l[f]=parseInt(m,10)}else u=m}}return u!==h&&i(t,n,u,l),t}},63083:(t,e,i)=>{t.exports={AtlasXML:i(50321),Canvas:i(45431),Image:i(52692),JSONArray:i(56171),JSONHash:i(7396),SpriteSheet:i(77357),SpriteSheetFromAtlas:i(98384),UnityYAML:i(5519)}},16092:t=>{t.exports={CSV:0,TILED_JSON:1,ARRAY_2D:2,WELTMEISTER:3}},55191:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n,r,s,o){(void 0===i||i<=0)&&(i=32),(void 0===n||n<=0)&&(n=32),void 0===r&&(r=0),void 0===s&&(s=0),this.name=t,this.firstgid=0|e,this.imageWidth=0|i,this.imageHeight=0|n,this.imageMargin=0|r,this.imageSpacing=0|s,this.properties=o||{},this.images=[],this.total=0},containsImageIndex:function(t){return t>=this.firstgid&&t<this.firstgid+this.total},addImage:function(t,e){return this.images.push({gid:t,image:e}),this.total++,this}});t.exports=n},64157:(t,e,i)=>{var n=i(16092),r=i(92223),s=i(3431),o=i(38634);t.exports=function(t,e,i,a,h,u,l,c){void 0===i&&(i=32),void 0===a&&(a=32),void 0===h&&(h=10),void 0===u&&(u=10),void 0===c&&(c=!1);var d=null;if(Array.isArray(l))d=s(void 0!==e?e:"map",n.ARRAY_2D,l,i,a,c);else if(void 0!==e){var p=t.cache.tilemap.get(e);p?d=s(e,p.format,p.data,i,a,c):console.warn("No map data found for key "+e)}return null===d&&(d=new r({tileWidth:i,tileHeight:a,width:h,height:u})),new o(t,d)}},72751:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(35064),o=new n({Mixins:[r.Alpha,r.Flip,r.Visible],initialize:function(t,e,i,n,r,s,o,a){this.layer=t,this.index=e,this.x=i,this.y=n,this.width=r,this.height=s,this.baseWidth=void 0!==o?o:r,this.baseHeight=void 0!==a?a:s,this.pixelX=0,this.pixelY=0,this.updatePixelXY(),this.properties={},this.rotation=0,this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceLeft=!1,this.faceRight=!1,this.faceTop=!1,this.faceBottom=!1,this.collisionCallback=null,this.collisionCallbackContext=this,this.tint=16777215,this.physics={}},containsPoint:function(t,e){return!(t<this.pixelX||e<this.pixelY||t>this.right||e>this.bottom)},copy:function(t){return this.index=t.index,this.alpha=t.alpha,this.properties=t.properties,this.visible=t.visible,this.setFlip(t.flipX,t.flipY),this.tint=t.tint,this.rotation=t.rotation,this.collideUp=t.collideUp,this.collideDown=t.collideDown,this.collideLeft=t.collideLeft,this.collideRight=t.collideRight,this.collisionCallback=t.collisionCallback,this.collisionCallbackContext=t.collisionCallbackContext,this},getCollisionGroup:function(){return this.tileset?this.tileset.getTileCollisionGroup(this.index):null},getTileData:function(){return this.tileset?this.tileset.getTileData(this.index):null},getLeft:function(t){var e=this.tilemapLayer;return e?e.tileToWorldX(this.x,t):this.x*this.baseWidth},getRight:function(t){var e=this.tilemapLayer;return e?this.getLeft(t)+this.width*e.scaleX:this.getLeft(t)+this.width},getTop:function(t){var e=this.tilemapLayer;return e?e.tileToWorldY(this.y,t)-(this.height-this.baseHeight)*e.scaleY:this.y*this.baseHeight-(this.height-this.baseHeight)},getBottom:function(t){var e=this.tilemapLayer;return e?this.getTop(t)+this.height*e.scaleY:this.getTop(t)+this.height},getBounds:function(t,e){return void 0===e&&(e=new s),e.x=this.getLeft(),e.y=this.getTop(),e.width=this.getRight()-e.x,e.height=this.getBottom()-e.y,e},getCenterX:function(t){return(this.getLeft(t)+this.getRight(t))/2},getCenterY:function(t){return(this.getTop(t)+this.getBottom(t))/2},destroy:function(){this.collisionCallback=void 0,this.collisionCallbackContext=void 0,this.properties=void 0},intersects:function(t,e,i,n){return!(i<=this.pixelX||n<=this.pixelY||t>=this.right||e>=this.bottom)},isInteresting:function(t,e){return t&&e?this.canCollide||this.hasInterestingFace:t?this.collides:!!e&&this.hasInterestingFace},resetCollision:function(t){(void 0===t&&(t=!0),this.collideLeft=!1,this.collideRight=!1,this.collideUp=!1,this.collideDown=!1,this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,t)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},resetFaces:function(){return this.faceTop=!1,this.faceBottom=!1,this.faceLeft=!1,this.faceRight=!1,this},setCollision:function(t,e,i,n,r){(void 0===e&&(e=t),void 0===i&&(i=t),void 0===n&&(n=t),void 0===r&&(r=!0),this.collideLeft=t,this.collideRight=e,this.collideUp=i,this.collideDown=n,this.faceLeft=t,this.faceRight=e,this.faceTop=i,this.faceBottom=n,r)&&(this.tilemapLayer&&this.tilemapLayer.calculateFacesAt(this.x,this.y));return this},setCollisionCallback:function(t,e){return null===t?(this.collisionCallback=void 0,this.collisionCallbackContext=void 0):(this.collisionCallback=t,this.collisionCallbackContext=e),this},setSize:function(t,e,i,n){return void 0!==t&&(this.width=t),void 0!==e&&(this.height=e),void 0!==i&&(this.baseWidth=i),void 0!==n&&(this.baseHeight=n),this.updatePixelXY(),this},updatePixelXY:function(){return this.pixelX=this.x*this.baseWidth,this.pixelY=this.y*this.baseHeight,this},canCollide:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown||this.collisionCallback}},collides:{get:function(){return this.collideLeft||this.collideRight||this.collideUp||this.collideDown}},hasInterestingFace:{get:function(){return this.faceTop||this.faceBottom||this.faceLeft||this.faceRight}},tileset:{get:function(){var t=this.layer.tilemapLayer;if(t){var e=t.gidMap[this.index];if(e)return e}return null}},tilemapLayer:{get:function(){return this.layer.tilemapLayer}},tilemap:{get:function(){var t=this.tilemapLayer;return t?t.tilemap:null}}});t.exports=o},38634:(t,e,i)=>{var n=i(47379),r=i(98436),s=i(54805),o=i(80933),a=i(16092),h=i(24736),u=i(10461),l=i(75670),c=i(41856),d=i(72751),p=i(66894),f=i(10929),m=new n({initialize:function(t,e){this.scene=t,this.tileWidth=e.tileWidth,this.tileHeight=e.tileHeight,this.width=e.width,this.height=e.height,this.orientation=e.orientation,this.renderOrder=e.renderOrder,this.format=e.format,this.version=e.version,this.properties=e.properties,this.widthInPixels=e.widthInPixels,this.heightInPixels=e.heightInPixels,this.imageCollections=e.imageCollections,this.images=e.images,this.layers=e.layers,this.tilesets=e.tilesets,this.objects=e.objects,this.currentLayerIndex=0},setRenderOrder:function(t){var e=["right-down","left-down","right-up","left-up"];return"number"==typeof t&&(t=e[t]),e.indexOf(t)>-1&&(this.renderOrder=t),this},addTilesetImage:function(t,e,i,n,r,s,o){if(void 0===t)return null;if(null==e&&(e=t),!this.scene.sys.textures.exists(e))return console.warn("Invalid Tileset Image: "+e),null;var h=this.scene.sys.textures.get(e),u=this.getTilesetIndex(t);if(null===u&&this.format===a.TILED_JSON)return console.warn("No data found for Tileset: "+t),null;var l=this.tilesets[u];return l?(l.setTileSize(i,n),l.setSpacing(r,s),l.setImage(h),l):(void 0===i&&(i=this.tileWidth),void 0===n&&(n=this.tileHeight),void 0===r&&(r=0),void 0===s&&(s=0),void 0===o&&(o=0),(l=new f(t,o,i,n,r,s)).setImage(h),this.tilesets.push(l),l)},convertLayerToStatic:function(t){if(null===(t=this.getLayer(t)))return null;var e=t.tilemapLayer;if(!(e&&e instanceof s))return null;var i=new c(e.scene,e.tilemap,e.layerIndex,e.tileset,e.x,e.y);return this.scene.sys.displayList.add(i),e.destroy(),i},copy:function(t,e,i,n,r,s,o,a){return a=this.getLayer(a),this._isStaticCall(a,"copy")?this:null!==a?(p.Copy(t,e,i,n,r,s,o,a),this):null},createBlankDynamicLayer:function(t,e,i,n,r,o,a,u){if(void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=this.width),void 0===o&&(o=this.height),void 0===a&&(a=this.tileWidth),void 0===u&&(u=this.tileHeight),null!==this.getLayerIndex(t))return console.warn("Invalid Tilemap Layer ID: "+t),null;for(var l,c=new h({name:t,tileWidth:a,tileHeight:u,width:r,height:o}),p=0;p<o;p++){l=[];for(var f=0;f<r;f++)l.push(new d(c,-1,f,p,a,u,this.tileWidth,this.tileHeight));c.data.push(l)}this.layers.push(c),this.currentLayerIndex=this.layers.length-1;var m=new s(this.scene,this,this.currentLayerIndex,e,i,n);return m.setRenderOrder(this.renderOrder),this.scene.sys.displayList.add(m),m},createDynamicLayer:function(t,e,i,n){var r=this.getLayerIndex(t);if(null===r)return console.warn("Invalid Tilemap Layer ID: "+t),"string"==typeof t&&console.warn("Valid tilelayer names:\n\t"+this.getTileLayerNames().join(",\n\t")),null;var o=this.layers[r];if(o.tilemapLayer)return console.warn("Tilemap Layer ID already exists:"+t),null;this.currentLayerIndex=r,void 0===i&&(i=o.x),void 0===n&&(n=o.y);var a=new s(this.scene,this,r,e,i,n);return a.setRenderOrder(this.renderOrder),this.scene.sys.displayList.add(a),a},createFromObjects:function(t,e,i,n){void 0===i&&(i={}),void 0===n&&(n=this.scene);var s=this.getObjectLayer(t);if(!s)return console.warn("Cannot create from object. Invalid objectgroup name given: "+t),"string"==typeof layerID&&console.warn("Valid objectgroup names:\n\t"+this.getObjectLayerNames().join(",\n\t")),null;for(var a=s.objects,h=[],l=0;l<a.length;l++){var c=!1,d=a[l];if((void 0!==d.gid&&"number"==typeof e&&d.gid===e||void 0!==d.id&&"number"==typeof e&&d.id===e||void 0!==d.name&&"string"==typeof e&&d.name===e)&&(c=!0),c){var p=o({},i,d.properties);p.x=d.x,p.y=d.y;var f=n.make.sprite(p);f.name=d.name,d.width&&(f.displayWidth=d.width),d.height&&(f.displayHeight=d.height);var m={x:f.originX*d.width,y:(f.originY-1)*d.height};if(d.rotation){var v=r(d.rotation);u(m,v),f.rotation=v}for(var g in f.x+=m.x,f.y+=m.y,void 0===d.flippedHorizontal&&void 0===d.flippedVertical||f.setFlip(d.flippedHorizontal,d.flippedVertical),d.visible||(f.visible=!1),d.properties)f.hasOwnProperty(g)||f.setData(g,d.properties[g]);h.push(f)}}return h},createFromTiles:function(t,e,i,n,r,s){return null===(s=this.getLayer(s))?null:p.CreateFromTiles(t,e,i,n,r,s)},createStaticLayer:function(t,e,i,n){var r=this.getLayerIndex(t);if(null===r)return console.warn("Invalid Tilemap Layer ID: "+t),"string"==typeof t&&console.warn("Valid tilelayer names:\n\t"+this.getTileLayerNames().join(",\n\t")),null;if(this.layers[r].tilemapLayer)return console.warn("Tilemap Layer ID already exists:"+t),null;this.currentLayerIndex=r,void 0===i&&this.layers[r].x&&(i=this.layers[r].x),void 0===n&&this.layers[r].y&&(n=this.layers[r].y);var s=new c(this.scene,this,r,e,i,n);return s.setRenderOrder(this.renderOrder),this.scene.sys.displayList.add(s),s},destroy:function(){this.removeAllLayers(),this.tilesets.length=0,this.objects.length=0,this.scene=void 0},fill:function(t,e,i,n,r,s,o){return null===(o=this.getLayer(o))?null:(this._isStaticCall(o,"fill")||p.Fill(t,e,i,n,r,s,o),this)},filterObjects:function(t,e,i){if("string"==typeof t){var n=t;if(!(t=this.getObjectLayer(t)))return console.warn("No object layer found with the name: "+n),null}return t.objects.filter(e,i)},filterTiles:function(t,e,i,n,r,s,o,a){return null===(a=this.getLayer(a))?null:p.FilterTiles(t,e,i,n,r,s,o,a)},findByIndex:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.FindByIndex(t,e,i,n)},findObject:function(t,e,i){if("string"==typeof t){var n=t;if(!(t=this.getObjectLayer(t)))return console.warn("No object layer found with the name: "+n),null}return t.objects.find(e,i)||null},findTile:function(t,e,i,n,r,s,o,a){return null===(a=this.getLayer(a))?null:p.FindTile(t,e,i,n,r,s,o,a)},forEachTile:function(t,e,i,n,r,s,o,a){return null===(a=this.getLayer(a))?null:(p.ForEachTile(t,e,i,n,r,s,o,a),this)},getImageIndex:function(t){return this.getIndex(this.images,t)},getImageLayerNames:function(){return this.images&&Array.isArray(this.images)?this.images.map((function(t){return t.name})):[]},getIndex:function(t,e){for(var i=0;i<t.length;i++)if(t[i].name===e)return i;return null},getLayer:function(t){var e=this.getLayerIndex(t);return null!==e?this.layers[e]:null},getObjectLayer:function(t){var e=this.getIndex(this.objects,t);return null!==e?this.objects[e]:null},getObjectLayerNames:function(){return this.objects&&Array.isArray(this.objects)?this.objects.map((function(t){return t.name})):[]},getLayerIndex:function(t){return void 0===t?this.currentLayerIndex:"string"==typeof t?this.getLayerIndexByName(t):"number"==typeof t&&t<this.layers.length?t:t instanceof c||t instanceof s?t.layerIndex:null},getLayerIndexByName:function(t){return this.getIndex(this.layers,t)},getTileAt:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.GetTileAt(t,e,i,n)},getTileAtWorldXY:function(t,e,i,n,r){return null===(r=this.getLayer(r))?null:p.GetTileAtWorldXY(t,e,i,n,r)},getTileLayerNames:function(){return this.layers&&Array.isArray(this.layers)?this.layers.map((function(t){return t.name})):[]},getTilesWithin:function(t,e,i,n,r,s){return null===(s=this.getLayer(s))?null:p.GetTilesWithin(t,e,i,n,r,s)},getTilesWithinShape:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.GetTilesWithinShape(t,e,i,n)},getTilesWithinWorldXY:function(t,e,i,n,r,s,o){return null===(o=this.getLayer(o))?null:p.GetTilesWithinWorldXY(t,e,i,n,r,s,o)},getTileset:function(t){var e=this.getIndex(this.tilesets,t);return null!==e?this.tilesets[e]:null},getTilesetIndex:function(t){return this.getIndex(this.tilesets,t)},hasTileAt:function(t,e,i){return null===(i=this.getLayer(i))?null:p.HasTileAt(t,e,i)},hasTileAtWorldXY:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.HasTileAtWorldXY(t,e,i,n)},layer:{get:function(){return this.layers[this.currentLayerIndex]},set:function(t){this.setLayer(t)}},putTileAt:function(t,e,i,n,r){return r=this.getLayer(r),this._isStaticCall(r,"putTileAt")||null===r?null:p.PutTileAt(t,e,i,n,r)},putTileAtWorldXY:function(t,e,i,n,r,s){return s=this.getLayer(s),this._isStaticCall(s,"putTileAtWorldXY")||null===s?null:p.PutTileAtWorldXY(t,e,i,n,r,s)},putTilesAt:function(t,e,i,n,r){return r=this.getLayer(r),this._isStaticCall(r,"putTilesAt")?this:null===r?null:(p.PutTilesAt(t,e,i,n,r),this)},randomize:function(t,e,i,n,r,s){return s=this.getLayer(s),this._isStaticCall(s,"randomize")?this:null===s?null:(p.Randomize(t,e,i,n,r,s),this)},calculateFacesAt:function(t,e,i){return null===(i=this.getLayer(i))?null:(p.CalculateFacesAt(t,e,i),this)},calculateFacesWithin:function(t,e,i,n,r){return null===(r=this.getLayer(r))?null:(p.CalculateFacesWithin(t,e,i,n,r),this)},removeLayer:function(t){var e=this.getLayerIndex(t);if(null!==e){l(this.layers,e);for(var i=e;i<this.layers.length;i++)this.layers[i].tilemapLayer&&this.layers[i].tilemapLayer.layerIndex--;return this.currentLayerIndex===e&&(this.currentLayerIndex=0),this}return null},destroyLayer:function(t){var e=this.getLayerIndex(t);return null!==e?((t=this.layers[e]).destroy(),l(this.layers,e),this.currentLayerIndex===e&&(this.currentLayerIndex=0),this):null},removeAllLayers:function(){for(var t=this.layers,e=0;e<t.length;e++)t[e].tilemapLayer&&t[e].tilemapLayer.destroy(!1);return t.length=0,this.currentLayerIndex=0,this},removeTile:function(t,e,i){void 0===e&&(e=-1),void 0===i&&(i=!0);var n=[];Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var s=t[r];n.push(this.removeTileAt(s.x,s.y,!0,i,s.tilemapLayer)),e>-1&&this.putTileAt(e,s.x,s.y,i,s.tilemapLayer)}return n},removeTileAt:function(t,e,i,n,r){return r=this.getLayer(r),this._isStaticCall(r,"removeTileAt")||null===r?null:p.RemoveTileAt(t,e,i,n,r)},removeTileAtWorldXY:function(t,e,i,n,r,s){return s=this.getLayer(s),this._isStaticCall(s,"removeTileAtWorldXY")||null===s?null:p.RemoveTileAtWorldXY(t,e,i,n,r,s)},renderDebug:function(t,e,i){return null===(i=this.getLayer(i))?null:(p.RenderDebug(t,e,i),this)},renderDebugFull:function(t,e){for(var i=this.layers,n=0;n<i.length;n++)p.RenderDebug(t,e,i[n]);return this},replaceByIndex:function(t,e,i,n,r,s,o){return o=this.getLayer(o),this._isStaticCall(o,"replaceByIndex")?this:null===o?null:(p.ReplaceByIndex(t,e,i,n,r,s,o),this)},setCollision:function(t,e,i,n,r){return null===(n=this.getLayer(n))?null:(p.SetCollision(t,e,i,n,r),this)},setCollisionBetween:function(t,e,i,n,r){return null===(r=this.getLayer(r))?null:(p.SetCollisionBetween(t,e,i,n,r),this)},setCollisionByProperty:function(t,e,i,n){return null===(n=this.getLayer(n))?null:(p.SetCollisionByProperty(t,e,i,n),this)},setCollisionByExclusion:function(t,e,i,n){return null===(n=this.getLayer(n))?null:(p.SetCollisionByExclusion(t,e,i,n),this)},setCollisionFromCollisionGroup:function(t,e,i){return null===(i=this.getLayer(i))?null:(p.SetCollisionFromCollisionGroup(t,e,i),this)},setTileIndexCallback:function(t,e,i,n){return null===(n=this.getLayer(n))?null:(p.SetTileIndexCallback(t,e,i,n),this)},setTileLocationCallback:function(t,e,i,n,r,s,o){return null===(o=this.getLayer(o))?null:(p.SetTileLocationCallback(t,e,i,n,r,s,o),this)},setLayer:function(t){var e=this.getLayerIndex(t);return null!==e&&(this.currentLayerIndex=e),this},setBaseTileSize:function(t,e){this.tileWidth=t,this.tileHeight=e,this.widthInPixels=this.width*t,this.heightInPixels=this.height*e;for(var i=0;i<this.layers.length;i++){this.layers[i].baseTileWidth=t,this.layers[i].baseTileHeight=e;for(var n=this.layers[i].data,r=this.layers[i].width,s=this.layers[i].height,o=0;o<s;o++)for(var a=0;a<r;a++){var h=n[o][a];null!==h&&h.setSize(void 0,void 0,t,e)}}return this},setLayerTileSize:function(t,e,i){if(null===(i=this.getLayer(i)))return this;i.tileWidth=t,i.tileHeight=e;for(var n=i.data,r=i.width,s=i.height,o=0;o<s;o++)for(var a=0;a<r;a++){var h=n[o][a];null!==h&&h.setSize(t,e)}return this},shuffle:function(t,e,i,n,r){return r=this.getLayer(r),this._isStaticCall(r,"shuffle")?this:null===r?null:(p.Shuffle(t,e,i,n,r),this)},swapByIndex:function(t,e,i,n,r,s,o){return o=this.getLayer(o),this._isStaticCall(o,"swapByIndex")?this:null===o?null:(p.SwapByIndex(t,e,i,n,r,s,o),this)},tileToWorldX:function(t,e,i){return null===(i=this.getLayer(i))?null:p.TileToWorldX(t,e,i)},tileToWorldY:function(t,e,i){return null===(i=this.getLayer(i))?null:p.TileToWorldY(t,e,i)},tileToWorldXY:function(t,e,i,n,r){return null===(r=this.getLayer(r))?null:p.TileToWorldXY(t,e,i,n,r)},weightedRandomize:function(t,e,i,n,r,s){return s=this.getLayer(s),this._isStaticCall(s,"weightedRandomize")?this:null===s?null:(p.WeightedRandomize(t,e,i,n,r,s),this)},worldToTileX:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.WorldToTileX(t,e,i,n)},worldToTileY:function(t,e,i,n){return null===(n=this.getLayer(n))?null:p.WorldToTileY(t,e,i,n)},worldToTileXY:function(t,e,i,n,r,s){return null===(s=this.getLayer(s))?null:p.WorldToTileXY(t,e,i,n,r,s)},_isStaticCall:function(t,e){return t.tilemapLayer instanceof c&&(console.warn(e+": You cannot change the tiles in a static tilemap layer"),!0)}});t.exports=m},72797:(t,e,i)=>{var n=i(17517),r=i(64157);n.register("tilemap",(function(t){var e=void 0!==t?t:{};return r(this.scene,e.key,e.tileWidth,e.tileHeight,e.width,e.height,e.data,e.insertNull)}))},801:(t,e,i)=>{var n=i(81342),r=i(64157);n.register("tilemap",(function(t,e,i,n,s,o,a){return null===t&&(t=void 0),null===e&&(e=void 0),null===i&&(i=void 0),null===n&&(n=void 0),null===s&&(s=void 0),r(this.scene,t,e,i,n,s,o,a)}))},10929:(t,e,i)=>{var n=new(i(47379))({initialize:function(t,e,i,n,r,s,o,a){(void 0===i||i<=0)&&(i=32),(void 0===n||n<=0)&&(n=32),void 0===r&&(r=0),void 0===s&&(s=0),void 0===o&&(o={}),void 0===a&&(a={}),this.name=t,this.firstgid=e,this.tileWidth=i,this.tileHeight=n,this.tileMargin=r,this.tileSpacing=s,this.tileProperties=o,this.tileData=a,this.image=null,this.glTexture=null,this.rows=0,this.columns=0,this.total=0,this.texCoordinates=[]},getTileProperties:function(t){return this.containsTileIndex(t)?this.tileProperties[t-this.firstgid]:null},getTileData:function(t){return this.containsTileIndex(t)?this.tileData[t-this.firstgid]:null},getTileCollisionGroup:function(t){var e=this.getTileData(t);return e&&e.objectgroup?e.objectgroup:null},containsTileIndex:function(t){return t>=this.firstgid&&t<this.firstgid+this.total},getTileTextureCoordinates:function(t){return this.containsTileIndex(t)?this.texCoordinates[t-this.firstgid]:null},setImage:function(t){return this.image=t,this.glTexture=t.get().source.glTexture,this.updateTileData(this.image.source[0].width,this.image.source[0].height),this},setTileSize:function(t,e){return void 0!==t&&(this.tileWidth=t),void 0!==e&&(this.tileHeight=e),this.image&&this.updateTileData(this.image.source[0].width,this.image.source[0].height),this},setSpacing:function(t,e){return void 0!==t&&(this.tileMargin=t),void 0!==e&&(this.tileSpacing=e),this.image&&this.updateTileData(this.image.source[0].width,this.image.source[0].height),this},updateTileData:function(t,e){var i=(e-2*this.tileMargin+this.tileSpacing)/(this.tileHeight+this.tileSpacing),n=(t-2*this.tileMargin+this.tileSpacing)/(this.tileWidth+this.tileSpacing);i%1==0&&n%1==0||console.warn("Image tile area not tile size multiple in: "+this.name),i=Math.floor(i),n=Math.floor(n),this.rows=i,this.columns=n,this.total=i*n,this.texCoordinates.length=0;for(var r=this.tileMargin,s=this.tileMargin,o=0;o<this.rows;o++){for(var a=0;a<this.columns;a++)this.texCoordinates.push({x:r,y:s}),r+=this.tileWidth+this.tileSpacing;r=this.tileMargin,s+=this.tileHeight+this.tileSpacing}return this}});t.exports=n},31304:(t,e,i)=>{var n=i(68626);t.exports=function(t,e,i){var r=n(t,e,!0,i),s=n(t,e-1,!0,i),o=n(t,e+1,!0,i),a=n(t-1,e,!0,i),h=n(t+1,e,!0,i),u=r&&r.collides;return u&&(r.faceTop=!0,r.faceBottom=!0,r.faceLeft=!0,r.faceRight=!0),s&&s.collides&&(u&&(r.faceTop=!1),s.faceBottom=!u),o&&o.collides&&(u&&(r.faceBottom=!1),o.faceTop=!u),a&&a.collides&&(u&&(r.faceLeft=!1),a.faceRight=!u),h&&h.collides&&(u&&(r.faceRight=!1),h.faceLeft=!u),r&&!r.collides&&r.resetFaces(),r}},39968:(t,e,i)=>{var n=i(68626),r=i(87405);t.exports=function(t,e,i,s,o){for(var a=null,h=null,u=null,l=null,c=r(t,e,i,s,null,o),d=0;d<c.length;d++){var p=c[d];p&&(p.collides?(a=n(p.x,p.y-1,!0,o),h=n(p.x,p.y+1,!0,o),u=n(p.x-1,p.y,!0,o),l=n(p.x+1,p.y,!0,o),p.faceTop=!a||!a.collides,p.faceBottom=!h||!h.collides,p.faceLeft=!u||!u.collides,p.faceRight=!l||!l.collides):p.resetFaces())}}},64779:(t,e,i)=>{var n=i(87405),r=i(39968);t.exports=function(t,e,i,s,o,a,h,u){t<0&&(t=0),e<0&&(e=0),void 0===h&&(h=!0);for(var l=n(t,e,i,s,null,u),c=o-t,d=a-e,p=0;p<l.length;p++){var f=l[p].x+c,m=l[p].y+d;f>=0&&f<u.width&&m>=0&&m<u.height&&u.data[m][f]&&u.data[m][f].copy(l[p])}h&&r(o-1,a-1,i+2,s+2,u)}},42752:(t,e,i)=>{var n=i(41058),r=i(76935),s=i(87405),o=i(13375);t.exports=function(t,e,i,a,h,u){void 0===i&&(i={}),Array.isArray(t)||(t=[t]);var l=u.tilemapLayer;void 0===a&&(a=l.scene),void 0===h&&(h=a.cameras.main);var c,d=s(0,0,u.width,u.height,null,u),p=[];for(c=0;c<d.length;c++){var f=d[c];if(-1!==t.indexOf(f.index)){i.x=n(f.x,h,u),i.y=r(f.y,h,u);var m=a.make.sprite(i);p.push(m)}}if("number"==typeof e)for(c=0;c<t.length;c++)o(t[c],e,0,0,u.width,u.height,u);else if(Array.isArray(e))for(c=0;c<t.length;c++)o(t[c],e[c],0,0,u.width,u.height,u);return p}},12567:(t,e,i)=>{var n=i(88168),r=i(70346);t.exports=function(t,e,i,s){void 0===i&&(i=[]),void 0===s&&(s=0),i.length=0;var o,a,h,u=t.tilemapLayer.tilemap,l=t.tilemapLayer,c=t.data,d=t.width,p=t.height,f=Math.floor(u.tileWidth*l.scaleX),m=Math.floor(u.tileHeight*l.scaleY),v=0,g=d,y=0,_=p;if(!l.skipCull&&1===l.scrollFactorX&&1===l.scrollFactorY){var x=n(e.worldView.x-l.x,f,0,!0)-l.cullPaddingX,b=r(e.worldView.right-l.x,f,0,!0)+l.cullPaddingX,w=n(e.worldView.y-l.y,m,0,!0)-l.cullPaddingY,T=r(e.worldView.bottom-l.y,m,0,!0)+l.cullPaddingY;v=Math.max(0,x),g=Math.min(d,b),y=Math.max(0,w),_=Math.min(p,T)}if(0===s)for(a=y;a<_;a++)for(o=v;c[a]&&o<g;o++)(h=c[a][o])&&-1!==h.index&&h.visible&&0!==h.alpha&&i.push(h);else if(1===s)for(a=y;a<_;a++)for(o=g;c[a]&&o>=v;o--)(h=c[a][o])&&-1!==h.index&&h.visible&&0!==h.alpha&&i.push(h);else if(2===s)for(a=_;a>=y;a--)for(o=v;c[a]&&o<g;o++)(h=c[a][o])&&-1!==h.index&&h.visible&&0!==h.alpha&&i.push(h);else if(3===s)for(a=_;a>=y;a--)for(o=g;c[a]&&o>=v;o--)(h=c[a][o])&&-1!==h.index&&h.visible&&0!==h.alpha&&i.push(h);return l.tilesDrawn=i.length,l.tilesTotal=d*p,i}},88904:(t,e,i)=>{var n=i(87405),r=i(39968),s=i(23562);t.exports=function(t,e,i,o,a,h,u){for(var l=-1!==u.collideIndexes.indexOf(t),c=n(e,i,o,a,null,u),d=0;d<c.length;d++)c[d].index=t,s(c[d],l);h&&r(e-1,i-1,o+2,a+2,u)}},65204:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a,h){return n(i,r,s,o,a,h).filter(t,e)}},87916:t=>{t.exports=function(t,e,i,n){void 0===e&&(e=0),void 0===i&&(i=!1);var r,s,o,a=0;if(i){for(s=n.height-1;s>=0;s--)for(r=n.width-1;r>=0;r--)if((o=n.data[s][r])&&o.index===t){if(a===e)return o;a+=1}}else for(s=0;s<n.height;s++)for(r=0;r<n.width;r++)if((o=n.data[s][r])&&o.index===t){if(a===e)return o;a+=1}return null}},68548:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a,h){return n(i,r,s,o,a,h).find(t,e)||null}},25400:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a,h){n(i,r,s,o,a,h).forEach(t,e)}},68626:(t,e,i)=>{var n=i(66049);t.exports=function(t,e,i,r){if(void 0===i&&(i=!1),n(t,e,r)){var s=r.data[e][t]||null;return null===s?null:-1===s.index?i?s:null:s}return null}},18177:(t,e,i)=>{var n=i(68626),r=i(48117),s=i(70079);t.exports=function(t,e,i,o,a){var h=r(t,!0,o,a),u=s(e,!0,o,a);return n(h,u,i,a)}},87405:(t,e,i)=>{var n=i(81769);t.exports=function(t,e,i,r,s,o){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=o.width),void 0===r&&(r=o.height);var a=n(s,"isNotEmpty",!1),h=n(s,"isColliding",!1),u=n(s,"hasInterestingFace",!1);t<0&&(i+=t,t=0),e<0&&(r+=e,e=0),t+i>o.width&&(i=Math.max(o.width-t,0)),e+r>o.height&&(r=Math.max(o.height-e,0));for(var l=[],c=e;c<e+r;c++)for(var d=t;d<t+i;d++){var p=o.data[c][d];if(null!==p){if(a&&-1===p.index)continue;if(h&&!p.collides)continue;if(u&&!p.hasInterestingFace)continue;l.push(p)}}return l}},6316:(t,e,i)=>{var n=i(96285),r=i(87405),s=i(60583),o=i(49035),a=i(41058),h=i(76935),u=i(48117),l=i(70079),c=function(t,e){return s.RectangleToTriangle(e,t)};t.exports=function(t,e,i,d){if(void 0===t)return[];var p=o;t instanceof n.Circle?p=s.CircleToRectangle:t instanceof n.Rectangle?p=s.RectangleToRectangle:t instanceof n.Triangle?p=c:t instanceof n.Line&&(p=s.LineToRectangle);var f=u(t.left,!0,i,d),m=l(t.top,!0,i,d),v=Math.ceil(u(t.right,!1,i,d)),g=Math.ceil(l(t.bottom,!1,i,d)),y=Math.max(v-f,1),_=Math.max(g-m,1),x=r(f,m,y,_,e,d),b=d.tileWidth,w=d.tileHeight;d.tilemapLayer&&(b*=d.tilemapLayer.scaleX,w*=d.tilemapLayer.scaleY);for(var T=[],M=new n.Rectangle(0,0,b,w),S=0;S<x.length;S++){var E=x[S];M.x=a(E.x,i,d),M.y=h(E.y,i,d),p(t,M)&&T.push(E)}return T}},6348:(t,e,i)=>{var n=i(87405),r=i(48117),s=i(70079);t.exports=function(t,e,i,o,a,h,u){var l=r(t,!0,h,u),c=s(e,!0,h,u),d=Math.ceil(r(t+i,!1,h,u)),p=Math.ceil(s(e+o,!1,h,u));return n(l,c,d-l,p-c,a,u)}},2458:(t,e,i)=>{var n=i(66049);t.exports=function(t,e,i){if(n(t,e,i)){var r=i.data[e][t];return null!==r&&r.index>-1}return!1}},81818:(t,e,i)=>{var n=i(2458),r=i(48117),s=i(70079);t.exports=function(t,e,i,o){var a=r(t,!0,i,o),h=s(e,!0,i,o);return n(a,h,o)}},66049:t=>{t.exports=function(t,e,i){return t>=0&&t<i.width&&e>=0&&e<i.height}},54022:(t,e,i)=>{var n=i(72751),r=i(66049),s=i(31304),o=i(23562);t.exports=function(t,e,i,a,h){if(!r(e,i,h))return null;void 0===a&&(a=!0);var u=h.data[i][e],l=u&&u.collides;if(t instanceof n)null===h.data[i][e]&&(h.data[i][e]=new n(h,t.index,e,i,t.width,t.height)),h.data[i][e].copy(t);else{var c=t;null===h.data[i][e]?h.data[i][e]=new n(h,c,e,i,h.tileWidth,h.tileHeight):h.data[i][e].index=c}var d=h.data[i][e],p=-1!==h.collideIndexes.indexOf(d.index);return o(d,p),a&&l!==d.collides&&s(e,i,h),d}},30912:(t,e,i)=>{var n=i(54022),r=i(48117),s=i(70079);t.exports=function(t,e,i,o,a,h){var u=r(e,!0,a,h),l=s(i,!0,a,h);return n(t,u,l,o,h)}},82541:(t,e,i)=>{var n=i(39968),r=i(54022);t.exports=function(t,e,i,s,o){if(!Array.isArray(t))return null;void 0===s&&(s=!0),Array.isArray(t[0])||(t=[t]);for(var a=t.length,h=t[0].length,u=0;u<a;u++)for(var l=0;l<h;l++){var c=t[u][l];r(c,e+l,i+u,!1,o)}s&&n(e-1,i-1,h+2,a+2,o)}},82558:(t,e,i)=>{var n=i(87405),r=i(51750);t.exports=function(t,e,i,s,o,a){var h,u=n(t,e,i,s,null,a);if(void 0===o)for(o=[],h=0;h<u.length;h++)-1===o.indexOf(u[h].index)&&o.push(u[h].index);for(h=0;h<u.length;h++)u[h].index=r(o)}},28960:(t,e,i)=>{var n=i(72751),r=i(66049),s=i(31304);t.exports=function(t,e,i,o,a){if(void 0===i&&(i=!1),void 0===o&&(o=!0),!r(t,e,a))return null;var h=a.data[e][t];return h?(a.data[e][t]=i?null:new n(a,-1,t,e,h.width,h.height),o&&h&&h.collides&&s(t,e,a),h):null}},61605:(t,e,i)=>{var n=i(28960),r=i(48117),s=i(70079);t.exports=function(t,e,i,o,a,h){var u=r(t,!0,a,h),l=s(e,!0,a,h);return n(u,l,i,o,h)}},78287:(t,e,i)=>{var n=i(87405),r=i(82532),s=new r(105,210,231,150),o=new r(243,134,48,200),a=new r(40,39,37,150);t.exports=function(t,e,i){void 0===e&&(e={});var r=void 0!==e.tileColor?e.tileColor:s,h=void 0!==e.collidingTileColor?e.collidingTileColor:o,u=void 0!==e.faceColor?e.faceColor:a,l=n(0,0,i.width,i.height,null,i);t.translateCanvas(i.tilemapLayer.x,i.tilemapLayer.y),t.scaleCanvas(i.tilemapLayer.scaleX,i.tilemapLayer.scaleY);for(var c=0;c<l.length;c++){var d=l[c],p=d.width,f=d.height,m=d.pixelX,v=d.pixelY,g=d.collides?h:r;null!==g&&(t.fillStyle(g.color,g.alpha/255),t.fillRect(m,v,p,f)),m+=1,v+=1,p-=2,f-=2,null!==u&&(t.lineStyle(1,u.color,u.alpha/255),d.faceTop&&t.lineBetween(m,v,m+p,v),d.faceRight&&t.lineBetween(m+p,v,m+p,v+f),d.faceBottom&&t.lineBetween(m,v+f,m+p,v+f),d.faceLeft&&t.lineBetween(m,v,m,v+f))}}},13375:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a){for(var h=n(i,r,s,o,null,a),u=0;u<h.length;u++)h[u]&&h[u].index===t&&(h[u].index=e)}},66244:(t,e,i)=>{var n=i(23562),r=i(39968),s=i(559);t.exports=function(t,e,i,o,a){void 0===e&&(e=!0),void 0===i&&(i=!0),Array.isArray(t)||(t=[t]),void 0===a&&(a=!0);for(var h=0;h<t.length;h++)s(t[h],e,o);if(a)for(var u=0;u<o.height;u++)for(var l=0;l<o.width;l++){var c=o.data[u][l];c&&-1!==t.indexOf(c.index)&&n(c,e)}i&&r(0,0,o.width,o.height,o)}},49823:(t,e,i)=>{var n=i(23562),r=i(39968),s=i(559);t.exports=function(t,e,i,o,a,h){if(void 0===i&&(i=!0),void 0===o&&(o=!0),void 0===h&&(h=!0),!(t>e)){for(var u=t;u<=e;u++)s(u,i,a);if(h)for(var l=0;l<a.height;l++)for(var c=0;c<a.width;c++){var d=a.data[l][c];d&&d.index>=t&&d.index<=e&&n(d,i)}o&&r(0,0,a.width,a.height,a)}}},7836:(t,e,i)=>{var n=i(23562),r=i(39968),s=i(559);t.exports=function(t,e,i,o){void 0===e&&(e=!0),void 0===i&&(i=!0),Array.isArray(t)||(t=[t]);for(var a=0;a<o.height;a++)for(var h=0;h<o.width;h++){var u=o.data[a][h];u&&-1===t.indexOf(u.index)&&(n(u,e),s(u.index,e,o))}i&&r(0,0,o.width,o.height,o)}},56705:(t,e,i)=>{var n=i(23562),r=i(39968),s=i(64036);t.exports=function(t,e,i,o){void 0===e&&(e=!0),void 0===i&&(i=!0);for(var a=0;a<o.height;a++)for(var h=0;h<o.width;h++){var u=o.data[a][h];if(u)for(var l in t)if(s(u.properties,l)){var c=t[l];Array.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++)u.properties[l]===c[d]&&n(u,e)}}i&&r(0,0,o.width,o.height,o)}},4385:(t,e,i)=>{var n=i(23562),r=i(39968);t.exports=function(t,e,i){void 0===t&&(t=!0),void 0===e&&(e=!0);for(var s=0;s<i.height;s++)for(var o=0;o<i.width;o++){var a=i.data[s][o];if(a){var h=a.getCollisionGroup();h&&h.objects&&h.objects.length>0&&n(a,t)}}e&&r(0,0,i.width,i.height,i)}},559:t=>{t.exports=function(t,e,i){var n=i.collideIndexes.indexOf(t);e&&-1===n?i.collideIndexes.push(t):e||-1===n||i.collideIndexes.splice(n,1)}},23562:t=>{t.exports=function(t,e){e?t.setCollision(!0,!0,!0,!0,!1):t.resetCollision(!1)}},71658:t=>{t.exports=function(t,e,i,n){if("number"==typeof t)n.callbacks[t]=null!==e?{callback:e,callbackContext:i}:void 0;else for(var r=0,s=t.length;r<s;r++)n.callbacks[t[r]]=null!==e?{callback:e,callbackContext:i}:void 0}},25898:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a){for(var h=n(t,e,i,r,null,a),u=0;u<h.length;u++)h[u].setCollisionCallback(s,o)}},18113:(t,e,i)=>{var n=i(87405),r=i(84851);t.exports=function(t,e,i,s,o){var a=n(t,e,i,s,null,o),h=a.map((function(t){return t.index}));r(h);for(var u=0;u<a.length;u++)a[u].index=h[u]}},28325:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o,a){for(var h=n(i,r,s,o,null,a),u=0;u<h.length;u++)h[u]&&(h[u].index===t?h[u].index=e:h[u].index===e&&(h[u].index=t))}},41058:t=>{t.exports=function(t,e,i){var n=i.baseTileWidth,r=i.tilemapLayer,s=0;return r&&(void 0===e&&(e=r.scene.cameras.main),s=r.x+e.scrollX*(1-r.scrollFactorX),n*=r.scaleX),s+t*n}},10777:(t,e,i)=>{var n=i(41058),r=i(76935),s=i(57148);t.exports=function(t,e,i,o,a){return void 0===i&&(i=new s(0,0)),i.x=n(t,o,a),i.y=r(e,o,a),i}},76935:t=>{t.exports=function(t,e,i){var n=i.baseTileHeight,r=i.tilemapLayer,s=0;return r&&(void 0===e&&(e=r.scene.cameras.main),s=r.y+e.scrollY*(1-r.scrollFactorY),n*=r.scaleY),s+t*n}},60913:(t,e,i)=>{var n=i(87405);t.exports=function(t,e,i,r,s,o){if(void 0!==s){var a,h=n(t,e,i,r,null,o),u=0;for(a=0;a<s.length;a++)u+=s[a].weight;if(!(u<=0))for(a=0;a<h.length;a++){for(var l=Math.random()*u,c=0,d=-1,p=0;p<s.length;p++)if(l<=(c+=s[p].weight)){var f=s[p].index;d=Array.isArray(f)?f[Math.floor(Math.random()*f.length)]:f;break}h[a].index=d}}}},48117:t=>{t.exports=function(t,e,i,n){void 0===e&&(e=!0);var r=n.baseTileWidth,s=n.tilemapLayer;return s&&(void 0===i&&(i=s.scene.cameras.main),t-=s.x+i.scrollX*(1-s.scrollFactorX),r*=s.scaleX),e?Math.floor(t/r):t/r}},99566:(t,e,i)=>{var n=i(48117),r=i(70079),s=i(57148);t.exports=function(t,e,i,o,a,h){return void 0===o&&(o=new s(0,0)),o.x=n(t,i,a,h),o.y=r(e,i,a,h),o}},70079:t=>{t.exports=function(t,e,i,n){void 0===e&&(e=!0);var r=n.baseTileHeight,s=n.tilemapLayer;return s&&(void 0===i&&(i=s.scene.cameras.main),t-=s.y+i.scrollY*(1-s.scrollFactorY),r*=s.scaleY),e?Math.floor(t/r):t/r}},66894:(t,e,i)=>{t.exports={CalculateFacesAt:i(31304),CalculateFacesWithin:i(39968),Copy:i(64779),CreateFromTiles:i(42752),CullTiles:i(12567),Fill:i(88904),FilterTiles:i(65204),FindByIndex:i(87916),FindTile:i(68548),ForEachTile:i(25400),GetTileAt:i(68626),GetTileAtWorldXY:i(18177),GetTilesWithin:i(87405),GetTilesWithinShape:i(6316),GetTilesWithinWorldXY:i(6348),HasTileAt:i(2458),HasTileAtWorldXY:i(81818),IsInLayerBounds:i(66049),PutTileAt:i(54022),PutTileAtWorldXY:i(30912),PutTilesAt:i(82541),Randomize:i(82558),RemoveTileAt:i(28960),RemoveTileAtWorldXY:i(61605),RenderDebug:i(78287),ReplaceByIndex:i(13375),SetCollision:i(66244),SetCollisionBetween:i(49823),SetCollisionByExclusion:i(7836),SetCollisionByProperty:i(56705),SetCollisionFromCollisionGroup:i(4385),SetTileIndexCallback:i(71658),SetTileLocationCallback:i(25898),Shuffle:i(18113),SwapByIndex:i(28325),TileToWorldX:i(41058),TileToWorldXY:i(10777),TileToWorldY:i(76935),WeightedRandomize:i(60913),WorldToTileX:i(48117),WorldToTileXY:i(99566),WorldToTileY:i(70079)}},54805:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(99425),o=i(90554),a=i(66894),h=new n({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.ComputedSize,r.Depth,r.Flip,r.GetBounds,r.Origin,r.Pipeline,r.Transform,r.Visible,r.ScrollFactor,s],initialize:function(t,e,i,n,r,s){o.call(this,t,"DynamicTilemapLayer"),this.isTilemap=!0,this.tilemap=e,this.layerIndex=i,this.layer=e.layers[i],this.layer.tilemapLayer=this,this.tileset=[],this.culledTiles=[],this.skipCull=!1,this.tilesDrawn=0,this.tilesTotal=this.layer.width*this.layer.height,this.cullPaddingX=1,this.cullPaddingY=1,this.cullCallback=a.CullTiles,this._renderOrder=0,this.gidMap=[],this.setTilesets(n),this.setAlpha(this.layer.alpha),this.setPosition(r,s),this.setOrigin(),this.setSize(e.tileWidth*this.layer.width,e.tileHeight*this.layer.height),this.initPipeline("TextureTintPipeline")},setTilesets:function(t){var e=[],i=[],n=this.tilemap;Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var s=t[r];if("string"==typeof s&&(s=n.getTileset(s)),s){i.push(s);for(var o=s.firstgid,a=0;a<s.total;a++)e[o+a]=s}}this.gidMap=e,this.tileset=i},setRenderOrder:function(t){return"string"==typeof t&&(t=["right-down","left-down","right-up","left-up"].indexOf(t)),t>=0&&t<4&&(this._renderOrder=t),this},calculateFacesAt:function(t,e){return a.CalculateFacesAt(t,e,this.layer),this},calculateFacesWithin:function(t,e,i,n){return a.CalculateFacesWithin(t,e,i,n,this.layer),this},createFromTiles:function(t,e,i,n,r){return a.CreateFromTiles(t,e,i,n,r,this.layer)},cull:function(t){return this.cullCallback(this.layer,t,this.culledTiles,this._renderOrder)},copy:function(t,e,i,n,r,s,o){return a.Copy(t,e,i,n,r,s,o,this.layer),this},destroy:function(t){void 0===t&&(t=!0),this.tilemap&&(this.layer.tilemapLayer===this&&(this.layer.tilemapLayer=void 0),t&&this.tilemap.removeLayer(this),this.tilemap=void 0,this.layer=void 0,this.culledTiles.length=0,this.cullCallback=null,this.gidMap=[],this.tileset=[],o.prototype.destroy.call(this))},fill:function(t,e,i,n,r,s){return a.Fill(t,e,i,n,r,s,this.layer),this},filterTiles:function(t,e,i,n,r,s,o){return a.FilterTiles(t,e,i,n,r,s,o,this.layer)},findByIndex:function(t,e,i){return a.FindByIndex(t,e,i,this.layer)},findTile:function(t,e,i,n,r,s,o){return a.FindTile(t,e,i,n,r,s,o,this.layer)},forEachTile:function(t,e,i,n,r,s,o){return a.ForEachTile(t,e,i,n,r,s,o,this.layer),this},getTileAt:function(t,e,i){return a.GetTileAt(t,e,i,this.layer)},getTileAtWorldXY:function(t,e,i,n){return a.GetTileAtWorldXY(t,e,i,n,this.layer)},getTilesWithin:function(t,e,i,n,r){return a.GetTilesWithin(t,e,i,n,r,this.layer)},getTilesWithinShape:function(t,e,i){return a.GetTilesWithinShape(t,e,i,this.layer)},getTilesWithinWorldXY:function(t,e,i,n,r,s){return a.GetTilesWithinWorldXY(t,e,i,n,r,s,this.layer)},hasTileAt:function(t,e){return a.HasTileAt(t,e,this.layer)},hasTileAtWorldXY:function(t,e,i){return a.HasTileAtWorldXY(t,e,i,this.layer)},putTileAt:function(t,e,i,n){return a.PutTileAt(t,e,i,n,this.layer)},putTileAtWorldXY:function(t,e,i,n,r){return a.PutTileAtWorldXY(t,e,i,n,r,this.layer)},putTilesAt:function(t,e,i,n){return a.PutTilesAt(t,e,i,n,this.layer),this},randomize:function(t,e,i,n,r){return a.Randomize(t,e,i,n,r,this.layer),this},removeTileAt:function(t,e,i,n){return a.RemoveTileAt(t,e,i,n,this.layer)},removeTileAtWorldXY:function(t,e,i,n,r){return a.RemoveTileAtWorldXY(t,e,i,n,r,this.layer)},renderDebug:function(t,e){return a.RenderDebug(t,e,this.layer),this},replaceByIndex:function(t,e,i,n,r,s){return a.ReplaceByIndex(t,e,i,n,r,s,this.layer),this},setSkipCull:function(t){return void 0===t&&(t=!0),this.skipCull=t,this},setCullPadding:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=1),this.cullPaddingX=t,this.cullPaddingY=e,this},setCollision:function(t,e,i,n){return a.SetCollision(t,e,i,this.layer,n),this},setCollisionBetween:function(t,e,i,n){return a.SetCollisionBetween(t,e,i,n,this.layer),this},setCollisionByProperty:function(t,e,i){return a.SetCollisionByProperty(t,e,i,this.layer),this},setCollisionByExclusion:function(t,e,i){return a.SetCollisionByExclusion(t,e,i,this.layer),this},setCollisionFromCollisionGroup:function(t,e){return a.SetCollisionFromCollisionGroup(t,e,this.layer),this},setTileIndexCallback:function(t,e,i){return a.SetTileIndexCallback(t,e,i,this.layer),this},setTileLocationCallback:function(t,e,i,n,r,s){return a.SetTileLocationCallback(t,e,i,n,r,s,this.layer),this},shuffle:function(t,e,i,n){return a.Shuffle(t,e,i,n,this.layer),this},swapByIndex:function(t,e,i,n,r,s){return a.SwapByIndex(t,e,i,n,r,s,this.layer),this},tileToWorldX:function(t,e){return a.TileToWorldX(t,e,this.layer)},tileToWorldY:function(t,e){return a.TileToWorldY(t,e,this.layer)},tileToWorldXY:function(t,e,i,n){return a.TileToWorldXY(t,e,i,n,this.layer)},weightedRandomize:function(t,e,i,n,r){return a.WeightedRandomize(t,e,i,n,r,this.layer),this},worldToTileX:function(t,e,i){return a.WorldToTileX(t,e,i,this.layer)},worldToTileY:function(t,e,i){return a.WorldToTileY(t,e,i,this.layer)},worldToTileXY:function(t,e,i,n,r){return a.WorldToTileXY(t,e,i,n,r,this.layer)}});t.exports=h},54338:t=>{t.exports=function(t,e,i,n,r){e.cull(n);var s=e.culledTiles,o=s.length;if(0!==o){var a=t._tempMatrix1,h=t._tempMatrix2,u=t._tempMatrix3;h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(n.matrix);var l=t.currentContext,c=e.gidMap;l.save(),r?(a.multiplyWithOffset(r,-n.scrollX*e.scrollFactorX,-n.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y,a.multiply(h,u),u.copyToContext(l)):(h.e-=n.scrollX*e.scrollFactorX,h.f-=n.scrollY*e.scrollFactorY,h.copyToContext(l));var d=n.alpha*e.alpha;(!t.antialias||e.scaleX>1||e.scaleY>1)&&(l.imageSmoothingEnabled=!1);for(var p=0;p<o;p++){var f=s[p],m=c[f.index];if(m){var v=m.image.getSourceImage(),g=m.getTileTextureCoordinates(f.index);if(g){var y=f.width/2,_=f.height/2;l.save(),l.translate(f.pixelX+y,f.pixelY+_),0!==f.rotation&&l.rotate(f.rotation),(f.flipX||f.flipY)&&l.scale(f.flipX?-1:1,f.flipY?-1:1),l.globalAlpha=d*f.alpha,l.drawImage(v,g.x,g.y,f.width,f.height,-y,-_,f.width,f.height),l.restore()}}}l.restore()}}},99425:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(68047),r=i(54338),t.exports={renderWebGL:n,renderCanvas:r}},68047:(t,e,i)=>{var n=i(19298);t.exports=function(t,e,i,r){e.cull(r);var s=e.culledTiles,o=s.length,a=r.alpha*e.alpha;if(!(0===o||a<=0))for(var h=e.gidMap,u=e.pipeline,l=n.getTintAppendFloatAlphaAndSwap,c=e.scrollFactorX,d=e.scrollFactorY,p=e.x,f=e.y,m=e.scaleX,v=e.scaleY,g=e.tileset,y=0;y<g.length;y++)for(var _=g[y],x=_.glTexture,b=0;b<o;b++){var w=s[b],T=h[w.index];if(T===_){var M=T.getTileTextureCoordinates(w.index);if(null!==M){var S=w.width,E=w.height,L=M.x,A=M.y,D=.5*w.width,P=.5*w.height,C=l(w.tint,a*w.alpha);u.batchTexture(e,x,x.width,x.height,p+(D+w.pixelX)*m,f+(P+w.pixelY)*v,w.width,w.height,m,v,w.rotation,w.flipX,w.flipY,c,d,D,P,L,A,S,E,C,C,C,C,!1,0,0,r,null,!0)}}}}},81241:(t,e,i)=>{t.exports={Components:i(66894),Parsers:i(53777),Formats:i(16092),ImageCollection:i(55191),ParseToTilemap:i(64157),Tile:i(72751),Tilemap:i(38634),TilemapCreator:i(72797),TilemapFactory:i(801),Tileset:i(10929),LayerData:i(24736),MapData:i(92223),ObjectLayer:i(31460),DynamicTilemapLayer:i(54805),StaticTilemapLayer:i(41856)}},24736:(t,e,i)=>{var n=i(47379),r=i(81769),s=new n({initialize:function(t){void 0===t&&(t={}),this.name=r(t,"name","layer"),this.x=r(t,"x",0),this.y=r(t,"y",0),this.width=r(t,"width",0),this.height=r(t,"height",0),this.tileWidth=r(t,"tileWidth",0),this.tileHeight=r(t,"tileHeight",0),this.baseTileWidth=r(t,"baseTileWidth",this.tileWidth),this.baseTileHeight=r(t,"baseTileHeight",this.tileHeight),this.widthInPixels=r(t,"widthInPixels",this.width*this.baseTileWidth),this.heightInPixels=r(t,"heightInPixels",this.height*this.baseTileHeight),this.alpha=r(t,"alpha",1),this.visible=r(t,"visible",!0),this.properties=r(t,"properties",[]),this.indexes=r(t,"indexes",[]),this.collideIndexes=r(t,"collideIndexes",[]),this.callbacks=r(t,"callbacks",[]),this.bodies=r(t,"bodies",[]),this.data=r(t,"data",[]),this.tilemapLayer=r(t,"tilemapLayer",null)}});t.exports=s},92223:(t,e,i)=>{var n=i(47379),r=i(81769),s=new n({initialize:function(t){void 0===t&&(t={}),this.name=r(t,"name","map"),this.width=r(t,"width",0),this.height=r(t,"height",0),this.infinite=r(t,"infinite",!1),this.tileWidth=r(t,"tileWidth",0),this.tileHeight=r(t,"tileHeight",0),this.widthInPixels=r(t,"widthInPixels",this.width*this.tileWidth),this.heightInPixels=r(t,"heightInPixels",this.height*this.tileHeight),this.format=r(t,"format",null),this.orientation=r(t,"orientation","orthogonal"),this.renderOrder=r(t,"renderOrder","right-down"),this.version=r(t,"version","1"),this.properties=r(t,"properties",{}),this.layers=r(t,"layers",[]),this.images=r(t,"images",[]),this.objects=r(t,"objects",{}),this.collision=r(t,"collision",{}),this.tilesets=r(t,"tilesets",[]),this.imageCollections=r(t,"imageCollections",[]),this.tiles=r(t,"tiles",[])}});t.exports=s},31460:(t,e,i)=>{var n=i(47379),r=i(81769),s=new n({initialize:function(t){void 0===t&&(t={}),this.name=r(t,"name","object layer"),this.opacity=r(t,"opacity",1),this.properties=r(t,"properties",{}),this.propertyTypes=r(t,"propertytypes",{}),this.type=r(t,"type","objectgroup"),this.visible=r(t,"visible",!0),this.objects=r(t,"objects",[])}});t.exports=s},3431:(t,e,i)=>{var n=i(16092),r=i(15635),s=i(95713),o=i(38807),a=i(71351);t.exports=function(t,e,i,h,u,l){var c;switch(e){case n.ARRAY_2D:c=r(t,i,h,u,l);break;case n.CSV:c=s(t,i,h,u,l);break;case n.TILED_JSON:c=o(t,i,l);break;case n.WELTMEISTER:c=a(t,i,l);break;default:console.warn("Unrecognized tilemap data format: "+e),c=null}return c}},15635:(t,e,i)=>{var n=i(16092),r=i(24736),s=i(92223),o=i(72751);t.exports=function(t,e,i,a,h){for(var u=new r({tileWidth:i,tileHeight:a}),l=new s({name:t,tileWidth:i,tileHeight:a,format:n.ARRAY_2D,layers:[u]}),c=[],d=e.length,p=0,f=0;f<e.length;f++){c[f]=[];for(var m=e[f],v=0;v<m.length;v++){var g=parseInt(m[v],10);isNaN(g)||-1===g?c[f][v]=h?null:new o(u,-1,v,f,i,a):c[f][v]=new o(u,g,v,f,i,a)}0===p&&(p=m.length)}return l.width=u.width=p,l.height=u.height=d,l.widthInPixels=u.widthInPixels=p*i,l.heightInPixels=u.heightInPixels=d*a,u.data=c,l}},95713:(t,e,i)=>{var n=i(16092),r=i(15635);t.exports=function(t,e,i,s,o){var a=e.trim().split("\n").map((function(t){return t.split(",")})),h=r(t,a,i,s,o);return h.format=n.CSV,h}},63422:(t,e,i)=>{var n=i(24736),r=i(72751);t.exports=function(t,e){for(var i=[],s=0;s<t.layer.length;s++){for(var o=t.layer[s],a=new n({name:o.name,width:o.width,height:o.height,tileWidth:o.tilesize,tileHeight:o.tilesize,visible:1===o.visible}),h=[],u=[],l=0;l<o.data.length;l++){for(var c=0;c<o.data[l].length;c++){var d,p=o.data[l][c]-1;d=p>-1?new r(a,p,c,l,o.tilesize,o.tilesize):e?null:new r(a,-1,c,l,o.tilesize,o.tilesize),h.push(d)}u.push(h),h=[]}a.data=u,i.push(a)}return i}},40640:(t,e,i)=>{var n=i(10929);t.exports=function(t){for(var e=[],i=[],r=0;r<t.layer.length;r++){var s=t.layer[r],o=s.tilesetName;""!==o&&-1===i.indexOf(o)&&(i.push(o),e.push(new n(o,0,s.tilesize,s.tilesize,0,0)))}return e}},71351:(t,e,i)=>{var n=i(16092),r=i(92223),s=i(63422),o=i(40640);t.exports=function(t,e,i){if(0===e.layer.length)return console.warn("No layers found in the Weltmeister map: "+t),null;for(var a=0,h=0,u=0;u<e.layer.length;u++)e.layer[u].width>a&&(a=e.layer[u].width),e.layer[u].height>h&&(h=e.layer[u].height);var l=new r({width:a,height:h,name:t,tileWidth:e.layer[0].tilesize,tileHeight:e.layer[0].tilesize,format:n.WELTMEISTER});return l.layers=s(e,i),l.tilesets=o(e),l}},90298:(t,e,i)=>{t.exports={ParseTileLayers:i(63422),ParseTilesets:i(40640),ParseWeltmeister:i(71351)}},53777:(t,e,i)=>{t.exports={Parse:i(3431),Parse2DArray:i(15635),ParseCSV:i(95713),Impact:i(90298),Tiled:i(66053)}},55239:(t,e,i)=>{var n=i(80933);t.exports=function(t){for(var e,i,r,s,o,a=0;a<t.layers.length;a++){e=t.layers[a],s=null;for(var h=0;h<e.data.length;h++){o=e.data[h];for(var u=0;u<o.length;u++)null===(i=o[u])||i.index<0||(r=t.tiles[i.index][2],s=t.tilesets[r],i.width=s.tileWidth,i.height=s.tileHeight,s.tileProperties&&s.tileProperties[i.index-s.firstgid]&&(i.properties=n(i.properties,s.tileProperties[i.index-s.firstgid])))}}}},22657:t=>{t.exports=function(t){for(var e=window.atob(t),i=e.length,n=new Array(i/4),r=0;r<i;r+=4)n[r/4]=(e.charCodeAt(r)|e.charCodeAt(r+1)<<8|e.charCodeAt(r+2)<<16|e.charCodeAt(r+3)<<24)>>>0;return n}},73702:(t,e,i)=>{var n=i(10929);t.exports=function(t){var e,i,r=[];for(e=0;e<t.imageCollections.length;e++)for(var s=t.imageCollections[e],o=s.images,a=0;a<o.length;a++){var h=o[a];(i=new n(h.image,h.gid,s.imageWidth,s.imageHeight,0,0)).updateTileData(s.imageWidth,s.imageHeight),t.tilesets.push(i)}for(e=0;e<t.tilesets.length;e++)for(var u=(i=t.tilesets[e]).tileMargin,l=i.tileMargin,c=0,d=0,p=0,f=i.firstgid;f<i.firstgid+i.total&&(r[f]=[u,l,e],u+=i.tileWidth+i.tileSpacing,++c!==i.total)&&(++d!==i.columns||(u=i.tileMargin,l+=i.tileHeight+i.tileSpacing,d=0,++p!==i.rows));f++);return r}},57078:(t,e,i)=>{var n=i(81769);t.exports=function(t,e,i){if(!e)return{i:0,layers:t.layers,name:"",opacity:1,visible:!0,x:0,y:0};var r=e.x+n(e,"startx",0)*t.tilewidth+n(e,"offsetx",0),s=e.y+n(e,"starty",0)*t.tileheight+n(e,"offsety",0);return{i:0,layers:e.layers,name:i.name+e.name+"/",opacity:i.opacity*e.opacity,visible:i.visible&&e.visible,x:i.x+r,y:i.y+s}}},56485:t=>{var e=2147483648,i=1073741824,n=536870912;t.exports=function(t){var r=Boolean(t&e),s=Boolean(t&i),o=Boolean(t&n);t&=536870911;var a=0,h=!1;return r&&s&&o?(a=Math.PI/2,h=!0):r&&s&&!o?(a=Math.PI,h=!1):r&&!s&&o?(a=Math.PI/2,h=!1):!r||s||o?!r&&s&&o?(a=3*Math.PI/2,h=!1):r||!s||o?r||s||!o?r||s||o||(a=0,h=!1):(a=3*Math.PI/2,h=!0):(a=Math.PI,h=!0):(a=0,h=!0),{gid:t,flippedHorizontal:r,flippedVertical:s,flippedAntiDiagonal:o,rotation:a,flipped:h}}},49837:(t,e,i)=>{var n=i(81769),r=i(57078);t.exports=function(t){for(var e=[],i=[],s=r(t);s.i<s.layers.length||i.length>0;)if(s.i>=s.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}s=i.pop()}else{var o=s.layers[s.i];if(s.i++,"imagelayer"===o.type){var a=n(o,"offsetx",0)+n(o,"startx",0),h=n(o,"offsety",0)+n(o,"starty",0);e.push({name:s.name+o.name,image:o.image,x:s.x+a+o.x,y:s.y+h+o.y,alpha:s.opacity*o.opacity,visible:s.visible&&o.visible,properties:n(o,"properties",{})})}else if("group"===o.type){var u=r(t,o,s);i.push(s),s=u}}return e}},38807:(t,e,i)=>{var n=i(16092),r=i(92223),s=i(6703),o=i(49837),a=i(75848),h=i(46417),u=i(73702),l=i(55239);t.exports=function(t,e,i){if("orthogonal"!==e.orientation)return console.warn("Only orthogonal map types are supported in this version of Phaser"),null;var c=new r({width:e.width,height:e.height,name:t,tileWidth:e.tilewidth,tileHeight:e.tileheight,orientation:e.orientation,format:n.TILED_JSON,version:e.version,properties:e.properties,renderOrder:e.renderorder,infinite:e.infinite});c.layers=s(e,i),c.images=o(e);var d=a(e);return c.tilesets=d.tilesets,c.imageCollections=d.imageCollections,c.objects=h(e),c.tiles=u(c),l(c),c}},5119:(t,e,i)=>{var n=i(49694),r=i(56485),s=function(t){return{x:t.x,y:t.y}},o=["id","name","type","rotation","properties","visible","x","y","width","height"];t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=0);var a=n(t,o);if(a.x+=e,a.y+=i,t.gid){var h=r(t.gid);a.gid=h.gid,a.flippedHorizontal=h.flippedHorizontal,a.flippedVertical=h.flippedVertical,a.flippedAntiDiagonal=h.flippedAntiDiagonal}else t.polyline?a.polyline=t.polyline.map(s):t.polygon?a.polygon=t.polygon.map(s):t.ellipse?a.ellipse=t.ellipse:t.text?a.text=t.text:t.point?a.point=!0:a.rectangle=!0;return a}},46417:(t,e,i)=>{var n=i(81769),r=i(5119),s=i(31460),o=i(57078);t.exports=function(t){for(var e=[],i=[],a=o(t);a.i<a.layers.length||i.length>0;)if(a.i>=a.layers.length){if(i.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}a=i.pop()}else{var h=a.layers[a.i];if(a.i++,h.opacity*=a.opacity,h.visible=a.visible&&h.visible,"objectgroup"===h.type){h.name=a.name+h.name;for(var u=a.x+n(h,"startx",0)+n(h,"offsetx",0),l=a.y+n(h,"starty",0)+n(h,"offsety",0),c=[],d=0;d<h.objects.length;d++){var p=r(h.objects[d],u,l);c.push(p)}var f=new s(h);f.objects=c,e.push(f)}else if("group"===h.type){var m=o(t,h,a);i.push(a),a=m}}return e}},6703:(t,e,i)=>{var n=i(22657),r=i(81769),s=i(24736),o=i(56485),a=i(72751),h=i(57078);t.exports=function(t,e){for(var i=r(t,"infinite",!1),u=[],l=[],c=h(t);c.i<c.layers.length||l.length>0;)if(c.i>=c.layers.length){if(l.length<1){console.warn("TilemapParser.parseTiledJSON - Invalid layer group hierarchy");break}c=l.pop()}else{var d=c.layers[c.i];if(c.i++,"tilelayer"===d.type)if(d.compression)console.warn("TilemapParser.parseTiledJSON - Layer compression is unsupported, skipping layer '"+d.name+"'");else{if(d.encoding&&"base64"===d.encoding){if(d.chunks)for(var p=0;p<d.chunks.length;p++)d.chunks[p].data=n(d.chunks[p].data);d.data&&(d.data=n(d.data)),delete d.encoding}var f,m,v,g,y=[],_=0;if(i){var x=r(d,"startx",0)+d.x,b=r(d,"starty",0)+d.y;f=new s({name:c.name+d.name,x:c.x+r(d,"offsetx",0)+x*t.tilewidth,y:c.y+r(d,"offsety",0)+b*t.tileheight,width:d.width,height:d.height,tileWidth:t.tilewidth,tileHeight:t.tileheight,alpha:c.opacity*d.opacity,visible:c.visible&&d.visible,properties:r(d,"properties",[])});for(var w=0;w<d.height;w++){y.push([null]);for(var T=0;T<d.width;T++)y[w][T]=null}for(w=0,R=d.chunks.length;w<R;w++)for(var M=d.chunks[w],S=M.x-x,E=M.y-b,L=0,A=0,D=M.data.length;A<D;A++){var P=_+S,C=L+E;(m=o(M.data[A])).gid>0?((v=new a(f,m.gid,P,C,t.tilewidth,t.tileheight)).rotation=m.rotation,v.flipX=m.flipped,y[C][P]=v):(g=e?null:new a(f,-1,P,C,t.tilewidth,t.tileheight),y[C][P]=g),++_===M.width&&(L++,_=0)}}else{f=new s({name:c.name+d.name,x:c.x+r(d,"offsetx",0)+d.x,y:c.y+r(d,"offsety",0)+d.y,width:d.width,height:d.height,tileWidth:t.tilewidth,tileHeight:t.tileheight,alpha:c.opacity*d.opacity,visible:c.visible&&d.visible,properties:r(d,"properties",[])});for(var O=[],k=0,R=d.data.length;k<R;k++)(m=o(d.data[k])).gid>0?((v=new a(f,m.gid,_,y.length,t.tilewidth,t.tileheight)).rotation=m.rotation,v.flipX=m.flipped,O.push(v)):(g=e?null:new a(f,-1,_,y.length,t.tilewidth,t.tileheight),O.push(g)),++_===d.width&&(y.push(O),_=0,O=[])}f.data=y,u.push(f)}else if("group"===d.type){var I=h(t,d,c);l.push(c),c=I}}return u}},75848:(t,e,i)=>{var n=i(10929),r=i(55191),s=i(5119);t.exports=function(t){for(var e,i=[],o=[],a=null,h=0;h<t.tilesets.length;h++){var u=t.tilesets[h];if(u.source)console.warn("Phaser can't load external tilesets. Use the Embed Tileset button and then export the map again.");else if(u.image){var l=new n(u.name,u.firstgid,u.tilewidth,u.tileheight,u.margin,u.spacing);if(t.version>1){if(Array.isArray(u.tiles)){for(var c={},d={},p=0;p<u.tiles.length;p++){var f=u.tiles[p];if(f.properties){var m={};f.properties.forEach((function(t){m[t.name]=t.value})),d[f.id]=m}if(f.objectgroup&&(c[f.id]={objectgroup:f.objectgroup},f.objectgroup.objects)){var v=f.objectgroup.objects.map((function(t){return s(t)}));c[f.id].objectgroup.objects=v}f.animation&&(c.hasOwnProperty(f.id)?c[f.id].animation=f.animation:c[f.id]={animation:f.animation})}l.tileData=c,l.tileProperties=d}}else if(u.tileproperties&&(l.tileProperties=u.tileproperties),u.tiles)for(e in l.tileData=u.tiles,l.tileData){var g=l.tileData[e].objectgroup;if(g&&g.objects){var y=g.objects.map((function(t){return s(t)}));l.tileData[e].objectgroup.objects=y}}l.updateTileData(u.imagewidth,u.imageheight),i.push(l)}else{var _=new r(u.name,u.firstgid,u.tilewidth,u.tileheight,u.margin,u.spacing,u.properties);for(e in u.tiles){var x=u.tiles[e].image,b=u.firstgid+parseInt(e,10);_.addImage(b,x)}o.push(_)}a&&(a.lastgid=u.firstgid-1),a=u}return{tilesets:i,imageCollections:o}}},66053:(t,e,i)=>{t.exports={AssignTileProperties:i(55239),Base64Decode:i(22657),BuildTilesetIndex:i(73702),ParseGID:i(56485),ParseImageLayers:i(49837),ParseJSONTiled:i(38807),ParseObject:i(5119),ParseObjectLayers:i(46417),ParseTileLayers:i(6703),ParseTilesets:i(75848)}},41856:(t,e,i)=>{var n=i(47379),r=i(23096),s=i(80827),o=i(90554),a=i(36636),h=i(66894),u=i(65492),l=i(19298),c=new n({Extends:o,Mixins:[r.Alpha,r.BlendMode,r.ComputedSize,r.Depth,r.Flip,r.GetBounds,r.Origin,r.Pipeline,r.Transform,r.Visible,r.ScrollFactor,a],initialize:function(t,e,i,n,r,a){o.call(this,t,"StaticTilemapLayer"),this.isTilemap=!0,this.tilemap=e,this.layerIndex=i,this.layer=e.layers[i],this.layer.tilemapLayer=this,this.tileset=[],this.culledTiles=[],this.skipCull=!1,this.tilesDrawn=0,this.tilesTotal=this.layer.width*this.layer.height,this.cullPaddingX=1,this.cullPaddingY=1,this.cullCallback=h.CullTiles,this.renderer=t.sys.game.renderer,this.vertexBuffer=[],this.bufferData=[],this.vertexViewF32=[],this.vertexViewU32=[],this.dirty=[],this.vertexCount=[],this._renderOrder=0,this._tempMatrix=new u,this.gidMap=[],this.setTilesets(n),this.setAlpha(this.layer.alpha),this.setPosition(r,a),this.setOrigin(),this.setSize(e.tileWidth*this.layer.width,e.tileHeight*this.layer.height),this.updateVBOData(),this.initPipeline("TextureTintPipeline"),t.sys.game.events.on(s.CONTEXT_RESTORED,(function(){this.updateVBOData()}),this)},setTilesets:function(t){var e=[],i=[],n=this.tilemap;Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var s=t[r];if("string"==typeof s&&(s=n.getTileset(s)),s){i.push(s);for(var o=s.firstgid,a=0;a<s.total;a++)e[o+a]=s}}this.gidMap=e,this.tileset=i},updateVBOData:function(){for(var t=0;t<this.tileset.length;t++)this.dirty[t]=!0,this.vertexCount[t]=0,this.vertexBuffer[t]=null,this.bufferData[t]=null,this.vertexViewF32[t]=null,this.vertexViewU32[t]=null;return this},upload:function(t,e){var i=this.renderer,n=i.gl,r=i.pipelines.TextureTintPipeline;if(this.dirty[e]){var s,o,a,h=this.tileset[e],u=this.layer.width,l=this.layer.height,c=h.image.source[0].width,d=h.image.source[0].height,p=this.layer.data,f=this._renderOrder,m=h.firstgid,v=h.firstgid+h.total,g=this.vertexBuffer[e],y=this.bufferData[e],_=-1,x=u*l*r.vertexSize*6;if(this.vertexCount[e]=0,null===y&&(y=new ArrayBuffer(x),this.bufferData[e]=y,this.vertexViewF32[e]=new Float32Array(y),this.vertexViewU32[e]=new Uint32Array(y)),0===f)for(o=0;o<l;o++)for(a=0;a<u;a++)!(s=p[o][a])||s.index<m||s.index>v||!s.visible||(_=this.batchTile(_,s,h,c,d,t,e));else if(1===f)for(o=0;o<l;o++)for(a=u-1;a>=0;a--)!(s=p[o][a])||s.index<m||s.index>v||!s.visible||(_=this.batchTile(_,s,h,c,d,t,e));else if(2===f)for(o=l-1;o>=0;o--)for(a=0;a<u;a++)!(s=p[o][a])||s.index<m||s.index>v||!s.visible||(_=this.batchTile(_,s,h,c,d,t,e));else if(3===f)for(o=l-1;o>=0;o--)for(a=u-1;a>=0;a--)!(s=p[o][a])||s.index<m||s.index>v||!s.visible||(_=this.batchTile(_,s,h,c,d,t,e));this.dirty[e]=!1,null===g?(g=i.createVertexBuffer(y,n.STATIC_DRAW),this.vertexBuffer[e]=g):(i.setVertexBuffer(g),n.bufferSubData(n.ARRAY_BUFFER,0,y))}return this},batchTile:function(t,e,i,n,r,s,o){var a=i.getTileTextureCoordinates(e.index);if(!a)return t;var h=i.tileWidth,u=i.tileHeight,c=h/2,d=u/2,p=a.x/n,f=a.y/r,m=(a.x+h)/n,v=(a.y+u)/r,g=this._tempMatrix,y=-c,_=-d;e.flipX&&(h*=-1,y+=i.tileWidth),e.flipY&&(u*=-1,_+=i.tileHeight);var x=y+h,b=_+u;g.applyITRS(c+e.pixelX,d+e.pixelY,e.rotation,1,1);var w=l.getTintAppendFloatAlpha(16777215,s.alpha*this.alpha*e.alpha),T=g.getX(y,_),M=g.getY(y,_),S=g.getX(y,b),E=g.getY(y,b),L=g.getX(x,b),A=g.getY(x,b),D=g.getX(x,_),P=g.getY(x,_);s.roundPixels&&(T=Math.round(T),M=Math.round(M),S=Math.round(S),E=Math.round(E),L=Math.round(L),A=Math.round(A),D=Math.round(D),P=Math.round(P));var C=this.vertexViewF32[o],O=this.vertexViewU32[o];return C[++t]=T,C[++t]=M,C[++t]=p,C[++t]=f,C[++t]=0,O[++t]=w,C[++t]=S,C[++t]=E,C[++t]=p,C[++t]=v,C[++t]=0,O[++t]=w,C[++t]=L,C[++t]=A,C[++t]=m,C[++t]=v,C[++t]=0,O[++t]=w,C[++t]=T,C[++t]=M,C[++t]=p,C[++t]=f,C[++t]=0,O[++t]=w,C[++t]=L,C[++t]=A,C[++t]=m,C[++t]=v,C[++t]=0,O[++t]=w,C[++t]=D,C[++t]=P,C[++t]=m,C[++t]=f,C[++t]=0,O[++t]=w,this.vertexCount[o]+=6,t},setRenderOrder:function(t){if("string"==typeof t&&(t=["right-down","left-down","right-up","left-up"].indexOf(t)),t>=0&&t<4){this._renderOrder=t;for(var e=0;e<this.tileset.length;e++)this.dirty[e]=!0}return this},calculateFacesAt:function(t,e){return h.CalculateFacesAt(t,e,this.layer),this},calculateFacesWithin:function(t,e,i,n){return h.CalculateFacesWithin(t,e,i,n,this.layer),this},createFromTiles:function(t,e,i,n,r){return h.CreateFromTiles(t,e,i,n,r,this.layer)},cull:function(t){return this.cullCallback(this.layer,t,this.culledTiles)},setSkipCull:function(t){return void 0===t&&(t=!0),this.skipCull=t,this},setCullPadding:function(t,e){return void 0===t&&(t=1),void 0===e&&(e=1),this.cullPaddingX=t,this.cullPaddingY=e,this},findByIndex:function(t,e,i){return h.FindByIndex(t,e,i,this.layer)},findTile:function(t,e,i,n,r,s,o){return h.FindTile(t,e,i,n,r,s,o,this.layer)},filterTiles:function(t,e,i,n,r,s,o){return h.FilterTiles(t,e,i,n,r,s,o,this.layer)},forEachTile:function(t,e,i,n,r,s,o){return h.ForEachTile(t,e,i,n,r,s,o,this.layer),this},getTileAt:function(t,e,i){return h.GetTileAt(t,e,i,this.layer)},getTileAtWorldXY:function(t,e,i,n){return h.GetTileAtWorldXY(t,e,i,n,this.layer)},getTilesWithin:function(t,e,i,n,r){return h.GetTilesWithin(t,e,i,n,r,this.layer)},getTilesWithinWorldXY:function(t,e,i,n,r,s){return h.GetTilesWithinWorldXY(t,e,i,n,r,s,this.layer)},getTilesWithinShape:function(t,e,i){return h.GetTilesWithinShape(t,e,i,this.layer)},hasTileAt:function(t,e){return h.HasTileAt(t,e,this.layer)},hasTileAtWorldXY:function(t,e,i){return h.HasTileAtWorldXY(t,e,i,this.layer)},renderDebug:function(t,e){return h.RenderDebug(t,e,this.layer),this},setCollision:function(t,e,i,n){return h.SetCollision(t,e,i,this.layer,n),this},setCollisionBetween:function(t,e,i,n){return h.SetCollisionBetween(t,e,i,n,this.layer),this},setCollisionByProperty:function(t,e,i){return h.SetCollisionByProperty(t,e,i,this.layer),this},setCollisionByExclusion:function(t,e,i){return h.SetCollisionByExclusion(t,e,i,this.layer),this},setTileIndexCallback:function(t,e,i){return h.SetTileIndexCallback(t,e,i,this.layer),this},setCollisionFromCollisionGroup:function(t,e){return h.SetCollisionFromCollisionGroup(t,e,this.layer),this},setTileLocationCallback:function(t,e,i,n,r,s){return h.SetTileLocationCallback(t,e,i,n,r,s,this.layer),this},tileToWorldX:function(t,e){return h.TileToWorldX(t,e,this.layer)},tileToWorldY:function(t,e){return h.TileToWorldY(t,e,this.layer)},tileToWorldXY:function(t,e,i,n){return h.TileToWorldXY(t,e,i,n,this.layer)},worldToTileX:function(t,e,i){return h.WorldToTileX(t,e,i,this.layer)},worldToTileY:function(t,e,i){return h.WorldToTileY(t,e,i,this.layer)},worldToTileXY:function(t,e,i,n,r){return h.WorldToTileXY(t,e,i,n,r,this.layer)},destroy:function(t){if(void 0===t&&(t=!0),this.tilemap){this.layer.tilemapLayer===this&&(this.layer.tilemapLayer=void 0),t&&this.tilemap.removeLayer(this),this.tilemap=void 0,this.layer=void 0,this.culledTiles.length=0,this.cullCallback=null;for(var e=0;e<this.tileset.length;e++)this.dirty[e]=!0,this.vertexCount[e]=0,this.vertexBuffer[e]=null,this.bufferData[e]=null,this.vertexViewF32[e]=null,this.vertexViewU32[e]=null;this.gidMap=[],this.tileset=[],o.prototype.destroy.call(this)}}});t.exports=c},50491:t=>{t.exports=function(t,e,i,n,r){e.cull(n);var s=e.culledTiles,o=s.length;if(0!==o){var a=t._tempMatrix1,h=t._tempMatrix2,u=t._tempMatrix3;h.applyITRS(e.x,e.y,e.rotation,e.scaleX,e.scaleY),a.copyFrom(n.matrix);var l=t.currentContext,c=e.gidMap;l.save(),r?(a.multiplyWithOffset(r,-n.scrollX*e.scrollFactorX,-n.scrollY*e.scrollFactorY),h.e=e.x,h.f=e.y,a.multiply(h,u),u.copyToContext(l)):(h.e-=n.scrollX*e.scrollFactorX,h.f-=n.scrollY*e.scrollFactorY,h.copyToContext(l));var d=n.alpha*e.alpha;(!t.antialias||e.scaleX>1||e.scaleY>1)&&(l.imageSmoothingEnabled=!1);for(var p=0;p<o;p++){var f=s[p],m=c[f.index];if(m){var v=m.image.getSourceImage(),g=m.getTileTextureCoordinates(f.index);if(g){var y=m.tileWidth,_=m.tileHeight,x=y/2,b=_/2;l.save(),l.translate(f.pixelX+x,f.pixelY+b),0!==f.rotation&&l.rotate(f.rotation),(f.flipX||f.flipY)&&l.scale(f.flipX?-1:1,f.flipY?-1:1),l.globalAlpha=d*f.alpha,l.drawImage(v,g.x,g.y,y,_,-x,-b,y,_),l.restore()}}}l.restore()}}},36636:(t,e,i)=>{var n=i(49035),r=i(49035);n=i(42402),r=i(50491),t.exports={renderWebGL:n,renderCanvas:r}},42402:t=>{t.exports=function(t,e,i,n){var r=e.tileset,s=e.pipeline,o=s.vertexBuffer;t.setPipeline(s),s.modelIdentity(),s.modelTranslate(e.x-n.scrollX*e.scrollFactorX,e.y-n.scrollY*e.scrollFactorY,0),s.modelScale(e.scaleX,e.scaleY,1),s.viewLoad2D(n.matrix.matrix);for(var a=0;a<r.length;a++)e.upload(n,a),e.vertexCount[a]>0&&(t.currentPipeline&&t.currentPipeline.vertexCount>0&&t.flush(),s.vertexBuffer=e.vertexBuffer[a],t.setPipeline(s),t.setTexture2D(r[a].glTexture,0),t.gl.drawArrays(s.topology,0,e.vertexCount[a]));s.vertexBuffer=o,s.viewIdentity(),s.modelIdentity()}},75588:(t,e,i)=>{var n=i(47379),r=i(50354),s=i(88637),o=i(27826),a=new n({initialize:function(t){this.scene=t,this.systems=t.sys,this.now=0,this.timeScale=1,this.paused=!1,this._active=[],this._pendingInsertion=[],this._pendingRemoval=[],t.sys.events.once(s.BOOT,this.boot,this),t.sys.events.on(s.START,this.start,this)},boot:function(){this.now=this.systems.game.loop.time,this.systems.events.once(s.DESTROY,this.destroy,this)},start:function(){var t=this.systems.events;t.on(s.PRE_UPDATE,this.preUpdate,this),t.on(s.UPDATE,this.update,this),t.once(s.SHUTDOWN,this.shutdown,this)},addEvent:function(t){var e=new o(t);return this._pendingInsertion.push(e),e},delayedCall:function(t,e,i,n){return this.addEvent({delay:t,callback:e,args:i,callbackScope:n})},clearPendingEvents:function(){return this._pendingInsertion=[],this},removeAllEvents:function(){return this._pendingRemoval=this._pendingRemoval.concat(this._active),this},preUpdate:function(){var t=this._pendingRemoval.length,e=this._pendingInsertion.length;if(0!==t||0!==e){var i,n;for(i=0;i<t;i++){n=this._pendingRemoval[i];var r=this._active.indexOf(n);r>-1&&this._active.splice(r,1),n.destroy()}for(i=0;i<e;i++)n=this._pendingInsertion[i],this._active.push(n);this._pendingRemoval.length=0,this._pendingInsertion.length=0}},update:function(t,e){if(this.now=t,!this.paused){e*=this.timeScale;for(var i=0;i<this._active.length;i++){var n=this._active[i];if(!n.paused&&(n.elapsed+=e*n.timeScale,n.elapsed>=n.delay)){var r=n.elapsed-n.delay;n.elapsed=n.delay,!n.hasDispatched&&n.callback&&(n.hasDispatched=!0,n.callback.apply(n.callbackScope,n.args)),n.repeatCount>0?(n.repeatCount--,n.elapsed=r,n.hasDispatched=!1):this._pendingRemoval.push(n)}}}},shutdown:function(){var t;for(t=0;t<this._pendingInsertion.length;t++)this._pendingInsertion[t].destroy();for(t=0;t<this._active.length;t++)this._active[t].destroy();for(t=0;t<this._pendingRemoval.length;t++)this._pendingRemoval[t].destroy();this._active.length=0,this._pendingRemoval.length=0,this._pendingInsertion.length=0;var e=this.systems.events;e.off(s.PRE_UPDATE,this.preUpdate,this),e.off(s.UPDATE,this.update,this),e.off(s.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.scene.sys.events.off(s.START,this.start,this),this.scene=null,this.systems=null}});r.register("Clock",a,"time"),t.exports=a},27826:(t,e,i)=>{var n=i(47379),r=i(81769),s=new n({initialize:function(t){this.delay=0,this.repeat=0,this.repeatCount=0,this.loop=!1,this.callback,this.callbackScope,this.args,this.timeScale=1,this.startAt=0,this.elapsed=0,this.paused=!1,this.hasDispatched=!1,this.reset(t)},reset:function(t){return this.delay=r(t,"delay",0),this.repeat=r(t,"repeat",0),this.loop=r(t,"loop",!1),this.callback=r(t,"callback",void 0),this.callbackScope=r(t,"callbackScope",this.callback),this.args=r(t,"args",[]),this.timeScale=r(t,"timeScale",1),this.startAt=r(t,"startAt",0),this.paused=r(t,"paused",!1),this.elapsed=this.startAt,this.hasDispatched=!1,this.repeatCount=-1===this.repeat||this.loop?999999999999:this.repeat,this},getProgress:function(){return this.elapsed/this.delay},getOverallProgress:function(){if(this.repeat>0){var t=this.delay+this.delay*this.repeat;return(this.elapsed+this.delay*(this.repeat-this.repeatCount))/t}return this.getProgress()},getRepeatCount:function(){return this.repeatCount},getElapsed:function(){return this.elapsed},getElapsedSeconds:function(){return.001*this.elapsed},remove:function(t){void 0===t&&(t=!1),this.elapsed=this.delay,this.hasDispatched=!t,this.repeatCount=0},destroy:function(){this.callback=void 0,this.callbackScope=void 0,this.args=[]}});t.exports=s},46547:(t,e,i)=>{t.exports={Clock:i(75588),TimerEvent:i(27826)}},11913:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(91209),o=i(7480),a=i(3926),h=new n({Extends:r,initialize:function(t){r.call(this),this.manager=t,this.isTimeline=!0,this.data=[],this.totalData=0,this.useFrames=!1,this.timeScale=1,this.loop=0,this.loopDelay=0,this.loopCounter=0,this.completeDelay=0,this.countdown=0,this.state=a.PENDING_ADD,this._pausedState=a.PENDING_ADD,this.paused=!1,this.elapsed=0,this.totalElapsed=0,this.duration=0,this.progress=0,this.totalDuration=0,this.totalProgress=0,this.callbacks={onComplete:null,onLoop:null,onStart:null,onUpdate:null,onYoyo:null},this.callbackScope},dispatchTimelineEvent:function(t,e){this.emit(t,this),e&&e.func.apply(e.scope,e.params)},setTimeScale:function(t){return this.timeScale=t,this},getTimeScale:function(){return this.timeScale},isPlaying:function(){return this.state===a.ACTIVE},add:function(t){return this.queue(o(this,t))},queue:function(t){return this.isPlaying()||(t.parent=this,t.parentIsTimeline=!0,this.data.push(t),this.totalData=this.data.length),this},hasOffset:function(t){return null!==t.offset},isOffsetAbsolute:function(t){return"number"==typeof t},isOffsetRelative:function(t){if("string"===typeof t){var e=t[0];if("-"===e||"+"===e)return!0}return!1},getRelativeOffset:function(t,e){var i=t[0],n=parseFloat(t.substr(2)),r=e;switch(i){case"+":r+=n;break;case"-":r-=n}return Math.max(0,r)},calcDuration:function(){for(var t=0,e=0,i=0,n=0;n<this.totalData;n++){var r=this.data[n];r.init(),this.hasOffset(r)?this.isOffsetAbsolute(r.offset)?(r.calculatedOffset=r.offset,0===r.offset&&(i=0)):this.isOffsetRelative(r.offset)&&(r.calculatedOffset=this.getRelativeOffset(r.offset,t)):r.calculatedOffset=i,t=r.totalDuration+r.calculatedOffset,e+=r.totalDuration,i+=r.totalDuration}this.duration=e,this.loopCounter=-1===this.loop?999999999999:this.loop,this.loopCounter>0?this.totalDuration=this.duration+this.completeDelay+(this.duration+this.loopDelay)*this.loopCounter:this.totalDuration=this.duration+this.completeDelay},init:function(){return this.calcDuration(),this.progress=0,this.totalProgress=0,!this.paused||(this.state=a.PAUSED,!1)},resetTweens:function(t){for(var e=0;e<this.totalData;e++){this.data[e].play(t)}},setCallback:function(t,e,i,n){return-1!==h.TYPES.indexOf(t)&&(this.callbacks[t]={func:e,scope:n,params:i}),this},makeActive:function(t){return this.manager.makeActive(t)},play:function(){if(this.state!==a.ACTIVE){if(this.paused)return this.paused=!1,void this.manager.makeActive(this);this.resetTweens(!1),this.state=a.ACTIVE,this.dispatchTimelineEvent(s.TIMELINE_START,this.callbacks.onStart)}},nextState:function(){this.loopCounter>0?(this.elapsed=0,this.progress=0,this.loopCounter--,this.resetTweens(!0),this.loopDelay>0?(this.countdown=this.loopDelay,this.state=a.LOOP_DELAY):(this.state=a.ACTIVE,this.dispatchTimelineEvent(s.TIMELINE_LOOP,this.callbacks.onLoop))):this.completeDelay>0?(this.state=a.COMPLETE_DELAY,this.countdown=this.completeDelay):(this.state=a.PENDING_REMOVE,this.dispatchTimelineEvent(s.TIMELINE_COMPLETE,this.callbacks.onComplete))},update:function(t,e){if(this.state!==a.PAUSED){switch(this.useFrames&&(e=1*this.manager.timeScale),e*=this.timeScale,this.elapsed+=e,this.progress=Math.min(this.elapsed/this.duration,1),this.totalElapsed+=e,this.totalProgress=Math.min(this.totalElapsed/this.totalDuration,1),this.state){case a.ACTIVE:for(var i=this.totalData,n=0;n<this.totalData;n++){this.data[n].update(t,e)&&i--}this.dispatchTimelineEvent(s.TIMELINE_UPDATE,this.callbacks.onUpdate),0===i&&this.nextState();break;case a.LOOP_DELAY:this.countdown-=e,this.countdown<=0&&(this.state=a.ACTIVE,this.dispatchTimelineEvent(s.TIMELINE_LOOP,this.callbacks.onLoop));break;case a.COMPLETE_DELAY:this.countdown-=e,this.countdown<=0&&(this.state=a.PENDING_REMOVE,this.dispatchTimelineEvent(s.TIMELINE_COMPLETE,this.callbacks.onComplete))}return this.state===a.PENDING_REMOVE}},stop:function(){this.state=a.PENDING_REMOVE},pause:function(){if(this.state!==a.PAUSED)return this.paused=!0,this._pausedState=this.state,this.state=a.PAUSED,this.emit(s.TIMELINE_PAUSE,this),this},resume:function(){return this.state===a.PAUSED&&(this.paused=!1,this.state=this._pausedState,this.emit(s.TIMELINE_RESUME,this)),this},hasTarget:function(t){for(var e=0;e<this.data.length;e++)if(this.data[e].hasTarget(t))return!0;return!1},destroy:function(){for(var t=0;t<this.data.length;t++)this.data[t].stop()}});h.TYPES=["onStart","onUpdate","onLoop","onComplete","onYoyo"],t.exports=h},57294:(t,e,i)=>{var n=i(60625),r=i(47379),s=i(53063),o=i(50354),a=i(88637),h=i(34906),u=i(61690),l=i(3926),c=i(7480),d=new r({initialize:function(t){this.scene=t,this.systems=t.sys,this.timeScale=1,this._add=[],this._pending=[],this._active=[],this._destroy=[],this._toProcess=0,t.sys.events.once(a.BOOT,this.boot,this),t.sys.events.on(a.START,this.start,this)},boot:function(){this.systems.events.once(a.DESTROY,this.destroy,this)},start:function(){var t=this.systems.events;t.on(a.PRE_UPDATE,this.preUpdate,this),t.on(a.UPDATE,this.update,this),t.once(a.SHUTDOWN,this.shutdown,this),this.timeScale=1},createTimeline:function(t){return u(this,t)},timeline:function(t){var e=u(this,t);return e.paused||(this._add.push(e),this._toProcess++),e},create:function(t){return c(this,t)},add:function(t){var e=c(this,t);return this._add.push(e),this._toProcess++,e},existing:function(t){return this._add.push(t),this._toProcess++,this},addCounter:function(t){var e=s(this,t);return this._add.push(e),this._toProcess++,e},stagger:function(t,e){return h(t,e)},preUpdate:function(){if(0!==this._toProcess){var t,e,i=this._destroy,n=this._active,r=this._pending;for(t=0;t<i.length;t++){e=i[t];var s=n.indexOf(e);-1===s?(s=r.indexOf(e))>-1&&(e.state=l.REMOVED,r.splice(s,1)):(e.state=l.REMOVED,n.splice(s,1))}for(i.length=0,i=this._add,t=0;t<i.length;t++)(e=i[t]).state===l.PENDING_ADD&&(e.init()?(e.play(),this._active.push(e)):this._pending.push(e));i.length=0,this._toProcess=0}},update:function(t,e){var i,n=this._active;e*=this.timeScale;for(var r=0;r<n.length;r++)(i=n[r]).update(t,e)&&(this._destroy.push(i),this._toProcess++)},remove:function(t){return n(this._add,t),n(this._pending,t),n(this._active,t),n(this._destroy,t),t.state=l.REMOVED,this},makeActive:function(t){if(-1!==this._add.indexOf(t)||-1!==this._active.indexOf(t))return this;var e=this._pending.indexOf(t);return-1!==e&&this._pending.splice(e,1),this._add.push(t),t.state=l.PENDING_ADD,this._toProcess++,this},each:function(t,e){for(var i=[null],n=1;n<arguments.length;n++)i.push(arguments[n]);for(var r in this.list)i[0]=this.list[r],t.apply(e,i)},getAllTweens:function(){for(var t=this._active,e=[],i=0;i<t.length;i++)e.push(t[i]);return e},getGlobalTimeScale:function(){return this.timeScale},getTweensOf:function(t){var e,i,n=this._active,r=[];if(Array.isArray(t))for(i=0;i<n.length;i++){e=n[i];for(var s=0;s<t.length;s++)e.hasTarget(t[s])&&r.push(e)}else for(i=0;i<n.length;i++)(e=n[i]).hasTarget(t)&&r.push(e);return r},isTweening:function(t){for(var e,i=this._active,n=0;n<i.length;n++)if((e=i[n]).hasTarget(t)&&e.isPlaying())return!0;return!1},killAll:function(){for(var t=this.getAllTweens(),e=0;e<t.length;e++)t[e].stop();return this},killTweensOf:function(t){for(var e=this.getTweensOf(t),i=0;i<e.length;i++)e[i].stop();return this},pauseAll:function(){for(var t=this._active,e=0;e<t.length;e++)t[e].pause();return this},resumeAll:function(){for(var t=this._active,e=0;e<t.length;e++)t[e].resume();return this},setGlobalTimeScale:function(t){return this.timeScale=t,this},shutdown:function(){this.killAll(),this._add=[],this._pending=[],this._active=[],this._destroy=[],this._toProcess=0;var t=this.systems.events;t.off(a.PRE_UPDATE,this.preUpdate,this),t.off(a.UPDATE,this.update,this),t.off(a.SHUTDOWN,this.shutdown,this)},destroy:function(){this.shutdown(),this.scene.sys.events.off(a.START,this.start,this),this.scene=null,this.systems=null}});o.register("TweenManager",d,"tweens"),t.exports=d},32336:t=>{t.exports=function(t,e,i){return t&&t.hasOwnProperty(e)?t[e]:i}},38852:(t,e,i)=>{var n=i(21623),r=i(93225);t.exports=function(t,e){var i=n.Power0;if("string"==typeof t)if(n.hasOwnProperty(t))i=n[t];else{var s="";t.indexOf(".")&&("in"===(s=t.substr(t.indexOf(".")+1)).toLowerCase()?s="easeIn":"out"===s.toLowerCase()?s="easeOut":"inout"===s.toLowerCase()&&(s="easeInOut")),t=r(t.substr(0,t.indexOf(".")+1)+s),n.hasOwnProperty(t)&&(i=n[t])}else"function"==typeof t?i=t:Array.isArray(t)&&t.length;if(!e)return i;var o=e.slice(0);return o.unshift(0),function(t){return o[0]=t,i.apply(this,o)}}},57777:t=>{t.exports=function(t,e,i){var n;t.hasOwnProperty(e)?n="function"===typeof t[e]?function(i,n,r,s,o,a){return t[e](i,n,r,s,o,a)}:function(){return t[e]}:n="function"==typeof i?i:function(){return i};return n}},57373:(t,e,i)=>{var n=i(36084);t.exports=function(t){var e,i=[];if(t.hasOwnProperty("props"))for(e in t.props)"_"!==e.substr(0,1)&&i.push({key:e,value:t.props[e]});else for(e in t)-1===n.indexOf(e)&&"_"!==e.substr(0,1)&&i.push({key:e,value:t[e]});return i}},64699:(t,e,i)=>{var n=i(86652);t.exports=function(t){var e=n(t,"targets",null);return null===e||("function"==typeof e&&(e=e.call()),Array.isArray(e)||(e=[e])),e}},99744:(t,e,i)=>{var n=i(86652);t.exports=function(t){var e=n(t,"tweens",null);return null===e?[]:("function"==typeof e&&(e=e.call()),Array.isArray(e)||(e=[e]),e)}},96910:t=>{function e(t){return!!t.getActive&&"function"==typeof t.getActive}function i(t){return!!t.getStart&&"function"==typeof t.getStart}function n(t){return!!t.getEnd&&"function"==typeof t.getEnd}var r=function(t,s){var o,a,h=function(t,e,i){return i},u=function(t,e,i){return i},l=null,c=typeof s;if("number"===c)h=function(){return s};else if("string"===c){var d=s[0],p=parseFloat(s.substr(2));switch(d){case"+":h=function(t,e,i){return i+p};break;case"-":h=function(t,e,i){return i-p};break;case"*":h=function(t,e,i){return i*p};break;case"/":h=function(t,e,i){return i/p};break;default:h=function(){return parseFloat(s)}}}else if("function"===c)h=s;else if("object"===c)if(i(a=s)||n(a)||e(a))e(s)&&(l=s.getActive),n(s)&&(h=s.getEnd),i(s)&&(u=s.getStart);else if(s.hasOwnProperty("value"))o=r(t,s.value);else{var f=s.hasOwnProperty("to"),m=s.hasOwnProperty("from"),v=s.hasOwnProperty("start");if(f&&(m||v)){if(o=r(t,s.to),v){var g=r(t,s.start);o.getActive=g.getEnd}if(m){var y=r(t,s.from);o.getStart=y.getEnd}}}return o||(o={getActive:l,getEnd:h,getStart:u}),o};t.exports=r},53063:(t,e,i)=>{var n=i(21635),r=i(57687),s=i(32336),o=i(38852),a=i(57777),h=i(86652),u=i(96910),l=i(68323),c=i(72721);t.exports=function(t,e,i){void 0===i&&(i=n);var d=h(e,"from",0),p=h(e,"to",1),f=[{value:d}],m=a(e,"delay",i.delay),v=a(e,"duration",i.duration),g=h(e,"easeParams",i.easeParams),y=o(h(e,"ease",i.ease),g),_=a(e,"hold",i.hold),x=a(e,"repeat",i.repeat),b=a(e,"repeatDelay",i.repeatDelay),w=s(e,"yoyo",i.yoyo),T=[],M=u("value",p),S=c(f[0],0,"value",M.getEnd,M.getStart,M.getActive,y,m,v,w,_,x,b,!1,!1);S.start=d,S.current=d,S.to=p,T.push(S);var E=new l(t,T,f);E.offset=r(e,"offset",null),E.completeDelay=r(e,"completeDelay",0),E.loop=Math.round(r(e,"loop",0)),E.loopDelay=Math.round(r(e,"loopDelay",0)),E.paused=s(e,"paused",!1),E.useFrames=s(e,"useFrames",!1);for(var L=h(e,"callbackScope",E),A=[E,null],D=l.TYPES,P=0;P<D.length;P++){var C=D[P],O=h(e,C,!1);if(O){var k=h(e,C+"Scope",L),R=h(e,C+"Params",[]);E.setCallback(C,O,A.concat(R),k)}}return E}},34906:(t,e,i)=>{var n=i(38852),r=i(86652),s=i(14302);t.exports=function(t,e){void 0===e&&(e={});var i=r(e,"start",0),o=r(e,"ease",null),a=r(e,"grid",null),h=r(e,"from",0),u="first"===h,l="center"===h,c="last"===h,d="number"==typeof h,p=Array.isArray(t),f=p?parseFloat(t[0]):parseFloat(t),m=p?parseFloat(t[1]):0,v=Math.max(f,m);if(p&&(i+=f),a){var g=a[0],y=a[1],_=0,x=0,b=0,w=0,T=[];c?(_=g-1,x=y-1):d?(_=h%g,x=Math.floor(h/g)):l&&(_=(g-1)/2,x=(y-1)/2);for(var M=s.MIN_SAFE_INTEGER,S=0;S<y;S++){T[S]=[];for(var E=0;E<g;E++){b=_-E,w=x-S;var L=Math.sqrt(b*b+w*w);L>M&&(M=L),T[S][E]=L}}}var A=o?n(o):null;return a?function(t,e,n,r){var s,o=0,a=r%g,h=Math.floor(r/g);if(a>=0&&a<g&&h>=0&&h<y&&(o=T[h][a]),p){var u=m-f;s=A?o/M*u*A(o/M):o/M*u}else s=A?o*f*A(o/M):o*f;return s+i}:function(t,e,n,r,s){var o,a,g;(s--,u?o=r:l?o=Math.abs(s/2-r):c?o=s-r:d&&(o=Math.abs(h-r)),p)?(g=l?(m-f)/s*(2*o):(m-f)/s*o,a=A?g*A(o/s):g):a=A?s*v*A(o/s):o*f;return a+i}}},61690:(t,e,i)=>{var n=i(18438),r=i(21635),s=i(57687),o=i(32336),a=i(38852),h=i(57777),u=i(64699),l=i(99744),c=i(86652),d=i(11913),p=i(7480);t.exports=function(t,e){var i=new d(t),f=l(e);if(0===f.length)return i.paused=!0,i;var m=n(r);m.targets=u(e);var v=s(e,"totalDuration",0);m.duration=v>0?Math.floor(v/f.length):h(e,"duration",m.duration),m.delay=h(e,"delay",m.delay),m.easeParams=c(e,"easeParams",m.easeParams),m.ease=a(c(e,"ease",m.ease),m.easeParams),m.hold=h(e,"hold",m.hold),m.repeat=h(e,"repeat",m.repeat),m.repeatDelay=h(e,"repeatDelay",m.repeatDelay),m.yoyo=o(e,"yoyo",m.yoyo),m.flipX=o(e,"flipX",m.flipX),m.flipY=o(e,"flipY",m.flipY);for(var g=0;g<f.length;g++)i.queue(p(i,f[g],m));i.completeDelay=s(e,"completeDelay",0),i.loop=Math.round(s(e,"loop",0)),i.loopDelay=Math.round(s(e,"loopDelay",0)),i.paused=o(e,"paused",!1),i.useFrames=o(e,"useFrames",!1);var y=c(e,"callbackScope",i),_=[i],x=c(e,"onStart",!1);if(x){var b=c(e,"onStartScope",y),w=c(e,"onStartParams",[]);i.setCallback("onStart",x,_.concat(w),b)}var T=c(e,"onUpdate",!1);if(T){var M=c(e,"onUpdateScope",y),S=c(e,"onUpdateParams",[]);i.setCallback("onUpdate",T,_.concat(S),M)}var E=c(e,"onLoop",!1);if(E){var L=c(e,"onLoopScope",y),A=c(e,"onLoopParams",[]);i.setCallback("onLoop",E,_.concat(A),L)}var D=c(e,"onYoyo",!1);if(D){var P=c(e,"onYoyoScope",y),C=c(e,"onYoyoParams",[]);i.setCallback("onYoyo",D,_.concat(null,C),P)}var O=c(e,"onComplete",!1);if(O){var k=c(e,"onCompleteScope",y),R=c(e,"onCompleteParams",[]);i.setCallback("onComplete",O,_.concat(R),k)}return i}},7480:(t,e,i)=>{var n=i(21635),r=i(57687),s=i(32336),o=i(38852),a=i(57777),h=i(57373),u=i(64699),l=i(86652),c=i(96910),d=i(68323),p=i(72721);t.exports=function(t,e,i){void 0===i&&(i=n);for(var f=i.targets?i.targets:u(e),m=h(e),v=a(e,"delay",i.delay),g=a(e,"duration",i.duration),y=l(e,"easeParams",i.easeParams),_=o(l(e,"ease",i.ease),y),x=a(e,"hold",i.hold),b=a(e,"repeat",i.repeat),w=a(e,"repeatDelay",i.repeatDelay),T=s(e,"yoyo",i.yoyo),M=s(e,"flipX",i.flipX),S=s(e,"flipY",i.flipY),E=[],L=0;L<m.length;L++)for(var A=m[L].key,D=m[L].value,P=0;P<f.length;P++){var C=c(A,D),O=p(f[P],P,A,C.getEnd,C.getStart,C.getActive,o(l(D,"ease",_),y),a(D,"delay",v),a(D,"duration",g),s(D,"yoyo",T),a(D,"hold",x),a(D,"repeat",b),a(D,"repeatDelay",w),s(D,"flipX",M),s(D,"flipY",S));E.push(O)}var k=new d(t,E,f);k.offset=r(e,"offset",null),k.completeDelay=r(e,"completeDelay",0),k.loop=Math.round(r(e,"loop",0)),k.loopDelay=Math.round(r(e,"loopDelay",0)),k.paused=s(e,"paused",!1),k.useFrames=s(e,"useFrames",!1);for(var R=l(e,"callbackScope",k),I=[k,null],Y=d.TYPES,F=0;F<Y.length;F++){var N=Y[F],B=l(e,N,!1);if(B){var U=l(e,N+"Scope",R),j=l(e,N+"Params",[]);k.setCallback(N,B,I.concat(j),U)}}return k}},77626:(t,e,i)=>{t.exports={GetBoolean:i(32336),GetEaseFunction:i(38852),GetNewValue:i(57777),GetProps:i(57373),GetTargets:i(64699),GetTweens:i(99744),GetValueOp:i(96910),NumberTweenBuilder:i(53063),StaggerBuilder:i(34906),TimelineBuilder:i(61690),TweenBuilder:i(7480)}},50711:t=>{t.exports="complete"},63802:t=>{t.exports="loop"},99942:t=>{t.exports="pause"},40742:t=>{t.exports="resume"},15038:t=>{t.exports="start"},85015:t=>{t.exports="update"},56788:t=>{t.exports="active"},54461:t=>{t.exports="complete"},10004:t=>{t.exports="loop"},64121:t=>{t.exports="repeat"},51680:t=>{t.exports="start"},76568:t=>{t.exports="update"},55204:t=>{t.exports="yoyo"},91209:(t,e,i)=>{t.exports={TIMELINE_COMPLETE:i(50711),TIMELINE_LOOP:i(63802),TIMELINE_PAUSE:i(99942),TIMELINE_RESUME:i(40742),TIMELINE_START:i(15038),TIMELINE_UPDATE:i(85015),TWEEN_ACTIVE:i(56788),TWEEN_COMPLETE:i(54461),TWEEN_LOOP:i(10004),TWEEN_REPEAT:i(64121),TWEEN_START:i(51680),TWEEN_UPDATE:i(76568),TWEEN_YOYO:i(55204)}},93226:(t,e,i)=>{var n=i(3926),r=i(80933),s={Builders:i(77626),Events:i(91209),TweenManager:i(57294),Tween:i(68323),TweenData:i(72721),Timeline:i(11913)};s=r(!1,s,n),t.exports=s},21635:t=>{t.exports={targets:null,delay:0,duration:1e3,ease:"Power0",easeParams:null,hold:0,repeat:0,repeatDelay:0,yoyo:!1,flipX:!1,flipY:!1}},36084:t=>{t.exports=["callbackScope","completeDelay","delay","duration","ease","easeParams","flipX","flipY","hold","loop","loopDelay","offset","onActive","onActiveParams","onActiveScope","onComplete","onCompleteParams","onCompleteScope","onLoop","onLoopParams","onLoopScope","onRepeat","onRepeatParams","onRepeatScope","onStart","onStartParams","onStartScope","onUpdate","onUpdateParams","onUpdateScope","onYoyo","onYoyoParams","onYoyoScope","paused","props","repeat","repeatDelay","targets","useFrames","yoyo"]},68323:(t,e,i)=>{var n=i(47379),r=i(17168),s=i(91209),o=i(17517),a=i(81342),h=i(3926),u=i(14302),l=new n({Extends:r,initialize:function(t,e,i){r.call(this),this.parent=t,this.parentIsTimeline=t.hasOwnProperty("isTimeline"),this.data=e,this.totalData=e.length,this.targets=i,this.totalTargets=i.length,this.useFrames=!1,this.timeScale=1,this.loop=0,this.loopDelay=0,this.loopCounter=0,this.startDelay=0,this.hasStarted=!1,this.isSeeking=!1,this.completeDelay=0,this.countdown=0,this.offset=0,this.calculatedOffset=0,this.state=h.PENDING_ADD,this._pausedState=h.INIT,this.paused=!1,this.elapsed=0,this.totalElapsed=0,this.duration=0,this.progress=0,this.totalDuration=0,this.totalProgress=0,this.callbacks={onActive:null,onComplete:null,onLoop:null,onRepeat:null,onStart:null,onUpdate:null,onYoyo:null},this.callbackScope},getValue:function(t){return void 0===t&&(t=0),this.data[t].current},setTimeScale:function(t){return this.timeScale=t,this},getTimeScale:function(){return this.timeScale},isPlaying:function(){return this.state===h.ACTIVE},isPaused:function(){return this.state===h.PAUSED},hasTarget:function(t){return-1!==this.targets.indexOf(t)},updateTo:function(t,e,i){void 0===i&&(i=!1);for(var n=0;n<this.totalData;n++){var r=this.data[n];r.key===t&&(r.end=e,i&&(r.start=r.current))}return this},restart:function(){return this.elapsed=0,this.progress=0,this.totalElapsed=0,this.totalProgress=0,this.state===h.ACTIVE?this.seek(0):this.state===h.REMOVED?(this.seek(0),this.parent.makeActive(this),this):this.state===h.PENDING_ADD?this:this.play()},calcDuration:function(){for(var t=0,e=u.MAX_SAFE_INTEGER,i=this.data,n=0;n<this.totalData;n++){var r=i[n];r.t1=r.duration+r.hold,r.yoyo&&(r.t1+=r.duration),r.t2=r.t1+r.repeatDelay,r.totalDuration=r.delay+r.t1,-1===r.repeat?r.totalDuration+=999999999999*r.t2:r.repeat>0&&(r.totalDuration+=r.t2*r.repeat),r.totalDuration>t&&(t=r.totalDuration),r.delay<e&&(e=r.delay)}this.duration=Math.max(t,.001),this.loopCounter=-1===this.loop?999999999999:this.loop,this.loopCounter>0?this.totalDuration=this.duration+this.completeDelay+(this.duration+this.loopDelay)*this.loopCounter:this.totalDuration=this.duration+this.completeDelay,this.startDelay=e},init:function(){if(this.paused&&!this.parentIsTimeline)return this.state=h.PENDING_ADD,this._pausedState=h.INIT,!1;for(var t=this.data,e=this.totalTargets,i=0;i<this.totalData;i++){var n=t[i],r=n.target,s=n.gen,o=n.key,a=n.index;n.delay=s.delay(r,o,0,a,e,this),n.duration=Math.max(s.duration(r,o,0,a,e,this),.001),n.hold=s.hold(r,o,0,a,e,this),n.repeat=s.repeat(r,o,0,a,e,this),n.repeatDelay=s.repeatDelay(r,o,0,a,e,this)}return this.calcDuration(),this.progress=0,this.totalProgress=0,this.elapsed=0,this.totalElapsed=0,this.state=h.INIT,!0},makeActive:function(){this.parent.makeActive(this),this.dispatchTweenEvent(s.TWEEN_ACTIVE,this.callbacks.onActive)},nextState:function(){this.loopCounter>0?(this.elapsed=0,this.progress=0,this.loopCounter--,this.resetTweenData(!0),this.loopDelay>0?(this.countdown=this.loopDelay,this.state=h.LOOP_DELAY):(this.state=h.ACTIVE,this.dispatchTweenEvent(s.TWEEN_LOOP,this.callbacks.onLoop))):this.completeDelay>0?(this.state=h.COMPLETE_DELAY,this.countdown=this.completeDelay):(this.state=h.PENDING_REMOVE,this.dispatchTweenEvent(s.TWEEN_COMPLETE,this.callbacks.onComplete))},pause:function(){return this.state===h.PAUSED||(this.paused=!0,this._pausedState=this.state,this.state=h.PAUSED),this},play:function(t){void 0===t&&(t=!1);var e=this.state;return e!==h.INIT||this.parentIsTimeline?e===h.ACTIVE||e===h.PENDING_ADD&&this._pausedState===h.PENDING_ADD?this:this.parentIsTimeline||e!==h.PENDING_REMOVE&&e!==h.REMOVED?(this.parentIsTimeline?(this.resetTweenData(t),0===this.calculatedOffset?this.state=h.ACTIVE:(this.countdown=this.calculatedOffset,this.state=h.OFFSET_DELAY)):this.paused?(this.paused=!1,this.makeActive()):(this.resetTweenData(t),this.state=h.ACTIVE,this.makeActive()),this):(this.seek(0),this.parent.makeActive(this),this):(this.resetTweenData(!1),this.state=h.ACTIVE,this)},resetTweenData:function(t){for(var e=this.data,i=this.totalData,n=this.totalTargets,r=0;r<i;r++){var s=e[r],o=s.target,a=s.key,u=s.index;s.progress=0,s.elapsed=0,s.repeatCounter=-1===s.repeat?999999999999:s.repeat,t?(s.start=s.getStartValue(o,a,s.start,u,n,this),s.end=s.getEndValue(o,a,s.end,u,n,this),s.current=s.start,s.state=h.PLAYING_FORWARD):s.state=h.PENDING_RENDER,s.delay>0&&(s.elapsed=s.delay,s.state=h.DELAY),s.getActiveValue&&(o[a]=s.getActiveValue(s.target,s.key,s.start))}},resume:function(){return this.state===h.PAUSED?(this.paused=!1,this.state=this._pausedState):this.play(),this},seek:function(t,e){if(void 0===e&&(e=16.6),this.totalDuration>=36e5)return console.warn("Tween.seek duration too long"),this;this.state===h.REMOVED&&this.makeActive(),this.elapsed=0,this.progress=0,this.totalElapsed=0,this.totalProgress=0;for(var i=this.data,n=this.totalTargets,r=0;r<this.totalData;r++){var s=i[r],o=s.target,a=s.gen,u=s.key,l=s.index;s.progress=0,s.elapsed=0,s.repeatCounter=-1===s.repeat?999999999999:s.repeat,s.delay=a.delay(o,u,0,l,n,this),s.duration=Math.max(a.duration(o,u,0,l,n,this),.001),s.hold=a.hold(o,u,0,l,n,this),s.repeat=a.repeat(o,u,0,l,n,this),s.repeatDelay=a.repeatDelay(o,u,0,l,n,this),s.current=s.start,s.state=h.PLAYING_FORWARD,this.updateTweenData(this,s,0,l,n),s.delay>0&&(s.elapsed=s.delay,s.state=h.DELAY)}this.calcDuration();var c=!1;this.state===h.PAUSED&&(c=!0,this.state=h.ACTIVE),this.isSeeking=!0;do{this.update(0,e)}while(this.totalProgress<t);return this.isSeeking=!1,c&&(this.state=h.PAUSED),this},setCallback:function(t,e,i,n){return this.callbacks[t]={func:e,scope:n,params:i},this},complete:function(t){return void 0===t&&(t=0),t?(this.state=h.COMPLETE_DELAY,this.countdown=t):(this.state=h.PENDING_REMOVE,this.dispatchTweenEvent(s.TWEEN_COMPLETE,this.callbacks.onComplete)),this},remove:function(){return this.parent.remove(this),this},stop:function(t){return this.state===h.ACTIVE&&void 0!==t&&this.seek(t),this.state!==h.REMOVED&&(this.state!==h.PAUSED&&this.state!==h.PENDING_ADD||(this.parentIsTimeline?(this.parent.manager._destroy.push(this),this.parent.manager._toProcess++):(this.parent._destroy.push(this),this.parent._toProcess++)),this.removeAllListeners(),this.state=h.PENDING_REMOVE),this},update:function(t,e){if(this.state===h.PAUSED)return!1;switch(this.useFrames&&(e=1*this.parent.timeScale),e*=this.timeScale,this.elapsed+=e,this.progress=Math.min(this.elapsed/this.duration,1),this.totalElapsed+=e,this.totalProgress=Math.min(this.totalElapsed/this.totalDuration,1),this.state){case h.ACTIVE:this.hasStarted||this.isSeeking||(this.startDelay-=e,this.startDelay<=0&&(this.hasStarted=!0,this.dispatchTweenEvent(s.TWEEN_START,this.callbacks.onStart)));for(var i=!1,n=0;n<this.totalData;n++){var r=this.data[n];this.updateTweenData(this,r,e)&&(i=!0)}i||this.nextState();break;case h.LOOP_DELAY:this.countdown-=e,this.countdown<=0&&(this.state=h.ACTIVE,this.dispatchTweenEvent(s.TWEEN_LOOP,this.callbacks.onLoop));break;case h.OFFSET_DELAY:this.countdown-=e,this.countdown<=0&&(this.state=h.ACTIVE);break;case h.COMPLETE_DELAY:this.countdown-=e,this.countdown<=0&&(this.state=h.PENDING_REMOVE,this.dispatchTweenEvent(s.TWEEN_COMPLETE,this.callbacks.onComplete))}return this.state===h.PENDING_REMOVE},dispatchTweenDataEvent:function(t,e,i){this.isSeeking||(this.emit(t,this,i.key,i.target,i.current,i.previous),e&&(e.params[1]=i.target,e.func.apply(e.scope,e.params)))},dispatchTweenEvent:function(t,e){this.isSeeking||(this.emit(t,this,this.targets),e&&(e.params[1]=this.targets,e.func.apply(e.scope,e.params)))},setStateFromEnd:function(t,e,i){return e.yoyo?(e.elapsed=i,e.progress=i/e.duration,e.flipX&&e.target.toggleFlipX(),e.flipY&&e.target.toggleFlipY(),this.dispatchTweenDataEvent(s.TWEEN_YOYO,t.callbacks.onYoyo,e),e.start=e.getStartValue(e.target,e.key,e.start,e.index,t.totalTargets,t),h.PLAYING_BACKWARD):e.repeatCounter>0?(e.repeatCounter--,e.elapsed=i,e.progress=i/e.duration,e.flipX&&e.target.toggleFlipX(),e.flipY&&e.target.toggleFlipY(),e.start=e.getStartValue(e.target,e.key,e.start,e.index,t.totalTargets,t),e.end=e.getEndValue(e.target,e.key,e.start,e.index,t.totalTargets,t),e.repeatDelay>0?(e.elapsed=e.repeatDelay-i,e.current=e.start,e.target[e.key]=e.current,h.REPEAT_DELAY):(this.dispatchTweenDataEvent(s.TWEEN_REPEAT,t.callbacks.onRepeat,e),h.PLAYING_FORWARD)):h.COMPLETE},setStateFromStart:function(t,e,i){return e.repeatCounter>0?(e.repeatCounter--,e.elapsed=i,e.progress=i/e.duration,e.flipX&&e.target.toggleFlipX(),e.flipY&&e.target.toggleFlipY(),e.end=e.getEndValue(e.target,e.key,e.start,e.index,t.totalTargets,t),e.repeatDelay>0?(e.elapsed=e.repeatDelay-i,e.current=e.start,e.target[e.key]=e.current,h.REPEAT_DELAY):(this.dispatchTweenDataEvent(s.TWEEN_REPEAT,t.callbacks.onRepeat,e),h.PLAYING_FORWARD)):h.COMPLETE},updateTweenData:function(t,e,i){var n=e.target;switch(e.state){case h.PLAYING_FORWARD:case h.PLAYING_BACKWARD:if(!n){e.state=h.COMPLETE;break}var r=e.elapsed,o=e.duration,a=0;(r+=i)>o&&(a=r-o,r=o);var u=e.state===h.PLAYING_FORWARD,l=r/o;if(e.elapsed=r,e.progress=l,e.previous=e.current,1===l)u?(e.current=e.end,n[e.key]=e.end,e.hold>0?(e.elapsed=e.hold-a,e.state=h.HOLD_DELAY):e.state=this.setStateFromEnd(t,e,a)):(e.current=e.start,n[e.key]=e.start,e.state=this.setStateFromStart(t,e,a));else{var c=u?e.ease(l):e.ease(1-l);e.current=e.start+(e.end-e.start)*c,n[e.key]=e.current}this.dispatchTweenDataEvent(s.TWEEN_UPDATE,t.callbacks.onUpdate,e);break;case h.DELAY:e.elapsed-=i,e.elapsed<=0&&(e.elapsed=Math.abs(e.elapsed),e.state=h.PENDING_RENDER);break;case h.REPEAT_DELAY:e.elapsed-=i,e.elapsed<=0&&(e.elapsed=Math.abs(e.elapsed),e.state=h.PLAYING_FORWARD,this.dispatchTweenDataEvent(s.TWEEN_REPEAT,t.callbacks.onRepeat,e));break;case h.HOLD_DELAY:e.elapsed-=i,e.elapsed<=0&&(e.state=this.setStateFromEnd(t,e,Math.abs(e.elapsed)));break;case h.PENDING_RENDER:n?(e.start=e.getStartValue(n,e.key,n[e.key],e.index,t.totalTargets,t),e.end=e.getEndValue(n,e.key,e.start,e.index,t.totalTargets,t),e.current=e.start,n[e.key]=e.start,e.state=h.PLAYING_FORWARD):e.state=h.COMPLETE}return e.state!==h.COMPLETE}});l.TYPES=["onActive","onComplete","onLoop","onRepeat","onStart","onUpdate","onYoyo"],a.register("tween",(function(t){return this.scene.sys.tweens.add(t)})),o.register("tween",(function(t){return this.scene.sys.tweens.create(t)})),t.exports=l},72721:t=>{t.exports=function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f){return{target:t,index:e,key:i,getActiveValue:s,getEndValue:n,getStartValue:r,ease:o,duration:0,totalDuration:0,delay:0,yoyo:u,hold:0,repeat:0,repeatDelay:0,flipX:p,flipY:f,progress:0,elapsed:0,repeatCounter:0,start:0,previous:0,current:0,end:0,t1:0,t2:0,gen:{delay:a,duration:h,hold:l,repeat:c,repeatDelay:d},state:0}}},3926:t=>{t.exports={CREATED:0,INIT:1,DELAY:2,OFFSET_DELAY:3,PENDING_RENDER:4,PLAYING_FORWARD:5,PLAYING_BACKWARD:6,HOLD_DELAY:7,REPEAT_DELAY:8,COMPLETE:9,PENDING_ADD:20,PAUSED:21,LOOP_DELAY:22,ACTIVE:23,COMPLETE_DELAY:24,PENDING_REMOVE:25,REMOVED:26}},47379:t=>{function e(t,e,i){var n=i?t[e]:Object.getOwnPropertyDescriptor(t,e);return!i&&n.value&&"object"==typeof n.value&&(n=n.value),!(!n||!function(t){return!!t.get&&"function"==typeof t.get||!!t.set&&"function"==typeof t.set}(n))&&(void 0===n.enumerable&&(n.enumerable=!0),void 0===n.configurable&&(n.configurable=!0),n)}function i(t,e){var i=Object.getOwnPropertyDescriptor(t,e);return!!i&&(i.value&&"object"==typeof i.value&&(i=i.value),!1===i.configurable)}function n(t,n,r,o){for(var a in n)if(n.hasOwnProperty(a)){var h=e(n,a,r);if(!1!==h){if(i((o||t).prototype,a)){if(s.ignoreFinals)continue;throw new Error("cannot override final property '"+a+"', set Class.ignoreFinals = true to skip")}Object.defineProperty(t.prototype,a,h)}else t.prototype[a]=n[a]}}function r(t,e){if(e){Array.isArray(e)||(e=[e]);for(var i=0;i<e.length;i++)n(t,e[i].prototype||e[i])}}function s(t){var e,i;if(t||(t={}),t.initialize){if("function"!=typeof t.initialize)throw new Error("initialize must be a function");e=t.initialize,delete t.initialize}else if(t.Extends){var s=t.Extends;e=function(){s.apply(this,arguments)}}else e=function(){};t.Extends?(e.prototype=Object.create(t.Extends.prototype),e.prototype.constructor=e,i=t.Extends,delete t.Extends):e.prototype.constructor=e;var o=null;return t.Mixins&&(o=t.Mixins,delete t.Mixins),r(e,o),n(e,t,!0,i),e}s.extend=n,s.mixin=r,s.ignoreFinals=!1,t.exports=s},49035:t=>{t.exports=function(){}},35486:t=>{t.exports=function(t,e,i,n,r){if(void 0===r&&(r=t),i>0){var s=i-t.length;if(s<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.push(e),n&&n.call(r,e),e):null;for(var o=e.length-1;o>=0;)-1!==t.indexOf(e[o])&&e.splice(o,1),o--;if(0===(o=e.length))return null;i>0&&o>s&&(e.splice(s),o=s);for(var a=0;a<o;a++){var h=e[a];t.push(h),n&&n.call(r,h)}return e}},63493:t=>{t.exports=function(t,e,i,n,r,s){if(void 0===i&&(i=0),void 0===s&&(s=t),n>0){var o=n-t.length;if(o<=0)return null}if(!Array.isArray(e))return-1===t.indexOf(e)?(t.splice(i,0,e),r&&r.call(s,e),e):null;for(var a=e.length-1;a>=0;)-1!==t.indexOf(e[a])&&e.pop(),a--;if(0===(a=e.length))return null;n>0&&a>o&&(e.splice(o),a=o);for(var h=a-1;h>=0;h--){var u=e[h];t.splice(i,0,u),r&&r.call(s,u)}return e}},74928:t=>{t.exports=function(t,e){var i=t.indexOf(e);return-1!==i&&i<t.length&&(t.splice(i,1),t.push(e)),e}},87674:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){void 0===r&&(r=0),void 0===s&&(s=t.length);var o=0;if(n(t,r,s))for(var a=r;a<s;a++){t[a][e]===i&&o++}return o}},574:t=>{t.exports=function(t,e,i){var n,r=[null];for(n=3;n<arguments.length;n++)r.push(arguments[n]);for(n=0;n<t.length;n++)r[0]=t[n],e.apply(i,r);return t}},33923:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){if(void 0===r&&(r=0),void 0===s&&(s=t.length),n(t,r,s)){var o,a=[null];for(o=5;o<arguments.length;o++)a.push(arguments[o]);for(o=r;o<s;o++)a[0]=t[o],e.apply(i,a)}return t}},87559:t=>{t.exports=function(t,e,i){if(!e.length)return NaN;if(1===e.length)return e[0];var n,r,s=1;if(i){if(t<e[0][i])return e[0];for(;e[s][i]<t;)s++}else for(;e[s]<t;)s++;return s>e.length&&(s=e.length),i?(n=e[s-1][i],(r=e[s][i])-t<=t-n?e[s]:e[s-1]):(n=e[s-1],(r=e[s])-t<=t-n?r:n)}},50774:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){void 0===r&&(r=0),void 0===s&&(s=t.length);var o=[];if(n(t,r,s))for(var a=r;a<s;a++){var h=t[a];(!e||e&&void 0===i&&h.hasOwnProperty(e)||e&&void 0!==i&&h[e]===i)&&o.push(h)}return o}},56606:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){if(void 0===r&&(r=0),void 0===s&&(s=t.length),n(t,r,s))for(var o=r;o<s;o++){var a=t[o];if(!e||e&&void 0===i&&a.hasOwnProperty(e)||e&&void 0!==i&&a[e]===i)return a}return null}},51750:t=>{t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=t.length);var n=e+Math.floor(Math.random()*i);return void 0===t[n]?null:t[n]}},87332:t=>{t.exports=function(t,e){var i=t.indexOf(e);if(i>0){var n=t[i-1],r=t.indexOf(n);t[i]=n,t[r]=e}return t}},49556:t=>{t.exports=function(t,e,i){var n=t.indexOf(e);if(-1===n||i<0||i>=t.length)throw new Error("Supplied index out of bounds");return n!==i&&(t.splice(n,1),t.splice(i,0,e)),e}},21834:t=>{t.exports=function(t,e){var i=t.indexOf(e);if(-1!==i&&i<t.length-1){var n=t[i+1],r=t.indexOf(n);t[i]=n,t[r]=e}return t}},42570:t=>{t.exports=function(t,e,i,n){for(var r=[],s=t;s<=e;s++)if(i||n){var o=i?i+s.toString():s.toString();n&&(o=o.concat(n)),r.push(o)}else r.push(s);return r}},18821:(t,e,i)=>{var n=i(8682);t.exports=function(t,e,i){void 0===t&&(t=0),void 0===e&&(e=null),void 0===i&&(i=1),null===e&&(e=t,t=0);for(var r=[],s=Math.max(n((e-t)/(i||1)),0),o=0;o<s;o++)r.push(t),t+=i;return r}},33366:t=>{function e(t,e,i){var n=t[e];t[e]=t[i],t[i]=n}function i(t,e){return t<e?-1:t>e?1:0}var n=function(t,r,s,o,a){for(void 0===s&&(s=0),void 0===o&&(o=t.length-1),void 0===a&&(a=i);o>s;){if(o-s>600){var h=o-s+1,u=r-s+1,l=Math.log(h),c=.5*Math.exp(2*l/3),d=.5*Math.sqrt(l*c*(h-c)/h)*(u-h/2<0?-1:1),p=Math.max(s,Math.floor(r-u*c/h+d)),f=Math.min(o,Math.floor(r+(h-u)*c/h+d));n(t,r,p,f,a)}var m=t[r],v=s,g=o;for(e(t,s,r),a(t[o],m)>0&&e(t,s,o);v<g;){for(e(t,v,g),v++,g--;a(t[v],m)<0;)v++;for(;a(t[g],m)>0;)g--}0===a(t[s],m)?e(t,s,g):e(t,++g,o),g<=r&&(s=g+1),r<=g&&(o=g-1)}};t.exports=n},81903:(t,e,i)=>{var n=i(86652),r=i(84851),s=function(t,e,i){for(var n=[],r=0;r<t.length;r++)for(var s=0;s<e.length;s++)for(var o=0;o<i;o++)n.push({a:t[r],b:e[s]});return n};t.exports=function(t,e,i){var o=n(i,"max",0),a=n(i,"qty",1),h=n(i,"random",!1),u=n(i,"randomB",!1),l=n(i,"repeat",0),c=n(i,"yoyo",!1),d=[];if(u&&r(e),-1===l)if(0===o)l=0;else{var p=t.length*e.length*a;c&&(p*=2),l=Math.ceil(o/p)}for(var f=0;f<=l;f++){var m=s(t,e,a);h&&r(m),d=d.concat(m),c&&(m.reverse(),d=d.concat(m))}return o&&d.splice(o),d}},60625:(t,e,i)=>{var n=i(75670);t.exports=function(t,e,i,r){var s;if(void 0===r&&(r=t),!Array.isArray(e))return-1!==(s=t.indexOf(e))?(n(t,s),i&&i.call(r,e),e):null;for(var o=e.length-1;o>=0;){var a=e[o];-1!==(s=t.indexOf(a))?(n(t,s),i&&i.call(r,a)):e.pop(),o--}return e}},62114:(t,e,i)=>{var n=i(75670);t.exports=function(t,e,i,r){if(void 0===r&&(r=t),e<0||e>t.length-1)throw new Error("Index out of bounds");var s=n(t,e);return i&&i.call(r,s),s}},97782:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){if(void 0===e&&(e=0),void 0===i&&(i=t.length),void 0===s&&(s=t),n(t,e,i)){var o=i-e,a=t.splice(e,o);if(r)for(var h=0;h<a.length;h++){var u=a[h];r.call(s,u)}return a}return[]}},32716:(t,e,i)=>{var n=i(75670);t.exports=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=t.length);var r=e+Math.floor(Math.random()*i);return n(t,r)}},17704:t=>{t.exports=function(t,e,i){var n=t.indexOf(e),r=t.indexOf(i);return-1!==n&&-1===r&&(t[n]=i,!0)}},52521:t=>{t.exports=function(t,e){void 0===e&&(e=1);for(var i=null,n=0;n<e;n++)i=t.shift(),t.push(i);return i}},90387:t=>{t.exports=function(t,e){void 0===e&&(e=1);for(var i=null,n=0;n<e;n++)i=t.pop(),t.unshift(i);return i}},3680:t=>{t.exports=function(t,e,i,n){var r=t.length;if(e<0||e>r||e>=i||i>r||e+i>r){if(n)throw new Error("Range Error: Values outside acceptable range");return!1}return!0}},91740:t=>{t.exports=function(t,e){var i=t.indexOf(e);return-1!==i&&i>0&&(t.splice(i,1),t.unshift(e)),e}},78480:(t,e,i)=>{var n=i(3680);t.exports=function(t,e,i,r,s){if(void 0===r&&(r=0),void 0===s&&(s=t.length),n(t,r,s))for(var o=r;o<s;o++){var a=t[o];a.hasOwnProperty(e)&&(a[e]=i)}return t}},84851:t=>{t.exports=function(t){for(var e=t.length-1;e>0;e--){var i=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[i],t[i]=n}return t}},75670:t=>{t.exports=function(t,e){if(!(e>=t.length)){for(var i=t.length-1,n=t[e],r=e;r<i;r++)t[r]=t[r+1];return t.length=i,n}}},59199:t=>{!function(){var e=function(t,e){return i(t.slice(),e)};function i(t,e){"function"!=typeof e&&(e=function(t,e){return String(t).localeCompare(e)});var i=t.length;if(i<=1)return t;for(var r=new Array(i),s=1;s<i;s*=2){n(t,e,s,r);var o=t;t=r,r=o}return t}e.inplace=function(t,e){var r=i(t,e);return r!==t&&n(r,null,t.length,t),t};var n=function(t,e,i,n){var r,s,o,a,h,u=t.length,l=0,c=2*i;for(r=0;r<u;r+=c)for(o=(s=r+i)+i,s>u&&(s=u),o>u&&(o=u),a=r,h=s;;)if(a<s&&h<o)e(t[a],t[h])<=0?n[l++]=t[a++]:n[l++]=t[h++];else if(a<s)n[l++]=t[a++];else{if(!(h<o))break;n[l++]=t[h++]}};t.exports=e}()},59760:t=>{t.exports=function(t,e,i){if(e!==i){var n=t.indexOf(e),r=t.indexOf(i);if(n<0||r<0)throw new Error("Supplied items must be elements of the same array");return t[n]=i,t[r]=e,t}}},37931:(t,e,i)=>{t.exports={Matrix:i(15306),Add:i(35486),AddAt:i(63493),BringToTop:i(74928),CountAllMatching:i(87674),Each:i(574),EachInRange:i(33923),FindClosestInSorted:i(87559),GetAll:i(50774),GetFirst:i(56606),GetRandom:i(51750),MoveDown:i(87332),MoveTo:i(49556),MoveUp:i(21834),NumberArray:i(42570),NumberArrayStep:i(18821),QuickSelect:i(33366),Range:i(81903),Remove:i(60625),RemoveAt:i(62114),RemoveBetween:i(97782),RemoveRandomElement:i(32716),Replace:i(17704),RotateLeft:i(52521),RotateRight:i(90387),SafeRange:i(3680),SendToBack:i(91740),SetAll:i(78480),Shuffle:i(84851),SpliceOne:i(75670),StableSort:i(59199),Swap:i(59760)}},29613:t=>{t.exports=function(t){if(!Array.isArray(t)||t.length<2||!Array.isArray(t[0]))return!1;for(var e=t[0].length,i=1;i<t.length;i++)if(t[i].length!==e)return!1;return!0}},75101:(t,e,i)=>{var n=i(10872),r=i(29613);t.exports=function(t){var e="";if(!r(t))return e;for(var i=0;i<t.length;i++){for(var s=0;s<t[i].length;s++){var o=t[i][s].toString();e+="undefined"!==o?n(o,2):"?",s<t[i].length-1&&(e+=" |")}if(i<t.length-1){e+="\n";for(var a=0;a<t[i].length;a++)e+="---",a<t[i].length-1&&(e+="+");e+="\n"}}return e}},78147:t=>{t.exports=function(t){return t.reverse()}},84782:t=>{t.exports=function(t){for(var e=0;e<t.length;e++)t[e].reverse();return t}},63353:(t,e,i)=>{var n=i(50573);t.exports=function(t){return n(t,180)}},2822:(t,e,i)=>{var n=i(50573);t.exports=function(t){return n(t,90)}},50573:(t,e,i)=>{var n=i(29613),r=i(3169);t.exports=function(t,e){if(void 0===e&&(e=90),!n(t))return null;if("string"!=typeof e&&(e=(e%360+360)%360),90===e||-270===e||"rotateLeft"===e)(t=r(t)).reverse();else if(-90===e||270===e||"rotateRight"===e)t.reverse(),t=r(t);else if(180===Math.abs(e)||"rotate180"===e){for(var i=0;i<t.length;i++)t[i].reverse();t.reverse()}return t}},68755:(t,e,i)=>{var n=i(50573);t.exports=function(t){return n(t,-90)}},3169:t=>{t.exports=function(t){for(var e=t.length,i=t[0].length,n=new Array(i),r=0;r<i;r++){n[r]=new Array(e);for(var s=e-1;s>-1;s--)n[r][s]=t[s][r]}return n}},15306:(t,e,i)=>{t.exports={CheckMatrix:i(29613),MatrixToString:i(75101),ReverseColumns:i(78147),ReverseRows:i(84782),Rotate180:i(63353),RotateLeft:i(2822),RotateMatrix:i(50573),RotateRight:i(68755),TransposeMatrix:i(3169)}},93705:t=>{var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";t.exports=function(t,i){for(var n=new Uint8Array(t),r=n.length,s=i?"data:"+i+";base64,":"",o=0;o<r;o+=3)s+=e[n[o]>>2],s+=e[(3&n[o])<<4|n[o+1]>>4],s+=e[(15&n[o+1])<<2|n[o+2]>>6],s+=e[63&n[o+2]];return r%3==2?s=s.substring(0,s.length-1)+"=":r%3==1&&(s=s.substring(0,s.length-2)+"=="),s}},31021:t=>{for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=new Uint8Array(256),n=0;n<e.length;n++)i[e.charCodeAt(n)]=n;t.exports=function(t){var e,n,r,s,o=(t=t.substr(t.indexOf(",")+1)).length,a=.75*o,h=0;"="===t[o-1]&&(a--,"="===t[o-2]&&a--);for(var u=new ArrayBuffer(a),l=new Uint8Array(u),c=0;c<o;c+=4)e=i[t.charCodeAt(c)],n=i[t.charCodeAt(c+1)],r=i[t.charCodeAt(c+2)],s=i[t.charCodeAt(c+3)],l[h++]=e<<2|n>>4,l[h++]=(15&n)<<4|r>>2,l[h++]=(3&r)<<6|63&s;return u}},3491:(t,e,i)=>{t.exports={ArrayBufferToBase64:i(93705),Base64ToArrayBuffer:i(31021)}},83484:(t,e,i)=>{t.exports={Array:i(37931),Base64:i(3491),Objects:i(14548),String:i(5246)}},18438:t=>{t.exports=function(t){var e={};for(var i in t)Array.isArray(t[i])?e[i]=t[i].slice(0):e[i]=t[i];return e}},80933:(t,e,i)=>{var n=i(28621),r=function(){var t,e,i,s,o,a,h=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof h&&(c=h,h=arguments[1]||{},u=2),l===u&&(h=this,--u);u<l;u++)if(null!=(t=arguments[u]))for(e in t)i=h[e],h!==(s=t[e])&&(c&&s&&(n(s)||(o=Array.isArray(s)))?(o?(o=!1,a=i&&Array.isArray(i)?i:[]):a=i&&n(i)?i:{},h[e]=r(c,a,s)):void 0!==s&&(h[e]=s));return h};t.exports=r},57687:(t,e,i)=>{var n=i(39899),r=i(86652);t.exports=function(t,e,i){var s=r(t,e,null);if(null===s)return i;if(Array.isArray(s))return n.RND.pick(s);if("object"==typeof s){if(s.hasOwnProperty("randInt"))return n.RND.integerInRange(s.randInt[0],s.randInt[1]);if(s.hasOwnProperty("randFloat"))return n.RND.realInRange(s.randFloat[0],s.randFloat[1])}else if("function"==typeof s)return s(e);return s}},81769:t=>{t.exports=function(t,e,i){var n=typeof t;return t&&"number"!==n&&"string"!==n&&t.hasOwnProperty(e)&&void 0!==t[e]?t[e]:i}},86535:(t,e,i)=>{var n=i(86652),r=i(90487);t.exports=function(t,e,i,s,o){void 0===o&&(o=i);var a=n(t,e,o);return r(a,i,s)}},86652:t=>{t.exports=function(t,e,i){if(t&&"number"!=typeof t){if(t.hasOwnProperty(e))return t[e];if(-1!==e.indexOf(".")){for(var n=e.split("."),r=t,s=i,o=0;o<n.length;o++){if(!r.hasOwnProperty(n[o])){s=i;break}s=r[n[o]],r=r[n[o]]}return s}return i}return i}},38403:t=>{t.exports=function(t,e){for(var i=0;i<e.length;i++)if(!t.hasOwnProperty(e[i]))return!1;return!0}},97639:t=>{t.exports=function(t,e){for(var i=0;i<e.length;i++)if(t.hasOwnProperty(e[i]))return!0;return!1}},64036:t=>{t.exports=function(t,e){return t.hasOwnProperty(e)}},28621:t=>{t.exports=function(t){if("object"!=typeof t||t.nodeType||t===t.window)return!1;try{if(t.constructor&&!{}.hasOwnProperty.call(t.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0}},92974:(t,e,i)=>{var n=i(18438);t.exports=function(t,e){var i=n(t);for(var r in e)i.hasOwnProperty(r)||(i[r]=e[r]);return i}},94422:(t,e,i)=>{var n=i(18438);t.exports=function(t,e){var i=n(t);for(var r in e)i.hasOwnProperty(r)&&(i[r]=e[r]);return i}},49694:(t,e,i)=>{var n=i(64036);t.exports=function(t,e){for(var i={},r=0;r<e.length;r++){var s=e[r];n(t,s)&&(i[s]=t[s])}return i}},68968:t=>{t.exports=function(t,e,i){if(!t||"number"==typeof t)return!1;if(t.hasOwnProperty(e))return t[e]=i,!0;if(-1!==e.indexOf(".")){for(var n=e.split("."),r=t,s=t,o=0;o<n.length;o++){if(!r.hasOwnProperty(n[o]))return!1;s=r,r=r[n[o]]}return s[n[n.length-1]]=i,!0}return!1}},14548:(t,e,i)=>{t.exports={Clone:i(18438),Extend:i(80933),GetAdvancedValue:i(57687),GetFastValue:i(81769),GetMinMaxValue:i(86535),GetValue:i(86652),HasAll:i(38403),HasAny:i(97639),HasValue:i(64036),IsPlainObject:i(28621),Merge:i(92974),MergeRight:i(94422),Pick:i(49694),SetValue:i(68968)}},46985:t=>{t.exports=function(t,e){return t.replace(/%([0-9]+)/g,(function(t,i){return e[Number(i)-1]}))}},10872:t=>{t.exports=function(t,e,i,n){void 0===e&&(e=0),void 0===i&&(i=" "),void 0===n&&(n=3);var r=0;if(e+1>=(t=t.toString()).length)switch(n){case 1:t=new Array(e+1-t.length).join(i)+t;break;case 3:var s=Math.ceil((r=e-t.length)/2);t=new Array(r-s+1).join(i)+t+new Array(s+1).join(i);break;default:t+=new Array(e+1-t.length).join(i)}return t}},97707:t=>{t.exports=function(t){return t.split("").reverse().join("")}},31027:t=>{t.exports=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(t){var e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)}))}},93225:t=>{t.exports=function(t){return t&&t[0].toUpperCase()+t.slice(1)}},5246:(t,e,i)=>{t.exports={Format:i(46985),Pad:i(10872),Reverse:i(97707),UppercaseFirst:i(93225),UUID:i(31027)}}},e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={id:n,loaded:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.hmd=t=>((t=Object.create(t)).children||(t.children=[]),Object.defineProperty(t,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+t.id)}}),t),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),(()=>{"use strict";i(81444);var t=i(76474),e=i.n(t);const n=function(t,e,i){var n=-1,r=t.length;e<0&&(e=-e>r?0:r+e),(i=i>r?r:i)<0&&(i+=r),r=e>i?0:i-e>>>0,e>>>=0;for(var s=Array(r);++n<r;)s[n]=t[n+e];return s};const r=function(t,e){return t===e||t!=t&&e!=e};var s=i(19327);const o=s.Z.Symbol;var a=Object.prototype,h=a.hasOwnProperty,u=a.toString,l=o?o.toStringTag:void 0;const c=function(t){var e=h.call(t,l),i=t[l];try{t[l]=void 0;var n=!0}catch(t){}var r=u.call(t);return n&&(e?t[l]=i:delete t[l]),r};var d=Object.prototype.toString;const p=function(t){return d.call(t)};var f=o?o.toStringTag:void 0;const m=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":f&&f in Object(t)?c(t):p(t)};const v=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)};const g=function(t){if(!v(t))return!1;var e=m(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e};const y=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991};const _=function(t){return null!=t&&y(t.length)&&!g(t)};var x=/^(?:0|[1-9]\d*)$/;const b=function(t,e){var i=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==i||"symbol"!=i&&x.test(t))&&t>-1&&t%1==0&&t<e};const w=function(t,e,i){if(!v(i))return!1;var n=typeof e;return!!("number"==n?_(i)&&b(e,i.length):"string"==n&&e in i)&&r(i[e],t)};const T=function(t){return null!=t&&"object"==typeof t};const M=function(t){return"symbol"==typeof t||T(t)&&"[object Symbol]"==m(t)};var S=/^\s+|\s+$/g,E=/^[-+]0x[0-9a-f]+$/i,L=/^0b[01]+$/i,A=/^0o[0-7]+$/i,D=parseInt;const P=function(t){if("number"==typeof t)return t;if(M(t))return NaN;if(v(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=v(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(S,"");var i=L.test(t);return i||A.test(t)?D(t.slice(2),i?2:8):E.test(t)?NaN:+t};var C=1/0;const O=function(t){return t?(t=P(t))===C||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0};const k=function(t){var e=O(t),i=e%1;return e==e?i?e-i:e:0};var R=Math.ceil,I=Math.max;const Y=function(t,e,i){e=(i?w(t,e,i):void 0===e)?1:I(k(e),0);var r=null==t?0:t.length;if(!r||e<1)return[];for(var s=0,o=0,a=Array(R(r/e));s<r;)a[o++]=n(t,s,s+=e);return a};const F=function(t){for(var e=-1,i=null==t?0:t.length,n=0,r=[];++e<i;){var s=t[e];s&&(r[n++]=s)}return r};const N=function(t,e){for(var i=-1,n=e.length,r=t.length;++i<n;)t[r+i]=e[i];return t};const B=function(t){return T(t)&&"[object Arguments]"==m(t)};var U=Object.prototype,j=U.hasOwnProperty,H=U.propertyIsEnumerable;const z=B(function(){return arguments}())?B:function(t){return T(t)&&j.call(t,"callee")&&!H.call(t,"callee")};const W=Array.isArray;var G=o?o.isConcatSpreadable:void 0;const V=function(t){return W(t)||z(t)||!!(G&&t&&t[G])};const X=function t(e,i,n,r,s){var o=-1,a=e.length;for(n||(n=V),s||(s=[]);++o<a;){var h=e[o];i>0&&n(h)?i>1?t(h,i-1,n,r,s):N(s,h):r||(s[s.length]=h)}return s};const q=function(t,e){var i=-1,n=t.length;for(e||(e=Array(n));++i<n;)e[i]=t[i];return e};const J=function(){var t=arguments.length;if(!t)return[];for(var e=Array(t-1),i=arguments[0],n=t;n--;)e[n-1]=arguments[n];return N(W(i)?q(i):[i],X(e,1))};const Z=s.Z["__core-js_shared__"];var K=function(){var t=/[^.]+$/.exec(Z&&Z.keys&&Z.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();const Q=function(t){return!!K&&K in t};var $=Function.prototype.toString;const tt=function(t){if(null!=t){try{return $.call(t)}catch(t){}try{return t+""}catch(t){}}return""};var et=/^\[object .+?Constructor\]$/,it=Function.prototype,nt=Object.prototype,rt=it.toString,st=nt.hasOwnProperty,ot=RegExp("^"+rt.call(st).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const at=function(t){return!(!v(t)||Q(t))&&(g(t)?ot:et).test(tt(t))};const ht=function(t,e){return null==t?void 0:t[e]};const ut=function(t,e){var i=ht(t,e);return at(i)?i:void 0};const lt=ut(Object,"create");const ct=function(){this.__data__=lt?lt(null):{},this.size=0};const dt=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var pt=Object.prototype.hasOwnProperty;const ft=function(t){var e=this.__data__;if(lt){var i=e[t];return"__lodash_hash_undefined__"===i?void 0:i}return pt.call(e,t)?e[t]:void 0};var mt=Object.prototype.hasOwnProperty;const vt=function(t){var e=this.__data__;return lt?void 0!==e[t]:mt.call(e,t)};const gt=function(t,e){var i=this.__data__;return this.size+=this.has(t)?0:1,i[t]=lt&&void 0===e?"__lodash_hash_undefined__":e,this};function yt(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}yt.prototype.clear=ct,yt.prototype.delete=dt,yt.prototype.get=ft,yt.prototype.has=vt,yt.prototype.set=gt;const _t=yt;const xt=function(){this.__data__=[],this.size=0};const bt=function(t,e){for(var i=t.length;i--;)if(r(t[i][0],e))return i;return-1};var wt=Array.prototype.splice;const Tt=function(t){var e=this.__data__,i=bt(e,t);return!(i<0)&&(i==e.length-1?e.pop():wt.call(e,i,1),--this.size,!0)};const Mt=function(t){var e=this.__data__,i=bt(e,t);return i<0?void 0:e[i][1]};const St=function(t){return bt(this.__data__,t)>-1};const Et=function(t,e){var i=this.__data__,n=bt(i,t);return n<0?(++this.size,i.push([t,e])):i[n][1]=e,this};function Lt(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}Lt.prototype.clear=xt,Lt.prototype.delete=Tt,Lt.prototype.get=Mt,Lt.prototype.has=St,Lt.prototype.set=Et;const At=Lt;const Dt=ut(s.Z,"Map");const Pt=function(){this.size=0,this.__data__={hash:new _t,map:new(Dt||At),string:new _t}};const Ct=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const Ot=function(t,e){var i=t.__data__;return Ct(e)?i["string"==typeof e?"string":"hash"]:i.map};const kt=function(t){var e=Ot(this,t).delete(t);return this.size-=e?1:0,e};const Rt=function(t){return Ot(this,t).get(t)};const It=function(t){return Ot(this,t).has(t)};const Yt=function(t,e){var i=Ot(this,t),n=i.size;return i.set(t,e),this.size+=i.size==n?0:1,this};function Ft(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e<i;){var n=t[e];this.set(n[0],n[1])}}Ft.prototype.clear=Pt,Ft.prototype.delete=kt,Ft.prototype.get=Rt,Ft.prototype.has=It,Ft.prototype.set=Yt;const Nt=Ft;const Bt=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const Ut=function(t){return this.__data__.has(t)};function jt(t){var e=-1,i=null==t?0:t.length;for(this.__data__=new Nt;++e<i;)this.add(t[e])}jt.prototype.add=jt.prototype.push=Bt,jt.prototype.has=Ut;const Ht=jt;const zt=function(t,e,i,n){for(var r=t.length,s=i+(n?1:-1);n?s--:++s<r;)if(e(t[s],s,t))return s;return-1};const Wt=function(t){return t!=t};const Gt=function(t,e,i){for(var n=i-1,r=t.length;++n<r;)if(t[n]===e)return n;return-1};const Vt=function(t,e,i){return e==e?Gt(t,e,i):zt(t,Wt,i)};const Xt=function(t,e){return!!(null==t?0:t.length)&&Vt(t,e,0)>-1};const qt=function(t,e,i){for(var n=-1,r=null==t?0:t.length;++n<r;)if(i(e,t[n]))return!0;return!1};const Jt=function(t,e){for(var i=-1,n=null==t?0:t.length,r=Array(n);++i<n;)r[i]=e(t[i],i,t);return r};const Zt=function(t){return function(e){return t(e)}};const Kt=function(t,e){return t.has(e)};const Qt=function(t,e,i,n){var r=-1,s=Xt,o=!0,a=t.length,h=[],u=e.length;if(!a)return h;i&&(e=Jt(e,Zt(i))),n?(s=qt,o=!1):e.length>=200&&(s=Kt,o=!1,e=new Ht(e));t:for(;++r<a;){var l=t[r],c=null==i?l:i(l);if(l=n||0!==l?l:0,o&&c==c){for(var d=u;d--;)if(e[d]===c)continue t;h.push(l)}else s(e,c,n)||h.push(l)}return h};const $t=function(t){return t};const te=function(t,e,i){switch(i.length){case 0:return t.call(e);case 1:return t.call(e,i[0]);case 2:return t.call(e,i[0],i[1]);case 3:return t.call(e,i[0],i[1],i[2])}return t.apply(e,i)};var ee=Math.max;const ie=function(t,e,i){return e=ee(void 0===e?t.length-1:e,0),function(){for(var n=arguments,r=-1,s=ee(n.length-e,0),o=Array(s);++r<s;)o[r]=n[e+r];r=-1;for(var a=Array(e+1);++r<e;)a[r]=n[r];return a[e]=i(o),te(t,this,a)}};const ne=function(t){return function(){return t}};const re=function(){try{var t=ut(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();const se=re?function(t,e){return re(t,"toString",{configurable:!0,enumerable:!1,value:ne(e),writable:!0})}:$t;var oe=Date.now;const ae=function(t){var e=0,i=0;return function(){var n=oe(),r=16-(n-i);if(i=n,r>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}};const he=ae(se);const ue=function(t,e){return he(ie(t,e,$t),t+"")};const le=function(t){return T(t)&&_(t)};const ce=ue((function(t,e){return le(t)?Qt(t,X(e,1,le,!0)):[]}));const de=function(){this.__data__=new At,this.size=0};const pe=function(t){var e=this.__data__,i=e.delete(t);return this.size=e.size,i};const fe=function(t){return this.__data__.get(t)};const me=function(t){return this.__data__.has(t)};const ve=function(t,e){var i=this.__data__;if(i instanceof At){var n=i.__data__;if(!Dt||n.length<199)return n.push([t,e]),this.size=++i.size,this;i=this.__data__=new Nt(n)}return i.set(t,e),this.size=i.size,this};function ge(t){var e=this.__data__=new At(t);this.size=e.size}ge.prototype.clear=de,ge.prototype.delete=pe,ge.prototype.get=fe,ge.prototype.has=me,ge.prototype.set=ve;const ye=ge;const _e=function(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(e(t[i],i,t))return!0;return!1};const xe=function(t,e,i,n,r,s){var o=1&i,a=t.length,h=e.length;if(a!=h&&!(o&&h>a))return!1;var u=s.get(t);if(u&&s.get(e))return u==e;var l=-1,c=!0,d=2&i?new Ht:void 0;for(s.set(t,e),s.set(e,t);++l<a;){var p=t[l],f=e[l];if(n)var m=o?n(f,p,l,e,t,s):n(p,f,l,t,e,s);if(void 0!==m){if(m)continue;c=!1;break}if(d){if(!_e(e,(function(t,e){if(!Kt(d,e)&&(p===t||r(p,t,i,n,s)))return d.push(e)}))){c=!1;break}}else if(p!==f&&!r(p,f,i,n,s)){c=!1;break}}return s.delete(t),s.delete(e),c};const be=s.Z.Uint8Array;const we=function(t){var e=-1,i=Array(t.size);return t.forEach((function(t,n){i[++e]=[n,t]})),i};const Te=function(t){var e=-1,i=Array(t.size);return t.forEach((function(t){i[++e]=t})),i};var Me=o?o.prototype:void 0,Se=Me?Me.valueOf:void 0;const Ee=function(t,e,i,n,s,o,a){switch(i){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!o(new be(t),new be(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return r(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var h=we;case"[object Set]":var u=1&n;if(h||(h=Te),t.size!=e.size&&!u)return!1;var l=a.get(t);if(l)return l==e;n|=2,a.set(t,e);var c=xe(h(t),h(e),n,s,o,a);return a.delete(t),c;case"[object Symbol]":if(Se)return Se.call(t)==Se.call(e)}return!1};const Le=function(t,e,i){var n=e(t);return W(t)?n:N(n,i(t))};const Ae=function(t,e){for(var i=-1,n=null==t?0:t.length,r=0,s=[];++i<n;){var o=t[i];e(o,i,t)&&(s[r++]=o)}return s};const De=function(){return[]};var Pe=Object.prototype.propertyIsEnumerable,Ce=Object.getOwnPropertySymbols;const Oe=Ce?function(t){return null==t?[]:(t=Object(t),Ae(Ce(t),(function(e){return Pe.call(t,e)})))}:De;const ke=function(t,e){for(var i=-1,n=Array(t);++i<t;)n[i]=e(i);return n};var Re=i(9511),Ie={};Ie["[object Float32Array]"]=Ie["[object Float64Array]"]=Ie["[object Int8Array]"]=Ie["[object Int16Array]"]=Ie["[object Int32Array]"]=Ie["[object Uint8Array]"]=Ie["[object Uint8ClampedArray]"]=Ie["[object Uint16Array]"]=Ie["[object Uint32Array]"]=!0,Ie["[object Arguments]"]=Ie["[object Array]"]=Ie["[object ArrayBuffer]"]=Ie["[object Boolean]"]=Ie["[object DataView]"]=Ie["[object Date]"]=Ie["[object Error]"]=Ie["[object Function]"]=Ie["[object Map]"]=Ie["[object Number]"]=Ie["[object Object]"]=Ie["[object RegExp]"]=Ie["[object Set]"]=Ie["[object String]"]=Ie["[object WeakMap]"]=!1;const Ye=function(t){return T(t)&&y(t.length)&&!!Ie[m(t)]};var Fe=i(55580),Ne=Fe.Z&&Fe.Z.isTypedArray;const Be=Ne?Zt(Ne):Ye;var Ue=Object.prototype.hasOwnProperty;const je=function(t,e){var i=W(t),n=!i&&z(t),r=!i&&!n&&(0,Re.Z)(t),s=!i&&!n&&!r&&Be(t),o=i||n||r||s,a=o?ke(t.length,String):[],h=a.length;for(var u in t)!e&&!Ue.call(t,u)||o&&("length"==u||r&&("offset"==u||"parent"==u)||s&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||b(u,h))||a.push(u);return a};var He=Object.prototype;const ze=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||He)};const We=function(t,e){return function(i){return t(e(i))}};const Ge=We(Object.keys,Object);var Ve=Object.prototype.hasOwnProperty;const Xe=function(t){if(!ze(t))return Ge(t);var e=[];for(var i in Object(t))Ve.call(t,i)&&"constructor"!=i&&e.push(i);return e};const qe=function(t){return _(t)?je(t):Xe(t)};const Je=function(t){return Le(t,qe,Oe)};var Ze=Object.prototype.hasOwnProperty;const Ke=function(t,e,i,n,r,s){var o=1&i,a=Je(t),h=a.length;if(h!=Je(e).length&&!o)return!1;for(var u=h;u--;){var l=a[u];if(!(o?l in e:Ze.call(e,l)))return!1}var c=s.get(t);if(c&&s.get(e))return c==e;var d=!0;s.set(t,e),s.set(e,t);for(var p=o;++u<h;){var f=t[l=a[u]],m=e[l];if(n)var v=o?n(m,f,l,e,t,s):n(f,m,l,t,e,s);if(!(void 0===v?f===m||r(f,m,i,n,s):v)){d=!1;break}p||(p="constructor"==l)}if(d&&!p){var g=t.constructor,y=e.constructor;g==y||!("constructor"in t)||!("constructor"in e)||"function"==typeof g&&g instanceof g&&"function"==typeof y&&y instanceof y||(d=!1)}return s.delete(t),s.delete(e),d};const Qe=ut(s.Z,"DataView");const $e=ut(s.Z,"Promise");const ti=ut(s.Z,"Set");const ei=ut(s.Z,"WeakMap");var ii="[object Map]",ni="[object Promise]",ri="[object Set]",si="[object WeakMap]",oi="[object DataView]",ai=tt(Qe),hi=tt(Dt),ui=tt($e),li=tt(ti),ci=tt(ei),di=m;(Qe&&di(new Qe(new ArrayBuffer(1)))!=oi||Dt&&di(new Dt)!=ii||$e&&di($e.resolve())!=ni||ti&&di(new ti)!=ri||ei&&di(new ei)!=si)&&(di=function(t){var e=m(t),i="[object Object]"==e?t.constructor:void 0,n=i?tt(i):"";if(n)switch(n){case ai:return oi;case hi:return ii;case ui:return ni;case li:return ri;case ci:return si}return e});const pi=di;var fi="[object Arguments]",mi="[object Array]",vi="[object Object]",gi=Object.prototype.hasOwnProperty;const yi=function(t,e,i,n,r,s){var o=W(t),a=W(e),h=o?mi:pi(t),u=a?mi:pi(e),l=(h=h==fi?vi:h)==vi,c=(u=u==fi?vi:u)==vi,d=h==u;if(d&&(0,Re.Z)(t)){if(!(0,Re.Z)(e))return!1;o=!0,l=!1}if(d&&!l)return s||(s=new ye),o||Be(t)?xe(t,e,i,n,r,s):Ee(t,e,h,i,n,r,s);if(!(1&i)){var p=l&&gi.call(t,"__wrapped__"),f=c&&gi.call(e,"__wrapped__");if(p||f){var m=p?t.value():t,v=f?e.value():e;return s||(s=new ye),r(m,v,i,n,s)}}return!!d&&(s||(s=new ye),Ke(t,e,i,n,r,s))};const _i=function t(e,i,n,r,s){return e===i||(null==e||null==i||!T(e)&&!T(i)?e!=e&&i!=i:yi(e,i,n,r,t,s))};const xi=function(t,e,i,n){var r=i.length,s=r,o=!n;if(null==t)return!s;for(t=Object(t);r--;){var a=i[r];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++r<s;){var h=(a=i[r])[0],u=t[h],l=a[1];if(o&&a[2]){if(void 0===u&&!(h in t))return!1}else{var c=new ye;if(n)var d=n(u,l,h,t,e,c);if(!(void 0===d?_i(l,u,3,n,c):d))return!1}}return!0};const bi=function(t){return t==t&&!v(t)};const wi=function(t){for(var e=qe(t),i=e.length;i--;){var n=e[i],r=t[n];e[i]=[n,r,bi(r)]}return e};const Ti=function(t,e){return function(i){return null!=i&&(i[t]===e&&(void 0!==e||t in Object(i)))}};const Mi=function(t){var e=wi(t);return 1==e.length&&e[0][2]?Ti(e[0][0],e[0][1]):function(i){return i===t||xi(i,t,e)}};var Si=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ei=/^\w*$/;const Li=function(t,e){if(W(t))return!1;var i=typeof t;return!("number"!=i&&"symbol"!=i&&"boolean"!=i&&null!=t&&!M(t))||(Ei.test(t)||!Si.test(t)||null!=e&&t in Object(e))};function Ai(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var i=function(){var n=arguments,r=e?e.apply(this,n):n[0],s=i.cache;if(s.has(r))return s.get(r);var o=t.apply(this,n);return i.cache=s.set(r,o)||s,o};return i.cache=new(Ai.Cache||Nt),i}Ai.Cache=Nt;const Di=Ai;var Pi=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ci=/\\(\\)?/g;const Oi=function(t){var e=Di(t,(function(t){return 500===i.size&&i.clear(),t})),i=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(Pi,(function(t,i,n,r){e.push(n?r.replace(Ci,"$1"):i||t)})),e}));var ki=o?o.prototype:void 0,Ri=ki?ki.toString:void 0;const Ii=function t(e){if("string"==typeof e)return e;if(W(e))return Jt(e,t)+"";if(M(e))return Ri?Ri.call(e):"";var i=e+"";return"0"==i&&1/e==-Infinity?"-0":i};const Yi=function(t){return null==t?"":Ii(t)};const Fi=function(t,e){return W(t)?t:Li(t,e)?[t]:Oi(Yi(t))};const Ni=function(t){if("string"==typeof t||M(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e};const Bi=function(t,e){for(var i=0,n=(e=Fi(e,t)).length;null!=t&&i<n;)t=t[Ni(e[i++])];return i&&i==n?t:void 0};const Ui=function(t,e,i){var n=null==t?void 0:Bi(t,e);return void 0===n?i:n};const ji=function(t,e){return null!=t&&e in Object(t)};const Hi=function(t,e,i){for(var n=-1,r=(e=Fi(e,t)).length,s=!1;++n<r;){var o=Ni(e[n]);if(!(s=null!=t&&i(t,o)))break;t=t[o]}return s||++n!=r?s:!!(r=null==t?0:t.length)&&y(r)&&b(o,r)&&(W(t)||z(t))};const zi=function(t,e){return null!=t&&Hi(t,e,ji)};const Wi=function(t,e){return Li(t)&&bi(e)?Ti(Ni(t),e):function(i){var n=Ui(i,t);return void 0===n&&n===e?zi(i,t):_i(e,n,3)}};const Gi=function(t){return function(e){return null==e?void 0:e[t]}};const Vi=function(t){return function(e){return Bi(e,t)}};const Xi=function(t){return Li(t)?Gi(Ni(t)):Vi(t)};const qi=function(t){return"function"==typeof t?t:null==t?$t:"object"==typeof t?W(t)?Wi(t[0],t[1]):Mi(t):Xi(t)};const Ji=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0};const Zi=ue((function(t,e){var i=Ji(e);return le(i)&&(i=void 0),le(t)?Qt(t,X(e,1,le,!0),qi(i,2)):[]}));const Ki=ue((function(t,e){var i=Ji(e);return le(i)&&(i=void 0),le(t)?Qt(t,X(e,1,le,!0),void 0,i):[]}));const Qi=function(t,e,i){var r=null==t?0:t.length;return r?(e=i||void 0===e?1:k(e),n(t,e<0?0:e,r)):[]};const $i=function(t,e,i){var r=null==t?0:t.length;return r?(e=i||void 0===e?1:k(e),n(t,0,(e=r-e)<0?0:e)):[]};const tn=function(t,e,i,r){for(var s=t.length,o=r?s:-1;(r?o--:++o<s)&&e(t[o],o,t););return i?n(t,r?0:o,r?o+1:s):n(t,r?o+1:0,r?s:o)};const en=function(t,e){return t&&t.length?tn(t,qi(e,3),!0,!0):[]};const nn=function(t,e){return t&&t.length?tn(t,qi(e,3),!0):[]};const rn=function(t,e,i){return t==t&&(void 0!==i&&(t=t<=i?t:i),void 0!==e&&(t=t>=e?t:e)),t};const sn=function(t){return t?rn(k(t),0,4294967295):0};const on=function(t,e,i,n){var r=t.length;for((i=k(i))<0&&(i=-i>r?0:r+i),(n=void 0===n||n>r?r:k(n))<0&&(n+=r),n=i>n?0:sn(n);i<n;)t[i++]=e;return t};const an=function(t,e,i,n){var r=null==t?0:t.length;return r?(i&&"number"!=typeof i&&w(t,e,i)&&(i=0,n=r),on(t,e,i,n)):[]};var hn=Math.max;const un=function(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:k(i);return r<0&&(r=hn(n+r,0)),zt(t,qi(e,3),r)};var ln=Math.max,cn=Math.min;const dn=function(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n-1;return void 0!==i&&(r=k(i),r=i<0?ln(n+r,0):cn(r,n-1)),zt(t,qi(e,3),r,!0)};const pn=function(t){return t&&t.length?t[0]:void 0};const fn=function(t){return(null==t?0:t.length)?X(t,1):[]};const mn=function(t){return(null==t?0:t.length)?X(t,Infinity):[]};const vn=function(t,e){return(null==t?0:t.length)?(e=void 0===e?1:k(e),X(t,e)):[]};const gn=function(t){for(var e=-1,i=null==t?0:t.length,n={};++e<i;){var r=t[e];n[r[0]]=r[1]}return n};var yn=Math.max;const _n=function(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=null==i?0:k(i);return r<0&&(r=yn(n+r,0)),Vt(t,e,r)};const xn=function(t){return(null==t?0:t.length)?n(t,0,-1):[]};var bn=Math.min;const wn=function(t,e,i){for(var n=i?qt:Xt,r=t[0].length,s=t.length,o=s,a=Array(s),h=1/0,u=[];o--;){var l=t[o];o&&e&&(l=Jt(l,Zt(e))),h=bn(l.length,h),a[o]=!i&&(e||r>=120&&l.length>=120)?new Ht(o&&l):void 0}l=t[0];var c=-1,d=a[0];t:for(;++c<r&&u.length<h;){var p=l[c],f=e?e(p):p;if(p=i||0!==p?p:0,!(d?Kt(d,f):n(u,f,i))){for(o=s;--o;){var m=a[o];if(!(m?Kt(m,f):n(t[o],f,i)))continue t}d&&d.push(f),u.push(p)}}return u};const Tn=function(t){return le(t)?t:[]};const Mn=ue((function(t){var e=Jt(t,Tn);return e.length&&e[0]===t[0]?wn(e):[]}));const Sn=ue((function(t){var e=Ji(t),i=Jt(t,Tn);return e===Ji(i)?e=void 0:i.pop(),i.length&&i[0]===t[0]?wn(i,qi(e,2)):[]}));const En=ue((function(t){var e=Ji(t),i=Jt(t,Tn);return(e="function"==typeof e?e:void 0)&&i.pop(),i.length&&i[0]===t[0]?wn(i,void 0,e):[]}));var Ln=Array.prototype.join;const An=function(t,e){return null==t?"":Ln.call(t,e)};const Dn=function(t,e,i){for(var n=i+1;n--;)if(t[n]===e)return n;return n};var Pn=Math.max,Cn=Math.min;const On=function(t,e,i){var n=null==t?0:t.length;if(!n)return-1;var r=n;return void 0!==i&&(r=(r=k(i))<0?Pn(n+r,0):Cn(r,n-1)),e==e?Dn(t,e,r):zt(t,Wt,r,!0)};const kn=function(t,e){var i=t.length;if(i)return b(e+=e<0?i:0,i)?t[e]:void 0};const Rn=function(t,e){return t&&t.length?kn(t,k(e)):void 0};const In=function(t,e,i,n){for(var r=i-1,s=t.length;++r<s;)if(n(t[r],e))return r;return-1};var Yn=Array.prototype.splice;const Fn=function(t,e,i,n){var r=n?In:Vt,s=-1,o=e.length,a=t;for(t===e&&(e=q(e)),i&&(a=Jt(t,Zt(i)));++s<o;)for(var h=0,u=e[s],l=i?i(u):u;(h=r(a,l,h,n))>-1;)a!==t&&Yn.call(a,h,1),Yn.call(t,h,1);return t};const Nn=function(t,e){return t&&t.length&&e&&e.length?Fn(t,e):t};const Bn=ue(Nn);const Un=function(t,e,i){return t&&t.length&&e&&e.length?Fn(t,e,qi(i,2)):t};const jn=function(t,e,i){return t&&t.length&&e&&e.length?Fn(t,e,void 0,i):t};const Hn=function(t,e){for(var i=-1,n=e.length,r=Array(n),s=null==t;++i<n;)r[i]=s?void 0:Ui(t,e[i]);return r};const zn=function(t,e){return e.length<2?t:Bi(t,n(e,0,-1))};const Wn=function(t,e){return e=Fi(e,t),null==(t=zn(t,e))||delete t[Ni(Ji(e))]};var Gn=Array.prototype.splice;const Vn=function(t,e){for(var i=t?e.length:0,n=i-1;i--;){var r=e[i];if(i==n||r!==s){var s=r;b(r)?Gn.call(t,r,1):Wn(t,r)}}return t};const Xn=function(t,e){if(t!==e){var i=void 0!==t,n=null===t,r=t==t,s=M(t),o=void 0!==e,a=null===e,h=e==e,u=M(e);if(!a&&!u&&!s&&t>e||s&&o&&h&&!a&&!u||n&&o&&h||!i&&h||!r)return 1;if(!n&&!s&&!u&&t<e||u&&i&&r&&!n&&!s||a&&i&&r||!o&&r||!h)return-1}return 0};const qn=function(t){return he(ie(t,void 0,fn),t+"")};const Jn=qn((function(t,e){var i=null==t?0:t.length,n=Hn(t,e);return Vn(t,Jt(e,(function(t){return b(t,i)?+t:t})).sort(Xn)),n}));const Zn=function(t,e){var i=[];if(!t||!t.length)return i;var n=-1,r=[],s=t.length;for(e=qi(e,3);++n<s;){var o=t[n];e(o,n,t)&&(i.push(o),r.push(n))}return Vn(t,r),i};var Kn=Array.prototype.reverse;const Qn=function(t){return null==t?t:Kn.call(t)};const $n=function(t,e,i){var r=null==t?0:t.length;return r?(i&&"number"!=typeof i&&w(t,e,i)?(e=0,i=r):(e=null==e?0:k(e),i=void 0===i?r:k(i)),n(t,e,i)):[]};var tr=Math.floor,er=Math.min;const ir=function(t,e,i,n){e=i(e);for(var r=0,s=null==t?0:t.length,o=e!=e,a=null===e,h=M(e),u=void 0===e;r<s;){var l=tr((r+s)/2),c=i(t[l]),d=void 0!==c,p=null===c,f=c==c,m=M(c);if(o)var v=n||f;else v=u?f&&(n||d):a?f&&d&&(n||!p):h?f&&d&&!p&&(n||!m):!p&&!m&&(n?c<=e:c<e);v?r=l+1:s=l}return er(s,4294967294)};const nr=function(t,e,i){var n=0,r=null==t?n:t.length;if("number"==typeof e&&e==e&&r<=2147483647){for(;n<r;){var s=n+r>>>1,o=t[s];null!==o&&!M(o)&&(i?o<=e:o<e)?n=s+1:r=s}return r}return ir(t,e,$t,i)};const rr=function(t,e){return nr(t,e)};const sr=function(t,e,i){return ir(t,e,qi(i,2))};const or=function(t,e){var i=null==t?0:t.length;if(i){var n=nr(t,e);if(n<i&&r(t[n],e))return n}return-1};const ar=function(t,e){return nr(t,e,!0)};const hr=function(t,e,i){return ir(t,e,qi(i,2),!0)};const ur=function(t,e){if(null==t?0:t.length){var i=nr(t,e,!0)-1;if(r(t[i],e))return i}return-1};const lr=function(t,e){for(var i=-1,n=t.length,s=0,o=[];++i<n;){var a=t[i],h=e?e(a):a;if(!i||!r(h,u)){var u=h;o[s++]=0===a?0:a}}return o};const cr=function(t){return t&&t.length?lr(t):[]};const dr=function(t,e){return t&&t.length?lr(t,qi(e,2)):[]};const pr=function(t){var e=null==t?0:t.length;return e?n(t,1,e):[]};const fr=function(t,e,i){return t&&t.length?(e=i||void 0===e?1:k(e),n(t,0,e<0?0:e)):[]};const mr=function(t,e,i){var r=null==t?0:t.length;return r?(e=i||void 0===e?1:k(e),n(t,(e=r-e)<0?0:e,r)):[]};const vr=function(t,e){return t&&t.length?tn(t,qi(e,3),!1,!0):[]};const gr=function(t,e){return t&&t.length?tn(t,qi(e,3)):[]};const yr=function(){};const _r=ti&&1/Te(new ti([,-0]))[1]==1/0?function(t){return new ti(t)}:yr;const xr=function(t,e,i){var n=-1,r=Xt,s=t.length,o=!0,a=[],h=a;if(i)o=!1,r=qt;else if(s>=200){var u=e?null:_r(t);if(u)return Te(u);o=!1,r=Kt,h=new Ht}else h=e?[]:a;t:for(;++n<s;){var l=t[n],c=e?e(l):l;if(l=i||0!==l?l:0,o&&c==c){for(var d=h.length;d--;)if(h[d]===c)continue t;e&&h.push(c),a.push(l)}else r(h,c,i)||(h!==a&&h.push(c),a.push(l))}return a};const br=ue((function(t){return xr(X(t,1,le,!0))}));const wr=ue((function(t){var e=Ji(t);return le(e)&&(e=void 0),xr(X(t,1,le,!0),qi(e,2))}));const Tr=ue((function(t){var e=Ji(t);return e="function"==typeof e?e:void 0,xr(X(t,1,le,!0),void 0,e)}));const Mr=function(t){return t&&t.length?xr(t):[]};const Sr=function(t,e){return t&&t.length?xr(t,qi(e,2)):[]};const Er=function(t,e){return e="function"==typeof e?e:void 0,t&&t.length?xr(t,void 0,e):[]};var Lr=Math.max;const Ar=function(t){if(!t||!t.length)return[];var e=0;return t=Ae(t,(function(t){if(le(t))return e=Lr(t.length,e),!0})),ke(e,(function(e){return Jt(t,Gi(e))}))};const Dr=function(t,e){if(!t||!t.length)return[];var i=Ar(t);return null==e?i:Jt(i,(function(t){return te(e,void 0,t)}))};const Pr=ue((function(t,e){return le(t)?Qt(t,e):[]}));const Cr=function(t,e,i){var n=t.length;if(n<2)return n?xr(t[0]):[];for(var r=-1,s=Array(n);++r<n;)for(var o=t[r],a=-1;++a<n;)a!=r&&(s[r]=Qt(s[r]||o,t[a],e,i));return xr(X(s,1),e,i)};const Or=ue((function(t){return Cr(Ae(t,le))}));const kr=ue((function(t){var e=Ji(t);return le(e)&&(e=void 0),Cr(Ae(t,le),qi(e,2))}));const Rr=ue((function(t){var e=Ji(t);return e="function"==typeof e?e:void 0,Cr(Ae(t,le),void 0,e)}));const Ir=ue(Ar);const Yr=function(t,e,i){"__proto__"==e&&re?re(t,e,{configurable:!0,enumerable:!0,value:i,writable:!0}):t[e]=i};var Fr=Object.prototype.hasOwnProperty;const Nr=function(t,e,i){var n=t[e];Fr.call(t,e)&&r(n,i)&&(void 0!==i||e in t)||Yr(t,e,i)};const Br=function(t,e,i){for(var n=-1,r=t.length,s=e.length,o={};++n<r;){var a=n<s?e[n]:void 0;i(o,t[n],a)}return o};const Ur=function(t,e){return Br(t||[],e||[],Nr)};const jr=function(t,e,i,n){if(!v(t))return t;for(var r=-1,s=(e=Fi(e,t)).length,o=s-1,a=t;null!=a&&++r<s;){var h=Ni(e[r]),u=i;if(r!=o){var l=a[h];void 0===(u=n?n(l,h,a):void 0)&&(u=v(l)?l:b(e[r+1])?[]:{})}Nr(a,h,u),a=a[h]}return t};const Hr=function(t,e){return Br(t||[],e||[],jr)};var zr=ue((function(t){var e=t.length,i=e>1?t[e-1]:void 0;return i="function"==typeof i?(t.pop(),i):void 0,Dr(t,i)}));const Wr={chunk:Y,compact:F,concat:J,difference:ce,differenceBy:Zi,differenceWith:Ki,drop:Qi,dropRight:$i,dropRightWhile:en,dropWhile:nn,fill:an,findIndex:un,findLastIndex:dn,first:pn,flatten:fn,flattenDeep:mn,flattenDepth:vn,fromPairs:gn,head:pn,indexOf:_n,initial:xn,intersection:Mn,intersectionBy:Sn,intersectionWith:En,join:An,last:Ji,lastIndexOf:On,nth:Rn,pull:Bn,pullAll:Nn,pullAllBy:Un,pullAllWith:jn,pullAt:Jn,remove:Zn,reverse:Qn,slice:$n,sortedIndex:rr,sortedIndexBy:sr,sortedIndexOf:or,sortedLastIndex:ar,sortedLastIndexBy:hr,sortedLastIndexOf:ur,sortedUniq:cr,sortedUniqBy:dr,tail:pr,take:fr,takeRight:mr,takeRightWhile:vr,takeWhile:gr,union:br,unionBy:wr,unionWith:Tr,uniq:Mr,uniqBy:Sr,uniqWith:Er,unzip:Ar,unzipWith:Dr,without:Pr,xor:Or,xorBy:kr,xorWith:Rr,zip:Ir,zipObject:Ur,zipObjectDeep:Hr,zipWith:zr};const Gr=function(t,e,i,n){for(var r=-1,s=null==t?0:t.length;++r<s;){var o=t[r];e(n,o,i(o),t)}return n};const Vr=function(t){return function(e,i,n){for(var r=-1,s=Object(e),o=n(e),a=o.length;a--;){var h=o[t?a:++r];if(!1===i(s[h],h,s))break}return e}};const Xr=Vr();const qr=function(t,e){return t&&Xr(t,e,qe)};const Jr=function(t,e){return function(i,n){if(null==i)return i;if(!_(i))return t(i,n);for(var r=i.length,s=e?r:-1,o=Object(i);(e?s--:++s<r)&&!1!==n(o[s],s,o););return i}};const Zr=Jr(qr);const Kr=function(t,e,i,n){return Zr(t,(function(t,r,s){e(n,t,i(t),s)})),n};const Qr=function(t,e){return function(i,n){var r=W(i)?Gr:Kr,s=e?e():{};return r(i,t,qi(n,2),s)}};var $r=Object.prototype.hasOwnProperty;const ts=Qr((function(t,e,i){$r.call(t,i)?++t[i]:Yr(t,i,1)}));const es=function(t,e){for(var i=-1,n=null==t?0:t.length;++i<n&&!1!==e(t[i],i,t););return t};const is=function(t){return"function"==typeof t?t:$t};const ns=function(t,e){return(W(t)?es:Zr)(t,is(e))};const rs=function(t,e){for(var i=null==t?0:t.length;i--&&!1!==e(t[i],i,t););return t};const ss=Vr(!0);const os=function(t,e){return t&&ss(t,e,qe)};const as=Jr(os,!0);const hs=function(t,e){return(W(t)?rs:as)(t,is(e))};const us=function(t,e){for(var i=-1,n=null==t?0:t.length;++i<n;)if(!e(t[i],i,t))return!1;return!0};const ls=function(t,e){var i=!0;return Zr(t,(function(t,n,r){return i=!!e(t,n,r)})),i};const cs=function(t,e,i){var n=W(t)?us:ls;return i&&w(t,e,i)&&(e=void 0),n(t,qi(e,3))};const ds=function(t,e){var i=[];return Zr(t,(function(t,n,r){e(t,n,r)&&i.push(t)})),i};const ps=function(t,e){return(W(t)?Ae:ds)(t,qi(e,3))};const fs=function(t){return function(e,i,n){var r=Object(e);if(!_(e)){var s=qi(i,3);e=qe(e),i=function(t){return s(r[t],t,r)}}var o=t(e,i,n);return o>-1?r[s?e[o]:o]:void 0}};const ms=fs(un);const vs=fs(dn);const gs=function(t,e){var i=-1,n=_(t)?Array(t.length):[];return Zr(t,(function(t,r,s){n[++i]=e(t,r,s)})),n};const ys=function(t,e){return(W(t)?Jt:gs)(t,qi(e,3))};const _s=function(t,e){return X(ys(t,e),1)};const xs=function(t,e){return X(ys(t,e),Infinity)};const bs=function(t,e,i){return i=void 0===i?1:k(i),X(ys(t,e),i)};var ws=Object.prototype.hasOwnProperty;const Ts=Qr((function(t,e,i){ws.call(t,i)?t[i].push(e):Yr(t,i,[e])}));const Ms=function(t){return"string"==typeof t||!W(t)&&T(t)&&"[object String]"==m(t)};const Ss=function(t,e){return Jt(e,(function(e){return t[e]}))};const Es=function(t){return null==t?[]:Ss(t,qe(t))};var Ls=Math.max;const As=function(t,e,i,n){t=_(t)?t:Es(t),i=i&&!n?k(i):0;var r=t.length;return i<0&&(i=Ls(r+i,0)),Ms(t)?i<=r&&t.indexOf(e,i)>-1:!!r&&Vt(t,e,i)>-1};const Ds=function(t,e,i){e=Fi(e,t);var n=null==(t=zn(t,e))?t:t[Ni(Ji(e))];return null==n?void 0:te(n,t,i)};const Ps=ue((function(t,e,i){var n=-1,r="function"==typeof e,s=_(t)?Array(t.length):[];return Zr(t,(function(t){s[++n]=r?te(e,t,i):Ds(t,e,i)})),s}));const Cs=Qr((function(t,e,i){Yr(t,i,e)}));const Os=function(t,e){var i=t.length;for(t.sort(e);i--;)t[i]=t[i].value;return t};const ks=function(t,e,i){for(var n=-1,r=t.criteria,s=e.criteria,o=r.length,a=i.length;++n<o;){var h=Xn(r[n],s[n]);if(h)return n>=a?h:h*("desc"==i[n]?-1:1)}return t.index-e.index};const Rs=function(t,e,i){var n=-1;e=Jt(e.length?e:[$t],Zt(qi));var r=gs(t,(function(t,i,r){return{criteria:Jt(e,(function(e){return e(t)})),index:++n,value:t}}));return Os(r,(function(t,e){return ks(t,e,i)}))};const Is=function(t,e,i,n){return null==t?[]:(W(e)||(e=null==e?[]:[e]),W(i=n?void 0:i)||(i=null==i?[]:[i]),Rs(t,e,i))};const Ys=Qr((function(t,e,i){t[i?0:1].push(e)}),(function(){return[[],[]]}));const Fs=function(t,e,i,n){var r=-1,s=null==t?0:t.length;for(n&&s&&(i=t[++r]);++r<s;)i=e(i,t[r],r,t);return i};const Ns=function(t,e,i,n,r){return r(t,(function(t,r,s){i=n?(n=!1,t):e(i,t,r,s)})),i};const Bs=function(t,e,i){var n=W(t)?Fs:Ns,r=arguments.length<3;return n(t,qi(e,4),i,r,Zr)};const Us=function(t,e,i,n){var r=null==t?0:t.length;for(n&&r&&(i=t[--r]);r--;)i=e(i,t[r],r,t);return i};const js=function(t,e,i){var n=W(t)?Us:Ns,r=arguments.length<3;return n(t,qi(e,4),i,r,as)};const Hs=function(t){if("function"!=typeof t)throw new TypeError("Expected a function");return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}};const zs=function(t,e){return(W(t)?Ae:ds)(t,Hs(qi(e,3)))};var Ws=Math.floor,Gs=Math.random;const Vs=function(t,e){return t+Ws(Gs()*(e-t+1))};const Xs=function(t){var e=t.length;return e?t[Vs(0,e-1)]:void 0};const qs=function(t){return Xs(Es(t))};const Js=function(t){return(W(t)?Xs:qs)(t)};const Zs=function(t,e){var i=-1,n=t.length,r=n-1;for(e=void 0===e?n:e;++i<e;){var s=Vs(i,r),o=t[s];t[s]=t[i],t[i]=o}return t.length=e,t};const Ks=function(t,e){return Zs(q(t),rn(e,0,t.length))};const Qs=function(t,e){var i=Es(t);return Zs(i,rn(e,0,i.length))};const $s=function(t,e,i){return e=(i?w(t,e,i):void 0===e)?1:k(e),(W(t)?Ks:Qs)(t,e)};const to=function(t){return Zs(q(t))};const eo=function(t){return Zs(Es(t))};const io=function(t){return(W(t)?to:eo)(t)};const no=Gi("length");var ro=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const so=function(t){return ro.test(t)};var oo="[\\ud800-\\udfff]",ao="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",ho="\\ud83c[\\udffb-\\udfff]",uo="[^\\ud800-\\udfff]",lo="(?:\\ud83c[\\udde6-\\uddff]){2}",co="[\\ud800-\\udbff][\\udc00-\\udfff]",po="(?:"+ao+"|"+ho+")"+"?",fo="[\\ufe0e\\ufe0f]?",mo=fo+po+("(?:\\u200d(?:"+[uo,lo,co].join("|")+")"+fo+po+")*"),vo="(?:"+[uo+ao+"?",ao,lo,co,oo].join("|")+")",go=RegExp(ho+"(?="+ho+")|"+vo+mo,"g");const yo=function(t){for(var e=go.lastIndex=0;go.test(t);)++e;return e};const _o=function(t){return so(t)?yo(t):no(t)};const xo=function(t){if(null==t)return 0;if(_(t))return Ms(t)?_o(t):t.length;var e=pi(t);return"[object Map]"==e||"[object Set]"==e?t.size:Xe(t).length};const bo=function(t,e){var i;return Zr(t,(function(t,n,r){return!(i=e(t,n,r))})),!!i};const wo=function(t,e,i){var n=W(t)?_e:bo;return i&&w(t,e,i)&&(e=void 0),n(t,qi(e,3))};var To=ue((function(t,e){if(null==t)return[];var i=e.length;return i>1&&w(t,e[0],e[1])?e=[]:i>2&&w(e[0],e[1],e[2])&&(e=[e[0]]),Rs(t,X(e,1),[])}));const Mo={countBy:ts,each:ns,eachRight:hs,every:cs,filter:ps,find:ms,findLast:vs,flatMap:_s,flatMapDeep:xs,flatMapDepth:bs,forEach:ns,forEachRight:hs,groupBy:Ts,includes:As,invokeMap:Ps,keyBy:Cs,map:ys,orderBy:Is,partition:Ys,reduce:Bs,reduceRight:js,reject:zs,sample:Js,sampleSize:$s,shuffle:io,size:xo,some:wo,sortBy:To};const So=function(){return s.Z.Date.now()},Eo={now:So};const Lo=function(t,e){if("function"!=typeof e)throw new TypeError("Expected a function");return t=k(t),function(){if(--t<1)return e.apply(this,arguments)}};const Ao=ei&&new ei;const Do=Ao?function(t,e){return Ao.set(t,e),t}:$t;var Po=Object.create;const Co=function(){function t(){}return function(e){if(!v(e))return{};if(Po)return Po(e);t.prototype=e;var i=new t;return t.prototype=void 0,i}}();const Oo=function(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var i=Co(t.prototype),n=t.apply(i,e);return v(n)?n:i}};const ko=function(t,e,i){var n=1&e,r=Oo(t);return function e(){var o=this&&this!==s.Z&&this instanceof e?r:t;return o.apply(n?i:this,arguments)}};var Ro=Math.max;const Io=function(t,e,i,n){for(var r=-1,s=t.length,o=i.length,a=-1,h=e.length,u=Ro(s-o,0),l=Array(h+u),c=!n;++a<h;)l[a]=e[a];for(;++r<o;)(c||r<s)&&(l[i[r]]=t[r]);for(;u--;)l[a++]=t[r++];return l};var Yo=Math.max;const Fo=function(t,e,i,n){for(var r=-1,s=t.length,o=-1,a=i.length,h=-1,u=e.length,l=Yo(s-a,0),c=Array(l+u),d=!n;++r<l;)c[r]=t[r];for(var p=r;++h<u;)c[p+h]=e[h];for(;++o<a;)(d||r<s)&&(c[p+i[o]]=t[r++]);return c};const No=function(t,e){for(var i=t.length,n=0;i--;)t[i]===e&&++n;return n};const Bo=function(){};function Uo(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}Uo.prototype=Co(Bo.prototype),Uo.prototype.constructor=Uo;const jo=Uo;const Ho=Ao?function(t){return Ao.get(t)}:yr;const zo={};var Wo=Object.prototype.hasOwnProperty;const Go=function(t){for(var e=t.name+"",i=zo[e],n=Wo.call(zo,e)?i.length:0;n--;){var r=i[n],s=r.func;if(null==s||s==t)return r.name}return e};function Vo(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}Vo.prototype=Co(Bo.prototype),Vo.prototype.constructor=Vo;const Xo=Vo;const qo=function(t){if(t instanceof jo)return t.clone();var e=new Xo(t.__wrapped__,t.__chain__);return e.__actions__=q(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e};var Jo=Object.prototype.hasOwnProperty;function Zo(t){if(T(t)&&!W(t)&&!(t instanceof jo)){if(t instanceof Xo)return t;if(Jo.call(t,"__wrapped__"))return qo(t)}return new Xo(t)}Zo.prototype=Bo.prototype,Zo.prototype.constructor=Zo;const Ko=Zo;const Qo=function(t){var e=Go(t),i=Ko[e];if("function"!=typeof i||!(e in jo.prototype))return!1;if(t===i)return!0;var n=Ho(i);return!!n&&t===n[0]};const $o=ae(Do);var ta=/\{\n\/\* \[wrapped with (.+)\] \*/,ea=/,? & /;const ia=function(t){var e=t.match(ta);return e?e[1].split(ea):[]};var na=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;const ra=function(t,e){var i=e.length;if(!i)return t;var n=i-1;return e[n]=(i>1?"& ":"")+e[n],e=e.join(i>2?", ":" "),t.replace(na,"{\n/* [wrapped with "+e+"] */\n")};var sa=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];const oa=function(t,e){return es(sa,(function(i){var n="_."+i[0];e&i[1]&&!Xt(t,n)&&t.push(n)})),t.sort()};const aa=function(t,e,i){var n=e+"";return he(t,ra(n,oa(ia(n),i)))};const ha=function(t,e,i,n,r,s,o,a,h,u){var l=8&e;e|=l?32:64,4&(e&=~(l?64:32))||(e&=-4);var c=[t,e,r,l?s:void 0,l?o:void 0,l?void 0:s,l?void 0:o,a,h,u],d=i.apply(void 0,c);return Qo(t)&&$o(d,c),d.placeholder=n,aa(d,t,e)};const ua=function(t){return t.placeholder};var la=Math.min;const ca=function(t,e){for(var i=t.length,n=la(e.length,i),r=q(t);n--;){var s=e[n];t[n]=b(s,i)?r[s]:void 0}return t};var da="__lodash_placeholder__";const pa=function(t,e){for(var i=-1,n=t.length,r=0,s=[];++i<n;){var o=t[i];o!==e&&o!==da||(t[i]=da,s[r++]=i)}return s};const fa=function t(e,i,n,r,o,a,h,u,l,c){var d=128&i,p=1&i,f=2&i,m=24&i,v=512&i,g=f?void 0:Oo(e);return function y(){for(var _=arguments.length,x=Array(_),b=_;b--;)x[b]=arguments[b];if(m)var w=ua(y),T=No(x,w);if(r&&(x=Io(x,r,o,m)),a&&(x=Fo(x,a,h,m)),_-=T,m&&_<c){var M=pa(x,w);return ha(e,i,t,y.placeholder,n,x,M,u,l,c-_)}var S=p?n:this,E=f?S[e]:e;return _=x.length,u?x=ca(x,u):v&&_>1&&x.reverse(),d&&l<_&&(x.length=l),this&&this!==s.Z&&this instanceof y&&(E=g||Oo(E)),E.apply(S,x)}};const ma=function(t,e,i){var n=Oo(t);return function r(){for(var o=arguments.length,a=Array(o),h=o,u=ua(r);h--;)a[h]=arguments[h];var l=o<3&&a[0]!==u&&a[o-1]!==u?[]:pa(a,u);if((o-=l.length)<i)return ha(t,e,fa,r.placeholder,void 0,a,l,void 0,void 0,i-o);var c=this&&this!==s.Z&&this instanceof r?n:t;return te(c,this,a)}};const va=function(t,e,i,n){var r=1&e,o=Oo(t);return function e(){for(var a=-1,h=arguments.length,u=-1,l=n.length,c=Array(l+h),d=this&&this!==s.Z&&this instanceof e?o:t;++u<l;)c[u]=n[u];for(;h--;)c[u++]=arguments[++a];return te(d,r?i:this,c)}};var ga="__lodash_placeholder__",ya=128,_a=Math.min;const xa=function(t,e){var i=t[1],n=e[1],r=i|n,s=r<131,o=n==ya&&8==i||n==ya&&256==i&&t[7].length<=e[8]||384==n&&e[7].length<=e[8]&&8==i;if(!s&&!o)return t;1&n&&(t[2]=e[2],r|=1&i?0:4);var a=e[3];if(a){var h=t[3];t[3]=h?Io(h,a,e[4]):a,t[4]=h?pa(t[3],ga):e[4]}return(a=e[5])&&(h=t[5],t[5]=h?Fo(h,a,e[6]):a,t[6]=h?pa(t[5],ga):e[6]),(a=e[7])&&(t[7]=a),n&ya&&(t[8]=null==t[8]?e[8]:_a(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=r,t};var ba=Math.max;const wa=function(t,e,i,n,r,s,o,a){var h=2&e;if(!h&&"function"!=typeof t)throw new TypeError("Expected a function");var u=n?n.length:0;if(u||(e&=-97,n=r=void 0),o=void 0===o?o:ba(k(o),0),a=void 0===a?a:k(a),u-=r?r.length:0,64&e){var l=n,c=r;n=r=void 0}var d=h?void 0:Ho(t),p=[t,e,i,n,r,l,c,s,o,a];if(d&&xa(p,d),t=p[0],e=p[1],i=p[2],n=p[3],r=p[4],!(a=p[9]=void 0===p[9]?h?0:t.length:ba(p[9]-u,0))&&24&e&&(e&=-25),e&&1!=e)f=8==e||16==e?ma(t,e,a):32!=e&&33!=e||r.length?fa.apply(void 0,p):va(t,e,i,n);else var f=ko(t,e,i);return aa((d?Do:$o)(f,p),t,e)};const Ta=function(t,e,i){return e=i?void 0:e,e=t&&null==e?t.length:e,wa(t,128,void 0,void 0,void 0,void 0,e)};const Ma=function(t,e){var i;if("function"!=typeof e)throw new TypeError("Expected a function");return t=k(t),function(){return--t>0&&(i=e.apply(this,arguments)),t<=1&&(e=void 0),i}};var Sa=ue((function(t,e,i){var n=1;if(i.length){var r=pa(i,ua(Sa));n|=32}return wa(t,n,e,i,r)}));Sa.placeholder={};const Ea=Sa;var La=ue((function(t,e,i){var n=3;if(i.length){var r=pa(i,ua(La));n|=32}return wa(e,n,t,i,r)}));La.placeholder={};const Aa=La;function Da(t,e,i){var n=wa(t,8,void 0,void 0,void 0,void 0,void 0,e=i?void 0:e);return n.placeholder=Da.placeholder,n}Da.placeholder={};const Pa=Da;function Ca(t,e,i){var n=wa(t,16,void 0,void 0,void 0,void 0,void 0,e=i?void 0:e);return n.placeholder=Ca.placeholder,n}Ca.placeholder={};const Oa=Ca;var ka=Math.max,Ra=Math.min;const Ia=function(t,e,i){var n,r,s,o,a,h,u=0,l=!1,c=!1,d=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function p(e){var i=n,s=r;return n=r=void 0,u=e,o=t.apply(s,i)}function f(t){return u=t,a=setTimeout(g,e),l?p(t):o}function m(t){var i=t-h;return void 0===h||i>=e||i<0||c&&t-u>=s}function g(){var t=So();if(m(t))return y(t);a=setTimeout(g,function(t){var i=e-(t-h);return c?Ra(i,s-(t-u)):i}(t))}function y(t){return a=void 0,d&&n?p(t):(n=r=void 0,o)}function _(){var t=So(),i=m(t);if(n=arguments,r=this,h=t,i){if(void 0===a)return f(h);if(c)return clearTimeout(a),a=setTimeout(g,e),p(h)}return void 0===a&&(a=setTimeout(g,e)),o}return e=P(e)||0,v(i)&&(l=!!i.leading,s=(c="maxWait"in i)?ka(P(i.maxWait)||0,e):s,d="trailing"in i?!!i.trailing:d),_.cancel=function(){void 0!==a&&clearTimeout(a),u=0,n=h=r=a=void 0},_.flush=function(){return void 0===a?o:y(So())},_};const Ya=function(t,e,i){if("function"!=typeof t)throw new TypeError("Expected a function");return setTimeout((function(){t.apply(void 0,i)}),e)};const Fa=ue((function(t,e){return Ya(t,1,e)}));const Na=ue((function(t,e,i){return Ya(t,P(e)||0,i)}));const Ba=function(t){return wa(t,512)};const Ua=function(t){return Ma(2,t)};const ja=ue;var Ha=Math.min;const za=ja((function(t,e){var i=(e=1==e.length&&W(e[0])?Jt(e[0],Zt(qi)):Jt(X(e,1),Zt(qi))).length;return ue((function(n){for(var r=-1,s=Ha(n.length,i);++r<s;)n[r]=e[r].call(this,n[r]);return te(t,this,n)}))}));var Wa=ue((function(t,e){var i=pa(e,ua(Wa));return wa(t,32,void 0,e,i)}));Wa.placeholder={};const Ga=Wa;var Va=ue((function(t,e){var i=pa(e,ua(Va));return wa(t,64,void 0,e,i)}));Va.placeholder={};const Xa=Va;const qa=qn((function(t,e){return wa(t,256,void 0,void 0,void 0,e)}));const Ja=function(t,e){if("function"!=typeof t)throw new TypeError("Expected a function");return e=void 0===e?e:k(e),ue(t,e)};const Za=function(t,e,i){var r=t.length;return i=void 0===i?r:i,!e&&i>=r?t:n(t,e,i)};var Ka=Math.max;const Qa=function(t,e,i){var n=!0,r=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return v(i)&&(n="leading"in i?!!i.leading:n,r="trailing"in i?!!i.trailing:r),Ia(t,e,{leading:n,maxWait:e,trailing:r})};const $a=function(t){return Ta(t,1)};const th=function(t,e){return Ga(is(e),t)},eh={after:Lo,ary:Ta,before:Ma,bind:Ea,bindKey:Aa,curry:Pa,curryRight:Oa,debounce:Ia,defer:Fa,delay:Na,flip:Ba,memoize:Di,negate:Hs,once:Ua,overArgs:za,partial:Ga,partialRight:Xa,rearg:qa,rest:Ja,spread:function(t,e){if("function"!=typeof t)throw new TypeError("Expected a function");return e=null==e?0:Ka(k(e),0),ue((function(i){var n=i[e],r=Za(i,0,e);return n&&N(r,n),te(t,this,r)}))},throttle:Qa,unary:$a,wrap:th};const ih=function(){if(!arguments.length)return[];var t=arguments[0];return W(t)?t:[t]};const nh=function(t,e,i,n){var r=!i;i||(i={});for(var s=-1,o=e.length;++s<o;){var a=e[s],h=n?n(i[a],t[a],a,i,t):void 0;void 0===h&&(h=t[a]),r?Yr(i,a,h):Nr(i,a,h)}return i};const rh=function(t,e){return t&&nh(e,qe(e),t)};const sh=function(t){var e=[];if(null!=t)for(var i in Object(t))e.push(i);return e};var oh=Object.prototype.hasOwnProperty;const ah=function(t){if(!v(t))return sh(t);var e=ze(t),i=[];for(var n in t)("constructor"!=n||!e&&oh.call(t,n))&&i.push(n);return i};const hh=function(t){return _(t)?je(t,!0):ah(t)};const uh=function(t,e){return t&&nh(e,hh(e),t)};var lh=i(49455);const ch=function(t,e){return nh(t,Oe(t),e)};const dh=We(Object.getPrototypeOf,Object);const ph=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)N(e,Oe(t)),t=dh(t);return e}:De;const fh=function(t,e){return nh(t,ph(t),e)};const mh=function(t){return Le(t,hh,ph)};var vh=Object.prototype.hasOwnProperty;const gh=function(t){var e=t.length,i=new t.constructor(e);return e&&"string"==typeof t[0]&&vh.call(t,"index")&&(i.index=t.index,i.input=t.input),i};const yh=function(t){var e=new t.constructor(t.byteLength);return new be(e).set(new be(t)),e};const _h=function(t,e){var i=e?yh(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.byteLength)};var xh=/\w*$/;const bh=function(t){var e=new t.constructor(t.source,xh.exec(t));return e.lastIndex=t.lastIndex,e};var wh=o?o.prototype:void 0,Th=wh?wh.valueOf:void 0;const Mh=function(t){return Th?Object(Th.call(t)):{}};const Sh=function(t,e){var i=e?yh(t.buffer):t.buffer;return new t.constructor(i,t.byteOffset,t.length)};const Eh=function(t,e,i){var n=t.constructor;switch(e){case"[object ArrayBuffer]":return yh(t);case"[object Boolean]":case"[object Date]":return new n(+t);case"[object DataView]":return _h(t,i);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return Sh(t,i);case"[object Map]":return new n;case"[object Number]":case"[object String]":return new n(t);case"[object RegExp]":return bh(t);case"[object Set]":return new n;case"[object Symbol]":return Mh(t)}};const Lh=function(t){return"function"!=typeof t.constructor||ze(t)?{}:Co(dh(t))};const Ah=function(t){return T(t)&&"[object Map]"==pi(t)};var Dh=Fe.Z&&Fe.Z.isMap;const Ph=Dh?Zt(Dh):Ah;const Ch=function(t){return T(t)&&"[object Set]"==pi(t)};var Oh=Fe.Z&&Fe.Z.isSet;const kh=Oh?Zt(Oh):Ch;var Rh="[object Arguments]",Ih="[object Function]",Yh="[object Object]",Fh={};Fh[Rh]=Fh["[object Array]"]=Fh["[object ArrayBuffer]"]=Fh["[object DataView]"]=Fh["[object Boolean]"]=Fh["[object Date]"]=Fh["[object Float32Array]"]=Fh["[object Float64Array]"]=Fh["[object Int8Array]"]=Fh["[object Int16Array]"]=Fh["[object Int32Array]"]=Fh["[object Map]"]=Fh["[object Number]"]=Fh["[object Object]"]=Fh["[object RegExp]"]=Fh["[object Set]"]=Fh["[object String]"]=Fh["[object Symbol]"]=Fh["[object Uint8Array]"]=Fh["[object Uint8ClampedArray]"]=Fh["[object Uint16Array]"]=Fh["[object Uint32Array]"]=!0,Fh["[object Error]"]=Fh[Ih]=Fh["[object WeakMap]"]=!1;const Nh=function t(e,i,n,r,s,o){var a,h=1&i,u=2&i,l=4&i;if(n&&(a=s?n(e,r,s,o):n(e)),void 0!==a)return a;if(!v(e))return e;var c=W(e);if(c){if(a=gh(e),!h)return q(e,a)}else{var d=pi(e),p=d==Ih||"[object GeneratorFunction]"==d;if((0,Re.Z)(e))return(0,lh.Z)(e,h);if(d==Yh||d==Rh||p&&!s){if(a=u||p?{}:Lh(e),!h)return u?fh(e,uh(a,e)):ch(e,rh(a,e))}else{if(!Fh[d])return s?e:{};a=Eh(e,d,h)}}o||(o=new ye);var f=o.get(e);if(f)return f;o.set(e,a),kh(e)?e.forEach((function(r){a.add(t(r,i,n,r,e,o))})):Ph(e)&&e.forEach((function(r,s){a.set(s,t(r,i,n,s,e,o))}));var m=l?u?mh:Je:u?keysIn:qe,g=c?void 0:m(e);return es(g||e,(function(r,s){g&&(r=e[s=r]),Nr(a,s,t(r,i,n,s,e,o))})),a};const Bh=function(t){return Nh(t,4)};const Uh=function(t){return Nh(t,5)};const jh=function(t,e){return Nh(t,5,e="function"==typeof e?e:void 0)};const Hh=function(t,e){return Nh(t,4,e="function"==typeof e?e:void 0)};const zh=function(t,e,i){var n=i.length;if(null==t)return!n;for(t=Object(t);n--;){var r=i[n],s=e[r],o=t[r];if(void 0===o&&!(r in t)||!s(o))return!1}return!0};const Wh=function(t,e){return null==e||zh(t,e,qe(e))};const Gh=function(t,e){return t>e};const Vh=function(t){return function(e,i){return"string"==typeof e&&"string"==typeof i||(e=P(e),i=P(i)),t(e,i)}};const Xh=Vh(Gh);const qh=Vh((function(t,e){return t>=e}));const Jh=function(t){return T(t)&&"[object ArrayBuffer]"==m(t)};var Zh=Fe.Z&&Fe.Z.isArrayBuffer;const Kh=Zh?Zt(Zh):Jh;const Qh=function(t){return!0===t||!1===t||T(t)&&"[object Boolean]"==m(t)};const $h=function(t){return T(t)&&"[object Date]"==m(t)};var tu=Fe.Z&&Fe.Z.isDate;const eu=tu?Zt(tu):$h;var iu=Function.prototype,nu=Object.prototype,ru=iu.toString,su=nu.hasOwnProperty,ou=ru.call(Object);const au=function(t){if(!T(t)||"[object Object]"!=m(t))return!1;var e=dh(t);if(null===e)return!0;var i=su.call(e,"constructor")&&e.constructor;return"function"==typeof i&&i instanceof i&&ru.call(i)==ou};const hu=function(t){return T(t)&&1===t.nodeType&&!au(t)};var uu=Object.prototype.hasOwnProperty;const lu=function(t){if(null==t)return!0;if(_(t)&&(W(t)||"string"==typeof t||"function"==typeof t.splice||(0,Re.Z)(t)||Be(t)||z(t)))return!t.length;var e=pi(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if(ze(t))return!Xe(t).length;for(var i in t)if(uu.call(t,i))return!1;return!0};const cu=function(t,e){return _i(t,e)};const du=function(t,e,i){var n=(i="function"==typeof i?i:void 0)?i(t,e):void 0;return void 0===n?_i(t,e,void 0,i):!!n};const pu=function(t){if(!T(t))return!1;var e=m(t);return"[object Error]"==e||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!au(t)};var fu=s.Z.isFinite;const mu=function(t){return"number"==typeof t&&fu(t)};const vu=function(t){return"number"==typeof t&&t==k(t)};const gu=function(t,e){return t===e||xi(t,e,wi(e))};const yu=function(t,e,i){return i="function"==typeof i?i:void 0,xi(t,e,wi(e),i)};const _u=function(t){return"number"==typeof t||T(t)&&"[object Number]"==m(t)};const xu=function(t){return _u(t)&&t!=+t};var bu=i(60880);const wu=Z?g:bu.Z;const Tu=function(t){if(wu(t))throw new Error("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return at(t)};const Mu=function(t){return null==t};const Su=function(t){return null===t};const Eu=function(t){return T(t)&&"[object RegExp]"==m(t)};var Lu=Fe.Z&&Fe.Z.isRegExp;const Au=Lu?Zt(Lu):Eu;var Du=9007199254740991;const Pu=function(t){return vu(t)&&t>=-9007199254740991&&t<=Du};const Cu=function(t){return void 0===t};const Ou=function(t){return T(t)&&"[object WeakMap]"==pi(t)};const ku=function(t){return T(t)&&"[object WeakSet]"==m(t)};const Ru=function(t,e){return t<e};const Iu=Vh(Ru);const Yu=Vh((function(t,e){return t<=e}));const Fu=function(t){for(var e,i=[];!(e=t.next()).done;)i.push(e.value);return i};const Nu=function(t){return t.split("")};var Bu="[\\ud800-\\udfff]",Uu="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",ju="[^\\ud800-\\udfff]",Hu="(?:\\ud83c[\\udde6-\\uddff]){2}",zu="[\\ud800-\\udbff][\\udc00-\\udfff]",Wu="(?:"+Uu+"|"+"\\ud83c[\\udffb-\\udfff])"+"?",Gu="[\\ufe0e\\ufe0f]?",Vu=Gu+Wu+("(?:\\u200d(?:"+[ju,Hu,zu].join("|")+")"+Gu+Wu+")*"),Xu="(?:"+[ju+Uu+"?",Uu,Hu,zu,Bu].join("|")+")",qu=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+Xu+Vu,"g");const Ju=function(t){return t.match(qu)||[]};const Zu=function(t){return so(t)?Ju(t):Nu(t)};var Ku=o?o.iterator:void 0;const Qu=function(t){if(!t)return[];if(_(t))return Ms(t)?Zu(t):q(t);if(Ku&&t[Ku])return Fu(t[Ku]());var e=pi(t);return("[object Map]"==e?we:"[object Set]"==e?Te:Es)(t)};const $u=function(t){return nh(t,hh(t))};var tl=9007199254740991;const el=function(t){return t?rn(k(t),-9007199254740991,tl):0===t?t:0},il={castArray:ih,clone:Bh,cloneDeep:Uh,cloneDeepWith:jh,cloneWith:Hh,conformsTo:Wh,eq:r,gt:Xh,gte:qh,isArguments:z,isArray:W,isArrayBuffer:Kh,isArrayLike:_,isArrayLikeObject:le,isBoolean:Qh,isBuffer:Re.Z,isDate:eu,isElement:hu,isEmpty:lu,isEqual:cu,isEqualWith:du,isError:pu,isFinite:mu,isFunction:g,isInteger:vu,isLength:y,isMap:Ph,isMatch:gu,isMatchWith:yu,isNaN:xu,isNative:Tu,isNil:Mu,isNull:Su,isNumber:_u,isObject:v,isObjectLike:T,isPlainObject:au,isRegExp:Au,isSafeInteger:Pu,isSet:kh,isString:Ms,isSymbol:M,isTypedArray:Be,isUndefined:Cu,isWeakMap:Ou,isWeakSet:ku,lt:Iu,lte:Yu,toArray:Qu,toFinite:O,toInteger:k,toLength:sn,toNumber:P,toPlainObject:$u,toSafeInteger:el,toString:Yi};const nl=function(t){return"number"==typeof t?t:M(t)?NaN:+t};const rl=function(t,e){return function(i,n){var r;if(void 0===i&&void 0===n)return e;if(void 0!==i&&(r=i),void 0!==n){if(void 0===r)return n;"string"==typeof i||"string"==typeof n?(i=Ii(i),n=Ii(n)):(i=nl(i),n=nl(n)),r=t(i,n)}return r}};const sl=rl((function(t,e){return t+e}),0);var ol=s.Z.isFinite,al=Math.min;const hl=function(t){var e=Math[t];return function(t,i){if(t=P(t),(i=null==i?0:al(k(i),292))&&ol(t)){var n=(Yi(t)+"e").split("e"),r=e(n[0]+"e"+(+n[1]+i));return+((n=(Yi(r)+"e").split("e"))[0]+"e"+(+n[1]-i))}return e(t)}};const ul=hl("ceil");const ll=rl((function(t,e){return t/e}),1);var cl=hl("floor");const dl=function(t,e,i){for(var n=-1,r=t.length;++n<r;){var s=t[n],o=e(s);if(null!=o&&(void 0===a?o==o&&!M(o):i(o,a)))var a=o,h=s}return h};const pl=function(t,e){for(var i,n=-1,r=t.length;++n<r;){var s=e(t[n]);void 0!==s&&(i=void 0===i?s:i+s)}return i};const fl=function(t,e){var i=null==t?0:t.length;return i?pl(t,e)/i:NaN};const ml={add:sl,ceil:ul,divide:ll,floor:cl,max:function(t){return t&&t.length?dl(t,$t,Gh):void 0},maxBy:function(t,e){return t&&t.length?dl(t,qi(e,2),Gh):void 0},mean:function(t){return fl(t,$t)},meanBy:function(t,e){return fl(t,qi(e,2))},min:function(t){return t&&t.length?dl(t,$t,Ru):void 0},minBy:function(t,e){return t&&t.length?dl(t,qi(e,2),Ru):void 0},multiply:rl((function(t,e){return t*e}),1),round:hl("round"),subtract:rl((function(t,e){return t-e}),0),sum:function(t){return t&&t.length?pl(t,$t):0},sumBy:function(t,e){return t&&t.length?pl(t,qi(e,2)):0}};const vl=function(t,e,i){return void 0===i&&(i=e,e=void 0),void 0!==i&&(i=(i=P(i))==i?i:0),void 0!==e&&(e=(e=P(e))==e?e:0),rn(P(t),e,i)};var gl=Math.max,yl=Math.min;const _l=function(t,e,i){return t>=yl(e,i)&&t<gl(e,i)};const xl=function(t,e,i){return e=O(e),void 0===i?(i=e,e=0):i=O(i),t=P(t),_l(t,e,i)};var bl=parseFloat,wl=Math.min,Tl=Math.random;const Ml={clamp:vl,inRange:xl,random:function(t,e,i){if(i&&"boolean"!=typeof i&&w(t,e,i)&&(e=i=void 0),void 0===i&&("boolean"==typeof e?(i=e,e=void 0):"boolean"==typeof t&&(i=t,t=void 0)),void 0===t&&void 0===e?(t=0,e=1):(t=O(t),void 0===e?(e=t,t=0):e=O(e)),t>e){var n=t;t=e,e=n}if(i||t%1||e%1){var r=Tl();return wl(t+r*(e-t+bl("1e-"+((r+"").length-1))),e)}return Vs(t,e)}};const Sl=function(t){return ue((function(e,i){var n=-1,r=i.length,s=r>1?i[r-1]:void 0,o=r>2?i[2]:void 0;for(s=t.length>3&&"function"==typeof s?(r--,s):void 0,o&&w(i[0],i[1],o)&&(s=r<3?void 0:s,r=1),e=Object(e);++n<r;){var a=i[n];a&&t(e,a,n,s)}return e}))};var El=Object.prototype.hasOwnProperty;const Ll=Sl((function(t,e){if(ze(e)||_(e))nh(e,qe(e),t);else for(var i in e)El.call(e,i)&&Nr(t,i,e[i])}));const Al=Sl((function(t,e){nh(e,hh(e),t)}));const Dl=Sl((function(t,e,i,n){nh(e,hh(e),t,n)}));const Pl=Sl((function(t,e,i,n){nh(e,qe(e),t,n)}));const Cl=qn(Hn);const Ol=function(t,e){var i=Co(t);return null==e?i:rh(i,e)};var kl=Object.prototype,Rl=kl.hasOwnProperty;const Il=ue((function(t,e){t=Object(t);var i=-1,n=e.length,s=n>2?e[2]:void 0;for(s&&w(e[0],e[1],s)&&(n=1);++i<n;)for(var o=e[i],a=hh(o),h=-1,u=a.length;++h<u;){var l=a[h],c=t[l];(void 0===c||r(c,kl[l])&&!Rl.call(t,l))&&(t[l]=o[l])}return t}));const Yl=function(t,e,i){(void 0!==i&&!r(t[e],i)||void 0===i&&!(e in t))&&Yr(t,e,i)};const Fl=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};const Nl=function(t,e,i,n,r,s,o){var a=Fl(t,i),h=Fl(e,i),u=o.get(h);if(u)Yl(t,i,u);else{var l=s?s(a,h,i+"",t,e,o):void 0,c=void 0===l;if(c){var d=W(h),p=!d&&(0,Re.Z)(h),f=!d&&!p&&Be(h);l=h,d||p||f?W(a)?l=a:le(a)?l=q(a):p?(c=!1,l=(0,lh.Z)(h,!0)):f?(c=!1,l=Sh(h,!0)):l=[]:au(h)||z(h)?(l=a,z(a)?l=$u(a):v(a)&&!g(a)||(l=Lh(h))):c=!1}c&&(o.set(h,l),r(l,h,n,s,o),o.delete(h)),Yl(t,i,l)}};const Bl=function t(e,i,n,r,s){e!==i&&Xr(i,(function(o,a){if(s||(s=new ye),v(o))Nl(e,i,a,n,t,r,s);else{var h=r?r(Fl(e,a),o,a+"",e,i,s):void 0;void 0===h&&(h=o),Yl(e,a,h)}}),hh)};const Ul=function t(e,i,n,r,s,o){return v(e)&&v(i)&&(o.set(i,e),Bl(e,i,void 0,t,o),o.delete(i)),e};const jl=Sl((function(t,e,i,n){Bl(t,e,i,n)}));const Hl=ue((function(t){return t.push(void 0,Ul),te(jl,void 0,t)}));const zl=function(t,e){return Jt(e,(function(e){return[e,t[e]]}))};const Wl=function(t){var e=-1,i=Array(t.size);return t.forEach((function(t){i[++e]=[t,t]})),i};const Gl=function(t){return function(e){var i=pi(e);return"[object Map]"==i?we(e):"[object Set]"==i?Wl(e):zl(e,t(e))}};const Vl=Gl(qe);const Xl=Gl(hh);const ql=function(t,e,i){var n;return i(t,(function(t,i,r){if(e(t,i,r))return n=i,!1})),n};const Jl=function(t,e){return ql(t,qi(e,3),qr)};const Zl=function(t,e){return ql(t,qi(e,3),os)};const Kl=function(t,e){return null==t?t:Xr(t,is(e),hh)};const Ql=function(t,e){return null==t?t:ss(t,is(e),hh)};const $l=function(t,e){return t&&qr(t,is(e))};const tc=function(t,e){return t&&os(t,is(e))};const ec=function(t,e){return Ae(e,(function(e){return g(t[e])}))};const ic=function(t){return null==t?[]:ec(t,qe(t))};const nc=function(t){return null==t?[]:ec(t,hh(t))};var rc=Object.prototype.hasOwnProperty;const sc=function(t,e){return null!=t&&rc.call(t,e)};const oc=function(t,e){return null!=t&&Hi(t,e,sc)};const ac=function(t,e,i,n){return qr(t,(function(t,r,s){e(n,i(t),r,s)})),n};const hc=function(t,e){return function(i,n){return ac(i,t,e(n),{})}};var uc=Object.prototype.toString;const lc=hc((function(t,e,i){null!=e&&"function"!=typeof e.toString&&(e=uc.call(e)),t[e]=i}),ne($t));var cc=Object.prototype,dc=cc.hasOwnProperty,pc=cc.toString;const fc=hc((function(t,e,i){null!=e&&"function"!=typeof e.toString&&(e=pc.call(e)),dc.call(t,e)?t[e].push(i):t[e]=[i]}),qi);const mc=ue(Ds);const vc=function(t,e){var i={};return e=qi(e,3),qr(t,(function(t,n,r){Yr(i,e(t,n,r),t)})),i};const gc=function(t,e){var i={};return e=qi(e,3),qr(t,(function(t,n,r){Yr(i,n,e(t,n,r))})),i};const yc=Sl((function(t,e,i){Bl(t,e,i)}));const _c=function(t){return au(t)?void 0:t};const xc=qn((function(t,e){var i={};if(null==t)return i;var n=!1;e=Jt(e,(function(e){return e=Fi(e,t),n||(n=e.length>1),e})),nh(t,mh(t),i),n&&(i=Nh(i,7,_c));for(var r=e.length;r--;)Wn(i,e[r]);return i}));const bc=function(t,e,i){for(var n=-1,r=e.length,s={};++n<r;){var o=e[n],a=Bi(t,o);i(a,o)&&jr(s,Fi(o,t),a)}return s};const wc=function(t,e){if(null==t)return{};var i=Jt(mh(t),(function(t){return[t]}));return e=qi(e),bc(t,i,(function(t,i){return e(t,i[0])}))};const Tc=function(t,e){return wc(t,Hs(qi(e)))};const Mc=function(t,e){return bc(t,e,(function(e,i){return zi(t,i)}))};var Sc=qn((function(t,e){return null==t?{}:Mc(t,e)}));const Ec=function(t,e,i,n){return jr(t,e,i(Bi(t,e)),n)};const Lc=function(t){return null==t?[]:Ss(t,hh(t))},Ac={assign:Ll,assignIn:Al,assignInWith:Dl,assignWith:Pl,at:Cl,create:Ol,defaults:Il,defaultsDeep:Hl,entries:Vl,entriesIn:Xl,extend:Al,extendWith:Dl,findKey:Jl,findLastKey:Zl,forIn:Kl,forInRight:Ql,forOwn:$l,forOwnRight:tc,functions:ic,functionsIn:nc,get:Ui,has:oc,hasIn:zi,invert:lc,invertBy:fc,invoke:mc,keys:qe,keysIn:hh,mapKeys:vc,mapValues:gc,merge:yc,mergeWith:jl,omit:xc,omitBy:Tc,pick:Sc,pickBy:wc,result:function(t,e,i){var n=-1,r=(e=Fi(e,t)).length;for(r||(r=1,t=void 0);++n<r;){var s=null==t?void 0:t[Ni(e[n])];void 0===s&&(n=r,s=i),t=g(s)?s.call(t):s}return t},set:function(t,e,i){return null==t?t:jr(t,e,i)},setWith:function(t,e,i,n){return n="function"==typeof n?n:void 0,null==t?t:jr(t,e,i,n)},toPairs:Vl,toPairsIn:Xl,transform:function(t,e,i){var n=W(t),r=n||(0,Re.Z)(t)||Be(t);if(e=qi(e,4),null==i){var s=t&&t.constructor;i=r?n?new s:[]:v(t)&&g(s)?Co(dh(t)):{}}return(r?es:qr)(t,(function(t,n,r){return e(i,t,n,r)})),i},unset:function(t,e){return null==t||Wn(t,e)},update:function(t,e,i){return null==t?t:Ec(t,e,is(i))},updateWith:function(t,e,i,n){return n="function"==typeof n?n:void 0,null==t?t:Ec(t,e,is(i),n)},values:Es,valuesIn:Lc};const Dc=function(t,e){return e(t)};var Pc=qn((function(t){var e=t.length,i=e?t[0]:0,n=this.__wrapped__,r=function(e){return Hn(e,t)};return!(e>1||this.__actions__.length)&&n instanceof jo&&b(i)?((n=n.slice(i,+i+(e?1:0))).__actions__.push({func:Dc,args:[r],thisArg:void 0}),new Xo(n,this.__chain__).thru((function(t){return e&&!t.length&&t.push(void 0),t}))):this.thru(r)}));const Cc=function(t){var e=Ko(t);return e.__chain__=!0,e};const Oc=function(t,e){var i=t;return i instanceof jo&&(i=i.value()),Fs(e,(function(t,e){return e.func.apply(e.thisArg,N([t],e.args))}),i)};const kc=function(){return Oc(this.__wrapped__,this.__actions__)};const Rc=function(){return Cc(this)},Ic={at:Pc,chain:Cc,commit:function(){return new Xo(this.value(),this.__chain__)},lodash:Ko,next:function(){void 0===this.__values__&&(this.__values__=Qu(this.value()));var t=this.__index__>=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},plant:function(t){for(var e,i=this;i instanceof Bo;){var n=qo(i);n.__index__=0,n.__values__=void 0,e?r.__wrapped__=n:e=n;var r=n;i=i.__wrapped__}return r.__wrapped__=t,e},reverse:function(){var t=this.__wrapped__;if(t instanceof jo){var e=t;return this.__actions__.length&&(e=new jo(this)),(e=e.reverse()).__actions__.push({func:Dc,args:[Qn],thisArg:void 0}),new Xo(e,this.__chain__)}return this.thru(Qn)},tap:function(t,e){return e(t),t},thru:Dc,toIterator:function(){return this},toJSON:kc,value:kc,valueOf:kc,wrapperChain:Rc};const Yc=function(t){return function(e){e=Yi(e);var i=so(e)?Zu(e):void 0,n=i?i[0]:e.charAt(0),r=i?Za(i,1).join(""):e.slice(1);return n[t]()+r}};const Fc=Yc("toUpperCase");const Nc=function(t){return Fc(Yi(t).toLowerCase())};const Bc=function(t){return function(e){return null==t?void 0:t[e]}};const Uc=Bc({\u00c0:"A",\u00c1:"A",\u00c2:"A",\u00c3:"A",\u00c4:"A",\u00c5:"A",\u00e0:"a",\u00e1:"a",\u00e2:"a",\u00e3:"a",\u00e4:"a",\u00e5:"a",\u00c7:"C",\u00e7:"c",\u00d0:"D",\u00f0:"d",\u00c8:"E",\u00c9:"E",\u00ca:"E",\u00cb:"E",\u00e8:"e",\u00e9:"e",\u00ea:"e",\u00eb:"e",\u00cc:"I",\u00cd:"I",\u00ce:"I",\u00cf:"I",\u00ec:"i",\u00ed:"i",\u00ee:"i",\u00ef:"i",\u00d1:"N",\u00f1:"n",\u00d2:"O",\u00d3:"O",\u00d4:"O",\u00d5:"O",\u00d6:"O",\u00d8:"O",\u00f2:"o",\u00f3:"o",\u00f4:"o",\u00f5:"o",\u00f6:"o",\u00f8:"o",\u00d9:"U",\u00da:"U",\u00db:"U",\u00dc:"U",\u00f9:"u",\u00fa:"u",\u00fb:"u",\u00fc:"u",\u00dd:"Y",\u00fd:"y",\u00ff:"y",\u00c6:"Ae",\u00e6:"ae",\u00de:"Th",\u00fe:"th",\u00df:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010a:"C",\u010c:"C",\u0107:"c",\u0109:"c",\u010b:"c",\u010d:"c",\u010e:"D",\u0110:"D",\u010f:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011a:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011b:"e",\u011c:"G",\u011e:"G",\u0120:"G",\u0122:"G",\u011d:"g",\u011f:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012a:"I",\u012c:"I",\u012e:"I",\u0130:"I",\u0129:"i",\u012b:"i",\u012d:"i",\u012f:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013b:"L",\u013d:"L",\u013f:"L",\u0141:"L",\u013a:"l",\u013c:"l",\u013e:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014a:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014b:"n",\u014c:"O",\u014e:"O",\u0150:"O",\u014d:"o",\u014f:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015a:"S",\u015c:"S",\u015e:"S",\u0160:"S",\u015b:"s",\u015d:"s",\u015f:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016a:"U",\u016c:"U",\u016e:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016b:"u",\u016d:"u",\u016f:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017b:"Z",\u017d:"Z",\u017a:"z",\u017c:"z",\u017e:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017f:"s"});var jc=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Hc=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");const zc=function(t){return(t=Yi(t))&&t.replace(jc,Uc).replace(Hc,"")};var Wc=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;const Gc=function(t){return t.match(Wc)||[]};var Vc=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;const Xc=function(t){return Vc.test(t)};var qc="\\u2700-\\u27bf",Jc="a-z\\xdf-\\xf6\\xf8-\\xff",Zc="A-Z\\xc0-\\xd6\\xd8-\\xde",Kc="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Qc="["+Kc+"]",$c="\\d+",td="[\\u2700-\\u27bf]",ed="["+Jc+"]",id="[^\\ud800-\\udfff"+Kc+$c+qc+Jc+Zc+"]",nd="(?:\\ud83c[\\udde6-\\uddff]){2}",rd="[\\ud800-\\udbff][\\udc00-\\udfff]",sd="["+Zc+"]",od="(?:"+ed+"|"+id+")",ad="(?:"+sd+"|"+id+")",hd="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",ud="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",ld="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",cd="[\\ufe0e\\ufe0f]?",dd=cd+ld+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",nd,rd].join("|")+")"+cd+ld+")*"),pd="(?:"+[td,nd,rd].join("|")+")"+dd,fd=RegExp([sd+"?"+ed+"+"+hd+"(?="+[Qc,sd,"$"].join("|")+")",ad+"+"+ud+"(?="+[Qc,sd+od,"$"].join("|")+")",sd+"?"+od+"+"+hd,sd+"+"+ud,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",$c,pd].join("|"),"g");const md=function(t){return t.match(fd)||[]};const vd=function(t,e,i){return t=Yi(t),void 0===(e=i?void 0:e)?Xc(t)?md(t):Gc(t):t.match(e)||[]};var gd=RegExp("['\u2019]","g");const yd=function(t){return function(e){return Fs(vd(zc(e).replace(gd,"")),t,"")}};const _d=yd((function(t,e,i){return e=e.toLowerCase(),t+(i?Nc(e):e)}));const xd=function(t,e,i){t=Yi(t),e=Ii(e);var n=t.length,r=i=void 0===i?n:rn(k(i),0,n);return(i-=e.length)>=0&&t.slice(i,r)==e};const bd=Bc({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});var wd=/[&<>"']/g,Td=RegExp(wd.source);const Md=function(t){return(t=Yi(t))&&Td.test(t)?t.replace(wd,bd):t};var Sd=/[\\^$.*+?()[\]{}|]/g,Ed=RegExp(Sd.source);const Ld=function(t){return(t=Yi(t))&&Ed.test(t)?t.replace(Sd,"\\$&"):t};const Ad=yd((function(t,e,i){return t+(i?"-":"")+e.toLowerCase()}));const Dd=yd((function(t,e,i){return t+(i?" ":"")+e.toLowerCase()}));const Pd=Yc("toLowerCase");var Cd=Math.floor;const Od=function(t,e){var i="";if(!t||e<1||e>9007199254740991)return i;do{e%2&&(i+=t),(e=Cd(e/2))&&(t+=t)}while(e);return i};var kd=Math.ceil;const Rd=function(t,e){var i=(e=void 0===e?" ":Ii(e)).length;if(i<2)return i?Od(e,t):e;var n=Od(e,kd(t/_o(e)));return so(e)?Za(Zu(n),0,t).join(""):n.slice(0,t)};var Id=Math.ceil,Yd=Math.floor;const Fd=function(t,e,i){t=Yi(t);var n=(e=k(e))?_o(t):0;if(!e||n>=e)return t;var r=(e-n)/2;return Rd(Yd(r),i)+t+Rd(Id(r),i)};const Nd=function(t,e,i){t=Yi(t);var n=(e=k(e))?_o(t):0;return e&&n<e?t+Rd(e-n,i):t};const Bd=function(t,e,i){t=Yi(t);var n=(e=k(e))?_o(t):0;return e&&n<e?Rd(e-n,i)+t:t};var Ud=/^\s+/,jd=s.Z.parseInt;const Hd=function(t,e,i){return i||null==e?e=0:e&&(e=+e),jd(Yi(t).replace(Ud,""),e||0)};const zd=function(t,e,i){return e=(i?w(t,e,i):void 0===e)?1:k(e),Od(Yi(t),e)};const Wd=function(){var t=arguments,e=Yi(t[0]);return t.length<3?e:e.replace(t[1],t[2])};const Gd=yd((function(t,e,i){return t+(i?"_":"")+e.toLowerCase()}));const Vd=function(t,e,i){return i&&"number"!=typeof i&&w(t,e,i)&&(e=i=void 0),(i=void 0===i?4294967295:i>>>0)?(t=Yi(t))&&("string"==typeof e||null!=e&&!Au(e))&&!(e=Ii(e))&&so(t)?Za(Zu(t),0,i):t.split(e,i):[]};const Xd=yd((function(t,e,i){return t+(i?" ":"")+Fc(e)}));const qd=function(t,e,i){return t=Yi(t),i=null==i?0:rn(k(i),0,t.length),e=Ii(e),t.slice(i,i+e.length)==e};const Jd=ue((function(t,e){try{return te(t,void 0,e)}catch(t){return pu(t)?t:new Error(t)}}));var Zd=Object.prototype,Kd=Zd.hasOwnProperty;const Qd=function(t,e,i,n){return void 0===t||r(t,Zd[i])&&!Kd.call(n,i)?e:t};var $d={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"};const tp=function(t){return"\\"+$d[t]};const ep=/<%=([\s\S]+?)%>/g;const ip={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:ep,variable:"",imports:{_:{escape:Md}}};var np=/\b__p \+= '';/g,rp=/\b(__p \+=) '' \+/g,sp=/(__e\(.*?\)|\b__t\)) \+\n'';/g,op=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ap=/($^)/,hp=/['\n\r\u2028\u2029\\]/g,up=Object.prototype.hasOwnProperty;const lp=function(t,e,i){var n=ip.imports._.templateSettings||ip;i&&w(t,e,i)&&(e=void 0),t=Yi(t),e=Dl({},e,n,Qd);var r,s,o=Dl({},e.imports,n.imports,Qd),a=qe(o),h=Ss(o,a),u=0,l=e.interpolate||ap,c="__p += '",d=RegExp((e.escape||ap).source+"|"+l.source+"|"+(l===ep?op:ap).source+"|"+(e.evaluate||ap).source+"|$","g"),p=up.call(e,"sourceURL")?"//# sourceURL="+(e.sourceURL+"").replace(/[\r\n]/g," ")+"\n":"";t.replace(d,(function(e,i,n,o,a,h){return n||(n=o),c+=t.slice(u,h).replace(hp,tp),i&&(r=!0,c+="' +\n__e("+i+") +\n'"),a&&(s=!0,c+="';\n"+a+";\n__p += '"),n&&(c+="' +\n((__t = ("+n+")) == null ? '' : __t) +\n'"),u=h+e.length,e})),c+="';\n";var f=up.call(e,"variable")&&e.variable;f||(c="with (obj) {\n"+c+"\n}\n"),c=(s?c.replace(np,""):c).replace(rp,"$1").replace(sp,"$1;"),c="function("+(f||"obj")+") {\n"+(f?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(r?", __e = _.escape":"")+(s?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+c+"return __p\n}";var m=Jd((function(){return Function(a,p+"return "+c).apply(void 0,h)}));if(m.source=c,pu(m))throw m;return m};const cp=function(t){return Yi(t).toLowerCase()};const dp=function(t){return Yi(t).toUpperCase()};const pp=function(t,e){for(var i=t.length;i--&&Vt(e,t[i],0)>-1;);return i};const fp=function(t,e){for(var i=-1,n=t.length;++i<n&&Vt(e,t[i],0)>-1;);return i};var mp=/^\s+|\s+$/g;const vp=function(t,e,i){if((t=Yi(t))&&(i||void 0===e))return t.replace(mp,"");if(!t||!(e=Ii(e)))return t;var n=Zu(t),r=Zu(e),s=fp(n,r),o=pp(n,r)+1;return Za(n,s,o).join("")};var gp=/\s+$/;const yp=function(t,e,i){if((t=Yi(t))&&(i||void 0===e))return t.replace(gp,"");if(!t||!(e=Ii(e)))return t;var n=Zu(t),r=pp(n,Zu(e))+1;return Za(n,0,r).join("")};var _p=/^\s+/;const xp=function(t,e,i){if((t=Yi(t))&&(i||void 0===e))return t.replace(_p,"");if(!t||!(e=Ii(e)))return t;var n=Zu(t),r=fp(n,Zu(e));return Za(n,r).join("")};var bp=/\w*$/;const wp=function(t,e){var i=30,n="...";if(v(e)){var r="separator"in e?e.separator:r;i="length"in e?k(e.length):i,n="omission"in e?Ii(e.omission):n}var s=(t=Yi(t)).length;if(so(t)){var o=Zu(t);s=o.length}if(i>=s)return t;var a=i-_o(n);if(a<1)return n;var h=o?Za(o,0,a).join(""):t.slice(0,a);if(void 0===r)return h+n;if(o&&(a+=h.length-a),Au(r)){if(t.slice(a).search(r)){var u,l=h;for(r.global||(r=RegExp(r.source,Yi(bp.exec(r))+"g")),r.lastIndex=0;u=r.exec(l);)var c=u.index;h=h.slice(0,void 0===c?a:c)}}else if(t.indexOf(Ii(r),a)!=a){var d=h.lastIndexOf(r);d>-1&&(h=h.slice(0,d))}return h+n};const Tp=Bc({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var Mp=/&(?:amp|lt|gt|quot|#39);/g,Sp=RegExp(Mp.source);const Ep=function(t){return(t=Yi(t))&&Sp.test(t)?t.replace(Mp,Tp):t};var Lp=yd((function(t,e,i){return t+(i?" ":"")+e.toUpperCase()}));const Ap={camelCase:_d,capitalize:Nc,deburr:zc,endsWith:xd,escape:Md,escapeRegExp:Ld,kebabCase:Ad,lowerCase:Dd,lowerFirst:Pd,pad:Fd,padEnd:Nd,padStart:Bd,parseInt:Hd,repeat:zd,replace:Wd,snakeCase:Gd,split:Vd,startCase:Xd,startsWith:qd,template:lp,templateSettings:ip,toLower:cp,toUpper:dp,trim:vp,trimEnd:yp,trimStart:xp,truncate:wp,unescape:Ep,upperCase:Lp,upperFirst:Fc,words:vd};const Dp=qn((function(t,e){return es(e,(function(e){e=Ni(e),Yr(t,e,Ea(t[e],t))})),t}));const Pp=function(t){var e=null==t?0:t.length,i=qi;return t=e?Jt(t,(function(t){if("function"!=typeof t[1])throw new TypeError("Expected a function");return[i(t[0]),t[1]]})):[],ue((function(i){for(var n=-1;++n<e;){var r=t[n];if(te(r[0],this,i))return te(r[1],this,i)}}))};const Cp=function(t){var e=qe(t);return function(i){return zh(i,t,e)}};const Op=function(t){return Cp(Nh(t,1))};const kp=function(t,e){return null==t||t!=t?e:t};const Rp=function(t){return qn((function(e){var i=e.length,n=i,r=Xo.prototype.thru;for(t&&e.reverse();n--;){var s=e[n];if("function"!=typeof s)throw new TypeError("Expected a function");if(r&&!o&&"wrapper"==Go(s))var o=new Xo([],!0)}for(n=o?n:i;++n<i;){s=e[n];var a=Go(s),h="wrapper"==a?Ho(s):void 0;o=h&&Qo(h[0])&&424==h[1]&&!h[4].length&&1==h[9]?o[Go(h[0])].apply(o,h[3]):1==s.length&&Qo(s)?o[a]():o.thru(s)}return function(){var t=arguments,n=t[0];if(o&&1==t.length&&W(n))return o.plant(n).value();for(var r=0,s=i?e[r].apply(this,t):n;++r<i;)s=e[r].call(this,s);return s}}))};const Ip=Rp();const Yp=Rp(!0);const Fp=function(t){return qi("function"==typeof t?t:Nh(t,1))};const Np=function(t){return Mi(Nh(t,1))};const Bp=function(t,e){return Wi(t,Nh(e,1))};const Up=ue((function(t,e){return function(i){return Ds(i,t,e)}}));const jp=ue((function(t,e){return function(i){return Ds(t,i,e)}}));const Hp=function(t,e,i){var n=qe(e),r=ec(e,n),s=!(v(i)&&"chain"in i&&!i.chain),o=g(t);return es(r,(function(i){var n=e[i];t[i]=n,o&&(t.prototype[i]=function(){var e=this.__chain__;if(s||e){var i=t(this.__wrapped__),r=i.__actions__=q(this.__actions__);return r.push({func:n,args:arguments,thisArg:t}),i.__chain__=e,i}return n.apply(t,N([this.value()],arguments))})})),t};const zp=function(t){return t=k(t),ue((function(e){return kn(e,t)}))};const Wp=function(t){return qn((function(e){return e=Jt(e,Zt(qi)),ue((function(i){var n=this;return t(e,(function(t){return te(t,n,i)}))}))}))};const Gp=Wp(Jt);const Vp=Wp(us);const Xp=Wp(_e);const qp=function(t){return function(e){return null==t?void 0:Bi(t,e)}};var Jp=Math.ceil,Zp=Math.max;const Kp=function(t,e,i,n){for(var r=-1,s=Zp(Jp((e-t)/(i||1)),0),o=Array(s);s--;)o[n?s:++r]=t,t+=i;return o};const Qp=function(t){return function(e,i,n){return n&&"number"!=typeof n&&w(e,i,n)&&(i=n=void 0),e=O(e),void 0===i?(i=e,e=0):i=O(i),n=void 0===n?e<i?1:-1:O(n),Kp(e,i,n,t)}};const $p=Qp();const tf=Qp(!0);const ef=function(){return{}};const nf=function(){return""};const rf=function(){return!0};var sf=4294967295,of=Math.min;const af=function(t,e){if((t=k(t))<1||t>9007199254740991)return[];var i=sf,n=of(t,sf);e=is(e),t-=sf;for(var r=ke(n,e);++i<t;)e(i);return r};const hf=function(t){return W(t)?Jt(t,Ni):M(t)?[t]:q(Oi(Yi(t)))};var uf=0;const lf=function(t){var e=++uf;return Yi(t)+e},cf={attempt:Jd,bindAll:Dp,cond:Pp,conforms:Op,constant:ne,defaultTo:kp,flow:Ip,flowRight:Yp,identity:$t,iteratee:Fp,matches:Np,matchesProperty:Bp,method:Up,methodOf:jp,mixin:Hp,noop:yr,nthArg:zp,over:Gp,overEvery:Vp,overSome:Xp,property:Xi,propertyOf:qp,range:$p,rangeRight:tf,stubArray:De,stubFalse:bu.Z,stubObject:ef,stubString:nf,stubTrue:rf,times:af,toPath:hf,uniqueId:lf};const df=function(){var t=new jo(this.__wrapped__);return t.__actions__=q(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=q(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=q(this.__views__),t};const pf=function(){if(this.__filtered__){var t=new jo(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t};var ff=Math.max,mf=Math.min;const vf=function(t,e,i){for(var n=-1,r=i.length;++n<r;){var s=i[n],o=s.size;switch(s.type){case"drop":t+=o;break;case"dropRight":e-=o;break;case"take":e=mf(e,t+o);break;case"takeRight":t=ff(t,e-o)}}return{start:t,end:e}};var gf=Math.min;const yf=function(){var t=this.__wrapped__.value(),e=this.__dir__,i=W(t),n=e<0,r=i?t.length:0,s=vf(0,r,this.__views__),o=s.start,a=s.end,h=a-o,u=n?a:o-1,l=this.__iteratees__,c=l.length,d=0,p=gf(h,this.__takeCount__);if(!i||!n&&r==h&&p==h)return Oc(t,this.__actions__);var f=[];t:for(;h--&&d<p;){for(var m=-1,v=t[u+=e];++m<c;){var g=l[m],y=g.iteratee,_=g.type,x=y(v);if(2==_)v=x;else if(!x){if(1==_)continue t;break t}}f[d++]=v}return f};var _f,xf,bf=4294967295,wf=Array.prototype,Tf=Object.prototype.hasOwnProperty,Mf=o?o.iterator:void 0,Sf=Math.max,Ef=Math.min,Lf=(_f=Hp,function(t,e,i){if(null==i){var n=v(e),r=n&&qe(e),s=r&&r.length&&ec(e,r);(s?s.length:n)||(i=e,e=t,t=this)}return _f(t,e,i)});Ko.after=eh.after,Ko.ary=eh.ary,Ko.assign=Ac.assign,Ko.assignIn=Ac.assignIn,Ko.assignInWith=Ac.assignInWith,Ko.assignWith=Ac.assignWith,Ko.at=Ac.at,Ko.before=eh.before,Ko.bind=eh.bind,Ko.bindAll=cf.bindAll,Ko.bindKey=eh.bindKey,Ko.castArray=il.castArray,Ko.chain=Ic.chain,Ko.chunk=Wr.chunk,Ko.compact=Wr.compact,Ko.concat=Wr.concat,Ko.cond=cf.cond,Ko.conforms=cf.conforms,Ko.constant=cf.constant,Ko.countBy=Mo.countBy,Ko.create=Ac.create,Ko.curry=eh.curry,Ko.curryRight=eh.curryRight,Ko.debounce=eh.debounce,Ko.defaults=Ac.defaults,Ko.defaultsDeep=Ac.defaultsDeep,Ko.defer=eh.defer,Ko.delay=eh.delay,Ko.difference=Wr.difference,Ko.differenceBy=Wr.differenceBy,Ko.differenceWith=Wr.differenceWith,Ko.drop=Wr.drop,Ko.dropRight=Wr.dropRight,Ko.dropRightWhile=Wr.dropRightWhile,Ko.dropWhile=Wr.dropWhile,Ko.fill=Wr.fill,Ko.filter=Mo.filter,Ko.flatMap=Mo.flatMap,Ko.flatMapDeep=Mo.flatMapDeep,Ko.flatMapDepth=Mo.flatMapDepth,Ko.flatten=Wr.flatten,Ko.flattenDeep=Wr.flattenDeep,Ko.flattenDepth=Wr.flattenDepth,Ko.flip=eh.flip,Ko.flow=cf.flow,Ko.flowRight=cf.flowRight,Ko.fromPairs=Wr.fromPairs,Ko.functions=Ac.functions,Ko.functionsIn=Ac.functionsIn,Ko.groupBy=Mo.groupBy,Ko.initial=Wr.initial,Ko.intersection=Wr.intersection,Ko.intersectionBy=Wr.intersectionBy,Ko.intersectionWith=Wr.intersectionWith,Ko.invert=Ac.invert,Ko.invertBy=Ac.invertBy,Ko.invokeMap=Mo.invokeMap,Ko.iteratee=cf.iteratee,Ko.keyBy=Mo.keyBy,Ko.keys=qe,Ko.keysIn=Ac.keysIn,Ko.map=Mo.map,Ko.mapKeys=Ac.mapKeys,Ko.mapValues=Ac.mapValues,Ko.matches=cf.matches,Ko.matchesProperty=cf.matchesProperty,Ko.memoize=eh.memoize,Ko.merge=Ac.merge,Ko.mergeWith=Ac.mergeWith,Ko.method=cf.method,Ko.methodOf=cf.methodOf,Ko.mixin=Lf,Ko.negate=Hs,Ko.nthArg=cf.nthArg,Ko.omit=Ac.omit,Ko.omitBy=Ac.omitBy,Ko.once=eh.once,Ko.orderBy=Mo.orderBy,Ko.over=cf.over,Ko.overArgs=eh.overArgs,Ko.overEvery=cf.overEvery,Ko.overSome=cf.overSome,Ko.partial=eh.partial,Ko.partialRight=eh.partialRight,Ko.partition=Mo.partition,Ko.pick=Ac.pick,Ko.pickBy=Ac.pickBy,Ko.property=cf.property,Ko.propertyOf=cf.propertyOf,Ko.pull=Wr.pull,Ko.pullAll=Wr.pullAll,Ko.pullAllBy=Wr.pullAllBy,Ko.pullAllWith=Wr.pullAllWith,Ko.pullAt=Wr.pullAt,Ko.range=cf.range,Ko.rangeRight=cf.rangeRight,Ko.rearg=eh.rearg,Ko.reject=Mo.reject,Ko.remove=Wr.remove,Ko.rest=eh.rest,Ko.reverse=Wr.reverse,Ko.sampleSize=Mo.sampleSize,Ko.set=Ac.set,Ko.setWith=Ac.setWith,Ko.shuffle=Mo.shuffle,Ko.slice=Wr.slice,Ko.sortBy=Mo.sortBy,Ko.sortedUniq=Wr.sortedUniq,Ko.sortedUniqBy=Wr.sortedUniqBy,Ko.split=Ap.split,Ko.spread=eh.spread,Ko.tail=Wr.tail,Ko.take=Wr.take,Ko.takeRight=Wr.takeRight,Ko.takeRightWhile=Wr.takeRightWhile,Ko.takeWhile=Wr.takeWhile,Ko.tap=Ic.tap,Ko.throttle=eh.throttle,Ko.thru=Dc,Ko.toArray=il.toArray,Ko.toPairs=Ac.toPairs,Ko.toPairsIn=Ac.toPairsIn,Ko.toPath=cf.toPath,Ko.toPlainObject=il.toPlainObject,Ko.transform=Ac.transform,Ko.unary=eh.unary,Ko.union=Wr.union,Ko.unionBy=Wr.unionBy,Ko.unionWith=Wr.unionWith,Ko.uniq=Wr.uniq,Ko.uniqBy=Wr.uniqBy,Ko.uniqWith=Wr.uniqWith,Ko.unset=Ac.unset,Ko.unzip=Wr.unzip,Ko.unzipWith=Wr.unzipWith,Ko.update=Ac.update,Ko.updateWith=Ac.updateWith,Ko.values=Ac.values,Ko.valuesIn=Ac.valuesIn,Ko.without=Wr.without,Ko.words=Ap.words,Ko.wrap=eh.wrap,Ko.xor=Wr.xor,Ko.xorBy=Wr.xorBy,Ko.xorWith=Wr.xorWith,Ko.zip=Wr.zip,Ko.zipObject=Wr.zipObject,Ko.zipObjectDeep=Wr.zipObjectDeep,Ko.zipWith=Wr.zipWith,Ko.entries=Ac.toPairs,Ko.entriesIn=Ac.toPairsIn,Ko.extend=Ac.assignIn,Ko.extendWith=Ac.assignInWith,Lf(Ko,Ko),Ko.add=ml.add,Ko.attempt=cf.attempt,Ko.camelCase=Ap.camelCase,Ko.capitalize=Ap.capitalize,Ko.ceil=ml.ceil,Ko.clamp=Ml.clamp,Ko.clone=il.clone,Ko.cloneDeep=il.cloneDeep,Ko.cloneDeepWith=il.cloneDeepWith,Ko.cloneWith=il.cloneWith,Ko.conformsTo=il.conformsTo,Ko.deburr=Ap.deburr,Ko.defaultTo=cf.defaultTo,Ko.divide=ml.divide,Ko.endsWith=Ap.endsWith,Ko.eq=il.eq,Ko.escape=Ap.escape,Ko.escapeRegExp=Ap.escapeRegExp,Ko.every=Mo.every,Ko.find=Mo.find,Ko.findIndex=Wr.findIndex,Ko.findKey=Ac.findKey,Ko.findLast=Mo.findLast,Ko.findLastIndex=Wr.findLastIndex,Ko.findLastKey=Ac.findLastKey,Ko.floor=ml.floor,Ko.forEach=Mo.forEach,Ko.forEachRight=Mo.forEachRight,Ko.forIn=Ac.forIn,Ko.forInRight=Ac.forInRight,Ko.forOwn=Ac.forOwn,Ko.forOwnRight=Ac.forOwnRight,Ko.get=Ac.get,Ko.gt=il.gt,Ko.gte=il.gte,Ko.has=Ac.has,Ko.hasIn=Ac.hasIn,Ko.head=Wr.head,Ko.identity=$t,Ko.includes=Mo.includes,Ko.indexOf=Wr.indexOf,Ko.inRange=Ml.inRange,Ko.invoke=Ac.invoke,Ko.isArguments=il.isArguments,Ko.isArray=W,Ko.isArrayBuffer=il.isArrayBuffer,Ko.isArrayLike=il.isArrayLike,Ko.isArrayLikeObject=il.isArrayLikeObject,Ko.isBoolean=il.isBoolean,Ko.isBuffer=il.isBuffer,Ko.isDate=il.isDate,Ko.isElement=il.isElement,Ko.isEmpty=il.isEmpty,Ko.isEqual=il.isEqual,Ko.isEqualWith=il.isEqualWith,Ko.isError=il.isError,Ko.isFinite=il.isFinite,Ko.isFunction=il.isFunction,Ko.isInteger=il.isInteger,Ko.isLength=il.isLength,Ko.isMap=il.isMap,Ko.isMatch=il.isMatch,Ko.isMatchWith=il.isMatchWith,Ko.isNaN=il.isNaN,Ko.isNative=il.isNative,Ko.isNil=il.isNil,Ko.isNull=il.isNull,Ko.isNumber=il.isNumber,Ko.isObject=v,Ko.isObjectLike=il.isObjectLike,Ko.isPlainObject=il.isPlainObject,Ko.isRegExp=il.isRegExp,Ko.isSafeInteger=il.isSafeInteger,Ko.isSet=il.isSet,Ko.isString=il.isString,Ko.isSymbol=il.isSymbol,Ko.isTypedArray=il.isTypedArray,Ko.isUndefined=il.isUndefined,Ko.isWeakMap=il.isWeakMap,Ko.isWeakSet=il.isWeakSet,Ko.join=Wr.join,Ko.kebabCase=Ap.kebabCase,Ko.last=Ji,Ko.lastIndexOf=Wr.lastIndexOf,Ko.lowerCase=Ap.lowerCase,Ko.lowerFirst=Ap.lowerFirst,Ko.lt=il.lt,Ko.lte=il.lte,Ko.max=ml.max,Ko.maxBy=ml.maxBy,Ko.mean=ml.mean,Ko.meanBy=ml.meanBy,Ko.min=ml.min,Ko.minBy=ml.minBy,Ko.stubArray=cf.stubArray,Ko.stubFalse=cf.stubFalse,Ko.stubObject=cf.stubObject,Ko.stubString=cf.stubString,Ko.stubTrue=cf.stubTrue,Ko.multiply=ml.multiply,Ko.nth=Wr.nth,Ko.noop=cf.noop,Ko.now=Eo.now,Ko.pad=Ap.pad,Ko.padEnd=Ap.padEnd,Ko.padStart=Ap.padStart,Ko.parseInt=Ap.parseInt,Ko.random=Ml.random,Ko.reduce=Mo.reduce,Ko.reduceRight=Mo.reduceRight,Ko.repeat=Ap.repeat,Ko.replace=Ap.replace,Ko.result=Ac.result,Ko.round=ml.round,Ko.sample=Mo.sample,Ko.size=Mo.size,Ko.snakeCase=Ap.snakeCase,Ko.some=Mo.some,Ko.sortedIndex=Wr.sortedIndex,Ko.sortedIndexBy=Wr.sortedIndexBy,Ko.sortedIndexOf=Wr.sortedIndexOf,Ko.sortedLastIndex=Wr.sortedLastIndex,Ko.sortedLastIndexBy=Wr.sortedLastIndexBy,Ko.sortedLastIndexOf=Wr.sortedLastIndexOf,Ko.startCase=Ap.startCase,Ko.startsWith=Ap.startsWith,Ko.subtract=ml.subtract,Ko.sum=ml.sum,Ko.sumBy=ml.sumBy,Ko.template=Ap.template,Ko.times=cf.times,Ko.toFinite=il.toFinite,Ko.toInteger=k,Ko.toLength=il.toLength,Ko.toLower=Ap.toLower,Ko.toNumber=il.toNumber,Ko.toSafeInteger=il.toSafeInteger,Ko.toString=il.toString,Ko.toUpper=Ap.toUpper,Ko.trim=Ap.trim,Ko.trimEnd=Ap.trimEnd,Ko.trimStart=Ap.trimStart,Ko.truncate=Ap.truncate,Ko.unescape=Ap.unescape,Ko.uniqueId=cf.uniqueId,Ko.upperCase=Ap.upperCase,Ko.upperFirst=Ap.upperFirst,Ko.each=Mo.forEach,Ko.eachRight=Mo.forEachRight,Ko.first=Wr.head,Lf(Ko,(xf={},qr(Ko,(function(t,e){Tf.call(Ko.prototype,e)||(xf[e]=t)})),xf),{chain:!1}),Ko.VERSION="4.17.15",(Ko.templateSettings=Ap.templateSettings).imports._=Ko,es(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){Ko[t].placeholder=Ko})),es(["drop","take"],(function(t,e){jo.prototype[t]=function(i){i=void 0===i?1:Sf(k(i),0);var n=this.__filtered__&&!e?new jo(this):this.clone();return n.__filtered__?n.__takeCount__=Ef(i,n.__takeCount__):n.__views__.push({size:Ef(i,bf),type:t+(n.__dir__<0?"Right":"")}),n},jo.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),es(["filter","map","takeWhile"],(function(t,e){var i=e+1,n=1==i||3==i;jo.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:qi(t,3),type:i}),e.__filtered__=e.__filtered__||n,e}})),es(["head","last"],(function(t,e){var i="take"+(e?"Right":"");jo.prototype[t]=function(){return this[i](1).value()[0]}})),es(["initial","tail"],(function(t,e){var i="drop"+(e?"":"Right");jo.prototype[t]=function(){return this.__filtered__?new jo(this):this[i](1)}})),jo.prototype.compact=function(){return this.filter($t)},jo.prototype.find=function(t){return this.filter(t).head()},jo.prototype.findLast=function(t){return this.reverse().find(t)},jo.prototype.invokeMap=ue((function(t,e){return"function"==typeof t?new jo(this):this.map((function(i){return Ds(i,t,e)}))})),jo.prototype.reject=function(t){return this.filter(Hs(qi(t)))},jo.prototype.slice=function(t,e){t=k(t);var i=this;return i.__filtered__&&(t>0||e<0)?new jo(i):(t<0?i=i.takeRight(-t):t&&(i=i.drop(t)),void 0!==e&&(i=(e=k(e))<0?i.dropRight(-e):i.take(e-t)),i)},jo.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},jo.prototype.toArray=function(){return this.take(bf)},qr(jo.prototype,(function(t,e){var i=/^(?:filter|find|map|reject)|While$/.test(e),n=/^(?:head|last)$/.test(e),r=Ko[n?"take"+("last"==e?"Right":""):e],s=n||/^find/.test(e);r&&(Ko.prototype[e]=function(){var e=this.__wrapped__,o=n?[1]:arguments,a=e instanceof jo,h=o[0],u=a||W(e),l=function(t){var e=r.apply(Ko,N([t],o));return n&&c?e[0]:e};u&&i&&"function"==typeof h&&1!=h.length&&(a=u=!1);var c=this.__chain__,d=!!this.__actions__.length,p=s&&!c,f=a&&!d;if(!s&&u){e=f?e:new jo(this);var m=t.apply(e,o);return m.__actions__.push({func:Dc,args:[l],thisArg:void 0}),new Xo(m,c)}return p&&f?t.apply(this,o):(m=this.thru(l),p?n?m.value()[0]:m.value():m)})})),es(["pop","push","shift","sort","splice","unshift"],(function(t){var e=wf[t],i=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",n=/^(?:pop|shift)$/.test(t);Ko.prototype[t]=function(){var t=arguments;if(n&&!this.__chain__){var r=this.value();return e.apply(W(r)?r:[],t)}return this[i]((function(i){return e.apply(W(i)?i:[],t)}))}})),qr(jo.prototype,(function(t,e){var i=Ko[e];if(i){var n=i.name+"";Tf.call(zo,n)||(zo[n]=[]),zo[n].push({name:e,func:i})}})),zo[fa(void 0,2).name]=[{name:"wrapper",func:void 0}],jo.prototype.clone=df,jo.prototype.reverse=pf,jo.prototype.value=yf,Ko.prototype.at=Ic.at,Ko.prototype.chain=Ic.wrapperChain,Ko.prototype.commit=Ic.commit,Ko.prototype.next=Ic.next,Ko.prototype.plant=Ic.plant,Ko.prototype.reverse=Ic.reverse,Ko.prototype.toJSON=Ko.prototype.valueOf=Ko.prototype.value=Ic.value,Ko.prototype.first=Ko.prototype.head,Mf&&(Ko.prototype[Mf]=Ic.toIterator);const Af=Ko;var Df=i(75586),Pf=i.n(Df),Cf=i(57005),Of=i.n(Cf);void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t}),void 0===Math.sign&&(Math.sign=function(t){return t<0?-1:t>0?1:+t}),"name"in Function.prototype==!1&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),i=1;i<arguments.length;i++){var n=arguments[i];if(null!=n)for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e});var kf=100,Rf=306,If=1e3,Yf=1001,Ff=1002,Nf=1003,Bf=1004,Uf=1005,jf=1006,Hf=1008,zf=1009,Wf=1012,Gf=1014,Vf=1015,Xf=1016,qf=1020,Jf=1022,Zf=1023,Kf=1026,Qf=1027,$f=2300,tm=2301,em=2302,im=2400,nm=2401,rm=2402,sm=3e3,om=3001,am=3002,hm=7680,um=35044,lm=35048;function cm(){}Object.assign(cm.prototype,{addEventListener:function(t,e){void 0===this._listeners&&(this._listeners={});var i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)},hasEventListener:function(t,e){if(void 0===this._listeners)return!1;var i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)},removeEventListener:function(t,e){if(void 0!==this._listeners){var i=this._listeners[t];if(void 0!==i){var n=i.indexOf(e);-1!==n&&i.splice(n,1)}}},dispatchEvent:function(t){if(void 0!==this._listeners){var e=this._listeners[t.type];if(void 0!==e){t.target=this;for(var i=e.slice(0),n=0,r=i.length;n<r;n++)i[n].call(this,t)}}}});for(var dm=[],pm=0;pm<256;pm++)dm[pm]=(pm<16?"0":"")+pm.toString(16);var fm,mm={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,n=4294967295*Math.random()|0;return(dm[255&t]+dm[t>>8&255]+dm[t>>16&255]+dm[t>>24&255]+"-"+dm[255&e]+dm[e>>8&255]+"-"+dm[e>>16&15|64]+dm[e>>24&255]+"-"+dm[63&i|128]+dm[i>>8&255]+"-"+dm[i>>16&255]+dm[i>>24&255]+dm[255&n]+dm[n>>8&255]+dm[n>>16&255]+dm[n>>24&255]).toUpperCase()},clamp:function(t,e,i){return Math.max(e,Math.min(i,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,i,n,r){return n+(t-e)*(r-n)/(i-e)},lerp:function(t,e,i){return(1-i)*t+i*e},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},degToRad:function(t){return t*mm.DEG2RAD},radToDeg:function(t){return t*mm.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,n,r){var s=Math.cos,o=Math.sin,a=s(i/2),h=o(i/2),u=s((e+n)/2),l=o((e+n)/2),c=s((e-n)/2),d=o((e-n)/2),p=s((n-e)/2),f=o((n-e)/2);"XYX"===r?t.set(a*l,h*c,h*d,a*u):"YZY"===r?t.set(h*d,a*l,h*c,a*u):"ZXZ"===r?t.set(h*c,h*d,a*l,a*u):"XZX"===r?t.set(a*l,h*f,h*p,a*u):"YXY"===r?t.set(h*p,a*l,h*f,a*u):"ZYZ"===r?t.set(h*f,h*p,a*l,a*u):console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.")}};function vm(t,e){this.x=t||0,this.y=e||0}function gm(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}Object.defineProperties(vm.prototype,{width:{get:function(){return this.x},set:function(t){this.x=t}},height:{get:function(){return this.y},set:function(t){this.y=t}}}),Object.assign(vm.prototype,{isVector2:!0,set:function(t,e){return this.x=t,this.y=e,this},setScalar:function(t){return this.x=t,this.y=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(t){return this.x=t.x,this.y=t.y,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)},addScalar:function(t){return this.x+=t,this.y+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)},subScalar:function(t){return this.x-=t,this.y-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this},divide:function(t){return this.x/=t.x,this.y/=t.y,this},divideScalar:function(t){return this.multiplyScalar(1/t)},applyMatrix3:function(t){var e=this.x,i=this.y,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6],this.y=n[1]*e+n[4]*i+n[7],this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this},clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this},negate:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){return Math.atan2(-this.y,-this.x)+Math.PI},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this},rotateAround:function(t,e){var i=Math.cos(e),n=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*i-s*n+t.x,this.y=r*n+s*i+t.y,this}}),Object.assign(gm.prototype,{isMatrix3:!0,set:function(t,e,i,n,r,s,o,a,h){var u=this.elements;return u[0]=t,u[1]=n,u[2]=o,u[3]=e,u[4]=r,u[5]=a,u[6]=i,u[7]=s,u[8]=h,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(t){var e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this},extractBasis:function(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this},setFromMatrix4:function(t){var e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},multiply:function(t){return this.multiplyMatrices(this,t)},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var i=t.elements,n=e.elements,r=this.elements,s=i[0],o=i[3],a=i[6],h=i[1],u=i[4],l=i[7],c=i[2],d=i[5],p=i[8],f=n[0],m=n[3],v=n[6],g=n[1],y=n[4],_=n[7],x=n[2],b=n[5],w=n[8];return r[0]=s*f+o*g+a*x,r[3]=s*m+o*y+a*b,r[6]=s*v+o*_+a*w,r[1]=h*f+u*g+l*x,r[4]=h*m+u*y+l*b,r[7]=h*v+u*_+l*w,r[2]=c*f+d*g+p*x,r[5]=c*m+d*y+p*b,r[8]=c*v+d*_+p*w,this},multiplyScalar:function(t){var e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this},determinant:function(){var t=this.elements,e=t[0],i=t[1],n=t[2],r=t[3],s=t[4],o=t[5],a=t[6],h=t[7],u=t[8];return e*s*u-e*o*h-i*r*u+i*o*a+n*r*h-n*s*a},getInverse:function(t,e){void 0!==e&&console.warn("THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.");var i=t.elements,n=this.elements,r=i[0],s=i[1],o=i[2],a=i[3],h=i[4],u=i[5],l=i[6],c=i[7],d=i[8],p=d*h-u*c,f=u*l-d*a,m=c*a-h*l,v=r*p+s*f+o*m;if(0===v)return this.set(0,0,0,0,0,0,0,0,0);var g=1/v;return n[0]=p*g,n[1]=(o*c-d*s)*g,n[2]=(u*s-o*h)*g,n[3]=f*g,n[4]=(d*r-o*l)*g,n[5]=(o*a-u*r)*g,n[6]=m*g,n[7]=(s*l-c*r)*g,n[8]=(h*r-s*a)*g,this},transpose:function(){var t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this},getNormalMatrix:function(t){return this.setFromMatrix4(t).getInverse(this).transpose()},transposeIntoArray:function(t){var e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this},setUvTransform:function(t,e,i,n,r,s,o){var a=Math.cos(r),h=Math.sin(r);this.set(i*a,i*h,-i*(a*s+h*o)+s+t,-n*h,n*a,-n*(-h*s+a*o)+o+e,0,0,1)},scale:function(t,e){var i=this.elements;return i[0]*=t,i[3]*=t,i[6]*=t,i[1]*=e,i[4]*=e,i[7]*=e,this},rotate:function(t){var e=Math.cos(t),i=Math.sin(t),n=this.elements,r=n[0],s=n[3],o=n[6],a=n[1],h=n[4],u=n[7];return n[0]=e*r+i*a,n[3]=e*s+i*h,n[6]=e*o+i*u,n[1]=-i*r+e*a,n[4]=-i*s+e*h,n[7]=-i*o+e*u,this},translate:function(t,e){var i=this.elements;return i[0]+=t*i[2],i[3]+=t*i[5],i[6]+=t*i[8],i[1]+=e*i[2],i[4]+=e*i[5],i[7]+=e*i[8],this},equals:function(t){for(var e=this.elements,i=t.elements,n=0;n<9;n++)if(e[n]!==i[n])return!1;return!0},fromArray:function(t,e){void 0===e&&(e=0);for(var i=0;i<9;i++)this.elements[i]=t[i+e];return this},toArray:function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}});var ym={getDataURL:function(t){var e;if("undefined"==typeof HTMLCanvasElement)return t.src;if(t instanceof HTMLCanvasElement)e=t;else{void 0===fm&&(fm=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),fm.width=t.width,fm.height=t.height;var i=fm.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height),e=fm}return e.width>2048||e.height>2048?e.toDataURL("image/jpeg",.6):e.toDataURL("image/png")}},_m=0;function xm(t,e,i,n,r,s,o,a,h,u){Object.defineProperty(this,"id",{value:_m++}),this.uuid=mm.generateUUID(),this.name="",this.image=void 0!==t?t:xm.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==e?e:xm.DEFAULT_MAPPING,this.wrapS=void 0!==i?i:Yf,this.wrapT=void 0!==n?n:Yf,this.magFilter=void 0!==r?r:jf,this.minFilter=void 0!==s?s:Hf,this.anisotropy=void 0!==h?h:1,this.format=void 0!==o?o:Zf,this.internalFormat=null,this.type=void 0!==a?a:zf,this.offset=new vm(0,0),this.repeat=new vm(1,1),this.center=new vm(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new gm,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==u?u:sm,this.version=0,this.onUpdate=null}function bm(t,e,i,n){this.x=t||0,this.y=e||0,this.z=i||0,this.w=void 0!==n?n:1}function wm(t,e,i){this.width=t,this.height=e,this.scissor=new bm(0,0,t,e),this.scissorTest=!1,this.viewport=new bm(0,0,t,e),i=i||{},this.texture=new xm(void 0,i.mapping,i.wrapS,i.wrapT,i.magFilter,i.minFilter,i.format,i.type,i.anisotropy,i.encoding),this.texture.image={},this.texture.image.width=t,this.texture.image.height=e,this.texture.generateMipmaps=void 0!==i.generateMipmaps&&i.generateMipmaps,this.texture.minFilter=void 0!==i.minFilter?i.minFilter:jf,this.depthBuffer=void 0===i.depthBuffer||i.depthBuffer,this.stencilBuffer=void 0===i.stencilBuffer||i.stencilBuffer,this.depthTexture=void 0!==i.depthTexture?i.depthTexture:null}function Tm(t,e,i){wm.call(this,t,e,i),this.samples=4}function Mm(t,e,i,n){this._x=t||0,this._y=e||0,this._z=i||0,this._w=void 0!==n?n:1}xm.DEFAULT_IMAGE=void 0,xm.DEFAULT_MAPPING=300,xm.prototype=Object.assign(Object.create(cm.prototype),{constructor:xm,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this},toJSON:function(t){var e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];var i={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var n=this.image;if(void 0===n.uuid&&(n.uuid=mm.generateUUID()),!e&&void 0===t.images[n.uuid]){var r;if(Array.isArray(n)){r=[];for(var s=0,o=n.length;s<o;s++)r.push(ym.getDataURL(n[s]))}else r=ym.getDataURL(n);t.images[n.uuid]={uuid:n.uuid,url:r}}i.image=n.uuid}return e||(t.textures[this.uuid]=i),i},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case If:t.x=t.x-Math.floor(t.x);break;case Yf:t.x=t.x<0?0:1;break;case Ff:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case If:t.y=t.y-Math.floor(t.y);break;case Yf:t.y=t.y<0?0:1;break;case Ff:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}}),Object.defineProperty(xm.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.defineProperties(bm.prototype,{width:{get:function(){return this.z},set:function(t){this.z=t}},height:{get:function(){return this.w},set:function(t){this.w=t}}}),Object.assign(bm.prototype,{isVector4:!0,set:function(t,e,i,n){return this.x=t,this.y=e,this.z=i,this.w=n,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this.w=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setW:function(t){return this.w=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},applyMatrix4:function(t){var e=this.x,i=this.y,n=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*e+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*e+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*e+s[7]*i+s[11]*n+s[15]*r,this},divideScalar:function(t){return this.multiplyScalar(1/t)},setAxisAngleFromQuaternion:function(t){this.w=2*Math.acos(t.w);var e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this},setAxisAngleFromRotationMatrix:function(t){var e,i,n,r,s=.01,o=.1,a=t.elements,h=a[0],u=a[4],l=a[8],c=a[1],d=a[5],p=a[9],f=a[2],m=a[6],v=a[10];if(Math.abs(u-c)<s&&Math.abs(l-f)<s&&Math.abs(p-m)<s){if(Math.abs(u+c)<o&&Math.abs(l+f)<o&&Math.abs(p+m)<o&&Math.abs(h+d+v-3)<o)return this.set(1,0,0,0),this;e=Math.PI;var g=(h+1)/2,y=(d+1)/2,_=(v+1)/2,x=(u+c)/4,b=(l+f)/4,w=(p+m)/4;return g>y&&g>_?g<s?(i=0,n=.707106781,r=.707106781):(n=x/(i=Math.sqrt(g)),r=b/i):y>_?y<s?(i=.707106781,n=0,r=.707106781):(i=x/(n=Math.sqrt(y)),r=w/n):_<s?(i=.707106781,n=.707106781,r=0):(i=b/(r=Math.sqrt(_)),n=w/r),this.set(i,n,r,e),this}var T=Math.sqrt((m-p)*(m-p)+(l-f)*(l-f)+(c-u)*(c-u));return Math.abs(T)<.001&&(T=1),this.x=(m-p)/T,this.y=(l-f)/T,this.z=(c-u)/T,this.w=Math.acos((h+d+v-1)/2),this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this},clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}}),wm.prototype=Object.assign(Object.create(cm.prototype),{constructor:wm,isWebGLRenderTarget:!0,setSize:function(t,e){this.width===t&&this.height===e||(this.width=t,this.height=e,this.texture.image.width=t,this.texture.image.height=e,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.width=t.width,this.height=t.height,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Tm.prototype=Object.assign(Object.create(wm.prototype),{constructor:Tm,isWebGLMultisampleRenderTarget:!0,copy:function(t){return wm.prototype.copy.call(this,t),this.samples=t.samples,this}}),Object.assign(Mm,{slerp:function(t,e,i,n){return i.copy(t).slerp(e,n)},slerpFlat:function(t,e,i,n,r,s,o){var a=i[n+0],h=i[n+1],u=i[n+2],l=i[n+3],c=r[s+0],d=r[s+1],p=r[s+2],f=r[s+3];if(l!==f||a!==c||h!==d||u!==p){var m=1-o,v=a*c+h*d+u*p+l*f,g=v>=0?1:-1,y=1-v*v;if(y>Number.EPSILON){var _=Math.sqrt(y),x=Math.atan2(_,v*g);m=Math.sin(m*x)/_,o=Math.sin(o*x)/_}var b=o*g;if(a=a*m+c*b,h=h*m+d*b,u=u*m+p*b,l=l*m+f*b,m===1-o){var w=1/Math.sqrt(a*a+h*h+u*u+l*l);a*=w,h*=w,u*=w,l*=w}}t[e]=a,t[e+1]=h,t[e+2]=u,t[e+3]=l}}),Object.defineProperties(Mm.prototype,{x:{get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},w:{get:function(){return this._w},set:function(t){this._w=t,this._onChangeCallback()}}}),Object.assign(Mm.prototype,{isQuaternion:!0,set:function(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._w=n,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this},setFromEuler:function(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var i=t._x,n=t._y,r=t._z,s=t.order,o=Math.cos,a=Math.sin,h=o(i/2),u=o(n/2),l=o(r/2),c=a(i/2),d=a(n/2),p=a(r/2);return"XYZ"===s?(this._x=c*u*l+h*d*p,this._y=h*d*l-c*u*p,this._z=h*u*p+c*d*l,this._w=h*u*l-c*d*p):"YXZ"===s?(this._x=c*u*l+h*d*p,this._y=h*d*l-c*u*p,this._z=h*u*p-c*d*l,this._w=h*u*l+c*d*p):"ZXY"===s?(this._x=c*u*l-h*d*p,this._y=h*d*l+c*u*p,this._z=h*u*p+c*d*l,this._w=h*u*l-c*d*p):"ZYX"===s?(this._x=c*u*l-h*d*p,this._y=h*d*l+c*u*p,this._z=h*u*p-c*d*l,this._w=h*u*l+c*d*p):"YZX"===s?(this._x=c*u*l+h*d*p,this._y=h*d*l+c*u*p,this._z=h*u*p-c*d*l,this._w=h*u*l-c*d*p):"XZY"===s&&(this._x=c*u*l-h*d*p,this._y=h*d*l-c*u*p,this._z=h*u*p+c*d*l,this._w=h*u*l+c*d*p),!1!==e&&this._onChangeCallback(),this},setFromAxisAngle:function(t,e){var i=e/2,n=Math.sin(i);return this._x=t.x*n,this._y=t.y*n,this._z=t.z*n,this._w=Math.cos(i),this._onChangeCallback(),this},setFromRotationMatrix:function(t){var e,i=t.elements,n=i[0],r=i[4],s=i[8],o=i[1],a=i[5],h=i[9],u=i[2],l=i[6],c=i[10],d=n+a+c;return d>0?(e=.5/Math.sqrt(d+1),this._w=.25/e,this._x=(l-h)*e,this._y=(s-u)*e,this._z=(o-r)*e):n>a&&n>c?(e=2*Math.sqrt(1+n-a-c),this._w=(l-h)/e,this._x=.25*e,this._y=(r+o)/e,this._z=(s+u)/e):a>c?(e=2*Math.sqrt(1+a-n-c),this._w=(s-u)/e,this._x=(r+o)/e,this._y=.25*e,this._z=(h+l)/e):(e=2*Math.sqrt(1+c-n-a),this._w=(o-r)/e,this._x=(s+u)/e,this._y=(h+l)/e,this._z=.25*e),this._onChangeCallback(),this},setFromUnitVectors:function(t,e){var i=t.dot(e)+1;return i<1e-6?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()},angleTo:function(t){return 2*Math.acos(Math.abs(mm.clamp(this.dot(t),-1,1)))},rotateTowards:function(t,e){var i=this.angleTo(t);if(0===i)return this;var n=Math.min(1,e/i);return this.slerp(t,n),this},inverse:function(){return this.conjugate()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},dot:function(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)},premultiply:function(t){return this.multiplyQuaternions(t,this)},multiplyQuaternions:function(t,e){var i=t._x,n=t._y,r=t._z,s=t._w,o=e._x,a=e._y,h=e._z,u=e._w;return this._x=i*u+s*o+n*h-r*a,this._y=n*u+s*a+r*o-i*h,this._z=r*u+s*h+i*a-n*o,this._w=s*u-i*o-n*a-r*h,this._onChangeCallback(),this},slerp:function(t,e){if(0===e)return this;if(1===e)return this.copy(t);var i=this._x,n=this._y,r=this._z,s=this._w,o=s*t._w+i*t._x+n*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;var a=1-o*o;if(a<=Number.EPSILON){var h=1-e;return this._w=h*s+e*this._w,this._x=h*i+e*this._x,this._y=h*n+e*this._y,this._z=h*r+e*this._z,this.normalize(),this._onChangeCallback(),this}var u=Math.sqrt(a),l=Math.atan2(u,o),c=Math.sin((1-e)*l)/u,d=Math.sin(e*l)/u;return this._w=s*c+this._w*d,this._x=i*c+this._x*d,this._y=n*c+this._y*d,this._z=r*c+this._z*d,this._onChangeCallback(),this},equals:function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w},fromArray:function(t,e){return void 0===e&&(e=0),this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t},fromBufferAttribute:function(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this},_onChange:function(t){return this._onChangeCallback=t,this},_onChangeCallback:function(){}});var Sm=new Lm,Em=new Mm;function Lm(t,e,i){this.x=t||0,this.y=e||0,this.z=i||0}Object.assign(Lm.prototype,{isVector3:!0,set:function(t,e,i){return this.x=t,this.y=e,this.z=i,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this},multiplyVectors:function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},applyEuler:function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Em.setFromEuler(t))},applyAxisAngle:function(t,e){return this.applyQuaternion(Em.setFromAxisAngle(t,e))},applyMatrix3:function(t){var e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*n,this.y=r[1]*e+r[4]*i+r[7]*n,this.z=r[2]*e+r[5]*i+r[8]*n,this},applyNormalMatrix:function(t){return this.applyMatrix3(t).normalize()},applyMatrix4:function(t){var e=this.x,i=this.y,n=this.z,r=t.elements,s=1/(r[3]*e+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*e+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*e+r[6]*i+r[10]*n+r[14])*s,this},applyQuaternion:function(t){var e=this.x,i=this.y,n=this.z,r=t.x,s=t.y,o=t.z,a=t.w,h=a*e+s*n-o*i,u=a*i+o*e-r*n,l=a*n+r*i-s*e,c=-r*e-s*i-o*n;return this.x=h*a+c*-r+u*-o-l*-s,this.y=u*a+c*-s+l*-r-h*-o,this.z=l*a+c*-o+h*-s-u*-r,this},project:function(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)},unproject:function(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)},transformDirection:function(t){var e=this.x,i=this.y,n=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*n,this.y=r[1]*e+r[5]*i+r[9]*n,this.z=r[2]*e+r[6]*i+r[10]*n,this.normalize()},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},divideScalar:function(t){return this.multiplyScalar(1/t)},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this},clampScalar:function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this},clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},negate:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},cross:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)},crossVectors:function(t,e){var i=t.x,n=t.y,r=t.z,s=e.x,o=e.y,a=e.z;return this.x=n*a-r*o,this.y=r*s-i*a,this.z=i*o-n*s,this},projectOnVector:function(t){var e=t.lengthSq();if(0===e)return this.set(0,0,0);var i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)},projectOnPlane:function(t){return Sm.copy(this).projectOnVector(t),this.sub(Sm)},reflect:function(t){return this.sub(Sm.copy(t).multiplyScalar(2*this.dot(t)))},angleTo:function(t){var e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;var i=this.dot(t)/e;return Math.acos(mm.clamp(i,-1,1))},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,i=this.y-t.y,n=this.z-t.z;return e*e+i*i+n*n},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)},setFromSpherical:function(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)},setFromSphericalCoords:function(t,e,i){var n=Math.sin(e)*t;return this.x=n*Math.sin(i),this.y=Math.cos(e)*t,this.z=n*Math.cos(i),this},setFromCylindrical:function(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)},setFromCylindricalCoords:function(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this},setFromMatrixPosition:function(t){var e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this},setFromMatrixScale:function(t){var e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),n=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=n,this},setFromMatrixColumn:function(t,e){return this.fromArray(t.elements,4*e)},setFromMatrix3Column:function(t,e){return this.fromArray(t.elements,3*e)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}});var Am=new Lm,Dm=new Im,Pm=new Lm(0,0,0),Cm=new Lm(1,1,1),Om=new Lm,km=new Lm,Rm=new Lm;function Im(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}Object.assign(Im.prototype,{isMatrix4:!0,set:function(t,e,i,n,r,s,o,a,h,u,l,c,d,p,f,m){var v=this.elements;return v[0]=t,v[4]=e,v[8]=i,v[12]=n,v[1]=r,v[5]=s,v[9]=o,v[13]=a,v[2]=h,v[6]=u,v[10]=l,v[14]=c,v[3]=d,v[7]=p,v[11]=f,v[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new Im).fromArray(this.elements)},copy:function(t){var e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this},copyPosition:function(t){var e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this},extractBasis:function(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this},makeBasis:function(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this},extractRotation:function(t){var e=this.elements,i=t.elements,n=1/Am.setFromMatrixColumn(t,0).length(),r=1/Am.setFromMatrixColumn(t,1).length(),s=1/Am.setFromMatrixColumn(t,2).length();return e[0]=i[0]*n,e[1]=i[1]*n,e[2]=i[2]*n,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*s,e[9]=i[9]*s,e[10]=i[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},makeRotationFromEuler:function(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var e=this.elements,i=t.x,n=t.y,r=t.z,s=Math.cos(i),o=Math.sin(i),a=Math.cos(n),h=Math.sin(n),u=Math.cos(r),l=Math.sin(r);if("XYZ"===t.order){var c=s*u,d=s*l,p=o*u,f=o*l;e[0]=a*u,e[4]=-a*l,e[8]=h,e[1]=d+p*h,e[5]=c-f*h,e[9]=-o*a,e[2]=f-c*h,e[6]=p+d*h,e[10]=s*a}else if("YXZ"===t.order){var m=a*u,v=a*l,g=h*u,y=h*l;e[0]=m+y*o,e[4]=g*o-v,e[8]=s*h,e[1]=s*l,e[5]=s*u,e[9]=-o,e[2]=v*o-g,e[6]=y+m*o,e[10]=s*a}else if("ZXY"===t.order){m=a*u,v=a*l,g=h*u,y=h*l;e[0]=m-y*o,e[4]=-s*l,e[8]=g+v*o,e[1]=v+g*o,e[5]=s*u,e[9]=y-m*o,e[2]=-s*h,e[6]=o,e[10]=s*a}else if("ZYX"===t.order){c=s*u,d=s*l,p=o*u,f=o*l;e[0]=a*u,e[4]=p*h-d,e[8]=c*h+f,e[1]=a*l,e[5]=f*h+c,e[9]=d*h-p,e[2]=-h,e[6]=o*a,e[10]=s*a}else if("YZX"===t.order){var _=s*a,x=s*h,b=o*a,w=o*h;e[0]=a*u,e[4]=w-_*l,e[8]=b*l+x,e[1]=l,e[5]=s*u,e[9]=-o*u,e[2]=-h*u,e[6]=x*l+b,e[10]=_-w*l}else if("XZY"===t.order){_=s*a,x=s*h,b=o*a,w=o*h;e[0]=a*u,e[4]=-l,e[8]=h*u,e[1]=_*l+w,e[5]=s*u,e[9]=x*l-b,e[2]=b*l-x,e[6]=o*u,e[10]=w*l+_}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},makeRotationFromQuaternion:function(t){return this.compose(Pm,t,Cm)},lookAt:function(t,e,i){var n=this.elements;return Rm.subVectors(t,e),0===Rm.lengthSq()&&(Rm.z=1),Rm.normalize(),Om.crossVectors(i,Rm),0===Om.lengthSq()&&(1===Math.abs(i.z)?Rm.x+=1e-4:Rm.z+=1e-4,Rm.normalize(),Om.crossVectors(i,Rm)),Om.normalize(),km.crossVectors(Rm,Om),n[0]=Om.x,n[4]=km.x,n[8]=Rm.x,n[1]=Om.y,n[5]=km.y,n[9]=Rm.y,n[2]=Om.z,n[6]=km.z,n[10]=Rm.z,this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var i=t.elements,n=e.elements,r=this.elements,s=i[0],o=i[4],a=i[8],h=i[12],u=i[1],l=i[5],c=i[9],d=i[13],p=i[2],f=i[6],m=i[10],v=i[14],g=i[3],y=i[7],_=i[11],x=i[15],b=n[0],w=n[4],T=n[8],M=n[12],S=n[1],E=n[5],L=n[9],A=n[13],D=n[2],P=n[6],C=n[10],O=n[14],k=n[3],R=n[7],I=n[11],Y=n[15];return r[0]=s*b+o*S+a*D+h*k,r[4]=s*w+o*E+a*P+h*R,r[8]=s*T+o*L+a*C+h*I,r[12]=s*M+o*A+a*O+h*Y,r[1]=u*b+l*S+c*D+d*k,r[5]=u*w+l*E+c*P+d*R,r[9]=u*T+l*L+c*C+d*I,r[13]=u*M+l*A+c*O+d*Y,r[2]=p*b+f*S+m*D+v*k,r[6]=p*w+f*E+m*P+v*R,r[10]=p*T+f*L+m*C+v*I,r[14]=p*M+f*A+m*O+v*Y,r[3]=g*b+y*S+_*D+x*k,r[7]=g*w+y*E+_*P+x*R,r[11]=g*T+y*L+_*C+x*I,r[15]=g*M+y*A+_*O+x*Y,this},multiplyScalar:function(t){var e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this},determinant:function(){var t=this.elements,e=t[0],i=t[4],n=t[8],r=t[12],s=t[1],o=t[5],a=t[9],h=t[13],u=t[2],l=t[6],c=t[10],d=t[14];return t[3]*(+r*a*l-n*h*l-r*o*c+i*h*c+n*o*d-i*a*d)+t[7]*(+e*a*d-e*h*c+r*s*c-n*s*d+n*h*u-r*a*u)+t[11]*(+e*h*l-e*o*d-r*s*l+i*s*d+r*o*u-i*h*u)+t[15]*(-n*o*u-e*a*l+e*o*c+n*s*l-i*s*c+i*a*u)},transpose:function(){var t,e=this.elements;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this},setPosition:function(t,e,i){var n=this.elements;return t.isVector3?(n[12]=t.x,n[13]=t.y,n[14]=t.z):(n[12]=t,n[13]=e,n[14]=i),this},getInverse:function(t,e){void 0!==e&&console.warn("THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.");var i=this.elements,n=t.elements,r=n[0],s=n[1],o=n[2],a=n[3],h=n[4],u=n[5],l=n[6],c=n[7],d=n[8],p=n[9],f=n[10],m=n[11],v=n[12],g=n[13],y=n[14],_=n[15],x=p*y*c-g*f*c+g*l*m-u*y*m-p*l*_+u*f*_,b=v*f*c-d*y*c-v*l*m+h*y*m+d*l*_-h*f*_,w=d*g*c-v*p*c+v*u*m-h*g*m-d*u*_+h*p*_,T=v*p*l-d*g*l-v*u*f+h*g*f+d*u*y-h*p*y,M=r*x+s*b+o*w+a*T;if(0===M)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);var S=1/M;return i[0]=x*S,i[1]=(g*f*a-p*y*a-g*o*m+s*y*m+p*o*_-s*f*_)*S,i[2]=(u*y*a-g*l*a+g*o*c-s*y*c-u*o*_+s*l*_)*S,i[3]=(p*l*a-u*f*a-p*o*c+s*f*c+u*o*m-s*l*m)*S,i[4]=b*S,i[5]=(d*y*a-v*f*a+v*o*m-r*y*m-d*o*_+r*f*_)*S,i[6]=(v*l*a-h*y*a-v*o*c+r*y*c+h*o*_-r*l*_)*S,i[7]=(h*f*a-d*l*a+d*o*c-r*f*c-h*o*m+r*l*m)*S,i[8]=w*S,i[9]=(v*p*a-d*g*a-v*s*m+r*g*m+d*s*_-r*p*_)*S,i[10]=(h*g*a-v*u*a+v*s*c-r*g*c-h*s*_+r*u*_)*S,i[11]=(d*u*a-h*p*a-d*s*c+r*p*c+h*s*m-r*u*m)*S,i[12]=T*S,i[13]=(d*g*o-v*p*o+v*s*f-r*g*f-d*s*y+r*p*y)*S,i[14]=(v*u*o-h*g*o-v*s*l+r*g*l+h*s*y-r*u*y)*S,i[15]=(h*p*o-d*u*o+d*s*l-r*p*l-h*s*f+r*u*f)*S,this},scale:function(t){var e=this.elements,i=t.x,n=t.y,r=t.z;return e[0]*=i,e[4]*=n,e[8]*=r,e[1]*=i,e[5]*=n,e[9]*=r,e[2]*=i,e[6]*=n,e[10]*=r,e[3]*=i,e[7]*=n,e[11]*=r,this},getMaxScaleOnAxis:function(){var t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],n=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,n))},makeTranslation:function(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this},makeRotationX:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this},makeRotationY:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this},makeRotationZ:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(t,e){var i=Math.cos(e),n=Math.sin(e),r=1-i,s=t.x,o=t.y,a=t.z,h=r*s,u=r*o;return this.set(h*s+i,h*o-n*a,h*a+n*o,0,h*o+n*a,u*o+i,u*a-n*s,0,h*a-n*o,u*a+n*s,r*a*a+i,0,0,0,0,1),this},makeScale:function(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this},makeShear:function(t,e,i){return this.set(1,e,i,0,t,1,i,0,t,e,1,0,0,0,0,1),this},compose:function(t,e,i){var n=this.elements,r=e._x,s=e._y,o=e._z,a=e._w,h=r+r,u=s+s,l=o+o,c=r*h,d=r*u,p=r*l,f=s*u,m=s*l,v=o*l,g=a*h,y=a*u,_=a*l,x=i.x,b=i.y,w=i.z;return n[0]=(1-(f+v))*x,n[1]=(d+_)*x,n[2]=(p-y)*x,n[3]=0,n[4]=(d-_)*b,n[5]=(1-(c+v))*b,n[6]=(m+g)*b,n[7]=0,n[8]=(p+y)*w,n[9]=(m-g)*w,n[10]=(1-(c+f))*w,n[11]=0,n[12]=t.x,n[13]=t.y,n[14]=t.z,n[15]=1,this},decompose:function(t,e,i){var n=this.elements,r=Am.set(n[0],n[1],n[2]).length(),s=Am.set(n[4],n[5],n[6]).length(),o=Am.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),t.x=n[12],t.y=n[13],t.z=n[14],Dm.copy(this);var a=1/r,h=1/s,u=1/o;return Dm.elements[0]*=a,Dm.elements[1]*=a,Dm.elements[2]*=a,Dm.elements[4]*=h,Dm.elements[5]*=h,Dm.elements[6]*=h,Dm.elements[8]*=u,Dm.elements[9]*=u,Dm.elements[10]*=u,e.setFromRotationMatrix(Dm),i.x=r,i.y=s,i.z=o,this},makePerspective:function(t,e,i,n,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var o=this.elements,a=2*r/(e-t),h=2*r/(i-n),u=(e+t)/(e-t),l=(i+n)/(i-n),c=-(s+r)/(s-r),d=-2*s*r/(s-r);return o[0]=a,o[4]=0,o[8]=u,o[12]=0,o[1]=0,o[5]=h,o[9]=l,o[13]=0,o[2]=0,o[6]=0,o[10]=c,o[14]=d,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this},makeOrthographic:function(t,e,i,n,r,s){var o=this.elements,a=1/(e-t),h=1/(i-n),u=1/(s-r),l=(e+t)*a,c=(i+n)*h,d=(s+r)*u;return o[0]=2*a,o[4]=0,o[8]=0,o[12]=-l,o[1]=0,o[5]=2*h,o[9]=0,o[13]=-c,o[2]=0,o[6]=0,o[10]=-2*u,o[14]=-d,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this},equals:function(t){for(var e=this.elements,i=t.elements,n=0;n<16;n++)if(e[n]!==i[n])return!1;return!0},fromArray:function(t,e){void 0===e&&(e=0);for(var i=0;i<16;i++)this.elements[i]=t[i+e];return this},toArray:function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}});var Ym=new Im,Fm=new Mm;function Nm(t,e,i,n){this._x=t||0,this._y=e||0,this._z=i||0,this._order=n||Nm.DefaultOrder}function Bm(){this.mask=1}Nm.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],Nm.DefaultOrder="XYZ",Object.defineProperties(Nm.prototype,{x:{get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},y:{get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},z:{get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},order:{get:function(){return this._order},set:function(t){this._order=t,this._onChangeCallback()}}}),Object.assign(Nm.prototype,{isEuler:!0,set:function(t,e,i,n){return this._x=t,this._y=e,this._z=i,this._order=n||this._order,this._onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this},setFromRotationMatrix:function(t,e,i){var n=mm.clamp,r=t.elements,s=r[0],o=r[4],a=r[8],h=r[1],u=r[5],l=r[9],c=r[2],d=r[6],p=r[10];return"XYZ"===(e=e||this._order)?(this._y=Math.asin(n(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,p),this._z=Math.atan2(-o,s)):(this._x=Math.atan2(d,u),this._z=0)):"YXZ"===e?(this._x=Math.asin(-n(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,p),this._z=Math.atan2(h,u)):(this._y=Math.atan2(-c,s),this._z=0)):"ZXY"===e?(this._x=Math.asin(n(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-c,p),this._z=Math.atan2(-o,u)):(this._y=0,this._z=Math.atan2(h,s))):"ZYX"===e?(this._y=Math.asin(-n(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(h,s)):(this._x=0,this._z=Math.atan2(-o,u))):"YZX"===e?(this._z=Math.asin(n(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(-l,u),this._y=Math.atan2(-c,s)):(this._x=0,this._y=Math.atan2(a,p))):"XZY"===e?(this._z=Math.asin(-n(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,u),this._y=Math.atan2(a,s)):(this._x=Math.atan2(-l,p),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+e),this._order=e,!1!==i&&this._onChangeCallback(),this},setFromQuaternion:function(t,e,i){return Ym.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Ym,e,i)},setFromVector3:function(t,e){return this.set(t.x,t.y,t.z,e||this._order)},reorder:function(t){return Fm.setFromEuler(this),this.setFromQuaternion(Fm,t)},equals:function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order},fromArray:function(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t},toVector3:function(t){return t?t.set(this._x,this._y,this._z):new Lm(this._x,this._y,this._z)},_onChange:function(t){return this._onChangeCallback=t,this},_onChangeCallback:function(){}}),Object.assign(Bm.prototype,{set:function(t){this.mask=1<<t|0},enable:function(t){this.mask|=1<<t|0},enableAll:function(){this.mask=-1},toggle:function(t){this.mask^=1<<t|0},disable:function(t){this.mask&=~(1<<t|0)},disableAll:function(){this.mask=0},test:function(t){return 0!=(this.mask&t.mask)}});var Um=0,jm=new Lm,Hm=new Mm,zm=new Im,Wm=new Lm,Gm=new Lm,Vm=new Lm,Xm=new Mm,qm=new Lm(1,0,0),Jm=new Lm(0,1,0),Zm=new Lm(0,0,1),Km={type:"added"},Qm={type:"removed"};function $m(){Object.defineProperty(this,"id",{value:Um++}),this.uuid=mm.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=$m.DefaultUp.clone();var t=new Lm,e=new Nm,i=new Mm,n=new Lm(1,1,1);e._onChange((function(){i.setFromEuler(e,!1)})),i._onChange((function(){e.setFromQuaternion(i,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:i},scale:{configurable:!0,enumerable:!0,value:n},modelViewMatrix:{value:new Im},normalMatrix:{value:new gm}}),this.matrix=new Im,this.matrixWorld=new Im,this.matrixAutoUpdate=$m.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Bm,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}}function tv(){$m.call(this),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}$m.DefaultUp=new Lm(0,1,0),$m.DefaultMatrixAutoUpdate=!0,$m.prototype=Object.assign(Object.create(cm.prototype),{constructor:$m,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix4:function(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(t){return this.quaternion.premultiply(t),this},setRotationFromAxisAngle:function(t,e){this.quaternion.setFromAxisAngle(t,e)},setRotationFromEuler:function(t){this.quaternion.setFromEuler(t,!0)},setRotationFromMatrix:function(t){this.quaternion.setFromRotationMatrix(t)},setRotationFromQuaternion:function(t){this.quaternion.copy(t)},rotateOnAxis:function(t,e){return Hm.setFromAxisAngle(t,e),this.quaternion.multiply(Hm),this},rotateOnWorldAxis:function(t,e){return Hm.setFromAxisAngle(t,e),this.quaternion.premultiply(Hm),this},rotateX:function(t){return this.rotateOnAxis(qm,t)},rotateY:function(t){return this.rotateOnAxis(Jm,t)},rotateZ:function(t){return this.rotateOnAxis(Zm,t)},translateOnAxis:function(t,e){return jm.copy(t).applyQuaternion(this.quaternion),this.position.add(jm.multiplyScalar(e)),this},translateX:function(t){return this.translateOnAxis(qm,t)},translateY:function(t){return this.translateOnAxis(Jm,t)},translateZ:function(t){return this.translateOnAxis(Zm,t)},localToWorld:function(t){return t.applyMatrix4(this.matrixWorld)},worldToLocal:function(t){return t.applyMatrix4(zm.getInverse(this.matrixWorld))},lookAt:function(t,e,i){t.isVector3?Wm.copy(t):Wm.set(t,e,i);var n=this.parent;this.updateWorldMatrix(!0,!1),Gm.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?zm.lookAt(Gm,Wm,this.up):zm.lookAt(Wm,Gm,this.up),this.quaternion.setFromRotationMatrix(zm),n&&(zm.extractRotation(n.matrixWorld),Hm.setFromRotationMatrix(zm),this.quaternion.premultiply(Hm.inverse()))},add:function(t){if(arguments.length>1){for(var e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return t===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",t),this):(t&&t.isObject3D?(null!==t.parent&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(Km)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",t),this)},remove:function(t){if(arguments.length>1){for(var e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}var i=this.children.indexOf(t);return-1!==i&&(t.parent=null,this.children.splice(i,1),t.dispatchEvent(Qm)),this},attach:function(t){return this.updateWorldMatrix(!0,!1),zm.getInverse(this.matrixWorld),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),zm.multiply(t.parent.matrixWorld)),t.applyMatrix4(zm),t.updateWorldMatrix(!1,!1),this.add(t),this},getObjectById:function(t){return this.getObjectByProperty("id",t)},getObjectByName:function(t){return this.getObjectByProperty("name",t)},getObjectByProperty:function(t,e){if(this[t]===e)return this;for(var i=0,n=this.children.length;i<n;i++){var r=this.children[i].getObjectByProperty(t,e);if(void 0!==r)return r}},getWorldPosition:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),t=new Lm),this.updateMatrixWorld(!0),t.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),t=new Mm),this.updateMatrixWorld(!0),this.matrixWorld.decompose(Gm,t,Vm),t},getWorldScale:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),t=new Lm),this.updateMatrixWorld(!0),this.matrixWorld.decompose(Gm,Xm,t),t},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),t=new Lm),this.updateMatrixWorld(!0);var e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()},raycast:function(){},traverse:function(t){t(this);for(var e=this.children,i=0,n=e.length;i<n;i++)e[i].traverse(t)},traverseVisible:function(t){if(!1!==this.visible){t(this);for(var e=this.children,i=0,n=e.length;i<n;i++)e[i].traverseVisible(t)}},traverseAncestors:function(t){var e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);for(var e=this.children,i=0,n=e.length;i<n;i++)e[i].updateMatrixWorld(t)},updateWorldMatrix:function(t,e){var i=this.parent;if(!0===t&&null!==i&&i.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===e)for(var n=this.children,r=0,s=n.length;r<s;r++)n[r].updateWorldMatrix(!1,!0)},toJSON:function(t){var e=void 0===t||"string"==typeof t,i={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var n={};function r(e,i){return void 0===e[i.uuid]&&(e[i.uuid]=i.toJSON(t)),i.uuid}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),!0===this.castShadow&&(n.castShadow=!0),!0===this.receiveShadow&&(n.receiveShadow=!0),!1===this.visible&&(n.visible=!1),!1===this.frustumCulled&&(n.frustumCulled=!1),0!==this.renderOrder&&(n.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON()),this.isMesh||this.isLine||this.isPoints){n.geometry=r(t.geometries,this.geometry);var s=this.geometry.parameters;if(void 0!==s&&void 0!==s.shapes){var o=s.shapes;if(Array.isArray(o))for(var a=0,h=o.length;a<h;a++){var u=o[a];r(t.shapes,u)}else r(t.shapes,o)}}if(void 0!==this.material)if(Array.isArray(this.material)){var l=[];for(a=0,h=this.material.length;a<h;a++)l.push(r(t.materials,this.material[a]));n.material=l}else n.material=r(t.materials,this.material);if(this.children.length>0){n.children=[];for(a=0;a<this.children.length;a++)n.children.push(this.children[a].toJSON(t).object)}if(e){var c=m(t.geometries),d=m(t.materials),p=m(t.textures),f=m(t.images);o=m(t.shapes);c.length>0&&(i.geometries=c),d.length>0&&(i.materials=d),p.length>0&&(i.textures=p),f.length>0&&(i.images=f),o.length>0&&(i.shapes=o)}return i.object=n,i;function m(t){var e=[];for(var i in t){var n=t[i];delete n.metadata,e.push(n)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e){if(void 0===e&&(e=!0),this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(var i=0;i<t.children.length;i++){var n=t.children[i];this.add(n.clone())}return this}}),tv.prototype=Object.assign(Object.create($m.prototype),{constructor:tv,isScene:!0,copy:function(t,e){return $m.prototype.copy.call(this,t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this},toJSON:function(t){var e=$m.prototype.toJSON.call(this,t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e},dispose:function(){this.dispatchEvent({type:"dispose"})}});var ev=[new Lm,new Lm,new Lm,new Lm,new Lm,new Lm,new Lm,new Lm],iv=new Lm,nv=new fv,rv=new Lm,sv=new Lm,ov=new Lm,av=new Lm,hv=new Lm,uv=new Lm,lv=new Lm,cv=new Lm,dv=new Lm,pv=new Lm;function fv(t,e){this.min=void 0!==t?t:new Lm(1/0,1/0,1/0),this.max=void 0!==e?e:new Lm(-1/0,-1/0,-1/0)}function mv(t,e,i,n,r){var s,o;for(s=0,o=t.length-3;s<=o;s+=3){pv.fromArray(t,s);var a=r.x*Math.abs(pv.x)+r.y*Math.abs(pv.y)+r.z*Math.abs(pv.z),h=e.dot(pv),u=i.dot(pv),l=n.dot(pv);if(Math.max(-Math.max(h,u,l),Math.min(h,u,l))>a)return!1}return!0}Object.assign(fv.prototype,{isBox3:!0,set:function(t,e){return this.min.copy(t),this.max.copy(e),this},setFromArray:function(t){for(var e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,o=-1/0,a=0,h=t.length;a<h;a+=3){var u=t[a],l=t[a+1],c=t[a+2];u<e&&(e=u),l<i&&(i=l),c<n&&(n=c),u>r&&(r=u),l>s&&(s=l),c>o&&(o=c)}return this.min.set(e,i,n),this.max.set(r,s,o),this},setFromBufferAttribute:function(t){for(var e=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,o=-1/0,a=0,h=t.count;a<h;a++){var u=t.getX(a),l=t.getY(a),c=t.getZ(a);u<e&&(e=u),l<i&&(i=l),c<n&&(n=c),u>r&&(r=u),l>s&&(s=l),c>o&&(o=c)}return this.min.set(e,i,n),this.max.set(r,s,o),this},setFromPoints:function(t){this.makeEmpty();for(var e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this},setFromCenterAndSize:function(t,e){var i=iv.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this},setFromObject:function(t){return this.makeEmpty(),this.expandByObject(t)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.min.copy(t.min),this.max.copy(t.max),this},makeEmpty:function(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(t){return void 0===t&&(console.warn("THREE.Box3: .getCenter() target is now required"),t=new Lm),this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(t){return void 0===t&&(console.warn("THREE.Box3: .getSize() target is now required"),t=new Lm),this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)},expandByPoint:function(t){return this.min.min(t),this.max.max(t),this},expandByVector:function(t){return this.min.sub(t),this.max.add(t),this},expandByScalar:function(t){return this.min.addScalar(-t),this.max.addScalar(t),this},expandByObject:function(t){t.updateWorldMatrix(!1,!1);var e=t.geometry;void 0!==e&&(null===e.boundingBox&&e.computeBoundingBox(),nv.copy(e.boundingBox),nv.applyMatrix4(t.matrixWorld),this.union(nv));for(var i=t.children,n=0,r=i.length;n<r;n++)this.expandByObject(i[n]);return this},containsPoint:function(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Lm),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)},intersectsSphere:function(t){return this.clampPoint(t.center,iv),iv.distanceToSquared(t.center)<=t.radius*t.radius},intersectsPlane:function(t){var e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant},intersectsTriangle:function(t){if(this.isEmpty())return!1;this.getCenter(lv),cv.subVectors(this.max,lv),rv.subVectors(t.a,lv),sv.subVectors(t.b,lv),ov.subVectors(t.c,lv),av.subVectors(sv,rv),hv.subVectors(ov,sv),uv.subVectors(rv,ov);var e=[0,-av.z,av.y,0,-hv.z,hv.y,0,-uv.z,uv.y,av.z,0,-av.x,hv.z,0,-hv.x,uv.z,0,-uv.x,-av.y,av.x,0,-hv.y,hv.x,0,-uv.y,uv.x,0];return!!mv(e,rv,sv,ov,cv)&&(!!mv(e=[1,0,0,0,1,0,0,0,1],rv,sv,ov,cv)&&(dv.crossVectors(av,hv),mv(e=[dv.x,dv.y,dv.z],rv,sv,ov,cv)))},clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Lm),e.copy(t).clamp(this.min,this.max)},distanceToPoint:function(t){return iv.copy(t).clamp(this.min,this.max).sub(t).length()},getBoundingSphere:function(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(iv).length(),t},intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},applyMatrix4:function(t){return this.isEmpty()||(ev[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),ev[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),ev[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),ev[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),ev[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),ev[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),ev[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),ev[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(ev)),this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}});var vv=new fv;function gv(t,e){this.center=void 0!==t?t:new Lm,this.radius=void 0!==e?e:0}Object.assign(gv.prototype,{set:function(t,e){return this.center.copy(t),this.radius=e,this},setFromPoints:function(t,e){var i=this.center;void 0!==e?i.copy(e):vv.setFromPoints(t).getCenter(i);for(var n=0,r=0,s=t.length;r<s;r++)n=Math.max(n,i.distanceToSquared(t[r]));return this.radius=Math.sqrt(n),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.center.copy(t.center),this.radius=t.radius,this},empty:function(){return this.radius<=0},containsPoint:function(t){return t.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(t){return t.distanceTo(this.center)-this.radius},intersectsSphere:function(t){var e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e},intersectsBox:function(t){return t.intersectsSphere(this)},intersectsPlane:function(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius},clampPoint:function(t,e){var i=this.center.distanceToSquared(t);return void 0===e&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),e=new Lm),e.copy(t),i>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e},getBoundingBox:function(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new fv),t.set(this.center,this.center),t.expandByScalar(this.radius),t},applyMatrix4:function(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this},translate:function(t){return this.center.add(t),this},equals:function(t){return t.center.equals(this.center)&&t.radius===this.radius}});var yv=new Lm,_v=new Lm,xv=new Lm,bv=new Lm,wv=new Lm,Tv=new Lm,Mv=new Lm;function Sv(t,e){this.origin=void 0!==t?t:new Lm,this.direction=void 0!==e?e:new Lm(0,0,-1)}Object.assign(Sv.prototype,{set:function(t,e){return this.origin.copy(t),this.direction.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this},at:function(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Lm),e.copy(this.direction).multiplyScalar(t).add(this.origin)},lookAt:function(t){return this.direction.copy(t).sub(this.origin).normalize(),this},recast:function(t){return this.origin.copy(this.at(t,yv)),this},closestPointToPoint:function(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Lm),e.subVectors(t,this.origin);var i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)},distanceToPoint:function(t){return Math.sqrt(this.distanceSqToPoint(t))},distanceSqToPoint:function(t){var e=yv.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(yv.copy(this.direction).multiplyScalar(e).add(this.origin),yv.distanceToSquared(t))},distanceSqToSegment:function(t,e,i,n){_v.copy(t).add(e).multiplyScalar(.5),xv.copy(e).sub(t).normalize(),bv.copy(this.origin).sub(_v);var r,s,o,a,h=.5*t.distanceTo(e),u=-this.direction.dot(xv),l=bv.dot(this.direction),c=-bv.dot(xv),d=bv.lengthSq(),p=Math.abs(1-u*u);if(p>0)if(s=u*l-c,a=h*p,(r=u*c-l)>=0)if(s>=-a)if(s<=a){var f=1/p;o=(r*=f)*(r+u*(s*=f)+2*l)+s*(u*r+s+2*c)+d}else s=h,o=-(r=Math.max(0,-(u*s+l)))*r+s*(s+2*c)+d;else s=-h,o=-(r=Math.max(0,-(u*s+l)))*r+s*(s+2*c)+d;else s<=-a?o=-(r=Math.max(0,-(-u*h+l)))*r+(s=r>0?-h:Math.min(Math.max(-h,-c),h))*(s+2*c)+d:s<=a?(r=0,o=(s=Math.min(Math.max(-h,-c),h))*(s+2*c)+d):o=-(r=Math.max(0,-(u*h+l)))*r+(s=r>0?h:Math.min(Math.max(-h,-c),h))*(s+2*c)+d;else s=u>0?-h:h,o=-(r=Math.max(0,-(u*s+l)))*r+s*(s+2*c)+d;return i&&i.copy(this.direction).multiplyScalar(r).add(this.origin),n&&n.copy(xv).multiplyScalar(s).add(_v),o},intersectSphere:function(t,e){yv.subVectors(t.center,this.origin);var i=yv.dot(this.direction),n=yv.dot(yv)-i*i,r=t.radius*t.radius;if(n>r)return null;var s=Math.sqrt(r-n),o=i-s,a=i+s;return o<0&&a<0?null:o<0?this.at(a,e):this.at(o,e)},intersectsSphere:function(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius},distanceToPlane:function(t){var e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;var i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null},intersectPlane:function(t,e){var i=this.distanceToPlane(t);return null===i?null:this.at(i,e)},intersectsPlane:function(t){var e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0},intersectBox:function(t,e){var i,n,r,s,o,a,h=1/this.direction.x,u=1/this.direction.y,l=1/this.direction.z,c=this.origin;return h>=0?(i=(t.min.x-c.x)*h,n=(t.max.x-c.x)*h):(i=(t.max.x-c.x)*h,n=(t.min.x-c.x)*h),u>=0?(r=(t.min.y-c.y)*u,s=(t.max.y-c.y)*u):(r=(t.max.y-c.y)*u,s=(t.min.y-c.y)*u),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s<n||n!=n)&&(n=s),l>=0?(o=(t.min.z-c.z)*l,a=(t.max.z-c.z)*l):(o=(t.max.z-c.z)*l,a=(t.min.z-c.z)*l),i>a||o>n?null:((o>i||i!=i)&&(i=o),(a<n||n!=n)&&(n=a),n<0?null:this.at(i>=0?i:n,e)))},intersectsBox:function(t){return null!==this.intersectBox(t,yv)},intersectTriangle:function(t,e,i,n,r){wv.subVectors(e,t),Tv.subVectors(i,t),Mv.crossVectors(wv,Tv);var s,o=this.direction.dot(Mv);if(o>0){if(n)return null;s=1}else{if(!(o<0))return null;s=-1,o=-o}bv.subVectors(this.origin,t);var a=s*this.direction.dot(Tv.crossVectors(bv,Tv));if(a<0)return null;var h=s*this.direction.dot(wv.cross(bv));if(h<0)return null;if(a+h>o)return null;var u=-s*bv.dot(Mv);return u<0?null:this.at(u/o,r)},applyMatrix4:function(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this},equals:function(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}});var Ev=new Lm,Lv=new Lm,Av=new gm;function Dv(t,e){this.normal=void 0!==t?t:new Lm(1,0,0),this.constant=void 0!==e?e:0}Object.assign(Dv.prototype,{isPlane:!0,set:function(t,e){return this.normal.copy(t),this.constant=e,this},setComponents:function(t,e,i,n){return this.normal.set(t,e,i),this.constant=n,this},setFromNormalAndCoplanarPoint:function(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this},setFromCoplanarPoints:function(t,e,i){var n=Ev.subVectors(i,e).cross(Lv.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(n,t),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.normal.copy(t.normal),this.constant=t.constant,this},normalize:function(){var t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(t){return this.normal.dot(t)+this.constant},distanceToSphere:function(t){return this.distanceToPoint(t.center)-t.radius},projectPoint:function(t,e){return void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new Lm),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)},intersectLine:function(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new Lm);var i=t.delta(Ev),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(t.start)?e.copy(t.start):void 0;var r=-(t.start.dot(this.normal)+this.constant)/n;return r<0||r>1?void 0:e.copy(i).multiplyScalar(r).add(t.start)},intersectsLine:function(t){var e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0},intersectsBox:function(t){return t.intersectsPlane(this)},intersectsSphere:function(t){return t.intersectsPlane(this)},coplanarPoint:function(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Lm),t.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(t,e){var i=e||Av.getNormalMatrix(t),n=this.coplanarPoint(Ev).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this},translate:function(t){return this.constant-=t.dot(this.normal),this},equals:function(t){return t.normal.equals(this.normal)&&t.constant===this.constant}});var Pv=new Lm,Cv=new Lm,Ov=new Lm,kv=new Lm,Rv=new Lm,Iv=new Lm,Yv=new Lm,Fv=new Lm,Nv=new Lm,Bv=new Lm;function Uv(t,e,i){this.a=void 0!==t?t:new Lm,this.b=void 0!==e?e:new Lm,this.c=void 0!==i?i:new Lm}Object.assign(Uv,{getNormal:function(t,e,i,n){void 0===n&&(console.warn("THREE.Triangle: .getNormal() target is now required"),n=new Lm),n.subVectors(i,e),Pv.subVectors(t,e),n.cross(Pv);var r=n.lengthSq();return r>0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)},getBarycoord:function(t,e,i,n,r){Pv.subVectors(n,e),Cv.subVectors(i,e),Ov.subVectors(t,e);var s=Pv.dot(Pv),o=Pv.dot(Cv),a=Pv.dot(Ov),h=Cv.dot(Cv),u=Cv.dot(Ov),l=s*h-o*o;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new Lm),0===l)return r.set(-2,-1,-1);var c=1/l,d=(h*a-o*u)*c,p=(s*u-o*a)*c;return r.set(1-d-p,p,d)},containsPoint:function(t,e,i,n){return Uv.getBarycoord(t,e,i,n,kv),kv.x>=0&&kv.y>=0&&kv.x+kv.y<=1},getUV:function(t,e,i,n,r,s,o,a){return this.getBarycoord(t,e,i,n,kv),a.set(0,0),a.addScaledVector(r,kv.x),a.addScaledVector(s,kv.y),a.addScaledVector(o,kv.z),a},isFrontFacing:function(t,e,i,n){return Pv.subVectors(i,e),Cv.subVectors(t,e),Pv.cross(Cv).dot(n)<0}}),Object.assign(Uv.prototype,{set:function(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this},setFromPointsAndIndices:function(t,e,i,n){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[n]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this},getArea:function(){return Pv.subVectors(this.c,this.b),Cv.subVectors(this.a,this.b),.5*Pv.cross(Cv).length()},getMidpoint:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Lm),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(t){return Uv.getNormal(this.a,this.b,this.c,t)},getPlane:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Dv),t.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(t,e){return Uv.getBarycoord(t,this.a,this.b,this.c,e)},getUV:function(t,e,i,n,r){return Uv.getUV(t,this.a,this.b,this.c,e,i,n,r)},containsPoint:function(t){return Uv.containsPoint(t,this.a,this.b,this.c)},isFrontFacing:function(t){return Uv.isFrontFacing(this.a,this.b,this.c,t)},intersectsBox:function(t){return t.intersectsTriangle(this)},closestPointToPoint:function(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Lm);var i,n,r=this.a,s=this.b,o=this.c;Rv.subVectors(s,r),Iv.subVectors(o,r),Fv.subVectors(t,r);var a=Rv.dot(Fv),h=Iv.dot(Fv);if(a<=0&&h<=0)return e.copy(r);Nv.subVectors(t,s);var u=Rv.dot(Nv),l=Iv.dot(Nv);if(u>=0&&l<=u)return e.copy(s);var c=a*l-u*h;if(c<=0&&a>=0&&u<=0)return i=a/(a-u),e.copy(r).addScaledVector(Rv,i);Bv.subVectors(t,o);var d=Rv.dot(Bv),p=Iv.dot(Bv);if(p>=0&&d<=p)return e.copy(o);var f=d*h-a*p;if(f<=0&&h>=0&&p<=0)return n=h/(h-p),e.copy(r).addScaledVector(Iv,n);var m=u*p-d*l;if(m<=0&&l-u>=0&&d-p>=0)return Yv.subVectors(o,s),n=(l-u)/(l-u+(d-p)),e.copy(s).addScaledVector(Yv,n);var v=1/(m+f+c);return i=f*v,n=c*v,e.copy(r).addScaledVector(Rv,i).addScaledVector(Iv,n)},equals:function(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}});var jv={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Hv={h:0,s:0,l:0},zv={h:0,s:0,l:0};function Wv(t,e,i){return void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}function Gv(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}function Vv(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Xv(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}function qv(t,e,i,n,r,s){this.a=t,this.b=e,this.c=i,this.normal=n&&n.isVector3?n:new Lm,this.vertexNormals=Array.isArray(n)?n:[],this.color=r&&r.isColor?r:new Wv,this.vertexColors=Array.isArray(r)?r:[],this.materialIndex=void 0!==s?s:0}Object.assign(Wv.prototype,{isColor:!0,r:1,g:1,b:1,set:function(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this},setScalar:function(t){return this.r=t,this.g=t,this.b=t,this},setHex:function(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this},setRGB:function(t,e,i){return this.r=t,this.g=e,this.b=i,this},setHSL:function(t,e,i){if(t=mm.euclideanModulo(t,1),e=mm.clamp(e,0,1),i=mm.clamp(i,0,1),0===e)this.r=this.g=this.b=i;else{var n=i<=.5?i*(1+e):i+e-i*e,r=2*i-n;this.r=Gv(r,n,t+1/3),this.g=Gv(r,n,t),this.b=Gv(r,n,t-1/3)}return this},setStyle:function(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}var i;if(i=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(t)){var n,r=i[1],s=i[2];switch(r){case"rgb":case"rgba":if(n=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(s))return this.r=Math.min(255,parseInt(n[1],10))/255,this.g=Math.min(255,parseInt(n[2],10))/255,this.b=Math.min(255,parseInt(n[3],10))/255,e(n[5]),this;if(n=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(s))return this.r=Math.min(100,parseInt(n[1],10))/100,this.g=Math.min(100,parseInt(n[2],10))/100,this.b=Math.min(100,parseInt(n[3],10))/100,e(n[5]),this;break;case"hsl":case"hsla":if(n=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(s)){var o=parseFloat(n[1])/360,a=parseInt(n[2],10)/100,h=parseInt(n[3],10)/100;return e(n[5]),this.setHSL(o,a,h)}}}else if(i=/^\#([A-Fa-f0-9]+)$/.exec(t)){var u=i[1],l=u.length;if(3===l)return this.r=parseInt(u.charAt(0)+u.charAt(0),16)/255,this.g=parseInt(u.charAt(1)+u.charAt(1),16)/255,this.b=parseInt(u.charAt(2)+u.charAt(2),16)/255,this;if(6===l)return this.r=parseInt(u.charAt(0)+u.charAt(1),16)/255,this.g=parseInt(u.charAt(2)+u.charAt(3),16)/255,this.b=parseInt(u.charAt(4)+u.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this},setColorName:function(t){var e=jv[t];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(t){return this.r=t.r,this.g=t.g,this.b=t.b,this},copyGammaToLinear:function(t,e){return void 0===e&&(e=2),this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this},copyLinearToGamma:function(t,e){void 0===e&&(e=2);var i=e>0?1/e:1;return this.r=Math.pow(t.r,i),this.g=Math.pow(t.g,i),this.b=Math.pow(t.b,i),this},convertGammaToLinear:function(t){return this.copyGammaToLinear(this,t),this},convertLinearToGamma:function(t){return this.copyLinearToGamma(this,t),this},copySRGBToLinear:function(t){return this.r=Vv(t.r),this.g=Vv(t.g),this.b=Vv(t.b),this},copyLinearToSRGB:function(t){return this.r=Xv(t.r),this.g=Xv(t.g),this.b=Xv(t.b),this},convertSRGBToLinear:function(){return this.copySRGBToLinear(this),this},convertLinearToSRGB:function(){return this.copyLinearToSRGB(this),this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});var e,i,n=this.r,r=this.g,s=this.b,o=Math.max(n,r,s),a=Math.min(n,r,s),h=(a+o)/2;if(a===o)e=0,i=0;else{var u=o-a;switch(i=h<=.5?u/(o+a):u/(2-o-a),o){case n:e=(r-s)/u+(r<s?6:0);break;case r:e=(s-n)/u+2;break;case s:e=(n-r)/u+4}e/=6}return t.h=e,t.s=i,t.l=h,t},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(t,e,i){return this.getHSL(Hv),Hv.h+=t,Hv.s+=e,Hv.l+=i,this.setHSL(Hv.h,Hv.s,Hv.l),this},add:function(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this},addColors:function(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this},addScalar:function(t){return this.r+=t,this.g+=t,this.b+=t,this},sub:function(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this},multiply:function(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this},multiplyScalar:function(t){return this.r*=t,this.g*=t,this.b*=t,this},lerp:function(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this},lerpHSL:function(t,e){this.getHSL(Hv),t.getHSL(zv);var i=mm.lerp(Hv.h,zv.h,e),n=mm.lerp(Hv.s,zv.s,e),r=mm.lerp(Hv.l,zv.l,e);return this.setHSL(i,n,r),this},equals:function(t){return t.r===this.r&&t.g===this.g&&t.b===this.b},fromArray:function(t,e){return void 0===e&&(e=0),this.r=t[e],this.g=t[e+1],this.b=t[e+2],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t},toJSON:function(){return this.getHex()}}),Wv.NAMES=jv,Object.assign(qv.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.a=t.a,this.b=t.b,this.c=t.c,this.normal.copy(t.normal),this.color.copy(t.color),this.materialIndex=t.materialIndex;for(var e=0,i=t.vertexNormals.length;e<i;e++)this.vertexNormals[e]=t.vertexNormals[e].clone();for(e=0,i=t.vertexColors.length;e<i;e++)this.vertexColors[e]=t.vertexColors[e].clone();return this}});var Jv=0;function Zv(){Object.defineProperty(this,"id",{value:Jv++}),this.uuid=mm.generateUUID(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.flatShading=!1,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=kf,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=hm,this.stencilZFail=hm,this.stencilZPass=hm,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}function Kv(t){Zv.call(this),this.type="MeshBasicMaterial",this.color=new Wv(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.setValues(t)}Zv.prototype=Object.assign(Object.create(cm.prototype),{constructor:Zv,isMaterial:!0,onBeforeCompile:function(){},setValues:function(t){if(void 0!==t)for(var e in t){var i=t[e];if(void 0!==i)if("shading"!==e){var n=this[e];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[e]=i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}else console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;else console.warn("THREE.Material: '"+e+"' parameter is undefined.")}},toJSON:function(t){var e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});var i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(t){var e=[];for(var i in t){var n=t[i];delete n.metadata,e.push(n)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(i.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,i.reflectivity=this.reflectivity,i.refractionRatio=this.refractionRatio,void 0!==this.combine&&(i.combine=this.combine),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity)),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(i.size=this.size),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),!0===this.flatShading&&(i.flatShading=this.flatShading),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(i.morphTargets=!0),!0===this.morphNormals&&(i.morphNormals=!0),!0===this.skinning&&(i.skinning=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),e){var r=n(t.textures),s=n(t.images);r.length>0&&(i.textures=r),s.length>0&&(i.images=s)}return i},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.flatShading=t.flatShading,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;var e=t.clippingPlanes,i=null;if(null!==e){var n=e.length;i=new Array(n);for(var r=0;r!==n;++r)i[r]=e[r].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(Zv.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Kv.prototype=Object.create(Zv.prototype),Kv.prototype.constructor=Kv,Kv.prototype.isMeshBasicMaterial=!0,Kv.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this};var Qv=new Lm;function $v(t,e,i){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===i,this.usage=um,this.updateRange={offset:0,count:-1},this.version=0}function tg(t,e,i){$v.call(this,new Int8Array(t),e,i)}function eg(t,e,i){$v.call(this,new Uint8Array(t),e,i)}function ig(t,e,i){$v.call(this,new Uint8ClampedArray(t),e,i)}function ng(t,e,i){$v.call(this,new Int16Array(t),e,i)}function rg(t,e,i){$v.call(this,new Uint16Array(t),e,i)}function sg(t,e,i){$v.call(this,new Int32Array(t),e,i)}function og(t,e,i){$v.call(this,new Uint32Array(t),e,i)}function ag(t,e,i){$v.call(this,new Float32Array(t),e,i)}function hg(t,e,i){$v.call(this,new Float64Array(t),e,i)}function ug(){this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1}function lg(t){if(0===t.length)return-1/0;for(var e=t[0],i=1,n=t.length;i<n;++i)t[i]>e&&(e=t[i]);return e}Object.defineProperty($v.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign($v.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this},copyAt:function(t,e,i){t*=this.itemSize,i*=e.itemSize;for(var n=0,r=this.itemSize;n<r;n++)this.array[t+n]=e.array[i+n];return this},copyArray:function(t){return this.array.set(t),this},copyColorsArray:function(t){for(var e=this.array,i=0,n=0,r=t.length;n<r;n++){var s=t[n];void 0===s&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),s=new Wv),e[i++]=s.r,e[i++]=s.g,e[i++]=s.b}return this},copyVector2sArray:function(t){for(var e=this.array,i=0,n=0,r=t.length;n<r;n++){var s=t[n];void 0===s&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",n),s=new vm),e[i++]=s.x,e[i++]=s.y}return this},copyVector3sArray:function(t){for(var e=this.array,i=0,n=0,r=t.length;n<r;n++){var s=t[n];void 0===s&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),s=new Lm),e[i++]=s.x,e[i++]=s.y,e[i++]=s.z}return this},copyVector4sArray:function(t){for(var e=this.array,i=0,n=0,r=t.length;n<r;n++){var s=t[n];void 0===s&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),s=new bm),e[i++]=s.x,e[i++]=s.y,e[i++]=s.z,e[i++]=s.w}return this},applyMatrix3:function(t){for(var e=0,i=this.count;e<i;e++)Qv.x=this.getX(e),Qv.y=this.getY(e),Qv.z=this.getZ(e),Qv.applyMatrix3(t),this.setXYZ(e,Qv.x,Qv.y,Qv.z);return this},applyMatrix4:function(t){for(var e=0,i=this.count;e<i;e++)Qv.x=this.getX(e),Qv.y=this.getY(e),Qv.z=this.getZ(e),Qv.applyMatrix4(t),this.setXYZ(e,Qv.x,Qv.y,Qv.z);return this},applyNormalMatrix:function(t){for(var e=0,i=this.count;e<i;e++)Qv.x=this.getX(e),Qv.y=this.getY(e),Qv.z=this.getZ(e),Qv.applyNormalMatrix(t),this.setXYZ(e,Qv.x,Qv.y,Qv.z);return this},transformDirection:function(t){for(var e=0,i=this.count;e<i;e++)Qv.x=this.getX(e),Qv.y=this.getY(e),Qv.z=this.getZ(e),Qv.transformDirection(t),this.setXYZ(e,Qv.x,Qv.y,Qv.z);return this},set:function(t,e){return void 0===e&&(e=0),this.array.set(t,e),this},getX:function(t){return this.array[t*this.itemSize]},setX:function(t,e){return this.array[t*this.itemSize]=e,this},getY:function(t){return this.array[t*this.itemSize+1]},setY:function(t,e){return this.array[t*this.itemSize+1]=e,this},getZ:function(t){return this.array[t*this.itemSize+2]},setZ:function(t,e){return this.array[t*this.itemSize+2]=e,this},getW:function(t){return this.array[t*this.itemSize+3]},setW:function(t,e){return this.array[t*this.itemSize+3]=e,this},setXY:function(t,e,i){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this},setXYZ:function(t,e,i,n){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=n,this},setXYZW:function(t,e,i,n,r){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=n,this.array[t+3]=r,this},onUpload:function(t){return this.onUploadCallback=t,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized}}}),tg.prototype=Object.create($v.prototype),tg.prototype.constructor=tg,eg.prototype=Object.create($v.prototype),eg.prototype.constructor=eg,ig.prototype=Object.create($v.prototype),ig.prototype.constructor=ig,ng.prototype=Object.create($v.prototype),ng.prototype.constructor=ng,rg.prototype=Object.create($v.prototype),rg.prototype.constructor=rg,sg.prototype=Object.create($v.prototype),sg.prototype.constructor=sg,og.prototype=Object.create($v.prototype),og.prototype.constructor=og,ag.prototype=Object.create($v.prototype),ag.prototype.constructor=ag,hg.prototype=Object.create($v.prototype),hg.prototype.constructor=hg,Object.assign(ug.prototype,{computeGroups:function(t){for(var e,i=[],n=void 0,r=t.faces,s=0;s<r.length;s++){var o=r[s];o.materialIndex!==n&&(n=o.materialIndex,void 0!==e&&(e.count=3*s-e.start,i.push(e)),e={start:3*s,materialIndex:n})}void 0!==e&&(e.count=3*s-e.start,i.push(e)),this.groups=i},fromGeometry:function(t){var e,i=t.faces,n=t.vertices,r=t.faceVertexUvs,s=r[0]&&r[0].length>0,o=r[1]&&r[1].length>0,a=t.morphTargets,h=a.length;if(h>0){e=[];for(var u=0;u<h;u++)e[u]={name:a[u].name,data:[]};this.morphTargets.position=e}var l,c=t.morphNormals,d=c.length;if(d>0){l=[];for(u=0;u<d;u++)l[u]={name:c[u].name,data:[]};this.morphTargets.normal=l}var p=t.skinIndices,f=t.skinWeights,m=p.length===n.length,v=f.length===n.length;n.length>0&&0===i.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(u=0;u<i.length;u++){var g=i[u];this.vertices.push(n[g.a],n[g.b],n[g.c]);var y=g.vertexNormals;if(3===y.length)this.normals.push(y[0],y[1],y[2]);else{var _=g.normal;this.normals.push(_,_,_)}var x,b=g.vertexColors;if(3===b.length)this.colors.push(b[0],b[1],b[2]);else{var w=g.color;this.colors.push(w,w,w)}if(!0===s)void 0!==(x=r[0][u])?this.uvs.push(x[0],x[1],x[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",u),this.uvs.push(new vm,new vm,new vm));if(!0===o)void 0!==(x=r[1][u])?this.uvs2.push(x[0],x[1],x[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",u),this.uvs2.push(new vm,new vm,new vm));for(var T=0;T<h;T++){var M=a[T].vertices;e[T].data.push(M[g.a],M[g.b],M[g.c])}for(T=0;T<d;T++){var S=c[T].vertexNormals[u];l[T].data.push(S.a,S.b,S.c)}m&&this.skinIndices.push(p[g.a],p[g.b],p[g.c]),v&&this.skinWeights.push(f[g.a],f[g.b],f[g.c])}return this.computeGroups(t),this.verticesNeedUpdate=t.verticesNeedUpdate,this.normalsNeedUpdate=t.normalsNeedUpdate,this.colorsNeedUpdate=t.colorsNeedUpdate,this.uvsNeedUpdate=t.uvsNeedUpdate,this.groupsNeedUpdate=t.groupsNeedUpdate,null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),this}});var cg=1,dg=new Im,pg=new $m,fg=new Lm,mg=new fv,vg=new fv,gg=new Lm;function yg(){Object.defineProperty(this,"id",{value:cg+=2}),this.uuid=mm.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}yg.prototype=Object.assign(Object.create(cm.prototype),{constructor:yg,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(t){Array.isArray(t)?this.index=new(lg(t)>65535?og:rg)(t,1):this.index=t},getAttribute:function(t){return this.attributes[t]},setAttribute:function(t,e){return this.attributes[t]=e,this},deleteAttribute:function(t){return delete this.attributes[t],this},addGroup:function(t,e,i){this.groups.push({start:t,count:e,materialIndex:void 0!==i?i:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix4:function(t){var e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);var i=this.attributes.normal;if(void 0!==i){var n=(new gm).getNormalMatrix(t);i.applyNormalMatrix(n),i.needsUpdate=!0}var r=this.attributes.tangent;return void 0!==r&&(r.transformDirection(t),r.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(t){return dg.makeRotationX(t),this.applyMatrix4(dg),this},rotateY:function(t){return dg.makeRotationY(t),this.applyMatrix4(dg),this},rotateZ:function(t){return dg.makeRotationZ(t),this.applyMatrix4(dg),this},translate:function(t,e,i){return dg.makeTranslation(t,e,i),this.applyMatrix4(dg),this},scale:function(t,e,i){return dg.makeScale(t,e,i),this.applyMatrix4(dg),this},lookAt:function(t){return pg.lookAt(t),pg.updateMatrix(),this.applyMatrix4(pg.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(fg).negate(),this.translate(fg.x,fg.y,fg.z),this},setFromObject:function(t){var e=t.geometry;if(t.isPoints||t.isLine){var i=new ag(3*e.vertices.length,3),n=new ag(3*e.colors.length,3);if(this.setAttribute("position",i.copyVector3sArray(e.vertices)),this.setAttribute("color",n.copyColorsArray(e.colors)),e.lineDistances&&e.lineDistances.length===e.vertices.length){var r=new ag(e.lineDistances.length,1);this.setAttribute("lineDistance",r.copyArray(e.lineDistances))}null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone())}else t.isMesh&&e&&e.isGeometry&&this.fromGeometry(e);return this},setFromPoints:function(t){for(var e=[],i=0,n=t.length;i<n;i++){var r=t[i];e.push(r.x,r.y,r.z||0)}return this.setAttribute("position",new ag(e,3)),this},updateFromObject:function(t){var e,i=t.geometry;if(t.isMesh){var n=i.__directGeometry;if(!0===i.elementsNeedUpdate&&(n=void 0,i.elementsNeedUpdate=!1),void 0===n)return this.fromGeometry(i);n.verticesNeedUpdate=i.verticesNeedUpdate,n.normalsNeedUpdate=i.normalsNeedUpdate,n.colorsNeedUpdate=i.colorsNeedUpdate,n.uvsNeedUpdate=i.uvsNeedUpdate,n.groupsNeedUpdate=i.groupsNeedUpdate,i.verticesNeedUpdate=!1,i.normalsNeedUpdate=!1,i.colorsNeedUpdate=!1,i.uvsNeedUpdate=!1,i.groupsNeedUpdate=!1,i=n}return!0===i.verticesNeedUpdate&&(void 0!==(e=this.attributes.position)&&(e.copyVector3sArray(i.vertices),e.needsUpdate=!0),i.verticesNeedUpdate=!1),!0===i.normalsNeedUpdate&&(void 0!==(e=this.attributes.normal)&&(e.copyVector3sArray(i.normals),e.needsUpdate=!0),i.normalsNeedUpdate=!1),!0===i.colorsNeedUpdate&&(void 0!==(e=this.attributes.color)&&(e.copyColorsArray(i.colors),e.needsUpdate=!0),i.colorsNeedUpdate=!1),i.uvsNeedUpdate&&(void 0!==(e=this.attributes.uv)&&(e.copyVector2sArray(i.uvs),e.needsUpdate=!0),i.uvsNeedUpdate=!1),i.lineDistancesNeedUpdate&&(void 0!==(e=this.attributes.lineDistance)&&(e.copyArray(i.lineDistances),e.needsUpdate=!0),i.lineDistancesNeedUpdate=!1),i.groupsNeedUpdate&&(i.computeGroups(t.geometry),this.groups=i.groups,i.groupsNeedUpdate=!1),this},fromGeometry:function(t){return t.__directGeometry=(new ug).fromGeometry(t),this.fromDirectGeometry(t.__directGeometry)},fromDirectGeometry:function(t){var e=new Float32Array(3*t.vertices.length);if(this.setAttribute("position",new $v(e,3).copyVector3sArray(t.vertices)),t.normals.length>0){var i=new Float32Array(3*t.normals.length);this.setAttribute("normal",new $v(i,3).copyVector3sArray(t.normals))}if(t.colors.length>0){var n=new Float32Array(3*t.colors.length);this.setAttribute("color",new $v(n,3).copyColorsArray(t.colors))}if(t.uvs.length>0){var r=new Float32Array(2*t.uvs.length);this.setAttribute("uv",new $v(r,2).copyVector2sArray(t.uvs))}if(t.uvs2.length>0){var s=new Float32Array(2*t.uvs2.length);this.setAttribute("uv2",new $v(s,2).copyVector2sArray(t.uvs2))}for(var o in this.groups=t.groups,t.morphTargets){for(var a=[],h=t.morphTargets[o],u=0,l=h.length;u<l;u++){var c=h[u],d=new ag(3*c.data.length,3);d.name=c.name,a.push(d.copyVector3sArray(c.data))}this.morphAttributes[o]=a}if(t.skinIndices.length>0){var p=new ag(4*t.skinIndices.length,4);this.setAttribute("skinIndex",p.copyVector4sArray(t.skinIndices))}if(t.skinWeights.length>0){var f=new ag(4*t.skinWeights.length,4);this.setAttribute("skinWeight",f.copyVector4sArray(t.skinWeights))}return null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new fv);var t=this.attributes.position,e=this.morphAttributes.position;if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(var i=0,n=e.length;i<n;i++){var r=e[i];mg.setFromBufferAttribute(r),this.morphTargetsRelative?(gg.addVectors(this.boundingBox.min,mg.min),this.boundingBox.expandByPoint(gg),gg.addVectors(this.boundingBox.max,mg.max),this.boundingBox.expandByPoint(gg)):(this.boundingBox.expandByPoint(mg.min),this.boundingBox.expandByPoint(mg.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new gv);var t=this.attributes.position,e=this.morphAttributes.position;if(t){var i=this.boundingSphere.center;if(mg.setFromBufferAttribute(t),e)for(var n=0,r=e.length;n<r;n++){var s=e[n];vg.setFromBufferAttribute(s),this.morphTargetsRelative?(gg.addVectors(mg.min,vg.min),mg.expandByPoint(gg),gg.addVectors(mg.max,vg.max),mg.expandByPoint(gg)):(mg.expandByPoint(vg.min),mg.expandByPoint(vg.max))}mg.getCenter(i);var o=0;for(n=0,r=t.count;n<r;n++)gg.fromBufferAttribute(t,n),o=Math.max(o,i.distanceToSquared(gg));if(e)for(n=0,r=e.length;n<r;n++){s=e[n];for(var a=this.morphTargetsRelative,h=0,u=s.count;h<u;h++)gg.fromBufferAttribute(s,h),a&&(fg.fromBufferAttribute(t,h),gg.add(fg)),o=Math.max(o,i.distanceToSquared(gg))}this.boundingSphere.radius=Math.sqrt(o),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}},computeFaceNormals:function(){},computeVertexNormals:function(){var t=this.index,e=this.attributes;if(e.position){var i=e.position.array;if(void 0===e.normal)this.setAttribute("normal",new $v(new Float32Array(i.length),3));else for(var n=e.normal.array,r=0,s=n.length;r<s;r++)n[r]=0;var o,a,h,u=e.normal.array,l=new Lm,c=new Lm,d=new Lm,p=new Lm,f=new Lm;if(t){var m=t.array;for(r=0,s=t.count;r<s;r+=3)o=3*m[r+0],a=3*m[r+1],h=3*m[r+2],l.fromArray(i,o),c.fromArray(i,a),d.fromArray(i,h),p.subVectors(d,c),f.subVectors(l,c),p.cross(f),u[o]+=p.x,u[o+1]+=p.y,u[o+2]+=p.z,u[a]+=p.x,u[a+1]+=p.y,u[a+2]+=p.z,u[h]+=p.x,u[h+1]+=p.y,u[h+2]+=p.z}else for(r=0,s=i.length;r<s;r+=9)l.fromArray(i,r),c.fromArray(i,r+3),d.fromArray(i,r+6),p.subVectors(d,c),f.subVectors(l,c),p.cross(f),u[r]=p.x,u[r+1]=p.y,u[r+2]=p.z,u[r+3]=p.x,u[r+4]=p.y,u[r+5]=p.z,u[r+6]=p.x,u[r+7]=p.y,u[r+8]=p.z;this.normalizeNormals(),e.normal.needsUpdate=!0}},merge:function(t,e){if(t&&t.isBufferGeometry){void 0===e&&(e=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));var i=this.attributes;for(var n in i)if(void 0!==t.attributes[n])for(var r=i[n].array,s=t.attributes[n],o=s.array,a=s.itemSize*e,h=Math.min(o.length,r.length-a),u=0,l=a;u<h;u++,l++)r[l]=o[u];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",t)},normalizeNormals:function(){for(var t=this.attributes.normal,e=0,i=t.count;e<i;e++)gg.x=t.getX(e),gg.y=t.getY(e),gg.z=t.getZ(e),gg.normalize(),t.setXYZ(e,gg.x,gg.y,gg.z)},toNonIndexed:function(){function t(t,e){for(var i=t.array,n=t.itemSize,r=new i.constructor(e.length*n),s=0,o=0,a=0,h=e.length;a<h;a++){s=e[a]*n;for(var u=0;u<n;u++)r[o++]=i[s++]}return new $v(r,n)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var e=new yg,i=this.index.array,n=this.attributes;for(var r in n){var s=t(n[r],i);e.setAttribute(r,s)}var o=this.morphAttributes;for(r in o){for(var a=[],h=o[r],u=0,l=h.length;u<l;u++){s=t(h[u],i);a.push(s)}e.morphAttributes[r]=a}e.morphTargetsRelative=this.morphTargetsRelative;for(var c=this.groups,d=(u=0,c.length);u<d;u++){var p=c[u];e.addGroup(p.start,p.count,p.materialIndex)}return e},toJSON:function(){var t={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),void 0!==this.parameters){var e=this.parameters;for(var i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};var n=this.index;null!==n&&(t.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});var r=this.attributes;for(var i in r){var s=(d=r[i]).toJSON();""!==d.name&&(s.name=d.name),t.data.attributes[i]=s}var o={},a=!1;for(var i in this.morphAttributes){for(var h=this.morphAttributes[i],u=[],l=0,c=h.length;l<c;l++){var d;s=(d=h[l]).toJSON();""!==d.name&&(s.name=d.name),u.push(s)}u.length>0&&(o[i]=u,a=!0)}a&&(t.data.morphAttributes=o,t.data.morphTargetsRelative=this.morphTargetsRelative);var p=this.groups;p.length>0&&(t.data.groups=JSON.parse(JSON.stringify(p)));var f=this.boundingSphere;return null!==f&&(t.data.boundingSphere={center:f.center.toArray(),radius:f.radius}),t},clone:function(){return(new yg).copy(this)},copy:function(t){var e,i,n;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var r=t.index;null!==r&&this.setIndex(r.clone());var s=t.attributes;for(e in s){var o=s[e];this.setAttribute(e,o.clone())}var a=t.morphAttributes;for(e in a){var h=[],u=a[e];for(i=0,n=u.length;i<n;i++)h.push(u[i].clone());this.morphAttributes[e]=h}this.morphTargetsRelative=t.morphTargetsRelative;var l=t.groups;for(i=0,n=l.length;i<n;i++){var c=l[i];this.addGroup(c.start,c.count,c.materialIndex)}var d=t.boundingBox;null!==d&&(this.boundingBox=d.clone());var p=t.boundingSphere;return null!==p&&(this.boundingSphere=p.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var _g=new Im,xg=new Sv,bg=new gv,wg=new Lm,Tg=new Lm,Mg=new Lm,Sg=new Lm,Eg=new Lm,Lg=new Lm,Ag=new Lm,Dg=new Lm,Pg=new Lm,Cg=new vm,Og=new vm,kg=new vm,Rg=new Lm,Ig=new Lm;function Yg(t,e){$m.call(this),this.type="Mesh",this.geometry=void 0!==t?t:new yg,this.material=void 0!==e?e:new Kv,this.updateMorphTargets()}function Fg(t,e,i,n,r,s,o,a){if(null===(1===e.side?n.intersectTriangle(o,s,r,!0,a):n.intersectTriangle(r,s,o,2!==e.side,a)))return null;Ig.copy(a),Ig.applyMatrix4(t.matrixWorld);var h=i.ray.origin.distanceTo(Ig);return h<i.near||h>i.far?null:{distance:h,point:Ig.clone(),object:t}}function Ng(t,e,i,n,r,s,o,a,h,u,l,c){wg.fromBufferAttribute(r,u),Tg.fromBufferAttribute(r,l),Mg.fromBufferAttribute(r,c);var d=t.morphTargetInfluences;if(e.morphTargets&&s&&d){Ag.set(0,0,0),Dg.set(0,0,0),Pg.set(0,0,0);for(var p=0,f=s.length;p<f;p++){var m=d[p],v=s[p];0!==m&&(Sg.fromBufferAttribute(v,u),Eg.fromBufferAttribute(v,l),Lg.fromBufferAttribute(v,c),o?(Ag.addScaledVector(Sg,m),Dg.addScaledVector(Eg,m),Pg.addScaledVector(Lg,m)):(Ag.addScaledVector(Sg.sub(wg),m),Dg.addScaledVector(Eg.sub(Tg),m),Pg.addScaledVector(Lg.sub(Mg),m)))}wg.add(Ag),Tg.add(Dg),Mg.add(Pg)}var g=Fg(t,e,i,n,wg,Tg,Mg,Rg);if(g){a&&(Cg.fromBufferAttribute(a,u),Og.fromBufferAttribute(a,l),kg.fromBufferAttribute(a,c),g.uv=Uv.getUV(Rg,wg,Tg,Mg,Cg,Og,kg,new vm)),h&&(Cg.fromBufferAttribute(h,u),Og.fromBufferAttribute(h,l),kg.fromBufferAttribute(h,c),g.uv2=Uv.getUV(Rg,wg,Tg,Mg,Cg,Og,kg,new vm));var y=new qv(u,l,c);Uv.getNormal(wg,Tg,Mg,y.normal),g.face=y}return g}Yg.prototype=Object.assign(Object.create($m.prototype),{constructor:Yg,isMesh:!0,copy:function(t){return $m.prototype.copy.call(this,t),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this},updateMorphTargets:function(){var t,e,i,n=this.geometry;if(n.isBufferGeometry){var r=n.morphAttributes,s=Object.keys(r);if(s.length>0){var o=r[s[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=o.length;t<e;t++)i=o[t].name||String(t),this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}else{var a=n.morphTargets;void 0!==a&&a.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(t,e){var i,n=this.geometry,r=this.material,s=this.matrixWorld;if(void 0!==r&&(null===n.boundingSphere&&n.computeBoundingSphere(),bg.copy(n.boundingSphere),bg.applyMatrix4(s),!1!==t.ray.intersectsSphere(bg)&&(_g.getInverse(s),xg.copy(t.ray).applyMatrix4(_g),null===n.boundingBox||!1!==xg.intersectsBox(n.boundingBox))))if(n.isBufferGeometry){var o,a,h,u,l,c,d,p,f,m=n.index,v=n.attributes.position,g=n.morphAttributes.position,y=n.morphTargetsRelative,_=n.attributes.uv,x=n.attributes.uv2,b=n.groups,w=n.drawRange;if(null!==m)if(Array.isArray(r))for(u=0,c=b.length;u<c;u++)for(f=r[(p=b[u]).materialIndex],l=Math.max(p.start,w.start),d=Math.min(p.start+p.count,w.start+w.count);l<d;l+=3)o=m.getX(l),a=m.getX(l+1),h=m.getX(l+2),(i=Ng(this,f,t,xg,v,g,y,_,x,o,a,h))&&(i.faceIndex=Math.floor(l/3),i.face.materialIndex=p.materialIndex,e.push(i));else for(u=Math.max(0,w.start),c=Math.min(m.count,w.start+w.count);u<c;u+=3)o=m.getX(u),a=m.getX(u+1),h=m.getX(u+2),(i=Ng(this,r,t,xg,v,g,y,_,x,o,a,h))&&(i.faceIndex=Math.floor(u/3),e.push(i));else if(void 0!==v)if(Array.isArray(r))for(u=0,c=b.length;u<c;u++)for(f=r[(p=b[u]).materialIndex],l=Math.max(p.start,w.start),d=Math.min(p.start+p.count,w.start+w.count);l<d;l+=3)(i=Ng(this,f,t,xg,v,g,y,_,x,o=l,a=l+1,h=l+2))&&(i.faceIndex=Math.floor(l/3),i.face.materialIndex=p.materialIndex,e.push(i));else for(u=Math.max(0,w.start),c=Math.min(v.count,w.start+w.count);u<c;u+=3)(i=Ng(this,r,t,xg,v,g,y,_,x,o=u,a=u+1,h=u+2))&&(i.faceIndex=Math.floor(u/3),e.push(i))}else if(n.isGeometry){var T,M,S,E,L=Array.isArray(r),A=n.vertices,D=n.faces,P=n.faceVertexUvs[0];P.length>0&&(E=P);for(var C=0,O=D.length;C<O;C++){var k=D[C],R=L?r[k.materialIndex]:r;if(void 0!==R&&(T=A[k.a],M=A[k.b],S=A[k.c],i=Fg(this,R,t,xg,T,M,S,Rg))){if(E&&E[C]){var I=E[C];Cg.copy(I[0]),Og.copy(I[1]),kg.copy(I[2]),i.uv=Uv.getUV(Rg,T,M,S,Cg,Og,kg,new vm)}i.face=k,i.faceIndex=C,e.push(i)}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Bg=0,Ug=new Im,jg=new $m,Hg=new Lm;function zg(){Object.defineProperty(this,"id",{value:Bg+=2}),this.uuid=mm.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.elementsNeedUpdate=!1,this.verticesNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1}zg.prototype=Object.assign(Object.create(cm.prototype),{constructor:zg,isGeometry:!0,applyMatrix4:function(t){for(var e=(new gm).getNormalMatrix(t),i=0,n=this.vertices.length;i<n;i++){this.vertices[i].applyMatrix4(t)}for(i=0,n=this.faces.length;i<n;i++){var r=this.faces[i];r.normal.applyMatrix3(e).normalize();for(var s=0,o=r.vertexNormals.length;s<o;s++)r.vertexNormals[s].applyMatrix3(e).normalize()}return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.verticesNeedUpdate=!0,this.normalsNeedUpdate=!0,this},rotateX:function(t){return Ug.makeRotationX(t),this.applyMatrix4(Ug),this},rotateY:function(t){return Ug.makeRotationY(t),this.applyMatrix4(Ug),this},rotateZ:function(t){return Ug.makeRotationZ(t),this.applyMatrix4(Ug),this},translate:function(t,e,i){return Ug.makeTranslation(t,e,i),this.applyMatrix4(Ug),this},scale:function(t,e,i){return Ug.makeScale(t,e,i),this.applyMatrix4(Ug),this},lookAt:function(t){return jg.lookAt(t),jg.updateMatrix(),this.applyMatrix4(jg.matrix),this},fromBufferGeometry:function(t){var e=this,i=null!==t.index?t.index.array:void 0,n=t.attributes;if(void 0===n.position)return console.error("THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion."),this;var r=n.position.array,s=void 0!==n.normal?n.normal.array:void 0,o=void 0!==n.color?n.color.array:void 0,a=void 0!==n.uv?n.uv.array:void 0,h=void 0!==n.uv2?n.uv2.array:void 0;void 0!==h&&(this.faceVertexUvs[1]=[]);for(var u=0;u<r.length;u+=3)e.vertices.push((new Lm).fromArray(r,u)),void 0!==o&&e.colors.push((new Wv).fromArray(o,u));function l(t,i,n,r){var u=void 0===o?[]:[e.colors[t].clone(),e.colors[i].clone(),e.colors[n].clone()],l=new qv(t,i,n,void 0===s?[]:[(new Lm).fromArray(s,3*t),(new Lm).fromArray(s,3*i),(new Lm).fromArray(s,3*n)],u,r);e.faces.push(l),void 0!==a&&e.faceVertexUvs[0].push([(new vm).fromArray(a,2*t),(new vm).fromArray(a,2*i),(new vm).fromArray(a,2*n)]),void 0!==h&&e.faceVertexUvs[1].push([(new vm).fromArray(h,2*t),(new vm).fromArray(h,2*i),(new vm).fromArray(h,2*n)])}var c=t.groups;if(c.length>0)for(u=0;u<c.length;u++)for(var d=c[u],p=d.start,f=p,m=p+d.count;f<m;f+=3)void 0!==i?l(i[f],i[f+1],i[f+2],d.materialIndex):l(f,f+1,f+2,d.materialIndex);else if(void 0!==i)for(u=0;u<i.length;u+=3)l(i[u],i[u+1],i[u+2]);else for(u=0;u<r.length/3;u+=3)l(u,u+1,u+2);return this.computeFaceNormals(),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(Hg).negate(),this.translate(Hg.x,Hg.y,Hg.z),this},normalize:function(){this.computeBoundingSphere();var t=this.boundingSphere.center,e=this.boundingSphere.radius,i=0===e?1:1/e,n=new Im;return n.set(i,0,0,-i*t.x,0,i,0,-i*t.y,0,0,i,-i*t.z,0,0,0,1),this.applyMatrix4(n),this},computeFaceNormals:function(){for(var t=new Lm,e=new Lm,i=0,n=this.faces.length;i<n;i++){var r=this.faces[i],s=this.vertices[r.a],o=this.vertices[r.b],a=this.vertices[r.c];t.subVectors(a,o),e.subVectors(s,o),t.cross(e),t.normalize(),r.normal.copy(t)}},computeVertexNormals:function(t){var e,i,n,r,s,o;for(void 0===t&&(t=!0),o=new Array(this.vertices.length),e=0,i=this.vertices.length;e<i;e++)o[e]=new Lm;if(t){var a,h,u,l=new Lm,c=new Lm;for(n=0,r=this.faces.length;n<r;n++)s=this.faces[n],a=this.vertices[s.a],h=this.vertices[s.b],u=this.vertices[s.c],l.subVectors(u,h),c.subVectors(a,h),l.cross(c),o[s.a].add(l),o[s.b].add(l),o[s.c].add(l)}else for(this.computeFaceNormals(),n=0,r=this.faces.length;n<r;n++)o[(s=this.faces[n]).a].add(s.normal),o[s.b].add(s.normal),o[s.c].add(s.normal);for(e=0,i=this.vertices.length;e<i;e++)o[e].normalize();for(n=0,r=this.faces.length;n<r;n++){var d=(s=this.faces[n]).vertexNormals;3===d.length?(d[0].copy(o[s.a]),d[1].copy(o[s.b]),d[2].copy(o[s.c])):(d[0]=o[s.a].clone(),d[1]=o[s.b].clone(),d[2]=o[s.c].clone())}this.faces.length>0&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var t,e,i;for(this.computeFaceNormals(),t=0,e=this.faces.length;t<e;t++){var n=(i=this.faces[t]).vertexNormals;3===n.length?(n[0].copy(i.normal),n[1].copy(i.normal),n[2].copy(i.normal)):(n[0]=i.normal.clone(),n[1]=i.normal.clone(),n[2]=i.normal.clone())}this.faces.length>0&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var t,e,i,n,r;for(i=0,n=this.faces.length;i<n;i++)for((r=this.faces[i]).__originalFaceNormal?r.__originalFaceNormal.copy(r.normal):r.__originalFaceNormal=r.normal.clone(),r.__originalVertexNormals||(r.__originalVertexNormals=[]),t=0,e=r.vertexNormals.length;t<e;t++)r.__originalVertexNormals[t]?r.__originalVertexNormals[t].copy(r.vertexNormals[t]):r.__originalVertexNormals[t]=r.vertexNormals[t].clone();var s=new zg;for(s.faces=this.faces,t=0,e=this.morphTargets.length;t<e;t++){if(!this.morphNormals[t]){this.morphNormals[t]={},this.morphNormals[t].faceNormals=[],this.morphNormals[t].vertexNormals=[];var o=this.morphNormals[t].faceNormals,a=this.morphNormals[t].vertexNormals;for(i=0,n=this.faces.length;i<n;i++)h=new Lm,u={a:new Lm,b:new Lm,c:new Lm},o.push(h),a.push(u)}var h,u,l=this.morphNormals[t];for(s.vertices=this.morphTargets[t].vertices,s.computeFaceNormals(),s.computeVertexNormals(),i=0,n=this.faces.length;i<n;i++)r=this.faces[i],h=l.faceNormals[i],u=l.vertexNormals[i],h.copy(r.normal),u.a.copy(r.vertexNormals[0]),u.b.copy(r.vertexNormals[1]),u.c.copy(r.vertexNormals[2])}for(i=0,n=this.faces.length;i<n;i++)(r=this.faces[i]).normal=r.__originalFaceNormal,r.vertexNormals=r.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new fv),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new gv),this.boundingSphere.setFromPoints(this.vertices)},merge:function(t,e,i){if(t&&t.isGeometry){var n,r=this.vertices.length,s=this.vertices,o=t.vertices,a=this.faces,h=t.faces,u=this.colors,l=t.colors;void 0===i&&(i=0),void 0!==e&&(n=(new gm).getNormalMatrix(e));for(var c=0,d=o.length;c<d;c++){var p=o[c].clone();void 0!==e&&p.applyMatrix4(e),s.push(p)}for(c=0,d=l.length;c<d;c++)u.push(l[c].clone());for(c=0,d=h.length;c<d;c++){var f,m,v,g=h[c],y=g.vertexNormals,_=g.vertexColors;(f=new qv(g.a+r,g.b+r,g.c+r)).normal.copy(g.normal),void 0!==n&&f.normal.applyMatrix3(n).normalize();for(var x=0,b=y.length;x<b;x++)m=y[x].clone(),void 0!==n&&m.applyMatrix3(n).normalize(),f.vertexNormals.push(m);f.color.copy(g.color);for(x=0,b=_.length;x<b;x++)v=_[x],f.vertexColors.push(v.clone());f.materialIndex=g.materialIndex+i,a.push(f)}for(c=0,d=t.faceVertexUvs.length;c<d;c++){var w=t.faceVertexUvs[c];void 0===this.faceVertexUvs[c]&&(this.faceVertexUvs[c]=[]);for(x=0,b=w.length;x<b;x++){for(var T=w[x],M=[],S=0,E=T.length;S<E;S++)M.push(T[S].clone());this.faceVertexUvs[c].push(M)}}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",t)},mergeMesh:function(t){t&&t.isMesh?(t.matrixAutoUpdate&&t.updateMatrix(),this.merge(t.geometry,t.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",t)},mergeVertices:function(){var t,e,i,n,r,s,o,a,h={},u=[],l=[],c=Math.pow(10,4);for(i=0,n=this.vertices.length;i<n;i++)t=this.vertices[i],void 0===h[e=Math.round(t.x*c)+"_"+Math.round(t.y*c)+"_"+Math.round(t.z*c)]?(h[e]=i,u.push(this.vertices[i]),l[i]=u.length-1):l[i]=l[h[e]];var d=[];for(i=0,n=this.faces.length;i<n;i++){(r=this.faces[i]).a=l[r.a],r.b=l[r.b],r.c=l[r.c],s=[r.a,r.b,r.c];for(var p=0;p<3;p++)if(s[p]===s[(p+1)%3]){d.push(i);break}}for(i=d.length-1;i>=0;i--){var f=d[i];for(this.faces.splice(f,1),o=0,a=this.faceVertexUvs.length;o<a;o++)this.faceVertexUvs[o].splice(f,1)}var m=this.vertices.length-u.length;return this.vertices=u,m},setFromPoints:function(t){this.vertices=[];for(var e=0,i=t.length;e<i;e++){var n=t[e];this.vertices.push(new Lm(n.x,n.y,n.z||0))}return this},sortFacesByMaterialIndex:function(){for(var t=this.faces,e=t.length,i=0;i<e;i++)t[i]._id=i;t.sort((function(t,e){return t.materialIndex-e.materialIndex}));var n,r,s=this.faceVertexUvs[0],o=this.faceVertexUvs[1];s&&s.length===e&&(n=[]),o&&o.length===e&&(r=[]);for(i=0;i<e;i++){var a=t[i]._id;n&&n.push(s[a]),r&&r.push(o[a])}n&&(this.faceVertexUvs[0]=n),r&&(this.faceVertexUvs[1]=r)},toJSON:function(){var t={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),void 0!==this.parameters){var e=this.parameters;for(var i in e)void 0!==e[i]&&(t[i]=e[i]);return t}for(var n=[],r=0;r<this.vertices.length;r++){var s=this.vertices[r];n.push(s.x,s.y,s.z)}var o=[],a=[],h={},u=[],l={},c=[],d={};for(r=0;r<this.faces.length;r++){var p=this.faces[r],f=void 0!==this.faceVertexUvs[0][r],m=p.normal.length()>0,v=p.vertexNormals.length>0,g=1!==p.color.r||1!==p.color.g||1!==p.color.b,y=p.vertexColors.length>0,_=0;if(_=T(_,0,0),_=T(_,1,!0),_=T(_,2,!1),_=T(_,3,f),_=T(_,4,m),_=T(_,5,v),_=T(_,6,g),_=T(_,7,y),o.push(_),o.push(p.a,p.b,p.c),o.push(p.materialIndex),f){var x=this.faceVertexUvs[0][r];o.push(E(x[0]),E(x[1]),E(x[2]))}if(m&&o.push(M(p.normal)),v){var b=p.vertexNormals;o.push(M(b[0]),M(b[1]),M(b[2]))}if(g&&o.push(S(p.color)),y){var w=p.vertexColors;o.push(S(w[0]),S(w[1]),S(w[2]))}}function T(t,e,i){return i?t|1<<e:t&~(1<<e)}function M(t){var e=t.x.toString()+t.y.toString()+t.z.toString();return void 0!==h[e]||(h[e]=a.length/3,a.push(t.x,t.y,t.z)),h[e]}function S(t){var e=t.r.toString()+t.g.toString()+t.b.toString();return void 0!==l[e]||(l[e]=u.length,u.push(t.getHex())),l[e]}function E(t){var e=t.x.toString()+t.y.toString();return void 0!==d[e]||(d[e]=c.length/2,c.push(t.x,t.y)),d[e]}return t.data={},t.data.vertices=n,t.data.normals=a,u.length>0&&(t.data.colors=u),c.length>0&&(t.data.uvs=[c]),t.data.faces=o,t},clone:function(){return(new zg).copy(this)},copy:function(t){var e,i,n,r,s,o;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var a=t.vertices;for(e=0,i=a.length;e<i;e++)this.vertices.push(a[e].clone());var h=t.colors;for(e=0,i=h.length;e<i;e++)this.colors.push(h[e].clone());var u=t.faces;for(e=0,i=u.length;e<i;e++)this.faces.push(u[e].clone());for(e=0,i=t.faceVertexUvs.length;e<i;e++){var l=t.faceVertexUvs[e];for(void 0===this.faceVertexUvs[e]&&(this.faceVertexUvs[e]=[]),n=0,r=l.length;n<r;n++){var c=l[n],d=[];for(s=0,o=c.length;s<o;s++){var p=c[s];d.push(p.clone())}this.faceVertexUvs[e].push(d)}}var f=t.morphTargets;for(e=0,i=f.length;e<i;e++){var m={};if(m.name=f[e].name,void 0!==f[e].vertices)for(m.vertices=[],n=0,r=f[e].vertices.length;n<r;n++)m.vertices.push(f[e].vertices[n].clone());if(void 0!==f[e].normals)for(m.normals=[],n=0,r=f[e].normals.length;n<r;n++)m.normals.push(f[e].normals[n].clone());this.morphTargets.push(m)}var v=t.morphNormals;for(e=0,i=v.length;e<i;e++){var g={};if(void 0!==v[e].vertexNormals)for(g.vertexNormals=[],n=0,r=v[e].vertexNormals.length;n<r;n++){var y=v[e].vertexNormals[n],_={};_.a=y.a.clone(),_.b=y.b.clone(),_.c=y.c.clone(),g.vertexNormals.push(_)}if(void 0!==v[e].faceNormals)for(g.faceNormals=[],n=0,r=v[e].faceNormals.length;n<r;n++)g.faceNormals.push(v[e].faceNormals[n].clone());this.morphNormals.push(g)}var x=t.skinWeights;for(e=0,i=x.length;e<i;e++)this.skinWeights.push(x[e].clone());var b=t.skinIndices;for(e=0,i=b.length;e<i;e++)this.skinIndices.push(b[e].clone());var w=t.lineDistances;for(e=0,i=w.length;e<i;e++)this.lineDistances.push(w[e]);var T=t.boundingBox;null!==T&&(this.boundingBox=T.clone());var M=t.boundingSphere;return null!==M&&(this.boundingSphere=M.clone()),this.elementsNeedUpdate=t.elementsNeedUpdate,this.verticesNeedUpdate=t.verticesNeedUpdate,this.uvsNeedUpdate=t.uvsNeedUpdate,this.normalsNeedUpdate=t.normalsNeedUpdate,this.colorsNeedUpdate=t.colorsNeedUpdate,this.lineDistancesNeedUpdate=t.lineDistancesNeedUpdate,this.groupsNeedUpdate=t.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}});class Wg extends yg{constructor(t,e,i,n,r,s){super(),this.type="BoxBufferGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};var o=this;t=t||1,e=e||1,i=i||1,n=Math.floor(n)||1,r=Math.floor(r)||1,s=Math.floor(s)||1;var a=[],h=[],u=[],l=[],c=0,d=0;function p(t,e,i,n,r,s,p,f,m,v,g){var y,_,x=s/m,b=p/v,w=s/2,T=p/2,M=f/2,S=m+1,E=v+1,L=0,A=0,D=new Lm;for(_=0;_<E;_++){var P=_*b-T;for(y=0;y<S;y++){var C=y*x-w;D[t]=C*n,D[e]=P*r,D[i]=M,h.push(D.x,D.y,D.z),D[t]=0,D[e]=0,D[i]=f>0?1:-1,u.push(D.x,D.y,D.z),l.push(y/m),l.push(1-_/v),L+=1}}for(_=0;_<v;_++)for(y=0;y<m;y++){var O=c+y+S*_,k=c+y+S*(_+1),R=c+(y+1)+S*(_+1),I=c+(y+1)+S*_;a.push(O,k,I),a.push(k,R,I),A+=6}o.addGroup(d,A,g),d+=A,c+=L}p("z","y","x",-1,-1,i,e,t,s,r,0),p("z","y","x",1,-1,i,e,-t,s,r,1),p("x","z","y",1,1,t,i,e,n,s,2),p("x","z","y",1,-1,t,i,-e,n,s,3),p("x","y","z",1,-1,t,e,i,n,r,4),p("x","y","z",-1,-1,t,e,-i,n,r,5),this.setIndex(a),this.setAttribute("position",new ag(h,3)),this.setAttribute("normal",new ag(u,3)),this.setAttribute("uv",new ag(l,2))}}function Gg(t){var e={};for(var i in t)for(var n in e[i]={},t[i]){var r=t[i][n];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture)?e[i][n]=r.clone():Array.isArray(r)?e[i][n]=r.slice():e[i][n]=r}return e}function Vg(t){for(var e={},i=0;i<t.length;i++){var n=Gg(t[i]);for(var r in n)e[r]=n[r]}return e}var Xg={clone:Gg,merge:Vg};function qg(t){Zv.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,void 0!==t&&(void 0!==t.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(t))}function Jg(){$m.call(this),this.type="Camera",this.matrixWorldInverse=new Im,this.projectionMatrix=new Im,this.projectionMatrixInverse=new Im}function Zg(t,e,i,n){Jg.call(this),this.type="PerspectiveCamera",this.fov=void 0!==t?t:50,this.zoom=1,this.near=void 0!==i?i:.1,this.far=void 0!==n?n:2e3,this.focus=10,this.aspect=void 0!==e?e:1,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}qg.prototype=Object.create(Zv.prototype),qg.prototype.constructor=qg,qg.prototype.isShaderMaterial=!0,qg.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Gg(t.uniforms),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.lights=t.lights,this.clipping=t.clipping,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.extensions=t.extensions,this},qg.prototype.toJSON=function(t){var e=Zv.prototype.toJSON.call(this,t);for(var i in e.uniforms={},this.uniforms){var n=this.uniforms[i].value;n&&n.isTexture?e.uniforms[i]={type:"t",value:n.toJSON(t).uuid}:n&&n.isColor?e.uniforms[i]={type:"c",value:n.getHex()}:n&&n.isVector2?e.uniforms[i]={type:"v2",value:n.toArray()}:n&&n.isVector3?e.uniforms[i]={type:"v3",value:n.toArray()}:n&&n.isVector4?e.uniforms[i]={type:"v4",value:n.toArray()}:n&&n.isMatrix3?e.uniforms[i]={type:"m3",value:n.toArray()}:n&&n.isMatrix4?e.uniforms[i]={type:"m4",value:n.toArray()}:e.uniforms[i]={value:n}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;var r={};for(var s in this.extensions)!0===this.extensions[s]&&(r[s]=!0);return Object.keys(r).length>0&&(e.extensions=r),e},Jg.prototype=Object.assign(Object.create($m.prototype),{constructor:Jg,isCamera:!0,copy:function(t,e){return $m.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Lm),this.updateMatrixWorld(!0);var e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()},updateMatrixWorld:function(t){$m.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.getInverse(this.matrixWorld)},updateWorldMatrix:function(t,e){$m.prototype.updateWorldMatrix.call(this,t,e),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),Zg.prototype=Object.assign(Object.create(Jg.prototype),{constructor:Zg,isPerspectiveCamera:!0,copy:function(t,e){return Jg.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){var e=.5*this.getFilmHeight()/t;this.fov=2*mm.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var t=Math.tan(.5*mm.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*mm.RAD2DEG*Math.atan(Math.tan(.5*mm.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,i,n,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=this.near,e=t*Math.tan(.5*mm.DEG2RAD*this.fov)/this.zoom,i=2*e,n=this.aspect*i,r=-.5*n,s=this.view;if(null!==this.view&&this.view.enabled){var o=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/o,e-=s.offsetY*i/a,n*=s.width/o,i*=s.height/a}var h=this.filmOffset;0!==h&&(r+=t*h/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,e,e-i,t,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(t){var e=$m.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}});var Kg=90;function Qg(t,e,i,n){$m.call(this),this.type="CubeCamera";var r=new Zg(Kg,1,t,e);r.up.set(0,-1,0),r.lookAt(new Lm(1,0,0)),this.add(r);var s=new Zg(Kg,1,t,e);s.up.set(0,-1,0),s.lookAt(new Lm(-1,0,0)),this.add(s);var o=new Zg(Kg,1,t,e);o.up.set(0,0,1),o.lookAt(new Lm(0,1,0)),this.add(o);var a=new Zg(Kg,1,t,e);a.up.set(0,0,-1),a.lookAt(new Lm(0,-1,0)),this.add(a);var h=new Zg(Kg,1,t,e);h.up.set(0,-1,0),h.lookAt(new Lm(0,0,1)),this.add(h);var u=new Zg(Kg,1,t,e);u.up.set(0,-1,0),u.lookAt(new Lm(0,0,-1)),this.add(u),n=n||{format:Jf,magFilter:jf,minFilter:jf},this.renderTarget=new $g(i,n),this.renderTarget.texture.name="CubeCamera",this.update=function(t,e){null===this.parent&&this.updateMatrixWorld();var i=t.getRenderTarget(),n=this.renderTarget,l=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,r),t.setRenderTarget(n,1),t.render(e,s),t.setRenderTarget(n,2),t.render(e,o),t.setRenderTarget(n,3),t.render(e,a),t.setRenderTarget(n,4),t.render(e,h),n.texture.generateMipmaps=l,t.setRenderTarget(n,5),t.render(e,u),t.setRenderTarget(i)},this.clear=function(t,e,i,n){for(var r=t.getRenderTarget(),s=this.renderTarget,o=0;o<6;o++)t.setRenderTarget(s,o),t.clear(e,i,n);t.setRenderTarget(r)}}function $g(t,e,i){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=i),wm.call(this,t,t,e)}function ty(t,e,i,n,r,s,o,a,h,u,l,c){xm.call(this,null,s,o,a,h,u,n,r,l,c),this.image={data:t||null,width:e||1,height:i||1},this.magFilter=void 0!==h?h:Nf,this.minFilter=void 0!==u?u:Nf,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}Qg.prototype=Object.create($m.prototype),Qg.prototype.constructor=Qg,$g.prototype=Object.create(wm.prototype),$g.prototype.constructor=$g,$g.prototype.isWebGLCubeRenderTarget=!0,$g.prototype.fromEquirectangularTexture=function(t,e){this.texture.type=e.type,this.texture.format=e.format,this.texture.encoding=e.encoding;var i=new tv,n={uniforms:{tEquirect:{value:null}},vertexShader:["varying vec3 vWorldDirection;","vec3 transformDirection( in vec3 dir, in mat4 matrix ) {","\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );","}","void main() {","\tvWorldDirection = transformDirection( position, modelMatrix );","\t#include <begin_vertex>","\t#include <project_vertex>","}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;","varying vec3 vWorldDirection;","#define RECIPROCAL_PI 0.31830988618","#define RECIPROCAL_PI2 0.15915494","void main() {","\tvec3 direction = normalize( vWorldDirection );","\tvec2 sampleUV;","\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;","\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;","\tgl_FragColor = texture2D( tEquirect, sampleUV );","}"].join("\n")},r=new qg({type:"CubemapFromEquirect",uniforms:Gg(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;var s=new Yg(new Wg(5,5,5),r);i.add(s);var o=new Qg(1,10,1);return o.renderTarget=this,o.renderTarget.texture.name="CubeCameraTexture",o.update(t,i),s.geometry.dispose(),s.material.dispose(),this},ty.prototype=Object.create(xm.prototype),ty.prototype.constructor=ty,ty.prototype.isDataTexture=!0;var ey=new gv,iy=new Lm;function ny(t,e,i,n,r,s){this.planes=[void 0!==t?t:new Dv,void 0!==e?e:new Dv,void 0!==i?i:new Dv,void 0!==n?n:new Dv,void 0!==r?r:new Dv,void 0!==s?s:new Dv]}Object.assign(ny.prototype,{set:function(t,e,i,n,r,s){var o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(i),o[3].copy(n),o[4].copy(r),o[5].copy(s),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){for(var e=this.planes,i=0;i<6;i++)e[i].copy(t.planes[i]);return this},setFromProjectionMatrix:function(t){var e=this.planes,i=t.elements,n=i[0],r=i[1],s=i[2],o=i[3],a=i[4],h=i[5],u=i[6],l=i[7],c=i[8],d=i[9],p=i[10],f=i[11],m=i[12],v=i[13],g=i[14],y=i[15];return e[0].setComponents(o-n,l-a,f-c,y-m).normalize(),e[1].setComponents(o+n,l+a,f+c,y+m).normalize(),e[2].setComponents(o+r,l+h,f+d,y+v).normalize(),e[3].setComponents(o-r,l-h,f-d,y-v).normalize(),e[4].setComponents(o-s,l-u,f-p,y-g).normalize(),e[5].setComponents(o+s,l+u,f+p,y+g).normalize(),this},intersectsObject:function(t){var e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ey.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ey)},intersectsSprite:function(t){return ey.center.set(0,0,0),ey.radius=.7071067811865476,ey.applyMatrix4(t.matrixWorld),this.intersectsSphere(ey)},intersectsSphere:function(t){for(var e=this.planes,i=t.center,n=-t.radius,r=0;r<6;r++){if(e[r].distanceToPoint(i)<n)return!1}return!0},intersectsBox:function(t){for(var e=this.planes,i=0;i<6;i++){var n=e[i];if(iy.x=n.normal.x>0?t.max.x:t.min.x,iy.y=n.normal.y>0?t.max.y:t.min.y,iy.z=n.normal.z>0?t.max.z:t.min.z,n.distanceToPoint(iy)<0)return!1}return!0},containsPoint:function(t){for(var e=this.planes,i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}});var ry={common:{diffuse:{value:new Wv(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new gm},uv2Transform:{value:new gm},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new vm(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Wv(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new Wv(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new gm}},sprite:{diffuse:{value:new Wv(15658734)},opacity:{value:1},center:{value:new vm(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new gm}}};function sy(){var t=null,e=!1,i=null;function n(r,s){!1!==e&&(i(r,s),t.requestAnimationFrame(n))}return{start:function(){!0!==e&&null!==i&&(t.requestAnimationFrame(n),e=!0)},stop:function(){e=!1},setAnimationLoop:function(t){i=t},setContext:function(e){t=e}}}function oy(t,e){var i=e.isWebGL2,n=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),n.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);var i=n.get(e);i&&(t.deleteBuffer(i.buffer),n.delete(e))},update:function(e,r){e.isInterleavedBufferAttribute&&(e=e.data);var s=n.get(e);void 0===s?n.set(e,function(e,i){var n=e.array,r=e.usage,s=t.createBuffer();t.bindBuffer(i,s),t.bufferData(i,n,r),e.onUploadCallback();var o=5126;return n instanceof Float32Array?o=5126:n instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):n instanceof Uint16Array?o=5123:n instanceof Int16Array?o=5122:n instanceof Uint32Array?o=5125:n instanceof Int32Array?o=5124:n instanceof Int8Array?o=5120:n instanceof Uint8Array&&(o=5121),{buffer:s,type:o,bytesPerElement:n.BYTES_PER_ELEMENT,version:e.version}}(e,r)):s.version<e.version&&(!function(e,n,r){var s=n.array,o=n.updateRange;t.bindBuffer(r,e),-1===o.count?t.bufferSubData(r,0,s):(i?t.bufferSubData(r,o.offset*s.BYTES_PER_ELEMENT,s,o.offset,o.count):t.bufferSubData(r,o.offset*s.BYTES_PER_ELEMENT,s.subarray(o.offset,o.offset+o.count)),o.count=-1)}(s.buffer,e,r),s.version=e.version)}}}function ay(t,e,i,n){zg.call(this),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:i,heightSegments:n},this.fromBufferGeometry(new hy(t,e,i,n)),this.mergeVertices()}function hy(t,e,i,n){yg.call(this),this.type="PlaneBufferGeometry",this.parameters={width:t,height:e,widthSegments:i,heightSegments:n};var r,s,o=(t=t||1)/2,a=(e=e||1)/2,h=Math.floor(i)||1,u=Math.floor(n)||1,l=h+1,c=u+1,d=t/h,p=e/u,f=[],m=[],v=[],g=[];for(s=0;s<c;s++){var y=s*p-a;for(r=0;r<l;r++){var _=r*d-o;m.push(_,-y,0),v.push(0,0,1),g.push(r/h),g.push(1-s/u)}}for(s=0;s<u;s++)for(r=0;r<h;r++){var x=r+l*s,b=r+l*(s+1),w=r+1+l*(s+1),T=r+1+l*s;f.push(x,b,T),f.push(b,w,T)}this.setIndex(f),this.setAttribute("position",new ag(m,3)),this.setAttribute("normal",new ag(v,3)),this.setAttribute("uv",new ag(g,2))}ay.prototype=Object.create(zg.prototype),ay.prototype.constructor=ay,hy.prototype=Object.create(yg.prototype),hy.prototype.constructor=hy;var uy={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n return m[ 2 ][ 3 ] == - 1.0;\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_maxMipLevel 8.0\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_maxTileSize 256.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction) {\n vec3 absDirection = abs(direction);\n float face = -1.0;\n if (absDirection.x > absDirection.z) {\n if (absDirection.x > absDirection.y)\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if (absDirection.z > absDirection.y)\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n}\nvec2 getUV(vec3 direction, float face) {\n vec2 uv;\n if (face == 0.0) {\n uv = vec2(-direction.z, direction.y) / abs(direction.x);\n } else if (face == 1.0) {\n uv = vec2(direction.x, -direction.z) / abs(direction.y);\n } else if (face == 2.0) {\n uv = direction.xy / abs(direction.z);\n } else if (face == 3.0) {\n uv = vec2(direction.z, direction.y) / abs(direction.x);\n } else if (face == 4.0) {\n uv = direction.xz / abs(direction.y);\n } else {\n uv = vec2(-direction.x, direction.y) / abs(direction.z);\n }\n return 0.5 * (uv + 1.0);\n}\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\n float face = getFace(direction);\n float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\n mipInt = max(mipInt, cubeUV_minMipLevel);\n float faceSize = exp2(mipInt);\n float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\n vec2 uv = getUV(direction, face) * (faceSize - 1.0);\n vec2 f = fract(uv);\n uv += 0.5 - f;\n if (face > 2.0) {\n uv.y += faceSize;\n face -= 3.0;\n }\n uv.x += face * faceSize;\n if(mipInt < cubeUV_maxMipLevel){\n uv.y += 2.0 * cubeUV_maxTileSize;\n }\n uv.y += filterInt * 2.0 * cubeUV_minTileSize;\n uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\n uv *= texelSize;\n vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.x += texelSize;\n vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.y += texelSize;\n vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n uv.x -= texelSize;\n vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n vec3 tm = mix(tl, tr, f.x);\n vec3 bm = mix(bl, br, f.x);\n return mix(tm, bm, f.y);\n}\n#define r0 1.0\n#define v0 0.339\n#define m0 -2.0\n#define r1 0.8\n#define v1 0.276\n#define m1 -1.0\n#define r4 0.4\n#define v4 0.046\n#define m4 2.0\n#define r5 0.305\n#define v5 0.016\n#define m5 3.0\n#define r6 0.21\n#define v6 0.0038\n#define m6 4.0\nfloat roughnessToMip(float roughness) {\n float mip = 0.0;\n if (roughness >= r1) {\n mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\n } else if (roughness >= r4) {\n mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\n } else if (roughness >= r5) {\n mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\n } else if (roughness >= r6) {\n mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\n } else {\n mip = -2.0 * log2(1.16 * roughness); }\n return mip;\n}\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\n float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\n float mipF = fract(mip);\n float mipInt = floor(mip);\n vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\n if (mipF == 0.0) {\n return vec4(color0, 1.0);\n } else {\n vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\n return vec4(mix(color0, color1, mipF), 1.0);\n }\n}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\t\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t vec3 reflectVec = reflect( -viewDir, normal );\n\t\t reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) { \n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\n}",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSPARENCY\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSPARENCY\n\tuniform float transparency;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSPARENCY\n\t\tdiffuseColor.a *= saturate( 1. - transparency + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},ly={basic:{uniforms:Vg([ry.common,ry.specularmap,ry.envmap,ry.aomap,ry.lightmap,ry.fog]),vertexShader:uy.meshbasic_vert,fragmentShader:uy.meshbasic_frag},lambert:{uniforms:Vg([ry.common,ry.specularmap,ry.envmap,ry.aomap,ry.lightmap,ry.emissivemap,ry.fog,ry.lights,{emissive:{value:new Wv(0)}}]),vertexShader:uy.meshlambert_vert,fragmentShader:uy.meshlambert_frag},phong:{uniforms:Vg([ry.common,ry.specularmap,ry.envmap,ry.aomap,ry.lightmap,ry.emissivemap,ry.bumpmap,ry.normalmap,ry.displacementmap,ry.fog,ry.lights,{emissive:{value:new Wv(0)},specular:{value:new Wv(1118481)},shininess:{value:30}}]),vertexShader:uy.meshphong_vert,fragmentShader:uy.meshphong_frag},standard:{uniforms:Vg([ry.common,ry.envmap,ry.aomap,ry.lightmap,ry.emissivemap,ry.bumpmap,ry.normalmap,ry.displacementmap,ry.roughnessmap,ry.metalnessmap,ry.fog,ry.lights,{emissive:{value:new Wv(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:uy.meshphysical_vert,fragmentShader:uy.meshphysical_frag},toon:{uniforms:Vg([ry.common,ry.specularmap,ry.aomap,ry.lightmap,ry.emissivemap,ry.bumpmap,ry.normalmap,ry.displacementmap,ry.gradientmap,ry.fog,ry.lights,{emissive:{value:new Wv(0)},specular:{value:new Wv(1118481)},shininess:{value:30}}]),vertexShader:uy.meshtoon_vert,fragmentShader:uy.meshtoon_frag},matcap:{uniforms:Vg([ry.common,ry.bumpmap,ry.normalmap,ry.displacementmap,ry.fog,{matcap:{value:null}}]),vertexShader:uy.meshmatcap_vert,fragmentShader:uy.meshmatcap_frag},points:{uniforms:Vg([ry.points,ry.fog]),vertexShader:uy.points_vert,fragmentShader:uy.points_frag},dashed:{uniforms:Vg([ry.common,ry.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:uy.linedashed_vert,fragmentShader:uy.linedashed_frag},depth:{uniforms:Vg([ry.common,ry.displacementmap]),vertexShader:uy.depth_vert,fragmentShader:uy.depth_frag},normal:{uniforms:Vg([ry.common,ry.bumpmap,ry.normalmap,ry.displacementmap,{opacity:{value:1}}]),vertexShader:uy.normal_vert,fragmentShader:uy.normal_frag},sprite:{uniforms:Vg([ry.sprite,ry.fog]),vertexShader:uy.sprite_vert,fragmentShader:uy.sprite_frag},background:{uniforms:{uvTransform:{value:new gm},t2D:{value:null}},vertexShader:uy.background_vert,fragmentShader:uy.background_frag},cube:{uniforms:Vg([ry.envmap,{opacity:{value:1}}]),vertexShader:uy.cube_vert,fragmentShader:uy.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:uy.equirect_vert,fragmentShader:uy.equirect_frag},distanceRGBA:{uniforms:Vg([ry.common,ry.displacementmap,{referencePosition:{value:new Lm},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:uy.distanceRGBA_vert,fragmentShader:uy.distanceRGBA_frag},shadow:{uniforms:Vg([ry.lights,ry.fog,{color:{value:new Wv(0)},opacity:{value:1}}]),vertexShader:uy.shadow_vert,fragmentShader:uy.shadow_frag}};function cy(t,e,i,n){var r,s,o=new Wv(0),a=0,h=null,u=0,l=null;function c(t,i){e.buffers.color.setClear(t.r,t.g,t.b,i,n)}return{getClearColor:function(){return o},setClearColor:function(t,e){o.set(t),c(o,a=void 0!==e?e:1)},getClearAlpha:function(){return a},setClearAlpha:function(t){c(o,a=t)},render:function(e,n,d,p){var f=n.background,m=t.xr,v=m.getSession&&m.getSession();if(v&&"additive"===v.environmentBlendMode&&(f=null),null===f?c(o,a):f&&f.isColor&&(c(f,1),p=!0),(t.autoClear||p)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),f&&(f.isCubeTexture||f.isWebGLCubeRenderTarget||f.mapping===Rf)){void 0===s&&((s=new Yg(new Wg(1,1,1),new qg({type:"BackgroundCubeMaterial",uniforms:Gg(ly.cube.uniforms),vertexShader:ly.cube.vertexShader,fragmentShader:ly.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),s.geometry.deleteAttribute("uv"),s.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(s.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(s));var g=f.isWebGLCubeRenderTarget?f.texture:f;s.material.uniforms.envMap.value=g,s.material.uniforms.flipEnvMap.value=g.isCubeTexture?-1:1,h===f&&u===g.version&&l===t.toneMapping||(s.material.needsUpdate=!0,h=f,u=g.version,l=t.toneMapping),e.unshift(s,s.geometry,s.material,0,0,null)}else f&&f.isTexture&&(void 0===r&&((r=new Yg(new hy(2,2),new qg({type:"BackgroundMaterial",uniforms:Gg(ly.background.uniforms),vertexShader:ly.background.vertexShader,fragmentShader:ly.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),Object.defineProperty(r.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(r)),r.material.uniforms.t2D.value=f,!0===f.matrixAutoUpdate&&f.updateMatrix(),r.material.uniforms.uvTransform.value.copy(f.matrix),h===f&&u===f.version&&l===t.toneMapping||(r.material.needsUpdate=!0,h=f,u=f.version,l=t.toneMapping),e.unshift(r,r.geometry,r.material,0,0,null))}}}function dy(t,e,i,n){var r,s=n.isWebGL2;this.setMode=function(t){r=t},this.render=function(e,n){t.drawArrays(r,e,n),i.update(n,r)},this.renderInstances=function(n,o,a,h){if(0!==h){var u,l;if(s)u=t,l="drawArraysInstanced";else if(l="drawArraysInstancedANGLE",null===(u=e.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");u[l](r,o,a,h),i.update(a,r,h)}}}function py(t,e,i){var n;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext,o=void 0!==i.precision?i.precision:"highp",a=r(o);a!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",a,"instead."),o=a);var h=!0===i.logarithmicDepthBuffer,u=t.getParameter(34930),l=t.getParameter(35660),c=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),f=t.getParameter(36347),m=t.getParameter(36348),v=t.getParameter(36349),g=l>0,y=s||!!e.get("OES_texture_float");return{isWebGL2:s,getMaxAnisotropy:function(){if(void 0!==n)return n;var i=e.get("EXT_texture_filter_anisotropic");return n=null!==i?t.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:r,precision:o,logarithmicDepthBuffer:h,maxTextures:u,maxVertexTextures:l,maxTextureSize:c,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:v,vertexTextures:g,floatFragmentTextures:y,floatVertexTextures:g&&y,maxSamples:s?t.getParameter(36183):0}}function fy(){var t=this,e=null,i=0,n=!1,r=!1,s=new Dv,o=new gm,a={value:null,needsUpdate:!1};function h(){a.value!==e&&(a.value=e,a.needsUpdate=i>0),t.numPlanes=i,t.numIntersection=0}function u(e,i,n,r){var h=null!==e?e.length:0,u=null;if(0!==h){if(u=a.value,!0!==r||null===u){var l=n+4*h,c=i.matrixWorldInverse;o.getNormalMatrix(c),(null===u||u.length<l)&&(u=new Float32Array(l));for(var d=0,p=n;d!==h;++d,p+=4)s.copy(e[d]).applyMatrix4(c,o),s.normal.toArray(u,p),u[p+3]=s.constant}a.value=u,a.needsUpdate=!0}return t.numPlanes=h,t.numIntersection=0,u}this.uniform=a,this.numPlanes=0,this.numIntersection=0,this.init=function(t,r,s){var o=0!==t.length||r||0!==i||n;return n=r,e=u(t,s,0),i=t.length,o},this.beginShadows=function(){r=!0,u(null)},this.endShadows=function(){r=!1,h()},this.setState=function(t,s,o,l,c,d){if(!n||null===t||0===t.length||r&&!o)r?u(null):h();else{var p=r?0:i,f=4*p,m=c.clippingState||null;a.value=m,m=u(t,l,f,d);for(var v=0;v!==f;++v)m[v]=e[v];c.clippingState=m,this.numIntersection=s?this.numPlanes:0,this.numPlanes+=p}}}function my(t){var e={};return{get:function(i){if(void 0!==e[i])return e[i];var n;switch(i){case"WEBGL_depth_texture":n=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=t.getExtension(i)}return null===n&&console.warn("THREE.WebGLRenderer: "+i+" extension not supported."),e[i]=n,n}}}function vy(t,e,i){var n=new WeakMap,r=new WeakMap;function s(t){var o=t.target,a=n.get(o);for(var h in null!==a.index&&e.remove(a.index),a.attributes)e.remove(a.attributes[h]);o.removeEventListener("dispose",s),n.delete(o);var u=r.get(a);u&&(e.remove(u),r.delete(a)),i.memory.geometries--}function o(t){var i=[],n=t.index,s=t.attributes.position,o=0;if(null!==n){var a=n.array;o=n.version;for(var h=0,u=a.length;h<u;h+=3){var l=a[h+0],c=a[h+1],d=a[h+2];i.push(l,c,c,d,d,l)}}else{a=s.array;o=s.version;for(h=0,u=a.length/3-1;h<u;h+=3){l=h+0,c=h+1,d=h+2;i.push(l,c,c,d,d,l)}}var p=new(lg(i)>65535?og:rg)(i,1);p.version=o,e.update(p,34963);var f=r.get(t);f&&e.remove(f),r.set(t,p)}return{get:function(t,e){var r=n.get(e);return r||(e.addEventListener("dispose",s),e.isBufferGeometry?r=e:e.isGeometry&&(void 0===e._bufferGeometry&&(e._bufferGeometry=(new yg).setFromObject(t)),r=e._bufferGeometry),n.set(e,r),i.memory.geometries++,r)},update:function(t){var i=t.index,n=t.attributes;for(var r in null!==i&&e.update(i,34963),n)e.update(n[r],34962);var s=t.morphAttributes;for(var r in s)for(var o=s[r],a=0,h=o.length;a<h;a++)e.update(o[a],34962)},getWireframeAttribute:function(t){var e=r.get(t);if(e){var i=t.index;null!==i&&e.version<i.version&&o(t)}else o(t);return r.get(t)}}}function gy(t,e,i,n){var r,s,o,a=n.isWebGL2;this.setMode=function(t){r=t},this.setIndex=function(t){s=t.type,o=t.bytesPerElement},this.render=function(e,n){t.drawElements(r,n,s,e*o),i.update(n,r)},this.renderInstances=function(n,h,u,l){if(0!==l){var c,d;if(a)c=t,d="drawElementsInstanced";else if(d="drawElementsInstancedANGLE",null===(c=e.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");c[d](r,u,s,h*o,l),i.update(u,r,l)}}}function yy(t){var e={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:e,programs:null,autoReset:!0,reset:function(){e.frame++,e.calls=0,e.triangles=0,e.points=0,e.lines=0},update:function(t,i,n){switch(n=n||1,e.calls++,i){case 4:e.triangles+=n*(t/3);break;case 1:e.lines+=n*(t/2);break;case 3:e.lines+=n*(t-1);break;case 2:e.lines+=n*t;break;case 0:e.points+=n*t;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}function _y(t,e){return Math.abs(e[1])-Math.abs(t[1])}function xy(t){var e={},i=new Float32Array(8);return{update:function(n,r,s,o){var a=n.morphTargetInfluences,h=void 0===a?0:a.length,u=e[r.id];if(void 0===u){u=[];for(var l=0;l<h;l++)u[l]=[l,0];e[r.id]=u}var c=s.morphTargets&&r.morphAttributes.position,d=s.morphNormals&&r.morphAttributes.normal;for(l=0;l<h;l++){0!==(f=u[l])[1]&&(c&&r.deleteAttribute("morphTarget"+l),d&&r.deleteAttribute("morphNormal"+l))}for(l=0;l<h;l++){(f=u[l])[0]=l,f[1]=a[l]}u.sort(_y);var p=0;for(l=0;l<8;l++){var f;if(f=u[l]){var m=f[0],v=f[1];if(v){c&&r.setAttribute("morphTarget"+l,c[m]),d&&r.setAttribute("morphNormal"+l,d[m]),i[l]=v,p+=v;continue}}i[l]=0}var g=r.morphTargetsRelative?1:1-p;o.getUniforms().setValue(t,"morphTargetBaseInfluence",g),o.getUniforms().setValue(t,"morphTargetInfluences",i)}}}function by(t,e,i,n){var r=new WeakMap;return{update:function(t){var s=n.render.frame,o=t.geometry,a=e.get(t,o);return r.get(a)!==s&&(o.isGeometry&&a.updateFromObject(t),e.update(a),r.set(a,s)),t.isInstancedMesh&&i.update(t.instanceMatrix,34962),a},dispose:function(){r=new WeakMap}}}function wy(t,e,i,n,r,s,o,a,h,u){t=void 0!==t?t:[],e=void 0!==e?e:301,o=void 0!==o?o:Jf,xm.call(this,t,e,i,n,r,s,o,a,h,u),this.flipY=!1}function Ty(t,e,i,n){xm.call(this,null),this.image={data:t||null,width:e||1,height:i||1,depth:n||1},this.magFilter=Nf,this.minFilter=Nf,this.wrapR=Yf,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}function My(t,e,i,n){xm.call(this,null),this.image={data:t||null,width:e||1,height:i||1,depth:n||1},this.magFilter=Nf,this.minFilter=Nf,this.wrapR=Yf,this.generateMipmaps=!1,this.flipY=!1,this.needsUpdate=!0}ly.physical={uniforms:Vg([ly.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new vm(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new Wv(0)},transparency:{value:0}}]),vertexShader:uy.meshphysical_vert,fragmentShader:uy.meshphysical_frag},wy.prototype=Object.create(xm.prototype),wy.prototype.constructor=wy,wy.prototype.isCubeTexture=!0,Object.defineProperty(wy.prototype,"images",{get:function(){return this.image},set:function(t){this.image=t}}),Ty.prototype=Object.create(xm.prototype),Ty.prototype.constructor=Ty,Ty.prototype.isDataTexture2DArray=!0,My.prototype=Object.create(xm.prototype),My.prototype.constructor=My,My.prototype.isDataTexture3D=!0;var Sy=new xm,Ey=new Ty,Ly=new My,Ay=new wy,Dy=[],Py=[],Cy=new Float32Array(16),Oy=new Float32Array(9),ky=new Float32Array(4);function Ry(t,e,i){var n=t[0];if(n<=0||n>0)return t;var r=e*i,s=Dy[r];if(void 0===s&&(s=new Float32Array(r),Dy[r]=s),0!==e){n.toArray(s,0);for(var o=1,a=0;o!==e;++o)a+=i,t[o].toArray(s,a)}return s}function Iy(t,e){if(t.length!==e.length)return!1;for(var i=0,n=t.length;i<n;i++)if(t[i]!==e[i])return!1;return!0}function Yy(t,e){for(var i=0,n=e.length;i<n;i++)t[i]=e[i]}function Fy(t,e){var i=Py[e];void 0===i&&(i=new Int32Array(e),Py[e]=i);for(var n=0;n!==e;++n)i[n]=t.allocateTextureUnit();return i}function Ny(t,e){var i=this.cache;i[0]!==e&&(t.uniform1f(this.addr,e),i[0]=e)}function By(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y||(t.uniform2f(this.addr,e.x,e.y),i[0]=e.x,i[1]=e.y);else{if(Iy(i,e))return;t.uniform2fv(this.addr,e),Yy(i,e)}}function Uy(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z||(t.uniform3f(this.addr,e.x,e.y,e.z),i[0]=e.x,i[1]=e.y,i[2]=e.z);else if(void 0!==e.r)i[0]===e.r&&i[1]===e.g&&i[2]===e.b||(t.uniform3f(this.addr,e.r,e.g,e.b),i[0]=e.r,i[1]=e.g,i[2]=e.b);else{if(Iy(i,e))return;t.uniform3fv(this.addr,e),Yy(i,e)}}function jy(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z&&i[3]===e.w||(t.uniform4f(this.addr,e.x,e.y,e.z,e.w),i[0]=e.x,i[1]=e.y,i[2]=e.z,i[3]=e.w);else{if(Iy(i,e))return;t.uniform4fv(this.addr,e),Yy(i,e)}}function Hy(t,e){var i=this.cache,n=e.elements;if(void 0===n){if(Iy(i,e))return;t.uniformMatrix2fv(this.addr,!1,e),Yy(i,e)}else{if(Iy(i,n))return;ky.set(n),t.uniformMatrix2fv(this.addr,!1,ky),Yy(i,n)}}function zy(t,e){var i=this.cache,n=e.elements;if(void 0===n){if(Iy(i,e))return;t.uniformMatrix3fv(this.addr,!1,e),Yy(i,e)}else{if(Iy(i,n))return;Oy.set(n),t.uniformMatrix3fv(this.addr,!1,Oy),Yy(i,n)}}function Wy(t,e){var i=this.cache,n=e.elements;if(void 0===n){if(Iy(i,e))return;t.uniformMatrix4fv(this.addr,!1,e),Yy(i,e)}else{if(Iy(i,n))return;Cy.set(n),t.uniformMatrix4fv(this.addr,!1,Cy),Yy(i,n)}}function Gy(t,e,i){var n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.safeSetTexture2D(e||Sy,r)}function Vy(t,e,i){var n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.setTexture2DArray(e||Ey,r)}function Xy(t,e,i){var n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.setTexture3D(e||Ly,r)}function qy(t,e,i){var n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(t.uniform1i(this.addr,r),n[0]=r),i.safeSetTextureCube(e||Ay,r)}function Jy(t,e){var i=this.cache;i[0]!==e&&(t.uniform1i(this.addr,e),i[0]=e)}function Zy(t,e){var i=this.cache;Iy(i,e)||(t.uniform2iv(this.addr,e),Yy(i,e))}function Ky(t,e){var i=this.cache;Iy(i,e)||(t.uniform3iv(this.addr,e),Yy(i,e))}function Qy(t,e){var i=this.cache;Iy(i,e)||(t.uniform4iv(this.addr,e),Yy(i,e))}function $y(t,e){var i=this.cache;i[0]!==e&&(t.uniform1ui(this.addr,e),i[0]=e)}function t_(t,e){t.uniform1fv(this.addr,e)}function e_(t,e){t.uniform1iv(this.addr,e)}function i_(t,e){t.uniform2iv(this.addr,e)}function n_(t,e){t.uniform3iv(this.addr,e)}function r_(t,e){t.uniform4iv(this.addr,e)}function s_(t,e){var i=Ry(e,this.size,2);t.uniform2fv(this.addr,i)}function o_(t,e){var i=Ry(e,this.size,3);t.uniform3fv(this.addr,i)}function a_(t,e){var i=Ry(e,this.size,4);t.uniform4fv(this.addr,i)}function h_(t,e){var i=Ry(e,this.size,4);t.uniformMatrix2fv(this.addr,!1,i)}function u_(t,e){var i=Ry(e,this.size,9);t.uniformMatrix3fv(this.addr,!1,i)}function l_(t,e){var i=Ry(e,this.size,16);t.uniformMatrix4fv(this.addr,!1,i)}function c_(t,e,i){var n=e.length,r=Fy(i,n);t.uniform1iv(this.addr,r);for(var s=0;s!==n;++s)i.safeSetTexture2D(e[s]||Sy,r[s])}function d_(t,e,i){var n=e.length,r=Fy(i,n);t.uniform1iv(this.addr,r);for(var s=0;s!==n;++s)i.safeSetTextureCube(e[s]||Ay,r[s])}function p_(t,e,i){this.id=t,this.addr=i,this.cache=[],this.setValue=function(t){switch(t){case 5126:return Ny;case 35664:return By;case 35665:return Uy;case 35666:return jy;case 35674:return Hy;case 35675:return zy;case 35676:return Wy;case 5124:case 35670:return Jy;case 35667:case 35671:return Zy;case 35668:case 35672:return Ky;case 35669:case 35673:return Qy;case 5125:return $y;case 35678:case 36198:case 36298:case 36306:case 35682:return Gy;case 35679:case 36299:case 36307:return Xy;case 35680:case 36300:case 36308:case 36293:return qy;case 36289:case 36303:case 36311:case 36292:return Vy}}(e.type)}function f_(t,e,i){this.id=t,this.addr=i,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return t_;case 35664:return s_;case 35665:return o_;case 35666:return a_;case 35674:return h_;case 35675:return u_;case 35676:return l_;case 5124:case 35670:return e_;case 35667:case 35671:return i_;case 35668:case 35672:return n_;case 35669:case 35673:return r_;case 35678:case 36198:case 36298:case 36306:case 35682:return c_;case 35680:case 36300:case 36308:case 36293:return d_}}(e.type)}function m_(t){this.id=t,this.seq=[],this.map={}}f_.prototype.updateCache=function(t){var e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Yy(e,t)},m_.prototype.setValue=function(t,e,i){for(var n=this.seq,r=0,s=n.length;r!==s;++r){var o=n[r];o.setValue(t,e[o.id],i)}};var v_=/([\w\d_]+)(\])?(\[|\.)?/g;function g_(t,e){t.seq.push(e),t.map[e.id]=e}function y_(t,e,i){var n=t.name,r=n.length;for(v_.lastIndex=0;;){var s=v_.exec(n),o=v_.lastIndex,a=s[1],h="]"===s[2],u=s[3];if(h&&(a|=0),void 0===u||"["===u&&o+2===r){g_(i,void 0===u?new p_(a,t,e):new f_(a,t,e));break}var l=i.map[a];void 0===l&&g_(i,l=new m_(a)),i=l}}function __(t,e){this.seq=[],this.map={};for(var i=t.getProgramParameter(e,35718),n=0;n<i;++n){var r=t.getActiveUniform(e,n);y_(r,t.getUniformLocation(e,r.name),this)}}function x_(t,e,i){var n=t.createShader(e);return t.shaderSource(n,i),t.compileShader(n),n}__.prototype.setValue=function(t,e,i,n){var r=this.map[e];void 0!==r&&r.setValue(t,i,n)},__.prototype.setOptional=function(t,e,i){var n=e[i];void 0!==n&&this.setValue(t,i,n)},__.upload=function(t,e,i,n){for(var r=0,s=e.length;r!==s;++r){var o=e[r],a=i[o.id];!1!==a.needsUpdate&&o.setValue(t,a.value,n)}},__.seqWithValue=function(t,e){for(var i=[],n=0,r=t.length;n!==r;++n){var s=t[n];s.id in e&&i.push(s)}return i};var b_=0;function w_(t){switch(t){case sm:return["Linear","( value )"];case om:return["sRGB","( value )"];case am:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:throw new Error("unsupported encoding: "+t)}}function T_(t,e,i){var n=t.getShaderParameter(e,35713),r=t.getShaderInfoLog(e).trim();return n&&""===r?"":"THREE.WebGLShader: gl.getShaderInfoLog() "+i+"\n"+r+function(t){for(var e=t.split("\n"),i=0;i<e.length;i++)e[i]=i+1+": "+e[i];return e.join("\n")}(t.getShaderSource(e))}function M_(t,e){var i=w_(e);return"vec4 "+t+"( vec4 value ) { return "+i[0]+"ToLinear"+i[1]+"; }"}function S_(t,e){var i;switch(e){case 1:i="Linear";break;case 2:i="Reinhard";break;case 3:i="Uncharted2";break;case 4:i="OptimizedCineon";break;case 5:i="ACESFilmic";break;default:throw new Error("unsupported toneMapping: "+e)}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function E_(t){return""!==t}function L_(t,e){return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function A_(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}var D_=/^[ \t]*#include +<([\w\d./]+)>/gm;function P_(t){return t.replace(D_,C_)}function C_(t,e){var i=uy[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return P_(i)}var O_=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,k_=/#pragma unroll_loop_start[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}[\s]+?#pragma unroll_loop_end/g;function R_(t){return t.replace(k_,Y_).replace(O_,I_)}function I_(t,e,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Y_(t,e,i,n)}function Y_(t,e,i,n){for(var r="",s=parseInt(e);s<parseInt(i);s++)r+=n.replace(/\[ i \]/g,"[ "+s+" ]").replace(/UNROLLED_LOOP_INDEX/g,s);return r}function F_(t){var e="precision "+t.precision+" float;\nprecision "+t.precision+" int;";return"highp"===t.precision?e+="\n#define HIGH_PRECISION":"mediump"===t.precision?e+="\n#define MEDIUM_PRECISION":"lowp"===t.precision&&(e+="\n#define LOW_PRECISION"),e}function N_(t,e,i){var n,r,s,o,a,h=t.getContext(),u=i.defines,l=i.vertexShader,c=i.fragmentShader,d=function(t){var e="SHADOWMAP_TYPE_BASIC";return 1===t.shadowMapType?e="SHADOWMAP_TYPE_PCF":2===t.shadowMapType?e="SHADOWMAP_TYPE_PCF_SOFT":3===t.shadowMapType&&(e="SHADOWMAP_TYPE_VSM"),e}(i),p=function(t){var e="ENVMAP_TYPE_CUBE";if(t.envMap)switch(t.envMapMode){case 301:case 302:e="ENVMAP_TYPE_CUBE";break;case Rf:case 307:e="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:e="ENVMAP_TYPE_EQUIREC";break;case 305:e="ENVMAP_TYPE_SPHERE"}return e}(i),f=function(t){var e="ENVMAP_MODE_REFLECTION";if(t.envMap)switch(t.envMapMode){case 302:case 304:e="ENVMAP_MODE_REFRACTION"}return e}(i),m=function(t){var e="ENVMAP_BLENDING_NONE";if(t.envMap)switch(t.combine){case 0:e="ENVMAP_BLENDING_MULTIPLY";break;case 1:e="ENVMAP_BLENDING_MIX";break;case 2:e="ENVMAP_BLENDING_ADD"}return e}(i),v=t.gammaFactor>0?t.gammaFactor:1,g=i.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(E_).join("\n")}(i),y=function(t){var e=[];for(var i in t){var n=t[i];!1!==n&&e.push("#define "+i+" "+n)}return e.join("\n")}(u),_=h.createProgram();if(i.isRawShaderMaterial?((n=[y].filter(E_).join("\n")).length>0&&(n+="\n"),(r=[g,y].filter(E_).join("\n")).length>0&&(r+="\n")):(n=[F_(i),"#define SHADER_NAME "+i.shaderName,y,i.instancing?"#define USE_INSTANCING":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+v,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+f:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+d:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(E_).join("\n"),r=[g,F_(i),"#define SHADER_NAME "+i.shaderName,y,i.alphaTest?"#define ALPHATEST "+i.alphaTest+(i.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+v,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+p:"",i.envMap?"#define "+f:"",i.envMap?"#define "+m:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.sheen?"#define USE_SHEEN":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+d:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(i.extensionShaderTextureLOD||i.envMap)&&i.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?uy.tonemapping_pars_fragment:"",0!==i.toneMapping?S_("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.outputEncoding||i.mapEncoding||i.matcapEncoding||i.envMapEncoding||i.emissiveMapEncoding||i.lightMapEncoding?uy.encodings_pars_fragment:"",i.mapEncoding?M_("mapTexelToLinear",i.mapEncoding):"",i.matcapEncoding?M_("matcapTexelToLinear",i.matcapEncoding):"",i.envMapEncoding?M_("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMapEncoding?M_("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.lightMapEncoding?M_("lightMapTexelToLinear",i.lightMapEncoding):"",i.outputEncoding?(s="linearToOutputTexel",o=i.outputEncoding,a=w_(o),"vec4 "+s+"( vec4 value ) { return LinearTo"+a[0]+a[1]+"; }"):"",i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(E_).join("\n")),l=A_(l=L_(l=P_(l),i),i),c=A_(c=L_(c=P_(c),i),i),l=R_(l),c=R_(c),i.isWebGL2&&!i.isRawShaderMaterial){var x=!1,b=/^\s*#version\s+300\s+es\s*\n/;i.isShaderMaterial&&null!==l.match(b)&&null!==c.match(b)&&(x=!0,l=l.replace(b,""),c=c.replace(b,"")),n=["#version 300 es\n","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+n,r=["#version 300 es\n","#define varying in",x?"":"out highp vec4 pc_fragColor;",x?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+r}var w,T,M=r+c,S=x_(h,35633,n+l),E=x_(h,35632,M);if(h.attachShader(_,S),h.attachShader(_,E),void 0!==i.index0AttributeName?h.bindAttribLocation(_,0,i.index0AttributeName):!0===i.morphTargets&&h.bindAttribLocation(_,0,"position"),h.linkProgram(_),t.debug.checkShaderErrors){var L=h.getProgramInfoLog(_).trim(),A=h.getShaderInfoLog(S).trim(),D=h.getShaderInfoLog(E).trim(),P=!0,C=!0;if(!1===h.getProgramParameter(_,35714)){P=!1;var O=T_(h,S,"vertex"),k=T_(h,E,"fragment");console.error("THREE.WebGLProgram: shader error: ",h.getError(),"35715",h.getProgramParameter(_,35715),"gl.getProgramInfoLog",L,O,k)}else""!==L?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",L):""!==A&&""!==D||(C=!1);C&&(this.diagnostics={runnable:P,programLog:L,vertexShader:{log:A,prefix:n},fragmentShader:{log:D,prefix:r}})}return h.detachShader(_,S),h.detachShader(_,E),h.deleteShader(S),h.deleteShader(E),this.getUniforms=function(){return void 0===w&&(w=new __(h,_)),w},this.getAttributes=function(){return void 0===T&&(T=function(t,e){for(var i={},n=t.getProgramParameter(e,35721),r=0;r<n;r++){var s=t.getActiveAttrib(e,r).name;i[s]=t.getAttribLocation(e,s)}return i}(h,_)),T},this.destroy=function(){h.deleteProgram(_),this.program=void 0},this.name=i.shaderName,this.id=b_++,this.cacheKey=e,this.usedTimes=1,this.program=_,this.vertexShader=S,this.fragmentShader=E,this}function B_(t,e,i){var n=[],r=i.isWebGL2,s=i.logarithmicDepthBuffer,o=i.floatVertexTextures,a=i.precision,h=i.maxVertexUniforms,u=i.vertexTextures,l={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},c=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","sheen"];function d(t){var e;return t?t.isTexture?e=t.encoding:t.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),e=t.texture.encoding):e=sm,e}this.getParameters=function(n,c,p,f,m,v,g){var y=f.fog,_=n.isMeshStandardMaterial?f.environment:null,x=n.envMap||_,b=l[n.type],w=g.isSkinnedMesh?function(t){var e=t.skeleton.bones;if(o)return 1024;var i=h,n=Math.floor((i-20)/4),r=Math.min(n,e.length);return r<e.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+e.length+" bones. This GPU supports "+r+"."),0):r}(g):0;null!==n.precision&&(a=i.getMaxPrecision(n.precision))!==n.precision&&console.warn("THREE.WebGLProgram.getParameters:",n.precision,"not supported, using",a,"instead.");var T=function(t,e){var i;if(e){var n=ly[e];i={name:t.type,uniforms:Xg.clone(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader}}else i={name:t.type,uniforms:t.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader};return i}(n,b);n.onBeforeCompile(T,t);var M=t.getRenderTarget();return{isWebGL2:r,shaderID:b,shaderName:T.name,uniforms:T.uniforms,vertexShader:T.vertexShader,fragmentShader:T.fragmentShader,defines:n.defines,isRawShaderMaterial:n.isRawShaderMaterial,isShaderMaterial:n.isShaderMaterial,precision:a,instancing:!0===g.isInstancedMesh,supportsVertexTextures:u,outputEncoding:null!==M?d(M.texture):t.outputEncoding,map:!!n.map,mapEncoding:d(n.map),matcap:!!n.matcap,matcapEncoding:d(n.matcap),envMap:!!x,envMapMode:x&&x.mapping,envMapEncoding:d(x),envMapCubeUV:!!x&&(x.mapping===Rf||307===x.mapping),lightMap:!!n.lightMap,lightMapEncoding:d(n.lightMap),aoMap:!!n.aoMap,emissiveMap:!!n.emissiveMap,emissiveMapEncoding:d(n.emissiveMap),bumpMap:!!n.bumpMap,normalMap:!!n.normalMap,objectSpaceNormalMap:1===n.normalMapType,tangentSpaceNormalMap:0===n.normalMapType,clearcoatMap:!!n.clearcoatMap,clearcoatRoughnessMap:!!n.clearcoatRoughnessMap,clearcoatNormalMap:!!n.clearcoatNormalMap,displacementMap:!!n.displacementMap,roughnessMap:!!n.roughnessMap,metalnessMap:!!n.metalnessMap,specularMap:!!n.specularMap,alphaMap:!!n.alphaMap,gradientMap:!!n.gradientMap,sheen:!!n.sheen,combine:n.combine,vertexTangents:n.normalMap&&n.vertexTangents,vertexColors:n.vertexColors,vertexUvs:!!(n.map||n.bumpMap||n.normalMap||n.specularMap||n.alphaMap||n.emissiveMap||n.roughnessMap||n.metalnessMap||n.clearcoatMap||n.clearcoatRoughnessMap||n.clearcoatNormalMap||n.displacementMap),uvsVertexOnly:!(n.map||n.bumpMap||n.normalMap||n.specularMap||n.alphaMap||n.emissiveMap||n.roughnessMap||n.metalnessMap||n.clearcoatNormalMap||!n.displacementMap),fog:!!y,useFog:n.fog,fogExp2:y&&y.isFogExp2,flatShading:n.flatShading,sizeAttenuation:n.sizeAttenuation,logarithmicDepthBuffer:s,skinning:n.skinning&&w>0,maxBones:w,useVertexTexture:o,morphTargets:n.morphTargets,morphNormals:n.morphNormals,maxMorphTargets:t.maxMorphTargets,maxMorphNormals:t.maxMorphNormals,numDirLights:c.directional.length,numPointLights:c.point.length,numSpotLights:c.spot.length,numRectAreaLights:c.rectArea.length,numHemiLights:c.hemi.length,numDirLightShadows:c.directionalShadowMap.length,numPointLightShadows:c.pointShadowMap.length,numSpotLightShadows:c.spotShadowMap.length,numClippingPlanes:m,numClipIntersection:v,dithering:n.dithering,shadowMapEnabled:t.shadowMap.enabled&&p.length>0,shadowMapType:t.shadowMap.type,toneMapping:n.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:n.premultipliedAlpha,alphaTest:n.alphaTest,doubleSided:2===n.side,flipSided:1===n.side,depthPacking:void 0!==n.depthPacking&&n.depthPacking,index0AttributeName:n.index0AttributeName,extensionDerivatives:n.extensions&&n.extensions.derivatives,extensionFragDepth:n.extensions&&n.extensions.fragDepth,extensionDrawBuffers:n.extensions&&n.extensions.drawBuffers,extensionShaderTextureLOD:n.extensions&&n.extensions.shaderTextureLOD,rendererExtensionFragDepth:r||null!==e.get("EXT_frag_depth"),rendererExtensionDrawBuffers:r||null!==e.get("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:r||null!==e.get("EXT_shader_texture_lod"),onBeforeCompile:n.onBeforeCompile}},this.getProgramCacheKey=function(e){var i=[];if(e.shaderID?i.push(e.shaderID):(i.push(e.fragmentShader),i.push(e.vertexShader)),void 0!==e.defines)for(var n in e.defines)i.push(n),i.push(e.defines[n]);if(void 0===e.isRawShaderMaterial){for(var r=0;r<c.length;r++)i.push(e[c[r]]);i.push(t.outputEncoding),i.push(t.gammaFactor)}return i.push(e.onBeforeCompile.toString()),i.join()},this.acquireProgram=function(e,i){for(var r,s=0,o=n.length;s<o;s++){var a=n[s];if(a.cacheKey===i){++(r=a).usedTimes;break}}return void 0===r&&(r=new N_(t,i,e),n.push(r)),r},this.releaseProgram=function(t){if(0==--t.usedTimes){var e=n.indexOf(t);n[e]=n[n.length-1],n.pop(),t.destroy()}},this.programs=n}function U_(){var t=new WeakMap;return{get:function(e){var i=t.get(e);return void 0===i&&(i={},t.set(e,i)),i},remove:function(e){t.delete(e)},update:function(e,i,n){t.get(e)[i]=n},dispose:function(){t=new WeakMap}}}function j_(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program!==e.program?t.program.id-e.program.id:t.material.id!==e.material.id?t.material.id-e.material.id:t.z!==e.z?t.z-e.z:t.id-e.id}function H_(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function z_(){var t=[],e=0,i=[],n=[],r={id:-1};function s(i,n,s,o,a,h){var u=t[e];return void 0===u?(u={id:i.id,object:i,geometry:n,material:s,program:s.program||r,groupOrder:o,renderOrder:i.renderOrder,z:a,group:h},t[e]=u):(u.id=i.id,u.object=i,u.geometry=n,u.material=s,u.program=s.program||r,u.groupOrder=o,u.renderOrder=i.renderOrder,u.z=a,u.group=h),e++,u}return{opaque:i,transparent:n,init:function(){e=0,i.length=0,n.length=0},push:function(t,e,r,o,a,h){var u=s(t,e,r,o,a,h);(!0===r.transparent?n:i).push(u)},unshift:function(t,e,r,o,a,h){var u=s(t,e,r,o,a,h);(!0===r.transparent?n:i).unshift(u)},finish:function(){for(var i=e,n=t.length;i<n;i++){var r=t[i];if(null===r.id)break;r.id=null,r.object=null,r.geometry=null,r.material=null,r.program=null,r.group=null}},sort:function(t,e){i.length>1&&i.sort(t||j_),n.length>1&&n.sort(e||H_)}}}function W_(){var t=new WeakMap;function e(i){var n=i.target;n.removeEventListener("dispose",e),t.delete(n)}return{get:function(i,n){var r,s=t.get(i);return void 0===s?(r=new z_,t.set(i,new WeakMap),t.get(i).set(n,r),i.addEventListener("dispose",e)):void 0===(r=s.get(n))&&(r=new z_,s.set(n,r)),r},dispose:function(){t=new WeakMap}}}function G_(){var t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];var i;switch(e.type){case"DirectionalLight":i={direction:new Lm,color:new Wv};break;case"SpotLight":i={position:new Lm,direction:new Lm,color:new Wv,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new Lm,color:new Wv,distance:0,decay:0};break;case"HemisphereLight":i={direction:new Lm,skyColor:new Wv,groundColor:new Wv};break;case"RectAreaLight":i={color:new Wv,position:new Lm,halfWidth:new Lm,halfHeight:new Lm}}return t[e.id]=i,i}}}var V_=0;function X_(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function q_(){for(var t,e=new G_,i=(t={},{get:function(e){if(void 0!==t[e.id])return t[e.id];var i;switch(e.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowRadius:1,shadowMapSize:new vm};break;case"PointLight":i={shadowBias:0,shadowRadius:1,shadowMapSize:new vm,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=i,i}}),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},r=0;r<9;r++)n.probe.push(new Lm);var s=new Lm,o=new Im,a=new Im;return{setup:function(t,r,h){for(var u=0,l=0,c=0,d=0;d<9;d++)n.probe[d].set(0,0,0);var p=0,f=0,m=0,v=0,g=0,y=0,_=0,x=0,b=h.matrixWorldInverse;t.sort(X_),d=0;for(var w=t.length;d<w;d++){var T=t[d],M=T.color,S=T.intensity,E=T.distance,L=T.shadow&&T.shadow.map?T.shadow.map.texture:null;if(T.isAmbientLight)u+=M.r*S,l+=M.g*S,c+=M.b*S;else if(T.isLightProbe)for(var A=0;A<9;A++)n.probe[A].addScaledVector(T.sh.coefficients[A],S);else if(T.isDirectionalLight){if((C=e.get(T)).color.copy(T.color).multiplyScalar(T.intensity),C.direction.setFromMatrixPosition(T.matrixWorld),s.setFromMatrixPosition(T.target.matrixWorld),C.direction.sub(s),C.direction.transformDirection(b),T.castShadow){var D=T.shadow;(P=i.get(T)).shadowBias=D.bias,P.shadowRadius=D.radius,P.shadowMapSize=D.mapSize,n.directionalShadow[p]=P,n.directionalShadowMap[p]=L,n.directionalShadowMatrix[p]=T.shadow.matrix,y++}n.directional[p]=C,p++}else if(T.isSpotLight){if((C=e.get(T)).position.setFromMatrixPosition(T.matrixWorld),C.position.applyMatrix4(b),C.color.copy(M).multiplyScalar(S),C.distance=E,C.direction.setFromMatrixPosition(T.matrixWorld),s.setFromMatrixPosition(T.target.matrixWorld),C.direction.sub(s),C.direction.transformDirection(b),C.coneCos=Math.cos(T.angle),C.penumbraCos=Math.cos(T.angle*(1-T.penumbra)),C.decay=T.decay,T.castShadow){D=T.shadow;(P=i.get(T)).shadowBias=D.bias,P.shadowRadius=D.radius,P.shadowMapSize=D.mapSize,n.spotShadow[m]=P,n.spotShadowMap[m]=L,n.spotShadowMatrix[m]=T.shadow.matrix,x++}n.spot[m]=C,m++}else if(T.isRectAreaLight){(C=e.get(T)).color.copy(M).multiplyScalar(S),C.position.setFromMatrixPosition(T.matrixWorld),C.position.applyMatrix4(b),a.identity(),o.copy(T.matrixWorld),o.premultiply(b),a.extractRotation(o),C.halfWidth.set(.5*T.width,0,0),C.halfHeight.set(0,.5*T.height,0),C.halfWidth.applyMatrix4(a),C.halfHeight.applyMatrix4(a),n.rectArea[v]=C,v++}else if(T.isPointLight){if((C=e.get(T)).position.setFromMatrixPosition(T.matrixWorld),C.position.applyMatrix4(b),C.color.copy(T.color).multiplyScalar(T.intensity),C.distance=T.distance,C.decay=T.decay,T.castShadow){var P;D=T.shadow;(P=i.get(T)).shadowBias=D.bias,P.shadowRadius=D.radius,P.shadowMapSize=D.mapSize,P.shadowCameraNear=D.camera.near,P.shadowCameraFar=D.camera.far,n.pointShadow[f]=P,n.pointShadowMap[f]=L,n.pointShadowMatrix[f]=T.shadow.matrix,_++}n.point[f]=C,f++}else if(T.isHemisphereLight){var C;(C=e.get(T)).direction.setFromMatrixPosition(T.matrixWorld),C.direction.transformDirection(b),C.direction.normalize(),C.skyColor.copy(T.color).multiplyScalar(S),C.groundColor.copy(T.groundColor).multiplyScalar(S),n.hemi[g]=C,g++}}n.ambient[0]=u,n.ambient[1]=l,n.ambient[2]=c;var O=n.hash;O.directionalLength===p&&O.pointLength===f&&O.spotLength===m&&O.rectAreaLength===v&&O.hemiLength===g&&O.numDirectionalShadows===y&&O.numPointShadows===_&&O.numSpotShadows===x||(n.directional.length=p,n.spot.length=m,n.rectArea.length=v,n.point.length=f,n.hemi.length=g,n.directionalShadow.length=y,n.directionalShadowMap.length=y,n.pointShadow.length=_,n.pointShadowMap.length=_,n.spotShadow.length=x,n.spotShadowMap.length=x,n.directionalShadowMatrix.length=y,n.pointShadowMatrix.length=_,n.spotShadowMatrix.length=x,O.directionalLength=p,O.pointLength=f,O.spotLength=m,O.rectAreaLength=v,O.hemiLength=g,O.numDirectionalShadows=y,O.numPointShadows=_,O.numSpotShadows=x,n.version=V_++)},state:n}}function J_(){var t=new q_,e=[],i=[];return{init:function(){e.length=0,i.length=0},state:{lightsArray:e,shadowsArray:i,lights:t},setupLights:function(n){t.setup(e,i,n)},pushLight:function(t){e.push(t)},pushShadow:function(t){i.push(t)}}}function Z_(){var t=new WeakMap;function e(i){var n=i.target;n.removeEventListener("dispose",e),t.delete(n)}return{get:function(i,n){var r;return!1===t.has(i)?(r=new J_,t.set(i,new WeakMap),t.get(i).set(n,r),i.addEventListener("dispose",e)):!1===t.get(i).has(n)?(r=new J_,t.get(i).set(n,r)):r=t.get(i).get(n),r},dispose:function(){t=new WeakMap}}}function K_(t){Zv.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}function Q_(t){Zv.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new Lm,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}K_.prototype=Object.create(Zv.prototype),K_.prototype.constructor=K_,K_.prototype.isMeshDepthMaterial=!0,K_.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this},Q_.prototype=Object.create(Zv.prototype),Q_.prototype.constructor=Q_,Q_.prototype.isMeshDistanceMaterial=!0,Q_.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this};function $_(t,e,i){var n=new ny,r=new vm,s=new vm,o=new bm,a=[],h=[],u={},l={0:1,1:0,2:2},c=new qg({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new vm},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n float mean = 0.0;\n float squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n #ifdef HORIZONAL_PASS\n vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n mean += distribution.x;\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n #else\n float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n mean += depth;\n squared_mean += depth * depth;\n #endif\n }\n mean = mean * HALF_SAMPLE_RATE;\n squared_mean = squared_mean * HALF_SAMPLE_RATE;\n float std_dev = sqrt( squared_mean - mean * mean );\n gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),d=c.clone();d.defines.HORIZONAL_PASS=1;var p=new yg;p.setAttribute("position",new $v(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var f=new Yg(p,c),m=this;function v(i,n){var r=e.update(f);c.uniforms.shadow_pass.value=i.map.texture,c.uniforms.resolution.value=i.mapSize,c.uniforms.radius.value=i.radius,t.setRenderTarget(i.mapPass),t.clear(),t.renderBufferDirect(n,null,r,c,f,null),d.uniforms.shadow_pass.value=i.mapPass.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,t.setRenderTarget(i.map),t.clear(),t.renderBufferDirect(n,null,r,d,f,null)}function g(t,e,i){var n=t<<0|e<<1|i<<2,r=a[n];return void 0===r&&(r=new K_({depthPacking:3201,morphTargets:t,skinning:e}),a[n]=r),r}function y(t,e,i){var n=t<<0|e<<1|i<<2,r=h[n];return void 0===r&&(r=new Q_({morphTargets:t,skinning:e}),h[n]=r),r}function _(e,i,n,r,s,o){var a=e.geometry,h=null,c=g,d=e.customDepthMaterial;if(!0===n.isPointLight&&(c=y,d=e.customDistanceMaterial),void 0===d){var p=!1;!0===i.morphTargets&&(!0===a.isBufferGeometry?p=a.morphAttributes&&a.morphAttributes.position&&a.morphAttributes.position.length>0:!0===a.isGeometry&&(p=a.morphTargets&&a.morphTargets.length>0));var f=!1;!0===e.isSkinnedMesh&&(!0===i.skinning?f=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e)),h=c(p,f,!0===e.isInstancedMesh)}else h=d;if(t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length){var m=h.uuid,v=i.uuid,_=u[m];void 0===_&&(_={},u[m]=_);var x=_[v];void 0===x&&(x=h.clone(),_[v]=x),h=x}return h.visible=i.visible,h.wireframe=i.wireframe,h.side=3===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:l[i.side],h.clipShadows=i.clipShadows,h.clippingPlanes=i.clippingPlanes,h.clipIntersection=i.clipIntersection,h.wireframeLinewidth=i.wireframeLinewidth,h.linewidth=i.linewidth,!0===n.isPointLight&&!0===h.isMeshDistanceMaterial&&(h.referencePosition.setFromMatrixPosition(n.matrixWorld),h.nearDistance=r,h.farDistance=s),h}function x(i,r,s,o,a){if(!1!==i.visible){if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===a)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);var h=e.update(i),u=i.material;if(Array.isArray(u))for(var l=h.groups,c=0,d=l.length;c<d;c++){var p=l[c],f=u[p.materialIndex];if(f&&f.visible){var m=_(i,f,o,s.near,s.far,a);t.renderBufferDirect(s,null,h,m,i,p)}}else if(u.visible){m=_(i,u,o,s.near,s.far,a);t.renderBufferDirect(s,null,h,m,i,null)}}for(var v=i.children,g=0,y=v.length;g<y;g++)x(v[g],r,s,o,a)}}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(e,a,h){if(!1!==m.enabled&&(!1!==m.autoUpdate||!1!==m.needsUpdate)&&0!==e.length){var u=t.getRenderTarget(),l=t.getActiveCubeFace(),c=t.getActiveMipmapLevel(),d=t.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(var p=0,f=e.length;p<f;p++){var g=e[p],y=g.shadow;if(void 0!==y){r.copy(y.mapSize);var _=y.getFrameExtents();if(r.multiply(_),s.copy(y.mapSize),(r.x>i||r.y>i)&&(console.warn("THREE.WebGLShadowMap:",g,"has shadow exceeding max texture size, reducing"),r.x>i&&(s.x=Math.floor(i/_.x),r.x=s.x*_.x,y.mapSize.x=s.x),r.y>i&&(s.y=Math.floor(i/_.y),r.y=s.y*_.y,y.mapSize.y=s.y)),null===y.map&&!y.isPointLightShadow&&3===this.type){var b={minFilter:jf,magFilter:jf,format:Zf};y.map=new wm(r.x,r.y,b),y.map.texture.name=g.name+".shadowMap",y.mapPass=new wm(r.x,r.y,b),y.camera.updateProjectionMatrix()}if(null===y.map){b={minFilter:Nf,magFilter:Nf,format:Zf};y.map=new wm(r.x,r.y,b),y.map.texture.name=g.name+".shadowMap",y.camera.updateProjectionMatrix()}t.setRenderTarget(y.map),t.clear();for(var w=y.getViewportCount(),T=0;T<w;T++){var M=y.getViewport(T);o.set(s.x*M.x,s.y*M.y,s.x*M.z,s.y*M.w),d.viewport(o),y.updateMatrices(g,T),n=y.getFrustum(),x(a,h,y.camera,g,this.type)}y.isPointLightShadow||3!==this.type||v(y,h)}else console.warn("THREE.WebGLShadowMap:",g,"has no shadow.")}m.needsUpdate=!1,t.setRenderTarget(u,l,c)}}}function tx(t,e,i){var n=i.isWebGL2;var r=new function(){var e=!1,i=new bm,n=null,r=new bm(0,0,0,0);return{setMask:function(i){n===i||e||(t.colorMask(i,i,i,i),n=i)},setLocked:function(t){e=t},setClear:function(e,n,s,o,a){!0===a&&(e*=o,n*=o,s*=o),i.set(e,n,s,o),!1===r.equals(i)&&(t.clearColor(e,n,s,o),r.copy(i))},reset:function(){e=!1,n=null,r.set(-1,0,0,0)}}},s=new function(){var e=!1,i=null,n=null,r=null;return{setTest:function(t){t?N(2929):B(2929)},setMask:function(n){i===n||e||(t.depthMask(n),i=n)},setFunc:function(e){if(n!==e){if(e)switch(e){case 0:t.depthFunc(512);break;case 1:t.depthFunc(519);break;case 2:t.depthFunc(513);break;case 3:t.depthFunc(515);break;case 4:t.depthFunc(514);break;case 5:t.depthFunc(518);break;case 6:t.depthFunc(516);break;case 7:t.depthFunc(517);break;default:t.depthFunc(515)}else t.depthFunc(515);n=e}},setLocked:function(t){e=t},setClear:function(e){r!==e&&(t.clearDepth(e),r=e)},reset:function(){e=!1,i=null,n=null,r=null}}},o=new function(){var e=!1,i=null,n=null,r=null,s=null,o=null,a=null,h=null,u=null;return{setTest:function(t){e||(t?N(2960):B(2960))},setMask:function(n){i===n||e||(t.stencilMask(n),i=n)},setFunc:function(e,i,o){n===e&&r===i&&s===o||(t.stencilFunc(e,i,o),n=e,r=i,s=o)},setOp:function(e,i,n){o===e&&a===i&&h===n||(t.stencilOp(e,i,n),o=e,a=i,h=n)},setLocked:function(t){e=t},setClear:function(e){u!==e&&(t.clearStencil(e),u=e)},reset:function(){e=!1,i=null,n=null,r=null,s=null,o=null,a=null,h=null,u=null}}},a=t.getParameter(34921),h=new Uint8Array(a),u=new Uint8Array(a),l=new Uint8Array(a),c={},d=null,p=null,f=null,m=null,v=null,g=null,y=null,_=null,x=null,b=!1,w=null,T=null,M=null,S=null,E=null,L=t.getParameter(35661),A=!1,D=0,P=t.getParameter(7938);-1!==P.indexOf("WebGL")?(D=parseFloat(/^WebGL\ ([0-9])/.exec(P)[1]),A=D>=1):-1!==P.indexOf("OpenGL ES")&&(D=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(P)[1]),A=D>=2);var C=null,O={},k=new bm,R=new bm;function I(e,i,n){var r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(var o=0;o<n;o++)t.texImage2D(i+o,0,6408,1,1,0,6408,5121,r);return s}var Y={};function F(i,r){(h[i]=1,0===u[i]&&(t.enableVertexAttribArray(i),u[i]=1),l[i]!==r)&&((n?t:e.get("ANGLE_instanced_arrays"))[n?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](i,r),l[i]=r)}function N(e){!0!==c[e]&&(t.enable(e),c[e]=!0)}function B(e){!1!==c[e]&&(t.disable(e),c[e]=!1)}Y[3553]=I(3553,3553,1),Y[34067]=I(34067,34069,6),r.setClear(0,0,0,1),s.setClear(1),o.setClear(0),N(2929),s.setFunc(3),W(!1),G(1),N(2884),z(0);var U={[kf]:32774,101:32778,102:32779};if(n)U[103]=32775,U[104]=32776;else{var j=e.get("EXT_blend_minmax");null!==j&&(U[103]=j.MIN_EXT,U[104]=j.MAX_EXT)}var H={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function z(e,i,n,r,s,o,a,h){if(0!==e){if(p||(N(3042),p=!0),5===e)s=s||i,o=o||n,a=a||r,i===m&&s===y||(t.blendEquationSeparate(U[i],U[s]),m=i,y=s),n===v&&r===g&&o===_&&a===x||(t.blendFuncSeparate(H[n],H[r],H[o],H[a]),v=n,g=r,_=o,x=a),f=e,b=null;else if(e!==f||h!==b){if(m===kf&&y===kf||(t.blendEquation(32774),m=kf,y=kf),h)switch(e){case 1:t.blendFuncSeparate(1,771,1,771);break;case 2:t.blendFunc(1,1);break;case 3:t.blendFuncSeparate(0,0,769,771);break;case 4:t.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}else switch(e){case 1:t.blendFuncSeparate(770,771,1,771);break;case 2:t.blendFunc(770,1);break;case 3:t.blendFunc(0,769);break;case 4:t.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}v=null,g=null,_=null,x=null,f=e,b=h}}else p&&(B(3042),p=!1)}function W(e){w!==e&&(e?t.frontFace(2304):t.frontFace(2305),w=e)}function G(e){0!==e?(N(2884),e!==T&&(1===e?t.cullFace(1029):2===e?t.cullFace(1028):t.cullFace(1032))):B(2884),T=e}function V(e,i,n){e?(N(32823),S===i&&E===n||(t.polygonOffset(i,n),S=i,E=n)):B(32823)}function X(e){void 0===e&&(e=33984+L-1),C!==e&&(t.activeTexture(e),C=e)}return{buffers:{color:r,depth:s,stencil:o},initAttributes:function(){for(var t=0,e=h.length;t<e;t++)h[t]=0},enableAttribute:function(t){F(t,0)},enableAttributeAndDivisor:F,disableUnusedAttributes:function(){for(var e=0,i=u.length;e!==i;++e)u[e]!==h[e]&&(t.disableVertexAttribArray(e),u[e]=0)},enable:N,disable:B,useProgram:function(e){return d!==e&&(t.useProgram(e),d=e,!0)},setBlending:z,setMaterial:function(t,e){2===t.side?B(2884):N(2884);var i=1===t.side;e&&(i=!i),W(i),1===t.blending&&!1===t.transparent?z(0):z(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha),s.setFunc(t.depthFunc),s.setTest(t.depthTest),s.setMask(t.depthWrite),r.setMask(t.colorWrite);var n=t.stencilWrite;o.setTest(n),n&&(o.setMask(t.stencilWriteMask),o.setFunc(t.stencilFunc,t.stencilRef,t.stencilFuncMask),o.setOp(t.stencilFail,t.stencilZFail,t.stencilZPass)),V(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits)},setFlipSided:W,setCullFace:G,setLineWidth:function(e){e!==M&&(A&&t.lineWidth(e),M=e)},setPolygonOffset:V,setScissorTest:function(t){t?N(3089):B(3089)},activeTexture:X,bindTexture:function(e,i){null===C&&X();var n=O[C];void 0===n&&(n={type:void 0,texture:void 0},O[C]=n),n.type===e&&n.texture===i||(t.bindTexture(e,i||Y[e]),n.type=e,n.texture=i)},unbindTexture:function(){var e=O[C];void 0!==e&&void 0!==e.type&&(t.bindTexture(e.type,null),e.type=void 0,e.texture=void 0)},compressedTexImage2D:function(){try{t.compressedTexImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage2D:function(){try{t.texImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage3D:function(){try{t.texImage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},scissor:function(e){!1===k.equals(e)&&(t.scissor(e.x,e.y,e.z,e.w),k.copy(e))},viewport:function(e){!1===R.equals(e)&&(t.viewport(e.x,e.y,e.z,e.w),R.copy(e))},reset:function(){for(var e=0;e<u.length;e++)1===u[e]&&(t.disableVertexAttribArray(e),u[e]=0);c={},C=null,O={},d=null,f=null,w=null,T=null,r.reset(),s.reset(),o.reset()}}}function ex(t,e,i,n,r,s,o){var a,h=r.isWebGL2,u=r.maxTextures,l=r.maxCubemapSize,c=r.maxTextureSize,d=r.maxSamples,p=new WeakMap,f=!1;try{f="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(t){}function m(t,e){return f?new OffscreenCanvas(t,e):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function v(t,e,i,n){var r=1;if((t.width>n||t.height>n)&&(r=n/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){var s=e?mm.floorPowerOfTwo:Math.floor,o=s(r*t.width),h=s(r*t.height);void 0===a&&(a=m(o,h));var u=i?m(o,h):a;return u.width=o,u.height=h,u.getContext("2d").drawImage(t,0,0,o,h),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+o+"x"+h+")."),u}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function g(t){return mm.isPowerOfTwo(t.width)&&mm.isPowerOfTwo(t.height)}function y(t,e){return t.generateMipmaps&&e&&t.minFilter!==Nf&&t.minFilter!==jf}function _(e,i,r,s){t.generateMipmap(e),n.get(i).__maxMipLevel=Math.log(Math.max(r,s))*Math.LOG2E}function x(i,n,r){if(!1===h)return n;if(null!==i){if(void 0!==t[i])return t[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}var s=n;return 6403===n&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===n&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===n&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function b(t){return t===Nf||t===Bf||t===Uf?9728:9729}function w(e){var i=e.target;i.removeEventListener("dispose",w),function(e){var i=n.get(e);if(void 0===i.__webglInit)return;t.deleteTexture(i.__webglTexture),n.remove(e)}(i),i.isVideoTexture&&p.delete(i),o.memory.textures--}function T(e){var i=e.target;i.removeEventListener("dispose",T),function(e){var i=n.get(e),r=n.get(e.texture);if(!e)return;void 0!==r.__webglTexture&&t.deleteTexture(r.__webglTexture);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(var s=0;s<6;s++)t.deleteFramebuffer(i.__webglFramebuffer[s]),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer[s]);else t.deleteFramebuffer(i.__webglFramebuffer),i.__webglDepthbuffer&&t.deleteRenderbuffer(i.__webglDepthbuffer),i.__webglMultisampledFramebuffer&&t.deleteFramebuffer(i.__webglMultisampledFramebuffer),i.__webglColorRenderbuffer&&t.deleteRenderbuffer(i.__webglColorRenderbuffer),i.__webglDepthRenderbuffer&&t.deleteRenderbuffer(i.__webglDepthRenderbuffer);n.remove(e.texture),n.remove(e)}(i),o.memory.textures--}var M=0;function S(t,e){var r=n.get(t);if(t.isVideoTexture&&function(t){var e=o.render.frame;p.get(t)!==e&&(p.set(t,e),t.update())}(t),t.version>0&&r.__version!==t.version){var s=t.image;if(void 0===s)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==s.complete)return void O(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+e),i.bindTexture(3553,r.__webglTexture)}function E(e,r){if(6===e.image.length){var o=n.get(e);if(e.version>0&&o.__version!==e.version){C(o,e),i.activeTexture(33984+r),i.bindTexture(34067,o.__webglTexture),t.pixelStorei(37440,e.flipY);for(var a=e&&(e.isCompressedTexture||e.image[0].isCompressedTexture),u=e.image[0]&&e.image[0].isDataTexture,c=[],d=0;d<6;d++)c[d]=a||u?u?e.image[d].image:e.image[d]:v(e.image[d],!1,!0,l);var p,f=c[0],m=g(f)||h,b=s.convert(e.format),w=s.convert(e.type),T=x(e.internalFormat,b,w);if(P(34067,e,m),a){for(d=0;d<6;d++){p=c[d].mipmaps;for(var M=0;M<p.length;M++){var S=p[M];e.format!==Zf&&e.format!==Jf?null!==b?i.compressedTexImage2D(34069+d,M,T,S.width,S.height,0,S.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):i.texImage2D(34069+d,M,T,S.width,S.height,0,b,w,S.data)}}o.__maxMipLevel=p.length-1}else{p=e.mipmaps;for(d=0;d<6;d++)if(u){i.texImage2D(34069+d,0,T,c[d].width,c[d].height,0,b,w,c[d].data);for(M=0;M<p.length;M++){var E=(S=p[M]).image[d].image;i.texImage2D(34069+d,M+1,T,E.width,E.height,0,b,w,E.data)}}else{i.texImage2D(34069+d,0,T,b,w,c[d]);for(M=0;M<p.length;M++){S=p[M];i.texImage2D(34069+d,M+1,T,b,w,S.image[d])}}o.__maxMipLevel=p.length}y(e,m)&&_(34067,e,f.width,f.height),o.__version=e.version,e.onUpdate&&e.onUpdate(e)}else i.activeTexture(33984+r),i.bindTexture(34067,o.__webglTexture)}}function L(t,e){i.activeTexture(33984+e),i.bindTexture(34067,n.get(t).__webglTexture)}var A={[If]:10497,[Yf]:33071,[Ff]:33648},D={[Nf]:9728,[Bf]:9984,[Uf]:9986,[jf]:9729,1007:9985,[Hf]:9987};function P(i,s,o){o?(t.texParameteri(i,10242,A[s.wrapS]),t.texParameteri(i,10243,A[s.wrapT]),32879!==i&&35866!==i||t.texParameteri(i,32882,A[s.wrapR]),t.texParameteri(i,10240,D[s.magFilter]),t.texParameteri(i,10241,D[s.minFilter])):(t.texParameteri(i,10242,33071),t.texParameteri(i,10243,33071),32879!==i&&35866!==i||t.texParameteri(i,32882,33071),s.wrapS===Yf&&s.wrapT===Yf||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(i,10240,b(s.magFilter)),t.texParameteri(i,10241,b(s.minFilter)),s.minFilter!==Nf&&s.minFilter!==jf&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));var a=e.get("EXT_texture_filter_anisotropic");if(a){if(s.type===Vf&&null===e.get("OES_texture_float_linear"))return;if(s.type===Xf&&null===(h||e.get("OES_texture_half_float_linear")))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(t.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function C(e,i){void 0===e.__webglInit&&(e.__webglInit=!0,i.addEventListener("dispose",w),e.__webglTexture=t.createTexture(),o.memory.textures++)}function O(e,n,r){var o=3553;n.isDataTexture2DArray&&(o=35866),n.isDataTexture3D&&(o=32879),C(e,n),i.activeTexture(33984+r),i.bindTexture(o,e.__webglTexture),t.pixelStorei(37440,n.flipY),t.pixelStorei(37441,n.premultiplyAlpha),t.pixelStorei(3317,n.unpackAlignment);var a=function(t){return!h&&(t.wrapS!==Yf||t.wrapT!==Yf||t.minFilter!==Nf&&t.minFilter!==jf)}(n)&&!1===g(n.image),u=v(n.image,a,!1,c),l=g(u)||h,d=s.convert(n.format),p=s.convert(n.type),f=x(n.internalFormat,d,p);P(o,n,l);var m,b=n.mipmaps;if(n.isDepthTexture)f=6402,h?f=n.type===Vf?36012:n.type===Gf?33190:n.type===qf?35056:33189:n.type===Vf&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===Kf&&6402===f&&n.type!==Wf&&n.type!==Gf&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=Wf,p=s.convert(n.type)),n.format===Qf&&6402===f&&(f=34041,n.type!==qf&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=qf,p=s.convert(n.type))),i.texImage2D(3553,0,f,u.width,u.height,0,d,p,null);else if(n.isDataTexture)if(b.length>0&&l){for(var w=0,T=b.length;w<T;w++)m=b[w],i.texImage2D(3553,w,f,m.width,m.height,0,d,p,m.data);n.generateMipmaps=!1,e.__maxMipLevel=b.length-1}else i.texImage2D(3553,0,f,u.width,u.height,0,d,p,u.data),e.__maxMipLevel=0;else if(n.isCompressedTexture){for(w=0,T=b.length;w<T;w++)m=b[w],n.format!==Zf&&n.format!==Jf?null!==d?i.compressedTexImage2D(3553,w,f,m.width,m.height,0,m.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):i.texImage2D(3553,w,f,m.width,m.height,0,d,p,m.data);e.__maxMipLevel=b.length-1}else if(n.isDataTexture2DArray)i.texImage3D(35866,0,f,u.width,u.height,u.depth,0,d,p,u.data),e.__maxMipLevel=0;else if(n.isDataTexture3D)i.texImage3D(32879,0,f,u.width,u.height,u.depth,0,d,p,u.data),e.__maxMipLevel=0;else if(b.length>0&&l){for(w=0,T=b.length;w<T;w++)m=b[w],i.texImage2D(3553,w,f,d,p,m);n.generateMipmaps=!1,e.__maxMipLevel=b.length-1}else i.texImage2D(3553,0,f,d,p,u),e.__maxMipLevel=0;y(n,l)&&_(o,n,u.width,u.height),e.__version=n.version,n.onUpdate&&n.onUpdate(n)}function k(e,r,o,a){var h=s.convert(r.texture.format),u=s.convert(r.texture.type),l=x(r.texture.internalFormat,h,u);i.texImage2D(a,0,l,r.width,r.height,0,h,u,null),t.bindFramebuffer(36160,e),t.framebufferTexture2D(36160,o,a,n.get(r.texture).__webglTexture,0),t.bindFramebuffer(36160,null)}function R(e,i,n){if(t.bindRenderbuffer(36161,e),i.depthBuffer&&!i.stencilBuffer){var r=33189;if(n){var o=i.depthTexture;o&&o.isDepthTexture&&(o.type===Vf?r=36012:o.type===Gf&&(r=33190));var a=Y(i);t.renderbufferStorageMultisample(36161,a,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(i.depthBuffer&&i.stencilBuffer){if(n){a=Y(i);t.renderbufferStorageMultisample(36161,a,35056,i.width,i.height)}else t.renderbufferStorage(36161,34041,i.width,i.height);t.framebufferRenderbuffer(36160,33306,36161,e)}else{var h=s.convert(i.texture.format),u=s.convert(i.texture.type);r=x(i.texture.internalFormat,h,u);if(n){a=Y(i);t.renderbufferStorageMultisample(36161,a,r,i.width,i.height)}else t.renderbufferStorage(36161,r,i.width,i.height)}t.bindRenderbuffer(36161,null)}function I(e){var i=n.get(e),r=!0===e.isWebGLCubeRenderTarget;if(e.depthTexture){if(r)throw new Error("target.depthTexture not supported in Cube render targets");!function(e,i){if(i&&i.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(t.bindFramebuffer(36160,e),!i.depthTexture||!i.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");n.get(i.depthTexture).__webglTexture&&i.depthTexture.image.width===i.width&&i.depthTexture.image.height===i.height||(i.depthTexture.image.width=i.width,i.depthTexture.image.height=i.height,i.depthTexture.needsUpdate=!0),S(i.depthTexture,0);var r=n.get(i.depthTexture).__webglTexture;if(i.depthTexture.format===Kf)t.framebufferTexture2D(36160,36096,3553,r,0);else{if(i.depthTexture.format!==Qf)throw new Error("Unknown depthTexture format");t.framebufferTexture2D(36160,33306,3553,r,0)}}(i.__webglFramebuffer,e)}else if(r){i.__webglDepthbuffer=[];for(var s=0;s<6;s++)t.bindFramebuffer(36160,i.__webglFramebuffer[s]),i.__webglDepthbuffer[s]=t.createRenderbuffer(),R(i.__webglDepthbuffer[s],e,!1)}else t.bindFramebuffer(36160,i.__webglFramebuffer),i.__webglDepthbuffer=t.createRenderbuffer(),R(i.__webglDepthbuffer,e,!1);t.bindFramebuffer(36160,null)}function Y(t){return h&&t.isWebGLMultisampleRenderTarget?Math.min(d,t.samples):0}var F=!1,N=!1;this.allocateTextureUnit=function(){var t=M;return t>=u&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+u),M+=1,t},this.resetTextureUnits=function(){M=0},this.setTexture2D=S,this.setTexture2DArray=function(t,e){var r=n.get(t);t.version>0&&r.__version!==t.version?O(r,t,e):(i.activeTexture(33984+e),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){var r=n.get(t);t.version>0&&r.__version!==t.version?O(r,t,e):(i.activeTexture(33984+e),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=E,this.setTextureCubeDynamic=L,this.setupRenderTarget=function(e){var r=n.get(e),a=n.get(e.texture);e.addEventListener("dispose",T),a.__webglTexture=t.createTexture(),o.memory.textures++;var u=!0===e.isWebGLCubeRenderTarget,l=!0===e.isWebGLMultisampleRenderTarget,c=g(e)||h;if(!h||e.texture.format!==Jf||e.texture.type!==Vf&&e.texture.type!==Xf||(e.texture.format=Zf,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){r.__webglFramebuffer=[];for(var d=0;d<6;d++)r.__webglFramebuffer[d]=t.createFramebuffer()}else if(r.__webglFramebuffer=t.createFramebuffer(),l)if(h){r.__webglMultisampledFramebuffer=t.createFramebuffer(),r.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,r.__webglColorRenderbuffer);var p=s.convert(e.texture.format),f=s.convert(e.texture.type),m=x(e.texture.internalFormat,p,f),v=Y(e);t.renderbufferStorageMultisample(36161,v,m,e.width,e.height),t.bindFramebuffer(36160,r.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,r.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(r.__webglDepthRenderbuffer=t.createRenderbuffer(),R(r.__webglDepthRenderbuffer,e,!0)),t.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(u){i.bindTexture(34067,a.__webglTexture),P(34067,e.texture,c);for(d=0;d<6;d++)k(r.__webglFramebuffer[d],e,36064,34069+d);y(e.texture,c)&&_(34067,e.texture,e.width,e.height),i.bindTexture(34067,null)}else i.bindTexture(3553,a.__webglTexture),P(3553,e.texture,c),k(r.__webglFramebuffer,e,36064,3553),y(e.texture,c)&&_(3553,e.texture,e.width,e.height),i.bindTexture(3553,null);e.depthBuffer&&I(e)},this.updateRenderTargetMipmap=function(t){var e=t.texture;if(y(e,g(t)||h)){var r=t.isWebGLCubeRenderTarget?34067:3553,s=n.get(e).__webglTexture;i.bindTexture(r,s),_(r,e,t.width,t.height),i.bindTexture(r,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(h){var i=n.get(e);t.bindFramebuffer(36008,i.__webglMultisampledFramebuffer),t.bindFramebuffer(36009,i.__webglFramebuffer);var r=e.width,s=e.height,o=16384;e.depthBuffer&&(o|=256),e.stencilBuffer&&(o|=1024),t.blitFramebuffer(0,0,r,s,0,0,r,s,o,9728),t.bindFramebuffer(36160,i.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===F&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),F=!0),t=t.texture),S(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===N&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),N=!0),t=t.texture),t&&t.isCubeTexture||Array.isArray(t.image)&&6===t.image.length?E(t,e):L(t,e)}}function ix(t,e,i){var n=i.isWebGL2;return{convert:function(t){var i;if(t===zf)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(t===Wf)return 5123;if(1013===t)return 5124;if(t===Gf)return 5125;if(t===Vf)return 5126;if(t===Xf)return n?5131:null!==(i=e.get("OES_texture_half_float"))?i.HALF_FLOAT_OES:null;if(1021===t)return 6406;if(t===Jf)return 6407;if(t===Zf)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===Kf)return 6402;if(t===Qf)return 34041;if(1028===t)return 6403;if(1029===t)return 36244;if(1030===t)return 33319;if(1031===t)return 33320;if(1032===t)return 36248;if(1033===t)return 36249;if(33776===t||33777===t||33778===t||33779===t){if(null===(i=e.get("WEBGL_compressed_texture_s3tc")))return null;if(33776===t)return i.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===t)return i.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===t)return i.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===t)return i.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===t||35841===t||35842===t||35843===t){if(null===(i=e.get("WEBGL_compressed_texture_pvrtc")))return null;if(35840===t)return i.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===t)return i.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===t)return i.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===t)return i.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t)return null!==(i=e.get("WEBGL_compressed_texture_etc1"))?i.COMPRESSED_RGB_ETC1_WEBGL:null;if((37492===t||37496===t)&&null!==(i=e.get("WEBGL_compressed_texture_etc"))){if(37492===t)return i.COMPRESSED_RGB8_ETC2;if(37496===t)return i.COMPRESSED_RGBA8_ETC2_EAC}return 37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t||37840===t||37841===t||37842===t||37843===t||37844===t||37845===t||37846===t||37847===t||37848===t||37849===t||37850===t||37851===t||37852===t||37853===t?null!==(i=e.get("WEBGL_compressed_texture_astc"))?t:null:36492===t?null!==(i=e.get("EXT_texture_compression_bptc"))?t:null:t===qf?n?34042:null!==(i=e.get("WEBGL_depth_texture"))?i.UNSIGNED_INT_24_8_WEBGL:null:void 0}}}function nx(t){Zg.call(this),this.cameras=t||[]}function rx(){$m.call(this),this.type="Group"}function sx(t,e){var i=this,n=null,r=1,s=null,o="local-floor",a=null,h=[],u=new Map,l=new Zg;l.layers.enable(1),l.viewport=new bm;var c=new Zg;c.layers.enable(2),c.viewport=new bm;var d=new nx([l,c]);d.layers.enable(1),d.layers.enable(2);var p=null,f=null;function m(t){var e=u.get(t.inputSource);e&&(e.targetRay&&e.targetRay.dispatchEvent({type:t.type}),e.grip&&e.grip.dispatchEvent({type:t.type}))}function v(){u.forEach((function(t,e){t.targetRay&&(t.targetRay.dispatchEvent({type:"disconnected",data:e}),t.targetRay.visible=!1),t.grip&&(t.grip.dispatchEvent({type:"disconnected",data:e}),t.grip.visible=!1)})),u.clear(),t.setFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),T.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function g(t){s=t,T.setContext(n),T.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}function y(t){for(var e=n.inputSources,i=0;i<h.length;i++)u.set(e[i],h[i]);for(i=0;i<t.removed.length;i++){var r=t.removed[i];(s=u.get(r))&&(s.targetRay&&s.targetRay.dispatchEvent({type:"disconnected",data:r}),s.grip&&s.grip.dispatchEvent({type:"disconnected",data:r}),u.delete(r))}for(i=0;i<t.added.length;i++){var s;r=t.added[i];(s=u.get(r))&&(s.targetRay&&s.targetRay.dispatchEvent({type:"connected",data:r}),s.grip&&s.grip.dispatchEvent({type:"connected",data:r}))}}this.enabled=!1,this.isPresenting=!1,this.getController=function(t){var e=h[t];return void 0===e&&(e={},h[t]=e),void 0===e.targetRay&&(e.targetRay=new rx,e.targetRay.matrixAutoUpdate=!1,e.targetRay.visible=!1),e.targetRay},this.getControllerGrip=function(t){var e=h[t];return void 0===e&&(e={},h[t]=e),void 0===e.grip&&(e.grip=new rx,e.grip.matrixAutoUpdate=!1,e.grip.visible=!1),e.grip},this.setFramebufferScaleFactor=function(t){r=t,1==i.isPresenting&&console.warn("WebXRManager: Cannot change framebuffer scale while presenting VR content")},this.setReferenceSpaceType=function(t){o=t},this.getReferenceSpace=function(){return s},this.getSession=function(){return n},this.setSession=function(t){if(null!==(n=t)){n.addEventListener("select",m),n.addEventListener("selectstart",m),n.addEventListener("selectend",m),n.addEventListener("squeeze",m),n.addEventListener("squeezestart",m),n.addEventListener("squeezeend",m),n.addEventListener("end",v);var i=e.getContextAttributes(),s={antialias:i.antialias,alpha:i.alpha,depth:i.depth,stencil:i.stencil,framebufferScaleFactor:r},a=new XRWebGLLayer(n,e,s);n.updateRenderState({baseLayer:a}),n.requestReferenceSpace(o).then(g),n.addEventListener("inputsourceschange",y)}};var _=new Lm,x=new Lm;function b(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.getInverse(t.matrixWorld)}this.getCamera=function(t){d.near=c.near=l.near=t.near,d.far=c.far=l.far=t.far,p===d.near&&f===d.far||(n.updateRenderState({depthNear:d.near,depthFar:d.far}),p=d.near,f=d.far);var e=t.parent,i=d.cameras;b(d,e);for(var r=0;r<i.length;r++)b(i[r],e);t.matrixWorld.copy(d.matrixWorld);for(var s=t.children,o=(r=0,s.length);r<o;r++)s[r].updateMatrixWorld(!0);return function(t,e,i){_.setFromMatrixPosition(e.matrixWorld),x.setFromMatrixPosition(i.matrixWorld);var n=_.distanceTo(x),r=e.projectionMatrix.elements,s=i.projectionMatrix.elements,o=r[14]/(r[10]-1),a=r[14]/(r[10]+1),h=(r[9]+1)/r[5],u=(r[9]-1)/r[5],l=(r[8]-1)/r[0],c=(s[8]+1)/s[0],d=o*l,p=o*c,f=n/(-l+c),m=f*-l;e.matrixWorld.decompose(t.position,t.quaternion,t.scale),t.translateX(m),t.translateZ(f),t.matrixWorld.compose(t.position,t.quaternion,t.scale),t.matrixWorldInverse.getInverse(t.matrixWorld);var v=o+f,g=a+f,y=d-m,b=p+(n-m),w=h*a/g*v,T=u*a/g*v;t.projectionMatrix.makePerspective(y,b,w,T,v,g)}(d,l,c),d};var w=null;var T=new sy;T.setAnimationLoop((function(e,i){if(null!==(a=i.getViewerPose(s))){var r=a.views,o=n.renderState.baseLayer;t.setFramebuffer(o.framebuffer);for(var u=0;u<r.length;u++){var l=r[u],c=o.getViewport(l),p=d.cameras[u];p.matrix.fromArray(l.transform.matrix),p.projectionMatrix.fromArray(l.projectionMatrix),p.viewport.set(c.x,c.y,c.width,c.height),0===u&&d.matrix.copy(p.matrix)}}var f=n.inputSources;for(u=0;u<h.length;u++){var m=h[u],v=f[u],g=null,y=null;v&&(m.targetRay&&null!==(g=i.getPose(v.targetRaySpace,s))&&(m.targetRay.matrix.fromArray(g.transform.matrix),m.targetRay.matrix.decompose(m.targetRay.position,m.targetRay.rotation,m.targetRay.scale)),m.grip&&v.gripSpace&&null!==(y=i.getPose(v.gripSpace,s))&&(m.grip.matrix.fromArray(y.transform.matrix),m.grip.matrix.decompose(m.grip.position,m.grip.rotation,m.grip.scale))),m.targetRay&&(m.targetRay.visible=null!==g),m.grip&&(m.grip.visible=null!==y)}w&&w(e,i)})),this.setAnimationLoop=function(t){w=t},this.dispose=function(){}}function ox(t){var e=void 0!==(t=t||{}).canvas?t.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),i=void 0!==t.context?t.context:null,n=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,o=void 0!==t.antialias&&t.antialias,a=void 0===t.premultipliedAlpha||t.premultipliedAlpha,h=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,u=void 0!==t.powerPreference?t.powerPreference:"default",l=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat,c=null,d=null;this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=sm,this.physicallyCorrectLights=!1,this.toneMapping=1,this.toneMappingExposure=1,this.toneMappingWhitePoint=1,this.maxMorphTargets=8,this.maxMorphNormals=4;var p,f,m,v,g,y,_,x,b,w,T,M,S,E,L,A,D,P,C=this,O=!1,k=null,R=0,I=0,Y=null,F=null,N=-1,B={geometry:null,program:null,wireframe:!1},U=null,j=null,H=new bm,z=new bm,W=null,G=e.width,V=e.height,X=1,q=null,J=null,Z=new bm(0,0,G,V),K=new bm(0,0,G,V),Q=!1,$=new ny,tt=new fy,et=!1,it=!1,nt=new Im,rt=new Lm;function st(){return null===Y?X:1}try{var ot={alpha:n,depth:r,stencil:s,antialias:o,premultipliedAlpha:a,preserveDrawingBuffer:h,powerPreference:u,failIfMajorPerformanceCaveat:l,xrCompatible:!0};if(e.addEventListener("webglcontextlost",lt,!1),e.addEventListener("webglcontextrestored",ct,!1),null===(p=i||e.getContext("webgl",ot)||e.getContext("experimental-webgl",ot)))throw null!==e.getContext("webgl")?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.");void 0===p.getShaderPrecisionFormat&&(p.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){throw console.error("THREE.WebGLRenderer: "+t.message),t}function at(){f=new my(p),!1===(m=new py(p,f,t)).isWebGL2&&(f.get("WEBGL_depth_texture"),f.get("OES_texture_float"),f.get("OES_texture_half_float"),f.get("OES_texture_half_float_linear"),f.get("OES_standard_derivatives"),f.get("OES_element_index_uint"),f.get("ANGLE_instanced_arrays")),f.get("OES_texture_float_linear"),P=new ix(p,f,m),(v=new tx(p,f,m)).scissor(z.copy(K).multiplyScalar(X).floor()),v.viewport(H.copy(Z).multiplyScalar(X).floor()),g=new yy(p),y=new U_,_=new ex(p,f,v,y,m,P,g),x=new oy(p,m),b=new vy(p,x,g),w=new by(p,b,x,g),L=new xy(p),T=new B_(C,f,m),M=new W_,S=new Z_,E=new cy(C,v,w,a),A=new dy(p,f,g,m),D=new gy(p,f,g,m),g.programs=T.programs,C.capabilities=m,C.extensions=f,C.properties=y,C.renderLists=M,C.state=v,C.info=g}at();var ht=new sx(C,p);this.xr=ht;var ut=new $_(C,w,m.maxTextureSize);function lt(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),O=!0}function ct(){console.log("THREE.WebGLRenderer: Context Restored."),O=!1,at()}function dt(t){var e=t.target;e.removeEventListener("dispose",dt),function(t){pt(t),y.remove(t)}(e)}function pt(t){var e=y.get(t).program;t.program=void 0,void 0!==e&&T.releaseProgram(e)}this.shadowMap=ut,this.getContext=function(){return p},this.getContextAttributes=function(){return p.getContextAttributes()},this.forceContextLoss=function(){var t=f.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){var t=f.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return X},this.setPixelRatio=function(t){void 0!==t&&(X=t,this.setSize(G,V,!1))},this.getSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),t=new vm),t.set(G,V)},this.setSize=function(t,i,n){ht.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(G=t,V=i,e.width=Math.floor(t*X),e.height=Math.floor(i*X),!1!==n&&(e.style.width=t+"px",e.style.height=i+"px"),this.setViewport(0,0,t,i))},this.getDrawingBufferSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),t=new vm),t.set(G*X,V*X).floor()},this.setDrawingBufferSize=function(t,i,n){G=t,V=i,X=n,e.width=Math.floor(t*n),e.height=Math.floor(i*n),this.setViewport(0,0,t,i)},this.getCurrentViewport=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),t=new bm),t.copy(H)},this.getViewport=function(t){return t.copy(Z)},this.setViewport=function(t,e,i,n){t.isVector4?Z.set(t.x,t.y,t.z,t.w):Z.set(t,e,i,n),v.viewport(H.copy(Z).multiplyScalar(X).floor())},this.getScissor=function(t){return t.copy(K)},this.setScissor=function(t,e,i,n){t.isVector4?K.set(t.x,t.y,t.z,t.w):K.set(t,e,i,n),v.scissor(z.copy(K).multiplyScalar(X).floor())},this.getScissorTest=function(){return Q},this.setScissorTest=function(t){v.setScissorTest(Q=t)},this.setOpaqueSort=function(t){q=t},this.setTransparentSort=function(t){J=t},this.getClearColor=function(){return E.getClearColor()},this.setClearColor=function(){E.setClearColor.apply(E,arguments)},this.getClearAlpha=function(){return E.getClearAlpha()},this.setClearAlpha=function(){E.setClearAlpha.apply(E,arguments)},this.clear=function(t,e,i){var n=0;(void 0===t||t)&&(n|=16384),(void 0===e||e)&&(n|=256),(void 0===i||i)&&(n|=1024),p.clear(n)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",lt,!1),e.removeEventListener("webglcontextrestored",ct,!1),M.dispose(),S.dispose(),y.dispose(),w.dispose(),ht.dispose(),vt.stop(),this.forceContextLoss()},this.renderBufferImmediate=function(t,e){v.initAttributes();var i=y.get(t);t.hasPositions&&!i.position&&(i.position=p.createBuffer()),t.hasNormals&&!i.normal&&(i.normal=p.createBuffer()),t.hasUvs&&!i.uv&&(i.uv=p.createBuffer()),t.hasColors&&!i.color&&(i.color=p.createBuffer());var n=e.getAttributes();t.hasPositions&&(p.bindBuffer(34962,i.position),p.bufferData(34962,t.positionArray,35048),v.enableAttribute(n.position),p.vertexAttribPointer(n.position,3,5126,!1,0,0)),t.hasNormals&&(p.bindBuffer(34962,i.normal),p.bufferData(34962,t.normalArray,35048),v.enableAttribute(n.normal),p.vertexAttribPointer(n.normal,3,5126,!1,0,0)),t.hasUvs&&(p.bindBuffer(34962,i.uv),p.bufferData(34962,t.uvArray,35048),v.enableAttribute(n.uv),p.vertexAttribPointer(n.uv,2,5126,!1,0,0)),t.hasColors&&(p.bindBuffer(34962,i.color),p.bufferData(34962,t.colorArray,35048),v.enableAttribute(n.color),p.vertexAttribPointer(n.color,3,5126,!1,0,0)),v.disableUnusedAttributes(),p.drawArrays(4,0,t.count),t.count=0};var ft=new tv;this.renderBufferDirect=function(t,e,i,n,r,s){null===e&&(e=ft);var o=r.isMesh&&r.matrixWorld.determinant()<0,a=bt(t,e,n,r);v.setMaterial(n,o);var h=!1;B.geometry===i.id&&B.program===a.id&&B.wireframe===(!0===n.wireframe)||(B.geometry=i.id,B.program=a.id,B.wireframe=!0===n.wireframe,h=!0),(n.morphTargets||n.morphNormals)&&(L.update(r,i,n,a),h=!0);var u=i.index,l=i.attributes.position;if(null===u){if(void 0===l||0===l.count)return}else if(0===u.count)return;var c,d=1;!0===n.wireframe&&(u=b.getWireframeAttribute(i),d=2);var g=A;null!==u&&(c=x.get(u),(g=D).setIndex(c)),h&&(!function(t,e,i,n){if(!1===m.isWebGL2&&(t.isInstancedMesh||e.isInstancedBufferGeometry)&&null===f.get("ANGLE_instanced_arrays"))return;v.initAttributes();var r=e.attributes,s=n.getAttributes(),o=i.defaultAttributeValues;for(var a in s){var h=s[a];if(h>=0){var u=r[a];if(void 0!==u){var l=u.normalized,c=u.itemSize;if(void 0===(T=x.get(u)))continue;var d=T.buffer,g=T.type,y=T.bytesPerElement;if(u.isInterleavedBufferAttribute){var _=u.data,b=_.stride,w=u.offset;_&&_.isInstancedInterleavedBuffer?(v.enableAttributeAndDivisor(h,_.meshPerAttribute),void 0===e.maxInstancedCount&&(e.maxInstancedCount=_.meshPerAttribute*_.count)):v.enableAttribute(h),p.bindBuffer(34962,d),p.vertexAttribPointer(h,c,g,l,b*y,w*y)}else u.isInstancedBufferAttribute?(v.enableAttributeAndDivisor(h,u.meshPerAttribute),void 0===e.maxInstancedCount&&(e.maxInstancedCount=u.meshPerAttribute*u.count)):v.enableAttribute(h),p.bindBuffer(34962,d),p.vertexAttribPointer(h,c,g,l,0,0)}else if("instanceMatrix"===a){var T;if(void 0===(T=x.get(t.instanceMatrix)))continue;d=T.buffer,g=T.type;v.enableAttributeAndDivisor(h+0,1),v.enableAttributeAndDivisor(h+1,1),v.enableAttributeAndDivisor(h+2,1),v.enableAttributeAndDivisor(h+3,1),p.bindBuffer(34962,d),p.vertexAttribPointer(h+0,4,g,!1,64,0),p.vertexAttribPointer(h+1,4,g,!1,64,16),p.vertexAttribPointer(h+2,4,g,!1,64,32),p.vertexAttribPointer(h+3,4,g,!1,64,48)}else if(void 0!==o){var M=o[a];if(void 0!==M)switch(M.length){case 2:p.vertexAttrib2fv(h,M);break;case 3:p.vertexAttrib3fv(h,M);break;case 4:p.vertexAttrib4fv(h,M);break;default:p.vertexAttrib1fv(h,M)}}}}v.disableUnusedAttributes()}(r,i,n,a),null!==u&&p.bindBuffer(34963,c.buffer));var y=null!==u?u.count:l.count,_=i.drawRange.start*d,w=i.drawRange.count*d,T=null!==s?s.start*d:0,M=null!==s?s.count*d:1/0,S=Math.max(_,T),E=Math.min(y,_+w,T+M)-1,P=Math.max(0,E-S+1);if(0!==P){if(r.isMesh)!0===n.wireframe?(v.setLineWidth(n.wireframeLinewidth*st()),g.setMode(1)):g.setMode(4);else if(r.isLine){var C=n.linewidth;void 0===C&&(C=1),v.setLineWidth(C*st()),r.isLineSegments?g.setMode(1):r.isLineLoop?g.setMode(2):g.setMode(3)}else r.isPoints?g.setMode(0):r.isSprite&&g.setMode(4);r.isInstancedMesh?g.renderInstances(i,S,P,r.count):i.isInstancedBufferGeometry?g.renderInstances(i,S,P,i.maxInstancedCount):g.render(S,P)}},this.compile=function(t,e){(d=S.get(t,e)).init(),t.traverse((function(t){t.isLight&&(d.pushLight(t),t.castShadow&&d.pushShadow(t))})),d.setupLights(e);var i={};t.traverse((function(e){if(e.material)if(Array.isArray(e.material))for(var n=0;n<e.material.length;n++)e.material[n].uuid in i==!1&&(xt(e.material[n],t,e),i[e.material[n].uuid]=!0);else e.material.uuid in i==!1&&(xt(e.material,t,e),i[e.material.uuid]=!0)}))};var mt=null;var vt=new sy;function gt(t,e,i,n){if(!1!==t.visible){if(t.layers.test(e.layers))if(t.isGroup)i=t.renderOrder;else if(t.isLOD)!0===t.autoUpdate&&t.update(e);else if(t.isLight)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||$.intersectsSprite(t)){n&&rt.setFromMatrixPosition(t.matrixWorld).applyMatrix4(nt);var r=w.update(t);(s=t.material).visible&&c.push(t,r,s,i,rt.z,null)}}else if(t.isImmediateRenderObject)n&&rt.setFromMatrixPosition(t.matrixWorld).applyMatrix4(nt),c.push(t,null,t.material,i,rt.z,null);else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==g.render.frame&&(t.skeleton.update(),t.skeleton.frame=g.render.frame),!t.frustumCulled||$.intersectsObject(t))){n&&rt.setFromMatrixPosition(t.matrixWorld).applyMatrix4(nt);r=w.update(t);var s=t.material;if(Array.isArray(s))for(var o=r.groups,a=0,h=o.length;a<h;a++){var u=o[a],l=s[u.materialIndex];l&&l.visible&&c.push(t,r,l,i,rt.z,u)}else s.visible&&c.push(t,r,s,i,rt.z,null)}var p=t.children;for(a=0,h=p.length;a<h;a++)gt(p[a],e,i,n)}}function yt(t,e,i,n){for(var r=0,s=t.length;r<s;r++){var o=t[r],a=o.object,h=o.geometry,u=void 0===n?o.material:n,l=o.group;if(i.isArrayCamera){j=i;for(var c=i.cameras,p=0,f=c.length;p<f;p++){var m=c[p];a.layers.test(m.layers)&&(v.viewport(H.copy(m.viewport)),d.setupLights(m),_t(a,e,m,h,u,l))}}else j=null,_t(a,e,i,h,u,l)}}function _t(t,e,i,n,r,s){if(t.onBeforeRender(C,e,i,n,r,s),d=S.get(e,j||i),t.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),t.isImmediateRenderObject){var o=bt(i,e,r,t);v.setMaterial(r),B.geometry=null,B.program=null,B.wireframe=!1,function(t,e){t.render((function(t){C.renderBufferImmediate(t,e)}))}(t,o)}else C.renderBufferDirect(i,e,n,r,t,s);t.onAfterRender(C,e,i,n,r,s),d=S.get(e,j||i)}function xt(t,e,i){var n=y.get(t),r=d.state.lights,s=d.state.shadowsArray,o=r.state.version,a=T.getParameters(t,r.state,s,e,tt.numPlanes,tt.numIntersection,i),h=T.getProgramCacheKey(a),u=n.program,l=!0;if(void 0===u)t.addEventListener("dispose",dt);else if(u.cacheKey!==h)pt(t);else if(n.lightsStateVersion!==o)n.lightsStateVersion=o,l=!1;else{if(void 0!==a.shaderID)return;l=!1}l&&(u=T.acquireProgram(a,h),n.program=u,n.uniforms=a.uniforms,n.environment=t.isMeshStandardMaterial?e.environment:null,n.outputEncoding=C.outputEncoding,t.program=u);var c=u.getAttributes();if(t.morphTargets){t.numSupportedMorphTargets=0;for(var p=0;p<C.maxMorphTargets;p++)c["morphTarget"+p]>=0&&t.numSupportedMorphTargets++}if(t.morphNormals){t.numSupportedMorphNormals=0;for(p=0;p<C.maxMorphNormals;p++)c["morphNormal"+p]>=0&&t.numSupportedMorphNormals++}var f=n.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(n.numClippingPlanes=tt.numPlanes,n.numIntersection=tt.numIntersection,f.clippingPlanes=tt.uniform),n.fog=e.fog,n.needsLights=function(t){return t.isMeshLambertMaterial||t.isMeshToonMaterial||t.isMeshPhongMaterial||t.isMeshStandardMaterial||t.isShadowMaterial||t.isShaderMaterial&&!0===t.lights}(t),n.lightsStateVersion=o,n.needsLights&&(f.ambientLightColor.value=r.state.ambient,f.lightProbe.value=r.state.probe,f.directionalLights.value=r.state.directional,f.directionalLightShadows.value=r.state.directionalShadow,f.spotLights.value=r.state.spot,f.spotLightShadows.value=r.state.spotShadow,f.rectAreaLights.value=r.state.rectArea,f.pointLights.value=r.state.point,f.pointLightShadows.value=r.state.pointShadow,f.hemisphereLights.value=r.state.hemi,f.directionalShadowMap.value=r.state.directionalShadowMap,f.directionalShadowMatrix.value=r.state.directionalShadowMatrix,f.spotShadowMap.value=r.state.spotShadowMap,f.spotShadowMatrix.value=r.state.spotShadowMatrix,f.pointShadowMap.value=r.state.pointShadowMap,f.pointShadowMatrix.value=r.state.pointShadowMatrix);var m=n.program.getUniforms(),v=__.seqWithValue(m.seq,f);n.uniformsList=v}function bt(t,e,i,n){_.resetTextureUnits();var r=e.fog,s=i.isMeshStandardMaterial?e.environment:null,o=y.get(i),a=d.state.lights;if(et&&(it||t!==U)){var h=t===U&&i.id===N;tt.setState(i.clippingPlanes,i.clipIntersection,i.clipShadows,t,o,h)}i.version===o.__version?void 0===o.program||i.fog&&o.fog!==r||o.environment!==s||o.needsLights&&o.lightsStateVersion!==a.state.version?xt(i,e,n):void 0===o.numClippingPlanes||o.numClippingPlanes===tt.numPlanes&&o.numIntersection===tt.numIntersection?o.outputEncoding!==C.outputEncoding&&xt(i,e,n):xt(i,e,n):(xt(i,e,n),o.__version=i.version);var u,l,c=!1,f=!1,g=!1,x=o.program,b=x.getUniforms(),w=o.uniforms;if(v.useProgram(x.program)&&(c=!0,f=!0,g=!0),i.id!==N&&(N=i.id,f=!0),c||U!==t){if(b.setValue(p,"projectionMatrix",t.projectionMatrix),m.logarithmicDepthBuffer&&b.setValue(p,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),U!==t&&(U=t,f=!0,g=!0),i.isShaderMaterial||i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshStandardMaterial||i.envMap){var T=b.map.cameraPosition;void 0!==T&&T.setValue(p,rt.setFromMatrixPosition(t.matrixWorld))}(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(p,"isOrthographic",!0===t.isOrthographicCamera),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial||i.skinning)&&b.setValue(p,"viewMatrix",t.matrixWorldInverse)}if(i.skinning){b.setOptional(p,n,"bindMatrix"),b.setOptional(p,n,"bindMatrixInverse");var M=n.skeleton;if(M){var S=M.bones;if(m.floatVertexTextures){if(void 0===M.boneTexture){var E=Math.sqrt(4*S.length);E=mm.ceilPowerOfTwo(E),E=Math.max(E,4);var L=new Float32Array(E*E*4);L.set(M.boneMatrices);var A=new ty(L,E,E,Zf,Vf);M.boneMatrices=L,M.boneTexture=A,M.boneTextureSize=E}b.setValue(p,"boneTexture",M.boneTexture,_),b.setValue(p,"boneTextureSize",M.boneTextureSize)}else b.setOptional(p,M,"boneMatrices")}}return(f||o.receiveShadow!==n.receiveShadow)&&(o.receiveShadow=n.receiveShadow,b.setValue(p,"receiveShadow",n.receiveShadow)),f&&(b.setValue(p,"toneMappingExposure",C.toneMappingExposure),b.setValue(p,"toneMappingWhitePoint",C.toneMappingWhitePoint),o.needsLights&&(l=g,(u=w).ambientLightColor.needsUpdate=l,u.lightProbe.needsUpdate=l,u.directionalLights.needsUpdate=l,u.directionalLightShadows.needsUpdate=l,u.pointLights.needsUpdate=l,u.pointLightShadows.needsUpdate=l,u.spotLights.needsUpdate=l,u.spotLightShadows.needsUpdate=l,u.rectAreaLights.needsUpdate=l,u.hemisphereLights.needsUpdate=l),r&&i.fog&&function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)}(w,r),i.isMeshBasicMaterial?wt(w,i):i.isMeshLambertMaterial?(wt(w,i),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(w,i)):i.isMeshToonMaterial?(wt(w,i),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.gradientMap&&(t.gradientMap.value=e.gradientMap);e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(w,i)):i.isMeshPhongMaterial?(wt(w,i),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(w,i)):i.isMeshStandardMaterial?(wt(w,i,s),i.isMeshPhysicalMaterial?function(t,e,i){Tt(t,e,i),t.reflectivity.value=e.reflectivity,t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&t.sheen.value.copy(e.sheen);e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap);e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap);e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate());t.transparency.value=e.transparency}(w,i,s):Tt(w,i,s)):i.isMeshMatcapMaterial?(wt(w,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(w,i)):i.isMeshDepthMaterial?(wt(w,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(w,i)):i.isMeshDistanceMaterial?(wt(w,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(w,i)):i.isMeshNormalMaterial?(wt(w,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(w,i)):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(w,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(w,i)):i.isPointsMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*X,t.scale.value=.5*V,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);var i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(w,i):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);var i;e.map?i=e.map:e.alphaMap&&(i=e.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}(w,i):i.isShadowMaterial&&(w.color.value.copy(i.color),w.opacity.value=i.opacity),void 0!==w.ltc_1&&(w.ltc_1.value=ry.LTC_1),void 0!==w.ltc_2&&(w.ltc_2.value=ry.LTC_2),__.upload(p,o.uniformsList,w,_),i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)),i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(__.upload(p,o.uniformsList,w,_),i.uniformsNeedUpdate=!1),i.isSpriteMaterial&&b.setValue(p,"center",n.center),b.setValue(p,"modelViewMatrix",n.modelViewMatrix),b.setValue(p,"normalMatrix",n.normalMatrix),b.setValue(p,"modelMatrix",n.matrixWorld),x}function wt(t,e,i){t.opacity.value=e.opacity,e.color&&t.diffuse.value.copy(e.color),e.emissive&&t.emissive.value.copy(e.emissive).multiplyScalar(e.emissiveIntensity),e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.specularMap&&(t.specularMap.value=e.specularMap);var n,r,s=e.envMap||i;s&&(t.envMap.value=s,t.flipEnvMap.value=s.isCubeTexture?-1:1,t.reflectivity.value=e.reflectivity,t.refractionRatio.value=e.refractionRatio,t.maxMipLevel.value=y.get(s).__maxMipLevel),e.lightMap&&(t.lightMap.value=e.lightMap,t.lightMapIntensity.value=e.lightMapIntensity),e.aoMap&&(t.aoMap.value=e.aoMap,t.aoMapIntensity.value=e.aoMapIntensity),e.map?n=e.map:e.specularMap?n=e.specularMap:e.displacementMap?n=e.displacementMap:e.normalMap?n=e.normalMap:e.bumpMap?n=e.bumpMap:e.roughnessMap?n=e.roughnessMap:e.metalnessMap?n=e.metalnessMap:e.alphaMap?n=e.alphaMap:e.emissiveMap&&(n=e.emissiveMap),void 0!==n&&(n.isWebGLRenderTarget&&(n=n.texture),!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix)),e.aoMap?r=e.aoMap:e.lightMap&&(r=e.lightMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uv2Transform.value.copy(r.matrix))}function Tt(t,e,i){t.roughness.value=e.roughness,t.metalness.value=e.metalness,e.roughnessMap&&(t.roughnessMap.value=e.roughnessMap),e.metalnessMap&&(t.metalnessMap.value=e.metalnessMap),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),(e.envMap||i)&&(t.envMapIntensity.value=e.envMapIntensity)}vt.setAnimationLoop((function(t){ht.isPresenting||mt&&mt(t)})),"undefined"!=typeof window&&vt.setContext(window),this.setAnimationLoop=function(t){mt=t,ht.setAnimationLoop(t),vt.start()},this.render=function(t,e){var i,n;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),i=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),n=arguments[3]),e&&e.isCamera){if(!O){B.geometry=null,B.program=null,B.wireframe=!1,N=-1,U=null,!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),ht.enabled&&ht.isPresenting&&(e=ht.getCamera(e)),(d=S.get(t,e)).init(),t.onBeforeRender(C,t,e,i||Y),nt.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),$.setFromProjectionMatrix(nt),it=this.localClippingEnabled,et=tt.init(this.clippingPlanes,it,e),(c=M.get(t,e)).init(),gt(t,e,0,C.sortObjects),c.finish(),!0===C.sortObjects&&c.sort(q,J),et&&tt.beginShadows();var r=d.state.shadowsArray;ut.render(r,t,e),d.setupLights(e),et&&tt.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==i&&this.setRenderTarget(i),E.render(c,t,e,n);var s=c.opaque,o=c.transparent;if(t.overrideMaterial){var a=t.overrideMaterial;s.length&&yt(s,t,e,a),o.length&&yt(o,t,e,a)}else s.length&&yt(s,t,e),o.length&&yt(o,t,e);t.onAfterRender(C,t,e),null!==Y&&(_.updateRenderTargetMipmap(Y),_.updateMultisampleRenderTarget(Y)),v.buffers.depth.setTest(!0),v.buffers.depth.setMask(!0),v.buffers.color.setMask(!0),v.setPolygonOffset(!1),c=null,d=null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFramebuffer=function(t){k!==t&&null===Y&&p.bindFramebuffer(36160,t),k=t},this.getActiveCubeFace=function(){return R},this.getActiveMipmapLevel=function(){return I},this.getRenderTarget=function(){return Y},this.setRenderTarget=function(t,e,i){Y=t,R=e,I=i,t&&void 0===y.get(t).__webglFramebuffer&&_.setupRenderTarget(t);var n=k,r=!1;if(t){var s=y.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(n=s[e||0],r=!0):n=t.isWebGLMultisampleRenderTarget?y.get(t).__webglMultisampledFramebuffer:s,H.copy(t.viewport),z.copy(t.scissor),W=t.scissorTest}else H.copy(Z).multiplyScalar(X).floor(),z.copy(K).multiplyScalar(X).floor(),W=Q;if(F!==n&&(p.bindFramebuffer(36160,n),F=n),v.viewport(H),v.scissor(z),v.setScissorTest(W),r){var o=y.get(t.texture);p.framebufferTexture2D(36160,36064,34069+(e||0),o.__webglTexture,i||0)}},this.readRenderTargetPixels=function(t,e,i,n,r,s,o){if(t&&t.isWebGLRenderTarget){var a=y.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==o&&(a=a[o]),a){var h=!1;a!==F&&(p.bindFramebuffer(36160,a),h=!0);try{var u=t.texture,l=u.format,c=u.type;if(l!==Zf&&P.convert(l)!==p.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(c===zf||P.convert(c)===p.getParameter(35738)||c===Vf&&(m.isWebGL2||f.get("OES_texture_float")||f.get("WEBGL_color_buffer_float"))||c===Xf&&(m.isWebGL2?f.get("EXT_color_buffer_float"):f.get("EXT_color_buffer_half_float"))))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===p.checkFramebufferStatus(36160)?e>=0&&e<=t.width-n&&i>=0&&i<=t.height-r&&p.readPixels(e,i,n,r,P.convert(l),P.convert(c),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{h&&p.bindFramebuffer(36160,F)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(t,e,i){void 0===i&&(i=0);var n=Math.pow(2,-i),r=Math.floor(e.image.width*n),s=Math.floor(e.image.height*n),o=P.convert(e.format);_.setTexture2D(e,0),p.copyTexImage2D(3553,i,o,t.x,t.y,r,s,0),v.unbindTexture()},this.copyTextureToTexture=function(t,e,i,n){var r=e.image.width,s=e.image.height,o=P.convert(i.format),a=P.convert(i.type);_.setTexture2D(i,0),e.isDataTexture?p.texSubImage2D(3553,n||0,t.x,t.y,r,s,o,a,e.image.data):p.texSubImage2D(3553,n||0,t.x,t.y,o,a,e.image),v.unbindTexture()},this.initTexture=function(t){_.setTexture2D(t,0),v.unbindTexture()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ax(t,e){this.name="",this.color=new Wv(t),this.density=void 0!==e?e:25e-5}function hx(t,e,i){this.name="",this.color=new Wv(t),this.near=void 0!==e?e:1,this.far=void 0!==i?i:1e3}function ux(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=um,this.updateRange={offset:0,count:-1},this.version=0}nx.prototype=Object.assign(Object.create(Zg.prototype),{constructor:nx,isArrayCamera:!0}),rx.prototype=Object.assign(Object.create($m.prototype),{constructor:rx,isGroup:!0}),Object.assign(sx.prototype,cm.prototype),Object.assign(ax.prototype,{isFogExp2:!0,clone:function(){return new ax(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}),Object.assign(hx.prototype,{isFog:!0,clone:function(){return new hx(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}),Object.defineProperty(ux.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(ux.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this},copyAt:function(t,e,i){t*=this.stride,i*=e.stride;for(var n=0,r=this.stride;n<r;n++)this.array[t+n]=e.array[i+n];return this},set:function(t,e){return void 0===e&&(e=0),this.array.set(t,e),this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(t){return this.onUploadCallback=t,this}});var lx,cx=new Lm;function dx(t,e,i,n){this.data=t,this.itemSize=e,this.offset=i,this.normalized=!0===n}function px(t){Zv.call(this),this.type="SpriteMaterial",this.color=new Wv(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(t)}Object.defineProperties(dx.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}}),Object.assign(dx.prototype,{isInterleavedBufferAttribute:!0,applyMatrix4:function(t){for(var e=0,i=this.data.count;e<i;e++)cx.x=this.getX(e),cx.y=this.getY(e),cx.z=this.getZ(e),cx.applyMatrix4(t),this.setXYZ(e,cx.x,cx.y,cx.z);return this},setX:function(t,e){return this.data.array[t*this.data.stride+this.offset]=e,this},setY:function(t,e){return this.data.array[t*this.data.stride+this.offset+1]=e,this},setZ:function(t,e){return this.data.array[t*this.data.stride+this.offset+2]=e,this},setW:function(t,e){return this.data.array[t*this.data.stride+this.offset+3]=e,this},getX:function(t){return this.data.array[t*this.data.stride+this.offset]},getY:function(t){return this.data.array[t*this.data.stride+this.offset+1]},getZ:function(t){return this.data.array[t*this.data.stride+this.offset+2]},getW:function(t){return this.data.array[t*this.data.stride+this.offset+3]},setXY:function(t,e,i){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this},setXYZ:function(t,e,i,n){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=n,this},setXYZW:function(t,e,i,n,r){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=n,this.data.array[t+3]=r,this}}),px.prototype=Object.create(Zv.prototype),px.prototype.constructor=px,px.prototype.isSpriteMaterial=!0,px.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.rotation=t.rotation,this.sizeAttenuation=t.sizeAttenuation,this};var fx=new Lm,mx=new Lm,vx=new Lm,gx=new vm,yx=new vm,_x=new Im,xx=new Lm,bx=new Lm,wx=new Lm,Tx=new vm,Mx=new vm,Sx=new vm;function Ex(t){if($m.call(this),this.type="Sprite",void 0===lx){lx=new yg;var e=new ux(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);lx.setIndex([0,1,2,0,2,3]),lx.setAttribute("position",new dx(e,3,0,!1)),lx.setAttribute("uv",new dx(e,2,3,!1))}this.geometry=lx,this.material=void 0!==t?t:new px,this.center=new vm(.5,.5)}function Lx(t,e,i,n,r,s){gx.subVectors(t,i).addScalar(.5).multiply(n),void 0!==r?(yx.x=s*gx.x-r*gx.y,yx.y=r*gx.x+s*gx.y):yx.copy(gx),t.copy(e),t.x+=yx.x,t.y+=yx.y,t.applyMatrix4(_x)}Ex.prototype=Object.assign(Object.create($m.prototype),{constructor:Ex,isSprite:!0,raycast:function(t,e){null===t.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),mx.setFromMatrixScale(this.matrixWorld),_x.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),vx.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&mx.multiplyScalar(-vx.z);var i,n,r=this.material.rotation;0!==r&&(n=Math.cos(r),i=Math.sin(r));var s=this.center;Lx(xx.set(-.5,-.5,0),vx,s,mx,i,n),Lx(bx.set(.5,-.5,0),vx,s,mx,i,n),Lx(wx.set(.5,.5,0),vx,s,mx,i,n),Tx.set(0,0),Mx.set(1,0),Sx.set(1,1);var o=t.ray.intersectTriangle(xx,bx,wx,!1,fx);if(null!==o||(Lx(bx.set(-.5,.5,0),vx,s,mx,i,n),Mx.set(0,1),null!==(o=t.ray.intersectTriangle(xx,wx,bx,!1,fx)))){var a=t.ray.origin.distanceTo(fx);a<t.near||a>t.far||e.push({distance:a,point:fx.clone(),uv:Uv.getUV(fx,xx,bx,wx,Tx,Mx,Sx,new vm),face:null,object:this})}},clone:function(){return new this.constructor(this.material).copy(this)},copy:function(t){return $m.prototype.copy.call(this,t),void 0!==t.center&&this.center.copy(t.center),this}});var Ax=new Lm,Dx=new Lm;function Px(){$m.call(this),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}function Cx(t,e){t&&t.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead."),Yg.call(this,t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Im,this.bindMatrixInverse=new Im}Px.prototype=Object.assign(Object.create($m.prototype),{constructor:Px,isLOD:!0,copy:function(t){$m.prototype.copy.call(this,t,!1);for(var e=t.levels,i=0,n=e.length;i<n;i++){var r=e[i];this.addLevel(r.object.clone(),r.distance)}return this.autoUpdate=t.autoUpdate,this},addLevel:function(t,e){void 0===e&&(e=0),e=Math.abs(e);for(var i=this.levels,n=0;n<i.length&&!(e<i[n].distance);n++);return i.splice(n,0,{distance:e,object:t}),this.add(t),this},getCurrentLevel:function(){return this._currentLevel},getObjectForDistance:function(t){var e=this.levels;if(e.length>0){for(var i=1,n=e.length;i<n&&!(t<e[i].distance);i++);return e[i-1].object}return null},raycast:function(t,e){if(this.levels.length>0){Ax.setFromMatrixPosition(this.matrixWorld);var i=t.ray.origin.distanceTo(Ax);this.getObjectForDistance(i).raycast(t,e)}},update:function(t){var e=this.levels;if(e.length>1){Ax.setFromMatrixPosition(t.matrixWorld),Dx.setFromMatrixPosition(this.matrixWorld);var i=Ax.distanceTo(Dx)/t.zoom;e[0].object.visible=!0;for(var n=1,r=e.length;n<r&&i>=e[n].distance;n++)e[n-1].object.visible=!1,e[n].object.visible=!0;for(this._currentLevel=n-1;n<r;n++)e[n].object.visible=!1}},toJSON:function(t){var e=$m.prototype.toJSON.call(this,t);!1===this.autoUpdate&&(e.object.autoUpdate=!1),e.object.levels=[];for(var i=this.levels,n=0,r=i.length;n<r;n++){var s=i[n];e.object.levels.push({object:s.object.uuid,distance:s.distance})}return e}}),Cx.prototype=Object.assign(Object.create(Yg.prototype),{constructor:Cx,isSkinnedMesh:!0,bind:function(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.getInverse(e)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var t=new bm,e=this.geometry.attributes.skinWeight,i=0,n=e.count;i<n;i++){t.x=e.getX(i),t.y=e.getY(i),t.z=e.getZ(i),t.w=e.getW(i);var r=1/t.manhattanLength();r!==1/0?t.multiplyScalar(r):t.set(1,0,0,0),e.setXYZW(i,t.x,t.y,t.z,t.w)}},updateMatrixWorld:function(t){Yg.prototype.updateMatrixWorld.call(this,t),"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var Ox=new Im,kx=new Im;function Rx(t,e){if(t=t||[],this.bones=t.slice(0),this.boneMatrices=new Float32Array(16*this.bones.length),this.frame=-1,void 0===e)this.calculateInverses();else if(this.bones.length===e.length)this.boneInverses=e.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[];for(var i=0,n=this.bones.length;i<n;i++)this.boneInverses.push(new Im)}}function Ix(){$m.call(this),this.type="Bone"}Object.assign(Rx.prototype,{calculateInverses:function(){this.boneInverses=[];for(var t=0,e=this.bones.length;t<e;t++){var i=new Im;this.bones[t]&&i.getInverse(this.bones[t].matrixWorld),this.boneInverses.push(i)}},pose:function(){var t,e,i;for(e=0,i=this.bones.length;e<i;e++)(t=this.bones[e])&&t.matrixWorld.getInverse(this.boneInverses[e]);for(e=0,i=this.bones.length;e<i;e++)(t=this.bones[e])&&(t.parent&&t.parent.isBone?(t.matrix.getInverse(t.parent.matrixWorld),t.matrix.multiply(t.matrixWorld)):t.matrix.copy(t.matrixWorld),t.matrix.decompose(t.position,t.quaternion,t.scale))},update:function(){for(var t=this.bones,e=this.boneInverses,i=this.boneMatrices,n=this.boneTexture,r=0,s=t.length;r<s;r++){var o=t[r]?t[r].matrixWorld:kx;Ox.multiplyMatrices(o,e[r]),Ox.toArray(i,16*r)}void 0!==n&&(n.needsUpdate=!0)},clone:function(){return new Rx(this.bones,this.boneInverses)},getBoneByName:function(t){for(var e=0,i=this.bones.length;e<i;e++){var n=this.bones[e];if(n.name===t)return n}},dispose:function(){this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=void 0)}}),Ix.prototype=Object.assign(Object.create($m.prototype),{constructor:Ix,isBone:!0});var Yx=new Im,Fx=new Im,Nx=[],Bx=new Yg;function Ux(t,e,i){Yg.call(this,t,e),this.instanceMatrix=new $v(new Float32Array(16*i),16),this.count=i,this.frustumCulled=!1}function jx(t){Zv.call(this),this.type="LineBasicMaterial",this.color=new Wv(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.setValues(t)}Ux.prototype=Object.assign(Object.create(Yg.prototype),{constructor:Ux,isInstancedMesh:!0,getMatrixAt:function(t,e){e.fromArray(this.instanceMatrix.array,16*t)},raycast:function(t,e){var i=this.matrixWorld,n=this.count;if(Bx.geometry=this.geometry,Bx.material=this.material,void 0!==Bx.material)for(var r=0;r<n;r++)this.getMatrixAt(r,Yx),Fx.multiplyMatrices(i,Yx),Bx.matrixWorld=Fx,Bx.raycast(t,Nx),Nx.length>0&&(Nx[0].instanceId=r,Nx[0].object=this,e.push(Nx[0]),Nx.length=0)},setMatrixAt:function(t,e){e.toArray(this.instanceMatrix.array,16*t)},updateMorphTargets:function(){}}),jx.prototype=Object.create(Zv.prototype),jx.prototype.constructor=jx,jx.prototype.isLineBasicMaterial=!0,jx.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this};var Hx=new Lm,zx=new Lm,Wx=new Im,Gx=new Sv,Vx=new gv;function Xx(t,e,i){1===i&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead."),$m.call(this),this.type="Line",this.geometry=void 0!==t?t:new yg,this.material=void 0!==e?e:new jx}Xx.prototype=Object.assign(Object.create($m.prototype),{constructor:Xx,isLine:!0,computeLineDistances:function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,i=[0],n=1,r=e.count;n<r;n++)Hx.fromBufferAttribute(e,n-1),zx.fromBufferAttribute(e,n),i[n]=i[n-1],i[n]+=Hx.distanceTo(zx);t.setAttribute("lineDistance",new ag(i,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(t.isGeometry){var s=t.vertices;(i=t.lineDistances)[0]=0;for(n=1,r=s.length;n<r;n++)i[n]=i[n-1],i[n]+=s[n-1].distanceTo(s[n])}return this},raycast:function(t,e){var i=this.geometry,n=this.matrixWorld,r=t.params.Line.threshold;if(null===i.boundingSphere&&i.computeBoundingSphere(),Vx.copy(i.boundingSphere),Vx.applyMatrix4(n),Vx.radius+=r,!1!==t.ray.intersectsSphere(Vx)){Wx.getInverse(n),Gx.copy(t.ray).applyMatrix4(Wx);var s=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=s*s,a=new Lm,h=new Lm,u=new Lm,l=new Lm,c=this&&this.isLineSegments?2:1;if(i.isBufferGeometry){var d=i.index,p=i.attributes.position.array;if(null!==d)for(var f=d.array,m=0,v=f.length-1;m<v;m+=c){var g=f[m],y=f[m+1];if(a.fromArray(p,3*g),h.fromArray(p,3*y),!(Gx.distanceSqToSegment(a,h,l,u)>o))l.applyMatrix4(this.matrixWorld),(b=t.ray.origin.distanceTo(l))<t.near||b>t.far||e.push({distance:b,point:u.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}else for(m=0,v=p.length/3-1;m<v;m+=c){if(a.fromArray(p,3*m),h.fromArray(p,3*m+3),!(Gx.distanceSqToSegment(a,h,l,u)>o))l.applyMatrix4(this.matrixWorld),(b=t.ray.origin.distanceTo(l))<t.near||b>t.far||e.push({distance:b,point:u.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}else if(i.isGeometry){var _=i.vertices,x=_.length;for(m=0;m<x-1;m+=c){var b;if(!(Gx.distanceSqToSegment(_[m],_[m+1],l,u)>o))l.applyMatrix4(this.matrixWorld),(b=t.ray.origin.distanceTo(l))<t.near||b>t.far||e.push({distance:b,point:u.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}});var qx=new Lm,Jx=new Lm;function Zx(t,e){Xx.call(this,t,e),this.type="LineSegments"}function Kx(t,e){Xx.call(this,t,e),this.type="LineLoop"}function Qx(t){Zv.call(this),this.type="PointsMaterial",this.color=new Wv(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(t)}Zx.prototype=Object.assign(Object.create(Xx.prototype),{constructor:Zx,isLineSegments:!0,computeLineDistances:function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,i=[],n=0,r=e.count;n<r;n+=2)qx.fromBufferAttribute(e,n),Jx.fromBufferAttribute(e,n+1),i[n]=0===n?0:i[n-1],i[n+1]=i[n]+qx.distanceTo(Jx);t.setAttribute("lineDistance",new ag(i,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(t.isGeometry){var s=t.vertices;for(i=t.lineDistances,n=0,r=s.length;n<r;n+=2)qx.copy(s[n]),Jx.copy(s[n+1]),i[n]=0===n?0:i[n-1],i[n+1]=i[n]+qx.distanceTo(Jx)}return this}}),Kx.prototype=Object.assign(Object.create(Xx.prototype),{constructor:Kx,isLineLoop:!0}),Qx.prototype=Object.create(Zv.prototype),Qx.prototype.constructor=Qx,Qx.prototype.isPointsMaterial=!0,Qx.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.morphTargets=t.morphTargets,this};var $x=new Im,tb=new Sv,eb=new gv,ib=new Lm;function nb(t,e){$m.call(this),this.type="Points",this.geometry=void 0!==t?t:new yg,this.material=void 0!==e?e:new Qx,this.updateMorphTargets()}function rb(t,e,i,n,r,s,o){var a=tb.distanceSqToPoint(t);if(a<i){var h=new Lm;tb.closestPointToPoint(t,h),h.applyMatrix4(n);var u=r.ray.origin.distanceTo(h);if(u<r.near||u>r.far)return;s.push({distance:u,distanceToRay:Math.sqrt(a),point:h,index:e,face:null,object:o})}}function sb(t,e,i,n,r,s,o,a,h){xm.call(this,t,e,i,n,r,s,o,a,h),this.format=void 0!==o?o:Jf,this.minFilter=void 0!==s?s:jf,this.magFilter=void 0!==r?r:jf,this.generateMipmaps=!1}function ob(t,e,i,n,r,s,o,a,h,u,l,c){xm.call(this,null,s,o,a,h,u,n,r,l,c),this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}function ab(t,e,i,n,r,s,o,a,h){xm.call(this,t,e,i,n,r,s,o,a,h),this.needsUpdate=!0}function hb(t,e,i,n,r,s,o,a,h,u){if((u=void 0!==u?u:Kf)!==Kf&&u!==Qf)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&u===Kf&&(i=Wf),void 0===i&&u===Qf&&(i=qf),xm.call(this,null,n,r,s,o,a,u,i,h),this.image={width:t,height:e},this.magFilter=void 0!==o?o:Nf,this.minFilter=void 0!==a?a:Nf,this.flipY=!1,this.generateMipmaps=!1}function ub(t){yg.call(this),this.type="WireframeGeometry";var e,i,n,r,s,o,a,h,u,l,c=[],d=[0,0],p={},f=["a","b","c"];if(t&&t.isGeometry){var m=t.faces;for(e=0,n=m.length;e<n;e++){var v=m[e];for(i=0;i<3;i++)a=v[f[i]],h=v[f[(i+1)%3]],d[0]=Math.min(a,h),d[1]=Math.max(a,h),void 0===p[u=d[0]+","+d[1]]&&(p[u]={index1:d[0],index2:d[1]})}for(u in p)o=p[u],l=t.vertices[o.index1],c.push(l.x,l.y,l.z),l=t.vertices[o.index2],c.push(l.x,l.y,l.z)}else if(t&&t.isBufferGeometry){var g,y,_,x,b,w,T;if(l=new Lm,null!==t.index){for(g=t.attributes.position,y=t.index,0===(_=t.groups).length&&(_=[{start:0,count:y.count,materialIndex:0}]),r=0,s=_.length;r<s;++r)for(e=b=(x=_[r]).start,n=b+x.count;e<n;e+=3)for(i=0;i<3;i++)a=y.getX(e+i),h=y.getX(e+(i+1)%3),d[0]=Math.min(a,h),d[1]=Math.max(a,h),void 0===p[u=d[0]+","+d[1]]&&(p[u]={index1:d[0],index2:d[1]});for(u in p)o=p[u],l.fromBufferAttribute(g,o.index1),c.push(l.x,l.y,l.z),l.fromBufferAttribute(g,o.index2),c.push(l.x,l.y,l.z)}else for(e=0,n=(g=t.attributes.position).count/3;e<n;e++)for(i=0;i<3;i++)w=3*e+i,l.fromBufferAttribute(g,w),c.push(l.x,l.y,l.z),T=3*e+(i+1)%3,l.fromBufferAttribute(g,T),c.push(l.x,l.y,l.z)}this.setAttribute("position",new ag(c,3))}function lb(t,e,i){zg.call(this),this.type="ParametricGeometry",this.parameters={func:t,slices:e,stacks:i},this.fromBufferGeometry(new cb(t,e,i)),this.mergeVertices()}function cb(t,e,i){yg.call(this),this.type="ParametricBufferGeometry",this.parameters={func:t,slices:e,stacks:i};var n,r,s=[],o=[],a=[],h=[],u=1e-5,l=new Lm,c=new Lm,d=new Lm,p=new Lm,f=new Lm;t.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");var m=e+1;for(n=0;n<=i;n++){var v=n/i;for(r=0;r<=e;r++){var g=r/e;t(g,v,c),o.push(c.x,c.y,c.z),g-u>=0?(t(g-u,v,d),p.subVectors(c,d)):(t(g+u,v,d),p.subVectors(d,c)),v-u>=0?(t(g,v-u,d),f.subVectors(c,d)):(t(g,v+u,d),f.subVectors(d,c)),l.crossVectors(p,f).normalize(),a.push(l.x,l.y,l.z),h.push(g,v)}}for(n=0;n<i;n++)for(r=0;r<e;r++){var y=n*m+r,_=n*m+r+1,x=(n+1)*m+r+1,b=(n+1)*m+r;s.push(y,_,b),s.push(_,x,b)}this.setIndex(s),this.setAttribute("position",new ag(o,3)),this.setAttribute("normal",new ag(a,3)),this.setAttribute("uv",new ag(h,2))}function db(t,e,i,n){zg.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:n},this.fromBufferGeometry(new pb(t,e,i,n)),this.mergeVertices()}function pb(t,e,i,n){yg.call(this),this.type="PolyhedronBufferGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:n},i=i||1;var r=[],s=[];function o(t,e,i,n){var r,s,o=Math.pow(2,n),h=[];for(r=0;r<=o;r++){h[r]=[];var u=t.clone().lerp(i,r/o),l=e.clone().lerp(i,r/o),c=o-r;for(s=0;s<=c;s++)h[r][s]=0===s&&r===o?u:u.clone().lerp(l,s/c)}for(r=0;r<o;r++)for(s=0;s<2*(o-r)-1;s++){var d=Math.floor(s/2);s%2==0?(a(h[r][d+1]),a(h[r+1][d]),a(h[r][d])):(a(h[r][d+1]),a(h[r+1][d+1]),a(h[r+1][d]))}}function a(t){r.push(t.x,t.y,t.z)}function h(e,i){var n=3*e;i.x=t[n+0],i.y=t[n+1],i.z=t[n+2]}function u(t,e,i,n){n<0&&1===t.x&&(s[e]=t.x-1),0===i.x&&0===i.z&&(s[e]=n/2/Math.PI+.5)}function l(t){return Math.atan2(t.z,-t.x)}!function(t){for(var i=new Lm,n=new Lm,r=new Lm,s=0;s<e.length;s+=3)h(e[s+0],i),h(e[s+1],n),h(e[s+2],r),o(i,n,r,t)}(n=n||0),function(t){for(var e=new Lm,i=0;i<r.length;i+=3)e.x=r[i+0],e.y=r[i+1],e.z=r[i+2],e.normalize().multiplyScalar(t),r[i+0]=e.x,r[i+1]=e.y,r[i+2]=e.z}(i),function(){for(var t=new Lm,e=0;e<r.length;e+=3){t.x=r[e+0],t.y=r[e+1],t.z=r[e+2];var i=l(t)/2/Math.PI+.5,n=(o=t,Math.atan2(-o.y,Math.sqrt(o.x*o.x+o.z*o.z))/Math.PI+.5);s.push(i,1-n)}var o;(function(){for(var t=new Lm,e=new Lm,i=new Lm,n=new Lm,o=new vm,a=new vm,h=new vm,c=0,d=0;c<r.length;c+=9,d+=6){t.set(r[c+0],r[c+1],r[c+2]),e.set(r[c+3],r[c+4],r[c+5]),i.set(r[c+6],r[c+7],r[c+8]),o.set(s[d+0],s[d+1]),a.set(s[d+2],s[d+3]),h.set(s[d+4],s[d+5]),n.copy(t).add(e).add(i).divideScalar(3);var p=l(n);u(o,d+0,t,p),u(a,d+2,e,p),u(h,d+4,i,p)}})(),function(){for(var t=0;t<s.length;t+=6){var e=s[t+0],i=s[t+2],n=s[t+4],r=Math.max(e,i,n),o=Math.min(e,i,n);r>.9&&o<.1&&(e<.2&&(s[t+0]+=1),i<.2&&(s[t+2]+=1),n<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new ag(r,3)),this.setAttribute("normal",new ag(r.slice(),3)),this.setAttribute("uv",new ag(s,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}function fb(t,e){zg.call(this),this.type="TetrahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new mb(t,e)),this.mergeVertices()}function mb(t,e){pb.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],t,e),this.type="TetrahedronBufferGeometry",this.parameters={radius:t,detail:e}}function vb(t,e){zg.call(this),this.type="OctahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new gb(t,e)),this.mergeVertices()}function gb(t,e){pb.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],t,e),this.type="OctahedronBufferGeometry",this.parameters={radius:t,detail:e}}function yb(t,e){zg.call(this),this.type="IcosahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new _b(t,e)),this.mergeVertices()}function _b(t,e){var i=(1+Math.sqrt(5))/2,n=[-1,i,0,1,i,0,-1,-i,0,1,-i,0,0,-1,i,0,1,i,0,-1,-i,0,1,-i,i,0,-1,i,0,1,-i,0,-1,-i,0,1];pb.call(this,n,[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],t,e),this.type="IcosahedronBufferGeometry",this.parameters={radius:t,detail:e}}function xb(t,e){zg.call(this),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new bb(t,e)),this.mergeVertices()}function bb(t,e){var i=(1+Math.sqrt(5))/2,n=1/i,r=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-n,-i,0,-n,i,0,n,-i,0,n,i,-n,-i,0,-n,i,0,n,-i,0,n,i,0,-i,0,-n,i,0,-n,-i,0,n,i,0,n];pb.call(this,r,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronBufferGeometry",this.parameters={radius:t,detail:e}}function wb(t,e,i,n,r,s){zg.call(this),this.type="TubeGeometry",this.parameters={path:t,tubularSegments:e,radius:i,radialSegments:n,closed:r},void 0!==s&&console.warn("THREE.TubeGeometry: taper has been removed.");var o=new Tb(t,e,i,n,r);this.tangents=o.tangents,this.normals=o.normals,this.binormals=o.binormals,this.fromBufferGeometry(o),this.mergeVertices()}function Tb(t,e,i,n,r){yg.call(this),this.type="TubeBufferGeometry",this.parameters={path:t,tubularSegments:e,radius:i,radialSegments:n,closed:r},e=e||64,i=i||1,n=n||8,r=r||!1;var s=t.computeFrenetFrames(e,r);this.tangents=s.tangents,this.normals=s.normals,this.binormals=s.binormals;var o,a,h=new Lm,u=new Lm,l=new vm,c=new Lm,d=[],p=[],f=[],m=[];function v(r){c=t.getPointAt(r/e,c);var o=s.normals[r],l=s.binormals[r];for(a=0;a<=n;a++){var f=a/n*Math.PI*2,m=Math.sin(f),v=-Math.cos(f);u.x=v*o.x+m*l.x,u.y=v*o.y+m*l.y,u.z=v*o.z+m*l.z,u.normalize(),p.push(u.x,u.y,u.z),h.x=c.x+i*u.x,h.y=c.y+i*u.y,h.z=c.z+i*u.z,d.push(h.x,h.y,h.z)}}!function(){for(o=0;o<e;o++)v(o);v(!1===r?e:0),function(){for(o=0;o<=e;o++)for(a=0;a<=n;a++)l.x=o/e,l.y=a/n,f.push(l.x,l.y)}(),function(){for(a=1;a<=e;a++)for(o=1;o<=n;o++){var t=(n+1)*(a-1)+(o-1),i=(n+1)*a+(o-1),r=(n+1)*a+o,s=(n+1)*(a-1)+o;m.push(t,i,s),m.push(i,r,s)}}()}(),this.setIndex(m),this.setAttribute("position",new ag(d,3)),this.setAttribute("normal",new ag(p,3)),this.setAttribute("uv",new ag(f,2))}function Mb(t,e,i,n,r,s,o){zg.call(this),this.type="TorusKnotGeometry",this.parameters={radius:t,tube:e,tubularSegments:i,radialSegments:n,p:r,q:s},void 0!==o&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."),this.fromBufferGeometry(new Sb(t,e,i,n,r,s)),this.mergeVertices()}function Sb(t,e,i,n,r,s){yg.call(this),this.type="TorusKnotBufferGeometry",this.parameters={radius:t,tube:e,tubularSegments:i,radialSegments:n,p:r,q:s},t=t||1,e=e||.4,i=Math.floor(i)||64,n=Math.floor(n)||8,r=r||2,s=s||3;var o,a,h=[],u=[],l=[],c=[],d=new Lm,p=new Lm,f=new Lm,m=new Lm,v=new Lm,g=new Lm,y=new Lm;for(o=0;o<=i;++o){var _=o/i*r*Math.PI*2;for(L(_,r,s,t,f),L(_+.01,r,s,t,m),g.subVectors(m,f),y.addVectors(m,f),v.crossVectors(g,y),y.crossVectors(v,g),v.normalize(),y.normalize(),a=0;a<=n;++a){var x=a/n*Math.PI*2,b=-e*Math.cos(x),w=e*Math.sin(x);d.x=f.x+(b*y.x+w*v.x),d.y=f.y+(b*y.y+w*v.y),d.z=f.z+(b*y.z+w*v.z),u.push(d.x,d.y,d.z),p.subVectors(d,f).normalize(),l.push(p.x,p.y,p.z),c.push(o/i),c.push(a/n)}}for(a=1;a<=i;a++)for(o=1;o<=n;o++){var T=(n+1)*(a-1)+(o-1),M=(n+1)*a+(o-1),S=(n+1)*a+o,E=(n+1)*(a-1)+o;h.push(T,M,E),h.push(M,S,E)}function L(t,e,i,n,r){var s=Math.cos(t),o=Math.sin(t),a=i/e*t,h=Math.cos(a);r.x=n*(2+h)*.5*s,r.y=n*(2+h)*o*.5,r.z=n*Math.sin(a)*.5}this.setIndex(h),this.setAttribute("position",new ag(u,3)),this.setAttribute("normal",new ag(l,3)),this.setAttribute("uv",new ag(c,2))}function Eb(t,e,i,n,r){zg.call(this),this.type="TorusGeometry",this.parameters={radius:t,tube:e,radialSegments:i,tubularSegments:n,arc:r},this.fromBufferGeometry(new Lb(t,e,i,n,r)),this.mergeVertices()}function Lb(t,e,i,n,r){yg.call(this),this.type="TorusBufferGeometry",this.parameters={radius:t,tube:e,radialSegments:i,tubularSegments:n,arc:r},t=t||1,e=e||.4,i=Math.floor(i)||8,n=Math.floor(n)||6,r=r||2*Math.PI;var s,o,a=[],h=[],u=[],l=[],c=new Lm,d=new Lm,p=new Lm;for(s=0;s<=i;s++)for(o=0;o<=n;o++){var f=o/n*r,m=s/i*Math.PI*2;d.x=(t+e*Math.cos(m))*Math.cos(f),d.y=(t+e*Math.cos(m))*Math.sin(f),d.z=e*Math.sin(m),h.push(d.x,d.y,d.z),c.x=t*Math.cos(f),c.y=t*Math.sin(f),p.subVectors(d,c).normalize(),u.push(p.x,p.y,p.z),l.push(o/n),l.push(s/i)}for(s=1;s<=i;s++)for(o=1;o<=n;o++){var v=(n+1)*s+o-1,g=(n+1)*(s-1)+o-1,y=(n+1)*(s-1)+o,_=(n+1)*s+o;a.push(v,g,_),a.push(g,y,_)}this.setIndex(a),this.setAttribute("position",new ag(h,3)),this.setAttribute("normal",new ag(u,3)),this.setAttribute("uv",new ag(l,2))}nb.prototype=Object.assign(Object.create($m.prototype),{constructor:nb,isPoints:!0,raycast:function(t,e){var i=this.geometry,n=this.matrixWorld,r=t.params.Points.threshold;if(null===i.boundingSphere&&i.computeBoundingSphere(),eb.copy(i.boundingSphere),eb.applyMatrix4(n),eb.radius+=r,!1!==t.ray.intersectsSphere(eb)){$x.getInverse(n),tb.copy(t.ray).applyMatrix4($x);var s=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=s*s;if(i.isBufferGeometry){var a=i.index,h=i.attributes.position.array;if(null!==a)for(var u=a.array,l=0,c=u.length;l<c;l++){var d=u[l];ib.fromArray(h,3*d),rb(ib,d,o,n,t,e,this)}else{l=0;for(var p=h.length/3;l<p;l++)ib.fromArray(h,3*l),rb(ib,l,o,n,t,e,this)}}else{var f=i.vertices;for(l=0,p=f.length;l<p;l++)rb(f[l],l,o,n,t,e,this)}}},updateMorphTargets:function(){var t,e,i,n=this.geometry;if(n.isBufferGeometry){var r=n.morphAttributes,s=Object.keys(r);if(s.length>0){var o=r[s[0]];if(void 0!==o)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=o.length;t<e;t++)i=o[t].name||String(t),this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}else{var a=n.morphTargets;void 0!==a&&a.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),sb.prototype=Object.assign(Object.create(xm.prototype),{constructor:sb,isVideoTexture:!0,update:function(){var t=this.image;t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),ob.prototype=Object.create(xm.prototype),ob.prototype.constructor=ob,ob.prototype.isCompressedTexture=!0,ab.prototype=Object.create(xm.prototype),ab.prototype.constructor=ab,ab.prototype.isCanvasTexture=!0,hb.prototype=Object.create(xm.prototype),hb.prototype.constructor=hb,hb.prototype.isDepthTexture=!0,ub.prototype=Object.create(yg.prototype),ub.prototype.constructor=ub,lb.prototype=Object.create(zg.prototype),lb.prototype.constructor=lb,cb.prototype=Object.create(yg.prototype),cb.prototype.constructor=cb,db.prototype=Object.create(zg.prototype),db.prototype.constructor=db,pb.prototype=Object.create(yg.prototype),pb.prototype.constructor=pb,fb.prototype=Object.create(zg.prototype),fb.prototype.constructor=fb,mb.prototype=Object.create(pb.prototype),mb.prototype.constructor=mb,vb.prototype=Object.create(zg.prototype),vb.prototype.constructor=vb,gb.prototype=Object.create(pb.prototype),gb.prototype.constructor=gb,yb.prototype=Object.create(zg.prototype),yb.prototype.constructor=yb,_b.prototype=Object.create(pb.prototype),_b.prototype.constructor=_b,xb.prototype=Object.create(zg.prototype),xb.prototype.constructor=xb,bb.prototype=Object.create(pb.prototype),bb.prototype.constructor=bb,wb.prototype=Object.create(zg.prototype),wb.prototype.constructor=wb,Tb.prototype=Object.create(yg.prototype),Tb.prototype.constructor=Tb,Tb.prototype.toJSON=function(){var t=yg.prototype.toJSON.call(this);return t.path=this.parameters.path.toJSON(),t},Mb.prototype=Object.create(zg.prototype),Mb.prototype.constructor=Mb,Sb.prototype=Object.create(yg.prototype),Sb.prototype.constructor=Sb,Eb.prototype=Object.create(zg.prototype),Eb.prototype.constructor=Eb,Lb.prototype=Object.create(yg.prototype),Lb.prototype.constructor=Lb;var Ab=function(t,e,i){i=i||2;var n,r,s,o,a,h,u,l=e&&e.length,c=l?e[0]*i:t.length,d=Db(t,0,c,i,!0),p=[];if(!d||d.next===d.prev)return p;if(l&&(d=function(t,e,i,n){var r,s,o,a=[];for(r=0,s=e.length;r<s;r++)(o=Db(t,e[r]*n,r<s-1?e[r+1]*n:t.length,n,!1))===o.next&&(o.steiner=!0),a.push(Bb(o));for(a.sort(Yb),r=0;r<a.length;r++)Fb(a[r],i),i=Pb(i,i.next);return i}(t,e,d,i)),t.length>80*i){n=s=t[0],r=o=t[1];for(var f=i;f<c;f+=i)(a=t[f])<n&&(n=a),(h=t[f+1])<r&&(r=h),a>s&&(s=a),h>o&&(o=h);u=0!==(u=Math.max(s-n,o-r))?1/u:0}return Cb(d,p,i,n,r,u),p};function Db(t,e,i,n,r){var s,o;if(r===function(t,e,i,n){for(var r=0,s=e,o=i-n;s<i;s+=n)r+=(t[o]-t[s])*(t[s+1]+t[o+1]),o=s;return r}(t,e,i,n)>0)for(s=e;s<i;s+=n)o=Xb(s,t[s],t[s+1],o);else for(s=i-n;s>=e;s-=n)o=Xb(s,t[s],t[s+1],o);return o&&zb(o,o.next)&&(qb(o),o=o.next),o}function Pb(t,e){if(!t)return t;e||(e=t);var i,n=t;do{if(i=!1,n.steiner||!zb(n,n.next)&&0!==Hb(n.prev,n,n.next))n=n.next;else{if(qb(n),(n=e=n.prev)===n.next)break;i=!0}}while(i||n!==e);return e}function Cb(t,e,i,n,r,s,o){if(t){!o&&s&&function(t,e,i,n){var r=t;do{null===r.z&&(r.z=Nb(r.x,r.y,e,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){var e,i,n,r,s,o,a,h,u=1;do{for(i=t,t=null,s=null,o=0;i;){for(o++,n=i,a=0,e=0;e<u&&(a++,n=n.nextZ);e++);for(h=u;a>0||h>0&&n;)0!==a&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,a--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;i=n}s.nextZ=null,u*=2}while(o>1)}(r)}(t,n,r,s);for(var a,h,u=t;t.prev!==t.next;)if(a=t.prev,h=t.next,s?kb(t,n,r,s):Ob(t))e.push(a.i/i),e.push(t.i/i),e.push(h.i/i),qb(t),t=h.next,u=h.next;else if((t=h)===u){o?1===o?Cb(t=Rb(t,e,i),e,i,n,r,s,2):2===o&&Ib(t,e,i,n,r,s):Cb(Pb(t),e,i,n,r,s,1);break}}}function Ob(t){var e=t.prev,i=t,n=t.next;if(Hb(e,i,n)>=0)return!1;for(var r=t.next.next;r!==t.prev;){if(Ub(e.x,e.y,i.x,i.y,n.x,n.y,r.x,r.y)&&Hb(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function kb(t,e,i,n){var r=t.prev,s=t,o=t.next;if(Hb(r,s,o)>=0)return!1;for(var a=r.x<s.x?r.x<o.x?r.x:o.x:s.x<o.x?s.x:o.x,h=r.y<s.y?r.y<o.y?r.y:o.y:s.y<o.y?s.y:o.y,u=r.x>s.x?r.x>o.x?r.x:o.x:s.x>o.x?s.x:o.x,l=r.y>s.y?r.y>o.y?r.y:o.y:s.y>o.y?s.y:o.y,c=Nb(a,h,e,i,n),d=Nb(u,l,e,i,n),p=t.prevZ,f=t.nextZ;p&&p.z>=c&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Ub(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&Hb(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Ub(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&Hb(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=c;){if(p!==t.prev&&p!==t.next&&Ub(r.x,r.y,s.x,s.y,o.x,o.y,p.x,p.y)&&Hb(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Ub(r.x,r.y,s.x,s.y,o.x,o.y,f.x,f.y)&&Hb(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function Rb(t,e,i){var n=t;do{var r=n.prev,s=n.next.next;!zb(r,s)&&Wb(r,n,n.next,s)&&Gb(r,s)&&Gb(s,r)&&(e.push(r.i/i),e.push(n.i/i),e.push(s.i/i),qb(n),qb(n.next),n=t=s),n=n.next}while(n!==t);return n}function Ib(t,e,i,n,r,s){var o=t;do{for(var a=o.next.next;a!==o.prev;){if(o.i!==a.i&&jb(o,a)){var h=Vb(o,a);return o=Pb(o,o.next),h=Pb(h,h.next),Cb(o,e,i,n,r,s),void Cb(h,e,i,n,r,s)}a=a.next}o=o.next}while(o!==t)}function Yb(t,e){return t.x-e.x}function Fb(t,e){if(e=function(t,e){var i,n=e,r=t.x,s=t.y,o=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var a=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=r&&a>o){if(o=a,a===r){if(s===n.y)return n;if(s===n.next.y)return n.next}i=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!i)return null;if(r===o)return i.prev;var h,u=i,l=i.x,c=i.y,d=1/0;n=i.next;for(;n!==u;)r>=n.x&&n.x>=l&&r!==n.x&&Ub(s<c?r:o,s,l,c,s<c?o:r,s,n.x,n.y)&&((h=Math.abs(s-n.y)/(r-n.x))<d||h===d&&n.x>i.x)&&Gb(n,t)&&(i=n,d=h),n=n.next;return i}(t,e)){var i=Vb(e,t);Pb(i,i.next)}}function Nb(t,e,i,n,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Bb(t){var e=t,i=t;do{(e.x<i.x||e.x===i.x&&e.y<i.y)&&(i=e),e=e.next}while(e!==t);return i}function Ub(t,e,i,n,r,s,o,a){return(r-o)*(e-a)-(t-o)*(s-a)>=0&&(t-o)*(n-a)-(i-o)*(e-a)>=0&&(i-o)*(s-a)-(r-o)*(n-a)>=0}function jb(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Wb(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&Gb(t,e)&&Gb(e,t)&&function(t,e){var i=t,n=!1,r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==t);return n}(t,e)}function Hb(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function zb(t,e){return t.x===e.x&&t.y===e.y}function Wb(t,e,i,n){return!!(zb(t,i)&&zb(e,n)||zb(t,n)&&zb(i,e))||Hb(t,e,i)>0!=Hb(t,e,n)>0&&Hb(i,n,t)>0!=Hb(i,n,e)>0}function Gb(t,e){return Hb(t.prev,t,t.next)<0?Hb(t,e,t.next)>=0&&Hb(t,t.prev,e)>=0:Hb(t,e,t.prev)<0||Hb(t,t.next,e)<0}function Vb(t,e){var i=new Jb(t.i,t.x,t.y),n=new Jb(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Xb(t,e,i,n){var r=new Jb(t,e,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function qb(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Jb(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var Zb={area:function(t){for(var e=t.length,i=0,n=e-1,r=0;r<e;n=r++)i+=t[n].x*t[r].y-t[r].x*t[n].y;return.5*i},isClockWise:function(t){return Zb.area(t)<0},triangulateShape:function(t,e){var i=[],n=[],r=[];Kb(t),Qb(i,t);var s=t.length;e.forEach(Kb);for(var o=0;o<e.length;o++)n.push(s),s+=e[o].length,Qb(i,e[o]);var a=Ab(i,n);for(o=0;o<a.length;o+=3)r.push(a.slice(o,o+3));return r}};function Kb(t){var e=t.length;e>2&&t[e-1].equals(t[0])&&t.pop()}function Qb(t,e){for(var i=0;i<e.length;i++)t.push(e[i].x),t.push(e[i].y)}function $b(t,e){zg.call(this),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:e},this.fromBufferGeometry(new tw(t,e)),this.mergeVertices()}function tw(t,e){yg.call(this),this.type="ExtrudeBufferGeometry",this.parameters={shapes:t,options:e},t=Array.isArray(t)?t:[t];for(var i=this,n=[],r=[],s=0,o=t.length;s<o;s++){a(t[s])}function a(t){var s=[],o=void 0!==e.curveSegments?e.curveSegments:12,a=void 0!==e.steps?e.steps:1,h=void 0!==e.depth?e.depth:100,u=void 0===e.bevelEnabled||e.bevelEnabled,l=void 0!==e.bevelThickness?e.bevelThickness:6,c=void 0!==e.bevelSize?e.bevelSize:l-2,d=void 0!==e.bevelOffset?e.bevelOffset:0,p=void 0!==e.bevelSegments?e.bevelSegments:3,f=e.extrudePath,m=void 0!==e.UVGenerator?e.UVGenerator:ew;void 0!==e.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),h=e.amount);var v,g,y,_,x,b,w,T,M=!1;f&&(v=f.getSpacedPoints(a),M=!0,u=!1,g=f.computeFrenetFrames(a,!1),y=new Lm,_=new Lm,x=new Lm),u||(p=0,l=0,c=0,d=0);var S=t.extractPoints(o),E=S.shape,L=S.holes;if(!Zb.isClockWise(E))for(E=E.reverse(),w=0,T=L.length;w<T;w++)b=L[w],Zb.isClockWise(b)&&(L[w]=b.reverse());var A=Zb.triangulateShape(E,L),D=E;for(w=0,T=L.length;w<T;w++)b=L[w],E=E.concat(b);function P(t,e,i){return e||console.error("THREE.ExtrudeGeometry: vec does not exist"),e.clone().multiplyScalar(i).add(t)}var C,O,k,R,I,Y,F=E.length,N=A.length;function B(t,e,i){var n,r,s,o=t.x-e.x,a=t.y-e.y,h=i.x-t.x,u=i.y-t.y,l=o*o+a*a,c=o*u-a*h;if(Math.abs(c)>Number.EPSILON){var d=Math.sqrt(l),p=Math.sqrt(h*h+u*u),f=e.x-a/d,m=e.y+o/d,v=((i.x-u/p-f)*u-(i.y+h/p-m)*h)/(o*u-a*h),g=(n=f+o*v-t.x)*n+(r=m+a*v-t.y)*r;if(g<=2)return new vm(n,r);s=Math.sqrt(g/2)}else{var y=!1;o>Number.EPSILON?h>Number.EPSILON&&(y=!0):o<-Number.EPSILON?h<-Number.EPSILON&&(y=!0):Math.sign(a)===Math.sign(u)&&(y=!0),y?(n=-a,r=o,s=Math.sqrt(l)):(n=o,r=a,s=Math.sqrt(l/2))}return new vm(n/s,r/s)}for(var U=[],j=0,H=D.length,z=H-1,W=j+1;j<H;j++,z++,W++)z===H&&(z=0),W===H&&(W=0),U[j]=B(D[j],D[z],D[W]);var G,V,X=[],q=U.concat();for(w=0,T=L.length;w<T;w++){for(b=L[w],G=[],j=0,z=(H=b.length)-1,W=j+1;j<H;j++,z++,W++)z===H&&(z=0),W===H&&(W=0),G[j]=B(b[j],b[z],b[W]);X.push(G),q=q.concat(G)}for(C=0;C<p;C++){for(k=C/p,R=l*Math.cos(k*Math.PI/2),O=c*Math.sin(k*Math.PI/2)+d,j=0,H=D.length;j<H;j++)Z((I=P(D[j],U[j],O)).x,I.y,-R);for(w=0,T=L.length;w<T;w++)for(b=L[w],G=X[w],j=0,H=b.length;j<H;j++)Z((I=P(b[j],G[j],O)).x,I.y,-R)}for(O=c+d,j=0;j<F;j++)I=u?P(E[j],q[j],O):E[j],M?(_.copy(g.normals[0]).multiplyScalar(I.x),y.copy(g.binormals[0]).multiplyScalar(I.y),x.copy(v[0]).add(_).add(y),Z(x.x,x.y,x.z)):Z(I.x,I.y,0);for(V=1;V<=a;V++)for(j=0;j<F;j++)I=u?P(E[j],q[j],O):E[j],M?(_.copy(g.normals[V]).multiplyScalar(I.x),y.copy(g.binormals[V]).multiplyScalar(I.y),x.copy(v[V]).add(_).add(y),Z(x.x,x.y,x.z)):Z(I.x,I.y,h/a*V);for(C=p-1;C>=0;C--){for(k=C/p,R=l*Math.cos(k*Math.PI/2),O=c*Math.sin(k*Math.PI/2)+d,j=0,H=D.length;j<H;j++)Z((I=P(D[j],U[j],O)).x,I.y,h+R);for(w=0,T=L.length;w<T;w++)for(b=L[w],G=X[w],j=0,H=b.length;j<H;j++)I=P(b[j],G[j],O),M?Z(I.x,I.y+v[a-1].y,v[a-1].x+R):Z(I.x,I.y,h+R)}function J(t,e){var i,n;for(j=t.length;--j>=0;){i=j,(n=j-1)<0&&(n=t.length-1);var r=0,s=a+2*p;for(r=0;r<s;r++){var o=F*r,h=F*(r+1);Q(e+i+o,e+n+o,e+n+h,e+i+h)}}}function Z(t,e,i){s.push(t),s.push(e),s.push(i)}function K(t,e,r){$(t),$(e),$(r);var s=n.length/3,o=m.generateTopUV(i,n,s-3,s-2,s-1);tt(o[0]),tt(o[1]),tt(o[2])}function Q(t,e,r,s){$(t),$(e),$(s),$(e),$(r),$(s);var o=n.length/3,a=m.generateSideWallUV(i,n,o-6,o-3,o-2,o-1);tt(a[0]),tt(a[1]),tt(a[3]),tt(a[1]),tt(a[2]),tt(a[3])}function $(t){n.push(s[3*t+0]),n.push(s[3*t+1]),n.push(s[3*t+2])}function tt(t){r.push(t.x),r.push(t.y)}!function(){var t=n.length/3;if(u){var e=0,r=F*e;for(j=0;j<N;j++)K((Y=A[j])[2]+r,Y[1]+r,Y[0]+r);for(r=F*(e=a+2*p),j=0;j<N;j++)K((Y=A[j])[0]+r,Y[1]+r,Y[2]+r)}else{for(j=0;j<N;j++)K((Y=A[j])[2],Y[1],Y[0]);for(j=0;j<N;j++)K((Y=A[j])[0]+F*a,Y[1]+F*a,Y[2]+F*a)}i.addGroup(t,n.length/3-t,0)}(),function(){var t=n.length/3,e=0;for(J(D,e),e+=D.length,w=0,T=L.length;w<T;w++)J(b=L[w],e),e+=b.length;i.addGroup(t,n.length/3-t,1)}()}this.setAttribute("position",new ag(n,3)),this.setAttribute("uv",new ag(r,2)),this.computeVertexNormals()}$b.prototype=Object.create(zg.prototype),$b.prototype.constructor=$b,$b.prototype.toJSON=function(){var t=zg.prototype.toJSON.call(this);return iw(this.parameters.shapes,this.parameters.options,t)},tw.prototype=Object.create(yg.prototype),tw.prototype.constructor=tw,tw.prototype.toJSON=function(){var t=yg.prototype.toJSON.call(this);return iw(this.parameters.shapes,this.parameters.options,t)};var ew={generateTopUV:function(t,e,i,n,r){var s=e[3*i],o=e[3*i+1],a=e[3*n],h=e[3*n+1],u=e[3*r],l=e[3*r+1];return[new vm(s,o),new vm(a,h),new vm(u,l)]},generateSideWallUV:function(t,e,i,n,r,s){var o=e[3*i],a=e[3*i+1],h=e[3*i+2],u=e[3*n],l=e[3*n+1],c=e[3*n+2],d=e[3*r],p=e[3*r+1],f=e[3*r+2],m=e[3*s],v=e[3*s+1],g=e[3*s+2];return Math.abs(a-l)<.01?[new vm(o,1-h),new vm(u,1-c),new vm(d,1-f),new vm(m,1-g)]:[new vm(a,1-h),new vm(l,1-c),new vm(p,1-f),new vm(v,1-g)]}};function iw(t,e,i){if(i.shapes=[],Array.isArray(t))for(var n=0,r=t.length;n<r;n++){var s=t[n];i.shapes.push(s.uuid)}else i.shapes.push(t.uuid);return void 0!==e.extrudePath&&(i.options.extrudePath=e.extrudePath.toJSON()),i}function nw(t,e){zg.call(this),this.type="TextGeometry",this.parameters={text:t,parameters:e},this.fromBufferGeometry(new rw(t,e)),this.mergeVertices()}function rw(t,e){var i=(e=e||{}).font;if(!i||!i.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new zg;var n=i.generateShapes(t,e.size);e.depth=void 0!==e.height?e.height:50,void 0===e.bevelThickness&&(e.bevelThickness=10),void 0===e.bevelSize&&(e.bevelSize=8),void 0===e.bevelEnabled&&(e.bevelEnabled=!1),tw.call(this,n,e),this.type="TextBufferGeometry"}function sw(t,e,i,n,r,s,o){zg.call(this),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:i,phiStart:n,phiLength:r,thetaStart:s,thetaLength:o},this.fromBufferGeometry(new ow(t,e,i,n,r,s,o)),this.mergeVertices()}function ow(t,e,i,n,r,s,o){yg.call(this),this.type="SphereBufferGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:i,phiStart:n,phiLength:r,thetaStart:s,thetaLength:o},t=t||1,e=Math.max(3,Math.floor(e)||8),i=Math.max(2,Math.floor(i)||6),n=void 0!==n?n:0,r=void 0!==r?r:2*Math.PI,s=void 0!==s?s:0,o=void 0!==o?o:Math.PI;var a,h,u=Math.min(s+o,Math.PI),l=0,c=[],d=new Lm,p=new Lm,f=[],m=[],v=[],g=[];for(h=0;h<=i;h++){var y=[],_=h/i,x=0;for(0==h&&0==s?x=.5/e:h==i&&u==Math.PI&&(x=-.5/e),a=0;a<=e;a++){var b=a/e;d.x=-t*Math.cos(n+b*r)*Math.sin(s+_*o),d.y=t*Math.cos(s+_*o),d.z=t*Math.sin(n+b*r)*Math.sin(s+_*o),m.push(d.x,d.y,d.z),p.copy(d).normalize(),v.push(p.x,p.y,p.z),g.push(b+x,1-_),y.push(l++)}c.push(y)}for(h=0;h<i;h++)for(a=0;a<e;a++){var w=c[h][a+1],T=c[h][a],M=c[h+1][a],S=c[h+1][a+1];(0!==h||s>0)&&f.push(w,T,S),(h!==i-1||u<Math.PI)&&f.push(T,M,S)}this.setIndex(f),this.setAttribute("position",new ag(m,3)),this.setAttribute("normal",new ag(v,3)),this.setAttribute("uv",new ag(g,2))}function aw(t,e,i,n,r,s){zg.call(this),this.type="RingGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:i,phiSegments:n,thetaStart:r,thetaLength:s},this.fromBufferGeometry(new hw(t,e,i,n,r,s)),this.mergeVertices()}function hw(t,e,i,n,r,s){yg.call(this),this.type="RingBufferGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:i,phiSegments:n,thetaStart:r,thetaLength:s},t=t||.5,e=e||1,r=void 0!==r?r:0,s=void 0!==s?s:2*Math.PI,i=void 0!==i?Math.max(3,i):8;var o,a,h,u=[],l=[],c=[],d=[],p=t,f=(e-t)/(n=void 0!==n?Math.max(1,n):1),m=new Lm,v=new vm;for(a=0;a<=n;a++){for(h=0;h<=i;h++)o=r+h/i*s,m.x=p*Math.cos(o),m.y=p*Math.sin(o),l.push(m.x,m.y,m.z),c.push(0,0,1),v.x=(m.x/e+1)/2,v.y=(m.y/e+1)/2,d.push(v.x,v.y);p+=f}for(a=0;a<n;a++){var g=a*(i+1);for(h=0;h<i;h++){var y=o=h+g,_=o+i+1,x=o+i+2,b=o+1;u.push(y,_,b),u.push(_,x,b)}}this.setIndex(u),this.setAttribute("position",new ag(l,3)),this.setAttribute("normal",new ag(c,3)),this.setAttribute("uv",new ag(d,2))}function uw(t,e,i,n){zg.call(this),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:n},this.fromBufferGeometry(new lw(t,e,i,n)),this.mergeVertices()}function lw(t,e,i,n){yg.call(this),this.type="LatheBufferGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:n},e=Math.floor(e)||12,i=i||0,n=n||2*Math.PI,n=mm.clamp(n,0,2*Math.PI);var r,s,o,a=[],h=[],u=[],l=1/e,c=new Lm,d=new vm;for(s=0;s<=e;s++){var p=i+s*l*n,f=Math.sin(p),m=Math.cos(p);for(o=0;o<=t.length-1;o++)c.x=t[o].x*f,c.y=t[o].y,c.z=t[o].x*m,h.push(c.x,c.y,c.z),d.x=s/e,d.y=o/(t.length-1),u.push(d.x,d.y)}for(s=0;s<e;s++)for(o=0;o<t.length-1;o++){var v=r=o+s*t.length,g=r+t.length,y=r+t.length+1,_=r+1;a.push(v,g,_),a.push(g,y,_)}if(this.setIndex(a),this.setAttribute("position",new ag(h,3)),this.setAttribute("uv",new ag(u,2)),this.computeVertexNormals(),n===2*Math.PI){var x=this.attributes.normal.array,b=new Lm,w=new Lm,T=new Lm;for(r=e*t.length*3,s=0,o=0;s<t.length;s++,o+=3)b.x=x[o+0],b.y=x[o+1],b.z=x[o+2],w.x=x[r+o+0],w.y=x[r+o+1],w.z=x[r+o+2],T.addVectors(b,w).normalize(),x[o+0]=x[r+o+0]=T.x,x[o+1]=x[r+o+1]=T.y,x[o+2]=x[r+o+2]=T.z}}function cw(t,e){zg.call(this),this.type="ShapeGeometry","object"==typeof e&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),e=e.curveSegments),this.parameters={shapes:t,curveSegments:e},this.fromBufferGeometry(new dw(t,e)),this.mergeVertices()}function dw(t,e){yg.call(this),this.type="ShapeBufferGeometry",this.parameters={shapes:t,curveSegments:e},e=e||12;var i=[],n=[],r=[],s=[],o=0,a=0;if(!1===Array.isArray(t))u(t);else for(var h=0;h<t.length;h++)u(t[h]),this.addGroup(o,a,h),o+=a,a=0;function u(t){var o,h,u,l=n.length/3,c=t.extractPoints(e),d=c.shape,p=c.holes;for(!1===Zb.isClockWise(d)&&(d=d.reverse()),o=0,h=p.length;o<h;o++)u=p[o],!0===Zb.isClockWise(u)&&(p[o]=u.reverse());var f=Zb.triangulateShape(d,p);for(o=0,h=p.length;o<h;o++)u=p[o],d=d.concat(u);for(o=0,h=d.length;o<h;o++){var m=d[o];n.push(m.x,m.y,0),r.push(0,0,1),s.push(m.x,m.y)}for(o=0,h=f.length;o<h;o++){var v=f[o],g=v[0]+l,y=v[1]+l,_=v[2]+l;i.push(g,y,_),a+=3}}this.setIndex(i),this.setAttribute("position",new ag(n,3)),this.setAttribute("normal",new ag(r,3)),this.setAttribute("uv",new ag(s,2))}function pw(t,e){if(e.shapes=[],Array.isArray(t))for(var i=0,n=t.length;i<n;i++){var r=t[i];e.shapes.push(r.uuid)}else e.shapes.push(t.uuid);return e}function fw(t,e){yg.call(this),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1;var i,n,r,s,o=[],a=Math.cos(mm.DEG2RAD*e),h=[0,0],u={},l=["a","b","c"];t.isBufferGeometry?(s=new zg).fromBufferGeometry(t):s=t.clone(),s.mergeVertices(),s.computeFaceNormals();for(var c=s.vertices,d=s.faces,p=0,f=d.length;p<f;p++)for(var m=d[p],v=0;v<3;v++)i=m[l[v]],n=m[l[(v+1)%3]],h[0]=Math.min(i,n),h[1]=Math.max(i,n),void 0===u[r=h[0]+","+h[1]]?u[r]={index1:h[0],index2:h[1],face1:p,face2:void 0}:u[r].face2=p;for(r in u){var g=u[r];if(void 0===g.face2||d[g.face1].normal.dot(d[g.face2].normal)<=a){var y=c[g.index1];o.push(y.x,y.y,y.z),y=c[g.index2],o.push(y.x,y.y,y.z)}}this.setAttribute("position",new ag(o,3))}function mw(t,e,i,n,r,s,o,a){zg.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:i,radialSegments:n,heightSegments:r,openEnded:s,thetaStart:o,thetaLength:a},this.fromBufferGeometry(new vw(t,e,i,n,r,s,o,a)),this.mergeVertices()}function vw(t,e,i,n,r,s,o,a){yg.call(this),this.type="CylinderBufferGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:i,radialSegments:n,heightSegments:r,openEnded:s,thetaStart:o,thetaLength:a};var h=this;t=void 0!==t?t:1,e=void 0!==e?e:1,i=i||1,n=Math.floor(n)||8,r=Math.floor(r)||1,s=void 0!==s&&s,o=void 0!==o?o:0,a=void 0!==a?a:2*Math.PI;var u=[],l=[],c=[],d=[],p=0,f=[],m=i/2,v=0;function g(i){var r,s,f,g=new vm,y=new Lm,_=0,x=!0===i?t:e,b=!0===i?1:-1;for(s=p,r=1;r<=n;r++)l.push(0,m*b,0),c.push(0,b,0),d.push(.5,.5),p++;for(f=p,r=0;r<=n;r++){var w=r/n*a+o,T=Math.cos(w),M=Math.sin(w);y.x=x*M,y.y=m*b,y.z=x*T,l.push(y.x,y.y,y.z),c.push(0,b,0),g.x=.5*T+.5,g.y=.5*M*b+.5,d.push(g.x,g.y),p++}for(r=0;r<n;r++){var S=s+r,E=f+r;!0===i?u.push(E,E+1,S):u.push(E+1,E,S),_+=3}h.addGroup(v,_,!0===i?1:2),v+=_}!function(){var s,g,y=new Lm,_=new Lm,x=0,b=(e-t)/i;for(g=0;g<=r;g++){var w=[],T=g/r,M=T*(e-t)+t;for(s=0;s<=n;s++){var S=s/n,E=S*a+o,L=Math.sin(E),A=Math.cos(E);_.x=M*L,_.y=-T*i+m,_.z=M*A,l.push(_.x,_.y,_.z),y.set(L,b,A).normalize(),c.push(y.x,y.y,y.z),d.push(S,1-T),w.push(p++)}f.push(w)}for(s=0;s<n;s++)for(g=0;g<r;g++){var D=f[g][s],P=f[g+1][s],C=f[g+1][s+1],O=f[g][s+1];u.push(D,P,O),u.push(P,C,O),x+=6}h.addGroup(v,x,0),v+=x}(),!1===s&&(t>0&&g(!0),e>0&&g(!1)),this.setIndex(u),this.setAttribute("position",new ag(l,3)),this.setAttribute("normal",new ag(c,3)),this.setAttribute("uv",new ag(d,2))}function gw(t,e,i,n,r,s,o){mw.call(this,0,t,e,i,n,r,s,o),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:o}}function yw(t,e,i,n,r,s,o){vw.call(this,0,t,e,i,n,r,s,o),this.type="ConeBufferGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:o}}function _w(t,e,i,n){zg.call(this),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:i,thetaLength:n},this.fromBufferGeometry(new xw(t,e,i,n)),this.mergeVertices()}function xw(t,e,i,n){yg.call(this),this.type="CircleBufferGeometry",this.parameters={radius:t,segments:e,thetaStart:i,thetaLength:n},t=t||1,e=void 0!==e?Math.max(3,e):8,i=void 0!==i?i:0,n=void 0!==n?n:2*Math.PI;var r,s,o=[],a=[],h=[],u=[],l=new Lm,c=new vm;for(a.push(0,0,0),h.push(0,0,1),u.push(.5,.5),s=0,r=3;s<=e;s++,r+=3){var d=i+s/e*n;l.x=t*Math.cos(d),l.y=t*Math.sin(d),a.push(l.x,l.y,l.z),h.push(0,0,1),c.x=(a[r]/t+1)/2,c.y=(a[r+1]/t+1)/2,u.push(c.x,c.y)}for(r=1;r<=e;r++)o.push(r,r+1,0);this.setIndex(o),this.setAttribute("position",new ag(a,3)),this.setAttribute("normal",new ag(h,3)),this.setAttribute("uv",new ag(u,2))}nw.prototype=Object.create(zg.prototype),nw.prototype.constructor=nw,rw.prototype=Object.create(tw.prototype),rw.prototype.constructor=rw,sw.prototype=Object.create(zg.prototype),sw.prototype.constructor=sw,ow.prototype=Object.create(yg.prototype),ow.prototype.constructor=ow,aw.prototype=Object.create(zg.prototype),aw.prototype.constructor=aw,hw.prototype=Object.create(yg.prototype),hw.prototype.constructor=hw,uw.prototype=Object.create(zg.prototype),uw.prototype.constructor=uw,lw.prototype=Object.create(yg.prototype),lw.prototype.constructor=lw,cw.prototype=Object.create(zg.prototype),cw.prototype.constructor=cw,cw.prototype.toJSON=function(){var t=zg.prototype.toJSON.call(this);return pw(this.parameters.shapes,t)},dw.prototype=Object.create(yg.prototype),dw.prototype.constructor=dw,dw.prototype.toJSON=function(){var t=yg.prototype.toJSON.call(this);return pw(this.parameters.shapes,t)},fw.prototype=Object.create(yg.prototype),fw.prototype.constructor=fw,mw.prototype=Object.create(zg.prototype),mw.prototype.constructor=mw,vw.prototype=Object.create(yg.prototype),vw.prototype.constructor=vw,gw.prototype=Object.create(mw.prototype),gw.prototype.constructor=gw,yw.prototype=Object.create(vw.prototype),yw.prototype.constructor=yw,_w.prototype=Object.create(zg.prototype),_w.prototype.constructor=_w,xw.prototype=Object.create(yg.prototype),xw.prototype.constructor=xw;var bw=Object.freeze({__proto__:null,WireframeGeometry:ub,ParametricGeometry:lb,ParametricBufferGeometry:cb,TetrahedronGeometry:fb,TetrahedronBufferGeometry:mb,OctahedronGeometry:vb,OctahedronBufferGeometry:gb,IcosahedronGeometry:yb,IcosahedronBufferGeometry:_b,DodecahedronGeometry:xb,DodecahedronBufferGeometry:bb,PolyhedronGeometry:db,PolyhedronBufferGeometry:pb,TubeGeometry:wb,TubeBufferGeometry:Tb,TorusKnotGeometry:Mb,TorusKnotBufferGeometry:Sb,TorusGeometry:Eb,TorusBufferGeometry:Lb,TextGeometry:nw,TextBufferGeometry:rw,SphereGeometry:sw,SphereBufferGeometry:ow,RingGeometry:aw,RingBufferGeometry:hw,PlaneGeometry:ay,PlaneBufferGeometry:hy,LatheGeometry:uw,LatheBufferGeometry:lw,ShapeGeometry:cw,ShapeBufferGeometry:dw,ExtrudeGeometry:$b,ExtrudeBufferGeometry:tw,EdgesGeometry:fw,ConeGeometry:gw,ConeBufferGeometry:yw,CylinderGeometry:mw,CylinderBufferGeometry:vw,CircleGeometry:_w,CircleBufferGeometry:xw,BoxGeometry:class extends zg{constructor(t,e,i,n,r,s){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:n,heightSegments:r,depthSegments:s},this.fromBufferGeometry(new Wg(t,e,i,n,r,s)),this.mergeVertices()}},BoxBufferGeometry:Wg});function ww(t){Zv.call(this),this.type="ShadowMaterial",this.color=new Wv(0),this.transparent=!0,this.setValues(t)}function Tw(t){qg.call(this,t),this.type="RawShaderMaterial"}function Mw(t){Zv.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new Wv(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Wv(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vm(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.vertexTangents=!1,this.setValues(t)}function Sw(t){Mw.call(this),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoat=0,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new vm(1,1),this.clearcoatNormalMap=null,this.reflectivity=.5,this.sheen=null,this.transparency=0,this.setValues(t)}function Ew(t){Zv.call(this),this.type="MeshPhongMaterial",this.color=new Wv(16777215),this.specular=new Wv(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Wv(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vm(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Lw(t){Zv.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Wv(16777215),this.specular=new Wv(1118481),this.shininess=30,this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Wv(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vm(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Aw(t){Zv.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vm(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Dw(t){Zv.call(this),this.type="MeshLambertMaterial",this.color=new Wv(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Wv(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Pw(t){Zv.call(this),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Wv(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vm(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function Cw(t){jx.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}ww.prototype=Object.create(Zv.prototype),ww.prototype.constructor=ww,ww.prototype.isShadowMaterial=!0,ww.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this},Tw.prototype=Object.create(qg.prototype),Tw.prototype.constructor=Tw,Tw.prototype.isRawShaderMaterial=!0,Mw.prototype=Object.create(Zv.prototype),Mw.prototype.constructor=Mw,Mw.prototype.isMeshStandardMaterial=!0,Mw.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.vertexTangents=t.vertexTangents,this},Sw.prototype=Object.create(Mw.prototype),Sw.prototype.constructor=Sw,Sw.prototype.isMeshPhysicalMaterial=!0,Sw.prototype.copy=function(t){return Mw.prototype.copy.call(this,t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.reflectivity=t.reflectivity,t.sheen?this.sheen=(this.sheen||new Wv).copy(t.sheen):this.sheen=null,this.transparency=t.transparency,this},Ew.prototype=Object.create(Zv.prototype),Ew.prototype.constructor=Ew,Ew.prototype.isMeshPhongMaterial=!0,Ew.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Lw.prototype=Object.create(Zv.prototype),Lw.prototype.constructor=Lw,Lw.prototype.isMeshToonMaterial=!0,Lw.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Aw.prototype=Object.create(Zv.prototype),Aw.prototype.constructor=Aw,Aw.prototype.isMeshNormalMaterial=!0,Aw.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Dw.prototype=Object.create(Zv.prototype),Dw.prototype.constructor=Dw,Dw.prototype.isMeshLambertMaterial=!0,Dw.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Pw.prototype=Object.create(Zv.prototype),Pw.prototype.constructor=Pw,Pw.prototype.isMeshMatcapMaterial=!0,Pw.prototype.copy=function(t){return Zv.prototype.copy.call(this,t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},Cw.prototype=Object.create(jx.prototype),Cw.prototype.constructor=Cw,Cw.prototype.isLineDashedMaterial=!0,Cw.prototype.copy=function(t){return jx.prototype.copy.call(this,t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this};var Ow=Object.freeze({__proto__:null,ShadowMaterial:ww,SpriteMaterial:px,RawShaderMaterial:Tw,ShaderMaterial:qg,PointsMaterial:Qx,MeshPhysicalMaterial:Sw,MeshStandardMaterial:Mw,MeshPhongMaterial:Ew,MeshToonMaterial:Lw,MeshNormalMaterial:Aw,MeshLambertMaterial:Dw,MeshDepthMaterial:K_,MeshDistanceMaterial:Q_,MeshBasicMaterial:Kv,MeshMatcapMaterial:Pw,LineDashedMaterial:Cw,LineBasicMaterial:jx,Material:Zv}),kw={arraySlice:function(t,e,i){return kw.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)},convertArray:function(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){for(var e=t.length,i=new Array(e),n=0;n!==e;++n)i[n]=n;return i.sort((function(e,i){return t[e]-t[i]})),i},sortedArray:function(t,e,i){for(var n=t.length,r=new t.constructor(n),s=0,o=0;o!==n;++s)for(var a=i[s]*e,h=0;h!==e;++h)r[o++]=t[a+h];return r},flattenJSON:function(t,e,i,n){for(var r=1,s=t[0];void 0!==s&&void 0===s[n];)s=t[r++];if(void 0!==s){var o=s[n];if(void 0!==o)if(Array.isArray(o))do{void 0!==(o=s[n])&&(e.push(s.time),i.push.apply(i,o)),s=t[r++]}while(void 0!==s);else if(void 0!==o.toArray)do{void 0!==(o=s[n])&&(e.push(s.time),o.toArray(i,i.length)),s=t[r++]}while(void 0!==s);else do{void 0!==(o=s[n])&&(e.push(s.time),i.push(o)),s=t[r++]}while(void 0!==s)}},subclip:function(t,e,i,n,r){r=r||30;var s=t.clone();s.name=e;for(var o=[],a=0;a<s.tracks.length;++a){for(var h=s.tracks[a],u=h.getValueSize(),l=[],c=[],d=0;d<h.times.length;++d){var p=h.times[d]*r;if(!(p<i||p>=n)){l.push(h.times[d]);for(var f=0;f<u;++f)c.push(h.values[d*u+f])}}0!==l.length&&(h.times=kw.convertArray(l,h.times.constructor),h.values=kw.convertArray(c,h.values.constructor),o.push(h))}s.tracks=o;var m=1/0;for(a=0;a<s.tracks.length;++a)m>s.tracks[a].times[0]&&(m=s.tracks[a].times[0]);for(a=0;a<s.tracks.length;++a)s.tracks[a].shift(-1*m);return s.resetDuration(),s}};function Rw(t,e,i,n){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new e.constructor(i),this.sampleValues=e,this.valueSize=i}function Iw(t,e,i,n){Rw.call(this,t,e,i,n),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0}function Yw(t,e,i,n){Rw.call(this,t,e,i,n)}function Fw(t,e,i,n){Rw.call(this,t,e,i,n)}function Nw(t,e,i,n){if(void 0===t)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===e||0===e.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+t);this.name=t,this.times=kw.convertArray(e,this.TimeBufferType),this.values=kw.convertArray(i,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation)}function Bw(t,e,i){Nw.call(this,t,e,i)}function Uw(t,e,i,n){Nw.call(this,t,e,i,n)}function jw(t,e,i,n){Nw.call(this,t,e,i,n)}function Hw(t,e,i,n){Rw.call(this,t,e,i,n)}function zw(t,e,i,n){Nw.call(this,t,e,i,n)}function Ww(t,e,i,n){Nw.call(this,t,e,i,n)}function Gw(t,e,i,n){Nw.call(this,t,e,i,n)}function Vw(t,e,i){this.name=t,this.tracks=i,this.duration=void 0!==e?e:-1,this.uuid=mm.generateUUID(),this.duration<0&&this.resetDuration()}function Xw(t){if(void 0===t.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");var e=function(t){switch(t.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return jw;case"vector":case"vector2":case"vector3":case"vector4":return Gw;case"color":return Uw;case"quaternion":return zw;case"bool":case"boolean":return Bw;case"string":return Ww}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){var i=[],n=[];kw.flattenJSON(t.keys,i,n,"value"),t.times=i,t.values=n}return void 0!==e.parse?e.parse(t):new e(t.name,t.times,t.values,t.interpolation)}Object.assign(Rw.prototype,{evaluate:function(t){var e=this.parameterPositions,i=this._cachedIndex,n=e[i],r=e[i-1];t:{e:{var s;i:{n:if(!(t<n)){for(var o=i+2;;){if(void 0===n){if(t<r)break n;return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,t,r)}if(i===o)break;if(r=n,t<(n=e[++i]))break e}s=e.length;break i}if(t>=r)break t;var a=e[1];t<a&&(i=2,r=a);for(o=i-2;;){if(void 0===r)return this._cachedIndex=0,this.beforeStart_(0,t,n);if(i===o)break;if(n=r,t>=(r=e[--i-1]))break e}s=i,i=0}for(;i<s;){var h=i+s>>>1;t<e[h]?s=h:i=h+1}if(n=e[i],void 0===(r=e[i-1]))return this._cachedIndex=0,this.beforeStart_(0,t,n);if(void 0===n)return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,r,t)}this._cachedIndex=i,this.intervalChanged_(i,r,n)}return this.interpolate_(i,r,t,n)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(t){for(var e=this.resultBuffer,i=this.sampleValues,n=this.valueSize,r=t*n,s=0;s!==n;++s)e[s]=i[r+s];return e},interpolate_:function(){throw new Error("call to abstract method")},intervalChanged_:function(){}}),Object.assign(Rw.prototype,{beforeStart_:Rw.prototype.copySampleValue_,afterEnd_:Rw.prototype.copySampleValue_}),Iw.prototype=Object.assign(Object.create(Rw.prototype),{constructor:Iw,DefaultSettings_:{endingStart:im,endingEnd:im},intervalChanged_:function(t,e,i){var n=this.parameterPositions,r=t-2,s=t+1,o=n[r],a=n[s];if(void 0===o)switch(this.getSettings_().endingStart){case nm:r=t,o=2*e-i;break;case rm:o=e+n[r=n.length-2]-n[r+1];break;default:r=t,o=i}if(void 0===a)switch(this.getSettings_().endingEnd){case nm:s=t,a=2*i-e;break;case rm:s=1,a=i+n[1]-n[0];break;default:s=t-1,a=e}var h=.5*(i-e),u=this.valueSize;this._weightPrev=h/(e-o),this._weightNext=h/(a-i),this._offsetPrev=r*u,this._offsetNext=s*u},interpolate_:function(t,e,i,n){for(var r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=t*o,h=a-o,u=this._offsetPrev,l=this._offsetNext,c=this._weightPrev,d=this._weightNext,p=(i-e)/(n-e),f=p*p,m=f*p,v=-c*m+2*c*f-c*p,g=(1+c)*m+(-1.5-2*c)*f+(-.5+c)*p+1,y=(-1-d)*m+(1.5+d)*f+.5*p,_=d*m-d*f,x=0;x!==o;++x)r[x]=v*s[u+x]+g*s[h+x]+y*s[a+x]+_*s[l+x];return r}}),Yw.prototype=Object.assign(Object.create(Rw.prototype),{constructor:Yw,interpolate_:function(t,e,i,n){for(var r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=t*o,h=a-o,u=(i-e)/(n-e),l=1-u,c=0;c!==o;++c)r[c]=s[h+c]*l+s[a+c]*u;return r}}),Fw.prototype=Object.assign(Object.create(Rw.prototype),{constructor:Fw,interpolate_:function(t){return this.copySampleValue_(t-1)}}),Object.assign(Nw,{toJSON:function(t){var e,i=t.constructor;if(void 0!==i.toJSON)e=i.toJSON(t);else{e={name:t.name,times:kw.convertArray(t.times,Array),values:kw.convertArray(t.values,Array)};var n=t.getInterpolation();n!==t.DefaultInterpolation&&(e.interpolation=n)}return e.type=t.ValueTypeName,e}}),Object.assign(Nw.prototype,{constructor:Nw,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:tm,InterpolantFactoryMethodDiscrete:function(t){return new Fw(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodLinear:function(t){return new Yw(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:function(t){return new Iw(this.times,this.values,this.getValueSize(),t)},setInterpolation:function(t){var e;switch(t){case $f:e=this.InterpolantFactoryMethodDiscrete;break;case tm:e=this.InterpolantFactoryMethodLinear;break;case em:e=this.InterpolantFactoryMethodSmooth}if(void 0===e){var i="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(t===this.DefaultInterpolation)throw new Error(i);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",i),this}return this.createInterpolant=e,this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return $f;case this.InterpolantFactoryMethodLinear:return tm;case this.InterpolantFactoryMethodSmooth:return em}},getValueSize:function(){return this.values.length/this.times.length},shift:function(t){if(0!==t)for(var e=this.times,i=0,n=e.length;i!==n;++i)e[i]+=t;return this},scale:function(t){if(1!==t)for(var e=this.times,i=0,n=e.length;i!==n;++i)e[i]*=t;return this},trim:function(t,e){for(var i=this.times,n=i.length,r=0,s=n-1;r!==n&&i[r]<t;)++r;for(;-1!==s&&i[s]>e;)--s;if(++s,0!==r||s!==n){r>=s&&(r=(s=Math.max(s,1))-1);var o=this.getValueSize();this.times=kw.arraySlice(i,r,s),this.values=kw.arraySlice(this.values,r*o,s*o)}return this},validate:function(){var t=!0,e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);var i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);for(var s=null,o=0;o!==r;o++){var a=i[o];if("number"==typeof a&&isNaN(a)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,a),t=!1;break}if(null!==s&&s>a){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,a,s),t=!1;break}s=a}if(void 0!==n&&kw.isTypedArray(n)){o=0;for(var h=n.length;o!==h;++o){var u=n[o];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,o,u),t=!1;break}}}return t},optimize:function(){for(var t=kw.arraySlice(this.times),e=kw.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===em,r=1,s=t.length-1,o=1;o<s;++o){var a=!1,h=t[o];if(h!==t[o+1]&&(1!==o||h!==h[0]))if(n)a=!0;else for(var u=o*i,l=u-i,c=u+i,d=0;d!==i;++d){var p=e[u+d];if(p!==e[l+d]||p!==e[c+d]){a=!0;break}}if(a){if(o!==r){t[r]=t[o];var f=o*i,m=r*i;for(d=0;d!==i;++d)e[m+d]=e[f+d]}++r}}if(s>0){t[r]=t[s];for(f=s*i,m=r*i,d=0;d!==i;++d)e[m+d]=e[f+d];++r}return r!==t.length?(this.times=kw.arraySlice(t,0,r),this.values=kw.arraySlice(e,0,r*i)):(this.times=t,this.values=e),this},clone:function(){var t=kw.arraySlice(this.times,0),e=kw.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}),Bw.prototype=Object.assign(Object.create(Nw.prototype),{constructor:Bw,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:$f,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Uw.prototype=Object.assign(Object.create(Nw.prototype),{constructor:Uw,ValueTypeName:"color"}),jw.prototype=Object.assign(Object.create(Nw.prototype),{constructor:jw,ValueTypeName:"number"}),Hw.prototype=Object.assign(Object.create(Rw.prototype),{constructor:Hw,interpolate_:function(t,e,i,n){for(var r=this.resultBuffer,s=this.sampleValues,o=this.valueSize,a=t*o,h=(i-e)/(n-e),u=a+o;a!==u;a+=4)Mm.slerpFlat(r,0,s,a-o,s,a,h);return r}}),zw.prototype=Object.assign(Object.create(Nw.prototype),{constructor:zw,ValueTypeName:"quaternion",DefaultInterpolation:tm,InterpolantFactoryMethodLinear:function(t){return new Hw(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:void 0}),Ww.prototype=Object.assign(Object.create(Nw.prototype),{constructor:Ww,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:$f,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),Gw.prototype=Object.assign(Object.create(Nw.prototype),{constructor:Gw,ValueTypeName:"vector"}),Object.assign(Vw,{parse:function(t){for(var e=[],i=t.tracks,n=1/(t.fps||1),r=0,s=i.length;r!==s;++r)e.push(Xw(i[r]).scale(n));return new Vw(t.name,t.duration,e)},toJSON:function(t){for(var e=[],i=t.tracks,n={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid},r=0,s=i.length;r!==s;++r)e.push(Nw.toJSON(i[r]));return n},CreateFromMorphTargetSequence:function(t,e,i,n){for(var r=e.length,s=[],o=0;o<r;o++){var a=[],h=[];a.push((o+r-1)%r,o,(o+1)%r),h.push(0,1,0);var u=kw.getKeyframeOrder(a);a=kw.sortedArray(a,1,u),h=kw.sortedArray(h,1,u),n||0!==a[0]||(a.push(r),h.push(h[0])),s.push(new jw(".morphTargetInfluences["+e[o].name+"]",a,h).scale(1/i))}return new Vw(t,-1,s)},findByName:function(t,e){var i=t;if(!Array.isArray(t)){var n=t;i=n.geometry&&n.geometry.animations||n.animations}for(var r=0;r<i.length;r++)if(i[r].name===e)return i[r];return null},CreateClipsFromMorphTargetSequences:function(t,e,i){for(var n={},r=/^([\w-]*?)([\d]+)$/,s=0,o=t.length;s<o;s++){var a=t[s],h=a.name.match(r);if(h&&h.length>1){var u=n[c=h[1]];u||(n[c]=u=[]),u.push(a)}}var l=[];for(var c in n)l.push(Vw.CreateFromMorphTargetSequence(c,n[c],e,i));return l},parseAnimation:function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var i=function(t,e,i,n,r){if(0!==i.length){var s=[],o=[];kw.flattenJSON(i,s,o,n),0!==s.length&&r.push(new t(e,s,o))}},n=[],r=t.name||"default",s=t.length||-1,o=t.fps||30,a=t.hierarchy||[],h=0;h<a.length;h++){var u=a[h].keys;if(u&&0!==u.length)if(u[0].morphTargets){for(var l={},c=0;c<u.length;c++)if(u[c].morphTargets)for(var d=0;d<u[c].morphTargets.length;d++)l[u[c].morphTargets[d]]=-1;for(var p in l){var f=[],m=[];for(d=0;d!==u[c].morphTargets.length;++d){var v=u[c];f.push(v.time),m.push(v.morphTarget===p?1:0)}n.push(new jw(".morphTargetInfluence["+p+"]",f,m))}s=l.length*(o||1)}else{var g=".bones["+e[h].name+"]";i(Gw,g+".position",u,"pos",n),i(zw,g+".quaternion",u,"rot",n),i(Gw,g+".scale",u,"scl",n)}}return 0===n.length?null:new Vw(r,s,n)}}),Object.assign(Vw.prototype,{resetDuration:function(){for(var t=0,e=0,i=this.tracks.length;e!==i;++e){var n=this.tracks[e];t=Math.max(t,n.times[n.times.length-1])}return this.duration=t,this},trim:function(){for(var t=0;t<this.tracks.length;t++)this.tracks[t].trim(0,this.duration);return this},validate:function(){for(var t=!0,e=0;e<this.tracks.length;e++)t=t&&this.tracks[e].validate();return t},optimize:function(){for(var t=0;t<this.tracks.length;t++)this.tracks[t].optimize();return this},clone:function(){for(var t=[],e=0;e<this.tracks.length;e++)t.push(this.tracks[e].clone());return new Vw(this.name,this.duration,t)}});var qw={enabled:!1,files:{},add:function(t,e){!1!==this.enabled&&(this.files[t]=e)},get:function(t){if(!1!==this.enabled)return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};function Jw(t,e,i){var n=this,r=!1,s=0,o=0,a=void 0,h=[];this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=i,this.itemStart=function(t){o++,!1===r&&void 0!==n.onStart&&n.onStart(t,s,o),r=!0},this.itemEnd=function(t){s++,void 0!==n.onProgress&&n.onProgress(t,s,o),s===o&&(r=!1,void 0!==n.onLoad&&n.onLoad())},this.itemError=function(t){void 0!==n.onError&&n.onError(t)},this.resolveURL=function(t){return a?a(t):t},this.setURLModifier=function(t){return a=t,this},this.addHandler=function(t,e){return h.push(t,e),this},this.removeHandler=function(t){var e=h.indexOf(t);return-1!==e&&h.splice(e,2),this},this.getHandler=function(t){for(var e=0,i=h.length;e<i;e+=2){var n=h[e],r=h[e+1];if(n.global&&(n.lastIndex=0),n.test(t))return r}return null}}var Zw=new Jw;function Kw(t){this.manager=void 0!==t?t:Zw,this.crossOrigin="anonymous",this.path="",this.resourcePath=""}Object.assign(Kw.prototype,{load:function(){},parse:function(){},setCrossOrigin:function(t){return this.crossOrigin=t,this},setPath:function(t){return this.path=t,this},setResourcePath:function(t){return this.resourcePath=t,this}});var Qw={};function $w(t){Kw.call(this,t)}function tT(t){Kw.call(this,t)}function eT(t){Kw.call(this,t)}function iT(t){Kw.call(this,t)}function nT(t){Kw.call(this,t)}function rT(t){Kw.call(this,t)}function sT(t){Kw.call(this,t)}function oT(){this.type="Curve",this.arcLengthDivisions=200}function aT(t,e,i,n,r,s,o,a){oT.call(this),this.type="EllipseCurve",this.aX=t||0,this.aY=e||0,this.xRadius=i||1,this.yRadius=n||1,this.aStartAngle=r||0,this.aEndAngle=s||2*Math.PI,this.aClockwise=o||!1,this.aRotation=a||0}function hT(t,e,i,n,r,s){aT.call(this,t,e,i,i,n,r,s),this.type="ArcCurve"}function uT(){var t=0,e=0,i=0,n=0;function r(r,s,o,a){t=r,e=o,i=-3*r+3*s-2*o-a,n=2*r-2*s+o+a}return{initCatmullRom:function(t,e,i,n,s){r(e,i,s*(i-t),s*(n-e))},initNonuniformCatmullRom:function(t,e,i,n,s,o,a){var h=(e-t)/s-(i-t)/(s+o)+(i-e)/o,u=(i-e)/o-(n-e)/(o+a)+(n-i)/a;r(e,i,h*=o,u*=o)},calc:function(r){var s=r*r;return t+e*r+i*s+n*(s*r)}}}$w.prototype=Object.assign(Object.create(Kw.prototype),{constructor:$w,load:function(t,e,i,n){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);var r=this,s=qw.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;if(void 0===Qw[t]){var o=t.match(/^data:(.*?)(;base64)?,(.*)$/);if(o){var a=o[1],h=!!o[2],u=o[3];u=decodeURIComponent(u),h&&(u=atob(u));try{var l,c=(this.responseType||"").toLowerCase();switch(c){case"arraybuffer":case"blob":for(var d=new Uint8Array(u.length),p=0;p<u.length;p++)d[p]=u.charCodeAt(p);l="blob"===c?new Blob([d.buffer],{type:a}):d.buffer;break;case"document":var f=new DOMParser;l=f.parseFromString(u,a);break;case"json":l=JSON.parse(u);break;default:l=u}setTimeout((function(){e&&e(l),r.manager.itemEnd(t)}),0)}catch(e){setTimeout((function(){n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}),0)}}else{Qw[t]=[],Qw[t].push({onLoad:e,onProgress:i,onError:n});var m=new XMLHttpRequest;for(var v in m.open("GET",t,!0),m.addEventListener("load",(function(e){var i=this.response,n=Qw[t];if(delete Qw[t],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),qw.add(t,i);for(var s=0,o=n.length;s<o;s++){(a=n[s]).onLoad&&a.onLoad(i)}r.manager.itemEnd(t)}else{for(s=0,o=n.length;s<o;s++){var a;(a=n[s]).onError&&a.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}}),!1),m.addEventListener("progress",(function(e){for(var i=Qw[t],n=0,r=i.length;n<r;n++){var s=i[n];s.onProgress&&s.onProgress(e)}}),!1),m.addEventListener("error",(function(e){var i=Qw[t];delete Qw[t];for(var n=0,s=i.length;n<s;n++){var o=i[n];o.onError&&o.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),m.addEventListener("abort",(function(e){var i=Qw[t];delete Qw[t];for(var n=0,s=i.length;n<s;n++){var o=i[n];o.onError&&o.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),void 0!==this.responseType&&(m.responseType=this.responseType),void 0!==this.withCredentials&&(m.withCredentials=this.withCredentials),m.overrideMimeType&&m.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain"),this.requestHeader)m.setRequestHeader(v,this.requestHeader[v]);m.send(null)}return r.manager.itemStart(t),m}Qw[t].push({onLoad:e,onProgress:i,onError:n})},setResponseType:function(t){return this.responseType=t,this},setWithCredentials:function(t){return this.withCredentials=t,this},setMimeType:function(t){return this.mimeType=t,this},setRequestHeader:function(t){return this.requestHeader=t,this}}),tT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:tT,load:function(t,e,i,n){var r=this,s=new $w(r.manager);s.setPath(r.path),s.load(t,(function(t){e(r.parse(JSON.parse(t)))}),i,n)},parse:function(t){for(var e=[],i=0;i<t.length;i++){var n=Vw.parse(t[i]);e.push(n)}return e}}),eT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:eT,load:function(t,e,i,n){var r=this,s=[],o=new ob;o.image=s;var a=new $w(this.manager);function h(h){a.load(t[h],(function(t){var i=r.parse(t,!0);s[h]={width:i.width,height:i.height,format:i.format,mipmaps:i.mipmaps},6===(u+=1)&&(1===i.mipmapCount&&(o.minFilter=jf),o.format=i.format,o.needsUpdate=!0,e&&e(o))}),i,n)}if(a.setPath(this.path),a.setResponseType("arraybuffer"),Array.isArray(t))for(var u=0,l=0,c=t.length;l<c;++l)h(l);else a.load(t,(function(t){var i=r.parse(t,!0);if(i.isCubemap)for(var n=i.mipmaps.length/i.mipmapCount,a=0;a<n;a++){s[a]={mipmaps:[]};for(var h=0;h<i.mipmapCount;h++)s[a].mipmaps.push(i.mipmaps[a*i.mipmapCount+h]),s[a].format=i.format,s[a].width=i.width,s[a].height=i.height}else o.image.width=i.width,o.image.height=i.height,o.mipmaps=i.mipmaps;1===i.mipmapCount&&(o.minFilter=jf),o.format=i.format,o.needsUpdate=!0,e&&e(o)}),i,n);return o}}),iT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:iT,load:function(t,e,i,n){var r=this,s=new ty,o=new $w(this.manager);return o.setResponseType("arraybuffer"),o.setPath(this.path),o.load(t,(function(t){var i=r.parse(t);i&&(void 0!==i.image?s.image=i.image:void 0!==i.data&&(s.image.width=i.width,s.image.height=i.height,s.image.data=i.data),s.wrapS=void 0!==i.wrapS?i.wrapS:Yf,s.wrapT=void 0!==i.wrapT?i.wrapT:Yf,s.magFilter=void 0!==i.magFilter?i.magFilter:jf,s.minFilter=void 0!==i.minFilter?i.minFilter:jf,s.anisotropy=void 0!==i.anisotropy?i.anisotropy:1,void 0!==i.format&&(s.format=i.format),void 0!==i.type&&(s.type=i.type),void 0!==i.mipmaps&&(s.mipmaps=i.mipmaps,s.minFilter=Hf),1===i.mipmapCount&&(s.minFilter=jf),s.needsUpdate=!0,e&&e(s,i))}),i,n),s}}),nT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:nT,load:function(t,e,i,n){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);var r=this,s=qw.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;var o=document.createElementNS("http://www.w3.org/1999/xhtml","img");function a(){o.removeEventListener("load",a,!1),o.removeEventListener("error",h,!1),qw.add(t,this),e&&e(this),r.manager.itemEnd(t)}function h(e){o.removeEventListener("load",a,!1),o.removeEventListener("error",h,!1),n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)}return o.addEventListener("load",a,!1),o.addEventListener("error",h,!1),"data:"!==t.substr(0,5)&&void 0!==this.crossOrigin&&(o.crossOrigin=this.crossOrigin),r.manager.itemStart(t),o.src=t,o}}),rT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:rT,load:function(t,e,i,n){var r=new wy,s=new nT(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);var o=0;function a(i){s.load(t[i],(function(t){r.images[i]=t,6===++o&&(r.needsUpdate=!0,e&&e(r))}),void 0,n)}for(var h=0;h<t.length;++h)a(h);return r}}),sT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:sT,load:function(t,e,i,n){var r=new xm,s=new nT(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(t,(function(i){r.image=i;var n=t.search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/);r.format=n?Jf:Zf,r.needsUpdate=!0,void 0!==e&&e(r)}),i,n),r}}),Object.assign(oT.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){var i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t){void 0===t&&(t=5);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return e},getSpacedPoints:function(t){void 0===t&&(t=5);for(var e=[],i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,i,n=[],r=this.getPoint(0),s=0;for(n.push(0),i=1;i<=t;i++)s+=(e=this.getPoint(i/t)).distanceTo(r),n.push(s),r=e;return this.cacheArcLengths=n,n},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){var i,n=this.getLengths(),r=0,s=n.length;i=e||t*n[s-1];for(var o,a=0,h=s-1;a<=h;)if((o=n[r=Math.floor(a+(h-a)/2)]-i)<0)a=r+1;else{if(!(o>0)){h=r;break}h=r-1}if(n[r=h]===i)return r/(s-1);var u=n[r];return(r+(i-u)/(n[r+1]-u))/(s-1)},getTangent:function(t){var e=1e-4,i=t-e,n=t+e;i<0&&(i=0),n>1&&(n=1);var r=this.getPoint(i);return this.getPoint(n).clone().sub(r).normalize()},getTangentAt:function(t){var e=this.getUtoTmapping(t);return this.getTangent(e)},computeFrenetFrames:function(t,e){var i,n,r,s=new Lm,o=[],a=[],h=[],u=new Lm,l=new Im;for(i=0;i<=t;i++)n=i/t,o[i]=this.getTangentAt(n),o[i].normalize();a[0]=new Lm,h[0]=new Lm;var c=Number.MAX_VALUE,d=Math.abs(o[0].x),p=Math.abs(o[0].y),f=Math.abs(o[0].z);for(d<=c&&(c=d,s.set(1,0,0)),p<=c&&(c=p,s.set(0,1,0)),f<=c&&s.set(0,0,1),u.crossVectors(o[0],s).normalize(),a[0].crossVectors(o[0],u),h[0].crossVectors(o[0],a[0]),i=1;i<=t;i++)a[i]=a[i-1].clone(),h[i]=h[i-1].clone(),u.crossVectors(o[i-1],o[i]),u.length()>Number.EPSILON&&(u.normalize(),r=Math.acos(mm.clamp(o[i-1].dot(o[i]),-1,1)),a[i].applyMatrix4(l.makeRotationAxis(u,r))),h[i].crossVectors(o[i],a[i]);if(!0===e)for(r=Math.acos(mm.clamp(a[0].dot(a[t]),-1,1)),r/=t,o[0].dot(u.crossVectors(a[0],a[t]))>0&&(r=-r),i=1;i<=t;i++)a[i].applyMatrix4(l.makeRotationAxis(o[i],r*i)),h[i].crossVectors(o[i],a[i]);return{tangents:o,normals:a,binormals:h}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){var t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}),aT.prototype=Object.create(oT.prototype),aT.prototype.constructor=aT,aT.prototype.isEllipseCurve=!0,aT.prototype.getPoint=function(t,e){for(var i=e||new vm,n=2*Math.PI,r=this.aEndAngle-this.aStartAngle,s=Math.abs(r)<Number.EPSILON;r<0;)r+=n;for(;r>n;)r-=n;r<Number.EPSILON&&(r=s?0:n),!0!==this.aClockwise||s||(r===n?r=-n:r-=n);var o=this.aStartAngle+t*r,a=this.aX+this.xRadius*Math.cos(o),h=this.aY+this.yRadius*Math.sin(o);if(0!==this.aRotation){var u=Math.cos(this.aRotation),l=Math.sin(this.aRotation),c=a-this.aX,d=h-this.aY;a=c*u-d*l+this.aX,h=c*l+d*u+this.aY}return i.set(a,h)},aT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},aT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.aX=this.aX,t.aY=this.aY,t.xRadius=this.xRadius,t.yRadius=this.yRadius,t.aStartAngle=this.aStartAngle,t.aEndAngle=this.aEndAngle,t.aClockwise=this.aClockwise,t.aRotation=this.aRotation,t},aT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},hT.prototype=Object.create(aT.prototype),hT.prototype.constructor=hT,hT.prototype.isArcCurve=!0;var lT=new Lm,cT=new uT,dT=new uT,pT=new uT;function fT(t,e,i,n){oT.call(this),this.type="CatmullRomCurve3",this.points=t||[],this.closed=e||!1,this.curveType=i||"centripetal",this.tension=n||.5}function mT(t,e,i,n,r){var s=.5*(n-e),o=.5*(r-i),a=t*t;return(2*i-2*n+s+o)*(t*a)+(-3*i+3*n-2*s-o)*a+s*t+i}function vT(t,e,i,n){return function(t,e){var i=1-t;return i*i*e}(t,e)+function(t,e){return 2*(1-t)*t*e}(t,i)+function(t,e){return t*t*e}(t,n)}function gT(t,e,i,n,r){return function(t,e){var i=1-t;return i*i*i*e}(t,e)+function(t,e){var i=1-t;return 3*i*i*t*e}(t,i)+function(t,e){return 3*(1-t)*t*t*e}(t,n)+function(t,e){return t*t*t*e}(t,r)}function yT(t,e,i,n){oT.call(this),this.type="CubicBezierCurve",this.v0=t||new vm,this.v1=e||new vm,this.v2=i||new vm,this.v3=n||new vm}function _T(t,e,i,n){oT.call(this),this.type="CubicBezierCurve3",this.v0=t||new Lm,this.v1=e||new Lm,this.v2=i||new Lm,this.v3=n||new Lm}function xT(t,e){oT.call(this),this.type="LineCurve",this.v1=t||new vm,this.v2=e||new vm}function bT(t,e){oT.call(this),this.type="LineCurve3",this.v1=t||new Lm,this.v2=e||new Lm}function wT(t,e,i){oT.call(this),this.type="QuadraticBezierCurve",this.v0=t||new vm,this.v1=e||new vm,this.v2=i||new vm}function TT(t,e,i){oT.call(this),this.type="QuadraticBezierCurve3",this.v0=t||new Lm,this.v1=e||new Lm,this.v2=i||new Lm}function MT(t){oT.call(this),this.type="SplineCurve",this.points=t||[]}fT.prototype=Object.create(oT.prototype),fT.prototype.constructor=fT,fT.prototype.isCatmullRomCurve3=!0,fT.prototype.getPoint=function(t,e){var i,n,r,s,o=e||new Lm,a=this.points,h=a.length,u=(h-(this.closed?0:1))*t,l=Math.floor(u),c=u-l;if(this.closed?l+=l>0?0:(Math.floor(Math.abs(l)/h)+1)*h:0===c&&l===h-1&&(l=h-2,c=1),this.closed||l>0?i=a[(l-1)%h]:(lT.subVectors(a[0],a[1]).add(a[0]),i=lT),n=a[l%h],r=a[(l+1)%h],this.closed||l+2<h?s=a[(l+2)%h]:(lT.subVectors(a[h-1],a[h-2]).add(a[h-1]),s=lT),"centripetal"===this.curveType||"chordal"===this.curveType){var d="chordal"===this.curveType?.5:.25,p=Math.pow(i.distanceToSquared(n),d),f=Math.pow(n.distanceToSquared(r),d),m=Math.pow(r.distanceToSquared(s),d);f<1e-4&&(f=1),p<1e-4&&(p=f),m<1e-4&&(m=f),cT.initNonuniformCatmullRom(i.x,n.x,r.x,s.x,p,f,m),dT.initNonuniformCatmullRom(i.y,n.y,r.y,s.y,p,f,m),pT.initNonuniformCatmullRom(i.z,n.z,r.z,s.z,p,f,m)}else"catmullrom"===this.curveType&&(cT.initCatmullRom(i.x,n.x,r.x,s.x,this.tension),dT.initCatmullRom(i.y,n.y,r.y,s.y,this.tension),pT.initCatmullRom(i.z,n.z,r.z,s.z,this.tension));return o.set(cT.calc(c),dT.calc(c),pT.calc(c)),o},fT.prototype.copy=function(t){oT.prototype.copy.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var n=t.points[e];this.points.push(n.clone())}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},fT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);t.points=[];for(var e=0,i=this.points.length;e<i;e++){var n=this.points[e];t.points.push(n.toArray())}return t.closed=this.closed,t.curveType=this.curveType,t.tension=this.tension,t},fT.prototype.fromJSON=function(t){oT.prototype.fromJSON.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var n=t.points[e];this.points.push((new Lm).fromArray(n))}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},yT.prototype=Object.create(oT.prototype),yT.prototype.constructor=yT,yT.prototype.isCubicBezierCurve=!0,yT.prototype.getPoint=function(t,e){var i=e||new vm,n=this.v0,r=this.v1,s=this.v2,o=this.v3;return i.set(gT(t,n.x,r.x,s.x,o.x),gT(t,n.y,r.y,s.y,o.y)),i},yT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},yT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},yT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},_T.prototype=Object.create(oT.prototype),_T.prototype.constructor=_T,_T.prototype.isCubicBezierCurve3=!0,_T.prototype.getPoint=function(t,e){var i=e||new Lm,n=this.v0,r=this.v1,s=this.v2,o=this.v3;return i.set(gT(t,n.x,r.x,s.x,o.x),gT(t,n.y,r.y,s.y,o.y),gT(t,n.z,r.z,s.z,o.z)),i},_T.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},_T.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},_T.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},xT.prototype=Object.create(oT.prototype),xT.prototype.constructor=xT,xT.prototype.isLineCurve=!0,xT.prototype.getPoint=function(t,e){var i=e||new vm;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},xT.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},xT.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()},xT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},xT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},xT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},bT.prototype=Object.create(oT.prototype),bT.prototype.constructor=bT,bT.prototype.isLineCurve3=!0,bT.prototype.getPoint=function(t,e){var i=e||new Lm;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},bT.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},bT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},bT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},bT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},wT.prototype=Object.create(oT.prototype),wT.prototype.constructor=wT,wT.prototype.isQuadraticBezierCurve=!0,wT.prototype.getPoint=function(t,e){var i=e||new vm,n=this.v0,r=this.v1,s=this.v2;return i.set(vT(t,n.x,r.x,s.x),vT(t,n.y,r.y,s.y)),i},wT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},wT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},wT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},TT.prototype=Object.create(oT.prototype),TT.prototype.constructor=TT,TT.prototype.isQuadraticBezierCurve3=!0,TT.prototype.getPoint=function(t,e){var i=e||new Lm,n=this.v0,r=this.v1,s=this.v2;return i.set(vT(t,n.x,r.x,s.x),vT(t,n.y,r.y,s.y),vT(t,n.z,r.z,s.z)),i},TT.prototype.copy=function(t){return oT.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},TT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},TT.prototype.fromJSON=function(t){return oT.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},MT.prototype=Object.create(oT.prototype),MT.prototype.constructor=MT,MT.prototype.isSplineCurve=!0,MT.prototype.getPoint=function(t,e){var i=e||new vm,n=this.points,r=(n.length-1)*t,s=Math.floor(r),o=r-s,a=n[0===s?s:s-1],h=n[s],u=n[s>n.length-2?n.length-1:s+1],l=n[s>n.length-3?n.length-1:s+2];return i.set(mT(o,a.x,h.x,u.x,l.x),mT(o,a.y,h.y,u.y,l.y)),i},MT.prototype.copy=function(t){oT.prototype.copy.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var n=t.points[e];this.points.push(n.clone())}return this},MT.prototype.toJSON=function(){var t=oT.prototype.toJSON.call(this);t.points=[];for(var e=0,i=this.points.length;e<i;e++){var n=this.points[e];t.points.push(n.toArray())}return t},MT.prototype.fromJSON=function(t){oT.prototype.fromJSON.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var n=t.points[e];this.points.push((new vm).fromArray(n))}return this};var ST=Object.freeze({__proto__:null,ArcCurve:hT,CatmullRomCurve3:fT,CubicBezierCurve:yT,CubicBezierCurve3:_T,EllipseCurve:aT,LineCurve:xT,LineCurve3:bT,QuadraticBezierCurve:wT,QuadraticBezierCurve3:TT,SplineCurve:MT});function ET(){oT.call(this),this.type="CurvePath",this.curves=[],this.autoClose=!1}function LT(t){ET.call(this),this.type="Path",this.currentPoint=new vm,t&&this.setFromPoints(t)}function AT(t){LT.call(this,t),this.uuid=mm.generateUUID(),this.type="Shape",this.holes=[]}function DT(t,e){$m.call(this),this.type="Light",this.color=new Wv(t),this.intensity=void 0!==e?e:1,this.receiveShadow=void 0}function PT(t,e,i){DT.call(this,t,i),this.type="HemisphereLight",this.castShadow=void 0,this.position.copy($m.DefaultUp),this.updateMatrix(),this.groundColor=new Wv(e)}function CT(t){this.camera=t,this.bias=0,this.radius=1,this.mapSize=new vm(512,512),this.map=null,this.mapPass=null,this.matrix=new Im,this._frustum=new ny,this._frameExtents=new vm(1,1),this._viewportCount=1,this._viewports=[new bm(0,0,1,1)]}function OT(){CT.call(this,new Zg(50,1,.5,500))}function kT(t,e,i,n,r,s){DT.call(this,t,e),this.type="SpotLight",this.position.copy($m.DefaultUp),this.updateMatrix(),this.target=new $m,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(t){this.intensity=t/Math.PI}}),this.distance=void 0!==i?i:0,this.angle=void 0!==n?n:Math.PI/3,this.penumbra=void 0!==r?r:0,this.decay=void 0!==s?s:1,this.shadow=new OT}function RT(){CT.call(this,new Zg(90,1,.5,500)),this._frameExtents=new vm(4,2),this._viewportCount=6,this._viewports=[new bm(2,1,1,1),new bm(0,1,1,1),new bm(3,1,1,1),new bm(1,1,1,1),new bm(3,0,1,1),new bm(1,0,1,1)],this._cubeDirections=[new Lm(1,0,0),new Lm(-1,0,0),new Lm(0,0,1),new Lm(0,0,-1),new Lm(0,1,0),new Lm(0,-1,0)],this._cubeUps=[new Lm(0,1,0),new Lm(0,1,0),new Lm(0,1,0),new Lm(0,1,0),new Lm(0,0,1),new Lm(0,0,-1)]}function IT(t,e,i,n){DT.call(this,t,e),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(t){this.intensity=t/(4*Math.PI)}}),this.distance=void 0!==i?i:0,this.decay=void 0!==n?n:1,this.shadow=new RT}function YT(t,e,i,n,r,s){Jg.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=void 0!==t?t:-1,this.right=void 0!==e?e:1,this.top=void 0!==i?i:1,this.bottom=void 0!==n?n:-1,this.near=void 0!==r?r:.1,this.far=void 0!==s?s:2e3,this.updateProjectionMatrix()}function FT(){CT.call(this,new YT(-5,5,5,-5,.5,500))}function NT(t,e){DT.call(this,t,e),this.type="DirectionalLight",this.position.copy($m.DefaultUp),this.updateMatrix(),this.target=new $m,this.shadow=new FT}function BT(t,e){DT.call(this,t,e),this.type="AmbientLight",this.castShadow=void 0}function UT(t,e,i,n){DT.call(this,t,e),this.type="RectAreaLight",this.width=void 0!==i?i:10,this.height=void 0!==n?n:10}function jT(t){Kw.call(this,t),this.textures={}}ET.prototype=Object.assign(Object.create(oT.prototype),{constructor:ET,add:function(t){this.curves.push(t)},closePath:function(){var t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new xT(e,t))},getPoint:function(t){for(var e=t*this.getLength(),i=this.getCurveLengths(),n=0;n<i.length;){if(i[n]>=e){var r=i[n]-e,s=this.curves[n],o=s.getLength(),a=0===o?0:1-r/o;return s.getPointAt(a)}n++}return null},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,i=0,n=this.curves.length;i<n;i++)e+=this.curves[i].getLength(),t.push(e);return this.cacheLengths=t,t},getSpacedPoints:function(t){void 0===t&&(t=40);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return this.autoClose&&e.push(e[0]),e},getPoints:function(t){t=t||12;for(var e,i=[],n=0,r=this.curves;n<r.length;n++)for(var s=r[n],o=s&&s.isEllipseCurve?2*t:s&&(s.isLineCurve||s.isLineCurve3)?1:s&&s.isSplineCurve?t*s.points.length:t,a=s.getPoints(o),h=0;h<a.length;h++){var u=a[h];e&&e.equals(u)||(i.push(u),e=u)}return this.autoClose&&i.length>1&&!i[i.length-1].equals(i[0])&&i.push(i[0]),i},copy:function(t){oT.prototype.copy.call(this,t),this.curves=[];for(var e=0,i=t.curves.length;e<i;e++){var n=t.curves[e];this.curves.push(n.clone())}return this.autoClose=t.autoClose,this},toJSON:function(){var t=oT.prototype.toJSON.call(this);t.autoClose=this.autoClose,t.curves=[];for(var e=0,i=this.curves.length;e<i;e++){var n=this.curves[e];t.curves.push(n.toJSON())}return t},fromJSON:function(t){oT.prototype.fromJSON.call(this,t),this.autoClose=t.autoClose,this.curves=[];for(var e=0,i=t.curves.length;e<i;e++){var n=t.curves[e];this.curves.push((new ST[n.type]).fromJSON(n))}return this}}),LT.prototype=Object.assign(Object.create(ET.prototype),{constructor:LT,setFromPoints:function(t){this.moveTo(t[0].x,t[0].y);for(var e=1,i=t.length;e<i;e++)this.lineTo(t[e].x,t[e].y);return this},moveTo:function(t,e){return this.currentPoint.set(t,e),this},lineTo:function(t,e){var i=new xT(this.currentPoint.clone(),new vm(t,e));return this.curves.push(i),this.currentPoint.set(t,e),this},quadraticCurveTo:function(t,e,i,n){var r=new wT(this.currentPoint.clone(),new vm(t,e),new vm(i,n));return this.curves.push(r),this.currentPoint.set(i,n),this},bezierCurveTo:function(t,e,i,n,r,s){var o=new yT(this.currentPoint.clone(),new vm(t,e),new vm(i,n),new vm(r,s));return this.curves.push(o),this.currentPoint.set(r,s),this},splineThru:function(t){var e=new MT([this.currentPoint.clone()].concat(t));return this.curves.push(e),this.currentPoint.copy(t[t.length-1]),this},arc:function(t,e,i,n,r,s){var o=this.currentPoint.x,a=this.currentPoint.y;return this.absarc(t+o,e+a,i,n,r,s),this},absarc:function(t,e,i,n,r,s){return this.absellipse(t,e,i,i,n,r,s),this},ellipse:function(t,e,i,n,r,s,o,a){var h=this.currentPoint.x,u=this.currentPoint.y;return this.absellipse(t+h,e+u,i,n,r,s,o,a),this},absellipse:function(t,e,i,n,r,s,o,a){var h=new aT(t,e,i,n,r,s,o,a);if(this.curves.length>0){var u=h.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(h);var l=h.getPoint(1);return this.currentPoint.copy(l),this},copy:function(t){return ET.prototype.copy.call(this,t),this.currentPoint.copy(t.currentPoint),this},toJSON:function(){var t=ET.prototype.toJSON.call(this);return t.currentPoint=this.currentPoint.toArray(),t},fromJSON:function(t){return ET.prototype.fromJSON.call(this,t),this.currentPoint.fromArray(t.currentPoint),this}}),AT.prototype=Object.assign(Object.create(LT.prototype),{constructor:AT,getPointsHoles:function(t){for(var e=[],i=0,n=this.holes.length;i<n;i++)e[i]=this.holes[i].getPoints(t);return e},extractPoints:function(t){return{shape:this.getPoints(t),holes:this.getPointsHoles(t)}},copy:function(t){LT.prototype.copy.call(this,t),this.holes=[];for(var e=0,i=t.holes.length;e<i;e++){var n=t.holes[e];this.holes.push(n.clone())}return this},toJSON:function(){var t=LT.prototype.toJSON.call(this);t.uuid=this.uuid,t.holes=[];for(var e=0,i=this.holes.length;e<i;e++){var n=this.holes[e];t.holes.push(n.toJSON())}return t},fromJSON:function(t){LT.prototype.fromJSON.call(this,t),this.uuid=t.uuid,this.holes=[];for(var e=0,i=t.holes.length;e<i;e++){var n=t.holes[e];this.holes.push((new LT).fromJSON(n))}return this}}),DT.prototype=Object.assign(Object.create($m.prototype),{constructor:DT,isLight:!0,copy:function(t){return $m.prototype.copy.call(this,t),this.color.copy(t.color),this.intensity=t.intensity,this},toJSON:function(t){var e=$m.prototype.toJSON.call(this,t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}),PT.prototype=Object.assign(Object.create(DT.prototype),{constructor:PT,isHemisphereLight:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.groundColor.copy(t.groundColor),this}}),Object.assign(CT.prototype,{_projScreenMatrix:new Im,_lightPositionWorld:new Lm,_lookTarget:new Lm,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(t){var e=this.camera,i=this.matrix,n=this._projScreenMatrix,r=this._lookTarget,s=this._lightPositionWorld;s.setFromMatrixPosition(t.matrixWorld),e.position.copy(s),r.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(r),e.updateMatrixWorld(),n.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(n),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(e.projectionMatrix),i.multiply(e.matrixWorldInverse)},getViewport:function(t){return this._viewports[t]},getFrameExtents:function(){return this._frameExtents},copy:function(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var t={};return 0!==this.bias&&(t.bias=this.bias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}),OT.prototype=Object.assign(Object.create(CT.prototype),{constructor:OT,isSpotLightShadow:!0,updateMatrices:function(t){var e=this.camera,i=2*mm.RAD2DEG*t.angle,n=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;i===e.fov&&n===e.aspect&&r===e.far||(e.fov=i,e.aspect=n,e.far=r,e.updateProjectionMatrix()),CT.prototype.updateMatrices.call(this,t)}}),kT.prototype=Object.assign(Object.create(DT.prototype),{constructor:kT,isSpotLight:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),RT.prototype=Object.assign(Object.create(CT.prototype),{constructor:RT,isPointLightShadow:!0,updateMatrices:function(t,e){void 0===e&&(e=0);var i=this.camera,n=this.matrix,r=this._lightPositionWorld,s=this._lookTarget,o=this._projScreenMatrix;r.setFromMatrixPosition(t.matrixWorld),i.position.copy(r),s.copy(i.position),s.add(this._cubeDirections[e]),i.up.copy(this._cubeUps[e]),i.lookAt(s),i.updateMatrixWorld(),n.makeTranslation(-r.x,-r.y,-r.z),o.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(o)}}),IT.prototype=Object.assign(Object.create(DT.prototype),{constructor:IT,isPointLight:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}),YT.prototype=Object.assign(Object.create(Jg.prototype),{constructor:YT,isOrthographicCamera:!0,copy:function(t,e){return Jg.prototype.copy.call(this,t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this},setViewOffset:function(t,e,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2,r=i-t,s=i+t,o=n+e,a=n-e;if(null!==this.view&&this.view.enabled){var h=(this.right-this.left)/this.view.fullWidth/this.zoom,u=(this.top-this.bottom)/this.view.fullHeight/this.zoom;s=(r+=h*this.view.offsetX)+h*this.view.width,a=(o-=u*this.view.offsetY)-u*this.view.height}this.projectionMatrix.makeOrthographic(r,s,o,a,this.near,this.far),this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(t){var e=$m.prototype.toJSON.call(this,t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}),FT.prototype=Object.assign(Object.create(CT.prototype),{constructor:FT,isDirectionalLightShadow:!0,updateMatrices:function(t){CT.prototype.updateMatrices.call(this,t)}}),NT.prototype=Object.assign(Object.create(DT.prototype),{constructor:NT,isDirectionalLight:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),BT.prototype=Object.assign(Object.create(DT.prototype),{constructor:BT,isAmbientLight:!0}),UT.prototype=Object.assign(Object.create(DT.prototype),{constructor:UT,isRectAreaLight:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.width=t.width,this.height=t.height,this},toJSON:function(t){var e=DT.prototype.toJSON.call(this,t);return e.object.width=this.width,e.object.height=this.height,e}}),jT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:jT,load:function(t,e,i,n){var r=this,s=new $w(r.manager);s.setPath(r.path),s.load(t,(function(t){e(r.parse(JSON.parse(t)))}),i,n)},parse:function(t){var e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}var n=new Ow[t.type];if(void 0!==t.uuid&&(n.uuid=t.uuid),void 0!==t.name&&(n.name=t.name),void 0!==t.color&&n.color.setHex(t.color),void 0!==t.roughness&&(n.roughness=t.roughness),void 0!==t.metalness&&(n.metalness=t.metalness),void 0!==t.sheen&&(n.sheen=(new Wv).setHex(t.sheen)),void 0!==t.emissive&&n.emissive.setHex(t.emissive),void 0!==t.specular&&n.specular.setHex(t.specular),void 0!==t.shininess&&(n.shininess=t.shininess),void 0!==t.clearcoat&&(n.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(n.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.fog&&(n.fog=t.fog),void 0!==t.flatShading&&(n.flatShading=t.flatShading),void 0!==t.blending&&(n.blending=t.blending),void 0!==t.combine&&(n.combine=t.combine),void 0!==t.side&&(n.side=t.side),void 0!==t.opacity&&(n.opacity=t.opacity),void 0!==t.transparent&&(n.transparent=t.transparent),void 0!==t.alphaTest&&(n.alphaTest=t.alphaTest),void 0!==t.depthTest&&(n.depthTest=t.depthTest),void 0!==t.depthWrite&&(n.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(n.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(n.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(n.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(n.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(n.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(n.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(n.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(n.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(n.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(n.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(n.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(n.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(n.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(n.rotation=t.rotation),1!==t.linewidth&&(n.linewidth=t.linewidth),void 0!==t.dashSize&&(n.dashSize=t.dashSize),void 0!==t.gapSize&&(n.gapSize=t.gapSize),void 0!==t.scale&&(n.scale=t.scale),void 0!==t.polygonOffset&&(n.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(n.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(n.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.skinning&&(n.skinning=t.skinning),void 0!==t.morphTargets&&(n.morphTargets=t.morphTargets),void 0!==t.morphNormals&&(n.morphNormals=t.morphNormals),void 0!==t.dithering&&(n.dithering=t.dithering),void 0!==t.vertexTangents&&(n.vertexTangents=t.vertexTangents),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.toneMapped&&(n.toneMapped=t.toneMapped),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?n.vertexColors=t.vertexColors>0:n.vertexColors=t.vertexColors),void 0!==t.uniforms)for(var r in t.uniforms){var s=t.uniforms[r];switch(n.uniforms[r]={},s.type){case"t":n.uniforms[r].value=i(s.value);break;case"c":n.uniforms[r].value=(new Wv).setHex(s.value);break;case"v2":n.uniforms[r].value=(new vm).fromArray(s.value);break;case"v3":n.uniforms[r].value=(new Lm).fromArray(s.value);break;case"v4":n.uniforms[r].value=(new bm).fromArray(s.value);break;case"m3":n.uniforms[r].value=(new gm).fromArray(s.value);case"m4":n.uniforms[r].value=(new Im).fromArray(s.value);break;default:n.uniforms[r].value=s.value}}if(void 0!==t.defines&&(n.defines=t.defines),void 0!==t.vertexShader&&(n.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(n.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(var o in t.extensions)n.extensions[o]=t.extensions[o];if(void 0!==t.shading&&(n.flatShading=1===t.shading),void 0!==t.size&&(n.size=t.size),void 0!==t.sizeAttenuation&&(n.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(n.map=i(t.map)),void 0!==t.matcap&&(n.matcap=i(t.matcap)),void 0!==t.alphaMap&&(n.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(n.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(n.bumpScale=t.bumpScale),void 0!==t.normalMap&&(n.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(n.normalMapType=t.normalMapType),void 0!==t.normalScale){var a=t.normalScale;!1===Array.isArray(a)&&(a=[a,a]),n.normalScale=(new vm).fromArray(a)}return void 0!==t.displacementMap&&(n.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(n.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(n.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(n.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(n.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(n.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(n.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(n.specularMap=i(t.specularMap)),void 0!==t.envMap&&(n.envMap=i(t.envMap)),void 0!==t.envMapIntensity&&(n.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(n.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(n.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(n.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(n.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(n.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(n.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(n.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(n.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(n.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(n.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(n.clearcoatNormalScale=(new vm).fromArray(t.clearcoatNormalScale)),n},setTextures:function(t){return this.textures=t,this}});var HT=function(t){var e=t.lastIndexOf("/");return-1===e?"./":t.substr(0,e+1)};function zT(){yg.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0}function WT(t,e,i,n){"number"==typeof i&&(n=i,i=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),$v.call(this,t,e,i),this.meshPerAttribute=n||1}function GT(t){Kw.call(this,t)}zT.prototype=Object.assign(Object.create(yg.prototype),{constructor:zT,isInstancedBufferGeometry:!0,copy:function(t){return yg.prototype.copy.call(this,t),this.maxInstancedCount=t.maxInstancedCount,this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var t=yg.prototype.toJSON.call(this);return t.maxInstancedCount=this.maxInstancedCount,t.isInstancedBufferGeometry=!0,t}}),WT.prototype=Object.assign(Object.create($v.prototype),{constructor:WT,isInstancedBufferAttribute:!0,copy:function(t){return $v.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this},toJSON:function(){var t=$v.prototype.toJSON.call(this);return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}),GT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:GT,load:function(t,e,i,n){var r=this,s=new $w(r.manager);s.setPath(r.path),s.load(t,(function(t){e(r.parse(JSON.parse(t)))}),i,n)},parse:function(t){var e=t.isInstancedBufferGeometry?new zT:new yg,i=t.data.index;if(void 0!==i){var n=new VT[i.type](i.array);e.setIndex(new $v(n,1))}var r=t.data.attributes;for(var s in r){var o=r[s],a=(n=new VT[o.type](o.array),new(o.isInstancedBufferAttribute?WT:$v)(n,o.itemSize,o.normalized));void 0!==o.name&&(a.name=o.name),e.setAttribute(s,a)}var h=t.data.morphAttributes;if(h)for(var s in h){for(var u=h[s],l=[],c=0,d=u.length;c<d;c++){o=u[c],a=new $v(n=new VT[o.type](o.array),o.itemSize,o.normalized);void 0!==o.name&&(a.name=o.name),l.push(a)}e.morphAttributes[s]=l}t.data.morphTargetsRelative&&(e.morphTargetsRelative=!0);var p=t.data.groups||t.data.drawcalls||t.data.offsets;if(void 0!==p){c=0;for(var f=p.length;c!==f;++c){var m=p[c];e.addGroup(m.start,m.count,m.materialIndex)}}var v=t.data.boundingSphere;if(void 0!==v){var g=new Lm;void 0!==v.center&&g.fromArray(v.center),e.boundingSphere=new gv(g,v.radius)}return t.name&&(e.name=t.name),t.userData&&(e.userData=t.userData),e}});var VT={Int8Array,Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array};function XT(t){Kw.call(this,t)}XT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:XT,load:function(t,e,i,n){var r=this,s=""===this.path?HT(t):this.path;this.resourcePath=this.resourcePath||s;var o=new $w(r.manager);o.setPath(this.path),o.load(t,(function(i){var s=null;try{s=JSON.parse(i)}catch(e){return void 0!==n&&n(e),void console.error("THREE:ObjectLoader: Can't parse "+t+".",e.message)}var o=s.metadata;void 0!==o&&void 0!==o.type&&"geometry"!==o.type.toLowerCase()?r.parse(s,e):console.error("THREE.ObjectLoader: Can't load "+t)}),i,n)},parse:function(t,e){var i=this.parseShape(t.shapes),n=this.parseGeometries(t.geometries,i),r=this.parseImages(t.images,(function(){void 0!==e&&e(a)})),s=this.parseTextures(t.textures,r),o=this.parseMaterials(t.materials,s),a=this.parseObject(t.object,n,o);return t.animations&&(a.animations=this.parseAnimations(t.animations)),void 0!==t.images&&0!==t.images.length||void 0!==e&&e(a),a},parseShape:function(t){var e={};if(void 0!==t)for(var i=0,n=t.length;i<n;i++){var r=(new AT).fromJSON(t[i]);e[r.uuid]=r}return e},parseGeometries:function(t,e){var i={};if(void 0!==t)for(var n=new GT,r=0,s=t.length;r<s;r++){var o,a=t[r];switch(a.type){case"PlaneGeometry":case"PlaneBufferGeometry":o=new bw[a.type](a.width,a.height,a.widthSegments,a.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":case"CubeGeometry":o=new bw[a.type](a.width,a.height,a.depth,a.widthSegments,a.heightSegments,a.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":o=new bw[a.type](a.radius,a.segments,a.thetaStart,a.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":o=new bw[a.type](a.radiusTop,a.radiusBottom,a.height,a.radialSegments,a.heightSegments,a.openEnded,a.thetaStart,a.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":o=new bw[a.type](a.radius,a.height,a.radialSegments,a.heightSegments,a.openEnded,a.thetaStart,a.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":o=new bw[a.type](a.radius,a.widthSegments,a.heightSegments,a.phiStart,a.phiLength,a.thetaStart,a.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":o=new bw[a.type](a.radius,a.detail);break;case"RingGeometry":case"RingBufferGeometry":o=new bw[a.type](a.innerRadius,a.outerRadius,a.thetaSegments,a.phiSegments,a.thetaStart,a.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":o=new bw[a.type](a.radius,a.tube,a.radialSegments,a.tubularSegments,a.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":o=new bw[a.type](a.radius,a.tube,a.tubularSegments,a.radialSegments,a.p,a.q);break;case"TubeGeometry":case"TubeBufferGeometry":o=new bw[a.type]((new ST[a.path.type]).fromJSON(a.path),a.tubularSegments,a.radius,a.radialSegments,a.closed);break;case"LatheGeometry":case"LatheBufferGeometry":o=new bw[a.type](a.points,a.segments,a.phiStart,a.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":o=new bw[a.type](a.vertices,a.indices,a.radius,a.details);break;case"ShapeGeometry":case"ShapeBufferGeometry":for(var h=[],u=0,l=a.shapes.length;u<l;u++){var c=e[a.shapes[u]];h.push(c)}o=new bw[a.type](h,a.curveSegments);break;case"ExtrudeGeometry":case"ExtrudeBufferGeometry":for(h=[],u=0,l=a.shapes.length;u<l;u++){c=e[a.shapes[u]];h.push(c)}var d=a.options.extrudePath;void 0!==d&&(a.options.extrudePath=(new ST[d.type]).fromJSON(d)),o=new bw[a.type](h,a.options);break;case"BufferGeometry":case"InstancedBufferGeometry":o=n.parse(a);break;case"Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+a.type+'"');continue}o.uuid=a.uuid,void 0!==a.name&&(o.name=a.name),!0===o.isBufferGeometry&&void 0!==a.userData&&(o.userData=a.userData),i[a.uuid]=o}return i},parseMaterials:function(t,e){var i={},n={};if(void 0!==t){var r=new jT;r.setTextures(e);for(var s=0,o=t.length;s<o;s++){var a=t[s];if("MultiMaterial"===a.type){for(var h=[],u=0;u<a.materials.length;u++){var l=a.materials[u];void 0===i[l.uuid]&&(i[l.uuid]=r.parse(l)),h.push(i[l.uuid])}n[a.uuid]=h}else void 0===i[a.uuid]&&(i[a.uuid]=r.parse(a)),n[a.uuid]=i[a.uuid]}}return n},parseAnimations:function(t){for(var e=[],i=0;i<t.length;i++){var n=t[i],r=Vw.parse(n);void 0!==n.uuid&&(r.uuid=n.uuid),e.push(r)}return e},parseImages:function(t,e){var i=this,n={};function r(t){return i.manager.itemStart(t),s.load(t,(function(){i.manager.itemEnd(t)}),void 0,(function(){i.manager.itemError(t),i.manager.itemEnd(t)}))}if(void 0!==t&&t.length>0){var s=new nT(new Jw(e));s.setCrossOrigin(this.crossOrigin);for(var o=0,a=t.length;o<a;o++){var h=t[o],u=h.url;if(Array.isArray(u)){n[h.uuid]=[];for(var l=0,c=u.length;l<c;l++){var d=u[l],p=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(d)?d:i.resourcePath+d;n[h.uuid].push(r(p))}}else{p=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:i.resourcePath+h.url;n[h.uuid]=r(p)}}}return n},parseTextures:function(t,e){function i(t,e){return"number"==typeof t?t:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",t),e[t])}var n={};if(void 0!==t)for(var r=0,s=t.length;r<s;r++){var o,a=t[r];void 0===a.image&&console.warn('THREE.ObjectLoader: No "image" specified for',a.uuid),void 0===e[a.image]&&console.warn("THREE.ObjectLoader: Undefined image",a.image),(o=Array.isArray(e[a.image])?new wy(e[a.image]):new xm(e[a.image])).needsUpdate=!0,o.uuid=a.uuid,void 0!==a.name&&(o.name=a.name),void 0!==a.mapping&&(o.mapping=i(a.mapping,JT)),void 0!==a.offset&&o.offset.fromArray(a.offset),void 0!==a.repeat&&o.repeat.fromArray(a.repeat),void 0!==a.center&&o.center.fromArray(a.center),void 0!==a.rotation&&(o.rotation=a.rotation),void 0!==a.wrap&&(o.wrapS=i(a.wrap[0],ZT),o.wrapT=i(a.wrap[1],ZT)),void 0!==a.format&&(o.format=a.format),void 0!==a.type&&(o.type=a.type),void 0!==a.encoding&&(o.encoding=a.encoding),void 0!==a.minFilter&&(o.minFilter=i(a.minFilter,KT)),void 0!==a.magFilter&&(o.magFilter=i(a.magFilter,KT)),void 0!==a.anisotropy&&(o.anisotropy=a.anisotropy),void 0!==a.flipY&&(o.flipY=a.flipY),void 0!==a.premultiplyAlpha&&(o.premultiplyAlpha=a.premultiplyAlpha),void 0!==a.unpackAlignment&&(o.unpackAlignment=a.unpackAlignment),n[a.uuid]=o}return n},parseObject:function(t,e,i){var n;function r(t){return void 0===e[t]&&console.warn("THREE.ObjectLoader: Undefined geometry",t),e[t]}function s(t){if(void 0!==t){if(Array.isArray(t)){for(var e=[],n=0,r=t.length;n<r;n++){var s=t[n];void 0===i[s]&&console.warn("THREE.ObjectLoader: Undefined material",s),e.push(i[s])}return e}return void 0===i[t]&&console.warn("THREE.ObjectLoader: Undefined material",t),i[t]}}switch(t.type){case"Scene":n=new tv,void 0!==t.background&&Number.isInteger(t.background)&&(n.background=new Wv(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?n.fog=new hx(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(n.fog=new ax(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":n=new Zg(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(n.focus=t.focus),void 0!==t.zoom&&(n.zoom=t.zoom),void 0!==t.filmGauge&&(n.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(n.filmOffset=t.filmOffset),void 0!==t.view&&(n.view=Object.assign({},t.view));break;case"OrthographicCamera":n=new YT(t.left,t.right,t.top,t.bottom,t.near,t.far),void 0!==t.zoom&&(n.zoom=t.zoom),void 0!==t.view&&(n.view=Object.assign({},t.view));break;case"AmbientLight":n=new BT(t.color,t.intensity);break;case"DirectionalLight":n=new NT(t.color,t.intensity);break;case"PointLight":n=new IT(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":n=new UT(t.color,t.intensity,t.width,t.height);break;case"SpotLight":n=new kT(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":n=new PT(t.color,t.groundColor,t.intensity);break;case"SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case"Mesh":n=new Yg(o=r(t.geometry),a=s(t.material));break;case"InstancedMesh":var o=r(t.geometry),a=s(t.material),h=t.count,u=t.instanceMatrix;(n=new Ux(o,a,h)).instanceMatrix=new $v(new Float32Array(u.array),16);break;case"LOD":n=new Px;break;case"Line":n=new Xx(r(t.geometry),s(t.material),t.mode);break;case"LineLoop":n=new Kx(r(t.geometry),s(t.material));break;case"LineSegments":n=new Zx(r(t.geometry),s(t.material));break;case"PointCloud":case"Points":n=new nb(r(t.geometry),s(t.material));break;case"Sprite":n=new Ex(s(t.material));break;case"Group":n=new rx;break;default:n=new $m}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children)for(var l=t.children,c=0;c<l.length;c++)n.add(this.parseObject(l[c],e,i));if("LOD"===t.type){void 0!==t.autoUpdate&&(n.autoUpdate=t.autoUpdate);for(var d=t.levels,p=0;p<d.length;p++){var f=d[p],m=n.getObjectByProperty("uuid",f.object);void 0!==m&&n.addLevel(m,f.distance)}}return n}});var qT,JT={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:Rf,CubeUVRefractionMapping:307},ZT={RepeatWrapping:If,ClampToEdgeWrapping:Yf,MirroredRepeatWrapping:Ff},KT={NearestFilter:Nf,NearestMipmapNearestFilter:Bf,NearestMipmapLinearFilter:Uf,LinearFilter:jf,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:Hf};function QT(t){"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),Kw.call(this,t),this.options=void 0}function $T(){this.type="ShapePath",this.color=new Wv,this.subPaths=[],this.currentPath=null}function tM(t){this.type="Font",this.data=t}function eM(t,e,i,n,r){var s=r.glyphs[t]||r.glyphs["?"];if(s){var o,a,h,u,l,c,d,p,f=new $T;if(s.o)for(var m=s._cachedOutline||(s._cachedOutline=s.o.split(" ")),v=0,g=m.length;v<g;){switch(m[v++]){case"m":o=m[v++]*e+i,a=m[v++]*e+n,f.moveTo(o,a);break;case"l":o=m[v++]*e+i,a=m[v++]*e+n,f.lineTo(o,a);break;case"q":h=m[v++]*e+i,u=m[v++]*e+n,l=m[v++]*e+i,c=m[v++]*e+n,f.quadraticCurveTo(l,c,h,u);break;case"b":h=m[v++]*e+i,u=m[v++]*e+n,l=m[v++]*e+i,c=m[v++]*e+n,d=m[v++]*e+i,p=m[v++]*e+n,f.bezierCurveTo(l,c,d,p,h,u)}}return{offsetX:s.ha*e,path:f}}console.error('THREE.Font: character "'+t+'" does not exists in font family '+r.familyName+".")}function iM(t){Kw.call(this,t)}QT.prototype=Object.assign(Object.create(Kw.prototype),{constructor:QT,setOptions:function(t){return this.options=t,this},load:function(t,e,i,n){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);var r=this,s=qw.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;fetch(t).then((function(t){return t.blob()})).then((function(t){return void 0===r.options?createImageBitmap(t):createImageBitmap(t,r.options)})).then((function(i){qw.add(t,i),e&&e(i),r.manager.itemEnd(t)})).catch((function(e){n&&n(e),r.manager.itemError(t),r.manager.itemEnd(t)})),r.manager.itemStart(t)}}),Object.assign($T.prototype,{moveTo:function(t,e){return this.currentPath=new LT,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this},lineTo:function(t,e){return this.currentPath.lineTo(t,e),this},quadraticCurveTo:function(t,e,i,n){return this.currentPath.quadraticCurveTo(t,e,i,n),this},bezierCurveTo:function(t,e,i,n,r,s){return this.currentPath.bezierCurveTo(t,e,i,n,r,s),this},splineThru:function(t){return this.currentPath.splineThru(t),this},toShapes:function(t,e){function i(t){for(var e=[],i=0,n=t.length;i<n;i++){var r=t[i],s=new AT;s.curves=r.curves,e.push(s)}return e}function n(t,e){for(var i=e.length,n=!1,r=i-1,s=0;s<i;r=s++){var o=e[r],a=e[s],h=a.x-o.x,u=a.y-o.y;if(Math.abs(u)>Number.EPSILON){if(u<0&&(o=e[s],h=-h,a=e[r],u=-u),t.y<o.y||t.y>a.y)continue;if(t.y===o.y){if(t.x===o.x)return!0}else{var l=u*(t.x-o.x)-h*(t.y-o.y);if(0===l)return!0;if(l<0)continue;n=!n}}else{if(t.y!==o.y)continue;if(a.x<=t.x&&t.x<=o.x||o.x<=t.x&&t.x<=a.x)return!0}}return n}var r=Zb.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return i(s);var o,a,h,u=[];if(1===s.length)return a=s[0],(h=new AT).curves=a.curves,u.push(h),u;var l=!r(s[0].getPoints());l=t?!l:l;var c,d,p=[],f=[],m=[],v=0;f[v]=void 0,m[v]=[];for(var g=0,y=s.length;g<y;g++)o=r(c=(a=s[g]).getPoints()),(o=t?!o:o)?(!l&&f[v]&&v++,f[v]={s:new AT,p:c},f[v].s.curves=a.curves,l&&v++,m[v]=[]):m[v].push({h:a,p:c[0]});if(!f[0])return i(s);if(f.length>1){for(var _=!1,x=[],b=0,w=f.length;b<w;b++)p[b]=[];for(b=0,w=f.length;b<w;b++)for(var T=m[b],M=0;M<T.length;M++){for(var S=T[M],E=!0,L=0;L<f.length;L++)n(S.p,f[L].p)&&(b!==L&&x.push({froms:b,tos:L,hole:M}),E?(E=!1,p[L].push(S)):_=!0);E&&p[b].push(S)}x.length>0&&(_||(m=p))}g=0;for(var A=f.length;g<A;g++){h=f[g].s,u.push(h);for(var D=0,P=(d=m[g]).length;D<P;D++)h.holes.push(d[D].h)}return u}}),Object.assign(tM.prototype,{isFont:!0,generateShapes:function(t,e){void 0===e&&(e=100);for(var i=[],n=function(t,e,i){for(var n=Array.from?Array.from(t):String(t).split(""),r=e/i.resolution,s=(i.boundingBox.yMax-i.boundingBox.yMin+i.underlineThickness)*r,o=[],a=0,h=0,u=0;u<n.length;u++){var l=n[u];if("\n"===l)a=0,h-=s;else{var c=eM(l,r,a,h,i);a+=c.offsetX,o.push(c.path)}}return o}(t,e,this.data),r=0,s=n.length;r<s;r++)Array.prototype.push.apply(i,n[r].toShapes());return i}}),iM.prototype=Object.assign(Object.create(Kw.prototype),{constructor:iM,load:function(t,e,i,n){var r=this,s=new $w(this.manager);s.setPath(this.path),s.load(t,(function(t){var i;try{i=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),i=JSON.parse(t.substring(65,t.length-2))}var n=r.parse(i);e&&e(n)}),i,n)},parse:function(t){return new tM(t)}});var nM=function(){return void 0===qT&&(qT=new(window.AudioContext||window.webkitAudioContext)),qT};function rM(t){Kw.call(this,t)}function sM(){this.coefficients=[];for(var t=0;t<9;t++)this.coefficients.push(new Lm)}function oM(t,e){DT.call(this,void 0,e),this.sh=void 0!==t?t:new sM}function aM(t,e,i){oM.call(this,void 0,i);var n=(new Wv).set(t),r=(new Wv).set(e),s=new Lm(n.r,n.g,n.b),o=new Lm(r.r,r.g,r.b),a=Math.sqrt(Math.PI),h=a*Math.sqrt(.75);this.sh.coefficients[0].copy(s).add(o).multiplyScalar(a),this.sh.coefficients[1].copy(s).sub(o).multiplyScalar(h)}function hM(t,e){oM.call(this,void 0,e);var i=(new Wv).set(t);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}rM.prototype=Object.assign(Object.create(Kw.prototype),{constructor:rM,load:function(t,e,i,n){var r=new $w(this.manager);r.setResponseType("arraybuffer"),r.setPath(this.path),r.load(t,(function(t){var i=t.slice(0);nM().decodeAudioData(i,(function(t){e(t)}))}),i,n)}}),Object.assign(sM.prototype,{isSphericalHarmonics3:!0,set:function(t){for(var e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this},zero:function(){for(var t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this},getAt:function(t,e){var i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*n),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*i),e.addScaledVector(s[4],i*n*1.092548),e.addScaledVector(s[5],n*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],i*r*1.092548),e.addScaledVector(s[8],.546274*(i*i-n*n)),e},getIrradianceAt:function(t,e){var i=t.x,n=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*n),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*i),e.addScaledVector(s[4],.858086*i*n),e.addScaledVector(s[5],.858086*n*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*i*r),e.addScaledVector(s[8],.429043*(i*i-n*n)),e},add:function(t){for(var e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this},addScaledSH:function(t,e){for(var i=0;i<9;i++)this.coefficients[i].addScaledVector(t.coefficients[i],e);return this},scale:function(t){for(var e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this},lerp:function(t,e){for(var i=0;i<9;i++)this.coefficients[i].lerp(t.coefficients[i],e);return this},equals:function(t){for(var e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0},copy:function(t){return this.set(t.coefficients)},clone:function(){return(new this.constructor).copy(this)},fromArray:function(t,e){void 0===e&&(e=0);for(var i=this.coefficients,n=0;n<9;n++)i[n].fromArray(t,e+3*n);return this},toArray:function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);for(var i=this.coefficients,n=0;n<9;n++)i[n].toArray(t,e+3*n);return t}}),Object.assign(sM,{getBasisAt:function(t,e){var i=t.x,n=t.y,r=t.z;e[0]=.282095,e[1]=.488603*n,e[2]=.488603*r,e[3]=.488603*i,e[4]=1.092548*i*n,e[5]=1.092548*n*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*i*r,e[8]=.546274*(i*i-n*n)}}),oM.prototype=Object.assign(Object.create(DT.prototype),{constructor:oM,isLightProbe:!0,copy:function(t){return DT.prototype.copy.call(this,t),this.sh.copy(t.sh),this.intensity=t.intensity,this},toJSON:function(t){return DT.prototype.toJSON.call(this,t)}}),aM.prototype=Object.assign(Object.create(oM.prototype),{constructor:aM,isHemisphereLightProbe:!0,copy:function(t){return oM.prototype.copy.call(this,t),this},toJSON:function(t){return oM.prototype.toJSON.call(this,t)}}),hM.prototype=Object.assign(Object.create(oM.prototype),{constructor:hM,isAmbientLightProbe:!0,copy:function(t){return oM.prototype.copy.call(this,t),this},toJSON:function(t){return oM.prototype.toJSON.call(this,t)}});var uM=new Im,lM=new Im;function cM(t){this.autoStart=void 0===t||t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}Object.assign(function(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Zg,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Zg,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}.prototype,{update:function(t){var e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep;var i,n,r=t.projectionMatrix.clone(),s=e.eyeSep/2,o=s*e.near/e.focus,a=e.near*Math.tan(mm.DEG2RAD*e.fov*.5)/e.zoom;lM.elements[12]=-s,uM.elements[12]=s,i=-a*e.aspect+o,n=a*e.aspect+o,r.elements[0]=2*e.near/(n-i),r.elements[8]=(n+i)/(n-i),this.cameraL.projectionMatrix.copy(r),i=-a*e.aspect-o,n=a*e.aspect-o,r.elements[0]=2*e.near/(n-i),r.elements[8]=(n+i)/(n-i),this.cameraR.projectionMatrix.copy(r)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(lM),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(uM)}}),Object.assign(cM.prototype,{start:function(){this.startTime=("undefined"==typeof performance?Date:performance).now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0},stop:function(){this.getElapsedTime(),this.running=!1,this.autoStart=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){var t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var e=("undefined"==typeof performance?Date:performance).now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}});var dM=new Lm,pM=new Mm,fM=new Lm,mM=new Lm;function vM(){$m.call(this),this.type="AudioListener",this.context=nM(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new cM}function gM(t){$m.call(this),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType="empty",this._startedAt=0,this._pausedAt=0,this.filters=[]}vM.prototype=Object.assign(Object.create($m.prototype),{constructor:vM,getInput:function(){return this.gain},removeFilter:function(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this},getFilter:function(){return this.filter},setFilter:function(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this},updateMatrixWorld:function(t){$m.prototype.updateMatrixWorld.call(this,t);var e=this.context.listener,i=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(dM,pM,fM),mM.set(0,0,-1).applyQuaternion(pM),e.positionX){var n=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(dM.x,n),e.positionY.linearRampToValueAtTime(dM.y,n),e.positionZ.linearRampToValueAtTime(dM.z,n),e.forwardX.linearRampToValueAtTime(mM.x,n),e.forwardY.linearRampToValueAtTime(mM.y,n),e.forwardZ.linearRampToValueAtTime(mM.z,n),e.upX.linearRampToValueAtTime(i.x,n),e.upY.linearRampToValueAtTime(i.y,n),e.upZ.linearRampToValueAtTime(i.z,n)}else e.setPosition(dM.x,dM.y,dM.z),e.setOrientation(mM.x,mM.y,mM.z,i.x,i.y,i.z)}}),gM.prototype=Object.assign(Object.create($m.prototype),{constructor:gM,getOutput:function(){return this.gain},setNodeSource:function(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this},setMediaElementSource:function(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this},setMediaStreamSource:function(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this},setBuffer:function(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this},play:function(t){if(void 0===t&&(t=0),!0!==this.isPlaying){if(!1!==this.hasPlaybackControl){this._startedAt=this.context.currentTime+t;var e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._pausedAt+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}console.warn("THREE.Audio: this Audio has no playback control.")}else console.warn("THREE.Audio: Audio is already playing.")},pause:function(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._pausedAt+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")},stop:function(){if(!1!==this.hasPlaybackControl)return this._pausedAt=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},connect:function(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(var t=1,e=this.filters.length;t<e;t++)this.filters[t-1].connect(this.filters[t]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(var t=1,e=this.filters.length;t<e;t++)this.filters[t-1].disconnect(this.filters[t]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(t){return t||(t=[]),!0===this.isPlaying?(this.disconnect(),this.filters=t,this.connect()):this.filters=t,this},setDetune:function(t){if(this.detune=t,void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(t){return this.setFilters(t?[t]:[])},setPlaybackRate:function(t){if(!1!==this.hasPlaybackControl)return this.playbackRate=t,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(t){if(!1!==this.hasPlaybackControl)return this.loop=t,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")},setLoopStart:function(t){return this.loopStart=t,this},setLoopEnd:function(t){return this.loopEnd=t,this},getVolume:function(){return this.gain.gain.value},setVolume:function(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}});var yM=new Lm,_M=new Mm,xM=new Lm,bM=new Lm;function wM(t){gM.call(this,t),this.panner=this.context.createPanner(),this.panner.panningModel="HRTF",this.panner.connect(this.gain)}function TM(t,e){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=void 0!==e?e:2048,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}function MM(t,e,i){this.binding=t,this.valueSize=i;var n,r=Float64Array;switch(e){case"quaternion":n=this._slerp;break;case"string":case"bool":r=Array,n=this._select;break;default:n=this._lerp}this.buffer=new r(4*i),this._mixBufferRegion=n,this.cumulativeWeight=0,this.useCount=0,this.referenceCount=0}wM.prototype=Object.assign(Object.create(gM.prototype),{constructor:wM,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(t){return this.panner.refDistance=t,this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(t){return this.panner.rolloffFactor=t,this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(t){return this.panner.distanceModel=t,this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(t){return this.panner.maxDistance=t,this},setDirectionalCone:function(t,e,i){return this.panner.coneInnerAngle=t,this.panner.coneOuterAngle=e,this.panner.coneOuterGain=i,this},updateMatrixWorld:function(t){if($m.prototype.updateMatrixWorld.call(this,t),!0!==this.hasPlaybackControl||!1!==this.isPlaying){this.matrixWorld.decompose(yM,_M,xM),bM.set(0,0,1).applyQuaternion(_M);var e=this.panner;if(e.positionX){var i=this.context.currentTime+this.listener.timeDelta;e.positionX.linearRampToValueAtTime(yM.x,i),e.positionY.linearRampToValueAtTime(yM.y,i),e.positionZ.linearRampToValueAtTime(yM.z,i),e.orientationX.linearRampToValueAtTime(bM.x,i),e.orientationY.linearRampToValueAtTime(bM.y,i),e.orientationZ.linearRampToValueAtTime(bM.z,i)}else e.setPosition(yM.x,yM.y,yM.z),e.setOrientation(bM.x,bM.y,bM.z)}}}),Object.assign(TM.prototype,{getFrequencyData:function(){return this.analyser.getByteFrequencyData(this.data),this.data},getAverageFrequency:function(){for(var t=0,e=this.getFrequencyData(),i=0;i<e.length;i++)t+=e[i];return t/e.length}}),Object.assign(MM.prototype,{accumulate:function(t,e){var i=this.buffer,n=this.valueSize,r=t*n+n,s=this.cumulativeWeight;if(0===s){for(var o=0;o!==n;++o)i[r+o]=i[o];s=e}else{var a=e/(s+=e);this._mixBufferRegion(i,r,0,a,n)}this.cumulativeWeight=s},apply:function(t){var e=this.valueSize,i=this.buffer,n=t*e+e,r=this.cumulativeWeight,s=this.binding;if(this.cumulativeWeight=0,r<1){var o=3*e;this._mixBufferRegion(i,n,o,1-r,e)}for(var a=e,h=e+e;a!==h;++a)if(i[a]!==i[a+e]){s.setValue(i,n);break}},saveOriginalState:function(){var t=this.binding,e=this.buffer,i=this.valueSize,n=3*i;t.getValue(e,n);for(var r=i,s=n;r!==s;++r)e[r]=e[n+r%i];this.cumulativeWeight=0},restoreOriginalState:function(){var t=3*this.valueSize;this.binding.setValue(this.buffer,t)},_select:function(t,e,i,n,r){if(n>=.5)for(var s=0;s!==r;++s)t[e+s]=t[i+s]},_slerp:function(t,e,i,n){Mm.slerpFlat(t,e,t,e,t,i,n)},_lerp:function(t,e,i,n,r){for(var s=1-n,o=0;o!==r;++o){var a=e+o;t[a]=t[a]*s+t[i+o]*n}}});var SM="\\[\\]\\.:\\/",EM=new RegExp("[\\[\\]\\.:\\/]","g"),LM="[^\\[\\]\\.:\\/]",AM="[^"+SM.replace("\\.","")+"]",DM=/((?:WC+[\/:])*)/.source.replace("WC",LM),PM=/(WCOD+)?/.source.replace("WCOD",AM),CM=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",LM),OM=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",LM),kM=new RegExp("^"+DM+PM+CM+OM+"$"),RM=["material","materials","bones"];function IM(t,e,i){var n=i||YM.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,n)}function YM(t,e,i){this.path=e,this.parsedPath=i||YM.parseTrackName(e),this.node=YM.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}function FM(t,e,i){this._mixer=t,this._clip=e,this._localRoot=i||null;for(var n=e.tracks,r=n.length,s=new Array(r),o={endingStart:im,endingEnd:im},a=0;a!==r;++a){var h=n[a].createInterpolant(null);s[a]=h,h.settings=o}this._interpolantSettings=o,this._interpolants=s,this._propertyBindings=new Array(r),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}function NM(t){this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}function BM(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}function UM(t,e,i){ux.call(this,t,e),this.meshPerAttribute=i||1}function jM(t,e,i,n){this.ray=new Sv(t,e),this.near=i||0,this.far=n||1/0,this.camera=null,this.layers=new Bm,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}function HM(t,e){return t.distance-e.distance}function zM(t,e,i,n){if(t.layers.test(e.layers)&&t.raycast(e,i),!0===n)for(var r=t.children,s=0,o=r.length;s<o;s++)zM(r[s],e,i,!0)}Object.assign(IM.prototype,{getValue:function(t,e){this.bind();var i=this._targetGroup.nCachedObjects_,n=this._bindings[i];void 0!==n&&n.getValue(t,e)},setValue:function(t,e){for(var i=this._bindings,n=this._targetGroup.nCachedObjects_,r=i.length;n!==r;++n)i[n].setValue(t,e)},bind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].bind()},unbind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].unbind()}}),Object.assign(YM,{Composite:IM,create:function(t,e,i){return t&&t.isAnimationObjectGroup?new YM.Composite(t,e,i):new YM(t,e,i)},sanitizeNodeName:function(t){return t.replace(/\s/g,"_").replace(EM,"")},parseTrackName:function(t){var e=kM.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);var i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){var r=i.nodeName.substring(n+1);-1!==RM.indexOf(r)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=r)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i},findNode:function(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){var i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){var n=function(t){for(var i=0;i<t.length;i++){var r=t[i];if(r.name===e||r.uuid===e)return r;var s=n(r.children);if(s)return s}return null},r=n(t.children);if(r)return r}return null}}),Object.assign(YM.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(t,e){t[e]=this.node[this.propertyName]},function(t,e){for(var i=this.resolvedProperty,n=0,r=i.length;n!==r;++n)t[e++]=i[n]},function(t,e){t[e]=this.resolvedProperty[this.propertyIndex]},function(t,e){this.resolvedProperty.toArray(t,e)}],SetterByBindingTypeAndVersioning:[[function(t,e){this.targetObject[this.propertyName]=t[e]},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){for(var i=this.resolvedProperty,n=0,r=i.length;n!==r;++n)i[n]=t[e++]},function(t,e){for(var i=this.resolvedProperty,n=0,r=i.length;n!==r;++n)i[n]=t[e++];this.targetObject.needsUpdate=!0},function(t,e){for(var i=this.resolvedProperty,n=0,r=i.length;n!==r;++n)i[n]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty[this.propertyIndex]=t[e]},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty.fromArray(t,e)},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(t,e){this.bind(),this.getValue(t,e)},setValue:function(t,e){this.bind(),this.setValue(t,e)},bind:function(){var t=this.node,e=this.parsedPath,i=e.objectName,n=e.propertyName,r=e.propertyIndex;if(t||(t=YM.findNode(this.rootNode,e.nodeName)||this.rootNode,this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,t){if(i){var s=e.objectIndex;switch(i){case"materials":if(!t.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!t.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);t=t.material.materials;break;case"bones":if(!t.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);t=t.skeleton.bones;for(var o=0;o<t.length;o++)if(t[o].name===s){s=o;break}break;default:if(void 0===t[i])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);t=t[i]}if(void 0!==s){if(void 0===t[s])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,t);t=t[s]}}var a=t[n];if(void 0!==a){var h=this.Versioning.None;this.targetObject=t,void 0!==t.needsUpdate?h=this.Versioning.NeedsUpdate:void 0!==t.matrixWorldNeedsUpdate&&(h=this.Versioning.MatrixWorldNeedsUpdate);var u=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===n){if(!t.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(t.geometry.isBufferGeometry){if(!t.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);for(o=0;o<this.node.geometry.morphAttributes.position.length;o++)if(t.geometry.morphAttributes.position[o].name===r){r=o;break}}else{if(!t.geometry.morphTargets)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);for(o=0;o<this.node.geometry.morphTargets.length;o++)if(t.geometry.morphTargets[o].name===r){r=o;break}}}u=this.BindingType.ArrayElement,this.resolvedProperty=a,this.propertyIndex=r}else void 0!==a.fromArray&&void 0!==a.toArray?(u=this.BindingType.HasFromToArray,this.resolvedProperty=a):Array.isArray(a)?(u=this.BindingType.EntireArray,this.resolvedProperty=a):this.propertyName=n;this.getValue=this.GetterByBindingType[u],this.setValue=this.SetterByBindingTypeAndVersioning[u][h]}else{var l=e.nodeName;console.error("THREE.PropertyBinding: Trying to update property for track: "+l+"."+n+" but it wasn't found.",t)}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(YM.prototype,{_getValue_unbound:YM.prototype.getValue,_setValue_unbound:YM.prototype.setValue}),Object.assign(function(){this.uuid=mm.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var t={};this._indicesByUUID=t;for(var e=0,i=arguments.length;e!==i;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var n=this;this.stats={objects:{get total(){return n._objects.length},get inUse(){return this.total-n.nCachedObjects_}},get bindingsPerObject(){return n._bindings.length}}}.prototype,{isAnimationObjectGroup:!0,add:function(){for(var t=this._objects,e=t.length,i=this.nCachedObjects_,n=this._indicesByUUID,r=this._paths,s=this._parsedPaths,o=this._bindings,a=o.length,h=void 0,u=0,l=arguments.length;u!==l;++u){var c=arguments[u],d=c.uuid,p=n[d];if(void 0===p){p=e++,n[d]=p,t.push(c);for(var f=0,m=a;f!==m;++f)o[f].push(new YM(c,r[f],s[f]))}else if(p<i){h=t[p];var v=--i,g=t[v];n[g.uuid]=p,t[p]=g,n[d]=v,t[v]=c;for(f=0,m=a;f!==m;++f){var y=o[f],_=y[v],x=y[p];y[p]=_,void 0===x&&(x=new YM(c,r[f],s[f])),y[v]=x}}else t[p]!==h&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=i},remove:function(){for(var t=this._objects,e=this.nCachedObjects_,i=this._indicesByUUID,n=this._bindings,r=n.length,s=0,o=arguments.length;s!==o;++s){var a=arguments[s],h=a.uuid,u=i[h];if(void 0!==u&&u>=e){var l=e++,c=t[l];i[c.uuid]=u,t[u]=c,i[h]=l,t[l]=a;for(var d=0,p=r;d!==p;++d){var f=n[d],m=f[l],v=f[u];f[u]=m,f[l]=v}}}this.nCachedObjects_=e},uncache:function(){for(var t=this._objects,e=t.length,i=this.nCachedObjects_,n=this._indicesByUUID,r=this._bindings,s=r.length,o=0,a=arguments.length;o!==a;++o){var h=arguments[o],u=h.uuid,l=n[u];if(void 0!==l)if(delete n[u],l<i){var c=--i,d=t[c],p=t[y=--e];n[d.uuid]=l,t[l]=d,n[p.uuid]=c,t[c]=p,t.pop();for(var f=0,m=s;f!==m;++f){var v=(_=r[f])[c],g=_[y];_[l]=v,_[c]=g,_.pop()}}else{var y;n[(p=t[y=--e]).uuid]=l,t[l]=p,t.pop();for(f=0,m=s;f!==m;++f){var _;(_=r[f])[l]=_[y],_.pop()}}}this.nCachedObjects_=i},subscribe_:function(t,e){var i=this._bindingsIndicesByPath,n=i[t],r=this._bindings;if(void 0!==n)return r[n];var s=this._paths,o=this._parsedPaths,a=this._objects,h=a.length,u=this.nCachedObjects_,l=new Array(h);n=r.length,i[t]=n,s.push(t),o.push(e),r.push(l);for(var c=u,d=a.length;c!==d;++c){var p=a[c];l[c]=new YM(p,t,e)}return l},unsubscribe_:function(t){var e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){var n=this._paths,r=this._parsedPaths,s=this._bindings,o=s.length-1,a=s[o];e[t[o]]=i,s[i]=a,s.pop(),r[i]=r[o],r.pop(),n[i]=n[o],n.pop()}}}),Object.assign(FM.prototype,{play:function(){return this._mixer._activateAction(this),this},stop:function(){return this._mixer._deactivateAction(this),this.reset()},reset:function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(t){return this._startTime=t,this},setLoop:function(t,e){return this.loop=t,this.repetitions=e,this},setEffectiveWeight:function(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(t){return this._scheduleFading(t,0,1)},fadeOut:function(t){return this._scheduleFading(t,1,0)},crossFadeFrom:function(t,e,i){if(t.fadeOut(e),this.fadeIn(e),i){var n=this._clip.duration,r=t._clip.duration,s=r/n,o=n/r;t.warp(1,s,e),this.warp(o,1,e)}return this},crossFadeTo:function(t,e,i){return t.crossFadeFrom(this,e,i)},stopFading:function(){var t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},setEffectiveTimeScale:function(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(t){return this.timeScale=this._clip.duration/t,this.stopWarping()},syncWith:function(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()},halt:function(t){return this.warp(this._effectiveTimeScale,0,t)},warp:function(t,e,i){var n=this._mixer,r=n.time,s=this._timeScaleInterpolant,o=this.timeScale;null===s&&(s=n._lendControlInterpolant(),this._timeScaleInterpolant=s);var a=s.parameterPositions,h=s.sampleValues;return a[0]=r,a[1]=r+i,h[0]=t/o,h[1]=e/o,this},stopWarping:function(){var t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(t,e,i,n){if(this.enabled){var r=this._startTime;if(null!==r){var s=(t-r)*i;if(s<0||0===i)return;this._startTime=null,e=i*s}e*=this._updateTimeScale(t);var o=this._updateTime(e),a=this._updateWeight(t);if(a>0)for(var h=this._interpolants,u=this._propertyBindings,l=0,c=h.length;l!==c;++l)h[l].evaluate(o),u[l].accumulate(n,a)}else this._updateWeight(t)},_updateWeight:function(t){var e=0;if(this.enabled){e=this.weight;var i=this._weightInterpolant;if(null!==i){var n=i.evaluate(t)[0];e*=n,t>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=e,e},_updateTimeScale:function(t){var e=0;if(!this.paused){e=this.timeScale;var i=this._timeScaleInterpolant;if(null!==i)e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}return this._effectiveTimeScale=e,e},_updateTime:function(t){var e=this.time+t,i=this._clip.duration,n=this.loop,r=this._loopCount,s=2202===n;if(0===t)return-1===r?e:s&&1==(1&r)?i-e:e;if(2200===n){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(e>=i)e=i;else{if(!(e<0)){this.time=e;break t}e=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=e,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),e>=i||e<0){var o=Math.floor(e/i);e-=i*o,r+=Math.abs(o);var a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,e=t>0?i:0,this.time=e,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){var h=t<0;this._setEndings(h,!h,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=e;if(s&&1==(1&r))return i-e}return e},_setEndings:function(t,e,i){var n=this._interpolantSettings;i?(n.endingStart=nm,n.endingEnd=nm):(n.endingStart=t?this.zeroSlopeAtStart?nm:im:rm,n.endingEnd=e?this.zeroSlopeAtEnd?nm:im:rm)},_scheduleFading:function(t,e,i){var n=this._mixer,r=n.time,s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);var o=s.parameterPositions,a=s.sampleValues;return o[0]=r,a[0]=e,o[1]=r+t,a[1]=i,this}}),NM.prototype=Object.assign(Object.create(cm.prototype),{constructor:NM,_bindAction:function(t,e){var i=t._localRoot||this._root,n=t._clip.tracks,r=n.length,s=t._propertyBindings,o=t._interpolants,a=i.uuid,h=this._bindingsByRootAndName,u=h[a];void 0===u&&(u={},h[a]=u);for(var l=0;l!==r;++l){var c=n[l],d=c.name,p=u[d];if(void 0!==p)s[l]=p;else{if(void 0!==(p=s[l])){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,a,d));continue}var f=e&&e._propertyBindings[l].binding.parsedPath;++(p=new MM(YM.create(i,d,f),c.ValueTypeName,c.getValueSize())).referenceCount,this._addInactiveBinding(p,a,d),s[l]=p}o[l].resultBuffer=p.buffer}},_activateAction:function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){var e=(t._localRoot||this._root).uuid,i=t._clip.uuid,n=this._actionsByClip[i];this._bindAction(t,n&&n.knownActions[0]),this._addInactiveAction(t,i,e)}for(var r=t._propertyBindings,s=0,o=r.length;s!==o;++s){var a=r[s];0==a.useCount++&&(this._lendBinding(a),a.saveOriginalState())}this._lendAction(t)}},_deactivateAction:function(t){if(this._isActiveAction(t)){for(var e=t._propertyBindings,i=0,n=e.length;i!==n;++i){var r=e[i];0==--r.useCount&&(r.restoreOriginalState(),this._takeBackBinding(r))}this._takeBackAction(t)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},_isActiveAction:function(t){var e=t._cacheIndex;return null!==e&&e<this._nActiveActions},_addInactiveAction:function(t,e,i){var n=this._actions,r=this._actionsByClip,s=r[e];if(void 0===s)s={knownActions:[t],actionByRoot:{}},t._byClipCacheIndex=0,r[e]=s;else{var o=s.knownActions;t._byClipCacheIndex=o.length,o.push(t)}t._cacheIndex=n.length,n.push(t),s.actionByRoot[i]=t},_removeInactiveAction:function(t){var e=this._actions,i=e[e.length-1],n=t._cacheIndex;i._cacheIndex=n,e[n]=i,e.pop(),t._cacheIndex=null;var r=t._clip.uuid,s=this._actionsByClip,o=s[r],a=o.knownActions,h=a[a.length-1],u=t._byClipCacheIndex;h._byClipCacheIndex=u,a[u]=h,a.pop(),t._byClipCacheIndex=null,delete o.actionByRoot[(t._localRoot||this._root).uuid],0===a.length&&delete s[r],this._removeInactiveBindingsForAction(t)},_removeInactiveBindingsForAction:function(t){for(var e=t._propertyBindings,i=0,n=e.length;i!==n;++i){var r=e[i];0==--r.referenceCount&&this._removeInactiveBinding(r)}},_lendAction:function(t){var e=this._actions,i=t._cacheIndex,n=this._nActiveActions++,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_takeBackAction:function(t){var e=this._actions,i=t._cacheIndex,n=--this._nActiveActions,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_addInactiveBinding:function(t,e,i){var n=this._bindingsByRootAndName,r=n[e],s=this._bindings;void 0===r&&(r={},n[e]=r),r[i]=t,t._cacheIndex=s.length,s.push(t)},_removeInactiveBinding:function(t){var e=this._bindings,i=t.binding,n=i.rootNode.uuid,r=i.path,s=this._bindingsByRootAndName,o=s[n],a=e[e.length-1],h=t._cacheIndex;a._cacheIndex=h,e[h]=a,e.pop(),delete o[r],0===Object.keys(o).length&&delete s[n]},_lendBinding:function(t){var e=this._bindings,i=t._cacheIndex,n=this._nActiveBindings++,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_takeBackBinding:function(t){var e=this._bindings,i=t._cacheIndex,n=--this._nActiveBindings,r=e[n];t._cacheIndex=n,e[n]=t,r._cacheIndex=i,e[i]=r},_lendControlInterpolant:function(){var t=this._controlInterpolants,e=this._nActiveControlInterpolants++,i=t[e];return void 0===i&&((i=new Yw(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer)).__cacheIndex=e,t[e]=i),i},_takeBackControlInterpolant:function(t){var e=this._controlInterpolants,i=t.__cacheIndex,n=--this._nActiveControlInterpolants,r=e[n];t.__cacheIndex=n,e[n]=t,r.__cacheIndex=i,e[i]=r},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(t,e){var i=e||this._root,n=i.uuid,r="string"==typeof t?Vw.findByName(i,t):t,s=null!==r?r.uuid:t,o=this._actionsByClip[s],a=null;if(void 0!==o){var h=o.actionByRoot[n];if(void 0!==h)return h;a=o.knownActions[0],null===r&&(r=a._clip)}if(null===r)return null;var u=new FM(this,r,e);return this._bindAction(u,a),this._addInactiveAction(u,s,n),u},existingAction:function(t,e){var i=e||this._root,n=i.uuid,r="string"==typeof t?Vw.findByName(i,t):t,s=r?r.uuid:t,o=this._actionsByClip[s];return void 0!==o&&o.actionByRoot[n]||null},stopAllAction:function(){var t=this._actions,e=this._nActiveActions,i=this._bindings,n=this._nActiveBindings;this._nActiveActions=0,this._nActiveBindings=0;for(var r=0;r!==e;++r)t[r].reset();for(r=0;r!==n;++r)i[r].useCount=0;return this},update:function(t){t*=this.timeScale;for(var e=this._actions,i=this._nActiveActions,n=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1,o=0;o!==i;++o){e[o]._update(n,t,r,s)}var a=this._bindings,h=this._nActiveBindings;for(o=0;o!==h;++o)a[o].apply(s);return this},setTime:function(t){this.time=0;for(var e=0;e<this._actions.length;e++)this._actions[e].time=0;return this.update(t)},getRoot:function(){return this._root},uncacheClip:function(t){var e=this._actions,i=t.uuid,n=this._actionsByClip,r=n[i];if(void 0!==r){for(var s=r.knownActions,o=0,a=s.length;o!==a;++o){var h=s[o];this._deactivateAction(h);var u=h._cacheIndex,l=e[e.length-1];h._cacheIndex=null,h._byClipCacheIndex=null,l._cacheIndex=u,e[u]=l,e.pop(),this._removeInactiveBindingsForAction(h)}delete n[i]}},uncacheRoot:function(t){var e=t.uuid,i=this._actionsByClip;for(var n in i){var r=i[n].actionByRoot[e];void 0!==r&&(this._deactivateAction(r),this._removeInactiveAction(r))}var s=this._bindingsByRootAndName[e];if(void 0!==s)for(var o in s){var a=s[o];a.restoreOriginalState(),this._removeInactiveBinding(a)}},uncacheAction:function(t,e){var i=this.existingAction(t,e);null!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}}),BM.prototype.clone=function(){return new BM(void 0===this.value.clone?this.value:this.value.clone())},UM.prototype=Object.assign(Object.create(ux.prototype),{constructor:UM,isInstancedInterleavedBuffer:!0,copy:function(t){return ux.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this}}),Object.assign(jM.prototype,{set:function(t,e){this.ray.set(t,e)},setFromCamera:function(t,e){e&&e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize(),this.camera=e):e&&e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld),this.camera=e):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(t,e,i){var n=i||[];return zM(t,this,n,e),n.sort(HM),n},intersectObjects:function(t,e,i){var n=i||[];if(!1===Array.isArray(t))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),n;for(var r=0,s=t.length;r<s;r++)zM(t[r],this,n,e);return n.sort(HM),n}}),Object.assign(function(t,e,i){return this.radius=void 0!==t?t:1,this.phi=void 0!==e?e:0,this.theta=void 0!==i?i:0,this}.prototype,{set:function(t,e,i){return this.radius=t,this.phi=e,this.theta=i,this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.radius=t.radius,this.phi=t.phi,this.theta=t.theta,this},makeSafe:function(){var t=1e-6;return this.phi=Math.max(t,Math.min(Math.PI-t,this.phi)),this},setFromVector3:function(t){return this.setFromCartesianCoords(t.x,t.y,t.z)},setFromCartesianCoords:function(t,e,i){return this.radius=Math.sqrt(t*t+e*e+i*i),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(t,i),this.phi=Math.acos(mm.clamp(e/this.radius,-1,1))),this}}),Object.assign(function(t,e,i){return this.radius=void 0!==t?t:1,this.theta=void 0!==e?e:0,this.y=void 0!==i?i:0,this}.prototype,{set:function(t,e,i){return this.radius=t,this.theta=e,this.y=i,this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.radius=t.radius,this.theta=t.theta,this.y=t.y,this},setFromVector3:function(t){return this.setFromCartesianCoords(t.x,t.y,t.z)},setFromCartesianCoords:function(t,e,i){return this.radius=Math.sqrt(t*t+i*i),this.theta=Math.atan2(t,i),this.y=e,this}});var WM=new vm;function GM(t,e){this.min=void 0!==t?t:new vm(1/0,1/0),this.max=void 0!==e?e:new vm(-1/0,-1/0)}Object.assign(GM.prototype,{set:function(t,e){return this.min.copy(t),this.max.copy(e),this},setFromPoints:function(t){this.makeEmpty();for(var e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this},setFromCenterAndSize:function(t,e){var i=WM.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.min.copy(t.min),this.max.copy(t.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(t){return void 0===t&&(console.warn("THREE.Box2: .getCenter() target is now required"),t=new vm),this.isEmpty()?t.set(0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(t){return void 0===t&&(console.warn("THREE.Box2: .getSize() target is now required"),t=new vm),this.isEmpty()?t.set(0,0):t.subVectors(this.max,this.min)},expandByPoint:function(t){return this.min.min(t),this.max.max(t),this},expandByVector:function(t){return this.min.sub(t),this.max.add(t),this},expandByScalar:function(t){return this.min.addScalar(-t),this.max.addScalar(t),this},containsPoint:function(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new vm),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y)},clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new vm),e.copy(t).clamp(this.min,this.max)},distanceToPoint:function(t){return WM.copy(t).clamp(this.min,this.max).sub(t).length()},intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}});var VM=new Lm,XM=new Lm;function qM(t,e){this.start=void 0!==t?t:new Lm,this.end=void 0!==e?e:new Lm}function JM(t){$m.call(this),this.material=t,this.render=function(){}}Object.assign(qM.prototype,{set:function(t,e){return this.start.copy(t),this.end.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.start.copy(t.start),this.end.copy(t.end),this},getCenter:function(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Lm),t.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Lm),t.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Lm),this.delta(e).multiplyScalar(t).add(this.start)},closestPointToPointParameter:function(t,e){VM.subVectors(t,this.start),XM.subVectors(this.end,this.start);var i=XM.dot(XM),n=XM.dot(VM)/i;return e&&(n=mm.clamp(n,0,1)),n},closestPointToPoint:function(t,e,i){var n=this.closestPointToPointParameter(t,e);return void 0===i&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),i=new Lm),this.delta(i).multiplyScalar(n).add(this.start)},applyMatrix4:function(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this},equals:function(t){return t.start.equals(this.start)&&t.end.equals(this.end)}}),JM.prototype=Object.create($m.prototype),JM.prototype.constructor=JM,JM.prototype.isImmediateRenderObject=!0;var ZM=new Lm;function KM(t,e){$m.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=e;for(var i=new yg,n=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],r=0,s=1;r<32;r++,s++){var o=r/32*Math.PI*2,a=s/32*Math.PI*2;n.push(Math.cos(o),Math.sin(o),1,Math.cos(a),Math.sin(a),1)}i.setAttribute("position",new ag(n,3));var h=new jx({fog:!1,toneMapped:!1});this.cone=new Zx(i,h),this.add(this.cone),this.update()}KM.prototype=Object.create($m.prototype),KM.prototype.constructor=KM,KM.prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},KM.prototype.update=function(){this.light.updateMatrixWorld();var t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),ZM.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(ZM),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var QM=new Lm,$M=new Im,tS=new Im;function eS(t){var e=[];t&&t.isBone&&e.push(t);for(var i=0;i<t.children.length;i++)e.push.apply(e,eS(t.children[i]));return e}function iS(t){for(var e=eS(t),i=new yg,n=[],r=[],s=new Wv(0,0,1),o=new Wv(0,1,0),a=0;a<e.length;a++){var h=e[a];h.parent&&h.parent.isBone&&(n.push(0,0,0),n.push(0,0,0),r.push(s.r,s.g,s.b),r.push(o.r,o.g,o.b))}i.setAttribute("position",new ag(n,3)),i.setAttribute("color",new ag(r,3));var u=new jx({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0});Zx.call(this,i,u),this.root=t,this.bones=e,this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1}function nS(t,e,i){this.light=t,this.light.updateMatrixWorld(),this.color=i;var n=new ow(e,4,2),r=new Kv({wireframe:!0,fog:!1,toneMapped:!1});Yg.call(this,n,r),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}iS.prototype=Object.create(Zx.prototype),iS.prototype.constructor=iS,iS.prototype.isSkeletonHelper=!0,iS.prototype.updateMatrixWorld=function(t){var e=this.bones,i=this.geometry,n=i.getAttribute("position");tS.getInverse(this.root.matrixWorld);for(var r=0,s=0;r<e.length;r++){var o=e[r];o.parent&&o.parent.isBone&&($M.multiplyMatrices(tS,o.matrixWorld),QM.setFromMatrixPosition($M),n.setXYZ(s,QM.x,QM.y,QM.z),$M.multiplyMatrices(tS,o.parent.matrixWorld),QM.setFromMatrixPosition($M),n.setXYZ(s+1,QM.x,QM.y,QM.z),s+=2)}i.getAttribute("position").needsUpdate=!0,$m.prototype.updateMatrixWorld.call(this,t)},nS.prototype=Object.create(Yg.prototype),nS.prototype.constructor=nS,nS.prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},nS.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};var rS=new Lm,sS=new Wv,oS=new Wv;function aS(t,e,i){$m.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=i;var n=new gb(e);n.rotateY(.5*Math.PI),this.material=new Kv({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);var r=n.getAttribute("position"),s=new Float32Array(3*r.count);n.setAttribute("color",new $v(s,3)),this.add(new Yg(n,this.material)),this.update()}function hS(t,e,i,n){t=t||10,e=e||10,i=new Wv(void 0!==i?i:4473924),n=new Wv(void 0!==n?n:8947848);for(var r=e/2,s=t/e,o=t/2,a=[],h=[],u=0,l=0,c=-o;u<=e;u++,c+=s){a.push(-o,0,c,o,0,c),a.push(c,0,-o,c,0,o);var d=u===r?i:n;d.toArray(h,l),l+=3,d.toArray(h,l),l+=3,d.toArray(h,l),l+=3,d.toArray(h,l),l+=3}var p=new yg;p.setAttribute("position",new ag(a,3)),p.setAttribute("color",new ag(h,3));var f=new jx({vertexColors:!0,toneMapped:!1});Zx.call(this,p,f)}function uS(t,e,i,n,r,s){t=t||10,e=e||16,i=i||8,n=n||64,r=new Wv(void 0!==r?r:4473924),s=new Wv(void 0!==s?s:8947848);var o,a,h,u,l,c,d,p=[],f=[];for(u=0;u<=e;u++)h=u/e*(2*Math.PI),o=Math.sin(h)*t,a=Math.cos(h)*t,p.push(0,0,0),p.push(o,0,a),d=1&u?r:s,f.push(d.r,d.g,d.b),f.push(d.r,d.g,d.b);for(u=0;u<=i;u++)for(d=1&u?r:s,c=t-t/i*u,l=0;l<n;l++)h=l/n*(2*Math.PI),o=Math.sin(h)*c,a=Math.cos(h)*c,p.push(o,0,a),f.push(d.r,d.g,d.b),h=(l+1)/n*(2*Math.PI),o=Math.sin(h)*c,a=Math.cos(h)*c,p.push(o,0,a),f.push(d.r,d.g,d.b);var m=new yg;m.setAttribute("position",new ag(p,3)),m.setAttribute("color",new ag(f,3));var v=new jx({vertexColors:!0,toneMapped:!1});Zx.call(this,m,v)}aS.prototype=Object.create($m.prototype),aS.prototype.constructor=aS,aS.prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},aS.prototype.update=function(){var t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=t.geometry.getAttribute("color");sS.copy(this.light.color),oS.copy(this.light.groundColor);for(var i=0,n=e.count;i<n;i++){var r=i<n/2?sS:oS;e.setXYZ(i,r.r,r.g,r.b)}e.needsUpdate=!0}t.lookAt(rS.setFromMatrixPosition(this.light.matrixWorld).negate())},hS.prototype=Object.assign(Object.create(Zx.prototype),{constructor:hS,copy:function(t){return Zx.prototype.copy.call(this,t),this.geometry.copy(t.geometry),this.material.copy(t.material),this},clone:function(){return(new this.constructor).copy(this)}}),uS.prototype=Object.create(Zx.prototype),uS.prototype.constructor=uS;var lS=new Lm,cS=new Lm,dS=new Lm;function pS(t,e,i){$m.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=i,void 0===e&&(e=1);var n=new yg;n.setAttribute("position",new ag([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));var r=new jx({fog:!1,toneMapped:!1});this.lightPlane=new Xx(n,r),this.add(this.lightPlane),(n=new yg).setAttribute("position",new ag([0,0,0,0,0,1],3)),this.targetLine=new Xx(n,r),this.add(this.targetLine),this.update()}pS.prototype=Object.create($m.prototype),pS.prototype.constructor=pS,pS.prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},pS.prototype.update=function(){lS.setFromMatrixPosition(this.light.matrixWorld),cS.setFromMatrixPosition(this.light.target.matrixWorld),dS.subVectors(cS,lS),this.lightPlane.lookAt(cS),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(cS),this.targetLine.scale.z=dS.length()};var fS=new Lm,mS=new Jg;function vS(t){var e=new yg,i=new jx({color:16777215,vertexColors:!0,toneMapped:!1}),n=[],r=[],s={},o=new Wv(16755200),a=new Wv(16711680),h=new Wv(43775),u=new Wv(16777215),l=new Wv(3355443);function c(t,e,i){d(t,i),d(e,i)}function d(t,e){n.push(0,0,0),r.push(e.r,e.g,e.b),void 0===s[t]&&(s[t]=[]),s[t].push(n.length/3-1)}c("n1","n2",o),c("n2","n4",o),c("n4","n3",o),c("n3","n1",o),c("f1","f2",o),c("f2","f4",o),c("f4","f3",o),c("f3","f1",o),c("n1","f1",o),c("n2","f2",o),c("n3","f3",o),c("n4","f4",o),c("p","n1",a),c("p","n2",a),c("p","n3",a),c("p","n4",a),c("u1","u2",h),c("u2","u3",h),c("u3","u1",h),c("c","t",u),c("p","c",l),c("cn1","cn2",l),c("cn3","cn4",l),c("cf1","cf2",l),c("cf3","cf4",l),e.setAttribute("position",new ag(n,3)),e.setAttribute("color",new ag(r,3)),Zx.call(this,e,i),this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}function gS(t,e,i,n,r,s,o){fS.set(r,s,o).unproject(n);var a=e[t];if(void 0!==a)for(var h=i.getAttribute("position"),u=0,l=a.length;u<l;u++)h.setXYZ(a[u],fS.x,fS.y,fS.z)}vS.prototype=Object.create(Zx.prototype),vS.prototype.constructor=vS,vS.prototype.update=function(){var t=this.geometry,e=this.pointMap;mS.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),gS("c",e,t,mS,0,0,-1),gS("t",e,t,mS,0,0,1),gS("n1",e,t,mS,-1,-1,-1),gS("n2",e,t,mS,1,-1,-1),gS("n3",e,t,mS,-1,1,-1),gS("n4",e,t,mS,1,1,-1),gS("f1",e,t,mS,-1,-1,1),gS("f2",e,t,mS,1,-1,1),gS("f3",e,t,mS,-1,1,1),gS("f4",e,t,mS,1,1,1),gS("u1",e,t,mS,.7,1.1,-1),gS("u2",e,t,mS,-.7,1.1,-1),gS("u3",e,t,mS,0,2,-1),gS("cf1",e,t,mS,-1,0,1),gS("cf2",e,t,mS,1,0,1),gS("cf3",e,t,mS,0,-1,1),gS("cf4",e,t,mS,0,1,1),gS("cn1",e,t,mS,-1,0,-1),gS("cn2",e,t,mS,1,0,-1),gS("cn3",e,t,mS,0,-1,-1),gS("cn4",e,t,mS,0,1,-1),t.getAttribute("position").needsUpdate=!0};var yS=new fv;function _S(t,e){this.object=t,void 0===e&&(e=16776960);var i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new Float32Array(24),r=new yg;r.setIndex(new $v(i,1)),r.setAttribute("position",new $v(n,3)),Zx.call(this,r,new jx({color:e,toneMapped:!1})),this.matrixAutoUpdate=!1,this.update()}function xS(t,e){this.type="Box3Helper",this.box=t,e=e||16776960;var i=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),n=new yg;n.setIndex(new $v(i,1)),n.setAttribute("position",new ag([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),Zx.call(this,n,new jx({color:e,toneMapped:!1})),this.geometry.computeBoundingSphere()}function bS(t,e,i){this.type="PlaneHelper",this.plane=t,this.size=void 0===e?1:e;var n=void 0!==i?i:16776960,r=new yg;r.setAttribute("position",new ag([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),r.computeBoundingSphere(),Xx.call(this,r,new jx({color:n,toneMapped:!1}));var s=new yg;s.setAttribute("position",new ag([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),s.computeBoundingSphere(),this.add(new Yg(s,new Kv({color:n,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}_S.prototype=Object.create(Zx.prototype),_S.prototype.constructor=_S,_S.prototype.update=function(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&yS.setFromObject(this.object),!yS.isEmpty()){var e=yS.min,i=yS.max,n=this.geometry.attributes.position,r=n.array;r[0]=i.x,r[1]=i.y,r[2]=i.z,r[3]=e.x,r[4]=i.y,r[5]=i.z,r[6]=e.x,r[7]=e.y,r[8]=i.z,r[9]=i.x,r[10]=e.y,r[11]=i.z,r[12]=i.x,r[13]=i.y,r[14]=e.z,r[15]=e.x,r[16]=i.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=i.x,r[22]=e.y,r[23]=e.z,n.needsUpdate=!0,this.geometry.computeBoundingSphere()}},_S.prototype.setFromObject=function(t){return this.object=t,this.update(),this},_S.prototype.copy=function(t){return Zx.prototype.copy.call(this,t),this.object=t.object,this},_S.prototype.clone=function(){return(new this.constructor).copy(this)},xS.prototype=Object.create(Zx.prototype),xS.prototype.constructor=xS,xS.prototype.updateMatrixWorld=function(t){var e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),$m.prototype.updateMatrixWorld.call(this,t))},bS.prototype=Object.create(Xx.prototype),bS.prototype.constructor=bS,bS.prototype.updateMatrixWorld=function(t){var e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?1:0,this.lookAt(this.plane.normal),$m.prototype.updateMatrixWorld.call(this,t)};var wS,TS,MS=new Lm;function SS(t,e,i,n,r,s){$m.call(this),void 0===t&&(t=new Lm(0,0,1)),void 0===e&&(e=new Lm(0,0,0)),void 0===i&&(i=1),void 0===n&&(n=16776960),void 0===r&&(r=.2*i),void 0===s&&(s=.2*r),void 0===wS&&((wS=new yg).setAttribute("position",new ag([0,0,0,0,1,0],3)),(TS=new vw(0,.5,1,5,1)).translate(0,-.5,0)),this.position.copy(e),this.line=new Xx(wS,new jx({color:n,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Yg(TS,new Kv({color:n,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(i,r,s)}function ES(t){var e=[0,0,0,t=t||1,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new yg;i.setAttribute("position",new ag(e,3)),i.setAttribute("color",new ag([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));var n=new jx({vertexColors:!0,toneMapped:!1});Zx.call(this,i,n)}SS.prototype=Object.create($m.prototype),SS.prototype.constructor=SS,SS.prototype.setDirection=function(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{MS.set(t.z,0,-t.x).normalize();var e=Math.acos(t.y);this.quaternion.setFromAxisAngle(MS,e)}},SS.prototype.setLength=function(t,e,i){void 0===e&&(e=.2*t),void 0===i&&(i=.2*e),this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()},SS.prototype.setColor=function(t){this.line.material.color.set(t),this.cone.material.color.set(t)},SS.prototype.copy=function(t){return $m.prototype.copy.call(this,t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this},SS.prototype.clone=function(){return(new this.constructor).copy(this)},ES.prototype=Object.create(Zx.prototype),ES.prototype.constructor=ES;var LS,AS,DS,PS,CS=Math.pow(2,8),OS=[.125,.215,.35,.446,.526,.582],kS=5+OS.length,RS=20,IS={[sm]:0,[om]:1,[am]:2,3004:3,3005:4,3006:5,3007:6},YS=new YT,FS=(LS=RS,AS=new Float32Array(LS),DS=new Lm(0,1,0),(PS=new Tw({defines:{n:LS},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:AS},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:DS},inputEncoding:{value:IS[3e3]},outputEncoding:{value:IS[3e3]}},vertexShader:oE(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform int samples;\nuniform float weights[n];\nuniform bool latitudinal;\nuniform float dTheta;\nuniform float mipInt;\nuniform vec3 poleAxis;\n\n${aE()}\n\n#define ENVMAP_TYPE_CUBE_UV\n#include <cube_uv_reflection_fragment>\n\nvec3 getSample(float theta, vec3 axis) {\n\tfloat cosTheta = cos(theta);\n\t// Rodrigues' axis-angle rotation\n\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t+ cross(axis, vOutputDirection) * sin(theta)\n\t\t+ axis * dot(axis, vOutputDirection) * (1.0 - cosTheta);\n\treturn bilinearCubeUV(envMap, sampleDirection, mipInt);\n}\n\nvoid main() {\n\tvec3 axis = latitudinal ? poleAxis : cross(poleAxis, vOutputDirection);\n\tif (all(equal(axis, vec3(0.0))))\n\t\taxis = vec3(vOutputDirection.z, 0.0, - vOutputDirection.x);\n\taxis = normalize(axis);\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb += weights[0] * getSample(0.0, axis);\n\tfor (int i = 1; i < n; i++) {\n\t\tif (i >= samples)\n\t\t\tbreak;\n\t\tfloat theta = dTheta * float(i);\n\t\tgl_FragColor.rgb += weights[i] * getSample(-1.0 * theta, axis);\n\t\tgl_FragColor.rgb += weights[i] * getSample(theta, axis);\n\t}\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})).type="SphericalGaussianBlur",PS),NS=null,BS=null,{_lodPlanes:US,_sizeLods:jS,_sigmas:HS}=function(){for(var t=[],e=[],i=[],n=8,r=0;r<kS;r++){var s=Math.pow(2,n);e.push(s);var o=1/s;r>4?o=OS[r-8+4-1]:0==r&&(o=0),i.push(o);for(var a=1/(s-1),h=-a/2,u=1+a/2,l=[h,h,u,h,u,u,h,h,u,u,h,u],c=new Float32Array(108),d=new Float32Array(72),p=new Float32Array(36),f=0;f<6;f++){var m=f%3*2/3-1,v=f>2?0:-1,g=[m,v,0,m+2/3,v,0,m+2/3,v+1,0,m,v,0,m+2/3,v+1,0,m,v+1,0];c.set(g,18*f),d.set(l,12*f);var y=[f,f,f,f,f,f];p.set(y,6*f)}var _=new yg;_.setAttribute("position",new $v(c,3)),_.setAttribute("uv",new $v(d,2)),_.setAttribute("faceIndex",new $v(p,1)),t.push(_),n>4&&n--}return{_lodPlanes:t,_sizeLods:e,_sigmas:i}}(),zS=null,WS=null,GS=null,VS=(1+Math.sqrt(5))/2,XS=1/VS,qS=[new Lm(1,1,1),new Lm(-1,1,1),new Lm(1,1,-1),new Lm(-1,1,-1),new Lm(0,VS,XS),new Lm(0,VS,-XS),new Lm(XS,0,VS),new Lm(-XS,0,VS),new Lm(VS,XS,0),new Lm(-VS,XS,0)];function JS(t){WS=t,QS(FS)}function ZS(t){var e={magFilter:Nf,minFilter:Nf,generateMipmaps:!1,type:t?t.type:zf,format:t?t.format:1023,encoding:t?t.encoding:am,depthBuffer:!1,stencilBuffer:!1},i=$S(e);return i.depthBuffer=!t,zS=$S(e),i}function KS(t){zS.dispose(),WS.setRenderTarget(GS),t.scissorTest=!1,t.setSize(t.width,t.height)}function QS(t){var e=new tv;e.add(new Yg(US[0],t)),WS.compile(e,YS)}function $S(t){var e=new wm(3*CS,3*CS,t);return e.texture.mapping=Rf,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function tE(t,e,i,n,r){t.viewport.set(e,i,n,r),t.scissor.set(e,i,n,r)}function eE(t){var e=WS.autoClear;WS.autoClear=!1;for(var i=1;i<kS;i++){iE(t,i-1,i,Math.sqrt(HS[i]*HS[i]-HS[i-1]*HS[i-1]),qS[(i-1)%qS.length])}WS.autoClear=e}function iE(t,e,i,n,r){nE(t,zS,e,i,n,"latitudinal",r),nE(zS,t,i,i,n,"longitudinal",r)}function nE(t,e,i,n,r,s,o){"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");var a=new tv;a.add(new Yg(US[n],FS));var h=FS.uniforms,u=jS[i]-1,l=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,c=r/l,d=isFinite(r)?1+Math.floor(3*c):RS;d>RS&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${d} samples when the maximum is set to 20`);for(var p=[],f=0,m=0;m<RS;++m){var v=m/c,g=Math.exp(-v*v/2);p.push(g),0==m?f+=g:m<d&&(f+=2*g)}for(m=0;m<p.length;m++)p[m]=p[m]/f;h.envMap.value=t.texture,h.samples.value=d,h.weights.value=p,h.latitudinal.value="latitudinal"===s,o&&(h.poleAxis.value=o),h.dTheta.value=l,h.mipInt.value=8-i,h.inputEncoding.value=IS[t.texture.encoding],h.outputEncoding.value=IS[t.texture.encoding];var y=jS[n];tE(e,v=3*Math.max(0,CS-2*y),(0===n?0:2*CS)+2*y*(n>4?n-8+4:0),3*y,2*y),WS.setRenderTarget(e),WS.render(a,YS)}function rE(){var t=new Tw({uniforms:{envMap:{value:null},texelSize:{value:new vm(1,1)},inputEncoding:{value:IS[3e3]},outputEncoding:{value:IS[3e3]}},vertexShader:oE(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform vec2 texelSize;\n\n${aE()}\n\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tvec3 outputDirection = normalize(vOutputDirection);\n\tvec2 uv;\n\tuv.y = asin(clamp(outputDirection.y, -1.0, 1.0)) * RECIPROCAL_PI + 0.5;\n\tuv.x = atan(outputDirection.z, outputDirection.x) * RECIPROCAL_PI2 + 0.5;\n\tvec2 f = fract(uv / texelSize - 0.5);\n\tuv -= f * texelSize;\n\tvec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x += texelSize.x;\n\tvec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.y += texelSize.y;\n\tvec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tuv.x -= texelSize.x;\n\tvec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\n\tvec3 tm = mix(tl, tr, f.x);\n\tvec3 bm = mix(bl, br, f.x);\n\tgl_FragColor.rgb = mix(tm, bm, f.y);\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1});return t.type="EquirectangularToCubeUV",t}function sE(){var t=new Tw({uniforms:{envMap:{value:null},inputEncoding:{value:IS[3e3]},outputEncoding:{value:IS[3e3]}},vertexShader:oE(),fragmentShader:`\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform samplerCube envMap;\n\n${aE()}\n\nvoid main() {\n\tgl_FragColor = vec4(0.0);\n\tgl_FragColor.rgb = envMapTexelToLinear(textureCube(envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ))).rgb;\n\tgl_FragColor = linearToOutputTexel(gl_FragColor);\n}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1});return t.type="CubemapToCubeUV",t}function oE(){return"\nprecision mediump float;\nprecision mediump int;\nattribute vec3 position;\nattribute vec2 uv;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nvec3 getDirection(vec2 uv, float face) {\n\tuv = 2.0 * uv - 1.0;\n\tvec3 direction = vec3(uv, 1.0);\n\tif (face == 0.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 1.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.z *= -1.0;\n\t} else if (face == 3.0) {\n\t\tdirection = direction.zyx;\n\t\tdirection.x *= -1.0;\n\t} else if (face == 4.0) {\n\t\tdirection = direction.xzy;\n\t\tdirection.y *= -1.0;\n\t} else if (face == 5.0) {\n\t\tdirection.xz *= -1.0;\n\t}\n\treturn direction;\n}\nvoid main() {\n\tvOutputDirection = getDirection(uv, faceIndex);\n\tgl_Position = vec4( position, 1.0 );\n}\n\t"}function aE(){return"\nuniform int inputEncoding;\nuniform int outputEncoding;\n\n#include <encodings_pars_fragment>\n\nvec4 inputTexelToLinear(vec4 value){\n\tif(inputEncoding == 0){\n\t\treturn value;\n\t}else if(inputEncoding == 1){\n\t\treturn sRGBToLinear(value);\n\t}else if(inputEncoding == 2){\n\t\treturn RGBEToLinear(value);\n\t}else if(inputEncoding == 3){\n\t\treturn RGBMToLinear(value, 7.0);\n\t}else if(inputEncoding == 4){\n\t\treturn RGBMToLinear(value, 16.0);\n\t}else if(inputEncoding == 5){\n\t\treturn RGBDToLinear(value, 256.0);\n\t}else{\n\t\treturn GammaToLinear(value, 2.2);\n\t}\n}\n\nvec4 linearToOutputTexel(vec4 value){\n\tif(outputEncoding == 0){\n\t\treturn value;\n\t}else if(outputEncoding == 1){\n\t\treturn LinearTosRGB(value);\n\t}else if(outputEncoding == 2){\n\t\treturn LinearToRGBE(value);\n\t}else if(outputEncoding == 3){\n\t\treturn LinearToRGBM(value, 7.0);\n\t}else if(outputEncoding == 4){\n\t\treturn LinearToRGBM(value, 16.0);\n\t}else if(outputEncoding == 5){\n\t\treturn LinearToRGBD(value, 256.0);\n\t}else{\n\t\treturn LinearToGamma(value, 2.2);\n\t}\n}\n\nvec4 envMapTexelToLinear(vec4 color) {\n\treturn inputTexelToLinear(color);\n}\n\t"}JS.prototype={constructor:JS,fromScene:function(t,e=0,i=.1,n=100){GS=WS.getRenderTarget();var r=ZS();return function(t,e,i,n){var r=new Zg(90,1,e,i),s=[1,1,1,1,-1,1],o=[1,1,-1,-1,-1,1],a=WS.outputEncoding,h=WS.toneMapping,u=WS.toneMappingExposure,l=WS.getClearColor(),c=WS.getClearAlpha();WS.toneMapping=1,WS.toneMappingExposure=1,WS.outputEncoding=sm,t.scale.z*=-1;var d=t.background;if(d&&d.isColor){d.convertSRGBToLinear();var p=Math.max(d.r,d.g,d.b),f=Math.min(Math.max(Math.ceil(Math.log2(p)),-128),127);d=d.multiplyScalar(Math.pow(2,-f));var m=(f+128)/255;WS.setClearColor(d,m),t.background=null}for(var v=0;v<6;v++){var g=v%3;0==g?(r.up.set(0,s[v],0),r.lookAt(o[v],0,0)):1==g?(r.up.set(0,0,s[v]),r.lookAt(0,o[v],0)):(r.up.set(0,s[v],0),r.lookAt(0,0,o[v])),tE(n,g*CS,v>2?CS:0,CS,CS),WS.setRenderTarget(n),WS.render(t,r)}WS.toneMapping=h,WS.toneMappingExposure=u,WS.outputEncoding=a,WS.setClearColor(l,c),t.scale.z*=-1}(t,i,n,r),e>0&&iE(r,0,0,e),eE(r),KS(r),r},fromEquirectangular:function(t){return t.magFilter=Nf,t.minFilter=Nf,t.generateMipmaps=!1,this.fromCubemap(t)},fromCubemap:function(t){GS=WS.getRenderTarget();var e=ZS(t);return function(t,e){var i=new tv;t.isCubeTexture?null==BS&&(BS=sE()):null==NS&&(NS=rE());var n=t.isCubeTexture?BS:NS;i.add(new Yg(US[0],n));var r=n.uniforms;r.envMap.value=t,t.isCubeTexture||r.texelSize.value.set(1/t.image.width,1/t.image.height);r.inputEncoding.value=IS[t.encoding],r.outputEncoding.value=IS[t.encoding],tE(e,0,0,3*CS,2*CS),WS.setRenderTarget(e),WS.render(i,YS)}(t,e),eE(e),KS(e),e},compileCubemapShader:function(){null==BS&&QS(BS=sE())},compileEquirectangularShader:function(){null==NS&&QS(NS=rE())},dispose:function(){FS.dispose(),null!=BS&&BS.dispose(),null!=NS&&NS.dispose();for(var t=0;t<US.length;t++)US[t].dispose()}};function hE(t){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),fT.call(this,t),this.type="catmullrom"}oT.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(oT.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Object.assign(ET.prototype,{createPointsGeometry:function(t){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getPoints(t);return this.createGeometry(e)},createSpacedPointsGeometry:function(t){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getSpacedPoints(t);return this.createGeometry(e)},createGeometry:function(t){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var e=new zg,i=0,n=t.length;i<n;i++){var r=t[i];e.vertices.push(new Lm(r.x,r.y,r.z||0))}return e}}),Object.assign(LT.prototype,{fromPoints:function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)}}),Object.create(fT.prototype),Object.create(fT.prototype),hE.prototype=Object.create(fT.prototype),Object.assign(hE.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),hS.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},iS.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Object.assign(Kw.prototype,{extractUrlBase:function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),HT(t)}}),Kw.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},Object.assign(XT.prototype,{setTexturePath:function(t){return console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath()."),this.setResourcePath(t)}}),Object.assign(GM.prototype,{center:function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},size:function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)}}),Object.assign(fv.prototype,{center:function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionSphere:function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},size:function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)}}),ny.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},qM.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Object.assign(mm,{random16:function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},nearestPowerOfTwo:function(t){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),mm.floorPowerOfTwo(t)},nextPowerOfTwo:function(t){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),mm.ceilPowerOfTwo(t)}}),Object.assign(gm.prototype,{flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},multiplyVector3:function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBufferAttribute:function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}}),Object.assign(Im.prototype,{extractPosition:function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},getPosition:function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Lm).setFromMatrixColumn(this,3)},setRotationFromQuaternion:function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector4:function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},crossVector:function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBufferAttribute:function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(t,e,i,n,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,n,i,r,s)}}),Dv.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},Mm.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},Object.assign(Sv.prototype,{isIntersectionBox:function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionPlane:function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},isIntersectionSphere:function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)}}),Object.assign(Uv.prototype,{area:function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},barycoordFromPoint:function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},midpoint:function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},normal:function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},plane:function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)}}),Object.assign(Uv,{barycoordFromPoint:function(t,e,i,n,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),Uv.getBarycoord(t,e,i,n,r)},normal:function(t,e,i,n){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),Uv.getNormal(t,e,i,n)}}),Object.assign(AT.prototype,{extractAllPoints:function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},extrude:function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new $b(this,t)},makeGeometry:function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new cw(this,t)}}),Object.assign(vm.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(Lm.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},getScaleFromMatrix:function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},getColumnFromMatrix:function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},applyProjection:function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},fromAttribute:function(t,e,i){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(bm.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},lengthManhattan:function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(zg.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")},applyMatrix:function(t){return console.warn("THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)}}),Object.assign($m.prototype,{getChildByName:function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},applyMatrix:function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)}}),Object.defineProperties($m.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.assign(Yg.prototype,{setDrawMode:function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}),Object.defineProperties(Yg.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),Object.defineProperties(Px.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(Rx.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Cx.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Object.defineProperty(oT.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(t){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=t}}),Zg.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(DT.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties($v.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===lm},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(lm)}}}),Object.assign($v.prototype,{setDynamic:function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?lm:um),this},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},setArray:function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(yg.prototype,{addIndex:function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},addAttribute:function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new $v(arguments[1],arguments[2])))},addDrawCall:function(t,e,i){void 0!==i&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},removeAttribute:function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},applyMatrix:function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)}}),Object.defineProperties(yg.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.defineProperties(jM.prototype,{linePrecision:{get:function(){return console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold},set:function(t){console.warn("THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead."),this.params.Line.threshold=t}}}),Object.defineProperties(ux.prototype,{dynamic:{get:function(){return console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.usage===lm},set:function(t){console.warn("THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead."),this.setUsage(t)}}}),Object.assign(ux.prototype,{setDynamic:function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?lm:um),this},setArray:function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")}}),Object.assign(tw.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}}),Object.defineProperties(BM.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(Zv.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new Wv}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Ew.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(qg.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),Object.assign(ox.prototype,{clearTarget:function(t,e,i,n){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,i,n)},animate:function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},getMaxAnisotropy:function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},getPrecision:function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},resetGLState:function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()}}),Object.defineProperties(ox.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?om:sm}}}),Object.defineProperties($_.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(wm.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Object.defineProperties(gM.prototype,{load:{value:function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var e=this;return(new rM).load(t,(function(t){e.setBuffer(t)})),this}},startTime:{set:function(){console.warn("THREE.Audio: .startTime is now .play( delay ).")}}}),TM.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},Qg.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)};ym.crossOrigin=void 0,ym.loadTexture=function(t,e,i,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var r=new sT;r.setCrossOrigin(this.crossOrigin);var s=r.load(t,i,void 0,n);return e&&(s.mapping=e),s},ym.loadTextureCube=function(t,e,i,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var r=new rT;r.setCrossOrigin(this.crossOrigin);var s=r.load(t,i,void 0,n);return e&&(s.mapping=e),s},ym.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},ym.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"115"}}));var uE=i(17583),lE=i(33915),cE=i.n(lE);window.Promise||(window.Promise=uE.Polyfill),Object.assign||(Object.assign=cE());var dE="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};if(Date.now&&Date.prototype.getTime||(Date.now=function(){return(new Date).getTime()}),!dE.performance||!dE.performance.now){var pE=Date.now();dE.performance||(dE.performance={}),dE.performance.now=function(){return Date.now()-pE}}for(var fE=Date.now(),mE=["ms","moz","webkit","o"],vE=0;vE<mE.length&&!dE.requestAnimationFrame;++vE){var gE=mE[vE];dE.requestAnimationFrame=dE[gE+"RequestAnimationFrame"],dE.cancelAnimationFrame=dE[gE+"CancelAnimationFrame"]||dE[gE+"CancelRequestAnimationFrame"]}dE.requestAnimationFrame||(dE.requestAnimationFrame=function(t){if("function"!=typeof t)throw new TypeError(t+"is not a function");var e=Date.now(),i=16+fE-e;return i<0&&(i=0),fE=e,setTimeout((function(){fE=Date.now(),t(performance.now())}),i)}),dE.cancelAnimationFrame||(dE.cancelAnimationFrame=function(t){return clearTimeout(t)}),Math.sign||(Math.sign=function(t){return 0===(t=Number(t))||isNaN(t)?t:t>0?1:-1}),Number.isInteger||(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t}),window.ArrayBuffer||(window.ArrayBuffer=Array),window.Float32Array||(window.Float32Array=Array),window.Uint32Array||(window.Uint32Array=Array),window.Uint16Array||(window.Uint16Array=Array),window.Uint8Array||(window.Uint8Array=Array),window.Int32Array||(window.Int32Array=Array);var yE=/iPhone/i,_E=/iPod/i,xE=/iPad/i,bE=/\biOS-universal(?:.+)Mac\b/i,wE=/\bAndroid(?:.+)Mobile\b/i,TE=/Android/i,ME=/(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i,SE=/Silk/i,EE=/Windows Phone/i,LE=/\bWindows(?:.+)ARM\b/i,AE=/BlackBerry/i,DE=/BB10/i,PE=/Opera Mini/i,CE=/\b(CriOS|Chrome)(?:.+)Mobile/i,OE=/Mobile(?:.+)Firefox\b/i,kE=function(t){return void 0!==t&&"MacIntel"===t.platform&&"number"==typeof t.maxTouchPoints&&t.maxTouchPoints>1&&"undefined"==typeof MSStream};var RE=function(t){var e={userAgent:"",platform:"",maxTouchPoints:0};t||"undefined"==typeof navigator?"string"==typeof t?e.userAgent=t:t&&t.userAgent&&(e={userAgent:t.userAgent,platform:t.platform,maxTouchPoints:t.maxTouchPoints||0}):e={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0};var i=e.userAgent,n=i.split("[FBAN");void 0!==n[1]&&(i=n[0]),void 0!==(n=i.split("Twitter"))[1]&&(i=n[0]);var r=function(t){return function(e){return e.test(t)}}(i),s={apple:{phone:r(yE)&&!r(EE),ipod:r(_E),tablet:!r(yE)&&(r(xE)||kE(e))&&!r(EE),universal:r(bE),device:(r(yE)||r(_E)||r(xE)||r(bE)||kE(e))&&!r(EE)},amazon:{phone:r(ME),tablet:!r(ME)&&r(SE),device:r(ME)||r(SE)},android:{phone:!r(EE)&&r(ME)||!r(EE)&&r(wE),tablet:!r(EE)&&!r(ME)&&!r(wE)&&(r(SE)||r(TE)),device:!r(EE)&&(r(ME)||r(SE)||r(wE)||r(TE))||r(/\bokhttp\b/i)},windows:{phone:r(EE),tablet:r(LE),device:r(EE)||r(LE)},other:{blackberry:r(AE),blackberry10:r(DE),opera:r(PE),firefox:r(OE),chrome:r(CE),device:r(AE)||r(DE)||r(PE)||r(OE)||r(CE)},any:!1,phone:!1,tablet:!1};return s.any=s.apple.device||s.android.device||s.windows.device||s.other.device,s.phone=s.apple.phone||s.android.phone||s.windows.phone,s.tablet=s.apple.tablet||s.android.tablet||s.windows.tablet,s}(window.navigator);var IE={MIPMAP_TEXTURES:1,ANISOTROPIC_LEVEL:0,RESOLUTION:1,FILTER_RESOLUTION:1,SPRITE_MAX_TEXTURES:function(t){var e=!0;if(RE.tablet||RE.phone){if(e=!1,RE.apple.device){var i=navigator.userAgent.match(/OS (\d+)_(\d+)?/);if(i)parseInt(i[1],10)>=11&&(e=!0)}if(RE.android.device){var n=navigator.userAgent.match(/Android\s([0-9.]*)/);if(n)parseInt(n[1],10)>=7&&(e=!0)}}return e?t:4}(32),SPRITE_BATCH_SIZE:4096,RENDER_OPTIONS:{view:null,antialias:!1,forceFXAA:!1,autoDensity:!1,transparent:!1,backgroundColor:0,clearBeforeRender:!0,preserveDrawingBuffer:!1,width:800,height:600,legacy:!1},GC_MODE:0,GC_MAX_IDLE:3600,GC_MAX_CHECK_COUNT:600,WRAP_MODE:33071,SCALE_MODE:1,PRECISION_VERTEX:"highp",PRECISION_FRAGMENT:RE.apple.device?"highp":"mediump",CAN_UPLOAD_SAME_BUFFER:!RE.apple.device,CREATE_IMAGE_BITMAP:!1,ROUND_PIXELS:!1},YE=i(17168),FE=i.n(YE),NE=i(8799),BE=i.n(NE);const UE=require("url");var jE,HE,zE,WE,GE,VE,XE,qE,JE,ZE,KE,QE,$E,tL,eL=i.n(UE);!function(t){t[t.WEBGL_LEGACY=0]="WEBGL_LEGACY",t[t.WEBGL=1]="WEBGL",t[t.WEBGL2=2]="WEBGL2"}(jE||(jE={})),function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.WEBGL=1]="WEBGL",t[t.CANVAS=2]="CANVAS"}(HE||(HE={})),function(t){t[t.NORMAL=0]="NORMAL",t[t.ADD=1]="ADD",t[t.MULTIPLY=2]="MULTIPLY",t[t.SCREEN=3]="SCREEN",t[t.OVERLAY=4]="OVERLAY",t[t.DARKEN=5]="DARKEN",t[t.LIGHTEN=6]="LIGHTEN",t[t.COLOR_DODGE=7]="COLOR_DODGE",t[t.COLOR_BURN=8]="COLOR_BURN",t[t.HARD_LIGHT=9]="HARD_LIGHT",t[t.SOFT_LIGHT=10]="SOFT_LIGHT",t[t.DIFFERENCE=11]="DIFFERENCE",t[t.EXCLUSION=12]="EXCLUSION",t[t.HUE=13]="HUE",t[t.SATURATION=14]="SATURATION",t[t.COLOR=15]="COLOR",t[t.LUMINOSITY=16]="LUMINOSITY",t[t.NORMAL_NPM=17]="NORMAL_NPM",t[t.ADD_NPM=18]="ADD_NPM",t[t.SCREEN_NPM=19]="SCREEN_NPM",t[t.NONE=20]="NONE",t[t.SRC_OVER=0]="SRC_OVER",t[t.SRC_IN=21]="SRC_IN",t[t.SRC_OUT=22]="SRC_OUT",t[t.SRC_ATOP=23]="SRC_ATOP",t[t.DST_OVER=24]="DST_OVER",t[t.DST_IN=25]="DST_IN",t[t.DST_OUT=26]="DST_OUT",t[t.DST_ATOP=27]="DST_ATOP",t[t.ERASE=26]="ERASE",t[t.SUBTRACT=28]="SUBTRACT",t[t.XOR=29]="XOR"}(zE||(zE={})),function(t){t[t.POINTS=0]="POINTS",t[t.LINES=1]="LINES",t[t.LINE_LOOP=2]="LINE_LOOP",t[t.LINE_STRIP=3]="LINE_STRIP",t[t.TRIANGLES=4]="TRIANGLES",t[t.TRIANGLE_STRIP=5]="TRIANGLE_STRIP",t[t.TRIANGLE_FAN=6]="TRIANGLE_FAN"}(WE||(WE={})),function(t){t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL"}(GE||(GE={})),function(t){t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z"}(VE||(VE={})),function(t){t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.FLOAT=5126]="FLOAT",t[t.HALF_FLOAT=36193]="HALF_FLOAT"}(XE||(XE={})),function(t){t[t.NEAREST=0]="NEAREST",t[t.LINEAR=1]="LINEAR"}(qE||(qE={})),function(t){t[t.CLAMP=33071]="CLAMP",t[t.REPEAT=10497]="REPEAT",t[t.MIRRORED_REPEAT=33648]="MIRRORED_REPEAT"}(JE||(JE={})),function(t){t[t.OFF=0]="OFF",t[t.POW2=1]="POW2",t[t.ON=2]="ON"}(ZE||(ZE={})),function(t){t[t.NPM=0]="NPM",t[t.UNPACK=1]="UNPACK",t[t.PMA=2]="PMA",t[t.NO_PREMULTIPLIED_ALPHA=0]="NO_PREMULTIPLIED_ALPHA",t[t.PREMULTIPLY_ON_UPLOAD=1]="PREMULTIPLY_ON_UPLOAD",t[t.PREMULTIPLY_ALPHA=2]="PREMULTIPLY_ALPHA"}(KE||(KE={})),function(t){t[t.AUTO=0]="AUTO",t[t.MANUAL=1]="MANUAL"}(QE||(QE={})),function(t){t.LOW="lowp",t.MEDIUM="mediump",t.HIGH="highp"}($E||($E={})),function(t){t[t.NONE=0]="NONE",t[t.SCISSOR=1]="SCISSOR",t[t.STENCIL=2]="STENCIL",t[t.SPRITE=3]="SPRITE"}(tL||(tL={})),IE.RETINA_PREFIX=/@([0-9\.]+)x/,IE.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT=!0;var iL,nL=!1;function rL(t,e){return(e=e||[])[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255,e}function sL(t){var e=t.toString(16);return"#"+(e="000000".substr(0,6-e.length)+e)}var oL=function(){for(var t=[],e=[],i=0;i<32;i++)t[i]=i,e[i]=i;t[zE.NORMAL_NPM]=zE.NORMAL,t[zE.ADD_NPM]=zE.ADD,t[zE.SCREEN_NPM]=zE.SCREEN,e[zE.NORMAL]=zE.NORMAL_NPM,e[zE.ADD]=zE.ADD_NPM,e[zE.SCREEN]=zE.SCREEN_NPM;var n=[];return n.push(e),n.push(t),n}();function aL(t,e){return oL[e?1:0][t]}function hL(t,e){if(1===e)return(255*e<<24)+t;if(0===e)return 0;var i=t>>16&255,n=t>>8&255,r=255&t;return(255*e<<24)+((i=i*e+.5|0)<<16)+((n=n*e+.5|0)<<8)+(r=r*e+.5|0)}function uL(t,e,i,n){return(i=i||new Float32Array(4))[0]=(t>>16&255)/255,i[1]=(t>>8&255)/255,i[2]=(255&t)/255,(n||void 0===n)&&(i[0]*=e,i[1]*=e,i[2]*=e),i[3]=e,i}Float32Array,Uint32Array,Int32Array,Uint8Array;function lL(t){return t+=0===t?1:0,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)+1}function cL(t){return!(t&t-1||!t)}function dL(t){var e=(t>65535?1:0)<<4,i=((t>>>=e)>255?1:0)<<3;return e|=i,e|=i=((t>>>=i)>15?1:0)<<2,(e|=i=((t>>>=i)>3?1:0)<<1)|(t>>>=i)>>1}function pL(t,e,i){var n,r=t.length;if(!(e>=r||0===i)){var s=r-(i=e+i>r?r-e:i);for(n=e;n<s;++n)t[n]=t[n+i];t.length=s}}function fL(t){return 0===t?0:t<0?-1:1}var mL=0;function vL(){return++mL}var gL={};function yL(t,e,i){if(void 0===i&&(i=3),!gL[e]){var n=(new Error).stack;void 0===n?console.warn("PixiJS Deprecation Warning: ",e+"\nDeprecated since v"+t):(n=n.split("\n").splice(i).join("\n"),console.groupCollapsed?(console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s","color:#614108;background:#fffbe6","font-weight:normal;color:#614108;background:#fffbe6",e+"\nDeprecated since v"+t),console.warn(n),console.groupEnd()):(console.warn("PixiJS Deprecation Warning: ",e+"\nDeprecated since v"+t),console.warn(n))),gL[e]=!0}}var _L={},xL=Object.create(null),bL=Object.create(null);var wL=function(){function t(t,e,i){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.resolution=i||IE.RESOLUTION,this.resize(t,e)}return t.prototype.clear=function(){this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.canvas.width,this.canvas.height)},t.prototype.resize=function(t,e){this.canvas.width=t*this.resolution,this.canvas.height=e*this.resolution},t.prototype.destroy=function(){this.context=null,this.canvas=null},Object.defineProperty(t.prototype,"width",{get:function(){return this.canvas.width},set:function(t){this.canvas.width=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.canvas.height},set:function(t){this.canvas.height=t},enumerable:!0,configurable:!0}),t}();var TL;function ML(t,e){var i=IE.RETINA_PREFIX.exec(t);return i?parseFloat(i[1]):void 0!==e?e:1}var SL,EL=function(){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.x=t,this.y=e}return t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.copyFrom=function(t){return this.set(t.x,t.y),this},t.prototype.copyTo=function(t){return t.set(this.x,this.y),t},t.prototype.equals=function(t){return t.x===this.x&&t.y===this.y},t.prototype.set=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x=t,this.y=e,this},t}(),LL=function(){function t(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=0),this._x=i,this._y=n,this.cb=t,this.scope=e}return t.prototype.clone=function(e,i){return void 0===e&&(e=this.cb),void 0===i&&(i=this.scope),new t(e,i,this._x,this._y)},t.prototype.set=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this._x===t&&this._y===e||(this._x=t,this._y=e,this.cb.call(this.scope)),this},t.prototype.copyFrom=function(t){return this._x===t.x&&this._y===t.y||(this._x=t.x,this._y=t.y,this.cb.call(this.scope)),this},t.prototype.copyTo=function(t){return t.set(this._x,this._y),t},t.prototype.equals=function(t){return t.x===this._x&&t.y===this._y},Object.defineProperty(t.prototype,"x",{get:function(){return this._x},set:function(t){this._x!==t&&(this._x=t,this.cb.call(this.scope))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"y",{get:function(){return this._y},set:function(t){this._y!==t&&(this._y=t,this.cb.call(this.scope))},enumerable:!0,configurable:!0}),t}(),AL=2*Math.PI,DL=180/Math.PI,PL=Math.PI/180;!function(t){t[t.POLY=0]="POLY",t[t.RECT=1]="RECT",t[t.CIRC=2]="CIRC",t[t.ELIP=3]="ELIP",t[t.RREC=4]="RREC"}(SL||(SL={}));var CL=function(){function t(t,e,i,n,r,s){void 0===t&&(t=1),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=1),void 0===r&&(r=0),void 0===s&&(s=0),this.array=null,this.a=t,this.b=e,this.c=i,this.d=n,this.tx=r,this.ty=s}return t.prototype.fromArray=function(t){this.a=t[0],this.b=t[1],this.c=t[3],this.d=t[4],this.tx=t[2],this.ty=t[5]},t.prototype.set=function(t,e,i,n,r,s){return this.a=t,this.b=e,this.c=i,this.d=n,this.tx=r,this.ty=s,this},t.prototype.toArray=function(t,e){this.array||(this.array=new Float32Array(9));var i=e||this.array;return t?(i[0]=this.a,i[1]=this.b,i[2]=0,i[3]=this.c,i[4]=this.d,i[5]=0,i[6]=this.tx,i[7]=this.ty,i[8]=1):(i[0]=this.a,i[1]=this.c,i[2]=this.tx,i[3]=this.b,i[4]=this.d,i[5]=this.ty,i[6]=0,i[7]=0,i[8]=1),i},t.prototype.apply=function(t,e){e=e||new EL;var i=t.x,n=t.y;return e.x=this.a*i+this.c*n+this.tx,e.y=this.b*i+this.d*n+this.ty,e},t.prototype.applyInverse=function(t,e){e=e||new EL;var i=1/(this.a*this.d+this.c*-this.b),n=t.x,r=t.y;return e.x=this.d*i*n+-this.c*i*r+(this.ty*this.c-this.tx*this.d)*i,e.y=this.a*i*r+-this.b*i*n+(-this.ty*this.a+this.tx*this.b)*i,e},t.prototype.translate=function(t,e){return this.tx+=t,this.ty+=e,this},t.prototype.scale=function(t,e){return this.a*=t,this.d*=e,this.c*=t,this.b*=e,this.tx*=t,this.ty*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),i=Math.sin(t),n=this.a,r=this.c,s=this.tx;return this.a=n*e-this.b*i,this.b=n*i+this.b*e,this.c=r*e-this.d*i,this.d=r*i+this.d*e,this.tx=s*e-this.ty*i,this.ty=s*i+this.ty*e,this},t.prototype.append=function(t){var e=this.a,i=this.b,n=this.c,r=this.d;return this.a=t.a*e+t.b*n,this.b=t.a*i+t.b*r,this.c=t.c*e+t.d*n,this.d=t.c*i+t.d*r,this.tx=t.tx*e+t.ty*n+this.tx,this.ty=t.tx*i+t.ty*r+this.ty,this},t.prototype.setTransform=function(t,e,i,n,r,s,o,a,h){return this.a=Math.cos(o+h)*r,this.b=Math.sin(o+h)*r,this.c=-Math.sin(o-a)*s,this.d=Math.cos(o-a)*s,this.tx=t-(i*this.a+n*this.c),this.ty=e-(i*this.b+n*this.d),this},t.prototype.prepend=function(t){var e=this.tx;if(1!==t.a||0!==t.b||0!==t.c||1!==t.d){var i=this.a,n=this.c;this.a=i*t.a+this.b*t.c,this.b=i*t.b+this.b*t.d,this.c=n*t.a+this.d*t.c,this.d=n*t.b+this.d*t.d}return this.tx=e*t.a+this.ty*t.c+t.tx,this.ty=e*t.b+this.ty*t.d+t.ty,this},t.prototype.decompose=function(t){var e=this.a,i=this.b,n=this.c,r=this.d,s=-Math.atan2(-n,r),o=Math.atan2(i,e),a=Math.abs(s+o);return a<1e-5||Math.abs(AL-a)<1e-5?(t.rotation=o,t.skew.x=t.skew.y=0):(t.rotation=0,t.skew.x=s,t.skew.y=o),t.scale.x=Math.sqrt(e*e+i*i),t.scale.y=Math.sqrt(n*n+r*r),t.position.x=this.tx,t.position.y=this.ty,t},t.prototype.invert=function(){var t=this.a,e=this.b,i=this.c,n=this.d,r=this.tx,s=t*n-e*i;return this.a=n/s,this.b=-e/s,this.c=-i/s,this.d=t/s,this.tx=(i*this.ty-n*r)/s,this.ty=-(t*this.ty-e*r)/s,this},t.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},t.prototype.clone=function(){var e=new t;return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},t.prototype.copyTo=function(t){return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},t.prototype.copyFrom=function(t){return this.a=t.a,this.b=t.b,this.c=t.c,this.d=t.d,this.tx=t.tx,this.ty=t.ty,this},Object.defineProperty(t,"IDENTITY",{get:function(){return new t},enumerable:!0,configurable:!0}),Object.defineProperty(t,"TEMP_MATRIX",{get:function(){return new t},enumerable:!0,configurable:!0}),t}(),OL=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],kL=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],RL=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],IL=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],YL=[],FL=[],NL=Math.sign;!function(){for(var t=0;t<16;t++){var e=[];YL.push(e);for(var i=0;i<16;i++)for(var n=NL(OL[t]*OL[i]+RL[t]*kL[i]),r=NL(kL[t]*OL[i]+IL[t]*kL[i]),s=NL(OL[t]*RL[i]+RL[t]*IL[i]),o=NL(kL[t]*RL[i]+IL[t]*IL[i]),a=0;a<16;a++)if(OL[a]===n&&kL[a]===r&&RL[a]===s&&IL[a]===o){e.push(a);break}}for(t=0;t<16;t++){var h=new CL;h.set(OL[t],kL[t],RL[t],IL[t],0,0),FL.push(h)}}();var BL={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MAIN_DIAGONAL:10,MIRROR_HORIZONTAL:12,REVERSE_DIAGONAL:14,uX:function(t){return OL[t]},uY:function(t){return kL[t]},vX:function(t){return RL[t]},vY:function(t){return IL[t]},inv:function(t){return 8&t?15&t:7&-t},add:function(t,e){return YL[t][e]},sub:function(t,e){return YL[t][BL.inv(e)]},rotate180:function(t){return 4^t},isVertical:function(t){return 2==(3&t)},byDirection:function(t,e){return 2*Math.abs(t)<=Math.abs(e)?e>=0?BL.S:BL.N:2*Math.abs(e)<=Math.abs(t)?t>0?BL.E:BL.W:e>0?t>0?BL.SE:BL.SW:t>0?BL.NE:BL.NW},matrixAppendRotationInv:function(t,e,i,n){void 0===i&&(i=0),void 0===n&&(n=0);var r=FL[BL.inv(e)];r.tx=i,r.ty=n,t.append(r)}},UL=function(){function t(){this.worldTransform=new CL,this.localTransform=new CL,this.position=new LL(this.onChange,this,0,0),this.scale=new LL(this.onChange,this,1,1),this.pivot=new LL(this.onChange,this,0,0),this.skew=new LL(this.updateSkew,this,0,0),this._rotation=0,this._cx=1,this._sx=0,this._cy=0,this._sy=1,this._localID=0,this._currentLocalID=0,this._worldID=0,this._parentID=0}return t.prototype.onChange=function(){this._localID++},t.prototype.updateSkew=function(){this._cx=Math.cos(this._rotation+this.skew.y),this._sx=Math.sin(this._rotation+this.skew.y),this._cy=-Math.sin(this._rotation-this.skew.x),this._sy=Math.cos(this._rotation-this.skew.x),this._localID++},t.prototype.updateLocalTransform=function(){var t=this.localTransform;this._localID!==this._currentLocalID&&(t.a=this._cx*this.scale.x,t.b=this._sx*this.scale.x,t.c=this._cy*this.scale.y,t.d=this._sy*this.scale.y,t.tx=this.position.x-(this.pivot.x*t.a+this.pivot.y*t.c),t.ty=this.position.y-(this.pivot.x*t.b+this.pivot.y*t.d),this._currentLocalID=this._localID,this._parentID=-1)},t.prototype.updateTransform=function(t){var e=this.localTransform;if(this._localID!==this._currentLocalID&&(e.a=this._cx*this.scale.x,e.b=this._sx*this.scale.x,e.c=this._cy*this.scale.y,e.d=this._sy*this.scale.y,e.tx=this.position.x-(this.pivot.x*e.a+this.pivot.y*e.c),e.ty=this.position.y-(this.pivot.x*e.b+this.pivot.y*e.d),this._currentLocalID=this._localID,this._parentID=-1),this._parentID!==t._worldID){var i=t.worldTransform,n=this.worldTransform;n.a=e.a*i.a+e.b*i.c,n.b=e.a*i.b+e.b*i.d,n.c=e.c*i.a+e.d*i.c,n.d=e.c*i.b+e.d*i.d,n.tx=e.tx*i.a+e.ty*i.c+i.tx,n.ty=e.tx*i.b+e.ty*i.d+i.ty,this._parentID=t._worldID,this._worldID++}},t.prototype.setFromMatrix=function(t){t.decompose(this),this._localID++},Object.defineProperty(t.prototype,"rotation",{get:function(){return this._rotation},set:function(t){this._rotation!==t&&(this._rotation=t,this.updateSkew())},enumerable:!0,configurable:!0}),t.IDENTITY=new t,t}(),jL=function(){function t(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.x=Number(t),this.y=Number(e),this.width=Number(i),this.height=Number(n),this.type=SL.RECT}return Object.defineProperty(t.prototype,"left",{get:function(){return this.x},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"right",{get:function(){return this.x+this.width},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"top",{get:function(){return this.y},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"bottom",{get:function(){return this.y+this.height},enumerable:!0,configurable:!0}),Object.defineProperty(t,"EMPTY",{get:function(){return new t(0,0,0,0)},enumerable:!0,configurable:!0}),t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copyFrom=function(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this},t.prototype.copyTo=function(t){return t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t},t.prototype.contains=function(t,e){return!(this.width<=0||this.height<=0)&&(t>=this.x&&t<this.x+this.width&&e>=this.y&&e<this.y+this.height)},t.prototype.pad=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=t),this.x-=t,this.y-=e,this.width+=2*t,this.height+=2*e,this},t.prototype.fit=function(t){var e=Math.max(this.x,t.x),i=Math.min(this.x+this.width,t.x+t.width),n=Math.max(this.y,t.y),r=Math.min(this.y+this.height,t.y+t.height);return this.x=e,this.width=Math.max(i-e,0),this.y=n,this.height=Math.max(r-n,0),this},t.prototype.ceil=function(t,e){void 0===t&&(t=1),void 0===e&&(e=.001);var i=Math.ceil((this.x+this.width-e)*t)/t,n=Math.ceil((this.y+this.height-e)*t)/t;return this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=i-this.x,this.height=n-this.y,this},t.prototype.enlarge=function(t){var e=Math.min(this.x,t.x),i=Math.max(this.x+this.width,t.x+t.width),n=Math.min(this.y,t.y),r=Math.max(this.y+this.height,t.y+t.height);return this.x=e,this.width=i-e,this.y=n,this.height=r-n,this},t}(),HL=function(){function t(t,e,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),this.x=t,this.y=e,this.radius=i,this.type=SL.CIRC}return t.prototype.clone=function(){return new t(this.x,this.y,this.radius)},t.prototype.contains=function(t,e){if(this.radius<=0)return!1;var i=this.radius*this.radius,n=this.x-t,r=this.y-e;return(n*=n)+(r*=r)<=i},t.prototype.getBounds=function(){return new jL(this.x-this.radius,this.y-this.radius,2*this.radius,2*this.radius)},t}(),zL=function(){function t(t,e,i,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.x=t,this.y=e,this.width=i,this.height=n,this.type=SL.ELIP}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;var i=(t-this.x)/this.width,n=(e-this.y)/this.height;return(i*=i)+(n*=n)<=1},t.prototype.getBounds=function(){return new jL(this.x-this.width,this.y-this.height,this.width,this.height)},t}(),WL=function(){function t(){for(var t=arguments,e=[],i=0;i<arguments.length;i++)e[i]=t[i];if(Array.isArray(e[0])&&(e=e[0]),e[0]instanceof EL){for(var n=[],r=0,s=(e=e).length;r<s;r++)n.push(e[r].x,e[r].y);e=n}this.points=e,this.type=SL.POLY,this.closeStroke=!0}return t.prototype.clone=function(){var e=new t(this.points.slice());return e.closeStroke=this.closeStroke,e},t.prototype.contains=function(t,e){for(var i=!1,n=this.points.length/2,r=0,s=n-1;r<n;s=r++){var o=this.points[2*r],a=this.points[2*r+1],h=this.points[2*s],u=this.points[2*s+1];a>e!=u>e&&t<(e-a)/(u-a)*(h-o)+o&&(i=!i)}return i},t}(),GL=function(){function t(t,e,i,n,r){void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),void 0===r&&(r=20),this.x=t,this.y=e,this.width=i,this.height=n,this.radius=r,this.type=SL.RREC}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height,this.radius)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){if(e>=this.y+this.radius&&e<=this.y+this.height-this.radius||t>=this.x+this.radius&&t<=this.x+this.width-this.radius)return!0;var i=t-(this.x+this.radius),n=e-(this.y+this.radius),r=this.radius*this.radius;if(i*i+n*n<=r)return!0;if((i=t-(this.x+this.width-this.radius))*i+n*n<=r)return!0;if(i*i+(n=e-(this.y+this.height-this.radius))*n<=r)return!0;if((i=t-(this.x+this.radius))*i+n*n<=r)return!0}return!1},t}();IE.SORTABLE_CHILDREN=!1;var VL=function(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.rect=null};VL.prototype.isEmpty=function(){return this.minX>this.maxX||this.minY>this.maxY},VL.prototype.clear=function(){this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},VL.prototype.getRectangle=function(t){return this.minX>this.maxX||this.minY>this.maxY?jL.EMPTY:((t=t||new jL(0,0,1,1)).x=this.minX,t.y=this.minY,t.width=this.maxX-this.minX,t.height=this.maxY-this.minY,t)},VL.prototype.addPoint=function(t){this.minX=Math.min(this.minX,t.x),this.maxX=Math.max(this.maxX,t.x),this.minY=Math.min(this.minY,t.y),this.maxY=Math.max(this.maxY,t.y)},VL.prototype.addQuad=function(t){var e=this.minX,i=this.minY,n=this.maxX,r=this.maxY,s=t[0],o=t[1];e=s<e?s:e,i=o<i?o:i,n=s>n?s:n,r=o>r?o:r,e=(s=t[2])<e?s:e,i=(o=t[3])<i?o:i,n=s>n?s:n,r=o>r?o:r,e=(s=t[4])<e?s:e,i=(o=t[5])<i?o:i,n=s>n?s:n,r=o>r?o:r,e=(s=t[6])<e?s:e,i=(o=t[7])<i?o:i,n=s>n?s:n,r=o>r?o:r,this.minX=e,this.minY=i,this.maxX=n,this.maxY=r},VL.prototype.addFrame=function(t,e,i,n,r){this.addFrameMatrix(t.worldTransform,e,i,n,r)},VL.prototype.addFrameMatrix=function(t,e,i,n,r){var s=t.a,o=t.b,a=t.c,h=t.d,u=t.tx,l=t.ty,c=this.minX,d=this.minY,p=this.maxX,f=this.maxY,m=s*e+a*i+u,v=o*e+h*i+l;c=m<c?m:c,d=v<d?v:d,p=m>p?m:p,f=v>f?v:f,c=(m=s*n+a*i+u)<c?m:c,d=(v=o*n+h*i+l)<d?v:d,p=m>p?m:p,f=v>f?v:f,c=(m=s*e+a*r+u)<c?m:c,d=(v=o*e+h*r+l)<d?v:d,p=m>p?m:p,f=v>f?v:f,c=(m=s*n+a*r+u)<c?m:c,d=(v=o*n+h*r+l)<d?v:d,p=m>p?m:p,f=v>f?v:f,this.minX=c,this.minY=d,this.maxX=p,this.maxY=f},VL.prototype.addVertexData=function(t,e,i){for(var n=this.minX,r=this.minY,s=this.maxX,o=this.maxY,a=e;a<i;a+=2){var h=t[a],u=t[a+1];n=h<n?h:n,r=u<r?u:r,s=h>s?h:s,o=u>o?u:o}this.minX=n,this.minY=r,this.maxX=s,this.maxY=o},VL.prototype.addVertices=function(t,e,i,n){this.addVerticesMatrix(t.worldTransform,e,i,n)},VL.prototype.addVerticesMatrix=function(t,e,i,n,r,s){var o=t.a,a=t.b,h=t.c,u=t.d,l=t.tx,c=t.ty;r=r||0,s=s||0;for(var d=this.minX,p=this.minY,f=this.maxX,m=this.maxY,v=i;v<n;v+=2){var g=e[v],y=e[v+1],_=o*g+h*y+l,x=u*y+a*g+c;d=Math.min(d,_-r),f=Math.max(f,_+r),p=Math.min(p,x-s),m=Math.max(m,x+s)}this.minX=d,this.minY=p,this.maxX=f,this.maxY=m},VL.prototype.addBounds=function(t){var e=this.minX,i=this.minY,n=this.maxX,r=this.maxY;this.minX=t.minX<e?t.minX:e,this.minY=t.minY<i?t.minY:i,this.maxX=t.maxX>n?t.maxX:n,this.maxY=t.maxY>r?t.maxY:r},VL.prototype.addBoundsMask=function(t,e){var i=t.minX>e.minX?t.minX:e.minX,n=t.minY>e.minY?t.minY:e.minY,r=t.maxX<e.maxX?t.maxX:e.maxX,s=t.maxY<e.maxY?t.maxY:e.maxY;if(i<=r&&n<=s){var o=this.minX,a=this.minY,h=this.maxX,u=this.maxY;this.minX=i<o?i:o,this.minY=n<a?n:a,this.maxX=r>h?r:h,this.maxY=s>u?s:u}},VL.prototype.addBoundsMatrix=function(t,e){this.addFrameMatrix(e,t.minX,t.minY,t.maxX,t.maxY)},VL.prototype.addBoundsArea=function(t,e){var i=t.minX>e.x?t.minX:e.x,n=t.minY>e.y?t.minY:e.y,r=t.maxX<e.x+e.width?t.maxX:e.x+e.width,s=t.maxY<e.y+e.height?t.maxY:e.y+e.height;if(i<=r&&n<=s){var o=this.minX,a=this.minY,h=this.maxX,u=this.maxY;this.minX=i<o?i:o,this.minY=n<a?n:a,this.maxX=r>h?r:h,this.maxY=s>u?s:u}},VL.prototype.pad=function(t,e){t=t||0,e=e||(0!==e?t:0),this.isEmpty()||(this.minX-=t,this.maxX+=t,this.minY-=e,this.maxY+=e)},VL.prototype.addFramePad=function(t,e,i,n,r,s){t-=r,e-=s,i+=r,n+=s,this.minX=this.minX<t?this.minX:t,this.maxX=this.maxX>i?this.maxX:i,this.minY=this.minY<e?this.minY:e,this.maxY=this.maxY>n?this.maxY:n};var XL=function(t){function e(){t.call(this),this.tempDisplayObjectParent=null,this.transform=new UL,this.alpha=1,this.visible=!0,this.renderable=!0,this.parent=null,this.worldAlpha=1,this._lastSortedIndex=0,this._zIndex=0,this.filterArea=null,this.filters=null,this._enabledFilters=null,this._bounds=new VL,this._boundsID=0,this._lastBoundsID=-1,this._boundsRect=null,this._localBoundsRect=null,this._mask=null,this._destroyed=!1,this.isSprite=!1,this.isMask=!1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={_tempDisplayObjectParent:{configurable:!0},x:{configurable:!0},y:{configurable:!0},worldTransform:{configurable:!0},localTransform:{configurable:!0},position:{configurable:!0},scale:{configurable:!0},pivot:{configurable:!0},skew:{configurable:!0},rotation:{configurable:!0},angle:{configurable:!0},zIndex:{configurable:!0},worldVisible:{configurable:!0},mask:{configurable:!0}};return e.mixin=function(t){for(var i=Object.keys(t),n=0;n<i.length;++n){var r=i[n];Object.defineProperty(e.prototype,r,Object.getOwnPropertyDescriptor(t,r))}},i._tempDisplayObjectParent.get=function(){return null===this.tempDisplayObjectParent&&(this.tempDisplayObjectParent=new e),this.tempDisplayObjectParent},e.prototype.updateTransform=function(){this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha},e.prototype.calculateBounds=function(){},e.prototype._recursivePostUpdateTransform=function(){this.parent?(this.parent._recursivePostUpdateTransform(),this.transform.updateTransform(this.parent.transform)):this.transform.updateTransform(this._tempDisplayObjectParent.transform)},e.prototype.getBounds=function(t,e){return t||(this.parent?(this._recursivePostUpdateTransform(),this.updateTransform()):(this.parent=this._tempDisplayObjectParent,this.updateTransform(),this.parent=null)),this._boundsID!==this._lastBoundsID&&(this.calculateBounds(),this._lastBoundsID=this._boundsID),e||(this._boundsRect||(this._boundsRect=new jL),e=this._boundsRect),this._bounds.getRectangle(e)},e.prototype.getLocalBounds=function(t){var e=this.transform,i=this.parent;this.parent=null,this.transform=this._tempDisplayObjectParent.transform,t||(this._localBoundsRect||(this._localBoundsRect=new jL),t=this._localBoundsRect);var n=this.getBounds(!1,t);return this.parent=i,this.transform=e,n},e.prototype.toGlobal=function(t,e,i){return void 0===i&&(i=!1),i||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.apply(t,e)},e.prototype.toLocal=function(t,e,i,n){return e&&(t=e.toGlobal(t,i,n)),n||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.applyInverse(t,i)},e.prototype.render=function(t){},e.prototype.setParent=function(t){if(!t||!t.addChild)throw new Error("setParent: Argument must be a Container");return t.addChild(this),t},e.prototype.setTransform=function(t,e,i,n,r,s,o,a,h){return void 0===t&&(t=0),void 0===e&&(e=0),void 0===i&&(i=1),void 0===n&&(n=1),void 0===r&&(r=0),void 0===s&&(s=0),void 0===o&&(o=0),void 0===a&&(a=0),void 0===h&&(h=0),this.position.x=t,this.position.y=e,this.scale.x=i||1,this.scale.y=n||1,this.rotation=r,this.skew.x=s,this.skew.y=o,this.pivot.x=a,this.pivot.y=h,this},e.prototype.destroy=function(){this.parent&&this.parent.removeChild(this),this.removeAllListeners(),this.transform=null,this.parent=null,this._bounds=null,this._currentBounds=null,this._mask=null,this.filters=null,this.filterArea=null,this.hitArea=null,this.interactive=!1,this.interactiveChildren=!1,this._destroyed=!0},i.x.get=function(){return this.position.x},i.x.set=function(t){this.transform.position.x=t},i.y.get=function(){return this.position.y},i.y.set=function(t){this.transform.position.y=t},i.worldTransform.get=function(){return this.transform.worldTransform},i.localTransform.get=function(){return this.transform.localTransform},i.position.get=function(){return this.transform.position},i.position.set=function(t){this.transform.position.copyFrom(t)},i.scale.get=function(){return this.transform.scale},i.scale.set=function(t){this.transform.scale.copyFrom(t)},i.pivot.get=function(){return this.transform.pivot},i.pivot.set=function(t){this.transform.pivot.copyFrom(t)},i.skew.get=function(){return this.transform.skew},i.skew.set=function(t){this.transform.skew.copyFrom(t)},i.rotation.get=function(){return this.transform.rotation},i.rotation.set=function(t){this.transform.rotation=t},i.angle.get=function(){return this.transform.rotation*DL},i.angle.set=function(t){this.transform.rotation=t*PL},i.zIndex.get=function(){return this._zIndex},i.zIndex.set=function(t){this._zIndex=t,this.parent&&(this.parent.sortDirty=!0)},i.worldVisible.get=function(){var t=this;do{if(!t.visible)return!1;t=t.parent}while(t);return!0},i.mask.get=function(){return this._mask},i.mask.set=function(t){if(this._mask){var e=this._mask.maskObject||this._mask;e.renderable=!0,e.isMask=!1}if(this._mask=t,this._mask){var i=this._mask.maskObject||this._mask;i.renderable=!1,i.isMask=!0}},Object.defineProperties(e.prototype,i),e}(FE());function qL(t,e){return t.zIndex===e.zIndex?t._lastSortedIndex-e._lastSortedIndex:t.zIndex-e.zIndex}XL.prototype.displayObjectUpdateTransform=XL.prototype.updateTransform;var JL=function(t){function e(){t.call(this),this.children=[],this.sortableChildren=IE.SORTABLE_CHILDREN,this.sortDirty=!1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={width:{configurable:!0},height:{configurable:!0}};return e.prototype.onChildrenChange=function(){},e.prototype.addChild=function(t){var e=arguments,i=arguments.length;if(i>1)for(var n=0;n<i;n++)this.addChild(e[n]);else t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,this.children.push(t),this._boundsID++,this.onChildrenChange(this.children.length-1),this.emit("childAdded",t,this,this.children.length-1),t.emit("added",this);return t},e.prototype.addChildAt=function(t,e){if(e<0||e>this.children.length)throw new Error(t+"addChildAt: The index "+e+" supplied is out of bounds "+this.children.length);return t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,this.children.splice(e,0,t),this._boundsID++,this.onChildrenChange(e),t.emit("added",this),this.emit("childAdded",t,this,e),t},e.prototype.swapChildren=function(t,e){if(t!==e){var i=this.getChildIndex(t),n=this.getChildIndex(e);this.children[i]=e,this.children[n]=t,this.onChildrenChange(i<n?i:n)}},e.prototype.getChildIndex=function(t){var e=this.children.indexOf(t);if(-1===e)throw new Error("The supplied DisplayObject must be a child of the caller");return e},e.prototype.setChildIndex=function(t,e){if(e<0||e>=this.children.length)throw new Error("The index "+e+" supplied is out of bounds "+this.children.length);var i=this.getChildIndex(t);pL(this.children,i,1),this.children.splice(e,0,t),this.onChildrenChange(e)},e.prototype.getChildAt=function(t){if(t<0||t>=this.children.length)throw new Error("getChildAt: Index ("+t+") does not exist.");return this.children[t]},e.prototype.removeChild=function(t){var e=arguments,i=arguments.length;if(i>1)for(var n=0;n<i;n++)this.removeChild(e[n]);else{var r=this.children.indexOf(t);if(-1===r)return null;t.parent=null,t.transform._parentID=-1,pL(this.children,r,1),this._boundsID++,this.onChildrenChange(r),t.emit("removed",this),this.emit("childRemoved",t,this,r)}return t},e.prototype.removeChildAt=function(t){var e=this.getChildAt(t);return e.parent=null,e.transform._parentID=-1,pL(this.children,t,1),this._boundsID++,this.onChildrenChange(t),e.emit("removed",this),this.emit("childRemoved",e,this,t),e},e.prototype.removeChildren=function(t,e){void 0===t&&(t=0);var i,n=t,r="number"==typeof e?e:this.children.length,s=r-n;if(s>0&&s<=r){i=this.children.splice(n,s);for(var o=0;o<i.length;++o)i[o].parent=null,i[o].transform&&(i[o].transform._parentID=-1);this._boundsID++,this.onChildrenChange(t);for(var a=0;a<i.length;++a)i[a].emit("removed",this),this.emit("childRemoved",i[a],this,a);return i}if(0===s&&0===this.children.length)return[];throw new RangeError("removeChildren: numeric values are outside the acceptable range.")},e.prototype.sortChildren=function(){for(var t=!1,e=0,i=this.children.length;e<i;++e){var n=this.children[e];n._lastSortedIndex=e,t||0===n.zIndex||(t=!0)}t&&this.children.length>1&&this.children.sort(qL),this.sortDirty=!1},e.prototype.updateTransform=function(){this.sortableChildren&&this.sortDirty&&this.sortChildren(),this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha;for(var t=0,e=this.children.length;t<e;++t){var i=this.children[t];i.visible&&i.updateTransform()}},e.prototype.calculateBounds=function(){this._bounds.clear(),this._calculateBounds();for(var t=0;t<this.children.length;t++){var e=this.children[t];if(e.visible&&e.renderable)if(e.calculateBounds(),e._mask){var i=e._mask.maskObject||e._mask;i.calculateBounds(),this._bounds.addBoundsMask(e._bounds,i._bounds)}else e.filterArea?this._bounds.addBoundsArea(e._bounds,e.filterArea):this._bounds.addBounds(e._bounds)}this._lastBoundsID=this._boundsID},e.prototype._calculateBounds=function(){},e.prototype.render=function(t){if(this.visible&&!(this.worldAlpha<=0)&&this.renderable)if(this._mask||this.filters&&this.filters.length)this.renderAdvanced(t);else{this._render(t);for(var e=0,i=this.children.length;e<i;++e)this.children[e].render(t)}},e.prototype.renderAdvanced=function(t){t.batch.flush();var e=this.filters,i=this._mask;if(e){this._enabledFilters||(this._enabledFilters=[]),this._enabledFilters.length=0;for(var n=0;n<e.length;n++)e[n].enabled&&this._enabledFilters.push(e[n]);this._enabledFilters.length&&t.filter.push(this,this._enabledFilters)}i&&t.mask.push(this,this._mask),this._render(t);for(var r=0,s=this.children.length;r<s;r++)this.children[r].render(t);t.batch.flush(),i&&t.mask.pop(this,this._mask),e&&this._enabledFilters&&this._enabledFilters.length&&t.filter.pop()},e.prototype._render=function(t){},e.prototype.destroy=function(e){t.prototype.destroy.call(this),this.sortDirty=!1;var i="boolean"==typeof e?e:e&&e.children,n=this.removeChildren(0,this.children.length);if(i)for(var r=0;r<n.length;++r)n[r].destroy(e)},i.width.get=function(){return this.scale.x*this.getLocalBounds().width},i.width.set=function(t){var e=this.getLocalBounds().width;this.scale.x=0!==e?t/e:1,this._width=t},i.height.get=function(){return this.scale.y*this.getLocalBounds().height},i.height.set=function(t){var e=this.getLocalBounds().height;this.scale.y=0!==e?t/e:1,this._height=t},Object.defineProperties(e.prototype,i),e}(XL);JL.prototype.containerUpdateTransform=JL.prototype.updateTransform;XL.mixin({accessible:!1,accessibleTitle:null,accessibleHint:null,tabIndex:0,_accessibleActive:!1,_accessibleDiv:!1,accessibleType:"button",accessiblePointerEvents:"auto",accessibleChildren:!0});var ZL,KL=function(t){this._hookDiv=null,(RE.tablet||RE.phone)&&this.createTouchHook();var e=document.createElement("div");e.style.width="100px",e.style.height="100px",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.zIndex=2,this.div=e,this.pool=[],this.renderId=0,this.debug=!1,this.renderer=t,this.children=[],this._onKeyDown=this._onKeyDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this.isActive=!1,this.isMobileAccessibility=!1,this.androidUpdateCount=0,this.androidUpdateFrequency=500,window.addEventListener("keydown",this._onKeyDown,!1)};KL.prototype.createTouchHook=function(){var t=this,e=document.createElement("button");e.style.width="1px",e.style.height="1px",e.style.position="absolute",e.style.top="-1000px",e.style.left="-1000px",e.style.zIndex=2,e.style.backgroundColor="#FF0000",e.title="select to enable accessability for this content",e.addEventListener("focus",(function(){t.isMobileAccessibility=!0,t.activate(),t.destroyTouchHook()})),document.body.appendChild(e),this._hookDiv=e},KL.prototype.destroyTouchHook=function(){this._hookDiv&&(document.body.removeChild(this._hookDiv),this._hookDiv=null)},KL.prototype.activate=function(){this.isActive||(this.isActive=!0,window.document.addEventListener("mousemove",this._onMouseMove,!0),window.removeEventListener("keydown",this._onKeyDown,!1),this.renderer.on("postrender",this.update,this),this.renderer.view.parentNode&&this.renderer.view.parentNode.appendChild(this.div))},KL.prototype.deactivate=function(){this.isActive&&!this.isMobileAccessibility&&(this.isActive=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!0),window.addEventListener("keydown",this._onKeyDown,!1),this.renderer.off("postrender",this.update),this.div.parentNode&&this.div.parentNode.removeChild(this.div))},KL.prototype.updateAccessibleObjects=function(t){if(t.visible&&t.accessibleChildren){t.accessible&&t.interactive&&(t._accessibleActive||this.addChild(t),t.renderId=this.renderId);for(var e=t.children,i=0;i<e.length;i++)this.updateAccessibleObjects(e[i])}},KL.prototype.update=function(){var t=performance.now();if(!(RE.android.device&&t<this.androidUpdateCount)&&(this.androidUpdateCount=t+this.androidUpdateFrequency,this.renderer.renderingToScreen)){this.updateAccessibleObjects(this.renderer._lastObjectRendered);var e=this.renderer.view.getBoundingClientRect(),i=this.renderer.resolution,n=e.width/this.renderer.width*i,r=e.height/this.renderer.height*i,s=this.div;s.style.left=e.left+"px",s.style.top=e.top+"px",s.style.width=this.renderer.width+"px",s.style.height=this.renderer.height+"px";for(var o=0;o<this.children.length;o++){var a=this.children[o];if(a.renderId!==this.renderId)a._accessibleActive=!1,pL(this.children,o,1),this.div.removeChild(a._accessibleDiv),this.pool.push(a._accessibleDiv),a._accessibleDiv=null,o--;else{s=a._accessibleDiv;var h=a.hitArea,u=a.worldTransform;a.hitArea?(s.style.left=(u.tx+h.x*u.a)*n+"px",s.style.top=(u.ty+h.y*u.d)*r+"px",s.style.width=h.width*u.a*n+"px",s.style.height=h.height*u.d*r+"px"):(h=a.getBounds(),this.capHitArea(h),s.style.left=h.x*n+"px",s.style.top=h.y*r+"px",s.style.width=h.width*n+"px",s.style.height=h.height*r+"px",s.title!==a.accessibleTitle&&null!==a.accessibleTitle&&(s.title=a.accessibleTitle),s.getAttribute("aria-label")!==a.accessibleHint&&null!==a.accessibleHint&&s.setAttribute("aria-label",a.accessibleHint)),a.accessibleTitle===s.title&&a.tabIndex===s.tabIndex||(s.title=a.accessibleTitle,s.tabIndex=a.tabIndex,this.debug&&this.updateDebugHTML(s))}}this.renderId++}},KL.prototype.updateDebugHTML=function(t){t.innerHTML="type: "+t.type+"</br> title : "+t.title+"</br> tabIndex: "+t.tabIndex},KL.prototype.capHitArea=function(t){t.x<0&&(t.width+=t.x,t.x=0),t.y<0&&(t.height+=t.y,t.y=0),t.x+t.width>this.renderer.width&&(t.width=this.renderer.width-t.x),t.y+t.height>this.renderer.height&&(t.height=this.renderer.height-t.y)},KL.prototype.addChild=function(t){var e=this.pool.pop();e||((e=document.createElement("button")).style.width="100px",e.style.height="100px",e.style.backgroundColor=this.debug?"rgba(255,255,255,0.5)":"transparent",e.style.position="absolute",e.style.zIndex=2,e.style.borderStyle="none",navigator.userAgent.toLowerCase().indexOf("chrome")>-1?e.setAttribute("aria-live","off"):e.setAttribute("aria-live","polite"),navigator.userAgent.match(/rv:.*Gecko\//)?e.setAttribute("aria-relevant","additions"):e.setAttribute("aria-relevant","text"),e.addEventListener("click",this._onClick.bind(this)),e.addEventListener("focus",this._onFocus.bind(this)),e.addEventListener("focusout",this._onFocusOut.bind(this))),e.style.pointerEvents=t.accessiblePointerEvents,e.type=t.accessibleType,t.accessibleTitle&&null!==t.accessibleTitle?e.title=t.accessibleTitle:t.accessibleHint&&null!==t.accessibleHint||(e.title="displayObject "+t.tabIndex),t.accessibleHint&&null!==t.accessibleHint&&e.setAttribute("aria-label",t.accessibleHint),this.debug&&this.updateDebugHTML(e),t._accessibleActive=!0,t._accessibleDiv=e,e.displayObject=t,this.children.push(t),this.div.appendChild(t._accessibleDiv),t._accessibleDiv.tabIndex=t.tabIndex},KL.prototype._onClick=function(t){var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"click",e.eventData),e.dispatchEvent(t.target.displayObject,"pointertap",e.eventData),e.dispatchEvent(t.target.displayObject,"tap",e.eventData)},KL.prototype._onFocus=function(t){t.target.getAttribute("aria-live","off")||t.target.setAttribute("aria-live","assertive");var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseover",e.eventData)},KL.prototype._onFocusOut=function(t){t.target.getAttribute("aria-live","off")||t.target.setAttribute("aria-live","polite");var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseout",e.eventData)},KL.prototype._onKeyDown=function(t){9===t.keyCode&&this.activate()},KL.prototype._onMouseMove=function(t){0===t.movementX&&0===t.movementY||this.deactivate()},KL.prototype.destroy=function(){this.destroyTouchHook(),this.div=null;for(var t=0;t<this.children.length;t++)this.children[t].div=null;window.document.removeEventListener("mousemove",this._onMouseMove,!0),window.removeEventListener("keydown",this._onKeyDown),this.pool=null,this.children=null,this.renderer=null},IE.TARGET_FPMS=.06,function(t){t[t.INTERACTION=50]="INTERACTION",t[t.HIGH=25]="HIGH",t[t.NORMAL=0]="NORMAL",t[t.LOW=-25]="LOW",t[t.UTILITY=-50]="UTILITY"}(ZL||(ZL={}));var QL=function(){function t(t,e,i,n){void 0===e&&(e=null),void 0===i&&(i=0),void 0===n&&(n=!1),this.fn=t,this.context=e,this.priority=i,this.once=n,this.next=null,this.previous=null,this._destroyed=!1}return t.prototype.match=function(t,e){return void 0===e&&(e=null),this.fn===t&&this.context===e},t.prototype.emit=function(t){this.fn&&(this.context?this.fn.call(this.context,t):this.fn(t));var e=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),e},t.prototype.connect=function(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this},t.prototype.destroy=function(t){void 0===t&&(t=!1),this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var e=this.next;return this.next=t?null:e,this.previous=null,e},t}(),$L=function(){function t(){var t=this;this._head=new QL(null,null,1/0),this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this.autoStart=!1,this.deltaTime=1,this.deltaMS=1/IE.TARGET_FPMS,this.elapsedMS=1/IE.TARGET_FPMS,this.lastTime=-1,this.speed=1,this.started=!1,this._protected=!1,this._lastFrame=-1,this._tick=function(e){t._requestId=null,t.started&&(t.update(e),t.started&&null===t._requestId&&t._head.next&&(t._requestId=requestAnimationFrame(t._tick)))}}return t.prototype._requestIfNeeded=function(){null===this._requestId&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))},t.prototype._cancelIfNeeded=function(){null!==this._requestId&&(cancelAnimationFrame(this._requestId),this._requestId=null)},t.prototype._startIfPossible=function(){this.started?this._requestIfNeeded():this.autoStart&&this.start()},t.prototype.add=function(t,e,i){return void 0===i&&(i=ZL.NORMAL),this._addListener(new QL(t,e,i))},t.prototype.addOnce=function(t,e,i){return void 0===i&&(i=ZL.NORMAL),this._addListener(new QL(t,e,i,!0))},t.prototype._addListener=function(t){var e=this._head.next,i=this._head;if(e){for(;e;){if(t.priority>e.priority){t.connect(i);break}i=e,e=e.next}t.previous||t.connect(i)}else t.connect(i);return this._startIfPossible(),this},t.prototype.remove=function(t,e){for(var i=this._head.next;i;)i=i.match(t,e)?i.destroy():i.next;return this._head.next||this._cancelIfNeeded(),this},Object.defineProperty(t.prototype,"count",{get:function(){if(!this._head)return 0;for(var t=0,e=this._head;e=e.next;)t++;return t},enumerable:!0,configurable:!0}),t.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},t.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},t.prototype.destroy=function(){if(!this._protected){this.stop();for(var t=this._head.next;t;)t=t.destroy(!0);this._head.destroy(),this._head=null}},t.prototype.update=function(t){var e;if(void 0===t&&(t=performance.now()),t>this.lastTime){if((e=this.elapsedMS=t-this.lastTime)>this._maxElapsedMS&&(e=this._maxElapsedMS),e*=this.speed,this._minElapsedMS){var i=t-this._lastFrame|0;if(i<this._minElapsedMS)return;this._lastFrame=t-i%this._minElapsedMS}this.deltaMS=e,this.deltaTime=this.deltaMS*IE.TARGET_FPMS;for(var n=this._head,r=n.next;r;)r=r.emit(this.deltaTime);n.next||this._cancelIfNeeded()}else this.deltaTime=this.deltaMS=this.elapsedMS=0;this.lastTime=t},Object.defineProperty(t.prototype,"FPS",{get:function(){return 1e3/this.elapsedMS},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"minFPS",{get:function(){return 1e3/this._maxElapsedMS},set:function(t){var e=Math.min(this.maxFPS,t),i=Math.min(Math.max(0,e)/1e3,IE.TARGET_FPMS);this._maxElapsedMS=1/i},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"maxFPS",{get:function(){return this._minElapsedMS?Math.round(1e3/this._minElapsedMS):0},set:function(t){if(0===t)this._minElapsedMS=0;else{var e=Math.max(this.minFPS,t);this._minElapsedMS=1/(e/1e3)}},enumerable:!0,configurable:!0}),Object.defineProperty(t,"shared",{get:function(){if(!t._shared){var e=t._shared=new t;e.autoStart=!0,e._protected=!0}return t._shared},enumerable:!0,configurable:!0}),Object.defineProperty(t,"system",{get:function(){if(!t._system){var e=t._system=new t;e.autoStart=!0,e._protected=!0}return t._system},enumerable:!0,configurable:!0}),t}(),tA=function(){function t(){}return t.init=function(t){var e=this;t=Object.assign({autoStart:!0,sharedTicker:!1},t),Object.defineProperty(this,"ticker",{set:function(t){this._ticker&&this._ticker.remove(this.render,this),this._ticker=t,t&&t.add(this.render,this,ZL.LOW)},get:function(){return this._ticker}}),this.stop=function(){e._ticker.stop()},this.start=function(){e._ticker.start()},this._ticker=null,this.ticker=t.sharedTicker?$L.shared:new $L,t.autoStart&&this.start()},t.destroy=function(){if(this._ticker){var t=this._ticker;this.ticker=null,t.destroy()}},t}(),eA=function(){this.global=new EL,this.target=null,this.originalEvent=null,this.identifier=null,this.isPrimary=!1,this.button=0,this.buttons=0,this.width=0,this.height=0,this.tiltX=0,this.tiltY=0,this.pointerType=null,this.pressure=0,this.rotationAngle=0,this.twist=0,this.tangentialPressure=0},iA={pointerId:{configurable:!0}};iA.pointerId.get=function(){return this.identifier},eA.prototype.getLocalPosition=function(t,e,i){return t.worldTransform.applyInverse(i||this.global,e)},eA.prototype.copyEvent=function(t){t.isPrimary&&(this.isPrimary=!0),this.button=t.button,this.buttons=Number.isInteger(t.buttons)?t.buttons:t.which,this.width=t.width,this.height=t.height,this.tiltX=t.tiltX,this.tiltY=t.tiltY,this.pointerType=t.pointerType,this.pressure=t.pressure,this.rotationAngle=t.rotationAngle,this.twist=t.twist||0,this.tangentialPressure=t.tangentialPressure||0},eA.prototype.reset=function(){this.isPrimary=!1},Object.defineProperties(eA.prototype,iA);var nA=function(){this.stopped=!1,this.stopsPropagatingAt=null,this.stopPropagationHint=!1,this.target=null,this.currentTarget=null,this.type=null,this.data=null};nA.prototype.stopPropagation=function(){this.stopped=!0,this.stopPropagationHint=!0,this.stopsPropagatingAt=this.currentTarget},nA.prototype.reset=function(){this.stopped=!1,this.stopsPropagatingAt=null,this.stopPropagationHint=!1,this.currentTarget=null,this.target=null};var rA=function t(e){this._pointerId=e,this._flags=t.FLAGS.NONE},sA={pointerId:{configurable:!0},flags:{configurable:!0},none:{configurable:!0},over:{configurable:!0},rightDown:{configurable:!0},leftDown:{configurable:!0}};rA.prototype._doSet=function(t,e){this._flags=e?this._flags|t:this._flags&~t},sA.pointerId.get=function(){return this._pointerId},sA.flags.get=function(){return this._flags},sA.flags.set=function(t){this._flags=t},sA.none.get=function(){return this._flags===this.constructor.FLAGS.NONE},sA.over.get=function(){return 0!=(this._flags&this.constructor.FLAGS.OVER)},sA.over.set=function(t){this._doSet(this.constructor.FLAGS.OVER,t)},sA.rightDown.get=function(){return 0!=(this._flags&this.constructor.FLAGS.RIGHT_DOWN)},sA.rightDown.set=function(t){this._doSet(this.constructor.FLAGS.RIGHT_DOWN,t)},sA.leftDown.get=function(){return 0!=(this._flags&this.constructor.FLAGS.LEFT_DOWN)},sA.leftDown.set=function(t){this._doSet(this.constructor.FLAGS.LEFT_DOWN,t)},Object.defineProperties(rA.prototype,sA),rA.FLAGS=Object.freeze({NONE:0,OVER:1,LEFT_DOWN:2,RIGHT_DOWN:4});var oA=function(){this._tempPoint=new EL};oA.prototype.recursiveFindHit=function(t,e,i,n,r){if(!e||!e.visible)return!1;var s=t.data.global,o=!1,a=r=e.interactive||r,h=!0;if(e.hitArea?(n&&(e.worldTransform.applyInverse(s,this._tempPoint),e.hitArea.contains(this._tempPoint.x,this._tempPoint.y)?o=!0:(n=!1,h=!1)),a=!1):e._mask&&n&&(e._mask.containsPoint&&e._mask.containsPoint(s)||(n=!1)),h&&e.interactiveChildren&&e.children)for(var u=e.children,l=u.length-1;l>=0;l--){var c=u[l],d=this.recursiveFindHit(t,c,i,n,a);if(d){if(!c.parent)continue;a=!1,d&&(t.target&&(n=!1),o=!0)}}return r&&(n&&!t.target&&!e.hitArea&&e.containsPoint&&e.containsPoint(s)&&(o=!0),e.interactive&&(o&&!t.target&&(t.target=e),i&&i(t,e,!!o))),o},oA.prototype.findHit=function(t,e,i,n){this.recursiveFindHit(t,e,i,n,!1)};var aA={interactive:!1,interactiveChildren:!0,hitArea:null,get buttonMode(){return"pointer"===this.cursor},set buttonMode(t){t?this.cursor="pointer":"pointer"===this.cursor&&(this.cursor=null)},cursor:null,get trackedPointers(){return void 0===this._trackedPointers&&(this._trackedPointers={}),this._trackedPointers},_trackedPointers:void 0};XL.mixin(aA);var hA={target:null,data:{global:null}},uA=function(t){function e(e,i){t.call(this),i=i||{},this.renderer=e,this.autoPreventDefault=void 0===i.autoPreventDefault||i.autoPreventDefault,this.interactionFrequency=i.interactionFrequency||10,this.mouse=new eA,this.mouse.identifier=1,this.mouse.global.set(-999999),this.activeInteractionData={},this.activeInteractionData[1]=this.mouse,this.interactionDataPool=[],this.eventData=new nA,this.interactionDOMElement=null,this.moveWhenInside=!1,this.eventsAdded=!1,this.tickerAdded=!1,this.mouseOverRenderer=!1,this.supportsTouchEvents="ontouchstart"in window,this.supportsPointerEvents=!!window.PointerEvent,this.onPointerUp=this.onPointerUp.bind(this),this.processPointerUp=this.processPointerUp.bind(this),this.onPointerCancel=this.onPointerCancel.bind(this),this.processPointerCancel=this.processPointerCancel.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.processPointerDown=this.processPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.processPointerMove=this.processPointerMove.bind(this),this.onPointerOut=this.onPointerOut.bind(this),this.processPointerOverOut=this.processPointerOverOut.bind(this),this.onPointerOver=this.onPointerOver.bind(this),this.cursorStyles={default:"inherit",pointer:"pointer"},this.currentCursorMode=null,this.cursor=null,this.resolution=1,this.delayedEvents=[],this.search=new oA,this._useSystemTicker=void 0===i.useSystemTicker||i.useSystemTicker,this.setTargetElement(this.renderer.view,this.renderer.resolution)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={useSystemTicker:{configurable:!0}};return i.useSystemTicker.get=function(){return this._useSystemTicker},i.useSystemTicker.set=function(t){this._useSystemTicker=t,t?this.addTickerListener():this.removeTickerListener()},e.prototype.hitTest=function(t,e){return hA.target=null,hA.data.global=t,e||(e=this.renderer._lastObjectRendered),this.processInteractive(hA,e,null,!0),hA.target},e.prototype.setTargetElement=function(t,e){void 0===e&&(e=1),this.removeTickerListener(),this.removeEvents(),this.interactionDOMElement=t,this.resolution=e,this.addEvents(),this.addTickerListener()},e.prototype.addTickerListener=function(){!this.tickerAdded&&this.interactionDOMElement&&this._useSystemTicker&&($L.system.add(this.tickerUpdate,this,ZL.INTERACTION),this.tickerAdded=!0)},e.prototype.removeTickerListener=function(){this.tickerAdded&&($L.system.remove(this.tickerUpdate,this),this.tickerAdded=!1)},e.prototype.addEvents=function(){!this.eventsAdded&&this.interactionDOMElement&&(window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="none",this.interactionDOMElement.style["-ms-touch-action"]="none"):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]="none"),this.supportsPointerEvents?(window.document.addEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("pointerover",this.onPointerOver,!0),window.addEventListener("pointercancel",this.onPointerCancel,!0),window.addEventListener("pointerup",this.onPointerUp,!0)):(window.document.addEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("mouseover",this.onPointerOver,!0),window.addEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.addEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.addEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.addEventListener("touchmove",this.onPointerMove,!0)),this.eventsAdded=!0)},e.prototype.removeEvents=function(){this.eventsAdded&&this.interactionDOMElement&&(window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="",this.interactionDOMElement.style["-ms-touch-action"]=""):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]=""),this.supportsPointerEvents?(window.document.removeEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("pointerover",this.onPointerOver,!0),window.removeEventListener("pointercancel",this.onPointerCancel,!0),window.removeEventListener("pointerup",this.onPointerUp,!0)):(window.document.removeEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("mouseover",this.onPointerOver,!0),window.removeEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.removeEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.removeEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.removeEventListener("touchmove",this.onPointerMove,!0)),this.interactionDOMElement=null,this.eventsAdded=!1)},e.prototype.tickerUpdate=function(t){this._deltaTime+=t,this._deltaTime<this.interactionFrequency||(this._deltaTime=0,this.update())},e.prototype.update=function(){if(this.interactionDOMElement)if(this.didMove)this.didMove=!1;else{for(var t in this.cursor=null,this.activeInteractionData)if(this.activeInteractionData.hasOwnProperty(t)){var e=this.activeInteractionData[t];if(e.originalEvent&&"touch"!==e.pointerType){var i=this.configureInteractionEventForDOMEvent(this.eventData,e.originalEvent,e);this.processInteractive(i,this.renderer._lastObjectRendered,this.processPointerOverOut,!0)}}this.setCursorMode(this.cursor)}},e.prototype.setCursorMode=function(t){if(t=t||"default",this.currentCursorMode!==t){this.currentCursorMode=t;var e=this.cursorStyles[t];if(e)switch(typeof e){case"string":this.interactionDOMElement.style.cursor=e;break;case"function":e(t);break;case"object":Object.assign(this.interactionDOMElement.style,e)}else"string"!=typeof t||Object.prototype.hasOwnProperty.call(this.cursorStyles,t)||(this.interactionDOMElement.style.cursor=t)}},e.prototype.dispatchEvent=function(t,e,i){i.stopPropagationHint&&t!==i.stopsPropagatingAt||(i.currentTarget=t,i.type=e,t.emit(e,i),t[e]&&t[e](i))},e.prototype.delayDispatchEvent=function(t,e,i){this.delayedEvents.push({displayObject:t,eventString:e,eventData:i})},e.prototype.mapPositionToPoint=function(t,e,i){var n;n=this.interactionDOMElement.parentElement?this.interactionDOMElement.getBoundingClientRect():{x:0,y:0,width:0,height:0};var r=1/this.resolution;t.x=(e-n.left)*(this.interactionDOMElement.width/n.width)*r,t.y=(i-n.top)*(this.interactionDOMElement.height/n.height)*r},e.prototype.processInteractive=function(t,e,i,n){var r=this.search.findHit(t,e,i,n),s=this.delayedEvents;if(!s.length)return r;t.stopPropagationHint=!1;var o=s.length;this.delayedEvents=[];for(var a=0;a<o;a++){var h=s[a],u=h.displayObject,l=h.eventString,c=h.eventData;c.stopsPropagatingAt===u&&(c.stopPropagationHint=!0),this.dispatchEvent(u,l,c)}return r},e.prototype.onPointerDown=function(t){if(!this.supportsTouchEvents||"touch"!==t.pointerType){var e=this.normalizeToPointerData(t);if(this.autoPreventDefault&&e[0].isNormalized)(t.cancelable||!("cancelable"in t))&&t.preventDefault();for(var i=e.length,n=0;n<i;n++){var r=e[n],s=this.getInteractionDataForPointerId(r),o=this.configureInteractionEventForDOMEvent(this.eventData,r,s);if(o.data.originalEvent=t,this.processInteractive(o,this.renderer._lastObjectRendered,this.processPointerDown,!0),this.emit("pointerdown",o),"touch"===r.pointerType)this.emit("touchstart",o);else if("mouse"===r.pointerType||"pen"===r.pointerType){var a=2===r.button;this.emit(a?"rightdown":"mousedown",this.eventData)}}}},e.prototype.processPointerDown=function(t,e,i){var n=t.data,r=t.data.identifier;if(i)if(e.trackedPointers[r]||(e.trackedPointers[r]=new rA(r)),this.dispatchEvent(e,"pointerdown",t),"touch"===n.pointerType)this.dispatchEvent(e,"touchstart",t);else if("mouse"===n.pointerType||"pen"===n.pointerType){var s=2===n.button;s?e.trackedPointers[r].rightDown=!0:e.trackedPointers[r].leftDown=!0,this.dispatchEvent(e,s?"rightdown":"mousedown",t)}},e.prototype.onPointerComplete=function(t,e,i){for(var n=this.normalizeToPointerData(t),r=n.length,s=t.target!==this.interactionDOMElement?"outside":"",o=0;o<r;o++){var a=n[o],h=this.getInteractionDataForPointerId(a),u=this.configureInteractionEventForDOMEvent(this.eventData,a,h);if(u.data.originalEvent=t,this.processInteractive(u,this.renderer._lastObjectRendered,i,e||!s),this.emit(e?"pointercancel":"pointerup"+s,u),"mouse"===a.pointerType||"pen"===a.pointerType){var l=2===a.button;this.emit(l?"rightup"+s:"mouseup"+s,u)}else"touch"===a.pointerType&&(this.emit(e?"touchcancel":"touchend"+s,u),this.releaseInteractionDataForPointerId(a.pointerId,h))}},e.prototype.onPointerCancel=function(t){this.supportsTouchEvents&&"touch"===t.pointerType||this.onPointerComplete(t,!0,this.processPointerCancel)},e.prototype.processPointerCancel=function(t,e){var i=t.data,n=t.data.identifier;void 0!==e.trackedPointers[n]&&(delete e.trackedPointers[n],this.dispatchEvent(e,"pointercancel",t),"touch"===i.pointerType&&this.dispatchEvent(e,"touchcancel",t))},e.prototype.onPointerUp=function(t){this.supportsTouchEvents&&"touch"===t.pointerType||this.onPointerComplete(t,!1,this.processPointerUp)},e.prototype.processPointerUp=function(t,e,i){var n=t.data,r=t.data.identifier,s=e.trackedPointers[r],o="touch"===n.pointerType,a="mouse"===n.pointerType||"pen"===n.pointerType,h=!1;if(a){var u=2===n.button,l=rA.FLAGS,c=u?l.RIGHT_DOWN:l.LEFT_DOWN,d=void 0!==s&&s.flags&c;i?(this.dispatchEvent(e,u?"rightup":"mouseup",t),d&&(this.dispatchEvent(e,u?"rightclick":"click",t),h=!0)):d&&this.dispatchEvent(e,u?"rightupoutside":"mouseupoutside",t),s&&(u?s.rightDown=!1:s.leftDown=!1)}i?(this.dispatchEvent(e,"pointerup",t),o&&this.dispatchEvent(e,"touchend",t),s&&(a&&!h||this.dispatchEvent(e,"pointertap",t),o&&(this.dispatchEvent(e,"tap",t),s.over=!1))):s&&(this.dispatchEvent(e,"pointerupoutside",t),o&&this.dispatchEvent(e,"touchendoutside",t)),s&&s.none&&delete e.trackedPointers[r]},e.prototype.onPointerMove=function(t){if(!this.supportsTouchEvents||"touch"!==t.pointerType){var e=this.normalizeToPointerData(t);"mouse"!==e[0].pointerType&&"pen"!==e[0].pointerType||(this.didMove=!0,this.cursor=null);for(var i=e.length,n=0;n<i;n++){var r=e[n],s=this.getInteractionDataForPointerId(r),o=this.configureInteractionEventForDOMEvent(this.eventData,r,s);o.data.originalEvent=t,this.processInteractive(o,this.renderer._lastObjectRendered,this.processPointerMove,!0),this.emit("pointermove",o),"touch"===r.pointerType&&this.emit("touchmove",o),"mouse"!==r.pointerType&&"pen"!==r.pointerType||this.emit("mousemove",o)}"mouse"===e[0].pointerType&&this.setCursorMode(this.cursor)}},e.prototype.processPointerMove=function(t,e,i){var n=t.data,r="touch"===n.pointerType,s="mouse"===n.pointerType||"pen"===n.pointerType;s&&this.processPointerOverOut(t,e,i),this.moveWhenInside&&!i||(this.dispatchEvent(e,"pointermove",t),r&&this.dispatchEvent(e,"touchmove",t),s&&this.dispatchEvent(e,"mousemove",t))},e.prototype.onPointerOut=function(t){if(!this.supportsTouchEvents||"touch"!==t.pointerType){var e=this.normalizeToPointerData(t)[0];"mouse"===e.pointerType&&(this.mouseOverRenderer=!1,this.setCursorMode(null));var i=this.getInteractionDataForPointerId(e),n=this.configureInteractionEventForDOMEvent(this.eventData,e,i);n.data.originalEvent=e,this.processInteractive(n,this.renderer._lastObjectRendered,this.processPointerOverOut,!1),this.emit("pointerout",n),"mouse"===e.pointerType||"pen"===e.pointerType?this.emit("mouseout",n):this.releaseInteractionDataForPointerId(i.identifier)}},e.prototype.processPointerOverOut=function(t,e,i){var n=t.data,r=t.data.identifier,s="mouse"===n.pointerType||"pen"===n.pointerType,o=e.trackedPointers[r];i&&!o&&(o=e.trackedPointers[r]=new rA(r)),void 0!==o&&(i&&this.mouseOverRenderer?(o.over||(o.over=!0,this.delayDispatchEvent(e,"pointerover",t),s&&this.delayDispatchEvent(e,"mouseover",t)),s&&null===this.cursor&&(this.cursor=e.cursor)):o.over&&(o.over=!1,this.dispatchEvent(e,"pointerout",this.eventData),s&&this.dispatchEvent(e,"mouseout",t),o.none&&delete e.trackedPointers[r]))},e.prototype.onPointerOver=function(t){var e=this.normalizeToPointerData(t)[0],i=this.getInteractionDataForPointerId(e),n=this.configureInteractionEventForDOMEvent(this.eventData,e,i);n.data.originalEvent=e,"mouse"===e.pointerType&&(this.mouseOverRenderer=!0),this.emit("pointerover",n),"mouse"!==e.pointerType&&"pen"!==e.pointerType||this.emit("mouseover",n)},e.prototype.getInteractionDataForPointerId=function(t){var e,i=t.pointerId;return 1===i||"mouse"===t.pointerType?e=this.mouse:this.activeInteractionData[i]?e=this.activeInteractionData[i]:((e=this.interactionDataPool.pop()||new eA).identifier=i,this.activeInteractionData[i]=e),e.copyEvent(t),e},e.prototype.releaseInteractionDataForPointerId=function(t){var e=this.activeInteractionData[t];e&&(delete this.activeInteractionData[t],e.reset(),this.interactionDataPool.push(e))},e.prototype.configureInteractionEventForDOMEvent=function(t,e,i){return t.data=i,this.mapPositionToPoint(i.global,e.clientX,e.clientY),"touch"===e.pointerType&&(e.globalX=i.global.x,e.globalY=i.global.y),i.originalEvent=e,t.reset(),t},e.prototype.normalizeToPointerData=function(t){var e=[];if(this.supportsTouchEvents&&t instanceof TouchEvent)for(var i=0,n=t.changedTouches.length;i<n;i++){var r=t.changedTouches[i];void 0===r.button&&(r.button=t.touches.length?1:0),void 0===r.buttons&&(r.buttons=t.touches.length?1:0),void 0===r.isPrimary&&(r.isPrimary=1===t.touches.length&&"touchstart"===t.type),void 0===r.width&&(r.width=r.radiusX||1),void 0===r.height&&(r.height=r.radiusY||1),void 0===r.tiltX&&(r.tiltX=0),void 0===r.tiltY&&(r.tiltY=0),void 0===r.pointerType&&(r.pointerType="touch"),void 0===r.pointerId&&(r.pointerId=r.identifier||0),void 0===r.pressure&&(r.pressure=r.force||.5),void 0===r.twist&&(r.twist=0),void 0===r.tangentialPressure&&(r.tangentialPressure=0),void 0===r.layerX&&(r.layerX=r.offsetX=r.clientX),void 0===r.layerY&&(r.layerY=r.offsetY=r.clientY),r.isNormalized=!0,e.push(r)}else!(t instanceof MouseEvent)||this.supportsPointerEvents&&t instanceof window.PointerEvent||(void 0===t.isPrimary&&(t.isPrimary=!0),void 0===t.width&&(t.width=1),void 0===t.height&&(t.height=1),void 0===t.tiltX&&(t.tiltX=0),void 0===t.tiltY&&(t.tiltY=0),void 0===t.pointerType&&(t.pointerType="mouse"),void 0===t.pointerId&&(t.pointerId=1),void 0===t.pressure&&(t.pressure=.5),void 0===t.twist&&(t.twist=0),void 0===t.tangentialPressure&&(t.tangentialPressure=0),t.isNormalized=!0),e.push(t);return e},e.prototype.destroy=function(){this.removeEvents(),this.removeTickerListener(),this.removeAllListeners(),this.renderer=null,this.mouse=null,this.eventData=null,this.interactionDOMElement=null,this.onPointerDown=null,this.processPointerDown=null,this.onPointerUp=null,this.processPointerUp=null,this.onPointerCancel=null,this.processPointerCancel=null,this.onPointerMove=null,this.processPointerMove=null,this.onPointerOut=null,this.processPointerOverOut=null,this.onPointerOver=null,this.search=null},Object.defineProperties(e.prototype,i),e}(FE()),lA=function(){function t(t){this.items=[],this._name=t,this._aliasCount=0}return t.prototype.emit=function(t,e,i,n,r,s,o,a){if(arguments.length>8)throw new Error("max arguments reached");var h=this,u=h.name,l=h.items;this._aliasCount++;for(var c=0,d=l.length;c<d;c++)l[c][u](t,e,i,n,r,s,o,a);return l===this.items&&this._aliasCount--,this},t.prototype.ensureNonAliasedItems=function(){this._aliasCount>0&&this.items.length>1&&(this._aliasCount=0,this.items=this.items.slice(0))},t.prototype.add=function(t){return t[this._name]&&(this.ensureNonAliasedItems(),this.remove(t),this.items.push(t)),this},t.prototype.remove=function(t){var e=this.items.indexOf(t);return-1!==e&&(this.ensureNonAliasedItems(),this.items.splice(e,1)),this},t.prototype.contains=function(t){return-1!==this.items.indexOf(t)},t.prototype.removeAll=function(){return this.ensureNonAliasedItems(),this.items.length=0,this},t.prototype.destroy=function(){this.removeAll(),this.items=null,this._name=null},Object.defineProperty(t.prototype,"empty",{get:function(){return 0===this.items.length},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t}();Object.defineProperties(lA.prototype,{dispatch:{value:lA.prototype.emit},run:{value:lA.prototype.emit}});var cA=function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this._width=t,this._height=e,this.destroyed=!1,this.internal=!1,this.onResize=new lA("setRealSize",2),this.onUpdate=new lA("update"),this.onError=new lA("onError",1)},dA={valid:{configurable:!0},width:{configurable:!0},height:{configurable:!0}};cA.prototype.bind=function(t){this.onResize.add(t),this.onUpdate.add(t),this.onError.add(t),(this._width||this._height)&&this.onResize.run(this._width,this._height)},cA.prototype.unbind=function(t){this.onResize.remove(t),this.onUpdate.remove(t),this.onError.remove(t)},cA.prototype.resize=function(t,e){t===this._width&&e===this._height||(this._width=t,this._height=e,this.onResize.run(t,e))},dA.valid.get=function(){return!!this._width&&!!this._height},cA.prototype.update=function(){this.destroyed||this.onUpdate.run()},cA.prototype.load=function(){return Promise.resolve()},dA.width.get=function(){return this._width},dA.height.get=function(){return this._height},cA.prototype.upload=function(t,e,i){return!1},cA.prototype.style=function(t,e,i){return!1},cA.prototype.dispose=function(){},cA.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.dispose(),this.onError.removeAll(),this.onError=null,this.onResize.removeAll(),this.onResize=null,this.onUpdate.removeAll(),this.onUpdate=null)},Object.defineProperties(cA.prototype,dA);var pA=function(t){function e(e){var i=e.naturalWidth||e.videoWidth||e.width,n=e.naturalHeight||e.videoHeight||e.height;t.call(this,i,n),this.source=e,this.noSubImage=!1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.crossOrigin=function(t,e,i){void 0===i&&0!==e.indexOf("data:")?t.crossOrigin=function(t,e){if(void 0===e&&(e=window.location),0===t.indexOf("data:"))return"";e=e||window.location,TL||(TL=document.createElement("a")),TL.href=t;var i=(0,UE.parse)(TL.href),n=!i.port&&""===e.port||i.port===e.port;return i.hostname===e.hostname&&n&&i.protocol===e.protocol?"":"anonymous"}(e):!1!==i&&(t.crossOrigin="string"==typeof i?i:"anonymous")},e.prototype.upload=function(t,e,i,n){var r=t.gl,s=e.realWidth,o=e.realHeight;return n=n||this.source,r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e.alphaMode===KE.UNPACK),this.noSubImage||e.target!==r.TEXTURE_2D||i.width!==s||i.height!==o?(i.width=s,i.height=o,r.texImage2D(e.target,0,e.format,e.format,e.type,n)):r.texSubImage2D(r.TEXTURE_2D,0,0,0,e.format,e.type,n),!0},e.prototype.update=function(){if(!this.destroyed){var e=this.source.naturalWidth||this.source.videoWidth||this.source.width,i=this.source.naturalHeight||this.source.videoHeight||this.source.height;this.resize(e,i),t.prototype.update.call(this)}},e.prototype.dispose=function(){this.source=null},e}(cA),fA=function(t){function e(e,i){if(i=i||{},!(e instanceof HTMLImageElement)){var n=new Image;t.crossOrigin(n,e,i.crossorigin),n.src=e,e=n}t.call(this,e),!e.complete&&this._width&&this._height&&(this._width=0,this._height=0),this.url=e.src,this._process=null,this.preserveBitmap=!1,this.createBitmap=(void 0!==i.createBitmap?i.createBitmap:IE.CREATE_IMAGE_BITMAP)&&!!window.createImageBitmap,this.alphaMode="number"==typeof i.alphaMode?i.alphaMode:null,void 0!==i.premultiplyAlpha&&(this.premultiplyAlpha=i.premultiplyAlpha),this.bitmap=null,this._load=null,!1!==i.autoLoad&&this.load()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(t){var e=this;return this._load||(void 0!==t&&(this.createBitmap=t),this._load=new Promise((function(t,i){e.url=e.source.src;var n=e.source,r=function(){e.destroyed||(n.onload=null,n.onerror=null,e.resize(n.width,n.height),e._load=null,e.createBitmap?t(e.process()):t(e))};n.complete&&n.src?r():(n.onload=r,n.onerror=function(t){i(t),e.onError.emit(t)})}))),this._load},e.prototype.process=function(){var t=this;return null!==this._process?this._process:null===this.bitmap&&window.createImageBitmap?(this._process=window.createImageBitmap(this.source,0,0,this.source.width,this.source.height,{premultiplyAlpha:this.premultiplyAlpha===KE.UNPACK?"premultiply":"none"}).then((function(e){return t.destroyed?Promise.reject():(t.bitmap=e,t.update(),t._process=null,Promise.resolve(t))})),this._process):Promise.resolve(this)},e.prototype.upload=function(e,i,n){if("number"==typeof this.alphaMode&&(i.alphaMode=this.alphaMode),!this.createBitmap)return t.prototype.upload.call(this,e,i,n);if(!this.bitmap&&(this.process(),!this.bitmap))return!1;if(t.prototype.upload.call(this,e,i,n,this.bitmap),!this.preserveBitmap){var r=!0;for(var s in i._glTextures){var o=i._glTextures[s];if(o!==n&&o.dirtyId!==i.dirtyId){r=!1;break}}r&&(this.bitmap.close&&this.bitmap.close(),this.bitmap=null)}return!0},e.prototype.dispose=function(){this.source.onload=null,this.source.onerror=null,t.prototype.dispose.call(this),this.bitmap&&(this.bitmap.close(),this.bitmap=null),this._process=null,this._load=null},e}(pA),mA=[];function vA(t,e){if(!t)return null;var i="";if("string"==typeof t){var n=/\.(\w{3,4})(?:$|\?|#)/i.exec(t);n&&(i=n[1].toLowerCase())}for(var r=mA.length-1;r>=0;--r){var s=mA[r];if(s.test&&s.test(t,i))return new s(t,e)}return new fA(t,e)}var gA=function(t){function e(e,i){var n=i||{},r=n.width,s=n.height;if(!r||!s)throw new Error("BufferResource width or height invalid");t.call(this,r,s),this.data=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.upload=function(t,e,i){var n=t.gl;return n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e.alphaMode===KE.UNPACK),i.width===e.width&&i.height===e.height?n.texSubImage2D(e.target,0,0,0,e.width,e.height,e.format,e.type,this.data):(i.width=e.width,i.height=e.height,n.texImage2D(e.target,0,i.internalFormat,e.width,e.height,0,e.format,i.type,this.data)),!0},e.prototype.dispose=function(){this.data=null},e.test=function(t){return t instanceof Float32Array||t instanceof Uint8Array||t instanceof Uint32Array},e}(cA),yA={scaleMode:qE.NEAREST,format:GE.RGBA,alphaMode:KE.NPM},_A=function(t){function e(e,i){void 0===e&&(e=null),void 0===i&&(i=null),t.call(this);var n=(i=i||{}).alphaMode,r=i.mipmap,s=i.anisotropicLevel,o=i.scaleMode,a=i.width,h=i.height,u=i.wrapMode,l=i.format,c=i.type,d=i.target,p=i.resolution,f=i.resourceOptions;!e||e instanceof cA||((e=vA(e,f)).internal=!0),this.width=a||0,this.height=h||0,this.resolution=p||IE.RESOLUTION,this.mipmap=void 0!==r?r:IE.MIPMAP_TEXTURES,this.anisotropicLevel=void 0!==s?s:IE.ANISOTROPIC_LEVEL,this.wrapMode=u||IE.WRAP_MODE,this.scaleMode=void 0!==o?o:IE.SCALE_MODE,this.format=l||GE.RGBA,this.type=c||XE.UNSIGNED_BYTE,this.target=d||VE.TEXTURE_2D,this.alphaMode=void 0!==n?n:KE.UNPACK,void 0!==i.premultiplyAlpha&&(this.premultiplyAlpha=i.premultiplyAlpha),this.uid=vL(),this.touched=0,this.isPowerOfTwo=!1,this._refreshPOT(),this._glTextures={},this.dirtyId=0,this.dirtyStyleId=0,this.cacheId=null,this.valid=a>0&&h>0,this.textureCacheIds=[],this.destroyed=!1,this.resource=null,this._batchEnabled=0,this._batchLocation=0,this.setResource(e)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={realWidth:{configurable:!0},realHeight:{configurable:!0}};return i.realWidth.get=function(){return Math.ceil(this.width*this.resolution-1e-4)},i.realHeight.get=function(){return Math.ceil(this.height*this.resolution-1e-4)},e.prototype.setStyle=function(t,e){var i;return void 0!==t&&t!==this.scaleMode&&(this.scaleMode=t,i=!0),void 0!==e&&e!==this.mipmap&&(this.mipmap=e,i=!0),i&&this.dirtyStyleId++,this},e.prototype.setSize=function(t,e,i){return this.resolution=i||this.resolution,this.width=t,this.height=e,this._refreshPOT(),this.update(),this},e.prototype.setRealSize=function(t,e,i){return this.resolution=i||this.resolution,this.width=t/this.resolution,this.height=e/this.resolution,this._refreshPOT(),this.update(),this},e.prototype._refreshPOT=function(){this.isPowerOfTwo=cL(this.realWidth)&&cL(this.realHeight)},e.prototype.setResolution=function(t){var e=this.resolution;return e===t||(this.resolution=t,this.valid&&(this.width=this.width*e/t,this.height=this.height*e/t,this.emit("update",this)),this._refreshPOT()),this},e.prototype.setResource=function(t){if(this.resource===t)return this;if(this.resource)throw new Error("Resource can be set only once");return t.bind(this),this.resource=t,this},e.prototype.update=function(){this.valid?(this.dirtyId++,this.dirtyStyleId++,this.emit("update",this)):this.width>0&&this.height>0&&(this.valid=!0,this.emit("loaded",this),this.emit("update",this))},e.prototype.onError=function(t){this.emit("error",this,t)},e.prototype.destroy=function(){this.resource&&(this.resource.unbind(this),this.resource.internal&&this.resource.destroy(),this.resource=null),this.cacheId&&(delete bL[this.cacheId],delete xL[this.cacheId],this.cacheId=null),this.dispose(),e.removeFromCache(this),this.textureCacheIds=null,this.destroyed=!0},e.prototype.dispose=function(){this.emit("dispose",this)},e.from=function(t,i,n){void 0===n&&(n=IE.STRICT_TEXTURE_CACHE);var r="string"==typeof t,s=null;r?s=t:(t._pixiId||(t._pixiId="pixiid_"+vL()),s=t._pixiId);var o=bL[s];if(r&&n&&!o)throw new Error('The cacheId "'+s+'" does not exist in BaseTextureCache.');return o||((o=new e(t,i)).cacheId=s,e.addToCache(o,s)),o},e.fromBuffer=function(t,i,n,r){t=t||new Float32Array(i*n*4);var s=new gA(t,{width:i,height:n}),o=t instanceof Float32Array?XE.FLOAT:XE.UNSIGNED_BYTE;return new e(s,Object.assign(yA,r||{width:i,height:n,type:o}))},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),bL[e]&&console.warn("BaseTexture added to the cache with an id ["+e+"] that already had an entry"),bL[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=bL[t];if(e){var i=e.textureCacheIds.indexOf(t);return i>-1&&e.textureCacheIds.splice(i,1),delete bL[t],e}}else if(t&&t.textureCacheIds){for(var n=0;n<t.textureCacheIds.length;++n)delete bL[t.textureCacheIds[n]];return t.textureCacheIds.length=0,t}return null},Object.defineProperties(e.prototype,i),e}(FE());_A._globalBatch=0;var xA=function(t){function e(e,i){var n;i=i||{};var r=e;Array.isArray(e)&&(n=e,r=e.length),t.call(this,i.width,i.height),this.items=[],this.itemDirtyIds=[];for(var s=0;s<r;s++){var o=new _A;this.items.push(o),this.itemDirtyIds.push(-1)}if(this.length=r,this._load=null,n)for(var a=0;a<r;a++)this.addResourceAt(vA(n[a],i),a)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.dispose=function(){for(var t=0,e=this.length;t<e;t++)this.items[t].destroy();this.items=null,this.itemDirtyIds=null,this._load=null},e.prototype.addResourceAt=function(t,e){if(!this.items[e])throw new Error("Index "+e+" is out of bounds");return t.valid&&!this.valid&&this.resize(t.width,t.height),this.items[e].setResource(t),this},e.prototype.bind=function(e){t.prototype.bind.call(this,e),e.target=VE.TEXTURE_2D_ARRAY;for(var i=0;i<this.length;i++)this.items[i].on("update",e.update,e)},e.prototype.unbind=function(e){t.prototype.unbind.call(this,e);for(var i=0;i<this.length;i++)this.items[i].off("update",e.update,e)},e.prototype.load=function(){var t=this;if(this._load)return this._load;var e=this.items.map((function(t){return t.resource})),i=e.map((function(t){return t.load()}));return this._load=Promise.all(i).then((function(){var i=e[0],n=i.width,r=i.height;return t.resize(n,r),Promise.resolve(t)})),this._load},e.prototype.upload=function(t,e,i){var n=this,r=n.length,s=n.itemDirtyIds,o=n.items,a=t.gl;i.dirtyId<0&&a.texImage3D(a.TEXTURE_2D_ARRAY,0,e.format,this._width,this._height,r,0,e.format,e.type,null);for(var h=0;h<r;h++){var u=o[h];s[h]<u.dirtyId&&(s[h]=u.dirtyId,u.valid&&a.texSubImage3D(a.TEXTURE_2D_ARRAY,0,0,0,h,u.resource.width,u.resource.height,1,e.format,e.type,u.resource.source))}return!0},e}(cA),bA=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.test=function(t){var e=window.OffscreenCanvas;return!!(e&&t instanceof e)||t instanceof HTMLCanvasElement},e}(pA),wA=function(t){function e(i,n){if(n=n||{},t.call(this,i,n),this.length!==e.SIDES)throw new Error("Invalid length. Got "+this.length+", expected 6");for(var r=0;r<e.SIDES;r++)this.items[r].target=VE.TEXTURE_CUBE_MAP_POSITIVE_X+r;!1!==n.autoLoad&&this.load()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.bind=function(e){t.prototype.bind.call(this,e),e.target=VE.TEXTURE_CUBE_MAP},e.prototype.upload=function(t,i,n){for(var r=this.itemDirtyIds,s=0;s<e.SIDES;s++){var o=this.items[s];r[s]<o.dirtyId&&(r[s]=o.dirtyId,o.valid&&o.resource.upload(t,o,n))}return!0},e}(xA);wA.SIDES=6;var TA=function(t){function e(e,i){i=i||{},t.call(this,document.createElement("canvas")),this._width=0,this._height=0,this.svg=e,this.scale=i.scale||1,this._overrideWidth=i.width,this._overrideHeight=i.height,this._resolve=null,this._crossorigin=i.crossorigin,this._load=null,!1!==i.autoLoad&&this.load()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(){var t=this;return this._load||(this._load=new Promise((function(e){if(t._resolve=function(){t.resize(t.source.width,t.source.height),e(t)},/^\<svg/.test(t.svg.trim())){if(!btoa)throw new Error("Your browser doesn't support base64 conversions.");t.svg="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(t.svg)))}t._loadSvg()}))),this._load},e.prototype._loadSvg=function(){var e=this,i=new Image;t.crossOrigin(i,this.svg,this._crossorigin),i.src=this.svg,i.onerror=function(t){e._resolve&&(i.onerror=null,e.onError.run(t))},i.onload=function(){if(e._resolve){var t=i.width,n=i.height;if(!t||!n)throw new Error("The SVG image must have width and height defined (in pixels), canvas API needs them.");var r=t*e.scale,s=n*e.scale;(e._overrideWidth||e._overrideHeight)&&(r=e._overrideWidth||e._overrideHeight/n*t,s=e._overrideHeight||e._overrideWidth/t*n),r=Math.round(r),s=Math.round(s);var o=e.source;o.width=r,o.height=s,o._pixiId="canvas_"+vL(),o.getContext("2d").drawImage(i,0,0,t,n,0,0,r,s),e._resolve(),e._resolve=null}}},e.getSize=function(t){var i=e.SVG_SIZE.exec(t),n={};return i&&(n[i[1]]=Math.round(parseFloat(i[3])),n[i[5]]=Math.round(parseFloat(i[7]))),n},e.prototype.dispose=function(){t.prototype.dispose.call(this),this._resolve=null,this._crossorigin=null},e.test=function(t,e){return"svg"===e||"string"==typeof t&&0===t.indexOf("data:image/svg+xml;base64")||"string"==typeof t&&0===t.indexOf("<svg")},e}(pA);TA.SVG_SIZE=/<svg[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i;var MA=function(t){function e(e,i){if(i=i||{},!(e instanceof HTMLVideoElement)){var n=document.createElement("video");n.setAttribute("preload","auto"),n.setAttribute("webkit-playsinline",""),n.setAttribute("playsinline",""),"string"==typeof e&&(e=[e]),t.crossOrigin(n,e[0].src||e[0],i.crossorigin);for(var r=0;r<e.length;++r){var s=document.createElement("source"),o=e[r],a=o.src,h=o.mime,u=(a=a||e[r]).split("?").shift().toLowerCase(),l=u.substr(u.lastIndexOf(".")+1);h=h||"video/"+l,s.src=a,s.type=h,n.appendChild(s)}e=n}t.call(this,e),this.noSubImage=!0,this._autoUpdate=!0,this._isConnectedToTicker=!1,this._updateFPS=i.updateFPS||0,this._msToNextUpdate=0,this.autoPlay=!1!==i.autoPlay,this._load=null,this._resolve=null,this._onCanPlay=this._onCanPlay.bind(this),this._onError=this._onError.bind(this),!1!==i.autoLoad&&this.load()}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={autoUpdate:{configurable:!0},updateFPS:{configurable:!0}};return e.prototype.update=function(e){if(void 0===e&&(e=0),!this.destroyed){var i=$L.shared.elapsedMS*this.source.playbackRate;this._msToNextUpdate=Math.floor(this._msToNextUpdate-i),(!this._updateFPS||this._msToNextUpdate<=0)&&(t.prototype.update.call(this,e),this._msToNextUpdate=this._updateFPS?Math.floor(1e3/this._updateFPS):0)}},e.prototype.load=function(){var t=this;if(this._load)return this._load;var e=this.source;return(e.readyState===e.HAVE_ENOUGH_DATA||e.readyState===e.HAVE_FUTURE_DATA)&&e.width&&e.height&&(e.complete=!0),e.addEventListener("play",this._onPlayStart.bind(this)),e.addEventListener("pause",this._onPlayStop.bind(this)),this._isSourceReady()?this._onCanPlay():(e.addEventListener("canplay",this._onCanPlay),e.addEventListener("canplaythrough",this._onCanPlay),e.addEventListener("error",this._onError,!0)),this._load=new Promise((function(i){t.valid?i(t):(t._resolve=i,e.load())})),this._load},e.prototype._onError=function(){this.source.removeEventListener("error",this._onError,!0),this.onError.run(event)},e.prototype._isSourcePlaying=function(){var t=this.source;return t.currentTime>0&&!1===t.paused&&!1===t.ended&&t.readyState>2},e.prototype._isSourceReady=function(){return 3===this.source.readyState||4===this.source.readyState},e.prototype._onPlayStart=function(){this.valid||this._onCanPlay(),this.autoUpdate&&!this._isConnectedToTicker&&($L.shared.add(this.update,this),this._isConnectedToTicker=!0)},e.prototype._onPlayStop=function(){this._isConnectedToTicker&&($L.shared.remove(this.update,this),this._isConnectedToTicker=!1)},e.prototype._onCanPlay=function(){var t=this.source;t.removeEventListener("canplay",this._onCanPlay),t.removeEventListener("canplaythrough",this._onCanPlay);var e=this.valid;this.resize(t.videoWidth,t.videoHeight),!e&&this._resolve&&(this._resolve(this),this._resolve=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&t.play()},e.prototype.dispose=function(){this._isConnectedToTicker&&$L.shared.remove(this.update,this),this.source&&(this.source.removeEventListener("error",this._onError,!0),this.source.pause(),this.source.src="",this.source.load()),t.prototype.dispose.call(this)},i.autoUpdate.get=function(){return this._autoUpdate},i.autoUpdate.set=function(t){t!==this._autoUpdate&&(this._autoUpdate=t,!this._autoUpdate&&this._isConnectedToTicker?($L.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._isSourcePlaying()&&($L.shared.add(this.update,this),this._isConnectedToTicker=!0))},i.updateFPS.get=function(){return this._updateFPS},i.updateFPS.set=function(t){t!==this._updateFPS&&(this._updateFPS=t)},e.test=function(t,i){return t instanceof HTMLVideoElement||e.TYPES.indexOf(i)>-1},Object.defineProperties(e.prototype,i),e}(pA);MA.TYPES=["mp4","m4v","webm","ogg","ogv","h264","avi","mov"];var SA=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.test=function(t){return!!window.createImageBitmap&&t instanceof ImageBitmap},e}(pA);mA.push(fA,SA,bA,MA,TA,gA,wA,xA);var EA=function(t){this.renderer=t};EA.prototype.destroy=function(){this.renderer=null};var LA=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.upload=function(t,e,i){var n=t.gl;return n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e.alphaMode===KE.UNPACK),i.width===e.width&&i.height===e.height?n.texSubImage2D(e.target,0,0,0,e.width,e.height,e.format,e.type,this.data):(i.width=e.width,i.height=e.height,n.texImage2D(e.target,0,1===t.context.webGLVersion?n.DEPTH_COMPONENT:n.DEPTH_COMPONENT16,e.width,e.height,0,e.format,e.type,this.data)),!0},e}(gA),AA=function(t,e){this.width=Math.ceil(t||100),this.height=Math.ceil(e||100),this.stencil=!1,this.depth=!1,this.dirtyId=0,this.dirtyFormat=0,this.dirtySize=0,this.depthTexture=null,this.colorTextures=[],this.glFramebuffers={},this.disposeRunner=new lA("disposeFramebuffer",2)},DA={colorTexture:{configurable:!0}};DA.colorTexture.get=function(){return this.colorTextures[0]},AA.prototype.addColorTexture=function(t,e){return void 0===t&&(t=0),this.colorTextures[t]=e||new _A(null,{scaleMode:qE.NEAREST,resolution:1,mipmap:!1,width:this.width,height:this.height}),this.dirtyId++,this.dirtyFormat++,this},AA.prototype.addDepthTexture=function(t){return this.depthTexture=t||new _A(new LA(null,{width:this.width,height:this.height}),{scaleMode:qE.NEAREST,resolution:1,width:this.width,height:this.height,mipmap:!1,format:GE.DEPTH_COMPONENT,type:XE.UNSIGNED_SHORT}),this.dirtyId++,this.dirtyFormat++,this},AA.prototype.enableDepth=function(){return this.depth=!0,this.dirtyId++,this.dirtyFormat++,this},AA.prototype.enableStencil=function(){return this.stencil=!0,this.dirtyId++,this.dirtyFormat++,this},AA.prototype.resize=function(t,e){if(t=Math.ceil(t),e=Math.ceil(e),t!==this.width||e!==this.height){this.width=t,this.height=e,this.dirtyId++,this.dirtySize++;for(var i=0;i<this.colorTextures.length;i++){var n=this.colorTextures[i],r=n.resolution;n.setSize(t/r,e/r)}if(this.depthTexture){var s=this.depthTexture.resolution;this.depthTexture.setSize(t/s,e/s)}}},AA.prototype.dispose=function(){this.disposeRunner.run(this,!1)},Object.defineProperties(AA.prototype,DA);var PA=function(t){function e(e){if("number"==typeof e){var i=arguments[0],n=arguments[1],r=arguments[2],s=arguments[3];e={width:i,height:n,scaleMode:r,resolution:s}}t.call(this,null,e);var o=e||{},a=o.width,h=o.height;this.mipmap=!1,this.width=Math.ceil(a)||100,this.height=Math.ceil(h)||100,this.valid=!0,this._canvasRenderTarget=null,this.clearColor=[0,0,0,0],this.framebuffer=new AA(this.width*this.resolution,this.height*this.resolution).addColorTexture(0,this),this.maskStack=[],this.filterStack=[{}]}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.resize=function(t,e){t=Math.ceil(t),e=Math.ceil(e),this.framebuffer.resize(t*this.resolution,e*this.resolution)},e.prototype.dispose=function(){this.framebuffer.dispose(),t.prototype.dispose.call(this)},e.prototype.destroy=function(){t.prototype.destroy.call(this,!0),this.framebuffer=null},e}(_A),CA=function(){this.x0=0,this.y0=0,this.x1=1,this.y1=0,this.x2=1,this.y2=1,this.x3=0,this.y3=1,this.uvsFloat32=new Float32Array(8)};CA.prototype.set=function(t,e,i){var n=e.width,r=e.height;if(i){var s=t.width/2/n,o=t.height/2/r,a=t.x/n+s,h=t.y/r+o;i=BL.add(i,BL.NW),this.x0=a+s*BL.uX(i),this.y0=h+o*BL.uY(i),i=BL.add(i,2),this.x1=a+s*BL.uX(i),this.y1=h+o*BL.uY(i),i=BL.add(i,2),this.x2=a+s*BL.uX(i),this.y2=h+o*BL.uY(i),i=BL.add(i,2),this.x3=a+s*BL.uX(i),this.y3=h+o*BL.uY(i)}else this.x0=t.x/n,this.y0=t.y/r,this.x1=(t.x+t.width)/n,this.y1=t.y/r,this.x2=(t.x+t.width)/n,this.y2=(t.y+t.height)/r,this.x3=t.x/n,this.y3=(t.y+t.height)/r;this.uvsFloat32[0]=this.x0,this.uvsFloat32[1]=this.y0,this.uvsFloat32[2]=this.x1,this.uvsFloat32[3]=this.y1,this.uvsFloat32[4]=this.x2,this.uvsFloat32[5]=this.y2,this.uvsFloat32[6]=this.x3,this.uvsFloat32[7]=this.y3};var OA=new CA,kA=function(t){function e(i,n,r,s,o,a){if(t.call(this),this.noFrame=!1,n||(this.noFrame=!0,n=new jL(0,0,1,1)),i instanceof e&&(i=i.baseTexture),this.baseTexture=i,this._frame=n,this.trim=s,this.valid=!1,this.requiresUpdate=!1,this._uvs=OA,this.uvMatrix=null,this.orig=r||n,this._rotate=Number(o||0),!0===o)this._rotate=2;else if(this._rotate%2!=0)throw new Error("attempt to use diamond-shaped UVs. If you are sure, set rotation manually");this.defaultAnchor=a?new EL(a.x,a.y):new EL(0,0),this._updateID=0,this.textureCacheIds=[],i.valid?this.noFrame?i.valid&&this.onBaseTextureUpdated(i):this.frame=n:i.once("loaded",this.onBaseTextureUpdated,this),this.noFrame&&i.on("update",this.onBaseTextureUpdated,this)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={resolution:{configurable:!0},frame:{configurable:!0},rotate:{configurable:!0},width:{configurable:!0},height:{configurable:!0}};return e.prototype.update=function(){this.baseTexture.resource&&this.baseTexture.resource.update()},e.prototype.onBaseTextureUpdated=function(t){if(this.noFrame){if(!this.baseTexture.valid)return;this._frame.width=t.width,this._frame.height=t.height,this.valid=!0,this.updateUvs()}else this.frame=this._frame;this.emit("update",this)},e.prototype.destroy=function(t){if(this.baseTexture){if(t){var i=this.baseTexture.resource;i&&xL[i.url]&&e.removeFromCache(i.url),this.baseTexture.destroy()}this.baseTexture.off("loaded",this.onBaseTextureUpdated,this),this.baseTexture.off("update",this.onBaseTextureUpdated,this),this.baseTexture=null}this._frame=null,this._uvs=null,this.trim=null,this.orig=null,this.valid=!1,e.removeFromCache(this),this.textureCacheIds=null},e.prototype.clone=function(){return new e(this.baseTexture,this.frame.clone(),this.orig.clone(),this.trim&&this.trim.clone(),this.rotate,this.defaultAnchor)},e.prototype.updateUvs=function(){this._uvs===OA&&(this._uvs=new CA),this._uvs.set(this._frame,this.baseTexture,this.rotate),this._updateID++},e.from=function(t,i,n){void 0===i&&(i={}),void 0===n&&(n=IE.STRICT_TEXTURE_CACHE);var r="string"==typeof t,s=null;r?s=t:(t._pixiId||(t._pixiId="pixiid_"+vL()),s=t._pixiId);var o=xL[s];if(r&&n&&!o)throw new Error('The cacheId "'+s+'" does not exist in TextureCache.');return o||(i.resolution||(i.resolution=ML(t)),(o=new e(new _A(t,i))).baseTexture.cacheId=s,_A.addToCache(o.baseTexture,s),e.addToCache(o,s)),o},e.fromBuffer=function(t,i,n,r){return new e(_A.fromBuffer(t,i,n,r))},e.fromLoader=function(t,i,n){var r=new fA(t);r.url=i;var s=new e(new _A(r,{scaleMode:IE.SCALE_MODE,resolution:ML(i)}));return n||(n=i),_A.addToCache(s.baseTexture,n),e.addToCache(s,n),n!==i&&(_A.addToCache(s.baseTexture,i),e.addToCache(s,i)),s},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),xL[e]&&console.warn("Texture added to the cache with an id ["+e+"] that already had an entry"),xL[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=xL[t];if(e){var i=e.textureCacheIds.indexOf(t);return i>-1&&e.textureCacheIds.splice(i,1),delete xL[t],e}}else if(t&&t.textureCacheIds){for(var n=0;n<t.textureCacheIds.length;++n)xL[t.textureCacheIds[n]]===t&&delete xL[t.textureCacheIds[n]];return t.textureCacheIds.length=0,t}return null},i.resolution.get=function(){return this.baseTexture.resolution},i.frame.get=function(){return this._frame},i.frame.set=function(t){this._frame=t,this.noFrame=!1;var e=t.x,i=t.y,n=t.width,r=t.height,s=e+n>this.baseTexture.width,o=i+r>this.baseTexture.height;if(s||o){var a=s&&o?"and":"or",h="X: "+e+" + "+n+" = "+(e+n)+" > "+this.baseTexture.width,u="Y: "+i+" + "+r+" = "+(i+r)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+h+" "+a+" "+u)}this.valid=n&&r&&this.baseTexture.valid,this.trim||this.rotate||(this.orig=t),this.valid&&this.updateUvs()},i.rotate.get=function(){return this._rotate},i.rotate.set=function(t){this._rotate=t,this.valid&&this.updateUvs()},i.width.get=function(){return this.orig.width},i.height.get=function(){return this.orig.height},Object.defineProperties(e.prototype,i),e}(FE());function RA(t){t.destroy=function(){},t.on=function(){},t.once=function(){},t.emit=function(){}}kA.EMPTY=new kA(new _A),RA(kA.EMPTY),RA(kA.EMPTY.baseTexture),kA.WHITE=function(){var t=document.createElement("canvas");t.width=16,t.height=16;var e=t.getContext("2d");return e.fillStyle="white",e.fillRect(0,0,16,16),new kA(new _A(new bA(t)))}(),RA(kA.WHITE),RA(kA.WHITE.baseTexture);var IA=function(t){function e(e,i){var n=null;if(!(e instanceof PA)){var r=arguments[1],s=arguments[2],o=arguments[3],a=arguments[4];console.warn("Please use RenderTexture.create("+r+", "+s+") instead of the ctor directly."),n=arguments[0],i=null,e=new PA({width:r,height:s,scaleMode:o,resolution:a})}t.call(this,e,i),this.legacyRenderer=n,this.valid=!0,this.filterFrame=null,this.filterPoolKey=null,this.updateUvs()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.resize=function(t,e,i){void 0===i&&(i=!0),t=Math.ceil(t),e=Math.ceil(e),this.valid=t>0&&e>0,this._frame.width=this.orig.width=t,this._frame.height=this.orig.height=e,i&&this.baseTexture.resize(t,e),this.updateUvs()},e.prototype.setResolution=function(t){var e=this.baseTexture;e.resolution!==t&&(e.setResolution(t),this.resize(e.width,e.height,!1))},e.create=function(t){return"number"==typeof t&&(t={width:t,height:arguments[1],scaleMode:arguments[2],resolution:arguments[3]}),new e(new PA(t))},e}(kA),YA=function(t){this.texturePool={},this.textureOptions=t||{},this.enableFullScreen=!1,this._pixelsWidth=0,this._pixelsHeight=0};YA.prototype.createTexture=function(t,e){var i=new PA(Object.assign({width:t,height:e,resolution:1},this.textureOptions));return new IA(i)},YA.prototype.getOptimalTexture=function(t,e,i){void 0===i&&(i=1);var n=YA.SCREEN_KEY;t*=i,e*=i,this.enableFullScreen&&t===this._pixelsWidth&&e===this._pixelsHeight||(n=(65535&(t=lL(t)))<<16|65535&(e=lL(e))),this.texturePool[n]||(this.texturePool[n]=[]);var r=this.texturePool[n].pop();return r||(r=this.createTexture(t,e)),r.filterPoolKey=n,r.setResolution(i),r},YA.prototype.getFilterTexture=function(t,e){var i=this.getOptimalTexture(t.width,t.height,e||t.resolution);return i.filterFrame=t.filterFrame,i},YA.prototype.returnTexture=function(t){var e=t.filterPoolKey;t.filterFrame=null,this.texturePool[e].push(t)},YA.prototype.returnFilterTexture=function(t){this.returnTexture(t)},YA.prototype.clear=function(t){if(t=!1!==t)for(var e in this.texturePool){var i=this.texturePool[e];if(i)for(var n=0;n<i.length;n++)i[n].destroy(!0)}this.texturePool={}},YA.prototype.setScreenSize=function(t){if(t.width!==this._pixelsWidth||t.height!==this._pixelsHeight){var e=YA.SCREEN_KEY,i=this.texturePool[e];if(this.enableFullScreen=t.width>0&&t.height>0,i)for(var n=0;n<i.length;n++)i[n].destroy(!0);this.texturePool[e]=[],this._pixelsWidth=t.width,this._pixelsHeight=t.height}},YA.SCREEN_KEY="screen";var FA=function(t,e,i,n,r,s,o){void 0===i&&(i=!1),void 0===n&&(n=5126),this.buffer=t,this.size=e,this.normalized=i,this.type=n,this.stride=r,this.start=s,this.instance=o};FA.prototype.destroy=function(){this.buffer=null},FA.from=function(t,e,i,n,r){return new FA(t,e,i,n,r)};var NA=0,BA=function(t,e,i){void 0===e&&(e=!0),void 0===i&&(i=!1),this.data=t||new Float32Array(1),this._glBuffers={},this._updateID=0,this.index=i,this.static=e,this.id=NA++,this.disposeRunner=new lA("disposeBuffer",2)};function UA(t){if(4===t.BYTES_PER_ELEMENT)return t instanceof Float32Array?"Float32Array":t instanceof Uint32Array?"Uint32Array":"Int32Array";if(2===t.BYTES_PER_ELEMENT){if(t instanceof Uint16Array)return"Uint16Array"}else if(1===t.BYTES_PER_ELEMENT&&t instanceof Uint8Array)return"Uint8Array";return null}BA.prototype.update=function(t){this.data=t||this.data,this._updateID++},BA.prototype.dispose=function(){this.disposeRunner.run(this,!1)},BA.prototype.destroy=function(){this.dispose(),this.data=null},BA.from=function(t){return t instanceof Array&&(t=new Float32Array(t)),new BA(t)};var jA={Float32Array,Uint32Array,Int32Array,Uint8Array};var HA={5126:4,5123:2,5121:1},zA=0,WA={Float32Array,Uint32Array,Int32Array,Uint8Array,Uint16Array},GA=function(t,e){void 0===t&&(t=[]),void 0===e&&(e={}),this.buffers=t,this.indexBuffer=null,this.attributes=e,this.glVertexArrayObjects={},this.id=zA++,this.instanced=!1,this.instanceCount=1,this.disposeRunner=new lA("disposeGeometry",2),this.refCount=0};GA.prototype.addAttribute=function(t,e,i,n,r,s,o,a){if(void 0===n&&(n=!1),void 0===a&&(a=!1),!e)throw new Error("You must pass a buffer when creating an attribute");e.data||(e instanceof Array&&(e=new Float32Array(e)),e=new BA(e));var h=t.split("|");if(h.length>1){for(var u=0;u<h.length;u++)this.addAttribute(h[u],e,i,n,r);return this}var l=this.buffers.indexOf(e);return-1===l&&(this.buffers.push(e),l=this.buffers.length-1),this.attributes[t]=new FA(l,i,n,r,s,o,a),this.instanced=this.instanced||a,this},GA.prototype.getAttribute=function(t){return this.attributes[t]},GA.prototype.getBuffer=function(t){return this.buffers[this.getAttribute(t).buffer]},GA.prototype.addIndex=function(t){return t.data||(t instanceof Array&&(t=new Uint16Array(t)),t=new BA(t)),t.index=!0,this.indexBuffer=t,-1===this.buffers.indexOf(t)&&this.buffers.push(t),this},GA.prototype.getIndex=function(){return this.indexBuffer},GA.prototype.interleave=function(){if(1===this.buffers.length||2===this.buffers.length&&this.indexBuffer)return this;var t,e=[],i=[],n=new BA;for(t in this.attributes){var r=this.attributes[t],s=this.buffers[r.buffer];e.push(s.data),i.push(r.size*HA[r.type]/4),r.buffer=0}for(n.data=function(t,e){for(var i=0,n=0,r={},s=0;s<t.length;s++)n+=e[s],i+=t[s].length;for(var o=new ArrayBuffer(4*i),a=null,h=0,u=0;u<t.length;u++){var l=e[u],c=t[u],d=UA(c);r[d]||(r[d]=new jA[d](o)),a=r[d];for(var p=0;p<c.length;p++)a[(p/l|0)*n+h+p%l]=c[p];h+=l}return new Float32Array(o)}(e,i),t=0;t<this.buffers.length;t++)this.buffers[t]!==this.indexBuffer&&this.buffers[t].destroy();return this.buffers=[n],this.indexBuffer&&this.buffers.push(this.indexBuffer),this},GA.prototype.getSize=function(){for(var t in this.attributes){var e=this.attributes[t];return this.buffers[e.buffer].data.length/(e.stride/4||e.size)}return 0},GA.prototype.dispose=function(){this.disposeRunner.run(this,!1)},GA.prototype.destroy=function(){this.dispose(),this.buffers=null,this.indexBuffer=null,this.attributes=null},GA.prototype.clone=function(){for(var t=new GA,e=0;e<this.buffers.length;e++)t.buffers[e]=new BA(this.buffers[e].data.slice());for(var i in this.attributes){var n=this.attributes[i];t.attributes[i]=new FA(n.buffer,n.size,n.normalized,n.type,n.stride,n.start,n.instance)}return this.indexBuffer&&(t.indexBuffer=t.buffers[this.buffers.indexOf(this.indexBuffer)],t.indexBuffer.index=!0),t},GA.merge=function(t){for(var e,i=new GA,n=[],r=[],s=[],o=0;o<t.length;o++){e=t[o];for(var a=0;a<e.buffers.length;a++)r[a]=r[a]||0,r[a]+=e.buffers[a].data.length,s[a]=0}for(var h=0;h<e.buffers.length;h++)n[h]=new(WA[UA(e.buffers[h].data)])(r[h]),i.buffers[h]=new BA(n[h]);for(var u=0;u<t.length;u++){e=t[u];for(var l=0;l<e.buffers.length;l++)n[l].set(e.buffers[l].data,s[l]),s[l]+=e.buffers[l].data.length}if(i.attributes=e.attributes,e.indexBuffer){i.indexBuffer=i.buffers[e.buffers.indexOf(e.indexBuffer)],i.indexBuffer.index=!0;for(var c=0,d=0,p=0,f=0,m=0;m<e.buffers.length;m++)if(e.buffers[m]!==e.indexBuffer){f=m;break}for(var v in e.attributes){var g=e.attributes[v];(0|g.buffer)===f&&(d+=g.size*HA[g.type]/4)}for(var y=0;y<t.length;y++){for(var _=t[y].indexBuffer.data,x=0;x<_.length;x++)i.indexBuffer.data[x+p]+=c;c+=e.buffers[f].data.length/d,p+=_.length}}return i};var VA=function(t){function e(){t.call(this),this.addAttribute("aVertexPosition",[0,0,1,0,1,1,0,1]).addIndex([0,1,3,2])}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(GA),XA=function(t){function e(){t.call(this),this.vertices=new Float32Array([-1,-1,1,-1,1,1,-1,1]),this.uvs=new Float32Array([0,0,1,0,1,1,0,1]),this.vertexBuffer=new BA(this.vertices),this.uvBuffer=new BA(this.uvs),this.addAttribute("aVertexPosition",this.vertexBuffer).addAttribute("aTextureCoord",this.uvBuffer).addIndex([0,1,2,0,2,3])}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.map=function(t,e){var i=0,n=0;return this.uvs[0]=i,this.uvs[1]=n,this.uvs[2]=i+e.width/t.width,this.uvs[3]=n,this.uvs[4]=i+e.width/t.width,this.uvs[5]=n+e.height/t.height,this.uvs[6]=i,this.uvs[7]=n+e.height/t.height,i=e.x,n=e.y,this.vertices[0]=i,this.vertices[1]=n,this.vertices[2]=i+e.width,this.vertices[3]=n,this.vertices[4]=i+e.width,this.vertices[5]=n+e.height,this.vertices[6]=i,this.vertices[7]=n+e.height,this.invalidate(),this},e.prototype.invalidate=function(){return this.vertexBuffer._updateID++,this.uvBuffer._updateID++,this},e}(GA),qA=0,JA=function(t,e){this.uniforms=t,this.group=!0,this.syncUniforms={},this.dirtyId=0,this.id=qA++,this.static=!!e};JA.prototype.update=function(){this.dirtyId++},JA.prototype.add=function(t,e,i){this.uniforms[t]=new JA(e,i)},JA.from=function(t,e){return new JA(t,e)};var ZA=function(){this.renderTexture=null,this.target=null,this.legacy=!1,this.resolution=1,this.sourceFrame=new jL,this.destinationFrame=new jL,this.filters=[]};ZA.prototype.clear=function(){this.target=null,this.filters=null,this.renderTexture=null};var KA=function(t){function e(e){t.call(this,e),this.defaultFilterStack=[{}],this.texturePool=new YA,this.texturePool.setScreenSize(e.view),this.statePool=[],this.quad=new VA,this.quadUv=new XA,this.tempRect=new jL,this.activeState={},this.globalUniforms=new JA({outputFrame:this.tempRect,inputSize:new Float32Array(4),inputPixel:new Float32Array(4),inputClamp:new Float32Array(4),resolution:1,filterArea:new Float32Array(4),filterClamp:new Float32Array(4)},!0),this.forceClear=!1,this.useMaxPadding=!1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e){for(var i=this.renderer,n=this.defaultFilterStack,r=this.statePool.pop()||new ZA,s=e[0].resolution,o=e[0].padding,a=e[0].autoFit,h=e[0].legacy,u=1;u<e.length;u++){var l=e[u];s=Math.min(s,l.resolution),o=this.useMaxPadding?Math.max(o,l.padding):o+l.padding,a=a||l.autoFit,h=h||l.legacy}1===n.length&&(this.defaultFilterStack[0].renderTexture=i.renderTexture.current),n.push(r),r.resolution=s,r.legacy=h,r.target=t,r.sourceFrame.copyFrom(t.filterArea||t.getBounds(!0)),r.sourceFrame.pad(o),a&&r.sourceFrame.fit(this.renderer.renderTexture.sourceFrame),r.sourceFrame.ceil(s),r.renderTexture=this.getOptimalFilterTexture(r.sourceFrame.width,r.sourceFrame.height,s),r.filters=e,r.destinationFrame.width=r.renderTexture.width,r.destinationFrame.height=r.renderTexture.height,r.renderTexture.filterFrame=r.sourceFrame,i.renderTexture.bind(r.renderTexture,r.sourceFrame),i.renderTexture.clear()},e.prototype.pop=function(){var t=this.defaultFilterStack,e=t.pop(),i=e.filters;this.activeState=e;var n=this.globalUniforms.uniforms;n.outputFrame=e.sourceFrame,n.resolution=e.resolution;var r=n.inputSize,s=n.inputPixel,o=n.inputClamp;if(r[0]=e.destinationFrame.width,r[1]=e.destinationFrame.height,r[2]=1/r[0],r[3]=1/r[1],s[0]=r[0]*e.resolution,s[1]=r[1]*e.resolution,s[2]=1/s[0],s[3]=1/s[1],o[0]=.5*s[2],o[1]=.5*s[3],o[2]=e.sourceFrame.width*r[2]-.5*s[2],o[3]=e.sourceFrame.height*r[3]-.5*s[3],e.legacy){var a=n.filterArea;a[0]=e.destinationFrame.width,a[1]=e.destinationFrame.height,a[2]=e.sourceFrame.x,a[3]=e.sourceFrame.y,n.filterClamp=n.inputClamp}this.globalUniforms.update();var h=t[t.length-1];if(1===i.length)i[0].apply(this,e.renderTexture,h.renderTexture,!1,e),this.returnFilterTexture(e.renderTexture);else{var u=e.renderTexture,l=this.getOptimalFilterTexture(u.width,u.height,e.resolution);l.filterFrame=u.filterFrame;var c=0;for(c=0;c<i.length-1;++c){i[c].apply(this,u,l,!0,e);var d=u;u=l,l=d}i[c].apply(this,u,h.renderTexture,!1,e),this.returnFilterTexture(u),this.returnFilterTexture(l)}e.clear(),this.statePool.push(e)},e.prototype.applyFilter=function(t,e,i,n){var r=this.renderer;r.renderTexture.bind(i,i?i.filterFrame:null),n&&r.renderTexture.clear(),t.uniforms.uSampler=e,t.uniforms.filterGlobals=this.globalUniforms,r.state.set(t.state),r.shader.bind(t),t.legacy?(this.quadUv.map(e._frame,e.filterFrame),r.geometry.bind(this.quadUv),r.geometry.draw(WE.TRIANGLES)):(r.geometry.bind(this.quad),r.geometry.draw(WE.TRIANGLE_STRIP))},e.prototype.calculateSpriteMatrix=function(t,e){var i=this.activeState,n=i.sourceFrame,r=i.destinationFrame,s=e._texture.orig,o=t.set(r.width,0,0,r.height,n.x,n.y),a=e.worldTransform.copyTo(CL.TEMP_MATRIX);return a.invert(),o.prepend(a),o.scale(1/s.width,1/s.height),o.translate(e.anchor.x,e.anchor.y),o},e.prototype.destroy=function(){this.texturePool.clear(!1)},e.prototype.getOptimalFilterTexture=function(t,e,i){return void 0===i&&(i=1),this.texturePool.getOptimalTexture(t,e,i)},e.prototype.getFilterTexture=function(t,e){if("number"==typeof t){var i=t;t=e,e=i}t=t||this.activeState.renderTexture;var n=this.texturePool.getOptimalTexture(t.width,t.height,e||t.resolution);return n.filterFrame=t.filterFrame,n},e.prototype.returnFilterTexture=function(t){this.texturePool.returnTexture(t)},e.prototype.emptyPool=function(){this.texturePool.clear(!0)},e.prototype.resize=function(){this.texturePool.setScreenSize(this.renderer.view)},e}(EA),QA=function(t){this.renderer=t};QA.prototype.flush=function(){},QA.prototype.destroy=function(){this.renderer=null},QA.prototype.start=function(){},QA.prototype.stop=function(){this.flush()},QA.prototype.render=function(t){};var $A=function(t){function e(e){t.call(this,e),this.emptyRenderer=new QA(e),this.currentRenderer=this.emptyRenderer}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setObjectRenderer=function(t){this.currentRenderer!==t&&(this.currentRenderer.stop(),this.currentRenderer=t,this.currentRenderer.start())},e.prototype.flush=function(){this.setObjectRenderer(this.emptyRenderer)},e.prototype.reset=function(){this.setObjectRenderer(this.emptyRenderer)},e.prototype.copyBoundTextures=function(t,e){for(var i=this.renderer.texture.boundTextures,n=e-1;n>=0;--n)t[n]=i[n]||null,t[n]&&(t[n]._batchLocation=n)},e.prototype.boundArray=function(t,e,i,n){for(var r=t.elements,s=t.ids,o=t.count,a=0,h=0;h<o;h++){var u=r[h],l=u._batchLocation;if(l>=0&&l<n&&e[l]===u)s[h]=l;else for(;a<n;){var c=e[a];if(!c||c._batchEnabled!==i||c._batchLocation!==a){s[h]=a,u._batchLocation=a,e[a]=u;break}a++}}},e}(EA);IE.PREFER_ENV=RE.any?jE.WEBGL:jE.WEBGL2,IE.STRICT_TEXTURE_CACHE=!1;var tD=0,eD=function(t){function e(e){t.call(this,e),this.webGLVersion=1,this.extensions={},this.handleContextLost=this.handleContextLost.bind(this),this.handleContextRestored=this.handleContextRestored.bind(this),e.view.addEventListener("webglcontextlost",this.handleContextLost,!1),e.view.addEventListener("webglcontextrestored",this.handleContextRestored,!1)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={isLost:{configurable:!0}};return i.isLost.get=function(){return!this.gl||this.gl.isContextLost()},e.prototype.contextChange=function(t){this.gl=t,this.renderer.gl=t,this.renderer.CONTEXT_UID=tD++,t.isContextLost()&&t.getExtension("WEBGL_lose_context")&&t.getExtension("WEBGL_lose_context").restoreContext()},e.prototype.initFromContext=function(t){this.gl=t,this.validateContext(t),this.renderer.gl=t,this.renderer.CONTEXT_UID=tD++,this.renderer.runners.contextChange.run(t)},e.prototype.initFromOptions=function(t){var e=this.createContext(this.renderer.view,t);this.initFromContext(e)},e.prototype.createContext=function(t,e){var i;if(IE.PREFER_ENV>=jE.WEBGL2&&(i=t.getContext("webgl2",e)),i)this.webGLVersion=2;else if(this.webGLVersion=1,!(i=t.getContext("webgl",e)||t.getContext("experimental-webgl",e)))throw new Error("This browser does not support WebGL. Try using the canvas renderer");return this.gl=i,this.getExtensions(),i},e.prototype.getExtensions=function(){var t=this.gl;1===this.webGLVersion?Object.assign(this.extensions,{drawBuffers:t.getExtension("WEBGL_draw_buffers"),depthTexture:t.getExtension("WEBGL_depth_texture"),loseContext:t.getExtension("WEBGL_lose_context"),vertexArrayObject:t.getExtension("OES_vertex_array_object")||t.getExtension("MOZ_OES_vertex_array_object")||t.getExtension("WEBKIT_OES_vertex_array_object"),anisotropicFiltering:t.getExtension("EXT_texture_filter_anisotropic"),uint32ElementIndex:t.getExtension("OES_element_index_uint"),floatTexture:t.getExtension("OES_texture_float"),floatTextureLinear:t.getExtension("OES_texture_float_linear"),textureHalfFloat:t.getExtension("OES_texture_half_float"),textureHalfFloatLinear:t.getExtension("OES_texture_half_float_linear")}):2===this.webGLVersion&&Object.assign(this.extensions,{anisotropicFiltering:t.getExtension("EXT_texture_filter_anisotropic"),colorBufferFloat:t.getExtension("EXT_color_buffer_float"),floatTextureLinear:t.getExtension("OES_texture_float_linear")})},e.prototype.handleContextLost=function(t){t.preventDefault()},e.prototype.handleContextRestored=function(){this.renderer.runners.contextChange.run(this.gl)},e.prototype.destroy=function(){var t=this.renderer.view;t.removeEventListener("webglcontextlost",this.handleContextLost),t.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),this.extensions.loseContext&&this.extensions.loseContext.loseContext()},e.prototype.postrender=function(){this.renderer.renderingToScreen&&this.gl.flush()},e.prototype.validateContext=function(t){t.getContextAttributes().stencil||console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly")},Object.defineProperties(e.prototype,i),e}(EA),iD=function(t){function e(e){t.call(this,e),this.managedFramebuffers=[],this.unknownFramebuffer=new AA(10,10)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={size:{configurable:!0}};return e.prototype.contextChange=function(){var t=this.gl=this.renderer.gl;if(this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.current=this.unknownFramebuffer,this.viewport=new jL,this.hasMRT=!0,this.writeDepthTexture=!0,this.disposeAll(!0),1===this.renderer.context.webGLVersion){var e=this.renderer.context.extensions.drawBuffers,i=this.renderer.context.extensions.depthTexture;IE.PREFER_ENV===jE.WEBGL_LEGACY&&(e=null,i=null),e?t.drawBuffers=function(t){return e.drawBuffersWEBGL(t)}:(this.hasMRT=!1,t.drawBuffers=function(){}),i||(this.writeDepthTexture=!1)}},e.prototype.bind=function(t,e){var i=this.gl;if(t){var n=t.glFramebuffers[this.CONTEXT_UID]||this.initFramebuffer(t);this.current!==t&&(this.current=t,i.bindFramebuffer(i.FRAMEBUFFER,n.framebuffer)),n.dirtyId!==t.dirtyId&&(n.dirtyId=t.dirtyId,n.dirtyFormat!==t.dirtyFormat?(n.dirtyFormat=t.dirtyFormat,this.updateFramebuffer(t)):n.dirtySize!==t.dirtySize&&(n.dirtySize=t.dirtySize,this.resizeFramebuffer(t)));for(var r=0;r<t.colorTextures.length;r++)t.colorTextures[r].texturePart?this.renderer.texture.unbind(t.colorTextures[r].texture):this.renderer.texture.unbind(t.colorTextures[r]);t.depthTexture&&this.renderer.texture.unbind(t.depthTexture),e?this.setViewport(e.x,e.y,e.width,e.height):this.setViewport(0,0,t.width,t.height)}else this.current&&(this.current=null,i.bindFramebuffer(i.FRAMEBUFFER,null)),e?this.setViewport(e.x,e.y,e.width,e.height):this.setViewport(0,0,this.renderer.width,this.renderer.height)},e.prototype.setViewport=function(t,e,i,n){var r=this.viewport;r.width===i&&r.height===n&&r.x===t&&r.y===e||(r.x=t,r.y=e,r.width=i,r.height=n,this.gl.viewport(t,e,i,n))},i.size.get=function(){return this.current?{x:0,y:0,width:this.current.width,height:this.current.height}:{x:0,y:0,width:this.renderer.width,height:this.renderer.height}},e.prototype.clear=function(t,e,i,n){var r=this.gl;r.clearColor(t,e,i,n),r.clear(r.COLOR_BUFFER_BIT|r.DEPTH_BUFFER_BIT)},e.prototype.initFramebuffer=function(t){var e={framebuffer:this.gl.createFramebuffer(),stencil:null,dirtyId:0,dirtyFormat:0,dirtySize:0};return t.glFramebuffers[this.CONTEXT_UID]=e,this.managedFramebuffers.push(t),t.disposeRunner.add(this),e},e.prototype.resizeFramebuffer=function(t){var e=this.gl,i=t.glFramebuffers[this.CONTEXT_UID];i.stencil&&(e.bindRenderbuffer(e.RENDERBUFFER,i.stencil),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,t.width,t.height));for(var n=t.colorTextures,r=0;r<n.length;r++)this.renderer.texture.bind(n[r],0);t.depthTexture&&this.renderer.texture.bind(t.depthTexture,0)},e.prototype.updateFramebuffer=function(t){var e=this.gl,i=t.glFramebuffers[this.CONTEXT_UID],n=t.colorTextures.length;e.drawBuffers||(n=Math.min(n,1));for(var r=[],s=0;s<n;s++){var o=t.colorTextures[s];o.texturePart?(this.renderer.texture.bind(o.texture,0),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+s,e.TEXTURE_CUBE_MAP_NEGATIVE_X+o.side,o.texture._glTextures[this.CONTEXT_UID].texture,0)):(this.renderer.texture.bind(o,0),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0+s,e.TEXTURE_2D,o._glTextures[this.CONTEXT_UID].texture,0)),r.push(e.COLOR_ATTACHMENT0+s)}if((r.length>1&&e.drawBuffers(r),t.depthTexture)&&this.writeDepthTexture){var a=t.depthTexture;this.renderer.texture.bind(a,0),e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,a._glTextures[this.CONTEXT_UID].texture,0)}i.stencil||!t.stencil&&!t.depth||(i.stencil=e.createRenderbuffer(),e.bindRenderbuffer(e.RENDERBUFFER,i.stencil),e.renderbufferStorage(e.RENDERBUFFER,e.DEPTH_STENCIL,t.width,t.height),t.depthTexture||e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.RENDERBUFFER,i.stencil))},e.prototype.disposeFramebuffer=function(t,e){var i=t.glFramebuffers[this.CONTEXT_UID],n=this.gl;if(i){delete t.glFramebuffers[this.CONTEXT_UID];var r=this.managedFramebuffers.indexOf(t);r>=0&&this.managedFramebuffers.splice(r,1),t.disposeRunner.remove(this),e||(n.deleteFramebuffer(i.framebuffer),i.stencil&&n.deleteRenderbuffer(i.stencil))}},e.prototype.disposeAll=function(t){var e=this.managedFramebuffers;this.managedFramebuffers=[];for(var i=0;i<e.length;i++)this.disposeFramebuffer(e[i],t)},e.prototype.forceStencil=function(){var t=this.current;if(t){var e=t.glFramebuffers[this.CONTEXT_UID];if(e&&!e.stencil){t.enableStencil();var i=t.width,n=t.height,r=this.gl,s=r.createRenderbuffer();r.bindRenderbuffer(r.RENDERBUFFER,s),r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,i,n),e.stencil=s,r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,s)}}},e.prototype.reset=function(){this.current=this.unknownFramebuffer,this.viewport=new jL},Object.defineProperties(e.prototype,i),e}(EA),nD=function(t){this.buffer=t,this.updateID=-1,this.byteLength=-1,this.refCount=0},rD={5126:4,5123:2,5121:1},sD=function(t){function e(e){t.call(this,e),this._activeGeometry=null,this._activeVao=null,this.hasVao=!0,this.hasInstance=!0,this.canUseUInt32ElementIndex=!1,this.boundBuffers={},this.managedGeometries={},this.managedBuffers={}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.contextChange=function(){this.disposeAll(!0);var t=this.gl=this.renderer.gl,e=this.renderer.context;if(this.CONTEXT_UID=this.renderer.CONTEXT_UID,!t.createVertexArray){var i=this.renderer.context.extensions.vertexArrayObject;IE.PREFER_ENV===jE.WEBGL_LEGACY&&(i=null),i?(t.createVertexArray=function(){return i.createVertexArrayOES()},t.bindVertexArray=function(t){return i.bindVertexArrayOES(t)},t.deleteVertexArray=function(t){return i.deleteVertexArrayOES(t)}):(this.hasVao=!1,t.createVertexArray=function(){},t.bindVertexArray=function(){},t.deleteVertexArray=function(){})}if(!t.vertexAttribDivisor){var n=t.getExtension("ANGLE_instanced_arrays");n?(t.vertexAttribDivisor=function(t,e){return n.vertexAttribDivisorANGLE(t,e)},t.drawElementsInstanced=function(t,e,i,r,s){return n.drawElementsInstancedANGLE(t,e,i,r,s)},t.drawArraysInstanced=function(t,e,i,r){return n.drawArraysInstancedANGLE(t,e,i,r)}):this.hasInstance=!1}this.canUseUInt32ElementIndex=2===e.webGLVersion||!!e.extensions.uint32ElementIndex},e.prototype.bind=function(t,e){e=e||this.renderer.shader.shader;var i=this.gl,n=t.glVertexArrayObjects[this.CONTEXT_UID];n||(this.managedGeometries[t.id]=t,t.disposeRunner.add(this),t.glVertexArrayObjects[this.CONTEXT_UID]=n={});var r=n[e.program.id]||this.initGeometryVao(t,e.program);this._activeGeometry=t,this._activeVao!==r&&(this._activeVao=r,this.hasVao?i.bindVertexArray(r):this.activateVao(t,e.program)),this.updateBuffers()},e.prototype.reset=function(){this.unbind()},e.prototype.updateBuffers=function(){for(var t=this._activeGeometry,e=this.gl,i=0;i<t.buffers.length;i++){var n=t.buffers[i],r=n._glBuffers[this.CONTEXT_UID];if(n._updateID!==r.updateID){r.updateID=n._updateID;var s=n.index?e.ELEMENT_ARRAY_BUFFER:e.ARRAY_BUFFER;if(e.bindBuffer(s,r.buffer),this._boundBuffer=r,r.byteLength>=n.data.byteLength)e.bufferSubData(s,0,n.data);else{var o=n.static?e.STATIC_DRAW:e.DYNAMIC_DRAW;r.byteLength=n.data.byteLength,e.bufferData(s,n.data,o)}}}},e.prototype.checkCompatibility=function(t,e){var i=t.attributes,n=e.attributeData;for(var r in n)if(!i[r])throw new Error('shader and geometry incompatible, geometry missing the "'+r+'" attribute')},e.prototype.getSignature=function(t,e){var i=t.attributes,n=e.attributeData,r=["g",t.id];for(var s in i)n[s]&&r.push(s);return r.join("-")},e.prototype.initGeometryVao=function(t,e){this.checkCompatibility(t,e);var i=this.gl,n=this.CONTEXT_UID,r=this.getSignature(t,e),s=t.glVertexArrayObjects[this.CONTEXT_UID],o=s[r];if(o)return s[e.id]=o,o;var a=t.buffers,h=t.attributes,u={},l={};for(var c in a)u[c]=0,l[c]=0;for(var d in h)!h[d].size&&e.attributeData[d]?h[d].size=e.attributeData[d].size:h[d].size||console.warn("PIXI Geometry attribute '"+d+"' size cannot be determined (likely the bound shader does not have the attribute)"),u[h[d].buffer]+=h[d].size*rD[h[d].type];for(var p in h){var f=h[p],m=f.size;void 0===f.stride&&(u[f.buffer]===m*rD[f.type]?f.stride=0:f.stride=u[f.buffer]),void 0===f.start&&(f.start=l[f.buffer],l[f.buffer]+=m*rD[f.type])}o=i.createVertexArray(),i.bindVertexArray(o);for(var v=0;v<a.length;v++){var g=a[v];g._glBuffers[n]||(g._glBuffers[n]=new nD(i.createBuffer()),this.managedBuffers[g.id]=g,g.disposeRunner.add(this)),g._glBuffers[n].refCount++}return this.activateVao(t,e),this._activeVao=o,s[e.id]=o,s[r]=o,o},e.prototype.disposeBuffer=function(t,e){if(this.managedBuffers[t.id]){delete this.managedBuffers[t.id];var i=t._glBuffers[this.CONTEXT_UID],n=this.gl;t.disposeRunner.remove(this),i&&(e||n.deleteBuffer(i.buffer),delete t._glBuffers[this.CONTEXT_UID])}},e.prototype.disposeGeometry=function(t,e){if(this.managedGeometries[t.id]){delete this.managedGeometries[t.id];var i=t.glVertexArrayObjects[this.CONTEXT_UID],n=this.gl,r=t.buffers;if(t.disposeRunner.remove(this),i){for(var s=0;s<r.length;s++){var o=r[s]._glBuffers[this.CONTEXT_UID];o.refCount--,0!==o.refCount||e||this.disposeBuffer(r[s],e)}if(!e)for(var a in i)if("g"===a[0]){var h=i[a];this._activeVao===h&&this.unbind(),n.deleteVertexArray(h)}delete t.glVertexArrayObjects[this.CONTEXT_UID]}}},e.prototype.disposeAll=function(t){for(var e=Object.keys(this.managedGeometries),i=0;i<e.length;i++)this.disposeGeometry(this.managedGeometries[e[i]],t);e=Object.keys(this.managedBuffers);for(var n=0;n<e.length;n++)this.disposeBuffer(this.managedBuffers[e[n]],t)},e.prototype.activateVao=function(t,e){var i=this.gl,n=this.CONTEXT_UID,r=t.buffers,s=t.attributes;t.indexBuffer&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.indexBuffer._glBuffers[n].buffer);var o=null;for(var a in s){var h=s[a],u=r[h.buffer]._glBuffers[n];if(e.attributeData[a]){o!==u&&(i.bindBuffer(i.ARRAY_BUFFER,u.buffer),o=u);var l=e.attributeData[a].location;if(i.enableVertexAttribArray(l),i.vertexAttribPointer(l,h.size,h.type||i.FLOAT,h.normalized,h.stride,h.start),h.instance){if(!this.hasInstance)throw new Error("geometry error, GPU Instancing is not supported on this device");i.vertexAttribDivisor(l,1)}}}},e.prototype.draw=function(t,e,i,n){var r=this.gl,s=this._activeGeometry;if(s.indexBuffer){var o=s.indexBuffer.data.BYTES_PER_ELEMENT,a=2===o?r.UNSIGNED_SHORT:r.UNSIGNED_INT;2===o||4===o&&this.canUseUInt32ElementIndex?s.instanced?r.drawElementsInstanced(t,e||s.indexBuffer.data.length,a,(i||0)*o,n||1):r.drawElements(t,e||s.indexBuffer.data.length,a,(i||0)*o):console.warn("unsupported index buffer type: uint32")}else s.instanced?r.drawArraysInstanced(t,i,e||s.getSize(),n||1):r.drawArrays(t,i,e||s.getSize());return this},e.prototype.unbind=function(){this.gl.bindVertexArray(null),this._activeVao=null,this._activeGeometry=null},e}(EA),oD=function(t){this.type=tL.NONE,this.autoDetect=!0,this.maskObject=t||null,this.pooled=!1,this.isMaskData=!0,this._stencilCounter=0,this._scissorCounter=0,this._scissorRect=null,this._target=null};function aD(t,e,i,n){var r=hD(t,t.VERTEX_SHADER,e),s=hD(t,t.FRAGMENT_SHADER,i),o=t.createProgram();if(t.attachShader(o,r),t.attachShader(o,s),n)for(var a in n)t.bindAttribLocation(o,n[a],a);return t.linkProgram(o),t.getProgramParameter(o,t.LINK_STATUS)||(t.getShaderParameter(r,t.COMPILE_STATUS)||(console.warn(e),console.error(t.getShaderInfoLog(r))),t.getShaderParameter(s,t.COMPILE_STATUS)||(console.warn(i),console.error(t.getShaderInfoLog(s))),console.error("Pixi.js Error: Could not initialize shader."),console.error("gl.VALIDATE_STATUS",t.getProgramParameter(o,t.VALIDATE_STATUS)),console.error("gl.getError()",t.getError()),""!==t.getProgramInfoLog(o)&&console.warn("Pixi.js Warning: gl.getProgramInfoLog()",t.getProgramInfoLog(o)),t.deleteProgram(o),o=null),t.deleteShader(r),t.deleteShader(s),o}function hD(t,e,i){var n=t.createShader(e);return t.shaderSource(n,i),t.compileShader(n),n}function uD(t,e){switch(t){case"float":return 0;case"vec2":return new Float32Array(2*e);case"vec3":return new Float32Array(3*e);case"vec4":return new Float32Array(4*e);case"int":case"sampler2D":case"sampler2DArray":return 0;case"ivec2":return new Int32Array(2*e);case"ivec3":return new Int32Array(3*e);case"ivec4":return new Int32Array(4*e);case"bool":return!1;case"bvec2":return lD(2*e);case"bvec3":return lD(3*e);case"bvec4":return lD(4*e);case"mat2":return new Float32Array([1,0,0,1]);case"mat3":return new Float32Array([1,0,0,0,1,0,0,0,1]);case"mat4":return new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}return null}function lD(t){for(var e=new Array(t),i=0;i<e.length;i++)e[i]=!1;return e}oD.prototype.reset=function(){this.pooled&&(this.maskObject=null,this.type=tL.NONE,this.autoDetect=!0),this._target=null},oD.prototype.copyCountersOrReset=function(t){t?(this._stencilCounter=t._stencilCounter,this._scissorCounter=t._scissorCounter,this._scissorRect=t._scissorRect):(this._stencilCounter=0,this._scissorCounter=0,this._scissorRect=null)};var cD,dD={},pD=dD;function fD(){if(pD===dD||pD&&pD.isContextLost()){var t,e=document.createElement("canvas");IE.PREFER_ENV>=jE.WEBGL2&&(t=e.getContext("webgl2",{})),t||((t=e.getContext("webgl",{})||e.getContext("experimental-webgl",{}))?t.getExtension("WEBGL_draw_buffers"):t=null),pD=t}return pD}function mD(t,e,i){if("precision"!==t.substring(0,9)){var n=e;return e===$E.HIGH&&i!==$E.HIGH&&(n=$E.MEDIUM),"precision "+n+" float;\n"+t}return i!==$E.HIGH&&"precision highp"===t.substring(0,15)?t.replace("precision highp","precision mediump"):t}var vD={float:1,vec2:2,vec3:3,vec4:4,int:1,ivec2:2,ivec3:3,ivec4:4,bool:1,bvec2:2,bvec3:3,bvec4:4,mat2:4,mat3:9,mat4:16,sampler2D:1};function gD(t){return vD[t]}var yD=null,_D={FLOAT:"float",FLOAT_VEC2:"vec2",FLOAT_VEC3:"vec3",FLOAT_VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",FLOAT_MAT2:"mat2",FLOAT_MAT3:"mat3",FLOAT_MAT4:"mat4",SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube",SAMPLER_2D_ARRAY:"sampler2DArray"};function xD(t,e){if(!yD){var i=Object.keys(_D);yD={};for(var n=0;n<i.length;++n){var r=i[n];yD[t[r]]=_D[r]}}return yD[e]}var bD={float:"\n if(cv !== v)\n {\n cv.v = v;\n gl.uniform1f(location, v)\n }",vec2:"\n if(cv[0] !== v[0] || cv[1] !== v[1])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n gl.uniform2f(location, v[0], v[1])\n }",vec3:"\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n cv[2] = v[2];\n\n gl.uniform3f(location, v[0], v[1], v[2])\n }",vec4:"gl.uniform4f(location, v[0], v[1], v[2], v[3])",int:"gl.uniform1i(location, v)",ivec2:"gl.uniform2i(location, v[0], v[1])",ivec3:"gl.uniform3i(location, v[0], v[1], v[2])",ivec4:"gl.uniform4i(location, v[0], v[1], v[2], v[3])",bool:"gl.uniform1i(location, v)",bvec2:"gl.uniform2i(location, v[0], v[1])",bvec3:"gl.uniform3i(location, v[0], v[1], v[2])",bvec4:"gl.uniform4i(location, v[0], v[1], v[2], v[3])",mat2:"gl.uniformMatrix2fv(location, false, v)",mat3:"gl.uniformMatrix3fv(location, false, v)",mat4:"gl.uniformMatrix4fv(location, false, v)",sampler2D:"gl.uniform1i(location, v)",samplerCube:"gl.uniform1i(location, v)",sampler2DArray:"gl.uniform1i(location, v)"},wD={float:"gl.uniform1fv(location, v)",vec2:"gl.uniform2fv(location, v)",vec3:"gl.uniform3fv(location, v)",vec4:"gl.uniform4fv(location, v)",mat4:"gl.uniformMatrix4fv(location, false, v)",mat3:"gl.uniformMatrix3fv(location, false, v)",mat2:"gl.uniformMatrix2fv(location, false, v)",int:"gl.uniform1iv(location, v)",ivec2:"gl.uniform2iv(location, v)",ivec3:"gl.uniform3iv(location, v)",ivec4:"gl.uniform4iv(location, v)",bool:"gl.uniform1iv(location, v)",bvec2:"gl.uniform2iv(location, v)",bvec3:"gl.uniform3iv(location, v)",bvec4:"gl.uniform4iv(location, v)",sampler2D:"gl.uniform1iv(location, v)",samplerCube:"gl.uniform1iv(location, v)",sampler2DArray:"gl.uniform1iv(location, v)"};var TD,MD=["precision mediump float;","void main(void){","float test = 0.1;","%forloop%","gl_FragColor = vec4(0.0);","}"].join("\n");function SD(t){for(var e="",i=0;i<t;++i)i>0&&(e+="\nelse "),i<t-1&&(e+="if(test == "+i+".0){}");return e}var ED=0,LD={},AD=function t(e,i,n){void 0===n&&(n="pixi-shader"),this.id=ED++,this.vertexSrc=e||t.defaultVertexSrc,this.fragmentSrc=i||t.defaultFragmentSrc,this.vertexSrc=this.vertexSrc.trim(),this.fragmentSrc=this.fragmentSrc.trim(),"#version"!==this.vertexSrc.substring(0,8)&&(n=n.replace(/\s+/g,"-"),LD[n]?(LD[n]++,n+="-"+LD[n]):LD[n]=1,this.vertexSrc="#define SHADER_NAME "+n+"\n"+this.vertexSrc,this.fragmentSrc="#define SHADER_NAME "+n+"\n"+this.fragmentSrc,this.vertexSrc=mD(this.vertexSrc,IE.PRECISION_VERTEX,$E.HIGH),this.fragmentSrc=mD(this.fragmentSrc,IE.PRECISION_FRAGMENT,function(){if(!cD){cD=$E.MEDIUM;var t=fD();if(t&&t.getShaderPrecisionFormat){var e=t.getShaderPrecisionFormat(t.FRAGMENT_SHADER,t.HIGH_FLOAT);cD=e.precision?$E.HIGH:$E.MEDIUM}}return cD}())),this.extractData(this.vertexSrc,this.fragmentSrc),this.glPrograms={},this.syncUniforms=null},DD={defaultVertexSrc:{configurable:!0},defaultFragmentSrc:{configurable:!0}};AD.prototype.extractData=function(t,e){var i=fD();if(i){var n=aD(i,t,e);this.attributeData=this.getAttributeData(n,i),this.uniformData=this.getUniformData(n,i),i.deleteProgram(n)}else this.uniformData={},this.attributeData={}},AD.prototype.getAttributeData=function(t,e){for(var i={},n=[],r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES),s=0;s<r;s++){var o=e.getActiveAttrib(t,s),a=xD(e,o.type),h={type:a,name:o.name,size:gD(a),location:0};i[o.name]=h,n.push(h)}n.sort((function(t,e){return t.name>e.name?1:-1}));for(var u=0;u<n.length;u++)n[u].location=u;return i},AD.prototype.getUniformData=function(t,e){for(var i={},n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),r=0;r<n;r++){var s=e.getActiveUniform(t,r),o=s.name.replace(/\[.*?\]/,""),a=s.name.match(/\[.*?\]/,""),h=xD(e,s.type);i[o]={type:h,size:s.size,isArray:a,value:uD(h,s.size)}}return i},DD.defaultVertexSrc.get=function(){return"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}\n"},DD.defaultFragmentSrc.get=function(){return"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor *= texture2D(uSampler, vTextureCoord);\n}"},AD.from=function(t,e,i){var n=t+e,r=_L[n];return r||(_L[n]=r=new AD(t,e,i)),r},Object.defineProperties(AD,DD);var PD=function(t,e){for(var i in this.program=t,this.uniformGroup=e?e instanceof JA?e:new JA(e):new JA({}),t.uniformData)this.uniformGroup.uniforms[i]instanceof Array&&(this.uniformGroup.uniforms[i]=new Float32Array(this.uniformGroup.uniforms[i]))},CD={uniforms:{configurable:!0}};PD.prototype.checkUniformExists=function(t,e){if(e.uniforms[t])return!0;for(var i in e.uniforms){var n=e.uniforms[i];if(n.group&&this.checkUniformExists(t,n))return!0}return!1},PD.prototype.destroy=function(){this.uniformGroup=null},CD.uniforms.get=function(){return this.uniformGroup.uniforms},PD.from=function(t,e,i){var n=AD.from(t,e);return new PD(n,i)},Object.defineProperties(PD.prototype,CD);var OD=function(){this.data=0,this.blendMode=zE.NORMAL,this.polygonOffset=0,this.blend=!0},kD={blend:{configurable:!0},offsets:{configurable:!0},culling:{configurable:!0},depthTest:{configurable:!0},clockwiseFrontFace:{configurable:!0},blendMode:{configurable:!0},polygonOffset:{configurable:!0}};kD.blend.get=function(){return!!(1&this.data)},kD.blend.set=function(t){!!(1&this.data)!==t&&(this.data^=1)},kD.offsets.get=function(){return!!(2&this.data)},kD.offsets.set=function(t){!!(2&this.data)!==t&&(this.data^=2)},kD.culling.get=function(){return!!(4&this.data)},kD.culling.set=function(t){!!(4&this.data)!==t&&(this.data^=4)},kD.depthTest.get=function(){return!!(8&this.data)},kD.depthTest.set=function(t){!!(8&this.data)!==t&&(this.data^=8)},kD.clockwiseFrontFace.get=function(){return!!(16&this.data)},kD.clockwiseFrontFace.set=function(t){!!(16&this.data)!==t&&(this.data^=16)},kD.blendMode.get=function(){return this._blendMode},kD.blendMode.set=function(t){this.blend=t!==zE.NONE,this._blendMode=t},kD.polygonOffset.get=function(){return this._polygonOffset},kD.polygonOffset.set=function(t){this.offsets=!!t,this._polygonOffset=t},OD.for2d=function(){var t=new OD;return t.depthTest=!1,t.blend=!0,t},Object.defineProperties(OD.prototype,kD);var RD=function(t){function e(i,n,r){var s=AD.from(i||e.defaultVertexSrc,n||e.defaultFragmentSrc);t.call(this,s,r),this.padding=0,this.resolution=IE.FILTER_RESOLUTION,this.enabled=!0,this.autoFit=!0,this.legacy=!!this.program.attributeData.aTextureCoord,this.state=new OD}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={blendMode:{configurable:!0}},n={defaultVertexSrc:{configurable:!0},defaultFragmentSrc:{configurable:!0}};return e.prototype.apply=function(t,e,i,n,r){t.applyFilter(this,e,i,n,r)},i.blendMode.get=function(){return this.state.blendMode},i.blendMode.set=function(t){this.state.blendMode=t},n.defaultVertexSrc.get=function(){return"attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n"},n.defaultFragmentSrc.get=function(){return"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n}\n"},Object.defineProperties(e.prototype,i),Object.defineProperties(e,n),e}(PD);RD.SOURCE_KEY_MAP={};var ID=new CL,YD=function(t,e){this._texture=t,this.mapCoord=new CL,this.uClampFrame=new Float32Array(4),this.uClampOffset=new Float32Array(2),this._updateID=-1,this.clampOffset=0,this.clampMargin=void 0===e?.5:e,this.isSimple=!1},FD={texture:{configurable:!0}};FD.texture.get=function(){return this._texture},FD.texture.set=function(t){this._texture=t,this._updateID=-1},YD.prototype.multiplyUvs=function(t,e){void 0===e&&(e=t);for(var i=this.mapCoord,n=0;n<t.length;n+=2){var r=t[n],s=t[n+1];e[n]=r*i.a+s*i.c+i.tx,e[n+1]=r*i.b+s*i.d+i.ty}return e},YD.prototype.update=function(t){var e=this._texture;if(!e||!e.valid)return!1;if(!t&&this._updateID===e._updateID)return!1;this._updateID=e._updateID;var i=e._uvs;this.mapCoord.set(i.x1-i.x0,i.y1-i.y0,i.x3-i.x0,i.y3-i.y0,i.x0,i.y0);var n=e.orig,r=e.trim;r&&(ID.set(n.width/r.width,0,0,n.height/r.height,-r.x/r.width,-r.y/r.height),this.mapCoord.append(ID));var s=e.baseTexture,o=this.uClampFrame,a=this.clampMargin/s.resolution,h=this.clampOffset;return o[0]=(e._frame.x+a+h)/s.width,o[1]=(e._frame.y+a+h)/s.height,o[2]=(e._frame.x+e._frame.width-a+h)/s.width,o[3]=(e._frame.y+e._frame.height-a+h)/s.height,this.uClampOffset[0]=h/s.realWidth,this.uClampOffset[1]=h/s.realHeight,this.isSimple=e._frame.width===s.width&&e._frame.height===s.height&&0===e.rotate,!0},Object.defineProperties(YD.prototype,FD);var ND=function(t){function e(e){var i=new CL;t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n}\n","varying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform float npmAlpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n float clip = step(3.5,\n step(maskClamp.x, vMaskCoord.x) +\n step(maskClamp.y, vMaskCoord.y) +\n step(vMaskCoord.x, maskClamp.z) +\n step(vMaskCoord.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, vMaskCoord);\n float alphaMul = 1.0 - npmAlpha * (1.0 - masky.a);\n\n original *= (alphaMul * masky.r * alpha * clip);\n\n gl_FragColor = original;\n}\n"),e.renderable=!1,this.maskSprite=e,this.maskMatrix=i}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.apply=function(t,e,i,n){var r=this.maskSprite,s=this.maskSprite.texture;s.valid&&(s.transform||(s.transform=new YD(s,0)),s.transform.update(),this.uniforms.npmAlpha=s.baseTexture.alphaMode?0:1,this.uniforms.mask=s,this.uniforms.otherMatrix=t.calculateSpriteMatrix(this.maskMatrix,r).prepend(s.transform.mapCoord),this.uniforms.alpha=r.worldAlpha,this.uniforms.maskClamp=s.transform.uClampFrame,t.applyFilter(this,e,i,n))},e}(RD),BD=function(t){function e(e){t.call(this,e),this.scissorRenderTarget=null,this.enableScissor=!1,this.alphaMaskPool=[],this.maskDataPool=[],this.maskStack=[],this.alphaMaskIndex=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setMaskStack=function(t){this.maskStack=t,this.renderer.scissor.setMaskStack(t),this.renderer.stencil.setMaskStack(t)},e.prototype.push=function(t,e){if(!e.isMaskData){var i=this.maskDataPool.pop()||new oD;i.pooled=!0,i.maskObject=e,e=i}switch(e.autoDetect&&this.detect(e),e.copyCountersOrReset(this.maskStack[this.maskStack.length-1]),e._target=t,e.type){case tL.SCISSOR:this.maskStack.push(e),this.renderer.scissor.push(e);break;case tL.STENCIL:this.maskStack.push(e),this.renderer.stencil.push(e);break;case tL.SPRITE:e.copyCountersOrReset(null),this.pushSpriteMask(e),this.maskStack.push(e)}},e.prototype.pop=function(t){var e=this.maskStack.pop();if(e&&e._target===t){switch(e.type){case tL.SCISSOR:this.renderer.scissor.pop();break;case tL.STENCIL:this.renderer.stencil.pop(e.maskObject);break;case tL.SPRITE:this.popSpriteMask()}e.reset(),e.pooled&&this.maskDataPool.push(e)}},e.prototype.detect=function(t){var e=t.maskObject;if(e.isSprite)t.type=tL.SPRITE;else if(t.type=tL.STENCIL,this.enableScissor&&e.isFastRect&&e.isFastRect()){var i=e.worldTransform,n=Math.atan2(i.b,i.a),r=Math.atan2(i.d,i.c);n=Math.round(n*(180/Math.PI)*100),r=((r=Math.round(r*(180/Math.PI)*100)-n)%18e3+18e3)%18e3,0===(n=(n%9e3+9e3)%9e3)&&9e3===r&&(t.type=tL.SCISSOR)}},e.prototype.pushSpriteMask=function(t){var e=t.maskObject,i=t._target,n=this.alphaMaskPool[this.alphaMaskIndex];n||(n=this.alphaMaskPool[this.alphaMaskIndex]=[new ND(e)]),n[0].resolution=this.renderer.resolution,n[0].maskSprite=e;var r=i.filterArea;i.filterArea=e.getBounds(!0),this.renderer.filter.push(i,n),i.filterArea=r,this.alphaMaskIndex++},e.prototype.popSpriteMask=function(){this.renderer.filter.pop(),this.alphaMaskIndex--},e}(EA),UD=function(t){function e(e){t.call(this,e),this.maskStack=[],this.glConst=0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getStackLength=function(){return this.maskStack.length},e.prototype.setMaskStack=function(t){var e=this.renderer.gl,i=this.getStackLength();this.maskStack=t;var n=this.getStackLength();n!==i&&(0===n?e.disable(this.glConst):(e.enable(this.glConst),this._useCurrent()))},e.prototype._useCurrent=function(){},e.prototype.destroy=function(){t.prototype.destroy.call(this,this),this.maskStack=null},e}(EA),jD=function(t){function e(e){t.call(this,e),this.glConst=WebGLRenderingContext.SCISSOR_TEST}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getStackLength=function(){var t=this.maskStack[this.maskStack.length-1];return t?t._scissorCounter:0},e.prototype.push=function(t){var e=t.maskObject;e.renderable=!0;var i=t._scissorRect,n=e.getBounds(!0),r=this.renderer.gl;e.renderable=!1,i?n.fit(i):r.enable(r.SCISSOR_TEST),t._scissorCounter++,t._scissorRect=n,this._useCurrent()},e.prototype.pop=function(){var t=this.renderer.gl;this.getStackLength()>0?this._useCurrent():t.disable(t.SCISSOR_TEST)},e.prototype._useCurrent=function(){var t=this.maskStack[this.maskStack.length-1]._scissorRect,e=this.renderer.renderTexture.current,i=this.renderer.projection,n=i.transform,r=i.sourceFrame,s=i.destinationFrame,o=e?e.resolution:this.renderer.resolution,a=(t.x-r.x)*o+s.x,h=(t.y-r.y)*o+s.y,u=t.width*o,l=t.height*o;n&&(a+=n.tx*o,h+=n.ty*o),e||(h=this.renderer.height-l-h),this.renderer.gl.scissor(a,h,u,l)},e}(UD),HD=function(t){function e(e){t.call(this,e),this.glConst=WebGLRenderingContext.STENCIL_TEST}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getStackLength=function(){var t=this.maskStack[this.maskStack.length-1];return t?t._stencilCounter:0},e.prototype.push=function(t){var e=t.maskObject,i=this.renderer.gl,n=t._stencilCounter;0===n&&(this.renderer.framebuffer.forceStencil(),i.enable(i.STENCIL_TEST)),t._stencilCounter++,i.colorMask(!1,!1,!1,!1),i.stencilFunc(i.EQUAL,n,this._getBitwiseMask()),i.stencilOp(i.KEEP,i.KEEP,i.INCR),e.renderable=!0,e.render(this.renderer),this.renderer.batch.flush(),e.renderable=!1,this._useCurrent()},e.prototype.pop=function(t){var e=this.renderer.gl;0===this.getStackLength()?(e.disable(e.STENCIL_TEST),e.clear(e.STENCIL_BUFFER_BIT),e.clearStencil(0)):(e.colorMask(!1,!1,!1,!1),e.stencilOp(e.KEEP,e.KEEP,e.DECR),t.renderable=!0,t.render(this.renderer),this.renderer.batch.flush(),t.renderable=!1,this._useCurrent())},e.prototype._useCurrent=function(){var t=this.renderer.gl;t.colorMask(!0,!0,!0,!0),t.stencilFunc(t.EQUAL,this.getStackLength(),this._getBitwiseMask()),t.stencilOp(t.KEEP,t.KEEP,t.KEEP)},e.prototype._getBitwiseMask=function(){return(1<<this.getStackLength())-1},e}(UD),zD=function(t){function e(e){t.call(this,e),this.destinationFrame=null,this.sourceFrame=null,this.defaultFrame=null,this.projectionMatrix=new CL,this.transform=null}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.update=function(t,e,i,n){this.destinationFrame=t||this.destinationFrame||this.defaultFrame,this.sourceFrame=e||this.sourceFrame||t,this.calculateProjection(this.destinationFrame,this.sourceFrame,i,n),this.transform&&this.projectionMatrix.append(this.transform);var r=this.renderer;r.globalUniforms.uniforms.projectionMatrix=this.projectionMatrix,r.globalUniforms.update(),r.shader.shader&&r.shader.syncUniformGroup(r.shader.shader.uniforms.globals)},e.prototype.calculateProjection=function(t,e,i,n){var r=this.projectionMatrix;n?(r.a=1/t.width*2*i,r.d=-1/t.height*2*i,r.tx=-1-e.x*r.a,r.ty=1-e.y*r.d):(r.a=1/t.width*2*i,r.d=1/t.height*2*i,r.tx=-1-e.x*r.a,r.ty=-1-e.y*r.d)},e.prototype.setTransform=function(){},e}(EA),WD=new jL,GD=function(t){function e(e){t.call(this,e),this.clearColor=e._backgroundColorRgba,this.defaultMaskStack=[],this.current=null,this.sourceFrame=new jL,this.destinationFrame=new jL}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.bind=function(t,e,i){void 0===t&&(t=null),this.current=t;var n,r=this.renderer;if(t){var s=t.baseTexture;n=s.resolution,i||(WD.width=s.realWidth,WD.height=s.realHeight,i=WD),e||(e=i),this.renderer.framebuffer.bind(s.framebuffer,i),this.renderer.projection.update(i,e,n,!1),this.renderer.mask.setMaskStack(s.maskStack)}else n=this.renderer.resolution,i||(WD.width=r.width,WD.height=r.height,i=WD),e||(e=i),r.framebuffer.bind(null,i),this.renderer.projection.update(i,e,n,!0),this.renderer.mask.setMaskStack(this.defaultMaskStack);this.sourceFrame.copyFrom(e),this.destinationFrame.x=i.x/n,this.destinationFrame.y=i.y/n,this.destinationFrame.width=i.width/n,this.destinationFrame.height=i.height/n,e===i&&this.sourceFrame.copyFrom(this.destinationFrame)},e.prototype.clear=function(t){t=this.current?t||this.current.baseTexture.clearColor:t||this.clearColor,this.renderer.framebuffer.clear(t[0],t[1],t[2],t[3])},e.prototype.resize=function(){this.bind(null)},e.prototype.reset=function(){this.bind(null)},e}(EA),VD=function(t,e){this.program=t,this.uniformData=e,this.uniformGroups={}};VD.prototype.destroy=function(){this.uniformData=null,this.uniformGroups=null,this.program=null};var XD=0,qD={textureCount:0},JD=function(t){function e(e){t.call(this,e),this.systemCheck(),this.gl=null,this.shader=null,this.program=null,this.cache={},this.id=XD++}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.systemCheck=function(){if(!function(){if("boolean"==typeof TD)return TD;try{var t=new Function("param1","param2","param3","return param1[param2] === param3;");TD=!0===t({a:"b"},"a","b")}catch(t){TD=!1}return TD}())throw new Error("Current environment does not allow unsafe-eval, please use @pixi/unsafe-eval module to enable support.")},e.prototype.contextChange=function(t){this.gl=t,this.reset()},e.prototype.bind=function(t,e){t.uniforms.globals=this.renderer.globalUniforms;var i=t.program,n=i.glPrograms[this.renderer.CONTEXT_UID]||this.generateShader(t);return this.shader=t,this.program!==i&&(this.program=i,this.gl.useProgram(n.program)),e||(qD.textureCount=0,this.syncUniformGroup(t.uniformGroup,qD)),n},e.prototype.setUniforms=function(t){var e=this.shader.program,i=e.glPrograms[this.renderer.CONTEXT_UID];e.syncUniforms(i.uniformData,t,this.renderer)},e.prototype.syncUniformGroup=function(t,e){var i=this.getglProgram();t.static&&t.dirtyId===i.uniformGroups[t.id]||(i.uniformGroups[t.id]=t.dirtyId,this.syncUniforms(t,i,e))},e.prototype.syncUniforms=function(t,e,i){(t.syncUniforms[this.shader.program.id]||this.createSyncGroups(t))(e.uniformData,t.uniforms,this.renderer,i)},e.prototype.createSyncGroups=function(t){var e=this.getSignature(t,this.shader.program.uniformData);return this.cache[e]||(this.cache[e]=function(t,e){var i="var v = null;\n var cv = null\n var t = 0;\n var gl = renderer.gl\n ";for(var n in t.uniforms){var r=e[n];r?"float"===r.type&&1===r.size?i+="\n if(uv."+n+" !== ud."+n+".value)\n {\n ud."+n+".value = uv."+n+"\n gl.uniform1f(ud."+n+".location, uv."+n+")\n }\n":"sampler2D"!==r.type&&"samplerCube"!==r.type&&"sampler2DArray"!==r.type||1!==r.size||r.isArray?"mat3"===r.type&&1===r.size?void 0!==t.uniforms[n].a?i+="\n gl.uniformMatrix3fv(ud."+n+".location, false, uv."+n+".toArray(true));\n \n":i+="\n gl.uniformMatrix3fv(ud."+n+".location, false, uv."+n+");\n \n":"vec2"===r.type&&1===r.size?void 0!==t.uniforms[n].x?i+="\n cv = ud."+n+".value;\n v = uv."+n+";\n\n if(cv[0] !== v.x || cv[1] !== v.y)\n {\n cv[0] = v.x;\n cv[1] = v.y;\n gl.uniform2f(ud."+n+".location, v.x, v.y);\n }\n":i+="\n cv = ud."+n+".value;\n v = uv."+n+";\n\n if(cv[0] !== v[0] || cv[1] !== v[1])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n gl.uniform2f(ud."+n+".location, v[0], v[1]);\n }\n \n":"vec4"===r.type&&1===r.size?void 0!==t.uniforms[n].width?i+="\n cv = ud."+n+".value;\n v = uv."+n+";\n\n if(cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height)\n {\n cv[0] = v.x;\n cv[1] = v.y;\n cv[2] = v.width;\n cv[3] = v.height;\n gl.uniform4f(ud."+n+".location, v.x, v.y, v.width, v.height)\n }\n":i+="\n cv = ud."+n+".value;\n v = uv."+n+";\n\n if(cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3])\n {\n cv[0] = v[0];\n cv[1] = v[1];\n cv[2] = v[2];\n cv[3] = v[3];\n\n gl.uniform4f(ud."+n+".location, v[0], v[1], v[2], v[3])\n }\n \n":i+="\n cv = ud."+n+".value;\n v = uv."+n+";\n "+(1===r.size?bD:wD)[r.type].replace("location","ud."+n+".location")+";\n":i+="\n\n t = syncData.textureCount++;\n\n renderer.texture.bind(uv."+n+", t);\n \n if(ud."+n+".value !== t)\n {\n ud."+n+".value = t;\n gl.uniform1i(ud."+n+".location, t);\n; // eslint-disable-line max-len\n }\n":t.uniforms[n].group&&(i+="\n renderer.shader.syncUniformGroup(uv."+n+", syncData);\n ")}return new Function("ud","uv","renderer","syncData",i)}(t,this.shader.program.uniformData)),t.syncUniforms[this.shader.program.id]=this.cache[e],t.syncUniforms[this.shader.program.id]},e.prototype.getSignature=function(t,e){var i=t.uniforms,n=[];for(var r in i)n.push(r),e[r]&&n.push(e[r].type);return n.join("-")},e.prototype.getglProgram=function(){return this.shader?this.shader.program.glPrograms[this.renderer.CONTEXT_UID]:null},e.prototype.generateShader=function(t){var e=this.gl,i=t.program,n={};for(var r in i.attributeData)n[r]=i.attributeData[r].location;var s=aD(e,i.vertexSrc,i.fragmentSrc,n),o={};for(var a in i.uniformData){var h=i.uniformData[a];o[a]={location:e.getUniformLocation(s,a),value:uD(h.type,h.size)}}var u=new VD(s,o);return i.glPrograms[this.renderer.CONTEXT_UID]=u,u},e.prototype.reset=function(){this.program=null,this.shader=null},e.prototype.destroy=function(){this.destroyed=!0},e}(EA);var ZD=function(t){function e(e){t.call(this,e),this.gl=null,this.stateId=0,this.polygonOffset=0,this.blendMode=zE.NONE,this._blendEq=!1,this.map=[],this.map[0]=this.setBlend,this.map[1]=this.setOffset,this.map[2]=this.setCullFace,this.map[3]=this.setDepthTest,this.map[4]=this.setFrontFace,this.checks=[],this.defaultState=new OD,this.defaultState.blend=!0,this.defaultState.depth=!0}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.contextChange=function(t){this.gl=t,this.blendModes=function(t,e){return void 0===e&&(e=[]),e[zE.NORMAL]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.ADD]=[t.ONE,t.ONE],e[zE.MULTIPLY]=[t.DST_COLOR,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.SCREEN]=[t.ONE,t.ONE_MINUS_SRC_COLOR,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.OVERLAY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.DARKEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.LIGHTEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.COLOR_DODGE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.COLOR_BURN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.HARD_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.SOFT_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.DIFFERENCE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.EXCLUSION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.HUE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.SATURATION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.COLOR]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.LUMINOSITY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.NONE]=[0,0],e[zE.NORMAL_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.ADD_NPM]=[t.SRC_ALPHA,t.ONE,t.ONE,t.ONE],e[zE.SCREEN_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_COLOR,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[zE.SRC_IN]=[t.DST_ALPHA,t.ZERO],e[zE.SRC_OUT]=[t.ONE_MINUS_DST_ALPHA,t.ZERO],e[zE.SRC_ATOP]=[t.DST_ALPHA,t.ONE_MINUS_SRC_ALPHA],e[zE.DST_OVER]=[t.ONE_MINUS_DST_ALPHA,t.ONE],e[zE.DST_IN]=[t.ZERO,t.SRC_ALPHA],e[zE.DST_OUT]=[t.ZERO,t.ONE_MINUS_SRC_ALPHA],e[zE.DST_ATOP]=[t.ONE_MINUS_DST_ALPHA,t.SRC_ALPHA],e[zE.XOR]=[t.ONE_MINUS_DST_ALPHA,t.ONE_MINUS_SRC_ALPHA],e[zE.SUBTRACT]=[t.ONE,t.ONE,t.ONE,t.ONE,t.FUNC_REVERSE_SUBTRACT,t.FUNC_ADD],e}(t),this.set(this.defaultState),this.reset()},e.prototype.set=function(t){if(t=t||this.defaultState,this.stateId!==t.data){for(var e=this.stateId^t.data,i=0;e;)1&e&&this.map[i].call(this,!!(t.data&1<<i)),e>>=1,i++;this.stateId=t.data}for(var n=0;n<this.checks.length;n++)this.checks[n](this,t)},e.prototype.forceState=function(t){t=t||this.defaultState;for(var e=0;e<this.map.length;e++)this.map[e].call(this,!!(t.data&1<<e));for(var i=0;i<this.checks.length;i++)this.checks[i](this,t);this.stateId=t.data},e.prototype.setBlend=function(t){this.updateCheck(e.checkBlendMode,t),this.gl[t?"enable":"disable"](this.gl.BLEND)},e.prototype.setOffset=function(t){this.updateCheck(e.checkPolygonOffset,t),this.gl[t?"enable":"disable"](this.gl.POLYGON_OFFSET_FILL)},e.prototype.setDepthTest=function(t){this.gl[t?"enable":"disable"](this.gl.DEPTH_TEST)},e.prototype.setCullFace=function(t){this.gl[t?"enable":"disable"](this.gl.CULL_FACE)},e.prototype.setFrontFace=function(t){this.gl.frontFace(this.gl[t?"CW":"CCW"])},e.prototype.setBlendMode=function(t){if(t!==this.blendMode){this.blendMode=t;var e=this.blendModes[t],i=this.gl;2===e.length?i.blendFunc(e[0],e[1]):i.blendFuncSeparate(e[0],e[1],e[2],e[3]),6===e.length?(this._blendEq=!0,i.blendEquationSeparate(e[4],e[5])):this._blendEq&&(this._blendEq=!1,i.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD))}},e.prototype.setPolygonOffset=function(t,e){this.gl.polygonOffset(t,e)},e.prototype.reset=function(){this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,!1),this.forceState(0),this._blendEq=!0,this.blendMode=-1,this.setBlendMode(0)},e.prototype.updateCheck=function(t,e){var i=this.checks.indexOf(t);e&&-1===i?this.checks.push(t):e||-1===i||this.checks.splice(i,1)},e.checkBlendMode=function(t,e){t.setBlendMode(e.blendMode)},e.checkPolygonOffset=function(t,e){t.setPolygonOffset(e.polygonOffset,0)},e}(EA),KD=function(t){function e(e){t.call(this,e),this.count=0,this.checkCount=0,this.maxIdle=IE.GC_MAX_IDLE,this.checkCountMax=IE.GC_MAX_CHECK_COUNT,this.mode=IE.GC_MODE}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postrender=function(){this.renderer.renderingToScreen&&(this.count++,this.mode!==QE.MANUAL&&(this.checkCount++,this.checkCount>this.checkCountMax&&(this.checkCount=0,this.run())))},e.prototype.run=function(){for(var t=this.renderer.texture,e=t.managedTextures,i=!1,n=0;n<e.length;n++){var r=e[n];!r.framebuffer&&this.count-r.touched>this.maxIdle&&(t.destroyTexture(r,!0),e[n]=null,i=!0)}if(i){for(var s=0,o=0;o<e.length;o++)null!==e[o]&&(e[s++]=e[o]);e.length=s}},e.prototype.unload=function(t){var e=this.renderer.textureSystem;t._texture&&t._texture._glRenderTargets&&e.destroyTexture(t._texture);for(var i=t.children.length-1;i>=0;i--)this.unload(t.children[i])},e}(EA),QD=function(t){this.texture=t,this.width=-1,this.height=-1,this.dirtyId=-1,this.dirtyStyleId=-1,this.mipmap=!1,this.wrapMode=33071,this.type=6408,this.internalFormat=5121},$D=function(t){function e(e){t.call(this,e),this.boundTextures=[],this.currentLocation=-1,this.managedTextures=[],this._unknownBoundTextures=!1,this.unknownTexture=new _A}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.contextChange=function(){var t=this.gl=this.renderer.gl;this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.webGLVersion=this.renderer.context.webGLVersion;var e=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS);this.boundTextures.length=e;for(var i=0;i<e;i++)this.boundTextures[i]=null;this.emptyTextures={};var n=new QD(t.createTexture());t.bindTexture(t.TEXTURE_2D,n.texture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,1,1,0,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(4)),this.emptyTextures[t.TEXTURE_2D]=n,this.emptyTextures[t.TEXTURE_CUBE_MAP]=new QD(t.createTexture()),t.bindTexture(t.TEXTURE_CUBE_MAP,this.emptyTextures[t.TEXTURE_CUBE_MAP].texture);for(var r=0;r<6;r++)t.texImage2D(t.TEXTURE_CUBE_MAP_POSITIVE_X+r,0,t.RGBA,1,1,0,t.RGBA,t.UNSIGNED_BYTE,null);t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_CUBE_MAP,t.TEXTURE_MIN_FILTER,t.LINEAR);for(var s=0;s<this.boundTextures.length;s++)this.bind(null,s)},e.prototype.bind=function(t,e){void 0===e&&(e=0);var i=this.gl;if(t){if((t=t.baseTexture||t).valid){t.touched=this.renderer.textureGC.count;var n=t._glTextures[this.CONTEXT_UID]||this.initTexture(t);this.boundTextures[e]!==t&&(this.currentLocation!==e&&(this.currentLocation=e,i.activeTexture(i.TEXTURE0+e)),i.bindTexture(t.target,n.texture)),n.dirtyId!==t.dirtyId&&(this.currentLocation!==e&&(this.currentLocation=e,i.activeTexture(i.TEXTURE0+e)),this.updateTexture(t)),this.boundTextures[e]=t}}else this.currentLocation!==e&&(this.currentLocation=e,i.activeTexture(i.TEXTURE0+e)),i.bindTexture(i.TEXTURE_2D,this.emptyTextures[i.TEXTURE_2D].texture),this.boundTextures[e]=null},e.prototype.reset=function(){this._unknownBoundTextures=!0,this.currentLocation=-1;for(var t=0;t<this.boundTextures.length;t++)this.boundTextures[t]=this.unknownTexture},e.prototype.unbind=function(t){var e=this.gl,i=this.boundTextures;if(this._unknownBoundTextures){this._unknownBoundTextures=!1;for(var n=0;n<i.length;n++)i[n]===this.unknownTexture&&this.bind(null,n)}for(var r=0;r<i.length;r++)i[r]===t&&(this.currentLocation!==r&&(e.activeTexture(e.TEXTURE0+r),this.currentLocation=r),e.bindTexture(e.TEXTURE_2D,this.emptyTextures[t.target].texture),i[r]=null)},e.prototype.initTexture=function(t){var e=new QD(this.gl.createTexture());return e.dirtyId=-1,t._glTextures[this.CONTEXT_UID]=e,this.managedTextures.push(t),t.on("dispose",this.destroyTexture,this),e},e.prototype.initTextureType=function(t,e){if(e.internalFormat=t.format,e.type=t.type,2===this.webGLVersion){var i=this.renderer.gl;t.type===i.FLOAT&&t.format===i.RGBA&&(e.internalFormat=i.RGBA32F),t.type===XE.HALF_FLOAT&&(e.type=i.HALF_FLOAT),e.type===i.HALF_FLOAT&&t.format===i.RGBA&&(e.internalFormat=i.RGBA16F)}},e.prototype.updateTexture=function(t){var e=t._glTextures[this.CONTEXT_UID];if(e){var i=this.renderer;if(this.initTextureType(t,e),t.resource&&t.resource.upload(i,t,e));else{var n=t.realWidth,r=t.realHeight,s=i.gl;(e.width!==n||e.height!==r||e.dirtyId<0)&&(e.width=n,e.height=r,s.texImage2D(t.target,0,e.internalFormat,n,r,0,t.format,e.type,null))}t.dirtyStyleId!==e.dirtyStyleId&&this.updateTextureStyle(t),e.dirtyId=t.dirtyId}},e.prototype.destroyTexture=function(t,e){var i=this.gl;if((t=t.baseTexture||t)._glTextures[this.CONTEXT_UID]&&(this.unbind(t),i.deleteTexture(t._glTextures[this.CONTEXT_UID].texture),t.off("dispose",this.destroyTexture,this),delete t._glTextures[this.CONTEXT_UID],!e)){var n=this.managedTextures.indexOf(t);-1!==n&&pL(this.managedTextures,n,1)}},e.prototype.updateTextureStyle=function(t){var e=t._glTextures[this.CONTEXT_UID];e&&(t.mipmap!==ZE.POW2&&2===this.webGLVersion||t.isPowerOfTwo?e.mipmap=t.mipmap>=1:e.mipmap=0,2===this.webGLVersion||t.isPowerOfTwo?e.wrapMode=t.wrapMode:e.wrapMode=JE.CLAMP,t.resource&&t.resource.style(this.renderer,t,e)||this.setStyle(t,e),e.dirtyStyleId=t.dirtyStyleId)},e.prototype.setStyle=function(t,e){var i=this.gl;if(e.mipmap&&i.generateMipmap(t.target),i.texParameteri(t.target,i.TEXTURE_WRAP_S,e.wrapMode),i.texParameteri(t.target,i.TEXTURE_WRAP_T,e.wrapMode),e.mipmap){i.texParameteri(t.target,i.TEXTURE_MIN_FILTER,t.scaleMode===qE.LINEAR?i.LINEAR_MIPMAP_LINEAR:i.NEAREST_MIPMAP_NEAREST);var n=this.renderer.context.extensions.anisotropicFiltering;if(n&&t.anisotropicLevel>0&&t.scaleMode===qE.LINEAR){var r=Math.min(t.anisotropicLevel,i.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT));i.texParameterf(t.target,n.TEXTURE_MAX_ANISOTROPY_EXT,r)}}else i.texParameteri(t.target,i.TEXTURE_MIN_FILTER,t.scaleMode===qE.LINEAR?i.LINEAR:i.NEAREST);i.texParameteri(t.target,i.TEXTURE_MAG_FILTER,t.scaleMode===qE.LINEAR?i.LINEAR:i.NEAREST)},e}(EA),tP=new CL,eP=function(t){function e(i){void 0===i&&(i={}),t.call(this,"WebGL",i),i=this.options,this.type=HE.WEBGL,this.gl=null,this.CONTEXT_UID=0,this.runners={destroy:new lA("destroy"),contextChange:new lA("contextChange",1),reset:new lA("reset"),update:new lA("update"),postrender:new lA("postrender"),prerender:new lA("prerender"),resize:new lA("resize",2)},this.globalUniforms=new JA({projectionMatrix:new CL},!0),this.addSystem(BD,"mask").addSystem(eD,"context").addSystem(ZD,"state").addSystem(JD,"shader").addSystem($D,"texture").addSystem(sD,"geometry").addSystem(iD,"framebuffer").addSystem(jD,"scissor").addSystem(HD,"stencil").addSystem(zD,"projection").addSystem(KD,"textureGC").addSystem(KA,"filter").addSystem(GD,"renderTexture").addSystem($A,"batch"),this.initPlugins(e.__plugins),i.context?this.context.initFromContext(i.context):this.context.initFromOptions({alpha:this.transparent,antialias:i.antialias,premultipliedAlpha:this.transparent&&"notMultiplied"!==this.transparent,stencil:!0,preserveDrawingBuffer:i.preserveDrawingBuffer,powerPreference:this.options.powerPreference}),this.renderingToScreen=!0,function(t){var e;if(!nL){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var i=["\n %c %c %c PixiJS 5.2.3 - \u2730 "+t+" \u2730 %c %c http://www.pixijs.com/ %c %c \u2665%c\u2665%c\u2665 \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];(e=window.console).log.apply(e,i)}else window.console&&window.console.log("PixiJS 5.2.3 - "+t+" - http://www.pixijs.com/");nL=!0}}(2===this.context.webGLVersion?"WebGL 2":"WebGL 1"),this.resize(this.options.width,this.options.height)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.create=function(t){if(void 0===iL&&(iL=function(){var t={stencil:!0,failIfMajorPerformanceCaveat:IE.FAIL_IF_MAJOR_PERFORMANCE_CAVEAT};try{if(!window.WebGLRenderingContext)return!1;var e=document.createElement("canvas"),i=e.getContext("webgl",t)||e.getContext("experimental-webgl",t),n=!(!i||!i.getContextAttributes().stencil);if(i){var r=i.getExtension("WEBGL_lose_context");r&&r.loseContext()}return i=null,n}catch(t){return!1}}()),iL)return new e(t);throw new Error('WebGL unsupported in this browser, use "pixi.js-legacy" for fallback canvas2d support.')},e.prototype.addSystem=function(t,e){e||(e=t.name);var i=new t(this);if(this[e])throw new Error('Whoops! The name "'+e+'" is already in use');for(var n in this[e]=i,this.runners)this.runners[n].add(i);return this},e.prototype.render=function(t,e,i,n,r){if(this.renderingToScreen=!e,this.runners.prerender.run(),this.emit("prerender"),this.projection.transform=n,!this.context.isLost){if(e||(this._lastObjectRendered=t),!r){var s=t.parent;t.parent=this._tempDisplayObjectParent,t.updateTransform(),t.parent=s}this.renderTexture.bind(e),this.batch.currentRenderer.start(),(void 0!==i?i:this.clearBeforeRender)&&this.renderTexture.clear(),t.render(this),this.batch.currentRenderer.flush(),e&&e.baseTexture.update(),this.runners.postrender.run(),this.projection.transform=null,this.emit("postrender")}},e.prototype.resize=function(e,i){t.prototype.resize.call(this,e,i),this.runners.resize.run(e,i)},e.prototype.reset=function(){return this.runners.reset.run(),this},e.prototype.clear=function(){this.framebuffer.bind(),this.framebuffer.clear()},e.prototype.destroy=function(e){for(var i in this.runners.destroy.run(),this.runners)this.runners[i].destroy();t.prototype.destroy.call(this,e),this.gl=null},e.registerPlugin=function(t,i){e.__plugins=e.__plugins||{},e.__plugins[t]=i},e}(function(t){function e(e,i){t.call(this),(i=Object.assign({},IE.RENDER_OPTIONS,i)).roundPixels&&(IE.ROUND_PIXELS=i.roundPixels,yL("5.0.0","Renderer roundPixels option is deprecated, please use PIXI.settings.ROUND_PIXELS",2)),this.options=i,this.type=HE.UNKNOWN,this.screen=new jL(0,0,i.width,i.height),this.view=i.view||document.createElement("canvas"),this.resolution=i.resolution||IE.RESOLUTION,this.transparent=i.transparent,this.autoDensity=i.autoDensity||i.autoResize||!1,this.preserveDrawingBuffer=i.preserveDrawingBuffer,this.clearBeforeRender=i.clearBeforeRender,this._backgroundColor=0,this._backgroundColorRgba=[0,0,0,0],this._backgroundColorString="#000000",this.backgroundColor=i.backgroundColor||this._backgroundColor,this._tempDisplayObjectParent=new JL,this._lastObjectRendered=this._tempDisplayObjectParent,this.plugins={}}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={width:{configurable:!0},height:{configurable:!0},backgroundColor:{configurable:!0}};return e.prototype.initPlugins=function(t){for(var e in t)this.plugins[e]=new t[e](this)},i.width.get=function(){return this.view.width},i.height.get=function(){return this.view.height},e.prototype.resize=function(t,e){this.screen.width=t,this.screen.height=e,this.view.width=t*this.resolution,this.view.height=e*this.resolution,this.autoDensity&&(this.view.style.width=t+"px",this.view.style.height=e+"px")},e.prototype.generateTexture=function(t,e,i,n){0===(n=n||t.getLocalBounds()).width&&(n.width=1),0===n.height&&(n.height=1);var r=IA.create({width:0|n.width,height:0|n.height,scaleMode:e,resolution:i});return tP.tx=-n.x,tP.ty=-n.y,this.render(t,r,!1,tP,!!t.parent),r},e.prototype.destroy=function(t){for(var e in this.plugins)this.plugins[e].destroy(),this.plugins[e]=null;t&&this.view.parentNode&&this.view.parentNode.removeChild(this.view),this.plugins=null,this.type=HE.UNKNOWN,this.view=null,this.screen=null,this.resolution=0,this.transparent=!1,this.autoDensity=!1,this.blendModes=null,this.options=null,this.preserveDrawingBuffer=!1,this.clearBeforeRender=!1,this._backgroundColor=0,this._backgroundColorRgba=null,this._backgroundColorString=null,this._tempDisplayObjectParent=null,this._lastObjectRendered=null},i.backgroundColor.get=function(){return this._backgroundColor},i.backgroundColor.set=function(t){this._backgroundColor=t,this._backgroundColorString=sL(t),rL(t,this._backgroundColorRgba)},Object.defineProperties(e.prototype,i),e}(FE()));var iP="attribute vec2 aVertexPosition;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nuniform vec4 inputSize;\nuniform vec4 outputFrame;\n\nvec4 filterVertexPosition( void )\n{\n vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\n\n return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord( void )\n{\n return aVertexPosition * (outputFrame.zw * inputSize.zw);\n}\n\nvoid main(void)\n{\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n",nP=function(){this.texArray=null,this.blend=0,this.type=WE.TRIANGLES,this.start=0,this.size=0,this.data=null},rP=function(){this.elements=[],this.ids=[],this.count=0};rP.prototype.clear=function(){for(var t=0;t<this.count;t++)this.elements[t]=null;this.count=0};var sP=function(t){this.rawBinaryData=new ArrayBuffer(t),this.uint32View=new Uint32Array(this.rawBinaryData),this.float32View=new Float32Array(this.rawBinaryData)},oP={int8View:{configurable:!0},uint8View:{configurable:!0},int16View:{configurable:!0},uint16View:{configurable:!0},int32View:{configurable:!0}};oP.int8View.get=function(){return this._int8View||(this._int8View=new Int8Array(this.rawBinaryData)),this._int8View},oP.uint8View.get=function(){return this._uint8View||(this._uint8View=new Uint8Array(this.rawBinaryData)),this._uint8View},oP.int16View.get=function(){return this._int16View||(this._int16View=new Int16Array(this.rawBinaryData)),this._int16View},oP.uint16View.get=function(){return this._uint16View||(this._uint16View=new Uint16Array(this.rawBinaryData)),this._uint16View},oP.int32View.get=function(){return this._int32View||(this._int32View=new Int32Array(this.rawBinaryData)),this._int32View},sP.prototype.view=function(t){return this[t+"View"]},sP.prototype.destroy=function(){this.rawBinaryData=null,this._int8View=null,this._uint8View=null,this._int16View=null,this._uint16View=null,this._int32View=null,this.uint32View=null,this.float32View=null},sP.sizeOf=function(t){switch(t){case"int8":case"uint8":return 1;case"int16":case"uint16":return 2;case"int32":case"uint32":case"float32":return 4;default:throw new Error(t+" isn't a valid view type")}},Object.defineProperties(sP.prototype,oP);var aP=function(t){function e(e){t.call(this,e),this.shaderGenerator=null,this.geometryClass=null,this.vertexSize=null,this.state=OD.for2d(),this.size=4*IE.SPRITE_BATCH_SIZE,this._vertexCount=0,this._indexCount=0,this._bufferedElements=[],this._bufferedTextures=[],this._bufferSize=0,this._shader=null,this._packedGeometries=[],this._packedGeometryPoolSize=2,this._flushId=0,this._aBuffers={},this._iBuffers={},this.MAX_TEXTURES=1,this.renderer.on("prerender",this.onPrerender,this),e.runners.contextChange.add(this),this._dcIndex=0,this._aIndex=0,this._iIndex=0,this._attributeBuffer=null,this._indexBuffer=null,this._tempBoundTextures=[]}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.contextChange=function(){var t=this.renderer.gl;IE.PREFER_ENV===jE.WEBGL_LEGACY?this.MAX_TEXTURES=1:(this.MAX_TEXTURES=Math.min(t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),IE.SPRITE_MAX_TEXTURES),this.MAX_TEXTURES=function(t,e){if(0===t)throw new Error("Invalid value of `0` passed to `checkMaxIfStatementsInShader`");for(var i=e.createShader(e.FRAGMENT_SHADER);;){var n=MD.replace(/%forloop%/gi,SD(t));if(e.shaderSource(i,n),e.compileShader(i),e.getShaderParameter(i,e.COMPILE_STATUS))break;t=t/2|0}return t}(this.MAX_TEXTURES,t)),this._shader=this.shaderGenerator.generateShader(this.MAX_TEXTURES);for(var e=0;e<this._packedGeometryPoolSize;e++)this._packedGeometries[e]=new this.geometryClass;this.initFlushBuffers()},e.prototype.initFlushBuffers=function(){for(var t=e._drawCallPool,i=e._textureArrayPool,n=this.size/4,r=Math.floor(n/this.MAX_TEXTURES)+1;t.length<n;)t.push(new nP);for(;i.length<r;)i.push(new rP);for(var s=0;s<this.MAX_TEXTURES;s++)this._tempBoundTextures[s]=null},e.prototype.onPrerender=function(){this._flushId=0},e.prototype.render=function(t){t._texture.valid&&(this._vertexCount+t.vertexData.length/2>this.size&&this.flush(),this._vertexCount+=t.vertexData.length/2,this._indexCount+=t.indices.length,this._bufferedTextures[this._bufferSize]=t._texture.baseTexture,this._bufferedElements[this._bufferSize++]=t)},e.prototype.buildTexturesAndDrawCalls=function(){var t=this._bufferedTextures,i=this.MAX_TEXTURES,n=e._textureArrayPool,r=this.renderer.batch,s=this._tempBoundTextures,o=this.renderer.textureGC.count,a=++_A._globalBatch,h=0,u=n[0],l=0;r.copyBoundTextures(s,i);for(var c=0;c<this._bufferSize;++c){var d=t[c];t[c]=null,d._batchEnabled!==a&&(u.count>=i&&(r.boundArray(u,s,a,i),this.buildDrawCalls(u,l,c),l=c,u=n[++h],++a),d._batchEnabled=a,d.touched=o,u.elements[u.count++]=d)}u.count>0&&(r.boundArray(u,s,a,i),this.buildDrawCalls(u,l,this._bufferSize),++h,++a);for(var p=0;p<s.length;p++)s[p]=null;_A._globalBatch=a},e.prototype.buildDrawCalls=function(t,i,n){var r=this,s=r._bufferedElements,o=r._attributeBuffer,a=r._indexBuffer,h=r.vertexSize,u=e._drawCallPool,l=this._dcIndex,c=this._aIndex,d=this._iIndex,p=u[l];p.start=this._iIndex,p.texArray=t;for(var f=i;f<n;++f){var m=s[f],v=m._texture.baseTexture,g=oL[v.alphaMode?1:0][m.blendMode];s[f]=null,i<f&&p.blend!==g&&(p.size=d-p.start,i=f,(p=u[++l]).texArray=t,p.start=d),this.packInterleavedGeometry(m,o,a,c,d),c+=m.vertexData.length/2*h,d+=m.indices.length,p.blend=g}i<n&&(p.size=d-p.start,++l),this._dcIndex=l,this._aIndex=c,this._iIndex=d},e.prototype.bindAndClearTexArray=function(t){for(var e=this.renderer.texture,i=0;i<t.count;i++)e.bind(t.elements[i],t.ids[i]),t.elements[i]=null;t.count=0},e.prototype.updateGeometry=function(){var t=this,e=t._packedGeometries,i=t._attributeBuffer,n=t._indexBuffer;IE.CAN_UPLOAD_SAME_BUFFER?(e[this._flushId]._buffer.update(i.rawBinaryData),e[this._flushId]._indexBuffer.update(n),this.renderer.geometry.updateBuffers()):(this._packedGeometryPoolSize<=this._flushId&&(this._packedGeometryPoolSize++,e[this._flushId]=new this.geometryClass),e[this._flushId]._buffer.update(i.rawBinaryData),e[this._flushId]._indexBuffer.update(n),this.renderer.geometry.bind(e[this._flushId]),this.renderer.geometry.updateBuffers(),this._flushId++)},e.prototype.drawBatches=function(){for(var t=this._dcIndex,i=this.renderer,n=i.gl,r=i.state,s=e._drawCallPool,o=null,a=0;a<t;a++){var h=s[a],u=h.texArray,l=h.type,c=h.size,d=h.start,p=h.blend;o!==u&&(o=u,this.bindAndClearTexArray(u)),this.state.blendMode=p,r.set(this.state),n.drawElements(l,c,n.UNSIGNED_SHORT,2*d)}},e.prototype.flush=function(){0!==this._vertexCount&&(this._attributeBuffer=this.getAttributeBuffer(this._vertexCount),this._indexBuffer=this.getIndexBuffer(this._indexCount),this._aIndex=0,this._iIndex=0,this._dcIndex=0,this.buildTexturesAndDrawCalls(),this.updateGeometry(),this.drawBatches(),this._bufferSize=0,this._vertexCount=0,this._indexCount=0)},e.prototype.start=function(){this.renderer.state.set(this.state),this.renderer.shader.bind(this._shader),IE.CAN_UPLOAD_SAME_BUFFER&&this.renderer.geometry.bind(this._packedGeometries[this._flushId])},e.prototype.stop=function(){this.flush()},e.prototype.destroy=function(){for(var e=0;e<this._packedGeometryPoolSize;e++)this._packedGeometries[e]&&this._packedGeometries[e].destroy();this.renderer.off("prerender",this.onPrerender,this),this._aBuffers=null,this._iBuffers=null,this._packedGeometries=null,this._attributeBuffer=null,this._indexBuffer=null,this._shader&&(this._shader.destroy(),this._shader=null),t.prototype.destroy.call(this)},e.prototype.getAttributeBuffer=function(t){var e=lL(Math.ceil(t/8)),i=dL(e),n=8*e;this._aBuffers.length<=i&&(this._iBuffers.length=i+1);var r=this._aBuffers[n];return r||(this._aBuffers[n]=r=new sP(n*this.vertexSize*4)),r},e.prototype.getIndexBuffer=function(t){var e=lL(Math.ceil(t/12)),i=dL(e),n=12*e;this._iBuffers.length<=i&&(this._iBuffers.length=i+1);var r=this._iBuffers[i];return r||(this._iBuffers[i]=r=new Uint16Array(n)),r},e.prototype.packInterleavedGeometry=function(t,e,i,n,r){for(var s=e.uint32View,o=e.float32View,a=n/this.vertexSize,h=t.uvs,u=t.indices,l=t.vertexData,c=t._texture.baseTexture._batchLocation,d=Math.min(t.worldAlpha,1),p=d<1&&t._texture.baseTexture.alphaMode?hL(t._tintRGB,d):t._tintRGB+(255*d<<24),f=0;f<l.length;f+=2)o[n++]=l[f],o[n++]=l[f+1],o[n++]=h[f],o[n++]=h[f+1],s[n++]=p,o[n++]=c;for(var m=0;m<u.length;m++)i[r++]=a+u[m]},e}(QA);aP._drawCallPool=[],aP._textureArrayPool=[];var hP=function(t,e){if(this.vertexSrc=t,this.fragTemplate=e,this.programCache={},this.defaultGroupCache={},e.indexOf("%count%")<0)throw new Error('Fragment template must contain "%count%".');if(e.indexOf("%forloop%")<0)throw new Error('Fragment template must contain "%forloop%".')};hP.prototype.generateShader=function(t){if(!this.programCache[t]){for(var e=new Int32Array(t),i=0;i<t;i++)e[i]=i;this.defaultGroupCache[t]=JA.from({uSamplers:e},!0);var n=this.fragTemplate;n=(n=n.replace(/%count%/gi,""+t)).replace(/%forloop%/gi,this.generateSampleSrc(t)),this.programCache[t]=new AD(this.vertexSrc,n)}var r={tint:new Float32Array([1,1,1,1]),translationMatrix:new CL,default:this.defaultGroupCache[t]};return new PD(this.programCache[t],r)},hP.prototype.generateSampleSrc=function(t){var e="";e+="\n",e+="\n";for(var i=0;i<t;i++)i>0&&(e+="\nelse "),i<t-1&&(e+="if(vTextureId < "+i+".5)"),e+="\n{",e+="\n\tcolor = texture2D(uSamplers["+i+"], vTextureCoord);",e+="\n}";return e+="\n",e+="\n"};var uP=function(t){function e(e){void 0===e&&(e=!1),t.call(this),this._buffer=new BA(null,e,!1),this._indexBuffer=new BA(null,e,!0),this.addAttribute("aVertexPosition",this._buffer,2,!1,XE.FLOAT).addAttribute("aTextureCoord",this._buffer,2,!1,XE.FLOAT).addAttribute("aColor",this._buffer,4,!0,XE.UNSIGNED_BYTE).addAttribute("aTextureId",this._buffer,1,!0,XE.FLOAT).addIndex(this._indexBuffer)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(GA),lP="precision highp float;\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\nattribute float aTextureId;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform vec4 tint;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\n\nvoid main(void){\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vTextureId = aTextureId;\n vColor = aColor * tint;\n}\n",cP="varying vec2 vTextureCoord;\nvarying vec4 vColor;\nvarying float vTextureId;\nuniform sampler2D uSamplers[%count%];\n\nvoid main(void){\n vec4 color;\n %forloop%\n gl_FragColor = color * vColor;\n}\n",dP=function(){},pP={defaultVertexSrc:{configurable:!0},defaultFragmentTemplate:{configurable:!0}};dP.create=function(t){var e=Object.assign({vertex:lP,fragment:cP,geometryClass:uP,vertexSize:6},t),i=e.vertex,n=e.fragment,r=e.vertexSize,s=e.geometryClass;return function(t){function e(e){t.call(this,e),this.shaderGenerator=new hP(i,n),this.geometryClass=s,this.vertexSize=r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(aP)},pP.defaultVertexSrc.get=function(){return lP},pP.defaultFragmentTemplate.get=function(){return cP},Object.defineProperties(dP,pP);var fP=dP.create(),mP=function t(e){var i=this;e=Object.assign({forceCanvas:!1},e),this.renderer=function(t){return eP.create(t)}(e),this.stage=new JL,t._plugins.forEach((function(t){t.init.call(i,e)}))},vP={view:{configurable:!0},screen:{configurable:!0}};mP.registerPlugin=function(t){mP._plugins.push(t)},mP.prototype.render=function(){this.renderer.render(this.stage)},vP.view.get=function(){return this.renderer.view},vP.screen.get=function(){return this.renderer.screen},mP.prototype.destroy=function(t,e){var i=this,n=mP._plugins.slice(0);n.reverse(),n.forEach((function(t){t.destroy.call(i)})),this.stage.destroy(e),this.stage=null,this.renderer.destroy(t),this.renderer=null,this._options=null},Object.defineProperties(mP.prototype,vP),mP._plugins=[];var gP=function(){};gP.init=function(t){var e=this;Object.defineProperty(this,"resizeTo",{set:function(t){window.removeEventListener("resize",this.resize),this._resizeTo=t,t&&(window.addEventListener("resize",this.resize),this.resize())},get:function(){return this._resizeTo}}),this.resize=function(){e._resizeTo&&(e._resizeTo===window?e.renderer.resize(window.innerWidth,window.innerHeight):e.renderer.resize(e._resizeTo.clientWidth,e._resizeTo.clientHeight))},this._resizeTo=null,this.resizeTo=t.resizeTo||null},gP.destroy=function(){this.resizeTo=null,this.resize=null},mP.registerPlugin(gP);var yP=new jL,_P=function(t){this.renderer=t,t.extract=this};_P.prototype.image=function(t,e,i){var n=new Image;return n.src=this.base64(t,e,i),n},_P.prototype.base64=function(t,e,i){return this.canvas(t).toDataURL(e,i)},_P.prototype.canvas=function(t){var e,i,n,r=this.renderer,s=!1,o=!1;t&&(t instanceof IA?n=t:(n=this.renderer.generateTexture(t),o=!0)),n?(e=n.baseTexture.resolution,i=n.frame,s=!1,r.renderTexture.bind(n)):(e=this.renderer.resolution,s=!0,(i=yP).width=this.renderer.width,i.height=this.renderer.height,r.renderTexture.bind(null));var a=Math.floor(i.width*e+1e-4),h=Math.floor(i.height*e+1e-4),u=new wL(a,h,1),l=new Uint8Array(4*a*h),c=r.gl;c.readPixels(i.x*e,i.y*e,a,h,c.RGBA,c.UNSIGNED_BYTE,l);var d=u.context.getImageData(0,0,a,h);if(_P.arrayPostDivide(l,d.data),u.context.putImageData(d,0,0),s){var p=new wL(u.width,u.height,1);p.context.scale(1,-1),p.context.drawImage(u.canvas,0,-h),u.destroy(),u=p}return o&&n.destroy(!0),u.canvas},_P.prototype.pixels=function(t){var e,i,n,r=this.renderer,s=!1;t&&(t instanceof IA?n=t:(n=this.renderer.generateTexture(t),s=!0)),n?(e=n.baseTexture.resolution,i=n.frame,r.renderTexture.bind(n)):(e=r.resolution,(i=yP).width=r.width,i.height=r.height,r.renderTexture.bind(null));var o=i.width*e,a=i.height*e,h=new Uint8Array(4*o*a),u=r.gl;return u.readPixels(i.x*e,i.y*e,o,a,u.RGBA,u.UNSIGNED_BYTE,h),s&&n.destroy(!0),_P.arrayPostDivide(h,h),h},_P.prototype.destroy=function(){this.renderer.extract=null,this.renderer=null},_P.arrayPostDivide=function(t,e){for(var i=0;i<t.length;i+=4){var n=e[i+3]=t[i+3];0!==n?(e[i]=Math.round(Math.min(255*t[i]/n,255)),e[i+1]=Math.round(Math.min(255*t[i+1]/n,255)),e[i+2]=Math.round(Math.min(255*t[i+2]/n,255))):(e[i]=t[i],e[i+1]=t[i+1],e[i+2]=t[i+2])}};var xP=i(21639),bP=i.n(xP),wP=i(82474),TP=i.n(wP);function MP(){}function SP(t,e,i,n){var r=0,s=t.length;!function o(a){a||r===s?i&&i(a):n?setTimeout((function(){e(t[r++],o)}),1):e(t[r++],o)}()}function EP(t){return function(){if(null===t)throw new Error("Callback was already called.");var e=t;t=null,e.apply(this,arguments)}}function LP(t,e){if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var i=0,n={_tasks:[],concurrency:e,saturated:MP,unsaturated:MP,buffer:e/4,empty:MP,drain:MP,error:MP,started:!1,paused:!1,push:function(t,e){r(t,!1,e)},kill:function(){i=0,n.drain=MP,n.started=!1,n._tasks=[]},unshift:function(t,e){r(t,!0,e)},process:function(){for(;!n.paused&&i<n.concurrency&&n._tasks.length;){var e=n._tasks.shift();0===n._tasks.length&&n.empty(),(i+=1)===n.concurrency&&n.saturated(),t(e.data,EP(s(e)))}},length:function(){return n._tasks.length},running:function(){return i},idle:function(){return n._tasks.length+i===0},pause:function(){!0!==n.paused&&(n.paused=!0)},resume:function(){if(!1!==n.paused){n.paused=!1;for(var t=1;t<=n.concurrency;t++)n.process()}}};function r(t,e,i){if(null!=i&&"function"!=typeof i)throw new Error("task callback must be a function");if(n.started=!0,null==t&&n.idle())setTimeout((function(){return n.drain()}),1);else{var r={data:t,callback:"function"==typeof i?i:MP};e?n._tasks.unshift(r):n._tasks.push(r),setTimeout((function(){return n.process()}),1)}}function s(t){return function(){i-=1,t.callback.apply(t,arguments),null!=arguments[0]&&n.error(arguments[0],t.data),i<=n.concurrency-n.buffer&&n.unsaturated(),n.idle()&&n.drain(),n.process()}}return n}var AP={};function DP(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function PP(t,e,i){return e&&DP(t.prototype,e),i&&DP(t,i),t}var CP=!(!window.XDomainRequest||"withCredentials"in new XMLHttpRequest),OP=null;function kP(){}var RP=function(){function t(e,i,n){if("string"!=typeof e||"string"!=typeof i)throw new Error("Both name and url are required for constructing a resource.");n=n||{},this._flags=0,this._setFlag(t.STATUS_FLAGS.DATA_URL,0===i.indexOf("data:")),this.name=e,this.url=i,this.extension=this._getExtension(),this.data=null,this.crossOrigin=!0===n.crossOrigin?"anonymous":n.crossOrigin,this.timeout=n.timeout||0,this.loadType=n.loadType||this._determineLoadType(),this.xhrType=n.xhrType,this.metadata=n.metadata||{},this.error=null,this.xhr=null,this.children=[],this.type=t.TYPE.UNKNOWN,this.progressChunk=0,this._dequeue=kP,this._onLoadBinding=null,this._elementTimer=0,this._boundComplete=this.complete.bind(this),this._boundOnError=this._onError.bind(this),this._boundOnProgress=this._onProgress.bind(this),this._boundOnTimeout=this._onTimeout.bind(this),this._boundXhrOnError=this._xhrOnError.bind(this),this._boundXhrOnTimeout=this._xhrOnTimeout.bind(this),this._boundXhrOnAbort=this._xhrOnAbort.bind(this),this._boundXhrOnLoad=this._xhrOnLoad.bind(this),this.onStart=new(TP()),this.onProgress=new(TP()),this.onComplete=new(TP()),this.onAfterMiddleware=new(TP())}t.setExtensionLoadType=function(e,i){IP(t._loadTypeMap,e,i)},t.setExtensionXhrType=function(e,i){IP(t._xhrTypeMap,e,i)};var e=t.prototype;return e.complete=function(){this._clearEvents(),this._finish()},e.abort=function(e){if(!this.error){if(this.error=new Error(e),this._clearEvents(),this.xhr)this.xhr.abort();else if(this.xdr)this.xdr.abort();else if(this.data)if(this.data.src)this.data.src=t.EMPTY_GIF;else for(;this.data.firstChild;)this.data.removeChild(this.data.firstChild);this._finish()}},e.load=function(e){var i=this;if(!this.isLoading)if(this.isComplete)e&&setTimeout((function(){return e(i)}),1);else switch(e&&this.onComplete.once(e),this._setFlag(t.STATUS_FLAGS.LOADING,!0),this.onStart.dispatch(this),!1!==this.crossOrigin&&"string"==typeof this.crossOrigin||(this.crossOrigin=this._determineCrossOrigin(this.url)),this.loadType){case t.LOAD_TYPE.IMAGE:this.type=t.TYPE.IMAGE,this._loadElement("image");break;case t.LOAD_TYPE.AUDIO:this.type=t.TYPE.AUDIO,this._loadSourceElement("audio");break;case t.LOAD_TYPE.VIDEO:this.type=t.TYPE.VIDEO,this._loadSourceElement("video");break;case t.LOAD_TYPE.XHR:default:CP&&this.crossOrigin?this._loadXdr():this._loadXhr()}},e._hasFlag=function(t){return 0!=(this._flags&t)},e._setFlag=function(t,e){this._flags=e?this._flags|t:this._flags&~t},e._clearEvents=function(){clearTimeout(this._elementTimer),this.data&&this.data.removeEventListener&&(this.data.removeEventListener("error",this._boundOnError,!1),this.data.removeEventListener("load",this._boundComplete,!1),this.data.removeEventListener("progress",this._boundOnProgress,!1),this.data.removeEventListener("canplaythrough",this._boundComplete,!1)),this.xhr&&(this.xhr.removeEventListener?(this.xhr.removeEventListener("error",this._boundXhrOnError,!1),this.xhr.removeEventListener("timeout",this._boundXhrOnTimeout,!1),this.xhr.removeEventListener("abort",this._boundXhrOnAbort,!1),this.xhr.removeEventListener("progress",this._boundOnProgress,!1),this.xhr.removeEventListener("load",this._boundXhrOnLoad,!1)):(this.xhr.onerror=null,this.xhr.ontimeout=null,this.xhr.onprogress=null,this.xhr.onload=null))},e._finish=function(){if(this.isComplete)throw new Error("Complete called again for an already completed resource.");this._setFlag(t.STATUS_FLAGS.COMPLETE,!0),this._setFlag(t.STATUS_FLAGS.LOADING,!1),this.onComplete.dispatch(this)},e._loadElement=function(t){this.metadata.loadElement?this.data=this.metadata.loadElement:"image"===t&&void 0!==window.Image?this.data=new Image:this.data=document.createElement(t),this.crossOrigin&&(this.data.crossOrigin=this.crossOrigin),this.metadata.skipSource||(this.data.src=this.url),this.data.addEventListener("error",this._boundOnError,!1),this.data.addEventListener("load",this._boundComplete,!1),this.data.addEventListener("progress",this._boundOnProgress,!1),this.timeout&&(this._elementTimer=setTimeout(this._boundOnTimeout,this.timeout))},e._loadSourceElement=function(t){if(this.metadata.loadElement?this.data=this.metadata.loadElement:"audio"===t&&void 0!==window.Audio?this.data=new Audio:this.data=document.createElement(t),null!==this.data){if(this.crossOrigin&&(this.data.crossOrigin=this.crossOrigin),!this.metadata.skipSource)if(navigator.isCocoonJS)this.data.src=Array.isArray(this.url)?this.url[0]:this.url;else if(Array.isArray(this.url))for(var e=this.metadata.mimeType,i=0;i<this.url.length;++i)this.data.appendChild(this._createSource(t,this.url[i],Array.isArray(e)?e[i]:e));else{var n=this.metadata.mimeType;this.data.appendChild(this._createSource(t,this.url,Array.isArray(n)?n[0]:n))}this.data.addEventListener("error",this._boundOnError,!1),this.data.addEventListener("load",this._boundComplete,!1),this.data.addEventListener("progress",this._boundOnProgress,!1),this.data.addEventListener("canplaythrough",this._boundComplete,!1),this.data.load(),this.timeout&&(this._elementTimer=setTimeout(this._boundOnTimeout,this.timeout))}else this.abort("Unsupported element: "+t)},e._loadXhr=function(){"string"!=typeof this.xhrType&&(this.xhrType=this._determineXhrType());var e=this.xhr=new XMLHttpRequest;e.open("GET",this.url,!0),e.timeout=this.timeout,this.xhrType===t.XHR_RESPONSE_TYPE.JSON||this.xhrType===t.XHR_RESPONSE_TYPE.DOCUMENT?e.responseType=t.XHR_RESPONSE_TYPE.TEXT:e.responseType=this.xhrType,e.addEventListener("error",this._boundXhrOnError,!1),e.addEventListener("timeout",this._boundXhrOnTimeout,!1),e.addEventListener("abort",this._boundXhrOnAbort,!1),e.addEventListener("progress",this._boundOnProgress,!1),e.addEventListener("load",this._boundXhrOnLoad,!1),e.send()},e._loadXdr=function(){"string"!=typeof this.xhrType&&(this.xhrType=this._determineXhrType());var t=this.xhr=new XDomainRequest;t.timeout=this.timeout||5e3,t.onerror=this._boundXhrOnError,t.ontimeout=this._boundXhrOnTimeout,t.onprogress=this._boundOnProgress,t.onload=this._boundXhrOnLoad,t.open("GET",this.url,!0),setTimeout((function(){return t.send()}),1)},e._createSource=function(t,e,i){i||(i=t+"/"+this._getExtension(e));var n=document.createElement("source");return n.src=e,n.type=i,n},e._onError=function(t){this.abort("Failed to load element using: "+t.target.nodeName)},e._onProgress=function(t){t&&t.lengthComputable&&this.onProgress.dispatch(this,t.loaded/t.total)},e._onTimeout=function(){this.abort("Load timed out.")},e._xhrOnError=function(){var t=this.xhr;this.abort(YP(t)+" Request failed. Status: "+t.status+', text: "'+t.statusText+'"')},e._xhrOnTimeout=function(){var t=this.xhr;this.abort(YP(t)+" Request timed out.")},e._xhrOnAbort=function(){var t=this.xhr;this.abort(YP(t)+" Request was aborted by the user.")},e._xhrOnLoad=function(){var e=this.xhr,i="",n=void 0===e.status?200:e.status;if(""!==e.responseType&&"text"!==e.responseType&&void 0!==e.responseType||(i=e.responseText),0===n&&(i.length>0||e.responseType===t.XHR_RESPONSE_TYPE.BUFFER)?n=200:1223===n&&(n=204),2===(n/100|0)){if(this.xhrType===t.XHR_RESPONSE_TYPE.TEXT)this.data=i,this.type=t.TYPE.TEXT;else if(this.xhrType===t.XHR_RESPONSE_TYPE.JSON)try{this.data=JSON.parse(i),this.type=t.TYPE.JSON}catch(t){return void this.abort("Error trying to parse loaded json: "+t)}else if(this.xhrType===t.XHR_RESPONSE_TYPE.DOCUMENT)try{if(window.DOMParser){var r=new DOMParser;this.data=r.parseFromString(i,"text/xml")}else{var s=document.createElement("div");s.innerHTML=i,this.data=s}this.type=t.TYPE.XML}catch(t){return void this.abort("Error trying to parse loaded xml: "+t)}else this.data=e.response||i;this.complete()}else this.abort("["+e.status+"] "+e.statusText+": "+e.responseURL)},e._determineCrossOrigin=function(t,e){if(0===t.indexOf("data:"))return"";if(window.origin!==window.location.origin)return"anonymous";e=e||window.location,OP||(OP=document.createElement("a")),OP.href=t;var i=!(t=bP()(OP.href,{strictMode:!0})).port&&""===e.port||t.port===e.port,n=t.protocol?t.protocol+":":"";return t.host===e.hostname&&i&&n===e.protocol?"":"anonymous"},e._determineXhrType=function(){return t._xhrTypeMap[this.extension]||t.XHR_RESPONSE_TYPE.TEXT},e._determineLoadType=function(){return t._loadTypeMap[this.extension]||t.LOAD_TYPE.XHR},e._getExtension=function(){var t=this.url,e="";if(this.isDataUrl){var i=t.indexOf("/");e=t.substring(i+1,t.indexOf(";",i))}else{var n=t.indexOf("?"),r=t.indexOf("#"),s=Math.min(n>-1?n:t.length,r>-1?r:t.length);e=(t=t.substring(0,s)).substring(t.lastIndexOf(".")+1)}return e.toLowerCase()},e._getMimeFromXhrType=function(e){switch(e){case t.XHR_RESPONSE_TYPE.BUFFER:return"application/octet-binary";case t.XHR_RESPONSE_TYPE.BLOB:return"application/blob";case t.XHR_RESPONSE_TYPE.DOCUMENT:return"application/xml";case t.XHR_RESPONSE_TYPE.JSON:return"application/json";case t.XHR_RESPONSE_TYPE.DEFAULT:case t.XHR_RESPONSE_TYPE.TEXT:default:return"text/plain"}},PP(t,[{key:"isDataUrl",get:function(){return this._hasFlag(t.STATUS_FLAGS.DATA_URL)}},{key:"isComplete",get:function(){return this._hasFlag(t.STATUS_FLAGS.COMPLETE)}},{key:"isLoading",get:function(){return this._hasFlag(t.STATUS_FLAGS.LOADING)}}]),t}();function IP(t,e,i){e&&0===e.indexOf(".")&&(e=e.substring(1)),e&&(t[e]=i)}function YP(t){return t.toString().replace("object ","")}RP.STATUS_FLAGS={NONE:0,DATA_URL:1,COMPLETE:2,LOADING:4},RP.TYPE={UNKNOWN:0,JSON:1,XML:2,IMAGE:3,AUDIO:4,VIDEO:5,TEXT:6},RP.LOAD_TYPE={XHR:1,IMAGE:2,AUDIO:3,VIDEO:4},RP.XHR_RESPONSE_TYPE={DEFAULT:"text",BUFFER:"arraybuffer",BLOB:"blob",DOCUMENT:"document",JSON:"json",TEXT:"text"},RP._loadTypeMap={gif:RP.LOAD_TYPE.IMAGE,png:RP.LOAD_TYPE.IMAGE,bmp:RP.LOAD_TYPE.IMAGE,jpg:RP.LOAD_TYPE.IMAGE,jpeg:RP.LOAD_TYPE.IMAGE,tif:RP.LOAD_TYPE.IMAGE,tiff:RP.LOAD_TYPE.IMAGE,webp:RP.LOAD_TYPE.IMAGE,tga:RP.LOAD_TYPE.IMAGE,svg:RP.LOAD_TYPE.IMAGE,"svg+xml":RP.LOAD_TYPE.IMAGE,mp3:RP.LOAD_TYPE.AUDIO,ogg:RP.LOAD_TYPE.AUDIO,wav:RP.LOAD_TYPE.AUDIO,mp4:RP.LOAD_TYPE.VIDEO,webm:RP.LOAD_TYPE.VIDEO},RP._xhrTypeMap={xhtml:RP.XHR_RESPONSE_TYPE.DOCUMENT,html:RP.XHR_RESPONSE_TYPE.DOCUMENT,htm:RP.XHR_RESPONSE_TYPE.DOCUMENT,xml:RP.XHR_RESPONSE_TYPE.DOCUMENT,tmx:RP.XHR_RESPONSE_TYPE.DOCUMENT,svg:RP.XHR_RESPONSE_TYPE.DOCUMENT,tsx:RP.XHR_RESPONSE_TYPE.DOCUMENT,gif:RP.XHR_RESPONSE_TYPE.BLOB,png:RP.XHR_RESPONSE_TYPE.BLOB,bmp:RP.XHR_RESPONSE_TYPE.BLOB,jpg:RP.XHR_RESPONSE_TYPE.BLOB,jpeg:RP.XHR_RESPONSE_TYPE.BLOB,tif:RP.XHR_RESPONSE_TYPE.BLOB,tiff:RP.XHR_RESPONSE_TYPE.BLOB,webp:RP.XHR_RESPONSE_TYPE.BLOB,tga:RP.XHR_RESPONSE_TYPE.BLOB,json:RP.XHR_RESPONSE_TYPE.JSON,text:RP.XHR_RESPONSE_TYPE.TEXT,txt:RP.XHR_RESPONSE_TYPE.TEXT,ttf:RP.XHR_RESPONSE_TYPE.BUFFER,otf:RP.XHR_RESPONSE_TYPE.BUFFER},RP.EMPTY_GIF="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";var FP=window.URL||window.webkitURL;var NP={caching:function(t,e){var i=this;AP[t.url]?(t.data=AP[t.url],t.complete()):t.onComplete.once((function(){return AP[i.url]=i.data})),e()},parsing:function(t,e){if(t.data){if(t.xhr&&t.xhrType===RP.XHR_RESPONSE_TYPE.BLOB)if(window.Blob&&"string"!=typeof t.data){if(0===t.data.type.indexOf("image")){var i=FP.createObjectURL(t.data);return t.blob=t.data,t.data=new Image,t.data.src=i,t.type=RP.TYPE.IMAGE,void(t.data.onload=function(){FP.revokeObjectURL(i),t.data.onload=null,e()})}}else{var n=t.xhr.getResponseHeader("content-type");if(n&&0===n.indexOf("image"))return t.data=new Image,t.data.src="data:"+n+";base64,"+function(t){for(var e="",i=0;i<t.length;){for(var n=[0,0,0],r=[0,0,0,0],s=0;s<n.length;++s)i<t.length?n[s]=255&t.charCodeAt(i++):n[s]=0;switch(r[0]=n[0]>>2,r[1]=(3&n[0])<<4|n[1]>>4,r[2]=(15&n[1])<<2|n[2]>>6,r[3]=63&n[2],i-(t.length-1)){case 2:r[3]=64,r[2]=64;break;case 1:r[3]=64}for(var o=0;o<r.length;++o)e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(r[o])}return e}(t.xhr.responseText),t.type=RP.TYPE.IMAGE,void(t.data.onload=function(){t.data.onload=null,e()})}e()}else e()}},BP=/(#[\w-]+)?$/,UP=function(){function t(e,i){var n=this;void 0===e&&(e=""),void 0===i&&(i=10),this.baseUrl=e,this.progress=0,this.loading=!1,this.defaultQueryString="",this._beforeMiddleware=[],this._afterMiddleware=[],this._resourcesParsing=[],this._boundLoadResource=function(t,e){return n._loadResource(t,e)},this._queue=LP(this._boundLoadResource,i),this._queue.pause(),this.resources={},this.onProgress=new(TP()),this.onError=new(TP()),this.onLoad=new(TP()),this.onStart=new(TP()),this.onComplete=new(TP());for(var r=0;r<t._defaultBeforeMiddleware.length;++r)this.pre(t._defaultBeforeMiddleware[r]);for(var s=0;s<t._defaultAfterMiddleware.length;++s)this.use(t._defaultAfterMiddleware[s])}var e=t.prototype;return e.add=function(t,e,i,n){if(Array.isArray(t)){for(var r=0;r<t.length;++r)this.add(t[r]);return this}if("object"==typeof t&&(n=e||t.callback||t.onComplete,i=t,e=t.url,t=t.name||t.key||t.url),"string"!=typeof e&&(n=i,i=e,e=t),"string"!=typeof e)throw new Error("No url passed to add resource to loader.");if("function"==typeof i&&(n=i,i=null),this.loading&&(!i||!i.parentResource))throw new Error("Cannot add resources while the loader is running.");if(this.resources[t])throw new Error('Resource named "'+t+'" already exists.');if(e=this._prepareUrl(e),this.resources[t]=new RP(t,e,i),"function"==typeof n&&this.resources[t].onAfterMiddleware.once(n),this.loading){for(var s=i.parentResource,o=[],a=0;a<s.children.length;++a)s.children[a].isComplete||o.push(s.children[a]);var h=s.progressChunk*(o.length+1)/(o.length+2);s.children.push(this.resources[t]),s.progressChunk=h;for(var u=0;u<o.length;++u)o[u].progressChunk=h;this.resources[t].progressChunk=h}return this._queue.push(this.resources[t]),this},e.pre=function(t){return this._beforeMiddleware.push(t),this},e.use=function(t){return this._afterMiddleware.push(t),this},e.reset=function(){for(var t in this.progress=0,this.loading=!1,this._queue.kill(),this._queue.pause(),this.resources){var e=this.resources[t];e._onLoadBinding&&e._onLoadBinding.detach(),e.isLoading&&e.abort()}return this.resources={},this},e.load=function(t){if("function"==typeof t&&this.onComplete.once(t),this.loading)return this;if(this._queue.idle())this._onStart(),this._onComplete();else{for(var e=100/this._queue._tasks.length,i=0;i<this._queue._tasks.length;++i)this._queue._tasks[i].data.progressChunk=e;this._onStart(),this._queue.resume()}return this},e._prepareUrl=function(t){var e,i=bP()(t,{strictMode:!0});if(e=i.protocol||!i.path||0===t.indexOf("//")?t:this.baseUrl.length&&this.baseUrl.lastIndexOf("/")!==this.baseUrl.length-1&&"/"!==t.charAt(0)?this.baseUrl+"/"+t:this.baseUrl+t,this.defaultQueryString){var n=BP.exec(e)[0];-1!==(e=e.substr(0,e.length-n.length)).indexOf("?")?e+="&"+this.defaultQueryString:e+="?"+this.defaultQueryString,e+=n}return e},e._loadResource=function(t,e){var i=this;t._dequeue=e,SP(this._beforeMiddleware,(function(e,n){e.call(i,t,(function(){n(t.isComplete?{}:null)}))}),(function(){t.isComplete?i._onLoad(t):(t._onLoadBinding=t.onComplete.once(i._onLoad,i),t.load())}),!0)},e._onStart=function(){this.progress=0,this.loading=!0,this.onStart.dispatch(this)},e._onComplete=function(){this.progress=100,this.loading=!1,this.onComplete.dispatch(this,this.resources)},e._onLoad=function(t){var e=this;t._onLoadBinding=null,this._resourcesParsing.push(t),t._dequeue(),SP(this._afterMiddleware,(function(i,n){i.call(e,t,n)}),(function(){t.onAfterMiddleware.dispatch(t),e.progress=Math.min(100,e.progress+t.progressChunk),e.onProgress.dispatch(e,t),t.error?e.onError.dispatch(t.error,e,t):e.onLoad.dispatch(e,t),e._resourcesParsing.splice(e._resourcesParsing.indexOf(t),1),e._queue.idle()&&0===e._resourcesParsing.length&&e._onComplete()}),!0)},PP(t,[{key:"concurrency",get:function(){return this._queue.concurrency},set:function(t){this._queue.concurrency=t}}]),t}();UP._defaultBeforeMiddleware=[],UP._defaultAfterMiddleware=[],UP.pre=function(t){return UP._defaultBeforeMiddleware.push(t),UP},UP.use=function(t){return UP._defaultAfterMiddleware.push(t),UP};var jP=function(){};jP.use=function(t,e){t.data&&t.type===RP.TYPE.IMAGE&&(t.texture=kA.fromLoader(t.data,t.url,t.name)),e()};var HP=function(t){function e(i,n){var r=this;t.call(this,i,n),FE().call(this);for(var s=0;s<e._plugins.length;++s){var o=e._plugins[s],a=o.pre,h=o.use;a&&this.pre(a),h&&this.use(h)}this.onStart.add((function(t){return r.emit("start",t)})),this.onProgress.add((function(t,e){return r.emit("progress",t,e)})),this.onError.add((function(t,e,i){return r.emit("error",t,e,i)})),this.onLoad.add((function(t,e){return r.emit("load",t,e)})),this.onComplete.add((function(t,e){return r.emit("complete",t,e)})),this._protected=!1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={shared:{configurable:!0}};return e.prototype.destroy=function(){this._protected||(this.removeAllListeners(),this.reset())},i.shared.get=function(){var t=e._shared;return t||((t=new e)._protected=!0,e._shared=t),t},Object.defineProperties(e,i),e}(UP);Object.assign(HP.prototype,FE().prototype),HP._plugins=[],HP.registerPlugin=function(t){return HP._plugins.push(t),t.add&&t.add(),HP},HP.registerPlugin({use:NP.parsing}),HP.registerPlugin(jP);var zP=function(){};zP.init=function(t){t=Object.assign({sharedLoader:!1},t),this.loader=t.sharedLoader?HP.shared:new HP},zP.destroy=function(){this.loader&&(this.loader.destroy(),this.loader=null)};var WP=RP,GP=function(t,e,i){this.geometry=new GA,this.indexBuffer=null,this.size=i,this.dynamicProperties=[],this.staticProperties=[];for(var n=0;n<t.length;++n){var r=t[n];r={attributeName:r.attributeName,size:r.size,uploadFunction:r.uploadFunction,type:r.type||XE.FLOAT,offset:r.offset},e[n]?this.dynamicProperties.push(r):this.staticProperties.push(r)}this.staticStride=0,this.staticBuffer=null,this.staticData=null,this.staticDataUint32=null,this.dynamicStride=0,this.dynamicBuffer=null,this.dynamicData=null,this.dynamicDataUint32=null,this._updateID=0,this.initBuffers()};GP.prototype.initBuffers=function(){var t=this.geometry,e=0;this.indexBuffer=new BA(function(t,e){void 0===e&&(e=null);var i=6*t;if((e=e||new Uint16Array(i)).length!==i)throw new Error("Out buffer length is incorrect, got "+e.length+" and expected "+i);for(var n=0,r=0;n<i;n+=6,r+=4)e[n+0]=r+0,e[n+1]=r+1,e[n+2]=r+2,e[n+3]=r+0,e[n+4]=r+2,e[n+5]=r+3;return e}(this.size),!0,!0),t.addIndex(this.indexBuffer),this.dynamicStride=0;for(var i=0;i<this.dynamicProperties.length;++i){var n=this.dynamicProperties[i];n.offset=e,e+=n.size,this.dynamicStride+=n.size}var r=new ArrayBuffer(this.size*this.dynamicStride*4*4);this.dynamicData=new Float32Array(r),this.dynamicDataUint32=new Uint32Array(r),this.dynamicBuffer=new BA(this.dynamicData,!1,!1);var s=0;this.staticStride=0;for(var o=0;o<this.staticProperties.length;++o){var a=this.staticProperties[o];a.offset=s,s+=a.size,this.staticStride+=a.size}var h=new ArrayBuffer(this.size*this.staticStride*4*4);this.staticData=new Float32Array(h),this.staticDataUint32=new Uint32Array(h),this.staticBuffer=new BA(this.staticData,!0,!1);for(var u=0;u<this.dynamicProperties.length;++u){var l=this.dynamicProperties[u];t.addAttribute(l.attributeName,this.dynamicBuffer,0,l.type===XE.UNSIGNED_BYTE,l.type,4*this.dynamicStride,4*l.offset)}for(var c=0;c<this.staticProperties.length;++c){var d=this.staticProperties[c];t.addAttribute(d.attributeName,this.staticBuffer,0,d.type===XE.UNSIGNED_BYTE,d.type,4*this.staticStride,4*d.offset)}},GP.prototype.uploadDynamic=function(t,e,i){for(var n=0;n<this.dynamicProperties.length;n++){var r=this.dynamicProperties[n];r.uploadFunction(t,e,i,r.type===XE.UNSIGNED_BYTE?this.dynamicDataUint32:this.dynamicData,this.dynamicStride,r.offset)}this.dynamicBuffer._updateID++},GP.prototype.uploadStatic=function(t,e,i){for(var n=0;n<this.staticProperties.length;n++){var r=this.staticProperties[n];r.uploadFunction(t,e,i,r.type===XE.UNSIGNED_BYTE?this.staticDataUint32:this.staticData,this.staticStride,r.offset)}this.staticBuffer._updateID++},GP.prototype.destroy=function(){this.indexBuffer=null,this.dynamicProperties=null,this.dynamicBuffer=null,this.dynamicData=null,this.dynamicDataUint32=null,this.staticProperties=null,this.staticBuffer=null,this.staticData=null,this.staticDataUint32=null,this.geometry.destroy()};var VP=function(t){function e(e){t.call(this,e),this.shader=null,this.properties=null,this.tempMatrix=new CL,this.properties=[{attributeName:"aVertexPosition",size:2,uploadFunction:this.uploadVertices,offset:0},{attributeName:"aPositionCoord",size:2,uploadFunction:this.uploadPosition,offset:0},{attributeName:"aRotation",size:1,uploadFunction:this.uploadRotation,offset:0},{attributeName:"aTextureCoord",size:2,uploadFunction:this.uploadUvs,offset:0},{attributeName:"aColor",size:1,type:XE.UNSIGNED_BYTE,uploadFunction:this.uploadTint,offset:0}],this.shader=PD.from("attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nattribute vec2 aPositionCoord;\nattribute float aRotation;\n\nuniform mat3 translationMatrix;\nuniform vec4 uColor;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nvoid main(void){\n float x = (aVertexPosition.x) * cos(aRotation) - (aVertexPosition.y) * sin(aRotation);\n float y = (aVertexPosition.x) * sin(aRotation) + (aVertexPosition.y) * cos(aRotation);\n\n vec2 v = vec2(x, y);\n v = v + aPositionCoord;\n\n gl_Position = vec4((translationMatrix * vec3(v, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vColor = aColor * uColor;\n}\n","varying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nvoid main(void){\n vec4 color = texture2D(uSampler, vTextureCoord) * vColor;\n gl_FragColor = color;\n}",{}),this.state=OD.for2d()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(t){var e=t.children,i=t._maxSize,n=t._batchSize,r=this.renderer,s=e.length;if(0!==s){s>i&&!t.autoResize&&(s=i);var o=t._buffers;o||(o=t._buffers=this.generateBuffers(t));var a=e[0]._texture.baseTexture;this.state.blendMode=aL(t.blendMode,a.alphaMode),r.state.set(this.state);var h,u,l,c,d=r.gl,p=t.worldTransform.copyTo(this.tempMatrix);p.prepend(r.globalUniforms.uniforms.projectionMatrix),this.shader.uniforms.translationMatrix=p.toArray(!0),this.shader.uniforms.uColor=(h=t.tintRgb,u=t.worldAlpha,l=this.shader.uniforms.uColor,c=a.alphaMode,l=l||new Float32Array(4),c||void 0===c?(l[0]=h[0]*u,l[1]=h[1]*u,l[2]=h[2]*u):(l[0]=h[0],l[1]=h[1],l[2]=h[2]),l[3]=u,l),this.shader.uniforms.uSampler=a,this.renderer.shader.bind(this.shader);for(var f=!1,m=0,v=0;m<s;m+=n,v+=1){var g=s-m;g>n&&(g=n),v>=o.length&&o.push(this._generateOneMoreBuffer(t));var y=o[v];y.uploadDynamic(e,m,g);var _=t._bufferUpdateIDs[v]||0;(f=f||y._updateID<_)&&(y._updateID=t._updateID,y.uploadStatic(e,m,g)),r.geometry.bind(y.geometry),d.drawElements(d.TRIANGLES,6*g,d.UNSIGNED_SHORT,0)}}},e.prototype.generateBuffers=function(t){for(var e=[],i=t._maxSize,n=t._batchSize,r=t._properties,s=0;s<i;s+=n)e.push(new GP(this.properties,r,n));return e},e.prototype._generateOneMoreBuffer=function(t){var e=t._batchSize,i=t._properties;return new GP(this.properties,i,e)},e.prototype.uploadVertices=function(t,e,i,n,r,s){for(var o=0,a=0,h=0,u=0,l=0;l<i;++l){var c=t[e+l],d=c._texture,p=c.scale.x,f=c.scale.y,m=d.trim,v=d.orig;m?(o=(a=m.x-c.anchor.x*v.width)+m.width,h=(u=m.y-c.anchor.y*v.height)+m.height):(o=v.width*(1-c.anchor.x),a=v.width*-c.anchor.x,h=v.height*(1-c.anchor.y),u=v.height*-c.anchor.y),n[s]=a*p,n[s+1]=u*f,n[s+r]=o*p,n[s+r+1]=u*f,n[s+2*r]=o*p,n[s+2*r+1]=h*f,n[s+3*r]=a*p,n[s+3*r+1]=h*f,s+=4*r}},e.prototype.uploadPosition=function(t,e,i,n,r,s){for(var o=0;o<i;o++){var a=t[e+o].position;n[s]=a.x,n[s+1]=a.y,n[s+r]=a.x,n[s+r+1]=a.y,n[s+2*r]=a.x,n[s+2*r+1]=a.y,n[s+3*r]=a.x,n[s+3*r+1]=a.y,s+=4*r}},e.prototype.uploadRotation=function(t,e,i,n,r,s){for(var o=0;o<i;o++){var a=t[e+o].rotation;n[s]=a,n[s+r]=a,n[s+2*r]=a,n[s+3*r]=a,s+=4*r}},e.prototype.uploadUvs=function(t,e,i,n,r,s){for(var o=0;o<i;++o){var a=t[e+o]._texture._uvs;a?(n[s]=a.x0,n[s+1]=a.y0,n[s+r]=a.x1,n[s+r+1]=a.y1,n[s+2*r]=a.x2,n[s+2*r+1]=a.y2,n[s+3*r]=a.x3,n[s+3*r+1]=a.y3,s+=4*r):(n[s]=0,n[s+1]=0,n[s+r]=0,n[s+r+1]=0,n[s+2*r]=0,n[s+2*r+1]=0,n[s+3*r]=0,n[s+3*r+1]=0,s+=4*r)}},e.prototype.uploadTint=function(t,e,i,n,r,s){for(var o=0;o<i;++o){var a=t[e+o],h=a._texture.baseTexture.alphaMode>0,u=a.alpha,l=u<1&&h?hL(a._tintRGB,u):a._tintRGB+(255*u<<24);n[s]=l,n[s+r]=l,n[s+2*r]=l,n[s+3*r]=l,s+=4*r}},e.prototype.destroy=function(){t.prototype.destroy.call(this),this.shader&&(this.shader.destroy(),this.shader=null),this.tempMatrix=null},e}(QA),XP={adaptive:!0,maxLength:10,minSegments:8,maxSegments:2048,_segmentsCount:function(t,e){if(void 0===e&&(e=20),!this.adaptive||!t||isNaN(t))return e;var i=Math.ceil(t/this.maxLength);return i<this.minSegments?i=this.minSegments:i>this.maxSegments&&(i=this.maxSegments),i}},qP=function(){this.reset()};qP.prototype.clone=function(){var t=new qP;return t.color=this.color,t.alpha=this.alpha,t.texture=this.texture,t.matrix=this.matrix,t.visible=this.visible,t},qP.prototype.reset=function(){this.color=16777215,this.alpha=1,this.texture=kA.WHITE,this.matrix=null,this.visible=!1},qP.prototype.destroy=function(){this.texture=null,this.matrix=null};var JP={build:function(t){t.points=t.shape.points.slice()},triangulate:function(t,e){var i=t.points,n=t.holes,r=e.points,s=e.indices;if(i.length>=6){for(var o=[],a=0;a<n.length;a++){var h=n[a];o.push(i.length/2),i=i.concat(h.points)}var u=BE()(i,o,2);if(!u)return;for(var l=r.length/2,c=0;c<u.length;c+=3)s.push(u[c]+l),s.push(u[c+1]+l),s.push(u[c+2]+l);for(var d=0;d<i.length;d++)r.push(i[d])}}},ZP={build:function(t){var e,i,n=t.shape,r=t.points,s=n.x,o=n.y;if(r.length=0,t.type===SL.CIRC?(e=n.radius,i=n.radius):(e=n.width,i=n.height),0!==e&&0!==i){var a=Math.floor(30*Math.sqrt(n.radius))||Math.floor(15*Math.sqrt(n.width+n.height));a/=2.3;for(var h=2*Math.PI/a,u=0;u<a-.5;u++)r.push(s+Math.sin(-h*u)*e,o+Math.cos(-h*u)*i);r.push(r[0],r[1])}},triangulate:function(t,e){var i=t.points,n=e.points,r=e.indices,s=n.length/2,o=s,a=t.shape,h=t.matrix,u=a.x,l=a.y;n.push(t.matrix?h.a*u+h.c*l+h.tx:u,t.matrix?h.b*u+h.d*l+h.ty:l);for(var c=0;c<i.length;c+=2)n.push(i[c],i[c+1]),r.push(s++,o,s)}},KP={build:function(t){var e=t.shape,i=e.x,n=e.y,r=e.width,s=e.height,o=t.points;o.length=0,o.push(i,n,i+r,n,i+r,n+s,i,n+s)},triangulate:function(t,e){var i=t.points,n=e.points,r=n.length/2;n.push(i[0],i[1],i[2],i[3],i[6],i[7],i[4],i[5]),e.indices.push(r,r+1,r+2,r+1,r+2,r+3)}},QP={build:function(t){var e=t.shape,i=t.points,n=e.x,r=e.y,s=e.width,o=e.height,a=Math.max(0,Math.min(e.radius,Math.min(s,o)/2));i.length=0,a?(tC(n,r+a,n,r,n+a,r,i),tC(n+s-a,r,n+s,r,n+s,r+a,i),tC(n+s,r+o-a,n+s,r+o,n+s-a,r+o,i),tC(n+a,r+o,n,r+o,n,r+o-a,i)):i.push(n,r,n+s,r,n+s,r+o,n,r+o)},triangulate:function(t,e){for(var i=t.points,n=e.points,r=e.indices,s=n.length/2,o=BE()(i,null,2),a=0,h=o.length;a<h;a+=3)r.push(o[a]+s),r.push(o[a+1]+s),r.push(o[a+2]+s);for(var u=0,l=i.length;u<l;u++)n.push(i[u],i[++u])}};function $P(t,e,i){return t+(e-t)*i}function tC(t,e,i,n,r,s,o){void 0===o&&(o=[]);for(var a=o,h=0,u=0,l=0,c=0,d=0,p=0,f=0,m=0;f<=20;++f)h=$P(t,i,m=f/20),u=$P(e,n,m),l=$P(i,r,m),c=$P(n,s,m),d=$P(h,l,m),p=$P(u,c,m),a.push(d,p);return a}function eC(t,e){t.lineStyle.native?function(t,e){var i=0,n=t.shape,r=t.points||n.points,s=n.type!==SL.POLY||n.closeStroke;if(0===r.length)return;var o=e.points,a=e.indices,h=r.length/2,u=o.length/2,l=u;for(o.push(r[0],r[1]),i=1;i<h;i++)o.push(r[2*i],r[2*i+1]),a.push(l,l+1),l++;s&&a.push(l,u)}(t,e):function(t,e){var i=t.shape,n=t.points||i.points.slice(),r=e.closePointEps;if(0===n.length)return;var s=t.lineStyle,o=new EL(n[0],n[1]),a=new EL(n[n.length-2],n[n.length-1]),h=i.type!==SL.POLY||i.closeStroke,u=Math.abs(o.x-a.x)<r&&Math.abs(o.y-a.y)<r;if(h){n=n.slice(),u&&(n.pop(),n.pop(),a.set(n[n.length-2],n[n.length-1]));var l=a.x+.5*(o.x-a.x),c=a.y+.5*(o.y-a.y);n.unshift(l,c),n.push(l,c)}var d=e.points,p=n.length/2,f=n.length,m=d.length/2,v=s.width/2,g=n[0],y=n[1],_=n[2],x=n[3],b=0,w=0,T=-(y-x),M=g-_,S=0,E=0,L=0,A=0,D=Math.sqrt(T*T+M*M);T/=D,M/=D,T*=v,M*=v;var P=s.alignment,C=2*(1-P),O=2*P;d.push(g-T*C,y-M*C),d.push(g+T*O,y+M*O);for(var k=1;k<p-1;++k){g=n[2*(k-1)],y=n[2*(k-1)+1],_=n[2*k],x=n[2*k+1],b=n[2*(k+1)],w=n[2*(k+1)+1],T=-(y-x),M=g-_,T/=D=Math.sqrt(T*T+M*M),M/=D,T*=v,M*=v,S=-(x-w),E=_-b,S/=D=Math.sqrt(S*S+E*E),E/=D;var R=-M+y-(-M+x),I=-T+_-(-T+g),Y=(-T+g)*(-M+x)-(-T+_)*(-M+y),F=-(E*=v)+w-(-E+x),N=-(S*=v)+_-(-S+b),B=(-S+b)*(-E+x)-(-S+_)*(-E+w),U=R*N-F*I;if(Math.abs(U)<.1)U+=10.1,d.push(_-T*C,x-M*C),d.push(_+T*O,x+M*O);else{var j=(I*B-N*Y)/U,H=(F*Y-R*B)/U;(j-_)*(j-_)+(H-x)*(H-x)>196*v*v?(L=T-S,A=M-E,L/=D=Math.sqrt(L*L+A*A),A/=D,L*=v,A*=v,d.push(_-L*C,x-A*C),d.push(_+L*O,x+A*O),d.push(_-L*O*C,x-A*C),f++):(d.push(_+(j-_)*C,x+(H-x)*C),d.push(_-(j-_)*O,x-(H-x)*O))}}g=n[2*(p-2)],y=n[2*(p-2)+1],_=n[2*(p-1)],x=n[2*(p-1)+1],T=-(y-x),M=g-_,D=Math.sqrt(T*T+M*M),T/=D,M/=D,T*=v,M*=v,d.push(_-T*C,x-M*C),d.push(_+T*O,x+M*O);for(var z=e.indices,W=0;W<f-2;++W)z.push(m,m+1,m+2),m++}(t,e)}var iC=function(t){function e(e,i,n,r,s,o){s=s||r/2;for(var a=-1*Math.PI/2+o,h=2*n,u=AL/h,l=[],c=0;c<h;c++){var d=c%2?s:r,p=c*u+a;l.push(e+d*Math.cos(p),i+d*Math.sin(p))}t.call(this,l)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(WL),nC=function(){};nC.curveTo=function(t,e,i,n,r,s){var o=s[s.length-2],a=s[s.length-1]-e,h=o-t,u=n-e,l=i-t,c=Math.abs(a*l-h*u);if(c<1e-8||0===r)return s[s.length-2]===t&&s[s.length-1]===e||s.push(t,e),null;var d=a*a+h*h,p=u*u+l*l,f=a*u+h*l,m=r*Math.sqrt(d)/c,v=r*Math.sqrt(p)/c,g=m*f/d,y=v*f/p,_=m*l+v*h,x=m*u+v*a,b=h*(v+g),w=a*(v+g),T=l*(m+y),M=u*(m+y);return{cx:_+t,cy:x+e,radius:r,startAngle:Math.atan2(w-x,b-_),endAngle:Math.atan2(M-x,T-_),anticlockwise:h*u>l*a}},nC.arc=function(t,e,i,n,r,s,o,a,h){for(var u=o-s,l=XP._segmentsCount(Math.abs(u)*r,40*Math.ceil(Math.abs(u)/AL)),c=u/(2*l),d=2*c,p=Math.cos(c),f=Math.sin(c),m=l-1,v=m%1/m,g=0;g<=m;++g){var y=c+s+d*(g+v*g),_=Math.cos(y),x=-Math.sin(y);h.push((p*_+f*x)*r+i,(p*-x+f*_)*r+n)}};var rC=function(){};rC.curveLength=function(t,e,i,n,r,s,o,a){for(var h=0,u=0,l=0,c=0,d=0,p=0,f=0,m=0,v=0,g=0,y=0,_=t,x=e,b=1;b<=10;++b)g=_-(m=(f=(p=(d=1-(u=b/10))*d)*d)*t+3*p*u*i+3*d*(l=u*u)*r+(c=l*u)*o),y=x-(v=f*e+3*p*u*n+3*d*l*s+c*a),_=m,x=v,h+=Math.sqrt(g*g+y*y);return h},rC.curveTo=function(t,e,i,n,r,s,o){var a=o[o.length-2],h=o[o.length-1];o.length-=2;var u=XP._segmentsCount(rC.curveLength(a,h,t,e,i,n,r,s)),l=0,c=0,d=0,p=0,f=0;o.push(a,h);for(var m=1,v=0;m<=u;++m)d=(c=(l=1-(v=m/u))*l)*l,f=(p=v*v)*v,o.push(d*a+3*c*v*t+3*l*p*i+f*r,d*h+3*c*v*e+3*l*p*n+f*s)};var sC=function(){};sC.curveLength=function(t,e,i,n,r,s){var o=t-2*i+r,a=e-2*n+s,h=2*i-2*t,u=2*n-2*e,l=4*(o*o+a*a),c=4*(o*h+a*u),d=h*h+u*u,p=2*Math.sqrt(l+c+d),f=Math.sqrt(l),m=2*l*f,v=2*Math.sqrt(d),g=c/f;return(m*p+f*c*(p-v)+(4*d*l-c*c)*Math.log((2*f+g+p)/(g+v)))/(4*m)},sC.curveTo=function(t,e,i,n,r){for(var s=r[r.length-2],o=r[r.length-1],a=XP._segmentsCount(sC.curveLength(s,o,t,e,i,n)),h=0,u=0,l=1;l<=a;++l){var c=l/a;h=s+(t-s)*c,u=o+(e-o)*c,r.push(h+(t+(i-t)*c-h)*c,u+(e+(n-e)*c-u)*c)}};var oC=function(){this.reset()};oC.prototype.begin=function(t,e,i){this.reset(),this.style=t,this.start=e,this.attribStart=i},oC.prototype.end=function(t,e){this.attribSize=e-this.attribStart,this.size=t-this.start},oC.prototype.reset=function(){this.style=null,this.size=0,this.start=0,this.attribStart=0,this.attribSize=0};var aC={};aC[SL.POLY]=JP,aC[SL.CIRC]=ZP,aC[SL.ELIP]=ZP,aC[SL.RECT]=KP,aC[SL.RREC]=QP;var hC=[],uC=[],lC=function(t,e,i,n){void 0===e&&(e=null),void 0===i&&(i=null),void 0===n&&(n=null),this.shape=t,this.lineStyle=i,this.fillStyle=e,this.matrix=n,this.type=t.type,this.points=[],this.holes=[]};lC.prototype.clone=function(){return new lC(this.shape,this.fillStyle,this.lineStyle,this.matrix)},lC.prototype.destroy=function(){this.shape=null,this.holes.length=0,this.holes=null,this.points.length=0,this.points=null,this.lineStyle=null,this.fillStyle=null};var cC=new EL,dC=new VL,pC=function(t){function e(){t.call(this),this.points=[],this.colors=[],this.uvs=[],this.indices=[],this.textureIds=[],this.graphicsData=[],this.dirty=0,this.batchDirty=-1,this.cacheDirty=-1,this.clearDirty=0,this.drawCalls=[],this.batches=[],this.shapeIndex=0,this._bounds=new VL,this.boundsDirty=-1,this.boundsPadding=0,this.batchable=!1,this.indicesUint16=null,this.uvsFloat32=null,this.closePointEps=1e-4}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={bounds:{configurable:!0}};return i.bounds.get=function(){return this.boundsDirty!==this.dirty&&(this.boundsDirty=this.dirty,this.calculateBounds()),this._bounds},e.prototype.invalidate=function(){this.boundsDirty=-1,this.dirty++,this.batchDirty++,this.shapeIndex=0,this.points.length=0,this.colors.length=0,this.uvs.length=0,this.indices.length=0,this.textureIds.length=0;for(var t=0;t<this.drawCalls.length;t++)this.drawCalls[t].textures.length=0,uC.push(this.drawCalls[t]);this.drawCalls.length=0;for(var e=0;e<this.batches.length;e++){var i=this.batches[e];i.reset(),hC.push(i)}this.batches.length=0},e.prototype.clear=function(){return this.graphicsData.length>0&&(this.invalidate(),this.clearDirty++,this.graphicsData.length=0),this},e.prototype.drawShape=function(t,e,i,n){var r=new lC(t,e,i,n);return this.graphicsData.push(r),this.dirty++,this},e.prototype.drawHole=function(t,e){if(!this.graphicsData.length)return null;var i=new lC(t,null,null,e),n=this.graphicsData[this.graphicsData.length-1];return i.lineStyle=n.lineStyle,n.holes.push(i),this.dirty++,this},e.prototype.destroy=function(e){t.prototype.destroy.call(this,e);for(var i=0;i<this.graphicsData.length;++i)this.graphicsData[i].destroy();this.points.length=0,this.points=null,this.colors.length=0,this.colors=null,this.uvs.length=0,this.uvs=null,this.indices.length=0,this.indices=null,this.indexBuffer.destroy(),this.indexBuffer=null,this.graphicsData.length=0,this.graphicsData=null,this.drawCalls.length=0,this.drawCalls=null,this.batches.length=0,this.batches=null,this._bounds=null},e.prototype.containsPoint=function(t){for(var e=this.graphicsData,i=0;i<e.length;++i){var n=e[i];if(n.fillStyle.visible&&(n.shape&&(n.matrix?n.matrix.applyInverse(t,cC):cC.copyFrom(t),n.shape.contains(cC.x,cC.y)))){var r=!1;if(n.holes)for(var s=0;s<n.holes.length;s++){if(n.holes[s].shape.contains(cC.x,cC.y)){r=!0;break}}if(!r)return!0}}return!1},e.prototype.updateBatches=function(){if(this.graphicsData.length){if(this.validateBatching()){this.cacheDirty=this.dirty;var t=this.uvs,e=this.graphicsData,i=null,n=null;this.batches.length>0&&(n=(i=this.batches[this.batches.length-1]).style);for(var r=this.shapeIndex;r<e.length;r++){this.shapeIndex++;var s=e[r],o=s.fillStyle,a=s.lineStyle;aC[s.type].build(s),s.matrix&&this.transformPoints(s.points,s.matrix);for(var h=0;h<2;h++){var u=0===h?o:a;if(u.visible){var l=u.texture.baseTexture,c=this.indices.length,d=this.points.length/2;l.wrapMode=JE.REPEAT,0===h?this.processFill(s):this.processLine(s);var p=this.points.length/2-d;0!==p&&(i&&!this._compareStyles(n,u)&&(i.end(c,d),i=null),i||((i=hC.pop()||new oC).begin(u,c,d),this.batches.push(i),n=u),this.addUvs(this.points,t,u.texture,d,p,u.matrix))}}}if(i){var f=this.indices.length,m=this.points.length/2;i.end(f,m)}0!==this.batches.length?(this.indicesUint16=new Uint16Array(this.indices),this.batchable=this.isBatchable(),this.batchable?this.packBatches():this.buildDrawCalls()):this.batchable=!0}}else this.batchable=!0},e.prototype._compareStyles=function(t,e){return!(!t||!e)&&(t.texture.baseTexture===e.texture.baseTexture&&(t.color+t.alpha===e.color+e.alpha&&!!t.native==!!e.native))},e.prototype.validateBatching=function(){if(this.dirty===this.cacheDirty||!this.graphicsData.length)return!1;for(var t=0,e=this.graphicsData.length;t<e;t++){var i=this.graphicsData[t],n=i.fillStyle,r=i.lineStyle;if(n&&!n.texture.baseTexture.valid)return!1;if(r&&!r.texture.baseTexture.valid)return!1}return!0},e.prototype.packBatches=function(){this.batchDirty++,this.uvsFloat32=new Float32Array(this.uvs);for(var t=this.batches,e=0,i=t.length;e<i;e++)for(var n=t[e],r=0;r<n.size;r++){var s=n.start+r;this.indicesUint16[s]=this.indicesUint16[s]-n.attribStart}},e.prototype.isBatchable=function(){for(var t=this.batches,i=0;i<t.length;i++)if(t[i].style.native)return!1;return this.points.length<2*e.BATCHABLE_SIZE},e.prototype.buildDrawCalls=function(){for(var t=++_A._globalBatch,e=0;e<this.drawCalls.length;e++)this.drawCalls[e].textures.length=0,uC.push(this.drawCalls[e]);this.drawCalls.length=0;var i=this.colors,n=this.textureIds,r=uC.pop();r||((r=new nP).textures=new rP),r.textures.count=0,r.start=0,r.size=0,r.type=WE.TRIANGLES;var s=0,o=null,a=0,h=!1,u=WE.TRIANGLES,l=0;this.drawCalls.push(r);for(var c=0;c<this.batches.length;c++){var d=this.batches[c],p=d.style,f=p.texture.baseTexture;h!==!!p.native&&(u=(h=!!p.native)?WE.LINES:WE.TRIANGLES,o=null,s=8,t++),o!==f&&(o=f,f._batchEnabled!==t&&(8===s&&(t++,s=0,r.size>0&&((r=uC.pop())||((r=new nP).textures=new rP),this.drawCalls.push(r)),r.start=l,r.size=0,r.textures.count=0,r.type=u),f.touched=1,f._batchEnabled=t,f._batchLocation=s,f.wrapMode=10497,r.textures.elements[r.textures.count++]=f,s++)),r.size+=d.size,l+=d.size,a=f._batchLocation,this.addColors(i,p.color,p.alpha,d.attribSize),this.addTextureIds(n,a,d.attribSize)}_A._globalBatch=t,this.packAttributes()},e.prototype.packAttributes=function(){for(var t=this.points,e=this.uvs,i=this.colors,n=this.textureIds,r=new ArrayBuffer(3*t.length*4),s=new Float32Array(r),o=new Uint32Array(r),a=0,h=0;h<t.length/2;h++)s[a++]=t[2*h],s[a++]=t[2*h+1],s[a++]=e[2*h],s[a++]=e[2*h+1],o[a++]=i[h],s[a++]=n[h];this._buffer.update(r),this._indexBuffer.update(this.indicesUint16)},e.prototype.processFill=function(t){t.holes.length?(this.processHoles(t.holes),JP.triangulate(t,this)):aC[t.type].triangulate(t,this)},e.prototype.processLine=function(t){eC(t,this);for(var e=0;e<t.holes.length;e++)eC(t.holes[e],this)},e.prototype.processHoles=function(t){for(var e=0;e<t.length;e++){var i=t[e];aC[i.type].build(i),i.matrix&&this.transformPoints(i.points,i.matrix)}},e.prototype.calculateBounds=function(){var t=this._bounds,e=dC,i=CL.IDENTITY;this._bounds.clear(),e.clear();for(var n=0;n<this.graphicsData.length;n++){var r=this.graphicsData[n],s=r.shape,o=r.type,a=r.lineStyle,h=r.matrix||CL.IDENTITY,u=0;if(a&&a.visible){var l=a.alignment;u=a.width,o===SL.POLY?u*=.5+Math.abs(.5-l):u*=Math.max(0,l)}i!==h&&(e.isEmpty()||(t.addBoundsMatrix(e,i),e.clear()),i=h),o===SL.RECT||o===SL.RREC?e.addFramePad(s.x,s.y,s.x+s.width,s.y+s.height,u,u):o===SL.CIRC?e.addFramePad(s.x,s.y,s.x,s.y,s.radius+u,s.radius+u):o===SL.ELIP?e.addFramePad(s.x,s.y,s.x,s.y,s.width+u,s.height+u):t.addVerticesMatrix(i,s.points,0,s.points.length,u,u)}e.isEmpty()||t.addBoundsMatrix(e,i),t.pad(this.boundsPadding,this.boundsPadding)},e.prototype.transformPoints=function(t,e){for(var i=0;i<t.length/2;i++){var n=t[2*i],r=t[2*i+1];t[2*i]=e.a*n+e.c*r+e.tx,t[2*i+1]=e.b*n+e.d*r+e.ty}},e.prototype.addColors=function(t,e,i,n){for(var r=hL((e>>16)+(65280&e)+((255&e)<<16),i);n-- >0;)t.push(r)},e.prototype.addTextureIds=function(t,e,i){for(;i-- >0;)t.push(e)},e.prototype.addUvs=function(t,e,i,n,r,s){for(var o=0,a=e.length,h=i.frame;o<r;){var u=t[2*(n+o)],l=t[2*(n+o)+1];if(s){var c=s.a*u+s.c*l+s.tx;l=s.b*u+s.d*l+s.ty,u=c}o++,e.push(u/h.width,l/h.height)}var d=i.baseTexture;(h.width<d.width||h.height<d.height)&&this.adjustUvs(e,i,a,r)},e.prototype.adjustUvs=function(t,e,i,n){for(var r=e.baseTexture,s=1e-6,o=i+2*n,a=e.frame,h=a.width/r.width,u=a.height/r.height,l=a.x/a.width,c=a.y/a.height,d=Math.floor(t[i]+s),p=Math.floor(t[i+1]+s),f=i+2;f<o;f+=2)d=Math.min(d,Math.floor(t[f]+s)),p=Math.min(p,Math.floor(t[f+1]+s));l-=d,c-=p;for(var m=i;m<o;m+=2)t[m]=(t[m]+l)*h,t[m+1]=(t[m+1]+c)*u},Object.defineProperties(e.prototype,i),e}(uP);pC.BATCHABLE_SIZE=100;var fC=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.clone=function(){var t=new e;return t.color=this.color,t.alpha=this.alpha,t.texture=this.texture,t.matrix=this.matrix,t.visible=this.visible,t.width=this.width,t.alignment=this.alignment,t.native=this.native,t},e.prototype.reset=function(){t.prototype.reset.call(this),this.color=0,this.width=0,this.alignment=.5,this.native=!1},e}(qP),mC=new Float32Array(3),vC={},gC=function(t){function e(e){void 0===e&&(e=null),t.call(this),this.geometry=e||new pC,this.geometry.refCount++,this.shader=null,this.state=OD.for2d(),this._fillStyle=new qP,this._lineStyle=new fC,this._matrix=null,this._holeMode=!1,this.currentPath=null,this.batches=[],this.batchTint=-1,this.vertexData=null,this._transformID=-1,this.batchDirty=-1,this.pluginName="batch",this.tint=16777215,this.blendMode=zE.NORMAL}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={blendMode:{configurable:!0},tint:{configurable:!0},fill:{configurable:!0},line:{configurable:!0}};return e.prototype.clone=function(){return this.finishPoly(),new e(this.geometry)},i.blendMode.set=function(t){this.state.blendMode=t},i.blendMode.get=function(){return this.state.blendMode},i.tint.get=function(){return this._tint},i.tint.set=function(t){this._tint=t},i.fill.get=function(){return this._fillStyle},i.line.get=function(){return this._lineStyle},e.prototype.lineStyle=function(t){if("number"==typeof t){var e=arguments;t={width:e[0]||0,color:e[1]||0,alpha:void 0!==e[2]?e[2]:1,alignment:void 0!==e[3]?e[3]:.5,native:!!e[4]}}return this.lineTextureStyle(t)},e.prototype.lineTextureStyle=function(t){if("number"==typeof t){yL("v5.2.0","Please use object-based options for Graphics#lineTextureStyle");var e=arguments[0],i=arguments[1],n=arguments[2],r=arguments[3],s=arguments[4],o=arguments[5],a=arguments[6];t={width:e,texture:i,color:n,alpha:r,matrix:s,alignment:o,native:a},Object.keys(t).forEach((function(e){return void 0===t[e]&&delete t[e]}))}t=Object.assign({width:0,texture:kA.WHITE,color:t&&t.texture?16777215:0,alpha:1,matrix:null,alignment:.5,native:!1},t),this.currentPath&&this.startPoly();var h=t.width>0&&t.alpha>0;return h?(t.matrix&&(t.matrix=t.matrix.clone(),t.matrix.invert()),Object.assign(this._lineStyle,{visible:h},t)):this._lineStyle.reset(),this},e.prototype.startPoly=function(){if(this.currentPath){var t=this.currentPath.points,e=this.currentPath.points.length;e>2&&(this.drawShape(this.currentPath),this.currentPath=new WL,this.currentPath.closeStroke=!1,this.currentPath.points.push(t[e-2],t[e-1]))}else this.currentPath=new WL,this.currentPath.closeStroke=!1},e.prototype.finishPoly=function(){this.currentPath&&(this.currentPath.points.length>2?(this.drawShape(this.currentPath),this.currentPath=null):this.currentPath.points.length=0)},e.prototype.moveTo=function(t,e){return this.startPoly(),this.currentPath.points[0]=t,this.currentPath.points[1]=e,this},e.prototype.lineTo=function(t,e){this.currentPath||this.moveTo(0,0);var i=this.currentPath.points,n=i[i.length-2],r=i[i.length-1];return n===t&&r===e||i.push(t,e),this},e.prototype._initCurve=function(t,e){void 0===t&&(t=0),void 0===e&&(e=0),this.currentPath?0===this.currentPath.points.length&&(this.currentPath.points=[t,e]):this.moveTo(t,e)},e.prototype.quadraticCurveTo=function(t,e,i,n){this._initCurve();var r=this.currentPath.points;return 0===r.length&&this.moveTo(0,0),sC.curveTo(t,e,i,n,r),this},e.prototype.bezierCurveTo=function(t,e,i,n,r,s){return this._initCurve(),rC.curveTo(t,e,i,n,r,s,this.currentPath.points),this},e.prototype.arcTo=function(t,e,i,n,r){this._initCurve(t,e);var s=this.currentPath.points,o=nC.curveTo(t,e,i,n,r,s);if(o){var a=o.cx,h=o.cy,u=o.radius,l=o.startAngle,c=o.endAngle,d=o.anticlockwise;this.arc(a,h,u,l,c,d)}return this},e.prototype.arc=function(t,e,i,n,r,s){if(void 0===s&&(s=!1),n===r)return this;if(!s&&r<=n?r+=AL:s&&n<=r&&(n+=AL),0===r-n)return this;var o=t+Math.cos(n)*i,a=e+Math.sin(n)*i,h=this.geometry.closePointEps,u=this.currentPath?this.currentPath.points:null;if(u){var l=Math.abs(u[u.length-2]-o),c=Math.abs(u[u.length-1]-a);l<h&&c<h||u.push(o,a)}else this.moveTo(o,a),u=this.currentPath.points;return nC.arc(o,a,t,e,i,n,r,s,u),this},e.prototype.beginFill=function(t,e){return void 0===t&&(t=0),void 0===e&&(e=1),this.beginTextureFill({texture:kA.WHITE,color:t,alpha:e})},e.prototype.beginTextureFill=function(t){if(t instanceof kA){yL("v5.2.0","Please use object-based options for Graphics#beginTextureFill");var e=arguments[0],i=arguments[1],n=arguments[2],r=arguments[3];t={texture:e,color:i,alpha:n,matrix:r},Object.keys(t).forEach((function(e){return void 0===t[e]&&delete t[e]}))}t=Object.assign({texture:kA.WHITE,color:16777215,alpha:1,matrix:null},t),this.currentPath&&this.startPoly();var s=t.alpha>0;return s?(t.matrix&&(t.matrix=t.matrix.clone(),t.matrix.invert()),Object.assign(this._fillStyle,{visible:s},t)):this._fillStyle.reset(),this},e.prototype.endFill=function(){return this.finishPoly(),this._fillStyle.reset(),this},e.prototype.drawRect=function(t,e,i,n){return this.drawShape(new jL(t,e,i,n))},e.prototype.drawRoundedRect=function(t,e,i,n,r){return this.drawShape(new GL(t,e,i,n,r))},e.prototype.drawCircle=function(t,e,i){return this.drawShape(new HL(t,e,i))},e.prototype.drawEllipse=function(t,e,i,n){return this.drawShape(new zL(t,e,i,n))},e.prototype.drawPolygon=function(t){var e=arguments,i=t,n=!0;if(i.points&&(n=i.closeStroke,i=i.points),!Array.isArray(i)){i=new Array(arguments.length);for(var r=0;r<i.length;++r)i[r]=e[r]}var s=new WL(i);return s.closeStroke=n,this.drawShape(s),this},e.prototype.drawShape=function(t){return this._holeMode?this.geometry.drawHole(t,this._matrix):this.geometry.drawShape(t,this._fillStyle.clone(),this._lineStyle.clone(),this._matrix),this},e.prototype.drawStar=function(t,e,i,n,r,s){return void 0===s&&(s=0),this.drawPolygon(new iC(t,e,i,n,r,s))},e.prototype.clear=function(){return this.geometry.clear(),this._lineStyle.reset(),this._fillStyle.reset(),this._matrix=null,this._holeMode=!1,this.currentPath=null,this},e.prototype.isFastRect=function(){return 1===this.geometry.graphicsData.length&&this.geometry.graphicsData[0].shape.type===SL.RECT&&!this.geometry.graphicsData[0].lineWidth},e.prototype._render=function(t){this.finishPoly();var e=this.geometry;e.updateBatches(),e.batchable?(this.batchDirty!==e.batchDirty&&this._populateBatches(),this._renderBatched(t)):(t.batch.flush(),this._renderDirect(t))},e.prototype._populateBatches=function(){var t=this.geometry,e=this.blendMode;this.batches=[],this.batchTint=-1,this._transformID=-1,this.batchDirty=t.batchDirty,this.vertexData=new Float32Array(t.points);for(var i=0,n=t.batches.length;i<n;i++){var r=t.batches[i],s=r.style.color,o=new Float32Array(this.vertexData.buffer,4*r.attribStart*2,2*r.attribSize),a=new Float32Array(t.uvsFloat32.buffer,4*r.attribStart*2,2*r.attribSize),h={vertexData:o,blendMode:e,indices:new Uint16Array(t.indicesUint16.buffer,2*r.start,r.size),uvs:a,_batchRGB:rL(s),_tintRGB:s,_texture:r.style.texture,alpha:r.style.alpha,worldAlpha:1};this.batches[i]=h}},e.prototype._renderBatched=function(t){if(this.batches.length){t.batch.setObjectRenderer(t.plugins[this.pluginName]),this.calculateVertices(),this.calculateTints();for(var e=0,i=this.batches.length;e<i;e++){var n=this.batches[e];n.worldAlpha=this.worldAlpha*n.alpha,t.plugins[this.pluginName].render(n)}}},e.prototype._renderDirect=function(t){var e=this._resolveDirectShader(t),i=this.geometry,n=this.tint,r=this.worldAlpha,s=e.uniforms,o=i.drawCalls;s.translationMatrix=this.transform.worldTransform,s.tint[0]=(n>>16&255)/255*r,s.tint[1]=(n>>8&255)/255*r,s.tint[2]=(255&n)/255*r,s.tint[3]=r,t.shader.bind(e),t.geometry.bind(i,e),t.state.set(this.state);for(var a=0,h=o.length;a<h;a++)this._renderDrawCallDirect(t,i.drawCalls[a])},e.prototype._renderDrawCallDirect=function(t,e){for(var i=e.textures,n=e.type,r=e.size,s=e.start,o=i.count,a=0;a<o;a++)t.texture.bind(i.elements[a],a);t.geometry.draw(n,r,s)},e.prototype._resolveDirectShader=function(t){var e=this.shader,i=this.pluginName;if(!e){if(!vC[i]){for(var n=new Int32Array(16),r=0;r<16;r++)n[r]=r;var s={tint:new Float32Array([1,1,1,1]),translationMatrix:new CL,default:JA.from({uSamplers:n},!0)},o=t.plugins[i]._shader.program;vC[i]=new PD(o,s)}e=vC[i]}return e},e.prototype._calculateBounds=function(){this.finishPoly();var t=this.geometry;if(t.graphicsData.length){var e=t.bounds,i=e.minX,n=e.minY,r=e.maxX,s=e.maxY;this._bounds.addFrame(this.transform,i,n,r,s)}},e.prototype.containsPoint=function(t){return this.worldTransform.applyInverse(t,e._TEMP_POINT),this.geometry.containsPoint(e._TEMP_POINT)},e.prototype.calculateTints=function(){if(this.batchTint!==this.tint){this.batchTint=this.tint;for(var t=rL(this.tint,mC),e=0;e<this.batches.length;e++){var i=this.batches[e],n=i._batchRGB,r=(t[0]*n[0]*255<<16)+(t[1]*n[1]*255<<8)+(0|t[2]*n[2]*255);i._tintRGB=(r>>16)+(65280&r)+((255&r)<<16)}}},e.prototype.calculateVertices=function(){if(this._transformID!==this.transform._worldID){this._transformID=this.transform._worldID;for(var t=this.transform.worldTransform,e=t.a,i=t.b,n=t.c,r=t.d,s=t.tx,o=t.ty,a=this.geometry.points,h=this.vertexData,u=0,l=0;l<a.length;l+=2){var c=a[l],d=a[l+1];h[u++]=e*c+n*d+s,h[u++]=r*d+i*c+o}}},e.prototype.closePath=function(){var t=this.currentPath;return t&&(t.closeStroke=!0),this},e.prototype.setMatrix=function(t){return this._matrix=t,this},e.prototype.beginHole=function(){return this.finishPoly(),this._holeMode=!0,this},e.prototype.endHole=function(){return this.finishPoly(),this._holeMode=!1,this},e.prototype.destroy=function(e){t.prototype.destroy.call(this,e),this.geometry.refCount--,0===this.geometry.refCount&&this.geometry.dispose(),this._matrix=null,this.currentPath=null,this._lineStyle.destroy(),this._lineStyle=null,this._fillStyle.destroy(),this._fillStyle=null,this.geometry=null,this.shader=null,this.vertexData=null,this.batches.length=0,this.batches=null,t.prototype.destroy.call(this,e)},Object.defineProperties(e.prototype,i),e}(JL);gC._TEMP_POINT=new EL;var yC=new EL,_C=new Uint16Array([0,1,2,0,2,3]),xC=function(t){function e(e){t.call(this),this._anchor=new LL(this._onAnchorUpdate,this,e?e.defaultAnchor.x:0,e?e.defaultAnchor.y:0),this._texture=null,this._width=0,this._height=0,this._tint=null,this._tintRGB=null,this.tint=16777215,this.blendMode=zE.NORMAL,this.shader=null,this._cachedTint=16777215,this.uvs=null,this.texture=e||kA.EMPTY,this.vertexData=new Float32Array(8),this.vertexTrimmedData=null,this._transformID=-1,this._textureID=-1,this._transformTrimmedID=-1,this._textureTrimmedID=-1,this.indices=_C,this.pluginName="batch",this.isSprite=!0,this._roundPixels=IE.ROUND_PIXELS}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={roundPixels:{configurable:!0},width:{configurable:!0},height:{configurable:!0},anchor:{configurable:!0},tint:{configurable:!0},texture:{configurable:!0}};return e.prototype._onTextureUpdate=function(){this._textureID=-1,this._textureTrimmedID=-1,this._cachedTint=16777215,this._width&&(this.scale.x=fL(this.scale.x)*this._width/this._texture.orig.width),this._height&&(this.scale.y=fL(this.scale.y)*this._height/this._texture.orig.height)},e.prototype._onAnchorUpdate=function(){this._transformID=-1,this._transformTrimmedID=-1},e.prototype.calculateVertices=function(){var t=this._texture;if(this._transformID!==this.transform._worldID||this._textureID!==t._updateID){this._textureID!==t._updateID&&(this.uvs=this._texture._uvs.uvsFloat32),this._transformID=this.transform._worldID,this._textureID=t._updateID;var e=this.transform.worldTransform,i=e.a,n=e.b,r=e.c,s=e.d,o=e.tx,a=e.ty,h=this.vertexData,u=t.trim,l=t.orig,c=this._anchor,d=0,p=0,f=0,m=0;if(u?(d=(p=u.x-c._x*l.width)+u.width,f=(m=u.y-c._y*l.height)+u.height):(d=(p=-c._x*l.width)+l.width,f=(m=-c._y*l.height)+l.height),h[0]=i*p+r*m+o,h[1]=s*m+n*p+a,h[2]=i*d+r*m+o,h[3]=s*m+n*d+a,h[4]=i*d+r*f+o,h[5]=s*f+n*d+a,h[6]=i*p+r*f+o,h[7]=s*f+n*p+a,this._roundPixels)for(var v=IE.RESOLUTION,g=0;g<h.length;++g)h[g]=Math.round((h[g]*v|0)/v)}},e.prototype.calculateTrimmedVertices=function(){if(this.vertexTrimmedData){if(this._transformTrimmedID===this.transform._worldID&&this._textureTrimmedID===this._texture._updateID)return}else this.vertexTrimmedData=new Float32Array(8);this._transformTrimmedID=this.transform._worldID,this._textureTrimmedID=this._texture._updateID;var t=this._texture,e=this.vertexTrimmedData,i=t.orig,n=this._anchor,r=this.transform.worldTransform,s=r.a,o=r.b,a=r.c,h=r.d,u=r.tx,l=r.ty,c=-n._x*i.width,d=c+i.width,p=-n._y*i.height,f=p+i.height;e[0]=s*c+a*p+u,e[1]=h*p+o*c+l,e[2]=s*d+a*p+u,e[3]=h*p+o*d+l,e[4]=s*d+a*f+u,e[5]=h*f+o*d+l,e[6]=s*c+a*f+u,e[7]=h*f+o*c+l},e.prototype._render=function(t){this.calculateVertices(),t.batch.setObjectRenderer(t.plugins[this.pluginName]),t.plugins[this.pluginName].render(this)},e.prototype._calculateBounds=function(){var t=this._texture.trim,e=this._texture.orig;!t||t.width===e.width&&t.height===e.height?(this.calculateVertices(),this._bounds.addQuad(this.vertexData)):(this.calculateTrimmedVertices(),this._bounds.addQuad(this.vertexTrimmedData))},e.prototype.getLocalBounds=function(e){return 0===this.children.length?(this._bounds.minX=this._texture.orig.width*-this._anchor._x,this._bounds.minY=this._texture.orig.height*-this._anchor._y,this._bounds.maxX=this._texture.orig.width*(1-this._anchor._x),this._bounds.maxY=this._texture.orig.height*(1-this._anchor._y),e||(this._localBoundsRect||(this._localBoundsRect=new jL),e=this._localBoundsRect),this._bounds.getRectangle(e)):t.prototype.getLocalBounds.call(this,e)},e.prototype.containsPoint=function(t){this.worldTransform.applyInverse(t,yC);var e=this._texture.orig.width,i=this._texture.orig.height,n=-e*this.anchor.x,r=0;return yC.x>=n&&yC.x<n+e&&(r=-i*this.anchor.y,yC.y>=r&&yC.y<r+i)},e.prototype.destroy=function(e){if(t.prototype.destroy.call(this,e),this._texture.off("update",this._onTextureUpdate,this),this._anchor=null,"boolean"==typeof e?e:e&&e.texture){var i="boolean"==typeof e?e:e&&e.baseTexture;this._texture.destroy(!!i)}this._texture=null,this.shader=null},e.from=function(t,i){return new e(t instanceof kA?t:kA.from(t,i))},i.roundPixels.set=function(t){this._roundPixels!==t&&(this._transformID=-1),this._roundPixels=t},i.roundPixels.get=function(){return this._roundPixels},i.width.get=function(){return Math.abs(this.scale.x)*this._texture.orig.width},i.width.set=function(t){var e=fL(this.scale.x)||1;this.scale.x=e*t/this._texture.orig.width,this._width=t},i.height.get=function(){return Math.abs(this.scale.y)*this._texture.orig.height},i.height.set=function(t){var e=fL(this.scale.y)||1;this.scale.y=e*t/this._texture.orig.height,this._height=t},i.anchor.get=function(){return this._anchor},i.anchor.set=function(t){this._anchor.copyFrom(t)},i.tint.get=function(){return this._tint},i.tint.set=function(t){this._tint=t,this._tintRGB=(t>>16)+(65280&t)+((255&t)<<16)},i.texture.get=function(){return this._texture},i.texture.set=function(t){this._texture!==t&&(this._texture&&this._texture.off("update",this._onTextureUpdate,this),this._texture=t||kA.EMPTY,this._cachedTint=16777215,this._textureID=-1,this._textureTrimmedID=-1,t&&(t.baseTexture.valid?this._onTextureUpdate():t.once("update",this._onTextureUpdate,this)))},Object.defineProperties(e.prototype,i),e}(JL),bC=0,wC={align:"left",breakWords:!1,dropShadow:!1,dropShadowAlpha:1,dropShadowAngle:Math.PI/6,dropShadowBlur:0,dropShadowColor:"black",dropShadowDistance:5,fill:"black",fillGradientType:bC,fillGradientStops:[],fontFamily:"Arial",fontSize:26,fontStyle:"normal",fontVariant:"normal",fontWeight:"normal",letterSpacing:0,lineHeight:0,lineJoin:"miter",miterLimit:10,padding:0,stroke:"black",strokeThickness:0,textBaseline:"alphabetic",trim:!1,whiteSpace:"pre",wordWrap:!1,wordWrapWidth:100,leading:0},TC=["serif","sans-serif","monospace","cursive","fantasy","system-ui"],MC=function(t){this.styleID=0,this.reset(),AC(this,t,t)},SC={align:{configurable:!0},breakWords:{configurable:!0},dropShadow:{configurable:!0},dropShadowAlpha:{configurable:!0},dropShadowAngle:{configurable:!0},dropShadowBlur:{configurable:!0},dropShadowColor:{configurable:!0},dropShadowDistance:{configurable:!0},fill:{configurable:!0},fillGradientType:{configurable:!0},fillGradientStops:{configurable:!0},fontFamily:{configurable:!0},fontSize:{configurable:!0},fontStyle:{configurable:!0},fontVariant:{configurable:!0},fontWeight:{configurable:!0},letterSpacing:{configurable:!0},lineHeight:{configurable:!0},leading:{configurable:!0},lineJoin:{configurable:!0},miterLimit:{configurable:!0},padding:{configurable:!0},stroke:{configurable:!0},strokeThickness:{configurable:!0},textBaseline:{configurable:!0},trim:{configurable:!0},whiteSpace:{configurable:!0},wordWrap:{configurable:!0},wordWrapWidth:{configurable:!0}};function EC(t){return"number"==typeof t?sL(t):("string"==typeof t&&0===t.indexOf("0x")&&(t=t.replace("0x","#")),t)}function LC(t){if(Array.isArray(t)){for(var e=0;e<t.length;++e)t[e]=EC(t[e]);return t}return EC(t)}function AC(t,e,i){for(var n in i)Array.isArray(e[n])?t[n]=e[n].slice():t[n]=e[n]}MC.prototype.clone=function(){var t={};return AC(t,this,wC),new MC(t)},MC.prototype.reset=function(){AC(this,wC,wC)},SC.align.get=function(){return this._align},SC.align.set=function(t){this._align!==t&&(this._align=t,this.styleID++)},SC.breakWords.get=function(){return this._breakWords},SC.breakWords.set=function(t){this._breakWords!==t&&(this._breakWords=t,this.styleID++)},SC.dropShadow.get=function(){return this._dropShadow},SC.dropShadow.set=function(t){this._dropShadow!==t&&(this._dropShadow=t,this.styleID++)},SC.dropShadowAlpha.get=function(){return this._dropShadowAlpha},SC.dropShadowAlpha.set=function(t){this._dropShadowAlpha!==t&&(this._dropShadowAlpha=t,this.styleID++)},SC.dropShadowAngle.get=function(){return this._dropShadowAngle},SC.dropShadowAngle.set=function(t){this._dropShadowAngle!==t&&(this._dropShadowAngle=t,this.styleID++)},SC.dropShadowBlur.get=function(){return this._dropShadowBlur},SC.dropShadowBlur.set=function(t){this._dropShadowBlur!==t&&(this._dropShadowBlur=t,this.styleID++)},SC.dropShadowColor.get=function(){return this._dropShadowColor},SC.dropShadowColor.set=function(t){var e=LC(t);this._dropShadowColor!==e&&(this._dropShadowColor=e,this.styleID++)},SC.dropShadowDistance.get=function(){return this._dropShadowDistance},SC.dropShadowDistance.set=function(t){this._dropShadowDistance!==t&&(this._dropShadowDistance=t,this.styleID++)},SC.fill.get=function(){return this._fill},SC.fill.set=function(t){var e=LC(t);this._fill!==e&&(this._fill=e,this.styleID++)},SC.fillGradientType.get=function(){return this._fillGradientType},SC.fillGradientType.set=function(t){this._fillGradientType!==t&&(this._fillGradientType=t,this.styleID++)},SC.fillGradientStops.get=function(){return this._fillGradientStops},SC.fillGradientStops.set=function(t){(function(t,e){if(!Array.isArray(t)||!Array.isArray(e))return!1;if(t.length!==e.length)return!1;for(var i=0;i<t.length;++i)if(t[i]!==e[i])return!1;return!0})(this._fillGradientStops,t)||(this._fillGradientStops=t,this.styleID++)},SC.fontFamily.get=function(){return this._fontFamily},SC.fontFamily.set=function(t){this.fontFamily!==t&&(this._fontFamily=t,this.styleID++)},SC.fontSize.get=function(){return this._fontSize},SC.fontSize.set=function(t){this._fontSize!==t&&(this._fontSize=t,this.styleID++)},SC.fontStyle.get=function(){return this._fontStyle},SC.fontStyle.set=function(t){this._fontStyle!==t&&(this._fontStyle=t,this.styleID++)},SC.fontVariant.get=function(){return this._fontVariant},SC.fontVariant.set=function(t){this._fontVariant!==t&&(this._fontVariant=t,this.styleID++)},SC.fontWeight.get=function(){return this._fontWeight},SC.fontWeight.set=function(t){this._fontWeight!==t&&(this._fontWeight=t,this.styleID++)},SC.letterSpacing.get=function(){return this._letterSpacing},SC.letterSpacing.set=function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.styleID++)},SC.lineHeight.get=function(){return this._lineHeight},SC.lineHeight.set=function(t){this._lineHeight!==t&&(this._lineHeight=t,this.styleID++)},SC.leading.get=function(){return this._leading},SC.leading.set=function(t){this._leading!==t&&(this._leading=t,this.styleID++)},SC.lineJoin.get=function(){return this._lineJoin},SC.lineJoin.set=function(t){this._lineJoin!==t&&(this._lineJoin=t,this.styleID++)},SC.miterLimit.get=function(){return this._miterLimit},SC.miterLimit.set=function(t){this._miterLimit!==t&&(this._miterLimit=t,this.styleID++)},SC.padding.get=function(){return this._padding},SC.padding.set=function(t){this._padding!==t&&(this._padding=t,this.styleID++)},SC.stroke.get=function(){return this._stroke},SC.stroke.set=function(t){var e=LC(t);this._stroke!==e&&(this._stroke=e,this.styleID++)},SC.strokeThickness.get=function(){return this._strokeThickness},SC.strokeThickness.set=function(t){this._strokeThickness!==t&&(this._strokeThickness=t,this.styleID++)},SC.textBaseline.get=function(){return this._textBaseline},SC.textBaseline.set=function(t){this._textBaseline!==t&&(this._textBaseline=t,this.styleID++)},SC.trim.get=function(){return this._trim},SC.trim.set=function(t){this._trim!==t&&(this._trim=t,this.styleID++)},SC.whiteSpace.get=function(){return this._whiteSpace},SC.whiteSpace.set=function(t){this._whiteSpace!==t&&(this._whiteSpace=t,this.styleID++)},SC.wordWrap.get=function(){return this._wordWrap},SC.wordWrap.set=function(t){this._wordWrap!==t&&(this._wordWrap=t,this.styleID++)},SC.wordWrapWidth.get=function(){return this._wordWrapWidth},SC.wordWrapWidth.set=function(t){this._wordWrapWidth!==t&&(this._wordWrapWidth=t,this.styleID++)},MC.prototype.toFontString=function(){var t="number"==typeof this.fontSize?this.fontSize+"px":this.fontSize,e=this.fontFamily;Array.isArray(this.fontFamily)||(e=this.fontFamily.split(","));for(var i=e.length-1;i>=0;i--){var n=e[i].trim();!/([\"\'])[^\'\"]+\1/.test(n)&&TC.indexOf(n)<0&&(n='"'+n+'"'),e[i]=n}return this.fontStyle+" "+this.fontVariant+" "+this.fontWeight+" "+t+" "+e.join(",")},Object.defineProperties(MC.prototype,SC);var DC=function(t,e,i,n,r,s,o,a,h){this.text=t,this.style=e,this.width=i,this.height=n,this.lines=r,this.lineWidths=s,this.lineHeight=o,this.maxLineWidth=a,this.fontProperties=h};DC.measureText=function(t,e,i,n){void 0===n&&(n=DC._canvas),i=null==i?e.wordWrap:i;var r=e.toFontString(),s=DC.measureFont(r);0===s.fontSize&&(s.fontSize=e.fontSize,s.ascent=e.fontSize);var o=n.getContext("2d");o.font=r;for(var a=(i?DC.wordWrap(t,e,n):t).split(/(?:\r\n|\r|\n)/),h=new Array(a.length),u=0,l=0;l<a.length;l++){var c=o.measureText(a[l]).width+(a[l].length-1)*e.letterSpacing;h[l]=c,u=Math.max(u,c)}var d=u+e.strokeThickness;e.dropShadow&&(d+=e.dropShadowDistance);var p=e.lineHeight||s.fontSize+e.strokeThickness,f=Math.max(p,s.fontSize+e.strokeThickness)+(a.length-1)*(p+e.leading);return e.dropShadow&&(f+=e.dropShadowDistance),new DC(t,e,d,f,a,h,p+e.leading,u,s)},DC.wordWrap=function(t,e,i){void 0===i&&(i=DC._canvas);for(var n=i.getContext("2d"),r=0,s="",o="",a={},h=e.letterSpacing,u=e.whiteSpace,l=DC.collapseSpaces(u),c=DC.collapseNewlines(u),d=!l,p=e.wordWrapWidth+h,f=DC.tokenize(t),m=0;m<f.length;m++){var v=f[m];if(DC.isNewline(v)){if(!c){o+=DC.addLine(s),d=!l,s="",r=0;continue}v=" "}if(l){var g=DC.isBreakingSpace(v),y=DC.isBreakingSpace(s[s.length-1]);if(g&&y)continue}var _=DC.getFromCache(v,h,a,n);if(_>p)if(""!==s&&(o+=DC.addLine(s),s="",r=0),DC.canBreakWords(v,e.breakWords))for(var x=DC.wordWrapSplit(v),b=0;b<x.length;b++){for(var w=x[b],T=1;x[b+T];){var M=x[b+T],S=w[w.length-1];if(DC.canBreakChars(S,M,v,b,e.breakWords))break;w+=M,T++}b+=w.length-1;var E=DC.getFromCache(w,h,a,n);E+r>p&&(o+=DC.addLine(s),d=!1,s="",r=0),s+=w,r+=E}else{s.length>0&&(o+=DC.addLine(s),s="",r=0);var L=m===f.length-1;o+=DC.addLine(v,!L),d=!1,s="",r=0}else _+r>p&&(d=!1,o+=DC.addLine(s),s="",r=0),(s.length>0||!DC.isBreakingSpace(v)||d)&&(s+=v,r+=_)}return o+=DC.addLine(s,!1)},DC.addLine=function(t,e){return void 0===e&&(e=!0),t=DC.trimRight(t),t=e?t+"\n":t},DC.getFromCache=function(t,e,i,n){var r=i[t];if(void 0===r){var s=t.length*e;r=n.measureText(t).width+s,i[t]=r}return r},DC.collapseSpaces=function(t){return"normal"===t||"pre-line"===t},DC.collapseNewlines=function(t){return"normal"===t},DC.trimRight=function(t){if("string"!=typeof t)return"";for(var e=t.length-1;e>=0;e--){var i=t[e];if(!DC.isBreakingSpace(i))break;t=t.slice(0,-1)}return t},DC.isNewline=function(t){return"string"==typeof t&&DC._newlines.indexOf(t.charCodeAt(0))>=0},DC.isBreakingSpace=function(t){return"string"==typeof t&&DC._breakingSpaces.indexOf(t.charCodeAt(0))>=0},DC.tokenize=function(t){var e=[],i="";if("string"!=typeof t)return e;for(var n=0;n<t.length;n++){var r=t[n];DC.isBreakingSpace(r)||DC.isNewline(r)?(""!==i&&(e.push(i),i=""),e.push(r)):i+=r}return""!==i&&e.push(i),e},DC.canBreakWords=function(t,e){return e},DC.canBreakChars=function(t,e,i,n,r){return!0},DC.wordWrapSplit=function(t){return t.split("")},DC.measureFont=function(t){if(DC._fonts[t])return DC._fonts[t];var e={},i=DC._canvas,n=DC._context;n.font=t;var r=DC.METRICS_STRING+DC.BASELINE_SYMBOL,s=Math.ceil(n.measureText(r).width),o=Math.ceil(n.measureText(DC.BASELINE_SYMBOL).width),a=2*o;o=o*DC.BASELINE_MULTIPLIER|0,i.width=s,i.height=a,n.fillStyle="#f00",n.fillRect(0,0,s,a),n.font=t,n.textBaseline="alphabetic",n.fillStyle="#000",n.fillText(r,0,o);var h=n.getImageData(0,0,s,a).data,u=h.length,l=4*s,c=0,d=0,p=!1;for(c=0;c<o;++c){for(var f=0;f<l;f+=4)if(255!==h[d+f]){p=!0;break}if(p)break;d+=l}for(e.ascent=o-c,d=u-l,p=!1,c=a;c>o;--c){for(var m=0;m<l;m+=4)if(255!==h[d+m]){p=!0;break}if(p)break;d-=l}return e.descent=c-o,e.fontSize=e.ascent+e.descent,DC._fonts[t]=e,e},DC.clearMetrics=function(t){void 0===t&&(t=""),t?delete DC._fonts[t]:DC._fonts={}};var PC=function(){try{var t=new OffscreenCanvas(0,0),e=t.getContext("2d");return e&&e.measureText?t:document.createElement("canvas")}catch(t){return document.createElement("canvas")}}();PC.width=PC.height=10,DC._canvas=PC,DC._context=PC.getContext("2d"),DC._fonts={},DC.METRICS_STRING="|\xc9q\xc5",DC.BASELINE_SYMBOL="M",DC.BASELINE_MULTIPLIER=1.4,DC._newlines=[10,13],DC._breakingSpaces=[9,32,8192,8193,8194,8195,8196,8197,8198,8200,8201,8202,8287,12288];var CC={texture:!0,children:!1,baseTexture:!0},OC=function(t){function e(e,i,n){var r=!1;n||(n=document.createElement("canvas"),r=!0),n.width=3,n.height=3;var s=kA.from(n);s.orig=new jL,s.trim=new jL,t.call(this,s),this._ownCanvas=r,this.canvas=n,this.context=this.canvas.getContext("2d"),this._resolution=IE.RESOLUTION,this._autoResolution=!0,this._text=null,this._style=null,this._styleListener=null,this._font="",this.text=e,this.style=i,this.localStyleID=-1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={width:{configurable:!0},height:{configurable:!0},style:{configurable:!0},text:{configurable:!0},resolution:{configurable:!0}};return e.prototype.updateText=function(t){var e=this._style;if(this.localStyleID!==e.styleID&&(this.dirty=!0,this.localStyleID=e.styleID),this.dirty||!t){this._font=this._style.toFontString();var i,n,r=this.context,s=DC.measureText(this._text||" ",this._style,this._style.wordWrap,this.canvas),o=s.width,a=s.height,h=s.lines,u=s.lineHeight,l=s.lineWidths,c=s.maxLineWidth,d=s.fontProperties;this.canvas.width=Math.ceil((Math.max(1,o)+2*e.padding)*this._resolution),this.canvas.height=Math.ceil((Math.max(1,a)+2*e.padding)*this._resolution),r.scale(this._resolution,this._resolution),r.clearRect(0,0,this.canvas.width,this.canvas.height),r.font=this._font,r.lineWidth=e.strokeThickness,r.textBaseline=e.textBaseline,r.lineJoin=e.lineJoin,r.miterLimit=e.miterLimit;for(var p,f=e.dropShadow?2:1,m=0;m<f;++m){var v=e.dropShadow&&0===m,g=v?2*a:0,y=g*this.resolution;if(v){r.fillStyle="black",r.strokeStyle="black";var _=e.dropShadowColor,x=rL("number"==typeof _?_:("string"==typeof(p=_)&&"#"===p[0]&&(p=p.substr(1)),parseInt(p,16)));r.shadowColor="rgba("+255*x[0]+","+255*x[1]+","+255*x[2]+","+e.dropShadowAlpha+")",r.shadowBlur=e.dropShadowBlur,r.shadowOffsetX=Math.cos(e.dropShadowAngle)*e.dropShadowDistance,r.shadowOffsetY=Math.sin(e.dropShadowAngle)*e.dropShadowDistance+y}else r.fillStyle=this._generateFillStyle(e,h,s),r.strokeStyle=e.stroke,r.shadowColor=0,r.shadowBlur=0,r.shadowOffsetX=0,r.shadowOffsetY=0;for(var b=0;b<h.length;b++)i=e.strokeThickness/2,n=e.strokeThickness/2+b*u+d.ascent,"right"===e.align?i+=c-l[b]:"center"===e.align&&(i+=(c-l[b])/2),e.stroke&&e.strokeThickness&&this.drawLetterSpacing(h[b],i+e.padding,n+e.padding-g,!0),e.fill&&this.drawLetterSpacing(h[b],i+e.padding,n+e.padding-g)}this.updateTexture()}},e.prototype.drawLetterSpacing=function(t,e,i,n){void 0===n&&(n=!1);var r=this._style.letterSpacing;if(0!==r)for(var s=e,o=Array.from?Array.from(t):t.split(""),a=this.context.measureText(t).width,h=0,u=0;u<o.length;++u){var l=o[u];n?this.context.strokeText(l,s,i):this.context.fillText(l,s,i),s+=a-(h=this.context.measureText(t.substring(u+1)).width)+r,a=h}else n?this.context.strokeText(t,e,i):this.context.fillText(t,e,i)},e.prototype.updateTexture=function(){var t=this.canvas;if(this._style.trim){var e=function(t){var e,i,n,r=t.width,s=t.height,o=t.getContext("2d"),a=o.getImageData(0,0,r,s).data,h=a.length,u={top:null,left:null,right:null,bottom:null},l=null;for(e=0;e<h;e+=4)0!==a[e+3]&&(i=e/4%r,n=~~(e/4/r),null===u.top&&(u.top=n),(null===u.left||i<u.left)&&(u.left=i),(null===u.right||u.right<i)&&(u.right=i+1),(null===u.bottom||u.bottom<n)&&(u.bottom=n));return null!==u.top&&(r=u.right-u.left,s=u.bottom-u.top+1,l=o.getImageData(u.left,u.top,r,s)),{height:s,width:r,data:l}}(t);e.data&&(t.width=e.width,t.height=e.height,this.context.putImageData(e.data,0,0))}var i=this._texture,n=this._style,r=n.trim?0:n.padding,s=i.baseTexture;i.trim.width=i._frame.width=Math.ceil(t.width/this._resolution),i.trim.height=i._frame.height=Math.ceil(t.height/this._resolution),i.trim.x=-r,i.trim.y=-r,i.orig.width=i._frame.width-2*r,i.orig.height=i._frame.height-2*r,this._onTextureUpdate(),s.setRealSize(t.width,t.height,this._resolution),this.dirty=!1},e.prototype._render=function(e){this._autoResolution&&this._resolution!==e.resolution&&(this._resolution=e.resolution,this.dirty=!0),this.updateText(!0),t.prototype._render.call(this,e)},e.prototype.getLocalBounds=function(e){return this.updateText(!0),t.prototype.getLocalBounds.call(this,e)},e.prototype._calculateBounds=function(){this.updateText(!0),this.calculateVertices(),this._bounds.addQuad(this.vertexData)},e.prototype._onStyleChange=function(){this.dirty=!0},e.prototype._generateFillStyle=function(t,e,i){if(!Array.isArray(t.fill))return t.fill;if(1===t.fill.length)return t.fill[0];var n,r=t.dropShadow?t.dropShadowDistance:0,s=t.padding||0,o=Math.ceil(this.canvas.width/this._resolution)-r-2*s,a=Math.ceil(this.canvas.height/this._resolution)-r-2*s,h=t.fill.slice(),u=t.fillGradientStops.slice();if(!u.length)for(var l=h.length+1,c=1;c<l;++c)u.push(c/l);if(h.unshift(t.fill[0]),u.unshift(0),h.push(t.fill[t.fill.length-1]),u.push(1),t.fillGradientType===bC){n=this.context.createLinearGradient(o/2,s,o/2,a+s);for(var d=0,p=(i.fontProperties.fontSize+t.strokeThickness)/a,f=0;f<e.length;f++)for(var m=i.lineHeight*f,v=0;v<h.length;v++){var g=m/a+("number"==typeof u[v]?u[v]:v/h.length)*p,y=Math.max(d,g);y=Math.min(y,1),n.addColorStop(y,h[v]),d=y}}else{n=this.context.createLinearGradient(s,a/2,o+s,a/2);for(var _=h.length+1,x=1,b=0;b<h.length;b++){var w=void 0;w="number"==typeof u[b]?u[b]:x/_,n.addColorStop(w,h[b]),x++}}return n},e.prototype.destroy=function(e){"boolean"==typeof e&&(e={children:e}),e=Object.assign({},CC,e),t.prototype.destroy.call(this,e),this._ownCanvas&&(this.canvas.height=this.canvas.width=0),this.context=null,this.canvas=null,this._style=null},i.width.get=function(){return this.updateText(!0),Math.abs(this.scale.x)*this._texture.orig.width},i.width.set=function(t){this.updateText(!0);var e=fL(this.scale.x)||1;this.scale.x=e*t/this._texture.orig.width,this._width=t},i.height.get=function(){return this.updateText(!0),Math.abs(this.scale.y)*this._texture.orig.height},i.height.set=function(t){this.updateText(!0);var e=fL(this.scale.y)||1;this.scale.y=e*t/this._texture.orig.height,this._height=t},i.style.get=function(){return this._style},i.style.set=function(t){t=t||{},this._style=t instanceof MC?t:new MC(t),this.localStyleID=-1,this.dirty=!0},i.text.get=function(){return this._text},i.text.set=function(t){t=String(null==t?"":t),this._text!==t&&(this._text=t,this.dirty=!0)},i.resolution.get=function(){return this._resolution},i.resolution.set=function(t){this._autoResolution=!1,this._resolution!==t&&(this._resolution=t,this.dirty=!0)},Object.defineProperties(e.prototype,i),e}(xC);IE.UPLOADS_PER_FRAME=4;var kC=function(t){this.maxItemsPerFrame=t,this.itemsLeft=0};kC.prototype.beginFrame=function(){this.itemsLeft=this.maxItemsPerFrame},kC.prototype.allowedToUpload=function(){return this.itemsLeft-- >0};var RC=function(t){var e=this;this.limiter=new kC(IE.UPLOADS_PER_FRAME),this.renderer=t,this.uploadHookHelper=null,this.queue=[],this.addHooks=[],this.uploadHooks=[],this.completes=[],this.ticking=!1,this.delayedTick=function(){e.queue&&e.prepareItems()},this.registerFindHook(UC),this.registerFindHook(jC),this.registerFindHook(IC),this.registerFindHook(YC),this.registerFindHook(FC),this.registerUploadHook(NC),this.registerUploadHook(BC)};function IC(t,e){var i=!1;if(t&&t._textures&&t._textures.length)for(var n=0;n<t._textures.length;n++)if(t._textures[n]instanceof kA){var r=t._textures[n].baseTexture;-1===e.indexOf(r)&&(e.push(r),i=!0)}return i}function YC(t,e){if(t.baseTexture instanceof _A){var i=t.baseTexture;return-1===e.indexOf(i)&&e.push(i),!0}return!1}function FC(t,e){if(t._texture&&t._texture instanceof kA){var i=t._texture.baseTexture;return-1===e.indexOf(i)&&e.push(i),!0}return!1}function NC(t,e){return e instanceof OC&&(e.updateText(!0),!0)}function BC(t,e){if(e instanceof MC){var i=e.toFontString();return DC.measureFont(i),!0}return!1}function UC(t,e){if(t instanceof OC){-1===e.indexOf(t.style)&&e.push(t.style),-1===e.indexOf(t)&&e.push(t);var i=t._texture.baseTexture;return-1===e.indexOf(i)&&e.push(i),!0}return!1}function jC(t,e){return t instanceof MC&&(-1===e.indexOf(t)&&e.push(t),!0)}RC.prototype.upload=function(t,e){"function"==typeof t&&(e=t,t=null),t&&this.add(t),this.queue.length?(e&&this.completes.push(e),this.ticking||(this.ticking=!0,$L.system.addOnce(this.tick,this,ZL.UTILITY))):e&&e()},RC.prototype.tick=function(){setTimeout(this.delayedTick,0)},RC.prototype.prepareItems=function(){for(this.limiter.beginFrame();this.queue.length&&this.limiter.allowedToUpload();){var t=this.queue[0],e=!1;if(t&&!t._destroyed)for(var i=0,n=this.uploadHooks.length;i<n;i++)if(this.uploadHooks[i](this.uploadHookHelper,t)){this.queue.shift(),e=!0;break}e||this.queue.shift()}if(this.queue.length)$L.system.addOnce(this.tick,this,ZL.UTILITY);else{this.ticking=!1;var r=this.completes.slice(0);this.completes.length=0;for(var s=0,o=r.length;s<o;s++)r[s]()}},RC.prototype.registerFindHook=function(t){return t&&this.addHooks.push(t),this},RC.prototype.registerUploadHook=function(t){return t&&this.uploadHooks.push(t),this},RC.prototype.add=function(t){for(var e=0,i=this.addHooks.length;e<i&&!this.addHooks[e](t,this.queue);e++);if(t instanceof JL)for(var n=t.children.length-1;n>=0;n--)this.add(t.children[n]);return this},RC.prototype.destroy=function(){this.ticking&&$L.system.remove(this.tick,this),this.ticking=!1,this.addHooks=null,this.uploadHooks=null,this.renderer=null,this.completes=null,this.queue=null,this.limiter=null,this.uploadHookHelper=null};var HC=function(t){function e(e){t.call(this,e),this.uploadHookHelper=this.renderer,this.registerFindHook(GC),this.registerUploadHook(zC),this.registerUploadHook(WC)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(RC);function zC(t,e){return e instanceof _A&&(e._glTextures[t.CONTEXT_UID]||t.texture.bind(e),!0)}function WC(t,e){if(!(e instanceof gC))return!1;var i=e.geometry;e.finishPoly(),i.updateBatches();for(var n=i.batches,r=0;r<n.length;r++){var s=n[r].style.texture;s&&zC(t,s.baseTexture)}return i.batchable||t.geometry.bind(i,e._resolveDirectShader(t)),!0}function GC(t,e){return t instanceof gC&&(e.push(t),!0)}var VC=function(t){this.maxMilliseconds=t,this.frameStart=0};VC.prototype.beginFrame=function(){this.frameStart=Date.now()},VC.prototype.allowedToUpload=function(){return Date.now()-this.frameStart<this.maxMilliseconds};var XC=function(t,e,i){void 0===i&&(i=null),this._texture=t instanceof kA?t:null,this.baseTexture=t instanceof _A?t:this._texture.baseTexture,this.textures={},this.animations={},this.data=e,this.resolution=this._updateResolution(i||(this.baseTexture.resource?this.baseTexture.resource.url:null)),this._frames=this.data.frames,this._frameKeys=Object.keys(this._frames),this._batchIndex=0,this._callback=null},qC={BATCH_SIZE:{configurable:!0}};qC.BATCH_SIZE.get=function(){return 1e3},XC.prototype._updateResolution=function(t){var e=this.data.meta.scale,i=ML(t,null);return null===i&&(i=void 0!==e?parseFloat(e):1),1!==i&&this.baseTexture.setResolution(i),i},XC.prototype.parse=function(t){this._batchIndex=0,this._callback=t,this._frameKeys.length<=XC.BATCH_SIZE?(this._processFrames(0),this._processAnimations(),this._parseComplete()):this._nextBatch()},XC.prototype._processFrames=function(t){for(var e=t,i=XC.BATCH_SIZE;e-t<i&&e<this._frameKeys.length;){var n=this._frameKeys[e],r=this._frames[n],s=r.frame;if(s){var o=null,a=null,h=!1!==r.trimmed&&r.sourceSize?r.sourceSize:r.frame,u=new jL(0,0,Math.floor(h.w)/this.resolution,Math.floor(h.h)/this.resolution);o=r.rotated?new jL(Math.floor(s.x)/this.resolution,Math.floor(s.y)/this.resolution,Math.floor(s.h)/this.resolution,Math.floor(s.w)/this.resolution):new jL(Math.floor(s.x)/this.resolution,Math.floor(s.y)/this.resolution,Math.floor(s.w)/this.resolution,Math.floor(s.h)/this.resolution),!1!==r.trimmed&&r.spriteSourceSize&&(a=new jL(Math.floor(r.spriteSourceSize.x)/this.resolution,Math.floor(r.spriteSourceSize.y)/this.resolution,Math.floor(s.w)/this.resolution,Math.floor(s.h)/this.resolution)),this.textures[n]=new kA(this.baseTexture,o,u,a,r.rotated?2:0,r.anchor),kA.addToCache(this.textures[n],n)}e++}},XC.prototype._processAnimations=function(){var t=this.data.animations||{};for(var e in t){this.animations[e]=[];for(var i=0;i<t[e].length;i++){var n=t[e][i];this.animations[e].push(this.textures[n])}}},XC.prototype._parseComplete=function(){var t=this._callback;this._callback=null,this._batchIndex=0,t.call(this,this.textures)},XC.prototype._nextBatch=function(){var t=this;this._processFrames(this._batchIndex*XC.BATCH_SIZE),this._batchIndex++,setTimeout((function(){t._batchIndex*XC.BATCH_SIZE<t._frameKeys.length?t._nextBatch():(t._processAnimations(),t._parseComplete())}),0)},XC.prototype.destroy=function(t){for(var e in void 0===t&&(t=!1),this.textures)this.textures[e].destroy();this._frames=null,this._frameKeys=null,this.data=null,this.textures=null,t&&(this._texture&&this._texture.destroy(),this.baseTexture.destroy()),this._texture=null,this.baseTexture=null},Object.defineProperties(XC,qC);var JC=function(){};JC.use=function(t,e){var i=t.name+"_image";if(t.data&&t.type===WP.TYPE.JSON&&t.data.frames&&!this.resources[i]){var n={crossOrigin:t.crossOrigin,metadata:t.metadata.imageMetadata,parentResource:t},r=JC.getResourcePath(t,this.baseUrl);this.add(i,r,n,(function(i){if(i.error)e(i.error);else{var n=new XC(i.texture,t.data,t.url);n.parse((function(){t.spritesheet=n,t.textures=n.textures,e()}))}}))}else e()},JC.getResourcePath=function(t,e){return t.isDataUrl?t.data.meta.image:eL().resolve(t.url.replace(e,""),t.data.meta.image)};new EL;var ZC="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n",KC=new CL,QC=function(t){function e(e){t.call(this,e);var i={globals:this.renderer.globalUniforms};this.shader=PD.from(ZC,"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = vTextureCoord - floor(vTextureCoord - uClampOffset);\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 texSample = texture2D(uSampler, coord);\n gl_FragColor = texSample * uColor;\n}\n",i),this.simpleShader=PD.from(ZC,"varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\n\nvoid main(void)\n{\n vec4 sample = texture2D(uSampler, vTextureCoord);\n gl_FragColor = sample * uColor;\n}\n",i),this.quad=new XA,this.state=OD.for2d()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(t){var e=this.renderer,i=this.quad,n=i.vertices;n[0]=n[6]=t._width*-t.anchor.x,n[1]=n[3]=t._height*-t.anchor.y,n[2]=n[4]=t._width*(1-t.anchor.x),n[5]=n[7]=t._height*(1-t.anchor.y),t.uvRespectAnchor&&((n=i.uvs)[0]=n[6]=-t.anchor.x,n[1]=n[3]=-t.anchor.y,n[2]=n[4]=1-t.anchor.x,n[5]=n[7]=1-t.anchor.y),i.invalidate();var r=t._texture,s=r.baseTexture,o=t.tileTransform.localTransform,a=t.uvMatrix,h=s.isPowerOfTwo&&r.frame.width===s.width&&r.frame.height===s.height;h&&(s._glTextures[e.CONTEXT_UID]?h=s.wrapMode!==JE.CLAMP:s.wrapMode===JE.CLAMP&&(s.wrapMode=JE.REPEAT));var u=h?this.simpleShader:this.shader,l=r.width,c=r.height,d=t._width,p=t._height;KC.set(o.a*l/d,o.b*l/p,o.c*c/d,o.d*c/p,o.tx/d,o.ty/p),KC.invert(),h?KC.prepend(a.mapCoord):(u.uniforms.uMapCoord=a.mapCoord.toArray(!0),u.uniforms.uClampFrame=a.uClampFrame,u.uniforms.uClampOffset=a.uClampOffset),u.uniforms.uTransform=KC.toArray(!0),u.uniforms.uColor=uL(t.tint,t.worldAlpha,u.uniforms.uColor,s.alphaMode),u.uniforms.translationMatrix=t.transform.worldTransform.toArray(!0),u.uniforms.uSampler=r,e.shader.bind(u),e.geometry.bind(i),this.state.blendMode=aL(t.blendMode,s.alphaMode),e.state.set(this.state),e.geometry.draw(this.renderer.gl.TRIANGLES,6,0)},e}(QA),$C=function(t){function e(e,i){var n=this;void 0===i&&(i={}),t.call(this),this._textWidth=0,this._textHeight=0,this._glyphs=[],this._font={tint:void 0!==i.tint?i.tint:16777215,align:i.align||"left",name:null,size:0},this.font=i.font,this._text=e,this._maxWidth=0,this._maxLineHeight=0,this._letterSpacing=0,this._anchor=new LL((function(){n.dirty=!0}),this,0,0),this.dirty=!1,this.roundPixels=IE.ROUND_PIXELS,this.updateText()}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={tint:{configurable:!0},align:{configurable:!0},anchor:{configurable:!0},font:{configurable:!0},text:{configurable:!0},maxWidth:{configurable:!0},maxLineHeight:{configurable:!0},textWidth:{configurable:!0},letterSpacing:{configurable:!0},textHeight:{configurable:!0}};return e.prototype.updateText=function(){for(var t=e.fonts[this._font.name],i=this._font.size/t.size,n=new EL,r=[],s=[],o=this._text.replace(/(?:\r\n|\r)/g,"\n")||" ",a=o.length,h=this._maxWidth*t.size/this._font.size,u=null,l=0,c=0,d=0,p=-1,f=0,m=0,v=0,g=0;g<a;g++){var y=o.charCodeAt(g),_=o.charAt(g);if(/(?:\s)/.test(_)&&(p=g,f=l),"\r"!==_&&"\n"!==_){var x=t.chars[y];x&&(u&&x.kerning[u]&&(n.x+=x.kerning[u]),r.push({texture:x.texture,line:d,charCode:y,position:new EL(n.x+x.xOffset+this._letterSpacing/2,n.y+x.yOffset)}),n.x+=x.xAdvance+this._letterSpacing,l=n.x,v=Math.max(v,x.yOffset+x.texture.height),u=y,-1!==p&&h>0&&n.x>h&&(pL(r,1+p-++m,1+g-p),g=p,p=-1,s.push(f),c=Math.max(c,f),d++,n.x=0,n.y+=t.lineHeight,u=null))}else s.push(l),c=Math.max(c,l),++d,++m,n.x=0,n.y+=t.lineHeight,u=null}var b=o.charAt(o.length-1);"\r"!==b&&"\n"!==b&&(/(?:\s)/.test(b)&&(l=f),s.push(l),c=Math.max(c,l));for(var w=[],T=0;T<=d;T++){var M=0;"right"===this._font.align?M=c-s[T]:"center"===this._font.align&&(M=(c-s[T])/2),w.push(M)}for(var S=r.length,E=this.tint,L=0;L<S;L++){var A=this._glyphs[L];A?A.texture=r[L].texture:((A=new xC(r[L].texture)).roundPixels=this.roundPixels,this._glyphs.push(A)),A.position.x=(r[L].position.x+w[r[L].line])*i,A.position.y=r[L].position.y*i,A.scale.x=A.scale.y=i,A.tint=E,A.parent||this.addChild(A)}for(var D=S;D<this._glyphs.length;++D)this.removeChild(this._glyphs[D]);if(this._textWidth=c*i,this._textHeight=(n.y+t.lineHeight)*i,0!==this.anchor.x||0!==this.anchor.y)for(var P=0;P<S;P++)this._glyphs[P].x-=this._textWidth*this.anchor.x,this._glyphs[P].y-=this._textHeight*this.anchor.y;this._maxLineHeight=v*i},e.prototype.updateTransform=function(){this.validate(),this.containerUpdateTransform()},e.prototype.getLocalBounds=function(){return this.validate(),t.prototype.getLocalBounds.call(this)},e.prototype.validate=function(){this.dirty&&(this.updateText(),this.dirty=!1)},i.tint.get=function(){return this._font.tint},i.tint.set=function(t){this._font.tint="number"==typeof t&&t>=0?t:16777215,this.dirty=!0},i.align.get=function(){return this._font.align},i.align.set=function(t){this._font.align=t||"left",this.dirty=!0},i.anchor.get=function(){return this._anchor},i.anchor.set=function(t){"number"==typeof t?this._anchor.set(t):this._anchor.copyFrom(t)},i.font.get=function(){return this._font},i.font.set=function(t){t&&("string"==typeof t?(t=t.split(" "),this._font.name=1===t.length?t[0]:t.slice(1).join(" "),this._font.size=t.length>=2?parseInt(t[0],10):e.fonts[this._font.name].size):(this._font.name=t.name,this._font.size="number"==typeof t.size?t.size:parseInt(t.size,10)),this.dirty=!0)},i.text.get=function(){return this._text},i.text.set=function(t){t=String(null==t?"":t),this._text!==t&&(this._text=t,this.dirty=!0)},i.maxWidth.get=function(){return this._maxWidth},i.maxWidth.set=function(t){this._maxWidth!==t&&(this._maxWidth=t,this.dirty=!0)},i.maxLineHeight.get=function(){return this.validate(),this._maxLineHeight},i.textWidth.get=function(){return this.validate(),this._textWidth},i.letterSpacing.get=function(){return this._letterSpacing},i.letterSpacing.set=function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.dirty=!0)},i.textHeight.get=function(){return this.validate(),this._textHeight},e.registerFont=function(t,i){var n={},r=t.getElementsByTagName("info")[0],s=t.getElementsByTagName("common")[0],o=t.getElementsByTagName("page"),a=ML(o[0].getAttribute("file")),h={};n.font=r.getAttribute("face"),n.size=parseInt(r.getAttribute("size"),10),n.lineHeight=parseInt(s.getAttribute("lineHeight"),10)/a,n.chars={},i instanceof kA&&(i=[i]);for(var u=0;u<o.length;u++){var l=o[u].getAttribute("id"),c=o[u].getAttribute("file");h[l]=i instanceof Array?i[u]:i[c]}for(var d=t.getElementsByTagName("char"),p=0;p<d.length;p++){var f=d[p],m=parseInt(f.getAttribute("id"),10),v=f.getAttribute("page")||0,g=new jL(parseInt(f.getAttribute("x"),10)/a+h[v].frame.x/a,parseInt(f.getAttribute("y"),10)/a+h[v].frame.y/a,parseInt(f.getAttribute("width"),10)/a,parseInt(f.getAttribute("height"),10)/a);n.chars[m]={xOffset:parseInt(f.getAttribute("xoffset"),10)/a,yOffset:parseInt(f.getAttribute("yoffset"),10)/a,xAdvance:parseInt(f.getAttribute("xadvance"),10)/a,kerning:{},texture:new kA(h[v].baseTexture,g),page:v}}for(var y=t.getElementsByTagName("kerning"),_=0;_<y.length;_++){var x=y[_],b=parseInt(x.getAttribute("first"),10)/a,w=parseInt(x.getAttribute("second"),10)/a,T=parseInt(x.getAttribute("amount"),10)/a;n.chars[w]&&(n.chars[w].kerning[b]=T)}return e.fonts[n.font]=n,n},Object.defineProperties(e.prototype,i),e}(JL);$C.fonts={};var tO=function(){};tO.parse=function(t,e){t.bitmapFont=$C.registerFont(t.data,e)},tO.add=function(){WP.setExtensionXhrType("fnt",WP.XHR_RESPONSE_TYPE.DOCUMENT)},tO.dirname=function(t){var e=t.replace(/\\/g,"/").replace(/\/$/,"").replace(/\/[^\/]*$/,"");return e===t?".":""===e?"/":e},tO.use=function(t,e){if(t.data&&t.type===WP.TYPE.XML)if(0!==t.data.getElementsByTagName("page").length&&0!==t.data.getElementsByTagName("info").length&&null!==t.data.getElementsByTagName("info")[0].getAttribute("face")){var i=t.isDataUrl?"":tO.dirname(t.url);t.isDataUrl&&("."===i&&(i=""),this.baseUrl&&i&&"/"===this.baseUrl.charAt(this.baseUrl.length-1)&&(i+="/")),(i=i.replace(this.baseUrl,""))&&"/"!==i.charAt(i.length-1)&&(i+="/");for(var n=t.data.getElementsByTagName("page"),r={},s=function(i){r[i.metadata.pageFile]=i.texture,Object.keys(r).length===n.length&&(tO.parse(t,r),e())},o=0;o<n.length;++o){var a=n[o].getAttribute("file"),h=i+a,u=!1;for(var l in this.resources){var c=this.resources[l];if(c.url===h){c.metadata.pageFile=a,c.texture?s(c):c.onAfterMiddleware.add(s),u=!0;break}}if(!u){var d={crossOrigin:t.crossOrigin,loadType:WP.LOAD_TYPE.IMAGE,metadata:Object.assign({pageFile:a},t.metadata.imageMetadata),parentResource:t};this.add(h,d,s)}}}else e();else e()};["varying vec2 vBlurTexCoords[%size%];","uniform sampler2D uSampler;","void main(void)","{"," gl_FragColor = vec4(0.0);"," %blur%","}"].join("\n");var eO=function(t){function e(){var e={m:new Float32Array([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]),uAlpha:1};t.call(this,iP,"varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float m[20];\nuniform float uAlpha;\n\nvoid main(void)\n{\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n if (uAlpha == 0.0) {\n gl_FragColor = c;\n return;\n }\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (c.a > 0.0) {\n c.rgb /= c.a;\n }\n\n vec4 result;\n\n result.r = (m[0] * c.r);\n result.r += (m[1] * c.g);\n result.r += (m[2] * c.b);\n result.r += (m[3] * c.a);\n result.r += m[4];\n\n result.g = (m[5] * c.r);\n result.g += (m[6] * c.g);\n result.g += (m[7] * c.b);\n result.g += (m[8] * c.a);\n result.g += m[9];\n\n result.b = (m[10] * c.r);\n result.b += (m[11] * c.g);\n result.b += (m[12] * c.b);\n result.b += (m[13] * c.a);\n result.b += m[14];\n\n result.a = (m[15] * c.r);\n result.a += (m[16] * c.g);\n result.a += (m[17] * c.b);\n result.a += (m[18] * c.a);\n result.a += m[19];\n\n vec3 rgb = mix(c.rgb, result.rgb, uAlpha);\n\n // Premultiply alpha again.\n rgb *= result.a;\n\n gl_FragColor = vec4(rgb, result.a);\n}\n",e),this.alpha=1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={matrix:{configurable:!0},alpha:{configurable:!0}};return e.prototype._loadMatrix=function(t,e){void 0===e&&(e=!1);var i=t;e&&(this._multiply(i,this.uniforms.m,t),i=this._colorMatrix(i)),this.uniforms.m=i},e.prototype._multiply=function(t,e,i){return t[0]=e[0]*i[0]+e[1]*i[5]+e[2]*i[10]+e[3]*i[15],t[1]=e[0]*i[1]+e[1]*i[6]+e[2]*i[11]+e[3]*i[16],t[2]=e[0]*i[2]+e[1]*i[7]+e[2]*i[12]+e[3]*i[17],t[3]=e[0]*i[3]+e[1]*i[8]+e[2]*i[13]+e[3]*i[18],t[4]=e[0]*i[4]+e[1]*i[9]+e[2]*i[14]+e[3]*i[19]+e[4],t[5]=e[5]*i[0]+e[6]*i[5]+e[7]*i[10]+e[8]*i[15],t[6]=e[5]*i[1]+e[6]*i[6]+e[7]*i[11]+e[8]*i[16],t[7]=e[5]*i[2]+e[6]*i[7]+e[7]*i[12]+e[8]*i[17],t[8]=e[5]*i[3]+e[6]*i[8]+e[7]*i[13]+e[8]*i[18],t[9]=e[5]*i[4]+e[6]*i[9]+e[7]*i[14]+e[8]*i[19]+e[9],t[10]=e[10]*i[0]+e[11]*i[5]+e[12]*i[10]+e[13]*i[15],t[11]=e[10]*i[1]+e[11]*i[6]+e[12]*i[11]+e[13]*i[16],t[12]=e[10]*i[2]+e[11]*i[7]+e[12]*i[12]+e[13]*i[17],t[13]=e[10]*i[3]+e[11]*i[8]+e[12]*i[13]+e[13]*i[18],t[14]=e[10]*i[4]+e[11]*i[9]+e[12]*i[14]+e[13]*i[19]+e[14],t[15]=e[15]*i[0]+e[16]*i[5]+e[17]*i[10]+e[18]*i[15],t[16]=e[15]*i[1]+e[16]*i[6]+e[17]*i[11]+e[18]*i[16],t[17]=e[15]*i[2]+e[16]*i[7]+e[17]*i[12]+e[18]*i[17],t[18]=e[15]*i[3]+e[16]*i[8]+e[17]*i[13]+e[18]*i[18],t[19]=e[15]*i[4]+e[16]*i[9]+e[17]*i[14]+e[18]*i[19]+e[19],t},e.prototype._colorMatrix=function(t){var e=new Float32Array(t);return e[4]/=255,e[9]/=255,e[14]/=255,e[19]/=255,e},e.prototype.brightness=function(t,e){var i=[t,0,0,0,0,0,t,0,0,0,0,0,t,0,0,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.greyscale=function(t,e){var i=[t,t,t,0,0,t,t,t,0,0,t,t,t,0,0,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.blackAndWhite=function(t){this._loadMatrix([.3,.6,.1,0,0,.3,.6,.1,0,0,.3,.6,.1,0,0,0,0,0,1,0],t)},e.prototype.hue=function(t,e){t=(t||0)/180*Math.PI;var i=Math.cos(t),n=Math.sin(t),r=1/3,s=(0,Math.sqrt)(r),o=[i+(1-i)*r,r*(1-i)-s*n,r*(1-i)+s*n,0,0,r*(1-i)+s*n,i+r*(1-i),r*(1-i)-s*n,0,0,r*(1-i)-s*n,r*(1-i)+s*n,i+r*(1-i),0,0,0,0,0,1,0];this._loadMatrix(o,e)},e.prototype.contrast=function(t,e){var i=(t||0)+1,n=-.5*(i-1),r=[i,0,0,0,n,0,i,0,0,n,0,0,i,0,n,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.saturate=function(t,e){void 0===t&&(t=0);var i=2*t/3+1,n=-.5*(i-1),r=[i,n,n,0,0,n,i,n,0,0,n,n,i,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.desaturate=function(){this.saturate(-1)},e.prototype.negative=function(t){this._loadMatrix([-1,0,0,1,0,0,-1,0,1,0,0,0,-1,1,0,0,0,0,1,0],t)},e.prototype.sepia=function(t){this._loadMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0],t)},e.prototype.technicolor=function(t){this._loadMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0],t)},e.prototype.polaroid=function(t){this._loadMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0],t)},e.prototype.toBGR=function(t){this._loadMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0],t)},e.prototype.kodachrome=function(t){this._loadMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0],t)},e.prototype.browni=function(t){this._loadMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0],t)},e.prototype.vintage=function(t){this._loadMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0],t)},e.prototype.colorTone=function(t,e,i,n,r){var s=((i=i||16770432)>>16&255)/255,o=(i>>8&255)/255,a=(255&i)/255,h=((n=n||3375104)>>16&255)/255,u=(n>>8&255)/255,l=(255&n)/255,c=[.3,.59,.11,0,0,s,o,a,t=t||.2,0,h,u,l,e=e||.15,0,s-h,o-u,a-l,0,0];this._loadMatrix(c,r)},e.prototype.night=function(t,e){var i=[-2*(t=t||.1),-t,0,0,0,-t,0,t,0,0,0,t,2*t,0,0,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.predator=function(t,e){var i=[11.224130630493164*t,-4.794486999511719*t,-2.8746118545532227*t,0*t,.40342438220977783*t,-3.6330697536468506*t,9.193157196044922*t,-2.951810836791992*t,0*t,-1.316135048866272*t,-3.2184197902679443*t,-4.2375030517578125*t,7.476448059082031*t,0*t,.8044459223747253*t,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.lsd=function(t){this._loadMatrix([2,-.4,.5,0,0,-.5,2,-.4,0,0,-.4,-.5,3,0,0,0,0,0,1,0],t)},e.prototype.reset=function(){this._loadMatrix([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],!1)},i.matrix.get=function(){return this.uniforms.m},i.matrix.set=function(t){this.uniforms.m=t},i.alpha.get=function(){return this.uniforms.uAlpha},i.alpha.set=function(t){this.uniforms.uAlpha=t},Object.defineProperties(e.prototype,i),e}(RD);eO.prototype.grayscale=eO.prototype.greyscale;var iO=new CL;XL.prototype._cacheAsBitmap=!1,XL.prototype._cacheData=!1;var nO=function(){this.textureCacheId=null,this.originalRender=null,this.originalRenderCanvas=null,this.originalCalculateBounds=null,this.originalGetLocalBounds=null,this.originalUpdateTransform=null,this.originalHitTest=null,this.originalDestroy=null,this.originalMask=null,this.originalFilterArea=null,this.sprite=null};Object.defineProperties(XL.prototype,{cacheAsBitmap:{get:function(){return this._cacheAsBitmap},set:function(t){var e;this._cacheAsBitmap!==t&&(this._cacheAsBitmap=t,t?(this._cacheData||(this._cacheData=new nO),(e=this._cacheData).originalRender=this.render,e.originalRenderCanvas=this.renderCanvas,e.originalUpdateTransform=this.updateTransform,e.originalCalculateBounds=this.calculateBounds,e.originalGetLocalBounds=this.getLocalBounds,e.originalDestroy=this.destroy,e.originalContainsPoint=this.containsPoint,e.originalMask=this._mask,e.originalFilterArea=this.filterArea,this.render=this._renderCached,this.renderCanvas=this._renderCachedCanvas,this.destroy=this._cacheAsBitmapDestroy):((e=this._cacheData).sprite&&this._destroyCachedDisplayObject(),this.render=e.originalRender,this.renderCanvas=e.originalRenderCanvas,this.calculateBounds=e.originalCalculateBounds,this.getLocalBounds=e.originalGetLocalBounds,this.destroy=e.originalDestroy,this.updateTransform=e.originalUpdateTransform,this.containsPoint=e.originalContainsPoint,this._mask=e.originalMask,this.filterArea=e.originalFilterArea))}}}),XL.prototype._renderCached=function(t){!this.visible||this.worldAlpha<=0||!this.renderable||(this._initCachedDisplayObject(t),this._cacheData.sprite.transform._worldID=this.transform._worldID,this._cacheData.sprite.worldAlpha=this.worldAlpha,this._cacheData.sprite._render(t))},XL.prototype._initCachedDisplayObject=function(t){if(!this._cacheData||!this._cacheData.sprite){var e=this.alpha;this.alpha=1,t.batch.flush();var i=this.getLocalBounds().clone();if(this.filters){var n=this.filters[0].padding;i.pad(n)}i.ceil(IE.RESOLUTION);var r=t.renderTexture.current,s=t.renderTexture.sourceFrame.clone(),o=t.projection.transform,a=IA.create(i.width,i.height),h="cacheAsBitmap_"+vL();this._cacheData.textureCacheId=h,_A.addToCache(a.baseTexture,h),kA.addToCache(a,h);var u=iO;u.tx=-i.x,u.ty=-i.y,this.transform.worldTransform.identity(),this.render=this._cacheData.originalRender,t.render(this,a,!0,u,!0),t.projection.transform=o,t.renderTexture.bind(r,s),this.render=this._renderCached,this.updateTransform=this.displayObjectUpdateTransform,this.calculateBounds=this._calculateCachedBounds,this.getLocalBounds=this._getCachedLocalBounds,this._mask=null,this.filterArea=null;var l=new xC(a);l.transform.worldTransform=this.transform.worldTransform,l.anchor.x=-i.x/i.width,l.anchor.y=-i.y/i.height,l.alpha=e,l._bounds=this._bounds,this._cacheData.sprite=l,this.transform._parentID=-1,this.parent?this.updateTransform():(this.parent=t._tempDisplayObjectParent,this.updateTransform(),this.parent=null),this.containsPoint=l.containsPoint.bind(l)}},XL.prototype._renderCachedCanvas=function(t){!this.visible||this.worldAlpha<=0||!this.renderable||(this._initCachedDisplayObjectCanvas(t),this._cacheData.sprite.worldAlpha=this.worldAlpha,this._cacheData.sprite._renderCanvas(t))},XL.prototype._initCachedDisplayObjectCanvas=function(t){if(!this._cacheData||!this._cacheData.sprite){var e=this.getLocalBounds(),i=this.alpha;this.alpha=1;var n=t.context,r=t._projTransform;e.ceil(IE.RESOLUTION);var s=IA.create(e.width,e.height),o="cacheAsBitmap_"+vL();this._cacheData.textureCacheId=o,_A.addToCache(s.baseTexture,o),kA.addToCache(s,o);var a=iO;this.transform.localTransform.copyTo(a),a.invert(),a.tx-=e.x,a.ty-=e.y,this.renderCanvas=this._cacheData.originalRenderCanvas,t.render(this,s,!0,a,!1),t.context=n,t._projTransform=r,this.renderCanvas=this._renderCachedCanvas,this.updateTransform=this.displayObjectUpdateTransform,this.calculateBounds=this._calculateCachedBounds,this.getLocalBounds=this._getCachedLocalBounds,this._mask=null,this.filterArea=null;var h=new xC(s);h.transform.worldTransform=this.transform.worldTransform,h.anchor.x=-e.x/e.width,h.anchor.y=-e.y/e.height,h.alpha=i,h._bounds=this._bounds,this._cacheData.sprite=h,this.transform._parentID=-1,this.parent?this.updateTransform():(this.parent=t._tempDisplayObjectParent,this.updateTransform(),this.parent=null),this.containsPoint=h.containsPoint.bind(h)}},XL.prototype._calculateCachedBounds=function(){this._bounds.clear(),this._cacheData.sprite.transform._worldID=this.transform._worldID,this._cacheData.sprite._calculateBounds(),this._lastBoundsID=this._boundsID},XL.prototype._getCachedLocalBounds=function(){return this._cacheData.sprite.getLocalBounds()},XL.prototype._destroyCachedDisplayObject=function(){this._cacheData.sprite._texture.destroy(!0),this._cacheData.sprite=null,_A.removeFromCache(this._cacheData.textureCacheId),kA.removeFromCache(this._cacheData.textureCacheId),this._cacheData.textureCacheId=null},XL.prototype._cacheAsBitmapDestroy=function(t){this.cacheAsBitmap=!1,this.destroy(t)},XL.prototype.name=null,JL.prototype.getChildByName=function(t){for(var e=0;e<this.children.length;e++)if(this.children[e].name===t)return this.children[e];return null},XL.prototype.getGlobalPosition=function(t,e){return void 0===t&&(t=new EL),void 0===e&&(e=!1),this.parent?this.parent.toGlobal(this.position,t,e):(t.x=this.position.x,t.y=this.position.y),t};var rO=function(t,e){this.uvBuffer=t,this.uvMatrix=e,this.data=null,this._bufferUpdateId=-1,this._textureUpdateId=-1,this._updateID=0};rO.prototype.update=function(t){if(t||this._bufferUpdateId!==this.uvBuffer._updateID||this._textureUpdateId!==this.uvMatrix._updateID){this._bufferUpdateId=this.uvBuffer._updateID,this._textureUpdateId=this.uvMatrix._updateID;var e=this.uvBuffer.data;this.data&&this.data.length===e.length||(this.data=new Float32Array(e.length)),this.uvMatrix.multiplyUvs(e,this.data),this._updateID++}};var sO=new EL,oO=new WL,aO=function(t){function e(e,i,n,r){void 0===r&&(r=WE.TRIANGLES),t.call(this),this.geometry=e,e.refCount++,this.shader=i,this.state=n||OD.for2d(),this.drawMode=r,this.start=0,this.size=0,this.uvs=null,this.indices=null,this.vertexData=new Float32Array(1),this.vertexDirty=0,this._transformID=-1,this.tint=16777215,this.blendMode=zE.NORMAL,this._roundPixels=IE.ROUND_PIXELS,this.batchUvs=null}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={uvBuffer:{configurable:!0},verticesBuffer:{configurable:!0},material:{configurable:!0},blendMode:{configurable:!0},roundPixels:{configurable:!0},tint:{configurable:!0},texture:{configurable:!0}};return i.uvBuffer.get=function(){return this.geometry.buffers[1]},i.verticesBuffer.get=function(){return this.geometry.buffers[0]},i.material.set=function(t){this.shader=t},i.material.get=function(){return this.shader},i.blendMode.set=function(t){this.state.blendMode=t},i.blendMode.get=function(){return this.state.blendMode},i.roundPixels.set=function(t){this._roundPixels!==t&&(this._transformID=-1),this._roundPixels=t},i.roundPixels.get=function(){return this._roundPixels},i.tint.get=function(){return this.shader.tint},i.tint.set=function(t){this.shader.tint=t},i.texture.get=function(){return this.shader.texture},i.texture.set=function(t){this.shader.texture=t},e.prototype._render=function(t){var i=this.geometry.buffers[0].data;this.shader.batchable&&this.drawMode===WE.TRIANGLES&&i.length<2*e.BATCHABLE_SIZE?this._renderToBatch(t):this._renderDefault(t)},e.prototype._renderDefault=function(t){var e=this.shader;e.alpha=this.worldAlpha,e.update&&e.update(),t.batch.flush(),e.program.uniformData.translationMatrix&&(e.uniforms.translationMatrix=this.transform.worldTransform.toArray(!0)),t.shader.bind(e),t.state.set(this.state),t.geometry.bind(this.geometry,e),t.geometry.draw(this.drawMode,this.size,this.start,this.geometry.instanceCount)},e.prototype._renderToBatch=function(t){var e=this.geometry;this.shader.uvMatrix&&(this.shader.uvMatrix.update(),this.calculateUvs()),this.calculateVertices(),this.indices=e.indexBuffer.data,this._tintRGB=this.shader._tintRGB,this._texture=this.shader.texture;var i=this.material.pluginName;t.batch.setObjectRenderer(t.plugins[i]),t.plugins[i].render(this)},e.prototype.calculateVertices=function(){var t=this.geometry,e=t.buffers[0].data;if(t.vertexDirtyId!==this.vertexDirty||this._transformID!==this.transform._worldID){this._transformID=this.transform._worldID,this.vertexData.length!==e.length&&(this.vertexData=new Float32Array(e.length));for(var i=this.transform.worldTransform,n=i.a,r=i.b,s=i.c,o=i.d,a=i.tx,h=i.ty,u=this.vertexData,l=0;l<u.length/2;l++){var c=e[2*l],d=e[2*l+1];u[2*l]=n*c+s*d+a,u[2*l+1]=r*c+o*d+h}if(this._roundPixels)for(var p=IE.RESOLUTION,f=0;f<u.length;++f)u[f]=Math.round((u[f]*p|0)/p);this.vertexDirty=t.vertexDirtyId}},e.prototype.calculateUvs=function(){var t=this.geometry.buffers[1];this.shader.uvMatrix.isSimple?this.uvs=t.data:(this.batchUvs||(this.batchUvs=new rO(t,this.shader.uvMatrix)),this.batchUvs.update(),this.uvs=this.batchUvs.data)},e.prototype._calculateBounds=function(){this.calculateVertices(),this._bounds.addVertexData(this.vertexData,0,this.vertexData.length)},e.prototype.containsPoint=function(t){if(!this.getBounds().contains(t.x,t.y))return!1;this.worldTransform.applyInverse(t,sO);for(var e=this.geometry.getBuffer("aVertexPosition").data,i=oO.points,n=this.geometry.getIndex().data,r=n.length,s=4===this.drawMode?3:1,o=0;o+2<r;o+=s){var a=2*n[o],h=2*n[o+1],u=2*n[o+2];if(i[0]=e[a],i[1]=e[a+1],i[2]=e[h],i[3]=e[h+1],i[4]=e[u],i[5]=e[u+1],oO.contains(sO.x,sO.y))return!0}return!1},e.prototype.destroy=function(e){t.prototype.destroy.call(this,e),this.geometry.refCount--,0===this.geometry.refCount&&this.geometry.dispose(),this.geometry=null,this.shader=null,this.state=null,this.uvs=null,this.indices=null,this.vertexData=null},Object.defineProperties(e.prototype,i),e}(JL);aO.BATCHABLE_SIZE=100;eP.registerPlugin("accessibility",KL),eP.registerPlugin("extract",_P),eP.registerPlugin("interaction",uA),eP.registerPlugin("particle",VP),eP.registerPlugin("prepare",HC),eP.registerPlugin("batch",fP),eP.registerPlugin("tilingSprite",QC),HP.registerPlugin(tO),HP.registerPlugin(JC),mP.registerPlugin(tA),mP.registerPlugin(zP);["af.js","ar-dz.js","ar-kw.js","ar-ly.js","ar-ma.js","ar-sa.js","ar-tn.js","ar.js","az.js","be.js","bg.js","bm.js","bn.js","bo.js","br.js","bs.js","ca.js","cs.js","cv.js","cy.js","da.js","de-at.js","de-ch.js","de.js","dv.js","el.js","en-au.js","en-ca.js","en-gb.js","en-ie.js","en-il.js","en-nz.js","en-SG.js","eo.js","es-do.js","es-us.js","es.js","et.js","eu.js","fa.js","fi.js","fo.js","fr-ca.js","fr-ch.js","fr.js","fy.js","ga.js","gd.js","gl.js","gom-latn.js","gu.js","he.js","hi.js","hr.js","hu.js","hy-am.js","id.js","is.js","it-ch.js","it.js","ja.js","jv.js","ka.js","kk.js","km.js","kn.js","ko.js","ku.js","ky.js","lb.js","lo.js","lt.js","lv.js","me.js","mi.js","mk.js","ml.js","mn.js","mr.js","ms-my.js","ms.js","mt.js","my.js","nb.js","ne.js","nl-be.js","nl.js","nn.js","pa-in.js","pl.js","pt-br.js","pt.js","ro.js","ru.js","sd.js","se.js","si.js","sk.js","sl.js","sq.js","sr-cyrl.js","sr.js","ss.js","sv.js","sw.js","ta.js","te.js","tet.js","tg.js","th.js","tl-ph.js","tlh.js","tr.js","tzl.js","tzm-latn.js","tzm.js","ug-cn.js","uk.js","ur.js","uz-latn.js","uz.js","vi.js","x-pseudo.js","yo.js","zh-cn.js","zh-hk.js","zh-tw.js"].forEach((t=>{i(99459)(`./${t}`)})),e()().format("MMMM Do YYYY, h:mm:ss a"),Af.capitalize("hello \u{1f30d}"),Pf().trim(" \u{1f62e} "),new(Of().Game),new tv,new mP})()})();
2//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktY29weS13aXRoaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1jcmVhdGUtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLW9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbXBvc2l0ZS1rZXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaHRtbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kYXRlLXRvLWlzby1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGF0ZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWFzeW5jLWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC11cHNlcnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1leHBtMS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWZyb3VuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXRoLWxvZzFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtc2NhbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC1zaWduLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtcHJvbWlzZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS11cmwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtZm9yY2VkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2FtZS12YWx1ZS16ZXJvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NhbWUtdmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWdsb2JhbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctaHRtbC1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcGFkLXdlYmtpdC1idWcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXBhZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5pcy12aWV3LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29weS13aXRoaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mbGF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lmxhc3QtaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkub2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZXZlcnNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29tZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc29ydC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0YS12aWV3LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLm5vdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS50by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmFjb3NoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmFzaW5oLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmF0YW5oLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmNicnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY2x6MzIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguY29zaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5leHBtMS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5mcm91bmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaW11bC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxMC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cxcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5sb2cyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnNpZ24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguc2luaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50YW5oLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGgudHJ1bmMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmVwc2lsb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1maW5pdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtbmFuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLWdldHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXNldHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcm9tLWVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMtc2VhbGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QubG9va3VwLWdldHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5zZWFsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtZmxvYXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmFwcGx5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5oYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnNldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmFuY2hvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJpZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmJsaW5rLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYm9sZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5maXhlZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRjb2xvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRzaXplLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5saW5rLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5wYWQtZW5kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucGFkLXN0YXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmF3LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0cmlrZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1Yi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN1cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXMtY29uY2F0LXNwcmVhZGFibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5jb3B5LXdpdGhpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQzMi1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmluY2x1ZGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MTYtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQ4LWFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuam9pbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubGFzdC1pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmVkdWNlLXJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJldmVyc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnN1YmFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQxNi1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstc2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkuaXMtdGVtcGxhdGUtb2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXJyYXkubGFzdC1pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaXRlbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmFzLWluZGV4ZWQtcGFpcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmRyb3AuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5ldmVyeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mbGF0LW1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZvci1lYWNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLm1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnNvbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci50YWtlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IudG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5jb21wb3NpdGUta2V5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZHJvcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZsYXQtbWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IubWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnRha2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50by1hcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5kZWxldGUtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZpbHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLWtleS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5maW5kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuZ3JvdXAtYnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LWJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLmtleS1vZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAta2V5cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAtdmFsdWVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm1lcmdlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLm9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hcC5zb21lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwZGF0ZS1vci1pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXAudXBkYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWFwLnVwc2VydC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguY2xhbXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmRlZy1wZXItcmFkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5kZWdyZWVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5mc2NhbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLmlhZGRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5pbXVsaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguaXN1YmguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnJhZC1wZXItZGVnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5yYWRpYW5zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubWF0aC5zY2FsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm1hdGguc2VlZGVkLXBybmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5tYXRoLnVtdWxoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQubnVtYmVyLmZyb20tc3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtZW50cmllcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lm9iamVjdC5pdGVyYXRlLWtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYmplY3QuaXRlcmF0ZS12YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucHJvbWlzZS50cnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuYWRkLWFsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5kZWxldGUtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZXZlcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZmlsdGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LmZpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtZGlzam9pbnQtZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5pcy1zdWJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3VwZXJzZXQtb2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuam9pbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnNldC5tYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQub2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQucmVkdWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc2V0LnNvbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zZXQudW5pb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuY29kZS1wb2ludHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zdHJpbmcubWF0Y2gtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3RyaW5nLnJlcGxhY2UtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5kZWxldGUtYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAuZnJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLm9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1tYXAudXBzZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQuYWRkLWFsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LndlYWstc2V0LmRlbGV0ZS1hbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5mcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5xdWV1ZS1taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC50by1qc29uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2FycmF5LWlzLXRlbXBsYXRlLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9hcnJheS1sYXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9jb2xsZWN0aW9uLW9mLWZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvZWZmaWNpZW50LTY0LWJpdC1hcml0aG1ldGljLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2dsb2JhbC10aGlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL2l0ZXJhdG9yLWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMva2V5cy1jb21wb3NpdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXAtdXBzZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL21hdGgtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvbnVtYmVyLWZyb20tc3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL29iamVjdC1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvb2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9wYXR0ZXJuLW1hdGNoaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS1hbnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcHJvbWlzZS10cnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvcmVmbGVjdC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zZWVkZWQtcmFuZG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3NldC1tZXRob2RzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3N0cmluZy1hdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctY29kZS1wb2ludHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvc3RyaW5nLW1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9zdHJpbmctcmVwbGFjZS1hbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9wcm9wb3NhbHMvdXJsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlLzAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS8xLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvMi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9jb3JlLWpzL3N0YWdlLzMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS80LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2NvcmUtanMvc3RhZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy9zdGFnZS9wcmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvY29yZS1qcy93ZWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvZXM2LXByb21pc2UtcG9seWZpbGwvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lQnVmZmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25vZGVVdGlsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fcm9vdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9taW5pLXNpZ25hbHMvbGliL21pbmktc2lnbmFscy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FmLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItZHouanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1rdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1TRy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1uei5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtZG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWxhdG4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h1LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHktYW0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvanYuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9reS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xiLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21rLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMtbXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL210LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwtYmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9yby5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHpsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLWxhdG4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXouanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveW8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWhrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZXxzeW5jfC9eLy4qJCIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9tb21lbnQvbW9tZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGFyc2UtdXJpL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9wbHVnaW5zL2NhbWVyYTNkL3NyYy9DYW1lcmEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvY2FtZXJhM2Qvc3JjL0NhbWVyYU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvY2FtZXJhM2Qvc3JjL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvcGx1Z2lucy9jYW1lcmEzZC9zcmMvUGVyc3BlY3RpdmVDYW1lcmEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvY2FtZXJhM2Qvc3JjL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9wbHVnaW5zL2NhbWVyYTNkL3NyYy9zcHJpdGUzZC9TcHJpdGUzRC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvcGx1Z2lucy9jYW1lcmEzZC9zcmMvc3ByaXRlM2QvU3ByaXRlM0RDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9wbHVnaW5zL2NhbWVyYTNkL3NyYy9zcHJpdGUzZC9TcHJpdGUzREZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvZmJpbnN0YW50L3NyYy9BZEluc3RhbmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9wbHVnaW5zL2ZiaW5zdGFudC9zcmMvRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvZmJpbnN0YW50L3NyYy9MZWFkZXJib2FyZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvcGx1Z2lucy9mYmluc3RhbnQvc3JjL0xlYWRlcmJvYXJkU2NvcmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3BsdWdpbnMvZmJpbnN0YW50L3NyYy9Qcm9kdWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9wbHVnaW5zL2ZiaW5zdGFudC9zcmMvUHVyY2hhc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL0FsaWduVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL0FuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9DYWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9HZXRGaXJzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvR2V0TGFzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvR3JpZEFsaWduLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9JbmNBbHBoYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvSW5jWC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvSW5jWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL0luY1kuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1BsYWNlT25DaXJjbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1BsYWNlT25FbGxpcHNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9QbGFjZU9uTGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvUGxhY2VPblJlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvUGxhY2VPblRyaWFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9QbGF5QW5pbWF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9Qcm9wZXJ0eVZhbHVlSW5jLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9Qcm9wZXJ0eVZhbHVlU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9SYW5kb21DaXJjbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1JhbmRvbUVsbGlwc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1JhbmRvbUxpbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1JhbmRvbVJlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvUmFuZG9tVHJpYW5nbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1JvdGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvUm90YXRlQXJvdW5kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9Sb3RhdGVBcm91bmREaXN0YW5jZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2NhbGVYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TY2FsZVhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TY2FsZVkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NldEFscGhhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TZXRCbGVuZE1vZGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NldERlcHRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TZXRIaXRBcmVhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TZXRPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NldFJvdGF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TZXRTY2FsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0U2NhbGVYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9TZXRTY2FsZVkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NldFNjcm9sbEZhY3Rvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0U2Nyb2xsRmFjdG9yWC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0U2Nyb2xsRmFjdG9yWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0VGludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0VmlzaWJsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0WC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU2V0WFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NldFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NoaWZ0UG9zaXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1NodWZmbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1Ntb290aFN0ZXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL1Ntb290aGVyU3RlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FjdGlvbnMvU3ByZWFkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9Ub2dnbGVWaXNpYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYWN0aW9ucy9XcmFwSW5SZWN0YW5nbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hY3Rpb25zL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9BbmltYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL0FuaW1hdGlvbkZyYW1lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9BbmltYXRpb25NYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvQUREX0FOSU1BVElPTl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL0FOSU1BVElPTl9DT01QTEVURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL0FOSU1BVElPTl9SRVBFQVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL2V2ZW50cy9BTklNQVRJT05fUkVTVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL0FOSU1BVElPTl9TVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL1BBVVNFX0FMTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL1JFTU9WRV9BTklNQVRJT05fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL2V2ZW50cy9SRVNVTUVfQUxMX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9DT01QTEVURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL1NQUklURV9BTklNQVRJT05fS0VZX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVQRUFUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVTVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvZXZlbnRzL1NQUklURV9BTklNQVRJT05fS0VZX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9LRVlfVVBEQVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9SRVBFQVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL2V2ZW50cy9TUFJJVEVfQU5JTUFUSU9OX1JFU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL2V2ZW50cy9TUFJJVEVfQU5JTUFUSU9OX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvYW5pbWF0aW9ucy9ldmVudHMvU1BSSVRFX0FOSU1BVElPTl9VUERBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9hbmltYXRpb25zL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2FuaW1hdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYWNoZS9CYXNlQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYWNoZS9DYWNoZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYWNoZS9ldmVudHMvQUREX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FjaGUvZXZlbnRzL1JFTU9WRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhY2hlL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhY2hlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9CYXNlQ2FtZXJhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9DYW1lcmEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL0NhbWVyYU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2VmZmVjdHMvRmFkZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZWZmZWN0cy9GbGFzaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZWZmZWN0cy9QYW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2VmZmVjdHMvUm90YXRlVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2VmZmVjdHMvU2hha2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2VmZmVjdHMvWm9vbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZWZmZWN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZXZlbnRzL0RFU1RST1lfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2V2ZW50cy9GQURFX0lOX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvRkFERV9JTl9TVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZXZlbnRzL0ZBREVfT1VUX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvRkFERV9PVVRfU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2V2ZW50cy9GTEFTSF9DT01QTEVURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZXZlbnRzL0ZMQVNIX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvUEFOX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvUEFOX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvUE9TVF9SRU5ERVJfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2V2ZW50cy9QUkVfUkVOREVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvUk9UQVRFX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvUk9UQVRFX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvU0hBS0VfQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2V2ZW50cy9TSEFLRV9TVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvMmQvZXZlbnRzL1pPT01fQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2V2ZW50cy9aT09NX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy8yZC9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzLzJkL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY2FtZXJhcy9jb250cm9scy9GaXhlZEtleUNvbnRyb2wuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzL2NvbnRyb2xzL1Ntb290aGVkS2V5Q29udHJvbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NhbWVyYXMvY29udHJvbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jYW1lcmFzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL0NvbmZpZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvQ3JlYXRlUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL0RlYnVnSGVhZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9HYW1lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9UaW1lU3RlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvVmlzaWJpbGl0eUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9CTFVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvQk9PVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvZXZlbnRzL0NPTlRFWFRfTE9TVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvZXZlbnRzL0NPTlRFWFRfUkVTVE9SRURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9ERVNUUk9ZX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvRk9DVVNfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9ISURERU5fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9QQVVTRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvZXZlbnRzL1BPU1RfUkVOREVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvUE9TVF9TVEVQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvUFJFX1JFTkRFUl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvZXZlbnRzL1BSRV9TVEVQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvUkVBRFlfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9SRVNVTUVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jb3JlL2V2ZW50cy9TVEVQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9ldmVudHMvVklTSUJMRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NvcmUvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY29yZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NyZWF0ZS9HZW5lcmF0ZVRleHR1cmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jcmVhdGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jcmVhdGUvcGFsZXR0ZXMvQXJuZTE2LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY3JlYXRlL3BhbGV0dGVzL0M2NC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NyZWF0ZS9wYWxldHRlcy9DR0EuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jcmVhdGUvcGFsZXR0ZXMvSk1QLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY3JlYXRlL3BhbGV0dGVzL01TWC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2NyZWF0ZS9wYWxldHRlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2N1cnZlcy9DdWJpY0JlemllckN1cnZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY3VydmVzL0N1cnZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvY3VydmVzL0VsbGlwc2VDdXJ2ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2N1cnZlcy9MaW5lQ3VydmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jdXJ2ZXMvUXVhZHJhdGljQmV6aWVyQ3VydmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jdXJ2ZXMvU3BsaW5lQ3VydmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jdXJ2ZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jdXJ2ZXMvcGF0aC9Nb3ZlVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9jdXJ2ZXMvcGF0aC9QYXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGF0YS9EYXRhTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RhdGEvRGF0YU1hbmFnZXJQbHVnaW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kYXRhL2V2ZW50cy9DSEFOR0VfREFUQV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RhdGEvZXZlbnRzL0NIQU5HRV9EQVRBX0tFWV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RhdGEvZXZlbnRzL1JFTU9WRV9EQVRBX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGF0YS9ldmVudHMvU0VUX0RBVEFfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kYXRhL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RhdGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kZXZpY2UvQXVkaW8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kZXZpY2UvQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RldmljZS9DYW52YXNGZWF0dXJlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RldmljZS9GZWF0dXJlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RldmljZS9GdWxsc2NyZWVuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGV2aWNlL0lucHV0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGV2aWNlL09TLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGV2aWNlL1ZpZGVvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGV2aWNlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9jb25zdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vaW4vQm90dG9tQ2VudGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9pbi9Cb3R0b21MZWZ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9pbi9Cb3R0b21SaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vaW4vQ2VudGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9pbi9MZWZ0Q2VudGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9pbi9RdWlja1NldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vaW4vUmlnaHRDZW50ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2FsaWduL2luL1RvcENlbnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vaW4vVG9wTGVmdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vaW4vVG9wUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2FsaWduL2luL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vQm90dG9tQ2VudGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi90by9Cb3R0b21MZWZ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi90by9Cb3R0b21SaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vTGVmdEJvdHRvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vTGVmdENlbnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vTGVmdFRvcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vUXVpY2tTZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2FsaWduL3RvL1JpZ2h0Qm90dG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9hbGlnbi90by9SaWdodENlbnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vUmlnaHRUb3AuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2FsaWduL3RvL1RvcENlbnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vVG9wTGVmdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYWxpZ24vdG8vVG9wUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2FsaWduL3RvL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvQ2VudGVyT24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9HZXRCb3R0b20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9HZXRDZW50ZXJYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvR2V0Q2VudGVyWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYm91bmRzL0dldExlZnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9HZXRPZmZzZXRYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvR2V0T2Zmc2V0WS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYm91bmRzL0dldFJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvR2V0VG9wLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvU2V0Qm90dG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvU2V0Q2VudGVyWC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvYm91bmRzL1NldENlbnRlclkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9TZXRMZWZ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9ib3VuZHMvU2V0UmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9TZXRUb3AuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2JvdW5kcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY2FudmFzL0NhbnZhc0ludGVycG9sYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NhbnZhcy9DYW52YXNQb29sLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jYW52YXMvU21vb3RoaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jYW52YXMvVG91Y2hBY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NhbnZhcy9Vc2VyU2VsZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jYW52YXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NvbG9yL0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9Db2xvclRvUkdCQS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY29sb3IvQ29tcG9uZW50VG9IZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NvbG9yL0dldENvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9HZXRDb2xvcjMyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9IU0xUb0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9IU1ZDb2xvcldoZWVsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9IU1ZUb1JHQi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY29sb3IvSGV4U3RyaW5nVG9Db2xvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY29sb3IvSHVlVG9Db21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NvbG9yL0ludGVnZXJUb0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9JbnRlZ2VyVG9SR0IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NvbG9yL0ludGVycG9sYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9PYmplY3RUb0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9SR0JTdHJpbmdUb0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9SR0JUb0hTVi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY29sb3IvUkdCVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L2NvbG9yL1JhbmRvbVJHQi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvY29sb3IvVmFsdWVUb0NvbG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZGlzcGxheS9jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L21hc2svQml0bWFwTWFzay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2Rpc3BsYXkvbWFzay9HZW9tZXRyeU1hc2suanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L21hc2svaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9kaXNwbGF5L3NoYWRlci9CYXNlU2hhZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL0FkZFRvRE9NLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL0NyZWF0ZURPTUNvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RvbS9ET01Db250ZW50TG9hZGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL0dldElubmVySGVpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL0dldFNjcmVlbk9yaWVudGF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL0dldFRhcmdldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RvbS9QYXJzZVhNTC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RvbS9SZW1vdmVGcm9tRE9NLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZG9tL1JlcXVlc3RBbmltYXRpb25GcmFtZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2RvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2V2ZW50cy9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9CdWlsZEdhbWVPYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9CdWlsZEdhbWVPYmplY3RBbmltYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9EaXNwbGF5TGlzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL0dhbWVPYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0Q3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL0dhbWVPYmplY3RGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvVXBkYXRlTGlzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JpdG1hcHRleHQvR2V0Qml0bWFwVGV4dFNpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L1BhcnNlRnJvbUF0bGFzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9QYXJzZVJldHJvRm9udC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JpdG1hcHRleHQvUGFyc2VYTUxCaXRtYXBGb250LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9SZXRyb0ZvbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L2NvbnN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9keW5hbWljL0R5bmFtaWNCaXRtYXBUZXh0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9keW5hbWljL0R5bmFtaWNCaXRtYXBUZXh0Q2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L2R5bmFtaWMvRHluYW1pY0JpdG1hcFRleHRDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9keW5hbWljL0R5bmFtaWNCaXRtYXBUZXh0RmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JpdG1hcHRleHQvZHluYW1pYy9EeW5hbWljQml0bWFwVGV4dFJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JpdG1hcHRleHQvZHluYW1pYy9EeW5hbWljQml0bWFwVGV4dFdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L3N0YXRpYy9CaXRtYXBUZXh0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9zdGF0aWMvQml0bWFwVGV4dENhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9zdGF0aWMvQml0bWFwVGV4dENyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L3N0YXRpYy9CaXRtYXBUZXh0RmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JpdG1hcHRleHQvc3RhdGljL0JpdG1hcFRleHRSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9iaXRtYXB0ZXh0L3N0YXRpYy9CaXRtYXBUZXh0V2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JsaXR0ZXIvQmxpdHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JsaXR0ZXIvQmxpdHRlckNhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYmxpdHRlci9CbGl0dGVyQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2JsaXR0ZXIvQmxpdHRlckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ibGl0dGVyL0JsaXR0ZXJSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ibGl0dGVyL0JsaXR0ZXJXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvYmxpdHRlci9Cb2IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL0FscGhhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9BbHBoYVNpbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvQW5pbWF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9CbGVuZE1vZGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL0NvbXB1dGVkU2l6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvQ3JvcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvRGVwdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL0ZsaXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL0dldEJvdW5kcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvTWFzay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvT3JpZ2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9QYXRoRm9sbG93ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1BpcGVsaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9TY3JvbGxGYWN0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1NpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RleHR1cmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RleHR1cmVDcm9wLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9UaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9Ub0pTT04uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvVHJhbnNmb3JtTWF0cml4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9WaXNpYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29tcG9uZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbnRhaW5lci9Db250YWluZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb250YWluZXIvQ29udGFpbmVyQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9jb250YWluZXIvQ29udGFpbmVyQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbnRhaW5lci9Db250YWluZXJGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvY29udGFpbmVyL0NvbnRhaW5lclJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2NvbnRhaW5lci9Db250YWluZXJXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZG9tZWxlbWVudC9DU1NCbGVuZE1vZGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZG9tZWxlbWVudC9ET01FbGVtZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZG9tZWxlbWVudC9ET01FbGVtZW50Q1NTUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9kb21lbGVtZW50L0RPTUVsZW1lbnRGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZG9tZWxlbWVudC9ET01FbGVtZW50UmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXZlbnRzL0RFU1RST1lfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ldmVudHMvVklERU9fQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ldmVudHMvVklERU9fQ1JFQVRFRF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2V2ZW50cy9WSURFT19FUlJPUl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2V2ZW50cy9WSURFT19MT09QX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXZlbnRzL1ZJREVPX1BMQVlfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ldmVudHMvVklERU9fU0VFS0VEX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXZlbnRzL1ZJREVPX1NFRUtJTkdfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ldmVudHMvVklERU9fU1RPUF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2V2ZW50cy9WSURFT19USU1FT1VUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXZlbnRzL1ZJREVPX1VOTE9DS0VEX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXh0ZXJuL0V4dGVybi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2V4dGVybi9FeHRlcm5GYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZXh0ZXJuL0V4dGVyblJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2V4dGVybi9FeHRlcm5XZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZ3JhcGhpY3MvQ29tbWFuZHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ncmFwaGljcy9HcmFwaGljcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2dyYXBoaWNzL0dyYXBoaWNzQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ncmFwaGljcy9HcmFwaGljc0NyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ncmFwaGljcy9HcmFwaGljc0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9ncmFwaGljcy9HcmFwaGljc1JlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2dyYXBoaWNzL0dyYXBoaWNzV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2dyb3VwL0dyb3VwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZ3JvdXAvR3JvdXBDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvZ3JvdXAvR3JvdXBGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvaW1hZ2UvSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9pbWFnZS9JbWFnZUNhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvaW1hZ2UvSW1hZ2VDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvaW1hZ2UvSW1hZ2VGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvaW1hZ2UvSW1hZ2VSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9pbWFnZS9JbWFnZVdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2xpZ2h0cy9MaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL2xpZ2h0cy9MaWdodHNNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvbGlnaHRzL0xpZ2h0c1BsdWdpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL21lc2gvTWVzaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL21lc2gvTWVzaENhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvbWVzaC9NZXNoQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL21lc2gvTWVzaEZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9tZXNoL01lc2hSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9tZXNoL01lc2hXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGFydGljbGVzL0VtaXR0ZXJPcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3BhcnRpY2xlcy9HcmF2aXR5V2VsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3BhcnRpY2xlcy9QYXJ0aWNsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3BhcnRpY2xlcy9QYXJ0aWNsZUVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXJ0aWNsZXMvUGFydGljbGVFbWl0dGVyTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3BhcnRpY2xlcy9QYXJ0aWNsZU1hbmFnZXJDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3BhcnRpY2xlcy9QYXJ0aWNsZU1hbmFnZXJDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGFydGljbGVzL1BhcnRpY2xlTWFuYWdlckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXJ0aWNsZXMvUGFydGljbGVNYW5hZ2VyUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGFydGljbGVzL1BhcnRpY2xlTWFuYWdlcldlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXJ0aWNsZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXJ0aWNsZXMvem9uZXMvRGVhdGhab25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGFydGljbGVzL3pvbmVzL0VkZ2Vab25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGFydGljbGVzL3pvbmVzL1JhbmRvbVpvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXJ0aWNsZXMvem9uZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9wYXRoZm9sbG93ZXIvUGF0aEZvbGxvd2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcGF0aGZvbGxvd2VyL1BhdGhGb2xsb3dlckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9xdWFkL1F1YWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9xdWFkL1F1YWRDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcXVhZC9RdWFkRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3JlbmRlcnRleHR1cmUvUmVuZGVyVGV4dHVyZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3JlbmRlcnRleHR1cmUvUmVuZGVyVGV4dHVyZUNhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcmVuZGVydGV4dHVyZS9SZW5kZXJUZXh0dXJlQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3JlbmRlcnRleHR1cmUvUmVuZGVyVGV4dHVyZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9yZW5kZXJ0ZXh0dXJlL1JlbmRlclRleHR1cmVSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9yZW5kZXJ0ZXh0dXJlL1JlbmRlclRleHR1cmVXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcm9wZS9Sb3BlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcm9wZS9Sb3BlQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9yb3BlL1JvcGVDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvcm9wZS9Sb3BlRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3JvcGUvUm9wZVJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3JvcGUvUm9wZVdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFkZXIvU2hhZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhZGVyL1NoYWRlckNhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhZGVyL1NoYWRlckNyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFkZXIvU2hhZGVyRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYWRlci9TaGFkZXJSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFkZXIvU2hhZGVyV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL0ZpbGxQYXRoV2ViR0wuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9GaWxsU3R5bGVDYW52YXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9MaW5lU3R5bGVDYW52YXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9TaGFwZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL1N0cm9rZVBhdGhXZWJHTC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2FyYy9BcmMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9hcmMvQXJjQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9hcmMvQXJjRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2FyYy9BcmNSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9hcmMvQXJjV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2N1cnZlL0N1cnZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvY3VydmUvQ3VydmVDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2N1cnZlL0N1cnZlRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2N1cnZlL0N1cnZlUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvY3VydmUvQ3VydmVXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvZWxsaXBzZS9FbGxpcHNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvZWxsaXBzZS9FbGxpcHNlQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9lbGxpcHNlL0VsbGlwc2VGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvZWxsaXBzZS9FbGxpcHNlUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvZWxsaXBzZS9FbGxpcHNlV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2dyaWQvR3JpZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2dyaWQvR3JpZENhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvZ3JpZC9HcmlkRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2dyaWQvR3JpZFJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2dyaWQvR3JpZFdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9pc29ib3gvSXNvQm94LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvaXNvYm94L0lzb0JveENhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvaXNvYm94L0lzb0JveEZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9pc29ib3gvSXNvQm94UmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvaXNvYm94L0lzb0JveFdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9pc290cmlhbmdsZS9Jc29UcmlhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2lzb3RyaWFuZ2xlL0lzb1RyaWFuZ2xlQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9pc290cmlhbmdsZS9Jc29UcmlhbmdsZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9pc290cmlhbmdsZS9Jc29UcmlhbmdsZVJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2lzb3RyaWFuZ2xlL0lzb1RyaWFuZ2xlV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2xpbmUvTGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2xpbmUvTGluZUNhbnZhc1JlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvbGluZS9MaW5lRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2xpbmUvTGluZVJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL2xpbmUvTGluZVdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9wb2x5Z29uL1BvbHlnb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9wb2x5Z29uL1BvbHlnb25DYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3BvbHlnb24vUG9seWdvbkZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9wb2x5Z29uL1BvbHlnb25SZW5kZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9wb2x5Z29uL1BvbHlnb25XZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvcmVjdGFuZ2xlL1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3JlY3RhbmdsZS9SZWN0YW5nbGVDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3JlY3RhbmdsZS9SZWN0YW5nbGVGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvcmVjdGFuZ2xlL1JlY3RhbmdsZVJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3JlY3RhbmdsZS9SZWN0YW5nbGVXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvc3Rhci9TdGFyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvc3Rhci9TdGFyQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zaGFwZS9zdGFyL1N0YXJGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvc3Rhci9TdGFyUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvc3Rhci9TdGFyV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3RyaWFuZ2xlL1RyaWFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvdHJpYW5nbGUvVHJpYW5nbGVDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3RyaWFuZ2xlL1RyaWFuZ2xlRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3NoYXBlL3RyaWFuZ2xlL1RyaWFuZ2xlUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc2hhcGUvdHJpYW5nbGUvVHJpYW5nbGVXZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc3ByaXRlL1Nwcml0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3Nwcml0ZS9TcHJpdGVDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3Nwcml0ZS9TcHJpdGVDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc3ByaXRlL1Nwcml0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy9zcHJpdGUvU3ByaXRlUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvc3ByaXRlL1Nwcml0ZVdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy90ZXh0L0dldFRleHRTaXplLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGV4dC9NZWFzdXJlVGV4dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3RleHQvVGV4dFN0eWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGV4dC9zdGF0aWMvVGV4dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3RleHQvc3RhdGljL1RleHRDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3RleHQvc3RhdGljL1RleHRDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGV4dC9zdGF0aWMvVGV4dEZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy90ZXh0L3N0YXRpYy9UZXh0UmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGV4dC9zdGF0aWMvVGV4dFdlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy90aWxlc3ByaXRlL1RpbGVTcHJpdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy90aWxlc3ByaXRlL1RpbGVTcHJpdGVDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3RpbGVzcHJpdGUvVGlsZVNwcml0ZUNyZWF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nYW1lb2JqZWN0cy90aWxlc3ByaXRlL1RpbGVTcHJpdGVGYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGlsZXNwcml0ZS9UaWxlU3ByaXRlUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdGlsZXNwcml0ZS9UaWxlU3ByaXRlV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3ZpZGVvL1ZpZGVvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdmlkZW8vVmlkZW9DYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3ZpZGVvL1ZpZGVvQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3ZpZGVvL1ZpZGVvRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3ZpZGVvL1ZpZGVvUmVuZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvdmlkZW8vVmlkZW9XZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvem9uZS9ab25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2FtZW9iamVjdHMvem9uZS9ab25lQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dhbWVvYmplY3RzL3pvbmUvWm9uZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NpcmNsZS9BcmVhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvQ2lyY2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvQ2lyY3VtZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vY2lyY2xlL0NpcmN1bWZlcmVuY2VQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vY2lyY2xlL0Nsb25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvQ29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NpcmNsZS9Db250YWluc1BvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvQ29udGFpbnNSZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvQ29weUZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NpcmNsZS9FcXVhbHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NpcmNsZS9HZXRCb3VuZHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NpcmNsZS9HZXRQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vY2lyY2xlL0dldFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vY2lyY2xlL09mZnNldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vY2lyY2xlL09mZnNldFBvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvUmFuZG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9jaXJjbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2NvbnN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9lbGxpcHNlL0FyZWEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvQ2lyY3VtZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vZWxsaXBzZS9DaXJjdW1mZXJlbmNlUG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvQ29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvQ29udGFpbnNQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vZWxsaXBzZS9Db250YWluc1JlY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvQ29weUZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvRWxsaXBzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vZWxsaXBzZS9FcXVhbHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvR2V0Qm91bmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9lbGxpcHNlL0dldFBvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9lbGxpcHNlL0dldFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vZWxsaXBzZS9PZmZzZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvT2Zmc2V0UG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2VsbGlwc2UvUmFuZG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9lbGxpcHNlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9DaXJjbGVUb0NpcmNsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9DaXJjbGVUb1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9HZXRDaXJjbGVUb0NpcmNsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9HZXRDaXJjbGVUb1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9HZXRMaW5lVG9DaXJjbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2ludGVyc2VjdHMvR2V0TGluZVRvUmVjdGFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL0dldFJlY3RhbmdsZUludGVyc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9HZXRSZWN0YW5nbGVUb1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9HZXRSZWN0YW5nbGVUb1RyaWFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL0dldFRyaWFuZ2xlVG9DaXJjbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2ludGVyc2VjdHMvR2V0VHJpYW5nbGVUb0xpbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2ludGVyc2VjdHMvR2V0VHJpYW5nbGVUb1RyaWFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL0xpbmVUb0NpcmNsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9MaW5lVG9MaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL0xpbmVUb1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9Qb2ludFRvTGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9Qb2ludFRvTGluZVNlZ21lbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2ludGVyc2VjdHMvUmVjdGFuZ2xlVG9SZWN0YW5nbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2ludGVyc2VjdHMvUmVjdGFuZ2xlVG9UcmlhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9SZWN0YW5nbGVUb1ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9UcmlhbmdsZVRvQ2lyY2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL1RyaWFuZ2xlVG9MaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9pbnRlcnNlY3RzL1RyaWFuZ2xlVG9UcmlhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vaW50ZXJzZWN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9BbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9CcmVzZW5oYW1Qb2ludHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvQ2VudGVyT24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvQ29weUZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvRXF1YWxzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL0V4dGVuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9HZXRFYXNlZFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9HZXRNaWRQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9HZXROZWFyZXN0UG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvR2V0Tm9ybWFsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL0dldFBvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL0dldFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9HZXRTaG9ydGVzdERpc3RhbmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL0hlaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9MZW5ndGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvTGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9Ob3JtYWxBbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9Ob3JtYWxYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL05vcm1hbFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvT2Zmc2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL1BlcnBTbG9wZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9SYW5kb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL2xpbmUvUmVmbGVjdEFuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL1JvdGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9Sb3RhdGVBcm91bmRQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9Sb3RhdGVBcm91bmRYWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vbGluZS9TZXRUb0FuZ2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL1Nsb3BlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL1dpZHRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9saW5lL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9DZWlsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9DbG9uZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcG9pbnQvQ29weUZyb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L0VxdWFscy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcG9pbnQvRmxvb3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L0dldENlbnRyb2lkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9HZXRNYWduaXR1ZGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L0dldE1hZ25pdHVkZVNxLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9HZXRSZWN0YW5nbGVGcm9tUG9pbnRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9JbnRlcnBvbGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcG9pbnQvSW52ZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9OZWdhdGl2ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcG9pbnQvUG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L1Byb2plY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L1Byb2plY3RVbml0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2ludC9TZXRNYWduaXR1ZGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvaW50L2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL0Nsb25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL0NvbnRhaW5zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL0NvbnRhaW5zUG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvbHlnb24vRWFyY3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL0dldEFBQkIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvbHlnb24vR2V0TnVtYmVyQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvbHlnb24vR2V0UG9pbnRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL1BlcmltZXRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcG9seWdvbi9Qb2x5Z29uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL1JldmVyc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3BvbHlnb24vU21vb3RoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9wb2x5Z29uL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvQXJlYS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0NlaWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9DZWlsQWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvQ2VudGVyT24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9DbG9uZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0NvbnRhaW5zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvQ29udGFpbnNQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0NvbnRhaW5zUmVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0NvcHlGcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRGVjb21wb3NlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRXF1YWxzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRml0SW5zaWRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRml0T3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0Zsb29yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRmxvb3JBbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9Gcm9tUG9pbnRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvRnJvbVhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvR2V0QXNwZWN0UmF0aW8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9HZXRDZW50ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9HZXRQb2ludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0dldFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL0dldFNpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9JbmZsYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvSW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvTWFyY2hpbmdBbnRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvTWVyZ2VQb2ludHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9NZXJnZVJlY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9NZXJnZVhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvT2Zmc2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvT2Zmc2V0UG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9PdmVybGFwcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL1BlcmltZXRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL1BlcmltZXRlclBvaW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvUmFuZG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvUmFuZG9tT3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL1JlY3RhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL1NhbWVEaW1lbnNpb25zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS9yZWN0YW5nbGUvU2NhbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3JlY3RhbmdsZS9Vbmlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vcmVjdGFuZ2xlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9BcmVhLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9CdWlsZEVxdWlsYXRlcmFsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9CdWlsZEZyb21Qb2x5Z29uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9CdWlsZFJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9DZW50ZXJPbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvQ2VudHJvaWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0NpcmN1bUNlbnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvQ2lyY3VtQ2lyY2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9DbG9uZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvQ29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0NvbnRhaW5zQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0NvbnRhaW5zUG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0NvcHlGcm9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9EZWNvbXBvc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0VxdWFscy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvR2V0UG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL0dldFBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvSW5DZW50ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL09mZnNldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvUGVyaW1ldGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9SYW5kb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL1JvdGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvUm90YXRlQXJvdW5kUG9pbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9nZW9tL3RyaWFuZ2xlL1JvdGF0ZUFyb3VuZFhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvZ2VvbS90cmlhbmdsZS9UcmlhbmdsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2dlb20vdHJpYW5nbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9DcmVhdGVJbnRlcmFjdGl2ZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L0NyZWF0ZVBpeGVsUGVyZmVjdEhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9JbnB1dE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9JbnB1dFBsdWdpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L0lucHV0UGx1Z2luQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9Qb2ludGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvQk9PVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9ERVNUUk9ZX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0RSQUdfRU5EX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0RSQUdfRU5URVJfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvRFJBR19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9EUkFHX0xFQVZFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0RSQUdfT1ZFUl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9EUkFHX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0RST1BfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9ET1dOX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfRFJBR19FTkRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9EUkFHX0VOVEVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfRFJBR19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9HQU1FT0JKRUNUX0RSQUdfTEVBVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9EUkFHX09WRVJfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9EUkFHX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfRFJPUF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9HQU1FT0JKRUNUX01PVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9PVVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9PVkVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfUE9JTlRFUl9NT1ZFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfUE9JTlRFUl9PVVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9QT0lOVEVSX09WRVJfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRU9CSkVDVF9QT0lOVEVSX1VQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfUE9JTlRFUl9XSEVFTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9HQU1FT0JKRUNUX1VQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL0dBTUVPQkpFQ1RfV0hFRUxfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRV9PVVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvR0FNRV9PVkVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL01BTkFHRVJfQk9PVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9NQU5BR0VSX1BST0NFU1NfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvTUFOQUdFUl9VUERBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvUE9JTlRFUkxPQ0tfQ0hBTkdFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL1BPSU5URVJfRE9XTl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9QT0lOVEVSX0RPV05fT1VUU0lERV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9QT0lOVEVSX01PVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvUE9JTlRFUl9PVVRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvUE9JTlRFUl9PVkVSX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL1BPSU5URVJfVVBfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvUE9JTlRFUl9VUF9PVVRTSURFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZXZlbnRzL1BPSU5URVJfV0hFRUxfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvUFJFX1VQREFURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9TSFVURE9XTl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9TVEFSVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2V2ZW50cy9VUERBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL0F4aXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2dhbWVwYWQvR2FtZXBhZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2dhbWVwYWQvR2FtZXBhZFBsdWdpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2dhbWVwYWQvY29uZmlncy9TTkVTX1VTQl9Db250cm9sbGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZ2FtZXBhZC9jb25maWdzL1NvbnlfUGxheVN0YXRpb25fRHVhbFNob2NrXzQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2NvbmZpZ3MvWEJveDM2MF9Db250cm9sbGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZ2FtZXBhZC9jb25maWdzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZ2FtZXBhZC9ldmVudHMvQlVUVE9OX0RPV05fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2V2ZW50cy9CVVRUT05fVVBfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2V2ZW50cy9DT05ORUNURURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2V2ZW50cy9ESVNDT05ORUNURURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2V2ZW50cy9HQU1FUEFEX0JVVFRPTl9ET1dOX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvZ2FtZXBhZC9ldmVudHMvR0FNRVBBRF9CVVRUT05fVVBfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9nYW1lcGFkL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2dhbWVwYWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL0tleWJvYXJkTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL0tleWJvYXJkUGx1Z2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvY29tYm8vQWR2YW5jZUtleUNvbWJvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvY29tYm8vS2V5Q29tYm8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9jb21iby9Qcm9jZXNzS2V5Q29tYm8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9jb21iby9SZXNldEtleUNvbWJvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvZXZlbnRzL0FOWV9LRVlfRE9XTl9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL2V2ZW50cy9BTllfS0VZX1VQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvZXZlbnRzL0NPTUJPX01BVENIX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvZXZlbnRzL0RPV05fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9ldmVudHMvS0VZX0RPV05fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9ldmVudHMvS0VZX1VQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvZXZlbnRzL1VQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9rZXlzL0Rvd25EdXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL2tleXMvSnVzdERvd24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC9rZXlib2FyZC9rZXlzL0p1c3RVcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL2tleXMvS2V5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQva2V5cy9LZXlDb2Rlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2lucHV0L2tleWJvYXJkL2tleXMvS2V5TWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQva2V5Ym9hcmQva2V5cy9VcER1cmF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvbW91c2UvTW91c2VNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvaW5wdXQvbW91c2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC90b3VjaC9Ub3VjaE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9pbnB1dC90b3VjaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9GaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL0ZpbGVUeXBlc01hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvR2V0VVJMLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL0xvYWRlclBsdWdpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9NZXJnZVhIUlNldHRpbmdzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL011bHRpRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9YSFJMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvWEhSU2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZXZlbnRzL0FERF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9ldmVudHMvQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZXZlbnRzL0ZJTEVfQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZXZlbnRzL0ZJTEVfS0VZX0NPTVBMRVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2V2ZW50cy9GSUxFX0xPQURfRVJST1JfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZXZlbnRzL0ZJTEVfTE9BRF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9ldmVudHMvRklMRV9QUk9HUkVTU19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9ldmVudHMvUE9TVF9QUk9DRVNTX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2V2ZW50cy9QUk9HUkVTU19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9ldmVudHMvU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9BbmltYXRpb25KU09ORmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvQXRsYXNKU09ORmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvQXRsYXNYTUxGaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9BdWRpb0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL0F1ZGlvU3ByaXRlRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvQmluYXJ5RmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvQml0bWFwRm9udEZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL0NTU0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL0dMU0xGaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9IVE1MNUF1ZGlvRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvSFRNTEZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL0hUTUxUZXh0dXJlRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvSW1hZ2VGaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9KU09ORmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvTXVsdGlBdGxhc0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL011bHRpU2NyaXB0RmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvUGFja0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1BsdWdpbkZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1NWR0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1NjZW5lRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvU2NlbmVQbHVnaW5GaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9TY3JpcHRGaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9TcHJpdGVTaGVldEZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1RleHRGaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbG9hZGVyL2ZpbGV0eXBlcy9UaWxlbWFwQ1NWRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvVGlsZW1hcEltcGFjdEZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1RpbGVtYXBKU09ORmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvVW5pdHlBdGxhc0ZpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvZmlsZXR5cGVzL1ZpZGVvRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvWE1MRmlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL2xvYWRlci9maWxldHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9sb2FkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL0F2ZXJhZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL0Jlcm5zdGVpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvQmV0d2Vlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvQ2F0bXVsbFJvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvQ2VpbFRvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9DbGFtcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvRGVnVG9SYWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL0RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL0ZhY3RvcmlhbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvRmxvYXRCZXR3ZWVuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9GbG9vclRvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9Gcm9tUGVyY2VudC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvR2V0U3BlZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL0lzRXZlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvSXNFdmVuU3RyaWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9MaW5lYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL01hdHJpeDMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL01hdHJpeDQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL01heEFkZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvTWluU3ViLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9QZXJjZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9RdWF0ZXJuaW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9SYWRUb0RlZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvUmFuZG9tWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1JhbmRvbVhZWi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvUmFuZG9tWFlaVy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvUm90YXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9Sb3RhdGVBcm91bmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1JvdGF0ZUFyb3VuZERpc3RhbmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9Sb3RhdGVWZWMzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9Sb3VuZEF3YXlGcm9tWmVyby5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvUm91bmRUby5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvU2luQ29zVGFibGVHZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1Ntb290aFN0ZXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1Ntb290aGVyU3RlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvVG9YWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvVHJhbnNmb3JtWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1ZlY3RvcjIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1ZlY3RvcjMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1ZlY3RvcjQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL1dpdGhpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvV3JhcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvQmV0d2Vlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvQmV0d2VlblBvaW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvQmV0d2VlblBvaW50c1kuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2FuZ2xlL0JldHdlZW5ZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9hbmdsZS9Db3VudGVyQ2xvY2t3aXNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9hbmdsZS9Ob3JtYWxpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2FuZ2xlL1JhbmRvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvUmFuZG9tRGVncmVlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvUmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvUm90YXRlVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2FuZ2xlL1Nob3J0ZXN0QmV0d2Vlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvV3JhcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvYW5nbGUvV3JhcERlZ3JlZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2FuZ2xlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9jb25zdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9kaXN0YW5jZS9EaXN0YW5jZUJldHdlZW5Qb2ludHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Rpc3RhbmNlL0Rpc3RhbmNlQmV0d2VlblBvaW50c1NxdWFyZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Rpc3RhbmNlL0Rpc3RhbmNlQ2hlYnlzaGV2LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9kaXN0YW5jZS9EaXN0YW5jZVBvd2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9kaXN0YW5jZS9EaXN0YW5jZVNuYWtlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9kaXN0YW5jZS9EaXN0YW5jZVNxdWFyZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Rpc3RhbmNlL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvRWFzZU1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2JhY2svSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9iYWNrL0luT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvYmFjay9PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9iYWNrL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvYm91bmNlL0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvYm91bmNlL0luT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvYm91bmNlL091dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2JvdW5jZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2NpcmN1bGFyL0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvY2lyY3VsYXIvSW5PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9jaXJjdWxhci9PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9jaXJjdWxhci9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2N1YmljL0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvY3ViaWMvSW5PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9jdWJpYy9PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9jdWJpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2VsYXN0aWMvSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9lbGFzdGljL0luT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvZWxhc3RpYy9PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9lbGFzdGljL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvZXhwby9Jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2V4cG8vSW5PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9leHBvL091dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2V4cG8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL2xpbmVhci9MaW5lYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9saW5lYXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9xdWFkcmF0aWMvSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9xdWFkcmF0aWMvSW5PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9xdWFkcmF0aWMvT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvcXVhZHJhdGljL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvcXVhcnRpYy9Jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL3F1YXJ0aWMvSW5PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9xdWFydGljL091dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL3F1YXJ0aWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9xdWludGljL0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvcXVpbnRpYy9Jbk91dC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL3F1aW50aWMvT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvcXVpbnRpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZWFzaW5nL3NpbmUvSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9zaW5lL0luT3V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvc2luZS9PdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Vhc2luZy9zaW5lL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvc3RlcHBlZC9TdGVwcGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9lYXNpbmcvc3RlcHBlZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZnV6enkvQ2VpbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZnV6enkvRXF1YWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Z1enp5L0Zsb29yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9mdXp6eS9HcmVhdGVyVGhhbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvZnV6enkvTGVzc1RoYW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2Z1enp5L2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvaW50ZXJwb2xhdGlvbi9CZXppZXJJbnRlcnBvbGF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9pbnRlcnBvbGF0aW9uL0NhdG11bGxSb21JbnRlcnBvbGF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9pbnRlcnBvbGF0aW9uL0N1YmljQmV6aWVySW50ZXJwb2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvaW50ZXJwb2xhdGlvbi9MaW5lYXJJbnRlcnBvbGF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9pbnRlcnBvbGF0aW9uL1F1YWRyYXRpY0JlemllckludGVycG9sYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2ludGVycG9sYXRpb24vU21vb3RoU3RlcEludGVycG9sYXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL2ludGVycG9sYXRpb24vU21vb3RoZXJTdGVwSW50ZXJwb2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvaW50ZXJwb2xhdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvcG93Mi9HZXRQb3dlck9mVHdvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9wb3cyL0lzU2l6ZVBvd2VyT2ZUd28uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL3BvdzIvSXNWYWx1ZVBvd2VyT2ZUd28uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL3BvdzIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL3JhbmRvbS1kYXRhLWdlbmVyYXRvci9SYW5kb21EYXRhR2VuZXJhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9zbmFwL1NuYXBDZWlsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvbWF0aC9zbmFwL1NuYXBGbG9vci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL21hdGgvc25hcC9TbmFwVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9tYXRoL3NuYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waGFzZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9BcmNhZGVJbWFnZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL0FyY2FkZVBoeXNpY3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9BcmNhZGVTcHJpdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9Cb2R5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvQ29sbGlkZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9GYWN0b3J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvR2V0T3ZlcmxhcFguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9HZXRPdmVybGFwWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL1BoeXNpY3NHcm91cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL1NlcGFyYXRlWC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL1NlcGFyYXRlWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL1N0YXRpY0JvZHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9TdGF0aWNQaHlzaWNzR3JvdXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9Xb3JsZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2NvbXBvbmVudHMvQWNjZWxlcmF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9Bbmd1bGFyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9Cb3VuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9jb21wb25lbnRzL0RlYnVnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9EcmFnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9FbmFibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9jb21wb25lbnRzL0ZyaWN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9HcmF2aXR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9JbW1vdmFibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9jb21wb25lbnRzL01hc3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9jb21wb25lbnRzL092ZXJsYXBDaXJjLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29tcG9uZW50cy9PdmVybGFwUmVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2NvbXBvbmVudHMvU2l6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2NvbXBvbmVudHMvVmVsb2NpdHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9jb21wb25lbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9ldmVudHMvQ09MTElERV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2V2ZW50cy9PVkVSTEFQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvZXZlbnRzL1BBVVNFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvZXZlbnRzL1JFU1VNRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2V2ZW50cy9USUxFX0NPTExJREVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS9ldmVudHMvVElMRV9PVkVSTEFQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvZXZlbnRzL1dPUkxEX0JPVU5EU19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvYXJjYWRlL2V2ZW50cy9XT1JMRF9TVEVQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS90aWxlbWFwL1Byb2Nlc3NUaWxlQ2FsbGJhY2tzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvdGlsZW1hcC9Qcm9jZXNzVGlsZVNlcGFyYXRpb25YLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvdGlsZW1hcC9Qcm9jZXNzVGlsZVNlcGFyYXRpb25ZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9hcmNhZGUvdGlsZW1hcC9TZXBhcmF0ZVRpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS90aWxlbWFwL1RpbGVDaGVja1guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS90aWxlbWFwL1RpbGVDaGVja1kuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL2FyY2FkZS90aWxlbWFwL1RpbGVJbnRlcnNlY3RzQm9keS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9Cb2R5Qm91bmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvQ3VzdG9tTWFpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9NYXR0ZXJHYW1lT2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvTWF0dGVySW1hZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9NYXR0ZXJQaHlzaWNzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvTWF0dGVyU3ByaXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvTWF0dGVyVGlsZUJvZHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9QaHlzaWNzRWRpdG9yUGFyc2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvUGh5c2ljc0pTT05QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9Qb2ludGVyQ29uc3RyYWludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL1dvcmxkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvY29tcG9uZW50cy9Cb3VuY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL0NvbGxpc2lvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2NvbXBvbmVudHMvRm9yY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL0ZyaWN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvY29tcG9uZW50cy9HcmF2aXR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvY29tcG9uZW50cy9NYXNzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvY29tcG9uZW50cy9TZW5zb3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL1NldEJvZHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL1NsZWVwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvY29tcG9uZW50cy9TdGF0aWMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2NvbXBvbmVudHMvVmVsb2NpdHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9jb21wb25lbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvZXZlbnRzL0FGVEVSX0FERF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2V2ZW50cy9BRlRFUl9SRU1PVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvQUZURVJfVVBEQVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvZXZlbnRzL0JFRk9SRV9BRERfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvQkVGT1JFX1JFTU9WRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2V2ZW50cy9CRUZPUkVfVVBEQVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvZXZlbnRzL0NPTExJU0lPTl9BQ1RJVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvQ09MTElTSU9OX0VORF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2V2ZW50cy9DT0xMSVNJT05fU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvRFJBR19FTkRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvRFJBR19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2V2ZW50cy9EUkFHX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvZXZlbnRzL1BBVVNFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvZXZlbnRzL1JFU1VNRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2V2ZW50cy9TTEVFUF9FTkRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvU0xFRVBfU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2xpYi9ib2R5L0JvZHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvYm9keS9Db21wb3NpdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvYm9keS9Xb3JsZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2xpYi9jb2xsaXNpb24vRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29sbGlzaW9uL0dyaWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29sbGlzaW9uL1BhaXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29sbGlzaW9uL1BhaXJzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL2NvbGxpc2lvbi9RdWVyeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2xpYi9jb2xsaXNpb24vUmVzb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29sbGlzaW9uL1NBVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2xpYi9jb25zdHJhaW50L0NvbnN0cmFpbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29yZS9Db21tb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29yZS9FbmdpbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29yZS9FdmVudHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29yZS9NYXR0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvY29yZS9NZXRyaWNzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL2NvcmUvUGx1Z2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL2NvcmUvU2xlZXBpbmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvZmFjdG9yeS9Cb2RpZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvZmFjdG9yeS9Db21wb3NpdGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL2dlb21ldHJ5L0F4ZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvZ2VvbWV0cnkvQm91bmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL2dlb21ldHJ5L1N2Zy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL2xpYi9nZW9tZXRyeS9WZWN0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvZ2VvbWV0cnkvVmVydGljZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9waHlzaWNzL21hdHRlci1qcy9saWIvcGx1Z2lucy9NYXR0ZXJBdHRyYWN0b3JzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL3BsdWdpbnMvTWF0dGVyQ29sbGlzaW9uRXZlbnRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGh5c2ljcy9tYXR0ZXItanMvbGliL3BsdWdpbnMvTWF0dGVyV3JhcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BoeXNpY3MvbWF0dGVyLWpzL3BvbHktZGVjb21wL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGx1Z2lucy9CYXNlUGx1Z2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGx1Z2lucy9EZWZhdWx0UGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BsdWdpbnMvUGx1Z2luQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9wbHVnaW5zL1BsdWdpbk1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9wbHVnaW5zL1NjZW5lUGx1Z2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcGx1Z2lucy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BvbHlmaWxscy9BcnJheS5mb3JFYWNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcG9seWZpbGxzL0FycmF5LmlzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9wb2x5ZmlsbHMvQXVkaW9Db250ZXh0TW9ua2V5UGF0Y2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9wb2x5ZmlsbHMvTWF0aC50cnVuYy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BvbHlmaWxscy9VaW50MzJBcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BvbHlmaWxscy9jb25zb2xlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcG9seWZpbGxzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcG9seWZpbGxzL3BlcmZvcm1hbmNlLm5vdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3BvbHlmaWxscy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci9CbGVuZE1vZGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvU2NhbGVNb2Rlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL2NhbnZhcy9DYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL2NhbnZhcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL2NhbnZhcy91dGlscy9HZXRCbGVuZE1vZGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvc25hcHNob3QvQ2FudmFzU25hcHNob3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci9zbmFwc2hvdC9XZWJHTFNuYXBzaG90LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvc25hcHNob3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci93ZWJnbC9VdGlscy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL3dlYmdsL1dlYkdMUGlwZWxpbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci93ZWJnbC9XZWJHTFJlbmRlcmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci93ZWJnbC9waXBlbGluZXMvQml0bWFwTWFza1BpcGVsaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvcGlwZWxpbmVzL0ZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL3dlYmdsL3BpcGVsaW5lcy9UZXh0dXJlVGludFBpcGVsaW5lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvcGlwZWxpbmVzL1RleHR1cmVUaW50U3RyaXBQaXBlbGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL3dlYmdsL3BpcGVsaW5lcy9jb21wb25lbnRzL01vZGVsVmlld1Byb2plY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci93ZWJnbC9waXBlbGluZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9yZW5kZXJlci93ZWJnbC9zaGFkZXJzL0JpdG1hcE1hc2stZnJhZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3JlbmRlcmVyL3dlYmdsL3NoYWRlcnMvQml0bWFwTWFzay12ZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvc2hhZGVycy9Gb3J3YXJkRGlmZnVzZS1mcmFnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvc2hhZGVycy9UZXh0dXJlVGludC1mcmFnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvcmVuZGVyZXIvd2ViZ2wvc2hhZGVycy9UZXh0dXJlVGludC12ZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvU2NhbGVNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvY29uc3QvQ0VOVEVSX0NPTlNULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvY29uc3QvT1JJRU5UQVRJT05fQ09OU1QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2FsZS9jb25zdC9TQ0FMRV9NT0RFX0NPTlNULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvY29uc3QvWk9PTV9DT05TVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjYWxlL2NvbnN0L2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvZXZlbnRzL0VOVEVSX0ZVTExTQ1JFRU5fRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2FsZS9ldmVudHMvRlVMTFNDUkVFTl9GQUlMRURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2FsZS9ldmVudHMvRlVMTFNDUkVFTl9VTlNVUFBPUlRFRF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjYWxlL2V2ZW50cy9MRUFWRV9GVUxMU0NSRUVOX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NhbGUvZXZlbnRzL09SSUVOVEFUSU9OX0NIQU5HRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjYWxlL2V2ZW50cy9SRVNJWkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2FsZS9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2FsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL0dldFBoeXNpY3NQbHVnaW5zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvR2V0U2NlbmVQbHVnaW5zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvSW5qZWN0aW9uTWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvU2NlbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9TY2VuZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9TY2VuZVBsdWdpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL1NldHRpbmdzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvU3lzdGVtcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL2NvbnN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL0JPT1RfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvQ1JFQVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL0RFU1RST1lfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvUEFVU0VfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvUE9TVF9VUERBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvUFJFX1VQREFURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL2V2ZW50cy9SRUFEWV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL2V2ZW50cy9SRU5ERVJfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvUkVTVU1FX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1NIVVRET1dOX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1NMRUVQX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1RSQU5TSVRJT05fQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvVFJBTlNJVElPTl9JTklUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1RSQU5TSVRJT05fT1VUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1RSQU5TSVRJT05fU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zY2VuZS9ldmVudHMvVFJBTlNJVElPTl9XQUtFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL1VQREFURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NjZW5lL2V2ZW50cy9XQUtFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc2NlbmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9CYXNlU291bmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9CYXNlU291bmRNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvU291bmRNYW5hZ2VyQ3JlYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9DT01QTEVURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9ERUNPREVEX0FMTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9ERUNPREVEX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL0RFU1RST1lfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvREVUVU5FX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL0dMT0JBTF9ERVRVTkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvR0xPQkFMX01VVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvR0xPQkFMX1JBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvR0xPQkFMX1ZPTFVNRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9MT09QRURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvTE9PUF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9NVVRFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL1BBVVNFX0FMTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9QQVVTRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9QTEFZX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL1JBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvUkVTVU1FX0FMTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9SRVNVTUVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9ldmVudHMvU0VFS19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9TVE9QX0FMTF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9TVE9QX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL1VOTE9DS0VEX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvZXZlbnRzL1ZPTFVNRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2h0bWw1L0hUTUw1QXVkaW9Tb3VuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL2h0bWw1L0hUTUw1QXVkaW9Tb3VuZE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zb3VuZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL25vYXVkaW8vTm9BdWRpb1NvdW5kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvbm9hdWRpby9Ob0F1ZGlvU291bmRNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc291bmQvd2ViYXVkaW8vV2ViQXVkaW9Tb3VuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3NvdW5kL3dlYmF1ZGlvL1dlYkF1ZGlvU291bmRNYW5hZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc3RydWN0cy9MaXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc3RydWN0cy9NYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zdHJ1Y3RzL1Byb2Nlc3NRdWV1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3N0cnVjdHMvUlRyZWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zdHJ1Y3RzL1NldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3N0cnVjdHMvU2l6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3N0cnVjdHMvZXZlbnRzL1BST0NFU1NfUVVFVUVfQUREX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvc3RydWN0cy9ldmVudHMvUFJPQ0VTU19RVUVVRV9SRU1PVkVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy9zdHJ1Y3RzL2V2ZW50cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3N0cnVjdHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9DYW52YXNUZXh0dXJlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvRnJhbWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9UZXh0dXJlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvVGV4dHVyZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9UZXh0dXJlU291cmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9ldmVudHMvQUREX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvZXZlbnRzL0VSUk9SX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvZXZlbnRzL0xPQURfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9ldmVudHMvUkVBRFlfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9ldmVudHMvUkVNT1ZFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvZXZlbnRzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9wYXJzZXJzL0F0bGFzWE1MLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvcGFyc2Vycy9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9wYXJzZXJzL0ltYWdlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvcGFyc2Vycy9KU09OQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9wYXJzZXJzL0pTT05IYXNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGV4dHVyZXMvcGFyc2Vycy9TcHJpdGVTaGVldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RleHR1cmVzL3BhcnNlcnMvU3ByaXRlU2hlZXRGcm9tQXRsYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90ZXh0dXJlcy9wYXJzZXJzL1VuaXR5WUFNTC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RleHR1cmVzL3BhcnNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9Gb3JtYXRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvSW1hZ2VDb2xsZWN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvUGFyc2VUb1RpbGVtYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9UaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvVGlsZW1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL1RpbGVtYXBDcmVhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvVGlsZW1hcEZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9UaWxlc2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9DYWxjdWxhdGVGYWNlc0F0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9DYWxjdWxhdGVGYWNlc1dpdGhpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvQ29weS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvQ3JlYXRlRnJvbVRpbGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9DdWxsVGlsZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0ZpbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0ZpbHRlclRpbGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9GaW5kQnlJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvRmluZFRpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0ZvckVhY2hUaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9HZXRUaWxlQXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0dldFRpbGVBdFdvcmxkWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0dldFRpbGVzV2l0aGluLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9HZXRUaWxlc1dpdGhpblNoYXBlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9HZXRUaWxlc1dpdGhpbldvcmxkWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL0hhc1RpbGVBdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvSGFzVGlsZUF0V29ybGRYWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvSXNJbkxheWVyQm91bmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9QdXRUaWxlQXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1B1dFRpbGVBdFdvcmxkWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1B1dFRpbGVzQXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1JhbmRvbWl6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvUmVtb3ZlVGlsZUF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9SZW1vdmVUaWxlQXRXb3JsZFhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9SZW5kZXJEZWJ1Zy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvUmVwbGFjZUJ5SW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1NldENvbGxpc2lvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvU2V0Q29sbGlzaW9uQmV0d2Vlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvU2V0Q29sbGlzaW9uQnlFeGNsdXNpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1NldENvbGxpc2lvbkJ5UHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1NldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvU2V0TGF5ZXJDb2xsaXNpb25JbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvU2V0VGlsZUNvbGxpc2lvbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvU2V0VGlsZUluZGV4Q2FsbGJhY2suanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1NldFRpbGVMb2NhdGlvbkNhbGxiYWNrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9TaHVmZmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9Td2FwQnlJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvVGlsZVRvV29ybGRYLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9UaWxlVG9Xb3JsZFhZLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9UaWxlVG9Xb3JsZFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1dlaWdodGVkUmFuZG9taXplLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvY29tcG9uZW50cy9Xb3JsZFRvVGlsZVguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1dvcmxkVG9UaWxlWFkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9jb21wb25lbnRzL1dvcmxkVG9UaWxlWS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2NvbXBvbmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9keW5hbWljbGF5ZXIvRHluYW1pY1RpbGVtYXBMYXllci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2R5bmFtaWNsYXllci9EeW5hbWljVGlsZW1hcExheWVyQ2FudmFzUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9keW5hbWljbGF5ZXIvRHluYW1pY1RpbGVtYXBMYXllclJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2R5bmFtaWNsYXllci9EeW5hbWljVGlsZW1hcExheWVyV2ViR0xSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvbWFwZGF0YS9MYXllckRhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9tYXBkYXRhL01hcERhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9tYXBkYXRhL09iamVjdExheWVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy9QYXJzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvUGFyc2UyREFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy9QYXJzZUNTVi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvaW1wYWN0L1BhcnNlVGlsZUxheWVycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvaW1wYWN0L1BhcnNlVGlsZXNldHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9wYXJzZXJzL2ltcGFjdC9QYXJzZVdlbHRtZWlzdGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy9pbXBhY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9wYXJzZXJzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy90aWxlZC9Bc3NpZ25UaWxlUHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvQmFzZTY0RGVjb2RlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy90aWxlZC9CdWlsZFRpbGVzZXRJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvQ3JlYXRlR3JvdXBMYXllci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvUGFyc2VHSUQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9wYXJzZXJzL3RpbGVkL1BhcnNlSW1hZ2VMYXllcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9wYXJzZXJzL3RpbGVkL1BhcnNlSlNPTlRpbGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGlsZW1hcHMvcGFyc2Vycy90aWxlZC9QYXJzZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvUGFyc2VPYmplY3RMYXllcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9wYXJzZXJzL3RpbGVkL1BhcnNlVGlsZUxheWVycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvUGFyc2VUaWxlc2V0cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3BhcnNlcnMvdGlsZWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9zdGF0aWNsYXllci9TdGF0aWNUaWxlbWFwTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aWxlbWFwcy9zdGF0aWNsYXllci9TdGF0aWNUaWxlbWFwTGF5ZXJDYW52YXNSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3N0YXRpY2xheWVyL1N0YXRpY1RpbGVtYXBMYXllclJlbmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3RpbGVtYXBzL3N0YXRpY2xheWVyL1N0YXRpY1RpbGVtYXBMYXllcldlYkdMUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90aW1lL0Nsb2NrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGltZS9UaW1lckV2ZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdGltZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9UaW1lbGluZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9Ud2Vlbk1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvR2V0Qm9vbGVhbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9idWlsZGVycy9HZXRFYXNlRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvR2V0TmV3VmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvR2V0UHJvcHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvR2V0VGFyZ2V0cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9idWlsZGVycy9HZXRUd2VlbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvR2V0VmFsdWVPcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9idWlsZGVycy9OdW1iZXJUd2VlbkJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvU3RhZ2dlckJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvYnVpbGRlcnMvVGltZWxpbmVCdWlsZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdHdlZW5zL2J1aWxkZXJzL1R3ZWVuQnVpbGRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9idWlsZGVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9ldmVudHMvVElNRUxJTkVfQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RJTUVMSU5FX0xPT1BfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RJTUVMSU5FX1BBVVNFX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdHdlZW5zL2V2ZW50cy9USU1FTElORV9SRVNVTUVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RJTUVMSU5FX1NUQVJUX0VWRU5ULmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdHdlZW5zL2V2ZW50cy9USU1FTElORV9VUERBVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RXRUVOX0FDVElWRV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9ldmVudHMvVFdFRU5fQ09NUExFVEVfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RXRUVOX0xPT1BfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RXRUVOX1JFUEVBVF9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9ldmVudHMvVFdFRU5fU1RBUlRfRVZFTlQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvZXZlbnRzL1RXRUVOX1VQREFURV9FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9ldmVudHMvVFdFRU5fWU9ZT19FVkVOVC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy9ldmVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvdHdlZW4vRGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvdHdlZW4vUmVzZXJ2ZWRQcm9wcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy90d2Vlbi9Ud2Vlbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3R3ZWVucy90d2Vlbi9Ud2VlbkRhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy90d2VlbnMvdHdlZW4vY29uc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9DbGFzcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL05PT1AuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9BZGQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9BZGRBdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L0JyaW5nVG9Ub3AuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9Db3VudEFsbE1hdGNoaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvRWFjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L0VhY2hJblJhbmdlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvRmluZENsb3Nlc3RJblNvcnRlZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L0dldEFsbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L0dldEZpcnN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvR2V0UmFuZG9tLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvTW92ZURvd24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9Nb3ZlVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9Nb3ZlVXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9OdW1iZXJBcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L051bWJlckFycmF5U3RlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1F1aWNrU2VsZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9SZW1vdmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9SZW1vdmVBdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1JlbW92ZUJldHdlZW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9SZW1vdmVSYW5kb21FbGVtZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvUmVwbGFjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1JvdGF0ZUxlZnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9Sb3RhdGVSaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1NhZmVSYW5nZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1NlbmRUb0JhY2suanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9TZXRBbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9TaHVmZmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvU3BsaWNlT25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvU3RhYmxlU29ydC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L1N3YXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9DaGVja01hdHJpeC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9NYXRyaXhUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9SZXZlcnNlQ29sdW1ucy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9SZXZlcnNlUm93cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9Sb3RhdGUxODAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9tYXRyaXgvUm90YXRlTGVmdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2FycmF5L21hdHJpeC9Sb3RhdGVNYXRyaXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9tYXRyaXgvUm90YXRlUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9hcnJheS9tYXRyaXgvVHJhbnNwb3NlTWF0cml4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYXJyYXkvbWF0cml4L2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvYmFzZTY0L0FycmF5QnVmZmVyVG9CYXNlNjQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9iYXNlNjQvQmFzZTY0VG9BcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2Jhc2U2NC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L0Nsb25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L0V4dGVuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL29iamVjdC9HZXRNaW5NYXhWYWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL29iamVjdC9HZXRWYWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL29iamVjdC9IYXNBbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9vYmplY3QvSGFzQW55LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L0hhc1ZhbHVlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9vYmplY3QvTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9vYmplY3QvTWVyZ2VSaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL29iamVjdC9QaWNrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L1NldFZhbHVlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvb2JqZWN0L2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvc3RyaW5nL0Zvcm1hdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL3N0cmluZy9QYWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvcGhhc2VyL3NyYy91dGlscy9zdHJpbmcvUmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9waGFzZXIvc3JjL3V0aWxzL3N0cmluZy9VVUlELmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvc3RyaW5nL1VwcGVyY2FzZUZpcnN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BoYXNlci9zcmMvdXRpbHMvc3RyaW5nL2luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyL3dlYnBhY2svcnVudGltZS9oYXJtb255IG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTbGljZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZXEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRSYXdUYWcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0luZGV4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvTnVtYmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jaHVuay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY29tcGFjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UHVzaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RvU291cmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19uYXRpdmVDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoRGVsZXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaEdldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNoU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fSGFzaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXNzb2NJbmRleE9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlR2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fTGlzdENhY2hlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fTWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlR2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX01hcENhY2hlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2V0Q2FjaGVBZGQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1NldENhY2hlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc05hTi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0cmljdEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5SW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUluY2x1ZGVzV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuYXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcHBseS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX292ZXJSZXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNldFRvU3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0FycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja0RlbGV0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrR2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja1NldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N0YWNrLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlTb21lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZXF1YWxBcnJheXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19VaW50OEFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUdldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUZpbHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3R1YkFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUaW1lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TGlrZUtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19uYXRpdmVLZXlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZXF1YWxPYmplY3RzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19Qcm9taXNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFRhZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0VxdWFsRGVlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0VxdWFsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzTWF0Y2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRNYXRjaERhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNYXRjaGVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21lbW9pemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdG9LZXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9nZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19oYXNQYXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXNJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHlEZWVwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbGFzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGlmZmVyZW5jZUJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kaWZmZXJlbmNlV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZHJvcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZHJvcFJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVdoaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kcm9wUmlnaHRXaGlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZHJvcFdoaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNsYW1wLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0xlbmd0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9maWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbmRMYXN0SW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2hlYWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZsYXR0ZW5EZWVwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mbGF0dGVuRGVwdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2Zyb21QYWlycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW5pdGlhbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYXN0QXJyYXlMaWtlT2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ludGVyc2VjdGlvbkJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pbnRlcnNlY3Rpb25XaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9qb2luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc3RyaWN0TGFzdEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2xhc3RJbmRleE9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU50aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbnRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUluZGV4T2ZXaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVB1bGxBbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3B1bGxBbGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3B1bGwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3B1bGxBbGxCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcHVsbEFsbFdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlQXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19wYXJlbnQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVW5zZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHVsbEF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29tcGFyZUFzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wdWxsQXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JlbW92ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU29ydGVkSW5kZXhCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTb3J0ZWRJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc29ydGVkSW5kZXguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZEluZGV4QnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZExhc3RJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc29ydGVkTGFzdEluZGV4QnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZExhc3RJbmRleE9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNvcnRlZFVuaXEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZFVuaXEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvcnRlZFVuaXFCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGFpbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGFrZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGFrZVJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90YWtlUmlnaHRXaGlsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGFrZVdoaWxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ub29wLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVVuaXEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91bmlvbkJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91bmlvbldpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXFCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdW5pcVdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuemlwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91bnppcFdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3dpdGhvdXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlWG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy94b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3hvckJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy94b3JXaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy96aXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VaaXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3ppcE9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3ppcE9iamVjdERlZXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3ppcFdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2FycmF5LmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUFnZ3JlZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGb3JPd24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVCYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VFYWNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUFnZ3JlZ2F0b3IuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVBZ2dyZWdhdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb3VudEJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlFYWNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdEZ1bmN0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mb3JFYWNoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlFYWNoUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yT3duUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRWFjaFJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mb3JFYWNoUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ldmVyeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUZpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbmRMYXN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mbGF0TWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mbGF0TWFwRGVlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmxhdE1hcERlcHRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ncm91cEJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSW52b2tlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pbnZva2VNYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleUJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNvcnRCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvbXBhcmVNdWx0aXBsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VPcmRlckJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vcmRlckJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wYXJ0aXRpb24uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UmVkdWNlUmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JlZHVjZVJpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9uZWdhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JlamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSYW5kb20uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVNhbXBsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTYW1wbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NhbXBsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NodWZmbGVTZWxmLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlTYW1wbGVTaXplLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNhbXBsZVNpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NhbXBsZVNpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVNodWZmbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2h1ZmZsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc2h1ZmZsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FzY2lpU2l6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc1VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL191bmljb2RlU2l6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0cmluZ1NpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NpemUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU29tZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc29tZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc29ydEJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb2xsZWN0aW9uLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL25vdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGF0ZS5kZWZhdWx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hZnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21ldGFNYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU2V0RGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVDdG9yLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlQmluZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvbXBvc2VBcmdzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29tcG9zZUFyZ3NSaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvdW50SG9sZGVycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VMb2Rhc2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19MYXp5V3JhcHBlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldERhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yZWFsTmFtZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRGdW5jTmFtZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xvZGFzaFdyYXBwZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL193cmFwcGVyQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3dyYXBwZXJMb2Rhc2guanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0xhemlhYmxlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2V0RGF0YS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFdyYXBEZXRhaWxzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faW5zZXJ0V3JhcERldGFpbHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL191cGRhdGVXcmFwRGV0YWlscy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFdyYXBUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVJlY3VycnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRIb2xkZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yZW9yZGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fcmVwbGFjZUhvbGRlcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVIeWJyaWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVDdXJyeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVBhcnRpYWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tZXJnZURhdGEuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVXcmFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hcnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2JlZm9yZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvYmluZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvYmluZEtleS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY3VycnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2N1cnJ5UmlnaHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2RlYm91bmNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZURlbGF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kZWZlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGVsYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZsaXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL29uY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYXN0UmVzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvb3ZlckFyZ3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3BhcnRpYWwuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3BhcnRpYWxSaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmVhcmcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3Jlc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYXN0U2xpY2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NwcmVhZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGhyb3R0bGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuYXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy93cmFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mdW5jdGlvbi5kZWZhdWx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jYXN0QXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jb3B5T2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUFzc2lnbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleXNJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VBc3NpZ25Jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlTeW1ib2xzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0UHJvdG90eXBlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0U3ltYm9sc0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29weVN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldEFsbEtleXNJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2luaXRDbG9uZUFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Nsb25lU3ltYm9sLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faW5pdENsb25lQnlUYWcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pbml0Q2xvbmVPYmplY3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNNYXAuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTWFwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1NldC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VDbG9uZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2Nsb25lRGVlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2xvbmVEZWVwV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2xvbmVXaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNvbmZvcm1zVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NvbmZvcm1zVG8uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ndC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZ3RlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQm9vbGVhbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc0RhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzRGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNFbGVtZW50LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0VtcHR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0VxdWFsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0VxdWFsV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNFcnJvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzSW50ZWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNNYXRjaC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNNYXRjaFdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTnVtYmVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc05hTi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzTWFza2FibGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTmF0aXZlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc05pbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNOdWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzUmVnRXhwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1JlZ0V4cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNTYWZlSW50ZWdlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNVbmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNXZWFrU2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9sdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbHRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXRlcmF0b3JUb0FycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXNjaWlUb0FycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdW5pY29kZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb0FycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0FycmF5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b1NhZmVJbnRlZ2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9sYW5nLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVG9OdW1iZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVNYXRoT3BlcmF0aW9uLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hZGQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVSb3VuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2VpbC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGl2aWRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mbG9vci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VFeHRyZW11bS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTdW0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlTWVhbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3VtQnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21hdGguZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWF4LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tYXhCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWVhbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWVhbkJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9taW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21pbkJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tdWx0aXBseS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcm91bmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N1YnRyYWN0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdW0uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NsYW1wLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUluUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2luUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JhbmRvbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbnVtYmVyLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVBc3NpZ25lci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvYXNzaWduLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hc3NpZ25Jbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvYXNzaWduSW5XaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hc3NpZ25XaXRoLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9hdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY3JlYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zYWZlR2V0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNZXJnZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2N1c3RvbURlZmF1bHRzTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21lcmdlV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGVmYXVsdHNEZWVwLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVRvUGFpcnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRUb1BhaXJzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlVG9QYWlycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9QYWlycy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9QYWlyc0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUZpbmRLZXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbmRLZXkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ZpbmRMYXN0S2V5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mb3JJbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZm9ySW5SaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZm9yT3duLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mb3JPd25SaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGdW5jdGlvbnMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2Z1bmN0aW9ucy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZnVuY3Rpb25zSW4uanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSGFzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSW52ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVJbnZlcnRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW52ZXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pbnZlcnRCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW52b2tlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tYXBLZXlzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tYXBWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21lcmdlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3VzdG9tT21pdENsb25lLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vbWl0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVBpY2tCeS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGlja0J5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vbWl0QnkuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGljay5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VVcGRhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3ZhbHVlc0luLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vYmplY3QuZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmVzdWx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NldFdpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdW5zZXQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VwZGF0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdXBkYXRlV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGhydS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvd3JhcHBlckF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jaGFpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VXcmFwcGVyVmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3dyYXBwZXJWYWx1ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvd3JhcHBlckNoYWluLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zZXEuZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY29tbWl0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9uZXh0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wbGFudC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvd3JhcHBlclJldmVyc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RhcC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9JdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZUNhc2VGaXJzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdXBwZXJGaXJzdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2FwaXRhbGl6ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VQcm9wZXJ0eU9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZGVidXJyTGV0dGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc2NpaVdvcmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzVW5pY29kZVdvcmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3dvcmRzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlQ29tcG91bmRlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvY2FtZWxDYXNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9lbmRzV2l0aC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2VzY2FwZUh0bWxDaGFyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2VzY2FwZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMva2ViYWJDYXNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9sb3dlckNhc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2xvd2VyRmlyc3QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUmVwZWF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlUGFkZGluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGFkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wYWRFbmQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3BhZFN0YXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wYXJzZUludC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmVwZWF0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9yZXBsYWNlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zbmFrZUNhc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NwbGl0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdGFydENhc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0YXJ0c1dpdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2F0dGVtcHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jdXN0b21EZWZhdWx0c0Fzc2lnbkluLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZXNjYXBlU3RyaW5nQ2hhci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3JlSW50ZXJwb2xhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RlbXBsYXRlU2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19yZUVzY2FwZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3JlRXZhbHVhdGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RlbXBsYXRlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b0xvd2VyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b1VwcGVyLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2hhcnNFbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NoYXJzU3RhcnRJbmRleC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdHJpbS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdHJpbUVuZC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdHJpbVN0YXJ0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90cnVuY2F0ZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3VuZXNjYXBlSHRtbENoYXIuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuZXNjYXBlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91cHBlckNhc2UuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0cmluZy5kZWZhdWx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9iaW5kQWxsLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb25kLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUNvbmZvcm1zLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb25mb3Jtcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZGVmYXVsdFRvLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlRmxvdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmxvdy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmxvd1JpZ2h0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWF0Y2hlcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWF0Y2hlc1Byb3BlcnR5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tZXRob2QuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21ldGhvZE9mLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9taXhpbi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbnRoQXJnLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlT3Zlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvb3Zlci5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvb3ZlckV2ZXJ5LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9vdmVyU29tZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcHJvcGVydHlPZi5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VSYW5nZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVJhbmdlLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9yYW5nZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmFuZ2VSaWdodC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3R1Yk9iamVjdC5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3R1YlN0cmluZy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3R1YlRydWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RpbWVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90b1BhdGguanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXF1ZUlkLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy91dGlsLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19sYXp5Q2xvbmUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19sYXp5UmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFZpZXcuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19sYXp5VmFsdWUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2xvZGFzaC5kZWZhdWx0LmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3RocmVlL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9wb2x5ZmlsbC9saWIvcG9seWZpbGwuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvaXNtb2JpbGVqcy9lc20vaXNNb2JpbGUuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvc2V0dGluZ3MvbGliL3NldHRpbmdzLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvZXh0ZXJuYWwgXCJ1cmxcIiIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9jb25zdGFudHMvbGliL2NvbnN0YW50cy5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS91dGlscy9saWIvdXRpbHMuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvbWF0aC9saWIvbWF0aC5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9kaXNwbGF5L2xpYi9kaXNwbGF5LmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL2FjY2Vzc2liaWxpdHkvbGliL2FjY2Vzc2liaWxpdHkuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvdGlja2VyL2xpYi90aWNrZXIuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvaW50ZXJhY3Rpb24vbGliL2ludGVyYWN0aW9uLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL3J1bm5lci9saWIvcnVubmVyLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL2NvcmUvbGliL2NvcmUuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvYXBwL2xpYi9hcHAuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvZXh0cmFjdC9saWIvZXh0cmFjdC5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9yZXNvdXJjZS1sb2FkZXIvZGlzdC9yZXNvdXJjZS1sb2FkZXIuZXNtLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL2xvYWRlcnMvbGliL2xvYWRlcnMuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvcGFydGljbGVzL2xpYi9wYXJ0aWNsZXMuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvZ3JhcGhpY3MvbGliL2dyYXBoaWNzLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL3Nwcml0ZS9saWIvc3ByaXRlLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL3RleHQvbGliL3RleHQuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvcHJlcGFyZS9saWIvcHJlcGFyZS5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9zcHJpdGVzaGVldC9saWIvc3ByaXRlc2hlZXQuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvc3ByaXRlLXRpbGluZy9saWIvc3ByaXRlLXRpbGluZy5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS90ZXh0LWJpdG1hcC9saWIvdGV4dC1iaXRtYXAuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvZmlsdGVyLWJsdXIvbGliL2ZpbHRlci1ibHVyLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL0BwaXhpL2ZpbHRlci1jb2xvci1tYXRyaXgvbGliL2ZpbHRlci1jb2xvci1tYXRyaXguZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvZmlsdGVyLWRpc3BsYWNlbWVudC9saWIvZmlsdGVyLWRpc3BsYWNlbWVudC5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9taXhpbi1jYWNoZS1hcy1iaXRtYXAvbGliL21peGluLWNhY2hlLWFzLWJpdG1hcC5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9taXhpbi1nZXQtY2hpbGQtYnktbmFtZS9saWIvbWl4aW4tZ2V0LWNoaWxkLWJ5LW5hbWUuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9ub2RlX21vZHVsZXMvQHBpeGkvbWl4aW4tZ2V0LWdsb2JhbC1wb3NpdGlvbi9saWIvbWl4aW4tZ2V0LWdsb2JhbC1wb3NpdGlvbi5lcy5qcyIsIndlYnBhY2s6Ly9zb3VyY2UtbWFwLWV4cGxvcmVyLy4vdGVzdHMvZ2VuZXJhdGUtZGF0YS9zcmMvYmlnL25vZGVfbW9kdWxlcy9AcGl4aS9tZXNoL2xpYi9tZXNoLmVzLmpzIiwid2VicGFjazovL3NvdXJjZS1tYXAtZXhwbG9yZXIvLi90ZXN0cy9nZW5lcmF0ZS1kYXRhL3NyYy9iaWcvbm9kZV9tb2R1bGVzL3BpeGkuanMvbGliL3BpeGkuZXMuanMiLCJ3ZWJwYWNrOi8vc291cmNlLW1hcC1leHBsb3Jlci8uL3Rlc3RzL2dlbmVyYXRlLWRhdGEvc3JjL2JpZy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIml0IiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiaXNPYmplY3QiLCJ3ZWxsS25vd25TeW1ib2wiLCJjcmVhdGUiLCJkZWZpbmVQcm9wZXJ0eU1vZHVsZSIsIlVOU0NPUEFCTEVTIiwiQXJyYXlQcm90b3R5cGUiLCJBcnJheSIsInByb3RvdHlwZSIsInVuZGVmaW5lZCIsImYiLCJjb25maWd1cmFibGUiLCJ2YWx1ZSIsImtleSIsImNoYXJBdCIsIlMiLCJpbmRleCIsInVuaWNvZGUiLCJsZW5ndGgiLCJDb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheUJ1ZmZlciIsIkRhdGFWaWV3IiwiTkFNRSIsIk5BVElWRV9BUlJBWV9CVUZGRVIiLCJERVNDUklQVE9SUyIsImdsb2JhbCIsImhhcyIsImNsYXNzb2YiLCJjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkiLCJyZWRlZmluZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsInVpZCIsIkludDhBcnJheSIsIkludDhBcnJheVByb3RvdHlwZSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUiLCJUeXBlZEFycmF5IiwiVHlwZWRBcnJheVByb3RvdHlwZSIsIk9iamVjdFByb3RvdHlwZSIsIk9iamVjdCIsImlzUHJvdG90eXBlT2YiLCJUT19TVFJJTkdfVEFHIiwiVFlQRURfQVJSQVlfVEFHIiwiTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyIsIm9wZXJhIiwiVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQiLCJUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCIsIlVpbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJpc1R5cGVkQXJyYXkiLCJGdW5jdGlvbiIsImdldCIsInRoaXMiLCJhVHlwZWRBcnJheSIsImFUeXBlZEFycmF5Q29uc3RydWN0b3IiLCJDIiwiY2FsbCIsIkFSUkFZIiwiVHlwZWRBcnJheUNvbnN0cnVjdG9yIiwiZXhwb3J0VHlwZWRBcnJheU1ldGhvZCIsIktFWSIsInByb3BlcnR5IiwiZm9yY2VkIiwiZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCIsImVycm9yIiwiaXNWaWV3Iiwia2xhc3MiLCJyZWRlZmluZUFsbCIsImZhaWxzIiwiYW5JbnN0YW5jZSIsInRvSW50ZWdlciIsInRvTGVuZ3RoIiwidG9JbmRleCIsIklFRUU3NTQiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiYXJyYXlGaWxsIiwic2V0VG9TdHJpbmdUYWciLCJJbnRlcm5hbFN0YXRlTW9kdWxlIiwiZ2V0SW50ZXJuYWxTdGF0ZSIsInNldEludGVybmFsU3RhdGUiLCJzZXQiLCJBUlJBWV9CVUZGRVIiLCJEQVRBX1ZJRVciLCJXUk9OR19JTkRFWCIsIk5hdGl2ZUFycmF5QnVmZmVyIiwiJEFycmF5QnVmZmVyIiwiJERhdGFWaWV3IiwiJERhdGFWaWV3UHJvdG90eXBlIiwiUmFuZ2VFcnJvciIsInBhY2tJRUVFNzU0IiwicGFjayIsInVucGFja0lFRUU3NTQiLCJ1bnBhY2siLCJwYWNrSW50OCIsIm51bWJlciIsInBhY2tJbnQxNiIsInBhY2tJbnQzMiIsInVucGFja0ludDMyIiwiYnVmZmVyIiwicGFja0Zsb2F0MzIiLCJwYWNrRmxvYXQ2NCIsImFkZEdldHRlciIsInZpZXciLCJjb3VudCIsImlzTGl0dGxlRW5kaWFuIiwiaW50SW5kZXgiLCJzdG9yZSIsImJ5dGVMZW5ndGgiLCJieXRlcyIsInN0YXJ0IiwiYnl0ZU9mZnNldCIsInNsaWNlIiwicmV2ZXJzZSIsImNvbnZlcnNpb24iLCJpIiwiTmFOIiwiQXJyYXlCdWZmZXJQcm90b3R5cGUiLCJrZXlzIiwiaiIsImNvbnN0cnVjdG9yIiwidGVzdFZpZXciLCJuYXRpdmVTZXRJbnQ4Iiwic2V0SW50OCIsImdldEludDgiLCJzZXRVaW50OCIsInVuc2FmZSIsImJ1ZmZlckxlbmd0aCIsIm9mZnNldCIsImdldFVpbnQ4IiwiZ2V0SW50MTYiLCJhcmd1bWVudHMiLCJnZXRVaW50MTYiLCJnZXRJbnQzMiIsImdldFVpbnQzMiIsImdldEZsb2F0MzIiLCJnZXRGbG9hdDY0Iiwic2V0SW50MTYiLCJzZXRVaW50MTYiLCJzZXRJbnQzMiIsInNldFVpbnQzMiIsInNldEZsb2F0MzIiLCJzZXRGbG9hdDY0IiwidG9PYmplY3QiLCJ0b0Fic29sdXRlSW5kZXgiLCJtaW4iLCJNYXRoIiwiY29weVdpdGhpbiIsInRhcmdldCIsIk8iLCJsZW4iLCJ0byIsImZyb20iLCJlbmQiLCJpbmMiLCJhcmd1bWVudHNMZW5ndGgiLCJlbmRQb3MiLCIkZm9yRWFjaCIsImFycmF5TWV0aG9kSXNTdHJpY3QiLCJhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCIsIlNUUklDVF9NRVRIT0QiLCJVU0VTX1RPX0xFTkdUSCIsImZvckVhY2giLCJjYWxsYmFja2ZuIiwiYmluZCIsImNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmciLCJpc0FycmF5SXRlcmF0b3JNZXRob2QiLCJjcmVhdGVQcm9wZXJ0eSIsImdldEl0ZXJhdG9yTWV0aG9kIiwiYXJyYXlMaWtlIiwicmVzdWx0Iiwic3RlcCIsIml0ZXJhdG9yIiwibmV4dCIsIm1hcGZuIiwibWFwcGluZyIsIml0ZXJhdG9yTWV0aG9kIiwiZG9uZSIsInRvSW5kZXhlZE9iamVjdCIsImNyZWF0ZU1ldGhvZCIsIklTX0lOQ0xVREVTIiwiJHRoaXMiLCJlbCIsImZyb21JbmRleCIsImluY2x1ZGVzIiwiaW5kZXhPZiIsIkluZGV4ZWRPYmplY3QiLCJhcnJheVNwZWNpZXNDcmVhdGUiLCJwdXNoIiwiVFlQRSIsIklTX01BUCIsIklTX0ZJTFRFUiIsIklTX1NPTUUiLCJJU19FVkVSWSIsIklTX0ZJTkRfSU5ERVgiLCJOT19IT0xFUyIsInRoYXQiLCJzcGVjaWZpY0NyZWF0ZSIsInNlbGYiLCJib3VuZEZ1bmN0aW9uIiwibWFwIiwiZmlsdGVyIiwic29tZSIsImV2ZXJ5IiwiZmluZCIsImZpbmRJbmRleCIsIm5hdGl2ZUxhc3RJbmRleE9mIiwibGFzdEluZGV4T2YiLCJORUdBVElWRV9aRVJPIiwiQUNDRVNTT1JTIiwiMSIsIkZPUkNFRCIsInNlYXJjaEVsZW1lbnQiLCJhcHBseSIsIlY4X1ZFUlNJT04iLCJTUEVDSUVTIiwiTUVUSE9EX05BTUUiLCJhcnJheSIsImZvbyIsIkJvb2xlYW4iLCJhcmd1bWVudCIsIm1ldGhvZCIsImNhY2hlIiwidGhyb3dlciIsIm9wdGlvbnMiLCJhcmd1bWVudDAiLCJhcmd1bWVudDEiLCJlbnVtZXJhYmxlIiwiYUZ1bmN0aW9uIiwiSVNfUklHSFQiLCJtZW1vIiwibGVmdCIsInJpZ2h0IiwiaXNBcnJheSIsIm9yaWdpbmFsQXJyYXkiLCJhbk9iamVjdCIsIlByb21pc2UiLCJnZXRCdWlsdEluIiwiJHJldHVybiIsIiQkcmV0dXJuIiwicmVzb2x2ZSIsIiR0aHJvdyIsIiQkdGhyb3ciLCJyZWplY3QiLCJuZXh0SGFuZGxlciIsIklTX0lURVJBVE9SIiwiQXN5bmNJdGVyYXRvclByb3h5Iiwic3RhdGUiLCJBc3luY0l0ZXJhdG9yIiwiYXJnIiwiSVNfVE9fQVJSQVkiLCJJU19GT1JfRUFDSCIsImZuIiwibG9vcCIsInRoZW4iLCJlcnIiLCJ0b0FycmF5IiwiQXN5bmNJdGVyYXRvclByb3RvdHlwZSIsInNoYXJlZCIsIklTX1BVUkUiLCJBU1lOQ19JVEVSQVRPUiIsIlBhc3NlZEFzeW5jSXRlcmF0b3JQcm90b3R5cGUiLCJFTlRSSUVTIiwicmV0dXJuTWV0aG9kIiwiSVRFUkFUT1IiLCJTQUZFX0NMT1NJTkciLCJjYWxsZWQiLCJpdGVyYXRvcldpdGhSZXR1cm4iLCJleGVjIiwiU0tJUF9DTE9TSU5HIiwiSVRFUkFUSU9OX1NVUFBPUlQiLCJvYmplY3QiLCJ0b1N0cmluZyIsIlRPX1NUUklOR19UQUdfU1VQUE9SVCIsImNsYXNzb2ZSYXciLCJDT1JSRUNUX0FSR1VNRU5UUyIsInRhZyIsInRyeUdldCIsImNhbGxlZSIsImFkZGVyIiwiYWRkIiwiayIsIndhc0RlbGV0ZWQiLCJjb2xsZWN0aW9uIiwicmVtb3ZlciIsImFsbERlbGV0ZWQiLCJpdGVyYXRlIiwic291cmNlIiwiQSIsIm4iLCJtYXBGbiIsIm5leHRJdGVtIiwiZGVmaW5lSXRlcmF0b3IiLCJzZXRTcGVjaWVzIiwiZmFzdEtleSIsImludGVybmFsU3RhdGVHZXR0ZXJGb3IiLCJnZXR0ZXJGb3IiLCJnZXRDb25zdHJ1Y3RvciIsIndyYXBwZXIiLCJDT05TVFJVQ1RPUl9OQU1FIiwiQURERVIiLCJpdGVyYWJsZSIsInR5cGUiLCJmaXJzdCIsImxhc3QiLCJzaXplIiwiZGVmaW5lIiwicHJldmlvdXMiLCJlbnRyeSIsImdldEVudHJ5IiwicmVtb3ZlZCIsImNsZWFyIiwiZGF0YSIsInByZXYiLCJzZXRTdHJvbmciLCJJVEVSQVRPUl9OQU1FIiwiZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUiLCJnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUiLCJpdGVyYXRlZCIsImtpbmQiLCJnZXRXZWFrRGF0YSIsIkFycmF5SXRlcmF0aW9uTW9kdWxlIiwiJGhhcyIsImlkIiwidW5jYXVnaHRGcm96ZW5TdG9yZSIsImZyb3plbiIsIlVuY2F1Z2h0RnJvemVuU3RvcmUiLCJlbnRyaWVzIiwiZmluZFVuY2F1Z2h0RnJvemVuIiwic3BsaWNlIiwiJCIsImlzRm9yY2VkIiwiSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSIsImNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiIsImluaGVyaXRJZlJlcXVpcmVkIiwiY29tbW9uIiwiSVNfV0VBSyIsIk5hdGl2ZUNvbnN0cnVjdG9yIiwiTmF0aXZlUHJvdG90eXBlIiwiZXhwb3J0ZWQiLCJmaXhNZXRob2QiLCJuYXRpdmVNZXRob2QiLCJSRVFVSVJFRCIsImluc3RhbmNlIiwiSEFTTlRfQ0hBSU5JTkciLCJUSFJPV1NfT05fUFJJTUlUSVZFUyIsIkFDQ0VQVF9JVEVSQUJMRVMiLCJCVUdHWV9aRVJPIiwiJGluc3RhbmNlIiwiZHVtbXkiLCJNYXAiLCJXZWFrTWFwIiwiTm9kZSIsInN5bWJvbCIsInByaW1pdGl2ZXMiLCJvYmplY3RzQnlJbmRleCIsImluaXRpYWxpemVyIiwiSVNfT0JKRUNUIiwicm9vdCIsImFjdGl2ZSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJNQVRDSCIsInJlZ2V4cCIsImUiLCJGIiwicmVxdWlyZU9iamVjdENvZXJjaWJsZSIsInF1b3QiLCJzdHJpbmciLCJhdHRyaWJ1dGUiLCJwMSIsInJlcGxhY2UiLCJJdGVyYXRvclByb3RvdHlwZSIsImNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciIsIkl0ZXJhdG9ycyIsInJldHVyblRoaXMiLCJJdGVyYXRvckNvbnN0cnVjdG9yIiwiYml0bWFwIiwid3JpdGFibGUiLCJ0b1ByaW1pdGl2ZSIsInByb3BlcnR5S2V5IiwicGFkU3RhcnQiLCJhYnMiLCJEYXRlUHJvdG90eXBlIiwiRGF0ZSIsImdldFRpbWUiLCJuYXRpdmVEYXRlVG9JU09TdHJpbmciLCJ0b0lTT1N0cmluZyIsImlzRmluaXRlIiwiZGF0ZSIsInllYXIiLCJnZXRVVENGdWxsWWVhciIsIm1pbGxpc2Vjb25kcyIsImdldFVUQ01pbGxpc2Vjb25kcyIsInNpZ24iLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiaGludCIsImNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IiLCJJdGVyYXRvcnNDb3JlIiwiQlVHR1lfU0FGQVJJX0lURVJBVE9SUyIsIktFWVMiLCJWQUxVRVMiLCJJdGVyYWJsZSIsIkRFRkFVTFQiLCJJU19TRVQiLCJDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUiLCJtZXRob2RzIiwiZ2V0SXRlcmF0aW9uTWV0aG9kIiwiS0lORCIsImRlZmF1bHRJdGVyYXRvciIsIkl0ZXJhYmxlUHJvdG90eXBlIiwiSU5DT1JSRUNUX1ZBTFVFU19OQU1FIiwibmF0aXZlSXRlcmF0b3IiLCJhbnlOYXRpdmVJdGVyYXRvciIsInZhbHVlcyIsInByb3RvIiwid3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSIsIlN5bWJvbCIsImRvY3VtZW50IiwiRVhJU1RTIiwiY3JlYXRlRWxlbWVudCIsIkNTU1J1bGVMaXN0IiwiQ1NTU3R5bGVEZWNsYXJhdGlvbiIsIkNTU1ZhbHVlTGlzdCIsIkNsaWVudFJlY3RMaXN0IiwiRE9NUmVjdExpc3QiLCJET01TdHJpbmdMaXN0IiwiRE9NVG9rZW5MaXN0IiwiRGF0YVRyYW5zZmVySXRlbUxpc3QiLCJGaWxlTGlzdCIsIkhUTUxBbGxDb2xsZWN0aW9uIiwiSFRNTENvbGxlY3Rpb24iLCJIVE1MRm9ybUVsZW1lbnQiLCJIVE1MU2VsZWN0RWxlbWVudCIsIk1lZGlhTGlzdCIsIk1pbWVUeXBlQXJyYXkiLCJOYW1lZE5vZGVNYXAiLCJOb2RlTGlzdCIsIlBhaW50UmVxdWVzdExpc3QiLCJQbHVnaW4iLCJQbHVnaW5BcnJheSIsIlNWR0xlbmd0aExpc3QiLCJTVkdOdW1iZXJMaXN0IiwiU1ZHUGF0aFNlZ0xpc3QiLCJTVkdQb2ludExpc3QiLCJTVkdTdHJpbmdMaXN0IiwiU1ZHVHJhbnNmb3JtTGlzdCIsIlNvdXJjZUJ1ZmZlckxpc3QiLCJTdHlsZVNoZWV0TGlzdCIsIlRleHRUcmFja0N1ZUxpc3QiLCJUZXh0VHJhY2tMaXN0IiwiVG91Y2hMaXN0IiwidXNlckFnZW50IiwidGVzdCIsIm1hdGNoIiwidmVyc2lvbiIsInByb2Nlc3MiLCJ2ZXJzaW9ucyIsInY4Iiwic3BsaXQiLCJzZXRHbG9iYWwiLCJjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzIiwidGFyZ2V0UHJvcGVydHkiLCJzb3VyY2VQcm9wZXJ0eSIsImRlc2NyaXB0b3IiLCJUQVJHRVQiLCJHTE9CQUwiLCJTVEFUSUMiLCJzdGF0Iiwibm9UYXJnZXRHZXQiLCJzaGFtIiwicmVnZXhwRXhlYyIsIlJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTIiwicmUiLCJncm91cHMiLCJhIiwiUkVQTEFDRV9LRUVQU18kMCIsIlJFUExBQ0UiLCJSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSIsIlNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyIsIm9yaWdpbmFsRXhlYyIsIlNZTUJPTCIsIkRFTEVHQVRFU19UT19TWU1CT0wiLCJERUxFR0FURVNfVE9fRVhFQyIsImV4ZWNDYWxsZWQiLCJmbGFncyIsIm5hdGl2ZVJlZ0V4cE1ldGhvZCIsInN0ciIsImFyZzIiLCJmb3JjZVN0cmluZ01ldGhvZCIsInN0cmluZ01ldGhvZCIsInJlZ2V4TWV0aG9kIiwiUmVnRXhwIiwiZmxhdHRlbkludG9BcnJheSIsIm9yaWdpbmFsIiwic291cmNlTGVuIiwiZGVwdGgiLCJtYXBwZXIiLCJ0aGlzQXJnIiwiZWxlbWVudCIsInRhcmdldEluZGV4Iiwic291cmNlSW5kZXgiLCJpc0V4dGVuc2libGUiLCJwcmV2ZW50RXh0ZW5zaW9ucyIsImIiLCJjIiwiZmFjdG9yaWVzIiwiY29uc3RydWN0IiwiYXJnc0xlbmd0aCIsImFyZ3MiLCJsaXN0Iiwiam9pbiIsInBhcnRBcmdzIiwiY29uY2F0IiwidmFyaWFibGUiLCJuYW1lc3BhY2UiLCJnZXRJdGVyYXRvciIsIlNldCIsImNoZWNrIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsImhhc093blByb3BlcnR5IiwiY29uc29sZSIsIkluZmluaXR5IiwicG93IiwiZmxvb3IiLCJsb2ciLCJMTjIiLCJtYW50aXNzYUxlbmd0aCIsImV4cG9uZW50IiwibWFudGlzc2EiLCJleHBvbmVudExlbmd0aCIsImVNYXgiLCJlQmlhcyIsInJ0IiwibkJpdHMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIldyYXBwZXIiLCJOZXdUYXJnZXQiLCJOZXdUYXJnZXRQcm90b3R5cGUiLCJmdW5jdGlvblRvU3RyaW5nIiwiaW5zcGVjdFNvdXJjZSIsImhpZGRlbktleXMiLCJGUkVFWklORyIsIk1FVEFEQVRBIiwic2V0TWV0YWRhdGEiLCJvYmplY3RJRCIsIndlYWtEYXRhIiwibWV0YSIsIm9uRnJlZXplIiwiTkFUSVZFX1dFQUtfTUFQIiwib2JqZWN0SGFzIiwic2hhcmVkS2V5Iiwid21nZXQiLCJ3bWhhcyIsIndtc2V0IiwibWV0YWRhdGEiLCJTVEFURSIsImVuZm9yY2UiLCJyZXBsYWNlbWVudCIsImZlYXR1cmUiLCJkZXRlY3Rpb24iLCJub3JtYWxpemUiLCJQT0xZRklMTCIsIk5BVElWRSIsInRvTG93ZXJDYXNlIiwiaXNSZWdFeHAiLCJSZXN1bHQiLCJzdG9wcGVkIiwiQVNfRU5UUklFUyIsIml0ZXJGbiIsInN0b3AiLCJJdGVyYXRvclByb3h5IiwiSXRlcmF0b3IiLCJQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUiLCJhcnJheUl0ZXJhdG9yIiwidXBkYXRlRm4iLCJpbnNlcnRGbiIsIm5hdGl2ZUV4cG0xIiwiZXhwbTEiLCJleHAiLCJ4IiwiRVBTSUxPTiIsIkVQU0lMT04zMiIsIk1BWDMyIiwiTUlOMzIiLCJmcm91bmQiLCIkYWJzIiwiJHNpZ24iLCJsb2cxcCIsInNjYWxlIiwiaW5Mb3ciLCJpbkhpZ2giLCJvdXRMb3ciLCJvdXRIaWdoIiwiZmx1c2giLCJoZWFkIiwibm90aWZ5IiwidG9nZ2xlIiwibm9kZSIsInByb21pc2UiLCJtYWNyb3Rhc2siLCJJU19JT1MiLCJNdXRhdGlvbk9ic2VydmVyIiwiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIsIklTX05PREUiLCJxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IiLCJxdWV1ZU1pY3JvdGFzayIsInBhcmVudCIsImRvbWFpbiIsImV4aXQiLCJlbnRlciIsIm5leHRUaWNrIiwiY3JlYXRlVGV4dE5vZGUiLCJvYnNlcnZlIiwiY2hhcmFjdGVyRGF0YSIsInRhc2siLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJ1cmwiLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJwYXRobmFtZSIsInRvSlNPTiIsInNvcnQiLCJocmVmIiwiVVJMU2VhcmNoUGFyYW1zIiwidXNlcm5hbWUiLCJob3N0IiwiaGFzaCIsIlByb21pc2VDYXBhYmlsaXR5IiwiJCRyZXNvbHZlIiwiJCRyZWplY3QiLCJnbG9iYWxJc0Zpbml0ZSIsIk51bWJlciIsInRyaW0iLCJ3aGl0ZXNwYWNlcyIsIiRwYXJzZUZsb2F0IiwicGFyc2VGbG9hdCIsInRyaW1tZWRTdHJpbmciLCIkcGFyc2VJbnQiLCJwYXJzZUludCIsImhleCIsInJhZGl4Iiwib2JqZWN0S2V5cyIsImdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlIiwibmF0aXZlQXNzaWduIiwiYXNzaWduIiwiQiIsImFscGhhYmV0IiwiY2hyIiwiVCIsImFjdGl2ZVhEb2N1bWVudCIsImRlZmluZVByb3BlcnRpZXMiLCJlbnVtQnVnS2V5cyIsImh0bWwiLCJkb2N1bWVudENyZWF0ZUVsZW1lbnQiLCJJRV9QUk9UTyIsIkVtcHR5Q29uc3RydWN0b3IiLCJzY3JpcHRUYWciLCJjb250ZW50IiwiTFQiLCJOdWxsUHJvdG9PYmplY3QiLCJBY3RpdmVYT2JqZWN0IiwiaWZyYW1lRG9jdW1lbnQiLCJpZnJhbWUiLCJ3cml0ZSIsImNsb3NlIiwidGVtcCIsInBhcmVudFdpbmRvdyIsIk51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgiLCJzdHlsZSIsImRpc3BsYXkiLCJhcHBlbmRDaGlsZCIsInNyYyIsImNvbnRlbnRXaW5kb3ciLCJvcGVuIiwiUHJvcGVydGllcyIsIklFOF9ET01fREVGSU5FIiwibmF0aXZlRGVmaW5lUHJvcGVydHkiLCJQIiwiQXR0cmlidXRlcyIsIm5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMiLCJ3aW5kb3dOYW1lcyIsImdldFdpbmRvd05hbWVzIiwiaW50ZXJuYWxPYmplY3RLZXlzIiwiQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSIiwiT0JKRUNUX0lURVJBVE9SIiwibW9kZSIsIm5hbWVzIiwibmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUiLCJOQVNIT1JOX0JVRyIsIlYiLCJyYW5kb20iLCJfX2RlZmluZVNldHRlcl9fIiwiYVBvc3NpYmxlUHJvdG90eXBlIiwic2V0dGVyIiwiQ09SUkVDVF9TRVRURVIiLCJfX3Byb3RvX18iLCJUT19FTlRSSUVTIiwiZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwicHJvbWlzZUNhcGFiaWxpdHkiLCJlbmZvcmNlSW50ZXJuYWxTdGF0ZSIsIlRFTVBMQVRFIiwic2ltcGxlIiwiZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCIsInRhcmdldEtleSIsInRhcmdldE1ldGFkYXRhIiwia2V5TWV0YWRhdGEiLCJnZXRNYXAiLCJNZXRhZGF0YUtleSIsIm1ldGFkYXRhTWFwIiwiTWV0YWRhdGFWYWx1ZSIsIl8iLCJ0b0tleSIsIlIiLCJyZTEiLCJyZTIiLCJyZWdleHBGbGFncyIsInN0aWNreUhlbHBlcnMiLCJuYXRpdmVFeGVjIiwibmF0aXZlUmVwbGFjZSIsInBhdGNoZWRFeGVjIiwiVVBEQVRFU19MQVNUX0lOREVYX1dST05HIiwibGFzdEluZGV4IiwiVU5TVVBQT1JURURfWSIsIkJST0tFTl9DQVJFVCIsIk5QQ0dfSU5DTFVERUQiLCJyZUNvcHkiLCJzdGlja3kiLCJjaGFyc0FkZGVkIiwic3RyQ29weSIsIm11bHRpbGluZSIsImlucHV0IiwiaWdub3JlQ2FzZSIsImRvdEFsbCIsIlJFIiwicyIsInkiLCJpcyIsIlRBRyIsIlNIQVJFRCIsImNvcHlyaWdodCIsImRlZmF1bHRDb25zdHJ1Y3RvciIsIkNPTlZFUlRfVE9fU1RSSU5HIiwicG9zIiwic2Vjb25kIiwicG9zaXRpb24iLCJjaGFyQ29kZUF0IiwiY29kZUF0IiwicmVwZWF0IiwiY2VpbCIsIklTX0VORCIsIm1heExlbmd0aCIsImZpbGxTdHJpbmciLCJmaWxsTGVuIiwic3RyaW5nRmlsbGVyIiwic3RyaW5nTGVuZ3RoIiwiZmlsbFN0ciIsImludE1heExlbmd0aCIsIm1heEludCIsInJlZ2V4Tm9uQVNDSUkiLCJyZWdleFNlcGFyYXRvcnMiLCJPVkVSRkxPV19FUlJPUiIsInN0cmluZ0Zyb21DaGFyQ29kZSIsImZyb21DaGFyQ29kZSIsImRpZ2l0VG9CYXNpYyIsImRpZ2l0IiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImJhc2VNaW51c1RNaW4iLCJiYXNlIiwiZW5jb2RlIiwiY3VycmVudFZhbHVlIiwib3V0cHV0IiwiaW5wdXRMZW5ndGgiLCJjb3VudGVyIiwiZXh0cmEiLCJ1Y3MyZGVjb2RlIiwiYmlhcyIsImJhc2ljTGVuZ3RoIiwiaGFuZGxlZENQQ291bnQiLCJtIiwiaGFuZGxlZENQQ291bnRQbHVzT25lIiwicSIsInQiLCJxTWludXNUIiwiYmFzZU1pbnVzVCIsImxhYmVsIiwiZW5jb2RlZCIsImxhYmVscyIsIndoaXRlc3BhY2UiLCJsdHJpbSIsInJ0cmltIiwiZGVmZXIiLCJjaGFubmVsIiwicG9ydCIsImxvY2F0aW9uIiwic2V0SW1tZWRpYXRlIiwiY2xlYXJJbW1lZGlhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsIkRpc3BhdGNoIiwicXVldWUiLCJPTlJFQURZU1RBVEVDSEFOR0UiLCJydW4iLCJydW5uZXIiLCJsaXN0ZW5lciIsImV2ZW50IiwicG9zdCIsInBvc3RNZXNzYWdlIiwicHJvdG9jb2wiLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImltcG9ydFNjcmlwdHMiLCJyZW1vdmVDaGlsZCIsInNldFRpbWVvdXQiLCJtYXgiLCJpbnRlZ2VyIiwiaXNOYU4iLCJ0b1Bvc2l0aXZlSW50ZWdlciIsIkJZVEVTIiwiUFJFRkVSUkVEX1NUUklORyIsInZhbCIsInZhbHVlT2YiLCJUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTIiwiQXJyYXlCdWZmZXJWaWV3Q29yZSIsIkFycmF5QnVmZmVyTW9kdWxlIiwidG9PZmZzZXQiLCJ0eXBlZEFycmF5RnJvbSIsInJvdW5kIiwiQllURVNfUEVSX0VMRU1FTlQiLCJXUk9OR19MRU5HVEgiLCJmcm9tTGlzdCIsImlzQXJyYXlCdWZmZXIiLCJpc1R5cGVkQXJyYXlJbmRleCIsIndyYXBwZWRHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ3cmFwcGVkRGVmaW5lUHJvcGVydHkiLCJDTEFNUEVEIiwiR0VUVEVSIiwiU0VUVEVSIiwiTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yIiwiVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlIiwiYWRkRWxlbWVudCIsImdldHRlciIsInR5cGVkQXJyYXlPZmZzZXQiLCIkbGVuZ3RoIiwiJGxlbiIsInBvc3RmaXgiLCJOQVRJVkVfU1lNQk9MIiwiVVNFX1NZTUJPTF9BU19VSUQiLCJXZWxsS25vd25TeW1ib2xzU3RvcmUiLCJjcmVhdGVXZWxsS25vd25TeW1ib2wiLCJ3aXRob3V0U2V0dGVyIiwiYXJyYXlCdWZmZXJNb2R1bGUiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJuYXRpdmVBcnJheUJ1ZmZlclNsaWNlIiwiZmluIiwidmlld1NvdXJjZSIsInZpZXdUYXJnZXQiLCJhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0IiwiSVNfQ09OQ0FUX1NQUkVBREFCTEUiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEIiwiSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCIsIlNQRUNJRVNfU1VQUE9SVCIsImlzQ29uY2F0U3ByZWFkYWJsZSIsInNwcmVhZGFibGUiLCJFIiwiYWRkVG9VbnNjb3BhYmxlcyIsIiRldmVyeSIsImZpbGwiLCIkZmlsdGVyIiwiSEFTX1NQRUNJRVNfU1VQUE9SVCIsIiRmaW5kSW5kZXgiLCJGSU5EX0lOREVYIiwiU0tJUFNfSE9MRVMiLCIkZmluZCIsIkZJTkQiLCJmbGF0TWFwIiwiZmxhdCIsImRlcHRoQXJnIiwiJGluY2x1ZGVzIiwiJGluZGV4T2YiLCJuYXRpdmVJbmRleE9mIiwiQVJSQVlfSVRFUkFUT1IiLCJBcmd1bWVudHMiLCJuYXRpdmVKb2luIiwiRVMzX1NUUklOR1MiLCJzZXBhcmF0b3IiLCIkbWFwIiwib2YiLCIkcmVkdWNlUmlnaHQiLCJyZWR1Y2VSaWdodCIsIiRyZWR1Y2UiLCJyZWR1Y2UiLCJuYXRpdmVSZXZlcnNlIiwiMCIsIm5hdGl2ZVNsaWNlIiwiJHNvbWUiLCJuYXRpdmVTb3J0IiwiRkFJTFNfT05fVU5ERUZJTkVEIiwiRkFJTFNfT05fTlVMTCIsImNvbXBhcmVmbiIsIk1BWElNVU1fQUxMT1dFRF9MRU5HVEhfRVhDRUVERUQiLCJkZWxldGVDb3VudCIsImluc2VydENvdW50IiwiYWN0dWFsRGVsZXRlQ291bnQiLCJhY3R1YWxTdGFydCIsInB2IiwiZGF0ZVRvUHJpbWl0aXZlIiwiVE9fUFJJTUlUSVZFIiwiSU5WQUxJRF9EQVRFIiwiVE9fU1RSSU5HIiwibmF0aXZlRGF0ZVRvU3RyaW5nIiwiSEFTX0lOU1RBTkNFIiwiRnVuY3Rpb25Qcm90b3R5cGUiLCJGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nIiwibmFtZVJFIiwiJHN0cmluZ2lmeSIsImxvdyIsImhpIiwiZml4Iiwic3RyaW5naWZ5IiwicmVwbGFjZXIiLCJzcGFjZSIsIkpTT04iLCJjb2xsZWN0aW9uU3Ryb25nIiwiaW5pdCIsIm5hdGl2ZUFjb3NoIiwiYWNvc2giLCJzcXJ0IiwiTUFYX1ZBTFVFIiwibmF0aXZlQXNpbmgiLCJhc2luaCIsIm5hdGl2ZUF0YW5oIiwiYXRhbmgiLCJjYnJ0IiwiTE9HMkUiLCJjbHozMiIsIm5hdGl2ZUNvc2giLCJjb3NoIiwiJGh5cG90IiwiaHlwb3QiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJkaXYiLCJzdW0iLCJhTGVuIiwibGFyZyIsIm5hdGl2ZUltdWwiLCJpbXVsIiwiVUlOVDE2IiwieG4iLCJ5biIsInhsIiwieWwiLCJMT0cxMEUiLCJsb2cxMCIsImxvZzIiLCJzaW5oIiwidGFuaCIsInRydW5jIiwiTlVNQkVSIiwiTmF0aXZlTnVtYmVyIiwiTnVtYmVyUHJvdG90eXBlIiwiQlJPS0VOX0NMQVNTT0YiLCJ0b051bWJlciIsInRoaXJkIiwibWF4Q29kZSIsImRpZ2l0cyIsImNvZGUiLCJOdW1iZXJXcmFwcGVyIiwiaXNJbnRlZ2VyIiwiaXNTYWZlSW50ZWdlciIsIk1JTl9TQUZFX0lOVEVHRVIiLCJ0aGlzTnVtYmVyVmFsdWUiLCJuYXRpdmVUb0ZpeGVkIiwidG9GaXhlZCIsImFjYyIsImZyYWN0aW9uRGlnaXRzIiwieiIsImZyYWN0RGlnaXRzIiwibXVsdGlwbHkiLCJjMiIsImRpdmlkZSIsImRhdGFUb1N0cmluZyIsIngyIiwibmF0aXZlVG9QcmVjaXNpb24iLCJ0b1ByZWNpc2lvbiIsInByZWNpc2lvbiIsIl9fZGVmaW5lR2V0dGVyX18iLCIkZW50cmllcyIsIm5hdGl2ZUZyZWV6ZSIsImZyZWV6ZSIsImZyb21FbnRyaWVzIiwib2JqIiwidiIsIkZBSUxTX09OX1BSSU1JVElWRVMiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwibmF0aXZlR2V0UHJvdG90eXBlT2YiLCJuYXRpdmVJc0V4dGVuc2libGUiLCJuYXRpdmVJc0Zyb3plbiIsImlzRnJvemVuIiwibmF0aXZlSXNTZWFsZWQiLCJpc1NlYWxlZCIsIm5hdGl2ZUtleXMiLCJfX2xvb2t1cEdldHRlcl9fIiwiZGVzYyIsIl9fbG9va3VwU2V0dGVyX18iLCJuYXRpdmVQcmV2ZW50RXh0ZW5zaW9ucyIsIm5hdGl2ZVNlYWwiLCJzZWFsIiwiJHZhbHVlcyIsInBhcnNlRmxvYXRJbXBsZW1lbnRhdGlvbiIsInBhcnNlSW50SW1wbGVtZW50YXRpb24iLCJuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSIsInBlcmZvcm0iLCJhbGxTZXR0bGVkIiwiY2FwYWJpbGl0eSIsInByb21pc2VSZXNvbHZlIiwicmVtYWluaW5nIiwiYWxyZWFkeUNhbGxlZCIsInN0YXR1cyIsInJlYXNvbiIsIk5hdGl2ZVByb21pc2UiLCJyZWFsIiwib25GaW5hbGx5IiwiaXNGdW5jdGlvbiIsIkludGVybmFsIiwiT3duUHJvbWlzZUNhcGFiaWxpdHkiLCJQcm9taXNlV3JhcHBlciIsIm5hdGl2ZVRoZW4iLCJtaWNyb3Rhc2siLCJob3N0UmVwb3J0RXJyb3JzIiwiUFJPTUlTRSIsImdldEludGVybmFsUHJvbWlzZVN0YXRlIiwiUHJvbWlzZUNvbnN0cnVjdG9yIiwiJGZldGNoIiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiRElTUEFUQ0hfRVZFTlQiLCJjcmVhdGVFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJVTkhBTkRMRURfUkVKRUNUSU9OIiwiUHJvbWlzZVJlamVjdGlvbkV2ZW50IiwiRmFrZVByb21pc2UiLCJJTkNPUlJFQ1RfSVRFUkFUSU9OIiwiYWxsIiwiaXNUaGVuYWJsZSIsImlzUmVqZWN0Iiwibm90aWZpZWQiLCJjaGFpbiIsInJlYWN0aW9ucyIsIm9rIiwiZXhpdGVkIiwicmVhY3Rpb24iLCJoYW5kbGVyIiwiZmFpbCIsInJlamVjdGlvbiIsIm9uSGFuZGxlVW5oYW5kbGVkIiwib25VbmhhbmRsZWQiLCJpbml0RXZlbnQiLCJpc1VuaGFuZGxlZCIsImVtaXQiLCJ1bndyYXAiLCJpbnRlcm5hbFJlamVjdCIsImludGVybmFsUmVzb2x2ZSIsImV4ZWN1dG9yIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiZmV0Y2giLCJ3cmFwIiwiciIsIiRwcm9taXNlUmVzb2x2ZSIsInJhY2UiLCJuYXRpdmVBcHBseSIsImZ1bmN0aW9uQXBwbHkiLCJ0aGlzQXJndW1lbnQiLCJhcmd1bWVudHNMaXN0IiwibmF0aXZlQ29uc3RydWN0IiwiTkVXX1RBUkdFVF9CVUciLCJBUkdTX0JVRyIsIlRhcmdldCIsIm5ld1RhcmdldCIsIiRhcmdzIiwiUmVmbGVjdCIsImF0dHJpYnV0ZXMiLCJkZWxldGVQcm9wZXJ0eSIsIm9iamVjdEdldFByb3RvdHlwZU9mIiwicmVjZWl2ZXIiLCJvYmplY3RJc0V4dGVuc2libGUiLCJvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyIsIm9iamVjdFNldFByb3RvdHlwZU9mIiwiZXhpc3RpbmdEZXNjcmlwdG9yIiwib3duRGVzY3JpcHRvciIsImdldEZsYWdzIiwiTmF0aXZlUmVnRXhwIiwiUmVnRXhwUHJvdG90eXBlIiwiQ09SUkVDVF9ORVciLCJSZWdFeHBXcmFwcGVyIiwicGF0dGVybiIsInRoaXNJc1JlZ0V4cCIsInBhdHRlcm5Jc1JlZ0V4cCIsImZsYWdzQXJlVW5kZWZpbmVkIiwicHJveHkiLCJvYmplY3REZWZpbmVQcm9wZXJ0eU1vZHVsZSIsInJlZ0V4cEZsYWdzIiwibmF0aXZlVGVzdCIsIkVycm9yIiwibmF0aXZlVG9TdHJpbmciLCJOT1RfR0VORVJJQyIsIklOQ09SUkVDVF9OQU1FIiwicCIsInJmIiwiY3JlYXRlSFRNTCIsImZvcmNlZFN0cmluZ0hUTUxNZXRob2QiLCJhbmNob3IiLCJiaWciLCJibGluayIsImJvbGQiLCJjb2RlUG9pbnRBdCIsIm5vdEFSZWdFeHAiLCJjb3JyZWN0SXNSZWdFeHBMb2dpYyIsIm5hdGl2ZUVuZHNXaXRoIiwiZW5kc1dpdGgiLCJDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyIsInNlYXJjaFN0cmluZyIsImVuZFBvc2l0aW9uIiwic2VhcmNoIiwiZml4ZWQiLCJmb250Y29sb3IiLCJjb2xvciIsImZvbnRzaXplIiwibmF0aXZlRnJvbUNvZGVQb2ludCIsImZyb21Db2RlUG9pbnQiLCJlbGVtZW50cyIsIml0YWxpY3MiLCJTVFJJTkdfSVRFUkFUT1IiLCJwb2ludCIsImxpbmsiLCJnZXRSZWdFeHBGbGFncyIsImFkdmFuY2VTdHJpbmdJbmRleCIsIk1BVENIX0FMTCIsIlJFR0VYUF9TVFJJTkciLCJSRUdFWFBfU1RSSU5HX0lURVJBVE9SIiwicmVnRXhwQnVpbHRpbkV4ZWMiLCJuYXRpdmVNYXRjaEFsbCIsIm1hdGNoQWxsIiwiV09SS1NfV0lUSF9OT05fR0xPQkFMX1JFR0VYIiwiJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yIiwiZnVsbFVuaWNvZGUiLCJyZWdFeHBFeGVjIiwiJG1hdGNoQWxsIiwiZmxhZ3NWYWx1ZSIsIm1hdGNoZXIiLCJyeCIsImZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljIiwibmF0aXZlTWF0Y2giLCJtYXliZUNhbGxOYXRpdmUiLCJyZXMiLCJtYXRjaFN0ciIsIiRwYWRFbmQiLCJwYWRFbmQiLCIkcGFkU3RhcnQiLCJyYXciLCJ0ZW1wbGF0ZSIsInJhd1RlbXBsYXRlIiwibGl0ZXJhbFNlZ21lbnRzIiwiU1VCU1RJVFVUSU9OX1NZTUJPTFMiLCJTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCIsIlVOU0FGRV9TVUJTVElUVVRFIiwic2VhcmNoVmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJmdW5jdGlvbmFsUmVwbGFjZSIsInJlc3VsdHMiLCJhY2N1bXVsYXRlZFJlc3VsdCIsIm5leHRTb3VyY2VQb3NpdGlvbiIsIm1hdGNoZWQiLCJjYXB0dXJlcyIsIm5hbWVkQ2FwdHVyZXMiLCJyZXBsYWNlckFyZ3MiLCJnZXRTdWJzdGl0dXRpb24iLCJ0YWlsUG9zIiwic3ltYm9scyIsImNoIiwiY2FwdHVyZSIsInNhbWVWYWx1ZSIsIlNFQVJDSCIsIm5hdGl2ZVNlYXJjaCIsInNlYXJjaGVyIiwicHJldmlvdXNMYXN0SW5kZXgiLCJzbWFsbCIsImNhbGxSZWdFeHBFeGVjIiwiYXJyYXlQdXNoIiwiTUFYX1VJTlQzMiIsIlNVUFBPUlRTX1kiLCJTUExJVCIsIm5hdGl2ZVNwbGl0IiwiaW50ZXJuYWxTcGxpdCIsImxpbWl0IiwibGltIiwibGFzdExlbmd0aCIsImxhc3RMYXN0SW5kZXgiLCJzZXBhcmF0b3JDb3B5Iiwic3BsaXR0ZXIiLCJ1bmljb2RlTWF0Y2hpbmciLCJuYXRpdmVTdGFydHNXaXRoIiwic3RhcnRzV2l0aCIsInN0cmlrZSIsInN1YiIsInN1cCIsIiR0cmltRW5kIiwiZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCIsInRyaW1FbmQiLCJ0cmltUmlnaHQiLCIkdHJpbVN0YXJ0IiwidHJpbVN0YXJ0IiwidHJpbUxlZnQiLCIkdHJpbSIsImRlZmluZVdlbGxLbm93blN5bWJvbCIsIk5hdGl2ZVN5bWJvbCIsImRlc2NyaXB0aW9uIiwiRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlIiwiU3ltYm9sV3JhcHBlciIsInN5bWJvbFByb3RvdHlwZSIsInN5bWJvbFRvU3RyaW5nIiwibmF0aXZlIiwibmF0aXZlT2JqZWN0Q3JlYXRlIiwiZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsIiwiSElEREVOIiwiJFN5bWJvbCIsIkFsbFN5bWJvbHMiLCJPYmplY3RQcm90b3R5cGVTeW1ib2xzIiwiU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSIsIlN5bWJvbFRvU3RyaW5nUmVnaXN0cnkiLCJRT2JqZWN0IiwiVVNFX1NFVFRFUiIsImZpbmRDaGlsZCIsInNldFN5bWJvbERlc2NyaXB0b3IiLCJPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yIiwiaXNTeW1ib2wiLCIkZGVmaW5lUHJvcGVydHkiLCIkZGVmaW5lUHJvcGVydGllcyIsInByb3BlcnRpZXMiLCIkZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiJHByb3BlcnR5SXNFbnVtZXJhYmxlIiwiJGdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIiRnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiSVNfT0JKRUNUX1BST1RPVFlQRSIsImtleUZvciIsInN5bSIsInVzZVNldHRlciIsInVzZVNpbXBsZSIsIiRyZXBsYWNlciIsIiRjb3B5V2l0aGluIiwiJGZpbGwiLCJwcmVkaWNhdGUiLCJjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IiLCJBcnJheUl0ZXJhdG9ycyIsImFycmF5VmFsdWVzIiwiYXJyYXlLZXlzIiwiYXJyYXlFbnRyaWVzIiwibmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yIiwiQ09SUkVDVF9JVEVSX05BTUUiLCJ0eXBlZEFycmF5VmFsdWVzIiwiJGpvaW4iLCIkbGFzdEluZGV4T2YiLCJtaWRkbGUiLCIkc2xpY2UiLCIkc29ydCIsImJlZ2luIiwiYmVnaW5JbmRleCIsIiR0b0xvY2FsZVN0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwiVE9fTE9DQUxFX1NUUklOR19CVUciLCJVaW50OEFycmF5UHJvdG90eXBlIiwiYXJyYXlUb1N0cmluZyIsImFycmF5Sm9pbiIsIklTX05PVF9BUlJBWV9NRVRIT0QiLCJJbnRlcm5hbFdlYWtNYXAiLCJjb2xsZWN0aW9uV2VhayIsImVuZm9yY2VJdGVybmFsU3RhdGUiLCJJU19JRTExIiwiJFdlYWtNYXAiLCJXZWFrTWFwUHJvdG90eXBlIiwibmF0aXZlRGVsZXRlIiwibmF0aXZlSGFzIiwibmF0aXZlR2V0IiwibmF0aXZlU2V0IiwiZ2V0SW50ZXJuYWxBZ2dyZWdhdGVFcnJvclN0YXRlIiwiJEFnZ3JlZ2F0ZUVycm9yIiwiZXJyb3JzIiwibWVzc2FnZSIsImVycm9yc0FycmF5IiwiQWdncmVnYXRlRXJyb3IiLCJpc0Zyb3plblN0cmluZ0FycmF5IiwiYWxsb3dVbmRlZmluZWQiLCJpc1RlbXBsYXRlT2JqZWN0IiwiY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5IiwiYXNJbmRleGVkUGFpcnMiLCJBc3luY0l0ZXJhdG9yQ29uc3RydWN0b3IiLCJkcm9wIiwiZmlsdGVyZXIiLCJzZWxlY3RlZCIsImdldEFzeW5jSXRlcmF0b3JNZXRob2QiLCJpbm5lckl0ZXJhdG9yIiwib3V0ZXJMb29wIiwibWFwcGVkIiwiaW5uZXJOZXh0IiwiaW5uZXJMb29wIiwiZXJyb3IyIiwiZXJyb3IxIiwidXNpbmdJdGVyYXRvciIsInJlZHVjZXIiLCJub0luaXRpYWwiLCJhY2N1bXVsYXRvciIsInRha2UiLCIkdG9BcnJheSIsImdldENvbXBvc2l0ZUtleU5vZGUiLCJjb21wb3NpdGVLZXkiLCJjb21wb3NpdGVTeW1ib2wiLCJjcmVhdGVJdGVyYXRvclByb3h5IiwiTmF0aXZlSXRlcmF0b3IiLCJjb2xsZWN0aW9uRGVsZXRlQWxsIiwiZGVsZXRlQWxsIiwiZ2V0TWFwSXRlcmF0b3IiLCJuZXdNYXAiLCJmaW5kS2V5IiwiZ3JvdXBCeSIsImtleURlcml2YXRpdmUiLCJkZXJpdmVkS2V5Iiwic2FtZVZhbHVlWmVybyIsImtleUJ5Iiwia2V5T2YiLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWVyZ2UiLCJ1cGRhdGVPckluc2VydCIsInVwZGF0ZSIsImNhbGxiYWNrIiwiaXNQcmVzZW50SW5NYXAiLCJ1cHNlcnQiLCJjbGFtcCIsImxvd2VyIiwidXBwZXIiLCJERUdfUEVSX1JBRCIsIlBJIiwiUkFEX1BFUl9ERUciLCJkZWdyZWVzIiwicmFkaWFucyIsImZzY2FsZSIsImlhZGRoIiwieDAiLCJ4MSIsInkwIiwieTEiLCIkeDAiLCIkeTAiLCJpbXVsaCIsInUiLCIkdSIsIiR2IiwidTAiLCJ2MCIsInUxIiwidjEiLCJpc3ViaCIsIm51bWJlcklzRmluaXRlIiwiU0VFREVEX1JBTkRPTSIsIlNFRURFRF9SQU5ET01fR0VORVJBVE9SIiwiJFNlZWRlZFJhbmRvbUdlbmVyYXRvciIsInNlZWQiLCJzZWVkZWRQUk5HIiwic2lnbmJpdCIsInVtdWxoIiwiSU5WQUxJRF9OVU1CRVJfUkVQUkVTRU5UQVRJT04iLCJ2YWxpZCIsImZyb21TdHJpbmciLCJtYXRoTnVtIiwiU3ludGF4RXJyb3IiLCJPYmplY3RJdGVyYXRvciIsIml0ZXJhdGVFbnRyaWVzIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlVmFsdWVzIiwiT0JTRVJWQUJMRSIsImdldE1ldGhvZCIsImNsZWFudXBTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25TdGF0ZSIsImNsZWFudXAiLCJzdWJzY3JpcHRpb25DbG9zZWQiLCJvYnNlcnZlciIsInN1YnNjcmlwdGlvbiIsImNsb3NlZCIsInN1YnNjcmlwdGlvbk9ic2VydmVyIiwiU3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlciIsIlN1YnNjcmlwdGlvbk9ic2VydmVyIiwidW5zdWJzY3JpYmUiLCJuZXh0TWV0aG9kIiwiZXJyb3JNZXRob2QiLCJjb21wbGV0ZSIsImNvbXBsZXRlTWV0aG9kIiwiJE9ic2VydmFibGUiLCJzdWJzY3JpYmUiLCJvYnNlcnZhYmxlTWV0aG9kIiwib2JzZXJ2YWJsZSIsIml0ZW1zIiwiT2JzZXJ2YWJsZSIsIlBST01JU0VfQU5ZX0VSUk9SIiwiYW55IiwiYWxyZWFkeVJlc29sdmVkIiwiYWxyZWFkeVJlamVjdGVkIiwiUmVmbGVjdE1ldGFkYXRhTW9kdWxlIiwidG9NZXRhZGF0YUtleSIsIm9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEiLCJkZWZpbmVNZXRhZGF0YSIsIm1ldGFkYXRhS2V5IiwibWV0YWRhdGFWYWx1ZSIsImRlbGV0ZU1ldGFkYXRhIiwib3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCJvcmRpbmFyeU1ldGFkYXRhS2V5cyIsIm9LZXlzIiwiaXRlciIsInBLZXlzIiwiZ2V0TWV0YWRhdGFLZXlzIiwib3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsIm9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCJvcmRpbmFyeUdldE1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJnZXRPd25NZXRhZGF0YUtleXMiLCJnZXRPd25NZXRhZGF0YSIsIm9yZGluYXJ5SGFzTWV0YWRhdGEiLCJoYXNNZXRhZGF0YSIsImhhc093bk1ldGFkYXRhIiwiY29sbGVjdGlvbkFkZEFsbCIsImFkZEFsbCIsImRpZmZlcmVuY2UiLCJuZXdTZXQiLCJnZXRTZXRJdGVyYXRvciIsImludGVyc2VjdGlvbiIsImhhc0NoZWNrIiwiaXNEaXNqb2ludEZyb20iLCJpc1N1YnNldE9mIiwib3RoZXJTZXQiLCJpc1N1cGVyc2V0T2YiLCJzZXAiLCJzeW1tZXRyaWNEaWZmZXJlbmNlIiwidW5pb24iLCJhdCIsIlN0cmluZ011bHRpYnl0ZU1vZHVsZSIsIiRTdHJpbmdJdGVyYXRvciIsImNvZGVQb2ludCIsImNvZGVQb2ludHMiLCJyZXBsYWNlQWxsIiwiSVNfUkVHX0VYUCIsIkRPTUl0ZXJhYmxlcyIsIkNPTExFQ1RJT05fTkFNRSIsIkNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uUHJvdG90eXBlIiwiQXJyYXlJdGVyYXRvck1ldGhvZHMiLCJBcnJheVZhbHVlcyIsImlzTm9kZSIsInNjaGVkdWxlciIsInRpbWVvdXQiLCJib3VuZEFyZ3MiLCJzZXRJbnRlcnZhbCIsIlVTRV9OQVRJVkVfVVJMIiwiaGFzT3duIiwiSGVhZGVycyIsIlVSTF9TRUFSQ0hfUEFSQU1TIiwiVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IiLCJnZXRJbnRlcm5hbFBhcmFtc1N0YXRlIiwicGx1cyIsInNlcXVlbmNlcyIsInBlcmNlbnRTZXF1ZW5jZSIsInBlcmNlbnREZWNvZGUiLCJzZXF1ZW5jZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlc2VyaWFsaXplIiwic2VyaWFsaXplIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicGFyc2VTZWFyY2hQYXJhbXMiLCJxdWVyeSIsInNoaWZ0IiwidXBkYXRlU2VhcmNoUGFyYW1zIiwidmFsaWRhdGVBcmd1bWVudHNMZW5ndGgiLCJwYXNzZWQiLCJyZXF1aXJlZCIsIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IiLCJlbnRyeUl0ZXJhdG9yIiwiZW50cnlOZXh0IiwidXBkYXRlVVJMIiwiVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlIiwiYXBwZW5kIiwiZ2V0QWxsIiwiZm91bmQiLCJlbnRyaWVzSW5kZXgiLCJzbGljZUluZGV4IiwiYm9keSIsImhlYWRlcnMiLCJnZXRTdGF0ZSIsIkVPRiIsImFycmF5RnJvbSIsInRvQVNDSUkiLCJVUkxTZWFyY2hQYXJhbXNNb2R1bGUiLCJOYXRpdmVVUkwiLCJnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlIiwiZ2V0SW50ZXJuYWxVUkxTdGF0ZSIsIklOVkFMSURfU0NIRU1FIiwiSU5WQUxJRF9IT1NUIiwiSU5WQUxJRF9QT1JUIiwiQUxQSEEiLCJBTFBIQU5VTUVSSUMiLCJESUdJVCIsIkhFWF9TVEFSVCIsIk9DVCIsIkRFQyIsIkhFWCIsIkZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQiLCJGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5UIiwiTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSIsIlRBQl9BTkRfTkVXX0xJTkUiLCJwYXJzZUhvc3QiLCJwYXJzZUlQdjYiLCJpc1NwZWNpYWwiLCJwYXJzZUlQdjQiLCJwZXJjZW50RW5jb2RlIiwiQzBDb250cm9sUGVyY2VudEVuY29kZVNldCIsInBhcnRzTGVuZ3RoIiwibnVtYmVycyIsInBhcnQiLCJpcHY0IiwicGFydHMiLCJwb3AiLCJudW1iZXJzU2VlbiIsImlwdjRQaWVjZSIsInN3YXBzIiwic3dhcCIsImFkZHJlc3MiLCJwaWVjZUluZGV4IiwiY29tcHJlc3MiLCJwb2ludGVyIiwiY2hhciIsInNlcmlhbGl6ZUhvc3QiLCJpZ25vcmUwIiwidW5zaGlmdCIsImlwdjYiLCJtYXhJbmRleCIsImN1cnJTdGFydCIsImN1cnJMZW5ndGgiLCJmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZSIsImZyYWdtZW50UGVyY2VudEVuY29kZVNldCIsInBhdGhQZXJjZW50RW5jb2RlU2V0IiwidXNlcmluZm9QZXJjZW50RW5jb2RlU2V0Iiwic3BlY2lhbFNjaGVtZXMiLCJmdHAiLCJmaWxlIiwiaHR0cCIsImh0dHBzIiwid3MiLCJ3c3MiLCJzY2hlbWUiLCJpbmNsdWRlc0NyZWRlbnRpYWxzIiwicGFzc3dvcmQiLCJjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQiLCJjYW5ub3RCZUFCYXNlVVJMIiwiaXNXaW5kb3dzRHJpdmVMZXR0ZXIiLCJub3JtYWxpemVkIiwic3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlciIsInNob3J0ZW5VUkxzUGF0aCIsInBhdGhTaXplIiwiaXNTaW5nbGVEb3QiLCJzZWdtZW50IiwiU0NIRU1FX1NUQVJUIiwiU0NIRU1FIiwiTk9fU0NIRU1FIiwiU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkiLCJQQVRIX09SX0FVVEhPUklUWSIsIlJFTEFUSVZFIiwiUkVMQVRJVkVfU0xBU0giLCJTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTIiwiU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMiLCJBVVRIT1JJVFkiLCJIT1NUIiwiSE9TVE5BTUUiLCJQT1JUIiwiRklMRSIsIkZJTEVfU0xBU0giLCJGSUxFX0hPU1QiLCJQQVRIX1NUQVJUIiwiUEFUSCIsIkNBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEgiLCJRVUVSWSIsIkZSQUdNRU5UIiwicGFyc2VVUkwiLCJzdGF0ZU92ZXJyaWRlIiwiYnVmZmVyQ29kZVBvaW50cyIsImZhaWx1cmUiLCJzZWVuQXQiLCJzZWVuQnJhY2tldCIsInNlZW5QYXNzd29yZFRva2VuIiwiZnJhZ21lbnQiLCJlbmNvZGVkQ29kZVBvaW50cyIsIlVSTENvbnN0cnVjdG9yIiwiYmFzZVN0YXRlIiwidXJsU3RyaW5nIiwic2VhcmNoUGFyYW1zU3RhdGUiLCJzZXJpYWxpemVVUkwiLCJvcmlnaW4iLCJnZXRPcmlnaW4iLCJnZXRQcm90b2NvbCIsImdldFVzZXJuYW1lIiwiZ2V0UGFzc3dvcmQiLCJnZXRIb3N0IiwiaG9zdG5hbWUiLCJnZXRIb3N0bmFtZSIsImdldFBvcnQiLCJnZXRQYXRobmFtZSIsImdldFNlYXJjaCIsImdldFNlYXJjaFBhcmFtcyIsImdldEhhc2giLCJVUkxQcm90b3R5cGUiLCJhY2Nlc3NvckRlc2NyaXB0b3IiLCJuYXRpdmVDcmVhdGVPYmplY3RVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJuYXRpdmVSZXZva2VPYmplY3RVUkwiLCJyZXZva2VPYmplY3RVUkwiLCJibG9iIiwicHJvcG9zYWxzIiwiZWFyY3V0IiwiaG9sZUluZGljZXMiLCJkaW0iLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwiaW52U2l6ZSIsImhhc0hvbGVzIiwib3V0ZXJMZW4iLCJvdXRlck5vZGUiLCJsaW5rZWRMaXN0IiwidHJpYW5nbGVzIiwic3RlaW5lciIsImdldExlZnRtb3N0IiwiY29tcGFyZVgiLCJlbGltaW5hdGVIb2xlIiwiZmlsdGVyUG9pbnRzIiwiZWxpbWluYXRlSG9sZXMiLCJlYXJjdXRMaW5rZWQiLCJjbG9ja3dpc2UiLCJzaWduZWRBcmVhIiwiaW5zZXJ0Tm9kZSIsImVxdWFscyIsInJlbW92ZU5vZGUiLCJhZ2FpbiIsImFyZWEiLCJlYXIiLCJwYXNzIiwiek9yZGVyIiwicHJldloiLCJuZXh0WiIsInRhaWwiLCJudW1NZXJnZXMiLCJwU2l6ZSIsInFTaXplIiwiaW5TaXplIiwic29ydExpbmtlZCIsImluZGV4Q3VydmUiLCJpc0Vhckhhc2hlZCIsImlzRWFyIiwiY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyIsInNwbGl0RWFyY3V0IiwicG9pbnRJblRyaWFuZ2xlIiwibWluVFgiLCJtaW5UWSIsIm1heFRYIiwibWF4VFkiLCJtaW5aIiwibWF4WiIsImludGVyc2VjdHMiLCJsb2NhbGx5SW5zaWRlIiwiaXNWYWxpZERpYWdvbmFsIiwic3BsaXRQb2x5Z29uIiwiaG9sZSIsImh4IiwiaHkiLCJxeCIsInRhbiIsIm14IiwibXkiLCJ0YW5NaW4iLCJzZWN0b3JDb250YWluc1NlY3RvciIsImZpbmRIb2xlQnJpZGdlIiwibGVmdG1vc3QiLCJheCIsImF5IiwiYngiLCJieSIsImN4IiwiY3kiLCJweCIsInB5IiwiaW50ZXJzZWN0c1BvbHlnb24iLCJpbnNpZGUiLCJtaWRkbGVJbnNpZGUiLCJwMiIsInExIiwicTIiLCJvMSIsIm8yIiwibzMiLCJvNCIsIm9uU2VnbWVudCIsIm51bSIsImEyIiwiYjIiLCJhbiIsImJwIiwiZGVmYXVsdCIsImRldmlhdGlvbiIsInBvbHlnb25BcmVhIiwidHJpYW5nbGVzQXJlYSIsImZsYXR0ZW4iLCJ2ZXJ0aWNlcyIsImhvbGVzIiwiZGltZW5zaW9ucyIsImhvbGVJbmRleCIsImQiLCJuYXRpdmVQcm9taXNlU3VwcG9ydGVkIiwiUG9seWZpbGwiLCJQRU5ESU5HIiwiU0VBTEVEIiwiRlVMRklMTEVEIiwiUkVKRUNURUQiLCJOT09QIiwiYXN5bmNUaW1lciIsImFzeW5jU2V0VGltZXIiLCJhc3luY1F1ZXVlIiwiYXN5bmNGbHVzaCIsImFzeW5jQ2FsbCIsImludm9rZUNhbGxiYWNrIiwib3duZXIiLCJzZXR0bGVkIiwic3RhdGVfIiwiZGF0YV8iLCJoYW5kbGVUaGVuYWJsZSIsInJlc29sdmVkIiwiZnVsZmlsbCIsInB1Ymxpc2hGdWxmaWxsbWVudCIsInB1Ymxpc2hSZWplY3Rpb24iLCJwdWJsaXNoIiwiY2FsbGJhY2tzIiwidGhlbl8iLCJyZXNvbHZlciIsInJlamVjdFByb21pc2UiLCJpbnZva2VSZXNvbHZlciIsIm9uRnVsZmlsbG1lbnQiLCJvblJlamVjdGlvbiIsImZ1bGZpbGxlZCIsInJlamVjdGVkIiwicHJvbWlzZXMiLCJwcmVmaXgiLCJFdmVudHMiLCJFRSIsImNvbnRleHQiLCJvbmNlIiwiYWRkTGlzdGVuZXIiLCJlbWl0dGVyIiwiZXZ0IiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsImNsZWFyRXZlbnQiLCJFdmVudEVtaXR0ZXIiLCJldmVudE5hbWVzIiwiZXZlbnRzIiwibGlzdGVuZXJzIiwiaGFuZGxlcnMiLCJsIiwiZWUiLCJsaXN0ZW5lckNvdW50IiwiYTEiLCJhMyIsImE0IiwiYTUiLCJyZW1vdmVMaXN0ZW5lciIsIm9uIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwib2ZmIiwicHJlZml4ZWQiLCJmYWN0b3J5IiwidyIsIm5vR2xvYmFsIiwiYXJyIiwiZ2V0UHJvdG8iLCJjbGFzczJ0eXBlIiwiZm5Ub1N0cmluZyIsIk9iamVjdEZ1bmN0aW9uU3RyaW5nIiwic3VwcG9ydCIsIm5vZGVUeXBlIiwiaXNXaW5kb3ciLCJwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzIiwibm9uY2UiLCJub01vZHVsZSIsIkRPTUV2YWwiLCJkb2MiLCJzY3JpcHQiLCJ0ZXh0IiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicGFyZW50Tm9kZSIsInRvVHlwZSIsImpRdWVyeSIsInNlbGVjdG9yIiwiaXNBcnJheUxpa2UiLCJqcXVlcnkiLCJwdXNoU3RhY2siLCJlbGVtcyIsInJldCIsInByZXZPYmplY3QiLCJlYWNoIiwiZWxlbSIsImVxIiwiZXZlbiIsImdyZXAiLCJfZWxlbSIsIm9kZCIsImV4dGVuZCIsImNvcHkiLCJjb3B5SXNBcnJheSIsImNsb25lIiwiZGVlcCIsImlzUGxhaW5PYmplY3QiLCJleHBhbmRvIiwiaXNSZWFkeSIsIm1zZyIsIm5vb3AiLCJDdG9yIiwiaXNFbXB0eU9iamVjdCIsImdsb2JhbEV2YWwiLCJtYWtlQXJyYXkiLCJpbkFycmF5IiwiaW52ZXJ0IiwibWF0Y2hlcyIsImNhbGxiYWNrRXhwZWN0IiwiZ3VpZCIsIl9pIiwiU2l6emxlIiwiRXhwciIsImdldFRleHQiLCJpc1hNTCIsInRva2VuaXplIiwiY29tcGlsZSIsInNlbGVjdCIsIm91dGVybW9zdENvbnRleHQiLCJzb3J0SW5wdXQiLCJoYXNEdXBsaWNhdGUiLCJzZXREb2N1bWVudCIsImRvY0VsZW0iLCJkb2N1bWVudElzSFRNTCIsInJidWdneVFTQSIsInJidWdneU1hdGNoZXMiLCJjb250YWlucyIsInByZWZlcnJlZERvYyIsImRpcnJ1bnMiLCJjbGFzc0NhY2hlIiwiY3JlYXRlQ2FjaGUiLCJ0b2tlbkNhY2hlIiwiY29tcGlsZXJDYWNoZSIsIm5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUiLCJzb3J0T3JkZXIiLCJwdXNoTmF0aXZlIiwiYm9vbGVhbnMiLCJpZGVudGlmaWVyIiwicHNldWRvcyIsInJ3aGl0ZXNwYWNlIiwicmNvbW1hIiwicmNvbWJpbmF0b3JzIiwicmRlc2NlbmQiLCJycHNldWRvIiwicmlkZW50aWZpZXIiLCJtYXRjaEV4cHIiLCJyaHRtbCIsInJpbnB1dHMiLCJyaGVhZGVyIiwicm5hdGl2ZSIsInJxdWlja0V4cHIiLCJyc2libGluZyIsInJ1bmVzY2FwZSIsImZ1bmVzY2FwZSIsImVzY2FwZSIsIm5vbkhleCIsImhpZ2giLCJyY3NzZXNjYXBlIiwiZmNzc2VzY2FwZSIsImFzQ29kZVBvaW50IiwidW5sb2FkSGFuZGxlciIsImluRGlzYWJsZWRGaWVsZHNldCIsImFkZENvbWJpbmF0b3IiLCJkaXNhYmxlZCIsIm5vZGVOYW1lIiwiZGlyIiwiY2hpbGROb2RlcyIsImVscyIsIm5pZCIsIm5ld1NlbGVjdG9yIiwibmV3Q29udGV4dCIsIm93bmVyRG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInFzYSIsInRlc3RDb250ZXh0Iiwic2NvcGUiLCJ0b1NlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCIsInFzYUVycm9yIiwicmVtb3ZlQXR0cmlidXRlIiwiY2FjaGVMZW5ndGgiLCJtYXJrRnVuY3Rpb24iLCJhc3NlcnQiLCJhZGRIYW5kbGUiLCJhdHRycyIsImF0dHJIYW5kbGUiLCJzaWJsaW5nQ2hlY2siLCJjdXIiLCJkaWZmIiwibmV4dFNpYmxpbmciLCJjcmVhdGVJbnB1dFBzZXVkbyIsImNyZWF0ZUJ1dHRvblBzZXVkbyIsImNyZWF0ZURpc2FibGVkUHNldWRvIiwiaXNEaXNhYmxlZCIsImNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8iLCJtYXRjaEluZGV4ZXMiLCJuYW1lc3BhY2VVUkkiLCJkb2N1bWVudEVsZW1lbnQiLCJoYXNDb21wYXJlIiwic3ViV2luZG93IiwiZGVmYXVsdFZpZXciLCJ0b3AiLCJhdHRhY2hFdmVudCIsImNsYXNzTmFtZSIsImNyZWF0ZUNvbW1lbnQiLCJnZXRCeUlkIiwiZ2V0RWxlbWVudHNCeU5hbWUiLCJhdHRySWQiLCJnZXRBdHRyaWJ1dGVOb2RlIiwidG1wIiwiaW5uZXJIVE1MIiwibWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwibW96TWF0Y2hlc1NlbGVjdG9yIiwib01hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZGlzY29ubmVjdGVkTWF0Y2giLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsImFkb3duIiwiYnVwIiwiY29tcGFyZSIsInNvcnREZXRhY2hlZCIsImF1cCIsImFwIiwiZXhwciIsImF0dHIiLCJzcGVjaWZpZWQiLCJzZWwiLCJ1bmlxdWVTb3J0IiwiZHVwbGljYXRlcyIsImRldGVjdER1cGxpY2F0ZXMiLCJzb3J0U3RhYmxlIiwidGV4dENvbnRlbnQiLCJmaXJzdENoaWxkIiwibm9kZVZhbHVlIiwic2VsZWN0b3JzIiwiY3JlYXRlUHNldWRvIiwicmVsYXRpdmUiLCJwcmVGaWx0ZXIiLCJleGNlc3MiLCJ1bnF1b3RlZCIsIm5vZGVOYW1lU2VsZWN0b3IiLCJvcGVyYXRvciIsIndoYXQiLCJfYXJndW1lbnQiLCJmb3J3YXJkIiwib2ZUeXBlIiwiX2NvbnRleHQiLCJ4bWwiLCJ1bmlxdWVDYWNoZSIsIm91dGVyQ2FjaGUiLCJub2RlSW5kZXgiLCJ1c2VDYWNoZSIsImxhc3RDaGlsZCIsInVuaXF1ZUlEIiwicHNldWRvIiwic2V0RmlsdGVycyIsImlkeCIsInVubWF0Y2hlZCIsImxhbmciLCJlbGVtTGFuZyIsImFjdGl2ZUVsZW1lbnQiLCJoYXNGb2N1cyIsInRhYkluZGV4IiwiY2hlY2tlZCIsInNlbGVjdGVkSW5kZXgiLCJfbWF0Y2hJbmRleGVzIiwicmFkaW8iLCJjaGVja2JveCIsImltYWdlIiwic3VibWl0IiwicmVzZXQiLCJ0b2tlbnMiLCJjb21iaW5hdG9yIiwic2tpcCIsImNoZWNrTm9uRWxlbWVudHMiLCJkb25lTmFtZSIsIm9sZENhY2hlIiwibmV3Q2FjaGUiLCJlbGVtZW50TWF0Y2hlciIsIm1hdGNoZXJzIiwiY29uZGVuc2UiLCJuZXdVbm1hdGNoZWQiLCJzZXRNYXRjaGVyIiwicG9zdEZpbHRlciIsInBvc3RGaW5kZXIiLCJwb3N0U2VsZWN0b3IiLCJwcmVNYXAiLCJwb3N0TWFwIiwicHJlZXhpc3RpbmciLCJjb250ZXh0cyIsIm11bHRpcGxlQ29udGV4dHMiLCJtYXRjaGVySW4iLCJtYXRjaGVyT3V0IiwibWF0Y2hlckZyb21Ub2tlbnMiLCJjaGVja0NvbnRleHQiLCJsZWFkaW5nUmVsYXRpdmUiLCJpbXBsaWNpdFJlbGF0aXZlIiwibWF0Y2hDb250ZXh0IiwibWF0Y2hBbnlDb250ZXh0IiwiZmlsdGVycyIsInBhcnNlT25seSIsInNvRmFyIiwicHJlRmlsdGVycyIsImNhY2hlZCIsInNldE1hdGNoZXJzIiwiZWxlbWVudE1hdGNoZXJzIiwiYnlTZXQiLCJieUVsZW1lbnQiLCJzdXBlck1hdGNoZXIiLCJvdXRlcm1vc3QiLCJtYXRjaGVkQ291bnQiLCJzZXRNYXRjaGVkIiwiY29udGV4dEJhY2t1cCIsImRpcnJ1bnNVbmlxdWUiLCJtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMiLCJ0b2tlbiIsImNvbXBpbGVkIiwiX25hbWUiLCJkZWZhdWx0VmFsdWUiLCJ1bmlxdWUiLCJpc1hNTERvYyIsImVzY2FwZVNlbGVjdG9yIiwidW50aWwiLCJ0cnVuY2F0ZSIsInNpYmxpbmdzIiwicm5lZWRzQ29udGV4dCIsIm5lZWRzQ29udGV4dCIsInJzaW5nbGVUYWciLCJ3aW5ub3ciLCJxdWFsaWZpZXIiLCJub3QiLCJyb290alF1ZXJ5IiwicGFyc2VIVE1MIiwicmVhZHkiLCJycGFyZW50c3ByZXYiLCJndWFyYW50ZWVkVW5pcXVlIiwiY2hpbGRyZW4iLCJjb250ZW50cyIsInNpYmxpbmciLCJ0YXJnZXRzIiwiY2xvc2VzdCIsInByZXZBbGwiLCJhZGRCYWNrIiwicGFyZW50cyIsInBhcmVudHNVbnRpbCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJwcmV2VW50aWwiLCJjb250ZW50RG9jdW1lbnQiLCJybm90aHRtbHdoaXRlIiwiSWRlbnRpdHkiLCJUaHJvd2VyIiwiZXgiLCJhZG9wdFZhbHVlIiwibm9WYWx1ZSIsIkNhbGxiYWNrcyIsImZsYWciLCJjcmVhdGVPcHRpb25zIiwiZmlyaW5nIiwibWVtb3J5IiwiZmlyZWQiLCJsb2NrZWQiLCJmaXJpbmdJbmRleCIsImZpcmUiLCJzdG9wT25GYWxzZSIsInJlbW92ZSIsImVtcHR5IiwiZGlzYWJsZSIsImxvY2siLCJmaXJlV2l0aCIsIkRlZmVycmVkIiwiZnVuYyIsInR1cGxlcyIsImFsd2F5cyIsImRlZmVycmVkIiwicGlwZSIsImZucyIsIm5ld0RlZmVyIiwidHVwbGUiLCJyZXR1cm5lZCIsInByb2dyZXNzIiwib25Qcm9ncmVzcyIsIm1heERlcHRoIiwic3BlY2lhbCIsIm1pZ2h0VGhyb3ciLCJub3RpZnlXaXRoIiwicmVzb2x2ZVdpdGgiLCJleGNlcHRpb25Ib29rIiwic3RhY2tUcmFjZSIsInJlamVjdFdpdGgiLCJnZXRTdGFja0hvb2siLCJzdGF0ZVN0cmluZyIsIndoZW4iLCJzaW5nbGVWYWx1ZSIsInJlc29sdmVDb250ZXh0cyIsInJlc29sdmVWYWx1ZXMiLCJtYXN0ZXIiLCJ1cGRhdGVGdW5jIiwicmVycm9yTmFtZXMiLCJzdGFjayIsIndhcm4iLCJyZWFkeUV4Y2VwdGlvbiIsInJlYWR5TGlzdCIsImNvbXBsZXRlZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjYXRjaCIsInJlYWR5V2FpdCIsIndhaXQiLCJyZWFkeVN0YXRlIiwiZG9TY3JvbGwiLCJhY2Nlc3MiLCJjaGFpbmFibGUiLCJlbXB0eUdldCIsImJ1bGsiLCJfa2V5Iiwicm1zUHJlZml4IiwicmRhc2hBbHBoYSIsImZjYW1lbENhc2UiLCJfYWxsIiwibGV0dGVyIiwidG9VcHBlckNhc2UiLCJjYW1lbENhc2UiLCJhY2NlcHREYXRhIiwiRGF0YSIsInByb3AiLCJoYXNEYXRhIiwiZGF0YVByaXYiLCJkYXRhVXNlciIsInJicmFjZSIsInJtdWx0aURhc2giLCJkYXRhQXR0ciIsInBhcnNlIiwiZ2V0RGF0YSIsInJlbW92ZURhdGEiLCJfZGF0YSIsIl9yZW1vdmVEYXRhIiwiZGVxdWV1ZSIsInN0YXJ0TGVuZ3RoIiwiaG9va3MiLCJfcXVldWVIb29rcyIsImNsZWFyUXVldWUiLCJwbnVtIiwicmNzc051bSIsImNzc0V4cGFuZCIsImlzQXR0YWNoZWQiLCJjb21wb3NlZCIsImdldFJvb3ROb2RlIiwiaXNIaWRkZW5XaXRoaW5UcmVlIiwiY3NzIiwiYWRqdXN0Q1NTIiwidmFsdWVQYXJ0cyIsInR3ZWVuIiwiYWRqdXN0ZWQiLCJtYXhJdGVyYXRpb25zIiwiaW5pdGlhbCIsInVuaXQiLCJjc3NOdW1iZXIiLCJpbml0aWFsSW5Vbml0IiwiZGVmYXVsdERpc3BsYXlNYXAiLCJnZXREZWZhdWx0RGlzcGxheSIsInNob3dIaWRlIiwic2hvdyIsImhpZGUiLCJyY2hlY2thYmxlVHlwZSIsInJ0YWdOYW1lIiwicnNjcmlwdFR5cGUiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiY2hlY2tDbG9uZSIsImNsb25lTm9kZSIsIm5vQ2xvbmVDaGVja2VkIiwib3B0aW9uIiwid3JhcE1hcCIsInRoZWFkIiwiY29sIiwidHIiLCJ0ZCIsIl9kZWZhdWx0Iiwic2V0R2xvYmFsRXZhbCIsInJlZkVsZW1lbnRzIiwidGJvZHkiLCJ0Zm9vdCIsImNvbGdyb3VwIiwiY2FwdGlvbiIsInRoIiwib3B0Z3JvdXAiLCJidWlsZEZyYWdtZW50Iiwic2NyaXB0cyIsInNlbGVjdGlvbiIsImlnbm9yZWQiLCJhdHRhY2hlZCIsIm5vZGVzIiwiaHRtbFByZWZpbHRlciIsInJrZXlFdmVudCIsInJtb3VzZUV2ZW50IiwicnR5cGVuYW1lc3BhY2UiLCJyZXR1cm5UcnVlIiwicmV0dXJuRmFsc2UiLCJleHBlY3RTeW5jIiwic2FmZUFjdGl2ZUVsZW1lbnQiLCJ0eXBlcyIsIm9uZSIsIm9yaWdGbiIsImxldmVyYWdlTmF0aXZlIiwibm90QXN5bmMiLCJzYXZlZCIsImlzVHJpZ2dlciIsImRlbGVnYXRlVHlwZSIsInN0b3BQcm9wYWdhdGlvbiIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidHJpZ2dlciIsIkV2ZW50IiwiaGFuZGxlT2JqSW4iLCJldmVudEhhbmRsZSIsImhhbmRsZU9iaiIsIm5hbWVzcGFjZXMiLCJvcmlnVHlwZSIsImVsZW1EYXRhIiwiaGFuZGxlIiwidHJpZ2dlcmVkIiwiZGlzcGF0Y2giLCJiaW5kVHlwZSIsImRlbGVnYXRlQ291bnQiLCJzZXR1cCIsIm1hcHBlZFR5cGVzIiwib3JpZ0NvdW50IiwidGVhcmRvd24iLCJyZW1vdmVFdmVudCIsIm5hdGl2ZUV2ZW50IiwiaGFuZGxlclF1ZXVlIiwiZGVsZWdhdGVUYXJnZXQiLCJwcmVEaXNwYXRjaCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiY3VycmVudFRhcmdldCIsImlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkIiwicm5hbWVzcGFjZSIsInBvc3REaXNwYXRjaCIsIm1hdGNoZWRIYW5kbGVycyIsIm1hdGNoZWRTZWxlY3RvcnMiLCJidXR0b24iLCJhZGRQcm9wIiwiaG9vayIsIm9yaWdpbmFsRXZlbnQiLCJsb2FkIiwibm9CdWJibGUiLCJjbGljayIsImJlZm9yZXVubG9hZCIsInJldHVyblZhbHVlIiwicHJvcHMiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJkZWZhdWx0UHJldmVudGVkIiwicmVsYXRlZFRhcmdldCIsInRpbWVTdGFtcCIsImlzU2ltdWxhdGVkIiwiYWx0S2V5IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJjaGFuZ2VkVG91Y2hlcyIsImN0cmxLZXkiLCJkZXRhaWwiLCJldmVudFBoYXNlIiwibWV0YUtleSIsInBhZ2VYIiwicGFnZVkiLCJzaGlmdEtleSIsImNoYXJDb2RlIiwia2V5Q29kZSIsImJ1dHRvbnMiLCJjbGllbnRYIiwiY2xpZW50WSIsIm9mZnNldFgiLCJvZmZzZXRZIiwicG9pbnRlcklkIiwicG9pbnRlclR5cGUiLCJzY3JlZW5YIiwic2NyZWVuWSIsInRhcmdldFRvdWNoZXMiLCJ0b0VsZW1lbnQiLCJ0b3VjaGVzIiwid2hpY2giLCJmb2N1cyIsImJsdXIiLCJtb3VzZWVudGVyIiwibW91c2VsZWF2ZSIsInBvaW50ZXJlbnRlciIsInBvaW50ZXJsZWF2ZSIsIm9yaWciLCJyZWxhdGVkIiwicm5vSW5uZXJodG1sIiwicmNoZWNrZWQiLCJyY2xlYW5TY3JpcHQiLCJtYW5pcHVsYXRpb25UYXJnZXQiLCJkaXNhYmxlU2NyaXB0IiwicmVzdG9yZVNjcmlwdCIsImNsb25lQ29weUV2ZW50IiwiZGVzdCIsInVkYXRhT2xkIiwidWRhdGFDdXIiLCJmaXhJbnB1dCIsImRvbU1hbmlwIiwiaGFzU2NyaXB0cyIsImlOb0Nsb25lIiwidmFsdWVJc0Z1bmN0aW9uIiwiX2V2YWxVcmwiLCJrZWVwRGF0YSIsImNsZWFuRGF0YSIsImRhdGFBbmRFdmVudHMiLCJkZWVwRGF0YUFuZEV2ZW50cyIsInNyY0VsZW1lbnRzIiwiZGVzdEVsZW1lbnRzIiwiaW5QYWdlIiwiZGV0YWNoIiwicHJlcGVuZCIsImluc2VydEJlZm9yZSIsImJlZm9yZSIsImFmdGVyIiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlQ2hpbGQiLCJhcHBlbmRUbyIsInByZXBlbmRUbyIsImluc2VydEFmdGVyIiwiaW5zZXJ0Iiwicm51bW5vbnB4IiwiZ2V0U3R5bGVzIiwib3BlbmVyIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9sZCIsInJib3hTdHlsZSIsImN1ckNTUyIsImNvbXB1dGVkIiwid2lkdGgiLCJtaW5XaWR0aCIsIm1heFdpZHRoIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInBpeGVsQm94U3R5bGVzIiwiYWRkR2V0SG9va0lmIiwiY29uZGl0aW9uRm4iLCJob29rRm4iLCJjb21wdXRlU3R5bGVUZXN0cyIsImNvbnRhaW5lciIsImNzc1RleHQiLCJkaXZTdHlsZSIsInBpeGVsUG9zaXRpb25WYWwiLCJyZWxpYWJsZU1hcmdpbkxlZnRWYWwiLCJyb3VuZFBpeGVsTWVhc3VyZXMiLCJtYXJnaW5MZWZ0IiwicGl4ZWxCb3hTdHlsZXNWYWwiLCJib3hTaXppbmdSZWxpYWJsZVZhbCIsInNjcm9sbGJveFNpemVWYWwiLCJvZmZzZXRXaWR0aCIsIm1lYXN1cmUiLCJyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCIsImJhY2tncm91bmRDbGlwIiwiY2xlYXJDbG9uZVN0eWxlIiwiYm94U2l6aW5nUmVsaWFibGUiLCJwaXhlbFBvc2l0aW9uIiwicmVsaWFibGVNYXJnaW5MZWZ0Iiwic2Nyb2xsYm94U2l6ZSIsInJlbGlhYmxlVHJEaW1lbnNpb25zIiwidGFibGUiLCJ0ckNoaWxkIiwidHJTdHlsZSIsImhlaWdodCIsImNzc1ByZWZpeGVzIiwiZW1wdHlTdHlsZSIsInZlbmRvclByb3BzIiwiZmluYWxQcm9wTmFtZSIsImZpbmFsIiwiY3NzUHJvcHMiLCJjYXBOYW1lIiwidmVuZG9yUHJvcE5hbWUiLCJyZGlzcGxheXN3YXAiLCJyY3VzdG9tUHJvcCIsImNzc1Nob3ciLCJ2aXNpYmlsaXR5IiwiY3NzTm9ybWFsVHJhbnNmb3JtIiwibGV0dGVyU3BhY2luZyIsImZvbnRXZWlnaHQiLCJzZXRQb3NpdGl2ZU51bWJlciIsInN1YnRyYWN0IiwiYm94TW9kZWxBZGp1c3RtZW50IiwiZGltZW5zaW9uIiwiYm94IiwiaXNCb3JkZXJCb3giLCJzdHlsZXMiLCJjb21wdXRlZFZhbCIsImdldFdpZHRoT3JIZWlnaHQiLCJ2YWx1ZUlzQm9yZGVyQm94Iiwib2Zmc2V0UHJvcCIsImdldENsaWVudFJlY3RzIiwiVHdlZW4iLCJlYXNpbmciLCJjc3NIb29rcyIsIm9wYWNpdHkiLCJvcmlnTmFtZSIsImlzQ3VzdG9tUHJvcCIsInNldFByb3BlcnR5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2Nyb2xsYm94U2l6ZUJ1Z2d5IiwibWFyZ2luIiwicGFkZGluZyIsImJvcmRlciIsInN1ZmZpeCIsImV4cGFuZCIsImV4cGFuZGVkIiwicHJvcEhvb2tzIiwicGVyY2VudCIsImVhc2VkIiwiZHVyYXRpb24iLCJmeCIsInNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJsaW5lYXIiLCJzd2luZyIsImNvcyIsImZ4Tm93IiwiaW5Qcm9ncmVzcyIsInJmeHR5cGVzIiwicnJ1biIsInNjaGVkdWxlIiwiaGlkZGVuIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiaW50ZXJ2YWwiLCJ0aWNrIiwiY3JlYXRlRnhOb3ciLCJnZW5GeCIsImluY2x1ZGVXaWR0aCIsImNyZWF0ZVR3ZWVuIiwiYW5pbWF0aW9uIiwiQW5pbWF0aW9uIiwidHdlZW5lcnMiLCJwcmVmaWx0ZXJzIiwiY3VycmVudFRpbWUiLCJzdGFydFRpbWUiLCJ0d2VlbnMiLCJvcHRzIiwic3BlY2lhbEVhc2luZyIsIm9yaWdpbmFsUHJvcGVydGllcyIsIm9yaWdpbmFsT3B0aW9ucyIsImdvdG9FbmQiLCJwcm9wRmlsdGVyIiwidGltZXIiLCJhbmltIiwidHdlZW5lciIsIm9sZGZpcmUiLCJwcm9wVHdlZW4iLCJyZXN0b3JlRGlzcGxheSIsImlzQm94IiwiZGF0YVNob3ciLCJ1bnF1ZXVlZCIsIm92ZXJmbG93Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwicHJlZmlsdGVyIiwic3BlZWQiLCJvcHQiLCJzcGVlZHMiLCJmYWRlVG8iLCJhbmltYXRlIiwib3B0YWxsIiwiZG9BbmltYXRpb24iLCJmaW5pc2giLCJzdG9wUXVldWUiLCJ0aW1lcnMiLCJjc3NGbiIsInNsaWRlRG93biIsInNsaWRlVXAiLCJzbGlkZVRvZ2dsZSIsImZhZGVJbiIsImZhZGVPdXQiLCJmYWRlVG9nZ2xlIiwic2xvdyIsImZhc3QiLCJkZWxheSIsInRpbWUiLCJjbGVhclRpbWVvdXQiLCJjaGVja09uIiwib3B0U2VsZWN0ZWQiLCJyYWRpb1ZhbHVlIiwiYm9vbEhvb2siLCJyZW1vdmVBdHRyIiwiblR5cGUiLCJhdHRySG9va3MiLCJib29sIiwiYXR0ck5hbWVzIiwibG93ZXJjYXNlTmFtZSIsInJmb2N1c2FibGUiLCJyY2xpY2thYmxlIiwic3RyaXBBbmRDb2xsYXBzZSIsImdldENsYXNzIiwiY2xhc3Nlc1RvQXJyYXkiLCJyZW1vdmVQcm9wIiwicHJvcEZpeCIsInRhYmluZGV4IiwiYWRkQ2xhc3MiLCJjbGFzc2VzIiwiY3VyVmFsdWUiLCJjbGF6eiIsImZpbmFsVmFsdWUiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwic3RhdGVWYWwiLCJpc1ZhbGlkVmFsdWUiLCJjbGFzc05hbWVzIiwiaGFzQ2xhc3MiLCJycmV0dXJuIiwidmFsSG9va3MiLCJvcHRpb25TZXQiLCJmb2N1c2luIiwicmZvY3VzTW9ycGgiLCJzdG9wUHJvcGFnYXRpb25DYWxsYmFjayIsIm9ubHlIYW5kbGVycyIsImJ1YmJsZVR5cGUiLCJvbnR5cGUiLCJsYXN0RWxlbWVudCIsImV2ZW50UGF0aCIsInNpbXVsYXRlIiwidHJpZ2dlckhhbmRsZXIiLCJhdHRhY2hlcyIsInJxdWVyeSIsInBhcnNlWE1MIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmJyYWNrZXQiLCJyQ1JMRiIsInJzdWJtaXR0ZXJUeXBlcyIsInJzdWJtaXR0YWJsZSIsImJ1aWxkUGFyYW1zIiwidHJhZGl0aW9uYWwiLCJwYXJhbSIsInZhbHVlT3JGdW5jdGlvbiIsInNlcmlhbGl6ZUFycmF5IiwicjIwIiwicmhhc2giLCJyYW50aUNhY2hlIiwicmhlYWRlcnMiLCJybm9Db250ZW50IiwicnByb3RvY29sIiwidHJhbnNwb3J0cyIsImFsbFR5cGVzIiwib3JpZ2luQW5jaG9yIiwiYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzIiwic3RydWN0dXJlIiwiZGF0YVR5cGVFeHByZXNzaW9uIiwiZGF0YVR5cGUiLCJkYXRhVHlwZXMiLCJpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyIsImpxWEhSIiwiaW5zcGVjdGVkIiwic2Vla2luZ1RyYW5zcG9ydCIsImluc3BlY3QiLCJwcmVmaWx0ZXJPckZhY3RvcnkiLCJkYXRhVHlwZU9yVHJhbnNwb3J0IiwiYWpheEV4dGVuZCIsImZsYXRPcHRpb25zIiwiYWpheFNldHRpbmdzIiwibGFzdE1vZGlmaWVkIiwiZXRhZyIsImlzTG9jYWwiLCJwcm9jZXNzRGF0YSIsImFzeW5jIiwiY29udGVudFR5cGUiLCJhY2NlcHRzIiwianNvbiIsInJlc3BvbnNlRmllbGRzIiwiY29udmVydGVycyIsImFqYXhTZXR1cCIsInNldHRpbmdzIiwiYWpheFByZWZpbHRlciIsImFqYXhUcmFuc3BvcnQiLCJhamF4IiwidHJhbnNwb3J0IiwiY2FjaGVVUkwiLCJyZXNwb25zZUhlYWRlcnNTdHJpbmciLCJyZXNwb25zZUhlYWRlcnMiLCJ0aW1lb3V0VGltZXIiLCJ1cmxBbmNob3IiLCJmaXJlR2xvYmFscyIsInVuY2FjaGVkIiwiY2FsbGJhY2tDb250ZXh0IiwiZ2xvYmFsRXZlbnRDb250ZXh0IiwiY29tcGxldGVEZWZlcnJlZCIsInN0YXR1c0NvZGUiLCJyZXF1ZXN0SGVhZGVycyIsInJlcXVlc3RIZWFkZXJzTmFtZXMiLCJzdHJBYm9ydCIsImdldFJlc3BvbnNlSGVhZGVyIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwic2V0UmVxdWVzdEhlYWRlciIsIm92ZXJyaWRlTWltZVR5cGUiLCJtaW1lVHlwZSIsImFib3J0Iiwic3RhdHVzVGV4dCIsImZpbmFsVGV4dCIsImNyb3NzRG9tYWluIiwiaGFzQ29udGVudCIsImlmTW9kaWZpZWQiLCJiZWZvcmVTZW5kIiwic3VjY2VzcyIsInNlbmQiLCJuYXRpdmVTdGF0dXNUZXh0IiwicmVzcG9uc2VzIiwiaXNTdWNjZXNzIiwicmVzcG9uc2UiLCJtb2RpZmllZCIsImN0IiwiZmluYWxEYXRhVHlwZSIsImZpcnN0RGF0YVR5cGUiLCJhamF4SGFuZGxlUmVzcG9uc2VzIiwiY29udjIiLCJjdXJyZW50IiwiY29udiIsImRhdGFGaWx0ZXIiLCJ0aHJvd3MiLCJhamF4Q29udmVydCIsImdldEpTT04iLCJnZXRTY3JpcHQiLCJ3cmFwQWxsIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJ3cmFwSW5uZXIiLCJodG1sSXNGdW5jdGlvbiIsInZpc2libGUiLCJvZmZzZXRIZWlnaHQiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInhoclN1Y2Nlc3NTdGF0dXMiLCIxMjIzIiwieGhyU3VwcG9ydGVkIiwiY29ycyIsImVycm9yQ2FsbGJhY2siLCJ4aHJGaWVsZHMiLCJvbmxvYWQiLCJvbmVycm9yIiwib25hYm9ydCIsIm9udGltZW91dCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlc3BvbnNlVHlwZSIsInJlc3BvbnNlVGV4dCIsImJpbmFyeSIsInNjcmlwdEF0dHJzIiwiY2hhcnNldCIsInNjcmlwdENoYXJzZXQiLCJvbGRDYWxsYmFja3MiLCJyanNvbnAiLCJqc29ucCIsImpzb25wQ2FsbGJhY2siLCJvcmlnaW5hbFNldHRpbmdzIiwiY2FsbGJhY2tOYW1lIiwib3ZlcndyaXR0ZW4iLCJyZXNwb25zZUNvbnRhaW5lciIsImpzb25Qcm9wIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiaW1wbGVtZW50YXRpb24iLCJrZWVwU2NyaXB0cyIsInBhcnNlZCIsImFuaW1hdGVkIiwic2V0T2Zmc2V0IiwiY3VyUG9zaXRpb24iLCJjdXJMZWZ0IiwiY3VyQ1NTVG9wIiwiY3VyVG9wIiwiY3VyT2Zmc2V0IiwiY3VyQ1NTTGVmdCIsImN1ckVsZW0iLCJ1c2luZyIsInJlY3QiLCJ3aW4iLCJwYWdlWU9mZnNldCIsInBhZ2VYT2Zmc2V0Iiwib2Zmc2V0UGFyZW50IiwicGFyZW50T2Zmc2V0Iiwic2Nyb2xsVG8iLCJIZWlnaHQiLCJXaWR0aCIsImRlZmF1bHRFeHRyYSIsImZ1bmNOYW1lIiwidW5iaW5kIiwiZGVsZWdhdGUiLCJ1bmRlbGVnYXRlIiwiaG92ZXIiLCJmbk92ZXIiLCJmbk91dCIsImhvbGRSZWFkeSIsImhvbGQiLCJwYXJzZUpTT04iLCJpc051bWVyaWMiLCJfalF1ZXJ5IiwiXyQiLCJub0NvbmZsaWN0IiwiZnJlZUV4cG9ydHMiLCJmcmVlTW9kdWxlIiwiQnVmZmVyIiwiYWxsb2NVbnNhZmUiLCJpc0RlZXAiLCJmcmVlUHJvY2VzcyIsInJlcXVpcmUiLCJiaW5kaW5nIiwiZnJlZVNlbGYiLCJpc0J1ZmZlciIsIl9jcmVhdGVDbGFzcyIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl9jbGFzc0NhbGxDaGVjayIsIk1pbmlTaWduYWxCaW5kaW5nIiwiX2ZuIiwiX29uY2UiLCJfdGhpc0FyZyIsIl9uZXh0IiwiX3ByZXYiLCJfb3duZXIiLCJfYWRkTWluaVNpZ25hbEJpbmRpbmciLCJfaGVhZCIsIl90YWlsIiwiTWluaVNpZ25hbCIsImV4aXN0cyIsIm1vbWVudCIsImRlZmluZUxvY2FsZSIsIm1vbnRocyIsIm1vbnRoc1Nob3J0Iiwid2Vla2RheXMiLCJ3ZWVrZGF5c1Nob3J0Iiwid2Vla2RheXNNaW4iLCJtZXJpZGllbVBhcnNlIiwiaXNQTSIsIm1lcmlkaWVtIiwiaG91cnMiLCJtaW51dGVzIiwiaXNMb3dlciIsImxvbmdEYXRlRm9ybWF0IiwiTFRTIiwiTCIsIkxMIiwiTExMIiwiTExMTCIsImNhbGVuZGFyIiwic2FtZURheSIsIm5leHREYXkiLCJuZXh0V2VlayIsImxhc3REYXkiLCJsYXN0V2VlayIsInNhbWVFbHNlIiwicmVsYXRpdmVUaW1lIiwiZnV0dXJlIiwicGFzdCIsInNzIiwibW0iLCJoIiwiaGgiLCJkZCIsIk0iLCJNTSIsInl5IiwiZGF5T2ZNb250aE9yZGluYWxQYXJzZSIsIm9yZGluYWwiLCJ3ZWVrIiwiZG93IiwiZG95Iiwid2Vla2RheXNQYXJzZUV4YWN0Iiwic3ltYm9sTWFwIiwicGx1cmFsRm9ybSIsInBsdXJhbHMiLCJwbHVyYWxpemUiLCJ3aXRob3V0U3VmZml4IiwiaXNGdXR1cmUiLCJob3VyIiwibWludXRlIiwicHJlcGFyc2UiLCJwb3N0Zm9ybWF0IiwibnVtYmVyTWFwIiwic3VmZml4ZXMiLCI1IiwiOCIsIjcwIiwiODAiLCIyIiwiNyIsIjIwIiwiNTAiLCIzIiwiNCIsIjEwMCIsIjYiLCI5IiwiMTAiLCIzMCIsIjYwIiwiOTAiLCJwbHVyYWwiLCJ3b3JkIiwiZm9ybXMiLCJyZWxhdGl2ZVRpbWVXaXRoUGx1cmFsIiwiZm9ybWF0Iiwic3RhbmRhbG9uZSIsImlzRm9ybWF0IiwiZGF5IiwicGVyaW9kIiwibGFzdERpZ2l0IiwibGFzdDJEaWdpdHMiLCJtZXJpZGllbUhvdXIiLCJyZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24iLCJtdXRhdGlvbiIsInNwZWNpYWxNdXRhdGlvbkZvclllYXJzIiwibGFzdE51bWJlciIsInNvZnRNdXRhdGlvbiIsIm11dGF0aW9uVGFibGUiLCJzdWJzdHJpbmciLCJ0cmFuc2xhdGUiLCJtb250aHNQYXJzZUV4YWN0IiwibGwiLCJsbGwiLCJsbGxsIiwibW9udGhzUGFyc2UiLCJtb250aHNSZWdleCIsIm1vbnRoc1Nob3J0UmVnZXgiLCJtb250aHNTdHJpY3RSZWdleCIsIm1vbnRoc1Nob3J0U3RyaWN0UmVnZXgiLCJsb25nTW9udGhzUGFyc2UiLCJzaG9ydE1vbnRoc1BhcnNlIiwicHJvY2Vzc1JlbGF0aXZlVGltZSIsIm1vbnRoc05vbWluYXRpdmVFbCIsIm1vbnRoc0dlbml0aXZlRWwiLCJtb21lbnRUb0Zvcm1hdCIsIl9tb250aHNHZW5pdGl2ZUVsIiwibW9udGgiLCJfbW9udGhzTm9taW5hdGl2ZUVsIiwiY2FsZW5kYXJFbCIsIm1vbSIsIl9jYWxlbmRhckVsIiwibW9udGhzU2hvcnREb3QiLCJudW1iZXJzUGFzdCIsIm51bWJlcnNGdXR1cmUiLCJ2ZXJiYWxOdW1iZXIiLCJtb250aHNTaG9ydFdpdGhEb3RzIiwibW9udGhzU2hvcnRXaXRob3V0RG90cyIsIndlZWtFbmRpbmdzIiwiNDAiLCJpc1VwcGVyIiwicHJvY2Vzc0Z1dHVyZVRpbWUiLCJlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIiLCJzdWJzdHIiLCJwcm9jZXNzUGFzdFRpbWUiLCJ1bml0cyIsInRyYW5zbGF0ZVNlY29uZHMiLCJ0cmFuc2xhdGVTaW5ndWxhciIsInJlbGF0aXZlVGltZVdpdGhTaW5ndWxhciIsInJlbGF0aXZlU2Vjb25kcyIsInRyYW5zbGF0b3IiLCJ3b3JkcyIsImNvcnJlY3RHcmFtbWF0aWNhbENhc2UiLCJ3b3JkS2V5IiwicmVsYXRpdmVUaW1lTXIiLCJtb250aHNOb21pbmF0aXZlIiwibW9udGhzU3ViamVjdGl2ZSIsImRheXMiLCIxMiIsIjEzIiwibnVtYmVyc05vdW5zIiwidHJhbnNsYXRlRnV0dXJlIiwidHJhbnNsYXRlUGFzdCIsIm51bWJlck5vdW4iLCJudW1iZXJBc05vdW4iLCJodW5kcmVkIiwidGVuIiwiaG0iLCJ3ZWVrZGF5c0Nhc2VSZXBsYWNlIiwicHJvY2Vzc0hvdXJzRnVuY3Rpb24iLCJ3ZWJwYWNrQ29udGV4dCIsInJlcSIsIndlYnBhY2tDb250ZXh0UmVzb2x2ZSIsIl9fd2VicGFja19yZXF1aXJlX18iLCJvIiwiaG9va0NhbGxiYWNrIiwic2V0SG9va0NhbGxiYWNrIiwiaXNPYmplY3RFbXB0eSIsImlzVW5kZWZpbmVkIiwiaXNOdW1iZXIiLCJpc0RhdGUiLCJoYXNPd25Qcm9wIiwiY3JlYXRlVVRDIiwibG9jYWxlIiwic3RyaWN0IiwiY3JlYXRlTG9jYWxPclVUQyIsInV0YyIsImRlZmF1bHRQYXJzaW5nRmxhZ3MiLCJ1bnVzZWRUb2tlbnMiLCJ1bnVzZWRJbnB1dCIsImNoYXJzTGVmdE92ZXIiLCJudWxsSW5wdXQiLCJpbnZhbGlkTW9udGgiLCJpbnZhbGlkRm9ybWF0IiwidXNlckludmFsaWRhdGVkIiwiaXNvIiwicGFyc2VkRGF0ZVBhcnRzIiwicmZjMjgyMiIsIndlZWtkYXlNaXNtYXRjaCIsImdldFBhcnNpbmdGbGFncyIsIl9wZiIsImlzVmFsaWQiLCJfaXNWYWxpZCIsInBhcnNlZFBhcnRzIiwiaXNOb3dWYWxpZCIsIl9kIiwiaW52YWxpZFdlZWtkYXkiLCJfc3RyaWN0IiwiYmlnSG91ciIsImNyZWF0ZUludmFsaWQiLCJmdW4iLCJtb21lbnRQcm9wZXJ0aWVzIiwiY29weUNvbmZpZyIsIl9pc0FNb21lbnRPYmplY3QiLCJfZiIsIl9sIiwiX3R6bSIsIl9pc1VUQyIsIl9vZmZzZXQiLCJfbG9jYWxlIiwidXBkYXRlSW5Qcm9ncmVzcyIsIk1vbWVudCIsImNvbmZpZyIsInVwZGF0ZU9mZnNldCIsImlzTW9tZW50IiwiYWJzRmxvb3IiLCJ0b0ludCIsImFyZ3VtZW50Rm9yQ29lcmNpb24iLCJjb2VyY2VkTnVtYmVyIiwiY29tcGFyZUFycmF5cyIsImFycmF5MSIsImFycmF5MiIsImRvbnRDb252ZXJ0IiwibGVuZ3RoRGlmZiIsImRpZmZzIiwic3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzIiwiZGVwcmVjYXRlIiwiZGVwcmVjYXRpb25IYW5kbGVyIiwiZGVwcmVjYXRpb25zIiwiZGVwcmVjYXRlU2ltcGxlIiwiX2NvbmZpZyIsIl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCIsIl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIiwiX29yZGluYWxQYXJzZSIsIm1lcmdlQ29uZmlncyIsInBhcmVudENvbmZpZyIsImNoaWxkQ29uZmlnIiwiTG9jYWxlIiwiZGVmYXVsdENhbGVuZGFyIiwiX2NhbGVuZGFyIiwiZGVmYXVsdExvbmdEYXRlRm9ybWF0IiwiX2xvbmdEYXRlRm9ybWF0IiwiZm9ybWF0VXBwZXIiLCJkZWZhdWx0SW52YWxpZERhdGUiLCJpbnZhbGlkRGF0ZSIsIl9pbnZhbGlkRGF0ZSIsImRlZmF1bHRPcmRpbmFsIiwiZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UiLCJfb3JkaW5hbCIsImRlZmF1bHRSZWxhdGl2ZVRpbWUiLCJfcmVsYXRpdmVUaW1lIiwicGFzdEZ1dHVyZSIsImFsaWFzZXMiLCJhZGRVbml0QWxpYXMiLCJzaG9ydGhhbmQiLCJsb3dlckNhc2UiLCJub3JtYWxpemVVbml0cyIsIm5vcm1hbGl6ZU9iamVjdFVuaXRzIiwiaW5wdXRPYmplY3QiLCJub3JtYWxpemVkUHJvcCIsIm5vcm1hbGl6ZWRJbnB1dCIsInByaW9yaXRpZXMiLCJhZGRVbml0UHJpb3JpdHkiLCJwcmlvcml0eSIsImdldFByaW9yaXRpemVkVW5pdHMiLCJ1bml0c09iaiIsInplcm9GaWxsIiwidGFyZ2V0TGVuZ3RoIiwiZm9yY2VTaWduIiwiYWJzTnVtYmVyIiwiemVyb3NUb0ZpbGwiLCJmb3JtYXR0aW5nVG9rZW5zIiwibG9jYWxGb3JtYXR0aW5nVG9rZW5zIiwiZm9ybWF0RnVuY3Rpb25zIiwiZm9ybWF0VG9rZW5GdW5jdGlvbnMiLCJhZGRGb3JtYXRUb2tlbiIsInBhZGRlZCIsImxvY2FsZURhdGEiLCJyZW1vdmVGb3JtYXR0aW5nVG9rZW5zIiwibWFrZUZvcm1hdEZ1bmN0aW9uIiwiZm9ybWF0TW9tZW50IiwiZXhwYW5kRm9ybWF0IiwicmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zIiwibWF0Y2gxIiwibWF0Y2gyIiwibWF0Y2gzIiwibWF0Y2g0IiwibWF0Y2g2IiwibWF0Y2gxdG8yIiwibWF0Y2gzdG80IiwibWF0Y2g1dG82IiwibWF0Y2gxdG8zIiwibWF0Y2gxdG80IiwibWF0Y2gxdG82IiwibWF0Y2hVbnNpZ25lZCIsIm1hdGNoU2lnbmVkIiwibWF0Y2hPZmZzZXQiLCJtYXRjaFNob3J0T2Zmc2V0IiwibWF0Y2hUaW1lc3RhbXAiLCJtYXRjaFdvcmQiLCJyZWdleGVzIiwiYWRkUmVnZXhUb2tlbiIsInJlZ2V4Iiwic3RyaWN0UmVnZXgiLCJpc1N0cmljdCIsImdldFBhcnNlUmVnZXhGb3JUb2tlbiIsInVuZXNjYXBlRm9ybWF0IiwicmVnZXhFc2NhcGUiLCJwMyIsInA0IiwiYWRkUGFyc2VUb2tlbiIsImFkZFdlZWtQYXJzZVRva2VuIiwiX3ciLCJhZGRUaW1lVG9BcnJheUZyb21Ub2tlbiIsIl9hIiwiWUVBUiIsIk1PTlRIIiwiREFURSIsIkhPVVIiLCJNSU5VVEUiLCJTRUNPTkQiLCJNSUxMSVNFQ09ORCIsIldFRUsiLCJXRUVLREFZIiwiZGF5c0luWWVhciIsImlzTGVhcFllYXIiLCJwYXJzZVR3b0RpZ2l0WWVhciIsImdldFNldFllYXIiLCJtYWtlR2V0U2V0IiwiZ2V0SXNMZWFwWWVhciIsImtlZXBUaW1lIiwic2V0JDEiLCJkYXlzSW5Nb250aCIsInN0cmluZ0dldCIsInN0cmluZ1NldCIsInByaW9yaXRpemVkIiwibW9kIiwibW9kTW9udGgiLCJNT05USFNfSU5fRk9STUFUIiwiZGVmYXVsdExvY2FsZU1vbnRocyIsImxvY2FsZU1vbnRocyIsIl9tb250aHMiLCJkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQiLCJsb2NhbGVNb250aHNTaG9ydCIsIl9tb250aHNTaG9ydCIsImhhbmRsZVN0cmljdFBhcnNlIiwibW9udGhOYW1lIiwiaWkiLCJsbGMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIl9tb250aHNQYXJzZSIsIl9sb25nTW9udGhzUGFyc2UiLCJfc2hvcnRNb250aHNQYXJzZSIsImxvY2FsZU1vbnRoc1BhcnNlIiwiX21vbnRoc1BhcnNlRXhhY3QiLCJzZXRNb250aCIsImRheU9mTW9udGgiLCJnZXRTZXRNb250aCIsImdldERheXNJbk1vbnRoIiwiZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXgiLCJjb21wdXRlTW9udGhzUGFyc2UiLCJfbW9udGhzU2hvcnRTdHJpY3RSZWdleCIsIl9tb250aHNTaG9ydFJlZ2V4IiwiZGVmYXVsdE1vbnRoc1JlZ2V4IiwiX21vbnRoc1N0cmljdFJlZ2V4IiwiX21vbnRoc1JlZ2V4IiwiY21wTGVuUmV2Iiwic2hvcnRQaWVjZXMiLCJsb25nUGllY2VzIiwibWl4ZWRQaWVjZXMiLCJjcmVhdGVEYXRlIiwibXMiLCJnZXRGdWxsWWVhciIsInNldEZ1bGxZZWFyIiwiY3JlYXRlVVRDRGF0ZSIsIlVUQyIsInNldFVUQ0Z1bGxZZWFyIiwiZmlyc3RXZWVrT2Zmc2V0IiwiZndkIiwiZ2V0VVRDRGF5IiwiZGF5T2ZZZWFyRnJvbVdlZWtzIiwid2Vla2RheSIsInJlc1llYXIiLCJyZXNEYXlPZlllYXIiLCJkYXlPZlllYXIiLCJ3ZWVrT2ZZZWFyIiwicmVzV2VlayIsIndlZWtPZmZzZXQiLCJ3ZWVrc0luWWVhciIsIndlZWtPZmZzZXROZXh0IiwibG9jYWxlV2VlayIsIl93ZWVrIiwiZGVmYXVsdExvY2FsZVdlZWsiLCJsb2NhbGVGaXJzdERheU9mV2VlayIsImxvY2FsZUZpcnN0RGF5T2ZZZWFyIiwiZ2V0U2V0V2VlayIsImdldFNldElTT1dlZWsiLCJwYXJzZVdlZWtkYXkiLCJ3ZWVrZGF5c1BhcnNlIiwicGFyc2VJc29XZWVrZGF5Iiwic2hpZnRXZWVrZGF5cyIsIndlZWtkYXlzTWluUmVnZXgiLCJ3ZWVrZGF5c1Nob3J0UmVnZXgiLCJ3ZWVrZGF5c1JlZ2V4IiwiZGVmYXVsdExvY2FsZVdlZWtkYXlzIiwibG9jYWxlV2Vla2RheXMiLCJfd2Vla2RheXMiLCJkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCIsImxvY2FsZVdlZWtkYXlzU2hvcnQiLCJfd2Vla2RheXNTaG9ydCIsImRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiIsImxvY2FsZVdlZWtkYXlzTWluIiwiX3dlZWtkYXlzTWluIiwiaGFuZGxlU3RyaWN0UGFyc2UkMSIsIndlZWtkYXlOYW1lIiwiX3dlZWtkYXlzUGFyc2UiLCJfc2hvcnRXZWVrZGF5c1BhcnNlIiwiX21pbldlZWtkYXlzUGFyc2UiLCJsb2NhbGVXZWVrZGF5c1BhcnNlIiwiX3dlZWtkYXlzUGFyc2VFeGFjdCIsIl9mdWxsV2Vla2RheXNQYXJzZSIsImdldFNldERheU9mV2VlayIsImdldERheSIsImdldFNldExvY2FsZURheU9mV2VlayIsImdldFNldElTT0RheU9mV2VlayIsImRlZmF1bHRXZWVrZGF5c1JlZ2V4IiwiY29tcHV0ZVdlZWtkYXlzUGFyc2UiLCJfd2Vla2RheXNTdHJpY3RSZWdleCIsIl93ZWVrZGF5c1JlZ2V4IiwiZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCIsIl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXgiLCJfd2Vla2RheXNTaG9ydFJlZ2V4IiwiZGVmYXVsdFdlZWtkYXlzTWluUmVnZXgiLCJfd2Vla2RheXNNaW5TdHJpY3RSZWdleCIsIl93ZWVrZGF5c01pblJlZ2V4IiwibWlucCIsInNob3J0cCIsImxvbmdwIiwibWluUGllY2VzIiwiaEZvcm1hdCIsImtGb3JtYXQiLCJsb3dlcmNhc2UiLCJtYXRjaE1lcmlkaWVtIiwiX21lcmlkaWVtUGFyc2UiLCJsb2NhbGVJc1BNIiwic2Vjb25kcyIsImtJbnB1dCIsIl9pc1BtIiwiX21lcmlkaWVtIiwicG9zMSIsInBvczIiLCJkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSIsImxvY2FsZU1lcmlkaWVtIiwiZ2xvYmFsTG9jYWxlIiwiZ2V0U2V0SG91ciIsImJhc2VDb25maWciLCJsb2NhbGVzIiwibG9jYWxlRmFtaWxpZXMiLCJub3JtYWxpemVMb2NhbGUiLCJjaG9vc2VMb2NhbGUiLCJsb2FkTG9jYWxlIiwib2xkTG9jYWxlIiwiX2FiYnIiLCJnZXRTZXRHbG9iYWxMb2NhbGUiLCJnZXRMb2NhbGUiLCJhYmJyIiwicGFyZW50TG9jYWxlIiwidXBkYXRlTG9jYWxlIiwidG1wTG9jYWxlIiwibGlzdExvY2FsZXMiLCJjaGVja092ZXJmbG93IiwiX292ZXJmbG93RGF5T2ZZZWFyIiwiX292ZXJmbG93V2Vla3MiLCJfb3ZlcmZsb3dXZWVrZGF5IiwiZGVmYXVsdHMiLCJjdXJyZW50RGF0ZUFycmF5Iiwibm93VmFsdWUiLCJfdXNlVVRDIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiY29uZmlnRnJvbUFycmF5IiwiY3VycmVudERhdGUiLCJleHBlY3RlZFdlZWtkYXkiLCJ5ZWFyVG9Vc2UiLCJkYXlPZlllYXJGcm9tV2Vla0luZm8iLCJfZGF5T2ZZZWFyIiwiX25leHREYXkiLCJzZXRVVENNaW51dGVzIiwid2Vla1llYXIiLCJ3ZWVrZGF5T3ZlcmZsb3ciLCJHRyIsIlciLCJjcmVhdGVMb2NhbCIsImN1cldlZWsiLCJnZyIsImV4dGVuZGVkSXNvUmVnZXgiLCJiYXNpY0lzb1JlZ2V4IiwidHpSZWdleCIsImlzb0RhdGVzIiwiaXNvVGltZXMiLCJhc3BOZXRKc29uUmVnZXgiLCJjb25maWdGcm9tSVNPIiwiYWxsb3dUaW1lIiwiZGF0ZUZvcm1hdCIsInRpbWVGb3JtYXQiLCJ0ekZvcm1hdCIsImNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQiLCJleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzIiwieWVhclN0ciIsIm1vbnRoU3RyIiwiZGF5U3RyIiwiaG91clN0ciIsIm1pbnV0ZVN0ciIsInNlY29uZFN0ciIsInVudHJ1bmNhdGVZZWFyIiwicHJlcHJvY2Vzc1JGQzI4MjIiLCJjaGVja1dlZWtkYXkiLCJ3ZWVrZGF5U3RyIiwicGFyc2VkSW5wdXQiLCJvYnNPZmZzZXRzIiwiVVQiLCJHTVQiLCJFRFQiLCJFU1QiLCJDRFQiLCJDU1QiLCJNRFQiLCJNU1QiLCJQRFQiLCJQU1QiLCJjYWxjdWxhdGVPZmZzZXQiLCJvYnNPZmZzZXQiLCJtaWxpdGFyeU9mZnNldCIsIm51bU9mZnNldCIsImNvbmZpZ0Zyb21SRkMyODIyIiwicGFyc2VkQXJyYXkiLCJjb25maWdGcm9tU3RyaW5nIiwiY3JlYXRlRnJvbUlucHV0RmFsbGJhY2siLCJJU09fODYwMSIsIlJGQ18yODIyIiwic2tpcHBlZCIsInRvdGFsUGFyc2VkSW5wdXRMZW5ndGgiLCJtZXJpZGllbUZpeFdyYXAiLCJpc1BtIiwiY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5IiwidGVtcENvbmZpZyIsImJlc3RNb21lbnQiLCJzY29yZVRvQmVhdCIsImN1cnJlbnRTY29yZSIsInNjb3JlIiwiY29uZmlnRnJvbU9iamVjdCIsIm1pbGxpc2Vjb25kIiwiY3JlYXRlRnJvbUNvbmZpZyIsInByZXBhcmVDb25maWciLCJjb25maWdGcm9tSW5wdXQiLCJpc1VUQyIsInByb3RvdHlwZU1pbiIsIm90aGVyIiwicHJvdG90eXBlTWF4IiwicGlja0J5IiwibW9tZW50cyIsIm9yZGVyaW5nIiwiaXNEdXJhdGlvblZhbGlkIiwidW5pdEhhc0RlY2ltYWwiLCJpc1ZhbGlkJDEiLCJjcmVhdGVJbnZhbGlkJDEiLCJjcmVhdGVEdXJhdGlvbiIsIkR1cmF0aW9uIiwieWVhcnMiLCJxdWFydGVycyIsInF1YXJ0ZXIiLCJ3ZWVrcyIsImlzb1dlZWsiLCJfbWlsbGlzZWNvbmRzIiwiX2RheXMiLCJfYnViYmxlIiwiaXNEdXJhdGlvbiIsImFic1JvdW5kIiwidXRjT2Zmc2V0Iiwib2Zmc2V0RnJvbVN0cmluZyIsImNodW5rT2Zmc2V0IiwiY2xvbmVXaXRoT2Zmc2V0IiwibW9kZWwiLCJzZXRUaW1lIiwibG9jYWwiLCJnZXREYXRlT2Zmc2V0IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRTZXRPZmZzZXQiLCJrZWVwTG9jYWxUaW1lIiwia2VlcE1pbnV0ZXMiLCJsb2NhbEFkanVzdCIsIl9jaGFuZ2VJblByb2dyZXNzIiwiYWRkU3VidHJhY3QiLCJnZXRTZXRab25lIiwic2V0T2Zmc2V0VG9VVEMiLCJzZXRPZmZzZXRUb0xvY2FsIiwic2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQiLCJ0Wm9uZSIsImhhc0FsaWduZWRIb3VyT2Zmc2V0IiwiaXNEYXlsaWdodFNhdmluZ1RpbWUiLCJpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQiLCJfaXNEU1RTaGlmdGVkIiwiaXNVdGNPZmZzZXQiLCJpc1V0YyIsImFzcE5ldFJlZ2V4IiwiaXNvUmVnZXgiLCJkaWZmUmVzIiwicGFyc2VJc28iLCJtb21lbnRzRGlmZmVyZW5jZSIsImlucCIsInBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UiLCJpc0FmdGVyIiwiaXNCZWZvcmUiLCJjcmVhdGVBZGRlciIsImRpcmVjdGlvbiIsImlzQWRkaW5nIiwiaW52YWxpZCIsImdldENhbGVuZGFyRm9ybWF0IiwibXlNb21lbnQiLCJjYWxlbmRhciQxIiwiZm9ybWF0cyIsInNvZCIsInN0YXJ0T2YiLCJjYWxlbmRhckZvcm1hdCIsImxvY2FsSW5wdXQiLCJlbmRPZiIsImlzQmV0d2VlbiIsImluY2x1c2l2aXR5IiwibG9jYWxGcm9tIiwibG9jYWxUbyIsImlzU2FtZSIsImlucHV0TXMiLCJpc1NhbWVPckFmdGVyIiwiaXNTYW1lT3JCZWZvcmUiLCJhc0Zsb2F0Iiwiem9uZURlbHRhIiwibW9udGhEaWZmIiwid2hvbGVNb250aERpZmYiLCJrZWVwT2Zmc2V0IiwidG9EYXRlIiwiem9uZSIsImRhdGV0aW1lIiwiaW5wdXRTdHJpbmciLCJkZWZhdWx0Rm9ybWF0VXRjIiwiZGVmYXVsdEZvcm1hdCIsImh1bWFuaXplIiwiZnJvbU5vdyIsInRvTm93IiwibmV3TG9jYWxlRGF0YSIsIk1TX1BFUl9TRUNPTkQiLCJNU19QRVJfTUlOVVRFIiwiTVNfUEVSX0hPVVIiLCJNU19QRVJfNDAwX1lFQVJTIiwibW9kJDEiLCJkaXZpZGVuZCIsImRpdmlzb3IiLCJsb2NhbFN0YXJ0T2ZEYXRlIiwidXRjU3RhcnRPZkRhdGUiLCJzdGFydE9mRGF0ZSIsImlzb1dlZWtkYXkiLCJ1bml4IiwiaXNWYWxpZCQyIiwicGFyc2luZ0ZsYWdzIiwiaW52YWxpZEF0IiwiY3JlYXRpb25EYXRhIiwiYWRkV2Vla1llYXJGb3JtYXRUb2tlbiIsImdldFNldFdlZWtZZWFyIiwiZ2V0U2V0V2Vla1llYXJIZWxwZXIiLCJnZXRTZXRJU09XZWVrWWVhciIsImdldElTT1dlZWtzSW5ZZWFyIiwiZ2V0V2Vla3NJblllYXIiLCJ3ZWVrSW5mbyIsIndlZWtzVGFyZ2V0Iiwic2V0V2Vla0FsbCIsImRheU9mWWVhckRhdGEiLCJnZXRTZXRRdWFydGVyIiwiaXNvV2Vla1llYXIiLCJnZXRTZXREYXlPZk1vbnRoIiwiZ2V0U2V0RGF5T2ZZZWFyIiwiZ2V0U2V0TWludXRlIiwiZ2V0U2V0U2Vjb25kIiwicGFyc2VNcyIsImdldFNldE1pbGxpc2Vjb25kIiwiZ2V0Wm9uZUFiYnIiLCJnZXRab25lTmFtZSIsImNyZWF0ZVVuaXgiLCJjcmVhdGVJblpvbmUiLCJwYXJzZVpvbmUiLCJwcmVQYXJzZVBvc3RGb3JtYXQiLCJpc29XZWVrcyIsImlzb1dlZWtzSW5ZZWFyIiwiaXNEU1QiLCJ6b25lQWJiciIsInpvbmVOYW1lIiwiZGF0ZXMiLCJpc0RTVFNoaWZ0ZWQiLCJwcm90byQxIiwiZ2V0JDEiLCJmaWVsZCIsImxpc3RNb250aHNJbXBsIiwib3V0IiwibGlzdFdlZWtkYXlzSW1wbCIsImxvY2FsZVNvcnRlZCIsImxpc3RNb250aHMiLCJsaXN0TW9udGhzU2hvcnQiLCJsaXN0V2Vla2RheXMiLCJsaXN0V2Vla2RheXNTaG9ydCIsImxpc3RXZWVrZGF5c01pbiIsImZpcnN0RGF5T2ZZZWFyIiwiZmlyc3REYXlPZldlZWsiLCJsYW5nRGF0YSIsIm1hdGhBYnMiLCJhZGRTdWJ0cmFjdCQxIiwiYWRkJDEiLCJzdWJ0cmFjdCQxIiwiYWJzQ2VpbCIsImJ1YmJsZSIsIm1vbnRoc0Zyb21EYXlzIiwibW9udGhzVG9EYXlzIiwiZGF5c1RvTW9udGhzIiwiYXMiLCJ2YWx1ZU9mJDEiLCJtYWtlQXMiLCJhbGlhcyIsImFzTWlsbGlzZWNvbmRzIiwiYXNTZWNvbmRzIiwiYXNNaW51dGVzIiwiYXNIb3VycyIsImFzRGF5cyIsImFzV2Vla3MiLCJhc01vbnRocyIsImFzUXVhcnRlcnMiLCJhc1llYXJzIiwiY2xvbmUkMSIsImdldCQyIiwibWFrZUdldHRlciIsInRocmVzaG9sZHMiLCJzdWJzdGl0dXRlVGltZUFnbyIsInJlbGF0aXZlVGltZSQxIiwicG9zTmVnRHVyYXRpb24iLCJnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZyIsInJvdW5kaW5nRnVuY3Rpb24iLCJnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQiLCJ0aHJlc2hvbGQiLCJ3aXRoU3VmZml4IiwiYWJzJDEiLCJ0b0lTT1N0cmluZyQxIiwiWSIsIkQiLCJ0b3RhbCIsInRvdGFsU2lnbiIsInltU2lnbiIsImRheXNTaWduIiwiaG1zU2lnbiIsInByb3RvJDIiLCJ0b0lzb1N0cmluZyIsInJlbGF0aXZlVGltZVJvdW5kaW5nIiwicmVsYXRpdmVUaW1lVGhyZXNob2xkIiwiSFRNTDVfRk1UIiwiREFURVRJTUVfTE9DQUwiLCJEQVRFVElNRV9MT0NBTF9TRUNPTkRTIiwiREFURVRJTUVfTE9DQUxfTVMiLCJUSU1FIiwiVElNRV9TRUNPTkRTIiwiVElNRV9NUyIsInByb3BJc0VudW1lcmFibGUiLCJ0ZXN0MSIsInRlc3QyIiwidGVzdDMiLCJzaG91bGRVc2VOYXRpdmUiLCJwYXJzZXIiLCJsb29zZSIsInN0cmljdE1vZGUiLCJ1cmkiLCIkMCIsIiQxIiwiJDIiLCJDbGFzcyIsIk1hdHJpeDQiLCJSYW5kb21YWVoiLCJSYW5kb21YWVpXIiwiUm90YXRlVmVjMyIsIlNwcml0ZTNEIiwiVmVjdG9yMiIsIlZlY3RvcjMiLCJWZWN0b3I0IiwidG1wVmVjMyIsInRtcFZlYzQiLCJkaXJ2ZWMiLCJyaWdodHZlYyIsImJpbGxib2FyZE1hdHJpeCIsIkNhbWVyYSIsImluaXRpYWxpemUiLCJzY2VuZSIsImRpc3BsYXlMaXN0Iiwic3lzIiwidXBkYXRlTGlzdCIsInVwIiwicGl4ZWxTY2FsZSIsInByb2plY3Rpb24iLCJjb21iaW5lZCIsImludlByb2plY3Rpb25WaWV3IiwibmVhciIsImZhciIsInJheSIsInZpZXdwb3J0V2lkdGgiLCJ2aWV3cG9ydEhlaWdodCIsImJpbGxib2FyZE1hdHJpeERpcnR5Iiwic2V0UG9zaXRpb24iLCJzZXRTY2VuZSIsInNldFBpeGVsU2NhbGUiLCJzcHJpdGUzRCIsImdhbWVPYmplY3QiLCJ1cGRhdGVDaGlsZHJlbiIsImNoaWxkIiwiZGVsZXRlIiwiZ2V0Q2hpbGRyZW4iLCJmcmFtZSIsImNyZWF0ZU11bHRpcGxlIiwicXVhbnRpdHkiLCJjcmVhdGVSZWN0Iiwic3BhY2luZyIsInNwcml0ZXMiLCJieiIsInJhbmRvbVNwaGVyZSIsInJhZGl1cyIsInJhbmRvbUN1YmUiLCJ0cmFuc2xhdGVDaGlsZHJlbiIsInZlYzMiLCJ0cmFuc2Zvcm1DaGlsZHJlbiIsIm1hdDQiLCJ0cmFuc2Zvcm1NYXQ0Iiwic2V0Vmlld3BvcnQiLCJsb29rQXQiLCJjcm9zcyIsInJvdGF0ZSIsImF4aXMiLCJyb3RhdGVBcm91bmQiLCJuZWdhdGUiLCJwcm9qZWN0IiwidmVjIiwiTkVBUl9SQU5HRSIsIkZBUl9SQU5HRSIsInVucHJvamVjdCIsInZpZXdwb3J0IiwiZ2V0UGlja1JheSIsIm10eCIsInVwZGF0ZUJpbGxib2FyZE1hdHJpeCIsImdldFBvaW50U2l6ZSIsImR4IiwiZHkiLCJ0bHgiLCJ0bHkiLCJkZXN0cm95Iiwic2V0WCIsInNldFkiLCJzZXRaIiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJQbHVnaW5DYWNoZSIsIkNhbWVyYU1hbmFnZXIiLCJzeXN0ZW1zIiwiY2FtZXJhcyIsImJvb3QiLCJldmVudEVtaXR0ZXIiLCJzaHV0ZG93biIsImZpZWxkT2ZWaWV3IiwiYWRkUGVyc3BlY3RpdmVDYW1lcmEiLCJhZGRPcnRob2dyYXBoaWNDYW1lcmEiLCJnYW1lIiwiY2FtZXJhIiwiZ2V0Q2FtZXJhIiwicmVtb3ZlQ2FtZXJhIiwiY2FtZXJhSW5kZXgiLCJyZW1vdmVBbGwiLCJtYWluIiwidGltZXN0ZXAiLCJyZWdpc3RlciIsIkV4dGVuZHMiLCJfem9vbSIsInNldFRvT3J0aG8iLCJ5RG93biIsInpvb20iLCJvcnRobyIsInNldEZPViIsImFzcGVjdCIsInBlcnNwZWN0aXZlIiwiR2FtZU9iamVjdCIsIlNwcml0ZSIsInRleHR1cmUiLCJhZGp1c3RTY2FsZVgiLCJhZGp1c3RTY2FsZVkiLCJfdmlzaWJsZSIsInNldFZpc2libGUiLCJzY2FsZVgiLCJzY2FsZVkiLCJzZXREZXB0aCIsIkJ1aWxkR2FtZU9iamVjdCIsIkJ1aWxkR2FtZU9iamVjdEFuaW1hdGlvbiIsIkdhbWVPYmplY3RDcmVhdG9yIiwiR2V0QWR2YW5jZWRWYWx1ZSIsImFkZFRvU2NlbmUiLCJzcHJpdGUiLCJwbGFjZW1lbnRJRCIsInZpZGVvIiwic2hvd24iLCJBZEluc3RhbmNlIiwiRGF0YU1hbmFnZXIiLCJMZWFkZXJib2FyZCIsIlByb2R1Y3QiLCJQdXJjaGFzZSIsIkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luIiwic2V0RGF0YUhhbmRsZXIiLCJjaGFuZ2VEYXRhSGFuZGxlciIsImhhc0xvYWRlZCIsImRhdGFMb2NrZWQiLCJzdXBwb3J0ZWRBUElzIiwiZW50cnlQb2ludCIsImVudHJ5UG9pbnREYXRhIiwiY29udGV4dElEIiwiY29udGV4dFR5cGUiLCJwbGF0Zm9ybSIsInBsYXllcklEIiwicGxheWVyTmFtZSIsInBsYXllclBob3RvVVJMIiwicGxheWVyQ2FuU3Vic2NyaWJlQm90IiwicGF5bWVudHNSZWFkeSIsImNhdGFsb2ciLCJwdXJjaGFzZXMiLCJsZWFkZXJib2FyZHMiLCJhZHMiLCJfdGhpcyIsIkZCSW5zdGFudCIsInBsYXllciIsInNldERhdGFBc3luYyIsInNob3dMb2FkUHJvZ3Jlc3MiLCJzZXRMb2FkaW5nUHJvZ3Jlc3MiLCJzdGFydEdhbWVBc3luYyIsImdhbWVTdGFydGVkSGFuZGxlciIsImdhbWVTdGFydGVkIiwiQVBJcyIsImdldFN1cHBvcnRlZEFQSXMiLCJzdXBwb3J0ZWQiLCJkb3RUb1VwcGVyIiwiYXBpIiwiZ2V0SUQiLCJnZXRUeXBlIiwiZ2V0UGxhdGZvcm0iLCJnZXRTREtWZXJzaW9uIiwiZ2V0UGxheWVySUQiLCJnZXRQbGF5ZXJOYW1lIiwiZ2V0UGxheWVyUGhvdG9VUkwiLCJvblBhdXNlIiwiZ2V0RW50cnlQb2ludEFzeW5jIiwiZW50cnlwb2ludCIsImdldEVudHJ5UG9pbnREYXRhIiwicGF5bWVudHNQdXJjaGFzZUFzeW5jIiwicGF5bWVudHMiLCJvblJlYWR5IiwiY2hlY2tBUEkiLCJjb250ZXh0R2V0SUQiLCJjb250ZXh0R2V0VHlwZSIsInBsYXllckdldElEIiwicGxheWVyR2V0TmFtZSIsImdldE5hbWUiLCJwbGF5ZXJHZXRQaG90byIsImdldFBob3RvIiwibG9hZFBsYXllclBob3RvIiwic2V0Q09SUyIsImNhblN1YnNjcmliZUJvdCIsInBsYXllckNhblN1YnNjcmliZUJvdEFzeW5jIiwiY2FuU3Vic2NyaWJlQm90QXN5bmMiLCJzdWJzY3JpYmVCb3QiLCJzdWJzY3JpYmVCb3RBc3luYyIsImdldERhdGFBc3luYyIsInNhdmVEYXRhIiwiZmx1c2hEYXRhIiwiZmx1c2hEYXRhQXN5bmMiLCJnZXRTdGF0cyIsImdldFN0YXRzQXN5bmMiLCJzYXZlU3RhdHMiLCJzZXRTdGF0c0FzeW5jIiwiaW5jU3RhdHMiLCJpbmNyZW1lbnRTdGF0c0FzeW5jIiwic3RhdHMiLCJzYXZlU2Vzc2lvbiIsInNldFNlc3Npb25EYXRhIiwib3BlblNoYXJlIiwic2Vzc2lvbkRhdGEiLCJfc2hhcmUiLCJvcGVuSW52aXRlIiwib3BlblJlcXVlc3QiLCJvcGVuQ2hhbGxlbmdlIiwiaW50ZW50IiwiaW1hZ2VEYXRhIiwidGV4dHVyZXMiLCJnZXRCYXNlNjQiLCJwYXlsb2FkIiwic2hhcmVBc3luYyIsImlzU2l6ZUJldHdlZW4iLCJzd2l0Y2hDb250ZXh0Iiwic3dpdGNoQXN5bmMiLCJjaG9vc2VDb250ZXh0IiwiY2hvb3NlQXN5bmMiLCJjcmVhdGVDb250ZXh0IiwiY3JlYXRlQXN5bmMiLCJnZXRQbGF5ZXJzIiwiZ2V0Q29ubmVjdGVkUGxheWVyc0FzeW5jIiwicGxheWVycyIsImdldENhdGFsb2ciLCJnZXRDYXRhbG9nQXN5bmMiLCJpdGVtIiwiZ2V0UHJvZHVjdCIsInByb2R1Y3RJRCIsInB1cmNoYXNlIiwiZGV2ZWxvcGVyUGF5bG9hZCIsInB1cmNoYXNlQXN5bmMiLCJnZXRQdXJjaGFzZXMiLCJnZXRQdXJjaGFzZXNBc3luYyIsImNvbnN1bWVQdXJjaGFzZSIsInB1cmNoYXNlVG9rZW4iLCJjb25zdW1lUHVyY2hhc2VBc3luYyIsImN0YSIsInVwZGF0ZURhdGEiLCJfdXBkYXRlIiwidXBkYXRlTGVhZGVyYm9hcmQiLCJhY3Rpb24iLCJzdHJhdGVneSIsIm5vdGlmaWNhdGlvbiIsInVwZGF0ZUFzeW5jIiwic3dpdGNoR2FtZSIsImFwcElEIiwic3dpdGNoR2FtZUFzeW5jIiwiY3JlYXRlU2hvcnRjdXQiLCJjYW5DcmVhdGVTaG9ydGN1dEFzeW5jIiwiY2FuQ3JlYXRlU2hvcnRjdXQiLCJjcmVhdGVTaG9ydGN1dEFzeW5jIiwicXVpdCIsImxvZ0V2ZW50IiwicHJlbG9hZEFkcyIsImdldEludGVyc3RpdGlhbEFkQXN5bmMiLCJpbnRlcnN0aXRpYWwiLCJsb2FkQXN5bmMiLCJhZCIsInByZWxvYWRWaWRlb0FkcyIsImdldFJld2FyZGVkVmlkZW9Bc3luYyIsInJld2FyZCIsInNob3dBZCIsInNob3dBc3luYyIsInNob3dWaWRlbyIsIm1hdGNoUGxheWVyIiwibWF0Y2hUYWciLCJzd2l0Y2hJbW1lZGlhdGVseSIsIm1hdGNoUGxheWVyQXN5bmMiLCJnZXRMZWFkZXJib2FyZCIsImdldExlYWRlcmJvYXJkQXN5bmMiLCJsZWFkZXJib2FyZCIsIkxlYWRlcmJvYXJkU2NvcmUiLCJwbHVnaW4iLCJyZWYiLCJnZXRDb250ZXh0SUQiLCJlbnRyeUNvdW50IiwicGxheWVyU2NvcmUiLCJzY29yZXMiLCJnZXRFbnRyeUNvdW50IiwiZ2V0RW50cnlDb3VudEFzeW5jIiwic2V0U2NvcmUiLCJzZXRTY29yZUFzeW5jIiwiZ2V0UGxheWVyU2NvcmUiLCJnZXRQbGF5ZXJFbnRyeUFzeW5jIiwiZ2V0U2NvcmVzIiwiZ2V0RW50cmllc0FzeW5jIiwiZ2V0Q29ubmVjdGVkU2NvcmVzIiwiZ2V0Q29ubmVjdGVkUGxheWVyRW50cmllc0FzeW5jIiwiZ2V0U2NvcmUiLCJzY29yZUZvcm1hdHRlZCIsImdldEZvcm1hdHRlZFNjb3JlIiwidGltZXN0YW1wIiwiZ2V0VGltZXN0YW1wIiwicmFuayIsImdldFJhbmsiLCJnZXRFeHRyYURhdGEiLCJnZXRQbGF5ZXIiLCJHZXRGYXN0VmFsdWUiLCJ0aXRsZSIsImltYWdlVVJJIiwicHJpY2UiLCJwcmljZUN1cnJlbmN5Q29kZSIsInBheW1lbnRJRCIsInB1cmNoYXNlVGltZSIsInNpZ25lZFJlcXVlc3QiLCJRdWlja1NldCIsIlByb3BlcnR5VmFsdWVJbmMiLCJBbGlnbkluIiwiQ09OU1QiLCJ0ZW1wWm9uZSIsInF1ZXVlRGVwdGhTb3J0Iiwid2lkdGhTZXQiLCJoZWlnaHRTZXQiLCJjZWxsV2lkdGgiLCJjZWxsSGVpZ2h0IiwiVE9QX0xFRlQiLCJzZXRTaXplIiwic3RlcFgiLCJzdGVwWSIsImNpcmNsZSIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsImFuZ2xlIiwiYW5nbGVTdGVwIiwic2luIiwiZWxsaXBzZSIsIkdldFBvaW50cyIsImxpbmUiLCJwb2ludHMiLCJNYXJjaGluZ0FudHMiLCJSb3RhdGVMZWZ0IiwiUm90YXRlUmlnaHQiLCJCcmVzZW5oYW1Qb2ludHMiLCJ0cmlhbmdsZSIsInN0ZXBSYXRlIiwieTIiLCJ4MyIsInkzIiwic3RhcnRGcmFtZSIsImFuaW1zIiwicGxheSIsIlJhbmRvbSIsIlJvdGF0ZUFyb3VuZERpc3RhbmNlIiwiRGlzdGFuY2VCZXR3ZWVuIiwiTWF0aFJvdGF0ZUFyb3VuZERpc3RhbmNlIiwiZGlzdGFuY2UiLCJQcm9wZXJ0eVZhbHVlU2V0IiwiaGl0QXJlYSIsImhpdEFyZWFDYWxsYmFjayIsInNldEludGVyYWN0aXZlIiwib3JpZ2luWCIsIm9yaWdpblkiLCJzY3JvbGxGYWN0b3JYIiwic2Nyb2xsRmFjdG9yWSIsInRvcExlZnQiLCJ0b3BSaWdodCIsImJvdHRvbUxlZnQiLCJib3R0b21SaWdodCIsInNldFRpbnQiLCJBcnJheVNodWZmbGUiLCJNYXRoU21vb3RoU3RlcCIsIk1hdGhTbW9vdGhlclN0ZXAiLCJXcmFwIiwiYm90dG9tIiwiQWxpZ25UbyIsIkFuZ2xlIiwiQ2FsbCIsIkdldEZpcnN0IiwiR2V0TGFzdCIsIkdyaWRBbGlnbiIsIkluY0FscGhhIiwiSW5jWCIsIkluY1hZIiwiSW5jWSIsIlBsYWNlT25DaXJjbGUiLCJQbGFjZU9uRWxsaXBzZSIsIlBsYWNlT25MaW5lIiwiUGxhY2VPblJlY3RhbmdsZSIsIlBsYWNlT25UcmlhbmdsZSIsIlBsYXlBbmltYXRpb24iLCJSYW5kb21DaXJjbGUiLCJSYW5kb21FbGxpcHNlIiwiUmFuZG9tTGluZSIsIlJhbmRvbVJlY3RhbmdsZSIsIlJhbmRvbVRyaWFuZ2xlIiwiUm90YXRlIiwiUm90YXRlQXJvdW5kIiwiU2NhbGVYIiwiU2NhbGVYWSIsIlNjYWxlWSIsIlNldEFscGhhIiwiU2V0QmxlbmRNb2RlIiwiU2V0RGVwdGgiLCJTZXRIaXRBcmVhIiwiU2V0T3JpZ2luIiwiU2V0Um90YXRpb24iLCJTZXRTY2FsZSIsIlNldFNjYWxlWCIsIlNldFNjYWxlWSIsIlNldFNjcm9sbEZhY3RvciIsIlNldFNjcm9sbEZhY3RvclgiLCJTZXRTY3JvbGxGYWN0b3JZIiwiU2V0VGludCIsIlNldFZpc2libGUiLCJTZXRYIiwiU2V0WFkiLCJTZXRZIiwiU2hpZnRQb3NpdGlvbiIsIlNodWZmbGUiLCJTbW9vdGhlclN0ZXAiLCJTbW9vdGhTdGVwIiwiU3ByZWFkIiwiVG9nZ2xlVmlzaWJsZSIsIldyYXBJblJlY3RhbmdsZSIsIkNsYW1wIiwiRmluZENsb3Nlc3RJblNvcnRlZCIsIkZyYW1lIiwiR2V0VmFsdWUiLCJtYW5hZ2VyIiwiZnJhbWVzIiwiZ2V0RnJhbWVzIiwidGV4dHVyZU1hbmFnZXIiLCJmcmFtZVJhdGUiLCJtc1BlckZyYW1lIiwic2tpcE1pc3NlZEZyYW1lcyIsInJlcGVhdERlbGF5IiwieW95byIsInNob3dPblN0YXJ0IiwiaGlkZU9uQ29tcGxldGUiLCJwYXVzZWQiLCJQQVVTRV9BTEwiLCJwYXVzZSIsIlJFU1VNRV9BTEwiLCJyZXN1bWUiLCJhZGRGcmFtZSIsImFkZEZyYW1lQXQiLCJuZXdGcmFtZXMiLCJwcmUiLCJ1cGRhdGVGcmFtZVNlcXVlbmNlIiwiY2hlY2tGcmFtZSIsImNvbXBsZXRlQW5pbWF0aW9uIiwiY29tcG9uZW50IiwiZ2V0Rmlyc3RUaWNrIiwiaW5jbHVkZURlbGF5IiwiY3VycmVudEZyYW1lIiwiX2RlbGF5IiwiZ2V0RnJhbWVBdCIsImRlZmF1bHRUZXh0dXJlS2V5IiwiYW5pbWF0aW9uRnJhbWUiLCJ0ZXh0dXJlS2V5IiwiZnJhbWVLZXlzIiwiZ2V0RnJhbWVOYW1lcyIsInRleHR1cmVGcmFtZSIsImdldEZyYW1lIiwiaXNGaXJzdCIsIm5leHRGcmFtZSIsInByZXZGcmFtZSIsImlzTGFzdCIsImdldE5leHRUaWNrIiwiY3VycmVudEFuaW0iLCJfcmVwZWF0IiwiX3JlcGVhdERlbGF5IiwiX3lveW8iLCJnZXRMYXN0RnJhbWUiLCJ1cGRhdGVGcmFtZSIsImdldEZyYW1lQnlQcm9ncmVzcyIsImhhbmRsZVlveW9GcmFtZSIsInJlcGVhdENvdW50ZXIiLCJfcmV2ZXJzZSIsInJlcGVhdEFuaW1hdGlvbiIsInVwZGF0ZUFuZEdldE5leHRUaWNrIiwiaXNSZXZlcnNlIiwicGVuZGluZ1JlcGVhdCIsInByZXZpb3VzRnJhbWUiLCJyZW1vdmVGcmFtZSIsInJlbW92ZUZyYW1lQXQiLCJfcGVuZGluZ1N0b3AiLCJpc1BsYXlpbmciLCJBTklNQVRJT05fUkVQRUFUIiwiU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVQRUFUIiwiU1BSSVRFX0FOSU1BVElPTl9SRVBFQVQiLCJzZXRGcmFtZSIsIkFuaW1hdGlvbkZyYW1lIiwiQ3VzdG9tTWFwIiwiR2FtZUV2ZW50cyIsIlBhZCIsIkFuaW1hdGlvbk1hbmFnZXIiLCJnbG9iYWxUaW1lU2NhbGUiLCJCT09UIiwiREVTVFJPWSIsIkFERF9BTklNQVRJT04iLCJmcm9tSlNPTiIsImNsZWFyQ3VycmVudEFuaW1hdGlvbnMiLCJnZW5lcmF0ZUZyYW1lTmFtZXMiLCJ6ZXJvUGFkIiwiZ2VuZXJhdGVGcmFtZU51bWJlcnMiLCJlbmRGcmFtZSIsImZpcnN0RnJhbWUiLCJmcmFtZVRvdGFsIiwicGF1c2VBbGwiLCJSRU1PVkVfQU5JTUFUSU9OIiwicmVzdW1lQWxsIiwic3RhZ2dlclBsYXkiLCJzdGFnZ2VyIiwiZGVsYXllZFBsYXkiLCJhbmltYXRpb25LZXkiLCJBTklNQVRJT05fQ09NUExFVEUiLCJBTklNQVRJT05fUkVTVEFSVCIsIkFOSU1BVElPTl9TVEFSVCIsIlNQUklURV9BTklNQVRJT05fQ09NUExFVEUiLCJTUFJJVEVfQU5JTUFUSU9OX0tFWV9DT01QTEVURSIsIlNQUklURV9BTklNQVRJT05fS0VZX1JFU1RBUlQiLCJTUFJJVEVfQU5JTUFUSU9OX0tFWV9TVEFSVCIsIlNQUklURV9BTklNQVRJT05fS0VZX1VQREFURSIsIlNQUklURV9BTklNQVRJT05fUkVTVEFSVCIsIlNQUklURV9BTklNQVRJT05fU1RBUlQiLCJTUFJJVEVfQU5JTUFUSU9OX1VQREFURSIsIkJhc2VDYWNoZSIsIkFERCIsIlJFTU9WRSIsImdldEtleXMiLCJDYWNoZU1hbmFnZXIiLCJiaXRtYXBGb250IiwicGh5c2ljcyIsInNoYWRlciIsImF1ZGlvIiwidGlsZW1hcCIsImN1c3RvbSIsImFkZEN1c3RvbSIsIkNvbXBvbmVudHMiLCJEZWdUb1JhZCIsIlJlY3RhbmdsZSIsIlRyYW5zZm9ybU1hdHJpeCIsIlZhbHVlVG9Db2xvciIsIkJhc2VDYW1lcmEiLCJNaXhpbnMiLCJBbHBoYSIsIlZpc2libGUiLCJzY2VuZU1hbmFnZXIiLCJzY2FsZU1hbmFnZXIiLCJjYW1lcmFNYW5hZ2VyIiwicmVzb2x1dGlvbiIsInJvdW5kUGl4ZWxzIiwidXNlQm91bmRzIiwid29ybGRWaWV3IiwiZGlydHkiLCJfeCIsIl95IiwiX2N4IiwiX2N5IiwiX2N3IiwiX2NoIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9ib3VuZHMiLCJfc2Nyb2xsWCIsIl9zY3JvbGxZIiwiX3JvdGF0aW9uIiwibWF0cml4IiwidHJhbnNwYXJlbnQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJkaXNhYmxlQ3VsbCIsImN1bGxlZE9iamVjdHMiLCJtaWRQb2ludCIsIl9jdXN0b21WaWV3cG9ydCIsIm1hc2siLCJfbWFza0NhbWVyYSIsInNldE9yaWdpbiIsImdldFNjcm9sbCIsImNsYW1wWCIsImNsYW1wWSIsImNlbnRlck9uWCIsInNjcm9sbFgiLCJjZW50ZXJPblkiLCJzY3JvbGxZIiwiY2VudGVyT24iLCJjZW50ZXJUb0JvdW5kcyIsImJvdW5kcyIsImNlbnRlclgiLCJjZW50ZXJZIiwiY2VudGVyVG9TaXplIiwiY3VsbCIsInJlbmRlcmFibGVPYmplY3RzIiwiY2FtZXJhTWF0cml4IiwibXZhIiwibXZiIiwibXZjIiwibXZkIiwiZGV0ZXJtaW5hbnQiLCJtdmUiLCJtdmYiLCJjYW1lcmFXIiwiY2FtZXJhSCIsInBhcmVudENvbnRhaW5lciIsIm9iamVjdFciLCJvYmplY3RIIiwib2JqZWN0WCIsIm9iamVjdFkiLCJ0eCIsInR5IiwidHciLCJjdWxsVG9wIiwiY3VsbEJvdHRvbSIsImN1bGxMZWZ0IiwiZ2V0V29ybGRQb2ludCIsImltYSIsImltYiIsImltYyIsImltZCIsImltZSIsImltZiIsInJvdGF0aW9uIiwic3giLCJzeSIsImlnbm9yZSIsImlzUGFyZW50IiwiY2FtZXJhRmlsdGVyIiwicHJlUmVuZGVyIiwiaGFsZldpZHRoIiwiaGFsZkhlaWdodCIsIm1pZFgiLCJtaWRZIiwiZGlzcGxheVdpZHRoIiwiZGlzcGxheUhlaWdodCIsInNldFRvIiwiYXBwbHlJVFJTIiwiZHciLCJidyIsImRoIiwiYmgiLCJyZW1vdmVCb3VuZHMiLCJzZXRFbXB0eSIsInNldEFuZ2xlIiwic2V0QmFja2dyb3VuZENvbG9yIiwiYWxwaGEiLCJzZXRCb3VuZHMiLCJnZXRCb3VuZHMiLCJzZXROYW1lIiwic2V0Um90YXRpb24iLCJzZXRSb3VuZFBpeGVscyIsImN1c3RvbVZpZXdwb3J0cyIsInVwZGF0ZVN5c3RlbSIsInNldFNjcm9sbCIsInNldFpvb20iLCJzZXRNYXNrIiwiZml4ZWRQb3NpdGlvbiIsImNsZWFyTWFzayIsImRlc3Ryb3lNYXNrIiwicmdiYSIsIkNhbnZhc1Bvb2wiLCJDZW50ZXJPbiIsIkVmZmVjdHMiLCJMaW5lYXIiLCJGbGlwIiwiVGludCIsImlucHV0RW5hYmxlZCIsImZhZGVFZmZlY3QiLCJGYWRlIiwiZmxhc2hFZmZlY3QiLCJGbGFzaCIsInNoYWtlRWZmZWN0IiwiU2hha2UiLCJwYW5FZmZlY3QiLCJQYW4iLCJyb3RhdGVUb0VmZmVjdCIsIlJvdGF0ZVRvIiwiem9vbUVmZmVjdCIsIlpvb20iLCJsZXJwIiwiZm9sbG93T2Zmc2V0IiwiZGVhZHpvbmUiLCJfZm9sbG93IiwicmVuZGVyVG9UZXh0dXJlIiwicmVuZGVyVG9HYW1lIiwiY2FudmFzIiwiZ2xUZXh0dXJlIiwiZnJhbWVidWZmZXIiLCJwaXBlbGluZSIsInNldFJlbmRlclRvVGV4dHVyZSIsInJlbmRlcmVyIiwiZ2wiLCJjcmVhdGVUZXh0dXJlRnJvbVNvdXJjZSIsImNyZWF0ZUZyYW1lYnVmZmVyIiwiY3JlYXRlMkQiLCJnZXRDb250ZXh0Iiwic2V0UGlwZWxpbmUiLCJoYXNQaXBlbGluZSIsImdldFBpcGVsaW5lIiwiY2xlYXJSZW5kZXJUb1RleHR1cmUiLCJkZWxldGVGcmFtZWJ1ZmZlciIsImRlbGV0ZVRleHR1cmUiLCJzZXREZWFkem9uZSIsImZ5IiwicmVkIiwiZ3JlZW4iLCJibHVlIiwiZmFkZUZyb20iLCJmb3JjZSIsImZhZGUiLCJmbGFzaCIsInNoYWtlIiwiaW50ZW5zaXR5IiwicGFuIiwiZWFzZSIsInJvdGF0ZVRvIiwic2hvcnRlc3RQYXRoIiwiem9vbVRvIiwiZm9sbG93IiwiaXNSdW5uaW5nIiwic2V0TGVycCIsInNldEZvbGxvd09mZnNldCIsInN0YXJ0Rm9sbG93IiwibGVycFgiLCJsZXJwWSIsInN0b3BGb2xsb3ciLCJyZXNldEZYIiwiUmVjdGFuZ2xlQ29udGFpbnMiLCJTY2FsZUV2ZW50cyIsIlNjZW5lRXZlbnRzIiwiU1RBUlQiLCJSRVNJWkUiLCJvblJlc2l6ZSIsIlVQREFURSIsIlNIVVRET1dOIiwibWFrZU1haW4iLCJnZXROZXh0SUQiLCJhZGRFeGlzdGluZyIsInRlc3RJRCIsImdldFRvdGFsIiwiaXNWaXNpYmxlIiwiZ2FtZVdpZHRoIiwiZ2FtZUhlaWdodCIsImNhbWVyYUNvbmZpZyIsImJvdW5kc0NvbmZpZyIsImJ3aWR0aCIsImJoZWlnaHQiLCJnZXRDYW1lcmFzQmVsb3dQb2ludGVyIiwicnVuRGVzdHJveSIsInJlbmRlciIsImludGVycG9sYXRpb24iLCJyZXNldEFsbCIsImdhbWVTaXplIiwiYmFzZVNpemUiLCJkaXNwbGF5U2l6ZSIsInByZXZpb3VzV2lkdGgiLCJwcmV2aW91c0hlaWdodCIsImNhbSIsInJlc2l6ZSIsImlzQ29tcGxldGUiLCJfZWxhcHNlZCIsIl9vblVwZGF0ZSIsIl9vblVwZGF0ZVNjb3BlIiwiTUlOX1ZBTFVFIiwiZXZlbnROYW1lIiwiRkFERV9PVVRfU1RBUlQiLCJGQURFX0lOX1NUQVJUIiwiZWZmZWN0Q29tcGxldGUiLCJwb3N0UmVuZGVyQ2FudmFzIiwiY3R4IiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJwb3N0UmVuZGVyV2ViR0wiLCJnZXRUaW50RnVuY3Rpb24iLCJkcmF3RmlsbFJlY3QiLCJGQURFX09VVF9DT01QTEVURSIsIkZBREVfSU5fQ09NUExFVEUiLCJGTEFTSF9TVEFSVCIsIkZMQVNIX0NPTVBMRVRFIiwiRWFzZU1hcCIsImRlc3RpbmF0aW9uIiwiUEFOX1NUQVJUIiwiUEFOX0NPTVBMRVRFIiwidG1wRGVzdGluYXRpb24iLCJtYXhSYWQiLCJjd0Rpc3QiLCJhY3dEaXN0IiwiUk9UQVRFX1NUQVJUIiwiUk9UQVRFX0NPTVBMRVRFIiwiX29mZnNldFgiLCJfb2Zmc2V0WSIsIlNIQUtFX1NUQVJUIiwiU0hBS0VfQ09NUExFVEUiLCJaT09NX1NUQVJUIiwiWk9PTV9DT01QTEVURSIsIlBPU1RfUkVOREVSIiwiUFJFX1JFTkRFUiIsIkZpeGVkS2V5Q29udHJvbCIsImRvd24iLCJ6b29tSW4iLCJ6b29tT3V0Iiwiem9vbVNwZWVkIiwic3BlZWRYIiwic3BlZWRZIiwic2V0Q2FtZXJhIiwiaXNEb3duIiwiU21vb3RoZWRLZXlDb250cm9sIiwiYWNjZWxYIiwiYWNjZWxZIiwiYWNjZWwiLCJkcmFnWCIsImRyYWdZIiwiZHJhZyIsIm1heFNwZWVkWCIsIm1heFNwZWVkWSIsIm1heFNwZWVkIiwiX3NwZWVkWCIsIl9zcGVlZFkiLCJDb250cm9scyIsIlNjZW5lMkQiLCJWRVJTSU9OIiwiQmxlbmRNb2RlcyIsIlNjYWxlTW9kZXMiLCJBVVRPIiwiQ0FOVkFTIiwiV0VCR0wiLCJIRUFETEVTUyIsIkZPUkVWRVIiLCJOT05FIiwiVVAiLCJET1dOIiwiTEVGVCIsIlJJR0hUIiwiRGV2aWNlIiwiSXNQbGFpbk9iamVjdCIsIlBoYXNlck1hdGgiLCJEZWZhdWx0UGx1Z2lucyIsIkNvbmZpZyIsInNjYWxlTW9kZSIsImV4cGFuZFBhcmVudCIsImF1dG9Sb3VuZCIsImF1dG9DZW50ZXIiLCJyZXNpemVJbnRlcnZhbCIsImZ1bGxzY3JlZW5UYXJnZXQiLCJtaW5IZWlnaHQiLCJtYXhIZWlnaHQiLCJzY2FsZUNvbmZpZyIsInJlbmRlclR5cGUiLCJjYW52YXNTdHlsZSIsImN1c3RvbUVudmlyb25tZW50Iiwic2NlbmVDb25maWciLCJSTkQiLCJSYW5kb21EYXRhR2VuZXJhdG9yIiwiZ2FtZVRpdGxlIiwiZ2FtZVVSTCIsImdhbWVWZXJzaW9uIiwiYXV0b0ZvY3VzIiwiZG9tQ3JlYXRlQ29udGFpbmVyIiwiZG9tQmVoaW5kQ2FudmFzIiwiaW5wdXRLZXlib2FyZCIsImlucHV0S2V5Ym9hcmRFdmVudFRhcmdldCIsImlucHV0S2V5Ym9hcmRDYXB0dXJlIiwiaW5wdXRNb3VzZSIsImlucHV0TW91c2VFdmVudFRhcmdldCIsImlucHV0TW91c2VDYXB0dXJlIiwiaW5wdXRUb3VjaCIsInRvdWNoIiwiaW5wdXRUb3VjaEV2ZW50VGFyZ2V0IiwiaW5wdXRUb3VjaENhcHR1cmUiLCJpbnB1dEFjdGl2ZVBvaW50ZXJzIiwiaW5wdXRTbW9vdGhGYWN0b3IiLCJpbnB1dFdpbmRvd0V2ZW50cyIsImlucHV0R2FtZXBhZCIsImlucHV0R2FtZXBhZEV2ZW50VGFyZ2V0IiwiZGlzYWJsZUNvbnRleHRNZW51IiwiaGlkZUJhbm5lciIsImhpZGVQaGFzZXIiLCJiYW5uZXJUZXh0Q29sb3IiLCJiYW5uZXJCYWNrZ3JvdW5kQ29sb3IiLCJmcHMiLCJyZW5kZXJDb25maWciLCJhbnRpYWxpYXMiLCJhbnRpYWxpYXNHTCIsIm1pcG1hcEZpbHRlciIsImRlc3luY2hyb25pemVkIiwicGl4ZWxBcnQiLCJjbGVhckJlZm9yZVJlbmRlciIsInByZW11bHRpcGxpZWRBbHBoYSIsImZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQiLCJwb3dlclByZWZlcmVuY2UiLCJiYXRjaFNpemUiLCJtYXhMaWdodHMiLCJiZ2MiLCJwcmVCb290IiwicG9zdEJvb3QiLCJkZWZhdWx0UGh5c2ljc1N5c3RlbSIsImxvYWRlckJhc2VVUkwiLCJsb2FkZXJQYXRoIiwibG9hZGVyTWF4UGFyYWxsZWxEb3dubG9hZHMiLCJsb2FkZXJDcm9zc09yaWdpbiIsImxvYWRlclJlc3BvbnNlVHlwZSIsImxvYWRlckFzeW5jIiwibG9hZGVyVXNlciIsImxvYWRlclBhc3N3b3JkIiwibG9hZGVyVGltZW91dCIsImxvYWRlcldpdGhDcmVkZW50aWFscyIsImluc3RhbGxHbG9iYWxQbHVnaW5zIiwiaW5zdGFsbFNjZW5lUGx1Z2lucyIsInBsdWdpbnMiLCJkZWZhdWx0UGx1Z2lucyIsIkRlZmF1bHRTY2VuZSIsImRlZmF1bHRNZXJnZSIsInBuZ1ByZWZpeCIsImRlZmF1bHRJbWFnZSIsIm1pc3NpbmdJbWFnZSIsIkZPUkNFX1dFQkdMIiwiRk9SQ0VfQ0FOVkFTIiwiQ2FudmFzSW50ZXJwb2xhdGlvbiIsIkZlYXR1cmVzIiwid2ViR0wiLCJkaXNhYmxlU21vb3RoaW5nIiwiQ2FudmFzUmVuZGVyZXIiLCJXZWJHTFJlbmRlcmVyIiwic2V0Q3Jpc3AiLCJnYW1lQ29udGV4dCIsImF1ZGlvVHlwZSIsImF1ZGlvQ29uZmlnIiwiZGV2aWNlQXVkaW8iLCJkZXZpY2UiLCJ3ZWJBdWRpbyIsImRpc2FibGVXZWJBdWRpbyIsIm5vQXVkaW8iLCJhdWRpb0RhdGEiLCJicm93c2VyIiwiaWUiLCJsYXN0Q29sb3IiLCJBZGRUb0RPTSIsIkNyZWF0ZURPTUNvbnRhaW5lciIsIkNyZWF0ZVJlbmRlcmVyIiwiRGVidWdIZWFkZXIiLCJET01Db250ZW50TG9hZGVkIiwiSW5wdXRNYW5hZ2VyIiwiUGx1Z2luTWFuYWdlciIsIlNjYWxlTWFuYWdlciIsIlNjZW5lTWFuYWdlciIsIlRleHR1cmVFdmVudHMiLCJUZXh0dXJlTWFuYWdlciIsIlRpbWVTdGVwIiwiVmlzaWJpbGl0eUhhbmRsZXIiLCJTb3VuZE1hbmFnZXJDcmVhdG9yIiwiR2FtZSIsImRvbUNvbnRhaW5lciIsImlzQm9vdGVkIiwicmVnaXN0cnkiLCJzb3VuZCIsImZhY2Vib29rIiwicGVuZGluZ0Rlc3Ryb3kiLCJyZW1vdmVDYW52YXMiLCJub1JldHVybiIsImhhc0NvcmUiLCJSRUFEWSIsInRleHR1cmVzUmVhZHkiLCJoZWFkbGVzc1N0ZXAiLCJvbkhpZGRlbiIsIlZJU0lCTEUiLCJvblZpc2libGUiLCJCTFVSIiwib25CbHVyIiwiRk9DVVMiLCJvbkZvY3VzIiwiUFJFX1NURVAiLCJTVEVQIiwiUE9TVF9TVEVQIiwicG9zdFJlbmRlciIsIlBBVVNFIiwiUkVTVU1FIiwiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicmFmIiwic3RhcnRlZCIsInJ1bm5pbmciLCJtaW5GcHMiLCJ0YXJnZXRGcHMiLCJfbWluIiwiX3RhcmdldCIsImFjdHVhbEZwcyIsIm5leHRGcHNVcGRhdGUiLCJmcmFtZXNUaGlzU2Vjb25kIiwiZm9yY2VTZXRUaW1lT3V0IiwibGFzdFRpbWUiLCJpbkZvY3VzIiwiX3BhdXNlVGltZSIsIl9jb29sRG93biIsImRlbHRhSW5kZXgiLCJkZWx0YUhpc3RvcnkiLCJkZWx0YVNtb290aGluZ01heCIsInBhbmljTWF4IiwicmF3RGVsdGEiLCJzbW9vdGhTdGVwIiwicmVzZXREZWx0YSIsInBlcmZvcm1hbmNlIiwiaGlzdG9yeSIsImR0IiwiYXZnIiwic2xlZXAiLCJ3YWtlIiwic2VhbWxlc3MiLCJ1c2VSQUYiLCJnZXREdXJhdGlvbiIsImdldER1cmF0aW9uTVMiLCJoaWRkZW5WYXIiLCJvbmJsdXIiLCJvbmZvY3VzIiwiQ09OVEVYVF9MT1NUIiwiQ09OVEVYVF9SRVNUT1JFRCIsIkFybmUxNiIsInBhbGV0dGUiLCJwaXhlbFdpZHRoIiwicGl4ZWxIZWlnaHQiLCJyZXNpemVDYW52YXMiLCJjbGVhckNhbnZhcyIsImNsZWFyUmVjdCIsInJvdyIsIkdlbmVyYXRlVGV4dHVyZSIsIlBhbGV0dGVzIiwiQVJORTE2IiwiQzY0IiwiQ0dBIiwiSk1QIiwiTVNYIiwiQ3ViaWNCZXppZXIiLCJDdXJ2ZSIsIkN1YmljQmV6aWVyQ3VydmUiLCJwMCIsImdldFN0YXJ0UG9pbnQiLCJnZXRSZXNvbHV0aW9uIiwiZGl2aXNpb25zIiwiZ2V0UG9pbnQiLCJkcmF3IiwiZ3JhcGhpY3MiLCJwb2ludHNUb3RhbCIsImdldFBvaW50cyIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImxpbmVUbyIsInN0cm9rZVBhdGgiLCJGcm9tUG9pbnRzIiwiZGVmYXVsdERpdmlzaW9ucyIsImFyY0xlbmd0aERpdmlzaW9ucyIsImNhY2hlQXJjTGVuZ3RocyIsIm5lZWRzVXBkYXRlIiwiX3RtcFZlYzJBIiwiX3RtcFZlYzJCIiwic3Ryb2tlUG9pbnRzIiwiYWNjdXJhY3kiLCJnZXRMZW5ndGgiLCJzcGFjZWQiLCJnZXRTcGFjZWRQb2ludHMiLCJnZXREaXN0YW5jZVBvaW50cyIsImdldEVuZFBvaW50IiwiZ2V0UG9pbnRBdCIsImxlbmd0aHMiLCJnZXRMZW5ndGhzIiwiZ2V0VXRvVG1hcHBpbmciLCJnZXRSYW5kb21Qb2ludCIsImdldFRhbmdlbnQiLCJ0MSIsInQyIiwiZ2V0VGFuZ2VudEF0IiwiZ2V0VEZyb21EaXN0YW5jZSIsInRhcmdldEFyY0xlbmd0aCIsImFyY0xlbmd0aHMiLCJpbCIsImNvbXBhcmlzb24iLCJsZW5ndGhCZWZvcmUiLCJ1cGRhdGVBcmNMZW5ndGhzIiwiUmFkVG9EZWciLCJFbGxpcHNlQ3VydmUiLCJ4UmFkaXVzIiwieVJhZGl1cyIsIl94UmFkaXVzIiwiX3lSYWRpdXMiLCJfc3RhcnRBbmdsZSIsIl9lbmRBbmdsZSIsIl9jbG9ja3dpc2UiLCJ0d29QaSIsImRlbHRhQW5nbGUiLCJzYW1lUG9pbnRzIiwic2V0WFJhZGl1cyIsInNldFlSYWRpdXMiLCJzZXRXaWR0aCIsInNldEhlaWdodCIsInNldFN0YXJ0QW5nbGUiLCJzZXRFbmRBbmdsZSIsInNldENsb2Nrd2lzZSIsInRtcFZlYzIiLCJMaW5lQ3VydmUiLCJsaW5lTGVuZ3RoIiwibGluZUJldHdlZW4iLCJRdWFkcmF0aWNCZXppZXJJbnRlcnBvbGF0aW9uIiwiUXVhZHJhdGljQmV6aWVyIiwiQ2F0bXVsbFJvbSIsIlNwbGluZUN1cnZlIiwiYWRkUG9pbnRzIiwiYWRkUG9pbnQiLCJpbnRQb2ludCIsIndlaWdodCIsIlBhdGgiLCJFbGxpcHNlIiwiTGluZSIsIlNwbGluZSIsIk1vdmVUbyIsIkdhbWVPYmplY3RGYWN0b3J5IiwiTW92ZVBhdGhUbyIsIlF1YWRyYXRpY0JlemllckN1cnZlIiwiTUFUSF9DT05TVCIsImN1cnZlcyIsImNhY2hlTGVuZ3RocyIsImF1dG9DbG9zZSIsInN0YXJ0UG9pbnQiLCJjdXJ2ZSIsImNpcmNsZVRvIiwiZWxsaXBzZVRvIiwiY2xvc2VQYXRoIiwiZW5kUG9pbnQiLCJjdWJpY0JlemllclRvIiwiY29udHJvbDFYIiwiY29udHJvbDFZIiwiY29udHJvbDJYIiwiY29udHJvbDJZIiwicXVhZHJhdGljQmV6aWVyVG8iLCJjb250cm9sWCIsImNvbnRyb2xZIiwibWF4UmlnaHQiLCJtYXhCb3R0b20iLCJnZXRDdXJ2ZUxlbmd0aHMiLCJzdW1zIiwibGVucyIsImN1cnZlTGVuZ3RocyIsInNlZ21lbnRMZW5ndGgiLCJwdHMiLCJzcGxpbmVUbyIsIl9mcm96ZW4iLCJzZXRWYWx1ZSIsInByZXZpb3VzVmFsdWUiLCJDSEFOR0VfREFUQSIsIkNIQU5HRV9EQVRBX0tFWSIsIlNFVF9EQVRBIiwib3ZlcndyaXRlIiwicmVtb3ZlVmFsdWUiLCJSRU1PVkVfREFUQSIsInNldEZyZWV6ZSIsIkRhdGFNYW5hZ2VyUGx1Z2luIiwiQnJvd3NlciIsIkF1ZGlvIiwiZG9sYnkiLCJtNGEiLCJtcDMiLCJvZ2ciLCJvcHVzIiwid2F2Iiwid2VibSIsImF1ZGlvRWxlbWVudCIsImNhblBsYXlUeXBlIiwiZWRnZSIsInNhZmFyaSIsInNhZmFyaVZlcnNpb24iLCJuYXZpZ2F0b3IiLCJtYWpvciIsIm1pbm9yIiwidWEiLCJPUyIsImNocm9tZSIsImNocm9tZVZlcnNpb24iLCJmaXJlZm94IiwiZmlyZWZveFZlcnNpb24iLCJpZVZlcnNpb24iLCJtb2JpbGVTYWZhcmkiLCJzaWxrIiwidHJpZGVudCIsInRyaWRlbnRWZXJzaW9uIiwid2luZG93c1Bob25lIiwiaU9TIiwiJDMiLCJwbmdIZWFkIiwicG5nRW5kIiwibWFnZW50YSIsIkNhbnZhc0ZlYXR1cmVzIiwic3VwcG9ydEludmVyc2VBbHBoYSIsInN1cHBvcnROZXdCbGVuZE1vZGVzIiwiSW1hZ2UiLCJ5ZWxsb3ciLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJkcmF3SW1hZ2UiLCJnZXRJbWFnZURhdGEiLCJzMSIsInB1dEltYWdlRGF0YSIsInMyIiwiY2hlY2tJbnZlcnNlQWxwaGEiLCJjYW52YXNCaXRCbHRTaGlmdCIsImZpbGVTeXN0ZW0iLCJnZXRVc2VyTWVkaWEiLCJsaXR0bGVFbmRpYW4iLCJsb2NhbFN0b3JhZ2UiLCJwb2ludGVyTG9jayIsInN1cHBvcnQzMmJpdCIsInZpYnJhdGlvbiIsIndvcmtlciIsImdldEl0ZW0iLCJpc1VpbnQ4IiwiY3JlYXRlV2ViR0wiLCJjYW52YXMyRCIsImNyZWF0ZUltYWdlRGF0YSIsInRlc3RXZWJHTCIsIndlYmtpdEdldFVzZXJNZWRpYSIsIm1vekdldFVzZXJNZWRpYSIsIm1zR2V0VXNlck1lZGlhIiwib0dldFVzZXJNZWRpYSIsIndlYmtpdFVSTCIsIm1velVSTCIsIm1zVVJMIiwidmlicmF0ZSIsIndlYmtpdFZpYnJhdGUiLCJtb3pWaWJyYXRlIiwibXNWaWJyYXRlIiwiRnVsbHNjcmVlbiIsImF2YWlsYWJsZSIsImNhbmNlbCIsImtleWJvYXJkIiwicmVxdWVzdCIsInN1ZmZpeDEiLCJzdWZmaXgyIiwiZnMiLCJjZnMiLCJFbGVtZW50IiwiZnVsbHNjcmVlbkVsZW1lbnQiLCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCIsIm1vekZ1bGxTY3JlZW5FbGVtZW50IiwibXNGdWxsc2NyZWVuRWxlbWVudCIsIklucHV0IiwiZ2FtZXBhZHMiLCJtc3BvaW50ZXIiLCJ3aGVlbEV2ZW50IiwibWF4VG91Y2hQb2ludHMiLCJtc1BvaW50ZXJFbmFibGVkIiwicG9pbnRlckVuYWJsZWQiLCJnZXRHYW1lcGFkcyIsImFuZHJvaWQiLCJjaHJvbWVPUyIsImNvcmRvdmEiLCJjcm9zc3dhbGsiLCJkZXNrdG9wIiwiZWplY3RhIiwiZWxlY3Ryb24iLCJpT1NWZXJzaW9uIiwiaVBhZCIsImlQaG9uZSIsImtpbmRsZSIsImxpbnV4IiwibWFjT1MiLCJub2RlV2Via2l0IiwicGl4ZWxSYXRpbyIsIndlYkFwcCIsIndpbmRvd3MiLCJWaWRlbyIsImgyNjQiLCJobHMiLCJtcDQiLCJ2cDkiLCJ2aWRlb0VsZW1lbnQiLCJvcyIsImZlYXR1cmVzIiwiZnVsbHNjcmVlbiIsImNhbnZhc0ZlYXR1cmVzIiwiVE9QX0NFTlRFUiIsIlRPUF9SSUdIVCIsIkxFRlRfVE9QIiwiTEVGVF9DRU5URVIiLCJMRUZUX0JPVFRPTSIsIkNFTlRFUiIsIlJJR0hUX1RPUCIsIlJJR0hUX0NFTlRFUiIsIlJJR0hUX0JPVFRPTSIsIkJPVFRPTV9MRUZUIiwiQk9UVE9NX0NFTlRFUiIsIkJPVFRPTV9SSUdIVCIsIkdldEJvdHRvbSIsIkdldENlbnRlclgiLCJTZXRCb3R0b20iLCJTZXRDZW50ZXJYIiwiYWxpZ25JbiIsIkdldExlZnQiLCJTZXRMZWZ0IiwiR2V0UmlnaHQiLCJTZXRSaWdodCIsIkdldENlbnRlclkiLCJTZXRDZW50ZXJZIiwiQUxJR05fQ09OU1QiLCJBbGlnbkluTWFwIiwiR2V0VG9wIiwiU2V0VG9wIiwiQm90dG9tQ2VudGVyIiwiQm90dG9tTGVmdCIsIkJvdHRvbVJpZ2h0IiwiQ2VudGVyIiwiTGVmdENlbnRlciIsIlJpZ2h0Q2VudGVyIiwiVG9wQ2VudGVyIiwiVG9wTGVmdCIsIlRvcFJpZ2h0IiwiRXh0ZW5kIiwiQWxpZ24iLCJJbiIsIlRvIiwiYWxpZ25UbyIsIkFsaWduVG9NYXAiLCJMZWZ0Qm90dG9tIiwiTGVmdFRvcCIsIlJpZ2h0Qm90dG9tIiwiUmlnaHRUb3AiLCJHZXRPZmZzZXRYIiwiR2V0T2Zmc2V0WSIsIm1zSW50ZXJwb2xhdGlvbk1vZGUiLCJzZXRCaWN1YmljIiwiU21vb3RoaW5nIiwicG9vbCIsIl9kaXNhYmxlQ29udGV4dFNtb290aGluZyIsImNhbnZhc1R5cGUiLCJzZWxmUGFyZW50IiwiZW5hYmxlU21vb3RoaW5nIiwiZnJlZSIsImlzQ2FudmFzIiwiSFRNTENhbnZhc0VsZW1lbnQiLCJnZXRQcmVmaXgiLCJlbmFibGUiLCJ2ZW5kb3JzIiwiaXNFbmFibGVkIiwidmVuZG9yIiwiVG91Y2hBY3Rpb24iLCJVc2VyU2VsZWN0IiwiR2V0Q29sb3IiLCJHZXRDb2xvcjMyIiwiSFNWVG9SR0IiLCJSR0JUb0hTViIsIkNvbG9yIiwiZyIsIl9oIiwiX3MiLCJfdiIsIl9sb2NrZWQiLCJfY29sb3IiLCJfY29sb3IzMiIsIl9yZ2JhIiwidXBkYXRlSFNWIiwic2V0R0xUbyIsInJlZEdMIiwiZ3JlZW5HTCIsImJsdWVHTCIsImFscGhhR0wiLCJzZXRGcm9tUkdCIiwic2V0RnJvbUhTViIsImdyYXkiLCJzaGFkZSIsInJhbmRvbUdyYXkiLCJzYXR1cmF0ZSIsImFtb3VudCIsImRlc2F0dXJhdGUiLCJsaWdodGVuIiwiZGFya2VuIiwiYnJpZ2h0ZW4iLCJjb2xvcjMyIiwiSHVlVG9Db21wb25lbnQiLCJjb2xvcnMiLCJJbnRlZ2VyVG9SR0IiLCJyZ2IiLCJSR0JXaXRoUkdCIiwicjEiLCJnMSIsImIxIiwicjIiLCJnMiIsIkNvbG9yV2l0aFJHQiIsIkNvbG9yV2l0aENvbG9yIiwiY29sb3IxIiwiY29sb3IyIiwiQ29tcG9uZW50VG9IZXgiLCJCZXR3ZWVuIiwiSGV4U3RyaW5nVG9Db2xvciIsIkludGVnZXJUb0NvbG9yIiwiT2JqZWN0VG9Db2xvciIsIlJHQlN0cmluZ1RvQ29sb3IiLCJDb2xvclRvUkdCQSIsIkhTTFRvQ29sb3IiLCJIU1ZDb2xvcldoZWVsIiwiSW50ZXJwb2xhdGUiLCJSYW5kb21SR0IiLCJSR0JUb1N0cmluZyIsIkJhc2VTaGFkZXIiLCJCb3VuZHMiLCJDYW52YXMiLCJNYXNrcyIsIkJpdG1hcE1hc2siLCJyZW5kZXJhYmxlIiwiYml0bWFwTWFzayIsIm1hc2tUZXh0dXJlIiwibWFpblRleHR1cmUiLCJtYWluRnJhbWVidWZmZXIiLCJtYXNrRnJhbWVidWZmZXIiLCJwcmV2RnJhbWVidWZmZXIiLCJpbnZlcnRBbHBoYSIsImlzU3RlbmNpbCIsInBvdCIsIlJFUEVBVCIsIkNMQU1QX1RPX0VER0UiLCJMSU5FQVIiLCJjcmVhdGVUZXh0dXJlMkQiLCJSR0JBIiwic2V0Qml0bWFwIiwicHJlUmVuZGVyV2ViR0wiLCJtYXNrZWRPYmplY3QiLCJwaXBlbGluZXMiLCJCaXRtYXBNYXNrUGlwZWxpbmUiLCJiZWdpbk1hc2siLCJlbmRNYXNrIiwicHJlUmVuZGVyQ2FudmFzIiwiR2VvbWV0cnlNYXNrIiwiZ3JhcGhpY3NHZW9tZXRyeSIsImdlb21ldHJ5TWFzayIsImxldmVsIiwic2V0U2hhcGUiLCJzZXRJbnZlcnRBbHBoYSIsIm1hc2tTdGFjayIsIlNURU5DSUxfVEVTVCIsIlNURU5DSUxfQlVGRkVSX0JJVCIsIm1hc2tDb3VudCIsImN1cnJlbnRDYW1lcmFNYXNrIiwiY3VycmVudE1hc2siLCJhcHBseVN0ZW5jaWwiLCJjb2xvck1hc2siLCJzdGVuY2lsRnVuYyIsIkVRVUFMIiwic3RlbmNpbE9wIiwiS0VFUCIsIklOQ1IiLCJERUNSIiwicmVuZGVyV2ViR0wiLCJOT1RFUVVBTCIsImN1cnJlbnRDb250ZXh0Iiwic2F2ZSIsInJlbmRlckNhbnZhcyIsImNsaXAiLCJyZXN0b3JlIiwiZnJhZ21lbnRTcmMiLCJ2ZXJ0ZXhTcmMiLCJ1bmlmb3JtcyIsInBhcmVudEVsZW1lbnQiLCJpbm5lckhlaWdodCIsIm9yaWVudGF0aW9uIiwicnVsZXIiLCJpbm5lcldpZHRoIiwic2NyZWVuIiwibW96T3JpZW50YXRpb24iLCJtc09yaWVudGF0aW9uIiwiT1JJRU5UQVRJT04iLCJQT1JUUkFJVCIsIkxBTkRTQ0FQRSIsIm1hdGNoTWVkaWEiLCJsb2FkWE1MIiwiaXNTZXRUaW1lT3V0IiwidGltZU91dElEIiwic3RlcFRpbWVvdXQiLCJ0YXJnZXRGUFMiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIkRvbSIsIkdldFNjcmVlbk9yaWVudGF0aW9uIiwiR2V0VGFyZ2V0IiwiUGFyc2VYTUwiLCJSZW1vdmVGcm9tRE9NIiwiZmxpcFgiLCJmbGlwWSIsInNldFNjYWxlIiwic2Nyb2xsRmFjdG9yIiwic2V0U2Nyb2xsRmFjdG9yIiwib3giLCJveSIsImJsZW5kTW9kZSIsIk5PUk1BTCIsInByZVVwZGF0ZSIsImFuaW1Db25maWciLCJzZXREZWxheSIsInNldFJlcGVhdCIsInNldFJlcGVhdERlbGF5Iiwic2V0WW95byIsIkxpc3QiLCJTdGFibGVTb3J0IiwiRGlzcGxheUxpc3QiLCJzb3J0Q2hpbGRyZW5GbGFnIiwiZGVwdGhTb3J0IiwiaW5wbGFjZSIsInNvcnRCeURlcHRoIiwiY2hpbGRBIiwiY2hpbGRCIiwiX2RlcHRoIiwiQ29tcG9uZW50c1RvSlNPTiIsInJlbmRlckZsYWdzIiwiaWdub3JlRGVzdHJveSIsInNldEFjdGl2ZSIsInNldFN0YXRlIiwic2V0RGF0YUVuYWJsZWQiLCJzZXREYXRhIiwiaW5jRGF0YSIsInRvZ2dsZURhdGEiLCJzaGFwZSIsImRyb3Bab25lIiwiZGlzYWJsZUludGVyYWN0aXZlIiwiZW5hYmxlZCIsInJlbW92ZUludGVyYWN0aXZlIiwid2lsbFJlbmRlciIsIlJFTkRFUl9NQVNLIiwiZ2V0SW5kZXhMaXN0IiwiaW5kZXhlcyIsImdldEluZGV4IiwiZnJvbVNjZW5lIiwicHJlRGVzdHJveSIsImZhY3RvcnlUeXBlIiwiZmFjdG9yeUZ1bmN0aW9uIiwiZXhpc3RpbmciLCJQcm9jZXNzUXVldWUiLCJVcGRhdGVMaXN0IiwiUFJFX1VQREFURSIsInNjZW5lVXBkYXRlIiwiX2FjdGl2ZSIsIl9wZW5kaW5nIiwiX2Rlc3Ryb3kiLCJfdG9Qcm9jZXNzIiwibGluZXMiLCJzaG9ydGVzdCIsImxvbmdlc3QiLCJ3cmFwcGVkVGV4dCIsInRleHRMZW5ndGgiLCJ3b3JkV3JhcENoYXJDb2RlIiwiY2hhcnMiLCJmb250RGF0YSIsImxpbmVIZWlnaHQiLCJ4QWR2YW5jZSIsInlBZHZhbmNlIiwiZ2x5cGgiLCJmb250U2l6ZSIsImxhc3RHbHlwaCIsImxhc3RDaGFyQ29kZSIsImxpbmVXaWR0aHMiLCJzaG9ydGVzdExpbmUiLCJsb25nZXN0TGluZSIsImN1cnJlbnRMaW5lIiwiY3VycmVudExpbmVXaWR0aCIsImdseXBoS2VybmluZ09mZnNldCIsImtlcm5pbmciLCJjciIsInhPZmZzZXQiLCJjcnMiLCJrZXJuaW5nT2Zmc2V0IiwiZ3ciLCJnaCIsImRpc3BsYXlPcmlnaW5YIiwiZGlzcGxheU9yaWdpblkiLCJQYXJzZVhNTEJpdG1hcEZvbnQiLCJmb250TmFtZSIsImZyYW1lS2V5IiwieG1sS2V5IiwieFNwYWNpbmciLCJ5U3BhY2luZyIsImxldHRlcnMiLCJzcGFjaW5nWCIsInNwYWNpbmdZIiwibGluZVNwYWNpbmciLCJjaGFyc1BlclJvdyIsInJldHJvRm9udCIsImZvbnQiLCJ5T2Zmc2V0IiwiZ2V0VmFsdWUiLCJpbmZvIiwiYWRqdXN0Rm9yVHJpbSIsInRyaW1tZWQiLCJneCIsImd5Iiwia2VybmluZ3MiLCJrZXJuIiwiUkVUUk9fRk9OVF9DT05TVCIsIlJldHJvRm9udCIsIlBhcnNlIiwiVEVYVF9TRVQxIiwiVEVYVF9TRVQyIiwiVEVYVF9TRVQzIiwiVEVYVF9TRVQ0IiwiVEVYVF9TRVQ1IiwiVEVYVF9TRVQ2IiwiVEVYVF9TRVQ3IiwiVEVYVF9TRVQ4IiwiVEVYVF9TRVQ5IiwiVEVYVF9TRVQxMCIsIlRFWFRfU0VUMTEiLCJCaXRtYXBUZXh0IiwiUmVuZGVyIiwiRHluYW1pY0JpdG1hcFRleHQiLCJhbGlnbiIsImNyb3BXaWR0aCIsImNyb3BIZWlnaHQiLCJkaXNwbGF5Q2FsbGJhY2siLCJjYWxsYmFja0RhdGEiLCJ0aW50Iiwic2V0RGlzcGxheUNhbGxiYWNrIiwic2V0U2Nyb2xsWCIsInNldFNjcm9sbFkiLCJTZXRUcmFuc2Zvcm0iLCJpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSIsInBhcmVudE1hdHJpeCIsIl90ZXh0IiwiX2xldHRlclNwYWNpbmciLCJnbHlwaFgiLCJnbHlwaFkiLCJnbHlwaFciLCJnbHlwaEgiLCJ0ZXh0dXJlWCIsImN1dFgiLCJ0ZXh0dXJlWSIsImN1dFkiLCJiYXNlU2NhbGUiLCJfZm9udFNpemUiLCJfYWxpZ24iLCJsaW5lT2Zmc2V0WCIsImdldFRleHRCb3VuZHMiLCJsaW5lRGF0YSIsImJpdG1hcFRleHQiLCJVdGlscyIsImNyb3AiLCJwdXNoU2Npc3NvciIsImNhbU1hdHJpeCIsIl90ZW1wTWF0cml4MSIsInNwcml0ZU1hdHJpeCIsIl90ZW1wTWF0cml4MiIsImNhbGNNYXRyaXgiLCJfdGVtcE1hdHJpeDMiLCJmb250TWF0cml4IiwiX3RlbXBNYXRyaXg0IiwiY29weUZyb20iLCJtdWx0aXBseVdpdGhPZmZzZXQiLCJ0ZXh0dXJlV2lkdGgiLCJ0ZXh0dXJlSGVpZ2h0IiwidGludEVmZmVjdCIsIl9pc1RpbnRlZCIsInRpbnRGaWxsIiwidGludFRMIiwiZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEiLCJfdGludFRMIiwiX2FscGhhVEwiLCJ0aW50VFIiLCJfdGludFRSIiwiX2FscGhhVFIiLCJ0aW50QkwiLCJfdGludEJMIiwiX2FscGhhQkwiLCJ0aW50QlIiLCJfdGludEJSIiwiX2FscGhhQlIiLCJzZXRUZXh0dXJlMkQiLCJ4dyIsInloIiwidHgwIiwidHkwIiwidHgxIiwidHkxIiwidHgyIiwidHkyIiwidHgzIiwidHkzIiwiYmF0Y2hRdWFkIiwicG9wU2Npc3NvciIsIkdldEJpdG1hcFRleHRTaXplIiwiUGFyc2VGcm9tQXRsYXMiLCJCbGVuZE1vZGUiLCJEZXB0aCIsIk1hc2siLCJPcmlnaW4iLCJQaXBlbGluZSIsIlNjcm9sbEZhY3RvciIsIlRleHR1cmUiLCJUcmFuc2Zvcm0iLCJfZGlydHkiLCJfbWF4V2lkdGgiLCJzZXRUZXh0dXJlIiwiaW5pdFBpcGVsaW5lIiwic2V0VGV4dCIsInNldExlZnRBbGlnbiIsIkFMSUdOX0xFRlQiLCJzZXRDZW50ZXJBbGlnbiIsIkFMSUdOX0NFTlRFUiIsInNldFJpZ2h0QWxpZ24iLCJBTElHTl9SSUdIVCIsInNldEZvbnRTaXplIiwic2V0TGV0dGVyU3BhY2luZyIsInVwZGF0ZURpc3BsYXlPcmlnaW4iLCJzZXRGb250Iiwic2V0TWF4V2lkdGgiLCJUb0pTT04iLCJnZXRYIiwiZ2V0WSIsIkJsaXR0ZXJSZW5kZXIiLCJCb2IiLCJCbGl0dGVyIiwiU2l6ZSIsInJlbmRlckxpc3QiLCJib2IiLCJhZGRBdCIsImNyZWF0ZUZyb21DYWxsYmFjayIsImJvYnMiLCJzaW5nbGVGcmFtZSIsImNoaWxkQ2FuUmVuZGVyIiwiZ2V0UmVuZGVyTGlzdCIsImJsZW5kTW9kZXMiLCJpbWFnZVNtb290aGluZ0VuYWJsZWQiLCJjYW1lcmFTY3JvbGxYIiwiY2FtZXJhU2Nyb2xsWSIsImNvcHlUb0NvbnRleHQiLCJmbGlwIiwiY2QiLCJjYW52YXNEYXRhIiwiYm9iQWxwaGEiLCJnbG9iYWxBbHBoYSIsImJsaXR0ZXIiLCJibGl0dGVyWCIsImJsaXR0ZXJZIiwicHJldlRleHR1cmVTb3VyY2VJbmRleCIsIl9hbHBoYSIsInJlc2V0RmxpcCIsInNldEZsaXBYIiwic2V0RmxpcFkiLCJzZXRGbGlwIiwic2V0QWxwaGEiLCJjbGVhckFscGhhIiwiYWxwaGFUb3BMZWZ0IiwiYWxwaGFUb3BSaWdodCIsImFscGhhQm90dG9tTGVmdCIsImFscGhhQm90dG9tUmlnaHQiLCJBbHBoYVNpbmdsZSIsIkJhc2VBbmltYXRpb24iLCJhbmltYXRpb25NYW5hZ2VyIiwibmV4dEFuaW0iLCJfdGltZVNjYWxlIiwiX3BhdXNlZCIsIl93YXNQbGF5aW5nIiwiX3BlbmRpbmdTdG9wVmFsdWUiLCJnZXREZWxheSIsImdldEN1cnJlbnRLZXkiLCJhdEZyYW1lIiwiZnJvbUZyYW1lIiwiaXNQYXVzZWQiLCJpZ25vcmVJZlBsYXlpbmciLCJfc3RhcnRBbmltYXRpb24iLCJwbGF5UmV2ZXJzZSIsImdldFByb2dyZXNzIiwic2V0UHJvZ3Jlc3MiLCJzZXRDdXJyZW50RnJhbWUiLCJnZXRSZXBlYXQiLCJnZXRSZXBlYXREZWxheSIsInJlc3RhcnQiLCJzdG9wQWZ0ZXJEZWxheSIsInN0b3BPblJlcGVhdCIsInN0b3BPbkZyYW1lIiwic2V0VGltZVNjYWxlIiwiZ2V0VGltZVNjYWxlIiwiZ2V0VG90YWxGcmFtZXMiLCJpc0Nyb3BwZWQiLCJ1cGRhdGVDcm9wVVZzIiwiX2Nyb3AiLCJzZXRTaXplVG9GcmFtZSIsIl9vcmlnaW5Db21wb25lbnQiLCJjdXN0b21QaXZvdCIsInBpdm90WCIsInBpdm90WSIsImdldFlveW8iLCJfYmxlbmRNb2RlIiwic2V0QmxlbmRNb2RlIiwic2V0RGlzcGxheVNpemUiLCJDcm9wIiwic2V0Q3JvcCIsInNldENyb3BVVnMiLCJyZXNldENyb3BPYmplY3QiLCJjdyIsInRvZ2dsZUZsaXBYIiwidG9nZ2xlRmxpcFkiLCJHZXRCb3VuZHMiLCJwcmVwYXJlQm91bmRzT3V0cHV0IiwiaW5jbHVkZVBhcmVudCIsImdldEJvdW5kc1RyYW5zZm9ybU1hdHJpeCIsInRyYW5zZm9ybVBvaW50IiwiZ2V0Q2VudGVyIiwiZ2V0VG9wTGVmdCIsImdldFRvcENlbnRlciIsImdldFRvcFJpZ2h0IiwiZ2V0TGVmdENlbnRlciIsImdldFJpZ2h0Q2VudGVyIiwiZ2V0Qm90dG9tTGVmdCIsImdldEJvdHRvbUNlbnRlciIsImdldEJvdHRvbVJpZ2h0IiwiVEx4IiwiVEx5IiwiVFJ4IiwiVFJ5IiwiQkx4IiwiQkx5IiwiQlJ4IiwiQlJ5IiwiY3JlYXRlQml0bWFwTWFzayIsImNyZWF0ZUdlb21ldHJ5TWFzayIsIl9kaXNwbGF5T3JpZ2luWCIsIl9kaXNwbGF5T3JpZ2luWSIsInNldE9yaWdpbkZyb21GcmFtZSIsInNldERpc3BsYXlPcmlnaW4iLCJHZXRCb29sZWFuIiwiVFdFRU5fQ09OU1QiLCJQYXRoRm9sbG93ZXIiLCJyb3RhdGVUb1BhdGgiLCJwYXRoUm90YXRpb25PZmZzZXQiLCJwYXRoT2Zmc2V0IiwicGF0aFZlY3RvciIsInBhdGhEZWx0YSIsInBhdGhUd2VlbiIsInBhdGhDb25maWciLCJfcHJldkRpcmVjdGlvbiIsIlBMQVlJTkdfRk9SV0FSRCIsInNldFBhdGgiLCJzZXRSb3RhdGVUb1BhdGgiLCJpc0ZvbGxvd2luZyIsInN0YXJ0QXQiLCJwb3NpdGlvbk9uUGF0aCIsInNlZWsiLCJvblN0YXJ0IiwidHdlZW5EYXRhIiwiZWxhcHNlZCIsImFkZENvdW50ZXIiLCJuZXh0UG9pbnQiLCJhdGFuMiIsInBhdXNlRm9sbG93IiwicmVzdW1lRm9sbG93IiwicGF0aFVwZGF0ZSIsIkNPTVBMRVRFIiwiUExBWUlOR19CQUNLV0FSRCIsIm9sZFgiLCJvbGRZIiwiZGVmYXVsdFBpcGVsaW5lIiwicGlwZWxpbmVOYW1lIiwicmVzZXRQaXBlbGluZSIsImdldFBpcGVsaW5lTmFtZSIsIl9zaXplQ29tcG9uZW50IiwicmVhbFdpZHRoIiwicmVhbEhlaWdodCIsInVwZGF0ZVNpemUiLCJ1cGRhdGVPcmlnaW4iLCJjdXRXaWR0aCIsImN1dEhlaWdodCIsIlRleHR1cmVDcm9wIiwiY2xlYXJUaW50Iiwic2V0VGludEZpbGwiLCJ0aW50VG9wTGVmdCIsInRpbnRUb3BSaWdodCIsInRpbnRCb3R0b21MZWZ0IiwidGludEJvdHRvbVJpZ2h0IiwiaXNUaW50ZWQiLCJXcmFwQW5nbGUiLCJXcmFwQW5nbGVEZWdyZWVzIiwiX3NjYWxlWCIsIl9zY2FsZVkiLCJSQURfVE9fREVHIiwiREVHX1RPX1JBRCIsInNldFJhbmRvbVBvc2l0aW9uIiwic2V0VyIsImdldExvY2FsVHJhbnNmb3JtTWF0cml4IiwidGVtcE1hdHJpeCIsImdldFdvcmxkVHJhbnNmb3JtTWF0cml4IiwiZ2V0UGFyZW50Um90YXRpb24iLCJkZWNvbXBvc2VkTWF0cml4IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJhY29zIiwiYXRhbiIsInJvdGF0aW9uTm9ybWFsaXplZCIsIlRBVSIsImxvYWRJZGVudGl0eSIsInJocyIsImxvY2FsQSIsImxvY2FsQiIsImxvY2FsQyIsImxvY2FsRCIsImxvY2FsRSIsImxvY2FsRiIsInNvdXJjZUEiLCJzb3VyY2VCIiwic291cmNlQyIsInNvdXJjZUQiLCJzb3VyY2VFIiwic291cmNlRiIsImRlc3RpbmF0aW9uTWF0cml4Iiwib3RoZXJNYXRyaXgiLCJhMCIsImIwIiwiYzAiLCJkMCIsInBzZSIsInBzZiIsImMxIiwiZDEiLCJ0cmFuc2Zvcm0iLCJjb3B5RnJvbUFycmF5Iiwic2V0VG9Db250ZXh0Iiwic2V0VHJhbnNmb3JtIiwiY29weVRvQXJyYXkiLCJkZWNvbXBvc2VNYXRyaXgiLCJkZXRlcm0iLCJyYWRpYW5TaW4iLCJyYWRpYW5Db3MiLCJhcHBseUludmVyc2UiLCJnZXRDU1NNYXRyaXgiLCJDb21wdXRlZFNpemUiLCJBcnJheVV0aWxzIiwiVW5pb24iLCJDb250YWluZXIiLCJleGNsdXNpdmUiLCJtYXhTaXplIiwibG9jYWxUcmFuc2Zvcm0iLCJ0ZW1wVHJhbnNmb3JtTWF0cml4IiwiX2Rpc3BsYXlMaXN0IiwiX3NvcnRLZXkiLCJfc3lzRXZlbnRzIiwiU0tJUF9DSEVDSyIsInNldEV4Y2x1c2l2ZSIsInRyYW5zZm9ybWVkUG9zaXRpb24iLCJ0ZW1wUmVjdCIsImZpcnN0Q2hpbGRCb3VuZHMiLCJhZGRIYW5kbGVyIiwicmVtb3ZlSGFuZGxlciIsInBvaW50VG9Db250YWluZXIiLCJBZGQiLCJBZGRBdCIsImdldEF0IiwiZ2V0QnlOYW1lIiwiZ2V0UmFuZG9tIiwic3RhcnRJbmRleCIsIkdldFJhbmRvbSIsImdldEZpcnN0IiwiZW5kSW5kZXgiLCJHZXRBbGwiLCJDb3VudEFsbE1hdGNoaW5nIiwiY2hpbGQxIiwiY2hpbGQyIiwiU3dhcCIsImRlc3Ryb3lDaGlsZCIsIlJlbW92ZSIsInJlbW92ZUF0IiwiUmVtb3ZlQXQiLCJyZW1vdmVCZXR3ZWVuIiwiUmVtb3ZlQmV0d2VlbiIsImJyaW5nVG9Ub3AiLCJCcmluZ1RvVG9wIiwic2VuZFRvQmFjayIsIlNlbmRUb0JhY2siLCJtb3ZlVXAiLCJNb3ZlVXAiLCJtb3ZlRG93biIsIk1vdmVEb3duIiwic2h1ZmZsZSIsIm9sZENoaWxkIiwibmV3Q2hpbGQiLCJSZXBsYWNlIiwic2V0QWxsIiwiU2V0QWxsIiwidHJhbnNmb3JtTWF0cml4IiwiY29udGFpbmVySGFzQmxlbmRNb2RlIiwiY2hpbGRBbHBoYSIsImNoaWxkU2Nyb2xsRmFjdG9yWCIsImNoaWxkU2Nyb2xsRmFjdG9yWSIsImN1cnJlbnRCbGVuZE1vZGUiLCJjaGlsZENvdW50IiwiY2hpbGRBbHBoYVRvcExlZnQiLCJjaGlsZEFscGhhVG9wUmlnaHQiLCJjaGlsZEFscGhhQm90dG9tTGVmdCIsImNoaWxkQWxwaGFCb3R0b21SaWdodCIsImN1cnJlbnRUeXBlIiwibmV3VHlwZSIsIm5leHRUeXBlTWF0Y2giLCJET01FbGVtZW50UmVuZGVyIiwiU0NFTkVfRVZFTlRTIiwiRE9NRWxlbWVudCIsImlubmVyVGV4dCIsInRyYW5zZm9ybU9ubHkiLCJza2V3WCIsInNrZXdZIiwicm90YXRlM2QiLCJyb3RhdGUzZEFuZ2xlIiwiZGlzcGF0Y2hOYXRpdmVFdmVudCIsInNldEVsZW1lbnQiLCJTTEVFUCIsImhhbmRsZVNjZW5lRXZlbnQiLCJXQUtFIiwic2V0U2tldyIsInNldFBlcnNwZWN0aXZlIiwidGFnTmFtZSIsInJlbW92ZUVsZW1lbnQiLCJ6SW5kZXgiLCJwaGFzZXIiLCJjcmVhdGVGcm9tQ2FjaGUiLCJjcmVhdGVGcm9tSFRNTCIsIm5vZGVCb3VuZHMiLCJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCIsImdldENoaWxkQnlQcm9wZXJ0eSIsImdldENoaWxkQnlJRCIsImdldENoaWxkQnlOYW1lIiwic2V0Q2xhc3NOYW1lIiwic2V0SFRNTCIsIkNTU0JsZW5kTW9kZXMiLCJzcmNNYXRyaXgiLCJwb2ludGVyRXZlbnRzIiwibWl4QmxlbmRNb2RlIiwidHJhbnNmb3JtT3JpZ2luIiwiVklERU9fQ09NUExFVEUiLCJWSURFT19DUkVBVEVEIiwiVklERU9fRVJST1IiLCJWSURFT19MT09QIiwiVklERU9fUExBWSIsIlZJREVPX1NFRUtFRCIsIlZJREVPX1NFRUtJTkciLCJWSURFT19TVE9QIiwiVklERU9fVElNRU9VVCIsIlZJREVPX1VOTE9DS0VEIiwiRXh0ZXJuUmVuZGVyIiwiRXh0ZXJuIiwiZXh0ZXJuIiwiY3VycmVudFBpcGVsaW5lIiwiY2xlYXJQaXBlbGluZSIsInJlYmluZFBpcGVsaW5lIiwiQVJDIiwiQkVHSU5fUEFUSCIsIkNMT1NFX1BBVEgiLCJGSUxMX1JFQ1QiLCJMSU5FX1RPIiwiTU9WRV9UTyIsIkxJTkVfU1RZTEUiLCJGSUxMX1NUWUxFIiwiRklMTF9QQVRIIiwiU1RST0tFX1BBVEgiLCJGSUxMX1RSSUFOR0xFIiwiU1RST0tFX1RSSUFOR0xFIiwiU0FWRSIsIlJFU1RPUkUiLCJUUkFOU0xBVEUiLCJTQ0FMRSIsIlJPVEFURSIsIlNFVF9URVhUVVJFIiwiQ0xFQVJfVEVYVFVSRSIsIkdSQURJRU5UX0ZJTExfU1RZTEUiLCJHUkFESUVOVF9MSU5FX1NUWUxFIiwiQ29tbWFuZHMiLCJDb21wb25lbnRzQWxwaGEiLCJDb21wb25lbnRzQmxlbmRNb2RlIiwiQ29tcG9uZW50c0RlcHRoIiwiQ29tcG9uZW50c01hc2siLCJDb21wb25lbnRzUGlwZWxpbmUiLCJDb21wb25lbnRzVHJhbnNmb3JtIiwiQ29tcG9uZW50c1Zpc2libGUiLCJDb21wb25lbnRzU2Nyb2xsRmFjdG9yIiwiR3JhcGhpY3MiLCJjb21tYW5kQnVmZmVyIiwiZGVmYXVsdEZpbGxDb2xvciIsImRlZmF1bHRGaWxsQWxwaGEiLCJkZWZhdWx0U3Ryb2tlV2lkdGgiLCJkZWZhdWx0U3Ryb2tlQ29sb3IiLCJkZWZhdWx0U3Ryb2tlQWxwaGEiLCJfbGluZVdpZHRoIiwic2V0RGVmYXVsdFN0eWxlcyIsImxpbmVTdHlsZSIsImxpbmVXaWR0aCIsImZpbGxHcmFkaWVudFN0eWxlIiwibGluZUdyYWRpZW50U3R5bGUiLCJmaWxsUGF0aCIsInN0cm9rZSIsImZpbGxDaXJjbGVTaGFwZSIsImZpbGxDaXJjbGUiLCJzdHJva2VDaXJjbGVTaGFwZSIsInN0cm9rZUNpcmNsZSIsImFyYyIsIlBJMiIsImZpbGxSZWN0U2hhcGUiLCJzdHJva2VSZWN0U2hhcGUiLCJzdHJva2VSZWN0IiwibGluZVdpZHRoSGFsZiIsIm1pbngiLCJtYXh4IiwiZmlsbFJvdW5kZWRSZWN0IiwidGwiLCJibCIsImJyIiwic3Ryb2tlUm91bmRlZFJlY3QiLCJmaWxsUG9pbnRTaGFwZSIsImZpbGxQb2ludCIsImZpbGxUcmlhbmdsZVNoYXBlIiwiZmlsbFRyaWFuZ2xlIiwic3Ryb2tlVHJpYW5nbGVTaGFwZSIsInN0cm9rZVRyaWFuZ2xlIiwic3Ryb2tlTGluZVNoYXBlIiwiY2xvc2VTaGFwZSIsImZpbGxQb2ludHMiLCJzdHJva2VFbGxpcHNlU2hhcGUiLCJzbW9vdGhuZXNzIiwic3Ryb2tlRWxsaXBzZSIsImZpbGxFbGxpcHNlU2hhcGUiLCJmaWxsRWxsaXBzZSIsImFudGljbG9ja3dpc2UiLCJvdmVyc2hvb3QiLCJ0cmFuc2xhdGVDYW52YXMiLCJzY2FsZUNhbnZhcyIsInJvdGF0ZUNhbnZhcyIsImdlbmVyYXRlVGV4dHVyZSIsIlRhcmdldENhbWVyYSIsImdldFNvdXJjZUltYWdlIiwiY3JlYXRlQ2FudmFzIiwicmVmcmVzaCIsInJlbmRlclRhcmdldEN0eCIsImFsbG93Q2xpcCIsImNvbW1hbmRCdWZmZXJMZW5ndGgiLCJsaW5lQWxwaGEiLCJmaWxsQWxwaGEiLCJsaW5lQ29sb3IiLCJmaWxsQ29sb3IiLCJzdHJva2VTdHlsZSIsIkxJTkVfRlhfVE8iLCJNT1ZFX0ZYX1RPIiwiUG9pbnQiLCJwb2ludHNMZW5ndGgiLCJtYXRyaXhTdGFjayIsImdyYXBoaWNzTWF0cml4IiwiY3VycmVudE1hdHJpeCIsImNvbW1hbmRzIiwiZmlsbFRpbnQiLCJzdHJva2VUaW50IiwidGEiLCJwYXRoSW5kZXgiLCJwYXRoT3BlbiIsImxhc3RQYXRoIiwiZ2V0VGludCIsImdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcCIsImN1cnJlbnRUZXh0dXJlIiwiYmxhbmtUZXh0dXJlIiwiY21kSW5kZXgiLCJiYXRjaEZpbGxQYXRoIiwiYmF0Y2hTdHJva2VQYXRoIiwic3Ryb2tlVGludENvbG9yIiwiVEwiLCJUUiIsIkJMIiwiQlIiLCJmaWxsVGludENvbG9yIiwiZ3JhZGllbnRGaWxsQWxwaGEiLCJncmFkaWVudExpbmVBbHBoYSIsIml0ZXJhdGlvbiIsImJhdGNoRmlsbFJlY3QiLCJiYXRjaEZpbGxUcmlhbmdsZSIsImJhdGNoU3Ryb2tlVHJpYW5nbGUiLCJBY3Rpb25zIiwiUmFuZ2UiLCJHcm91cCIsImNsYXNzVHlwZSIsImRlZmF1bHRLZXkiLCJkZWZhdWx0RnJhbWUiLCJydW5DaGlsZFVwZGF0ZSIsImNyZWF0ZUNhbGxiYWNrIiwicmVtb3ZlQ2FsbGJhY2siLCJjcmVhdGVNdWx0aXBsZUNhbGxiYWNrIiwiaW50ZXJuYWxDcmVhdGVDYWxsYmFjayIsImludGVybmFsUmVtb3ZlQ2FsbGJhY2siLCJpc0Z1bGwiLCJyYW5kb21LZXkiLCJyYW5kb21GcmFtZSIsImZyYW1lUXVhbnRpdHkiLCJyYW5nZSIsInF0eSIsInJhbmRvbUIiLCJjcmVhdGVkIiwic3RlcFJvdGF0aW9uIiwic3RlcFNjYWxlWCIsInN0ZXBTY2FsZVkiLCJzdGVwQWxwaGEiLCJzdGVwRGVwdGgiLCJzdGVwU2Nyb2xsRmFjdG9yWCIsInN0ZXBTY3JvbGxGYWN0b3JZIiwiZ3JpZCIsImFkZE11bHRpcGxlIiwicmVtb3ZlRnJvbVNjZW5lIiwiY3JlYXRlSWZOdWxsIiwiZ2V0SGFuZGxlciIsImdldEZpcnN0TnRoIiwibnRoIiwiZ2V0TGFzdCIsImdldExhc3ROdGgiLCJmb3J3YXJkcyIsImdldEZpcnN0QWxpdmUiLCJnZXRGaXJzdERlYWQiLCJwbGF5QW5pbWF0aW9uIiwiY291bnRBY3RpdmUiLCJnZXRUb3RhbFVzZWQiLCJnZXRUb3RhbEZyZWUiLCJ1c2VkIiwicHJvcGVydHlWYWx1ZVNldCIsInByb3BlcnR5VmFsdWVJbmMiLCJzZXRYWSIsImluY1giLCJpbmNZIiwiaW5jWFkiLCJzaGlmdFBvc2l0aW9uIiwicm90YXRlQXJvdW5kRGlzdGFuY2UiLCJzY2FsZVhZIiwic2V0SGl0QXJlYSIsImtpbGwiLCJraWxsQW5kSGlkZSIsInRvZ2dsZVZpc2libGUiLCJkZXN0cm95Q2hpbGRyZW4iLCJJbWFnZVJlbmRlciIsImJhdGNoU3ByaXRlIiwiR2FtZU9iamVjdHMiLCJQYXJ0aWNsZXMiLCJSZW5kZXJUZXh0dXJlIiwiUm9wZSIsIlRleHQiLCJUaWxlU3ByaXRlIiwiWm9uZSIsIlNoYXBlIiwiQXJjIiwiR3JpZCIsIklzb0JveCIsIklzb1RyaWFuZ2xlIiwiUG9seWdvbiIsIlN0YXIiLCJUcmlhbmdsZSIsIkZhY3RvcmllcyIsIlN0YXRpY0JpdG1hcFRleHQiLCJDcmVhdG9ycyIsIk1lc2giLCJRdWFkIiwiU2hhZGVyIiwiTGlnaHQiLCJzZXRDb2xvciIsImdldEZsb2F0c0Zyb21VaW50UkdCIiwic2V0SW50ZW5zaXR5Iiwic2V0UmFkaXVzIiwiTGlnaHRzTWFuYWdlciIsImxpZ2h0UG9vbCIsImxpZ2h0cyIsImN1bGxlZExpZ2h0cyIsImFtYmllbnRDb2xvciIsImNhbWVyYUNlbnRlclgiLCJjYW1lcmFDZW50ZXJZIiwiY2FtZXJhUmFkaXVzIiwibGlnaHQiLCJmb3JFYWNoTGlnaHQiLCJzZXRBbWJpZW50Q29sb3IiLCJnZXRNYXhWaXNpYmxlTGlnaHRzIiwiZ2V0TGlnaHRDb3VudCIsImFkZExpZ2h0IiwicmVtb3ZlTGlnaHQiLCJMaWdodHNQbHVnaW4iLCJNZXNoUmVuZGVyIiwidXYiLCJhbHBoYXMiLCJ2ZXJ0aWNlc1VCIiwibWVzaCIsInV2cyIsIm1lc2hWZXJ0aWNlc0xlbmd0aCIsInZlcnRleENvdW50IiwidmVydGV4Q2FwYWNpdHkiLCJ2ZXJ0ZXhWaWV3RjMyIiwidmVydGV4Vmlld1UzMiIsInZlcnRleE9mZnNldCIsInZlcnRleENvbXBvbmVudENvdW50IiwiY29sb3JJbmRleCIsIkZsb2F0QmV0d2VlbiIsIkdldEVhc2VGdW5jdGlvbiIsIkVtaXR0ZXJPcCIsImVtaXRPbmx5IiwicHJvcGVydHlWYWx1ZSIsInN0ZXBzIiwib25FbWl0IiwiZGVmYXVsdEVtaXQiLCJvblVwZGF0ZSIsImRlZmF1bHRVcGRhdGUiLCJsb2FkQ29uZmlnIiwibmV3S2V5Iiwic2V0TWV0aG9kcyIsIm9uQ2hhbmdlIiwic3RhdGljVmFsdWVFbWl0Iiwic3RhdGljVmFsdWVVcGRhdGUiLCJyYW5kb21TdGF0aWNWYWx1ZUVtaXQiLCJoYXNCb3RoIiwiaXNSYW5kb20iLCJybmQiLCJyYW5kb21SYW5nZWRWYWx1ZUVtaXQiLCJzdGVwcGVkRW1pdCIsImVhc2VUeXBlIiwiZWFzZWRWYWx1ZUVtaXQiLCJlYXNlVmFsdWVVcGRhdGUiLCJoYXNFaXRoZXIiLCJrZXkxIiwia2V5MiIsInBhcnRpY2xlIiwicmFuZG9tSW5kZXgiLCJHcmF2aXR5V2VsbCIsInBvd2VyIiwiZXBzaWxvbiIsImdyYXZpdHkiLCJfZ3Jhdml0eSIsIl9wb3dlciIsIl9lcHNpbG9uIiwiZFNxIiwiZmFjdG9yIiwidmVsb2NpdHlYIiwidmVsb2NpdHlZIiwicHdyIiwiUGFydGljbGUiLCJhY2NlbGVyYXRpb25YIiwiYWNjZWxlcmF0aW9uWSIsIm1heFZlbG9jaXR5WCIsIm1heFZlbG9jaXR5WSIsImJvdW5jZSIsImxpZmUiLCJsaWZlQ3VycmVudCIsImRlbGF5Q3VycmVudCIsImxpZmVUIiwiaXNBbGl2ZSIsInJlc2V0UG9zaXRpb24iLCJlbWl0Wm9uZSIsImxpZmVzcGFuIiwicmFkaWFsIiwicmFkIiwibW92ZVRvWCIsIm1vdmVUb1kiLCJhY2NlbGVyYXRpb24iLCJjb21wdXRlVmVsb2NpdHkiLCJwcm9jZXNzb3JzIiwidngiLCJ2eSIsImdyYXZpdHlYIiwiZ3Jhdml0eVkiLCJjaGVja0JvdW5kcyIsImNvbGxpZGVMZWZ0IiwiY29sbGlkZVJpZ2h0IiwiY29sbGlkZVRvcCIsImNvbGxpZGVCb3R0b20iLCJkZWF0aFpvbmUiLCJ3aWxsS2lsbCIsIkRlYXRoWm9uZSIsIkVkZ2Vab25lIiwiSGFzQW55IiwiSGFzVmFsdWUiLCJSYW5kb21ab25lIiwiUGFydGljbGVFbWl0dGVyIiwiY29uZmlnRmFzdE1hcCIsImNvbmZpZ09wTWFwIiwicGFydGljbGVDbGFzcyIsImVtaXRDYWxsYmFjayIsImVtaXRDYWxsYmFja1Njb3BlIiwiZGVhdGhDYWxsYmFjayIsImRlYXRoQ2FsbGJhY2tTY29wZSIsIm1heFBhcnRpY2xlcyIsImZyZXF1ZW5jeSIsInBhcnRpY2xlQnJpbmdUb1RvcCIsInRpbWVTY2FsZSIsInRyYWNrVmlzaWJsZSIsImRlYWQiLCJhbGl2ZSIsIl9jb3VudGVyIiwiX2ZyYW1lQ291bnRlciIsImNhbGxiYWNrU2NvcGUiLCJzZXRFbWl0Wm9uZSIsInNldERlYXRoWm9uZSIsInNldEZyb21PYmplY3QiLCJfZnJhbWVMZW5ndGgiLCJwaWNrUmFuZG9tIiwic2V0RW1pdHRlckZyYW1lcyIsImZyYW1lQ29uZmlnIiwiaXNDeWNsZSIsInNldFJhZGlhbCIsInNldFNwZWVkWCIsInNldFNwZWVkWSIsInNldFNwZWVkIiwic2V0U2NhbGVYIiwic2V0U2NhbGVZIiwic2V0R3Jhdml0eVgiLCJzZXRHcmF2aXR5WSIsInNldEdyYXZpdHkiLCJzZXRFbWl0dGVyQW5nbGUiLCJzZXRMaWZlc3BhbiIsInNldFF1YW50aXR5Iiwic2V0RnJlcXVlbmN5Iiwiem9uZUNvbmZpZyIsImtpbGxPbkVudGVyIiwicmVzZXJ2ZSIsInBhcnRpY2xlQ291bnQiLCJnZXRBbGl2ZVBhcnRpY2xlQ291bnQiLCJnZXREZWFkUGFydGljbGVDb3VudCIsImdldFBhcnRpY2xlQ291bnQiLCJhdExpbWl0Iiwib25QYXJ0aWNsZUVtaXQiLCJvblBhcnRpY2xlRGVhdGgiLCJraWxsQWxsIiwiZm9yRWFjaEFsaXZlIiwiZm9yRWFjaERlYWQiLCJyZW1vdmVFbWl0dGVyIiwiZGVwdGhTb3J0Q2FsbGJhY2siLCJmbG93IiwiZXhwbG9kZSIsImVtaXRQYXJ0aWNsZSIsImVtaXRQYXJ0aWNsZUF0IiwiZ2V0UHJvY2Vzc29ycyIsInBhcnRpY2xlcyIsInJpcCIsIlBhcnRpY2xlRW1pdHRlck1hbmFnZXIiLCJlbWl0dGVycyIsImZyYW1lTmFtZXMiLCJ3ZWxscyIsImNyZWF0ZUVtaXR0ZXIiLCJnZXRGcmFtZXNGcm9tVGV4dHVyZVNvdXJjZSIsInNvdXJjZUZyYW1lIiwiYWRkRW1pdHRlciIsImFkZEdyYXZpdHlXZWxsIiwid2VsbCIsImNyZWF0ZUdyYXZpdHlXZWxsIiwiZW1pdHRlck1hbmFnZXIiLCJlbWl0dGVyc0xlbmd0aCIsInBhcnRpY2xlTWF0cml4IiwibWFuYWdlck1hdHJpeCIsIlpvbmVzIiwid2l0aGluWm9uZSIsIl9sZW5ndGgiLCJfZGlyZWN0aW9uIiwidXBkYXRlU291cmNlIiwib2xkTGVuZ3RoIiwiY2hhbmdlU291cmNlIiwiX3RlbXBWZWMiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwidG9wUmlnaHRYIiwidG9wUmlnaHRZIiwiYm90dG9tTGVmdFgiLCJib3R0b21MZWZ0WSIsImJvdHRvbVJpZ2h0WCIsImJvdHRvbVJpZ2h0WSIsInRvcExlZnRBbHBoYSIsInRvcFJpZ2h0QWxwaGEiLCJib3R0b21MZWZ0QWxwaGEiLCJib3R0b21SaWdodEFscGhhIiwidG9wTGVmdENvbG9yIiwidG9wUmlnaHRDb2xvciIsImJvdHRvbUxlZnRDb2xvciIsImJvdHRvbVJpZ2h0Q29sb3IiLCJzZXRUb3BMZWZ0Iiwic2V0VG9wUmlnaHQiLCJzZXRCb3R0b21MZWZ0Iiwic2V0Qm90dG9tUmlnaHQiLCJyZXNldEFscGhhIiwicmVzZXRDb2xvcnMiLCJxdWFkIiwiVVVJRCIsImdsb2JhbFRpbnQiLCJfc2F2ZWQiLCJhZGRDYW52YXMiLCJfZXJhc2VNb2RlIiwiZHJhd0dhbWVPYmplY3QiLCJiYXRjaEdhbWVPYmplY3RXZWJHTCIsImJhdGNoR2FtZU9iamVjdENhbnZhcyIsIk5FQVJFU1QiLCJpc1JlbmRlclRleHR1cmUiLCJiYXNlRnJhbWUiLCJjdXN0b21IaXRBcmVhIiwic2V0R2xvYmFsVGludCIsInNldEdsb2JhbEFscGhhIiwic2F2ZVRleHR1cmUiLCJyZW5hbWVUZXh0dXJlIiwic2V0RnJhbWVidWZmZXIiLCJwcm9qT3J0aG8iLCJnZXRUaW50RnJvbUZsb2F0cyIsInNldENvbnRleHQiLCJzY2lzc29yIiwiY2xlYXJDb2xvciIsIkNPTE9SX0JVRkZFUl9CSVQiLCJlcmFzZSIsIkVSQVNFIiwiYmF0Y2hMaXN0IiwiZHJhd0ZyYW1lIiwiYmF0Y2hUZXh0dXJlRnJhbWUiLCJiYXRjaEdyb3VwIiwiYmF0Y2hUZXh0dXJlRnJhbWVLZXkiLCJwcmV2WCIsInByZXZZIiwic25hcHNob3RBcmVhIiwiZW5jb2Rlck9wdGlvbnMiLCJzbmFwc2hvdEZyYW1lYnVmZmVyIiwic25hcHNob3RDYW52YXMiLCJzbmFwc2hvdCIsInNuYXBzaG90UGl4ZWwiLCJyZW5kZXJUZXh0dXJlIiwiYmF0Y2hUZXh0dXJlIiwic2V0QmxhbmtUZXh0dXJlIiwiUm9wZVJlbmRlciIsImhvcml6b250YWwiLCJfZmxpcFgiLCJfZmxpcFkiLCJfcGVycCIsImRlYnVnQ2FsbGJhY2siLCJkZWJ1Z0dyYXBoaWMiLCJyZXNpemVBcnJheXMiLCJzZXRQb2ludHMiLCJ1cGRhdGVWZXJ0aWNlcyIsInVwZGF0ZVVWcyIsInNldERpcnR5Iiwic2V0SG9yaXpvbnRhbCIsInNldFZlcnRpY2FsIiwic2V0QWxwaGFzIiwiYm90dG9tQWxwaGEiLCJjdXJyZW50QWxwaGFzIiwicHJldkFscGhhIiwic2V0Q29sb3JzIiwiY3VycmVudENvbG9ycyIsInByZXZDb2xvciIsImZyYW1lU2VnbWVudCIsInNlZ21lbnRzIiwiY3VycmVudFRvdGFsIiwiY3VycmVudFVWcyIsInBhcnRIIiwicGFydFYiLCJ1djAiLCJ1djEiLCJ1djIiLCJ1djMiLCJuZXdTaXplIiwicGVycCIsImxhc3RQb2ludCIsImZyYW1lU2l6ZSIsInBlcnBMZW5ndGgiLCJzZXREZWJ1ZyIsImdyYXBoaWMiLCJyZW5kZXJEZWJ1Z1ZlcnRzIiwibWVzaExlbmd0aCIsInZlcnRzIiwicHgwIiwicHkwIiwicHgxIiwicHkxIiwicm9wZSIsImRlYnVnVmVydHMiLCJTZXRWYWx1ZSIsIlNoYWRlclJlbmRlciIsInRleHR1cmVEYXRhIiwidmVydGV4RGF0YSIsInZlcnRleEJ1ZmZlciIsImNyZWF0ZVZlcnRleEJ1ZmZlciIsIlNUUkVBTV9EUkFXIiwicHJvZ3JhbSIsInZpZXdNYXRyaXgiLCJwcm9qZWN0aW9uTWF0cml4IiwiX3JlbmRlcmVyV2lkdGgiLCJfcmVuZGVyZXJIZWlnaHQiLCJfdGV4dHVyZUNvdW50Iiwic2V0U2hhZGVyIiwiYWRkR0xUZXh0dXJlIiwiZGVsZXRlUHJvZ3JhbSIsImNyZWF0ZVByb2dyYW0iLCJzZXRNYXRyaXg0Iiwic2V0RmxvYXQyIiwiZGVmYXVsdFVuaWZvcm1zIiwibW91c2UiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwic2FtcGxlUmF0ZSIsImlDaGFubmVsMCIsImlDaGFubmVsMSIsImlDaGFubmVsMiIsImlDaGFubmVsMyIsInNldFNhbXBsZXIyRCIsImluaXRVbmlmb3JtcyIsInNldFBvaW50ZXIiLCJsZWZ0UmlnaHQiLCJib3R0b21Ub3AiLCJwbSIsImdsRnVuY01hcCIsInVuaWZvcm0iLCJ1bmlmb3JtTG9jYXRpb24iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJnbE1hdHJpeCIsImdsVmFsdWVMZW5ndGgiLCJnbEZ1bmMiLCJzZXRTYW1wbGVyMkRCdWZmZXIiLCJ1bmlmb3JtS2V5IiwidGV4dHVyZUluZGV4IiwiaW5pdFNhbXBsZXIyRCIsImlzR0xUZXh0dXJlIiwic2V0VW5pZm9ybSIsImdldFVuaWZvcm0iLCJzZXRDaGFubmVsMCIsInNldENoYW5uZWwxIiwic2V0Q2hhbm5lbDIiLCJzZXRDaGFubmVsMyIsImFjdGl2ZVRleHR1cmUiLCJURVhUVVJFMCIsImJpbmRUZXh0dXJlIiwiVEVYVFVSRV8yRCIsIm1hZ0ZpbHRlciIsIm1pbkZpbHRlciIsIndyYXBTIiwid3JhcFQiLCJwaXhlbFN0b3JlaSIsIlVOUEFDS19GTElQX1lfV0VCR0wiLCJ0ZXhJbWFnZTJEIiwiVU5TSUdORURfQllURSIsInRleFBhcmFtZXRlcmkiLCJURVhUVVJFX01BR19GSUxURVIiLCJURVhUVVJFX01JTl9GSUxURVIiLCJURVhUVVJFX1dSQVBfUyIsIlRFWFRVUkVfV1JBUF9UIiwic2V0UHJvZ3JhbSIsInVuaWZvcm0xaSIsInN5bmNVbmlmb3JtcyIsInRleHR1cmVDb3VudCIsInRyYW5zcG9zZSIsIm1hdHJpeDJEIiwidm0iLCJ1c2VQcm9ncmFtIiwidW5pZm9ybU1hdHJpeDRmdiIsInVuaWZvcm0yZiIsInZlcnRleFNpemUiLCJiaW5kQnVmZmVyIiwiZ2V0QXR0cmliTG9jYXRpb24iLCJlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsInZmIiwiYnVmZmVyU3ViRGF0YSIsInN1YmFycmF5IiwiZHJhd0FycmF5cyIsIlRSSUFOR0xFUyIsImRlbGV0ZUJ1ZmZlciIsInNoYXBlTWF0cml4IiwicGF0aERhdGEiLCJwYXRoSW5kZXhlcyIsImJhdGNoVHJpIiwiYWx0Q29sb3IiLCJhbHRBbHBoYSIsInN0cm9rZUNvbG9yIiwic3Ryb2tlQWxwaGEiLCJnZW9tIiwiaXNGaWxsZWQiLCJpc1N0cm9rZWQiLCJfdGVtcExpbmUiLCJzZXRGaWxsU3R5bGUiLCJzZXRTdHJva2VTdHlsZSIsInNldENsb3NlUGF0aCIsInBhdGhMZW5ndGgiLCJoYWxmTGluZVdpZHRoIiwicHgyIiwicHkyIiwiYmF0Y2hMaW5lIiwiQXJjUmVuZGVyIiwiRWFyY3V0IiwiR2VvbUNpcmNsZSIsIl9hbnRpY2xvY2t3aXNlIiwiX2l0ZXJhdGlvbnMiLCJkaWFtZXRlciIsIml0ZXJhdGlvbnMiLCJzZXRJdGVyYXRpb25zIiwiRmlsbFN0eWxlQ2FudmFzIiwiTGluZVN0eWxlQ2FudmFzIiwiRmlsbFBhdGhXZWJHTCIsIlN0cm9rZVBhdGhXZWJHTCIsIkN1cnZlUmVuZGVyIiwiX3Ntb290aG5lc3MiLCJfY3VydmVCb3VuZHMiLCJzZXRTbW9vdGhuZXNzIiwiRWxsaXBzZVJlbmRlciIsIkdlb21FbGxpcHNlIiwiR3JpZFJlbmRlciIsIm91dGxpbmVGaWxsQ29sb3IiLCJvdXRsaW5lRmlsbEFscGhhIiwic2hvd0NlbGxzIiwic2hvd091dGxpbmUiLCJzaG93QWx0Q2VsbHMiLCJhbHRGaWxsQ29sb3IiLCJhbHRGaWxsQWxwaGEiLCJzZXRPdXRsaW5lU3R5bGUiLCJzZXRBbHRGaWxsU3R5bGUiLCJncmlkV2lkdGgiLCJncmlkSGVpZ2h0IiwiY2VsbFdpZHRoQSIsImNlbGxIZWlnaHRBIiwiY2VsbFdpZHRoQiIsImNlbGxIZWlnaHRCIiwiSXNvQm94UmVuZGVyIiwiZmlsbFRvcCIsImZpbGxMZWZ0IiwiZmlsbFJpZ2h0Iiwic2hvd1RvcCIsInNob3dMZWZ0Iiwic2hvd1JpZ2h0Iiwic2V0UHJvamVjdGlvbiIsInNldEZhY2VzIiwic2l6ZUEiLCJzaXplQiIsIklzb1RyaWFuZ2xlUmVuZGVyIiwicmV2ZXJzZWQiLCJpc1JldmVyc2VkIiwic2V0UmV2ZXJzZWQiLCJHZW9tTGluZSIsIkxpbmVSZW5kZXIiLCJfc3RhcnRXaWR0aCIsIl9lbmRXaWR0aCIsInNldExpbmVXaWR0aCIsInN0YXJ0V2lkdGgiLCJlbmRXaWR0aCIsIlBvbHlnb25SZW5kZXIiLCJHZXRBQUJCIiwiR2VvbVBvbHlnb24iLCJTbW9vdGgiLCJzbW9vdGgiLCJHZW9tUmVjdGFuZ2xlIiwiUmVjdGFuZ2xlUmVuZGVyIiwiZ2V0TGluZUEiLCJnZXRMaW5lQiIsImdldExpbmVDIiwiZ2V0TGluZUQiLCJTdGFyUmVuZGVyIiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsIl9wb2ludHMiLCJfaW5uZXJSYWRpdXMiLCJfb3V0ZXJSYWRpdXMiLCJzZXRJbm5lclJhZGl1cyIsInNldE91dGVyUmFkaXVzIiwicm90IiwiR2VvbVRyaWFuZ2xlIiwiVHJpYW5nbGVSZW5kZXIiLCJ0cmkiLCJTcHJpdGVSZW5kZXIiLCJtYXhMaW5lV2lkdGgiLCJkcmF3bkxpbmVzIiwibWF4TGluZXMiLCJzeW5jRm9udCIsInN0cm9rZVRoaWNrbmVzcyIsIm1lYXN1cmVUZXh0Iiwid29yZFdyYXAiLCJ0ZXh0U3R5bGUiLCJ0ZXN0U3RyaW5nIiwiYmFzZWxpbmVYIiwiYmFzZWxpbmUiLCJiYXNlbGluZVkiLCJfZm9udCIsInRleHRCYXNlbGluZSIsImZpbGxUZXh0IiwiYXNjZW50IiwiZGVzY2VudCIsImltYWdlZGF0YSIsInBpeGVscyIsIk1lYXN1cmVUZXh0IiwicHJvcGVydHlNYXAiLCJmb250RmFtaWx5IiwiZm9udFN0eWxlIiwic2hhZG93T2Zmc2V0WCIsInNoYWRvd09mZnNldFkiLCJzaGFkb3dDb2xvciIsInNoYWRvd0JsdXIiLCJzaGFkb3dTdHJva2UiLCJzaGFkb3dGaWxsIiwiZml4ZWRXaWR0aCIsImZpeGVkSGVpZ2h0IiwicnRsIiwid29yZFdyYXBXaWR0aCIsIndvcmRXcmFwQ2FsbGJhY2siLCJ3b3JkV3JhcENhbGxiYWNrU2NvcGUiLCJ3b3JkV3JhcFVzZUFkdmFuY2VkIiwiVGV4dFN0eWxlIiwic2V0U3R5bGUiLCJtZXRyaWNzIiwidXBkYXRlVGV4dCIsInNldERlZmF1bHRzIiwic3luY1N0eWxlIiwibGluZUNhcCIsImxpbmVKb2luIiwic3luY1NoYWRvdyIsInJlY2FsY3VsYXRlTWV0cmljcyIsImZvbnRTcGxpdCIsInNldEZvbnRGYW1pbHkiLCJmYW1pbHkiLCJzZXRGb250U3R5bGUiLCJzZXRUZXN0U3RyaW5nIiwic2V0Rml4ZWRTaXplIiwic2V0RmlsbCIsInNldFJlc29sdXRpb24iLCJzZXRTdHJva2UiLCJ0aGlja25lc3MiLCJzZXRTaGFkb3ciLCJzZXRTaGFkb3dPZmZzZXQiLCJzZXRTaGFkb3dDb2xvciIsInNldFNoYWRvd0JsdXIiLCJzZXRTaGFkb3dTdHJva2UiLCJzZXRTaGFkb3dGaWxsIiwic2V0V29yZFdyYXBXaWR0aCIsInVzZUFkdmFuY2VkV3JhcCIsInNldFdvcmRXcmFwQ2FsbGJhY2siLCJzZXRBbGlnbiIsInNldE1heExpbmVzIiwiZ2V0VGV4dE1ldHJpY3MiLCJHZXRUZXh0U2l6ZSIsIlRleHRSZW5kZXIiLCJzcGxpdFJlZ0V4cCIsImluaXRSVEwiLCJzZXRQYWRkaW5nIiwic2V0TGluZVNwYWNpbmciLCJydW5Xb3JkV3JhcCIsIndyYXBwZWRMaW5lcyIsImFkdmFuY2VkV29yZFdyYXAiLCJiYXNpY1dvcmRXcmFwIiwibGluZXNDb3VudCIsIndvcmRXaXRoU3BhY2UiLCJ3b3JkV2lkdGgiLCJuZXdXb3JkIiwic2Vjb25kUGFydCIsInJlbWFpbmRlciIsImxhc3RMaW5lSW5kZXgiLCJ3aGl0ZVNwYWNlV2lkdGgiLCJzcGFjZUxlZnQiLCJsYXN0V29yZEluZGV4Iiwid29yZFdpZHRoV2l0aFNwYWNlIiwiZ2V0V3JhcHBlZFRleHQiLCJvdXRwdXRUZXh0IiwidGV4dFdpZHRoIiwidGV4dFNpemUiLCJsaW5lUG9zaXRpb25YIiwibGluZVBvc2l0aW9uWSIsImV4dHJhU3BhY2UiLCJzcGFjZVNpemUiLCJ0cmltbWVkTGluZSIsImV4dHJhU3BhY2VDaGFyYWN0ZXJzIiwic3Ryb2tlVGV4dCIsImNhbnZhc1RvVGV4dHVyZSIsIkdldFBvd2VyT2ZUd28iLCJUaWxlU3ByaXRlUmVuZGVyIiwiZGlzcGxheVRleHR1cmUiLCJkaXNwbGF5RnJhbWUiLCJfdGlsZVBvc2l0aW9uIiwiX3RpbGVTY2FsZSIsInBvdFdpZHRoIiwicG90SGVpZ2h0IiwiZmlsbENhbnZhcyIsImZpbGxDb250ZXh0IiwiZmlsbFBhdHRlcm4iLCJuZXdGcmFtZSIsInVwZGF0ZVRpbGVUZXh0dXJlIiwic2V0VGlsZVBvc2l0aW9uIiwidGlsZVBvc2l0aW9uWCIsInRpbGVQb3NpdGlvblkiLCJzZXRUaWxlU2NhbGUiLCJ0aWxlU2NhbGVYIiwidGlsZVNjYWxlWSIsImZ3IiwiZmgiLCJjcmVhdGVQYXR0ZXJuIiwidXBkYXRlQ2FudmFzIiwicG9zaXRpb25YIiwicG9zaXRpb25ZIiwidGlsZSIsIlNvdW5kRXZlbnRzIiwiVmlkZW9SZW5kZXIiLCJ2aWRlb1RleHR1cmUiLCJ2aWRlb1RleHR1cmVTb3VyY2UiLCJzbmFwc2hvdFRleHR1cmUiLCJ0b3VjaExvY2tlZCIsInBsYXlXaGVuVW5sb2NrZWQiLCJyZXRyeUxpbWl0IiwicmV0cnkiLCJyZXRyeUludGVydmFsIiwiX3JldHJ5SUQiLCJfc3lzdGVtTXV0ZWQiLCJfY29kZU11dGVkIiwiX3N5c3RlbVBhdXNlZCIsIl9jb2RlUGF1c2VkIiwiX2NhbGxiYWNrcyIsInBsYXlIYW5kbGVyIiwibG9hZEVycm9ySGFuZGxlciIsImNvbXBsZXRlSGFuZGxlciIsInRpbWVVcGRhdGVIYW5kbGVyIiwic2Vla2luZyIsInNlZWtpbmdIYW5kbGVyIiwic2Vla2VkIiwic2Vla2VkSGFuZGxlciIsIm1hcmtlcnMiLCJfbWFya2VySW4iLCJfbWFya2VyT3V0IiwiX2xhc3RVcGRhdGUiLCJfY2FjaGVLZXkiLCJfaXNTZWVraW5nIiwicmVtb3ZlVmlkZW9FbGVtZW50T25EZXN0cm95IiwiZ2xvYmFsUGF1c2UiLCJnbG9iYWxSZXN1bWUiLCJHTE9CQUxfTVVURSIsImdsb2JhbE11dGUiLCJtYXJrZXJJbiIsIm1hcmtlck91dCIsIm11dGUiLCJzZXRNdXRlIiwicGxheVByb21pc2UiLCJwbGF5UHJvbWlzZVN1Y2Nlc3NIYW5kbGVyIiwicGxheVByb21pc2VFcnJvckhhbmRsZXIiLCJjaGVja1ZpZGVvUHJvZ3Jlc3MiLCJhdXRvcGxheSIsIm5ld1ZpZGVvIiwibXV0ZWQiLCJ2aWRlb1dpZHRoIiwidmlkZW9IZWlnaHQiLCJ1cGRhdGVUZXh0dXJlIiwiYWRkTWFya2VyIiwicGxheU1hcmtlciIsIm1hcmtlciIsInJlbW92ZU1hcmtlciIsInNyY1dpZHRoIiwic3JjSGVpZ2h0IiwiZGVzdFdpZHRoIiwiZGVzdEhlaWdodCIsInNuYXAiLCJzYXZlU25hcHNob3RUZXh0dXJlIiwibG9hZFVSTCIsImxvYWRFdmVudCIsImNvbnRyb2xzIiwiZGVmYXVsdE11dGVkIiwidW5sb2NrSGFuZGxlciIsInRleHR1cmVTb3VyY2UiLCJnZXRWaWRlb0tleSIsInNlZWtUbyIsInNlZWtUaW1lIiwic2V0Q3VycmVudFRpbWUiLCJnZXRDdXJyZW50VGltZSIsIm9wIiwiaXNTZWVraW5nIiwiaXNNdXRlZCIsInNvdW5kTWFuYWdlciIsInNldFBhdXNlZCIsImdldFZvbHVtZSIsInZvbHVtZSIsInNldFZvbHVtZSIsImdldFBsYXliYWNrUmF0ZSIsInBsYXliYWNrUmF0ZSIsInNldFBsYXliYWNrUmF0ZSIsInJhdGUiLCJnZXRMb29wIiwic2V0TG9vcCIsImVuZGVkIiwicmVtb3ZlVmlkZW9FbGVtZW50IiwiaGFzQ2hpbGROb2RlcyIsIkNpcmNsZSIsIkNpcmNsZUNvbnRhaW5zIiwicmVzaXplSW5wdXQiLCJzZXRDaXJjbGVEcm9wWm9uZSIsInNldERyb3Bab25lIiwic2V0UmVjdGFuZ2xlRHJvcFpvbmUiLCJDb250YWlucyIsIkdldFBvaW50IiwiR0VPTV9DT05TVCIsIkNJUkNMRSIsIl9yYWRpdXMiLCJfZGlhbWV0ZXIiLCJpc0VtcHR5IiwidG9Db21wYXJlIiwiQ2lyY3VtZmVyZW5jZVBvaW50IiwiRnJvbVBlcmNlbnQiLCJDaXJjdW1mZXJlbmNlIiwiQXJlYSIsIkNsb25lIiwiQ29udGFpbnNQb2ludCIsIkNvbnRhaW5zUmVjdCIsIkNvcHlGcm9tIiwiRXF1YWxzIiwiT2Zmc2V0IiwiT2Zmc2V0UG9pbnQiLCJFTExJUFNFIiwiTElORSIsIlBPSU5UIiwiUE9MWUdPTiIsIlJFQ1RBTkdMRSIsIlRSSUFOR0xFIiwiZ2V0TWFqb3JSYWRpdXMiLCJnZXRNaW5vclJhZGl1cyIsInJ5Iiwibm9ybXgiLCJub3JteSIsIkdlb20iLCJJbnRlcnNlY3RzIiwiY2lyY2xlQSIsImNpcmNsZUIiLCJ4RGlzdCIsInlEaXN0IiwieENvcm5lckRpc3QiLCJ5Q29ybmVyRGlzdCIsIkNpcmNsZVRvQ2lyY2xlIiwiY29lZmZpY2llbnRBIiwiY29lZmZpY2llbnRCIiwibGFtYmRhIiwicjAiLCJHZXRMaW5lVG9DaXJjbGUiLCJDaXJjbGVUb1JlY3RhbmdsZSIsImxpbmVBIiwibGluZUIiLCJsaW5lQyIsImxpbmVEIiwiTGluZVRvQ2lyY2xlIiwibHgxIiwibHkxIiwibHgyIiwibHkyIiwibERpclgiLCJsRGlyWSIsIm9EaXJYIiwib0RpclkiLCJyb290MSIsInJvb3QyIiwiTGluZVRvTGluZSIsIkxpbmVUb1JlY3RhbmdsZSIsIlJlY3RhbmdsZVRvUmVjdGFuZ2xlIiwicmVjdEEiLCJyZWN0QiIsIkdldExpbmVUb1JlY3RhbmdsZSIsIlJlY3RhbmdsZVRvVHJpYW5nbGUiLCJUcmlhbmdsZVRvQ2lyY2xlIiwiVHJpYW5nbGVUb0xpbmUiLCJUcmlhbmdsZVRvVHJpYW5nbGUiLCJHZXRUcmlhbmdsZVRvTGluZSIsInRyaWFuZ2xlQSIsInRyaWFuZ2xlQiIsIm5lYXJlc3QiLCJsY3giLCJsY3kiLCJkTGVuMiIsImRwIiwibGluZTEiLCJsaW5lMiIsIng0IiwieTQiLCJkZU5vbSIsInVBIiwidUIiLCJieDEiLCJieTEiLCJieDIiLCJieTIiLCJsaW5lVGhpY2tuZXNzIiwiTDIiLCJQb2ludFRvTGluZSIsInhNaW4iLCJ4TWF4IiwieU1pbiIsInlNYXgiLCJDb250YWluc0FycmF5IiwiRGVjb21wb3NlIiwidHJpQSIsInRyaUIiLCJ0cmlDIiwicmVjdEMiLCJyZWN0RCIsInRvbGVyYW5jZSIsImdldFBvaW50QSIsImdldFBvaW50QiIsImxpbmVBQSIsImxpbmVBQiIsImxpbmVBQyIsImxpbmVCQSIsImxpbmVCQiIsImxpbmVCQyIsIndpdGhpbiIsIkdldENpcmNsZVRvQ2lyY2xlIiwiR2V0Q2lyY2xlVG9SZWN0YW5nbGUiLCJHZXRSZWN0YW5nbGVJbnRlcnNlY3Rpb24iLCJHZXRSZWN0YW5nbGVUb1JlY3RhbmdsZSIsIkdldFJlY3RhbmdsZVRvVHJpYW5nbGUiLCJHZXRUcmlhbmdsZVRvQ2lyY2xlIiwiR2V0VHJpYW5nbGVUb1RyaWFuZ2xlIiwiUG9pbnRUb0xpbmVTZWdtZW50IiwiUmVjdGFuZ2xlVG9WYWx1ZXMiLCJlMiIsIkxlbmd0aCIsInNsb3BYIiwic2xvcFkiLCJEaXN0YW5jZUJldHdlZW5Qb2ludHMiLCJjb2xsaW5lYXJUaHJlc2hvbGQiLCJlYXNlUGFyYW1zIiwic3BhY2VYIiwic3BhY2VZIiwiZWFzZUZ1bmMiLCJwcmV2UG9pbnQiLCJzb3J0ZWRSZXN1bHRzIiwidmVjMiIsIk5vcm1hbEFuZ2xlIiwiUm90YXRlQXJvdW5kWFkiLCJHZXRFYXNlZFBvaW50cyIsIkdldE1pZFBvaW50IiwiR2V0TmVhcmVzdFBvaW50IiwiR2V0Tm9ybWFsIiwiR2V0U2hvcnRlc3REaXN0YW5jZSIsIk5vcm1hbFgiLCJOb3JtYWxZIiwiUGVycFNsb3BlIiwiUmVmbGVjdEFuZ2xlIiwiUm90YXRlQXJvdW5kUG9pbnQiLCJTZXRUb0FuZ2xlIiwiU2xvcGUiLCJORUdBVElWRV9JTkZJTklUWSIsIlBPU0lUSVZFX0lORklOSVRZIiwicG9pbnRBIiwicG9pbnRCIiwiR2V0TWFnbml0dWRlU3EiLCJhbXQiLCJHZXRNYWduaXR1ZGUiLCJtYWduaXR1ZGUiLCJDZWlsIiwiRmxvb3IiLCJHZXRDZW50cm9pZCIsIkdldFJlY3RhbmdsZUZyb21Qb2ludHMiLCJJbnZlcnQiLCJOZWdhdGl2ZSIsIlByb2plY3QiLCJQcm9qZWN0VW5pdCIsIlNldE1hZ25pdHVkZSIsInBvbHlnb24iLCJpeCIsIml5IiwiangiLCJqeSIsIlBlcmltZXRlciIsInBlcmltZXRlciIsImFjY3VtdWxhdGVkUGVyaW1ldGVyIiwiY2FsY3VsYXRlQXJlYSIsInAweCIsInAweSIsInAxeCIsInAxeSIsIkdldE51bWJlckFycmF5IiwiUmV2ZXJzZSIsIkdldEFzcGVjdFJhdGlvIiwicmF0aW8iLCJyZWN0YW5nbGUiLCJmYWNlIiwib3V0ZXIiLCJpbm5lciIsIkNlaWxBbGwiLCJGaXRJbnNpZGUiLCJGaXRPdXRzaWRlIiwiRmxvb3JBbGwiLCJGcm9tWFkiLCJHZXRDZW50ZXIiLCJHZXRTaXplIiwiSW5mbGF0ZSIsIkludGVyc2VjdGlvbiIsIk1lcmdlUG9pbnRzIiwiTWVyZ2VSZWN0IiwiTWVyZ2VYWSIsIk92ZXJsYXBzIiwiUGVyaW1ldGVyUG9pbnQiLCJSYW5kb21PdXRzaWRlIiwiU2FtZURpbWVuc2lvbnMiLCJTY2FsZSIsIkVhckN1dCIsInRyaXMiLCJDZW50cm9pZCIsImNlbnRlckZ1bmMiLCJjZW50ZXIiLCJkaWZmWCIsImRpZmZZIiwiZGV0IiwibTAwIiwibTAxIiwibTEwIiwibTExIiwiZGVub20iLCJudW14IiwibnVteSIsIkciLCJ2MHgiLCJ2MHkiLCJ2MXgiLCJ2MXkiLCJ2MngiLCJ2MnkiLCJkb3QwMCIsImRvdDAxIiwiZG90MDIiLCJkb3QxMSIsImRvdDEyIiwiaW52IiwicmV0dXJuRmlyc3QiLCJsaW5lMyIsImxlbmd0aDEiLCJsZW5ndGgyIiwibGVuZ3RoMyIsImxvY2FsUG9zaXRpb24iLCJkMiIsImQzIiwidXgiLCJ1eSIsIkluQ2VudGVyIiwiQnVpbGRFcXVpbGF0ZXJhbCIsIkJ1aWxkRnJvbVBvbHlnb24iLCJCdWlsZFJpZ2h0IiwiQ2lyY3VtQ2VudGVyIiwiQ2lyY3VtQ2lyY2xlIiwiYWx3YXlzRW5hYmxlZCIsImRyYWdnYWJsZSIsImN1cnNvciIsImhpdEFyZWFEZWJ1ZyIsImxvY2FsWCIsImxvY2FsWSIsImRyYWdTdGF0ZSIsImRyYWdTdGFydFgiLCJkcmFnU3RhcnRZIiwiZHJhZ1N0YXJ0WEdsb2JhbCIsImRyYWdTdGFydFlHbG9iYWwiLCJhbHBoYVRvbGVyYW5jZSIsImdldFBpeGVsQWxwaGEiLCJLZXlib2FyZCIsIk1vdXNlIiwiUG9pbnRlciIsIlRvdWNoIiwiVHJhbnNmb3JtWFkiLCJpc092ZXIiLCJkZWZhdWx0Q3Vyc29yIiwicG9pbnRlcnMiLCJwb2ludGVyc1RvdGFsIiwic21vb3RoRmFjdG9yIiwibW91c2VQb2ludGVyIiwiYWN0aXZlUG9pbnRlciIsImdsb2JhbFRvcE9ubHkiLCJfdGVtcFBvaW50IiwiX3RlbXBIaXRUZXN0IiwiX3RlbXBNYXRyaXgiLCJfdGVtcFNraXAiLCJtb3VzZVBvaW50ZXJDb250YWluZXIiLCJNQU5BR0VSX0JPT1QiLCJzZXRDYW52YXNPdmVyIiwiR0FNRV9PVkVSIiwic2V0Q2FudmFzT3V0IiwiR0FNRV9PVVQiLCJzY2VuZXMiLCJnZXRTY2VuZXMiLCJNQU5BR0VSX1VQREFURSIsInVwZGF0ZVBvbGwiLCJzZXREZWZhdWx0Q3Vyc29yIiwic2V0Q3Vyc29yIiwiaW50ZXJhY3RpdmVPYmplY3QiLCJyZXNldEN1cnNvciIsImFkZFBvaW50ZXIiLCJ1cGRhdGVJbnB1dFBsdWdpbnMiLCJvblRvdWNoU3RhcnQiLCJjaGFuZ2VkIiwiY2hhbmdlZFRvdWNoIiwidG91Y2hzdGFydCIsIlRPVUNIX1NUQVJUIiwib25Ub3VjaE1vdmUiLCJ0b3VjaG1vdmUiLCJUT1VDSF9NT1ZFIiwib25Ub3VjaEVuZCIsInRvdWNoZW5kIiwiVE9VQ0hfRU5EIiwib25Ub3VjaENhbmNlbCIsInRvdWNoY2FuY2VsIiwiVE9VQ0hfQ0FOQ0VMIiwib25Nb3VzZURvd24iLCJ1cGRhdGVNb3Rpb24iLCJNT1VTRV9ET1dOIiwib25Nb3VzZU1vdmUiLCJtb3ZlIiwiTU9VU0VfTU9WRSIsIm9uTW91c2VVcCIsIk1PVVNFX1VQIiwib25Nb3VzZVdoZWVsIiwid2hlZWwiLCJNT1VTRV9XSEVFTCIsIm9uUG9pbnRlckxvY2tDaGFuZ2UiLCJpc0xvY2tlZCIsIlBPSU5URVJMT0NLX0NIQU5HRSIsImlucHV0Q2FuZGlkYXRlIiwiaGl0VGVzdCIsImdhbWVPYmplY3RzIiwidGVtcFBvaW50IiwiY3N4IiwiY3N5Iiwid29ybGRYIiwid29ybGRZIiwicG9pbnRXaXRoaW5IaXRBcmVhIiwicG9pbnRXaXRoaW5JbnRlcmFjdGl2ZU9iamVjdCIsInRyYW5zZm9ybVBvaW50ZXIiLCJ3YXNNb3ZlIiwicHJldlBvc2l0aW9uIiwidHJhbnNmb3JtWCIsInRyYW5zZm9ybVkiLCJDcmVhdGVJbnRlcmFjdGl2ZU9iamVjdCIsIkNyZWF0ZVBpeGVsUGVyZmVjdEhhbmRsZXIiLCJFbGxpcHNlQ29udGFpbnMiLCJJbnB1dFBsdWdpbkNhY2hlIiwiVHJpYW5nbGVDb250YWlucyIsIklucHV0UGx1Z2luIiwicGx1Z2luRXZlbnRzIiwiaW5zdGFsbCIsInRvcE9ubHkiLCJwb2xsUmF0ZSIsIl9wb2xsVGltZXIiLCJfZXZlbnREYXRhIiwiY2FuY2VsbGVkIiwiX2V2ZW50Q29udGFpbmVyIiwiZHJhZ0Rpc3RhbmNlVGhyZXNob2xkIiwiZHJhZ1RpbWVUaHJlc2hvbGQiLCJfdGVtcCIsIl90ZW1wWm9uZXMiLCJfbGlzdCIsIl9wZW5kaW5nSW5zZXJ0aW9uIiwiX3BlbmRpbmdSZW1vdmFsIiwiX2RyYWdnYWJsZSIsIl9kcmFnIiwiX2RyYWdTdGF0ZSIsIl9vdmVyIiwiX3ZhbGlkVHlwZXMiLCJfdXBkYXRlZFRoaXNGcmFtZSIsIlRSQU5TSVRJT05fU1RBUlQiLCJ0cmFuc2l0aW9uSW4iLCJUUkFOU0lUSU9OX09VVCIsInRyYW5zaXRpb25PdXQiLCJUUkFOU0lUSU9OX0NPTVBMRVRFIiwidHJhbnNpdGlvbkNvbXBsZXRlIiwib25HYW1lT3V0Iiwib25HYW1lT3ZlciIsImlzQWN0aXZlIiwicmVtb3ZlTGlzdCIsImluc2VydExpc3QiLCJ0b1JlbW92ZSIsInRvSW5zZXJ0IiwiY2FwdHVyZWQiLCJoaXRUZXN0UG9pbnRlciIsInNvcnRHYW1lT2JqZWN0cyIsInByb2Nlc3NPdmVyT3V0RXZlbnRzIiwiZ2V0RHJhZ1N0YXRlIiwicHJvY2Vzc0RyYWdUaHJlc2hvbGRFdmVudCIsInByb2Nlc3NEcmFnRG93bkV2ZW50IiwicHJvY2Vzc0Rvd25FdmVudHMiLCJwcm9jZXNzRHJhZ1VwRXZlbnQiLCJwcm9jZXNzVXBFdmVudHMiLCJwcm9jZXNzT3ZlckV2ZW50cyIsInByb2Nlc3NPdXRFdmVudHMiLCJwcm9jZXNzRHJhZ01vdmVFdmVudCIsInByb2Nlc3NNb3ZlRXZlbnRzIiwicHJvY2Vzc1doZWVsRXZlbnQiLCJza2lwUXVldWUiLCJxdWV1ZUZvclJlbW92YWwiLCJvdmVyIiwiY3VycmVudGx5T3ZlciIsImFib3J0ZWQiLCJHQU1FT0JKRUNUX1BPSU5URVJfRE9XTiIsIkdBTUVPQkpFQ1RfRE9XTiIsImRvd25FbGVtZW50IiwiUE9JTlRFUl9ET1dOIiwiUE9JTlRFUl9ET1dOX09VVFNJREUiLCJzZXREcmFnU3RhdGUiLCJ0aW1lVGhyZXNob2xkIiwiZGlzdGFuY2VUaHJlc2hvbGQiLCJkb3duWCIsImRvd25ZIiwiZG93blRpbWUiLCJwcm9jZXNzRHJhZ1N0YXJ0TGlzdCIsIkdBTUVPQkpFQ1RfRFJBR19TVEFSVCIsIkRSQUdfU1RBUlQiLCJwcmltYXJ5RG93biIsImRyYWdsaXN0IiwiZHJvcFpvbmVzIiwiR0FNRU9CSkVDVF9EUkFHX09WRVIiLCJEUkFHX09WRVIiLCJHQU1FT0JKRUNUX0RSQUdfTEVBVkUiLCJEUkFHX0xFQVZFIiwiR0FNRU9CSkVDVF9EUkFHX0VOVEVSIiwiRFJBR19FTlRFUiIsImR4Um90YXRlZCIsImR5Um90YXRlZCIsIkdBTUVPQkpFQ1RfRFJBRyIsIkRSQUciLCJkcm9wcGVkIiwiR0FNRU9CSkVDVF9EUk9QIiwiRFJPUCIsIkdBTUVPQkpFQ1RfRFJBR19FTkQiLCJEUkFHX0VORCIsIkdBTUVPQkpFQ1RfUE9JTlRFUl9NT1ZFIiwiR0FNRU9CSkVDVF9NT1ZFIiwiUE9JTlRFUl9NT1ZFIiwiZGVsdGFYIiwiZGVsdGFZIiwiZHoiLCJkZWx0YVoiLCJHQU1FT0JKRUNUX1BPSU5URVJfV0hFRUwiLCJHQU1FT0JKRUNUX1dIRUVMIiwiUE9JTlRFUl9XSEVFTCIsInRvdGFsSW50ZXJhY3RlZCIsImp1c3RPdmVyIiwiR0FNRU9CSkVDVF9QT0lOVEVSX09WRVIiLCJHQU1FT0JKRUNUX09WRVIiLCJQT0lOVEVSX09WRVIiLCJwcmV2aW91c2x5T3ZlciIsIkdBTUVPQkpFQ1RfUE9JTlRFUl9PVVQiLCJHQU1FT0JKRUNUX09VVCIsIlBPSU5URVJfT1VUIiwianVzdE91dCIsInN0aWxsT3ZlciIsImN1cnJlbnRseURyYWdnaW5nIiwiR0FNRU9CSkVDVF9QT0lOVEVSX1VQIiwiR0FNRU9CSkVDVF9VUCIsInVwRWxlbWVudCIsIlBPSU5URVJfVVAiLCJQT0lOVEVSX1VQX09VVFNJREUiLCJxdWV1ZUZvckluc2VydGlvbiIsInNldERyYWdnYWJsZSIsIm1ha2VQaXhlbFBlcmZlY3QiLCJzZXRIaXRBcmVhRnJvbVRleHR1cmUiLCJ1c2VIYW5kQ3Vyc29yIiwicGl4ZWxQZXJmZWN0IiwiaW8iLCJzZXRIaXRBcmVhQ2lyY2xlIiwic2V0SGl0QXJlYUVsbGlwc2UiLCJzZXRIaXRBcmVhUmVjdGFuZ2xlIiwic2V0SGl0QXJlYVRyaWFuZ2xlIiwiZW5hYmxlRGVidWciLCJzaGFwZVR5cGUiLCJkZWJ1ZyIsIm9mZnNldHgiLCJvZmZzZXR5IiwicmVtb3ZlRGVidWciLCJzZXRQb2xsQWx3YXlzIiwic2V0UG9sbFJhdGUiLCJzZXRQb2xsT25Nb3ZlIiwic2V0R2xvYmFsVG9wT25seSIsInNldFRvcE9ubHkiLCJzb3J0SGFuZGxlckdPIiwibGlzdEEiLCJsaXN0QiIsImluZGV4QSIsImluZGV4QiIsInRyYW5zaXRpb25BbGxvd0lucHV0IiwicG9pbnRlcjEiLCJwb2ludGVyMiIsInBvaW50ZXIzIiwicG9pbnRlcjQiLCJwb2ludGVyNSIsInBvaW50ZXI2IiwicG9pbnRlcjciLCJwb2ludGVyOCIsInBvaW50ZXI5IiwicG9pbnRlcjEwIiwiaW5wdXRQbHVnaW5zIiwic2V0dGluZ3NLZXkiLCJjb25maWdLZXkiLCJEaXN0YW5jZSIsIkZ1enp5RXF1YWwiLCJTbW9vdGhTdGVwSW50ZXJwb2xhdGlvbiIsInZlbG9jaXR5IiwibW90aW9uRmFjdG9yIiwibW92ZVRpbWUiLCJ1cFgiLCJ1cFkiLCJ1cFRpbWUiLCJ3YXNUb3VjaCIsIndhc0NhbmNlbGVkIiwibW92ZW1lbnRYIiwibW92ZW1lbnRZIiwidXBkYXRlV29ybGRQb2ludCIsInBvc2l0aW9uVG9DYW1lcmEiLCJtb3pNb3ZlbWVudFgiLCJ3ZWJraXRNb3ZlbWVudFgiLCJtb3pNb3ZlbWVudFkiLCJ3ZWJraXRNb3ZlbWVudFkiLCJub0J1dHRvbkRvd24iLCJsZWZ0QnV0dG9uRG93biIsInJpZ2h0QnV0dG9uRG93biIsIm1pZGRsZUJ1dHRvbkRvd24iLCJiYWNrQnV0dG9uRG93biIsImZvcndhcmRCdXR0b25Eb3duIiwibGVmdEJ1dHRvblJlbGVhc2VkIiwicmlnaHRCdXR0b25SZWxlYXNlZCIsIm1pZGRsZUJ1dHRvblJlbGVhc2VkIiwiYmFja0J1dHRvblJlbGVhc2VkIiwiZm9yd2FyZEJ1dHRvblJlbGVhc2VkIiwiZ2V0RGlzdGFuY2UiLCJnZXREaXN0YW5jZVgiLCJnZXREaXN0YW5jZVkiLCJnZXRBbmdsZSIsImdldEludGVycG9sYXRlZFBvc2l0aW9uIiwiY3VyWCIsImN1clkiLCJQT0lOVEVSX0xPQ0tfQ0hBTkdFIiwiTUFOQUdFUl9QUk9DRVNTIiwiQXhpcyIsInBhZCIsIkJ1dHRvbiIsInByZXNzZWQiLCJCVVRUT05fRE9XTiIsIkdBTUVQQURfQlVUVE9OX0RPV04iLCJCVVRUT05fVVAiLCJHQU1FUEFEX0JVVFRPTl9VUCIsIkdhbWVwYWQiLCJheGVzIiwidmlicmF0aW9uQWN0dWF0b3IiLCJfbm9CdXR0b24iLCJfTENMZWZ0IiwiX0xDUmlnaHQiLCJfTENUb3AiLCJfTENCb3R0b20iLCJfUkNMZWZ0IiwiX1JDUmlnaHQiLCJfUkNUb3AiLCJfUkNCb3R0b20iLCJfRkJMZWZ0VG9wIiwiX0ZCTGVmdEJvdHRvbSIsIl9GQlJpZ2h0VG9wIiwiX0ZCUmlnaHRCb3R0b20iLCJfbm9BeGlzIiwiX0hBeGlzTGVmdCIsIl9WQXhpc0xlZnQiLCJfSEF4aXNSaWdodCIsIl9WQXhpc1JpZ2h0IiwibGVmdFN0aWNrIiwicmlnaHRTdGljayIsImdldEF4aXNUb3RhbCIsImdldEF4aXNWYWx1ZSIsInNldEF4aXNUaHJlc2hvbGQiLCJnZXRCdXR0b25Ub3RhbCIsImdldEJ1dHRvblZhbHVlIiwiaXNCdXR0b25Eb3duIiwibG9jYWxCdXR0b25zIiwiZ2FtZXBhZEJ1dHRvbnMiLCJsb2NhbEF4ZXMiLCJnYW1lcGFkQXhlcyIsImNvbm5lY3RlZCIsIlgiLCJMMSIsIlIxIiwiUjIiLCJJbnB1dEV2ZW50cyIsIkdhbWVwYWRQbHVnaW4iLCJzY2VuZUlucHV0UGx1Z2luIiwib25HYW1lcGFkSGFuZGxlciIsIl9wYWQxIiwiX3BhZDIiLCJfcGFkMyIsIl9wYWQ0Iiwic3RhcnRMaXN0ZW5lcnMiLCJyZWZyZXNoUGFkcyIsInN0b3BMaXN0ZW5lcnMiLCJkaXNjb25uZWN0QWxsIiwiY29ubmVjdGVkUGFkcyIsImN1cnJlbnRQYWRzIiwibGl2ZVBhZCIsImN1cnJlbnRQYWQiLCJuZXdQYWQiLCJwYWRzIiwiZ2V0UGFkIiwiZ2FtZXBhZCIsIkNPTk5FQ1RFRCIsIkRJU0NPTk5FQ1RFRCIsInBhZDEiLCJwYWQyIiwicGFkMyIsInBhZDQiLCJTRUxFQ1QiLCJMRUZUX1NIT1VMREVSIiwiUklHSFRfU0hPVUxERVIiLCJTSEFSRSIsIk9QVElPTlMiLCJQUyIsIlRPVUNIQkFSIiwiU1FVQVJFIiwiTDMiLCJSMyIsIkxFRlRfU1RJQ0tfSCIsIkxFRlRfU1RJQ0tfViIsIlJJR0hUX1NUSUNLX0giLCJSSUdIVF9TVElDS19WIiwiTUVOVSIsIkxCIiwiUkIiLCJSVCIsIkJBQ0siLCJMUyIsIlJTIiwiRFVBTFNIT0NLXzQiLCJTTkVTX1VTQiIsIlhCT1hfMzYwIiwiQ29uZmlncyIsIkFycmF5UmVtb3ZlIiwiS2V5Q29kZXMiLCJLZXlib2FyZE1hbmFnZXIiLCJpbnB1dE1hbmFnZXIiLCJvbktleURvd24iLCJvbktleVVwIiwiYWRkQ2FwdHVyZSIsInBvc3RVcGRhdGUiLCJ1c2VRdWV1ZSIsImtleWNvZGUiLCJyZW1vdmVDYXB0dXJlIiwiY2xlYXJDYXB0dXJlcyIsIktleSIsIktleUNvbWJvIiwiS2V5TWFwIiwiU25hcEZsb29yIiwiS2V5Ym9hcmRQbHVnaW4iLCJjb21ib3MiLCJhZGRDYXB0dXJlcyIsInJlc2V0S2V5cyIsImdldENhcHR1cmVzIiwiZW5hYmxlR2xvYmFsQ2FwdHVyZSIsImRpc2FibGVHbG9iYWxDYXB0dXJlIiwiY3JlYXRlQ3Vyc29yS2V5cyIsImFkZEtleXMiLCJTUEFDRSIsIlNISUZUIiwiZW5hYmxlQ2FwdHVyZSIsImVtaXRPblJlcGVhdCIsImN1cnJlbnRLZXkiLCJhZGRLZXkiLCJzZXRFbWl0T25SZXBlYXQiLCJyZW1vdmVLZXkiLCJjcmVhdGVDb21ibyIsImNoZWNrRG93biIsInRpbWVEb3duIiwiX3RpY2siLCJvbkRvd24iLCJLRVlfRE9XTiIsIkFOWV9LRVlfRE9XTiIsIm9uVXAiLCJLRVlfVVAiLCJBTllfS0VZX1VQIiwiY29tYm8iLCJ0aW1lTGFzdE1hdGNoZWQiLCJrZXlDb2RlcyIsIlByb2Nlc3NLZXlDb21ibyIsIlJlc2V0S2V5Q29tYm8iLCJrZXlib2FyZFBsdWdpbiIsInRpbWVNYXRjaGVkIiwicmVzZXRPbldyb25nS2V5IiwibWF4S2V5RGVsYXkiLCJyZXNldE9uTWF0Y2giLCJkZWxldGVPbk1hdGNoIiwiQ09NQk9fTUFUQ0giLCJBZHZhbmNlS2V5Q29tYm8iLCJjb21ib01hdGNoZWQiLCJrZXlNYXRjaGVkIiwidGltZUxpbWl0IiwiSnVzdERvd24iLCJKdXN0VXAiLCJEb3duRHVyYXRpb24iLCJVcER1cmF0aW9uIiwiX2p1c3REb3duIiwiX2p1c3RVcCIsImlzVXAiLCJ0aW1lVXAiLCJyZXBlYXRzIiwiQkFDS1NQQUNFIiwiVEFCIiwiRU5URVIiLCJDVFJMIiwiQUxUIiwiQ0FQU19MT0NLIiwiRVNDIiwiUEFHRV9VUCIsIlBBR0VfRE9XTiIsIkVORCIsIkhPTUUiLCJQUklOVF9TQ1JFRU4iLCJJTlNFUlQiLCJERUxFVEUiLCJaRVJPIiwiT05FIiwiVFdPIiwiVEhSRUUiLCJGT1VSIiwiRklWRSIsIlNJWCIsIlNFVkVOIiwiRUlHSFQiLCJOSU5FIiwiTlVNUEFEX1pFUk8iLCJOVU1QQURfT05FIiwiTlVNUEFEX1RXTyIsIk5VTVBBRF9USFJFRSIsIk5VTVBBRF9GT1VSIiwiTlVNUEFEX0ZJVkUiLCJOVU1QQURfU0lYIiwiTlVNUEFEX1NFVkVOIiwiTlVNUEFEX0VJR0hUIiwiTlVNUEFEX05JTkUiLCJOVU1QQURfQUREIiwiTlVNUEFEX1NVQlRSQUNUIiwiSCIsIkkiLCJKIiwiSyIsIk4iLCJRIiwiVSIsIloiLCJGMSIsIkYyIiwiRjMiLCJGNCIsIkY1IiwiRjYiLCJGNyIsIkY4IiwiRjkiLCJGMTAiLCJGMTEiLCJGMTIiLCJTRU1JQ09MT04iLCJQTFVTIiwiQ09NTUEiLCJNSU5VUyIsIlBFUklPRCIsIkZPUldBUkRfU0xBU0giLCJCQUNLX1NMQVNIIiwiUVVPVEVTIiwiQkFDS1RJQ0siLCJPUEVOX0JSQUNLRVQiLCJDTE9TRURfQlJBQ0tFVCIsIlNFTUlDT0xPTl9GSVJFRk9YIiwiQ09MT04iLCJDT01NQV9GSVJFRk9YX1dJTkRPV1MiLCJDT01NQV9GSVJFRk9YIiwiQlJBQ0tFVF9SSUdIVF9GSVJFRk9YIiwiQlJBQ0tFVF9MRUZUX0ZJUkVGT1giLCJNb3VzZU1hbmFnZXIiLCJvbk1vdXNlRG93bldpbmRvdyIsIm9uTW91c2VVcFdpbmRvdyIsIm9uTW91c2VPdmVyIiwib25Nb3VzZU91dCIsInBvaW50ZXJMb2NrQ2hhbmdlIiwicmVxdWVzdFBvaW50ZXJMb2NrIiwibW96UmVxdWVzdFBvaW50ZXJMb2NrIiwid2Via2l0UmVxdWVzdFBvaW50ZXJMb2NrIiwicmVsZWFzZVBvaW50ZXJMb2NrIiwiZXhpdFBvaW50ZXJMb2NrIiwibW96RXhpdFBvaW50ZXJMb2NrIiwid2Via2l0RXhpdFBvaW50ZXJMb2NrIiwicGFzc2l2ZSIsIm5vblBhc3NpdmUiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3pQb2ludGVyTG9ja0VsZW1lbnQiLCJ3ZWJraXRQb2ludGVyTG9ja0VsZW1lbnQiLCJUb3VjaE1hbmFnZXIiLCJvblRvdWNoU3RhcnRXaW5kb3ciLCJvblRvdWNoRW5kV2luZG93Iiwib25Ub3VjaENhbmNlbFdpbmRvdyIsIm9uVG91Y2hPdmVyIiwib25Ub3VjaE91dCIsIkdldFVSTCIsIk1lcmdlWEhSU2V0dGluZ3MiLCJYSFJMb2FkZXIiLCJYSFJTZXR0aW5ncyIsIkZpbGUiLCJsb2FkZXIiLCJmaWxlQ29uZmlnIiwibG9hZEtleSIsInhoclNldHRpbmdzIiwieGhyTG9hZGVyIiwiRklMRV9QT1BVTEFURUQiLCJGSUxFX1BFTkRJTkciLCJieXRlc1RvdGFsIiwiYnl0ZXNMb2FkZWQiLCJwZXJjZW50Q29tcGxldGUiLCJjcm9zc09yaWdpbiIsIm11bHRpRmlsZSIsImxpbmtGaWxlIiwic2V0TGluayIsImZpbGVCIiwicmVzZXRYSFIiLCJvbnByb2dyZXNzIiwibmV4dEZpbGUiLCJiYXNlVVJMIiwib25Mb2FkIiwibG9jYWxGaWxlT2siLCJyZXNwb25zZVVSTCIsIm9uRXJyb3IiLCJsZW5ndGhDb21wdXRhYmxlIiwibG9hZGVkIiwiRklMRV9QUk9HUkVTUyIsIm9uUHJvY2VzcyIsIkZJTEVfUFJPQ0VTU0lORyIsIm9uUHJvY2Vzc0NvbXBsZXRlIiwiRklMRV9DT01QTEVURSIsIm9uRmlsZUNvbXBsZXRlIiwiZmlsZVByb2Nlc3NDb21wbGV0ZSIsIm9uUHJvY2Vzc0Vycm9yIiwiRklMRV9FUlJPUkVEIiwib25GaWxlRmFpbGVkIiwiaGFzQ2FjaGVDb25mbGljdCIsImFkZFRvQ2FjaGUiLCJGSUxFX0tFWV9DT01QTEVURSIsImZsYWdGb3JSZW1vdmFsIiwiZGVmYXVsdFR5cGUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzRGF0YVVSTCIsIkZpbGVUeXBlc01hbmFnZXIiLCJDdXN0b21TZXQiLCJMb2FkZXJQbHVnaW4iLCJnYW1lQ29uZmlnIiwiY2FjaGVNYW5hZ2VyIiwic2V0QmFzZVVSTCIsInNldFByZWZpeCIsImxvYWRlclByZWZpeCIsIm1heFBhcmFsbGVsRG93bmxvYWRzIiwidG90YWxUb0xvYWQiLCJpbmZsaWdodCIsIl9kZWxldGVRdWV1ZSIsInRvdGFsRmFpbGVkIiwidG90YWxDb21wbGV0ZSIsIkxPQURFUl9JRExFIiwibXVsdGlLZXlJbmRleCIsInBsdWdpblN0YXJ0IiwiYWRkRmlsZSIsImtleUV4aXN0cyIsImlzTG9hZGluZyIsInVwZGF0ZVByb2dyZXNzIiwia2V5Q29uZmxpY3QiLCJhZGRQYWNrIiwicGFja0tleSIsImN1cnJlbnRCYXNlVVJMIiwiY3VycmVudFBhdGgiLCJjdXJyZW50UHJlZml4IiwiZmlsZXMiLCJMT0FERVJfTE9BRElORyIsIkxPQURFUl9QUk9DRVNTSU5HIiwiTE9BREVSX0NPTVBMRVRFIiwibG9hZENvbXBsZXRlIiwiY2hlY2tMb2FkUXVldWUiLCJQUk9HUkVTUyIsIkZJTEVfTE9BRCIsIkZJTEVfTE9BRF9FUlJPUiIsImlzUmVhZHlUb1Byb2Nlc3MiLCJQT1NUX1BST0NFU1MiLCJpdGVyYXRlTG9jYWwiLCJzYXZlSlNPTiIsImZpbGVuYW1lIiwiZmlsZXR5cGUiLCJCbG9iIiwiZG93bmxvYWQiLCJMT0FERVJfU0hVVERPV04iLCJMT0FERVJfREVTVFJPWUVEIiwic2V0dGluZyIsIk11bHRpRmlsZSIsInBlbmRpbmciLCJmYWlsZWQiLCJhZGRUb011bHRpRmlsZSIsImdsb2JhbFhIUlNldHRpbmdzIiwidXNlciIsImhlYWRlciIsImhlYWRlclZhbHVlIiwicmVxdWVzdGVkV2l0aCIsIndpdGhDcmVkZW50aWFscyIsIkZJTEVfTE9BRElORyIsIkZJTEVfTE9BREVEIiwiRklMRV9GQUlMRUQiLCJGSUxFX0RFU1RST1lFRCIsIkpTT05GaWxlIiwiTG9hZGVyRXZlbnRzIiwiQW5pbWF0aW9uSlNPTkZpbGUiLCJkYXRhS2V5Iiwib25Mb2FkQ29tcGxldGUiLCJJbWFnZUZpbGUiLCJBdGxhc0pTT05GaWxlIiwidGV4dHVyZVVSTCIsImF0bGFzVVJMIiwidGV4dHVyZVhoclNldHRpbmdzIiwiYXRsYXNYaHJTZXR0aW5ncyIsImV4dGVuc2lvbiIsIm5vcm1hbE1hcCIsImFkZEF0bGFzIiwibXVsdGlmaWxlIiwiWE1MRmlsZSIsIkF0bGFzWE1MRmlsZSIsImFkZEF0bGFzWE1MIiwiSFRNTDVBdWRpb0ZpbGUiLCJBdWRpb0ZpbGUiLCJ1cmxDb25maWciLCJhdWRpb0NvbnRleHQiLCJkZWNvZGVBdWRpb0RhdGEiLCJhdWRpb0J1ZmZlciIsInVybHMiLCJnZXRBdWRpb1VSTCIsImF1ZGlvRmlsZSIsIkF1ZGlvU3ByaXRlRmlsZSIsImpzb25VUkwiLCJhdWRpb1VSTCIsImF1ZGlvWGhyU2V0dGluZ3MiLCJqc29uWGhyU2V0dGluZ3MiLCJyZXNvdXJjZUxvYWQiLCJyZXNvdXJjZXMiLCJmaWxlQSIsImdhbWVBdWRpb0NvbmZpZyIsIkJpbmFyeUZpbGUiLCJjdG9yIiwiQml0bWFwRm9udEZpbGUiLCJmb250RGF0YVVSTCIsImZvbnREYXRhWGhyU2V0dGluZ3MiLCJDU1NGaWxlIiwiR0xTTEZpbGUiLCJzaGFkZXJUeXBlIiwiYmxvY2siLCJleHRyYWN0QmxvY2siLCJnZXRTaGFkZXJOYW1lIiwiZ2V0U2hhZGVyVHlwZSIsImdldFNoYWRlclVuaWZvcm1zIiwic2hhZGVyU3JjIiwiaGVhZGVyU291cmNlIiwiaGVhZGVyU3RhcnQiLCJoZWFkZXJFbmQiLCJibG9ja0VuZCIsImhlYWRlck9wZW4iLCJjYXB0dXJlU291cmNlIiwic2hhZGVyU291cmNlIiwiZmlsZXNMb2FkZWQiLCJmaWxlc1RvdGFsIiwib25jYW5wbGF5dGhyb3VnaCIsImluc3RhbmNlcyIsImRhdGFzZXQiLCJwcmVsb2FkIiwiSFRNTEZpbGUiLCJIVE1MVGV4dHVyZUZpbGUiLCJzdmciLCJhZGRJbWFnZSIsIm5vcm1hbE1hcFVSTCIsIk11bHRpQXRsYXNGaWxlIiwiZmlsZUpTT04iLCJpbWFnZXMiLCJub3JtYWxNYXBzIiwiYWRkQXRsYXNKU09OQXJyYXkiLCJTY3JpcHRGaWxlIiwiTXVsdGlTY3JpcHRGaWxlIiwic2NyaXB0RmlsZSIsImxhbmd1YWdlIiwiUGFja0ZpbGUiLCJQbHVnaW5GaWxlIiwicGx1Z2luTWFuYWdlciIsIlNWR0ZpbGUiLCJzdmdDb25maWciLCJzdmdYTUwiLCJoYXNWaWV3Qm94IiwiaGFzQXR0cmlidXRlIiwic3ZnV2lkdGgiLCJzdmdIZWlnaHQiLCJ2aWV3Qm94IiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiU2NlbmVGaWxlIiwiZXZhbDIiLCJldmFsIiwiU2NlbmVQbHVnaW5GaWxlIiwic3lzdGVtS2V5Iiwic2NlbmVLZXkiLCJpbnN0YWxsU2NlbmVQbHVnaW4iLCJTcHJpdGVTaGVldEZpbGUiLCJhZGRTcHJpdGVTaGVldCIsIlRleHRGaWxlIiwiVElMRU1BUF9GT1JNQVRTIiwiVGlsZW1hcENTVkZpbGUiLCJ0aWxlbWFwRm9ybWF0IiwiQ1NWIiwidGlsZWRhdGEiLCJUaWxlbWFwSW1wYWN0RmlsZSIsIldFTFRNRUlTVEVSIiwiVGlsZW1hcEpTT05GaWxlIiwiVElMRURfSlNPTiIsIlVuaXR5QXRsYXNGaWxlIiwiYWRkVW5pdHlBdGxhcyIsIlZpZGVvRmlsZSIsImFzQmxvYiIsIm9uTG9hZENhbGxiYWNrIiwib25WaWRlb0xvYWRIYW5kbGVyIiwib25FcnJvckNhbGxiYWNrIiwib25WaWRlb0Vycm9ySGFuZGxlciIsImNyZWF0ZVZpZGVvRWxlbWVudCIsIm9ubG9hZGVkZGF0YSIsImdldFZpZGVvVVJMIiwidmlkZW9UeXBlIiwidmlkZW9GaWxlIiwiTG9hZGVyIiwiRmlsZVR5cGVzIiwiRmFjdG9yaWFsIiwicGxhY2UiLCJNYXRyaXgzIiwiaWRlbnRpdHkiLCJmcm9tTWF0NCIsImZyb21BcnJheSIsImEwMSIsImEwMiIsImExMiIsImEwMCIsImExMCIsImExMSIsImEyMCIsImEyMSIsImEyMiIsImIwMSIsImIxMSIsImIyMSIsImFkam9pbnQiLCJiMDAiLCJiMDIiLCJiMTAiLCJiMTIiLCJiMjAiLCJiMjIiLCJmcm9tUXVhdCIsInoyIiwieHgiLCJ4eSIsInh6IiwieXoiLCJ6eiIsInd4Iiwid3kiLCJ3eiIsIm5vcm1hbEZyb21NYXQ0IiwiYTAzIiwiYTEzIiwiYTIzIiwiYTMwIiwiYTMxIiwiYTMyIiwiYTMzIiwiYjAzIiwiYjA0IiwiYjA1IiwiYjA2IiwiYjA3IiwiYjA4IiwiYjA5IiwiemVybyIsInh5eiIsInNjYWxpbmciLCJiMyIsIm11bHRpcGx5TG9jYWwiLCJtMSIsIm0yIiwidHJhbnNsYXRlWFlaIiwic2NhbGVYWVoiLCJtYWtlUm90YXRpb25BeGlzIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24iLCJmcnVzdHVtIiwicmwiLCJ0YiIsIm5mIiwiZm92eSIsInBlcnNwZWN0aXZlTEgiLCJsciIsImJ0IiwiZXllIiwiZXlleCIsImV5ZXkiLCJleWV6IiwidXB4IiwidXB5IiwidXB6IiwiY2VudGVyeCIsImNlbnRlcnkiLCJjZW50ZXJ6IiwiejAiLCJ6MSIsInlhd1BpdGNoUm9sbCIsInlhdyIsInBpdGNoIiwicm9sbCIsIl90ZW1wTWF0MSIsIl90ZW1wTWF0MiIsIm0wIiwic2V0V29ybGRNYXRyaXgiLCJ1cHBlck1heCIsInBlcmNlbnRhZ2UiLCJzaU5leHQiLCJ4VW5pdFZlYzMiLCJ5VW5pdFZlYzMiLCJ0bXB2ZWMiLCJ0bXBNYXQzIiwiUXVhdGVybmlvbiIsImxlbmd0aFNxIiwiZG90IiwiYXoiLCJhdyIsInJvdGF0aW9uVG8iLCJzZXRBeGlzQW5nbGUiLCJzZXRBeGVzIiwiZnJvbU1hdDMiLCJzbGVycCIsImNvc29tIiwic2NhbGUwIiwic2NhbGUxIiwib21lZ2EiLCJzaW5vbSIsImludkRvdCIsImNvbmp1Z2F0ZSIsImNhbGN1bGF0ZVciLCJtYXQiLCJmUm9vdCIsImZUcmFjZSIsInZlY3RvciIsInpTY2FsZSIsInZlYzQiLCJ0bXBNYXQ0IiwidG1wUXVhdCIsInNpbkFtcCIsImNvc0FtcCIsInNldFRvUG9sYXIiLCJhemltdXRoIiwiZnV6enlFcXVhbHMiLCJkaXN0YW5jZVNxIiwic2V0TGVuZ3RoIiwibm9ybWFsaXplUmlnaHRIYW5kIiwibm9ybWFsaXplTGVmdEhhbmQiLCJ0cmFuc2Zvcm1NYXQzIiwicmVmbGVjdCIsIm5vcm1hbCIsIm1pcnJvciIsImNyb3NzVmVjdG9ycyIsInRyYW5zZm9ybUNvb3JkaW5hdGVzIiwidHoiLCJ0cmFuc2Zvcm1RdWF0IiwicXkiLCJxeiIsInF3IiwiaXoiLCJpdyIsImx3Iiwidmlld1giLCJ2aWV3WSIsInZpZXdXaWR0aCIsInZpZXdIZWlnaHQiLCJGT1JXQVJEIiwibXVsIiwiZGlzdCIsImRpc3RTcSIsImxlblNxIiwicG9pbnQxIiwicG9pbnQyIiwiTm9ybWFsaXplIiwiY3VycmVudEFuZ2xlIiwidGFyZ2V0QW5nbGUiLCJhbmdsZTEiLCJhbmdsZTIiLCJNYXRoV3JhcCIsIkJldHdlZW5Qb2ludHMiLCJCZXR3ZWVuUG9pbnRzWSIsIkJldHdlZW5ZIiwiQ291bnRlckNsb2Nrd2lzZSIsIlJhbmRvbURlZ3JlZXMiLCJTaG9ydGVzdEJldHdlZW4iLCJXcmFwRGVncmVlcyIsIkJldHdlZW5Qb2ludHNTcXVhcmVkIiwiQ2hlYnlzaGV2IiwiUG93ZXIiLCJTbmFrZSIsIlNxdWFyZWQiLCJCYWNrIiwiQm91bmNlIiwiQ2lyY3VsYXIiLCJDdWJpYyIsIkVsYXN0aWMiLCJFeHBvIiwiUXVhZHJhdGljIiwiUXVhcnRpYyIsIlF1aW50aWMiLCJTaW5lIiwiU3RlcHBlZCIsIlBvd2VyMCIsIlBvd2VyMSIsIk91dCIsIlBvd2VyMiIsIlBvd2VyMyIsIlBvd2VyNCIsIlF1YXJ0IiwiUXVpbnQiLCJDaXJjIiwiSW5PdXQiLCJhbXBsaXR1ZGUiLCJhc2luIiwiRXF1YWwiLCJHcmVhdGVyVGhhbiIsIkxlc3NUaGFuIiwiRWFzaW5nIiwiRnV6enkiLCJJbnRlcnBvbGF0aW9uIiwiUG93MiIsIlNuYXAiLCJBdmVyYWdlIiwiQmVybnN0ZWluIiwiQ2VpbFRvIiwiRGlmZmVyZW5jZSIsIkZsb29yVG8iLCJHZXRTcGVlZCIsIklzRXZlbiIsIklzRXZlblN0cmljdCIsIk1heEFkZCIsIk1pblN1YiIsIlBlcmNlbnQiLCJSYW5kb21YWSIsIlJvdW5kQXdheUZyb21aZXJvIiwiUm91bmRUbyIsIlNpbkNvc1RhYmxlR2VuZXJhdG9yIiwiVG9YWSIsIldpdGhpbiIsIlAwIiwiUDEiLCJQMiIsIlAzIiwiQmV6aWVyIiwiR2V0TmV4dCIsIklzU2l6ZSIsIklzVmFsdWUiLCJzZWVkcyIsInMwIiwic2lnbnMiLCJzb3ciLCJmcmFjIiwiaW50ZWdlckluUmFuZ2UiLCJyZWFsSW5SYW5nZSIsImJldHdlZW4iLCJ1dWlkIiwicGljayIsIndlaWdodGVkUGljayIsIml0ZW1BdEluZGV4IiwiZ2FwIiwiUGhhc2VyIiwiQW5pbWF0aW9ucyIsIkNhY2hlIiwiQ2FtZXJhcyIsIkNvcmUiLCJDcmVhdGUiLCJDdXJ2ZXMiLCJEaXNwbGF5IiwiRE9NIiwiUGh5c2ljcyIsIlBsdWdpbnMiLCJSZW5kZXJlciIsIlNjZW5lIiwiU2NlbmVzIiwiU3RydWN0cyIsIlRleHR1cmVzIiwiVGlsZW1hcHMiLCJUaW1lIiwiVHdlZW5zIiwiU291bmQiLCJBcmNhZGVJbWFnZSIsIkFjY2VsZXJhdGlvbiIsIkFuZ3VsYXIiLCJEZWJ1ZyIsIkRyYWciLCJFbmFibGUiLCJGcmljdGlvbiIsIkdyYXZpdHkiLCJJbW1vdmFibGUiLCJNYXNzIiwiVmVsb2NpdHkiLCJEaXN0YW5jZVNxdWFyZWQiLCJGYWN0b3J5IiwiTWVyZ2UiLCJPdmVybGFwQ2lyYyIsIk92ZXJsYXBSZWN0IiwiV29ybGQiLCJBcmNhZGVQaHlzaWNzIiwiZ2V0Q29uZmlnIiwid29ybGQiLCJQT1NUX1VQREFURSIsIm92ZXJsYXAiLCJvYmplY3QxIiwib2JqZWN0MiIsIm92ZXJsYXBDYWxsYmFjayIsInByb2Nlc3NDYWxsYmFjayIsImNvbGxpZGVPYmplY3RzIiwiY29sbGlkZSIsImNvbGxpZGVDYWxsYmFjayIsImNvbGxpZGVUaWxlcyIsInRpbGVzIiwib3ZlcmxhcFRpbGVzIiwiYWNjZWxlcmF0ZVRvIiwieFNwZWVkTWF4IiwieVNwZWVkTWF4IiwibWF4VmVsb2NpdHkiLCJhY2NlbGVyYXRlVG9PYmplY3QiLCJib2RpZXMiLCJmdXJ0aGVzdCIsImZhcnRoZXN0IiwibWF4VGltZSIsIm1vdmVUb09iamVjdCIsInZlbG9jaXR5RnJvbUFuZ2xlIiwidmVsb2NpdHlGcm9tUm90YXRpb24iLCJvdmVybGFwUmVjdCIsImluY2x1ZGVEeW5hbWljIiwiaW5jbHVkZVN0YXRpYyIsIm92ZXJsYXBDaXJjIiwiQXJjYWRlU3ByaXRlIiwiQm9keSIsImRlYnVnU2hvd0JvZHkiLCJkZWJ1Z1Nob3dWZWxvY2l0eSIsImRlYnVnQm9keUNvbG9yIiwiYm9keURlYnVnQ29sb3IiLCJpc0NpcmNsZSIsImFsbG93Um90YXRpb24iLCJwcmVSb3RhdGlvbiIsInNvdXJjZVdpZHRoIiwic291cmNlSGVpZ2h0IiwibmV3VmVsb2NpdHkiLCJkZWx0YU1heCIsImFsbG93RHJhZyIsImFsbG93R3Jhdml0eSIsIndvcmxkQm91bmNlIiwiY3VzdG9tQm91bmRzUmVjdGFuZ2xlIiwib25Xb3JsZEJvdW5kcyIsIm9uQ29sbGlkZSIsIm9uT3ZlcmxhcCIsImZyaWN0aW9uIiwidXNlRGFtcGluZyIsImFuZ3VsYXJWZWxvY2l0eSIsImFuZ3VsYXJBY2NlbGVyYXRpb24iLCJhbmd1bGFyRHJhZyIsIm1heEFuZ3VsYXIiLCJtYXNzIiwiZmFjaW5nIiwiRkFDSU5HX05PTkUiLCJpbW1vdmFibGUiLCJtb3ZlcyIsImN1c3RvbVNlcGFyYXRlWCIsImN1c3RvbVNlcGFyYXRlWSIsIm92ZXJsYXBYIiwib3ZlcmxhcFkiLCJvdmVybGFwUiIsImVtYmVkZGVkIiwiY29sbGlkZVdvcmxkQm91bmRzIiwiY2hlY2tDb2xsaXNpb24iLCJub25lIiwidG91Y2hpbmciLCJ3YXNUb3VjaGluZyIsImJsb2NrZWQiLCJzeW5jQm91bmRzIiwicGh5c2ljc1R5cGUiLCJEWU5BTUlDX0JPRFkiLCJfc3giLCJfc3kiLCJfZHgiLCJfZHkiLCJfdHgiLCJfdHkiLCJ1cGRhdGVCb3VuZHMiLCJyZWNhbGMiLCJhc3giLCJhc3kiLCJ1cGRhdGVDZW50ZXIiLCJyZXNldEZsYWdzIiwid2lsbFN0ZXAiLCJjaGVja1dvcmxkQm91bmRzIiwiV09STERfQk9VTkRTIiwiRkFDSU5HX0xFRlQiLCJGQUNJTkdfUklHSFQiLCJGQUNJTkdfVVAiLCJGQUNJTkdfRE9XTiIsInNldEJvdW5kc1JlY3RhbmdsZSIsIndhc1NldCIsInNldENpcmNsZSIsIm9uRmxvb3IiLCJvbkNlaWxpbmciLCJvbldhbGwiLCJkZWx0YUFic1giLCJkZWx0YUFic1kiLCJkZWx0YVhGaW5hbCIsImRlbHRhWUZpbmFsIiwiZHJhd0RlYnVnIiwidmVsb2NpdHlEZWJ1Z0NvbG9yIiwid2lsbERyYXdEZWJ1ZyIsInNldENvbGxpZGVXb3JsZEJvdW5kcyIsImJvdW5jZVgiLCJib3VuY2VZIiwic2V0Qm91bmNlWCIsInNldEJvdW5jZVkiLCJzZXRWZWxvY2l0eSIsInNldFZlbG9jaXR5WCIsInNldFZlbG9jaXR5WSIsInNldE1heFZlbG9jaXR5Iiwic2V0TWF4U3BlZWQiLCJzZXRCb3VuY2UiLCJzZXRBY2NlbGVyYXRpb24iLCJzZXRBY2NlbGVyYXRpb25YIiwic2V0QWNjZWxlcmF0aW9uWSIsInNldEFsbG93RHJhZyIsInNldEFsbG93R3Jhdml0eSIsInNldEFsbG93Um90YXRpb24iLCJzZXREcmFnIiwic2V0RHJhZ1giLCJzZXREcmFnWSIsInNldEZyaWN0aW9uIiwic2V0RnJpY3Rpb25YIiwic2V0RnJpY3Rpb25ZIiwic2V0QW5ndWxhclZlbG9jaXR5Iiwic2V0QW5ndWxhckFjY2VsZXJhdGlvbiIsInNldEFuZ3VsYXJEcmFnIiwic2V0TWFzcyIsInNldEltbW92YWJsZSIsInNldEVuYWJsZSIsIkNvbGxpZGVyIiwib3ZlcmxhcE9ubHkiLCJyZW1vdmVDb2xsaWRlciIsIlBoeXNpY3NHcm91cCIsIlN0YXRpY1BoeXNpY3NHcm91cCIsImNvbGxpZGVyIiwiYWRkQ29sbGlkZXIiLCJhZGRPdmVybGFwIiwiaXNTdGF0aWMiLCJTVEFUSUNfQk9EWSIsImVuYWJsZUJvZHkiLCJzdGF0aWNJbWFnZSIsInN0YXRpY1Nwcml0ZSIsInN0YXRpY0dyb3VwIiwiZ3JvdXAiLCJib2R5MSIsImJvZHkyIiwibWF4T3ZlcmxhcCIsImNyZWF0ZUNhbGxiYWNrSGFuZGxlciIsInJlbW92ZUNhbGxiYWNrSGFuZGxlciIsInNpbmdsZUNvbmZpZyIsImRpc2FibGVCb2R5IiwiR2V0T3ZlcmxhcFgiLCJ2MiIsIm52MSIsIm52MiIsIkdldE92ZXJsYXBZIiwiU3RhdGljQm9keSIsImRlYnVnU2hvd1N0YXRpY0JvZHkiLCJzdGF0aWNCb2R5RGVidWdDb2xvciIsInNldEdhbWVPYmplY3QiLCJ1cGRhdGVGcm9tR2FtZU9iamVjdCIsInN0YXRpY1RyZWUiLCJjcmVhdGVNdWx0aXBsZUNhbGxiYWNrSGFuZGxlciIsIkZ1enp5R3JlYXRlclRoYW4iLCJGdXp6eUxlc3NUaGFuIiwiUHJvY2Vzc1RpbGVDYWxsYmFja3MiLCJSVHJlZSIsIlNlcGFyYXRlVGlsZSIsIlNlcGFyYXRlWCIsIlNlcGFyYXRlWSIsIlRpbGVJbnRlcnNlY3RzQm9keSIsInN0YXRpY0JvZGllcyIsImNvbGxpZGVycyIsImZpeGVkU3RlcCIsIl9mcmFtZVRpbWUiLCJfZnJhbWVUaW1lTVMiLCJzdGVwc0xhc3RGcmFtZSIsIk9WRVJMQVBfQklBUyIsIlRJTEVfQklBUyIsImZvcmNlWCIsIl90b3RhbCIsIm1heEVudHJpZXMiLCJ1c2VUcmVlIiwidHJlZSIsInRyZWVNaW5NYXgiLCJjcmVhdGVEZWJ1Z0dyYXBoaWMiLCJib2R5VHlwZSIsImNoZWNrTGVmdCIsImNoZWNrUmlnaHQiLCJjaGVja1VwIiwic2V0Qm91bmRzQ29sbGlzaW9uIiwic2V0RlBTIiwiZnJhbWVyYXRlIiwiZml4ZWREZWx0YSIsIldPUkxEX1NURVAiLCJkeW5hbWljIiwiZHluYW1pY1RyZWUiLCJjb21wdXRlQW5ndWxhclZlbG9jaXR5IiwidmVsb2NpdHlEZWx0YSIsInNlcGFyYXRlIiwic2VwYXJhdGVDaXJjbGUiLCJib2R5UmVjdCIsImJvZHlDaXJjbGUiLCJyZXN1bHRYIiwicmVzdWx0WSIsIk9WRVJMQVAiLCJDT0xMSURFIiwibngiLCJueSIsImR2eCIsImR2eSIsImFuZ2xlQ29sbGlzaW9uIiwiY2lyY2xlQm9keUludGVyc2VjdHMiLCJvYmplY3QxaXNBcnJheSIsIm9iamVjdDJpc0FycmF5IiwiY29sbGlkZUhhbmRsZXIiLCJjb2xsaWRlR3JvdXBWc0dyb3VwIiwiY29sbGlkZVNwcml0ZVZzU3ByaXRlIiwiY29sbGlkZVNwcml0ZVZzR3JvdXAiLCJpc1RpbGVtYXAiLCJjb2xsaWRlU3ByaXRlVnNUaWxlbWFwTGF5ZXIiLCJjb2xsaWRlR3JvdXBWc1RpbGVtYXBMYXllciIsInNwcml0ZTEiLCJzcHJpdGUyIiwiYm9keUIiLCJib2R5QSIsIm1pbk1heCIsInNraXBJbmRleCIsInRpbGVtYXBMYXllciIsImRpZENvbGxpZGUiLCJjb2xsaWRlU3ByaXRlVnNUaWxlc0hhbmRsZXIiLCJsYXllckRhdGEiLCJsYXllciIsInRpbGVXaWR0aCIsImJhc2VUaWxlV2lkdGgiLCJ4RGlmZiIsInRpbGVIZWlnaHQiLCJiYXNlVGlsZUhlaWdodCIsIm1hcERhdGEiLCJnZXRUaWxlc1dpdGhpbldvcmxkWFkiLCJpc0xheWVyIiwidGlsZVdvcmxkUmVjdCIsImNvbGxpc2lvbiIsInRpbGVUb1dvcmxkWCIsInRpbGVUb1dvcmxkWSIsImJhc2VIZWlnaHQiLCJUSUxFX09WRVJMQVAiLCJUSUxFX0NPTExJREUiLCJncm91cDEiLCJncm91cDIiLCJ3cmFwT2JqZWN0Iiwid3JhcEFycmF5Iiwib2JqZWN0cyIsInNob3dCb2R5Iiwic2hvd1ZlbG9jaXR5IiwiYm9keUNvbG9yIiwic2V0RGVidWdCb2R5Q29sb3IiLCJzZXREYW1waW5nIiwiZW5hYmxlR2FtZU9iamVjdCIsInNob3dHYW1lT2JqZWN0IiwiZGlzYWJsZUdhbWVPYmplY3QiLCJoaWRlR2FtZU9iamVjdCIsInJlZnJlc2hCb2R5IiwiYm9kaWVzSW5SZWN0IiwiY2lyY0Zyb21Cb2R5IiwiYm9kaWVzSW5BcmVhIiwiZHluYW1pY0JvZGllcyIsImZha2VCb2R5IiwiR1JPVVAiLCJUSUxFTUFQTEFZRVIiLCJBcmNhZGUiLCJTdGF0aWNHcm91cCIsImNvbGxpc2lvbkNhbGxiYWNrIiwiY29sbGlzaW9uQ2FsbGJhY2tDb250ZXh0IiwiVGlsZUNoZWNrWCIsIlRpbGVDaGVja1kiLCJ0aWxlQmlhcyIsInRpbGVMZWZ0IiwidGlsZVRvcCIsInRpbGVSaWdodCIsInRpbGVCb3R0b20iLCJmYWNlSG9yaXpvbnRhbCIsImZhY2VMZWZ0IiwiZmFjZVJpZ2h0IiwiZmFjZVZlcnRpY2FsIiwiZmFjZVRvcCIsImZhY2VCb3R0b20iLCJQcm9jZXNzVGlsZVNlcGFyYXRpb25YIiwiUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWSIsImNvbGxpZGVVcCIsImNvbGxpZGVEb3duIiwiTWF0dGVyIiwiQm9keUJvdW5kcyIsImJvdW5kc0NlbnRlciIsImNlbnRlckRpZmYiLCJwYXJzZUJvZHkiLCJib3VuZHNXaWR0aCIsImJvdW5kc0hlaWdodCIsImJvZHlDZW50ZXJYIiwiY2VudGVyT2ZNYXNzIiwiYm9keUNlbnRlclkiLCJDb21wb3NpdGUiLCJEZXRlY3RvciIsIlBhaXJzIiwiUGFpciIsIlF1ZXJ5IiwiUmVzb2x2ZXIiLCJTQVQiLCJDb25zdHJhaW50IiwiQ29tbW9uIiwiRW5naW5lIiwiU2xlZXBpbmciLCJCb2RpZXMiLCJDb21wb3NpdGVzIiwiQXhlcyIsIlN2ZyIsIlZlY3RvciIsIlZlcnRpY2VzIiwiYWRkQ29tcG9zaXRlIiwiYWRkQm9keSIsImFkZENvbnN0cmFpbnQiLCJNYXR0ZXJHYW1lT2JqZWN0IiwiTWF0dGVySW1hZ2UiLCJNYXR0ZXJTcHJpdGUiLCJNYXR0ZXJUaWxlQm9keSIsIlBoeXNpY3NFZGl0b3JQYXJzZXIiLCJQaHlzaWNzSlNPTlBhcnNlciIsIlBvaW50ZXJDb25zdHJhaW50IiwidHJhcGV6b2lkIiwic2xvcGUiLCJtYXhTaWRlcyIsInNpZGVzIiwiZnJvbVZlcnRpY2VzIiwidmVydGV4U2V0cyIsImZsYWdJbnRlcm5hbCIsInJlbW92ZUNvbGxpbmVhciIsIm1pbmltdW1BcmVhIiwiZnJvbVBhdGgiLCJmcm9tUGh5c2ljc0VkaXRvciIsImFkZFRvV29ybGQiLCJmcm9tU1ZHIiwicGF0aFRvVmVydGljZXMiLCJpbWFnZVN0YWNrIiwiY29sdW1ucyIsInJvd3MiLCJjb2x1bW5HYXAiLCJyb3dHYXAiLCJweXJhbWlkIiwiY29tcG9zaXRlIiwieE9mZnNldEEiLCJ5T2Zmc2V0QSIsInhPZmZzZXRCIiwieU9mZnNldEIiLCJjcm9zc0JyYWNlIiwibmV3dG9uc0NyYWRsZSIsImNhciIsIndoZWVsU2l6ZSIsInNvZnRCb2R5IiwicGFydGljbGVSYWRpdXMiLCJwYXJ0aWNsZU9wdGlvbnMiLCJjb25zdHJhaW50T3B0aW9ucyIsImpvaW50Iiwic3RpZmZuZXNzIiwiY29uc3RyYWludCIsInNwcmluZyIsIndvcmxkQ29uc3RyYWludCIsIm1vdXNlU3ByaW5nIiwicG9pbnRlckNvbnN0cmFpbnQiLCJ0aWxlQm9keSIsIkNvbGxpc2lvbiIsIkZvcmNlIiwiU2Vuc29yIiwiU2V0Qm9keSIsIlNsZWVwIiwiU3RhdGljIiwibWl4aW4iLCJkZWYiLCJfdGVtcFZlYzIiLCJzZXRFeGlzdGluZ0JvZHkiLCJzZXRCb2R5Iiwic2V0UmVjdGFuZ2xlIiwiTWF0dGVyQXR0cmFjdG9ycyIsIk1hdHRlckNvbGxpc2lvbkV2ZW50cyIsIk1hdHRlckxpYiIsIk1hdHRlcldyYXAiLCJNYXR0ZXJQaHlzaWNzIiwiYm9keUJvdW5kcyIsImRldGVjdG9yIiwicGFpciIsInBhaXJzIiwic2F0IiwiY29tcG9zaXRlcyIsImVuYWJsZUNvbGxpc2lvbkV2ZW50c1BsdWdpbiIsImVuYWJsZUF0dHJhY3RvclBsdWdpbiIsImVuYWJsZVdyYXBQbHVnaW4iLCJfcmVzdGluZ1RocmVzaCIsIl9yZXN0aW5nVGhyZXNoVGFuZ2VudCIsIl9wb3NpdGlvbkRhbXBlbiIsIl9wb3NpdGlvbldhcm1pbmciLCJfZnJpY3Rpb25Ob3JtYWxNdWx0aXBsaWVyIiwidXNlIiwic2V0NjBIeiIsImdldERlbHRhIiwidXBkYXRlNjBIeiIsImF1dG9VcGRhdGUiLCJzZXQzMEh6IiwidXBkYXRlMzBIeiIsImNvcnJlY3Rpb24iLCJjb250YWluc1BvaW50IiwiZ2V0TWF0dGVyQm9kaWVzIiwiaW50ZXJzZWN0UG9pbnQiLCJpbnRlcnNlY3RSZWN0Iiwib3V0c2lkZSIsInJlZ2lvbiIsImludGVyc2VjdFJheSIsInJheVdpZHRoIiwiY29sbGlzaW9ucyIsImludGVyc2VjdEJvZHkiLCJjb2xsaWRlcyIsInNldENvbGxpc2lvbkNhdGVnb3J5IiwiY29sbGlzaW9uRmlsdGVyIiwiY2F0ZWdvcnkiLCJzZXRDb2xsaXNpb25Hcm91cCIsInNldENvbGxpZGVzV2l0aCIsImNhdGVnb3JpZXMiLCJnZXRBbGxCb2RpZXMiLCJhcHBseUZvcmNlIiwiYXBwbHlGb3JjZUZyb21Qb3NpdGlvbiIsImFwcGx5Rm9yY2VGcm9tQW5nbGUiLCJnZXRDb25zdHJhaW50TGVuZ3RoIiwiYVgiLCJhWSIsImJYIiwiYlkiLCJhbGlnbkJvZHkiLCJBbmltYXRpb25Db21wb25lbnQiLCJtYXR0ZXJCb2R5IiwiY29sbGlzaW9uR3JvdXAiLCJnZXRDb2xsaXNpb25Hcm91cCIsInNldEZyb21UaWxlQ29sbGlzaW9uIiwic2V0RnJvbVRpbGVSZWN0YW5nbGUiLCJ0aWxlWCIsImdldExlZnQiLCJ0aWxlWSIsImdldFRvcCIsImNvbGxpc2lvbk9iamVjdHMiLCJvdyIsIm9oIiwicG9seWxpbmUiLCJjZW50cmUiLCJyZW1vdmVCb2R5IiwiZml4dHVyZUNvbmZpZ3MiLCJmaXh0dXJlcyIsImZjIiwiZml4dHVyZVBhcnRzIiwicGFyc2VGaXh0dXJlIiwibWF0dGVyQ29uZmlnIiwic2V0UGFydHMiLCJmaXh0dXJlQ29uZmlnIiwicGFyc2VWZXJ0aWNlcyIsImNsb2Nrd2lzZVNvcnQiLCJmbGFnQ29pbmNpZGVudFBhcnRzIiwiYW5ndWxhclN0aWZmbmVzcyIsIkJFRk9SRV9VUERBVEUiLCJnZXRCb2R5IiwiYWxsQm9kaWVzIiwibG9jYWxXb3JsZCIsImlnbm9yZVBvaW50ZXIiLCJjYW5Db2xsaWRlIiwiaGl0VGVzdEJvZHkiLCJhbmdsZUIiLCJzdG9wRHJhZyIsInJlbW92ZUNvbnN0cmFpbnQiLCJNYXR0ZXJCb2R5IiwiTWF0dGVyRXZlbnRzIiwiTWF0dGVyV29ybGQiLCJlbmdpbmUiLCJ3YWxscyIsInJ1bm5lckNvbmZpZyIsImhhc0ZQUyIsImRlbHRhTWluIiwiZGVsdGFTYW1wbGVTaXplIiwiY291bnRlclRpbWVzdGFtcCIsImZyYW1lQ291bnRlciIsInRpbWVQcmV2IiwidGltZVNjYWxlUHJldiIsImZyYW1lUmVxdWVzdElkIiwiaXNGaXhlZCIsImRlYnVnQ29uZmlnIiwic2hvd0F4ZXMiLCJzaG93QW5nbGVJbmRpY2F0b3IiLCJhbmdsZUNvbG9yIiwic2hvd0Jyb2FkcGhhc2UiLCJicm9hZHBoYXNlQ29sb3IiLCJzaG93Qm91bmRzIiwiYm91bmRzQ29sb3IiLCJ2ZWxvY2l0eUNvbG9yIiwic2hvd0NvbGxpc2lvbnMiLCJjb2xsaXNpb25Db2xvciIsInNob3dTZXBhcmF0aW9ucyIsInNlcGFyYXRpb25Db2xvciIsInNob3dTdGF0aWNCb2R5Iiwic2hvd0ludGVybmFsRWRnZXMiLCJyZW5kZXJGaWxsIiwicmVuZGVyTGluZSIsImZpbGxPcGFjaXR5IiwibGluZU9wYWNpdHkiLCJzdGF0aWNGaWxsQ29sb3IiLCJzdGF0aWNMaW5lQ29sb3IiLCJzaG93U2xlZXBpbmciLCJzdGF0aWNCb2R5U2xlZXBPcGFjaXR5Iiwic2xlZXBGaWxsQ29sb3IiLCJzbGVlcExpbmVDb2xvciIsInNob3dTZW5zb3JzIiwic2Vuc29yRmlsbENvbG9yIiwic2Vuc29yTGluZUNvbG9yIiwic2hvd1Bvc2l0aW9ucyIsInBvc2l0aW9uU2l6ZSIsInBvc2l0aW9uQ29sb3IiLCJzaG93Sm9pbnQiLCJqb2ludENvbG9yIiwiam9pbnRMaW5lT3BhY2l0eSIsImpvaW50TGluZVRoaWNrbmVzcyIsInBpblNpemUiLCJwaW5Db2xvciIsInNwcmluZ0NvbG9yIiwiYW5jaG9yQ29sb3IiLCJhbmNob3JTaXplIiwic2hvd0NvbnZleEh1bGxzIiwiaHVsbENvbG9yIiwic2V0RXZlbnRzUHJveHkiLCJzZXRDb21wb3NpdGVSZW5kZXJTdHlsZSIsImNvbnN0cmFpbnRzIiwic2V0Qm9keVJlbmRlclN0eWxlIiwic2V0Q29uc3RyYWludFJlbmRlclN0eWxlIiwiQkVGT1JFX0FERCIsIkFGVEVSX0FERCIsIkJFRk9SRV9SRU1PVkUiLCJBRlRFUl9SRU1PVkUiLCJBRlRFUl9VUERBVEUiLCJDT0xMSVNJT05fU1RBUlQiLCJDT0xMSVNJT05fQUNUSVZFIiwiQ09MTElTSU9OX0VORCIsInVwZGF0ZVdhbGwiLCJ3YWxsIiwiZnJpY3Rpb25TdGF0aWMiLCJkaXNhYmxlR3Jhdml0eSIsImVudGl0eSIsImNvbnZlcnRUaWxlbWFwTGF5ZXIiLCJnZXRUaWxlc1dpdGhpbiIsImlzQ29sbGlkaW5nIiwiY29udmVydFRpbGVzIiwibmV4dEdyb3VwIiwiaXNOb25Db2xsaWRpbmciLCJuZXh0Q2F0ZWdvcnkiLCJ0aW1pbmciLCJnZXRBbGxDb25zdHJhaW50cyIsImFsbENvbnN0cmFpbnRzIiwiZ2V0QWxsQ29tcG9zaXRlcyIsImFsbENvbXBvc2l0ZXMiLCJicm9hZHBoYXNlIiwiY29udHJvbGxlciIsInJlbmRlckdyaWQiLCJyZW5kZXJCb2R5Qm91bmRzIiwicmVuZGVyQm9kaWVzIiwicmVuZGVySm9pbnRzIiwicmVuZGVyQm9keUF4ZXMiLCJyZW5kZXJCb2R5VmVsb2NpdHkiLCJyZW5kZXJTZXBhcmF0aW9ucyIsInJlbmRlckNvbGxpc2lvbnMiLCJidWNrZXRLZXlzIiwiYnVja2V0cyIsImJ1Y2tldElkIiwiYnVja2V0V2lkdGgiLCJidWNrZXRIZWlnaHQiLCJwb3NBIiwicG9zQiIsInBlbmV0cmF0aW9uIiwiYWN0aXZlQ29udGFjdHMiLCJ2ZXJ0ZXgiLCJjb250YWN0cyIsIm5vcm1hbFBvc1giLCJub3JtYWxQb3NZIiwic3VwcG9ydHMiLCJwb3NpdGlvblByZXYiLCJpc1NsZWVwaW5nIiwicmVuZGVyQm9keSIsInJlbmRlckNvbnZleEh1bGwiLCJpc1NlbnNvciIsImNpcmNsZVJhZGl1cyIsInZlcnRMZW5ndGgiLCJ2ZXJ0IiwiaXNJbnRlcm5hbCIsIm5leHRJbmRleCIsImhzIiwicmVuZGVyQ29uc3RyYWludCIsIm5vcm1hbGlzZSIsImNvaWxzIiwiYW5jaG9ycyIsInJlc2V0Q29sbGlzaW9uSURzIiwiX25leHRDb2xsaWRpbmdHcm91cElkIiwiX25leHROb25Db2xsaWRpbmdHcm91cElkIiwiX25leHRDYXRlZ29yeSIsInJlc3RpdHV0aW9uIiwic2V0T25Db2xsaWRlIiwib25Db2xsaWRlQ2FsbGJhY2siLCJzZXRPbkNvbGxpZGVFbmQiLCJvbkNvbGxpZGVFbmRDYWxsYmFjayIsInNldE9uQ29sbGlkZUFjdGl2ZSIsIm9uQ29sbGlkZUFjdGl2ZUNhbGxiYWNrIiwic2V0T25Db2xsaWRlV2l0aCIsImFwcGx5Rm9yY2VGcm9tIiwidGhydXN0IiwidGhydXN0TGVmdCIsInRocnVzdFJpZ2h0IiwidGhydXN0QmFjayIsImFpciIsImZzdGF0aWMiLCJmcmljdGlvbkFpciIsInNldEZyaWN0aW9uQWlyIiwic2V0RnJpY3Rpb25TdGF0aWMiLCJzZXRJZ25vcmVHcmF2aXR5IiwiaWdub3JlR3Jhdml0eSIsInNldERlbnNpdHkiLCJzZXRTZW5zb3IiLCJGdXp6eUVxdWFscyIsInNldFBvbHlnb24iLCJzZXRUcmFwZXpvaWQiLCJjb214IiwiY29teSIsImNlbnRlck9mZnNldCIsImJvZHlYIiwiYm9keVkiLCJib2R5V2lkdGgiLCJib2R5SGVpZ2h0IiwicFJhZGl1cyIsInNldFZlcnRpY2VzIiwic2V0VG9TbGVlcCIsInNldEF3YWtlIiwic2V0U2xlZXBUaHJlc2hvbGQiLCJzbGVlcFRocmVzaG9sZCIsInNldFNsZWVwRXZlbnRzIiwic2V0U2xlZXBTdGFydEV2ZW50Iiwic2V0U2xlZXBFbmRFdmVudCIsIlNMRUVQX1NUQVJUIiwiU0xFRVBfRU5EIiwic2V0U3RhdGljIiwiZmFjdG9yWCIsImZhY3RvclkiLCJzZXRGaXhlZFJvdGF0aW9uIiwic2V0SW5lcnRpYSIsIlBvbHlEZWNvbXAiLCJUaWxlQm9keSIsIl9pbmVydGlhU2NhbGUiLCJuZXh0SWQiLCJ0b3JxdWUiLCJwb3NpdGlvbkltcHVsc2UiLCJwcmV2aW91c1Bvc2l0aW9uSW1wdWxzZSIsImNvbnN0cmFpbnRJbXB1bHNlIiwidG90YWxDb250YWN0cyIsImFuZ3VsYXJTcGVlZCIsIm1vdGlvbiIsImRlbnNpdHkiLCJzbG9wIiwiY2hhbWZlciIsImFuZ2xlUHJldiIsImludmVyc2VNYXNzIiwiaW5lcnRpYSIsImludmVyc2VJbmVydGlhIiwiX29yaWdpbmFsIiwiZ3Jhdml0eVNjYWxlIiwib25Db2xsaWRlV2l0aCIsIl9pbml0UHJvcGVydGllcyIsInNldENlbnRyZSIsImF1dG9IdWxsIiwiaHVsbCIsImh1bGxDZW50cmUiLCJfdG90YWxQcm9wZXJ0aWVzIiwicm90YXRlQWJvdXQiLCJ0cmFuc2xhdGlvbiIsInRvdGFsQXJlYSIsInRvdGFsSW5lcnRpYSIsImRlbHRhVGltZSIsImRlbHRhVGltZVNxdWFyZWQiLCJ2ZWxvY2l0eVByZXZYIiwidmVsb2NpdHlQcmV2WSIsIm11bHQiLCJpc01vZGlmaWVkIiwic2V0TW9kaWZpZWQiLCJ1cGRhdGVQYXJlbnRzIiwiY2hpbGRDb21wb3NpdGUiLCJyZW1vdmVDb21wb3NpdGUiLCJjb21wb3NpdGVBIiwiY29tcG9zaXRlQiIsInJlbW92ZUNvbXBvc2l0ZUF0IiwicmVtb3ZlQm9keUF0IiwicmVtb3ZlQ29uc3RyYWludEF0Iiwia2VlcFN0YXRpYyIsInJlYmFzZSIsInJlY3Vyc2l2ZSIsImJyb2FkcGhhc2VQYWlycyIsInBhaXJzVGFibGUiLCJtaWRwaGFzZVRlc3RzIiwib3ZlcmxhcHMiLCJwYXJ0QSIsInBhcnRCIiwicHJldmlvdXNDb2xsaXNpb24iLCJuYXJyb3dwaGFzZVRlc3RzIiwicmV1c2VkIiwibmFycm93UmV1c2VDb3VudCIsImNvbGxpZGVkIiwibmFycm93RGV0ZWN0aW9ucyIsImZpbHRlckEiLCJmaWx0ZXJCIiwicGFpcnNMaXN0IiwiZm9yY2VVcGRhdGUiLCJidWNrZXQiLCJncmlkQ2hhbmdlZCIsImJyb2FkcGhhc2VUZXN0cyIsIm5ld1JlZ2lvbiIsIl9nZXRSZWdpb24iLCJfcmVnaW9uVW5pb24iLCJzdGFydENvbCIsImVuZENvbCIsInN0YXJ0Um93IiwiZW5kUm93IiwiX2dldEJ1Y2tldElkIiwiaXNJbnNpZGVOZXdSZWdpb24iLCJpc0luc2lkZU9sZFJlZ2lvbiIsIl9idWNrZXRSZW1vdmVCb2R5IiwiX2NyZWF0ZUJ1Y2tldCIsIl9idWNrZXRBZGRCb2R5IiwiX2NyZWF0ZUFjdGl2ZVBhaXJzTGlzdCIsInJlZ2lvbkEiLCJyZWdpb25CIiwiX2NyZWF0ZVJlZ2lvbiIsImNvbHVtbiIsInBhaXJJZCIsInBhaXJLZXlzIiwic2VwYXJhdGlvbiIsImNvbmZpcm1lZEFjdGl2ZSIsInRpbWVDcmVhdGVkIiwidGltZVVwZGF0ZWQiLCJwYXJlbnRBIiwicGFyZW50QiIsImNvbnRhY3QiLCJzdXBwb3J0Q291bnQiLCJfcGFpck1heElkbGVMaWZlIiwiY29sbGlzaW9uU3RhcnQiLCJjb2xsaXNpb25BY3RpdmUiLCJjb2xsaXNpb25FbmQiLCJyZW1vdmVPbGQiLCJwYWlySW5kZXgiLCJpbmRleGVzVG9SZW1vdmUiLCJyYXlBbmdsZSIsInJheUxlbmd0aCIsInJheVgiLCJyYXlZIiwicHJlU29sdmVQb3NpdGlvbiIsImFjdGl2ZUNvdW50Iiwic29sdmVQb3NpdGlvbiIsIm5vcm1hbFgiLCJub3JtYWxZIiwicG9zaXRpb25JbXB1bHNlQSIsInBvc2l0aW9uSW1wdWxzZUIiLCJjb250YWN0U2hhcmUiLCJib2R5QnRvQVgiLCJib2R5QnRvQVkiLCJpbXB1bHNlQ29lZmZpY2llbnQiLCJwb3N0U29sdmVQb3NpdGlvbiIsInByZVNvbHZlVmVsb2NpdHkiLCJ0YW5nZW50IiwiY29udGFjdFZlcnRleCIsIm5vcm1hbEltcHVsc2UiLCJ0YW5nZW50SW1wdWxzZSIsImltcHVsc2UiLCJ0ZW1wQSIsInNvbHZlVmVsb2NpdHkiLCJ0aW1lU2NhbGVTcXVhcmVkIiwidGVtcEIiLCJ0ZW1wQyIsInRlbXBEIiwidGVtcEUiLCJvZmZzZXRBIiwib2Zmc2V0QiIsInZlbG9jaXR5UG9pbnRBIiwidmVsb2NpdHlQb2ludEIiLCJyZWxhdGl2ZVZlbG9jaXR5Iiwibm9ybWFsVmVsb2NpdHkiLCJ0YW5nZW50VmVsb2NpdHkiLCJ0YW5nZW50U3BlZWQiLCJ0YW5nZW50VmVsb2NpdHlEaXJlY3Rpb24iLCJub3JtYWxGb3JjZSIsIm1heEZyaWN0aW9uIiwib0FjTiIsIm9CY04iLCJzaGFyZSIsImNvbnRhY3ROb3JtYWxJbXB1bHNlIiwiY29udGFjdFRhbmdlbnRJbXB1bHNlIiwib3ZlcmxhcEFCIiwib3ZlcmxhcEJBIiwibWluT3ZlcmxhcCIsImNhblJldXNlUHJldkNvbCIsImF4aXNCb2R5QSIsImF4aXNCb2R5IiwiYXhpc0JvZHlCIiwiYXhpc051bWJlciIsIl9vdmVybGFwQXhlcyIsInZlcnRpY2VzQiIsIl9maW5kU3VwcG9ydHMiLCJ2ZXJ0aWNlc0EiLCJuZWciLCJwcm9qZWN0aW9uQSIsInByb2plY3Rpb25CIiwiX3Byb2plY3RUb0F4aXMiLCJ2ZXJ0ZXhBIiwidmVydGV4QiIsIm5lYXJlc3REaXN0YW5jZSIsInZlcnRleFRvQm9keSIsImJvZHlBUG9zaXRpb24iLCJfd2FybWluZyIsIl90b3JxdWVEYW1wZW4iLCJfbWluTGVuZ3RoIiwiaW5pdGlhbFBvaW50QSIsImluaXRpYWxQb2ludEIiLCJkYW1waW5nIiwiYW5nbGVBIiwicHJlU29sdmVBbGwiLCJzb2x2ZUFsbCIsImZpeGVkQSIsImZpeGVkQiIsInNvbHZlIiwicG9pbnRBV29ybGQiLCJwb2ludEJXb3JsZCIsImN1cnJlbnRMZW5ndGgiLCJtYXNzVG90YWwiLCJyZXNpc3RhbmNlVG90YWwiLCJwb3N0U29sdmVBbGwiLCJfbmV4dElkIiwiX3NlZWQiLCJfbm93U3RhcnRUaW1lIiwiYXJnc1N0YXJ0IiwiZGVlcENsb25lIiwiY2hvb3NlIiwiY2hvaWNlcyIsImlzRWxlbWVudCIsIkhUTUxFbGVtZW50IiwiaXNTdHJpbmciLCJ3ZWJraXROb3ciLCJfc2VlZGVkUmFuZG9tIiwiY29sb3JUb051bWJlciIsImNvbG9yU3RyaW5nIiwibG9nTGV2ZWwiLCJoYXlzdGFjayIsIm5lZWRsZSIsInRvcG9sb2dpY2FsU29ydCIsImdyYXBoIiwidmlzaXRlZCIsIl90b3BvbG9naWNhbFNvcnQiLCJuZWlnaGJvcnMiLCJuZWlnaGJvciIsImZ1bmNzIiwiX2NoYWluZWQiLCJsYXN0UmVzdWx0IiwiY2hhaW5QYXRoQmVmb3JlIiwiY2hhaW5QYXRoQWZ0ZXIiLCJNZXRyaWNzIiwicG9zaXRpb25JdGVyYXRpb25zIiwidmVsb2NpdHlJdGVyYXRpb25zIiwiY29uc3RyYWludEl0ZXJhdGlvbnMiLCJlbmFibGVTbGVlcGluZyIsImV4dGVuZGVkIiwiX2JvZGllc0FwcGx5R3Jhdml0eSIsIl9ib2RpZXNVcGRhdGUiLCJhZnRlckNvbGxpc2lvbnMiLCJfYm9kaWVzQ2xlYXJGb3JjZXMiLCJlbmdpbmVBIiwiZW5naW5lQiIsIndvcmxkQm91bmRzIiwibmV3Q2FsbGJhY2tzIiwiZXZlbnRDbG9uZSIsInVzZXMiLCJuYXJyb3dSZXVzZSIsIm5hcnJvd0VmZiIsIm1pZEVmZiIsImJyb2FkRWZmIiwiX3JlZ2lzdHJ5IiwiaXNQbHVnaW4iLCJyZWdpc3RlcmVkIiwicGx1Z2luVmVyc2lvbiIsInZlcnNpb25QYXJzZSIsInJlZ2lzdGVyZWRWZXJzaW9uIiwiZGVwZW5kZW5jeSIsImRlcGVuZGVuY3lQYXJzZSIsImlzVXNlZCIsImlzRm9yIiwiZm9yIiwidmVyc2lvblNhdGlzZmllcyIsImRlcGVuZGVuY2llcyIsInNvcnRlZERlcGVuZGVuY2llcyIsIl93YXJuZWQiLCJzaWxlbnQiLCJ0cmFja2VkIiwicGFyc2VkQmFzZSIsImlkZW50aWZpZXJzIiwiaXNSYW5nZSIsInByZXJlbGVhc2UiLCJyYW5nZVBhcnNlZCIsInJhbmdlUGFydHMiLCJ2ZXJzaW9uUGFyc2VkIiwidmVyc2lvblBhcnRzIiwiX21vdGlvbldha2VUaHJlc2hvbGQiLCJfbW90aW9uU2xlZXBUaHJlc2hvbGQiLCJfbWluQmlhcyIsInRpbWVGYWN0b3IiLCJtaW5Nb3Rpb24iLCJtYXhNb3Rpb24iLCJzbGVlcENvdW50ZXIiLCJzbGVlcGluZ0JvZHkiLCJtb3ZpbmdCb2R5Iiwid2FzU2xlZXBpbmciLCJkZWNvbXAiLCJxdWFsaXR5IiwicXVhbGl0eU1pbiIsInF1YWxpdHlNYXgiLCJ2ZXJ0aWNlc1BhdGgiLCJ0aGV0YSIsImlzQ29udmV4IiwiY29uY2F2ZSIsIm1ha2VDQ1ciLCJyZW1vdmVDb2xsaW5lYXJQb2ludHMiLCJkZWNvbXBvc2VkIiwicXVpY2tEZWNvbXAiLCJjaHVua1ZlcnRpY2VzIiwibWF4RGlzdGFuY2UiLCJwYXYiLCJwYnYiLCJkYSIsIm1hZ25pdHVkZVNxdWFyZWQiLCJkYiIsImxhc3RCb2R5IiwiYm9keUFIZWlnaHQiLCJib2R5QVdpZHRoIiwiYm9keUJIZWlnaHQiLCJib2R5QyIsImFjdHVhbFJvd3MiLCJsYXN0Qm9keVdpZHRoIiwid2hlZWxBT2Zmc2V0Iiwid2hlZWxCT2Zmc2V0Iiwid2hlZWxBIiwid2hlZWxCIiwiYXhlbEEiLCJheGVsQiIsImdyYWRpZW50IiwiYm91bmRzQSIsImJvdW5kc0IiLCJzYW1wbGVMZW5ndGgiLCJzZWdtZW50c1F1ZXVlIiwibGFzdFNlZ21lbnQiLCJseCIsImx5IiwicGF0aFNlZ1R5cGUiLCJpc1JlbGF0aXZlIiwiYWRkU2VnbWVudFBvaW50Iiwic2VnVHlwZSIsInBhdGhTZWdUeXBlQXNMZXR0ZXIiLCJfc3ZnUGF0aFRvQWJzb2x1dGUiLCJnZXRUb3RhbExlbmd0aCIsInBhdGhTZWdMaXN0IiwibnVtYmVyT2ZJdGVtcyIsImdldFBhdGhTZWdBdExlbmd0aCIsImdldFBvaW50QXRMZW5ndGgiLCJzZWdzIiwic2VnIiwicmVwbGFjZUl0ZW0iLCJjcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0FicyIsImNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMiLCJjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0FicyIsImNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzIiwiY3JlYXRlU1ZHUGF0aFNlZ0FyY0FicyIsImxhcmdlQXJjRmxhZyIsInN3ZWVwRmxhZyIsInZlY3RvckEiLCJ2ZWN0b3JCIiwiY3Jvc3MzIiwidmVjdG9yQyIsInNjYWxhciIsIm1lYW4iLCJhdmVyYWdlIiwic2lnbmVkIiwibnVtZXJhdG9yIiwiZGVub21pbmF0b3IiLCJ2ZXJ0aWNlIiwibmV4dFZlcnRpY2UiLCJuZXdWZXJ0aWNlcyIsInByZXZWZXJ0ZXgiLCJuZXh0VmVydGV4IiwiY3VycmVudFJhZGl1cyIsInByZXZOb3JtYWwiLCJuZXh0Tm9ybWFsIiwiZGlhZ29uYWxSYWRpdXMiLCJyYWRpdXNWZWN0b3IiLCJtaWROb3JtYWwiLCJzY2FsZWRWZXJ0ZXgiLCJhdHRyYWN0b3JzIiwiYXR0cmFjdG9yIiwiZm9yY2VWZWN0b3IiLCJBdHRyYWN0b3JzIiwiZ3Jhdml0eUNvbnN0YW50IiwiYlRvQSIsIm1hdHRlciIsIm9iamVjdEJvdW5kcyIsImxpbmVJbnQiLCJsMSIsImwyIiwic2NhbGFyX2VxIiwibGluZVNlZ21lbnRzSW50ZXJzZWN0IiwidHJpYW5nbGVBcmVhIiwiaXNMZWZ0IiwiaXNMZWZ0T24iLCJpc1JpZ2h0IiwiaXNSaWdodE9uIiwiZWRnZXMiLCJwb2x5Z29uR2V0Q3V0RWRnZXMiLCJwb2x5Z29uU2xpY2UiLCJwb2x5Z29uUXVpY2tEZWNvbXAiLCJyZWZsZXhWZXJ0aWNlcyIsInN0ZWluZXJQb2ludHMiLCJtYXhsZXZlbCIsInVwcGVySW50IiwibG93ZXJJbnQiLCJ1cHBlckRpc3QiLCJsb3dlckRpc3QiLCJjbG9zZXN0RGlzdCIsInVwcGVySW5kZXgiLCJsb3dlckluZGV4IiwiY2xvc2VzdEluZGV4IiwibG93ZXJQb2x5IiwidXBwZXJQb2x5IiwicG9seSIsInBvbHlnb25Jc1JlZmxleCIsInBvbHlnb25BdCIsImdldEludGVyc2VjdGlvblBvaW50Iiwic3FkaXN0IiwicG9seWdvbkFwcGVuZCIsInBvbHlnb25DYW5TZWUyIiwiaXNTaW1wbGUiLCJjb2xsaW5lYXIiLCJyZW1vdmVEdXBsaWNhdGVQb2ludHMiLCJwaSIsInBvaW50c19lcSIsInBvbHlnb25SZXZlcnNlIiwidG1wUG9pbnQxIiwidG1wUG9pbnQyIiwidGhyZXNob2xkQW5nbGUiLCJhYiIsImJjIiwibWFnQSIsIm1hZ0IiLCJ0bXBMaW5lMSIsInRtcExpbmUyIiwicG9seWdvbkNhblNlZSIsInBvbHlnb25Db3B5IiwidGFyZ2V0UG9seSIsInBvbHlnb25DbGVhciIsInRtcDEiLCJ0bXAyIiwidG1wUG9seSIsIm5EaWFncyIsImN1dEVkZ2VzIiwicG9seXMiLCJjdXRFZGdlIiwiQmFzZVBsdWdpbiIsIkdsb2JhbCIsIkNvcmVTY2VuZSIsImNvcmVQbHVnaW5zIiwiY3VzdG9tUGx1Z2lucyIsInNjZW5lUGx1Z2lucyIsIl9wZW5kaW5nR2xvYmFsIiwiX3BlbmRpbmdTY2VuZSIsImdsb2JhbFBsdWdpbnMiLCJwbHVnaW5LZXkiLCJwbHVnaW5MaXN0IiwiZ2V0Q29yZSIsImdldERlZmF1bHRTY2VuZVBsdWdpbnMiLCJmcm9tTG9hZGVyIiwiaGFzQ3VzdG9tIiwicmVnaXN0ZXJDdXN0b20iLCJydW5BcyIsImNyZWF0ZUVudHJ5IiwiZ2V0Q3VzdG9tIiwiYXV0b1N0YXJ0IiwiZ2V0Q3VzdG9tQ2xhc3MiLCJyZW1vdmVHbG9iYWxQbHVnaW4iLCJyZW1vdmVDdXN0b20iLCJyZW1vdmVTY2VuZVBsdWdpbiIsInJlZ2lzdGVyR2FtZU9iamVjdCIsImZhY3RvcnlDYWxsYmFjayIsImNyZWF0b3JDYWxsYmFjayIsInJlbW92ZUdhbWVPYmplY3QiLCJyZW1vdmVGcm9tRmFjdG9yeSIsInJlbW92ZUZyb21DcmVhdG9yIiwicmVnaXN0ZXJGaWxlVHlwZSIsImRlc3Ryb3lDdXN0b21QbHVnaW5zIiwiZGVzdHJveUNvcmVQbHVnaW5zIiwiU2NlbmVQbHVnaW4iLCJmaXhTZXRUYXJnZXQiLCJzZXRUYXJnZXRBdFRpbWUiLCJzZXRUYXJnZXRWYWx1ZUF0VGltZSIsIkF1ZGlvQ29udGV4dCIsIndlYmtpdEF1ZGlvQ29udGV4dCIsImNyZWF0ZUdhaW4iLCJjcmVhdGVHYWluTm9kZSIsImNyZWF0ZURlbGF5IiwiY3JlYXRlRGVsYXlOb2RlIiwiY3JlYXRlU2NyaXB0UHJvY2Vzc29yIiwiY3JlYXRlSmF2YVNjcmlwdE5vZGUiLCJjcmVhdGVQZXJpb2RpY1dhdmUiLCJjcmVhdGVXYXZlVGFibGUiLCJpbnRlcm5hbF9jcmVhdGVHYWluIiwiZ2FpbiIsImludGVybmFsX2NyZWF0ZURlbGF5IiwibWF4RGVsYXlUaW1lIiwiZGVsYXlUaW1lIiwiaW50ZXJuYWxfY3JlYXRlQnVmZmVyU291cmNlIiwiY3JlYXRlQnVmZmVyU291cmNlIiwiaW50ZXJuYWxfc3RhcnQiLCJub3RlR3JhaW5PbiIsIm5vdGVPbiIsImludGVybmFsX3N0b3AiLCJub3RlT2ZmIiwiaW50ZXJuYWxfY3JlYXRlRHluYW1pY3NDb21wcmVzc29yIiwiY3JlYXRlRHluYW1pY3NDb21wcmVzc29yIiwia25lZSIsInJlZHVjdGlvbiIsImF0dGFjayIsInJlbGVhc2UiLCJpbnRlcm5hbF9jcmVhdGVCaXF1YWRGaWx0ZXIiLCJjcmVhdGVCaXF1YWRGaWx0ZXIiLCJkZXR1bmUiLCJpbnRlcm5hbF9jcmVhdGVPc2NpbGxhdG9yIiwiY3JlYXRlT3NjaWxsYXRvciIsInNldFBlcmlvZGljV2F2ZSIsInNldFdhdmVUYWJsZSIsIk9mZmxpbmVBdWRpb0NvbnRleHQiLCJ3ZWJraXRPZmZsaW5lQXVkaW9Db250ZXh0IiwiQ2hlYXBBcnJheSIsImZha2VUeXBlIiwibm93T2Zmc2V0IiwibmF2aWdhdGlvblN0YXJ0IiwiTVVMVElQTFkiLCJTQ1JFRU4iLCJPVkVSTEFZIiwiREFSS0VOIiwiTElHSFRFTiIsIkNPTE9SX0RPREdFIiwiQ09MT1JfQlVSTiIsIkhBUkRfTElHSFQiLCJTT0ZUX0xJR0hUIiwiRElGRkVSRU5DRSIsIkVYQ0xVU0lPTiIsIkhVRSIsIlNBVFVSQVRJT04iLCJDT0xPUiIsIkxVTUlOT1NJVFkiLCJTT1VSQ0VfSU4iLCJTT1VSQ0VfT1VUIiwiU09VUkNFX0FUT1AiLCJERVNUSU5BVElPTl9PVkVSIiwiREVTVElOQVRJT05fSU4iLCJERVNUSU5BVElPTl9PVVQiLCJERVNUSU5BVElPTl9BVE9QIiwiTElHSFRFUiIsIkNPUFkiLCJYT1IiLCJDYW52YXNTbmFwc2hvdCIsIkNhbWVyYUV2ZW50cyIsIkdldEJsZW5kTW9kZXMiLCJkcmF3Q291bnQiLCJnYW1lQ2FudmFzIiwiY29udGV4dE9wdGlvbnMiLCJzbmFwc2hvdFN0YXRlIiwiZ2V0UGl4ZWwiLCJlbmNvZGVyIiwicmVzZXRUcmFuc2Zvcm0iLCJwYXJlbnRUcmFuc2Zvcm1NYXRyaXgiLCJmcmFtZVgiLCJmcmFtZVkiLCJmcmFtZVdpZHRoIiwiZnJhbWVIZWlnaHQiLCJtb2RlcyIsInVzZU5ldyIsInNvIiwiZ2FtZU9iamVjdE1hdHJpeCIsIlNuYXBzaG90IiwiV2ViR0wiLCJjb3B5Q2FudmFzIiwiaW1hZ2UxIiwidG9EYXRhVVJMIiwiaW1hZ2UyIiwic291cmNlQ2FudmFzIiwiaXNGcmFtZWJ1ZmZlciIsImJ1ZmZlcldpZHRoIiwiZHJhd2luZ0J1ZmZlcldpZHRoIiwiYnVmZmVySGVpZ2h0IiwiZHJhd2luZ0J1ZmZlckhlaWdodCIsInBpeGVsIiwiZGVzdFkiLCJyZWFkUGl4ZWxzIiwiZGVzdEluZGV4IiwiZ2V0Q29tcG9uZW50Q291bnQiLCJnbENvbnRleHQiLCJXZWJHTFBpcGVsaW5lIiwidmVydFNoYWRlciIsImZyYWdTaGFkZXIiLCJ0b3BvbG9neSIsImZsdXNoTG9ja2VkIiwiYWRkQXR0cmlidXRlIiwiZ2xGb3JtYXRzIiwic2hvdWxkRmx1c2giLCJzZXRWZXJ0ZXhCdWZmZXIiLCJkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkiLCJvbkJpbmQiLCJvblByZVJlbmRlciIsIm9uUmVuZGVyIiwib25Qb3N0UmVuZGVyIiwic2V0RmxvYXQxIiwic2V0RmxvYXQzIiwic2V0RmxvYXQ0Iiwic2V0RmxvYXQxdiIsInNldEZsb2F0MnYiLCJzZXRGbG9hdDN2Iiwic2V0RmxvYXQ0diIsInNldEludDEiLCJzZXRJbnQyIiwic2V0SW50MyIsInNldEludDQiLCJzZXRNYXRyaXgyIiwic2V0TWF0cml4MyIsIklzU2l6ZVBvd2VyT2ZUd28iLCJTcGxpY2VPbmUiLCJXZWJHTFNuYXBzaG90IiwiRm9yd2FyZERpZmZ1c2VMaWdodFBpcGVsaW5lIiwiVGV4dHVyZVRpbnRQaXBlbGluZSIsIlRleHR1cmVUaW50U3RyaXBQaXBlbGluZSIsImNvbnRleHRDcmVhdGlvbkNvbmZpZyIsInN0ZW5jaWwiLCJjb250ZXh0Q3JlYXRpb24iLCJtYXhUZXh0dXJlcyIsIm1heFRleHR1cmVTaXplIiwibmF0aXZlVGV4dHVyZXMiLCJjb250ZXh0TG9zdCIsImN1cnJlbnRBY3RpdmVUZXh0dXJlVW5pdCIsImN1cnJlbnRUZXh0dXJlcyIsImN1cnJlbnRGcmFtZWJ1ZmZlciIsImN1cnJlbnRQcm9ncmFtIiwiY3VycmVudFZlcnRleEJ1ZmZlciIsImN1cnJlbnRJbmRleEJ1ZmZlciIsImN1cnJlbnRTY2lzc29yRW5hYmxlZCIsImN1cnJlbnRTY2lzc29yIiwic2Npc3NvclN0YWNrIiwiY29udGV4dExvc3RIYW5kbGVyIiwiY29udGV4dFJlc3RvcmVkSGFuZGxlciIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJleHRlbnNpb25zIiwiY29tcHJlc3Npb24iLCJFVEMxIiwiUFZSVEMiLCJTM1RDIiwiZGVmYXVsdENhbWVyYSIsImlzQ29udGV4dExvc3QiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiZXF1YXRpb24iLCJGVU5DX0FERCIsIkRTVF9BTFBIQSIsIkRTVF9DT0xPUiIsIk9ORV9NSU5VU19TUkNfQ09MT1IiLCJGVU5DX1JFVkVSU0VfU1VCVFJBQ1QiLCJCWVRFIiwiU0hPUlQiLCJVTlNJR05FRF9TSE9SVCIsIm1hdDIiLCJ1bmlmb3JtTWF0cml4MmZ2IiwibWF0MyIsInVuaWZvcm1NYXRyaXgzZnYiLCJ1bmlmb3JtMWYiLCJ1bmlmb3JtMWZ2IiwidW5pZm9ybTFpdiIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtMmkiLCJ1bmlmb3JtMml2IiwidW5pZm9ybTNmIiwidW5pZm9ybTNmdiIsInVuaWZvcm0zaSIsInVuaWZvcm0zaXYiLCJ1bmlmb3JtNGYiLCJ1bmlmb3JtNGZ2IiwidW5pZm9ybTRpIiwidW5pZm9ybTRpdiIsImV4dHMiLCJnZXRTdXBwb3J0ZWRFeHRlbnNpb25zIiwiZ2V0UGFyYW1ldGVyIiwiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiZXh0U3RyaW5nIiwid2tFeHRTdHJpbmciLCJnZXRFeHRlbnNpb24iLCJERVBUSF9URVNUIiwiQ1VMTF9GQUNFIiwiQkxFTkQiLCJhZGRQaXBlbGluZSIsImJsYW5rIiwiYmluZEZyYW1lYnVmZmVyIiwiRlJBTUVCVUZGRVIiLCJTQ0lTU09SX1RFU1QiLCJoYXNFeHRlbnNpb24iLCJleHRlbnNpb25OYW1lIiwicmVtb3ZlUGlwZWxpbmUiLCJwaXBlbGluZUluc3RhbmNlIiwic2V0U2Npc3NvciIsImhhc0FjdGl2ZVN0ZW5jaWxNYXNrIiwiY2FtTWFzayIsIkRFUFRIX0JVRkZFUl9CSVQiLCJibGVuZE1vZGVJZCIsImJsZW5kRXF1YXRpb24iLCJibGVuZEZ1bmNTZXBhcmF0ZSIsImJsZW5kRnVuYyIsImFkZEJsZW5kTW9kZSIsInVwZGF0ZUJsZW5kTW9kZSIsInJlbW92ZUJsZW5kTW9kZSIsInRleHR1cmVVbml0IiwidXBkYXRlU2Npc3NvciIsInNldEluZGV4QnVmZmVyIiwiaW5kZXhCdWZmZXIiLCJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsIm1pcExldmVsIiwicG1hIiwiZm9yY2VTaXplIiwiY3JlYXRlVGV4dHVyZSIsIlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCIsImdlbmVyYXRlTWlwbWFwIiwiaXNBbHBoYVByZW11bHRpcGxpZWQiLCJhZGREZXB0aFN0ZW5jaWxCdWZmZXIiLCJkZXB0aFN0ZW5jaWxCdWZmZXIiLCJjcmVhdGVSZW5kZXJidWZmZXIiLCJiaW5kUmVuZGVyYnVmZmVyIiwiUkVOREVSQlVGRkVSIiwicmVuZGVyYnVmZmVyU3RvcmFnZSIsIkRFUFRIX1NURU5DSUwiLCJmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciIsIkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCIsImZyYW1lYnVmZmVyVGV4dHVyZTJEIiwiQ09MT1JfQVRUQUNITUVOVDAiLCJjaGVja0ZyYW1lYnVmZmVyU3RhdHVzIiwiRlJBTUVCVUZGRVJfQ09NUExFVEUiLCIzNjA1NCIsIjM2MDU1IiwiMzYwNTciLCIzNjA2MSIsInZlcnRleFNoYWRlciIsImZyYWdtZW50U2hhZGVyIiwidnMiLCJjcmVhdGVTaGFkZXIiLCJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImF0dGFjaFNoYWRlciIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkxJTktfU1RBVFVTIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJpbml0aWFsRGF0YU9yU2l6ZSIsImJ1ZmZlclVzYWdlIiwiY3JlYXRlQnVmZmVyIiwiYnVmZmVyRGF0YSIsImNyZWF0ZUluZGV4QnVmZmVyIiwicHJlUmVuZGVyQ2FtZXJhIiwiZ2V0Q3VycmVudFN0ZW5jaWxNYXNrIiwiY2FtZXJhTWFzayIsInBvc3RSZW5kZXJDYW1lcmEiLCJzcmNDYW52YXMiLCJkc3RUZXh0dXJlIiwibm9SZXBlYXQiLCJ1cGRhdGVDYW52YXNUZXh0dXJlIiwiY3JlYXRlQ2FudmFzVGV4dHVyZSIsIndyYXBwaW5nIiwiY3JlYXRlVmlkZW9UZXh0dXJlIiwic3JjVmlkZW8iLCJ1cGRhdGVWaWRlb1RleHR1cmUiLCJzZXRUZXh0dXJlRmlsdGVyIiwiZ2xGaWx0ZXIiLCJnZXRNYXhUZXh0dXJlcyIsImdldE1heFRleHR1cmVTaXplIiwiUGlwZWxpbmVzIiwiU2hhZGVyU291cmNlRlMiLCJTaGFkZXJTb3VyY2VWUyIsIm1heFF1YWRzIiwicmVzb2x1dGlvbkRpcnR5IiwiVEVYVFVSRTEiLCJMSUdIVF9DT1VOVCIsImRlZmF1bHROb3JtYWxNYXAiLCJpbnZlcnNlUm90YXRpb25NYXRyaXgiLCJtdnBVcGRhdGUiLCJzZXROb3JtYWxNYXAiLCJsaWdodE1hbmFnZXIiLCJsaWdodENvdW50IiwibGlnaHROYW1lIiwiY3VycmVudE5vcm1hbE1hcFJvdGF0aW9uIiwic3JjWCIsInNyY1kiLCJ1T2Zmc2V0Iiwidk9mZnNldCIsIm5vcm1hbFRleHR1cmUiLCJkYXRhU291cmNlIiwidGlsZXNldCIsInNldE5vcm1hbE1hcFJvdGF0aW9uIiwiYmF0Y2hlcyIsIk1vZGVsVmlld1Byb2plY3Rpb24iLCJyZW5kZXJlckNvbmZpZyIsInRlbXBUcmlhbmdsZSIsImZpcnN0UXVhZCIsInByZXZRdWFkIiwicG9seWdvbkNhY2hlIiwibXZwSW5pdCIsInJlcXVpcmVUZXh0dXJlQmF0Y2giLCJwdXNoQmF0Y2giLCJiYXRjaExlbmd0aCIsImJhdGNoTmV4dCIsIm5UZXh0dXJlIiwiYmF0Y2hDb3VudCIsImJhdGNoVmVydGV4Q291bnQiLCJiYXRjaCIsImhhc0ZsdXNoZWQiLCJza2lwRmxpcCIsInBvbHlnb25JbmRleEFycmF5IiwicG9pbnQwIiwiYUxpbmVXaWR0aCIsImJMaW5lV2lkdGgiLCJhbDAiLCJhbDEiLCJibDAiLCJibDEiLCJseDAiLCJseTAiLCJseDMiLCJseTMiLCJiclgiLCJiclkiLCJibFgiLCJibFkiLCJ0clgiLCJ0clkiLCJ0bFgiLCJ0bFkiLCJUUklBTkdMRV9TVFJJUCIsIm1vZGVsTWF0cml4RGlydHkiLCJ2aWV3TWF0cml4RGlydHkiLCJwcm9qZWN0aW9uTWF0cml4RGlydHkiLCJtb2RlbE1hdHJpeCIsIm1vZGVsSWRlbnRpdHkiLCJtb2RlbFNjYWxlIiwibW9kZWxUcmFuc2xhdGUiLCJtb2RlbFJvdGF0ZVgiLCJtb2RlbFJvdGF0ZVkiLCJtb2RlbFJvdGF0ZVoiLCJ2aWV3SWRlbnRpdHkiLCJ2aWV3U2NhbGUiLCJ2aWV3VHJhbnNsYXRlIiwidmlld1JvdGF0ZVgiLCJ2aWV3Um90YXRlWSIsInZpZXdSb3RhdGVaIiwidmlld0xvYWQyRCIsInZpZXdMb2FkIiwicHJvaklkZW50aXR5IiwibmVhckZhciIsInByb2pQZXJzcCIsImZvdlkiLCJhc3BlY3RSYXRpbyIsImZvdiIsIkdldElubmVySGVpZ2h0IiwiY2FudmFzQm91bmRzIiwicGFyZW50SXNXaW5kb3ciLCJwYXJlbnRTaXplIiwiU0NBTEVfTU9ERSIsIl9yZXNldFpvb20iLCJkaXNwbGF5U2NhbGUiLCJOT19DRU5URVIiLCJfY3JlYXRlZEZ1bGxzY3JlZW5UYXJnZXQiLCJfbGFzdENoZWNrIiwiX2NoZWNrT3JpZW50YXRpb24iLCJvcmllbnRhdGlvbkNoYW5nZSIsIndpbmRvd1Jlc2l6ZSIsImZ1bGxTY3JlZW5DaGFuZ2UiLCJmdWxsU2NyZWVuRXJyb3IiLCJwYXJzZUNvbmZpZyIsInNldEFzcGVjdE1vZGUiLCJnZXRQYXJlbnRCb3VuZHMiLCJzZXRQYXJlbnQiLCJnZXRQYXJlbnQiLCJwYXJlbnRXaWR0aCIsInBhcmVudFNjYWxlWCIsInBhcmVudEhlaWdodCIsInBhcmVudFNjYWxlWSIsIlpPT00iLCJNQVhfWk9PTSIsImdldE1heFpvb20iLCJzZXRNaW4iLCJzZXRNYXgiLCJET01SZWN0IiwibmV3V2lkdGgiLCJuZXdIZWlnaHQiLCJsb2NrT3JpZW50YXRpb24iLCJtb3pMb2NrT3JpZW50YXRpb24iLCJtc0xvY2tPcmllbnRhdGlvbiIsInNldFBhcmVudFNpemUiLCJzZXRHYW1lU2l6ZSIsInNldEFzcGVjdFJhdGlvIiwic3R5bGVXaWR0aCIsInN0eWxlSGVpZ2h0Iiwic2V0TWF4Wm9vbSIsInVwZGF0ZVNjYWxlIiwidXBkYXRlT3JpZW50YXRpb24iLCJzZXRDU1MiLCJkb21TdHlsZSIsIm1hcmdpblRvcCIsIm5ld09yaWVudGF0aW9uIiwiT1JJRU5UQVRJT05fQ0hBTkdFIiwiem9vbUgiLCJ6b29tViIsIkNFTlRFUl9IT1JJWk9OVEFMTFkiLCJDRU5URVJfVkVSVElDQUxMWSIsImNsaWVudFJlY3QiLCJjbGllbnRMZWZ0IiwiY2xpZW50VG9wIiwic3RhcnRGdWxsc2NyZWVuIiwiZnVsbHNjcmVlbk9wdGlvbnMiLCJuYXZpZ2F0aW9uVUkiLCJmc1Byb21pc2UiLCJmc1RhcmdldCIsImdldEZ1bGxzY3JlZW5UYXJnZXQiLCJBTExPV19LRVlCT0FSRF9JTlBVVCIsImZ1bGxzY3JlZW5TdWNjZXNzSGFuZGxlciIsImZ1bGxzY3JlZW5FcnJvckhhbmRsZXIiLCJGVUxMU0NSRUVOX1VOU1VQUE9SVEVEIiwiRU5URVJfRlVMTFNDUkVFTiIsInJlbW92ZUZ1bGxzY3JlZW5UYXJnZXQiLCJGVUxMU0NSRUVOX0ZBSUxFRCIsInN0b3BGdWxsc2NyZWVuIiwiTEVBVkVfRlVMTFNDUkVFTiIsInRvZ2dsZUZ1bGxzY3JlZW4iLCJvbkZ1bGxTY3JlZW5DaGFuZ2UiLCJvbkZ1bGxTY3JlZW5FcnJvciIsImlzRnVsbHNjcmVlbiIsImlzUG9ydHJhaXQiLCJpc0xhbmRzY2FwZSIsImlzR2FtZVBvcnRyYWl0IiwiaXNHYW1lTGFuZHNjYXBlIiwiQ0VOVEVSX0JPVEgiLCJXSURUSF9DT05UUk9MU19IRUlHSFQiLCJIRUlHSFRfQ09OVFJPTFNfV0lEVEgiLCJGSVQiLCJFTlZFTE9QIiwiTk9fWk9PTSIsIlpPT01fMlgiLCJaT09NXzRYIiwiT3JpZW50YXRpb24iLCJVcHBlcmNhc2VGaXJzdCIsImRlZmF1bHRTeXN0ZW0iLCJzY2VuZVN5c3RlbXMiLCJJbmplY3Rpb25NYXAiLCJtYWtlIiwic2NlbmVQbHVnaW4iLCJhcmNhZGVQaHlzaWNzIiwiaW1wYWN0UGh5c2ljcyIsIm1hdHRlclBoeXNpY3MiLCJTeXN0ZW1zIiwiX3N0YXJ0IiwiX3F1ZXVlIiwiaXNQcm9jZXNzaW5nIiwiYm9vdFF1ZXVlIiwibmV3U2NlbmUiLCJjcmVhdGVTY2VuZUZyb21JbnN0YW5jZSIsImNyZWF0ZVNjZW5lRnJvbU9iamVjdCIsImNyZWF0ZVNjZW5lRnJvbUZ1bmN0aW9uIiwicHJvY2Vzc1F1ZXVlIiwicGVuZGluZ0xlbmd0aCIsInF1ZXVlTGVuZ3RoIiwia2V5QSIsImtleUIiLCJnZXRLZXkiLCJzY2VuZVRvUmVtb3ZlIiwiZ2V0U2NlbmUiLCJpc1RyYW5zaXRpb25pbmciLCJib290U2NlbmUiLCJJTklUIiwiaXNUcmFuc2l0aW9uIiwiVFJBTlNJVElPTl9JTklUIiwidHJhbnNpdGlvbkZyb20iLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJMT0FESU5HIiwib25CbHVyUGF1c2VkU291bmRzIiwidW5sb2NrIiwicGF5bG9hZENvbXBsZXRlIiwiUlVOTklORyIsIlNMRUVQSU5HIiwiQ1JFQVRJTkciLCJERVNUUk9ZRUQiLCJDUkVBVEUiLCJzY2VuZUNhbGxiYWNrIiwiaW5SZXZlcnNlIiwicXVldWVPcCIsInN3aXRjaCIsInNjZW5lQSIsInNjZW5lQiIsIm1vdmVBYm92ZSIsInRlbXBTY2VuZSIsIm1vdmVCZWxvdyIsInN3YXBQb3NpdGlvbiIsImR1bXAiLCJQQVVTRUQiLCJ0cmFuc2l0aW9uUHJvZ3Jlc3MiLCJfZHVyYXRpb24iLCJfd2lsbFNsZWVwIiwiX3dpbGxSZW1vdmUiLCJ0cmFuc2l0aW9uIiwiY2hlY2tWYWxpZFRyYW5zaXRpb24iLCJhbGxvd0lucHV0IiwidGFyZ2V0U2V0dGluZ3MiLCJ0YXJnZXRTeXMiLCJsYXVuY2giLCJTZXR0aW5ncyIsIkdldFBoeXNpY3NQbHVnaW5zIiwiR2V0U2NlbmVQbHVnaW5zIiwiaW5zdGFsbExvY2FsIiwiUkVOREVSIiwiVFJBTlNJVElPTl9XQUtFIiwiaXNUcmFuc2l0aW9uT3V0IiwiaXNUcmFuc2l0aW9uSW4iLCJCYXNlU291bmQiLCJ0b3RhbFJhdGUiLCJ0b3RhbER1cmF0aW9uIiwiY3VycmVudENvbmZpZyIsImN1cnJlbnRNYXJrZXIiLCJwZW5kaW5nUmVtb3ZlIiwidXBkYXRlTWFya2VyIiwibWFya2VyTmFtZSIsInJlc2V0Q29uZmlnIiwiYXBwbHlDb25maWciLCJjYWxjdWxhdGVSYXRlIiwidG90YWxEZXR1bmUiLCJkZXR1bmVSYXRlIiwiQmFzZVNvdW5kTWFuYWdlciIsImpzb25DYWNoZSIsInNvdW5kcyIsInBhdXNlT25CbHVyIiwiX3JhdGUiLCJfZGV0dW5lIiwidW5sb2NrZWQiLCJvbkdhbWVCbHVyIiwib25HYW1lRm9jdXMiLCJhZGRBdWRpb1Nwcml0ZSIsInNwcml0ZW1hcCIsIm1hcmtlckNvbmZpZyIsInBsYXlBdWRpb1Nwcml0ZSIsInNwcml0ZU5hbWUiLCJyZW1vdmVCeUtleSIsImZvckVhY2hBY3RpdmVTb3VuZCIsInN0b3BBbGwiLCJTVE9QX0FMTCIsInN0b3BCeUtleSIsIlVOTE9DS0VEIiwic2V0UmF0ZSIsIkdMT0JBTF9SQVRFIiwic2V0RGV0dW5lIiwiR0xPQkFMX0RFVFVORSIsIkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIiLCJOb0F1ZGlvU291bmRNYW5hZ2VyIiwiV2ViQXVkaW9Tb3VuZE1hbmFnZXIiLCJERUNPREVEIiwiREVDT0RFRF9BTEwiLCJERVRVTkUiLCJHTE9CQUxfVk9MVU1FIiwiTE9PUCIsIkxPT1BFRCIsIk1VVEUiLCJQTEFZIiwiUkFURSIsIlNFRUsiLCJTVE9QIiwiVk9MVU1FIiwiSFRNTDVBdWRpb1NvdW5kIiwidGFncyIsInByZXZpb3VzVGltZSIsInBpY2tBbmRQbGF5QXVkaW9UYWciLCJzdG9wQW5kUmVsZWFzZUF1ZGlvVGFnIiwicGlja0F1ZGlvVGFnIiwicGxheUNhdGNoUHJvbWlzZSIsIm92ZXJyaWRlIiwib3RoZXJTb3VuZHMiLCJzZWxlY3RlZFNvdW5kIiwiYXVkaW9QbGF5RGVsYXkiLCJlbmRUaW1lIiwibG9vcEVuZE9mZnNldCIsInVwZGF0ZU11dGUiLCJ1cGRhdGVWb2x1bWUiLCJzZXRTZWVrIiwibG9ja2VkQWN0aW9uc1F1ZXVlIiwiX211dGUiLCJfdm9sdW1lIiwibW92ZWQiLCJkZXRlY3RNb3ZlIiwibG9ja2VkVGFncyIsImxhc3RUYWciLCJsb2NrZWRBY3Rpb24iLCJXZWJBdWRpb1NvdW5kIiwiTm9BdWRpb1NvdW5kIiwibG9vcFNvdXJjZSIsIm11dGVOb2RlIiwidm9sdW1lTm9kZSIsInBsYXlUaW1lIiwibG9vcFRpbWUiLCJyYXRlVXBkYXRlcyIsImhhc0VuZGVkIiwiaGFzTG9vcGVkIiwiY29ubmVjdCIsInN0b3BBbmRSZW1vdmVCdWZmZXJTb3VyY2UiLCJjcmVhdGVBbmRTdGFydEJ1ZmZlclNvdXJjZSIsImNyZWF0ZUFuZFN0YXJ0TG9vcEJ1ZmZlclNvdXJjZSIsImdldExvb3BUaW1lIiwic2V0VmFsdWVBdFRpbWUiLCJvbmVuZGVkIiwiZXYiLCJkaXNjb25uZWN0Iiwic3RvcEFuZFJlbW92ZUxvb3BCdWZmZXJTb3VyY2UiLCJsYXN0UmF0ZVVwZGF0ZUN1cnJlbnRUaW1lIiwibGFzdFJhdGVVcGRhdGUiLCJCYXNlNjRUb0FycmF5QnVmZmVyIiwiY3JlYXRlQXVkaW9Db250ZXh0IiwibWFzdGVyTXV0ZU5vZGUiLCJtYXN0ZXJWb2x1bWVOb2RlIiwic2V0QXVkaW9Db250ZXh0IiwiZGVjb2RlQXVkaW8iLCJhdWRpb0tleSIsImF1ZGlvRmlsZXMiLCJzdXNwZW5kIiwiYWRkQ2FsbGJhY2siLCJza2lwQ2FsbGJhY2siLCJnZXRBcnJheSIsImdyb3VwRW5kIiwiZ2V0QWN0aXZlIiwicXVpY2tzZWxlY3QiLCJyYnVzaCIsIl9tYXhFbnRyaWVzIiwiX21pbkVudHJpZXMiLCJmaW5kSXRlbSIsImVxdWFsc0ZuIiwiY2FsY0JCb3giLCJ0b0JCb3giLCJkaXN0QkJveCIsImRlc3ROb2RlIiwiY3JlYXRlTm9kZSIsImxlYWYiLCJjb21wYXJlTm9kZU1pblgiLCJjb21wYXJlTm9kZU1pblkiLCJiYm94QXJlYSIsImJib3hNYXJnaW4iLCJtdWx0aVNlbGVjdCIsIm1pZCIsImJib3giLCJjaGlsZEJCb3giLCJub2Rlc1RvU2VhcmNoIiwiX2J1aWxkIiwiX3NwbGl0Um9vdCIsInRtcE5vZGUiLCJfaW5zZXJ0IiwiZ29pbmdVcCIsIl9jb25kZW5zZSIsImNvbXBhcmVNaW5YIiwiY29tcGFyZU1pblkiLCJyaWdodDIiLCJyaWdodDMiLCJOMiIsIk4xIiwiX2Nob29zZVN1YnRyZWUiLCJ0YXJnZXROb2RlIiwiZW5sYXJnZW1lbnQiLCJtaW5BcmVhIiwibWluRW5sYXJnZW1lbnQiLCJpbnNlcnRQYXRoIiwiX3NwbGl0IiwiX2FkanVzdFBhcmVudEJCb3hlcyIsIl9jaG9vc2VTcGxpdEF4aXMiLCJzcGxpdEluZGV4IiwiX2Nob29zZVNwbGl0SW5kZXgiLCJuZXdOb2RlIiwiYmJveDEiLCJiYm94MiIsIl9hbGxEaXN0TWFyZ2luIiwibGVmdEJCb3giLCJyaWdodEJCb3giLCJjYWxsYmFja0tleSIsImludGVyc2VjdCIsImFzcGVjdE1vZGUiLCJfcGFyZW50Iiwic25hcFRvIiwic2V0U25hcCIsInNuYXBXaWR0aCIsInNuYXBIZWlnaHQiLCJnZXROZXdXaWR0aCIsImdldE5ld0hlaWdodCIsImNvbnN0cmFpbiIsImNoZWNrUGFyZW50IiwiZml0IiwibmV3UmF0aW8iLCJmaXRUbyIsImVudmVsb3AiLCJQUk9DRVNTX1FVRVVFX0FERCIsIlBST0NFU1NfUVVFVUVfUkVNT1ZFIiwiQ2FudmFzVGV4dHVyZSIsIl9zb3VyY2UiLCJzZXRQaXhlbCIsInB1dERhdGEiLCJkaXJ0eVgiLCJkaXJ0eVkiLCJkaXJ0eVdpZHRoIiwiZGlydHlIZWlnaHQiLCJnZXRQaXhlbHMiLCJnZXRDYW52YXMiLCJpc1Bvd2VyT2YyIiwicm90YXRlZCIsImN1c3RvbURhdGEiLCJjdXQiLCJzb3VyY2VTaXplIiwic3ByaXRlU291cmNlU2l6ZSIsInNldFRyaW0iLCJhY3R1YWxXaWR0aCIsImFjdHVhbEhlaWdodCIsImRlc3RYIiwicnciLCJyaCIsImNyb3BSaWdodCIsImNyb3BCb3R0b20iLCJpaCIsInVwZGF0ZVVWc0ludmVydGVkIiwiVGV4dHVyZVNvdXJjZSIsIlRFWFRVUkVfTUlTU0lOR19FUlJPUiIsImdldFRleHR1cmVTb3VyY2VJbmRleCIsImluY2x1ZGVCYXNlIiwiZnJhbWVOYW1lIiwiZ2V0RGF0YVNvdXJjZUltYWdlIiwic2V0RGF0YVNvdXJjZSIsInNldEZpbHRlciIsImZpbHRlck1vZGUiLCJQYXJzZXIiLCJfdGVtcENhbnZhcyIsIl90ZW1wQ29udGV4dCIsIkxPQUQiLCJ1cGRhdGVQZW5kaW5nIiwiRVJST1IiLCJhZGRCYXNlNjQiLCJjaGVja0tleSIsImFkZFJlbmRlclRleHR1cmUiLCJnZW5lcmF0ZSIsInNraXBDYWNoZSIsImFkZEF0bGFzSlNPTkhhc2giLCJzaW5nbGVBdGxhc0ZpbGUiLCJhdGxhc0RhdGEiLCJKU09OQXJyYXkiLCJKU09OSGFzaCIsIkF0bGFzWE1MIiwiVW5pdHlZQU1MIiwiU3ByaXRlU2hlZXQiLCJhZGRTcHJpdGVTaGVldEZyb21BdGxhcyIsImF0bGFzS2V5IiwiYXRsYXNGcmFtZSIsInNoZWV0IiwiU3ByaXRlU2hlZXRGcm9tQXRsYXMiLCJjbG9uZUZyYW1lIiwiZ2V0VGV4dHVyZUtleXMiLCJjb21wcmVzc2lvbkFsZ29yaXRobSIsIm5hdHVyYWxXaWR0aCIsIm5hdHVyYWxIZWlnaHQiLCJpc1ZpZGVvIiwiSFRNTFZpZGVvRWxlbWVudCIsIldlYkdMVGV4dHVyZSIsIkZpbHRlck1vZGUiLCJQYXJzZXJzIiwicGl2b3QiLCJzaGVldEZyYW1lIiwic2hlZXRXaWR0aCIsInNoZWV0SGVpZ2h0IiwibGVmdFBhZCIsImxlZnRXaWR0aCIsInJpZ2h0V2lkdGgiLCJ0b3BQYWQiLCJ0b3BIZWlnaHQiLCJib3R0b21IZWlnaHQiLCJmcmFtZUluZGV4Iiwic2hlZXRZIiwidG9wUm93IiwiYm90dG9tUm93Iiwic2hlZXRYIiwibGVmdFJvdyIsInJpZ2h0Um93IiwidHJpbVdpZHRoIiwidHJpbUhlaWdodCIsImltYWdlSGVpZ2h0IiwieWFtbCIsImxpbmVSZWdFeHAiLCJwcmV2U3ByaXRlIiwiY3VycmVudFNwcml0ZSIsImlzTGlzdCIsIkFSUkFZXzJEIiwiSW1hZ2VDb2xsZWN0aW9uIiwiZmlyc3RnaWQiLCJpbWFnZVdpZHRoIiwiaW1hZ2VNYXJnaW4iLCJpbWFnZVNwYWNpbmciLCJjb250YWluc0ltYWdlSW5kZXgiLCJpbWFnZUluZGV4IiwiZ2lkIiwiRm9ybWF0cyIsIk1hcERhdGEiLCJUaWxlbWFwIiwiaW5zZXJ0TnVsbCIsInRpbGVtYXBEYXRhIiwiVGlsZSIsImJhc2VXaWR0aCIsInBpeGVsWCIsInBpeGVsWSIsInVwZGF0ZVBpeGVsWFkiLCJnZXRUaWxlQ29sbGlzaW9uR3JvdXAiLCJnZXRUaWxlRGF0YSIsImdldFJpZ2h0IiwiZ2V0Qm90dG9tIiwiZ2V0Q2VudGVyWCIsImdldENlbnRlclkiLCJpc0ludGVyZXN0aW5nIiwiZmFjZXMiLCJoYXNJbnRlcmVzdGluZ0ZhY2UiLCJyZXNldENvbGxpc2lvbiIsInJlY2FsY3VsYXRlRmFjZXMiLCJjYWxjdWxhdGVGYWNlc0F0IiwicmVzZXRGYWNlcyIsInNldENvbGxpc2lvbiIsInNldENvbGxpc2lvbkNhbGxiYWNrIiwiZ2lkTWFwIiwiRHluYW1pY1RpbGVtYXBMYXllciIsIkxheWVyRGF0YSIsIlN0YXRpY1RpbGVtYXBMYXllciIsIlRpbGVtYXBDb21wb25lbnRzIiwiVGlsZXNldCIsInJlbmRlck9yZGVyIiwid2lkdGhJblBpeGVscyIsImhlaWdodEluUGl4ZWxzIiwiaW1hZ2VDb2xsZWN0aW9ucyIsImxheWVycyIsInRpbGVzZXRzIiwiY3VycmVudExheWVySW5kZXgiLCJzZXRSZW5kZXJPcmRlciIsIm9yZGVycyIsImFkZFRpbGVzZXRJbWFnZSIsInRpbGVzZXROYW1lIiwidGlsZU1hcmdpbiIsInRpbGVTcGFjaW5nIiwiZ2V0VGlsZXNldEluZGV4Iiwic2V0VGlsZVNpemUiLCJzZXRTcGFjaW5nIiwic2V0SW1hZ2UiLCJjb252ZXJ0TGF5ZXJUb1N0YXRpYyIsImdldExheWVyIiwiZHluYW1pY0xheWVyIiwic3RhdGljTGF5ZXIiLCJsYXllckluZGV4Iiwic3JjVGlsZVgiLCJzcmNUaWxlWSIsImRlc3RUaWxlWCIsImRlc3RUaWxlWSIsIl9pc1N0YXRpY0NhbGwiLCJDb3B5IiwiY3JlYXRlQmxhbmtEeW5hbWljTGF5ZXIiLCJnZXRMYXllckluZGV4IiwiY3JlYXRlRHluYW1pY0xheWVyIiwibGF5ZXJJRCIsImdldFRpbGVMYXllck5hbWVzIiwiY3JlYXRlRnJvbU9iamVjdHMiLCJzcHJpdGVDb25maWciLCJvYmplY3RMYXllciIsImdldE9iamVjdExheWVyIiwiZ2V0T2JqZWN0TGF5ZXJOYW1lcyIsImZsaXBwZWRIb3Jpem9udGFsIiwiZmxpcHBlZFZlcnRpY2FsIiwiY3JlYXRlRnJvbVRpbGVzIiwicmVwbGFjZW1lbnRzIiwiQ3JlYXRlRnJvbVRpbGVzIiwiY3JlYXRlU3RhdGljTGF5ZXIiLCJyZW1vdmVBbGxMYXllcnMiLCJGaWxsIiwiZmlsdGVyT2JqZWN0cyIsImZpbHRlclRpbGVzIiwiZmlsdGVyaW5nT3B0aW9ucyIsIkZpbHRlclRpbGVzIiwiZmluZEJ5SW5kZXgiLCJGaW5kQnlJbmRleCIsImZpbmRPYmplY3QiLCJmaW5kVGlsZSIsIkZpbmRUaWxlIiwiZm9yRWFjaFRpbGUiLCJGb3JFYWNoVGlsZSIsImdldEltYWdlSW5kZXgiLCJnZXRJbWFnZUxheWVyTmFtZXMiLCJnZXRMYXllckluZGV4QnlOYW1lIiwiZ2V0VGlsZUF0Iiwibm9uTnVsbCIsIkdldFRpbGVBdCIsImdldFRpbGVBdFdvcmxkWFkiLCJHZXRUaWxlQXRXb3JsZFhZIiwiR2V0VGlsZXNXaXRoaW4iLCJnZXRUaWxlc1dpdGhpblNoYXBlIiwiR2V0VGlsZXNXaXRoaW5TaGFwZSIsIkdldFRpbGVzV2l0aGluV29ybGRYWSIsImdldFRpbGVzZXQiLCJoYXNUaWxlQXQiLCJIYXNUaWxlQXQiLCJoYXNUaWxlQXRXb3JsZFhZIiwiSGFzVGlsZUF0V29ybGRYWSIsInNldExheWVyIiwicHV0VGlsZUF0IiwiUHV0VGlsZUF0IiwicHV0VGlsZUF0V29ybGRYWSIsIlB1dFRpbGVBdFdvcmxkWFkiLCJwdXRUaWxlc0F0IiwidGlsZXNBcnJheSIsIlB1dFRpbGVzQXQiLCJyYW5kb21pemUiLCJSYW5kb21pemUiLCJDYWxjdWxhdGVGYWNlc0F0IiwiY2FsY3VsYXRlRmFjZXNXaXRoaW4iLCJDYWxjdWxhdGVGYWNlc1dpdGhpbiIsInJlbW92ZUxheWVyIiwiZGVzdHJveUxheWVyIiwicmVtb3ZlVGlsZSIsInJlcGxhY2VJbmRleCIsInJlbW92ZVRpbGVBdCIsInJlcGxhY2VXaXRoTnVsbCIsIlJlbW92ZVRpbGVBdCIsInJlbW92ZVRpbGVBdFdvcmxkWFkiLCJSZW1vdmVUaWxlQXRXb3JsZFhZIiwicmVuZGVyRGVidWciLCJzdHlsZUNvbmZpZyIsIlJlbmRlckRlYnVnIiwicmVuZGVyRGVidWdGdWxsIiwicmVwbGFjZUJ5SW5kZXgiLCJuZXdJbmRleCIsIlJlcGxhY2VCeUluZGV4IiwidXBkYXRlTGF5ZXIiLCJTZXRDb2xsaXNpb24iLCJzZXRDb2xsaXNpb25CZXR3ZWVuIiwiU2V0Q29sbGlzaW9uQmV0d2VlbiIsInNldENvbGxpc2lvbkJ5UHJvcGVydHkiLCJTZXRDb2xsaXNpb25CeVByb3BlcnR5Iiwic2V0Q29sbGlzaW9uQnlFeGNsdXNpb24iLCJTZXRDb2xsaXNpb25CeUV4Y2x1c2lvbiIsInNldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cCIsIlNldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cCIsInNldFRpbGVJbmRleENhbGxiYWNrIiwiU2V0VGlsZUluZGV4Q2FsbGJhY2siLCJzZXRUaWxlTG9jYXRpb25DYWxsYmFjayIsIlNldFRpbGVMb2NhdGlvbkNhbGxiYWNrIiwic2V0QmFzZVRpbGVTaXplIiwibWFwV2lkdGgiLCJtYXBIZWlnaHQiLCJzZXRMYXllclRpbGVTaXplIiwic3dhcEJ5SW5kZXgiLCJTd2FwQnlJbmRleCIsIlRpbGVUb1dvcmxkWCIsIlRpbGVUb1dvcmxkWSIsInRpbGVUb1dvcmxkWFkiLCJUaWxlVG9Xb3JsZFhZIiwid2VpZ2h0ZWRSYW5kb21pemUiLCJ3ZWlnaHRlZEluZGV4ZXMiLCJXZWlnaHRlZFJhbmRvbWl6ZSIsIndvcmxkVG9UaWxlWCIsInNuYXBUb0Zsb29yIiwiV29ybGRUb1RpbGVYIiwid29ybGRUb1RpbGVZIiwiV29ybGRUb1RpbGVZIiwid29ybGRUb1RpbGVYWSIsIldvcmxkVG9UaWxlWFkiLCJmdW5jdGlvbk5hbWUiLCJQYXJzZVRvVGlsZW1hcCIsInRpbGVQcm9wZXJ0aWVzIiwidGlsZURhdGEiLCJ0ZXhDb29yZGluYXRlcyIsImdldFRpbGVQcm9wZXJ0aWVzIiwidGlsZUluZGV4IiwiY29udGFpbnNUaWxlSW5kZXgiLCJvYmplY3Rncm91cCIsImdldFRpbGVUZXh0dXJlQ29vcmRpbmF0ZXMiLCJ1cGRhdGVUaWxlRGF0YSIsInJvd0NvdW50IiwiY29sQ291bnQiLCJhYm92ZSIsImJlbG93IiwidGlsZUNvbGxpZGVzIiwic3JjVGlsZXMiLCJTbmFwQ2VpbCIsIm91dHB1dEFycmF5IiwidGlsZVciLCJ0aWxlSCIsImRyYXdMZWZ0IiwiZHJhd1JpZ2h0IiwiZHJhd1RvcCIsImRyYXdCb3R0b20iLCJza2lwQ3VsbCIsImJvdW5kc0xlZnQiLCJjdWxsUGFkZGluZ1giLCJib3VuZHNSaWdodCIsImJvdW5kc1RvcCIsImN1bGxQYWRkaW5nWSIsImJvdW5kc0JvdHRvbSIsInRpbGVzRHJhd24iLCJ0aWxlc1RvdGFsIiwiU2V0VGlsZUNvbGxpc2lvbiIsImRvZXNJbmRleENvbGxpZGUiLCJjb2xsaWRlSW5kZXhlcyIsIklzSW5MYXllckJvdW5kcyIsImlzTm90RW1wdHkiLCJUcmlhbmdsZVRvUmVjdGFuZ2xlIiwiaW50ZXJzZWN0VGVzdCIsInhTdGFydCIsInlTdGFydCIsInhFbmQiLCJ5RW5kIiwidGlsZVJlY3QiLCJvbGRUaWxlIiwib2xkVGlsZUNvbGxpZGVzIiwibmV3VGlsZSIsImRlZmF1bHRUaWxlQ29sb3IiLCJkZWZhdWx0Q29sbGlkaW5nVGlsZUNvbG9yIiwiZGVmYXVsdEZhY2VDb2xvciIsInRpbGVDb2xvciIsImNvbGxpZGluZ1RpbGVDb2xvciIsImZhY2VDb2xvciIsIlNldExheWVyQ29sbGlzaW9uSW5kZXgiLCJsb2MiLCJTaHVmZmxlQXJyYXkiLCJsYXllcldvcmxkWCIsImxheWVyV29ybGRZIiwid2VpZ2h0VG90YWwiLCJyYW5kIiwiY2hvc2VuIiwiQ3VsbFRpbGVzIiwiRHluYW1pY1RpbGVtYXBMYXllclJlbmRlciIsImN1bGxlZFRpbGVzIiwiY3VsbENhbGxiYWNrIiwiX3JlbmRlck9yZGVyIiwic2V0VGlsZXNldHMiLCJzZXRMaXN0IiwicmVtb3ZlRnJvbVRpbGVtYXAiLCJzZXRTa2lwQ3VsbCIsInNldEN1bGxQYWRkaW5nIiwicGFkZGluZ1giLCJwYWRkaW5nWSIsInJlbmRlclRpbGVzIiwidGlsZUNvdW50IiwibGF5ZXJNYXRyaXgiLCJ0aWxlVGV4Q29vcmRzIiwiY3VycmVudFNldCIsIlRpbGVtYXBDcmVhdG9yIiwiVGlsZW1hcEZhY3RvcnkiLCJPYmplY3RMYXllciIsImluZmluaXRlIiwicHJvcGVydHlUeXBlcyIsIlBhcnNlMkRBcnJheSIsIlBhcnNlQ1NWIiwiUGFyc2VKU09OVGlsZWQiLCJQYXJzZVdlbHRtZWlzdGVyIiwibWFwRm9ybWF0IiwiYXJyYXkyRCIsInRpbGVMYXllcnMiLCJ0aWxlc2l6ZSIsInRpbGVHcmlkIiwidGlsZXNldHNOYW1lcyIsIlBhcnNlVGlsZUxheWVycyIsIlBhcnNlVGlsZXNldHMiLCJJbXBhY3QiLCJUaWxlZCIsInNpZCIsImJpbmFyeVN0cmluZyIsImF0b2IiLCJjb3VudFgiLCJjb3VudFkiLCJncm91cGwiLCJwYXJlbnRzdGF0ZSIsImxheWVyWCIsInRpbGV3aWR0aCIsImxheWVyWSIsInRpbGVoZWlnaHQiLCJGTElQUEVEX0hPUklaT05UQUwiLCJGTElQUEVEX1ZFUlRJQ0FMIiwiRkxJUFBFRF9BTlRJX0RJQUdPTkFMIiwiZmxpcHBlZEFudGlEaWFnb25hbCIsImZsaXBwZWQiLCJDcmVhdGVHcm91cExheWVyIiwiZ3JvdXBTdGFjayIsImN1ckdyb3VwU3RhdGUiLCJjdXJpIiwibGF5ZXJPZmZzZXRYIiwibGF5ZXJPZmZzZXRZIiwibmV4dEdyb3VwU3RhdGUiLCJQYXJzZUltYWdlTGF5ZXJzIiwiUGFyc2VPYmplY3RMYXllcnMiLCJCdWlsZFRpbGVzZXRJbmRleCIsIkFzc2lnblRpbGVQcm9wZXJ0aWVzIiwicmVuZGVyb3JkZXIiLCJzZXRzIiwiUGljayIsIlBhcnNlR0lEIiwiY29weVBvaW50cyIsImNvbW1vbk9iamVjdFByb3BzIiwidGlsZWRPYmplY3QiLCJwYXJzZWRPYmplY3QiLCJnaWRJbmZvIiwiUGFyc2VPYmplY3QiLCJvYmplY3RMYXllcnMiLCJjdXJvIiwiQmFzZTY0RGVjb2RlIiwiaW5maW5pdGVNYXAiLCJjdXJsIiwiZW5jb2RpbmciLCJjaHVua3MiLCJibGFua1RpbGUiLCJjaHVuayIsImxlbjIiLCJuZXdPZmZzZXRYIiwibmV3T2Zmc2V0WSIsInN0cmluZ0lEIiwibGFzdFNldCIsIm5ld1Byb3BEYXRhIiwicHJvcERhdGEiLCJwYXJzZWRPYmplY3RzMiIsInRpbGVwcm9wZXJ0aWVzIiwib2JqZWN0R3JvdXAiLCJwYXJzZWRPYmplY3RzMSIsImltYWdld2lkdGgiLCJpbWFnZWhlaWdodCIsIm5ld0NvbGxlY3Rpb24iLCJsYXN0Z2lkIiwiU3RhdGljVGlsZW1hcExheWVyUmVuZGVyIiwidXBkYXRlVkJPRGF0YSIsInVwbG9hZCIsInRpbGVzZXRJbmRleCIsIm1pblRpbGVJbmRleCIsIm1heFRpbGVJbmRleCIsImJ1ZmZlclNpemUiLCJiYXRjaFRpbGUiLCJTVEFUSUNfRFJBVyIsInRleENvb3JkcyIsImhhbGZUaWxlV2lkdGgiLCJoYWxmVGlsZUhlaWdodCIsInBpcGVsaW5lVmVydGV4QnVmZmVyIiwiVGltZXJFdmVudCIsIkNsb2NrIiwiYWRkRXZlbnQiLCJkZWxheWVkQ2FsbCIsImNsZWFyUGVuZGluZ0V2ZW50cyIsInJlbW92ZUFsbEV2ZW50cyIsImhhc0Rpc3BhdGNoZWQiLCJyZXBlYXRDb3VudCIsImdldE92ZXJhbGxQcm9ncmVzcyIsImdldFJlcGVhdENvdW50IiwiZ2V0RWxhcHNlZCIsImdldEVsYXBzZWRTZWNvbmRzIiwiZGlzcGF0Y2hDYWxsYmFjayIsIlR3ZWVuQnVpbGRlciIsIlRpbWVsaW5lIiwiaXNUaW1lbGluZSIsInRvdGFsRGF0YSIsInVzZUZyYW1lcyIsImxvb3BEZWxheSIsImxvb3BDb3VudGVyIiwiY29tcGxldGVEZWxheSIsImNvdW50ZG93biIsIlBFTkRJTkdfQUREIiwiX3BhdXNlZFN0YXRlIiwidG90YWxFbGFwc2VkIiwidG90YWxQcm9ncmVzcyIsIm9uQ29tcGxldGUiLCJvbkxvb3AiLCJvbllveW8iLCJkaXNwYXRjaFRpbWVsaW5lRXZlbnQiLCJBQ1RJVkUiLCJwYXJlbnRJc1RpbWVsaW5lIiwiaGFzT2Zmc2V0IiwiaXNPZmZzZXRBYnNvbHV0ZSIsImlzT2Zmc2V0UmVsYXRpdmUiLCJnZXRSZWxhdGl2ZU9mZnNldCIsImNhbGNEdXJhdGlvbiIsInByZXZFbmQiLCJvZmZzZXREdXJhdGlvbiIsImNhbGN1bGF0ZWRPZmZzZXQiLCJyZXNldFR3ZWVucyIsInJlc2V0RnJvbUxvb3AiLCJzZXRDYWxsYmFjayIsIlRZUEVTIiwibWFrZUFjdGl2ZSIsIlRJTUVMSU5FX1NUQVJUIiwibmV4dFN0YXRlIiwiTE9PUF9ERUxBWSIsIlRJTUVMSU5FX0xPT1AiLCJDT01QTEVURV9ERUxBWSIsIlBFTkRJTkdfUkVNT1ZFIiwiVElNRUxJTkVfQ09NUExFVEUiLCJzdGlsbFJ1bm5pbmciLCJUSU1FTElORV9VUERBVEUiLCJUSU1FTElORV9QQVVTRSIsIlRJTUVMSU5FX1JFU1VNRSIsImhhc1RhcmdldCIsIk51bWJlclR3ZWVuQnVpbGRlciIsIlN0YWdnZXJCdWlsZGVyIiwiVGltZWxpbmVCdWlsZGVyIiwiVHdlZW5NYW5hZ2VyIiwiX2FkZCIsImNyZWF0ZVRpbWVsaW5lIiwidGltZWxpbmUiLCJSRU1PVkVEIiwiZ2V0QWxsVHdlZW5zIiwiZ2V0R2xvYmFsVGltZVNjYWxlIiwiZ2V0VHdlZW5zT2YiLCJpc1R3ZWVuaW5nIiwia2lsbFR3ZWVuc09mIiwic2V0R2xvYmFsVGltZVNjYWxlIiwiZWFzZUZ1bmN0aW9uIiwiY2xvbmVQYXJhbXMiLCJ2YWx1ZUNhbGxiYWNrIiwidG90YWxUYXJnZXRzIiwiUkVTRVJWRUQiLCJoYXNHZXRBY3RpdmUiLCJoYXNHZXRTdGFydCIsImdldFN0YXJ0IiwiaGFzR2V0RW5kIiwiZ2V0RW5kIiwiR2V0VmFsdWVPcCIsImhhc1RvIiwiaGFzRnJvbSIsImhhc1N0YXJ0Iiwic3RhcnRDYWxsYmFja3MiLCJmcm9tQ2FsbGJhY2tzIiwiRGVmYXVsdHMiLCJHZXROZXdWYWx1ZSIsIlR3ZWVuRGF0YSIsIm9wcyIsInR3ZWVuQXJyYXkiLCJjYWxsYmFja1BhcmFtcyIsImZyb21GaXJzdCIsImZyb21DZW50ZXIiLCJmcm9tTGFzdCIsImZyb21WYWx1ZSIsIm1heFZhbHVlIiwiZnJvbVgiLCJmcm9tWSIsImRpc3RhbmNlWCIsImRpc3RhbmNlWSIsImdyaWRWYWx1ZXMiLCJncmlkTWF4IiwidG9ZIiwidG9YIiwiZ3JpZFNwYWNlIiwiR2V0VGFyZ2V0cyIsIkdldFR3ZWVucyIsInRpbWVsaW5lQXJyYXkiLCJvblN0YXJ0U2NvcGUiLCJvblN0YXJ0UGFyYW1zIiwib25VcGRhdGVTY29wZSIsIm9uVXBkYXRlUGFyYW1zIiwib25Mb29wU2NvcGUiLCJvbkxvb3BQYXJhbXMiLCJvbllveW9TY29wZSIsIm9uWW95b1BhcmFtcyIsIm9uQ29tcGxldGVTY29wZSIsIm9uQ29tcGxldGVQYXJhbXMiLCJHZXRQcm9wcyIsIlRXRUVOX0FDVElWRSIsIlRXRUVOX0NPTVBMRVRFIiwiVFdFRU5fTE9PUCIsIlRXRUVOX1JFUEVBVCIsIlRXRUVOX1NUQVJUIiwiVFdFRU5fVVBEQVRFIiwiVFdFRU5fWU9ZTyIsIkJ1aWxkZXJzIiwic3RhcnREZWxheSIsImhhc1N0YXJ0ZWQiLCJvbkFjdGl2ZSIsIm9uUmVwZWF0IiwidXBkYXRlVG8iLCJzdGFydFRvQ3VycmVudCIsIm1heER1cmF0aW9uIiwibWluRGVsYXkiLCJnZW4iLCJkaXNwYXRjaFR3ZWVuRXZlbnQiLCJyZXNldFR3ZWVuRGF0YSIsInJlc2V0RnJvbVRpbWVsaW5lIiwiT0ZGU0VUX0RFTEFZIiwiZ2V0U3RhcnRWYWx1ZSIsImdldEVuZFZhbHVlIiwiUEVORElOR19SRU5ERVIiLCJERUxBWSIsImdldEFjdGl2ZVZhbHVlIiwidG9Qb3NpdGlvbiIsInVwZGF0ZVR3ZWVuRGF0YSIsIndhc1BhdXNlZCIsInJlc2V0VG8iLCJkaXNwYXRjaFR3ZWVuRGF0YUV2ZW50Iiwic2V0U3RhdGVGcm9tRW5kIiwiUkVQRUFUX0RFTEFZIiwic2V0U3RhdGVGcm9tU3RhcnQiLCJIT0xEX0RFTEFZIiwiQ1JFQVRFRCIsImdldFByb3BlcnR5IiwiZGVmaW5pdGlvbiIsImlzQ2xhc3NEZXNjcmlwdG9yIiwiaGFzR2V0dGVyT3JTZXR0ZXIiLCJoYXNOb25Db25maWd1cmFibGUiLCJpZ25vcmVGaW5hbHMiLCJteUNsYXNzIiwibWl4aW5zIiwiaXRlbUxlbmd0aCIsImN1cnJlbnRJbmRleCIsIlNhZmVSYW5nZSIsIml0ZW0yIiwiaW5kZXgyIiwiZGVmYXVsdENvbXBhcmUiLCJRdWlja1NlbGVjdCIsInNkIiwibmV3TGVmdCIsIm5ld1JpZ2h0IiwiQnVpbGRDaHVuayIsImFJbmRleCIsImJJbmRleCIsImluZGV4MSIsInRocm93RXJyb3IiLCJzdGFibGUiLCJjb21wIiwibG9jYWxlQ29tcGFyZSIsImNoayIsImxpIiwicmkiLCJkYmwiLCJpdGVtMSIsIk1hdHJpeCIsIkVhY2giLCJFYWNoSW5SYW5nZSIsIk51bWJlckFycmF5IiwiTnVtYmVyQXJyYXlTdGVwIiwiUmVtb3ZlUmFuZG9tRWxlbWVudCIsIkNoZWNrTWF0cml4IiwiY2VsbCIsIlJvdGF0ZU1hdHJpeCIsIlRyYW5zcG9zZU1hdHJpeCIsInNvdXJjZVJvd0NvdW50Iiwic291cmNlQ29sQ291bnQiLCJNYXRyaXhUb1N0cmluZyIsIlJldmVyc2VDb2x1bW5zIiwiUmV2ZXJzZVJvd3MiLCJSb3RhdGUxODAiLCJhcnJheUJ1ZmZlciIsIm1lZGlhVHlwZSIsImJhc2U2NCIsImxvb2t1cCIsImVuY29kZWQxIiwiZW5jb2RlZDIiLCJlbmNvZGVkMyIsImVuY29kZWQ0IiwiQXJyYXlCdWZmZXJUb0Jhc2U2NCIsIkJhc2U2NCIsIk9iamVjdHMiLCJNQVRIIiwicmFuZEludCIsInJhbmRGbG9hdCIsIm9iajEiLCJvYmoyIiwiR2V0TWluTWF4VmFsdWUiLCJIYXNBbGwiLCJNZXJnZVJpZ2h0IiwicGFkbGVuIiwiRm9ybWF0IiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwibW9kdWxlSWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiX19lc01vZHVsZSIsImhtZCIsIm5tZCIsInBhdGhzIiwib2JqZWN0UHJvdG8iLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsInN5bVRvU3RyaW5nVGFnIiwiaXNPd24iLCJ1bm1hc2tlZCIsInJlSXNVaW50IiwicmVUcmltIiwicmVJc0JhZEhleCIsInJlSXNCaW5hcnkiLCJyZUlzT2N0YWwiLCJmcmVlUGFyc2VJbnQiLCJpc0JpbmFyeSIsIklORklOSVRZIiwibmF0aXZlQ2VpbCIsIm5hdGl2ZU1heCIsImd1YXJkIiwicmVzSW5kZXgiLCJzcHJlYWRhYmxlU3ltYm9sIiwiYmFzZUZsYXR0ZW4iLCJtYXNrU3JjS2V5IiwiZnVuY1RvU3RyaW5nIiwicmVJc0hvc3RDdG9yIiwicmVJc05hdGl2ZSIsIl9fZGF0YV9fIiwiSGFzaCIsIkxpc3RDYWNoZSIsIk1hcENhY2hlIiwiU2V0Q2FjaGUiLCJmcm9tUmlnaHQiLCJjb21wYXJhdG9yIiwiaXRlcmF0ZWUiLCJpc0NvbW1vbiIsInZhbHVlc0xlbmd0aCIsInZhbHVlc0luZGV4Iiwib3RoZXJBcmdzIiwibmF0aXZlTm93IiwibGFzdENhbGxlZCIsInN0YW1wIiwiU3RhY2siLCJiaXRtYXNrIiwiY3VzdG9taXplciIsImVxdWFsRnVuYyIsImlzUGFydGlhbCIsImFyckxlbmd0aCIsIm90aExlbmd0aCIsInN0YWNrZWQiLCJzZWVuIiwiYXJyVmFsdWUiLCJvdGhWYWx1ZSIsImNvbXBhcmVkIiwib3RoSW5kZXgiLCJzeW1ib2xQcm90byIsInN5bWJvbFZhbHVlT2YiLCJjb252ZXJ0Iiwia2V5c0Z1bmMiLCJzeW1ib2xzRnVuYyIsIm5hdGl2ZUdldFN5bWJvbHMiLCJ0eXBlZEFycmF5VGFncyIsIm5vZGVJc1R5cGVkQXJyYXkiLCJpbmhlcml0ZWQiLCJpc0FyciIsImlzQXJnIiwiaXNCdWZmIiwiaXNUeXBlIiwic2tpcEluZGV4ZXMiLCJvYmpQcm9wcyIsIm9iakxlbmd0aCIsInNraXBDdG9yIiwib2JqVmFsdWUiLCJvYmpDdG9yIiwib3RoQ3RvciIsInByb21pc2VUYWciLCJkYXRhVmlld0N0b3JTdHJpbmciLCJtYXBDdG9yU3RyaW5nIiwicHJvbWlzZUN0b3JTdHJpbmciLCJzZXRDdG9yU3RyaW5nIiwid2Vha01hcEN0b3JTdHJpbmciLCJnZXRUYWciLCJjdG9yU3RyaW5nIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJvYmpJc1dyYXBwZWQiLCJvdGhJc1dyYXBwZWQiLCJvYmpVbndyYXBwZWQiLCJvdGhVbndyYXBwZWQiLCJiYXNlSXNFcXVhbCIsIm1hdGNoRGF0YSIsIm5vQ3VzdG9taXplciIsInNyY1ZhbHVlIiwicmVJc0RlZXBQcm9wIiwicmVJc1BsYWluUHJvcCIsIm1lbW9pemUiLCJtZW1vaXplZCIsInJlUHJvcE5hbWUiLCJyZUVzY2FwZUNoYXIiLCJxdW90ZSIsInN1YlN0cmluZyIsImJhc2VUb1N0cmluZyIsImhhc0Z1bmMiLCJpc0Ryb3AiLCJuYXRpdmVNaW4iLCJhcnJheXMiLCJjYWNoZXMiLCJ2YWxJc0RlZmluZWQiLCJ2YWxJc051bGwiLCJ2YWxJc1JlZmxleGl2ZSIsInZhbElzU3ltYm9sIiwib3RoSXNEZWZpbmVkIiwib3RoSXNOdWxsIiwib3RoSXNSZWZsZXhpdmUiLCJvdGhJc1N5bWJvbCIsIm5hdGl2ZUZsb29yIiwicmV0SGlnaGVzdCIsInZhbElzTmFOIiwidmFsSXNVbmRlZmluZWQiLCJzZXRMb3ciLCJzZWVuSW5kZXgiLCJhc3NpZ25GdW5jIiwidmFsc0xlbmd0aCIsIm5lc3RlZCIsIm5ld1ZhbHVlIiwiemlwV2l0aCIsImRpZmZlcmVuY2VXaXRoIiwiZmxhdHRlbkRlZXAiLCJwdWxsQWxsQnkiLCJzb3J0ZWRMYXN0SW5kZXhCeSIsInVuaW9uQnkiLCJ1bnppcCIsInhvcldpdGgiLCJlYWNoRnVuYyIsImZpbmRJbmRleEZ1bmMiLCJpc0Z1bmMiLCJjb21wYXJlciIsIm9iakNyaXRlcmlhIiwiY3JpdGVyaWEiLCJvdGhDcml0ZXJpYSIsIm9yZGVyc0xlbmd0aCIsIml0ZXJhdGVlcyIsImluaXRBY2N1bSIsIm5hdGl2ZVJhbmRvbSIsInJlSGFzVW5pY29kZSIsInJzQXN0cmFsIiwicnNDb21ibyIsInJzRml0eiIsInJzTm9uQXN0cmFsIiwicnNSZWdpb25hbCIsInJzU3VyclBhaXIiLCJyZU9wdE1vZCIsInJzT3B0VmFyIiwicnNTZXEiLCJyc1N5bWJvbCIsInJlVW5pY29kZSIsInNvcnRCeSIsImNvdW50QnkiLCJvYmplY3RDcmVhdGUiLCJ0aGlzQmluZGluZyIsImlzQmluZCIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImhvbGRlcnNMZW5ndGgiLCJsZWZ0SW5kZXgiLCJsZWZ0TGVuZ3RoIiwicmFuZ2VMZW5ndGgiLCJpc1VuY3VycmllZCIsImhvbGRlcnNJbmRleCIsInJpZ2h0SW5kZXgiLCJyaWdodExlbmd0aCIsInBsYWNlaG9sZGVyIiwiTGF6eVdyYXBwZXIiLCJfX3dyYXBwZWRfXyIsIl9fYWN0aW9uc19fIiwiX19kaXJfXyIsIl9fZmlsdGVyZWRfXyIsIl9faXRlcmF0ZWVzX18iLCJfX3Rha2VDb3VudF9fIiwiX192aWV3c19fIiwib3RoZXJGdW5jIiwiTG9kYXNoV3JhcHBlciIsImNoYWluQWxsIiwiX19jaGFpbl9fIiwiX19pbmRleF9fIiwiX192YWx1ZXNfXyIsImxvZGFzaCIsInJlV3JhcERldGFpbHMiLCJyZVNwbGl0RGV0YWlscyIsInJlV3JhcENvbW1lbnQiLCJkZXRhaWxzIiwid3JhcEZsYWdzIiwicmVmZXJlbmNlIiwid3JhcEZ1bmMiLCJhcmdQb3MiLCJhcnkiLCJhcml0eSIsImlzQ3VycnkiLCJuZXdEYXRhIiwib2xkQXJyYXkiLCJQTEFDRUhPTERFUiIsImNyZWF0ZUh5YnJpZCIsInBhcnRpYWxzUmlnaHQiLCJob2xkZXJzUmlnaHQiLCJpc0FyeSIsImlzQmluZEtleSIsImlzRmxpcCIsImhvbGRlcnNDb3VudCIsIm5ld0hvbGRlcnMiLCJzcmNCaXRtYXNrIiwibmV3Qml0bWFzayIsImlzQ29tYm8iLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJpbnZva2VGdW5jIiwibGVhZGluZ0VkZ2UiLCJ0aW1lckV4cGlyZWQiLCJzaG91bGRJbnZva2UiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRyYWlsaW5nRWRnZSIsInRpbWVXYWl0aW5nIiwicmVtYWluaW5nV2FpdCIsImRlYm91bmNlZCIsImlzSW52b2tpbmciLCJ0cmFuc2Zvcm1zIiwiZnVuY3NMZW5ndGgiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0IiwidGhyb3R0bGUiLCJpc05ldyIsImlzUHJvdG8iLCJkYXRhVmlldyIsInJlRmxhZ3MiLCJ0eXBlZEFycmF5Iiwibm9kZUlzTWFwIiwibm9kZUlzU2V0IiwiY2xvbmVhYmxlVGFncyIsImJhc2VDbG9uZSIsImlzRmxhdCIsInN1YlZhbHVlIiwia2V5c0luIiwibm9kZUlzQXJyYXlCdWZmZXIiLCJub2RlSXNEYXRlIiwib2JqZWN0Q3RvclN0cmluZyIsIm5hdGl2ZUlzRmluaXRlIiwic3R1YkZhbHNlIiwibm9kZUlzUmVnRXhwIiwic3ltSXRlcmF0b3IiLCJjYXN0QXJyYXkiLCJjb25mb3Jtc1RvIiwiaXNFcXVhbFdpdGgiLCJpc0xlbmd0aCIsImlzTmF0aXZlIiwiaXNPYmplY3RMaWtlIiwiaXNXZWFrU2V0IiwiYXVnZW5kIiwiYWRkZW5kIiwibWV0aG9kTmFtZSIsIm1heEJ5IiwibXVsdGlwbGllciIsIm11bHRpcGxpY2FuZCIsIm1pbnVlbmQiLCJzdWJ0cmFoZW5kIiwiZnJlZVBhcnNlRmxvYXQiLCJmbG9hdGluZyIsImFzc2lnbmVyIiwic291cmNlcyIsInNyY0luZGV4IiwicHJvcHNJbmRleCIsInByb3BzTGVuZ3RoIiwibWVyZ2VGdW5jIiwiaXNUeXBlZCIsImJhc2VNZXJnZSIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJ0b0l0ZXJhdGVlIiwidXBkYXRlciIsImZvckluUmlnaHQiLCJpbnZva2UiLCJ0b1BhaXJzSW4iLCJpc0Fyckxpa2UiLCJpbnRlcmNlcHRvciIsIndyYXBwZXJBdCIsInRocnUiLCJhY3Rpb25zIiwicGxhbnQiLCJ3cmFwcGVkIiwic3RyU3ltYm9scyIsInJlTGF0aW4iLCJyZUNvbWJvTWFyayIsInJlQXNjaWlXb3JkIiwicmVIYXNVbmljb2RlV29yZCIsInJzRGluZ2JhdFJhbmdlIiwicnNMb3dlclJhbmdlIiwicnNVcHBlclJhbmdlIiwicnNCcmVha1JhbmdlIiwicnNNYXRoT3BSYW5nZSIsInJzQnJlYWsiLCJyc0RpZ2l0cyIsInJzRGluZ2JhdCIsInJzTG93ZXIiLCJyc01pc2MiLCJyc1VwcGVyIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJzT3B0Q29udHJMb3dlciIsInJzT3B0Q29udHJVcHBlciIsInJzRW1vamkiLCJyZVVuaWNvZGVXb3JkIiwicmVBcG9zIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNVbmVzY2FwZWRIdG1sIiwicmVIYXNSZWdFeHBDaGFyIiwiY2hhcnNMZW5ndGgiLCJzdHJMZW5ndGgiLCJyZVRyaW1TdGFydCIsIm5hdGl2ZVBhcnNlSW50Iiwic3RyaW5nRXNjYXBlcyIsInJlRW1wdHlTdHJpbmdMZWFkaW5nIiwicmVFbXB0eVN0cmluZ01pZGRsZSIsInJlRW1wdHlTdHJpbmdUcmFpbGluZyIsInJlRXNUZW1wbGF0ZSIsInJlTm9NYXRjaCIsInJlVW5lc2NhcGVkU3RyaW5nIiwidGVtcGxhdGVTZXR0aW5ncyIsImlzRXNjYXBpbmciLCJpc0V2YWx1YXRpbmciLCJpbXBvcnRzIiwiaW1wb3J0c0tleXMiLCJpbXBvcnRzVmFsdWVzIiwiaW50ZXJwb2xhdGUiLCJyZURlbGltaXRlcnMiLCJldmFsdWF0ZSIsInNvdXJjZVVSTCIsImVzY2FwZVZhbHVlIiwiaW50ZXJwb2xhdGVWYWx1ZSIsImVzVGVtcGxhdGVWYWx1ZSIsImV2YWx1YXRlVmFsdWUiLCJjaHJTeW1ib2xzIiwicmVUcmltRW5kIiwib21pc3Npb24iLCJuZXdFbmQiLCJyZUVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsInVwcGVyQ2FzZSIsImVzY2FwZVJlZ0V4cCIsInNuYWtlQ2FzZSIsIm1ldGhvZE5hbWVzIiwicHJlcmVxIiwiYXJyYXlGdW5jIiwiaWRDb3VudGVyIiwiYXR0ZW1wdCIsImRlZmF1bHRUbyIsInRvUGF0aCIsIml0ZXJMZW5ndGgiLCJ0YWtlQ291bnQiLCJpdGVySW5kZXgiLCJpc09iaiIsImlzRmlsdGVyIiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsInRha2VSaWdodCIsImRyb3BSaWdodCIsInRha2VXaGlsZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJuZXh0S2V5IiwiQWRkRXF1YXRpb24iLCJDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyIsIlJlcGVhdFdyYXBwaW5nIiwiQ2xhbXBUb0VkZ2VXcmFwcGluZyIsIk1pcnJvcmVkUmVwZWF0V3JhcHBpbmciLCJOZWFyZXN0RmlsdGVyIiwiTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIiLCJOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIiwiTGluZWFyRmlsdGVyIiwiTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIiwiVW5zaWduZWRCeXRlVHlwZSIsIlVuc2lnbmVkU2hvcnRUeXBlIiwiVW5zaWduZWRJbnRUeXBlIiwiRmxvYXRUeXBlIiwiSGFsZkZsb2F0VHlwZSIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsIlJHQkZvcm1hdCIsIlJHQkFGb3JtYXQiLCJEZXB0aEZvcm1hdCIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIkludGVycG9sYXRlRGlzY3JldGUiLCJJbnRlcnBvbGF0ZUxpbmVhciIsIkludGVycG9sYXRlU21vb3RoIiwiWmVyb0N1cnZhdHVyZUVuZGluZyIsIlplcm9TbG9wZUVuZGluZyIsIldyYXBBcm91bmRFbmRpbmciLCJMaW5lYXJFbmNvZGluZyIsInNSR0JFbmNvZGluZyIsIlJHQkVFbmNvZGluZyIsIktlZXBTdGVuY2lsT3AiLCJTdGF0aWNEcmF3VXNhZ2UiLCJEeW5hbWljRHJhd1VzYWdlIiwiRXZlbnREaXNwYXRjaGVyIiwiX2xpc3RlbmVycyIsImhhc0V2ZW50TGlzdGVuZXIiLCJsaXN0ZW5lckFycmF5IiwiX2x1dCIsIl9jYW52YXMiLCJNYXRoVXRpbHMiLCJERUcyUkFEIiwiUkFEMkRFRyIsImdlbmVyYXRlVVVJRCIsImV1Y2xpZGVhbk1vZHVsbyIsIm1hcExpbmVhciIsInNtb290aHN0ZXAiLCJzbW9vdGhlcnN0ZXAiLCJyYW5kRmxvYXRTcHJlYWQiLCJkZWdUb1JhZCIsInJhZFRvRGVnIiwiaXNQb3dlck9mVHdvIiwiY2VpbFBvd2VyT2ZUd28iLCJmbG9vclBvd2VyT2ZUd28iLCJzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyIiwib3JkZXIiLCJjMTMiLCJzMTMiLCJjMV8zIiwiczFfMyIsImMzXzEiLCJzM18xIiwiaXNWZWN0b3IyIiwic2V0U2NhbGFyIiwic2V0Q29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwiYWRkVmVjdG9ycyIsImFkZFNjYWxhciIsImFkZFNjYWxlZFZlY3RvciIsInN1YlZlY3RvcnMiLCJzdWJTY2FsYXIiLCJtdWx0aXBseVNjYWxhciIsImRpdmlkZVNjYWxhciIsImFwcGx5TWF0cml4MyIsImNsYW1wU2NhbGFyIiwibWluVmFsIiwibWF4VmFsIiwiY2xhbXBMZW5ndGgiLCJyb3VuZFRvWmVybyIsIm1hbmhhdHRhbkxlbmd0aCIsImRpc3RhbmNlVG8iLCJkaXN0YW5jZVRvU3F1YXJlZCIsIm1hbmhhdHRhbkRpc3RhbmNlVG8iLCJsZXJwVmVjdG9ycyIsImZyb21CdWZmZXJBdHRyaWJ1dGUiLCJpc01hdHJpeDMiLCJuMTEiLCJuMTIiLCJuMTMiLCJuMjEiLCJuMjIiLCJuMjMiLCJuMzEiLCJuMzIiLCJuMzMiLCJ0ZSIsIm1lIiwiZXh0cmFjdEJhc2lzIiwieEF4aXMiLCJ5QXhpcyIsInpBeGlzIiwic2V0RnJvbU1hdHJpeDNDb2x1bW4iLCJzZXRGcm9tTWF0cml4NCIsIm11bHRpcGx5TWF0cmljZXMiLCJwcmVtdWx0aXBseSIsImFlIiwiYmUiLCJiMTMiLCJiMjMiLCJiMzEiLCJiMzIiLCJiMzMiLCJnZXRJbnZlcnNlIiwidGhyb3dPbkRlZ2VuZXJhdGUiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJkZXRJbnYiLCJnZXROb3JtYWxNYXRyaXgiLCJtYXRyaXg0IiwidHJhbnNwb3NlSW50b0FycmF5Iiwic2V0VXZUcmFuc2Zvcm0iLCJJbWFnZVV0aWxzIiwiZ2V0RGF0YVVSTCIsImNyZWF0ZUVsZW1lbnROUyIsIkltYWdlRGF0YSIsInRleHR1cmVJZCIsImFuaXNvdHJvcHkiLCJERUZBVUxUX0lNQUdFIiwibWlwbWFwcyIsIkRFRkFVTFRfTUFQUElORyIsImludGVybmFsRm9ybWF0IiwibWF0cml4QXV0b1VwZGF0ZSIsImdlbmVyYXRlTWlwbWFwcyIsInByZW11bHRpcGx5QWxwaGEiLCJ1bnBhY2tBbGlnbm1lbnQiLCJXZWJHTFJlbmRlclRhcmdldCIsInNjaXNzb3JUZXN0IiwiZGVwdGhCdWZmZXIiLCJzdGVuY2lsQnVmZmVyIiwiZGVwdGhUZXh0dXJlIiwiV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCIsInNhbXBsZXMiLCJfeiIsImlzVGV4dHVyZSIsInVwZGF0ZU1hdHJpeCIsImlzUm9vdE9iamVjdCIsImdlbmVyYXRvciIsImRpc3Bvc2UiLCJ0cmFuc2Zvcm1VdiIsImlzVmVjdG9yNCIsImFwcGx5TWF0cml4NCIsInNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uIiwic2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4IiwiZXBzaWxvbjIiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJnZXRaIiwiZ2V0VyIsImlzV2ViR0xSZW5kZXJUYXJnZXQiLCJpc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQiLCJxYSIsInFiIiwicW0iLCJzbGVycEZsYXQiLCJkc3QiLCJkc3RPZmZzZXQiLCJzcmMwIiwic3JjT2Zmc2V0MCIsInNyYzEiLCJzcmNPZmZzZXQxIiwidzAiLCJ3MSIsInNxclNpbiIsInREaXIiLCJfb25DaGFuZ2VDYWxsYmFjayIsImlzUXVhdGVybmlvbiIsInF1YXRlcm5pb24iLCJzZXRGcm9tRXVsZXIiLCJldWxlciIsImlzRXVsZXIiLCJjMyIsInMzIiwic2V0RnJvbUF4aXNBbmdsZSIsImhhbGZBbmdsZSIsInNldEZyb21Sb3RhdGlvbk1hdHJpeCIsInRyYWNlIiwic2V0RnJvbVVuaXRWZWN0b3JzIiwidkZyb20iLCJ2VG8iLCJhbmdsZVRvIiwicm90YXRlVG93YXJkcyIsImludmVyc2UiLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicWF4IiwicWF5IiwicWF6IiwicWF3IiwicWJ4IiwicWJ5IiwicWJ6IiwicWJ3IiwiY29zSGFsZlRoZXRhIiwic3FyU2luSGFsZlRoZXRhIiwic2luSGFsZlRoZXRhIiwiaGFsZlRoZXRhIiwicmF0aW9BIiwicmF0aW9CIiwiX29uQ2hhbmdlIiwiX3ZlY3RvciIsIl9xdWF0ZXJuaW9uIiwiaXNWZWN0b3IzIiwibXVsdGlwbHlWZWN0b3JzIiwiYXBwbHlFdWxlciIsImFwcGx5UXVhdGVybmlvbiIsImFwcGx5QXhpc0FuZ2xlIiwiYXBwbHlOb3JtYWxNYXRyaXgiLCJtYXRyaXhXb3JsZEludmVyc2UiLCJwcm9qZWN0aW9uTWF0cml4SW52ZXJzZSIsIm1hdHJpeFdvcmxkIiwidHJhbnNmb3JtRGlyZWN0aW9uIiwicHJvamVjdE9uVmVjdG9yIiwicHJvamVjdE9uUGxhbmUiLCJwbGFuZU5vcm1hbCIsInNldEZyb21TcGhlcmljYWwiLCJzZXRGcm9tU3BoZXJpY2FsQ29vcmRzIiwicGhpIiwic2luUGhpUmFkaXVzIiwic2V0RnJvbUN5bGluZHJpY2FsIiwic2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzIiwic2V0RnJvbU1hdHJpeFBvc2l0aW9uIiwic2V0RnJvbU1hdHJpeFNjYWxlIiwic2V0RnJvbU1hdHJpeENvbHVtbiIsInN6IiwiX3YxIiwiX20xIiwiX3plcm8iLCJfb25lIiwiaXNNYXRyaXg0IiwibjE0IiwibjI0IiwibjM0IiwibjQxIiwibjQyIiwibjQzIiwibjQ0IiwiY29weVBvc2l0aW9uIiwibWFrZUJhc2lzIiwiZXh0cmFjdFJvdGF0aW9uIiwic2NhbGVaIiwibWFrZVJvdGF0aW9uRnJvbUV1bGVyIiwiYWYiLCJiZiIsImNlIiwiY2YiLCJkZSIsImRmIiwiYWMiLCJiZCIsIm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwiY29tcG9zZSIsImExNCIsImEyNCIsImEzNCIsImE0MSIsImE0MiIsImE0MyIsImE0NCIsImIxNCIsImIyNCIsImIzNCIsImI0MSIsImI0MiIsImI0MyIsImI0NCIsInQxNCIsImdldE1heFNjYWxlT25BeGlzIiwic2NhbGVYU3EiLCJzY2FsZVlTcSIsInNjYWxlWlNxIiwibWFrZVRyYW5zbGF0aW9uIiwibWFrZVJvdGF0aW9uWCIsIm1ha2VSb3RhdGlvblkiLCJtYWtlUm90YXRpb25aIiwibWFrZVNjYWxlIiwibWFrZVNoZWFyIiwiZGVjb21wb3NlIiwiaW52U1giLCJpbnZTWSIsImludlNaIiwibWFrZVBlcnNwZWN0aXZlIiwibWFrZU9ydGhvZ3JhcGhpYyIsIl9tYXRyaXgiLCJfcXVhdGVybmlvbiQxIiwiRXVsZXIiLCJfb3JkZXIiLCJEZWZhdWx0T3JkZXIiLCJMYXllcnMiLCJSb3RhdGlvbk9yZGVycyIsInNldEZyb21RdWF0ZXJuaW9uIiwic2V0RnJvbVZlY3RvcjMiLCJyZW9yZGVyIiwibmV3T3JkZXIiLCJ0b1ZlY3RvcjMiLCJvcHRpb25hbFJlc3VsdCIsImVuYWJsZUFsbCIsImRpc2FibGVBbGwiLCJfb2JqZWN0M0RJZCIsIl92MSQxIiwiX3ExIiwiX20xJDEiLCJfcG9zaXRpb24iLCJfc2NhbGUiLCJfcXVhdGVybmlvbiQyIiwiX3hBeGlzIiwiX3lBeGlzIiwiX3pBeGlzIiwiX2FkZGVkRXZlbnQiLCJfcmVtb3ZlZEV2ZW50IiwiT2JqZWN0M0QiLCJEZWZhdWx0VXAiLCJtb2RlbFZpZXdNYXRyaXgiLCJub3JtYWxNYXRyaXgiLCJEZWZhdWx0TWF0cml4QXV0b1VwZGF0ZSIsIm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUiLCJjYXN0U2hhZG93IiwicmVjZWl2ZVNoYWRvdyIsImZydXN0dW1DdWxsZWQiLCJ1c2VyRGF0YSIsImJhY2tncm91bmQiLCJlbnZpcm9ubWVudCIsImZvZyIsIm92ZXJyaWRlTWF0ZXJpYWwiLCJfX1RIUkVFX0RFVlRPT0xTX18iLCJDdXN0b21FdmVudCIsImlzT2JqZWN0M0QiLCJvbkJlZm9yZVJlbmRlciIsIm9uQWZ0ZXJSZW5kZXIiLCJzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUiLCJzZXRSb3RhdGlvbkZyb21FdWxlciIsInNldFJvdGF0aW9uRnJvbU1hdHJpeCIsInNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJyb3RhdGVPbkF4aXMiLCJyb3RhdGVPbldvcmxkQXhpcyIsInRyYW5zbGF0ZU9uQXhpcyIsInRyYW5zbGF0ZVoiLCJsb2NhbFRvV29ybGQiLCJ3b3JsZFRvTG9jYWwiLCJ1cGRhdGVXb3JsZE1hdHJpeCIsImlzQ2FtZXJhIiwiaXNMaWdodCIsImF0dGFjaCIsImdldE9iamVjdEJ5SWQiLCJnZXRPYmplY3RCeVByb3BlcnR5IiwiZ2V0T2JqZWN0QnlOYW1lIiwiZ2V0V29ybGRQb3NpdGlvbiIsInVwZGF0ZU1hdHJpeFdvcmxkIiwiZ2V0V29ybGRRdWF0ZXJuaW9uIiwiZ2V0V29ybGRTY2FsZSIsImdldFdvcmxkRGlyZWN0aW9uIiwicmF5Y2FzdCIsInRyYXZlcnNlIiwidHJhdmVyc2VWaXNpYmxlIiwidHJhdmVyc2VBbmNlc3RvcnMiLCJnZW9tZXRyaWVzIiwibWF0ZXJpYWxzIiwic2hhcGVzIiwibGlicmFyeSIsImlzSW5zdGFuY2VkTWVzaCIsImluc3RhbmNlTWF0cml4IiwiaXNNZXNoIiwiaXNMaW5lIiwiaXNQb2ludHMiLCJnZW9tZXRyeSIsInBhcmFtZXRlcnMiLCJtYXRlcmlhbCIsInV1aWRzIiwiZXh0cmFjdEZyb21DYWNoZSIsImlzU2NlbmUiLCJfdmVjdG9yJDEiLCJfYm94IiwiQm94MyIsIl92MCIsIl92MSQyIiwiX3YyIiwiX2YwIiwiX2YxIiwiX2YyIiwiX2NlbnRlciIsIl9leHRlbnRzIiwiX3RyaWFuZ2xlTm9ybWFsIiwiX3Rlc3RBeGlzIiwic2F0Rm9yQXhlcyIsImV4dGVudHMiLCJpc0JveDMiLCJzZXRGcm9tQXJyYXkiLCJzZXRGcm9tQnVmZmVyQXR0cmlidXRlIiwic2V0RnJvbVBvaW50cyIsIm1ha2VFbXB0eSIsImV4cGFuZEJ5UG9pbnQiLCJzZXRGcm9tQ2VudGVyQW5kU2l6ZSIsImhhbGZTaXplIiwiZXhwYW5kQnlPYmplY3QiLCJnZXRTaXplIiwiZXhwYW5kQnlWZWN0b3IiLCJleHBhbmRCeVNjYWxhciIsImJvdW5kaW5nQm94IiwiY29tcHV0ZUJvdW5kaW5nQm94IiwiY29udGFpbnNCb3giLCJpbnRlcnNlY3RzQm94IiwiaW50ZXJzZWN0c1NwaGVyZSIsInNwaGVyZSIsImNsYW1wUG9pbnQiLCJpbnRlcnNlY3RzUGxhbmUiLCJwbGFuZSIsImNvbnN0YW50IiwiaW50ZXJzZWN0c1RyaWFuZ2xlIiwiZGlzdGFuY2VUb1BvaW50IiwiZ2V0Qm91bmRpbmdTcGhlcmUiLCJfYm94JDEiLCJTcGhlcmUiLCJvcHRpb25hbENlbnRlciIsIm1heFJhZGl1c1NxIiwicmFkaXVzU3VtIiwiZGVsdGFMZW5ndGhTcSIsImdldEJvdW5kaW5nQm94IiwiX3ZlY3RvciQyIiwiX3NlZ0NlbnRlciIsIl9zZWdEaXIiLCJfZGlmZiIsIl9lZGdlMSIsIl9lZGdlMiIsIl9ub3JtYWwiLCJSYXkiLCJyZWNhc3QiLCJjbG9zZXN0UG9pbnRUb1BvaW50IiwiZGlyZWN0aW9uRGlzdGFuY2UiLCJkaXN0YW5jZVNxVG9Qb2ludCIsImRpc3RhbmNlU3FUb1NlZ21lbnQiLCJvcHRpb25hbFBvaW50T25SYXkiLCJvcHRpb25hbFBvaW50T25TZWdtZW50Iiwic3FyRGlzdCIsImV4dERldCIsInNlZ0V4dGVudCIsImludkRldCIsImludGVyc2VjdFNwaGVyZSIsInRjYSIsInJhZGl1czIiLCJ0aGMiLCJ0MCIsImRpc3RhbmNlVG9QbGFuZSIsImludGVyc2VjdFBsYW5lIiwiZGlzdFRvUG9pbnQiLCJpbnRlcnNlY3RCb3giLCJ0bWluIiwidG1heCIsInR5bWluIiwidHltYXgiLCJ0em1pbiIsInR6bWF4IiwiaW52ZGlyeCIsImludmRpcnkiLCJpbnZkaXJ6IiwiaW50ZXJzZWN0VHJpYW5nbGUiLCJiYWNrZmFjZUN1bGxpbmciLCJEZE4iLCJEZFF4RTIiLCJEZEUxeFEiLCJRZE4iLCJfdmVjdG9yMSIsIl92ZWN0b3IyIiwiX25vcm1hbE1hdHJpeCIsIlBsYW5lIiwiaXNQbGFuZSIsInNldENvbXBvbmVudHMiLCJzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCIsInNldEZyb21Db3BsYW5hclBvaW50cyIsImludmVyc2VOb3JtYWxMZW5ndGgiLCJkaXN0YW5jZVRvU3BoZXJlIiwicHJvamVjdFBvaW50IiwiaW50ZXJzZWN0TGluZSIsImludGVyc2VjdHNMaW5lIiwic3RhcnRTaWduIiwiZW5kU2lnbiIsImNvcGxhbmFyUG9pbnQiLCJvcHRpb25hbE5vcm1hbE1hdHJpeCIsInJlZmVyZW5jZVBvaW50IiwiX3YwJDEiLCJfdjEkMyIsIl92MiQxIiwiX3YzIiwiX3ZhYiIsIl92YWMiLCJfdmJjIiwiX3ZhcCIsIl92YnAiLCJfdmNwIiwiZ2V0Tm9ybWFsIiwidGFyZ2V0TGVuZ3RoU3EiLCJnZXRCYXJ5Y29vcmQiLCJpbnZEZW5vbSIsImdldFVWIiwiaXNGcm9udEZhY2luZyIsInNldEZyb21Qb2ludHNBbmRJbmRpY2VzIiwiaTAiLCJpMSIsImkyIiwiZ2V0QXJlYSIsImdldE1pZHBvaW50IiwiZ2V0UGxhbmUiLCJkNCIsInZjIiwiZDUiLCJkNiIsInZiIiwidmEiLCJfY29sb3JLZXl3b3JkcyIsIl9oc2xBIiwiX2hzbEIiLCJzZXRSR0IiLCJodWUycmdiIiwiU1JHQlRvTGluZWFyIiwiTGluZWFyVG9TUkdCIiwiRmFjZTMiLCJtYXRlcmlhbEluZGV4IiwidmVydGV4Tm9ybWFscyIsImlzQ29sb3IiLCJ2ZXJ0ZXhDb2xvcnMiLCJzZXRIZXgiLCJzZXRIU0wiLCJoYW5kbGVBbHBoYSIsImNvbXBvbmVudHMiLCJzZXRDb2xvck5hbWUiLCJjb3B5R2FtbWFUb0xpbmVhciIsImdhbW1hRmFjdG9yIiwiY29weUxpbmVhclRvR2FtbWEiLCJzYWZlSW52ZXJzZSIsImNvbnZlcnRHYW1tYVRvTGluZWFyIiwiY29udmVydExpbmVhclRvR2FtbWEiLCJjb3B5U1JHQlRvTGluZWFyIiwiY29weUxpbmVhclRvU1JHQiIsImNvbnZlcnRTUkdCVG9MaW5lYXIiLCJjb252ZXJ0TGluZWFyVG9TUkdCIiwiZ2V0SGV4IiwiZ2V0SGV4U3RyaW5nIiwiZ2V0SFNMIiwiaHVlIiwic2F0dXJhdGlvbiIsImxpZ2h0bmVzcyIsImdldFN0eWxlIiwib2Zmc2V0SFNMIiwiYWRkQ29sb3JzIiwibGVycEhTTCIsIk5BTUVTIiwibWF0ZXJpYWxJZCIsIk1hdGVyaWFsIiwiYmxlbmRpbmciLCJzaWRlIiwiZmxhdFNoYWRpbmciLCJibGVuZFNyYyIsImJsZW5kRHN0IiwiYmxlbmRTcmNBbHBoYSIsImJsZW5kRHN0QWxwaGEiLCJibGVuZEVxdWF0aW9uQWxwaGEiLCJkZXB0aEZ1bmMiLCJkZXB0aFRlc3QiLCJkZXB0aFdyaXRlIiwic3RlbmNpbFdyaXRlTWFzayIsInN0ZW5jaWxSZWYiLCJzdGVuY2lsRnVuY01hc2siLCJzdGVuY2lsRmFpbCIsInN0ZW5jaWxaRmFpbCIsInN0ZW5jaWxaUGFzcyIsInN0ZW5jaWxXcml0ZSIsImNsaXBwaW5nUGxhbmVzIiwiY2xpcEludGVyc2VjdGlvbiIsImNsaXBTaGFkb3dzIiwic2hhZG93U2lkZSIsImNvbG9yV3JpdGUiLCJwb2x5Z29uT2Zmc2V0IiwicG9seWdvbk9mZnNldEZhY3RvciIsInBvbHlnb25PZmZzZXRVbml0cyIsImRpdGhlcmluZyIsImFscGhhVGVzdCIsInRvbmVNYXBwZWQiLCJNZXNoQmFzaWNNYXRlcmlhbCIsImxpZ2h0TWFwIiwibGlnaHRNYXBJbnRlbnNpdHkiLCJhb01hcCIsImFvTWFwSW50ZW5zaXR5Iiwic3BlY3VsYXJNYXAiLCJhbHBoYU1hcCIsImVudk1hcCIsImNvbWJpbmUiLCJyZWZsZWN0aXZpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJ3aXJlZnJhbWUiLCJ3aXJlZnJhbWVMaW5ld2lkdGgiLCJ3aXJlZnJhbWVMaW5lY2FwIiwid2lyZWZyYW1lTGluZWpvaW4iLCJza2lubmluZyIsIm1vcnBoVGFyZ2V0cyIsInNldFZhbHVlcyIsImlzTWF0ZXJpYWwiLCJvbkJlZm9yZUNvbXBpbGUiLCJpc1Jvb3QiLCJyb3VnaG5lc3MiLCJtZXRhbG5lc3MiLCJzaGVlbiIsImVtaXNzaXZlIiwiZW1pc3NpdmVJbnRlbnNpdHkiLCJzcGVjdWxhciIsInNoaW5pbmVzcyIsImNsZWFyY29hdCIsImNsZWFyY29hdFJvdWdobmVzcyIsImNsZWFyY29hdE1hcCIsImNsZWFyY29hdFJvdWdobmVzc01hcCIsImNsZWFyY29hdE5vcm1hbE1hcCIsImNsZWFyY29hdE5vcm1hbFNjYWxlIiwibWF0Y2FwIiwiYnVtcE1hcCIsImJ1bXBTY2FsZSIsIm5vcm1hbE1hcFR5cGUiLCJub3JtYWxTY2FsZSIsImRpc3BsYWNlbWVudE1hcCIsImRpc3BsYWNlbWVudFNjYWxlIiwiZGlzcGxhY2VtZW50QmlhcyIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc01hcCIsImVtaXNzaXZlTWFwIiwiZW52TWFwSW50ZW5zaXR5IiwiZ3JhZGllbnRNYXAiLCJzaXplQXR0ZW51YXRpb24iLCJsaW5ld2lkdGgiLCJkYXNoU2l6ZSIsImdhcFNpemUiLCJtb3JwaE5vcm1hbHMiLCJzcmNQbGFuZXMiLCJkc3RQbGFuZXMiLCJpc01lc2hCYXNpY01hdGVyaWFsIiwiX3ZlY3RvciQzIiwiQnVmZmVyQXR0cmlidXRlIiwiaXRlbVNpemUiLCJ1c2FnZSIsInVwZGF0ZVJhbmdlIiwiSW50OEJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQ4QnVmZmVyQXR0cmlidXRlIiwiVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlIiwiSW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJVaW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJJbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUiLCJGbG9hdDY0QnVmZmVyQXR0cmlidXRlIiwiRGlyZWN0R2VvbWV0cnkiLCJub3JtYWxzIiwidXZzMiIsInNraW5XZWlnaHRzIiwic2tpbkluZGljZXMiLCJib3VuZGluZ1NwaGVyZSIsInZlcnRpY2VzTmVlZFVwZGF0ZSIsIm5vcm1hbHNOZWVkVXBkYXRlIiwiY29sb3JzTmVlZFVwZGF0ZSIsInV2c05lZWRVcGRhdGUiLCJncm91cHNOZWVkVXBkYXRlIiwiYXJyYXlNYXgiLCJpc0J1ZmZlckF0dHJpYnV0ZSIsIm9uVXBsb2FkQ2FsbGJhY2siLCJzZXRVc2FnZSIsImNvcHlBdCIsImNvcHlBcnJheSIsImNvcHlDb2xvcnNBcnJheSIsImNvcHlWZWN0b3Iyc0FycmF5IiwidmVjdG9ycyIsImNvcHlWZWN0b3Izc0FycmF5IiwiY29weVZlY3RvcjRzQXJyYXkiLCJzZXRYWVoiLCJzZXRYWVpXIiwib25VcGxvYWQiLCJjb21wdXRlR3JvdXBzIiwiZnJvbUdlb21ldHJ5IiwibW9ycGhUYXJnZXRzUG9zaXRpb24iLCJmYWNlVmVydGV4VXZzIiwiaGFzRmFjZVZlcnRleFV2IiwiaGFzRmFjZVZlcnRleFV2MiIsIm1vcnBoVGFyZ2V0c0xlbmd0aCIsIm1vcnBoVGFyZ2V0c05vcm1hbCIsIm1vcnBoTm9ybWFsc0xlbmd0aCIsImhhc1NraW5JbmRpY2VzIiwiaGFzU2tpbldlaWdodHMiLCJ2ZXJ0ZXhVdnMiLCJtb3JwaFRhcmdldCIsIm1vcnBoTm9ybWFsIiwiX2J1ZmZlckdlb21ldHJ5SWQiLCJfbTEkMiIsIl9vYmoiLCJfYm94JDIiLCJfYm94TW9ycGhUYXJnZXRzIiwiX3ZlY3RvciQ0IiwiQnVmZmVyR2VvbWV0cnkiLCJtb3JwaEF0dHJpYnV0ZXMiLCJtb3JwaFRhcmdldHNSZWxhdGl2ZSIsImRyYXdSYW5nZSIsImlzQnVmZmVyR2VvbWV0cnkiLCJzZXRJbmRleCIsImRlbGV0ZUF0dHJpYnV0ZSIsImFkZEdyb3VwIiwiY2xlYXJHcm91cHMiLCJzZXREcmF3UmFuZ2UiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJwb3NpdGlvbnMiLCJsaW5lRGlzdGFuY2VzIiwiaXNHZW9tZXRyeSIsInVwZGF0ZUZyb21PYmplY3QiLCJkaXJlY3QiLCJfX2RpcmVjdEdlb21ldHJ5IiwiZWxlbWVudHNOZWVkVXBkYXRlIiwibGluZURpc3RhbmNlc05lZWRVcGRhdGUiLCJsaW5lRGlzdGFuY2UiLCJmcm9tRGlyZWN0R2VvbWV0cnkiLCJtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiIsIm1vcnBoQXR0cmlidXRlIiwiamwiLCJjb21wdXRlRmFjZU5vcm1hbHMiLCJjb21wdXRlVmVydGV4Tm9ybWFscyIsInZBIiwidkIiLCJ2QyIsInBBIiwicEIiLCJwQyIsImNiIiwiaW5kaWNlcyIsIm5vcm1hbGl6ZU5vcm1hbHMiLCJhdHRyaWJ1dGVBcnJheTEiLCJhdHRyaWJ1dGUyIiwiYXR0cmlidXRlQXJyYXkyIiwiYXR0cmlidXRlT2Zmc2V0IiwidG9Ob25JbmRleGVkIiwiY29udmVydEJ1ZmZlckF0dHJpYnV0ZSIsImdlb21ldHJ5MiIsIm5ld0F0dHJpYnV0ZSIsIm1vcnBoQXJyYXkiLCJhdHRyaWJ1dGVEYXRhIiwiaGFzTW9ycGhBdHRyaWJ1dGVzIiwiYXR0cmlidXRlQXJyYXkiLCJfaW52ZXJzZU1hdHJpeCIsIl9yYXkiLCJfc3BoZXJlIiwiX3ZBIiwiX3ZCIiwiX3ZDIiwiX3RlbXBBIiwiX3RlbXBCIiwiX3RlbXBDIiwiX21vcnBoQSIsIl9tb3JwaEIiLCJfbW9ycGhDIiwiX3V2QSIsIl91dkIiLCJfdXZDIiwiX2ludGVyc2VjdGlvblBvaW50IiwiX2ludGVyc2VjdGlvblBvaW50V29ybGQiLCJ1cGRhdGVNb3JwaFRhcmdldHMiLCJjaGVja0ludGVyc2VjdGlvbiIsInJheWNhc3RlciIsImNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24iLCJtb3JwaFBvc2l0aW9uIiwibW9ycGhJbmZsdWVuY2VzIiwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiwiaW5mbHVlbmNlIiwibW9ycGhUYXJnZXREaWN0aW9uYXJ5IiwibWwiLCJncm91cE1hdGVyaWFsIiwiZmFjZUluZGV4IiwiZnZBIiwiZnZCIiwiZnZDIiwiaXNNdWx0aU1hdGVyaWFsIiwiZmwiLCJmYWNlTWF0ZXJpYWwiLCJ1dnNfZiIsIl9nZW9tZXRyeUlkIiwiX20xJDMiLCJfb2JqJDEiLCJfb2Zmc2V0JDEiLCJHZW9tZXRyeSIsImZyb21CdWZmZXJHZW9tZXRyeSIsImFkZEZhY2UiLCJhcmVhV2VpZ2h0ZWQiLCJ2bCIsImNvbXB1dGVGbGF0VmVydGV4Tm9ybWFscyIsImNvbXB1dGVNb3JwaE5vcm1hbHMiLCJfX29yaWdpbmFsRmFjZU5vcm1hbCIsIl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzIiwidG1wR2VvIiwiZmFjZU5vcm1hbHMiLCJkc3ROb3JtYWxzRmFjZSIsImRzdE5vcm1hbHNWZXJ0ZXgiLCJmYWNlTm9ybWFsIiwibWF0ZXJpYWxJbmRleE9mZnNldCIsInZlcnRpY2VzMSIsInZlcnRpY2VzMiIsImZhY2VzMSIsImZhY2VzMiIsImNvbG9yczEiLCJjb2xvcnMyIiwidmVydGV4Q29weSIsImZhY2VDb3B5IiwiZmFjZVZlcnRleE5vcm1hbHMiLCJmYWNlVmVydGV4Q29sb3JzIiwiZmFjZVZlcnRleFV2czIiLCJ1dnNDb3B5Iiwia2wiLCJtZXJnZU1lc2giLCJtZXJnZVZlcnRpY2VzIiwidmVydGljZXNNYXAiLCJjaGFuZ2VzIiwiZmFjZUluZGljZXNUb1JlbW92ZSIsInNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleCIsIl9pZCIsIm5ld1V2czEiLCJuZXdVdnMyIiwidXZzMSIsIm5vcm1hbHNIYXNoIiwiY29sb3JzSGFzaCIsInV2c0hhc2giLCJoYXNGYWNlTm9ybWFsIiwiaGFzRmFjZVZlcnRleE5vcm1hbCIsImhhc0ZhY2VDb2xvciIsImhhc0ZhY2VWZXJ0ZXhDb2xvciIsImZhY2VUeXBlIiwic2V0Qml0IiwiZ2V0VXZJbmRleCIsImdldE5vcm1hbEluZGV4IiwiZ2V0Q29sb3JJbmRleCIsInNyY1ZlcnRleE5vcm1hbCIsImRlc3RWZXJ0ZXhOb3JtYWwiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIndpZHRoU2VnbWVudHMiLCJoZWlnaHRTZWdtZW50cyIsImRlcHRoU2VnbWVudHMiLCJzdXBlciIsIm51bWJlck9mVmVydGljZXMiLCJncm91cFN0YXJ0IiwiYnVpbGRQbGFuZSIsInVkaXIiLCJ2ZGlyIiwiZ3JpZFgiLCJncmlkWSIsInNlZ21lbnRXaWR0aCIsInNlZ21lbnRIZWlnaHQiLCJ3aWR0aEhhbGYiLCJoZWlnaHRIYWxmIiwiZGVwdGhIYWxmIiwiZ3JpZFgxIiwiZ3JpZFkxIiwidmVydGV4Q291bnRlciIsImdyb3VwQ291bnQiLCJjbG9uZVVuaWZvcm1zIiwibWVyZ2VVbmlmb3JtcyIsIm1lcmdlZCIsIlVuaWZvcm1zVXRpbHMiLCJTaGFkZXJNYXRlcmlhbCIsImRlZmluZXMiLCJjbGlwcGluZyIsImRlcml2YXRpdmVzIiwiZnJhZ0RlcHRoIiwiZHJhd0J1ZmZlcnMiLCJzaGFkZXJUZXh0dXJlTE9EIiwiZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyIsImluZGV4MEF0dHJpYnV0ZU5hbWUiLCJ1bmlmb3Jtc05lZWRVcGRhdGUiLCJmaWxtR2F1Z2UiLCJmaWxtT2Zmc2V0IiwidXBkYXRlUHJvamVjdGlvbk1hdHJpeCIsImlzU2hhZGVyTWF0ZXJpYWwiLCJpc1BlcnNwZWN0aXZlQ2FtZXJhIiwic2V0Rm9jYWxMZW5ndGgiLCJmb2NhbExlbmd0aCIsInZFeHRlbnRTbG9wZSIsImdldEZpbG1IZWlnaHQiLCJnZXRGb2NhbExlbmd0aCIsImdldEVmZmVjdGl2ZUZPViIsImdldEZpbG1XaWR0aCIsInNldFZpZXdPZmZzZXQiLCJmdWxsV2lkdGgiLCJmdWxsSGVpZ2h0IiwiY2xlYXJWaWV3T2Zmc2V0Iiwic2tldyIsIkN1YmVDYW1lcmEiLCJjdWJlUmVzb2x1dGlvbiIsImNhbWVyYVBYIiwiY2FtZXJhTlgiLCJjYW1lcmFQWSIsImNhbWVyYU5ZIiwiY2FtZXJhUFoiLCJjYW1lcmFOWiIsInJlbmRlclRhcmdldCIsIldlYkdMQ3ViZVJlbmRlclRhcmdldCIsImN1cnJlbnRSZW5kZXJUYXJnZXQiLCJnZXRSZW5kZXJUYXJnZXQiLCJzZXRSZW5kZXJUYXJnZXQiLCJEYXRhVGV4dHVyZSIsImlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IiwiZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUiLCJ0RXF1aXJlY3QiLCJpc0RhdGFUZXh0dXJlIiwiX3NwaGVyZSQxIiwiX3ZlY3RvciQ1IiwiRnJ1c3R1bSIsInA1IiwicGxhbmVzIiwic2V0RnJvbVByb2plY3Rpb25NYXRyaXgiLCJtZTAiLCJtZTEiLCJtZTIiLCJtZTMiLCJtZTQiLCJtZTUiLCJtZTYiLCJtZTciLCJtZTgiLCJtZTkiLCJtZTEwIiwibWUxMSIsIm1lMTIiLCJtZTEzIiwibWUxNCIsIm1lMTUiLCJpbnRlcnNlY3RzT2JqZWN0IiwiaW50ZXJzZWN0c1Nwcml0ZSIsIm5lZ1JhZGl1cyIsIlVuaWZvcm1zTGliIiwiZGlmZnVzZSIsInV2VHJhbnNmb3JtIiwidXYyVHJhbnNmb3JtIiwic3BlY3VsYXJtYXAiLCJlbnZtYXAiLCJmbGlwRW52TWFwIiwibWF4TWlwTGV2ZWwiLCJhb21hcCIsImxpZ2h0bWFwIiwiZW1pc3NpdmVtYXAiLCJidW1wbWFwIiwibm9ybWFsbWFwIiwiZGlzcGxhY2VtZW50bWFwIiwicm91Z2huZXNzbWFwIiwibWV0YWxuZXNzbWFwIiwiZ3JhZGllbnRtYXAiLCJmb2dEZW5zaXR5IiwiZm9nTmVhciIsImZvZ0ZhciIsImZvZ0NvbG9yIiwiYW1iaWVudExpZ2h0Q29sb3IiLCJsaWdodFByb2JlIiwiZGlyZWN0aW9uYWxMaWdodHMiLCJkaXJlY3Rpb25hbExpZ2h0U2hhZG93cyIsInNoYWRvd0JpYXMiLCJzaGFkb3dSYWRpdXMiLCJzaGFkb3dNYXBTaXplIiwiZGlyZWN0aW9uYWxTaGFkb3dNYXAiLCJkaXJlY3Rpb25hbFNoYWRvd01hdHJpeCIsInNwb3RMaWdodHMiLCJjb25lQ29zIiwicGVudW1icmFDb3MiLCJkZWNheSIsInNwb3RMaWdodFNoYWRvd3MiLCJzcG90U2hhZG93TWFwIiwic3BvdFNoYWRvd01hdHJpeCIsInBvaW50TGlnaHRzIiwicG9pbnRMaWdodFNoYWRvd3MiLCJzaGFkb3dDYW1lcmFOZWFyIiwic2hhZG93Q2FtZXJhRmFyIiwicG9pbnRTaGFkb3dNYXAiLCJwb2ludFNoYWRvd01hdHJpeCIsImhlbWlzcGhlcmVMaWdodHMiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwicmVjdEFyZWFMaWdodHMiLCJXZWJHTEFuaW1hdGlvbiIsImlzQW5pbWF0aW5nIiwiYW5pbWF0aW9uTG9vcCIsIm9uQW5pbWF0aW9uRnJhbWUiLCJzZXRBbmltYXRpb25Mb29wIiwiV2ViR0xBdHRyaWJ1dGVzIiwiY2FwYWJpbGl0aWVzIiwiaXNXZWJHTDIiLCJidWZmZXJzIiwiaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSIsImJ1ZmZlclR5cGUiLCJieXRlc1BlckVsZW1lbnQiLCJ1cGRhdGVCdWZmZXIiLCJQbGFuZUdlb21ldHJ5IiwiUGxhbmVCdWZmZXJHZW9tZXRyeSIsIndpZHRoX2hhbGYiLCJoZWlnaHRfaGFsZiIsInNlZ21lbnRfd2lkdGgiLCJzZWdtZW50X2hlaWdodCIsIlNoYWRlckNodW5rIiwiYWxwaGFtYXBfZnJhZ21lbnQiLCJhbHBoYW1hcF9wYXJzX2ZyYWdtZW50IiwiYWxwaGF0ZXN0X2ZyYWdtZW50IiwiYW9tYXBfZnJhZ21lbnQiLCJhb21hcF9wYXJzX2ZyYWdtZW50IiwiYmVnaW5fdmVydGV4IiwiYmVnaW5ub3JtYWxfdmVydGV4IiwiYnNkZnMiLCJidW1wbWFwX3BhcnNfZnJhZ21lbnQiLCJjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQiLCJjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCIsImNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCIsImNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgiLCJjb2xvcl9mcmFnbWVudCIsImNvbG9yX3BhcnNfZnJhZ21lbnQiLCJjb2xvcl9wYXJzX3ZlcnRleCIsImNvbG9yX3ZlcnRleCIsImN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCIsImRlZmF1bHRub3JtYWxfdmVydGV4IiwiZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4IiwiZGlzcGxhY2VtZW50bWFwX3ZlcnRleCIsImVtaXNzaXZlbWFwX2ZyYWdtZW50IiwiZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCIsImVuY29kaW5nc19mcmFnbWVudCIsImVuY29kaW5nc19wYXJzX2ZyYWdtZW50IiwiZW52bWFwX2ZyYWdtZW50IiwiZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50IiwiZW52bWFwX3BhcnNfZnJhZ21lbnQiLCJlbnZtYXBfcGFyc192ZXJ0ZXgiLCJlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudCIsImVudm1hcF92ZXJ0ZXgiLCJmb2dfdmVydGV4IiwiZm9nX3BhcnNfdmVydGV4IiwiZm9nX2ZyYWdtZW50IiwiZm9nX3BhcnNfZnJhZ21lbnQiLCJncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRtYXBfZnJhZ21lbnQiLCJsaWdodG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2xhbWJlcnRfdmVydGV4IiwibGlnaHRzX3BhcnNfYmVnaW4iLCJsaWdodHNfdG9vbl9mcmFnbWVudCIsImxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQiLCJsaWdodHNfcGhvbmdfZnJhZ21lbnQiLCJsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2ZyYWdtZW50X2JlZ2luIiwibGlnaHRzX2ZyYWdtZW50X21hcHMiLCJsaWdodHNfZnJhZ21lbnRfZW5kIiwibG9nZGVwdGhidWZfZnJhZ21lbnQiLCJsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50IiwibG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgiLCJsb2dkZXB0aGJ1Zl92ZXJ0ZXgiLCJtYXBfZnJhZ21lbnQiLCJtYXBfcGFyc19mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQiLCJtb3JwaG5vcm1hbF92ZXJ0ZXgiLCJtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCIsIm1vcnBodGFyZ2V0X3ZlcnRleCIsIm5vcm1hbF9mcmFnbWVudF9iZWdpbiIsIm5vcm1hbF9mcmFnbWVudF9tYXBzIiwibm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQiLCJjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luIiwiY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzIiwiY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQiLCJwYWNraW5nIiwicHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCIsInByb2plY3RfdmVydGV4IiwiZGl0aGVyaW5nX2ZyYWdtZW50IiwiZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCIsInNoYWRvd21hcF9wYXJzX2ZyYWdtZW50Iiwic2hhZG93bWFwX3BhcnNfdmVydGV4Iiwic2hhZG93bWFwX3ZlcnRleCIsInNoYWRvd21hc2tfcGFyc19mcmFnbWVudCIsInNraW5iYXNlX3ZlcnRleCIsInNraW5uaW5nX3BhcnNfdmVydGV4Iiwic2tpbm5pbmdfdmVydGV4Iiwic2tpbm5vcm1hbF92ZXJ0ZXgiLCJzcGVjdWxhcm1hcF9mcmFnbWVudCIsInNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQiLCJ0b25lbWFwcGluZ19mcmFnbWVudCIsInRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQiLCJ1dl9wYXJzX2ZyYWdtZW50IiwidXZfcGFyc192ZXJ0ZXgiLCJ1dl92ZXJ0ZXgiLCJ1djJfcGFyc19mcmFnbWVudCIsInV2Ml9wYXJzX3ZlcnRleCIsInV2Ml92ZXJ0ZXgiLCJ3b3JsZHBvc192ZXJ0ZXgiLCJiYWNrZ3JvdW5kX2ZyYWciLCJiYWNrZ3JvdW5kX3ZlcnQiLCJjdWJlX2ZyYWciLCJjdWJlX3ZlcnQiLCJkZXB0aF9mcmFnIiwiZGVwdGhfdmVydCIsImRpc3RhbmNlUkdCQV9mcmFnIiwiZGlzdGFuY2VSR0JBX3ZlcnQiLCJlcXVpcmVjdF9mcmFnIiwiZXF1aXJlY3RfdmVydCIsImxpbmVkYXNoZWRfZnJhZyIsImxpbmVkYXNoZWRfdmVydCIsIm1lc2hiYXNpY19mcmFnIiwibWVzaGJhc2ljX3ZlcnQiLCJtZXNobGFtYmVydF9mcmFnIiwibWVzaGxhbWJlcnRfdmVydCIsIm1lc2htYXRjYXBfZnJhZyIsIm1lc2htYXRjYXBfdmVydCIsIm1lc2h0b29uX2ZyYWciLCJtZXNodG9vbl92ZXJ0IiwibWVzaHBob25nX2ZyYWciLCJtZXNocGhvbmdfdmVydCIsIm1lc2hwaHlzaWNhbF9mcmFnIiwibWVzaHBoeXNpY2FsX3ZlcnQiLCJub3JtYWxfZnJhZyIsIm5vcm1hbF92ZXJ0IiwicG9pbnRzX2ZyYWciLCJwb2ludHNfdmVydCIsInNoYWRvd19mcmFnIiwic2hhZG93X3ZlcnQiLCJzcHJpdGVfZnJhZyIsInNwcml0ZV92ZXJ0IiwiU2hhZGVyTGliIiwiYmFzaWMiLCJsYW1iZXJ0IiwicGhvbmciLCJzdGFuZGFyZCIsInRvb24iLCJkYXNoZWQiLCJ0b3RhbFNpemUiLCJ0MkQiLCJjdWJlIiwiZXF1aXJlY3QiLCJkaXN0YW5jZVJHQkEiLCJyZWZlcmVuY2VQb3NpdGlvbiIsIm5lYXJEaXN0YW5jZSIsImZhckRpc3RhbmNlIiwic2hhZG93IiwiV2ViR0xCYWNrZ3JvdW5kIiwicGxhbmVNZXNoIiwiYm94TWVzaCIsImN1cnJlbnRCYWNrZ3JvdW5kIiwiY3VycmVudEJhY2tncm91bmRWZXJzaW9uIiwiY3VycmVudFRvbmVtYXBwaW5nIiwic2V0Q2xlYXIiLCJnZXRDbGVhckNvbG9yIiwic2V0Q2xlYXJDb2xvciIsImdldENsZWFyQWxwaGEiLCJzZXRDbGVhckFscGhhIiwiZm9yY2VDbGVhciIsInhyIiwic2Vzc2lvbiIsImdldFNlc3Npb24iLCJlbnZpcm9ubWVudEJsZW5kTW9kZSIsImF1dG9DbGVhciIsImF1dG9DbGVhckNvbG9yIiwiYXV0b0NsZWFyRGVwdGgiLCJhdXRvQ2xlYXJTdGVuY2lsIiwiaXNDdWJlVGV4dHVyZSIsInRvbmVNYXBwaW5nIiwiV2ViR0xCdWZmZXJSZW5kZXJlciIsInNldE1vZGUiLCJyZW5kZXJJbnN0YW5jZXMiLCJwcmltY291bnQiLCJXZWJHTENhcGFiaWxpdGllcyIsIm1heEFuaXNvdHJvcHkiLCJnZXRNYXhQcmVjaXNpb24iLCJnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQiLCJXZWJHTDJSZW5kZXJpbmdDb250ZXh0IiwiV2ViR0wyQ29tcHV0ZVJlbmRlcmluZ0NvbnRleHQiLCJtYXhQcmVjaXNpb24iLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwibWF4VmVydGV4VGV4dHVyZXMiLCJtYXhDdWJlbWFwU2l6ZSIsIm1heEF0dHJpYnV0ZXMiLCJtYXhWZXJ0ZXhVbmlmb3JtcyIsIm1heFZhcnlpbmdzIiwibWF4RnJhZ21lbnRVbmlmb3JtcyIsInZlcnRleFRleHR1cmVzIiwiZmxvYXRGcmFnbWVudFRleHR1cmVzIiwiZ2V0TWF4QW5pc290cm9weSIsIk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCIsImZsb2F0VmVydGV4VGV4dHVyZXMiLCJtYXhTYW1wbGVzIiwiV2ViR0xDbGlwcGluZyIsImdsb2JhbFN0YXRlIiwibnVtR2xvYmFsUGxhbmVzIiwibG9jYWxDbGlwcGluZ0VuYWJsZWQiLCJyZW5kZXJpbmdTaGFkb3dzIiwidmlld05vcm1hbE1hdHJpeCIsInJlc2V0R2xvYmFsU3RhdGUiLCJudW1QbGFuZXMiLCJudW1JbnRlcnNlY3Rpb24iLCJwcm9qZWN0UGxhbmVzIiwic2tpcFRyYW5zZm9ybSIsIm5QbGFuZXMiLCJkc3RBcnJheSIsImZsYXRTaXplIiwiaTQiLCJlbmFibGVMb2NhbENsaXBwaW5nIiwiYmVnaW5TaGFkb3dzIiwiZW5kU2hhZG93cyIsImZyb21DYWNoZSIsIm5HbG9iYWwiLCJsR2xvYmFsIiwiY2xpcHBpbmdTdGF0ZSIsIldlYkdMRXh0ZW5zaW9ucyIsIldlYkdMR2VvbWV0cmllcyIsIndpcmVmcmFtZUF0dHJpYnV0ZXMiLCJvbkdlb21ldHJ5RGlzcG9zZSIsImJ1ZmZlcmdlb21ldHJ5IiwidXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlIiwiZ2VvbWV0cnlJbmRleCIsImdlb21ldHJ5UG9zaXRpb24iLCJwcmV2aW91c0F0dHJpYnV0ZSIsIl9idWZmZXJHZW9tZXRyeSIsImdlb21ldHJ5QXR0cmlidXRlcyIsImdldFdpcmVmcmFtZUF0dHJpYnV0ZSIsImN1cnJlbnRBdHRyaWJ1dGUiLCJXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciIsImRyYXdFbGVtZW50cyIsIldlYkdMSW5mbyIsImNhbGxzIiwicHJvZ3JhbXMiLCJhdXRvUmVzZXQiLCJpbnN0YW5jZUNvdW50IiwiYWJzTnVtZXJpY2FsU29ydCIsIldlYkdMTW9ycGh0YXJnZXRzIiwiaW5mbHVlbmNlc0xpc3QiLCJvYmplY3RJbmZsdWVuY2VzIiwiaW5mbHVlbmNlcyIsIm1vcnBoSW5mbHVlbmNlc1N1bSIsIm1vcnBoQmFzZUluZmx1ZW5jZSIsImdldFVuaWZvcm1zIiwiV2ViR0xPYmplY3RzIiwidXBkYXRlTWFwIiwiQ3ViZVRleHR1cmUiLCJEYXRhVGV4dHVyZTJEQXJyYXkiLCJ3cmFwUiIsIkRhdGFUZXh0dXJlM0QiLCJwaHlzaWNhbCIsInRyYW5zcGFyZW5jeSIsImlzRGF0YVRleHR1cmUyREFycmF5IiwiaXNEYXRhVGV4dHVyZTNEIiwiZW1wdHlUZXh0dXJlIiwiZW1wdHlUZXh0dXJlMmRBcnJheSIsImVtcHR5VGV4dHVyZTNkIiwiZW1wdHlDdWJlVGV4dHVyZSIsImFycmF5Q2FjaGVGMzIiLCJhcnJheUNhY2hlSTMyIiwibWF0NGFycmF5IiwibWF0M2FycmF5IiwibWF0MmFycmF5IiwibkJsb2NrcyIsImJsb2NrU2l6ZSIsImZpcnN0RWxlbSIsImFycmF5c0VxdWFsIiwiYWxsb2NUZXhVbml0cyIsImFsbG9jYXRlVGV4dHVyZVVuaXQiLCJzZXRWYWx1ZVYxZiIsImFkZHIiLCJzZXRWYWx1ZVYyZiIsInNldFZhbHVlVjNmIiwic2V0VmFsdWVWNGYiLCJzZXRWYWx1ZU0yIiwic2V0VmFsdWVNMyIsInNldFZhbHVlTTQiLCJzZXRWYWx1ZVQxIiwic2FmZVNldFRleHR1cmUyRCIsInNldFZhbHVlVDJEQXJyYXkxIiwic2V0VGV4dHVyZTJEQXJyYXkiLCJzZXRWYWx1ZVQzRDEiLCJzZXRUZXh0dXJlM0QiLCJzZXRWYWx1ZVQ2Iiwic2FmZVNldFRleHR1cmVDdWJlIiwic2V0VmFsdWVWMWkiLCJzZXRWYWx1ZVYyaSIsInNldFZhbHVlVjNpIiwic2V0VmFsdWVWNGkiLCJzZXRWYWx1ZVYxdWkiLCJ1bmlmb3JtMXVpIiwic2V0VmFsdWVWMWZBcnJheSIsInNldFZhbHVlVjFpQXJyYXkiLCJzZXRWYWx1ZVYyaUFycmF5Iiwic2V0VmFsdWVWM2lBcnJheSIsInNldFZhbHVlVjRpQXJyYXkiLCJzZXRWYWx1ZVYyZkFycmF5Iiwic2V0VmFsdWVWM2ZBcnJheSIsInNldFZhbHVlVjRmQXJyYXkiLCJzZXRWYWx1ZU0yQXJyYXkiLCJzZXRWYWx1ZU0zQXJyYXkiLCJzZXRWYWx1ZU00QXJyYXkiLCJzZXRWYWx1ZVQxQXJyYXkiLCJzZXRWYWx1ZVQ2QXJyYXkiLCJTaW5nbGVVbmlmb3JtIiwiYWN0aXZlSW5mbyIsImdldFNpbmd1bGFyU2V0dGVyIiwiUHVyZUFycmF5VW5pZm9ybSIsImdldFB1cmVBcnJheVNldHRlciIsIlN0cnVjdHVyZWRVbmlmb3JtIiwic2VxIiwidXBkYXRlQ2FjaGUiLCJSZVBhdGhQYXJ0IiwiYWRkVW5pZm9ybSIsInVuaWZvcm1PYmplY3QiLCJwYXJzZVVuaWZvcm0iLCJtYXRjaEVuZCIsImlkSXNJbmRleCIsInN1YnNjcmlwdCIsIldlYkdMVW5pZm9ybXMiLCJnZXRBY3RpdmVVbmlmb3JtIiwiV2ViR0xTaGFkZXIiLCJzZXRPcHRpb25hbCIsInNlcVdpdGhWYWx1ZSIsInByb2dyYW1JZENvdW50IiwiZ2V0RW5jb2RpbmdDb21wb25lbnRzIiwiZ2V0U2hhZGVyRXJyb3JzIiwiYWRkTGluZU51bWJlcnMiLCJnZXRTaGFkZXJTb3VyY2UiLCJnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24iLCJnZXRUb25lTWFwcGluZ0Z1bmN0aW9uIiwidG9uZU1hcHBpbmdOYW1lIiwiZmlsdGVyRW1wdHlMaW5lIiwicmVwbGFjZUxpZ2h0TnVtcyIsIm51bURpckxpZ2h0cyIsIm51bVNwb3RMaWdodHMiLCJudW1SZWN0QXJlYUxpZ2h0cyIsIm51bVBvaW50TGlnaHRzIiwibnVtSGVtaUxpZ2h0cyIsIm51bURpckxpZ2h0U2hhZG93cyIsIm51bVNwb3RMaWdodFNoYWRvd3MiLCJudW1Qb2ludExpZ2h0U2hhZG93cyIsInJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyIsIm51bUNsaXBwaW5nUGxhbmVzIiwibnVtQ2xpcEludGVyc2VjdGlvbiIsImluY2x1ZGVQYXR0ZXJuIiwicmVzb2x2ZUluY2x1ZGVzIiwiaW5jbHVkZVJlcGxhY2VyIiwiaW5jbHVkZSIsImRlcHJlY2F0ZWRVbnJvbGxMb29wUGF0dGVybiIsInVucm9sbExvb3BQYXR0ZXJuIiwidW5yb2xsTG9vcHMiLCJsb29wUmVwbGFjZXIiLCJkZXByZWNhdGVkTG9vcFJlcGxhY2VyIiwic25pcHBldCIsImdlbmVyYXRlUHJlY2lzaW9uIiwicHJlY2lzaW9uc3RyaW5nIiwiV2ViR0xQcm9ncmFtIiwiY2FjaGVLZXkiLCJwcmVmaXhWZXJ0ZXgiLCJwcmVmaXhGcmFnbWVudCIsInNoYWRvd01hcFR5cGVEZWZpbmUiLCJzaGFkb3dNYXBUeXBlIiwiZ2VuZXJhdGVTaGFkb3dNYXBUeXBlRGVmaW5lIiwiZW52TWFwVHlwZURlZmluZSIsImVudk1hcE1vZGUiLCJnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUiLCJlbnZNYXBNb2RlRGVmaW5lIiwiZ2VuZXJhdGVFbnZNYXBNb2RlRGVmaW5lIiwiZW52TWFwQmxlbmRpbmdEZWZpbmUiLCJnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lIiwiZ2FtbWFGYWN0b3JEZWZpbmUiLCJjdXN0b21FeHRlbnNpb25zIiwiZXh0ZW5zaW9uRGVyaXZhdGl2ZXMiLCJlbnZNYXBDdWJlVVYiLCJ0YW5nZW50U3BhY2VOb3JtYWxNYXAiLCJzaGFkZXJJRCIsImV4dGVuc2lvbkZyYWdEZXB0aCIsInJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoIiwiZXh0ZW5zaW9uRHJhd0J1ZmZlcnMiLCJyZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzIiwiZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRCIsInJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZCIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImN1c3RvbURlZmluZXMiLCJnZW5lcmF0ZURlZmluZXMiLCJpc1Jhd1NoYWRlck1hdGVyaWFsIiwic2hhZGVyTmFtZSIsImluc3RhbmNpbmciLCJzdXBwb3J0c1ZlcnRleFRleHR1cmVzIiwibWF4Qm9uZXMiLCJ1c2VGb2ciLCJmb2dFeHAyIiwib2JqZWN0U3BhY2VOb3JtYWxNYXAiLCJ2ZXJ0ZXhUYW5nZW50cyIsInV2c1ZlcnRleE9ubHkiLCJ1c2VWZXJ0ZXhUZXh0dXJlIiwiZG91YmxlU2lkZWQiLCJmbGlwU2lkZWQiLCJzaGFkb3dNYXBFbmFibGVkIiwicGh5c2ljYWxseUNvcnJlY3RMaWdodHMiLCJvdXRwdXRFbmNvZGluZyIsIm1hcEVuY29kaW5nIiwibWF0Y2FwRW5jb2RpbmciLCJlbnZNYXBFbmNvZGluZyIsImVtaXNzaXZlTWFwRW5jb2RpbmciLCJsaWdodE1hcEVuY29kaW5nIiwiZGVwdGhQYWNraW5nIiwiaXNHTFNMM1NoYWRlck1hdGVyaWFsIiwidmVyc2lvblJlZ2V4IiwiY2FjaGVkVW5pZm9ybXMiLCJjYWNoZWRBdHRyaWJ1dGVzIiwiZnJhZ21lbnRHbHNsIiwiZ2xWZXJ0ZXhTaGFkZXIiLCJnbEZyYWdtZW50U2hhZGVyIiwiYmluZEF0dHJpYkxvY2F0aW9uIiwiY2hlY2tTaGFkZXJFcnJvcnMiLCJwcm9ncmFtTG9nIiwidmVydGV4TG9nIiwiZnJhZ21lbnRMb2ciLCJydW5uYWJsZSIsImhhdmVEaWFnbm9zdGljcyIsInZlcnRleEVycm9ycyIsImZyYWdtZW50RXJyb3JzIiwiZ2V0RXJyb3IiLCJkaWFnbm9zdGljcyIsImRldGFjaFNoYWRlciIsImRlbGV0ZVNoYWRlciIsImdldEF0dHJpYnV0ZXMiLCJnZXRBY3RpdmVBdHRyaWIiLCJmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyIsInVzZWRUaW1lcyIsIldlYkdMUHJvZ3JhbXMiLCJzaGFkZXJJRHMiLCJNZXNoRGVwdGhNYXRlcmlhbCIsIk1lc2hEaXN0YW5jZU1hdGVyaWFsIiwiTWVzaE5vcm1hbE1hdGVyaWFsIiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsIk1lc2hQaG9uZ01hdGVyaWFsIiwiTWVzaFRvb25NYXRlcmlhbCIsIk1lc2hTdGFuZGFyZE1hdGVyaWFsIiwiTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCJNZXNoTWF0Y2FwTWF0ZXJpYWwiLCJMaW5lQmFzaWNNYXRlcmlhbCIsIkxpbmVEYXNoZWRNYXRlcmlhbCIsIlBvaW50c01hdGVyaWFsIiwiU2hhZG93TWF0ZXJpYWwiLCJTcHJpdGVNYXRlcmlhbCIsInBhcmFtZXRlck5hbWVzIiwiZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCIsImdldFBhcmFtZXRlcnMiLCJzaGFkb3dzIiwibkNsaXBQbGFuZXMiLCJuQ2xpcEludGVyc2VjdGlvbiIsImlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLCJpc1NraW5uZWRNZXNoIiwiYm9uZXMiLCJza2VsZXRvbiIsIm5WZXJ0ZXhVbmlmb3JtcyIsIm5WZXJ0ZXhNYXRyaWNlcyIsImFsbG9jYXRlQm9uZXMiLCJzaGFkZXJvYmplY3QiLCJnZXRTaGFkZXJPYmplY3QiLCJpc0ZvZ0V4cDIiLCJtYXhNb3JwaFRhcmdldHMiLCJtYXhNb3JwaE5vcm1hbHMiLCJkaXJlY3Rpb25hbCIsInNwb3QiLCJyZWN0QXJlYSIsImhlbWkiLCJzaGFkb3dNYXAiLCJnZXRQcm9ncmFtQ2FjaGVLZXkiLCJhY3F1aXJlUHJvZ3JhbSIsInBsIiwicHJlZXhpc3RpbmdQcm9ncmFtIiwicmVsZWFzZVByb2dyYW0iLCJXZWJHTFByb3BlcnRpZXMiLCJwYWludGVyU29ydFN0YWJsZSIsImdyb3VwT3JkZXIiLCJyZXZlcnNlUGFpbnRlclNvcnRTdGFibGUiLCJXZWJHTFJlbmRlckxpc3QiLCJyZW5kZXJJdGVtcyIsInJlbmRlckl0ZW1zSW5kZXgiLCJvcGFxdWUiLCJkZWZhdWx0UHJvZ3JhbSIsImdldE5leHRSZW5kZXJJdGVtIiwicmVuZGVySXRlbSIsImN1c3RvbU9wYXF1ZVNvcnQiLCJjdXN0b21UcmFuc3BhcmVudFNvcnQiLCJXZWJHTFJlbmRlckxpc3RzIiwibGlzdHMiLCJvblNjZW5lRGlzcG9zZSIsIlVuaWZvcm1zQ2FjaGUiLCJuZXh0VmVyc2lvbiIsInNoYWRvd0Nhc3RpbmdMaWdodHNGaXJzdCIsImxpZ2h0QSIsImxpZ2h0QiIsIldlYkdMTGlnaHRzIiwic2hhZG93Q2FjaGUiLCJkaXJlY3Rpb25hbExlbmd0aCIsInBvaW50TGVuZ3RoIiwic3BvdExlbmd0aCIsInJlY3RBcmVhTGVuZ3RoIiwiaGVtaUxlbmd0aCIsIm51bURpcmVjdGlvbmFsU2hhZG93cyIsIm51bVBvaW50U2hhZG93cyIsIm51bVNwb3RTaGFkb3dzIiwiYW1iaWVudCIsInByb2JlIiwiZGlyZWN0aW9uYWxTaGFkb3ciLCJzcG90U2hhZG93IiwicG9pbnRTaGFkb3ciLCJ2ZWN0b3IzIiwibWF0cml4NDIiLCJpc0FtYmllbnRMaWdodCIsImlzTGlnaHRQcm9iZSIsInNoIiwiY29lZmZpY2llbnRzIiwiaXNEaXJlY3Rpb25hbExpZ2h0Iiwic2hhZG93VW5pZm9ybXMiLCJtYXBTaXplIiwiaXNTcG90TGlnaHQiLCJwZW51bWJyYSIsImlzUmVjdEFyZWFMaWdodCIsImlzUG9pbnRMaWdodCIsImlzSGVtaXNwaGVyZUxpZ2h0IiwiV2ViR0xSZW5kZXJTdGF0ZSIsImxpZ2h0c0FycmF5Iiwic2hhZG93c0FycmF5Iiwic2V0dXBMaWdodHMiLCJwdXNoTGlnaHQiLCJwdXNoU2hhZG93Iiwic2hhZG93TGlnaHQiLCJXZWJHTFJlbmRlclN0YXRlcyIsInJlbmRlclN0YXRlcyIsInJlbmRlclN0YXRlIiwiaXNNZXNoRGVwdGhNYXRlcmlhbCIsImlzTWVzaERpc3RhbmNlTWF0ZXJpYWwiLCJXZWJHTFNoYWRvd01hcCIsIl9yZW5kZXJlciIsIl9vYmplY3RzIiwiX2ZydXN0dW0iLCJfc2hhZG93TWFwU2l6ZSIsIl92aWV3cG9ydFNpemUiLCJfdmlld3BvcnQiLCJfZGVwdGhNYXRlcmlhbHMiLCJfZGlzdGFuY2VNYXRlcmlhbHMiLCJfbWF0ZXJpYWxDYWNoZSIsInNoYWRvd01hdGVyaWFsVmVydGljYWwiLCJTQU1QTEVfUkFURSIsIkhBTEZfU0FNUExFX1JBVEUiLCJzaGFkb3dfcGFzcyIsInNoYWRvd01hdGVyaWFsSG9yaXpvbmFsIiwiSE9SSVpPTkFMX1BBU1MiLCJmdWxsU2NyZWVuVHJpIiwiZnVsbFNjcmVlbk1lc2giLCJWU01QYXNzIiwibWFwUGFzcyIsInJlbmRlckJ1ZmZlckRpcmVjdCIsImdldERlcHRoTWF0ZXJpYWxWYXJpYW50IiwidXNlTW9ycGhpbmciLCJ1c2VTa2lubmluZyIsInVzZUluc3RhbmNpbmciLCJnZXREaXN0YW5jZU1hdGVyaWFsVmFyaWFudCIsImdldERlcHRoTWF0ZXJpYWwiLCJnZXRNYXRlcmlhbFZhcmlhbnQiLCJjdXN0b21NYXRlcmlhbCIsImN1c3RvbURlcHRoTWF0ZXJpYWwiLCJjdXN0b21EaXN0YW5jZU1hdGVyaWFsIiwibWF0ZXJpYWxzRm9yVmFyaWFudCIsImNhY2hlZE1hdGVyaWFsIiwicmVuZGVyT2JqZWN0Iiwic2hhZG93Q2FtZXJhIiwiZGVwdGhNYXRlcmlhbCIsImFjdGl2ZUN1YmVGYWNlIiwiZ2V0QWN0aXZlQ3ViZUZhY2UiLCJhY3RpdmVNaXBtYXBMZXZlbCIsImdldEFjdGl2ZU1pcG1hcExldmVsIiwiX3N0YXRlIiwic2V0QmxlbmRpbmciLCJzZXRUZXN0Iiwic2V0U2Npc3NvclRlc3QiLCJzaGFkb3dGcmFtZUV4dGVudHMiLCJnZXRGcmFtZUV4dGVudHMiLCJpc1BvaW50TGlnaHRTaGFkb3ciLCJwYXJzIiwidmlld3BvcnRDb3VudCIsImdldFZpZXdwb3J0Q291bnQiLCJ2cCIsImdldFZpZXdwb3J0IiwidXBkYXRlTWF0cmljZXMiLCJnZXRGcnVzdHVtIiwiV2ViR0xTdGF0ZSIsImNvbG9yQnVmZmVyIiwiY3VycmVudENvbG9yTWFzayIsImN1cnJlbnRDb2xvckNsZWFyIiwic2V0TG9ja2VkIiwiY3VycmVudERlcHRoTWFzayIsImN1cnJlbnREZXB0aEZ1bmMiLCJjdXJyZW50RGVwdGhDbGVhciIsImRlcHRoTWFzayIsInNldEZ1bmMiLCJjbGVhckRlcHRoIiwiY3VycmVudFN0ZW5jaWxNYXNrIiwiY3VycmVudFN0ZW5jaWxGdW5jIiwiY3VycmVudFN0ZW5jaWxSZWYiLCJjdXJyZW50U3RlbmNpbEZ1bmNNYXNrIiwiY3VycmVudFN0ZW5jaWxGYWlsIiwiY3VycmVudFN0ZW5jaWxaRmFpbCIsImN1cnJlbnRTdGVuY2lsWlBhc3MiLCJjdXJyZW50U3RlbmNpbENsZWFyIiwic3RlbmNpbFRlc3QiLCJzdGVuY2lsTWFzayIsInNldE9wIiwiY2xlYXJTdGVuY2lsIiwibWF4VmVydGV4QXR0cmlidXRlcyIsIm5ld0F0dHJpYnV0ZXMiLCJlbmFibGVkQXR0cmlidXRlcyIsImF0dHJpYnV0ZURpdmlzb3JzIiwiZW5hYmxlZENhcGFiaWxpdGllcyIsImN1cnJlbnRCbGVuZGluZ0VuYWJsZWQiLCJjdXJyZW50QmxlbmRpbmciLCJjdXJyZW50QmxlbmRFcXVhdGlvbiIsImN1cnJlbnRCbGVuZFNyYyIsImN1cnJlbnRCbGVuZERzdCIsImN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEiLCJjdXJyZW50QmxlbmRTcmNBbHBoYSIsImN1cnJlbnRCbGVuZERzdEFscGhhIiwiY3VycmVudFByZW11bHRpcGxlZEFscGhhIiwiY3VycmVudEZsaXBTaWRlZCIsImN1cnJlbnRDdWxsRmFjZSIsImN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yIiwiY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyIsImxpbmVXaWR0aEF2YWlsYWJsZSIsImdsVmVyc2lvbiIsImN1cnJlbnRUZXh0dXJlU2xvdCIsImN1cnJlbnRCb3VuZFRleHR1cmVzIiwiY3VycmVudFZpZXdwb3J0IiwiZW1wdHlUZXh0dXJlcyIsImVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IiLCJtZXNoUGVyQXR0cmlidXRlIiwic2V0RmxpcFNpZGVkIiwic2V0Q3VsbEZhY2UiLCJlcXVhdGlvblRvR0wiLCJNSU5fRVhUIiwiTUFYX0VYVCIsImZhY3RvclRvR0wiLCJibGVuZEVxdWF0aW9uU2VwYXJhdGUiLCJmcm9udEZhY2UiLCJjdWxsRmFjZSIsInNldFBvbHlnb25PZmZzZXQiLCJ3ZWJnbFNsb3QiLCJpbml0QXR0cmlidXRlcyIsImVuYWJsZUF0dHJpYnV0ZSIsImRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzIiwic2V0TWF0ZXJpYWwiLCJmcm9udEZhY2VDVyIsIndlYmdsVHlwZSIsIndlYmdsVGV4dHVyZSIsImJvdW5kVGV4dHVyZSIsInVuYmluZFRleHR1cmUiLCJjb21wcmVzc2VkVGV4SW1hZ2UyRCIsInRleEltYWdlM0QiLCJXZWJHTFRleHR1cmVzIiwiX2dsIiwidXRpbHMiLCJfdmlkZW9UZXh0dXJlcyIsInVzZU9mZnNjcmVlbkNhbnZhcyIsIk9mZnNjcmVlbkNhbnZhcyIsInJlc2l6ZUltYWdlIiwibmVlZHNQb3dlck9mVHdvIiwibmVlZHNOZXdDYW52YXMiLCJIVE1MSW1hZ2VFbGVtZW50IiwiSW1hZ2VCaXRtYXAiLCJ0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMiLCJzdXBwb3J0c01pcHMiLCJfX21heE1pcExldmVsIiwiZ2V0SW50ZXJuYWxGb3JtYXQiLCJpbnRlcm5hbEZvcm1hdE5hbWUiLCJnbEZvcm1hdCIsImdsVHlwZSIsImZpbHRlckZhbGxiYWNrIiwib25UZXh0dXJlRGlzcG9zZSIsInRleHR1cmVQcm9wZXJ0aWVzIiwiX193ZWJnbEluaXQiLCJfX3dlYmdsVGV4dHVyZSIsImRlYWxsb2NhdGVUZXh0dXJlIiwiaXNWaWRlb1RleHR1cmUiLCJvblJlbmRlclRhcmdldERpc3Bvc2UiLCJyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzIiwiX193ZWJnbEZyYW1lYnVmZmVyIiwiX193ZWJnbERlcHRoYnVmZmVyIiwiZGVsZXRlUmVuZGVyYnVmZmVyIiwiX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyIiwiX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyIiwiX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyIiwiZGVhbGxvY2F0ZVJlbmRlclRhcmdldCIsInRleHR1cmVVbml0cyIsInNsb3QiLCJfX3ZlcnNpb24iLCJ1cGxvYWRUZXh0dXJlIiwic2V0VGV4dHVyZUN1YmUiLCJpbml0VGV4dHVyZSIsImlzQ29tcHJlc3NlZCIsImlzQ29tcHJlc3NlZFRleHR1cmUiLCJjdWJlSW1hZ2UiLCJnbEludGVybmFsRm9ybWF0Iiwic2V0VGV4dHVyZVBhcmFtZXRlcnMiLCJtaXBtYXAiLCJtaXBtYXBJbWFnZSIsInNldFRleHR1cmVDdWJlRHluYW1pYyIsIndyYXBwaW5nVG9HTCIsImZpbHRlclRvR0wiLCJ0ZXh0dXJlVHlwZSIsIl9fY3VycmVudEFuaXNvdHJvcHkiLCJ0ZXhQYXJhbWV0ZXJmIiwiVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQiLCJ0ZXh0dXJlTmVlZHNQb3dlck9mVHdvIiwiaXNEZXB0aFRleHR1cmUiLCJzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSIsImF0dGFjaG1lbnQiLCJ0ZXh0dXJlVGFyZ2V0Iiwic2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlIiwicmVuZGVyYnVmZmVyIiwiaXNNdWx0aXNhbXBsZSIsImdldFJlbmRlclRhcmdldFNhbXBsZXMiLCJyZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUiLCJzZXR1cERlcHRoUmVuZGVyYnVmZmVyIiwiaXNDdWJlIiwid2ViZ2xEZXB0aFRleHR1cmUiLCJzZXR1cERlcHRoVGV4dHVyZSIsIndhcm5lZFRleHR1cmUyRCIsIndhcm5lZFRleHR1cmVDdWJlIiwicmVzZXRUZXh0dXJlVW5pdHMiLCJzZXR1cFJlbmRlclRhcmdldCIsInVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCIsInVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IiwiYmxpdEZyYW1lYnVmZmVyIiwiV2ViR0xVdGlscyIsIkhBTEZfRkxPQVRfT0VTIiwiQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCIsIkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUIiwiQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQiLCJDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCIsIkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyIsIkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wiLCJDT01QUkVTU0VEX1JHQjhfRVRDMiIsIkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUMiLCJVTlNJR05FRF9JTlRfMjRfOF9XRUJHTCIsIkFycmF5Q2FtZXJhIiwiV2ViWFJNYW5hZ2VyIiwiZnJhbWVidWZmZXJTY2FsZUZhY3RvciIsInJlZmVyZW5jZVNwYWNlIiwicmVmZXJlbmNlU3BhY2VUeXBlIiwicG9zZSIsImNvbnRyb2xsZXJzIiwiaW5wdXRTb3VyY2VzTWFwIiwiY2FtZXJhTCIsImNhbWVyYVIiLCJjYW1lcmFWUiIsIl9jdXJyZW50RGVwdGhOZWFyIiwiX2N1cnJlbnREZXB0aEZhciIsIm9uU2Vzc2lvbkV2ZW50IiwiaW5wdXRTb3VyY2UiLCJ0YXJnZXRSYXkiLCJncmlwIiwib25TZXNzaW9uRW5kIiwiaXNQcmVzZW50aW5nIiwib25SZXF1ZXN0UmVmZXJlbmNlU3BhY2UiLCJ1cGRhdGVJbnB1dFNvdXJjZXMiLCJpbnB1dFNvdXJjZXMiLCJhZGRlZCIsImdldENvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyR3JpcCIsInNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3IiLCJzZXRSZWZlcmVuY2VTcGFjZVR5cGUiLCJnZXRSZWZlcmVuY2VTcGFjZSIsInNldFNlc3Npb24iLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsImxheWVySW5pdCIsImJhc2VMYXllciIsIlhSV2ViR0xMYXllciIsInVwZGF0ZVJlbmRlclN0YXRlIiwicmVxdWVzdFJlZmVyZW5jZVNwYWNlIiwiY2FtZXJhTFBvcyIsImNhbWVyYVJQb3MiLCJ1cGRhdGVDYW1lcmEiLCJkZXB0aE5lYXIiLCJkZXB0aEZhciIsImlwZCIsInByb2pMIiwicHJvalIiLCJ0b3BGb3YiLCJib3R0b21Gb3YiLCJsZWZ0Rm92IiwicmlnaHRGb3YiLCJ6T2Zmc2V0IiwibmVhcjIiLCJmYXIyIiwibGVmdDIiLCJ0b3AyIiwiYm90dG9tMiIsInNldFByb2plY3Rpb25Gcm9tVW5pb24iLCJvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2siLCJnZXRWaWV3ZXJQb3NlIiwidmlld3MiLCJpbnB1dFBvc2UiLCJncmlwUG9zZSIsImdldFBvc2UiLCJ0YXJnZXRSYXlTcGFjZSIsImdyaXBTcGFjZSIsIl9zdGVuY2lsIiwiX2FudGlhbGlhcyIsIl9wcmVtdWx0aXBsaWVkQWxwaGEiLCJfcHJlc2VydmVEcmF3aW5nQnVmZmVyIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwiX3Bvd2VyUHJlZmVyZW5jZSIsIl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IiwiY3VycmVudFJlbmRlckxpc3QiLCJjdXJyZW50UmVuZGVyU3RhdGUiLCJkb21FbGVtZW50Iiwic29ydE9iamVjdHMiLCJ0b25lTWFwcGluZ0V4cG9zdXJlIiwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IiwicHJvZ3JhbUNhY2hlIiwicmVuZGVyTGlzdHMiLCJtb3JwaHRhcmdldHMiLCJidWZmZXJSZW5kZXJlciIsImluZGV4ZWRCdWZmZXJSZW5kZXJlciIsIl9pc0NvbnRleHRMb3N0IiwiX2ZyYW1lYnVmZmVyIiwiX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSIsIl9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwiLCJfY3VycmVudFJlbmRlclRhcmdldCIsIl9jdXJyZW50RnJhbWVidWZmZXIiLCJfY3VycmVudE1hdGVyaWFsSWQiLCJfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSIsIl9jdXJyZW50Q2FtZXJhIiwiX2N1cnJlbnRBcnJheUNhbWVyYSIsIl9jdXJyZW50Vmlld3BvcnQiLCJfY3VycmVudFNjaXNzb3IiLCJfY3VycmVudFNjaXNzb3JUZXN0IiwiX3BpeGVsUmF0aW8iLCJfb3BhcXVlU29ydCIsIl90cmFuc3BhcmVudFNvcnQiLCJfc2Npc3NvciIsIl9zY2lzc29yVGVzdCIsIl9jbGlwcGluZyIsIl9jbGlwcGluZ0VuYWJsZWQiLCJfbG9jYWxDbGlwcGluZ0VuYWJsZWQiLCJfcHJvalNjcmVlbk1hdHJpeCIsIl92ZWN0b3IzIiwiZ2V0VGFyZ2V0UGl4ZWxSYXRpbyIsImNvbnRleHRBdHRyaWJ1dGVzIiwieHJDb21wYXRpYmxlIiwib25Db250ZXh0TG9zdCIsIm9uQ29udGV4dFJlc3RvcmUiLCJpbml0R0xDb250ZXh0Iiwib25NYXRlcmlhbERpc3Bvc2UiLCJyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlIiwiZGVhbGxvY2F0ZU1hdGVyaWFsIiwicHJvZ3JhbUluZm8iLCJmb3JjZUNvbnRleHRMb3NzIiwibG9zZUNvbnRleHQiLCJmb3JjZUNvbnRleHRSZXN0b3JlIiwicmVzdG9yZUNvbnRleHQiLCJnZXRQaXhlbFJhdGlvIiwic2V0UGl4ZWxSYXRpbyIsInVwZGF0ZVN0eWxlIiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJzZXREcmF3aW5nQnVmZmVyU2l6ZSIsImdldEN1cnJlbnRWaWV3cG9ydCIsImdldFNjaXNzb3IiLCJnZXRTY2lzc29yVGVzdCIsImJvb2xlYW4iLCJzZXRPcGFxdWVTb3J0Iiwic2V0VHJhbnNwYXJlbnRTb3J0IiwiYml0cyIsInJlbmRlckJ1ZmZlckltbWVkaWF0ZSIsImhhc1Bvc2l0aW9ucyIsImhhc05vcm1hbHMiLCJoYXNVdnMiLCJoYXNDb2xvcnMiLCJwcm9ncmFtQXR0cmlidXRlcyIsInBvc2l0aW9uQXJyYXkiLCJub3JtYWxBcnJheSIsInV2QXJyYXkiLCJjb2xvckFycmF5IiwidXBkYXRlQnVmZmVycyIsInJhbmdlRmFjdG9yIiwiaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsIm1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyIsInByb2dyYW1BdHRyaWJ1dGUiLCJnZW9tZXRyeUF0dHJpYnV0ZSIsInN0cmlkZSIsImlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJtYXhJbnN0YW5jZWRDb3VudCIsImlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIiwidmVydGV4QXR0cmliMmZ2IiwidmVydGV4QXR0cmliM2Z2IiwidmVydGV4QXR0cmliNGZ2IiwidmVydGV4QXR0cmliMWZ2Iiwic2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzIiwiZGF0YUNvdW50IiwicmFuZ2VTdGFydCIsInJhbmdlQ291bnQiLCJkcmF3U3RhcnQiLCJkcmF3RW5kIiwiaXNMaW5lU2VnbWVudHMiLCJpc0xpbmVMb29wIiwiaXNTcHJpdGUiLCJpbml0TWF0ZXJpYWwiLCJwcm9qZWN0T2JqZWN0IiwiaXNHcm91cCIsImlzTE9EIiwiaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QiLCJyZW5kZXJPYmplY3RzIiwiaXNBcnJheUNhbWVyYSIsImNhbWVyYTIiLCJyZW5kZXJPYmplY3RJbW1lZGlhdGUiLCJtYXRlcmlhbFByb3BlcnRpZXMiLCJsaWdodHNTdGF0ZVZlcnNpb24iLCJwcm9ncmFtQ2FjaGVLZXkiLCJwcm9ncmFtQ2hhbmdlIiwibnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzIiwibnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzIiwibmVlZHNMaWdodHMiLCJpc01lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJpc01lc2hUb29uTWF0ZXJpYWwiLCJpc01lc2hQaG9uZ01hdGVyaWFsIiwiaXNTaGFkb3dNYXRlcmlhbCIsIm1hdGVyaWFsTmVlZHNMaWdodHMiLCJwcm9nVW5pZm9ybXMiLCJ1bmlmb3Jtc0xpc3QiLCJyZWZyZXNoUHJvZ3JhbSIsInJlZnJlc2hNYXRlcmlhbCIsInJlZnJlc2hMaWdodHMiLCJwX3VuaWZvcm1zIiwibV91bmlmb3JtcyIsInVDYW1Qb3MiLCJjYW1lcmFQb3NpdGlvbiIsImlzT3J0aG9ncmFwaGljQ2FtZXJhIiwiYm9uZVRleHR1cmUiLCJib25lTWF0cmljZXMiLCJib25lVGV4dHVyZVNpemUiLCJpc0ZvZyIsInJlZnJlc2hVbmlmb3Jtc0ZvZyIsInJlZnJlc2hVbmlmb3Jtc0NvbW1vbiIsInJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQiLCJyZWZyZXNoVW5pZm9ybXNUb29uIiwicmVmcmVzaFVuaWZvcm1zUGhvbmciLCJpc01lc2hQaHlzaWNhbE1hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQiLCJyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCIsImlzTWVzaE1hdGNhcE1hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zTWF0Y2FwIiwicmVmcmVzaFVuaWZvcm1zRGVwdGgiLCJyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSIsImlzTWVzaE5vcm1hbE1hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zTm9ybWFsIiwiaXNMaW5lQmFzaWNNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0xpbmUiLCJpc0xpbmVEYXNoZWRNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0Rhc2giLCJpc1BvaW50c01hdGVyaWFsIiwidXZTY2FsZU1hcCIsInJlZnJlc2hVbmlmb3Jtc1BvaW50cyIsImlzU3ByaXRlTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNTcHJpdGVzIiwibHRjXzEiLCJMVENfMSIsImx0Y18yIiwiTFRDXzIiLCJ1djJTY2FsZU1hcCIsIm9wYXF1ZU9iamVjdHMiLCJ0cmFuc3BhcmVudE9iamVjdHMiLCJyZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzIiwiYWN0aXZlQ3ViZUZhY2VJbmRleCIsInRleHR1cmVGb3JtYXQiLCJjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUiLCJsZXZlbFNjYWxlIiwiY29weVRleEltYWdlMkQiLCJjb3B5VGV4dHVyZVRvVGV4dHVyZSIsInNyY1RleHR1cmUiLCJ0ZXhTdWJJbWFnZTJEIiwiRm9nRXhwMiIsIkZvZyIsIkludGVybGVhdmVkQnVmZmVyIiwiaXNJbnRlcmxlYXZlZEJ1ZmZlciIsIl9nZW9tZXRyeSIsIl92ZWN0b3IkNiIsIkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIiwiaW50ZXJsZWF2ZWRCdWZmZXIiLCJfaW50ZXJzZWN0UG9pbnQiLCJfd29ybGRTY2FsZSIsIl9tdlBvc2l0aW9uIiwiX2FsaWduZWRQb3NpdGlvbiIsIl9yb3RhdGVkUG9zaXRpb24iLCJfdmlld1dvcmxkTWF0cml4IiwiX3ZBJDEiLCJfdkIkMSIsIl92QyQxIiwiX3V2QSQxIiwiX3V2QiQxIiwiX3V2QyQxIiwidHJhbnNmb3JtVmVydGV4IiwidmVydGV4UG9zaXRpb24iLCJtdlBvc2l0aW9uIiwiX3YxJDQiLCJfdjIkMiIsIkxPRCIsIl9jdXJyZW50TGV2ZWwiLCJsZXZlbHMiLCJTa2lubmVkTWVzaCIsImJpbmRNb2RlIiwiYmluZE1hdHJpeCIsImJpbmRNYXRyaXhJbnZlcnNlIiwiYWRkTGV2ZWwiLCJnZXRDdXJyZW50TGV2ZWwiLCJnZXRPYmplY3RGb3JEaXN0YW5jZSIsImNhbGN1bGF0ZUludmVyc2VzIiwibm9ybWFsaXplU2tpbldlaWdodHMiLCJza2luV2VpZ2h0IiwiX29mZnNldE1hdHJpeCIsIl9pZGVudGl0eU1hdHJpeCIsIlNrZWxldG9uIiwiYm9uZUludmVyc2VzIiwiQm9uZSIsImJvbmUiLCJpc0JvbmUiLCJnZXRCb25lQnlOYW1lIiwiX2luc3RhbmNlTG9jYWxNYXRyaXgiLCJfaW5zdGFuY2VXb3JsZE1hdHJpeCIsIl9pbnN0YW5jZUludGVyc2VjdHMiLCJfbWVzaCIsIkluc3RhbmNlZE1lc2giLCJsaW5lY2FwIiwibGluZWpvaW4iLCJnZXRNYXRyaXhBdCIsInJheWNhc3RUaW1lcyIsImluc3RhbmNlSWQiLCJzZXRNYXRyaXhBdCIsIl9lbmQiLCJfaW52ZXJzZU1hdHJpeCQxIiwiX3JheSQxIiwiX3NwaGVyZSQyIiwiY29tcHV0ZUxpbmVEaXN0YW5jZXMiLCJwb3NpdGlvbkF0dHJpYnV0ZSIsImxvY2FsVGhyZXNob2xkIiwibG9jYWxUaHJlc2hvbGRTcSIsInZTdGFydCIsInZFbmQiLCJpbnRlclNlZ21lbnQiLCJpbnRlclJheSIsIm5iVmVydGljZXMiLCJfc3RhcnQkMSIsIl9lbmQkMSIsIkxpbmVTZWdtZW50cyIsIkxpbmVMb29wIiwiX2ludmVyc2VNYXRyaXgkMiIsIl9yYXkkMiIsIl9zcGhlcmUkMyIsIl9wb3NpdGlvbiQxIiwiUG9pbnRzIiwidGVzdFBvaW50IiwicmF5UG9pbnREaXN0YW5jZVNxIiwiZGlzdGFuY2VUb1JheSIsIlZpZGVvVGV4dHVyZSIsIkNvbXByZXNzZWRUZXh0dXJlIiwiRGVwdGhUZXh0dXJlIiwiV2lyZWZyYW1lR2VvbWV0cnkiLCJvbCIsImVkZ2UxIiwiZWRnZTIiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJzbGljZXMiLCJzdGFja3MiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJFUFMiLCJwdSIsInNsaWNlQ291bnQiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJ1dkJ1ZmZlciIsInN1YmRpdmlkZUZhY2UiLCJjb2xzIiwiYWoiLCJiaiIsInB1c2hWZXJ0ZXgiLCJnZXRWZXJ0ZXhCeUluZGV4IiwiY29ycmVjdFVWIiwic3ViZGl2aWRlIiwiYXBwbHlSYWRpdXMiLCJjZW50cm9pZCIsInV2QSIsInV2QiIsInV2QyIsImF6aSIsImNvcnJlY3RVVnMiLCJjb3JyZWN0U2VhbSIsImdlbmVyYXRlVVZzIiwiVGV0cmFoZWRyb25HZW9tZXRyeSIsIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJPY3RhaGVkcm9uR2VvbWV0cnkiLCJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJJY29zYWhlZHJvbkdlb21ldHJ5IiwiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSIsIkRvZGVjYWhlZHJvbkdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJUdWJlR2VvbWV0cnkiLCJ0dWJ1bGFyU2VnbWVudHMiLCJyYWRpYWxTZWdtZW50cyIsInRhcGVyIiwiYnVmZmVyR2VvbWV0cnkiLCJUdWJlQnVmZmVyR2VvbWV0cnkiLCJ0YW5nZW50cyIsImJpbm9ybWFscyIsImNvbXB1dGVGcmVuZXRGcmFtZXMiLCJnZW5lcmF0ZVNlZ21lbnQiLCJnZW5lcmF0ZUluZGljZXMiLCJnZW5lcmF0ZUJ1ZmZlckRhdGEiLCJUb3J1c0tub3RHZW9tZXRyeSIsInR1YmUiLCJoZWlnaHRTY2FsZSIsIlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5IiwiY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlIiwiY3UiLCJzdSIsInF1T3ZlclAiLCJjcyIsIlRvcnVzR2VvbWV0cnkiLCJUb3J1c0J1ZmZlckdlb21ldHJ5IiwiSEFWRV9DVVJSRU5UX0RBVEEiLCJpc0NhbnZhc1RleHR1cmUiLCJTaGFwZVV0aWxzIiwiY29udG91ciIsImlzQ2xvY2tXaXNlIiwidHJpYW5ndWxhdGVTaGFwZSIsInJlbW92ZUR1cEVuZFB0cyIsImFkZENvbnRvdXIiLCJFeHRydWRlR2VvbWV0cnkiLCJFeHRydWRlQnVmZmVyR2VvbWV0cnkiLCJ2ZXJ0aWNlc0FycmF5IiwiYWRkU2hhcGUiLCJjdXJ2ZVNlZ21lbnRzIiwiYmV2ZWxFbmFibGVkIiwiYmV2ZWxUaGlja25lc3MiLCJiZXZlbFNpemUiLCJiZXZlbE9mZnNldCIsImJldmVsU2VnbWVudHMiLCJleHRydWRlUGF0aCIsInV2Z2VuIiwiVVZHZW5lcmF0b3IiLCJXb3JsZFVWR2VuZXJhdG9yIiwiZXh0cnVkZVB0cyIsInNwbGluZVR1YmUiLCJiaW5vcm1hbCIsInBvc2l0aW9uMiIsImFob2xlIiwiaGwiLCJleHRydWRlQnlQYXRoIiwic2hhcGVQb2ludHMiLCJleHRyYWN0UG9pbnRzIiwic2NhbGVQdDIiLCJwdCIsImJzIiwidmxlbiIsImZsZW4iLCJnZXRCZXZlbFZlYyIsImluUHQiLCJpblByZXYiLCJpbk5leHQiLCJ2X3RyYW5zX3giLCJ2X3RyYW5zX3kiLCJzaHJpbmtfYnkiLCJ2X3ByZXZfeCIsInZfcHJldl95Iiwidl9uZXh0X3giLCJ2X25leHRfeSIsInZfcHJldl9sZW5zcSIsImNvbGxpbmVhcjAiLCJ2X3ByZXZfbGVuIiwidl9uZXh0X2xlbiIsInB0UHJldlNoaWZ0X3giLCJwdFByZXZTaGlmdF95Iiwic2YiLCJ2X3RyYW5zX2xlbnNxIiwiZGlyZWN0aW9uX2VxIiwiY29udG91ck1vdmVtZW50cyIsIm9uZUhvbGVNb3ZlbWVudHMiLCJob2xlc01vdmVtZW50cyIsInZlcnRpY2VzTW92ZW1lbnRzIiwic2lkZXdhbGxzIiwibGF5ZXJvZmZzZXQiLCJzbCIsInNsZW4xIiwic2xlbjIiLCJmNCIsImYzIiwiYWRkVmVydGV4IiwiZ2VuZXJhdGVUb3BVViIsImFkZFVWIiwiZ2VuZXJhdGVTaWRlV2FsbFVWIiwidmVjdG9yMiIsImJ1aWxkTGlkRmFjZXMiLCJidWlsZFNpZGVGYWNlcyIsImluZGV4QyIsImFfeCIsImFfeSIsImJfeCIsImJfeSIsImNfeCIsImNfeSIsImluZGV4RCIsImFfeiIsImJfeiIsImNfeiIsImRfeCIsImRfeSIsImRfeiIsIlRleHRHZW9tZXRyeSIsIlRleHRCdWZmZXJHZW9tZXRyeSIsImlzRm9udCIsImdlbmVyYXRlU2hhcGVzIiwiU3BoZXJlR2VvbWV0cnkiLCJwaGlTdGFydCIsInBoaUxlbmd0aCIsInRoZXRhU3RhcnQiLCJ0aGV0YUxlbmd0aCIsIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IiwidGhldGFFbmQiLCJ2ZXJ0aWNlc1JvdyIsIlJpbmdHZW9tZXRyeSIsInRoZXRhU2VnbWVudHMiLCJwaGlTZWdtZW50cyIsIlJpbmdCdWZmZXJHZW9tZXRyeSIsInJhZGl1c1N0ZXAiLCJ0aGV0YVNlZ21lbnRMZXZlbCIsIkxhdGhlR2VvbWV0cnkiLCJMYXRoZUJ1ZmZlckdlb21ldHJ5IiwiaW52ZXJzZVNlZ21lbnRzIiwibjEiLCJuMiIsIlNoYXBlR2VvbWV0cnkiLCJTaGFwZUJ1ZmZlckdlb21ldHJ5Iiwic2hhcGVIb2xlIiwiaW5kZXhPZmZzZXQiLCJzaGFwZVZlcnRpY2VzIiwic2hhcGVIb2xlcyIsInRvSlNPTiQxIiwiRWRnZXNHZW9tZXRyeSIsInRocmVzaG9sZERvdCIsInNvdXJjZVZlcnRpY2VzIiwiZmFjZTEiLCJmYWNlMiIsIkN5bGluZGVyR2VvbWV0cnkiLCJyYWRpdXNUb3AiLCJyYWRpdXNCb3R0b20iLCJvcGVuRW5kZWQiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiaW5kZXhBcnJheSIsImdlbmVyYXRlQ2FwIiwiY2VudGVySW5kZXhTdGFydCIsImNlbnRlckluZGV4RW5kIiwiY29zVGhldGEiLCJzaW5UaGV0YSIsImluZGV4Um93IiwiZ2VuZXJhdGVUb3JzbyIsIkNvbmVHZW9tZXRyeSIsIkNvbmVCdWZmZXJHZW9tZXRyeSIsIkNpcmNsZUdlb21ldHJ5IiwiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiLCJHZW9tZXRyaWVzIiwiQm94R2VvbWV0cnkiLCJSYXdTaGFkZXJNYXRlcmlhbCIsIk1hdGVyaWFscyIsIkFuaW1hdGlvblV0aWxzIiwiYXJyYXlTbGljZSIsImNvbnZlcnRBcnJheSIsImZvcmNlQ2xvbmUiLCJnZXRLZXlmcmFtZU9yZGVyIiwidGltZXMiLCJzb3J0ZWRBcnJheSIsIm5WYWx1ZXMiLCJzcmNPZmZzZXQiLCJmbGF0dGVuSlNPTiIsImpzb25LZXlzIiwidmFsdWVQcm9wZXJ0eU5hbWUiLCJzdWJjbGlwIiwic291cmNlQ2xpcCIsInRyYWNrcyIsInRyYWNrIiwidmFsdWVTaXplIiwiZ2V0VmFsdWVTaXplIiwibWluU3RhcnRUaW1lIiwicmVzZXREdXJhdGlvbiIsIkludGVycG9sYW50IiwicGFyYW1ldGVyUG9zaXRpb25zIiwic2FtcGxlVmFsdWVzIiwic2FtcGxlU2l6ZSIsInJlc3VsdEJ1ZmZlciIsIl9jYWNoZWRJbmRleCIsIkN1YmljSW50ZXJwb2xhbnQiLCJfd2VpZ2h0UHJldiIsIl9vZmZzZXRQcmV2IiwiX3dlaWdodE5leHQiLCJfb2Zmc2V0TmV4dCIsIkxpbmVhckludGVycG9sYW50IiwiRGlzY3JldGVJbnRlcnBvbGFudCIsIktleWZyYW1lVHJhY2siLCJUaW1lQnVmZmVyVHlwZSIsIlZhbHVlQnVmZmVyVHlwZSIsInNldEludGVycG9sYXRpb24iLCJEZWZhdWx0SW50ZXJwb2xhdGlvbiIsIkJvb2xlYW5LZXlmcmFtZVRyYWNrIiwiQ29sb3JLZXlmcmFtZVRyYWNrIiwiTnVtYmVyS2V5ZnJhbWVUcmFjayIsIlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCIsIlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIiwiU3RyaW5nS2V5ZnJhbWVUcmFjayIsIlZlY3RvcktleWZyYW1lVHJhY2siLCJBbmltYXRpb25DbGlwIiwicGFyc2VLZXlmcmFtZVRyYWNrIiwidHJhY2tUeXBlIiwidHlwZU5hbWUiLCJnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lIiwicHAiLCJ2YWxpZGF0ZV9pbnRlcnZhbCIsImxpbmVhcl9zY2FuIiwiZm9yd2FyZF9zY2FuIiwiZ2l2ZVVwQXQiLCJhZnRlckVuZF8iLCJ0MWdsb2JhbCIsImJlZm9yZVN0YXJ0XyIsImludGVydmFsQ2hhbmdlZF8iLCJpbnRlcnBvbGF0ZV8iLCJEZWZhdWx0U2V0dGluZ3NfIiwiZ2V0U2V0dGluZ3NfIiwiY29weVNhbXBsZVZhbHVlXyIsImVuZGluZ1N0YXJ0IiwiZW5kaW5nRW5kIiwiaVByZXYiLCJpTmV4dCIsInRQcmV2IiwidE5leHQiLCJoYWxmRHQiLCJvMCIsIm9QIiwib04iLCJ3UCIsIndOIiwicHBwIiwic1AiLCJzTiIsIm9mZnNldDEiLCJvZmZzZXQwIiwid2VpZ2h0MSIsIndlaWdodDAiLCJnZXRJbnRlcnBvbGF0aW9uIiwiVmFsdWVUeXBlTmFtZSIsIkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoIiwiZmFjdG9yeU1ldGhvZCIsImNyZWF0ZUludGVycG9sYW50IiwidGltZU9mZnNldCIsIm5LZXlzIiwidmFsaWRhdGUiLCJwcmV2VGltZSIsImN1cnJUaW1lIiwib3B0aW1pemUiLCJzbW9vdGhJbnRlcnBvbGF0aW9uIiwid3JpdGVJbmRleCIsImtlZXAiLCJvZmZzZXRQIiwib2Zmc2V0TiIsInJlYWRPZmZzZXQiLCJ3cml0ZU9mZnNldCIsIlR5cGVkS2V5ZnJhbWVUcmFjayIsImpzb25UcmFja3MiLCJmcmFtZVRpbWUiLCJjbGlwVHJhY2tzIiwiQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UiLCJtb3JwaFRhcmdldFNlcXVlbmNlIiwibm9Mb29wIiwibnVtTW9ycGhUYXJnZXRzIiwiZmluZEJ5TmFtZSIsIm9iamVjdE9yQ2xpcEFycmF5IiwiY2xpcEFycmF5IiwiYW5pbWF0aW9ucyIsIkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzIiwiYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMiLCJhbmltYXRpb25Nb3JwaFRhcmdldHMiLCJjbGlwcyIsInBhcnNlQW5pbWF0aW9uIiwiYWRkTm9uZW1wdHlUcmFjayIsInRyYWNrTmFtZSIsImFuaW1hdGlvbktleXMiLCJwcm9wZXJ0eU5hbWUiLCJkZXN0VHJhY2tzIiwiY2xpcE5hbWUiLCJoaWVyYXJjaHlUcmFja3MiLCJoaWVyYXJjaHkiLCJtb3JwaFRhcmdldE5hbWVzIiwibW9ycGhUYXJnZXROYW1lIiwiYm9uZU5hbWUiLCJMb2FkaW5nTWFuYWdlciIsIml0ZW1zTG9hZGVkIiwiaXRlbXNUb3RhbCIsInVybE1vZGlmaWVyIiwiaXRlbVN0YXJ0IiwiaXRlbUVuZCIsIml0ZW1FcnJvciIsInJlc29sdmVVUkwiLCJzZXRVUkxNb2RpZmllciIsIkRlZmF1bHRMb2FkaW5nTWFuYWdlciIsInJlc291cmNlUGF0aCIsInNldENyb3NzT3JpZ2luIiwic2V0UmVzb3VyY2VQYXRoIiwibG9hZGluZyIsIkZpbGVMb2FkZXIiLCJBbmltYXRpb25Mb2FkZXIiLCJDb21wcmVzc2VkVGV4dHVyZUxvYWRlciIsIkRhdGFUZXh0dXJlTG9hZGVyIiwiSW1hZ2VMb2FkZXIiLCJDdWJlVGV4dHVyZUxvYWRlciIsIlRleHR1cmVMb2FkZXIiLCJhU3RhcnRBbmdsZSIsImFFbmRBbmdsZSIsImFDbG9ja3dpc2UiLCJhUm90YXRpb24iLCJBcmNDdXJ2ZSIsImFSYWRpdXMiLCJDdWJpY1BvbHkiLCJpbml0Q2F0bXVsbFJvbSIsInRlbnNpb24iLCJpbml0Tm9udW5pZm9ybUNhdG11bGxSb20iLCJkdDAiLCJkdDEiLCJkdDIiLCJjYWxjIiwiZGF0YVVyaVJlZ2V4UmVzdWx0IiwiaXNCYXNlNjQiLCJyZXF1ZXN0SGVhZGVyIiwic2V0UmVzcG9uc2VUeXBlIiwic2V0V2l0aENyZWRlbnRpYWxzIiwic2V0TWltZVR5cGUiLCJsb2FkVGV4dHVyZSIsInRleERhdGFzIiwibWlwbWFwQ291bnQiLCJpc0N1YmVtYXAiLCJ0ZXhEYXRhIiwib25JbWFnZUxvYWQiLCJvbkltYWdlRXJyb3IiLCJpc0pQRUciLCJvcHRpb25hbFRhcmdldCIsInB0MSIsImlzRWxsaXBzZUN1cnZlIiwiaXNBcmNDdXJ2ZSIsInB6IiwiQ2F0bXVsbFJvbUN1cnZlMyIsImN1cnZlVHlwZSIsIlF1YWRyYXRpY0JlemllclAwIiwiUXVhZHJhdGljQmV6aWVyUDEiLCJRdWFkcmF0aWNCZXppZXJQMiIsIkN1YmljQmV6aWVyUDAiLCJDdWJpY0JlemllclAxIiwiQ3ViaWNCZXppZXJQMiIsIkN1YmljQmV6aWVyUDMiLCJ2MyIsIkN1YmljQmV6aWVyQ3VydmUzIiwiTGluZUN1cnZlMyIsIlF1YWRyYXRpY0JlemllckN1cnZlMyIsImlzQ2F0bXVsbFJvbUN1cnZlMyIsImlzQ3ViaWNCZXppZXJDdXJ2ZSIsImlzQ3ViaWNCZXppZXJDdXJ2ZTMiLCJpc0xpbmVDdXJ2ZSIsImlzTGluZUN1cnZlMyIsImlzUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlMyIsImlzU3BsaW5lQ3VydmUiLCJDdXJ2ZVBhdGgiLCJjdXJyZW50UG9pbnQiLCJIZW1pc3BoZXJlTGlnaHQiLCJMaWdodFNoYWRvdyIsIl9mcmFtZUV4dGVudHMiLCJfdmlld3BvcnRDb3VudCIsIl92aWV3cG9ydHMiLCJTcG90TGlnaHRTaGFkb3ciLCJTcG90TGlnaHQiLCJQb2ludExpZ2h0U2hhZG93IiwiX2N1YmVEaXJlY3Rpb25zIiwiX2N1YmVVcHMiLCJQb2ludExpZ2h0IiwiRGlyZWN0aW9uYWxMaWdodFNoYWRvdyIsIkRpcmVjdGlvbmFsTGlnaHQiLCJBbWJpZW50TGlnaHQiLCJSZWN0QXJlYUxpZ2h0IiwiTWF0ZXJpYWxMb2FkZXIiLCJxdWFkcmF0aWNDdXJ2ZVRvIiwiYUNQeCIsImFDUHkiLCJiZXppZXJDdXJ2ZVRvIiwiYUNQMXgiLCJhQ1AxeSIsImFDUDJ4IiwiYUNQMnkiLCJzcGxpbmVUaHJ1IiwiYWJzYXJjIiwiYWJzZWxsaXBzZSIsImZpcnN0UG9pbnQiLCJnZXRQb2ludHNIb2xlcyIsImhvbGVzUHRzIiwiX2xpZ2h0UG9zaXRpb25Xb3JsZCIsIl9sb29rVGFyZ2V0Iiwic2hhZG93TWF0cml4IiwicHJvalNjcmVlbk1hdHJpeCIsImxvb2tUYXJnZXQiLCJsaWdodFBvc2l0aW9uV29ybGQiLCJ2aWV3cG9ydEluZGV4IiwiaXNTcG90TGlnaHRTaGFkb3ciLCJzY2FsZVciLCJzY2FsZUgiLCJpc0RpcmVjdGlvbmFsTGlnaHRTaGFkb3ciLCJnZXRUZXh0dXJlIiwic2hhZGluZyIsInNldFRleHR1cmVzIiwiTG9hZGVyVXRpbHMiLCJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsIkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIkJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwiVFlQRURfQVJSQVlTIiwiYnVmZmVyQXR0cmlidXRlIiwiZHJhd2NhbGxzIiwib2Zmc2V0cyIsIk9iamVjdExvYWRlciIsInBhcnNlU2hhcGUiLCJwYXJzZUdlb21ldHJpZXMiLCJwYXJzZUltYWdlcyIsInBhcnNlVGV4dHVyZXMiLCJwYXJzZU1hdGVyaWFscyIsInBhcnNlT2JqZWN0IiwicGFyc2VBbmltYXRpb25zIiwiYnVmZmVyR2VvbWV0cnlMb2FkZXIiLCJnZW9tZXRyeVNoYXBlcyIsImxvYWRJbWFnZSIsImN1cnJlbnRVcmwiLCJwYXJzZUNvbnN0YW50IiwiVEVYVFVSRV9NQVBQSU5HIiwiVEVYVFVSRV9XUkFQUElORyIsIlRFWFRVUkVfRklMVEVSIiwiZ2V0R2VvbWV0cnkiLCJnZXRNYXRlcmlhbCIsIlVWTWFwcGluZyIsIkN1YmVSZWZsZWN0aW9uTWFwcGluZyIsIkN1YmVSZWZyYWN0aW9uTWFwcGluZyIsIkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIiwiRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmciLCJTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyIsIkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nIiwiTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciIsIkltYWdlQml0bWFwTG9hZGVyIiwiY3JlYXRlSW1hZ2VCaXRtYXAiLCJTaGFwZVBhdGgiLCJzdWJQYXRocyIsIkZvbnQiLCJjcmVhdGVQYXRoIiwiZ2x5cGhzIiwiY3B4IiwiY3B5IiwiY3B4MSIsImNweTEiLCJjcHgyIiwiY3B5MiIsIm91dGxpbmUiLCJfY2FjaGVkT3V0bGluZSIsImhhIiwiZmFtaWx5TmFtZSIsIkZvbnRMb2FkZXIiLCJzZXRPcHRpb25zIiwiaW1hZ2VCaXRtYXAiLCJ0b1NoYXBlcyIsImlzQ0NXIiwibm9Ib2xlcyIsInRvU2hhcGVzTm9Ib2xlcyIsImluU3VicGF0aHMiLCJ0bXBQYXRoIiwidG1wU2hhcGUiLCJpc1BvaW50SW5zaWRlUG9seWdvbiIsImluUG9seWdvbiIsInBvbHlMZW4iLCJlZGdlTG93UHQiLCJlZGdlSGlnaFB0IiwiZWRnZUR4IiwiZWRnZUR5IiwicGVycEVkZ2UiLCJzb2xpZCIsImhvbGVzRmlyc3QiLCJ0bXBQb2ludHMiLCJ0bXBIb2xlcyIsImJldHRlclNoYXBlSG9sZXMiLCJuZXdTaGFwZXMiLCJuZXdTaGFwZUhvbGVzIiwibWFpbklkeCIsImFtYmlndW91cyIsInRvQ2hhbmdlIiwic0lkeCIsInNMZW4iLCJzaG8iLCJoSWR4IiwiaG8iLCJob2xlX3VuYXNzaWduZWQiLCJzMklkeCIsImZyb21zIiwidG9zIiwibGluZV9oZWlnaHQiLCJ1bmRlcmxpbmVUaGlja25lc3MiLCJjcmVhdGVQYXRocyIsIkF1ZGlvTG9hZGVyIiwiU3BoZXJpY2FsSGFybW9uaWNzMyIsIkxpZ2h0UHJvYmUiLCJIZW1pc3BoZXJlTGlnaHRQcm9iZSIsInNreSIsImdyb3VuZCIsIkFtYmllbnRMaWdodFByb2JlIiwiYnVmZmVyQ29weSIsImlzU3BoZXJpY2FsSGFybW9uaWNzMyIsImNvZWZmIiwiZ2V0SXJyYWRpYW5jZUF0IiwiYWRkU2NhbGVkU0giLCJnZXRCYXNpc0F0Iiwic2hCYXNpcyIsImlzSGVtaXNwaGVyZUxpZ2h0UHJvYmUiLCJpc0FtYmllbnRMaWdodFByb2JlIiwiX2V5ZVJpZ2h0IiwiX2V5ZUxlZnQiLCJvbGRUaW1lIiwiZWxhcHNlZFRpbWUiLCJleWVTZXAiLCJfY2FjaGUiLCJ4bWluIiwieG1heCIsImV5ZVNlcEhhbGYiLCJleWVTZXBPblByb2plY3Rpb24iLCJ5bWF4IiwiZ2V0RWxhcHNlZFRpbWUiLCJuZXdUaW1lIiwiX3Bvc2l0aW9uJDIiLCJfcXVhdGVybmlvbiQzIiwiX3NjYWxlJDEiLCJfb3JpZW50YXRpb24iLCJBdWRpb0xpc3RlbmVyIiwidGltZURlbHRhIiwiX2Nsb2NrIiwiZ2V0SW5wdXQiLCJsb29wU3RhcnQiLCJsb29wRW5kIiwiaGFzUGxheWJhY2tDb250cm9sIiwic291cmNlVHlwZSIsIl9zdGFydGVkQXQiLCJfcGF1c2VkQXQiLCJyZW1vdmVGaWx0ZXIiLCJnZXRGaWx0ZXIiLCJnZXRNYXN0ZXJWb2x1bWUiLCJzZXRNYXN0ZXJWb2x1bWUiLCJsaW5lYXJSYW1wVG9WYWx1ZUF0VGltZSIsInBvc2l0aW9uWiIsImZvcndhcmRYIiwiZm9yd2FyZFkiLCJmb3J3YXJkWiIsInVwWiIsInNldE9yaWVudGF0aW9uIiwiZ2V0T3V0cHV0Iiwic2V0Tm9kZVNvdXJjZSIsImF1ZGlvTm9kZSIsInNldE1lZGlhRWxlbWVudFNvdXJjZSIsIm1lZGlhRWxlbWVudCIsImNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSIsInNldE1lZGlhU3RyZWFtU291cmNlIiwibWVkaWFTdHJlYW0iLCJjcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSIsInNldEJ1ZmZlciIsIm9uRW5kZWQiLCJnZXRGaWx0ZXJzIiwiZ2V0RGV0dW5lIiwic2V0TG9vcFN0YXJ0Iiwic2V0TG9vcEVuZCIsIl9wb3NpdGlvbiQzIiwiX3F1YXRlcm5pb24kNCIsIl9zY2FsZSQyIiwiX29yaWVudGF0aW9uJDEiLCJQb3NpdGlvbmFsQXVkaW8iLCJwYW5uZXIiLCJjcmVhdGVQYW5uZXIiLCJwYW5uaW5nTW9kZWwiLCJBdWRpb0FuYWx5c2VyIiwiZmZ0U2l6ZSIsImFuYWx5c2VyIiwiY3JlYXRlQW5hbHlzZXIiLCJmcmVxdWVuY3lCaW5Db3VudCIsIlByb3BlcnR5TWl4ZXIiLCJtaXhGdW5jdGlvbiIsIl9zbGVycCIsIl9zZWxlY3QiLCJfbGVycCIsIl9taXhCdWZmZXJSZWdpb24iLCJjdW11bGF0aXZlV2VpZ2h0IiwidXNlQ291bnQiLCJyZWZlcmVuY2VDb3VudCIsImdldFJlZkRpc3RhbmNlIiwicmVmRGlzdGFuY2UiLCJzZXRSZWZEaXN0YW5jZSIsImdldFJvbGxvZmZGYWN0b3IiLCJyb2xsb2ZmRmFjdG9yIiwic2V0Um9sbG9mZkZhY3RvciIsImdldERpc3RhbmNlTW9kZWwiLCJkaXN0YW5jZU1vZGVsIiwic2V0RGlzdGFuY2VNb2RlbCIsImdldE1heERpc3RhbmNlIiwic2V0TWF4RGlzdGFuY2UiLCJzZXREaXJlY3Rpb25hbENvbmUiLCJjb25lSW5uZXJBbmdsZSIsImNvbmVPdXRlckFuZ2xlIiwiY29uZU91dGVyR2FpbiIsIm9yaWVudGF0aW9uWCIsIm9yaWVudGF0aW9uWSIsIm9yaWVudGF0aW9uWiIsImdldEZyZXF1ZW5jeURhdGEiLCJnZXRCeXRlRnJlcXVlbmN5RGF0YSIsImdldEF2ZXJhZ2VGcmVxdWVuY3kiLCJhY2N1bXVsYXRlIiwiYWNjdUluZGV4IiwiY3VycmVudFdlaWdodCIsIm1peCIsIm9yaWdpbmFsVmFsdWVPZmZzZXQiLCJzYXZlT3JpZ2luYWxTdGF0ZSIsInJlc3RvcmVPcmlnaW5hbFN0YXRlIiwiX1JFU0VSVkVEX0NIQVJTX1JFIiwiX3Jlc2VydmVkUmUiLCJfd29yZENoYXIiLCJfd29yZENoYXJPckRvdCIsIl9kaXJlY3RvcnlSZSIsIl9ub2RlUmUiLCJfb2JqZWN0UmUiLCJfcHJvcGVydHlSZSIsIl90cmFja1JlIiwiX3N1cHBvcnRlZE9iamVjdE5hbWVzIiwidGFyZ2V0R3JvdXAiLCJvcHRpb25hbFBhcnNlZFBhdGgiLCJwYXJzZWRQYXRoIiwiUHJvcGVydHlCaW5kaW5nIiwicGFyc2VUcmFja05hbWUiLCJfdGFyZ2V0R3JvdXAiLCJfYmluZGluZ3MiLCJzdWJzY3JpYmVfIiwicm9vdE5vZGUiLCJmaW5kTm9kZSIsIkFuaW1hdGlvbkFjdGlvbiIsIm1peGVyIiwibG9jYWxSb290IiwiX21peGVyIiwiX2NsaXAiLCJfbG9jYWxSb290IiwiblRyYWNrcyIsImludGVycG9sYW50cyIsImludGVycG9sYW50U2V0dGluZ3MiLCJpbnRlcnBvbGFudCIsIl9pbnRlcnBvbGFudFNldHRpbmdzIiwiX2ludGVycG9sYW50cyIsIl9wcm9wZXJ0eUJpbmRpbmdzIiwiX2NhY2hlSW5kZXgiLCJfYnlDbGlwQ2FjaGVJbmRleCIsIl90aW1lU2NhbGVJbnRlcnBvbGFudCIsIl93ZWlnaHRJbnRlcnBvbGFudCIsIl9sb29wQ291bnQiLCJfc3RhcnRUaW1lIiwiX2VmZmVjdGl2ZVRpbWVTY2FsZSIsIl9lZmZlY3RpdmVXZWlnaHQiLCJyZXBldGl0aW9ucyIsImNsYW1wV2hlbkZpbmlzaGVkIiwiemVyb1Nsb3BlQXRTdGFydCIsInplcm9TbG9wZUF0RW5kIiwiQW5pbWF0aW9uTWl4ZXIiLCJfcm9vdCIsIl9pbml0TWVtb3J5TWFuYWdlciIsIl9hY2N1SW5kZXgiLCJVbmlmb3JtIiwiSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJSYXljYXN0ZXIiLCJQb2ludENsb3VkIiwiYXNjU29ydCIsImludGVyc2VjdE9iamVjdCIsImZpcnN0VmFsaWRJbmRleCIsIm5DYWNoZWRPYmplY3RzXyIsImJpbmRpbmdzIiwiaXNBbmltYXRpb25PYmplY3RHcm91cCIsInNhbml0aXplTm9kZU5hbWUiLCJvYmplY3ROYW1lIiwib2JqZWN0SW5kZXgiLCJwcm9wZXJ0eUluZGV4IiwibGFzdERvdCIsInNlYXJjaE5vZGVTdWJ0cmVlIiwiY2hpbGROb2RlIiwic3ViVHJlZU5vZGUiLCJfZ2V0VmFsdWVfdW5hdmFpbGFibGUiLCJfc2V0VmFsdWVfdW5hdmFpbGFibGUiLCJCaW5kaW5nVHlwZSIsIkRpcmVjdCIsIkVudGlyZUFycmF5IiwiQXJyYXlFbGVtZW50IiwiSGFzRnJvbVRvQXJyYXkiLCJWZXJzaW9uaW5nIiwiTm9uZSIsIk5lZWRzVXBkYXRlIiwiTWF0cml4V29ybGROZWVkc1VwZGF0ZSIsIkdldHRlckJ5QmluZGluZ1R5cGUiLCJyZXNvbHZlZFByb3BlcnR5IiwiU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmciLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5Iiwibm9kZVByb3BlcnR5IiwidmVyc2lvbmluZyIsImJpbmRpbmdUeXBlIiwiX2dldFZhbHVlX3VuYm91bmQiLCJfc2V0VmFsdWVfdW5ib3VuZCIsIl9pbmRpY2VzQnlVVUlEIiwiX3BhdGhzIiwiX3BhcnNlZFBhdGhzIiwiX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCIsIm5PYmplY3RzIiwibkNhY2hlZE9iamVjdHMiLCJpbmRpY2VzQnlVVUlEIiwicGFyc2VkUGF0aHMiLCJuQmluZGluZ3MiLCJrbm93bk9iamVjdCIsImZpcnN0QWN0aXZlSW5kZXgiLCJsYXN0Q2FjaGVkT2JqZWN0IiwiYmluZGluZ3NGb3JQYXRoIiwibGFzdENhY2hlZCIsImxhc3RDYWNoZWRJbmRleCIsImZpcnN0QWN0aXZlT2JqZWN0IiwiZmlyc3RBY3RpdmUiLCJ1bmNhY2hlIiwibGFzdE9iamVjdCIsImluZGljZXNCeVBhdGgiLCJ1bnN1YnNjcmliZV8iLCJsYXN0QmluZGluZ3NJbmRleCIsImxhc3RCaW5kaW5ncyIsIl9hY3RpdmF0ZUFjdGlvbiIsIl9kZWFjdGl2YXRlQWN0aW9uIiwic3RvcEZhZGluZyIsInN0b3BXYXJwaW5nIiwiX2lzQWN0aXZlQWN0aW9uIiwiaXNTY2hlZHVsZWQiLCJzZXRFZmZlY3RpdmVXZWlnaHQiLCJnZXRFZmZlY3RpdmVXZWlnaHQiLCJfc2NoZWR1bGVGYWRpbmciLCJjcm9zc0ZhZGVGcm9tIiwiZmFkZU91dEFjdGlvbiIsIndhcnAiLCJmYWRlSW5EdXJhdGlvbiIsImZhZGVPdXREdXJhdGlvbiIsInN0YXJ0RW5kUmF0aW8iLCJlbmRTdGFydFJhdGlvIiwiY3Jvc3NGYWRlVG8iLCJmYWRlSW5BY3Rpb24iLCJ3ZWlnaHRJbnRlcnBvbGFudCIsIl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCIsInNldEVmZmVjdGl2ZVRpbWVTY2FsZSIsImdldEVmZmVjdGl2ZVRpbWVTY2FsZSIsInNldER1cmF0aW9uIiwic3luY1dpdGgiLCJoYWx0Iiwic3RhcnRUaW1lU2NhbGUiLCJlbmRUaW1lU2NhbGUiLCJfbGVuZENvbnRyb2xJbnRlcnBvbGFudCIsInRpbWVTY2FsZUludGVycG9sYW50IiwiZ2V0TWl4ZXIiLCJnZXRDbGlwIiwiZ2V0Um9vdCIsInRpbWVEaXJlY3Rpb24iLCJ0aW1lUnVubmluZyIsIl91cGRhdGVUaW1lU2NhbGUiLCJjbGlwVGltZSIsIl91cGRhdGVUaW1lIiwiX3VwZGF0ZVdlaWdodCIsInByb3BlcnR5TWl4ZXJzIiwiaW50ZXJwb2xhbnRWYWx1ZSIsImxvb3BDb3VudCIsInBpbmdQb25nIiwiX3NldEVuZGluZ3MiLCJoYW5kbGVfc3RvcCIsImxvb3BEZWx0YSIsImF0U3RhcnQiLCJhdEVuZCIsIndlaWdodE5vdyIsIndlaWdodFRoZW4iLCJfYmluZEFjdGlvbiIsInByb3RvdHlwZUFjdGlvbiIsInJvb3RVdWlkIiwiYmluZGluZ3NCeVJvb3QiLCJfYmluZGluZ3NCeVJvb3RBbmROYW1lIiwiYmluZGluZ3NCeU5hbWUiLCJfYWRkSW5hY3RpdmVCaW5kaW5nIiwiY2xpcFV1aWQiLCJhY3Rpb25zRm9yQ2xpcCIsIl9hY3Rpb25zQnlDbGlwIiwia25vd25BY3Rpb25zIiwiX2FkZEluYWN0aXZlQWN0aW9uIiwiX2xlbmRCaW5kaW5nIiwiX2xlbmRBY3Rpb24iLCJfdGFrZUJhY2tCaW5kaW5nIiwiX3Rha2VCYWNrQWN0aW9uIiwiX2FjdGlvbnMiLCJfbkFjdGl2ZUFjdGlvbnMiLCJfbkFjdGl2ZUJpbmRpbmdzIiwiX2NvbnRyb2xJbnRlcnBvbGFudHMiLCJfbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMiLCJjb250cm9sSW50ZXJwb2xhbnRzIiwiYWN0aW9uc0J5Q2xpcCIsImFjdGlvbkJ5Um9vdCIsIl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiIsImxhc3RJbmFjdGl2ZUFjdGlvbiIsImNhY2hlSW5kZXgiLCJrbm93bkFjdGlvbnNGb3JDbGlwIiwibGFzdEtub3duQWN0aW9uIiwiYnlDbGlwQ2FjaGVJbmRleCIsIl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uIiwiX3JlbW92ZUluYWN0aXZlQmluZGluZyIsInByZXZJbmRleCIsImxhc3RBY3RpdmVJbmRleCIsImZpcnN0SW5hY3RpdmVBY3Rpb24iLCJmaXJzdEluYWN0aXZlSW5kZXgiLCJsYXN0QWN0aXZlQWN0aW9uIiwiYmluZGluZ0J5TmFtZSIsInByb3BCaW5kaW5nIiwibGFzdEluYWN0aXZlQmluZGluZyIsImZpcnN0SW5hY3RpdmVCaW5kaW5nIiwibGFzdEFjdGl2ZUJpbmRpbmciLCJfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciIsIl9fY2FjaGVJbmRleCIsImxhc3RBY3RpdmVJbnRlcnBvbGFudCIsImNsaXBBY3Rpb24iLCJvcHRpb25hbFJvb3QiLCJjbGlwT2JqZWN0IiwiZXhpc3RpbmdBY3Rpb24iLCJuZXdBY3Rpb24iLCJzdG9wQWxsQWN0aW9uIiwibkFjdGlvbnMiLCJ0aW1lSW5TZWNvbmRzIiwidW5jYWNoZUNsaXAiLCJhY3Rpb25zVG9SZW1vdmUiLCJ1bmNhY2hlUm9vdCIsInVuY2FjaGVBY3Rpb24iLCJzZXRGcm9tQ2FtZXJhIiwiY29vcmRzIiwiaW50ZXJzZWN0T2JqZWN0cyIsIm1ha2VTYWZlIiwic2V0RnJvbUNhcnRlc2lhbkNvb3JkcyIsIl92ZWN0b3IkNyIsIkJveDIiLCJfc3RhcnRQIiwiX3N0YXJ0RW5kIiwiTGluZTMiLCJJbW1lZGlhdGVSZW5kZXJPYmplY3QiLCJjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyIiwiY2xhbXBUb0xpbmUiLCJzdGFydEVuZDIiLCJfdmVjdG9yJDgiLCJTcG90TGlnaHRIZWxwZXIiLCJjb25lIiwiY29uZUxlbmd0aCIsImNvbmVXaWR0aCIsIl92ZWN0b3IkOSIsIl9ib25lTWF0cml4IiwiX21hdHJpeFdvcmxkSW52IiwiZ2V0Qm9uZUxpc3QiLCJib25lTGlzdCIsIlNrZWxldG9uSGVscGVyIiwiUG9pbnRMaWdodEhlbHBlciIsInNwaGVyZVNpemUiLCJpc1NrZWxldG9uSGVscGVyIiwiX3ZlY3RvciRhIiwiX2NvbG9yMSIsIl9jb2xvcjIiLCJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiLCJHcmlkSGVscGVyIiwiUG9sYXJHcmlkSGVscGVyIiwicmFkaWFscyIsImNpcmNsZXMiLCJfdjEkNSIsIl92MiQzIiwiX3YzJDEiLCJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIiwibGlnaHRQbGFuZSIsInRhcmdldExpbmUiLCJfdmVjdG9yJGIiLCJfY2FtZXJhIiwiQ2FtZXJhSGVscGVyIiwicG9pbnRNYXAiLCJjb2xvckZydXN0dW0iLCJjb2xvckNvbmUiLCJjb2xvclVwIiwiY29sb3JUYXJnZXQiLCJjb2xvckNyb3NzIiwiYWRkTGluZSIsInNldFBvaW50IiwiX2JveCQzIiwiQm94SGVscGVyIiwiQm94M0hlbHBlciIsIlBsYW5lSGVscGVyIiwiX2xpbmVHZW9tZXRyeSIsIl9jb25lR2VvbWV0cnkiLCJfYXhpcyIsIkFycm93SGVscGVyIiwiaGVhZExlbmd0aCIsImhlYWRXaWR0aCIsInNldERpcmVjdGlvbiIsIkF4ZXNIZWxwZXIiLCJ3ZWlnaHRzIiwicG9sZUF4aXMiLCJzaGFkZXJNYXRlcmlhbCIsIlNJWkVfTUFYIiwiRVhUUkFfTE9EX1NJR01BIiwiVE9UQUxfTE9EUyIsIkxPRF9NQVgiLCJNQVhfU0FNUExFUyIsIkVOQ09ESU5HUyIsIl9mbGF0Q2FtZXJhIiwiX2JsdXJNYXRlcmlhbCIsIl9nZXRDb21tb25WZXJ0ZXhTaGFkZXIiLCJfZ2V0RW5jb2RpbmdzIiwiX2VxdWlyZWN0U2hhZGVyIiwiX2N1YmVtYXBTaGFkZXIiLCJfbG9kUGxhbmVzIiwiX3NpemVMb2RzIiwiX3NpZ21hcyIsImxvZCIsInNpemVMb2QiLCJzaWdtYSIsInRleGVsU2l6ZSIsInV2U2l6ZSIsImZhY2VJbmRleFNpemUiLCJjb29yZGluYXRlcyIsIl9jcmVhdGVQbGFuZXMiLCJfcGluZ1BvbmdSZW5kZXJUYXJnZXQiLCJfb2xkVGFyZ2V0IiwiUEhJIiwiSU5WX1BISSIsIl9heGlzRGlyZWN0aW9ucyIsIlBNUkVNR2VuZXJhdG9yIiwiX2NvbXBpbGVNYXRlcmlhbCIsIl9hbGxvY2F0ZVRhcmdldHMiLCJlcXVpcmVjdGFuZ3VsYXIiLCJjdWJlVVZSZW5kZXJUYXJnZXQiLCJfY3JlYXRlUmVuZGVyVGFyZ2V0IiwiX2NsZWFudXAiLCJvdXRwdXRUYXJnZXQiLCJ0bXBTY2VuZSIsIl9zZXRWaWV3cG9ydCIsIl9hcHBseVBNUkVNIiwiX2JsdXIiLCJsb2RJbiIsImxvZE91dCIsIl9oYWxmQmx1ciIsInRhcmdldEluIiwidGFyZ2V0T3V0Iiwic2lnbWFSYWRpYW5zIiwiYmx1clNjZW5lIiwiYmx1clVuaWZvcm1zIiwicmFkaWFuc1BlclBpeGVsIiwic2lnbWFQaXhlbHMiLCJvdXRwdXRTaXplIiwiX2dldEVxdWlyZWN0U2hhZGVyIiwiX2dldEN1YmVtYXBTaGFkZXIiLCJjdWJlQ2FtZXJhIiwidXBTaWduIiwiZm9yd2FyZFNpZ24iLCJtYXhDb21wb25lbnQiLCJmRXhwIiwiX3NjZW5lVG9DdWJlVVYiLCJmcm9tRXF1aXJlY3Rhbmd1bGFyIiwiZnJvbUN1YmVtYXAiLCJjdWJlbWFwIiwiX3RleHR1cmVUb0N1YmVVViIsImNvbXBpbGVDdWJlbWFwU2hhZGVyIiwiY29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlciIsImNyZWF0ZVBvaW50c0dlb21ldHJ5IiwiY3JlYXRlR2VvbWV0cnkiLCJjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSIsImZyb21Qb2ludHMiLCJpbml0RnJvbUFycmF5IiwiZ2V0Q29udHJvbFBvaW50c0FycmF5IiwicmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoIiwiZXh0cmFjdFVybEJhc2UiLCJIYW5kbGVycyIsInNldFRleHR1cmVQYXRoIiwiaXNJbnRlcnNlY3Rpb25Cb3giLCJpc0ludGVyc2VjdGlvblNwaGVyZSIsInNldEZyb21NYXRyaXgiLCJyYW5kb20xNiIsIm5lYXJlc3RQb3dlck9mVHdvIiwibmV4dFBvd2VyT2ZUd28iLCJmbGF0dGVuVG9BcnJheU9mZnNldCIsIm11bHRpcGx5VmVjdG9yMyIsIm11bHRpcGx5VmVjdG9yM0FycmF5IiwiYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSIsImFwcGx5VG9WZWN0b3IzQXJyYXkiLCJleHRyYWN0UG9zaXRpb24iLCJnZXRQb3NpdGlvbiIsIm11bHRpcGx5VG9BcnJheSIsIm11bHRpcGx5VmVjdG9yNCIsInJvdGF0ZUF4aXMiLCJjcm9zc1ZlY3RvciIsInJvdGF0ZUJ5QXhpcyIsIm1ha2VGcnVzdHVtIiwiaXNJbnRlcnNlY3Rpb25MaW5lIiwiaXNJbnRlcnNlY3Rpb25QbGFuZSIsImJhcnljb29yZEZyb21Qb2ludCIsIm1pZHBvaW50IiwiZXh0cmFjdEFsbFBvaW50cyIsImV4dHJ1ZGUiLCJtYWtlR2VvbWV0cnkiLCJmcm9tQXR0cmlidXRlIiwiZGlzdGFuY2VUb01hbmhhdHRhbiIsImxlbmd0aE1hbmhhdHRhbiIsInNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4Iiwic2V0RXVsZXJGcm9tUXVhdGVybmlvbiIsImdldFBvc2l0aW9uRnJvbU1hdHJpeCIsImdldFNjYWxlRnJvbU1hdHJpeCIsImdldENvbHVtbkZyb21NYXRyaXgiLCJhcHBseVByb2plY3Rpb24iLCJjb21wdXRlVGFuZ2VudHMiLCJhcHBseU1hdHJpeCIsInJlbmRlckRlcHRoIiwiZ2V0V29ybGRSb3RhdGlvbiIsImV1bGVyT3JkZXIiLCJ1c2VRdWF0ZXJuaW9uIiwic2V0RHJhd01vZGUiLCJkcmF3TW9kZSIsImluaXRCb25lcyIsInNldExlbnMiLCJvbmx5U2hhZG93Iiwic2hhZG93Q2FtZXJhRm92Iiwic2hhZG93Q2FtZXJhTGVmdCIsInNoYWRvd0NhbWVyYVJpZ2h0Iiwic2hhZG93Q2FtZXJhVG9wIiwic2hhZG93Q2FtZXJhQm90dG9tIiwic2hhZG93Q2FtZXJhVmlzaWJsZSIsInNoYWRvd0RhcmtuZXNzIiwic2hhZG93TWFwV2lkdGgiLCJzaGFkb3dNYXBIZWlnaHQiLCJzZXREeW5hbWljIiwiY29weUluZGljZXNBcnJheSIsInNldEFycmF5IiwiYWRkSW5kZXgiLCJhZGREcmF3Q2FsbCIsImNsZWFyRHJhd0NhbGxzIiwiY29tcHV0ZU9mZnNldHMiLCJsaW5lUHJlY2lzaW9uIiwiZ2V0QXJyYXlzIiwiYWRkU2hhcGVMaXN0Iiwid3JhcEFyb3VuZCIsIm92ZXJkcmF3Iiwid3JhcFJHQiIsIm1ldGFsIiwiY2xlYXJUYXJnZXQiLCJnZXRDdXJyZW50UmVuZGVyVGFyZ2V0IiwiZ2V0UHJlY2lzaW9uIiwicmVzZXRHTFN0YXRlIiwic3VwcG9ydHNGbG9hdFRleHR1cmVzIiwic3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcyIsInN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcyIsInN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDIiwic3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDIiwic3VwcG9ydHNCbGVuZE1pbk1heCIsInN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzIiwiZW5hYmxlU2Npc3NvclRlc3QiLCJhZGRQcmVQbHVnaW4iLCJhZGRQb3N0UGx1Z2luIiwidXBkYXRlU2hhZG93TWFwIiwic2V0RmFjZUN1bGxpbmciLCJhbGxvY1RleHR1cmVVbml0IiwiZ2V0QWN0aXZlTWlwTWFwTGV2ZWwiLCJzaGFkb3dNYXBDdWxsRmFjZSIsInZyIiwiZ2FtbWFJbnB1dCIsImdhbW1hT3V0cHV0IiwicmVuZGVyUmV2ZXJzZVNpZGVkIiwicmVuZGVyU2luZ2xlU2lkZWQiLCJ1cGRhdGVDdWJlTWFwIiwibG9hZFRleHR1cmVDdWJlIiwibG9hZENvbXByZXNzZWRUZXh0dXJlIiwibG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSIsInJldmlzaW9uIiwiY29tbW9uanNHbG9iYWwiLCJhcHBsZUlwaG9uZSIsImFwcGxlSXBvZCIsImFwcGxlVGFibGV0IiwiYXBwbGVVbml2ZXJzYWwiLCJhbmRyb2lkUGhvbmUiLCJhbmRyb2lkVGFibGV0IiwiYW1hem9uUGhvbmUiLCJhbWF6b25UYWJsZXQiLCJ3aW5kb3dzVGFibGV0Iiwib3RoZXJCbGFja0JlcnJ5Iiwib3RoZXJCbGFja0JlcnJ5MTAiLCJvdGhlck9wZXJhIiwib3RoZXJDaHJvbWUiLCJvdGhlckZpcmVmb3giLCJpc0FwcGxlVGFibGV0T25Jb3MxMyIsIk1TU3RyZWFtIiwibmF2IiwiY3JlYXRlTWF0Y2giLCJhcHBsZSIsInBob25lIiwiaXBvZCIsInRhYmxldCIsInVuaXZlcnNhbCIsImFtYXpvbiIsImJsYWNrYmVycnkiLCJibGFja2JlcnJ5MTAiLCJpc01vYmlsZSIsIk1JUE1BUF9URVhUVVJFUyIsIkFOSVNPVFJPUElDX0xFVkVMIiwiUkVTT0xVVElPTiIsIkZJTFRFUl9SRVNPTFVUSU9OIiwiU1BSSVRFX01BWF9URVhUVVJFUyIsImFsbG93TWF4IiwibWF0Y2gkMSIsIm1heFJlY29tbWVuZGVkVGV4dHVyZXMiLCJTUFJJVEVfQkFUQ0hfU0laRSIsIlJFTkRFUl9PUFRJT05TIiwiZm9yY2VGWEFBIiwiYXV0b0RlbnNpdHkiLCJsZWdhY3kiLCJHQ19NT0RFIiwiR0NfTUFYX0lETEUiLCJHQ19NQVhfQ0hFQ0tfQ09VTlQiLCJXUkFQX01PREUiLCJQUkVDSVNJT05fVkVSVEVYIiwiUFJFQ0lTSU9OX0ZSQUdNRU5UIiwiQ0FOX1VQTE9BRF9TQU1FX0JVRkZFUiIsIkNSRUFURV9JTUFHRV9CSVRNQVAiLCJST1VORF9QSVhFTFMiLCJFTlYiLCJSRU5ERVJFUl9UWVBFIiwiQkxFTkRfTU9ERVMiLCJEUkFXX01PREVTIiwiRk9STUFUUyIsIlRBUkdFVFMiLCJTQ0FMRV9NT0RFUyIsIldSQVBfTU9ERVMiLCJNSVBNQVBfTU9ERVMiLCJBTFBIQV9NT0RFUyIsIkdDX01PREVTIiwiUFJFQ0lTSU9OIiwiTUFTS19UWVBFUyIsIlJFVElOQV9QUkVGSVgiLCJGQUlMX0lGX01BSk9SX1BFUkZPUk1BTkNFX0NBVkVBVCIsInNhaWRIZWxsbyIsImhleDJyZ2IiLCJoZXgyc3RyaW5nIiwiaGV4U3RyaW5nIiwicHJlbXVsdGlwbHlCbGVuZE1vZGUiLCJucG0iLCJOT1JNQUxfTlBNIiwiQUREX05QTSIsIlNDUkVFTl9OUE0iLCJtYXBQcmVtdWx0aXBsaWVkQmxlbmRNb2RlcyIsImNvcnJlY3RCbGVuZE1vZGUiLCJwcmVtdWx0aXBsaWVkIiwicHJlbXVsdGlwbHlUaW50IiwicHJlbXVsdGlwbHlUaW50VG9SZ2JhIiwibmV4dFBvdzIiLCJpc1BvdzIiLCJyZW1vdmVJdGVtcyIsInN0YXJ0SWR4IiwicmVtb3ZlQ291bnQiLCJuZXh0VWlkIiwid2FybmluZ3MiLCJpZ25vcmVEZXB0aCIsImdyb3VwQ29sbGFwc2VkIiwiUHJvZ3JhbUNhY2hlIiwiVGV4dHVyZUNhY2hlIiwiQmFzZVRleHR1cmVDYWNoZSIsIkNhbnZhc1JlbmRlclRhcmdldCIsInRlbXBBbmNob3IiLCJnZXRSZXNvbHV0aW9uT2ZVcmwiLCJTSEFQRVMiLCJjb3B5VG8iLCJPYnNlcnZhYmxlUG9pbnQiLCJQSV8yIiwibmV3UG9zIiwicm90YXRpb25DYXlsZXkiLCJyb3RhdGlvbk1hdHJpY2VzIiwic2lnbnVtIiwiX3V4IiwiX3V5IiwiX3Z4IiwiX3Z5IiwiZ3JvdXBEOCIsIlNFIiwiU1ciLCJOVyIsIk5FIiwiTUlSUk9SX1ZFUlRJQ0FMIiwiTUFJTl9ESUFHT05BTCIsIk1JUlJPUl9IT1JJWk9OVEFMIiwiUkVWRVJTRV9ESUFHT05BTCIsInVYIiwiaW5kIiwidVkiLCJ2WCIsInZZIiwicm90YXRpb25TZWNvbmQiLCJyb3RhdGlvbkZpcnN0Iiwicm90YXRlMTgwIiwiaXNWZXJ0aWNhbCIsImJ5RGlyZWN0aW9uIiwibWF0cml4QXBwZW5kUm90YXRpb25JbnYiLCJ3b3JsZFRyYW5zZm9ybSIsInVwZGF0ZVNrZXciLCJfbG9jYWxJRCIsIl9jdXJyZW50TG9jYWxJRCIsIl93b3JsZElEIiwiX3BhcmVudElEIiwidXBkYXRlTG9jYWxUcmFuc2Zvcm0iLCJsdCIsInVwZGF0ZVRyYW5zZm9ybSIsInBhcmVudFRyYW5zZm9ybSIsInd0IiwiSURFTlRJVFkiLCJSRUNUIiwiZXBzIiwiZW5sYXJnZSIsIkNJUkMiLCJFTElQIiwiYXJndW1lbnRzJDEiLCJQT0xZIiwiY2xvc2VTdHJva2UiLCJ4aSIsInlpIiwieGoiLCJ5aiIsIlJvdW5kZWRSZWN0YW5nbGUiLCJSUkVDIiwiU09SVEFCTEVfQ0hJTERSRU4iLCJnZXRSZWN0YW5nbGUiLCJFTVBUWSIsImFkZFF1YWQiLCJhZGRGcmFtZU1hdHJpeCIsImFkZFZlcnRleERhdGEiLCJiZWdpbk9mZnNldCIsImVuZE9mZnNldCIsImFkZFZlcnRpY2VzIiwiYWRkVmVydGljZXNNYXRyaXgiLCJwYWRYIiwicGFkWSIsInJhd1giLCJyYXdZIiwiYWRkQm91bmRzIiwiYWRkQm91bmRzTWFzayIsIl9taW5YIiwiX21pblkiLCJfbWF4WCIsIl9tYXhZIiwiYWRkQm91bmRzTWF0cml4IiwiYWRkQm91bmRzQXJlYSIsImFkZEZyYW1lUGFkIiwiRGlzcGxheU9iamVjdCIsInRlbXBEaXNwbGF5T2JqZWN0UGFyZW50Iiwid29ybGRBbHBoYSIsIl9sYXN0U29ydGVkSW5kZXgiLCJfekluZGV4IiwiZmlsdGVyQXJlYSIsIl9lbmFibGVkRmlsdGVycyIsIl9ib3VuZHNJRCIsIl9sYXN0Qm91bmRzSUQiLCJfYm91bmRzUmVjdCIsIl9sb2NhbEJvdW5kc1JlY3QiLCJfbWFzayIsIl9kZXN0cm95ZWQiLCJpc01hc2siLCJwcm90b3R5cGVBY2Nlc3NvcnMiLCJfdGVtcERpc3BsYXlPYmplY3RQYXJlbnQiLCJ3b3JsZFZpc2libGUiLCJjYWxjdWxhdGVCb3VuZHMiLCJfcmVjdXJzaXZlUG9zdFVwZGF0ZVRyYW5zZm9ybSIsInNraXBVcGRhdGUiLCJnZXRMb2NhbEJvdW5kcyIsInRyYW5zZm9ybVJlZiIsInBhcmVudFJlZiIsInRvR2xvYmFsIiwiZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSIsInRvTG9jYWwiLCJhZGRDaGlsZCIsIl9jdXJyZW50Qm91bmRzIiwiaW50ZXJhY3RpdmUiLCJpbnRlcmFjdGl2ZUNoaWxkcmVuIiwic29ydERpcnR5IiwibWFza09iamVjdCIsIm1hc2tPYmplY3QkMSIsInNvcnRDaGlsZHJlbiIsInNvcnRhYmxlQ2hpbGRyZW4iLCJvbkNoaWxkcmVuQ2hhbmdlIiwiYWRkQ2hpbGRBdCIsInN3YXBDaGlsZHJlbiIsImdldENoaWxkSW5kZXgiLCJzZXRDaGlsZEluZGV4IiwiZ2V0Q2hpbGRBdCIsInJlbW92ZUNoaWxkQXQiLCJyZW1vdmVDaGlsZHJlbiIsImkkMSIsInNvcnRSZXF1aXJlZCIsIl9jYWxjdWxhdGVCb3VuZHMiLCJyZW5kZXJBZHZhbmNlZCIsIl9yZW5kZXIiLCJvbGRDaGlsZHJlbiIsImNvbnRhaW5lclVwZGF0ZVRyYW5zZm9ybSIsImFjY2Vzc2libGUiLCJhY2Nlc3NpYmxlVGl0bGUiLCJhY2Nlc3NpYmxlSGludCIsIl9hY2Nlc3NpYmxlQWN0aXZlIiwiX2FjY2Vzc2libGVEaXYiLCJhY2Nlc3NpYmxlVHlwZSIsImFjY2Vzc2libGVQb2ludGVyRXZlbnRzIiwiYWNjZXNzaWJsZUNoaWxkcmVuIiwiVVBEQVRFX1BSSU9SSVRZIiwiQWNjZXNzaWJpbGl0eU1hbmFnZXIiLCJfaG9va0RpdiIsImNyZWF0ZVRvdWNoSG9vayIsIkRJVl9UT1VDSF9TSVpFIiwiRElWX1RPVUNIX1BPU19YIiwiRElWX1RPVUNIX1BPU19ZIiwicmVuZGVySWQiLCJfb25LZXlEb3duIiwiX29uTW91c2VNb3ZlIiwiaXNNb2JpbGVBY2Nlc3NpYmlsaXR5IiwiYW5kcm9pZFVwZGF0ZUNvdW50IiwiYW5kcm9pZFVwZGF0ZUZyZXF1ZW5jeSIsInRoaXMkMSIsImhvb2tEaXYiLCJESVZfSE9PS19TSVpFIiwiRElWX0hPT0tfUE9TX1giLCJESVZfSE9PS19QT1NfWSIsImFjdGl2YXRlIiwiZGVzdHJveVRvdWNoSG9vayIsImRlYWN0aXZhdGUiLCJ1cGRhdGVBY2Nlc3NpYmxlT2JqZWN0cyIsImRpc3BsYXlPYmplY3QiLCJyZW5kZXJpbmdUb1NjcmVlbiIsIl9sYXN0T2JqZWN0UmVuZGVyZWQiLCJjYXBIaXRBcmVhIiwidXBkYXRlRGVidWdIVE1MIiwiYm9yZGVyU3R5bGUiLCJfb25DbGljayIsIl9vbkZvY3VzIiwiX29uRm9jdXNPdXQiLCJpbnRlcmFjdGlvbk1hbmFnZXIiLCJpbnRlcmFjdGlvbiIsImV2ZW50RGF0YSIsIlRBUkdFVF9GUE1TIiwiVGlja2VyTGlzdGVuZXIiLCJyZWRpcmVjdCIsImhhcmQiLCJUaWNrZXIiLCJfcmVxdWVzdElkIiwiX21heEVsYXBzZWRNUyIsIl9taW5FbGFwc2VkTVMiLCJkZWx0YU1TIiwiZWxhcHNlZE1TIiwiX3Byb3RlY3RlZCIsIl9sYXN0RnJhbWUiLCJfcmVxdWVzdElmTmVlZGVkIiwiX2NhbmNlbElmTmVlZGVkIiwiX3N0YXJ0SWZQb3NzaWJsZSIsIl9hZGRMaXN0ZW5lciIsImFkZE9uY2UiLCJtaW5GUFMiLCJtYXhGUFMiLCJtaW5GUE1TIiwiX3NoYXJlZCIsIl9zeXN0ZW0iLCJzeXN0ZW0iLCJUaWNrZXJQbHVnaW4iLCJzaGFyZWRUaWNrZXIiLCJ0aWNrZXIiLCJfdGlja2VyIiwiTE9XIiwib2xkVGlja2VyIiwiSW50ZXJhY3Rpb25EYXRhIiwiaXNQcmltYXJ5IiwidGlsdFgiLCJ0aWx0WSIsInByZXNzdXJlIiwicm90YXRpb25BbmdsZSIsInR3aXN0IiwidGFuZ2VudGlhbFByZXNzdXJlIiwiZ2V0TG9jYWxQb3NpdGlvbiIsImdsb2JhbFBvcyIsImNvcHlFdmVudCIsIkludGVyYWN0aW9uRXZlbnQiLCJzdG9wc1Byb3BhZ2F0aW5nQXQiLCJzdG9wUHJvcGFnYXRpb25IaW50IiwiSW50ZXJhY3Rpb25UcmFja2luZ0RhdGEiLCJfcG9pbnRlcklkIiwiX2ZsYWdzIiwiRkxBR1MiLCJwcm90b3R5cGVBY2Nlc3NvcnMkMSIsInJpZ2h0RG93biIsImxlZnREb3duIiwiX2RvU2V0IiwiT1ZFUiIsIlJJR0hUX0RPV04iLCJMRUZUX0RPV04iLCJUcmVlU2VhcmNoIiwicmVjdXJzaXZlRmluZEhpdCIsImludGVyYWN0aW9uRXZlbnQiLCJoaXQiLCJpbnRlcmFjdGl2ZVBhcmVudCIsImhpdFRlc3RDaGlsZHJlbiIsImNoaWxkSGl0IiwiZmluZEhpdCIsImludGVyYWN0aXZlVGFyZ2V0IiwiX3RyYWNrZWRQb2ludGVycyIsImhpdFRlc3RFdmVudCIsIkludGVyYWN0aW9uTWFuYWdlciIsImF1dG9QcmV2ZW50RGVmYXVsdCIsImludGVyYWN0aW9uRnJlcXVlbmN5IiwiYWN0aXZlSW50ZXJhY3Rpb25EYXRhIiwiaW50ZXJhY3Rpb25EYXRhUG9vbCIsImludGVyYWN0aW9uRE9NRWxlbWVudCIsIm1vdmVXaGVuSW5zaWRlIiwiZXZlbnRzQWRkZWQiLCJ0aWNrZXJBZGRlZCIsIm1vdXNlT3ZlclJlbmRlcmVyIiwic3VwcG9ydHNUb3VjaEV2ZW50cyIsInN1cHBvcnRzUG9pbnRlckV2ZW50cyIsIlBvaW50ZXJFdmVudCIsIm9uUG9pbnRlclVwIiwicHJvY2Vzc1BvaW50ZXJVcCIsIm9uUG9pbnRlckNhbmNlbCIsInByb2Nlc3NQb2ludGVyQ2FuY2VsIiwib25Qb2ludGVyRG93biIsInByb2Nlc3NQb2ludGVyRG93biIsIm9uUG9pbnRlck1vdmUiLCJwcm9jZXNzUG9pbnRlck1vdmUiLCJvblBvaW50ZXJPdXQiLCJwcm9jZXNzUG9pbnRlck92ZXJPdXQiLCJvblBvaW50ZXJPdmVyIiwiY3Vyc29yU3R5bGVzIiwiY3VycmVudEN1cnNvck1vZGUiLCJkZWxheWVkRXZlbnRzIiwiX3VzZVN5c3RlbVRpY2tlciIsInVzZVN5c3RlbVRpY2tlciIsInNldFRhcmdldEVsZW1lbnQiLCJhZGRUaWNrZXJMaXN0ZW5lciIsInJlbW92ZVRpY2tlckxpc3RlbmVyIiwiZ2xvYmFsUG9pbnQiLCJwcm9jZXNzSW50ZXJhY3RpdmUiLCJyZW1vdmVFdmVudHMiLCJhZGRFdmVudHMiLCJ0aWNrZXJVcGRhdGUiLCJJTlRFUkFDVElPTiIsIl9kZWx0YVRpbWUiLCJkaWRNb3ZlIiwiaW50ZXJhY3Rpb25EYXRhIiwiY29uZmlndXJlSW50ZXJhY3Rpb25FdmVudEZvckRPTUV2ZW50Iiwic2V0Q3Vyc29yTW9kZSIsImV2ZW50U3RyaW5nIiwiZGVsYXlEaXNwYXRjaEV2ZW50IiwibWFwUG9zaXRpb25Ub1BvaW50IiwicmVzb2x1dGlvbk11bHRpcGxpZXIiLCJkZWxheWVkTGVuIiwiZGlzcGxheU9iamVjdCQxIiwibm9ybWFsaXplVG9Qb2ludGVyRGF0YSIsImlzTm9ybWFsaXplZCIsImV2ZW50TGVuIiwiZ2V0SW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkIiwiaXNSaWdodEJ1dHRvbiIsInRyYWNrZWRQb2ludGVycyIsIm9uUG9pbnRlckNvbXBsZXRlIiwiZXZlbnRBcHBlbmQiLCJyZWxlYXNlSW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkIiwidHJhY2tpbmdEYXRhIiwiaXNUb3VjaCIsImlzTW91c2UiLCJpc01vdXNlVGFwIiwicG9pbnRlckV2ZW50IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJub3JtYWxpemVkRXZlbnRzIiwiVG91Y2hFdmVudCIsInJhZGl1c1giLCJyYWRpdXNZIiwiTW91c2VFdmVudCIsIlJ1bm5lciIsIl9hbGlhc0NvdW50IiwiYTYiLCJhNyIsImVuc3VyZU5vbkFsaWFzZWRJdGVtcyIsIlJlc291cmNlIiwiZGVzdHJveWVkIiwiaW50ZXJuYWwiLCJiYXNlVGV4dHVyZSIsIkJhc2VJbWFnZVJlc291cmNlIiwibm9TdWJJbWFnZSIsImNyb3Nzb3JpZ2luIiwicGFyc2VkVXJsIiwic2FtZVBvcnQiLCJkZXRlcm1pbmVDcm9zc09yaWdpbiIsImFscGhhTW9kZSIsIlVOUEFDSyIsIkltYWdlUmVzb3VyY2UiLCJpbWFnZUVsZW1lbnQiLCJfcHJvY2VzcyIsInByZXNlcnZlQml0bWFwIiwiY3JlYXRlQml0bWFwIiwiX2xvYWQiLCJhdXRvTG9hZCIsIl9nbFRleHR1cmVzIiwib3RoZXJUZXgiLCJkaXJ0eUlkIiwiSU5TVEFMTEVEIiwiYXV0b0RldGVjdFJlc291cmNlIiwiUmVzb3VyY2VQbHVnaW4iLCJCdWZmZXJSZXNvdXJjZSIsImRlZmF1bHRCdWZmZXJPcHRpb25zIiwiTlBNIiwiQmFzZVRleHR1cmUiLCJyZXNvdXJjZSIsImFuaXNvdHJvcGljTGV2ZWwiLCJ3cmFwTW9kZSIsInJlc291cmNlT3B0aW9ucyIsInRvdWNoZWQiLCJfcmVmcmVzaFBPVCIsImRpcnR5U3R5bGVJZCIsImNhY2hlSWQiLCJ0ZXh0dXJlQ2FjaGVJZHMiLCJfYmF0Y2hFbmFibGVkIiwiX2JhdGNoTG9jYXRpb24iLCJzZXRSZXNvdXJjZSIsInNldFJlYWxTaXplIiwib2xkUmVzb2x1dGlvbiIsInJlbW92ZUZyb21DYWNoZSIsIlNUUklDVF9URVhUVVJFX0NBQ0hFIiwiaXNGcmFtZSIsIl9waXhpSWQiLCJmcm9tQnVmZmVyIiwiYmFzZVRleHR1cmVGcm9tQ2FjaGUiLCJfZ2xvYmFsQmF0Y2giLCJBcnJheVJlc291cmNlIiwiaXRlbURpcnR5SWRzIiwicGFydFRleHR1cmUiLCJhZGRSZXNvdXJjZUF0IiwiVEVYVFVSRV8yRF9BUlJBWSIsInRleFN1YkltYWdlM0QiLCJDYW52YXNSZXNvdXJjZSIsIkN1YmVSZXNvdXJjZSIsIlNJREVTIiwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIiwiVEVYVFVSRV9DVUJFX01BUCIsIlNWR1Jlc291cmNlIiwiX292ZXJyaWRlV2lkdGgiLCJfb3ZlcnJpZGVIZWlnaHQiLCJfcmVzb2x2ZSIsIl9jcm9zc29yaWdpbiIsImJ0b2EiLCJ1bmVzY2FwZSIsIl9sb2FkU3ZnIiwidGVtcEltYWdlIiwic3ZnU3RyaW5nIiwic2l6ZU1hdGNoIiwiU1ZHX1NJWkUiLCJWaWRlb1Jlc291cmNlIiwic291cmNlRWxlbWVudCIsIm1pbWUiLCJiYXNlU3JjIiwiZXh0IiwiX2F1dG9VcGRhdGUiLCJfaXNDb25uZWN0ZWRUb1RpY2tlciIsIl91cGRhdGVGUFMiLCJ1cGRhdGVGUFMiLCJfbXNUb05leHRVcGRhdGUiLCJhdXRvUGxheSIsIl9vbkNhblBsYXkiLCJfb25FcnJvciIsIkhBVkVfRU5PVUdIX0RBVEEiLCJIQVZFX0ZVVFVSRV9EQVRBIiwiX29uUGxheVN0YXJ0IiwiX29uUGxheVN0b3AiLCJfaXNTb3VyY2VSZWFkeSIsIl9pc1NvdXJjZVBsYXlpbmciLCJJbWFnZUJpdG1hcFJlc291cmNlIiwiU3lzdGVtIiwiRGVwdGhSZXNvdXJjZSIsIndlYkdMVmVyc2lvbiIsIkRFUFRIX0NPTVBPTkVOVCIsIkRFUFRIX0NPTVBPTkVOVDE2IiwiRnJhbWVidWZmZXIiLCJkaXJ0eUZvcm1hdCIsImRpcnR5U2l6ZSIsImNvbG9yVGV4dHVyZXMiLCJnbEZyYW1lYnVmZmVycyIsImRpc3Bvc2VSdW5uZXIiLCJjb2xvclRleHR1cmUiLCJhZGRDb2xvclRleHR1cmUiLCJhZGREZXB0aFRleHR1cmUiLCJlbmFibGVEZXB0aCIsImVuYWJsZVN0ZW5jaWwiLCJyZXNvbHV0aW9uJDEiLCJCYXNlUmVuZGVyVGV4dHVyZSIsIndpZHRoJDEiLCJoZWlnaHQkMSIsIl9jYW52YXNSZW5kZXJUYXJnZXQiLCJmaWx0ZXJTdGFjayIsIlRleHR1cmVVdnMiLCJ1dnNGbG9hdDMyIiwidzIiLCJoMiIsImNYIiwiY1kiLCJERUZBVUxUX1VWUyIsIm5vRnJhbWUiLCJfZnJhbWUiLCJyZXF1aXJlc1VwZGF0ZSIsIl91dnMiLCJ1dk1hdHJpeCIsIl9yb3RhdGUiLCJkZWZhdWx0QW5jaG9yIiwiX3VwZGF0ZUlEIiwib25CYXNlVGV4dHVyZVVwZGF0ZWQiLCJ1cGRhdGVVdnMiLCJkZXN0cm95QmFzZSIsImltYWdlVXJsIiwidGV4dHVyZUZyb21DYWNoZSIsInhOb3RGaXQiLCJ5Tm90Rml0IiwicmVsYXRpb25zaGlwIiwiZXJyb3JYIiwiZXJyb3JZIiwicmVtb3ZlQWxsSGFuZGxlcnMiLCJ0ZXgiLCJXSElURSIsImNyZWF0ZVdoaXRlVGV4dHVyZSIsImJhc2VSZW5kZXJUZXh0dXJlIiwiX2xlZ2FjeVJlbmRlcmVyIiwibGVnYWN5UmVuZGVyZXIiLCJmaWx0ZXJGcmFtZSIsImZpbHRlclBvb2xLZXkiLCJyZXNpemVCYXNlVGV4dHVyZSIsIlJlbmRlclRleHR1cmVQb29sIiwidGV4dHVyZU9wdGlvbnMiLCJ0ZXh0dXJlUG9vbCIsImVuYWJsZUZ1bGxTY3JlZW4iLCJfcGl4ZWxzV2lkdGgiLCJfcGl4ZWxzSGVpZ2h0IiwiZ2V0T3B0aW1hbFRleHR1cmUiLCJTQ1JFRU5fS0VZIiwiZ2V0RmlsdGVyVGV4dHVyZSIsImZpbHRlclRleHR1cmUiLCJyZXR1cm5UZXh0dXJlIiwicmV0dXJuRmlsdGVyVGV4dHVyZSIsImRlc3Ryb3lUZXh0dXJlcyIsInNldFNjcmVlblNpemUiLCJzY3JlZW5LZXkiLCJBdHRyaWJ1dGUiLCJVSUQiLCJfc3RhdGljIiwiX2dsQnVmZmVycyIsInN0YXRpYyIsImJ5dGVTaXplTWFwIiwiNTEyNiIsIjUxMjMiLCI1MTIxIiwiVUlEJDEiLCJtYXAkMSIsImdsVmVydGV4QXJyYXlPYmplY3RzIiwiaW5zdGFuY2VkIiwicmVmQ291bnQiLCJpZHMiLCJidWZmZXJJbmRleCIsImdldEJ1ZmZlciIsImludGVybGVhdmUiLCJzaXplcyIsIm91dFNpemUiLCJsaXR0bGVPZmZzZXQiLCJhdHRyaWIiLCJnZW9tZXRyeU91dCIsImkkMiIsImokMSIsIm9mZnNldDIiLCJidWZmZXJJbmRleFRvQ291bnQiLCJpJDMiLCJpJDQiLCJpJDUiLCJpbmRleEJ1ZmZlckRhdGEiLCJqJDIiLCJRdWFkVXYiLCJ0YXJnZXRUZXh0dXJlRnJhbWUiLCJkZXN0aW5hdGlvbkZyYW1lIiwiaW52YWxpZGF0ZSIsIlVJRCQyIiwiVW5pZm9ybUdyb3VwIiwiRmlsdGVyU3RhdGUiLCJGaWx0ZXJTeXN0ZW0iLCJkZWZhdWx0RmlsdGVyU3RhY2siLCJzdGF0ZVBvb2wiLCJxdWFkVXYiLCJhY3RpdmVTdGF0ZSIsImdsb2JhbFVuaWZvcm1zIiwib3V0cHV0RnJhbWUiLCJpbnB1dFNpemUiLCJpbnB1dFBpeGVsIiwiaW5wdXRDbGFtcCIsImZpbHRlckNsYW1wIiwidXNlTWF4UGFkZGluZyIsImF1dG9GaXQiLCJnZXRPcHRpbWFsRmlsdGVyVGV4dHVyZSIsImxhc3RTdGF0ZSIsImZsb3AiLCJhcHBseUZpbHRlciIsInVTYW1wbGVyIiwiZmlsdGVyR2xvYmFscyIsImNhbGN1bGF0ZVNwcml0ZU1hdHJpeCIsIm91dHB1dE1hdHJpeCIsIl90ZXh0dXJlIiwibWFwcGVkTWF0cml4IiwiVEVNUF9NQVRSSVgiLCJlbXB0eVBvb2wiLCJPYmplY3RSZW5kZXJlciIsIkJhdGNoU3lzdGVtIiwiZW1wdHlSZW5kZXJlciIsImN1cnJlbnRSZW5kZXJlciIsInNldE9iamVjdFJlbmRlcmVyIiwib2JqZWN0UmVuZGVyZXIiLCJjb3B5Qm91bmRUZXh0dXJlcyIsImJvdW5kVGV4dHVyZXMiLCJib3VuZEFycmF5IiwidGV4QXJyYXkiLCJiYXRjaElkIiwiYm91bmQiLCJQUkVGRVJfRU5WIiwiV0VCR0wyIiwiQ09OVEVYVF9VSUQiLCJDb250ZXh0U3lzdGVtIiwiaGFuZGxlQ29udGV4dExvc3QiLCJoYW5kbGVDb250ZXh0UmVzdG9yZWQiLCJpc0xvc3QiLCJjb250ZXh0Q2hhbmdlIiwiaW5pdEZyb21Db250ZXh0IiwidmFsaWRhdGVDb250ZXh0IiwicnVubmVycyIsImluaXRGcm9tT3B0aW9ucyIsImdldEV4dGVuc2lvbnMiLCJ2ZXJ0ZXhBcnJheU9iamVjdCIsImFuaXNvdHJvcGljRmlsdGVyaW5nIiwidWludDMyRWxlbWVudEluZGV4IiwiZmxvYXRUZXh0dXJlIiwiZmxvYXRUZXh0dXJlTGluZWFyIiwidGV4dHVyZUhhbGZGbG9hdCIsInRleHR1cmVIYWxmRmxvYXRMaW5lYXIiLCJjb2xvckJ1ZmZlckZsb2F0IiwicG9zdHJlbmRlciIsIkZyYW1lYnVmZmVyU3lzdGVtIiwibWFuYWdlZEZyYW1lYnVmZmVycyIsInVua25vd25GcmFtZWJ1ZmZlciIsImhhc01SVCIsIndyaXRlRGVwdGhUZXh0dXJlIiwiZGlzcG9zZUFsbCIsIm5hdGl2ZURyYXdCdWZmZXJzRXh0ZW5zaW9uIiwibmF0aXZlRGVwdGhUZXh0dXJlRXh0ZW5zaW9uIiwiV0VCR0xfTEVHQUNZIiwiYWN0aXZlVGV4dHVyZXMiLCJkcmF3QnVmZmVyc1dFQkdMIiwiZmJvIiwiaW5pdEZyYW1lYnVmZmVyIiwidXBkYXRlRnJhbWVidWZmZXIiLCJyZXNpemVGcmFtZWJ1ZmZlciIsInRleHR1cmVQYXJ0IiwiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YIiwiREVQVEhfQVRUQUNITUVOVCIsImRpc3Bvc2VGcmFtZWJ1ZmZlciIsImZvcmNlU3RlbmNpbCIsIkdMQnVmZmVyIiwidXBkYXRlSUQiLCJieXRlU2l6ZU1hcCQxIiwiR2VvbWV0cnlTeXN0ZW0iLCJfYWN0aXZlR2VvbWV0cnkiLCJfYWN0aXZlVmFvIiwiaGFzVmFvIiwiaGFzSW5zdGFuY2UiLCJjYW5Vc2VVSW50MzJFbGVtZW50SW5kZXgiLCJib3VuZEJ1ZmZlcnMiLCJtYW5hZ2VkR2VvbWV0cmllcyIsIm1hbmFnZWRCdWZmZXJzIiwiY3JlYXRlVmVydGV4QXJyYXkiLCJuYXRpdmVWYW9FeHRlbnNpb24iLCJjcmVhdGVWZXJ0ZXhBcnJheU9FUyIsImJpbmRWZXJ0ZXhBcnJheSIsInZhbyIsImJpbmRWZXJ0ZXhBcnJheU9FUyIsImRlbGV0ZVZlcnRleEFycmF5IiwiZGVsZXRlVmVydGV4QXJyYXlPRVMiLCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yIiwiaW5zdGFuY2VFeHQiLCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiLCJkcmF3RWxlbWVudHNJbnN0YW5jZWQiLCJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSIsImRyYXdBcnJheXNJbnN0YW5jZWQiLCJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLCJ2YW9zIiwiaW5pdEdlb21ldHJ5VmFvIiwiYWN0aXZhdGVWYW8iLCJnbEJ1ZmZlciIsIl9ib3VuZEJ1ZmZlciIsImRyYXdUeXBlIiwiRFlOQU1JQ19EUkFXIiwiY2hlY2tDb21wYXRpYmlsaXR5Iiwic2hhZGVyQXR0cmlidXRlcyIsImdldFNpZ25hdHVyZSIsImF0dHJpYnMiLCJzdHJpbmdzIiwic2lnbmF0dXJlIiwidmFvT2JqZWN0SGFzaCIsInRlbXBTdHJpZGUiLCJ0ZW1wU3RhcnQiLCJhdHRyaWJTaXplIiwiZGlzcG9zZUJ1ZmZlciIsImRpc3Bvc2VHZW9tZXRyeSIsImJ1ZiIsInZhb0lkIiwibGFzdEJ1ZmZlciIsImJ5dGVTaXplIiwiVU5TSUdORURfSU5UIiwiTWFza0RhdGEiLCJhdXRvRGV0ZWN0IiwicG9vbGVkIiwiaXNNYXNrRGF0YSIsIl9zdGVuY2lsQ291bnRlciIsIl9zY2lzc29yQ291bnRlciIsIl9zY2lzc29yUmVjdCIsImNvbXBpbGVQcm9ncmFtIiwiYXR0cmlidXRlTG9jYXRpb25zIiwiZ2xWZXJ0U2hhZGVyIiwiZ2xGcmFnU2hhZGVyIiwiVkFMSURBVEVfU1RBVFVTIiwiYm9vbGVhbkFycmF5IiwiY29weUNvdW50ZXJzT3JSZXNldCIsIm1hc2tBYm92ZSIsIm1heEZyYWdtZW50UHJlY2lzaW9uIiwidW5rbm93bkNvbnRleHQiLCJnZXRUZXN0Q29udGV4dCIsInNldFByZWNpc2lvbiIsInJlcXVlc3RlZFByZWNpc2lvbiIsIm1heFN1cHBvcnRlZFByZWNpc2lvbiIsIkhJR0giLCJNRURJVU0iLCJHTFNMX1RPX1NJWkUiLCJmbG9hdCIsImludCIsIml2ZWMyIiwiaXZlYzMiLCJpdmVjNCIsImJ2ZWMyIiwiYnZlYzMiLCJidmVjNCIsInNhbXBsZXIyRCIsIkdMX1RBQkxFIiwiR0xfVE9fR0xTTF9UWVBFUyIsIkZMT0FUX1ZFQzIiLCJGTE9BVF9WRUMzIiwiRkxPQVRfVkVDNCIsIklOVCIsIklOVF9WRUMyIiwiSU5UX1ZFQzMiLCJJTlRfVkVDNCIsIkJPT0wiLCJCT09MX1ZFQzIiLCJCT09MX1ZFQzMiLCJCT09MX1ZFQzQiLCJGTE9BVF9NQVQyIiwiRkxPQVRfTUFUMyIsIkZMT0FUX01BVDQiLCJTQU1QTEVSXzJEIiwiU0FNUExFUl9DVUJFIiwiU0FNUExFUl8yRF9BUlJBWSIsIm1hcFR5cGUiLCJ0eXBlTmFtZXMiLCJ0biIsIkdMU0xfVE9fU0lOR0xFX1NFVFRFUlNfQ0FDSEVEIiwic2FtcGxlckN1YmUiLCJzYW1wbGVyMkRBcnJheSIsIkdMU0xfVE9fQVJSQVlfU0VUVEVSUyIsInVuc2FmZUV2YWwiLCJmcmFnVGVtcGxhdGUiLCJnZW5lcmF0ZUlmVGVzdFNyYyIsIm1heElmcyIsIlVJRCQzIiwibmFtZUNhY2hlIiwiUHJvZ3JhbSIsImRlZmF1bHRWZXJ0ZXhTcmMiLCJkZWZhdWx0RnJhZ21lbnRTcmMiLCJzaGFkZXJGcmFnbWVudCIsIkhJR0hfRkxPQVQiLCJnZXRNYXhGcmFnbWVudFByZWNpc2lvbiIsImV4dHJhY3REYXRhIiwiZ2xQcm9ncmFtcyIsInN0YXRpY0FjY2Vzc29ycyIsImdldEF0dHJpYnV0ZURhdGEiLCJ1bmlmb3JtRGF0YSIsImdldFVuaWZvcm1EYXRhIiwiYXR0cmlidXRlc0FycmF5IiwidG90YWxBdHRyaWJ1dGVzIiwiQUNUSVZFX0FUVFJJQlVURVMiLCJhdHRyaWJEYXRhIiwidG90YWxVbmlmb3JtcyIsIkFDVElWRV9VTklGT1JNUyIsInVuaWZvcm1Hcm91cCIsInByb3RvdHlwZUFjY2Vzc29ycyQyIiwiY2hlY2tVbmlmb3JtRXhpc3RzIiwiU3RhdGUiLCJibGVuZCIsInByb3RvdHlwZUFjY2Vzc29ycyQzIiwiY3VsbGluZyIsImNsb2Nrd2lzZUZyb250RmFjZSIsIl9wb2x5Z29uT2Zmc2V0IiwiZm9yMmQiLCJGaWx0ZXIiLCJhVGV4dHVyZUNvb3JkIiwiZmlsdGVyTWFuYWdlciIsImN1cnJlbnRTdGF0ZSIsIlNPVVJDRV9LRVlfTUFQIiwidGVtcE1hdCIsIlRleHR1cmVNYXRyaXgiLCJjbGFtcE1hcmdpbiIsIm1hcENvb3JkIiwidUNsYW1wRnJhbWUiLCJ1Q2xhbXBPZmZzZXQiLCJjbGFtcE9mZnNldCIsInByb3RvdHlwZUFjY2Vzc29ycyQ0IiwibXVsdGlwbHlVdnMiLCJ0ZXhCYXNlIiwiU3ByaXRlTWFza0ZpbHRlciIsIm1hc2tNYXRyaXgiLCJtYXNrU3ByaXRlIiwibnBtQWxwaGEiLCJtYXNrQ2xhbXAiLCJNYXNrU3lzdGVtIiwic2Npc3NvclJlbmRlclRhcmdldCIsImVuYWJsZVNjaXNzb3IiLCJhbHBoYU1hc2tQb29sIiwibWFza0RhdGFQb29sIiwiYWxwaGFNYXNrSW5kZXgiLCJzZXRNYXNrU3RhY2siLCJtYXNrRGF0YSIsImRldGVjdCIsIlNDSVNTT1IiLCJTVEVOQ0lMIiwiU1BSSVRFIiwicHVzaFNwcml0ZU1hc2siLCJwb3BTcHJpdGVNYXNrIiwiaXNGYXN0UmVjdCIsInJvdFgiLCJyb3RYWSIsImFscGhhTWFza0ZpbHRlciIsInN0YXNoRmlsdGVyQXJlYSIsIkFic3RyYWN0TWFza1N5c3RlbSIsImdsQ29uc3QiLCJnZXRTdGFja0xlbmd0aCIsImN1clN0YWNrTGVuIiwibmV3U3RhY2tMZW4iLCJfdXNlQ3VycmVudCIsIlNjaXNzb3JTeXN0ZW0iLCJXZWJHTFJlbmRlcmluZ0NvbnRleHQiLCJwcmV2RGF0YSIsIlN0ZW5jaWxTeXN0ZW0iLCJwcmV2TWFza0NvdW50IiwiX2dldEJpdHdpc2VNYXNrIiwiUHJvamVjdGlvblN5c3RlbSIsImNhbGN1bGF0ZVByb2plY3Rpb24iLCJzeW5jVW5pZm9ybUdyb3VwIiwiZ2xvYmFscyIsIlJlbmRlclRleHR1cmVTeXN0ZW0iLCJfYmFja2dyb3VuZENvbG9yUmdiYSIsImRlZmF1bHRNYXNrU3RhY2siLCJHTFByb2dyYW0iLCJ1bmlmb3JtR3JvdXBzIiwiVUlEJDQiLCJkZWZhdWx0U3luY0RhdGEiLCJTaGFkZXJTeXN0ZW0iLCJzeXN0ZW1DaGVjayIsInVuc2FmZUV2YWxTdXBwb3J0ZWQiLCJkb250U3luYyIsImdsUHJvZ3JhbSIsImdlbmVyYXRlU2hhZGVyIiwic2V0VW5pZm9ybXMiLCJzeW5jRGF0YSIsImdldGdsUHJvZ3JhbSIsImNyZWF0ZVN5bmNHcm91cHMiLCJnZW5lcmF0ZVVuaWZvcm1zU3luYyIsImF0dHJpYk1hcCIsInNoYWRlclByb2dyYW0iLCJTdGF0ZVN5c3RlbSIsInN0YXRlSWQiLCJfYmxlbmRFcSIsInNldEJsZW5kIiwic2V0RGVwdGhUZXN0Iiwic2V0RnJvbnRGYWNlIiwiY2hlY2tzIiwiZGVmYXVsdFN0YXRlIiwiU1JDX0FMUEhBIiwiU1JDX0lOIiwiU1JDX09VVCIsIk9ORV9NSU5VU19EU1RfQUxQSEEiLCJTUkNfQVRPUCIsIkRTVF9PVkVSIiwiRFNUX0lOIiwiRFNUX09VVCIsIkRTVF9BVE9QIiwiU1VCVFJBQ1QiLCJtYXBXZWJHTEJsZW5kTW9kZXNUb1BpeGkiLCJmb3JjZVN0YXRlIiwidXBkYXRlQ2hlY2siLCJjaGVja0JsZW5kTW9kZSIsImNoZWNrUG9seWdvbk9mZnNldCIsIlBPTFlHT05fT0ZGU0VUX0ZJTEwiLCJUZXh0dXJlR0NTeXN0ZW0iLCJjaGVja0NvdW50IiwibWF4SWRsZSIsImNoZWNrQ291bnRNYXgiLCJNQU5VQUwiLCJ0bSIsIm1hbmFnZWRUZXh0dXJlcyIsIndhc1JlbW92ZWQiLCJkZXN0cm95VGV4dHVyZSIsInVubG9hZCIsInRleHR1cmVTeXN0ZW0iLCJfZ2xSZW5kZXJUYXJnZXRzIiwiR0xUZXh0dXJlIiwiVGV4dHVyZVN5c3RlbSIsImN1cnJlbnRMb2NhdGlvbiIsIl91bmtub3duQm91bmRUZXh0dXJlcyIsInVua25vd25UZXh0dXJlIiwiZW1wdHlUZXh0dXJlMkQiLCJ0ZXh0dXJlR0MiLCJpbml0VGV4dHVyZVR5cGUiLCJSR0JBMzJGIiwiSEFMRl9GTE9BVCIsIlJHQkExNkYiLCJ1cGRhdGVUZXh0dXJlU3R5bGUiLCJza2lwUmVtb3ZlIiwiUE9XMiIsIkNMQU1QIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwiYW5pc290cm9waWNFeHQiLCJBYnN0cmFjdFJlbmRlcmVyIiwicHJlcmVuZGVyIiwiYWRkU3lzdGVtIiwiaW5pdFBsdWdpbnMiLCJfX3BsdWdpbnMiLCJzYXlIZWxsbyIsIkNsYXNzUmVmIiwic2tpcFVwZGF0ZVRyYW5zZm9ybSIsImNhY2hlUGFyZW50Iiwic2NyZWVuV2lkdGgiLCJzY3JlZW5IZWlnaHQiLCJyZW1vdmVWaWV3IiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwiVU5LTk9XTiIsImF1dG9SZXNpemUiLCJfYmFja2dyb3VuZENvbG9yIiwiX2JhY2tncm91bmRDb2xvclN0cmluZyIsInN0YXRpY01hcCIsImRlZmF1bHRGaWx0ZXIiLCJCYXRjaERyYXdDYWxsIiwiQmF0Y2hUZXh0dXJlQXJyYXkiLCJWaWV3YWJsZUJ1ZmZlciIsInJhd0JpbmFyeURhdGEiLCJ1aW50MzJWaWV3IiwiZmxvYXQzMlZpZXciLCJwcm90b3R5cGVBY2Nlc3NvcnMkNSIsImludDhWaWV3IiwidWludDhWaWV3IiwiaW50MTZWaWV3IiwidWludDE2VmlldyIsImludDMyVmlldyIsIl9pbnQ4VmlldyIsIl91aW50OFZpZXciLCJfaW50MTZWaWV3IiwiX3VpbnQxNlZpZXciLCJfaW50MzJWaWV3Iiwic2l6ZU9mIiwiQWJzdHJhY3RCYXRjaFJlbmRlcmVyIiwic2hhZGVyR2VuZXJhdG9yIiwiZ2VvbWV0cnlDbGFzcyIsIl92ZXJ0ZXhDb3VudCIsIl9pbmRleENvdW50IiwiX2J1ZmZlcmVkRWxlbWVudHMiLCJfYnVmZmVyZWRUZXh0dXJlcyIsIl9idWZmZXJTaXplIiwiX3NoYWRlciIsIl9wYWNrZWRHZW9tZXRyaWVzIiwiX3BhY2tlZEdlb21ldHJ5UG9vbFNpemUiLCJfZmx1c2hJZCIsIl9hQnVmZmVycyIsIl9pQnVmZmVycyIsIk1BWF9URVhUVVJFUyIsIm9uUHJlcmVuZGVyIiwiX2RjSW5kZXgiLCJfYUluZGV4IiwiX2lJbmRleCIsIl9hdHRyaWJ1dGVCdWZmZXIiLCJfaW5kZXhCdWZmZXIiLCJfdGVtcEJvdW5kVGV4dHVyZXMiLCJjaGVja01heElmU3RhdGVtZW50c0luU2hhZGVyIiwiaW5pdEZsdXNoQnVmZmVycyIsIl9kcmF3Q2FsbFBvb2wiLCJfdGV4dHVyZUFycmF5UG9vbCIsIk1BWF9TUFJJVEVTIiwiTUFYX1RBIiwiYnVpbGRUZXh0dXJlc0FuZERyYXdDYWxscyIsInRleHR1cmVBcnJheXMiLCJUSUNLIiwiY291bnRUZXhBcnJheXMiLCJidWlsZERyYXdDYWxscyIsImRyYXdDYWxscyIsImRjSW5kZXgiLCJpSW5kZXgiLCJkcmF3Q2FsbCIsInNwcml0ZUJsZW5kTW9kZSIsInBhY2tJbnRlcmxlYXZlZEdlb21ldHJ5IiwiYmluZEFuZENsZWFyVGV4QXJyYXkiLCJ1cGRhdGVHZW9tZXRyeSIsInBhY2tlZEdlb21ldHJpZXMiLCJhdHRyaWJ1dGVCdWZmZXIiLCJfYnVmZmVyIiwiZHJhd0JhdGNoZXMiLCJkY0NvdW50Iiwic3RhdGVTeXN0ZW0iLCJjdXJUZXhBcnJheSIsInJlZiQxIiwiZ2V0QXR0cmlidXRlQnVmZmVyIiwiZ2V0SW5kZXhCdWZmZXIiLCJyb3VuZGVkUDIiLCJyb3VuZGVkU2l6ZUluZGV4Iiwicm91bmRlZFNpemUiLCJwYWNrZWRWZXJ0aWNlcyIsImluZGljaWVzIiwiYXJnYiIsIl90aW50UkdCIiwiQmF0Y2hTaGFkZXJHZW5lcmF0b3IiLCJkZWZhdWx0R3JvdXBDYWNoZSIsInVTYW1wbGVycyIsImdlbmVyYXRlU2FtcGxlU3JjIiwidHJhbnNsYXRpb25NYXRyaXgiLCJCYXRjaEdlb21ldHJ5IiwiZGVmYXVsdFZlcnRleCQyIiwiZGVmYXVsdEZyYWdtZW50JDIiLCJCYXRjaFBsdWdpbkZhY3RvcnkiLCJzdGF0aWNBY2Nlc3NvcnMkMSIsImRlZmF1bHRGcmFnbWVudFRlbXBsYXRlIiwiQmF0Y2hQbHVnaW4iLCJCYXRjaFJlbmRlcmVyIiwiQXBwbGljYXRpb24iLCJmb3JjZUNhbnZhcyIsImF1dG9EZXRlY3RSZW5kZXJlciIsInN0YWdlIiwiX3BsdWdpbnMiLCJzdGFnZU9wdGlvbnMiLCJfb3B0aW9ucyIsIlJlc2l6ZVBsdWdpbiIsImRvbSIsIl9yZXNpemVUbyIsInJlc2l6ZVRvIiwiVEVNUF9SRUNUIiwiRXh0cmFjdCIsImV4dHJhY3QiLCJnZW5lcmF0ZWQiLCJjYW52YXNCdWZmZXIiLCJ3ZWJnbFBpeGVscyIsImFycmF5UG9zdERpdmlkZSIsInRhcmdldCQxIiwiX25vb3AiLCJlYWNoU2VyaWVzIiwiZGVmZXJOZXh0Iiwib25seU9uY2UiLCJjYWxsRm4iLCJjb25jdXJyZW5jeSIsIndvcmtlcnMiLCJfdGFza3MiLCJzYXR1cmF0ZWQiLCJ1bnNhdHVyYXRlZCIsImRyYWluIiwiaWRsZSIsImluc2VydEF0RnJvbnQiLCJfZGVmaW5lUHJvcGVydGllcyIsInVzZVhkciIsIlhEb21haW5SZXF1ZXN0IiwiX25vb3AkMSIsIl9zZXRGbGFnIiwiU1RBVFVTX0ZMQUdTIiwiREFUQV9VUkwiLCJfZ2V0RXh0ZW5zaW9uIiwibG9hZFR5cGUiLCJfZGV0ZXJtaW5lTG9hZFR5cGUiLCJ4aHJUeXBlIiwicHJvZ3Jlc3NDaHVuayIsIl9kZXF1ZXVlIiwiX29uTG9hZEJpbmRpbmciLCJfZWxlbWVudFRpbWVyIiwiX2JvdW5kQ29tcGxldGUiLCJfYm91bmRPbkVycm9yIiwiX2JvdW5kT25Qcm9ncmVzcyIsIl9vblByb2dyZXNzIiwiX2JvdW5kT25UaW1lb3V0IiwiX29uVGltZW91dCIsIl9ib3VuZFhock9uRXJyb3IiLCJfeGhyT25FcnJvciIsIl9ib3VuZFhock9uVGltZW91dCIsIl94aHJPblRpbWVvdXQiLCJfYm91bmRYaHJPbkFib3J0IiwiX3hock9uQWJvcnQiLCJfYm91bmRYaHJPbkxvYWQiLCJfeGhyT25Mb2FkIiwib25BZnRlck1pZGRsZXdhcmUiLCJzZXRFeHRlbnNpb25Mb2FkVHlwZSIsImV4dG5hbWUiLCJzZXRFeHRNYXAiLCJfbG9hZFR5cGVNYXAiLCJzZXRFeHRlbnNpb25YaHJUeXBlIiwiX3hoclR5cGVNYXAiLCJfcHJvdG8iLCJfY2xlYXJFdmVudHMiLCJfZmluaXNoIiwieGRyIiwiRU1QVFlfR0lGIiwiX2RldGVybWluZUNyb3NzT3JpZ2luIiwiTE9BRF9UWVBFIiwiSU1BR0UiLCJfbG9hZEVsZW1lbnQiLCJBVURJTyIsIl9sb2FkU291cmNlRWxlbWVudCIsIlZJREVPIiwiWEhSIiwiX2xvYWRYZHIiLCJfbG9hZFhociIsIl9oYXNGbGFnIiwibG9hZEVsZW1lbnQiLCJza2lwU291cmNlIiwiaXNDb2Nvb25KUyIsIm1pbWVUeXBlcyIsIl9jcmVhdGVTb3VyY2UiLCJfbWltZVR5cGVzIiwiX2RldGVybWluZVhoclR5cGUiLCJYSFJfUkVTUE9OU0VfVFlQRSIsIkRPQ1VNRU5UIiwiVEVYVCIsInJlcVR5cGUiLCJCVUZGRVIiLCJkb21wYXJzZXIiLCJYTUwiLCJpc0RhdGFVcmwiLCJzbGFzaEluZGV4IiwicXVlcnlTdGFydCIsImhhc2hTdGFydCIsIl9nZXRNaW1lRnJvbVhoclR5cGUiLCJCTE9CIiwiZ2lmIiwicG5nIiwiYm1wIiwianBnIiwianBlZyIsInRpZiIsInRpZmYiLCJ3ZWJwIiwidGdhIiwieGh0bWwiLCJodG0iLCJ0bXgiLCJ0c3giLCJ0eHQiLCJ0dGYiLCJvdGYiLCJVcmwiLCJjYWNoaW5nIiwicGFyc2luZyIsImlueCIsImJ5dGVidWZmZXIiLCJlbmNvZGVkQ2hhckluZGV4ZXMiLCJqbngiLCJfam54IiwiZW5jb2RlQmluYXJ5Iiwicmd4RXh0cmFjdFVybEhhc2giLCJiYXNlVXJsIiwiZGVmYXVsdFF1ZXJ5U3RyaW5nIiwiX2JlZm9yZU1pZGRsZXdhcmUiLCJfYWZ0ZXJNaWRkbGV3YXJlIiwiX3Jlc291cmNlc1BhcnNpbmciLCJfYm91bmRMb2FkUmVzb3VyY2UiLCJfbG9hZFJlc291cmNlIiwiX2RlZmF1bHRCZWZvcmVNaWRkbGV3YXJlIiwiX2RlZmF1bHRBZnRlck1pZGRsZXdhcmUiLCJwYXJlbnRSZXNvdXJjZSIsIl9wcmVwYXJlVXJsIiwiaW5jb21wbGV0ZUNoaWxkcmVuIiwiX2kyIiwiZWFjaENodW5rIiwiX2kzIiwiX29uU3RhcnQiLCJfb25Db21wbGV0ZSIsIl90aGlzMiIsIl9vbkxvYWQiLCJfdGhpczMiLCJSZXNvdXJjZUxvYWRlciIsIkFwcExvYWRlclBsdWdpbiIsInNoYXJlZExvYWRlciIsIkxvYWRlclJlc291cmNlIiwiUGFydGljbGVCdWZmZXIiLCJkeW5hbWljUHJvcGVydHlGbGFncyIsImR5bmFtaWNQcm9wZXJ0aWVzIiwic3RhdGljUHJvcGVydGllcyIsImF0dHJpYnV0ZU5hbWUiLCJ1cGxvYWRGdW5jdGlvbiIsInN0YXRpY1N0cmlkZSIsInN0YXRpY0J1ZmZlciIsInN0YXRpY0RhdGEiLCJzdGF0aWNEYXRhVWludDMyIiwiZHluYW1pY1N0cmlkZSIsImR5bmFtaWNCdWZmZXIiLCJkeW5hbWljRGF0YSIsImR5bmFtaWNEYXRhVWludDMyIiwiaW5pdEJ1ZmZlcnMiLCJkeW5hbWljT2Zmc2V0Iiwib3V0QnVmZmVyIiwidG90YWxJbmRpY2VzIiwiY3JlYXRlSW5kaWNlc0ZvclF1YWRzIiwiZHluQnVmZmVyIiwic3RhdGljT2Zmc2V0IiwicHJvcGVydHkkMSIsInN0YXRCdWZmZXIiLCJwcm9wZXJ0eSQyIiwicHJvcGVydHkkMyIsInVwbG9hZER5bmFtaWMiLCJ1cGxvYWRTdGF0aWMiLCJQYXJ0aWNsZVJlbmRlcmVyIiwidXBsb2FkVmVydGljZXMiLCJ1cGxvYWRQb3NpdGlvbiIsInVwbG9hZFJvdGF0aW9uIiwidXBsb2FkVXZzIiwidXBsb2FkVGludCIsIl9tYXhTaXplIiwiX2JhdGNoU2l6ZSIsInRvdGFsQ2hpbGRyZW4iLCJfYnVmZmVycyIsImdlbmVyYXRlQnVmZmVycyIsInVDb2xvciIsInRpbnRSZ2IiLCJ1cGRhdGVTdGF0aWMiLCJfZ2VuZXJhdGVPbmVNb3JlQnVmZmVyIiwiYmlkIiwiX2J1ZmZlclVwZGF0ZUlEcyIsIl9wcm9wZXJ0aWVzIiwiaDAiLCJoMSIsInNwcml0ZVBvc2l0aW9uIiwic3ByaXRlUm90YXRpb24iLCJ0ZXh0dXJlVXZzIiwiR1JBUEhJQ1NfQ1VSVkVTIiwiYWRhcHRpdmUiLCJtaW5TZWdtZW50cyIsIm1heFNlZ21lbnRzIiwiX3NlZ21lbnRzQ291bnQiLCJkZWZhdWx0U2VnbWVudHMiLCJGaWxsU3R5bGUiLCJidWlsZFBvbHkiLCJidWlsZCIsImdyYXBoaWNzRGF0YSIsInRyaWFuZ3VsYXRlIiwiaG9sZUFycmF5IiwidmVydFBvcyIsImJ1aWxkQ2lyY2xlIiwiY2lyY2xlRGF0YSIsInRvdGFsU2VncyIsImJ1aWxkUmVjdGFuZ2xlIiwicmVjdERhdGEiLCJidWlsZFJvdW5kZWRSZWN0YW5nbGUiLCJycmVjdERhdGEiLCJxdWFkcmF0aWNCZXppZXJDdXJ2ZSIsInZlY1BvcyIsImdldFB0IiwicGVyYyIsImNwWCIsImNwWSIsInhhIiwieWEiLCJ4YiIsInliIiwiYnVpbGRMaW5lIiwiY2xvc2VkU2hhcGUiLCJidWlsZE5hdGl2ZUxpbmUiLCJjbG9zZVBvaW50RXBzIiwiY2xvc2VkUGF0aCIsIm1pZFBvaW50WCIsIm1pZFBvaW50WSIsImluZGV4Q291bnQiLCJpbmRleFN0YXJ0IiwicDJ4IiwicDJ5IiwicDN4IiwicDN5IiwicGVycHgiLCJwZXJweSIsInBlcnAyeCIsInBlcnAyeSIsInBlcnAzeCIsInBlcnAzeSIsImFsaWdubWVudCIsImJ1aWxkTm9uTmF0aXZlTGluZSIsIkFyY1V0aWxzIiwiY3VydmVUbyIsImNjIiwidHQiLCJrMSIsImsyIiwiajEiLCJqMiIsInN0YXJ0WCIsInN0YXJ0WSIsInN3ZWVwIiwidGhldGEyIiwiY1RoZXRhIiwic1RoZXRhIiwic2VnTWludXMiLCJCZXppZXJVdGlscyIsImN1cnZlTGVuZ3RoIiwiY3BYMiIsImNwWTIiLCJ0MyIsIm50IiwibnQyIiwibnQzIiwiZHQzIiwiUXVhZHJhdGljVXRpbHMiLCJiYSIsIkJhdGNoUGFydCIsImF0dHJpYlN0YXJ0IiwiZW5kQXR0cmliIiwiRklMTF9DT01NQU5EUyIsIkJBVENIX1BPT0wiLCJEUkFXX0NBTExfUE9PTCIsIkdyYXBoaWNzRGF0YSIsInRtcFBvaW50IiwidG1wQm91bmRzIiwiR3JhcGhpY3NHZW9tZXRyeSIsInRleHR1cmVJZHMiLCJiYXRjaERpcnR5IiwiY2FjaGVEaXJ0eSIsImNsZWFyRGlydHkiLCJzaGFwZUluZGV4IiwiYm91bmRzRGlydHkiLCJib3VuZHNQYWRkaW5nIiwiYmF0Y2hhYmxlIiwiaW5kaWNlc1VpbnQxNiIsImJhdGNoUGFydCIsImRyYXdTaGFwZSIsImRyYXdIb2xlIiwibGFzdFNoYXBlIiwiaGl0SG9sZSIsInVwZGF0ZUJhdGNoZXMiLCJ2YWxpZGF0ZUJhdGNoaW5nIiwiY3VycmVudFN0eWxlIiwidHJhbnNmb3JtUG9pbnRzIiwibmV4dFRleHR1cmUiLCJhdHRyaWJJbmRleCIsInByb2Nlc3NGaWxsIiwicHJvY2Vzc0xpbmUiLCJfY29tcGFyZVN0eWxlcyIsImFkZFV2cyIsImluZGV4JDEiLCJpc0JhdGNoYWJsZSIsInBhY2tCYXRjaGVzIiwic3R5bGVBIiwic3R5bGVCIiwiQkFUQ0hBQkxFX1NJWkUiLCJjdXJyZW50R3JvdXAiLCJMSU5FUyIsImFkZFRleHR1cmVJZHMiLCJwYWNrQXR0cmlidXRlcyIsImdsUG9pbnRzIiwiZjMyIiwidTMyIiwicHJvY2Vzc0hvbGVzIiwic2VxdWVuY2VCb3VuZHMiLCJjdXJNYXRyaXgiLCJuZXh0TWF0cml4IiwidXZzU3RhcnQiLCJhZGp1c3RVdnMiLCJMaW5lU3R5bGUiLCJERUZBVUxUX1NIQURFUlMiLCJfZmlsbFN0eWxlIiwiX2xpbmVTdHlsZSIsIl9ob2xlTW9kZSIsImJhdGNoVGludCIsIl90cmFuc2Zvcm1JRCIsImZpbmlzaFBvbHkiLCJfdGludCIsImxpbmVUZXh0dXJlU3R5bGUiLCJzdGFydFBvbHkiLCJfaW5pdEN1cnZlIiwiYXJjVG8iLCJyYWRpdXMkMSIsInlEaWZmIiwiYmVnaW5GaWxsIiwiYmVnaW5UZXh0dXJlRmlsbCIsImVuZEZpbGwiLCJkcmF3UmVjdCIsImRyYXdSb3VuZGVkUmVjdCIsImRyYXdDaXJjbGUiLCJkcmF3RWxsaXBzZSIsImRyYXdQb2x5Z29uIiwiZHJhd1N0YXIiLCJfcG9wdWxhdGVCYXRjaGVzIiwiX3JlbmRlckJhdGNoZWQiLCJfcmVuZGVyRGlyZWN0IiwiZ0kiLCJfYmF0Y2hSR0IiLCJjYWxjdWxhdGVWZXJ0aWNlcyIsImNhbGN1bGF0ZVRpbnRzIiwiX3Jlc29sdmVEaXJlY3RTaGFkZXIiLCJfcmVuZGVyRHJhd0NhbGxEaXJlY3QiLCJncm91cFRleHR1cmVDb3VudCIsIl9URU1QX1BPSU5UIiwidGludFJHQiIsInNldE1hdHJpeCIsImJlZ2luSG9sZSIsImVuZEhvbGUiLCJfYW5jaG9yIiwiX29uQW5jaG9yVXBkYXRlIiwiX2NhY2hlZFRpbnQiLCJ2ZXJ0ZXhUcmltbWVkRGF0YSIsIl90ZXh0dXJlSUQiLCJfdHJhbnNmb3JtVHJpbW1lZElEIiwiX3RleHR1cmVUcmltbWVkSUQiLCJfcm91bmRQaXhlbHMiLCJfb25UZXh0dXJlVXBkYXRlIiwiY2FsY3VsYXRlVHJpbW1lZFZlcnRpY2VzIiwiZGVzdHJveUJhc2VUZXh0dXJlIiwiVEVYVF9HUkFESUVOVCIsImRlZmF1bHRTdHlsZSIsImJyZWFrV29yZHMiLCJkcm9wU2hhZG93IiwiZHJvcFNoYWRvd0FscGhhIiwiZHJvcFNoYWRvd0FuZ2xlIiwiZHJvcFNoYWRvd0JsdXIiLCJkcm9wU2hhZG93Q29sb3IiLCJkcm9wU2hhZG93RGlzdGFuY2UiLCJmaWxsR3JhZGllbnRUeXBlIiwiZmlsbEdyYWRpZW50U3RvcHMiLCJmb250VmFyaWFudCIsIm1pdGVyTGltaXQiLCJ3aGl0ZVNwYWNlIiwiZ2VuZXJpY0ZvbnRGYW1pbGllcyIsInN0eWxlSUQiLCJkZWVwQ29weVByb3BlcnRpZXMiLCJnZXRTaW5nbGVDb2xvciIsImdldENvbG9yIiwicHJvcGVydHlPYmoiLCJjbG9uZWRQcm9wZXJ0aWVzIiwiX2JyZWFrV29yZHMiLCJfZHJvcFNoYWRvdyIsIl9kcm9wU2hhZG93QWxwaGEiLCJfZHJvcFNoYWRvd0FuZ2xlIiwiX2Ryb3BTaGFkb3dCbHVyIiwiX2Ryb3BTaGFkb3dDb2xvciIsIm91dHB1dENvbG9yIiwiX2Ryb3BTaGFkb3dEaXN0YW5jZSIsIl9maWxsIiwiX2ZpbGxHcmFkaWVudFR5cGUiLCJfZmlsbEdyYWRpZW50U3RvcHMiLCJhcmVBcnJheXNFcXVhbCIsIl9mb250RmFtaWx5IiwiX2ZvbnRTdHlsZSIsIl9mb250VmFyaWFudCIsIl9mb250V2VpZ2h0IiwiX2xpbmVIZWlnaHQiLCJfbGVhZGluZyIsIl9saW5lSm9pbiIsIl9taXRlckxpbWl0IiwiX3BhZGRpbmciLCJfc3Ryb2tlIiwiX3N0cm9rZVRoaWNrbmVzcyIsIl90ZXh0QmFzZWxpbmUiLCJfdHJpbSIsIl93aGl0ZVNwYWNlIiwiX3dvcmRXcmFwIiwiX3dvcmRXcmFwV2lkdGgiLCJ0b0ZvbnRTdHJpbmciLCJmb250U2l6ZVN0cmluZyIsImZvbnRGYW1pbGllcyIsIlRleHRNZXRyaWNzIiwiZm9udFByb3BlcnRpZXMiLCJtZWFzdXJlRm9udCIsImNvbGxhcHNlU3BhY2VzIiwiY29sbGFwc2VOZXdsaW5lcyIsImNhblByZXBlbmRTcGFjZXMiLCJpc05ld2xpbmUiLCJjdXJySXNCcmVha2luZ1NwYWNlIiwiaXNCcmVha2luZ1NwYWNlIiwibGFzdElzQnJlYWtpbmdTcGFjZSIsInRva2VuV2lkdGgiLCJnZXRGcm9tQ2FjaGUiLCJjYW5CcmVha1dvcmRzIiwiY2hhcmFjdGVycyIsIndvcmRXcmFwU3BsaXQiLCJuZXh0Q2hhciIsImxhc3RDaGFyIiwiY2FuQnJlYWtDaGFycyIsImNoYXJhY3RlcldpZHRoIiwiaXNMYXN0VG9rZW4iLCJuZXdMaW5lIiwiX25ld2xpbmVzIiwiX2JyZWFraW5nU3BhY2VzIiwiX2ZvbnRzIiwibWV0cmljc1N0cmluZyIsIk1FVFJJQ1NfU1RSSU5HIiwiQkFTRUxJTkVfU1lNQk9MIiwiQkFTRUxJTkVfTVVMVElQTElFUiIsImNsZWFyTWV0cmljcyIsImRlZmF1bHREZXN0cm95T3B0aW9ucyIsIm93bkNhbnZhcyIsIl9vd25DYW52YXMiLCJfcmVzb2x1dGlvbiIsIl9hdXRvUmVzb2x1dGlvbiIsIl9zdHlsZSIsIl9zdHlsZUxpc3RlbmVyIiwibG9jYWxTdHlsZUlEIiwicmVzcGVjdERpcnR5IiwibWVhc3VyZWQiLCJwYXNzZXNDb3VudCIsImlzU2hhZG93UGFzcyIsImRzT2Zmc2V0VGV4dCIsImRzT2Zmc2V0U2hhZG93IiwiX2dlbmVyYXRlRmlsbFN0eWxlIiwiZHJhd0xldHRlclNwYWNpbmciLCJpc1N0cm9rZSIsImN1cnJlbnRQb3NpdGlvbiIsInN0cmluZ0FycmF5IiwiY3VycmVudFdpZHRoIiwiY3VycmVudENoYXIiLCJ0cmltQ2FudmFzIiwiX29uU3R5bGVDaGFuZ2UiLCJkcm9wU2hhZG93Q29ycmVjdGlvbiIsImxlbmd0aFBsdXMxIiwiY3JlYXRlTGluZWFyR3JhZGllbnQiLCJsYXN0SXRlcmF0aW9uU3RvcCIsImdyYWRTdG9wTGluZUhlaWdodCIsInRoaXNMaW5lVG9wIiwiZ2xvYmFsU3RvcCIsImNsYW1wZWRTdG9wIiwiYWRkQ29sb3JTdG9wIiwidG90YWxJdGVyYXRpb25zIiwiY3VycmVudEl0ZXJhdGlvbiIsIlVQTE9BRFNfUEVSX0ZSQU1FIiwiQ291bnRMaW1pdGVyIiwibWF4SXRlbXNQZXJGcmFtZSIsIml0ZW1zTGVmdCIsImJlZ2luRnJhbWUiLCJhbGxvd2VkVG9VcGxvYWQiLCJCYXNlUHJlcGFyZSIsImxpbWl0ZXIiLCJ1cGxvYWRIb29rSGVscGVyIiwiYWRkSG9va3MiLCJ1cGxvYWRIb29rcyIsImNvbXBsZXRlcyIsInRpY2tpbmciLCJkZWxheWVkVGljayIsInByZXBhcmVJdGVtcyIsInJlZ2lzdGVyRmluZEhvb2siLCJmaW5kVGV4dCIsImZpbmRUZXh0U3R5bGUiLCJmaW5kTXVsdGlwbGVCYXNlVGV4dHVyZXMiLCJmaW5kQmFzZVRleHR1cmUiLCJmaW5kVGV4dHVyZSIsInJlZ2lzdGVyVXBsb2FkSG9vayIsImRyYXdUZXh0IiwiY2FsY3VsYXRlVGV4dFN0eWxlIiwiX3RleHR1cmVzIiwiaGVscGVyIiwiVVRJTElUWSIsInVwbG9hZGVkIiwibGVuJDEiLCJhZGRIb29rIiwidXBsb2FkSG9vayIsIlByZXBhcmUiLCJmaW5kR3JhcGhpY3MiLCJ1cGxvYWRCYXNlVGV4dHVyZXMiLCJ1cGxvYWRHcmFwaGljcyIsIlRpbWVMaW1pdGVyIiwibWF4TWlsbGlzZWNvbmRzIiwiZnJhbWVTdGFydCIsIlNwcml0ZXNoZWV0IiwicmVzb2x1dGlvbkZpbGVuYW1lIiwiX3VwZGF0ZVJlc29sdXRpb24iLCJfZnJhbWVzIiwiX2ZyYW1lS2V5cyIsIl9iYXRjaEluZGV4IiwiX2NhbGxiYWNrIiwiQkFUQ0hfU0laRSIsIl9wcm9jZXNzRnJhbWVzIiwiX3Byb2Nlc3NBbmltYXRpb25zIiwiX3BhcnNlQ29tcGxldGUiLCJfbmV4dEJhdGNoIiwiaW5pdGlhbEZyYW1lSW5kZXgiLCJtYXhGcmFtZXMiLCJhbmltTmFtZSIsIlNwcml0ZXNoZWV0TG9hZGVyIiwiaW1hZ2VSZXNvdXJjZU5hbWUiLCJsb2FkT3B0aW9ucyIsImltYWdlTWV0YWRhdGEiLCJnZXRSZXNvdXJjZVBhdGgiLCJzcHJpdGVzaGVldCIsIlRpbGluZ1Nwcml0ZVJlbmRlcmVyIiwic2ltcGxlU2hhZGVyIiwidHMiLCJ1dlJlc3BlY3RBbmNob3IiLCJiYXNlVGV4IiwidGlsZVRyYW5zZm9ybSIsInVNYXBDb29yZCIsInVUcmFuc2Zvcm0iLCJfdGV4dFdpZHRoIiwiX3RleHRIZWlnaHQiLCJfZ2x5cGhzIiwiX21heExpbmVIZWlnaHQiLCJtYXhMaW5lSGVpZ2h0IiwidGV4dEhlaWdodCIsImZvbnRzIiwicHJldkNoYXJDb2RlIiwibGFzdExpbmVXaWR0aCIsImxhc3RCcmVha1BvcyIsImxhc3RCcmVha1dpZHRoIiwic3BhY2VzUmVtb3ZlZCIsImNoYXJEYXRhIiwibGluZUFsaWduT2Zmc2V0cyIsImFsaWduT2Zmc2V0IiwibGVuQ2hhcnMiLCJyZWdpc3RlckZvbnQiLCJwYWdlcyIsInBhZ2VzVGV4dHVyZXMiLCJwYWdlIiwidGV4dHVyZVJlY3QiLCJCaXRtYXBGb250TG9hZGVyIiwiZGlybmFtZSIsInhtbFVybCIsInBhZ2VGaWxlIiwiYml0bWFwUmVzb3VyY2UiLCJDb2xvck1hdHJpeEZpbHRlciIsInVBbHBoYSIsIl9sb2FkTWF0cml4IiwibmV3TWF0cml4IiwiX211bHRpcGx5IiwiX2NvbG9yTWF0cml4IiwiYnJpZ2h0bmVzcyIsImdyZXlzY2FsZSIsImJsYWNrQW5kV2hpdGUiLCJjb3NSIiwic2luUiIsInNxclciLCJjb250cmFzdCIsIm5lZ2F0aXZlIiwic2VwaWEiLCJ0ZWNobmljb2xvciIsInBvbGFyb2lkIiwidG9CR1IiLCJrb2RhY2hyb21lIiwiYnJvd25pIiwidmludGFnZSIsImNvbG9yVG9uZSIsImRlc2F0dXJhdGlvbiIsInRvbmVkIiwibGlnaHRDb2xvciIsImRhcmtDb2xvciIsImxSIiwibEciLCJsQiIsImRSIiwiZEciLCJkQiIsIm5pZ2h0IiwicHJlZGF0b3IiLCJsc2QiLCJncmF5c2NhbGUiLCJfY2FjaGVBc0JpdG1hcCIsIl9jYWNoZURhdGEiLCJDYWNoZURhdGEiLCJ0ZXh0dXJlQ2FjaGVJZCIsIm9yaWdpbmFsUmVuZGVyIiwib3JpZ2luYWxSZW5kZXJDYW52YXMiLCJvcmlnaW5hbENhbGN1bGF0ZUJvdW5kcyIsIm9yaWdpbmFsR2V0TG9jYWxCb3VuZHMiLCJvcmlnaW5hbFVwZGF0ZVRyYW5zZm9ybSIsIm9yaWdpbmFsSGl0VGVzdCIsIm9yaWdpbmFsRGVzdHJveSIsIm9yaWdpbmFsTWFzayIsIm9yaWdpbmFsRmlsdGVyQXJlYSIsImNhY2hlQXNCaXRtYXAiLCJvcmlnaW5hbENvbnRhaW5zUG9pbnQiLCJfcmVuZGVyQ2FjaGVkIiwiX3JlbmRlckNhY2hlZENhbnZhcyIsIl9jYWNoZUFzQml0bWFwRGVzdHJveSIsIl9kZXN0cm95Q2FjaGVkRGlzcGxheU9iamVjdCIsIl9pbml0Q2FjaGVkRGlzcGxheU9iamVjdCIsImNhY2hlQWxwaGEiLCJjYWNoZWRSZW5kZXJUZXh0dXJlIiwiY2FjaGVkU291cmNlRnJhbWUiLCJjYWNoZWRQcm9qZWN0aW9uVHJhbnNmb3JtIiwiX2NhbGN1bGF0ZUNhY2hlZEJvdW5kcyIsIl9nZXRDYWNoZWRMb2NhbEJvdW5kcyIsImNhY2hlZFNwcml0ZSIsIl9pbml0Q2FjaGVkRGlzcGxheU9iamVjdENhbnZhcyIsIl9yZW5kZXJDYW52YXMiLCJjYWNoZWRSZW5kZXJUYXJnZXQiLCJfcHJvalRyYW5zZm9ybSIsImdldEdsb2JhbFBvc2l0aW9uIiwiTWVzaEJhdGNoVXZzIiwiX2J1ZmZlclVwZGF0ZUlkIiwiX3RleHR1cmVVcGRhdGVJZCIsInRlbXBQb2x5Z29uIiwidmVydGV4RGlydHkiLCJiYXRjaFV2cyIsInZlcnRpY2VzQnVmZmVyIiwiX3JlbmRlclRvQmF0Y2giLCJfcmVuZGVyRGVmYXVsdCIsImNhbGN1bGF0ZVV2cyIsInZlcnRleERpcnR5SWQiLCJnZW9tVXZzIiwiaW5kMCIsImluZDEiLCJpbmQyIl0sIm1hcHBpbmdzIjoiNkJBQUEsRUFBUSxPQUNSLEVBQVEsS0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsS0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxLQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLEtBQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsS0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE1BQ1IsSUFBSUEsRUFBTyxFQUFRLE9BRW5CQyxFQUFPQyxRQUFVRixHLGdCQ2pOakIsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsSUFBSUEsRUFBTyxFQUFRLE9BRW5CQyxFQUFPQyxRQUFVRixHLFVDTGpCQyxFQUFPQyxRQUFVLFNBQVVDLEdBQ3pCLEdBQWlCLG1C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LE1BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLFEsZ0JDMUJSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLFEsZ0JDUFIsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxRLGdCQ0hSLEVBQVEsT0FDUixJQUFJbEMsRUFBUyxFQUFRLE9BRXJCOUIsRUFBT0MsUUFBVTZCLEcsZ0JDSGpCLEVBQVEsUSxnQkNBUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxLQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLEtBQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsTUFDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLFEsZ0JDM0JSLEVBQVEsT0FDUixFQUFRLFEsZ0JDQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLFEsZ0JDSlIsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE1BQ1IsRUFBUSxRLGdCQ05SLEVBQVEsUSxnQkNBUixFQUFRLFEsZ0JDQVIsRUFBUSxNQUNSLEVBQVEsT0FDUixFQUFRLE8sZUNGUixFQUFRLE9BQ1IsRUFBUSxRLGdCQ0RSLEVBQVEsUSxnQkNDUixFQUFRLE8sZ0JDRFIsRUFBUSxPQUNSLEVBQVEsUSxnQkNEUixFQUFRLFEsZUNBUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNSLEVBQVEsT0FDUixFQUFRLE9BQ1IsRUFBUSxPQUNS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LE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsYUFBYyxNQUNkLFVBQVcsTUFDWCxhQUFjLE1BQ2QsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsYUFBYyxLQUNkLGdCQUFpQixLQUNqQixPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsVUFBVyxNQUNYLGFBQWMsTUFDZCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxhQUFjLE1BQ2QsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsS0FDUixVQUFXLEtBQ1gsT0FBUSxLQUNSLFVBQVcsS0FDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxPQUFRLE1BQ1IsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxhQUFjLE1BQ2QsVUFBVyxNQUNYLE9BQVEsTUFDUixVQUFXLE1BQ1gsT0FBUSxNQUNSLFVBQVcsTUFDWCxP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LElBQzFFLE9BQVEsSUFBTSxPQUFRLElBQUssT0FBUSxJQUFLLE9BQVEsSUFDaEQsT0FBUSxJQUFNLE9BQVEsSUFBSyxPQUFRLElBQUssT0FBUSxJQUNoRCxPQUFRLElBQU0sT0FBUSxJQUFLLE9BQVEsSUFDbkMsT0FBUSxLQUFNLE9BQVEsS0FDdEIsT0FBUSxLQUFNLE9BQVEsS0FDdEIsT0FBUSxLQUVSLE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUN6QyxPQUFVLElBQU0sT0FBVSxJQUFLLE9BQVUsSUFDekMsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUN4RCxPQUFVLElBQU0sT0FBVSxJQUFLLE9BQVUsSUFBSyxPQUFVLElBQ3hELE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDeEQsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDdkUsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDdkUsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUN4RCxPQUFVLElBQU0sT0FBVSxJQUFLLE9BQVUsSUFBSyxPQUFVLElBQ3hELE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDeEQsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDdkUsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDdkUsT0FBVSxJQUFNLE9BQVUsSUFDMUIsT0FBVSxJQUFNLE9BQVUsSUFBSyxPQUFVLElBQ3pDLE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFBSyxPQUFVLElBQ3ZFLE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFBSyxPQUFVLElBQ3ZFLE9BQVUsSUFBTSxPQUFVLElBQUssT0FBVSxJQUFLLE9BQVUsSUFDeEQsT0FBVSxJQUFNLE9BQVUsSUFBSyxP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SzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsSUFBUTdCLEVBQUUsR0FBSzZCLEVBQUUsSUFDcEVvNEYsRUFBSSxHQUFNajZGLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsSUFBUTdCLEVBQUUsR0FBSzZCLEVBQUUsSUFDcEVvNEYsRUFBSSxHQUFNajZGLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsSUFBUTdCLEVBQUUsR0FBSzZCLEVBQUUsSUFDcEVvNEYsRUFBSSxHQUFNajZGLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsR0FBTzdCLEVBQUUsR0FBSzZCLEVBQUUsSUFBUTdCLEVBQUUsR0FBSzZCLEVBQUUsSUFBTzdCLEVBQUUsR0FHN0VpNkYsRUFBSSxJQUFPajZGLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsSUFBUTdCLEVBQUUsSUFBTTZCLEVBQUUsSUFDekVvNEYsRUFBSSxJQUFPajZGLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsSUFBUTdCLEVBQUUsSUFBTTZCLEVBQUUsSUFDekVvNEYsRUFBSSxJQUFPajZGLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsSUFBUTdCLEVBQUUsSUFBTTZCLEVBQUUsSUFDekVvNEYsRUFBSSxJQUFPajZGLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFBTTZCLEVBQUUsSUFBUTdCLEVBQUUsSUFBTTZCLEVBQUUsSUFDekVvNEYsRUFBSSxJQUFPajZGLEVBQUUsSUFBTTZCLEVBQUUsR0FBTzdCLEVBQUUsSUFB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Y0FBZSxRQUFTLFFBQVMsUUFDOUUsUUFBUyxRQUFTLFdBQVksUUFBUyxRQUFTLFdBQVksUUFBUyxRQUFTLFFBQzlFLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQ2pGLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsV0FBWSxRQUFTLFFBQ3BGLFFBQVMsUUFBUyxRQUFTLFdBQVksUUFBUyxRQUFRLFdBQVksUUFBUyxXQUM3RSxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFDeEUsYUFBYyxRQUFTLFFBQVMsUUFBUyxRQUFTLFFBQVMsUUFBUyxTQUFVLFFBQzlFLFFBQVMsV0FBWSxTQUFVLFFBQVMsU0FBVSxjQUFlLFNBQVUsV0FDM0UsUUFBUyxRQUFTLGFBQWMsUUFBUyxRQUFTLGNBQWUsUUFBUyxXQUMxRSxXQUFZLFlBQVl6bmQsU0FBUWd0RixJQUM3QixTQUFRLEtBQWlCQSxRQUc3QixNQUFTeEYsT0FBTywyQkFFaEIsY0FBYSxtQkFFYixVQUFPLGVBRVAsSUFBSSxXQUVKLElBQUksR0FFSixJQUFJLEkiLCJmaWxlIjoiYmlnLmpzIiwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmZyb20tZW50cmllcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5pcy1zZWFsZWQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1nZXR0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1zZXR0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1nZXR0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0Lmxvb2t1cC1zZXR0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5nbG9iYWwtdGhpcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5jb3B5LXdpdGhpbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5maWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LmZpbHRlcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuZmxhdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5mbGF0LW1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5qb2luJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UtcmlnaHQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkucmV2ZXJzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5zbGljZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5zb21lJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LnNvcnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuZnJvbS1jb2RlLXBvaW50Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5yYXcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1lbmQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLnBhZC1zdGFydCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1zdGFydCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5hbmNob3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmJpZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmJvbGQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmZpeGVkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLmZvbnRzaXplJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGFsaWNzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5zbWFsbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuc3RyaWtlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3RyaW5nLnN1cCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3knKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVnZXhwLnRlc3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci5lcHNpbG9uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLW5hbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci5taW4tc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5udW1iZXIudG8tcHJlY2lzaW9uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguYWNvc2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXRoLmF0YW5oJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguY2JydCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguY29zaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXRoLmV4cG0xJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguaHlwb3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWF0aC5pbXVsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWF0aC5sb2cxcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXRoLmxvZzInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGguc2luaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXRoLnRhbmgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLndlYWstc2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuaXMtdmlldycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuZGF0YS12aWV3Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZsb2F0MzItYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmxvYXQ2NC1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1pbmRleCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5qb2luJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnJlZHVjZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5yZWR1Y2UtcmlnaHQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkucmV2ZXJzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29tZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnN1YmFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5kZWxldGUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGg7XG4iLCJyZXF1aXJlKCcuL2VzJyk7XG5yZXF1aXJlKCcuL3Byb3Bvc2FscycpO1xucmVxdWlyZSgnLi93ZWInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGg7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSAmJiBpdCAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhpdCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxudmFyIFVOU0NPUEFCTEVTID0gd2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogY3JlYXRlKG51bGwpXG4gIH0pO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGFyQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNoYXJBdDtcblxuLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY2hhckF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5hdGl2ZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTtcbnZhciBJbnQ4QXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXkgJiYgSW50OEFycmF5LnByb3RvdHlwZTtcbnZhciBVaW50OENsYW1wZWRBcnJheSA9IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheTtcbnZhciBVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSA9IFVpbnQ4Q2xhbXBlZEFycmF5ICYmIFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZTtcbnZhciBUeXBlZEFycmF5ID0gSW50OEFycmF5ICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheSk7XG52YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEludDhBcnJheVByb3RvdHlwZSAmJiBnZXRQcm90b3R5cGVPZihJbnQ4QXJyYXlQcm90b3R5cGUpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgaXNQcm90b3R5cGVPZiA9IE9iamVjdFByb3RvdHlwZS5pc1Byb3RvdHlwZU9mO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpO1xuLy8gRml4aW5nIG5hdGl2ZSB0eXBlZCBhcnJheXMgaW4gT3BlcmEgUHJlc3RvIGNyYXNoZXMgdGhlIGJyb3dzZXIsIHNlZSAjNTk1XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IE5BVElWRV9BUlJBWV9CVUZGRVIgJiYgISFzZXRQcm90b3R5cGVPZiAmJiBjbGFzc29mKGdsb2JhbC5vcGVyYSkgIT09ICdPcGVyYSc7XG52YXIgVFlQRURfQVJSQVlfVEFHX1JFUUlSRUQgPSBmYWxzZTtcbnZhciBOQU1FO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEludDhBcnJheTogMSxcbiAgVWludDhBcnJheTogMSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gIEludDE2QXJyYXk6IDIsXG4gIFVpbnQxNkFycmF5OiAyLFxuICBJbnQzMkFycmF5OiA0LFxuICBVaW50MzJBcnJheTogNCxcbiAgRmxvYXQzMkFycmF5OiA0LFxuICBGbG9hdDY0QXJyYXk6IDhcbn07XG5cbnZhciBpc1ZpZXcgPSBmdW5jdGlvbiBpc1ZpZXcoaXQpIHtcbiAgdmFyIGtsYXNzID0gY2xhc3NvZihpdCk7XG4gIHJldHVybiBrbGFzcyA9PT0gJ0RhdGFWaWV3JyB8fCBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTtcbn07XG5cbnZhciBpc1R5cGVkQXJyYXkgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBoYXMoVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGNsYXNzb2YoaXQpKTtcbn07XG5cbnZhciBhVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNUeXBlZEFycmF5KGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheScpO1xufTtcblxudmFyIGFUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoQykge1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoaXNQcm90b3R5cGVPZi5jYWxsKFR5cGVkQXJyYXksIEMpKSByZXR1cm4gQztcbiAgfSBlbHNlIGZvciAodmFyIEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBOQU1FKSkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgKEMgPT09IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8fCBpc1Byb3RvdHlwZU9mLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBDKSkpIHtcbiAgICAgIHJldHVybiBDO1xuICAgIH1cbiAgfSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcicpO1xufTtcblxudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybjtcbiAgaWYgKGZvcmNlZCkgZm9yICh2YXIgQVJSQVkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmIGhhcyhUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlLCBLRVkpKSB7XG4gICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldO1xuICAgIH1cbiAgfVxuICBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHtcbiAgICByZWRlZmluZShUeXBlZEFycmF5UHJvdG90eXBlLCBLRVksIGZvcmNlZCA/IHByb3BlcnR5XG4gICAgICA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgSW50OEFycmF5UHJvdG90eXBlW0tFWV0gfHwgcHJvcGVydHkpO1xuICB9XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQpIHtcbiAgdmFyIEFSUkFZLCBUeXBlZEFycmF5Q29uc3RydWN0b3I7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybjtcbiAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgaWYgKGZvcmNlZCkgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZKSkge1xuICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkge1xuICAgICAgLy8gVjggfiBDaHJvbWUgNDktNTAgYCVUeXBlZEFycmF5JWAgbWV0aG9kcyBhcmUgbm9uLXdyaXRhYmxlIG5vbi1jb25maWd1cmFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZWRlZmluZShUeXBlZEFycmF5LCBLRVksIGZvcmNlZCA/IHByb3BlcnR5IDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfSBlbHNlIHJldHVybjtcbiAgfVxuICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkge1xuICAgICAgcmVkZWZpbmUoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVksIHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbn07XG5cbmZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICBpZiAoIWdsb2JhbFtOQU1FXSkgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlO1xufVxuXG4vLyBXZWJLaXQgYnVnIC0gdHlwZWQgYXJyYXlzIGNvbnN0cnVjdG9ycyBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZVxuaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8IHR5cGVvZiBUeXBlZEFycmF5ICE9ICdmdW5jdGlvbicgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgVHlwZWRBcnJheSA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgaW52b2NhdGlvbicpO1xuICB9O1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLCBUeXBlZEFycmF5KTtcbiAgfVxufVxuXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIVR5cGVkQXJyYXlQcm90b3R5cGUgfHwgVHlwZWRBcnJheVByb3RvdHlwZSA9PT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5LnByb3RvdHlwZTtcbiAgaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIGlmIChnbG9iYWxbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFtOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpO1xuICB9XG59XG5cbi8vIFdlYktpdCBidWcgLSBvbmUgbW9yZSBvYmplY3QgaW4gVWludDhDbGFtcGVkQXJyYXkgcHJvdG90eXBlIGNoYWluXG5pZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBnZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSkgIT09IFR5cGVkQXJyYXlQcm90b3R5cGUpIHtcbiAgc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpO1xufVxuXG5pZiAoREVTQ1JJUFRPUlMgJiYgIWhhcyhUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRCA9IHRydWU7XG4gIGRlZmluZVByb3BlcnR5KFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkO1xuICB9IH0pO1xuICBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIGlmIChnbG9iYWxbTkFNRV0pIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZ2xvYmFsW05BTUVdLCBUWVBFRF9BUlJBWV9UQUcsIE5BTUUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTLFxuICBUWVBFRF9BUlJBWV9UQUc6IFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEICYmIFRZUEVEX0FSUkFZX1RBRyxcbiAgYVR5cGVkQXJyYXk6IGFUeXBlZEFycmF5LFxuICBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLFxuICBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOiBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kLFxuICBpc1ZpZXc6IGlzVmlldyxcbiAgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXksXG4gIFR5cGVkQXJyYXk6IFR5cGVkQXJyYXksXG4gIFR5cGVkQXJyYXlQcm90b3R5cGU6IFR5cGVkQXJyYXlQcm90b3R5cGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItbmF0aXZlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleCcpO1xudmFyIElFRUU3NTQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWVlZTc1NCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xudmFyIERBVEFfVklFVyA9ICdEYXRhVmlldyc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCc7XG52YXIgV1JPTkdfSU5ERVggPSAnV3JvbmcgaW5kZXgnO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG52YXIgJEFycmF5QnVmZmVyID0gTmF0aXZlQXJyYXlCdWZmZXI7XG52YXIgJERhdGFWaWV3ID0gZ2xvYmFsW0RBVEFfVklFV107XG52YXIgJERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3ICYmICREYXRhVmlld1tQUk9UT1RZUEVdO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuXG52YXIgcGFja0lFRUU3NTQgPSBJRUVFNzU0LnBhY2s7XG52YXIgdW5wYWNrSUVFRTc1NCA9IElFRUU3NTQudW5wYWNrO1xuXG52YXIgcGFja0ludDggPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIHJldHVybiBbbnVtYmVyICYgMHhGRl07XG59O1xuXG52YXIgcGFja0ludDE2ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkYsIG51bWJlciA+PiA4ICYgMHhGRl07XG59O1xuXG52YXIgcGFja0ludDMyID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkYsIG51bWJlciA+PiA4ICYgMHhGRiwgbnVtYmVyID4+IDE2ICYgMHhGRiwgbnVtYmVyID4+IDI0ICYgMHhGRl07XG59O1xuXG52YXIgdW5wYWNrSW50MzIgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXJbM10gPDwgMjQgfCBidWZmZXJbMl0gPDwgMTYgfCBidWZmZXJbMV0gPDwgOCB8IGJ1ZmZlclswXTtcbn07XG5cbnZhciBwYWNrRmxvYXQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgMjMsIDQpO1xufTtcblxudmFyIHBhY2tGbG9hdDY0ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gcGFja0lFRUU3NTQobnVtYmVyLCA1MiwgOCk7XG59O1xuXG52YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBrZXkpIHtcbiAgZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3JbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldOyB9IH0pO1xufTtcblxudmFyIGdldCA9IGZ1bmN0aW9uICh2aWV3LCBjb3VudCwgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgoaW5kZXgpO1xuICB2YXIgc3RvcmUgPSBnZXRJbnRlcm5hbFN0YXRlKHZpZXcpO1xuICBpZiAoaW50SW5kZXggKyBjb3VudCA+IHN0b3JlLmJ5dGVMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgYnl0ZXMgPSBnZXRJbnRlcm5hbFN0YXRlKHN0b3JlLmJ1ZmZlcikuYnl0ZXM7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgc3RvcmUuYnl0ZU9mZnNldDtcbiAgdmFyIHBhY2sgPSBieXRlcy5zbGljZShzdGFydCwgc3RhcnQgKyBjb3VudCk7XG4gIHJldHVybiBpc0xpdHRsZUVuZGlhbiA/IHBhY2sgOiBwYWNrLnJldmVyc2UoKTtcbn07XG5cbnZhciBzZXQgPSBmdW5jdGlvbiAodmlldywgY291bnQsIGluZGV4LCBjb252ZXJzaW9uLCB2YWx1ZSwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7XG4gIHZhciBzdG9yZSA9IGdldEludGVybmFsU3RhdGUodmlldyk7XG4gIGlmIChpbnRJbmRleCArIGNvdW50ID4gc3RvcmUuYnl0ZUxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBieXRlcyA9IGdldEludGVybmFsU3RhdGUoc3RvcmUuYnVmZmVyKS5ieXRlcztcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyBzdG9yZS5ieXRlT2Zmc2V0O1xuICB2YXIgcGFjayA9IGNvbnZlcnNpb24oK3ZhbHVlKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBieXRlc1tzdGFydCArIGldID0gcGFja1tpc0xpdHRsZUVuZGlhbiA/IGkgOiBjb3VudCAtIGkgLSAxXTtcbn07XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUikge1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRvSW5kZXgobGVuZ3RoKTtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIGJ5dGVzOiBhcnJheUZpbGwuY2FsbChuZXcgQXJyYXkoYnl0ZUxlbmd0aCksIDApLFxuICAgICAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aFxuICAgIH0pO1xuICAgIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgJERhdGFWaWV3ID0gZnVuY3Rpb24gRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkRGF0YVZpZXcsIERBVEFfVklFVyk7XG4gICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gZ2V0SW50ZXJuYWxTdGF0ZShidWZmZXIpLmJ5dGVMZW5ndGg7XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID09PSB1bmRlZmluZWQgPyBidWZmZXJMZW5ndGggLSBvZmZzZXQgOiB0b0xlbmd0aChieXRlTGVuZ3RoKTtcbiAgICBpZiAob2Zmc2V0ICsgYnl0ZUxlbmd0aCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgYnVmZmVyOiBidWZmZXIsXG4gICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoLFxuICAgICAgYnl0ZU9mZnNldDogb2Zmc2V0XG4gICAgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykge1xuICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuICAgICAgdGhpcy5ieXRlT2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgfTtcblxuICBpZiAoREVTQ1JJUFRPUlMpIHtcbiAgICBhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLCAnYnl0ZUxlbmd0aCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdidWZmZXInKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZUxlbmd0aCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdieXRlT2Zmc2V0Jyk7XG4gIH1cblxuICByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBnZXRJbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSkgPj4+IDA7XG4gICAgfSxcbiAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiBnZXRGbG9hdDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCksIDIzKTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSwgNTIpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJbnQ4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc2V0VWludDE2OiBmdW5jdGlvbiBzZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSW50MTYsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzZXRJbnQzMjogZnVuY3Rpb24gc2V0SW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSW50MzIsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJbnQzMiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNldEZsb2F0MzI6IGZ1bmN0aW9uIHNldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrRmxvYXQzMiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNldEZsb2F0NjQ6IGZ1bmN0aW9uIHNldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBwYWNrRmxvYXQ2NCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgTmF0aXZlQXJyYXlCdWZmZXIoMSk7XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IE5hdGl2ZUFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcihOYU4pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIHJldHVybiBOYXRpdmVBcnJheUJ1ZmZlci5uYW1lICE9IEFSUkFZX0JVRkZFUjtcbiAgfSkpIHtcbiAgICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyKTtcbiAgICAgIHJldHVybiBuZXcgTmF0aXZlQXJyYXlCdWZmZXIodG9JbmRleChsZW5ndGgpKTtcbiAgICB9O1xuICAgIHZhciBBcnJheUJ1ZmZlclByb3RvdHlwZSA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gTmF0aXZlQXJyYXlCdWZmZXJbUFJPVE9UWVBFXTtcbiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRBcnJheUJ1ZmZlciwga2V5LCBOYXRpdmVBcnJheUJ1ZmZlcltrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgQXJyYXlCdWZmZXJQcm90b3R5cGUuY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cblxuICAvLyBXZWJLaXQgYnVnIC0gdGhlIHNhbWUgcGFyZW50IHByb3RvdHlwZSBmb3IgdHlwZWQgYXJyYXlzIGFuZCBkYXRhIHZpZXdcbiAgaWYgKHNldFByb3RvdHlwZU9mICYmIGdldFByb3RvdHlwZU9mKCREYXRhVmlld1Byb3RvdHlwZSkgIT09IE9iamVjdFByb3RvdHlwZSkge1xuICAgIHNldFByb3RvdHlwZU9mKCREYXRhVmlld1Byb3RvdHlwZSwgT2JqZWN0UHJvdG90eXBlKTtcbiAgfVxuXG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgbmF0aXZlU2V0SW50OCA9ICREYXRhVmlld1Byb3RvdHlwZS5zZXRJbnQ4O1xuICB0ZXN0Vmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB0ZXN0Vmlldy5zZXRJbnQ4KDEsIDIxNDc0ODM2NDkpO1xuICBpZiAodGVzdFZpZXcuZ2V0SW50OCgwKSB8fCAhdGVzdFZpZXcuZ2V0SW50OCgxKSkgcmVkZWZpbmVBbGwoJERhdGFWaWV3UHJvdG90eXBlLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgbmF0aXZlU2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgbmF0aXZlU2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9XG4gIH0sIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuXG5zZXRUb1N0cmluZ1RhZygkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG5zZXRUb1N0cmluZ1RhZygkRGF0YVZpZXcsIERBVEFfVklFVyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcnJheUJ1ZmZlcjogJEFycmF5QnVmZmVyLFxuICBEYXRhVmlldzogJERhdGFWaWV3XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbmAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29weXdpdGhpblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IG1pbigoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKTtcbiAgdmFyIGluYyA9IDE7XG4gIGlmIChmcm9tIDwgdG8gJiYgdG8gPCBmcm9tICsgY291bnQpIHtcbiAgICBpbmMgPSAtMTtcbiAgICBmcm9tICs9IGNvdW50IC0gMTtcbiAgICB0byArPSBjb3VudCAtIDE7XG4gIH1cbiAgd2hpbGUgKGNvdW50LS0gPiAwKSB7XG4gICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dO1xuICAgIGVsc2UgZGVsZXRlIE9bdG9dO1xuICAgIHRvICs9IGluYztcbiAgICBmcm9tICs9IGluYztcbiAgfSByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsbFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnZm9yRWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbm1vZHVsZS5leHBvcnRzID0gKCFTVFJJQ1RfTUVUSE9EIHx8ICFVU0VTX1RPX0xFTkdUSCkgPyBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59IDogW10uZm9yRWFjaDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yLCBuZXh0LCB2YWx1ZTtcbiAgaWYgKG1hcHBpbmcpIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzTGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyYXRvck1ldGhvZCkpKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYXRvck1ldGhvZC5jYWxsKE8pO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IG5ldyBDKCk7XG4gICAgZm9yICg7IShzdGVwID0gbmV4dC5jYWxsKGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIE5PX0hPTEVTID0gVFlQRSA9PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaC5jYWxsKHRhcmdldCwgdmFsdWUpOyAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNilcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIG5hdGl2ZUxhc3RJbmRleE9mID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhbmF0aXZlTGFzdEluZGV4T2YgJiYgMSAvIFsxXS5sYXN0SW5kZXhPZigxLCAtMCkgPCAwO1xudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdsYXN0SW5kZXhPZicpO1xuLy8gRm9yIHByZXZlbnRpbmcgcG9zc2libGUgYWxtb3N0IGluZmluaXRlIGxvb3AgaW4gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgdGVzdCB0aGUgZm9yd2FyZCB2ZXJzaW9uIG9mIHRoZSBtZXRob2RcbnZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeyBBQ0NFU1NPUlM6IHRydWUsIDE6IDAgfSk7XG52YXIgRk9SQ0VEID0gTkVHQVRJVkVfWkVSTyB8fCAhU1RSSUNUX01FVEhPRCB8fCAhVVNFU19UT19MRU5HVEg7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2ZgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmxhc3RpbmRleG9mXG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSBAWyotMV0gKi8pIHtcbiAgLy8gY29udmVydCAtMCB0byArMFxuICBpZiAoTkVHQVRJVkVfWkVSTykgcmV0dXJuIG5hdGl2ZUxhc3RJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMDtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBtaW4oaW5kZXgsIHRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTtcbiAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDtcbiAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8gJiYgT1tpbmRleF0gPT09IHNlYXJjaEVsZW1lbnQpIHJldHVybiBpbmRleCB8fCAwO1xuICByZXR1cm4gLTE7XG59IDogbmF0aXZlTGFzdEluZGV4T2Y7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIC8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc3XG4gIHJldHVybiBWOF9WRVJTSU9OID49IDUxIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gYXJyYXkuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGZvbzogMSB9O1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5W01FVEhPRF9OQU1FXShCb29sZWFuKS5mb28gIT09IDE7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsLG5vLXRocm93LWxpdGVyYWxcbiAgICBtZXRob2QuY2FsbChudWxsLCBhcmd1bWVudCB8fCBmdW5jdGlvbiAoKSB7IHRocm93IDE7IH0sIDEpO1xuICB9KTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNhY2hlID0ge307XG5cbnZhciB0aHJvd2VyID0gZnVuY3Rpb24gKGl0KSB7IHRocm93IGl0OyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgb3B0aW9ucykge1xuICBpZiAoaGFzKGNhY2hlLCBNRVRIT0RfTkFNRSkpIHJldHVybiBjYWNoZVtNRVRIT0RfTkFNRV07XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICB2YXIgQUNDRVNTT1JTID0gaGFzKG9wdGlvbnMsICdBQ0NFU1NPUlMnKSA/IG9wdGlvbnMuQUNDRVNTT1JTIDogZmFsc2U7XG4gIHZhciBhcmd1bWVudDAgPSBoYXMob3B0aW9ucywgMCkgPyBvcHRpb25zWzBdIDogdGhyb3dlcjtcbiAgdmFyIGFyZ3VtZW50MSA9IGhhcyhvcHRpb25zLCAxKSA/IG9wdGlvbnNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGNhY2hlW01FVEhPRF9OQU1FXSA9ICEhbWV0aG9kICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKEFDQ0VTU09SUyAmJiAhREVTQ1JJUFRPUlMpIHJldHVybiB0cnVlO1xuICAgIHZhciBPID0geyBsZW5ndGg6IC0xIH07XG5cbiAgICBpZiAoQUNDRVNTT1JTKSBkZWZpbmVQcm9wZXJ0eShPLCAxLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogdGhyb3dlciB9KTtcbiAgICBlbHNlIE9bMV0gPSAxO1xuXG4gICAgbWV0aG9kLmNhbGwoTywgYXJndW1lbnQwLCBhcmd1bWVudDEpO1xuICB9KTtcbn07XG4iLCJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyByZWR1Y2UsIHJlZHVjZVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfUklHSFQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBjYWxsYmFja2ZuLCBhcmd1bWVudHNMZW5ndGgsIG1lbW8pIHtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBJU19SSUdIVCA/IGxlbmd0aCAtIDEgOiAwO1xuICAgIHZhciBpID0gSVNfUklHSFQgPyAtMSA6IDE7XG4gICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA8IDIpIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgICBtZW1vID0gc2VsZltpbmRleF07XG4gICAgICAgIGluZGV4ICs9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGlmIChJU19SSUdIVCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7SVNfUklHSFQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiAgbGVmdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VyaWdodFxuICByaWdodDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBuZXcgKEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQykobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbnZhciBQcm9taXNlID0gZ2V0QnVpbHRJbignUHJvbWlzZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciAkcmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBpdGVyYXRvciA9IGdldEludGVybmFsU3RhdGUodGhpcykuaXRlcmF0b3I7XG4gIHZhciAkJHJldHVybiA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgcmV0dXJuICQkcmV0dXJuID09PSB1bmRlZmluZWRcbiAgICA/IFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KVxuICAgIDogYW5PYmplY3QoJCRyZXR1cm4uY2FsbChpdGVyYXRvciwgdmFsdWUpKTtcbn07XG5cbnZhciAkdGhyb3cgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGl0ZXJhdG9yID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5pdGVyYXRvcjtcbiAgdmFyICQkdGhyb3cgPSBpdGVyYXRvclsndGhyb3cnXTtcbiAgcmV0dXJuICQkdGhyb3cgPT09IHVuZGVmaW5lZFxuICAgID8gUHJvbWlzZS5yZWplY3QodmFsdWUpXG4gICAgOiAkJHRocm93LmNhbGwoaXRlcmF0b3IsIHZhbHVlKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5leHRIYW5kbGVyLCBJU19JVEVSQVRPUikge1xuICB2YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihzdGF0ZSkge1xuICAgIHN0YXRlLm5leHQgPSBhRnVuY3Rpb24oc3RhdGUuaXRlcmF0b3IubmV4dCk7XG4gICAgc3RhdGUuZG9uZSA9IGZhbHNlO1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywgc3RhdGUpO1xuICB9O1xuXG4gIEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUgPSByZWRlZmluZUFsbChjcmVhdGUocGF0aC5Bc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KGFyZykge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgIGlmIChzdGF0ZS5kb25lKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYW5PYmplY3QobmV4dEhhbmRsZXIuY2FsbChzdGF0ZSwgYXJnLCBQcm9taXNlKSkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdyZXR1cm4nOiAkcmV0dXJuLFxuICAgICd0aHJvdyc6ICR0aHJvd1xuICB9KTtcblxuICBpZiAoIUlTX0lURVJBVE9SKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm94eS5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdHZW5lcmF0b3InKTtcbiAgfVxuXG4gIHJldHVybiBBc3luY0l0ZXJhdG9yUHJveHk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxudmFyIFByb21pc2UgPSBnZXRCdWlsdEluKCdQcm9taXNlJyk7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfVE9fQVJSQVkgPSBUWVBFID09IDA7XG4gIHZhciBJU19GT1JfRUFDSCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdGVyYXRvciwgZm4pIHtcbiAgICBhbk9iamVjdChpdGVyYXRvcik7XG4gICAgdmFyIG5leHQgPSBhRnVuY3Rpb24oaXRlcmF0b3IubmV4dCk7XG4gICAgdmFyIGFycmF5ID0gSVNfVE9fQVJSQVkgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIUlTX1RPX0FSUkFZKSBhRnVuY3Rpb24oZm4pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKElTX1RPX0FSUkFZID8gYXJyYXkgOiBJU19TT01FID8gZmFsc2UgOiBJU19FVkVSWSB8fCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKElTX1RPX0FSUkFZKSB7XG4gICAgICAgICAgICAgICAgICBwdXNoLmNhbGwoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZuKHZhbHVlKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJU19GT1JfRUFDSCkge1xuICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA/IGxvb3AoKSA6IHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA/IHJlc29sdmUoSVNfU09NRSB8fCB2YWx1ZSkgOiBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgcmVqZWN0KGVycik7IH1cbiAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9XG4gICAgICB9O1xuXG4gICAgICBsb29wKCk7XG4gICAgfSk7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdG9BcnJheTogY3JlYXRlTWV0aG9kKDApLFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMSksXG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoMiksXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgZmluZDogY3JlYXRlTWV0aG9kKDQpXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SID0gJ1VTRV9GVU5DVElPTl9DT05TVFJVQ1RPUic7XG52YXIgQVNZTkNfSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2FzeW5jSXRlcmF0b3InKTtcbnZhciBBc3luY0l0ZXJhdG9yID0gZ2xvYmFsLkFzeW5jSXRlcmF0b3I7XG52YXIgUGFzc2VkQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IHNoYXJlZC5Bc3luY0l0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsIHByb3RvdHlwZTtcblxuaWYgKCFJU19QVVJFKSB7XG4gIGlmIChQYXNzZWRBc3luY0l0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IFBhc3NlZEFzeW5jSXRlcmF0b3JQcm90b3R5cGU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT0gJ2Z1bmN0aW9uJykge1xuICAgIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZTtcbiAgfSBlbHNlIGlmIChzaGFyZWRbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSB8fCBnbG9iYWxbVVNFX0ZVTkNUSU9OX0NPTlNUUlVDVE9SXSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKCdyZXR1cm4gYXN5bmMgZnVuY3Rpb24qKCl7fSgpJykoKSkpKTtcbiAgICAgIGlmIChnZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBPYmplY3QucHJvdG90eXBlKSBBc3luY0l0ZXJhdG9yUHJvdG90eXBlID0gcHJvdG90eXBlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgfVxufVxuXG5pZiAoIUFzeW5jSXRlcmF0b3JQcm90b3R5cGUpIEFzeW5jSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgQVNZTkNfSVRFUkFUT1IpKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShBc3luY0l0ZXJhdG9yUHJvdG90eXBlLCBBU1lOQ19JVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBc3luY0l0ZXJhdG9yUHJvdG90eXBlO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2NvbGxlY3Rpb24tbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLyogLi4uZWxlbWVudHMgKi8pIHtcbiAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgYWRkZXIgPSBhRnVuY3Rpb24oc2V0LmFkZCk7XG4gIGZvciAodmFyIGsgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICBhZGRlci5jYWxsKHNldCwgYXJndW1lbnRzW2tdKTtcbiAgfVxuICByZXR1cm4gc2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9jb2xsZWN0aW9uLW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qIC4uLmVsZW1lbnRzICovKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKGNvbGxlY3Rpb25bJ2RlbGV0ZSddKTtcbiAgdmFyIGFsbERlbGV0ZWQgPSB0cnVlO1xuICB2YXIgd2FzRGVsZXRlZDtcbiAgZm9yICh2YXIgayA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgIHdhc0RlbGV0ZWQgPSByZW1vdmVyLmNhbGwoY29sbGVjdGlvbiwgYXJndW1lbnRzW2tdKTtcbiAgICBhbGxEZWxldGVkID0gYWxsRGVsZXRlZCAmJiB3YXNEZWxldGVkO1xuICB9XG4gIHJldHVybiAhIWFsbERlbGV0ZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwRm4gPSBsZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZywgQSwgbiwgYm91bmRGdW5jdGlvbjtcbiAgYUZ1bmN0aW9uKHRoaXMpO1xuICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7XG4gIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgQSA9IFtdO1xuICBpZiAobWFwcGluZykge1xuICAgIG4gPSAwO1xuICAgIGJvdW5kRnVuY3Rpb24gPSBiaW5kKG1hcEZuLCBsZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICBpdGVyYXRlKHNvdXJjZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICBBLnB1c2goYm91bmRGdW5jdGlvbihuZXh0SXRlbSwgbisrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaXRlcmF0ZShzb3VyY2UsIEEucHVzaCwgQSk7XG4gIH1cbiAgcmV0dXJuIG5ldyB0aGlzKEEpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb2YoKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICB3aGlsZSAobGVuZ3RoLS0pIEFbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICByZXR1cm4gbmV3IHRoaXMoQSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmZhc3RLZXk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTtcbiAgICB9KTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICAgIHR5cGU6IElURVJBVE9SX05BTUUsXG4gICAgICAgIHRhcmdldDogaXRlcmF0ZWQsXG4gICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUubGFzdDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCFzdGF0ZS50YXJnZXQgfHwgIShzdGF0ZS5sYXN0ID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5zdGF0ZS5maXJzdCkpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS5rZXksIGRvbmU6IGZhbHNlIH07XG4gICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LnZhbHVlLCBkb25lOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IFtlbnRyeS5rZXksIGVudHJ5LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2Vha0RhdGEgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5nZXRXZWFrRGF0YTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgQXJyYXlJdGVyYXRpb25Nb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJyk7XG52YXIgJGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xudmFyIGZpbmQgPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kO1xudmFyIGZpbmRJbmRleCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmRJbmRleDtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgcmV0dXJuIHN0b3JlLmZyb3plbiB8fCAoc3RvcmUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblxuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuZW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZiAofmluZGV4KSB0aGlzLmVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gISF+aW5kZXg7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGlkOiBpZCsrLFxuICAgICAgICBmcm96ZW46IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTtcbiAgICB9KTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgZWxzZSBkYXRhW3N0YXRlLmlkXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4zLjMuMiBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuNC4zLjMgV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCkgJiYgZGVsZXRlIGRhdGFbc3RhdGUuaWRdO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjMuMy40IFdlYWtNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy40LjMuNCBXZWFrU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCBzdGF0ZS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gMjMuMy4zLjMgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLmdldChrZXkpO1xuICAgICAgICAgIHJldHVybiBkYXRhID8gZGF0YVtzdGF0ZS5pZF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQztcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxbQ09OU1RSVUNUT1JfTkFNRV07XG4gIHZhciBOYXRpdmVQcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3RvciAmJiBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBDb25zdHJ1Y3RvciA9IE5hdGl2ZUNvbnN0cnVjdG9yO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24gKEtFWSkge1xuICAgIHZhciBuYXRpdmVNZXRob2QgPSBOYXRpdmVQcm90b3R5cGVbS0VZXTtcbiAgICByZWRlZmluZShOYXRpdmVQcm90b3R5cGUsIEtFWSxcbiAgICAgIEtFWSA9PSAnYWRkJyA/IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSA6IEtFWSA9PSAnZGVsZXRlJyA/IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyBmYWxzZSA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChrZXkpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5KTtcbiAgICAgIH0gOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuUkVRVUlSRUQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiBDaHJvbWl1bSA0MC0gd2Vhay1jb2xsZWN0aW9ucyB0aHJvd3Mgb24gcHJpbWl0aXZlcywgYnV0IHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICB2YXIgVEhST1dTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IGluc3RhbmNlLmhhcygxKTsgfSk7XG4gICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9IGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHsgbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGl0ZXJhYmxlKTsgfSk7XG4gICAgLy8gZm9yIGVhcmx5IGltcGxlbWVudGF0aW9ucyAtMCBhbmQgKzAgbm90IHRoZSBzYW1lXG4gICAgdmFyIEJVR0dZX1pFUk8gPSAhSVNfV0VBSyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWOCB+IENocm9taXVtIDQyLSBmYWlscyBvbmx5IHdpdGggNSsgZWxlbWVudHNcbiAgICAgIHZhciAkaW5zdGFuY2UgPSBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTtcbiAgICAgIHZhciBpbmRleCA9IDU7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkgJGluc3RhbmNlW0FEREVSXShpbmRleCwgaW5kZXgpO1xuICAgICAgcmV0dXJuICEkaW5zdGFuY2UuaGFzKC0wKTtcbiAgICB9KTtcblxuICAgIGlmICghQUNDRVBUX0lURVJBQkxFUykge1xuICAgICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uIChkdW1teSwgaXRlcmFibGUpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgICB9KTtcbiAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE5hdGl2ZVByb3RvdHlwZTtcbiAgICAgIE5hdGl2ZVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgIH1cblxuICAgIGlmIChUSFJPV1NfT05fUFJJTUlUSVZFUyB8fCBCVUdHWV9aRVJPKSB7XG4gICAgICBmaXhNZXRob2QoJ2RlbGV0ZScpO1xuICAgICAgZml4TWV0aG9kKCdoYXMnKTtcbiAgICAgIElTX01BUCAmJiBmaXhNZXRob2QoJ2dldCcpO1xuICAgIH1cblxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuXG4gICAgLy8gd2VhayBjb2xsZWN0aW9ucyBzaG91bGQgbm90IGNvbnRhaW5zIC5jbGVhciBtZXRob2RcbiAgICBpZiAoSVNfV0VBSyAmJiBOYXRpdmVQcm90b3R5cGUuY2xlYXIpIGRlbGV0ZSBOYXRpdmVQcm90b3R5cGUuY2xlYXI7XG4gIH1cblxuICBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yO1xuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTtcblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG4iLCIvLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxudmFyIE1hcCA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWFwJyk7XG52YXIgV2Vha01hcCA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMud2Vhay1tYXAnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8ga2V5c1xuICB0aGlzLm9iamVjdCA9IG51bGw7XG4gIHRoaXMuc3ltYm9sID0gbnVsbDtcbiAgLy8gY2hpbGQgbm9kZXNcbiAgdGhpcy5wcmltaXRpdmVzID0gbnVsbDtcbiAgdGhpcy5vYmplY3RzQnlJbmRleCA9IGNyZWF0ZShudWxsKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIGluaXRpYWxpemVyKSB7XG4gIHJldHVybiB0aGlzW2tleV0gfHwgKHRoaXNba2V5XSA9IGluaXRpYWxpemVyKCkpO1xufTtcblxuTm9kZS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChpLCBpdCwgSVNfT0JKRUNUKSB7XG4gIHZhciBzdG9yZSA9IElTX09CSkVDVFxuICAgID8gdGhpcy5vYmplY3RzQnlJbmRleFtpXSB8fCAodGhpcy5vYmplY3RzQnlJbmRleFtpXSA9IG5ldyBXZWFrTWFwKCkpXG4gICAgOiB0aGlzLnByaW1pdGl2ZXMgfHwgKHRoaXMucHJpbWl0aXZlcyA9IG5ldyBNYXAoKSk7XG4gIHZhciBlbnRyeSA9IHN0b3JlLmdldChpdCk7XG4gIGlmICghZW50cnkpIHN0b3JlLnNldChpdCwgZW50cnkgPSBuZXcgTm9kZSgpKTtcbiAgcmV0dXJuIGVudHJ5O1xufTtcblxudmFyIHJvb3QgPSBuZXcgTm9kZSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFjdGl2ZSA9IHJvb3Q7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaSwgaXQ7XG4gIC8vIGZvciBwcmV2ZW50IGxlYWtpbmcsIHN0YXJ0IGZyb20gb2JqZWN0c1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaXNPYmplY3QoaXQgPSBhcmd1bWVudHNbaV0pKSBhY3RpdmUgPSBhY3RpdmUubmV4dChpLCBpdCwgdHJ1ZSk7XG4gIH1cbiAgaWYgKHRoaXMgPT09IE9iamVjdCAmJiBhY3RpdmUgPT09IHJvb3QpIHRocm93IFR5cGVFcnJvcignQ29tcG9zaXRlIGtleXMgbXVzdCBjb250YWluIGEgbm9uLXByaW1pdGl2ZSBjb21wb25lbnQnKTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpc09iamVjdChpdCA9IGFyZ3VtZW50c1tpXSkpIGFjdGl2ZSA9IGFjdGl2ZS5uZXh0KGksIGl0LCBmYWxzZSk7XG4gIH0gcmV0dXJuIGFjdGl2ZTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXModGFyZ2V0LCBrZXkpKSBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gIH1cbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgdmFyIHJlZ2V4cCA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIGZhbHNlO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciBxdW90ID0gL1wiL2c7XG5cbi8vIEIuMi4zLjIuMSBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRlaHRtbFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgdmFyIFMgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZShzdHJpbmcpKTtcbiAgdmFyIHAxID0gJzwnICsgdGFnO1xuICBpZiAoYXR0cmlidXRlICE9PSAnJykgcDEgKz0gJyAnICsgYXR0cmlidXRlICsgJz1cIicgKyBTdHJpbmcodmFsdWUpLnJlcGxhY2UocXVvdCwgJyZxdW90OycpICsgJ1wiJztcbiAgcmV0dXJuIHAxICsgJz4nICsgUyArICc8LycgKyB0YWcgKyAnPic7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgcGFkU3RhcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLnN0YXJ0O1xuXG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlO1xudmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7XG52YXIgbmF0aXZlRGF0ZVRvSVNPU3RyaW5nID0gRGF0ZVByb3RvdHlwZS50b0lTT1N0cmluZztcblxuLy8gYERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRhdGUucHJvdG90eXBlLnRvaXNvc3RyaW5nXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGZhaWxzIGhlcmU6XG5tb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVEYXRlVG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZSgtNWUxMyAtIDEpKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZURhdGVUb0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpO1xufSkpID8gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7XG4gIGlmICghaXNGaW5pdGUoZ2V0VGltZS5jYWxsKHRoaXMpKSkgdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkYXRlID0gdGhpcztcbiAgdmFyIHllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gIHZhciBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICB2YXIgc2lnbiA9IHllYXIgPCAwID8gJy0nIDogeWVhciA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHNpZ24gKyBwYWRTdGFydChhYnMoeWVhciksIHNpZ24gPyA2IDogNCwgMCkgK1xuICAgICctJyArIHBhZFN0YXJ0KGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIsIDApICtcbiAgICAnLScgKyBwYWRTdGFydChkYXRlLmdldFVUQ0RhdGUoKSwgMiwgMCkgK1xuICAgICdUJyArIHBhZFN0YXJ0KGRhdGUuZ2V0VVRDSG91cnMoKSwgMiwgMCkgK1xuICAgICc6JyArIHBhZFN0YXJ0KGRhdGUuZ2V0VVRDTWludXRlcygpLCAyLCAwKSArXG4gICAgJzonICsgcGFkU3RhcnQoZGF0ZS5nZXRVVENTZWNvbmRzKCksIDIsIDApICtcbiAgICAnLicgKyBwYWRTdGFydChtaWxsaXNlY29uZHMsIDMsIDApICtcbiAgICAnWic7XG59IDogbmF0aXZlRGF0ZVRvSVNPU3RyaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSAnbnVtYmVyJyAmJiBoaW50ICE9PSAnZGVmYXVsdCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIH0gcmV0dXJuIHRvUHJpbWl0aXZlKGFuT2JqZWN0KHRoaXMpLCBoaW50ICE9PSAnbnVtYmVyJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvcik7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgdmFyIFN5bWJvbCA9IHBhdGguU3ltYm9sIHx8IChwYXRoLlN5bWJvbCA9IHt9KTtcbiAgaWYgKCFoYXMoU3ltYm9sLCBOQU1FKSkgZGVmaW5lUHJvcGVydHkoU3ltYm9sLCBOQU1FLCB7XG4gICAgdmFsdWU6IHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZihOQU1FKVxuICB9KTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIGl0ZXJhYmxlIERPTSBjb2xsZWN0aW9uc1xuLy8gZmxhZyAtIGBpdGVyYWJsZWAgaW50ZXJmYWNlIC0gJ2VudHJpZXMnLCAna2V5cycsICd2YWx1ZXMnLCAnZm9yRWFjaCcgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENTU1J1bGVMaXN0OiAwLFxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLFxuICBDU1NWYWx1ZUxpc3Q6IDAsXG4gIENsaWVudFJlY3RMaXN0OiAwLFxuICBET01SZWN0TGlzdDogMCxcbiAgRE9NU3RyaW5nTGlzdDogMCxcbiAgRE9NVG9rZW5MaXN0OiAxLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCxcbiAgRmlsZUxpc3Q6IDAsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiAwLFxuICBIVE1MQ29sbGVjdGlvbjogMCxcbiAgSFRNTEZvcm1FbGVtZW50OiAwLFxuICBIVE1MU2VsZWN0RWxlbWVudDogMCxcbiAgTWVkaWFMaXN0OiAwLFxuICBNaW1lVHlwZUFycmF5OiAwLFxuICBOYW1lZE5vZGVNYXA6IDAsXG4gIE5vZGVMaXN0OiAxLFxuICBQYWludFJlcXVlc3RMaXN0OiAwLFxuICBQbHVnaW46IDAsXG4gIFBsdWdpbkFycmF5OiAwLFxuICBTVkdMZW5ndGhMaXN0OiAwLFxuICBTVkdOdW1iZXJMaXN0OiAwLFxuICBTVkdQYXRoU2VnTGlzdDogMCxcbiAgU1ZHUG9pbnRMaXN0OiAwLFxuICBTVkdTdHJpbmdMaXN0OiAwLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiAwLFxuICBTb3VyY2VCdWZmZXJMaXN0OiAwLFxuICBTdHlsZVNoZWV0TGlzdDogMCxcbiAgVGV4dFRyYWNrQ3VlTGlzdDogMCxcbiAgVGV4dFRyYWNrTGlzdDogMCxcbiAgVG91Y2hMaXN0OiAwXG59O1xuIiwidmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC8oaXBob25lfGlwb2R8aXBhZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignbmF2aWdhdG9yJywgJ3VzZXJBZ2VudCcpIHx8ICcnO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICB2ZXJzaW9uID0gbWF0Y2hbMF0gKyBtYXRjaFsxXTtcbn0gZWxzZSBpZiAodXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uICYmICt2ZXJzaW9uO1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHNvdXJjZVByb3BlcnR5LCAnc2hhbScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIG1vdmVkIHRvIGVudHJ5IHBvaW50c1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5yZWdleHAuZXhlYycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG52YXIgUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyAjcmVwbGFjZSBuZWVkcyBidWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBncm91cHMuXG4gIC8vICNtYXRjaCB3b3JrcyBmaW5lIGJlY2F1c2UgaXQganVzdCByZXR1cm4gdGhlIGV4ZWMgcmVzdWx0cywgZXZlbiBpZiBpdCBoYXNcbiAgLy8gYSBcImdyb3BzXCIgcHJvcGVydHkuXG4gIHZhciByZSA9IC8uLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgcmVzdWx0Lmdyb3VwcyA9IHsgYTogJzcnIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuICcnLnJlcGxhY2UocmUsICckPGE+JykgIT09ICc3Jztcbn0pO1xuXG4vLyBJRSA8PSAxMSByZXBsYWNlcyAkMCB3aXRoIHRoZSB3aG9sZSBtYXRjaCwgYXMgaWYgaXQgd2FzICQmXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MDI0NjY2L2dldHRpbmctaWUtdG8tcmVwbGFjZS1hLXJlZ2V4LXdpdGgtdGhlLWxpdGVyYWwtc3RyaW5nLTBcbnZhciBSRVBMQUNFX0tFRVBTXyQwID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdhJy5yZXBsYWNlKC8uLywgJyQwJykgPT09ICckMCc7XG59KSgpO1xuXG52YXIgUkVQTEFDRSA9IHdlbGxLbm93blN5bWJvbCgncmVwbGFjZScpO1xuLy8gU2FmYXJpIDw9IDEzLjAuMyg/KSBzdWJzdGl0dXRlcyBudGggY2FwdHVyZSB3aGVyZSBuPm0gd2l0aCBhbiBlbXB0eSBzdHJpbmdcbnZhciBSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICgvLi9bUkVQTEFDRV0pIHtcbiAgICByZXR1cm4gLy4vW1JFUExBQ0VdKCdhJywgJyQwJykgPT09ICcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKCk7XG5cbi8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuLy8gV2VleCBKUyBoYXMgZnJvemVuIGJ1aWx0LWluIHByb3RvdHlwZXMsIHNvIHVzZSB0cnkgLyBjYXRjaCB3cmFwcGVyXG52YXIgU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gLyg/OikvO1xuICB2YXIgb3JpZ2luYWxFeGVjID0gcmUuZXhlYztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9yaWdpbmFsRXhlYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoICE9PSAyIHx8IHJlc3VsdFswXSAhPT0gJ2EnIHx8IHJlc3VsdFsxXSAhPT0gJ2InO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgbGVuZ3RoLCBleGVjLCBzaGFtKSB7XG4gIHZhciBTWU1CT0wgPSB3ZWxsS25vd25TeW1ib2woS0VZKTtcblxuICB2YXIgREVMRUdBVEVTX1RPX1NZTUJPTCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RyaW5nIG1ldGhvZHMgY2FsbCBzeW1ib2wtbmFtZWQgUmVnRXAgbWV0aG9kc1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KTtcblxuICB2YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBERUxFR0FURVNfVE9fU1lNQk9MICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcblxuICAgIGlmIChLRVkgPT09ICdzcGxpdCcpIHtcbiAgICAgIC8vIFdlIGNhbid0IHVzZSByZWFsIHJlZ2V4IGhlcmUgc2luY2UgaXQgY2F1c2VzIGRlb3B0aW1pemF0aW9uXG4gICAgICAvLyBhbmQgc2VyaW91cyBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBpbiBWOFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMwNlxuICAgICAgcmUgPSB7fTtcbiAgICAgIC8vIFJlZ0V4cFtAQHNwbGl0XSBkb2Vzbid0IGNhbGwgdGhlIHJlZ2V4J3MgZXhlYyBtZXRob2QsIGJ1dCBmaXJzdCBjcmVhdGVzXG4gICAgICAvLyBhIG5ldyBvbmUuIFdlIG5lZWQgdG8gcmV0dXJuIHRoZSBwYXRjaGVkIHJlZ2V4IHdoZW4gY3JlYXRpbmcgdGhlIG5ldyBvbmUuXG4gICAgICByZS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgICAgcmUuY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZTsgfTtcbiAgICAgIHJlLmZsYWdzID0gJyc7XG4gICAgICByZVtTWU1CT0xdID0gLy4vW1NZTUJPTF07XG4gICAgfVxuXG4gICAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgZXhlY0NhbGxlZCA9IHRydWU7IHJldHVybiBudWxsOyB9O1xuXG4gICAgcmVbU1lNQk9MXSgnJyk7XG4gICAgcmV0dXJuICFleGVjQ2FsbGVkO1xuICB9KTtcblxuICBpZiAoXG4gICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHxcbiAgICAhREVMRUdBVEVTX1RPX0VYRUMgfHxcbiAgICAoS0VZID09PSAncmVwbGFjZScgJiYgIShcbiAgICAgIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTICYmXG4gICAgICBSRVBMQUNFX0tFRVBTXyQwICYmXG4gICAgICAhUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkVcbiAgICApKSB8fFxuICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQylcbiAgKSB7XG4gICAgdmFyIG5hdGl2ZVJlZ0V4cE1ldGhvZCA9IC8uL1tTWU1CT0xdO1xuICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgaWYgKHJlZ2V4cC5leGVjID09PSByZWdleHBFeGVjKSB7XG4gICAgICAgIGlmIChERUxFR0FURVNfVE9fU1lNQk9MICYmICFmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgIC8vIHBvbHlmaWxsZWQgZnVuY3Rpb24pLCBsZWFzaW5nIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICAgICAgICAvLyBXZSBhdm9pZCBpdCBieSBkaXJlY3RseSBjYWxsaW5nIHRoZSBuYXRpdmUgQEBtZXRob2QgbWV0aG9kLlxuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlTWV0aG9kLmNhbGwoc3RyLCByZWdleHAsIGFyZzIpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkb25lOiBmYWxzZSB9O1xuICAgIH0sIHtcbiAgICAgIFJFUExBQ0VfS0VFUFNfJDA6IFJFUExBQ0VfS0VFUFNfJDAsXG4gICAgICBSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRTogUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkVcbiAgICB9KTtcbiAgICB2YXIgc3RyaW5nTWV0aG9kID0gbWV0aG9kc1swXTtcbiAgICB2YXIgcmVnZXhNZXRob2QgPSBtZXRob2RzWzFdO1xuXG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJpbmdNZXRob2QpO1xuICAgIHJlZGVmaW5lKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcmVnZXhNZXRob2QuY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiByZWdleE1ldGhvZC5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG5cbiAgaWYgKHNoYW0pIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSZWdFeHAucHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xuXG4vLyBgRmxhdHRlbkludG9BcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLWZsYXRNYXAvI3NlYy1GbGF0dGVuSW50b0FycmF5XG52YXIgZmxhdHRlbkludG9BcnJheSA9IGZ1bmN0aW9uICh0YXJnZXQsIG9yaWdpbmFsLCBzb3VyY2UsIHNvdXJjZUxlbiwgc3RhcnQsIGRlcHRoLCBtYXBwZXIsIHRoaXNBcmcpIHtcbiAgdmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7XG4gIHZhciBzb3VyY2VJbmRleCA9IDA7XG4gIHZhciBtYXBGbiA9IG1hcHBlciA/IGJpbmQobWFwcGVyLCB0aGlzQXJnLCAzKSA6IGZhbHNlO1xuICB2YXIgZWxlbWVudDtcblxuICB3aGlsZSAoc291cmNlSW5kZXggPCBzb3VyY2VMZW4pIHtcbiAgICBpZiAoc291cmNlSW5kZXggaW4gc291cmNlKSB7XG4gICAgICBlbGVtZW50ID0gbWFwRm4gPyBtYXBGbihzb3VyY2Vbc291cmNlSW5kZXhdLCBzb3VyY2VJbmRleCwgb3JpZ2luYWwpIDogc291cmNlW3NvdXJjZUluZGV4XTtcblxuICAgICAgaWYgKGRlcHRoID4gMCAmJiBpc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICAgIHRhcmdldEluZGV4ID0gZmxhdHRlbkludG9BcnJheSh0YXJnZXQsIG9yaWdpbmFsLCBlbGVtZW50LCB0b0xlbmd0aChlbGVtZW50Lmxlbmd0aCksIHRhcmdldEluZGV4LCBkZXB0aCAtIDEpIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSAweDFGRkZGRkZGRkZGRkZGKSB0aHJvdyBUeXBlRXJyb3IoJ0V4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGgnKTtcbiAgICAgICAgdGFyZ2V0W3RhcmdldEluZGV4XSA9IGVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldEluZGV4Kys7XG4gICAgfVxuICAgIHNvdXJjZUluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIHRhcmdldEluZGV4O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuSW50b0FycmF5O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEMsIGFyZ3NMZW5ndGgsIGFyZ3MpIHtcbiAgaWYgKCEoYXJnc0xlbmd0aCBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbGlzdCA9IFtdLCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1thcmdzTGVuZ3RoXSA9IEZ1bmN0aW9uKCdDLGEnLCAncmV0dXJuIG5ldyBDKCcgKyBsaXN0LmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTtcbn07XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZEZ1bmN0aW9uID0gZnVuY3Rpb24gYm91bmQoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZEZ1bmN0aW9uID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmRGdW5jdGlvbjtcbn07XG4iLCJ2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgQVNZTkNfSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2FzeW5jSXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG1ldGhvZCA9IGl0W0FTWU5DX0lURVJBVE9SXTtcbiAgcmV0dXJuIG1ldGhvZCA9PT0gdW5kZWZpbmVkID8gZ2V0SXRlcmF0b3JNZXRob2QoaXQpIDogbWV0aG9kO1xufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YXJpYWJsZSA9PSAnZnVuY3Rpb24nID8gdmFyaWFibGUgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24ocGF0aFtuYW1lc3BhY2VdKSB8fCBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChpdCk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JNZXRob2QgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbiAgfSByZXR1cm4gYW5PYmplY3QoaXRlcmF0b3JNZXRob2QuY2FsbChpdCkpO1xufTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBJU19QVVJFID8gZ2V0SXRlcmF0b3IgOiBmdW5jdGlvbiAoaXQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiBNYXAucHJvdG90eXBlLmVudHJpZXMuY2FsbChpdCk7XG59O1xuIiwidmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IElTX1BVUkUgPyBnZXRJdGVyYXRvciA6IGZ1bmN0aW9uIChpdCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuIFNldC5wcm90b3R5cGUudmFsdWVzLmNhbGwoaXQpO1xufTtcbiIsInZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICBjaGVjayh0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIiwidmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwiLy8gSUVFRTc1NCBjb252ZXJzaW9ucyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2llZWU3NTRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lc1xudmFyIEluZmluaXR5ID0gMSAvIDA7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG52YXIgcGFjayA9IGZ1bmN0aW9uIChudW1iZXIsIG1hbnRpc3NhTGVuZ3RoLCBieXRlcykge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGJ5dGVzKTtcbiAgdmFyIGV4cG9uZW50TGVuZ3RoID0gYnl0ZXMgKiA4IC0gbWFudGlzc2FMZW5ndGggLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGV4cG9uZW50TGVuZ3RoKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbWFudGlzc2FMZW5ndGggPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBzaWduID0gbnVtYmVyIDwgMCB8fCBudW1iZXIgPT09IDAgJiYgMSAvIG51bWJlciA8IDAgPyAxIDogMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGV4cG9uZW50LCBtYW50aXNzYSwgYztcbiAgbnVtYmVyID0gYWJzKG51bWJlcik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKG51bWJlciAhPSBudW1iZXIgfHwgbnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDtcbiAgICBleHBvbmVudCA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7XG4gICAgaWYgKG51bWJlciAqIChjID0gcG93KDIsIC1leHBvbmVudCkpIDwgMSkge1xuICAgICAgZXhwb25lbnQtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbnVtYmVyICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgKiBjID49IDIpIHtcbiAgICAgIGV4cG9uZW50Kys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG1hbnRpc3NhID0gMDtcbiAgICAgIGV4cG9uZW50ID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgICBleHBvbmVudCA9IDA7XG4gICAgfVxuICB9XG4gIGZvciAoOyBtYW50aXNzYUxlbmd0aCA+PSA4OyBidWZmZXJbaW5kZXgrK10gPSBtYW50aXNzYSAmIDI1NSwgbWFudGlzc2EgLz0gMjU2LCBtYW50aXNzYUxlbmd0aCAtPSA4KTtcbiAgZXhwb25lbnQgPSBleHBvbmVudCA8PCBtYW50aXNzYUxlbmd0aCB8IG1hbnRpc3NhO1xuICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDtcbiAgZm9yICg7IGV4cG9uZW50TGVuZ3RoID4gMDsgYnVmZmVyW2luZGV4KytdID0gZXhwb25lbnQgJiAyNTUsIGV4cG9uZW50IC89IDI1NiwgZXhwb25lbnRMZW5ndGggLT0gOCk7XG4gIGJ1ZmZlclstLWluZGV4XSB8PSBzaWduICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufTtcblxudmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7XG4gIHZhciBieXRlcyA9IGJ1ZmZlci5sZW5ndGg7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGV4cG9uZW50TGVuZ3RoIC0gNztcbiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxO1xuICB2YXIgc2lnbiA9IGJ1ZmZlcltpbmRleC0tXTtcbiAgdmFyIGV4cG9uZW50ID0gc2lnbiAmIDEyNztcbiAgdmFyIG1hbnRpc3NhO1xuICBzaWduID4+PSA3O1xuICBmb3IgKDsgbkJpdHMgPiAwOyBleHBvbmVudCA9IGV4cG9uZW50ICogMjU2ICsgYnVmZmVyW2luZGV4XSwgaW5kZXgtLSwgbkJpdHMgLT0gOCk7XG4gIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZXhwb25lbnQgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbWFudGlzc2FMZW5ndGg7XG4gIGZvciAoOyBuQml0cyA+IDA7IG1hbnRpc3NhID0gbWFudGlzc2EgKiAyNTYgKyBidWZmZXJbaW5kZXhdLCBpbmRleC0tLCBuQml0cyAtPSA4KTtcbiAgaWYgKGV4cG9uZW50ID09PSAwKSB7XG4gICAgZXhwb25lbnQgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbWFudGlzc2EgPyBOYU4gOiBzaWduID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAtIGVCaWFzO1xuICB9IHJldHVybiAoc2lnbiA/IC0xIDogMSkgKiBtYW50aXNzYSAqIHBvdygyLCBleHBvbmVudCAtIG1hbnRpc3NhTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYWNrOiBwYWNrLFxuICB1bnBhY2s6IHVucGFja1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT0gJ1N0cmluZycgPyBzcGxpdC5jYWxsKGl0LCAnJykgOiBPYmplY3QoaXQpO1xufSA6IE9iamVjdDtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgdHlwZW9mIChOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIE5ld1RhcmdldCAhPT0gV3JhcHBlciAmJlxuICAgIGlzT2JqZWN0KE5ld1RhcmdldFByb3RvdHlwZSA9IE5ld1RhcmdldC5wcm90b3R5cGUpICYmXG4gICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZVxuICApIHNldFByb3RvdHlwZU9mKCR0aGlzLCBOZXdUYXJnZXRQcm90b3R5cGUpO1xuICByZXR1cm4gJHRoaXM7XG59O1xuIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnRvU3RyaW5nO1xuXG4vLyB0aGlzIGhlbHBlciBicm9rZW4gaW4gYDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKHR5cGVvZiBzdG9yZS5pbnNwZWN0U291cmNlICE9ICdmdW5jdGlvbicpIHtcbiAgc3RvcmUuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBmdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG4iLCJ2YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcblxudmFyIE1FVEFEQVRBID0gdWlkKCdtZXRhJyk7XG52YXIgaWQgPSAwO1xuXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBSRVFVSVJFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09IE5BVElWRSA/IGZhbHNlXG4gICAgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNyZWdleHBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNsYXNzb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgaXRlcmF0ZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgQVNfRU5UUklFUywgSVNfSVRFUkFUT1IpIHtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGZuLCB0aGF0LCBBU19FTlRSSUVTID8gMiA6IDEpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gQVNfRU5UUklFU1xuICAgICAgICAgID8gYm91bmRGdW5jdGlvbihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSlcbiAgICAgICAgICA6IGJvdW5kRnVuY3Rpb24oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbiAgICB9XG4gICAgaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICByZXN1bHQgPSBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBib3VuZEZ1bmN0aW9uLCBzdGVwLnZhbHVlLCBBU19FTlRSSUVTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnb2JqZWN0JyAmJiByZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG5cbml0ZXJhdGUuc3RvcCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgcmVzdWx0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxudmFyICRyZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGl0ZXJhdG9yID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5pdGVyYXRvcjtcbiAgdmFyICQkcmV0dXJuID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICByZXR1cm4gJCRyZXR1cm4gPT09IHVuZGVmaW5lZCA/IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0gOiBhbk9iamVjdCgkJHJldHVybi5jYWxsKGl0ZXJhdG9yLCB2YWx1ZSkpO1xufTtcblxudmFyICR0aHJvdyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgaXRlcmF0b3IgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLml0ZXJhdG9yO1xuICB2YXIgJCR0aHJvdyA9IGl0ZXJhdG9yWyd0aHJvdyddO1xuICBpZiAoJCR0aHJvdyA9PT0gdW5kZWZpbmVkKSB0aHJvdyB2YWx1ZTtcbiAgcmV0dXJuICQkdGhyb3cuY2FsbChpdGVyYXRvciwgdmFsdWUpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmV4dEhhbmRsZXIsIElTX0lURVJBVE9SKSB7XG4gIHZhciBJdGVyYXRvclByb3h5ID0gZnVuY3Rpb24gSXRlcmF0b3Ioc3RhdGUpIHtcbiAgICBzdGF0ZS5uZXh0ID0gYUZ1bmN0aW9uKHN0YXRlLml0ZXJhdG9yLm5leHQpO1xuICAgIHN0YXRlLmRvbmUgPSBmYWxzZTtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHN0YXRlKTtcbiAgfTtcblxuICBJdGVyYXRvclByb3h5LnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKGNyZWF0ZShwYXRoLkl0ZXJhdG9yLnByb3RvdHlwZSksIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZXN1bHQgPSBzdGF0ZS5kb25lID8gdW5kZWZpbmVkIDogbmV4dEhhbmRsZXIuYXBwbHkoc3RhdGUsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4geyBkb25lOiBzdGF0ZS5kb25lLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogJHJldHVybixcbiAgICAndGhyb3cnOiAkdGhyb3dcbiAgfSk7XG5cbiAgaWYgKCFJU19JVEVSQVRPUikge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3h5LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0dlbmVyYXRvcicpO1xuICB9XG5cbiAgcmV0dXJuIEl0ZXJhdG9yUHJveHk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBgTWFwLnByb3RvdHlwZS51cHNlcnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVwc2VydChrZXksIHVwZGF0ZUZuIC8qICwgaW5zZXJ0Rm4gKi8pIHtcbiAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgaW5zZXJ0Rm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHZhbHVlO1xuICBpZiAodHlwZW9mIHVwZGF0ZUZuICE9ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc2VydEZuICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0F0IGxlYXN0IG9uZSBjYWxsYmFjayByZXF1aXJlZCcpO1xuICB9XG4gIGlmIChtYXAuaGFzKGtleSkpIHtcbiAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KTtcbiAgICBpZiAodHlwZW9mIHVwZGF0ZUZuID09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhbHVlID0gdXBkYXRlRm4odmFsdWUpO1xuICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGluc2VydEZuID09ICdmdW5jdGlvbicpIHtcbiAgICB2YWx1ZSA9IGluc2VydEZuKCk7XG4gICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwidmFyIG5hdGl2ZUV4cG0xID0gTWF0aC5leHBtMTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gYE1hdGguZXhwbTFgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5leHBtMVxubW9kdWxlLmV4cG9ydHMgPSAoIW5hdGl2ZUV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgbmF0aXZlRXhwbTEoMTApID4gMjIwMjUuNDY1Nzk0ODA2NzE5IHx8IG5hdGl2ZUV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjhcbiAgLy8gVG9yIEJyb3dzZXIgYnVnXG4gIHx8IG5hdGl2ZUV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCkge1xuICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiB4ID4gLTFlLTYgJiYgeCA8IDFlLTYgPyB4ICsgeCAqIHggLyAyIDogZXhwKHgpIC0gMTtcbn0gOiBuYXRpdmVFeHBtMTtcbiIsInZhciBzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtc2lnbicpO1xuXG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG4vLyBgTWF0aC5mcm91bmRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5mcm91bmRcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5mcm91bmQgfHwgZnVuY3Rpb24gZnJvdW5kKHgpIHtcbiAgdmFyICRhYnMgPSBhYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuIiwidmFyIGxvZyA9IE1hdGgubG9nO1xuXG4vLyBgTWF0aC5sb2cxcGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzFwXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkge1xuICByZXR1cm4gKHggPSAreCkgPiAtMWUtOCAmJiB4IDwgMWUtOCA/IHggLSB4ICogeCAvIDIgOiBsb2coMSArIHgpO1xufTtcbiIsIi8vIGBNYXRoLnNjYWxlYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgfHwgeCAhPSB4XG4gICAgICB8fCBpbkxvdyAhPSBpbkxvd1xuICAgICAgfHwgaW5IaWdoICE9IGluSGlnaFxuICAgICAgfHwgb3V0TG93ICE9IG91dExvd1xuICAgICAgfHwgb3V0SGlnaCAhPSBvdXRIaWdoXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICApIHJldHVybiBOYU47XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHJldHVybiB4O1xuICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93O1xufTtcbiIsIi8vIGBNYXRoLnNpZ25gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5zaWduXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gKHggPSAreCkgPT0gMCB8fCB4ICE9IHggPyB4IDogeCA8IDAgPyAtMSA6IDE7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICFJU19JT1MpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIHRoZW4gPSBwcm9taXNlLnRoZW47XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbi5jYWxsKHByb21pc2UsIGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gbmV3IFVSTCgnYj9hPTEmYj0yJmM9MycsICdodHRwOi8vYScpO1xuICB2YXIgc2VhcmNoUGFyYW1zID0gdXJsLnNlYXJjaFBhcmFtcztcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB1cmwucGF0aG5hbWUgPSAnYyUyMGQnO1xuICBzZWFyY2hQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIHNlYXJjaFBhcmFtc1snZGVsZXRlJ10oJ2InKTtcbiAgICByZXN1bHQgKz0ga2V5ICsgdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gKElTX1BVUkUgJiYgIXVybC50b0pTT04pXG4gICAgfHwgIXNlYXJjaFBhcmFtcy5zb3J0XG4gICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJ1xuICAgIHx8IHNlYXJjaFBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnXG4gICAgfHwgU3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoJz9hPTEnKSkgIT09ICdhPTEnXG4gICAgfHwgIXNlYXJjaFBhcmFtc1tJVEVSQVRPUl1cbiAgICAvLyB0aHJvd3MgaW4gRWRnZVxuICAgIHx8IG5ldyBVUkwoJ2h0dHBzOi8vYUBiJykudXNlcm5hbWUgIT09ICdhJ1xuICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYidcbiAgICAvLyBub3QgcHVueWNvZGVkIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYydcbiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMSdcbiAgICAvLyBmYWlscyBpbiBDaHJvbWUgNjYtXG4gICAgfHwgcmVzdWx0ICE9PSAnYTFjMydcbiAgICAvLyB0aHJvd3MgaW4gU2FmYXJpXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4Jztcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xuXG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwidmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFwiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zXCIpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgZ2xvYmFsSXNGaW5pdGUgPSBnbG9iYWwuaXNGaW5pdGU7XG5cbi8vIGBOdW1iZXIuaXNGaW5pdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzZmluaXRlXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiBpc0Zpbml0ZShpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIGdsb2JhbElzRmluaXRlKGl0KTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciAkcGFyc2VGbG9hdCA9IGdsb2JhbC5wYXJzZUZsb2F0O1xudmFyIEZPUkNFRCA9IDEgLyAkcGFyc2VGbG9hdCh3aGl0ZXNwYWNlcyArICctMCcpICE9PSAtSW5maW5pdHk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXBhcnNlZmxvYXQtc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyaW5nKSB7XG4gIHZhciB0cmltbWVkU3RyaW5nID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7XG4gIHZhciByZXN1bHQgPSAkcGFyc2VGbG9hdCh0cmltbWVkU3RyaW5nKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gMCAmJiB0cmltbWVkU3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUludCA9IGdsb2JhbC5wYXJzZUludDtcbnZhciBoZXggPSAvXlsrLV0/MFtYeF0vO1xudmFyIEZPUkNFRCA9ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKFN0cmluZyhzdHJpbmcpKTtcbiAgcmV0dXJuICRwYXJzZUludChTLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxubW9kdWxlLmV4cG9ydHMgPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKERFU0NSSVBUT1JTICYmIG5hdGl2ZUFzc2lnbih7IGI6IDEgfSwgbmF0aXZlQXNzaWduKGRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7XG4gICAgICAgIHZhbHVlOiAzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9KSwgeyBiOiAyIH0pKS5iICE9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6IG5hdGl2ZUFzc2lnbjtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIGFjdGl2ZVhEb2N1bWVudCA9IG51bGw7IC8vIGF2b2lkIG1lbW9yeSBsZWFrXG4gIHJldHVybiB0ZW1wO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IGRvY3VtZW50Q3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDc1XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoSlMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnZG9jdW1lbnQuRj1PYmplY3QnKSk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIHJldHVybiBpZnJhbWVEb2N1bWVudC5GO1xufTtcblxuLy8gQ2hlY2sgZm9yIGRvY3VtZW50LmRvbWFpbiBhbmQgYWN0aXZlIHggc3VwcG9ydFxuLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4vLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuLy8gYXZvaWQgSUUgR0MgYnVnXG52YXIgYWN0aXZlWERvY3VtZW50O1xudmFyIE51bGxQcm90b09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAqL1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IGRvY3VtZW50LmRvbWFpbiAmJiBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogaWdub3JlICovIH1cbiAgTnVsbFByb3RvT2JqZWN0ID0gYWN0aXZlWERvY3VtZW50ID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIDogTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lKCk7XG4gIHZhciBsZW5ndGggPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2xlbmd0aF1dO1xuICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnRpZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KGl0KSk7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgT0JKRUNUX0lURVJBVE9SID0gJ09iamVjdCBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihPQkpFQ1RfSVRFUkFUT1IpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gT2JqZWN0SXRlcmF0b3Ioc291cmNlLCBtb2RlKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChzb3VyY2UpO1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBPQkpFQ1RfSVRFUkFUT1IsXG4gICAgbW9kZTogbW9kZSxcbiAgICBvYmplY3Q6IG9iamVjdCxcbiAgICBrZXlzOiBvYmplY3RLZXlzKG9iamVjdCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG59LCAnT2JqZWN0JywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIGtleXMgPSBzdGF0ZS5rZXlzO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChrZXlzID09PSBudWxsIHx8IHN0YXRlLmluZGV4ID49IGtleXMubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5vYmplY3QgPSBzdGF0ZS5rZXlzID0gbnVsbDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICB9XG4gICAgdmFyIGtleSA9IGtleXNbc3RhdGUuaW5kZXgrK107XG4gICAgdmFyIG9iamVjdCA9IHN0YXRlLm9iamVjdDtcbiAgICBpZiAoIWhhcyhvYmplY3QsIGtleSkpIGNvbnRpbnVlO1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSAna2V5cyc6IHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07XG4gICAgICBjYXNlICd2YWx1ZXMnOiByZXR1cm4geyB2YWx1ZTogb2JqZWN0W2tleV0sIGRvbmU6IGZhbHNlIH07XG4gICAgfSAvKiBlbnRyaWVzICovIHJldHVybiB7IHZhbHVlOiBba2V5LCBvYmplY3Rba2V5XV0sIGRvbmU6IGZhbHNlIH07XG4gIH1cbn0pO1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pICFoYXMoaGlkZGVuS2V5cywga2V5KSAmJiBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZVxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRm9yY2VkIHJlcGxhY2VtZW50IG9iamVjdCBwcm90b3R5cGUgYWNjZXNzb3JzIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gSVNfUFVSRSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIga2V5ID0gTWF0aC5yYW5kb20oKTtcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBuby11c2VsZXNzLWNhbGxcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIGtleSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgZGVsZXRlIGdsb2JhbFtrZXldO1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnNldHByb3RvdHlwZW9mXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDtcbiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgYW5PYmplY3QoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJykuZjtcblxuLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IG9iamVjdEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIGtleSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4gIHZhbHVlczogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xufTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTywga2V5LCB2YWx1ZSk7XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59KTtcbiIsIi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgXG52YXIgTWFwID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5tYXAnKTtcbnZhciBXZWFrTWFwID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy53ZWFrLW1hcCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcblxudmFyIG1ldGFkYXRhID0gc2hhcmVkKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gbWV0YWRhdGEuc3RvcmUgfHwgKG1ldGFkYXRhLnN0b3JlID0gbmV3IFdlYWtNYXAoKSk7XG5cbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBjcmVhdGUpIHtcbiAgdmFyIHRhcmdldE1ldGFkYXRhID0gc3RvcmUuZ2V0KHRhcmdldCk7XG4gIGlmICghdGFyZ2V0TWV0YWRhdGEpIHtcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuO1xuICAgIHN0b3JlLnNldCh0YXJnZXQsIHRhcmdldE1ldGFkYXRhID0gbmV3IE1hcCgpKTtcbiAgfVxuICB2YXIga2V5TWV0YWRhdGEgPSB0YXJnZXRNZXRhZGF0YS5nZXQodGFyZ2V0S2V5KTtcbiAgaWYgKCFrZXlNZXRhZGF0YSkge1xuICAgIGlmICghY3JlYXRlKSByZXR1cm47XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG5cbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogbWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KTtcbn07XG5cbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG59O1xuXG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xuXG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHRhcmdldEtleSwgZmFsc2UpO1xuICB2YXIga2V5cyA9IFtdO1xuICBpZiAobWV0YWRhdGFNYXApIG1ldGFkYXRhTWFwLmZvckVhY2goZnVuY3Rpb24gKF8sIGtleSkgeyBrZXlzLnB1c2goa2V5KTsgfSk7XG4gIHJldHVybiBrZXlzO1xufTtcblxudmFyIHRvTWV0YWRhdGFLZXkgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0b3JlOiBzdG9yZSxcbiAgZ2V0TWFwOiBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwLFxuICBoYXM6IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEsXG4gIGdldDogb3JkaW5hcnlHZXRPd25NZXRhZGF0YSxcbiAgc2V0OiBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhLFxuICBrZXlzOiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgdG9LZXk6IHRvTWV0YWRhdGFLZXlcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vY2xhc3NvZi1yYXcnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9yZWdleHAtZXhlYycpO1xuXG4vLyBgUmVnRXhwRXhlY2AgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAgZXhlYyBtZXRob2QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gT2JqZWN0IG9yIG51bGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2V4cEV4ZWMuY2FsbChSLCBTKTtcbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vcmVnZXhwLWZsYWdzJyk7XG52YXIgc3RpY2t5SGVscGVycyA9IHJlcXVpcmUoJy4vcmVnZXhwLXN0aWNreS1oZWxwZXJzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLztcbiAgdmFyIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxLmxhc3RJbmRleCAhPT0gMCB8fCByZTIubGFzdEluZGV4ICE9PSAwO1xufSkoKTtcblxudmFyIFVOU1VQUE9SVEVEX1kgPSBzdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1kgfHwgc3RpY2t5SGVscGVycy5CUk9LRU5fQ0FSRVQ7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1k7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSByZWdleHBGbGFncy5jYWxsKHJlKTtcbiAgICB2YXIgc291cmNlID0gcmUuc291cmNlO1xuICAgIHZhciBjaGFyc0FkZGVkID0gMDtcbiAgICB2YXIgc3RyQ29weSA9IHN0cjtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGZsYWdzID0gZmxhZ3MucmVwbGFjZSgneScsICcnKTtcbiAgICAgIGlmIChmbGFncy5pbmRleE9mKCdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IFN0cmluZyhzdHIpLnNsaWNlKHJlLmxhc3RJbmRleCk7XG4gICAgICAvLyBTdXBwb3J0IGFuY2hvcmVkIHN0aWNreSBiZWhhdmlvci5cbiAgICAgIGlmIChyZS5sYXN0SW5kZXggPiAwICYmICghcmUubXVsdGlsaW5lIHx8IHJlLm11bHRpbGluZSAmJiBzdHJbcmUubGFzdEluZGV4IC0gMV0gIT09ICdcXG4nKSkge1xuICAgICAgICBzb3VyY2UgPSAnKD86ICcgKyBzb3VyY2UgKyAnKSc7XG4gICAgICAgIHN0ckNvcHkgPSAnICcgKyBzdHJDb3B5O1xuICAgICAgICBjaGFyc0FkZGVkKys7XG4gICAgICB9XG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgc3RyIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeKD86JyArIHNvdXJjZSArICcpJywgZmxhZ3MpO1xuICAgIH1cblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG5cbiAgICBtYXRjaCA9IG5hdGl2ZUV4ZWMuY2FsbChzdGlja3kgPyByZUNvcHkgOiByZSwgc3RyQ29weSk7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbWF0Y2guaW5wdXQgPSBtYXRjaC5pbnB1dC5zbGljZShjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZShjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2guaW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICAgIHJlLmxhc3RJbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICB9IGVsc2UgcmUubGFzdEluZGV4ID0gMDtcbiAgICB9IGVsc2UgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmUubGFzdEluZGV4ID0gcmUuZ2xvYmFsID8gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggOiBsYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChOUENHX0lOQ0xVREVEICYmIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgICAvLyBmb3IgTlBDRywgbGlrZSBJRTguIE5PVEU6IFRoaXMgZG9lc24nIHdvcmsgZm9yIC8oLj8pPy9cbiAgICAgIG5hdGl2ZVJlcGxhY2UuY2FsbChtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoZWRFeGVjO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtcmVnZXhwLnByb3RvdHlwZS5mbGFnc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LmRvdEFsbCkgcmVzdWx0ICs9ICdzJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9mYWlscycpO1xuXG4vLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ2EnLCAneScpIC0+IC9hL3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvcixcbi8vIHNvIHdlIHVzZSBhbiBpbnRlcm1lZGlhdGUgZnVuY3Rpb24uXG5mdW5jdGlvbiBSRShzLCBmKSB7XG4gIHJldHVybiBSZWdFeHAocywgZik7XG59XG5cbmV4cG9ydHMuVU5TVVBQT1JURURfWSA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCdhJywgJ3knKSAtPiAvYS95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbiAgdmFyIHJlID0gUkUoJ2EnLCAneScpO1xuICByZS5sYXN0SW5kZXggPSAyO1xuICByZXR1cm4gcmUuZXhlYygnYWJjZCcpICE9IG51bGw7XG59KTtcblxuZXhwb3J0cy5CUk9LRU5fQ0FSRVQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc3MzY4N1xuICB2YXIgcmUgPSBSRSgnXnInLCAnZ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ3N0cicpICE9IG51bGw7XG59KTtcbiIsIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gYFNhbWVWYWx1ZVplcm9gIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc2FtZXZhbHVlemVyb1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB4ID09PSB5IHx8IHggIT0geCAmJiB5ICE9IHk7XG59O1xuIiwiLy8gYFNhbWVWYWx1ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zYW1ldmFsdWVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FKSB7XG4gIHZhciBDb25zdHJ1Y3RvciA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmIENvbnN0cnVjdG9yICYmICFDb25zdHJ1Y3RvcltTUEVDSUVTXSkge1xuICAgIGRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKGl0ICYmICFoYXMoaXQgPSBTVEFUSUMgPyBpdCA6IGl0LnByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShpdCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG4iLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxudmFyIGtleXMgPSBzaGFyZWQoJ2tleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBrZXlzW2tleV0gfHwgKGtleXNba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdG9yZTtcbiIsInZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjYuNScsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIGEgbWV0aG9kLCBsb3dlcmNhc2Vcbi8vIG9mIGEgdGFnIGFuZCBlc2NhcGluZyBxdW90ZXMgaW4gYXJndW1lbnRzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTUVUSE9EX05BTUVdKCdcIicpO1xuICAgIHJldHVybiB0ZXN0ICE9PSB0ZXN0LnRvTG93ZXJDYXNlKCkgfHwgdGVzdC5zcGxpdCgnXCInKS5sZW5ndGggPiAzO1xuICB9KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IGNvZGVQb2ludEF0LCBhdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24pO1xuICAgIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICAgID8gQ09OVkVSVF9UT19TVFJJTkcgPyBTLmNoYXJBdChwb3NpdGlvbikgOiBmaXJzdFxuICAgICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0XG4gIGNvZGVBdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG4gIGNoYXJBdDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtcmVnZXhcbm1vZHVsZS5leHBvcnRzID0gL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/KCBNb2JpbGVcXC9cXHcrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcmVwZWF0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgcGFkU3RhcnQsIHBhZEVuZCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0VORCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcpIHtcbiAgICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICAgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICAgIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICAgIHZhciBmaWxsTGVuLCBzdHJpbmdGaWxsZXI7XG4gICAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gICAgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgICBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBjZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICAgIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICAgIHJldHVybiBJU19FTkQgPyBTICsgc3RyaW5nRmlsbGVyIDogc3RyaW5nRmlsbGVyICsgUztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZEVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL3B1bnljb2RlLmpzL2Jsb2IvbWFzdGVyL3B1bnljb2RlLmpzXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxudmFyIGJhc2UgPSAzNjtcbnZhciB0TWluID0gMTtcbnZhciB0TWF4ID0gMjY7XG52YXIgc2tldyA9IDM4O1xudmFyIGRhbXAgPSA3MDA7XG52YXIgaW5pdGlhbEJpYXMgPSA3MjtcbnZhciBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxudmFyIGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xudmFyIHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvWy5cXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcbnZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7XG52YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqL1xudmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgIGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICAgIC8vIEl0J3MgYSBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXIuXG4gICAgICB2YXIgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgICAgaWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIExvdyBzdXJyb2dhdGUuXG4gICAgICAgIG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cbiAgICAgICAgb3V0cHV0LnB1c2godmFsdWUpO1xuICAgICAgICBjb3VudGVyLS07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuICovXG52YXIgZGlnaXRUb0Jhc2ljID0gZnVuY3Rpb24gKGRpZ2l0KSB7XG4gIC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG4gIC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuICByZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpO1xufTtcblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqL1xudmFyIGFkYXB0ID0gZnVuY3Rpb24gKGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuICB2YXIgayA9IDA7XG4gIGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG4gIGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcbiAgZm9yICg7IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG4gICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICB9XG4gIHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBtYXgtc3RhdGVtZW50c1xudmFyIGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG5cbiAgLy8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gYW4gYXJyYXkgb2YgVW5pY29kZSBjb2RlIHBvaW50cy5cbiAgaW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTtcblxuICAvLyBDYWNoZSB0aGUgbGVuZ3RoLlxuICB2YXIgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUuXG4gIHZhciBuID0gaW5pdGlhbE47XG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBiaWFzID0gaW5pdGlhbEJpYXM7XG4gIHZhciBpLCBjdXJyZW50VmFsdWU7XG5cbiAgLy8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy5cbiAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY3VycmVudFZhbHVlID0gaW5wdXRbaV07XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcbiAgICAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG4gIHZhciBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoOyAvLyBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblxuICAvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyB3aXRoIGEgZGVsaW1pdGVyIHVubGVzcyBpdCdzIGVtcHR5LlxuICBpZiAoYmFzaWNMZW5ndGgpIHtcbiAgICBvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuICB9XG5cbiAgLy8gTWFpbiBlbmNvZGluZyBsb29wOlxuICB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZTpcbiAgICB2YXIgbSA9IG1heEludDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcbiAgICAgICAgbSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuICAgIHZhciBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG4gICAgaWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpO1xuICAgIH1cblxuICAgIGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG4gICAgbiA9IG07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuICAgICAgICAvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cbiAgICAgICAgdmFyIHEgPSBkZWx0YTtcbiAgICAgICAgZm9yICh2YXIgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG4gICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuICAgICAgICAgIGlmIChxIDwgdCkgYnJlYWs7XG4gICAgICAgICAgdmFyIHFNaW51c1QgPSBxIC0gdDtcbiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNUKSkpO1xuICAgICAgICAgIHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEpKSk7XG4gICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG4gICAgICAgIGRlbHRhID0gMDtcbiAgICAgICAgKytoYW5kbGVkQ1BDb3VudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICArK2RlbHRhO1xuICAgICsrbjtcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGVuY29kZWQgPSBbXTtcbiAgdmFyIGxhYmVscyA9IGlucHV0LnRvTG93ZXJDYXNlKCkucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHUwMDJFJykuc3BsaXQoJy4nKTtcbiAgdmFyIGksIGxhYmVsO1xuICBmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgZW5jb2RlZC5wdXNoKHJlZ2V4Tm9uQVNDSUkudGVzdChsYWJlbCkgPyAneG4tLScgKyBlbmNvZGUobGFiZWwpIDogbGFiZWwpO1xuICB9XG4gIHJldHVybiBlbmNvZGVkLmpvaW4oJy4nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbm1vZHVsZS5leHBvcnRzID0gJycucmVwZWF0IHx8IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpIHx8IG5vbltNRVRIT0RfTkFNRV0oKSAhPSBub24gfHwgd2hpdGVzcGFjZXNbTUVUSE9EX05BTUVdLm5hbWUgIT09IE1FVEhPRF9OQU1FO1xuICB9KTtcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgd2hpdGVzcGFjZSA9ICdbJyArIHdoaXRlc3BhY2VzICsgJ10nO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cCh3aGl0ZXNwYWNlICsgd2hpdGVzcGFjZSArICcqJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJ0cmltLCAnJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1zdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1SaWdodCwgdHJpbUVuZCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtaXMtaW9zJyk7XG5cbnZhciBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbnZhciBzZXQgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bihldmVudC5kYXRhKTtcbn07XG5cbnZhciBwb3N0ID0gZnVuY3Rpb24gKGlkKSB7XG4gIC8vIG9sZCBlbmdpbmVzIGhhdmUgbm90IGxvY2F0aW9uLm9yaWdpblxuICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgbG9jYXRpb24uaG9zdCk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2socnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIC8vIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjI0XG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwgJiYgIUlTX0lPUykge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFnbG9iYWwuaW1wb3J0U2NyaXB0cyAmJlxuICAgICFmYWlscyhwb3N0KSAmJlxuICAgIGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonXG4gICkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYHRoaXNOdW1iZXJWYWx1ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10aGlzbnVtYmVydmFsdWVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ251bWJlcicgJiYgY2xhc3NvZih2YWx1ZSkgIT0gJ051bWJlcicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH1cbiAgcmV0dXJuICt2YWx1ZTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBUb0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgdmFyIG51bWJlciA9IHRvSW50ZWdlcihpdCk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChudW1iZXIpO1xuICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpO1xuICByZXR1cm4gbGVuZ3RoO1xufTtcbiIsIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCJ2YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBUb0ludGVnZXJgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNOYU4oYXJndW1lbnQgPSArYXJndW1lbnQpID8gMCA6IChhcmd1bWVudCA+IDAgPyBmbG9vciA6IGNlaWwpKGFyZ3VtZW50KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBhcmd1bWVudCA+IDAgPyBtaW4odG9JbnRlZ2VyKGFyZ3VtZW50KSwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwidmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gIHZhciBvZmZzZXQgPSB0b1Bvc2l0aXZlSW50ZWdlcihpdCk7XG4gIGlmIChvZmZzZXQgJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0Jyk7XG4gIHJldHVybiBvZmZzZXQ7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSB0b0ludGVnZXIoaXQpO1xuICBpZiAocmVzdWx0IDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihcIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMFwiKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgUFJFRkVSUkVEX1NUUklORykge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaW5wdXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpbnB1dCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVBSRUZFUlJFRF9TVFJJTkcgJiYgdHlwZW9mIChmbiA9IGlucHV0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyIHRlc3QgPSB7fTtcblxudGVzdFtUT19TVFJJTkdfVEFHXSA9ICd6JztcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmcodGVzdCkgPT09ICdbb2JqZWN0IHpdJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3JzLXJlcXVpcmUtd3JhcHBlcnMnKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXInKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXgnKTtcbnZhciB0b09mZnNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vZmZzZXQnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xudmFyIHR5cGVkQXJyYXlGcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20nKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZvckVhY2g7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXJNb2R1bGUuQXJyYXlCdWZmZXI7XG52YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldztcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IEFycmF5QnVmZmVyVmlld0NvcmUuVFlQRURfQVJSQVlfVEFHO1xudmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7XG52YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5O1xudmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcblxudmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIG5hdGl2ZURlZmluZVByb3BlcnR5KGl0LCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcylba2V5XTtcbiAgfSB9KTtcbn07XG5cbnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcztcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihpdCkpID09ICdBcnJheUJ1ZmZlcicgfHwga2xhc3MgPT0gJ1NoYXJlZEFycmF5QnVmZmVyJztcbn07XG5cbnZhciBpc1R5cGVkQXJyYXlJbmRleCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICByZXR1cm4gaXNUeXBlZEFycmF5KHRhcmdldClcbiAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgJiYga2V5IGluIHRhcmdldFxuICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTtcbn07XG5cbnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXlJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgPyBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMiwgdGFyZ2V0W2tleV0pXG4gICAgOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xufTtcblxudmFyIHdyYXBwZWREZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gIGlmIChpc1R5cGVkQXJyYXlJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgJiYgaXNPYmplY3QoZGVzY3JpcHRvcilcbiAgICAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJylcbiAgICAmJiAhaGFzKGRlc2NyaXB0b3IsICdnZXQnKVxuICAgICYmICFoYXMoZGVzY3JpcHRvciwgJ3NldCcpXG4gICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnNcbiAgICAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGVcbiAgICAmJiAoIWhhcyhkZXNjcmlwdG9yLCAnd3JpdGFibGUnKSB8fCBkZXNjcmlwdG9yLndyaXRhYmxlKVxuICAgICYmICghaGFzKGRlc2NyaXB0b3IsICdlbnVtZXJhYmxlJykgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlKVxuICApIHtcbiAgICB0YXJnZXRba2V5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfSByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xufTtcblxuaWYgKERFU0NSSVBUT1JTKSB7XG4gIGlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mID0gd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gd3JhcHBlZERlZmluZVByb3BlcnR5O1xuICAgIGFkZEdldHRlcihUeXBlZEFycmF5UHJvdG90eXBlLCAnYnVmZmVyJyk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdieXRlT2Zmc2V0Jyk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdieXRlTGVuZ3RoJyk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdsZW5ndGgnKTtcbiAgfVxuXG4gICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIH0sIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IHdyYXBwZWRHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgZGVmaW5lUHJvcGVydHk6IHdyYXBwZWREZWZpbmVQcm9wZXJ0eVxuICB9KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCB3cmFwcGVyLCBDTEFNUEVEKSB7XG4gICAgdmFyIEJZVEVTID0gVFlQRS5tYXRjaCgvXFxkKyQvKVswXSAvIDg7XG4gICAgdmFyIENPTlNUUlVDVE9SX05BTUUgPSBUWVBFICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknO1xuICAgIHZhciBHRVRURVIgPSAnZ2V0JyArIFRZUEU7XG4gICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgVFlQRTtcbiAgICB2YXIgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3I7XG4gICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSA9IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgcmV0dXJuIGRhdGEudmlld1tHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgIH07XG5cbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgaWYgKENMQU1QRUQpIHZhbHVlID0gKHZhbHVlID0gcm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweEZGID8gMHhGRiA6IHZhbHVlICYgMHhGRjtcbiAgICAgIGRhdGEudmlld1tTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLmJ5dGVPZmZzZXQsIHZhbHVlLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgdmFyIGFkZEVsZW1lbnQgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoYXQsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBnZXR0ZXIodGhpcywgaW5kZXgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykge1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIGJ5dGVPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgYnVmZmVyLCBieXRlTGVuZ3RoLCBsZW5ndGg7XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpO1xuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgYnl0ZU9mZnNldCA9IHRvT2Zmc2V0KG9mZnNldCwgQllURVMpO1xuICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmICgkbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICgkbGVuICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gYnl0ZU9mZnNldDtcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoIDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoICsgYnl0ZU9mZnNldCA+ICRsZW4pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTO1xuICAgICAgICB9IGVsc2UgaWYgKGlzVHlwZWRBcnJheShkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5Q29uc3RydWN0b3IsIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0eXBlZEFycmF5RnJvbS5jYWxsKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgICAgYnVmZmVyOiBidWZmZXIsXG4gICAgICAgICAgYnl0ZU9mZnNldDogYnl0ZU9mZnNldCxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgICAgIHZpZXc6IG5ldyBEYXRhVmlldyhidWZmZXIpXG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIGFkZEVsZW1lbnQodGhhdCwgaW5kZXgrKyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZihUeXBlZEFycmF5Q29uc3RydWN0b3IsIFR5cGVkQXJyYXkpO1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShUeXBlZEFycmF5UHJvdG90eXBlKTtcbiAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZU19DT05TVFJVQ1RPUlNfUkVRVUlSRVNfV1JBUFBFUlMpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBkYXRhLCB0eXBlZEFycmF5T2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UoZHVtbXksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICAgIHJldHVybiBpbmhlcml0SWZSZXF1aXJlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkgcmV0dXJuIG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IodG9JbmRleChkYXRhKSk7XG4gICAgICAgICAgaWYgKGlzQXJyYXlCdWZmZXIoZGF0YSkpIHJldHVybiAkbGVuZ3RoICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6IHR5cGVkQXJyYXlPZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IoZGF0YSwgdG9PZmZzZXQodHlwZWRBcnJheU9mZnNldCwgQllURVMpKVxuICAgICAgICAgICAgICA6IG5ldyBOYXRpdmVUeXBlZEFycmF5Q29uc3RydWN0b3IoZGF0YSk7XG4gICAgICAgICAgaWYgKGlzVHlwZWRBcnJheShkYXRhKSkgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVkQXJyYXlGcm9tLmNhbGwoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBmb3JFYWNoKGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5Q29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGlmIChUWVBFRF9BUlJBWV9UQUcpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsIFRZUEVEX0FSUkFZX1RBRywgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgfVxuXG4gICAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBUeXBlZEFycmF5Q29uc3RydWN0b3I7XG5cbiAgICAkKHtcbiAgICAgIGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBUeXBlZEFycmF5Q29uc3RydWN0b3IgIT0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBzaGFtOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXU1xuICAgIH0sIGV4cG9ydGVkKTtcblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcikpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG4gICAgfVxuXG4gICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSwgQllURVNfUEVSX0VMRU1FTlQsIEJZVEVTKTtcbiAgICB9XG5cbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M7XG5cbnZhciBBcnJheUJ1ZmZlciA9IGdsb2JhbC5BcnJheUJ1ZmZlcjtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIEludDhBcnJheSgxKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5ldyBJbnQ4QXJyYXkoLTEpO1xufSkgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgbmV3IEludDhBcnJheSgpO1xuICBuZXcgSW50OEFycmF5KG51bGwpO1xuICBuZXcgSW50OEFycmF5KDEuNSk7XG4gIG5ldyBJbnQ4QXJyYXkoaXRlcmFibGUpO1xufSwgdHJ1ZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBTYWZhcmkgKDExKykgYnVnIC0gYSByZWFzb24gd2h5IGV2ZW4gU2FmYXJpIDEzIHNob3VsZCBsb2FkIGEgdHlwZWQgYXJyYXkgcG9seWZpbGxcbiAgcmV0dXJuIG5ldyBJbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKDIpLCAxLCB1bmRlZmluZWQpLmxlbmd0aCAhPT0gMTtcbn0pO1xuIiwidmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwZm4sIHRoaXNBcmcgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGksIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dDtcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICBPID0gW107XG4gICAgd2hpbGUgKCEoc3RlcCA9IG5leHQuY2FsbChpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgIE8ucHVzaChzdGVwLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1hcHBpbmcgJiYgYXJndW1lbnRzTGVuZ3RoID4gMikge1xuICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgfVxuICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0aGlzKSkobGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gbWFwcGluZyA/IG1hcGZuKE9baV0sIGkpIDogT1tpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgU3RyaW5nKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArICgrK2lkICsgcG9zdGZpeCkudG9TdHJpbmcoMzYpO1xufTtcbiIsInZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAmJiAhU3ltYm9sLnNoYW1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbmV4cG9ydHMuZiA9IHdlbGxLbm93blN5bWJvbDtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcblxudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKCFoYXMoV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkge1xuICAgIGlmIChOQVRJVkVfU1lNQk9MICYmIGhhcyhTeW1ib2wsIG5hbWUpKSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBTeW1ib2xbbmFtZV07XG4gICAgZWxzZSBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCIvLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGFycmF5QnVmZmVyTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlcicpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcblxudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG5cbi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5YnVmZmVyLWNvbnN0cnVjdG9yXG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IE5hdGl2ZUFycmF5QnVmZmVyICE9PSBBcnJheUJ1ZmZlciB9LCB7XG4gIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxufSk7XG5cbnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xuXG52YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IEFycmF5QnVmZmVyVmlld0NvcmUuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUztcblxuLy8gYEFycmF5QnVmZmVyLmlzVmlld2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheWJ1ZmZlci5pc3ZpZXdcbiQoeyB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfSwge1xuICBpc1ZpZXc6IEFycmF5QnVmZmVyVmlld0NvcmUuaXNWaWV3XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcblxudmFyIEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXJNb2R1bGUuQXJyYXlCdWZmZXI7XG52YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldztcbnZhciBuYXRpdmVBcnJheUJ1ZmZlclNsaWNlID0gQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlO1xuXG52YXIgSU5DT1JSRUNUX1NMSUNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyBBcnJheUJ1ZmZlcigyKS5zbGljZSgxLCB1bmRlZmluZWQpLmJ5dGVMZW5ndGg7XG59KTtcblxuLy8gYEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheWJ1ZmZlci5wcm90b3R5cGUuc2xpY2VcbiQoeyB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsIHByb3RvOiB0cnVlLCB1bnNhZmU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1NMSUNFIH0sIHtcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAobmF0aXZlQXJyYXlCdWZmZXJTbGljZSAhPT0gdW5kZWZpbmVkICYmIGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbmF0aXZlQXJyYXlCdWZmZXJTbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW4gLSBmaXJzdCkpO1xuICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VGFyZ2V0ID0gbmV3IERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHtcbiAgICAgIHZpZXdUYXJnZXQuc2V0VWludDgoaW5kZXgrKywgdmlld1NvdXJjZS5nZXRVaW50OChmaXJzdCsrKSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uJyk7XG5cbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7XG52YXIgTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCc7XG5cbi8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyYXkgPSBbXTtcbiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7XG4gIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7XG59KTtcblxudmFyIFNQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGksIGssIGxlbmd0aCwgbGVuLCBFO1xuICAgIGZvciAoaSA9IC0xLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIEUgPSBpID09PSAtMSA/IE8gOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAoaXNDb25jYXRTcHJlYWRhYmxlKEUpKSB7XG4gICAgICAgIGxlbiA9IHRvTGVuZ3RoKEUubGVuZ3RoKTtcbiAgICAgICAgaWYgKG4gKyBsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrLCBuKyspIGlmIChrIGluIEUpIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPj0gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgVHlwZUVycm9yKE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCk7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KEEsIG4rKywgRSk7XG4gICAgICB9XG4gICAgfVxuICAgIEEubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjb3B5V2l0aGluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWNvcHktd2l0aGluJyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5jb3B5d2l0aGluXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGNvcHlXaXRoaW46IGNvcHlXaXRoaW5cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygnY29weVdpdGhpbicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGV2ZXJ5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmV2ZXJ5O1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ2V2ZXJ5Jyk7XG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnZXZlcnknKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFTVFJJQ1RfTUVUSE9EIHx8ICFVU0VTX1RPX0xFTkdUSCB9LCB7XG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZXZlcnkodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZpbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsbFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmaWxsOiBmaWxsXG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2ZpbGwnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmlsdGVyO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdmaWx0ZXInKTtcbi8vIEVkZ2UgMTQtIGlzc3VlXG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnZmlsdGVyJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB8fCAhVVNFU19UT19MRU5HVEggfSwge1xuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZmlsdGVyKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZEluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmRJbmRleDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgRklORF9JTkRFWCA9ICdmaW5kSW5kZXgnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoRklORF9JTkRFWCk7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoRklORF9JTkRFWCBpbiBbXSkgQXJyYXkoMSlbRklORF9JTkRFWF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRpbmRleFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmRJbmRleCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EX0lOREVYKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmQ7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIEZJTkQgPSAnZmluZCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aChGSU5EKTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIHx8ICFVU0VTX1RPX0xFTkdUSCB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmxhdE1hcGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1mbGF0TWFwXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBzb3VyY2VMZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIEE7XG4gICAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgQS5sZW5ndGggPSBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgMSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mbGF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWZsYXRNYXBcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmxhdDogZnVuY3Rpb24gZmxhdCgvKiBkZXB0aEFyZyA9IDEgKi8pIHtcbiAgICB2YXIgZGVwdGhBcmcgPSBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICBBLmxlbmd0aCA9IGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2gnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBbXS5mb3JFYWNoICE9IGZvckVhY2ggfSwge1xuICBmb3JFYWNoOiBmb3JFYWNoXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZnJvbScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBBcnJheS5mcm9tKGl0ZXJhYmxlKTtcbn0pO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluY2x1ZGVzO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeyBBQ0NFU1NPUlM6IHRydWUsIDE6IDAgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhVVNFU19UT19MRU5HVEggfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBuYXRpdmVJbmRleE9mID0gW10uaW5kZXhPZjtcblxudmFyIE5FR0FUSVZFX1pFUk8gPSAhIW5hdGl2ZUluZGV4T2YgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ2luZGV4T2YnKTtcbnZhciBVU0VTX1RPX0xFTkdUSCA9IGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoKCdpbmRleE9mJywgeyBBQ0NFU1NPUlM6IHRydWUsIDE6IDAgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogTkVHQVRJVkVfWkVSTyB8fCAhU1RSSUNUX01FVEhPRCB8fCAhVVNFU19UT19MRU5HVEggfSwge1xuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gbmF0aXZlSW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxuLy8gYEFycmF5LmlzQXJyYXlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuaXNhcnJheVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzQXJyYXk6IGlzQXJyYXlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIG5hdGl2ZUpvaW4gPSBbXS5qb2luO1xuXG52YXIgRVMzX1NUUklOR1MgPSBJbmRleGVkT2JqZWN0ICE9IE9iamVjdDtcbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnam9pbicsICcsJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuam9pbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuam9pblxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRVMzX1NUUklOR1MgfHwgIVNUUklDVF9NRVRIT0QgfSwge1xuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgIHJldHVybiBuYXRpdmVKb2luLmNhbGwodG9JbmRleGVkT2JqZWN0KHRoaXMpLCBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCA/ICcsJyA6IHNlcGFyYXRvcik7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbGFzdEluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbGFzdC1pbmRleC1vZicpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5sYXN0aW5kZXhvZlxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogbGFzdEluZGV4T2YgIT09IFtdLmxhc3RJbmRleE9mIH0sIHtcbiAgbGFzdEluZGV4T2Y6IGxhc3RJbmRleE9mXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykubWFwO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdtYXAnKTtcbi8vIEZGNDktIGlzc3VlXG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnbWFwJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB8fCAhVVNFU19UT19MRU5HVEggfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG52YXIgSVNOVF9HRU5FUklDID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xuXG4vLyBgQXJyYXkub2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkub2Zcbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTTlRfR0VORVJJQyB9LCB7XG4gIG9mOiBmdW5jdGlvbiBvZigvKiAuLi5hcmdzICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhcmd1bWVudHNMZW5ndGgpO1xuICAgIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYXJndW1lbnRzTGVuZ3RoO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHJlZHVjZVJpZ2h0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXJlZHVjZScpLnJpZ2h0O1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ3JlZHVjZVJpZ2h0Jyk7XG4vLyBGb3IgcHJldmVudGluZyBwb3NzaWJsZSBhbG1vc3QgaW5maW5pdGUgbG9vcCBpbiBub24tc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zLCB0ZXN0IHRoZSBmb3J3YXJkIHZlcnNpb24gb2YgdGhlIG1ldGhvZFxudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3JlZHVjZScsIHsgMTogMCB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlcmlnaHRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFTVFJJQ1RfTUVUSE9EIHx8ICFVU0VTX1RPX0xFTkdUSCB9LCB7XG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgcmV0dXJuICRyZWR1Y2VSaWdodCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UnKS5sZWZ0O1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIGFycmF5TWV0aG9kVXNlc1RvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC11c2VzLXRvLWxlbmd0aCcpO1xuXG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ3JlZHVjZScpO1xudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3JlZHVjZScsIHsgMTogMCB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNUUklDVF9NRVRIT0QgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciBuYXRpdmVSZXZlcnNlID0gW10ucmV2ZXJzZTtcbnZhciB0ZXN0ID0gWzEsIDJdO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJldmVyc2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJldmVyc2Vcbi8vIGZpeCBmb3IgU2FmYXJpIDEyLjAgYnVnXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTg4Nzk0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTdHJpbmcodGVzdCkgPT09IFN0cmluZyh0ZXN0LnJldmVyc2UoKSkgfSwge1xuICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIGlmIChpc0FycmF5KHRoaXMpKSB0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHJldHVybiBuYXRpdmVSZXZlcnNlLmNhbGwodGhpcyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtdXNlcy10by1sZW5ndGgnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdzbGljZScpO1xudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3NsaWNlJywgeyBBQ0NFU1NPUlM6IHRydWUsIDA6IDAsIDE6IDIgfSk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgbmF0aXZlU2xpY2UgPSBbXS5zbGljZTtcbnZhciBtYXggPSBNYXRoLm1heDtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc2xpY2Vcbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIHx8ICFVU0VTX1RPX0xFTkdUSCB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgayA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuZ3RoKTtcbiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpO1xuICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZVxuICAgIHZhciBDb25zdHJ1Y3RvciwgcmVzdWx0LCBuO1xuICAgIGlmIChpc0FycmF5KE8pKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7XG4gICAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgICAgaWYgKHR5cGVvZiBDb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIChDb25zdHJ1Y3RvciA9PT0gQXJyYXkgfHwgaXNBcnJheShDb25zdHJ1Y3Rvci5wcm90b3R5cGUpKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JbU1BFQ0lFU107XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlLmNhbGwoTywgaywgZmluKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTtcbiAgICBmb3IgKG4gPSAwOyBrIDwgZmluOyBrKyssIG4rKykgaWYgKGsgaW4gTykgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBuLCBPW2tdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRzb21lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLnNvbWU7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnc29tZScpO1xudmFyIFVTRVNfVE9fTEVOR1RIID0gYXJyYXlNZXRob2RVc2VzVG9MZW5ndGgoJ3NvbWUnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhU1RSSUNUX01FVEhPRCB8fCAhVVNFU19UT19MRU5HVEggfSwge1xuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciB0ZXN0ID0gW107XG52YXIgbmF0aXZlU29ydCA9IHRlc3Quc29ydDtcblxuLy8gSUU4LVxudmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KTtcbi8vIFY4IGJ1Z1xudmFyIEZBSUxTX09OX05VTEwgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydChudWxsKTtcbn0pO1xuLy8gT2xkIFdlYktpdFxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdzb3J0Jyk7XG5cbnZhciBGT1JDRUQgPSBGQUlMU19PTl9VTkRFRklORUQgfHwgIUZBSUxTX09OX05VTEwgfHwgIVNUUklDVF9NRVRIT0Q7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29ydFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gbmF0aXZlU29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxuICAgICAgOiBuYXRpdmVTb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTtcbiAgfVxufSk7XG4iLCJ2YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xuXG4vLyBgQXJyYXlbQEBzcGVjaWVzXWAgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXQtYXJyYXktQEBzcGVjaWVzXG5zZXRTcGVjaWVzKCdBcnJheScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG52YXIgYXJyYXlNZXRob2RVc2VzVG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLXVzZXMtdG8tbGVuZ3RoJyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnc3BsaWNlJyk7XG52YXIgVVNFU19UT19MRU5HVEggPSBhcnJheU1ldGhvZFVzZXNUb0xlbmd0aCgnc3BsaWNlJywgeyBBQ0NFU1NPUlM6IHRydWUsIDA6IDAsIDE6IDIgfSk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjtcbnZhciBNQVhJTVVNX0FMTE9XRURfTEVOR1RIX0VYQ0VFREVEID0gJ01heGltdW0gYWxsb3dlZCBsZW5ndGggZXhjZWVkZWQnO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc3BsaWNlXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfHwgIVVTRVNfVE9fTEVOR1RIIH0sIHtcbiAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50IC8qICwgLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGFjdHVhbFN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICAgIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpbnNlcnRDb3VudCwgYWN0dWFsRGVsZXRlQ291bnQsIEEsIGssIGZyb20sIHRvO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPT09IDApIHtcbiAgICAgIGluc2VydENvdW50ID0gYWN0dWFsRGVsZXRlQ291bnQgPSAwO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAxKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IDA7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IGxlbiAtIGFjdHVhbFN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFyZ3VtZW50c0xlbmd0aCAtIDI7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IG1pbihtYXgodG9JbnRlZ2VyKGRlbGV0ZUNvdW50KSwgMCksIGxlbiAtIGFjdHVhbFN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGxlbiArIGluc2VydENvdW50IC0gYWN0dWFsRGVsZXRlQ291bnQgPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0xFTkdUSF9FWENFRURFRCk7XG4gICAgfVxuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgYWN0dWFsRGVsZXRlQ291bnQpO1xuICAgIGZvciAoayA9IDA7IGsgPCBhY3R1YWxEZWxldGVDb3VudDsgaysrKSB7XG4gICAgICBmcm9tID0gYWN0dWFsU3RhcnQgKyBrO1xuICAgICAgaWYgKGZyb20gaW4gTykgY3JlYXRlUHJvcGVydHkoQSwgaywgT1tmcm9tXSk7XG4gICAgfVxuICAgIEEubGVuZ3RoID0gYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgaWYgKGluc2VydENvdW50IDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGFjdHVhbFN0YXJ0OyBrIDwgbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudDtcbiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IGxlbjsgayA+IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7IGstLSkgZGVsZXRlIE9bayAtIDFdO1xuICAgIH0gZWxzZSBpZiAoaW5zZXJ0Q291bnQgPiBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgZm9yIChrID0gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsgPiBhY3R1YWxTdGFydDsgay0tKSB7XG4gICAgICAgIGZyb20gPSBrICsgYWN0dWFsRGVsZXRlQ291bnQgLSAxO1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudCAtIDE7XG4gICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoayA9IDA7IGsgPCBpbnNlcnRDb3VudDsgaysrKSB7XG4gICAgICBPW2sgKyBhY3R1YWxTdGFydF0gPSBhcmd1bWVudHNbayArIDJdO1xuICAgIH1cbiAgICBPLmxlbmd0aCA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaW5zZXJ0Q291bnQ7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIiwiLy8gdGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIHVuc2NvcGFibGVzIGFmdGVyIGltcGxlbWVudGF0aW9uXG4vLyBpbiBwb3B1bGFyIGVuZ2luZXMsIHNvIGl0J3MgbW92ZWQgdG8gYSBzZXBhcmF0ZSBtb2R1bGVcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdmbGF0TWFwJyk7XG4iLCIvLyB0aGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gdW5zY29wYWJsZXMgYWZ0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGluIHBvcHVsYXIgZW5naW5lcywgc28gaXQncyBtb3ZlZCB0byBhIHNlcGFyYXRlIG1vZHVsZVxudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2ZsYXQnKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIEFycmF5QnVmZmVyTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlcicpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5hdGl2ZScpO1xuXG4vLyBgRGF0YVZpZXdgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRhdmlldy1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX0FSUkFZX0JVRkZFUiB9LCB7XG4gIERhdGFWaWV3OiBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlld1xufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYERhdGUubm93YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRhdGUubm93XG4kKHsgdGFyZ2V0OiAnRGF0ZScsIHN0YXQ6IHRydWUgfSwge1xuICBub3c6IGZ1bmN0aW9uIG5vdygpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nJyk7XG5cbi8vIGBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2lzb3N0cmluZ1xuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kKHsgdGFyZ2V0OiAnRGF0ZScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICE9PSB0b0lTT1N0cmluZyB9LCB7XG4gIHRvSVNPU3RyaW5nOiB0b0lTT1N0cmluZ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KTtcblxuLy8gYERhdGUucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2pzb25cbiQoeyB0YXJnZXQ6ICdEYXRlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iLCJ2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGRhdGVUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kYXRlLXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xudmFyIERhdGVQcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTtcblxuLy8gYERhdGUucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRhdGUucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbmlmICghKFRPX1BSSU1JVElWRSBpbiBEYXRlUHJvdG90eXBlKSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoRGF0ZVByb3RvdHlwZSwgVE9fUFJJTUlUSVZFLCBkYXRlVG9QcmltaXRpdmUpO1xufVxuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbnZhciBEYXRlUHJvdG90eXBlID0gRGF0ZS5wcm90b3R5cGU7XG52YXIgSU5WQUxJRF9EQVRFID0gJ0ludmFsaWQgRGF0ZSc7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBuYXRpdmVEYXRlVG9TdHJpbmcgPSBEYXRlUHJvdG90eXBlW1RPX1NUUklOR107XG52YXIgZ2V0VGltZSA9IERhdGVQcm90b3R5cGUuZ2V0VGltZTtcblxuLy8gYERhdGUucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRhdGUucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkge1xuICByZWRlZmluZShEYXRlUHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFRpbWUuY2FsbCh0aGlzKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IG5hdGl2ZURhdGVUb1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZCcpO1xuXG4vLyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbiQoeyB0YXJnZXQ6ICdGdW5jdGlvbicsIHByb3RvOiB0cnVlIH0sIHtcbiAgYmluZDogYmluZFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBIQVNfSU5TVEFOQ0UgPSB3ZWxsS25vd25TeW1ib2woJ2hhc0luc3RhbmNlJyk7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLUBAaGFzaW5zdGFuY2VcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvdHlwZSkpIHtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihGdW5jdGlvblByb3RvdHlwZSwgSEFTX0lOU1RBTkNFLCB7IHZhbHVlOiBmdW5jdGlvbiAoTykge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gICAgLy8gZm9yIGVudmlyb25tZW50IHcvbyBuYXRpdmUgYEBAaGFzSW5zdGFuY2VgIGxvZ2ljIGVub3VnaCBgaW5zdGFuY2VvZmAsIGJ1dCBhZGQgdGhpczpcbiAgICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSB9KTtcbn1cbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGVUb1N0cmluZyA9IEZ1bmN0aW9uUHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyBGdW5jdGlvbiBpbnN0YW5jZXMgYC5uYW1lYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnVuY3Rpb24taW5zdGFuY2VzLW5hbWVcbmlmIChERVNDUklQVE9SUyAmJiAhKE5BTUUgaW4gRnVuY3Rpb25Qcm90b3R5cGUpKSB7XG4gIGRlZmluZVByb3BlcnR5KEZ1bmN0aW9uUHJvdG90eXBlLCBOQU1FLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcuY2FsbCh0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbi8vIGBnbG9iYWxUaGlzYCBvYmplY3Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIGdsb2JhbFRoaXM6IGdsb2JhbFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciAkc3RyaW5naWZ5ID0gZ2V0QnVpbHRJbignSlNPTicsICdzdHJpbmdpZnknKTtcbnZhciByZSA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIGZpeCA9IGZ1bmN0aW9uIChtYXRjaCwgb2Zmc2V0LCBzdHJpbmcpIHtcbiAgdmFyIHByZXYgPSBzdHJpbmcuY2hhckF0KG9mZnNldCAtIDEpO1xuICB2YXIgbmV4dCA9IHN0cmluZy5jaGFyQXQob2Zmc2V0ICsgMSk7XG4gIGlmICgobG93LnRlc3QobWF0Y2gpICYmICFoaS50ZXN0KG5leHQpKSB8fCAoaGkudGVzdChtYXRjaCkgJiYgIWxvdy50ZXN0KHByZXYpKSkge1xuICAgIHJldHVybiAnXFxcXHUnICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRzdHJpbmdpZnkoJ1xcdURGMDZcXHVEODM0JykgIT09ICdcIlxcXFx1ZGYwNlxcXFx1ZDgzNFwiJ1xuICAgIHx8ICRzdHJpbmdpZnkoJ1xcdURFQUQnKSAhPT0gJ1wiXFxcXHVkZWFkXCInO1xufSk7XG5cbmlmICgkc3RyaW5naWZ5KSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXdlbGwtZm9ybWVkLXN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gJHN0cmluZ2lmeS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXN1bHQgPT0gJ3N0cmluZycgPyByZXN1bHQucmVwbGFjZShyZSwgZml4KSA6IHJlc3VsdDtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBKU09OW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1qc29uLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBsb2cxcCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLWxvZzFwJyk7XG5cbnZhciBuYXRpdmVBY29zaCA9IE1hdGguYWNvc2g7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxudmFyIEZPUkNFRCA9ICFuYXRpdmVBY29zaFxuICAvLyBWOCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNTA5XG4gIHx8IE1hdGguZmxvb3IobmF0aXZlQWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpICE9IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICB8fCBuYXRpdmVBY29zaChJbmZpbml0eSkgIT0gSW5maW5pdHk7XG5cbi8vIGBNYXRoLmFjb3NoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguYWNvc2hcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBhY29zaDogZnVuY3Rpb24gYWNvc2goeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTZcbiAgICAgID8gbG9nKHgpICsgTE4yXG4gICAgICA6IGxvZzFwKHggLSAxICsgc3FydCh4IC0gMSkgKiBzcXJ0KHggKyAxKSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBuYXRpdmVBc2luaCA9IE1hdGguYXNpbmg7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgc3FydCA9IE1hdGguc3FydDtcblxuZnVuY3Rpb24gYXNpbmgoeCkge1xuICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IGxvZyh4ICsgc3FydCh4ICogeCArIDEpKTtcbn1cblxuLy8gYE1hdGguYXNpbmhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5hc2luaFxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmFzaW5oKDApIC0+IC0wXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIShuYXRpdmVBc2luaCAmJiAxIC8gbmF0aXZlQXNpbmgoMCkgPiAwKSB9LCB7XG4gIGFzaW5oOiBhc2luaFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIG5hdGl2ZUF0YW5oID0gTWF0aC5hdGFuaDtcbnZhciBsb2cgPSBNYXRoLmxvZztcblxuLy8gYE1hdGguYXRhbmhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5hdGFuaFxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmF0YW5oKC0wKSAtPiAwXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIShuYXRpdmVBdGFuaCAmJiAxIC8gbmF0aXZlQXRhbmgoLTApIDwgMCkgfSwge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IGxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC1zaWduJyk7XG5cbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBwb3cgPSBNYXRoLnBvdztcblxuLy8gYE1hdGguY2JydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmNicnRcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBwb3coYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE9HMkUgPSBNYXRoLkxPRzJFO1xuXG4vLyBgTWF0aC5jbHozMmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmNsejMyXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICBjbHozMjogZnVuY3Rpb24gY2x6MzIoeCkge1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBmbG9vcihsb2coeCArIDAuNSkgKiBMT0cyRSkgOiAzMjtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLWV4cG0xJyk7XG5cbnZhciBuYXRpdmVDb3NoID0gTWF0aC5jb3NoO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIEUgPSBNYXRoLkU7XG5cbi8vIGBNYXRoLmNvc2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5jb3NoXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIW5hdGl2ZUNvc2ggfHwgbmF0aXZlQ29zaCg3MTApID09PSBJbmZpbml0eSB9LCB7XG4gIGNvc2g6IGZ1bmN0aW9uIGNvc2goeCkge1xuICAgIHZhciB0ID0gZXhwbTEoYWJzKHgpIC0gMSkgKyAxO1xuICAgIHJldHVybiAodCArIDEgLyAodCAqIEUgKiBFKSkgKiAoRSAvIDIpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEnKTtcblxuLy8gYE1hdGguZXhwbTFgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5leHBtMVxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IGV4cG0xICE9IE1hdGguZXhwbTEgfSwgeyBleHBtMTogZXhwbTEgfSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm91bmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC1mcm91bmQnKTtcblxuLy8gYE1hdGguZnJvdW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguZnJvdW5kXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgeyBmcm91bmQ6IGZyb3VuZCB9KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG52YXIgJGh5cG90ID0gTWF0aC5oeXBvdDtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG4vLyBDaHJvbWUgNzcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05NTQ2XG52YXIgQlVHR1kgPSAhISRoeXBvdCAmJiAkaHlwb3QoSW5maW5pdHksIE5hTikgIT09IEluZmluaXR5O1xuXG4vLyBgTWF0aC5oeXBvdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogQlVHR1kgfSwge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogc3FydChzdW0pO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBuYXRpdmVJbXVsID0gTWF0aC5pbXVsO1xuXG52YXIgRk9SQ0VEID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlSW11bCgweEZGRkZGRkZGLCA1KSAhPSAtNSB8fCBuYXRpdmVJbXVsLmxlbmd0aCAhPSAyO1xufSk7XG5cbi8vIGBNYXRoLmltdWxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbWF0aC5pbXVsXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGltdWw6IGZ1bmN0aW9uIGltdWwoeCwgeSkge1xuICAgIHZhciBVSU5UMTYgPSAweEZGRkY7XG4gICAgdmFyIHhuID0gK3g7XG4gICAgdmFyIHluID0gK3k7XG4gICAgdmFyIHhsID0gVUlOVDE2ICYgeG47XG4gICAgdmFyIHlsID0gVUlOVDE2ICYgeW47XG4gICAgcmV0dXJuIDAgfCB4bCAqIHlsICsgKChVSU5UMTYgJiB4biA+Pj4gMTYpICogeWwgKyB4bCAqIChVSU5UMTYgJiB5biA+Pj4gMTYpIDw8IDE2ID4+PiAwKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExPRzEwRSA9IE1hdGguTE9HMTBFO1xuXG4vLyBgTWF0aC5sb2cxMGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzEwXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICBsb2cxMDogZnVuY3Rpb24gbG9nMTAoeCkge1xuICAgIHJldHVybiBsb2coeCkgKiBMT0cxMEU7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC1sb2cxcCcpO1xuXG4vLyBgTWF0aC5sb2cxcGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLmxvZzFwXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwgeyBsb2cxcDogbG9nMXAgfSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG4vLyBgTWF0aC5sb2cyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgubG9nMlxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgbG9nMjogZnVuY3Rpb24gbG9nMih4KSB7XG4gICAgcmV0dXJuIGxvZyh4KSAvIExOMjtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtc2lnbicpO1xuXG4vLyBgTWF0aC5zaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGguc2lnblxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgc2lnbjogc2lnblxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtZXhwbTEnKTtcblxudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIGV4cCA9IE1hdGguZXhwO1xudmFyIEUgPSBNYXRoLkU7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXRoLnNpbmgoLTJlLTE3KSAhPSAtMmUtMTc7XG59KTtcblxuLy8gYE1hdGguc2luaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLnNpbmhcbi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHNpbmg6IGZ1bmN0aW9uIHNpbmgoeCkge1xuICAgIHJldHVybiBhYnMoeCA9ICt4KSA8IDEgPyAoZXhwbTEoeCkgLSBleHBtMSgteCkpIC8gMiA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKEUgLyAyKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLWV4cG0xJyk7XG5cbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gYE1hdGgudGFuaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLnRhbmhcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHRhbmg6IGZ1bmN0aW9uIHRhbmgoeCkge1xuICAgIHZhciBhID0gZXhwbTEoeCA9ICt4KTtcbiAgICB2YXIgYiA9IGV4cG0xKC14KTtcbiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpO1xuICB9XG59KTtcbiIsInZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBNYXRoW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTWF0aC50cnVuY2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHtcbiAgICByZXR1cm4gKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG5cbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciBOYXRpdmVOdW1iZXIgPSBnbG9iYWxbTlVNQkVSXTtcbnZhciBOdW1iZXJQcm90b3R5cGUgPSBOYXRpdmVOdW1iZXIucHJvdG90eXBlO1xuXG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ0xBU1NPRiA9IGNsYXNzb2YoY3JlYXRlKE51bWJlclByb3RvdHlwZSkpID09IE5VTUJFUjtcblxuLy8gYFRvTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvbnVtYmVyXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgdmFyIGZpcnN0LCB0aGlyZCwgcmFkaXgsIG1heENvZGUsIGRpZ2l0cywgbGVuZ3RoLCBpbmRleCwgY29kZTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSB0cmltKGl0KTtcbiAgICBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIG9mIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIG9mIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGRpZ2l0cyA9IGl0LnNsaWNlKDIpO1xuICAgICAgbGVuZ3RoID0gZGlnaXRzLmxlbmd0aDtcbiAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuLy8gYE51bWJlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci1jb25zdHJ1Y3RvclxuaWYgKGlzRm9yY2VkKE5VTUJFUiwgIU5hdGl2ZU51bWJlcignIDBvMScpIHx8ICFOYXRpdmVOdW1iZXIoJzBiMScpIHx8IE5hdGl2ZU51bWJlcignKzB4MScpKSkge1xuICB2YXIgTnVtYmVyV3JhcHBlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSkge1xuICAgIHZhciBpdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IHZhbHVlO1xuICAgIHZhciBkdW1teSA9IHRoaXM7XG4gICAgcmV0dXJuIGR1bW15IGluc3RhbmNlb2YgTnVtYmVyV3JhcHBlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NMQVNTT0YgPyBmYWlscyhmdW5jdGlvbiAoKSB7IE51bWJlclByb3RvdHlwZS52YWx1ZU9mLmNhbGwoZHVtbXkpOyB9KSA6IGNsYXNzb2YoZHVtbXkpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlTnVtYmVyKHRvTnVtYmVyKGl0KSksIGR1bW15LCBOdW1iZXJXcmFwcGVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IERFU0NSSVBUT1JTID8gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVOdW1iZXIpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVMyMDE1IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVMyMDE1IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoTmF0aXZlTnVtYmVyLCBrZXkgPSBrZXlzW2pdKSAmJiAhaGFzKE51bWJlcldyYXBwZXIsIGtleSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KE51bWJlcldyYXBwZXIsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5hdGl2ZU51bWJlciwga2V5KSk7XG4gICAgfVxuICB9XG4gIE51bWJlcldyYXBwZXIucHJvdG90eXBlID0gTnVtYmVyUHJvdG90eXBlO1xuICBOdW1iZXJQcm90b3R5cGUuY29uc3RydWN0b3IgPSBOdW1iZXJXcmFwcGVyO1xuICByZWRlZmluZShnbG9iYWwsIE5VTUJFUiwgTnVtYmVyV3JhcHBlcik7XG59XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5FUFNJTE9OYCBjb25zdGFudFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmVwc2lsb25cbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgRVBTSUxPTjogTWF0aC5wb3coMiwgLTUyKVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBudW1iZXJJc0Zpbml0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItaXMtZmluaXRlJyk7XG5cbi8vIGBOdW1iZXIuaXNGaW5pdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzZmluaXRlXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7IGlzRmluaXRlOiBudW1iZXJJc0Zpbml0ZSB9KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1pbnRlZ2VyJyk7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5pc2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNJbnRlZ2VyOiBpc0ludGVnZXJcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbi8vIGBOdW1iZXIuaXNOYU5gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzbmFuXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKTtcblxudmFyIGFicyA9IE1hdGguYWJzO1xuXG4vLyBgTnVtYmVyLmlzU2FmZUludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxRkZGRkZGRkZGRkZGRjtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYCBjb25zdGFudFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLm1heF9zYWZlX2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgTUFYX1NBRkVfSU5URUdFUjogMHgxRkZGRkZGRkZGRkZGRlxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE51bWJlci5NSU5fU0FGRV9JTlRFR0VSYCBjb25zdGFudFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLm1pbl9zYWZlX2ludGVnZXJcbiQoeyB0YXJnZXQ6ICdOdW1iZXInLCBzdGF0OiB0cnVlIH0sIHtcbiAgTUlOX1NBRkVfSU5URUdFUjogLTB4MUZGRkZGRkZGRkZGRkZcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQnKTtcblxuLy8gYE51bWJlci5wYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW51bWJlci5wYXJzZUZsb2F0XG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VGbG9hdCAhPSBwYXJzZUZsb2F0IH0sIHtcbiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdFxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUludCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50Jyk7XG5cbi8vIGBOdW1iZXIucGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLnBhcnNlaW50XG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBOdW1iZXIucGFyc2VJbnQgIT0gcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogcGFyc2VJbnRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciB0aGlzTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGhpcy1udW1iZXItdmFsdWUnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBuYXRpdmVUb0ZpeGVkID0gMS4wLnRvRml4ZWQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xuXG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxudmFyIEZPUkNFRCA9IG5hdGl2ZVRvRml4ZWQgJiYgKFxuICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHxcbiAgMC45LnRvRml4ZWQoMCkgIT09ICcxJyB8fFxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcbiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xuKSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICBuYXRpdmVUb0ZpeGVkLmNhbGwoe30pO1xufSk7XG5cbi8vIGBOdW1iZXIucHJvdG90eXBlLnRvRml4ZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLnByb3RvdHlwZS50b2ZpeGVkXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIHRvRml4ZWQ6IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICB2YXIgbnVtYmVyID0gdGhpc051bWJlclZhbHVlKHRoaXMpO1xuICAgIHZhciBmcmFjdERpZ2l0cyA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgdmFyIHNpZ24gPSAnJztcbiAgICB2YXIgcmVzdWx0ID0gJzAnO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuXG4gICAgdmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGMyID0gYztcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgNikge1xuICAgICAgICBjMiArPSBuICogZGF0YVtpbmRleF07XG4gICAgICAgIGRhdGFbaW5kZXhdID0gYzIgJSAxZTc7XG4gICAgICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZGl2aWRlID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgIHZhciBpbmRleCA9IDY7XG4gICAgICB2YXIgYyA9IDA7XG4gICAgICB3aGlsZSAoLS1pbmRleCA+PSAwKSB7XG4gICAgICAgIGMgKz0gZGF0YVtpbmRleF07XG4gICAgICAgIGRhdGFbaW5kZXhdID0gZmxvb3IoYyAvIG4pO1xuICAgICAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGRhdGFUb1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbmRleCA9IDY7XG4gICAgICB2YXIgcyA9ICcnO1xuICAgICAgd2hpbGUgKC0taW5kZXggPj0gMCkge1xuICAgICAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHtcbiAgICAgICAgICB2YXIgdCA9IFN0cmluZyhkYXRhW2luZGV4XSk7XG4gICAgICAgICAgcyA9IHMgPT09ICcnID8gdCA6IHMgKyByZXBlYXQuY2FsbCgnMCcsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiBzO1xuICAgIH07XG5cbiAgICBpZiAoZnJhY3REaWdpdHMgPCAwIHx8IGZyYWN0RGlnaXRzID4gMjApIHRocm93IFJhbmdlRXJyb3IoJ0luY29ycmVjdCBmcmFjdGlvbiBkaWdpdHMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKG51bWJlciAhPSBudW1iZXIpIHJldHVybiAnTmFOJztcbiAgICBpZiAobnVtYmVyIDw9IC0xZTIxIHx8IG51bWJlciA+PSAxZTIxKSByZXR1cm4gU3RyaW5nKG51bWJlcik7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHNpZ24gPSAnLSc7XG4gICAgICBudW1iZXIgPSAtbnVtYmVyO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID4gMWUtMjEpIHtcbiAgICAgIGUgPSBsb2cobnVtYmVyICogcG93KDIsIDY5LCAxKSkgLSA2OTtcbiAgICAgIHogPSBlIDwgMCA/IG51bWJlciAqIHBvdygyLCAtZSwgMSkgOiBudW1iZXIgLyBwb3coMiwgZSwgMSk7XG4gICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7XG4gICAgICBlID0gNTIgLSBlO1xuICAgICAgaWYgKGUgPiAwKSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBqID0gZnJhY3REaWdpdHM7XG4gICAgICAgIHdoaWxlIChqID49IDcpIHtcbiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgIGogLT0gNztcbiAgICAgICAgfVxuICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTtcbiAgICAgICAgaiA9IGUgLSAxO1xuICAgICAgICB3aGlsZSAoaiA+PSAyMykge1xuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcbiAgICAgICAgICBqIC09IDIzO1xuICAgICAgICB9XG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xuICAgICAgICBtdWx0aXBseSgxLCAxKTtcbiAgICAgICAgZGl2aWRlKDIpO1xuICAgICAgICByZXN1bHQgPSBkYXRhVG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcbiAgICAgICAgcmVzdWx0ID0gZGF0YVRvU3RyaW5nKCkgKyByZXBlYXQuY2FsbCgnMCcsIGZyYWN0RGlnaXRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWN0RGlnaXRzID4gMCkge1xuICAgICAgayA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICByZXN1bHQgPSBzaWduICsgKGsgPD0gZnJhY3REaWdpdHNcbiAgICAgICAgPyAnMC4nICsgcmVwZWF0LmNhbGwoJzAnLCBmcmFjdERpZ2l0cyAtIGspICsgcmVzdWx0XG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGsgLSBmcmFjdERpZ2l0cykgKyAnLicgKyByZXN1bHQuc2xpY2UoayAtIGZyYWN0RGlnaXRzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNpZ24gKyByZXN1bHQ7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdGhpc051bWJlclZhbHVlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlJyk7XG5cbnZhciBuYXRpdmVUb1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gbmF0aXZlVG9QcmVjaXNpb24uY2FsbCgxLCB1bmRlZmluZWQpICE9PSAnMSc7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICBuYXRpdmVUb1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pO1xuXG4vLyBgTnVtYmVyLnByb3RvdHlwZS50b1ByZWNpc2lvbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIucHJvdG90eXBlLnRvcHJlY2lzaW9uXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZFxuICAgICAgPyBuYXRpdmVUb1ByZWNpc2lvbi5jYWxsKHRoaXNOdW1iZXJWYWx1ZSh0aGlzKSlcbiAgICAgIDogbmF0aXZlVG9QcmVjaXNpb24uY2FsbCh0aGlzTnVtYmVyVmFsdWUodGhpcyksIHByZWNpc2lvbik7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmFzc2lnblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgY3JlYXRlOiBjcmVhdGVcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBGT1JDRUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtZm9yY2VkJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX19gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fXG5pZiAoREVTQ1JJUFRPUlMpIHtcbiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gICAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYodG9PYmplY3QodGhpcyksIFAsIHsgZ2V0OiBhRnVuY3Rpb24oZ2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIURFU0NSSVBUT1JTLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBkZWZpbmVQcm9wZXJ0aWVzOiBkZWZpbmVQcm9wZXJ0aWVzXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgb2JqZWN0RGVmaW5lUHJvcGVydHlNb2RpbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIURFU0NSSVBUT1JTLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBkZWZpbmVQcm9wZXJ0eTogb2JqZWN0RGVmaW5lUHJvcGVydHlNb2RpbGUuZlxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIEZPUkNFRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1mb3JjZWQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfX2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX19cbmlmIChERVNDUklQVE9SUykge1xuICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgICBfX2RlZmluZVNldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcikge1xuICAgICAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZih0b09iamVjdCh0aGlzKSwgUCwgeyBzZXQ6IGFGdW5jdGlvbihzZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZW50cmllc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKE8pIHtcbiAgICByZXR1cm4gJGVudHJpZXMoTyk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG9uRnJlZXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykub25GcmVlemU7XG5cbnZhciBuYXRpdmVGcmVlemUgPSBPYmplY3QuZnJlZXplO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUZyZWV6ZSgxKTsgfSk7XG5cbi8vIGBPYmplY3QuZnJlZXplYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5mcmVlemVcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7XG4gIGZyZWV6ZTogZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVGcmVlemUob25GcmVlemUoaXQpKSA6IGl0O1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBgT2JqZWN0LmZyb21FbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1mcm9tLWVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZnJvbUVudHJpZXM6IGZ1bmN0aW9uIGZyb21FbnRyaWVzKGl0ZXJhYmxlKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShvYmosIGssIHYpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKDEpOyB9KTtcbnZhciBGT1JDRUQgPSAhREVTQ1JJUFRPUlMgfHwgRkFJTFNfT05fUFJJTUlUSVZFUztcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0luZGV4ZWRPYmplY3QoaXQpLCBrZXkpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBrZXksIGRlc2NyaXB0b3I7XG4gICAgd2hpbGUgKGtleXMubGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywga2V5ID0ga2V5c1tpbmRleCsrXSk7XG4gICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJykuZjtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiAhT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwge1xuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlR2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVHZXRQcm90b3R5cGVPZigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTLCBzaGFtOiAhQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSIH0sIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuXG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlSXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVJc0V4dGVuc2libGUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuaXNleHRlbnNpYmxlXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTIH0sIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gbmF0aXZlSXNFeHRlbnNpYmxlID8gbmF0aXZlSXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlSXNGcm96ZW4gPSBPYmplY3QuaXNGcm96ZW47XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNGcm96ZW4oMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRnJvemVuYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pc2Zyb3plblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7XG4gIGlzRnJvemVuOiBmdW5jdGlvbiBpc0Zyb3plbihpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyBuYXRpdmVJc0Zyb3plbiA/IG5hdGl2ZUlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlSXNTZWFsZWQgPSBPYmplY3QuaXNTZWFsZWQ7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlSXNTZWFsZWQoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzU2VhbGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5pc3NlYWxlZFxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7XG4gIGlzU2VhbGVkOiBmdW5jdGlvbiBpc1NlYWxlZChpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyBuYXRpdmVJc1NlYWxlZCA/IG5hdGl2ZUlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zYW1lLXZhbHVlJyk7XG5cbi8vIGBPYmplY3QuaXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmlzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzOiBpc1xufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUtleXMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwge1xuICBrZXlzOiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXModG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIEZPUkNFRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvdG90eXBlLWFjY2Vzc29ycy1mb3JjZWQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUuX19sb29rdXBHZXR0ZXJfX2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLl9fbG9va3VwR2V0dGVyX19cbmlmIChERVNDUklQVE9SUykge1xuICAkKHsgdGFyZ2V0OiAnT2JqZWN0JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgICBfX2xvb2t1cEdldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cEdldHRlcl9fKFApIHtcbiAgICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgICB2YXIgZGVzYztcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywga2V5KSkgcmV0dXJuIGRlc2MuZ2V0O1xuICAgICAgfSB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBGT1JDRUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3RvdHlwZS1hY2Nlc3NvcnMtZm9yY2VkJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX19gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cFNldHRlcl9fXG5pZiAoREVTQ1JJUFRPUlMpIHtcbiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gICAgX19sb29rdXBTZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyhQKSB7XG4gICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICAgICAgdmFyIGRlc2M7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChkZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIGtleSkpIHJldHVybiBkZXNjLnNldDtcbiAgICAgIH0gd2hpbGUgKE8gPSBnZXRQcm90b3R5cGVPZihPKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIG9uRnJlZXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykub25GcmVlemU7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgbmF0aXZlUHJldmVudEV4dGVuc2lvbnMgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnM7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlUHJldmVudEV4dGVuc2lvbnMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcmV2ZW50ZXh0ZW5zaW9uc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZVByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/IG5hdGl2ZVByZXZlbnRFeHRlbnNpb25zKG9uRnJlZXplKGl0KSkgOiBpdDtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBvbkZyZWV6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLm9uRnJlZXplO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIG5hdGl2ZVNlYWwgPSBPYmplY3Quc2VhbDtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVTZWFsKDEpOyB9KTtcblxuLy8gYE9iamVjdC5zZWFsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5zZWFsXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTLCBzaGFtOiAhRlJFRVpJTkcgfSwge1xuICBzZWFsOiBmdW5jdGlvbiBzZWFsKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZVNlYWwgJiYgaXNPYmplY3QoaXQpID8gbmF0aXZlU2VhbChvbkZyZWV6ZShpdCkpIDogaXQ7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2ZcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgc2V0UHJvdG90eXBlT2Y6IHNldFByb3RvdHlwZU9mXG59KTtcbiIsInZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nJyk7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICghVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gIHJlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR2YWx1ZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5JykudmFsdWVzO1xuXG4vLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QudmFsdWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKE8pIHtcbiAgICByZXR1cm4gJHZhbHVlcyhPKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBwYXJzZUZsb2F0SW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWZsb2F0Jyk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXBhcnNlZmxvYXQtc3RyaW5nXG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHBhcnNlRmxvYXQgIT0gcGFyc2VGbG9hdEltcGxlbWVudGF0aW9uIH0sIHtcbiAgcGFyc2VGbG9hdDogcGFyc2VGbG9hdEltcGxlbWVudGF0aW9uXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhcnNlSW50SW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCcpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHBhcnNlSW50ICE9IHBhcnNlSW50SW1wbGVtZW50YXRpb24gfSwge1xuICBwYXJzZUludDogcGFyc2VJbnRJbXBsZW1lbnRhdGlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFsbFNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1wcm9taXNlLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2UgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICBOYXRpdmVQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIHBhdGNoIG5hdGl2ZSBQcm9taXNlLnByb3RvdHlwZSBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicgJiYgIU5hdGl2ZVByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10pIHtcbiAgcmVkZWZpbmUoTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUsICdmaW5hbGx5JywgZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIE5hdGl2ZVByb21pc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXByb21pc2UtY29uc3RydWN0b3InKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2U7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbnZhciBGT1JDRUQgPSBpc0ZvcmNlZChQUk9NSVNFLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gaW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpICE9PSBTdHJpbmcoUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgaWYgKCFHTE9CQUxfQ09SRV9KU19QUk9NSVNFKSB7XG4gICAgLy8gVjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgaWYgKFY4X1ZFUlNJT04gPT09IDY2KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBVbmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgaWYgKCFJU19OT0RFICYmIHR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gV2UgbmVlZCBQcm9taXNlI2ZpbmFsbHkgaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICFQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlWydmaW5hbGx5J10pIHJldHVybiB0cnVlO1xuICAvLyBXZSBjYW4ndCB1c2UgQEBzcGVjaWVzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuICAvLyBkZW9wdGltaXphdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoVjhfVkVSU0lPTiA+PSA1MSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoUHJvbWlzZUNvbnN0cnVjdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xuICB9O1xuICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gRmFrZVByb21pc2U7XG4gIHJldHVybiAhKHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2UpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gY2hhaW5baW5kZXgrK107XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBwcm9taXNlLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3QodGhpcywgc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkodGhpcywgc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlID09ICdmdW5jdGlvbicpIHtcbiAgICBuYXRpdmVUaGVuID0gTmF0aXZlUHJvbWlzZS5wcm90b3R5cGUudGhlbjtcblxuICAgIC8vIHdyYXAgbmF0aXZlIFByb21pc2UjdGhlbiBmb3IgbmF0aXZlIGFzeW5jIGZ1bmN0aW9uc1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb21pc2UucHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbmF0aXZlVGhlbi5jYWxsKHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG5cbiAgICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICAgIGlmICh0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gZ2V0QnVpbHRJbihQUk9NSVNFKTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIG5hdGl2ZUFwcGx5ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdhcHBseScpO1xudmFyIGZ1bmN0aW9uQXBwbHkgPSBGdW5jdGlvbi5hcHBseTtcblxuLy8gTVMgRWRnZSBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG52YXIgT1BUSU9OQUxfQVJHVU1FTlRTX0xJU1QgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBSZWZsZWN0LmFwcGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuYXBwbHlcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPUFRJT05BTF9BUkdVTUVOVFNfTElTVCB9LCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkge1xuICAgIGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiBuYXRpdmVBcHBseVxuICAgICAgPyBuYXRpdmVBcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbiAgICAgIDogZnVuY3Rpb25BcHBseS5jYWxsKHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgbmF0aXZlQ29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcblxuLy8gYFJlZmxlY3QuY29uc3RydWN0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuY29uc3RydWN0XG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShuYXRpdmVDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xudmFyIEFSR1NfQlVHID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmF0aXZlQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcbnZhciBGT1JDRUQgPSBORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRztcblxuJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCwgc2hhbTogRk9SQ0VEIH0sIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIG5hdGl2ZUNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBNUyBFZGdlIGhhcyBicm9rZW4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSAtIHRocm93aW5nIGluc3RlYWQgb2YgcmV0dXJuaW5nIGZhbHNlXG52YXIgRVJST1JfSU5TVEVBRF9PRl9GQUxTRSA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZGVmaW5lUHJvcGVydHlNb2R1bGUuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pO1xuXG4vLyBgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmRlZmluZXByb3BlcnR5XG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRVJST1JfSU5TVEVBRF9PRl9GQUxTRSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShwcm9wZXJ0eUtleSwgdHJ1ZSk7XG4gICAgYW5PYmplY3QoYXR0cmlidXRlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYodGFyZ2V0LCBrZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xuXG4vLyBgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmRlbGV0ZXByb3BlcnR5XG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24gZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5jb25maWd1cmFibGUgPyBmYWxzZSA6IGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlLZXldO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxuLy8gYFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG4vLyBgUmVmbGVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmdldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgfSwge1xuICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG4gICAgcmV0dXJuIG9iamVjdEdldFByb3RvdHlwZU9mKGFuT2JqZWN0KHRhcmdldCkpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG5cbi8vIGBSZWZsZWN0LmdldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmdldFxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2NyaXB0b3IsIHByb3RvdHlwZTtcbiAgaWYgKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKVxuICAgID8gZGVzY3JpcHRvci52YWx1ZVxuICAgIDogZGVzY3JpcHRvci5nZXQgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogZGVzY3JpcHRvci5nZXQuY2FsbChyZWNlaXZlcik7XG4gIGlmIChpc09iamVjdChwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90b3R5cGUsIHByb3BlcnR5S2V5LCByZWNlaXZlcik7XG59XG5cbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGdldDogZ2V0XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgUmVmbGVjdC5oYXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5oYXNcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gcHJvcGVydHlLZXkgaW4gdGFyZ2V0O1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgb2JqZWN0SXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuLy8gYFJlZmxlY3QuaXNFeHRlbnNpYmxlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuaXNleHRlbnNpYmxlXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiBvYmplY3RJc0V4dGVuc2libGUgPyBvYmplY3RJc0V4dGVuc2libGUodGFyZ2V0KSA6IHRydWU7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xuXG4vLyBgUmVmbGVjdC5vd25LZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3Qub3dua2V5c1xuJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgb3duS2V5czogb3duS2V5c1xufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbi8vIGBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QucHJldmVudGV4dGVuc2lvbnNcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIUZSRUVaSU5HIH0sIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyA9IGdldEJ1aWx0SW4oJ09iamVjdCcsICdwcmV2ZW50RXh0ZW5zaW9ucycpO1xuICAgICAgaWYgKG9iamVjdFByZXZlbnRFeHRlbnNpb25zKSBvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG52YXIgb2JqZWN0U2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxuLy8gYFJlZmxlY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5zZXRwcm90b3R5cGVvZlxuaWYgKG9iamVjdFNldFByb3RvdHlwZU9mKSAkKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICB0cnkge1xuICAgICAgb2JqZWN0U2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG4vLyBgUmVmbGVjdC5zZXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5zZXRcbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM107XG4gIHZhciBvd25EZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB2YXIgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90b3R5cGU7XG4gIGlmICghb3duRGVzY3JpcHRvcikge1xuICAgIGlmIChpc09iamVjdChwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90b3R5cGUsIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7XG4gICAgfVxuICAgIG93bkRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjcmlwdG9yLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjcmlwdG9yLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgIGlmIChleGlzdGluZ0Rlc2NyaXB0b3IuZ2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci5zZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLndyaXRhYmxlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZXhpc3RpbmdEZXNjcmlwdG9yLnZhbHVlID0gVjtcbiAgICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBleGlzdGluZ0Rlc2NyaXB0b3IpO1xuICAgIH0gZWxzZSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIFYpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3duRGVzY3JpcHRvci5zZXQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogKG93bkRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIFYpLCB0cnVlKTtcbn1cblxuLy8gTVMgRWRnZSAxNy0xOCBSZWZsZWN0LnNldCBhbGxvd3Mgc2V0dGluZyB0aGUgcHJvcGVydHkgdG8gb2JqZWN0XG4vLyB3aXRoIG5vbi13cml0YWJsZSBwcm9wZXJ0eSBvbiB0aGUgcHJvdG90eXBlXG52YXIgTVNfRURHRV9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmplY3QgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHt9LCAnYScsIHsgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuIFJlZmxlY3Quc2V0KGdldFByb3RvdHlwZU9mKG9iamVjdCksICdhJywgMSwgb2JqZWN0KSAhPT0gZmFsc2U7XG59KTtcblxuJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE1TX0VER0VfQlVHIH0sIHtcbiAgc2V0OiBzZXRcbn0pO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJykuZjtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcbnZhciBnZXRGbGFncyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MnKTtcbnZhciBzdGlja3lIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuc2V0O1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xudmFyIE5hdGl2ZVJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gTmF0aXZlUmVnRXhwLnByb3RvdHlwZTtcbnZhciByZTEgPSAvYS9nO1xudmFyIHJlMiA9IC9hL2c7XG5cbi8vIFwibmV3XCIgc2hvdWxkIGNyZWF0ZSBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgTmF0aXZlUmVnRXhwKHJlMSkgIT09IHJlMTtcblxudmFyIFVOU1VQUE9SVEVEX1kgPSBzdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1k7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBpc0ZvcmNlZCgnUmVnRXhwJywgKCFDT1JSRUNUX05FVyB8fCBVTlNVUFBPUlRFRF9ZIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmUyW01BVENIXSA9IGZhbHNlO1xuICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICByZXR1cm4gTmF0aXZlUmVnRXhwKHJlMSkgIT0gcmUxIHx8IE5hdGl2ZVJlZ0V4cChyZTIpID09IHJlMiB8fCBOYXRpdmVSZWdFeHAocmUxLCAnaScpICE9ICcvYS9pJztcbn0pKSk7XG5cbi8vIGBSZWdFeHBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAtY29uc3RydWN0b3JcbmlmIChGT1JDRUQpIHtcbiAgdmFyIFJlZ0V4cFdyYXBwZXIgPSBmdW5jdGlvbiBSZWdFeHAocGF0dGVybiwgZmxhZ3MpIHtcbiAgICB2YXIgdGhpc0lzUmVnRXhwID0gdGhpcyBpbnN0YW5jZW9mIFJlZ0V4cFdyYXBwZXI7XG4gICAgdmFyIHBhdHRlcm5Jc1JlZ0V4cCA9IGlzUmVnRXhwKHBhdHRlcm4pO1xuICAgIHZhciBmbGFnc0FyZVVuZGVmaW5lZCA9IGZsYWdzID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIHN0aWNreTtcblxuICAgIGlmICghdGhpc0lzUmVnRXhwICYmIHBhdHRlcm5Jc1JlZ0V4cCAmJiBwYXR0ZXJuLmNvbnN0cnVjdG9yID09PSBSZWdFeHBXcmFwcGVyICYmIGZsYWdzQXJlVW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG5cbiAgICBpZiAoQ09SUkVDVF9ORVcpIHtcbiAgICAgIGlmIChwYXR0ZXJuSXNSZWdFeHAgJiYgIWZsYWdzQXJlVW5kZWZpbmVkKSBwYXR0ZXJuID0gcGF0dGVybi5zb3VyY2U7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwV3JhcHBlcikge1xuICAgICAgaWYgKGZsYWdzQXJlVW5kZWZpbmVkKSBmbGFncyA9IGdldEZsYWdzLmNhbGwocGF0dGVybik7XG4gICAgICBwYXR0ZXJuID0gcGF0dGVybi5zb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKFVOU1VQUE9SVEVEX1kpIHtcbiAgICAgIHN0aWNreSA9ICEhZmxhZ3MgJiYgZmxhZ3MuaW5kZXhPZigneScpID4gLTE7XG4gICAgICBpZiAoc3RpY2t5KSBmbGFncyA9IGZsYWdzLnJlcGxhY2UoL3kvZywgJycpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBpbmhlcml0SWZSZXF1aXJlZChcbiAgICAgIENPUlJFQ1RfTkVXID8gbmV3IE5hdGl2ZVJlZ0V4cChwYXR0ZXJuLCBmbGFncykgOiBOYXRpdmVSZWdFeHAocGF0dGVybiwgZmxhZ3MpLFxuICAgICAgdGhpc0lzUmVnRXhwID8gdGhpcyA6IFJlZ0V4cFByb3RvdHlwZSxcbiAgICAgIFJlZ0V4cFdyYXBwZXJcbiAgICApO1xuXG4gICAgaWYgKFVOU1VQUE9SVEVEX1kgJiYgc3RpY2t5KSBzZXRJbnRlcm5hbFN0YXRlKHJlc3VsdCwgeyBzdGlja3k6IHN0aWNreSB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkgaW4gUmVnRXhwV3JhcHBlciB8fCBkZWZpbmVQcm9wZXJ0eShSZWdFeHBXcmFwcGVyLCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTmF0aXZlUmVnRXhwW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBOYXRpdmVSZWdFeHBba2V5XSA9IGl0OyB9XG4gICAgfSk7XG4gIH07XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVSZWdFeHApO1xuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpbmRleCkgcHJveHkoa2V5c1tpbmRleCsrXSk7XG4gIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7XG4gIFJlZ0V4cFdyYXBwZXIucHJvdG90eXBlID0gUmVnRXhwUHJvdG90eXBlO1xuICByZWRlZmluZShnbG9iYWwsICdSZWdFeHAnLCBSZWdFeHBXcmFwcGVyKTtcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC1AQHNwZWNpZXNcbnNldFNwZWNpZXMoJ1JlZ0V4cCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYycpO1xuXG4kKHsgdGFyZ2V0OiAnUmVnRXhwJywgcHJvdG86IHRydWUsIGZvcmNlZDogLy4vLmV4ZWMgIT09IGV4ZWMgfSwge1xuICBleGVjOiBleGVjXG59KTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIG9iamVjdERlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciByZWdFeHBGbGFncyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MnKTtcbnZhciBVTlNVUFBPUlRFRF9ZID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycycpLlVOU1VQUE9SVEVEX1k7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoREVTQ1JJUFRPUlMgJiYgKC8uL2cuZmxhZ3MgIT0gJ2cnIHx8IFVOU1VQUE9SVEVEX1kpKSB7XG4gIG9iamVjdERlZmluZVByb3BlcnR5TW9kdWxlLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IHJlZ0V4cEZsYWdzXG4gIH0pO1xufVxuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgVU5TVVBQT1JURURfWSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMnKS5VTlNVUFBPUlRFRF9ZO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGdldEludGVybmFsU3RhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKS5nZXQ7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuc3RpY2t5YCBnZXR0ZXJcbmlmIChERVNDUklQVE9SUyAmJiBVTlNVUFBPUlRFRF9ZKSB7XG4gIGRlZmluZVByb3BlcnR5KFJlZ0V4cC5wcm90b3R5cGUsICdzdGlja3knLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMgPT09IFJlZ0V4cFByb3RvdHlwZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIC8vIFdlIGNhbid0IHVzZSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvciBiZWNhdXNlXG4gICAgICAvLyB3ZSBkb24ndCBhZGQgbWV0YWRhdGEgZm9yIHJlZ2V4cHMgY3JlYXRlZCBieSBhIGxpdGVyYWwuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gISFnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnN0aWNreTtcbiAgICAgIH1cbiAgICAgIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBSZWdFeHAgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBtb3ZlZCB0byBlbnRyeSBwb2ludHNcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMnKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gIHZhciByZSA9IC9bYWNdLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBleGVjQ2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gLy4vLmV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgcmV0dXJuIHJlLnRlc3QoJ2FiYycpID09PSB0cnVlICYmIGV4ZWNDYWxsZWQ7XG59KCk7XG5cbnZhciBuYXRpdmVUZXN0ID0gLy4vLnRlc3Q7XG5cbiQoeyB0YXJnZXQ6ICdSZWdFeHAnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhREVMRUdBVEVTX1RPX0VYRUMgfSwge1xuICB0ZXN0OiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmV4ZWMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuYXRpdmVUZXN0LmNhbGwodGhpcywgc3RyKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZXhlYyhzdHIpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgIWlzT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7XG4gICAgfVxuICAgIHJldHVybiAhIXJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGZsYWdzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncycpO1xuXG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciBSZWdFeHBQcm90b3R5cGUgPSBSZWdFeHAucHJvdG90eXBlO1xudmFyIG5hdGl2ZVRvU3RyaW5nID0gUmVnRXhwUHJvdG90eXBlW1RPX1NUUklOR107XG5cbnZhciBOT1RfR0VORVJJQyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZVRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSAhPSAnL2EvYic7IH0pO1xuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcbnZhciBJTkNPUlJFQ1RfTkFNRSA9IG5hdGl2ZVRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoTk9UX0dFTkVSSUMgfHwgSU5DT1JSRUNUX05BTUUpIHtcbiAgcmVkZWZpbmUoUmVnRXhwLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwID0gU3RyaW5nKFIuc291cmNlKTtcbiAgICB2YXIgcmYgPSBSLmZsYWdzO1xuICAgIHZhciBmID0gU3RyaW5nKHJmID09PSB1bmRlZmluZWQgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlKSA/IGZsYWdzLmNhbGwoUikgOiByZik7XG4gICAgcmV0dXJuICcvJyArIHAgKyAnLycgKyBmO1xuICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBTZXRgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zZXQtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmFuY2hvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmFuY2hvclxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2FuY2hvcicpIH0sIHtcbiAgYW5jaG9yOiBmdW5jdGlvbiBhbmNob3IobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctaHRtbC1mb3JjZWQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYmlnYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuYmlnXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnYmlnJykgfSwge1xuICBiaWc6IGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctaHRtbC1mb3JjZWQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYmxpbmtgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5ibGlua1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2JsaW5rJykgfSwge1xuICBibGluazogZnVuY3Rpb24gYmxpbmsoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctaHRtbC1mb3JjZWQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuYm9sZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmJvbGRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdib2xkJykgfSwge1xuICBib2xkOiBmdW5jdGlvbiBib2xkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdiJywgJycsICcnKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjb2RlQXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpLmNvZGVBdDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5jb2RlcG9pbnRhdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiBjb2RlQXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBuYXRpdmVFbmRzV2l0aCA9ICcnLmVuZHNXaXRoO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnZW5kc1dpdGgnKTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3B1bGwvNzAyXG52YXIgTUROX1BPTFlGSUxMX0JVRyA9ICFJU19QVVJFICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyAmJiAhIWZ1bmN0aW9uICgpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSwgJ2VuZHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmVuZHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLykge1xuICAgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpO1xuICAgIHZhciBlbmQgPSBlbmRQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gbGVuIDogbWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuIG5hdGl2ZUVuZHNXaXRoXG4gICAgICA/IG5hdGl2ZUVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1odG1sLWZvcmNlZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5maXhlZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmZpeGVkXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnZml4ZWQnKSB9LCB7XG4gIGZpeGVkOiBmdW5jdGlvbiBmaXhlZCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAndHQnLCAnJywgJycpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1odG1sLWZvcmNlZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3JcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250Y29sb3InKSB9LCB7XG4gIGZvbnRjb2xvcjogZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuZm9udHNpemVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kKCdmb250c2l6ZScpIH0sIHtcbiAgZm9udHNpemU6IGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG5cbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIG5hdGl2ZUZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxudmFyIElOQ09SUkVDVF9MRU5HVEggPSAhIW5hdGl2ZUZyb21Db2RlUG9pbnQgJiYgbmF0aXZlRnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMTtcblxuLy8gYFN0cmluZy5mcm9tQ29kZVBvaW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5mcm9tY29kZXBvaW50XG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfTEVOR1RIIH0sIHtcbiAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludCh4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGNvZGU7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGkpIHtcbiAgICAgIGNvZGUgPSArYXJndW1lbnRzW2krK107XG4gICAgICBpZiAodG9BYnNvbHV0ZUluZGV4KGNvZGUsIDB4MTBGRkZGKSAhPT0gY29kZSkgdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICBlbGVtZW50cy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsIGNvZGUgJSAweDQwMCArIDB4REMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gZWxlbWVudHMuam9pbignJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhflN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKVxuICAgICAgLmluZGV4T2Yobm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLml0YWxpY3NgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pdGFsaWNzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCgnaXRhbGljcycpIH0sIHtcbiAgaXRhbGljczogZnVuY3Rpb24gaXRhbGljcygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUhUTUwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWh0bWwnKTtcbnZhciBmb3JjZWRTdHJpbmdIVE1MTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1odG1sLWZvcmNlZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5saW5rYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubGlua1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ2xpbmsnKSB9LCB7XG4gIGxpbms6IGZ1bmN0aW9uIGxpbmsodXJsKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnaHJlZicsIHVybCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xudmFyIGdldFJlZ0V4cEZsYWdzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgTUFUQ0hfQUxMID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaEFsbCcpO1xudmFyIFJFR0VYUF9TVFJJTkcgPSAnUmVnRXhwIFN0cmluZyc7XG52YXIgUkVHRVhQX1NUUklOR19JVEVSQVRPUiA9IFJFR0VYUF9TVFJJTkcgKyAnIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IpO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmVnRXhwQnVpbHRpbkV4ZWMgPSBSZWdFeHBQcm90b3R5cGUuZXhlYztcbnZhciBuYXRpdmVNYXRjaEFsbCA9ICcnLm1hdGNoQWxsO1xuXG52YXIgV09SS1NfV0lUSF9OT05fR0xPQkFMX1JFR0VYID0gISFuYXRpdmVNYXRjaEFsbCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAnYScubWF0Y2hBbGwoLy4vKTtcbn0pO1xuXG52YXIgcmVnRXhwRXhlYyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICB2YXIgcmVzdWx0O1xuICBpZiAodHlwZW9mIGV4ZWMgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlc3VsdCA9IGV4ZWMuY2FsbChSLCBTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPSAnb2JqZWN0JykgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgZXhlYyByZXN1bHQnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiByZWdFeHBCdWlsdGluRXhlYy5jYWxsKFIsIFMpO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbnZhciAkUmVnRXhwU3RyaW5nSXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKHJlZ2V4cCwgc3RyaW5nLCBnbG9iYWwsIGZ1bGxVbmljb2RlKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFJFR0VYUF9TVFJJTkdfSVRFUkFUT1IsXG4gICAgcmVnZXhwOiByZWdleHAsXG4gICAgc3RyaW5nOiBzdHJpbmcsXG4gICAgZ2xvYmFsOiBnbG9iYWwsXG4gICAgdW5pY29kZTogZnVsbFVuaWNvZGUsXG4gICAgZG9uZTogZmFsc2VcbiAgfSk7XG59LCBSRUdFWFBfU1RSSU5HLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB2YXIgUiA9IHN0YXRlLnJlZ2V4cDtcbiAgdmFyIFMgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBtYXRjaCA9IHJlZ0V4cEV4ZWMoUiwgUyk7XG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogc3RhdGUuZG9uZSA9IHRydWUgfTtcbiAgaWYgKHN0YXRlLmdsb2JhbCkge1xuICAgIGlmIChTdHJpbmcobWF0Y2hbMF0pID09ICcnKSBSLmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChSLmxhc3RJbmRleCksIHN0YXRlLnVuaWNvZGUpO1xuICAgIHJldHVybiB7IHZhbHVlOiBtYXRjaCwgZG9uZTogZmFsc2UgfTtcbiAgfVxuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgcmV0dXJuIHsgdmFsdWU6IG1hdGNoLCBkb25lOiBmYWxzZSB9O1xufSk7XG5cbnZhciAkbWF0Y2hBbGwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciBTID0gU3RyaW5nKHN0cmluZyk7XG4gIHZhciBDLCBmbGFnc1ZhbHVlLCBmbGFncywgbWF0Y2hlciwgZ2xvYmFsLCBmdWxsVW5pY29kZTtcbiAgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihSLCBSZWdFeHApO1xuICBmbGFnc1ZhbHVlID0gUi5mbGFncztcbiAgaWYgKGZsYWdzVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBSIGluc3RhbmNlb2YgUmVnRXhwICYmICEoJ2ZsYWdzJyBpbiBSZWdFeHBQcm90b3R5cGUpKSB7XG4gICAgZmxhZ3NWYWx1ZSA9IGdldFJlZ0V4cEZsYWdzLmNhbGwoUik7XG4gIH1cbiAgZmxhZ3MgPSBmbGFnc1ZhbHVlID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhmbGFnc1ZhbHVlKTtcbiAgbWF0Y2hlciA9IG5ldyBDKEMgPT09IFJlZ0V4cCA/IFIuc291cmNlIDogUiwgZmxhZ3MpO1xuICBnbG9iYWwgPSAhIX5mbGFncy5pbmRleE9mKCdnJyk7XG4gIGZ1bGxVbmljb2RlID0gISF+ZmxhZ3MuaW5kZXhPZigndScpO1xuICBtYXRjaGVyLmxhc3RJbmRleCA9IHRvTGVuZ3RoKFIubGFzdEluZGV4KTtcbiAgcmV0dXJuIG5ldyAkUmVnRXhwU3RyaW5nSXRlcmF0b3IobWF0Y2hlciwgUywgZ2xvYmFsLCBmdWxsVW5pY29kZSk7XG59O1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaEFsbGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctbWF0Y2hhbGxcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXT1JLU19XSVRIX05PTl9HTE9CQUxfUkVHRVggfSwge1xuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBmbGFncywgUywgbWF0Y2hlciwgcng7XG4gICAgaWYgKHJlZ2V4cCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNSZWdFeHAocmVnZXhwKSkge1xuICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlXG4gICAgICAgICAgPyByZWdleHAuZmxhZ3NcbiAgICAgICAgICA6IGdldFJlZ0V4cEZsYWdzLmNhbGwocmVnZXhwKVxuICAgICAgICApKTtcbiAgICAgICAgaWYgKCF+ZmxhZ3MuaW5kZXhPZignZycpKSB0aHJvdyBUeXBlRXJyb3IoJ2AubWF0Y2hBbGxgIGRvZXMgbm90IGFsbG93IG5vbi1nbG9iYWwgcmVnZXhlcycpO1xuICAgICAgfVxuICAgICAgaWYgKFdPUktTX1dJVEhfTk9OX0dMT0JBTF9SRUdFWCkgcmV0dXJuIG5hdGl2ZU1hdGNoQWxsLmFwcGx5KE8sIGFyZ3VtZW50cyk7XG4gICAgICBtYXRjaGVyID0gcmVnZXhwW01BVENIX0FMTF07XG4gICAgICBpZiAobWF0Y2hlciA9PT0gdW5kZWZpbmVkICYmIElTX1BVUkUgJiYgY2xhc3NvZihyZWdleHApID09ICdSZWdFeHAnKSBtYXRjaGVyID0gJG1hdGNoQWxsO1xuICAgICAgaWYgKG1hdGNoZXIgIT0gbnVsbCkgcmV0dXJuIGFGdW5jdGlvbihtYXRjaGVyKS5jYWxsKHJlZ2V4cCwgTyk7XG4gICAgfSBlbHNlIGlmIChXT1JLU19XSVRIX05PTl9HTE9CQUxfUkVHRVgpIHJldHVybiBuYXRpdmVNYXRjaEFsbC5hcHBseShPLCBhcmd1bWVudHMpO1xuICAgIFMgPSBTdHJpbmcoTyk7XG4gICAgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cCwgJ2cnKTtcbiAgICByZXR1cm4gSVNfUFVSRSA/ICRtYXRjaEFsbC5jYWxsKHJ4LCBTKSA6IHJ4W01BVENIX0FMTF0oUyk7XG4gIH1cbn0pO1xuXG5JU19QVVJFIHx8IE1BVENIX0FMTCBpbiBSZWdFeHBQcm90b3R5cGUgfHwgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFJlZ0V4cFByb3RvdHlwZSwgTUFUQ0hfQUxMLCAkbWF0Y2hBbGwpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBtYXRjaCBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ21hdGNoJywgMSwgZnVuY3Rpb24gKE1BVENILCBuYXRpdmVNYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgICByZXR1cm4gbWF0Y2hlciAhPT0gdW5kZWZpbmVkID8gbWF0Y2hlci5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQG1hdGNoXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNYXRjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuXG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIEFbbl0gPSBtYXRjaFN0cjtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgICAgbisrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gPT09IDAgPyBudWxsIDogQTtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRwYWRFbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXBhZCcpLmVuZDtcbnZhciBXRUJLSVRfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQtd2Via2l0LWJ1ZycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRlbmRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBXRUJLSVRfQlVHIH0sIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkRW5kKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRwYWRTdGFydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkJykuc3RhcnQ7XG52YXIgV0VCS0lUX0JVRyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkLXdlYmtpdC1idWcnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFdFQktJVF9CVUcgfSwge1xuICBwYWRTdGFydDogZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkU3RhcnQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBTdHJpbmcucmF3YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5yYXdcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBzdGF0OiB0cnVlIH0sIHtcbiAgcmF3OiBmdW5jdGlvbiByYXcodGVtcGxhdGUpIHtcbiAgICB2YXIgcmF3VGVtcGxhdGUgPSB0b0luZGV4ZWRPYmplY3QodGVtcGxhdGUucmF3KTtcbiAgICB2YXIgbGl0ZXJhbFNlZ21lbnRzID0gdG9MZW5ndGgocmF3VGVtcGxhdGUubGVuZ3RoKTtcbiAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxpdGVyYWxTZWdtZW50cyA+IGkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goU3RyaW5nKHJhd1RlbXBsYXRlW2krK10pKTtcbiAgICAgIGlmIChpIDwgYXJndW1lbnRzTGVuZ3RoKSBlbGVtZW50cy5wdXNoKFN0cmluZyhhcmd1bWVudHNbaV0pKTtcbiAgICB9IHJldHVybiBlbGVtZW50cy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7XG4gIHJlcGVhdDogcmVwZWF0XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MUyA9IC9cXCQoWyQmJ2BdfFxcZFxcZD98PFtePl0qPikvZztcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCA9IC9cXCQoWyQmJ2BdfFxcZFxcZD8pL2c7XG5cbnZhciBtYXliZVRvU3RyaW5nID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxuLy8gQEByZXBsYWNlIGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChSRVBMQUNFLCBuYXRpdmVSZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUsIHJlYXNvbikge1xuICB2YXIgUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkUgPSByZWFzb24uUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkU7XG4gIHZhciBSRVBMQUNFX0tFRVBTXyQwID0gcmVhc29uLlJFUExBQ0VfS0VFUFNfJDA7XG4gIHZhciBVTlNBRkVfU1VCU1RJVFVURSA9IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID8gJyQnIDogJyQwJztcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgdmFyIHJlcGxhY2VyID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHJlcGxhY2VyLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBuYXRpdmVSZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghUkVHRVhQX1JFUExBQ0VfU1VCU1RJVFVURVNfVU5ERUZJTkVEX0NBUFRVUkUgJiYgUkVQTEFDRV9LRUVQU18kMCkgfHxcbiAgICAgICAgKHR5cGVvZiByZXBsYWNlVmFsdWUgPT09ICdzdHJpbmcnICYmIHJlcGxhY2VWYWx1ZS5pbmRleE9mKFVOU0FGRV9TVUJTVElUVVRFKSA9PT0gLTEpXG4gICAgICApIHtcbiAgICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVSZXBsYWNlLCByZWdleHAsIHRoaXMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgIHZhciBuZXh0U291cmNlUG9zaXRpb24gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uXG4gIGZ1bmN0aW9uIGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7XG4gICAgdmFyIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtcbiAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7XG4gICAgICBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFM7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBzYW1lVmFsdWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2FtZS12YWx1ZScpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBzZWFyY2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoU0VBUkNILCBuYXRpdmVTZWFyY2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNlYXJjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zZWFyY2hcbiAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc2VhcmNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgICByZXR1cm4gc2VhcmNoZXIgIT09IHVuZGVmaW5lZCA/IHNlYXJjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZVNlYXJjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuXG4gICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShwcmV2aW91c0xhc3RJbmRleCwgMCkpIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gLTEgOiByZXN1bHQuaW5kZXg7XG4gICAgfVxuICBdO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVIVE1MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1odG1sJyk7XG52YXIgZm9yY2VkU3RyaW5nSFRNTE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctaHRtbC1mb3JjZWQnKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc21hbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zbWFsbFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3NtYWxsJykgfSwge1xuICBzbWFsbDogZnVuY3Rpb24gc21hbGwoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3NtYWxsJywgJycsICcnKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjYWxsUmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG52YXIgYXJyYXlQdXNoID0gW10ucHVzaDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBNQVhfVUlOVDMyID0gMHhGRkZGRkZGRjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgcmV0dXJuICFSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChTUExJVCwgbmF0aXZlU3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJy5zcGxpdCgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0Jy5zcGxpdCgvKD86KS8sIC0xKS5sZW5ndGggIT0gNCB8fFxuICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fFxuICAgICcuJy5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGggIT0gNCB8fFxuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiBbc3RyaW5nXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHkubGFzdEluZGV4O1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXJyYXlQdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gbGltID8gb3V0cHV0LnNsaWNlKDAsIGxpbSkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJy5zcGxpdCh1bmRlZmluZWQsIDApLmxlbmd0aCkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBuYXRpdmVTcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7XG5cbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zcGxpdGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgIGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzcGxpdHRlci5jYWxsKHNlcGFyYXRvciwgTywgbGltaXQpXG4gICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIGVuZ2luZXMgdGhhdCBkb24ndCBzdXBwb3J0XG4gICAgLy8gdGhlICd5JyBmbGFnLlxuICAgIGZ1bmN0aW9uIChyZWdleHAsIGxpbWl0KSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJlZ2V4cCwgdGhpcywgbGltaXQsIGludGVybmFsU3BsaXQgIT09IG5hdGl2ZVNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0sICFTVVBQT1JUU19ZKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN0YXJ0c3dpdGhcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhTUROX1BPTFlGSUxMX0JVRyAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN0cmlrZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN0cmlrZVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N0cmlrZScpIH0sIHtcbiAgc3RyaWtlOiBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN1YmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN1YlxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1YicpIH0sIHtcbiAgc3ViOiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSFRNTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaHRtbCcpO1xudmFyIGZvcmNlZFN0cmluZ0hUTUxNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWh0bWwtZm9yY2VkJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN1cGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnN1cFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ0hUTUxNZXRob2QoJ3N1cCcpIH0sIHtcbiAgc3VwOiBmdW5jdGlvbiBzdXAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1cCcsICcnLCAnJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHRyaW1FbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS5lbmQ7XG52YXIgZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQnKTtcblxudmFyIEZPUkNFRCA9IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW1FbmQnKTtcblxudmFyIHRyaW1FbmQgPSBGT1JDRUQgPyBmdW5jdGlvbiB0cmltRW5kKCkge1xuICByZXR1cm4gJHRyaW1FbmQodGhpcyk7XG59IDogJycudHJpbUVuZDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltRW5kLCB0cmltUmlnaHQgfWAgbWV0aG9kc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdHJpbUVuZDogdHJpbUVuZCxcbiAgdHJpbVJpZ2h0OiB0cmltRW5kXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR0cmltU3RhcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS5zdGFydDtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCcpO1xuXG52YXIgRk9SQ0VEID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbVN0YXJ0Jyk7XG5cbnZhciB0cmltU3RhcnQgPSBGT1JDRUQgPyBmdW5jdGlvbiB0cmltU3RhcnQoKSB7XG4gIHJldHVybiAkdHJpbVN0YXJ0KHRoaXMpO1xufSA6ICcnLnRyaW1TdGFydDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltU3RhcnQsIHRyaW1MZWZ0IH1gIG1ldGhvZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHRyaW1TdGFydDogdHJpbVN0YXJ0LFxuICB0cmltTGVmdDogdHJpbVN0YXJ0XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7XG4gIHRyaW06IGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMpO1xuICB9XG59KTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuYXN5bmNJdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2FzeW5jSXRlcmF0b3InKTtcbiIsIi8vIGBTeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cbid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcblxuaWYgKERFU0NSSVBUT1JTICYmIHR5cGVvZiBOYXRpdmVTeW1ib2wgPT0gJ2Z1bmN0aW9uJyAmJiAoISgnZGVzY3JpcHRpb24nIGluIE5hdGl2ZVN5bWJvbC5wcm90b3R5cGUpIHx8XG4gIC8vIFNhZmFyaSAxMiBidWdcbiAgTmF0aXZlU3ltYm9sKCkuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZFxuKSkge1xuICB2YXIgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlID0ge307XG4gIC8vIHdyYXAgU3ltYm9sIGNvbnN0cnVjdG9yIGZvciBjb3JyZWN0IHdvcmsgd2l0aCB1bmRlZmluZWQgZGVzY3JpcHRpb25cbiAgdmFyIFN5bWJvbFdyYXBwZXIgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcyBpbnN0YW5jZW9mIFN5bWJvbFdyYXBwZXJcbiAgICAgID8gbmV3IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbilcbiAgICAgIC8vIGluIEVkZ2UgMTMsIFN0cmluZyhTeW1ib2wodW5kZWZpbmVkKSkgPT09ICdTeW1ib2wodW5kZWZpbmVkKSdcbiAgICAgIDogZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/IE5hdGl2ZVN5bWJvbCgpIDogTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKTtcbiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmVbcmVzdWx0XSA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhTeW1ib2xXcmFwcGVyLCBOYXRpdmVTeW1ib2wpO1xuICB2YXIgc3ltYm9sUHJvdG90eXBlID0gU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wucHJvdG90eXBlO1xuICBzeW1ib2xQcm90b3R5cGUuY29uc3RydWN0b3IgPSBTeW1ib2xXcmFwcGVyO1xuXG4gIHZhciBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIG5hdGl2ZSA9IFN0cmluZyhOYXRpdmVTeW1ib2woJ3Rlc3QnKSkgPT0gJ1N5bWJvbCh0ZXN0KSc7XG4gIHZhciByZWdleHAgPSAvXlN5bWJvbFxcKCguKilcXClbXildKyQvO1xuICBkZWZpbmVQcm9wZXJ0eShzeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSBpc09iamVjdCh0aGlzKSA/IHRoaXMudmFsdWVPZigpIDogdGhpcztcbiAgICAgIHZhciBzdHJpbmcgPSBzeW1ib2xUb1N0cmluZy5jYWxsKHN5bWJvbCk7XG4gICAgICBpZiAoaGFzKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIGRlc2MgPSBuYXRpdmUgPyBzdHJpbmcuc2xpY2UoNywgLTEpIDogc3RyaW5nLnJlcGxhY2UocmVnZXhwLCAnJDEnKTtcbiAgICAgIHJldHVybiBkZXNjID09PSAnJyA/IHVuZGVmaW5lZCA6IGRlc2M7XG4gICAgfVxuICB9KTtcblxuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaGFzSW5zdGFuY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG52YXIgVVNFX1NZTUJPTF9BU19VSUQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG52YXIgSElEREVOID0gc2hhcmVkS2V5KCdoaWRkZW4nKTtcbnZhciBTWU1CT0wgPSAnU3ltYm9sJztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdFtQUk9UT1RZUEVdO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpO1xudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0Q3JlYXRlKG5hdGl2ZURlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIHZhciBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgUCk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKSBkZWxldGUgT2JqZWN0UHJvdG90eXBlW1BdO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgTyAhPT0gT2JqZWN0UHJvdG90eXBlKSB7XG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoT2JqZWN0UHJvdG90eXBlLCBQLCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufSA6IG5hdGl2ZURlZmluZVByb3BlcnR5O1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7XG4gIHZhciBzeW1ib2wgPSBBbGxTeW1ib2xzW3RhZ10gPSBuYXRpdmVPYmplY3RDcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHtcbiAgICB0eXBlOiBTWU1CT0wsXG4gICAgdGFnOiB0YWcsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gIH0pO1xuICBpZiAoIURFU0NSSVBUT1JTKSBzeW1ib2wuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgcmV0dXJuIHN5bWJvbDtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoaXQpIGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghQXR0cmlidXRlcy5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhPLCBISURERU4pKSBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB7fSkpO1xuICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pIE9bSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7XG4gIH0gcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIGtleSwgQXR0cmlidXRlcyk7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMocHJvcGVydGllcykuY29uY2F0KCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcGVydGllcykpO1xuICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFERVNDUklQVE9SUyB8fCAkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChwcm9wZXJ0aWVzLCBrZXkpKSAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyBuYXRpdmVPYmplY3RDcmVhdGUoTykgOiAkZGVmaW5lUHJvcGVydGllcyhuYXRpdmVPYmplY3RDcmVhdGUoTyksIFByb3BlcnRpZXMpO1xufTtcblxudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIFAgPSB0b1ByaW1pdGl2ZShWLCB0cnVlKTtcbiAgdmFyIGVudW1lcmFibGUgPSBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRoaXMsIFApO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBQKSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnVtZXJhYmxlIHx8ICFoYXModGhpcywgUCkgfHwgIWhhcyhBbGxTeW1ib2xzLCBQKSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1bUF0gPyBlbnVtZXJhYmxlIDogdHJ1ZTtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT2JqZWN0UHJvdG90eXBlU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgZGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbiAgaWYgKGRlc2NyaXB0b3IgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkge1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRlc2NyaXB0b3I7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyh0b0luZGV4ZWRPYmplY3QoTykpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRmb3JFYWNoKG5hbWVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKGhpZGRlbktleXMsIGtleSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTykge1xuICB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhcyhPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7XG4gICAgICByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLWNvbnN0cnVjdG9yXG5pZiAoIU5BVElWRV9TWU1CT0wpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gIWFyZ3VtZW50cy5sZW5ndGggfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG5cbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7XG4gIH0pO1xuXG4gIHJlZGVmaW5lKCRTeW1ib2wsICd3aXRob3V0U2V0dGVyJywgZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIHdyYXAodWlkKGRlc2NyaXB0aW9uKSwgZGVzY3JpcHRpb24pO1xuICB9KTtcblxuICBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gJGRlZmluZVByb3BlcnR5O1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgbmF0aXZlRGVmaW5lUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCAnZGVzY3JpcHRpb24nLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5kZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIUlTX1BVUkUpIHtcbiAgICAgIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwge1xuICBTeW1ib2w6ICRTeW1ib2xcbn0pO1xuXG4kZm9yRWFjaChvYmplY3RLZXlzKFdlbGxLbm93blN5bWJvbHNTdG9yZSksIGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiBTWU1CT0wsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wgfSwge1xuICAvLyBgU3ltYm9sLmZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5mb3JcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc3RyaW5nID0gU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhcyhTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKHN0cmluZyk7XG4gICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sO1xuICAgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZztcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9LFxuICAvLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5rZXlmb3JcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBpZiAoaGFzKFN5bWJvbFRvU3RyaW5nUmVnaXN0cnksIHN5bSkpIHJldHVybiBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bV07XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSBmYWxzZTsgfVxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBmYWlscyhmdW5jdGlvbiAoKSB7IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKDEpOyB9KSB9LCB7XG4gIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gICAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuXG4vLyBgSlNPTi5zdHJpbmdpZnlgIG1ldGhvZCBiZWhhdmlvciB3aXRoIHN5bWJvbHNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24uc3RyaW5naWZ5XG5pZiAoJHN0cmluZ2lmeSkge1xuICB2YXIgRk9SQ0VEX0pTT05fU1RSSU5HSUZZID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzeW1ib2wgPSAkU3ltYm9sKCk7XG4gICAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT0gJ1tudWxsXSdcbiAgICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPSAne30nXG4gICAgICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICAgICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9JztcbiAgfSk7XG5cbiAgJCh7IHRhcmdldDogJ0pTT04nLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9KU09OX1NUUklOR0lGWSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIHZhciAkcmVwbGFjZXI7XG4gICAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGluZGV4KSBhcmdzLnB1c2goYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICAgICRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICAgIHJldHVybiAkc3RyaW5naWZ5LmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuaWYgKCEkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbn1cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCBTWU1CT0wpO1xuXG5oaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlO1xuIiwidmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxuLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2xcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5yZXBsYWNlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc2VhcmNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzZWFyY2gnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BsaXRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc3BsaXQnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9QcmltaXRpdmVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9zdHJpbmd0YWdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkY29weVdpdGhpbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1jb3B5LXdpdGhpbicpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmNvcHlXaXRoaW5gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5jb3B5d2l0aGluXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdjb3B5V2l0aGluJywgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qICwgZW5kICovKSB7XG4gIHJldHVybiAkY29weVdpdGhpbi5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZXZlcnk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5ldmVyeVxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZXZlcnknLCBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGV2ZXJ5KGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkZmlsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1maWxsJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbGxcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsbCcsIGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7XG4gIHJldHVybiAkZmlsbC5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmlsdGVyO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5maWx0ZXJcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2ZpbHRlcicsIGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICB2YXIgbGlzdCA9ICRmaWx0ZXIoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IG5ldyAoYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKSkobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRmaW5kSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZEluZGV4O1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbmRpbmRleFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZEluZGV4JywgZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmaW5kSW5kZXgoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlJyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmluZFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZCcsIGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZpbmQoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG4iLCJ2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yJyk7XG5cbi8vIGBGbG9hdDMyQXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignRmxvYXQzMicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwidmFyIGNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgRmxvYXQ2NEFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ0Zsb2F0NjQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5mb3JlYWNoXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAkZm9yRWFjaChhVHlwZWRBcnJheSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycycpO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpLmV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q7XG52YXIgdHlwZWRBcnJheUZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbScpO1xuXG4vLyBgJVR5cGVkQXJyYXklLmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLmZyb21cbmV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QoJ2Zyb20nLCB0eXBlZEFycmF5RnJvbSwgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlJyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5jbHVkZXM7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5pbmNsdWRlc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnaW5jbHVkZXMnLCBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gIHJldHVybiAkaW5jbHVkZXMoYVR5cGVkQXJyYXkodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5kZXhPZjtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuaW5kZXhvZlxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnaW5kZXhPZicsIGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICByZXR1cm4gJGluZGV4T2YoYVR5cGVkQXJyYXkodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0pO1xuIiwidmFyIGNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgSW50MTZBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQxNicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3InKTtcblxuLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50MzInLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJ2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yJyk7XG5cbi8vIGBJbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignSW50OCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciBBcnJheUl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbnZhciBhcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JzLnZhbHVlcztcbnZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzO1xudmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yID0gVWludDhBcnJheSAmJiBVaW50OEFycmF5LnByb3RvdHlwZVtJVEVSQVRPUl07XG5cbnZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yXG4gICYmIChuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCBuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpO1xuXG52YXIgdHlwZWRBcnJheVZhbHVlcyA9IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwoYVR5cGVkQXJyYXkodGhpcykpO1xufTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmVudHJpZXNcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2VudHJpZXMnLCBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwoYVR5cGVkQXJyYXkodGhpcykpO1xufSk7XG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUua2V5c1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgna2V5cycsIGZ1bmN0aW9uIGtleXMoKSB7XG4gIHJldHVybiBhcnJheUtleXMuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk7XG59KTtcbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnZhbHVlc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndmFsdWVzJywgdHlwZWRBcnJheVZhbHVlcywgIUNPUlJFQ1RfSVRFUl9OQU1FKTtcbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUtQEBpdGVyYXRvclxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZChJVEVSQVRPUiwgdHlwZWRBcnJheVZhbHVlcywgIUNPUlJFQ1RfSVRFUl9OQU1FKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICRqb2luID0gW10uam9pbjtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuam9pbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmpvaW5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnam9pbicsIGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gIHJldHVybiAkam9pbi5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRsYXN0SW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1sYXN0LWluZGV4LW9mJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUubGFzdEluZGV4T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5sYXN0aW5kZXhvZlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdsYXN0SW5kZXhPZicsIGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgcmV0dXJuICRsYXN0SW5kZXhPZi5hcHBseShhVHlwZWRBcnJheSh0aGlzKSwgYXJndW1lbnRzKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRtYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykubWFwO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5tYXBcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ21hcCcsIGZ1bmN0aW9uIG1hcChtYXBmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRtYXAoYVR5cGVkQXJyYXkodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgKGFUeXBlZEFycmF5Q29uc3RydWN0b3Ioc3BlY2llc0NvbnN0cnVjdG9yKE8sIE8uY29uc3RydWN0b3IpKSkobGVuZ3RoKTtcbiAgfSk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9ycy1yZXF1aXJlLXdyYXBwZXJzJyk7XG5cbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUub2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLm9mXG5leHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kKCdvZicsIGZ1bmN0aW9uIG9mKC8qIC4uLml0ZW1zICovKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKHRoaXMpKShsZW5ndGgpO1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gIHJldHVybiByZXN1bHQ7XG59LCBUWVBFRF9BUlJBWVNfQ09OU1RSVUNUT1JTX1JFUVVJUkVTX1dSQVBQRVJTKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkcmVkdWNlUmlnaHQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlJykucmlnaHQ7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUucmVkdWNlUmljaHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5yZWR1Y2VyaWdodFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgncmVkdWNlUmlnaHQnLCBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gIHJldHVybiAkcmVkdWNlUmlnaHQoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlJykubGVmdDtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5yZWR1Y2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JlZHVjZScsIGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gIHJldHVybiAkcmVkdWNlKGFUeXBlZEFycmF5KHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUucmV2ZXJzZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnJldmVyc2VcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3JldmVyc2UnLCBmdW5jdGlvbiByZXZlcnNlKCkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIHZhciBsZW5ndGggPSBhVHlwZWRBcnJheSh0aGF0KS5sZW5ndGg7XG4gIHZhciBtaWRkbGUgPSBmbG9vcihsZW5ndGggLyAyKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHZhbHVlO1xuICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICB2YWx1ZSA9IHRoYXRbaW5kZXhdO1xuICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdGhhdDtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvT2Zmc2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9mZnNldCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIG5ldyBJbnQ4QXJyYXkoMSkuc2V0KHt9KTtcbn0pO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zZXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zZXRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3NldCcsIGZ1bmN0aW9uIHNldChhcnJheUxpa2UgLyogLCBvZmZzZXQgKi8pIHtcbiAgYVR5cGVkQXJyYXkodGhpcyk7XG4gIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMSk7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIHNyYyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgaWYgKGxlbiArIG9mZnNldCA+IGxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3JvbmcgbGVuZ3RoJyk7XG4gIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG59LCBGT1JDRUQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgJHNsaWNlID0gW10uc2xpY2U7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBuZXcgSW50OEFycmF5KDEpLnNsaWNlKCk7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc2xpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zbGljZVxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc2xpY2UnLCBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gIHZhciBsaXN0ID0gJHNsaWNlLmNhbGwoYVR5cGVkQXJyYXkodGhpcyksIHN0YXJ0LCBlbmQpO1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICByZXR1cm4gcmVzdWx0O1xufSwgRk9SQ0VEKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKTtcbnZhciAkc29tZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5zb21lO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS5zb21lXG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzb21lJywgZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJHNvbWUoYVR5cGVkQXJyYXkodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZScpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgJHNvcnQgPSBbXS5zb3J0O1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zb3J0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29ydFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gIHJldHVybiAkc29ydC5jYWxsKGFUeXBlZEFycmF5KHRoaXMpLCBjb21wYXJlZm4pO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5zdWJhcnJheWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnN1YmFycmF5XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzdWJhcnJheScsIGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IE8ubGVuZ3RoO1xuICB2YXIgYmVnaW5JbmRleCA9IHRvQWJzb2x1dGVJbmRleChiZWdpbiwgbGVuZ3RoKTtcbiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE8uY29uc3RydWN0b3IpKShcbiAgICBPLmJ1ZmZlcixcbiAgICBPLmJ5dGVPZmZzZXQgKyBiZWdpbkluZGV4ICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtIGJlZ2luSW5kZXgpXG4gICk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgJHRvTG9jYWxlU3RyaW5nID0gW10udG9Mb2NhbGVTdHJpbmc7XG52YXIgJHNsaWNlID0gW10uc2xpY2U7XG5cbi8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmVcbnZhciBUT19MT0NBTEVfU1RSSU5HX0JVRyA9ICEhSW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgJHRvTG9jYWxlU3RyaW5nLmNhbGwobmV3IEludDhBcnJheSgxKSk7XG59KTtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBJbnQ4QXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgSW50OEFycmF5LnByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Mb2NhbGVTdHJpbmcnLCBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgcmV0dXJuICR0b0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfU1RSSU5HX0JVRyA/ICRzbGljZS5jYWxsKGFUeXBlZEFycmF5KHRoaXMpKSA6IGFUeXBlZEFycmF5KHRoaXMpLCBhcmd1bWVudHMpO1xufSwgRk9SQ0VEKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUnKS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xudmFyIFVpbnQ4QXJyYXlQcm90b3R5cGUgPSBVaW50OEFycmF5ICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlIHx8IHt9O1xudmFyIGFycmF5VG9TdHJpbmcgPSBbXS50b1N0cmluZztcbnZhciBhcnJheUpvaW4gPSBbXS5qb2luO1xuXG5pZiAoZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvU3RyaW5nLmNhbGwoe30pOyB9KSkge1xuICBhcnJheVRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICB9O1xufVxuXG52YXIgSVNfTk9UX0FSUkFZX01FVEhPRCA9IFVpbnQ4QXJyYXlQcm90b3R5cGUudG9TdHJpbmcgIT0gYXJyYXlUb1N0cmluZztcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b3N0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9TdHJpbmcnLCBhcnJheVRvU3RyaW5nLCBJU19OT1RfQVJSQVlfTUVUSE9EKTtcbiIsInZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3InKTtcblxuLy8gYFVpbnQxNkFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQxNicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJ2YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yJyk7XG5cbi8vIGBVaW50MzJBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdVaW50MzInLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwidmFyIGNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgVWludDhBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdVaW50OCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3InKTtcblxuLy8gYFVpbnQ4Q2xhbXBlZEFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGVuZm9yY2VJdGVybmFsU3RhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKS5lbmZvcmNlO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcblxudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2Vha21hcC1jb25zdHJ1Y3RvclxudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLlJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVEZWxldGUgPSBXZWFrTWFwUHJvdG90eXBlWydkZWxldGUnXTtcbiAgdmFyIG5hdGl2ZUhhcyA9IFdlYWtNYXBQcm90b3R5cGUuaGFzO1xuICB2YXIgbmF0aXZlR2V0ID0gV2Vha01hcFByb3RvdHlwZS5nZXQ7XG4gIHZhciBuYXRpdmVTZXQgPSBXZWFrTWFwUHJvdG90eXBlLnNldDtcbiAgcmVkZWZpbmVBbGwoV2Vha01hcFByb3RvdHlwZSwge1xuICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZS5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuWydkZWxldGUnXShrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plbi5oYXMoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZUdldC5jYWxsKHRoaXMsIGtleSkgOiBzdGF0ZS5mcm96ZW4uZ2V0KGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVHZXQuY2FsbCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgPyBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xuXG4vLyBgV2Vha1NldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdlYWtzZXQtY29uc3RydWN0b3JcbmNvbGxlY3Rpb24oJ1dlYWtTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCBjb2xsZWN0aW9uV2Vhayk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsQWdncmVnYXRlRXJyb3JTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKCdBZ2dyZWdhdGVFcnJvcicpO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgaWYgKCEodGhhdCBpbnN0YW5jZW9mICRBZ2dyZWdhdGVFcnJvcikpIHJldHVybiBuZXcgJEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSk7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgRXJyb3IobWVzc2FnZSksIGdldFByb3RvdHlwZU9mKHRoYXQpKTtcbiAgfVxuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIGVycm9yc0FycmF5LnB1c2gsIGVycm9yc0FycmF5KTtcbiAgaWYgKERFU0NSSVBUT1JTKSBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHsgZXJyb3JzOiBlcnJvcnNBcnJheSwgdHlwZTogJ0FnZ3JlZ2F0ZUVycm9yJyB9KTtcbiAgZWxzZSB0aGF0LmVycm9ycyA9IGVycm9yc0FycmF5O1xuICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ21lc3NhZ2UnLCBTdHJpbmcobWVzc2FnZSkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbiRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eS5mKCRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUsICdlcnJvcnMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbEFnZ3JlZ2F0ZUVycm9yU3RhdGUodGhpcykuZXJyb3JzO1xuICB9LFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHtcbiAgQWdncmVnYXRlRXJyb3I6ICRBZ2dyZWdhdGVFcnJvclxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG5cbnZhciBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbjtcblxudmFyIGlzRnJvemVuU3RyaW5nQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXksIGFsbG93VW5kZWZpbmVkKSB7XG4gIGlmICghaXNGcm96ZW4gfHwgIWlzQXJyYXkoYXJyYXkpIHx8ICFpc0Zyb3plbihhcnJheSkpIHJldHVybiBmYWxzZTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIGVsZW1lbnQ7XG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGVsZW1lbnQgPSBhcnJheVtpbmRleCsrXTtcbiAgICBpZiAoISh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgKGFsbG93VW5kZWZpbmVkICYmIHR5cGVvZiBlbGVtZW50ID09PSAndW5kZWZpbmVkJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IHJldHVybiBsZW5ndGggIT09IDA7XG59O1xuXG4vLyBgQXJyYXkuaXNUZW1wbGF0ZU9iamVjdGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1pcy10ZW1wbGF0ZS1vYmplY3RcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUgfSwge1xuICBpc1RlbXBsYXRlT2JqZWN0OiBmdW5jdGlvbiBpc1RlbXBsYXRlT2JqZWN0KHZhbHVlKSB7XG4gICAgaWYgKCFpc0Zyb3plblN0cmluZ0FycmF5KHZhbHVlLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByYXcgPSB2YWx1ZS5yYXc7XG4gICAgaWYgKHJhdy5sZW5ndGggIT09IHZhbHVlLmxlbmd0aCB8fCAhaXNGcm96ZW5TdHJpbmdBcnJheShyYXcsIGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4YCBnZXR0ZXJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZWl0aGFtdXMvcHJvcG9zYWwtYXJyYXktbGFzdFxuaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJbmRleCcgaW4gW10pKSB7XG4gIGRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2xhc3RJbmRleCcsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBsYXN0SW5kZXgoKSB7XG4gICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIHJldHVybiBsZW4gPT0gMCA/IDAgOiBsZW4gLSAxO1xuICAgIH1cbiAgfSk7XG5cbiAgYWRkVG9VbnNjb3BhYmxlcygnbGFzdEluZGV4Jyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleGAgYWNjZXNzb3Jcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZWl0aGFtdXMvcHJvcG9zYWwtYXJyYXktbGFzdFxuaWYgKERFU0NSSVBUT1JTICYmICEoJ2xhc3RJdGVtJyBpbiBbXSkpIHtcbiAgZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnbGFzdEl0ZW0nLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gbGFzdEl0ZW0oKSB7XG4gICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIHJldHVybiBsZW4gPT0gMCA/IHVuZGVmaW5lZCA6IE9bbGVuIC0gMV07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIGxhc3RJdGVtKHZhbHVlKSB7XG4gICAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIHJldHVybiBPW2xlbiA9PSAwID8gMCA6IGxlbiAtIDFdID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBhZGRUb1Vuc2NvcGFibGVzKCdsYXN0SXRlbScpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWNyZWF0ZS1wcm94eScpO1xuXG52YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcsIFByb21pc2UpIHtcbiAgdmFyIHN0YXRlID0gdGhpcztcbiAgdmFyIGl0ZXJhdG9yID0gc3RhdGUuaXRlcmF0b3I7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5uZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHtcbiAgICAgIHN0YXRlLmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IFtzdGF0ZS5pbmRleCsrLCBzdGVwLnZhbHVlXSB9O1xuICB9KTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgYXNJbmRleGVkUGFpcnM6IGZ1bmN0aW9uIGFzSW5kZXhlZFBhaXJzKCkge1xuICAgIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSxcbiAgICAgIGluZGV4OiAwXG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1wcm90b3R5cGUnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBBc3luY0l0ZXJhdG9yQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKCkge1xuICBhbkluc3RhbmNlKHRoaXMsIEFzeW5jSXRlcmF0b3JDb25zdHJ1Y3Rvcik7XG59O1xuXG5Bc3luY0l0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gQXN5bmNJdGVyYXRvclByb3RvdHlwZTtcblxuaWYgKCFoYXMoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIHtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsICdBc3luY0l0ZXJhdG9yJyk7XG59XG5cbmlmICghaGFzKEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicpIHx8IEFzeW5jSXRlcmF0b3JQcm90b3R5cGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQXN5bmNJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yKTtcbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgQXN5bmNJdGVyYXRvcjogQXN5bmNJdGVyYXRvckNvbnN0cnVjdG9yXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXInKTtcbnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItY3JlYXRlLXByb3h5Jyk7XG5cbnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkge1xuICB2YXIgc3RhdGUgPSB0aGlzO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBzdGF0ZS5yZW1haW5pbmcgPyB1bmRlZmluZWQgOiBhcmcpKVxuICAgICAgICApLnRoZW4oZnVuY3Rpb24gKHN0ZXApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHtcbiAgICAgICAgICAgICAgc3RhdGUuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5yZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgc3RhdGUucmVtYWluaW5nLS07XG4gICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBzdGVwLnZhbHVlIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyByZWplY3QoZXJyKTsgfVxuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgfVxuICAgIH07XG5cbiAgICBsb29wKCk7XG4gIH0pO1xufSk7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBkcm9wOiBmdW5jdGlvbiBkcm9wKGxpbWl0KSB7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdClcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZXZlcnkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItaXRlcmF0aW9uJykuZXZlcnk7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoZm4pIHtcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGZuKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1jcmVhdGUtcHJveHknKTtcblxudmFyIEFzeW5jSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUFzeW5jSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnLCBQcm9taXNlKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXM7XG4gIHZhciBmaWx0ZXJlciA9IHN0YXRlLmZpbHRlcmVyO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoYW5PYmplY3Qoc3RhdGUubmV4dC5jYWxsKHN0YXRlLml0ZXJhdG9yLCBhcmcpKSkudGhlbihmdW5jdGlvbiAoc3RlcCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkge1xuICAgICAgICAgICAgICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoZmlsdGVyZXIodmFsdWUpKS50aGVuKGZ1bmN0aW9uIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkID8gcmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfSkgOiBsb29wKCk7XG4gICAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IHJlamVjdChlcnIpOyB9XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyB9XG4gICAgfTtcblxuICAgIGxvb3AoKTtcbiAgfSk7XG59KTtcblxuJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGZpbHRlcmVyKSB7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgZmlsdGVyZXI6IGFGdW5jdGlvbihmaWx0ZXJlcilcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24nKS5maW5kO1xuXG4kKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChmbikge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBmbik7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItY3JlYXRlLXByb3h5Jyk7XG52YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBBc3luY0l0ZXJhdG9yUHJveHkgPSBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZywgUHJvbWlzZSkge1xuICB2YXIgc3RhdGUgPSB0aGlzO1xuICB2YXIgbWFwcGVyID0gc3RhdGUubWFwcGVyO1xuICB2YXIgaW5uZXJJdGVyYXRvciwgaXRlcmF0b3JNZXRob2Q7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgb3V0ZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KHN0YXRlLm5leHQuY2FsbChzdGF0ZS5pdGVyYXRvciwgYXJnKSkpLnRoZW4oZnVuY3Rpb24gKHN0ZXApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHN0ZXApLmRvbmUpIHtcbiAgICAgICAgICAgICAgc3RhdGUuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKG1hcHBlcihzdGVwLnZhbHVlKSkudGhlbihmdW5jdGlvbiAobWFwcGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0QXN5bmNJdGVyYXRvck1ldGhvZChtYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5uZXJJdGVyYXRvciA9IGlubmVySXRlcmF0b3IgPSBhbk9iamVjdChpdGVyYXRvck1ldGhvZC5jYWxsKG1hcHBlZCkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbm5lck5leHQgPSBhRnVuY3Rpb24oaW5uZXJJdGVyYXRvci5uZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyTG9vcCgpO1xuICAgICAgICAgICAgICAgICAgfSByZWplY3QoVHlwZUVycm9yKCcuZmxhdE1hcCBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjIpIHsgcmVqZWN0KGVycm9yMik7IH1cbiAgICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHsgcmVqZWN0KGVycm9yMSk7IH1cbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IH1cbiAgICB9O1xuXG4gICAgdmFyIGlubmVyTG9vcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbm5lckl0ZXJhdG9yID0gc3RhdGUuaW5uZXJJdGVyYXRvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShhbk9iamVjdChzdGF0ZS5pbm5lck5leHQuY2FsbChpbm5lckl0ZXJhdG9yKSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKGFuT2JqZWN0KHJlc3VsdCkuZG9uZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLmlubmVySXRlcmF0b3IgPSBzdGF0ZS5pbm5lck5leHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIG91dGVyTG9vcCgpO1xuICAgICAgICAgICAgICB9IGVsc2UgcmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmVzdWx0LnZhbHVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7IHJlamVjdChlcnJvcjEpOyB9XG4gICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgfVxuICAgICAgfSBlbHNlIG91dGVyTG9vcCgpO1xuICAgIH07XG5cbiAgICBpbm5lckxvb3AoKTtcbiAgfSk7XG59KTtcblxuJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAobWFwcGVyKSB7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKSxcbiAgICAgIGlubmVySXRlcmF0b3I6IG51bGwsXG4gICAgICBpbm5lck5leHQ6IG51bGxcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hc3luYy1pdGVyYXRvci1pdGVyYXRpb24nKS5mb3JFYWNoO1xuXG4kKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBmbik7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjcmVhdGVBc3luY0l0ZXJhdG9yUHJveHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXN5bmMtaXRlcmF0b3ItY3JlYXRlLXByb3h5Jyk7XG52YXIgZ2V0QXN5bmNJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYXN5bmMtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBBc3luY0l0ZXJhdG9yID0gcGF0aC5Bc3luY0l0ZXJhdG9yO1xuXG52YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZykpO1xufSwgdHJ1ZSk7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGZyb206IGZ1bmN0aW9uIGZyb20oTykge1xuICAgIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgICB2YXIgdXNpbmdJdGVyYXRvciA9IGdldEFzeW5jSXRlcmF0b3JNZXRob2Qob2JqZWN0KTtcbiAgICB2YXIgaXRlcmF0b3I7XG4gICAgaWYgKHVzaW5nSXRlcmF0b3IgIT0gbnVsbCkge1xuICAgICAgaXRlcmF0b3IgPSBhRnVuY3Rpb24odXNpbmdJdGVyYXRvcikuY2FsbChvYmplY3QpO1xuICAgICAgaWYgKGl0ZXJhdG9yIGluc3RhbmNlb2YgQXN5bmNJdGVyYXRvcikgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRvciA9IG9iamVjdDtcbiAgICB9IHJldHVybiBuZXcgQXN5bmNJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvclxuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWNyZWF0ZS1wcm94eScpO1xuXG52YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcsIFByb21pc2UpIHtcbiAgdmFyIHN0YXRlID0gdGhpcztcbiAgdmFyIG1hcHBlciA9IHN0YXRlLm1hcHBlcjtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KHN0YXRlLm5leHQuY2FsbChzdGF0ZS5pdGVyYXRvciwgYXJnKSkpLnRoZW4oZnVuY3Rpb24gKHN0ZXApIHtcbiAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkge1xuICAgICAgc3RhdGUuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFwcGVyKHN0ZXAudmFsdWUpKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiB2YWx1ZSB9O1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnQXN5bmNJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgbWFwOiBmdW5jdGlvbiBtYXAobWFwcGVyKSB7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKVxuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxudmFyIFByb21pc2UgPSBnZXRCdWlsdEluKCdQcm9taXNlJyk7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShyZWR1Y2VyIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgdmFyIGl0ZXJhdG9yID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIG5leHQgPSBhRnVuY3Rpb24oaXRlcmF0b3IubmV4dCk7XG4gICAgdmFyIG5vSW5pdGlhbCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTtcbiAgICBhRnVuY3Rpb24ocmVkdWNlcik7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvcikpKS50aGVuKGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoYW5PYmplY3Qoc3RlcCkuZG9uZSkge1xuICAgICAgICAgICAgICAgIG5vSW5pdGlhbCA/IHJlamVjdChUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBpdGVyYXRvciB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKSkgOiByZXNvbHZlKGFjY3VtdWxhdG9yKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChub0luaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgIG5vSW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlZHVjZXIoYWNjdW11bGF0b3IsIHZhbHVlKSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IHJlamVjdChlcnIpOyB9XG4gICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgfVxuICAgICAgfTtcblxuICAgICAgbG9vcCgpO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRzb21lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbicpLnNvbWU7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBzb21lOiBmdW5jdGlvbiBzb21lKGZuKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGZuKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyJyk7XG52YXIgY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWNyZWF0ZS1wcm94eScpO1xuXG52YXIgQXN5bmNJdGVyYXRvclByb3h5ID0gY3JlYXRlQXN5bmNJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHtcbiAgaWYgKCF0aGlzLnJlbWFpbmluZy0tKSB7XG4gICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH0gcmV0dXJuIHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZyk7XG59KTtcblxuJCh7IHRhcmdldDogJ0FzeW5jSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIHRha2U6IGZ1bmN0aW9uIHRha2UobGltaXQpIHtcbiAgICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JQcm94eSh7XG4gICAgICBpdGVyYXRvcjogYW5PYmplY3QodGhpcyksXG4gICAgICByZW1haW5pbmc6IHRvUG9zaXRpdmVJbnRlZ2VyKGxpbWl0KVxuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICR0b0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FzeW5jLWl0ZXJhdG9yLWl0ZXJhdGlvbicpLnRvQXJyYXk7XG5cbiQoeyB0YXJnZXQ6ICdBc3luY0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHJldHVybiAkdG9BcnJheSh0aGlzKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRDb21wb3NpdGVLZXlOb2RlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbXBvc2l0ZS1rZXknKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG5cbnZhciBpbml0aWFsaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZyZWV6ZSA9IGdldEJ1aWx0SW4oJ09iamVjdCcsICdmcmVlemUnKTtcbiAgcmV0dXJuIGZyZWV6ZSA/IGZyZWV6ZShjcmVhdGUobnVsbCkpIDogY3JlYXRlKG51bGwpO1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmljaGVyLWtleXMvdHJlZS9tYXN0ZXIvY29tcG9zaXRlS2V5XG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHtcbiAgY29tcG9zaXRlS2V5OiBmdW5jdGlvbiBjb21wb3NpdGVLZXkoKSB7XG4gICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleU5vZGUuYXBwbHkoT2JqZWN0LCBhcmd1bWVudHMpLmdldCgnb2JqZWN0JywgaW5pdGlhbGl6ZXIpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldENvbXBvc2l0ZUtleU5vZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29tcG9zaXRlLWtleScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJpY2hlci1rZXlzL3RyZWUvbWFzdGVyL2NvbXBvc2l0ZUtleVxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIGNvbXBvc2l0ZVN5bWJvbDogZnVuY3Rpb24gY29tcG9zaXRlU3ltYm9sKCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSByZXR1cm4gZ2V0QnVpbHRJbignU3ltYm9sJylbJ2ZvciddKGFyZ3VtZW50c1swXSk7XG4gICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleU5vZGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5nZXQoJ3N5bWJvbCcsIGdldEJ1aWx0SW4oJ1N5bWJvbCcpKTtcbiAgfVxufSk7XG4iLCIvLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi9lcy5nbG9iYWwtdGhpcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtcHJveHknKTtcblxudmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHtcbiAgdmFyIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZykpO1xuICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7XG4gIGlmICghZG9uZSkgcmV0dXJuIFt0aGlzLmluZGV4KyssIHJlc3VsdC52YWx1ZV07XG59KTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBhc0luZGV4ZWRQYWlyczogZnVuY3Rpb24gYXNJbmRleGVkUGFpcnMoKSB7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSxcbiAgICAgIGluZGV4OiAwXG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBOYXRpdmVJdGVyYXRvciA9IGdsb2JhbC5JdGVyYXRvcjtcblxuLy8gRkY1Ni0gaGF2ZSBub24tc3RhbmRhcmQgZ2xvYmFsIGhlbHBlciBgSXRlcmF0b3JgXG52YXIgRk9SQ0VEID0gSVNfUFVSRVxuICB8fCB0eXBlb2YgTmF0aXZlSXRlcmF0b3IgIT0gJ2Z1bmN0aW9uJ1xuICB8fCBOYXRpdmVJdGVyYXRvci5wcm90b3R5cGUgIT09IEl0ZXJhdG9yUHJvdG90eXBlXG4gIC8vIEZGNDQtIG5vbi1zdGFuZGFyZCBgSXRlcmF0b3JgIHBhc3NlcyBwcmV2aW91cyB0ZXN0c1xuICB8fCAhZmFpbHMoZnVuY3Rpb24gKCkgeyBOYXRpdmVJdGVyYXRvcih7fSk7IH0pO1xuXG52YXIgSXRlcmF0b3JDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIEl0ZXJhdG9yKCkge1xuICBhbkluc3RhbmNlKHRoaXMsIEl0ZXJhdG9yQ29uc3RydWN0b3IpO1xufTtcblxuaWYgKElTX1BVUkUpIHtcbiAgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxuaWYgKCFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0l0ZXJhdG9yJyk7XG59XG5cbmlmIChGT1JDRUQgfHwgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJykgfHwgSXRlcmF0b3JQcm90b3R5cGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmF0b3JQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIEl0ZXJhdG9yQ29uc3RydWN0b3IpO1xufVxuXG5JdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IEl0ZXJhdG9yUHJvdG90eXBlO1xuXG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIEl0ZXJhdG9yOiBJdGVyYXRvckNvbnN0cnVjdG9yXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUG9zaXRpdmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXInKTtcbnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1wcm94eScpO1xuXG52YXIgSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykge1xuICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuICB2YXIgbmV4dCA9IHRoaXMubmV4dDtcbiAgdmFyIHJlc3VsdCwgZG9uZTtcbiAgd2hpbGUgKHRoaXMucmVtYWluaW5nKSB7XG4gICAgdGhpcy5yZW1haW5pbmctLTtcbiAgICByZXN1bHQgPSBhbk9iamVjdChuZXh0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICB9XG4gIHJlc3VsdCA9IGFuT2JqZWN0KG5leHQuY2FsbChpdGVyYXRvciwgYXJnKSk7XG4gIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lO1xuICBpZiAoIWRvbmUpIHJldHVybiByZXN1bHQudmFsdWU7XG59KTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBkcm9wOiBmdW5jdGlvbiBkcm9wKGxpbWl0KSB7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSxcbiAgICAgIHJlbWFpbmluZzogdG9Qb3NpdGl2ZUludGVnZXIobGltaXQpXG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoZm4pIHtcbiAgICBhbk9iamVjdCh0aGlzKTtcbiAgICBhRnVuY3Rpb24oZm4pO1xuICAgIHJldHVybiAhaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICghZm4odmFsdWUpKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLXByb3h5Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xuXG52YXIgSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKGFyZykge1xuICB2YXIgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuICB2YXIgZmlsdGVyZXIgPSB0aGlzLmZpbHRlcmVyO1xuICB2YXIgbmV4dCA9IHRoaXMubmV4dDtcbiAgdmFyIHJlc3VsdCwgZG9uZSwgdmFsdWU7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgcmVzdWx0ID0gYW5PYmplY3QobmV4dC5jYWxsKGl0ZXJhdG9yLCBhcmcpKTtcbiAgICBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgIGlmIChjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBmaWx0ZXJlciwgdmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGZpbHRlcmVyKSB7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBhbk9iamVjdCh0aGlzKSxcbiAgICAgIGZpbHRlcmVyOiBhRnVuY3Rpb24oZmlsdGVyZXIpXG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVyc1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGZuKSB7XG4gICAgYW5PYmplY3QodGhpcyk7XG4gICAgYUZ1bmN0aW9uKGZuKTtcbiAgICByZXR1cm4gaXRlcmF0ZSh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChmbih2YWx1ZSkpIHJldHVybiBpdGVyYXRlLnN0b3AodmFsdWUpO1xuICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBjcmVhdGVJdGVyYXRvclByb3h5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1wcm94eScpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcblxudmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHtcbiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjtcbiAgdmFyIHJlc3VsdCwgbWFwcGVkLCBpdGVyYXRvck1ldGhvZCwgaW5uZXJJdGVyYXRvcjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChpbm5lckl0ZXJhdG9yID0gdGhpcy5pbm5lckl0ZXJhdG9yKSB7XG4gICAgICByZXN1bHQgPSBhbk9iamVjdCh0aGlzLmlubmVyTmV4dC5jYWxsKGlubmVySXRlcmF0b3IpKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB0aGlzLmlubmVySXRlcmF0b3IgPSB0aGlzLmlubmVyTmV4dCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzdWx0ID0gYW5PYmplY3QodGhpcy5uZXh0LmNhbGwoaXRlcmF0b3IsIGFyZykpO1xuXG4gICAgaWYgKHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmUpIHJldHVybjtcblxuICAgIG1hcHBlZCA9IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHRoaXMubWFwcGVyLCByZXN1bHQudmFsdWUpO1xuICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QobWFwcGVkKTtcblxuICAgIGlmIChpdGVyYXRvck1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJy5mbGF0TWFwIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5pbm5lckl0ZXJhdG9yID0gaW5uZXJJdGVyYXRvciA9IGFuT2JqZWN0KGl0ZXJhdG9yTWV0aG9kLmNhbGwobWFwcGVkKSk7XG4gICAgdGhpcy5pbm5lck5leHQgPSBhRnVuY3Rpb24oaW5uZXJJdGVyYXRvci5uZXh0KTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChtYXBwZXIpIHtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKSxcbiAgICAgIGlubmVySXRlcmF0b3I6IG51bGwsXG4gICAgICBpbm5lck5leHQ6IG51bGxcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gICAgaXRlcmF0ZShhbk9iamVjdCh0aGlzKSwgZm4sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtcHJveHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciBJdGVyYXRvciA9IHBhdGguSXRlcmF0b3I7XG5cbnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbCh0aGlzLml0ZXJhdG9yLCBhcmcpKTtcbiAgdmFyIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lO1xuICBpZiAoIWRvbmUpIHJldHVybiByZXN1bHQudmFsdWU7XG59LCB0cnVlKTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGZyb206IGZ1bmN0aW9uIGZyb20oTykge1xuICAgIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgICB2YXIgdXNpbmdJdGVyYXRvciA9IGdldEl0ZXJhdG9yTWV0aG9kKG9iamVjdCk7XG4gICAgdmFyIGl0ZXJhdG9yO1xuICAgIGlmICh1c2luZ0l0ZXJhdG9yICE9IG51bGwpIHtcbiAgICAgIGl0ZXJhdG9yID0gYUZ1bmN0aW9uKHVzaW5nSXRlcmF0b3IpLmNhbGwob2JqZWN0KTtcbiAgICAgIGlmIChpdGVyYXRvciBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gaXRlcmF0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdG9yID0gb2JqZWN0O1xuICAgIH0gcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvclxuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtcHJveHknKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG5cbnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7XG4gIHZhciByZXN1bHQgPSBhbk9iamVjdCh0aGlzLm5leHQuY2FsbChpdGVyYXRvciwgYXJnKSk7XG4gIHZhciBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTtcbiAgaWYgKCFkb25lKSByZXR1cm4gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgdGhpcy5tYXBwZXIsIHJlc3VsdC52YWx1ZSk7XG59KTtcblxuJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUgfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBwZXIpIHtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgbWFwcGVyOiBhRnVuY3Rpb24obWFwcGVyKVxuICAgIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIGFuT2JqZWN0KHRoaXMpO1xuICAgIGFGdW5jdGlvbihyZWR1Y2VyKTtcbiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7XG4gICAgdmFyIGFjY3VtdWxhdG9yID0gbm9Jbml0aWFsID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIGl0ZXJhdGUodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAobm9Jbml0aWFsKSB7XG4gICAgICAgIG5vSW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICBhY2N1bXVsYXRvciA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSByZWR1Y2VyKGFjY3VtdWxhdG9yLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7XG4gICAgaWYgKG5vSW5pdGlhbCkgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgaXRlcmF0b3Igd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnNcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgc29tZTogZnVuY3Rpb24gc29tZShmbikge1xuICAgIGFuT2JqZWN0KHRoaXMpO1xuICAgIGFGdW5jdGlvbihmbik7XG4gICAgcmV0dXJuIGl0ZXJhdGUodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoZm4odmFsdWUpKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JQcm94eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtcHJveHknKTtcblxudmFyIEl0ZXJhdG9yUHJveHkgPSBjcmVhdGVJdGVyYXRvclByb3h5KGZ1bmN0aW9uIChhcmcpIHtcbiAgaWYgKCF0aGlzLnJlbWFpbmluZy0tKSB7XG4gICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IGFuT2JqZWN0KHRoaXMubmV4dC5jYWxsKHRoaXMuaXRlcmF0b3IsIGFyZykpO1xuICB2YXIgZG9uZSA9IHRoaXMuZG9uZSA9ICEhcmVzdWx0LmRvbmU7XG4gIGlmICghZG9uZSkgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIHRha2U6IGZ1bmN0aW9uIHRha2UobGltaXQpIHtcbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yUHJveHkoe1xuICAgICAgaXRlcmF0b3I6IGFuT2JqZWN0KHRoaXMpLFxuICAgICAgcmVtYWluaW5nOiB0b1Bvc2l0aXZlSW50ZWdlcihsaW1pdClcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIHB1c2ggPSBbXS5wdXNoO1xuXG4kKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGl0ZXJhdGUoYW5PYmplY3QodGhpcyksIHB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgY29sbGVjdGlvbkRlbGV0ZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLWRlbGV0ZS1hbGwnKTtcblxuLy8gYE1hcC5wcm90b3R5cGUuZGVsZXRlQWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBkZWxldGVBbGw6IGZ1bmN0aW9uIGRlbGV0ZUFsbCgvKiAuLi5lbGVtZW50cyAqLykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uRGVsZXRlQWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRNYXBJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBNYXAucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICghYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKS5zdG9wcGVkO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0TWFwSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgTWFwLnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldE1hcEl0ZXJhdG9yKG1hcCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICB2YXIgbmV3TWFwID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IobWFwLCBnZXRCdWlsdEluKCdNYXAnKSkpKCk7XG4gICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihuZXdNYXAuc2V0KTtcbiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgc2V0dGVyLmNhbGwobmV3TWFwLCBrZXksIHZhbHVlKTtcbiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBuZXdNYXA7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRNYXBJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBNYXAucHJvdG90eXBlLmZpbmRLZXlgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIGZpbmRLZXk6IGZ1bmN0aW9uIGZpbmRLZXkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHJldHVybiBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIGtleSwgbWFwKSkgcmV0dXJuIGl0ZXJhdGUuc3RvcChrZXkpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkucmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0TWFwSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgTWFwLnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldE1hcEl0ZXJhdG9yKG1hcCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChib3VuZEZ1bmN0aW9uKHZhbHVlLCBrZXksIG1hcCkpIHJldHVybiBpdGVyYXRlLnN0b3AodmFsdWUpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkucmVzdWx0O1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tJyk7XG5cbi8vIGBNYXAuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAuZnJvbVxuJCh7IHRhcmdldDogJ01hcCcsIHN0YXQ6IHRydWUgfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIGBNYXAuZ3JvdXBCeWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZ3JvdXBCeTogZnVuY3Rpb24gZ3JvdXBCeShpdGVyYWJsZSwga2V5RGVyaXZhdGl2ZSkge1xuICAgIHZhciBuZXdNYXAgPSBuZXcgdGhpcygpO1xuICAgIGFGdW5jdGlvbihrZXlEZXJpdmF0aXZlKTtcbiAgICB2YXIgaGFzID0gYUZ1bmN0aW9uKG5ld01hcC5oYXMpO1xuICAgIHZhciBnZXQgPSBhRnVuY3Rpb24obmV3TWFwLmdldCk7XG4gICAgdmFyIHNldCA9IGFGdW5jdGlvbihuZXdNYXAuc2V0KTtcbiAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgdmFyIGRlcml2ZWRLZXkgPSBrZXlEZXJpdmF0aXZlKGVsZW1lbnQpO1xuICAgICAgaWYgKCFoYXMuY2FsbChuZXdNYXAsIGRlcml2ZWRLZXkpKSBzZXQuY2FsbChuZXdNYXAsIGRlcml2ZWRLZXksIFtlbGVtZW50XSk7XG4gICAgICBlbHNlIGdldC5jYWxsKG5ld01hcCwgZGVyaXZlZEtleSkucHVzaChlbGVtZW50KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3TWFwO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE1hcEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3InKTtcbnZhciBzYW1lVmFsdWVaZXJvID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NhbWUtdmFsdWUtemVybycpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgTWFwLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaXRlcmF0ZShnZXRNYXBJdGVyYXRvcihhbk9iamVjdCh0aGlzKSksIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoc2FtZVZhbHVlWmVybyh2YWx1ZSwgc2VhcmNoRWxlbWVudCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTtcbiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpLnN0b3BwZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxuLy8gYE1hcC5rZXlCeWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBzdGF0OiB0cnVlIH0sIHtcbiAga2V5Qnk6IGZ1bmN0aW9uIGtleUJ5KGl0ZXJhYmxlLCBrZXlEZXJpdmF0aXZlKSB7XG4gICAgdmFyIG5ld01hcCA9IG5ldyB0aGlzKCk7XG4gICAgYUZ1bmN0aW9uKGtleURlcml2YXRpdmUpO1xuICAgIHZhciBzZXR0ZXIgPSBhRnVuY3Rpb24obmV3TWFwLnNldCk7XG4gICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHNldHRlci5jYWxsKG5ld01hcCwga2V5RGVyaXZhdGl2ZShlbGVtZW50KSwgZWxlbWVudCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ld01hcDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRNYXBJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBNYXAucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBrZXlPZjogZnVuY3Rpb24ga2V5T2Yoc2VhcmNoRWxlbWVudCkge1xuICAgIHJldHVybiBpdGVyYXRlKGdldE1hcEl0ZXJhdG9yKGFuT2JqZWN0KHRoaXMpKSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGl0ZXJhdGUuc3RvcChrZXkpO1xuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSkucmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0TWFwSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1hcC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgTWFwLnByb3RvdHlwZS5tYXBLZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBtYXBLZXlzOiBmdW5jdGlvbiBtYXBLZXlzKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldE1hcEl0ZXJhdG9yKG1hcCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICB2YXIgbmV3TWFwID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IobWFwLCBnZXRCdWlsdEluKCdNYXAnKSkpKCk7XG4gICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihuZXdNYXAuc2V0KTtcbiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgc2V0dGVyLmNhbGwobmV3TWFwLCBib3VuZEZ1bmN0aW9uKHZhbHVlLCBrZXksIG1hcCksIHZhbHVlKTtcbiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBuZXdNYXA7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBnZXRNYXBJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBNYXAucHJvdG90eXBlLm1hcFZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgbWFwVmFsdWVzOiBmdW5jdGlvbiBtYXBWYWx1ZXMoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0TWFwSXRlcmF0b3IobWFwKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHZhciBuZXdNYXAgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihtYXAsIGdldEJ1aWx0SW4oJ01hcCcpKSkoKTtcbiAgICB2YXIgc2V0dGVyID0gYUZ1bmN0aW9uKG5ld01hcC5zZXQpO1xuICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBzZXR0ZXIuY2FsbChuZXdNYXAsIGtleSwgYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKTtcbiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBuZXdNYXA7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYE1hcC5wcm90b3R5cGUubWVyZ2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoaXRlcmFibGUgLyogLi4uaXRlcmJsZXMgKi8pIHtcbiAgICB2YXIgbWFwID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHNldHRlciA9IGFGdW5jdGlvbihtYXAuc2V0KTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBpdGVyYXRlKGFyZ3VtZW50c1tpKytdLCBzZXR0ZXIsIG1hcCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZicpO1xuXG4vLyBgTWFwLm9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5vZlxuJCh7IHRhcmdldDogJ01hcCcsIHN0YXQ6IHRydWUgfSwge1xuICBvZjogb2Zcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBnZXRNYXBJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWFwLWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBNYXAucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApO1xuICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjtcbiAgICB2YXIgYWNjdW11bGF0b3IgPSBub0luaXRpYWwgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAobm9Jbml0aWFsKSB7XG4gICAgICAgIG5vSW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICBhY2N1bXVsYXRvciA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFja2ZuKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBtYXApO1xuICAgICAgfVxuICAgIH0sIHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgaWYgKG5vSW5pdGlhbCkgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgbWFwIHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldE1hcEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tYXAtaXRlcmF0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdNYXAnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgaXRlcmF0b3IgPSBnZXRNYXBJdGVyYXRvcihtYXApO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgcmV0dXJuIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwga2V5LCBtYXApKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgfSwgdW5kZWZpbmVkLCB0cnVlLCB0cnVlKS5zdG9wcGVkO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciAkdXBzZXJ0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hcC11cHNlcnQnKTtcblxuLy8gYE1hcC5wcm90b3R5cGUudXBkYXRlT3JJbnNlcnRgIG1ldGhvZCAocmVwbGFjZWQgYnkgYE1hcC5wcm90b3R5cGUudXBzZXJ0YClcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aHVtYnN1cGVwL3Byb3Bvc2FsLXVwc2VydFxuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICB1cGRhdGVPckluc2VydDogJHVwc2VydFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS51cGRhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnTWFwJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGtleSwgY2FsbGJhY2sgLyogLCB0aHVuayAqLykge1xuICAgIHZhciBtYXAgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2spO1xuICAgIHZhciBpc1ByZXNlbnRJbk1hcCA9IG1hcC5oYXMoa2V5KTtcbiAgICBpZiAoIWlzUHJlc2VudEluTWFwICYmIGxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignVXBkYXRpbmcgYWJzZW50IHZhbHVlJyk7XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IGlzUHJlc2VudEluTWFwID8gbWFwLmdldChrZXkpIDogYUZ1bmN0aW9uKGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpKGtleSwgbWFwKTtcbiAgICBtYXAuc2V0KGtleSwgY2FsbGJhY2sodmFsdWUsIGtleSwgbWFwKSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciAkdXBzZXJ0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hcC11cHNlcnQnKTtcblxuLy8gYE1hcC5wcm90b3R5cGUudXBzZXJ0YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aHVtYnN1cGVwL3Byb3Bvc2FsLXVwc2VydFxuJCh7IHRhcmdldDogJ01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICB1cHNlcnQ6ICR1cHNlcnRcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBtYXggPSBNYXRoLm1heDtcblxuLy8gYE1hdGguY2xhbXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgY2xhbXA6IGZ1bmN0aW9uIGNsYW1wKHgsIGxvd2VyLCB1cHBlcikge1xuICAgIHJldHVybiBtaW4odXBwZXIsIG1heChsb3dlciwgeCkpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTWF0aC5ERUdfUEVSX1JBRGAgY29uc3RhbnRcbi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIERFR19QRVJfUkFEOiBNYXRoLlBJIC8gMTgwXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG52YXIgUkFEX1BFUl9ERUcgPSAxODAgLyBNYXRoLlBJO1xuXG4vLyBgTWF0aC5kZWdyZWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGRlZ3JlZXM6IGZ1bmN0aW9uIGRlZ3JlZXMocmFkaWFucykge1xuICAgIHJldHVybiByYWRpYW5zICogUkFEX1BFUl9ERUc7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbnZhciBzY2FsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLXNjYWxlJyk7XG52YXIgZnJvdW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtZnJvdW5kJyk7XG5cbi8vIGBNYXRoLmZzY2FsZWAgbWV0aG9kXG4vLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICBmc2NhbGU6IGZ1bmN0aW9uIGZzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgICByZXR1cm4gZnJvdW5kKHNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTWF0aC5pYWRkaGAgbWV0aG9kXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlhZGRoOiBmdW5jdGlvbiBpYWRkaCh4MCwgeDEsIHkwLCB5MSkge1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMDtcbiAgICB2YXIgJHgxID0geDEgPj4+IDA7XG4gICAgdmFyICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgKyAoeTEgPj4+IDApICsgKCgkeDAgJiAkeTAgfCAoJHgwIHwgJHkwKSAmIH4oJHgwICsgJHkwID4+PiAwKSkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG5cbi8vIGBNYXRoLmltdWxoYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaW11bGg6IGZ1bmN0aW9uIGltdWxoKHUsIHYpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhGRkZGO1xuICAgIHZhciAkdSA9ICt1O1xuICAgIHZhciAkdiA9ICt2O1xuICAgIHZhciB1MCA9ICR1ICYgVUlOVDE2O1xuICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2O1xuICAgIHZhciB1MSA9ICR1ID4+IDE2O1xuICAgIHZhciB2MSA9ICR2ID4+IDE2O1xuICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTtcbiAgICByZXR1cm4gdTEgKiB2MSArICh0ID4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4gMTYpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTWF0aC5pc3ViaGAgbWV0aG9kXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzdWJoOiBmdW5jdGlvbiBpc3ViaCh4MCwgeDEsIHkwLCB5MSkge1xuICAgIHZhciAkeDAgPSB4MCA+Pj4gMDtcbiAgICB2YXIgJHgxID0geDEgPj4+IDA7XG4gICAgdmFyICR5MCA9IHkwID4+PiAwO1xuICAgIHJldHVybiAkeDEgLSAoeTEgPj4+IDApIC0gKCh+JHgwICYgJHkwIHwgfigkeDAgXiAkeTApICYgJHgwIC0gJHkwID4+PiAwKSA+Pj4gMzEpIHwgMDtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE1hdGguUkFEX1BFUl9ERUdgIGNvbnN0YW50XG4vLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxudmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDtcblxuLy8gYE1hdGgucmFkaWFuc2AgbWV0aG9kXG4vLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUgfSwge1xuICByYWRpYW5zOiBmdW5jdGlvbiByYWRpYW5zKGRlZ3JlZXMpIHtcbiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hdGgtc2NhbGUnKTtcblxuLy8gYE1hdGguc2NhbGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xuJCh7IHRhcmdldDogJ01hdGgnLCBzdGF0OiB0cnVlIH0sIHtcbiAgc2NhbGU6IHNjYWxlXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG51bWJlcklzRmluaXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1pcy1maW5pdGUnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIFNFRURFRF9SQU5ET00gPSAnU2VlZGVkIFJhbmRvbSc7XG52YXIgU0VFREVEX1JBTkRPTV9HRU5FUkFUT1IgPSBTRUVERURfUkFORE9NICsgJyBHZW5lcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU0VFREVEX1JBTkRPTV9HRU5FUkFUT1IpO1xudmFyIFNFRURfVFlQRV9FUlJPUiA9ICdNYXRoLnNlZWRlZFBSTkcoKSBhcmd1bWVudCBzaG91bGQgaGF2ZSBhIFwic2VlZFwiIGZpZWxkIHdpdGggYSBmaW5pdGUgdmFsdWUuJztcblxudmFyICRTZWVkZWRSYW5kb21HZW5lcmF0b3IgPSBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKGZ1bmN0aW9uIFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNFRURFRF9SQU5ET01fR0VORVJBVE9SLFxuICAgIHNlZWQ6IHNlZWQgJSAyMTQ3NDgzNjQ3XG4gIH0pO1xufSwgU0VFREVEX1JBTkRPTSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHNlZWQgPSBzdGF0ZS5zZWVkID0gKHN0YXRlLnNlZWQgKiAxMTAzNTE1MjQ1ICsgMTIzNDUpICUgMjE0NzQ4MzY0NztcbiAgcmV0dXJuIHsgdmFsdWU6IChzZWVkICYgMTA3Mzc0MTgyMykgLyAxMDczNzQxODIzLCBkb25lOiBmYWxzZSB9O1xufSk7XG5cbi8vIGBNYXRoLnNlZWRlZFBSTkdgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2VlZGVkLXJhbmRvbVxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2VlZGVkLXJhbmRvbS9ibG9iLzc4YjgyNTg4MzViNTdmYzIxMDBkMDc2MTUxYWI1MDZiYzMyMDJhZTYvZGVtby5odG1sXG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gIHNlZWRlZFBSTkc6IGZ1bmN0aW9uIHNlZWRlZFBSTkcoaXQpIHtcbiAgICB2YXIgc2VlZCA9IGFuT2JqZWN0KGl0KS5zZWVkO1xuICAgIGlmICghbnVtYmVySXNGaW5pdGUoc2VlZCkpIHRocm93IFR5cGVFcnJvcihTRUVEX1RZUEVfRVJST1IpO1xuICAgIHJldHVybiBuZXcgJFNlZWRlZFJhbmRvbUdlbmVyYXRvcihzZWVkKTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcblxuLy8gYE1hdGguc2lnbmJpdGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1NYXRoLnNpZ25iaXRcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHNpZ25iaXQ6IGZ1bmN0aW9uIHNpZ25iaXQoeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA9PSB4ICYmIHggPT0gMCA/IDEgLyB4ID09IC1JbmZpbml0eSA6IHggPCAwO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgTWF0aC51bXVsaGAgbWV0aG9kXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbiQoeyB0YXJnZXQ6ICdNYXRoJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHVtdWxoOiBmdW5jdGlvbiB1bXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4RkZGRjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+Pj4gMTY7XG4gICAgdmFyIHYxID0gJHYgPj4+IDE2O1xuICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTtcbiAgICByZXR1cm4gdTEgKiB2MSArICh0ID4+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+PiAxNik7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciBwYXJzZUludCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50Jyk7XG5cbnZhciBJTlZBTElEX05VTUJFUl9SRVBSRVNFTlRBVElPTiA9ICdJbnZhbGlkIG51bWJlciByZXByZXNlbnRhdGlvbic7XG52YXIgSU5WQUxJRF9SQURJWCA9ICdJbnZhbGlkIHJhZGl4JztcbnZhciB2YWxpZCA9IC9eW1xcZGEtel0rJC87XG5cbi8vIGBOdW1iZXIuZnJvbVN0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1udW1iZXItZnJvbXN0cmluZ1xuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBmcm9tU3RyaW5nOiBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0cmluZywgcmFkaXgpIHtcbiAgICB2YXIgc2lnbiA9IDE7XG4gICAgdmFyIFIsIG1hdGhOdW07XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT0gJ3N0cmluZycpIHRocm93IFR5cGVFcnJvcihJTlZBTElEX05VTUJFUl9SRVBSRVNFTlRBVElPTik7XG4gICAgaWYgKCFzdHJpbmcubGVuZ3RoKSB0aHJvdyBTeW50YXhFcnJvcihJTlZBTElEX05VTUJFUl9SRVBSRVNFTlRBVElPTik7XG4gICAgaWYgKHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nKSB7XG4gICAgICBzaWduID0gLTE7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UoMSk7XG4gICAgICBpZiAoIXN0cmluZy5sZW5ndGgpIHRocm93IFN5bnRheEVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTtcbiAgICB9XG4gICAgUiA9IHJhZGl4ID09PSB1bmRlZmluZWQgPyAxMCA6IHRvSW50ZWdlcihyYWRpeCk7XG4gICAgaWYgKFIgPCAyIHx8IFIgPiAzNikgdGhyb3cgUmFuZ2VFcnJvcihJTlZBTElEX1JBRElYKTtcbiAgICBpZiAoIXZhbGlkLnRlc3Qoc3RyaW5nKSB8fCAobWF0aE51bSA9IHBhcnNlSW50KHN0cmluZywgUikpLnRvU3RyaW5nKFIpICE9PSBzdHJpbmcpIHtcbiAgICAgIHRocm93IFN5bnRheEVycm9yKElOVkFMSURfTlVNQkVSX1JFUFJFU0VOVEFUSU9OKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ24gKiBtYXRoTnVtO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIE9iamVjdEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pdGVyYXRvcicpO1xuXG4vLyBgT2JqZWN0Lml0ZXJhdGVFbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb25cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXRlcmF0ZUVudHJpZXM6IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzKG9iamVjdCkge1xuICAgIHJldHVybiBuZXcgT2JqZWN0SXRlcmF0b3Iob2JqZWN0LCAnZW50cmllcycpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIE9iamVjdEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pdGVyYXRvcicpO1xuXG4vLyBgT2JqZWN0Lml0ZXJhdGVLZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1pdGVyYXRpb25cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXRlcmF0ZUtleXM6IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iamVjdCkge1xuICAgIHJldHVybiBuZXcgT2JqZWN0SXRlcmF0b3Iob2JqZWN0LCAna2V5cycpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIE9iamVjdEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pdGVyYXRvcicpO1xuXG4vLyBgT2JqZWN0Lml0ZXJhdGVWYWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWl0ZXJhdGlvblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBpdGVyYXRlVmFsdWVzOiBmdW5jdGlvbiBpdGVyYXRlVmFsdWVzKG9iamVjdCkge1xuICAgIHJldHVybiBuZXcgT2JqZWN0SXRlcmF0b3Iob2JqZWN0LCAndmFsdWVzJyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgT0JTRVJWQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnb2JzZXJ2YWJsZScpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG5cbnZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZuID09IG51bGwgPyB1bmRlZmluZWQgOiBhRnVuY3Rpb24oZm4pO1xufTtcblxudmFyIGNsZWFudXBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uU3RhdGUpIHtcbiAgdmFyIGNsZWFudXAgPSBzdWJzY3JpcHRpb25TdGF0ZS5jbGVhbnVwO1xuICBpZiAoY2xlYW51cCkge1xuICAgIHN1YnNjcmlwdGlvblN0YXRlLmNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaG9zdFJlcG9ydEVycm9ycyhlcnJvcik7XG4gICAgfVxuICB9XG59O1xuXG52YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvblN0YXRlKSB7XG4gIHJldHVybiBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlciA9PT0gdW5kZWZpbmVkO1xufTtcblxudmFyIGNsb3NlID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbiwgc3Vic2NyaXB0aW9uU3RhdGUpIHtcbiAgaWYgKCFERVNDUklQVE9SUykge1xuICAgIHN1YnNjcmlwdGlvbi5jbG9zZWQgPSB0cnVlO1xuICAgIHZhciBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLnN1YnNjcmlwdGlvbk9ic2VydmVyO1xuICAgIGlmIChzdWJzY3JpcHRpb25PYnNlcnZlcikgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuY2xvc2VkID0gdHJ1ZTtcbiAgfSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlciA9IHVuZGVmaW5lZDtcbn07XG5cbnZhciBTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgdmFyIHN1YnNjcmlwdGlvblN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgY2xlYW51cDogdW5kZWZpbmVkLFxuICAgIG9ic2VydmVyOiBhbk9iamVjdChvYnNlcnZlciksXG4gICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXI6IHVuZGVmaW5lZFxuICB9KTtcbiAgdmFyIHN0YXJ0O1xuICBpZiAoIURFU0NSSVBUT1JTKSB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGlmIChzdGFydCA9IGdldE1ldGhvZChvYnNlcnZlci5zdGFydCkpIHN0YXJ0LmNhbGwob2JzZXJ2ZXIsIHRoaXMpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyb3IpO1xuICB9XG4gIGlmIChzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uU3RhdGUpKSByZXR1cm47XG4gIHZhciBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLnN1YnNjcmlwdGlvbk9ic2VydmVyID0gbmV3IFN1YnNjcmlwdGlvbk9ic2VydmVyKHRoaXMpO1xuICB0cnkge1xuICAgIHZhciBjbGVhbnVwID0gc3Vic2NyaWJlcihzdWJzY3JpcHRpb25PYnNlcnZlcik7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IGNsZWFudXA7XG4gICAgaWYgKGNsZWFudXAgIT0gbnVsbCkgc3Vic2NyaXB0aW9uU3RhdGUuY2xlYW51cCA9IHR5cGVvZiBjbGVhbnVwLnVuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGZ1bmN0aW9uICgpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH1cbiAgICAgIDogYUZ1bmN0aW9uKGNsZWFudXApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHN1YnNjcmlwdGlvbk9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH0gaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvblN0YXRlKSkge1xuICAgICAgY2xvc2UodGhpcywgc3Vic2NyaXB0aW9uU3RhdGUpO1xuICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25TdGF0ZSk7XG4gICAgfVxuICB9XG59KTtcblxuaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eShTdWJzY3JpcHRpb24ucHJvdG90eXBlLCAnY2xvc2VkJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzdWJzY3JpcHRpb25DbG9zZWQoZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKSk7XG4gIH1cbn0pO1xuXG52YXIgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywgeyBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiB9KTtcbiAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbn07XG5cblN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIG5leHQ6IGZ1bmN0aW9uIG5leHQodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uKTtcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5leHRNZXRob2QgPSBnZXRNZXRob2Qob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgIGlmIChuZXh0TWV0aG9kKSBuZXh0TWV0aG9kLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaXB0aW9uO1xuICAgIHZhciBzdWJzY3JpcHRpb25TdGF0ZSA9IGdldEludGVybmFsU3RhdGUoc3Vic2NyaXB0aW9uKTtcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb25TdGF0ZSkpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvblN0YXRlLm9ic2VydmVyO1xuICAgICAgY2xvc2Uoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25TdGF0ZSk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZXJyb3JNZXRob2QgPSBnZXRNZXRob2Qob2JzZXJ2ZXIuZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3JNZXRob2QpIGVycm9yTWV0aG9kLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgICAgZWxzZSBob3N0UmVwb3J0RXJyb3JzKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBob3N0UmVwb3J0RXJyb3JzKGVycik7XG4gICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uU3RhdGUpO1xuICAgIH1cbiAgfSxcbiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKCkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnN1YnNjcmlwdGlvbjtcbiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHN1YnNjcmlwdGlvbik7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uU3RhdGUpKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb25TdGF0ZS5vYnNlcnZlcjtcbiAgICAgIGNsb3NlKHN1YnNjcmlwdGlvbiwgc3Vic2NyaXB0aW9uU3RhdGUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGNvbXBsZXRlTWV0aG9kID0gZ2V0TWV0aG9kKG9ic2VydmVyLmNvbXBsZXRlKTtcbiAgICAgICAgaWYgKGNvbXBsZXRlTWV0aG9kKSBjb21wbGV0ZU1ldGhvZC5jYWxsKG9ic2VydmVyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhvc3RSZXBvcnRFcnJvcnMoZXJyb3IpO1xuICAgICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvblN0YXRlKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5pZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5KFN1YnNjcmlwdGlvbk9ic2VydmVyLnByb3RvdHlwZSwgJ2Nsb3NlZCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uQ2xvc2VkKGdldEludGVybmFsU3RhdGUoZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zdWJzY3JpcHRpb24pKTtcbiAgfVxufSk7XG5cbnZhciAkT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlcikge1xuICBhbkluc3RhbmNlKHRoaXMsICRPYnNlcnZhYmxlLCAnT2JzZXJ2YWJsZScpO1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHsgc3Vic2NyaWJlcjogYUZ1bmN0aW9uKHN1YnNjcmliZXIpIH0pO1xufTtcblxucmVkZWZpbmVBbGwoJE9ic2VydmFibGUucHJvdG90eXBlLCB7XG4gIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24odHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nID8ge1xuICAgICAgbmV4dDogb2JzZXJ2ZXIsXG4gICAgICBlcnJvcjogbGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbXBsZXRlOiBsZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkXG4gICAgfSA6IGlzT2JqZWN0KG9ic2VydmVyKSA/IG9ic2VydmVyIDoge30sIGdldEludGVybmFsU3RhdGUodGhpcykuc3Vic2NyaWJlcik7XG4gIH1cbn0pO1xuXG5yZWRlZmluZUFsbCgkT2JzZXJ2YWJsZSwge1xuICBmcm9tOiBmdW5jdGlvbiBmcm9tKHgpIHtcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlO1xuICAgIHZhciBvYnNlcnZhYmxlTWV0aG9kID0gZ2V0TWV0aG9kKGFuT2JqZWN0KHgpW09CU0VSVkFCTEVdKTtcbiAgICBpZiAob2JzZXJ2YWJsZU1ldGhvZCkge1xuICAgICAgdmFyIG9ic2VydmFibGUgPSBhbk9iamVjdChvYnNlcnZhYmxlTWV0aG9kLmNhbGwoeCkpO1xuICAgICAgcmV0dXJuIG9ic2VydmFibGUuY29uc3RydWN0b3IgPT09IEMgPyBvYnNlcnZhYmxlIDogbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoeCk7XG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKGl0KSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaXQpO1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH0sXG4gIG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlO1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpdGVtcyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBpdGVtc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2ldKTtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgfSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgIH0pO1xuICB9XG59KTtcblxuY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRPYnNlcnZhYmxlLnByb3RvdHlwZSwgT0JTRVJWQUJMRSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbiQoeyBnbG9iYWw6IHRydWUgfSwge1xuICBPYnNlcnZhYmxlOiAkT2JzZXJ2YWJsZVxufSk7XG5cbnNldFNwZWNpZXMoJ09ic2VydmFibGUnKTtcbiIsIi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG5yZXF1aXJlKCcuL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7XG5cbi8vIGBQcm9taXNlLmFueWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgdmFyIGFscmVhZHlSZXNvbHZlZCA9IGZhbHNlO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeVJlamVjdGVkID0gZmFsc2U7XG4gICAgICAgIGVycm9ycy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvcnNbaW5kZXhdID0gZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IChnZXRCdWlsdEluKCdBZ2dyZWdhdGVFcnJvcicpKShlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IChnZXRCdWlsdEluKCdBZ2dyZWdhdGVFcnJvcicpKShlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG5cbi8vIGBQcm9taXNlLnRyeWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gICAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZih0aGlzKTtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgICAocmVzdWx0LmVycm9yID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDtcblxuLy8gYFJlZmxlY3QuZGVmaW5lTWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGRlZmluZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbM10pO1xuICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7XG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXRNYXA7XG52YXIgc3RvcmUgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuc3RvcmU7XG5cbi8vIGBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICAgIGlmIChtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkIHx8ICFtZXRhZGF0YU1hcFsnZGVsZXRlJ10obWV0YWRhdGFLZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlO1xuICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICAgIHRhcmdldE1ldGFkYXRhWydkZWxldGUnXSh0YXJnZXRLZXkpO1xuICAgIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxudmFyIFNldCA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc2V0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUua2V5cztcbnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5O1xuXG52YXIgZnJvbSA9IGZ1bmN0aW9uIChpdGVyKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaXRlcmF0ZShpdGVyLCByZXN1bHQucHVzaCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBvcmRpbmFyeU1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uIChPLCBQKSB7XG4gIHZhciBvS2V5cyA9IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIGlmIChwYXJlbnQgPT09IG51bGwpIHJldHVybiBvS2V5cztcbiAgdmFyIHBLZXlzID0gb3JkaW5hcnlNZXRhZGF0YUtleXMocGFyZW50LCBQKTtcbiAgcmV0dXJuIHBLZXlzLmxlbmd0aCA/IG9LZXlzLmxlbmd0aCA/IGZyb20obmV3IFNldChvS2V5cy5jb25jYXQocEtleXMpKSkgOiBwS2V5cyA6IG9LZXlzO1xufTtcblxuLy8gYFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBnZXRNZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5TWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xuXG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5oYXM7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcblxudmFyIG9yZGluYXJ5R2V0TWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiB1bmRlZmluZWQ7XG59O1xuXG4vLyBgUmVmbGVjdC5nZXRNZXRhZGF0YWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmJ1Y2t0b24vcmVmbGVjdC1tZXRhZGF0YVxuJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmtleXM7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcblxuLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuZ2V0O1xudmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7XG5cbi8vIGBSZWZsZWN0LmdldE93bk1ldGFkYXRhYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBnZXRPd25NZXRhZGF0YTogZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgICByZXR1cm4gb3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG5cbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhcztcbnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5O1xuXG52YXIgb3JkaW5hcnlIYXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiB0cnVlO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogZmFsc2U7XG59O1xuXG4vLyBgUmVmbGVjdC5oYXNNZXRhZGF0YWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmJ1Y2t0b24vcmVmbGVjdC1tZXRhZGF0YVxuJCh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaGFzTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuaGFzO1xudmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7XG5cbi8vIGBSZWZsZWN0Lmhhc093bk1ldGFkYXRhYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG4kKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBoYXNPd25NZXRhZGF0YTogZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgICByZXR1cm4gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5PYmplY3QodGFyZ2V0KSwgdGFyZ2V0S2V5KTtcbiAgfVxufSk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDtcblxuLy8gYFJlZmxlY3QubWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbiQoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIG1ldGFkYXRhOiBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBrZXkpIHtcbiAgICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIGFuT2JqZWN0KHRhcmdldCksIHRvTWV0YWRhdGFLZXkoa2V5KSk7XG4gICAgfTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBjb2xsZWN0aW9uQWRkQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tYWRkLWFsbCcpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5hZGRBbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIGFkZEFsbDogZnVuY3Rpb24gYWRkQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb25BZGRBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCcpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIGRlbGV0ZUFsbDogZnVuY3Rpb24gZGVsZXRlQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb25EZWxldGVBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBkaWZmZXJlbmNlOiBmdW5jdGlvbiBkaWZmZXJlbmNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBuZXdTZXQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihzZXQsIGdldEJ1aWx0SW4oJ1NldCcpKSkoc2V0KTtcbiAgICB2YXIgcmVtb3ZlciA9IGFGdW5jdGlvbihuZXdTZXRbJ2RlbGV0ZSddKTtcbiAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJlbW92ZXIuY2FsbChuZXdTZXQsIHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3U2V0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0U2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICByZXR1cm4gIWl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKCFib3VuZEZ1bmN0aW9uKHZhbHVlLCB2YWx1ZSwgc2V0KSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpO1xuICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRydWUpLnN0b3BwZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBnZXRTZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LWl0ZXJhdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHZhciBuZXdTZXQgPSBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihzZXQsIGdldEJ1aWx0SW4oJ1NldCcpKSkoKTtcbiAgICB2YXIgYWRkZXIgPSBhRnVuY3Rpb24obmV3U2V0LmFkZCk7XG4gICAgaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwgdmFsdWUsIHNldCkpIGFkZGVyLmNhbGwobmV3U2V0LCB2YWx1ZSk7XG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5ld1NldDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGdldFNldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgaXRlcmF0b3IgPSBnZXRTZXRJdGVyYXRvcihzZXQpO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgcmV0dXJuIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKGJvdW5kRnVuY3Rpb24odmFsdWUsIHZhbHVlLCBzZXQpKSByZXR1cm4gaXRlcmF0ZS5zdG9wKHZhbHVlKTtcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKS5yZXN1bHQ7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20nKTtcblxuLy8gYFNldC5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG4kKHsgdGFyZ2V0OiAnU2V0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIGludGVyc2VjdGlvbihpdGVyYWJsZSkge1xuICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKCk7XG4gICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpO1xuICAgIHZhciBhZGRlciA9IGFGdW5jdGlvbihuZXdTZXQuYWRkKTtcbiAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChoYXNDaGVjay5jYWxsKHNldCwgdmFsdWUpKSBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdTZXQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbVxuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBpc0Rpc2pvaW50RnJvbTogZnVuY3Rpb24gaXNEaXNqb2ludEZyb20oaXRlcmFibGUpIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpO1xuICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoaGFzQ2hlY2suY2FsbChzZXQsIHZhbHVlKSA9PT0gdHJ1ZSkgcmV0dXJuIGl0ZXJhdGUuc3RvcCgpO1xuICAgIH0pLnN0b3BwZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1YnNldE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNTdWJzZXRPZlxuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBpc1N1YnNldE9mOiBmdW5jdGlvbiBpc1N1YnNldE9mKGl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IodGhpcyk7XG4gICAgdmFyIG90aGVyU2V0ID0gYW5PYmplY3QoaXRlcmFibGUpO1xuICAgIHZhciBoYXNDaGVjayA9IG90aGVyU2V0LmhhcztcbiAgICBpZiAodHlwZW9mIGhhc0NoZWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICAgIG90aGVyU2V0ID0gbmV3IChnZXRCdWlsdEluKCdTZXQnKSkoaXRlcmFibGUpO1xuICAgICAgaGFzQ2hlY2sgPSBhRnVuY3Rpb24ob3RoZXJTZXQuaGFzKTtcbiAgICB9XG4gICAgcmV0dXJuICFpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChoYXNDaGVjay5jYWxsKG90aGVyU2V0LCB2YWx1ZSkgPT09IGZhbHNlKSByZXR1cm4gaXRlcmF0ZS5zdG9wKCk7XG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdHJ1ZSkuc3RvcHBlZDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgaXNTdXBlcnNldE9mOiBmdW5jdGlvbiBpc1N1cGVyc2V0T2YoaXRlcmFibGUpIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGhhc0NoZWNrID0gYUZ1bmN0aW9uKHNldC5oYXMpO1xuICAgIHJldHVybiAhaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoaGFzQ2hlY2suY2FsbChzZXQsIHZhbHVlKSA9PT0gZmFsc2UpIHJldHVybiBpdGVyYXRlLnN0b3AoKTtcbiAgICB9KS5zdG9wcGVkO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldFNldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtaXRlcmF0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuam9pbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTtcbiAgICB2YXIgc2VwID0gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBTdHJpbmcoc2VwYXJhdG9yKTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgaXRlcmF0ZShpdGVyYXRvciwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgZmFsc2UsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQuam9pbihzZXApO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0U2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKCk7XG4gICAgdmFyIGFkZGVyID0gYUZ1bmN0aW9uKG5ld1NldC5hZGQpO1xuICAgIGl0ZXJhdGUoaXRlcmF0b3IsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYWRkZXIuY2FsbChuZXdTZXQsIGJvdW5kRnVuY3Rpb24odmFsdWUsIHZhbHVlLCBzZXQpKTtcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTtcbiAgICByZXR1cm4gbmV3U2V0O1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YnKTtcblxuLy8gYFNldC5vZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQub2ZcbiQoeyB0YXJnZXQ6ICdTZXQnLCBzdGF0OiB0cnVlIH0sIHtcbiAgb2Y6IG9mXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgZ2V0U2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIGl0ZXJhdG9yID0gZ2V0U2V0SXRlcmF0b3Ioc2V0KTtcbiAgICB2YXIgbm9Jbml0aWFsID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7XG4gICAgdmFyIGFjY3VtdWxhdG9yID0gbm9Jbml0aWFsID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcbiAgICBpdGVyYXRlKGl0ZXJhdG9yLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChub0luaXRpYWwpIHtcbiAgICAgICAgbm9Jbml0aWFsID0gZmFsc2U7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvciA9IGNhbGxiYWNrZm4oYWNjdW11bGF0b3IsIHZhbHVlLCB2YWx1ZSwgc2V0KTtcbiAgICAgIH1cbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKTtcbiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBzZXQgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgZ2V0U2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1pdGVyYXRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5zb21lYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIHNldCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHZhciBpdGVyYXRvciA9IGdldFNldEl0ZXJhdG9yKHNldCk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKTtcbiAgICByZXR1cm4gaXRlcmF0ZShpdGVyYXRvciwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoYm91bmRGdW5jdGlvbih2YWx1ZSwgdmFsdWUsIHNldCkpIHJldHVybiBpdGVyYXRlLnN0b3AoKTtcbiAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0cnVlKS5zdG9wcGVkO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIHN5bW1ldHJpY0RpZmZlcmVuY2U6IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgc2V0ID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIG5ld1NldCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHNldCwgZ2V0QnVpbHRJbignU2V0JykpKShzZXQpO1xuICAgIHZhciByZW1vdmVyID0gYUZ1bmN0aW9uKG5ld1NldFsnZGVsZXRlJ10pO1xuICAgIHZhciBhZGRlciA9IGFGdW5jdGlvbihuZXdTZXQuYWRkKTtcbiAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJlbW92ZXIuY2FsbChuZXdTZXQsIHZhbHVlKSB8fCBhZGRlci5jYWxsKG5ld1NldCwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdTZXQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIHVuaW9uOiBmdW5jdGlvbiB1bmlvbihpdGVyYWJsZSkge1xuICAgIHZhciBzZXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgICB2YXIgbmV3U2V0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3Ioc2V0LCBnZXRCdWlsdEluKCdTZXQnKSkpKHNldCk7XG4gICAgaXRlcmF0ZShpdGVyYWJsZSwgYUZ1bmN0aW9uKG5ld1NldC5hZGQpLCBuZXdTZXQpO1xuICAgIHJldHVybiBuZXdTZXQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3MpIHtcbiAgICByZXR1cm4gY2hhckF0KHRoaXMsIHBvcyk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBTdHJpbmdNdWx0aWJ5dGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZScpO1xuXG52YXIgY29kZUF0ID0gU3RyaW5nTXVsdGlieXRlTW9kdWxlLmNvZGVBdDtcbnZhciBjaGFyQXQgPSBTdHJpbmdNdWx0aWJ5dGVNb2R1bGUuY2hhckF0O1xudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gVE9ETzogdW5pZnkgd2l0aCBTdHJpbmcjQEBpdGVyYXRvclxudmFyICRTdHJpbmdJdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoZnVuY3Rpb24gU3RyaW5nSXRlcmF0b3Ioc3RyaW5nKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IHN0cmluZyxcbiAgICBpbmRleDogMFxuICB9KTtcbn0sICdTdHJpbmcnLCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogeyBjb2RlUG9pbnQ6IGNvZGVBdChwb2ludCwgMCksIHBvc2l0aW9uOiBpbmRleCB9LCBkb25lOiBmYWxzZSB9O1xufSk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludHNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXByb3RvdHlwZS1jb2RlcG9pbnRzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUgfSwge1xuICBjb2RlUG9pbnRzOiBmdW5jdGlvbiBjb2RlUG9pbnRzKCkge1xuICAgIHJldHVybiBuZXcgJFN0cmluZ0l0ZXJhdG9yKFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKSk7XG4gIH1cbn0pO1xuIiwiLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnJlcXVpcmUoJy4vZXMuc3RyaW5nLm1hdGNoLWFsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbnZhciBSZWdFeHBQcm90b3R5cGUgPSBSZWdFeHAucHJvdG90eXBlO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1yZXBsYWNlLWFsbFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBJU19SRUdfRVhQLCBmbGFncywgcmVwbGFjZXIsIHN0cmluZywgc2VhcmNoU3RyaW5nLCB0ZW1wbGF0ZSwgcmVzdWx0LCBwb3NpdGlvbiwgaW5kZXg7XG4gICAgaWYgKHNlYXJjaFZhbHVlICE9IG51bGwpIHtcbiAgICAgIElTX1JFR19FWFAgPSBpc1JlZ0V4cChzZWFyY2hWYWx1ZSk7XG4gICAgICBpZiAoSVNfUkVHX0VYUCkge1xuICAgICAgICBmbGFncyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCdmbGFncycgaW4gUmVnRXhwUHJvdG90eXBlXG4gICAgICAgICAgPyBzZWFyY2hWYWx1ZS5mbGFnc1xuICAgICAgICAgIDogZ2V0UmVnRXhwRmxhZ3MuY2FsbChzZWFyY2hWYWx1ZSlcbiAgICAgICAgKSk7XG4gICAgICAgIGlmICghfmZsYWdzLmluZGV4T2YoJ2cnKSkgdGhyb3cgVHlwZUVycm9yKCdgLnJlcGxhY2VBbGxgIGRvZXMgbm90IGFsbG93IG5vbi1nbG9iYWwgcmVnZXhlcycpO1xuICAgICAgfVxuICAgICAgcmVwbGFjZXIgPSBzZWFyY2hWYWx1ZVtSRVBMQUNFXTtcbiAgICAgIGlmIChyZXBsYWNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlci5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhPKS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmcgPSBTdHJpbmcoTyk7XG4gICAgc2VhcmNoU3RyaW5nID0gU3RyaW5nKHNlYXJjaFZhbHVlKTtcbiAgICBpZiAoc2VhcmNoU3RyaW5nID09PSAnJykgcmV0dXJuIHJlcGxhY2VBbGwuY2FsbChzdHJpbmcsIC8oPzopL2csIHJlcGxhY2VWYWx1ZSk7XG4gICAgdGVtcGxhdGUgPSBzdHJpbmcuc3BsaXQoc2VhcmNoU3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VWYWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLmpvaW4oU3RyaW5nKHJlcGxhY2VWYWx1ZSkpO1xuICAgIH1cbiAgICByZXN1bHQgPSB0ZW1wbGF0ZVswXTtcbiAgICBwb3NpdGlvbiA9IHJlc3VsdC5sZW5ndGg7XG4gICAgZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdGVtcGxhdGUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nKHJlcGxhY2VWYWx1ZShzZWFyY2hTdHJpbmcsIHBvc2l0aW9uLCBzdHJpbmcpKTtcbiAgICAgIHBvc2l0aW9uICs9IHNlYXJjaFN0cmluZy5sZW5ndGggKyB0ZW1wbGF0ZVtpbmRleF0ubGVuZ3RoO1xuICAgICAgcmVzdWx0ICs9IHRlbXBsYXRlW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXVzaW5nLXN0YXRlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuZGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXVzaW5nLXN0YXRlbWVudFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdkaXNwb3NlJyk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLm9ic2VydmFibGVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ29ic2VydmFibGUnKTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wucGF0dGVybk1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcGF0dGVybi1tYXRjaGluZ1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdwYXR0ZXJuTWF0Y2gnKTtcbiIsIi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2VBbGwnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGNvbGxlY3Rpb25EZWxldGVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1kZWxldGUtYWxsJyk7XG5cbi8vIGBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGVBbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtY29sbGVjdGlvbi1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnV2Vha01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICBkZWxldGVBbGw6IGZ1bmN0aW9uIGRlbGV0ZUFsbCgvKiAuLi5lbGVtZW50cyAqLykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uRGVsZXRlQWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLWZyb20nKTtcblxuLy8gYFdlYWtNYXAuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLmZyb21cbiQoeyB0YXJnZXQ6ICdXZWFrTWFwJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1vZicpO1xuXG4vLyBgV2Vha01hcC5vZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLm9mXG4kKHsgdGFyZ2V0OiAnV2Vha01hcCcsIHN0YXQ6IHRydWUgfSwge1xuICBvZjogb2Zcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgJHVwc2VydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXAtdXBzZXJ0Jyk7XG5cbi8vIGBXZWFrTWFwLnByb3RvdHlwZS51cHNlcnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0XG4kKHsgdGFyZ2V0OiAnV2Vha01hcCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwge1xuICB1cHNlcnQ6ICR1cHNlcnRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgY29sbGVjdGlvbkFkZEFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLWFkZC1hbGwnKTtcblxuLy8gYFdlYWtTZXQucHJvdG90eXBlLmFkZEFsbGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jb2xsZWN0aW9uLW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdXZWFrU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7XG4gIGFkZEFsbDogZnVuY3Rpb24gYWRkQWxsKC8qIC4uLmVsZW1lbnRzICovKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb25BZGRBbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBjb2xsZWN0aW9uRGVsZXRlQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tZGVsZXRlLWFsbCcpO1xuXG4vLyBgV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlQWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNvbGxlY3Rpb24tbWV0aG9kc1xuJCh7IHRhcmdldDogJ1dlYWtTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIH0sIHtcbiAgZGVsZXRlQWxsOiBmdW5jdGlvbiBkZWxldGVBbGwoLyogLi4uZWxlbWVudHMgKi8pIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbkRlbGV0ZUFsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1mcm9tJyk7XG5cbi8vIGBXZWFrU2V0LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5mcm9tXG4kKHsgdGFyZ2V0OiAnV2Vha1NldCcsIHN0YXQ6IHRydWUgfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tb2YnKTtcblxuLy8gYFdlYWtTZXQub2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5vZlxuJCh7IHRhcmdldDogJ1dlYWtTZXQnLCBzdGF0OiB0cnVlIH0sIHtcbiAgb2Y6IG9mXG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlICYmIENvbGxlY3Rpb25Qcm90b3R5cGUuZm9yRWFjaCAhPT0gZm9yRWFjaCkgdHJ5IHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgJ2ZvckVhY2gnLCBmb3JFYWNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBDb2xsZWN0aW9uUHJvdG90eXBlLmZvckVhY2ggPSBmb3JFYWNoO1xuICB9XG59XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIERPTUl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb20taXRlcmFibGVzJyk7XG52YXIgQXJyYXlJdGVyYXRvck1ldGhvZHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JNZXRob2RzLnZhbHVlcztcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdO1xuICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzO1xuICAgIH1cbiAgICBpZiAoIUNvbGxlY3Rpb25Qcm90b3R5cGVbVE9fU1RSSU5HX1RBR10pIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIH1cbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKTtcblxudmFyIEZPUkNFRCA9ICFnbG9iYWwuc2V0SW1tZWRpYXRlIHx8ICFnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG5cbi8vIGh0dHA6Ly93M2MuZ2l0aHViLmlvL3NldEltbWVkaWF0ZS9cbiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gYHNldEltbWVkaWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHA6Ly93M2MuZ2l0aHViLmlvL3NldEltbWVkaWF0ZS8jc2ktc2V0SW1tZWRpYXRlXG4gIHNldEltbWVkaWF0ZTogdGFzay5zZXQsXG4gIC8vIGBjbGVhckltbWVkaWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHA6Ly93M2MuZ2l0aHViLmlvL3NldEltbWVkaWF0ZS8jc2ktY2xlYXJJbW1lZGlhdGVcbiAgY2xlYXJJbW1lZGlhdGU6IHRhc2suY2xlYXJcbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbi8vIGBxdWV1ZU1pY3JvdGFza2AgbWV0aG9kXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI2RvbS1xdWV1ZW1pY3JvdGFza1xuJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgbm9UYXJnZXRHZXQ6IHRydWUgfSwge1xuICBxdWV1ZU1pY3JvdGFzazogZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2soZm4pIHtcbiAgICB2YXIgZG9tYWluID0gaXNOb2RlICYmIHByb2Nlc3MuZG9tYWluO1xuICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7XG4gIH1cbn0pO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCcpO1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBNU0lFID0gL01TSUUgLlxcLi8udGVzdCh1c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKGhhbmRsZXIsIHRpbWVvdXQgLyogLCAuLi5hcmd1bWVudHMgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHNjaGVkdWxlcihib3VuZEFyZ3MgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgaGFuZGxlciA9PSAnZnVuY3Rpb24nID8gaGFuZGxlciA6IEZ1bmN0aW9uKGhhbmRsZXIpKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IDogaGFuZGxlciwgdGltZW91dCk7XG4gIH07XG59O1xuXG4vLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI3RpbWVyc1xuJCh7IGdsb2JhbDogdHJ1ZSwgYmluZDogdHJ1ZSwgZm9yY2VkOiBNU0lFIH0sIHtcbiAgLy8gYHNldFRpbWVvdXRgIG1ldGhvZFxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI2RvbS1zZXR0aW1lb3V0XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICAvLyBgc2V0SW50ZXJ2YWxgIG1ldGhvZFxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI2RvbS1zZXRpbnRlcnZhbFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgXG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIFVTRV9OQVRJVkVfVVJMID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS11cmwnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgJGZldGNoID0gZ2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBIZWFkZXJzID0gZ2V0QnVpbHRJbignSGVhZGVycycpO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFVSTF9TRUFSQ0hfUEFSQU1TID0gJ1VSTFNlYXJjaFBhcmFtcyc7XG52YXIgVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IgPSBVUkxfU0VBUkNIX1BBUkFNUyArICdJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUGFyYW1zU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNUyk7XG52YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IpO1xuXG52YXIgcGx1cyA9IC9cXCsvZztcbnZhciBzZXF1ZW5jZXMgPSBBcnJheSg0KTtcblxudmFyIHBlcmNlbnRTZXF1ZW5jZSA9IGZ1bmN0aW9uIChieXRlcykge1xuICByZXR1cm4gc2VxdWVuY2VzW2J5dGVzIC0gMV0gfHwgKHNlcXVlbmNlc1tieXRlcyAtIDFdID0gUmVnRXhwKCcoKD86JVtcXFxcZGEtZl17Mn0peycgKyBieXRlcyArICd9KScsICdnaScpKTtcbn07XG5cbnZhciBwZXJjZW50RGVjb2RlID0gZnVuY3Rpb24gKHNlcXVlbmNlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzZXF1ZW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlO1xuICB9XG59O1xuXG52YXIgZGVzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGl0LnJlcGxhY2UocGx1cywgJyAnKTtcbiAgdmFyIGJ5dGVzID0gNDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgd2hpbGUgKGJ5dGVzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nO1xuXG52YXIgcmVwbGFjZSA9IHtcbiAgJyEnOiAnJTIxJyxcbiAgXCInXCI6ICclMjcnLFxuICAnKCc6ICclMjgnLFxuICAnKSc6ICclMjknLFxuICAnfic6ICclN0UnLFxuICAnJTIwJzogJysnXG59O1xuXG52YXIgcmVwbGFjZXIgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgcmV0dXJuIHJlcGxhY2VbbWF0Y2hdO1xufTtcblxudmFyIHNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGl0KS5yZXBsYWNlKGZpbmQsIHJlcGxhY2VyKTtcbn07XG5cbnZhciBwYXJzZVNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uIChyZXN1bHQsIHF1ZXJ5KSB7XG4gIGlmIChxdWVyeSkge1xuICAgIHZhciBhdHRyaWJ1dGVzID0gcXVlcnkuc3BsaXQoJyYnKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBhdHRyaWJ1dGUsIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdO1xuICAgICAgaWYgKGF0dHJpYnV0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW50cnkgPSBhdHRyaWJ1dGUuc3BsaXQoJz0nKTtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGtleTogZGVzZXJpYWxpemUoZW50cnkuc2hpZnQoKSksXG4gICAgICAgICAgdmFsdWU6IGRlc2VyaWFsaXplKGVudHJ5LmpvaW4oJz0nKSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgdXBkYXRlU2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHF1ZXJ5KSB7XG4gIHRoaXMuZW50cmllcy5sZW5ndGggPSAwO1xuICBwYXJzZVNlYXJjaFBhcmFtcyh0aGlzLmVudHJpZXMsIHF1ZXJ5KTtcbn07XG5cbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IsXG4gICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSxcbiAgICBraW5kOiBraW5kXG4gIH0pO1xufSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpO1xuICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9IHJldHVybiBzdGVwO1xufSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXNgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2ludGVyZmFjZS11cmxzZWFyY2hwYXJhbXNcbnZhciBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcygvKiBpbml0ICovKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcbiAgdmFyIGluaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIgZW50cmllcyA9IFtdO1xuICB2YXIgaXRlcmF0b3JNZXRob2QsIGl0ZXJhdG9yLCBuZXh0LCBzdGVwLCBlbnRyeUl0ZXJhdG9yLCBlbnRyeU5leHQsIGZpcnN0LCBzZWNvbmQsIGtleTtcblxuICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNUyxcbiAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LFxuICAgIHVwZGF0ZVNlYXJjaFBhcmFtczogdXBkYXRlU2VhcmNoUGFyYW1zXG4gIH0pO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNPYmplY3QoaW5pdCkpIHtcbiAgICAgIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoaW5pdCk7XG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChpbml0KTtcbiAgICAgICAgbmV4dCA9IGl0ZXJhdG9yLm5leHQ7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBuZXh0LmNhbGwoaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICAgICAgZW50cnlJdGVyYXRvciA9IGdldEl0ZXJhdG9yKGFuT2JqZWN0KHN0ZXAudmFsdWUpKTtcbiAgICAgICAgICBlbnRyeU5leHQgPSBlbnRyeUl0ZXJhdG9yLm5leHQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGZpcnN0ID0gZW50cnlOZXh0LmNhbGwoZW50cnlJdGVyYXRvcikpLmRvbmUgfHxcbiAgICAgICAgICAgIChzZWNvbmQgPSBlbnRyeU5leHQuY2FsbChlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgICAgIWVudHJ5TmV4dC5jYWxsKGVudHJ5SXRlcmF0b3IpLmRvbmVcbiAgICAgICAgICApIHRocm93IFR5cGVFcnJvcignRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMicpO1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGtleTogZmlyc3QudmFsdWUgKyAnJywgdmFsdWU6IHNlY29uZC52YWx1ZSArICcnIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgZm9yIChrZXkgaW4gaW5pdCkgaWYgKGhhc093bihpbml0LCBrZXkpKSBlbnRyaWVzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGluaXRba2V5XSArICcnIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZVNlYXJjaFBhcmFtcyhlbnRyaWVzLCB0eXBlb2YgaW5pdCA9PT0gJ3N0cmluZycgPyBpbml0LmNoYXJBdCgwKSA9PT0gJz8nID8gaW5pdC5zbGljZSgxKSA6IGluaXQgOiBpbml0ICsgJycpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxucmVkZWZpbmVBbGwoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7XG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmFwcGVudGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1hcHBlbmRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAyKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHN0YXRlLmVudHJpZXMucHVzaCh7IGtleTogbmFtZSArICcnLCB2YWx1ZTogdmFsdWUgKyAnJyB9KTtcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWRlbGV0ZVxuICAnZGVsZXRlJzogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgZWxzZSBpbmRleCsrO1xuICAgIH1cbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZ2V0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldFxuICBnZXQ6IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHJldHVybiBlbnRyaWVzW2luZGV4XS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldEFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRhbGxcbiAgZ2V0QWxsOiBmdW5jdGlvbiBnZXRBbGwobmFtZSkge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBrZXkgPSBuYW1lICsgJyc7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICg7IGluZGV4IDwgZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4XS5rZXkgPT09IGtleSkgcmVzdWx0LnB1c2goZW50cmllc1tpbmRleF0udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5oYXNgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtaGFzXG4gIGhhczogZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YXIga2V5ID0gbmFtZSArICcnO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgIGlmIChlbnRyaWVzW2luZGV4KytdLmtleSA9PT0ga2V5KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zZXRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc2V0XG4gIHNldDogZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTtcbiAgICB2YXIgZW50cmllcyA9IHN0YXRlLmVudHJpZXM7XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgdmFyIGtleSA9IG5hbWUgKyAnJztcbiAgICB2YXIgdmFsID0gdmFsdWUgKyAnJztcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBlbnRyeTtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgIGlmIChlbnRyeS5rZXkgPT09IGtleSkge1xuICAgICAgICBpZiAoZm91bmQpIGVudHJpZXMuc3BsaWNlKGluZGV4LS0sIDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgZW50cnkudmFsdWUgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgZW50cmllcy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWwgfSk7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNvcnRgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc29ydFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KCkge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGVudHJpZXMgPSBzdGF0ZS5lbnRyaWVzO1xuICAgIC8vIEFycmF5I3NvcnQgaXMgbm90IHN0YWJsZSBpbiBzb21lIGVuZ2luZXNcbiAgICB2YXIgc2xpY2UgPSBlbnRyaWVzLnNsaWNlKCk7XG4gICAgdmFyIGVudHJ5LCBlbnRyaWVzSW5kZXgsIHNsaWNlSW5kZXg7XG4gICAgZW50cmllcy5sZW5ndGggPSAwO1xuICAgIGZvciAoc2xpY2VJbmRleCA9IDA7IHNsaWNlSW5kZXggPCBzbGljZS5sZW5ndGg7IHNsaWNlSW5kZXgrKykge1xuICAgICAgZW50cnkgPSBzbGljZVtzbGljZUluZGV4XTtcbiAgICAgIGZvciAoZW50cmllc0luZGV4ID0gMDsgZW50cmllc0luZGV4IDwgc2xpY2VJbmRleDsgZW50cmllc0luZGV4KyspIHtcbiAgICAgICAgaWYgKGVudHJpZXNbZW50cmllc0luZGV4XS5rZXkgPiBlbnRyeS5rZXkpIHtcbiAgICAgICAgICBlbnRyaWVzLnNwbGljZShlbnRyaWVzSW5kZXgsIDAsIGVudHJ5KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVudHJpZXNJbmRleCA9PT0gc2xpY2VJbmRleCkgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAna2V5cycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpO1xuICB9XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2RcbnJlZGVmaW5lKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgSVRFUkFUT1IsIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5lbnRyaWVzKTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmxzZWFyY2hwYXJhbXMtc3RyaW5naWZpY2F0aW9uLWJlaGF2aW9yXG5yZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgZW50cnk7XG4gIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgIHJlc3VsdC5wdXNoKHNlcmlhbGl6ZShlbnRyeS5rZXkpICsgJz0nICsgc2VyaWFsaXplKGVudHJ5LnZhbHVlKSk7XG4gIH0gcmV0dXJuIHJlc3VsdC5qb2luKCcmJyk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbnNldFRvU3RyaW5nVGFnKFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLCBVUkxfU0VBUkNIX1BBUkFNUyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMIH0sIHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvclxufSk7XG5cbi8vIFdyYXAgYGZldGNoYCBmb3IgY29ycmVjdCB3b3JrIHdpdGggcG9seWZpbGxlZCBgVVJMU2VhcmNoUGFyYW1zYFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3NFxuaWYgKCFVU0VfTkFUSVZFX1VSTCAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIEhlYWRlcnMgPT0gJ2Z1bmN0aW9uJykge1xuICAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgIHZhciBhcmdzID0gW2lucHV0XTtcbiAgICAgIHZhciBpbml0LCBib2R5LCBoZWFkZXJzO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGluaXQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgICAgIGJvZHkgPSBpbml0LmJvZHk7XG4gICAgICAgICAgaWYgKGNsYXNzb2YoYm9keSkgPT09IFVSTF9TRUFSQ0hfUEFSQU1TKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaW5pdC5oZWFkZXJzID8gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKSA6IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbml0ID0gY3JlYXRlKGluaXQsIHtcbiAgICAgICAgICAgICAgYm9keTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIFN0cmluZyhib2R5KSksXG4gICAgICAgICAgICAgIGhlYWRlcnM6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBoZWFkZXJzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3MucHVzaChpbml0KTtcbiAgICAgIH0gcmV0dXJuICRmZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixcbiAgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBpbiBjb3JlLWpzQDQsIG1vdmUgL21vZHVsZXMvIGRlcGVuZGVuY2llcyB0byBwdWJsaWMgZW50cmllcyBmb3IgYmV0dGVyIG9wdGltaXphdGlvbiBieSB0b29scyBsaWtlIGBwcmVzZXQtZW52YFxucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgVVNFX05BVElWRV9VUkwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXVybCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xudmFyIGFycmF5RnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY29kZUF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jb2RlQXQ7XG52YXIgdG9BU0NJSSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWknKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IHJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgTmF0aXZlVVJMID0gZ2xvYmFsLlVSTDtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsVVJMU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcignVVJMJyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xuXG52YXIgSU5WQUxJRF9BVVRIT1JJVFkgPSAnSW52YWxpZCBhdXRob3JpdHknO1xudmFyIElOVkFMSURfU0NIRU1FID0gJ0ludmFsaWQgc2NoZW1lJztcbnZhciBJTlZBTElEX0hPU1QgPSAnSW52YWxpZCBob3N0JztcbnZhciBJTlZBTElEX1BPUlQgPSAnSW52YWxpZCBwb3J0JztcblxudmFyIEFMUEhBID0gL1tBLVphLXpdLztcbnZhciBBTFBIQU5VTUVSSUMgPSAvW1xcZCstLkEtWmEtel0vO1xudmFyIERJR0lUID0gL1xcZC87XG52YXIgSEVYX1NUQVJUID0gL14oMHh8MFgpLztcbnZhciBPQ1QgPSAvXlswLTddKyQvO1xudmFyIERFQyA9IC9eXFxkKyQvO1xudmFyIEhFWCA9IC9eW1xcZEEtRmEtZl0rJC87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIyUvOj9AW1xcXFxdXS87XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcdTAwMDBcXHUwMDA5XFx1MDAwQVxcdTAwMEQgIy86P0BbXFxcXF1dLztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG52YXIgTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdK3xbXFx1MDAwMC1cXHUwMDFGIF0rJC9nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHUwMDA5XFx1MDAwQVxcdTAwMERdL2c7XG52YXIgRU9GO1xuXG52YXIgcGFyc2VIb3N0ID0gZnVuY3Rpb24gKHVybCwgaW5wdXQpIHtcbiAgdmFyIHJlc3VsdCwgY29kZVBvaW50cywgaW5kZXg7XG4gIGlmIChpbnB1dC5jaGFyQXQoMCkgPT0gJ1snKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSAhPSAnXScpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gcGFyc2VJUHY2KGlucHV0LnNsaWNlKDEsIC0xKSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIC8vIG9wYXF1ZSBob3N0XG4gIH0gZWxzZSBpZiAoIWlzU3BlY2lhbCh1cmwpKSB7XG4gICAgaWYgKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgcmVzdWx0ID0gJyc7XG4gICAgY29kZVBvaW50cyA9IGFycmF5RnJvbShpbnB1dCk7XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaW5kZXhdLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICB9XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaW5wdXQgPSB0b0FTQ0lJKGlucHV0KTtcbiAgICBpZiAoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KGlucHV0KSkgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICByZXN1bHQgPSBwYXJzZUlQdjQoaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgdXJsLmhvc3QgPSByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBwYXJzZUlQdjQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLnBvcCgpO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIHBhcnQuY2hhckF0KDApID09ICcwJykge1xuICAgICAgcmFkaXggPSBIRVhfU1RBUlQudGVzdChwYXJ0KSA/IDE2IDogODtcbiAgICAgIHBhcnQgPSBwYXJ0LnNsaWNlKHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEocmFkaXggPT0gMTAgPyBERUMgOiByYWRpeCA9PSA4ID8gT0NUIDogSEVYKS50ZXN0KHBhcnQpKSByZXR1cm4gaW5wdXQ7XG4gICAgICBudW1iZXIgPSBwYXJzZUludChwYXJ0LCByYWRpeCk7XG4gICAgfVxuICAgIG51bWJlcnMucHVzaChudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IG51bWJlcnMucG9wKCk7XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaXB2NCArPSBudW1iZXJzW2luZGV4XSAqIHBvdygyNTYsIDMgLSBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIGlwdjQ7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hhciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hhckF0KHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgaWYgKGlucHV0LmNoYXJBdCgxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hhcigpKSB7XG4gICAgaWYgKHBpZWNlSW5kZXggPT0gOCkgcmV0dXJuO1xuICAgIGlmIChjaGFyKCkgPT0gJzonKSB7XG4gICAgICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIHBpZWNlSW5kZXgrKztcbiAgICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YWx1ZSA9IGxlbmd0aCA9IDA7XG4gICAgd2hpbGUgKGxlbmd0aCA8IDQgJiYgSEVYLnRlc3QoY2hhcigpKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDE2ICsgcGFyc2VJbnQoY2hhcigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNoYXIoKSA9PSAnLicpIHtcbiAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgcG9pbnRlciAtPSBsZW5ndGg7XG4gICAgICBpZiAocGllY2VJbmRleCA+IDYpIHJldHVybjtcbiAgICAgIG51bWJlcnNTZWVuID0gMDtcbiAgICAgIHdoaWxlIChjaGFyKCkpIHtcbiAgICAgICAgaXB2NFBpZWNlID0gbnVsbDtcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID4gMCkge1xuICAgICAgICAgIGlmIChjaGFyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghRElHSVQudGVzdChjaGFyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChESUdJVC50ZXN0KGNoYXIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaGFyKCksIDEwKTtcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID09PSBudWxsKSBpcHY0UGllY2UgPSBudW1iZXI7XG4gICAgICAgICAgZWxzZSBpZiAoaXB2NFBpZWNlID09IDApIHJldHVybjtcbiAgICAgICAgICBlbHNlIGlwdjRQaWVjZSA9IGlwdjRQaWVjZSAqIDEwICsgbnVtYmVyO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPiAyNTUpIHJldHVybjtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1twaWVjZUluZGV4XSA9IGFkZHJlc3NbcGllY2VJbmRleF0gKiAyNTYgKyBpcHY0UGllY2U7XG4gICAgICAgIG51bWJlcnNTZWVuKys7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA9PSAyIHx8IG51bWJlcnNTZWVuID09IDQpIHBpZWNlSW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXJzU2VlbiAhPSA0KSByZXR1cm47XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXIoKSA9PSAnOicpIHtcbiAgICAgIHBvaW50ZXIrKztcbiAgICAgIGlmICghY2hhcigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaGFyKCkpIHJldHVybjtcbiAgICBhZGRyZXNzW3BpZWNlSW5kZXgrK10gPSB2YWx1ZTtcbiAgfVxuICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHtcbiAgICBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzcztcbiAgICBwaWVjZUluZGV4ID0gNztcbiAgICB3aGlsZSAocGllY2VJbmRleCAhPSAwICYmIHN3YXBzID4gMCkge1xuICAgICAgc3dhcCA9IGFkZHJlc3NbcGllY2VJbmRleF07XG4gICAgICBhZGRyZXNzW3BpZWNlSW5kZXgtLV0gPSBhZGRyZXNzW2NvbXByZXNzICsgc3dhcHMgLSAxXTtcbiAgICAgIGFkZHJlc3NbY29tcHJlc3MgKyAtLXN3YXBzXSA9IHN3YXA7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBpZWNlSW5kZXggIT0gOCkgcmV0dXJuO1xuICByZXR1cm4gYWRkcmVzcztcbn07XG5cbnZhciBmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZSA9IGZ1bmN0aW9uIChpcHY2KSB7XG4gIHZhciBtYXhJbmRleCA9IG51bGw7XG4gIHZhciBtYXhMZW5ndGggPSAxO1xuICB2YXIgY3VyclN0YXJ0ID0gbnVsbDtcbiAgdmFyIGN1cnJMZW5ndGggPSAwO1xuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKDsgaW5kZXggPCA4OyBpbmRleCsrKSB7XG4gICAgaWYgKGlwdjZbaW5kZXhdICE9PSAwKSB7XG4gICAgICBpZiAoY3Vyckxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICAgICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGN1cnJTdGFydCA9IG51bGw7XG4gICAgICBjdXJyTGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJTdGFydCA9PT0gbnVsbCkgY3VyclN0YXJ0ID0gaW5kZXg7XG4gICAgICArK2N1cnJMZW5ndGg7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgbWF4SW5kZXggPSBjdXJyU3RhcnQ7XG4gICAgbWF4TGVuZ3RoID0gY3Vyckxlbmd0aDtcbiAgfVxuICByZXR1cm4gbWF4SW5kZXg7XG59O1xuXG52YXIgc2VyaWFsaXplSG9zdCA9IGZ1bmN0aW9uIChob3N0KSB7XG4gIHZhciByZXN1bHQsIGluZGV4LCBjb21wcmVzcywgaWdub3JlMDtcbiAgLy8gaXB2NFxuICBpZiAodHlwZW9mIGhvc3QgPT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChob3N0ICUgMjU2KTtcbiAgICAgIGhvc3QgPSBmbG9vcihob3N0IC8gMjU2KTtcbiAgICB9IHJldHVybiByZXN1bHQuam9pbignLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGhvc3RbaW5kZXhdLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKGluZGV4IDwgNykgcmVzdWx0ICs9ICc6JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdbJyArIHJlc3VsdCArICddJztcbiAgfSByZXR1cm4gaG9zdDtcbn07XG5cbnZhciBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0ID0ge307XG52YXIgZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcgJzogMSwgJ1wiJzogMSwgJzwnOiAxLCAnPic6IDEsICdgJzogMVxufSk7XG52YXIgcGF0aFBlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCwge1xuICAnIyc6IDEsICc/JzogMSwgJ3snOiAxLCAnfSc6IDFcbn0pO1xudmFyIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgcGF0aFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJy8nOiAxLCAnOic6IDEsICc7JzogMSwgJz0nOiAxLCAnQCc6IDEsICdbJzogMSwgJ1xcXFwnOiAxLCAnXSc6IDEsICdeJzogMSwgJ3wnOiAxXG59KTtcblxudmFyIHBlcmNlbnRFbmNvZGUgPSBmdW5jdGlvbiAoY2hhciwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNoYXIsIDApO1xuICByZXR1cm4gY29kZSA+IDB4MjAgJiYgY29kZSA8IDB4N0YgJiYgIWhhcyhzZXQsIGNoYXIpID8gY2hhciA6IGVuY29kZVVSSUNvbXBvbmVudChjaGFyKTtcbn07XG5cbnZhciBzcGVjaWFsU2NoZW1lcyA9IHtcbiAgZnRwOiAyMSxcbiAgZmlsZTogbnVsbCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDNcbn07XG5cbnZhciBpc1NwZWNpYWwgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiBoYXMoc3BlY2lhbFNjaGVtZXMsIHVybC5zY2hlbWUpO1xufTtcblxudmFyIGluY2x1ZGVzQ3JlZGVudGlhbHMgPSBmdW5jdGlvbiAodXJsKSB7XG4gIHJldHVybiB1cmwudXNlcm5hbWUgIT0gJycgfHwgdXJsLnBhc3N3b3JkICE9ICcnO1xufTtcblxudmFyIGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgcmV0dXJuICF1cmwuaG9zdCB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09ICdmaWxlJztcbn07XG5cbnZhciBpc1dpbmRvd3NEcml2ZUxldHRlciA9IGZ1bmN0aW9uIChzdHJpbmcsIG5vcm1hbGl6ZWQpIHtcbiAgdmFyIHNlY29uZDtcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KHN0cmluZy5jaGFyQXQoMCkpXG4gICAgJiYgKChzZWNvbmQgPSBzdHJpbmcuY2hhckF0KDEpKSA9PSAnOicgfHwgKCFub3JtYWxpemVkICYmIHNlY29uZCA9PSAnfCcpKTtcbn07XG5cbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmcuc2xpY2UoMCwgMikpICYmIChcbiAgICBzdHJpbmcubGVuZ3RoID09IDIgfHxcbiAgICAoKHRoaXJkID0gc3RyaW5nLmNoYXJBdCgyKSkgPT09ICcvJyB8fCB0aGlyZCA9PT0gJ1xcXFwnIHx8IHRoaXJkID09PSAnPycgfHwgdGhpcmQgPT09ICcjJylcbiAgKTtcbn07XG5cbnZhciBzaG9ydGVuVVJMc1BhdGggPSBmdW5jdGlvbiAodXJsKSB7XG4gIHZhciBwYXRoID0gdXJsLnBhdGg7XG4gIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICBpZiAocGF0aFNpemUgJiYgKHVybC5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgIHBhdGgucG9wKCk7XG4gIH1cbn07XG5cbnZhciBpc1NpbmdsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnJTJlJztcbn07XG5cbnZhciBpc0RvdWJsZURvdCA9IGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gIHNlZ21lbnQgPSBzZWdtZW50LnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xudmFyIHBhcnNlVVJMID0gZnVuY3Rpb24gKHVybCwgaW5wdXQsIHN0YXRlT3ZlcnJpZGUsIGJhc2UpIHtcbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gIHZhciBwb2ludGVyID0gMDtcbiAgdmFyIGJ1ZmZlciA9ICcnO1xuICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gIHZhciBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICB2YXIgc2VlblBhc3N3b3JkVG9rZW4gPSBmYWxzZTtcbiAgdmFyIGNvZGVQb2ludHMsIGNoYXIsIGJ1ZmZlckNvZGVQb2ludHMsIGZhaWx1cmU7XG5cbiAgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgIHVybC51c2VybmFtZSA9ICcnO1xuICAgIHVybC5wYXNzd29yZCA9ICcnO1xuICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICB1cmwucG9ydCA9IG51bGw7XG4gICAgdXJsLnBhdGggPSBbXTtcbiAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgIHVybC5mcmFnbWVudCA9IG51bGw7XG4gICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSBmYWxzZTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICB9XG5cbiAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKGlucHV0KTtcblxuICB3aGlsZSAocG9pbnRlciA8PSBjb2RlUG9pbnRzLmxlbmd0aCkge1xuICAgIGNoYXIgPSBjb2RlUG9pbnRzW3BvaW50ZXJdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICBpZiAoY2hhciAmJiBBTFBIQS50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgIGlmIChjaGFyICYmIChBTFBIQU5VTUVSSUMudGVzdChjaGFyKSB8fCBjaGFyID09ICcrJyB8fCBjaGFyID09ICctJyB8fCBjaGFyID09ICcuJykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gY2hhci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJzonKSB7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgKFxuICAgICAgICAgICAgKGlzU3BlY2lhbCh1cmwpICE9IGhhcyhzcGVjaWFsU2NoZW1lcywgYnVmZmVyKSkgfHxcbiAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSB8fFxuICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICApKSByZXR1cm47XG4gICAgICAgICAgdXJsLnNjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgc3RhdGUgPSBGSUxFO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkgJiYgYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSB1cmwuc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICBzdGF0ZSA9IENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBOT19TQ0hFTUU7XG4gICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIE5PX1NDSEVNRTpcbiAgICAgICAgaWYgKCFiYXNlIHx8IChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgIGlmIChiYXNlLmNhbm5vdEJlQUJhc2VVUkwgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnID8gRklMRSA6IFJFTEFUSVZFO1xuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nICYmIGNvZGVQb2ludHNbcG9pbnRlciArIDFdID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgIGlmIChjaGFyID09ICcvJykge1xuICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnLycgfHwgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSkge1xuICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkVfU0xBU0g7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgdXJsLnBhdGggPSBiYXNlLnBhdGguc2xpY2UoKTtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgIHVybC5wYXRoLnBvcCgpO1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBSRUxBVElWRV9TTEFTSDpcbiAgICAgICAgaWYgKGlzU3BlY2lhbCh1cmwpICYmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykpIHtcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJy8nKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOlxuICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICBpZiAoY2hhciAhPSAnLycgfHwgYnVmZmVyLmNoYXJBdChwb2ludGVyICsgMSkgIT0gJy8nKSBjb250aW51ZTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUzpcbiAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBBVVRIT1JJVFk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgQVVUSE9SSVRZOlxuICAgICAgICBpZiAoY2hhciA9PSAnQCcpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSBidWZmZXIgPSAnJTQwJyArIGJ1ZmZlcjtcbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGJ1ZmZlckNvZGVQb2ludHMgPSBhcnJheUZyb20oYnVmZmVyKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlckNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSAnOicgJiYgIXNlZW5QYXNzd29yZFRva2VuKSB7XG4gICAgICAgICAgICAgIHNlZW5QYXNzd29yZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZW5jb2RlZENvZGVQb2ludHMgPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludCwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgZWxzZSB1cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJz8nIHx8IGNoYXIgPT0gJyMnIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgIHBvaW50ZXIgLT0gYXJyYXlGcm9tKGJ1ZmZlcikubGVuZ3RoICsgMTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgIH0gZWxzZSBidWZmZXIgKz0gY2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSE9TVDpcbiAgICAgIGNhc2UgSE9TVE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PSAnOicgJiYgIXNlZW5CcmFja2V0KSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICBmYWlsdXJlID0gcGFyc2VIb3N0KHVybCwgYnVmZmVyKTtcbiAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBQT1JUO1xuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlID09IEhPU1ROQU1FKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpc1NwZWNpYWwodXJsKSAmJiBidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUgJiYgYnVmZmVyID09ICcnICYmIChpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkgfHwgdXJsLnBvcnQgIT09IG51bGwpKSByZXR1cm47XG4gICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGFyID09ICdbJykgc2VlbkJyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJ10nKSBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIFBPUlQ6XG4gICAgICAgIGlmIChESUdJVC50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycgfHxcbiAgICAgICAgICAoY2hhciA9PSAnXFxcXCcgJiYgaXNTcGVjaWFsKHVybCkpIHx8XG4gICAgICAgICAgc3RhdGVPdmVycmlkZVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICB2YXIgcG9ydCA9IHBhcnNlSW50KGJ1ZmZlciwgMTApO1xuICAgICAgICAgICAgaWYgKHBvcnQgPiAweEZGRkYpIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgICAgICB1cmwucG9ydCA9IChpc1NwZWNpYWwodXJsKSAmJiBwb3J0ID09PSBzcGVjaWFsU2NoZW1lc1t1cmwuc2NoZW1lXSkgPyBudWxsIDogcG9ydDtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBJTlZBTElEX1BPUlQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZJTEU6XG4gICAgICAgIHVybC5zY2hlbWUgPSAnZmlsZSc7XG4gICAgICAgIGlmIChjaGFyID09ICcvJyB8fCBjaGFyID09ICdcXFxcJykgc3RhdGUgPSBGSUxFX1NMQVNIO1xuICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgIGlmIChjaGFyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYmFzZS5wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZS5xdWVyeTtcbiAgICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgICBzaG9ydGVuVVJMc1BhdGgodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgaWYgKGNoYXIgPT0gJy8nIHx8IGNoYXIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgc3RhdGUgPSBGSUxFX0hPU1Q7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gJ2ZpbGUnICYmICFzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGNvZGVQb2ludHMuc2xpY2UocG9pbnRlcikuam9pbignJykpKSB7XG4gICAgICAgICAgaWYgKGlzV2luZG93c0RyaXZlTGV0dGVyKGJhc2UucGF0aFswXSwgdHJ1ZSkpIHVybC5wYXRoLnB1c2goYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICBlbHNlIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIGNhc2UgRklMRV9IT1NUOlxuICAgICAgICBpZiAoY2hhciA9PSBFT0YgfHwgY2hhciA9PSAnLycgfHwgY2hhciA9PSAnXFxcXCcgfHwgY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyID09ICcnKSB7XG4gICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZSA9IHBhcnNlSG9zdCh1cmwsIGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBpZiAodXJsLmhvc3QgPT0gJ2xvY2FsaG9zdCcpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgfSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICBpZiAoaXNTcGVjaWFsKHVybCkpIHtcbiAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgaWYgKGNoYXIgIT0gJy8nICYmIGNoYXIgIT0gJ1xcXFwnKSBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICc/Jykge1xuICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hhciA9PSAnIycpIHtcbiAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgIT0gRU9GKSB7XG4gICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgIGlmIChjaGFyICE9ICcvJykgY29udGludWU7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUEFUSDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoYXIgPT0gRU9GIHx8IGNoYXIgPT0gJy8nIHx8XG4gICAgICAgICAgKGNoYXIgPT0gJ1xcXFwnICYmIGlzU3BlY2lhbCh1cmwpKSB8fFxuICAgICAgICAgICghc3RhdGVPdmVycmlkZSAmJiAoY2hhciA9PSAnPycgfHwgY2hhciA9PSAnIycpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoaXNEb3VibGVEb3QoYnVmZmVyKSkge1xuICAgICAgICAgICAgc2hvcnRlblVSTHNQYXRoKHVybCk7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdChidWZmZXIpKSB7XG4gICAgICAgICAgICBpZiAoY2hhciAhPSAnLycgJiYgIShjaGFyID09ICdcXFxcJyAmJiBpc1NwZWNpYWwodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsLnBhdGgucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKHVybC5ob3N0KSB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuY2hhckF0KDApICsgJzonOyAvLyBub3JtYWxpemUgd2luZG93cyBkcml2ZSBsZXR0ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybC5wYXRoLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmIChjaGFyID09IEVPRiB8fCBjaGFyID09ICc/JyB8fCBjaGFyID09ICcjJykpIHtcbiAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICB1cmwucGF0aC5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSBRVUVSWTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNoYXIsIHBhdGhQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICBpZiAoY2hhciA9PSAnPycpIHtcbiAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB7XG4gICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyICE9IEVPRikge1xuICAgICAgICAgIHVybC5wYXRoWzBdICs9IHBlcmNlbnRFbmNvZGUoY2hhciwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgUVVFUlk6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaGFyID09ICcjJykge1xuICAgICAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciAhPSBFT0YpIHtcbiAgICAgICAgICBpZiAoY2hhciA9PSBcIidcIiAmJiBpc1NwZWNpYWwodXJsKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyMnKSB1cmwucXVlcnkgKz0gJyUyMyc7XG4gICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaGFyLCBDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgaWYgKGNoYXIgIT0gRU9GKSB1cmwuZnJhZ21lbnQgKz0gcGVyY2VudEVuY29kZShjaGFyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBwb2ludGVyKys7XG4gIH1cbn07XG5cbi8vIGBVUkxgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1jbGFzc1xudmFyIFVSTENvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMKHVybCAvKiAsIGJhc2UgKi8pIHtcbiAgdmFyIHRoYXQgPSBhbkluc3RhbmNlKHRoaXMsIFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG4gIHZhciBiYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciB1cmxTdHJpbmcgPSBTdHJpbmcodXJsKTtcbiAgdmFyIHN0YXRlID0gc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7IHR5cGU6ICdVUkwnIH0pO1xuICB2YXIgYmFzZVN0YXRlLCBmYWlsdXJlO1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBVUkxDb25zdHJ1Y3RvcikgYmFzZVN0YXRlID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZShiYXNlKTtcbiAgICBlbHNlIHtcbiAgICAgIGZhaWx1cmUgPSBwYXJzZVVSTChiYXNlU3RhdGUgPSB7fSwgU3RyaW5nKGJhc2UpKTtcbiAgICAgIGlmIChmYWlsdXJlKSB0aHJvdyBUeXBlRXJyb3IoZmFpbHVyZSk7XG4gICAgfVxuICB9XG4gIGZhaWx1cmUgPSBwYXJzZVVSTChzdGF0ZSwgdXJsU3RyaW5nLCBudWxsLCBiYXNlU3RhdGUpO1xuICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICB2YXIgc2VhcmNoUGFyYW1zID0gc3RhdGUuc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICB2YXIgc2VhcmNoUGFyYW1zU3RhdGUgPSBnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHNlYXJjaFBhcmFtcyk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVNlYXJjaFBhcmFtcyhzdGF0ZS5xdWVyeSk7XG4gIHNlYXJjaFBhcmFtc1N0YXRlLnVwZGF0ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzdGF0ZS5xdWVyeSA9IFN0cmluZyhzZWFyY2hQYXJhbXMpIHx8IG51bGw7XG4gIH07XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGF0LmhyZWYgPSBzZXJpYWxpemVVUkwuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lm9yaWdpbiA9IGdldE9yaWdpbi5jYWxsKHRoYXQpO1xuICAgIHRoYXQucHJvdG9jb2wgPSBnZXRQcm90b2NvbC5jYWxsKHRoYXQpO1xuICAgIHRoYXQudXNlcm5hbWUgPSBnZXRVc2VybmFtZS5jYWxsKHRoYXQpO1xuICAgIHRoYXQucGFzc3dvcmQgPSBnZXRQYXNzd29yZC5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaG9zdCA9IGdldEhvc3QuY2FsbCh0aGF0KTtcbiAgICB0aGF0Lmhvc3RuYW1lID0gZ2V0SG9zdG5hbWUuY2FsbCh0aGF0KTtcbiAgICB0aGF0LnBvcnQgPSBnZXRQb3J0LmNhbGwodGhhdCk7XG4gICAgdGhhdC5wYXRobmFtZSA9IGdldFBhdGhuYW1lLmNhbGwodGhhdCk7XG4gICAgdGhhdC5zZWFyY2ggPSBnZXRTZWFyY2guY2FsbCh0aGF0KTtcbiAgICB0aGF0LnNlYXJjaFBhcmFtcyA9IGdldFNlYXJjaFBhcmFtcy5jYWxsKHRoYXQpO1xuICAgIHRoYXQuaGFzaCA9IGdldEhhc2guY2FsbCh0aGF0KTtcbiAgfVxufTtcblxudmFyIFVSTFByb3RvdHlwZSA9IFVSTENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxudmFyIHNlcmlhbGl6ZVVSTCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gIHZhciBwYXNzd29yZCA9IHVybC5wYXNzd29yZDtcbiAgdmFyIGhvc3QgPSB1cmwuaG9zdDtcbiAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgdmFyIHF1ZXJ5ID0gdXJsLnF1ZXJ5O1xuICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gIHZhciBvdXRwdXQgPSBzY2hlbWUgKyAnOic7XG4gIGlmIChob3N0ICE9PSBudWxsKSB7XG4gICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgaWYgKGluY2x1ZGVzQ3JlZGVudGlhbHModXJsKSkge1xuICAgICAgb3V0cHV0ICs9IHVzZXJuYW1lICsgKHBhc3N3b3JkID8gJzonICsgcGFzc3dvcmQgOiAnJykgKyAnQCc7XG4gICAgfVxuICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgIGlmIChwb3J0ICE9PSBudWxsKSBvdXRwdXQgKz0gJzonICsgcG9ydDtcbiAgfSBlbHNlIGlmIChzY2hlbWUgPT0gJ2ZpbGUnKSBvdXRwdXQgKz0gJy8vJztcbiAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbiAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gIGlmIChmcmFnbWVudCAhPT0gbnVsbCkgb3V0cHV0ICs9ICcjJyArIGZyYWdtZW50O1xuICByZXR1cm4gb3V0cHV0O1xufTtcblxudmFyIGdldE9yaWdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBzY2hlbWUgPSB1cmwuc2NoZW1lO1xuICB2YXIgcG9ydCA9IHVybC5wb3J0O1xuICBpZiAoc2NoZW1lID09ICdibG9iJykgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTChzY2hlbWUucGF0aFswXSkub3JpZ2luO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cbiAgaWYgKHNjaGVtZSA9PSAnZmlsZScgfHwgIWlzU3BlY2lhbCh1cmwpKSByZXR1cm4gJ251bGwnO1xuICByZXR1cm4gc2NoZW1lICsgJzovLycgKyBzZXJpYWxpemVIb3N0KHVybC5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbn07XG5cbnZhciBnZXRQcm90b2NvbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2NoZW1lICsgJzonO1xufTtcblxudmFyIGdldFVzZXJuYW1lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZTtcbn07XG5cbnZhciBnZXRQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykucGFzc3dvcmQ7XG59O1xuXG52YXIgZ2V0SG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gdXJsLnBvcnQ7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJydcbiAgICA6IHBvcnQgPT09IG51bGwgPyBzZXJpYWxpemVIb3N0KGhvc3QpXG4gICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbn07XG5cbnZhciBnZXRIb3N0bmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLmhvc3Q7XG4gIHJldHVybiBob3N0ID09PSBudWxsID8gJycgOiBzZXJpYWxpemVIb3N0KGhvc3QpO1xufTtcblxudmFyIGdldFBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3J0ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wb3J0O1xuICByZXR1cm4gcG9ydCA9PT0gbnVsbCA/ICcnIDogU3RyaW5nKHBvcnQpO1xufTtcblxudmFyIGdldFBhdGhuYW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgdmFyIHBhdGggPSB1cmwucGF0aDtcbiAgcmV0dXJuIHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgcGF0aC5qb2luKCcvJykgOiAnJztcbn07XG5cbnZhciBnZXRTZWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxdWVyeSA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcykucXVlcnk7XG4gIHJldHVybiBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJyc7XG59O1xuXG52YXIgZ2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5zZWFyY2hQYXJhbXM7XG59O1xuXG52YXIgZ2V0SGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZyYWdtZW50ID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5mcmFnbWVudDtcbiAgcmV0dXJuIGZyYWdtZW50ID8gJyMnICsgZnJhZ21lbnQgOiAnJztcbn07XG5cbnZhciBhY2Nlc3NvckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIHsgZ2V0OiBnZXR0ZXIsIHNldDogc2V0dGVyLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICBkZWZpbmVQcm9wZXJ0aWVzKFVSTFByb3RvdHlwZSwge1xuICAgIC8vIGBVUkwucHJvdG90eXBlLmhyZWZgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgICBocmVmOiBhY2Nlc3NvckRlc2NyaXB0b3Ioc2VyaWFsaXplVVJMLCBmdW5jdGlvbiAoaHJlZikge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgdXJsU3RyaW5nID0gU3RyaW5nKGhyZWYpO1xuICAgICAgdmFyIGZhaWx1cmUgPSBwYXJzZVVSTCh1cmwsIHVybFN0cmluZyk7XG4gICAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgICAgZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZSh1cmwuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXModXJsLnF1ZXJ5KTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5vcmlnaW5gIGdldHRlclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgICBvcmlnaW46IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnByb3RvY29sYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wcm90b2NvbFxuICAgIHByb3RvY29sOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UHJvdG9jb2wsIGZ1bmN0aW9uIChwcm90b2NvbCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBwYXJzZVVSTCh1cmwsIFN0cmluZyhwcm90b2NvbCkgKyAnOicsIFNDSEVNRV9TVEFSVCk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUudXNlcm5hbWVgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXVzZXJuYW1lXG4gICAgdXNlcm5hbWU6IGFjY2Vzc29yRGVzY3JpcHRvcihnZXRVc2VybmFtZSwgZnVuY3Rpb24gKHVzZXJuYW1lKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKFN0cmluZyh1c2VybmFtZSkpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICB1cmwudXNlcm5hbWUgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cmwudXNlcm5hbWUgKz0gcGVyY2VudEVuY29kZShjb2RlUG9pbnRzW2ldLCB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBhc3N3b3JkYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICAgIHBhc3N3b3JkOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UGFzc3dvcmQsIGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICB2YXIgY29kZVBvaW50cyA9IGFycmF5RnJvbShTdHJpbmcocGFzc3dvcmQpKTtcbiAgICAgIGlmIChjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQodXJsKSkgcmV0dXJuO1xuICAgICAgdXJsLnBhc3N3b3JkID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpXSwgdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0XG4gICAgaG9zdDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhvc3QsIGZ1bmN0aW9uIChob3N0KSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGlmICh1cmwuY2Fubm90QmVBQmFzZVVSTCkgcmV0dXJuO1xuICAgICAgcGFyc2VVUkwodXJsLCBTdHJpbmcoaG9zdCksIEhPU1QpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLmhvc3RuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1ob3N0bmFtZVxuICAgIGhvc3RuYW1lOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsIGZ1bmN0aW9uIChob3N0bmFtZSkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBpZiAodXJsLmNhbm5vdEJlQUJhc2VVUkwpIHJldHVybjtcbiAgICAgIHBhcnNlVVJMKHVybCwgU3RyaW5nKGhvc3RuYW1lKSwgSE9TVE5BTUUpO1xuICAgIH0pLFxuICAgIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXBvcnRcbiAgICBwb3J0OiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0UG9ydCwgZnVuY3Rpb24gKHBvcnQpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCh1cmwpKSByZXR1cm47XG4gICAgICBwb3J0ID0gU3RyaW5nKHBvcnQpO1xuICAgICAgaWYgKHBvcnQgPT0gJycpIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIGVsc2UgcGFyc2VVUkwodXJsLCBwb3J0LCBQT1JUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5wYXRobmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgICBwYXRobmFtZTogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFBhdGhuYW1lLCBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICAgIHZhciB1cmwgPSBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1xuICAgICAgaWYgKHVybC5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgICB1cmwucGF0aCA9IFtdO1xuICAgICAgcGFyc2VVUkwodXJsLCBwYXRobmFtZSArICcnLCBQQVRIX1NUQVJUKTtcbiAgICB9KSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5zZWFyY2hgIGFjY2Vzc29ycyBwYWlyXG4gICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXNlYXJjaFxuICAgIHNlYXJjaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldFNlYXJjaCwgZnVuY3Rpb24gKHNlYXJjaCkge1xuICAgICAgdmFyIHVybCA9IGdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XG4gICAgICBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoKTtcbiAgICAgIGlmIChzZWFyY2ggPT0gJycpIHtcbiAgICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgnPycgPT0gc2VhcmNoLmNoYXJBdCgwKSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgcGFyc2VVUkwodXJsLCBzZWFyY2gsIFFVRVJZKTtcbiAgICAgIH1cbiAgICAgIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUodXJsLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHVybC5xdWVyeSk7XG4gICAgfSksXG4gICAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoUGFyYW1zYCBnZXR0ZXJcbiAgICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gICAgc2VhcmNoUGFyYW1zOiBhY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoUGFyYW1zKSxcbiAgICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAgIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gICAgaGFzaDogYWNjZXNzb3JEZXNjcmlwdG9yKGdldEhhc2gsIGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICB2YXIgdXJsID0gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtcbiAgICAgIGhhc2ggPSBTdHJpbmcoaGFzaCk7XG4gICAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgICB1cmwuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJyMnID09IGhhc2guY2hhckF0KDApKSBoYXNoID0gaGFzaC5zbGljZSgxKTtcbiAgICAgIHVybC5mcmFnbWVudCA9ICcnO1xuICAgICAgcGFyc2VVUkwodXJsLCBoYXNoLCBGUkFHTUVOVCk7XG4gICAgfSlcbiAgfSk7XG59XG5cbi8vIGBVUkwucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdG9qc29uXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKTtcbn0sIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLy8gYFVSTC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNVUkwtc3RyaW5naWZpY2F0aW9uLWJlaGF2aW9yXG5yZWRlZmluZShVUkxQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlQ3JlYXRlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ2NyZWF0ZU9iamVjdFVSTCcsIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTChibG9iKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTC5hcHBseShOYXRpdmVVUkwsIGFyZ3VtZW50cyk7XG4gIH0pO1xuICAvLyBgVVJMLnJldm9rZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvcmV2b2tlT2JqZWN0VVJMXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBpZiAobmF0aXZlUmV2b2tlT2JqZWN0VVJMKSByZWRlZmluZShVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGZ1bmN0aW9uIHJldm9rZU9iamVjdFVSTCh1cmwpIHtcbiAgICByZXR1cm4gbmF0aXZlUmV2b2tlT2JqZWN0VVJMLmFwcGx5KE5hdGl2ZVVSTCwgYXJndW1lbnRzKTtcbiAgfSk7XG59XG5cbnNldFRvU3RyaW5nVGFnKFVSTENvbnN0cnVjdG9yLCAnVVJMJyk7XG5cbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xuXG4vLyBgVVJMLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXRvanNvblxuJCh7IHRhcmdldDogJ1VSTCcsIHByb3RvOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH0sIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIFVSTC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5hcnJheS5pcy10ZW1wbGF0ZS1vYmplY3QnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaW5kZXgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LmFycmF5Lmxhc3QtaXRlbScpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLmdyb3VwLWJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAua2V5LWJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZGVsZXRlLWFsbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZmlsdGVyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLmZpbmQta2V5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hcC5rZXktb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tYXAta2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLm1hcC12YWx1ZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hcC5tZXJnZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLnJlZHVjZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLnNvbWUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cGRhdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5hZGQtYWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZGVsZXRlLWFsbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc2V0LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZmlsdGVyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc2V0LmpvaW4nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5zb21lJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5kZWxldGUtYWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5hZGQtYWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLXNldC5kZWxldGUtYWxsJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXAuZnJvbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuZnJvbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc2V0Lm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5mcm9tJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC53ZWFrLW1hcC5vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQuZnJvbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQud2Vhay1zZXQub2YnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hdGguaWFkZGgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hdGguaXN1YmgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hdGgudW11bGgnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lmdsb2JhbC10aGlzJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbiIsInJlcXVpcmUoJy4uL3N0YWdlJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuYXMtaW5kZXhlZC1wYWlycycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZHJvcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZXZlcnknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZpbHRlcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IuZmxhdC1tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLmZvci1lYWNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5mcm9tJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5hc3luYy1pdGVyYXRvci5tYXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LmFzeW5jLWl0ZXJhdG9yLnJlZHVjZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3Iuc29tZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IudGFrZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuYXN5bmMtaXRlcmF0b3IudG8tYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5hcy1pbmRleGVkLXBhaXJzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5kcm9wJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5ldmVyeScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mbGF0LW1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZm9yLWVhY2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZyb20nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5zb21lJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50YWtlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci50by1hcnJheScpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLWtleScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuY29tcG9zaXRlLXN5bWJvbCcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RodW1ic3VwZXAvcHJvcG9zYWwtdXBzZXJ0XG4vLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWFwLnVwZGF0ZS1vci1pbnNlcnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm1hcC51cHNlcnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LndlYWstbWFwLnVwc2VydCcpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5jbGFtcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5kZWctcGVyLXJhZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5kZWdyZWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLmZzY2FsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5yYWQtcGVyLWRlZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5yYWRpYW5zJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnNjYWxlJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5tYXRoLnNpZ25iaXQnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0Lm51bWJlci5mcm9tLXN0cmluZycpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtZW50cmllcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUta2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQub2JqZWN0Lml0ZXJhdGUtdmFsdWVzJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wub2JzZXJ2YWJsZScpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnBhdHRlcm4tbWF0Y2gnKTtcbiIsIi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYW55Jyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeScpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5oYXMtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YScpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQubWF0aC5zZWVkZWQtcHJuZycpO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc2V0LmRpZmZlcmVuY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5pbnRlcnNlY3Rpb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC5pcy1kaXNqb2ludC1mcm9tJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3Vic2V0LW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zZXQuaXMtc3VwZXJzZXQtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnNldC51bmlvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zdHJpbmcuYXQnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnN0cmluZy5jb2RlLXBvaW50cycpO1xuIiwiLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnN0cmluZy5tYXRjaC1hbGwnKTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnN0cmluZy5yZXBsYWNlLWFsbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnJlcGxhY2UtYWxsJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi51cmwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC50by1qc29uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcycpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtdXNpbmctc3RhdGVtZW50XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuYXN5bmMtZGlzcG9zZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmRpc3Bvc2UnKTtcbiIsInJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9lZmZpY2llbnQtNjQtYml0LWFyaXRobWV0aWMnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9zdHJpbmctYXQnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy91cmwnKTtcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLzEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCJyZXF1aXJlKCcuLi9wcm9wb3NhbHMvYXJyYXktbGFzdCcpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL2NvbGxlY3Rpb24tbWV0aG9kcycpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL2NvbGxlY3Rpb24tb2YtZnJvbScpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL2tleXMtY29tcG9zaXRpb24nKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9tYXRoLWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9tYXRoLXNpZ25iaXQnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9udW1iZXItZnJvbS1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9vYmplY3QtaXRlcmF0aW9uJyk7XG5yZXF1aXJlKCcuLi9wcm9wb3NhbHMvb2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL3BhdHRlcm4tbWF0Y2hpbmcnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9wcm9taXNlLXRyeScpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL3NlZWRlZC1yYW5kb20nKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9zdHJpbmctY29kZS1wb2ludHMnKTtcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLzInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCJyZXF1aXJlKCcuLi9wcm9wb3NhbHMvYXJyYXktaXMtdGVtcGxhdGUtb2JqZWN0Jyk7XG5yZXF1aXJlKCcuLi9wcm9wb3NhbHMvaXRlcmF0b3ItaGVscGVycycpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL21hcC11cHNlcnQnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9zZXQtbWV0aG9kcycpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL3VzaW5nLXN0YXRlbWVudCcpO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4vMycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsInJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9wcm9taXNlLWFueScpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL3N0cmluZy1yZXBsYWNlLWFsbCcpO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4vNCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsInJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9nbG9iYWwtdGhpcycpO1xucmVxdWlyZSgnLi4vcHJvcG9zYWxzL3Byb21pc2UtYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9zdHJpbmctbWF0Y2gtYWxsJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aDtcbiIsInZhciBwcm9wb3NhbHMgPSByZXF1aXJlKCcuL3ByZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3Bvc2FscztcbiIsInJlcXVpcmUoJy4uL3Byb3Bvc2Fscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi8wJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmltbWVkaWF0ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIucXVldWUtbWljcm90YXNrJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudXJsLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG5cbiAgICAgICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgIGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtOyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsZWZ0bW9zdCBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtO1xuXG4gICAgZG8ge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmIChsb2NhbGx5SW5zaWRlKHAsIGhvbGUpICYmXG4gICAgICAgICAgICAgICAgKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgKHAueCA+IG0ueCB8fCAocC54ID09PSBtLnggJiYgc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkpKSkpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdG9wKTtcblxuICAgIHJldHVybiBtO1xufVxuXG4vLyB3aGV0aGVyIHNlY3RvciBpbiB2ZXJ0ZXggbSBjb250YWlucyBzZWN0b3IgaW4gdmVydGV4IHAgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXNcbmZ1bmN0aW9uIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApIHtcbiAgICByZXR1cm4gYXJlYShtLnByZXYsIG0sIHAucHJldikgPCAwICYmIGFyZWEocC5uZXh0LCBtLCBtLm5leHQpIDwgMDtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgKiBpbnZTaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgKiBpbnZTaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCB8fCAocC54ID09PSBsZWZ0bW9zdC54ICYmIHAueSA8IGxlZnRtb3N0LnkpKSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiYgLy8gZG9uZXMndCBpbnRlcnNlY3Qgb3RoZXIgZWRnZXNcbiAgICAgICAgICAgKGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYikgJiYgLy8gbG9jYWxseSB2aXNpYmxlXG4gICAgICAgICAgICAoYXJlYShhLnByZXYsIGEsIGIucHJldikgfHwgYXJlYShhLCBiLnByZXYsIGIpKSB8fCAvLyBkb2VzIG5vdCBjcmVhdGUgb3Bwb3NpdGUtZmFjaW5nIHNlY3RvcnNcbiAgICAgICAgICAgIGVxdWFscyhhLCBiKSAmJiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA+IDAgJiYgYXJlYShiLnByZXYsIGIsIGIubmV4dCkgPiAwKTsgLy8gc3BlY2lhbCB6ZXJvLWxlbmd0aCBjYXNlXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgdmFyIG8xID0gc2lnbihhcmVhKHAxLCBxMSwgcDIpKTtcbiAgICB2YXIgbzIgPSBzaWduKGFyZWEocDEsIHExLCBxMikpO1xuICAgIHZhciBvMyA9IHNpZ24oYXJlYShwMiwgcTIsIHAxKSk7XG4gICAgdmFyIG80ID0gc2lnbihhcmVhKHAyLCBxMiwgcTEpKTtcblxuICAgIGlmIChvMSAhPT0gbzIgJiYgbzMgIT09IG80KSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXG5cbiAgICBpZiAobzEgPT09IDAgJiYgb25TZWdtZW50KHAxLCBwMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29sbGluZWFyIGFuZCBwMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzIgPT09IDAgJiYgb25TZWdtZW50KHAxLCBxMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBxMiBhcmUgY29sbGluZWFyIGFuZCBxMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzMgPT09IDAgJiYgb25TZWdtZW50KHAyLCBwMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcbiAgICBpZiAobzQgPT09IDAgJiYgb25TZWdtZW50KHAyLCBxMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29sbGluZWFyIGFuZCBxMSBsaWVzIG9uIHAycTJcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZm9yIGNvbGxpbmVhciBwb2ludHMgcCwgcSwgciwgY2hlY2sgaWYgcG9pbnQgcSBsaWVzIG9uIHNlZ21lbnQgcHJcbmZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7XG4gICAgcmV0dXJuIHEueCA8PSBNYXRoLm1heChwLngsIHIueCkgJiYgcS54ID49IE1hdGgubWluKHAueCwgci54KSAmJiBxLnkgPD0gTWF0aC5tYXgocC55LCByLnkpICYmIHEueSA+PSBNYXRoLm1pbihwLnksIHIueSk7XG59XG5cbmZ1bmN0aW9uIHNpZ24obnVtKSB7XG4gICAgcmV0dXJuIG51bSA+IDAgPyAxIDogbnVtIDwgMCA/IC0xIDogMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuICAgICAgICAgICAgICAgIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxuICAgICAgICBiMiA9IG5ldyBOb2RlKGIuaSwgYi54LCBiLnkpLFxuICAgICAgICBhbiA9IGEubmV4dCxcbiAgICAgICAgYnAgPSBiLnByZXY7XG5cbiAgICBhLm5leHQgPSBiO1xuICAgIGIucHJldiA9IGE7XG5cbiAgICBhMi5uZXh0ID0gYW47XG4gICAgYW4ucHJldiA9IGEyO1xuXG4gICAgYjIubmV4dCA9IGEyO1xuICAgIGEyLnByZXYgPSBiMjtcblxuICAgIGJwLm5leHQgPSBiMjtcbiAgICBiMi5wcmV2ID0gYnA7XG5cbiAgICByZXR1cm4gYjI7XG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcbiAgICB2YXIgcCA9IG5ldyBOb2RlKGksIHgsIHkpO1xuXG4gICAgaWYgKCFsYXN0KSB7XG4gICAgICAgIHAucHJldiA9IHA7XG4gICAgICAgIHAubmV4dCA9IHA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XG4gICAgICAgIHAucHJldiA9IGxhc3Q7XG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2Wjtcbn1cblxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XG4gICAgLy8gdmVydGV4IGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIihmdW5jdGlvbihnbG9iYWwpe1xuXG4vL1xuLy8gQ2hlY2sgZm9yIG5hdGl2ZSBQcm9taXNlIGFuZCBpdCBoYXMgY29ycmVjdCBpbnRlcmZhY2Vcbi8vXG5cbnZhciBOYXRpdmVQcm9taXNlID0gZ2xvYmFsWydQcm9taXNlJ107XG52YXIgbmF0aXZlUHJvbWlzZVN1cHBvcnRlZCA9XG4gIE5hdGl2ZVByb21pc2UgJiZcbiAgLy8gU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBtaXNzaW5nIGZyb21cbiAgLy8gRmlyZWZveC9DaHJvbWUgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uc1xuICAncmVzb2x2ZScgaW4gTmF0aXZlUHJvbWlzZSAmJlxuICAncmVqZWN0JyBpbiBOYXRpdmVQcm9taXNlICYmXG4gICdhbGwnIGluIE5hdGl2ZVByb21pc2UgJiZcbiAgJ3JhY2UnIGluIE5hdGl2ZVByb21pc2UgJiZcbiAgLy8gT2xkZXIgdmVyc2lvbiBvZiB0aGUgc3BlYyBoYWQgYSByZXNvbHZlciBvYmplY3RcbiAgLy8gYXMgdGhlIGFyZyByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uXG4gIChmdW5jdGlvbigpe1xuICAgIHZhciByZXNvbHZlO1xuICAgIG5ldyBOYXRpdmVQcm9taXNlKGZ1bmN0aW9uKHIpeyByZXNvbHZlID0gcjsgfSk7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlID09PSAnZnVuY3Rpb24nO1xuICB9KSgpO1xuXG5cbi8vXG4vLyBleHBvcnQgaWYgbmVjZXNzYXJ5XG4vL1xuXG5pZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnICYmIGV4cG9ydHMpXG57XG4gIC8vIG5vZGUuanNcbiAgZXhwb3J0cy5Qcm9taXNlID0gbmF0aXZlUHJvbWlzZVN1cHBvcnRlZCA/IE5hdGl2ZVByb21pc2UgOiBQcm9taXNlO1xuICBleHBvcnRzLlBvbHlmaWxsID0gUHJvbWlzZTtcbn1cbmVsc2VcbntcbiAgLy8gQU1EXG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcbiAge1xuICAgIGRlZmluZShmdW5jdGlvbigpe1xuICAgICAgcmV0dXJuIG5hdGl2ZVByb21pc2VTdXBwb3J0ZWQgPyBOYXRpdmVQcm9taXNlIDogUHJvbWlzZTtcbiAgICB9KTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICAvLyBpbiBicm93c2VyIGFkZCB0byBnbG9iYWxcbiAgICBpZiAoIW5hdGl2ZVByb21pc2VTdXBwb3J0ZWQpXG4gICAgICBnbG9iYWxbJ1Byb21pc2UnXSA9IFByb21pc2U7XG4gIH1cbn1cblxuXG4vL1xuLy8gUG9seWZpbGxcbi8vXG5cbnZhciBQRU5ESU5HID0gJ3BlbmRpbmcnO1xudmFyIFNFQUxFRCA9ICdzZWFsZWQnO1xudmFyIEZVTEZJTExFRCA9ICdmdWxmaWxsZWQnO1xudmFyIFJFSkVDVEVEID0gJ3JlamVjdGVkJztcbnZhciBOT09QID0gZnVuY3Rpb24oKXt9O1xuXG5mdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vLyBhc3luYyBjYWxsc1xudmFyIGFzeW5jU2V0VGltZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IHNldFRpbWVvdXQ7XG52YXIgYXN5bmNRdWV1ZSA9IFtdO1xudmFyIGFzeW5jVGltZXI7XG5cbmZ1bmN0aW9uIGFzeW5jRmx1c2goKXtcbiAgLy8gcnVuIHByb21pc2UgY2FsbGJhY2tzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXN5bmNRdWV1ZS5sZW5ndGg7IGkrKylcbiAgICBhc3luY1F1ZXVlW2ldWzBdKGFzeW5jUXVldWVbaV1bMV0pO1xuXG4gIC8vIHJlc2V0IGFzeW5jIGFzeW5jUXVldWVcbiAgYXN5bmNRdWV1ZSA9IFtdO1xuICBhc3luY1RpbWVyID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzeW5jQ2FsbChjYWxsYmFjaywgYXJnKXtcbiAgYXN5bmNRdWV1ZS5wdXNoKFtjYWxsYmFjaywgYXJnXSk7XG5cbiAgaWYgKCFhc3luY1RpbWVyKVxuICB7XG4gICAgYXN5bmNUaW1lciA9IHRydWU7XG4gICAgYXN5bmNTZXRUaW1lcihhc3luY0ZsdXNoLCAwKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNlKSB7XG4gIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKSB7XG4gICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWplY3RQcm9taXNlKHJlYXNvbikge1xuICAgIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXNvbHZlcihyZXNvbHZlUHJvbWlzZSwgcmVqZWN0UHJvbWlzZSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJlamVjdFByb21pc2UoZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2soc3Vic2NyaWJlcil7XG4gIHZhciBvd25lciA9IHN1YnNjcmliZXIub3duZXI7XG4gIHZhciBzZXR0bGVkID0gb3duZXIuc3RhdGVfO1xuICB2YXIgdmFsdWUgPSBvd25lci5kYXRhXzsgIFxuICB2YXIgY2FsbGJhY2sgPSBzdWJzY3JpYmVyW3NldHRsZWRdO1xuICB2YXIgcHJvbWlzZSA9IHN1YnNjcmliZXIudGhlbjtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKVxuICB7XG4gICAgc2V0dGxlZCA9IEZVTEZJTExFRDtcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBjYWxsYmFjayh2YWx1ZSk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFoYW5kbGVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSkpXG4gIHtcbiAgICBpZiAoc2V0dGxlZCA9PT0gRlVMRklMTEVEKVxuICAgICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG5cbiAgICBpZiAoc2V0dGxlZCA9PT0gUkVKRUNURUQpXG4gICAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKSB7XG4gIHZhciByZXNvbHZlZDtcblxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKTtcblxuICAgIGlmICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpKVxuICAgIHtcbiAgICAgIHZhciB0aGVuID0gdmFsdWUudGhlbjsgIC8vIHRoZW4gc2hvdWxkIGJlIHJldHJpdmVkIG9ubHkgb25jZVxuXG4gICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpXG4gICAgICB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVuY3Rpb24odmFsKXtcbiAgICAgICAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB2YWwpXG4gICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgcmVqZWN0KHByb21pc2UsIGUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpe1xuICBpZiAocHJvbWlzZSA9PT0gdmFsdWUgfHwgIWhhbmRsZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlKSlcbiAgICBmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZnVsZmlsbChwcm9taXNlLCB2YWx1ZSl7XG4gIGlmIChwcm9taXNlLnN0YXRlXyA9PT0gUEVORElORylcbiAge1xuICAgIHByb21pc2Uuc3RhdGVfID0gU0VBTEVEO1xuICAgIHByb21pc2UuZGF0YV8gPSB2YWx1ZTtcblxuICAgIGFzeW5jQ2FsbChwdWJsaXNoRnVsZmlsbG1lbnQsIHByb21pc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlamVjdChwcm9taXNlLCByZWFzb24pe1xuICBpZiAocHJvbWlzZS5zdGF0ZV8gPT09IFBFTkRJTkcpXG4gIHtcbiAgICBwcm9taXNlLnN0YXRlXyA9IFNFQUxFRDtcbiAgICBwcm9taXNlLmRhdGFfID0gcmVhc29uO1xuXG4gICAgYXN5bmNDYWxsKHB1Ymxpc2hSZWplY3Rpb24sIHByb21pc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSkge1xuICB2YXIgY2FsbGJhY2tzID0gcHJvbWlzZS50aGVuXztcbiAgcHJvbWlzZS50aGVuXyA9IHVuZGVmaW5lZDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgIGludm9rZUNhbGxiYWNrKGNhbGxiYWNrc1tpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVibGlzaEZ1bGZpbGxtZW50KHByb21pc2Upe1xuICBwcm9taXNlLnN0YXRlXyA9IEZVTEZJTExFRDtcbiAgcHVibGlzaChwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNlKXtcbiAgcHJvbWlzZS5zdGF0ZV8gPSBSRUpFQ1RFRDtcbiAgcHVibGlzaChwcm9taXNlKTtcbn1cblxuLyoqXG4qIEBjbGFzc1xuKi9cbmZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIpe1xuICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2UgY29uc3RydWN0b3IgdGFrZXMgYSBmdW5jdGlvbiBhcmd1bWVudCcpO1xuXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSA9PT0gZmFsc2UpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIGNvbnN0cnVjdCBcXCdQcm9taXNlXFwnOiBQbGVhc2UgdXNlIHRoZSBcXCduZXdcXCcgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKTtcblxuICB0aGlzLnRoZW5fID0gW107XG5cbiAgaW52b2tlUmVzb2x2ZXIocmVzb2x2ZXIsIHRoaXMpO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFByb21pc2UsXG5cbiAgc3RhdGVfOiBQRU5ESU5HLFxuICB0aGVuXzogbnVsbCxcbiAgZGF0YV86IHVuZGVmaW5lZCxcblxuICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbil7XG4gICAgdmFyIHN1YnNjcmliZXIgPSB7XG4gICAgICBvd25lcjogdGhpcyxcbiAgICAgIHRoZW46IG5ldyB0aGlzLmNvbnN0cnVjdG9yKE5PT1ApLFxuICAgICAgZnVsZmlsbGVkOiBvbkZ1bGZpbGxtZW50LFxuICAgICAgcmVqZWN0ZWQ6IG9uUmVqZWN0aW9uXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRlXyA9PT0gRlVMRklMTEVEIHx8IHRoaXMuc3RhdGVfID09PSBSRUpFQ1RFRClcbiAgICB7XG4gICAgICAvLyBhbHJlYWR5IHJlc29sdmVkLCBjYWxsIGNhbGxiYWNrIGFzeW5jXG4gICAgICBhc3luY0NhbGwoaW52b2tlQ2FsbGJhY2ssIHN1YnNjcmliZXIpO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgLy8gc3Vic2NyaWJlXG4gICAgICB0aGlzLnRoZW5fLnB1c2goc3Vic2NyaWJlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNjcmliZXIudGhlbjtcbiAgfSxcblxuICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9XG59O1xuXG5Qcm9taXNlLmFsbCA9IGZ1bmN0aW9uKHByb21pc2VzKXtcbiAgdmFyIENsYXNzID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkocHJvbWlzZXMpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gUHJvbWlzZS5hbGwoKS4nKTtcblxuICByZXR1cm4gbmV3IENsYXNzKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgcmVtYWluaW5nID0gMDtcblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKGluZGV4KXtcbiAgICAgIHJlbWFpbmluZysrO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKCEtLXJlbWFpbmluZylcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgcHJvbWlzZTsgaSA8IHByb21pc2VzLmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlc1tpXTtcblxuICAgICAgaWYgKHByb21pc2UgJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcHJvbWlzZS50aGVuKHJlc29sdmVyKGkpLCByZWplY3QpO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHRzW2ldID0gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZiAoIXJlbWFpbmluZylcbiAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24ocHJvbWlzZXMpe1xuICB2YXIgQ2xhc3MgPSB0aGlzO1xuXG4gIGlmICghaXNBcnJheShwcm9taXNlcykpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byBQcm9taXNlLnJhY2UoKS4nKTtcblxuICByZXR1cm4gbmV3IENsYXNzKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBwcm9taXNlOyBpIDwgcHJvbWlzZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2VzW2ldO1xuXG4gICAgICBpZiAocHJvbWlzZSAmJiB0eXBlb2YgcHJvbWlzZS50aGVuID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzb2x2ZShwcm9taXNlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgQ2xhc3MgPSB0aGlzO1xuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBDbGFzcylcbiAgICByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlKXtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSk7XG59O1xuXG5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uKHJlYXNvbil7XG4gIHZhciBDbGFzcyA9IHRoaXM7XG5cbiAgcmV0dXJuIG5ldyBDbGFzcyhmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcbn07XG5cbn0pKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNS4wXG4gKiBodHRwczovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMC0wNC0xMFQxNTowN1pcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgZmxhdCA9IGFyci5mbGF0ID8gZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmZsYXQuY2FsbCggYXJyYXkgKTtcbn0gOiBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuY29uY2F0LmFwcGx5KCBbXSwgYXJyYXkgKTtcbn07XG5cblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nO1xuXG52YXIgT2JqZWN0RnVuY3Rpb25TdHJpbmcgPSBmblRvU3RyaW5nLmNhbGwoIE9iamVjdCApO1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHtcblxuICAgICAgLy8gU3VwcG9ydDogQ2hyb21lIDw9NTcsIEZpcmVmb3ggPD01MlxuICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG4gICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9iamVjdFwiICkgPT09IFwiZnVuY3Rpb25cImApLlxuICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBjbGFzc2lmeSAqYW55KiBET00gbm9kZSBhcyBhIGZ1bmN0aW9uLlxuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9PSBcIm51bWJlclwiO1xuICB9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vbmNlOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgbm9kZSwgZG9jICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLCB2YWwsXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDY0KywgRWRnZSAxOCtcblx0XHRcdFx0Ly8gU29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBcIm5vbmNlXCIgcHJvcGVydHkgb24gc2NyaXB0cy5cblx0XHRcdFx0Ly8gT24gdGhlIG90aGVyIGhhbmQsIGp1c3QgdXNpbmcgYGdldEF0dHJpYnV0ZWAgaXMgbm90IGVub3VnaCBhc1xuXHRcdFx0XHQvLyB0aGUgYG5vbmNlYCBhdHRyaWJ1dGUgaXMgcmVzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoZW5ldmVyIGl0XG5cdFx0XHRcdC8vIGJlY29tZXMgYnJvd3NpbmctY29udGV4dCBjb25uZWN0ZWQuXG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzIzNjlcblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI25vbmNlLWF0dHJpYnV0ZXNcblx0XHRcdFx0Ly8gVGhlIGBub2RlLmdldEF0dHJpYnV0ZWAgY2hlY2sgd2FzIGFkZGVkIGZvciB0aGUgc2FrZSBvZlxuXHRcdFx0XHQvLyBgalF1ZXJ5Lmdsb2JhbEV2YWxgIHNvIHRoYXQgaXQgY2FuIGZha2UgYSBub25jZS1jb250YWluaW5nIG5vZGVcblx0XHRcdFx0Ly8gdmlhIGFuIG9iamVjdC5cblx0XHRcdFx0dmFsID0gbm9kZVsgaSBdIHx8IG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCBpICk7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoIGksIHZhbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXJcblx0dmVyc2lvbiA9IFwiMy41LjBcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cblx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0aWYgKCBudW0gPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdHJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdO1xuXHR9LFxuXG5cdC8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2tcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXG5cdHB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkge1xuXG5cdFx0Ly8gQnVpbGQgYSBuZXcgalF1ZXJ5IG1hdGNoZWQgZWxlbWVudCBzZXRcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XG5cblx0XHQvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKVxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcblxuXHRcdC8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LlxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjayApO1xuXHR9LFxuXG5cdG1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdHNsaWNlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApO1xuXHR9LFxuXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggMCApO1xuXHR9LFxuXG5cdGxhc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAtMSApO1xuXHR9LFxuXG5cdGV2ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LmdyZXAoIHRoaXMsIGZ1bmN0aW9uKCBfZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAoIGkgKyAxICkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdG9kZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGkgJSAyO1xuXHRcdH0gKSApO1xuXHR9LFxuXG5cdGVxOiBmdW5jdGlvbiggaSApIHtcblx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRqID0gK2kgKyAoIGkgPCAwID8gbGVuIDogMCApO1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggaiA+PSAwICYmIGogPCBsZW4gPyBbIHRoaXNbIGogXSBdIDogW10gKTtcblx0fSxcblxuXHRlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpO1xuXHR9LFxuXG5cdC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXG5cdHB1c2g6IHB1c2gsXG5cdHNvcnQ6IGFyci5zb3J0LFxuXHRzcGxpY2U6IGFyci5zcGxpY2Vcbn07XG5cbmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG5cdHZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSxcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSxcblx0XHRpID0gMSxcblx0XHRsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuXHRcdGRlZXAgPSBmYWxzZTtcblxuXHQvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXG5cdGlmICggdHlwZW9mIHRhcmdldCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblxuXHRcdC8vIFNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTtcblx0XHRpKys7XG5cdH1cblxuXHQvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSlcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFpc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBPYmplY3QucHJvdG90eXBlIHBvbGx1dGlvblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gXCJfX3Byb3RvX19cIiB8fCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IEFycmF5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cdFx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cblx0XHRcdFx0XHQvLyBFbnN1cmUgcHJvcGVyIHR5cGUgZm9yIHRoZSBzb3VyY2UgdmFsdWVcblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICYmICFBcnJheS5pc0FycmF5KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0gW107XG5cdFx0XHRcdFx0fSBlbHNlIGlmICggIWNvcHlJc0FycmF5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgKSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHt9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBwcm92aWRlZCBjb250ZXh0OyBmYWxscyBiYWNrIHRvIHRoZSBnbG9iYWwgb25lXG5cdC8vIGlmIG5vdCBzcGVjaWZpZWQuXG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlLCBvcHRpb25zLCBkb2MgKSB7XG5cdFx0RE9NRXZhbCggY29kZSwgeyBub25jZTogb3B0aW9ucyAmJiBvcHRpb25zLm5vbmNlIH0sIGRvYyApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcbmZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4zLjVcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuICpcbiAqIERhdGU6IDIwMjAtMDMtMTRcbiAqL1xuKCBmdW5jdGlvbiggd2luZG93ICkge1xudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKCB7fSApLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaE5hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFsgaSBdID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58XCIgK1xuXHRcdFwiaXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2lkZW50LXRva2VuLWRpYWdyYW1cblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiP3xcXFxcXFxcXFteXFxcXHJcXFxcblxcXFxmXXxbXFxcXHctXXxbXlxcMC1cXFxceDdmXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV1cblx0XHQvLyBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICtcblx0XHR3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcIiApLFxuXHRyZGVzY2VuZCA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcInw+XCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaHRtbCA9IC9IVE1MJC9pLFxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXG5cdC8vIENTUyBlc2NhcGVzXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3xcXFxcXFxcXChbXlxcXFxyXFxcXG5cXFxcZl0pXCIsIFwiZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBlc2NhcGUsIG5vbkhleCApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZS5zbGljZSggMSApIC0gMHgxMDAwMDtcblxuXHRcdHJldHVybiBub25IZXggP1xuXG5cdFx0XHQvLyBTdHJpcCB0aGUgYmFja3NsYXNoIHByZWZpeCBmcm9tIGEgbm9uLWhleCBlc2NhcGUgc2VxdWVuY2Vcblx0XHRcdG5vbkhleCA6XG5cblx0XHRcdC8vIFJlcGxhY2UgYSBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2Ugd2l0aCB0aGUgZW5jb2RlZCBVbmljb2RlIGNvZGUgcG9pbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHRcdC8vIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBDU1Mgc3RyaW5nL2lkZW50aWZpZXIgc2VyaWFsaXphdGlvblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXNcblx0cmNzc2VzY2FwZSA9IC8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLFxuXHRmY3NzZXNjYXBlID0gZnVuY3Rpb24oIGNoLCBhc0NvZGVQb2ludCApIHtcblx0XHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0XHQvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVJcblx0XHRcdGlmICggY2ggPT09IFwiXFwwXCIgKSB7XG5cdFx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHNcblx0XHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICtcblx0XHRcdFx0Y2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXIgcG90ZW50aWFsbHktc3BlY2lhbCBBU0NJSSBjaGFyYWN0ZXJzIGdldCBiYWNrc2xhc2gtZXNjYXBlZFxuXHRcdHJldHVybiBcIlxcXFxcIiArIGNoO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXNcblx0Ly8gU2VlIHNldERvY3VtZW50KClcblx0Ly8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgXCJQZXJtaXNzaW9uIERlbmllZFwiXG5cdC8vIGVycm9yIGluIElFXG5cdHVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcblx0XHRzZXREb2N1bWVudCgpO1xuXHR9LFxuXG5cdGluRGlzYWJsZWRGaWVsZHNldCA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIjtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdCggYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSApLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGVscyApICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAoIHRhcmdldFsgaisrIF0gPSBlbHNbIGkrKyBdICkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmICggZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCggIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkgKSAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDggb25seVxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHQoIG5vZGVUeXBlICE9PSAxIHx8IGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApICkge1xuXG5cdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXG5cdFx0XHRcdC8vIHFTQSBjb25zaWRlcnMgZWxlbWVudHMgb3V0c2lkZSBhIHNjb3Bpbmcgcm9vdCB3aGVuIGV2YWx1YXRpbmcgY2hpbGQgb3Jcblx0XHRcdFx0Ly8gZGVzY2VuZGFudCBjb21iaW5hdG9ycywgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC5cblx0XHRcdFx0Ly8gSW4gc3VjaCBjYXNlcywgd2Ugd29yayBhcm91bmQgdGhlIGJlaGF2aW9yIGJ5IHByZWZpeGluZyBldmVyeSBzZWxlY3RvciBpbiB0aGVcblx0XHRcdFx0Ly8gbGlzdCB3aXRoIGFuIElEIHNlbGVjdG9yIHJlZmVyZW5jaW5nIHRoZSBzY29wZSBjb250ZXh0LlxuXHRcdFx0XHQvLyBUaGUgdGVjaG5pcXVlIGhhcyB0byBiZSB1c2VkIGFzIHdlbGwgd2hlbiBhIGxlYWRpbmcgY29tYmluYXRvciBpcyB1c2VkXG5cdFx0XHRcdC8vIGFzIHN1Y2ggc2VsZWN0b3JzIGFyZSBub3QgcmVjb2duaXplZCBieSBxdWVyeVNlbGVjdG9yQWxsLlxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB0ZWNobmlxdWUuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIHJkZXNjZW5kLnRlc3QoIHNlbGVjdG9yICkgfHwgcmNvbWJpbmF0b3JzLnRlc3QoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblxuXHRcdFx0XHRcdC8vIFdlIGNhbiB1c2UgOnNjb3BlIGluc3RlYWQgb2YgdGhlIElEIGhhY2sgaWYgdGhlIGJyb3dzZXJcblx0XHRcdFx0XHQvLyBzdXBwb3J0cyBpdCAmIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgY29udGV4dC5cblx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgIT09IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKCBjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlICk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KCBcInxcIiApLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyWyBpIF0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIubmV4dFNpYmxpbmcgKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAoIG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vLyBFeHBvc2Ugc3VwcG9ydCB2YXJzIGZvciBjb252ZW5pZW5jZVxuc3VwcG9ydCA9IFNpenpsZS5zdXBwb3J0ID0ge307XG5cbi8qKlxuICogRGV0ZWN0cyBYTUwgbm9kZXNcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZmYgZWxlbSBpcyBhIG5vbi1IVE1MIFhNTCBub2RlXG4gKi9cbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBuYW1lc3BhY2UgPSBlbGVtLm5hbWVzcGFjZVVSSSxcblx0XHRkb2NFbGVtID0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApLmRvY3VtZW50RWxlbWVudDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PThcblx0Ly8gQXNzdW1lIEhUTUwgd2hlbiBkb2N1bWVudEVsZW1lbnQgZG9lc24ndCB5ZXQgZXhpc3QsIHN1Y2ggYXMgaW5zaWRlIGxvYWRpbmcgaWZyYW1lc1xuXHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvNDgzM1xuXHRyZXR1cm4gIXJodG1sLnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIGRvYyA9PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdGRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gQWNjZXNzaW5nIGlmcmFtZSBkb2N1bWVudHMgYWZ0ZXIgdW5sb2FkIHRocm93cyBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3JzIChqUXVlcnkgIzEzOTM2KVxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIHByZWZlcnJlZERvYyAhPSBkb2N1bWVudCAmJlxuXHRcdCggc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgKSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gMTErLCBFZGdlIDEyIC0gMTgrLCBDaHJvbWUgPD0xNiAtIDI1IG9ubHksIEZpcmVmb3ggPD0zLjYgLSAzMSBvbmx5LFxuXHQvLyBTYWZhcmkgNCAtIDUgb25seSwgT3BlcmEgPD0xMS42IC0gMTIueCBvbmx5XG5cdC8vIElFL0VkZ2UgJiBvbGRlciBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSA6c2NvcGUgcHNldWRvLWNsYXNzLlxuXHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wIG9ubHlcblx0Ly8gU2FmYXJpIDYuMCBzdXBwb3J0cyA6c2NvcGUgYnV0IGl0J3MgYW4gYWxpYXMgb2YgOnJvb3QgdGhlcmUuXG5cdHN1cHBvcnQuc2NvcGUgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblx0XHRyZXR1cm4gdHlwZW9mIGVsLnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdCFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpzY29wZSBmaWVsZHNldCBkaXZcIiApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8qIEF0dHJpYnV0ZXNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFPDhcblx0Ly8gVmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzXG5cdC8vIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKVxuXHRzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSggXCJjbGFzc05hbWVcIiApO1xuXHR9ICk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIFwiXCIgKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiKlwiICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSApO1xuXG5cdC8vIElEIGZpbHRlciBhbmQgZmluZFxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbHRlclsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcImlkXCIgKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdFx0XHRcdHJldHVybiBlbGVtID8gWyBlbGVtIF0gOiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdEV4cHIuZmlsdGVyWyBcIklEXCIgXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbIFwiSURcIiBdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG5vZGUsIGksIGVsZW1zLFxuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXG5cdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdC8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlXG5cdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZVxuXHRcdFx0XHRcdGVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1zWyBpKysgXSApICkge1xuXHRcdFx0XHRcdFx0bm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbIFwiVEFHXCIgXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSByZXN1bHRzWyBpKysgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kWyBcIkNMQVNTXCIgXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzNzhcblx0cmJ1Z2d5UVNBID0gW107XG5cblx0aWYgKCAoIHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKSApIHtcblxuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdFx0dmFyIGlucHV0O1xuXG5cdFx0XHQvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlXG5cdFx0XHQvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHlcblx0XHRcdC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0cmlidXRlLFxuXHRcdFx0Ly8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91Z2hcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OVxuXHRcdFx0ZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5pbm5lckhUTUwgPSBcIjxhIGlkPSdcIiArIGV4cGFuZG8gKyBcIic+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBtc2FsbG93Y2FwdHVyZT0nJz5cIiArXG5cdFx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNlxuXHRcdFx0Ly8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPVxuXHRcdFx0Ly8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgXCJzYWZlXCIgZm9yIFdpblJUXG5cdFx0XHQvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2hoNDY1Mzg4LmFzcHgjYXR0cmlidXRlX3NlY3Rpb25cblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW3NlbGVjdGVkXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIn49XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0XHQvLyBJRSAxMS9FZGdlIGRvbid0IGZpbmQgZWxlbWVudHMgb24gYSBgW25hbWU9JyddYCBxdWVyeSBpbiBzb21lIGNhc2VzLlxuXHRcdFx0Ly8gQWRkaW5nIGEgdGVtcG9yYXJ5IGF0dHJpYnV0ZSB0byB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBzZWxlY3Rpb24gd29ya3Ncblx0XHRcdC8vIGFyb3VuZCB0aGUgaXNzdWUuXG5cdFx0XHQvLyBJbnRlcmVzdGluZ2x5LCBJRSAxMCAmIG9sZGVyIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgaXNzdWUuXG5cdFx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJcIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltuYW1lPScnXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIio9XCIgK1xuXHRcdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpjaGVja2VkXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjpjaGVja2VkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmxpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIi4jLitbK35dXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTMuNiAtIDUgb25seVxuXHRcdFx0Ly8gT2xkIEZpcmVmb3ggZG9lc24ndCB0aHJvdyBvbiBhIGJhZGx5LWVzY2FwZWQgaWRlbnRpZmllci5cblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiXFxcXFxcZlwiICk7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbXFxcXHJcXFxcblxcXFxmXVwiICk7XG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT1kXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJuYW1lXCIgKyB3aGl0ZXNwYWNlICsgXCIqWypeJHwhfl0/PVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0c1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjplbmFibGVkXCIgKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZGlzYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBPcGVyYSAxMCAtIDExIG9ubHlcblx0XHRcdC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zXG5cdFx0XHRlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIiosOnhcIiApO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLC4qOlwiICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yID0gcm5hdGl2ZS50ZXN0KCAoIG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvciApICkgKSApIHtcblxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgXCIqXCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBlbCwgXCJbcyE9JyddOnhcIiApO1xuXHRcdFx0cmJ1Z2d5TWF0Y2hlcy5wdXNoKCBcIiE9XCIsIHBzZXVkb3MgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCBcInxcIiApICk7XG5cdHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oIFwifFwiICkgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlXG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkgKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGIgPSBiLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoICFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUgKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBhID09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PSBwcmVmZXJyZWREb2MgJiZcblx0XHRcdFx0Y29udGFpbnMoIHByZWZlcnJlZERvYywgYSApICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRpZiAoIGIgPT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRjb250YWlucyggcHJlZmVycmVkRG9jLCBiICkgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlclxuXHRcdFx0cmV0dXJuIHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH0gOlxuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5cdFx0XHRyZXR1cm4gYSA9PSBkb2N1bWVudCA/IC0xIDpcblx0XHRcdFx0YiA9PSBkb2N1bWVudCA/IDEgOlxuXHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuXHRcdFx0XHRhdXAgPyAtMSA6XG5cdFx0XHRcdGJ1cCA/IDEgOlxuXHRcdFx0XHRzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVja1xuXHRcdH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkge1xuXHRcdFx0cmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uXG5cdFx0Y3VyID0gYTtcblx0XHR3aGlsZSAoICggY3VyID0gY3VyLnBhcmVudE5vZGUgKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwWyBpIF0gPT09IGJwWyBpIF0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbIGkgXSwgYnBbIGkgXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG5cdFx0XHRhcFsgaSBdID09IHByZWZlcnJlZERvYyA/IC0xIDpcblx0XHRcdGJwWyBpIF0gPT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQvKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblxuXHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNylcblx0XHR2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXG5cdHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCA/XG5cdFx0dmFsIDpcblx0XHRzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID9cblx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOlxuXHRcdFx0KCB2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoIHNlbCArIFwiXCIgKS5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG59O1xuXG5TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcztcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRzLnNsaWNlKCAwICk7XG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSByZXN1bHRzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXG5cdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHR3aGlsZSAoICggbm9kZSA9IGVsZW1bIGkrKyBdICkgKSB7XG5cblx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRyZXQgKz0gZ2V0VGV4dCggbm9kZSApO1xuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkge1xuXG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblxuXHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7XG5cblx0Ly8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyXG5cdGNhY2hlTGVuZ3RoOiA1MCxcblxuXHRjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbixcblxuXHRtYXRjaDogbWF0Y2hFeHByLFxuXG5cdGF0dHJIYW5kbGU6IHt9LFxuXG5cdGZpbmQ6IHt9LFxuXG5cdHJlbGF0aXZlOiB7XG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIiBcIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiIH0sXG5cdFx0XCIrXCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XG5cdH0sXG5cblx0cHJlRmlsdGVyOiB7XG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFsgMyBdID0gKCBtYXRjaFsgMyBdIHx8IG1hdGNoWyA0IF0gfHxcblx0XHRcdFx0bWF0Y2hbIDUgXSB8fCBcIlwiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMiBdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWyAzIF0gPSBcIiBcIiArIG1hdGNoWyAzIF0gKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMSBdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWyAwIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWyA0IF0gPSArKCBtYXRjaFsgNCBdID9cblx0XHRcdFx0XHRtYXRjaFsgNSBdICsgKCBtYXRjaFsgNiBdIHx8IDEgKSA6XG5cdFx0XHRcdFx0MiAqICggbWF0Y2hbIDMgXSA9PT0gXCJldmVuXCIgfHwgbWF0Y2hbIDMgXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWyA1IF0gPSArKCAoIG1hdGNoWyA3IF0gKyBtYXRjaFsgOCBdICkgfHwgbWF0Y2hbIDMgXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbIDYgXSAmJiBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwclsgXCJDSElMRFwiIF0udGVzdCggbWF0Y2hbIDAgXSApICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXNcblx0XHRcdGlmICggbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IG1hdGNoWyA0IF0gfHwgbWF0Y2hbIDUgXSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KCBleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSApICYmXG5cblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdCggZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggXCIpXCIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoICkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbIDAgXSA9IG1hdGNoWyAwIF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsgMiBdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0xBU1NcIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XHRcdFwiKVwiICsgY2xhc3NOYW1lICsgXCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApICkgJiYgY2xhc3NDYWNoZShcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8XG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggXCJjbGFzc1wiICkgfHxcblx0XHRcdFx0XHRcdFx0XHRcIlwiXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gKTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBfYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKCBub2RlID0gbm9kZVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrK2RpZmYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFsgaSBdICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblxuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IHVubWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGkgXSA9ICEoIG1hdGNoZXNbIGkgXSA9IGVsZW0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbIDAgXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QoIGxhbmcgfHwgXCJcIiApICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggXCJ4bWw6bGFuZ1wiICkgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoIFwibGFuZ1wiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoICggZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSApICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJlxuXHRcdFx0XHQoICFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpICkgJiZcblx0XHRcdFx0ISEoIGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXggKTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCBmYWxzZSApLFxuXHRcdFwiZGlzYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCApIHx8XG5cdFx0XHRcdCggbm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkICk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbIFwiZW1wdHlcIiBdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKCBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgKSA9PSBudWxsIHx8XG5cdFx0XHRcdFx0YXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9ICksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9ICksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBfbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0gKSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID9cblx0XHRcdFx0YXJndW1lbnQgKyBsZW5ndGggOlxuXHRcdFx0XHRhcmd1bWVudCA+IGxlbmd0aCA/XG5cdFx0XHRcdFx0bGVuZ3RoIDpcblx0XHRcdFx0XHRhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbIFwibnRoXCIgXSA9IEV4cHIucHNldWRvc1sgXCJlcVwiIF07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8ICggbWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFsgMCBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICggdG9rZW5zID0gW10gKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAoIG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkgKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWyAwIF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0gKTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoICggbWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApICkgJiYgKCAhcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdCggbWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkgKSApICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goIHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbIGkgXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSA6XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGFsbCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudHNcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIG9sZENhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSxcblx0XHRcdFx0bmV3Q2FjaGUgPSBbIGRpcnJ1bnMsIGRvbmVOYW1lIF07XG5cblx0XHRcdC8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZ1xuXHRcdFx0aWYgKCB4bWwgKSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoIGVsZW1bIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0KCBvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtID0gZWxlbVsgZGlyIF0gfHwgZWxlbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoICggb2xkQ2FjaGUgPSB1bmlxdWVDYWNoZVsga2V5IF0gKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoIG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKCBuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1sgaSBdKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gOlxuXHRcdG1hdGNoZXJzWyAwIF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbIGkgXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8IG11bHRpcGxlQ29udGV4dHMoXG5cdFx0XHRcdHNlbGVjdG9yIHx8IFwiKlwiLFxuXHRcdFx0XHRjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LFxuXHRcdFx0XHRbXVxuXHRcdFx0KSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsXG5cdFx0XHRcdHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHRcdC8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdFtdIDpcblxuXHRcdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRcdHJlc3VsdHMgOlxuXHRcdFx0XHRtYXRjaGVySW47XG5cblx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdGlmICggbWF0Y2hlciApIHtcblx0XHRcdG1hdGNoZXIoIG1hdGNoZXJJbiwgbWF0Y2hlck91dCwgY29udGV4dCwgeG1sICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcG9zdEZpbHRlclxuXHRcdGlmICggcG9zdEZpbHRlciApIHtcblx0XHRcdHRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApO1xuXHRcdFx0cG9zdEZpbHRlciggdGVtcCwgW10sIGNvbnRleHQsIHhtbCApO1xuXG5cdFx0XHQvLyBVbi1tYXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0Y2hlckluXG5cdFx0XHRpID0gdGVtcC5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAoIGVsZW0gPSB0ZW1wWyBpIF0gKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwWyBpIF0gXSA9ICEoIG1hdGNoZXJJblsgcG9zdE1hcFsgaSBdIF0gPSBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cblx0XHRcdFx0XHQvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHNcblx0XHRcdFx0XHR0ZW1wID0gW107XG5cdFx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaFxuXHRcdFx0XHRcdFx0XHR0ZW1wLnB1c2goICggbWF0Y2hlckluWyBpIF0gPSBlbGVtICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKCBtYXRjaGVyT3V0ID0gW10gKSwgdGVtcCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIG1hdGNoZWQgZWxlbWVudHMgZnJvbSBzZWVkIHRvIHJlc3VsdHMgdG8ga2VlcCB0aGVtIHN5bmNocm9uaXplZFxuXHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdGlmICggKCBlbGVtID0gbWF0Y2hlck91dFsgaSBdICkgJiZcblx0XHRcdFx0XHRcdCggdGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbIGkgXSApID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbIHRlbXAgXSA9ICEoIHJlc3VsdHNbIHRlbXAgXSA9IGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMgKSB7XG5cdHZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIDAgXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyBcIiBcIiBdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoIGNoZWNrQ29udGV4dCA9IGNvbnRleHQgKS5ub2RlVHlwZSA/XG5cdFx0XHRcdFx0bWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdFx0bWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApO1xuXG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoICggbWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgaSBdLnR5cGUgXSApICkge1xuXHRcdFx0bWF0Y2hlcnMgPSBbIGFkZENvbWJpbmF0b3IoIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyICkgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbIGkgXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1sgaSBdLm1hdGNoZXMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXJcblx0XHRcdGlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgaiBdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHR0b2tlbnNcblx0XHRcdFx0XHRcdC5zbGljZSggMCwgaSAtIDEgKVxuXHRcdFx0XHRcdFx0LmNvbmNhdCggeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0gKVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKCB0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cblx0XHRcdFx0Ly8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRlcm1vc3QgY29udGV4dFxuXHRcdFx0XHRlbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsgXCJUQUdcIiBdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9ICggZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEgKSxcblx0XHRcdFx0bGVuID0gZWxlbXMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblxuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0gKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IHNldE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISggdW5tYXRjaGVkWyBpIF0gfHwgc2V0TWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFsgaSBdID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cblx0XHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcblx0XHRpZiAoICFtYXRjaCApIHtcblx0XHRcdG1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0fVxuXHRcdGkgPSBtYXRjaC5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRjYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbIGkgXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZShcblx0XHRcdHNlbGVjdG9yLFxuXHRcdFx0bWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzIClcblx0XHQpO1xuXG5cdFx0Ly8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uXG5cdFx0Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdH1cblx0cmV0dXJuIGNhY2hlZDtcbn07XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgc2VsZWN0aW9uIGZ1bmN0aW9uIHRoYXQgd29ya3Mgd2l0aCBTaXp6bGUncyBjb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uc1xuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHNlbGVjdG9yIEEgc2VsZWN0b3Igb3IgYSBwcmUtY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbiBidWlsdCB3aXRoIFNpenpsZS5jb21waWxlXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHRzXVxuICogQHBhcmFtIHtBcnJheX0gW3NlZWRdIEEgc2V0IG9mIGVsZW1lbnRzIHRvIG1hdGNoIGFnYWluc3RcbiAqL1xuc2VsZWN0ID0gU2l6emxlLnNlbGVjdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsXG5cdFx0Y29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBzZWxlY3Rvcixcblx0XHRtYXRjaCA9ICFzZWVkICYmIHRva2VuaXplKCAoIHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IgKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwICk7XG5cdFx0aWYgKCB0b2tlbnMubGVuZ3RoID4gMiAmJiAoIHRva2VuID0gdG9rZW5zWyAwIF0gKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAxIF0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbIFwiSURcIiBdKCB0b2tlbi5tYXRjaGVzWyAwIF1cblx0XHRcdFx0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksIGNvbnRleHQgKSB8fCBbXSApWyAwIF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByWyBcIm5lZWRzQ29udGV4dFwiIF0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbIGkgXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAoIHR5cGUgPSB0b2tlbi50eXBlICkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoICggZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdICkgKSB7XG5cblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKCBzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWyAwIF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbIDAgXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdCkgKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdCFjb250ZXh0IHx8IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCggXCJcIiApLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oIFwiXCIgKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKSApICYgMTtcbn0gKTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJocmVmXCIgKSA9PT0gXCIjXCI7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9ICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdGVsLmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZWwuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZWwuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBcIlwiO1xufSApICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIF9uYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGdldEF0dHJpYnV0ZU5vZGUgdG8gZmV0Y2ggYm9vbGVhbnMgd2hlbiBnZXRBdHRyaWJ1dGUgbGllc1xuaWYgKCAhYXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoIFwiZGlzYWJsZWRcIiApID09IG51bGw7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdCggdmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9ICk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0gKSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gU2l6emxlLmVzY2FwZTtcblxuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxuXG5cbmZ1bmN0aW9uIG5vZGVOYW1lKCBlbGVtLCBuYW1lICkge1xuXG4gIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG59O1xudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIF9pLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0aWYgKCBlbGVtLmNvbnRlbnREb2N1bWVudCAhPSBudWxsICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gPG9iamVjdD4gZWxlbWVudHMgd2l0aCBubyBgZGF0YWAgYXR0cmlidXRlIGhhcyBhbiBvYmplY3Rcblx0XHRcdC8vIGBjb250ZW50RG9jdW1lbnRgIHdpdGggYSBgbnVsbGAgcHJvdG90eXBlLlxuXHRcdFx0Z2V0UHJvdG8oIGVsZW0uY29udGVudERvY3VtZW50ICkgKSB7XG5cblx0XHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seSwgaU9TIDcgb25seSwgQW5kcm9pZCBCcm93c2VyIDw9NC4zIG9ubHlcblx0XHQvLyBUcmVhdCB0aGUgdGVtcGxhdGUgZWxlbWVudCBhcyBhIHJlZ3VsYXIgb25lIGluIGJyb3dzZXJzIHRoYXRcblx0XHQvLyBkb24ndCBzdXBwb3J0IGl0LlxuXHRcdGlmICggbm9kZU5hbWUoIGVsZW0sIFwidGVtcGxhdGVcIiApICkge1xuXHRcdFx0ZWxlbSA9IGVsZW0uY29udGVudCB8fCBlbGVtO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggX2ksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5kb25lKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlc29sdmUgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZmFpbChmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZWplY3QgfSlcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWRcblx0XHRcdG1hc3RlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRtYXN0ZXIucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIG1hc3Rlci5kb25lKCB1cGRhdGVGdW5jKCBpICkgKS5yZXNvbHZlLCBtYXN0ZXIucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggbWFzdGVyLnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggZWxlbXNbIGkgXSwgaSwgZm4oIGVsZW1zWyBpIF0sIGtleSApIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIGNoYWluYWJsZSApIHtcblx0XHRyZXR1cm4gZWxlbXM7XG5cdH1cblxuXHQvLyBHZXRzXG5cdGlmICggYnVsayApIHtcblx0XHRyZXR1cm4gZm4uY2FsbCggZWxlbXMgKTtcblx0fVxuXG5cdHJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDtcbn07XG5cblxuLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXG52YXIgcm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFthLXpdKS9nO1xuXG4vLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcbmZ1bmN0aW9uIGZjYW1lbENhc2UoIF9hbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0gT2JqZWN0LmNyZWF0ZSggbnVsbCApO1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBjYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRrZXkgPSBrZXkgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFsga2V5IF0gOlxuXHRcdFx0XHRcdCgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IGtleS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIGtleVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NVxuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwNyAoYnVnIHJlc3RyaWN0ZWQpXG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7XG5cdGlmICggZGF0YSA9PT0gXCJ0cnVlXCIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwiZmFsc2VcIiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwibnVsbFwiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0aWYgKCBkYXRhID09PSArZGF0YSArIFwiXCIgKSB7XG5cdFx0cmV0dXJuICtkYXRhO1xuXHR9XG5cblx0aWYgKCByYnJhY2UudGVzdCggZGF0YSApICkge1xuXHRcdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICk7XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBnZXREYXRhKCBkYXRhICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKCMxMTIxNylcblx0Ly8gU3VwcG9ydDogV2luZG93cyBXZWIgQXBwcyAoV1dBKVxuXHQvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSlcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJyYWRpb1wiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XG5cblx0ZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seVxuXHQvLyBPbGRlciBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcblx0c3VwcG9ydC5jaGVja0Nsb25lID0gZGl2LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdC8vIElFIDw9OSByZXBsYWNlcyA8b3B0aW9uPiB0YWdzIHdpdGggdGhlaXIgY29udGVudHMgd2hlbiBpbnNlcnRlZCBvdXRzaWRlIG9mXG5cdC8vIHRoZSBzZWxlY3QgZWxlbWVudC5cblx0ZGl2LmlubmVySFRNTCA9IFwiPG9wdGlvbj48L29wdGlvbj5cIjtcblx0c3VwcG9ydC5vcHRpb24gPSAhIWRpdi5sYXN0Q2hpbGQ7XG59ICkoKTtcblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAoIzE1MTUxKVxuXHR2YXIgcmV0O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIGlmICggdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSB7XG5cdFx0cmV0ID0gW107XG5cdH1cblxuXHRpZiAoIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBub2RlTmFtZSggY29udGV4dCwgdGFnICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGF0dGFjaGVkLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggdG9UeXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uXG5cdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0dG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07XG5cblx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnRcblx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRhdHRhY2hlZCA9IGlzQXR0YWNoZWQoIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggYXR0YWNoZWQgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcbi8vIGZvY3VzKCkgYW5kIGJsdXIoKSBhcmUgYXN5bmNocm9ub3VzLCBleGNlcHQgd2hlbiB0aGV5IGFyZSBuby1vcC5cbi8vIFNvIGV4cGVjdCBmb2N1cyB0byBiZSBzeW5jaHJvbm91cyB3aGVuIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgYWN0aXZlLFxuLy8gYW5kIGJsdXIgdG8gYmUgc3luY2hyb25vdXMgd2hlbiB0aGUgZWxlbWVudCBpcyBub3QgYWxyZWFkeSBhY3RpdmUuXG4vLyAoZm9jdXMgYW5kIGJsdXIgYXJlIGFsd2F5cyBzeW5jaHJvbm91cyBpbiBvdGhlciBzdXBwb3J0ZWQgYnJvd3NlcnMsXG4vLyB0aGlzIGp1c3QgZGVmaW5lcyB3aGVuIHdlIGNhbiBjb3VudCBvbiBpdCkuXG5mdW5jdGlvbiBleHBlY3RTeW5jKCBlbGVtLCB0eXBlICkge1xuXHRyZXR1cm4gKCBlbGVtID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICkgPT09ICggdHlwZSA9PT0gXCJmb2N1c1wiICk7XG59XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG4vLyBBY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gdGhyb3cgdW5leHBlY3RlZGx5XG4vLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTMzOTNcbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gT25seSBhdHRhY2ggZXZlbnRzIHRvIG9iamVjdHMgdGhhdCBhY2NlcHQgZGF0YVxuXHRcdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSBPYmplY3QuY3JlYXRlKCBudWxsICk7XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cblx0XHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApLFxuXG5cdFx0XHRoYW5kbGVycyA9IChcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsIClcblx0XHRcdFx0KVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTtcblx0XHR9XG5cblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGV2ZW50IGlzIG5hbWVzcGFjZWQsIHRoZW4gZWFjaCBoYW5kbGVyIGlzIG9ubHkgaW52b2tlZCBpZiBpdCBpc1xuXHRcdFx0XHQvLyBzcGVjaWFsbHkgdW5pdmVyc2FsIG9yIGl0cyBuYW1lc3BhY2VzIGFyZSBhIHN1cGVyc2V0IG9mIHRoZSBldmVudCdzLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGhhbmRsZU9iai5uYW1lc3BhY2UgPT09IGZhbHNlIHx8XG5cdFx0XHRcdFx0ZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IHRvIGVuc3VyZSBjb3JyZWN0IHN0YXRlIGZvciBjaGVja2FibGUgaW5wdXRzXG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHQvLyBkYXRhUHJpdi5zZXQoIGVsLCBcImNsaWNrXCIsIC4uLiApXG5cdFx0XHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIGVsLCBcImNsaWNrXCIsIHJldHVyblRydWUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgcHJvY2Vzc2luZyBpbiB0aGUgY2FsbGVyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIEZvcmNlIHNldHVwIGJlZm9yZSB0cmlnZ2VyaW5nIGEgY2xpY2tcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIGVsLCBcImNsaWNrXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgc3VwcHJlc3MgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHQvLyBBbHNvIHByZXZlbnQgaXQgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIGxldmVyYWdlZCBuYXRpdmUtZXZlbnQgc3RhY2tcblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cdFx0XHRcdHJldHVybiByY2hlY2thYmxlVHlwZS50ZXN0KCB0YXJnZXQudHlwZSApICYmXG5cdFx0XHRcdFx0dGFyZ2V0LmNsaWNrICYmIG5vZGVOYW1lKCB0YXJnZXQsIFwiaW5wdXRcIiApICYmXG5cdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0YXJnZXQsIFwiY2xpY2tcIiApIHx8XG5cdFx0XHRcdFx0bm9kZU5hbWUoIHRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBFbnN1cmUgdGhlIHByZXNlbmNlIG9mIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaGFuZGxlcyBtYW51YWxseS10cmlnZ2VyZWRcbi8vIHN5bnRoZXRpYyBldmVudHMgYnkgaW50ZXJydXB0aW5nIHByb2dyZXNzIHVudGlsIHJlaW52b2tlZCBpbiByZXNwb25zZSB0b1xuLy8gKm5hdGl2ZSogZXZlbnRzIHRoYXQgaXQgZmlyZXMgZGlyZWN0bHksIGVuc3VyaW5nIHRoYXQgc3RhdGUgY2hhbmdlcyBoYXZlXG4vLyBhbHJlYWR5IG9jY3VycmVkIGJlZm9yZSBvdGhlciBsaXN0ZW5lcnMgYXJlIGludm9rZWQuXG5mdW5jdGlvbiBsZXZlcmFnZU5hdGl2ZSggZWwsIHR5cGUsIGV4cGVjdFN5bmMgKSB7XG5cblx0Ly8gTWlzc2luZyBleHBlY3RTeW5jIGluZGljYXRlcyBhIHRyaWdnZXIgY2FsbCwgd2hpY2ggbXVzdCBmb3JjZSBzZXR1cCB0aHJvdWdoIGpRdWVyeS5ldmVudC5hZGRcblx0aWYgKCAhZXhwZWN0U3luYyApIHtcblx0XHRpZiAoIGRhdGFQcml2LmdldCggZWwsIHR5cGUgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHJldHVyblRydWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgYXMgYSBzcGVjaWFsIHVuaXZlcnNhbCBoYW5kbGVyIGZvciBhbGwgZXZlbnQgbmFtZXNwYWNlc1xuXHRkYXRhUHJpdi5zZXQoIGVsLCB0eXBlLCBmYWxzZSApO1xuXHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwge1xuXHRcdG5hbWVzcGFjZTogZmFsc2UsXG5cdFx0aGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIG5vdEFzeW5jLCByZXN1bHQsXG5cdFx0XHRcdHNhdmVkID0gZGF0YVByaXYuZ2V0KCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdGlmICggKCBldmVudC5pc1RyaWdnZXIgJiAxICkgJiYgdGhpc1sgdHlwZSBdICkge1xuXG5cdFx0XHRcdC8vIEludGVycnVwdCBwcm9jZXNzaW5nIG9mIHRoZSBvdXRlciBzeW50aGV0aWMgLnRyaWdnZXIoKWVkIGV2ZW50XG5cdFx0XHRcdC8vIFNhdmVkIGRhdGEgc2hvdWxkIGJlIGZhbHNlIGluIHN1Y2ggY2FzZXMsIGJ1dCBtaWdodCBiZSBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0XG5cdFx0XHRcdC8vIGZyb20gYW4gYXN5bmMgbmF0aXZlIGhhbmRsZXIgKGdoLTQzNTApXG5cdFx0XHRcdGlmICggIXNhdmVkLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFN0b3JlIGFyZ3VtZW50cyBmb3IgdXNlIHdoZW4gaGFuZGxpbmcgdGhlIGlubmVyIG5hdGl2ZSBldmVudFxuXHRcdFx0XHRcdC8vIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBhcmd1bWVudCAoYW4gZXZlbnQgb2JqZWN0KSwgc28gdGhpcyBhcnJheVxuXHRcdFx0XHRcdC8vIHdpbGwgbm90IGJlIGNvbmZ1c2VkIHdpdGggYSBsZWZ0b3ZlciBjYXB0dXJlIG9iamVjdC5cblx0XHRcdFx0XHRzYXZlZCA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgc2F2ZWQgKTtcblxuXHRcdFx0XHRcdC8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudCBhbmQgY2FwdHVyZSBpdHMgcmVzdWx0XG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTErXG5cdFx0XHRcdFx0Ly8gZm9jdXMoKSBhbmQgYmx1cigpIGFyZSBhc3luY2hyb25vdXNcblx0XHRcdFx0XHRub3RBc3luYyA9IGV4cGVjdFN5bmMoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0XHR0aGlzWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRyZXN1bHQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0XHRpZiAoIHNhdmVkICE9PSByZXN1bHQgfHwgbm90QXN5bmMgKSB7XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIGZhbHNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNhdmVkICE9PSByZXN1bHQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhbmNlbCB0aGUgb3V0ZXIgc3ludGhldGljIGV2ZW50XG5cdFx0XHRcdFx0XHRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0LnZhbHVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGlubmVyIHN5bnRoZXRpYyBldmVudCBmb3IgYW4gZXZlbnQgd2l0aCBhIGJ1YmJsaW5nIHN1cnJvZ2F0ZVxuXHRcdFx0XHQvLyAoZm9jdXMgb3IgYmx1ciksIGFzc3VtZSB0aGF0IHRoZSBzdXJyb2dhdGUgYWxyZWFkeSBwcm9wYWdhdGVkIGZyb20gdHJpZ2dlcmluZyB0aGVcblx0XHRcdFx0Ly8gbmF0aXZlIGV2ZW50IGFuZCBwcmV2ZW50IHRoYXQgZnJvbSBoYXBwZW5pbmcgYWdhaW4gaGVyZS5cblx0XHRcdFx0Ly8gVGhpcyB0ZWNobmljYWxseSBnZXRzIHRoZSBvcmRlcmluZyB3cm9uZyB3LnIudC4gdG8gYC50cmlnZ2VyKClgIChpbiB3aGljaCB0aGVcblx0XHRcdFx0Ly8gYnViYmxpbmcgc3Vycm9nYXRlIHByb3BhZ2F0ZXMgKmFmdGVyKiB0aGUgbm9uLWJ1YmJsaW5nIGJhc2UpLCBidXQgdGhhdCBzZWVtc1xuXHRcdFx0XHQvLyBsZXNzIGJhZCB0aGFuIGR1cGxpY2F0aW9uLlxuXHRcdFx0XHR9IGVsc2UgaWYgKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge30gKS5kZWxlZ2F0ZVR5cGUgKSB7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIG5hdGl2ZSBldmVudCB0cmlnZ2VyZWQgYWJvdmUsIGV2ZXJ5dGhpbmcgaXMgbm93IGluIG9yZGVyXG5cdFx0XHQvLyBGaXJlIGFuIGlubmVyIHN5bnRoZXRpYyBldmVudCB3aXRoIHRoZSBvcmlnaW5hbCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHNhdmVkLmxlbmd0aCApIHtcblxuXHRcdFx0XHQvLyAuLi5hbmQgY2FwdHVyZSB0aGUgcmVzdWx0XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwge1xuXHRcdFx0XHRcdHZhbHVlOiBqUXVlcnkuZXZlbnQudHJpZ2dlcihcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTErXG5cdFx0XHRcdFx0XHQvLyBFeHRlbmQgd2l0aCB0aGUgcHJvdG90eXBlIHRvIHJlc2V0IHRoZSBhYm92ZSBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmV4dGVuZCggc2F2ZWRbIDAgXSwgalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSApLFxuXHRcdFx0XHRcdFx0c2F2ZWQuc2xpY2UoIDEgKSxcblx0XHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQpXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvLyBBYm9ydCBoYW5kbGluZyBvZiB0aGUgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seVxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0XHQvLyBDcmVhdGUgdGFyZ2V0IHByb3BlcnRpZXNcblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgPD02IC0gNyBvbmx5XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHR0aGlzLnRhcmdldCA9ICggc3JjLnRhcmdldCAmJiBzcmMudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgP1xuXHRcdFx0c3JjLnRhcmdldC5wYXJlbnROb2RlIDpcblx0XHRcdHNyYy50YXJnZXQ7XG5cblx0XHR0aGlzLmN1cnJlbnRUYXJnZXQgPSBzcmMuY3VycmVudFRhcmdldDtcblx0XHR0aGlzLnJlbGF0ZWRUYXJnZXQgPSBzcmMucmVsYXRlZFRhcmdldDtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDAzMDMzMS9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBqUXVlcnkuRXZlbnQsXG5cdGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cdGlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc1NpbXVsYXRlZDogZmFsc2UsXG5cblx0cHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSxcblx0c3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcblx0fVxufTtcblxuLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHNcbmpRdWVyeS5lYWNoKCB7XG5cdGFsdEtleTogdHJ1ZSxcblx0YnViYmxlczogdHJ1ZSxcblx0Y2FuY2VsYWJsZTogdHJ1ZSxcblx0Y2hhbmdlZFRvdWNoZXM6IHRydWUsXG5cdGN0cmxLZXk6IHRydWUsXG5cdGRldGFpbDogdHJ1ZSxcblx0ZXZlbnRQaGFzZTogdHJ1ZSxcblx0bWV0YUtleTogdHJ1ZSxcblx0cGFnZVg6IHRydWUsXG5cdHBhZ2VZOiB0cnVlLFxuXHRzaGlmdEtleTogdHJ1ZSxcblx0dmlldzogdHJ1ZSxcblx0XCJjaGFyXCI6IHRydWUsXG5cdGNvZGU6IHRydWUsXG5cdGNoYXJDb2RlOiB0cnVlLFxuXHRrZXk6IHRydWUsXG5cdGtleUNvZGU6IHRydWUsXG5cdGJ1dHRvbjogdHJ1ZSxcblx0YnV0dG9uczogdHJ1ZSxcblx0Y2xpZW50WDogdHJ1ZSxcblx0Y2xpZW50WTogdHJ1ZSxcblx0b2Zmc2V0WDogdHJ1ZSxcblx0b2Zmc2V0WTogdHJ1ZSxcblx0cG9pbnRlcklkOiB0cnVlLFxuXHRwb2ludGVyVHlwZTogdHJ1ZSxcblx0c2NyZWVuWDogdHJ1ZSxcblx0c2NyZWVuWTogdHJ1ZSxcblx0dGFyZ2V0VG91Y2hlczogdHJ1ZSxcblx0dG9FbGVtZW50OiB0cnVlLFxuXHR0b3VjaGVzOiB0cnVlLFxuXG5cdHdoaWNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0dmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcblxuXHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCAmJiBya2V5RXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0cmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIHJtb3VzZUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdGlmICggYnV0dG9uICYgMSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgMiApIHtcblx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggYnV0dG9uICYgNCApIHtcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC53aGljaDtcblx0fVxufSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTtcblxualF1ZXJ5LmVhY2goIHsgZm9jdXM6IFwiZm9jdXNpblwiLCBibHVyOiBcImZvY3Vzb3V0XCIgfSwgZnVuY3Rpb24oIHR5cGUsIGRlbGVnYXRlVHlwZSApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSA9IHtcblxuXHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdC8vIGRhdGFQcml2LnNldCggdGhpcywgXCJmb2N1c1wiLCAuLi4gKVxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImJsdXJcIiwgLi4uIClcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlLCBleHBlY3RTeW5jICk7XG5cblx0XHRcdC8vIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgcHJvY2Vzc2luZyBpbiB0aGUgY2FsbGVyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRkZWxlZ2F0ZVR5cGU6IGRlbGVnYXRlVHlwZVxuXHR9O1xufSApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuZ2V0KCBzcmMgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZGVzdCwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGZsYXQoIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICYmICFub2RlLm5vTW9kdWxlICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlOiBub2RlLm5vbmNlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCBcIm5vbmNlXCIgKVxuXHRcdFx0XHRcdFx0XHRcdH0sIGRvYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBub2RlLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGlzQXR0YWNoZWQoIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NjRcblx0XHQvLyBEb24ndCBnZXQgdHJpY2tlZCB3aGVuIHpvb20gYWZmZWN0cyBvZmZzZXRXaWR0aCAoZ2gtNDAyOSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2Lm9mZnNldFdpZHRoIC8gMyApID09PSAxMjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblx0XHRwaXhlbEJveFN0eWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRzY3JvbGxib3hTaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gQmVoYXZpb3IgaW4gSUUgOSBpcyBtb3JlIHN1YnRsZSB0aGFuIGluIG5ld2VyIHZlcnNpb25zICYgaXQgcGFzc2VzXG5cdFx0Ly8gc29tZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3Q7IG1ha2Ugc3VyZSBub3QgdG8gbWFrZSBpdCBwYXNzIHRoZXJlIVxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWJsZSwgdHIsIHRyQ2hpbGQsIHRyU3R5bGU7XG5cdFx0XHRpZiAoIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0YWJsZVwiICk7XG5cdFx0XHRcdHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0clwiICk7XG5cdFx0XHRcdHRyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0XHRcdFx0dGFibGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweFwiO1xuXHRcdFx0XHR0ci5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmhlaWdodCA9IFwiOXB4XCI7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50XG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0YWJsZSApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ciApXG5cdFx0XHRcdFx0LmFwcGVuZENoaWxkKCB0ckNoaWxkICk7XG5cblx0XHRcdFx0dHJTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCB0ciApO1xuXHRcdFx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCA9IHBhcnNlSW50KCB0clN0eWxlLmhlaWdodCApID4gMztcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIHRhYmxlICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVUckRpbWVuc2lvbnNWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDA7XG5cblx0Ly8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeVxuXHRpZiAoIGJveCA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApICkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC00MzIyKS5cblx0XHQvLyBGYWtlIGNvbnRlbnQtYm94IHVudGlsIHdlIGtub3cgaXQncyBuZWVkZWQgdG8ga25vdyB0aGUgdHJ1ZSB2YWx1ZS5cblx0XHRib3hTaXppbmdOZWVkZWQgPSAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IGV4dHJhLFxuXHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCxcblxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRvZmZzZXRQcm9wID0gXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0Ly8gUmV0dXJuIGEgY29uZm91bmRpbmcgbm9uLXBpeGVsIHZhbHVlIG9yIGZlaWduIGlnbm9yYW5jZSwgYXMgYXBwcm9wcmlhdGUuXG5cdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdGlmICggIWV4dHJhICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0dmFsID0gXCJhdXRvXCI7XG5cdH1cblxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIFVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIHdoZW4gYm94IHNpemluZyBpcyB1bnJlbGlhYmxlLlxuXHQvLyBJbiB0aG9zZSBjYXNlcywgdGhlIGNvbXB1dGVkIHZhbHVlIGNhbiBiZSB0cnVzdGVkIHRvIGJlIGJvcmRlci1ib3guXG5cdGlmICggKCAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpICYmIGlzQm9yZGVyQm94IHx8XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMCAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gSW50ZXJlc3RpbmdseSwgaW4gc29tZSBjYXNlcyBJRSA5IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBpc3N1ZS5cblx0XHQhc3VwcG9ydC5yZWxpYWJsZVRyRGltZW5zaW9ucygpICYmIG5vZGVOYW1lKCBlbGVtLCBcInRyXCIgKSB8fFxuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCB3aGVuIHZhbHVlIGlzIFwiYXV0b1wiXG5cdFx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHRcdHZhbCA9PT0gXCJhdXRvXCIgfHxcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seVxuXHRcdC8vIEFsc28gdXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3IgbWlzcmVwb3J0ZWQgaW5saW5lIGRpbWVuc2lvbnMgKGdoLTM2MDIpXG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSAmJlxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHZpc2libGUgJiBjb25uZWN0ZWRcblx0XHRlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdFx0Ly8gV2hlcmUgYXZhaWxhYmxlLCBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgYXBwcm94aW1hdGUgYm9yZGVyIGJveCBkaW1lbnNpb25zLlxuXHRcdC8vIFdoZXJlIG5vdCBhdmFpbGFibGUgKGUuZy4sIFNWRyksIGFzc3VtZSB1bnJlbGlhYmxlIGJveC1zaXppbmcgYW5kIGludGVycHJldCB0aGVcblx0XHQvLyByZXRyaWV2ZWQgdmFsdWUgYXMgYSBjb250ZW50IGJveCBkaW1lbnNpb24uXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IG9mZnNldFByb3AgaW4gZWxlbTtcblx0XHRpZiAoIHZhbHVlSXNCb3JkZXJCb3ggKSB7XG5cdFx0XHR2YWwgPSBlbGVtWyBvZmZzZXRQcm9wIF07XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImdyaWRBcmVhXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uRW5kXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uU3RhcnRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dFbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dTdGFydFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHt9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0Ly8gVGhlIGlzQ3VzdG9tUHJvcCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpbiBqUXVlcnkgNC4wIHdoZW4gd2Ugb25seSBhdXRvLWFwcGVuZFxuXHRcdFx0Ly8gXCJweFwiIHRvIGEgZmV3IGhhcmRjb2RlZCB2YWx1ZXMuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggX2ksIGRpbWVuc2lvbiApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBkaW1lbnNpb24gXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrXG5cdFx0XHRcdFx0Ly8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm9cblx0XHRcdFx0XHQvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdFx0XHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGVcblx0XHRcdFx0XHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdFx0XHRcdFx0KCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID9cblx0XHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0XHRcdC8vIE9ubHkgcmVhZCBzdHlsZXMucG9zaXRpb24gaWYgdGhlIHRlc3QgaGFzIGEgY2hhbmNlIHRvIGZhaWxcblx0XHRcdFx0Ly8gdG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdy5cblx0XHRcdFx0c2Nyb2xsYm94U2l6ZUJ1Z2d5ID0gIXN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpICYmXG5cdFx0XHRcdFx0c3R5bGVzLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIsXG5cblx0XHRcdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtMzk5MSlcblx0XHRcdFx0Ym94U2l6aW5nTmVlZGVkID0gc2Nyb2xsYm94U2l6ZUJ1Z2d5IHx8IGV4dHJhLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgP1xuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdFx0KSA6XG5cdFx0XHRcdFx0MDtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdW5yZWxpYWJsZSBib3JkZXItYm94IGRpbWVuc2lvbnMgYnkgY29tcGFyaW5nIG9mZnNldCogdG8gY29tcHV0ZWQgYW5kXG5cdFx0XHQvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KVxuXHRcdFx0aWYgKCBpc0JvcmRlckJveCAmJiBzY3JvbGxib3hTaXplQnVnZ3kgKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoIHByZWZpeCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gfHxcblx0XHRcdFx0XHR0d2Vlbi5lbGVtLnN0eWxlWyBmaW5hbFByb3BOYW1lKCB0d2Vlbi5wcm9wICkgXSAhPSBudWxsICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCBpblByb2dyZXNzLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5oaWRkZW4gPT09IGZhbHNlICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBzY2hlZHVsZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHRcdH1cblxuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IERhdGUubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCBob29rcywgb2xkZmlyZSwgcHJvcFR3ZWVuLCByZXN0b3JlRGlzcGxheSwgZGlzcGxheSxcblx0XHRpc0JveCA9IFwid2lkdGhcIiBpbiBwcm9wcyB8fCBcImhlaWdodFwiIGluIHByb3BzLFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIFF1ZXVlLXNraXBwaW5nIGFuaW1hdGlvbnMgaGlqYWNrIHRoZSBmeCBob29rc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBEZXRlY3Qgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgXCJzaG93XCIgYW5kXG5cdFx0XHRcdC8vIHRoZXJlIGlzIHN0aWxsIGRhdGEgZnJvbSBhIHN0b3BwZWQgc2hvdy9oaWRlXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBhbGwgb3RoZXIgbm8tb3Agc2hvdy9oaWRlIGRhdGFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBCYWlsIG91dCBpZiB0aGlzIGlzIGEgbm8tb3AgbGlrZSAuaGlkZSgpLmhpZGUoKVxuXHRwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7XG5cdGlmICggIXByb3BUd2VlbiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlc3RyaWN0IFwib3ZlcmZsb3dcIiBhbmQgXCJkaXNwbGF5XCIgc3R5bGVzIGR1cmluZyBib3ggYW5pbWF0aW9uc1xuXHRpZiAoIGlzQm94ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdCBpbmZlciB0aGUgc2hvcnRoYW5kXG5cdFx0Ly8gZnJvbSBpZGVudGljYWxseS12YWx1ZWQgb3ZlcmZsb3dYIGFuZCBvdmVyZmxvd1kgYW5kIEVkZ2UganVzdCBtaXJyb3JzXG5cdFx0Ly8gdGhlIG92ZXJmbG93WCB2YWx1ZSB0aGVyZS5cblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZVxuXHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTtcblx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHR9XG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgKSB7XG5cdFx0XHRcdGRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gR2V0IG5vbmVtcHR5IHZhbHVlKHMpIGJ5IHRlbXBvcmFyaWx5IGZvcmNpbmcgdmlzaWJpbGl0eVxuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRlIGlubGluZSBlbGVtZW50cyBhcyBpbmxpbmUtYmxvY2tcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwiaW5saW5lXCIgfHwgZGlzcGxheSA9PT0gXCJpbmxpbmUtYmxvY2tcIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHB1cmUgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0XHRcdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdGRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuXHRcdFx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBkaXNwbGF5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRwcm9wVHdlZW4gPSBmYWxzZTtcblx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXG5cdFx0Ly8gR2VuZXJhbCBzaG93L2hpZGUgc2V0dXAgZm9yIHRoaXMgZWxlbWVudCBhbmltYXRpb25cblx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwgeyBkaXNwbGF5OiByZXN0b3JlRGlzcGxheSB9ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0b3JlIGhpZGRlbi92aXNpYmxlIGZvciB0b2dnbGUgc28gYC5zdG9wKCkudG9nZ2xlKClgIFwicmV2ZXJzZXNcIlxuXHRcdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgZWxlbWVudHMgYmVmb3JlIGFuaW1hdGluZyB0aGVtXG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRcdC8vIFRoZSBmaW5hbCBzdGVwIG9mIGEgXCJoaWRlXCIgYW5pbWF0aW9uIGlzIGFjdHVhbGx5IGhpZGluZyB0aGUgZWxlbWVudFxuXHRcdFx0XHRpZiAoICFoaWRkZW4gKSB7XG5cdFx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gUGVyLXByb3BlcnR5IHNldHVwXG5cdFx0cHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdHByb3BUd2Vlbi5lbmQgPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRcdHByb3BUd2Vlbi5zdGFydCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0gY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XG5cdFx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTtcblx0XHR9XG5cblx0XHRpZiAoIGluZGV4ICE9PSBuYW1lICkge1xuXHRcdFx0cHJvcHNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xuXHRcdH1cblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XG5cdFx0aWYgKCBob29rcyAmJiBcImV4cGFuZFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcblxuXHRcdFx0Ly8gTm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBrZXlzLlxuXHRcdFx0Ly8gUmV1c2luZyAnaW5kZXgnIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxuXHRcdFx0Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHtcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xuXHRcdFx0XHRcdHNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7XG5cdHZhciByZXN1bHQsXG5cdFx0c3RvcHBlZCxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yXG5cdFx0XHRkZWxldGUgdGljay5lbGVtO1xuXHRcdH0gKSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMyBvbmx5XG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG1vcmUgdG8gZG8sIHlpZWxkXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgYW4gZW1wdHkgYW5pbWF0aW9uLCBzeW50aGVzaXplIGEgZmluYWwgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAoICFsZW5ndGggKSB7XG5cdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzb2x2ZSB0aGUgYW5pbWF0aW9uIGFuZCByZXBvcnQgaXRzIGNvbmNsdXNpb25cblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBEYXRlLm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4zIG9ubHlcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0bm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsXG5cdFx0XHRpID0gMCxcblxuXHRcdFx0Ly8gQXR0cmlidXRlIG5hbWVzIGNhbiBjb250YWluIG5vbi1IVE1MIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuXHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoXG5cdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsIClcblx0XHRcdFx0KVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gSGFuZGxlOiByZWd1bGFyIG5vZGVzICh2aWEgYHRoaXMub3duZXJEb2N1bWVudGApLCB3aW5kb3dcblx0XHRcdFx0Ly8gKHZpYSBgdGhpcy5kb2N1bWVudGApICYgZG9jdW1lbnQgKHZpYSBgdGhpc2ApLlxuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMuZG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cbnZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcblxudmFyIG5vbmNlID0geyBndWlkOiBEYXRlLm5vdygpIH07XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdGlmICggYSA9PSBudWxsICkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2VyaWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTtcblx0fSxcblx0c2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIENhbiBhZGQgcHJvcEhvb2sgZm9yIFwiZWxlbWVudHNcIiB0byBmaWx0ZXIgb3IgYWRkIGZvcm0gZWxlbWVudHNcblx0XHRcdHZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCBcImVsZW1lbnRzXCIgKTtcblx0XHRcdHJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzO1xuXHRcdH0gKVxuXHRcdC5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRcdC8vIFVzZSAuaXMoIFwiOmRpc2FibGVkXCIgKSBzbyB0aGF0IGZpZWxkc2V0W2Rpc2FibGVkXSB3b3Jrc1xuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoIFwiOmRpc2FibGVkXCIgKSAmJlxuXHRcdFx0XHRyc3VibWl0dGFibGUudGVzdCggdGhpcy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYmXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTtcblx0XHR9IClcblx0XHQubWFwKCBmdW5jdGlvbiggX2ksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlLmd1aWQrKyApICtcblx0XHRcdFx0XHR1bmNhY2hlZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUHV0IGhhc2ggYW5kIGFudGktY2FjaGUgb24gdGhlIFVSTCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIChnaC0xNzMyKVxuXHRcdFx0cy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkO1xuXG5cdFx0Ly8gQ2hhbmdlICclMjAnIHRvICcrJyBpZiB0aGlzIGlzIGVuY29kZWQgZm9ybSBib2R5IGNvbnRlbnQgKGdoLTI2NTgpXG5cdFx0fSBlbHNlIGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiZcblx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiICkuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICkge1xuXHRcdFx0cy5kYXRhID0gcy5kYXRhLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArXG5cdFx0XHRcdFx0KCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiZcblx0XHRcdCggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgY29tcGxldGVkICkgKSB7XG5cblx0XHRcdC8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVyblxuXHRcdFx0cmV0dXJuIGpxWEhSLmFib3J0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXG5cdFx0c3RyQWJvcnQgPSBcImFib3J0XCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcblx0XHRjb21wbGV0ZURlZmVycmVkLmFkZCggcy5jb21wbGV0ZSApO1xuXHRcdGpxWEhSLmRvbmUoIHMuc3VjY2VzcyApO1xuXHRcdGpxWEhSLmZhaWwoIHMuZXJyb3IgKTtcblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KCBcInRpbWVvdXRcIiApO1xuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29tcGxldGVkID0gZmFsc2U7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIG90aGVycyBhcyByZXN1bHRzXG5cdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gSWdub3JlIHJlcGVhdCBpbnZvY2F0aW9uc1xuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHNcblx0XHRcdGlmICggdGltZW91dFRpbWVyICkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlIGEgbm9vcCBjb252ZXJ0ZXIgZm9yIG1pc3Npbmcgc2NyaXB0XG5cdFx0XHRpZiAoICFpc1N1Y2Nlc3MgJiYgalF1ZXJ5LmluQXJyYXkoIFwic2NyaXB0XCIsIHMuZGF0YVR5cGVzICkgPiAtMSApIHtcblx0XHRcdFx0cy5jb252ZXJ0ZXJzWyBcInRleHQgc2NyaXB0XCIgXSA9IGZ1bmN0aW9uKCkge307XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgbm8gbWF0dGVyIHdoYXQgKHRoYXQgd2F5IHJlc3BvbnNlWFhYIGZpZWxkcyBhcmUgYWx3YXlzIHNldClcblx0XHRcdHJlc3BvbnNlID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICk7XG5cblx0XHRcdC8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblxuXHRcdFx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkxhc3QtTW9kaWZpZWRcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiZXRhZ1wiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdID0gbW9kaWZpZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaWYgbm8gY29udGVudFxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMjA0IHx8IHMudHlwZSA9PT0gXCJIRUFEXCIgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm9jb250ZW50XCI7XG5cblx0XHRcdFx0Ly8gaWYgbm90IG1vZGlmaWVkXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBkYXRhLCBsZXQncyBjb252ZXJ0IGl0XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlO1xuXHRcdFx0XHRcdHN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdGVycm9yID0gcmVzcG9uc2UuZXJyb3I7XG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHNcblx0XHRcdFx0ZXJyb3IgPSBzdGF0dXNUZXh0O1xuXHRcdFx0XHRpZiAoIHN0YXR1cyB8fCAhc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJlcnJvclwiO1xuXHRcdFx0XHRcdGlmICggc3RhdHVzIDwgMCApIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0XG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0XHRqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArIFwiXCI7XG5cblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3Jcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0anFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApO1xuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/IFwiYWpheFN1Y2Nlc3NcIiA6IFwiYWpheEVycm9yXCIsXG5cdFx0XHRcdFx0WyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcGxldGVcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhDb21wbGV0ZVwiLCBbIGpxWEhSLCBzIF0gKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RvcFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ganFYSFI7XG5cdH0sXG5cblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssIFwianNvblwiICk7XG5cdH0sXG5cblx0Z2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJnZXRcIiwgXCJwb3N0XCIgXSwgZnVuY3Rpb24oIF9pLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0dmFyIGk7XG5cdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdGlmICggaS50b0xvd2VyQ2FzZSgpID09PSBcImNvbnRlbnQtdHlwZVwiICkge1xuXHRcdFx0cy5jb250ZW50VHlwZSA9IHMuaGVhZGVyc1sgaSBdIHx8IFwiXCI7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCwgb3B0aW9ucywgZG9jICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiBvciBmb3JjZWQtYnktYXR0cnMgcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluIHx8IHMuc2NyaXB0QXR0cnMgKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKVxuXHRcdFx0XHRcdC5hdHRyKCBzLnNjcmlwdEF0dHJzIHx8IHt9IClcblx0XHRcdFx0XHQucHJvcCggeyBjaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsIHNyYzogcy51cmwgfSApXG5cdFx0XHRcdFx0Lm9uKCBcImxvYWQgZXJyb3JcIiwgY2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGpzb25wOiBcImNhbGxiYWNrXCIsXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgXCJfXCIgKyAoIG5vbmNlLmd1aWQrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBGb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA4IG9ubHlcbi8vIEluIFNhZmFyaSA4IGRvY3VtZW50cyBjcmVhdGVkIHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnRcbi8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGlzIHNlY3VyaXR5IG1lYXN1cmUgaGFzIHRvIGJlIGRpc2FibGVkIGluIFNhZmFyaSA4LlxuLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzMzN1xuc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkge1xuXHR2YXIgYm9keSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApLmJvZHk7XG5cdGJvZHkuaW5uZXJIVE1MID0gXCI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPlwiO1xuXHRyZXR1cm4gYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMjtcbn0gKSgpO1xuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblxuXHR2YXIgYmFzZSwgcGFyc2VkLCBzY3JpcHRzO1xuXG5cdGlmICggIWNvbnRleHQgKSB7XG5cblx0XHQvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcblx0XHQvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvblxuXHRcdGlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICk7XG5cblx0XHRcdC8vIFNldCB0aGUgYmFzZSBocmVmIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHNcblx0XHRcdC8vIGFyZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyBVUkwgKGdoLTI5NjUpXG5cdFx0XHRiYXNlID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImJhc2VcIiApO1xuXHRcdFx0YmFzZS5ocmVmID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcblx0XHRcdGNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0cGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7XG5cdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IHN0cmlwQW5kQ29sbGFwc2UoIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KCB7XG5cdFx0XHR1cmw6IHVybCxcblxuXHRcdFx0Ly8gSWYgXCJ0eXBlXCIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuIFwiR0VUXCIgbWV0aG9kIHdpbGwgYmUgdXNlZC5cblx0XHRcdC8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZVxuXHRcdFx0Ly8gdXNlciBjYW4gb3ZlcnJpZGUgaXQgdGhyb3VnaCBhamF4U2V0dXAgbWV0aG9kXG5cdFx0XHR0eXBlOiB0eXBlIHx8IFwiR0VUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9ICkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcblxuXHRcdFx0Ly8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrXG5cdFx0XHRyZXNwb25zZSA9IGFyZ3VtZW50cztcblxuXHRcdFx0c2VsZi5odG1sKCBzZWxlY3RvciA/XG5cblx0XHRcdFx0Ly8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9yc1xuXHRcdFx0XHRqUXVlcnkoIFwiPGRpdj5cIiApLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdC8vIElmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJkYXRhXCIsIFwic3RhdHVzXCIsIFwianFYSFJcIlxuXHRcdC8vIGJ1dCB0aGV5IGFyZSBpZ25vcmVkIGJlY2F1c2UgcmVzcG9uc2Ugd2FzIHNldCBhYm92ZS5cblx0XHQvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBnZXRzIFwianFYSFJcIiwgXCJzdGF0dXNcIiwgXCJlcnJvclwiXG5cdFx0fSApLmFsd2F5cyggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7XG5cdFx0XHRzZWxmLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSApLmxlbmd0aDtcbn07XG5cblxuXG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0KCBjdXJDU1NUb3AgKyBjdXJDU1NMZWZ0ICkuaW5kZXhPZiggXCJhdXRvXCIgKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggdHlwZW9mIHByb3BzLnRvcCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0cHJvcHMudG9wICs9IFwicHhcIjtcblx0XHRcdH1cblx0XHRcdGlmICggdHlwZW9mIHByb3BzLmxlZnQgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHByb3BzLmxlZnQgKz0gXCJweFwiO1xuXHRcdFx0fVxuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggX2ksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHsgcGFkZGluZzogXCJpbm5lclwiICsgbmFtZSwgY29udGVudDogdHlwZSwgXCJcIjogXCJvdXRlclwiICsgbmFtZSB9LFxuXHRcdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goICggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cblx0XHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRcdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cdH0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG4vLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1BcbnZhciBydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZztcblxuLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55XG4vLyBhcmd1bWVudHMuXG4vLyBqUXVlcnkucHJveHkgaXMgZGVwcmVjYXRlZCB0byBwcm9tb3RlIHN0YW5kYXJkcyAoc3BlY2lmaWNhbGx5IEZ1bmN0aW9uI2JpbmQpXG4vLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb25cbmpRdWVyeS5wcm94eSA9IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcblx0dmFyIHRtcCwgYXJncywgcHJveHk7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHR0bXAgPSBmblsgY29udGV4dCBdO1xuXHRcdGNvbnRleHQgPSBmbjtcblx0XHRmbiA9IHRtcDtcblx0fVxuXG5cdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdGlmICggIWlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIFNpbXVsYXRlZCBiaW5kXG5cdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTtcblx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0fTtcblxuXHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0cmV0dXJuIHByb3h5O1xufTtcblxualF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkge1xuXHRpZiAoIGhvbGQgKSB7XG5cdFx0alF1ZXJ5LnJlYWR5V2FpdCsrO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS5yZWFkeSggdHJ1ZSApO1xuXHR9XG59O1xualF1ZXJ5LmlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xualF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7XG5qUXVlcnkubm9kZU5hbWUgPSBub2RlTmFtZTtcbmpRdWVyeS5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93O1xualF1ZXJ5LmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbmpRdWVyeS50eXBlID0gdG9UeXBlO1xuXG5qUXVlcnkubm93ID0gRGF0ZS5ub3c7XG5cbmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkge1xuXG5cdC8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvXG5cdC8vIHN0cmluZ3MgYW5kIG51bWJlcnMgKHByaW1pdGl2ZXMgb3Igb2JqZWN0cylcblx0Ly8gdGhhdCBjYW4gYmUgY29lcmNlZCB0byBmaW5pdGUgbnVtYmVycyAoZ2gtMjY2Milcblx0dmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cdHJldHVybiAoIHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiApICYmXG5cblx0XHQvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1jYXN0IGZhbHNlIHBvc2l0aXZlcyAoXCJcIilcblx0XHQvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzIChcIjB4Li4uXCIpXG5cdFx0Ly8gc3VidHJhY3Rpb24gZm9yY2VzIGluZmluaXRpZXMgdG8gTmFOXG5cdFx0IWlzTmFOKCBvYmogLSBwYXJzZUZsb2F0KCBvYmogKSApO1xufTtcblxualF1ZXJ5LnRyaW0gPSBmdW5jdGlvbiggdGV4dCApIHtcblx0cmV0dXJuIHRleHQgPT0gbnVsbCA/XG5cdFx0XCJcIiA6XG5cdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG59O1xuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1Nylcbi8vIGFuZCBDb21tb25KUyBmb3IgYnJvd3NlciBlbXVsYXRvcnMgKCMxMzU2NilcbmlmICggdHlwZW9mIG5vR2xvYmFsID09PSBcInVuZGVmaW5lZFwiICkge1xuXHR3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7XG59XG5cblxuXG5cbnJldHVybiBqUXVlcnk7XG59ICk7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xvbmVCdWZmZXI7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5leHBvcnQgZGVmYXVsdCBmcmVlR2xvYmFsO1xuIiwiaW1wb3J0IGZyZWVHbG9iYWwgZnJvbSAnLi9fZnJlZUdsb2JhbC5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbmV4cG9ydCBkZWZhdWx0IG5vZGVVdGlsO1xuIiwiaW1wb3J0IGZyZWVHbG9iYWwgZnJvbSAnLi9fZnJlZUdsb2JhbC5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuZXhwb3J0IGRlZmF1bHQgcm9vdDtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuaW1wb3J0IHN0dWJGYWxzZSBmcm9tICcuL3N0dWJGYWxzZS5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgaXNCdWZmZXI7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0dWJGYWxzZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgTWluaVNpZ25hbEJpbmRpbmcgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNaW5pU2lnbmFsQmluZGluZyhmbiwgb25jZSwgdGhpc0FyZykge1xuICAgIGlmIChvbmNlID09PSB1bmRlZmluZWQpIG9uY2UgPSBmYWxzZTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNaW5pU2lnbmFsQmluZGluZyk7XG5cbiAgICB0aGlzLl9mbiA9IGZuO1xuICAgIHRoaXMuX29uY2UgPSBvbmNlO1xuICAgIHRoaXMuX3RoaXNBcmcgPSB0aGlzQXJnO1xuICAgIHRoaXMuX25leHQgPSB0aGlzLl9wcmV2ID0gdGhpcy5fb3duZXIgPSBudWxsO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1pbmlTaWduYWxCaW5kaW5nLCBbe1xuICAgIGtleTogJ2RldGFjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIGlmICh0aGlzLl9vd25lciA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5fb3duZXIuZGV0YWNoKHRoaXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1pbmlTaWduYWxCaW5kaW5nO1xufSkoKTtcblxuZnVuY3Rpb24gX2FkZE1pbmlTaWduYWxCaW5kaW5nKHNlbGYsIG5vZGUpIHtcbiAgaWYgKCFzZWxmLl9oZWFkKSB7XG4gICAgc2VsZi5faGVhZCA9IG5vZGU7XG4gICAgc2VsZi5fdGFpbCA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5fdGFpbC5fbmV4dCA9IG5vZGU7XG4gICAgbm9kZS5fcHJldiA9IHNlbGYuX3RhaWw7XG4gICAgc2VsZi5fdGFpbCA9IG5vZGU7XG4gIH1cblxuICBub2RlLl9vd25lciA9IHNlbGY7XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbnZhciBNaW5pU2lnbmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWluaVNpZ25hbCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWluaVNpZ25hbCk7XG5cbiAgICB0aGlzLl9oZWFkID0gdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNaW5pU2lnbmFsLCBbe1xuICAgIGtleTogJ2hhbmRsZXJzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlcnMoKSB7XG4gICAgICB2YXIgZXhpc3RzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcblxuICAgICAgaWYgKGV4aXN0cykgcmV0dXJuICEhbm9kZTtcblxuICAgICAgdmFyIGVlID0gW107XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGVlLnB1c2gobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLl9uZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKG5vZGUpIHtcbiAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBNaW5pU2lnbmFsQmluZGluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaW5pU2lnbmFsI2hhcygpOiBGaXJzdCBhcmcgbXVzdCBiZSBhIE1pbmlTaWduYWxCaW5kaW5nIG9iamVjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5vZGUuX293bmVyID09PSB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Rpc3BhdGNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG5cbiAgICAgIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5fb25jZSkgdGhpcy5kZXRhY2gobm9kZSk7XG4gICAgICAgIG5vZGUuX2ZuLmFwcGx5KG5vZGUuX3RoaXNBcmcsIGFyZ3VtZW50cyk7XG4gICAgICAgIG5vZGUgPSBub2RlLl9uZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhZGQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoZm4pIHtcbiAgICAgIHZhciB0aGlzQXJnID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pbmlTaWduYWwjYWRkKCk6IEZpcnN0IGFyZyBtdXN0IGJlIGEgRnVuY3Rpb24uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2FkZE1pbmlTaWduYWxCaW5kaW5nKHRoaXMsIG5ldyBNaW5pU2lnbmFsQmluZGluZyhmbiwgZmFsc2UsIHRoaXNBcmcpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25jZShmbikge1xuICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWluaVNpZ25hbCNvbmNlKCk6IEZpcnN0IGFyZyBtdXN0IGJlIGEgRnVuY3Rpb24uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2FkZE1pbmlTaWduYWxCaW5kaW5nKHRoaXMsIG5ldyBNaW5pU2lnbmFsQmluZGluZyhmbiwgdHJ1ZSwgdGhpc0FyZykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2RldGFjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaChub2RlKSB7XG4gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgTWluaVNpZ25hbEJpbmRpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWluaVNpZ25hbCNkZXRhY2goKTogRmlyc3QgYXJnIG11c3QgYmUgYSBNaW5pU2lnbmFsQmluZGluZyBvYmplY3QuJyk7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5fb3duZXIgIT09IHRoaXMpIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobm9kZS5fcHJldikgbm9kZS5fcHJldi5fbmV4dCA9IG5vZGUuX25leHQ7XG4gICAgICBpZiAobm9kZS5fbmV4dCkgbm9kZS5fbmV4dC5fcHJldiA9IG5vZGUuX3ByZXY7XG5cbiAgICAgIGlmIChub2RlID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBub2RlLl9uZXh0O1xuICAgICAgICBpZiAobm9kZS5fbmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3RhaWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgPT09IHRoaXMuX3RhaWwpIHtcbiAgICAgICAgdGhpcy5fdGFpbCA9IG5vZGUuX3ByZXY7XG4gICAgICAgIHRoaXMuX3RhaWwuX25leHQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlLl9vd25lciA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZXRhY2hBbGwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2hBbGwoKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiB0aGlzO1xuXG4gICAgICB0aGlzLl9oZWFkID0gdGhpcy5fdGFpbCA9IG51bGw7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIG5vZGUuX293bmVyID0gbnVsbDtcbiAgICAgICAgbm9kZSA9IG5vZGUuX25leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWluaVNpZ25hbDtcbn0pKCk7XG5cbk1pbmlTaWduYWwuTWluaVNpZ25hbEJpbmRpbmcgPSBNaW5pU2lnbmFsQmluZGluZztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTWluaVNpZ25hbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgYWYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhZicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcmllX0ZlYnJ1YXJpZV9NYWFydF9BcHJpbF9NZWlfSnVuaWVfSnVsaWVfQXVndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGVzZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTXJ0X0Fwcl9NZWlfSnVuX0p1bF9BdWdfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTb25kYWdfTWFhbmRhZ19EaW5zZGFnX1dvZW5zZGFnX0RvbmRlcmRhZ19WcnlkYWdfU2F0ZXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnU29uX01hYV9EaW5fV29lX0Rvbl9WcnlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdTb19NYV9EaV9Xb19Eb19Wcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3ZtfG5tL2ksXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXm5tJC9pLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICd2bScgOiAnVk0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdubScgOiAnTk0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVmFuZGFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tNw7RyZSBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0dpc3RlciBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0xhYXNdIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnb29yICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgZ2VsZWRlJyxcbiAgICAgICAgICAgIHMgOiAnXFwnbiBwYWFyIHNla29uZGVzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNla29uZGVzJyxcbiAgICAgICAgICAgIG0gOiAnXFwnbiBtaW51dXQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlJyxcbiAgICAgICAgICAgIGggOiAnXFwnbiB1dXInLFxuICAgICAgICAgICAgaGggOiAnJWQgdXJlJyxcbiAgICAgICAgICAgIGQgOiAnXFwnbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFlJyxcbiAgICAgICAgICAgIE0gOiAnXFwnbiBtYWFuZCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtYWFuZGUnLFxuICAgICAgICAgICAgeSA6ICdcXCduIGphYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgamFhcidcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICgobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjApID8gJ3N0ZScgOiAnZGUnKTsgLy8gVGhhbmtzIHRvIEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vamp1cGl0ZXJcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1hYW5kYWcgaXMgZGllIGVlcnN0ZSBkYWcgdmFuIGRpZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gRGllIHdlZWsgd2F0IGRpZSA0ZGUgSmFudWFyaWUgYmV2YXQgaXMgZGllIGVlcnN0ZSB3ZWVrIHZhbiBkaWUgamFhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFmO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgYXJEeiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWR6Jywge1xuICAgICAgICBtb250aHMgOiAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfYp9it2K9f2KfYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KfYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn2KPYrV/YpdirX9ir2YTYp1/Yo9ixX9iu2YVf2KzZhV/Ys9ioJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgcyA6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzcyA6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG0gOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbSA6ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGggOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGggOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkIDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZCA6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNIDogJ9i02YfYsScsXG4gICAgICAgICAgICBNTSA6ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5IDogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eSA6ICclZCDYs9mG2YjYp9iqJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhckR6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgYXJLdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWt3Jywge1xuICAgICAgICBtb250aHMgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn2KfZhNij2K3Yr1/Yp9mE2KXYqtmG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9in2K3Yr1/Yp9iq2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHMgOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3MgOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtIDogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW0gOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoIDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoIDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZCA6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQgOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTSA6ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU0gOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeSA6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXkgOiAnJWQg2LPZhtmI2KfYqidcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhckt3O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICcxJyxcbiAgICAgICAgJzInOiAnMicsXG4gICAgICAgICczJzogJzMnLFxuICAgICAgICAnNCc6ICc0JyxcbiAgICAgICAgJzUnOiAnNScsXG4gICAgICAgICc2JzogJzYnLFxuICAgICAgICAnNyc6ICc3JyxcbiAgICAgICAgJzgnOiAnOCcsXG4gICAgICAgICc5JzogJzknLFxuICAgICAgICAnMCc6ICcwJ1xuICAgIH0sIHBsdXJhbEZvcm0gPSBmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gbiA9PT0gMCA/IDAgOiBuID09PSAxID8gMSA6IG4gPT09IDIgPyAyIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTAgPyAzIDogbiAlIDEwMCA+PSAxMSA/IDQgOiA1O1xuICAgIH0sIHBsdXJhbHMgPSB7XG4gICAgICAgIHMgOiBbJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLCAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJywgWyfYq9in2YbZitiq2KfZhicsICfYq9in2YbZitiq2YrZhiddLCAnJWQg2KvZiNin2YYnLCAnJWQg2KvYp9mG2YrYqScsICclZCDYq9in2YbZitipJ10sXG4gICAgICAgIG0gOiBbJ9ij2YLZhCDZhdmGINiv2YLZitmC2KknLCAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJywgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLCAnJWQg2K/Zgtin2KbZgicsICclZCDYr9mC2YrZgtipJywgJyVkINiv2YLZitmC2KknXSxcbiAgICAgICAgaCA6IFsn2KPZgtmEINmF2YYg2LPYp9i52KknLCAn2LPYp9i52Kkg2YjYp9it2K/YqScsIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLCAnJWQg2LPYp9i52KfYqicsICclZCDYs9in2LnYqScsICclZCDYs9in2LnYqSddLFxuICAgICAgICBkIDogWyfYo9mC2YQg2YXZhiDZitmI2YUnLCAn2YrZiNmFINmI2KfYrdivJywgWyfZitmI2YXYp9mGJywgJ9mK2YjZhdmK2YYnXSwgJyVkINij2YrYp9mFJywgJyVkINmK2YjZhdmL2KcnLCAnJWQg2YrZiNmFJ10sXG4gICAgICAgIE0gOiBbJ9ij2YLZhCDZhdmGINi02YfYsScsICfYtNmH2LEg2YjYp9it2K8nLCBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLCAnJWQg2KPYtNmH2LEnLCAnJWQg2LTZh9ix2KcnLCAnJWQg2LTZh9ixJ10sXG4gICAgICAgIHkgOiBbJ9ij2YLZhCDZhdmGINi52KfZhScsICfYudin2YUg2YjYp9it2K8nLCBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLCAnJWQg2KPYudmI2KfZhScsICclZCDYudin2YXZi9inJywgJyVkINi52KfZhSddXG4gICAgfSwgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIHZhciBmID0gcGx1cmFsRm9ybShudW1iZXIpLFxuICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3RyID0gc3RyW3dpdGhvdXRTdWZmaXggPyAwIDogMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgIH07XG4gICAgfSwgbW9udGhzID0gW1xuICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICfZgdio2LHYp9mK2LEnLFxuICAgICAgICAn2YXYp9ix2LMnLFxuICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICfZhdin2YrZiCcsXG4gICAgICAgICfZitmI2YbZitmIJyxcbiAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAn2KPYutiz2LfYsycsXG4gICAgICAgICfYs9io2KrZhdio2LEnLFxuICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgJ9mG2YjZgdmF2KjYsScsXG4gICAgICAgICfYr9mK2LPZhdio2LEnXG4gICAgXTtcblxuICAgIHZhciBhckx5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItbHknLCB7XG4gICAgICAgIG1vbnRocyA6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzIDogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2YvYpyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHMgOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIHNzIDogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtIDogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbSA6IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaCA6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGggOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQgOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkIDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNIDogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTSA6IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeSA6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXkgOiBwbHVyYWxpemUoJ3knKVxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhckx5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgYXJNYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLW1hJywge1xuICAgICAgICBtb250aHMgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn2KfZhNij2K3Yr1/Yp9mE2KXYqtmG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9in2K3Yr1/Yp9iq2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHMgOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3MgOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtIDogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW0gOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoIDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoIDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZCA6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQgOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTSA6ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU0gOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeSA6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXkgOiAnJWQg2LPZhtmI2KfYqidcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiAxMiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyTWE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ9mhJyxcbiAgICAgICAgJzInOiAn2aInLFxuICAgICAgICAnMyc6ICfZoycsXG4gICAgICAgICc0JzogJ9mkJyxcbiAgICAgICAgJzUnOiAn2aUnLFxuICAgICAgICAnNic6ICfZpicsXG4gICAgICAgICc3JzogJ9mnJyxcbiAgICAgICAgJzgnOiAn2agnLFxuICAgICAgICAnOSc6ICfZqScsXG4gICAgICAgICcwJzogJ9mgJ1xuICAgIH0sIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgJ9mgJzogJzAnXG4gICAgfTtcblxuICAgIHZhciBhclNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItc2EnLCB7XG4gICAgICAgIG1vbnRocyA6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZitmIX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiF/Yo9i62LPYt9izX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgcyA6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzcyA6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG0gOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbSA6ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGggOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGggOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkIDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZCA6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNIDogJ9i02YfYsScsXG4gICAgICAgICAgICBNTSA6ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5IDogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eSA6ICclZCDYs9mG2YjYp9iqJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSkucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhclNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgYXJUbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXRuJywge1xuICAgICAgICBtb250aHM6ICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzcyA6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJUbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgJzEnOiAn2aEnLFxuICAgICAgICAnMic6ICfZoicsXG4gICAgICAgICczJzogJ9mjJyxcbiAgICAgICAgJzQnOiAn2aQnLFxuICAgICAgICAnNSc6ICfZpScsXG4gICAgICAgICc2JzogJ9mmJyxcbiAgICAgICAgJzcnOiAn2acnLFxuICAgICAgICAnOCc6ICfZqCcsXG4gICAgICAgICc5JzogJ9mpJyxcbiAgICAgICAgJzAnOiAn2aAnXG4gICAgfSwgbnVtYmVyTWFwID0ge1xuICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAn2aAnOiAnMCdcbiAgICB9LCBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPT09IDAgPyAwIDogbiA9PT0gMSA/IDEgOiBuID09PSAyID8gMiA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwID8gMyA6IG4gJSAxMDAgPj0gMTEgPyA0IDogNTtcbiAgICB9LCBwbHVyYWxzID0ge1xuICAgICAgICBzIDogWyfYo9mC2YQg2YXZhiDYq9in2YbZitipJywgJ9ir2KfZhtmK2Kkg2YjYp9it2K/YqScsIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSwgJyVkINir2YjYp9mGJywgJyVkINir2KfZhtmK2KknLCAnJWQg2KvYp9mG2YrYqSddLFxuICAgICAgICBtIDogWyfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJywgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsIFsn2K/ZgtmK2YLYqtin2YYnLCAn2K/ZgtmK2YLYqtmK2YYnXSwgJyVkINiv2YLYp9im2YInLCAnJWQg2K/ZgtmK2YLYqScsICclZCDYr9mC2YrZgtipJ10sXG4gICAgICAgIGggOiBbJ9ij2YLZhCDZhdmGINiz2KfYudipJywgJ9iz2KfYudipINmI2KfYrdiv2KknLCBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSwgJyVkINiz2KfYudin2KonLCAnJWQg2LPYp9i52KknLCAnJWQg2LPYp9i52KknXSxcbiAgICAgICAgZCA6IFsn2KPZgtmEINmF2YYg2YrZiNmFJywgJ9mK2YjZhSDZiNin2K3YrycsIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sICclZCDYo9mK2KfZhScsICclZCDZitmI2YXZi9inJywgJyVkINmK2YjZhSddLFxuICAgICAgICBNIDogWyfYo9mC2YQg2YXZhiDYtNmH2LEnLCAn2LTZh9ixINmI2KfYrdivJywgWyfYtNmH2LHYp9mGJywgJ9i02YfYsdmK2YYnXSwgJyVkINij2LTZh9ixJywgJyVkINi02YfYsdinJywgJyVkINi02YfYsSddLFxuICAgICAgICB5IDogWyfYo9mC2YQg2YXZhiDYudin2YUnLCAn2LnYp9mFINmI2KfYrdivJywgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSwgJyVkINij2LnZiNin2YUnLCAnJWQg2LnYp9mF2YvYpycsICclZCDYudin2YUnXVxuICAgIH0sIHBsdXJhbGl6ZSA9IGZ1bmN0aW9uICh1KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICBzdHIgPSBwbHVyYWxzW3VdW3BsdXJhbEZvcm0obnVtYmVyKV07XG4gICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICB9O1xuICAgIH0sIG1vbnRocyA9IFtcbiAgICAgICAgJ9mK2YbYp9mK2LEnLFxuICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgJ9mF2KfYsdizJyxcbiAgICAgICAgJ9ij2KjYsdmK2YQnLFxuICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAn2YrZiNmG2YrZiCcsXG4gICAgICAgICfZitmI2YTZitmIJyxcbiAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAn2LPYqNiq2YXYqNixJyxcbiAgICAgICAgJ9ij2YPYqtmI2KjYsScsXG4gICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAn2K/Zitiz2YXYqNixJ1xuICAgIF07XG5cbiAgICB2YXIgYXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhcicsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXMgOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdEL1xcdTIwMEZNL1xcdTIwMEZZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfYqNi52K8gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgcyA6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3MgOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIG0gOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tIDogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoIDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBoaCA6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZCA6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQgOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIE0gOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NIDogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5IDogcGx1cmFsaXplKCd5JyksXG4gICAgICAgICAgICB5eSA6IHBsdXJhbGl6ZSgneScpXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAxOiAnLWluY2knLFxuICAgICAgICA1OiAnLWluY2knLFxuICAgICAgICA4OiAnLWluY2knLFxuICAgICAgICA3MDogJy1pbmNpJyxcbiAgICAgICAgODA6ICctaW5jaScsXG4gICAgICAgIDI6ICctbmNpJyxcbiAgICAgICAgNzogJy1uY2knLFxuICAgICAgICAyMDogJy1uY2knLFxuICAgICAgICA1MDogJy1uY2knLFxuICAgICAgICAzOiAnLcO8bmPDvCcsXG4gICAgICAgIDQ6ICctw7xuY8O8JyxcbiAgICAgICAgMTAwOiAnLcO8bmPDvCcsXG4gICAgICAgIDY6ICctbmPEsScsXG4gICAgICAgIDk6ICctdW5jdScsXG4gICAgICAgIDEwOiAnLXVuY3UnLFxuICAgICAgICAzMDogJy11bmN1JyxcbiAgICAgICAgNjA6ICctxLFuY8SxJyxcbiAgICAgICAgOTA6ICctxLFuY8SxJ1xuICAgIH07XG5cbiAgICB2YXIgYXogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdheicsIHtcbiAgICAgICAgbW9udGhzIDogJ3lhbnZhcl9mZXZyYWxfbWFydF9hcHJlbF9tYXlfaXl1bl9peXVsX2F2cXVzdF9zZW50eWFicl9va3R5YWJyX25veWFicl9kZWthYnInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ3lhbl9mZXZfbWFyX2Fwcl9tYXlfaXluX2l5bF9hdnFfc2VuX29rdF9ub3lfZGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdCYXphcl9CYXphciBlcnTJmXNpX8OHyZlyxZ/JmW5iyZkgYXjFn2FtxLFfw4fJmXLFn8mZbmLJmV9Dw7xtyZkgYXjFn2FtxLFfQ8O8bcmZX8WeyZluYsmZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0Jhel9CekVfw4dBeF/Dh8mZcl9DQXhfQ8O8bV/FnsmZbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQnpfQkVfw4dBX8OHyZlfQ0FfQ8O8X8WeyZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tidWfDvG4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbc2FiYWggc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW2fJmWzJmW4gaMmZZnTJmV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbZMO8bsmZbl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW2tlw6fJmW4gaMmZZnTJmV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgyZl2dsmZbCcsXG4gICAgICAgICAgICBzIDogJ2Jpcm5lw6fJmSBzYW5pecmZJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNhbml5yZknLFxuICAgICAgICAgICAgbSA6ICdiaXIgZMmZcWlxyZknLFxuICAgICAgICAgICAgbW0gOiAnJWQgZMmZcWlxyZknLFxuICAgICAgICAgICAgaCA6ICdiaXIgc2FhdCcsXG4gICAgICAgICAgICBoaCA6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIGQgOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQgOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICBNIDogJ2JpciBheScsXG4gICAgICAgICAgICBNTSA6ICclZCBheScsXG4gICAgICAgICAgICB5IDogJ2JpciBpbCcsXG4gICAgICAgICAgICB5eSA6ICclZCBpbCdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2dlY8mZfHPJmWjJmXJ8Z8O8bmTDvHp8YXjFn2FtLyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKGfDvG5kw7x6fGF4xZ9hbSkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2dlY8mZJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzyZloyZlyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdnw7xuZMO8eic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYXjFn2FtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjEsW5jxLF8aW5jaXxuY2l8w7xuY8O8fG5jxLF8dW5jdSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkgeyAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctxLFuY8SxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciAlIDEwMCAtIGEsXG4gICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSB8fCBzdWZmaXhlc1tjXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IChudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMCkgPyBmb3Jtc1sxXSA6IGZvcm1zWzJdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgJ3NzJzogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICAnbW0nOiB3aXRob3V0U3VmZml4ID8gJ9GF0LLRltC70ZbQvdCwX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScgOiAn0YXQstGW0LvRltC90YNf0YXQstGW0LvRltC90Ytf0YXQstGW0LvRltC9JyxcbiAgICAgICAgICAgICdoaCc6IHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LBf0LPQsNC00LfRltC90Ytf0LPQsNC00LfRltC9JyA6ICfQs9Cw0LTQt9GW0L3Rg1/Qs9Cw0LTQt9GW0L3Ri1/Qs9Cw0LTQt9GW0L0nLFxuICAgICAgICAgICAgJ2RkJzogJ9C00LfQtdC90Yxf0LTQvdGWX9C00LfRkdC9JyxcbiAgICAgICAgICAgICdNTSc6ICfQvNC10YHRj9GGX9C80LXRgdGP0YbRi1/QvNC10YHRj9GG0LDRnicsXG4gICAgICAgICAgICAneXknOiAn0LPQvtC0X9Cz0LDQtNGLX9Cz0LDQtNC+0Z4nXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstGW0LvRltC90LAnIDogJ9GF0LLRltC70ZbQvdGDJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LAnIDogJ9Cz0LDQtNC30ZbQvdGDJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmUnLCB7XG4gICAgICAgIG1vbnRocyA6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GB0YLRg9C00LfQtdC90Y9f0LvRjtGC0LDQs9CwX9GB0LDQutCw0LLRltC60LBf0LrRgNCw0YHQsNCy0ZbQutCwX9GC0YDQsNGe0L3Rj1/Rh9GN0YDQstC10L3Rj1/Qu9GW0L/QtdC90Y9f0LbQvdGW0Z7QvdGPX9Cy0LXRgNCw0YHQvdGPX9C60LDRgdGC0YDRi9GH0L3RltC60LBf0LvRltGB0YLQsNC/0LDQtNCwX9GB0L3QtdC20L3Rjycuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6ICfRgdGC0YPQtNC30LXQvdGMX9C70Y7RgtGLX9GB0LDQutCw0LLRltC6X9C60YDQsNGB0LDQstGW0Lpf0YLRgNCw0LLQtdC90Yxf0YfRjdGA0LLQtdC90Yxf0LvRltC/0LXQvdGMX9C20L3RltCy0LXQvdGMX9Cy0LXRgNCw0YHQtdC90Yxf0LrQsNGB0YLRgNGL0YfQvdGW0Lpf0LvRltGB0YLQsNC/0LDQtF/RgdC90LXQttCw0L3RjCcuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6ICfRgdGC0YPQtF/Qu9GO0YJf0YHQsNC6X9C60YDQsNGBX9GC0YDQsNCyX9GH0Y3RgNCyX9C70ZbQv1/QttC90ZbQsl/QstC10YBf0LrQsNGB0YJf0LvRltGB0YJf0YHQvdC10LYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0L3Rj9C00LfQtdC70Y5f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNGDX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbRg1/RgdGD0LHQvtGC0YMnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICBzdGFuZGFsb25lOiAn0L3Rj9C00LfQtdC70Y9f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNCwX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbQsF/RgdGD0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL1xcWyA/W9Cj0YPRnl0gPyg/OtC80ZbQvdGD0LvRg9GOfNC90LDRgdGC0YPQv9C90YPRjik/ID9cXF0gP2RkZGQvXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkg0LMuLCBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQodGR0L3QvdGPINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9CX0LDRntGC0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQo9GH0L7RgNCwINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW9CjXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRg9GOXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0KMg0LzRltC90YPQu9GLXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfQv9GA0LDQtyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzINGC0LDQvNGDJyxcbiAgICAgICAgICAgIHMgOiAn0L3QtdC60LDQu9GM0LrRliDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGhoIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQgOiAn0LTQt9C10L3RjCcsXG4gICAgICAgICAgICBkZCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNIDogJ9C80LXRgdGP0YYnLFxuICAgICAgICAgICAgTU0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeSA6ICfQs9C+0LQnLFxuICAgICAgICAgICAgeXkgOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfRi3zRgNCw0L3RltGG0Yt80LTQvdGPfNCy0LXRh9Cw0YDQsC8sXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LDRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0YsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA0LDQvdGW0YbRiyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQsNGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGWfNGLfNCz0LApLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVtYmVyICUgMTAgPT09IDIgfHwgbnVtYmVyICUgMTAgPT09IDMpICYmIChudW1iZXIgJSAxMDAgIT09IDEyICYmIG51bWJlciAlIDEwMCAhPT0gMTMpID8gbnVtYmVyICsgJy3RlicgOiBudW1iZXIgKyAnLdGLJztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQsCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBiZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JnJywge1xuICAgICAgICBtb250aHMgOiAn0Y/QvdGD0LDRgNC4X9GE0LXQstGA0YPQsNGA0Lhf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LLRgNC4X9C+0LrRgtC+0LzQstGA0Lhf0L3QvtC10LzQstGA0Lhf0LTQtdC60LXQvNCy0YDQuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn0Y/QvdGAX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9C90LXQtNC10LvRj1/Qv9C+0L3QtdC00LXQu9C90LjQul/QstGC0L7RgNC90LjQul/RgdGA0Y/QtNCwX9GH0LXRgtCy0YrRgNGC0YrQul/Qv9C10YLRitC6X9GB0YrQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfQvdC10LRf0L/QvtC9X9Cy0YLQvl/RgdGA0Y9f0YfQtdGCX9C/0LXRgl/RgdGK0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb0JTQvdC10YEg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW9Cj0YLRgNC1INCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb0JLRh9C10YDQsCDQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQuNC30LzQuNC90LDQu9Cw0YLQsF0gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0LjQt9C80LjQvdCw0LvQuNGPXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAn0YHQu9C10LQgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfQv9GA0LXQtNC4ICVzJyxcbiAgICAgICAgICAgIHMgOiAn0L3Rj9C60L7Qu9C60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3MgOiAnJWQg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbSA6ICfQvNC40L3Rg9GC0LAnLFxuICAgICAgICAgICAgbW0gOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGggOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGH0LDRgdCwJyxcbiAgICAgICAgICAgIGQgOiAn0LTQtdC9JyxcbiAgICAgICAgICAgIGRkIDogJyVkINC00L3QuCcsXG4gICAgICAgICAgICBNIDogJ9C80LXRgdC10YYnLFxuICAgICAgICAgICAgTU0gOiAnJWQg0LzQtdGB0LXRhtCwJyxcbiAgICAgICAgICAgIHkgOiAn0LPQvtC00LjQvdCwJyxcbiAgICAgICAgICAgIHl5IDogJyVkINCz0L7QtNC40L3QuCdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBiZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGJtID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm0nLCB7XG4gICAgICAgIG1vbnRocyA6ICdaYW53dXlla2Fsb19GZXd1cnV5ZWthbG9fTWFyaXNpa2Fsb19Bd2lyaWxpa2Fsb19NyZtrYWxvX1p1d8mbbmthbG9fWnVsdXlla2Fsb19VdGlrYWxvX1PJm3RhbmJ1cnVrYWxvX8mUa3V0yZRidXJ1a2Fsb19Ob3dhbmJ1cnVrYWxvX0Rlc2FuYnVydWthbG8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ1phbl9GZXdfTWFyX0F3aV9NyZtfWnV3X1p1bF9VdGlfU8mbdF/JlGt1X05vd19EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0thcmlfTnTJm27Jm25fVGFyYXRhX0FyYWJhX0FsYW1pc2FfSnVtYV9TaWJpcmknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnS2FyX050yZtfVGFyX0FyYV9BbGFfSnVtX1NpYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnS2FfTnRfVGFfQXJfQWxfSnVfU2knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ01NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWSBbbMmbcsmbXSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZIFtsyZtyyZtdIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0JpIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbU2luaSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2RvbiBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0t1bnUgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFt0yZttyZtuZW4gbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMga8mUbsmUJyxcbiAgICAgICAgICAgIHBhc3QgOiAnYSBiyZsgJXMgYsmUJyxcbiAgICAgICAgICAgIHMgOiAnc2FuZ2EgZGFtYSBkYW1hJyxcbiAgICAgICAgICAgIHNzIDogJ3Nla29uZGkgJWQnLFxuICAgICAgICAgICAgbSA6ICdtaW5pdGkga2VsZW4nLFxuICAgICAgICAgICAgbW0gOiAnbWluaXRpICVkJyxcbiAgICAgICAgICAgIGggOiAnbMmbcsmbIGtlbGVuJyxcbiAgICAgICAgICAgIGhoIDogJ2zJm3LJmyAlZCcsXG4gICAgICAgICAgICBkIDogJ3RpbGUga2VsZW4nLFxuICAgICAgICAgICAgZGQgOiAndGlsZSAlZCcsXG4gICAgICAgICAgICBNIDogJ2thbG8ga2VsZW4nLFxuICAgICAgICAgICAgTU0gOiAna2FsbyAlZCcsXG4gICAgICAgICAgICB5IDogJ3NhbiBrZWxlbicsXG4gICAgICAgICAgICB5eSA6ICdzYW4gJWQnXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJtO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfgp6cnLFxuICAgICAgICAnMic6ICfgp6gnLFxuICAgICAgICAnMyc6ICfgp6knLFxuICAgICAgICAnNCc6ICfgp6onLFxuICAgICAgICAnNSc6ICfgp6snLFxuICAgICAgICAnNic6ICfgp6wnLFxuICAgICAgICAnNyc6ICfgp60nLFxuICAgICAgICAnOCc6ICfgp64nLFxuICAgICAgICAnOSc6ICfgp68nLFxuICAgICAgICAnMCc6ICfgp6YnXG4gICAgfSxcbiAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICfgp6cnOiAnMScsXG4gICAgICAgICfgp6gnOiAnMicsXG4gICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICfgp6onOiAnNCcsXG4gICAgICAgICfgp6snOiAnNScsXG4gICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICfgp60nOiAnNycsXG4gICAgICAgICfgp64nOiAnOCcsXG4gICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICfgp6YnOiAnMCdcbiAgICB9O1xuXG4gICAgdmFyIGJuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm4nLCB7XG4gICAgICAgIG1vbnRocyA6ICfgppzgpr7gpqjgp4Hgp5/gpr7gprDgp4Bf4Kar4KeH4Kas4KeN4Kaw4KeB4Kef4Ka+4Kaw4Ka/X+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsF/gpoXgppXgp43gpp/gp4vgpqzgprBf4Kao4Kat4KeH4Kau4KeN4Kas4KawX+CmoeCmv+CmuOCnh+CmruCnjeCmrOCmsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4Kac4Ka+4Kao4KeBX+Cmq+Cnh+CmrF/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4KawX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4KayX+CmhuCml1/gprjgp4fgpqrgp43gpp9f4KaF4KaV4KeN4Kaf4KeLX+CmqOCmreCnh1/gpqHgpr/gprjgp4cnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+CmsOCmrOCmv+CmrOCmvuCmsF/gprjgp4vgpq7gpqzgpr7gprBf4Kau4KaZ4KeN4KaX4Kay4Kas4Ka+4KawX+CmrOCngeCmp+CmrOCmvuCmsF/gpqzgp4Pgprngprjgp43gpqrgpqTgpr/gpqzgpr7gprBf4Ka24KeB4KaV4KeN4Kaw4Kas4Ka+4KawX+CmtuCmqOCmv+CmrOCmvuCmsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaXX+CmrOCngeCmp1/gpqzgp4PgprngpoNf4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnydcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vgpobgppxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+CmhuCml+CmvuCmruCngOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4KaX4Kak4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb4KaX4KakXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg4Kaq4Kaw4KeHJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4KaG4KaX4KeHJyxcbiAgICAgICAgICAgIHMgOiAn4KaV4Kef4KeH4KaVIOCmuOCnh+CmleCnh+CmqOCnjeCmoScsXG4gICAgICAgICAgICBzcyA6ICclZCDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgbSA6ICfgpo/gppUg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOCmruCmv+CmqOCmv+CmnycsXG4gICAgICAgICAgICBoIDogJ+Cmj+CmlSDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgaGggOiAnJWQg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGQgOiAn4KaP4KaVIOCmpuCmv+CmqCcsXG4gICAgICAgICAgICBkZCA6ICclZCDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgTSA6ICfgpo/gppUg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIE1NIDogJyVkIOCmruCmvuCmuCcsXG4gICAgICAgICAgICB5IDogJ+Cmj+CmlSDgpqzgppvgprAnLFxuICAgICAgICAgICAgeXkgOiAnJWQg4Kas4Kab4KawJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Ken4Keo4Kep4Keq4Ker4Kes4Ket4Keu4Kev4KemXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kaw4Ka+4KakfOCmuOCmleCmvuCmsnzgpqbgp4Hgpqrgp4HgprB84Kas4Ka/4KaV4Ka+4KayfOCmsOCmvuCmpC8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1lcmlkaWVtID09PSAn4Kaw4Ka+4KakJyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4Kas4Ka/4KaV4Ka+4KayJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBibjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgJzEnOiAn4LyhJyxcbiAgICAgICAgJzInOiAn4LyiJyxcbiAgICAgICAgJzMnOiAn4LyjJyxcbiAgICAgICAgJzQnOiAn4LykJyxcbiAgICAgICAgJzUnOiAn4LylJyxcbiAgICAgICAgJzYnOiAn4LymJyxcbiAgICAgICAgJzcnOiAn4LynJyxcbiAgICAgICAgJzgnOiAn4LyoJyxcbiAgICAgICAgJzknOiAn4LypJyxcbiAgICAgICAgJzAnOiAn4LygJ1xuICAgIH0sXG4gICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4LyhJzogJzEnLFxuICAgICAgICAn4LyiJzogJzInLFxuICAgICAgICAn4LyjJzogJzMnLFxuICAgICAgICAn4LykJzogJzQnLFxuICAgICAgICAn4LylJzogJzUnLFxuICAgICAgICAn4LymJzogJzYnLFxuICAgICAgICAn4LynJzogJzcnLFxuICAgICAgICAn4LyoJzogJzgnLFxuICAgICAgICAn4LypJzogJzknLFxuICAgICAgICAn4LygJzogJzAnXG4gICAgfTtcblxuICAgIHZhciBibyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JvJywge1xuICAgICAgICBtb250aHMgOiAn4L2f4L6z4LyL4L2W4LyL4L2R4L2E4LyL4L2U4L28X+C9n+C+s+C8i+C9luC8i+C9guC9ieC9suC9puC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvYLgvabgvbTgvZjgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2e4L2y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9o+C+lOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvrLgvbTgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2R4L204L2T4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9ouC+kuC+seC9keC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZHgvYLgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9heC9suC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYngvbLgvabgvIvgvZQnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+C9n+C+s+C8i+C9luC8i+C9keC9hOC8i+C9lOC9vF/gvZ/gvrPgvIvgvZbgvIvgvYLgvYngvbLgvabgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2C4L2m4L204L2Y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9nuC9suC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvaPgvpTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L6y4L204L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9keC9tOC9k+C8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvaLgvpLgvrHgvZHgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L2C4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYXgvbLgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2J4L2y4L2m4LyL4L2UJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgvYLgvZ/gvaDgvIvgvYngvbLgvIvgvZjgvItf4L2C4L2f4L2g4LyL4L2f4L6z4LyL4L2W4LyLX+C9guC9n+C9oOC8i+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvYLgvZ/gvaDgvIvgvaPgvrfgvYLgvIvgvZTgvItf4L2C4L2f4L2g4LyL4L2V4L204L2i4LyL4L2W4L20X+C9guC9n+C9oOC8i+C9lOC8i+C9puC9hOC9puC8i1/gvYLgvZ/gvaDgvIvgvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4L2J4L2y4LyL4L2Y4LyLX+C9n+C+s+C8i+C9luC8i1/gvZjgvbLgvYLgvIvgvZHgvZjgvaLgvItf4L2j4L634L2C4LyL4L2U4LyLX+C9leC9tOC9ouC8i+C9luC9tF/gvZTgvIvgvabgvYTgvabgvItf4L2m4L6k4L264L2T4LyL4L2U4LyLJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgvYngvbLgvIvgvZjgvItf4L2f4L6z4LyL4L2W4LyLX+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvaPgvrfgvYLgvIvgvZTgvItf4L2V4L204L2i4LyL4L2W4L20X+C9lOC8i+C9puC9hOC9puC8i1/gvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vgvZHgvbLgvIvgvaLgvbLgvYRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+C9puC9hOC8i+C9ieC9suC9k10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9ouC+l+C9uuC9puC8i+C9mF0sIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+C9geC8i+C9puC9hF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9mOC9kOC9oOC8i+C9mF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIOC9o+C8iycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIOC9puC+lOC9k+C8i+C9oycsXG4gICAgICAgICAgICBzIDogJ+C9o+C9mOC8i+C9puC9hCcsXG4gICAgICAgICAgICBzcyA6ICclZCDgvabgvpDgvaLgvIvgvYbgvI0nLFxuICAgICAgICAgICAgbSA6ICfgvabgvpDgvaLgvIvgvZjgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgbW0gOiAnJWQg4L2m4L6Q4L2i4LyL4L2YJyxcbiAgICAgICAgICAgIGggOiAn4L2G4L204LyL4L2a4L284L2R4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOC9huC9tOC8i+C9muC9vOC9kScsXG4gICAgICAgICAgICBkIDogJ+C9ieC9suC9k+C8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBkZCA6ICclZCDgvYngvbLgvZPgvIsnLFxuICAgICAgICAgICAgTSA6ICfgvZ/gvrPgvIvgvZbgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgTU0gOiAnJWQg4L2f4L6z4LyL4L2WJyxcbiAgICAgICAgICAgIHkgOiAn4L2j4L284LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIHl5IDogJyVkIOC9o+C9vCdcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+C8oeC8ouC8o+C8pOC8peC8puC8p+C8qOC8qeC8oF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C9mOC9muC9k+C8i+C9mOC9vHzgvZ7gvbzgvYLgvabgvIvgvYDgvaZ84L2J4L2y4L2T4LyL4L2C4L204L2EfOC9keC9guC9vOC9hOC8i+C9keC9gnzgvZjgvZrgvZPgvIvgvZjgvbwvLFxuICAgICAgICBtZXJpZGllbUhvdXIgOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtZXJpZGllbSA9PT0gJ+C9mOC9muC9k+C8i+C9mOC9vCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnICYmIGhvdXIgPCA1KSB8fFxuICAgICAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C9keC9guC9vOC9hOC8i+C9keC9gicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2e4L284L2C4L2m4LyL4L2A4L2mJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9keC9guC9vOC9hOC8i+C9keC9gic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2Y4L2a4L2T4LyL4L2Y4L28JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgJ21tJzogJ211bnV0ZW5uJyxcbiAgICAgICAgICAgICdNTSc6ICdtaXonLFxuICAgICAgICAgICAgJ2RkJzogJ2RldmV6aCdcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIG11dGF0aW9uKGZvcm1hdFtrZXldLCBudW1iZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyhudW1iZXIpIHtcbiAgICAgICAgc3dpdGNoIChsYXN0TnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBibG9heic7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIHZsb2F6JztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsYXN0TnVtYmVyKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID4gOSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROdW1iZXIobnVtYmVyICUgMTApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG11dGF0aW9uKHRleHQsIG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gc29mdE11dGF0aW9uKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzb2Z0TXV0YXRpb24odGV4dCkge1xuICAgICAgICB2YXIgbXV0YXRpb25UYWJsZSA9IHtcbiAgICAgICAgICAgICdtJzogJ3YnLFxuICAgICAgICAgICAgJ2InOiAndicsXG4gICAgICAgICAgICAnZCc6ICd6J1xuICAgICAgICB9O1xuICAgICAgICBpZiAobXV0YXRpb25UYWJsZVt0ZXh0LmNoYXJBdCgwKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11dGF0aW9uVGFibGVbdGV4dC5jaGFyQXQoMCldICsgdGV4dC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuXG4gICAgdmFyIGJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYnInLCB7XG4gICAgICAgIG1vbnRocyA6ICdHZW52ZXJfQ1xcJ2h3ZXZyZXJfTWV1cnpoX0VicmVsX01hZV9NZXpoZXZlbl9Hb3VlcmVfRW9zdF9Hd2VuZ29sb19IZXJlX0R1X0tlcnp1Jy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdHZW5fQ1xcJ2h3ZV9NZXVfRWJyX01hZV9FdmVfR291X0Vvc19Hd2VfSGVyX0R1X0tlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnU3VsX0x1bl9NZXVyemhfTWVyY1xcJ2hlcl9ZYW91X0d3ZW5lcl9TYWRvcm4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnU3VsX0x1bl9NZXVfTWVyX1lhb19Hd2VfU2FkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdTdV9MdV9NZV9NZXJfWWFfR3dfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnaFtlXW1tIEEnLFxuICAgICAgICAgICAgTFRTIDogJ2hbZV1tbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIFthIHZpel0gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFthIHZpel0gTU1NTSBZWVlZIGhbZV1tbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBbYSB2aXpdIE1NTU0gWVlZWSBoW2VdbW0gQSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tIaXppdiBkYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbV2FyY1xcJ2hvYXpoIGRhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbRGVjXFwnaCBkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBbcGFzZXQgZGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdhLWJlbm4gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBcXCd6bycsXG4gICAgICAgICAgICBzIDogJ3VuIG5lYmV1ZCBzZWdvbmRlbm5vw7knLFxuICAgICAgICAgICAgc3MgOiAnJWQgZWlsZW5uJyxcbiAgICAgICAgICAgIG0gOiAndXIgdnVudXRlbm4nLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBoIDogJ3VuIGV1cicsXG4gICAgICAgICAgICBoaCA6ICclZCBldXInLFxuICAgICAgICAgICAgZCA6ICd1biBkZXZlemgnLFxuICAgICAgICAgICAgZGQgOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBNIDogJ3VyIG1peicsXG4gICAgICAgICAgICBNTSA6IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIHkgOiAndXIgYmxvYXonLFxuICAgICAgICAgICAgeXkgOiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFyc1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oYcOxfHZldCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IChudW1iZXIgPT09IDEpID8gJ2HDsScgOiAndmV0JztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRuYSBtaW51dGEnIDogJ2plZG5lIG1pbnV0ZSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0ZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkYW4gc2F0JyA6ICdqZWRub2cgc2F0YSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2Rhbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5lJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdicycsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmFyX29rdG9iYXJfbm92ZW1iYXJfZGVjZW1iYXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqLl9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSAgOiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGldIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3QgICA6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzICAgICAgOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3MgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSAgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCAgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGggICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCAgICAgIDogJ2RhbicsXG4gICAgICAgICAgICBkZCAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNICAgICAgOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBjYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2NhJywge1xuICAgICAgICBtb250aHMgOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOiAnZ2VuZXJfZmVicmVyX21hcsOnX2FicmlsX21haWdfanVueV9qdWxpb2xfYWdvc3Rfc2V0ZW1icmVfb2N0dWJyZV9ub3ZlbWJyZV9kZXNlbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ2RlIGdlbmVyX2RlIGZlYnJlcl9kZSBtYXLDp19kXFwnYWJyaWxfZGUgbWFpZ19kZSBqdW55X2RlIGp1bGlvbF9kXFwnYWdvc3RfZGUgc2V0ZW1icmVfZFxcJ29jdHVicmVfZGUgbm92ZW1icmVfZGUgZGVzZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXHMpK01NTU0vXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2dlbi5fZmVici5fbWFyw6dfYWJyLl9tYWlnX2p1bnlfanVsLl9hZy5fc2V0Ll9vY3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ2RpdW1lbmdlX2RpbGx1bnNfZGltYXJ0c19kaW1lY3Jlc19kaWpvdXNfZGl2ZW5kcmVzX2Rpc3NhYnRlJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RnLl9kbC5fZHQuX2RjLl9kai5fZHYuX2RzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnZGdfZGxfZHRfZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gW2RlXSBZWVlZIFthIGxlc10gSDptbScsXG4gICAgICAgICAgICBsbGwgOiAnRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsbCA6ICdkZGQgRCBNTU0gWVlZWSwgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F2dWkgYSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2RlbcOgIGEgJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthICcgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYWhpciBhICcgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2VsXSBkZGRkIFtwYXNzYXQgYSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZFxcJ2FxdcOtICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnZmEgJXMnLFxuICAgICAgICAgICAgcyA6ICd1bnMgc2Vnb25zJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlZ29ucycsXG4gICAgICAgICAgICBtIDogJ3VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0cycsXG4gICAgICAgICAgICBoIDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcmVzJyxcbiAgICAgICAgICAgIGQgOiAndW4gZGlhJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRpZXMnLFxuICAgICAgICAgICAgTSA6ICd1biBtZXMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWVzb3MnLFxuICAgICAgICAgICAgeSA6ICd1biBhbnknLFxuICAgICAgICAgICAgeXkgOiAnJWQgYW55cydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHJ8bnx0fMOofGEpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IChudW1iZXIgPT09IDEpID8gJ3InIDpcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAyKSA/ICduJyA6XG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMykgPyAncicgOlxuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDQpID8gJ3QnIDogJ8OoJztcbiAgICAgICAgICAgIGlmIChwZXJpb2QgPT09ICd3JyB8fCBwZXJpb2QgPT09ICdXJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9ICdhJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbW9udGhzID0gJ2xlZGVuX8O6bm9yX2LFmWV6ZW5fZHViZW5fa3bEm3Rlbl/EjWVydmVuX8SNZXJ2ZW5lY19zcnBlbl96w6HFmcOtX8WZw61qZW5fbGlzdG9wYWRfcHJvc2luZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2xlZF/Dum5vX2LFmWVfZHViX2t2xJtfxI12bl/EjXZjX3NycF96w6HFmV/FmcOtal9saXNfcHJvJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIG1vbnRoc1BhcnNlID0gWy9ebGVkL2ksIC9ew7puby9pLCAvXmLFmWUvaSwgL15kdWIvaSwgL15rdsSbL2ksIC9eKMSNdm58xI1lcnZlbiR8xI1lcnZuYSkvaSwgL14oxI12Y3zEjWVydmVuZWN8xI1lcnZlbmNlKS9pLCAvXnNycC9pLCAvXnrDocWZL2ksIC9exZnDrWovaSwgL15saXMvaSwgL15wcm8vaV07XG4gICAgLy8gTk9URTogJ8SNZXJ2ZW4nIGlzIHN1YnN0cmluZyBvZiAnxI1lcnZlbmVjJzsgdGhlcmVmb3JlICfEjWVydmVuZWMnIG11c3QgcHJlY2VkZSAnxI1lcnZlbicgaW4gdGhlIHJlZ2V4IHRvIGJlIGZ1bGx5IG1hdGNoZWQuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlciBtYXRjaGVzICcxLiDEjWVydmVuZWMnIGFzICcxLiDEjWVydmVuJyArICdlYycuXG4gICAgdmFyIG1vbnRoc1JlZ2V4ID0gL14obGVkZW58w7pub3J8YsWZZXplbnxkdWJlbnxrdsSbdGVufMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHrDocWZw618xZnDrWplbnxsaXN0b3BhZHxwcm9zaW5lY3xsZWR8w7pub3xixZllfGR1YnxrdsSbfMSNdm58xI12Y3xzcnB8esOhxZl8xZnDrWp8bGlzfHBybykvaTtcblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiAobiA+IDEpICYmIChuIDwgNSkgJiYgKH5+KG4gLyAxMCkgIT09IDEpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzogIC8vIGEgZmV3IHNlY29uZHMgLyBpbiBhIGZldyBzZWNvbmRzIC8gYSBmZXcgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ3DDoXIgc2VrdW5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla3VuZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtJzogIC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW51dGEnIDogKGlzRnV0dXJlID8gJ21pbnV0dScgOiAnbWludXRvdScpO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6ICAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IChpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2RpbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnaG9kaW5hbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOiAgLy8gYSBkYXkgLyBpbiBhIGRheSAvIGEgZGF5IGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkgPyAnZGVuJyA6ICdkbmVtJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG55JyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkbnknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ00nOiAgLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkgPyAnbcSbc8OtYycgOiAnbcSbc8OtY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzogLy8gOSBtb250aHMgLyBpbiA5IG1vbnRocyAvIDkgbW9udGhzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbcSbc8OtY2UnIDogJ23Em3PDrWPFrycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcSbc8OtY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3knOiAgLy8gYSB5ZWFyIC8gaW4gYSB5ZWFyIC8gYSB5ZWFyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkgPyAncm9rJyA6ICdyb2tlbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ2xldCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbGV0eSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3MnLCB7XG4gICAgICAgIG1vbnRocyA6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUmVnZXggOiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleCA6IG1vbnRoc1JlZ2V4LFxuICAgICAgICAvLyBOT1RFOiAnxI1lcnZlbicgaXMgc3Vic3RyaW5nIG9mICfEjWVydmVuZWMnOyB0aGVyZWZvcmUgJ8SNZXJ2ZW5lYycgbXVzdCBwcmVjZWRlICfEjWVydmVuJyBpbiB0aGUgcmVnZXggdG8gYmUgZnVsbHkgbWF0Y2hlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHBhcnNlciBtYXRjaGVzICcxLiDEjWVydmVuZWMnIGFzICcxLiDEjWVydmVuJyArICdlYycuXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4IDogL14obGVkZW58bGVkbmF8w7pub3JhfMO6bm9yfGLFmWV6ZW58YsWZZXpuYXxkdWJlbnxkdWJuYXxrdsSbdGVufGt2xJt0bmF8xI1lcnZlbmVjfMSNZXJ2ZW5jZXzEjWVydmVufMSNZXJ2bmF8c3JwZW58c3JwbmF8esOhxZnDrXzFmcOtamVufMWZw61qbmF8bGlzdG9wYWR1fGxpc3RvcGFkfHByb3NpbmVjfHByb3NpbmNlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4IDogL14obGVkfMO6bm98YsWZZXxkdWJ8a3bEm3zEjXZufMSNdmN8c3JwfHrDocWZfMWZw61qfGxpc3xwcm8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZSA6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzIDogJ25lZMSbbGVfcG9uZMSbbMOtX8O6dGVyw71fc3TFmWVkYV/EjXR2cnRla19ww6F0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ25lX3BvX8O6dF9zdF/EjXRfcMOhX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICduZV9wb1/DunRfc3RfxI10X3DDoV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIGwgOiAnRC4gTS4gWVlZWSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RuZXMgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t6w610cmEgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZlIHN0xZllZHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSDEjXR2cnRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcMOhdGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSB2XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IG5lZMSbbGkgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw6ldIGRkZGQgW3ZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICdwxZllZCAlcycsXG4gICAgICAgICAgICBzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3MgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5IDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXkgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3M7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBjdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N2Jywge1xuICAgICAgICBtb250aHMgOiAn0LrTkdGA0LvQsNGHX9C90LDRgNOR0YFf0L/Rg9GIX9Cw0LrQsF/QvNCw0Llf0qvTl9GA0YLQvNC1X9GD0YLTkV/Sq9GD0YDQu9CwX9Cw0LLTkdC9X9GO0L/QsF/Rh9Oz0Lpf0YDQsNGI0YLQsNCyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfQutOR0YBf0L3QsNGAX9C/0YPRiF/QsNC60LBf0LzQsNC5X9Kr05fRgF/Rg9GC05Ff0qvRg9GAX9Cw0LLQvV/RjtC/0LBf0YfTs9C6X9GA0LDRiCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn0LLRi9GA0YHQsNGA0L3QuNC60YPQvV/RgtGD0L3RgtC40LrRg9C9X9GL0YLQu9Cw0YDQuNC60YPQvV/RjtC90LrRg9C9X9C605fSq9C90LXRgNC90LjQutGD0L1f0Y3RgNC90LXQutGD0L1f0YjTkdC80LDRgtC60YPQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfQstGL0YBf0YLRg9C9X9GL0YLQu1/RjtC9X9C605fSq1/RjdGA0L1f0YjTkdC8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQstGAX9GC0L1f0YvRgl/RjtC9X9C60qtf0Y3RgF/RiNC8Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEwgOiAnWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10nLFxuICAgICAgICAgICAgTExMIDogJ1lZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddLCBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIFlZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddLCBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Cf0LDRj9C9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KvRgNCw0L1dIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vTltC90LXRgF0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vSqtC40YLQtdGBXSBkZGRkIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb0JjRgNGC0L3Tl10gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICAgICAgICAgIHZhciBhZmZpeCA9IC/RgdC10YXQtdGCJC9pLmV4ZWMob3V0cHV0KSA/ICfRgNC10L0nIDogL9Kr0YPQuyQvaS5leGVjKG91dHB1dCkgPyAn0YLQsNC9JyA6ICfRgNCw0L0nO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBhZmZpeDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0IDogJyVzINC60LDRj9C70LvQsCcsXG4gICAgICAgICAgICBzIDogJ9C/05fRgC3QuNC6INKr0LXQutC60YPQvdGCJyxcbiAgICAgICAgICAgIHNzIDogJyVkINKr0LXQutC60YPQvdGCJyxcbiAgICAgICAgICAgIG0gOiAn0L/Tl9GAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW0gOiAnJWQg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoIDogJ9C/05fRgCDRgdC10YXQtdGCJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGB0LXRhdC10YInLFxuICAgICAgICAgICAgZCA6ICfQv9OX0YAg0LrRg9C9JyxcbiAgICAgICAgICAgIGRkIDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNIDogJ9C/05fRgCDRg9C505HRhScsXG4gICAgICAgICAgICBNTSA6ICclZCDRg9C505HRhScsXG4gICAgICAgICAgICB5IDogJ9C/05fRgCDSq9GD0LsnLFxuICAgICAgICAgICAgeXkgOiAnJWQg0qvRg9C7J1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0t0LzTl9GILyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC3QvNOX0YgnLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGN5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3knLCB7XG4gICAgICAgIG1vbnRoczogJ0lvbmF3cl9DaHdlZnJvcl9NYXdydGhfRWJyaWxsX01haV9NZWhlZmluX0dvcmZmZW5uYWZfQXdzdF9NZWRpX0h5ZHJlZl9UYWNod2VkZF9SaGFnZnlyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ0lvbl9DaHdlX01hd19FYnJfTWFpX01laF9Hb3JfQXdzX01lZF9IeWRfVGFjaF9SaGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0R5ZGQgU3VsX0R5ZGQgTGx1bl9EeWRkIE1hd3J0aF9EeWRkIE1lcmNoZXJfRHlkZCBJYXVfRHlkZCBHd2VuZXJfRHlkZCBTYWR3cm4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTGx1bl9NYXdfTWVyX0lhdV9Hd2VfU2FkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X0xsX01hX01lX0lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICAvLyB0aW1lIGZvcm1hdHMgYXJlIHRoZSBzYW1lIGFzIGVuLWdiXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGVkZGl3IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1lmb3J5IGFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0Rkb2UgYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGl3ZXRoYWYgYW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdtZXduICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5biDDtGwnLFxuICAgICAgICAgICAgczogJ3ljaHlkaWcgZWlsaWFkYXUnLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxpYWQnLFxuICAgICAgICAgICAgbTogJ211bnVkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbXVudWQnLFxuICAgICAgICAgICAgaDogJ2F3cicsXG4gICAgICAgICAgICBoaDogJyVkIGF3cicsXG4gICAgICAgICAgICBkOiAnZGl3cm5vZCcsXG4gICAgICAgICAgICBkZDogJyVkIGRpd3Jub2QnLFxuICAgICAgICAgICAgTTogJ21pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1pcycsXG4gICAgICAgICAgICB5OiAnYmx3eWRkeW4nLFxuICAgICAgICAgICAgeXk6ICclZCBmbHluZWRkJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZmVkfGFpbnxhZnxpbHx5ZGR8ZWR8ZWcpLyxcbiAgICAgICAgLy8gdHJhZGl0aW9uYWwgb3JkaW5hbCBudW1iZXJzIGFib3ZlIDMxIGFyZSBub3QgY29tbW9ubHkgdXNlZCBpbiBjb2xsb3F1aWFsIFdlbHNoXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICcnLFxuICAgICAgICAgICAgICAgIGxvb2t1cCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJycsICdhZicsICdpbCcsICd5ZGQnLCAneWRkJywgJ2VkJywgJ2VkJywgJ2VkJywgJ2ZlZCcsICdmZWQnLCAnZmVkJywgLy8gMWFmIHRvIDEwZmVkXG4gICAgICAgICAgICAgICAgICAgICdlZycsICdmZWQnLCAnZWcnLCAnZWcnLCAnZmVkJywgJ2VnJywgJ2VnJywgJ2ZlZCcsICdlZycsICdmZWQnIC8vIDExZWcgdG8gMjBmZWRcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGIgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSA0MCB8fCBiID09PSA1MCB8fCBiID09PSA2MCB8fCBiID09PSA4MCB8fCBiID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2ZlZCc7IC8vIG5vdCAzMGFpbiwgNzBhaW4gb3IgOTBhaW5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGIgPiAwKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbG9va3VwW2JdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBkYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RhJywge1xuICAgICAgICBtb250aHMgOiAnamFudWFyX2ZlYnJ1YXJfbWFydHNfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzw7huZGFnX21hbmRhZ190aXJzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7hyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3PDuG5fbWFuX3Rpcl9vbnNfdG9yX2ZyZV9sw7hyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdzw7hfbWFfdGlfb25fdG9fZnJfbMO4Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIFtkLl0gRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW2kgZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbaSBtb3JnZW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdww6UgZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tpIGfDpXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbaV0gZGRkZFtzIGtsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgcyA6ICdmw6Ugc2VrdW5kZXInLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2VrdW5kZXInLFxuICAgICAgICAgICAgbSA6ICdldCBtaW51dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dHRlcicsXG4gICAgICAgICAgICBoIDogJ2VuIHRpbWUnLFxuICAgICAgICAgICAgaGggOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZCA6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnZScsXG4gICAgICAgICAgICBNIDogJ2VuIG3DpW5lZCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5IDogJ2V0IMOlcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDpXInXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAnbSc6IFsnZWluZSBNaW51dGUnLCAnZWluZXIgTWludXRlJ10sXG4gICAgICAgICAgICAnaCc6IFsnZWluZSBTdHVuZGUnLCAnZWluZXIgU3R1bmRlJ10sXG4gICAgICAgICAgICAnZCc6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgICdkZCc6IFtudW1iZXIgKyAnIFRhZ2UnLCBudW1iZXIgKyAnIFRhZ2VuJ10sXG4gICAgICAgICAgICAnTSc6IFsnZWluIE1vbmF0JywgJ2VpbmVtIE1vbmF0J10sXG4gICAgICAgICAgICAnTU0nOiBbbnVtYmVyICsgJyBNb25hdGUnLCBudW1iZXIgKyAnIE1vbmF0ZW4nXSxcbiAgICAgICAgICAgICd5JzogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICAneXknOiBbbnVtYmVyICsgJyBKYWhyZScsIG51bWJlciArICcgSmFocmVuJ11cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBkZUF0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUtYXQnLCB7XG4gICAgICAgIG1vbnRocyA6ICdKw6RubmVyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0rDpG4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1NvLl9Nby5fRGkuX01pLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXSdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAndm9yICVzJyxcbiAgICAgICAgICAgIHMgOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3MgOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbSA6ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGggOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGggOiAnJWQgU3R1bmRlbicsXG4gICAgICAgICAgICBkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkZUF0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgJ20nOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgJ2gnOiBbJ2VpbmUgU3R1bmRlJywgJ2VpbmVyIFN0dW5kZSddLFxuICAgICAgICAgICAgJ2QnOiBbJ2VpbiBUYWcnLCAnZWluZW0gVGFnJ10sXG4gICAgICAgICAgICAnZGQnOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgJ00nOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgJ01NJzogW251bWJlciArICcgTW9uYXRlJywgbnVtYmVyICsgJyBNb25hdGVuJ10sXG4gICAgICAgICAgICAneSc6IFsnZWluIEphaHInLCAnZWluZW0gSmFociddLFxuICAgICAgICAgICAgJ3l5JzogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZGVDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlLWNoJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzIDogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzIDogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoIDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdtJzogWydlaW5lIE1pbnV0ZScsICdlaW5lciBNaW51dGUnXSxcbiAgICAgICAgICAgICdoJzogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgICdkJzogWydlaW4gVGFnJywgJ2VpbmVtIFRhZyddLFxuICAgICAgICAgICAgJ2RkJzogW251bWJlciArICcgVGFnZScsIG51bWJlciArICcgVGFnZW4nXSxcbiAgICAgICAgICAgICdNJzogWydlaW4gTW9uYXQnLCAnZWluZW0gTW9uYXQnXSxcbiAgICAgICAgICAgICdNTSc6IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgJ3knOiBbJ2VpbiBKYWhyJywgJ2VpbmVtIEphaHInXSxcbiAgICAgICAgICAgICd5eSc6IFtudW1iZXIgKyAnIEphaHJlJywgbnVtYmVyICsgJyBKYWhyZW4nXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUnLCB7XG4gICAgICAgIG1vbnRocyA6ICdKYW51YXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzIDogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzIDogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoIDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICfelt6s3oLeqt6H3qbeg96pJyxcbiAgICAgICAgJ96K3qzehN6w3oPeqt6H3qbeg96pJyxcbiAgICAgICAgJ96J3qfeg96o3pfeqicsXG4gICAgICAgICfeh96t3pXesN6D3qnejd6qJyxcbiAgICAgICAgJ96J3q0nLFxuICAgICAgICAn3pbeq96C3rAnLFxuICAgICAgICAn3pbeqt6N3qbeh96oJyxcbiAgICAgICAgJ96H3q/ejt6m3pDesN6T3qonLFxuICAgICAgICAn3pDerN6V3rDek96s3onesN6E3qbeg96qJyxcbiAgICAgICAgJ96H3q7eht6w3pPer96E3qbeg96qJyxcbiAgICAgICAgJ96C3q7eiN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgJ96R3qjekN6s3onesN6E3qbeg96qJ1xuICAgIF0sIHdlZWtkYXlzID0gW1xuICAgICAgICAn3ofep96L3qjeh96w3ozepicsXG4gICAgICAgICfegN6v3onepicsXG4gICAgICAgICfeh96m3oLesN6O3qfeg96mJyxcbiAgICAgICAgJ96E3qrei96mJyxcbiAgICAgICAgJ96E3qreg96n3pDesN6K3qbejN6oJyxcbiAgICAgICAgJ96A3qreht6q3oPeqicsXG4gICAgICAgICfegN6u3oLeqN6A3qjeg96qJ1xuICAgIF07XG5cbiAgICB2YXIgZHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkdicsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfeh96n3oveqF/egN6v3onepl/eh96m3oLesF/ehN6q3ovepl/ehN6q3oPep1/egN6q3obeql/egN6u3oLeqCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG5cbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/eid6GfN6J3oovLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ96J3oonID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6GJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfeid6KJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1veid6o3ofept6L3qpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW96J3qfei96m3onep10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1veh96o3ofesN6U3qxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1veit6n3ofeqN6M3qreiN6oXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfejN6s3oPerd6O3qbeh96oICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn3obeqt6D3qjegt6wICVzJyxcbiAgICAgICAgICAgIHMgOiAn3pDeqN6G3qregt6w3ozeqt6G3q7ehd6s3ofesCcsXG4gICAgICAgICAgICBzcyA6ICdkJSDekN6o3obeqt6C3rDejN6qJyxcbiAgICAgICAgICAgIG0gOiAn3oneqN6C3qjek96s3ofesCcsXG4gICAgICAgICAgICBtbSA6ICfeid6o3oLeqN6T3qogJWQnLFxuICAgICAgICAgICAgaCA6ICfejt6m3pHeqN6H3qjeg96s3ofesCcsXG4gICAgICAgICAgICBoaCA6ICfejt6m3pHeqN6H3qjeg96qICVkJyxcbiAgICAgICAgICAgIGQgOiAn3oveqt6I3qbegN6s3ofesCcsXG4gICAgICAgICAgICBkZCA6ICfei96q3ojept6Q3rAgJWQnLFxuICAgICAgICAgICAgTSA6ICfeid6m3oDerN6H3rAnLFxuICAgICAgICAgICAgTU0gOiAn3onept6Q3rAgJWQnLFxuICAgICAgICAgICAgeSA6ICfeh96m3oDept6D3qzeh96wJyxcbiAgICAgICAgICAgIHl5IDogJ96H3qbegN6m3oPeqiAlZCdcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogNywgIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG5cblxuICAgIHZhciBlbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VsJywge1xuICAgICAgICBtb250aHNOb21pbmF0aXZlRWwgOiAnzpnOsc69zr/Phc6sz4HOuc6/z4JfzqbOtc6yz4HOv8+FzqzPgc65zr/Pgl/OnM6sz4HPhM65zr/Pgl/Okc+Az4HOr867zrnOv8+CX86czqzOuc6/z4JfzpnOv8+Nzr3Ouc6/z4JfzpnOv8+NzrvOuc6/z4JfzpHPjc6zzr/Phc+Dz4TOv8+CX86jzrXPgM+Ezq3OvM6yz4HOuc6/z4Jfzp/Ous+Ez47Oss+BzrnOv8+CX86dzr/Orc68zrLPgc65zr/Pgl/OlM61zrrOrc68zrLPgc65zr/Pgicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzR2VuaXRpdmVFbCA6ICfOmc6xzr3Ov8+FzrHPgc6vzr/PhV/Ops61zrLPgc6/z4XOsc+Bzq/Ov8+FX86czrHPgc+Ezq/Ov8+FX86Rz4DPgc65zrvOr86/z4VfzpzOsc6Qzr/PhV/Omc6/z4XOvc6vzr/PhV/Omc6/z4XOu86vzr/PhV/Okc+FzrPOv8+Nz4PPhM6/z4VfzqPOtc+Az4TOtc68zrLPgc6vzr/PhV/On866z4TPic6yz4HOr86/z4Vfzp3Ov861zrzOss+Bzq/Ov8+FX86UzrXOus61zrzOss+Bzq/Ov8+FJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHMgOiBmdW5jdGlvbiAobW9tZW50VG9Gb3JtYXQsIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRUb0Zvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdzdHJpbmcnICYmIC9ELy50ZXN0KGZvcm1hdC5zdWJzdHJpbmcoMCwgZm9ybWF0LmluZGV4T2YoJ01NTU0nKSkpKSB7IC8vIGlmIHRoZXJlIGlzIGEgZGF5IG51bWJlciBiZWZvcmUgJ01NTU0nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc0dlbml0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNOb21pbmF0aXZlRWxbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ86ZzrHOvV/Ops61zrJfzpzOsc+BX86Rz4DPgV/OnM6xz4pfzpnOv8+Fzr1fzpnOv8+FzrtfzpHPhc6zX86jzrXPgF/On866z4Rfzp3Ov861X86UzrXOuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnzprPhc+BzrnOsc66zq5fzpTOtc+Fz4TOrc+BzrFfzqTPgc6vz4TOt1/OpM61z4TOrM+Bz4TOt1/OoM6tzrzPgM+EzrdfzqDOsc+BzrHPg866zrXPhc6uX86jzqzOss6yzrHPhM6/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ86az4XPgV/OlM61z4VfzqTPgc65X86kzrXPhF/OoM61zrxfzqDOsc+BX86jzrHOsicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnzprPhV/OlM61X86kz4FfzqTOtV/OoM61X86gzrFfzqPOsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnzrzOvCcgOiAnzpzOnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8+AzrwnIDogJ86gzpwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpWzBdID09PSAnzrwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZSA6IC9bzqDOnF1cXC4/zpw/XFwuPy9pLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhckVsIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbzqPOrs68zrXPgc6xIHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vOkc+Nz4HOuc6/IHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFt7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbzqfOuM61z4Ige31dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM6/IM+Az4HOv863zrPOv8+NzrzOtc69zr9dIGRkZGQgW3t9XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vPhM63zr0gz4DPgc6/zrfOs86/z43OvM61zr3Ot10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiBmdW5jdGlvbiAoa2V5LCBtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhckVsW2tleV0sXG4gICAgICAgICAgICAgICAgaG91cnMgPSBtb20gJiYgbW9tLmhvdXJzKCk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihvdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmFwcGx5KG1vbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoJ3t9JywgKGhvdXJzICUgMTIgPT09IDEgPyAnz4PPhM63JyA6ICfPg8+EzrnPgicpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ8+DzrUgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDPgM+BzrnOvScsXG4gICAgICAgICAgICBzIDogJ867zq/Os86xIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsScsXG4gICAgICAgICAgICBzcyA6ICclZCDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgbSA6ICfOrc69zrEgzrvOtc+Az4TPjCcsXG4gICAgICAgICAgICBtbSA6ICclZCDOu861z4DPhM6sJyxcbiAgICAgICAgICAgIGggOiAnzrzOr86xIM+Oz4HOsScsXG4gICAgICAgICAgICBoaCA6ICclZCDPjs+BzrXPgicsXG4gICAgICAgICAgICBkIDogJ868zq/OsSDOvM6tz4HOsScsXG4gICAgICAgICAgICBkZCA6ICclZCDOvM6tz4HOtc+CJyxcbiAgICAgICAgICAgIE0gOiAnzq3Ovc6xz4IgzrzOrs69zrHPgicsXG4gICAgICAgICAgICBNTSA6ICclZCDOvM6uzr3Otc+CJyxcbiAgICAgICAgICAgIHkgOiAnzq3Ovc6xz4Igz4fPgc+Mzr3Ov8+CJyxcbiAgICAgICAgICAgIHl5IDogJyVkIM+Hz4HPjM69zrnOsSdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9zrcvLFxuICAgICAgICBvcmRpbmFsOiAnJWTOtycsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDRzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZW5TRyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLVNHJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHMgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG0gOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoIDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZCA6ICdhIGRheScsXG4gICAgICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE0gOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeSA6ICdhIHllYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5TRztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGVuQXUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1hdScsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBhZ28nLFxuICAgICAgICAgICAgcyA6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbSA6ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgICAgICBkIDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTSA6ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5IDogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh+fihudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbkF1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZW5DYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWNhJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUyA6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMIDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFnbycsXG4gICAgICAgICAgICBzIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtIDogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaCA6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQgOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNIDogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHkgOiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKH5+KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbkNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZW5HYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWdiJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHMgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG0gOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoIDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZCA6ICdhIGRheScsXG4gICAgICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE0gOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeSA6ICdhIHllYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5HYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGVuSWUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pZScsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHMgOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG0gOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoIDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGggOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZCA6ICdhIGRheScsXG4gICAgICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE0gOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeSA6ICdhIHllYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgeWVhcnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGVuSWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pbCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFnbycsXG4gICAgICAgICAgICBzIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgbSA6ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgICAgICBkIDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTSA6ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5IDogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh+fihudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGVuTnogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1ueicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBhZ28nLFxuICAgICAgICAgICAgcyA6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbSA6ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaCA6ICclZCBob3VycycsXG4gICAgICAgICAgICBkIDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTSA6ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5IDogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eSA6ICclZCB5ZWFycydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh+fihudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbk56O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbycsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcm9fZmVicnVhcm9fbWFydG9fYXByaWxvX21ham9fanVuaW9fanVsaW9fYcWtZ3VzdG9fc2VwdGVtYnJvX29rdG9icm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hxa1nX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnZGltYW7EiW9fbHVuZG9fbWFyZG9fbWVya3JlZG9fxLVhxa1kb192ZW5kcmVkb19zYWJhdG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZGltX2x1bl9tYXJkX21lcmtfxLVhxa1fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnZGlfbHVfbWFfbWVfxLVhX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEwgOiAnRFstYSBkZV0gTU1NTSwgWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRFstYSBkZV0gTU1NTSwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIFtsYV0gRFstYSBkZV0gTU1NTSwgWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1thcF1cXC50XFwubS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSA9PT0gJ3AnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwLnQubS4nIDogJ1AuVC5NLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2EudC5tLicgOiAnQS5ULk0uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tIb2RpYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tNb3JnYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbSGllcmHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW3Bhc2ludGFdIGRkZGQgW2plXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAncG9zdCAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2FudGHFrSAlcycsXG4gICAgICAgICAgICBzIDogJ3Nla3VuZG9qJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNla3VuZG9qJyxcbiAgICAgICAgICAgIG0gOiAnbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0b2onLFxuICAgICAgICAgICAgaCA6ICdob3JvJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcm9qJyxcbiAgICAgICAgICAgIGQgOiAndGFnbycsLy9uZSAnZGl1cm5vJywgxIlhciBlc3RhcyB1eml0YSBwb3IgcHJva3NpbXVtb1xuICAgICAgICAgICAgZGQgOiAnJWQgdGFnb2onLFxuICAgICAgICAgICAgTSA6ICdtb25hdG8nLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9uYXRvaicsXG4gICAgICAgICAgICB5IDogJ2phcm8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgamFyb2onXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfWEvLFxuICAgICAgICBvcmRpbmFsIDogJyVkYScsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPSAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIG1vbnRoc1BhcnNlID0gWy9eZW5lL2ksIC9eZmViL2ksIC9ebWFyL2ksIC9eYWJyL2ksIC9ebWF5L2ksIC9eanVuL2ksIC9eanVsL2ksIC9eYWdvL2ksIC9ec2VwL2ksIC9eb2N0L2ksIC9ebm92L2ksIC9eZGljL2ldO1xuICAgIHZhciBtb250aHNSZWdleCA9IC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmV8ZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2k7XG5cbiAgICB2YXIgZXNEbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzLWRvJywge1xuICAgICAgICBtb250aHMgOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzIDogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTIDogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHMgOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtIDogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGggOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZCA6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIE0gOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHkgOiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eSA6ICclZCBhw7FvcydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXNEbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0RG90ID0gJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdlbmVfZmViX21hcl9hYnJfbWF5X2p1bl9qdWxfYWdvX3NlcF9vY3Rfbm92X2RpYycuc3BsaXQoJ18nKTtcblxuICAgIHZhciBtb250aHNQYXJzZSA9IFsvXmVuZS9pLCAvXmZlYi9pLCAvXm1hci9pLCAvXmFici9pLCAvXm1heS9pLCAvXmp1bi9pLCAvXmp1bC9pLCAvXmFnby9pLCAvXnNlcC9pLCAvXm9jdC9pLCAvXm5vdi9pLCAvXmRpYy9pXTtcbiAgICB2YXIgbW9udGhzUmVnZXggPSAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzVXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcy11cycsIHtcbiAgICAgICAgbW9udGhzIDogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUyA6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTCA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBoOm1tIEEnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzIDogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbSA6ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoIDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQgOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZCA6ICclZCBkw61hcycsXG4gICAgICAgICAgICBNIDogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5IDogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYcOxb3MnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2UgOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWwgOiAnJWTCuicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzVXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9ICdlbmUuX2ZlYi5fbWFyLl9hYnIuX21heS5fanVuLl9qdWwuX2Fnby5fc2VwLl9vY3QuX25vdi5fZGljLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyk7XG5cbiAgICB2YXIgbW9udGhzUGFyc2UgPSBbL15lbmUvaSwgL15mZWIvaSwgL15tYXIvaSwgL15hYnIvaSwgL15tYXkvaSwgL15qdW4vaSwgL15qdWwvaSwgL15hZ28vaSwgL15zZXAvaSwgL15vY3QvaSwgL15ub3YvaSwgL15kaWMvaV07XG4gICAgdmFyIG1vbnRoc1JlZ2V4ID0gL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzJywge1xuICAgICAgICBtb250aHMgOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleCA6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4IDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4IDogL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleCA6IC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZSA6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2UgOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZSA6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgcyA6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaCA6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaCA6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkIDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgTSA6ICd1biBtZXMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGHDsW9zJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlIDogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsIDogJyVkwronLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdzJyA6IFsnbcO1bmUgc2VrdW5kaScsICdtw7VuaSBzZWt1bmQnLCAncGFhciBzZWt1bmRpdCddLFxuICAgICAgICAgICAgJ3NzJzogW251bWJlciArICdzZWt1bmRpJywgbnVtYmVyICsgJ3Nla3VuZGl0J10sXG4gICAgICAgICAgICAnbScgOiBbJ8O8aGUgbWludXRpJywgJ8O8a3MgbWludXQnXSxcbiAgICAgICAgICAgICdtbSc6IFtudW1iZXIgKyAnIG1pbnV0aScsIG51bWJlciArICcgbWludXRpdCddLFxuICAgICAgICAgICAgJ2gnIDogWyfDvGhlIHR1bm5pJywgJ3R1bmQgYWVnYScsICfDvGtzIHR1bmQnXSxcbiAgICAgICAgICAgICdoaCc6IFtudW1iZXIgKyAnIHR1bm5pJywgbnVtYmVyICsgJyB0dW5kaSddLFxuICAgICAgICAgICAgJ2QnIDogWyfDvGhlIHDDpGV2YScsICfDvGtzIHDDpGV2J10sXG4gICAgICAgICAgICAnTScgOiBbJ2t1dSBhamEnLCAna3V1IGFlZ2EnLCAnw7xrcyBrdXUnXSxcbiAgICAgICAgICAgICdNTSc6IFtudW1iZXIgKyAnIGt1dScsIG51bWJlciArICcga3V1ZCddLFxuICAgICAgICAgICAgJ3knIDogWyfDvGhlIGFhc3RhJywgJ2Fhc3RhJywgJ8O8a3MgYWFzdGEnXSxcbiAgICAgICAgICAgICd5eSc6IFtudW1iZXIgKyAnIGFhc3RhJywgbnVtYmVyICsgJyBhYXN0YXQnXVxuICAgICAgICB9O1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFtrZXldWzJdID8gZm9ybWF0W2tleV1bMl0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V0Jywge1xuICAgICAgICBtb250aHMgICAgICAgIDogJ2phYW51YXJfdmVlYnJ1YXJfbcOkcnRzX2FwcmlsbF9tYWlfanV1bmlfanV1bGlfYXVndXN0X3NlcHRlbWJlcl9va3Rvb2Jlcl9ub3ZlbWJlcl9kZXRzZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0ICAgOiAnamFhbl92ZWVicl9tw6RydHNfYXByX21haV9qdXVuaV9qdXVsaV9hdWdfc2VwdF9va3Rfbm92X2RldHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzICAgICAgOiAncMO8aGFww6Rldl9lc21hc3DDpGV2X3RlaXNpcMOkZXZfa29sbWFww6Rldl9uZWxqYXDDpGV2X3JlZWRlX2xhdXDDpGV2Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluICAgOiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCAgIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTCAgICA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMICAgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCAgOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5ICA6ICdbVMOkbmEsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbSG9tbWUsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdbSsOkcmdtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgIDogJ1tFaWxlLF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW0VlbG1pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIHDDpHJhc3QnLFxuICAgICAgICAgICAgcGFzdCAgIDogJyVzIHRhZ2FzaScsXG4gICAgICAgICAgICBzICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3MgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG0gICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbSAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaCAgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQgICAgIDogJyVkIHDDpGV2YScsXG4gICAgICAgICAgICBNICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU0gICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBldSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V1Jywge1xuICAgICAgICBtb250aHMgOiAndXJ0YXJyaWxhX290c2FpbGFfbWFydHhvYV9hcGlyaWxhX21haWF0emFfZWthaW5hX3V6dGFpbGFfYWJ1enR1YV9pcmFpbGFfdXJyaWFfYXphcm9hX2FiZW5kdWEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ3VydC5fb3RzLl9tYXIuX2FwaS5fbWFpLl9la2EuX3V6dC5fYWJ1Ll9pcmEuX3Vyci5fYXphLl9hYmUuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnaWdhbmRlYV9hc3RlbGVoZW5hX2FzdGVhcnRlYV9hc3RlYXprZW5hX29zdGVndW5hX29zdGlyYWxhX2xhcnVuYmF0YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdpZy5fYWwuX2FyLl9hei5fb2cuX29sLl9sci4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2lnX2FsX2FyX2F6X29nX29sX2xyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEwgOiAnWVlZWVtrb10gTU1NTVtyZW5dIERbYV0nLFxuICAgICAgICAgICAgTExMIDogJ1lZWVlba29dIE1NTU1bcmVuXSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgWVlZWVtrb10gTU1NTVtyZW5dIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbCA6ICdZWVlZLU0tRCcsXG4gICAgICAgICAgICBsbCA6ICdZWVlZW2tvXSBNTU0gRFthXScsXG4gICAgICAgICAgICBsbGwgOiAnWVlZWVtrb10gTU1NIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsbCA6ICdkZGQsIFlZWVlba29dIE1NTSBEW2FdIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW2dhdXJdIExUW2V0YW5dJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW2JpaGFyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW2F0em9dIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1thdXJyZWtvXSBkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyBiYXJydScsXG4gICAgICAgICAgICBwYXN0IDogJ2R1ZWxhICVzJyxcbiAgICAgICAgICAgIHMgOiAnc2VndW5kbyBiYXR6dWsnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtIDogJ21pbnV0dSBiYXQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXR1JyxcbiAgICAgICAgICAgIGggOiAnb3JkdSBiYXQnLFxuICAgICAgICAgICAgaGggOiAnJWQgb3JkdScsXG4gICAgICAgICAgICBkIDogJ2VndW4gYmF0JyxcbiAgICAgICAgICAgIGRkIDogJyVkIGVndW4nLFxuICAgICAgICAgICAgTSA6ICdoaWxhYmV0ZSBiYXQnLFxuICAgICAgICAgICAgTU0gOiAnJWQgaGlsYWJldGUnLFxuICAgICAgICAgICAgeSA6ICd1cnRlIGJhdCcsXG4gICAgICAgICAgICB5eSA6ICclZCB1cnRlJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfbsScsXG4gICAgICAgICcyJzogJ9uyJyxcbiAgICAgICAgJzMnOiAn27MnLFxuICAgICAgICAnNCc6ICfbtCcsXG4gICAgICAgICc1JzogJ9u1JyxcbiAgICAgICAgJzYnOiAn27YnLFxuICAgICAgICAnNyc6ICfbtycsXG4gICAgICAgICc4JzogJ9u4JyxcbiAgICAgICAgJzknOiAn27knLFxuICAgICAgICAnMCc6ICfbsCdcbiAgICB9LCBudW1iZXJNYXAgPSB7XG4gICAgICAgICfbsSc6ICcxJyxcbiAgICAgICAgJ9uyJzogJzInLFxuICAgICAgICAn27MnOiAnMycsXG4gICAgICAgICfbtCc6ICc0JyxcbiAgICAgICAgJ9u1JzogJzUnLFxuICAgICAgICAn27YnOiAnNicsXG4gICAgICAgICfbtyc6ICc3JyxcbiAgICAgICAgJ9u4JzogJzgnLFxuICAgICAgICAn27knOiAnOScsXG4gICAgICAgICfbsCc6ICcwJ1xuICAgIH07XG5cbiAgICB2YXIgZmEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmYScsIHtcbiAgICAgICAgbW9udGhzIDogJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9uM2qlcXHUyMDBj2LTZhtio2Ydf2K/ZiNi02YbYqNmHX9iz2YdcXHUyMDBj2LTZhtio2Ydf2obZh9in2LHYtNmG2KjZh1/ZvtmG2KxcXHUyMDBj2LTZhtio2Ydf2KzZhdi52Ydf2LTZhtio2YcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn24xf2K9f2LNf2oZf2b5f2Kxf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mC2KjZhCDYp9iyINi42YfYsXzYqNi52K8g2KfYsiDYuNmH2LEvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAv2KjYudivINin2LIg2LjZh9ixLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZgtio2YQg2KfYsiDYuNmH2LEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2LnYryDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb2KfZhdix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb2YHYsdiv2Kcg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vYr9uM2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFvZvtuM2LRdIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9iv2LEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDZvtuM2LQnLFxuICAgICAgICAgICAgcyA6ICfahtmG2K8g2KvYp9mG24zZhycsXG4gICAgICAgICAgICBzcyA6ICfYq9in2YbbjNmHIGQlJyxcbiAgICAgICAgICAgIG0gOiAn24zaqSDYr9mC24zZgtmHJyxcbiAgICAgICAgICAgIG1tIDogJyVkINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgaCA6ICfbjNqpINiz2KfYudiqJyxcbiAgICAgICAgICAgIGhoIDogJyVkINiz2KfYudiqJyxcbiAgICAgICAgICAgIGQgOiAn24zaqSDYsdmI2LInLFxuICAgICAgICAgICAgZGQgOiAnJWQg2LHZiNiyJyxcbiAgICAgICAgICAgIE0gOiAn24zaqSDZhdin2YcnLFxuICAgICAgICAgICAgTU0gOiAnJWQg2YXYp9mHJyxcbiAgICAgICAgICAgIHkgOiAn24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXkgOiAnJWQg2LPYp9mEJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b27At27ldL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSkucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3ZhS8sXG4gICAgICAgIG9yZGluYWwgOiAnJWTZhScsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbnVtYmVyc1Bhc3QgPSAnbm9sbGEgeWtzaSBrYWtzaSBrb2xtZSBuZWxqw6Qgdmlpc2kga3V1c2kgc2VpdHNlbcOkbiBrYWhkZWtzYW4geWhkZWtzw6RuJy5zcGxpdCgnICcpLFxuICAgICAgICBudW1iZXJzRnV0dXJlID0gW1xuICAgICAgICAgICAgJ25vbGxhJywgJ3loZGVuJywgJ2thaGRlbicsICdrb2xtZW4nLCAnbmVsasOkbicsICd2aWlkZW4nLCAna3V1ZGVuJyxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzddLCBudW1iZXJzUGFzdFs4XSwgbnVtYmVyc1Bhc3RbOV1cbiAgICAgICAgXTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtdXV0YW1hbiBzZWt1bm5pbicgOiAnbXV1dGFtYSBzZWt1bnRpJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnc2VrdW5uaW4nIDogJ3Nla3VudGlhJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtaW51dXRpbicgOiAnbWludXV0dGknO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGknO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3R1bm5pbicgOiAndHVudGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpCc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAncMOkaXbDpG4nIDogJ3DDpGl2w6TDpCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXVzaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAna3V1a2F1ZGVuJyA6ICdrdXVrYXV0dGEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvc2knO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3Z1b2RlbicgOiAndnVvdHRhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB2ZXJiYWxOdW1iZXIobnVtYmVyLCBpc0Z1dHVyZSkgKyAnICcgKyByZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZlcmJhbE51bWJlcihudW1iZXIsIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgPCAxMCA/IChpc0Z1dHVyZSA/IG51bWJlcnNGdXR1cmVbbnVtYmVyXSA6IG51bWJlcnNQYXN0W251bWJlcl0pIDogbnVtYmVyO1xuICAgIH1cblxuICAgIHZhciBmaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZpJywge1xuICAgICAgICBtb250aHMgOiAndGFtbWlrdXVfaGVsbWlrdXVfbWFhbGlza3V1X2h1aHRpa3V1X3RvdWtva3V1X2tlc8Oka3V1X2hlaW7DpGt1dV9lbG9rdXVfc3l5c2t1dV9sb2tha3V1X21hcnJhc2t1dV9qb3VsdWt1dScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAndGFtbWlfaGVsbWlfbWFhbGlzX2h1aHRpX3RvdWtvX2tlc8OkX2hlaW7DpF9lbG9fc3l5c19sb2thX21hcnJhc19qb3VsdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3VubnVudGFpX21hYW5hbnRhaV90aWlzdGFpX2tlc2tpdmlpa2tvX3RvcnN0YWlfcGVyamFudGFpX2xhdWFudGFpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1X21hX3RpX2tlX3RvX3BlX2xhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdzdV9tYV90aV9rZV90b19wZV9sYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISC5tbScsXG4gICAgICAgICAgICBMVFMgOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0RvIE1NTU1bdGFdIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0RvIE1NTU1bdGFdIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgbCA6ICdELk0uWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEbyBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGwgOiAnRG8gTU1NIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBEbyBNTU0gWVlZWSwgW2tsb10gSEgubW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbdMOkbsOkw6RuXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1todW9tZW5uYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBba2xvXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tlaWxlbl0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW3ZpaW1lXSBkZGRkW25hXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgcMOkw6RzdMOkJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgc2l0dGVuJyxcbiAgICAgICAgICAgIHMgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZm8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmbycsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByw61sX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3VubnVkYWd1cl9tw6FuYWRhZ3VyX3TDvXNkYWd1cl9taWt1ZGFndXJfaMOzc2RhZ3VyX2Zyw61nZ2phZGFndXJfbGV5Z2FyZGFndXInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnc3VuX23DoW5fdMO9c19taWtfaMOzc19mcsOtX2xleScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnc3VfbcOhX3TDvV9taV9ow7NfZnJfbGUnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQuIE1NTU0sIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbw40gZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbw40gbW9yZ2luIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vDjSBnasOhciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tzw63DsHN0dV0gZGRkZCBba2xdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICd1bSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIHPDrcOwYW5pJyxcbiAgICAgICAgICAgIHMgOiAnZsOhIHNla3VuZCcsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWt1bmRpcicsXG4gICAgICAgICAgICBtIDogJ2VpbiBtaW51dHR1cicsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dHRpcicsXG4gICAgICAgICAgICBoIDogJ2VpbiB0w61taScsXG4gICAgICAgICAgICBoaCA6ICclZCB0w61tYXInLFxuICAgICAgICAgICAgZCA6ICdlaW4gZGFndXInLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTSA6ICdlaW4gbcOhbmHDsHVyJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG3DoW5hw7BpcicsXG4gICAgICAgICAgICB5IDogJ2VpdHQgw6FyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIMOhcidcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGZyQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmci1jYScsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHMgOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbSA6ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaCA6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGggOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQgOiAndW4gam91cicsXG4gICAgICAgICAgICBkZCA6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNIDogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5IDogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFucydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfGUpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmckNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgZnJDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyLWNoJywge1xuICAgICAgICBtb250aHMgOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgcyA6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtIDogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoIDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaCA6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZCA6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIE0gOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHkgOiAndW4gYW4nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYW5zJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8ZSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGZyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnInLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzIDogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG0gOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkIDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQgOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTSA6ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhbicsXG4gICAgICAgICAgICB5eSA6ICclZCBhbnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnwpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gJ2UnIHdoZW4gZGF5IG9mIG1vbnRoID4gMS4gTW92ZSB0aGlzIGNhc2UgaW5zaWRlXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgZm9yIG1hc2N1bGluZSB3b3JkcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzMzNzVcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPSAnamFuLl9mZWIuX21ydC5fYXByLl9tYWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9ICdqYW5fZmViX21ydF9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKTtcblxuICAgIHZhciBmeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2Z5Jywge1xuICAgICAgICBtb250aHMgOiAnamFubmV3YXJpc19mZWJyZXdhcmlzX21hYXJ0X2FwcmlsX21hYWllX2p1bnlfanVseV9hdWd1c3R1c19zZXB0aW1iZXJfb2t0b2Jlcl9ub3ZpbWJlcl9kZXNpbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnc25laW5fbW9hbmRlaV90aWlzZGVpX3dvYW5zZGVpX3RvbmdlcnNkZWlfZnJlZWRfc25lb24nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnc2kuX21vLl90aS5fd28uX3RvLl9mci5fc28uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdTaV9Nb19UaV9Xb19Ub19Gcl9Tbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toam9lZCBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb2FybiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdXN0ZXIgb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW8O0ZnLDu25lXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnb2VyICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgbHluJyxcbiAgICAgICAgICAgIHMgOiAnaW4gcGVhciBzZWtvbmRlbicsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWtvbmRlbicsXG4gICAgICAgICAgICBtIDogJ2llbiBtaW7DunQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoIDogJ2llbiBvZXJlJyxcbiAgICAgICAgICAgIGhoIDogJyVkIG9lcmVuJyxcbiAgICAgICAgICAgIGQgOiAnaWVuIGRlaScsXG4gICAgICAgICAgICBkZCA6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNIDogJ2llbiBtb2FubmUnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbW9hbm5lbicsXG4gICAgICAgICAgICB5IDogJ2llbiBqaWVyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGppZXJyZW4nXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwKSA/ICdzdGUnIDogJ2RlJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICdFYW7DoWlyJywgJ0ZlYWJocmEnLCAnTcOhcnRhJywgJ0FpYnJlw6FuJywgJ0JlYWx0YWluZScsICdNw6lpdGhlYW1oJywgJ0nDumlsJywgJ0zDum5hc2EnLCAnTWXDoW4gRsOzbWhhaXInLCAnRGVhaXJlYWRoIEbDs21oYWlyJywgJ1NhbWhhaW4nLCAnTm9sbGFpZydcbiAgICBdO1xuXG4gICAgdmFyIG1vbnRoc1Nob3J0ID0gWydFYW7DoScsICdGZWFiJywgJ03DoXJ0JywgJ0FpYnInLCAnQmVhbCcsICdNw6lpdCcsICdJw7ppbCcsICdMw7puYScsICdNZcOhbicsICdEZWFpJywgJ1NhbWgnLCAnTm9sbCddO1xuXG4gICAgdmFyIHdlZWtkYXlzID0gWydEw6kgRG9taG5haWdoJywgJ0TDqSBMdWFpbicsICdEw6kgTcOhaXJ0JywgJ0TDqSBDw6lhZGFvaW4nLCAnRMOpYXJkYW9pbicsICdEw6kgaEFvaW5lJywgJ0TDqSBTYXRoYXJuJ107XG5cbiAgICB2YXIgd2Vla2RheXNTaG9ydCA9IFsnRG9tJywgJ0x1YScsICdNw6FpJywgJ0PDqWEnLCAnRMOpYScsICdoQW8nLCAnU2F0J107XG5cbiAgICB2YXIgd2Vla2RheXNNaW4gPSBbJ0RvJywgJ0x1JywgJ03DoScsICdDZScsICdEw6knLCAnaEEnLCAnU2EnXTtcblxuICAgIHZhciBnYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dhJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IHdlZWtkYXlzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzTWluOiB3ZWVrZGF5c01pbixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0lubml1IGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Ftw6FyYWNoIGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lubsOpIGFpZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW8gY2FpdGVdIFthZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2kgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOzIHNoaW4nLFxuICAgICAgICAgICAgczogJ2PDunBsYSBzb2ljaW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc29pY2luZCcsXG4gICAgICAgICAgICBtOiAnbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIGg6ICd1YWlyIGFuIGNobG9pZycsXG4gICAgICAgICAgICBoaDogJyVkIHVhaXIgYW4gY2hsb2lnJyxcbiAgICAgICAgICAgIGQ6ICdsw6EnLFxuICAgICAgICAgICAgZGQ6ICclZCBsw6EnLFxuICAgICAgICAgICAgTTogJ23DrScsXG4gICAgICAgICAgICBNTTogJyVkIG3DrScsXG4gICAgICAgICAgICB5OiAnYmxpYWluJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYmxpYWluJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2QnIDogbnVtYmVyICUgMTAgPT09IDIgPyAnbmEnIDogJ21oJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAnQW0gRmFvaWxsZWFjaCcsICdBbiBHZWFycmFuJywgJ0FtIE3DoHJ0JywgJ0FuIEdpYmxlYW4nLCAnQW4gQ8OoaXRlYW4nLCAnQW4gdC3DkmdtaGlvcycsICdBbiB0LUl1Y2hhcicsICdBbiBMw7luYXN0YWwnLCAnQW4gdC1TdWx0YWluJywgJ0FuIETDoG1oYWlyJywgJ0FuIHQtU2FtaGFpbicsICdBbiBEw7liaGxhY2hkJ1xuICAgIF07XG5cbiAgICB2YXIgbW9udGhzU2hvcnQgPSBbJ0Zhb2knLCAnR2VhcicsICdNw6BydCcsICdHaWJsJywgJ0PDqGl0JywgJ8OSZ21oJywgJ0l1Y2gnLCAnTMO5bicsICdTdWx0JywgJ0TDoG1oJywgJ1NhbWgnLCAnRMO5YmgnXTtcblxuICAgIHZhciB3ZWVrZGF5cyA9IFsnRGlkw7JtaG5haWNoJywgJ0RpbHVhaW4nLCAnRGltw6BpcnQnLCAnRGljaWFkYWluJywgJ0RpYXJkYW9pbicsICdEaWhhb2luZScsICdEaXNhdGhhaXJuZSddO1xuXG4gICAgdmFyIHdlZWtkYXlzU2hvcnQgPSBbJ0RpZCcsICdEaWwnLCAnRGltJywgJ0RpYycsICdEaWEnLCAnRGloJywgJ0RpcyddO1xuXG4gICAgdmFyIHdlZWtkYXlzTWluID0gWydEw7InLCAnTHUnLCAnTcOgJywgJ0NpJywgJ0FyJywgJ0hhJywgJ1NhJ107XG5cbiAgICB2YXIgZ2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnZCcsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6IHdlZWtkYXlzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzTWluIDogd2Vla2RheXNNaW4sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tBbi1kaXVnaCBhaWddIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW0EtbcOgaXJlYWNoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tBbi1kw6ggYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtzZW8gY2hhaWRoXSBbYWlnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnYW5uIGFuICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnYmhvIGNoaW9ubiAlcycsXG4gICAgICAgICAgICBzIDogJ2JlYWdhbiBkaW9nYW4nLFxuICAgICAgICAgICAgc3MgOiAnJWQgZGlvZ2FuJyxcbiAgICAgICAgICAgIG0gOiAnbWlvbmFpZCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW9uYWlkZWFuJyxcbiAgICAgICAgICAgIGggOiAndWFpcicsXG4gICAgICAgICAgICBoaCA6ICclZCB1YWlyZWFuJyxcbiAgICAgICAgICAgIGQgOiAnbGF0aGEnLFxuICAgICAgICAgICAgZGQgOiAnJWQgbGF0aGEnLFxuICAgICAgICAgICAgTSA6ICdtw6xvcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtw6xvc2FuJyxcbiAgICAgICAgICAgIHkgOiAnYmxpYWRobmEnLFxuICAgICAgICAgICAgeXkgOiAnJWQgYmxpYWRobmEnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2UgOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdkJyA6IG51bWJlciAlIDEwID09PSAyID8gJ25hJyA6ICdtaCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBnZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGdsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2wnLCB7XG4gICAgICAgIG1vbnRocyA6ICd4YW5laXJvX2ZlYnJlaXJvX21hcnpvX2FicmlsX21haW9feHXDsW9feHVsbG9fYWdvc3RvX3NldGVtYnJvX291dHVicm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ3hhbi5fZmViLl9tYXIuX2Fici5fbWFpLl94dcOxLl94dWwuX2Fnby5fc2V0Ll9vdXQuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnZG9taW5nb19sdW5zX21hcnRlc19tw6lyY29yZXNfeG92ZXNfdmVucmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZG9tLl9sdW4uX21hci5fbcOpci5feG92Ll92ZW4uX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdkb19sdV9tYV9tw6lfeG9fdmVfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveGUgJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxw6EgJyArICgodGhpcy5ob3VycygpICE9PSAxKSA/ICfDoXMnIDogJ8OhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFsnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ8OhcycgOiAnYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbb250ZSAnICsgKCh0aGlzLmhvdXJzKCkgIT09IDEpID8gJ8OhJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbb10gZGRkZCBbcGFzYWRvICcgKyAoKHRoaXMuaG91cnMoKSAhPT0gMSkgPyAnw6FzJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigndW4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ24nICsgc3RyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuICcgKyBzdHI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdCA6ICdoYWkgJXMnLFxuICAgICAgICAgICAgcyA6ICd1bnMgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbSA6ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoIDogJ3VuaGEgaG9yYScsXG4gICAgICAgICAgICBoaCA6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkIDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgTSA6ICd1biBtZXMnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhbm8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYW5vcydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAncyc6IFsndGhvZGRlIHNlY29uZGFuaW0nLCAndGhvZGRlIHNlY29uZCddLFxuICAgICAgICAgICAgJ3NzJzogW251bWJlciArICcgc2Vjb25kYW5pbScsIG51bWJlciArICcgc2Vjb25kJ10sXG4gICAgICAgICAgICAnbSc6IFsnZWthIG1pbnRhbicsICdlayBtaW51dGUnXSxcbiAgICAgICAgICAgICdtbSc6IFtudW1iZXIgKyAnIG1pbnRhbmltJywgbnVtYmVyICsgJyBtaW50YW0nXSxcbiAgICAgICAgICAgICdoJzogWydla2Egdm9yYW4nLCAnZWsgdm9yJ10sXG4gICAgICAgICAgICAnaGgnOiBbbnVtYmVyICsgJyB2b3JhbmltJywgbnVtYmVyICsgJyB2b3JhbSddLFxuICAgICAgICAgICAgJ2QnOiBbJ2VrYSBkaXNhbicsICdlayBkaXMnXSxcbiAgICAgICAgICAgICdkZCc6IFtudW1iZXIgKyAnIGRpc2FuaW0nLCBudW1iZXIgKyAnIGRpcyddLFxuICAgICAgICAgICAgJ00nOiBbJ2VrYSBtaG9pbmVhbicsICdlayBtaG9pbm8nXSxcbiAgICAgICAgICAgICdNTSc6IFtudW1iZXIgKyAnIG1ob2luZWFuaW0nLCBudW1iZXIgKyAnIG1ob2luZSddLFxuICAgICAgICAgICAgJ3knOiBbJ2VrYSB2b3JzYW4nLCAnZWsgdm9yb3MnXSxcbiAgICAgICAgICAgICd5eSc6IFtudW1iZXIgKyAnIHZvcnNhbmltJywgbnVtYmVyICsgJyB2b3JzYW0nXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGdvbUxhdG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnb20tbGF0bicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbmVyX0ZlYnJlcl9NYXJzX0FicmlsX01haV9KdW5fSnVsYWlfQWdvc3RfU2V0ZW1icl9PdHVicl9Ob3ZlbWJyX0RlemVtYnInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbi5fRmViLl9NYXJzX0Fici5fTWFpX0p1bl9KdWwuX0Fnby5fU2V0Ll9PdHUuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ0FpdGFyX1NvbWFyX01vbmdsbGFyX0J1ZHZhcl9CcmVzdGFyX1N1a3Jhcl9Tb25cXCd2YXInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnQWl0Ll9Tb20uX01vbi5fQnVkLl9CcmUuX1N1ay5fU29uLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQWlfU21fTW9fQnVfQnJfU3VfU24nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcyBbdmF6dGFdJyxcbiAgICAgICAgICAgIEwgOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBNTU1NW2FjaGVhXSBEbywgWVlZWSwgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSwgQSBoOm1tIFt2YXp0YV0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBaXpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRmFsZWFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tJZXRhIHRvXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2FsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tGYXRsb10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGFkaW0nLFxuICAgICAgICAgICAgcyA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzcyA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGggOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGggOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXkgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2UgOiAvXFxkezEsMn0oZXIpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hbCAnZXInIG9ubHkgYXBwbGllcyB0byBkYXkgb2YgdGhlIG1vbnRoXG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnZXInO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcmF0aXxzb2thbGxpfGRvbnBhcmFtfHNhbmplLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3JhdGknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb2thbGxpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2RvbnBhcmFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID4gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NhbmplJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyYXRpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb2thbGxpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkb25wYXJhbSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2FuamUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JhdGknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ29tTGF0bjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgICcxJzogJ+CrpycsXG4gICAgICAgICAgICAnMic6ICfgq6gnLFxuICAgICAgICAgICAgJzMnOiAn4KupJyxcbiAgICAgICAgICAgICc0JzogJ+CrqicsXG4gICAgICAgICAgICAnNSc6ICfgq6snLFxuICAgICAgICAgICAgJzYnOiAn4KusJyxcbiAgICAgICAgICAgICc3JzogJ+CrrScsXG4gICAgICAgICAgICAnOCc6ICfgq64nLFxuICAgICAgICAgICAgJzknOiAn4KuvJyxcbiAgICAgICAgICAgICcwJzogJ+CrpidcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Crpyc6ICcxJyxcbiAgICAgICAgICAgICfgq6gnOiAnMicsXG4gICAgICAgICAgICAn4KupJzogJzMnLFxuICAgICAgICAgICAgJ+Crqic6ICc0JyxcbiAgICAgICAgICAgICfgq6snOiAnNScsXG4gICAgICAgICAgICAn4KusJzogJzYnLFxuICAgICAgICAgICAgJ+CrrSc6ICc3JyxcbiAgICAgICAgICAgICfgq64nOiAnOCcsXG4gICAgICAgICAgICAn4KuvJzogJzknLFxuICAgICAgICAgICAgJ+Crpic6ICcwJ1xuICAgICAgICB9O1xuXG4gICAgdmFyIGd1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ3UnLCB7XG4gICAgICAgIG1vbnRoczogJ+CqnOCqvuCqqOCrjeCqr+CrgeCqhuCqsOCrgF/gqqvgq4fgqqzgq43gqrDgq4HgqobgqrDgq4Bf4Kqu4Kq+4Kqw4KuN4KqaX+Cqj+CqquCrjeCqsOCqv+Cqsl/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvuCqiF/gqpHgqpfgqrjgq43gqp9f4Kq44Kqq4KuN4Kqf4KuH4Kqu4KuN4Kqs4KqwX+CqkeCqleCrjeCqn+CrjeCqrOCqsF/gqqjgqrXgq4fgqq7gq43gqqzgqrBf4Kqh4Kq/4Kq44KuH4Kqu4KuN4Kqs4KqwJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ+CqnOCqvuCqqOCrjeCqr+CrgS5f4Kqr4KuH4Kqs4KuN4Kqw4KuBLl/gqq7gqr7gqrDgq43gqppf4KqP4Kqq4KuN4Kqw4Kq/Ll/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvi5f4KqR4KqXLl/gqrjgqqrgq43gqp/gq4cuX+CqkeCqleCrjeCqn+CrjS5f4Kqo4Kq14KuHLl/gqqHgqr/gqrjgq4cuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CqsOCqteCqv+CqteCqvuCqsF/gqrjgq4vgqq7gqrXgqr7gqrBf4Kqu4KqC4KqX4Kqz4Kq14Kq+4KqwX+CqrOCrgeCqp+CrjeCqteCqvuCqsF/gqpfgq4HgqrDgq4HgqrXgqr7gqrBf4Kq24KuB4KqV4KuN4Kqw4Kq14Kq+4KqwX+CqtuCqqOCqv+CqteCqvuCqsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CqsOCqteCqv1/gqrjgq4vgqq5f4Kqu4KqC4KqX4KqzX+CqrOCrgeCqp+CrjV/gqpfgq4HgqrDgq4Ff4Kq24KuB4KqV4KuN4KqwX+CqtuCqqOCqvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgqrBf4Kq44KuLX+CqruCqgl/gqqzgq4Ff4KqX4KuBX+CqtuCrgV/gqrYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhydcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KqG4KqcXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cql+Cqh+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Kqq4Kq+4Kqb4Kqy4Kq+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Kqu4Kq+JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgqqrgq4fgqrngqrLgqr4nLFxuICAgICAgICAgICAgczogJ+CqheCqruCrgeCqlSDgqqrgqrPgq4snLFxuICAgICAgICAgICAgc3M6ICclZCDgqrjgq4fgqpXgqoLgqqEnLFxuICAgICAgICAgICAgbTogJ+Cqj+CqlSDgqq7gqr/gqqjgqr/gqp8nLFxuICAgICAgICAgICAgbW06ICclZCDgqq7gqr/gqqjgqr/gqp8nLFxuICAgICAgICAgICAgaDogJ+Cqj+CqlSDgqpXgqrLgqr7gqpUnLFxuICAgICAgICAgICAgaGg6ICclZCDgqpXgqrLgqr7gqpUnLFxuICAgICAgICAgICAgZDogJ+Cqj+CqlSDgqqbgqr/gqrXgqrgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgqqbgqr/gqrXgqrgnLFxuICAgICAgICAgICAgTTogJ+Cqj+CqlSDgqq7gqrngqr/gqqjgq4snLFxuICAgICAgICAgICAgTU06ICclZCDgqq7gqrngqr/gqqjgq4snLFxuICAgICAgICAgICAgeTogJ+Cqj+CqlSDgqrXgqrDgq43gqrcnLFxuICAgICAgICAgICAgeXk6ICclZCDgqrXgqrDgq43gqrcnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq6/gq6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIEd1amFyYXRpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIEd1amFyYXRpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kqw4Kq+4KqkfOCqrOCqquCri+CqsHzgqrjgqrXgqr7gqrB84Kq44Kq+4KqC4KqcLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kqw4Kq+4KqkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq14Kq+4KqwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CqrOCqquCri+CqsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kq44Kq+4KqC4KqcJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqsOCqvuCqpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kq44Kq14Kq+4KqwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqqzgqqrgq4vgqrAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CquOCqvuCqguCqnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqw4Kq+4KqkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBndTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGhlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaGUnLCB7XG4gICAgICAgIG1vbnRocyA6ICfXmdeg15XXkNeoX9ek15HXqNeV15DXqF/Xnteo16Vf15DXpNeo15nXnF/XnteQ15lf15nXldeg15lf15nXldec15lf15DXldeS15XXodeYX9eh16TXmNee15HXqF/XkNeV16fXmNeV15HXqF/XoNeV15HXnteR16hf15PXptee15HXqCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn15nXoNeV17Nf16TXkdeo17Nf157XqNelX9eQ16TXqNezX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXs1/Xodek15jXs1/XkNeV16fXs1/XoNeV15HXs1/Xk9em157Xsycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn16jXkNep15XXn1/Xqdeg15lf16nXnNeZ16nXmV/XqNeR15nXoteZX9eX157Xmdep15lf16nXmdep15lf16nXkdeqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9eQ17Nf15HXs1/XktezX9eT17Nf15TXs1/XldezX9ep17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ9eQX9eRX9eSX9eTX9eUX9eVX9epJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBb15FdTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIFvXkV1NTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIFvXkV1NTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbCA6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbCA6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9eU15nXldedINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb157Xl9eoINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBb15HXqdei15RdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW9eQ16rXnteV15wg15HWvl1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb15HXmdeV151dIGRkZGQgW9eU15DXl9eo15XXnyDXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9eR16LXldeTICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn15zXpNeg15kgJXMnLFxuICAgICAgICAgICAgcyA6ICfXnteh16TXqCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIHNzIDogJyVkINep16DXmdeV16onLFxuICAgICAgICAgICAgbSA6ICfXk9en15QnLFxuICAgICAgICAgICAgbW0gOiAnJWQg15PXp9eV16onLFxuICAgICAgICAgICAgaCA6ICfXqdei15QnLFxuICAgICAgICAgICAgaGggOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16LXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16LXldeqJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkIDogJ9eZ15XXnScsXG4gICAgICAgICAgICBkZCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn15nXldee15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15nXnteZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE0gOiAn15fXldeT16knLFxuICAgICAgICAgICAgTU0gOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eX15XXk9ep15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15fXldeT16nXmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5IDogJ9ep16DXlCcsXG4gICAgICAgICAgICB5eSA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn16nXoNeq15nXmdedJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciAlIDEwID09PSAwICYmIG51bWJlciAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeZ150nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv15DXl9eUXCLXpnzXnNek16DXlFwi16Z815DXl9eo15kg15TXpteU16jXmdeZ151815zXpNeg15kg15TXpteU16jXmdeZ151815zXpNeg15XXqiDXkdeV16fXqHzXkdeR15XXp9eofNeR16LXqNeRL2ksXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijXkNeX15RcItemfNeQ15fXqNeZINeU16bXlNeo15nXmdedfNeR16LXqNeRKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15zXpNeg15XXqiDXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ9ec16TXoNeUXCLXpicgOiAn15zXpNeg15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXkNeX15RcItemJyA6ICfXkNeX16jXmSDXlNem15TXqNeZ15nXnSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXoteo15EnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+ClpycsXG4gICAgICAgICcyJzogJ+ClqCcsXG4gICAgICAgICczJzogJ+ClqScsXG4gICAgICAgICc0JzogJ+ClqicsXG4gICAgICAgICc1JzogJ+ClqycsXG4gICAgICAgICc2JzogJ+ClrCcsXG4gICAgICAgICc3JzogJ+ClrScsXG4gICAgICAgICc4JzogJ+ClricsXG4gICAgICAgICc5JzogJ+ClrycsXG4gICAgICAgICcwJzogJ+ClpidcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgJ+Clpic6ICcwJ1xuICAgIH07XG5cbiAgICB2YXIgaGkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoaScsIHtcbiAgICAgICAgbW9udGhzIDogJ+CknOCkqOCkteCksOClgF/gpKvgpLzgpLDgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliOCksl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLjgpY3gpKRf4KS44KS/4KSk4KSu4KWN4KSs4KSwX+CkheCkleCljeCkn+ClguCkrOCksF/gpKjgpLXgpK7gpY3gpKzgpLBf4KSm4KS/4KS44KSu4KWN4KSs4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfgpJzgpKguX+Ckq+CkvOCksC5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliC5f4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLIuX+CkheCkly5f4KS44KS/4KSkLl/gpIXgpJXgpY3gpJ/gpYIuX+CkqOCktS5f4KSm4KS/4KS4Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAn4KSw4KS14KS/4KS14KS+4KSwX+CkuOCli+CkruCkteCkvuCksF/gpK7gpILgpJfgpLLgpLXgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+Ckl+ClgeCksOClguCkteCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpLXgpL7gpLBf4KS24KSo4KS/4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSyX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4KSs4KSc4KWHJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KSV4KSyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgpKrgpL/gpJvgpLLgpYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDgpK7gpYfgpIInLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgpKrgpLngpLLgpYcnLFxuICAgICAgICAgICAgcyA6ICfgpJXgpYHgpJsg4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBzcyA6ICclZCDgpLjgpYfgpJXgpILgpKEnLFxuICAgICAgICAgICAgbSA6ICfgpI/gpJUg4KSu4KS/4KSo4KSfJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOCkruCkv+CkqOCknycsXG4gICAgICAgICAgICBoIDogJ+Ckj+CklSDgpJjgpILgpJ/gpL4nLFxuICAgICAgICAgICAgaGggOiAnJWQg4KSY4KSC4KSf4KWHJyxcbiAgICAgICAgICAgIGQgOiAn4KSP4KSVIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBkZCA6ICclZCDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgTSA6ICfgpI/gpJUg4KSu4KS54KWA4KSo4KWHJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOCkruCkueClgOCkqOClhycsXG4gICAgICAgICAgICB5IDogJ+Ckj+CklSDgpLXgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXkgOiAnJWQg4KS14KSw4KWN4KS3J1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBIaW5kaSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBIaW5kaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpHzgpLjgpYHgpKzgpLl84KSm4KWL4KSq4KS54KSwfOCktuCkvuCkri8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpYHgpKzgpLknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KWL4KSq4KS54KSwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLbgpL7gpK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KWB4KSs4KS5JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpYvgpKrgpLngpLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CktuCkvuCkric7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZG5hIG1pbnV0YScgOiAnamVkbmUgbWludXRlJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRhbiBzYXQnIDogJ2plZG5vZyBzYXRhJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBociA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hyJywge1xuICAgICAgICBtb250aHMgOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzaWplxI1uamFfdmVsamHEjWVfb8W+dWprYV90cmF2bmphX3N2aWJuamFfbGlwbmphX3NycG5qYV9rb2xvdm96YV9ydWpuYV9saXN0b3BhZGFfc3R1ZGVub2dhX3Byb3NpbmNhJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ3NpamXEjWFual92ZWxqYcSNYV9vxb51amFrX3RyYXZhbmpfc3ZpYmFual9saXBhbmpfc3JwYW5qX2tvbG92b3pfcnVqYW5fbGlzdG9wYWRfc3R1ZGVuaV9wcm9zaW5hYycuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6ICdzaWouX3ZlbGouX2/FvnUuX3RyYS5fc3ZpLl9saXAuX3NycC5fa29sLl9ydWouX2xpcy5fc3R1Ll9wcm8uJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5ICA6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSAgOiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGldIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3QgICA6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzICAgICAgOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3MgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSAgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCAgICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGggICAgIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCAgICAgIDogJ2RhbicsXG4gICAgICAgICAgICBkZCAgICAgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNICAgICAgOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NICAgICA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB3ZWVrRW5kaW5ncyA9ICd2YXPDoXJuYXAgaMOpdGbFkW4ga2VkZGVuIHN6ZXJkw6FuIGNzw7x0w7ZydMO2a8O2biBww6ludGVrZW4gc3pvbWJhdG9uJy5zcGxpdCgnICcpO1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG51bSA9IG51bWJlcjtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCkgPyAnbsOpaMOhbnkgbcOhc29kcGVyYycgOiAnbsOpaMOhbnkgbcOhc29kcGVyY2UnO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCkgPyAnIG3DoXNvZHBlcmMnIDogJyBtw6Fzb2RwZXJjZSc7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgcGVyYycgOiAnIHBlcmNlJyk7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBwZXJjJyA6ICcgcGVyY2UnKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDs3JhJyA6ICcgw7Nyw6FqYScpO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw7NyYScgOiAnIMOzcsOhamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBuYXAnIDogJyBuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgbmFwJyA6ICcgbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBow7NuYXAnIDogJyBow7NuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgaMOzbmFwJyA6ICcgaMOzbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDqXYnIDogJyDDqXZlJyk7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDqXYnIDogJyDDqXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3ZWVrKGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiAoaXNGdXR1cmUgPyAnJyA6ICdbbcO6bHRdICcpICsgJ1snICsgd2Vla0VuZGluZ3NbdGhpcy5kYXkoKV0gKyAnXSBMVFsta29yXSc7XG4gICAgfVxuXG4gICAgdmFyIGh1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHUnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51w6FyX2ZlYnJ1w6FyX23DoXJjaXVzX8OhcHJpbGlzX23DoWp1c19qw7puaXVzX2rDumxpdXNfYXVndXN6dHVzX3N6ZXB0ZW1iZXJfb2t0w7NiZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbcOhcmNfw6Fwcl9tw6FqX2rDum5fasO6bF9hdWdfc3plcHRfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ3Zhc8Ohcm5hcF9ow6l0ZsWRX2tlZGRfc3plcmRhX2Nzw7x0w7ZydMO2a19ww6ludGVrX3N6b21iYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAndmFzX2jDqXRfa2VkZF9zemVfY3PDvHRfcMOpbl9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3ZfaF9rX3N6ZV9jc19wX3N6bycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEwgOiAnWVlZWS4gTU1NTSBELicsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWS4gTU1NTSBELiBIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWS4gTU1NTSBELiwgZGRkZCBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZGV8ZHUvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDEpLnRvTG93ZXJDYXNlKCkgPT09ICd1JztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZGUnIDogJ0RFJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZHUnIDogJ0RVJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1ttYV0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbaG9sbmFwXSBMVFsta29yXScsXG4gICAgICAgICAgICBuZXh0V2VlayA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Vlay5jYWxsKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW3RlZ25hcF0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdlZWsuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIG3Dumx2YScsXG4gICAgICAgICAgICBwYXN0IDogJyVzJyxcbiAgICAgICAgICAgIHMgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgaHlBbSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2h5LWFtJywge1xuICAgICAgICBtb250aHMgOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfVsNW41oLVttW+1aHWgNWrX9aD1aXVv9aA1b7VodaA1atf1bTVodaA1b/Vq1/VodW61oDVq9Ws1atf1bTVodW11avVvdWrX9Ww1bjWgtW21avVvdWrX9Ww1bjWgtWs1avVvdWrX9aF1aPVuNW91b/VuNW91atf1b3VpdW61b/VpdW01aLVpdaA1atf1bDVuNWv1b/VpdW01aLVpdaA1atf1bbVuNW11aXVtNWi1aXWgNWrX9Wk1aXVr9W/1aXVtNWi1aXWgNWrJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ9Ww1bjWgtW21b7VodaAX9aD1aXVv9aA1b7VodaAX9W01aHWgNW/X9Wh1brWgNWr1axf1bTVodW11avVvV/VsNW41oLVttWr1b1f1bDVuNaC1azVq9W9X9aF1aPVuNW91b/VuNW9X9W91aXVutW/1aXVtNWi1aXWgF/VsNW41a/Vv9Wl1bTVotWl1oBf1bbVuNW11aXVtNWi1aXWgF/VpNWl1a/Vv9Wl1bTVotWl1oAnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn1bDVttW+X9aD1b/WgF/VtNaA1b9f1aHVutaAX9W01bXVvV/VsNW21b1f1bDVrNW9X9aF1aPVvV/VvdW61b9f1bDVr9W/X9W21bTVol/VpNWv1b8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9Wv1avWgNWh1a/Vq1/VpdaA1a/VuNaC1bfVodWi1anVq1/VpdaA1aXWhNW31aHVotWp1atf1bnVuNaA1aXWhNW31aHVotWp1atf1bDVq9W21aPVt9Wh1aLVqdWrX9W41oLWgNWi1aHVqV/Vt9Wh1aLVodWpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9Wv1oDVr1/VpdaA1a9f1aXWgNaEX9W51oDWhF/VsNW21aNf1bjWgtaA1aJf1bfVotWpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZINWpLicsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkg1akuLCBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZINWpLiwgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vVodW11b3WhdaAXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9W+1aHVstWoXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Wl1oDVpdWvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vVodW21oHVodWuXSBkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDVsNWl1b/VuCcsXG4gICAgICAgICAgICBwYXN0IDogJyVzINWh1bzVodW7JyxcbiAgICAgICAgICAgIHMgOiAn1bTVqyDWhNWh1bbVqyDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIHNzIDogJyVkINW+1aHVtdaA1a/VtdWh1bYnLFxuICAgICAgICAgICAgbSA6ICfWgNW41brVpScsXG4gICAgICAgICAgICBtbSA6ICclZCDWgNW41brVpScsXG4gICAgICAgICAgICBoIDogJ9Wq1aHVtCcsXG4gICAgICAgICAgICBoaCA6ICclZCDVqtWh1bQnLFxuICAgICAgICAgICAgZCA6ICfWhdaAJyxcbiAgICAgICAgICAgIGRkIDogJyVkINaF1oAnLFxuICAgICAgICAgICAgTSA6ICfVodW01avVvScsXG4gICAgICAgICAgICBNTSA6ICclZCDVodW01avVvScsXG4gICAgICAgICAgICB5IDogJ9W/1aHWgNWrJyxcbiAgICAgICAgICAgIHl5IDogJyVkINW/1aHWgNWrJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv1aPVq9W31aXWgNW+1aF81aHVvNWh1b7VuNW/1b7VoXzWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2LyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o1oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVtikkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVo9Wr1bfVpdaA1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aHVvNWh1b7VuNW/1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1oHVpdaA1aXVr9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wl1oDVpdWv1bjVtdWh1bYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn18XFxkezEsMn0tKNWr1bZ81oDVpCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERERvJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1avVtic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1oDVpCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHlBbTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGlkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaWQnLCB7XG4gICAgICAgIG1vbnRocyA6ICdKYW51YXJpX0ZlYnJ1YXJpX01hcmV0X0FwcmlsX01laV9KdW5pX0p1bGlfQWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZlYl9NYXJfQXByX01laV9KdW5fSnVsX0FndF9TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ01pbmdndV9TZW5pbl9TZWxhc2FfUmFidV9LYW1pc19KdW1hdF9TYWJ0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdNaW5fU2VuX1NlbF9SYWJfS2FtX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ01nX1NuX1NsX1JiX0ttX0ptX1NiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvcGFnaXxzaWFuZ3xzb3JlfG1hbGFtLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3BhZ2knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc2lhbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NvcmUnIHx8IG1lcmlkaWVtID09PSAnbWFsYW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2lhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb3JlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbSGFyaSBpbmkgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW0Jlc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbS2VtYXJpbiBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBbbGFsdSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgeWFuZyBsYWx1JyxcbiAgICAgICAgICAgIHMgOiAnYmViZXJhcGEgZGV0aWsnLFxuICAgICAgICAgICAgc3MgOiAnJWQgZGV0aWsnLFxuICAgICAgICAgICAgbSA6ICdzZW1lbml0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGggOiAnc2VqYW0nLFxuICAgICAgICAgICAgaGggOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQgOiAnc2VoYXJpJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGhhcmknLFxuICAgICAgICAgICAgTSA6ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NIDogJyVkIGJ1bGFuJyxcbiAgICAgICAgICAgIHkgOiAnc2V0YWh1bicsXG4gICAgICAgICAgICB5eSA6ICclZCB0YWh1bidcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIGlmIChuICUgMTAwID09PSAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobiAlIDEwID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ25va2tyYXIgc2Vrw7puZHVyJyA6ICdub2trcnVtIHNla8O6bmR1bSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWvDum5kdXInIDogJ3Nla8O6bmR1bScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla8O6bmRhJztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ23DrW7DunRhJyA6ICdtw61uw7p0dSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtw61uw7p0dXInIDogJ23DrW7DunR1bScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DrW7DunRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw61uw7p0dSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdrbHVra3VzdHVuZGlyJyA6ICdrbHVra3VzdHVuZHVtJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAna2x1a2t1c3R1bmQnO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWdhcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWdhJyA6ICdkw7ZndW0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkYWd1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnZGFnJyA6ICdkZWdpJyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ23DoW51w7B1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DoW51w7Bpcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwaScgOiAnbcOhbnXDsHVtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdtw6FudcOwJyA6ICdtw6FudcOwaScpO1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FydW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FyaScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXMnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW7DumFyX2ZlYnLDumFyX21hcnNfYXByw61sX21hw61fasO6bsOtX2rDumzDrV/DoWfDunN0X3NlcHRlbWJlcl9va3TDs2Jlcl9uw7N2ZW1iZXJfZGVzZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYcOtX2rDum5fasO6bF/DoWfDul9zZXBfb2t0X27Ds3ZfZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzdW5udWRhZ3VyX23DoW51ZGFndXJfw75yacOwanVkYWd1cl9tacOwdmlrdWRhZ3VyX2ZpbW10dWRhZ3VyX2bDtnN0dWRhZ3VyX2xhdWdhcmRhZ3VyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1bl9tw6FuX8O+cmlfbWnDsF9maW1fZsO2c19sYXUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1N1X03DoV/DnnJfTWlfRmlfRsO2X0xhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBELiBNTU1NIFlZWVkgW2tsLl0gSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vDrSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vDoSBtb3JndW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW8OtIGfDpnIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbc8Otw7Bhc3RhXSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdlZnRpciAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2Z5cmlyICVzIHPDrcOwYW4nLFxuICAgICAgICAgICAgcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6ICdrbHVra3VzdHVuZCcsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgaXRDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2l0LWNoJywge1xuICAgICAgICBtb250aHMgOiAnZ2VubmFpb19mZWJicmFpb19tYXJ6b19hcHJpbGVfbWFnZ2lvX2dpdWdub19sdWdsaW9fYWdvc3RvX3NldHRlbWJyZV9vdHRvYnJlX25vdmVtYnJlX2RpY2VtYnJlJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdnZW5fZmViX21hcl9hcHJfbWFnX2dpdV9sdWdfYWdvX3NldF9vdHRfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnZG9tZW5pY2FfbHVuZWTDrF9tYXJ0ZWTDrF9tZXJjb2xlZMOsX2dpb3ZlZMOsX3ZlbmVyZMOsX3NhYmF0bycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdkb21fbHVuX21hcl9tZXJfZ2lvX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RvX2x1X21hX21lX2dpX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09nZ2kgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEb21hbmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0llcmkgYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbGEgc2NvcnNhXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsbyBzY29yc29dIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKC9eWzAtOV0uKyQvKS50ZXN0KHMpID8gJ3RyYScgOiAnaW4nKSArICcgJyArIHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdCA6ICclcyBmYScsXG4gICAgICAgICAgICBzIDogJ2FsY3VuaSBzZWNvbmRpJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZGknLFxuICAgICAgICAgICAgbSA6ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRpJyxcbiAgICAgICAgICAgIGggOiAndW5cXCdvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgb3JlJyxcbiAgICAgICAgICAgIGQgOiAndW4gZ2lvcm5vJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGdpb3JuaScsXG4gICAgICAgICAgICBNIDogJ3VuIG1lc2UnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWVzaScsXG4gICAgICAgICAgICB5IDogJ3VuIGFubm8nLFxuICAgICAgICAgICAgeXkgOiAnJWQgYW5uaSdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpdENoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgaXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdCcsIHtcbiAgICAgICAgbW9udGhzIDogJ2dlbm5haW9fZmViYnJhaW9fbWFyem9fYXByaWxlX21hZ2dpb19naXVnbm9fbHVnbGlvX2Fnb3N0b19zZXR0ZW1icmVfb3R0b2JyZV9ub3ZlbWJyZV9kaWNlbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ2RvbWVuaWNhX2x1bmVkw6xfbWFydGVkw6xfbWVyY29sZWTDrF9naW92ZWTDrF92ZW5lcmTDrF9zYWJhdG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnZG9tX2x1bl9tYXJfbWVyX2dpb192ZW5fc2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdkb19sdV9tYV9tZV9naV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPZ2dpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRG9tYW5pIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJZXJpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW2xhIHNjb3JzYV0gZGRkZCBbYWxsZV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbG8gc2NvcnNvXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCgvXlswLTldLiskLykudGVzdChzKSA/ICd0cmEnIDogJ2luJykgKyAnICcgKyBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgZmEnLFxuICAgICAgICAgICAgcyA6ICdhbGN1bmkgc2Vjb25kaScsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWNvbmRpJyxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoIDogJ3VuXFwnb3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIG9yZScsXG4gICAgICAgICAgICBkIDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZCA6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgTSA6ICd1biBtZXNlJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2knLFxuICAgICAgICAgICAgeSA6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFubmknXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2UgOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBqYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2phJywge1xuICAgICAgICBtb250aHMgOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfml6Xmm5zml6Vf5pyI5puc5pelX+eBq+abnOaXpV/msLTmm5zml6Vf5pyo5puc5pelX+mHkeabnOaXpV/lnJ/mm5zml6UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTCA6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMIDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ1lZWVnlubRN5pyIROaXpSBkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGwgOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBsbCA6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsIDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsIDogJ1lZWVnlubRN5pyIROaXpShkZGQpIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5Y2I5YmNfOWNiOW+jC9pLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfljYjlvownO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOWJjSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5b6MJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vku4rml6VdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+aYjuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgPCB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnaXpgLFdZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheSA6ICdb5pio5pelXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWVrKCkgPCBub3cud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+WFiOmAsV1kZGRkIExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlIDogL1xcZHsxLDJ95pelLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVz5b6MJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXPliY0nLFxuICAgICAgICAgICAgcyA6ICfmlbDnp5InLFxuICAgICAgICAgICAgc3MgOiAnJWTnp5InLFxuICAgICAgICAgICAgbSA6ICcx5YiGJyxcbiAgICAgICAgICAgIG1tIDogJyVk5YiGJyxcbiAgICAgICAgICAgIGggOiAnMeaZgumWkycsXG4gICAgICAgICAgICBoaCA6ICclZOaZgumWkycsXG4gICAgICAgICAgICBkIDogJzHml6UnLFxuICAgICAgICAgICAgZGQgOiAnJWTml6UnLFxuICAgICAgICAgICAgTSA6ICcx44O25pyIJyxcbiAgICAgICAgICAgIE1NIDogJyVk44O25pyIJyxcbiAgICAgICAgICAgIHkgOiAnMeW5tCcsXG4gICAgICAgICAgICB5eSA6ICclZOW5tCdcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGphO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIganYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdqdicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcmlfRmVicnVhcmlfTWFyZXRfQXByaWxfTWVpX0p1bmlfSnVsaV9BZ3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vcGVtYmVyX0Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmViX01hcl9BcHJfTWVpX0p1bl9KdWxfQWdzX1NlcF9Pa3RfTm9wX0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnTWluZ2d1X1NlbmVuX1NlbG9zb19SZWJ1X0tlbWlzX0plbXV3YWhfU2VwdHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnTWluX1Nlbl9TZWxfUmViX0tlbV9KZW1fU2VwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdNZ19Tbl9TbF9SYl9LbV9KbV9TcCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISC5tbScsXG4gICAgICAgICAgICBMVFMgOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2VuamluZ3xzaXlhbmd8c29udGVufG5kYWx1LyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VuamluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzaXlhbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NvbnRlbicgfHwgbWVyaWRpZW0gPT09ICduZGFsdScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuamluZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpeWFuZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NvbnRlbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbmRhbHUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0RpbnRlbiBwdW5pa28gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW01iZW5qYW5nIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbS2FsYSB3aW5naSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBba2VwZW5na2VyIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnd29udGVuIGluZyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGluZ2thbmcga2VwZW5na2VyJyxcbiAgICAgICAgICAgIHMgOiAnc2F3ZXRhd2lzIGRldGlrJyxcbiAgICAgICAgICAgIHNzIDogJyVkIGRldGlrJyxcbiAgICAgICAgICAgIG0gOiAnc2V0dW5nZ2FsIG1lbml0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1lbml0JyxcbiAgICAgICAgICAgIGggOiAnc2V0dW5nZ2FsIGphbScsXG4gICAgICAgICAgICBoaCA6ICclZCBqYW0nLFxuICAgICAgICAgICAgZCA6ICdzZWRpbnRlbicsXG4gICAgICAgICAgICBkZCA6ICclZCBkaW50ZW4nLFxuICAgICAgICAgICAgTSA6ICdzZXd1bGFuJyxcbiAgICAgICAgICAgIE1NIDogJyVkIHd1bGFuJyxcbiAgICAgICAgICAgIHkgOiAnc2V0YXVuJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHRhdW4nXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGp2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIga2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrYScsIHtcbiAgICAgICAgbW9udGhzIDoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ+GDmOGDkOGDnOGDleGDkOGDoOGDmF/hg5fhg5Thg5Hhg5Thg6Dhg5Xhg5Dhg5rhg5hf4YOb4YOQ4YOg4YOi4YOYX+GDkOGDnuGDoOGDmOGDmuGDmF/hg5vhg5Dhg5jhg6Hhg5hf4YOY4YOV4YOc4YOY4YOh4YOYX+GDmOGDleGDmuGDmOGDoeGDmF/hg5Dhg5Lhg5Xhg5jhg6Hhg6Lhg51f4YOh4YOU4YOl4YOi4YOU4YOb4YOR4YOU4YOg4YOYX+GDneGDpeGDouGDneGDm+GDkeGDlOGDoOGDmF/hg5zhg53hg5Thg5vhg5Hhg5Thg6Dhg5hf4YOT4YOU4YOZ4YOU4YOb4YOR4YOU4YOg4YOYJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgZm9ybWF0OiAn4YOY4YOQ4YOc4YOV4YOQ4YOg4YOhX+GDl+GDlOGDkeGDlOGDoOGDleGDkOGDmuGDoV/hg5vhg5Dhg6Dhg6Lhg6Ff4YOQ4YOe4YOg4YOY4YOa4YOY4YOhX+GDm+GDkOGDmOGDoeGDoV/hg5jhg5Xhg5zhg5jhg6Hhg6Ff4YOY4YOV4YOa4YOY4YOh4YOhX+GDkOGDkuGDleGDmOGDoeGDouGDoV/hg6Hhg5Thg6Xhg6Lhg5Thg5vhg5Hhg5Thg6Dhg6Ff4YOd4YOl4YOi4YOd4YOb4YOR4YOU4YOg4YOhX+GDnOGDneGDlOGDm+GDkeGDlOGDoOGDoV/hg5Phg5Thg5nhg5Thg5vhg5Hhg5Thg6Dhg6EnLnNwbGl0KCdfJylcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4YOY4YOQ4YOcX+GDl+GDlOGDkV/hg5vhg5Dhg6Bf4YOQ4YOe4YOgX+GDm+GDkOGDmF/hg5jhg5Xhg5xf4YOY4YOV4YOaX+GDkOGDkuGDlV/hg6Hhg5Thg6Vf4YOd4YOl4YOiX+GDnOGDneGDlF/hg5Phg5Thg5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ+GDmeGDleGDmOGDoOGDkF/hg53hg6Dhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOh4YOQ4YOb4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDneGDl+GDruGDqOGDkOGDkeGDkOGDl+GDmF/hg67hg6Phg5fhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOe4YOQ4YOg4YOQ4YOh4YOZ4YOU4YOV4YOYX+GDqOGDkOGDkeGDkOGDl+GDmCcuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ+GDmeGDleGDmOGDoOGDkOGDoV/hg53hg6Dhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOh4YOQ4YOb4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDneGDl+GDruGDqOGDkOGDkeGDkOGDl+GDoV/hg67hg6Phg5fhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOe4YOQ4YOg4YOQ4YOh4YOZ4YOU4YOV4YOhX+GDqOGDkOGDkeGDkOGDl+GDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvKOGDrOGDmOGDnOGDkHzhg6jhg5Thg5vhg5Phg5Thg5IpL1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+GDmeGDleGDmF/hg53hg6Dhg6hf4YOh4YOQ4YObX+GDneGDl+GDrl/hg67hg6Phg5df4YOe4YOQ4YOgX+GDqOGDkOGDkScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4YOZ4YOVX+GDneGDoF/hg6Hhg5Bf4YOd4YOXX+GDruGDo1/hg57hg5Bf4YOo4YOQJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFMgOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+GDk+GDpuGDlOGDoV0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4YOu4YOV4YOQ4YOaXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vhg5Lhg6Phg6jhg5jhg5xdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1vhg6jhg5Thg5vhg5Phg5Thg5JdIGRkZGQgTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+GDrOGDmOGDnOGDkF0gZGRkZCBMVC3hg5bhg5QnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC8o4YOs4YOQ4YOb4YOYfOGDrOGDo+GDl+GDmHzhg6Hhg5Dhg5Dhg5fhg5h84YOs4YOU4YOa4YOYKS8pLnRlc3QocykgP1xuICAgICAgICAgICAgICAgICAgICBzLnJlcGxhY2UoL+GDmCQvLCAn4YOo4YOYJykgOlxuICAgICAgICAgICAgICAgICAgICBzICsgJ+GDqOGDmCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdCA6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCgvKOGDrOGDkOGDm+GDmHzhg6zhg6Phg5fhg5h84YOh4YOQ4YOQ4YOX4YOYfOGDk+GDpuGDlHzhg5fhg5Xhg5QpLykudGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC8o4YOYfOGDlCkkLywgJ+GDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCgv4YOs4YOU4YOa4YOYLykudGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC/hg6zhg5Thg5rhg5gkLywgJ+GDrOGDmuGDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcyA6ICfhg6Dhg5Dhg5vhg5Phg5Thg5zhg5jhg5vhg5Qg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIHNzIDogJyVkIOGDrOGDkOGDm+GDmCcsXG4gICAgICAgICAgICBtIDogJ+GDrOGDo+GDl+GDmCcsXG4gICAgICAgICAgICBtbSA6ICclZCDhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgaCA6ICfhg6Hhg5Dhg5Dhg5fhg5gnLFxuICAgICAgICAgICAgaGggOiAnJWQg4YOh4YOQ4YOQ4YOX4YOYJyxcbiAgICAgICAgICAgIGQgOiAn4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOGDk+GDpuGDlCcsXG4gICAgICAgICAgICBNIDogJ+GDl+GDleGDlCcsXG4gICAgICAgICAgICBNTSA6ICclZCDhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgeSA6ICfhg6zhg5Thg5rhg5gnLFxuICAgICAgICAgICAgeXkgOiAnJWQg4YOs4YOU4YOa4YOYJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvMHwxLeGDmuGDmHzhg5vhg5QtXFxkezEsMn18XFxkezEsMn0t4YOULyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLeGDmuGDmCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG51bWJlciA8IDIwKSB8fCAobnVtYmVyIDw9IDEwMCAmJiAobnVtYmVyICUgMjAgPT09IDApKSB8fCAobnVtYmVyICUgMTAwID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4YOb4YOULScgKyBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5QnO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSxcbiAgICAgICAgICAgIGRveSA6IDdcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGthO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YjRlicsXG4gICAgICAgIDE6ICct0YjRlicsXG4gICAgICAgIDI6ICct0YjRlicsXG4gICAgICAgIDM6ICct0YjRlicsXG4gICAgICAgIDQ6ICct0YjRlicsXG4gICAgICAgIDU6ICct0YjRlicsXG4gICAgICAgIDY6ICct0YjRiycsXG4gICAgICAgIDc6ICct0YjRlicsXG4gICAgICAgIDg6ICct0YjRlicsXG4gICAgICAgIDk6ICct0YjRiycsXG4gICAgICAgIDEwOiAnLdGI0YsnLFxuICAgICAgICAyMDogJy3RiNGLJyxcbiAgICAgICAgMzA6ICct0YjRiycsXG4gICAgICAgIDQwOiAnLdGI0YsnLFxuICAgICAgICA1MDogJy3RiNGWJyxcbiAgICAgICAgNjA6ICct0YjRiycsXG4gICAgICAgIDcwOiAnLdGI0ZYnLFxuICAgICAgICA4MDogJy3RiNGWJyxcbiAgICAgICAgOTA6ICct0YjRiycsXG4gICAgICAgIDEwMDogJy3RiNGWJ1xuICAgIH07XG5cbiAgICB2YXIga2sgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdraycsIHtcbiAgICAgICAgbW9udGhzIDogJ9Kb0LDSo9GC0LDRgF/QsNKb0L/QsNC9X9C90LDRg9GA0YvQt1/RgdOZ0YPRltGAX9C80LDQvNGL0YBf0LzQsNGD0YHRi9C8X9GI0ZbQu9C00LVf0YLQsNC80YvQt1/Sm9GL0YDQutKv0LnQtdC6X9Kb0LDQt9Cw0L1f0pvQsNGA0LDRiNCwX9C20LXQu9GC0L7Sm9GB0LDQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn0pvQsNKjX9Cw0pvQv1/QvdCw0YNf0YHTmdGDX9C80LDQvF/QvNCw0YNf0YjRltC7X9GC0LDQvF/Sm9GL0YBf0pvQsNC3X9Kb0LDRgF/QttC10LsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9C20LXQutGB0LXQvdCx0ZZf0LTSr9C50YHQtdC90LHRll/RgdC10LnRgdC10L3QsdGWX9GB05nRgNGB0LXQvdCx0ZZf0LHQtdC50YHQtdC90LHRll/QttKx0LzQsF/RgdC10L3QsdGWJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9C20LXQul/QtNKv0Llf0YHQtdC5X9GB05nRgF/QsdC10Llf0LbSsdC8X9GB0LXQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0LbQul/QtNC5X9GB0Llf0YHRgF/QsdC5X9C20Lxf0YHQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9CR0q/Qs9GW0L0g0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb0JXRgNGC0LXSoyDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vQmtC10YjQtSDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb06jRgtC60LXQvSDQsNC/0YLQsNC90YvSo10gZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzINGW0YjRltC90LTQtScsXG4gICAgICAgICAgICBwYXN0IDogJyVzINCx0rHRgNGL0L0nLFxuICAgICAgICAgICAgcyA6ICfQsdGW0YDQvdC10YjQtSDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3MgOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG0gOiAn0LHRltGAINC80LjQvdGD0YInLFxuICAgICAgICAgICAgbW0gOiAnJWQg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoIDogJ9Cx0ZbRgCDRgdCw0pPQsNGCJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGB0LDSk9Cw0YInLFxuICAgICAgICAgICAgZCA6ICfQsdGW0YAg0LrSr9C9JyxcbiAgICAgICAgICAgIGRkIDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNIDogJ9Cx0ZbRgCDQsNC5JyxcbiAgICAgICAgICAgIE1NIDogJyVkINCw0LknLFxuICAgICAgICAgICAgeSA6ICfQsdGW0YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5IDogJyVkINC20YvQuydcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRiNGWfNGI0YspLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2s7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+GfoScsXG4gICAgICAgICcyJzogJ+GfoicsXG4gICAgICAgICczJzogJ+GfoycsXG4gICAgICAgICc0JzogJ+GfpCcsXG4gICAgICAgICc1JzogJ+GfpScsXG4gICAgICAgICc2JzogJ+GfpicsXG4gICAgICAgICc3JzogJ+GfpycsXG4gICAgICAgICc4JzogJ+GfqCcsXG4gICAgICAgICc5JzogJ+GfqScsXG4gICAgICAgICcwJzogJ+GfoCdcbiAgICB9LCBudW1iZXJNYXAgPSB7XG4gICAgICAgICfhn6EnOiAnMScsXG4gICAgICAgICfhn6InOiAnMicsXG4gICAgICAgICfhn6MnOiAnMycsXG4gICAgICAgICfhn6QnOiAnNCcsXG4gICAgICAgICfhn6UnOiAnNScsXG4gICAgICAgICfhn6YnOiAnNicsXG4gICAgICAgICfhn6cnOiAnNycsXG4gICAgICAgICfhn6gnOiAnOCcsXG4gICAgICAgICfhn6knOiAnOScsXG4gICAgICAgICfhn6AnOiAnMCdcbiAgICB9O1xuXG4gICAgdmFyIGttID0gbW9tZW50LmRlZmluZUxvY2FsZSgna20nLCB7XG4gICAgICAgIG1vbnRoczogJ+GemOGegOGemuGetl/hnoDhnrvhnpjhn5Lhnpfhn4hf4Z6Y4Z644Z6T4Z62X+GemOGfgeGen+Getl/hnqfhnp/hnpfhnrZf4Z6Y4Z634Z6Q4Z674Z6T4Z62X+GegOGegOGfkuGegOGeiuGetl/hnp/hnrjhnqDhnrZf4Z6A4Z6J4Z+S4Z6J4Z62X+Gej+Geu+Gem+Getl/hnpzhnrfhnoXhn5LhnobhnrfhnoDhnrZf4Z6S4Z+S4Z6T4Z68Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+GemOGegOGemuGetl/hnoDhnrvhnpjhn5Lhnpfhn4hf4Z6Y4Z644Z6T4Z62X+GemOGfgeGen+Getl/hnqfhnp/hnpfhnrZf4Z6Y4Z634Z6Q4Z674Z6T4Z62X+GegOGegOGfkuGegOGeiuGetl/hnp/hnrjhnqDhnrZf4Z6A4Z6J4Z+S4Z6J4Z62X+Gej+Geu+Gem+Getl/hnpzhnrfhnoXhn5LhnobhnrfhnoDhnrZf4Z6S4Z+S4Z6T4Z68Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+GeouGetuGekeGet+Gej+GfkuGemV/hnoXhn5DhnpPhn5LhnpFf4Z6i4Z6E4Z+S4Z6C4Z624Z6aX+GeluGeu+Gekl/hnpbhn5LhnprhnqDhnp/hn5LhnpThno/hnrfhn41f4Z6f4Z674Z6A4Z+S4Z6aX+Gen+GfheGemuGfjScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GeouGetl/hnoVf4Z6iX+Gell/hnpbhn5Lhnppf4Z6f4Z67X+Genycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhnqLhnrZf4Z6FX+Geol/hnpZf4Z6W4Z+S4Z6aX+Gen+Geu1/hnp8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/hnpbhn5LhnprhnrnhnoB84Z6b4Z+S4Z6E4Z624Z6FLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfhnpvhn5LhnoThnrbhnoUnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Z6W4Z+S4Z6a4Z654Z6AJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhnpvhn5LhnoThnrbhnoUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhnpDhn5LhnoThn4PhnpPhn4Hhn4cg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+Gen+GfkuGeouGfguGegCDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GemOGfkuGen+Get+Gem+GemOGet+GeiSDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4Z6f4Z6U4Z+S4Z6P4Z624Z6g4Z+N4Z6Y4Z674Z6TXSBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPhnpHhn4Dhno8nLFxuICAgICAgICAgICAgcGFzdDogJyVz4Z6Y4Z674Z6TJyxcbiAgICAgICAgICAgIHM6ICfhnpThn4nhnrvhnpPhn5LhnpjhnrbhnpPhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgc3M6ICclZCDhnpzhnrfhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgbTogJ+GemOGeveGemeGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtbTogJyVkIOGek+GetuGekeGeuCcsXG4gICAgICAgICAgICBoOiAn4Z6Y4Z694Z6Z4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4Z6Y4Z+J4Z+E4Z6EJyxcbiAgICAgICAgICAgIGQ6ICfhnpjhnr3hnpnhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgZGQ6ICclZCDhnpDhn5LhnoThn4MnLFxuICAgICAgICAgICAgTTogJ+GemOGeveGemeGegeGfgicsXG4gICAgICAgICAgICBNTTogJyVkIOGegeGfgicsXG4gICAgICAgICAgICB5OiAn4Z6Y4Z694Z6Z4Z6G4Z+S4Z6T4Z624Z+GJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Z6G4Z+S4Z6T4Z624Z+GJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlIDogL+GekeGeuFxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbCA6ICfhnpHhnrglZCcsXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vhn6Hhn6Lhn6Phn6Thn6Xhn6bhn6fhn6jhn6nhn6BdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ga207XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+CzpycsXG4gICAgICAgICcyJzogJ+CzqCcsXG4gICAgICAgICczJzogJ+CzqScsXG4gICAgICAgICc0JzogJ+CzqicsXG4gICAgICAgICc1JzogJ+CzqycsXG4gICAgICAgICc2JzogJ+CzrCcsXG4gICAgICAgICc3JzogJ+CzrScsXG4gICAgICAgICc4JzogJ+CzricsXG4gICAgICAgICc5JzogJ+CzrycsXG4gICAgICAgICcwJzogJ+CzpidcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+Czpyc6ICcxJyxcbiAgICAgICAgJ+CzqCc6ICcyJyxcbiAgICAgICAgJ+CzqSc6ICczJyxcbiAgICAgICAgJ+Czqic6ICc0JyxcbiAgICAgICAgJ+Czqyc6ICc1JyxcbiAgICAgICAgJ+CzrCc6ICc2JyxcbiAgICAgICAgJ+CzrSc6ICc3JyxcbiAgICAgICAgJ+Czric6ICc4JyxcbiAgICAgICAgJ+Czryc6ICc5JyxcbiAgICAgICAgJ+Czpic6ICcwJ1xuICAgIH07XG5cbiAgICB2YXIga24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbicsIHtcbiAgICAgICAgbW9udGhzIDogJ+CynOCyqOCyteCysOCyv1/gsqvgs4bgsqzgs43gsrDgsrXgsrDgsr9f4LKu4LK+4LKw4LON4LKa4LONX+Cyj+CyquCzjeCysOCyv+CysuCzjV/gsq7gs4bgs5Vf4LKc4LOC4LKo4LONX+CynOCzgeCysuCzhuCzll/gsobgspfgsrjgs43gsp/gs41f4LK44LOG4LKq4LON4LKf4LOG4LKC4LKs4LKw4LONX+CyheCyleCzjeCyn+CzhuCzguCzleCyrOCysOCzjV/gsqjgsrXgs4bgsoLgsqzgsrDgs41f4LKh4LK/4LK44LOG4LKC4LKs4LKw4LONJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfgspzgsqhf4LKr4LOG4LKs4LON4LKwX+CyruCyvuCysOCzjeCymuCzjV/gso/gsqrgs43gsrDgsr/gsrLgs41f4LKu4LOG4LOVX+CynOCzguCyqOCzjV/gspzgs4HgsrLgs4bgs5Zf4LKG4LKX4LK44LON4LKf4LONX+CyuOCzhuCyquCzjeCyn+CzhuCygl/gsoXgspXgs43gsp/gs4bgs4Lgs5Vf4LKo4LK14LOG4LKCX+CyoeCyv+CyuOCzhuCygicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAn4LKt4LK+4LKo4LOB4LK14LK+4LKwX+CyuOCzhuCzguCzleCyruCyteCyvuCysF/gsq7gsoLgspfgsrPgsrXgsr7gsrBf4LKs4LOB4LKn4LK14LK+4LKwX+Cyl+CzgeCysOCzgeCyteCyvuCysF/gsrbgs4HgspXgs43gsrDgsrXgsr7gsrBf4LK24LKo4LK/4LK14LK+4LKwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+CyreCyvuCyqOCzgV/gsrjgs4bgs4Lgs5Xgsq5f4LKu4LKC4LKX4LKzX+CyrOCzgeCyp1/gspfgs4HgsrDgs4Ff4LK24LOB4LKV4LON4LKwX+CytuCyqOCyvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4LKt4LK+X+CyuOCzhuCzguCzlV/gsq7gsoJf4LKs4LOBX+Cyl+CzgV/gsrbgs4Ff4LK2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFMgOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb4LKH4LKC4LKm4LOBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vgsqjgsr7gsrPgs4ZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+CyqOCyv+CyqOCzjeCyqOCzhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+CyleCzhuCzguCyqOCzhuCyr10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIOCyqOCyguCypOCysCcsXG4gICAgICAgICAgICBwYXN0IDogJyVzIOCyueCyv+CyguCypuCzhicsXG4gICAgICAgICAgICBzIDogJ+CyleCzhuCysuCyteCzgSDgspXgs43gsrfgsqPgspfgsrPgs4EnLFxuICAgICAgICAgICAgc3MgOiAnJWQg4LK44LOG4LKV4LOG4LKC4LKh4LOB4LKX4LKz4LOBJyxcbiAgICAgICAgICAgIG0gOiAn4LKS4LKC4LKm4LOBIOCyqOCyv+CyruCyv+CytycsXG4gICAgICAgICAgICBtbSA6ICclZCDgsqjgsr/gsq7gsr/gsrcnLFxuICAgICAgICAgICAgaCA6ICfgspLgsoLgsqbgs4Eg4LKX4LKC4LKf4LOGJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOCyl+CyguCyn+CzhicsXG4gICAgICAgICAgICBkIDogJ+CykuCyguCypuCzgSDgsqbgsr/gsqgnLFxuICAgICAgICAgICAgZGQgOiAnJWQg4LKm4LK/4LKoJyxcbiAgICAgICAgICAgIE0gOiAn4LKS4LKC4LKm4LOBIOCypOCyv+CyguCyl+Cys+CzgScsXG4gICAgICAgICAgICBNTSA6ICclZCDgsqTgsr/gsoLgspfgsrPgs4EnLFxuICAgICAgICAgICAgeSA6ICfgspLgsoLgsqbgs4Eg4LK14LKw4LON4LK3JyxcbiAgICAgICAgICAgIHl5IDogJyVkIOCyteCysOCzjeCytydcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Czp+CzqOCzqeCzquCzq+CzrOCzreCzruCzr+Czpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CysOCyvuCypOCzjeCysOCyv3zgsqzgs4bgsrPgsr/gspfgs43gspfgs4Z84LKu4LKn4LON4LKv4LK+4LK54LON4LKofOCyuOCyguCynOCzhi8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgsrDgsr7gsqTgs43gsrDgsr8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsqzgs4bgsrPgsr/gspfgs43gspfgs4YnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LKu4LKn4LON4LKv4LK+4LK54LON4LKoJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsrjgsoLgspzgs4YnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CysOCyvuCypOCzjeCysOCyvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsq7gsqfgs43gsq/gsr7gsrngs43gsqgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyuOCyguCynOCzhic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKw4LK+4LKk4LON4LKw4LK/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOCyqOCzhuCzlSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgsqjgs4bgs5UnO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBrbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGtvID0gbW9tZW50LmRlZmluZUxvY2FsZSgna28nLCB7XG4gICAgICAgIG1vbnRocyA6ICcx7JuUXzLsm5RfM+yblF807JuUXzXsm5RfNuyblF837JuUXzjsm5RfOeyblF8xMOyblF8xMeyblF8xMuyblCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+ydvOyalOydvF/sm5TsmpTsnbxf7ZmU7JqU7J28X+yImOyalOydvF/rqqnsmpTsnbxf6riI7JqU7J28X+2GoOyalOydvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfsnbxf7JuUX+2ZlF/siJhf66qpX+q4iF/thqAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZ64WEIE1NTU0gROydvCBkZGRkIEEgaDptbScsXG4gICAgICAgICAgICBsIDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIGxsIDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIGxsbCA6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgbGxsbCA6ICdZWVlZ64WEIE1NTU0gROydvCBkZGRkIEEgaDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ+yYpOuKmCBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ+uCtOydvCBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAn7Ja07KCcIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ+yngOuCnOyjvCBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDtm4QnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDsoIQnLFxuICAgICAgICAgICAgcyA6ICfrqocg7LSIJyxcbiAgICAgICAgICAgIHNzIDogJyVk7LSIJyxcbiAgICAgICAgICAgIG0gOiAnMeu2hCcsXG4gICAgICAgICAgICBtbSA6ICclZOu2hCcsXG4gICAgICAgICAgICBoIDogJ+2VnCDsi5zqsIQnLFxuICAgICAgICAgICAgaGggOiAnJWTsi5zqsIQnLFxuICAgICAgICAgICAgZCA6ICftlZjro6gnLFxuICAgICAgICAgICAgZGQgOiAnJWTsnbwnLFxuICAgICAgICAgICAgTSA6ICftlZwg64usJyxcbiAgICAgICAgICAgIE1NIDogJyVk64usJyxcbiAgICAgICAgICAgIHkgOiAn7J28IOuFhCcsXG4gICAgICAgICAgICB5eSA6ICclZOuFhCdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfSjsnbx87JuUfOyjvCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7J28JztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfsm5QnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+yjvCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZSA6IC/smKTsoIR87Jik7ZuELyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAn7Jik7ZuEJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc1VwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91ciA8IDEyID8gJ+yYpOyghCcgOiAn7Jik7ZuEJztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfZoScsXG4gICAgICAgICcyJzogJ9miJyxcbiAgICAgICAgJzMnOiAn2aMnLFxuICAgICAgICAnNCc6ICfZpCcsXG4gICAgICAgICc1JzogJ9mlJyxcbiAgICAgICAgJzYnOiAn2aYnLFxuICAgICAgICAnNyc6ICfZpycsXG4gICAgICAgICc4JzogJ9moJyxcbiAgICAgICAgJzknOiAn2aknLFxuICAgICAgICAnMCc6ICfZoCdcbiAgICB9LCBudW1iZXJNYXAgPSB7XG4gICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICfZoCc6ICcwJ1xuICAgIH0sXG4gICAgbW9udGhzID0gW1xuICAgICAgICAn2qnYp9mG2YjZhtuMINiv2YjZiNuV2YUnLFxuICAgICAgICAn2LTZiNio2KfYqicsXG4gICAgICAgICfYptin2LLYp9ixJyxcbiAgICAgICAgJ9mG24zYs9in2YYnLFxuICAgICAgICAn2KbYp9uM2KfYsScsXG4gICAgICAgICfYrdmI2LLblduM2LHYp9mGJyxcbiAgICAgICAgJ9iq25XZhdmF2YjYsicsXG4gICAgICAgICfYptin2KgnLFxuICAgICAgICAn2KbblduM2YTZiNmI2YQnLFxuICAgICAgICAn2KrYtNix24zZhtuMINuM25XZg9uV2YUnLFxuICAgICAgICAn2KrYtNix24zZhtuMINiv2YjZiNuV2YUnLFxuICAgICAgICAn2YPYp9mG2YjZhtuMINuM25XaqduV2YUnXG4gICAgXTtcblxuXG4gICAgdmFyIGt1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3UnLCB7XG4gICAgICAgIG1vbnRocyA6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQgOiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzIDogJ9uM2YfigIzZg9i02YfigIzZhdmF2YfigIxf2K/ZiNmI2LTZh+KAjNmF2YXZh+KAjF/Ys9uO2LTZh+KAjNmF2YXZh+KAjF/ahtmI2KfYsdi02YfigIzZhdmF2YfigIxf2b7bjtmG2KzYtNmH4oCM2YXZhdmH4oCMX9mH2YfigIzbjNmG24xf2LTZh+KAjNmF2YXZh+KAjCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfbjNmH4oCM2YPYtNmH4oCM2YVf2K/ZiNmI2LTZh+KAjNmFX9iz247YtNmH4oCM2YVf2obZiNin2LHYtNmH4oCM2YVf2b7bjtmG2KzYtNmH4oCM2YVf2YfZh+KAjNuM2YbbjF/YtNmH4oCM2YXZhdmH4oCMJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfbjF/Yr1/Ys1/ahl/Zvl/Zh1/YtCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2KbbjtmI2KfYsdmH4oCMfNio2YfigIzbjNin2YbbjC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC/YptuO2YjYp9ix2YfigIwvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2YfigIzbjNin2YbbjCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KbbjtmI2KfYsdmH4oCMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vYptmH4oCM2YXYsduGINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vYqNmH4oCM24zYp9mG24wg2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW9mD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vYr9mI247ZhtuOINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFvZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9mE2YfigIwgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcycsXG4gICAgICAgICAgICBzIDogJ9qG2YfigIzZhtivINqG2LHZg9mH4oCM24zZh+KAjNmDJyxcbiAgICAgICAgICAgIHNzIDogJ9qG2LHZg9mH4oCMICVkJyxcbiAgICAgICAgICAgIG0gOiAn24zZh+KAjNmDINiu2YjZhNmH4oCM2YMnLFxuICAgICAgICAgICAgbW0gOiAnJWQg2K7ZiNmE2YfigIzZgycsXG4gICAgICAgICAgICBoIDogJ9uM2YfigIzZgyDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBoaCA6ICclZCDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBkIDogJ9uM2YfigIzZgyDalduG2pgnLFxuICAgICAgICAgICAgZGQgOiAnJWQg2pXbhtqYJyxcbiAgICAgICAgICAgIE0gOiAn24zZh+KAjNmDINmF2KfZhtqvJyxcbiAgICAgICAgICAgIE1NIDogJyVkINmF2KfZhtqvJyxcbiAgICAgICAgICAgIHkgOiAn24zZh+KAjNmDINiz2KfatScsXG4gICAgICAgICAgICB5eSA6ICclZCDYs9in2rUnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KS5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YfSrycsXG4gICAgICAgIDE6ICct0YfQuCcsXG4gICAgICAgIDI6ICct0YfQuCcsXG4gICAgICAgIDM6ICct0YfSrycsXG4gICAgICAgIDQ6ICct0YfSrycsXG4gICAgICAgIDU6ICct0YfQuCcsXG4gICAgICAgIDY6ICct0YfRiycsXG4gICAgICAgIDc6ICct0YfQuCcsXG4gICAgICAgIDg6ICct0YfQuCcsXG4gICAgICAgIDk6ICct0YfRgycsXG4gICAgICAgIDEwOiAnLdGH0YMnLFxuICAgICAgICAyMDogJy3Rh9GLJyxcbiAgICAgICAgMzA6ICct0YfRgycsXG4gICAgICAgIDQwOiAnLdGH0YsnLFxuICAgICAgICA1MDogJy3Rh9KvJyxcbiAgICAgICAgNjA6ICct0YfRiycsXG4gICAgICAgIDcwOiAnLdGH0LgnLFxuICAgICAgICA4MDogJy3Rh9C4JyxcbiAgICAgICAgOTA6ICct0YfRgycsXG4gICAgICAgIDEwMDogJy3Rh9KvJ1xuICAgIH07XG5cbiAgICB2YXIga3kgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdreScsIHtcbiAgICAgICAgbW9udGhzIDogJ9GP0L3QstCw0YDRjF/RhNC10LLRgNCw0LvRjF/QvNCw0YDRgl/QsNC/0YDQtdC70Yxf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgNGMX9C+0LrRgtGP0LHRgNGMX9C90L7Rj9Cx0YDRjF/QtNC10LrQsNCx0YDRjCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YDRgl/QsNC/0YBf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9CW0LXQutGI0LXQvNCx0Lhf0JTSr9C50YjTqdC80LHSr1/QqNC10LnRiNC10LzQsdC4X9Co0LDRgNGI0LXQvNCx0Lhf0JHQtdC50YjQtdC80LHQuF/QltGD0LzQsF/QmNGI0LXQvNCx0LgnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0JbQtdC6X9CU0q/QuV/QqNC10Llf0KjQsNGAX9CR0LXQuV/QltGD0Lxf0JjRiNC1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQltC6X9CU0Llf0KjQuV/QqNGAX9CR0Llf0JbQvF/QmNGIJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb0JHSr9Cz0q/QvSDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb0K3RgNGC0LXSoyDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBb0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW9Ca0LXRh9GN0Y0g0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vTqNGC0LrTqdC9INCw0L/RgtCw0L3Ri9C9XSBkZGRkIFvQutKv0L3Sr10gW9GB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg0LjRh9C40L3QtNC1JyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg0LzRg9GA0YPQvScsXG4gICAgICAgICAgICBzIDogJ9Cx0LjRgNC90LXRh9C1INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzcyA6ICclZCDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbSA6ICfQsdC40YAg0LzSr9C906nRgicsXG4gICAgICAgICAgICBtbSA6ICclZCDQvNKv0L3TqdGCJyxcbiAgICAgICAgICAgIGggOiAn0LHQuNGAINGB0LDQsNGCJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGB0LDQsNGCJyxcbiAgICAgICAgICAgIGQgOiAn0LHQuNGAINC60q/QvScsXG4gICAgICAgICAgICBkZCA6ICclZCDQutKv0L0nLFxuICAgICAgICAgICAgTSA6ICfQsdC40YAg0LDQuScsXG4gICAgICAgICAgICBNTSA6ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHkgOiAn0LHQuNGAINC20YvQuycsXG4gICAgICAgICAgICB5eSA6ICclZCDQttGL0LsnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0YfQuHzRh9GLfNGH0q980YfRgykvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBreTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdtJzogWydlbmcgTWludXR0JywgJ2VuZ2VyIE1pbnV0dCddLFxuICAgICAgICAgICAgJ2gnOiBbJ2VuZyBTdG9ubicsICdlbmdlciBTdG9ubiddLFxuICAgICAgICAgICAgJ2QnOiBbJ2VlbiBEYWcnLCAnZW5nZW0gRGFnJ10sXG4gICAgICAgICAgICAnTSc6IFsnZWUgTW91bnQnLCAnZW5nZW0gTW91bnQnXSxcbiAgICAgICAgICAgICd5JzogWydlZSBKb2VyJywgJ2VuZ2VtIEpvZXInXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NGdXR1cmVUaW1lKHN0cmluZykge1xuICAgICAgICB2YXIgbnVtYmVyID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZignICcpKTtcbiAgICAgICAgaWYgKGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2EgJyArIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2FuICcgKyBzdHJpbmc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NQYXN0VGltZShzdHJpbmcpIHtcbiAgICAgICAgdmFyIG51bWJlciA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YoJyAnKSk7XG4gICAgICAgIGlmIChlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuICd2aXJ1ICcgKyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICd2aXJ1biAnICsgc3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdvcmQgYmVmb3JlIHRoZSBnaXZlbiBudW1iZXIgbG9zZXMgdGhlICctbicgZW5kaW5nLlxuICAgICAqIGUuZy4gJ2FuIDEwIERlZWcnIGJ1dCAnYSA1IERlZWcnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbnVtYmVyIHtpbnRlZ2VyfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpIHtcbiAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIE51bWJlciAtLT4gYWx3YXlzIHRydWVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwKSB7XG4gICAgICAgICAgICAvLyBPbmx5IDEgZGlnaXRcbiAgICAgICAgICAgIGlmICg0IDw9IG51bWJlciAmJiBudW1iZXIgPD0gNykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwMCkge1xuICAgICAgICAgICAgLy8gMiBkaWdpdHNcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCwgZmlyc3REaWdpdCA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIoZmlyc3REaWdpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGxhc3REaWdpdCk7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwMDApIHtcbiAgICAgICAgICAgIC8vIDMgb3IgNCBkaWdpdHMgLS0+IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IGRpZ2l0XG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyID49IDEwKSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbnl0aGluZyBsYXJnZXIgdGhhbiA0IGRpZ2l0czogcmVjdXJzaXZlbHkgY2hlY2sgZmlyc3Qgbi0zIGRpZ2l0c1xuICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTAwMDtcbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xiJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6RlcnpfQWJyw6tsbF9NZWVfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW4uX0ZlYnIuX01yei5fQWJyLl9NZWVfSnVuLl9KdWwuX0F1Zy5fU2VwdC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ1Nvbm5kZWdfTcOpaW5kZWdfRMOrbnNjaGRlZ19Nw6t0dHdvY2hfRG9ubmVzY2hkZWdfRnJlaWRlZ19TYW1zY2hkZWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTcOpLl9Ew6suX03Dqy5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTcOpX0TDq19Nw6tfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0gW0F1ZXJdJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MgW0F1ZXJdJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tIFtBdWVyXScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0gW0F1ZXJdJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIYXV0IHVtXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNdWVyIHVtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0fDq3NjaHRlciB1bV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgZGF0ZSBzdHJpbmcgZm9yICdEw6tuc2NoZGVnJyAoVHVlc2RheSkgYW5kICdEb25uZXNjaGRlZycgKFRodXJzZGF5KSBkdWUgdG8gcGhvbm9sb2dpY2FsIHJ1bGVcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tMZXNjaHRlbl0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVdIGRkZGQgW3VtXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiBwcm9jZXNzRnV0dXJlVGltZSxcbiAgICAgICAgICAgIHBhc3QgOiBwcm9jZXNzUGFzdFRpbWUsXG4gICAgICAgICAgICBzIDogJ2UgcHVlciBTZWtvbm5lbicsXG4gICAgICAgICAgICBzcyA6ICclZCBTZWtvbm5lbicsXG4gICAgICAgICAgICBtIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tIDogJyVkIE1pbnV0dGVuJyxcbiAgICAgICAgICAgIGggOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGggOiAnJWQgU3Rvbm5lbicsXG4gICAgICAgICAgICBkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkIDogJyVkIERlZWcnLFxuICAgICAgICAgICAgTSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTSA6ICclZCBNw6lpbnQnLFxuICAgICAgICAgICAgeSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSA6ICclZCBKb2VyJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBsbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xvJywge1xuICAgICAgICBtb250aHMgOiAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+C6oeC6seC6h+C6geC6reC6mV/guoHgurjguqHgup7gurJf4Lqh4Lq14LqZ4LqyX+C7gOC6oeC6quC6sl/gup7gurbgupTguqrgurDgup7gurJf4Lqh4Lq04LqW4Lq44LqZ4LqyX+C6geC7jeC6peC6sOC6geC6u+C6lF/guqrgurTguofguqvgurJf4LqB4Lqx4LqZ4LqN4LqyX+C6leC6uOC6peC6sl/gup7gurDguojgurTguoFf4LqX4Lqx4LqZ4Lqn4LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfguq3gurLgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4LqX4Lq04LqUX+C6iOC6seC6mV/guq3gurHguofguoTgurLguplf4Lqe4Lq44LqUX+C6nuC6sOC6q+C6seC6lF/guqrgurjguoFf4LuA4Lqq4Lq74LqyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgupdf4LqIX+C6reC6hF/gup5f4Lqe4LqrX+C6quC6gV/guqonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICfguqfgurHguplkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LqV4Lqt4LqZ4LuA4LqK4Lq74LuJ4LqyfOC6leC6reC6meC7geC6peC6hy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgupXguq3gupngu4Dguorgurvgu4ngurInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7geC6peC6hyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb4Lqh4Lq34LuJ4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vguqHgurfgu4nguq3gurfgu4jgupngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1vguqfgurHgupldZGRkZFvgu5zgu4ngurLgu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+C6oeC6t+C7ieC6p+C6suC6meC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+C6p+C6seC6mV1kZGRkW+C7geC6peC7ieC6p+C6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ+C6reC6teC6gSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVz4Lqc4LuI4Lqy4LqZ4Lqh4LqyJyxcbiAgICAgICAgICAgIHMgOiAn4Lqa4LuN4LuI4LuA4LqX4Lq74LuI4Lqy4LuD4LqU4Lqn4Lq04LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIHNzIDogJyVkIOC6p+C6tOC6meC6suC6l+C6tScgLFxuICAgICAgICAgICAgbSA6ICcxIOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBtbSA6ICclZCDgupngurLgupfgurUnLFxuICAgICAgICAgICAgaCA6ICcxIOC6iuC6u+C7iOC6p+C7guC6oeC6hycsXG4gICAgICAgICAgICBoaCA6ICclZCDguorgurvgu4jguqfgu4LguqHguocnLFxuICAgICAgICAgICAgZCA6ICcxIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBkZCA6ICclZCDguqHgurfgu4knLFxuICAgICAgICAgICAgTSA6ICcxIOC7gOC6lOC6t+C6reC6mScsXG4gICAgICAgICAgICBNTSA6ICclZCDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgeSA6ICcxIOC6m+C6tScsXG4gICAgICAgICAgICB5eSA6ICclZCDgupvgurUnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8o4LqX4Lq14LuIKVxcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAn4LqX4Lq14LuIJyArIG51bWJlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgICdzcycgOiAnc2VrdW5kxJdfc2VrdW5kxb5pxbNfc2VrdW5kZXMnLFxuICAgICAgICAnbScgOiAnbWludXTEl19taW51dMSXc19taW51dMSZJyxcbiAgICAgICAgJ21tJzogJ21pbnV0xJdzX21pbnXEjWnFs19taW51dGVzJyxcbiAgICAgICAgJ2gnIDogJ3ZhbGFuZGFfdmFsYW5kb3NfdmFsYW5kxIUnLFxuICAgICAgICAnaGgnOiAndmFsYW5kb3NfdmFsYW5kxbNfdmFsYW5kYXMnLFxuICAgICAgICAnZCcgOiAnZGllbmFfZGllbm9zX2RpZW7EhScsXG4gICAgICAgICdkZCc6ICdkaWVub3NfZGllbsWzX2RpZW5hcycsXG4gICAgICAgICdNJyA6ICdtxJdudW9fbcSXbmVzaW9fbcSXbmVzxK8nLFxuICAgICAgICAnTU0nOiAnbcSXbmVzaWFpX23El25lc2nFs19txJduZXNpdXMnLFxuICAgICAgICAneScgOiAnbWV0YWlfbWV0xbNfbWV0dXMnLFxuICAgICAgICAneXknOiAnbWV0YWlfbWV0xbNfbWV0dXMnXG4gICAgfTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICdrZWxpb3Mgc2VrdW5kxJdzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrZWxpxbMgc2VrdW5kxb5pxbMnIDogJ2tlbGlhcyBzZWt1bmRlcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybXMoa2V5KVswXSA6IChpc0Z1dHVyZSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzJdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAwIHx8IChudW1iZXIgPiAxMCAmJiBudW1iZXIgPCAyMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1zKGtleSkge1xuICAgICAgICByZXR1cm4gdW5pdHNba2V5XS5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyB0cmFuc2xhdGVTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleVswXSwgaXNGdXR1cmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGZvcm1zKGtleSlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBsdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2x0Jywge1xuICAgICAgICBtb250aHMgOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzYXVzaW9fdmFzYXJpb19rb3ZvX2JhbGFuZMW+aW9fZ2VndcW+xJdzX2JpcsW+ZWxpb19saWVwb3NfcnVncGrFq8SNaW9fcnVnc8SXam9fc3BhbGlvX2xhcGtyacSNaW9fZ3J1b2TFvmlvJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ3NhdXNpc192YXNhcmlzX2tvdmFzX2JhbGFuZGlzX2dlZ3XFvsSXX2JpcsW+ZWxpc19saWVwYV9ydWdwasWrdGlzX3J1Z3PEl2ppc19zcGFsaXNfbGFwa3JpdGlzX2dydW9kaXMnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT98TU1NTT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK0Rbb0RdPy9cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnc2F1X3Zhc19rb3ZfYmFsX2dlZ19iaXJfbGllX3JncF9yZ3Nfc3BhX2xhcF9ncmQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2VrbWFkaWVuxK9fcGlybWFkaWVuxK9fYW50cmFkaWVuxK9fdHJlxI1pYWRpZW7Er19rZXR2aXJ0YWRpZW7Er19wZW5rdGFkaWVuxK9fxaFlxaF0YWRpZW7Erycuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6ICdzZWttYWRpZW5pc19waXJtYWRpZW5pc19hbnRyYWRpZW5pc190cmXEjWlhZGllbmlzX2tldHZpcnRhZGllbmlzX3Blbmt0YWRpZW5pc1/FoWXFoXRhZGllbmlzJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9kZGRkIEhIOm1tL1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1Nla19QaXJfQW50X1RyZV9LZXRfUGVuX8WgZcWhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdTX1BfQV9UX0tfUG5fxaAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgTExMIDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBkZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbCA6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIGxsIDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBsbGwgOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbGxsbCA6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIGRkZCwgSEg6bW0gW3ZhbC5dJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW8WgaWFuZGllbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbUnl0b2pdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbVmFrYXJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tQcmHEl2p1c8SvXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdwbyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ByaWXFoSAlcycsXG4gICAgICAgICAgICBzIDogdHJhbnNsYXRlU2Vjb25kcyxcbiAgICAgICAgICAgIHNzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgbW0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoIDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBoaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgOiB0cmFuc2xhdGVTaW5ndWxhcixcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgTU0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5IDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICB5eSA6IHRyYW5zbGF0ZVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tb2ppLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLW9qaSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGx0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgICdzcyc6ICdzZWt1bmRlc19zZWt1bmTEk21fc2VrdW5kZV9zZWt1bmRlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgJ20nOiAnbWluxat0ZXNfbWluxat0xJNtX21pbsWrdGVfbWluxat0ZXMnLnNwbGl0KCdfJyksXG4gICAgICAgICdtbSc6ICdtaW7Fq3Rlc19taW7Fq3TEk21fbWluxat0ZV9taW7Fq3Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgJ2gnOiAnc3R1bmRhc19zdHVuZMSBbV9zdHVuZGFfc3R1bmRhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgJ2hoJzogJ3N0dW5kYXNfc3R1bmTEgW1fc3R1bmRhX3N0dW5kYXMnLnNwbGl0KCdfJyksXG4gICAgICAgICdkJzogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgJ2RkJzogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgJ00nOiAnbcSTbmXFoWFfbcSTbmXFoWllbV9txJNuZXNpc19txJNuZcWhaScuc3BsaXQoJ18nKSxcbiAgICAgICAgJ01NJzogJ23Ek25lxaFhX23Ek25lxaFpZW1fbcSTbmVzaXNfbcSTbmXFoWknLnNwbGl0KCdfJyksXG4gICAgICAgICd5JzogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgJ3l5JzogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHdpdGhvdXRTdWZmaXggYm9vbGVhbiB0cnVlID0gYSBsZW5ndGggb2YgdGltZTsgZmFsc2UgPSBiZWZvcmUvYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JtYXQoZm9ybXMsIG51bWJlciwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgLy8gRS5nLiBcIjIxIG1pbsWrdGVcIiwgXCIzIG1pbsWrdGVzXCIuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgJiYgbnVtYmVyICUgMTAwICE9PSAxMSA/IGZvcm1zWzJdIDogZm9ybXNbM107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBFLmcuIFwiMjEgbWluxat0ZXNcIiBhcyBpbiBcInDEk2MgMjEgbWluxat0ZXNcIi5cbiAgICAgICAgICAgIC8vIEUuZy4gXCIzIG1pbsWrdMSTbVwiIGFzIGluIFwicMSTYyAzIG1pbsWrdMSTbVwiLlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxICYmIG51bWJlciAlIDEwMCAhPT0gMTEgPyBmb3Jtc1swXSA6IGZvcm1zWzFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh1bml0c1trZXldLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVNlY29uZHMobnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2Rhxb5hcyBzZWt1bmRlcycgOiAnZGHFvsSBbSBzZWt1bmTEk20nO1xuICAgIH1cblxuICAgIHZhciBsdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2x2Jywge1xuICAgICAgICBtb250aHMgOiAnamFudsSBcmlzX2ZlYnJ1xIFyaXNfbWFydHNfYXByxKtsaXNfbWFpanNfasWrbmlqc19qxatsaWpzX2F1Z3VzdHNfc2VwdGVtYnJpc19va3RvYnJpc19ub3ZlbWJyaXNfZGVjZW1icmlzJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFpX2rFq25fasWrbF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzdsSTdGRpZW5hX3Bpcm1kaWVuYV9vdHJkaWVuYV90cmXFoWRpZW5hX2NldHVydGRpZW5hX3BpZWt0ZGllbmFfc2VzdGRpZW5hJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnU3ZfUF9PX1RfQ19Qa19TJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVkuJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgZGRkZCwgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbxaBvZGllbiBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbUsSrdCBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW1Zha2FyIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbUGFnxIFqdcWhxIFdIGRkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAncMSTYyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3Bpcm1zICVzJyxcbiAgICAgICAgICAgIHMgOiByZWxhdGl2ZVNlY29uZHMsXG4gICAgICAgICAgICBzcyA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtIDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaCA6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIGhoIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQgOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBkZCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNIDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgTU0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeSA6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGx2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHsgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZCcsICdzZWt1bmRhJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbm9nIG1pbnV0YSddLFxuICAgICAgICAgICAgbW06IFsnbWludXQnLCAnbWludXRhJywgJ21pbnV0YSddLFxuICAgICAgICAgICAgaDogWydqZWRhbiBzYXQnLCAnamVkbm9nIHNhdGEnXSxcbiAgICAgICAgICAgIGhoOiBbJ3NhdCcsICdzYXRhJywgJ3NhdGknXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE1NOiBbJ21qZXNlYycsICdtamVzZWNhJywgJ21qZXNlY2knXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGluYScsICdnb2RpbmUnLCAnZ29kaW5hJ11cbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/IHdvcmRLZXlbMF0gOiAobnVtYmVyID49IDIgJiYgbnVtYmVyIDw9IDQgPyB3b3JkS2V5WzFdIDogd29yZEtleVsyXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XTtcbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBtZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21lJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5fanVsX2F2Z3VzdF9zZXB0ZW1iYXJfb2t0b2Jhcl9ub3ZlbWJhcl9kZWNlbWJhcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hal9qdW5fanVsX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc2p1dHJhIHVdIExUJyxcblxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5ICA6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbbmVkamVsamVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwb25lZGplbGprYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3V0b3JrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3JpamVkZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW8SNZXR2cnRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BldGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3QgICA6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzICAgICAgOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzcyAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoICAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZCAgICAgIDogJ2RhbicsXG4gICAgICAgICAgICBkZCAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gICAgICA6ICdtamVzZWMnLFxuICAgICAgICAgICAgTU0gICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5ICAgICAgOiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5ICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21pJywge1xuICAgICAgICBtb250aHM6ICdLb2hpLXTEgXRlX0h1aS10YW5ndXJ1X1BvdXTFqy10ZS1yYW5naV9QYWVuZ2Etd2jEgXdoxIFfSGFyYXR1YV9QaXBpcmlfSMWNbmdvaW5nb2lfSGVyZS10dXJpLWvFjWvEgV9NYWh1cnVfV2hpcmluZ2EtxIEtbnVrdV9XaGlyaW5nYS3EgS1yYW5naV9IYWtpaGVhJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ0tvaGlfSHVpX1BvdV9QYWVfSGFyYV9QaXBpX0jFjW5nb2lfSGVyZV9NYWh1X1doaS1udV9XaGktcmFfSGFraScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDN9L2ksXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsMn0vaSxcbiAgICAgICAgd2Vla2RheXM6ICdSxIF0YXB1X01hbmVfVMWrcmVpX1dlbmVyZWlfVMSBaXRlX1BhcmFpcmVfSMSBdGFyZWknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdUYV9NYV9UxatfV2VfVMSBaV9QYV9IxIEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW2ldIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tpIHRlaWUgbWFoYW5hLCBpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2Fwb3BvIGldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbaV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpbmFuYWhpIGldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbd2hha2FtdXR1bmdhIGldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpIHJvdG8gaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaSBtdWEnLFxuICAgICAgICAgICAgczogJ3RlIGjEk2tvbmEgcnVhcnVhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgaMSTa29uYScsXG4gICAgICAgICAgICBtOiAnaGUgbWVuZXRpJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuZXRpJyxcbiAgICAgICAgICAgIGg6ICd0ZSBoYW9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhhb3JhJyxcbiAgICAgICAgICAgIGQ6ICdoZSByYScsXG4gICAgICAgICAgICBkZDogJyVkIHJhJyxcbiAgICAgICAgICAgIE06ICdoZSBtYXJhbWEnLFxuICAgICAgICAgICAgTU06ICclZCBtYXJhbWEnLFxuICAgICAgICAgICAgeTogJ2hlIHRhdScsXG4gICAgICAgICAgICB5eTogJyVkIHRhdSdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1pO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbWsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtaycsIHtcbiAgICAgICAgbW9udGhzIDogJ9GY0LDQvdGD0LDRgNC4X9GE0LXQstGA0YPQsNGA0Lhf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Zhf0ZjRg9C90Lhf0ZjRg9C70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ9GY0LDQvV/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Zhf0ZjRg9C9X9GY0YPQu1/QsNCy0LNf0YHQtdC/X9C+0LrRgl/QvdC+0LVf0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfQvdC10LTQtdC70LBf0L/QvtC90LXQtNC10LvQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTQsF/Rh9C10YLQstGA0YLQvtC6X9C/0LXRgtC+0Lpf0YHQsNCx0L7RgtCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDQtV/Rh9C10YJf0L/QtdGCX9GB0LDQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0L1lX9C/b1/QstGCX9GB0YBf0YfQtV/Qv9C1X9GBYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vQlNC10L3QtdGBINCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW9Cj0YLRgNC1INCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1vQktC+XSBkZGRkIFvQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vQktGH0LXRgNCwINCy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQsNGC0LBdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JjQt9C80LjQvdCw0YLQuNC+0YJdIGRkZGQgW9Cy0L5dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9C/0L7RgdC70LUgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICfQv9GA0LXQtCAlcycsXG4gICAgICAgICAgICBzIDogJ9C90LXQutC+0LvQutGDINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzIDogJyVkINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIG0gOiAn0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tIDogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoIDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaCA6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkIDogJ9C00LXQvScsXG4gICAgICAgICAgICBkZCA6ICclZCDQtNC10L3QsCcsXG4gICAgICAgICAgICBNIDogJ9C80LXRgdC10YYnLFxuICAgICAgICAgICAgTU0gOiAnJWQg0LzQtdGB0LXRhtC4JyxcbiAgICAgICAgICAgIHkgOiAn0LPQvtC00LjQvdCwJyxcbiAgICAgICAgICAgIHl5IDogJyVkINCz0L7QtNC40L3QuCdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG1sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWwnLCB7XG4gICAgICAgIG1vbnRocyA6ICfgtJzgtKjgtYHgtLXgtLDgtL9f4LSr4LWG4LSs4LWN4LSw4LWB4LS14LSw4LS/X+C0ruC0vuC1vOC0muC1jeC0muC1jV/gtI/gtKrgtY3gtLDgtL/gtb1f4LSu4LWH4LSv4LWNX+C0nOC1guC1ul/gtJzgtYLgtLLgtYhf4LST4LSX4LS44LWN4LSx4LWN4LSx4LWNX+C0uOC1huC0quC1jeC0seC1jeC0seC0guC0rOC1vF/gtJLgtJXgtY3gtJ/gtYvgtKzgtbxf4LSo4LS14LSC4LSs4LW8X+C0oeC0v+C0uOC0guC0rOC1vCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4LSc4LSo4LWBLl/gtKvgtYbgtKzgtY3gtLDgtYEuX+C0ruC0vuC1vC5f4LSP4LSq4LWN4LSw4LS/Ll/gtK7gtYfgtK/gtY1f4LSc4LWC4LW6X+C0nOC1guC0suC1iC5f4LST4LSXLl/gtLjgtYbgtKrgtY3gtLHgtY3gtLEuX+C0kuC0leC1jeC0n+C1iy5f4LSo4LS14LSCLl/gtKHgtL/gtLjgtIIuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAn4LSe4LS+4LSv4LSx4LS+4LS04LWN4LSaX+C0pOC0v+C0meC1jeC0leC0s+C0vuC0tOC1jeC0ml/gtJrgtYrgtLXgtY3gtLXgtL7gtLTgtY3gtJpf4LSs4LWB4LSn4LSo4LS+4LS04LWN4LSaX+C0teC1jeC0r+C0vuC0tOC0vuC0tOC1jeC0ml/gtLXgtYbgtLPgtY3gtLPgtL/gtK/gtL7gtLTgtY3gtJpf4LS24LSo4LS/4LSv4LS+4LS04LWN4LSaJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+C0nuC0vuC0r+C1vF/gtKTgtL/gtJngtY3gtJXgtb5f4LSa4LWK4LS14LWN4LS1X+C0rOC1geC0p+C1u1/gtLXgtY3gtK/gtL7gtLTgtIJf4LS14LWG4LSz4LWN4LSz4LS/X+C0tuC0qOC0vycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4LSe4LS+X+C0pOC0v1/gtJrgtYpf4LSs4LWBX+C0teC1jeC0r+C0vl/gtLXgtYZf4LS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgICAgIExUUyA6ICdBIGg6bW06c3MgLeC0qOC1gScsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0gLeC0qOC1gSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vgtIfgtKjgtY3gtKjgtY1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+C0qOC0vuC0s+C1hl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4LSH4LSo4LWN4LSo4LSy4LWGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb4LSV4LS04LS/4LSe4LWN4LSeXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg4LSV4LS04LS/4LSe4LWN4LSe4LWNJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4LSu4LWB4LW74LSq4LWNJyxcbiAgICAgICAgICAgIHMgOiAn4LSF4LW94LSqIOC0qOC0v+C0ruC0v+C0t+C0meC1jeC0meC1vicsXG4gICAgICAgICAgICBzcyA6ICclZCDgtLjgtYbgtJXgtY3gtJXgtbvgtKHgtY0nLFxuICAgICAgICAgICAgbSA6ICfgtJLgtLDgtYEg4LSu4LS/4LSo4LS/4LSx4LWN4LSx4LWNJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOC0ruC0v+C0qOC0v+C0seC1jeC0seC1jScsXG4gICAgICAgICAgICBoIDogJ+C0kuC0sOC1gSDgtK7gtKPgtL/gtJXgtY3gtJXgtYLgtbwnLFxuICAgICAgICAgICAgaGggOiAnJWQg4LSu4LSj4LS/4LSV4LWN4LSV4LWC4LW8JyxcbiAgICAgICAgICAgIGQgOiAn4LSS4LSw4LWBIOC0puC0v+C0teC0uOC0gicsXG4gICAgICAgICAgICBkZCA6ICclZCDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgTSA6ICfgtJLgtLDgtYEg4LSu4LS+4LS44LSCJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOC0ruC0vuC0uOC0gicsXG4gICAgICAgICAgICB5IDogJ+C0kuC0sOC1gSDgtLXgtbzgtLfgtIInLFxuICAgICAgICAgICAgeXkgOiAnJWQg4LS14LW84LS34LSCJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LSw4LS+4LSk4LWN4LSw4LS/fOC0sOC0vuC0teC0v+C0suC1hnzgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNfOC0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gnzgtLDgtL7gtKTgtY3gtLDgtL8vaSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgobWVyaWRpZW0gPT09ICfgtLDgtL7gtKTgtY3gtLDgtL8nICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNJyB8fFxuICAgICAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0pOC1jeC0sOC0vyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LS14LS/4LSy4LWGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0pOC1jeC0sOC0vyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXRjdC00YXRjdC9INGB0LXQutGD0L3QtCcgOiAn0YXRjdC00YXRjdC9INGB0LXQutGD0L3QtNGL0L0nO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YHQtdC60YPQvdC0JyA6ICcg0YHQtdC60YPQvdC00YvQvScpO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDQvNC40L3Rg9GCJyA6ICcg0LzQuNC90YPRgtGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YbQsNCzJyA6ICcg0YbQsNCz0LjQudC9Jyk7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINOp0LTTqdGAJyA6ICcg06nQtNGA0LjQudC9Jyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGB0LDRgCcgOiAnINGB0LDRgNGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0LbQuNC7JyA6ICcg0LbQuNC70LjQudC9Jyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtbicsIHtcbiAgICAgICAgbW9udGhzIDogJ9Cd0Y3Qs9C00q/Qs9GN0Y3RgCDRgdCw0YBf0KXQvtGR0YDQtNGD0LPQsNCw0YAg0YHQsNGAX9CT0YPRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CU06nRgNOp0LLQtNKv0LPRjdGN0YAg0YHQsNGAX9Ci0LDQstC00YPQs9Cw0LDRgCDRgdCw0YBf0JfRg9GA0LPQsNC00YPQs9Cw0LDRgCDRgdCw0YBf0JTQvtC70LTRg9Cz0LDQsNGAINGB0LDRgF/QndCw0LnQvNC00YPQs9Cw0LDRgCDRgdCw0YBf0JXRgdC00q/Qs9GN0Y3RgCDRgdCw0YBf0JDRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CQ0YDQstCw0L0g0L3RjdCz0LTSr9Cz0Y3RjdGAINGB0LDRgF/QkNGA0LLQsNC9INGF0L7RkdGA0LTRg9Cz0LDQsNGAINGB0LDRgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnMSDRgdCw0YBfMiDRgdCw0YBfMyDRgdCw0YBfNCDRgdCw0YBfNSDRgdCw0YBfNiDRgdCw0YBfNyDRgdCw0YBfOCDRgdCw0YBfOSDRgdCw0YBfMTAg0YHQsNGAXzExINGB0LDRgF8xMiDRgdCw0YAnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICfQndGP0Lxf0JTQsNCy0LDQsF/QnNGP0LPQvNCw0YBf0JvRhdCw0LPQstCwX9Cf0q/RgNGN0LJf0JHQsNCw0YHQsNC9X9CR0Y/QvNCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0J3Rj9C8X9CU0LDQsl/QnNGP0LNf0JvRhdCwX9Cf0q/RgF/QkdCw0LBf0JHRj9C8Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfQndGPX9CU0LBf0JzRj1/Qm9GFX9Cf0q9f0JHQsF/QkdGPJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEwgOiAnWVlZWSDQvtC90YsgTU1NTdGL0L0gRCcsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWSDQvtC90YsgTU1NTdGL0L0gRCBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIFlZWVkg0L7QvdGLIE1NTU3Ri9C9IEQgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/SrtOofNKu0KUvaSxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn0q7QpSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0q7TqCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0q7QpSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb06jQvdOp06nQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW9Cc0LDRgNCz0LDQsNGIXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb0JjRgNGN0YVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb06jRh9C40LPQtNOp0YBdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vTqNC90LPTqdGA0YHTqdC9XSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDQtNCw0YDQsNCwJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg06nQvNC906knLFxuICAgICAgICAgICAgcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5IDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSDTqdC006nRgC8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg06nQtNOp0YAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBtbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgJzEnOiAn4KWnJyxcbiAgICAgICAgJzInOiAn4KWoJyxcbiAgICAgICAgJzMnOiAn4KWpJyxcbiAgICAgICAgJzQnOiAn4KWqJyxcbiAgICAgICAgJzUnOiAn4KWrJyxcbiAgICAgICAgJzYnOiAn4KWsJyxcbiAgICAgICAgJzcnOiAn4KWtJyxcbiAgICAgICAgJzgnOiAn4KWuJyxcbiAgICAgICAgJzknOiAn4KWvJyxcbiAgICAgICAgJzAnOiAn4KWmJ1xuICAgIH0sXG4gICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAn4KWmJzogJzAnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZU1yKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSlcbiAgICB7XG4gICAgICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAncyc6IG91dHB1dCA9ICfgpJXgpL7gpLngpYAg4KS44KWH4KSV4KSC4KSmJzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3MnOiBvdXRwdXQgPSAnJWQg4KS44KWH4KSV4KSC4KSmJzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6IG91dHB1dCA9ICfgpI/gpJUg4KSu4KS/4KSo4KS/4KSfJzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOiBvdXRwdXQgPSAnJWQg4KSu4KS/4KSo4KS/4KSf4KWHJzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaCc6IG91dHB1dCA9ICfgpI/gpJUg4KSk4KS+4KS4JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGgnOiBvdXRwdXQgPSAnJWQg4KSk4KS+4KS4JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6IG91dHB1dCA9ICfgpI/gpJUg4KSm4KS/4KS14KS4JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGQnOiBvdXRwdXQgPSAnJWQg4KSm4KS/4KS14KS4JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6IG91dHB1dCA9ICfgpI/gpJUg4KSu4KS54KS/4KSo4KS+JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOiBvdXRwdXQgPSAnJWQg4KSu4KS54KS/4KSo4KWHJzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6IG91dHB1dCA9ICfgpI/gpJUg4KS14KSw4KWN4KS3JzsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneXknOiBvdXRwdXQgPSAnJWQg4KS14KSw4KWN4KS34KWHJzsgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiBvdXRwdXQgPSAn4KSV4KS+4KS54KWAIOCkuOClh+CkleCkguCkpuCkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NzJzogb3V0cHV0ID0gJyVkIOCkuOClh+CkleCkguCkpuCkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ20nOiBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkv+CkqOCkv+Ckn+Ckvic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzogb3V0cHV0ID0gJyVkIOCkruCkv+CkqOCkv+Ckn+CkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOiBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpOCkvuCkuOCkvic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hoJzogb3V0cHV0ID0gJyVkIOCkpOCkvuCkuOCkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOiBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpuCkv+CkteCkuOCkvic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzogb3V0cHV0ID0gJyVkIOCkpuCkv+CkteCkuOCkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOiBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkueCkv+CkqOCljeCkr+Ckvic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzogb3V0cHV0ID0gJyVkIOCkruCkueCkv+CkqOCljeCkr+CkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOiBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkteCksOCljeCkt+Ckvic7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3l5Jzogb3V0cHV0ID0gJyVkIOCkteCksOCljeCkt+CkvuCkgic7IGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgbXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtcicsIHtcbiAgICAgICAgbW9udGhzIDogJ+CknOCkvuCkqOClh+CkteCkvuCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOCkv+Cksl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksuCliF/gpJHgpJfgpLjgpY3gpJ9f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSwX+CkkeCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLBf4KSh4KS/4KS44KWH4KSC4KSs4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ+CknOCkvuCkqOClhy5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJouX+Ckj+CkquCljeCksOCkvy5f4KSu4KWHLl/gpJzgpYLgpKguX+CknOClgeCksuCliC5f4KSR4KSXLl/gpLjgpKrgpY3gpJ/gpYfgpIIuX+CkkeCkleCljeCkn+Cliy5f4KSo4KWL4KS14KWN4KS54KWH4KSCLl/gpKHgpL/gpLjgpYfgpIIuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAn4KSw4KS14KS/4KS14KS+4KSwX+CkuOCli+CkruCkteCkvuCksF/gpK7gpILgpJfgpLPgpLXgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+Ckl+ClgeCksOClguCkteCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpLXgpL7gpLBf4KS24KSo4KS/4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSzX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcyDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4KS14KS+4KSc4KSk4KS+J1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KSJ4KSm4KWN4KSv4KS+XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkruCkvuCkl+ClgOCksl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgpK7gpKfgpY3gpK/gpYcnLFxuICAgICAgICAgICAgcGFzdDogJyVz4KSq4KWC4KSw4KWN4KS14KWAJyxcbiAgICAgICAgICAgIHM6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBoOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGQ6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgTTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICB5OiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVNclxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KWN4KSw4KWAfOCkuOCkleCkvuCks+ClgHzgpKbgpYHgpKrgpL7gpLDgpYB84KS44KS+4KSv4KSC4KSV4KS+4KSz4KWALyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCljeCksOClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpYHgpKrgpL7gpLDgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkr+CkguCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpY3gpLDgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWB4KSq4KS+4KSw4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCljeCksOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1yO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbXNNeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zLW15Jywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyaV9GZWJydWFyaV9NYWNfQXByaWxfTWVpX0p1bl9KdWxhaV9PZ29zX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rpc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0FoZF9Jc25fU2VsX1JhYl9LaGFfSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHMgOiAnYmViZXJhcGEgc2FhdCcsXG4gICAgICAgICAgICBzcyA6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG0gOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW5pdCcsXG4gICAgICAgICAgICBoIDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGphbScsXG4gICAgICAgICAgICBkIDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZCA6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE0gOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTSA6ICclZCBidWxhbicsXG4gICAgICAgICAgICB5IDogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXkgOiAnJWQgdGFodW4nXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1zTXk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21zJywge1xuICAgICAgICBtb250aHMgOiAnSmFudWFyaV9GZWJydWFyaV9NYWNfQXByaWxfTWVpX0p1bl9KdWxhaV9PZ29zX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rpc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnQWhhZF9Jc25pbl9TZWxhc2FfUmFidV9LaGFtaXNfSnVtYWF0X1NhYnR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0FoZF9Jc25fU2VsX1JhYl9LaGFfSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGFnaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RlbmdhaGFyaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BldGFuZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbWFsYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tFc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ2RkZGQgW2xlcGFzIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyB5YW5nIGxlcGFzJyxcbiAgICAgICAgICAgIHMgOiAnYmViZXJhcGEgc2FhdCcsXG4gICAgICAgICAgICBzcyA6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG0gOiAnc2VtaW5pdCcsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW5pdCcsXG4gICAgICAgICAgICBoIDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGphbScsXG4gICAgICAgICAgICBkIDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZCA6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE0gOiAnc2VidWxhbicsXG4gICAgICAgICAgICBNTSA6ICclZCBidWxhbicsXG4gICAgICAgICAgICB5IDogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXkgOiAnJWQgdGFodW4nXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1zO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtdCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbm5hcl9GcmFyX01hcnp1X0FwcmlsX01lamp1X8SgdW5qdV9MdWxqdV9Bd3dpc3N1X1NldHRlbWJydV9PdHR1YnJ1X05vdmVtYnJ1X0RpxItlbWJydScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0ZyYV9NYXJfQXByX01lal/EoHVuX0x1bF9Bd3dfU2V0X090dF9Ob3ZfRGnEiycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnSWwtxKZhZGRfSXQtVG5lam5fSXQtVGxpZXRhX0wtRXJiZ8SnYV9JbC3EpmFtaXNfSWwtxKBpbWfEp2FfSXMtU2lidCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfEpmFkX1RuZV9UbGlfRXJiX8SmYW1fxKBpbV9TaWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ8SmYV9Ubl9UbF9Fcl/EpmFfxKBpX1NpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbSWxsdW0gZmlsLV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tHxKdhZGEgZmlsLV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFtmaWwtXUxUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0lsLWJpZXJhxKcgZmlsLV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtsaSBnxKdhZGRhXSBbZmlsLV1MVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZuKAmSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGlsdScsXG4gICAgICAgICAgICBzIDogJ2Z0aXQgc2Vrb25kaScsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWtvbmRpJyxcbiAgICAgICAgICAgIG0gOiAnbWludXRhJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoIDogJ3NpZWfEp2EnLFxuICAgICAgICAgICAgaGggOiAnJWQgc2llZ8SnYXQnLFxuICAgICAgICAgICAgZCA6ICfEoXVybmF0YScsXG4gICAgICAgICAgICBkZCA6ICclZCDEoXJhbmV0JyxcbiAgICAgICAgICAgIE0gOiAneGFoYXInLFxuICAgICAgICAgICAgTU0gOiAnJWQgeGh1cicsXG4gICAgICAgICAgICB5IDogJ3NlbmEnLFxuICAgICAgICAgICAgeXkgOiAnJWQgc25pJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlIDogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG10O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfhgYEnLFxuICAgICAgICAnMic6ICfhgYInLFxuICAgICAgICAnMyc6ICfhgYMnLFxuICAgICAgICAnNCc6ICfhgYQnLFxuICAgICAgICAnNSc6ICfhgYUnLFxuICAgICAgICAnNic6ICfhgYYnLFxuICAgICAgICAnNyc6ICfhgYcnLFxuICAgICAgICAnOCc6ICfhgYgnLFxuICAgICAgICAnOSc6ICfhgYknLFxuICAgICAgICAnMCc6ICfhgYAnXG4gICAgfSwgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4YGBJzogJzEnLFxuICAgICAgICAn4YGCJzogJzInLFxuICAgICAgICAn4YGDJzogJzMnLFxuICAgICAgICAn4YGEJzogJzQnLFxuICAgICAgICAn4YGFJzogJzUnLFxuICAgICAgICAn4YGGJzogJzYnLFxuICAgICAgICAn4YGHJzogJzcnLFxuICAgICAgICAn4YGIJzogJzgnLFxuICAgICAgICAn4YGJJzogJzknLFxuICAgICAgICAn4YGAJzogJzAnXG4gICAgfTtcblxuICAgIHZhciBteSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ215Jywge1xuICAgICAgICBtb250aHM6ICfhgIfhgJThgLrhgJThgJ3hgKvhgJvhgK5f4YCW4YCx4YCW4YCx4YCs4YC64YCd4YCr4YCb4YCuX+GAmeGAkOGAul/hgKfhgJXhgLzhgK5f4YCZ4YCxX+GAh+GAveGAlOGAul/hgIfhgLDhgJzhgK3hgK/hgIThgLpf4YCe4YC84YCC4YCv4YCQ4YC6X+GAheGAgOGAuuGAkOGAhOGAuuGAmOGArF/hgKHhgLHhgKzhgIDhgLrhgJDhgK3hgK/hgJjhgKxf4YCU4YCt4YCv4YCd4YCE4YC64YCY4YCsX+GAkuGAruGAh+GAhOGAuuGAmOGArCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfhgIfhgJThgLpf4YCW4YCxX+GAmeGAkOGAul/hgJXhgLzhgK5f4YCZ4YCxX+GAh+GAveGAlOGAul/hgJzhgK3hgK/hgIThgLpf4YCe4YC8X+GAheGAgOGAul/hgKHhgLHhgKzhgIDhgLpf4YCU4YCt4YCvX+GAkuGAricuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfhgJDhgJThgIThgLrhgLnhgILhgJThgL3hgLFf4YCQ4YCU4YCE4YC64YC54YCc4YCsX+GAoeGAhOGAuuGAueGAguGAq1/hgJfhgK/hgJLhgLnhgJPhgJ/hgLDhgLhf4YCA4YC84YCs4YCe4YCV4YCQ4YCx4YC4X+GAnuGAseGArOGAgOGAvOGArF/hgIXhgJThgLEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhgJThgL3hgLFf4YCc4YCsX+GAguGAq1/hgJ/hgLDhgLhf4YCA4YC84YCsX+GAnuGAseGArF/hgJThgLEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4YCU4YC94YCxX+GAnOGArF/hgILhgKtf4YCf4YCw4YC4X+GAgOGAvOGArF/hgJ7hgLHhgKxf4YCU4YCxJy5zcGxpdCgnXycpLFxuXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GAmuGAlOGAsS5dIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4YCZ4YCU4YCA4YC64YCW4YC84YCU4YC6XSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhgJnhgJThgLEu4YCAXSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vhgJXhgLzhgK7hgLjhgIHhgLLhgLfhgJ7hgLHhgKxdIGRkZGQgTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+GAnOGArOGAmeGAiuGAuuGAtyAlcyDhgJnhgL7hgKwnLFxuICAgICAgICAgICAgcGFzdDogJ+GAnOGAveGAlOGAuuGAgeGAsuGAt+GAnuGAseGArCAlcyDhgIAnLFxuICAgICAgICAgICAgczogJ+GAheGAgOGAueGAgOGAlOGAui7hgKHhgJThgIrhgLrhgLjhgIThgJrhgLonLFxuICAgICAgICAgICAgc3MgOiAnJWQg4YCF4YCA4YC54YCA4YCU4YC34YC6JyxcbiAgICAgICAgICAgIG06ICfhgJDhgIXhgLrhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgbW06ICclZCDhgJnhgK3hgJThgIXhgLonLFxuICAgICAgICAgICAgaDogJ+GAkOGAheGAuuGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBoaDogJyVkIOGAlOGArOGAm+GAricsXG4gICAgICAgICAgICBkOiAn4YCQ4YCF4YC64YCb4YCA4YC6JyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YCb4YCA4YC6JyxcbiAgICAgICAgICAgIE06ICfhgJDhgIXhgLrhgJwnLFxuICAgICAgICAgICAgTU06ICclZCDhgJwnLFxuICAgICAgICAgICAgeTogJ+GAkOGAheGAuuGAlOGAvuGAheGAuicsXG4gICAgICAgICAgICB5eTogJyVkIOGAlOGAvuGAheGAuidcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+GBgeGBguGBg+GBhOGBheGBhuGBh+GBiOGBieGBgF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBteTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG5iID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmInLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW4uX2ZlYi5fbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ3PDuG5kYWdfbWFuZGFnX3RpcnNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDuHJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnc8O4Ll9tYS5fdGkuX29uLl90by5fZnIuX2zDuC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3PDuF9tYV90aV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9ycmlnZV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIHNpZGVuJyxcbiAgICAgICAgICAgIHMgOiAnbm9lbiBzZWt1bmRlcicsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtIDogJ2V0dCBtaW51dHQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXR0ZXInLFxuICAgICAgICAgICAgaCA6ICdlbiB0aW1lJyxcbiAgICAgICAgICAgIGhoIDogJyVkIHRpbWVyJyxcbiAgICAgICAgICAgIGQgOiAnZW4gZGFnJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRhZ2VyJyxcbiAgICAgICAgICAgIE0gOiAnZW4gbcOlbmVkJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG3DpW5lZGVyJyxcbiAgICAgICAgICAgIHkgOiAnZXR0IMOlcicsXG4gICAgICAgICAgICB5eSA6ICclZCDDpXInXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICcxJzogJ+ClpycsXG4gICAgICAgICcyJzogJ+ClqCcsXG4gICAgICAgICczJzogJ+ClqScsXG4gICAgICAgICc0JzogJ+ClqicsXG4gICAgICAgICc1JzogJ+ClqycsXG4gICAgICAgICc2JzogJ+ClrCcsXG4gICAgICAgICc3JzogJ+ClrScsXG4gICAgICAgICc4JzogJ+ClricsXG4gICAgICAgICc5JzogJ+ClrycsXG4gICAgICAgICcwJzogJ+ClpidcbiAgICB9LFxuICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgJ+Clpic6ICcwJ1xuICAgIH07XG5cbiAgICB2YXIgbmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCduZScsIHtcbiAgICAgICAgbW9udGhzIDogJ+CknOCkqOCkteCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCkv+Cksl/gpK7gpIhf4KSc4KWB4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLfgpY3gpJ9f4KS44KWH4KSq4KWN4KSf4KWH4KSu4KWN4KSs4KSwX+CkheCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpK3gpYfgpK7gpY3gpKzgpLBf4KSh4KS/4KS44KWH4KSu4KWN4KSs4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfgpJzgpKguX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCkvy5f4KSu4KSIX+CknOClgeCkqF/gpJzgpYHgpLLgpL7gpIguX+CkheCkly5f4KS44KWH4KSq4KWN4KSfLl/gpIXgpJXgpY3gpJ/gpYsuX+CkqOCli+CkreClhy5f4KSh4KS/4KS44KWHLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ+CkhuCkh+CkpOCkrOCkvuCksF/gpLjgpYvgpK7gpKzgpL7gpLBf4KSu4KSZ4KWN4KSX4KSy4KSs4KS+4KSwX+CkrOClgeCkp+CkrOCkvuCksF/gpKzgpL/gpLngpL/gpKzgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KSs4KS+4KSwX+CktuCkqOCkv+CkrOCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfgpIbgpIfgpKQuX+CkuOCli+Ckri5f4KSu4KSZ4KWN4KSX4KSyLl/gpKzgpYHgpKcuX+CkrOCkv+CkueCkvy5f4KS24KWB4KSV4KWN4KSwLl/gpLbgpKjgpL8uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgpIYuX+CkuOCliy5f4KSu4KSCLl/gpKzgpYEuX+CkrOCkvy5f4KS24KWBLl/gpLYuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0HgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTIDogJ0HgpJXgpYsgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KS/fOCkrOCkv+CkueCkvuCkqHzgpKbgpL/gpIngpIHgpLjgpYt84KS44KS+4KSB4KSdLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCkvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkrOCkv+CkueCkvuCkqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpL/gpIngpIHgpLjgpYsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkgeCknScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KS/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKzgpL/gpLngpL7gpKgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCkv+CkieCkgeCkuOCliyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSB4KSdJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KSt4KWL4KSy4KS/XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb4KSG4KSJ4KSB4KSm4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+CkueCkv+CknOCli10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+Ckl+Ckj+CkleCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXPgpK7gpL4nLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgpIXgpJfgpL7gpKHgpL8nLFxuICAgICAgICAgICAgcyA6ICfgpJXgpYfgpLngpYAg4KSV4KWN4KS34KSjJyxcbiAgICAgICAgICAgIHNzIDogJyVkIOCkuOClh+CkleClh+Cko+CljeCkoScsXG4gICAgICAgICAgICBtIDogJ+Ckj+CklSDgpK7gpL/gpKjgpYfgpJ8nLFxuICAgICAgICAgICAgbW0gOiAnJWQg4KSu4KS/4KSo4KWH4KSfJyxcbiAgICAgICAgICAgIGggOiAn4KSP4KSVIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBoaCA6ICclZCDgpJjgpKPgpY3gpJ/gpL4nLFxuICAgICAgICAgICAgZCA6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNIDogJ+Ckj+CklSDgpK7gpLngpL/gpKjgpL4nLFxuICAgICAgICAgICAgTU0gOiAnJWQg4KSu4KS54KS/4KSo4KS+JyxcbiAgICAgICAgICAgIHkgOiAn4KSP4KSVIOCkrOCksOCljeCktycsXG4gICAgICAgICAgICB5eSA6ICclZCDgpKzgpLDgpY3gpLcnXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5lO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9ICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21laV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID0gJ2phbl9mZWJfbXJ0X2Fwcl9tZWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIG1vbnRoc1BhcnNlID0gWy9eamFuL2ksIC9eZmViL2ksIC9ebWFhcnR8bXJ0Lj8kL2ksIC9eYXByL2ksIC9ebWVpJC9pLCAvXmp1bltpLl0/JC9pLCAvXmp1bFtpLl0/JC9pLCAvXmF1Zy9pLCAvXnNlcC9pLCAvXm9rdC9pLCAvXm5vdi9pLCAvXmRlYy9pXTtcbiAgICB2YXIgbW9udGhzUmVnZXggPSAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyfGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2k7XG5cbiAgICB2YXIgbmxCZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sLWJlJywge1xuICAgICAgICBtb250aHMgOiAnamFudWFyaV9mZWJydWFyaV9tYWFydF9hcHJpbF9tZWlfanVuaV9qdWxpX2F1Z3VzdHVzX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhvdXREb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZSA6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXMgOiAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICd6by5fbWEuX2RpLl93by5fZG8uX3ZyLl96YS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3pvX21hX2RpX3dvX2RvX3ZyX3phJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3ZhbmRhYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dpc3RlcmVuIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thZmdlbG9wZW5dIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdvdmVyICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzIDogJ2VlbiBwYWFyIHNlY29uZGVuJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZGVuJyxcbiAgICAgICAgICAgIG0gOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaCA6ICfDqcOpbiB1dXInLFxuICAgICAgICAgICAgaGggOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQgOiAnw6nDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE0gOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5IDogJ8Opw6luIGphYXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgamFhcidcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICgobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjApID8gJ3N0ZScgOiAnZGUnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmxCZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPSAnamFuLl9mZWIuX21ydC5fYXByLl9tZWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9ICdqYW5fZmViX21ydF9hcHJfbWVpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKTtcblxuICAgIHZhciBtb250aHNQYXJzZSA9IFsvXmphbi9pLCAvXmZlYi9pLCAvXm1hYXJ0fG1ydC4/JC9pLCAvXmFwci9pLCAvXm1laSQvaSwgL15qdW5baS5dPyQvaSwgL15qdWxbaS5dPyQvaSwgL15hdWcvaSwgL15zZXAvaSwgL15va3QvaSwgL15ub3YvaSwgL15kZWMvaV07XG4gICAgdmFyIG1vbnRoc1JlZ2V4ID0gL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcnxqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pO1xuXG4gICAgdmFyIG5sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmwnLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogL14oamFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xtZWl8anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzUGFyc2UgOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2UgOiBtb250aHNQYXJzZSxcblxuICAgICAgICB3ZWVrZGF5cyA6ICd6b25kYWdfbWFhbmRhZ19kaW5zZGFnX3dvZW5zZGFnX2RvbmRlcmRhZ192cmlqZGFnX3phdGVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnem9fbWFfZGlfd29fZG9fdnJfemEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ292ZXIgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBnZWxlZGVuJyxcbiAgICAgICAgICAgIHMgOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2Vjb25kZW4nLFxuICAgICAgICAgICAgbSA6ICfDqcOpbiBtaW51dXQnLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoIDogJ8Opw6luIHV1cicsXG4gICAgICAgICAgICBoaCA6ICclZCB1dXInLFxuICAgICAgICAgICAgZCA6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnZW4nLFxuICAgICAgICAgICAgTSA6ICfDqcOpbiBtYWFuZCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtYWFuZGVuJyxcbiAgICAgICAgICAgIHkgOiAnw6nDqW4gamFhcicsXG4gICAgICAgICAgICB5eSA6ICclZCBqYWFyJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCkgPyAnc3RlJyA6ICdkZScpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBubDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG5uID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbm4nLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYW5fZmViX21hcl9hcHJfbWFpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnc3VuZGFnX23DpW5kYWdfdHlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sYXVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3N1bl9tw6VuX3R5c19vbnNfdG9yX2ZyZV9sYXUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3N1X23DpV90eV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJIGRhZyBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSSBtb3Jnb24ga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJIGfDpXIga2xva2thXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tGw7hyZWfDpWFuZGVdIGRkZGQgW2tsb2trYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBzaWRhbicsXG4gICAgICAgICAgICBzIDogJ25va3JlIHNla3VuZCcsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWt1bmQnLFxuICAgICAgICAgICAgbSA6ICdlaXQgbWludXR0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0dCcsXG4gICAgICAgICAgICBoIDogJ2VpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoIDogJyVkIHRpbWFyJyxcbiAgICAgICAgICAgIGQgOiAnZWluIGRhZycsXG4gICAgICAgICAgICBkZCA6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNIDogJ2VpbiBtw6VuYWQnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeSA6ICdlaXQgw6VyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIMOlcidcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBubjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgJzEnOiAn4KmnJyxcbiAgICAgICAgJzInOiAn4KmoJyxcbiAgICAgICAgJzMnOiAn4KmpJyxcbiAgICAgICAgJzQnOiAn4KmqJyxcbiAgICAgICAgJzUnOiAn4KmrJyxcbiAgICAgICAgJzYnOiAn4KmsJyxcbiAgICAgICAgJzcnOiAn4KmtJyxcbiAgICAgICAgJzgnOiAn4KmuJyxcbiAgICAgICAgJzknOiAn4KmvJyxcbiAgICAgICAgJzAnOiAn4KmmJ1xuICAgIH0sXG4gICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4KmnJzogJzEnLFxuICAgICAgICAn4KmoJzogJzInLFxuICAgICAgICAn4KmpJzogJzMnLFxuICAgICAgICAn4KmqJzogJzQnLFxuICAgICAgICAn4KmrJzogJzUnLFxuICAgICAgICAn4KmsJzogJzYnLFxuICAgICAgICAn4KmtJzogJzcnLFxuICAgICAgICAn4KmuJzogJzgnLFxuICAgICAgICAn4KmvJzogJzknLFxuICAgICAgICAn4KmmJzogJzAnXG4gICAgfTtcblxuICAgIHZhciBwYUluID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGEtaW4nLCB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBtb250aHMgbmFtZSBhcyBwZXIgTmFuYWtzaGFoaSBDYWxlbmRhciBidXQgdGhleSBhcmUgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbW9udGhzIDogJ+ConOCoqOCoteCosOCpgF/gqKvgqLzgqLDgqLXgqLDgqYBf4Kiu4Ki+4Kiw4KiaX+CoheCoquCpjeCosOCpiOCosl/gqK7gqIhf4Kic4KmC4KioX+ConOCpgeCosuCovuCoiF/gqIXgqJfgqLjgqKRf4Ki44Kik4Kmw4Kis4KiwX+CoheColeCopOCpguCorOCosF/gqKjgqLXgqbDgqKzgqLBf4Kim4Ki44Kmw4Kis4KiwJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfgqJzgqKjgqLXgqLDgqYBf4Kir4Ki84Kiw4Ki14Kiw4KmAX+CoruCovuCosOComl/gqIXgqKrgqY3gqLDgqYjgqLJf4Kiu4KiIX+ConOCpguCoqF/gqJzgqYHgqLLgqL7gqIhf4KiF4KiX4Ki44KikX+CouOCopOCpsOCorOCosF/gqIXgqJXgqKTgqYLgqKzgqLBf4Kio4Ki14Kmw4Kis4KiwX+CopuCouOCpsOCorOCosCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn4KiQ4Kik4Ki14Ki+4KiwX+CouOCpi+CoruCoteCovuCosF/gqK7gqbDgqJfgqLLgqLXgqL7gqLBf4Kis4KmB4Kin4Ki14Ki+4KiwX+CoteCpgOCosOCoteCovuCosF/gqLjgqLzgqYHgqbHgqJXgqLDgqLXgqL7gqLBf4Ki44Ki84Kio4KmA4Kia4Kiw4Ki14Ki+4KiwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+CokOCopF/gqLjgqYvgqK5f4Kiu4Kmw4KiX4KiyX+CorOCpgeCop1/gqLXgqYDgqLBf4Ki44Ki84KmB4KiV4KiwX+CouOCovOCoqOCpgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4KiQ4KikX+CouOCpi+Corl/gqK7gqbDgqJfgqLJf4Kis4KmB4KinX+CoteCpgOCosF/gqLjgqLzgqYHgqJXgqLBf4Ki44Ki84Kio4KmAJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTFRTIDogJ0EgaDptbTpzcyDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCoteConOCphycsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ki14Kic4KmHJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+CoheConF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4KiV4KiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdb4KiF4KiX4Kiy4Ki+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgqJXgqLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgqKrgqL/gqJvgqLLgqYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyDgqLXgqL/gqbHgqJonLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDgqKrgqL/gqJvgqLLgqYcnLFxuICAgICAgICAgICAgcyA6ICfgqJXgqYHgqJ0g4Ki44KiV4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIHNzIDogJyVkIOCouOColeCov+CpsOConycsXG4gICAgICAgICAgICBtIDogJ+Coh+ColSDgqK7gqL/gqbDgqJ8nLFxuICAgICAgICAgICAgbW0gOiAnJWQg4Kiu4Ki/4Kmw4KifJyxcbiAgICAgICAgICAgIGggOiAn4KiH4Kmx4KiVIOComOCpsOCon+CovicsXG4gICAgICAgICAgICBoaCA6ICclZCDgqJjgqbDgqJ/gqYcnLFxuICAgICAgICAgICAgZCA6ICfgqIfgqbHgqJUg4Kim4Ki/4KioJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOCopuCov+CoqCcsXG4gICAgICAgICAgICBNIDogJ+Coh+CpseColSDgqK7gqLngqYDgqKjgqL4nLFxuICAgICAgICAgICAgTU0gOiAnJWQg4Kiu4Ki54KmA4Kio4KmHJyxcbiAgICAgICAgICAgIHkgOiAn4KiH4Kmx4KiVIOCouOCovuCosicsXG4gICAgICAgICAgICB5eSA6ICclZCDgqLjgqL7gqLInXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgqafgqajgqangqargqavgqazgqa3gqa7gqa/gqaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFB1bmphYmkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CosOCovuCopHzgqLjgqLXgqYfgqLB84Kim4KmB4Kiq4Ki54Ki/4KiwfOCouOCovOCovuCori8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgqLDgqL7gqKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLXgqYfgqLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kim4KmB4Kiq4Ki54Ki/4KiwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLzgqL7gqK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CosOCovuCopCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ki44Ki14KmH4KiwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqKbgqYHgqKrgqLngqL/gqLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CouOCovOCovuCoric7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kiw4Ki+4KikJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFJbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG1vbnRoc05vbWluYXRpdmUgPSAnc3R5Y3plxYRfbHV0eV9tYXJ6ZWNfa3dpZWNpZcWEX21hal9jemVyd2llY19saXBpZWNfc2llcnBpZcWEX3dyemVzaWXFhF9wYcW6ZHppZXJuaWtfbGlzdG9wYWRfZ3J1ZHppZcWEJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTdWJqZWN0aXZlID0gJ3N0eWN6bmlhX2x1dGVnb19tYXJjYV9rd2lldG5pYV9tYWphX2N6ZXJ3Y2FfbGlwY2Ffc2llcnBuaWFfd3J6ZcWbbmlhX3Bhxbpkemllcm5pa2FfbGlzdG9wYWRhX2dydWRuaWEnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIChuICUgMTAgPCA1KSAmJiAobiAlIDEwID4gMSkgJiYgKCh+fihuIC8gMTApICUgMTApICE9PSAxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdzZWt1bmR5JyA6ICdzZWt1bmQnKTtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXTEmSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCAgPyAnZ29kemluYScgIDogJ2dvZHppbsSZJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2dvZHppbnknIDogJ2dvZHppbicpO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWllc2nEhWNlJyA6ICdtaWVzacSZY3knKTtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2xhdGEnIDogJ2xhdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHBsID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGwnLCB7XG4gICAgICAgIG1vbnRocyA6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudFRvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc05vbWluYXRpdmU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAvLyBIYWNrOiBpZiBmb3JtYXQgZW1wdHkgd2Uga25vdyB0aGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGVcbiAgICAgICAgICAgICAgICAvLyBSZWdFeHAgYnkgbW9tZW50LiBHaXZlIHRoZW4gYmFjayBib3RoIHZhbGlkIGZvcm1zIG9mIG1vbnRoc1xuICAgICAgICAgICAgICAgIC8vIGluIFJlZ0V4cCByZWFkeSBmb3JtYXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIG1vbnRoc1N1YmplY3RpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV0gKyAnfCcgKyBtb250aHNOb21pbmF0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldICsgJyknO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvRCBNTU1NLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU3ViamVjdGl2ZVttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc05vbWluYXRpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ3N0eV9sdXRfbWFyX2t3aV9tYWpfY3plX2xpcF9zaWVfd3J6X3BhxbpfbGlzX2dydScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnbmllZHppZWxhX3BvbmllZHppYcWCZWtfd3RvcmVrX8Wbcm9kYV9jendhcnRla19wacSFdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZHpfcG9uX3d0X8Wbcl9jendfcHRfc29iJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdOZF9Qbl9XdF/FmnJfQ3pfUHRfU28nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0R6acWbIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSnV0cm8gb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBuaWVkemllbMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXZSB3dG9yZWsgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgxZtyb2TEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBzb2JvdMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbV10gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1djem9yYWogb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBuaWVkemllbMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSDFm3JvZMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBzb2JvdMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCeV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIHRlbXUnLFxuICAgICAgICAgICAgcyA6ICdraWxrYSBzZWt1bmQnLFxuICAgICAgICAgICAgc3MgOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkIDogJzEgZHppZcWEJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRuaScsXG4gICAgICAgICAgICBNIDogJ21pZXNpxIVjJyxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6ICdyb2snLFxuICAgICAgICAgICAgeXkgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHB0QnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwdC1icicsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbmVpcm9fRmV2ZXJlaXJvX01hcsOnb19BYnJpbF9NYWlvX0p1bmhvX0p1bGhvX0Fnb3N0b19TZXRlbWJyb19PdXR1YnJvX05vdmVtYnJvX0RlemVtYnJvJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmV2X01hcl9BYnJfTWFpX0p1bl9KdWxfQWdvX1NldF9PdXRfTm92X0Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnRG9taW5nb19TZWd1bmRhLWZlaXJhX1RlcsOnYS1mZWlyYV9RdWFydGEtZmVpcmFfUXVpbnRhLWZlaXJhX1NleHRhLWZlaXJhX1PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnRG9tX1NlZ19UZXJfUXVhX1F1aV9TZXhfU8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRG9fMsKqXzPCql80wqpfNcKqXzbCql9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBbw6BzXSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBbw6BzXSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDYpID9cbiAgICAgICAgICAgICAgICAgICAgJ1vDmmx0aW1vXSBkZGRkIFvDoHNdIExUJyA6IC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgICdbw5psdGltYV0gZGRkZCBbw6BzXSBMVCc7IC8vIE1vbmRheSAtIEZyaWRheVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaMOhICVzJyxcbiAgICAgICAgICAgIHMgOiAncG91Y29zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG0gOiAndW0gbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaCA6ICd1bWEgaG9yYScsXG4gICAgICAgICAgICBoaCA6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkIDogJ3VtIGRpYScsXG4gICAgICAgICAgICBkZCA6ICclZCBkaWFzJyxcbiAgICAgICAgICAgIE0gOiAndW0gbcOqcycsXG4gICAgICAgICAgICBNTSA6ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5IDogJ3VtIGFubycsXG4gICAgICAgICAgICB5eSA6ICclZCBhbm9zJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWwgOiAnJWTCuidcbiAgICB9KTtcblxuICAgIHJldHVybiBwdEJyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgcHQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwdCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbmVpcm9fRmV2ZXJlaXJvX01hcsOnb19BYnJpbF9NYWlvX0p1bmhvX0p1bGhvX0Fnb3N0b19TZXRlbWJyb19PdXR1YnJvX05vdmVtYnJvX0RlemVtYnJvJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmV2X01hcl9BYnJfTWFpX0p1bl9KdWxfQWdvX1NldF9PdXRfTm92X0Rleicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnRG9taW5nb19TZWd1bmRhLWZlaXJhX1RlcsOnYS1mZWlyYV9RdWFydGEtZmVpcmFfUXVpbnRhLWZlaXJhX1NleHRhLWZlaXJhX1PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnRG9tX1NlZ19UZXJfUXVhX1F1aV9TZXhfU8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRG9fMsKqXzPCql80wqpfNcKqXzbCql9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmRheSgpID09PSAwIHx8IHRoaXMuZGF5KCkgPT09IDYpID9cbiAgICAgICAgICAgICAgICAgICAgJ1vDmmx0aW1vXSBkZGRkIFvDoHNdIExUJyA6IC8vIFNhdHVyZGF5ICsgU3VuZGF5XG4gICAgICAgICAgICAgICAgICAgICdbw5psdGltYV0gZGRkZCBbw6BzXSBMVCc7IC8vIE1vbmRheSAtIEZyaWRheVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnaMOhICVzJyxcbiAgICAgICAgICAgIHMgOiAnc2VndW5kb3MnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbSA6ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoIDogJ3VtYSBob3JhJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQgOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRpYXMnLFxuICAgICAgICAgICAgTSA6ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHkgOiAndW0gYW5vJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGFub3MnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZMK6JyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICAgICAnc3MnOiAnc2VjdW5kZScsXG4gICAgICAgICAgICAgICAgJ21tJzogJ21pbnV0ZScsXG4gICAgICAgICAgICAgICAgJ2hoJzogJ29yZScsXG4gICAgICAgICAgICAgICAgJ2RkJzogJ3ppbGUnLFxuICAgICAgICAgICAgICAgICdNTSc6ICdsdW5pJyxcbiAgICAgICAgICAgICAgICAneXknOiAnYW5pJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgJztcbiAgICAgICAgaWYgKG51bWJlciAlIDEwMCA+PSAyMCB8fCAobnVtYmVyID49IDEwMCAmJiBudW1iZXIgJSAxMDAgPT09IDApKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSAnIGRlICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlciArIHNlcGFyYXRvciArIGZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBybyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3JvJywge1xuICAgICAgICBtb250aHMgOiAnaWFudWFyaWVfZmVicnVhcmllX21hcnRpZV9hcHJpbGllX21haV9pdW5pZV9pdWxpZV9hdWd1c3Rfc2VwdGVtYnJpZV9vY3RvbWJyaWVfbm9pZW1icmllX2RlY2VtYnJpZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnaWFuLl9mZWJyLl9tYXJ0Ll9hcHIuX21haV9pdW4uX2l1bC5fYXVnLl9zZXB0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnZHVtaW5pY8SDX2x1bmlfbWFyyJtpX21pZXJjdXJpX2pvaV92aW5lcmlfc8OibWLEg3TEgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdEdW1fTHVuX01hcl9NaWVfSm9pX1Zpbl9Tw6JtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdEdV9MdV9NYV9NaV9Kb19WaV9Tw6InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYXppIGxhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW23DomluZSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpZXJpIGxhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tmb3N0YV0gZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3Blc3RlICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgw65uIHVybcSDJyxcbiAgICAgICAgICAgIHMgOiAnY8OidGV2YSBzZWN1bmRlJyxcbiAgICAgICAgICAgIHNzIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG0gOiAndW4gbWludXQnLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaCA6ICdvIG9yxIMnLFxuICAgICAgICAgICAgaGggOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZCA6ICdvIHppJyxcbiAgICAgICAgICAgIGRkIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE0gOiAnbyBsdW7EgycsXG4gICAgICAgICAgICBNTSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5IDogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5IDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBybztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExID8gZm9ybXNbMF0gOiAobnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApID8gZm9ybXNbMV0gOiBmb3Jtc1syXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICdzcyc6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgJ21tJzogd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LBf0LzQuNC90YPRgtGLX9C80LjQvdGD0YInIDogJ9C80LjQvdGD0YLRg1/QvNC40L3Rg9GC0Ytf0LzQuNC90YPRgicsXG4gICAgICAgICAgICAnaGgnOiAn0YfQsNGBX9GH0LDRgdCwX9GH0LDRgdC+0LInLFxuICAgICAgICAgICAgJ2RkJzogJ9C00LXQvdGMX9C00L3Rj1/QtNC90LXQuScsXG4gICAgICAgICAgICAnTU0nOiAn0LzQtdGB0Y/Rhl/QvNC10YHRj9GG0LBf0LzQtdGB0Y/RhtC10LInLFxuICAgICAgICAgICAgJ3l5JzogJ9Cz0L7QtF/Qs9C+0LTQsF/Qu9C10YInXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LzQuNC90YPRgtCwJyA6ICfQvNC40L3Rg9GC0YMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1vbnRoc1BhcnNlID0gWy9e0Y/QvdCyL2ksIC9e0YTQtdCyL2ksIC9e0LzQsNGAL2ksIC9e0LDQv9GAL2ksIC9e0LzQsFvQudGPXS9pLCAvXtC40Y7QvS9pLCAvXtC40Y7Quy9pLCAvXtCw0LLQsy9pLCAvXtGB0LXQvS9pLCAvXtC+0LrRgi9pLCAvXtC90L7Rjy9pLCAvXtC00LXQui9pXTtcblxuICAgIC8vIGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL3J1bGVzLzEzOS1wcm9wIDogwqcgMTAzXG4gICAgLy8g0KHQvtC60YDQsNGJ0LXQvdC40Y8g0LzQtdGB0Y/RhtC10LI6IGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL2J1cm8vc2VhcmNoLWFuc3dlcj9zPTI0MjYzN1xuICAgIC8vIENMRFIgZGF0YTogICAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy8yOC9zdW1tYXJ5L3J1Lmh0bWwjMTc1M1xuICAgIHZhciBydSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3J1Jywge1xuICAgICAgICBtb250aHMgOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LLQsNGA0Y9f0YTQtdCy0YDQsNC70Y9f0LzQsNGA0YLQsF/QsNC/0YDQtdC70Y9f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQs9GD0YHRgtCwX9GB0LXQvdGC0Y/QsdGA0Y9f0L7QutGC0Y/QsdGA0Y9f0L3QvtGP0LHRgNGPX9C00LXQutCw0LHRgNGPJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTogJ9GP0L3QstCw0YDRjF/RhNC10LLRgNCw0LvRjF/QvNCw0YDRgl/QsNC/0YDQtdC70Yxf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgNGMX9C+0LrRgtGP0LHRgNGMX9C90L7Rj9Cx0YDRjF/QtNC10LrQsNCx0YDRjCcuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6IHtcbiAgICAgICAgICAgIC8vINC/0L4gQ0xEUiDQuNC80LXQvdC90L4gXCLQuNGO0LsuXCIg0LggXCLQuNGO0L0uXCIsINC90L4g0LrQsNC60L7QuSDRgdC80YvRgdC7INC80LXQvdGP0YLRjCDQsdGD0LrQstGDINC90LAg0YLQvtGH0LrRgyA/XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LIuX9GE0LXQstGALl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQsy5f0YHQtdC90YIuX9C+0LrRgi5f0L3QvtGP0LEuX9C00LXQui4nLnNwbGl0KCdfJyksXG4gICAgICAgICAgICBzdGFuZGFsb25lOiAn0Y/QvdCyLl/RhNC10LLRgC5f0LzQsNGA0YJf0LDQv9GALl/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCzLl/RgdC10L3Rgi5f0L7QutGCLl/QvdC+0Y/QsS5f0LTQtdC6Licuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5cyA6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6ICfQstC+0YHQutGA0LXRgdC10L3RjNC1X9C/0L7QvdC10LTQtdC70YzQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTQsF/Rh9C10YLQstC10YDQs1/Qv9GP0YLQvdC40YbQsF/RgdGD0LHQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LVf0L/QvtC90LXQtNC10LvRjNC90LjQul/QstGC0L7RgNC90LjQul/RgdGA0LXQtNGDX9GH0LXRgtCy0LXRgNCzX9C/0Y/RgtC90LjRhtGDX9GB0YPQsdCx0L7RgtGDJy5zcGxpdCgnXycpLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9cXFsgP1vQktCyXSA/KD860L/RgNC+0YjQu9GD0Y580YHQu9C10LTRg9GO0YnRg9GOfNGN0YLRgyk/ID9cXF0gP2RkZGQvXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0LLRgV/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0LLRgV/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlIDogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2UgOiBtb250aHNQYXJzZSxcblxuICAgICAgICAvLyDQv9C+0LvQvdGL0LUg0L3QsNC30LLQsNC90LjRjyDRgSDQv9Cw0LTQtdC20LDQvNC4LCDQv9C+INGC0YDQuCDQsdGD0LrQstGLLCDQtNC70Y8g0L3QtdC60L7RgtC+0YDRi9GFLCDQv9C+IDQg0LHRg9C60LLRiywg0YHQvtC60YDQsNGJ0LXQvdC40Y8g0YEg0YLQvtGH0LrQvtC5INC4INCx0LXQtyDRgtC+0YfQutC4XG4gICAgICAgIG1vbnRoc1JlZ2V4OiAvXijRj9C90LLQsNGAW9GM0Y9dfNGP0L3QslxcLj980YTQtdCy0YDQsNC7W9GM0Y9dfNGE0LXQstGAP1xcLj980LzQsNGA0YLQsD980LzQsNGAXFwuP3zQsNC/0YDQtdC7W9GM0Y9dfNCw0L/RgFxcLj980LzQsFvQudGPXXzQuNGO0L1b0YzRj1180LjRjtC9XFwuP3zQuNGO0Ltb0YzRj1180LjRjtC7XFwuP3zQsNCy0LPRg9GB0YLQsD980LDQstCzXFwuP3zRgdC10L3RgtGP0LHRgFvRjNGPXXzRgdC10L3Rgj9cXC4/fNC+0LrRgtGP0LHRgFvRjNGPXXzQvtC60YJcXC4/fNC90L7Rj9Cx0YBb0YzRj1180L3QvtGP0LE/XFwuP3zQtNC10LrQsNCx0YBb0YzRj1180LTQtdC6XFwuPykvaSxcblxuICAgICAgICAvLyDQutC+0L/QuNGPINC/0YDQtdC00YvQtNGD0YnQtdCz0L5cbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogL14o0Y/QvdCy0LDRgFvRjNGPXXzRj9C90LJcXC4/fNGE0LXQstGA0LDQu1vRjNGPXXzRhNC10LLRgD9cXC4/fNC80LDRgNGC0LA/fNC80LDRgFxcLj980LDQv9GA0LXQu1vRjNGPXXzQsNC/0YBcXC4/fNC80LBb0LnRj1180LjRjtC9W9GM0Y9dfNC40Y7QvVxcLj980LjRjtC7W9GM0Y9dfNC40Y7Qu1xcLj980LDQstCz0YPRgdGC0LA/fNCw0LLQs1xcLj980YHQtdC90YLRj9Cx0YBb0YzRj1180YHQtdC90YI/XFwuP3zQvtC60YLRj9Cx0YBb0YzRj1180L7QutGCXFwuP3zQvdC+0Y/QsdGAW9GM0Y9dfNC90L7Rj9CxP1xcLj980LTQtdC60LDQsdGAW9GM0Y9dfNC00LXQulxcLj8pL2ksXG5cbiAgICAgICAgLy8g0L/QvtC70L3Ri9C1INC90LDQt9Cy0LDQvdC40Y8g0YEg0L/QsNC00LXQttCw0LzQuFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogL14o0Y/QvdCy0LDRgFvRj9GMXXzRhNC10LLRgNCw0Ltb0Y/RjF180LzQsNGA0YLQsD980LDQv9GA0LXQu1vRj9GMXXzQvNCwW9GP0LldfNC40Y7QvVvRj9GMXXzQuNGO0Ltb0Y/RjF180LDQstCz0YPRgdGC0LA/fNGB0LXQvdGC0Y/QsdGAW9GP0YxdfNC+0LrRgtGP0LHRgFvRj9GMXXzQvdC+0Y/QsdGAW9GP0YxdfNC00LXQutCw0LHRgFvRj9GMXSkvaSxcblxuICAgICAgICAvLyDQktGL0YDQsNC20LXQvdC40LUsINC60L7RgtC+0YDQvtC1INGB0L7QvtGC0LLQtdGB0YLQstGD0LXRgiDRgtC+0LvRjNC60L4g0YHQvtC60YDQsNGJ0ZHQvdC90YvQvCDRhNC+0YDQvNCw0LxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogL14o0Y/QvdCyXFwufNGE0LXQstGAP1xcLnzQvNCw0YBb0YIuXXzQsNC/0YBcXC580LzQsFvRj9C5XXzQuNGO0L1b0YzRjy5dfNC40Y7Qu1vRjNGPLl180LDQstCzXFwufNGB0LXQvdGCP1xcLnzQvtC60YJcXC580L3QvtGP0LE/XFwufNC00LXQulxcLikvaSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZINCzLiwgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Ch0LXQs9C+0LTQvdGPLCDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0LLRgtGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidC10LVdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0LjQuV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70L7QtV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9GL0LldIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfRh9C10YDQtdC3ICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg0L3QsNC30LDQtCcsXG4gICAgICAgICAgICBzIDogJ9C90LXRgdC60L7Qu9GM0LrQviDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3MgOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoIDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkIDogJ9C00LXQvdGMJyxcbiAgICAgICAgICAgIGRkIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE0gOiAn0LzQtdGB0Y/RhicsXG4gICAgICAgICAgICBNTSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5IDogJ9Cz0L7QtCcsXG4gICAgICAgICAgICB5eSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9C4fNGD0YLRgNCwfNC00L3Rj3zQstC10YfQtdGA0LAvaSxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQtdGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YPRgtGA0LAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LXRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+fNGPKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0L4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Rjyc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcnU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICfYrNmG2YjYsdmKJyxcbiAgICAgICAgJ9mB2YrYqNix2YjYsdmKJyxcbiAgICAgICAgJ9mF2KfYsdqGJyxcbiAgICAgICAgJ9in2b7YsdmK2YQnLFxuICAgICAgICAn2YXYptmKJyxcbiAgICAgICAgJ9is2YjZhicsXG4gICAgICAgICfYrNmI2YTYp9ih2ZAnLFxuICAgICAgICAn2KLar9iz2b0nLFxuICAgICAgICAn2LPZitm+2b3Zhdio2LEnLFxuICAgICAgICAn2KLaqtm92YjYqNixJyxcbiAgICAgICAgJ9mG2YjZhdio2LEnLFxuICAgICAgICAn2orYs9mF2KjYsSdcbiAgICBdO1xuICAgIHZhciBkYXlzID0gW1xuICAgICAgICAn2KLahtixJyxcbiAgICAgICAgJ9iz2YjZhdixJyxcbiAgICAgICAgJ9in2rHYp9ix2YgnLFxuICAgICAgICAn2KfYsdio2LknLFxuICAgICAgICAn2K7ZhdmK2LMnLFxuICAgICAgICAn2KzZhdi5JyxcbiAgICAgICAgJ9qH2Ybah9ixJ1xuICAgIF07XG5cbiAgICB2YXIgc2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzZCcsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXMgOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW4gOiBkYXlzLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZNiMIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LXYqNitfNi02KfZhS8sXG4gICAgICAgIGlzUE0gOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LXYqNitJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJztcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1vYp9qEXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vYs9qA2Kfau9mKXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvYp9qz2YrZhiDZh9mB2KrZiiDYqtmKXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vaqtin2YTZh9mHXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb2q/Ystix2YrZhCDZh9mB2KrZil0gZGRkZCBb2KrZil0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzINm+2YjYoScsXG4gICAgICAgICAgICBwYXN0IDogJyVzINin2rMnLFxuICAgICAgICAgICAgcyA6ICfahtmG2K8g2LPZitqq2YbaiicsXG4gICAgICAgICAgICBzcyA6ICclZCDYs9mK2qrZhtqKJyxcbiAgICAgICAgICAgIG0gOiAn2YfaqiDZhdmG2b0nLFxuICAgICAgICAgICAgbW0gOiAnJWQg2YXZhtm9JyxcbiAgICAgICAgICAgIGggOiAn2YfaqiDaqtmE2KfaqicsXG4gICAgICAgICAgICBoaCA6ICclZCDaqtmE2KfaqicsXG4gICAgICAgICAgICBkIDogJ9mH2qog2o/ZitmG2YfZhicsXG4gICAgICAgICAgICBkZCA6ICclZCDaj9mK2YbZh9mGJyxcbiAgICAgICAgICAgIE0gOiAn2YfaqiDZhdmH2YrZhtmIJyxcbiAgICAgICAgICAgIE1NIDogJyVkINmF2YfZitmG2KcnLFxuICAgICAgICAgICAgeSA6ICfZh9qqINiz2KfZhCcsXG4gICAgICAgICAgICB5eSA6ICclZCDYs9in2YQnXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2Q7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NlJywge1xuICAgICAgICBtb250aHMgOiAnb8SRxJFhamFnZW3DoW5udV9ndW92dmFtw6FubnVfbmp1a8SNYW3DoW5udV9jdW/Fi29tw6FubnVfbWllc3NlbcOhbm51X2dlYXNzZW3DoW5udV9zdW9pZG5lbcOhbm51X2JvcmdlbcOhbm51X8SNYWvEjWFtw6FubnVfZ29sZ2dvdG3DoW5udV9za8OhYm1hbcOhbm51X2p1b3ZsYW3DoW5udScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnb8SRxJFqX2d1b3Zfbmp1a19jdW9fbWllc19nZWFzX3N1b2lfYm9yZ1/EjWFrxI1fZ29sZ19za8OhYl9qdW92Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzb3RuYWJlYWl2aV92dW9zc8OhcmdhX21hxYvFi2Viw6FyZ2FfZ2Fza2F2YWhra3VfZHVvcmFzdGF0X2JlYXJqYWRhdF9sw6F2dmFyZGF0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3NvdG5fdnVvc19tYcWLX2dhc2tfZHVvcl9iZWFyX2zDoXYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ3Nfdl9tX2dfZF9iX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdNTU1NIEQuIFtiLl0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnTU1NTSBELiBbYi5dIFlZWVkgW3RpLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW290bmUgdGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaWh0dGluIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2lrdGUgdGldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW292ZGRpdF0gZGRkZCBbdGldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIGdlYcW+ZXMnLFxuICAgICAgICAgICAgcGFzdCA6ICdtYcWLaXQgJXMnLFxuICAgICAgICAgICAgcyA6ICdtb2FkZGUgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIG0gOiAnb2t0YSBtaW51aHRhJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnVodGF0JyxcbiAgICAgICAgICAgIGggOiAnb2t0YSBkaWltbXUnLFxuICAgICAgICAgICAgaGggOiAnJWQgZGlpbW11dCcsXG4gICAgICAgICAgICBkIDogJ29rdGEgYmVhaXZpJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGJlYWl2dml0JyxcbiAgICAgICAgICAgIE0gOiAnb2t0YSBtw6FubnUnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbcOhbnV0JyxcbiAgICAgICAgICAgIHkgOiAnb2t0YSBqYWhraScsXG4gICAgICAgICAgICB5eSA6ICclZCBqYWdpdCdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgLypqc2hpbnQgLVcxMDAqL1xuICAgIHZhciBzaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NpJywge1xuICAgICAgICBtb250aHMgOiAn4Lai4Lax4LeA4LeP4La74LeSX+C2tOC3meC2tuC2u+C3gOC3j+C2u+C3kl/gtrjgt4/gtrvgt4rgtq3gt5Rf4LaF4La04LeK4oCN4La74Lea4La94LeKX+C2uOC3kOC2uuC3kl/gtqLgt5bgtrHgt5Jf4Lai4LeW4La94LeSX+C2heC2nOC3neC3g+C3iuC2reC3lF/gt4Pgt5DgtrTgt4rgtq3gt5Dgtrjgt4rgtrbgtrvgt4pf4LaU4Laa4LeK4Lat4Led4La24La74LeKX+C2seC3nOC3gOC3kOC2uOC3iuC2tuC2u+C3il/gtq/gt5ngt4Pgt5Dgtrjgt4rgtrbgtrvgt4onLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+C2ouC2sV/gtrTgt5ngtrZf4La44LeP4La74LeKX+C2heC2tOC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt51f4LeD4LeQ4La04LeKX+C2lOC2muC3il/gtrHgt5zgt4Dgt5Bf4Lav4LeZ4LeD4LeQJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgtongtrvgt5Lgtq/gt49f4LeD4Laz4LeU4Lav4LePX+C2heC2n+C3hOC2u+C3lOC3gOC3j+C2r+C3j1/gtrbgtq/gt4/gtq/gt49f4La24LeK4oCN4La74LeE4LeD4LeK4La04Lat4LeS4Lax4LeK4Lav4LePX+C3g+C3kuC2muC3lOC2u+C3j+C2r+C3j1/gt4Pgt5ngtrHgt4Pgt5Tgtrvgt4/gtq/gt48nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4LaJ4La74LeSX+C3g+C2s+C3lF/gtoXgtp9f4La24Lav4LePX+C2tuC3iuKAjeC2u+C3hF/gt4Pgt5Lgtprgt5Rf4LeD4LeZ4LaxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgtolf4LeDX+C2hV/gtrZf4La24LeK4oCN4La7X+C3g+C3kl/gt4Pgt5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnYSBoOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdhIGg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVkgTU1NTSBEJyxcbiAgICAgICAgICAgIExMTCA6ICdZWVlZIE1NTU0gRCwgYSBoOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWSBNTU1NIEQgW+C3gOC3kOC2seC3kl0gZGRkZCwgYSBoOm1tOnNzJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+C2heC2r10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vgt4Tgt5ngtqddIExUW+C2p10nLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBMVFvgtqddJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+C2iuC2uuC3ml0gTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdb4La04LeD4LeU4Lac4LeS4La6XSBkZGRkIExUW+C2p10nLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVz4Laa4LeS4Lax4LeKJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXPgtprgtqcg4La04LeZ4La7JyxcbiAgICAgICAgICAgIHMgOiAn4Lat4Lat4LeK4La04La7IOC2muC3kuC3hOC3kuC2tOC2uicsXG4gICAgICAgICAgICBzcyA6ICfgtq3gtq3gt4rgtrTgtrsgJWQnLFxuICAgICAgICAgICAgbSA6ICfgtrjgt5LgtrHgt5Lgtq3gt4rgtq3gt5Tgt4AnLFxuICAgICAgICAgICAgbW0gOiAn4La44LeS4Lax4LeS4Lat4LeK4Lat4LeUICVkJyxcbiAgICAgICAgICAgIGggOiAn4La04LeQ4La6JyxcbiAgICAgICAgICAgIGhoIDogJ+C2tOC3kOC2uiAlZCcsXG4gICAgICAgICAgICBkIDogJ+C2r+C3kuC2seC2uicsXG4gICAgICAgICAgICBkZCA6ICfgtq/gt5LgtrEgJWQnLFxuICAgICAgICAgICAgTSA6ICfgtrjgt4/gt4PgtronLFxuICAgICAgICAgICAgTU0gOiAn4La44LeP4LeDICVkJyxcbiAgICAgICAgICAgIHkgOiAn4LeA4LeD4La7JyxcbiAgICAgICAgICAgIHl5IDogJ+C3gOC3g+C2uyAlZCdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9IOC3gOC3kOC2seC3ki8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDgt4Dgt5DgtrHgt5InO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlIDogL+C2tOC3meC2uyDgt4Dgtrvgt5R84La04LeD4LeKIOC3gOC2u+C3lHzgtrTgt5ku4LeAfOC2tC7gt4AuLyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4La0LuC3gC4nIHx8IGlucHV0ID09PSAn4La04LeD4LeKIOC3gOC2u+C3lCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ+C2tC7gt4AuJyA6ICfgtrTgt4Pgt4og4LeA4La74LeUJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La04LeZLuC3gC4nIDogJ+C2tOC3meC2uyDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtb250aHMgPSAnamFudcOhcl9mZWJydcOhcl9tYXJlY19hcHLDrWxfbcOhal9qw7puX2rDumxfYXVndXN0X3NlcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnamFuX2ZlYl9tYXJfYXByX23DoWpfasO6bl9qw7psX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIChuID4gMSkgJiYgKG4gPCA1KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6ICAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSA/ICdww6FyIHNla8O6bmQnIDogJ3DDoXIgc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzogLy8gOSBzZWNvbmRzIC8gaW4gOSBzZWNvbmRzIC8gOSBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2Vrw7puZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtJzogIC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW7DunRhJyA6IChpc0Z1dHVyZSA/ICdtaW7DunR1JyA6ICdtaW7DunRvdScpO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW7DunR5JyA6ICdtaW7DunQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21pbsO6dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaCc6ICAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IChpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2TDrW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2hvZGluYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkJzogIC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpID8gJ2RlxYgnIDogJ2TFiG9tJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG5pJyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkxYhhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ00nOiAgLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkgPyAnbWVzaWFjJyA6ICdtZXNpYWNvbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6IC8vIDkgbW9udGhzIC8gaW4gOSBtb250aHMgLyA5IG1vbnRocyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21lc2lhY2UnIDogJ21lc2lhY292Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtZXNpYWNtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAneSc6ICAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSA/ICdyb2snIDogJ3Jva29tJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzogLy8gOSB5ZWFycyAvIGluIDkgeWVhcnMgLyA5IHllYXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAncm9reScgOiAncm9rb3YnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Jva21pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2sgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzaycsIHtcbiAgICAgICAgbW9udGhzIDogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydCA6IG1vbnRoc1Nob3J0LFxuICAgICAgICB3ZWVrZGF5cyA6ICduZWRlxL5hX3BvbmRlbG9rX3V0b3Jva19zdHJlZGFfxaF0dnJ0b2tfcGlhdG9rX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ25lX3BvX3V0X3N0X8WhdF9waV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQuIE1NTU0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3phanRyYSBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2byDFoXR2cnRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcGlhdG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSBvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IG5lZGXEvnUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzdHJlZHUgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW29dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBzb2JvdHUgb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5IDogdHJhbnNsYXRlXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2s7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICduZWthaiBzZWt1bmQnIDogJ25la2FqIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICdzZWt1bmRvJyA6ICdzZWt1bmRpJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWt1bmRpJyA6ICdzZWt1bmRhaCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGUnIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdlbmEgbWludXRhJyA6ICdlbm8gbWludXRvJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXRvJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGknIDogJ21pbnV0YW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXRlJyA6ICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXQnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSB1cmEnIDogJ2VubyB1cm8nO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAndXJhJyA6ICd1cm8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyaScgOiAndXJhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cmUnIDogJ3VyYW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cicgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gZGFuJyA6ICdlbmltIGRuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZGFuJyA6ICdkbmVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkbmknIDogJ2RuZXZvbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldmknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW4gbWVzZWMnIDogJ2VuaW0gbWVzZWNlbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlYycgOiAnbWVzZWNlbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNhJyA6ICdtZXNlY2VtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZScgOiAnbWVzZWNpJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2V2JyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZW5vIGxldG8nIDogJ2VuaW0gbGV0b20nO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0bycgOiAnbGV0b20nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGknIDogJ2xldG9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldGEnIDogJ2xldGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldCcgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2wgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzbCcsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcl9mZWJydWFyX21hcmVjX2FwcmlsX21hal9qdW5pal9qdWxpal9hdmd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqLl9qdW4uX2p1bC5fYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICduZWRlbGphX3BvbmVkZWxqZWtfdG9yZWtfc3JlZGFfxI1ldHJ0ZWtfcGV0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ25lZC5fcG9uLl90b3IuX3NyZS5fxI1ldC5fcGV0Ll9zb2IuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICduZV9wb190b19zcl/EjWVfcGVfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgIDogJ1tkYW5lcyBvYl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSAgOiAnW2p1dHJpIG9iXSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbbmVkZWxqb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtzcmVkb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtzb2JvdG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5ICA6ICdbdsSNZXJhaiBvYl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW25lZGVsam9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtzcmVkb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW3NvYm90b10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qaV0gZGRkZCBbb2JdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ8SNZXogJXMnLFxuICAgICAgICAgICAgcGFzdCAgIDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgcyAgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGggICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaCAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZCAgICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNICAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU0gICAgIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHkgICAgICA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSAgICAgOiBwcm9jZXNzUmVsYXRpdmVUaW1lXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWwgOiAnJWQuJyxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBzcSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NxJywge1xuICAgICAgICBtb250aHMgOiAnSmFuYXJfU2hrdXJ0X01hcnNfUHJpbGxfTWFqX1FlcnNob3JfS29ycmlrX0d1c2h0X1NodGF0b3JfVGV0b3JfTsOrbnRvcl9EaGpldG9yJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fU2hrX01hcl9QcmlfTWFqX1Flcl9Lb3JfR3VzX1NodF9UZXRfTsOrbl9EaGonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0UgRGllbF9FIEjDq27Dq19FIE1hcnTDq19FIE3Dq3JrdXLDq19FIEVuanRlX0UgUHJlbXRlX0UgU2h0dW7Dqycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdEaWVfSMOrbl9NYXJfTcOrcl9FbmpfUHJlX1NodCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnRF9IX01hX03Dq19FX1BfU2gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9QRHxNRC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKSA9PT0gJ00nO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXJzIDwgMTIgPyAnUEQnIDogJ01EJztcbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1NvdCBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW05lc8OrciBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW27Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbRGplIG7Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnZGRkZCBbZSBrYWx1YXIgbsOrXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnbsOrICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMgbcOrIHBhcsOrJyxcbiAgICAgICAgICAgIHMgOiAnZGlzYSBzZWtvbmRhJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNla29uZGEnLFxuICAgICAgICAgICAgbSA6ICduasOrIG1pbnV0w6snLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludXRhJyxcbiAgICAgICAgICAgIGggOiAnbmrDqyBvcsOrJyxcbiAgICAgICAgICAgIGhoIDogJyVkIG9yw6snLFxuICAgICAgICAgICAgZCA6ICduasOrIGRpdMOrJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGRpdMOrJyxcbiAgICAgICAgICAgIE0gOiAnbmrDqyBtdWFqJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG11YWonLFxuICAgICAgICAgICAgeSA6ICduasOrIHZpdCcsXG4gICAgICAgICAgICB5eSA6ICclZCB2aXRlJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsIDogJyVkLicsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNxO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHsgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ9GB0LXQutGD0L3QtNCwJywgJ9GB0LXQutGD0L3QtNC1JywgJ9GB0LXQutGD0L3QtNC4J10sXG4gICAgICAgICAgICBtOiBbJ9GY0LXQtNCw0L0g0LzQuNC90YPRgicsICfRmNC10LTQvdC1INC80LjQvdGD0YLQtSddLFxuICAgICAgICAgICAgbW06IFsn0LzQuNC90YPRgicsICfQvNC40L3Rg9GC0LUnLCAn0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBoOiBbJ9GY0LXQtNCw0L0g0YHQsNGCJywgJ9GY0LXQtNC90L7QsyDRgdCw0YLQsCddLFxuICAgICAgICAgICAgaGg6IFsn0YHQsNGCJywgJ9GB0LDRgtCwJywgJ9GB0LDRgtC4J10sXG4gICAgICAgICAgICBkZDogWyfQtNCw0L0nLCAn0LTQsNC90LAnLCAn0LTQsNC90LAnXSxcbiAgICAgICAgICAgIE1NOiBbJ9C80LXRgdC10YYnLCAn0LzQtdGB0LXRhtCwJywgJ9C80LXRgdC10YbQuCddLFxuICAgICAgICAgICAgeXk6IFsn0LPQvtC00LjQvdCwJywgJ9Cz0L7QtNC40L3QtScsICfQs9C+0LTQuNC90LAnXVxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gd29yZEtleVswXSA6IChudW1iZXIgPj0gMiAmJiBudW1iZXIgPD0gNCA/IHdvcmRLZXlbMV0gOiB3b3JkS2V5WzJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHNyQ3lybCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyLWN5cmwnLCB7XG4gICAgICAgIG1vbnRoczogJ9GY0LDQvdGD0LDRgF/RhNC10LHRgNGD0LDRgF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQsdCw0YBf0L7QutGC0L7QsdCw0YBf0L3QvtCy0LXQvNCx0LDRgF/QtNC10YbQtdC80LHQsNGAJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GY0LDQvS5f0YTQtdCxLl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCzLl/RgdC10L8uX9C+0LrRgi5f0L3QvtCyLl/QtNC10YYuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10ZnQsF/Qv9C+0L3QtdC00LXRmdCw0Lpf0YPRgtC+0YDQsNC6X9GB0YDQtdC00LBf0YfQtdGC0LLRgNGC0LDQul/Qv9C10YLQsNC6X9GB0YPQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtC5f0L/QvtC9Ll/Rg9GC0L4uX9GB0YDQtS5f0YfQtdGCLl/Qv9C10YIuX9GB0YPQsS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtV/Qv9C+X9GD0YJf0YHRgF/Rh9C1X9C/0LVf0YHRgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9C00LDQvdCw0YEg0YNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0YHRg9GC0YDQsCDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvQvdC10LTQtdGZ0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YDQtdC00YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YPQsdC+0YLRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBkZGRkIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5ICA6ICdb0ZjRg9GH0LUg0YNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0L3QtdC00LXRmdC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0L7QvdC10LTQtdGZ0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRg9GC0L7RgNC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YDQtdC00LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0YfQtdGC0LLRgNGC0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvQv9C10YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvRgdGD0LHQvtGC0LVdIFvRg10gTFQnXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3QgICA6ICfQv9GA0LUgJXMnLFxuICAgICAgICAgICAgcyAgICAgIDogJ9C90LXQutC+0LvQuNC60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3MgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtICAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaCAgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaCAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQgICAgICA6ICfQtNCw0L0nLFxuICAgICAgICAgICAgZGQgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNICAgICAgOiAn0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTSAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICfQs9C+0LTQuNC90YMnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzckN5cmw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3JkczogeyAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsnc2VrdW5kYScsICdzZWt1bmRlJywgJ3Nla3VuZGknXSxcbiAgICAgICAgICAgIG06IFsnamVkYW4gbWludXQnLCAnamVkbmUgbWludXRlJ10sXG4gICAgICAgICAgICBtbTogWydtaW51dCcsICdtaW51dGUnLCAnbWludXRhJ10sXG4gICAgICAgICAgICBoOiBbJ2plZGFuIHNhdCcsICdqZWRub2cgc2F0YSddLFxuICAgICAgICAgICAgaGg6IFsnc2F0JywgJ3NhdGEnLCAnc2F0aSddLFxuICAgICAgICAgICAgZGQ6IFsnZGFuJywgJ2RhbmEnLCAnZGFuYSddLFxuICAgICAgICAgICAgTU06IFsnbWVzZWMnLCAnbWVzZWNhJywgJ21lc2VjaSddLFxuICAgICAgICAgICAgeXk6IFsnZ29kaW5hJywgJ2dvZGluZScsICdnb2RpbmEnXVxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxID8gd29yZEtleVswXSA6IChudW1iZXIgPj0gMiAmJiBudW1iZXIgPD0gNCA/IHdvcmRLZXlbMV0gOiB3b3JkS2V5WzJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldO1xuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHNyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3InLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bl9qdWxfYXZndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqX2p1bl9qdWxfYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGVsamFfcG9uZWRlbGpha191dG9yYWtfc3JlZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyZS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5ICA6ICdbanXEjWUgdV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbbmVkZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkZWxqa2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFt1dG9ya2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3NyZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJ1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdCAgIDogJ3ByZSAlcycsXG4gICAgICAgICAgICBzICAgICAgOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzcyAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW0gICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoICAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoICAgICA6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZCAgICAgIDogJ2RhbicsXG4gICAgICAgICAgICBkZCAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gICAgICA6ICdtZXNlYycsXG4gICAgICAgICAgICBNTSAgICAgOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHkgICAgICA6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXkgICAgIDogdHJhbnNsYXRvci50cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3MnLCB7XG4gICAgICAgIG1vbnRocyA6IFwiQmhpbWJpZHZ3YW5lX0luZGxvdmFuYV9JbmRsb3YnbGVua2h1bHVfTWFiYXNhX0lua2h3ZWtod2V0aV9JbmhsYWJhX0tob2x3YW5lX0luZ2NpX0lueW9uaV9JbXBoYWxhX0x3ZXRpX0luZ29uZ29uaVwiLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0JoaV9JbmFfSW51X01hYl9JbmtfSW5oX0tob19JZ2NfSW55X0ltcF9Md2VfSWdvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdMaXNvbnRmb19VbXNvbWJ1bHVrb19MZXNpYmlsaV9MZXNpdHNhdGZ1X0xlc2luZV9MZXNpaGxhbnVfVW1nY2liZWxvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0xpc19VbWJfTHNiX0xlc19Mc2lfTHNoX1VtZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnTGlfVXNfTGJfTHRfTHNfTGhfVWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUyA6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdbTmFtdWhsYSBuZ2FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW0t1c2FzYSBuZ2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW25nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbSXRvbG8gbmdhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtsZWxpcGhlbGlsZV0gW25nYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ25nYSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3dlbnRla2EgbmdhICVzJyxcbiAgICAgICAgICAgIHMgOiAnZW1penV6d2FuYSBsb21jYW5lJyxcbiAgICAgICAgICAgIHNzIDogJyVkIG16dXp3YW5hJyxcbiAgICAgICAgICAgIG0gOiAndW16dXp1JyxcbiAgICAgICAgICAgIG1tIDogJyVkIGVtaXp1enUnLFxuICAgICAgICAgICAgaCA6ICdsaWhvcmEnLFxuICAgICAgICAgICAgaGggOiAnJWQgZW1haG9yYScsXG4gICAgICAgICAgICBkIDogJ2xpbGFuZ2EnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZW1hbGFuZ2EnLFxuICAgICAgICAgICAgTSA6ICdpbnlhbmdhJyxcbiAgICAgICAgICAgIE1NIDogJyVkIHRpbnlhbmdhJyxcbiAgICAgICAgICAgIHkgOiAndW1ueWFrYScsXG4gICAgICAgICAgICB5eSA6ICclZCBpbWlueWFrYSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2VrdXNlbml8ZW1pbml8ZW50c2FtYmFtYXxlYnVzdWt1LyxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdla3VzZW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW1pbmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbnRzYW1iYW1hJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlYnVzdWt1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VrdXNlbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW1pbmknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2VudHNhbWJhbWEnIHx8IG1lcmlkaWVtID09PSAnZWJ1c3VrdScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbCA6ICclZCcsXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3YgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdicsIHtcbiAgICAgICAgbW9udGhzIDogJ2phbnVhcmlfZmVicnVhcmlfbWFyc19hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdGlfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdzw7ZuZGFnX23DpW5kYWdfdGlzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7ZyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ3PDtm5fbcOlbl90aXNfb25zX3Rvcl9mcmVfbMO2cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnc8O2X23DpV90aV9vbl90b19mcl9sw7YnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbCA6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkIEQgTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJZGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ltb3Jnb25dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWfDpXJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW1DDpV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tJXSBkZGRkW3NdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnZsO2ciAlcyBzZWRhbicsXG4gICAgICAgICAgICBzIDogJ27DpWdyYSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWt1bmRlcicsXG4gICAgICAgICAgICBtIDogJ2VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0ZXInLFxuICAgICAgICAgICAgaCA6ICdlbiB0aW1tZScsXG4gICAgICAgICAgICBoaCA6ICclZCB0aW1tYXInLFxuICAgICAgICAgICAgZCA6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTSA6ICdlbiBtw6VuYWQnLFxuICAgICAgICAgICAgTU0gOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeSA6ICdldHQgw6VyJyxcbiAgICAgICAgICAgIHl5IDogJyVkIMOlcidcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGV8YSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICdlJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ2EnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnYScgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdlJyA6ICdlJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzdycsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcmlfRmVicnVhcmlfTWFjaGlfQXByaWxpX01laV9KdW5pX0p1bGFpX0Fnb3N0aV9TZXB0ZW1iYV9Pa3RvYmFfTm92ZW1iYV9EZXNlbWJhJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfQWdvX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnSnVtYXBpbGlfSnVtYXRhdHVfSnVtYW5uZV9KdW1hdGFub19BbGhhbWlzaV9JanVtYWFfSnVtYW1vc2knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnSnBsX0p0YXRfSm5uZV9KdGFuX0FsaF9Jam1fSm1vcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnSjJfSjNfSjRfSjVfQWxfSWpfSjEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tsZW8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1trZXNobyBzYWFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1t3aWtpIGlqYXlvXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tqYW5hXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbd2lraSBpbGl5b3BpdGFdIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyBiYWFkYXllJyxcbiAgICAgICAgICAgIHBhc3QgOiAndG9rZWEgJXMnLFxuICAgICAgICAgICAgcyA6ICdoaXZpIHB1bmRlJyxcbiAgICAgICAgICAgIHNzIDogJ3Nla3VuZGUgJWQnLFxuICAgICAgICAgICAgbSA6ICdkYWtpa2EgbW9qYScsXG4gICAgICAgICAgICBtbSA6ICdkYWtpa2EgJWQnLFxuICAgICAgICAgICAgaCA6ICdzYWEgbGltb2phJyxcbiAgICAgICAgICAgIGhoIDogJ21hc2FhICVkJyxcbiAgICAgICAgICAgIGQgOiAnc2lrdSBtb2phJyxcbiAgICAgICAgICAgIGRkIDogJ21hc2lrdSAlZCcsXG4gICAgICAgICAgICBNIDogJ213ZXppIG1tb2phJyxcbiAgICAgICAgICAgIE1NIDogJ21pZXppICVkJyxcbiAgICAgICAgICAgIHkgOiAnbXdha2EgbW1vamEnLFxuICAgICAgICAgICAgeXkgOiAnbWlha2EgJWQnXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDcgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN3O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAnMSc6ICfgr6cnLFxuICAgICAgICAnMic6ICfgr6gnLFxuICAgICAgICAnMyc6ICfgr6knLFxuICAgICAgICAnNCc6ICfgr6onLFxuICAgICAgICAnNSc6ICfgr6snLFxuICAgICAgICAnNic6ICfgr6wnLFxuICAgICAgICAnNyc6ICfgr60nLFxuICAgICAgICAnOCc6ICfgr64nLFxuICAgICAgICAnOSc6ICfgr68nLFxuICAgICAgICAnMCc6ICfgr6YnXG4gICAgfSwgbnVtYmVyTWFwID0ge1xuICAgICAgICAn4K+nJzogJzEnLFxuICAgICAgICAn4K+oJzogJzInLFxuICAgICAgICAn4K+pJzogJzMnLFxuICAgICAgICAn4K+qJzogJzQnLFxuICAgICAgICAn4K+rJzogJzUnLFxuICAgICAgICAn4K+sJzogJzYnLFxuICAgICAgICAn4K+tJzogJzcnLFxuICAgICAgICAn4K+uJzogJzgnLFxuICAgICAgICAn4K+vJzogJzknLFxuICAgICAgICAn4K+mJzogJzAnXG4gICAgfTtcblxuICAgIHZhciB0YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RhJywge1xuICAgICAgICBtb250aHMgOiAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ+CunOCuqeCuteCusOCuv1/grqrgrr/grqrgr43grrDgrrXgrrDgrr9f4K6u4K6+4K6w4K+N4K6a4K+NX+Cuj+CuquCvjeCusOCusuCvjV/grq7gr4df4K6c4K+C4K6p4K+NX+CunOCvguCusuCviF/grobgrpXgrrjgr43grp/gr41f4K6a4K+G4K6q4K+N4K6f4K+G4K6u4K+N4K6q4K6w4K+NX+CuheCuleCvjeCun+Cvh+CuvuCuquCusOCvjV/grqjgrrXgrq7gr43grqrgrrDgr41f4K6f4K6/4K6a4K6u4K+N4K6q4K6w4K+NJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfgrp7grr7grq/grr/grrHgr43grrHgr4HgrpXgr43grpXgrr/grrTgrq7gr4hf4K6k4K6/4K6Z4K+N4K6V4K6f4K+N4K6V4K6/4K604K6u4K+IX+CumuCvhuCuteCvjeCuteCuvuCur+CvjeCuleCuv+CutOCuruCviF/grqrgr4HgrqTgrqngr43grpXgrr/grrTgrq7gr4hf4K614K6/4K6v4K6+4K604K6V4K+N4K6V4K6/4K604K6u4K+IX+CuteCvhuCus+CvjeCus+Cuv+CuleCvjeCuleCuv+CutOCuruCviF/grprgrqngrr/grpXgr43grpXgrr/grrTgrq7gr4gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn4K6e4K6+4K6v4K6/4K6x4K+BX+CupOCuv+CumeCvjeCuleCus+CvjV/grprgr4bgrrXgr43grrXgrr7grq/gr41f4K6q4K+B4K6k4K6p4K+NX+CuteCuv+Cur+CuvuCutOCuqeCvjV/grrXgr4bgrrPgr43grrPgrr9f4K6a4K6p4K6/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfgrp7grr5f4K6k4K6/X+CumuCvhl/grqrgr4Ff4K614K6/X+CuteCvhl/grponLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVksIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+Cuh+CuqeCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb4K6o4K6+4K6z4K+IXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vgrqjgr4fgrrHgr43grrHgr4FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vgrpXgrp/grqjgr43grqQg4K614K6+4K6w4K6u4K+NXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg4K6H4K6y4K+NJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg4K6u4K+B4K6p4K+NJyxcbiAgICAgICAgICAgIHMgOiAn4K6S4K6w4K+BIOCumuCuv+CusiDgrrXgrr/grqjgrr7grp/grr/grpXgrrPgr40nLFxuICAgICAgICAgICAgc3MgOiAnJWQg4K614K6/4K6o4K6+4K6f4K6/4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIG0gOiAn4K6S4K6w4K+BIOCuqOCuv+CuruCuv+Cun+CuruCvjScsXG4gICAgICAgICAgICBtbSA6ICclZCDgrqjgrr/grq7grr/grp/grpngr43grpXgrrPgr40nLFxuICAgICAgICAgICAgaCA6ICfgrpLgrrDgr4Eg4K6u4K6j4K6/IOCuqOCvh+CusOCuruCvjScsXG4gICAgICAgICAgICBoaCA6ICclZCDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGQgOiAn4K6S4K6w4K+BIOCuqOCuvuCus+CvjScsXG4gICAgICAgICAgICBkZCA6ICclZCDgrqjgrr7grp/gr43grpXgrrPgr40nLFxuICAgICAgICAgICAgTSA6ICfgrpLgrrDgr4Eg4K6u4K6+4K6k4K6u4K+NJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOCuruCuvuCupOCumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICB5IDogJ+CukuCusOCvgSDgrrXgrrDgr4Hgrp/grq7gr40nLFxuICAgICAgICAgICAgeXkgOiAnJWQg4K6G4K6j4K+N4K6f4K+B4K6V4K6z4K+NJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3grrXgrqTgr4EvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgrrXgrqTgr4EnO1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4K+n4K+o4K+p4K+q4K+r4K+s4K+t4K+u4K+v4K+mXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyByZWZlciBodHRwOi8vdGEud2lraXBlZGlhLm9yZy9zLzFlcjFcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+Cur+CuvuCuruCuruCvjXzgrrXgr4jgrpXgrrHgr4h84K6V4K6+4K6y4K+IfOCuqOCuo+CvjeCuquCuleCusuCvjXzgro7grrHgr43grqrgrr7grp/gr4F84K6u4K6+4K6y4K+ILyxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuteCviOCuleCuseCviCc7ICAvLyDgrrXgr4jgrpXgrrHgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6V4K6+4K6y4K+IJzsgLy8g4K6V4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuqOCuo+CvjeCuquCuleCusuCvjSc7IC8vIOCuqOCuo+CvjeCuquCuleCusuCvjVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgro7grrHgr43grqrgrr7grp/gr4EnOyAvLyDgro7grrHgr43grqrgrr7grp/gr4FcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6u4K6+4K6y4K+IJzsgLy8g4K6u4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCur+CuvuCuruCuruCvjSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgrq/grr7grq7grq7gr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrrXgr4jgrpXgrrHgr4gnIHx8IG1lcmlkaWVtID09PSAn4K6V4K6+4K6y4K+IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CuqOCuo+CvjeCuquCuleCusuCvjScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZScsIHtcbiAgICAgICAgbW9udGhzIDogJ+CwnOCwqOCwteCwsOCwv1/gsKvgsL/gsKzgsY3gsLDgsLXgsLDgsL9f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwv+CwsuCxjV/gsK7gsYdf4LCc4LGC4LCo4LGNX+CwnOCxgeCwsuCxiF/gsIbgsJfgsLjgsY3gsJ/gsYFf4LC44LGG4LCq4LGN4LCf4LGG4LCC4LCs4LCw4LGNX+CwheCwleCxjeCwn+Cxi+CwrOCwsOCxjV/gsKjgsLXgsILgsKzgsLDgsY1f4LCh4LC/4LC44LGG4LCC4LCs4LCw4LGNJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfgsJzgsKguX+Cwq+Cwv+CwrOCxjeCwsC5f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwvy5f4LCu4LGHX+CwnOCxguCwqOCxjV/gsJzgsYHgsLLgsYhf4LCG4LCXLl/gsLjgsYbgsKrgsY0uX+CwheCwleCxjeCwn+Cxiy5f4LCo4LC1Ll/gsKHgsL/gsLjgsYYuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAn4LCG4LCm4LC/4LC14LC+4LCw4LCCX+CwuOCxi+CwruCwteCwvuCwsOCwgl/gsK7gsILgsJfgsLPgsLXgsL7gsLDgsIJf4LCs4LGB4LCn4LC14LC+4LCw4LCCX+Cwl+CxgeCwsOCxgeCwteCwvuCwsOCwgl/gsLbgsYHgsJXgsY3gsLDgsLXgsL7gsLDgsIJf4LC24LCo4LC/4LC14LC+4LCw4LCCJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ+CwhuCwpuCwv1/gsLjgsYvgsK5f4LCu4LCC4LCX4LCzX+CwrOCxgeCwp1/gsJfgsYHgsLDgsYFf4LC24LGB4LCV4LGN4LCwX+CwtuCwqOCwvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn4LCGX+CwuOCxi1/gsK7gsIJf4LCs4LGBX+Cwl+CxgV/gsLbgsYFf4LC2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFMgOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb4LCo4LGH4LCh4LGBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vgsLDgsYfgsKrgsYFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW+CwqOCwv+CwqOCxjeCwqF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+Cwl+CwpF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVzIOCwsuCxiycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIOCwleCxjeCwsOCwv+CwpOCwgicsXG4gICAgICAgICAgICBzIDogJ+CwleCxiuCwqOCxjeCwqOCwvyDgsJXgsY3gsLfgsKPgsL7gsLLgsYEnLFxuICAgICAgICAgICAgc3MgOiAnJWQg4LC44LGG4LCV4LCo4LGN4LCy4LGBJyxcbiAgICAgICAgICAgIG0gOiAn4LCS4LCVIOCwqOCwv+CwruCwv+Cwt+CwgicsXG4gICAgICAgICAgICBtbSA6ICclZCDgsKjgsL/gsK7gsL/gsLfgsL7gsLLgsYEnLFxuICAgICAgICAgICAgaCA6ICfgsJLgsJUg4LCX4LCC4LCfJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOCwl+CwguCwn+CwsuCxgScsXG4gICAgICAgICAgICBkIDogJ+CwkuCwlSDgsLDgsYvgsJzgsYEnLFxuICAgICAgICAgICAgZGQgOiAnJWQg4LCw4LGL4LCc4LGB4LCy4LGBJyxcbiAgICAgICAgICAgIE0gOiAn4LCS4LCVIOCwqOCxhuCwsicsXG4gICAgICAgICAgICBNTSA6ICclZCDgsKjgsYbgsLLgsLLgsYEnLFxuICAgICAgICAgICAgeSA6ICfgsJLgsJUg4LC44LCC4LC14LCk4LGN4LC44LCw4LCCJyxcbiAgICAgICAgICAgIHl5IDogJyVkIOCwuOCwguCwteCwpOCxjeCwuOCwsOCwvuCwsuCxgSdcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZSA6IC9cXGR7MSwyfeCwtS8sXG4gICAgICAgIG9yZGluYWwgOiAnJWTgsLUnLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LCw4LC+4LCk4LGN4LCw4LC/fOCwieCwpuCwr+CwgnzgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIJ84LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CwsOCwvuCwpOCxjeCwsOCwvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwieCwpuCwr+CwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwuOCwvuCwr+CwguCwpOCxjeCwsOCwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCw4LC+4LCk4LGN4LCw4LC/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsIngsKbgsK/gsIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLDgsL7gsKTgsY3gsLDgsL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0ZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHRldCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RldCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbmVpcnVfRmV2ZXJlaXJ1X01hcnN1X0FicmlsX01haXVfSnXDsXVfSnVsbHVfQWd1c3R1X1NldGVtYnJ1X091dHVicnVfTm92ZW1icnVfRGV6ZW1icnUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0phbl9GZXZfTWFyX0Ficl9NYWlfSnVuX0p1bF9BZ29fU2V0X091dF9Ob3ZfRGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdEb21pbmd1X1NlZ3VuZGFfVGVyc2FfS3VhcnRhX0tpbnRhX1Nlc3RhX1NhYmFkdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdEb21fU2VnX1RlcnNfS3VhX0tpbnRfU2VzdF9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ0RvX1NlZ19UZV9LdV9LaV9TZXNfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW09oaW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FiYW4gaWhhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2loYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIb3Jpc2VpayBpaGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbc2VtYW5hIGtvdHVrXSBbaWhhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdpaGEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBsaXViYScsXG4gICAgICAgICAgICBzIDogJ21pbnV0dSBiYWx1bicsXG4gICAgICAgICAgICBzcyA6ICdtaW51dHUgJWQnLFxuICAgICAgICAgICAgbSA6ICdtaW51dHUgaWRhJyxcbiAgICAgICAgICAgIG1tIDogJ21pbnV0dSAlZCcsXG4gICAgICAgICAgICBoIDogJ29yYXMgaWRhJyxcbiAgICAgICAgICAgIGhoIDogJ29yYXMgJWQnLFxuICAgICAgICAgICAgZCA6ICdsb3JvbiBpZGEnLFxuICAgICAgICAgICAgZGQgOiAnbG9yb24gJWQnLFxuICAgICAgICAgICAgTSA6ICdmdWxhbiBpZGEnLFxuICAgICAgICAgICAgTU0gOiAnZnVsYW4gJWQnLFxuICAgICAgICAgICAgeSA6ICd0aW5hbiBpZGEnLFxuICAgICAgICAgICAgeXkgOiAndGluYW4gJWQnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAofn4obnVtYmVyICUgMTAwIC8gMTApID09PSAxKSA/ICd0aCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAyKSA/ICduZCcgOlxuICAgICAgICAgICAgICAgIChiID09PSAzKSA/ICdyZCcgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGV0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YPQvCcsXG4gICAgICAgIDE6ICct0YPQvCcsXG4gICAgICAgIDI6ICct0Y7QvCcsXG4gICAgICAgIDM6ICct0Y7QvCcsXG4gICAgICAgIDQ6ICct0YPQvCcsXG4gICAgICAgIDU6ICct0YPQvCcsXG4gICAgICAgIDY6ICct0YPQvCcsXG4gICAgICAgIDc6ICct0YPQvCcsXG4gICAgICAgIDg6ICct0YPQvCcsXG4gICAgICAgIDk6ICct0YPQvCcsXG4gICAgICAgIDEwOiAnLdGD0LwnLFxuICAgICAgICAxMjogJy3Rg9C8JyxcbiAgICAgICAgMTM6ICct0YPQvCcsXG4gICAgICAgIDIwOiAnLdGD0LwnLFxuICAgICAgICAzMDogJy3RjtC8JyxcbiAgICAgICAgNDA6ICct0YPQvCcsXG4gICAgICAgIDUwOiAnLdGD0LwnLFxuICAgICAgICA2MDogJy3Rg9C8JyxcbiAgICAgICAgNzA6ICct0YPQvCcsXG4gICAgICAgIDgwOiAnLdGD0LwnLFxuICAgICAgICA5MDogJy3Rg9C8JyxcbiAgICAgICAgMTAwOiAnLdGD0LwnXG4gICAgfTtcblxuICAgIHZhciB0ZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RnJywge1xuICAgICAgICBtb250aHMgOiAn0Y/QvdCy0LDRgF/RhNC10LLRgNCw0Ltf0LzQsNGA0YJf0LDQv9GA0LXQu1/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YBf0L7QutGC0Y/QsdGAX9C90L7Rj9Cx0YBf0LTQtdC60LDQsdGAJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAn0Y/QutGI0LDQvdCx0LVf0LTRg9GI0LDQvdCx0LVf0YHQtdGI0LDQvdCx0LVf0YfQvtGA0YjQsNC90LHQtV/Qv9Cw0L3St9GI0LDQvdCx0LVf0rfRg9C80YrQsF/RiNCw0L3QsdC1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9GP0YjQsV/QtNGI0LFf0YHRiNCxX9GH0YjQsV/Qv9GI0LFf0rfRg9C8X9GI0L3QsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0Y/RiF/QtNGIX9GB0Yhf0YfRiF/Qv9GIX9K30Lxf0YjQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9CY0LzRgNOv0Lcg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdb0J/QsNCz0L7SsyDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vQlNC40YDTr9C3INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGRb0LhdIFvSs9Cw0YTRgtCw0Lgg0L7Rj9C90LTQsCDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkW9C4XSBb0rPQsNGE0YLQsNC4INCz0YPQt9Cw0YjRgtCwINGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfQsdCw0YrQtNC4ICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg0L/QtdGIJyxcbiAgICAgICAgICAgIHMgOiAn0Y/QutGH0LDQvdC0INGB0L7QvdC40Y8nLFxuICAgICAgICAgICAgbSA6ICfRj9C6INC00LDSm9C40pvQsCcsXG4gICAgICAgICAgICBtbSA6ICclZCDQtNCw0pvQuNKb0LAnLFxuICAgICAgICAgICAgaCA6ICfRj9C6INGB0L7QsNGCJyxcbiAgICAgICAgICAgIGhoIDogJyVkINGB0L7QsNGCJyxcbiAgICAgICAgICAgIGQgOiAn0Y/QuiDRgNOv0LcnLFxuICAgICAgICAgICAgZGQgOiAnJWQg0YDTr9C3JyxcbiAgICAgICAgICAgIE0gOiAn0Y/QuiDQvNC+0rMnLFxuICAgICAgICAgICAgTU0gOiAnJWQg0LzQvtKzJyxcbiAgICAgICAgICAgIHkgOiAn0Y/QuiDRgdC+0LsnLFxuICAgICAgICAgICAgeXkgOiAnJWQg0YHQvtC7J1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0YjQsNCxfNGB0YPQsdKzfNGA06/Qt3zQsdC10LPQvtKzLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn0YjQsNCxJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YHRg9Cx0rMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0YDTr9C3Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfQsdC10LPQvtKzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GI0LDQsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YHRg9Cx0rMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA06/Qtyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LHQtdCz0L7Ssyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YjQsNCxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRg9C8fNGO0LwpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxdGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0ZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHRoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGgnLCB7XG4gICAgICAgIG1vbnRocyA6ICfguKHguIHguKPguLLguITguKFf4LiB4Li44Lih4Lig4Liy4Lie4Lix4LiZ4LiY4LmMX+C4oeC4teC4meC4suC4hOC4oV/guYDguKHguKnguLLguKLguJlf4Lie4Lik4Lip4Lig4Liy4LiE4LihX+C4oeC4tOC4luC4uOC4meC4suC4ouC4mV/guIHguKPguIHguI7guLLguITguKFf4Liq4Li04LiH4Lir4Liy4LiE4LihX+C4geC4seC4meC4ouC4suC4ouC4mV/guJXguLjguKXguLLguITguKFf4Lie4Lik4Lio4LiI4Li04LiB4Liy4Lii4LiZX+C4mOC4seC4meC4p+C4suC4hOC4oScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4LihLuC4hC5f4LiBLuC4ni5f4Lih4Li1LuC4hC5f4LmA4LihLuC4oi5f4LieLuC4hC5f4Lih4Li0LuC4oi5f4LiBLuC4hC5f4LiqLuC4hC5f4LiBLuC4oi5f4LiVLuC4hC5f4LieLuC4oi5f4LiYLuC4hC4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzIDogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKrguJrguJTguLVf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfguK3guLLguJfguLTguJXguKLguYxf4LiI4Lix4LiZ4LiX4Lij4LmMX+C4reC4seC4h+C4hOC4suC4o1/guJ7guLjguJhf4Lie4Lik4Lir4Lix4LiqX+C4qOC4uOC4geC4o+C5jF/guYDguKrguLLguKPguYwnLnNwbGl0KCdfJyksIC8vIHllcywgdGhyZWUgY2hhcmFjdGVycyBkaWZmZXJlbmNlXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+C4reC4si5f4LiILl/guK0uX+C4ni5f4Lie4LikLl/guKguX+C4qi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAn4Lin4Lix4LiZZGRkZOC4l+C4teC5iCBEIE1NTU0gWVlZWSDguYDguKfguKXguLIgSDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4h3zguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+C4p+C4seC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW+C4nuC4o+C4uOC5iOC4h+C4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGRb4Lir4LiZ4LmJ4LiyIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb4LmA4Lih4Li34LmI4Lit4Lin4Liy4LiZ4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW+C4p+C4seC4mV1kZGRkW+C4l+C4teC5iOC5geC4peC5ieC4pyDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfguK3guLXguIEgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclc+C4l+C4teC5iOC5geC4peC5ieC4pycsXG4gICAgICAgICAgICBzIDogJ+C5hOC4oeC5iOC4geC4teC5iOC4p+C4tOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBzcyA6ICclZCDguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgbSA6ICcxIOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtbSA6ICclZCDguJnguLLguJfguLUnLFxuICAgICAgICAgICAgaCA6ICcxIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBoaCA6ICclZCDguIrguLHguYjguKfguYLguKHguIcnLFxuICAgICAgICAgICAgZCA6ICcxIOC4p+C4seC4mScsXG4gICAgICAgICAgICBkZCA6ICclZCDguKfguLHguJknLFxuICAgICAgICAgICAgTSA6ICcxIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICBNTSA6ICclZCDguYDguJTguLfguK3guJknLFxuICAgICAgICAgICAgeSA6ICcxIOC4m+C4tScsXG4gICAgICAgICAgICB5eSA6ICclZCDguJvguLUnXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHRsUGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bC1waCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0VuZXJvX1BlYnJlcm9fTWFyc29fQWJyaWxfTWF5b19IdW55b19IdWx5b19BZ29zdG9fU2V0eWVtYnJlX09rdHVicmVfTm9ieWVtYnJlX0Rpc3llbWJyZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnRW5lX1BlYl9NYXJfQWJyX01heV9IdW5fSHVsX0Fnb19TZXRfT2t0X05vYl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ0xpbmdnb19MdW5lc19NYXJ0ZXNfTWl5ZXJrdWxlc19IdXdlYmVzX0JpeWVybmVzX1NhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdMaW5fTHVuX01hcl9NaXlfSHV3X0JpeV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ0xpX0x1X01hX01pX0h1X0JpX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdNTS9EL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdNTU1NIEQsIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBNTU1NIERELCBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdMVCBbbmdheW9uZyBhcmF3XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0J1a2FzIG5nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xUIFtzYSBzdXN1bm9kIG5hXSBkZGRkJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdMVCBba2FoYXBvbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMVCBbbm9vbmcgbmFrYXJhYW5nXSBkZGRkJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ3NhIGxvb2IgbmcgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyBhbmcgbmFrYWxpcGFzJyxcbiAgICAgICAgICAgIHMgOiAnaWxhbmcgc2VndW5kbycsXG4gICAgICAgICAgICBzcyA6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG0gOiAnaXNhbmcgbWludXRvJyxcbiAgICAgICAgICAgIG1tIDogJyVkIG1pbnV0bycsXG4gICAgICAgICAgICBoIDogJ2lzYW5nIG9yYXMnLFxuICAgICAgICAgICAgaGggOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkIDogJ2lzYW5nIGFyYXcnLFxuICAgICAgICAgICAgZGQgOiAnJWQgYXJhdycsXG4gICAgICAgICAgICBNIDogJ2lzYW5nIGJ1d2FuJyxcbiAgICAgICAgICAgIE1NIDogJyVkIGJ1d2FuJyxcbiAgICAgICAgICAgIHkgOiAnaXNhbmcgdGFvbicsXG4gICAgICAgICAgICB5eSA6ICclZCB0YW9uJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGxQaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIG51bWJlcnNOb3VucyA9ICdwYWdoX3dh4oCZX2NoYeKAmV93ZWpfbG9TX3ZhZ2hfamF2X1NvY2hfY2hvcmdoX0h1dCcuc3BsaXQoJ18nKTtcblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZUZ1dHVyZShvdXRwdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBvdXRwdXQ7XG4gICAgICAgIHRpbWUgPSAob3V0cHV0LmluZGV4T2YoJ2phaicpICE9PSAtMSkgP1xuICAgICAgICB0aW1lLnNsaWNlKDAsIC0zKSArICdsZVMnIDpcbiAgICAgICAgKG91dHB1dC5pbmRleE9mKCdqYXInKSAhPT0gLTEpID9cbiAgICAgICAgdGltZS5zbGljZSgwLCAtMykgKyAnd2FRJyA6XG4gICAgICAgIChvdXRwdXQuaW5kZXhPZignRElTJykgIT09IC0xKSA/XG4gICAgICAgIHRpbWUuc2xpY2UoMCwgLTMpICsgJ25lbScgOlxuICAgICAgICB0aW1lICsgJyBwSXEnO1xuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVQYXN0KG91dHB1dCkge1xuICAgICAgICB2YXIgdGltZSA9IG91dHB1dDtcbiAgICAgICAgdGltZSA9IChvdXRwdXQuaW5kZXhPZignamFqJykgIT09IC0xKSA/XG4gICAgICAgIHRpbWUuc2xpY2UoMCwgLTMpICsgJ0h14oCZJyA6XG4gICAgICAgIChvdXRwdXQuaW5kZXhPZignamFyJykgIT09IC0xKSA/XG4gICAgICAgIHRpbWUuc2xpY2UoMCwgLTMpICsgJ3dlbicgOlxuICAgICAgICAob3V0cHV0LmluZGV4T2YoJ0RJUycpICE9PSAtMSkgP1xuICAgICAgICB0aW1lLnNsaWNlKDAsIC0zKSArICdiZW4nIDpcbiAgICAgICAgdGltZSArICcgcmV0JztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtYmVyTm91biA9IG51bWJlckFzTm91bihudW1iZXIpO1xuICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBsdXAnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyB0dXAnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyByZXAnO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYWonO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBqYXInO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJOb3VuICsgJyBESVMnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVtYmVyQXNOb3VuKG51bWJlcikge1xuICAgICAgICB2YXIgaHVuZHJlZCA9IE1hdGguZmxvb3IoKG51bWJlciAlIDEwMDApIC8gMTAwKSxcbiAgICAgICAgdGVuID0gTWF0aC5mbG9vcigobnVtYmVyICUgMTAwKSAvIDEwKSxcbiAgICAgICAgb25lID0gbnVtYmVyICUgMTAsXG4gICAgICAgIHdvcmQgPSAnJztcbiAgICAgICAgaWYgKGh1bmRyZWQgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9IG51bWJlcnNOb3Vuc1todW5kcmVkXSArICd2YXRsaCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlbiA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gKCh3b3JkICE9PSAnJykgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbdGVuXSArICdtYUgnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmUgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9ICgod29yZCAhPT0gJycpID8gJyAnIDogJycpICsgbnVtYmVyc05vdW5zW29uZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh3b3JkID09PSAnJykgPyAncGFnaCcgOiB3b3JkO1xuICAgIH1cblxuICAgIHZhciB0bGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bGgnLCB7XG4gICAgICAgIG1vbnRocyA6ICd0ZXJh4oCZIGphciB3YeKAmV90ZXJh4oCZIGphciBjaGHigJlfdGVyYeKAmSBqYXIgd2VqX3RlcmHigJkgamFyIGxvU190ZXJh4oCZIGphciB2YWdoX3RlcmHigJkgamFyIGphdl90ZXJh4oCZIGphciBTb2NoX3RlcmHigJkgamFyIGNob3JnaF90ZXJh4oCZIGphciBIdXRfdGVyYeKAmSBqYXIgd2HigJltYUhfdGVyYeKAmSBqYXIgd2HigJltYUggd2HigJlfdGVyYeKAmSBqYXIgd2HigJltYUggY2hh4oCZJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdqYXIgd2HigJlfamFyIGNoYeKAmV9qYXIgd2VqX2phciBsb1NfamFyIHZhZ2hfamFyIGphdl9qYXIgU29jaF9qYXIgY2hvcmdoX2phciBIdXRfamFyIHdh4oCZbWFIX2phciB3YeKAmW1hSCB3YeKAmV9qYXIgd2HigJltYUggY2hh4oCZJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEYUhqYWpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbd2HigJlsZVNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbd2HigJlIdeKAmV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMTEwnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiB0cmFuc2xhdGVGdXR1cmUsXG4gICAgICAgICAgICBwYXN0IDogdHJhbnNsYXRlUGFzdCxcbiAgICAgICAgICAgIHMgOiAncHVTIGx1cCcsXG4gICAgICAgICAgICBzcyA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG0gOiAnd2HigJkgdHVwJyxcbiAgICAgICAgICAgIG1tIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaCA6ICd3YeKAmSByZXAnLFxuICAgICAgICAgICAgaGggOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkIDogJ3dh4oCZIGphaicsXG4gICAgICAgICAgICBkZCA6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE0gOiAnd2HigJkgamFyJyxcbiAgICAgICAgICAgIE1NIDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeSA6ICd3YeKAmSBESVMnLFxuICAgICAgICAgICAgeXkgOiB0cmFuc2xhdGVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0bGg7XG5cbn0pKSk7XG4iLCJcbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDE6ICdcXCdpbmNpJyxcbiAgICAgICAgNTogJ1xcJ2luY2knLFxuICAgICAgICA4OiAnXFwnaW5jaScsXG4gICAgICAgIDcwOiAnXFwnaW5jaScsXG4gICAgICAgIDgwOiAnXFwnaW5jaScsXG4gICAgICAgIDI6ICdcXCduY2knLFxuICAgICAgICA3OiAnXFwnbmNpJyxcbiAgICAgICAgMjA6ICdcXCduY2knLFxuICAgICAgICA1MDogJ1xcJ25jaScsXG4gICAgICAgIDM6ICdcXCfDvG5jw7wnLFxuICAgICAgICA0OiAnXFwnw7xuY8O8JyxcbiAgICAgICAgMTAwOiAnXFwnw7xuY8O8JyxcbiAgICAgICAgNjogJ1xcJ25jxLEnLFxuICAgICAgICA5OiAnXFwndW5jdScsXG4gICAgICAgIDEwOiAnXFwndW5jdScsXG4gICAgICAgIDMwOiAnXFwndW5jdScsXG4gICAgICAgIDYwOiAnXFwnxLFuY8SxJyxcbiAgICAgICAgOTA6ICdcXCfEsW5jxLEnXG4gICAgfTtcblxuICAgIHZhciB0ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RyJywge1xuICAgICAgICBtb250aHMgOiAnT2Nha1/FnnViYXRfTWFydF9OaXNhbl9NYXnEsXNfSGF6aXJhbl9UZW1tdXpfQcSfdXN0b3NfRXlsw7xsX0VraW1fS2FzxLFtX0FyYWzEsWsnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ09jYV/FnnViX01hcl9OaXNfTWF5X0hhel9UZW1fQcSfdV9FeWxfRWtpX0thc19BcmEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ1BhemFyX1BhemFydGVzaV9TYWzEsV/Dh2FyxZ9hbWJhX1BlcsWfZW1iZV9DdW1hX0N1bWFydGVzaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdQYXpfUHRzX1NhbF/Dh2FyX1Blcl9DdW1fQ3RzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdQel9QdF9TYV/Dh2FfUGVfQ3VfQ3QnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tidWfDvG4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbeWFyxLFuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1tnZWxlY2VrXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tkw7xuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbZ2XDp2VuXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMgc29ucmEnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDDtm5jZScsXG4gICAgICAgICAgICBzIDogJ2Jpcmthw6cgc2FuaXllJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNhbml5ZScsXG4gICAgICAgICAgICBtIDogJ2JpciBkYWtpa2EnLFxuICAgICAgICAgICAgbW0gOiAnJWQgZGFraWthJyxcbiAgICAgICAgICAgIGggOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGggOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkIDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkIDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTSA6ICdiaXIgYXknLFxuICAgICAgICAgICAgTU0gOiAnJWQgYXknLFxuICAgICAgICAgICAgeSA6ICdiaXIgecSxbCcsXG4gICAgICAgICAgICB5eSA6ICclZCB5xLFsJ1xuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7ICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnXFwnxLFuY8SxJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYiA9IG51bWJlciAlIDEwMCAtIGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0cjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgLy8gQWZ0ZXIgdGhlIHllYXIgdGhlcmUgc2hvdWxkIGJlIGEgc2xhc2ggYW5kIHRoZSBhbW91bnQgb2YgeWVhcnMgc2luY2UgRGVjZW1iZXIgMjYsIDE5NzkgaW4gUm9tYW4gbnVtZXJhbHMuXG4gICAgLy8gVGhpcyBpcyBjdXJyZW50bHkgdG9vIGRpZmZpY3VsdCAobWF5YmUgZXZlbiBpbXBvc3NpYmxlKSB0byBhZGQuXG4gICAgdmFyIHR6bCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bCcsIHtcbiAgICAgICAgbW9udGhzIDogJ0phbnVhcl9GZXZyYWdsaF9NYXLDp19BdnLDr3VfTWFpX0fDvG5fSnVsaWFfR3VzY2h0X1NldGVtdmFyX0xpc3RvcMOkdHNfTm9lbXZhcl9aZWNlbXZhcicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnSmFuX0Zldl9NYXJfQXZyX01haV9Hw7xuX0p1bF9HdXNfU2V0X0xpc19Ob2VfWmVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTw7psYWRpX0zDum5lw6dpX01haXR6aV9Nw6FyY3VyaV9YaMO6YWRpX1Zpw6luZXLDp2lfU8OhdHVyaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICdTw7psX0zDum5fTWFpX03DoXJfWGjDul9WacOpX1PDoXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ1PDul9Mw7pfTWFfTcOhX1hoX1ZpX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISC5tbScsXG4gICAgICAgICAgICBMVFMgOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QuIE1NTU0gW2RhbGxhc10gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRC4gTU1NTSBbZGFsbGFzXSBZWVlZIEhILm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCwgW2xpXSBELiBNTU1NIFtkYWxsYXNdIFlZWVkgSEgubW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9kXFwnb3xkXFwnYS9pLFxuICAgICAgICBpc1BNIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2RcXCdvJyA9PT0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnZFxcJ28nIDogJ0RcXCdPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnZFxcJ2EnIDogJ0RcXCdBJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tveGhpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tkZW3DoCDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW2llaXJpIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbc8O8ciBlbF0gZGRkZCBbbGFzdGV1IMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnb3NwcmVpICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAnamElcycsXG4gICAgICAgICAgICBzIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaCA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkIDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU0gOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eSA6IHByb2Nlc3NSZWxhdGl2ZVRpbWVcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbCA6ICclZC4nLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAncyc6IFsndmllbnNhcyBzZWN1bmRzJywgJ1xcJ2llbnNhcyBzZWN1bmRzJ10sXG4gICAgICAgICAgICAnc3MnOiBbbnVtYmVyICsgJyBzZWN1bmRzJywgJycgKyBudW1iZXIgKyAnIHNlY3VuZHMnXSxcbiAgICAgICAgICAgICdtJzogWydcXCduIG3DrXV0JywgJ1xcJ2llbnMgbcOtdXQnXSxcbiAgICAgICAgICAgICdtbSc6IFtudW1iZXIgKyAnIG3DrXV0cycsICcnICsgbnVtYmVyICsgJyBtw611dHMnXSxcbiAgICAgICAgICAgICdoJzogWydcXCduIMO+b3JhJywgJ1xcJ2llbnNhIMO+b3JhJ10sXG4gICAgICAgICAgICAnaGgnOiBbbnVtYmVyICsgJyDDvm9yYXMnLCAnJyArIG51bWJlciArICcgw75vcmFzJ10sXG4gICAgICAgICAgICAnZCc6IFsnXFwnbiB6aXVhJywgJ1xcJ2llbnNhIHppdWEnXSxcbiAgICAgICAgICAgICdkZCc6IFtudW1iZXIgKyAnIHppdWFzJywgJycgKyBudW1iZXIgKyAnIHppdWFzJ10sXG4gICAgICAgICAgICAnTSc6IFsnXFwnbiBtZXMnLCAnXFwnaWVucyBtZXMnXSxcbiAgICAgICAgICAgICdNTSc6IFtudW1iZXIgKyAnIG1lc2VuJywgJycgKyBudW1iZXIgKyAnIG1lc2VuJ10sXG4gICAgICAgICAgICAneSc6IFsnXFwnbiBhcicsICdcXCdpZW5zIGFyJ10sXG4gICAgICAgICAgICAneXknOiBbbnVtYmVyICsgJyBhcnMnLCAnJyArIG51bWJlciArICcgYXJzJ11cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiAod2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0emw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB0em1MYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHptLWxhdG4nLCB7XG4gICAgICAgIG1vbnRocyA6ICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdpbm5heXJfYnLLpGF5csukX21hcsukc8ukX2licmlyX21heXl3X3l3bnl3X3l3bHl3el/Jo3fFoXRfxaF3dGFuYmlyX2t0y6R3YnLLpF9ud3dhbmJpcl9kd2puYmlyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYXNka2ggZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1thc2thIGddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1thc3NhbnQgZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdkYWRraCBzIHlhbiAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ3lhbiAlcycsXG4gICAgICAgICAgICBzIDogJ2ltaWsnLFxuICAgICAgICAgICAgc3MgOiAnJWQgaW1paycsXG4gICAgICAgICAgICBtIDogJ21pbnXhuI0nLFxuICAgICAgICAgICAgbW0gOiAnJWQgbWludeG4jScsXG4gICAgICAgICAgICBoIDogJ3NhyZthJyxcbiAgICAgICAgICAgIGhoIDogJyVkIHRhc3NhyZtpbicsXG4gICAgICAgICAgICBkIDogJ2FzcycsXG4gICAgICAgICAgICBkZCA6ICclZCBvc3NhbicsXG4gICAgICAgICAgICBNIDogJ2F5b3dyJyxcbiAgICAgICAgICAgIE1NIDogJyVkIGl5eWlybicsXG4gICAgICAgICAgICB5IDogJ2FzZ2FzJyxcbiAgICAgICAgICAgIHl5IDogJyVkIGlzZ2FzbidcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiAxMiAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR6bUxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB0em0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0em0nLCB7XG4gICAgICAgIG1vbnRocyA6ICfitYnitY/itY/itLDitaLitZRf4rSx4rWV4rSw4rWi4rWVX+K1juK0sOK1leK1ml/itYnitLHitZTitYnitZRf4rWO4rSw4rWi4rWi4rWTX+K1ouK1k+K1j+K1ouK1k1/itaLitZPitY3itaLitZPitaNf4rWW4rWT4rWb4rWcX+K1m+K1k+K1nOK0sOK1j+K0seK1ieK1lF/itL3itZ/itZPitLHitZVf4rWP4rWT4rWh4rSw4rWP4rSx4rWJ4rWUX+K0t+K1k+K1iuK1j+K0seK1ieK1lCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn4rWJ4rWP4rWP4rSw4rWi4rWUX+K0seK1leK0sOK1ouK1lV/itY7itLDitZXitZpf4rWJ4rSx4rWU4rWJ4rWUX+K1juK0sOK1ouK1ouK1k1/itaLitZPitY/itaLitZNf4rWi4rWT4rWN4rWi4rWT4rWjX+K1luK1k+K1m+K1nF/itZvitZPitZzitLDitY/itLHitYnitZRf4rS94rWf4rWT4rSx4rWVX+K1j+K1k+K1oeK0sOK1j+K0seK1ieK1lF/itLfitZPitYritY/itLHitYnitZQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfitLDitZnitLDitY7itLDitZlf4rSw4rWi4rWP4rSw4rWZX+K0sOK1meK1ieK1j+K0sOK1mV/itLDitL3itZTitLDitZlf4rSw4rS94rWh4rSw4rWZX+K0sOK1meK1ieK1juK1oeK0sOK1mV/itLDitZnitYnitLnitaLitLDitZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+K0sOK1meK0t+K1hSDitLRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4rSw4rWZ4rS94rSwIOK0tF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4rSw4rWa4rSw4rWP4rWcIOK0tF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ+K0t+K0sOK0t+K1hSDitZkg4rWi4rSw4rWPICVzJyxcbiAgICAgICAgICAgIHBhc3QgOiAn4rWi4rSw4rWPICVzJyxcbiAgICAgICAgICAgIHMgOiAn4rWJ4rWO4rWJ4rS9JyxcbiAgICAgICAgICAgIHNzIDogJyVkIOK1ieK1juK1ieK0vScsXG4gICAgICAgICAgICBtIDogJ+K1juK1ieK1j+K1k+K0uicsXG4gICAgICAgICAgICBtbSA6ICclZCDitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgaCA6ICfitZnitLDitYTitLAnLFxuICAgICAgICAgICAgaGggOiAnJWQg4rWc4rSw4rWZ4rWZ4rSw4rWE4rWJ4rWPJyxcbiAgICAgICAgICAgIGQgOiAn4rSw4rWZ4rWZJyxcbiAgICAgICAgICAgIGRkIDogJyVkIG/itZnitZnitLDitY8nLFxuICAgICAgICAgICAgTSA6ICfitLDitaJv4rWT4rWUJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOK1ieK1ouK1ouK1ieK1lOK1jycsXG4gICAgICAgICAgICB5IDogJ+K0sOK1meK0s+K0sOK1mScsXG4gICAgICAgICAgICB5eSA6ICclZCDitYnitZnitLPitLDitZnitY8nXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogMTIgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0em07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHVnQ24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1Zy1jbicsIHtcbiAgICAgICAgbW9udGhzOiAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2YrbldmD2LTbldmG2KjblV/Yr9uI2LTbldmG2KjblV/Ys9uV2YrYtNuV2YbYqNuVX9qG2KfYsdi025XZhtio25Vf2b7bldmK2LTbldmG2KjblV/YrNuI2YXblV/YtNuV2YbYqNuVJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2YrblV/Yr9uIX9iz25Vf2obYp1/ZvtuVX9is24hf2LTblScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfZituVX9iv24hf2LPblV/ahtinX9m+25Vf2KzbiF/YtNuVJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YknLFxuICAgICAgICAgICAgTExMOiAnWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2YrbkNix2YnZhSDZg9uQ2obblXzYs9uV2r7bldixfNqG24jYtNiq2YnZhiDYqNuH2LHbh9mGfNqG24jYtHzahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhnzZg9uV2oYvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfZituQ2LHZidmFINmD25DahtuVJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2LPbldq+25XYsScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9qG24jYtNiq2YnZhiDYqNuH2LHbh9mGJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn2obbiNi02KrZidmGINmD25DZitmJ2YYnIHx8IG1lcmlkaWVtID09PSAn2YPbldqGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mK25DYsdmJ2YUg2YPbkNqG25UnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LPbldq+25XYsSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINio24fYsduH2YYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi02KrZidmGINmD25DZitmJ2YYnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mD25Xahic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9io24jar9uI2YYg2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYptuV2KrblSDYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vZg9uQ2YTbldix2YPZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYqtuG2YbbiNqv24jZhl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb2KbYp9mE2K/ZidmG2YLZiV0gZGRkZCBb2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINmD25DZitmJ2YYnLFxuICAgICAgICAgICAgcGFzdDogJyVzINio24fYsduH2YYnLFxuICAgICAgICAgICAgczogJ9mG25XahtqG25Ug2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIG06ICfYqNmJ2LEg2YXZidmG24fYqicsXG4gICAgICAgICAgICBtbTogJyVkINmF2YnZhtuH2KonLFxuICAgICAgICAgICAgaDogJ9io2YnYsSDYs9in2KbbldiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9im25XYqicsXG4gICAgICAgICAgICBkOiAn2KjZidixINmD24jZhicsXG4gICAgICAgICAgICBkZDogJyVkINmD24jZhicsXG4gICAgICAgICAgICBNOiAn2KjZidixINim2KfZiicsXG4gICAgICAgICAgICBNTTogJyVkINim2KfZiicsXG4gICAgICAgICAgICB5OiAn2KjZidixINmK2YnZhCcsXG4gICAgICAgICAgICB5eTogJyVkINmK2YnZhCdcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oLdmD24jZhtmJfC3Yptin2Yp8Ldq+25XZvtiq25UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdmD24jZhtmJJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct2r7bldm+2KrblSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3IC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVnQ247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMSA/IGZvcm1zWzBdIDogKG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKSA/IGZvcm1zWzFdIDogZm9ybXNbMl0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICAnc3MnOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNC4X9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgICdtbSc6IHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LBf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyA6ICfRhdCy0LjQu9C40L3Rg1/RhdCy0LjQu9C40L3QuF/RhdCy0LjQu9C40L0nLFxuICAgICAgICAgICAgJ2hoJzogd2l0aG91dFN1ZmZpeCA/ICfQs9C+0LTQuNC90LBf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nIDogJ9Cz0L7QtNC40L3Rg1/Qs9C+0LTQuNC90Lhf0LPQvtC00LjQvScsXG4gICAgICAgICAgICAnZGQnOiAn0LTQtdC90Yxf0LTQvdGWX9C00L3RltCyJyxcbiAgICAgICAgICAgICdNTSc6ICfQvNGW0YHRj9GG0Yxf0LzRltGB0Y/RhtGWX9C80ZbRgdGP0YbRltCyJyxcbiAgICAgICAgICAgICd5eSc6ICfRgNGW0Lpf0YDQvtC60Lhf0YDQvtC60ZbQsidcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdCy0LjQu9C40L3QsCcgOiAn0YXQstC40LvQuNC90YMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQs9C+0LTQuNC90LAnIDogJ9Cz0L7QtNC40L3Rgyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c0Nhc2VSZXBsYWNlKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSB7XG4gICAgICAgICAgICAnbm9taW5hdGl2ZSc6ICfQvdC10LTRltC70Y9f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNCwX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRj1/RgdGD0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnYWNjdXNhdGl2ZSc6ICfQvdC10LTRltC70Y5f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNGDX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRjl/RgdGD0LHQvtGC0YMnLnNwbGl0KCdfJyksXG4gICAgICAgICAgICAnZ2VuaXRpdmUnOiAn0L3QtdC00ZbQu9GWX9C/0L7QvdC10LTRltC70LrQsF/QstGW0LLRgtC+0YDQutCwX9GB0LXRgNC10LTQuF/Rh9C10YLQstC10YDQs9CwX9C/4oCZ0Y/RgtC90LjRhtGWX9GB0YPQsdC+0YLQuCcuc3BsaXQoJ18nKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXS5zbGljZSgxLCA3KS5jb25jYXQod2Vla2RheXNbJ25vbWluYXRpdmUnXS5zbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub3VuQ2FzZSA9ICgvKFxcW1vQktCy0KPRg11cXF0pID9kZGRkLykudGVzdChmb3JtYXQpID9cbiAgICAgICAgICAgICdhY2N1c2F0aXZlJyA6XG4gICAgICAgICAgICAoKC9cXFs/KD860LzQuNC90YPQu9C+0Zd80L3QsNGB0YLRg9C/0L3QvtGXKT8gP1xcXSA/ZGRkZC8pLnRlc3QoZm9ybWF0KSA/XG4gICAgICAgICAgICAgICAgJ2dlbml0aXZlJyA6XG4gICAgICAgICAgICAgICAgJ25vbWluYXRpdmUnKTtcbiAgICAgICAgcmV0dXJuIHdlZWtkYXlzW25vdW5DYXNlXVttLmRheSgpXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyICsgJ9C+JyArICh0aGlzLmhvdXJzKCkgPT09IDExID8gJ9CxJyA6ICcnKSArICddIExUJztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgdWsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1aycsIHtcbiAgICAgICAgbW9udGhzIDoge1xuICAgICAgICAgICAgJ2Zvcm1hdCc6ICfRgdGW0YfQvdGPX9C70Y7RgtC+0LPQvl/QsdC10YDQtdC30L3Rj1/QutCy0ZbRgtC90Y9f0YLRgNCw0LLQvdGPX9GH0LXRgNCy0L3Rj1/Qu9C40L/QvdGPX9GB0LXRgNC/0L3Rj1/QstC10YDQtdGB0L3Rj1/QttC+0LLRgtC90Y9f0LvQuNGB0YLQvtC/0LDQtNCwX9Cz0YDRg9C00L3Rjycuc3BsaXQoJ18nKSxcbiAgICAgICAgICAgICdzdGFuZGFsb25lJzogJ9GB0ZbRh9C10L3RjF/Qu9GO0YLQuNC5X9Cx0LXRgNC10LfQtdC90Yxf0LrQstGW0YLQtdC90Yxf0YLRgNCw0LLQtdC90Yxf0YfQtdGA0LLQtdC90Yxf0LvQuNC/0LXQvdGMX9GB0LXRgNC/0LXQvdGMX9Cy0LXRgNC10YHQtdC90Yxf0LbQvtCy0YLQtdC90Yxf0LvQuNGB0YLQvtC/0LDQtF/Qs9GA0YPQtNC10L3RjCcuc3BsaXQoJ18nKVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA6ICfRgdGW0Ydf0LvRjtGCX9Cx0LXRgF/QutCy0ZbRgl/RgtGA0LDQsl/Rh9C10YDQsl/Qu9C40L9f0YHQtdGA0L9f0LLQtdGAX9C20L7QstGCX9C70LjRgdGCX9Cz0YDRg9C0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6IHdlZWtkYXlzQ2FzZVJlcGxhY2UsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZINGALicsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkg0YAuLCBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZINGALiwgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQodGM0L7Qs9C+0LTQvdGWICcpLFxuICAgICAgICAgICAgbmV4dERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQl9Cw0LLRgtGA0LAgJyksXG4gICAgICAgICAgICBsYXN0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CS0YfQvtGA0LAgJyksXG4gICAgICAgICAgICBuZXh0V2VlazogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQo10gZGRkZCBbJyksXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Rl10gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Cc0LjQvdGD0LvQvtCz0L5dIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdCA6ICclcyDRgtC+0LzRgycsXG4gICAgICAgICAgICBzIDogJ9C00LXQutGW0LvRjNC60LAg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzIDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW0gOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaCA6ICfQs9C+0LTQuNC90YMnLFxuICAgICAgICAgICAgaGggOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZCA6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZCA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNIDogJ9C80ZbRgdGP0YbRjCcsXG4gICAgICAgICAgICBNTSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5IDogJ9GA0ZbQuicsXG4gICAgICAgICAgICB5eSA6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gTS4gRS46IHRob3NlIHR3byBhcmUgdmlydHVhbGx5IHVudXNlZCBidXQgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IHRoZW0gZm9yIGhpcy9oZXIgd2Vic2l0ZSBmb3Igc29tZSByZWFzb25cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9GWfNGA0LDQvdC60YN80LTQvdGPfNCy0LXRh9C+0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQvtGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRlic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90LrRgyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQvtGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC5fNCz0L4pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC5JztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQvic7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdWs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICfYrNmG2YjYsduMJyxcbiAgICAgICAgJ9mB2LHZiNix24wnLFxuICAgICAgICAn2YXYp9ix2oYnLFxuICAgICAgICAn2KfZvtix24zZhCcsXG4gICAgICAgICfZhdim24wnLFxuICAgICAgICAn2KzZiNmGJyxcbiAgICAgICAgJ9is2YjZhNin2KbbjCcsXG4gICAgICAgICfYp9qv2LPYqicsXG4gICAgICAgICfYs9iq2YXYqNixJyxcbiAgICAgICAgJ9in2qnYqtmI2KjYsScsXG4gICAgICAgICfZhtmI2YXYqNixJyxcbiAgICAgICAgJ9iv2LPZhdio2LEnXG4gICAgXTtcbiAgICB2YXIgZGF5cyA9IFtcbiAgICAgICAgJ9in2KrZiNin2LEnLFxuICAgICAgICAn2b7bjNixJyxcbiAgICAgICAgJ9mF2Ybar9mEJyxcbiAgICAgICAgJ9io2K/avicsXG4gICAgICAgICfYrNmF2LnYsdin2KonLFxuICAgICAgICAn2KzZhdi524EnLFxuICAgICAgICAn24HZgdiq24EnXG4gICAgXTtcblxuICAgIHZhciB1ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3VyJywge1xuICAgICAgICBtb250aHMgOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0IDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5cyA6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbiA6IGRheXMsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEwgOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTCA6ICdkZGRk2IwgRCBNTU1NIFlZWVkgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Ytdio2K182LTYp9mFLyxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtdio2K0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnO1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9ii2Kwg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXkgOiAnW9qp2YQg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1var9iw2LTYqtuBINix2YjYsiDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW9qv2LDYtNiq24FdIGRkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXMg2KjYudivJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXMg2YLYqNmEJyxcbiAgICAgICAgICAgIHMgOiAn2obZhtivINiz24zaqdmG2ognLFxuICAgICAgICAgICAgc3MgOiAnJWQg2LPbjNqp2YbaiCcsXG4gICAgICAgICAgICBtIDogJ9in24zaqSDZhdmG2bknLFxuICAgICAgICAgICAgbW0gOiAnJWQg2YXZhtm5JyxcbiAgICAgICAgICAgIGggOiAn2KfbjNqpINqv2r7Zhtm524EnLFxuICAgICAgICAgICAgaGggOiAnJWQg2q/avtmG2bnbkicsXG4gICAgICAgICAgICBkIDogJ9in24zaqSDYr9mGJyxcbiAgICAgICAgICAgIGRkIDogJyVkINiv2YYnLFxuICAgICAgICAgICAgTSA6ICfYp9uM2qkg2YXYp9uBJyxcbiAgICAgICAgICAgIE1NIDogJyVkINmF2KfbgScsXG4gICAgICAgICAgICB5IDogJ9in24zaqSDYs9in2YQnLFxuICAgICAgICAgICAgeXkgOiAnJWQg2LPYp9mEJ1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdXpMYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXotbGF0bicsIHtcbiAgICAgICAgbW9udGhzIDogJ1lhbnZhcl9GZXZyYWxfTWFydF9BcHJlbF9NYXlfSXl1bl9JeXVsX0F2Z3VzdF9TZW50YWJyX09rdGFicl9Ob3lhYnJfRGVrYWJyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydCA6ICdZYW5fRmV2X01hcl9BcHJfTWF5X0l5dW5fSXl1bF9BdmdfU2VuX09rdF9Ob3lfRGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICdZYWtzaGFuYmFfRHVzaGFuYmFfU2VzaGFuYmFfQ2hvcnNoYW5iYV9QYXlzaGFuYmFfSnVtYV9TaGFuYmEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnWWFrX0R1c2hfU2VzaF9DaG9yX1BheV9KdW1fU2hhbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnWWFfRHVfU2VfQ2hvX1BhX0p1X1NoYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ0QgTU1NTSBZWVlZLCBkZGRkIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW0J1Z3VuIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbmV4dERheSA6ICdbRXJ0YWdhXSBMVCBbZGFdJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW2t1bmkgc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tLZWNoYSBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1tPXFwndGdhbl0gZGRkZCBba3VuaSBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICdZYXFpbiAlcyBpY2hpZGEnLFxuICAgICAgICAgICAgcGFzdCA6ICdCaXIgbmVjaGEgJXMgb2xkaW4nLFxuICAgICAgICAgICAgcyA6ICdzb25peWEnLFxuICAgICAgICAgICAgc3MgOiAnJWQgc29uaXlhJyxcbiAgICAgICAgICAgIG0gOiAnYmlyIGRhcWlxYScsXG4gICAgICAgICAgICBtbSA6ICclZCBkYXFpcWEnLFxuICAgICAgICAgICAgaCA6ICdiaXIgc29hdCcsXG4gICAgICAgICAgICBoaCA6ICclZCBzb2F0JyxcbiAgICAgICAgICAgIGQgOiAnYmlyIGt1bicsXG4gICAgICAgICAgICBkZCA6ICclZCBrdW4nLFxuICAgICAgICAgICAgTSA6ICdiaXIgb3knLFxuICAgICAgICAgICAgTU0gOiAnJWQgb3knLFxuICAgICAgICAgICAgeSA6ICdiaXIgeWlsJyxcbiAgICAgICAgICAgIHl5IDogJyVkIHlpbCdcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNyAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXpMYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgdXogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1eicsIHtcbiAgICAgICAgbW9udGhzIDogJ9GP0L3QstCw0YBf0YTQtdCy0YDQsNC7X9C80LDRgNGCX9Cw0L/RgNC10Ltf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGAX9C+0LrRgtGP0LHRgF/QvdC+0Y/QsdGAX9C00LXQutCw0LHRgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ9Cv0LrRiNCw0L3QsdCwX9CU0YPRiNCw0L3QsdCwX9Ch0LXRiNCw0L3QsdCwX9Cn0L7RgNGI0LDQvdCx0LBf0J/QsNC50YjQsNC90LHQsF/QltGD0LzQsF/QqNCw0L3QsdCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ9Cv0LrRiF/QlNGD0Yhf0KHQtdGIX9Cn0L7RgF/Qn9Cw0Llf0JbRg9C8X9Co0LDQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAn0K/Qul/QlNGDX9Ch0LVf0KfQvl/Qn9CwX9CW0YNf0KjQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ0QgTU1NTSBZWVlZLCBkZGRkIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW9CR0YPQs9GD0L0g0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vQrdGA0YLQsNCz0LBdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvQutGD0L3QuCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW9Ca0LXRh9CwINGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdFdlZWsgOiAnW9Cj0YLQs9Cw0L1dIGRkZGQgW9C60YPQvdC4INGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgc2FtZUVsc2UgOiAnTCdcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJ9Cv0LrQuNC9ICVzINC40YfQuNC00LAnLFxuICAgICAgICAgICAgcGFzdCA6ICfQkdC40YAg0L3QtdGH0LAgJXMg0L7Qu9C00LjQvScsXG4gICAgICAgICAgICBzIDogJ9GE0YPRgNGB0LDRgicsXG4gICAgICAgICAgICBzcyA6ICclZCDRhNGD0YDRgdCw0YInLFxuICAgICAgICAgICAgbSA6ICfQsdC40YAg0LTQsNC60LjQutCwJyxcbiAgICAgICAgICAgIG1tIDogJyVkINC00LDQutC40LrQsCcsXG4gICAgICAgICAgICBoIDogJ9Cx0LjRgCDRgdC+0LDRgicsXG4gICAgICAgICAgICBoaCA6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkIDogJ9Cx0LjRgCDQutGD0L0nLFxuICAgICAgICAgICAgZGQgOiAnJWQg0LrRg9C9JyxcbiAgICAgICAgICAgIE0gOiAn0LHQuNGAINC+0LknLFxuICAgICAgICAgICAgTU0gOiAnJWQg0L7QuScsXG4gICAgICAgICAgICB5IDogJ9Cx0LjRgCDQudC40LsnLFxuICAgICAgICAgICAgeXkgOiAnJWQg0LnQuNC7J1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA3ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB1ejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIHZpID0gbW9tZW50LmRlZmluZUxvY2FsZSgndmknLCB7XG4gICAgICAgIG1vbnRocyA6ICd0aMOhbmcgMV90aMOhbmcgMl90aMOhbmcgM190aMOhbmcgNF90aMOhbmcgNV90aMOhbmcgNl90aMOhbmcgN190aMOhbmcgOF90aMOhbmcgOV90aMOhbmcgMTBfdGjDoW5nIDExX3Row6FuZyAxMicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnVGgwMV9UaDAyX1RoMDNfVGgwNF9UaDA1X1RoMDZfVGgwN19UaDA4X1RoMDlfVGgxMF9UaDExX1RoMTInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdjaOG7pyBuaOG6rXRfdGjhu6kgaGFpX3Ro4bupIGJhX3Ro4bupIHTGsF90aOG7qSBuxINtX3Ro4bupIHPDoXVfdGjhu6kgYuG6o3knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAnQ05fVDJfVDNfVDRfVDVfVDZfVDcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ0NOX1QyX1QzX1Q0X1Q1X1Q2X1Q3Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvc2F8Y2gvaSxcbiAgICAgICAgaXNQTSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eY2gkL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtIDogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3NhJyA6ICdTQSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2NoJyA6ICdDSCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTCA6ICdEIE1NTU0gW27Eg21dIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsIDogJ0REL00vWVlZWScsXG4gICAgICAgICAgICBsbCA6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbCA6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnZGRkLCBEIE1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSMO0bSBuYXkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tOZ8OgeSBtYWkgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt0deG6p24gdOG7m2kgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIw7RtIHF1YSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3R14bqnbiBy4buTaSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclcyB04bubaScsXG4gICAgICAgICAgICBwYXN0IDogJyVzIHRyxrDhu5tjJyxcbiAgICAgICAgICAgIHMgOiAndsOgaSBnacOieScsXG4gICAgICAgICAgICBzcyA6ICclZCBnacOieScgLFxuICAgICAgICAgICAgbSA6ICdt4buZdCBwaMO6dCcsXG4gICAgICAgICAgICBtbSA6ICclZCBwaMO6dCcsXG4gICAgICAgICAgICBoIDogJ23hu5l0IGdp4budJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGdp4budJyxcbiAgICAgICAgICAgIGQgOiAnbeG7mXQgbmfDoHknLFxuICAgICAgICAgICAgZGQgOiAnJWQgbmfDoHknLFxuICAgICAgICAgICAgTSA6ICdt4buZdCB0aMOhbmcnLFxuICAgICAgICAgICAgTU0gOiAnJWQgdGjDoW5nJyxcbiAgICAgICAgICAgIHkgOiAnbeG7mXQgbsSDbScsXG4gICAgICAgICAgICB5eSA6ICclZCBuxINtJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2VlayA6IHtcbiAgICAgICAgICAgIGRvdyA6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95IDogNCAgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB4UHNldWRvID0gbW9tZW50LmRlZmluZUxvY2FsZSgneC1wc2V1ZG8nLCB7XG4gICAgICAgIG1vbnRocyA6ICdKfsOhw7HDusOhfnLDvV9GfsOpYnLDun7DoXLDvV9+TcOhcmN+aF/DgXB+csOtbF9+TcOhw71ffkrDusOxw6l+X0rDumx+w71fw4HDun5nw7pzdH5fU8OpcH50w6ltYn7DqXJfw5N+Y3TDs2J+w6lyX8ORfsOzdsOpbX5iw6lyX35Ew6ljw6l+bWLDqXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ0p+w6HDsV9+RsOpYl9+TcOhcl9+w4Fwcl9+TcOhw71ffkrDusOxX35Kw7psX37DgcO6Z19+U8OpcF9+w5NjdF9+w5HDs3ZffkTDqWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICB3ZWVrZGF5cyA6ICdTfsO6w7Fkw6F+w71fTcOzfsOxZMOhw71+X1TDusOpfnNkw6HDvX5fV8OpZH7DscOpc2R+w6HDvV9UfmjDunJzfmTDocO9X35GcsOtZH7DocO9X1N+w6F0w7pyfmTDocO9Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ1N+w7rDsV9+TcOzw7FfflTDusOpX35Xw6lkX35UaMO6X35GcsOtX35Tw6F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICdTfsO6X03Ds35fVMO6X35Xw6lfVH5oX0Zyfl9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdCA6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTCA6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMIDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTCA6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJ1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW1R+w7Nkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tUfsOzbcOzfnJyw7N+dyDDoXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW8OhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdbw51+w6lzdH7DqXJkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdbTH7DoXN0XSBkZGRkIFvDoXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICfDrX7DsSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIMOhfmfDsycsXG4gICAgICAgICAgICBzIDogJ8OhIH5mw6l3IH5zw6ljw7N+w7FkcycsXG4gICAgICAgICAgICBzcyA6ICclZCBzfsOpY8Ozw7F+ZHMnLFxuICAgICAgICAgICAgbSA6ICfDoSB+bcOtw7F+w7p0w6knLFxuICAgICAgICAgICAgbW0gOiAnJWQgbX7DrcOxw7p+dMOpcycsXG4gICAgICAgICAgICBoIDogJ8OhfsOxIGjDs37DunInLFxuICAgICAgICAgICAgaGggOiAnJWQgaH7Ds8O6cnMnLFxuICAgICAgICAgICAgZCA6ICfDoSB+ZMOhw70nLFxuICAgICAgICAgICAgZGQgOiAnJWQgZH7DocO9cycsXG4gICAgICAgICAgICBNIDogJ8OhIH5tw7PDsX50aCcsXG4gICAgICAgICAgICBNTSA6ICclZCBtfsOzw7F0fmhzJyxcbiAgICAgICAgICAgIHkgOiAnw6EgfsO9w6nDoXInLFxuICAgICAgICAgICAgeXkgOiAnJWQgw71+w6nDoXJzJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKH5+KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMSkgPyAnc3QnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMikgPyAnbmQnIDpcbiAgICAgICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWsgOiB7XG4gICAgICAgICAgICBkb3cgOiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveSA6IDQgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhQc2V1ZG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB5byA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3lvJywge1xuICAgICAgICBtb250aHMgOiAnU+G6ucyBcuG6ucyBX0XMgHJlzIBsZcyAX+G6uHLhurnMgG5hzIBfScyAZ2JlzIFfRcyAYmliaV9PzIBrdcyAZHVfQWfhurltb19PzIBndcyBbl9Pd2V3ZV/hu4zMgHdhzIByYcyAX0JlzIFsdcyBX+G7jMyAcOG6ucyAzIAnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ1PhurnMgXJfRcyAcmxf4bq4cm5fScyAZ2JfRcyAYmlfT8yAa3XMgF9BZ+G6uV9PzIBndcyBX093ZV/hu4zMgHdhzIBfQmXMgWxf4buMzIBw4bq5zIDMgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXMgOiAnQcyAacyAa3XMgV9BamXMgV9JzIBz4bq5zIFndW5f4buMauG7jcyBcnXMgV/hu4xq4buNzIFi4buNX+G6uHRpzIBfQcyAYmHMgW3hurnMgXRhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ0HMgGnMgGtfQWplzIFfScyAc+G6ucyBX+G7jGpyX+G7jGpiX+G6uHRpzIBfQcyAYmHMgScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW4gOiAnQcyAacyAX0FqX0nMgHNf4buMcl/hu4xiX+G6uHRfQcyAYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTIDogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMIDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tPzIBuacyAIG5pXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vhu4zMgGxhIG5pXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlayA6ICdkZGRkIFvhu4xz4bq5zIAgdG/MgW5cXCdi4buNXSBbbmldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXkgOiAnW0HMgG5hIG5pXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFvhu4xz4bq5zIAgdG/MgWzhu43MgV0gW25pXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnbmnMgSAlcycsXG4gICAgICAgICAgICBwYXN0IDogJyVzIGvhu41qYcyBJyxcbiAgICAgICAgICAgIHMgOiAnacyAc+G6uWp1zIEgYWF5YcyBIGRpZScsXG4gICAgICAgICAgICBzcyA6J2FheWHMgSAlZCcsXG4gICAgICAgICAgICBtIDogJ2nMgHPhurlqdcyBIGthbicsXG4gICAgICAgICAgICBtbSA6ICdpzIBz4bq5anXMgSAlZCcsXG4gICAgICAgICAgICBoIDogJ3dhzIFrYXRpIGthbicsXG4gICAgICAgICAgICBoaCA6ICd3YcyBa2F0aSAlZCcsXG4gICAgICAgICAgICBkIDogJ+G7jWrhu43MgSBrYW4nLFxuICAgICAgICAgICAgZGQgOiAn4buNauG7jcyBICVkJyxcbiAgICAgICAgICAgIE0gOiAnb3N1zIAga2FuJyxcbiAgICAgICAgICAgIE1NIDogJ29zdcyAICVkJyxcbiAgICAgICAgICAgIHkgOiAn4buNZHXMgW4ga2FuJyxcbiAgICAgICAgICAgIHl5IDogJ+G7jWR1zIFuICVkJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlIDogL+G7jWrhu43MgVxcc1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbCA6ICfhu41q4buNzIEgJWQnLFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0IC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHlvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgemhDbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLWNuJywge1xuICAgICAgICBtb250aHMgOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn5ZGo5pelX+WRqOS4gF/lkajkuoxf5ZGo5LiJX+WRqOWbm1/lkajkupRf5ZGo5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTCA6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMIDogJ1lZWVnlubRN5pyIROaXpUFo54K5bW3liIYnLFxuICAgICAgICAgICAgTExMTCA6ICdZWVlZ5bm0TeaciETml6VkZGRkQWjngrltbeWIhicsXG4gICAgICAgICAgICBsIDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsIDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGwgOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn5YeM5pmoJyB8fCBtZXJpZGllbSA9PT0gJ+aXqeS4iicgfHxcbiAgICAgICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfkuIrljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAn5Lit5Y2IJ1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vmmI7lpKldTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW+S4i11kZGRkTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vkuIpdZGRkZExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOWRqCkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+WRqCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lIDoge1xuICAgICAgICAgICAgZnV0dXJlIDogJyVz5YaFJyxcbiAgICAgICAgICAgIHBhc3QgOiAnJXPliY0nLFxuICAgICAgICAgICAgcyA6ICflh6Dnp5InLFxuICAgICAgICAgICAgc3MgOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG0gOiAnMSDliIbpkp8nLFxuICAgICAgICAgICAgbW0gOiAnJWQg5YiG6ZKfJyxcbiAgICAgICAgICAgIGggOiAnMSDlsI/ml7YnLFxuICAgICAgICAgICAgaGggOiAnJWQg5bCP5pe2JyxcbiAgICAgICAgICAgIGQgOiAnMSDlpKknLFxuICAgICAgICAgICAgZGQgOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIE0gOiAnMSDkuKrmnIgnLFxuICAgICAgICAgICAgTU0gOiAnJWQg5Liq5pyIJyxcbiAgICAgICAgICAgIHkgOiAnMSDlubQnLFxuICAgICAgICAgICAgeXkgOiAnJWQg5bm0J1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgLy8gR0IvVCA3NDA4LTE5OTTjgIrmlbDmja7lhYPlkozkuqTmjaLmoLzlvI/Ct+S/oeaBr+S6pOaNosK35pel5pyf5ZKM5pe26Ze06KGo56S65rOV44CL5LiOSVNPIDg2MDE6MTk4OOetieaViFxuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB6aENuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG5cbiAgICB2YXIgemhIayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLWhrJywge1xuICAgICAgICBtb250aHMgOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5cyA6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgOiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbiA6ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0IDoge1xuICAgICAgICAgICAgTFQgOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTIDogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEwgOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTCA6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMIDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBMTExMIDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbCA6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbCA6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgbGxsIDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsIDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91ciA6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW0gOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhciA6IHtcbiAgICAgICAgICAgIHNhbWVEYXkgOiAnW+S7iuWkqV1MVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vmmI7lpKldTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWsgOiAnW+S4i11kZGRkTFQnLFxuICAgICAgICAgICAgbGFzdERheSA6ICdb5pio5aSpXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vkuIpdZGRkZExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlIDogJ0wnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOmAsSkvLFxuICAgICAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnIDpcbiAgICAgICAgICAgICAgICBjYXNlICdEJyA6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJyA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJyA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pyIJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JyA6XG4gICAgICAgICAgICAgICAgY2FzZSAnVycgOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZSA6IHtcbiAgICAgICAgICAgIGZ1dHVyZSA6ICclc+WFpycsXG4gICAgICAgICAgICBwYXN0IDogJyVz5YmNJyxcbiAgICAgICAgICAgIHMgOiAn5bm+56eSJyxcbiAgICAgICAgICAgIHNzIDogJyVkIOenkicsXG4gICAgICAgICAgICBtIDogJzEg5YiG6ZCYJyxcbiAgICAgICAgICAgIG1tIDogJyVkIOWIhumQmCcsXG4gICAgICAgICAgICBoIDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoIDogJyVkIOWwj+aZgicsXG4gICAgICAgICAgICBkIDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkIDogJyVkIOWkqScsXG4gICAgICAgICAgICBNIDogJzEg5YCL5pyIJyxcbiAgICAgICAgICAgIE1NIDogJyVkIOWAi+aciCcsXG4gICAgICAgICAgICB5IDogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5IDogJyVkIOW5tCdcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoSGs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cblxuICAgIHZhciB6aFR3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtdHcnLCB7XG4gICAgICAgIG1vbnRocyA6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQgOiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzIDogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA6ICfpgLHml6Vf6YCx5LiAX+mAseS6jF/pgLHkuIlf6YCx5ZubX+mAseS6lF/pgLHlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQgOiB7XG4gICAgICAgICAgICBMVCA6ICdISDptbScsXG4gICAgICAgICAgICBMVFMgOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTCA6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMIDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEwgOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgICAgICBsIDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsIDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGwgOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGwgOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WHjOaZqHzml6nkuIp85LiK5Y2IfOS4reWNiHzkuIvljYh85pma5LiKLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyIDogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4reWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbSA6IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyIDoge1xuICAgICAgICAgICAgc2FtZURheSA6ICdb5LuK5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ1vkuItdZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1vmmKjlpKldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrIDogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJyA6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCcgOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCcgOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aXpSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTScgOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndycgOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnIDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfpgLEnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnJXPlhacnLFxuICAgICAgICAgICAgcGFzdCA6ICclc+WJjScsXG4gICAgICAgICAgICBzIDogJ+W5vuenkicsXG4gICAgICAgICAgICBzcyA6ICclZCDnp5InLFxuICAgICAgICAgICAgbSA6ICcxIOWIhumQmCcsXG4gICAgICAgICAgICBtbSA6ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaCA6ICcxIOWwj+aZgicsXG4gICAgICAgICAgICBoaCA6ICclZCDlsI/mmYInLFxuICAgICAgICAgICAgZCA6ICcxIOWkqScsXG4gICAgICAgICAgICBkZCA6ICclZCDlpKknLFxuICAgICAgICAgICAgTSA6ICcxIOWAi+aciCcsXG4gICAgICAgICAgICBNTSA6ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeSA6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eSA6ICclZCDlubQnXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB6aFR3O1xuXG59KSkpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2FmXCI6IDkwMTM3LFxuXHRcIi4vYWYuanNcIjogOTAxMzcsXG5cdFwiLi9hclwiOiA3NTM3OCxcblx0XCIuL2FyLWR6XCI6IDg4NDY0LFxuXHRcIi4vYXItZHouanNcIjogODg0NjQsXG5cdFwiLi9hci1rd1wiOiAyMjQ3Nyxcblx0XCIuL2FyLWt3LmpzXCI6IDIyNDc3LFxuXHRcIi4vYXItbHlcIjogNzk1MDAsXG5cdFwiLi9hci1seS5qc1wiOiA3OTUwMCxcblx0XCIuL2FyLW1hXCI6IDQ5NTQ4LFxuXHRcIi4vYXItbWEuanNcIjogNDk1NDgsXG5cdFwiLi9hci1zYVwiOiA0NTQ2Myxcblx0XCIuL2FyLXNhLmpzXCI6IDQ1NDYzLFxuXHRcIi4vYXItdG5cIjogMzkwNjYsXG5cdFwiLi9hci10bi5qc1wiOiAzOTA2Nixcblx0XCIuL2FyLmpzXCI6IDc1Mzc4LFxuXHRcIi4vYXpcIjogNTE2MzYsXG5cdFwiLi9hei5qc1wiOiA1MTYzNixcblx0XCIuL2JlXCI6IDM5NjA5LFxuXHRcIi4vYmUuanNcIjogMzk2MDksXG5cdFwiLi9iZ1wiOiA2MzA2OSxcblx0XCIuL2JnLmpzXCI6IDYzMDY5LFxuXHRcIi4vYm1cIjogMzU1NTQsXG5cdFwiLi9ibS5qc1wiOiAzNTU1NCxcblx0XCIuL2JuXCI6IDc1MjIxLFxuXHRcIi4vYm4uanNcIjogNzUyMjEsXG5cdFwiLi9ib1wiOiAyOTgzMixcblx0XCIuL2JvLmpzXCI6IDI5ODMyLFxuXHRcIi4vYnJcIjogNjg2ODUsXG5cdFwiLi9ici5qc1wiOiA2ODY4NSxcblx0XCIuL2JzXCI6IDEzMjIsXG5cdFwiLi9icy5qc1wiOiAxMzIyLFxuXHRcIi4vY2FcIjogMjEwODEsXG5cdFwiLi9jYS5qc1wiOiAyMTA4MSxcblx0XCIuL2NzXCI6IDc4OTk4LFxuXHRcIi4vY3MuanNcIjogNzg5OTgsXG5cdFwiLi9jdlwiOiA2MDQ5NCxcblx0XCIuL2N2LmpzXCI6IDYwNDk0LFxuXHRcIi4vY3lcIjogNjYwMzUsXG5cdFwiLi9jeS5qc1wiOiA2NjAzNSxcblx0XCIuL2RhXCI6IDI2MDM2LFxuXHRcIi4vZGEuanNcIjogMjYwMzYsXG5cdFwiLi9kZVwiOiAxMzAzOSxcblx0XCIuL2RlLWF0XCI6IDU3NDUsXG5cdFwiLi9kZS1hdC5qc1wiOiA1NzQ1LFxuXHRcIi4vZGUtY2hcIjogODkwNjEsXG5cdFwiLi9kZS1jaC5qc1wiOiA4OTA2MSxcblx0XCIuL2RlLmpzXCI6IDEzMDM5LFxuXHRcIi4vZHZcIjogNTcwMzYsXG5cdFwiLi9kdi5qc1wiOiA1NzAzNixcblx0XCIuL2VsXCI6IDU1NTUzLFxuXHRcIi4vZWwuanNcIjogNTU1NTMsXG5cdFwiLi9lbi1TR1wiOiA4NTE5Mixcblx0XCIuL2VuLVNHLmpzXCI6IDg1MTkyLFxuXHRcIi4vZW4tYXVcIjogODY2OTUsXG5cdFwiLi9lbi1hdS5qc1wiOiA4NjY5NSxcblx0XCIuL2VuLWNhXCI6IDI0NDkxLFxuXHRcIi4vZW4tY2EuanNcIjogMjQ0OTEsXG5cdFwiLi9lbi1nYlwiOiAzMTcyNCxcblx0XCIuL2VuLWdiLmpzXCI6IDMxNzI0LFxuXHRcIi4vZW4taWVcIjogMjg3OTAsXG5cdFwiLi9lbi1pZS5qc1wiOiAyODc5MCxcblx0XCIuL2VuLWlsXCI6IDE0MTY2LFxuXHRcIi4vZW4taWwuanNcIjogMTQxNjYsXG5cdFwiLi9lbi1uelwiOiA5Njk3MCxcblx0XCIuL2VuLW56LmpzXCI6IDk2OTcwLFxuXHRcIi4vZW9cIjogMTgwNzYsXG5cdFwiLi9lby5qc1wiOiAxODA3Nixcblx0XCIuL2VzXCI6IDI3Nzc3LFxuXHRcIi4vZXMtZG9cIjogMjQ5MDIsXG5cdFwiLi9lcy1kby5qc1wiOiAyNDkwMixcblx0XCIuL2VzLXVzXCI6IDkyOTA1LFxuXHRcIi4vZXMtdXMuanNcIjogOTI5MDUsXG5cdFwiLi9lcy5qc1wiOiAyNzc3Nyxcblx0XCIuL2V0XCI6IDI1MzA5LFxuXHRcIi4vZXQuanNcIjogMjUzMDksXG5cdFwiLi9ldVwiOiAzNjM1NCxcblx0XCIuL2V1LmpzXCI6IDM2MzU0LFxuXHRcIi4vZmFcIjogMjg1MDcsXG5cdFwiLi9mYS5qc1wiOiAyODUwNyxcblx0XCIuL2ZpXCI6IDc1NjkxLFxuXHRcIi4vZmkuanNcIjogNzU2OTEsXG5cdFwiLi9mb1wiOiA0ODE1NSxcblx0XCIuL2ZvLmpzXCI6IDQ4MTU1LFxuXHRcIi4vZnJcIjogODM2NzEsXG5cdFwiLi9mci1jYVwiOiA5Mzc3Myxcblx0XCIuL2ZyLWNhLmpzXCI6IDkzNzczLFxuXHRcIi4vZnItY2hcIjogMjEzMzMsXG5cdFwiLi9mci1jaC5qc1wiOiAyMTMzMyxcblx0XCIuL2ZyLmpzXCI6IDgzNjcxLFxuXHRcIi4vZnlcIjogNDQ3MzEsXG5cdFwiLi9meS5qc1wiOiA0NDczMSxcblx0XCIuL2dhXCI6IDQ3Mzg5LFxuXHRcIi4vZ2EuanNcIjogNDczODksXG5cdFwiLi9nZFwiOiAxMDAwMixcblx0XCIuL2dkLmpzXCI6IDEwMDAyLFxuXHRcIi4vZ2xcIjogOTE4MTIsXG5cdFwiLi9nbC5qc1wiOiA5MTgxMixcblx0XCIuL2dvbS1sYXRuXCI6IDg5NTgsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiA4OTU4LFxuXHRcIi4vZ3VcIjogODAyOTUsXG5cdFwiLi9ndS5qc1wiOiA4MDI5NSxcblx0XCIuL2hlXCI6IDQ4NzY3LFxuXHRcIi4vaGUuanNcIjogNDg3NjcsXG5cdFwiLi9oaVwiOiA5NTU0Myxcblx0XCIuL2hpLmpzXCI6IDk1NTQzLFxuXHRcIi4vaHJcIjogMjQ3MDYsXG5cdFwiLi9oci5qc1wiOiAyNDcwNixcblx0XCIuL2h1XCI6IDcyMTc3LFxuXHRcIi4vaHUuanNcIjogNzIxNzcsXG5cdFwiLi9oeS1hbVwiOiA1NDc0OCxcblx0XCIuL2h5LWFtLmpzXCI6IDU0NzQ4LFxuXHRcIi4vaWRcIjogNTg3MTMsXG5cdFwiLi9pZC5qc1wiOiA1ODcxMyxcblx0XCIuL2lzXCI6IDk0MzM2LFxuXHRcIi4vaXMuanNcIjogOTQzMzYsXG5cdFwiLi9pdFwiOiA0ODMyOCxcblx0XCIuL2l0LWNoXCI6IDE4NTYyLFxuXHRcIi4vaXQtY2guanNcIjogMTg1NjIsXG5cdFwiLi9pdC5qc1wiOiA0ODMyOCxcblx0XCIuL2phXCI6IDMxNTYwLFxuXHRcIi4vamEuanNcIjogMzE1NjAsXG5cdFwiLi9qdlwiOiAzNDQwNCxcblx0XCIuL2p2LmpzXCI6IDM0NDA0LFxuXHRcIi4va2FcIjogNzU5ODksXG5cdFwiLi9rYS5qc1wiOiA3NTk4OSxcblx0XCIuL2trXCI6IDIwNzQ3LFxuXHRcIi4va2suanNcIjogMjA3NDcsXG5cdFwiLi9rbVwiOiAyMTg2OCxcblx0XCIuL2ttLmpzXCI6IDIxODY4LFxuXHRcIi4va25cIjogOTQ5OTcsXG5cdFwiLi9rbi5qc1wiOiA5NDk5Nyxcblx0XCIuL2tvXCI6IDg5MTU0LFxuXHRcIi4va28uanNcIjogODkxNTQsXG5cdFwiLi9rdVwiOiA0ODIyMCxcblx0XCIuL2t1LmpzXCI6IDQ4MjIwLFxuXHRcIi4va3lcIjogNzM2NjUsXG5cdFwiLi9reS5qc1wiOiA3MzY2NSxcblx0XCIuL2xiXCI6IDUzNTgsXG5cdFwiLi9sYi5qc1wiOiA1MzU4LFxuXHRcIi4vbG9cIjogNTA0Nyxcblx0XCIuL2xvLmpzXCI6IDUwNDcsXG5cdFwiLi9sdFwiOiA2MzU3Mixcblx0XCIuL2x0LmpzXCI6IDYzNTcyLFxuXHRcIi4vbHZcIjogMzY2MzgsXG5cdFwiLi9sdi5qc1wiOiAzNjYzOCxcblx0XCIuL21lXCI6IDE5OTc4LFxuXHRcIi4vbWUuanNcIjogMTk5NzgsXG5cdFwiLi9taVwiOiAxNzQ3Mixcblx0XCIuL21pLmpzXCI6IDE3NDcyLFxuXHRcIi4vbWtcIjogNjA5NjgsXG5cdFwiLi9tay5qc1wiOiA2MDk2OCxcblx0XCIuL21sXCI6IDUzMTI2LFxuXHRcIi4vbWwuanNcIjogNTMxMjYsXG5cdFwiLi9tblwiOiA3NDI3Nyxcblx0XCIuL21uLmpzXCI6IDc0Mjc3LFxuXHRcIi4vbXJcIjogMjYwNzgsXG5cdFwiLi9tci5qc1wiOiAyNjA3OCxcblx0XCIuL21zXCI6IDUyMzY0LFxuXHRcIi4vbXMtbXlcIjogMzAxNDEsXG5cdFwiLi9tcy1teS5qc1wiOiAzMDE0MSxcblx0XCIuL21zLmpzXCI6IDUyMzY0LFxuXHRcIi4vbXRcIjogOTI5MTQsXG5cdFwiLi9tdC5qc1wiOiA5MjkxNCxcblx0XCIuL215XCI6IDE1MzM0LFxuXHRcIi4vbXkuanNcIjogMTUzMzQsXG5cdFwiLi9uYlwiOiA5MzQxNyxcblx0XCIuL25iLmpzXCI6IDkzNDE3LFxuXHRcIi4vbmVcIjogNjk0NTksXG5cdFwiLi9uZS5qc1wiOiA2OTQ1OSxcblx0XCIuL25sXCI6IDgyMDU0LFxuXHRcIi4vbmwtYmVcIjogMjIzNzQsXG5cdFwiLi9ubC1iZS5qc1wiOiAyMjM3NCxcblx0XCIuL25sLmpzXCI6IDgyMDU0LFxuXHRcIi4vbm5cIjogMzQyOTUsXG5cdFwiLi9ubi5qc1wiOiAzNDI5NSxcblx0XCIuL3BhLWluXCI6IDI5MDc0LFxuXHRcIi4vcGEtaW4uanNcIjogMjkwNzQsXG5cdFwiLi9wbFwiOiAxNTk2Myxcblx0XCIuL3BsLmpzXCI6IDE1OTYzLFxuXHRcIi4vcHRcIjogMzcyNTksXG5cdFwiLi9wdC1iclwiOiA2MzM0NCxcblx0XCIuL3B0LWJyLmpzXCI6IDYzMzQ0LFxuXHRcIi4vcHQuanNcIjogMzcyNTksXG5cdFwiLi9yb1wiOiAxMTQ1MSxcblx0XCIuL3JvLmpzXCI6IDExNDUxLFxuXHRcIi4vcnVcIjogOTM2MTIsXG5cdFwiLi9ydS5qc1wiOiA5MzYxMixcblx0XCIuL3NkXCI6IDY3OTU4LFxuXHRcIi4vc2QuanNcIjogNjc5NTgsXG5cdFwiLi9zZVwiOiAxNzY1Mixcblx0XCIuL3NlLmpzXCI6IDE3NjUyLFxuXHRcIi4vc2lcIjogMTAzMTQsXG5cdFwiLi9zaS5qc1wiOiAxMDMxNCxcblx0XCIuL3NrXCI6IDU1Mzg2LFxuXHRcIi4vc2suanNcIjogNTUzODYsXG5cdFwiLi9zbFwiOiA0ODczOCxcblx0XCIuL3NsLmpzXCI6IDQ4NzM4LFxuXHRcIi4vc3FcIjogNTMzNDMsXG5cdFwiLi9zcS5qc1wiOiA1MzM0Myxcblx0XCIuL3NyXCI6IDE5NTgzLFxuXHRcIi4vc3ItY3lybFwiOiA4NTc4NCxcblx0XCIuL3NyLWN5cmwuanNcIjogODU3ODQsXG5cdFwiLi9zci5qc1wiOiAxOTU4Myxcblx0XCIuL3NzXCI6IDk1MTQ4LFxuXHRcIi4vc3MuanNcIjogOTUxNDgsXG5cdFwiLi9zdlwiOiAxNjA5LFxuXHRcIi4vc3YuanNcIjogMTYwOSxcblx0XCIuL3N3XCI6IDE4Nzg1LFxuXHRcIi4vc3cuanNcIjogMTg3ODUsXG5cdFwiLi90YVwiOiA5MDAyNSxcblx0XCIuL3RhLmpzXCI6IDkwMDI1LFxuXHRcIi4vdGVcIjogMTYyMjgsXG5cdFwiLi90ZS5qc1wiOiAxNjIyOCxcblx0XCIuL3RldFwiOiAyNjEzNixcblx0XCIuL3RldC5qc1wiOiAyNjEzNixcblx0XCIuL3RnXCI6IDE2MTQsXG5cdFwiLi90Zy5qc1wiOiAxNjE0LFxuXHRcIi4vdGhcIjogMTgzOCxcblx0XCIuL3RoLmpzXCI6IDE4MzgsXG5cdFwiLi90bC1waFwiOiAzOTk2NCxcblx0XCIuL3RsLXBoLmpzXCI6IDM5OTY0LFxuXHRcIi4vdGxoXCI6IDc3NTYxLFxuXHRcIi4vdGxoLmpzXCI6IDc3NTYxLFxuXHRcIi4vdHJcIjogMjgzNjcsXG5cdFwiLi90ci5qc1wiOiAyODM2Nyxcblx0XCIuL3R6bFwiOiA3NDAwMSxcblx0XCIuL3R6bC5qc1wiOiA3NDAwMSxcblx0XCIuL3R6bVwiOiA2NzUxOSxcblx0XCIuL3R6bS1sYXRuXCI6IDE5MTgzLFxuXHRcIi4vdHptLWxhdG4uanNcIjogMTkxODMsXG5cdFwiLi90em0uanNcIjogNjc1MTksXG5cdFwiLi91Zy1jblwiOiAzNTA0Nixcblx0XCIuL3VnLWNuLmpzXCI6IDM1MDQ2LFxuXHRcIi4vdWtcIjogMTk1MDYsXG5cdFwiLi91ay5qc1wiOiAxOTUwNixcblx0XCIuL3VyXCI6IDc3ODE1LFxuXHRcIi4vdXIuanNcIjogNzc4MTUsXG5cdFwiLi91elwiOiA4Nzk0Nyxcblx0XCIuL3V6LWxhdG5cIjogNDc4MTcsXG5cdFwiLi91ei1sYXRuLmpzXCI6IDQ3ODE3LFxuXHRcIi4vdXouanNcIjogODc5NDcsXG5cdFwiLi92aVwiOiA2NDgsXG5cdFwiLi92aS5qc1wiOiA2NDgsXG5cdFwiLi94LXBzZXVkb1wiOiAyNjY3MSxcblx0XCIuL3gtcHNldWRvLmpzXCI6IDI2NjcxLFxuXHRcIi4veW9cIjogODc4NTgsXG5cdFwiLi95by5qc1wiOiA4Nzg1OCxcblx0XCIuL3poLWNuXCI6IDM4OTUsXG5cdFwiLi96aC1jbi5qc1wiOiAzODk1LFxuXHRcIi4vemgtaGtcIjogMjIzNTcsXG5cdFwiLi96aC1oay5qc1wiOiAyMjM1Nyxcblx0XCIuL3poLXR3XCI6IDgxODMzLFxuXHRcIi4vemgtdHcuanNcIjogODE4MzNcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSA5OTQ1OTsiLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgIHZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJiBtb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBhcmdzWzBdID0geSArIDQwMDtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMgKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzWyhtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpKSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgcmV0dXJuIChtID09PSB0cnVlKSA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiAobSkgPyB3ZWVrZGF5c1ttLmRheSgpXSA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydCAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG4gICAgdmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbiAgICB2YXIgaXNvRGF0ZXMgPSBbXG4gICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgLy8gWVlZWU1NIGlzIE5PVCBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZFxuICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L11cbiAgICBdO1xuXG4gICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgIHZhciBpc29UaW1lcyA9IFtcbiAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIJywgL1xcZFxcZC9dXG4gICAgXTtcblxuICAgIHZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgdmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvO1xuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyh5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnJlcGxhY2UoL15cXHNcXHMqLywgJycpLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV2Vla2RheSh3ZWVrZGF5U3RyLCBwYXJzZWRJbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbnRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgICAgICB2YXIgd2Vla2RheVByb3ZpZGVkID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5QWN0dWFsID0gbmV3IERhdGUocGFyc2VkSW5wdXRbMF0sIHBhcnNlZElucHV0WzFdLCBwYXJzZWRJbnB1dFsyXSkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG9ic09mZnNldHMgPSB7XG4gICAgICAgIFVUOiAwLFxuICAgICAgICBHTVQ6IDAsXG4gICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgUFNUOiAtOCAqIDYwXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYnNPZmZzZXQsIG1pbGl0YXJ5T2Zmc2V0LCBudW1PZmZzZXQpIHtcbiAgICAgICAgaWYgKG9ic09mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWxpdGFyeU9mZnNldCkge1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgYWxsb3dlZCBtaWxpdGFyeSB0eiBpcyBaXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBobSA9IHBhcnNlSW50KG51bU9mZnNldCwgMTApO1xuICAgICAgICAgICAgdmFyIG0gPSBobSAlIDEwMCwgaCA9IChobSAtIG0pIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGggKiA2MCArIG07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGFuZCB0aW1lIGZyb20gcmVmIDI4MjIgZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHJmYzI4MjIuZXhlYyhwcmVwcm9jZXNzUkZDMjgyMihjb25maWcuX2kpKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VkQXJyYXkgPSBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKG1hdGNoWzRdLCBtYXRjaFszXSwgbWF0Y2hbMl0sIG1hdGNoWzVdLCBtYXRjaFs2XSwgbWF0Y2hbN10pO1xuICAgICAgICAgICAgaWYgKCFjaGVja1dlZWtkYXkobWF0Y2hbMV0sIHBhcnNlZEFycmF5LCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maWcuX2EgPSBwYXJzZWRBcnJheTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gY2FsY3VsYXRlT2Zmc2V0KG1hdGNoWzhdLCBtYXRjaFs5XSwgbWF0Y2hbMTBdKTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gY3JlYXRlVVRDRGF0ZS5hcHBseShudWxsLCBjb25maWcuX2EpO1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucmZjMjgyMiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuXG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5hbCBhdHRlbXB0LCB1c2UgSW5wdXQgRmFsbGJhY2tcbiAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICB9XG5cbiAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3ZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCAnICtcbiAgICAgICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgICAgICdkaXNjb3VyYWdlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIG1ham9yIHJlbGVhc2UuIFBsZWFzZSByZWZlciB0byAnICtcbiAgICAgICAgJ2h0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLCBwYXJzZWRJbnB1dCwgdG9rZW5zLCB0b2tlbiwgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcblxuICAgICAgICB0b2tlbnMgPSBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fCBbXSlbMF07XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndG9rZW4nLCB0b2tlbiwgJ3BhcnNlZElucHV0JywgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICAvLyAgICAgICAgICdyZWdleCcsIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9IHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKGNvbmZpZy5fbG9jYWxlLCBjb25maWcuX2FbSE9VUl0sIGNvbmZpZy5fbWVyaWRpZW0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAgKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG5cbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy5fZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmIChzY29yZVRvQmVhdCA9PSBudWxsIHx8IGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFtpLnllYXIsIGkubW9udGgsIGkuZGF5IHx8IGkuZGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcgKGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gbG9jYWxlO1xuICAgICAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbCAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgdmFyIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXggKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICsobmV3IERhdGUoKSk7XG4gICAgfTtcblxuICAgIHZhciBvcmRlcmluZyA9IFsneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmICghKGluZGV4T2YuY2FsbChvcmRlcmluZywga2V5KSAhPT0gLTEgJiYgKG1ba2V5XSA9PSBudWxsIHx8ICFpc05hTihtW2tleV0pKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5pdEhhc0RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlcmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1bb3JkZXJpbmdbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRIYXNEZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobVtvcmRlcmluZ1tpXV0pICE9PSB0b0ludChtW29yZGVyaW5nW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oTmFOKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9ICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xuICAgICAgICAgICAgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgICAgIHF1YXJ0ZXJzICogMyArXG4gICAgICAgICAgICB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCAodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICsgc2VwYXJhdG9yICsgemVyb0ZpbGwofn4ob2Zmc2V0KSAlIDYwLCAyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KCdaJywgJzonKTtcbiAgICBvZmZzZXQoJ1paJywgJycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWicsICBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKTtcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2h1bmsgICA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgdmFyIHBhcnRzICAgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICB2YXIgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XG5cbiAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgP1xuICAgICAgICAgIDAgOlxuICAgICAgICAgIHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID0gKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpID8gaW5wdXQudmFsdWVPZigpIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQgKG0pIHtcbiAgICAgICAgLy8gT24gRmlyZWZveC4yNCBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvcHVsbC8xODcxXG4gICAgICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0IChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksIDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0Wm9uZSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpO1xuICAgICAgICAgICAgaWYgKHRab25lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldCAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCkgfHxcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQgKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IHt9O1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjLl9pc1VUQyA/IGNyZWF0ZVVUQyhjLl9hKSA6IGNyZWF0ZUxvY2FsKGMuX2EpO1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICBjb21wYXJlQXJyYXlzKGMuX2EsIG90aGVyLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyAmJiB0aGlzLl9vZmZzZXQgPT09IDAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBU1AuTkVUIGpzb24gZGF0ZSBmb3JtYXQgcmVnZXhcbiAgICB2YXIgYXNwTmV0UmVnZXggPSAvXihcXC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKylcXDooXFxkKykoPzpcXDooXFxkKykoXFwuXFxkKik/KT8kLztcblxuICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICB2YXIgaXNvUmVnZXggPSAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGRpZmZSZXM7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZCAgOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNICA6IGlucHV0Ll9tb250aHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5ICA6IDAsXG4gICAgICAgICAgICAgICAgZCAgOiB0b0ludChtYXRjaFtEQVRFXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIGggIDogdG9JbnQobWF0Y2hbSE9VUl0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtICA6IHRvSW50KG1hdGNoW01JTlVURV0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgcyAgOiB0b0ludChtYXRjaFtTRUNPTkRdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zIDogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiAvLyB0aGUgbWlsbGlzZWNvbmQgZGVjaW1hbCBwb2ludCBpcyBpbmNsdWRlZCBpbiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICsoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgICAgICBpZiAoYmFzZS5pc0JlZm9yZShvdGhlcikpIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShvdGhlciwgYmFzZSk7XG4gICAgICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSAnbmFtZScgYXJnIGFmdGVyIGRlcHJlY2F0aW9uIGlzIHJlbW92ZWRcbiAgICBmdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIGR1ciwgdG1wO1xuICAgICAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCAnbW9tZW50KCkuJyArIG5hbWUgICsgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICsgbmFtZSArICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHRtcCA9IHZhbDsgdmFsID0gcGVyaW9kOyBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gK3ZhbCA6IHZhbDtcbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0IChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGFic1JvdW5kKGR1cmF0aW9uLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldCA9PSBudWxsID8gdHJ1ZSA6IHVwZGF0ZU9mZnNldDtcblxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICBzZXRNb250aChtb20sIGdldChtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBzZXQkMShtb20sICdEYXRlJywgZ2V0KG1vbSwgJ0RhdGUnKSArIGRheXMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUobW9tLl9kLnZhbHVlT2YoKSArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYWRkICAgICAgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyk7XG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgICAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgICAgICByZXR1cm4gZGlmZiA8IC02ID8gJ3NhbWVFbHNlJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IC0xID8gJ2xhc3RXZWVrJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAxID8gJ3NhbWVEYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMiA/ICduZXh0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxICh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgICAgIC8vIEdldHRpbmcgc3RhcnQtb2YtdG9kYXkgZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGxvY2FsL3V0Yy9vZmZzZXQgb3Igbm90LlxuICAgICAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICBmb3JtYXQgPSBob29rcy5jYWxlbmRhckZvcm1hdCh0aGlzLCBzb2QpIHx8ICdzYW1lRWxzZSc7XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdHMgJiYgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKSA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdykgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbiAoZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2YXIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIobG9jYWxGcm9tLCB1bml0cykgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKGxvY2FsVG8sIHVuaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQWZ0ZXIoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmcoa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2YXIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgdmFyIE1TX1BFUl9TRUNPTkQgPSAxMDAwO1xuICAgIHZhciBNU19QRVJfTUlOVVRFID0gNjAgKiBNU19QRVJfU0VDT05EO1xuICAgIHZhciBNU19QRVJfSE9VUiA9IDYwICogTVNfUEVSX01JTlVURTtcbiAgICB2YXIgTVNfUEVSXzQwMF9ZRUFSUyA9ICgzNjUgKiA0MDAgKyA5NykgKiAyNCAqIE1TX1BFUl9IT1VSO1xuXG4gICAgLy8gYWN0dWFsIG1vZHVsbyAtIGhhbmRsZXMgbmVnYXRpdmUgbnVtYmVycyAoZm9yIGRhdGVzIGJlZm9yZSAxOTcwKTpcbiAgICBmdW5jdGlvbiBtb2QkMShkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgICByZXR1cm4gKGRpdmlkZW5kICUgZGl2aXNvciArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YgKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB2YXIgdGltZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCkgKyAxLCAwLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMgKyAzLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDcpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgNykgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9IT1VSIC0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9NSU5VVEUgLSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9TRUNPTkQgLSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVPZiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXggKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFttLnllYXIoKSwgbS5tb250aCgpLCBtLmRhdGUoKSwgbS5ob3VyKCksIG0ubWludXRlKCksIG0uc2Vjb25kKCksIG0ubWlsbGlzZWNvbmQoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QgKCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogbS55ZWFyKCksXG4gICAgICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICAgICAgaG91cnM6IG0uaG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IG0ubWlsbGlzZWNvbmRzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgICAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzICgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQgKCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLl9pLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgICAgICBpc1VUQzogdGhpcy5faXNVVEMsXG4gICAgICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuICh0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICAnaXNvV2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrWWVhcicsICdnZycpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2Vla1llYXInLCAnR0cnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtZZWFyJywgMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrWWVhcicsIDEpO1xuXG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHRycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2cnLCAnR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCksXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMuaXNvV2VlaygpLCB0aGlzLmlzb1dlZWtkYXkoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIgKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla3NUYXJnZXQ7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB3ZWVrID0gd2Vla3NUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyRGF0YSA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICAgICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgIHRoaXMubW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdxdWFydGVyJywgJ1EnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3F1YXJ0ZXInLCA3KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKSA6IHRoaXMubW9udGgoKGlucHV0IC0gMSkgKiAzICsgdGhpcy5tb250aCgpICUgMyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RhdGUnLCAnRCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RhdGUnLCA5KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0QnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID9cbiAgICAgICAgICAobG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIHx8IGxvY2FsZS5fb3JkaW5hbFBhcnNlKSA6XG4gICAgICAgICAgbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXlPZlllYXInLCAnREREJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF5T2ZZZWFyJywgNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEREQnLCAgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyIChpbnB1dCkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyID0gTWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKChpbnB1dCAtIGRheU9mWWVhciksICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWludXRlJywgJ20nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbnV0ZScsIDE0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnc2Vjb25kJywgMTUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3NzJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0U2Vjb25kID0gbWFrZUdldFNldCgnU2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTAwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTJywgNF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1MnLCA1XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTJywgNl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTJywgN10sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1MnLCA4XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1NTJywgOV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG4gICAgfSk7XG5cblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbGxpc2Vjb25kJywgMTYpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsICAgIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsICAgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsICBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW47XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd6JywgIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xuICAgIH1cblxuICAgIHZhciBwcm90byA9IE1vbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5hZGQgICAgICAgICAgICAgICA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciAgICAgICAgICA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgICAgICAgICAgICAgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmICAgICAgICAgICAgICA9IGRpZmY7XG4gICAgcHJvdG8uZW5kT2YgICAgICAgICAgICAgPSBlbmRPZjtcbiAgICBwcm90by5mb3JtYXQgICAgICAgICAgICA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tICAgICAgICAgICAgICA9IGZyb207XG4gICAgcHJvdG8uZnJvbU5vdyAgICAgICAgICAgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvICAgICAgICAgICAgICAgID0gdG87XG4gICAgcHJvdG8udG9Ob3cgICAgICAgICAgICAgPSB0b05vdztcbiAgICBwcm90by5nZXQgICAgICAgICAgICAgICA9IHN0cmluZ0dldDtcbiAgICBwcm90by5pbnZhbGlkQXQgICAgICAgICA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyICAgICAgICAgICA9IGlzQWZ0ZXI7XG4gICAgcHJvdG8uaXNCZWZvcmUgICAgICAgICAgPSBpc0JlZm9yZTtcbiAgICBwcm90by5pc0JldHdlZW4gICAgICAgICA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbWUgICAgICAgICAgICA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyICAgICA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgICAgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkICAgICAgICAgICA9IGlzVmFsaWQkMjtcbiAgICBwcm90by5sYW5nICAgICAgICAgICAgICA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlICAgICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8ubG9jYWxlRGF0YSAgICAgICAgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWF4O1xuICAgIHByb3RvLm1pbiAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyAgICAgID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCAgICAgICAgICAgICAgID0gc3RyaW5nU2V0O1xuICAgIHByb3RvLnN0YXJ0T2YgICAgICAgICAgID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCAgICAgICAgICA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgICAgICAgICAgID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCAgICAgICAgICA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSAgICAgICAgICAgID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCAgICAgICAgICAgPSBpbnNwZWN0O1xuICAgIHByb3RvLnRvSlNPTiAgICAgICAgICAgID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nICAgICAgICAgID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCAgICAgICAgICAgICAgPSB1bml4O1xuICAgIHByb3RvLnZhbHVlT2YgICAgICAgICAgID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgICAgICA9IGNyZWF0aW9uRGF0YTtcbiAgICBwcm90by55ZWFyICAgICAgID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciAgICA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCAgICAgICA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayAgICAgICAgICAgPSBwcm90by53ZWVrcyAgICAgICAgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgICAgICAgID0gcHJvdG8uaXNvV2Vla3MgICAgID0gZ2V0U2V0SVNPV2VlaztcbiAgICBwcm90by53ZWVrc0luWWVhciAgICA9IGdldFdlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uZGF0ZSAgICAgICA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ICAgICAgICA9IHByb3RvLmRheXMgICAgICAgICAgICAgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSAgICA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciAgPSBnZXRTZXREYXlPZlllYXI7XG4gICAgcHJvdG8uaG91ciA9IHByb3RvLmhvdXJzID0gZ2V0U2V0SG91cjtcbiAgICBwcm90by5taW51dGUgPSBwcm90by5taW51dGVzID0gZ2V0U2V0TWludXRlO1xuICAgIHByb3RvLnNlY29uZCA9IHByb3RvLnNlY29uZHMgPSBnZXRTZXRTZWNvbmQ7XG4gICAgcHJvdG8ubWlsbGlzZWNvbmQgPSBwcm90by5taWxsaXNlY29uZHMgPSBnZXRTZXRNaWxsaXNlY29uZDtcbiAgICBwcm90by51dGNPZmZzZXQgICAgICAgICAgICA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgICAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgICAgICAgICAgICA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0O1xuICAgIHByb3RvLmhhc0FsaWduZWRIb3VyT2Zmc2V0ID0gaGFzQWxpZ25lZEhvdXJPZmZzZXQ7XG4gICAgcHJvdG8uaXNEU1QgICAgICAgICAgICAgICAgPSBpc0RheWxpZ2h0U2F2aW5nVGltZTtcbiAgICBwcm90by5pc0xvY2FsICAgICAgICAgICAgICA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgICAgICAgICAgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzICA9IGRlcHJlY2F0ZSgnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLCBnZXRTZXREYXlPZk1vbnRoKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsIGdldFNldE1vbnRoKTtcbiAgICBwcm90by55ZWFycyAgPSBkZXByZWNhdGUoJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQnLCBnZXRTZXRZZWFyKTtcbiAgICBwcm90by56b25lICAgPSBkZXByZWNhdGUoJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJywgZ2V0U2V0Wm9uZSk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKCdpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uJywgaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVuaXggKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdCAoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDEgPSBMb2NhbGUucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMS5jYWxlbmRhciAgICAgICAgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ICA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgICAgID0gaW52YWxpZERhdGU7XG4gICAgcHJvdG8kMS5vcmRpbmFsICAgICAgICAgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgICAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucG9zdGZvcm1hdCAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lICAgID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSAgICAgID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCAgICAgICAgICAgICA9IHNldDtcblxuICAgIHByb3RvJDEubW9udGhzICAgICAgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNQYXJzZTtcbiAgICBwcm90byQxLm1vbnRoc1JlZ2V4ICAgICAgID0gbW9udGhzUmVnZXg7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydFJlZ2V4ICA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyAgICAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzTWluO1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydCAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggICAgICAgPSAgICAgICAgd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCAgPSAgICAgICAgd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCAgICA9ICAgICAgICB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMSAoZm9ybWF0LCBpbmRleCwgZmllbGQsIHNldHRlcikge1xuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG4gICAgICAgIHZhciB1dGMgPSBjcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBsb2NhbGVbZmllbGRdKHV0YywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzSW1wbCAoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzIChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc1Nob3J0IChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0IChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c01pbiAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0b0ludChudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICBob29rcy5sYW5nID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsIGdldFNldEdsb2JhbExvY2FsZSk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBnZXRMb2NhbGUpO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWF0aEFicyh0aGlzLl9taWxsaXNlY29uZHMpO1xuICAgICAgICB0aGlzLl9kYXlzICAgICAgICAgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgID0gbWF0aEFicyhkYXRhLm1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgICA9IG1hdGhBYnMoZGF0YS5zZWNvbmRzKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyAgICAgICAgPSBtYXRoQWJzKGRhdGEubW9udGhzKTtcbiAgICAgICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxIChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlRHVyYXRpb24oaW5wdXQsIHZhbHVlKTtcblxuICAgICAgICBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgIGR1cmF0aW9uLl9kYXlzICAgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgc3VidHJhY3QoMSwgJ3MnKSBvciBzdWJ0cmFjdChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBzdWJ0cmFjdCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlICgpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IHRoaXMuX2RheXM7XG4gICAgICAgIHZhciBtb250aHMgICAgICAgPSB0aGlzLl9tb250aHM7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgPSB0aGlzLl9kYXRhO1xuICAgICAgICB2YXIgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzLCBtb250aHNGcm9tRGF5cztcblxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbWl4IG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXMsIGJ1YmJsZSBkb3duIGZpcnN0XG4gICAgICAgIC8vIGNoZWNrOiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjE2NlxuICAgICAgICBpZiAoISgobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApKSkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzICAgICAgICAgICA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzICAgICAgICAgICA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzICAgICAgICAgICAgID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgICA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzICA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyAoZGF5cykge1xuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxNDYwOTcgZGF5cyAodGFraW5nIGludG8gYWNjb3VudCBsZWFwIHllYXIgcnVsZXMpXG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgICAgICByZXR1cm4gZGF5cyAqIDQ4MDAgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzIChtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiBtb250aHMgKiAxNDYwOTcgLyA0ODAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzICh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzO1xuICAgICAgICB2YXIgbW9udGhzO1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgIHJldHVybiBtb250aHM7XG4gICAgICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6IHJldHVybiBtb250aHMgLyAzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXInOiAgICByZXR1cm4gbW9udGhzIC8gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNRdWFydGVycyAgICAgPSBtYWtlQXMoJ1EnKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyAgICAgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjI0LjAnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgIHJldHVybiBob29rcztcblxufSkpKTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZVVSSSAoc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgdmFyIG8gPSB7XG4gICAga2V5OiBbJ3NvdXJjZScsICdwcm90b2NvbCcsICdhdXRob3JpdHknLCAndXNlckluZm8nLCAndXNlcicsICdwYXNzd29yZCcsICdob3N0JywgJ3BvcnQnLCAncmVsYXRpdmUnLCAncGF0aCcsICdkaXJlY3RvcnknLCAnZmlsZScsICdxdWVyeScsICdhbmNob3InXSxcbiAgICBxOiB7XG4gICAgICBuYW1lOiAncXVlcnlLZXknLFxuICAgICAgcGFyc2VyOiAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2dcbiAgICB9LFxuICAgIHBhcnNlcjoge1xuICAgICAgc3RyaWN0OiAvXig/OihbXjpcXC8/I10rKTopPyg/OlxcL1xcLygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlxcLz8jXSopKD86OihcXGQqKSk/KSk/KCgoKD86W14/I1xcL10qXFwvKSopKFtePyNdKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvLFxuICAgICAgbG9vc2U6IC9eKD86KD8hW146QF0rOlteOkBcXC9dKkApKFteOlxcLz8jLl0rKTopPyg/OlxcL1xcLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pL1xuICAgIH1cbiAgfVxuXG4gIHZhciBtID0gby5wYXJzZXJbb3B0cy5zdHJpY3RNb2RlID8gJ3N0cmljdCcgOiAnbG9vc2UnXS5leGVjKHN0cilcbiAgdmFyIHVyaSA9IHt9XG4gIHZhciBpID0gMTRcblxuICB3aGlsZSAoaS0tKSB1cmlbby5rZXlbaV1dID0gbVtpXSB8fCAnJ1xuXG4gIHVyaVtvLnEubmFtZV0gPSB7fVxuICB1cmlbby5rZXlbMTJdXS5yZXBsYWNlKG8ucS5wYXJzZXIsIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgaWYgKCQxKSB1cmlbby5xLm5hbWVdWyQxXSA9ICQyXG4gIH0pXG5cbiAgcmV0dXJuIHVyaVxufVxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAxOCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9uc3Rvcm0vcGhhc2VyL2Jsb2IvbWFzdGVyL2xpY2Vuc2UudHh0fE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy91dGlscy9DbGFzcycpO1xyXG52YXIgTWF0cml4NCA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9tYXRoL01hdHJpeDQnKTtcclxudmFyIFJhbmRvbVhZWiA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9tYXRoL1JhbmRvbVhZWicpO1xyXG52YXIgUmFuZG9tWFlaVyA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9tYXRoL1JhbmRvbVhZWlcnKTtcclxudmFyIFJvdGF0ZVZlYzMgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvbWF0aC9Sb3RhdGVWZWMzJyk7XHJcbnZhciBTZXQgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvc3RydWN0cy9TZXQnKTtcclxudmFyIFNwcml0ZTNEID0gcmVxdWlyZSgnLi9zcHJpdGUzZC9TcHJpdGUzRCcpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9tYXRoL1ZlY3RvcjInKTtcclxudmFyIFZlY3RvcjMgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvbWF0aC9WZWN0b3IzJyk7XHJcbnZhciBWZWN0b3I0ID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL21hdGgvVmVjdG9yNCcpO1xyXG5cclxuLy8gIExvY2FsIGNhY2hlIHZhcnNcclxudmFyIHRtcFZlYzMgPSBuZXcgVmVjdG9yMygpO1xyXG52YXIgdG1wVmVjNCA9IG5ldyBWZWN0b3I0KCk7XHJcbnZhciBkaXJ2ZWMgPSBuZXcgVmVjdG9yMygpO1xyXG52YXIgcmlnaHR2ZWMgPSBuZXcgVmVjdG9yMygpO1xyXG52YXIgYmlsbGJvYXJkTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcbi8vICBAYXV0aG9yIGF0dHJpYnV0ZSBodHRwczovL2dpdGh1Yi5jb20vbWF0dGRlc2wvY2FtM2Qvd2lraVxyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJheURlZlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge1BoYXNlci5NYXRoLlZlY3RvcjN9IG9yaWdpbiAtIFtkZXNjcmlwdGlvbl1cclxuICogQHByb3BlcnR5IHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBkaXJlY3Rpb24gLSBbZGVzY3JpcHRpb25dXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogW2Rlc2NyaXB0aW9uXVxyXG4gKlxyXG4gKiBAY2xhc3MgQ2FtZXJhXHJcbiAqIEBtZW1iZXJPZiBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFtkZXNjcmlwdGlvbl1cclxuICovXHJcbnZhciBDYW1lcmEgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQ2FtZXJhIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCNkaXNwbGF5TGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdCA9IHNjZW5lLnN5cy5kaXNwbGF5TGlzdDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjdXBkYXRlTGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3QgPSBzY2VuZS5zeXMudXBkYXRlTGlzdDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjbmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgJydcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjZGlyZWN0aW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBuZXcgVmVjdG9yMygwLCAwLCAtMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI3VwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51cCA9IG5ldyBWZWN0b3IzKDAsIDEsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCNwb3NpdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IzfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogIFRoZSBtYXBwaW5nIGZyb20gM0Qgc2l6ZSB1bml0cyB0byBwaXhlbHMuXHJcbiAgICAgICAgICogIEluIHRoZSBkZWZhdWx0IGNhc2UgMSAzRCB1bml0ID0gMTI4IHBpeGVscy4gU28gYSBzcHJpdGUgdGhhdCBpc1xyXG4gICAgICAgICAqICAyNTYgeCAxMjggcHggaW4gc2l6ZSB3aWxsIGJlIDIgeCAxIHVuaXRzLlxyXG4gICAgICAgICAqICBDaGFuZ2UgdG8gd2hhdGV2ZXIgYmVzdCBmaXRzIHlvdXIgZ2FtZSBhc3NldHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCNwaXhlbFNjYWxlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBpeGVsU2NhbGUgPSAxMjg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI3Byb2plY3Rpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguTWF0cml4NH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCN2aWV3XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLk1hdHJpeDR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjY29tYmluZWRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguTWF0cml4NH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbWJpbmVkID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjaW52UHJvamVjdGlvblZpZXdcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguTWF0cml4NH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmludlByb2plY3Rpb25WaWV3ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QjbmVhclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmVhciA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI2ZhclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mYXIgPSAxMDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI3JheVxyXG4gICAgICAgICAqIEB0eXBlIHtSYXlEZWZ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yYXkgPSB7XHJcbiAgICAgICAgICAgIG9yaWdpbjogbmV3IFZlY3RvcjMoKSxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0Qjdmlld3BvcnRXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI3ZpZXdwb3J0SGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEI2JpbGxib2FyZE1hdHJpeERpcnR5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmlsbGJvYXJkTWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCNjaGlsZHJlblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Pn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IFNldCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSNzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSNzZXRTY2VuZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTY2VuZTogZnVuY3Rpb24gKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3NldFBpeGVsU2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UGl4ZWxTY2FsZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGl4ZWxTY2FsZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjYWRkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRH0gc3ByaXRlM0QgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKHNwcml0ZTNEKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc2V0KHNwcml0ZTNEKTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdC5hZGQoc3ByaXRlM0QuZ2FtZU9iamVjdCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0LmFkZChzcHJpdGUzRC5nYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbigpO1xyXG5cclxuICAgICAgICByZXR1cm4gc3ByaXRlM0Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBUaGlzIENhbWVyYSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUxpc3QucmVtb3ZlKGNoaWxkLmdhbWVPYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGlzdC5yZW1vdmUoY2hpbGQuZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZGVsZXRlKGNoaWxkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI2NsZWFyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmUoY2hpbGRyZW5baV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI2dldENoaWxkcmVuXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBnZXRDaGlsZHJlbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5lbnRyaWVzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSNjcmVhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gZnJhbWUgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPXRydWVdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRH0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uICh4LCB5LCB6LCBrZXksIGZyYW1lLCB2aXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2aXNpYmxlID09PSB1bmRlZmluZWQpIHsgdmlzaWJsZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IFNwcml0ZTNEKHRoaXMuc2NlbmUsIHgsIHksIHosIGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLmRpc3BsYXlMaXN0LmFkZChjaGlsZC5nYW1lT2JqZWN0KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3QuYWRkKGNoaWxkLmdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICBjaGlsZC52aXNpYmxlID0gdmlzaWJsZTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5zZXQoY2hpbGQpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjY3JlYXRlTXVsdGlwbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBxdWFudGl0eSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gZnJhbWUgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPXRydWVdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRFtdfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZU11bHRpcGxlOiBmdW5jdGlvbiAocXVhbnRpdHksIGtleSwgZnJhbWUsIHZpc2libGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZpc2libGUgPT09IHVuZGVmaW5lZCkgeyB2aXNpYmxlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IG5ldyBTcHJpdGUzRCh0aGlzLnNjZW5lLCAwLCAwLCAwLCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKGNoaWxkLmdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpc3QuYWRkKGNoaWxkLmdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgY2hpbGQudmlzaWJsZSA9IHZpc2libGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNldChjaGlsZCk7XHJcblxyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyAgQ3JlYXRlIGEgYnVuY2ggb2YgU3ByaXRlM0Qgb2JqZWN0cyBpbiBhIHJlY3RhbmdsZVxyXG4gICAgLy8gIHNpemUgYW5kIHNwYWNpbmcgYXJlIFZlYzNzIChvciBpZiBpbnRlZ2VycyBhcmUgY29udmVydGVkIHRvIHZlYzNzKVxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjY3JlYXRlUmVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfHt4Om51bWJlcix5Om51bWJlcn0pfSBzaXplIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfHt4Om51bWJlcix5Om51bWJlcix6Om51bWJlcn0pfSBzcGFjaW5nIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBbZnJhbWVdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRFtdfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVJlY3Q6IGZ1bmN0aW9uIChzaXplLCBzcGFjaW5nLCBrZXksIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicpIHsgc2l6ZSA9IHsgeDogc2l6ZSwgeTogc2l6ZSwgejogc2l6ZSB9OyB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzcGFjaW5nID09PSAnbnVtYmVyJykgeyBzcGFjaW5nID0geyB4OiBzcGFjaW5nLCB5OiBzcGFjaW5nLCB6OiBzcGFjaW5nIH07IH1cclxuXHJcbiAgICAgICAgdmFyIHF1YW50aXR5ID0gc2l6ZS54ICogc2l6ZS55ICogc2l6ZS56O1xyXG5cclxuICAgICAgICB2YXIgc3ByaXRlcyA9IHRoaXMuY3JlYXRlTXVsdGlwbGUocXVhbnRpdHksIGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICB2YXIgaSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAodmFyIHogPSAwLjUgLSAoc2l6ZS56IC8gMik7IHogPCAoc2l6ZS56IC8gMik7IHorKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwLjUgLSAoc2l6ZS55IC8gMik7IHkgPCAoc2l6ZS55IC8gMik7IHkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDAuNSAtIChzaXplLnggLyAyKTsgeCA8IChzaXplLnggLyAyKTsgeCsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBieCA9ICh4ICogc3BhY2luZy54KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnkgPSAoeSAqIHNwYWNpbmcueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ6ID0gKHogKiBzcGFjaW5nLnopO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzcHJpdGVzW2ldLnBvc2l0aW9uLnNldChieCwgYnksIGJ6KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gc3ByaXRlcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjcmFuZG9tU3BoZXJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEW119IFtzcHJpdGVzXSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmFuZG9tU3BoZXJlOiBmdW5jdGlvbiAocmFkaXVzLCBzcHJpdGVzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzcHJpdGVzID09PSB1bmRlZmluZWQpIHsgc3ByaXRlcyA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTsgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwcml0ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBSYW5kb21YWVooc3ByaXRlc1tpXS5wb3NpdGlvbiwgcmFkaXVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSNyYW5kb21DdWJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTFdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0RbXX0gW3Nwcml0ZXNdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByYW5kb21DdWJlOiBmdW5jdGlvbiAoc2NhbGUsIHNwcml0ZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNwcml0ZXMgPT09IHVuZGVmaW5lZCkgeyBzcHJpdGVzID0gdGhpcy5nZXRDaGlsZHJlbigpOyB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ByaXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJhbmRvbVhZWlcoc3ByaXRlc1tpXS5wb3NpdGlvbiwgc2NhbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3RyYW5zbGF0ZUNoaWxkcmVuXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IHZlYzMgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRFtdfSBzcHJpdGVzIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2xhdGVDaGlsZHJlbjogZnVuY3Rpb24gKHZlYzMsIHNwcml0ZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNwcml0ZXMgPT09IHVuZGVmaW5lZCkgeyBzcHJpdGVzID0gdGhpcy5nZXRDaGlsZHJlbigpOyB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ByaXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNwcml0ZXNbaV0ucG9zaXRpb24uYWRkKHZlYzMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3RyYW5zZm9ybUNoaWxkcmVuXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDR9IG1hdDQgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRFtdfSBzcHJpdGVzIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1DaGlsZHJlbjogZnVuY3Rpb24gKG1hdDQsIHNwcml0ZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNwcml0ZXMgPT09IHVuZGVmaW5lZCkgeyBzcHJpdGVzID0gdGhpcy5nZXRDaGlsZHJlbigpOyB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ByaXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNwcml0ZXNbaV0ucG9zaXRpb24udHJhbnNmb3JtTWF0NChtYXQ0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LiBEb2VzIG5vdCB1cGRhdGUgYW55IG1hdHJpY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3NldFZpZXdwb3J0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWaWV3cG9ydDogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydFdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNsYXRlcyB0aGlzIGNhbWVyYSBieSBhIHNwZWNpZmllZCBWZWN0b3IzIG9iamVjdFxyXG4gICAgICogb3IgeCwgeSwgeiBwYXJhbWV0ZXJzLiBBbnkgdW5kZWZpbmVkIHggeSB6IHZhbHVlcyB3aWxsXHJcbiAgICAgKiBkZWZhdWx0IHRvIHplcm8sIGxlYXZpbmcgdGhhdCBjb21wb25lbnQgdW5hZmZlY3RlZC5cclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHNldCB0aGUgY2FtZXJhIHBvc2l0aW9uIGRpcmVjdGx5IGNhbGwgc2V0UG9zaXRpb24gaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSN0cmFuc2xhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxvYmplY3QpfSB4IC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbel0gLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBUaGlzIENhbWVyYSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueCArPSB4LnggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi55ICs9IHgueSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnogKz0geC56IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueCArPSB4IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueSArPSB5IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueiArPSB6IHx8IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjbG9va0F0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8b2JqZWN0KX0geCAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBsb29rQXQ6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkaXIgPSB0aGlzLmRpcmVjdGlvbjtcclxuICAgICAgICB2YXIgdXAgPSB0aGlzLnVwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGlyLmNvcHkoeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRpci5zZXQoeCwgeSwgeik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkaXIuc3VidHJhY3QodGhpcy5wb3NpdGlvbikubm9ybWFsaXplKCk7XHJcblxyXG4gICAgICAgIC8vICBDYWxjdWxhdGUgcmlnaHQgdmVjdG9yXHJcbiAgICAgICAgdG1wVmVjMy5jb3B5KGRpcikuY3Jvc3ModXApLm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICAvLyAgQ2FsY3VsYXRlIHVwIHZlY3RvclxyXG4gICAgICAgIHVwLmNvcHkodG1wVmVjMykuY3Jvc3MoZGlyKS5ub3JtYWxpemUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3JvdGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IGF4aXMgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBUaGlzIENhbWVyYSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZTogZnVuY3Rpb24gKHJhZGlhbnMsIGF4aXMpXHJcbiAgICB7XHJcbiAgICAgICAgUm90YXRlVmVjMyh0aGlzLmRpcmVjdGlvbiwgYXhpcywgcmFkaWFucyk7XHJcbiAgICAgICAgUm90YXRlVmVjMyh0aGlzLnVwLCBheGlzLCByYWRpYW5zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3JvdGF0ZUFyb3VuZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBwb2ludCAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBheGlzIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByb3RhdGVBcm91bmQ6IGZ1bmN0aW9uIChwb2ludCwgcmFkaWFucywgYXhpcylcclxuICAgIHtcclxuICAgICAgICB0bXBWZWMzLmNvcHkocG9pbnQpLnN1YnRyYWN0KHRoaXMucG9zaXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZSh0bXBWZWMzKTtcclxuICAgICAgICB0aGlzLnJvdGF0ZShyYWRpYW5zLCBheGlzKTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0ZSh0bXBWZWMzLm5lZ2F0ZSgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3Byb2plY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdmVjIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBvdXQgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBwcm9qZWN0OiBmdW5jdGlvbiAodmVjLCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3I0KCk7IH1cclxuXHJcbiAgICAgICAgLy8gIFRPRE86IHN1cHBvcnQgdmlld3BvcnQgWFlcclxuICAgICAgICB2YXIgdmlld3BvcnRXaWR0aCA9IHRoaXMudmlld3BvcnRXaWR0aDtcclxuICAgICAgICB2YXIgdmlld3BvcnRIZWlnaHQgPSB0aGlzLnZpZXdwb3J0SGVpZ2h0O1xyXG4gICAgICAgIHZhciBuID0gQ2FtZXJhLk5FQVJfUkFOR0U7XHJcbiAgICAgICAgdmFyIGYgPSBDYW1lcmEuRkFSX1JBTkdFO1xyXG5cclxuICAgICAgICAvLyAgRm9yIHVzZWZ1bCBaIGFuZCBXIHZhbHVlcyB3ZSBzaG91bGQgZG8gdGhlIHVzdWFsIHN0ZXBzOiBjbGlwIHNwYWNlIC0+IE5EQyAtPiB3aW5kb3cgY29vcmRzXHJcblxyXG4gICAgICAgIC8vICBJbXBsaWNpdCAxLjAgZm9yIHcgY29tcG9uZW50XHJcbiAgICAgICAgdG1wVmVjNC5zZXQodmVjLngsIHZlYy55LCB2ZWMueiwgMS4wKTtcclxuXHJcbiAgICAgICAgLy8gIFRyYW5zZm9ybSBpbnRvIGNsaXAgc3BhY2VcclxuICAgICAgICB0bXBWZWM0LnRyYW5zZm9ybU1hdDQodGhpcy5jb21iaW5lZCk7XHJcblxyXG4gICAgICAgIC8vICBBdm9pZCBkaXZpZGUgYnkgemVybyB3aGVuIDB4MHgwIGNhbWVyYSBwcm9qZWN0cyB0byBhIDB4MHgwIHZlYzNcclxuICAgICAgICBpZiAodG1wVmVjNC53ID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdG1wVmVjNC53ID0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBOb3cgaW50byBORENcclxuICAgICAgICB0bXBWZWM0LnggPSB0bXBWZWM0LnggLyB0bXBWZWM0Lnc7XHJcbiAgICAgICAgdG1wVmVjNC55ID0gdG1wVmVjNC55IC8gdG1wVmVjNC53O1xyXG4gICAgICAgIHRtcFZlYzQueiA9IHRtcFZlYzQueiAvIHRtcFZlYzQudztcclxuXHJcbiAgICAgICAgLy8gIEFuZCBmaW5hbGx5IGludG8gd2luZG93IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgb3V0LnggPSB2aWV3cG9ydFdpZHRoIC8gMiAqIHRtcFZlYzQueCArICgwICsgdmlld3BvcnRXaWR0aCAvIDIpO1xyXG4gICAgICAgIG91dC55ID0gdmlld3BvcnRIZWlnaHQgLyAyICogdG1wVmVjNC55ICsgKDAgKyB2aWV3cG9ydEhlaWdodCAvIDIpO1xyXG4gICAgICAgIG91dC56ID0gKGYgLSBuKSAvIDIgKiB0bXBWZWM0LnogKyAoZiArIG4pIC8gMjtcclxuXHJcbiAgICAgICAgLy8gIElmIHRoZSBvdXQgdmVjdG9yIGhhcyBhIGZvdXJ0aCBjb21wb25lbnQsIHdlIGFsc28gc3RvcmUgKDEvY2xpcC53KSwgc2FtZSBpZGVhIGFzIGdsX0ZyYWdDb29yZC53XHJcbiAgICAgICAgaWYgKG91dC53ID09PSAwIHx8IG91dC53KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0LncgPSAxIC8gdG1wVmVjNC53O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjdW5wcm9qZWN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjR9IHZlYyAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gb3V0IC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgdW5wcm9qZWN0OiBmdW5jdGlvbiAodmVjLCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IzKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIHZpZXdwb3J0ID0gdG1wVmVjNC5zZXQoMCwgMCwgdGhpcy52aWV3cG9ydFdpZHRoLCB0aGlzLnZpZXdwb3J0SGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dC5jb3B5KHZlYykudW5wcm9qZWN0KHZpZXdwb3J0LCB0aGlzLmludlByb2plY3Rpb25WaWV3KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjZ2V0UGlja1JheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1JheURlZn0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBnZXRQaWNrUmF5OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5yYXkub3JpZ2luLnNldCh4LCB5LCAwKTtcclxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh4LCB5LCAxKTtcclxuICAgICAgICB2YXIgdmlld3BvcnQgPSB0bXBWZWM0LnNldCgwLCAwLCB0aGlzLnZpZXdwb3J0V2lkdGgsIHRoaXMudmlld3BvcnRIZWlnaHQpO1xyXG4gICAgICAgIHZhciBtdHggPSB0aGlzLmludlByb2plY3Rpb25WaWV3O1xyXG5cclxuICAgICAgICBvcmlnaW4udW5wcm9qZWN0KHZpZXdwb3J0LCBtdHgpO1xyXG5cclxuICAgICAgICBkaXJlY3Rpb24udW5wcm9qZWN0KHZpZXdwb3J0LCBtdHgpO1xyXG5cclxuICAgICAgICBkaXJlY3Rpb24uc3VidHJhY3Qob3JpZ2luKS5ub3JtYWxpemUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmF5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSN1cGRhdGVDaGlsZHJlblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBUaGlzIENhbWVyYSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uZW50cmllcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldLnByb2plY3QodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLy8gIE92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlc1xyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3VwZGF0ZUJpbGxib2FyZE1hdHJpeFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUJpbGxib2FyZE1hdHJpeDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGlyID0gZGlydmVjLnNldCh0aGlzLmRpcmVjdGlvbikubmVnYXRlKCk7XHJcblxyXG4gICAgICAgIC8vIEJldHRlciB2aWV3LWFsaWduZWQgYmlsbGJvYXJkcyBtaWdodCB1c2UgdGhpczpcclxuICAgICAgICAvLyB2YXIgZGlyID0gdG1wLnNldChjYW1lcmEucG9zaXRpb24pLnN1YnRyYWN0KHApLm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgICAgICB2YXIgcmlnaHQgPSByaWdodHZlYy5zZXQodGhpcy51cCkuY3Jvc3MoZGlyKS5ub3JtYWxpemUoKTtcclxuICAgICAgICB2YXIgdXAgPSB0bXBWZWMzLnNldChkaXIpLmNyb3NzKHJpZ2h0KS5ub3JtYWxpemUoKTtcclxuXHJcbiAgICAgICAgdmFyIG91dCA9IGJpbGxib2FyZE1hdHJpeC52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IHJpZ2h0Lng7XHJcbiAgICAgICAgb3V0WzFdID0gcmlnaHQueTtcclxuICAgICAgICBvdXRbMl0gPSByaWdodC56O1xyXG4gICAgICAgIG91dFszXSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs0XSA9IHVwLng7XHJcbiAgICAgICAgb3V0WzVdID0gdXAueTtcclxuICAgICAgICBvdXRbNl0gPSB1cC56O1xyXG4gICAgICAgIG91dFs3XSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs4XSA9IGRpci54O1xyXG4gICAgICAgIG91dFs5XSA9IGRpci55O1xyXG4gICAgICAgIG91dFsxMF0gPSBkaXIuejtcclxuICAgICAgICBvdXRbMTFdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzEyXSA9IDA7XHJcbiAgICAgICAgb3V0WzEzXSA9IDA7XHJcbiAgICAgICAgb3V0WzE0XSA9IDA7XHJcbiAgICAgICAgb3V0WzE1XSA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuYmlsbGJvYXJkTWF0cml4RGlydHkgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgY2FudmFzIDNEIHJlbmRlcmluZyxcclxuICAgICAqIHdoaWNoIGRldGVybWluZXMgdGhlIFwicG9pbnQgc2l6ZVwiIG9mIGEgY2FtZXJhLWZhY2luZ1xyXG4gICAgICogc3ByaXRlIGJpbGxib2FyZCBnaXZlbiBpdHMgM0Qgd29ybGQgcG9zaXRpb25cclxuICAgICAqIChvcmlnaW4gYXQgY2VudGVyIG9mIHNwcml0ZSkgYW5kIGl0cyB3b3JsZCB3aWR0aFxyXG4gICAgICogYW5kIGhlaWdodCBpbiB4L3kuXHJcbiAgICAgKlxyXG4gICAgICogV2UgcGxhY2UgaW50byB0aGUgb3V0cHV0IFZlY3RvcjIgdGhlIHNjYWxlZCB3aWR0aFxyXG4gICAgICogYW5kIGhlaWdodC4gSWYgbm8gYG91dGAgaXMgc3BlY2lmaWVkLCBhIG5ldyBWZWN0b3IyXHJcbiAgICAgKiB3aWxsIGJlIGNyZWF0ZWQgZm9yIGNvbnZlbmllbmNlICh0aGlzIHNob3VsZCBiZSBhdm9pZGVkXHJcbiAgICAgKiBpbiB0aWdodCBsb29wcykuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjZ2V0UG9pbnRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHZlYyAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgM0QgU3ByaXRlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzaXplIC0gVGhlIHggYW5kIHkgZGltZW5zaW9ucy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gb3V0IC0gVGhlIHJlc3VsdCwgc2NhbGVkIHggYW5kIHkgZGltZW5zaW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50U2l6ZTogZnVuY3Rpb24gKHZlYywgc2l6ZSwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgd2l0aCBhIHNpbXBsZSBkaXN0YW5jZSBjYWxjdWxhdGlvbjpcclxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci52YWx2ZXNvZnR3YXJlLmNvbS93aWtpL0ZpZWxkX29mX1ZpZXdcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmlsbGJvYXJkTWF0cml4RGlydHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJpbGxib2FyZE1hdHJpeCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHRtcCA9IHRtcFZlYzM7XHJcblxyXG4gICAgICAgIHZhciBkeCA9IChzaXplLnggLyB0aGlzLnBpeGVsU2NhbGUpIC8gMjtcclxuICAgICAgICB2YXIgZHkgPSAoc2l6ZS55IC8gdGhpcy5waXhlbFNjYWxlKSAvIDI7XHJcblxyXG4gICAgICAgIHRtcC5zZXQoLWR4LCAtZHksIDApLnRyYW5zZm9ybU1hdDQoYmlsbGJvYXJkTWF0cml4KS5hZGQodmVjKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9qZWN0KHRtcCwgdG1wKTtcclxuXHJcbiAgICAgICAgdmFyIHRseCA9IHRtcC54O1xyXG4gICAgICAgIHZhciB0bHkgPSB0bXAueTtcclxuXHJcbiAgICAgICAgdG1wLnNldChkeCwgZHksIDApLnRyYW5zZm9ybU1hdDQoYmlsbGJvYXJkTWF0cml4KS5hZGQodmVjKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9qZWN0KHRtcCwgdG1wKTtcclxuXHJcbiAgICAgICAgdmFyIGJyeCA9IHRtcC54O1xyXG4gICAgICAgIHZhciBicnkgPSB0bXAueTtcclxuXHJcbiAgICAgICAgLy8gdmFyIHcgPSBNYXRoLmFicyhicnggLSB0bHgpO1xyXG4gICAgICAgIC8vIHZhciBoID0gTWF0aC5hYnMoYnJ5IC0gdGx5KTtcclxuXHJcbiAgICAgICAgLy8gIEFsbG93IHRoZSBwcm9qZWN0aW9uIHRvIGdldCBuZWdhdGl2ZSAuLi5cclxuICAgICAgICB2YXIgdyA9IGJyeCAtIHRseDtcclxuICAgICAgICB2YXIgaCA9IGJyeSAtIHRseTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dC5zZXQodywgaCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSNzZXRYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBUaGlzIENhbWVyYSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFg6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uLnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3NldFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0WTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjc2V0WlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYX0gVGhpcyBDYW1lcmEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRaOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbi56ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmEjeFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB4OiB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhI3lcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeToge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYSN6XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHo6IHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi56O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi56ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5DYW1lcmEuRkFSX1JBTkdFID0gMS4wO1xyXG5DYW1lcmEuTkVBUl9SQU5HRSA9IDAuMDtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2FtZXJhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvYmxvYi9tYXN0ZXIvbGljZW5zZS50eHR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBPcnRob2dyYXBoaWNDYW1lcmEgPSByZXF1aXJlKCcuL09ydGhvZ3JhcGhpY0NhbWVyYScpO1xyXG52YXIgUGVyc3BlY3RpdmVDYW1lcmEgPSByZXF1aXJlKCcuL1BlcnNwZWN0aXZlQ2FtZXJhJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBbZGVzY3JpcHRpb25dXHJcbiAqXHJcbiAqIEBjbGFzcyBDYW1lcmFNYW5hZ2VyXHJcbiAqIEBtZW1iZXJPZiBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFtkZXNjcmlwdGlvbl1cclxuICovXHJcbnZhciBDYW1lcmFNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENhbWVyYU1hbmFnZXIgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYU1hbmFnZXIjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhTWFuYWdlciNzeXN0ZW1zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBzY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIEFycmF5IG9mIHRoZSBDYW1lcmEgb2JqZWN0cyBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI2NhbWVyYXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmFzID0gW107XHJcblxyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub25jZSgnYm9vdCcsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbignc3RhcnQnLCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lM0QuQ2FtZXJhTWFuYWdlciNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKCdkZXN0cm95JywgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI3N0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub24oJ3VwZGF0ZScsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub25jZSgnc2h1dGRvd24nLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWVsZE9mVmlldz04MF0gLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYX0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChmaWVsZE9mVmlldywgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRQZXJzcGVjdGl2ZUNhbWVyYShmaWVsZE9mVmlldywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhTWFuYWdlciNhZGRPcnRob2dyYXBoaWNDYW1lcmFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuT3J0aG9ncmFwaGljQ2FtZXJhfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGFkZE9ydGhvZ3JhcGhpY0NhbWVyYTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuc2NlbmUuc3lzLmdhbWUuY29uZmlnO1xyXG5cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IGNvbmZpZy53aWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSBjb25maWcuaGVpZ2h0OyB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKHRoaXMuc2NlbmUsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYXMucHVzaChjYW1lcmEpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2FtZXJhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYU1hbmFnZXIjYWRkUGVyc3BlY3RpdmVDYW1lcmFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmllbGRPZlZpZXc9ODBdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuUGVyc3BlY3RpdmVDYW1lcmF9IFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgYWRkUGVyc3BlY3RpdmVDYW1lcmE6IGZ1bmN0aW9uIChmaWVsZE9mVmlldywgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5zY2VuZS5zeXMuZ2FtZS5jb25maWc7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZE9mVmlldyA9PT0gdW5kZWZpbmVkKSB7IGZpZWxkT2ZWaWV3ID0gODA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IGNvbmZpZy53aWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSBjb25maWcuaGVpZ2h0OyB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEodGhpcy5zY2VuZSwgZmllbGRPZlZpZXcsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYXMucHVzaChjYW1lcmEpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2FtZXJhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuT3J0aG9ncmFwaGljQ2FtZXJhfFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELlBlcnNwZWN0aXZlQ2FtZXJhKX0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBnZXRDYW1lcmE6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FtZXJhc1tpXS5uYW1lID09PSBuYW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYW1lcmFzW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI3JlbW92ZUNhbWVyYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuT3J0aG9ncmFwaGljQ2FtZXJhfFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELlBlcnNwZWN0aXZlQ2FtZXJhKX0gY2FtZXJhIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICByZW1vdmVDYW1lcmE6IGZ1bmN0aW9uIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNhbWVyYUluZGV4ID0gdGhpcy5jYW1lcmFzLmluZGV4T2YoY2FtZXJhKTtcclxuXHJcbiAgICAgICAgaWYgKGNhbWVyYUluZGV4ICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhcy5zcGxpY2UoY2FtZXJhSW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI3JlbW92ZUFsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELk9ydGhvZ3JhcGhpY0NhbWVyYXxQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYSl9IFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmNhbWVyYXMubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYXMucG9wKCk7XHJcblxyXG4gICAgICAgICAgICBjYW1lcmEuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFpbjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFNYW5hZ2VyI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGVwIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0aW1lc3RlcCwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmNhbWVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmFzW2ldLnVwZGF0ZSh0aW1lc3RlcCwgZGVsdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhTWFuYWdlciNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZigndXBkYXRlJywgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoJ3NodXRkb3duJywgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5ldmVudHMub2ZmKCdzdGFydCcsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5QbHVnaW5DYWNoZS5yZWdpc3RlcignQ2FtZXJhTWFuYWdlcjNEJywgQ2FtZXJhTWFuYWdlciwgJ2NhbWVyYXMzZCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYW1lcmFNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvYmxvYi9tYXN0ZXIvbGljZW5zZS50eHR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENhbWVyYSA9IHJlcXVpcmUoJy4vQ2FtZXJhJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy91dGlscy9DbGFzcycpO1xyXG52YXIgVmVjdG9yMyA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy9tYXRoL1ZlY3RvcjMnKTtcclxuXHJcbi8vICBMb2NhbCBjYWNoZSB2YXJzXHJcbnZhciB0bXBWZWMzID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFtkZXNjcmlwdGlvbl1cclxuICpcclxuICogQGNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5DYW1lcmFcclxuICogQG1lbWJlck9mIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gW2Rlc2NyaXB0aW9uXVxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt2aWV3cG9ydFdpZHRoPTBdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt2aWV3cG9ydEhlaWdodD0wXSAtIFtkZXNjcmlwdGlvbl1cclxuICovXHJcbnZhciBPcnRob2dyYXBoaWNDYW1lcmEgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IENhbWVyYSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSAoc2NlbmUsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoID09PSB1bmRlZmluZWQpIHsgdmlld3BvcnRXaWR0aCA9IDA7IH1cclxuICAgICAgICBpZiAodmlld3BvcnRIZWlnaHQgPT09IHVuZGVmaW5lZCkgeyB2aWV3cG9ydEhlaWdodCA9IDA7IH1cclxuXHJcbiAgICAgICAgQ2FtZXJhLmNhbGwodGhpcywgc2NlbmUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5PcnRob2dyYXBoaWNDYW1lcmEjdmlld3BvcnRXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0V2lkdGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELk9ydGhvZ3JhcGhpY0NhbWVyYSN2aWV3cG9ydEhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlld3BvcnRIZWlnaHQgPSB2aWV3cG9ydEhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuT3J0aG9ncmFwaGljQ2FtZXJhI196b29tXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3pvb20gPSAxLjA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELk9ydGhvZ3JhcGhpY0NhbWVyYSNuZWFyXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uZWFyID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5PcnRob2dyYXBoaWNDYW1lcmEjc2V0VG9PcnRob1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlEb3duIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2aWV3cG9ydFdpZHRoXSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdmlld3BvcnRIZWlnaHRdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELk9ydGhvZ3JhcGhpY0NhbWVyYX0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBzZXRUb09ydGhvOiBmdW5jdGlvbiAoeURvd24sIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2aWV3cG9ydFdpZHRoID09PSB1bmRlZmluZWQpIHsgdmlld3BvcnRXaWR0aCA9IHRoaXMudmlld3BvcnRXaWR0aDsgfVxyXG4gICAgICAgIGlmICh2aWV3cG9ydEhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IHZpZXdwb3J0SGVpZ2h0ID0gdGhpcy52aWV3cG9ydEhlaWdodDsgfVxyXG5cclxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuem9vbTtcclxuXHJcbiAgICAgICAgdGhpcy51cC5zZXQoMCwgKHlEb3duKSA/IC0xIDogMSwgMCk7XHJcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24uc2V0KDAsIDAsICh5RG93bikgPyAxIDogLTEpO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHpvb20gKiB2aWV3cG9ydFdpZHRoIC8gMiwgem9vbSAqIHZpZXdwb3J0SGVpZ2h0IC8gMiwgMCk7XHJcblxyXG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0V2lkdGg7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5PcnRob2dyYXBoaWNDYW1lcmEjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5PcnRob2dyYXBoaWNDYW1lcmF9IFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3ID0gdGhpcy52aWV3cG9ydFdpZHRoO1xyXG4gICAgICAgIHZhciBoID0gdGhpcy52aWV3cG9ydEhlaWdodDtcclxuICAgICAgICB2YXIgbmVhciA9IE1hdGguYWJzKHRoaXMubmVhcik7XHJcbiAgICAgICAgdmFyIGZhciA9IE1hdGguYWJzKHRoaXMuZmFyKTtcclxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuem9vbTtcclxuXHJcbiAgICAgICAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXaGF0IHRvIGRvIGhlcmUuLi4gaG1tP1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbi5vcnRobyhcclxuICAgICAgICAgICAgem9vbSAqIC13IC8gMiwgem9vbSAqIHcgLyAyLFxyXG4gICAgICAgICAgICB6b29tICogLWggLyAyLCB6b29tICogaCAvIDIsXHJcbiAgICAgICAgICAgIG5lYXIsXHJcbiAgICAgICAgICAgIGZhclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vICBCdWlsZCB0aGUgdmlldyBtYXRyaXhcclxuICAgICAgICB0bXBWZWMzLmNvcHkodGhpcy5wb3NpdGlvbikuYWRkKHRoaXMuZGlyZWN0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3Lmxvb2tBdCh0aGlzLnBvc2l0aW9uLCB0bXBWZWMzLCB0aGlzLnVwKTtcclxuXHJcbiAgICAgICAgLy8gIFByb2plY3Rpb24gKiB2aWV3IG1hdHJpeFxyXG4gICAgICAgIHRoaXMuY29tYmluZWQuY29weSh0aGlzLnByb2plY3Rpb24pLm11bHRpcGx5KHRoaXMudmlldyk7XHJcblxyXG4gICAgICAgIC8vICBJbnZlcnQgY29tYmluZWQgbWF0cml4LCB1c2VkIGZvciB1bnByb2plY3RcclxuICAgICAgICB0aGlzLmludlByb2plY3Rpb25WaWV3LmNvcHkodGhpcy5jb21iaW5lZCkuaW52ZXJ0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYmlsbGJvYXJkTWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5PcnRob2dyYXBoaWNDYW1lcmEjem9vbVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB6b29tOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl96b29tO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fem9vbSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPcnRob2dyYXBoaWNDYW1lcmE7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FtZXJhID0gcmVxdWlyZSgnLi9DYW1lcmEnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBWZWN0b3IzID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL21hdGgvVmVjdG9yMycpO1xyXG5cclxuLy8gIExvY2FsIGNhY2hlIHZhcnNcclxudmFyIHRtcFZlYzMgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogW2Rlc2NyaXB0aW9uXVxyXG4gKlxyXG4gKiBAY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmFcclxuICogQGV4dGVuZHMgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhXHJcbiAqIEBtZW1iZXJPZiBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFtkZXNjcmlwdGlvbl1cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZmllbGRPZlZpZXc9ODBdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt2aWV3cG9ydFdpZHRoPTBdIC0gW2Rlc2NyaXB0aW9uXVxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt2aWV3cG9ydEhlaWdodD0wXSAtIFtkZXNjcmlwdGlvbl1cclxuICovXHJcbnZhciBQZXJzcGVjdGl2ZUNhbWVyYSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogQ2FtZXJhLFxyXG5cclxuICAgIC8vICBGT1YgaXMgY29udmVydGVkIHRvIHJhZGlhbnMgYXV0b21hdGljYWxseVxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSAoc2NlbmUsIGZpZWxkT2ZWaWV3LCB2aWV3cG9ydFdpZHRoLCB2aWV3cG9ydEhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoZmllbGRPZlZpZXcgPT09IHVuZGVmaW5lZCkgeyBmaWVsZE9mVmlldyA9IDgwOyB9XHJcbiAgICAgICAgaWYgKHZpZXdwb3J0V2lkdGggPT09IHVuZGVmaW5lZCkgeyB2aWV3cG9ydFdpZHRoID0gMDsgfVxyXG4gICAgICAgIGlmICh2aWV3cG9ydEhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IHZpZXdwb3J0SGVpZ2h0ID0gMDsgfVxyXG5cclxuICAgICAgICBDYW1lcmEuY2FsbCh0aGlzLCBzY2VuZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFtkZXNjcmlwdGlvbl1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNELlBlcnNwZWN0aXZlQ2FtZXJhI3ZpZXdwb3J0V2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydFdpZHRoID0gdmlld3BvcnRXaWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogW2Rlc2NyaXB0aW9uXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuUGVyc3BlY3RpdmVDYW1lcmEjdmlld3BvcnRIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYSNmaWVsZE9mVmlld1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDgwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5maWVsZE9mVmlldyA9IGZpZWxkT2ZWaWV3ICogTWF0aC5QSSAvIDE4MDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYSNzZXRGT1ZcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFtkZXNjcmlwdGlvbl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYX0gW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBzZXRGT1Y6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZpZWxkT2ZWaWV3ID0gdmFsdWUgKiBNYXRoLlBJIC8gMTgwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3JpcHRpb25dXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRC5QZXJzcGVjdGl2ZUNhbWVyYSN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNwcml0ZTNELlBlcnNwZWN0aXZlQ2FtZXJhfSBbZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYXNwZWN0ID0gdGhpcy52aWV3cG9ydFdpZHRoIC8gdGhpcy52aWV3cG9ydEhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gIENyZWF0ZSBhIHBlcnNwZWN0aXZlIG1hdHJpeCBmb3Igb3VyIGNhbWVyYVxyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbi5wZXJzcGVjdGl2ZShcclxuICAgICAgICAgICAgdGhpcy5maWVsZE9mVmlldyxcclxuICAgICAgICAgICAgYXNwZWN0LFxyXG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLm5lYXIpLFxyXG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmZhcilcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyAgQnVpbGQgdGhlIHZpZXcgbWF0cml4XHJcbiAgICAgICAgdG1wVmVjMy5jb3B5KHRoaXMucG9zaXRpb24pLmFkZCh0aGlzLmRpcmVjdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMudmlldy5sb29rQXQodGhpcy5wb3NpdGlvbiwgdG1wVmVjMywgdGhpcy51cCk7XHJcblxyXG4gICAgICAgIC8vICBQcm9qZWN0aW9uICogdmlldyBtYXRyaXhcclxuICAgICAgICB0aGlzLmNvbWJpbmVkLmNvcHkodGhpcy5wcm9qZWN0aW9uKS5tdWx0aXBseSh0aGlzLnZpZXcpO1xyXG5cclxuICAgICAgICAvLyAgSW52ZXJ0IGNvbWJpbmVkIG1hdHJpeCwgdXNlZCBmb3IgdW5wcm9qZWN0XHJcbiAgICAgICAgdGhpcy5pbnZQcm9qZWN0aW9uVmlldy5jb3B5KHRoaXMuY29tYmluZWQpLmludmVydCgpO1xyXG5cclxuICAgICAgICB0aGlzLmJpbGxib2FyZE1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbigpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQZXJzcGVjdGl2ZUNhbWVyYTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAxOCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9uc3Rvcm0vcGhhc2VyL2Jsb2IvbWFzdGVyL2xpY2Vuc2UudHh0fE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5DYW1lcmFzLlNwcml0ZTNEXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ2FtZXJhOiByZXF1aXJlKCcuL0NhbWVyYScpLFxyXG4gICAgQ2FtZXJhTWFuYWdlcjogcmVxdWlyZSgnLi9DYW1lcmFNYW5hZ2VyJyksXHJcbiAgICBPcnRob2dyYXBoaWNDYW1lcmE6IHJlcXVpcmUoJy4vT3J0aG9ncmFwaGljQ2FtZXJhJyksXHJcbiAgICBQZXJzcGVjdGl2ZUNhbWVyYTogcmVxdWlyZSgnLi9QZXJzcGVjdGl2ZUNhbWVyYScpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvYmxvYi9tYXN0ZXIvbGljZW5zZS50eHR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vc3JjL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vc3JjL2dhbWVvYmplY3RzL0dhbWVPYmplY3QnKTtcclxudmFyIFNwcml0ZSA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL3NyYy9nYW1lb2JqZWN0cy9zcHJpdGUvU3ByaXRlJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vc3JjL21hdGgvVmVjdG9yMicpO1xyXG52YXIgVmVjdG9yNCA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL3NyYy9tYXRoL1ZlY3RvcjQnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgU3ByaXRlIDNEIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBUaGUgU3ByaXRlIDNEIG9iamVjdCBpcyBhbiBlbmNhcHN1bGF0aW9uIG9mIGEgc3RhbmRhcmQgU3ByaXRlIG9iamVjdCwgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgdG8gYWxsb3dcclxuICogaXQgdG8gYmUgcmVuZGVyZWQgYnkgYSAzRCBDYW1lcmEuIFRoZSBTcHJpdGUgY2FuIGJlIHBvc2l0aW9uZWQgYW55d2hlcmUgd2l0aGluIDNEIHNwYWNlLlxyXG4gKlxyXG4gKiBAY2xhc3MgU3ByaXRlM0RcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlck9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKi9cclxudmFyIFNwcml0ZTNEID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3ByaXRlM0QgKHNjZW5lLCB4LCB5LCB6LCB0ZXh0dXJlLCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdTcHJpdGUzRCcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZW5jYXBzdWxhdGVkIFNwcml0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRCNnYW1lT2JqZWN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZU9iamVjdCA9IG5ldyBTcHJpdGUoc2NlbmUsIDAsIDAsIHRleHR1cmUsIGZyYW1lKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBTcHJpdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0QjcG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yNH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3IFZlY3RvcjQoeCwgeSwgeik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSAyRCBzaXplIG9mIHRoZSBTcHJpdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0Qjc2l6ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IG5ldyBWZWN0b3IyKHRoaXMuZ2FtZU9iamVjdC53aWR0aCwgdGhpcy5nYW1lT2JqZWN0LmhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSAyRCBzY2FsZSBvZiB0aGUgU3ByaXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEI3NjYWxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBob3Jpem9udGFsIHNjYWxlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgU3ByaXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEI2FkanVzdFNjYWxlWFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFkanVzdFNjYWxlWCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzZXQgdGhlIHZlcnRpY2FsIHNjYWxlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgU3ByaXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEI2FkanVzdFNjYWxlWVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFkanVzdFNjYWxlWSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRCNfdmlzaWJsZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2plY3QgdGhpcyBTcHJpdGUgb250byB0aGUgZ2l2ZW4gM0QgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEI3Byb2plY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU3ByaXRlM0QuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgM0QgQ2FtZXJhIG9udG8gd2hpY2ggdG8gcHJvamVjdCB0aGlzIFNwcml0ZS5cclxuICAgICAqL1xyXG4gICAgcHJvamVjdDogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3NpdGlvbjtcclxuXHJcbiAgICAgICAgdmFyIGdhbWVPYmplY3QgPSB0aGlzLmdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIGNhbWVyYS5wcm9qZWN0KHBvcywgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGNhbWVyYS5nZXRQb2ludFNpemUocG9zLCB0aGlzLnNpemUsIHRoaXMuc2NhbGUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zY2FsZS54IDw9IDAgfHwgdGhpcy5zY2FsZS55IDw9IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnNldFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIWdhbWVPYmplY3QudmlzaWJsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5zZXRWaXNpYmxlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hZGp1c3RTY2FsZVgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3Quc2NhbGVYID0gdGhpcy5zY2FsZS54O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hZGp1c3RTY2FsZVkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3Quc2NhbGVZID0gdGhpcy5zY2FsZS55O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnNldERlcHRoKGdhbWVPYmplY3QueiAqIC0xKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRCNzZXRWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRH0gVGhpcyBTcHJpdGUzRCBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZpc2libGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEFuIGludmlzaWJsZSBHYW1lIE9iamVjdCB3aWxsIHNraXAgcmVuZGVyaW5nLCBidXQgd2lsbCBzdGlsbCBwcm9jZXNzIHVwZGF0ZSBsb2dpYy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0QjdmlzaWJsZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdmlzaWJsZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5nYW1lT2JqZWN0LnZpc2libGUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEI3hcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi54ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRCN5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHogcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0QjelxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB6OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLno7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnogPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwcml0ZTNEO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvYmxvYi9tYXN0ZXIvbGljZW5zZS50eHR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL3NyYy9nYW1lb2JqZWN0cy9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEJ1aWxkR2FtZU9iamVjdEFuaW1hdGlvbiA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL3NyYy9nYW1lb2JqZWN0cy9CdWlsZEdhbWVPYmplY3RBbmltYXRpb24nKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vc3JjL2dhbWVvYmplY3RzL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vc3JjL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBTcHJpdGUzRCA9IHJlcXVpcmUoJy4vU3ByaXRlM0QnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFNwcml0ZTNEIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTcHJpdGUzRCBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3Ijc3ByaXRlM0RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byBjcmVhdGUgaXRzZWxmLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1NjZW5lXSAtIEFkZCB0aGlzIEdhbWUgT2JqZWN0IHRvIHRoZSBTY2VuZSBhZnRlciBjcmVhdGluZyBpdD8gSWYgc2V0IHRoaXMgYXJndW1lbnQgb3ZlcnJpZGVzIHRoZSBgYWRkYCBwcm9wZXJ0eSBpbiB0aGUgY29uZmlnIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZTNEfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdzcHJpdGUzRCcsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciBrZXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2tleScsIG51bGwpO1xyXG4gICAgdmFyIGZyYW1lID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdmcmFtZScsIG51bGwpO1xyXG5cclxuICAgIHZhciBzcHJpdGUgPSBuZXcgU3ByaXRlM0QodGhpcy5zY2VuZSwgMCwgMCwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgaWYgKGFkZFRvU2NlbmUgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBjb25maWcuYWRkID0gYWRkVG9TY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3QodGhpcy5zY2VuZSwgc3ByaXRlLCBjb25maWcpO1xyXG5cclxuICAgIC8vICBTcHJpdGUgc3BlY2lmaWMgY29uZmlnIG9wdGlvbnM6XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0QW5pbWF0aW9uKHNwcml0ZSwgY29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gc3ByaXRlO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvYmxvYi9tYXN0ZXIvbGljZW5zZS50eHR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNwcml0ZTNEID0gcmVxdWlyZSgnLi9TcHJpdGUzRCcpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi8uLi8uLi8uLi9zcmMvZ2FtZW9iamVjdHMvR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFNwcml0ZTNEIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgU3ByaXRlM0QgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3Nwcml0ZTNEXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUzRH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3Rlcignc3ByaXRlM0QnLCBmdW5jdGlvbiAoeCwgeSwgeiwga2V5LCBmcmFtZSlcclxue1xyXG4gICAgdmFyIHNwcml0ZSA9IG5ldyBTcHJpdGUzRCh0aGlzLnNjZW5lLCB4LCB5LCB6LCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlMaXN0LmFkZChzcHJpdGUuZ2FtZU9iamVjdCk7XHJcbiAgICB0aGlzLnVwZGF0ZUxpc3QuYWRkKHNwcml0ZS5nYW1lT2JqZWN0KTtcclxuXHJcbiAgICByZXR1cm4gc3ByaXRlO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSBjb250ZXh0LlxyXG4vL1xyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vL1xyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gQWRJbnN0YW5jZVxyXG4gKlxyXG4gKiBAcHJvcGVydHkge2FueX0gaW5zdGFuY2UgLSBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGFuIGFkLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGxhY2VtZW50SUQgLSBUaGUgQXVkaWVuY2UgTmV0d29yayBwbGFjZW1lbnQgSUQgb2YgdGhpcyBhZCBpbnN0YW5jZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBzaG93biAtIEhhcyB0aGlzIGFkIGFscmVhZHkgYmVlbiBzaG93biBpbi1nYW1lP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpZGVvIC0gSXMgdGhpcyBhIHZpZGVvIGFkP1xyXG4gKi9cclxuXHJcbnZhciBBZEluc3RhbmNlID0gZnVuY3Rpb24gKHBsYWNlbWVudElELCBpbnN0YW5jZSwgdmlkZW8pXHJcbntcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxyXG4gICAgICAgIHBsYWNlbWVudElEOiBwbGFjZW1lbnRJRCxcclxuICAgICAgICBzaG93bjogZmFsc2UsXHJcbiAgICAgICAgdmlkZW86IHZpZGVvXHJcbiAgICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBZEluc3RhbmNlO1xyXG4iLCIvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xyXG5cclxuLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAxOCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9uc3Rvcm0vcGhhc2VyL2Jsb2IvbWFzdGVyL2xpY2Vuc2UudHh0fE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBZEluc3RhbmNlID0gcmVxdWlyZSgnLi9BZEluc3RhbmNlJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3NyYy91dGlscy9DbGFzcycpO1xyXG52YXIgRGF0YU1hbmFnZXIgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvZGF0YS9EYXRhTWFuYWdlcicpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgTGVhZGVyYm9hcmQgPSByZXF1aXJlKCcuL0xlYWRlcmJvYXJkJyk7XHJcbnZhciBQcm9kdWN0ID0gcmVxdWlyZSgnLi9Qcm9kdWN0Jyk7XHJcbnZhciBQdXJjaGFzZSA9IHJlcXVpcmUoJy4vUHVyY2hhc2UnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBmb3IgUGhhc2VyIDMgcHJvdmlkZXMgYSBzZWFtbGVzcyBicmlkZ2UgYmV0d2VlbiBQaGFzZXJcclxuICogYW5kIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIEFQSSB2ZXJzaW9uIDYuMi5cclxuICogXHJcbiAqIFlvdSBjYW4gYWNjZXNzIHRoaXMgcGx1Z2luIHZpYSB0aGUgYGZhY2Vib29rYCBwcm9wZXJ0eSBpbiBhIFNjZW5lLCBpLmU6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMuZmFjZWJvb2suZ2V0UGxhdGZvcm0oKTtcclxuICogYGBgXHJcbiAqIFxyXG4gKiBJZiB0aGlzIGlzIHVuYXZhaWxhYmxlIHBsZWFzZSBjaGVjayB0byBtYWtlIHN1cmUgeW91J3JlIHVzaW5nIGEgYnVpbGQgb2YgUGhhc2VyIHRoYXQgaGFzXHJcbiAqIHRoaXMgcGx1Z2luIHdpdGhpbiBpdC4gWW91IGNhbiBxdWlja2x5IGNoZWNrIHRoaXMgYnkgbG9va2luZyBhdCB0aGUgZGV2IHRvb2xzIGNvbnNvbGVcclxuICogaGVhZGVyIC0gdGhlIFBoYXNlciB2ZXJzaW9uIG51bWJlciB3aWxsIGhhdmUgYC1GQmAgYWZ0ZXIgaXQgaWYgdGhpcyBwbHVnaW4gaXMgbG9hZGVkLlxyXG4gKlxyXG4gKiBJZiB5b3UgYXJlIGJ1aWxkaW5nIHlvdXIgb3duIHZlcnNpb24gb2YgUGhhc2VyIHRoZW4gdXNlIHRoaXMgV2VicGFjayBEZWZpbmVQbHVnaW4gZmxhZzpcclxuICogXHJcbiAqIGBcInR5cGVvZiBQTFVHSU5fRkJJTlNUQU5UXCI6IEpTT04uc3RyaW5naWZ5KHRydWUpYFxyXG4gKiBcclxuICogWW91IHdpbGwgZmluZCB0aGF0IGV2ZXJ5IEluc3RhbnQgR2FtZXMgQVBJIG1ldGhvZCBoYXMgYSBtYXBwaW5nIGluIHRoaXMgcGx1Z2luLlxyXG4gKiBGb3IgYSBmdWxsIGxpc3QgcGxlYXNlIGNvbnN1bHQgZWl0aGVyIHRoZSBwbHVnaW4gZG9jdW1lbnRhdGlvbiwgb3IgdGhlIDYuMiBTREsgZG9jdW1lbnRhdGlvblxyXG4gKiBhdCBodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvZ2FtZXMvaW5zdGFudC1nYW1lcy9zZGsvZmJpbnN0YW50Ni4yXHJcbiAqIFxyXG4gKiBJbnRlcm5hbGx5IHRoaXMgcGx1Z2luIHVzZXMgaXRzIG93biBEYXRhIE1hbmFnZXIgdG8gaGFuZGxlIHNlYW1sZXNzIHVzZXIgZGF0YSB1cGRhdGVzIGFuZCBwcm92aWRlc1xyXG4gKiBoYW5keSBmdW5jdGlvbnMgZm9yIGFkdmVydGlzZW1lbnQgZGlzcGxheWluZywgb3BlbmluZyBzaGFyZSBkaWFsb2dzLCBsb2dnaW5nLCBsZWFkZXJib2FyZHMsIHB1cmNoYXNlIEFQSSByZXF1ZXN0cyxcclxuICogbG9hZGVyIGludGVncmF0aW9uIGFuZCBtb3JlLlxyXG4gKiBcclxuICogVG8gZ2V0IHN0YXJ0ZWQgd2l0aCBGYWNlYm9vayBJbnN0YW50IEdhbWVzIHlvdSB3aWxsIG5lZWQgdG8gcmVnaXN0ZXIgb24gRmFjZWJvb2sgYW5kIGNyZWF0ZSBhIG5ldyBJbnN0YW50XHJcbiAqIEdhbWUgYXBwIHRoYXQgaGFzIGl0cyBvd24gdW5pcXVlIGFwcCBJRC4gRmFjZWJvb2sgaGF2ZSBhbHNvIHByb3ZpZGVkIGEgZGFzaGJvYXJkIGludGVyZmFjZSBmb3Igc2V0dGluZyB1cFxyXG4gKiB2YXJpb3VzIGZlYXR1cmVzIGZvciB5b3VyIGdhbWUsIGluY2x1ZGluZyBsZWFkZXJib2FyZHMsIGFkIHJlcXVlc3RzIGFuZCB0aGUgcGF5bWVudHMgQVBJLiBUaGVyZSBhcmUgbG90c1xyXG4gKiBvZiBndWlkZXMgb24gdGhlIEZhY2Vib29rIERldmVsb3BlcnMgcG9ydGFsIHRvIGFzc2lzdCB3aXRoIHNldHRpbmcgdGhlc2VcclxuICogdmFyaW91cyBzeXN0ZW1zIHVwOiBodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvZ2FtZXMvaW5zdGFudC1nYW1lcy9ndWlkZXNcclxuICogXHJcbiAqIEZvciBtb3JlIGRldGFpbHMgZm9sbG93IHRoZSBRdWljayBTdGFydCBndWlkZSBoZXJlOiBodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvZ2FtZXMvaW5zdGFudC1nYW1lc1xyXG4gKlxyXG4gKiBAY2xhc3MgRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW5cclxuICogQG1lbWJlck9mIFBoYXNlclxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBGYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHJlYWRPbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGdhbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgRGF0YSBNYW5hZ2VyIGluc3RhbmNlLlxyXG4gICAgICAgICAqIEl0IGFsbG93cyB5b3UgdG8gc3RvcmUsIHF1ZXJ5IGFuZCByZXRyaWV2ZSBhbnkga2V5L3ZhbHVlIGRhdGEgeW91IG1heSBuZWVkIHRvIHN0b3JlLlxyXG4gICAgICAgICAqIEl0J3MgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgdGhlIHBsdWdpbiB0byBzdG9yZSBGQklHIEFQSSBkYXRhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbignc2V0ZGF0YScsIHRoaXMuc2V0RGF0YUhhbmRsZXIsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMub24oJ2NoYW5nZWRhdGEnLCB0aGlzLmNoYW5nZURhdGFIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGFzIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIEFQSSBsb2FkZWQgeWV0P1xyXG4gICAgICAgICAqIFRoaXMgaXMgc2V0IGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBib290IHByb2Nlc3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jaGFzTG9hZGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGFzTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBEYXRhIE1hbmFnZXIgY3VycmVudGx5IGxvY2tlZD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNkYXRhTG9ja2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YUxvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgdGhlIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgQVBJcyB0aGF0IGFyZSBhdmFpbGFibGUsXHJcbiAgICAgICAgICogYmFzZWQgb24gdGhlIGdpdmVuIHBsYXRmb3JtLCBjb250ZXh0IGFuZCB1c2VyIHByaXZhY3kgc2V0dGluZ3MuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNzdXBwb3J0ZWRBUElzXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ1tdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN1cHBvcnRlZEFQSXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9sZHMgdGhlIGVudHJ5IHBvaW50IHRoYXQgdGhlIGdhbWUgd2FzIGxhdW5jaGVkIGZyb20uXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNlbnRyeVBvaW50XHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbnRyeVBvaW50ID0gJyc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgcG9pbnQgdGhhdCB0aGUgZ2FtZSB3YXMgbGF1bmNoZWQgZnJvbS5cclxuICAgICAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBhcmUgZGV2ZWxvcGVyLWRlZmluZWQsIGFuZCBjYW4gb2NjdXIgZnJvbSBlbnRyeSBwb2ludHMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy5cclxuICAgICAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIG51bGwgZm9yIG9sZGVyIG1vYmlsZSBjbGllbnRzLCBhcyB3ZWxsIGFzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnRpY3VsYXIgZW50cnkgcG9pbnQuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNlbnRyeVBvaW50RGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW50cnlQb2ludERhdGEgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBnYW1lIGNvbnRleHQuIFRoaXMgcmVwcmVzZW50cyBhIHNwZWNpZmljIGNvbnRleHRcclxuICAgICAgICAgKiB0aGF0IHRoZSBnYW1lIGlzIGJlaW5nIHBsYXllZCBpbiAoZm9yIGV4YW1wbGUsIGEgcGFydGljdWxhciBtZXNzZW5nZXIgY29udmVyc2F0aW9uIG9yIGZhY2Vib29rIHBvc3QpLlxyXG4gICAgICAgICAqIFRoZSBpZGVudGlmaWVyIHdpbGwgYmUgbnVsbCBpZiBnYW1lIGlzIGJlaW5nIHBsYXllZCBpbiBhIHNvbG8gY29udGV4dC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyBib290LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2NvbnRleHRJRFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29udGV4dElEID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgY29udGV4dCBpbiB3aGljaCB5b3VyIGdhbWUgaXMgcnVubmluZy4gVGhpcyBjYW4gYmUgZWl0aGVyIGBudWxsYCBvclxyXG4gICAgICAgICAqIG9uZSBvZjpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBgUE9TVGAgLSBUaGUgZ2FtZSBpcyBydW5uaW5nIGluc2lkZSBvZiBhIEZhY2Vib29rIHBvc3QuXHJcbiAgICAgICAgICogYFRIUkVBRGAgLSBUaGUgZ2FtZSBpcyBydW5uaW5nIGluc2lkZSBhIEZhY2Vib29rIE1lc3NlbmdlciB0aHJlYWQuXHJcbiAgICAgICAgICogYEdST1VQYCAtIFRoZSBnYW1lIGlzIHJ1bm5pbmcgaW5zaWRlIGEgRmFjZWJvb2sgR3JvdXAuXHJcbiAgICAgICAgICogYFNPTE9gIC0gVGhpcyBpcyB0aGUgZGVmYXVsdCBjb250ZXh0LCB0aGUgcGxheWVyIGlzIHRoZSBvbmx5IHBhcnRpY2lwYW50LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgcG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGJvb3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jY29udGV4dFR5cGVcclxuICAgICAgICAgKiBAdHlwZSB7P3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0VHlwZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IGxvY2FsZS5cclxuICAgICAgICAgKiBTZWUgaHR0cHM6Ly9vcmlnaW5jYWNoZS5mYWNlYm9vay5jb20vZGV2ZWxvcGVycy9yZXNvdXJjZXMvP2lkPUZhY2Vib29rTG9jYWxlcy54bWwgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgbG9jYWxlIHZhbHVlcy5cclxuICAgICAgICAgKiBVc2UgdGhpcyB0byBkZXRlcm1pbmUgd2hhdCBsYW5ndWFnZXMgdGhlIGN1cnJlbnQgZ2FtZSBzaG91bGQgYmUgbG9jYWxpemVkIHdpdGguXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNsb2NhbGVcclxuICAgICAgICAgKiBAdHlwZSB7P3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGdhbWUgaXMgY3VycmVudGx5IHJ1bm5pbmcsIGkuZS4gYElPU2AuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNwbGF0Zm9ybVxyXG4gICAgICAgICAqIEB0eXBlIHs/c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsYXRmb3JtID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBTREsgdmVyc2lvbiBiZWluZyB1c2VkLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgcG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGJvb3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jdmVyc2lvblxyXG4gICAgICAgICAqIEB0eXBlIHs/c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnNpb24gPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb2xkcyB0aGUgaWQgb2YgdGhlIHBsYXllci4gVGhpcyBpcyBhIHN0cmluZyBiYXNlZCBJRCwgdGhlIHNhbWUgYXMgYEZCSW5zdGFudC5wbGF5ZXIuZ2V0SUQoKWAuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdCBpZiB0aGUgQVBJIGlzIHN1cHBvcnRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNwbGF5ZXJJRFxyXG4gICAgICAgICAqIEB0eXBlIHs/c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsYXllcklEID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBsYXllcidzIGxvY2FsaXplZCBkaXNwbGF5IG5hbWUuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBwb3B1bGF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgYm9vdCBpZiB0aGUgQVBJIGlzIHN1cHBvcnRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNwbGF5ZXJOYW1lXHJcbiAgICAgICAgICogQHR5cGUgez9zdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGxheWVyTmFtZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdXJsIHRvIHRoZSBwbGF5ZXIncyBwdWJsaWMgcHJvZmlsZSBwaG90by4gVGhlIHBob3RvIHdpbGwgYWx3YXlzIGJlIGEgc3F1YXJlLCBhbmQgd2l0aCBkaW1lbnNpb25zXHJcbiAgICAgICAgICogb2YgYXQgbGVhc3QgMjAweDIwMC4gV2hlbiByZW5kZXJpbmcgaXQgaW4gdGhlIGdhbWUsIHRoZSBleGFjdCBkaW1lbnNpb25zIHNob3VsZCBuZXZlciBiZSBhc3N1bWVkIHRvIGJlIGNvbnN0YW50LlxyXG4gICAgICAgICAqIEl0J3MgcmVjb21tZW5kZWQgdG8gYWx3YXlzIHNjYWxlIHRoZSBpbWFnZSB0byBhIGRlc2lyZWQgc2l6ZSBiZWZvcmUgcmVuZGVyaW5nLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgcG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGJvb3QgaWYgdGhlIEFQSSBpcyBzdXBwb3J0ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jcGxheWVyUGhvdG9VUkxcclxuICAgICAgICAgKiBAdHlwZSB7P3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wbGF5ZXJQaG90b1VSTCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgYSBwbGF5ZXIgY2FuIHN1YnNjcmliZSB0byB0aGUgZ2FtZSBib3Qgb3Igbm90LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3BsYXllckNhblN1YnNjcmliZUJvdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsYXllckNhblN1YnNjcmliZUJvdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEb2VzIHRoZSBjdXJyZW50IHBsYXRmb3JtIGFuZCBjb250ZXh0IGFsbG93IGZvciB1c2Ugb2YgdGhlIHBheW1lbnRzIEFQST9cclxuICAgICAgICAgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBGYWNlYm9vay5jb20gYW5kIEFuZHJvaWQgNisuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jcGF5bWVudHNSZWFkeVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBheW1lbnRzUmVhZHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNldCBvZiBwcm9kdWN0cyB0aGF0IGFyZSByZWdpc3RlcmVkIHRvIHRoZSBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2NhdGFsb2dcclxuICAgICAgICAgKiBAdHlwZSB7UHJvZHVjdFtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhdGFsb2cgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udGFpbnMgYWxsIG9mIHRoZSBwbGF5ZXIncyB1bmNvbnN1bWVkIHB1cmNoYXNlcy5cclxuICAgICAgICAgKiBUaGUgZ2FtZSBtdXN0IGZldGNoIHRoZSBjdXJyZW50IHBsYXllcidzIHB1cmNoYXNlcyBhcyBzb29uIGFzIHRoZSBjbGllbnQgaW5kaWNhdGVzIHRoYXQgaXQgaXMgcmVhZHkgdG8gcGVyZm9ybSBwYXltZW50cy1yZWxhdGVkIG9wZXJhdGlvbnMsXHJcbiAgICAgICAgICogaS5lLiBhdCBnYW1lIHN0YXJ0LiBUaGUgZ2FtZSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBjb25zdW1lIGFueSBwdXJjaGFzZXMgdGhhdCBhcmUgd2FpdGluZyB0byBiZSBjb25zdW1lZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNwdXJjaGFzZXNcclxuICAgICAgICAgKiBAdHlwZSB7UHVyY2hhc2VbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wdXJjaGFzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udGFpbnMgYWxsIG9mIHRoZSBsZWFkZXJib2FyZCBkYXRhLCBhcyBwb3B1bGF0ZWQgYnkgdGhlIGBnZXRMZWFkZXJib2FyZCgpYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jbGVhZGVyYm9hcmRzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc0xlYWRlcmJvYXJkW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGVhZGVyYm9hcmRzID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnRhaW5zIEFkSW5zdGFuY2Ugb2JqZWN0cywgYXMgY3JlYXRlZCBieSB0aGUgYHByZWxvYWRBZHMoKWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2Fkc1xyXG4gICAgICAgICAqIEB0eXBlIHtBZEluc3RhbmNlW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWRzID0gW107XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgc2V0IGRhdGEgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNzZXREYXRhSGFuZGxlclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5EYXRhLkRhdGFNYW5hZ2VyfSBwYXJlbnQgLSBUaGUgcGFyZW50IERhdGEgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBkYXRhLlxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBkYXRhLlxyXG4gICAgICovXHJcbiAgICBzZXREYXRhSGFuZGxlcjogZnVuY3Rpb24gKHBhcmVudCwga2V5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhTG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuc2V0RGF0YUFzeW5jKGRhdGEpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3NhdmVkYXRhJywgZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgY2hhbmdlIGRhdGEgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjaGFuZ2VEYXRhSGFuZGxlclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5EYXRhLkRhdGFNYW5hZ2VyfSBwYXJlbnQgLSBUaGUgcGFyZW50IERhdGEgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBkYXRhLlxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBkYXRhLlxyXG4gICAgICovXHJcbiAgICBjaGFuZ2VEYXRhSGFuZGxlcjogZnVuY3Rpb24gKHBhcmVudCwga2V5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhTG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcclxuXHJcbiAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuc2V0RGF0YUFzeW5jKGRhdGEpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3NhdmVkYXRhJywgZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbCB0aGlzIG1ldGhvZCBmcm9tIHlvdXIgYFNjZW5lLnByZWxvYWRgIGluIG9yZGVyIHRvIHN5bmMgdGhlIGxvYWQgcHJvZ3Jlc3NcclxuICAgICAqIG9mIHRoZSBQaGFzZXIgTG9hZGVyIHdpdGggdGhlIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgbG9hZGVyIGRpc3BsYXksIGkuZS46XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuZmFjZWJvb2suc2hvd0xvYWRQcm9ncmVzcyh0aGlzKTtcclxuICAgICAqIHRoaXMuZmFjZWJvb2sub25jZSgnc3RhcnRnYW1lJywgdGhpcy5zdGFydEdhbWUsIHRoaXMpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jc2hvd0xvYWRQcm9ncmVzc1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gc2hvdyBsb2FkZXIgcHJvZ3Jlc3MgZm9yLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzaG93TG9hZFByb2dyZXNzOiBmdW5jdGlvbiAoc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgc2NlbmUubG9hZC5vbigncHJvZ3Jlc3MnLCBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzTG9hZGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBGQkluc3RhbnQuc2V0TG9hZGluZ1Byb2dyZXNzKHZhbHVlICogMTAwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCB0aGlzKTtcclxuXHJcbiAgICAgICAgc2NlbmUubG9hZC5vbignY29tcGxldGUnLCBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0xvYWRlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIEZCSW5zdGFudC5zdGFydEdhbWVBc3luYygpLnRoZW4odGhpcy5nYW1lU3RhcnRlZEhhbmRsZXIuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGdhbWUgaGFzIGZpbmlzaGVkIGxvYWRpbmcsXHJcbiAgICAgKiBpZiB5b3UgdXNlZCB0aGUgYHNob3dMb2FkUHJvZ3Jlc3NgIG1ldGhvZC4gSWYgeW91ciBnYW1lIGRvZXNuJ3QgbmVlZCB0b1xyXG4gICAgICogbG9hZCBhbnkgYXNzZXRzLCBvciB5b3UncmUgbWFuYWdpbmcgdGhlIGxvYWQgeW91cnNlbGYsIHRoZW4gY2FsbCB0aGlzXHJcbiAgICAgKiBtZXRob2QgZGlyZWN0bHkgdG8gc3RhcnQgdGhlIEFQSSBydW5uaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoZSBBUEkgaGFzIGZpbmlzaGVkIHN0YXJ0aW5nIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCBhIGBzdGFydGdhbWVgIGV2ZW50XHJcbiAgICAgKiB3aGljaCB5b3Ugc2hvdWxkIGxpc3RlbiBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jZ2FtZVN0YXJ0ZWRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqL1xyXG4gICAgZ2FtZVN0YXJ0ZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0xvYWRlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIEZCSW5zdGFudC5zdGFydEdhbWVBc3luYygpLnRoZW4odGhpcy5nYW1lU3RhcnRlZEhhbmRsZXIuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2FtZVN0YXJ0ZWRIYW5kbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnRlcm5hbCBnYW1lU3RhcnRlZCBoYW5kbGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnYW1lU3RhcnRlZEhhbmRsZXJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKi9cclxuICAgIGdhbWVTdGFydGVkSGFuZGxlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgQVBJcyA9IEZCSW5zdGFudC5nZXRTdXBwb3J0ZWRBUElzKCk7XHJcblxyXG4gICAgICAgIHZhciBzdXBwb3J0ZWQgPSB7fTtcclxuXHJcbiAgICAgICAgdmFyIGRvdFRvVXBwZXIgPSBmdW5jdGlvbiAobWF0Y2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udG9VcHBlckNhc2UoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBBUElzLmZvckVhY2goZnVuY3Rpb24gKGFwaSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFwaSA9IGFwaS5yZXBsYWNlKC9cXC4uL2csIGRvdFRvVXBwZXIpO1xyXG5cclxuICAgICAgICAgICAgc3VwcG9ydGVkW2FwaV0gPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1cHBvcnRlZEFQSXMgPSBzdXBwb3J0ZWQ7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0SUQoKTtcclxuICAgICAgICB0aGlzLmdldFR5cGUoKTtcclxuICAgICAgICB0aGlzLmdldExvY2FsZSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0UGxhdGZvcm0oKTtcclxuICAgICAgICB0aGlzLmdldFNES1ZlcnNpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRQbGF5ZXJJRCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0UGxheWVyTmFtZSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0UGxheWVyUGhvdG9VUkwoKTtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50Lm9uUGF1c2UoZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3BhdXNlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5nZXRFbnRyeVBvaW50QXN5bmMoKS50aGVuKGZ1bmN0aW9uIChlbnRyeXBvaW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW50cnlQb2ludCA9IGVudHJ5cG9pbnQ7XHJcbiAgICAgICAgICAgIF90aGlzLmVudHJ5UG9pbnREYXRhID0gRkJJbnN0YW50LmdldEVudHJ5UG9pbnREYXRhKCk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdzdGFydGdhbWUnKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vICBGYWNlYm9vay5jb20gYW5kIEFuZHJvaWQgNiBvbmx5XHJcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydGVkQVBJcy5wYXltZW50c1B1cmNoYXNlQXN5bmMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGQkluc3RhbnQucGF5bWVudHMub25SZWFkeShmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wYXltZW50c1JlYWR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGEgZ2l2ZW4gRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBBUEkgaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjaGVja0FQSVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpIC0gVGhlIEFQSSB0byBjaGVjayBmb3IsIGkuZS4gYHBsYXllci5nZXRJRGAuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgQVBJIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrQVBJOiBmdW5jdGlvbiAoYXBpKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0ZWRBUElzW2FwaV0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZ2FtZSBjb250ZXh0LiBUaGlzIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBjb250ZXh0XHJcbiAgICAgKiB0aGF0IHRoZSBnYW1lIGlzIGJlaW5nIHBsYXllZCBpbiAoZm9yIGV4YW1wbGUsIGEgcGFydGljdWxhciBtZXNzZW5nZXIgY29udmVyc2F0aW9uIG9yIGZhY2Vib29rIHBvc3QpLlxyXG4gICAgICogVGhlIGlkZW50aWZpZXIgd2lsbCBiZSBudWxsIGlmIGdhbWUgaXMgYmVpbmcgcGxheWVkIGluIGEgc29sbyBjb250ZXh0LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBpcyBvbmx5IHBvcHVsYXRlZCBpZiBgY29udGV4dEdldElEYCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgQVBJcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRJRFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZXh0IElELlxyXG4gICAgICovXHJcbiAgICBnZXRJRDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGV4dElEICYmIHRoaXMuc3VwcG9ydGVkQVBJcy5jb250ZXh0R2V0SUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRJRCA9IEZCSW5zdGFudC5jb250ZXh0LmdldElEKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0SUQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IGluIHdoaWNoIHlvdXIgZ2FtZSBpcyBydW5uaW5nLiBUaGlzIGNhbiBiZSBlaXRoZXIgYG51bGxgIG9yIG9uZSBvZjpcclxuICAgICAqIFxyXG4gICAgICogYFBPU1RgIC0gVGhlIGdhbWUgaXMgcnVubmluZyBpbnNpZGUgb2YgYSBGYWNlYm9vayBwb3N0LlxyXG4gICAgICogYFRIUkVBRGAgLSBUaGUgZ2FtZSBpcyBydW5uaW5nIGluc2lkZSBhIEZhY2Vib29rIE1lc3NlbmdlciB0aHJlYWQuXHJcbiAgICAgKiBgR1JPVVBgIC0gVGhlIGdhbWUgaXMgcnVubmluZyBpbnNpZGUgYSBGYWNlYm9vayBHcm91cC5cclxuICAgICAqIGBTT0xPYCAtIFRoaXMgaXMgdGhlIGRlZmF1bHQgY29udGV4dCwgdGhlIHBsYXllciBpcyB0aGUgb25seSBwYXJ0aWNpcGFudC5cclxuICAgICAqIFxyXG4gICAgICogSXQgaXMgb25seSBwb3B1bGF0ZWQgaWYgYGNvbnRleHRHZXRUeXBlYCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgQVBJcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRUeXBlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBjb250ZXh0IHR5cGUuXHJcbiAgICAgKi9cclxuICAgIGdldFR5cGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRUeXBlICYmIHRoaXMuc3VwcG9ydGVkQVBJcy5jb250ZXh0R2V0VHlwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFR5cGUgPSBGQkluc3RhbnQuY29udGV4dC5nZXRUeXBlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0VHlwZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvY2FsZS5cclxuICAgICAqIFNlZSBodHRwczovL29yaWdpbmNhY2hlLmZhY2Vib29rLmNvbS9kZXZlbG9wZXJzL3Jlc291cmNlcy8/aWQ9RmFjZWJvb2tMb2NhbGVzLnhtbCBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBsb2NhbGUgdmFsdWVzLlxyXG4gICAgICogVXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoYXQgbGFuZ3VhZ2VzIHRoZSBjdXJyZW50IGdhbWUgc2hvdWxkIGJlIGxvY2FsaXplZCB3aXRoLlxyXG4gICAgICogSXQgaXMgb25seSBwb3B1bGF0ZWQgaWYgYGdldExvY2FsZWAgaXMgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jZ2V0TG9jYWxlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBjdXJyZW50IGxvY2FsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TG9jYWxlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5sb2NhbGUgJiYgdGhpcy5zdXBwb3J0ZWRBUElzLmdldExvY2FsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxlID0gRkJJbnN0YW50LmdldExvY2FsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBnYW1lIGlzIGN1cnJlbnRseSBydW5uaW5nLCBpLmUuIGBJT1NgLlxyXG4gICAgICogSXQgaXMgb25seSBwb3B1bGF0ZWQgaWYgYGdldFBsYXRmb3JtYCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgQVBJcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRQbGF0Zm9ybVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgY3VycmVudCBwbGF0Zm9ybS5cclxuICAgICAqL1xyXG4gICAgZ2V0UGxhdGZvcm06IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtICYmIHRoaXMuc3VwcG9ydGVkQVBJcy5nZXRQbGF0Zm9ybSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm0gPSBGQkluc3RhbnQuZ2V0UGxhdGZvcm0oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXRmb3JtO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBTREsgdmVyc2lvbiBiZWluZyB1c2VkLlxyXG4gICAgICogSXQgaXMgb25seSBwb3B1bGF0ZWQgaWYgYGdldFNES1ZlcnNpb25gIGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2dldFNES1ZlcnNpb25cclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7P3N0cmluZ30gVGhlIHNkayB2ZXJzaW9uLlxyXG4gICAgICovXHJcbiAgICBnZXRTREtWZXJzaW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy52ZXJzaW9uICYmIHRoaXMuc3VwcG9ydGVkQVBJcy5nZXRTREtWZXJzaW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gRkJJbnN0YW50LmdldFNES1ZlcnNpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHBsYXllci4gVGhpcyBpcyBhIHN0cmluZyBiYXNlZCBJRCwgdGhlIHNhbWUgYXMgYEZCSW5zdGFudC5wbGF5ZXIuZ2V0SUQoKWAuXHJcbiAgICAgKiBJdCBpcyBvbmx5IHBvcHVsYXRlZCBpZiBgcGxheWVyR2V0SURgIGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2dldFBsYXllcklEXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBwbGF5ZXIgSUQuXHJcbiAgICAgKi9cclxuICAgIGdldFBsYXllcklEOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wbGF5ZXJJRCAmJiB0aGlzLnN1cHBvcnRlZEFQSXMucGxheWVyR2V0SUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXllcklEID0gRkJJbnN0YW50LnBsYXllci5nZXRJRCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVySUQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGxheWVyJ3MgbG9jYWxpemVkIGRpc3BsYXkgbmFtZS5cclxuICAgICAqIEl0IGlzIG9ubHkgcG9wdWxhdGVkIGlmIGBwbGF5ZXJHZXROYW1lYCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgQVBJcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRQbGF5ZXJOYW1lXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBwbGF5ZXIncyBsb2NhbGl6ZWQgZGlzcGxheSBuYW1lLlxyXG4gICAgICovXHJcbiAgICBnZXRQbGF5ZXJOYW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wbGF5ZXJOYW1lICYmIHRoaXMuc3VwcG9ydGVkQVBJcy5wbGF5ZXJHZXROYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wbGF5ZXJOYW1lID0gRkJJbnN0YW50LnBsYXllci5nZXROYW1lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJOYW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHVybCB0byB0aGUgcGxheWVyJ3MgcHVibGljIHByb2ZpbGUgcGhvdG8uIFRoZSBwaG90byB3aWxsIGFsd2F5cyBiZSBhIHNxdWFyZSwgYW5kIHdpdGggZGltZW5zaW9uc1xyXG4gICAgICogb2YgYXQgbGVhc3QgMjAweDIwMC4gV2hlbiByZW5kZXJpbmcgaXQgaW4gdGhlIGdhbWUsIHRoZSBleGFjdCBkaW1lbnNpb25zIHNob3VsZCBuZXZlciBiZSBhc3N1bWVkIHRvIGJlIGNvbnN0YW50LlxyXG4gICAgICogSXQncyByZWNvbW1lbmRlZCB0byBhbHdheXMgc2NhbGUgdGhlIGltYWdlIHRvIGEgZGVzaXJlZCBzaXplIGJlZm9yZSByZW5kZXJpbmcuXHJcbiAgICAgKiBJdCBpcyBvbmx5IHBvcHVsYXRlZCBpZiBgcGxheWVyR2V0UGhvdG9gIGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2dldFBsYXllclBob3RvVVJMXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBwbGF5ZXIncyBwaG90byB1cmwuXHJcbiAgICAgKi9cclxuICAgIGdldFBsYXllclBob3RvVVJMOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wbGF5ZXJQaG90b1VSTCAmJiB0aGlzLnN1cHBvcnRlZEFQSXMucGxheWVyR2V0UGhvdG8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXllclBob3RvVVJMID0gRkJJbnN0YW50LnBsYXllci5nZXRQaG90bygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyUGhvdG9VUkw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgcGxheWVyJ3MgcGhvdG8gYW5kIHN0b3JlIGl0IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIsIHJlYWR5IGZvciB1c2UgaW4tZ2FtZS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2Qgd29ya3MgYnkgdXNpbmcgYSBTY2VuZSBMb2FkZXIgaW5zdGFuY2UgYW5kIHRoZW4gYXNraW5nIHRoZSBMb2FkZXIgdG9cclxuICAgICAqIHJldHJpZXZlIHRoZSBpbWFnZS5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiBjb21wbGV0ZSB0aGUgcGx1Z2luIHdpbGwgZW1pdCBhIGBwaG90b2NvbXBsZXRlYCBldmVudCwgYWxvbmcgd2l0aCB0aGUga2V5IG9mIHRoZSBwaG90by5cclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5mYWNlYm9vay5sb2FkUGxheWVyUGhvdG8odGhpcywgJ3BsYXllcicpLm9uY2UoJ3Bob3RvY29tcGxldGUnLCBmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgKiAgIHRoaXMuYWRkLmltYWdlKHgsIHksICdwbGF5ZXInKTtcclxuICAgICAqIH0sIHRoaXMpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jbG9hZFBsYXllclBob3RvXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhpcyBwaG90by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHVzZSB3aGVuIHN0b3JpbmcgdGhlIHBob3RvIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGxvYWRQbGF5ZXJQaG90bzogZnVuY3Rpb24gKHNjZW5lLCBrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGxheWVyUGhvdG9VUkwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZS5sb2FkLnNldENPUlMoJ2Fub255bW91cycpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHNjZW5lLmxvYWQuaW1hZ2Uoa2V5LCB0aGlzLnBsYXllclBob3RvVVJMKTtcclxuICAgIFxyXG4gICAgICAgICAgICBzY2VuZS5sb2FkLm9uY2UoJ2ZpbGVjb21wbGV0ZS1pbWFnZS0nICsga2V5LCBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Bob3RvY29tcGxldGUnLCBrZXkpO1xyXG5cclxuICAgICAgICAgICAgfSwgdGhpcyk7XHJcbiAgICBcclxuICAgICAgICAgICAgc2NlbmUubG9hZC5zdGFydCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHBsYXllciBjYW4gc3Vic2NyaWJlIHRvIHRoZSBnYW1lIGJvdC5cclxuICAgICAqIFxyXG4gICAgICogSXQgbWFrZXMgYW4gYXN5bmMgY2FsbCB0byB0aGUgQVBJLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBjYW4gc3Vic2NyaWJlLCB0aGUgYHBsYXllckNhblN1YnNjcmliZUJvdGAgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYFxyXG4gICAgICogYW5kIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYGNhbnN1YnNjcmliZWJvdGAgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgY2Fubm90LCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdFxyXG4gICAgICogd2FzIHJlamVjdGVkLCBpdCB3aWxsIGVtaXQgYSBgY2Fuc3Vic2NyaWJlYm90ZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjYW5TdWJzY3JpYmVCb3RcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgY2FuU3Vic2NyaWJlQm90OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRlZEFQSXMucGxheWVyQ2FuU3Vic2NyaWJlQm90QXN5bmMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgRkJJbnN0YW50LnBsYXllci5jYW5TdWJzY3JpYmVCb3RBc3luYygpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMucGxheWVyQ2FuU3Vic2NyaWJlQm90ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdjYW5zdWJzY3JpYmVib3QnKTtcclxuXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdjYW5zdWJzY3JpYmVib3RmYWlsJywgZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2NhbnN1YnNjcmliZWJvdGZhaWwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnNjcmliZXMgdGhlIGN1cnJlbnQgcGxheWVyIHRvIHRoZSBnYW1lIGJvdC5cclxuICAgICAqIFxyXG4gICAgICogSXQgbWFrZXMgYW4gYXN5bmMgY2FsbCB0byB0aGUgQVBJLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBhcmUgc3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgdGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgc3Vic2NyaWJlYm90YCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBjYW5ub3QsIGkuZS4gaXQncyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMsIG9yIHRoZSByZXF1ZXN0XHJcbiAgICAgKiB3YXMgcmVqZWN0ZWQsIGl0IHdpbGwgZW1pdCBhIGBzdWJzY3JpYmVib3RmYWlsYCBldmVudCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3N1YnNjcmliZUJvdFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdWJzY3JpYmVCb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGxheWVyQ2FuU3Vic2NyaWJlQm90KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuc3Vic2NyaWJlQm90QXN5bmMoKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ3N1YnNjcmliZWJvdCcpO1xyXG5cclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ3N1YnNjcmliZWJvdGZhaWwnLCBlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3Vic2NyaWJlYm90ZmFpbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBkYXRhIGZyb20gdGhlIHBsYXllciBiYXNlZCBvbiB0aGUgZ2l2ZW4ga2V5LCBvciBhcnJheSBvZiBrZXlzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBpcyByZXF1ZXN0ZWQgaW4gYW4gYXN5bmMgY2FsbCwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzIHRoZSBkYXRhIGlzIHNldCBpbnRvIHRoaXMgcGx1Z2lucyBEYXRhIE1hbmFnZXIgYW5kIHRoZVxyXG4gICAgICogYGdldGRhdGFgIGV2ZW50IHdpbGwgYmUgZW1pdHRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXREYXRhXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgLSBUaGUga2V5L3Mgb2YgdGhlIGRhdGEgdG8gcmV0cmlldmUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGdldERhdGE6IGZ1bmN0aW9uIChrZXlzKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgncGxheWVyR2V0RGF0YUFzeW5jJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleXMgPSBbIGtleXMgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuZ2V0RGF0YUFzeW5jKGtleXMpLnRoZW4oZnVuY3Rpb24gKGRhdGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTG9ja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF90aGlzLmRhdGFMb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldGRhdGEnLCBkYXRhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGRhdGEgdG8gYmUgc2F2ZWQgdG8gdGhlIGRlc2lnbmF0ZWQgY2xvdWQgc3RvcmFnZSBvZiB0aGUgY3VycmVudCBwbGF5ZXIuIFRoZSBnYW1lIGNhbiBzdG9yZSB1cCB0byAxTUIgb2YgZGF0YSBmb3IgZWFjaCB1bmlxdWUgcGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBzYXZlIGlzIHJlcXVlc3RlZCBpbiBhbiBhc3luYyBjYWxsLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogRGF0YSBtYW5hZ2VkIHZpYSB0aGlzIHBsdWdpbnMgRGF0YSBNYW5hZ2VyIGluc3RhbmNlIGlzIGF1dG9tYXRpY2FsbHkgc3luY2VkIHdpdGggRmFjZWJvb2suIEhvd2V2ZXIsIHlvdSBjYW4gY2FsbCB0aGlzXHJcbiAgICAgKiBtZXRob2QgZGlyZWN0bHkgaWYgeW91IG5lZWQgdG8gcmVwbGFjZSB0aGUgZGF0YSBvYmplY3QgZGlyZWN0bHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIEFQSXMgYHNldERhdGFBc3luY2AgY2FsbCByZXNvbHZlcyBpdCB3aWxsIGVtaXQgdGhlIGBzYXZlZGF0YWAgZXZlbnQgZnJvbSB0aGlzIHBsdWdpbi4gSWYgdGhlIGNhbGwgZmFpbHMgZm9yIHNvbWVcclxuICAgICAqIHJlYXNvbiBpdCB3aWxsIGVtaXQgYHNhdmVkYXRhZmFpbGAgaW5zdGVhZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGNhbGwgcmVzb2x2aW5nIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwZXJzaXN0ZWQuIFJhdGhlciwgaXQgbWVhbnMgdGhhdCB0aGUgZGF0YSB3YXMgdmFsaWQgYW5kXHJcbiAgICAgKiBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gYmUgc2F2ZWQuIEl0IGFsc28gZ3VhcmFudGVlcyB0aGF0IGFsbCB2YWx1ZXMgdGhhdCB3ZXJlIHNldCBhcmUgbm93IGF2YWlsYWJsZSBpbiBgZ2V0RGF0YWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jc2F2ZURhdGFcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgdGhhdCBzaG91bGQgYmUgcGVyc2lzdGVkIHRvIGNsb3VkIHN0b3JhZ2UuXHJcbiAgICAgKiBUaGUgb2JqZWN0IG11c3QgY29udGFpbiBvbmx5IHNlcmlhbGl6YWJsZSB2YWx1ZXMgLSBhbnkgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSB0aGUgZW50aXJlIG1vZGlmaWNhdGlvbiB0byBiZSByZWplY3RlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2F2ZURhdGE6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgncGxheWVyU2V0RGF0YUFzeW5jJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuc2V0RGF0YUFzeW5jKGRhdGEpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3NhdmVkYXRhJywgZGF0YSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnc2F2ZWRhdGFmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltbWVkaWF0ZWx5IGZsdXNoZXMgYW55IGNoYW5nZXMgdG8gdGhlIHBsYXllciBkYXRhIHRvIHRoZSBkZXNpZ25hdGVkIGNsb3VkIHN0b3JhZ2UuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVuc2l2ZSwgYW5kIHNob3VsZCBwcmltYXJpbHkgYmUgdXNlZCBmb3IgY3JpdGljYWwgY2hhbmdlcyB3aGVyZSBwZXJzaXN0ZW5jZSBuZWVkcyB0byBiZSBpbW1lZGlhdGVcclxuICAgICAqIGFuZCBrbm93biBieSB0aGUgZ2FtZS4gTm9uLWNyaXRpY2FsIGNoYW5nZXMgc2hvdWxkIHJlbHkgb24gdGhlIHBsYXRmb3JtIHRvIHBlcnNpc3QgdGhlbSBpbiB0aGUgYmFja2dyb3VuZC5cclxuICAgICAqIE5PVEU6IENhbGxzIHRvIHBsYXllci5zZXREYXRhQXN5bmMgd2lsbCBiZSByZWplY3RlZCB3aGlsZSB0aGlzIGZ1bmN0aW9uJ3MgcmVzdWx0IGlzIHBlbmRpbmcuXHJcbiAgICAgKiBcclxuICAgICAqIERhdGEgbWFuYWdlZCB2aWEgdGhpcyBwbHVnaW5zIERhdGEgTWFuYWdlciBpbnN0YW5jZSBpcyBhdXRvbWF0aWNhbGx5IHN5bmNlZCB3aXRoIEZhY2Vib29rLiBIb3dldmVyLCB5b3UgY2FuIGNhbGwgdGhpc1xyXG4gICAgICogbWV0aG9kIGRpcmVjdGx5IGlmIHlvdSBuZWVkIHRvIGZsdXNoIHRoZSBkYXRhIGRpcmVjdGx5LlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoZSBBUElzIGBmbHVzaERhdGFBc3luY2AgY2FsbCByZXNvbHZlcyBpdCB3aWxsIGVtaXQgdGhlIGBmbHVzaGRhdGFgIGV2ZW50IGZyb20gdGhpcyBwbHVnaW4uIElmIHRoZSBjYWxsIGZhaWxzIGZvciBzb21lXHJcbiAgICAgKiByZWFzb24gaXQgd2lsbCBlbWl0IGBmbHVzaGRhdGFmYWlsYCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2ZsdXNoRGF0YVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBmbHVzaERhdGE6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQVBJKCdwbGF5ZXJGbHVzaERhdGFBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQucGxheWVyLmZsdXNoRGF0YUFzeW5jKCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnZmx1c2hkYXRhJyk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnZmx1c2hkYXRhZmFpbCcsIGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZSBzdGF0cyBmcm9tIHRoZSBkZXNpZ25hdGVkIGNsb3VkIHN0b3JhZ2Ugb2YgdGhlIGN1cnJlbnQgcGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBpcyByZXF1ZXN0ZWQgaW4gYW4gYXN5bmMgY2FsbCwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzIHRoZSBgZ2V0c3RhdHNgIGV2ZW50IHdpbGwgYmUgZW1pdHRlZCBhbG9uZyB3aXRoIHRoZSBkYXRhIG9iamVjdCByZXR1cm5lZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGNhbGwgZmFpbHMsIGkuZS4gaXQncyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMsIG9yIHRoZSByZXF1ZXN0IHdhcyByZWplY3RlZCxcclxuICAgICAqIGl0IHdpbGwgZW1pdCBhIGBnZXRzdGF0c2ZhaWxgIGV2ZW50IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jZ2V0U3RhdHNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXNdIC0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgdW5pcXVlIGtleXMgdG8gcmV0cmlldmUgc3RhdHMgZm9yLiBJZiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgaXQsIGl0IHdpbGwgZmV0Y2ggYWxsIHN0YXRzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBnZXRTdGF0czogZnVuY3Rpb24gKGtleXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQVBJKCdwbGF5ZXJHZXRTdGF0c0FzeW5jJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuZ2V0U3RhdHNBc3luYyhrZXlzKS50aGVuKGZ1bmN0aW9uIChkYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnZ2V0c3RhdHMnLCBkYXRhKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdnZXRzdGF0c2ZhaWwnLCBlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F2ZSB0aGUgc3RhdHMgb2YgdGhlIGN1cnJlbnQgcGxheWVyIHRvIHRoZSBkZXNpZ25hdGVkIGNsb3VkIHN0b3JhZ2UuXHJcbiAgICAgKiBcclxuICAgICAqIFN0YXRzIGluIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIEFQSSBhcmUgcHVyZWx5IG51bWVyaWNhbCB2YWx1ZXMgcGFpcmVkIHdpdGggYSBzdHJpbmctYmFzZWQga2V5LiBPbmx5IG51bWJlcnMgY2FuIGJlIHNhdmVkIGFzIHN0YXRzLFxyXG4gICAgICogYWxsIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBpZ25vcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBpcyByZXF1ZXN0ZWQgaW4gYW4gYXN5bmMgY2FsbCwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzIHRoZSBgc2F2ZXN0YXRzYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQgYWxvbmcgd2l0aCB0aGUgZGF0YSBvYmplY3QgcmV0dXJuZWQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBjYWxsIGZhaWxzLCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdCB3YXMgcmVqZWN0ZWQsXHJcbiAgICAgKiBpdCB3aWxsIGVtaXQgYSBgc2F2ZXN0YXRzZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNzYXZlU3RhdHNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgdGhhdCBzaG91bGQgYmUgcGVyc2lzdGVkIHRvIGNsb3VkIHN0b3JhZ2UgYXMgc3RhdHMuIE5vdGUgdGhhdCBvbmx5IG51bWVyaWNhbCB2YWx1ZXMgYXJlIHN0b3JlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2F2ZVN0YXRzOiBmdW5jdGlvbiAoZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ3BsYXllclNldFN0YXRzQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtrZXldID09PSAnbnVtYmVyJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBkYXRhW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wbGF5ZXIuc2V0U3RhdHNBc3luYyhvdXRwdXQpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3NhdmVzdGF0cycsIG91dHB1dCk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnc2F2ZXN0YXRzZmFpbCcsIGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNyZW1lbnQgdGhlIHN0YXRzIG9mIHRoZSBjdXJyZW50IHBsYXllciBhbmQgc2F2ZSB0aGVtIHRvIHRoZSBkZXNpZ25hdGVkIGNsb3VkIHN0b3JhZ2UuXHJcbiAgICAgKiBcclxuICAgICAqIFN0YXRzIGluIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIEFQSSBhcmUgcHVyZWx5IG51bWVyaWNhbCB2YWx1ZXMgcGFpcmVkIHdpdGggYSBzdHJpbmctYmFzZWQga2V5LiBPbmx5IG51bWJlcnMgY2FuIGJlIHNhdmVkIGFzIHN0YXRzLFxyXG4gICAgICogYWxsIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBpZ25vcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBvYmplY3QgcHJvdmlkZWQgZm9yIHRoaXMgY2FsbCBzaG91bGQgY29udGFpbiBvZmZzZXRzIGZvciBob3cgbXVjaCB0byBtb2RpZnkgdGhlIHN0YXRzIGJ5OlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmZhY2Vib29rLmluY1N0YXRzKHtcclxuICAgICAqICAgICBsZXZlbDogMSxcclxuICAgICAqICAgICB6b21iaWVzU2xhaW46IDE3LFxyXG4gICAgICogICAgIHJhbms6IC0xXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBpcyByZXF1ZXN0ZWQgaW4gYW4gYXN5bmMgY2FsbCwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzIHRoZSBgaW5jc3RhdHNgIGV2ZW50IHdpbGwgYmUgZW1pdHRlZCBhbG9uZyB3aXRoIHRoZSBkYXRhIG9iamVjdCByZXR1cm5lZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGNhbGwgZmFpbHMsIGkuZS4gaXQncyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMsIG9yIHRoZSByZXF1ZXN0IHdhcyByZWplY3RlZCxcclxuICAgICAqIGl0IHdpbGwgZW1pdCBhIGBpbmNzdGF0c2ZhaWxgIGV2ZW50IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jaW5jU3RhdHNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgaW5kaWNhdGluZyBob3cgbXVjaCB0byBpbmNyZW1lbnQgZWFjaCBzdGF0IGluIGNsb3VkIHN0b3JhZ2UuIE5vdGUgdGhhdCBvbmx5IG51bWVyaWNhbCB2YWx1ZXMgYXJlIHByb2Nlc3NlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgaW5jU3RhdHM6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgncGxheWVySW5jcmVtZW50U3RhdHNBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgb3V0cHV0ID0ge307XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2tleV0gPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRba2V5XSA9IGRhdGFba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50LnBsYXllci5pbmNyZW1lbnRTdGF0c0FzeW5jKG91dHB1dCkudGhlbihmdW5jdGlvbiAoc3RhdHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdpbmNzdGF0cycsIHN0YXRzKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdpbmNzdGF0c2ZhaWwnLCBlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGl2aWR1YWwgZ2FtZXBsYXkgc2Vzc2lvbiBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBnYW1lIHdvdWxkIGxpa2UgdG8gdXBkYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBzZXNzaW9uIGRhdGEgbWF5IGJlIHVzZWQgdG8gcG9wdWxhdGUgYSB2YXJpZXR5IG9mIHBheWxvYWRzLCBzdWNoIGFzIGdhbWUgcGxheSB3ZWJob29rcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNzYXZlU2Vzc2lvblxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFuIGFyYml0cmFyeSBkYXRhIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAwMCBjaGFyYWN0ZXJzIHdoZW4gc3RyaW5naWZpZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNhdmVTZXNzaW9uOiBmdW5jdGlvbiAoZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ3NldFNlc3Npb25EYXRhJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0ZXN0ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmICh0ZXN0Lmxlbmd0aCA8PSAxMDAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRkJJbnN0YW50LnNldFNlc3Npb25EYXRhKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Nlc3Npb24gZGF0YSB0b28gbG9uZy4gTWF4IDEwMDAgY2hhcnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGludm9rZXMgYSBkaWFsb2cgdG8gbGV0IHRoZSB1c2VyIHNoYXJlIHNwZWNpZmllZCBjb250ZW50LCBlaXRoZXIgYXMgYSBtZXNzYWdlIGluIE1lc3NlbmdlciBvciBhcyBhIHBvc3Qgb24gdGhlIHVzZXIncyB0aW1lbGluZS5cclxuICAgICAqIFxyXG4gICAgICogQSBibG9iIG9mIGRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBzaGFyZSB3aGljaCBldmVyeSBnYW1lIHNlc3Npb24gbGF1bmNoZWQgZnJvbSB0aGUgc2hhcmUgd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB2aWEgdGhlIGB0aGlzLmVudHJ5UG9pbnREYXRhYCBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBkYXRhIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwMDAgY2hhcmFjdGVycyB3aGVuIHN0cmluZ2lmaWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHlvdXIgZ2FtZSBwYXVzZWQuIExpc3RlbiBvdXQgZm9yIHRoZSBgcmVzdW1lYCBldmVudCBmcm9tIHRoaXMgcGx1Z2luIHRvIGtub3cgd2hlbiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHVzZXIgbWF5IGNob29zZSB0byBjYW5jZWwgdGhlIHNoYXJlIGFjdGlvbiBhbmQgY2xvc2UgdGhlIGRpYWxvZy4gVGhlIHJlc3VsdGluZyBgcmVzdW1lYCBldmVudCB3aWxsIGJlIGRpc3BhdGNoZWQgcmVnYXJkbGVzcyBpZiB0aGUgdXNlciBhY3R1YWxseSBzaGFyZWQgdGhlIGNvbnRlbnQgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI29wZW5TaGFyZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEEgdGV4dCBtZXNzYWdlIHRvIGJlIHNoYXJlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZyYW1lXSAtIFRoZSBmcmFtZSBvZiB0aGUgdGV4dHVyZSB0byB1c2UgYXMgdGhlIHNoYXJlIGltYWdlLiBTZXQgdG8gYG51bGxgIGlmIHlvdSBkb24ndCByZXF1aXJlIGEgZnJhbWUsIGJ1dCBkbyBuZWVkIHRvIHNldCBzZXNzaW9uIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3Nlc3Npb25EYXRhXSAtIEEgYmxvYiBvZiBkYXRhIHRvIGF0dGFjaCB0byB0aGUgc2hhcmUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9wZW5TaGFyZTogZnVuY3Rpb24gKHRleHQsIGtleSwgZnJhbWUsIHNlc3Npb25EYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaGFyZSgnU0hBUkUnLCB0ZXh0LCBrZXksIGZyYW1lLCBzZXNzaW9uRGF0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnZva2VzIGEgZGlhbG9nIHRvIGxldCB0aGUgdXNlciBpbnZpdGUgYSBmcmllbmQgdG8gcGxheSB0aGlzIGdhbWUsIGVpdGhlciBhcyBhIG1lc3NhZ2UgaW4gTWVzc2VuZ2VyIG9yIGFzIGEgcG9zdCBvbiB0aGUgdXNlcidzIHRpbWVsaW5lLlxyXG4gICAgICogXHJcbiAgICAgKiBBIGJsb2Igb2YgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIHNoYXJlIHdoaWNoIGV2ZXJ5IGdhbWUgc2Vzc2lvbiBsYXVuY2hlZCBmcm9tIHRoZSBzaGFyZSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHZpYSB0aGUgYHRoaXMuZW50cnlQb2ludERhdGFgIHByb3BlcnR5LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGRhdGEgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAwMCBjaGFyYWN0ZXJzIHdoZW4gc3RyaW5naWZpZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHlvdSBzaG91bGQgY29uc2lkZXIgeW91ciBnYW1lIHBhdXNlZC4gTGlzdGVuIG91dCBmb3IgdGhlIGByZXN1bWVgIGV2ZW50IGZyb20gdGhpcyBwbHVnaW4gdG8ga25vdyB3aGVuIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgdXNlciBtYXkgY2hvb3NlIHRvIGNhbmNlbCB0aGUgc2hhcmUgYWN0aW9uIGFuZCBjbG9zZSB0aGUgZGlhbG9nLiBUaGUgcmVzdWx0aW5nIGByZXN1bWVgIGV2ZW50IHdpbGwgYmUgZGlzcGF0Y2hlZCByZWdhcmRsZXNzIGlmIHRoZSB1c2VyIGFjdHVhbGx5IHNoYXJlZCB0aGUgY29udGVudCBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jb3Blbkludml0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEEgdGV4dCBtZXNzYWdlIHRvIGJlIHNoYXJlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZyYW1lXSAtIFRoZSBmcmFtZSBvZiB0aGUgdGV4dHVyZSB0byB1c2UgYXMgdGhlIHNoYXJlIGltYWdlLiBTZXQgdG8gYG51bGxgIGlmIHlvdSBkb24ndCByZXF1aXJlIGEgZnJhbWUsIGJ1dCBkbyBuZWVkIHRvIHNldCBzZXNzaW9uIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3Nlc3Npb25EYXRhXSAtIEEgYmxvYiBvZiBkYXRhIHRvIGF0dGFjaCB0byB0aGUgc2hhcmUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9wZW5JbnZpdGU6IGZ1bmN0aW9uICh0ZXh0LCBrZXksIGZyYW1lLCBzZXNzaW9uRGF0YSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2hhcmUoJ0lOVklURScsIHRleHQsIGtleSwgZnJhbWUsIHNlc3Npb25EYXRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGludm9rZXMgYSBkaWFsb2cgdG8gbGV0IHRoZSB1c2VyIHNoYXJlIHNwZWNpZmllZCBjb250ZW50LCBlaXRoZXIgYXMgYSBtZXNzYWdlIGluIE1lc3NlbmdlciBvciBhcyBhIHBvc3Qgb24gdGhlIHVzZXIncyB0aW1lbGluZS5cclxuICAgICAqIFxyXG4gICAgICogQSBibG9iIG9mIGRhdGEgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBzaGFyZSB3aGljaCBldmVyeSBnYW1lIHNlc3Npb24gbGF1bmNoZWQgZnJvbSB0aGUgc2hhcmUgd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB2aWEgdGhlIGB0aGlzLmVudHJ5UG9pbnREYXRhYCBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBkYXRhIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwMDAgY2hhcmFjdGVycyB3aGVuIHN0cmluZ2lmaWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHlvdXIgZ2FtZSBwYXVzZWQuIExpc3RlbiBvdXQgZm9yIHRoZSBgcmVzdW1lYCBldmVudCBmcm9tIHRoaXMgcGx1Z2luIHRvIGtub3cgd2hlbiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHVzZXIgbWF5IGNob29zZSB0byBjYW5jZWwgdGhlIHNoYXJlIGFjdGlvbiBhbmQgY2xvc2UgdGhlIGRpYWxvZy4gVGhlIHJlc3VsdGluZyBgcmVzdW1lYCBldmVudCB3aWxsIGJlIGRpc3BhdGNoZWQgcmVnYXJkbGVzcyBpZiB0aGUgdXNlciBhY3R1YWxseSBzaGFyZWQgdGhlIGNvbnRlbnQgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI29wZW5SZXF1ZXN0XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gQSB0ZXh0IG1lc3NhZ2UgdG8gYmUgc2hhcmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGFzIHRoZSBzaGFyZSBpbWFnZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhbWVdIC0gVGhlIGZyYW1lIG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuIFNldCB0byBgbnVsbGAgaWYgeW91IGRvbid0IHJlcXVpcmUgYSBmcmFtZSwgYnV0IGRvIG5lZWQgdG8gc2V0IHNlc3Npb24gZGF0YS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc2Vzc2lvbkRhdGFdIC0gQSBibG9iIG9mIGRhdGEgdG8gYXR0YWNoIHRvIHRoZSBzaGFyZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgb3BlblJlcXVlc3Q6IGZ1bmN0aW9uICh0ZXh0LCBrZXksIGZyYW1lLCBzZXNzaW9uRGF0YSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2hhcmUoJ1JFUVVFU1QnLCB0ZXh0LCBrZXksIGZyYW1lLCBzZXNzaW9uRGF0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnZva2VzIGEgZGlhbG9nIHRvIGxldCB0aGUgdXNlciBzaGFyZSBzcGVjaWZpZWQgY29udGVudCwgZWl0aGVyIGFzIGEgbWVzc2FnZSBpbiBNZXNzZW5nZXIgb3IgYXMgYSBwb3N0IG9uIHRoZSB1c2VyJ3MgdGltZWxpbmUuXHJcbiAgICAgKiBcclxuICAgICAqIEEgYmxvYiBvZiBkYXRhIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc2hhcmUgd2hpY2ggZXZlcnkgZ2FtZSBzZXNzaW9uIGxhdW5jaGVkIGZyb20gdGhlIHNoYXJlIHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgdmlhIHRoZSBgdGhpcy5lbnRyeVBvaW50RGF0YWAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgZGF0YSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDAwIGNoYXJhY3RlcnMgd2hlbiBzdHJpbmdpZmllZC5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgeW91IHNob3VsZCBjb25zaWRlciB5b3VyIGdhbWUgcGF1c2VkLiBMaXN0ZW4gb3V0IGZvciB0aGUgYHJlc3VtZWAgZXZlbnQgZnJvbSB0aGlzIHBsdWdpbiB0byBrbm93IHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBjbG9zZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB1c2VyIG1heSBjaG9vc2UgdG8gY2FuY2VsIHRoZSBzaGFyZSBhY3Rpb24gYW5kIGNsb3NlIHRoZSBkaWFsb2cuIFRoZSByZXN1bHRpbmcgYHJlc3VtZWAgZXZlbnQgd2lsbCBiZSBkaXNwYXRjaGVkIHJlZ2FyZGxlc3MgaWYgdGhlIHVzZXIgYWN0dWFsbHkgc2hhcmVkIHRoZSBjb250ZW50IG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNvcGVuQ2hhbGxlbmdlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gQSB0ZXh0IG1lc3NhZ2UgdG8gYmUgc2hhcmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGFzIHRoZSBzaGFyZSBpbWFnZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhbWVdIC0gVGhlIGZyYW1lIG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuIFNldCB0byBgbnVsbGAgaWYgeW91IGRvbid0IHJlcXVpcmUgYSBmcmFtZSwgYnV0IGRvIG5lZWQgdG8gc2V0IHNlc3Npb24gZGF0YS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc2Vzc2lvbkRhdGFdIC0gQSBibG9iIG9mIGRhdGEgdG8gYXR0YWNoIHRvIHRoZSBzaGFyZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgb3BlbkNoYWxsZW5nZTogZnVuY3Rpb24gKHRleHQsIGtleSwgZnJhbWUsIHNlc3Npb25EYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaGFyZSgnQ0hBTExFTkdFJywgdGV4dCwga2V5LCBmcmFtZSwgc2Vzc2lvbkRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHNoYXJlIGhhbmRsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jX3NoYXJlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gKFwiSU5WSVRFXCIgfCBcIlJFUVVFU1RcIiB8IFwiQ0hBTExFTkdFXCIgfCBcIlNIQVJFXCIpIEluZGljYXRlcyB0aGUgaW50ZW50IG9mIHRoZSBzaGFyZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gQSB0ZXh0IG1lc3NhZ2UgdG8gYmUgc2hhcmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHRleHR1cmUgdG8gdXNlIGFzIHRoZSBzaGFyZSBpbWFnZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhbWVdIC0gVGhlIGZyYW1lIG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuIFNldCB0byBgbnVsbGAgaWYgeW91IGRvbid0IHJlcXVpcmUgYSBmcmFtZSwgYnV0IGRvIG5lZWQgdG8gc2V0IHNlc3Npb24gZGF0YS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc2Vzc2lvbkRhdGFdIC0gQSBibG9iIG9mIGRhdGEgdG8gYXR0YWNoIHRvIHRoZSBzaGFyZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgX3NoYXJlOiBmdW5jdGlvbiAoaW50ZW50LCB0ZXh0LCBrZXksIGZyYW1lLCBzZXNzaW9uRGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ3NoYXJlQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlc3Npb25EYXRhID09PSB1bmRlZmluZWQpIHsgc2Vzc2lvbkRhdGEgPSB7fTsgfVxyXG5cclxuICAgICAgICBpZiAoa2V5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IHRoaXMuZ2FtZS50ZXh0dXJlcy5nZXRCYXNlNjQoa2V5LCBmcmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpbnRlbnQgKFwiSU5WSVRFXCIgfCBcIlJFUVVFU1RcIiB8IFwiQ0hBTExFTkdFXCIgfCBcIlNIQVJFXCIpIEluZGljYXRlcyB0aGUgaW50ZW50IG9mIHRoZSBzaGFyZS5cclxuICAgICAgICAvLyBpbWFnZSBzdHJpbmcgQSBiYXNlNjQgZW5jb2RlZCBpbWFnZSB0byBiZSBzaGFyZWQuXHJcbiAgICAgICAgLy8gdGV4dCBzdHJpbmcgQSB0ZXh0IG1lc3NhZ2UgdG8gYmUgc2hhcmVkLlxyXG4gICAgICAgIC8vIGRhdGEgT2JqZWN0PyBBIGJsb2Igb2YgZGF0YSB0byBhdHRhY2ggdG8gdGhlIHNoYXJlLiBBbGwgZ2FtZSBzZXNzaW9ucyBsYXVuY2hlZCBmcm9tIHRoZSBzaGFyZSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMgYmxvYiB0aHJvdWdoIEZCSW5zdGFudC5nZXRFbnRyeVBvaW50RGF0YSgpLlxyXG5cclxuICAgICAgICB2YXIgcGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgaW50ZW50OiBpbnRlbnQsXHJcbiAgICAgICAgICAgIGltYWdlOiBpbWFnZURhdGEsXHJcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXHJcbiAgICAgICAgICAgIGRhdGE6IHNlc3Npb25EYXRhXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50LnNoYXJlQXN5bmMocGF5bG9hZCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgncmVzdW1lJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIGluIHRoZSBjdXJyZW50IGdhbWUgY29udGV4dCBpcyBiZXR3ZWVuIGEgZ2l2ZW4gbWluaW11bSBhbmQgbWF4aW11bSwgaW5jbHVzaXZlLlxyXG4gICAgICogSWYgb25lIG9mIHRoZSBib3VuZHMgaXMgbnVsbCBvbmx5IHRoZSBvdGhlciBib3VuZCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdC5cclxuICAgICAqIEl0IHdpbGwgYWx3YXlzIHJldHVybiB0aGUgb3JpZ2luYWwgcmVzdWx0IGZvciB0aGUgZmlyc3QgY2FsbCBtYWRlIGluIGEgY29udGV4dCBpbiBhIGdpdmVuIGdhbWUgcGxheSBzZXNzaW9uLlxyXG4gICAgICogU3Vic2VxdWVudCBjYWxscywgcmVnYXJkbGVzcyBvZiBhcmd1bWVudHMsIHdpbGwgcmV0dXJuIHRoZSBhbnN3ZXIgdG8gdGhlIG9yaWdpbmFsIHF1ZXJ5IHVudGlsIGEgY29udGV4dCBjaGFuZ2Ugb2NjdXJzIGFuZCB0aGUgcXVlcnkgcmVzdWx0IGlzIHJlc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2lzU2l6ZUJldHdlZW5cclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbWluXSAtIFRoZSBtaW5pbXVtIGJvdW5kIG9mIHRoZSBjb250ZXh0IHNpemUgcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFttYXhdIC0gVGhlIG1heGltdW0gYm91bmQgb2YgdGhlIGNvbnRleHQgc2l6ZSBxdWVyeS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgQ29udGV4dCBTaXplIFJlc3BvbnNlIG9iamVjdCBpbiB0aGUgZm9ybWF0OiBge2Fuc3dlcjogYm9vbGVhbiwgbWluU2l6ZTogbnVtYmVyPywgbWF4U2l6ZTogbnVtYmVyP31gLlxyXG4gICAgICovXHJcbiAgICBpc1NpemVCZXR3ZWVuOiBmdW5jdGlvbiAobWluLCBtYXgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQVBJKCdjb250ZXh0SXNTaXplQmV0d2VlbicpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gRkJJbnN0YW50LmNvbnRleHQuaXNTaXplQmV0d2VlbihtaW4sIG1heCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBhIHN3aXRjaCBpbnRvIGEgc3BlY2lmaWMgY29udGV4dC4gSWYgdGhlIHBsYXllciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZW50ZXIgdGhhdCBjb250ZXh0LFxyXG4gICAgICogb3IgaWYgdGhlIHBsYXllciBkb2VzIG5vdCBwcm92aWRlIHBlcm1pc3Npb24gZm9yIHRoZSBnYW1lIHRvIGVudGVyIHRoYXQgY29udGV4dCwgdGhpcyB3aWxsIGVtaXQgYSBgc3dpdGNoZmFpbGAgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIE90aGVyd2lzZSwgdGhlIHBsdWdpbiB3aWxsIGVtaXQgdGhlIGBzd2l0Y2hgIGV2ZW50IHdoZW4gdGhlIGdhbWUgaGFzIHN3aXRjaGVkIGludG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3N3aXRjaENvbnRleHRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRJRCAtIFRoZSBJRCBvZiB0aGUgZGVzaXJlZCBjb250ZXh0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzd2l0Y2hDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dElEKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgnY29udGV4dFN3aXRjaEFzeW5jJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb250ZXh0SUQgIT09IHRoaXMuY29udGV4dElEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIEZCSW5zdGFudC5jb250ZXh0LnN3aXRjaEFzeW5jKGNvbnRleHRJRCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5jb250ZXh0SUQgPSBGQkluc3RhbnQuY29udGV4dC5nZXRJRCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ3N3aXRjaCcsIF90aGlzLmNvbnRleHRJRCk7XHJcblxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnc3dpdGNoZmFpbCcsIGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZmlsdGVyIHRoYXQgbWF5IGJlIGFwcGxpZWQgdG8gYSBDb250ZXh0IENob29zZSBvcGVyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqICdORVdfQ09OVEVYVF9PTkxZJyAtIFByZWZlciB0byBvbmx5IHN1cmZhY2UgY29udGV4dHMgdGhlIGdhbWUgaGFzIG5vdCBiZWVuIHBsYXllZCBpbiBiZWZvcmUuXHJcbiAgICAgKiAnSU5DTFVERV9FWElTVElOR19DSEFMTEVOR0VTJyAtIEluY2x1ZGUgdGhlIFwiRXhpc3RpbmcgQ2hhbGxlbmdlc1wiIHNlY3Rpb24sIHdoaWNoIHN1cmZhY2VzIGFjdGl2ZWx5IHBsYXllZC1pbiBjb250ZXh0cyB0aGF0IHRoZSBwbGF5ZXIgaXMgYSBwYXJ0IG9mLlxyXG4gICAgICogJ05FV19QTEFZRVJTX09OTFknIC0gSW4gc2VjdGlvbnMgY29udGFpbmluZyBpbmRpdmlkdWFscywgcHJlZmVyIHBlb3BsZSB3aG8gaGF2ZSBub3QgcGxheWVkIHRoZSBnYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAdHlwZWRlZiB7c3RyaW5nfSBDb250ZXh0RmlsdGVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBtYXkgYmUgYXBwbGllZCB0byBhIENvbnRleHQgQ2hvb3NlIG9wZXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHR5cGVkZWYge29iamVjdH0gQ2hvb3NlQ29udGV4dENvbmZpZ1xyXG4gICAgICogQHByb3BlcnR5IHtDb250ZXh0RmlsdGVyW119IFtmaWx0ZXJzXSAtIFRoZSBzZXQgb2YgZmlsdGVycyB0byBhcHBseSB0byB0aGUgY29udGV4dCBzdWdnZXN0aW9uczogJ05FV19DT05URVhUX09OTFknLCAnSU5DTFVERV9FWElTVElOR19DSEFMTEVOR0VTJyBvciAnTkVXX1BMQVlFUlNfT05MWScuXHJcbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW21heFNpemVdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB0aGF0IGEgc3VnZ2VzdGVkIGNvbnRleHQgc2hvdWxkIGlkZWFsbHkgaGF2ZS5cclxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWluU2l6ZV0gLSBUaGUgbWluaW11bSBudW1iZXIgb2YgcGFydGljaXBhbnRzIHRoYXQgYSBzdWdnZXN0ZWQgY29udGV4dCBzaG91bGQgaWRlYWxseSBoYXZlLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVucyBhIGNvbnRleHQgc2VsZWN0aW9uIGRpYWxvZyBmb3IgdGhlIHBsYXllci4gSWYgdGhlIHBsYXllciBzZWxlY3RzIGFuIGF2YWlsYWJsZSBjb250ZXh0LFxyXG4gICAgICogdGhlIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gc3dpdGNoIGludG8gdGhhdCBjb250ZXh0LCBhbmQgZW1pdCB0aGUgYGNob29zZWAgZXZlbnQgaWYgc3VjY2Vzc2Z1bC5cclxuICAgICAqIE90aGVyd2lzZSwgaWYgdGhlIHBsYXllciBleGl0cyB0aGUgbWVudSBvciB0aGUgY2xpZW50IGZhaWxzIHRvIHN3aXRjaCBpbnRvIHRoZSBuZXcgY29udGV4dCwgdGhlIGBjaG9vc2VmYWlsYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI2Nob29zZUNvbnRleHRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtDaG9vc2VDb250ZXh0Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvYmplY3Qgc3BlY2lmeWluZyBjb25kaXRpb25zIG9uIHRoZSBjb250ZXh0cyB0aGF0IHNob3VsZCBiZSBvZmZlcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjaG9vc2VDb250ZXh0OiBmdW5jdGlvbiAob3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ2NvbnRleHRDaG9vc2VBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQuY29udGV4dC5jaG9vc2VBc3luYyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5jb250ZXh0SUQgPSBGQkluc3RhbnQuY29udGV4dC5nZXRJRCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdjaG9vc2UnLCBfdGhpcy5jb250ZXh0SUQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Nob29zZWZhaWwnLCBlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdHMgdG8gY3JlYXRlIG9yIHN3aXRjaCBpbnRvIGEgY29udGV4dCBiZXR3ZWVuIGEgc3BlY2lmaWVkIHBsYXllciBhbmQgdGhlIGN1cnJlbnQgcGxheWVyLlxyXG4gICAgICogVGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgY3JlYXRlYCBldmVudCBvbmNlIHRoZSBjb250ZXh0IHN3aXRjaCBpcyBjb21wbGV0ZWQuXHJcbiAgICAgKiBJZiB0aGUgQVBJIGNhbGwgZmFpbHMsIHN1Y2ggYXMgaWYgdGhlIHBsYXllciBsaXN0ZWQgaXMgbm90IGEgQ29ubmVjdGVkIFBsYXllciBvZiB0aGUgY3VycmVudCBwbGF5ZXIgb3IgaWYgdGhlXHJcbiAgICAgKiBwbGF5ZXIgZG9lcyBub3QgcHJvdmlkZSBwZXJtaXNzaW9uIHRvIGVudGVyIHRoZSBuZXcgY29udGV4dCwgdGhlbiB0aGUgcGx1Z2luIHdpbGwgZW1pdCBhICdjcmVhdGVmYWlsJyBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjcmVhdGVDb250ZXh0XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwbGF5ZXJJRCAtIElEIG9mIHRoZSBwbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNvbnRleHQ6IGZ1bmN0aW9uIChwbGF5ZXJJRClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ2NvbnRleHRDcmVhdGVBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQuY29udGV4dC5jcmVhdGVBc3luYyhwbGF5ZXJJRCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuY29udGV4dElEID0gRkJJbnN0YW50LmNvbnRleHQuZ2V0SUQoKTtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnY3JlYXRlJywgX3RoaXMuY29udGV4dElEKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdjcmVhdGVmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZldGNoZXMgYW4gYXJyYXkgb2YgQ29ubmVjdGVkUGxheWVyIG9iamVjdHMgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUgcGxheWVyc1xyXG4gICAgICogKHBlb3BsZSB3aG8gcGxheWVkIHRoZSBnYW1lIGluIHRoZSBsYXN0IDkwIGRheXMpIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgY3VycmVudCBwbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IG1ha2VzIGFuIGFzeW5jIGNhbGwgdG8gdGhlIEFQSSwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgYXJlIHN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYHBsYXllcnNgIGV2ZW50IGFsb25nXHJcbiAgICAgKiB3aXRoIHRoZSBwbGF5ZXIgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBjYW5ub3QsIGkuZS4gaXQncyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMsIG9yIHRoZSByZXF1ZXN0XHJcbiAgICAgKiB3YXMgcmVqZWN0ZWQsIGl0IHdpbGwgZW1pdCBhIGBwbGF5ZXJzZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRQbGF5ZXJzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGdldFBsYXllcnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQVBJKCdwbGF5ZXJHZXRDb25uZWN0ZWRQbGF5ZXJzQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50LnBsYXllci5nZXRDb25uZWN0ZWRQbGF5ZXJzQXN5bmMoKS50aGVuKGZ1bmN0aW9uIChwbGF5ZXJzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgncGxheWVycycsIHBsYXllcnMpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3BsYXllcnNmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZldGNoZXMgdGhlIGdhbWUncyBwcm9kdWN0IGNhdGFsb2cuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IG1ha2VzIGFuIGFzeW5jIGNhbGwgdG8gdGhlIEFQSSwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgYXJlIHN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYGdldGNhdGFsb2dgIGV2ZW50IGFsb25nXHJcbiAgICAgKiB3aXRoIHRoZSBjYXRhbG9nIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgY2Fubm90LCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdFxyXG4gICAgICogd2FzIHJlamVjdGVkLCBpdCB3aWxsIGVtaXQgYSBgZ2V0Y2F0YWxvZ2ZhaWxgIGV2ZW50IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jZ2V0Q2F0YWxvZ1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBnZXRDYXRhbG9nOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXltZW50c1JlYWR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBjYXRhbG9nID0gdGhpcy5jYXRhbG9nO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQucGF5bWVudHMuZ2V0Q2F0YWxvZ0FzeW5jKCkudGhlbihmdW5jdGlvbiAoZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhdGFsb2cgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2F0YWxvZy5wdXNoKFByb2R1Y3QoaXRlbSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldGNhdGFsb2cnLCBjYXRhbG9nKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdnZXRjYXRhbG9nZmFpbCcsIGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaGVzIGEgc2luZ2xlIFByb2R1Y3QgZnJvbSB0aGUgZ2FtZSdzIHByb2R1Y3QgY2F0YWxvZy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHByb2R1Y3QgY2F0YWxvZyBtdXN0IGhhdmUgYmVlbiBwb3B1bGF0ZWQgdXNpbmcgYGdldENhdGFsb2dgIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIFVzZSB0aGlzIHRvIGxvb2stdXAgcHJvZHVjdCBkZXRhaWxzIGJhc2VkIG9uIGEgcHVyY2hhc2UgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRQcm9kdWN0XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9kdWN0SUQgLSBUaGUgUHJvZHVjdCBJRCBvZiB0aGUgaXRlbSB0byBnZXQgZnJvbSB0aGUgY2F0YWxvZy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7P1Byb2R1Y3R9IFRoZSBQcm9kdWN0IGZyb20gdGhlIGNhdGFsb2csIG9yIGBudWxsYCBpZiBpdCBjb3VsZG4ndCBiZSBmb3VuZCBvciB0aGUgY2F0YWxvZyBpc24ndCBwb3B1bGF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3Q6IGZ1bmN0aW9uIChwcm9kdWN0SUQpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhdGFsb2cubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jYXRhbG9nW2ldLnByb2R1Y3RJRCA9PT0gcHJvZHVjdElEKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYXRhbG9nW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbnMgdGhlIHB1cmNoYXNlIGZsb3cgZm9yIGEgc3BlY2lmaWMgcHJvZHVjdC5cclxuICAgICAqIFxyXG4gICAgICogSXQgbWFrZXMgYW4gYXN5bmMgY2FsbCB0byB0aGUgQVBJLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBhcmUgc3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgdGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgcHVyY2hhc2VgIGV2ZW50IGFsb25nXHJcbiAgICAgKiB3aXRoIHRoZSBwdXJjaGFzZSBkYXRhLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGV5IGNhbm5vdCwgaS5lLiBpdCdzIG5vdCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgQVBJcywgb3IgdGhlIHJlcXVlc3RcclxuICAgICAqIHdhcyByZWplY3RlZCwgaXQgd2lsbCBlbWl0IGEgYHB1cmNoYXNlZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNwdXJjaGFzZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvZHVjdElEIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgdG8gcHVyY2hhc2UuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2RldmVsb3BlclBheWxvYWRdIC0gQW4gb3B0aW9uYWwgZGV2ZWxvcGVyLXNwZWNpZmllZCBwYXlsb2FkLCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgcHVyY2hhc2UncyBzaWduZWQgcmVxdWVzdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcHVyY2hhc2U6IGZ1bmN0aW9uIChwcm9kdWN0SUQsIGRldmVsb3BlclBheWxvYWQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBheW1lbnRzUmVhZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjb25maWcgPSB7cHJvZHVjdElEOiBwcm9kdWN0SUR9O1xyXG5cclxuICAgICAgICBpZiAoZGV2ZWxvcGVyUGF5bG9hZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZXZlbG9wZXJQYXlsb2FkID0gZGV2ZWxvcGVyUGF5bG9hZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIEZCSW5zdGFudC5wYXltZW50cy5wdXJjaGFzZUFzeW5jKGNvbmZpZykudGhlbihmdW5jdGlvbiAoZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwdXJjaGFzZSA9IFB1cmNoYXNlKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgncHVyY2hhc2UnLCBwdXJjaGFzZSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgncHVyY2hhc2VmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZldGNoZXMgYWxsIG9mIHRoZSBwbGF5ZXIncyB1bmNvbnN1bWVkIHB1cmNoYXNlcy4gVGhlIGdhbWUgbXVzdCBmZXRjaCB0aGUgY3VycmVudCBwbGF5ZXIncyBwdXJjaGFzZXNcclxuICAgICAqIGFzIHNvb24gYXMgdGhlIGNsaWVudCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyByZWFkeSB0byBwZXJmb3JtIHBheW1lbnRzLXJlbGF0ZWQgb3BlcmF0aW9ucyxcclxuICAgICAqIGkuZS4gYXQgZ2FtZSBzdGFydC4gVGhlIGdhbWUgY2FuIHRoZW4gcHJvY2VzcyBhbmQgY29uc3VtZSBhbnkgcHVyY2hhc2VzIHRoYXQgYXJlIHdhaXRpbmcgdG8gYmUgY29uc3VtZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IG1ha2VzIGFuIGFzeW5jIGNhbGwgdG8gdGhlIEFQSSwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgYXJlIHN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYGdldHB1cmNoYXNlc2AgZXZlbnQgYWxvbmdcclxuICAgICAqIHdpdGggdGhlIHB1cmNoYXNlIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgY2Fubm90LCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdFxyXG4gICAgICogd2FzIHJlamVjdGVkLCBpdCB3aWxsIGVtaXQgYSBgZ2V0cHVyY2hhc2VzZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRQdXJjaGFzZXNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UHVyY2hhc2VzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXltZW50c1JlYWR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBwdXJjaGFzZXMgPSB0aGlzLnB1cmNoYXNlcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50LnBheW1lbnRzLmdldFB1cmNoYXNlc0FzeW5jKCkudGhlbihmdW5jdGlvbiAoZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHB1cmNoYXNlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwdXJjaGFzZXMucHVzaChQdXJjaGFzZShpdGVtKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnZ2V0cHVyY2hhc2VzJywgcHVyY2hhc2VzKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdnZXRwdXJjaGFzZXNmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnN1bWVzIGEgc3BlY2lmaWMgcHVyY2hhc2UgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IHBsYXllci4gQmVmb3JlIHByb3Zpc2lvbmluZyBhIHByb2R1Y3QncyBlZmZlY3RzIHRvIHRoZSBwbGF5ZXIsXHJcbiAgICAgKiB0aGUgZ2FtZSBzaG91bGQgcmVxdWVzdCB0aGUgY29uc3VtcHRpb24gb2YgdGhlIHB1cmNoYXNlZCBwcm9kdWN0LiBPbmNlIHRoZSBwdXJjaGFzZSBpcyBzdWNjZXNzZnVsbHkgY29uc3VtZWQsXHJcbiAgICAgKiB0aGUgZ2FtZSBzaG91bGQgaW1tZWRpYXRlbHkgcHJvdmlkZSB0aGUgcGxheWVyIHdpdGggdGhlIGVmZmVjdHMgb2YgdGhlaXIgcHVyY2hhc2UuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IG1ha2VzIGFuIGFzeW5jIGNhbGwgdG8gdGhlIEFQSSwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgYXJlIHN1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYGNvbnN1bWVwdXJjaGFzZWAgZXZlbnQgYWxvbmdcclxuICAgICAqIHdpdGggdGhlIHB1cmNoYXNlIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgY2Fubm90LCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdFxyXG4gICAgICogd2FzIHJlamVjdGVkLCBpdCB3aWxsIGVtaXQgYSBgY29uc3VtZXB1cmNoYXNlZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjb25zdW1lUHVyY2hhc2VcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHB1cmNoYXNlVG9rZW4gLSBUaGUgcHVyY2hhc2UgdG9rZW4gb2YgdGhlIHB1cmNoYXNlIHRoYXQgc2hvdWxkIGJlIGNvbnN1bWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjb25zdW1lUHVyY2hhc2U6IGZ1bmN0aW9uIChwdXJjaGFzZVRva2VuKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXltZW50c1JlYWR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQucGF5bWVudHMuY29uc3VtZVB1cmNoYXNlQXN5bmMocHVyY2hhc2VUb2tlbikudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnY29uc3VtZXB1cmNoYXNlJywgcHVyY2hhc2VUb2tlbik7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgnY29uc3VtZXB1cmNoYXNlZmFpbCcsIGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmZvcm1zIEZhY2Vib29rIG9mIGEgY3VzdG9tIHVwZGF0ZSB0aGF0IG9jY3VycmVkIGluIHRoZSBnYW1lLlxyXG4gICAgICogVGhpcyB3aWxsIHRlbXBvcmFyaWx5IHlpZWxkIGNvbnRyb2wgdG8gRmFjZWJvb2sgYW5kIEZhY2Vib29rIHdpbGwgZGVjaWRlIHdoYXQgdG8gZG8gYmFzZWQgb24gd2hhdCB0aGUgdXBkYXRlIGlzLlxyXG4gICAgICogT25jZSBGYWNlYm9vayByZXR1cm5zIGNvbnRyb2wgdG8gdGhlIGdhbWUgdGhlIHBsdWdpbiB3aWxsIGVtaXQgYW4gYHVwZGF0ZWAgb3IgYHVwZGF0ZWZhaWxgIGV2ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBtYWtlcyBhbiBhc3luYyBjYWxsIHRvIHRoZSBBUEksIHNvIHRoZSByZXN1bHQgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgYHRleHRgIHBhcmFtZXRlciBpcyBhbiB1cGRhdGUgcGF5bG9hZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBcclxuICAgICAqIHRleHQ6IHtcclxuICAgICAqICAgICBkZWZhdWx0OiAnWCBqdXN0IGludmFkZWQgWVxcJ3MgdmlsbGFnZSEnLFxyXG4gICAgICogICAgIGxvY2FsaXphdGlvbnM6IHtcclxuICAgICAqICAgICAgICAgYXJfQVI6ICdYIFxcdTA2NDFcXHUwNjQyXFx1MDYzNyBcXHUwNjNBXFx1MDYzMlxcdTA2MkEgJyArXHJcbiAgICAgKiAgICAgICAgICdcXHUwNjQyXFx1MDYzMVxcdTA2NEFcXHUwNjI5IFkhJyxcclxuICAgICAqICAgICAgICAgZW5fVVM6ICdYIGp1c3QgaW52YWRlZCBZXFwncyB2aWxsYWdlIScsXHJcbiAgICAgKiAgICAgICAgIGVzX0xBOiAnXFx1MDBBMVggYWNhYmEgZGUgaW52YWRpciBlbCBwdWVibG8gZGUgWSEnLFxyXG4gICAgICogICAgIH1cclxuICAgICAqIH1cclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3RhIC0gVGhlIGNhbGwgdG8gYWN0aW9uIHRleHQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGV4dCAtIFRoZSB0ZXh0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuXHJcbiAgICAgKiBAcGFyYW0gez8oc3RyaW5nfGludGVnZXIpfSBmcmFtZSAtIFRoZSBmcmFtZSBvZiB0aGUgdGV4dHVyZSB0byB1c2UgYXMgdGhlIHNoYXJlIGltYWdlLiBTZXQgdG8gYG51bGxgIGlmIHlvdSBkb24ndCByZXF1aXJlIGEgZnJhbWUsIGJ1dCBkbyBuZWVkIHRvIHNldCBzZXNzaW9uIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGUgLSBUaGUgdXBkYXRlIHRlbXBsYXRlIGtleS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVEYXRhIC0gVGhlIHVwZGF0ZSBkYXRhIG9iamVjdCBwYXlsb2FkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChjdGEsIHRleHQsIGtleSwgZnJhbWUsIHRlbXBsYXRlLCB1cGRhdGVEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoJ0NVU1RPTScsIGN0YSwgdGV4dCwga2V5LCBmcmFtZSwgdGVtcGxhdGUsIHVwZGF0ZURhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZm9ybXMgRmFjZWJvb2sgb2YgYSBsZWFkZXJib2FyZCB1cGRhdGUgdGhhdCBvY2N1cnJlZCBpbiB0aGUgZ2FtZS5cclxuICAgICAqIFRoaXMgd2lsbCB0ZW1wb3JhcmlseSB5aWVsZCBjb250cm9sIHRvIEZhY2Vib29rIGFuZCBGYWNlYm9vayB3aWxsIGRlY2lkZSB3aGF0IHRvIGRvIGJhc2VkIG9uIHdoYXQgdGhlIHVwZGF0ZSBpcy5cclxuICAgICAqIE9uY2UgRmFjZWJvb2sgcmV0dXJucyBjb250cm9sIHRvIHRoZSBnYW1lIHRoZSBwbHVnaW4gd2lsbCBlbWl0IGFuIGB1cGRhdGVgIG9yIGB1cGRhdGVmYWlsYCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogSXQgbWFrZXMgYW4gYXN5bmMgY2FsbCB0byB0aGUgQVBJLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGB0ZXh0YCBwYXJhbWV0ZXIgaXMgYW4gdXBkYXRlIHBheWxvYWQgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgXHJcbiAgICAgKiB0ZXh0OiB7XHJcbiAgICAgKiAgICAgZGVmYXVsdDogJ1gganVzdCBpbnZhZGVkIFlcXCdzIHZpbGxhZ2UhJyxcclxuICAgICAqICAgICBsb2NhbGl6YXRpb25zOiB7XHJcbiAgICAgKiAgICAgICAgIGFyX0FSOiAnWCBcXHUwNjQxXFx1MDY0MlxcdTA2MzcgXFx1MDYzQVxcdTA2MzJcXHUwNjJBICcgK1xyXG4gICAgICogICAgICAgICAnXFx1MDY0MlxcdTA2MzFcXHUwNjRBXFx1MDYyOSBZIScsXHJcbiAgICAgKiAgICAgICAgIGVuX1VTOiAnWCBqdXN0IGludmFkZWQgWVxcJ3MgdmlsbGFnZSEnLFxyXG4gICAgICogICAgICAgICBlc19MQTogJ1xcdTAwQTFYIGFjYWJhIGRlIGludmFkaXIgZWwgcHVlYmxvIGRlIFkhJyxcclxuICAgICAqICAgICB9XHJcbiAgICAgKiB9XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiN1cGRhdGVMZWFkZXJib2FyZFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3RhIC0gVGhlIGNhbGwgdG8gYWN0aW9uIHRleHQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGV4dCAtIFRoZSB0ZXh0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuXHJcbiAgICAgKiBAcGFyYW0gez8oc3RyaW5nfGludGVnZXIpfSBmcmFtZSAtIFRoZSBmcmFtZSBvZiB0aGUgdGV4dHVyZSB0byB1c2UgYXMgdGhlIHNoYXJlIGltYWdlLiBTZXQgdG8gYG51bGxgIGlmIHlvdSBkb24ndCByZXF1aXJlIGEgZnJhbWUsIGJ1dCBkbyBuZWVkIHRvIHNldCBzZXNzaW9uIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGUgLSBUaGUgdXBkYXRlIHRlbXBsYXRlIGtleS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVEYXRhIC0gVGhlIHVwZGF0ZSBkYXRhIG9iamVjdCBwYXlsb2FkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVMZWFkZXJib2FyZDogZnVuY3Rpb24gKGN0YSwgdGV4dCwga2V5LCBmcmFtZSwgdGVtcGxhdGUsIHVwZGF0ZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgnTEVBREVSQk9BUkQnLCBjdGEsIHRleHQsIGtleSwgZnJhbWUsIHRlbXBsYXRlLCB1cGRhdGVEYXRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB1cGRhdGUgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNfdXBkYXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gVGhlIHVwZGF0ZSBhY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3RhIC0gVGhlIGNhbGwgdG8gYWN0aW9uIHRleHQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGV4dCAtIFRoZSB0ZXh0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIHVzZSBhcyB0aGUgc2hhcmUgaW1hZ2UuXHJcbiAgICAgKiBAcGFyYW0gez8oc3RyaW5nfGludGVnZXIpfSBmcmFtZSAtIFRoZSBmcmFtZSBvZiB0aGUgdGV4dHVyZSB0byB1c2UgYXMgdGhlIHNoYXJlIGltYWdlLiBTZXQgdG8gYG51bGxgIGlmIHlvdSBkb24ndCByZXF1aXJlIGEgZnJhbWUsIGJ1dCBkbyBuZWVkIHRvIHNldCBzZXNzaW9uIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGUgLSBUaGUgdXBkYXRlIHRlbXBsYXRlIGtleS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB1cGRhdGVEYXRhIC0gVGhlIHVwZGF0ZSBkYXRhIG9iamVjdCBwYXlsb2FkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBfdXBkYXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBjdGEsIHRleHQsIGtleSwgZnJhbWUsIHRlbXBsYXRlLCB1cGRhdGVEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgnc2hhcmVBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY3RhID09PSB1bmRlZmluZWQpIHsgY3RhID0gJyc7IH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHQgPSB7ZGVmYXVsdDogdGV4dH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXBkYXRlRGF0YSA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZURhdGEgPSB7fTsgfVxyXG5cclxuICAgICAgICBpZiAoa2V5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGltYWdlRGF0YSA9IHRoaXMuZ2FtZS50ZXh0dXJlcy5nZXRCYXNlNjQoa2V5LCBmcmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXHJcbiAgICAgICAgICAgIGN0YTogY3RhLFxyXG4gICAgICAgICAgICBpbWFnZTogaW1hZ2VEYXRhLFxyXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXHJcbiAgICAgICAgICAgIGRhdGE6IHVwZGF0ZURhdGEsXHJcbiAgICAgICAgICAgIHN0cmF0ZWd5OiAnSU1NRURJQVRFJyxcclxuICAgICAgICAgICAgbm90aWZpY2F0aW9uOiAnTk9fUFVTSCdcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQudXBkYXRlQXN5bmMocGF5bG9hZCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgndXBkYXRlJyk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdCgndXBkYXRlZmFpbCcsIGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGNsaWVudCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgSW5zdGFudCBHYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBtYWtlcyBhbiBhc3luYyBjYWxsIHRvIHRoZSBBUEksIHNvIHRoZSByZXN1bHQgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgZ2FtZSBzd2l0Y2hlcyBzdWNjZXNzZnVsbHkgdGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgc3dpdGNoZ2FtZWAgZXZlbnQgYW5kIHRoZSBjbGllbnQgd2lsbCBsb2FkIHRoZSBuZXcgZ2FtZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBjYW5ub3QsIGkuZS4gaXQncyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIEFQSXMsIG9yIHRoZSByZXF1ZXN0XHJcbiAgICAgKiB3YXMgcmVqZWN0ZWQsIGl0IHdpbGwgZW1pdCBhIGBzd2l0Y2hnYW1lZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNzd2l0Y2hHYW1lXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJRCAtIFRoZSBBcHBsaWNhdGlvbiBJRCBvZiB0aGUgSW5zdGFudCBHYW1lIHRvIHN3aXRjaCB0by4gVGhlIGFwcGxpY2F0aW9uIG11c3QgYmUgYW4gSW5zdGFudCBHYW1lLCBhbmQgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgYnVzaW5lc3MgYXMgdGhlIGN1cnJlbnQgZ2FtZS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIHBheWxvYWQuIFRoaXMgd2lsbCBiZSBzZXQgYXMgdGhlIGVudHJ5cG9pbnQgZGF0YSBmb3IgdGhlIGdhbWUgYmVpbmcgc3dpdGNoZWQgdG8uIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwMDAgY2hhcmFjdGVycyB3aGVuIHN0cmluZ2lmaWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzd2l0Y2hHYW1lOiBmdW5jdGlvbiAoYXBwSUQsIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQVBJKCdzd2l0Y2hHYW1lQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGVzdCA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3QubGVuZ3RoID4gMTAwMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTd2l0Y2ggR2FtZSBkYXRhIHRvbyBsb25nLiBNYXggMTAwMCBjaGFycy4nKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQuc3dpdGNoR2FtZUFzeW5jKGFwcElELCBkYXRhKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdzd2l0Y2hnYW1lJywgYXBwSUQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3N3aXRjaGdhbWVmYWlsJywgZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21wdHMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgc2hvcnRjdXQgdG8gdGhlIGdhbWUgaWYgdGhleSBhcmUgZWxpZ2libGUgdG8uXHJcbiAgICAgKiBDYW4gb25seSBiZSBjYWxsZWQgb25jZSBwZXIgc2Vzc2lvbi5cclxuICAgICAqIFxyXG4gICAgICogSXQgbWFrZXMgYW4gYXN5bmMgY2FsbCB0byB0aGUgQVBJLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHVzZXIgY2hvb3NlIHRvIGNyZWF0ZSBhIHNob3J0Y3V0IHRoaXMgcGx1Z2luIHdpbGwgZW1pdCB0aGUgYHNob3J0Y3V0Y3JlYXRlZGAgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXkgY2Fubm90LCBpLmUuIGl0J3Mgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBBUElzLCBvciB0aGUgcmVxdWVzdFxyXG4gICAgICogd2FzIHJlamVjdGVkLCBpdCB3aWxsIGVtaXQgYSBgc2hvcnRjdXRjcmVhdGVkZmFpbGAgZXZlbnQgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNjcmVhdGVTaG9ydGN1dFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTaG9ydGN1dDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBGQkluc3RhbnQuY2FuQ3JlYXRlU2hvcnRjdXRBc3luYygpLnRoZW4oZnVuY3Rpb24gKGNhbkNyZWF0ZVNob3J0Y3V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGNhbkNyZWF0ZVNob3J0Y3V0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBGQkluc3RhbnQuY3JlYXRlU2hvcnRjdXRBc3luYygpLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdzaG9ydGN1dGNyZWF0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdzaG9ydGN1dGZhaWxlZCcsIGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVpdHMgdGhlIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jcXVpdFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBxdWl0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEZCSW5zdGFudC5xdWl0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9nIGFuIGFwcCBldmVudCB3aXRoIEZCIEFuYWx5dGljcy5cclxuICAgICAqIFxyXG4gICAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9qYXZhc2NyaXB0L3JlZmVyZW5jZS92Mi44I2FwcF9ldmVudHMgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBGQiBBbmFseXRpY3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jbG9nXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZSBvZiB0aGUgZXZlbnQuIE11c3QgYmUgMiB0byA0MCBjaGFyYWN0ZXJzLCBhbmQgY2FuIG9ubHkgY29udGFpbiAnXycsICctJywgJyAnLCBhbmQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ZhbHVlXSAtIEFuIG9wdGlvbmFsIG51bWVyaWMgdmFsdWUgdGhhdCBGQiBBbmFseXRpY3MgY2FuIGNhbGN1bGF0ZSBhIHN1bSB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIC0gQW4gb3B0aW9uYWwgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gdXAgdG8gMjUga2V5LXZhbHVlIHBhaXJzIHRvIGJlIGxvZ2dlZCB3aXRoIHRoZSBldmVudC4gS2V5cyBtdXN0IGJlIDIgdG8gNDAgY2hhcmFjdGVycywgYW5kIGNhbiBvbmx5IGNvbnRhaW4gJ18nLCAnLScsICcgJywgYW5kIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBWYWx1ZXMgbXVzdCBiZSBsZXNzIHRoYW4gMTAwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBsb2c6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcGFyYW1zKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgnbG9nRXZlbnQnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7IHBhcmFtcyA9IHt9OyB9XHJcblxyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+PSAyICYmIG5hbWUubGVuZ3RoIDw9IDQwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRkJJbnN0YW50LmxvZ0V2ZW50KG5hbWUsIHBhcnNlRmxvYXQodmFsdWUpLCBwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gaW50ZXJzdGl0aWFsIGFkLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgdGhlbiB0aGUgYWQgaXMgcHJlbG9hZGVkIHJlYWR5IGZvciBkaXNwbGF5IGluLWdhbWUgdmlhIHRoZSBtZXRob2QgYHNob3dBZCgpYC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGFkIGxvYWRzIGl0IHdpbGwgZW1pdCB0aGUgYGFkbG9hZGVkYCBldmVudCwgcGFzc2luZyB0aGUgQWRJbnN0YW5jZSBhcyB0aGUgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBhZCBjYW5ub3QgYmUgZGlzcGxheWVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGludmVudG9yeSB0byBmaWxsIGl0LCBpdCB3aWxsIGVtaXQgdGhlIGBhZHNub2ZpbGxgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3ByZWxvYWRBZHNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0gcGxhY2VtZW50SUQgLSBUaGUgYWQgcGxhY2VtZW50IElELCBvciBhbiBhcnJheSBvZiBJRHMsIGFzIGNyZWF0ZWQgaW4geW91ciBBdWRpZW5jZSBOZXR3b3JrIHNldHRpbmdzIHdpdGhpbiBGYWNlYm9vay5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcHJlbG9hZEFkczogZnVuY3Rpb24gKHBsYWNlbWVudElEKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0FQSSgnZ2V0SW50ZXJzdGl0aWFsQWRBc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGxhY2VtZW50SUQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGxhY2VtZW50SUQgPSBbIHBsYWNlbWVudElEIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB2YXIgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5hZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRzW2ldLnNob3duKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodG90YWwgKyBwbGFjZW1lbnRJRC5sZW5ndGggPj0gMylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVG9vIG1hbnkgQWRJbnN0YW5jZXMuIFNob3cgYW4gYWQgYmVmb3JlIGxvYWRpbmcgbW9yZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFjZW1lbnRJRC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IHBsYWNlbWVudElEW2ldO1xyXG4gICAgICAgICAgICB2YXIgZGF0YTtcclxuXHJcbiAgICAgICAgICAgIEZCSW5zdGFudC5nZXRJbnRlcnN0aXRpYWxBZEFzeW5jKGlkKS50aGVuKGZ1bmN0aW9uIChpbnRlcnN0aXRpYWwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBpbnRlcnN0aXRpYWw7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludGVyc3RpdGlhbC5sb2FkQXN5bmMoKTtcclxuXHJcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFkID0gQWRJbnN0YW5jZShpZCwgZGF0YSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmFkcy5wdXNoKGFkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZGxvYWRlZCcsIGFkKTtcclxuXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09PSAnQURTX05PX0ZJTEwnKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2Fkc25vZmlsbCcsIGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuY29kZSA9PT0gJ0FEU19GUkVRVUVOVF9MT0FEJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNmcmVxdWVudGxvYWQnLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIHJld2FyZGVkIHZpZGVvIGFkLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgdGhlbiB0aGUgYWQgaXMgcHJlbG9hZGVkIHJlYWR5IGZvciBkaXNwbGF5IGluLWdhbWUgdmlhIHRoZSBtZXRob2QgYHNob3dWaWRlbygpYC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGFkIGxvYWRzIGl0IHdpbGwgZW1pdCB0aGUgYGFkbG9hZGVkYCBldmVudCwgcGFzc2luZyB0aGUgQWRJbnN0YW5jZSBhcyB0aGUgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBhZCBjYW5ub3QgYmUgZGlzcGxheWVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vIGludmVudG9yeSB0byBmaWxsIGl0LCBpdCB3aWxsIGVtaXQgdGhlIGBhZHNub2ZpbGxgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3ByZWxvYWRWaWRlb0Fkc1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBwbGFjZW1lbnRJRCAtIFRoZSBhZCBwbGFjZW1lbnQgSUQsIG9yIGFuIGFycmF5IG9mIElEcywgYXMgY3JlYXRlZCBpbiB5b3VyIEF1ZGllbmNlIE5ldHdvcmsgc2V0dGluZ3Mgd2l0aGluIEZhY2Vib29rLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBwcmVsb2FkVmlkZW9BZHM6IGZ1bmN0aW9uIChwbGFjZW1lbnRJRClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ2dldFJld2FyZGVkVmlkZW9Bc3luYycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGxhY2VtZW50SUQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGxhY2VtZW50SUQgPSBbIHBsYWNlbWVudElEIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB2YXIgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5hZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRzW2ldLnNob3duKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodG90YWwgKyBwbGFjZW1lbnRJRC5sZW5ndGggPj0gMylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVG9vIG1hbnkgQWRJbnN0YW5jZXMuIFNob3cgYW4gYWQgYmVmb3JlIGxvYWRpbmcgbW9yZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbGFjZW1lbnRJRC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IHBsYWNlbWVudElEW2ldO1xyXG4gICAgICAgICAgICB2YXIgZGF0YTtcclxuXHJcbiAgICAgICAgICAgIEZCSW5zdGFudC5nZXRSZXdhcmRlZFZpZGVvQXN5bmMoaWQpLnRoZW4oZnVuY3Rpb24gKHJld2FyZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IHJld2FyZDtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV3YXJkLmxvYWRBc3luYygpO1xyXG5cclxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWQgPSBBZEluc3RhbmNlKGlkLCBkYXRhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5hZHMucHVzaChhZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnYWRsb2FkZWQnLCBhZCk7XHJcblxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0FEU19OT19GSUxMJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNub2ZpbGwnLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlLmNvZGUgPT09ICdBRFNfRlJFUVVFTlRfTE9BRCcpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnYWRzZnJlcXVlbnRsb2FkJywgaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBhIHByZXZpb3VzbHkgbG9hZGVkIGludGVyc3RpdGlhbCBhZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGFkIGlzIHN1Y2Nlc3NmdWxseSBkaXNwbGF5ZWQgdGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgYWRmaW5pc2hlZGAgZXZlbnQsIHdpdGggdGhlIEFkSW5zdGFuY2Ugb2JqZWN0IGFzIGl0cyBwYXJhbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBhZCBjYW5ub3QgYmUgZGlzcGxheWVkLCBpdCB3aWxsIGVtaXQgdGhlIGBhZHNub3Rsb2FkZWRgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3Nob3dBZFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhY2VtZW50SUQgLSBUaGUgYWQgcGxhY2VtZW50IElEIHRvIGRpc3BsYXkuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNob3dBZDogZnVuY3Rpb24gKHBsYWNlbWVudElEKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYWQgPSB0aGlzLmFkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhZC5wbGFjZW1lbnRJRCA9PT0gcGxhY2VtZW50SUQgJiYgIWFkLnNob3duKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhZC5pbnN0YW5jZS5zaG93QXN5bmMoKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWQuc2hvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZGZpbmlzaGVkJywgYWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09ICdBRFNfTk9UX0xPQURFRCcpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNub3Rsb2FkZWQnLCBhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuY29kZSA9PT0gJ1JBVEVfTElNSVRFRCcpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHJhdGVsaW1pdGVkJywgYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNob3dlcnJvcicsIGUsIGFkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwbGF5cyBhIHByZXZpb3VzbHkgbG9hZGVkIGludGVyc3RpdGlhbCB2aWRlbyBhZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGFkIGlzIHN1Y2Nlc3NmdWxseSBkaXNwbGF5ZWQgdGhpcyBwbHVnaW4gd2lsbCBlbWl0IHRoZSBgYWRmaW5pc2hlZGAgZXZlbnQsIHdpdGggdGhlIEFkSW5zdGFuY2Ugb2JqZWN0IGFzIGl0cyBwYXJhbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBhZCBjYW5ub3QgYmUgZGlzcGxheWVkLCBpdCB3aWxsIGVtaXQgdGhlIGBhZHNub3Rsb2FkZWRgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luI3Nob3dWaWRlb1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGxhY2VtZW50SUQgLSBUaGUgYWQgcGxhY2VtZW50IElEIHRvIGRpc3BsYXkuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNob3dWaWRlbzogZnVuY3Rpb24gKHBsYWNlbWVudElEKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYWQgPSB0aGlzLmFkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhZC5wbGFjZW1lbnRJRCA9PT0gcGxhY2VtZW50SUQgJiYgYWQudmlkZW8gJiYgIWFkLnNob3duKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhZC5pbnN0YW5jZS5zaG93QXN5bmMoKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWQuc2hvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZGZpbmlzaGVkJywgYWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09ICdBRFNfTk9UX0xPQURFRCcpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNub3Rsb2FkZWQnLCBhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuY29kZSA9PT0gJ1JBVEVfTElNSVRFRCcpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHJhdGVsaW1pdGVkJywgYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdhZHNob3dlcnJvcicsIGUsIGFkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBtYXRjaCB0aGUgY3VycmVudCBwbGF5ZXIgd2l0aCBvdGhlciB1c2VycyBsb29raW5nIGZvciBwZW9wbGUgdG8gcGxheSB3aXRoLlxyXG4gICAgICogSWYgc3VjY2Vzc2Z1bCwgYSBuZXcgTWVzc2VuZ2VyIGdyb3VwIHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQgY29udGFpbmluZyB0aGUgbWF0Y2hlZCBwbGF5ZXJzIGFuZCB0aGUgcGxheWVyIHdpbGxcclxuICAgICAqIGJlIGNvbnRleHQgc3dpdGNoZWQgdG8gdGhhdCB0aHJlYWQuIFRoaXMgcGx1Z2luIHdpbGwgYWxzbyBkaXNwYXRjaCB0aGUgYG1hdGNocGxheWVyYCBldmVudCwgY29udGFpbmluZyB0aGUgbmV3IGNvbnRleHQgSUQgYW5kIFR5cGUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkZWZhdWx0IG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIHBsYXllcnMgaW4gb25lIG1hdGNoZWQgdGhyZWFkIGFyZSAyIGFuZCAyMCByZXNwZWN0aXZlbHksXHJcbiAgICAgKiBkZXBlbmRpbmcgb24gaG93IG1hbnkgcGxheWVycyBhcmUgdHJ5aW5nIHRvIGdldCBtYXRjaGVkIGFyb3VuZCB0aGUgc2FtZSB0aW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIGluIGBmYmFwcC1jb25maWcuanNvbmAuIFNlZSB0aGUgQnVuZGxlIENvbmZpZyBkb2N1bWVudGF0aW9uIGZvciBkb2N1bWVudGF0aW9uIGFib3V0IGBmYmFwcC1jb25maWcuanNvbmAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4jbWF0Y2hQbGF5ZXJcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFttYXRjaFRhZ10gLSBPcHRpb25hbCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWVyIHVzZWQgdG8gZ3JvdXAgdGhlbSB3aXRoIHNpbWlsYXIgcGxheWVycy4gUGxheWVycyB3aWxsIG9ubHkgYmUgZ3JvdXBlZCB3aXRoIG90aGVyIHBsYXllcnMgd2l0aCBleGFjdGx5IHRoZSBzYW1lIHRhZy4gVGhlIHRhZyBtdXN0IG9ubHkgaW5jbHVkZSBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdW5kZXJzY29yZXMgYW5kIGJlIDEwMCBjaGFyYWN0ZXJzIG9yIGxlc3MgaW4gbGVuZ3RoLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3dpdGNoSW1tZWRpYXRlbHk9ZmFsc2VdIC0gT3B0aW9uYWwgZXh0cmEgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBsYXllciBzaG91bGQgYmUgaW1tZWRpYXRlbHkgc3dpdGNoZWQgdG8gdGhlIG5ldyBjb250ZXh0IHdoZW4gYSBtYXRjaCBpcyBmb3VuZC4gQnkgZGVmYXVsdCB0aGlzIHdpbGwgYmUgZmFsc2Ugd2hpY2ggd2lsbCBtZWFuIHRoZSBwbGF5ZXIgbmVlZHMgZXhwbGljaXRseSBwcmVzcyBwbGF5IGFmdGVyIGJlaW5nIG1hdGNoZWQgdG8gc3dpdGNoIHRvIHRoZSBuZXcgY29udGV4dC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgbWF0Y2hQbGF5ZXI6IGZ1bmN0aW9uIChtYXRjaFRhZywgc3dpdGNoSW1tZWRpYXRlbHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG1hdGNoVGFnID09PSB1bmRlZmluZWQpIHsgbWF0Y2hUYWcgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKHN3aXRjaEltbWVkaWF0ZWx5ID09PSB1bmRlZmluZWQpIHsgc3dpdGNoSW1tZWRpYXRlbHkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ21hdGNoUGxheWVyQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50Lm1hdGNoUGxheWVyQXN5bmMobWF0Y2hUYWcsIHN3aXRjaEltbWVkaWF0ZWx5KS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5nZXRJRCgpO1xyXG4gICAgICAgICAgICBfdGhpcy5nZXRUeXBlKCk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdtYXRjaHBsYXllcicsIF90aGlzLmNvbnRleHRJRCwgX3RoaXMuY29udGV4dFR5cGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGxlYWRlcmJvYXJkIGJlbG9uZ2luZyB0byB0aGlzIEluc3RhbnQgR2FtZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRhdGEgaXMgcmVxdWVzdGVkIGluIGFuIGFzeW5jIGNhbGwsIHNvIHRoZSByZXN1bHQgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoZSBjYWxsIGNvbXBsZXRlcyB0aGUgYGdldGxlYWRlcmJvYXJkYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQgYWxvbmcgd2l0aCBhIExlYWRlcmJvYXJkIG9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNnZXRMZWFkZXJib2FyZFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBsZWFkZXJib2FyZC4gRWFjaCBsZWFkZXJib2FyZCBmb3IgYW4gSW5zdGFudCBHYW1lIG11c3QgaGF2ZSBpdHMgb3duIGRpc3RpbmN0IG5hbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRmFjZWJvb2sgSW5zdGFudCBHYW1lcyBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGdldExlYWRlcmJvYXJkOiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tBUEkoJ2dldExlYWRlcmJvYXJkQXN5bmMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgRkJJbnN0YW50LmdldExlYWRlcmJvYXJkQXN5bmMobmFtZSkudGhlbihmdW5jdGlvbiAoZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsZWFkZXJib2FyZCA9IG5ldyBMZWFkZXJib2FyZChfdGhpcywgZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5sZWFkZXJib2FyZHNbbmFtZV0gPSBsZWFkZXJib2FyZDtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldGxlYWRlcmJvYXJkJywgbGVhZGVyYm9hcmQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUXVpdHMgdGhlIEZhY2Vib29rIEFQSSBhbmQgdGhlbiBkZXN0cm95cyB0aGlzIHBsdWdpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbiNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgRkJJbnN0YW50LnF1aXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYXRhbG9nID0gW107XHJcbiAgICAgICAgdGhpcy5wdXJjaGFzZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmxlYWRlcmJvYXJkcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuYWRzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIExlYWRlcmJvYXJkU2NvcmUgPSByZXF1aXJlKCcuL0xlYWRlcmJvYXJkU2NvcmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBvbmUgc2luZ2xlIExlYWRlcmJvYXJkIHRoYXQgYmVsb25ncyB0byBhIEZhY2Vib29rIEluc3RhbnQgR2FtZS5cclxuICogXHJcbiAqIFlvdSBkbyBub3QgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCBpdCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZVxyXG4gKiBgZ2V0TGVhZGVyYm9hcmQoKWAgbWV0aG9kIG9mIHRoZSBtYWluIHBsdWdpbi5cclxuICpcclxuICogQGNsYXNzIEZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmRcclxuICogQG1lbWJlck9mIFBoYXNlclxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW59IHBsdWdpbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbi5cclxuICogQHBhcmFtIHthbnl9IGRhdGEgLSBBbiBJbnN0YW50IEdhbWUgbGVhZGVyYm9hcmQgaW5zdGFuY2UuXHJcbiAqL1xyXG52YXIgTGVhZGVyYm9hcmQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIExlYWRlcmJvYXJkIChwbHVnaW4sIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBGYWNlYm9vayBJbnN0YW50IEdhbWVzIFBsdWdpbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc0xlYWRlcmJvYXJkI3BsdWdpblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBJbnN0YW50IEdhbWUgbGVhZGVyYm9hcmQgaW5zdGFuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNMZWFkZXJib2FyZCNyZWZcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlZiA9IGRhdGE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBsZWFkZXJib2FyZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc0xlYWRlcmJvYXJkI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhLmdldE5hbWUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSBjb250ZXh0IHRoYXQgdGhlIGxlYWRlcmJvYXJkIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgbnVsbCBpZiB0aGUgbGVhZGVyYm9hcmQgaXMgbm90IHRpZWQgdG8gYSBwYXJ0aWN1bGFyIGNvbnRleHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNMZWFkZXJib2FyZCNjb250ZXh0SURcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnRleHRJRCA9IGRhdGEuZ2V0Q29udGV4dElEKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcGxheWVyIGVudHJpZXMgaW4gdGhlIGxlYWRlcmJvYXJkLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgZGVmYXVsdHMgdG8gemVyby4gUG9wdWxhdGUgaXQgdmlhIHRoZSBgZ2V0RW50cnlDb3VudCgpYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNMZWFkZXJib2FyZCNlbnRyeUNvdW50XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW50cnlDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwbGF5ZXJzIHNjb3JlIG9iamVjdC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGRlZmF1bHRzIHRvIGBudWxsYC4gUG9wdWxhdGUgaXQgdmlhIHRoZSBgZ2V0UGxheWVyU2NvcmUoKWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmQjcGxheWVyU2NvcmVcclxuICAgICAgICAgKiBAdHlwZSB7TGVhZGVyYm9hcmRTY29yZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wbGF5ZXJTY29yZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzY29yZXMgaW4gdGhlIExlYWRlcmJvYXJkIGZyb20gdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBkZWZhdWx0cyB0byBhbiBlbXB0eSBhcnJheS4gUG9wdWxhdGUgaXQgdmlhIHRoZSBgZ2V0U2NvcmVzKClgIG1ldGhvZC5cclxuICAgICAgICAgKiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgcmVzZXQgZWFjaCB0aW1lIGBnZXRTY29yZXMoKWAgaXMgY2FsbGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmQjc2NvcmVzXHJcbiAgICAgICAgICogQHR5cGUge0xlYWRlcmJvYXJkU2NvcmVbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY29yZXMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRFbnRyeUNvdW50KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHBsYXllciBlbnRyaWVzIGluIHRoZSBsZWFkZXJib2FyZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRhdGEgaXMgcmVxdWVzdGVkIGluIGFuIGFzeW5jIGNhbGwsIHNvIHRoZSByZXN1bHQgaXNuJ3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoZSBjYWxsIGNvbXBsZXRlcyB0aGlzIExlYWRlcmJvYXJkIHdpbGwgZW1pdCB0aGUgYGdldGVudHJ5Y291bnRgIGV2ZW50IGFsb25nIHdpdGggdGhlIGNvdW50IGFuZCBuYW1lIG9mIHRoZSBMZWFkZXJib2FyZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc0xlYWRlcmJvYXJkI2dldEVudHJ5Q291bnRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMZWFkZXJib2FyZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZ2V0RW50cnlDb3VudDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnJlZi5nZXRFbnRyeUNvdW50QXN5bmMoKS50aGVuKGZ1bmN0aW9uIChjb3VudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVudHJ5Q291bnQgPSBjb3VudDtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldGVudHJ5Y291bnQnLCBjb3VudCwgX3RoaXMubmFtZSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBwbGF5ZXIncyBzY29yZS4gSWYgdGhlIHBsYXllciBoYXMgYW4gZXhpc3Rpbmcgc2NvcmUsIHRoZSBvbGQgc2NvcmUgd2lsbCBvbmx5IGJlIHJlcGxhY2VkIGlmIHRoZSBuZXcgc2NvcmUgaXMgYmV0dGVyIHRoYW4gaXQuXHJcbiAgICAgKiBOT1RFOiBJZiB0aGUgbGVhZGVyYm9hcmQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgY29udGV4dCwgdGhlIGdhbWUgbXVzdCBiZSBpbiB0aGF0IGNvbnRleHQgdG8gc2V0IGEgc2NvcmUgZm9yIHRoZSBwbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkYXRhIGlzIHJlcXVlc3RlZCBpbiBhbiBhc3luYyBjYWxsLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiB0aGUgY2FsbCBjb21wbGV0ZXMgdGhpcyBMZWFkZXJib2FyZCB3aWxsIGVtaXQgdGhlIGBzZXRzY29yZWAgZXZlbnQgYWxvbmcgd2l0aCB0aGUgTGVhZGVyYm9hcmRTY29yZSBvYmplY3QgYW5kIHRoZSBuYW1lIG9mIHRoZSBMZWFkZXJib2FyZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNhdmUgZmFpbHMgdGhlIGV2ZW50IHdpbGwgc2VuZCBgbnVsbGAgYXMgdGhlIHNjb3JlIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmQjc2V0U2NvcmVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzY29yZSAtIFRoZSBuZXcgc2NvcmUgZm9yIHRoZSBwbGF5ZXIuIE11c3QgYmUgYSA2NC1iaXQgaW50ZWdlciBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8YW55KX0gW2RhdGFdIC0gTWV0YWRhdGEgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHN0b3JlZCBzY29yZS4gTXVzdCBiZSBsZXNzIHRoYW4gMktCIGluIHNpemUuIElmIGFuIG9iamVjdCBpcyBnaXZlbiBpdCB3aWxsIGJlIHBhc3NlZCB0byBgSlNPTi5zdHJpbmdpZnlgLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExlYWRlcmJvYXJkIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTY29yZTogZnVuY3Rpb24gKHNjb3JlLCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsgZGF0YSA9ICcnOyB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnJlZi5zZXRTY29yZUFzeW5jKHNjb3JlLCBkYXRhKS50aGVuKGZ1bmN0aW9uIChlbnRyeSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNjb3JlID0gTGVhZGVyYm9hcmRTY29yZShlbnRyeSk7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMucGxheWVyU2NvcmUgPSBzY29yZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnc2V0c2NvcmUnLCBzY29yZSwgX3RoaXMubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdzZXRzY29yZScsIG51bGwsIF90aGlzLm5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwbGF5ZXJzIGxlYWRlcmJvYXJkIGVudHJ5IGFuZCBzdG9yZXMgaXQgaW4gdGhlIGBwbGF5ZXJTY29yZWAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkYXRhIGlzIHJlcXVlc3RlZCBpbiBhbiBhc3luYyBjYWxsLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiB0aGUgY2FsbCBjb21wbGV0ZXMgdGhpcyBMZWFkZXJib2FyZCB3aWxsIGVtaXQgdGhlIGBnZXRwbGF5ZXJzY29yZWAgZXZlbnQgYWxvbmcgd2l0aCB0aGUgc2NvcmUgYW5kIHRoZSBuYW1lIG9mIHRoZSBMZWFkZXJib2FyZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHBsYXllciBoYXMgbm90IHlldCBzYXZlZCBhIHNjb3JlLCB0aGUgZXZlbnQgd2lsbCBzZW5kIGBudWxsYCBhcyB0aGUgc2NvcmUgdmFsdWUsIGFuZCBgcGxheWVyU2NvcmVgIHdpbGwgYmUgc2V0IHRvIGBudWxsYCBhcyB3ZWxsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmQjZ2V0UGxheWVyU2NvcmVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMZWFkZXJib2FyZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UGxheWVyU2NvcmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5yZWYuZ2V0UGxheWVyRW50cnlBc3luYygpLnRoZW4oZnVuY3Rpb24gKGVudHJ5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGVudHJ5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2NvcmUgPSBMZWFkZXJib2FyZFNjb3JlKGVudHJ5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wbGF5ZXJTY29yZSA9IHNjb3JlO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdnZXRwbGF5ZXJzY29yZScsIHNjb3JlLCBfdGhpcy5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldHBsYXllcnNjb3JlJywgbnVsbCwgX3RoaXMubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhIHNldCBvZiBsZWFkZXJib2FyZCBlbnRyaWVzLCBvcmRlcmVkIGJ5IHNjb3JlIHJhbmtpbmcgaW4gdGhlIGxlYWRlcmJvYXJkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGF0YSBpcyByZXF1ZXN0ZWQgaW4gYW4gYXN5bmMgY2FsbCwgc28gdGhlIHJlc3VsdCBpc24ndCBhdmFpbGFibGUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIGNhbGwgY29tcGxldGVzIHRoaXMgTGVhZGVyYm9hcmQgd2lsbCBlbWl0IHRoZSBgZ2V0c2NvcmVzYCBldmVudCBhbG9uZyB3aXRoIGFuIGFycmF5IG9mIExlYWRlcmJvYXJkU2NvcmUgZW50cmllcyBhbmQgdGhlIG5hbWUgb2YgdGhlIExlYWRlcmJvYXJkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzTGVhZGVyYm9hcmQjZ2V0U2NvcmVzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NvdW50PTEwXSAtIFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBhdHRlbXB0IHRvIGZldGNoIGZyb20gdGhlIGxlYWRlcmJvYXJkLiBDdXJyZW50bHksIHVwIHRvIGEgbWF4aW11bSBvZiAxMDAgZW50cmllcyBtYXkgYmUgZmV0Y2hlZCBwZXIgcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgbGVhZGVyYm9hcmQgdGhhdCBlbnRyaWVzIHdpbGwgYmUgZmV0Y2hlZCBmcm9tLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExlYWRlcmJvYXJkIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBnZXRTY29yZXM6IGZ1bmN0aW9uIChjb3VudCwgb2Zmc2V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7IGNvdW50ID0gMTA7IH1cclxuICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0ID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnJlZi5nZXRFbnRyaWVzQXN5bmMoY291bnQsIG9mZnNldCkudGhlbihmdW5jdGlvbiAoZW50cmllcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLnNjb3JlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2NvcmVzLnB1c2goTGVhZGVyYm9hcmRTY29yZShlbnRyeSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ2dldHNjb3JlcycsIF90aGlzLnNjb3JlcywgX3RoaXMubmFtZSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgYSBzZXQgb2YgbGVhZGVyYm9hcmQgZW50cmllcywgYmFzZWQgb24gdGhlIGN1cnJlbnQgcGxheWVyJ3MgY29ubmVjdGVkIHBsYXllcnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBwbGF5ZXIpLCBvcmRlcmVkIGJ5IGxvY2FsIHJhbmsgd2l0aGluIHRoZSBzZXQgb2YgY29ubmVjdGVkIHBsYXllcnMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkYXRhIGlzIHJlcXVlc3RlZCBpbiBhbiBhc3luYyBjYWxsLCBzbyB0aGUgcmVzdWx0IGlzbid0IGF2YWlsYWJsZSBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiB0aGUgY2FsbCBjb21wbGV0ZXMgdGhpcyBMZWFkZXJib2FyZCB3aWxsIGVtaXQgdGhlIGBnZXRjb25uZWN0ZWRzY29yZXNgIGV2ZW50IGFsb25nIHdpdGggYW4gYXJyYXkgb2YgTGVhZGVyYm9hcmRTY29yZSBlbnRyaWVzIGFuZCB0aGUgbmFtZSBvZiB0aGUgTGVhZGVyYm9hcmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRmFjZWJvb2tJbnN0YW50R2FtZXNMZWFkZXJib2FyZCNnZXRDb25uZWN0ZWRTY29yZXNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMZWFkZXJib2FyZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZ2V0Q29ubmVjdGVkU2NvcmVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMucmVmLmdldENvbm5lY3RlZFBsYXllckVudHJpZXNBc3luYygpLnRoZW4oZnVuY3Rpb24gKGVudHJpZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5zY29yZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNjb3Jlcy5wdXNoKExlYWRlcmJvYXJkU2NvcmUoZW50cnkpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KCdnZXRjb25uZWN0ZWRzY29yZXMnLCBfdGhpcy5zY29yZXMsIF90aGlzLm5hbWUpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTGVhZGVyYm9hcmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gTGVhZGVyYm9hcmRTY29yZVxyXG4gKlxyXG4gKiBAcHJvcGVydHkge2ludGVnZXJ9IHNjb3JlIC0gQW4gaW50ZWdlciBzY29yZSB2YWx1ZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjb3JlRm9ybWF0dGVkIC0gVGhlIHNjb3JlIHZhbHVlLCBmb3JtYXR0ZWQgd2l0aCB0aGUgc2NvcmUgZm9ybWF0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVhZGVyYm9hcmQuXHJcbiAqIEBwcm9wZXJ0eSB7aW50ZWdlcn0gdGltZXN0YW1wIC0gVGhlIFVuaXggdGltZXN0YW1wIG9mIHdoZW4gdGhlIGxlYWRlcmJvYXJkIGVudHJ5IHdhcyBsYXN0IHVwZGF0ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7aW50ZWdlcn0gcmFuayAtIFRoZSBlbnRyeSdzIGxlYWRlcmJvYXJkIHJhbmtpbmcuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhIC0gVGhlIGRldmVsb3Blci1zcGVjaWZpZWQgcGF5bG9hZCBhc3NvY2lhdGVkIHdpdGggdGhlIHNjb3JlLCBvciBudWxsIGlmIG9uZSB3YXMgbm90IHNldC5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXllck5hbWUgLSBUaGUgcGxheWVyJ3MgbG9jYWxpemVkIGRpc3BsYXkgbmFtZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXllclBob3RvVVJMIC0gIEEgdXJsIHRvIHRoZSBwbGF5ZXIncyBwdWJsaWMgcHJvZmlsZSBwaG90by5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXllcklEIC0gVGhlIGdhbWUncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHBsYXllci5cclxuICovXHJcblxyXG52YXIgTGVhZGVyYm9hcmRTY29yZSA9IGZ1bmN0aW9uIChlbnRyeSlcclxue1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBzY29yZTogZW50cnkuZ2V0U2NvcmUoKSxcclxuICAgICAgICBzY29yZUZvcm1hdHRlZDogZW50cnkuZ2V0Rm9ybWF0dGVkU2NvcmUoKSxcclxuICAgICAgICB0aW1lc3RhbXA6IGVudHJ5LmdldFRpbWVzdGFtcCgpLFxyXG4gICAgICAgIHJhbms6IGVudHJ5LmdldFJhbmsoKSxcclxuICAgICAgICBkYXRhOiBlbnRyeS5nZXRFeHRyYURhdGEoKSxcclxuICAgICAgICBwbGF5ZXJOYW1lOiBlbnRyeS5nZXRQbGF5ZXIoKS5nZXROYW1lKCksXHJcbiAgICAgICAgcGxheWVyUGhvdG9VUkw6IGVudHJ5LmdldFBsYXllcigpLmdldFBob3RvKCksXHJcbiAgICAgICAgcGxheWVySUQ6IGVudHJ5LmdldFBsYXllcigpLmdldElEKClcclxuICAgIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExlYWRlcmJvYXJkU2NvcmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vc3JjL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm9kdWN0XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdIC0gVGhlIHRpdGxlIG9mIHRoZSBwcm9kdWN0LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb2R1Y3RJRF0gLSBUaGUgcHJvZHVjdCdzIGdhbWUtc3BlY2lmaWVkIGlkZW50aWZpZXIuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gVGhlIHByb2R1Y3QgZGVzY3JpcHRpb24uXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW1hZ2VVUkldIC0gQSBsaW5rIHRvIHRoZSBwcm9kdWN0J3MgYXNzb2NpYXRlZCBpbWFnZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmljZV0gLSBUaGUgcHJpY2Ugb2YgdGhlIHByb2R1Y3QuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpY2VDdXJyZW5jeUNvZGVdIC0gVGhlIGN1cnJlbmN5IGNvZGUgZm9yIHRoZSBwcm9kdWN0LlxyXG4gKi9cclxuXHJcbnZhciBQcm9kdWN0ID0gZnVuY3Rpb24gKGRhdGEpXHJcbntcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgdGl0bGU6IEdldEZhc3RWYWx1ZShkYXRhLCAndGl0bGUnLCAnJyksXHJcbiAgICAgICAgcHJvZHVjdElEOiBHZXRGYXN0VmFsdWUoZGF0YSwgJ3Byb2R1Y3RJRCcsICcnKSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogR2V0RmFzdFZhbHVlKGRhdGEsICdkZXNjcmlwdGlvbicsICcnKSxcclxuICAgICAgICBpbWFnZVVSSTogR2V0RmFzdFZhbHVlKGRhdGEsICdpbWFnZVVSSScsICcnKSxcclxuICAgICAgICBwcmljZTogR2V0RmFzdFZhbHVlKGRhdGEsICdwcmljZScsICcnKSxcclxuICAgICAgICBwcmljZUN1cnJlbmN5Q29kZTogR2V0RmFzdFZhbHVlKGRhdGEsICdwcmljZUN1cnJlbmN5Q29kZScsICcnKVxyXG4gICAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUHJvZHVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAxOCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9uc3Rvcm0vcGhhc2VyL2Jsb2IvbWFzdGVyL2xpY2Vuc2UudHh0fE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi8uLi9zcmMvdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cmNoYXNlXHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGV2ZWxvcGVyUGF5bG9hZF0gLSBBIGRldmVsb3Blci1zcGVjaWZpZWQgc3RyaW5nLCBwcm92aWRlZCBkdXJpbmcgdGhlIHB1cmNoYXNlIG9mIHRoZSBwcm9kdWN0LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BheW1lbnRJRF0gLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHB1cmNoYXNlIHRyYW5zYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb2R1Y3RJRF0gLSBUaGUgcHJvZHVjdCdzIGdhbWUtc3BlY2lmaWVkIGlkZW50aWZpZXIuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHVyY2hhc2VUaW1lXSAtIFVuaXggdGltZXN0YW1wIG9mIHdoZW4gdGhlIHB1cmNoYXNlIG9jY3VycmVkLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3B1cmNoYXNlVG9rZW5dIC0gQSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIHB1cmNoYXNlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY29uc3VtZSB0aGUgcHVyY2hhc2UuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2lnbmVkUmVxdWVzdF0gLSBTZXJ2ZXItc2lnbmVkIGVuY29kaW5nIG9mIHRoZSBwdXJjaGFzZSByZXF1ZXN0LlxyXG4gKi9cclxuXHJcbnZhciBQdXJjaGFzZSA9IGZ1bmN0aW9uIChkYXRhKVxyXG57XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGRldmVsb3BlclBheWxvYWQ6IEdldEZhc3RWYWx1ZShkYXRhLCAnZGV2ZWxvcGVyUGF5bG9hZCcsICcnKSxcclxuICAgICAgICBwYXltZW50SUQ6IEdldEZhc3RWYWx1ZShkYXRhLCAncGF5bWVudElEJywgJycpLFxyXG4gICAgICAgIHByb2R1Y3RJRDogR2V0RmFzdFZhbHVlKGRhdGEsICdwcm9kdWN0SUQnLCAnJyksXHJcbiAgICAgICAgcHVyY2hhc2VUaW1lOiBHZXRGYXN0VmFsdWUoZGF0YSwgJ3B1cmNoYXNlVGltZScsICcnKSxcclxuICAgICAgICBwdXJjaGFzZVRva2VuOiBHZXRGYXN0VmFsdWUoZGF0YSwgJ3B1cmNoYXNlVG9rZW4nLCAnJyksXHJcbiAgICAgICAgc2lnbmVkUmVxdWVzdDogR2V0RmFzdFZhbHVlKGRhdGEsICdzaWduZWRSZXF1ZXN0JywgJycpXHJcbiAgICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQdXJjaGFzZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgc2FtbWVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBRdWlja1NldCA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvYWxpZ24vdG8vUXVpY2tTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcywgYW5kIGFsaWducyB0aGVtIG5leHQgdG8gZWFjaCBvdGhlci5cclxuICpcclxuICogVGhlIGZpcnN0IGl0ZW0gaXNuJ3QgbW92ZWQuIFRoZSBzZWNvbmQgaXRlbSBpcyBhbGlnbmVkIG5leHQgdG8gdGhlIGZpcnN0LCB0aGVuIHRoZSB0aGlyZCBuZXh0IHRvIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLkFsaWduVG9cclxuICogQHNpbmNlIDMuMjIuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0byBhbGlnbiB0aGUgaXRlbXMgd2l0aC4gVGhpcyBpcyBhbiBhbGlnbiBjb25zdGFudCwgc3VjaCBhcyBgUGhhc2VyLkRpc3BsYXkuQWxpZ24uTEVGVF9DRU5URVJgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgQWxpZ25UbyA9IGZ1bmN0aW9uIChpdGVtcywgcG9zaXRpb24sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIHZhciB0YXJnZXQgPSBpdGVtc1swXTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgIFF1aWNrU2V0KGl0ZW0sIHRhcmdldCwgcG9zaXRpb24sIG9mZnNldFgsIG9mZnNldFkpO1xyXG5cclxuICAgICAgICB0YXJnZXQgPSBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQWxpZ25UbztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZUluYyA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZUluYycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIGEgcHVibGljIGBhbmdsZWAgcHJvcGVydHksXHJcbiAqIGFuZCB0aGVuIGFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIGVhY2ggb2YgdGhlaXIgYGFuZ2xlYCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBBbmdsZShncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5BbmdsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBhbmdsZWAgcHJvcGVydHkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgQW5nbGUgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ2FuZ2xlJywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBbmdsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBhbmQgcGFzc2VzIGVhY2ggb2YgdGhlbSB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5DYWxsXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQWN0aW9ucy5DYWxsQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGJlIGludm9rZWQuIEl0IHdpbGwgYmUgcGFzc2VkIGp1c3Qgb25lIGFyZ3VtZW50OiB0aGUgaXRlbSBmcm9tIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHsqfSBjb250ZXh0IC0gVGhlIHNjb3BlIGluIHdoaWNoIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIENhbGwgPSBmdW5jdGlvbiAoaXRlbXMsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG57XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYWxsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IGhhcyBwcm9wZXJ0aWVzIHdoaWNoIG1hdGNoXHJcbiAqIGFsbCBvZiB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIGBjb21wYXJlYCBvYmplY3QuIEZvciBleGFtcGxlLCBpZiB0aGUgY29tcGFyZSBvYmplY3Qgd2FzOiBgeyBzY2FsZVg6IDAuNSwgYWxwaGE6IDEgfWBcclxuICogdGhlbiBpdCB3b3VsZCByZXR1cm4gdGhlIGZpcnN0IGl0ZW0gd2hpY2ggaGFkIHRoZSBwcm9wZXJ0eSBgc2NhbGVYYCBzZXQgdG8gMC41IGFuZCBgYWxwaGFgIHNldCB0byAxLlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBHZXRGaXJzdChncm91cC5nZXRDaGlsZHJlbigpLCBjb21wYXJlLCBpbmRleClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5HZXRGaXJzdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXNdXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSBzZWFyY2hlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBhcmUgLSBUaGUgY29tcGFyaXNvbiBvYmplY3QuIEVhY2ggcHJvcGVydHkgaW4gdGhpcyBvYmplY3Qgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGl0ZW1zIG9mIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICpcclxuICogQHJldHVybiB7PyhvYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QpfSBUaGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGNvbXBhcmlzb24gb2JqZWN0LCBvciBgbnVsbGAgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLlxyXG4gKi9cclxudmFyIEdldEZpcnN0ID0gZnVuY3Rpb24gKGl0ZW1zLCBjb21wYXJlLCBpbmRleClcclxue1xyXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHsgaW5kZXggPSAwOyB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IGluZGV4OyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcclxuXHJcbiAgICAgICAgdmFyIG1hdGNoID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gY29tcGFyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtW3Byb3BlcnR5XSAhPT0gY29tcGFyZVtwcm9wZXJ0eV0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXRjaClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0Rmlyc3Q7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIG9iamVjdHMgYW5kIHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBoYXMgcHJvcGVydGllcyB3aGljaCBtYXRjaFxyXG4gKiBhbGwgb2YgdGhvc2Ugc3BlY2lmaWVkIGluIHRoZSBgY29tcGFyZWAgb2JqZWN0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNvbXBhcmUgb2JqZWN0IHdhczogYHsgc2NhbGVYOiAwLjUsIGFscGhhOiAxIH1gXHJcbiAqIHRoZW4gaXQgd291bGQgcmV0dXJuIHRoZSBsYXN0IGl0ZW0gd2hpY2ggaGFkIHRoZSBwcm9wZXJ0eSBgc2NhbGVYYCBzZXQgdG8gMC41IGFuZCBgYWxwaGFgIHNldCB0byAxLlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBHZXRMYXN0KGdyb3VwLmdldENoaWxkcmVuKCksIGNvbXBhcmUsIGluZGV4KWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLkdldExhc3RcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgc2VhcmNoZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wYXJlIC0gVGhlIGNvbXBhcmlzb24gb2JqZWN0LiBFYWNoIHByb3BlcnR5IGluIHRoaXMgb2JqZWN0IHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBpdGVtcyBvZiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqXHJcbiAqIEByZXR1cm4gez8ob2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0KX0gVGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGNvbXBhcmlzb24gb2JqZWN0LCBvciBgbnVsbGAgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLlxyXG4gKi9cclxudmFyIEdldExhc3QgPSBmdW5jdGlvbiAoaXRlbXMsIGNvbXBhcmUsIGluZGV4KVxyXG57XHJcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgeyBpbmRleCA9IDA7IH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICB2YXIgbWF0Y2ggPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb21wYXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW1bcHJvcGVydHldICE9PSBjb21wYXJlW3Byb3BlcnR5XSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRMYXN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBbGlnbkluID0gcmVxdWlyZSgnLi4vZGlzcGxheS9hbGlnbi9pbi9RdWlja1NldCcpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9kaXNwbGF5L2FsaWduL2NvbnN0Jyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgWm9uZSA9IHJlcXVpcmUoJy4uL2dhbWVvYmplY3RzL3pvbmUvWm9uZScpO1xyXG5cclxudmFyIHRlbXBab25lID0gbmV3IFpvbmUoeyBzeXM6IHsgcXVldWVEZXB0aFNvcnQ6IE5PT1AsIGV2ZW50czogeyBvbmNlOiBOT09QIH0gfSB9LCAwLCAwLCAxLCAxKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcyxcclxuICogYW5kIHRoZW4gYWxpZ25zIHRoZW0gYmFzZWQgb24gdGhlIGdyaWQgY29uZmlndXJhdGlvbiBnaXZlbiB0byB0aGlzIGFjdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLkdyaWRBbGlnblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkFjdGlvbnMuR3JpZEFsaWduQ29uZmlnfSBvcHRpb25zIC0gVGhlIEdyaWRBbGlnbiBDb25maWd1cmF0aW9uIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIEdyaWRBbGlnbiA9IGZ1bmN0aW9uIChpdGVtcywgb3B0aW9ucylcclxue1xyXG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0ge307IH1cclxuXHJcbiAgICB2YXIgd2lkdGhTZXQgPSBvcHRpb25zLmhhc093blByb3BlcnR5KCd3aWR0aCcpO1xyXG4gICAgdmFyIGhlaWdodFNldCA9IG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2hlaWdodCcpO1xyXG5cclxuICAgIHZhciB3aWR0aCA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnd2lkdGgnLCAtMSk7XHJcbiAgICB2YXIgaGVpZ2h0ID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdoZWlnaHQnLCAtMSk7XHJcblxyXG4gICAgdmFyIGNlbGxXaWR0aCA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnY2VsbFdpZHRoJywgMSk7XHJcbiAgICB2YXIgY2VsbEhlaWdodCA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnY2VsbEhlaWdodCcsIGNlbGxXaWR0aCk7XHJcblxyXG4gICAgdmFyIHBvc2l0aW9uID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdwb3NpdGlvbicsIENPTlNULlRPUF9MRUZUKTtcclxuICAgIHZhciB4ID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICd4JywgMCk7XHJcbiAgICB2YXIgeSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAneScsIDApO1xyXG5cclxuICAgIHZhciBjeCA9IDA7XHJcbiAgICB2YXIgY3kgPSAwO1xyXG4gICAgdmFyIHcgPSAod2lkdGggKiBjZWxsV2lkdGgpO1xyXG4gICAgdmFyIGggPSAoaGVpZ2h0ICogY2VsbEhlaWdodCk7XHJcblxyXG4gICAgdGVtcFpvbmUuc2V0UG9zaXRpb24oeCwgeSk7XHJcbiAgICB0ZW1wWm9uZS5zZXRTaXplKGNlbGxXaWR0aCwgY2VsbEhlaWdodCk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBBbGlnbkluKGl0ZW1zW2ldLCB0ZW1wWm9uZSwgcG9zaXRpb24pO1xyXG5cclxuICAgICAgICBpZiAod2lkdGhTZXQgJiYgd2lkdGggPT09IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdlIGtlZXAgbGF5aW5nIHRoZW0gb3V0IGhvcml6b250YWxseSB1bnRpbCB3ZSd2ZSBkb25lIHRoZW0gYWxsXHJcbiAgICAgICAgICAgIHRlbXBab25lLnggKz0gY2VsbFdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWlnaHRTZXQgJiYgaGVpZ2h0ID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSBrZWVwIGxheWluZyB0aGVtIG91dCB2ZXJ0aWNhbGx5IHVudGlsIHdlJ3ZlIGRvbmUgdGhlbSBhbGxcclxuICAgICAgICAgICAgdGVtcFpvbmUueSArPSBjZWxsSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgV2Uga2VlcCBsYXlpbmcgdGhlbSBvdXQgdW50aWwgd2UgaGl0IHRoZSBjb2x1bW4gbGltaXRcclxuICAgICAgICAgICAgY3ggKz0gY2VsbFdpZHRoO1xyXG4gICAgICAgICAgICB0ZW1wWm9uZS54ICs9IGNlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjeCA9PT0gdylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY3ggPSAwO1xyXG4gICAgICAgICAgICAgICAgY3kgKz0gY2VsbEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHRlbXBab25lLnggPSB4O1xyXG4gICAgICAgICAgICAgICAgdGVtcFpvbmUueSArPSBjZWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjeSA9PT0gaClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgV2UndmUgaGl0IHRoZSBjb2x1bW4gbGltaXQsIHNvIHJldHVybiwgZXZlbiBpZiB0aGVyZSBhcmUgaXRlbXMgbGVmdFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR3JpZEFsaWduO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlSW5jID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgYSBwdWJsaWMgYGFscGhhYCBwcm9wZXJ0eSxcclxuICogYW5kIHRoZW4gYWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gZWFjaCBvZiB0aGVpciBgYWxwaGFgIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcGAgcHJvcGVydHkgaXMgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYEluY0FscGhhKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLkluY0FscGhhXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBiZSBhZGRlZCB0byB0aGUgYGFscGhhYCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBJbmNBbHBoYSA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlSW5jKGl0ZW1zLCAnYWxwaGEnLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluY0FscGhhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlSW5jID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgYSBwdWJsaWMgYHhgIHByb3BlcnR5LFxyXG4gKiBhbmQgdGhlbiBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byBlYWNoIG9mIHRoZWlyIGB4YCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBJbmNYKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLkluY1hcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIGJlIGFkZGVkIHRvIHRoZSBgeGAgcHJvcGVydHkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgSW5jWCA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlSW5jKGl0ZW1zLCAneCcsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW5jWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZUluYyA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZUluYycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIHB1YmxpYyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLFxyXG4gKiBhbmQgdGhlbiBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byBlYWNoIG9mIHRoZW0uXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcFhgIGFuZCBgc3RlcFlgIHByb3BlcnRpZXMgYXJlIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBJbmNYWShncm91cC5nZXRDaGlsZHJlbigpLCB4LCB5LCBzdGVwWCwgc3RlcFkpYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuSW5jWFlcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGB4YCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIGFtb3VudCB0byBiZSBhZGRlZCB0byB0aGUgYHlgIHByb3BlcnR5LiBJZiBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXQgdXNlcyB0aGUgYHhgIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBYPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHhgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgeWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgSW5jWFkgPSBmdW5jdGlvbiAoaXRlbXMsIHgsIHksIHN0ZXBYLCBzdGVwWSwgaW5kZXgsIGRpcmVjdGlvbilcclxue1xyXG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCB8fCB5ID09PSBudWxsKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ3gnLCB4LCBzdGVwWCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIFByb3BlcnR5VmFsdWVJbmMoaXRlbXMsICd5JywgeSwgc3RlcFksIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbmNYWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZUluYyA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZUluYycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIGEgcHVibGljIGB5YCBwcm9wZXJ0eSxcclxuICogYW5kIHRoZW4gYWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gZWFjaCBvZiB0aGVpciBgeWAgcHJvcGVydGllcy5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwYCBwcm9wZXJ0eSBpcyBhcHBsaWVkIGluY3JlbWVudGFsbHksIG11bHRpcGxpZWQgYnkgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICpcclxuICogVG8gdXNlIHRoaXMgd2l0aCBhIEdyb3VwOiBgSW5jWShncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5JbmNZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBiZSBhZGRlZCB0byB0aGUgYHlgIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIEluY1kgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ3knLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluY1k7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhbmQgcG9zaXRpb25zIHRoZW0gb24gZXZlbmx5IHNwYWNlZCBwb2ludHMgYXJvdW5kIHRoZSBwZXJpbWV0ZXIgb2YgYSBDaXJjbGUuXHJcbiAqIFxyXG4gKiBJZiB5b3Ugd2lzaCB0byBwYXNzIGEgYFBoYXNlci5HYW1lT2JqZWN0cy5DaXJjbGVgIFNoYXBlIHRvIHRoaXMgZnVuY3Rpb24sIHlvdSBzaG91bGQgcGFzcyBpdHMgYGdlb21gIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUGxhY2VPbkNpcmNsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gcG9zaXRpb24gdGhlIEdhbWUgT2JqZWN0cyBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydEFuZ2xlPTBdIC0gT3B0aW9uYWwgYW5nbGUgdG8gc3RhcnQgcG9zaXRpb24gZnJvbSwgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmRBbmdsZT02LjI4XSAtIE9wdGlvbmFsIGFuZ2xlIHRvIHN0b3AgcG9zaXRpb24gYXQsIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgUGxhY2VPbkNpcmNsZSA9IGZ1bmN0aW9uIChpdGVtcywgY2lyY2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSlcclxue1xyXG4gICAgaWYgKHN0YXJ0QW5nbGUgPT09IHVuZGVmaW5lZCkgeyBzdGFydEFuZ2xlID0gMDsgfVxyXG4gICAgaWYgKGVuZEFuZ2xlID09PSB1bmRlZmluZWQpIHsgZW5kQW5nbGUgPSA2LjI4OyB9XHJcblxyXG4gICAgdmFyIGFuZ2xlID0gc3RhcnRBbmdsZTtcclxuICAgIHZhciBhbmdsZVN0ZXAgPSAoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSAvIGl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGl0ZW1zW2ldLnggPSBjaXJjbGUueCArIChjaXJjbGUucmFkaXVzICogTWF0aC5jb3MoYW5nbGUpKTtcclxuICAgICAgICBpdGVtc1tpXS55ID0gY2lyY2xlLnkgKyAoY2lyY2xlLnJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKSk7XHJcblxyXG4gICAgICAgIGFuZ2xlICs9IGFuZ2xlU3RlcDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBsYWNlT25DaXJjbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhbmQgcG9zaXRpb25zIHRoZW0gb24gZXZlbmx5IHNwYWNlZCBwb2ludHMgYXJvdW5kIHRoZSBwZXJpbWV0ZXIgb2YgYW4gRWxsaXBzZS5cclxuICogXHJcbiAqIElmIHlvdSB3aXNoIHRvIHBhc3MgYSBgUGhhc2VyLkdhbWVPYmplY3RzLkVsbGlwc2VgIFNoYXBlIHRvIHRoaXMgZnVuY3Rpb24sIHlvdSBzaG91bGQgcGFzcyBpdHMgYGdlb21gIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUGxhY2VPbkVsbGlwc2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gZWxsaXBzZSAtIFRoZSBFbGxpcHNlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdHMgb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRBbmdsZT0wXSAtIE9wdGlvbmFsIGFuZ2xlIHRvIHN0YXJ0IHBvc2l0aW9uIGZyb20sIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kQW5nbGU9Ni4yOF0gLSBPcHRpb25hbCBhbmdsZSB0byBzdG9wIHBvc2l0aW9uIGF0LCBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFBsYWNlT25FbGxpcHNlID0gZnVuY3Rpb24gKGl0ZW1zLCBlbGxpcHNlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSlcclxue1xyXG4gICAgaWYgKHN0YXJ0QW5nbGUgPT09IHVuZGVmaW5lZCkgeyBzdGFydEFuZ2xlID0gMDsgfVxyXG4gICAgaWYgKGVuZEFuZ2xlID09PSB1bmRlZmluZWQpIHsgZW5kQW5nbGUgPSA2LjI4OyB9XHJcblxyXG4gICAgdmFyIGFuZ2xlID0gc3RhcnRBbmdsZTtcclxuICAgIHZhciBhbmdsZVN0ZXAgPSAoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSAvIGl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICB2YXIgYSA9IGVsbGlwc2Uud2lkdGggLyAyO1xyXG4gICAgdmFyIGIgPSBlbGxpcHNlLmhlaWdodCAvIDI7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpdGVtc1tpXS54ID0gZWxsaXBzZS54ICsgYSAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICBpdGVtc1tpXS55ID0gZWxsaXBzZS55ICsgYiAqIE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgYW5nbGUgKz0gYW5nbGVTdGVwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGxhY2VPbkVsbGlwc2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFBvaW50cyA9IHJlcXVpcmUoJy4uL2dlb20vbGluZS9HZXRQb2ludHMnKTtcclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIG9uIGV2ZW5seSBzcGFjZWQgcG9pbnRzIG9mIGEgTGluZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlBsYWNlT25MaW5lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgTGluZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFBsYWNlT25MaW5lID0gZnVuY3Rpb24gKGl0ZW1zLCBsaW5lKVxyXG57XHJcbiAgICB2YXIgcG9pbnRzID0gR2V0UG9pbnRzKGxpbmUsIGl0ZW1zLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcclxuXHJcbiAgICAgICAgaXRlbS54ID0gcG9pbnQueDtcclxuICAgICAgICBpdGVtLnkgPSBwb2ludC55O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGxhY2VPbkxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1hcmNoaW5nQW50cyA9IHJlcXVpcmUoJy4uL2dlb20vcmVjdGFuZ2xlL01hcmNoaW5nQW50cycpO1xyXG52YXIgUm90YXRlTGVmdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L1JvdGF0ZUxlZnQnKTtcclxudmFyIFJvdGF0ZVJpZ2h0ID0gcmVxdWlyZSgnLi4vdXRpbHMvYXJyYXkvUm90YXRlUmlnaHQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgYW5kIHBvc2l0aW9ucyB0aGVtIG9uIGV2ZW5seSBzcGFjZWQgcG9pbnRzIGFyb3VuZCB0aGUgcGVyaW1ldGVyIG9mIGEgUmVjdGFuZ2xlLlxyXG4gKiBcclxuICogUGxhY2VtZW50IHN0YXJ0cyBmcm9tIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLCBhbmQgcHJvY2VlZHMgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLlxyXG4gKiBJZiB0aGUgYHNoaWZ0YCBwYXJhbWV0ZXIgaXMgZ2l2ZW4geW91IGNhbiBvZmZzZXQgd2hlcmUgcGxhY2VtZW50IGJlZ2lucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlBsYWNlT25SZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIFJlY3RhbmdsZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIG9uLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtzaGlmdD0xXSAtIEFuIG9wdGlvbmFsIHBvc2l0aW9uYWwgb2Zmc2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFBsYWNlT25SZWN0YW5nbGUgPSBmdW5jdGlvbiAoaXRlbXMsIHJlY3QsIHNoaWZ0KVxyXG57XHJcbiAgICBpZiAoc2hpZnQgPT09IHVuZGVmaW5lZCkgeyBzaGlmdCA9IDA7IH1cclxuXHJcbiAgICB2YXIgcG9pbnRzID0gTWFyY2hpbmdBbnRzKHJlY3QsIGZhbHNlLCBpdGVtcy5sZW5ndGgpO1xyXG5cclxuICAgIGlmIChzaGlmdCA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgUm90YXRlTGVmdChwb2ludHMsIHNoaWZ0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNoaWZ0IDwgMClcclxuICAgIHtcclxuICAgICAgICBSb3RhdGVSaWdodChwb2ludHMsIE1hdGguYWJzKHNoaWZ0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpdGVtc1tpXS54ID0gcG9pbnRzW2ldLng7XHJcbiAgICAgICAgaXRlbXNbaV0ueSA9IHBvaW50c1tpXS55O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGxhY2VPblJlY3RhbmdsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnJlc2VuaGFtUG9pbnRzID0gcmVxdWlyZSgnLi4vZ2VvbS9saW5lL0JyZXNlbmhhbVBvaW50cycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhbmQgcG9zaXRpb25zIHRoZW0gb24gZXZlbmx5IHNwYWNlZCBwb2ludHMgYXJvdW5kIHRoZSBlZGdlcyBvZiBhIFRyaWFuZ2xlLlxyXG4gKiBcclxuICogSWYgeW91IHdpc2ggdG8gcGFzcyBhIGBQaGFzZXIuR2FtZU9iamVjdHMuVHJpYW5nbGVgIFNoYXBlIHRvIHRoaXMgZnVuY3Rpb24sIHlvdSBzaG91bGQgcGFzcyBpdHMgYGdlb21gIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUGxhY2VPblRyaWFuZ2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBSYXRlPTFdIC0gQW4gb3B0aW9uYWwgc3RlcCByYXRlLCB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgcGFja2luZyBvZiB0aGUgR2FtZSBPYmplY3RzIG9uIHRoZSBsaW5lcy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBQbGFjZU9uVHJpYW5nbGUgPSBmdW5jdGlvbiAoaXRlbXMsIHRyaWFuZ2xlLCBzdGVwUmF0ZSlcclxue1xyXG4gICAgdmFyIHAxID0gQnJlc2VuaGFtUG9pbnRzKHsgeDE6IHRyaWFuZ2xlLngxLCB5MTogdHJpYW5nbGUueTEsIHgyOiB0cmlhbmdsZS54MiwgeTI6IHRyaWFuZ2xlLnkyIH0sIHN0ZXBSYXRlKTtcclxuICAgIHZhciBwMiA9IEJyZXNlbmhhbVBvaW50cyh7IHgxOiB0cmlhbmdsZS54MiwgeTE6IHRyaWFuZ2xlLnkyLCB4MjogdHJpYW5nbGUueDMsIHkyOiB0cmlhbmdsZS55MyB9LCBzdGVwUmF0ZSk7XHJcbiAgICB2YXIgcDMgPSBCcmVzZW5oYW1Qb2ludHMoeyB4MTogdHJpYW5nbGUueDMsIHkxOiB0cmlhbmdsZS55MywgeDI6IHRyaWFuZ2xlLngxLCB5MjogdHJpYW5nbGUueTEgfSwgc3RlcFJhdGUpO1xyXG5cclxuICAgIC8vICBSZW1vdmUgb3ZlcmxhcHNcclxuICAgIHAxLnBvcCgpO1xyXG4gICAgcDIucG9wKCk7XHJcbiAgICBwMy5wb3AoKTtcclxuXHJcbiAgICBwMSA9IHAxLmNvbmNhdChwMiwgcDMpO1xyXG5cclxuICAgIHZhciBzdGVwID0gcDEubGVuZ3RoIC8gaXRlbXMubGVuZ3RoO1xyXG4gICAgdmFyIHAgPSAwO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICB2YXIgcG9pbnQgPSBwMVtNYXRoLmZsb29yKHApXTtcclxuXHJcbiAgICAgICAgaXRlbS54ID0gcG9pbnQueDtcclxuICAgICAgICBpdGVtLnkgPSBwb2ludC55O1xyXG5cclxuICAgICAgICBwICs9IHN0ZXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQbGFjZU9uVHJpYW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBsYXkgYW4gYW5pbWF0aW9uIHdpdGggdGhlIGdpdmVuIGtleSwgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0YXJ0RnJhbWUgb24gYWxsIEdhbWUgT2JqZWN0cyBpbiBpdGVtcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlBsYXlBbmltYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uIHRvIHBsYXkuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW3N0YXJ0RnJhbWVdIC0gVGhlIHN0YXJ0aW5nIGZyYW1lIG9mIHRoZSBhbmltYXRpb24gd2l0aCB0aGUgZ2l2ZW4ga2V5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFBsYXlBbmltYXRpb24gPSBmdW5jdGlvbiAoaXRlbXMsIGtleSwgc3RhcnRGcmFtZSlcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpdGVtc1tpXS5hbmltcy5wbGF5KGtleSwgc3RhcnRGcmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQbGF5QW5pbWF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSBhIHB1YmxpYyBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIGBrZXlgLFxyXG4gKiBhbmQgdGhlbiBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byBpdC5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwYCBwcm9wZXJ0eSBpcyBhcHBsaWVkIGluY3JlbWVudGFsbHksIG11bHRpcGxpZWQgYnkgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICpcclxuICogVG8gdXNlIHRoaXMgd2l0aCBhIEdyb3VwOiBgUHJvcGVydHlWYWx1ZUluYyhncm91cC5nZXRDaGlsZHJlbigpLCBrZXksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlByb3BlcnR5VmFsdWVJbmNcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IHRvIGJlIHVwZGF0ZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFByb3BlcnR5VmFsdWVJbmMgPSBmdW5jdGlvbiAoaXRlbXMsIGtleSwgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIGlmIChzdGVwID09PSB1bmRlZmluZWQpIHsgc3RlcCA9IDA7IH1cclxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7IGluZGV4ID0gMDsgfVxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7IGRpcmVjdGlvbiA9IDE7IH1cclxuXHJcbiAgICB2YXIgaTtcclxuICAgIHZhciB0ID0gMDtcclxuICAgIHZhciBlbmQgPSBpdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICAvLyAgU3RhcnQgdG8gRW5kXHJcbiAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBlbmQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldW2tleV0gKz0gdmFsdWUgKyAodCAqIHN0ZXApO1xyXG4gICAgICAgICAgICB0Kys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIC8vICBFbmQgdG8gU3RhcnRcclxuICAgICAgICBmb3IgKGkgPSBpbmRleDsgaSA+PSAwOyBpLS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXVtrZXldICs9IHZhbHVlICsgKHQgKiBzdGVwKTtcclxuICAgICAgICAgICAgdCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFByb3BlcnR5VmFsdWVJbmM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIGEgcHVibGljIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gYGtleWAsXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBQcm9wZXJ0eVZhbHVlU2V0KGdyb3VwLmdldENoaWxkcmVuKCksIGtleSwgdmFsdWUsIHN0ZXApYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUHJvcGVydHlWYWx1ZVNldFxyXG4gKiBAc2luY2UgMy4zLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkgdG8gYmUgdXBkYXRlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSBmdW5jdGlvbiAoaXRlbXMsIGtleSwgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIGlmIChzdGVwID09PSB1bmRlZmluZWQpIHsgc3RlcCA9IDA7IH1cclxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7IGluZGV4ID0gMDsgfVxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7IGRpcmVjdGlvbiA9IDE7IH1cclxuXHJcbiAgICB2YXIgaTtcclxuICAgIHZhciB0ID0gMDtcclxuICAgIHZhciBlbmQgPSBpdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICAvLyAgU3RhcnQgdG8gRW5kXHJcbiAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBlbmQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldW2tleV0gPSB2YWx1ZSArICh0ICogc3RlcCk7XHJcbiAgICAgICAgICAgIHQrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEVuZCB0byBTdGFydFxyXG4gICAgICAgIGZvciAoaSA9IGluZGV4OyBpID49IDA7IGktLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldW2tleV0gPSB2YWx1ZSArICh0ICogc3RlcCk7XHJcbiAgICAgICAgICAgIHQrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQcm9wZXJ0eVZhbHVlU2V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSYW5kb20gPSByZXF1aXJlKCcuLi9nZW9tL2NpcmNsZS9SYW5kb20nKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgYW5kIHBvc2l0aW9ucyB0aGVtIGF0IHJhbmRvbSBsb2NhdGlvbnMgd2l0aGluIHRoZSBDaXJjbGUuXHJcbiAqIFxyXG4gKiBJZiB5b3Ugd2lzaCB0byBwYXNzIGEgYFBoYXNlci5HYW1lT2JqZWN0cy5DaXJjbGVgIFNoYXBlIHRvIHRoaXMgZnVuY3Rpb24sIHlvdSBzaG91bGQgcGFzcyBpdHMgYGdlb21gIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUmFuZG9tQ2lyY2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIHdpdGhpbi5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBSYW5kb21DaXJjbGUgPSBmdW5jdGlvbiAoaXRlbXMsIGNpcmNsZSlcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBSYW5kb20oY2lyY2xlLCBpdGVtc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYW5kb21DaXJjbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJhbmRvbSA9IHJlcXVpcmUoJy4uL2dlb20vZWxsaXBzZS9SYW5kb20nKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgYW5kIHBvc2l0aW9ucyB0aGVtIGF0IHJhbmRvbSBsb2NhdGlvbnMgd2l0aGluIHRoZSBFbGxpcHNlLlxyXG4gKiBcclxuICogSWYgeW91IHdpc2ggdG8gcGFzcyBhIGBQaGFzZXIuR2FtZU9iamVjdHMuRWxsaXBzZWAgU2hhcGUgdG8gdGhpcyBmdW5jdGlvbiwgeW91IHNob3VsZCBwYXNzIGl0cyBgZ2VvbWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5SYW5kb21FbGxpcHNlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIHdpdGhpbi5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBSYW5kb21FbGxpcHNlID0gZnVuY3Rpb24gKGl0ZW1zLCBlbGxpcHNlKVxyXG57XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIFJhbmRvbShlbGxpcHNlLCBpdGVtc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYW5kb21FbGxpcHNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSYW5kb20gPSByZXF1aXJlKCcuLi9nZW9tL2xpbmUvUmFuZG9tJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIGFuZCBwb3NpdGlvbnMgdGhlbSBhdCByYW5kb20gbG9jYXRpb25zIG9uIHRoZSBMaW5lLlxyXG4gKiBcclxuICogSWYgeW91IHdpc2ggdG8gcGFzcyBhIGBQaGFzZXIuR2FtZU9iamVjdHMuTGluZWAgU2hhcGUgdG8gdGhpcyBmdW5jdGlvbiwgeW91IHNob3VsZCBwYXNzIGl0cyBgZ2VvbWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5SYW5kb21MaW5lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgTGluZSB0byBwb3NpdGlvbiB0aGUgR2FtZSBPYmplY3RzIHJhbmRvbWx5IG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFJhbmRvbUxpbmUgPSBmdW5jdGlvbiAoaXRlbXMsIGxpbmUpXHJcbntcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgUmFuZG9tKGxpbmUsIGl0ZW1zW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmRvbUxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJhbmRvbSA9IHJlcXVpcmUoJy4uL2dlb20vcmVjdGFuZ2xlL1JhbmRvbScpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhbmQgcG9zaXRpb25zIHRoZW0gYXQgcmFuZG9tIGxvY2F0aW9ucyB3aXRoaW4gdGhlIFJlY3RhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlJhbmRvbVJlY3RhbmdsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdHMgd2l0aGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFJhbmRvbVJlY3RhbmdsZSA9IGZ1bmN0aW9uIChpdGVtcywgcmVjdClcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBSYW5kb20ocmVjdCwgaXRlbXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tUmVjdGFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSYW5kb20gPSByZXF1aXJlKCcuLi9nZW9tL3RyaWFuZ2xlL1JhbmRvbScpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhbmQgcG9zaXRpb25zIHRoZW0gYXQgcmFuZG9tIGxvY2F0aW9ucyB3aXRoaW4gdGhlIFRyaWFuZ2xlLlxyXG4gKiBcclxuICogSWYgeW91IHdpc2ggdG8gcGFzcyBhIGBQaGFzZXIuR2FtZU9iamVjdHMuVHJpYW5nbGVgIFNoYXBlIHRvIHRoaXMgZnVuY3Rpb24sIHlvdSBzaG91bGQgcGFzcyBpdHMgYGdlb21gIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUmFuZG9tVHJpYW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdHMgd2l0aGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFJhbmRvbVRyaWFuZ2xlID0gZnVuY3Rpb24gKGl0ZW1zLCB0cmlhbmdsZSlcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBSYW5kb20odHJpYW5nbGUsIGl0ZW1zW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmRvbVRyaWFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlSW5jID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgYSBwdWJsaWMgYHJvdGF0aW9uYCBwcm9wZXJ0eSxcclxuICogYW5kIHRoZW4gYWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gZWFjaCBvZiB0aGVpciBgcm90YXRpb25gIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcGAgcHJvcGVydHkgaXMgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFJvdGF0ZShncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5Sb3RhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIGJlIGFkZGVkIHRvIHRoZSBgcm90YXRpb25gIHByb3BlcnR5IChpbiByYWRpYW5zKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBSb3RhdGUgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ3JvdGF0aW9uJywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvdGF0ZUFyb3VuZERpc3RhbmNlID0gcmVxdWlyZSgnLi4vbWF0aC9Sb3RhdGVBcm91bmREaXN0YW5jZScpO1xyXG52YXIgRGlzdGFuY2VCZXR3ZWVuID0gcmVxdWlyZSgnLi4vbWF0aC9kaXN0YW5jZS9EaXN0YW5jZUJldHdlZW4nKTtcclxuXHJcbi8qKlxyXG4gKiBSb3RhdGVzIGVhY2ggaXRlbSBhcm91bmQgdGhlIGdpdmVuIHBvaW50IGJ5IHRoZSBnaXZlbiBhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlJvdGF0ZUFyb3VuZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHNlZSBQaGFzZXIuTWF0aC5Sb3RhdGVBcm91bmREaXN0YW5jZVxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gcG9pbnQgLSBBbnkgb2JqZWN0IHdpdGggcHVibGljIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byByb3RhdGUgYnksIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgUm90YXRlQXJvdW5kID0gZnVuY3Rpb24gKGl0ZW1zLCBwb2ludCwgYW5nbGUpXHJcbntcclxuICAgIHZhciB4ID0gcG9pbnQueDtcclxuICAgIHZhciB5ID0gcG9pbnQueTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgIFJvdGF0ZUFyb3VuZERpc3RhbmNlKGl0ZW0sIHgsIHksIGFuZ2xlLCBNYXRoLm1heCgxLCBEaXN0YW5jZUJldHdlZW4oaXRlbS54LCBpdGVtLnksIHgsIHkpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1hdGhSb3RhdGVBcm91bmREaXN0YW5jZSA9IHJlcXVpcmUoJy4uL21hdGgvUm90YXRlQXJvdW5kRGlzdGFuY2UnKTtcclxuXHJcbi8qKlxyXG4gKiBSb3RhdGVzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyBhcm91bmQgYSBwb2ludCBieSB0aGUgZ2l2ZW4gYW5nbGUgYW5kIGRpc3RhbmNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuUm90YXRlQXJvdW5kRGlzdGFuY2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBwb2ludCAtIEFueSBvYmplY3Qgd2l0aCBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSBieSwgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBvaW50IG9mIHJvdGF0aW9uIGluIHBpeGVscy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBSb3RhdGVBcm91bmREaXN0YW5jZSA9IGZ1bmN0aW9uIChpdGVtcywgcG9pbnQsIGFuZ2xlLCBkaXN0YW5jZSlcclxue1xyXG4gICAgdmFyIHggPSBwb2ludC54O1xyXG4gICAgdmFyIHkgPSBwb2ludC55O1xyXG5cclxuICAgIC8vICBUaGVyZSdzIG5vdGhpbmcgdG8gZG9cclxuICAgIGlmIChkaXN0YW5jZSA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBNYXRoUm90YXRlQXJvdW5kRGlzdGFuY2UoaXRlbXNbaV0sIHgsIHksIGFuZ2xlLCBkaXN0YW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmREaXN0YW5jZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZUluYyA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZUluYycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIGEgcHVibGljIGBzY2FsZVhgIHByb3BlcnR5LFxyXG4gKiBhbmQgdGhlbiBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byBlYWNoIG9mIHRoZWlyIGBzY2FsZVhgIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcGAgcHJvcGVydHkgaXMgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNjYWxlWChncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TY2FsZVhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIGJlIGFkZGVkIHRvIHRoZSBgc2NhbGVYYCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTY2FsZVggPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ3NjYWxlWCcsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2NhbGVYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlSW5jID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgcHVibGljIGBzY2FsZVhgIGFuZCBgc2NhbGVZYCBwcm9wZXJ0aWVzLFxyXG4gKiBhbmQgdGhlbiBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byBlYWNoIG9mIHRoZW0uXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcFhgIGFuZCBgc3RlcFlgIHByb3BlcnRpZXMgYXJlIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTY2FsZVhZKGdyb3VwLmdldENoaWxkcmVuKCksIHNjYWxlWCwgc2NhbGVZLCBzdGVwWCwgc3RlcFkpYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2NhbGVYWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVggLSBUaGUgYW1vdW50IHRvIGJlIGFkZGVkIHRvIHRoZSBgc2NhbGVYYCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZVldIC0gVGhlIGFtb3VudCB0byBiZSBhZGRlZCB0byB0aGUgYHNjYWxlWWAgcHJvcGVydHkuIElmIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpdCB1c2VzIHRoZSBgc2NhbGVYYCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGBzY2FsZVhgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgc2NhbGVZYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTY2FsZVhZID0gZnVuY3Rpb24gKGl0ZW1zLCBzY2FsZVgsIHNjYWxlWSwgc3RlcFgsIHN0ZXBZLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICBpZiAoc2NhbGVZID09PSB1bmRlZmluZWQgfHwgc2NhbGVZID09PSBudWxsKSB7IHNjYWxlWSA9IHNjYWxlWDsgfVxyXG5cclxuICAgIFByb3BlcnR5VmFsdWVJbmMoaXRlbXMsICdzY2FsZVgnLCBzY2FsZVgsIHN0ZXBYLCBpbmRleCwgZGlyZWN0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZUluYyhpdGVtcywgJ3NjYWxlWScsIHNjYWxlWSwgc3RlcFksIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2FsZVhZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlSW5jID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgYSBwdWJsaWMgYHNjYWxlWWAgcHJvcGVydHksXHJcbiAqIGFuZCB0aGVuIGFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIGVhY2ggb2YgdGhlaXIgYHNjYWxlWWAgcHJvcGVydGllcy5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwYCBwcm9wZXJ0eSBpcyBhcHBsaWVkIGluY3JlbWVudGFsbHksIG11bHRpcGxpZWQgYnkgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICpcclxuICogVG8gdXNlIHRoaXMgd2l0aCBhIEdyb3VwOiBgU2NhbGVZKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNjYWxlWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBzY2FsZVlgIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNjYWxlWSA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlSW5jKGl0ZW1zLCAnc2NhbGVZJywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2FsZVk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnR5IGBhbHBoYWBcclxuICogYW5kIHRoZW4gc2V0cyBpdCB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcGAgcHJvcGVydHkgaXMgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNldEFscGhhKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNldEFscGhhXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldEFscGhhID0gZnVuY3Rpb24gKGl0ZW1zLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbilcclxue1xyXG4gICAgcmV0dXJuIFByb3BlcnR5VmFsdWVTZXQoaXRlbXMsICdhbHBoYScsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0QWxwaGE7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnR5IGBibGVuZE1vZGVgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRCbGVuZE1vZGUoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgdmFsdWUpYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0QmxlbmRNb2RlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTZXRCbGVuZE1vZGUgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZVNldChpdGVtcywgJ2JsZW5kTW9kZScsIHZhbHVlLCAwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0QmxlbmRNb2RlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0eSBgZGVwdGhgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXREZXB0aChncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TZXREZXB0aFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTZXREZXB0aCA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnZGVwdGgnLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldERlcHRoO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQYXNzZXMgYWxsIHByb3ZpZGVkIEdhbWUgT2JqZWN0cyB0byB0aGUgSW5wdXQgTWFuYWdlciB0byBlbmFibGUgdGhlbSBmb3IgaW5wdXQgd2l0aCBpZGVudGljYWwgYXJlYXMgYW5kIGNhbGxiYWNrcy5cclxuICogXHJcbiAqIEBzZWUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfVxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0SGl0QXJlYVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICogQHBhcmFtIHsqfSBoaXRBcmVhIC0gRWl0aGVyIGFuIGlucHV0IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhIGdlb21ldHJpYyBzaGFwZSB0aGF0IGRlZmluZXMgdGhlIGhpdCBhcmVhIGZvciB0aGUgR2FtZSBPYmplY3QuIElmIG5vdCBzcGVjaWZpZWQgYSBSZWN0YW5nbGUgd2lsbCBiZSB1c2VkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5IaXRBcmVhQ2FsbGJhY2t9IGhpdEFyZWFDYWxsYmFjayAtIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBHYW1lIE9iamVjdCBpcyBpbnRlcmFjdGVkIHdpdGguIElmIHlvdSBwcm92aWRlIGEgc2hhcGUgeW91IG11c3QgYWxzbyBwcm92aWRlIGEgY2FsbGJhY2suXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0SGl0QXJlYSA9IGZ1bmN0aW9uIChpdGVtcywgaGl0QXJlYSwgaGl0QXJlYUNhbGxiYWNrKVxyXG57XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGl0ZW1zW2ldLnNldEludGVyYWN0aXZlKGhpdEFyZWEsIGhpdEFyZWFDYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRIaXRBcmVhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0aWVzIGBvcmlnaW5YYCBhbmQgYG9yaWdpbllgXHJcbiAqIGFuZCB0aGVuIHNldHMgdGhlbSB0byB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBYYCBhbmQgYHN0ZXBZYCBwcm9wZXJ0aWVzIGFyZSBhcHBsaWVkIGluY3JlbWVudGFsbHksIG11bHRpcGxpZWQgYnkgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICpcclxuICogVG8gdXNlIHRoaXMgd2l0aCBhIEdyb3VwOiBgU2V0T3JpZ2luKGdyb3VwLmdldENoaWxkcmVuKCksIG9yaWdpblgsIG9yaWdpblksIHN0ZXBYLCBzdGVwWSlgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TZXRPcmlnaW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gb3JpZ2luWCAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBgb3JpZ2luWGAgcHJvcGVydHkgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZ2luWV0gLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgYG9yaWdpbllgIHByb3BlcnR5IHRvLiBJZiBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXQgdXNlcyB0aGUgYG9yaWdpblhgIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBYPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYG9yaWdpblhgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgb3JpZ2luWWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0T3JpZ2luID0gZnVuY3Rpb24gKGl0ZW1zLCBvcmlnaW5YLCBvcmlnaW5ZLCBzdGVwWCwgc3RlcFksIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIGlmIChvcmlnaW5ZID09PSB1bmRlZmluZWQgfHwgb3JpZ2luWSA9PT0gbnVsbCkgeyBvcmlnaW5ZID0gb3JpZ2luWDsgfVxyXG5cclxuICAgIFByb3BlcnR5VmFsdWVTZXQoaXRlbXMsICdvcmlnaW5YJywgb3JpZ2luWCwgc3RlcFgsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG5cclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnb3JpZ2luWScsIG9yaWdpblksIHN0ZXBZLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0T3JpZ2luO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0eSBgcm90YXRpb25gXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRSb3RhdGlvbihncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TZXRSb3RhdGlvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAncm90YXRpb24nLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFJvdGF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0aWVzIGBzY2FsZVhgIGFuZCBgc2NhbGVZYFxyXG4gKiBhbmQgdGhlbiBzZXRzIHRoZW0gdG8gdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwWGAgYW5kIGBzdGVwWWAgcHJvcGVydGllcyBhcmUgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNldFNjYWxlKGdyb3VwLmdldENoaWxkcmVuKCksIHNjYWxlWCwgc2NhbGVZLCBzdGVwWCwgc3RlcFkpYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0U2NhbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2NhbGVYIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIGBzY2FsZVhgIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlWV0gLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgYHNjYWxlWWAgcHJvcGVydHkgdG8uIElmIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpdCB1c2VzIHRoZSBgc2NhbGVYYCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGBzY2FsZVhgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgc2NhbGVZYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXJlY3Rpb249MV0gLSBUaGUgZGlyZWN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkuIDEgaXMgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLCAtMSBmcm9tIGVuZCB0byBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIG9iamVjdHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTZXRTY2FsZSA9IGZ1bmN0aW9uIChpdGVtcywgc2NhbGVYLCBzY2FsZVksIHN0ZXBYLCBzdGVwWSwgaW5kZXgsIGRpcmVjdGlvbilcclxue1xyXG4gICAgaWYgKHNjYWxlWSA9PT0gdW5kZWZpbmVkIHx8IHNjYWxlWSA9PT0gbnVsbCkgeyBzY2FsZVkgPSBzY2FsZVg7IH1cclxuXHJcbiAgICBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnc2NhbGVYJywgc2NhbGVYLCBzdGVwWCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIFByb3BlcnR5VmFsdWVTZXQoaXRlbXMsICdzY2FsZVknLCBzY2FsZVksIHN0ZXBZLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0U2NhbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnR5IGBzY2FsZVhgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRTY2FsZVgoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgdmFsdWUsIHN0ZXApYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0U2NhbGVYXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFNjYWxlWCA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnc2NhbGVYJywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRTY2FsZVg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnR5IGBzY2FsZVlgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRTY2FsZVkoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgdmFsdWUsIHN0ZXApYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0U2NhbGVZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFNjYWxlWSA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnc2NhbGVZJywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRTY2FsZVk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnRpZXMgYHNjcm9sbEZhY3RvclhgIGFuZCBgc2Nyb2xsRmFjdG9yWWBcclxuICogYW5kIHRoZW4gc2V0cyB0aGVtIHRvIHRoZSBnaXZlbiB2YWx1ZXMuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcFhgIGFuZCBgc3RlcFlgIHByb3BlcnRpZXMgYXJlIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRTY3JvbGxGYWN0b3IoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgc2Nyb2xsRmFjdG9yWCwgc2Nyb2xsRmFjdG9yWSwgc3RlcFgsIHN0ZXBZKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNldFNjcm9sbEZhY3RvclxyXG4gKiBAc2luY2UgMy4yMS4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsRmFjdG9yWCAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBgc2Nyb2xsRmFjdG9yWGAgcHJvcGVydHkgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2Nyb2xsRmFjdG9yWV0gLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgYHNjcm9sbEZhY3RvcllgIHByb3BlcnR5IHRvLiBJZiBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXQgdXNlcyB0aGUgYHNjcm9sbEZhY3RvclhgIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBYPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHNjcm9sbEZhY3RvclhgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgc2Nyb2xsRmFjdG9yWWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0U2Nyb2xsRmFjdG9yID0gZnVuY3Rpb24gKGl0ZW1zLCBzY3JvbGxGYWN0b3JYLCBzY3JvbGxGYWN0b3JZLCBzdGVwWCwgc3RlcFksIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIGlmIChzY3JvbGxGYWN0b3JZID09PSB1bmRlZmluZWQgfHwgc2Nyb2xsRmFjdG9yWSA9PT0gbnVsbCkgeyBzY3JvbGxGYWN0b3JZID0gc2Nyb2xsRmFjdG9yWDsgfVxyXG5cclxuICAgIFByb3BlcnR5VmFsdWVTZXQoaXRlbXMsICdzY3JvbGxGYWN0b3JYJywgc2Nyb2xsRmFjdG9yWCwgc3RlcFgsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG5cclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnc2Nyb2xsRmFjdG9yWScsIHNjcm9sbEZhY3RvclksIHN0ZXBZLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0U2Nyb2xsRmFjdG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0eSBgc2Nyb2xsRmFjdG9yWGBcclxuICogYW5kIHRoZW4gc2V0cyBpdCB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIFRoZSBvcHRpb25hbCBgc3RlcGAgcHJvcGVydHkgaXMgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNldFNjcm9sbEZhY3RvclgoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgdmFsdWUsIHN0ZXApYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0U2Nyb2xsRmFjdG9yWFxyXG4gKiBAc2luY2UgMy4yMS4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0U2Nyb2xsRmFjdG9yWCA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAnc2Nyb2xsRmFjdG9yWCcsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0U2Nyb2xsRmFjdG9yWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZVNldCA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZVNldCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIHRoZSBwdWJsaWMgcHJvcGVydHkgYHNjcm9sbEZhY3RvcllgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRTY3JvbGxGYWN0b3JZKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNldFNjcm9sbEZhY3RvcllcclxuICogQHNpbmNlIDMuMjEuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFNjcm9sbEZhY3RvclkgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZVNldChpdGVtcywgJ3Njcm9sbEZhY3RvclknLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFNjcm9sbEZhY3Rvclk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIHRoZSBwdWJsaWMgbWV0aG9kIHNldFRpbnQoKSBhbmQgdGhlbiB1cGRhdGVzIGl0IHRvIHRoZSBnaXZlbiB2YWx1ZShzKS4gWW91IGNhbiBzcGVjaWZ5IHRpbnQgY29sb3IgcGVyIGNvcm5lciBvciBwcm92aWRlIG9ubHkgb25lIGNvbG9yIHZhbHVlIGZvciBgdG9wTGVmdGAgcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIHdob2xlIGl0ZW0gd2lsbCBiZSB0aW50ZWQgd2l0aCB0aGF0IGNvbG9yLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0VGludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHRvcExlZnQgLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBpdGVtLiBJZiBvdGhlciBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBubyB2YWx1ZSwgdGhpcyB0aW50IHdpbGwgYmUgYXBwbGllZCB0byB3aG9sZSBpdGVtLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3RvcFJpZ2h0XSAtIFRoZSB0aW50IHRvIGJlIGFwcGxpZWQgdG8gdG9wLXJpZ2h0IGNvcm5lciBvZiBpdGVtLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2JvdHRvbUxlZnRdIC0gVGhlIHRpbnQgdG8gYmUgYXBwbGllZCB0byB0aGUgYm90dG9tLWxlZnQgY29ybmVyIG9mIGl0ZW0uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYm90dG9tUmlnaHRdIC0gVGhlIHRpbnQgdG8gYmUgYXBwbGllZCB0byB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiBpdGVtLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFRpbnQgPSBmdW5jdGlvbiAoaXRlbXMsIHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodClcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpdGVtc1tpXS5zZXRUaW50KHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRUaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQcm9wZXJ0eVZhbHVlU2V0ID0gcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlU2V0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHB1YmxpYyBwcm9wZXJ0eSBgdmlzaWJsZWBcclxuICogYW5kIHRoZW4gc2V0cyBpdCB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNldFZpc2libGUoZ3JvdXAuZ2V0Q2hpbGRyZW4oKSwgdmFsdWUpYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU2V0VmlzaWJsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0VmlzaWJsZSA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAndmlzaWJsZScsIHZhbHVlLCAwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0VmlzaWJsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZVNldCA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZVNldCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIHRoZSBwdWJsaWMgcHJvcGVydHkgYHhgXHJcbiAqIGFuZCB0aGVuIHNldHMgaXQgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGUgb3B0aW9uYWwgYHN0ZXBgIHByb3BlcnR5IGlzIGFwcGxpZWQgaW5jcmVtZW50YWxseSwgbXVsdGlwbGllZCBieSBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBUbyB1c2UgdGhpcyB3aXRoIGEgR3JvdXA6IGBTZXRYKGdyb3VwLmdldENoaWxkcmVuKCksIHZhbHVlLCBzdGVwKWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNldFhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFRoZSBhcnJheSBvZiBvYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU2V0WCA9IGZ1bmN0aW9uIChpdGVtcywgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAneCcsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0WDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvcGVydHlWYWx1ZVNldCA9IHJlcXVpcmUoJy4vUHJvcGVydHlWYWx1ZVNldCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgYW55IG9iamVjdHMgdGhhdCBoYXZlIHRoZSBwdWJsaWMgcHJvcGVydGllcyBgeGAgYW5kIGB5YFxyXG4gKiBhbmQgdGhlbiBzZXRzIHRoZW0gdG8gdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwWGAgYW5kIGBzdGVwWWAgcHJvcGVydGllcyBhcmUgYXBwbGllZCBpbmNyZW1lbnRhbGx5LCBtdWx0aXBsaWVkIGJ5IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRvIHVzZSB0aGlzIHdpdGggYSBHcm91cDogYFNldFhZKGdyb3VwLmdldENoaWxkcmVuKCksIHgsIHksIHN0ZXBYLCBzdGVwWSlgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TZXRYWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBhY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIGB4YCBwcm9wZXJ0eSB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIGB5YCBwcm9wZXJ0eSB0by4gSWYgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGl0IHVzZXMgdGhlIGB4YCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB4YCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBZPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHlgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFhZID0gZnVuY3Rpb24gKGl0ZW1zLCB4LCB5LCBzdGVwWCwgc3RlcFksIGluZGV4LCBkaXJlY3Rpb24pXHJcbntcclxuICAgIGlmICh5ID09PSB1bmRlZmluZWQgfHwgeSA9PT0gbnVsbCkgeyB5ID0geDsgfVxyXG5cclxuICAgIFByb3BlcnR5VmFsdWVTZXQoaXRlbXMsICd4JywgeCwgc3RlcFgsIGluZGV4LCBkaXJlY3Rpb24pO1xyXG5cclxuICAgIHJldHVybiBQcm9wZXJ0eVZhbHVlU2V0KGl0ZW1zLCAneScsIHksIHN0ZXBZLCBpbmRleCwgZGlyZWN0aW9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0WFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFByb3BlcnR5VmFsdWVTZXQgPSByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIG9yIGFueSBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgcHVibGljIHByb3BlcnR5IGB5YFxyXG4gKiBhbmQgdGhlbiBzZXRzIGl0IHRvIHRoZSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogVGhlIG9wdGlvbmFsIGBzdGVwYCBwcm9wZXJ0eSBpcyBhcHBsaWVkIGluY3JlbWVudGFsbHksIG11bHRpcGxpZWQgYnkgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICpcclxuICogVG8gdXNlIHRoaXMgd2l0aCBhIEdyb3VwOiBgU2V0WShncm91cC5nZXRDaGlsZHJlbigpLCB2YWx1ZSwgc3RlcClgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TZXRZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBieSB0aGlzIGFjdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2luZGV4PTBdIC0gQW4gb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdpdGhpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoaXMgQWN0aW9uLlxyXG4gKi9cclxudmFyIFNldFkgPSBmdW5jdGlvbiAoaXRlbXMsIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICByZXR1cm4gUHJvcGVydHlWYWx1ZVNldChpdGVtcywgJ3knLCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBJdGVyYXRlIHRocm91Z2ggdGhlIGl0ZW1zIGFycmF5IGNoYW5naW5nIHRoZSBwb3NpdGlvbiBvZiBlYWNoIGVsZW1lbnQgdG8gYmUgdGhhdCBvZiB0aGUgZWxlbWVudCB0aGF0IGNhbWUgYmVmb3JlXHJcbiAqIGl0IGluIHRoZSBhcnJheSAob3IgYWZ0ZXIgaXQgaWYgZGlyZWN0aW9uID0gMSlcclxuICogXHJcbiAqIFRoZSBmaXJzdCBpdGVtcyBwb3NpdGlvbiBpcyBzZXQgdG8geC95LlxyXG4gKiBcclxuICogVGhlIGZpbmFsIHgveSBjb29yZHMgYXJlIHJldHVybmVkXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TaGlmdFBvc2l0aW9uXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtc11cclxuICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBpdGVtcyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgYXJlIHVwZGF0ZWQgYnkgdGhpcyBBY3Rpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBwbGFjZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgYXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBwbGFjZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgYXQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0wXSAtIFRoZSBpdGVyYXRpb24gZGlyZWN0aW9uLiAwID0gZmlyc3QgdG8gbGFzdCBhbmQgMSA9IGxhc3QgdG8gZmlyc3QuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvcHRpb25hbCBvYmplYyB0byBzdG9yZSB0aGUgZmluYWwgb2JqZWN0cyBwb3NpdGlvbiBpbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIG91dHB1dCB2ZWN0b3IuXHJcbiAqL1xyXG52YXIgU2hpZnRQb3NpdGlvbiA9IGZ1bmN0aW9uIChpdGVtcywgeCwgeSwgZGlyZWN0aW9uLCBvdXRwdXQpXHJcbntcclxuICAgIGlmIChkaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkgeyBkaXJlY3Rpb24gPSAwOyB9XHJcbiAgICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHsgb3V0cHV0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgIHZhciBweDtcclxuICAgIHZhciBweTtcclxuXHJcbiAgICBpZiAoaXRlbXMubGVuZ3RoID4gMSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgY3g7XHJcbiAgICAgICAgdmFyIGN5O1xyXG4gICAgICAgIHZhciBjdXI7XHJcblxyXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQm90dG9tIHRvIFRvcFxyXG5cclxuICAgICAgICAgICAgdmFyIGxlbiA9IGl0ZW1zLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgICAgICBweCA9IGl0ZW1zW2xlbl0ueDtcclxuICAgICAgICAgICAgcHkgPSBpdGVtc1tsZW5dLnk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEN1cnJlbnQgaXRlbVxyXG4gICAgICAgICAgICAgICAgY3VyID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEdldCBjdXJyZW50IGl0ZW0geC95LCB0byBiZSBwYXNzZWQgdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgY3ggPSBjdXIueDtcclxuICAgICAgICAgICAgICAgIGN5ID0gY3VyLnk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFNldCBjdXJyZW50IGl0ZW0gdG8gdGhlIHByZXZpb3VzIGl0ZW1zIHgveVxyXG4gICAgICAgICAgICAgICAgY3VyLnggPSBweDtcclxuICAgICAgICAgICAgICAgIGN1ci55ID0gcHk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFNldCBjdXJyZW50IGFzIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICBweCA9IGN4O1xyXG4gICAgICAgICAgICAgICAgcHkgPSBjeTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIFVwZGF0ZSB0aGUgaGVhZCBpdGVtIHRvIHRoZSBuZXcgeC95IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGl0ZW1zW2xlbl0ueCA9IHg7XHJcbiAgICAgICAgICAgIGl0ZW1zW2xlbl0ueSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBUb3AgdG8gQm90dG9tXHJcblxyXG4gICAgICAgICAgICBweCA9IGl0ZW1zWzBdLng7XHJcbiAgICAgICAgICAgIHB5ID0gaXRlbXNbMF0ueTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEN1cnJlbnQgaXRlbVxyXG4gICAgICAgICAgICAgICAgY3VyID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEdldCBjdXJyZW50IGl0ZW0geC95LCB0byBiZSBwYXNzZWQgdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdFxyXG4gICAgICAgICAgICAgICAgY3ggPSBjdXIueDtcclxuICAgICAgICAgICAgICAgIGN5ID0gY3VyLnk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFNldCBjdXJyZW50IGl0ZW0gdG8gdGhlIHByZXZpb3VzIGl0ZW1zIHgveVxyXG4gICAgICAgICAgICAgICAgY3VyLnggPSBweDtcclxuICAgICAgICAgICAgICAgIGN1ci55ID0gcHk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFNldCBjdXJyZW50IGFzIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICBweCA9IGN4O1xyXG4gICAgICAgICAgICAgICAgcHkgPSBjeTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIFVwZGF0ZSB0aGUgaGVhZCBpdGVtIHRvIHRoZSBuZXcgeC95IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgICAgIGl0ZW1zWzBdLnggPSB4O1xyXG4gICAgICAgICAgICBpdGVtc1swXS55ID0geTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcHggPSBpdGVtc1swXS54O1xyXG4gICAgICAgIHB5ID0gaXRlbXNbMF0ueTtcclxuXHJcbiAgICAgICAgaXRlbXNbMF0ueCA9IHg7XHJcbiAgICAgICAgaXRlbXNbMF0ueSA9IHk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFJldHVybiB0aGUgZmluYWwgc2V0IG9mIGNvb3JkaW5hdGVzIGFzIHRoZXkncmUgZWZmZWN0aXZlbHkgbG9zdCBmcm9tIHRoZSBzaGlmdCBhbmQgbWF5IGJlIG5lZWRlZFxyXG5cclxuICAgIG91dHB1dC54ID0gcHg7XHJcbiAgICBvdXRwdXQueSA9IHB5O1xyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNoaWZ0UG9zaXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFycmF5U2h1ZmZsZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L1NodWZmbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBTaHVmZmxlcyB0aGUgYXJyYXkgaW4gcGxhY2UuIFRoZSBzaHVmZmxlZCBhcnJheSBpcyBib3RoIG1vZGlmaWVkIGFuZCByZXR1cm5lZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNodWZmbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBzZWUgUGhhc2VyLlV0aWxzLkFycmF5LlNodWZmbGVcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTaHVmZmxlID0gZnVuY3Rpb24gKGl0ZW1zKVxyXG57XHJcbiAgICByZXR1cm4gQXJyYXlTaHVmZmxlKGl0ZW1zKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2h1ZmZsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTWF0aFNtb290aFN0ZXAgPSByZXF1aXJlKCcuLi9tYXRoL1Ntb290aFN0ZXAnKTtcclxuXHJcbi8qKlxyXG4gKiBTbW9vdGhzdGVwIGlzIGEgc2lnbW9pZC1saWtlIGludGVycG9sYXRpb24gYW5kIGNsYW1waW5nIGZ1bmN0aW9uLlxyXG4gKiBcclxuICogVGhlIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhyZWUgcGFyYW1ldGVycywgdGhlIGlucHV0IHgsIHRoZSBcImxlZnQgZWRnZVwiIGFuZCB0aGUgXCJyaWdodCBlZGdlXCIsIHdpdGggdGhlIGxlZnQgZWRnZSBiZWluZyBhc3N1bWVkIHNtYWxsZXIgdGhhbiB0aGUgcmlnaHQgZWRnZS4gVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgcmVhbCBudW1iZXIgeCBhcyBhbiBhcmd1bWVudCBhbmQgcmV0dXJucyAwIGlmIHggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZWZ0IGVkZ2UsIDEgaWYgeCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0IGVkZ2UsIGFuZCBzbW9vdGhseSBpbnRlcnBvbGF0ZXMsIHVzaW5nIGEgSGVybWl0ZSBwb2x5bm9taWFsLCBiZXR3ZWVuIDAgYW5kIDEgb3RoZXJ3aXNlLiBUaGUgc2xvcGUgb2YgdGhlIHNtb290aHN0ZXAgZnVuY3Rpb24gaXMgemVybyBhdCBib3RoIGVkZ2VzLiBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGNyZWF0aW5nIGEgc2VxdWVuY2Ugb2YgdHJhbnNpdGlvbnMgdXNpbmcgc21vb3Roc3RlcCB0byBpbnRlcnBvbGF0ZSBlYWNoIHNlZ21lbnQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgbW9yZSBzb3BoaXN0aWNhdGVkIG9yIGV4cGVuc2l2ZSBpbnRlcnBvbGF0aW9uIHRlY2huaXF1ZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5TbW9vdGhTdGVwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIEdhbWUgT2JqZWN0IHRvIGludGVycG9sYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gaW50ZXJwb2xhdGlvbiB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIGludGVycG9sYXRpb24gdmFsdWUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luYz1mYWxzZV0gLSBTaG91bGQgdGhlIHZhbHVlcyBiZSBpbmNyZW1lbnRlZD8gYHRydWVgIG9yIHNldCAoYGZhbHNlYClcclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBTbW9vdGhTdGVwID0gZnVuY3Rpb24gKGl0ZW1zLCBwcm9wZXJ0eSwgbWluLCBtYXgsIGluYylcclxue1xyXG4gICAgaWYgKGluYyA9PT0gdW5kZWZpbmVkKSB7IGluYyA9IGZhbHNlOyB9XHJcblxyXG4gICAgdmFyIHN0ZXAgPSBNYXRoLmFicyhtYXggLSBtaW4pIC8gaXRlbXMubGVuZ3RoO1xyXG4gICAgdmFyIGk7XHJcblxyXG4gICAgaWYgKGluYylcclxuICAgIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXVtwcm9wZXJ0eV0gKz0gTWF0aFNtb290aFN0ZXAoaSAqIHN0ZXAsIG1pbiwgbWF4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXNbaV1bcHJvcGVydHldID0gTWF0aFNtb290aFN0ZXAoaSAqIHN0ZXAsIG1pbiwgbWF4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbW9vdGhTdGVwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBNYXRoU21vb3RoZXJTdGVwID0gcmVxdWlyZSgnLi4vbWF0aC9TbW9vdGhlclN0ZXAnKTtcclxuXHJcbi8qKlxyXG4gKiBTbW9vdGhlcnN0ZXAgaXMgYSBzaWdtb2lkLWxpa2UgaW50ZXJwb2xhdGlvbiBhbmQgY2xhbXBpbmcgZnVuY3Rpb24uXHJcbiAqIFxyXG4gKiBUaGUgZnVuY3Rpb24gZGVwZW5kcyBvbiB0aHJlZSBwYXJhbWV0ZXJzLCB0aGUgaW5wdXQgeCwgdGhlIFwibGVmdCBlZGdlXCIgYW5kIHRoZSBcInJpZ2h0IGVkZ2VcIiwgd2l0aCB0aGUgbGVmdCBlZGdlIGJlaW5nIGFzc3VtZWQgc21hbGxlciB0aGFuIHRoZSByaWdodCBlZGdlLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYSByZWFsIG51bWJlciB4IGFzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIDAgaWYgeCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlZnQgZWRnZSwgMSBpZiB4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQgZWRnZSwgYW5kIHNtb290aGx5IGludGVycG9sYXRlcywgdXNpbmcgYSBIZXJtaXRlIHBvbHlub21pYWwsIGJldHdlZW4gMCBhbmQgMSBvdGhlcndpc2UuIFRoZSBzbG9wZSBvZiB0aGUgc21vb3Roc3RlcCBmdW5jdGlvbiBpcyB6ZXJvIGF0IGJvdGggZWRnZXMuIFRoaXMgaXMgY29udmVuaWVudCBmb3IgY3JlYXRpbmcgYSBzZXF1ZW5jZSBvZiB0cmFuc2l0aW9ucyB1c2luZyBzbW9vdGhzdGVwIHRvIGludGVycG9sYXRlIGVhY2ggc2VnbWVudCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB1c2luZyBtb3JlIHNvcGhpc3RpY2F0ZWQgb3IgZXhwZW5zaXZlIGludGVycG9sYXRpb24gdGVjaG5pcXVlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5BY3Rpb25zLlNtb290aGVyU3RlcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIHRoZSBHYW1lIE9iamVjdCB0byBpbnRlcnBvbGF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIGludGVycG9sYXRpb24gdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSBpbnRlcnBvbGF0aW9uIHZhbHVlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmM9ZmFsc2VdIC0gU2hvdWxkIHRoZSB2YWx1ZXMgYmUgaW5jcmVtZW50ZWQ/IGB0cnVlYCBvciBzZXQgKGBmYWxzZWApXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gVGhlIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU21vb3RoZXJTdGVwID0gZnVuY3Rpb24gKGl0ZW1zLCBwcm9wZXJ0eSwgbWluLCBtYXgsIGluYylcclxue1xyXG4gICAgaWYgKGluYyA9PT0gdW5kZWZpbmVkKSB7IGluYyA9IGZhbHNlOyB9XHJcblxyXG4gICAgdmFyIHN0ZXAgPSBNYXRoLmFicyhtYXggLSBtaW4pIC8gaXRlbXMubGVuZ3RoO1xyXG4gICAgdmFyIGk7XHJcblxyXG4gICAgaWYgKGluYylcclxuICAgIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXVtwcm9wZXJ0eV0gKz0gTWF0aFNtb290aGVyU3RlcChpICogc3RlcCwgbWluLCBtYXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXVtwcm9wZXJ0eV0gPSBNYXRoU21vb3RoZXJTdGVwKGkgKiBzdGVwLCBtaW4sIG1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU21vb3RoZXJTdGVwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgYW5kIHRoZW4gbW9kaWZpZXMgdGhlaXIgYHByb3BlcnR5YCBzbyB0aGUgdmFsdWUgZXF1YWxzLCBvciBpcyBpbmNyZW1lbnRlZCwgYnkgdGhlXHJcbiAqIGNhbGN1bGF0ZWQgc3ByZWFkIHZhbHVlLlxyXG4gKiBcclxuICogVGhlIHNwcmVhZCB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGBtaW5gIGFuZCBgbWF4YCB2YWx1ZXMgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFycmF5LlxyXG4gKiBcclxuICogRm9yIGV4YW1wbGUsIHRvIGNhdXNlIGFuIGFycmF5IG9mIFNwcml0ZXMgdG8gY2hhbmdlIGluIGFscGhhIGZyb20gMCB0byAxIHlvdSBjb3VsZCBjYWxsOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBQaGFzZXIuQWN0aW9ucy5TcHJlYWQoaXRlbXNBcnJheSwgJ2FscGhhJywgMCwgMSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuU3ByZWFkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIEdhbWUgT2JqZWN0IHRvIHNwcmVhZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luYz1mYWxzZV0gLSBTaG91bGQgdGhlIHZhbHVlcyBiZSBpbmNyZW1lbnRlZD8gYHRydWVgIG9yIHNldCAoYGZhbHNlYClcclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhpcyBBY3Rpb24uXHJcbiAqL1xyXG52YXIgU3ByZWFkID0gZnVuY3Rpb24gKGl0ZW1zLCBwcm9wZXJ0eSwgbWluLCBtYXgsIGluYylcclxue1xyXG4gICAgaWYgKGluYyA9PT0gdW5kZWZpbmVkKSB7IGluYyA9IGZhbHNlOyB9XHJcblxyXG4gICAgdmFyIHN0ZXAgPSBNYXRoLmFicyhtYXggLSBtaW4pIC8gaXRlbXMubGVuZ3RoO1xyXG4gICAgdmFyIGk7XHJcblxyXG4gICAgaWYgKGluYylcclxuICAgIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXVtwcm9wZXJ0eV0gKz0gaSAqIHN0ZXAgKyBtaW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldW3Byb3BlcnR5XSA9IGkgKiBzdGVwICsgbWluO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwcmVhZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIGFuZCB0b2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIGVhY2ggb25lLlxyXG4gKiBUaG9zZSBwcmV2aW91c2x5IGB2aXNpYmxlID0gZmFsc2VgIHdpbGwgYmVjb21lIGB2aXNpYmxlID0gdHJ1ZWAsIGFuZCB2aWNlIHZlcnNhLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkFjdGlvbnMuVG9nZ2xlVmlzaWJsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbaXRlbXMsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGl0ZW1zIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBhcmUgdXBkYXRlZCBieSB0aGlzIEFjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBUb2dnbGVWaXNpYmxlID0gZnVuY3Rpb24gKGl0ZW1zKVxyXG57XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGl0ZW1zW2ldLnZpc2libGUgPSAhaXRlbXNbaV0udmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRvZ2dsZVZpc2libGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIHNhbW1lIDxzYW1tZS5ucG1AZ21haWwuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFdyYXAgPSByZXF1aXJlKCcuLi9tYXRoL1dyYXAnKTtcclxuXHJcbi8qKlxyXG4gKiBXcmFwIGVhY2ggaXRlbSdzIGNvb3JkaW5hdGVzIHdpdGhpbiBhIHJlY3RhbmdsZSdzIGFyZWEuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQWN0aW9ucy5XcmFwSW5SZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBzZWUgUGhhc2VyLk1hdGguV3JhcFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gRyAtIFtpdGVtcywkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gaXRlbXMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSB1cGRhdGVkIGJ5IHRoaXMgQWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSByZWN0YW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFkZGluZz0wXSAtIEFuIGFtb3VudCBhZGRlZCB0byBlYWNoIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi5cclxuICpcclxuICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRoYXQgd2FzIHBhc3NlZCB0byB0aGlzIEFjdGlvbi5cclxuICovXHJcbnZhciBXcmFwSW5SZWN0YW5nbGUgPSBmdW5jdGlvbiAoaXRlbXMsIHJlY3QsIHBhZGRpbmcpXHJcbntcclxuICAgIGlmIChwYWRkaW5nID09PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgcGFkZGluZyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICBpdGVtLnggPSBXcmFwKGl0ZW0ueCwgcmVjdC5sZWZ0IC0gcGFkZGluZywgcmVjdC5yaWdodCArIHBhZGRpbmcpO1xyXG4gICAgICAgIGl0ZW0ueSA9IFdyYXAoaXRlbS55LCByZWN0LnRvcCAtIHBhZGRpbmcsIHJlY3QuYm90dG9tICsgcGFkZGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXcmFwSW5SZWN0YW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkFjdGlvbnNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBbGlnblRvOiByZXF1aXJlKCcuL0FsaWduVG8nKSxcclxuICAgIEFuZ2xlOiByZXF1aXJlKCcuL0FuZ2xlJyksXHJcbiAgICBDYWxsOiByZXF1aXJlKCcuL0NhbGwnKSxcclxuICAgIEdldEZpcnN0OiByZXF1aXJlKCcuL0dldEZpcnN0JyksXHJcbiAgICBHZXRMYXN0OiByZXF1aXJlKCcuL0dldExhc3QnKSxcclxuICAgIEdyaWRBbGlnbjogcmVxdWlyZSgnLi9HcmlkQWxpZ24nKSxcclxuICAgIEluY0FscGhhOiByZXF1aXJlKCcuL0luY0FscGhhJyksXHJcbiAgICBJbmNYOiByZXF1aXJlKCcuL0luY1gnKSxcclxuICAgIEluY1hZOiByZXF1aXJlKCcuL0luY1hZJyksXHJcbiAgICBJbmNZOiByZXF1aXJlKCcuL0luY1knKSxcclxuICAgIFBsYWNlT25DaXJjbGU6IHJlcXVpcmUoJy4vUGxhY2VPbkNpcmNsZScpLFxyXG4gICAgUGxhY2VPbkVsbGlwc2U6IHJlcXVpcmUoJy4vUGxhY2VPbkVsbGlwc2UnKSxcclxuICAgIFBsYWNlT25MaW5lOiByZXF1aXJlKCcuL1BsYWNlT25MaW5lJyksXHJcbiAgICBQbGFjZU9uUmVjdGFuZ2xlOiByZXF1aXJlKCcuL1BsYWNlT25SZWN0YW5nbGUnKSxcclxuICAgIFBsYWNlT25UcmlhbmdsZTogcmVxdWlyZSgnLi9QbGFjZU9uVHJpYW5nbGUnKSxcclxuICAgIFBsYXlBbmltYXRpb246IHJlcXVpcmUoJy4vUGxheUFuaW1hdGlvbicpLFxyXG4gICAgUHJvcGVydHlWYWx1ZUluYzogcmVxdWlyZSgnLi9Qcm9wZXJ0eVZhbHVlSW5jJyksXHJcbiAgICBQcm9wZXJ0eVZhbHVlU2V0OiByZXF1aXJlKCcuL1Byb3BlcnR5VmFsdWVTZXQnKSxcclxuICAgIFJhbmRvbUNpcmNsZTogcmVxdWlyZSgnLi9SYW5kb21DaXJjbGUnKSxcclxuICAgIFJhbmRvbUVsbGlwc2U6IHJlcXVpcmUoJy4vUmFuZG9tRWxsaXBzZScpLFxyXG4gICAgUmFuZG9tTGluZTogcmVxdWlyZSgnLi9SYW5kb21MaW5lJyksXHJcbiAgICBSYW5kb21SZWN0YW5nbGU6IHJlcXVpcmUoJy4vUmFuZG9tUmVjdGFuZ2xlJyksXHJcbiAgICBSYW5kb21UcmlhbmdsZTogcmVxdWlyZSgnLi9SYW5kb21UcmlhbmdsZScpLFxyXG4gICAgUm90YXRlOiByZXF1aXJlKCcuL1JvdGF0ZScpLFxyXG4gICAgUm90YXRlQXJvdW5kOiByZXF1aXJlKCcuL1JvdGF0ZUFyb3VuZCcpLFxyXG4gICAgUm90YXRlQXJvdW5kRGlzdGFuY2U6IHJlcXVpcmUoJy4vUm90YXRlQXJvdW5kRGlzdGFuY2UnKSxcclxuICAgIFNjYWxlWDogcmVxdWlyZSgnLi9TY2FsZVgnKSxcclxuICAgIFNjYWxlWFk6IHJlcXVpcmUoJy4vU2NhbGVYWScpLFxyXG4gICAgU2NhbGVZOiByZXF1aXJlKCcuL1NjYWxlWScpLFxyXG4gICAgU2V0QWxwaGE6IHJlcXVpcmUoJy4vU2V0QWxwaGEnKSxcclxuICAgIFNldEJsZW5kTW9kZTogcmVxdWlyZSgnLi9TZXRCbGVuZE1vZGUnKSxcclxuICAgIFNldERlcHRoOiByZXF1aXJlKCcuL1NldERlcHRoJyksXHJcbiAgICBTZXRIaXRBcmVhOiByZXF1aXJlKCcuL1NldEhpdEFyZWEnKSxcclxuICAgIFNldE9yaWdpbjogcmVxdWlyZSgnLi9TZXRPcmlnaW4nKSxcclxuICAgIFNldFJvdGF0aW9uOiByZXF1aXJlKCcuL1NldFJvdGF0aW9uJyksXHJcbiAgICBTZXRTY2FsZTogcmVxdWlyZSgnLi9TZXRTY2FsZScpLFxyXG4gICAgU2V0U2NhbGVYOiByZXF1aXJlKCcuL1NldFNjYWxlWCcpLFxyXG4gICAgU2V0U2NhbGVZOiByZXF1aXJlKCcuL1NldFNjYWxlWScpLFxyXG4gICAgU2V0U2Nyb2xsRmFjdG9yOiByZXF1aXJlKCcuL1NldFNjcm9sbEZhY3RvcicpLFxyXG4gICAgU2V0U2Nyb2xsRmFjdG9yWDogcmVxdWlyZSgnLi9TZXRTY3JvbGxGYWN0b3JYJyksXHJcbiAgICBTZXRTY3JvbGxGYWN0b3JZOiByZXF1aXJlKCcuL1NldFNjcm9sbEZhY3RvclknKSxcclxuICAgIFNldFRpbnQ6IHJlcXVpcmUoJy4vU2V0VGludCcpLFxyXG4gICAgU2V0VmlzaWJsZTogcmVxdWlyZSgnLi9TZXRWaXNpYmxlJyksXHJcbiAgICBTZXRYOiByZXF1aXJlKCcuL1NldFgnKSxcclxuICAgIFNldFhZOiByZXF1aXJlKCcuL1NldFhZJyksXHJcbiAgICBTZXRZOiByZXF1aXJlKCcuL1NldFknKSxcclxuICAgIFNoaWZ0UG9zaXRpb246IHJlcXVpcmUoJy4vU2hpZnRQb3NpdGlvbicpLFxyXG4gICAgU2h1ZmZsZTogcmVxdWlyZSgnLi9TaHVmZmxlJyksXHJcbiAgICBTbW9vdGhlclN0ZXA6IHJlcXVpcmUoJy4vU21vb3RoZXJTdGVwJyksXHJcbiAgICBTbW9vdGhTdGVwOiByZXF1aXJlKCcuL1Ntb290aFN0ZXAnKSxcclxuICAgIFNwcmVhZDogcmVxdWlyZSgnLi9TcHJlYWQnKSxcclxuICAgIFRvZ2dsZVZpc2libGU6IHJlcXVpcmUoJy4vVG9nZ2xlVmlzaWJsZScpLFxyXG4gICAgV3JhcEluUmVjdGFuZ2xlOiByZXF1aXJlKCcuL1dyYXBJblJlY3RhbmdsZScpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFtcCA9IHJlcXVpcmUoJy4uL21hdGgvQ2xhbXAnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4vZXZlbnRzJyk7XHJcbnZhciBGaW5kQ2xvc2VzdEluU29ydGVkID0gcmVxdWlyZSgnLi4vdXRpbHMvYXJyYXkvRmluZENsb3Nlc3RJblNvcnRlZCcpO1xyXG52YXIgRnJhbWUgPSByZXF1aXJlKCcuL0FuaW1hdGlvbkZyYW1lJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBGcmFtZSBiYXNlZCBBbmltYXRpb24uXHJcbiAqXHJcbiAqIFRoaXMgY29uc2lzdHMgb2YgYSBrZXksIHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGxpa2UgdGhlIGZyYW1lIHJhdGUpIGFuZCBhIGJ1bmNoIG9mIEZyYW1lIG9iamVjdHMuXHJcbiAqXHJcbiAqIFRoZSBBbmltYXRpb24gTWFuYWdlciBjcmVhdGVzIHRoZXNlLiBHYW1lIE9iamVjdHMgZG9uJ3Qgb3duIGFuIGluc3RhbmNlIG9mIHRoZXNlIGRpcmVjdGx5LlxyXG4gKiBHYW1lIE9iamVjdHMgaGF2ZSB0aGUgQW5pbWF0aW9uIENvbXBvbmVudCwgd2hpY2ggYXJlIGxpa2UgcGxheWhlYWRzIHRvIGdsb2JhbCBBbmltYXRpb25zICh0aGVzZSBvYmplY3RzKVxyXG4gKiBTbyBtdWx0aXBsZSBHYW1lIE9iamVjdHMgY2FuIGhhdmUgcGxheWhlYWRzIGFsbCBwb2ludGluZyB0byB0aGlzIG9uZSBBbmltYXRpb24gaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBjbGFzcyBBbmltYXRpb25cclxuICogQG1lbWJlcm9mIFBoYXNlci5BbmltYXRpb25zXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyfSBtYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlclxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBpZGVudGlmeWluZyBzdHJpbmcgZm9yIHRoaXMgYW5pbWF0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbn0gY29uZmlnIC0gVGhlIEFuaW1hdGlvbiBjb25maWd1cmF0aW9uLlxyXG4gKi9cclxudmFyIEFuaW1hdGlvbiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQW5pbWF0aW9uIChtYW5hZ2VyLCBrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNtYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHVuaXF1ZSBpZGVudGlmeWluZyBzdHJpbmcgZm9yIHRoaXMgYW5pbWF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI2tleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnJhbWUgYmFzZWQgYW5pbWF0aW9uIChhcyBvcHBvc2VkIHRvIGEgYm9uZSBiYXNlZCBhbmltYXRpb24pXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jdHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgZnJhbWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSAnZnJhbWUnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFeHRyYWN0IGFsbCB0aGUgZnJhbWUgZGF0YSBpbnRvIHRoZSBmcmFtZXMgYXJyYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jZnJhbWVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mcmFtZXMgPSB0aGlzLmdldEZyYW1lcyhcclxuICAgICAgICAgICAgbWFuYWdlci50ZXh0dXJlTWFuYWdlcixcclxuICAgICAgICAgICAgR2V0VmFsdWUoY29uZmlnLCAnZnJhbWVzJywgW10pLFxyXG4gICAgICAgICAgICBHZXRWYWx1ZShjb25maWcsICdkZWZhdWx0VGV4dHVyZUtleScsIG51bGwpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZyYW1lIHJhdGUgb2YgcGxheWJhY2sgaW4gZnJhbWVzIHBlciBzZWNvbmQgKGRlZmF1bHQgMjQgaWYgZHVyYXRpb24gaXMgbnVsbClcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNmcmFtZVJhdGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAyNFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVSYXRlID0gR2V0VmFsdWUoY29uZmlnLCAnZnJhbWVSYXRlJywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBsb25nIHRoZSBhbmltYXRpb24gc2hvdWxkIHBsYXkgZm9yLCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgICAgICogSWYgdGhlIGBmcmFtZVJhdGVgIHByb3BlcnR5IGhhcyBiZWVuIHNldCB0aGVuIGl0IG92ZXJyaWRlcyB0aGlzIHZhbHVlLFxyXG4gICAgICAgICAqIG90aGVyd2lzZSB0aGUgYGZyYW1lUmF0ZWAgaXMgZGVyaXZlZCBmcm9tIGBkdXJhdGlvbmAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jZHVyYXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gR2V0VmFsdWUoY29uZmlnLCAnZHVyYXRpb24nLCBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gPT09IG51bGwgJiYgdGhpcy5mcmFtZVJhdGUgPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTm8gZHVyYXRpb24gb3IgZnJhbWVSYXRlIGdpdmVuLCB1c2UgZGVmYXVsdCBmcmFtZVJhdGUgb2YgMjRmcHNcclxuICAgICAgICAgICAgdGhpcy5mcmFtZVJhdGUgPSAyNDtcclxuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9ICh0aGlzLmZyYW1lUmF0ZSAvIHRoaXMuZnJhbWVzLmxlbmd0aCkgKiAxMDAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmR1cmF0aW9uICYmIHRoaXMuZnJhbWVSYXRlID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIER1cmF0aW9uIGdpdmVuIGJ1dCBubyBmcmFtZVJhdGUsIHNvIHNldCB0aGUgZnJhbWVSYXRlIGJhc2VkIG9uIGR1cmF0aW9uXHJcbiAgICAgICAgICAgIC8vICBJLmUuIDEyIGZyYW1lcyBpbiB0aGUgYW5pbWF0aW9uLCBkdXJhdGlvbiA9IDQwMDAgbXNcclxuICAgICAgICAgICAgLy8gIFNvIGZyYW1lUmF0ZSBpcyAxMiAvICg0MDAwIC8gMTAwMCkgPSAzIGZwc1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lUmF0ZSA9IHRoaXMuZnJhbWVzLmxlbmd0aCAvICh0aGlzLmR1cmF0aW9uIC8gMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBmcmFtZVJhdGUgZ2l2ZW4sIGRlcml2ZSBkdXJhdGlvbiBmcm9tIGl0IChldmVuIGlmIGR1cmF0aW9uIGFsc28gc3BlY2lmaWVkKVxyXG4gICAgICAgICAgICAvLyAgSS5lLiAxNSBmcmFtZXMgaW4gdGhlIGFuaW1hdGlvbiwgZnJhbWVSYXRlID0gMzAgZnBzXHJcbiAgICAgICAgICAgIC8vICBTbyBkdXJhdGlvbiBpcyAxNSAvIDMwID0gMC41ICogMTAwMCAoaGFsZiBhIHNlY29uZCwgb3IgNTAwbXMpXHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSAodGhpcy5mcmFtZXMubGVuZ3RoIC8gdGhpcy5mcmFtZVJhdGUpICogMTAwMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBtYW55IG1zIHBlciBmcmFtZSwgbm90IGluY2x1ZGluZyBmcmFtZSBzcGVjaWZpYyBtb2RpZmllcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jbXNQZXJGcmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubXNQZXJGcmFtZSA9IDEwMDAgLyB0aGlzLmZyYW1lUmF0ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2tpcCBmcmFtZXMgaWYgdGhlIHRpbWUgbGFncywgb3IgYWx3YXlzIGFkdmFuY2VkIGFueXdheT9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNza2lwTWlzc2VkRnJhbWVzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNraXBNaXNzZWRGcmFtZXMgPSBHZXRWYWx1ZShjb25maWcsICdza2lwTWlzc2VkRnJhbWVzJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWxheSBpbiBtcyBiZWZvcmUgdGhlIHBsYXliYWNrIHdpbGwgYmVnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jZGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWxheSA9IEdldFZhbHVlKGNvbmZpZywgJ2RlbGF5JywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGFuaW1hdGlvbi4gU2V0IHRvIC0xIHRvIHJlcGVhdCBmb3JldmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI3JlcGVhdFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlcGVhdCA9IEdldFZhbHVlKGNvbmZpZywgJ3JlcGVhdCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVsYXkgaW4gbXMgYmVmb3JlIHRoZSBhIHJlcGVhdCBwbGF5IHN0YXJ0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNyZXBlYXREZWxheVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlcGVhdERlbGF5ID0gR2V0VmFsdWUoY29uZmlnLCAncmVwZWF0RGVsYXknLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2hvdWxkIHRoZSBhbmltYXRpb24geW95byAocmV2ZXJzZSBiYWNrIGRvd24gdG8gdGhlIHN0YXJ0KSBiZWZvcmUgcmVwZWF0aW5nP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI3lveW9cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueW95byA9IEdldFZhbHVlKGNvbmZpZywgJ3lveW8nLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNob3VsZCB0aGUgR2FtZU9iamVjdCdzIGB2aXNpYmxlYCBwcm9wZXJ0eSBiZSBzZXQgdG8gYHRydWVgIHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMgdG8gcGxheT9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNzaG93T25TdGFydFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaG93T25TdGFydCA9IEdldFZhbHVlKGNvbmZpZywgJ3Nob3dPblN0YXJ0JywgZmFsc2UpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTaG91bGQgdGhlIEdhbWVPYmplY3QncyBgdmlzaWJsZWAgcHJvcGVydHkgYmUgc2V0IHRvIGBmYWxzZWAgd2hlbiB0aGUgYW5pbWF0aW9uIGZpbmlzaGVzP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI2hpZGVPbkNvbXBsZXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhpZGVPbkNvbXBsZXRlID0gR2V0VmFsdWUoY29uZmlnLCAnaGlkZU9uQ29tcGxldGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdsb2JhbCBwYXVzZS4gQWxsIEdhbWUgT2JqZWN0cyB1c2luZyB0aGlzIEFuaW1hdGlvbiBpbnN0YW5jZSBhcmUgaW1wYWN0ZWQgYnkgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNwYXVzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5vbihFdmVudHMuUEFVU0VfQUxMLCB0aGlzLnBhdXNlLCB0aGlzKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIub24oRXZlbnRzLlJFU1VNRV9BTEwsIHRoaXMucmVzdW1lLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgZnJhbWVzIHRvIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNhZGRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW10pfSBjb25maWcgLSBFaXRoZXIgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCB1c2UgYWxsIGZyYW1lcyBmcm9tIGEgdGV4dHVyZSB3aXRoIHRoZSBtYXRjaGluZyBrZXksIG9yIGFuIGFycmF5IG9mIEFuaW1hdGlvbiBGcmFtZSBjb25maWd1cmF0aW9uIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBBbmltYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGRGcmFtZTogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRGcmFtZUF0KHRoaXMuZnJhbWVzLmxlbmd0aCwgY29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgZnJhbWUvcyBpbnRvIHRoZSBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jYWRkRnJhbWVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIGZyYW1lIGF0IHdpdGhpbiB0aGUgYW5pbWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW10pfSBjb25maWcgLSBFaXRoZXIgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCB1c2UgYWxsIGZyYW1lcyBmcm9tIGEgdGV4dHVyZSB3aXRoIHRoZSBtYXRjaGluZyBrZXksIG9yIGFuIGFycmF5IG9mIEFuaW1hdGlvbiBGcmFtZSBjb25maWd1cmF0aW9uIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBBbmltYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGRGcmFtZUF0OiBmdW5jdGlvbiAoaW5kZXgsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgbmV3RnJhbWVzID0gdGhpcy5nZXRGcmFtZXModGhpcy5tYW5hZ2VyLnRleHR1cmVNYW5hZ2VyLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAobmV3RnJhbWVzLmxlbmd0aCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzID0gbmV3RnJhbWVzLmNvbmNhdCh0aGlzLmZyYW1lcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuZnJhbWVzLmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXMgPSB0aGlzLmZyYW1lcy5jb25jYXQobmV3RnJhbWVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcmUgPSB0aGlzLmZyYW1lcy5zbGljZSgwLCBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9zdCA9IHRoaXMuZnJhbWVzLnNsaWNlKGluZGV4KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lcyA9IHByZS5jb25jYXQobmV3RnJhbWVzLCBwb3N0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGcmFtZVNlcXVlbmNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZnJhbWUgaW5kZXggaXMgdmFsaWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jY2hlY2tGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCB0byBiZSBjaGVja2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5kZXggaXMgdmFsaWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBjaGVja0ZyYW1lOiBmdW5jdGlvbiAoaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5mcmFtZXMubGVuZ3RoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoaXMgQW5pbWF0aW9uIGNvbXBsZXRlcyBwbGF5YmFjay5cclxuICAgICAqIE9wdGlvbmFsbHksIGhpZGVzIHRoZSBwYXJlbnQgR2FtZSBPYmplY3QsIHRoZW4gc3RvcHMgcGxheWJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jY29tcGxldGVBbmltYXRpb25cclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufSBjb21wb25lbnQgLSBUaGUgQW5pbWF0aW9uIENvbXBvbmVudCBiZWxvbmdpbmcgdG8gdGhlIEdhbWUgT2JqZWN0IGludm9raW5nIHRoaXMgY2FsbC5cclxuICAgICAqL1xyXG4gICAgY29tcGxldGVBbmltYXRpb246IGZ1bmN0aW9uIChjb21wb25lbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZU9uQ29tcGxldGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb25lbnQucGFyZW50LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudC5zdG9wKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGludGVybmFsbHkgd2hlbiB0aGlzIEFuaW1hdGlvbiBmaXJzdCBzdGFydHMgdG8gcGxheS5cclxuICAgICAqIFNldHMgdGhlIGFjY3VtdWxhdG9yIGFuZCBuZXh0VGljayBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI2dldEZpcnN0VGlja1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb259IGNvbXBvbmVudCAtIFRoZSBBbmltYXRpb24gQ29tcG9uZW50IGJlbG9uZ2luZyB0byB0aGUgR2FtZSBPYmplY3QgaW52b2tpbmcgdGhpcyBjYWxsLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZURlbGF5PXRydWVdIC0gSWYgYHRydWVgIHRoZSBBbmltYXRpb24gQ29tcG9uZW50cyBkZWxheSB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBgbmV4dFRpY2tgIHRvdGFsLlxyXG4gICAgICovXHJcbiAgICBnZXRGaXJzdFRpY2s6IGZ1bmN0aW9uIChjb21wb25lbnQsIGluY2x1ZGVEZWxheSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaW5jbHVkZURlbGF5ID09PSB1bmRlZmluZWQpIHsgaW5jbHVkZURlbGF5ID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICAvLyAgV2hlbiBpcyB0aGUgZmlyc3QgdXBkYXRlIGR1ZT9cclxuICAgICAgICBjb21wb25lbnQuYWNjdW11bGF0b3IgPSAwO1xyXG4gICAgICAgIGNvbXBvbmVudC5uZXh0VGljayA9IGNvbXBvbmVudC5tc1BlckZyYW1lICsgY29tcG9uZW50LmN1cnJlbnRGcmFtZS5kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVEZWxheSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5uZXh0VGljayArPSBjb21wb25lbnQuX2RlbGF5O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBBbmltYXRpb25GcmFtZSBhdCB0aGUgcHJvdmlkZWQgaW5kZXhcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNnZXRGcmFtZUF0XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IGluIHRoZSBBbmltYXRpb25GcmFtZSBhcnJheVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBUaGUgZnJhbWUgYXQgdGhlIGluZGV4IHByb3ZpZGVkIGZyb20gdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZVxyXG4gICAgICovXHJcbiAgICBnZXRGcmFtZUF0OiBmdW5jdGlvbiAoaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzW2luZGV4XTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIEFuaW1hdGlvbkZyYW1lIGluc3RhbmNlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gZnJhbWUgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNnZXRGcmFtZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfSB0ZXh0dXJlTWFuYWdlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW10pfSBmcmFtZXMgLSBFaXRoZXIgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCB1c2UgYWxsIGZyYW1lcyBmcm9tIGEgdGV4dHVyZSB3aXRoIHRoZSBtYXRjaGluZyBrZXksIG9yIGFuIGFycmF5IG9mIEFuaW1hdGlvbiBGcmFtZSBjb25maWd1cmF0aW9uIG9iamVjdHMuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlZmF1bHRUZXh0dXJlS2V5XSAtIFRoZSBrZXkgdG8gdXNlIGlmIG5vIGtleSBpcyBzZXQgaW4gdGhlIGZyYW1lIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW119IEFuIGFycmF5IG9mIG5ld2x5IGNyZWF0ZWQgQW5pbWF0aW9uRnJhbWUgaW5zdGFuY2VzLlxyXG4gICAgICovXHJcbiAgICBnZXRGcmFtZXM6IGZ1bmN0aW9uICh0ZXh0dXJlTWFuYWdlciwgZnJhbWVzLCBkZWZhdWx0VGV4dHVyZUtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gW107XHJcbiAgICAgICAgdmFyIHByZXY7XHJcbiAgICAgICAgdmFyIGFuaW1hdGlvbkZyYW1lO1xyXG4gICAgICAgIHZhciBpbmRleCA9IDE7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIHRleHR1cmVLZXk7XHJcblxyXG4gICAgICAgIC8vICBpZiBmcmFtZXMgaXMgYSBzdHJpbmcsIHdlJ2xsIGdldCBhbGwgdGhlIGZyYW1lcyBmcm9tIHRoZSB0ZXh0dXJlIG1hbmFnZXIgYXMgaWYgaXQncyBhIHNwcml0ZSBzaGVldFxyXG4gICAgICAgIGlmICh0eXBlb2YgZnJhbWVzID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHR1cmVLZXkgPSBmcmFtZXM7XHJcblxyXG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRleHR1cmVNYW5hZ2VyLmdldCh0ZXh0dXJlS2V5KTtcclxuICAgICAgICAgICAgdmFyIGZyYW1lS2V5cyA9IHRleHR1cmUuZ2V0RnJhbWVOYW1lcygpO1xyXG5cclxuICAgICAgICAgICAgZnJhbWVzID0gW107XHJcblxyXG4gICAgICAgICAgICBmcmFtZUtleXMuZm9yRWFjaChmdW5jdGlvbiAoaWR4LCB2YWx1ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnJhbWVzLnB1c2goeyBrZXk6IHRleHR1cmVLZXksIGZyYW1lOiB2YWx1ZSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZnJhbWVzKSB8fCBmcmFtZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG91dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGZyYW1lc1tpXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBHZXRWYWx1ZShpdGVtLCAna2V5JywgZGVmYXVsdFRleHR1cmVLZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFrZXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgQ291bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZ1xyXG4gICAgICAgICAgICB2YXIgZnJhbWUgPSBHZXRWYWx1ZShpdGVtLCAnZnJhbWUnLCAwKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBUaGUgYWN0dWFsIHRleHR1cmUgZnJhbWVcclxuICAgICAgICAgICAgdmFyIHRleHR1cmVGcmFtZSA9IHRleHR1cmVNYW5hZ2VyLmdldEZyYW1lKGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWUgPSBuZXcgRnJhbWUoa2V5LCBmcmFtZSwgaW5kZXgsIHRleHR1cmVGcmFtZSk7XHJcblxyXG4gICAgICAgICAgICBhbmltYXRpb25GcmFtZS5kdXJhdGlvbiA9IEdldFZhbHVlKGl0ZW0sICdkdXJhdGlvbicsIDApO1xyXG5cclxuICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWUuaXNGaXJzdCA9ICghcHJldik7XHJcblxyXG4gICAgICAgICAgICAvLyAgVGhlIHByZXZpb3VzbHkgY3JlYXRlZCBhbmltYXRpb25GcmFtZVxyXG4gICAgICAgICAgICBpZiAocHJldilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcHJldi5uZXh0RnJhbWUgPSBhbmltYXRpb25GcmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICBhbmltYXRpb25GcmFtZS5wcmV2RnJhbWUgPSBwcmV2O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvdXQucHVzaChhbmltYXRpb25GcmFtZSk7XHJcblxyXG4gICAgICAgICAgICBwcmV2ID0gYW5pbWF0aW9uRnJhbWU7XHJcblxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG91dC5sZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW5pbWF0aW9uRnJhbWUuaXNMYXN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vICBMaW5rIHRoZW0gZW5kLXRvLWVuZCwgc28gdGhleSBsb29wXHJcbiAgICAgICAgICAgIGFuaW1hdGlvbkZyYW1lLm5leHRGcmFtZSA9IG91dFswXTtcclxuXHJcbiAgICAgICAgICAgIG91dFswXS5wcmV2RnJhbWUgPSBhbmltYXRpb25GcmFtZTtcclxuXHJcbiAgICAgICAgICAgIC8vICBHZW5lcmF0ZSB0aGUgcHJvZ3Jlc3MgZGF0YVxyXG5cclxuICAgICAgICAgICAgdmFyIHNsaWNlID0gMSAvIChvdXQubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRbaV0ucHJvZ3Jlc3MgPSBpICogc2xpY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGludGVybmFsbHkuIFNldHMgdGhlIGFjY3VtdWxhdG9yIGFuZCBuZXh0VGljayB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgQW5pbWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI2dldE5leHRUaWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbn0gY29tcG9uZW50IC0gVGhlIEFuaW1hdGlvbiBDb21wb25lbnQgYmVsb25naW5nIHRvIHRoZSBHYW1lIE9iamVjdCBpbnZva2luZyB0aGlzIGNhbGwuXHJcbiAgICAgKi9cclxuICAgIGdldE5leHRUaWNrOiBmdW5jdGlvbiAoY29tcG9uZW50KVxyXG4gICAge1xyXG4gICAgICAgIC8vIGFjY3VtdWxhdG9yICs9IGRlbHRhICogX3RpbWVTY2FsZVxyXG4gICAgICAgIC8vIGFmdGVyIGEgbGFyZ2UgZGVsdGEgc3VyZ2UgKHBlcmYgaXNzdWUgZm9yIGV4YW1wbGUpIHdlIG5lZWQgdG8gYWRqdXN0IGZvciBpdCBoZXJlXHJcblxyXG4gICAgICAgIC8vICBXaGVuIGlzIHRoZSBuZXh0IHVwZGF0ZSBkdWU/XHJcbiAgICAgICAgY29tcG9uZW50LmFjY3VtdWxhdG9yIC09IGNvbXBvbmVudC5uZXh0VGljaztcclxuXHJcbiAgICAgICAgY29tcG9uZW50Lm5leHRUaWNrID0gY29tcG9uZW50Lm1zUGVyRnJhbWUgKyBjb21wb25lbnQuY3VycmVudEZyYW1lLmR1cmF0aW9uO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIHRoZSBBbmltYXRpb24gdmFsdWVzIGludG8gdGhlIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jbG9hZFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufSBjb21wb25lbnQgLSBUaGUgQW5pbWF0aW9uIENvbXBvbmVudCB0byBsb2FkIHZhbHVlcyBpbnRvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzdGFydEZyYW1lIC0gVGhlIHN0YXJ0IGZyYW1lIG9mIHRoZSBhbmltYXRpb24gdG8gbG9hZC5cclxuICAgICAqL1xyXG4gICAgbG9hZDogZnVuY3Rpb24gKGNvbXBvbmVudCwgc3RhcnRGcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RhcnRGcmFtZSA+PSB0aGlzLmZyYW1lcy5sZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdGFydEZyYW1lID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb21wb25lbnQuY3VycmVudEFuaW0gIT09IHRoaXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb25lbnQuY3VycmVudEFuaW0gPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgY29tcG9uZW50LmZyYW1lUmF0ZSA9IHRoaXMuZnJhbWVSYXRlO1xyXG4gICAgICAgICAgICBjb21wb25lbnQuZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICBjb21wb25lbnQubXNQZXJGcmFtZSA9IHRoaXMubXNQZXJGcmFtZTtcclxuICAgICAgICAgICAgY29tcG9uZW50LnNraXBNaXNzZWRGcmFtZXMgPSB0aGlzLnNraXBNaXNzZWRGcmFtZXM7XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnQuX2RlbGF5ID0gdGhpcy5kZWxheTtcclxuICAgICAgICAgICAgY29tcG9uZW50Ll9yZXBlYXQgPSB0aGlzLnJlcGVhdDtcclxuICAgICAgICAgICAgY29tcG9uZW50Ll9yZXBlYXREZWxheSA9IHRoaXMucmVwZWF0RGVsYXk7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5feW95byA9IHRoaXMueW95bztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWVzW3N0YXJ0RnJhbWVdO1xyXG5cclxuICAgICAgICBpZiAoc3RhcnRGcmFtZSA9PT0gMCAmJiAhY29tcG9uZW50LmZvcndhcmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmcmFtZSA9IHRoaXMuZ2V0TGFzdEZyYW1lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnQudXBkYXRlRnJhbWUoZnJhbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZyYW1lIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIHByb2dyZXNzIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNnZXRGcmFtZUJ5UHJvZ3Jlc3NcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBUaGUgZnJhbWUgY2xvc2VzdCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGdldEZyYW1lQnlQcm9ncmVzczogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHZhbHVlID0gQ2xhbXAodmFsdWUsIDAsIDEpO1xyXG5cclxuICAgICAgICByZXR1cm4gRmluZENsb3Nlc3RJblNvcnRlZCh2YWx1ZSwgdGhpcy5mcmFtZXMsICdwcm9ncmVzcycpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkdmFuY2UgdGhlIGFuaW1hdGlvbiBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNuZXh0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufSBjb21wb25lbnQgLSBUaGUgQW5pbWF0aW9uIENvbXBvbmVudCB0byBhZHZhbmNlLlxyXG4gICAgICovXHJcbiAgICBuZXh0RnJhbWU6IGZ1bmN0aW9uIChjb21wb25lbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50LmN1cnJlbnRGcmFtZTtcclxuXHJcbiAgICAgICAgLy8gIFRPRE86IEFkZCBmcmFtZSBza2lwIHN1cHBvcnRcclxuXHJcbiAgICAgICAgaWYgKGZyYW1lLmlzTGFzdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb25cclxuXHJcbiAgICAgICAgICAgIC8vICBZb3lvPyAoaGFwcGVucyBiZWZvcmUgcmVwZWF0KVxyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Ll95b3lvKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVlveW9GcmFtZShjb21wb25lbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQucmVwZWF0Q291bnRlciA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBSZXBlYXQgKGhhcHBlbnMgYmVmb3JlIGNvbXBsZXRlKVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuX3JldmVyc2UgJiYgY29tcG9uZW50LmZvcndhcmQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmZvcndhcmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGVhdEFuaW1hdGlvbihjb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFuaW1hdGlvbihjb21wb25lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQW5kR2V0TmV4dFRpY2soY29tcG9uZW50LCBmcmFtZS5uZXh0RnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgdGhlIHlveW8gZnVuY3Rpb25hbGl0eSBpbiBuZXh0RnJhbWUgYW5kIHByZXZpb3VzRnJhbWUgbWV0aG9kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNoYW5kbGVZb3lvRnJhbWVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb259IGNvbXBvbmVudCAtIFRoZSBBbmltYXRpb24gQ29tcG9uZW50IHRvIGFkdmFuY2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzUmV2ZXJzZSAtIElzIGFuaW1hdGlvbiBpbiByZXZlcnNlIG1vZGU/IChEZWZhdWx0OiBmYWxzZSlcclxuICAgICAqL1xyXG4gICAgaGFuZGxlWW95b0ZyYW1lOiBmdW5jdGlvbiAoY29tcG9uZW50LCBpc1JldmVyc2UpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFpc1JldmVyc2UpIHsgaXNSZXZlcnNlID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKGNvbXBvbmVudC5fcmV2ZXJzZSA9PT0gIWlzUmV2ZXJzZSAmJiBjb21wb25lbnQucmVwZWF0Q291bnRlciA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5fcmVwZWF0RGVsYXkgfHwgY29tcG9uZW50LnBlbmRpbmdSZXBlYXQpXHJcblxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZm9yd2FyZCA9IGlzUmV2ZXJzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXBlYXRBbmltYXRpb24oY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb21wb25lbnQuX3JldmVyc2UgIT09IGlzUmV2ZXJzZSAmJiBjb21wb25lbnQucmVwZWF0Q291bnRlciA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVBbmltYXRpb24oY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29tcG9uZW50LmZvcndhcmQgPSBpc1JldmVyc2U7XHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IChpc1JldmVyc2UpID8gY29tcG9uZW50LmN1cnJlbnRGcmFtZS5uZXh0RnJhbWUgOiBjb21wb25lbnQuY3VycmVudEZyYW1lLnByZXZGcmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBbmRHZXROZXh0VGljayhjb21wb25lbnQsIGZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gbGFzdCBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNnZXRMYXN0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gY29tcG9uZW50IC0gVGhlIEFuaW1hdGlvbiBMYXN0IEZyYW1lLlxyXG4gICAgICovXHJcbiAgICBnZXRMYXN0RnJhbWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJhbWVzW3RoaXMuZnJhbWVzLmxlbmd0aCAtIDFdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIEFuaW1hdGlvbiBpcyBwbGF5aW5nIGJhY2t3YXJkcy5cclxuICAgICAqIFNldHMgdGhlIHByZXZpb3VzIGZyYW1lLCBjYXVzaW5nIGEgeW95bywgcmVwZWF0LCBjb21wbGV0ZSBvciB1cGRhdGUsIGFjY29yZGluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI3ByZXZpb3VzRnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufSBjb21wb25lbnQgLSBUaGUgQW5pbWF0aW9uIENvbXBvbmVudCBiZWxvbmdpbmcgdG8gdGhlIEdhbWUgT2JqZWN0IGludm9raW5nIHRoaXMgY2FsbC5cclxuICAgICAqL1xyXG4gICAgcHJldmlvdXNGcmFtZTogZnVuY3Rpb24gKGNvbXBvbmVudClcclxuICAgIHtcclxuICAgICAgICB2YXIgZnJhbWUgPSBjb21wb25lbnQuY3VycmVudEZyYW1lO1xyXG5cclxuICAgICAgICAvLyAgVE9ETzogQWRkIGZyYW1lIHNraXAgc3VwcG9ydFxyXG5cclxuICAgICAgICBpZiAoZnJhbWUuaXNGaXJzdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvblxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5feW95bylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVZb3lvRnJhbWUoY29tcG9uZW50LCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQucmVwZWF0Q291bnRlciA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuX3JldmVyc2UgJiYgIWNvbXBvbmVudC5mb3J3YXJkKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jdXJyZW50RnJhbWUgPSB0aGlzLmdldExhc3RGcmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwZWF0QW5pbWF0aW9uKGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIFJlcGVhdCAoaGFwcGVucyBiZWZvcmUgY29tcGxldGUpXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmZvcndhcmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwZWF0QW5pbWF0aW9uKGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQW5pbWF0aW9uKGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBbmRHZXROZXh0VGljayhjb21wb25lbnQsIGZyYW1lLnByZXZGcmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBGcmFtZSBhbmQgV2FpdCBuZXh0IHRpY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jdXBkYXRlQW5kR2V0TmV4dFRpY2tcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBBbiBBbmltYXRpb24gZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUFuZEdldE5leHRUaWNrOiBmdW5jdGlvbiAoY29tcG9uZW50LCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBjb21wb25lbnQudXBkYXRlRnJhbWUoZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLmdldE5leHRUaWNrKGNvbXBvbmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gQW5pbWF0aW9uRnJhbWUgZnJvbSB0aGlzIEFuaW1hdGlvbiBpbnN0YW5jZS5cclxuICAgICAqIFRoaXMgaXMgYSBnbG9iYWwgYWN0aW9uLiBBbnkgR2FtZSBPYmplY3QgdXNpbmcgdGhpcyBBbmltYXRpb24gd2lsbCBiZSBpbXBhY3RlZCBieSB0aGlzIGNoYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNyZW1vdmVGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBUaGUgQW5pbWF0aW9uRnJhbWUgdG8gYmUgcmVtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEFuaW1hdGlvbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUZyYW1lOiBmdW5jdGlvbiAoZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5mcmFtZXMuaW5kZXhPZihmcmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZyYW1lQXQoaW5kZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGZyYW1lIGZyb20gdGhlIEFuaW1hdGlvbkZyYW1lIGFycmF5IGF0IHRoZSBwcm92aWRlZCBpbmRleFxyXG4gICAgICogYW5kIHVwZGF0ZXMgdGhlIGFuaW1hdGlvbiBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNyZW1vdmVGcmFtZUF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IGluIHRoZSBBbmltYXRpb25GcmFtZSBhcnJheVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQW5pbWF0aW9uIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRnJhbWVBdDogZnVuY3Rpb24gKGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZnJhbWVzLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRnJhbWVTZXF1ZW5jZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBkdXJpbmcgcGxheWJhY2suIEZvcmNlcyB0aGUgYW5pbWF0aW9uIHRvIHJlcGVhdCwgcHJvdmlkaW5nIHRoZXJlIGFyZSBlbm91Z2ggY291bnRzIGxlZnRcclxuICAgICAqIGluIHRoZSByZXBlYXQgY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNyZXBlYXRBbmltYXRpb25cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjQU5JTUFUSU9OX1JFUEVBVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX1JFUEVBVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX0tFWV9SRVBFQVRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufSBjb21wb25lbnQgLSBUaGUgQW5pbWF0aW9uIENvbXBvbmVudCBiZWxvbmdpbmcgdG8gdGhlIEdhbWUgT2JqZWN0IGludm9raW5nIHRoaXMgY2FsbC5cclxuICAgICAqL1xyXG4gICAgcmVwZWF0QW5pbWF0aW9uOiBmdW5jdGlvbiAoY29tcG9uZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb21wb25lbnQuX3BlbmRpbmdTdG9wID09PSAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGVBbmltYXRpb24oY29tcG9uZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb21wb25lbnQuX3JlcGVhdERlbGF5ID4gMCAmJiBjb21wb25lbnQucGVuZGluZ1JlcGVhdCA9PT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb25lbnQucGVuZGluZ1JlcGVhdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5hY2N1bXVsYXRvciAtPSBjb21wb25lbnQubmV4dFRpY2s7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudC5uZXh0VGljayArPSBjb21wb25lbnQuX3JlcGVhdERlbGF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb25lbnQucmVwZWF0Q291bnRlci0tO1xyXG5cclxuICAgICAgICAgICAgY29tcG9uZW50LnVwZGF0ZUZyYW1lKGNvbXBvbmVudC5jdXJyZW50RnJhbWVbKGNvbXBvbmVudC5mb3J3YXJkKSA/ICduZXh0RnJhbWUnIDogJ3ByZXZGcmFtZSddKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNQbGF5aW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE5leHRUaWNrKGNvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnBlbmRpbmdSZXBlYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZnJhbWUgPSBjb21wb25lbnQuY3VycmVudEZyYW1lO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IGNvbXBvbmVudC5wYXJlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5BTklNQVRJT05fUkVQRUFULCB0aGlzLCBmcmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFyZW50LmVtaXQoRXZlbnRzLlNQUklURV9BTklNQVRJT05fS0VZX1JFUEVBVCArIHRoaXMua2V5LCB0aGlzLCBmcmFtZSwgY29tcG9uZW50LnJlcGVhdENvdW50ZXIsIHBhcmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFyZW50LmVtaXQoRXZlbnRzLlNQUklURV9BTklNQVRJT05fUkVQRUFULCB0aGlzLCBmcmFtZSwgY29tcG9uZW50LnJlcGVhdENvdW50ZXIsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSBmcmFtZSB0aGUgYW5pbWF0aW9uIHVzZXMgZm9yIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiNzZXRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb259IGNvbXBvbmVudCAtIFRoZSBBbmltYXRpb24gQ29tcG9uZW50IGJlbG9uZ2luZyB0byB0aGUgR2FtZSBPYmplY3QgaW52b2tpbmcgdGhpcyBjYWxsLlxyXG4gICAgICovXHJcbiAgICBzZXRGcmFtZTogZnVuY3Rpb24gKGNvbXBvbmVudClcclxuICAgIHtcclxuICAgICAgICAvLyAgV29yayBvdXQgd2hpY2ggZnJhbWUgc2hvdWxkIGJlIHNldCBuZXh0IG9uIHRoZSBjaGlsZCwgYW5kIHNldCBpdFxyXG4gICAgICAgIGlmIChjb21wb25lbnQuZm9yd2FyZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYW1lKGNvbXBvbmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGcmFtZShjb21wb25lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGUgYW5pbWF0aW9uIGRhdGEgdG8gSlNPTi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbiN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkpTT05BbmltYXRpb259IFRoZSByZXN1bHRpbmcgSlNPTkFuaW1hdGlvbiBmb3JtYXR0ZWQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IHtcclxuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgICAgICBmcmFtZXM6IFtdLFxyXG4gICAgICAgICAgICBmcmFtZVJhdGU6IHRoaXMuZnJhbWVSYXRlLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcclxuICAgICAgICAgICAgc2tpcE1pc3NlZEZyYW1lczogdGhpcy5za2lwTWlzc2VkRnJhbWVzLFxyXG4gICAgICAgICAgICBkZWxheTogdGhpcy5kZWxheSxcclxuICAgICAgICAgICAgcmVwZWF0OiB0aGlzLnJlcGVhdCxcclxuICAgICAgICAgICAgcmVwZWF0RGVsYXk6IHRoaXMucmVwZWF0RGVsYXksXHJcbiAgICAgICAgICAgIHlveW86IHRoaXMueW95byxcclxuICAgICAgICAgICAgc2hvd09uU3RhcnQ6IHRoaXMuc2hvd09uU3RhcnQsXHJcbiAgICAgICAgICAgIGhpZGVPbkNvbXBsZXRlOiB0aGlzLmhpZGVPbkNvbXBsZXRlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5mcmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXQuZnJhbWVzLnB1c2goZnJhbWUudG9KU09OKCkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHdoZW5ldmVyIGZyYW1lcyBhcmUgYWRkZWQgdG8sIG9yIHJlbW92ZWQgZnJvbSwgdGhpcyBBbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jdXBkYXRlRnJhbWVTZXF1ZW5jZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBBbmltYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVGcmFtZVNlcXVlbmNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsZW4gPSB0aGlzLmZyYW1lcy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHNsaWNlID0gMSAvIChsZW4gLSAxKTtcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmZyYW1lc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lLmluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgICAgIGZyYW1lLmlzRmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgZnJhbWUuaXNMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZyYW1lLnByb2dyZXNzID0gaSAqIHNsaWNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGkgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZyYW1lLmlzRmlyc3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhbWUuaXNMYXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5uZXh0RnJhbWUgPSBmcmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5wcmV2RnJhbWUgPSBmcmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5pc0xhc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5wcmV2RnJhbWUgPSB0aGlzLmZyYW1lc1tsZW4gLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZS5uZXh0RnJhbWUgPSB0aGlzLmZyYW1lc1tpICsgMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gbGVuIC0gMSAmJiBsZW4gPiAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcmFtZS5pc0xhc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZnJhbWUucHJldkZyYW1lID0gdGhpcy5mcmFtZXNbbGVuIC0gMl07XHJcbiAgICAgICAgICAgICAgICBmcmFtZS5uZXh0RnJhbWUgPSB0aGlzLmZyYW1lc1swXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZW4gPiAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcmFtZS5wcmV2RnJhbWUgPSB0aGlzLmZyYW1lc1tpIC0gMV07XHJcbiAgICAgICAgICAgICAgICBmcmFtZS5uZXh0RnJhbWUgPSB0aGlzLmZyYW1lc1tpICsgMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyBwbGF5YmFjayBvZiB0aGlzIEFuaW1hdGlvbi4gVGhlIHBhdXNlZCBzdGF0ZSBpcyBzZXQgaW1tZWRpYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb24jcGF1c2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQW5pbWF0aW9uIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN1bWVzIHBsYXliYWNrIG9mIHRoaXMgQW5pbWF0aW9uLiBUaGUgcGF1c2VkIHN0YXRlIGlzIHJlc2V0IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI3Jlc3VtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBBbmltYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBBbmltYXRpb24gaW5zdGFuY2UuIEl0IHdpbGwgcmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnMsXHJcbiAgICAgKiByZW1vdmUgdGhpcyBhbmltYXRpb24gYW5kIGl0cyBrZXkgZnJvbSB0aGUgZ2xvYmFsIEFuaW1hdGlvbiBNYW5hZ2VyLFxyXG4gICAgICogYW5kIHRoZW4gZGVzdHJveSBhbGwgQW5pbWF0aW9uIEZyYW1lcyBpbiB0dXJuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5vZmYoRXZlbnRzLlBBVVNFX0FMTCwgdGhpcy5wYXVzZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLm9mZihFdmVudHMuUkVTVU1FX0FMTCwgdGhpcy5yZXN1bWUsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucmVtb3ZlKHRoaXMua2V5KTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZyYW1lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZnJhbWVzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQW5pbWF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBmcmFtZSBpbiBhbiBBbmltYXRpb24gc2VxdWVuY2UuXHJcbiAqXHJcbiAqIEFuIEFuaW1hdGlvbkZyYW1lIGNvbnNpc3RzIG9mIGEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIGl0IHVzZXMgZm9yIHJlbmRlcmluZywgcmVmZXJlbmNlcyB0byBvdGhlclxyXG4gKiBmcmFtZXMgaW4gdGhlIGFuaW1hdGlvbiwgYW5kIGluZGV4IGRhdGEuIEl0IGFsc28gaGFzIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSB0aGUgYW5pbWF0aW9uIHRpbWluZy5cclxuICpcclxuICogQW5pbWF0aW9uRnJhbWVzIGFyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgQW5pbWF0aW9uIGNsYXNzLlxyXG4gKlxyXG4gKiBAY2xhc3MgQW5pbWF0aW9uRnJhbWVcclxuICogQG1lbWJlcm9mIFBoYXNlci5BbmltYXRpb25zXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVLZXkgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgQW5pbWF0aW9uRnJhbWUgdXNlcy5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSB0ZXh0dXJlRnJhbWUgLSBUaGUga2V5IG9mIHRoZSBGcmFtZSB3aXRoaW4gdGhlIFRleHR1cmUgdGhhdCB0aGlzIEFuaW1hdGlvbkZyYW1lIHVzZXMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhpcyBBbmltYXRpb25GcmFtZSB3aXRoaW4gdGhlIEFuaW1hdGlvbiBzZXF1ZW5jZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRleHR1cmUgRnJhbWUgdGhpcyBBbmltYXRpb25GcmFtZSB1c2VzIGZvciByZW5kZXJpbmcuXHJcbiAqL1xyXG52YXIgQW5pbWF0aW9uRnJhbWUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQW5pbWF0aW9uRnJhbWUgKHRleHR1cmVLZXksIHRleHR1cmVGcmFtZSwgaW5kZXgsIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBBbmltYXRpb25GcmFtZSB1c2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjdGV4dHVyZUtleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlS2V5ID0gdGV4dHVyZUtleTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGtleSBvZiB0aGUgRnJhbWUgd2l0aGluIHRoZSBUZXh0dXJlIHRoYXQgdGhpcyBBbmltYXRpb25GcmFtZSB1c2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjdGV4dHVyZUZyYW1lXHJcbiAgICAgICAgICogQHR5cGUgeyhzdHJpbmd8aW50ZWdlcil9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlRnJhbWUgPSB0ZXh0dXJlRnJhbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIEFuaW1hdGlvbkZyYW1lIHdpdGhpbiB0aGUgQW5pbWF0aW9uIHNlcXVlbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjaW5kZXhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIEZyYW1lIHRoaXMgQW5pbWF0aW9uRnJhbWUgdXNlcyBmb3IgcmVuZGVyaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjZnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyB0aGUgZmlyc3QgZnJhbWUgaW4gYW4gYW5pbWF0aW9uIHNlcXVlbmNlP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjaXNGaXJzdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoaXMgdGhlIGxhc3QgZnJhbWUgaW4gYW4gYW5pbWF0aW9uIHNlcXVlbmNlP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjaXNMYXN0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzTGFzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uRnJhbWUgdGhhdCBjb21lcyBiZWZvcmUgdGhpcyBvbmUgaW4gdGhlIGFuaW1hdGlvbiwgaWYgYW55LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjcHJldkZyYW1lXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcmV2RnJhbWUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uRnJhbWUgdGhhdCBjb21lcyBhZnRlciB0aGlzIG9uZSBpbiB0aGUgYW5pbWF0aW9uLCBpZiBhbnkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZSNuZXh0RnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5leHRGcmFtZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFkZGl0aW9uYWwgdGltZSAoaW4gbXMpIHRoYXQgdGhpcyBmcmFtZSBzaG91bGQgYXBwZWFyIGZvciBkdXJpbmcgcGxheWJhY2suXHJcbiAgICAgICAgICogVGhlIHZhbHVlIGlzIGFkZGVkIG9udG8gdGhlIG1zUGVyRnJhbWUgc2V0IGJ5IHRoZSBhbmltYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZSNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGF0ICUgdGhyb3VnaCB0aGUgYW5pbWF0aW9uIGRvZXMgdGhpcyBmcmFtZSBjb21lP1xyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBjcmVhdGVkIGFuZCBjYWNoZWQgaGVyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lI3Byb2dyZXNzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgSmF2YVNjcmlwdCBvYmplY3Qgc3VpdGFibGUgZm9yIGNvbnZlcnRpbmcgdG8gSlNPTi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuSlNPTkFuaW1hdGlvbkZyYW1lfSBUaGUgQW5pbWF0aW9uRnJhbWUgZGF0YS5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy50ZXh0dXJlS2V5LFxyXG4gICAgICAgICAgICBmcmFtZTogdGhpcy50ZXh0dXJlRnJhbWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIG9iamVjdCBieSByZW1vdmluZyByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHJlc291cmNlcyBhbmQgY2FsbGJhY2tzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mcmFtZSA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBbmltYXRpb25GcmFtZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQW5pbWF0aW9uID0gcmVxdWlyZSgnLi9BbmltYXRpb24nKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEN1c3RvbU1hcCA9IHJlcXVpcmUoJy4uL3N0cnVjdHMvTWFwJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2FtZUV2ZW50cyA9IHJlcXVpcmUoJy4uL2NvcmUvZXZlbnRzJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgUGFkID0gcmVxdWlyZSgnLi4vdXRpbHMvc3RyaW5nL1BhZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBBbmltYXRpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBnbG9iYWwgQW5pbWF0aW9uIE1hbmFnZXIuIFRoaXMgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBpc1xyXG4gKiByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW5kIGRlbGl2ZXJpbmcgYW5pbWF0aW9ucyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBkYXRhIHRvIGFsbCBHYW1lIE9iamVjdHMuXHJcbiAqIFVubGlrZSBwbHVnaW5zIGl0IGlzIG93bmVkIGJ5IHRoZSBHYW1lIGluc3RhbmNlLCBub3QgdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBTcHJpdGVzIGFuZCBvdGhlciBHYW1lIE9iamVjdHMgZ2V0IHRoZSBkYXRhIHRoZXkgbmVlZCBmcm9tIHRoZSBBbmltYXRpb25NYW5hZ2VyLlxyXG4gKlxyXG4gKiBAY2xhc3MgQW5pbWF0aW9uTWFuYWdlclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkFuaW1hdGlvbnNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEFuaW1hdGlvbk1hbmFnZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEFuaW1hdGlvbk1hbmFnZXIgKGdhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjdGV4dHVyZU1hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdsb2JhbCB0aW1lIHNjYWxlIG9mIHRoZSBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgc2NhbGVzIHRoZSB0aW1lIGRlbHRhIGJldHdlZW4gdHdvIGZyYW1lcywgdGh1cyBpbmZsdWVuY2luZyB0aGUgc3BlZWQgb2YgdGltZSBmb3IgdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNnbG9iYWxUaW1lU2NhbGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsb2JhbFRpbWVTY2FsZSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBBbmltYXRpb25zIHJlZ2lzdGVyZWQgaW4gdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBtYXAgc2hvdWxkIGJlIG1vZGlmaWVkIHdpdGggdGhlIHtAbGluayAjYWRkfSBhbmQge0BsaW5rICNjcmVhdGV9IG1ldGhvZHMgb2YgdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNhbmltc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5NYXAuPHN0cmluZywgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uPn1cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmltcyA9IG5ldyBDdXN0b21NYXAoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgQW5pbWF0aW9uIE1hbmFnZXIgaXMgcGF1c2VkIGFsb25nIHdpdGggYWxsIG9mIGl0cyBBbmltYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNwYXVzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgQW5pbWF0aW9uIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9ICdBbmltYXRpb25NYW5hZ2VyJztcclxuXHJcbiAgICAgICAgZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkJPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycyBhZnRlciB0aGUgR2FtZSBib290cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjYm9vdFxyXG4gICAgICogQGxpc3RlbnMgUGhhc2VyLkNvcmUuRXZlbnRzI0RFU1RST1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudGV4dHVyZU1hbmFnZXIgPSB0aGlzLmdhbWUudGV4dHVyZXM7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBleGlzdGluZyBBbmltYXRpb24gdG8gdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNhZGRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjQUREX0FOSU1BVElPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIEFuaW1hdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZSBBbmltYXRpb24gd2lsbCBiZSB1cGRhdGVkIHdpdGggaXQuIE11c3QgYmUgdW5pcXVlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIFRoZSBBbmltYXRpb24gd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChrZXksIGFuaW1hdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5hbmltcy5oYXMoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQW5pbWF0aW9uIGtleSBleGlzdHM6ICcgKyBrZXkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhbmltYXRpb24ua2V5ID0ga2V5O1xyXG5cclxuICAgICAgICB0aGlzLmFuaW1zLnNldChrZXksIGFuaW1hdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuQUREX0FOSU1BVElPTiwga2V5LCBhbmltYXRpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBrZXkgaXMgYWxyZWFkeSBpbiB1c2Ugd2l0aGluIHRoZSBBbmltYXRpb24gTWFuYWdlciBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEFuaW1hdGlvbnMgYXJlIGdsb2JhbC4gS2V5cyBjcmVhdGVkIGluIG9uZSBzY2VuZSBjYW4gYmUgdXNlZCBmcm9tIGFueSBvdGhlciBTY2VuZSBpbiB5b3VyIGdhbWUuIFRoZXkgYXJlIG5vdCBTY2VuZSBzcGVjaWZpYy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjZXhpc3RzXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIEFuaW1hdGlvbiB0byBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIEFuaW1hdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgQW5pbWF0aW9uIE1hbmFnZXIsIG9yIGBmYWxzZWAgaWYgdGhlIGtleSBpcyBhdmFpbGFibGUuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0czogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbmltcy5oYXMoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFuaW1hdGlvbiBhbmQgYWRkcyBpdCB0byB0aGUgQW5pbWF0aW9uIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEFuaW1hdGlvbnMgYXJlIGdsb2JhbC4gT25jZSBjcmVhdGVkLCB5b3UgY2FuIHVzZSB0aGVtIGluIGFueSBTY2VuZSBpbiB5b3VyIGdhbWUuIFRoZXkgYXJlIG5vdCBTY2VuZSBzcGVjaWZpYy5cclxuICAgICAqIFxyXG4gICAgICogSWYgYW4gaW52YWxpZCBrZXkgaXMgZ2l2ZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYGZhbHNlYC5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IHBhc3MgdGhlIGtleSBvZiBhbiBhbmltYXRpb24gdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgQW5pbWF0aW9uIE1hbmFnZXIsIHRoYXQgYW5pbWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEEgYnJhbmQgbmV3IGFuaW1hdGlvbiBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIGtleSBpcyB2YWxpZCBhbmQgbm90IGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZS11c2UgYW4gZXhpc3Rpbmcga2V5LCBjYWxsIGBBbmltYXRpb25NYW5hZ2VyLnJlbW92ZWAgZmlyc3QsIHRoZW4gdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyI2NyZWF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNBRERfQU5JTUFUSU9OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBBbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbnxmYWxzZSl9IFRoZSBBbmltYXRpb24gdGhhdCB3YXMgY3JlYXRlZCwgb3IgYGZhbHNlYCBpcyB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGtleSA9IGNvbmZpZy5rZXk7XHJcblxyXG4gICAgICAgIHZhciBhbmltID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChrZXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmltID0gdGhpcy5nZXQoa2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghYW5pbSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb24odGhpcywga2V5LCBjb25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYW5pbXMuc2V0KGtleSwgYW5pbSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkFERF9BTklNQVRJT04sIGtleSwgYW5pbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhbmltO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIHRoaXMgQW5pbWF0aW9uIE1hbmFnZXIncyBBbmltYXRpb25zIGFuZCBzZXR0aW5ncyBmcm9tIGEgSlNPTiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyI2Zyb21KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuSlNPTkFuaW1hdGlvbnN8UGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuSlNPTkFuaW1hdGlvbil9IGRhdGEgLSBUaGUgSlNPTiBvYmplY3QgdG8gcGFyc2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbGVhckN1cnJlbnRBbmltYXRpb25zPWZhbHNlXSAtIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBjdXJyZW50IGFuaW1hdGlvbnMgd2lsbCBiZSByZW1vdmVkIChgYW5pbXMuY2xlYXIoKWApLiBJZiBzZXQgdG8gYGZhbHNlYCAoZGVmYXVsdCksIHRoZSBhbmltYXRpb25zIGluIGBkYXRhYCB3aWxsIGJlIGFkZGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgQW5pbWF0aW9uIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjYWxsLlxyXG4gICAgICovXHJcbiAgICBmcm9tSlNPTjogZnVuY3Rpb24gKGRhdGEsIGNsZWFyQ3VycmVudEFuaW1hdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNsZWFyQ3VycmVudEFuaW1hdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBjbGVhckN1cnJlbnRBbmltYXRpb25zID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKGNsZWFyQ3VycmVudEFuaW1hdGlvbnMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFuaW1zLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgRG8gd2UgaGF2ZSBhIFN0cmluZyAoaS5lLiBmcm9tIEpTT04sIG9yIGFuIE9iamVjdD8pXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICAvLyAgQXJyYXkgb2YgYW5pbWF0aW9ucywgb3IgYSBzaW5nbGUgYW5pbWF0aW9uP1xyXG4gICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdhbmltcycpICYmIEFycmF5LmlzQXJyYXkoZGF0YS5hbmltcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuYW5pbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHRoaXMuY3JlYXRlKGRhdGEuYW5pbXNbaV0pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ2dsb2JhbFRpbWVTY2FsZScpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbFRpbWVTY2FsZSA9IGRhdGEuZ2xvYmFsVGltZVNjYWxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ2tleScpICYmIGRhdGEudHlwZSA9PT0gJ2ZyYW1lJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKHRoaXMuY3JlYXRlKGRhdGEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgYW4gYXJyYXkgb2Yge0BsaW5rIFBoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBvYmplY3RzIGZyb20gYSB0ZXh0dXJlIGtleSBhbmQgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogR2VuZXJhdGVzIG9iamVjdHMgd2l0aCBzdHJpbmcgYmFzZWQgZnJhbWUgbmFtZXMsIGFzIGNvbmZpZ3VyZWQgYnkgdGhlIGdpdmVuIHtAbGluayBQaGFzZXIuVHlwZXMuQW5pbWF0aW9ucy5HZW5lcmF0ZUZyYW1lTmFtZXN9LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCdzIGEgaGVscGVyIG1ldGhvZCwgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHlvdSB0byBleHRyYWN0IGFsbCBvZiB0aGUgZnJhbWUgbmFtZXMgZnJvbSB0ZXh0dXJlIGF0bGFzZXMuXHJcbiAgICAgKiBJZiB5b3UncmUgd29ya2luZyB3aXRoIGEgc3ByaXRlIHNoZWV0LCBzZWUgdGhlIGBnZW5lcmF0ZUZyYW1lTnVtYmVyc2AgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgKiBcclxuICAgICAqIEV4YW1wbGU6XHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBoYXZlIGEgdGV4dHVyZSBhdGxhc2VzIGxvYWRlZCBjYWxsZWQgYGdlbXNgIGFuZCBpdCBjb250YWlucyA2IGZyYW1lcyBjYWxsZWQgYHJ1YnlfMDAwMWAsIGBydWJ5XzAwMDJgLCBhbmQgc28gb24sXHJcbiAgICAgKiB0aGVuIHlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCB1c2luZzogYHRoaXMuYW5pbXMuZ2VuZXJhdGVGcmFtZU5hbWVzKCdnZW1zJywgeyBwcmVmaXg6ICdydWJ5XycsIGVuZDogNiwgemVyb1BhZDogNCB9KWAuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBgZW5kYCB2YWx1ZSB0ZWxscyBpdCB0byBsb29rIGZvciA2IGZyYW1lcywgaW5jcmVtZW50YWxseSBudW1iZXJlZCwgYWxsIHN0YXJ0aW5nIHdpdGggdGhlIHByZWZpeCBgcnVieV9gLiBUaGUgYHplcm9QYWRgXHJcbiAgICAgKiB2YWx1ZSB0ZWxscyBpdCBob3cgbWFueSB6ZXJvZXMgcGFkIG91dCB0aGUgbnVtYmVycy4gVG8gY3JlYXRlIGFuIGFuaW1hdGlvbiB1c2luZyB0aGlzIG1ldGhvZCwgeW91IGNhbiBkbzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5hbmltcy5jcmVhdGUoe1xyXG4gICAgICogICBrZXk6ICdydWJ5JyxcclxuICAgICAqICAgcmVwZWF0OiAtMSxcclxuICAgICAqICAgZnJhbWVzOiB0aGlzLmFuaW1zLmdlbmVyYXRlRnJhbWVOYW1lcygnZ2VtcycsIHtcclxuICAgICAqICAgICBwcmVmaXg6ICdydWJ5XycsXHJcbiAgICAgKiAgICAgZW5kOiA2LFxyXG4gICAgICogICAgIHplcm9QYWQ6IDRcclxuICAgICAqICAgfSlcclxuICAgICAqIH0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFBsZWFzZSBzZWUgdGhlIGFuaW1hdGlvbiBleGFtcGxlcyBmb3IgZnVydGhlciBkZXRhaWxzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNnZW5lcmF0ZUZyYW1lTmFtZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IGZvciB0aGUgdGV4dHVyZSBjb250YWluaW5nIHRoZSBhbmltYXRpb24gZnJhbWVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQW5pbWF0aW9ucy5HZW5lcmF0ZUZyYW1lTmFtZXN9IFtjb25maWddIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgYW5pbWF0aW9uIGZyYW1lIG5hbWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW119IFRoZSBhcnJheSBvZiB7QGxpbmsgUGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlRnJhbWVOYW1lczogZnVuY3Rpb24gKGtleSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwcmVmaXggPSBHZXRWYWx1ZShjb25maWcsICdwcmVmaXgnLCAnJyk7XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gR2V0VmFsdWUoY29uZmlnLCAnc3RhcnQnLCAwKTtcclxuICAgICAgICB2YXIgZW5kID0gR2V0VmFsdWUoY29uZmlnLCAnZW5kJywgMCk7XHJcbiAgICAgICAgdmFyIHN1ZmZpeCA9IEdldFZhbHVlKGNvbmZpZywgJ3N1ZmZpeCcsICcnKTtcclxuICAgICAgICB2YXIgemVyb1BhZCA9IEdldFZhbHVlKGNvbmZpZywgJ3plcm9QYWQnLCAwKTtcclxuICAgICAgICB2YXIgb3V0ID0gR2V0VmFsdWUoY29uZmlnLCAnb3V0cHV0QXJyYXknLCBbXSk7XHJcbiAgICAgICAgdmFyIGZyYW1lcyA9IEdldFZhbHVlKGNvbmZpZywgJ2ZyYW1lcycsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLnRleHR1cmVNYW5hZ2VyLmdldChrZXkpO1xyXG5cclxuICAgICAgICBpZiAoIXRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRpZmYgPSAoc3RhcnQgPCBlbmQpID8gMSA6IC0xO1xyXG5cclxuICAgICAgICAvLyAgQWRqdXN0IGJlY2F1c2Ugd2UgdXNlIGkgIT09IGVuZCBpbiB0aGUgZm9yIGxvb3BcclxuICAgICAgICBlbmQgKz0gZGlmZjtcclxuXHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGZyYW1lO1xyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBVc2UgZXZlcnkgZnJhbWUgaW4gdGhlIGF0bGFzP1xyXG4gICAgICAgICAgICBmcmFtZXMgPSB0ZXh0dXJlLmdldEZyYW1lTmFtZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dC5wdXNoKHsga2V5OiBrZXksIGZyYW1lOiBmcmFtZXNbaV0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmcmFtZXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEhhdmUgdGhleSBwcm92aWRlZCB0aGVpciBvd24gY3VzdG9tIGZyYW1lIHNlcXVlbmNlIGFycmF5P1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcmFtZSA9IHByZWZpeCArIFBhZChmcmFtZXNbaV0sIHplcm9QYWQsICcwJywgMSkgKyBzdWZmaXg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUuaGFzKGZyYW1lKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaCh7IGtleToga2V5LCBmcmFtZTogZnJhbWUgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgIT09IGVuZDsgaSArPSBkaWZmKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcmFtZSA9IHByZWZpeCArIFBhZChpLCB6ZXJvUGFkLCAnMCcsIDEpICsgc3VmZml4O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLmhhcyhmcmFtZSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goeyBrZXk6IGtleSwgZnJhbWU6IGZyYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIHtAbGluayBQaGFzZXIuVHlwZXMuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gb2JqZWN0cyBmcm9tIGEgdGV4dHVyZSBrZXkgYW5kIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEdlbmVyYXRlcyBvYmplY3RzIHdpdGggbnVtYmVyZWQgZnJhbWUgbmFtZXMsIGFzIGNvbmZpZ3VyZWQgYnkgdGhlIGdpdmVuIHtAbGluayBQaGFzZXIuVHlwZXMuQW5pbWF0aW9ucy5HZW5lcmF0ZUZyYW1lTnVtYmVyc30uXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSdyZSB3b3JraW5nIHdpdGggYSB0ZXh0dXJlIGF0bGFzLCBzZWUgdGhlIGBnZW5lcmF0ZUZyYW1lTmFtZXNgIG1ldGhvZCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNnZW5lcmF0ZUZyYW1lTnVtYmVyc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgZm9yIHRoZSB0ZXh0dXJlIGNvbnRhaW5pbmcgdGhlIGFuaW1hdGlvbiBmcmFtZXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkdlbmVyYXRlRnJhbWVOdW1iZXJzfSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBhbmltYXRpb24gZnJhbWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lW119IFRoZSBhcnJheSBvZiB7QGxpbmsgUGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlRnJhbWVOdW1iZXJzOiBmdW5jdGlvbiAoa2V5LCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHN0YXJ0RnJhbWUgPSBHZXRWYWx1ZShjb25maWcsICdzdGFydCcsIDApO1xyXG4gICAgICAgIHZhciBlbmRGcmFtZSA9IEdldFZhbHVlKGNvbmZpZywgJ2VuZCcsIC0xKTtcclxuICAgICAgICB2YXIgZmlyc3RGcmFtZSA9IEdldFZhbHVlKGNvbmZpZywgJ2ZpcnN0JywgZmFsc2UpO1xyXG4gICAgICAgIHZhciBvdXQgPSBHZXRWYWx1ZShjb25maWcsICdvdXRwdXRBcnJheScsIFtdKTtcclxuICAgICAgICB2YXIgZnJhbWVzID0gR2V0VmFsdWUoY29uZmlnLCAnZnJhbWVzJywgZmFsc2UpO1xyXG5cclxuICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMudGV4dHVyZU1hbmFnZXIuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmICghdGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmlyc3RGcmFtZSAmJiB0ZXh0dXJlLmhhcyhmaXJzdEZyYW1lKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dC5wdXNoKHsga2V5OiBrZXksIGZyYW1lOiBmaXJzdEZyYW1lIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGk7XHJcblxyXG4gICAgICAgIC8vICBIYXZlIHRoZXkgcHJvdmlkZWQgdGhlaXIgb3duIGN1c3RvbSBmcmFtZSBzZXF1ZW5jZSBhcnJheT9cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmcmFtZXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUuaGFzKGZyYW1lc1tpXSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goeyBrZXk6IGtleSwgZnJhbWU6IGZyYW1lc1tpXSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTm8gZW5kRnJhbWUgdGhlbiBzZWUgaWYgd2UgY2FuIGdldCBpdFxyXG4gICAgICAgICAgICBpZiAoZW5kRnJhbWUgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbmRGcmFtZSA9IHRleHR1cmUuZnJhbWVUb3RhbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGRpZmYgPSAoc3RhcnRGcmFtZSA8IGVuZEZyYW1lKSA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICAgIC8vICBBZGp1c3QgYmVjYXVzZSB3ZSB1c2UgaSAhPT0gZW5kIGluIHRoZSBmb3IgbG9vcFxyXG4gICAgICAgICAgICBlbmRGcmFtZSArPSBkaWZmO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gc3RhcnRGcmFtZTsgaSAhPT0gZW5kRnJhbWU7IGkgKz0gZGlmZilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUuaGFzKGkpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKHsga2V5OiBrZXksIGZyYW1lOiBpIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhbiBBbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyI2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIEFuaW1hdGlvbiB0byByZXRyaWV2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IFRoZSBBbmltYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGdldDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbmltcy5nZXQoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGFuIEFuaW1hdGlvbiBpbnRvIGEgR2FtZSBPYmplY3QncyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNsb2FkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCB0byBsb2FkIHRoZSBhbmltYXRpb24gaW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gbG9hZC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW3N0YXJ0RnJhbWVdIC0gVGhlIG5hbWUgb2YgYSBzdGFydCBmcmFtZSB0byBzZXQgb24gdGhlIGxvYWRlZCBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB3aXRoIHRoZSBhbmltYXRpb24gbG9hZGVkIGludG8gaXQuXHJcbiAgICAgKi9cclxuICAgIGxvYWQ6IGZ1bmN0aW9uIChjaGlsZCwga2V5LCBzdGFydEZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhbmltID0gdGhpcy5nZXQoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKGFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmltLmxvYWQoY2hpbGQsIHN0YXJ0RnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ01pc3NpbmcgYW5pbWF0aW9uOiAnICsga2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXVzZSBhbGwgYW5pbWF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjcGF1c2VBbGxcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjUEFVU0VfQUxMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBwYXVzZUFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMucGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QQVVTRV9BTEwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGxheSBhbiBhbmltYXRpb24gb24gdGhlIGdpdmVuIEdhbWUgT2JqZWN0cyB0aGF0IGhhdmUgYW4gQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjcGxheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGFuaW1hdGlvbiB0byBwbGF5IG9uIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3RzIHRvIHBsYXkgdGhlIGFuaW1hdGlvbiBvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBwbGF5OiBmdW5jdGlvbiAoa2V5LCBjaGlsZClcclxuICAgIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGQgPSBbIGNoaWxkIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYW5pbSA9IHRoaXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmICghYW5pbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkW2ldLmFuaW1zLnBsYXkoa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYW4gQW5pbWF0aW9uIGZyb20gdGhpcyBBbmltYXRpb24gTWFuYWdlciwgYmFzZWQgb24gdGhlIGdpdmVuIGtleS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyBhIGdsb2JhbCBhY3Rpb24uIE9uY2UgYW4gQW5pbWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIG5vIEdhbWUgT2JqZWN0c1xyXG4gICAgICogY2FuIGNhcnJ5IG9uIHVzaW5nIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciNyZW1vdmVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjUkVNT1ZFX0FOSU1BVElPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGFuaW1hdGlvbiB0byByZW1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBUaGUgQW5pbWF0aW9uIGluc3RhbmNlIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgQW5pbWF0aW9uIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgYW5pbSA9IHRoaXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChhbmltKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5SRU1PVkVfQU5JTUFUSU9OLCBrZXksIGFuaW0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hbmltcy5kZWxldGUoa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhbmltO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZSBhbGwgcGF1c2VkIGFuaW1hdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyI3Jlc3VtZUFsbFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNSRVNVTUVfQUxMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZXN1bWVBbGw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUkVTVU1FX0FMTCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgdGhhdCBoYXZlIGFuIEFuaW1hdGlvbiBDb21wb25lbnQgYW5kIHRoZW5cclxuICAgICAqIHN0YXJ0cyB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHBsYXlpbmcgb24gdGhlbSwgZWFjaCBvbmUgb2Zmc2V0IGJ5IHRoZVxyXG4gICAgICogYHN0YWdnZXJgIGFtb3VudCBnaXZlbiB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjc3RhZ2dlclBsYXlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBHIC0gW2l0ZW1zLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGFuaW1hdGlvbiB0byBwbGF5IG9uIHRoZSBHYW1lIE9iamVjdHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IGNoaWxkcmVuIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIHBsYXkgdGhlIGFuaW1hdGlvbiBvbi4gVGhleSBtdXN0IGhhdmUgYW4gQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhZ2dlcj0wXSAtIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBvZmZzZXQgZWFjaCBwbGF5IHRpbWUgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc3RhZ2dlclBsYXk6IGZ1bmN0aW9uIChrZXksIGNoaWxkcmVuLCBzdGFnZ2VyKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzdGFnZ2VyID09PSB1bmRlZmluZWQpIHsgc3RhZ2dlciA9IDA7IH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gWyBjaGlsZHJlbiBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGFuaW0gPSB0aGlzLmdldChrZXkpO1xyXG5cclxuICAgICAgICBpZiAoIWFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZHJlbltpXS5hbmltcy5kZWxheWVkUGxheShzdGFnZ2VyICogaSwga2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIEFuaW1hdGlvbiBkYXRhIGFzIEphdmFTY3JpcHQgb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKiBPciwgaWYgbm90IGtleSBpcyBkZWZpbmVkLCBpdCB3aWxsIHJldHVybiB0aGUgZGF0YSBvZiBhbGwgYW5pbWF0aW9ucyBhcyBhcnJheSBvZiBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlciN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBhbmltYXRpb24gdG8gZ2V0IHRoZSBKU09OQW5pbWF0aW9uIGRhdGEgZnJvbS4gSWYgbm90IHByb3ZpZGVkLCBhbGwgYW5pbWF0aW9ucyBhcmUgcmV0dXJuZWQgYXMgYW4gYXJyYXkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkFuaW1hdGlvbnMuSlNPTkFuaW1hdGlvbnN9IFRoZSByZXN1bHRpbmcgSlNPTkFuaW1hdGlvbnMgZm9ybWF0dGVkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXRwdXQgPSB7XHJcbiAgICAgICAgICAgIGFuaW1zOiBbXSxcclxuICAgICAgICAgICAgZ2xvYmFsVGltZVNjYWxlOiB0aGlzLmdsb2JhbFRpbWVTY2FsZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09ICcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0cHV0LmFuaW1zLnB1c2godGhpcy5hbmltcy5nZXQoa2V5KS50b0pTT04oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5pbXMuZWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uS2V5LCBhbmltYXRpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5hbmltcy5wdXNoKGFuaW1hdGlvbi50b0pTT04oKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoaXMgQW5pbWF0aW9uIE1hbmFnZXIgYW5kIGNsZWFuIHVwIGFuaW1hdGlvbiBkZWZpbml0aW9ucyBhbmQgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLlxyXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYXMgYSByZXNwb25zZSB0byBhIGBkZXN0cm95YCBldmVudCBmcm9tIHRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmltcy5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBbmltYXRpb25NYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQWRkIEFuaW1hdGlvbiBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGEgbmV3IGFuaW1hdGlvbiBpcyBhZGRlZCB0byB0aGUgZ2xvYmFsIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gKiBcclxuICogVGhpcyBjYW4gaGFwcGVuIGVpdGhlciBhcyBhIHJlc3VsdCBvZiBhbiBhbmltYXRpb24gaW5zdGFuY2UgYmVpbmcgYWRkZWQgdG8gdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLFxyXG4gKiBvciB0aGUgQW5pbWF0aW9uIE1hbmFnZXIgY3JlYXRpbmcgYSBuZXcgYW5pbWF0aW9uIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkFuaW1hdGlvbnMuRXZlbnRzI0FERF9BTklNQVRJT05cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgQW5pbWF0aW9uIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBnbG9iYWwgQW5pbWF0aW9uIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBhbmltYXRpb24gLSBBbiBpbnN0YW5jZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBBbmltYXRpb24uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhZGQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQW5pbWF0aW9uIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIEFuaW1hdGlvbiBpbnN0YW5jZSB3aGVuIGl0IGNvbXBsZXRlcywgaS5lLiBmaW5pc2hlcyBwbGF5aW5nIG9yIGlzIG1hbnVhbGx5IHN0b3BwZWQuXHJcbiAqIFxyXG4gKiBCZSBjYXJlZnVsIHdpdGggdGhlIHZvbHVtZSBvZiBldmVudHMgdGhpcyBjb3VsZCBnZW5lcmF0ZS4gSWYgYSBncm91cCBvZiBTcHJpdGVzIGFsbCBjb21wbGV0ZSB0aGUgc2FtZVxyXG4gKiBhbmltYXRpb24gYXQgdGhlIHNhbWUgdGltZSwgdGhpcyBldmVudCB3aWxsIGludm9rZSBpdHMgaGFuZGxlciBmb3IgZWFjaCBvbmUgb2YgdGhlbS5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNBTklNQVRJT05fQ09NUExFVEVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCBjb21wbGV0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgQW5pbWF0aW9uIEZyYW1lIHRoYXQgdGhlIEFuaW1hdGlvbiBjb21wbGV0ZWQgb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NvbXBsZXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEFuaW1hdGlvbiBSZXBlYXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIGN1cnJlbnRseSBwbGF5aW5nIGFuaW1hdGlvbiByZXBlYXRzLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGlzIGRpc3BhdGNoZWQgZGlyZWN0bHkgZnJvbSB0aGUgQW5pbWF0aW9uIG9iamVjdCBpdHNlbGYuIFdoaWNoIG1lYW5zIHRoYXQgbGlzdGVuZXJzXHJcbiAqIGJvdW5kIHRvIHRoaXMgZXZlbnQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IHRpbWUgdGhlIEFuaW1hdGlvbiByZXBlYXRzLCBmb3IgZXZlcnkgR2FtZSBPYmplY3QgdGhhdCBtYXkgaGF2ZSBpdC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNBTklNQVRJT05fUkVQRUFUXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBhbmltYXRpb24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uIHRoYXQgcmVwZWF0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgQW5pbWF0aW9uIEZyYW1lIHRoYXQgdGhlIEFuaW1hdGlvbiB3YXMgb24gd2hlbiBpdCByZXBlYXRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlcGVhdCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBBbmltYXRpb24gUmVzdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBBbmltYXRpb24gaW5zdGFuY2Ugd2hlbiBpdCByZXN0YXJ0cy5cclxuICogXHJcbiAqIEJlIGNhcmVmdWwgd2l0aCB0aGUgdm9sdW1lIG9mIGV2ZW50cyB0aGlzIGNvdWxkIGdlbmVyYXRlLiBJZiBhIGdyb3VwIG9mIFNwcml0ZXMgYWxsIHJlc3RhcnQgdGhlIHNhbWVcclxuICogYW5pbWF0aW9uIGF0IHRoZSBzYW1lIHRpbWUsIHRoaXMgZXZlbnQgd2lsbCBpbnZva2UgaXRzIGhhbmRsZXIgZm9yIGVhY2ggb25lIG9mIHRoZW0uXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjQU5JTUFUSU9OX1JFU1RBUlRcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCByZXN0YXJ0ZWQgcGxheWluZy5cclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBBbmltYXRpb24gRnJhbWUgdGhhdCB0aGUgQW5pbWF0aW9uIHJlc3RhcnRlZCB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiByZXN0YXJ0ZWQgcGxheWluZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Jlc3RhcnQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQW5pbWF0aW9uIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIEFuaW1hdGlvbiBpbnN0YW5jZSB3aGVuIGl0IHN0YXJ0cyBwbGF5aW5nLlxyXG4gKiBcclxuICogQmUgY2FyZWZ1bCB3aXRoIHRoZSB2b2x1bWUgb2YgZXZlbnRzIHRoaXMgY291bGQgZ2VuZXJhdGUuIElmIGEgZ3JvdXAgb2YgU3ByaXRlcyBhbGwgcGxheSB0aGUgc2FtZVxyXG4gKiBhbmltYXRpb24gYXQgdGhlIHNhbWUgdGltZSwgdGhpcyBldmVudCB3aWxsIGludm9rZSBpdHMgaGFuZGxlciBmb3IgZWFjaCBvbmUgb2YgdGhlbS5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNBTklNQVRJT05fU1RBUlRcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCBzdGFydGVkIHBsYXlpbmcuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgQW5pbWF0aW9uIEZyYW1lIHRoYXQgdGhlIEFuaW1hdGlvbiBzdGFydGVkIHdpdGguXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQgcGxheWluZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3N0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFBhdXNlIEFsbCBBbmltYXRpb25zIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlciBpcyB0b2xkIHRvIHBhdXNlLlxyXG4gKiBcclxuICogV2hlbiB0aGlzIGhhcHBlbnMgYWxsIGN1cnJlbnQgYW5pbWF0aW9ucyB3aWxsIHN0b3AgdXBkYXRpbmcsIGFsdGhvdWdoIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhblxyXG4gKiB0aGF0IHRoZSBnYW1lIGhhcyBwYXVzZWQgYXMgd2VsbC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNQQVVTRV9BTExcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwYXVzZWFsbCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBSZW1vdmUgQW5pbWF0aW9uIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYW4gYW5pbWF0aW9uIGlzIHJlbW92ZWQgZnJvbSB0aGUgZ2xvYmFsIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkFuaW1hdGlvbnMuRXZlbnRzI1JFTU9WRV9BTklNQVRJT05cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgQW5pbWF0aW9uIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgZ2xvYmFsIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbn0gYW5pbWF0aW9uIC0gQW4gaW5zdGFuY2Ugb2YgdGhlIHJlbW92ZWQgQW5pbWF0aW9uLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncmVtb3ZlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFJlc3VtZSBBbGwgQW5pbWF0aW9ucyBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBnbG9iYWwgQW5pbWF0aW9uIE1hbmFnZXIgcmVzdW1lcywgaGF2aW5nIGJlZW4gcHJldmlvdXNseSBwYXVzZWQuXHJcbiAqIFxyXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhbGwgY3VycmVudCBhbmltYXRpb25zIHdpbGwgY29udGludWUgdXBkYXRpbmcgYWdhaW4uXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjUkVTVU1FX0FMTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Jlc3VtZWFsbCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTcHJpdGUgQW5pbWF0aW9uIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYW4gYW5pbWF0aW9uIGZpbmlzaGVzIHBsYXlpbmcgb24gaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIHRoZSBTcHJpdGUgdXNpbmcgYHNwcml0ZS5vbignYW5pbWF0aW9uY29tcGxldGUnLCBsaXN0ZW5lcilgXHJcbiAqIFxyXG4gKiBUaGlzIHNhbWUgZXZlbnQgaXMgZGlzcGF0Y2hlZCBmb3IgYWxsIGFuaW1hdGlvbnMuIFRvIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBhbmltYXRpb24sIHVzZSB0aGUgYFNQUklURV9BTklNQVRJT05fS0VZX0NPTVBMRVRFYCBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBhbmltYXRpb24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uIHRoYXQgY29tcGxldGVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBGcmFtZSB0aGF0IHRoZSBBbmltYXRpb24gY29tcGxldGVkIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiBjb21wbGV0ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhbmltYXRpb25jb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTcHJpdGUgQW5pbWF0aW9uIEtleSBDb21wbGV0ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNwcml0ZSB3aGVuIGEgc3BlY2lmaWMgYW5pbWF0aW9uIGZpbmlzaGVzIHBsYXlpbmcgb24gaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIHRoZSBTcHJpdGUgdXNpbmcgYHNwcml0ZS5vbignYW5pbWF0aW9uY29tcGxldGUta2V5JywgbGlzdGVuZXIpYCB3aGVyZSBga2V5YCBpcyB0aGUga2V5IG9mXHJcbiAqIHRoZSBhbmltYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGFuIGFuaW1hdGlvbiB3aXRoIHRoZSBrZXkgJ2V4cGxvZGUnIHlvdSBzaG91bGQgbGlzdGVuIGZvciBgYW5pbWF0aW9uY29tcGxldGUtZXhwbG9kZWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9LRVlfQ09NUExFVEVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCBjb21wbGV0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgQW5pbWF0aW9uIEZyYW1lIHRoYXQgdGhlIEFuaW1hdGlvbiBjb21wbGV0ZWQgb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIGNvbXBsZXRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FuaW1hdGlvbmNvbXBsZXRlLSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTcHJpdGUgQW5pbWF0aW9uIEtleSBSZXBlYXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBTcHJpdGUgd2hlbiBhIHNwZWNpZmljIGFuaW1hdGlvbiByZXBlYXRzIHBsYXlpbmcgb24gaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIHRoZSBTcHJpdGUgdXNpbmcgYHNwcml0ZS5vbignYW5pbWF0aW9ucmVwZWF0LWtleScsIGxpc3RlbmVyKWAgd2hlcmUgYGtleWAgaXMgdGhlIGtleSBvZlxyXG4gKiB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhbiBhbmltYXRpb24gd2l0aCB0aGUga2V5ICdleHBsb2RlJyB5b3Ugc2hvdWxkIGxpc3RlbiBmb3IgYGFuaW1hdGlvbnJlcGVhdC1leHBsb2RlYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX0tFWV9SRVBFQVRcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCBpcyByZXBlYXRpbmcgb24gdGhlIFNwcml0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBBbmltYXRpb24gRnJhbWUgdGhhdCB0aGUgQW5pbWF0aW9uIHN0YXJ0ZWQgd2l0aC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSByZXBlYXRDb3VudCAtIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEFuaW1hdGlvbiBoYXMgcmVwZWF0ZWQgc28gZmFyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiByZXBlYXRlZCBwbGF5aW5nLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnYW5pbWF0aW9ucmVwZWF0LSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTcHJpdGUgQW5pbWF0aW9uIEtleSBSZXN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYSBzcGVjaWZpYyBhbmltYXRpb24gcmVzdGFydHMgcGxheWluZyBvbiBpdC5cclxuICogXHJcbiAqIExpc3RlbiBmb3IgaXQgb24gdGhlIFNwcml0ZSB1c2luZyBgc3ByaXRlLm9uKCdhbmltYXRpb25yZXN0YXJ0LWtleScsIGxpc3RlbmVyKWAgd2hlcmUgYGtleWAgaXMgdGhlIGtleSBvZlxyXG4gKiB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhbiBhbmltYXRpb24gd2l0aCB0aGUga2V5ICdleHBsb2RlJyB5b3Ugc2hvdWxkIGxpc3RlbiBmb3IgYGFuaW1hdGlvbnJlc3RhcnQtZXhwbG9kZWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVTVEFSVFxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbn0gYW5pbWF0aW9uIC0gQSByZWZlcmVuY2UgdG8gdGhlIEFuaW1hdGlvbiB0aGF0IHdhcyByZXN0YXJ0ZWQgb24gdGhlIFNwcml0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBBbmltYXRpb24gRnJhbWUgdGhhdCB0aGUgQW5pbWF0aW9uIHJlc3RhcnRlZCB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiByZXN0YXJ0ZWQgcGxheWluZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FuaW1hdGlvbnJlc3RhcnQtJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNwcml0ZSBBbmltYXRpb24gS2V5IFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYSBzcGVjaWZpYyBhbmltYXRpb24gc3RhcnRzIHBsYXlpbmcgb24gaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIHRoZSBTcHJpdGUgdXNpbmcgYHNwcml0ZS5vbignYW5pbWF0aW9uc3RhcnQta2V5JywgbGlzdGVuZXIpYCB3aGVyZSBga2V5YCBpcyB0aGUga2V5IG9mXHJcbiAqIHRoZSBhbmltYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGFuIGFuaW1hdGlvbiB3aXRoIHRoZSBrZXkgJ2V4cGxvZGUnIHlvdSBzaG91bGQgbGlzdGVuIGZvciBgYW5pbWF0aW9uc3RhcnQtZXhwbG9kZWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9LRVlfU1RBUlRcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCB3YXMgc3RhcnRlZCBvbiB0aGUgU3ByaXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBGcmFtZSB0aGF0IHRoZSBBbmltYXRpb24gc3RhcnRlZCB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiBzdGFydGVkIHBsYXlpbmcuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhbmltYXRpb25zdGFydC0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU3ByaXRlIEFuaW1hdGlvbiBLZXkgVXBkYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYSBzcGVjaWZpYyBhbmltYXRpb24gcGxheWluZyBvbiBpdCB1cGRhdGVzLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYW5pbWF0aW9uIGNoYW5nZXMgZnJhbWUsXHJcbiAqIGJhc2VkIG9uIHRoZSBhbmltYXRpb24gZnJhbWUgcmF0ZSBhbmQgb3RoZXIgZmFjdG9ycyBsaWtlIGB0aW1lU2NhbGVgIGFuZCBgZGVsYXlgLlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBvbiB0aGUgU3ByaXRlIHVzaW5nIGBzcHJpdGUub24oJ2FuaW1hdGlvbnVwZGF0ZS1rZXknLCBsaXN0ZW5lcilgIHdoZXJlIGBrZXlgIGlzIHRoZSBrZXkgb2ZcclxuICogdGhlIGFuaW1hdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQgYW4gYW5pbWF0aW9uIHdpdGggdGhlIGtleSAnZXhwbG9kZScgeW91IHNob3VsZCBsaXN0ZW4gZm9yIGBhbmltYXRpb251cGRhdGUtZXhwbG9kZWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9LRVlfVVBEQVRFXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBhbmltYXRpb24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uIHRoYXQgaGFzIHVwZGF0ZWQgb24gdGhlIFNwcml0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBBbmltYXRpb24gRnJhbWUgb2YgdGhlIEFuaW1hdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlfSBnYW1lT2JqZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIEdhbWUgT2JqZWN0IG9uIHdoaWNoIHRoZSBhbmltYXRpb24gdXBkYXRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FuaW1hdGlvbnVwZGF0ZS0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU3ByaXRlIEFuaW1hdGlvbiBSZXBlYXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBTcHJpdGUgd2hlbiBhbiBhbmltYXRpb24gcmVwZWF0cyBwbGF5aW5nIG9uIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBvbiB0aGUgU3ByaXRlIHVzaW5nIGBzcHJpdGUub24oJ2FuaW1hdGlvbnJlcGVhdCcsIGxpc3RlbmVyKWBcclxuICogXHJcbiAqIFRoaXMgc2FtZSBldmVudCBpcyBkaXNwYXRjaGVkIGZvciBhbGwgYW5pbWF0aW9ucy4gVG8gbGlzdGVuIGZvciBhIHNwZWNpZmljIGFuaW1hdGlvbiwgdXNlIHRoZSBgU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVQRUFUYCBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX1JFUEVBVFxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbn0gYW5pbWF0aW9uIC0gQSByZWZlcmVuY2UgdG8gdGhlIEFuaW1hdGlvbiB0aGF0IGlzIHJlcGVhdGluZyBvbiB0aGUgU3ByaXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBGcmFtZSB0aGF0IHRoZSBBbmltYXRpb24gc3RhcnRlZCB3aXRoLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHJlcGVhdENvdW50IC0gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgQW5pbWF0aW9uIGhhcyByZXBlYXRlZCBzbyBmYXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIHJlcGVhdGVkIHBsYXlpbmcuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhbmltYXRpb25yZXBlYXQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU3ByaXRlIEFuaW1hdGlvbiBSZXN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYW4gYW5pbWF0aW9uIHJlc3RhcnRzIHBsYXlpbmcgb24gaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIHRoZSBTcHJpdGUgdXNpbmcgYHNwcml0ZS5vbignYW5pbWF0aW9ucmVzdGFydCcsIGxpc3RlbmVyKWBcclxuICogXHJcbiAqIFRoaXMgc2FtZSBldmVudCBpcyBkaXNwYXRjaGVkIGZvciBhbGwgYW5pbWF0aW9ucy4gVG8gbGlzdGVuIGZvciBhIHNwZWNpZmljIGFuaW1hdGlvbiwgdXNlIHRoZSBgU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVTVEFSVGAgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9SRVNUQVJUXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9ufSBhbmltYXRpb24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQW5pbWF0aW9uIHRoYXQgd2FzIHJlc3RhcnRlZCBvbiB0aGUgU3ByaXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBGcmFtZSB0aGF0IHRoZSBBbmltYXRpb24gcmVzdGFydGVkIHdpdGguXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIHJlc3RhcnRlZCBwbGF5aW5nLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnYW5pbWF0aW9ucmVzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTcHJpdGUgQW5pbWF0aW9uIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYW4gYW5pbWF0aW9uIHN0YXJ0cyBwbGF5aW5nIG9uIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBvbiB0aGUgU3ByaXRlIHVzaW5nIGBzcHJpdGUub24oJ2FuaW1hdGlvbnN0YXJ0JywgbGlzdGVuZXIpYFxyXG4gKiBcclxuICogVGhpcyBzYW1lIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGFsbCBhbmltYXRpb25zLiBUbyBsaXN0ZW4gZm9yIGEgc3BlY2lmaWMgYW5pbWF0aW9uLCB1c2UgdGhlIGBTUFJJVEVfQU5JTUFUSU9OX0tFWV9TVEFSVGAgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9TVEFSVFxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbn0gYW5pbWF0aW9uIC0gQSByZWZlcmVuY2UgdG8gdGhlIEFuaW1hdGlvbiB0aGF0IHdhcyBzdGFydGVkIG9uIHRoZSBTcHJpdGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgQW5pbWF0aW9uIEZyYW1lIHRoYXQgdGhlIEFuaW1hdGlvbiBzdGFydGVkIHdpdGguXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gZ2FtZU9iamVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQgcGxheWluZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FuaW1hdGlvbnN0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNwcml0ZSBBbmltYXRpb24gVXBkYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU3ByaXRlIHdoZW4gYW4gYW5pbWF0aW9uIHBsYXlpbmcgb24gaXQgdXBkYXRlcy4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGFuaW1hdGlvbiBjaGFuZ2VzIGZyYW1lLFxyXG4gKiBiYXNlZCBvbiB0aGUgYW5pbWF0aW9uIGZyYW1lIHJhdGUgYW5kIG90aGVyIGZhY3RvcnMgbGlrZSBgdGltZVNjYWxlYCBhbmQgYGRlbGF5YC5cclxuICogXHJcbiAqIExpc3RlbiBmb3IgaXQgb24gdGhlIFNwcml0ZSB1c2luZyBgc3ByaXRlLm9uKCdhbmltYXRpb251cGRhdGUnLCBsaXN0ZW5lcilgXHJcbiAqIFxyXG4gKiBUaGlzIHNhbWUgZXZlbnQgaXMgZGlzcGF0Y2hlZCBmb3IgYWxsIGFuaW1hdGlvbnMuIFRvIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBhbmltYXRpb24sIHVzZSB0aGUgYFNQUklURV9BTklNQVRJT05fS0VZX1VQREFURWAgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9VUERBVEVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IGFuaW1hdGlvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBBbmltYXRpb24gdGhhdCBoYXMgdXBkYXRlZCBvbiB0aGUgU3ByaXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBGcmFtZSBvZiB0aGUgQW5pbWF0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IGdhbWVPYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBPYmplY3Qgb24gd2hpY2ggdGhlIGFuaW1hdGlvbiB1cGRhdGVkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnYW5pbWF0aW9udXBkYXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBRERfQU5JTUFUSU9OOiByZXF1aXJlKCcuL0FERF9BTklNQVRJT05fRVZFTlQnKSxcclxuICAgIEFOSU1BVElPTl9DT01QTEVURTogcmVxdWlyZSgnLi9BTklNQVRJT05fQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIEFOSU1BVElPTl9SRVBFQVQ6IHJlcXVpcmUoJy4vQU5JTUFUSU9OX1JFUEVBVF9FVkVOVCcpLFxyXG4gICAgQU5JTUFUSU9OX1JFU1RBUlQ6IHJlcXVpcmUoJy4vQU5JTUFUSU9OX1JFU1RBUlRfRVZFTlQnKSxcclxuICAgIEFOSU1BVElPTl9TVEFSVDogcmVxdWlyZSgnLi9BTklNQVRJT05fU1RBUlRfRVZFTlQnKSxcclxuICAgIFBBVVNFX0FMTDogcmVxdWlyZSgnLi9QQVVTRV9BTExfRVZFTlQnKSxcclxuICAgIFJFTU9WRV9BTklNQVRJT046IHJlcXVpcmUoJy4vUkVNT1ZFX0FOSU1BVElPTl9FVkVOVCcpLFxyXG4gICAgUkVTVU1FX0FMTDogcmVxdWlyZSgnLi9SRVNVTUVfQUxMX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX0NPTVBMRVRFOiByZXF1aXJlKCcuL1NQUklURV9BTklNQVRJT05fQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIFNQUklURV9BTklNQVRJT05fS0VZX0NPTVBMRVRFOiByZXF1aXJlKCcuL1NQUklURV9BTklNQVRJT05fS0VZX0NPTVBMRVRFX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX0tFWV9SRVBFQVQ6IHJlcXVpcmUoJy4vU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVQRUFUX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX0tFWV9SRVNUQVJUOiByZXF1aXJlKCcuL1NQUklURV9BTklNQVRJT05fS0VZX1JFU1RBUlRfRVZFTlQnKSxcclxuICAgIFNQUklURV9BTklNQVRJT05fS0VZX1NUQVJUOiByZXF1aXJlKCcuL1NQUklURV9BTklNQVRJT05fS0VZX1NUQVJUX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX0tFWV9VUERBVEU6IHJlcXVpcmUoJy4vU1BSSVRFX0FOSU1BVElPTl9LRVlfVVBEQVRFX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX1JFUEVBVDogcmVxdWlyZSgnLi9TUFJJVEVfQU5JTUFUSU9OX1JFUEVBVF9FVkVOVCcpLFxyXG4gICAgU1BSSVRFX0FOSU1BVElPTl9SRVNUQVJUOiByZXF1aXJlKCcuL1NQUklURV9BTklNQVRJT05fUkVTVEFSVF9FVkVOVCcpLFxyXG4gICAgU1BSSVRFX0FOSU1BVElPTl9TVEFSVDogcmVxdWlyZSgnLi9TUFJJVEVfQU5JTUFUSU9OX1NUQVJUX0VWRU5UJyksXHJcbiAgICBTUFJJVEVfQU5JTUFUSU9OX1VQREFURTogcmVxdWlyZSgnLi9TUFJJVEVfQU5JTUFUSU9OX1VQREFURV9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5BbmltYXRpb25zXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQW5pbWF0aW9uOiByZXF1aXJlKCcuL0FuaW1hdGlvbicpLFxyXG4gICAgQW5pbWF0aW9uRnJhbWU6IHJlcXVpcmUoJy4vQW5pbWF0aW9uRnJhbWUnKSxcclxuICAgIEFuaW1hdGlvbk1hbmFnZXI6IHJlcXVpcmUoJy4vQW5pbWF0aW9uTWFuYWdlcicpLFxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDdXN0b21NYXAgPSByZXF1aXJlKCcuLi9zdHJ1Y3RzL01hcCcpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBCYXNlQ2FjaGUgaXMgYSBiYXNlIENhY2hlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHN0b3JpbmcgcmVmZXJlbmNlcyB0byBhbnkga2luZCBvZiBkYXRhLlxyXG4gKlxyXG4gKiBEYXRhIGNhbiBiZSBhZGRlZCwgcmV0cmlldmVkIGFuZCByZW1vdmVkIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXlzLlxyXG4gKlxyXG4gKiBLZXlzIGFyZSBzdHJpbmctYmFzZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBCYXNlQ2FjaGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5DYWNoZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQmFzZUNhY2hlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEJhc2VDYWNoZSAoKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBNYXAgaW4gd2hpY2ggdGhlIGNhY2hlIG9iamVjdHMgYXJlIHN0b3JlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gcXVlcnkgdGhlIE1hcCBkaXJlY3RseSBvciB1c2UgdGhlIEJhc2VDYWNoZSBtZXRob2RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkJhc2VDYWNoZSNlbnRyaWVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLk1hcC48U3RyaW5nLCAqPn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgQ3VzdG9tTWFwKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIEV2ZW50RW1pdHRlciB1c2VkIGJ5IHRoZSBjYWNoZSB0byBlbWl0IHJlbGF0ZWQgZXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkJhc2VDYWNoZSNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBpdGVtIHRvIHRoaXMgY2FjaGUuIFRoZSBpdGVtIGlzIHJlZmVyZW5jZWQgYnkgYSB1bmlxdWUgc3RyaW5nLCB3aGljaCB5b3UgYXJlIHJlc3BvbnNpYmxlXHJcbiAgICAgKiBmb3Igc2V0dGluZyBhbmQga2VlcGluZyB0cmFjayBvZi4gVGhlIGl0ZW0gY2FuIG9ubHkgYmUgcmV0cmlldmVkIGJ5IHVzaW5nIHRoaXMgc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhY2hlLkJhc2VDYWNoZSNhZGRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FjaGUuRXZlbnRzI0FERFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IGJ5IHdoaWNoIHRoZSBkYXRhIGFkZGVkIHRvIHRoZSBjYWNoZSB3aWxsIGJlIHJlZmVyZW5jZWQuXHJcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgLSBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQmFzZUNhY2hlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYWRkOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBkYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuQURELCB0aGlzLCBrZXksIGRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjYWNoZSBjb250YWlucyBhbiBpdGVtIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKiBUaGlzIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbiBhcyBgQmFzZUNhY2hlLmV4aXN0c2AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlI2hhc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBpdGVtIHRvIGJlIGNoZWNrZWQgaW4gdGhpcyBjYWNoZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY2FjaGUgY29udGFpbnMgYW4gaXRlbSBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaGFzOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgY2FjaGUgY29udGFpbnMgYW4gaXRlbSBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgYEJhc2VDYWNoZS5oYXNgIGFuZCBpcyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIExvYWRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYWNoZS5CYXNlQ2FjaGUjZXhpc3RzXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGl0ZW0gdG8gYmUgY2hlY2tlZCBpbiB0aGlzIGNhY2hlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBjb250YWlucyBhbiBpdGVtIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXksIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBleGlzdHM6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuIGl0ZW0gZnJvbSB0aGlzIGNhY2hlIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlI2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBpdGVtIHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoaXMgY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGl0ZW0gaW4gdGhlIGNhY2hlLCBvciBgbnVsbGAgaWYgbm8gaXRlbSBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbmQgaXRlbSBmcm9tIHRoaXMgY2FjaGUgYmFzZWQgb24gdGhlIGdpdmVuIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhbiBlbnRyeSBtYXRjaGluZyB0aGUga2V5IGlzIGZvdW5kIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgYW5kIGEgYHJlbW92ZWAgZXZlbnQgZW1pdHRlZC5cclxuICAgICAqIE5vIGFkZGl0aW9uYWwgY2hlY2tzIGFyZSBkb25lIG9uIHRoZSBpdGVtIHJlbW92ZWQuIElmIG90aGVyIHN5c3RlbXMgb3IgcGFydHMgb2YgeW91ciBnYW1lIGNvZGVcclxuICAgICAqIGFyZSByZWx5aW5nIG9uIHRoaXMgaXRlbSwgaXQgaXMgdXAgdG8geW91IHRvIHNldmVyIHRob3NlIHJlbGF0aW9uc2hpcHMgcHJpb3IgdG8gcmVtb3ZpbmcgdGhlIGl0ZW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlI3JlbW92ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYWNoZS5FdmVudHMjUkVNT1ZFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlIGZyb20gdGhlIGNhY2hlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQmFzZUNhY2hlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChlbnRyeSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlJFTU9WRSwgdGhpcywga2V5LCBlbnRyeS5kYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYWxsIGtleXMgaW4gdXNlIGluIHRoaXMgY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlI2dldEtleXNcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGtleXMuXHJcbiAgICAgKi9cclxuICAgIGdldEtleXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5rZXlzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBjYWNoZSBhbmQgYWxsIGl0ZW1zIHdpdGhpbiBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYWNoZS5CYXNlQ2FjaGUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW50cmllcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VDYWNoZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZUNhY2hlID0gcmVxdWlyZSgnLi9CYXNlQ2FjaGUnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIENhY2hlIE1hbmFnZXIgaXMgdGhlIGdsb2JhbCBjYWNoZSBvd25lZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgR2FtZSBpbnN0YW5jZS5cclxuICpcclxuICogVmFyaW91cyBzeXN0ZW1zLCBzdWNoIGFzIHRoZSBmaWxlIExvYWRlciwgcmVseSBvbiB0aGlzIGNhY2hlIGluIG9yZGVyIHRvIHN0b3JlIHRoZSBmaWxlc1xyXG4gKiBpdCBoYXMgbG9hZGVkLiBUaGUgbWFuYWdlciBpdHNlbGYgZG9lc24ndCBzdG9yZSBhbnkgZmlsZXMsIGJ1dCBpbnN0ZWFkIG93bnMgbXVsdGlwbGUgQmFzZUNhY2hlXHJcbiAqIGluc3RhbmNlcywgb25lIHBlciB0eXBlIG9mIGZpbGUuIFlvdSBjYW4gYWxzbyBhZGQgeW91ciBvd24gY3VzdG9tIGNhY2hlcy5cclxuICpcclxuICogQGNsYXNzIENhY2hlTWFuYWdlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkNhY2hlXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyBDYWNoZU1hbmFnZXIuXHJcbiAqL1xyXG52YXIgQ2FjaGVNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENhY2hlTWFuYWdlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgUGhhc2VyLkdhbWUgaW5zdGFuY2UgdGhhdCBvd25zIHRoaXMgQ2FjaGVNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkNhY2hlTWFuYWdlciNnYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBnYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIENhY2hlIHN0b3JpbmcgYWxsIGJpbmFyeSBmaWxlcywgdHlwaWNhbGx5IGFkZGVkIHZpYSB0aGUgTG9hZGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkNhY2hlTWFuYWdlciNiaW5hcnlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkJhc2VDYWNoZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJpbmFyeSA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCBiaXRtYXAgZm9udCBkYXRhIGZpbGVzLCB0eXBpY2FsbHkgYWRkZWQgdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICogT25seSB0aGUgZm9udCBkYXRhIGlzIHN0b3JlZCBpbiB0aGlzIGNhY2hlLCB0aGUgdGV4dHVyZXMgYXJlIHBhcnQgb2YgdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXIjYml0bWFwRm9udFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYml0bWFwRm9udCA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCBKU09OIGRhdGEgZmlsZXMsIHR5cGljYWxseSBhZGRlZCB2aWEgdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXIjanNvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuanNvbiA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCBwaHlzaWNzIGRhdGEgZmlsZXMsIHR5cGljYWxseSBhZGRlZCB2aWEgdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXIjcGh5c2ljc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGh5c2ljcyA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCBzaGFkZXIgc291cmNlIGZpbGVzLCB0eXBpY2FsbHkgYWRkZWQgdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI3NoYWRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hhZGVyID0gbmV3IEJhc2VDYWNoZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIENhY2hlIHN0b3JpbmcgYWxsIG5vbi1zdHJlYW1pbmcgYXVkaW8gZmlsZXMsIHR5cGljYWxseSBhZGRlZCB2aWEgdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXIjYXVkaW9cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkJhc2VDYWNoZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1ZGlvID0gbmV3IEJhc2VDYWNoZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIENhY2hlIHN0b3JpbmcgYWxsIG5vbi1zdHJlYW1pbmcgdmlkZW8gZmlsZXMsIHR5cGljYWxseSBhZGRlZCB2aWEgdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXIjdmlkZW9cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkJhc2VDYWNoZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWRlbyA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCB0ZXh0IGZpbGVzLCB0eXBpY2FsbHkgYWRkZWQgdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI3RleHRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkJhc2VDYWNoZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHQgPSBuZXcgQmFzZUNhY2hlKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgQ2FjaGUgc3RvcmluZyBhbGwgaHRtbCBmaWxlcywgdHlwaWNhbGx5IGFkZGVkIHZpYSB0aGUgTG9hZGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkNhY2hlTWFuYWdlciNodG1sXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYWNoZS5CYXNlQ2FjaGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaHRtbCA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBDYWNoZSBzdG9yaW5nIGFsbCBXYXZlRnJvbnQgT0JKIGZpbGVzLCB0eXBpY2FsbHkgYWRkZWQgdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI29ialxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2JqID0gbmV3IEJhc2VDYWNoZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIENhY2hlIHN0b3JpbmcgYWxsIHRpbGVtYXAgZGF0YSBmaWxlcywgdHlwaWNhbGx5IGFkZGVkIHZpYSB0aGUgTG9hZGVyLlxyXG4gICAgICAgICAqIE9ubHkgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoaXMgY2FjaGUsIHRoZSB0ZXh0dXJlcyBhcmUgcGFydCBvZiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhY2hlLkNhY2hlTWFuYWdlciN0aWxlbWFwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYWNoZS5CYXNlQ2FjaGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlbWFwID0gbmV3IEJhc2VDYWNoZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIENhY2hlIHN0b3JpbmcgYWxsIHhtbCBkYXRhIGZpbGVzLCB0eXBpY2FsbHkgYWRkZWQgdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI3htbFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueG1sID0gbmV3IEJhc2VDYWNoZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyB5b3VyIG93biBjdXN0b20gQmFzZUNhY2hlIGVudHJpZXMuXHJcbiAgICAgICAgICogQWRkIHRvIHRoaXMgdmlhIHRoZSBgYWRkQ3VzdG9tYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI2N1c3RvbVxyXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3QuPFBoYXNlci5DYWNoZS5CYXNlQ2FjaGU+fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIHlvdXIgb3duIGN1c3RvbSBDYWNoZSBmb3Igc3RvcmluZyB5b3VyIG93biBmaWxlcy5cclxuICAgICAqIFRoZSBjYWNoZSB3aWxsIGJlIGF2YWlsYWJsZSB1bmRlciBgQ2FjaGUuY3VzdG9tLmtleWAuXHJcbiAgICAgKiBUaGUgY2FjaGUgd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgdGhlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI2FkZEN1c3RvbVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHlvdXIgY3VzdG9tIGNhY2hlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYWNoZS5CYXNlQ2FjaGV9IEEgcmVmZXJlbmNlIHRvIHRoZSBCYXNlQ2FjaGUgdGhhdCB3YXMgY3JlYXRlZC4gSWYgdGhlIGtleSB3YXMgYWxyZWFkeSBpbiB1c2UsIGEgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBjYWNoZSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBhZGRDdXN0b206IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXN0b21ba2V5XSA9IG5ldyBCYXNlQ2FjaGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVtrZXldO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSBhbGwgQmFzZUNhY2hlcyBhbmQgZGVzdHJveXMgYWxsIGN1c3RvbSBjYWNoZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBrZXlzID0gW1xyXG4gICAgICAgICAgICAnYmluYXJ5JyxcclxuICAgICAgICAgICAgJ2JpdG1hcEZvbnQnLFxyXG4gICAgICAgICAgICAnanNvbicsXHJcbiAgICAgICAgICAgICdwaHlzaWNzJyxcclxuICAgICAgICAgICAgJ3NoYWRlcicsXHJcbiAgICAgICAgICAgICdhdWRpbycsXHJcbiAgICAgICAgICAgICd2aWRlbycsXHJcbiAgICAgICAgICAgICd0ZXh0JyxcclxuICAgICAgICAgICAgJ2h0bWwnLFxyXG4gICAgICAgICAgICAnb2JqJyxcclxuICAgICAgICAgICAgJ3RpbGVtYXAnLFxyXG4gICAgICAgICAgICAneG1sJ1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXNba2V5c1tpXV0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzW2tleXNbaV1dID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmN1c3RvbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tW2tleV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXN0b20gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENhY2hlTWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENhY2hlIEFkZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbnkgQ2FjaGUgdGhhdCBleHRlbmRzIHRoZSBCYXNlQ2FjaGUgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBpcyBhZGRlZCB0byBpdC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYWNoZS5FdmVudHMjQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfSBjYWNoZSAtIFRoZSBjYWNoZSB0byB3aGljaCB0aGUgb2JqZWN0IHdhcyBhZGRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIG9iamVjdCBhZGRlZCB0byB0aGUgY2FjaGUuXHJcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgY2FjaGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhZGQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FjaGUgUmVtb3ZlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFueSBDYWNoZSB0aGF0IGV4dGVuZHMgdGhlIEJhc2VDYWNoZSBlYWNoIHRpbWUgYW4gb2JqZWN0IGlzIHJlbW92ZWQgZnJvbSBpdC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYWNoZS5FdmVudHMjUkVNT1ZFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfSBjYWNoZSAtIFRoZSBjYWNoZSBmcm9tIHdoaWNoIHRoZSBvYmplY3Qgd2FzIHJlbW92ZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBvYmplY3QgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS5cclxuICogQHBhcmFtIHsqfSBvYmplY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdyZW1vdmUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5DYWNoZS5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBREQ6IHJlcXVpcmUoJy4vQUREX0VWRU5UJyksXHJcbiAgICBSRU1PVkU6IHJlcXVpcmUoJy4vUkVNT1ZFX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNhY2hlXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQmFzZUNhY2hlOiByZXF1aXJlKCcuL0Jhc2VDYWNoZScpLFxyXG4gICAgQ2FjaGVNYW5hZ2VyOiByZXF1aXJlKCcuL0NhY2hlTWFuYWdlcicpLFxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cycpO1xyXG52YXIgRGVnVG9SYWQgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0RlZ1RvUmFkJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG52YXIgVmFsdWVUb0NvbG9yID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jb2xvci9WYWx1ZVRvQ29sb3InKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQmFzZSBDYW1lcmEgY2xhc3MuXHJcbiAqXHJcbiAqIFRoZSBDYW1lcmEgaXMgdGhlIHdheSBpbiB3aGljaCBhbGwgZ2FtZXMgYXJlIHJlbmRlcmVkIGluIFBoYXNlci4gVGhleSBwcm92aWRlIGEgdmlldyBpbnRvIHlvdXIgZ2FtZSB3b3JsZCxcclxuICogYW5kIGNhbiBiZSBwb3NpdGlvbmVkLCByb3RhdGVkLCB6b29tZWQgYW5kIHNjcm9sbGVkIGFjY29yZGluZ2x5LlxyXG4gKlxyXG4gKiBBIENhbWVyYSBjb25zaXN0cyBvZiB0d28gZWxlbWVudHM6IFRoZSB2aWV3cG9ydCBhbmQgdGhlIHNjcm9sbCB2YWx1ZXMuXHJcbiAqXHJcbiAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgcGh5c2ljYWwgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIENhbWVyYSB3aXRoaW4geW91ciBnYW1lLiBDYW1lcmFzLCBieSBkZWZhdWx0LCBhcmVcclxuICogY3JlYXRlZCB0aGUgc2FtZSBzaXplIGFzIHlvdXIgZ2FtZSwgYnV0IHRoZWlyIHBvc2l0aW9uIGFuZCBzaXplIGNhbiBiZSBzZXQgdG8gYW55dGhpbmcuIFRoaXMgbWVhbnMgaWYgeW91XHJcbiAqIHdhbnRlZCB0byBjcmVhdGUgYSBjYW1lcmEgdGhhdCB3YXMgMzIweDIwMCBpbiBzaXplLCBwb3NpdGlvbmVkIGluIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIHlvdXIgZ2FtZSxcclxuICogeW91J2QgYWRqdXN0IHRoZSB2aWV3cG9ydCB0byBkbyB0aGF0ICh1c2luZyBtZXRob2RzIGxpa2UgYHNldFZpZXdwb3J0YCBhbmQgYHNldFNpemVgKS5cclxuICpcclxuICogSWYgeW91IHdpc2ggdG8gY2hhbmdlIHdoZXJlIHRoZSBDYW1lcmEgaXMgbG9va2luZyBpbiB5b3VyIGdhbWUsIHRoZW4geW91IHNjcm9sbCBpdC4gWW91IGNhbiBkbyB0aGlzXHJcbiAqIHZpYSB0aGUgcHJvcGVydGllcyBgc2Nyb2xsWGAgYW5kIGBzY3JvbGxZYCBvciB0aGUgbWV0aG9kIGBzZXRTY3JvbGxgLiBTY3JvbGxpbmcgaGFzIG5vIGltcGFjdCBvbiB0aGVcclxuICogdmlld3BvcnQsIGFuZCBjaGFuZ2luZyB0aGUgdmlld3BvcnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgc2Nyb2xsaW5nLlxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IGEgQ2FtZXJhIHdpbGwgcmVuZGVyIGFsbCBHYW1lIE9iamVjdHMgaXQgY2FuIHNlZS4gWW91IGNhbiBjaGFuZ2UgdGhpcyB1c2luZyB0aGUgYGlnbm9yZWAgbWV0aG9kLFxyXG4gKiBhbGxvd2luZyB5b3UgdG8gZmlsdGVyIEdhbWUgT2JqZWN0cyBvdXQgb24gYSBwZXItQ2FtZXJhIGJhc2lzLlxyXG4gKiBcclxuICogVGhlIEJhc2UgQ2FtZXJhIGlzIGV4dGVuZGVkIGJ5IHRoZSBDYW1lcmEgY2xhc3MsIHdoaWNoIGFkZHMgaW4gc3BlY2lhbCBlZmZlY3RzIGluY2x1ZGluZyBGYWRlLFxyXG4gKiBGbGFzaCBhbmQgQ2FtZXJhIFNoYWtlLCBhcyB3ZWxsIGFzIHRoZSBhYmlsaXR5IHRvIGZvbGxvdyBHYW1lIE9iamVjdHMuXHJcbiAqIFxyXG4gKiBUaGUgQmFzZSBDYW1lcmEgd2FzIGludHJvZHVjZWQgaW4gUGhhc2VyIDMuMTIuIEl0IHdhcyBzcGxpdCBvZmYgZnJvbSB0aGUgQ2FtZXJhIGNsYXNzLCB0byBhbGxvd1xyXG4gKiB5b3UgdG8gaXNvbGF0ZSBzcGVjaWFsIGVmZmVjdHMgYXMgbmVlZGVkLiBUaGVyZWZvcmUgdGhlICdzaW5jZScgdmFsdWVzIGZvciBwcm9wZXJ0aWVzIG9mIHRoaXMgY2xhc3MgcmVsYXRlXHJcbiAqIHRvIHdoZW4gdGhleSB3ZXJlIGFkZGVkIHRvIHRoZSBDYW1lcmEgY2xhc3MuXHJcbiAqXHJcbiAqIEBjbGFzcyBCYXNlQ2FtZXJhXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJEXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4xMi4wXHJcbiAqIFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIENhbWVyYSwgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhLCByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgb2YgdGhlIGdhbWUgY2FudmFzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIENhbWVyYSwgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgQ2FtZXJhLCBpbiBwaXhlbHMuXHJcbiAqL1xyXG52YXIgQmFzZUNhbWVyYSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQmFzZUNhbWVyYSAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gMDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSAwOyB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhpcyBjYW1lcmEgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEdhbWUgU2NlbmUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzY2VuZU1hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmVNYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3NjYWxlTWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlTWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lJ3MgQ2FtZXJhIE1hbmFnZXIgdG8gd2hpY2ggdGhpcyBDYW1lcmEgYmVsb25ncy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNjYW1lcmFNYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmFNYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIElELiBBc3NpZ25lZCBieSB0aGUgQ2FtZXJhIE1hbmFnZXIgYW5kIHVzZWQgdG8gaGFuZGxlIGNhbWVyYSBleGNsdXNpb24uXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBhIGJpdG1hc2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjaWRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBDYW1lcmEuIFRoaXMgaXMgbGVmdCBlbXB0eSBmb3IgeW91ciBvd24gdXNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICcnXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gJyc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdW4tdXNlZCBpbiB2My4xNi5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgR2FtZSwgdXNlZCBpbiBtb3N0IENhbWVyYSBjYWxjdWxhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjcmVzb2x1dGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2hvdWxkIHRoaXMgY2FtZXJhIHJvdW5kIGl0cyBwaXhlbCB2YWx1ZXMgdG8gaW50ZWdlcnM/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjcm91bmRQaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm91bmRQaXhlbHMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBDYW1lcmEgdmlzaWJsZSBvciBub3Q/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBIHZpc2libGUgY2FtZXJhIHdpbGwgcmVuZGVyIGFuZCBwZXJmb3JtIGlucHV0IHRlc3RzLlxyXG4gICAgICAgICAqIEFuIGludmlzaWJsZSBjYW1lcmEgd2lsbCBub3QgcmVuZGVyIGFueXRoaW5nIGFuZCB3aWxsIHNraXAgaW5wdXQgdGVzdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjdmlzaWJsZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoaXMgQ2FtZXJhIHVzaW5nIGEgYm91bmRzIHRvIHJlc3RyaWN0IHNjcm9sbGluZyBtb3ZlbWVudD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNldCB0aGlzIHByb3BlcnR5IGFsb25nIHdpdGggdGhlIGJvdW5kcyB2aWEgYENhbWVyYS5zZXRCb3VuZHNgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3VzZUJvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51c2VCb3VuZHMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFdvcmxkIFZpZXcgaXMgYSBSZWN0YW5nbGUgdGhhdCBkZWZpbmVzIHRoZSBhcmVhIG9mIHRoZSAnd29ybGQnIHRoZSBDYW1lcmEgaXMgY3VycmVudGx5IGxvb2tpbmcgYXQuXHJcbiAgICAgICAgICogVGhpcyBmYWN0b3JzIGluIHRoZSBDYW1lcmEgdmlld3BvcnQgc2l6ZSwgem9vbSBhbmQgc2Nyb2xsIHBvc2l0aW9uIGFuZCBpcyB1cGRhdGVkIGluIHRoZSBDYW1lcmEgcHJlUmVuZGVyIHN0ZXAuXHJcbiAgICAgICAgICogSWYgeW91IGhhdmUgZW5hYmxlZCBDYW1lcmEgYm91bmRzIHRoZSB3b3JsZHZpZXcgd2lsbCBiZSBjbGFtcGVkIHRvIHRob3NlIGJvdW5kcyBhY2NvcmRpbmdseS5cclxuICAgICAgICAgKiBZb3UgY2FuIHVzZSBpdCBmb3IgY3VsbGluZyBvciBpbnRlcnNlY3Rpb24gY2hlY2tzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3dvcmxkVmlld1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud29ybGRWaWV3ID0gbmV3IFJlY3RhbmdsZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIENhbWVyYSBkaXJ0eT9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIGRpcnR5IENhbWVyYSBoYXMgaGFkIGVpdGhlciBpdHMgdmlld3BvcnQgc2l6ZSwgYm91bmRzLCBzY3JvbGwsIHJvdGF0aW9uIG9yIHpvb20gbGV2ZWxzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBmbGFnIGlzIGNsZWFyZWQgZHVyaW5nIHRoZSBgcG9zdFJlbmRlckNhbWVyYWAgbWV0aG9kIG9mIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNkaXJ0eVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQsIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgZ2FtZSBjYW52YXMuXHJcbiAgICAgICAgICogVGhlIHZpZXdwb3J0IGlzIHRoZSBhcmVhIGludG8gd2hpY2ggdGhlIGNhbWVyYSByZW5kZXJzLlxyXG4gICAgICAgICAqIFRvIGFkanVzdCB0aGUgcG9zaXRpb24gdGhlIGNhbWVyYSBpcyBsb29raW5nIGF0IGluIHRoZSBnYW1lIHdvcmxkLCBzZWUgdGhlIGBzY3JvbGxYYCB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSN4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3ggPSB4O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhLCByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgb2YgdGhlIGdhbWUgY2FudmFzLlxyXG4gICAgICAgICAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgYXJlYSBpbnRvIHdoaWNoIHRoZSBjYW1lcmEgcmVuZGVycy5cclxuICAgICAgICAgKiBUbyBhZGp1c3QgdGhlIHBvc2l0aW9uIHRoZSBjYW1lcmEgaXMgbG9va2luZyBhdCBpbiB0aGUgZ2FtZSB3b3JsZCwgc2VlIHRoZSBgc2Nyb2xsWWAgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjeVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl95ID0geTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgQ2FtZXJhIFggdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgcmVzb2x1dGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNfY3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2N4ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgQ2FtZXJhIFkgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgcmVzb2x1dGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNfY3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2N5ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgQ2FtZXJhIFdpZHRoIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIHJlc29sdXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjX2N3XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jdyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIENhbWVyYSBIZWlnaHQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgcmVzb2x1dGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNfY2hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2NoID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQsIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgYXJlYSBpbnRvIHdoaWNoIHRoZSBDYW1lcmEgcmVuZGVycy4gU2V0dGluZyB0aGUgdmlld3BvcnQgZG9lc1xyXG4gICAgICAgICAqIG5vdCByZXN0cmljdCB3aGVyZSB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjX3dpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBDYW1lcmEgdmlld3BvcnQsIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgYXJlYSBpbnRvIHdoaWNoIHRoZSBDYW1lcmEgcmVuZGVycy4gU2V0dGluZyB0aGUgdmlld3BvcnQgZG9lc1xyXG4gICAgICAgICAqIG5vdCByZXN0cmljdCB3aGVyZSB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjX2hlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYm91bmRzIHRoZSBjYW1lcmEgaXMgcmVzdHJhaW5lZCB0byBkdXJpbmcgc2Nyb2xsaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI19ib3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fYm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24gb2YgdGhpcyBDYW1lcmEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBDaGFuZ2UgdGhpcyB2YWx1ZSB0byBjYXVzZSB0aGUgQ2FtZXJhIHRvIHNjcm9sbCBhcm91bmQgeW91ciBTY2VuZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHNldHRpbmcgdGhlIENhbWVyYSB0byBmb2xsb3cgYSBHYW1lIE9iamVjdCwgdmlhIHRoZSBgc3RhcnRGb2xsb3dgIG1ldGhvZCxcclxuICAgICAgICAgKiB3aWxsIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBDYW1lcmEgc2Nyb2xsIHZhbHVlcyBhY2NvcmRpbmdseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gc2V0IHRoZSBib3VuZHMgd2l0aGluIHdoaWNoIHRoZSBDYW1lcmEgY2FuIHNjcm9sbCB2aWEgdGhlIGBzZXRCb3VuZHNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNfc2Nyb2xsWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3Njcm9sbFggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoaXMgQ2FtZXJhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQ2hhbmdlIHRoaXMgdmFsdWUgdG8gY2F1c2UgdGhlIENhbWVyYSB0byBzY3JvbGwgYXJvdW5kIHlvdXIgU2NlbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCBzZXR0aW5nIHRoZSBDYW1lcmEgdG8gZm9sbG93IGEgR2FtZSBPYmplY3QsIHZpYSB0aGUgYHN0YXJ0Rm9sbG93YCBtZXRob2QsXHJcbiAgICAgICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgQ2FtZXJhIHNjcm9sbCB2YWx1ZXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBZb3UgY2FuIHNldCB0aGUgYm91bmRzIHdpdGhpbiB3aGljaCB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdmlhIHRoZSBgc2V0Qm91bmRzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjX3Njcm9sbFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zY3JvbGxZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIENhbWVyYSB6b29tIHZhbHVlLiBDaGFuZ2UgdGhpcyB2YWx1ZSB0byB6b29tIGluLCBvciBvdXQgb2YsIGEgU2NlbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBIHZhbHVlIG9mIDAuNSB3b3VsZCB6b29tIHRoZSBDYW1lcmEgb3V0LCBzbyB5b3UgY2FuIG5vdyBzZWUgdHdpY2UgYXMgbXVjaFxyXG4gICAgICAgICAqIG9mIHRoZSBTY2VuZSBhcyBiZWZvcmUuIEEgdmFsdWUgb2YgMiB3b3VsZCB6b29tIHRoZSBDYW1lcmEgaW4sIHNvIGV2ZXJ5IHBpeGVsXHJcbiAgICAgICAgICogbm93IHRha2VzIHVwIDIgcGl4ZWxzIHdoZW4gcmVuZGVyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTZXQgdG8gMSB0byByZXR1cm4gdG8gdGhlIGRlZmF1bHQgem9vbSBsZXZlbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEJlIGNhcmVmdWwgdG8gbmV2ZXIgc2V0IHRoaXMgdmFsdWUgdG8gemVyby5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNfem9vbVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3pvb20gPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcm90YXRpb24gb2YgdGhlIENhbWVyYSBpbiByYWRpYW5zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQ2FtZXJhIHJvdGF0aW9uIGFsd2F5cyB0YWtlcyBwbGFjZSBiYXNlZCBvbiB0aGUgQ2FtZXJhIHZpZXdwb3J0LiBCeSBkZWZhdWx0LCByb3RhdGlvbiBoYXBwZW5zXHJcbiAgICAgICAgICogaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQuIFlvdSBjYW4gYWRqdXN0IHRoaXMgd2l0aCB0aGUgYG9yaWdpblhgIGFuZCBgb3JpZ2luWWAgcHJvcGVydGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFJvdGF0aW9uIGluZmx1ZW5jZXMgdGhlIHJlbmRlcmluZyBvZiBfYWxsXyBHYW1lIE9iamVjdHMgdmlzaWJsZSBieSB0aGlzIENhbWVyYS4gSG93ZXZlciwgaXQgZG9lcyBub3RcclxuICAgICAgICAgKiByb3RhdGUgdGhlIENhbWVyYSB2aWV3cG9ydCBpdHNlbGYsIHdoaWNoIGFsd2F5cyByZW1haW5zIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjX3JvdGF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcm90YXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxvY2FsIHRyYW5zZm9ybSBtYXRyaXggdXNlZCBmb3IgaW50ZXJuYWwgY2FsY3VsYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI21hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hdHJpeCA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG9lcyB0aGlzIENhbWVyYSBoYXZlIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSN0cmFuc3BhcmVudFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhpcyBDYW1lcmEuIE9ubHkgdXNlZCBpZiBgdHJhbnNwYXJlbnRgIGlzIGBmYWxzZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjYmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5EaXNwbGF5LkNvbG9yfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gVmFsdWVUb0NvbG9yKCdyZ2JhKDAsMCwwLDApJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgYWxwaGEgdmFsdWUuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpbXBhY3RzIGV2ZXJ5IHNpbmdsZSBvYmplY3QgdGhhdCB0aGlzIENhbWVyYVxyXG4gICAgICAgICAqIHJlbmRlcnMuIFlvdSBjYW4gZWl0aGVyIHNldCB0aGUgcHJvcGVydHkgZGlyZWN0bHksIGkuZS4gdmlhIGEgVHdlZW4sIHRvIGZhZGUgYSBDYW1lcmEgaW4gb3Igb3V0LFxyXG4gICAgICAgICAqIG9yIHZpYSB0aGUgY2hhaW5hYmxlIGBzZXRBbHBoYWAgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjYWxwaGFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNob3VsZCB0aGUgY2FtZXJhIGN1bGwgR2FtZSBPYmplY3RzIGJlZm9yZSBjaGVja2luZyB0aGVtIGZvciBpbnB1dCBoaXQgdGVzdHM/XHJcbiAgICAgICAgICogSW4gc29tZSBzcGVjaWFsIGNhc2VzIGl0IG1heSBiZSBiZW5lZmljaWFsIHRvIGRpc2FibGUgdGhpcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNkaXNhYmxlQ3VsbFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNhYmxlQ3VsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBhcnJheSBvZiBjdWxsZWQgb2JqZWN0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNjdWxsZWRPYmplY3RzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VsbGVkT2JqZWN0cyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWlkLXBvaW50IG9mIHRoZSBDYW1lcmEgaW4gJ3dvcmxkJyBjb29yZGluYXRlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSBpdCB0byBvYnRhaW4gZXhhY3RseSB3aGVyZSBpbiB0aGUgd29ybGQgdGhlIGNlbnRlciBvZiB0aGUgY2FtZXJhIGlzIGN1cnJlbnRseSBsb29raW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyB1cGRhdGVkIGluIHRoZSBwcmVSZW5kZXIgbWV0aG9kLCBhZnRlciB0aGUgc2Nyb2xsIHZhbHVlcyBhbmQgZm9sbG93ZXJcclxuICAgICAgICAgKiBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI21pZFBvaW50XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWlkUG9pbnQgPSBuZXcgVmVjdG9yMih3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBvcmlnaW4gb2Ygcm90YXRpb24gZm9yIHRoaXMgQ2FtZXJhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQnkgZGVmYXVsdCB0aGUgY2FtZXJhIHJvdGF0ZXMgYXJvdW5kIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQ2hhbmdpbmcgdGhlIG9yaWdpbiBhbGxvd3MgeW91IHRvIGFkanVzdCB0aGUgcG9pbnQgaW4gdGhlIHZpZXdwb3J0IGZyb20gd2hpY2ggcm90YXRpb24gaGFwcGVucy5cclxuICAgICAgICAgKiBBIHZhbHVlIG9mIDAgd291bGQgcm90YXRlIGZyb20gdGhlIHRvcC1sZWZ0IG9mIHRoZSB2aWV3cG9ydC4gQSB2YWx1ZSBvZiAxIGZyb20gdGhlIGJvdHRvbSByaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNlZSBgc2V0T3JpZ2luYCB0byBzZXQgYm90aCBvcmlnaW5zIGluIGEgc2luZ2xlLCBjaGFpbmFibGUgY2FsbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNvcmlnaW5YXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwLjVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vcmlnaW5YID0gMC41O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgb3JpZ2luIG9mIHJvdGF0aW9uIGZvciB0aGlzIENhbWVyYS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNhbWVyYSByb3RhdGVzIGFyb3VuZCB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIENoYW5naW5nIHRoZSBvcmlnaW4gYWxsb3dzIHlvdSB0byBhZGp1c3QgdGhlIHBvaW50IGluIHRoZSB2aWV3cG9ydCBmcm9tIHdoaWNoIHJvdGF0aW9uIGhhcHBlbnMuXHJcbiAgICAgICAgICogQSB2YWx1ZSBvZiAwIHdvdWxkIHJvdGF0ZSBmcm9tIHRoZSB0b3AtbGVmdCBvZiB0aGUgdmlld3BvcnQuIEEgdmFsdWUgb2YgMSBmcm9tIHRoZSBib3R0b20gcmlnaHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTZWUgYHNldE9yaWdpbmAgdG8gc2V0IGJvdGggb3JpZ2lucyBpbiBhIHNpbmdsZSwgY2hhaW5hYmxlIGNhbGwuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjb3JpZ2luWVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMC41XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub3JpZ2luWSA9IDAuNTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG9lcyB0aGlzIENhbWVyYSBoYXZlIGEgY3VzdG9tIHZpZXdwb3J0P1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI19jdXN0b21WaWV3cG9ydFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY3VzdG9tVmlld3BvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIE1hc2sgdGhpcyBDYW1lcmEgaXMgdXNpbmcgZHVyaW5nIHJlbmRlci5cclxuICAgICAgICAgKiBTZXQgdGhlIG1hc2sgdXNpbmcgdGhlIGBzZXRNYXNrYCBtZXRob2QuIFJlbW92ZSB0aGUgbWFzayB1c2luZyB0aGUgYGNsZWFyTWFza2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI21hc2tcclxuICAgICAgICAgKiBAdHlwZSB7PyhQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrfFBoYXNlci5EaXNwbGF5Lk1hc2tzLkdlb21ldHJ5TWFzayl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFzayA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgdGhhdCB0aGlzIENhbWVyYSB1c2VzIGZvciB0cmFuc2xhdGlvbiBkdXJpbmcgbWFza2luZy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBJZiB0aGUgbWFzayBpcyBmaXhlZCBpbiBwb3NpdGlvbiB0aGlzIHdpbGwgYmUgYSByZWZlcmVuY2UgdG9cclxuICAgICAgICAgKiB0aGUgQ2FtZXJhTWFuYWdlci5kZWZhdWx0IGluc3RhbmNlLiBPdGhlcndpc2UsIGl0J2xsIGJlIGEgcmVmZXJlbmNlXHJcbiAgICAgICAgICogdG8gaXRzZWxmLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI19tYXNrQ2FtZXJhXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmF9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbWFza0NhbWVyYSA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBBbHBoYSBsZXZlbCBvZiB0aGlzIENhbWVyYS4gVGhlIGFscGhhIGNvbnRyb2xzIHRoZSBvcGFjaXR5IG9mIHRoZSBDYW1lcmEgYXMgaXQgcmVuZGVycy5cclxuICAgICAqIEFscGhhIHZhbHVlcyBhcmUgcHJvdmlkZWQgYXMgYSBmbG9hdCBiZXR3ZWVuIDAsIGZ1bGx5IHRyYW5zcGFyZW50LCBhbmQgMSwgZnVsbHkgb3BhcXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3NldEFscGhhXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIFRoZSBDYW1lcmEgYWxwaGEgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHJvdGF0aW9uIG9yaWdpbiBvZiB0aGlzIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdmFsdWVzIGFyZSBnaXZlbiBpbiB0aGUgcmFuZ2UgMCB0byAxIGFuZCBhcmUgb25seSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgQ2FtZXJhIHJvdGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNhbWVyYSByb3RhdGVzIGFyb3VuZCB0aGUgY2VudGVyIG9mIHRoZSB2aWV3cG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgb3JpZ2luIGFsbG93cyB5b3UgdG8gYWRqdXN0IHRoZSBwb2ludCBpbiB0aGUgdmlld3BvcnQgZnJvbSB3aGljaCByb3RhdGlvbiBoYXBwZW5zLlxyXG4gICAgICogQSB2YWx1ZSBvZiAwIHdvdWxkIHJvdGF0ZSBmcm9tIHRoZSB0b3AtbGVmdCBvZiB0aGUgdmlld3BvcnQuIEEgdmFsdWUgb2YgMSBmcm9tIHRoZSBib3R0b20gcmlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0T3JpZ2luXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTAuNV0gLSBUaGUgaG9yaXpvbnRhbCBvcmlnaW4gdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgb3JpZ2luIHZhbHVlLiBJZiBub3QgZGVmaW5lZCBpdCB3aWxsIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgYHhgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRPcmlnaW46IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDAuNTsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5vcmlnaW5YID0geDtcclxuICAgICAgICB0aGlzLm9yaWdpblkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHdoYXQgdGhlIENhbWVyYS5zY3JvbGxYIGFuZCBzY3JvbGxZIHZhbHVlcyB3b3VsZCBuZWVkIHRvIGJlIGluIG9yZGVyIHRvIG1vdmVcclxuICAgICAqIHRoZSBDYW1lcmEgc28gaXQgaXMgY2VudGVyZWQgb24gdGhlIGdpdmVuIHggYW5kIHkgY29vcmRpbmF0ZXMsIHdpdGhvdXQgYWN0dWFsbHkgbW92aW5nXHJcbiAgICAgKiB0aGUgQ2FtZXJhIHRoZXJlLiBUaGUgcmVzdWx0cyBhcmUgY2xhbXBlZCBiYXNlZCBvbiB0aGUgQ2FtZXJhIGJvdW5kcywgaWYgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2dldFNjcm9sbFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB0byBjZW50ZXIgb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIGNlbnRlciBvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBBIFZlY3RvcjIgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbi4gSWYgbm90IGdpdmVuIGEgbmV3IFZlY3RvcjIgaXMgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgc2Nyb2xsIGNvb3JkaW5hdGVzIHN0b3JlZCBpbiB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgZ2V0U2Nyb2xsOiBmdW5jdGlvbiAoeCwgeSwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHZhciBvcmlnaW5YID0gdGhpcy53aWR0aCAqIDAuNTtcclxuICAgICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuaGVpZ2h0ICogMC41O1xyXG5cclxuICAgICAgICBvdXQueCA9IHggLSBvcmlnaW5YO1xyXG4gICAgICAgIG91dC55ID0geSAtIG9yaWdpblk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZUJvdW5kcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dC54ID0gdGhpcy5jbGFtcFgob3V0LngpO1xyXG4gICAgICAgICAgICBvdXQueSA9IHRoaXMuY2xhbXBZKG91dC55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIENhbWVyYSBob3Jpem9udGFsbHkgc28gdGhhdCBpdCBpcyBjZW50ZXJlZCBvbiB0aGUgZ2l2ZW4geCBjb29yZGluYXRlLCBib3VuZHMgYWxsb3dpbmcuXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBzY3JvbGxZIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2NlbnRlck9uWFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB0byBjZW50ZXIgb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNlbnRlck9uWDogZnVuY3Rpb24gKHgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9yaWdpblggPSB0aGlzLndpZHRoICogMC41O1xyXG5cclxuICAgICAgICB0aGlzLm1pZFBvaW50LnggPSB4O1xyXG5cclxuICAgICAgICB0aGlzLnNjcm9sbFggPSB4IC0gb3JpZ2luWDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlQm91bmRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxYID0gdGhpcy5jbGFtcFgodGhpcy5zY3JvbGxYKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBDYW1lcmEgdmVydGljYWxseSBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkIG9uIHRoZSBnaXZlbiB5IGNvb3JkaW5hdGUsIGJvdW5kcyBhbGxvd2luZy5cclxuICAgICAqIENhbGxpbmcgdGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNjcm9sbFggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjY2VudGVyT25ZXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSB0byBjZW50ZXIgb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNlbnRlck9uWTogZnVuY3Rpb24gKHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9yaWdpblkgPSB0aGlzLmhlaWdodCAqIDAuNTtcclxuXHJcbiAgICAgICAgdGhpcy5taWRQb2ludC55ID0geTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxZID0geSAtIG9yaWdpblk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZUJvdW5kcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsWSA9IHRoaXMuY2xhbXBZKHRoaXMuc2Nyb2xsWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0aGUgQ2FtZXJhIHNvIHRoYXQgaXQgaXMgY2VudGVyZWQgb24gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLCBib3VuZHMgYWxsb3dpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjY2VudGVyT25cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdG8gY2VudGVyIG9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSB0byBjZW50ZXIgb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNlbnRlck9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNlbnRlck9uWCh4KTtcclxuICAgICAgICB0aGlzLmNlbnRlck9uWSh5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIENhbWVyYSBzbyB0aGF0IGl0IGlzIGxvb2tpbmcgYXQgdGhlIGNlbnRlciBvZiB0aGUgQ2FtZXJhIEJvdW5kcywgaWYgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNjZW50ZXJUb0JvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNlbnRlclRvQm91bmRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZUJvdW5kcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9ib3VuZHM7XHJcbiAgICAgICAgICAgIHZhciBvcmlnaW5YID0gdGhpcy53aWR0aCAqIDAuNTtcclxuICAgICAgICAgICAgdmFyIG9yaWdpblkgPSB0aGlzLmhlaWdodCAqIDAuNTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWlkUG9pbnQuc2V0KGJvdW5kcy5jZW50ZXJYLCBib3VuZHMuY2VudGVyWSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFggPSBib3VuZHMuY2VudGVyWCAtIG9yaWdpblg7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsWSA9IGJvdW5kcy5jZW50ZXJZIC0gb3JpZ2luWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBDYW1lcmEgc28gdGhhdCBpdCBpcyByZS1jZW50ZXJlZCBiYXNlZCBvbiBpdHMgdmlld3BvcnQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNjZW50ZXJUb1NpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjZW50ZXJUb1NpemU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxYID0gdGhpcy53aWR0aCAqIDAuNTtcclxuICAgICAgICB0aGlzLnNjcm9sbFkgPSB0aGlzLmhlaWdodCAqIDAuNTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIGFuZCByZXR1cm5zIGEgbmV3IGFycmF5IGZlYXR1cmluZyBvbmx5IHRob3NlIG9iamVjdHNcclxuICAgICAqIHZpc2libGUgYnkgdGhpcyBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjY3VsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEcgLSBbcmVuZGVyYWJsZU9iamVjdHMsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IHJlbmRlcmFibGVPYmplY3RzIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIGN1bGwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHZpc2libGUgdG8gdGhpcyBDYW1lcmEuXHJcbiAgICAgKi9cclxuICAgIGN1bGw6IGZ1bmN0aW9uIChyZW5kZXJhYmxlT2JqZWN0cylcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlQ3VsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJhYmxlT2JqZWN0cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmFNYXRyaXggPSB0aGlzLm1hdHJpeC5tYXRyaXg7XHJcblxyXG4gICAgICAgIHZhciBtdmEgPSBjYW1lcmFNYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIG12YiA9IGNhbWVyYU1hdHJpeFsxXTtcclxuICAgICAgICB2YXIgbXZjID0gY2FtZXJhTWF0cml4WzJdO1xyXG4gICAgICAgIHZhciBtdmQgPSBjYW1lcmFNYXRyaXhbM107XHJcblxyXG4gICAgICAgIC8qIEZpcnN0IEludmVydCBNYXRyaXggKi9cclxuICAgICAgICB2YXIgZGV0ZXJtaW5hbnQgPSAobXZhICogbXZkKSAtIChtdmIgKiBtdmMpO1xyXG5cclxuICAgICAgICBpZiAoIWRldGVybWluYW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmFibGVPYmplY3RzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG12ZSA9IGNhbWVyYU1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgbXZmID0gY2FtZXJhTWF0cml4WzVdO1xyXG5cclxuICAgICAgICB2YXIgc2Nyb2xsWCA9IHRoaXMuc2Nyb2xsWDtcclxuICAgICAgICB2YXIgc2Nyb2xsWSA9IHRoaXMuc2Nyb2xsWTtcclxuICAgICAgICB2YXIgY2FtZXJhVyA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgdmFyIGNhbWVyYUggPSB0aGlzLmhlaWdodDtcclxuICAgICAgICB2YXIgY3VsbGVkT2JqZWN0cyA9IHRoaXMuY3VsbGVkT2JqZWN0cztcclxuICAgICAgICB2YXIgbGVuZ3RoID0gcmVuZGVyYWJsZU9iamVjdHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBkZXRlcm1pbmFudCA9IDEgLyBkZXRlcm1pbmFudDtcclxuXHJcbiAgICAgICAgY3VsbGVkT2JqZWN0cy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyArK2luZGV4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHJlbmRlcmFibGVPYmplY3RzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGlmICghb2JqZWN0Lmhhc093blByb3BlcnR5KCd3aWR0aCcpIHx8IG9iamVjdC5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGN1bGxlZE9iamVjdHMucHVzaChvYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBvYmplY3RXID0gb2JqZWN0LndpZHRoO1xyXG4gICAgICAgICAgICB2YXIgb2JqZWN0SCA9IG9iamVjdC5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciBvYmplY3RYID0gKG9iamVjdC54IC0gKHNjcm9sbFggKiBvYmplY3Quc2Nyb2xsRmFjdG9yWCkpIC0gKG9iamVjdFcgKiBvYmplY3Qub3JpZ2luWCk7XHJcbiAgICAgICAgICAgIHZhciBvYmplY3RZID0gKG9iamVjdC55IC0gKHNjcm9sbFkgKiBvYmplY3Quc2Nyb2xsRmFjdG9yWSkpIC0gKG9iamVjdEggKiBvYmplY3Qub3JpZ2luWSk7XHJcbiAgICAgICAgICAgIHZhciB0eCA9IChvYmplY3RYICogbXZhICsgb2JqZWN0WSAqIG12YyArIG12ZSk7XHJcbiAgICAgICAgICAgIHZhciB0eSA9IChvYmplY3RYICogbXZiICsgb2JqZWN0WSAqIG12ZCArIG12Zik7XHJcbiAgICAgICAgICAgIHZhciB0dyA9ICgob2JqZWN0WCArIG9iamVjdFcpICogbXZhICsgKG9iamVjdFkgKyBvYmplY3RIKSAqIG12YyArIG12ZSk7XHJcbiAgICAgICAgICAgIHZhciB0aCA9ICgob2JqZWN0WCArIG9iamVjdFcpICogbXZiICsgKG9iamVjdFkgKyBvYmplY3RIKSAqIG12ZCArIG12Zik7XHJcbiAgICAgICAgICAgIHZhciBjdWxsVG9wID0gdGhpcy55O1xyXG4gICAgICAgICAgICB2YXIgY3VsbEJvdHRvbSA9IGN1bGxUb3AgKyBjYW1lcmFIO1xyXG4gICAgICAgICAgICB2YXIgY3VsbExlZnQgPSB0aGlzLng7XHJcbiAgICAgICAgICAgIHZhciBjdWxsUmlnaHQgPSBjdWxsTGVmdCArIGNhbWVyYVc7XHJcblxyXG4gICAgICAgICAgICBpZiAoKHR3ID4gY3VsbExlZnQgJiYgdHggPCBjdWxsUmlnaHQpICYmICh0aCA+IGN1bGxUb3AgJiYgdHkgPCBjdWxsQm90dG9tKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY3VsbGVkT2JqZWN0cy5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdWxsZWRPYmplY3RzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBpbnRvIFdvcmxkIHNwYWNlLCBiYXNlZCBvbiB0aGlzIENhbWVyYXMgdHJhbnNmb3JtLlxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBWZWN0b3IyLCBvciBzaW1pbGFyIG9iamVjdCwgdG8gc3RvcmUgdGhlIHJlc3VsdHMgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjZ2V0V29ybGRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiB0byBjb252ZXJ0IHRvIHdvcmxkIHNwYWNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiB0byBjb252ZXJ0IHRvIHdvcmxkIHNwYWNlLlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fFBoYXNlci5NYXRoLlZlY3RvcjIpfSBbb3V0cHV0XSAtIEFuIG9wdGlvbmFsIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0cyBpbi4gSWYgbm90IHByb3ZpZGVkIGEgbmV3IFZlY3RvcjIgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IEFuIG9iamVjdCBob2xkaW5nIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIGluIGl0cyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gICAgICovXHJcbiAgICBnZXRXb3JsZFBvaW50OiBmdW5jdGlvbiAoeCwgeSwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmFNYXRyaXggPSB0aGlzLm1hdHJpeC5tYXRyaXg7XHJcblxyXG4gICAgICAgIHZhciBtdmEgPSBjYW1lcmFNYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIG12YiA9IGNhbWVyYU1hdHJpeFsxXTtcclxuICAgICAgICB2YXIgbXZjID0gY2FtZXJhTWF0cml4WzJdO1xyXG4gICAgICAgIHZhciBtdmQgPSBjYW1lcmFNYXRyaXhbM107XHJcbiAgICAgICAgdmFyIG12ZSA9IGNhbWVyYU1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgbXZmID0gY2FtZXJhTWF0cml4WzVdO1xyXG5cclxuICAgICAgICAvLyAgSW52ZXJ0IE1hdHJpeFxyXG4gICAgICAgIHZhciBkZXRlcm1pbmFudCA9IChtdmEgKiBtdmQpIC0gKG12YiAqIG12Yyk7XHJcblxyXG4gICAgICAgIGlmICghZGV0ZXJtaW5hbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXQueCA9IHg7XHJcbiAgICAgICAgICAgIG91dHB1dC55ID0geTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZXRlcm1pbmFudCA9IDEgLyBkZXRlcm1pbmFudDtcclxuXHJcbiAgICAgICAgdmFyIGltYSA9IG12ZCAqIGRldGVybWluYW50O1xyXG4gICAgICAgIHZhciBpbWIgPSAtbXZiICogZGV0ZXJtaW5hbnQ7XHJcbiAgICAgICAgdmFyIGltYyA9IC1tdmMgKiBkZXRlcm1pbmFudDtcclxuICAgICAgICB2YXIgaW1kID0gbXZhICogZGV0ZXJtaW5hbnQ7XHJcbiAgICAgICAgdmFyIGltZSA9IChtdmMgKiBtdmYgLSBtdmQgKiBtdmUpICogZGV0ZXJtaW5hbnQ7XHJcbiAgICAgICAgdmFyIGltZiA9IChtdmIgKiBtdmUgLSBtdmEgKiBtdmYpICogZGV0ZXJtaW5hbnQ7XHJcblxyXG4gICAgICAgIHZhciBjID0gTWF0aC5jb3ModGhpcy5yb3RhdGlvbik7XHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbih0aGlzLnJvdGF0aW9uKTtcclxuXHJcbiAgICAgICAgdmFyIHpvb20gPSB0aGlzLnpvb207XHJcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMucmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgdmFyIHNjcm9sbFggPSB0aGlzLnNjcm9sbFg7XHJcbiAgICAgICAgdmFyIHNjcm9sbFkgPSB0aGlzLnNjcm9sbFk7XHJcblxyXG4gICAgICAgIC8vICBXb3JrcyBmb3Igem9vbSBvZiAxIHdpdGggYW55IHJlc29sdXRpb24sIGJ1dCByZXNvbHV0aW9uID4gMSBhbmQgem9vbSAhPT0gMSBicmVha3NcclxuICAgICAgICB2YXIgc3ggPSB4ICsgKChzY3JvbGxYICogYyAtIHNjcm9sbFkgKiBzKSAqIHpvb20pO1xyXG4gICAgICAgIHZhciBzeSA9IHkgKyAoKHNjcm9sbFggKiBzICsgc2Nyb2xsWSAqIGMpICogem9vbSk7XHJcblxyXG4gICAgICAgIC8vICBBcHBseSB0cmFuc2Zvcm0gdG8gcG9pbnRcclxuICAgICAgICBvdXRwdXQueCA9IChzeCAqIGltYSArIHN5ICogaW1jKSAqIHJlcyArIGltZTtcclxuICAgICAgICBvdXRwdXQueSA9IChzeCAqIGltYiArIHN5ICogaW1kKSAqIHJlcyArIGltZjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIEdhbWUgT2JqZWN0LCBvciBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMsIGl0IHdpbGwgdXBkYXRlIGFsbCBvZiB0aGVpciBjYW1lcmEgZmlsdGVyIHNldHRpbmdzXHJcbiAgICAgKiBzbyB0aGF0IHRoZXkgYXJlIGlnbm9yZWQgYnkgdGhpcyBDYW1lcmEuIFRoaXMgbWVhbnMgdGhleSB3aWxsIG5vdCBiZSByZW5kZXJlZCBieSB0aGlzIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNpZ25vcmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W118UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwKX0gZW50cmllcyAtIFRoZSBHYW1lIE9iamVjdCwgb3IgYXJyYXkgb2YgR2FtZSBPYmplY3RzLCB0byBiZSBpZ25vcmVkIGJ5IHRoaXMgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBpZ25vcmU6IGZ1bmN0aW9uIChlbnRyaWVzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpZCA9IHRoaXMuaWQ7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGVudHJpZXMgPSBbIGVudHJpZXMgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5pc1BhcmVudClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pZ25vcmUoZW50cnkuZ2V0Q2hpbGRyZW4oKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeS5jYW1lcmFGaWx0ZXIgfD0gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHByZVJlbmRlciBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3ByZVJlbmRlclxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gLSBUaGUgZ2FtZSByZXNvbHV0aW9uLCBhcyBzZXQgaW4gdGhlIFNjYWxlIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHByZVJlbmRlcjogZnVuY3Rpb24gKHJlc29sdXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAqIDAuNTtcclxuICAgICAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAqIDAuNTtcclxuXHJcbiAgICAgICAgdmFyIHpvb20gPSB0aGlzLnpvb20gKiByZXNvbHV0aW9uO1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgdmFyIG9yaWdpblggPSB3aWR0aCAqIHRoaXMub3JpZ2luWDtcclxuICAgICAgICB2YXIgb3JpZ2luWSA9IGhlaWdodCAqIHRoaXMub3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIHN4ID0gdGhpcy5zY3JvbGxYO1xyXG4gICAgICAgIHZhciBzeSA9IHRoaXMuc2Nyb2xsWTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlQm91bmRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3ggPSB0aGlzLmNsYW1wWChzeCk7XHJcbiAgICAgICAgICAgIHN5ID0gdGhpcy5jbGFtcFkoc3kpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm91bmRQaXhlbHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvcmlnaW5YID0gTWF0aC5yb3VuZChvcmlnaW5YKTtcclxuICAgICAgICAgICAgb3JpZ2luWSA9IE1hdGgucm91bmQob3JpZ2luWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVmFsdWVzIGFyZSBpbiBwaXhlbHMgYW5kIG5vdCBpbXBhY3RlZCBieSB6b29taW5nIHRoZSBDYW1lcmFcclxuICAgICAgICB0aGlzLnNjcm9sbFggPSBzeDtcclxuICAgICAgICB0aGlzLnNjcm9sbFkgPSBzeTtcclxuXHJcbiAgICAgICAgdmFyIG1pZFggPSBzeCArIGhhbGZXaWR0aDtcclxuICAgICAgICB2YXIgbWlkWSA9IHN5ICsgaGFsZkhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBjZW50ZXIgb2YgdGhlIGNhbWVyYSwgaW4gd29ybGQgc3BhY2UsIHNvIHRha2luZyB6b29tIGludG8gYWNjb3VudFxyXG4gICAgICAgIC8vICBCYXNpY2FsbHkgdGhlIHBpeGVsIHZhbHVlIG9mIHdoYXQgaXQncyBsb29raW5nIGF0IGluIHRoZSBtaWRkbGUgb2YgdGhlIGNhbVxyXG4gICAgICAgIHRoaXMubWlkUG9pbnQuc2V0KG1pZFgsIG1pZFkpO1xyXG5cclxuICAgICAgICB2YXIgZGlzcGxheVdpZHRoID0gd2lkdGggLyB6b29tO1xyXG4gICAgICAgIHZhciBkaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0IC8gem9vbTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZFZpZXcuc2V0VG8oXHJcbiAgICAgICAgICAgIG1pZFggLSAoZGlzcGxheVdpZHRoIC8gMiksXHJcbiAgICAgICAgICAgIG1pZFkgLSAoZGlzcGxheUhlaWdodCAvIDIpLFxyXG4gICAgICAgICAgICBkaXNwbGF5V2lkdGgsXHJcbiAgICAgICAgICAgIGRpc3BsYXlIZWlnaHRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBtYXRyaXguYXBwbHlJVFJTKHRoaXMueCArIG9yaWdpblgsIHRoaXMueSArIG9yaWdpblksIHRoaXMucm90YXRpb24sIHpvb20sIHpvb20pO1xyXG4gICAgICAgIG1hdHJpeC50cmFuc2xhdGUoLW9yaWdpblgsIC1vcmlnaW5ZKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhbiB4IHZhbHVlIGFuZCBjaGVja3MgaXQncyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBDYW1lcmEgYm91bmRzLCBhZGp1c3RpbmcgaWYgcmVxdWlyZWQuXHJcbiAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBjYW1lcmEgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2NsYW1wWFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGhvcml6b250YWxseSBzY3JvbGwgY2xhbXAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWRqdXN0ZWQgdmFsdWUgdG8gdXNlIGFzIHNjcm9sbFguXHJcbiAgICAgKi9cclxuICAgIGNsYW1wWDogZnVuY3Rpb24gKHgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2JvdW5kcztcclxuXHJcbiAgICAgICAgdmFyIGR3ID0gdGhpcy5kaXNwbGF5V2lkdGg7XHJcblxyXG4gICAgICAgIHZhciBieCA9IGJvdW5kcy54ICsgKChkdyAtIHRoaXMud2lkdGgpIC8gMik7XHJcbiAgICAgICAgdmFyIGJ3ID0gTWF0aC5tYXgoYngsIGJ4ICsgYm91bmRzLndpZHRoIC0gZHcpO1xyXG5cclxuICAgICAgICBpZiAoeCA8IGJ4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeCA9IGJ4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh4ID4gYncpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4ID0gYnc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHkgdmFsdWUgYW5kIGNoZWNrcyBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIENhbWVyYSBib3VuZHMsIGFkanVzdGluZyBpZiByZXF1aXJlZC5cclxuICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGlmIHlvdSBhcmUgbm90IHVzaW5nIGNhbWVyYSBib3VuZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjY2xhbXBZXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gdmVydGljYWxseSBzY3JvbGwgY2xhbXAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWRqdXN0ZWQgdmFsdWUgdG8gdXNlIGFzIHNjcm9sbFkuXHJcbiAgICAgKi9cclxuICAgIGNsYW1wWTogZnVuY3Rpb24gKHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuX2JvdW5kcztcclxuXHJcbiAgICAgICAgdmFyIGRoID0gdGhpcy5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgYnkgPSBib3VuZHMueSArICgoZGggLSB0aGlzLmhlaWdodCkgLyAyKTtcclxuICAgICAgICB2YXIgYmggPSBNYXRoLm1heChieSwgYnkgKyBib3VuZHMuaGVpZ2h0IC0gZGgpO1xyXG5cclxuICAgICAgICBpZiAoeSA8IGJ5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeSA9IGJ5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh5ID4gYmgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB5ID0gYmg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geTtcclxuICAgIH0sXHJcblxyXG4gICAgLypcclxuICAgICAgICB2YXIgZ2FwID0gdGhpcy5fem9vbUludmVyc2VkO1xyXG4gICAgICAgIHJldHVybiBnYXAgKiBNYXRoLnJvdW5kKChzcmMueCAtIHRoaXMuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYKSAvIGdhcCk7XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhpcyBDYW1lcmEgaGFzIHByZXZpb3VzbHkgaGFkIG1vdmVtZW50IGJvdW5kcyBzZXQgb24gaXQsIHRoaXMgd2lsbCByZW1vdmUgdGhlbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNyZW1vdmVCb3VuZHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVCb3VuZHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy51c2VCb3VuZHMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kcy5zZXRFbXB0eSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHJvdGF0aW9uIG9mIHRoaXMgQ2FtZXJhLiBUaGlzIGNhdXNlcyBldmVyeXRoaW5nIGl0IHJlbmRlcnMgdG8gYXBwZWFyIHJvdGF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogUm90YXRpbmcgYSBjYW1lcmEgZG9lcyBub3Qgcm90YXRlIHRoZSB2aWV3cG9ydCBpdHNlbGYsIGl0IGlzIGFwcGxpZWQgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRBbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0wXSAtIFRoZSBjYW1lcmFzIGFuZ2xlIG9mIHJvdGF0aW9uLCBnaXZlbiBpbiBkZWdyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRBbmdsZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLnJvdGF0aW9uID0gRGVnVG9SYWQodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGlzIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBCeSBkZWZhdWx0IGEgQ2FtZXJhIGhhcyBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgYnV0IGl0IGNhbiBiZSBnaXZlbiBhIHNvbGlkIGNvbG9yLCB3aXRoIGFueSBsZXZlbFxyXG4gICAgICogb2YgdHJhbnNwYXJlbmN5LCB2aWEgdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNvbG9yIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgQ1NTIGNvbG9yIG5vdGF0aW9uLCBoZXggb3IgbnVtYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRCYWNrZ3JvdW5kQ29sb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8UGhhc2VyLlR5cGVzLkRpc3BsYXkuSW5wdXRDb2xvck9iamVjdCl9IFtjb2xvcj0ncmdiYSgwLDAsMCwwKSddIC0gVGhlIGNvbG9yIHZhbHVlLiBJbiBDU1MsIGhleCBvciBudW1lcmljIGNvbG9yIG5vdGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3I6IGZ1bmN0aW9uIChjb2xvcilcclxuICAgIHtcclxuICAgICAgICBpZiAoY29sb3IgPT09IHVuZGVmaW5lZCkgeyBjb2xvciA9ICdyZ2JhKDAsMCwwLDApJzsgfVxyXG5cclxuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IFZhbHVlVG9Db2xvcihjb2xvcik7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNwYXJlbnQgPSAodGhpcy5iYWNrZ3JvdW5kQ29sb3IuYWxwaGEgPT09IDApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgQ2FtZXJhLiBUaGUgYm91bmRzIGFyZSBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgQ2FtZXJhIGJvdW5kcyBjb250cm9scyB3aGVyZSB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdG8sIHN0b3BwaW5nIGl0IGZyb20gc2Nyb2xsaW5nIG9mZiB0aGVcclxuICAgICAqIGVkZ2VzIGFuZCBpbnRvIGJsYW5rIHNwYWNlLiBJdCBkb2VzIG5vdCBsaW1pdCB0aGUgcGxhY2VtZW50IG9mIEdhbWUgT2JqZWN0cywgb3Igd2hlcmVcclxuICAgICAqIHRoZSBDYW1lcmEgdmlld3BvcnQgY2FuIGJlIHBvc2l0aW9uZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIGJvdW5kcyBieSBjaGFuZ2luZyB0aGUgYm9vbGVhbiBgQ2FtZXJhLnVzZUJvdW5kc2AuXHJcbiAgICAgKiBcclxuICAgICAqIENsZWFyIHRoZSBib3VuZHMgZW50aXJlbHkgYnkgY2FsbGluZyBgQ2FtZXJhLnJlbW92ZUJvdW5kc2AuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBzZXQgYm91bmRzIHRoYXQgYXJlIHNtYWxsZXIgdGhhbiB0aGUgdmlld3BvcnQgaXQgd2lsbCBzdG9wIHRoZSBDYW1lcmEgZnJvbSBiZWluZ1xyXG4gICAgICogYWJsZSB0byBzY3JvbGwuIFRoZSBib3VuZHMgY2FuIGJlIHBvc2l0aW9uZWQgd2hlcmUtZXZlciB5b3Ugd2lzaC4gQnkgZGVmYXVsdCB0aGV5IGFyZSBmcm9tXHJcbiAgICAgKiAweDAgdG8gdGhlIGNhbnZhcyB3aWR0aCB4IGhlaWdodC4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb29yZGluYXRlIDB4MCBpcyB0aGUgdG9wIGxlZnQgb2ZcclxuICAgICAqIHRoZSBDYW1lcmEgYm91bmRzLiBIb3dldmVyLCB5b3UgY2FuIHBvc2l0aW9uIHRoZW0gYW55d2hlcmUuIFNvIGlmIHlvdSB3YW50ZWQgYSBnYW1lIHdvcmxkXHJcbiAgICAgKiB0aGF0IHdhcyAyMDQ4eDIwNDggaW4gc2l6ZSwgd2l0aCAweDAgYmVpbmcgdGhlIGNlbnRlciBvZiBpdCwgeW91IGNhbiBzZXQgdGhlIGJvdW5kcyB4L3lcclxuICAgICAqIHRvIGJlIC0xMDI0LCAtMTAyNCwgd2l0aCBhIHdpZHRoIGFuZCBoZWlnaHQgb2YgMjA0OC4gRGVwZW5kaW5nIG9uIHlvdXIgZ2FtZSB5b3UgbWF5IGZpbmRcclxuICAgICAqIGl0IGVhc2llciBmb3IgMHgwIHRvIGJlIHRoZSB0b3AtbGVmdCBvZiB0aGUgYm91bmRzLCBvciB5b3UgbWF5IHdpc2ggMHgwIHRvIGJlIHRoZSBtaWRkbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHggLSBUaGUgdG9wLWxlZnQgeCBjb29yZGluYXRlIG9mIHRoZSBib3VuZHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgdG9wLWxlZnQgeSBjb29yZGluYXRlIG9mIHRoZSBib3VuZHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBib3VuZHMsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgYm91bmRzLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjZW50ZXJPbj1mYWxzZV0gLSBJZiBgdHJ1ZWAgdGhlIENhbWVyYSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2VudGVyZWQgb24gdGhlIG5ldyBib3VuZHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5kczogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlck9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjZW50ZXJPbiA9PT0gdW5kZWZpbmVkKSB7IGNlbnRlck9uID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5fYm91bmRzLnNldFRvKHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnVzZUJvdW5kcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChjZW50ZXJPbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2VudGVyVG9Cb3VuZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxYID0gdGhpcy5jbGFtcFgodGhpcy5zY3JvbGxYKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxZID0gdGhpcy5jbGFtcFkodGhpcy5zY3JvbGxZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByZWN0YW5nbGUgY29udGFpbmluZyB0aGUgYm91bmRzIG9mIHRoZSBDYW1lcmEuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBDYW1lcmEgZG9lcyBub3QgaGF2ZSBhbnkgYm91bmRzIHRoZSByZWN0YW5nbGUgd2lsbCBiZSBlbXB0eS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHJlY3RhbmdsZSBpcyBhIGNvcHkgb2YgdGhlIGJvdW5kcywgc28gaXMgc2FmZSB0byBtb2RpZnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjZ2V0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFtvdXRdIC0gQW4gb3B0aW9uYWwgUmVjdGFuZ2xlIHRvIHN0b3JlIHRoZSBib3VuZHMgaW4uIElmIG5vdCBnaXZlbiwgYSBuZXcgUmVjdGFuZ2xlIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IEEgcmVjdGFuZ2xlIGNvbnRhaW5pbmcgdGhlIGJvdW5kcyBvZiB0aGlzIENhbWVyYS5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbiAob3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUmVjdGFuZ2xlKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuX2JvdW5kcztcclxuXHJcbiAgICAgICAgb3V0LnNldFRvKHNvdXJjZS54LCBzb3VyY2UueSwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgQ2FtZXJhLlxyXG4gICAgICogVGhpcyB2YWx1ZSBpcyBmb3IgeW91ciBvd24gdXNlIGFuZCBpc24ndCB1c2VkIGludGVybmFsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0TmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZT0nJ10gLSBUaGUgbmFtZSBvZiB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXROYW1lOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSAnJzsgfVxyXG5cclxuICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0IHdpdGhpbiB0aGUgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB3aGVyZSB0aGUgY2FtZXJhIGlzICdsb29raW5nJy4gU2VlIGBzZXRTY3JvbGxgIHRvIGNvbnRyb2wgdGhhdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdG9wLWxlZnQgeCBjb29yZGluYXRlIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdG9wLWxlZnQgeSBjb29yZGluYXRlIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSByb3RhdGlvbiBvZiB0aGlzIENhbWVyYS4gVGhpcyBjYXVzZXMgZXZlcnl0aGluZyBpdCByZW5kZXJzIHRvIGFwcGVhciByb3RhdGVkLlxyXG4gICAgICpcclxuICAgICAqIFJvdGF0aW5nIGEgY2FtZXJhIGRvZXMgbm90IHJvdGF0ZSB0aGUgdmlld3BvcnQgaXRzZWxmLCBpdCBpcyBhcHBsaWVkIGR1cmluZyByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0Um90YXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWU9MF0gLSBUaGUgcm90YXRpb24gb2YgdGhlIENhbWVyYSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Um90YXRpb246IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG91bGQgdGhlIENhbWVyYSByb3VuZCBwaXhlbCB2YWx1ZXMgdG8gd2hvbGUgaW50ZWdlcnMgd2hlbiByZW5kZXJpbmcgR2FtZSBPYmplY3RzP1xyXG4gICAgICogXHJcbiAgICAgKiBJbiBzb21lIHR5cGVzIG9mIGdhbWUsIGVzcGVjaWFsbHkgd2l0aCBwaXhlbCBhcnQsIHRoaXMgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBzdWItcGl4ZWwgYWxpYXNpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0Um91bmRQaXhlbHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBgdHJ1ZWAgdG8gcm91bmQgQ2FtZXJhIHBpeGVscywgYGZhbHNlYCB0byBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFJvdW5kUGl4ZWxzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb3VuZFBpeGVscyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBTY2VuZSB0aGUgQ2FtZXJhIGlzIGJvdW5kIHRvLlxyXG4gICAgICogXHJcbiAgICAgKiBBbHNvIHBvcHVsYXRlcyB0aGUgYHJlc29sdXRpb25gIHByb3BlcnR5IGFuZCB1cGRhdGVzIHRoZSBpbnRlcm5hbCBzaXplIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRTY2VuZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRoZSBjYW1lcmEgaXMgYm91bmQgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNjZW5lOiBmdW5jdGlvbiAoc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5fY3VzdG9tVmlld3BvcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lTWFuYWdlci5jdXN0b21WaWV3cG9ydHMtLTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgdmFyIHN5cyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZU1hbmFnZXIgPSBzeXMuZ2FtZS5zY2VuZTtcclxuICAgICAgICB0aGlzLnNjYWxlTWFuYWdlciA9IHN5cy5zY2FsZTtcclxuICAgICAgICB0aGlzLmNhbWVyYU1hbmFnZXIgPSBzeXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuc2NhbGVNYW5hZ2VyLnJlc29sdXRpb247XHJcblxyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlcztcclxuXHJcbiAgICAgICAgdGhpcy5fY3ggPSB0aGlzLl94ICogcmVzO1xyXG4gICAgICAgIHRoaXMuX2N5ID0gdGhpcy5feSAqIHJlcztcclxuICAgICAgICB0aGlzLl9jdyA9IHRoaXMuX3dpZHRoICogcmVzO1xyXG4gICAgICAgIHRoaXMuX2NoID0gdGhpcy5faGVpZ2h0ICogcmVzO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVN5c3RlbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHdoZXJlIHRoZSBDYW1lcmEgaXMgbG9va2luZyB3aXRoaW4gdGhlIGdhbWUuXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIGBDYW1lcmEuc2Nyb2xsWGAgYW5kIGBDYW1lcmEuc2Nyb2xsWWAgZGlyZWN0bHkuXHJcbiAgICAgKiBVc2UgdGhpcyBtZXRob2QsIG9yIHRoZSBzY3JvbGwgcHJvcGVydGllcywgdG8gbW92ZSB5b3VyIGNhbWVyYSBhcm91bmQgdGhlIGdhbWUgd29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBkb2VzIG5vdCBjaGFuZ2Ugd2hlcmUgdGhlIGNhbWVyYSB2aWV3cG9ydCBpcyBwbGFjZWQuIFNlZSBgc2V0UG9zaXRpb25gIHRvIGNvbnRyb2wgdGhhdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRTY3JvbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgQ2FtZXJhIGluIHRoZSBnYW1lIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgQ2FtZXJhIGluIHRoZSBnYW1lIHdvcmxkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTY3JvbGw6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxYID0geDtcclxuICAgICAgICB0aGlzLnNjcm9sbFkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNpemUgb2YgdGhlIENhbWVyYSB2aWV3cG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBCeSBkZWZhdWx0IGEgQ2FtZXJhIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGdhbWUsIGJ1dCBjYW4gYmUgbWFkZSBzbWFsbGVyIHZpYSB0aGlzIG1ldGhvZCxcclxuICAgICAqIGFsbG93aW5nIHlvdSB0byBjcmVhdGUgbWluaS1jYW0gc3R5bGUgZWZmZWN0cyBieSBjcmVhdGluZyBhbmQgcG9zaXRpb25pbmcgYSBzbWFsbGVyIENhbWVyYVxyXG4gICAgICogdmlld3BvcnQgd2l0aGluIHlvdXIgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9d2lkdGhdIC0gVGhlIGhlaWdodCBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0IGluIGEgc2luZ2xlIGNhbGwuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91J3JlIHRyeWluZyB0byBjaGFuZ2Ugd2hlcmUgdGhlIENhbWVyYSBpcyBsb29raW5nIGF0IGluIHlvdXIgZ2FtZSwgdGhlbiBzZWVcclxuICAgICAqIHRoZSBtZXRob2QgYENhbWVyYS5zZXRTY3JvbGxgIGluc3RlYWQuIFRoaXMgbWV0aG9kIGlzIGZvciBjaGFuZ2luZyB0aGUgdmlld3BvcnRcclxuICAgICAqIGl0c2VsZiwgbm90IHdoYXQgdGhlIGNhbWVyYSBjYW4gc2VlLlxyXG4gICAgICpcclxuICAgICAqIEJ5IGRlZmF1bHQgYSBDYW1lcmEgaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZ2FtZSwgYnV0IGNhbiBiZSBtYWRlIHNtYWxsZXIgdmlhIHRoaXMgbWV0aG9kLFxyXG4gICAgICogYWxsb3dpbmcgeW91IHRvIGNyZWF0ZSBtaW5pLWNhbSBzdHlsZSBlZmZlY3RzIGJ5IGNyZWF0aW5nIGFuZCBwb3NpdGlvbmluZyBhIHNtYWxsZXIgQ2FtZXJhXHJcbiAgICAgKiB2aWV3cG9ydCB3aXRoaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3NldFZpZXdwb3J0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB0b3AtbGVmdCB4IGNvb3JkaW5hdGUgb2YgdGhlIENhbWVyYSB2aWV3cG9ydC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHRvcC1sZWZ0IHkgY29vcmRpbmF0ZSBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PXdpZHRoXSAtIFRoZSBoZWlnaHQgb2YgdGhlIENhbWVyYSB2aWV3cG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgem9vbSB2YWx1ZSBvZiB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIENoYW5naW5nIHRvIGEgc21hbGxlciB2YWx1ZSwgc3VjaCBhcyAwLjUsIHdpbGwgY2F1c2UgdGhlIGNhbWVyYSB0byAnem9vbSBvdXQnLlxyXG4gICAgICogQ2hhbmdpbmcgdG8gYSBsYXJnZXIgdmFsdWUsIHN1Y2ggYXMgMiwgd2lsbCBjYXVzZSB0aGUgY2FtZXJhIHRvICd6b29tIGluJy5cclxuICAgICAqXHJcbiAgICAgKiBBIHZhbHVlIG9mIDEgbWVhbnMgJ25vIHpvb20nIGFuZCBpcyB0aGUgZGVmYXVsdC5cclxuICAgICAqXHJcbiAgICAgKiBDaGFuZ2luZyB0aGUgem9vbSBkb2VzIG5vdCBpbXBhY3QgdGhlIENhbWVyYSB2aWV3cG9ydCBpbiBhbnkgd2F5LCBpdCBpcyBvbmx5IGFwcGxpZWQgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzZXRab29tXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ZhbHVlPTFdIC0gVGhlIHpvb20gdmFsdWUgb2YgdGhlIENhbWVyYS4gVGhlIG1pbmltdW0gaXQgY2FuIGJlIGlzIDAuMDAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRab29tOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSAxOyB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMC4wMDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnpvb20gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWFzayB0byBiZSBhcHBsaWVkIHRvIHRoaXMgQ2FtZXJhIGR1cmluZyByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG1hc2sgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBjcmVhdGVkIGFuZCBjYW4gYmUgZWl0aGVyIGEgR2VvbWV0cnlNYXNrIG9yIGEgQml0bWFwTWFzay5cclxuICAgICAqIFxyXG4gICAgICogQml0bWFwIE1hc2tzIG9ubHkgd29yayBvbiBXZWJHTC4gR2VvbWV0cnkgTWFza3Mgd29yayBvbiBib3RoIFdlYkdMIGFuZCBDYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgYSBtYXNrIGlzIGFscmVhZHkgc2V0IG9uIHRoaXMgQ2FtZXJhIGl0IHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVwbGFjZWQuXHJcbiAgICAgKiBcclxuICAgICAqIE1hc2tzIGhhdmUgbm8gaW1wYWN0IG9uIHBoeXNpY3Mgb3IgaW5wdXQgZGV0ZWN0aW9uLiBUaGV5IGFyZSBwdXJlbHkgYSByZW5kZXJpbmcgY29tcG9uZW50XHJcbiAgICAgKiB0aGF0IGFsbG93cyB5b3UgdG8gbGltaXQgd2hhdCBpcyB2aXNpYmxlIGR1cmluZyB0aGUgcmVuZGVyIHBhc3MuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGU6IFlvdSBjYW5ub3QgbWFzayBhIENhbWVyYSB0aGF0IGhhcyBgcmVuZGVyVG9UZXh0dXJlYCBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2V0TWFza1xyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5EaXNwbGF5Lk1hc2tzLkJpdG1hcE1hc2t8UGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrKX0gbWFzayAtIFRoZSBtYXNrIHRoaXMgQ2FtZXJhIHdpbGwgdXNlIHdoZW4gcmVuZGVyaW5nLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZml4ZWRQb3NpdGlvbj10cnVlXSAtIFNob3VsZCB0aGUgbWFzayB0cmFuc2xhdGUgYWxvbmcgd2l0aCB0aGUgQ2FtZXJhLCBvciBiZSBmaXhlZCBpbiBwbGFjZSBhbmQgbm90IGltcGFjdGVkIGJ5IHRoZSBDYW1lcmFzIHRyYW5zZm9ybT9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWFzazogZnVuY3Rpb24gKG1hc2ssIGZpeGVkUG9zaXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZpeGVkUG9zaXRpb24gPT09IHVuZGVmaW5lZCkgeyBmaXhlZFBvc2l0aW9uID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXNrQ2FtZXJhID0gKGZpeGVkUG9zaXRpb24pID8gdGhpcy5jYW1lcmFNYW5hZ2VyLmRlZmF1bHQgOiB0aGlzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIG1hc2sgdGhhdCB0aGlzIENhbWVyYSB3YXMgdXNpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjY2xlYXJNYXNrXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveU1hc2s9ZmFsc2VdIC0gRGVzdHJveSB0aGUgbWFzayBiZWZvcmUgY2xlYXJpbmcgaXQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyTWFzazogZnVuY3Rpb24gKGRlc3Ryb3lNYXNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkZXN0cm95TWFzayA9PT0gdW5kZWZpbmVkKSB7IGRlc3Ryb3lNYXNrID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKGRlc3Ryb3lNYXNrICYmIHRoaXMubWFzaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFzay5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hc2sgPSBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEFuIGludmlzaWJsZSBDYW1lcmEgd2lsbCBza2lwIHJlbmRlcmluZyBhbmQgaW5wdXQgdGVzdHMgb2YgZXZlcnl0aGluZyBpdCBjYW4gc2VlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3NldFZpc2libGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBPYmplY3Qgc3VpdGFibGUgZm9yIEpTT04gc3RvcmFnZSBjb250YWluaW5nIGFsbCBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0IGFuZCByZW5kZXJpbmcgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuSlNPTkNhbWVyYX0gQSB3ZWxsLWZvcm1lZCBvYmplY3Qgc3VpdGFibGUgZm9yIGNvbnZlcnNpb24gdG8gSlNPTi5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXRwdXQgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcclxuICAgICAgICAgICAgeDogdGhpcy54LFxyXG4gICAgICAgICAgICB5OiB0aGlzLnksXHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxyXG4gICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXHJcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG4gICAgICAgICAgICByb3VuZFBpeGVsczogdGhpcy5yb3VuZFBpeGVscyxcclxuICAgICAgICAgICAgc2Nyb2xsWDogdGhpcy5zY3JvbGxYLFxyXG4gICAgICAgICAgICBzY3JvbGxZOiB0aGlzLnNjcm9sbFksXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNrZ3JvdW5kQ29sb3IucmdiYVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZUJvdW5kcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dHB1dFsnYm91bmRzJ10gPSB7XHJcbiAgICAgICAgICAgICAgICB4OiB0aGlzLl9ib3VuZHMueCxcclxuICAgICAgICAgICAgICAgIHk6IHRoaXMuX2JvdW5kcy55LFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX2JvdW5kcy53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fYm91bmRzLmhlaWdodFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3VwZGF0ZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGdlbmVyYXRlZCBieSB0aGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgb3IgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBOT09QXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHZpZXdwb3J0IGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjdXBkYXRlU3lzdGVtXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVTeXN0ZW06IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYWxlTWFuYWdlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjdXN0b20gPSAodGhpcy5feCAhPT0gMCB8fCB0aGlzLl95ICE9PSAwIHx8IHRoaXMuc2NhbGVNYW5hZ2VyLndpZHRoICE9PSB0aGlzLl93aWR0aCB8fCB0aGlzLnNjYWxlTWFuYWdlci5oZWlnaHQgIT09IHRoaXMuX2hlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBzY2VuZU1hbmFnZXIgPSB0aGlzLnNjZW5lTWFuYWdlcjtcclxuXHJcbiAgICAgICAgaWYgKGN1c3RvbSAmJiAhdGhpcy5fY3VzdG9tVmlld3BvcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgV2UgbmVlZCBhIGN1c3RvbSB2aWV3cG9ydCBmb3IgdGhpcyBDYW1lcmFcclxuICAgICAgICAgICAgc2NlbmVNYW5hZ2VyLmN1c3RvbVZpZXdwb3J0cysrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghY3VzdG9tICYmIHRoaXMuX2N1c3RvbVZpZXdwb3J0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdlJ3JlIHR1cm5pbmcgb2ZmIGEgY3VzdG9tIHZpZXdwb3J0IGZvciB0aGlzIENhbWVyYVxyXG4gICAgICAgICAgICBzY2VuZU1hbmFnZXIuY3VzdG9tVmlld3BvcnRzLS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jdXN0b21WaWV3cG9ydCA9IGN1c3RvbTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIENhbWVyYSBpbnN0YW5jZSBhbmQgaXRzIGludGVybmFsIHByb3BlcnRpZXMgYW5kIHJlZmVyZW5jZXMuXHJcbiAgICAgKiBPbmNlIGRlc3Ryb3llZCB5b3UgY2Fubm90IHVzZSB0aGlzIENhbWVyYSBhZ2FpbiwgZXZlbiBpZiByZS1hZGRlZCB0byBhIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBgQ2FtZXJhTWFuYWdlci5yZW1vdmVgIGlmIHRoYXQgbWV0aG9kcyBgcnVuRGVzdHJveWAgYXJndW1lbnQgaXMgYHRydWVgLCB3aGljaCBpcyB0aGUgZGVmYXVsdC5cclxuICAgICAqIFxyXG4gICAgICogVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgcmVhc29uIG90aGVyd2lzZSwgYWx3YXlzIHVzZSBgQ2FtZXJhTWFuYWdlci5yZW1vdmVgIGFuZCBhbGxvdyBpdCB0byBoYW5kbGUgdGhlIGNhbWVyYSBkZXN0cnVjdGlvbixcclxuICAgICAqIHJhdGhlciB0aGFuIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjZGVzdHJveVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0RFU1RST1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuREVTVFJPWSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWF0cml4LmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdWxsZWRPYmplY3RzID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jdXN0b21WaWV3cG9ydClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSdyZSB0dXJuaW5nIG9mZiBhIGN1c3RvbSB2aWV3cG9ydCBmb3IgdGhpcyBDYW1lcmFcclxuICAgICAgICAgICAgdGhpcy5zY2VuZU1hbmFnZXIuY3VzdG9tVmlld3BvcnRzLS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9ib3VuZHMgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNjYWxlTWFuYWdlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZU1hbmFnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhTWFuYWdlciA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHggcG9zaXRpb24gb2YgdGhlIENhbWVyYSB2aWV3cG9ydCwgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICAgICAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgYXJlYSBpbnRvIHdoaWNoIHRoZSBjYW1lcmEgcmVuZGVycy5cclxuICAgICAqIFRvIGFkanVzdCB0aGUgcG9zaXRpb24gdGhlIGNhbWVyYSBpcyBsb29raW5nIGF0IGluIHRoZSBnYW1lIHdvcmxkLCBzZWUgdGhlIGBzY3JvbGxYYCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjeFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB4OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl94O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5feCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9jeCA9IHZhbHVlICogdGhpcy5yZXNvbHV0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN5c3RlbSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHkgcG9zaXRpb24gb2YgdGhlIENhbWVyYSB2aWV3cG9ydCwgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICAgICAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgYXJlYSBpbnRvIHdoaWNoIHRoZSBjYW1lcmEgcmVuZGVycy5cclxuICAgICAqIFRvIGFkanVzdCB0aGUgcG9zaXRpb24gdGhlIGNhbWVyYSBpcyBsb29raW5nIGF0IGluIHRoZSBnYW1lIHdvcmxkLCBzZWUgdGhlIGBzY3JvbGxZYCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjeVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB5OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl95O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5feSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9jeSA9IHZhbHVlICogdGhpcy5yZXNvbHV0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN5c3RlbSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQsIGluIHBpeGVscy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdmlld3BvcnQgaXMgdGhlIGFyZWEgaW50byB3aGljaCB0aGUgQ2FtZXJhIHJlbmRlcnMuIFNldHRpbmcgdGhlIHZpZXdwb3J0IGRvZXNcclxuICAgICAqIG5vdCByZXN0cmljdCB3aGVyZSB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3dpZHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHdpZHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2N3ID0gdmFsdWUgKiB0aGlzLnJlc29sdXRpb247XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3lzdGVtKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBDYW1lcmEgdmlld3BvcnQsIGluIHBpeGVscy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdmlld3BvcnQgaXMgdGhlIGFyZWEgaW50byB3aGljaCB0aGUgQ2FtZXJhIHJlbmRlcnMuIFNldHRpbmcgdGhlIHZpZXdwb3J0IGRvZXNcclxuICAgICAqIG5vdCByZXN0cmljdCB3aGVyZSB0aGUgQ2FtZXJhIGNhbiBzY3JvbGwgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2hlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9jaCA9IHZhbHVlICogdGhpcy5yZXNvbHV0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN5c3RlbSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoaXMgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIENoYW5nZSB0aGlzIHZhbHVlIHRvIGNhdXNlIHRoZSBDYW1lcmEgdG8gc2Nyb2xsIGFyb3VuZCB5b3VyIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEFsdGVybmF0aXZlbHksIHNldHRpbmcgdGhlIENhbWVyYSB0byBmb2xsb3cgYSBHYW1lIE9iamVjdCwgdmlhIHRoZSBgc3RhcnRGb2xsb3dgIG1ldGhvZCxcclxuICAgICAqIHdpbGwgYXV0b21hdGljYWxseSBhZGp1c3QgdGhlIENhbWVyYSBzY3JvbGwgdmFsdWVzIGFjY29yZGluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gc2V0IHRoZSBib3VuZHMgd2l0aGluIHdoaWNoIHRoZSBDYW1lcmEgY2FuIHNjcm9sbCB2aWEgdGhlIGBzZXRCb3VuZHNgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmEjc2Nyb2xsWFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzY3JvbGxYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxYO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsWCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gb2YgdGhpcyBDYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQ2hhbmdlIHRoaXMgdmFsdWUgdG8gY2F1c2UgdGhlIENhbWVyYSB0byBzY3JvbGwgYXJvdW5kIHlvdXIgU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQWx0ZXJuYXRpdmVseSwgc2V0dGluZyB0aGUgQ2FtZXJhIHRvIGZvbGxvdyBhIEdhbWUgT2JqZWN0LCB2aWEgdGhlIGBzdGFydEZvbGxvd2AgbWV0aG9kLFxyXG4gICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgQ2FtZXJhIHNjcm9sbCB2YWx1ZXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBzZXQgdGhlIGJvdW5kcyB3aXRoaW4gd2hpY2ggdGhlIENhbWVyYSBjYW4gc2Nyb2xsIHZpYSB0aGUgYHNldEJvdW5kc2AgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNzY3JvbGxZXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNjcm9sbFk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbFk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxZID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIENhbWVyYSB6b29tIHZhbHVlLiBDaGFuZ2UgdGhpcyB2YWx1ZSB0byB6b29tIGluLCBvciBvdXQgb2YsIGEgU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQSB2YWx1ZSBvZiAwLjUgd291bGQgem9vbSB0aGUgQ2FtZXJhIG91dCwgc28geW91IGNhbiBub3cgc2VlIHR3aWNlIGFzIG11Y2hcclxuICAgICAqIG9mIHRoZSBTY2VuZSBhcyBiZWZvcmUuIEEgdmFsdWUgb2YgMiB3b3VsZCB6b29tIHRoZSBDYW1lcmEgaW4sIHNvIGV2ZXJ5IHBpeGVsXHJcbiAgICAgKiBub3cgdGFrZXMgdXAgMiBwaXhlbHMgd2hlbiByZW5kZXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBTZXQgdG8gMSB0byByZXR1cm4gdG8gdGhlIGRlZmF1bHQgem9vbSBsZXZlbC5cclxuICAgICAqXHJcbiAgICAgKiBCZSBjYXJlZnVsIHRvIG5ldmVyIHNldCB0aGlzIHZhbHVlIHRvIHplcm8uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3pvb21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgem9vbToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fem9vbTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3pvb20gPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcm90YXRpb24gb2YgdGhlIENhbWVyYSBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIENhbWVyYSByb3RhdGlvbiBhbHdheXMgdGFrZXMgcGxhY2UgYmFzZWQgb24gdGhlIENhbWVyYSB2aWV3cG9ydC4gQnkgZGVmYXVsdCwgcm90YXRpb24gaGFwcGVuc1xyXG4gICAgICogaW4gdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQuIFlvdSBjYW4gYWRqdXN0IHRoaXMgd2l0aCB0aGUgYG9yaWdpblhgIGFuZCBgb3JpZ2luWWAgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBSb3RhdGlvbiBpbmZsdWVuY2VzIHRoZSByZW5kZXJpbmcgb2YgX2FsbF8gR2FtZSBPYmplY3RzIHZpc2libGUgYnkgdGhpcyBDYW1lcmEuIEhvd2V2ZXIsIGl0IGRvZXMgbm90XHJcbiAgICAgKiByb3RhdGUgdGhlIENhbWVyYSB2aWV3cG9ydCBpdHNlbGYsIHdoaWNoIGFsd2F5cyByZW1haW5zIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI3JvdGF0aW9uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgcm90YXRpb246IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBDYW1lcmEncyB2aWV3cG9ydCwgcmVsYXRpdmUgdG8gdGhlIGxlZnQgb2YgdGhlIGdhbWUgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYSNjZW50ZXJYXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIGNlbnRlclg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueCArICgwLjUgKiB0aGlzLndpZHRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBDYW1lcmEncyB2aWV3cG9ydCwgcmVsYXRpdmUgdG8gdGhlIHRvcCBvZiB0aGUgZ2FtZSBjYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2NlbnRlcllcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgY2VudGVyWToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ICsgKDAuNSAqIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkaXNwbGF5ZWQgd2lkdGggb2YgdGhlIGNhbWVyYSB2aWV3cG9ydCwgZmFjdG9yaW5nIGluIHRoZSBjYW1lcmEgem9vbSBsZXZlbC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIGNhbWVyYSBoYXMgYSB2aWV3cG9ydCB3aWR0aCBvZiA4MDAgYW5kIGEgem9vbSBvZiAwLjUgdGhlbiBpdHMgZGlzcGxheSB3aWR0aFxyXG4gICAgICogd291bGQgYmUgMTYwMCwgYXMgaXQncyBkaXNwbGF5aW5nIHR3aWNlIGFzIG1hbnkgcGl4ZWxzIGFzIHpvb20gbGV2ZWwgMS5cclxuICAgICAqXHJcbiAgICAgKiBFcXVhbGx5LCBhIGNhbWVyYSB3aXRoIGEgd2lkdGggb2YgODAwIGFuZCB6b29tIG9mIDIgd291bGQgaGF2ZSBhIGRpc3BsYXkgd2lkdGhcclxuICAgICAqIG9mIDQwMCBwaXhlbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2Rpc3BsYXlXaWR0aFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5V2lkdGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggLyB0aGlzLnpvb207XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGlzcGxheWVkIGhlaWdodCBvZiB0aGUgY2FtZXJhIHZpZXdwb3J0LCBmYWN0b3JpbmcgaW4gdGhlIGNhbWVyYSB6b29tIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIElmIGEgY2FtZXJhIGhhcyBhIHZpZXdwb3J0IGhlaWdodCBvZiA2MDAgYW5kIGEgem9vbSBvZiAwLjUgdGhlbiBpdHMgZGlzcGxheSBoZWlnaHRcclxuICAgICAqIHdvdWxkIGJlIDEyMDAsIGFzIGl0J3MgZGlzcGxheWluZyB0d2ljZSBhcyBtYW55IHBpeGVscyBhcyB6b29tIGxldmVsIDEuXHJcbiAgICAgKlxyXG4gICAgICogRXF1YWxseSwgYSBjYW1lcmEgd2l0aCBhIGhlaWdodCBvZiA2MDAgYW5kIHpvb20gb2YgMiB3b3VsZCBoYXZlIGEgZGlzcGxheSBoZWlnaHRcclxuICAgICAqIG9mIDMwMCBwaXhlbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5CYXNlQ2FtZXJhI2Rpc3BsYXlIZWlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgZGlzcGxheUhlaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWlnaHQgLyB0aGlzLnpvb207XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ2FtZXJhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCYXNlQ2FtZXJhID0gcmVxdWlyZSgnLi9CYXNlQ2FtZXJhJyk7XHJcbnZhciBDYW52YXNQb29sID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzUG9vbCcpO1xyXG52YXIgQ2VudGVyT24gPSByZXF1aXJlKCcuLi8uLi9nZW9tL3JlY3RhbmdsZS9DZW50ZXJPbicpO1xyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cycpO1xyXG52YXIgRWZmZWN0cyA9IHJlcXVpcmUoJy4vZWZmZWN0cycpO1xyXG52YXIgTGluZWFyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9MaW5lYXInKTtcclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL1JlY3RhbmdsZScpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBDYW1lcmEuXHJcbiAqXHJcbiAqIFRoZSBDYW1lcmEgaXMgdGhlIHdheSBpbiB3aGljaCBhbGwgZ2FtZXMgYXJlIHJlbmRlcmVkIGluIFBoYXNlci4gVGhleSBwcm92aWRlIGEgdmlldyBpbnRvIHlvdXIgZ2FtZSB3b3JsZCxcclxuICogYW5kIGNhbiBiZSBwb3NpdGlvbmVkLCByb3RhdGVkLCB6b29tZWQgYW5kIHNjcm9sbGVkIGFjY29yZGluZ2x5LlxyXG4gKlxyXG4gKiBBIENhbWVyYSBjb25zaXN0cyBvZiB0d28gZWxlbWVudHM6IFRoZSB2aWV3cG9ydCBhbmQgdGhlIHNjcm9sbCB2YWx1ZXMuXHJcbiAqXHJcbiAqIFRoZSB2aWV3cG9ydCBpcyB0aGUgcGh5c2ljYWwgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIENhbWVyYSB3aXRoaW4geW91ciBnYW1lLiBDYW1lcmFzLCBieSBkZWZhdWx0LCBhcmVcclxuICogY3JlYXRlZCB0aGUgc2FtZSBzaXplIGFzIHlvdXIgZ2FtZSwgYnV0IHRoZWlyIHBvc2l0aW9uIGFuZCBzaXplIGNhbiBiZSBzZXQgdG8gYW55dGhpbmcuIFRoaXMgbWVhbnMgaWYgeW91XHJcbiAqIHdhbnRlZCB0byBjcmVhdGUgYSBjYW1lcmEgdGhhdCB3YXMgMzIweDIwMCBpbiBzaXplLCBwb3NpdGlvbmVkIGluIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIHlvdXIgZ2FtZSxcclxuICogeW91J2QgYWRqdXN0IHRoZSB2aWV3cG9ydCB0byBkbyB0aGF0ICh1c2luZyBtZXRob2RzIGxpa2UgYHNldFZpZXdwb3J0YCBhbmQgYHNldFNpemVgKS5cclxuICpcclxuICogSWYgeW91IHdpc2ggdG8gY2hhbmdlIHdoZXJlIHRoZSBDYW1lcmEgaXMgbG9va2luZyBpbiB5b3VyIGdhbWUsIHRoZW4geW91IHNjcm9sbCBpdC4gWW91IGNhbiBkbyB0aGlzXHJcbiAqIHZpYSB0aGUgcHJvcGVydGllcyBgc2Nyb2xsWGAgYW5kIGBzY3JvbGxZYCBvciB0aGUgbWV0aG9kIGBzZXRTY3JvbGxgLiBTY3JvbGxpbmcgaGFzIG5vIGltcGFjdCBvbiB0aGVcclxuICogdmlld3BvcnQsIGFuZCBjaGFuZ2luZyB0aGUgdmlld3BvcnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgc2Nyb2xsaW5nLlxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IGEgQ2FtZXJhIHdpbGwgcmVuZGVyIGFsbCBHYW1lIE9iamVjdHMgaXQgY2FuIHNlZS4gWW91IGNhbiBjaGFuZ2UgdGhpcyB1c2luZyB0aGUgYGlnbm9yZWAgbWV0aG9kLFxyXG4gKiBhbGxvd2luZyB5b3UgdG8gZmlsdGVyIEdhbWUgT2JqZWN0cyBvdXQgb24gYSBwZXItQ2FtZXJhIGJhc2lzLlxyXG4gKlxyXG4gKiBBIENhbWVyYSBhbHNvIGhhcyBidWlsdC1pbiBzcGVjaWFsIGVmZmVjdHMgaW5jbHVkaW5nIEZhZGUsIEZsYXNoIGFuZCBDYW1lcmEgU2hha2UuXHJcbiAqXHJcbiAqIEBjbGFzcyBDYW1lcmFcclxuICogQG1lbWJlcm9mIFBoYXNlci5DYW1lcmFzLlNjZW5lMkRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmFcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50XHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIENhbWVyYSwgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhLCByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgb2YgdGhlIGdhbWUgY2FudmFzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIENhbWVyYSwgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgQ2FtZXJhLCBpbiBwaXhlbHMuXHJcbiAqL1xyXG52YXIgQ2FtZXJhID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBCYXNlQ2FtZXJhLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuRmxpcCxcclxuICAgICAgICBDb21wb25lbnRzLlRpbnRcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDYW1lcmEgKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgQmFzZUNhbWVyYS5jYWxsKHRoaXMsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEb2VzIHRoaXMgQ2FtZXJhIGFsbG93IHRoZSBHYW1lIE9iamVjdHMgaXQgcmVuZGVycyB0byByZWNlaXZlIGlucHV0IGV2ZW50cz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2lucHV0RW5hYmxlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0RW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgRmFkZSBlZmZlY3QgaGFuZGxlci5cclxuICAgICAgICAgKiBUbyBmYWRlIHRoaXMgY2FtZXJhIHNlZSB0aGUgYENhbWVyYS5mYWRlYCBtZXRob2RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZmFkZUVmZmVjdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZX1cclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZhZGVFZmZlY3QgPSBuZXcgRWZmZWN0cy5GYWRlKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIEZsYXNoIGVmZmVjdCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRvIGZsYXNoIHRoaXMgY2FtZXJhIHNlZSB0aGUgYENhbWVyYS5mbGFzaGAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZmxhc2hFZmZlY3RcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZsYXNofVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmxhc2hFZmZlY3QgPSBuZXcgRWZmZWN0cy5GbGFzaCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIENhbWVyYSBTaGFrZSBlZmZlY3QgaGFuZGxlci5cclxuICAgICAgICAgKiBUbyBzaGFrZSB0aGlzIGNhbWVyYSBzZWUgdGhlIGBDYW1lcmEuc2hha2VgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3NoYWtlRWZmZWN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZX1cclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNoYWtlRWZmZWN0ID0gbmV3IEVmZmVjdHMuU2hha2UodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgUGFuIGVmZmVjdCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRvIHBhbiB0aGlzIGNhbWVyYSBzZWUgdGhlIGBDYW1lcmEucGFuYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNwYW5FZmZlY3RcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYW5FZmZlY3QgPSBuZXcgRWZmZWN0cy5QYW4odGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgUm90YXRlIFRvIGVmZmVjdCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRvIHJvdGF0ZSB0aGlzIGNhbWVyYSBzZWUgdGhlIGBDYW1lcmEucm90YXRlVG9gIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3JvdGF0ZVRvRWZmZWN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUb31cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yb3RhdGVUb0VmZmVjdCA9IG5ldyBFZmZlY3RzLlJvdGF0ZVRvKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIFpvb20gZWZmZWN0IGhhbmRsZXIuXHJcbiAgICAgICAgICogVG8gem9vbSB0aGlzIGNhbWVyYSBzZWUgdGhlIGBDYW1lcmEuem9vbWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjem9vbUVmZmVjdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuWm9vbX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy56b29tRWZmZWN0ID0gbmV3IEVmZmVjdHMuWm9vbSh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIHZhbHVlIHRvIHVzZSB3aGVuIGZvbGxvd2luZyBhIHRhcmdldC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIENhbiBhbHNvIGJlIHNldCB2aWEgYHNldExlcnBgIG9yIGFzIHBhcnQgb2YgdGhlIGBzdGFydEZvbGxvd2AgY2FsbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBvZiAxIG1lYW5zIHRoZSBjYW1lcmEgd2lsbCBpbnN0YW50bHkgc25hcCB0byB0aGUgdGFyZ2V0IGNvb3JkaW5hdGVzLlxyXG4gICAgICAgICAqIEEgbG93ZXIgdmFsdWUsIHN1Y2ggYXMgMC4xIG1lYW5zIHRoZSBjYW1lcmEgd2lsbCBtb3JlIHNsb3dseSB0cmFjayB0aGUgdGFyZ2V0LCBnaXZpbmdcclxuICAgICAgICAgKiBhIHNtb290aCB0cmFuc2l0aW9uLiBZb3UgY2FuIHNldCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgdmFsdWVzIGluZGVwZW5kZW50bHksIGFuZCBhbHNvXHJcbiAgICAgICAgICogYWRqdXN0IHRoaXMgdmFsdWUgaW4gcmVhbC10aW1lIGR1cmluZyB5b3VyIGdhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBCZSBzdXJlIHRvIGtlZXAgdGhlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4gQSB2YWx1ZSBvZiB6ZXJvIHdpbGwgZGlzYWJsZSB0cmFja2luZyBvbiB0aGF0IGF4aXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNsZXJwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sZXJwID0gbmV3IFZlY3RvcjIoMSwgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgcHJvcGVydHkgYXJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgQ2FtZXJhIHRhcmdldHMgcG9zaXRpb24sIGFsbG93aW5nIHlvdSB0b1xyXG4gICAgICAgICAqIG9mZnNldCB0aGUgY2FtZXJhIGZyb20gdGhlIGFjdHVhbCB0YXJnZXQgeC95IGNvb3JkaW5hdGVzIGJ5IHRoaXMgYW1vdW50LlxyXG4gICAgICAgICAqIENhbiBhbHNvIGJlIHNldCB2aWEgYHNldEZvbGxvd09mZnNldGAgb3IgYXMgcGFydCBvZiB0aGUgYHN0YXJ0Rm9sbG93YCBjYWxsLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZm9sbG93T2Zmc2V0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mb2xsb3dPZmZzZXQgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIGRlYWQgem9uZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBkZWFkem9uZSBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgY2FtZXJhIGlzIGZvbGxvd2luZyBhIHRhcmdldC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEl0IGRlZmluZXMgYSByZWN0YW5ndWxhciByZWdpb24gd2l0aGluIHdoaWNoIGlmIHRoZSB0YXJnZXQgaXMgcHJlc2VudCwgdGhlIGNhbWVyYSB3aWxsIG5vdCBzY3JvbGwuXHJcbiAgICAgICAgICogSWYgdGhlIHRhcmdldCBtb3ZlcyBvdXRzaWRlIG9mIHRoaXMgYXJlYSwgdGhlIGNhbWVyYSB3aWxsIGJlZ2luIHNjcm9sbGluZyBpbiBvcmRlciB0byBmb2xsb3cgaXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgYGxlcnBgIHZhbHVlcyB0aGF0IHlvdSBjYW4gc2V0IGZvciBhIGZvbGxvd2VyIHRhcmdldCBhbHNvIGFwcGx5IHdoZW4gdXNpbmcgYSBkZWFkem9uZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gZGlyZWN0bHkgc2V0IHRoaXMgcHJvcGVydHkgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgYSBSZWN0YW5nbGUuIE9yLCB5b3UgY2FuIHVzZSB0aGVcclxuICAgICAgICAgKiBgc2V0RGVhZHpvbmVgIG1ldGhvZCBmb3IgYSBjaGFpbmFibGUgYXBwcm9hY2guXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgcmVjdGFuZ2xlIHlvdSBwcm92aWRlIGNhbiBoYXZlIGl0cyBkaW1lbnNpb25zIGFkanVzdGVkIGR5bmFtaWNhbGx5LCBob3dldmVyLCBwbGVhc2VcclxuICAgICAgICAgKiBub3RlIHRoYXQgaXRzIHBvc2l0aW9uIGlzIHVwZGF0ZWQgZXZlcnkgZnJhbWUsIGFzIGl0IGlzIGNvbnN0YW50bHkgcmUtY2VudGVyZWQgb24gdGhlIGNhbWVyYXMgbWlkIHBvaW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQ2FsbGluZyBgc2V0RGVhZHpvbmVgIHdpdGggbm8gYXJndW1lbnRzIHdpbGwgcmVzZXQgYW4gYWN0aXZlIGRlYWR6b25lLCBhcyB3aWxsIHNldHRpbmcgdGhpcyBwcm9wZXJ0eVxyXG4gICAgICAgICAqIHRvIGBudWxsYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2RlYWR6b25lXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuR2VvbS5SZWN0YW5nbGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVhZHpvbmUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBmb2xsb3cgdGFyZ2V0IHJlZmVyZW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI19mb2xsb3dcclxuICAgICAgICAgKiBAdHlwZSB7P2FueX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9mb2xsb3cgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIENhbWVyYSByZW5kZXJpbmcgZGlyZWN0bHkgdG8gdGhlIGNhbnZhcyBvciB0byBhIHRleHR1cmU/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBFbmFibGUgcmVuZGVyaW5nIHRvIHRleHR1cmUgd2l0aCB0aGUgbWV0aG9kIGBzZXRSZW5kZXJUb1RleHR1cmVgIChqdXN0IGVuYWJsaW5nIHRoaXMgYm9vbGVhbiB3b24ndCBiZSBlbm91Z2gpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBPbmNlIGVuYWJsZWQgeW91IGNhbiB0b2dnbGUgaXQgYnkgc3dpdGNoaW5nIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUbyBwcm9wZXJseSByZW1vdmUgYSByZW5kZXIgdGV4dHVyZSB5b3Ugc2hvdWxkIGNhbGwgdGhlIGBjbGVhclJlbmRlclRvVGV4dHVyZSgpYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNyZW5kZXJUb1RleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlclRvVGV4dHVyZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIENhbWVyYSBpcyByZW5kZXJpbmcgdG8gYSB0ZXh0dXJlICh2aWEgYHNldFJlbmRlclRvVGV4dHVyZWApIHRoZW4geW91XHJcbiAgICAgICAgICogaGF2ZSB0aGUgb3B0aW9uIHRvIGNvbnRyb2wgaWYgaXQgc2hvdWxkIGFsc28gcmVuZGVyIHRvIHRoZSBHYW1lIGNhbnZhcyBhcyB3ZWxsLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGEgQ2FtZXJhIHdpbGwgcmVuZGVyIGJvdGggdG8gaXRzIHRleHR1cmUgYW5kIHRvIHRoZSBHYW1lIGNhbnZhcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBIb3dldmVyLCBpZiB5b3Ugc2V0IHRocyBwcm9wZXJ0eSB0byBgZmFsc2VgIGl0IHdpbGwgb25seSByZW5kZXIgdG8gdGhlIHRleHR1cmVcclxuICAgICAgICAgKiBhbmQgc2tpcCByZW5kZXJpbmcgdG8gdGhlIEdhbWUgY2FudmFzLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgQ2FtZXJhIGlzbid0IHJlbmRlcmluZyB0byBhIHRleHR1cmUgaGFzIG5vIGVmZmVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3JlbmRlclRvR2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJUb0dhbWUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIENhbWVyYSBoYXMgYmVlbiBzZXQgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSB0aGVuIHRoaXMgaG9sZHMgYSByZWZlcmVuY2VcclxuICAgICAgICAgKiB0byB0aGUgSFRNTCBDYW52YXMgRWxlbWVudCB0aGF0IHRoZSBDYW1lcmEgaXMgZHJhd2luZyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEVuYWJsZSB0ZXh0dXJlIHJlbmRlcmluZyB1c2luZyB0aGUgbWV0aG9kIGBzZXRSZW5kZXJUb1RleHR1cmVgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBpcyBvbmx5IHBvcHVsYXRlZCBpZiBQaGFzZXIgaXMgcnVubmluZyB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNjYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBDYW1lcmEgaGFzIGJlZW4gc2V0IHRvIHJlbmRlciB0byBhIHRleHR1cmUgdGhlbiB0aGlzIGhvbGRzIGEgcmVmZXJlbmNlXHJcbiAgICAgICAgICogdG8gdGhlIFJlbmRlcmluZyBDb250ZXh0IGJlbG9uZ2luZyB0byB0aGUgQ2FudmFzIGVsZW1lbnQgdGhlIENhbWVyYSBpcyBkcmF3aW5nIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRW5hYmxlIHRleHR1cmUgcmVuZGVyaW5nIHVzaW5nIHRoZSBtZXRob2QgYHNldFJlbmRlclRvVGV4dHVyZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGlzIG9ubHkgcG9wdWxhdGVkIGlmIFBoYXNlciBpcyBydW5uaW5nIHdpdGggdGhlIENhbnZhcyBSZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2NvbnRleHRcclxuICAgICAgICAgKiBAdHlwZSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIENhbWVyYSBoYXMgYmVlbiBzZXQgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSB0aGVuIHRoaXMgaG9sZHMgYSByZWZlcmVuY2VcclxuICAgICAgICAgKiB0byB0aGUgR0wgVGV4dHVyZSBiZWxvbmdpbmcgdGhlIENhbWVyYSBpcyBkcmF3aW5nIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRW5hYmxlIHRleHR1cmUgcmVuZGVyaW5nIHVzaW5nIHRoZSBtZXRob2QgYHNldFJlbmRlclRvVGV4dHVyZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGlzIG9ubHkgc2V0IGlmIFBoYXNlciBpcyBydW5uaW5nIHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZ2xUZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUgez9XZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBDYW1lcmEgaGFzIGJlZW4gc2V0IHRvIHJlbmRlciB0byBhIHRleHR1cmUgdGhlbiB0aGlzIGhvbGRzIGEgcmVmZXJlbmNlXHJcbiAgICAgICAgICogdG8gdGhlIEdMIEZyYW1lIEJ1ZmZlciBiZWxvbmdpbmcgdGhlIENhbWVyYSBpcyBkcmF3aW5nIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRW5hYmxlIHRleHR1cmUgcmVuZGVyaW5nIHVzaW5nIHRoZSBtZXRob2QgYHNldFJlbmRlclRvVGV4dHVyZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGlzIG9ubHkgc2V0IGlmIFBoYXNlciBpcyBydW5uaW5nIHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZnJhbWVidWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7P1dlYkdMRnJhbWVidWZmZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIENhbWVyYSBoYXMgYmVlbiBzZXQgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSBhbmQgdG8gdXNlIGEgY3VzdG9tIHBpcGVsaW5lLFxyXG4gICAgICAgICAqIHRoZW4gdGhpcyBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgcGlwZWxpbmUgdGhlIENhbWVyYSBpcyBkcmF3aW5nIHdpdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBFbmFibGUgdGV4dHVyZSByZW5kZXJpbmcgdXNpbmcgdGhlIG1ldGhvZCBgc2V0UmVuZGVyVG9UZXh0dXJlYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgaXMgb25seSBzZXQgaWYgUGhhc2VyIGlzIHJ1bm5pbmcgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNwaXBlbGluZVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGlwZWxpbmUgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIENhbWVyYSB0byByZW5kZXIgdG8gYSB0ZXh0dXJlIGluc3RlYWQgb2YgdG8gdGhlIG1haW4gY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBDYW1lcmEgd2lsbCByZWRpcmVjdCBhbGwgR2FtZSBPYmplY3RzIGl0J3MgYXNrZWQgdG8gcmVuZGVyIHRvIHRoaXMgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBEdXJpbmcgdGhlIHJlbmRlciBzZXF1ZW5jZSwgdGhlIHRleHR1cmUgaXRzZWxmIHdpbGwgdGhlbiBiZSByZW5kZXJlZCB0byB0aGUgbWFpbiBjYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogRG9pbmcgdGhpcyBnaXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gbW9kaWZ5IHRoZSB0ZXh0dXJlIGJlZm9yZSB0aGlzIGhhcHBlbnMsXHJcbiAgICAgKiBhbGxvd2luZyBmb3Igc3BlY2lhbCBlZmZlY3RzIHN1Y2ggYXMgQ2FtZXJhIHNwZWNpZmljIHNoYWRlcnMsIG9yIHBvc3QtcHJvY2Vzc2luZ1xyXG4gICAgICogb24gdGhlIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgcnVubmluZyB1bmRlciBDYW52YXMgdGhlIENhbWVyYSB3aWxsIHJlbmRlciB0byBpdHMgYGNhbnZhc2AgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgcnVubmluZyB1bmRlciBXZWJHTCB0aGUgQ2FtZXJhIHdpbGwgY3JlYXRlIGEgZnJhbWUgYnVmZmVyLCB3aGljaCBpcyBzdG9yZWQgaW4gaXRzIGBmcmFtZWJ1ZmZlcmAgYW5kIGBnbFRleHR1cmVgIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IHNldCBhIGNhbWVyYSB0byByZW5kZXIgdG8gYSB0ZXh0dXJlIHRoZW4gaXQgd2lsbCBlbWl0IDIgZXZlbnRzIGR1cmluZyB0aGUgcmVuZGVyIGxvb3A6XHJcbiAgICAgKlxyXG4gICAgICogRmlyc3QsIGl0IHdpbGwgZW1pdCB0aGUgZXZlbnQgYHByZXJlbmRlcmAuIFRoaXMgaGFwcGVucyByaWdodCBiZWZvcmUgYW55IEdhbWUgT2JqZWN0J3MgYXJlIGRyYXduIHRvIHRoZSBDYW1lcmEgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGVuLCBpdCB3aWxsIGVtaXQgdGhlIGV2ZW50IGBwb3N0cmVuZGVyYC4gVGhpcyBoYXBwZW5zIGFmdGVyIGFsbCBHYW1lIE9iamVjdCdzIGhhdmUgYmVlbiBkcmF3biwgYnV0IHJpZ2h0IGJlZm9yZSB0aGVcclxuICAgICAqIENhbWVyYSB0ZXh0dXJlIGlzIHJlbmRlcmVkIHRvIHRoZSBtYWluIGdhbWUgY2FudmFzLiBJdCdzIHRoZSBmaW5hbCBwb2ludCBhdCB3aGljaCB5b3UgY2FuIG1hbmlwdWxhdGUgdGhlIHRleHR1cmUgYmVmb3JlXHJcbiAgICAgKiBpdCBhcHBlYXJzIGluLWdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogWW91IHNob3VsZCBub3QgZW5hYmxlIHRoaXMgdW5sZXNzIHlvdSBwbGFuIG9uIGFjdHVhbGx5IHVzaW5nIHRoZSB0ZXh0dXJlIGl0IGNyZWF0ZXNcclxuICAgICAqIHNvbWVob3csIG90aGVyd2lzZSB5b3UncmUganVzdCBkb3VibGluZyB0aGUgd29yayByZXF1aXJlZCB0byByZW5kZXIgeW91ciBnYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugb25seSByZXF1aXJlIHRoZSBDYW1lcmEgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSwgYW5kIG5vdCBhbHNvIHRvIHRoZSBHYW1lLFxyXG4gICAgICogdGhlbSBzZXQgdGhlIGByZW5kZXJUb0dhbWVgIHBhcmFtZXRlciB0byBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIFRvIHRlbXBvcmFyaWx5IGRpc2FibGUgcmVuZGVyaW5nIHRvIGEgdGV4dHVyZSwgdG9nZ2xlIHRoZSBgcmVuZGVyVG9UZXh0dXJlYCBib29sZWFuLlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSBubyBsb25nZXIgcmVxdWlyZSB0aGUgQ2FtZXJhIHRvIHJlbmRlciB0byBhIHRleHR1cmUsIGNhbGwgdGhlIGBjbGVhclJlbmRlclRvVGV4dHVyZWAgbWV0aG9kLFxyXG4gICAgICogd2hpY2ggd2lsbCBkZWxldGUgdGhlIHJlc3BlY3RpdmUgdGV4dHVyZXMgYW5kIGZyZWUtdXAgcmVzb3VyY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjc2V0UmVuZGVyVG9UZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lKX0gW3BpcGVsaW5lXSAtIEFuIG9wdGlvbmFsIFdlYkdMIFBpcGVsaW5lIHRvIHJlbmRlciB3aXRoLCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBwaXBlbGluZSwgb3IgYSBwaXBlbGluZSByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW5kZXJUb0dhbWU9dHJ1ZV0gLSBJZiB5b3UgZG8gbm90IG5lZWQgdGhlIENhbWVyYSB0byBzdGlsbCByZW5kZXIgdG8gdGhlIEdhbWUsIHNldCB0aGlzIHBhcmFtZXRlciB0byBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRSZW5kZXJUb1RleHR1cmU6IGZ1bmN0aW9uIChwaXBlbGluZSwgcmVuZGVyVG9HYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyZW5kZXJUb0dhbWUgPT09IHVuZGVmaW5lZCkgeyByZW5kZXJUb0dhbWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMuc2NlbmUuc3lzLmdhbWUucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlci5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gcmVuZGVyZXIuY3JlYXRlVGV4dHVyZUZyb21Tb3VyY2UobnVsbCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDApO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gcmVuZGVyZXIuY3JlYXRlRnJhbWVidWZmZXIodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMuZ2xUZXh0dXJlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUyRCh0aGlzLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlbmRlclRvVGV4dHVyZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJUb0dhbWUgPSByZW5kZXJUb0dhbWU7XHJcblxyXG4gICAgICAgIGlmIChwaXBlbGluZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgV2ViR0wgcGlwZWxpbmUgdGhpcyBDYW1lcmEgaXMgdXNpbmcgd2hlbiByZW5kZXJpbmcgdG8gYSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gcGFzcyBlaXRoZXIgdGhlIHN0cmluZy1iYXNlZCBuYW1lIG9mIHRoZSBwaXBlbGluZSwgb3IgYSByZWZlcmVuY2UgdG8gdGhlIHBpcGVsaW5lIGl0c2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIHRvIGNsZWFyIGFueSBwcmV2aW91c2x5IHNldCBwaXBlbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3NldFBpcGVsaW5lXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lKX0gW3BpcGVsaW5lXSAtIFRoZSBXZWJHTCBQaXBlbGluZSB0byByZW5kZXIgd2l0aCwgY2FuIGJlIGVpdGhlciBhIHN0cmluZyB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgcGlwZWxpbmUsIG9yIGEgcGlwZWxpbmUgcmVmZXJlbmNlLiBPciBpZiBsZWZ0IGVtcHR5IGl0IHdpbGwgY2xlYXIgdGhlIHBpcGVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRQaXBlbGluZTogZnVuY3Rpb24gKHBpcGVsaW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGlwZWxpbmUgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5zY2VuZS5zeXMuZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZW5kZXJlci5nbCAmJiByZW5kZXJlci5oYXNQaXBlbGluZShwaXBlbGluZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGlwZWxpbmUgPSByZW5kZXJlci5nZXRQaXBlbGluZShwaXBlbGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5waXBlbGluZSA9IHBpcGVsaW5lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhpcyBDYW1lcmEgd2FzIHNldCB0byByZW5kZXIgdG8gYSB0ZXh0dXJlLCB0aGlzIHdpbGwgY2xlYXIgdGhlIHJlc291cmNlcyBpdCB3YXMgdXNpbmcgYW5kXHJcbiAgICAgKiByZWRpcmVjdCBpdCB0byByZW5kZXIgYmFjayB0byB0aGUgcHJpbWFyeSBDYW52YXMgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IG9ubHkgd2lzaCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHJlbmRlcmluZyB0byBhIHRleHR1cmUgdGhlbiB5b3UgY2FuIHRvZ2dsZSB0aGVcclxuICAgICAqIHByb3BlcnR5IGByZW5kZXJUb1RleHR1cmVgIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNjbGVhclJlbmRlclRvVGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjbGVhclJlbmRlclRvVGV4dHVyZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnNjZW5lLnN5cy5nYW1lLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICBpZiAoIXJlbmRlcmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVyLmdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZnJhbWVidWZmZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5nbFRleHR1cmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5nbFRleHR1cmUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnBpcGVsaW5lID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlbmRlclRvVGV4dHVyZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBDYW1lcmEgZGVhZCB6b25lLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBkZWFkem9uZSBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgY2FtZXJhIGlzIGZvbGxvd2luZyBhIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBkZWZpbmVzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIHdpdGhpbiB3aGljaCBpZiB0aGUgdGFyZ2V0IGlzIHByZXNlbnQsIHRoZSBjYW1lcmEgd2lsbCBub3Qgc2Nyb2xsLlxyXG4gICAgICogSWYgdGhlIHRhcmdldCBtb3ZlcyBvdXRzaWRlIG9mIHRoaXMgYXJlYSwgdGhlIGNhbWVyYSB3aWxsIGJlZ2luIHNjcm9sbGluZyBpbiBvcmRlciB0byBmb2xsb3cgaXQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRlYWR6b25lIHJlY3RhbmdsZSBpcyByZS1wb3NpdGlvbmVkIGV2ZXJ5IGZyYW1lIHNvIHRoYXQgaXQgaXMgY2VudGVyZWQgb24gdGhlIG1pZC1wb2ludFxyXG4gICAgICogb2YgdGhlIGNhbWVyYS4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSB0aGUgb2JqZWN0IGZvciBhZGRpdGlvbmFsIGdhbWUgcmVsYXRlZCBjaGVja3MsIHN1Y2ggYXNcclxuICAgICAqIHRlc3RpbmcgaWYgYW4gb2JqZWN0IGlzIHdpdGhpbiBpdCBvciBub3QgdmlhIGEgUmVjdGFuZ2xlLmNvbnRhaW5zIGNhbGwuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGBsZXJwYCB2YWx1ZXMgdGhhdCB5b3UgY2FuIHNldCBmb3IgYSBmb2xsb3dlciB0YXJnZXQgYWxzbyBhcHBseSB3aGVuIHVzaW5nIGEgZGVhZHpvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyB3aWxsIHJlc2V0IGFuIGFjdGl2ZSBkZWFkem9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3NldERlYWR6b25lXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGRlYWR6b25lIHJlY3RhbmdsZSBpbiBwaXhlbHMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGRlYWR6b25lIGlzIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBkZWFkem9uZSByZWN0YW5nbGUgaW4gcGl4ZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXREZWFkem9uZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRlYWR6b25lID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVhZHpvbmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVhZHpvbmUud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVhZHpvbmUuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWFkem9uZSA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb2xsb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5YID0gdGhpcy53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luWSA9IHRoaXMuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZnggPSB0aGlzLl9mb2xsb3cueCAtIHRoaXMuZm9sbG93T2Zmc2V0Lng7XHJcbiAgICAgICAgICAgICAgICB2YXIgZnkgPSB0aGlzLl9mb2xsb3cueSAtIHRoaXMuZm9sbG93T2Zmc2V0Lnk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5taWRQb2ludC5zZXQoZngsIGZ5KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFggPSBmeCAtIG9yaWdpblg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFkgPSBmeSAtIG9yaWdpblk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIENlbnRlck9uKHRoaXMuZGVhZHpvbmUsIHRoaXMubWlkUG9pbnQueCwgdGhpcy5taWRQb2ludC55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhZGVzIHRoZSBDYW1lcmEgaW4gZnJvbSB0aGUgZ2l2ZW4gY29sb3Igb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZmFkZUluXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9JTl9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfSU5fQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTEwMDBdIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcmVkPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSByZWQgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ3JlZW49MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGdyZWVuIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGJsdWUgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSAtIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdC5cclxuICAgICAqIEl0IGlzIHNlbnQgdHdvIGFyZ3VtZW50czogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYSBhbmQgYSBwcm9ncmVzcyBhbW91bnQgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaG93IGNvbXBsZXRlIHRoZSBlZmZlY3QgaXMuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIERlZmF1bHRzIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGUgQ2FtZXJhIGJlbG9uZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGZhZGVJbjogZnVuY3Rpb24gKGR1cmF0aW9uLCByZWQsIGdyZWVuLCBibHVlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mYWRlRWZmZWN0LnN0YXJ0KGZhbHNlLCBkdXJhdGlvbiwgcmVkLCBncmVlbiwgYmx1ZSwgdHJ1ZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhZGVzIHRoZSBDYW1lcmEgb3V0IHRvIHRoZSBnaXZlbiBjb2xvciBvdmVyIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQuXHJcbiAgICAgKiBUaGlzIGlzIGFuIGFsaWFzIGZvciBDYW1lcmEuZmFkZSB0aGF0IGZvcmNlcyB0aGUgZmFkZSB0byBzdGFydCwgcmVnYXJkbGVzcyBvZiBleGlzdGluZyBmYWRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2ZhZGVPdXRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGQURFX09VVF9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfT1VUX0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkdXJhdGlvbj0xMDAwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3JlZD0wXSAtIFRoZSBhbW91bnQgdG8gZmFkZSB0aGUgcmVkIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2dyZWVuPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSBncmVlbiBjaGFubmVsIHRvd2FyZHMuIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtibHVlPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSBibHVlIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKiBJdCBpcyBzZW50IHR3byBhcmd1bWVudHM6IEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEgYW5kIGEgcHJvZ3Jlc3MgYW1vdW50IGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBjb21wbGV0ZSB0aGUgZWZmZWN0IGlzLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLiBEZWZhdWx0cyB0byB0aGUgU2NlbmUgdG8gd2hpY2ggdGhlIENhbWVyYSBiZWxvbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBmYWRlT3V0OiBmdW5jdGlvbiAoZHVyYXRpb24sIHJlZCwgZ3JlZW4sIGJsdWUsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZhZGVFZmZlY3Quc3RhcnQodHJ1ZSwgZHVyYXRpb24sIHJlZCwgZ3JlZW4sIGJsdWUsIHRydWUsIGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGYWRlcyB0aGUgQ2FtZXJhIGZyb20gdGhlIGdpdmVuIGNvbG9yIHRvIHRyYW5zcGFyZW50IG92ZXIgdGhlIGR1cmF0aW9uIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2ZhZGVGcm9tXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9JTl9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfSU5fQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTEwMDBdIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcmVkPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSByZWQgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ3JlZW49MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGdyZWVuIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGJsdWUgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gRm9yY2UgdGhlIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCB0d28gYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhIGFuZCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcy5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZmFkZUZyb206IGZ1bmN0aW9uIChkdXJhdGlvbiwgcmVkLCBncmVlbiwgYmx1ZSwgZm9yY2UsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZhZGVFZmZlY3Quc3RhcnQoZmFsc2UsIGR1cmF0aW9uLCByZWQsIGdyZWVuLCBibHVlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhZGVzIHRoZSBDYW1lcmEgZnJvbSB0cmFuc3BhcmVudCB0byB0aGUgZ2l2ZW4gY29sb3Igb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjZmFkZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfT1VUX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9PVVRfQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTEwMDBdIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcmVkPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSByZWQgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ3JlZW49MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGdyZWVuIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGJsdWUgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gRm9yY2UgdGhlIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCB0d28gYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhIGFuZCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcy5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZmFkZTogZnVuY3Rpb24gKGR1cmF0aW9uLCByZWQsIGdyZWVuLCBibHVlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFkZUVmZmVjdC5zdGFydCh0cnVlLCBkdXJhdGlvbiwgcmVkLCBncmVlbiwgYmx1ZSwgZm9yY2UsIGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGFzaGVzIHRoZSBDYW1lcmEgYnkgc2V0dGluZyBpdCB0byB0aGUgZ2l2ZW4gY29sb3IgaW1tZWRpYXRlbHkgYW5kIHRoZW4gZmFkaW5nIGl0IGF3YXkgYWdhaW4gcXVpY2tseSBvdmVyIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNmbGFzaFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZMQVNIX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkxBU0hfQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTI1MF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtyZWQ9MjU1XSAtIFRoZSBhbW91bnQgdG8gZmFkZSB0aGUgcmVkIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2dyZWVuPTI1NV0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGdyZWVuIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MjU1XSAtIFRoZSBhbW91bnQgdG8gZmFkZSB0aGUgYmx1ZSBjaGFubmVsIHRvd2FyZHMuIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBGb3JjZSB0aGUgZWZmZWN0IHRvIHN0YXJ0IGltbWVkaWF0ZWx5LCBldmVuIGlmIGFscmVhZHkgcnVubmluZy5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKiBJdCBpcyBzZW50IHR3byBhcmd1bWVudHM6IEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEgYW5kIGEgcHJvZ3Jlc3MgYW1vdW50IGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBjb21wbGV0ZSB0aGUgZWZmZWN0IGlzLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLiBEZWZhdWx0cyB0byB0aGUgU2NlbmUgdG8gd2hpY2ggdGhlIENhbWVyYSBiZWxvbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBmbGFzaDogZnVuY3Rpb24gKGR1cmF0aW9uLCByZWQsIGdyZWVuLCBibHVlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhc2hFZmZlY3Quc3RhcnQoZHVyYXRpb24sIHJlZCwgZ3JlZW4sIGJsdWUsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hha2VzIHRoZSBDYW1lcmEgYnkgdGhlIGdpdmVuIGludGVuc2l0eSBvdmVyIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNzaGFrZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1NIQUtFX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjU0hBS0VfQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTEwMF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8UGhhc2VyLk1hdGguVmVjdG9yMil9IFtpbnRlbnNpdHk9MC4wNV0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBzaGFrZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIEZvcmNlIHRoZSBzaGFrZSBlZmZlY3QgdG8gc3RhcnQgaW1tZWRpYXRlbHksIGV2ZW4gaWYgYWxyZWFkeSBydW5uaW5nLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSAtIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdC5cclxuICAgICAqIEl0IGlzIHNlbnQgdHdvIGFyZ3VtZW50czogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYSBhbmQgYSBwcm9ncmVzcyBhbW91bnQgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaG93IGNvbXBsZXRlIHRoZSBlZmZlY3QgaXMuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIERlZmF1bHRzIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGUgQ2FtZXJhIGJlbG9uZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNoYWtlOiBmdW5jdGlvbiAoZHVyYXRpb24sIGludGVuc2l0eSwgZm9yY2UsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNoYWtlRWZmZWN0LnN0YXJ0KGR1cmF0aW9uLCBpbnRlbnNpdHksIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBlZmZlY3Qgd2lsbCBzY3JvbGwgdGhlIENhbWVyYSBzbyB0aGF0IHRoZSBjZW50ZXIgb2YgaXRzIHZpZXdwb3J0IGZpbmlzaGVzIGF0IHRoZSBnaXZlbiBkZXN0aW5hdGlvbixcclxuICAgICAqIG92ZXIgdGhlIGR1cmF0aW9uIGFuZCB3aXRoIHRoZSBlYXNlIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3BhblxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1BBTl9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1BBTl9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGRlc3RpbmF0aW9uIHggY29vcmRpbmF0ZSB0byBzY3JvbGwgdGhlIGNlbnRlciBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0IHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZGVzdGluYXRpb24geSBjb29yZGluYXRlIHRvIHNjcm9sbCB0aGUgY2VudGVyIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkdXJhdGlvbj0xMDAwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbil9IFtlYXNlPSdMaW5lYXInXSAtIFRoZSBlYXNlIHRvIHVzZSBmb3IgdGhlIHBhbi4gQ2FuIGJlIGFueSBvZiB0aGUgUGhhc2VyIEVhc2luZyBjb25zdGFudHMgb3IgYSBjdXN0b20gZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBGb3JjZSB0aGUgcGFuIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhUGFuQ2FsbGJhY2t9IFtjYWxsYmFja10gLSBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKiBJdCBpcyBzZW50IGZvdXIgYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhLCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcyxcclxuICAgICAqIHRoZSBjdXJyZW50IGNhbWVyYSBzY3JvbGwgeCBjb29yZGluYXRlIGFuZCB0aGUgY3VycmVudCBjYW1lcmEgc2Nyb2xsIHkgY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcGFuOiBmdW5jdGlvbiAoeCwgeSwgZHVyYXRpb24sIGVhc2UsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYW5FZmZlY3Quc3RhcnQoeCwgeSwgZHVyYXRpb24sIGVhc2UsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBlZmZlY3Qgd2lsbCByb3RhdGUgdGhlIENhbWVyYSBzbyB0aGF0IHRoZSB2aWV3cG9ydCBmaW5pc2hlcyBhdCB0aGUgZ2l2ZW4gYW5nbGUgaW4gcmFkaWFucyxcclxuICAgICAqIG92ZXIgdGhlIGR1cmF0aW9uIGFuZCB3aXRoIHRoZSBlYXNlIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3JvdGF0ZVRvXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBUaGUgZGVzdGluYXRpb24gYW5nbGUgaW4gcmFkaWFucyB0byByb3RhdGUgdGhlIENhbWVyYSB2aWV3cG9ydCB0by4gSWYgdGhlIGFuZ2xlIGlzIHBvc2l0aXZlIHRoZW4gdGhlIHJvdGF0aW9uIGlzIGNsb2Nrd2lzZSBlbHNlIGFudGljbG9ja3dpc2VcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3J0ZXN0UGF0aD1mYWxzZV0gLSBJZiBzaG9ydGVzdCBwYXRoIGlzIHNldCB0byB0cnVlIHRoZSBjYW1lcmEgd2lsbCByb3RhdGUgaW4gdGhlIHF1aWNrZXN0IGRpcmVjdGlvbiBjbG9ja3dpc2Ugb3IgYW50aS1jbG9ja3dpc2UuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkdXJhdGlvbj0xMDAwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbil9IFtlYXNlPSdMaW5lYXInXSAtIFRoZSBlYXNlIHRvIHVzZSBmb3IgdGhlIHJvdGF0aW9uLiBDYW4gYmUgYW55IG9mIHRoZSBQaGFzZXIgRWFzaW5nIGNvbnN0YW50cyBvciBhIGN1c3RvbSBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIEZvcmNlIHRoZSByb3RhdGlvbiBlZmZlY3QgdG8gc3RhcnQgaW1tZWRpYXRlbHksIGV2ZW4gaWYgYWxyZWFkeSBydW5uaW5nLlxyXG4gICAgICogQHBhcmFtIHtDYW1lcmFSb3RhdGVDYWxsYmFja30gW2NhbGxiYWNrXSAtIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdC5cclxuICAgICAqIEl0IGlzIHNlbnQgZm91ciBhcmd1bWVudHM6IEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEsIGEgcHJvZ3Jlc3MgYW1vdW50IGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBjb21wbGV0ZSB0aGUgZWZmZWN0IGlzLFxyXG4gICAgICogdGhlIGN1cnJlbnQgY2FtZXJhIHJvdGF0aW9uIGFuZ2xlIGluIHJhZGlhbnMuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIERlZmF1bHRzIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGUgQ2FtZXJhIGJlbG9uZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByb3RhdGVUbzogZnVuY3Rpb24gKHJhZGlhbnMsIHNob3J0ZXN0UGF0aCwgZHVyYXRpb24sIGVhc2UsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGVUb0VmZmVjdC5zdGFydChyYWRpYW5zLCBzaG9ydGVzdFBhdGgsIGR1cmF0aW9uLCBlYXNlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZWZmZWN0IHdpbGwgem9vbSB0aGUgQ2FtZXJhIHRvIHRoZSBnaXZlbiBzY2FsZSwgb3ZlciB0aGUgZHVyYXRpb24gYW5kIHdpdGggdGhlIGVhc2Ugc3BlY2lmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjem9vbVRvXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjWk9PTV9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1pPT01fQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbSAtIFRoZSB0YXJnZXQgQ2FtZXJhIHpvb20gdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkdXJhdGlvbj0xMDAwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbil9IFtlYXNlPSdMaW5lYXInXSAtIFRoZSBlYXNlIHRvIHVzZSBmb3IgdGhlIHBhbi4gQ2FuIGJlIGFueSBvZiB0aGUgUGhhc2VyIEVhc2luZyBjb25zdGFudHMgb3IgYSBjdXN0b20gZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBGb3JjZSB0aGUgcGFuIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhUGFuQ2FsbGJhY2t9IFtjYWxsYmFja10gLSBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKiBJdCBpcyBzZW50IGZvdXIgYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhLCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcyxcclxuICAgICAqIHRoZSBjdXJyZW50IGNhbWVyYSBzY3JvbGwgeCBjb29yZGluYXRlIGFuZCB0aGUgY3VycmVudCBjYW1lcmEgc2Nyb2xsIHkgY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgem9vbVRvOiBmdW5jdGlvbiAoem9vbSwgZHVyYXRpb24sIGVhc2UsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56b29tRWZmZWN0LnN0YXJ0KHpvb20sIGR1cmF0aW9uLCBlYXNlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHByZVJlbmRlciBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjcHJlUmVuZGVyXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFRoZSBnYW1lIHJlc29sdXRpb24sIGFzIHNldCBpbiB0aGUgU2NhbGUgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcHJlUmVuZGVyOiBmdW5jdGlvbiAocmVzb2x1dGlvbilcclxuICAgIHtcclxuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoICogMC41O1xyXG4gICAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0ICogMC41O1xyXG5cclxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuem9vbSAqIHJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgb3JpZ2luWCA9IHdpZHRoICogdGhpcy5vcmlnaW5YO1xyXG4gICAgICAgIHZhciBvcmlnaW5ZID0gaGVpZ2h0ICogdGhpcy5vcmlnaW5ZO1xyXG5cclxuICAgICAgICB2YXIgZm9sbG93ID0gdGhpcy5fZm9sbG93O1xyXG4gICAgICAgIHZhciBkZWFkem9uZSA9IHRoaXMuZGVhZHpvbmU7XHJcblxyXG4gICAgICAgIHZhciBzeCA9IHRoaXMuc2Nyb2xsWDtcclxuICAgICAgICB2YXIgc3kgPSB0aGlzLnNjcm9sbFk7XHJcblxyXG4gICAgICAgIGlmIChkZWFkem9uZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENlbnRlck9uKGRlYWR6b25lLCB0aGlzLm1pZFBvaW50LngsIHRoaXMubWlkUG9pbnQueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9sbG93ICYmICF0aGlzLnBhbkVmZmVjdC5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZnggPSAoZm9sbG93LnggLSB0aGlzLmZvbGxvd09mZnNldC54KTtcclxuICAgICAgICAgICAgdmFyIGZ5ID0gKGZvbGxvdy55IC0gdGhpcy5mb2xsb3dPZmZzZXQueSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVhZHpvbmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChmeCA8IGRlYWR6b25lLngpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ggPSBMaW5lYXIoc3gsIHN4IC0gKGRlYWR6b25lLnggLSBmeCksIHRoaXMubGVycC54KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZ4ID4gZGVhZHpvbmUucmlnaHQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ggPSBMaW5lYXIoc3gsIHN4ICsgKGZ4IC0gZGVhZHpvbmUucmlnaHQpLCB0aGlzLmxlcnAueCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZ5IDwgZGVhZHpvbmUueSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzeSA9IExpbmVhcihzeSwgc3kgLSAoZGVhZHpvbmUueSAtIGZ5KSwgdGhpcy5sZXJwLnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZnkgPiBkZWFkem9uZS5ib3R0b20pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3kgPSBMaW5lYXIoc3ksIHN5ICsgKGZ5IC0gZGVhZHpvbmUuYm90dG9tKSwgdGhpcy5sZXJwLnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3ggPSBMaW5lYXIoc3gsIGZ4IC0gb3JpZ2luWCwgdGhpcy5sZXJwLngpO1xyXG4gICAgICAgICAgICAgICAgc3kgPSBMaW5lYXIoc3ksIGZ5IC0gb3JpZ2luWSwgdGhpcy5sZXJwLnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy51c2VCb3VuZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzeCA9IHRoaXMuY2xhbXBYKHN4KTtcclxuICAgICAgICAgICAgc3kgPSB0aGlzLmNsYW1wWShzeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb3VuZFBpeGVscylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9yaWdpblggPSBNYXRoLnJvdW5kKG9yaWdpblgpO1xyXG4gICAgICAgICAgICBvcmlnaW5ZID0gTWF0aC5yb3VuZChvcmlnaW5ZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBWYWx1ZXMgYXJlIGluIHBpeGVscyBhbmQgbm90IGltcGFjdGVkIGJ5IHpvb21pbmcgdGhlIENhbWVyYVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsWCA9IHN4O1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsWSA9IHN5O1xyXG5cclxuICAgICAgICB2YXIgbWlkWCA9IHN4ICsgaGFsZldpZHRoO1xyXG4gICAgICAgIHZhciBtaWRZID0gc3kgKyBoYWxmSGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyAgVGhlIGNlbnRlciBvZiB0aGUgY2FtZXJhLCBpbiB3b3JsZCBzcGFjZSwgc28gdGFraW5nIHpvb20gaW50byBhY2NvdW50XHJcbiAgICAgICAgLy8gIEJhc2ljYWxseSB0aGUgcGl4ZWwgdmFsdWUgb2Ygd2hhdCBpdCdzIGxvb2tpbmcgYXQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2FtXHJcbiAgICAgICAgdGhpcy5taWRQb2ludC5zZXQobWlkWCwgbWlkWSk7XHJcblxyXG4gICAgICAgIHZhciBkaXNwbGF5V2lkdGggPSB3aWR0aCAvIHpvb207XHJcbiAgICAgICAgdmFyIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQgLyB6b29tO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkVmlldy5zZXRUbyhcclxuICAgICAgICAgICAgbWlkWCAtIChkaXNwbGF5V2lkdGggLyAyKSxcclxuICAgICAgICAgICAgbWlkWSAtIChkaXNwbGF5SGVpZ2h0IC8gMiksXHJcbiAgICAgICAgICAgIGRpc3BsYXlXaWR0aCxcclxuICAgICAgICAgICAgZGlzcGxheUhlaWdodFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIG1hdHJpeC5hcHBseUlUUlModGhpcy54ICsgb3JpZ2luWCwgdGhpcy55ICsgb3JpZ2luWSwgdGhpcy5yb3RhdGlvbiwgem9vbSwgem9vbSk7XHJcbiAgICAgICAgbWF0cml4LnRyYW5zbGF0ZSgtb3JpZ2luWCwgLW9yaWdpblkpO1xyXG5cclxuICAgICAgICB0aGlzLnNoYWtlRWZmZWN0LnByZVJlbmRlcigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIHZhbHVlIHRvIHVzZSB3aGVuIGZvbGxvd2luZyBhIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgb2YgMSBtZWFucyB0aGUgY2FtZXJhIHdpbGwgaW5zdGFudGx5IHNuYXAgdG8gdGhlIHRhcmdldCBjb29yZGluYXRlcy5cclxuICAgICAqIEEgbG93ZXIgdmFsdWUsIHN1Y2ggYXMgMC4xIG1lYW5zIHRoZSBjYW1lcmEgd2lsbCBtb3JlIHNsb3dseSB0cmFjayB0aGUgdGFyZ2V0LCBnaXZpbmdcclxuICAgICAqIGEgc21vb3RoIHRyYW5zaXRpb24uIFlvdSBjYW4gc2V0IHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCB2YWx1ZXMgaW5kZXBlbmRlbnRseSwgYW5kIGFsc29cclxuICAgICAqIGFkanVzdCB0aGlzIHZhbHVlIGluIHJlYWwtdGltZSBkdXJpbmcgeW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEJlIHN1cmUgdG8ga2VlcCB0aGUgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLiBBIHZhbHVlIG9mIHplcm8gd2lsbCBkaXNhYmxlIHRyYWNraW5nIG9uIHRoYXQgYXhpcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI3NldExlcnBcclxuICAgICAqIEBzaW5jZSAzLjkuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0xXSAtIFRoZSBhbW91bnQgYWRkZWQgdG8gdGhlIGhvcml6b250YWwgbGluZWFyIGludGVycG9sYXRpb24gb2YgdGhlIGZvbGxvdyB0YXJnZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MV0gLSBUaGUgYW1vdW50IGFkZGVkIHRvIHRoZSB2ZXJ0aWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiB0aGUgZm9sbG93IHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TGVycDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMTsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5sZXJwLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBjYW1lcmEgZnJvbSBpdHMgZm9sbG93IHRhcmdldC5cclxuICAgICAqIFRoZSB2YWx1ZXMgYXJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0cyBwb3NpdGlvbiBkdXJpbmcgdGhlIENhbWVyYXMgdXBkYXRlIHN0ZXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNzZXRGb2xsb3dPZmZzZXRcclxuICAgICAqIEBzaW5jZSAzLjkuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBjYW1lcmEgZm9sbG93IHRhcmdldC54IHBvc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBjYW1lcmEgZm9sbG93IHRhcmdldC55IHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FtZXJhIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGb2xsb3dPZmZzZXQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9sbG93T2Zmc2V0LnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQ2FtZXJhIHRvIGZvbGxvdyBhIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gZW5hYmxlZCB0aGUgQ2FtZXJhIHdpbGwgYXV0b21hdGljYWxseSBhZGp1c3QgaXRzIHNjcm9sbCBwb3NpdGlvbiB0byBrZWVwIHRoZSB0YXJnZXQgR2FtZSBPYmplY3RcclxuICAgICAqIGluIGl0cyBjZW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBzZXQgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIHZhbHVlIHVzZWQgaW4gdGhlIGZvbGxvdyBjb2RlLlxyXG4gICAgICogVXNlIGxvdyBsZXJwIHZhbHVlcyAoc3VjaCBhcyAwLjEpIHRvIGF1dG9tYXRpY2FsbHkgc21vb3RoIHRoZSBjYW1lcmEgbW90aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSBmaW5kIHlvdSdyZSBnZXR0aW5nIGEgc2xpZ2h0IFwiaml0dGVyXCIgZWZmZWN0IHdoZW4gZm9sbG93aW5nIGFuIG9iamVjdCBpdCdzIHByb2JhYmx5IHRvIGRvIHdpdGggc3ViLXBpeGVsXHJcbiAgICAgKiByZW5kZXJpbmcgb2YgdGhlIHRhcmdldHMgcG9zaXRpb24uIFRoaXMgY2FuIGJlIHJvdW5kZWQgYnkgc2V0dGluZyB0aGUgYHJvdW5kUGl4ZWxzYCBhcmd1bWVudCB0byBgdHJ1ZWAgdG9cclxuICAgICAqIGZvcmNlIGZ1bGwgcGl4ZWwgcm91bmRpbmcgcmVuZGVyaW5nLiBOb3RlIHRoYXQgdGhpcyBjYW4gc3RpbGwgYmUgYnJva2VuIGlmIHlvdSBoYXZlIHNwZWNpZmllZCBhIG5vbi1pbnRlZ2VyIHpvb21cclxuICAgICAqIHZhbHVlIG9uIHRoZSBjYW1lcmEuIFNvIGJlIHN1cmUgdG8ga2VlcCB0aGUgY2FtZXJhIHpvb20gdG8gaW50ZWdlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNzdGFydEZvbGxvd1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8b2JqZWN0KX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBmb3IgdGhlIENhbWVyYSB0byBmb2xsb3cuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyb3VuZFBpeGVscz1mYWxzZV0gLSBSb3VuZCB0aGUgY2FtZXJhIHBvc2l0aW9uIHRvIHdob2xlIGludGVnZXJzIHRvIGF2b2lkIHN1Yi1waXhlbCByZW5kZXJpbmc/XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlcnBYPTFdIC0gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuIFRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgbGluZWFyIGludGVycG9sYXRpb24gdG8gdXNlIHdoZW4gaG9yaXpvbnRhbGx5IHRyYWNraW5nIHRoZSB0YXJnZXQuIFRoZSBjbG9zZXIgdGhlIHZhbHVlIHRvIDEsIHRoZSBmYXN0ZXIgdGhlIGNhbWVyYSB3aWxsIHRyYWNrLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXJwWT0xXSAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLiBUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIGxpbmVhciBpbnRlcnBvbGF0aW9uIHRvIHVzZSB3aGVuIHZlcnRpY2FsbHkgdHJhY2tpbmcgdGhlIHRhcmdldC4gVGhlIGNsb3NlciB0aGUgdmFsdWUgdG8gMSwgdGhlIGZhc3RlciB0aGUgY2FtZXJhIHdpbGwgdHJhY2suXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgY2FtZXJhIGZvbGxvdyB0YXJnZXQueCBwb3NpdGlvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgY2FtZXJhIGZvbGxvdyB0YXJnZXQueSBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3RhcnRGb2xsb3c6IGZ1bmN0aW9uICh0YXJnZXQsIHJvdW5kUGl4ZWxzLCBsZXJwWCwgbGVycFksIG9mZnNldFgsIG9mZnNldFkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJvdW5kUGl4ZWxzID09PSB1bmRlZmluZWQpIHsgcm91bmRQaXhlbHMgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChsZXJwWCA9PT0gdW5kZWZpbmVkKSB7IGxlcnBYID0gMTsgfVxyXG4gICAgICAgIGlmIChsZXJwWSA9PT0gdW5kZWZpbmVkKSB7IGxlcnBZID0gbGVycFg7IH1cclxuICAgICAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICAgICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gb2Zmc2V0WDsgfVxyXG5cclxuICAgICAgICB0aGlzLl9mb2xsb3cgPSB0YXJnZXQ7XHJcblxyXG4gICAgICAgIHRoaXMucm91bmRQaXhlbHMgPSByb3VuZFBpeGVscztcclxuXHJcbiAgICAgICAgbGVycFggPSBDbGFtcChsZXJwWCwgMCwgMSk7XHJcbiAgICAgICAgbGVycFkgPSBDbGFtcChsZXJwWSwgMCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMubGVycC5zZXQobGVycFgsIGxlcnBZKTtcclxuXHJcbiAgICAgICAgdGhpcy5mb2xsb3dPZmZzZXQuc2V0KG9mZnNldFgsIG9mZnNldFkpO1xyXG5cclxuICAgICAgICB2YXIgb3JpZ2luWCA9IHRoaXMud2lkdGggLyAyO1xyXG4gICAgICAgIHZhciBvcmlnaW5ZID0gdGhpcy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICB2YXIgZnggPSB0YXJnZXQueCAtIG9mZnNldFg7XHJcbiAgICAgICAgdmFyIGZ5ID0gdGFyZ2V0LnkgLSBvZmZzZXRZO1xyXG5cclxuICAgICAgICB0aGlzLm1pZFBvaW50LnNldChmeCwgZnkpO1xyXG5cclxuICAgICAgICB0aGlzLnNjcm9sbFggPSBmeCAtIG9yaWdpblg7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxZID0gZnkgLSBvcmlnaW5ZO1xyXG5cclxuICAgICAgICBpZiAodGhpcy51c2VCb3VuZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFggPSB0aGlzLmNsYW1wWCh0aGlzLnNjcm9sbFgpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFkgPSB0aGlzLmNsYW1wWSh0aGlzLnNjcm9sbFkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgYSBDYW1lcmEgZnJvbSBmb2xsb3dpbmcgYSBHYW1lIE9iamVjdCwgaWYgcHJldmlvdXNseSBzZXQgdmlhIGBDYW1lcmEuc3RhcnRGb2xsb3dgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjc3RvcEZvbGxvd1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0b3BGb2xsb3c6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZm9sbG93ID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIGFueSBhY3RpdmUgRlgsIHN1Y2ggYXMgYSBmYWRlLCBmbGFzaCBvciBzaGFrZS4gVXNlZnVsIHRvIGNhbGwgYWZ0ZXIgYSBmYWRlIGluIG9yZGVyIHRvXHJcbiAgICAgKiByZW1vdmUgdGhlIGZhZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYSNyZXNldEZYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbWVyYSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVzZXRGWDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvdGF0ZVRvRWZmZWN0LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5wYW5FZmZlY3QucmVzZXQoKTtcclxuICAgICAgICB0aGlzLnNoYWtlRWZmZWN0LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5mbGFzaEVmZmVjdC5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZmFkZUVmZmVjdC5yZXNldCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmEjdXBkYXRlXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUsIGluIG1zLCBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0aW1lLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy52aXNpYmxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yb3RhdGVUb0VmZmVjdC51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgICAgICB0aGlzLnBhbkVmZmVjdC51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgICAgICB0aGlzLnpvb21FZmZlY3QudXBkYXRlKHRpbWUsIGRlbHRhKTtcclxuICAgICAgICAgICAgdGhpcy5zaGFrZUVmZmVjdC51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmZsYXNoRWZmZWN0LnVwZGF0ZSh0aW1lLCBkZWx0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmFkZUVmZmVjdC51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIENhbWVyYSBpbnN0YW5jZS4gWW91IHJhcmVseSBuZWVkIHRvIGNhbGwgdGhpcyBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIENhbWVyYSBNYW5hZ2VyLiBJZiB5b3Ugd2lzaCB0byBkZXN0cm95IGEgQ2FtZXJhIHBsZWFzZSB1c2UgYENhbWVyYU1hbmFnZXIucmVtb3ZlYCBhc1xyXG4gICAgICogY2FtZXJhcyBhcmUgc3RvcmVkIGluIGEgcG9vbCwgcmVhZHkgZm9yIHJlY3ljbGluZyBsYXRlciwgYW5kIGNhbGxpbmcgdGhpcyBkaXJlY3RseSB3aWxsIHByZXZlbnQgdGhhdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhI2Rlc3Ryb3lcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNERVNUUk9ZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsZWFyUmVuZGVyVG9UZXh0dXJlKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRGWCgpO1xyXG5cclxuICAgICAgICBCYXNlQ2FtZXJhLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2ZvbGxvdyA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZGVhZHpvbmUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENhbWVyYTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FtZXJhID0gcmVxdWlyZSgnLi9DYW1lcmEnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIFBsdWdpbkNhY2hlID0gcmVxdWlyZSgnLi4vLi4vcGx1Z2lucy9QbHVnaW5DYWNoZScpO1xyXG52YXIgUmVjdGFuZ2xlQ29udGFpbnMgPSByZXF1aXJlKCcuLi8uLi9nZW9tL3JlY3RhbmdsZS9Db250YWlucycpO1xyXG52YXIgU2NhbGVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9zY2FsZS9ldmVudHMnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vc2NlbmUvZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgQ2FtZXJhIE1hbmFnZXIgaXMgYSBwbHVnaW4gdGhhdCBiZWxvbmdzIHRvIGEgU2NlbmUgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBhbGwgb2YgdGhlIFNjZW5lIENhbWVyYXMuXHJcbiAqIFxyXG4gKiBCeSBkZWZhdWx0IHlvdSBjYW4gYWNjZXNzIHRoZSBDYW1lcmEgTWFuYWdlciBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nIGB0aGlzLmNhbWVyYXNgLCBhbHRob3VnaCB0aGlzIGNhbiBiZSBjaGFuZ2VkXHJcbiAqIGluIHlvdXIgZ2FtZSBjb25maWcuXHJcbiAqIFxyXG4gKiBDcmVhdGUgbmV3IENhbWVyYXMgdXNpbmcgdGhlIGBhZGRgIG1ldGhvZC4gT3IgZXh0ZW5kIHRoZSBDYW1lcmEgY2xhc3Mgd2l0aCB5b3VyIG93biBhZGRpdGlvbiBjb2RlIGFuZCB0aGVuIGFkZFxyXG4gKiB0aGUgbmV3IENhbWVyYSBpbiB1c2luZyB0aGUgYGFkZEV4aXN0aW5nYCBtZXRob2QuXHJcbiAqIFxyXG4gKiBDYW1lcmFzIHByb3ZpZGUgYSB2aWV3IGludG8geW91ciBnYW1lIHdvcmxkLCBhbmQgY2FuIGJlIHBvc2l0aW9uZWQsIHJvdGF0ZWQsIHpvb21lZCBhbmQgc2Nyb2xsZWQgYWNjb3JkaW5nbHkuXHJcbiAqXHJcbiAqIEEgQ2FtZXJhIGNvbnNpc3RzIG9mIHR3byBlbGVtZW50czogVGhlIHZpZXdwb3J0IGFuZCB0aGUgc2Nyb2xsIHZhbHVlcy5cclxuICpcclxuICogVGhlIHZpZXdwb3J0IGlzIHRoZSBwaHlzaWNhbCBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgQ2FtZXJhIHdpdGhpbiB5b3VyIGdhbWUuIENhbWVyYXMsIGJ5IGRlZmF1bHQsIGFyZVxyXG4gKiBjcmVhdGVkIHRoZSBzYW1lIHNpemUgYXMgeW91ciBnYW1lLCBidXQgdGhlaXIgcG9zaXRpb24gYW5kIHNpemUgY2FuIGJlIHNldCB0byBhbnl0aGluZy4gVGhpcyBtZWFucyBpZiB5b3VcclxuICogd2FudGVkIHRvIGNyZWF0ZSBhIGNhbWVyYSB0aGF0IHdhcyAzMjB4MjAwIGluIHNpemUsIHBvc2l0aW9uZWQgaW4gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgeW91ciBnYW1lLFxyXG4gKiB5b3UnZCBhZGp1c3QgdGhlIHZpZXdwb3J0IHRvIGRvIHRoYXQgKHVzaW5nIG1ldGhvZHMgbGlrZSBgc2V0Vmlld3BvcnRgIGFuZCBgc2V0U2l6ZWApLlxyXG4gKlxyXG4gKiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2Ugd2hlcmUgdGhlIENhbWVyYSBpcyBsb29raW5nIGluIHlvdXIgZ2FtZSwgdGhlbiB5b3Ugc2Nyb2xsIGl0LiBZb3UgY2FuIGRvIHRoaXNcclxuICogdmlhIHRoZSBwcm9wZXJ0aWVzIGBzY3JvbGxYYCBhbmQgYHNjcm9sbFlgIG9yIHRoZSBtZXRob2QgYHNldFNjcm9sbGAuIFNjcm9sbGluZyBoYXMgbm8gaW1wYWN0IG9uIHRoZVxyXG4gKiB2aWV3cG9ydCwgYW5kIGNoYW5naW5nIHRoZSB2aWV3cG9ydCBoYXMgbm8gaW1wYWN0IG9uIHRoZSBzY3JvbGxpbmcuXHJcbiAqXHJcbiAqIEJ5IGRlZmF1bHQgYSBDYW1lcmEgd2lsbCByZW5kZXIgYWxsIEdhbWUgT2JqZWN0cyBpdCBjYW4gc2VlLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHVzaW5nIHRoZSBgaWdub3JlYCBtZXRob2QsXHJcbiAqIGFsbG93aW5nIHlvdSB0byBmaWx0ZXIgR2FtZSBPYmplY3RzIG91dCBvbiBhIHBlci1DYW1lcmEgYmFzaXMuIFRoZSBDYW1lcmEgTWFuYWdlciBjYW4gbWFuYWdlIHVwIHRvIDMxIHVuaXF1ZSBcclxuICogJ0dhbWUgT2JqZWN0IGlnbm9yZSBjYXBhYmxlJyBDYW1lcmFzLiBBbnkgQ2FtZXJhcyBiZXlvbmQgMzEgdGhhdCB5b3UgY3JlYXRlIHdpbGwgYWxsIGJlIGdpdmVuIGEgQ2FtZXJhIElEIG9mXHJcbiAqIHplcm8sIG1lYW5pbmcgdGhhdCB0aGV5IGNhbm5vdCBiZSB1c2VkIGZvciBHYW1lIE9iamVjdCBleGNsdXNpb24uIFRoaXMgbWVhbnMgaWYgeW91IG5lZWQgeW91ciBDYW1lcmEgdG8gaWdub3JlXHJcbiAqIEdhbWUgT2JqZWN0cywgbWFrZSBzdXJlIGl0J3Mgb25lIG9mIHRoZSBmaXJzdCAzMSBjcmVhdGVkLlxyXG4gKlxyXG4gKiBBIENhbWVyYSBhbHNvIGhhcyBidWlsdC1pbiBzcGVjaWFsIGVmZmVjdHMgaW5jbHVkaW5nIEZhZGUsIEZsYXNoLCBDYW1lcmEgU2hha2UsIFBhbiBhbmQgWm9vbS5cclxuICpcclxuICogQGNsYXNzIENhbWVyYU1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5DYW1lcmFzLlNjZW5lMkRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdGhhdCBvd25zIHRoZSBDYW1lcmEgTWFuYWdlciBwbHVnaW4uXHJcbiAqL1xyXG52YXIgQ2FtZXJhTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDYW1lcmFNYW5hZ2VyIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoZSBDYW1lcmEgTWFuYWdlciBwbHVnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXIjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lLlN5c3RlbXMgaGFuZGxlciBmb3IgdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXIjc3lzdGVtc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gc2NlbmUuc3lzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbGwgQ2FtZXJhcyBjcmVhdGVkIGJ5LCBvciBhZGRlZCB0bywgdGhpcyBDYW1lcmEgTWFuYWdlciwgd2lsbCBoYXZlIHRoZWlyIGByb3VuZFBpeGVsc2BcclxuICAgICAgICAgKiBwcm9wZXJ0eSBzZXQgdG8gbWF0Y2ggdGhpcyB2YWx1ZS4gQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gbWF0Y2ggdGhlIHZhbHVlIHNldCBpbiB0aGVcclxuICAgICAgICAgKiBnYW1lIGNvbmZpZ3VyYXRpb24sIGJ1dCBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgcG9pbnQuIEVxdWFsbHksIGluZGl2aWR1YWwgY2FtZXJhcyBjYW5cclxuICAgICAgICAgKiBhbHNvIGJlIGNoYW5nZWQgYXMgbmVlZGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI3JvdW5kUGl4ZWxzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm91bmRQaXhlbHMgPSBzY2VuZS5zeXMuZ2FtZS5jb25maWcucm91bmRQaXhlbHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIEFycmF5IG9mIHRoZSBDYW1lcmEgb2JqZWN0cyBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgICAgICogVGhlIENhbWVyYXMgYXJlIHVwZGF0ZWQgYW5kIHJlbmRlcmVkIGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoaXMgYXJyYXkuXHJcbiAgICAgICAgICogRG8gbm90IGRpcmVjdGx5IGFkZCBvciByZW1vdmUgZW50cmllcyB0byB0aGlzIGFycmF5LiBIb3dldmVyLCB5b3UgY2FuIG1vdmUgdGhlIGNvbnRlbnRzXHJcbiAgICAgICAgICogYXJvdW5kIHRoZSBhcnJheSBzaG91bGQgeW91IHdpc2ggdG8gYWRqdXN0IHRoZSBkaXNwbGF5IG9yZGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI2NhbWVyYXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBoYW5keSByZWZlcmVuY2UgdG8gdGhlICdtYWluJyBjYW1lcmEuIEJ5IGRlZmF1bHQgdGhpcyBpcyB0aGUgZmlyc3QgQ2FtZXJhIHRoZVxyXG4gICAgICAgICAqIENhbWVyYSBNYW5hZ2VyIGNyZWF0ZXMuIFlvdSBjYW4gYWxzbyBzZXQgaXQgZGlyZWN0bHksIG9yIHVzZSB0aGUgYG1ha2VNYWluYCBhcmd1bWVudFxyXG4gICAgICAgICAqIGluIHRoZSBgYWRkYCBhbmQgYGFkZEV4aXN0aW5nYCBtZXRob2RzLiBJdCBhbGxvd3MgeW91IHRvIGFjY2VzcyBpdCBmcm9tIHlvdXIgZ2FtZTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgICAgICogdmFyIGNhbSA9IHRoaXMuY2FtZXJhcy5tYWluO1xyXG4gICAgICAgICAqIGBgYFxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEFsc28gc2VlIHRoZSBwcm9wZXJ0aWVzIGBjYW1lcmExYCwgYGNhbWVyYTJgIGFuZCBzbyBvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNtYWluXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFpbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBkZWZhdWx0IHVuLXRyYW5zZm9ybWVkIENhbWVyYSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGNhbWVyYSBsaXN0IGFuZCBkb2Vzbid0XHJcbiAgICAgICAgICogY291bnQgdG93YXJkcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbWVyYXMgYmVpbmcgbWFuYWdlZC4gSXQgZXhpc3RzIGZvciBvdGhlclxyXG4gICAgICAgICAqIHN5c3RlbXMsIGFzIHdlbGwgYXMgeW91ciBvd24gY29kZSwgc2hvdWxkIHRoZXkgcmVxdWlyZSBhIGJhc2ljIHVuLXRyYW5zZm9ybWVkXHJcbiAgICAgICAgICogY2FtZXJhIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gY2FsY3VsYXRlIGEgdmlldyBtYXRyaXguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXIjZGVmYXVsdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0O1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGxpc3RlbnMgUGhhc2VyLlNjZW5lcy5FdmVudHMjREVTVFJPWVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHN5cyA9IHRoaXMuc3lzdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHN5cy5zZXR0aW5ncy5jYW1lcmFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdlIGhhdmUgY2FtZXJhcyB0byBjcmVhdGVcclxuICAgICAgICAgICAgdGhpcy5mcm9tSlNPTihzeXMuc2V0dGluZ3MuY2FtZXJhcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBNYWtlIG9uZVxyXG4gICAgICAgICAgICB0aGlzLmFkZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYWluID0gdGhpcy5jYW1lcmFzWzBdO1xyXG5cclxuICAgICAgICAvLyAgQ3JlYXRlIGEgZGVmYXVsdCBjYW1lcmFcclxuICAgICAgICB0aGlzLmRlZmF1bHQgPSBuZXcgQ2FtZXJhKDAsIDAsIHN5cy5zY2FsZS53aWR0aCwgc3lzLnNjYWxlLmhlaWdodCkuc2V0U2NlbmUodGhpcy5zY2VuZSk7XHJcblxyXG4gICAgICAgIHN5cy5nYW1lLnNjYWxlLm9uKFNjYWxlRXZlbnRzLlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5ERVNUUk9ZLCB0aGlzLmRlc3Ryb3ksIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBTY2VuZSB3aGVuIGl0IGlzIHN0YXJ0aW5nIHVwLlxyXG4gICAgICogSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGxvY2FsIHN5c3RlbXMsIHByb3BlcnRpZXMgYW5kIGxpc3RlbmluZyBmb3IgU2NlbmUgZXZlbnRzLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBsaXN0ZW5zIFBoYXNlci5TY2VuZXMuRXZlbnRzI1VQREFURVxyXG4gICAgICogQGxpc3RlbnMgUGhhc2VyLlNjZW5lcy5FdmVudHMjU0hVVERPV05cclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMubWFpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzeXMgPSB0aGlzLnN5c3RlbXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3lzLnNldHRpbmdzLmNhbWVyYXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBXZSBoYXZlIGNhbWVyYXMgdG8gY3JlYXRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21KU09OKHN5cy5zZXR0aW5ncy5jYW1lcmFzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBNYWtlIG9uZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMubWFpbiA9IHRoaXMuY2FtZXJhc1swXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uY2UoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ2FtZXJhIGludG8gdGhlIENhbWVyYSBNYW5hZ2VyLiBUaGUgQ2FtZXJhIE1hbmFnZXIgY2FuIHN1cHBvcnQgdXAgdG8gMzEgZGlmZmVyZW50IENhbWVyYXMuXHJcbiAgICAgKiBcclxuICAgICAqIEVhY2ggQ2FtZXJhIGhhcyBpdHMgb3duIHZpZXdwb3J0LCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgQ2FtZXJhIGFuZCBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBjYW52YXMuXHJcbiAgICAgKiBcclxuICAgICAqIFVzZSB0aGUgYENhbWVyYS5zY3JvbGxYYCBhbmQgYENhbWVyYS5zY3JvbGxZYCBwcm9wZXJ0aWVzIHRvIGNoYW5nZSB3aGVyZSB0aGUgQ2FtZXJhIGlzIGxvb2tpbmcsIG9yIHRoZVxyXG4gICAgICogQ2FtZXJhIG1ldGhvZHMgc3VjaCBhcyBgY2VudGVyT25gLiBDYW1lcmFzIGFsc28gaGF2ZSBidWlsdCBpbiBzcGVjaWFsIGVmZmVjdHMsIHN1Y2ggYXMgZmFkZSwgZmxhc2gsIHNoYWtlLFxyXG4gICAgICogcGFuIGFuZCB6b29tLlxyXG4gICAgICogXHJcbiAgICAgKiBCeSBkZWZhdWx0IENhbWVyYXMgYXJlIHRyYW5zcGFyZW50IGFuZCB3aWxsIHJlbmRlciBhbnl0aGluZyB0aGF0IHRoZXkgY2FuIHNlZSBiYXNlZCBvbiB0aGVpciBgc2Nyb2xsWGBcclxuICAgICAqIGFuZCBgc2Nyb2xsWWAgdmFsdWVzLiBHYW1lIE9iamVjdHMgY2FuIGJlIHNldCB0byBiZSBpZ25vcmVkIGJ5IGEgQ2FtZXJhIGJ5IHVzaW5nIHRoZSBgQ2FtZXJhLmlnbm9yZWAgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgQ2FtZXJhIHdpbGwgaGF2ZSBpdHMgYHJvdW5kUGl4ZWxzYCBwcm9wZXJ0eSBzZXQgdG8gd2hhdGV2ZXIgYENhbWVyYU1hbmFnZXIucm91bmRQaXhlbHNgIGlzLiBZb3UgY2FuIGNoYW5nZVxyXG4gICAgICogaXQgYWZ0ZXIgY3JlYXRpb24gaWYgcmVxdWlyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZSB0aGUgQ2FtZXJhIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSBDYW1lcmEgdmlld3BvcnQuIElmIG5vdCBnaXZlbiBpdCdsbCBiZSB0aGUgZ2FtZSBjb25maWcgc2l6ZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBDYW1lcmEgdmlld3BvcnQuIElmIG5vdCBnaXZlbiBpdCdsbCBiZSB0aGUgZ2FtZSBjb25maWcgc2l6ZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21ha2VNYWluPWZhbHNlXSAtIFNldCB0aGlzIENhbWVyYSBhcyBiZWluZyB0aGUgJ21haW4nIGNhbWVyYS4gVGhpcyBqdXN0IG1ha2VzIHRoZSBwcm9wZXJ0eSBgbWFpbmAgYSByZWZlcmVuY2UgdG8gaXQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9JyddIC0gVGhlIG5hbWUgb2YgdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gVGhlIG5ld2x5IGNyZWF0ZWQgQ2FtZXJhLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBtYWtlTWFpbiwgbmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gdGhpcy5zY2VuZS5zeXMuc2NhbGUud2lkdGg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gdGhpcy5zY2VuZS5zeXMuc2NhbGUuaGVpZ2h0OyB9XHJcbiAgICAgICAgaWYgKG1ha2VNYWluID09PSB1bmRlZmluZWQpIHsgbWFrZU1haW4gPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHsgbmFtZSA9ICcnOyB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmEgPSBuZXcgQ2FtZXJhKHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBjYW1lcmEuc2V0TmFtZShuYW1lKTtcclxuICAgICAgICBjYW1lcmEuc2V0U2NlbmUodGhpcy5zY2VuZSk7XHJcbiAgICAgICAgY2FtZXJhLnNldFJvdW5kUGl4ZWxzKHRoaXMucm91bmRQaXhlbHMpO1xyXG5cclxuICAgICAgICBjYW1lcmEuaWQgPSB0aGlzLmdldE5leHRJRCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYXMucHVzaChjYW1lcmEpO1xyXG5cclxuICAgICAgICBpZiAobWFrZU1haW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1haW4gPSBjYW1lcmE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FtZXJhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXhpc3RpbmcgQ2FtZXJhIGludG8gdGhlIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgQ2FtZXJhIHNob3VsZCBlaXRoZXIgYmUgYSBgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFgIGluc3RhbmNlLCBvciBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBmcm9tIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgQ2FtZXJhIHdpbGwgaGF2ZSBpdHMgYHJvdW5kUGl4ZWxzYCBwcm9wZXJ0eSBzZXQgdG8gd2hhdGV2ZXIgYENhbWVyYU1hbmFnZXIucm91bmRQaXhlbHNgIGlzLiBZb3UgY2FuIGNoYW5nZVxyXG4gICAgICogaXQgYWZ0ZXIgYWRkaXRpb24gaWYgcmVxdWlyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBDYW1lcmEgd2lsbCBiZSBhc3NpZ25lZCBhbiBJRCwgd2hpY2ggaXMgdXNlZCBmb3IgR2FtZSBPYmplY3QgZXhjbHVzaW9uIGFuZCB0aGVuIGFkZGVkIHRvIHRoZVxyXG4gICAgICogbWFuYWdlci4gQXMgbG9uZyBhcyBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIG1hbmFnZXIgaXQgd2lsbCBiZSBhZGRlZCB0aGVuIHJldHVybmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGBudWxsYCB0aGVuIHRoZSBDYW1lcmEgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBDYW1lcmEgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNhZGRFeGlzdGluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0byBiZSBhZGRlZCB0byB0aGUgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYWtlTWFpbj1mYWxzZV0gLSBTZXQgdGhpcyBDYW1lcmEgYXMgYmVpbmcgdGhlICdtYWluJyBjYW1lcmEuIFRoaXMganVzdCBtYWtlcyB0aGUgcHJvcGVydHkgYG1haW5gIGEgcmVmZXJlbmNlIHRvIGl0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gVGhlIENhbWVyYSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgQ2FtZXJhIE1hbmFnZXIsIG9yIGBudWxsYCBpZiBpdCBjb3VsZG4ndCBiZSBhZGRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkRXhpc3Rpbmc6IGZ1bmN0aW9uIChjYW1lcmEsIG1ha2VNYWluKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChtYWtlTWFpbiA9PT0gdW5kZWZpbmVkKSB7IG1ha2VNYWluID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jYW1lcmFzLmluZGV4T2YoY2FtZXJhKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbWVyYS5pZCA9IHRoaXMuZ2V0TmV4dElEKCk7XHJcblxyXG4gICAgICAgICAgICBjYW1lcmEuc2V0Um91bmRQaXhlbHModGhpcy5yb3VuZFBpeGVscyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYXMucHVzaChjYW1lcmEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1ha2VNYWluKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW4gPSBjYW1lcmE7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gY2FtZXJhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgQ2FtZXJhIElEIG51bWJlci5cclxuICAgICAqIFxyXG4gICAgICogVGhlIENhbWVyYSBNYW5hZ2VyIHN1cHBvcnRzIHVwIHRvIDMxIHVuaXF1ZSBjYW1lcmFzLCBhZnRlciB3aGljaCB0aGUgSUQgcmV0dXJuZWQgd2lsbCBhbHdheXMgYmUgemVyby5cclxuICAgICAqIFlvdSBjYW4gY3JlYXRlIGFkZGl0aW9uYWwgY2FtZXJhcyBiZXlvbmQgMzEsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkIGZvciBHYW1lIE9iamVjdCBleGNsdXNpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXIjZ2V0TmV4dElEXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG5leHQgYXZhaWxhYmxlIENhbWVyYSBJRCwgb3IgMCBpZiB0aGV5J3JlIGFsbCBhbHJlYWR5IGluIHVzZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TmV4dElEOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjYW1lcmFzID0gdGhpcy5jYW1lcmFzO1xyXG5cclxuICAgICAgICB2YXIgdGVzdElEID0gMTtcclxuXHJcbiAgICAgICAgLy8gIEZpbmQgdGhlIGZpcnN0IGZyZWUgY2FtZXJhIElEIHdlIGNhbiB1c2VcclxuXHJcbiAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCAzMjsgdCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbWVyYXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYW1lcmEgPSBjYW1lcmFzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjYW1lcmEgJiYgY2FtZXJhLmlkID09PSB0ZXN0SUQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZm91bmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRlc3RJRCA9IHRlc3RJRCA8PCAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RJRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIENhbWVyYXMgaW4gdGhpcyBDYW1lcmEgTWFuYWdlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIG9wdGlvbmFsIGBpc1Zpc2libGVgIGFyZ3VtZW50IGlzIHNldCBpdCB3aWxsIG9ubHkgY291bnQgQ2FtZXJhcyB0aGF0IGFyZSBjdXJyZW50bHkgdmlzaWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNnZXRUb3RhbFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1Zpc2libGU9ZmFsc2VdIC0gU2V0IHRoZSBgdHJ1ZWAgdG8gb25seSBpbmNsdWRlIHZpc2libGUgQ2FtZXJhcyBpbiB0aGUgdG90YWwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBDYW1lcmFzIGluIHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIGdldFRvdGFsOiBmdW5jdGlvbiAoaXNWaXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpc1Zpc2libGUgPT09IHVuZGVmaW5lZCkgeyBpc1Zpc2libGUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICB2YXIgY2FtZXJhcyA9IHRoaXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IGNhbWVyYXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVmlzaWJsZSB8fCAoaXNWaXNpYmxlICYmIGNhbWVyYS52aXNpYmxlKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdG90YWwrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBvcHVsYXRlcyB0aGlzIENhbWVyYSBNYW5hZ2VyIGJhc2VkIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgY29uZmlnIG9iamVjdHMuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZSB0aGUgYFBoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhQ29uZmlnYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI2Zyb21KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYUNvbmZpZ3xQaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYUNvbmZpZ1tdKX0gY29uZmlnIC0gQSBDYW1lcmEgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZW0sIHRvIGJlIGFkZGVkIHRvIHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW1lcmEgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZnJvbUpTT046IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25maWcgPSBbIGNvbmZpZyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdhbWVXaWR0aCA9IHRoaXMuc2NlbmUuc3lzLnNjYWxlLndpZHRoO1xyXG4gICAgICAgIHZhciBnYW1lSGVpZ2h0ID0gdGhpcy5zY2VuZS5zeXMuc2NhbGUuaGVpZ2h0O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYW1lcmFDb25maWcgPSBjb25maWdbaV07XHJcblxyXG4gICAgICAgICAgICB2YXIgeCA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICd4JywgMCk7XHJcbiAgICAgICAgICAgIHZhciB5ID0gR2V0RmFzdFZhbHVlKGNhbWVyYUNvbmZpZywgJ3knLCAwKTtcclxuICAgICAgICAgICAgdmFyIHdpZHRoID0gR2V0RmFzdFZhbHVlKGNhbWVyYUNvbmZpZywgJ3dpZHRoJywgZ2FtZVdpZHRoKTtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICdoZWlnaHQnLCBnYW1lSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmFkZCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBEaXJlY3QgcHJvcGVydGllc1xyXG4gICAgICAgICAgICBjYW1lcmEubmFtZSA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICduYW1lJywgJycpO1xyXG4gICAgICAgICAgICBjYW1lcmEuem9vbSA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICd6b29tJywgMSk7XHJcbiAgICAgICAgICAgIGNhbWVyYS5yb3RhdGlvbiA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICdyb3RhdGlvbicsIDApO1xyXG4gICAgICAgICAgICBjYW1lcmEuc2Nyb2xsWCA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICdzY3JvbGxYJywgMCk7XHJcbiAgICAgICAgICAgIGNhbWVyYS5zY3JvbGxZID0gR2V0RmFzdFZhbHVlKGNhbWVyYUNvbmZpZywgJ3Njcm9sbFknLCAwKTtcclxuICAgICAgICAgICAgY2FtZXJhLnJvdW5kUGl4ZWxzID0gR2V0RmFzdFZhbHVlKGNhbWVyYUNvbmZpZywgJ3JvdW5kUGl4ZWxzJywgZmFsc2UpO1xyXG4gICAgICAgICAgICBjYW1lcmEudmlzaWJsZSA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICd2aXNpYmxlJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBCYWNrZ3JvdW5kIENvbG9yXHJcblxyXG4gICAgICAgICAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gR2V0RmFzdFZhbHVlKGNhbWVyYUNvbmZpZywgJ2JhY2tncm91bmRDb2xvcicsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbWVyYS5zZXRCYWNrZ3JvdW5kQ29sb3IoYmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIEJvdW5kc1xyXG5cclxuICAgICAgICAgICAgdmFyIGJvdW5kc0NvbmZpZyA9IEdldEZhc3RWYWx1ZShjYW1lcmFDb25maWcsICdib3VuZHMnLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib3VuZHNDb25maWcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBieCA9IEdldEZhc3RWYWx1ZShib3VuZHNDb25maWcsICd4JywgMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYnkgPSBHZXRGYXN0VmFsdWUoYm91bmRzQ29uZmlnLCAneScsIDApO1xyXG4gICAgICAgICAgICAgICAgdmFyIGJ3aWR0aCA9IEdldEZhc3RWYWx1ZShib3VuZHNDb25maWcsICd3aWR0aCcsIGdhbWVXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmhlaWdodCA9IEdldEZhc3RWYWx1ZShib3VuZHNDb25maWcsICdoZWlnaHQnLCBnYW1lSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjYW1lcmEuc2V0Qm91bmRzKGJ4LCBieSwgYndpZHRoLCBiaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIENhbWVyYSBiYXNlZCBvbiBpdHMgbmFtZS5cclxuICAgICAqIFxyXG4gICAgICogQ2FtZXJhIG5hbWVzIGFyZSBvcHRpb25hbCBhbmQgZG9uJ3QgaGF2ZSB0byBiZSBzZXQsIHNvIHRoaXMgbWV0aG9kIGlzIG9ubHkgb2YgYW55IHVzZSBpZiB5b3VcclxuICAgICAqIGhhdmUgZ2l2ZW4geW91ciBDYW1lcmFzIHVuaXF1ZSBuYW1lcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNnZXRDYW1lcmFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFRoZSBmaXJzdCBDYW1lcmEgd2l0aCBhIG5hbWUgbWF0Y2hpbmcgdGhlIGdpdmVuIHN0cmluZywgb3RoZXJ3aXNlIGBudWxsYC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FtZXJhOiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgY2FtZXJhcyA9IHRoaXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYXNbaV0ubmFtZSA9PT0gbmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVyYXNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGNhbWVyYXMgYmVsb3cgdGhlIGdpdmVuIFBvaW50ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmaXJzdCBjYW1lcmEgaW4gdGhlIGFycmF5IGlzIHRoZSB0b3AtbW9zdCBjYW1lcmEgaW4gdGhlIGNhbWVyYSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYXNCZWxvd1BvaW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgdG8gY2hlY2sgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYVtdfSBBbiBhcnJheSBvZiBjYW1lcmFzIGJlbG93IHRoZSBQb2ludGVyLlxyXG4gICAgICovXHJcbiAgICBnZXRDYW1lcmFzQmVsb3dQb2ludGVyOiBmdW5jdGlvbiAocG9pbnRlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgY2FtZXJhcyA9IHRoaXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgdmFyIHggPSBwb2ludGVyLng7XHJcbiAgICAgICAgdmFyIHkgPSBwb2ludGVyLnk7XHJcblxyXG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IGNhbWVyYXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnZpc2libGUgJiYgY2FtZXJhLmlucHV0RW5hYmxlZCAmJiBSZWN0YW5nbGVDb250YWlucyhjYW1lcmEsIHgsIHkpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgU28gdGhlIHRvcC1tb3N0IGNhbWVyYSBpcyBhdCB0aGUgdG9wIG9mIHRoZSBzZWFyY2ggYXJyYXlcclxuICAgICAgICAgICAgICAgIG91dHB1dC51bnNoaWZ0KGNhbWVyYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gQ2FtZXJhLCBvciBhbiBhcnJheSBvZiBDYW1lcmFzLCBmcm9tIHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIGZvdW5kIGluIHRoZSBDYW1lcmEgTWFuYWdlciBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlbW92ZWQgZnJvbSB0aGUgbG9jYWwgY2FtZXJhcyBhcnJheS5cclxuICAgICAqIElmIGFsc28gY3VycmVudGx5IHRoZSAnbWFpbicgY2FtZXJhLCAnbWFpbicgd2lsbCBiZSByZXNldCB0byBiZSBjYW1lcmEgMC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHJlbW92ZWQgQ2FtZXJhcyBhcmUgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgaWYgdGhlIGBydW5EZXN0cm95YCBhcmd1bWVudCBpcyBgdHJ1ZWAsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LlxyXG4gICAgICogSWYgeW91IHdpc2ggdG8gcmUtdXNlIHRoZSBjYW1lcmFzIHRoZW4gc2V0IHRoaXMgdG8gYGZhbHNlYCwgYnV0IGtub3cgdGhhdCB0aGV5IHdpbGwgcmV0YWluIHRoZWlyIHJlZmVyZW5jZXNcclxuICAgICAqIGFuZCBpbnRlcm5hbCBkYXRhIHVudGlsIGRlc3Ryb3llZCBvciByZS1hZGRlZCB0byBhIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF8UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFbXSl9IGNhbWVyYSAtIFRoZSBDYW1lcmEsIG9yIGFuIGFycmF5IG9mIENhbWVyYXMsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcnVuRGVzdHJveT10cnVlXSAtIEF1dG9tYXRpY2FsbHkgY2FsbCBgQ2FtZXJhLmRlc3Ryb3lgIG9uIGVhY2ggQ2FtZXJhIHJlbW92ZWQgZnJvbSB0aGlzIENhbWVyYSBNYW5hZ2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgdG90YWwgbnVtYmVyIG9mIENhbWVyYXMgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoY2FtZXJhLCBydW5EZXN0cm95KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChydW5EZXN0cm95ID09PSB1bmRlZmluZWQpIHsgcnVuRGVzdHJveSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhbWVyYSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYW1lcmEgPSBbIGNhbWVyYSBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHRvdGFsID0gMDtcclxuICAgICAgICB2YXIgY2FtZXJhcyA9IHRoaXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYW1lcmEubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBjYW1lcmFzLmluZGV4T2YoY2FtZXJhW2ldKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChydW5EZXN0cm95KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYXNbaW5kZXhdLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYW1lcmFzLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdG90YWwrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm1haW4gJiYgY2FtZXJhc1swXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFpbiA9IGNhbWVyYXNbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGludGVybmFsIHJlbmRlciBtZXRob2QuIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQgZGlyZWN0bHkuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IHdpbGwgaXRlcmF0ZSB0aHJvdWdoIGFsbCBsb2NhbCBjYW1lcmFzIGFuZCByZW5kZXIgdGhlbSBpbiB0dXJuLCBhcyBsb25nIGFzIHRoZXkncmUgdmlzaWJsZSBhbmQgaGF2ZVxyXG4gICAgICogYW4gYWxwaGEgbGV2ZWwgPiAwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI3JlbmRlclxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcnxQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcil9IHJlbmRlcmVyIC0gVGhlIFJlbmRlcmVyIHRoYXQgd2lsbCByZW5kZXIgdGhlIGNoaWxkcmVuIHRvIHRoaXMgY2FtZXJhLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBjaGlsZHJlbiAtIEFuIGFycmF5IG9mIHJlbmRlcmFibGUgR2FtZSBPYmplY3RzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb24gLSBJbnRlcnBvbGF0aW9uIHZhbHVlLiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cclxuICAgICAqL1xyXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAocmVuZGVyZXIsIGNoaWxkcmVuLCBpbnRlcnBvbGF0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcbiAgICAgICAgdmFyIGNhbWVyYXMgPSB0aGlzLmNhbWVyYXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNhbWVyYSA9IGNhbWVyYXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnZpc2libGUgJiYgY2FtZXJhLmFscGhhID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEhhcmQtY29kZWQgdG8gMSBmb3Igbm93XHJcbiAgICAgICAgICAgICAgICBjYW1lcmEucHJlUmVuZGVyKDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2hpbGRyZW4sIGludGVycG9sYXRpb24sIGNhbWVyYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgQ2FtZXJhIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgd2lsbCBpdGVyYXRlIHRocm91Z2ggYWxsIGN1cnJlbnQgQ2FtZXJhcywgZGVzdHJveWluZyB0aGVtIGFsbCwgdGhlbiBpdCB3aWxsIHJlc2V0IHRoZVxyXG4gICAgICogY2FtZXJhcyBhcnJheSwgcmVzZXQgdGhlIElEIGNvdW50ZXIgYW5kIGNyZWF0ZSAxIG5ldyBzaW5nbGUgY2FtZXJhIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNyZXNldEFsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFRoZSBmcmVzaGx5IGNyZWF0ZWQgbWFpbiBDYW1lcmEuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0QWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmFzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLm1haW4gPSB0aGlzLmFkZCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5tYWluO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIHVwZGF0ZSBsb29wLiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBTY2VuZSBzdGVwcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciN1cGRhdGVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYW1lcmFzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmFzW2ldLnVwZGF0ZSh0aW1lLCBkZWx0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBldmVudCBoYW5kbGVyIHRoYXQgbWFuYWdlcyB0aGUgYHJlc2l6ZWAgZXZlbnQgZGlzcGF0Y2hlZCBieSB0aGUgU2NhbGUgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNvblJlc2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlN0cnVjdHMuU2l6ZX0gZ2FtZVNpemUgLSBUaGUgZGVmYXVsdCBHYW1lIFNpemUgb2JqZWN0LiBUaGlzIGlzIHRoZSB1bi1tb2RpZmllZCBnYW1lIGRpbWVuc2lvbnMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNpemV9IGJhc2VTaXplIC0gVGhlIGJhc2UgU2l6ZSBvYmplY3QuIFRoZSBnYW1lIGRpbWVuc2lvbnMgbXVsdGlwbGllZCBieSB0aGUgcmVzb2x1dGlvbi4gVGhlIGNhbnZhcyB3aWR0aCAvIGhlaWdodCB2YWx1ZXMgbWF0Y2ggdGhpcy5cclxuICAgICAqL1xyXG4gICAgb25SZXNpemU6IGZ1bmN0aW9uIChnYW1lU2l6ZSwgYmFzZVNpemUsIGRpc3BsYXlTaXplLCByZXNvbHV0aW9uLCBwcmV2aW91c1dpZHRoLCBwcmV2aW91c0hlaWdodClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FtZXJhcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYW0gPSB0aGlzLmNhbWVyYXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgaWYgY2FtZXJhIGlzIGF0IDB4MCBhbmQgd2FzIHRoZSBzaXplIG9mIHRoZSBwcmV2aW91cyBnYW1lIHNpemUsIHRoZW4gd2UgY2FuIHNhZmVseSBhc3N1bWUgaXRcclxuICAgICAgICAgICAgLy8gIHNob3VsZCBiZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSBuZXcgZ2FtZSBzaXplIHRvb1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbS5feCA9PT0gMCAmJiBjYW0uX3kgPT09IDAgJiYgY2FtLl93aWR0aCA9PT0gcHJldmlvdXNXaWR0aCAmJiBjYW0uX2hlaWdodCA9PT0gcHJldmlvdXNIZWlnaHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbS5zZXRTaXplKGJhc2VTaXplLndpZHRoLCBiYXNlU2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgYWxsIGNhbWVyYXMgdG8gdGhlIGdpdmVuIGRpbWVuc2lvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXIjcmVzaXplXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBjYW1lcmEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIGNhbWVyYS5cclxuICAgICAqL1xyXG4gICAgcmVzaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FtZXJhcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhc1tpXS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyI3NodXRkb3duXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFpbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbWVyYXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYXNbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmFzID0gW107XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAgICogV2UgbmVlZCB0byBzaHV0ZG93biBhbmQgdGhlbiBraWxsIG9mZiBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xyXG5cclxuICAgICAgICB0aGlzLmRlZmF1bHQuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuUGx1Z2luQ2FjaGUucmVnaXN0ZXIoJ0NhbWVyYU1hbmFnZXInLCBDYW1lcmFNYW5hZ2VyLCAnY2FtZXJhcycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYW1lcmFNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFtcCA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvQ2xhbXAnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBDYW1lcmEgRmFkZSBlZmZlY3QuXHJcbiAqXHJcbiAqIFRoaXMgZWZmZWN0IHdpbGwgZmFkZSB0aGUgY2FtZXJhIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjb2xvciwgb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gKlxyXG4gKiBPbmx5IHRoZSBjYW1lcmEgdmlld3BvcnQgaXMgZmFkZWQuIE5vbmUgb2YgdGhlIG9iamVjdHMgaXQgaXMgZGlzcGxheWluZyBhcmUgaW1wYWN0ZWQsIGkuZS4gdGhlaXIgY29sb3JzIGRvXHJcbiAqIG5vdCBjaGFuZ2UuXHJcbiAqXHJcbiAqIFRoZSBlZmZlY3Qgd2lsbCBkaXNwYXRjaCBzZXZlcmFsIGV2ZW50cyBvbiB0aGUgQ2FtZXJhIGl0c2VsZiBhbmQgeW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gYG9uVXBkYXRlYCBjYWxsYmFjayxcclxuICogd2hpY2ggaXMgaW52b2tlZCBlYWNoIGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCwgaWYgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBGYWRlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoaXMgZWZmZWN0IGlzIGFjdGluZyB1cG9uLlxyXG4gKi9cclxudmFyIEZhZGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRmFkZSAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgdGhpcyBlZmZlY3QgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI2NhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBlZmZlY3QgYWN0aXZlbHkgcnVubmluZz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI2lzUnVubmluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGFzIHRoaXMgZWZmZWN0IGZpbmlzaGVkIHJ1bm5pbmc/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGBpc1J1bm5pbmdgIGJlY2F1c2UgaXQgcmVtYWlucyBzZXQgdG8gYHRydWVgIHdoZW4gdGhlIGVmZmVjdCBpcyBvdmVyLFxyXG4gICAgICAgICAqIHVudGlsIHRoZSBlZmZlY3QgaXMgZWl0aGVyIHJlc2V0IG9yIHN0YXJ0ZWQgYWdhaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNpc0NvbXBsZXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzQ29tcGxldGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmFkZS5cclxuICAgICAgICAgKiBgdHJ1ZWAgPSBmYWRlIG91dCAodHJhbnNwYXJlbnQgdG8gY29sb3IpLCBgZmFsc2VgID0gZmFkZSBpbiAoY29sb3IgdG8gdHJhbnNwYXJlbnQpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNkaXJlY3Rpb25cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWQgY29sb3IgY2hhbm5lbCB0aGUgY2FtZXJhIHdpbGwgdXNlIGZvciB0aGUgZmFkZSBlZmZlY3QuXHJcbiAgICAgICAgICogQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI3JlZFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGdyZWVuIGNvbG9yIGNoYW5uZWwgdGhlIGNhbWVyYSB3aWxsIHVzZSBmb3IgdGhlIGZhZGUgZWZmZWN0LlxyXG4gICAgICAgICAqIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNncmVlblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ncmVlbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYmx1ZSBjb2xvciBjaGFubmVsIHRoZSBjYW1lcmEgd2lsbCB1c2UgZm9yIHRoZSBmYWRlIGVmZmVjdC5cclxuICAgICAgICAgKiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjYmx1ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ibHVlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhbHBoYSBjaGFubmVsIHVzZWQgZHVyaW5nIHRoZSBmYWRlIGVmZmVjdC5cclxuICAgICAgICAgKiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI2FscGhhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWxwaGEgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGVmZmVjdCBpcyBydW5uaW5nIHRoaXMgaG9sZHMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aGUgcHJvZ3Jlc3MsIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjcHJvZ3Jlc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFZmZlY3QgZWxhcHNlZCB0aW1lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI19lbGFwc2VkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjX29uVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYUZhZGVDYWxsYmFja31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT24gQ29tcGxldGUgY2FsbGJhY2sgc2NvcGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNfb25VcGRhdGVTY29wZVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhZGVzIHRoZSBDYW1lcmEgdG8gb3IgZnJvbSB0aGUgZ2l2ZW4gY29sb3Igb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjc3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGQURFX0lOX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9PVVRfU1RBUlRcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RpcmVjdGlvbj10cnVlXSAtIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGZhZGUuIGB0cnVlYCA9IGZhZGUgb3V0ICh0cmFuc3BhcmVudCB0byBjb2xvciksIGBmYWxzZWAgPSBmYWRlIGluIChjb2xvciB0byB0cmFuc3BhcmVudClcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2R1cmF0aW9uPTEwMDBdIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcmVkPTBdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSByZWQgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ3JlZW49MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGdyZWVuIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MF0gLSBUaGUgYW1vdW50IHRvIGZhZGUgdGhlIGJsdWUgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gRm9yY2UgdGhlIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhRmFkZUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCB0d28gYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhIGFuZCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcy5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gVGhlIENhbWVyYSBvbiB3aGljaCB0aGUgZWZmZWN0IHdhcyBzdGFydGVkLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKGRpcmVjdGlvbiwgZHVyYXRpb24sIHJlZCwgZ3JlZW4sIGJsdWUsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSB1bmRlZmluZWQpIHsgZGlyZWN0aW9uID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7IGR1cmF0aW9uID0gMTAwMDsgfVxyXG4gICAgICAgIGlmIChyZWQgPT09IHVuZGVmaW5lZCkgeyByZWQgPSAwOyB9XHJcbiAgICAgICAgaWYgKGdyZWVuID09PSB1bmRlZmluZWQpIHsgZ3JlZW4gPSAwOyB9XHJcbiAgICAgICAgaWYgKGJsdWUgPT09IHVuZGVmaW5lZCkgeyBibHVlID0gMDsgfVxyXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkKSB7IGZvcmNlID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNvbnRleHQgPSB0aGlzLmNhbWVyYS5zY2VuZTsgfVxyXG5cclxuICAgICAgICBpZiAoIWZvcmNlICYmIHRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FtZXJhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5yZWQgPSByZWQ7XHJcbiAgICAgICAgdGhpcy5ncmVlbiA9IGdyZWVuO1xyXG4gICAgICAgIHRoaXMuYmx1ZSA9IGJsdWU7XHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IChkaXJlY3Rpb24pID8gTnVtYmVyLk1JTl9WQUxVRSA6IDE7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBjb250ZXh0O1xyXG5cclxuICAgICAgICB2YXIgZXZlbnROYW1lID0gKGRpcmVjdGlvbikgPyBFdmVudHMuRkFERV9PVVRfU1RBUlQgOiBFdmVudHMuRkFERV9JTl9TVEFSVDtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChldmVudE5hbWUsIHRoaXMuY2FtZXJhLCB0aGlzLCBkdXJhdGlvbiwgcmVkLCBncmVlbiwgYmx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbWVyYTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiB1cGRhdGUgbG9vcCBmb3IgdGhpcyBlZmZlY3QuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBDYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGFwc2VkICs9IGRlbHRhO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gQ2xhbXAodGhpcy5fZWxhcHNlZCAvIHRoaXMuZHVyYXRpb24sIDAsIDEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb25VcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZS5jYWxsKHRoaXMuX29uVXBkYXRlU2NvcGUsIHRoaXMuY2FtZXJhLCB0aGlzLnByb2dyZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lbGFwc2VkIDwgdGhpcy5kdXJhdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodGhpcy5kaXJlY3Rpb24pID8gdGhpcy5wcm9ncmVzcyA6IDEgLSB0aGlzLnByb2dyZXNzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhID0gKHRoaXMuZGlyZWN0aW9uKSA/IDEgOiAwO1xyXG4gICAgICAgICAgICB0aGlzLmVmZmVjdENvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBDYW52YXMgUmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNwb3N0UmVuZGVyQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4IC0gVGhlIENhbnZhcyBjb250ZXh0IHRvIHJlbmRlciB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGVmZmVjdCBkcmV3IHRvIHRoZSByZW5kZXJlciwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHBvc3RSZW5kZXJDYW52YXM6IGZ1bmN0aW9uIChjdHgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZyAmJiAhdGhpcy5pc0NvbXBsZXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRoaXMucmVkICsgJywnICsgdGhpcy5ncmVlbiArICcsJyArIHRoaXMuYmx1ZSArICcsJyArIHRoaXMuYWxwaGEgKyAnKSc7XHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KGNhbWVyYS5fY3gsIGNhbWVyYS5fY3ksIGNhbWVyYS5fY3csIGNhbWVyYS5fY2gpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZSNwb3N0UmVuZGVyV2ViR0xcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lfSBwaXBlbGluZSAtIFRoZSBXZWJHTCBQaXBlbGluZSB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRUaW50RnVuY3Rpb24gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXR1cm4gdGhlIGdsIHNhZmUgdGludCBjb2xvcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBlZmZlY3QgZHJldyB0byB0aGUgcmVuZGVyZXIsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyV2ViR0w6IGZ1bmN0aW9uIChwaXBlbGluZSwgZ2V0VGludEZ1bmN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcgJiYgIXRoaXMuaXNDb21wbGV0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuICAgICAgICB2YXIgcmVkID0gdGhpcy5yZWQgLyAyNTU7XHJcbiAgICAgICAgdmFyIGJsdWUgPSB0aGlzLmJsdWUgLyAyNTU7XHJcbiAgICAgICAgdmFyIGdyZWVuID0gdGhpcy5ncmVlbiAvIDI1NTtcclxuXHJcbiAgICAgICAgcGlwZWxpbmUuZHJhd0ZpbGxSZWN0KFxyXG4gICAgICAgICAgICBjYW1lcmEuX2N4LCBjYW1lcmEuX2N5LCBjYW1lcmEuX2N3LCBjYW1lcmEuX2NoLFxyXG4gICAgICAgICAgICBnZXRUaW50RnVuY3Rpb24ocmVkLCBncmVlbiwgYmx1ZSwgMSksXHJcbiAgICAgICAgICAgIHRoaXMuYWxwaGFcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBlZmZlY3QgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjZWZmZWN0Q29tcGxldGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGQURFX0lOX0NPTVBMRVRFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9PVVRfQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBlZmZlY3RDb21wbGV0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICh0aGlzLmRpcmVjdGlvbikgPyBFdmVudHMuRkFERV9PVVRfQ09NUExFVEUgOiBFdmVudHMuRkFERV9JTl9DT01QTEVURTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChldmVudE5hbWUsIHRoaXMuY2FtZXJhLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBjYW1lcmEgZWZmZWN0LlxyXG4gICAgICogSWYgaXQgd2FzIHByZXZpb3VzbHkgcnVubmluZywgaXQgc3RvcHMgaW5zdGFudGx5IHdpdGhvdXQgY2FsbGluZyBpdHMgb25Db21wbGV0ZSBjYWxsYmFjayBvciBlbWl0dGluZyBhbiBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlI3Jlc2V0XHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29tcGxldGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgZWZmZWN0LCByZWxlYXNpbmcgaXQgZnJvbSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZhZGUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmFkZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQ2FtZXJhIEZsYXNoIGVmZmVjdC5cclxuICpcclxuICogVGhpcyBlZmZlY3Qgd2lsbCBmbGFzaCB0aGUgY2FtZXJhIHZpZXdwb3J0IHRvIHRoZSBnaXZlbiBjb2xvciwgb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gKlxyXG4gKiBPbmx5IHRoZSBjYW1lcmEgdmlld3BvcnQgaXMgZmxhc2hlZC4gTm9uZSBvZiB0aGUgb2JqZWN0cyBpdCBpcyBkaXNwbGF5aW5nIGFyZSBpbXBhY3RlZCwgaS5lLiB0aGVpciBjb2xvcnMgZG9cclxuICogbm90IGNoYW5nZS5cclxuICpcclxuICogVGhlIGVmZmVjdCB3aWxsIGRpc3BhdGNoIHNldmVyYWwgZXZlbnRzIG9uIHRoZSBDYW1lcmEgaXRzZWxmIGFuZCB5b3UgY2FuIGFsc28gc3BlY2lmeSBhbiBgb25VcGRhdGVgIGNhbGxiYWNrLFxyXG4gKiB3aGljaCBpcyBpbnZva2VkIGVhY2ggZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LCBpZiByZXF1aXJlZC5cclxuICpcclxuICogQGNsYXNzIEZsYXNoXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoaXMgZWZmZWN0IGlzIGFjdGluZyB1cG9uLlxyXG4gKi9cclxudmFyIEZsYXNoID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEZsYXNoIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIENhbWVyYSB0aGlzIGVmZmVjdCBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZsYXNoI2NhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBlZmZlY3QgYWN0aXZlbHkgcnVubmluZz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNpc1J1bm5pbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjZHVyYXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVkIGNvbG9yIGNoYW5uZWwgdGhlIGNhbWVyYSB3aWxsIHVzZSBmb3IgdGhlIGZhZGUgZWZmZWN0LlxyXG4gICAgICAgICAqIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjcmVkXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZ3JlZW4gY29sb3IgY2hhbm5lbCB0aGUgY2FtZXJhIHdpbGwgdXNlIGZvciB0aGUgZmFkZSBlZmZlY3QuXHJcbiAgICAgICAgICogQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNncmVlblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ncmVlbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYmx1ZSBjb2xvciBjaGFubmVsIHRoZSBjYW1lcmEgd2lsbCB1c2UgZm9yIHRoZSBmYWRlIGVmZmVjdC5cclxuICAgICAgICAgKiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZsYXNoI2JsdWVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmx1ZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYWxwaGEgY2hhbm5lbCB1c2VkIGR1cmluZyB0aGUgZmFkZSBlZmZlY3QuXHJcbiAgICAgICAgICogQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjYWxwaGFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgZWZmZWN0IGlzIHJ1bm5pbmcgdGhpcyBob2xkcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIHRoZSBwcm9ncmVzcywgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjcHJvZ3Jlc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFZmZlY3QgZWxhcHNlZCB0aW1lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNfZWxhcHNlZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGV2ZXJ5IGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNfb25VcGRhdGVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhRmxhc2hDYWxsYmFja31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT24gQ29tcGxldGUgY2FsbGJhY2sgc2NvcGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjX29uVXBkYXRlU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGFzaGVzIHRoZSBDYW1lcmEgdG8gb3IgZnJvbSB0aGUgZ2l2ZW4gY29sb3Igb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZsYXNoI3N0YXJ0XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkxBU0hfU1RBUlRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGTEFTSF9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249MjUwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3JlZD0yNTVdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSByZWQgY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ3JlZW49MjU1XSAtIFRoZSBhbW91bnQgdG8gZmFkZSB0aGUgZ3JlZW4gY2hhbm5lbCB0b3dhcmRzLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbYmx1ZT0yNTVdIC0gVGhlIGFtb3VudCB0byBmYWRlIHRoZSBibHVlIGNoYW5uZWwgdG93YXJkcy4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIEZvcmNlIHRoZSBlZmZlY3QgdG8gc3RhcnQgaW1tZWRpYXRlbHksIGV2ZW4gaWYgYWxyZWFkeSBydW5uaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYUZsYXNoQ2FsbGJhY2t9IFtjYWxsYmFja10gLSBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgKiBJdCBpcyBzZW50IHR3byBhcmd1bWVudHM6IEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEgYW5kIGEgcHJvZ3Jlc3MgYW1vdW50IGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBjb21wbGV0ZSB0aGUgZWZmZWN0IGlzLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLiBEZWZhdWx0cyB0byB0aGUgU2NlbmUgdG8gd2hpY2ggdGhlIENhbWVyYSBiZWxvbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBUaGUgQ2FtZXJhIG9uIHdoaWNoIHRoZSBlZmZlY3Qgd2FzIHN0YXJ0ZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoZHVyYXRpb24sIHJlZCwgZ3JlZW4sIGJsdWUsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkgeyBkdXJhdGlvbiA9IDI1MDsgfVxyXG4gICAgICAgIGlmIChyZWQgPT09IHVuZGVmaW5lZCkgeyByZWQgPSAyNTU7IH1cclxuICAgICAgICBpZiAoZ3JlZW4gPT09IHVuZGVmaW5lZCkgeyBncmVlbiA9IDI1NTsgfVxyXG4gICAgICAgIGlmIChibHVlID09PSB1bmRlZmluZWQpIHsgYmx1ZSA9IDI1NTsgfVxyXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkKSB7IGZvcmNlID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNvbnRleHQgPSB0aGlzLmNhbWVyYS5zY2VuZTsgfVxyXG5cclxuICAgICAgICBpZiAoIWZvcmNlICYmIHRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FtZXJhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5yZWQgPSByZWQ7XHJcbiAgICAgICAgdGhpcy5ncmVlbiA9IGdyZWVuO1xyXG4gICAgICAgIHRoaXMuYmx1ZSA9IGJsdWU7XHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBjb250ZXh0O1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYS5lbWl0KEV2ZW50cy5GTEFTSF9TVEFSVCwgdGhpcy5jYW1lcmEsIHRoaXMsIGR1cmF0aW9uLCByZWQsIGdyZWVuLCBibHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FtZXJhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIHVwZGF0ZSBsb29wIGZvciB0aGlzIGVmZmVjdC4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGFwc2VkICs9IGRlbHRhO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gQ2xhbXAodGhpcy5fZWxhcHNlZCAvIHRoaXMuZHVyYXRpb24sIDAsIDEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb25VcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZS5jYWxsKHRoaXMuX29uVXBkYXRlU2NvcGUsIHRoaXMuY2FtZXJhLCB0aGlzLnByb2dyZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lbGFwc2VkIDwgdGhpcy5kdXJhdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAxIC0gdGhpcy5wcm9ncmVzcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgQ2FudmFzIFJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLkZsYXNoI3Bvc3RSZW5kZXJDYW52YXNcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggLSBUaGUgQ2FudmFzIGNvbnRleHQgdG8gcmVuZGVyIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZWZmZWN0IGRyZXcgdG8gdGhlIHJlbmRlcmVyLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgcG9zdFJlbmRlckNhbnZhczogZnVuY3Rpb24gKGN0eClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRoaXMucmVkICsgJywnICsgdGhpcy5ncmVlbiArICcsJyArIHRoaXMuYmx1ZSArICcsJyArIHRoaXMuYWxwaGEgKyAnKSc7XHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KGNhbWVyYS5fY3gsIGNhbWVyYS5fY3ksIGNhbWVyYS5fY3csIGNhbWVyYS5fY2gpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjcG9zdFJlbmRlcldlYkdMXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZX0gcGlwZWxpbmUgLSBUaGUgV2ViR0wgUGlwZWxpbmUgdG8gcmVuZGVyIHRvLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZ2V0VGludEZ1bmN0aW9uIC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRoZSBnbCBzYWZlIHRpbnQgY29sb3JzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZWZmZWN0IGRyZXcgdG8gdGhlIHJlbmRlcmVyLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgcG9zdFJlbmRlcldlYkdMOiBmdW5jdGlvbiAocGlwZWxpbmUsIGdldFRpbnRGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG4gICAgICAgIHZhciByZWQgPSB0aGlzLnJlZCAvIDI1NTtcclxuICAgICAgICB2YXIgYmx1ZSA9IHRoaXMuYmx1ZSAvIDI1NTtcclxuICAgICAgICB2YXIgZ3JlZW4gPSB0aGlzLmdyZWVuIC8gMjU1O1xyXG5cclxuICAgICAgICBwaXBlbGluZS5kcmF3RmlsbFJlY3QoXHJcbiAgICAgICAgICAgIGNhbWVyYS5fY3gsIGNhbWVyYS5fY3ksIGNhbWVyYS5fY3csIGNhbWVyYS5fY2gsXHJcbiAgICAgICAgICAgIGdldFRpbnRGdW5jdGlvbihyZWQsIGdyZWVuLCBibHVlLCAxKSxcclxuICAgICAgICAgICAgdGhpcy5hbHBoYVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIGVmZmVjdCBjb21wbGV0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmxhc2gjZWZmZWN0Q29tcGxldGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGTEFTSF9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIGVmZmVjdENvbXBsZXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChFdmVudHMuRkxBU0hfQ09NUExFVEUsIHRoaXMuY2FtZXJhLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBjYW1lcmEgZWZmZWN0LlxyXG4gICAgICogSWYgaXQgd2FzIHByZXZpb3VzbHkgcnVubmluZywgaXQgc3RvcHMgaW5zdGFudGx5IHdpdGhvdXQgY2FsbGluZyBpdHMgb25Db21wbGV0ZSBjYWxsYmFjayBvciBlbWl0dGluZyBhbiBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGVmZmVjdCwgcmVsZWFzaW5nIGl0IGZyb20gdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGbGFzaDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFYXNlTWFwID0gcmVxdWlyZSgnLi4vLi4vLi4vbWF0aC9lYXNpbmcvRWFzZU1hcCcpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIENhbWVyYSBQYW4gZWZmZWN0LlxyXG4gKlxyXG4gKiBUaGlzIGVmZmVjdCB3aWxsIHNjcm9sbCB0aGUgQ2FtZXJhIHNvIHRoYXQgdGhlIGNlbnRlciBvZiBpdHMgdmlld3BvcnQgZmluaXNoZXMgYXQgdGhlIGdpdmVuIGRlc3RpbmF0aW9uLFxyXG4gKiBvdmVyIHRoZSBkdXJhdGlvbiBhbmQgd2l0aCB0aGUgZWFzZSBzcGVjaWZpZWQuXHJcbiAqXHJcbiAqIE9ubHkgdGhlIGNhbWVyYSBzY3JvbGwgaXMgbW92ZWQuIE5vbmUgb2YgdGhlIG9iamVjdHMgaXQgaXMgZGlzcGxheWluZyBhcmUgaW1wYWN0ZWQsIGkuZS4gdGhlaXIgcG9zaXRpb25zIGRvXHJcbiAqIG5vdCBjaGFuZ2UuXHJcbiAqXHJcbiAqIFRoZSBlZmZlY3Qgd2lsbCBkaXNwYXRjaCBzZXZlcmFsIGV2ZW50cyBvbiB0aGUgQ2FtZXJhIGl0c2VsZiBhbmQgeW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gYG9uVXBkYXRlYCBjYWxsYmFjayxcclxuICogd2hpY2ggaXMgaW52b2tlZCBlYWNoIGZyYW1lIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpZiByZXF1aXJlZC5cclxuICpcclxuICogQGNsYXNzIFBhblxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4xMS4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhpcyBlZmZlY3QgaXMgYWN0aW5nIHVwb24uXHJcbiAqL1xyXG52YXIgUGFuID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFBhbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgdGhpcyBlZmZlY3QgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jY2FtZXJhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBlZmZlY3QgYWN0aXZlbHkgcnVubmluZz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jaXNSdW5uaW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QsIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jZHVyYXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3RhcnRpbmcgc2Nyb2xsIGNvb3JkaW5hdGVzIHRvIHBhbiB0aGUgY2FtZXJhIGZyb20uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY29uc3RhbnRseSB1cGRhdGVkIHZhbHVlIGJhc2VkIG9uIHpvb20uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNjdXJyZW50XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZXN0aW5hdGlvbiBzY3JvbGwgY29vcmRpbmF0ZXMgdG8gcGFuIHRoZSBjYW1lcmEgdG8uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNkZXN0aW5hdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGVhc2UgZnVuY3Rpb24gdG8gdXNlIGR1cmluZyB0aGUgcGFuLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jZWFzZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lYXNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGVmZmVjdCBpcyBydW5uaW5nIHRoaXMgaG9sZHMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aGUgcHJvZ3Jlc3MsIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNwcm9ncmVzc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFZmZlY3QgZWxhcHNlZCB0aW1lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jX2VsYXBzZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNfb25VcGRhdGVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhUGFuQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBPbiBDb21wbGV0ZSBjYWxsYmFjayBzY29wZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jX29uVXBkYXRlU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBlZmZlY3Qgd2lsbCBzY3JvbGwgdGhlIENhbWVyYSBzbyB0aGF0IHRoZSBjZW50ZXIgb2YgaXRzIHZpZXdwb3J0IGZpbmlzaGVzIGF0IHRoZSBnaXZlbiBkZXN0aW5hdGlvbixcclxuICAgICAqIG92ZXIgdGhlIGR1cmF0aW9uIGFuZCB3aXRoIHRoZSBlYXNlIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5QYW4jc3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNQQU5fU1RBUlRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNQQU5fQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBkZXN0aW5hdGlvbiB4IGNvb3JkaW5hdGUgdG8gc2Nyb2xsIHRoZSBjZW50ZXIgb2YgdGhlIENhbWVyYSB2aWV3cG9ydCB0by5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGRlc3RpbmF0aW9uIHkgY29vcmRpbmF0ZSB0byBzY3JvbGwgdGhlIGNlbnRlciBvZiB0aGUgQ2FtZXJhIHZpZXdwb3J0IHRvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249MTAwMF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBbZWFzZT0nTGluZWFyJ10gLSBUaGUgZWFzZSB0byB1c2UgZm9yIHRoZSBwYW4uIENhbiBiZSBhbnkgb2YgdGhlIFBoYXNlciBFYXNpbmcgY29uc3RhbnRzIG9yIGEgY3VzdG9tIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gRm9yY2UgdGhlIHBhbiBlZmZlY3QgdG8gc3RhcnQgaW1tZWRpYXRlbHksIGV2ZW4gaWYgYWxyZWFkeSBydW5uaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYVBhbkNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCBmb3VyIGFyZ3VtZW50czogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYSwgYSBwcm9ncmVzcyBhbW91bnQgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaG93IGNvbXBsZXRlIHRoZSBlZmZlY3QgaXMsXHJcbiAgICAgKiB0aGUgY3VycmVudCBjYW1lcmEgc2Nyb2xsIHggY29vcmRpbmF0ZSBhbmQgdGhlIGN1cnJlbnQgY2FtZXJhIHNjcm9sbCB5IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIERlZmF1bHRzIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGUgQ2FtZXJhIGJlbG9uZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFRoZSBDYW1lcmEgb24gd2hpY2ggdGhlIGVmZmVjdCB3YXMgc3RhcnRlZC5cclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICh4LCB5LCBkdXJhdGlvbiwgZWFzZSwgZm9yY2UsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7IGR1cmF0aW9uID0gMTAwMDsgfVxyXG4gICAgICAgIGlmIChlYXNlID09PSB1bmRlZmluZWQpIHsgZWFzZSA9IEVhc2VNYXAuTGluZWFyOyB9XHJcbiAgICAgICAgaWYgKGZvcmNlID09PSB1bmRlZmluZWQpIHsgZm9yY2UgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY29udGV4dCA9IHRoaXMuY2FtZXJhLnNjZW5lOyB9XHJcblxyXG4gICAgICAgIHZhciBjYW0gPSB0aGlzLmNhbWVyYTtcclxuXHJcbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLmlzUnVubmluZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvLyAgU3RhcnRpbmcgZnJvbVxyXG4gICAgICAgIHRoaXMuc291cmNlLnNldChjYW0uc2Nyb2xsWCwgY2FtLnNjcm9sbFkpO1xyXG5cclxuICAgICAgICAvLyAgRGVzdGluYXRpb25cclxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgLy8gIFpvb20gZmFjdG9yZWQgdmVyc2lvblxyXG4gICAgICAgIGNhbS5nZXRTY3JvbGwoeCwgeSwgdGhpcy5jdXJyZW50KTtcclxuXHJcbiAgICAgICAgLy8gIFVzaW5nIHRoaXMgZWFzZVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWFzZSA9PT0gJ3N0cmluZycgJiYgRWFzZU1hcC5oYXNPd25Qcm9wZXJ0eShlYXNlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZWFzZSA9IEVhc2VNYXBbZWFzZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlYXNlID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lYXNlID0gZWFzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBjb250ZXh0O1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYS5lbWl0KEV2ZW50cy5QQU5fU1RBUlQsIHRoaXMuY2FtZXJhLCB0aGlzLCBkdXJhdGlvbiwgeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjYW07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gdXBkYXRlIGxvb3AgZm9yIHRoaXMgZWZmZWN0LiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUsIGluIG1zLCBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0aW1lLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCArPSBkZWx0YTtcclxuXHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gQ2xhbXAodGhpcy5fZWxhcHNlZCAvIHRoaXMuZHVyYXRpb24sIDAsIDEpO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3M7XHJcblxyXG4gICAgICAgIHZhciBjYW0gPSB0aGlzLmNhbWVyYTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2VsYXBzZWQgPCB0aGlzLmR1cmF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmVhc2UocHJvZ3Jlc3MpO1xyXG5cclxuICAgICAgICAgICAgY2FtLmdldFNjcm9sbCh0aGlzLmRlc3RpbmF0aW9uLngsIHRoaXMuZGVzdGluYXRpb24ueSwgdGhpcy5jdXJyZW50KTtcclxuXHJcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5zb3VyY2UueCArICgodGhpcy5jdXJyZW50LnggLSB0aGlzLnNvdXJjZS54KSAqIHYpO1xyXG4gICAgICAgICAgICB2YXIgeSA9IHRoaXMuc291cmNlLnkgKyAoKHRoaXMuY3VycmVudC55IC0gdGhpcy5zb3VyY2UueSkgKiB2KTtcclxuXHJcbiAgICAgICAgICAgIGNhbS5zZXRTY3JvbGwoeCwgeSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fb25VcGRhdGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uVXBkYXRlLmNhbGwodGhpcy5fb25VcGRhdGVTY29wZSwgY2FtLCBwcm9ncmVzcywgeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FtLmNlbnRlck9uKHRoaXMuZGVzdGluYXRpb24ueCwgdGhpcy5kZXN0aW5hdGlvbi55KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25VcGRhdGUuY2FsbCh0aGlzLl9vblVwZGF0ZVNjb3BlLCBjYW0sIHByb2dyZXNzLCBjYW0uc2Nyb2xsWCwgY2FtLnNjcm9sbFkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBlZmZlY3QgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNlZmZlY3RDb21wbGV0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1BBTl9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBlZmZlY3RDb21wbGV0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhLmVtaXQoRXZlbnRzLlBBTl9DT01QTEVURSwgdGhpcy5jYW1lcmEsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIGNhbWVyYSBlZmZlY3QuXHJcbiAgICAgKiBJZiBpdCB3YXMgcHJldmlvdXNseSBydW5uaW5nLCBpdCBzdG9wcyBpbnN0YW50bHkgd2l0aG91dCBjYWxsaW5nIGl0cyBvbkNvbXBsZXRlIGNhbGxiYWNrIG9yIGVtaXR0aW5nIGFuIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbiNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZSA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBlZmZlY3QsIHJlbGVhc2luZyBpdCBmcm9tIHRoZSBDYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUGFuI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFuO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBKYXNvbiBOaWNob2xscyA8bmljaG9sbHMuamFzb25AZ21haWwuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMTggUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3Bob3RvbnN0b3JtL3BoYXNlci9ibG9iL21hc3Rlci9saWNlbnNlLnR4dHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIEVhc2VNYXAgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL2Vhc2luZy9FYXNlTWFwJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIENhbWVyYSBSb3RhdGUgZWZmZWN0LlxyXG4gKlxyXG4gKiBUaGlzIGVmZmVjdCB3aWxsIHJvdGF0ZSB0aGUgQ2FtZXJhIHNvIHRoYXQgdGhlIGl0cyB2aWV3cG9ydCBmaW5pc2hlcyBhdCB0aGUgZ2l2ZW4gYW5nbGUgaW4gcmFkaWFucyxcclxuICogb3ZlciB0aGUgZHVyYXRpb24gYW5kIHdpdGggdGhlIGVhc2Ugc3BlY2lmaWVkLlxyXG4gKiBcclxuICogQ2FtZXJhIHJvdGF0aW9uIGFsd2F5cyB0YWtlcyBwbGFjZSBiYXNlZCBvbiB0aGUgQ2FtZXJhIHZpZXdwb3J0LiBCeSBkZWZhdWx0LCByb3RhdGlvbiBoYXBwZW5zXHJcbiAqIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LiBZb3UgY2FuIGFkanVzdCB0aGlzIHdpdGggdGhlIGBvcmlnaW5YYCBhbmQgYG9yaWdpbllgIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIFJvdGF0aW9uIGluZmx1ZW5jZXMgdGhlIHJlbmRlcmluZyBvZiBfYWxsXyBHYW1lIE9iamVjdHMgdmlzaWJsZSBieSB0aGlzIENhbWVyYS4gSG93ZXZlciwgaXQgZG9lcyBub3RcclxuICogcm90YXRlIHRoZSBDYW1lcmEgdmlld3BvcnQgaXRzZWxmLCB3aGljaCBhbHdheXMgcmVtYWlucyBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlLlxyXG4gKlxyXG4gKiBPbmx5IHRoZSBjYW1lcmEgaXMgcm90YXRlcy4gTm9uZSBvZiB0aGUgb2JqZWN0cyBpdCBpcyBkaXNwbGF5aW5nIGFyZSBpbXBhY3RlZCwgaS5lLiB0aGVpciBwb3NpdGlvbnMgZG9cclxuICogbm90IGNoYW5nZS5cclxuICpcclxuICogVGhlIGVmZmVjdCB3aWxsIGRpc3BhdGNoIHNldmVyYWwgZXZlbnRzIG9uIHRoZSBDYW1lcmEgaXRzZWxmIGFuZCB5b3UgY2FuIGFsc28gc3BlY2lmeSBhbiBgb25VcGRhdGVgIGNhbGxiYWNrLFxyXG4gKiB3aGljaCBpcyBpbnZva2VkIGVhY2ggZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGlmIHJlcXVpcmVkLlxyXG4gKlxyXG4gKiBAY2xhc3MgUm90YXRlVG9cclxuICogQG1lbWJlcm9mIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMjMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoaXMgZWZmZWN0IGlzIGFjdGluZyB1cG9uLlxyXG4gKi9cclxudmFyIFJvdGF0ZVRvID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFJvdGF0ZVRvIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIENhbWVyYSB0aGlzIGVmZmVjdCBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI2NhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoaXMgZWZmZWN0IGFjdGl2ZWx5IHJ1bm5pbmc/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUm90YXRlVG8jaXNSdW5uaW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QsIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUbyNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdGFydGluZyBhbmdsZSB0byByb3RhdGUgdGhlIGNhbWVyYSBmcm9tLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUbyNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNvdXJjZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb25zdGFudGx5IHVwZGF0ZWQgdmFsdWUgYmFzZWQgb24gdGhlIGZvcmNlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUbyNjdXJyZW50XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlc3RpbmF0aW9uIGFuZ2xlIGluIHJhZGlhbnMgdG8gcm90YXRlIHRoZSBjYW1lcmEgdG8uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI2Rlc3RpbmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBlYXNlIGZ1bmN0aW9uIHRvIHVzZSBkdXJpbmcgdGhlIFJvdGF0ZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUm90YXRlVG8jZWFzZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lYXNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGVmZmVjdCBpcyBydW5uaW5nIHRoaXMgaG9sZHMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aGUgcHJvZ3Jlc3MsIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI3Byb2dyZXNzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEVmZmVjdCBlbGFwc2VkIHRpbWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI19lbGFwc2VkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNhbGxiYWNrIENhbWVyYVJvdGF0ZUNhbGxiYWNrXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIG9uIHdoaWNoIHRoZSBlZmZlY3QgaXMgcnVubmluZy5cclxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gcHJvZ3Jlc3MgLSBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdC4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIENhbWVyYSdzIG5ldyBhbmdsZSBpbiByYWRpYW5zLlxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI19vblVwZGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHs/Q2FtZXJhUm90YXRlQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBPbiBDb21wbGV0ZSBjYWxsYmFjayBzY29wZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUbyNfb25VcGRhdGVTY29wZVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgcm90YXRpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI2Nsb2Nrd2lzZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNsb2Nrd2lzZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzaG9ydGVzdCBkaXJlY3Rpb24gdG8gdGhlIHRhcmdldCByb3RhdGlvbi5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUm90YXRlVG8jc2hvcnRlc3RQYXRoXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hvcnRlc3RQYXRoID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBlZmZlY3Qgd2lsbCBzY3JvbGwgdGhlIENhbWVyYSBzbyB0aGF0IHRoZSBjZW50ZXIgb2YgaXRzIHZpZXdwb3J0IGZpbmlzaGVzIGF0IHRoZSBnaXZlbiBhbmdsZSxcclxuICAgICAqIG92ZXIgdGhlIGR1cmF0aW9uIGFuZCB3aXRoIHRoZSBlYXNlIHNwZWNpZmllZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUbyNzdGFydFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1JPVEFURV9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1JPVEFURV9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gVGhlIGRlc3RpbmF0aW9uIGFuZ2xlIGluIHJhZGlhbnMgdG8gcm90YXRlIHRoZSBDYW1lcmEgdmlld3BvcnQgdG8uIElmIHRoZSBhbmdsZSBpcyBwb3NpdGl2ZSB0aGVuIHRoZSByb3RhdGlvbiBpcyBjbG9ja3dpc2UgZWxzZSBhbnRpY2xvY2t3aXNlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG9ydGVzdFBhdGg9ZmFsc2VdIC0gSWYgc2hvcnRlc3QgcGF0aCBpcyBzZXQgdG8gdHJ1ZSB0aGUgY2FtZXJhIHdpbGwgcm90YXRlIGluIHRoZSBxdWlja2VzdCBkaXJlY3Rpb24gY2xvY2t3aXNlIG9yIGFudGktY2xvY2t3aXNlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249MTAwMF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBbZWFzZT0nTGluZWFyJ10gLSBUaGUgZWFzZSB0byB1c2UgZm9yIHRoZSBSb3RhdGUuIENhbiBiZSBhbnkgb2YgdGhlIFBoYXNlciBFYXNpbmcgY29uc3RhbnRzIG9yIGEgY3VzdG9tIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gRm9yY2UgdGhlIHJvdGF0aW9uIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge0NhbWVyYVJvdGF0ZUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCBmb3VyIGFyZ3VtZW50czogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYSwgYSBwcm9ncmVzcyBhbW91bnQgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgaG93IGNvbXBsZXRlIHRoZSBlZmZlY3QgaXMsXHJcbiAgICAgKiB0aGUgY3VycmVudCBjYW1lcmEgc2Nyb2xsIHggY29vcmRpbmF0ZSBhbmQgdGhlIGN1cnJlbnQgY2FtZXJhIHNjcm9sbCB5IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIERlZmF1bHRzIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGUgQ2FtZXJhIGJlbG9uZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFRoZSBDYW1lcmEgb24gd2hpY2ggdGhlIGVmZmVjdCB3YXMgc3RhcnRlZC5cclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIChyYWRpYW5zLCBzaG9ydGVzdFBhdGgsIGR1cmF0aW9uLCBlYXNlLCBmb3JjZSwgY2FsbGJhY2ssIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB1bmRlZmluZWQpIHsgZHVyYXRpb24gPSAxMDAwOyB9XHJcbiAgICAgICAgaWYgKGVhc2UgPT09IHVuZGVmaW5lZCkgeyBlYXNlID0gRWFzZU1hcC5MaW5lYXI7IH1cclxuICAgICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCkgeyBmb3JjZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgY2FsbGJhY2sgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkgeyBjb250ZXh0ID0gdGhpcy5jYW1lcmEuc2NlbmU7IH1cclxuICAgICAgICBpZiAoc2hvcnRlc3RQYXRoID09PSB1bmRlZmluZWQpIHsgc2hvcnRlc3RQYXRoID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG9ydGVzdFBhdGggPSBzaG9ydGVzdFBhdGg7XHJcblxyXG4gICAgICAgIHZhciB0bXBEZXN0aW5hdGlvbiA9IHJhZGlhbnM7XHJcblxyXG4gICAgICAgIGlmIChyYWRpYW5zIDwgMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRtcERlc3RpbmF0aW9uID0gLTEgKiByYWRpYW5zO1xyXG4gICAgICAgICAgICB0aGlzLmNsb2Nrd2lzZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsb2Nrd2lzZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbWF4UmFkID0gKDM2MCAqIE1hdGguUEkpIC8gMTgwO1xyXG5cclxuICAgICAgICB0bXBEZXN0aW5hdGlvbiA9IHRtcERlc3RpbmF0aW9uIC0gKE1hdGguZmxvb3IodG1wRGVzdGluYXRpb24gLyBtYXhSYWQpICogbWF4UmFkKTtcclxuXHJcbiAgICAgICAgdmFyIGNhbSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuICAgICAgICBpZiAoIWZvcmNlICYmIHRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgIC8vICBTdGFydGluZyBmcm9tXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBjYW0ucm90YXRpb247XHJcblxyXG4gICAgICAgIC8vICBEZXN0aW5hdGlvblxyXG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSB0bXBEZXN0aW5hdGlvbjtcclxuXHJcbiAgICAgICAgLy8gIFVzaW5nIHRoaXMgZWFzZVxyXG4gICAgICAgIGlmICh0eXBlb2YgZWFzZSA9PT0gJ3N0cmluZycgJiYgRWFzZU1hcC5oYXNPd25Qcm9wZXJ0eShlYXNlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZWFzZSA9IEVhc2VNYXBbZWFzZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlYXNlID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lYXNlID0gZWFzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBjb250ZXh0O1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvcnRlc3RQYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gVGhlIHNob3J0ZXN0IHBhdGggaXMgdHJ1ZSBzbyBjYWxjdWxhdGUgdGhlIHF1aWNrZXN0IGRpcmVjdGlvblxyXG4gICAgICAgICAgICB2YXIgY3dEaXN0ID0gMDtcclxuICAgICAgICAgICAgdmFyIGFjd0Rpc3QgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdGluYXRpb24gPiB0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY3dEaXN0ID0gTWF0aC5hYnModGhpcy5kZXN0aW5hdGlvbiAtIHRoaXMuc291cmNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGN3RGlzdCA9IChNYXRoLmFicyh0aGlzLmRlc3RpbmF0aW9uICsgbWF4UmFkKSAtIHRoaXMuc291cmNlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlID4gdGhpcy5kZXN0aW5hdGlvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYWN3RGlzdCA9IE1hdGguYWJzKHRoaXMuc291cmNlIC0gdGhpcy5kZXN0aW5hdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhY3dEaXN0ID0gKE1hdGguYWJzKHRoaXMuc291cmNlICsgbWF4UmFkKSAtIHRoaXMuZGVzdGluYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3dEaXN0IDwgYWN3RGlzdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGN3RGlzdCA+IGFjd0Rpc3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvY2t3aXNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhLmVtaXQoRXZlbnRzLlJPVEFURV9TVEFSVCwgdGhpcy5jYW1lcmEsIHRoaXMsIGR1cmF0aW9uLCB0bXBEZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBjYW07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gdXBkYXRlIGxvb3AgZm9yIHRoaXMgZWZmZWN0LiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGFwc2VkICs9IGRlbHRhO1xyXG5cclxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBDbGFtcCh0aGlzLl9lbGFwc2VkIC8gdGhpcy5kdXJhdGlvbiwgMCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzcztcclxuXHJcbiAgICAgICAgdmFyIGNhbSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZWxhcHNlZCA8IHRoaXMuZHVyYXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuZWFzZShwcm9ncmVzcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBjYW0ucm90YXRpb247XHJcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBtYXhSYWQgPSAoMzYwICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmRlc3RpbmF0aW9uO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb2Nrd2lzZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3VycmVudDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmRlc3RpbmF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID49IGN1cnJlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0IC0gY3VycmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IChNYXRoLmFicyh0YXJnZXQgKyBtYXhSYWQpIC0gY3VycmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciByID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNsb2Nrd2lzZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgciA9IChjYW0ucm90YXRpb24gKyAoZGlzdGFuY2UgKiB2KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByID0gKGNhbS5yb3RhdGlvbiAtIChkaXN0YW5jZSAqIHYpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2FtLnJvdGF0aW9uID0gcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb25VcGRhdGUuY2FsbCh0aGlzLl9vblVwZGF0ZVNjb3BlLCBjYW0sIHByb2dyZXNzLCByKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYW0ucm90YXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX29uVXBkYXRlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblVwZGF0ZS5jYWxsKHRoaXMuX29uVXBkYXRlU2NvcGUsIGNhbSwgcHJvZ3Jlc3MsIHRoaXMuZGVzdGluYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBlZmZlY3QgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI2VmZmVjdENvbXBsZXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKi9cclxuICAgIGVmZmVjdENvbXBsZXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChFdmVudHMuUk9UQVRFX0NPTVBMRVRFLCB0aGlzLmNhbWVyYSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgY2FtZXJhIGVmZmVjdC5cclxuICAgICAqIElmIGl0IHdhcyBwcmV2aW91c2x5IHJ1bm5pbmcsIGl0IHN0b3BzIGluc3RhbnRseSB3aXRob3V0IGNhbGxpbmcgaXRzIG9uQ29tcGxldGUgY2FsbGJhY2sgb3IgZW1pdHRpbmcgYW4gZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUm90YXRlVG8jcmVzZXRcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgZWZmZWN0LCByZWxlYXNpbmcgaXQgZnJvbSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlJvdGF0ZVRvI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlVG87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vLi4vLi4vbWF0aC9DbGFtcCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIENhbWVyYSBTaGFrZSBlZmZlY3QuXHJcbiAqXHJcbiAqIFRoaXMgZWZmZWN0IHdpbGwgc2hha2UgdGhlIGNhbWVyYSB2aWV3cG9ydCBieSBhIHJhbmRvbSBhbW91bnQsIGJvdW5kZWQgYnkgdGhlIHNwZWNpZmllZCBpbnRlbnNpdHksIGVhY2ggZnJhbWUuXHJcbiAqXHJcbiAqIE9ubHkgdGhlIGNhbWVyYSB2aWV3cG9ydCBpcyBtb3ZlZC4gTm9uZSBvZiB0aGUgb2JqZWN0cyBpdCBpcyBkaXNwbGF5aW5nIGFyZSBpbXBhY3RlZCwgaS5lLiB0aGVpciBwb3NpdGlvbnMgZG9cclxuICogbm90IGNoYW5nZS5cclxuICpcclxuICogVGhlIGVmZmVjdCB3aWxsIGRpc3BhdGNoIHNldmVyYWwgZXZlbnRzIG9uIHRoZSBDYW1lcmEgaXRzZWxmIGFuZCB5b3UgY2FuIGFsc28gc3BlY2lmeSBhbiBgb25VcGRhdGVgIGNhbGxiYWNrLFxyXG4gKiB3aGljaCBpcyBpbnZva2VkIGVhY2ggZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGlmIHJlcXVpcmVkLlxyXG4gKlxyXG4gKiBAY2xhc3MgU2hha2VcclxuICogQG1lbWJlcm9mIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuNS4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhpcyBlZmZlY3QgaXMgYWN0aW5nIHVwb24uXHJcbiAqL1xyXG52YXIgU2hha2UgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2hha2UgKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIHRoaXMgZWZmZWN0IGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuU2hha2UjY2FtZXJhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIGVmZmVjdCBhY3RpdmVseSBydW5uaW5nP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI2lzUnVubmluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QsIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZSNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LiBVc2Ugc21hbGwgZmxvYXQgdmFsdWVzLiBUaGUgZGVmYXVsdCB3aGVuIHRoZSBlZmZlY3Qgc3RhcnRzIGlzIDAuMDUuXHJcbiAgICAgICAgICogVGhpcyBpcyBhIFZlY3RvcjIgb2JqZWN0LCBhbGxvd2luZyB5b3UgdG8gY29udHJvbCB0aGUgc2hha2UgaW50ZW5zaXR5IGluZGVwZW5kZW50bHkgYWNyb3NzIHggYW5kIHkuXHJcbiAgICAgICAgICogWW91IGNhbiBtb2RpZnkgdGhpcyB2YWx1ZSB3aGlsZSB0aGUgZWZmZWN0IGlzIGFjdGl2ZSB0byBjcmVhdGUgbW9yZSB2YXJpZWQgc2hha2UgZWZmZWN0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZSNpbnRlbnNpdHlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmludGVuc2l0eSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgZWZmZWN0IGlzIHJ1bm5pbmcgdGhpcyBob2xkcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIHRoZSBwcm9ncmVzcywgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuU2hha2UjcHJvZ3Jlc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFZmZlY3QgZWxhcHNlZCB0aW1lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZSNfZWxhcHNlZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG93IG11Y2ggdG8gb2Zmc2V0IHRoZSBjYW1lcmEgYnkgaG9yaXpvbnRhbGx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI19vZmZzZXRYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vZmZzZXRYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG93IG11Y2ggdG8gb2Zmc2V0IHRoZSBjYW1lcmEgYnkgdmVydGljYWxseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZSNfb2Zmc2V0WVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBldmVyeSBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuU2hha2UjX29uVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYVNoYWtlQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9uIENvbXBsZXRlIGNhbGxiYWNrIHNjb3BlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI19vblVwZGF0ZVNjb3BlXHJcbiAgICAgICAgICogQHR5cGUge2FueX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hha2VzIHRoZSBDYW1lcmEgYnkgdGhlIGdpdmVuIGludGVuc2l0eSBvdmVyIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuU2hha2Ujc3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNTSEFLRV9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1NIQUtFX0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkdXJhdGlvbj0xMDBdIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5NYXRoLlZlY3RvcjIpfSBbaW50ZW5zaXR5PTAuMDVdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgc2hha2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBGb3JjZSB0aGUgc2hha2UgZWZmZWN0IHRvIHN0YXJ0IGltbWVkaWF0ZWx5LCBldmVuIGlmIGFscmVhZHkgcnVubmluZy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFTaGFrZUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCB0d28gYXJndW1lbnRzOiBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhIGFuZCBhIHByb2dyZXNzIGFtb3VudCBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgY29tcGxldGUgdGhlIGVmZmVjdCBpcy5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gRGVmYXVsdHMgdG8gdGhlIFNjZW5lIHRvIHdoaWNoIHRoZSBDYW1lcmEgYmVsb25ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gVGhlIENhbWVyYSBvbiB3aGljaCB0aGUgZWZmZWN0IHdhcyBzdGFydGVkLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKGR1cmF0aW9uLCBpbnRlbnNpdHksIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkgeyBkdXJhdGlvbiA9IDEwMDsgfVxyXG4gICAgICAgIGlmIChpbnRlbnNpdHkgPT09IHVuZGVmaW5lZCkgeyBpbnRlbnNpdHkgPSAwLjA1OyB9XHJcbiAgICAgICAgaWYgKGZvcmNlID09PSB1bmRlZmluZWQpIHsgZm9yY2UgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY29udGV4dCA9IHRoaXMuY2FtZXJhLnNjZW5lOyB9XHJcblxyXG4gICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW1lcmE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGludGVuc2l0eSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmludGVuc2l0eS5zZXQoaW50ZW5zaXR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlbnNpdHkuc2V0KGludGVuc2l0eS54LCBpbnRlbnNpdHkueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuICAgICAgICB0aGlzLl9vZmZzZXRYID0gMDtcclxuICAgICAgICB0aGlzLl9vZmZzZXRZID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSBjYWxsYmFjaztcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gY29udGV4dDtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChFdmVudHMuU0hBS0VfU1RBUlQsIHRoaXMuY2FtZXJhLCB0aGlzLCBkdXJhdGlvbiwgaW50ZW5zaXR5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FtZXJhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwcmUtcmVuZGVyIHN0ZXAgZm9yIHRoaXMgZWZmZWN0LiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI3ByZVJlbmRlclxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHByZVJlbmRlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYS5tYXRyaXgudHJhbnNsYXRlKHRoaXMuX29mZnNldFgsIHRoaXMuX29mZnNldFkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiB1cGRhdGUgbG9vcCBmb3IgdGhpcyBlZmZlY3QuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBDYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuU2hha2UjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUsIGluIG1zLCBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0aW1lLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCArPSBkZWx0YTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IENsYW1wKHRoaXMuX2VsYXBzZWQgLyB0aGlzLmR1cmF0aW9uLCAwLCAxKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29uVXBkYXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fb25VcGRhdGUuY2FsbCh0aGlzLl9vblVwZGF0ZVNjb3BlLCB0aGlzLmNhbWVyYSwgdGhpcy5wcm9ncmVzcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZWxhcHNlZCA8IHRoaXMuZHVyYXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuY2FtZXJhLl9jdztcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuY2FtZXJhLl9jaDtcclxuICAgICAgICAgICAgdmFyIHpvb20gPSB0aGlzLmNhbWVyYS56b29tO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WCA9IChNYXRoLnJhbmRvbSgpICogaW50ZW5zaXR5LnggKiB3aWR0aCAqIDIgLSBpbnRlbnNpdHkueCAqIHdpZHRoKSAqIHpvb207XHJcbiAgICAgICAgICAgIHRoaXMuX29mZnNldFkgPSAoTWF0aC5yYW5kb20oKSAqIGludGVuc2l0eS55ICogaGVpZ2h0ICogMiAtIGludGVuc2l0eS55ICogaGVpZ2h0KSAqIHpvb207XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jYW1lcmEucm91bmRQaXhlbHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldFggPSBNYXRoLnJvdW5kKHRoaXMuX29mZnNldFgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IE1hdGgucm91bmQodGhpcy5fb2Zmc2V0WSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBlZmZlY3QgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI2VmZmVjdENvbXBsZXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjU0hBS0VfQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBlZmZlY3RDb21wbGV0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9vZmZzZXRYID0gMDtcclxuICAgICAgICB0aGlzLl9vZmZzZXRZID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYS5lbWl0KEV2ZW50cy5TSEFLRV9DT01QTEVURSwgdGhpcy5jYW1lcmEsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIGNhbWVyYSBlZmZlY3QuXHJcbiAgICAgKiBJZiBpdCB3YXMgcHJldmlvdXNseSBydW5uaW5nLCBpdCBzdG9wcyBpbnN0YW50bHkgd2l0aG91dCBjYWxsaW5nIGl0cyBvbkNvbXBsZXRlIGNhbGxiYWNrIG9yIGVtaXR0aW5nIGFuIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlI3Jlc2V0XHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fb2Zmc2V0WCA9IDA7XHJcbiAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGVmZmVjdCwgcmVsZWFzaW5nIGl0IGZyb20gdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5TaGFrZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuICAgICAgICB0aGlzLmludGVuc2l0eSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2hha2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vLi4vLi4vbWF0aC9DbGFtcCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRWFzZU1hcCA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvZWFzaW5nL0Vhc2VNYXAnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBDYW1lcmEgWm9vbSBlZmZlY3QuXHJcbiAqXHJcbiAqIFRoaXMgZWZmZWN0IHdpbGwgem9vbSB0aGUgQ2FtZXJhIHRvIHRoZSBnaXZlbiBzY2FsZSwgb3ZlciB0aGUgZHVyYXRpb24gYW5kIHdpdGggdGhlIGVhc2Ugc3BlY2lmaWVkLlxyXG4gKlxyXG4gKiBUaGUgZWZmZWN0IHdpbGwgZGlzcGF0Y2ggc2V2ZXJhbCBldmVudHMgb24gdGhlIENhbWVyYSBpdHNlbGYgYW5kIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGFuIGBvblVwZGF0ZWAgY2FsbGJhY2ssXHJcbiAqIHdoaWNoIGlzIGludm9rZWQgZWFjaCBmcmFtZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QgaWYgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBab29tXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjExLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGlzIGVmZmVjdCBpcyBhY3RpbmcgdXBvbi5cclxuICovXHJcbnZhciBab29tID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFpvb20gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FtZXJhIHRoaXMgZWZmZWN0IGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuWm9vbSNjYW1lcmFcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIGVmZmVjdCBhY3RpdmVseSBydW5uaW5nP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jaXNSdW5uaW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QsIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5ab29tI2R1cmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0YXJ0aW5nIHpvb20gdmFsdWU7XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuWm9vbSNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNvdXJjZSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZXN0aW5hdGlvbiB6b29tIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jZGVzdGluYXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGVhc2UgZnVuY3Rpb24gdG8gdXNlIGR1cmluZyB0aGUgem9vbS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5ab29tI2Vhc2VcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZWFzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBlZmZlY3QgaXMgcnVubmluZyB0aGlzIGhvbGRzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgdGhlIHByb2dyZXNzLCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5ab29tI3Byb2dyZXNzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEVmZmVjdCBlbGFwc2VkIHRpbWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jX2VsYXBzZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jX29uVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYVpvb21DYWxsYmFja31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9uIENvbXBsZXRlIGNhbGxiYWNrIHNjb3BlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jX29uVXBkYXRlU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBlZmZlY3Qgd2lsbCB6b29tIHRoZSBDYW1lcmEgdG8gdGhlIGdpdmVuIHNjYWxlLCBvdmVyIHRoZSBkdXJhdGlvbiBhbmQgd2l0aCB0aGUgZWFzZSBzcGVjaWZpZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuWm9vbSNzdGFydFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1pPT01fU1RBUlRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNaT09NX0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb20gLSBUaGUgdGFyZ2V0IENhbWVyYSB6b29tIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249MTAwMF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBbZWFzZT0nTGluZWFyJ10gLSBUaGUgZWFzZSB0byB1c2UgZm9yIHRoZSBab29tLiBDYW4gYmUgYW55IG9mIHRoZSBQaGFzZXIgRWFzaW5nIGNvbnN0YW50cyBvciBhIGN1c3RvbSBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIEZvcmNlIHRoZSB6b29tIGVmZmVjdCB0byBzdGFydCBpbW1lZGlhdGVseSwgZXZlbiBpZiBhbHJlYWR5IHJ1bm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhWm9vbUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgZXZlcnkgZnJhbWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICogSXQgaXMgc2VudCB0aHJlZSBhcmd1bWVudHM6IEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEsIGEgcHJvZ3Jlc3MgYW1vdW50IGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBjb21wbGV0ZSB0aGUgZWZmZWN0IGlzLFxyXG4gICAgICogYW5kIHRoZSBjdXJyZW50IGNhbWVyYSB6b29tIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLiBEZWZhdWx0cyB0byB0aGUgU2NlbmUgdG8gd2hpY2ggdGhlIENhbWVyYSBiZWxvbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBUaGUgQ2FtZXJhIG9uIHdoaWNoIHRoZSBlZmZlY3Qgd2FzIHN0YXJ0ZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoem9vbSwgZHVyYXRpb24sIGVhc2UsIGZvcmNlLCBjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoZHVyYXRpb24gPT09IHVuZGVmaW5lZCkgeyBkdXJhdGlvbiA9IDEwMDA7IH1cclxuICAgICAgICBpZiAoZWFzZSA9PT0gdW5kZWZpbmVkKSB7IGVhc2UgPSBFYXNlTWFwLkxpbmVhcjsgfVxyXG4gICAgICAgIGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkKSB7IGZvcmNlID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNvbnRleHQgPSB0aGlzLmNhbWVyYS5zY2VuZTsgfVxyXG5cclxuICAgICAgICB2YXIgY2FtID0gdGhpcy5jYW1lcmE7XHJcblxyXG4gICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gY2FtO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgLy8gIFN0YXJ0aW5nIGZyb21cclxuICAgICAgICB0aGlzLnNvdXJjZSA9IGNhbS56b29tO1xyXG5cclxuICAgICAgICAvLyAgWm9vbWluZyB0b1xyXG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSB6b29tO1xyXG5cclxuICAgICAgICAvLyAgVXNpbmcgdGhpcyBlYXNlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBlYXNlID09PSAnc3RyaW5nJyAmJiBFYXNlTWFwLmhhc093blByb3BlcnR5KGVhc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lYXNlID0gRWFzZU1hcFtlYXNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVhc2UgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVhc2UgPSBlYXNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZSA9IGNvbnRleHQ7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhLmVtaXQoRXZlbnRzLlpPT01fU1RBUlQsIHRoaXMuY2FtZXJhLCB0aGlzLCBkdXJhdGlvbiwgem9vbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjYW07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gdXBkYXRlIGxvb3AgZm9yIHRoaXMgZWZmZWN0LiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGdlbmVyYXRlZCBieSB0aGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgb3IgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VsYXBzZWQgKz0gZGVsdGE7XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBDbGFtcCh0aGlzLl9lbGFwc2VkIC8gdGhpcy5kdXJhdGlvbiwgMCwgMSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lbGFwc2VkIDwgdGhpcy5kdXJhdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnpvb20gPSB0aGlzLnNvdXJjZSArICgodGhpcy5kZXN0aW5hdGlvbiAtIHRoaXMuc291cmNlKSAqIHRoaXMuZWFzZSh0aGlzLnByb2dyZXNzKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fb25VcGRhdGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uVXBkYXRlLmNhbGwodGhpcy5fb25VcGRhdGVTY29wZSwgdGhpcy5jYW1lcmEsIHRoaXMucHJvZ3Jlc3MsIHRoaXMuY2FtZXJhLnpvb20pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnpvb20gPSB0aGlzLmRlc3RpbmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX29uVXBkYXRlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vblVwZGF0ZS5jYWxsKHRoaXMuX29uVXBkYXRlU2NvcGUsIHRoaXMuY2FtZXJhLCB0aGlzLnByb2dyZXNzLCB0aGlzLmRlc3RpbmF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lZmZlY3RDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBlZmZlY3QgY29tcGxldGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jZWZmZWN0Q29tcGxldGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNaT09NX0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIGVmZmVjdENvbXBsZXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZW1pdChFdmVudHMuWk9PTV9DT01QTEVURSwgdGhpcy5jYW1lcmEsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIGNhbWVyYSBlZmZlY3QuXHJcbiAgICAgKiBJZiBpdCB3YXMgcHJldmlvdXNseSBydW5uaW5nLCBpdCBzdG9wcyBpbnN0YW50bHkgd2l0aG91dCBjYWxsaW5nIGl0cyBvbkNvbXBsZXRlIGNhbGxiYWNrIG9yIGVtaXR0aW5nIGFuIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jcmVzZXRcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlU2NvcGUgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgZWZmZWN0LCByZWxlYXNpbmcgaXQgZnJvbSB0aGUgQ2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb20jZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFpvb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgRmFkZTogcmVxdWlyZSgnLi9GYWRlJyksXHJcbiAgICBGbGFzaDogcmVxdWlyZSgnLi9GbGFzaCcpLFxyXG4gICAgUGFuOiByZXF1aXJlKCcuL1BhbicpLFxyXG4gICAgU2hha2U6IHJlcXVpcmUoJy4vU2hha2UnKSxcclxuICAgIFJvdGF0ZVRvOiByZXF1aXJlKCcuL1JvdGF0ZVRvJyksXHJcbiAgICBab29tOiByZXF1aXJlKCcuL1pvb20nKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIERlc3Ryb3kgQ2FtZXJhIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gaXQgaXMgZGVzdHJveWVkIGJ5IHRoZSBDYW1lcmEgTWFuYWdlci5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0RFU1RST1lcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IHdhcyBkZXN0cm95ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFkZXN0cm95JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENhbWVyYSBGYWRlIEluIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIEZhZGUgSW4gRWZmZWN0IGNvbXBsZXRlcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgQ2FtZXJhIGluc3RhbmNlIHVzaW5nIGBDYW1lcmEub24oJ2NhbWVyYWZhZGVpbmNvbXBsZXRlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfSU5fQ09NUExFVEVcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZX0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYWZhZGVpbmNvbXBsZXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENhbWVyYSBGYWRlIEluIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIEZhZGUgSW4gRWZmZWN0IHN0YXJ0cy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgQ2FtZXJhIGluc3RhbmNlIHVzaW5nIGBDYW1lcmEub24oJ2NhbWVyYWZhZGVpbnN0YXJ0JywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI0ZBREVfSU5fU1RBUlRcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZX0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHJlZCAtIFRoZSByZWQgY29sb3IgY2hhbm5lbCB2YWx1ZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBncmVlbiAtIFRoZSBncmVlbiBjb2xvciBjaGFubmVsIHZhbHVlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGJsdWUgLSBUaGUgYmx1ZSBjb2xvciBjaGFubmVsIHZhbHVlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY2FtZXJhZmFkZWluc3RhcnQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FtZXJhIEZhZGUgT3V0IENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIEZhZGUgT3V0IEVmZmVjdCBjb21wbGV0ZXMuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIENhbWVyYSBpbnN0YW5jZSB1c2luZyBgQ2FtZXJhLm9uKCdjYW1lcmFmYWRlb3V0Y29tcGxldGUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjRkFERV9PVVRfQ09NUExFVEVcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuRmFkZX0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYWZhZGVvdXRjb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgRmFkZSBPdXQgU3RhcnQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2Ugd2hlbiB0aGUgRmFkZSBPdXQgRWZmZWN0IHN0YXJ0cy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgQ2FtZXJhIGluc3RhbmNlIHVzaW5nIGBDYW1lcmEub24oJ2NhbWVyYWZhZGVvdXRzdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGQURFX09VVF9TVEFSVFxyXG4gKiBAc2luY2UgMy4zLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCB0aGUgZWZmZWN0IGJlZ2FuIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GYWRlfSBlZmZlY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWZmZWN0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gcmVkIC0gVGhlIHJlZCBjb2xvciBjaGFubmVsIHZhbHVlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGdyZWVuIC0gVGhlIGdyZWVuIGNvbG9yIGNoYW5uZWwgdmFsdWUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYmx1ZSAtIFRoZSBibHVlIGNvbG9yIGNoYW5uZWwgdmFsdWUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFmYWRlb3V0c3RhcnQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FtZXJhIEZsYXNoIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIEZsYXNoIEVmZmVjdCBjb21wbGV0ZXMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGTEFTSF9DT01QTEVURVxyXG4gKiBAc2luY2UgMy4zLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCB0aGUgZWZmZWN0IGJlZ2FuIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaH0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYWZsYXNoY29tcGxldGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FtZXJhIEZsYXNoIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIEZsYXNoIEVmZmVjdCBzdGFydHMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNGTEFTSF9TVEFSVFxyXG4gKiBAc2luY2UgMy4zLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCB0aGUgZWZmZWN0IGJlZ2FuIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5GbGFzaH0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHJlZCAtIFRoZSByZWQgY29sb3IgY2hhbm5lbCB2YWx1ZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBncmVlbiAtIFRoZSBncmVlbiBjb2xvciBjaGFubmVsIHZhbHVlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGJsdWUgLSBUaGUgYmx1ZSBjb2xvciBjaGFubmVsIHZhbHVlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY2FtZXJhZmxhc2hzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgUGFuIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIFBhbiBFZmZlY3QgY29tcGxldGVzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjUEFOX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjMuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IHRoZSBlZmZlY3QgYmVnYW4gb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlBhbn0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYXBhbmNvbXBsZXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENhbWVyYSBQYW4gU3RhcnQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2Ugd2hlbiB0aGUgUGFuIEVmZmVjdCBzdGFydHMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNQQU5fU1RBUlRcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUGFufSBlZmZlY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWZmZWN0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGRlc3RpbmF0aW9uIHNjcm9sbCB4IGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGRlc3RpbmF0aW9uIHNjcm9sbCB5IGNvb3JkaW5hdGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFwYW5zdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgUG9zdC1SZW5kZXIgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2UgYWZ0ZXIgaXMgaGFzIGZpbmlzaGVkIHJlbmRlcmluZy5cclxuICogSXQgaXMgb25seSBkaXNwYXRjaGVkIGlmIHRoZSBDYW1lcmEgaXMgcmVuZGVyaW5nIHRvIGEgdGV4dHVyZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgQ2FtZXJhIGluc3RhbmNlIHVzaW5nOiBgY2FtZXJhLm9uKCdwb3N0cmVuZGVyJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1BPU1RfUkVOREVSXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBoYXMgZmluaXNoZWQgcmVuZGVyaW5nIHRvIGEgdGV4dHVyZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Bvc3RyZW5kZXInO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FtZXJhIFByZS1SZW5kZXIgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2Ugd2hlbiBpdCBpcyBhYm91dCB0byByZW5kZXIuXHJcbiAqIEl0IGlzIG9ubHkgZGlzcGF0Y2hlZCBpZiB0aGUgQ2FtZXJhIGlzIHJlbmRlcmluZyB0byBhIHRleHR1cmUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIENhbWVyYSBpbnN0YW5jZSB1c2luZzogYGNhbWVyYS5vbigncHJlcmVuZGVyJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1BSRV9SRU5ERVJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQmFzZUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIGFib3V0IHRvIHJlbmRlciB0byBhIHRleHR1cmUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwcmVyZW5kZXInO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2FtZXJhIFJvdGF0ZSBDb21wbGV0ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIENhbWVyYSBpbnN0YW5jZSB3aGVuIHRoZSBSb3RhdGUgRWZmZWN0IGNvbXBsZXRlcy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1JPVEFURV9DT01QTEVURVxyXG4gKiBAc2luY2UgMy4yMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuUm90YXRlVG99IGVmZmVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBlZmZlY3QgaW5zdGFuY2UuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFyb3RhdGVjb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgUm90YXRlIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIFJvdGF0ZSBFZmZlY3Qgc3RhcnRzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHMjUk9UQVRFX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCB0aGUgZWZmZWN0IGJlZ2FuIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuRWZmZWN0cy5Sb3RhdGVUb30gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVzdGluYXRpb24gLSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFyb3RhdGVzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgU2hha2UgQ29tcGxldGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2Ugd2hlbiB0aGUgU2hha2UgRWZmZWN0IGNvbXBsZXRlcy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1NIQUtFX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjMuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IHRoZSBlZmZlY3QgYmVnYW4gb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlfSBlZmZlY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWZmZWN0IGluc3RhbmNlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY2FtZXJhc2hha2Vjb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgU2hha2UgU3RhcnQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBDYW1lcmEgaW5zdGFuY2Ugd2hlbiB0aGUgU2hha2UgRWZmZWN0IHN0YXJ0cy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1NIQUtFX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjMuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IHRoZSBlZmZlY3QgYmVnYW4gb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlNoYWtlfSBlZmZlY3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgZWZmZWN0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbnNpdHkgLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjYW1lcmFzaGFrZXN0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENhbWVyYSBab29tIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgQ2FtZXJhIGluc3RhbmNlIHdoZW4gdGhlIFpvb20gRWZmZWN0IGNvbXBsZXRlcy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5DYW1lcmFzLlNjZW5lMkQuRXZlbnRzI1pPT01fQ09NUExFVEVcclxuICogQHNpbmNlIDMuMy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgdGhlIGVmZmVjdCBiZWdhbiBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkVmZmVjdHMuWm9vbX0gZWZmZWN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGVmZmVjdCBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYXpvb21jb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW1lcmEgWm9vbSBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIENhbWVyYSBpbnN0YW5jZSB3aGVuIHRoZSBab29tIEVmZmVjdCBzdGFydHMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkV2ZW50cyNaT09NX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjMuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IHRoZSBlZmZlY3QgYmVnYW4gb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FZmZlY3RzLlpvb219IGVmZmVjdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBlZmZlY3QgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHpvb20gLSBUaGUgZGVzdGluYXRpb24gem9vbSB2YWx1ZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NhbWVyYXpvb21zdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBERVNUUk9ZOiByZXF1aXJlKCcuL0RFU1RST1lfRVZFTlQnKSxcclxuICAgIEZBREVfSU5fQ09NUExFVEU6IHJlcXVpcmUoJy4vRkFERV9JTl9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgRkFERV9JTl9TVEFSVDogcmVxdWlyZSgnLi9GQURFX0lOX1NUQVJUX0VWRU5UJyksXHJcbiAgICBGQURFX09VVF9DT01QTEVURTogcmVxdWlyZSgnLi9GQURFX09VVF9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgRkFERV9PVVRfU1RBUlQ6IHJlcXVpcmUoJy4vRkFERV9PVVRfU1RBUlRfRVZFTlQnKSxcclxuICAgIEZMQVNIX0NPTVBMRVRFOiByZXF1aXJlKCcuL0ZMQVNIX0NPTVBMRVRFX0VWRU5UJyksXHJcbiAgICBGTEFTSF9TVEFSVDogcmVxdWlyZSgnLi9GTEFTSF9TVEFSVF9FVkVOVCcpLFxyXG4gICAgUEFOX0NPTVBMRVRFOiByZXF1aXJlKCcuL1BBTl9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgUEFOX1NUQVJUOiByZXF1aXJlKCcuL1BBTl9TVEFSVF9FVkVOVCcpLFxyXG4gICAgUE9TVF9SRU5ERVI6IHJlcXVpcmUoJy4vUE9TVF9SRU5ERVJfRVZFTlQnKSxcclxuICAgIFBSRV9SRU5ERVI6IHJlcXVpcmUoJy4vUFJFX1JFTkRFUl9FVkVOVCcpLFxyXG4gICAgUk9UQVRFX0NPTVBMRVRFOiByZXF1aXJlKCcuL1JPVEFURV9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgUk9UQVRFX1NUQVJUOiByZXF1aXJlKCcuL1JPVEFURV9TVEFSVF9FVkVOVCcpLFxyXG4gICAgU0hBS0VfQ09NUExFVEU6IHJlcXVpcmUoJy4vU0hBS0VfQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIFNIQUtFX1NUQVJUOiByZXF1aXJlKCcuL1NIQUtFX1NUQVJUX0VWRU5UJyksXHJcbiAgICBaT09NX0NPTVBMRVRFOiByZXF1aXJlKCcuL1pPT01fQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIFpPT01fU1RBUlQ6IHJlcXVpcmUoJy4vWk9PTV9TVEFSVF9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5DYW1lcmFzLlNjZW5lMkRcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDYW1lcmE6IHJlcXVpcmUoJy4vQ2FtZXJhJyksXHJcbiAgICBCYXNlQ2FtZXJhOiByZXF1aXJlKCcuL0Jhc2VDYW1lcmEnKSxcclxuICAgIENhbWVyYU1hbmFnZXI6IHJlcXVpcmUoJy4vQ2FtZXJhTWFuYWdlcicpLFxyXG4gICAgRWZmZWN0czogcmVxdWlyZSgnLi9lZmZlY3RzJyksXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIEZpeGVkIEtleSBDYW1lcmEgQ29udHJvbC5cclxuICpcclxuICogVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIG1vdmVtZW50IGFuZCB6b29tIG9mIGEgY2FtZXJhIHVzaW5nIHRoZSBkZWZpbmVkIGtleXMuXHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIGNhbUNvbnRyb2wgPSBuZXcgRml4ZWRLZXlDb250cm9sKHtcclxuICogICAgIGNhbWVyYTogdGhpcy5jYW1lcmFzLm1haW4sXHJcbiAqICAgICBsZWZ0OiBjdXJzb3JzLmxlZnQsXHJcbiAqICAgICByaWdodDogY3Vyc29ycy5yaWdodCxcclxuICogICAgIHNwZWVkOiBmbG9hdCBPUiB7IHg6IDAsIHk6IDAgfVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE1vdmVtZW50IGlzIHByZWNpc2UgYW5kIGhhcyBubyAnc21vb3RoaW5nJyBhcHBsaWVkIHRvIGl0LlxyXG4gKlxyXG4gKiBZb3UgbXVzdCBjYWxsIHRoZSBgdXBkYXRlYCBtZXRob2Qgb2YgdGhpcyBjb250cm9sbGVyIGV2ZXJ5IGZyYW1lLlxyXG4gKlxyXG4gKiBAY2xhc3MgRml4ZWRLZXlDb250cm9sXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ2FtZXJhcy5Db250cm9sc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sQ29uZmlnfSBjb25maWcgLSBUaGUgRml4ZWQgS2V5IENvbnRyb2wgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqL1xyXG52YXIgRml4ZWRLZXlDb250cm9sID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEZpeGVkS2V5Q29udHJvbCAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgdGhhdCB0aGlzIENvbnRyb2wgd2lsbCB1cGRhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjY2FtZXJhXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBHZXRWYWx1ZShjb25maWcsICdjYW1lcmEnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleSB0byBiZSBwcmVzc2VkIHRoYXQgd2lsbCBtb3ZlIHRoZSBDYW1lcmEgbGVmdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLkZpeGVkS2V5Q29udHJvbCNsZWZ0XHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxlZnQgPSBHZXRWYWx1ZShjb25maWcsICdsZWZ0JywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBLZXkgdG8gYmUgcHJlc3NlZCB0aGF0IHdpbGwgbW92ZSB0aGUgQ2FtZXJhIHJpZ2h0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3JpZ2h0XHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJpZ2h0ID0gR2V0VmFsdWUoY29uZmlnLCAncmlnaHQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleSB0byBiZSBwcmVzc2VkIHRoYXQgd2lsbCBtb3ZlIHRoZSBDYW1lcmEgdXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjdXBcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudXAgPSBHZXRWYWx1ZShjb25maWcsICd1cCcsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IHRvIGJlIHByZXNzZWQgdGhhdCB3aWxsIG1vdmUgdGhlIENhbWVyYSBkb3duLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI2Rvd25cclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZG93biA9IEdldFZhbHVlKGNvbmZpZywgJ2Rvd24nLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleSB0byBiZSBwcmVzc2VkIHRoYXQgd2lsbCB6b29tIHRoZSBDYW1lcmEgaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjem9vbUluXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnpvb21JbiA9IEdldFZhbHVlKGNvbmZpZywgJ3pvb21JbicsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IHRvIGJlIHByZXNzZWQgdGhhdCB3aWxsIHpvb20gdGhlIENhbWVyYSBvdXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjem9vbU91dFxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLklucHV0LktleWJvYXJkLktleX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy56b29tT3V0ID0gR2V0VmFsdWUoY29uZmlnLCAnem9vbU91dCcsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3BlZWQgYXQgd2hpY2ggdGhlIGNhbWVyYSB3aWxsIHpvb20gaWYgdGhlIGB6b29tSW5gIG9yIGB6b29tT3V0YCBrZXlzIGFyZSBwcmVzc2VkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3pvb21TcGVlZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMC4wMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuem9vbVNwZWVkID0gR2V0VmFsdWUoY29uZmlnLCAnem9vbVNwZWVkJywgMC4wMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBob3Jpem9udGFsIHNwZWVkIHRoZSBjYW1lcmEgd2lsbCBtb3ZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3NwZWVkWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3BlZWRYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZlcnRpY2FsIHNwZWVkIHRoZSBjYW1lcmEgd2lsbCBtb3ZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3NwZWVkWVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3BlZWRZID0gMDtcclxuXHJcbiAgICAgICAgdmFyIHNwZWVkID0gR2V0VmFsdWUoY29uZmlnLCAnc3BlZWQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNwZWVkWCA9IHNwZWVkO1xyXG4gICAgICAgICAgICB0aGlzLnNwZWVkWSA9IHNwZWVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNwZWVkWCA9IEdldFZhbHVlKGNvbmZpZywgJ3NwZWVkLngnLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5zcGVlZFkgPSBHZXRWYWx1ZShjb25maWcsICdzcGVlZC55JywgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwcm9wZXJ0eSB0byB0cmFjayB0aGUgY3VycmVudCB6b29tIGxldmVsLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI196b29tXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl96b29tID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGNvbnRyb2xsaW5nIGlmIHRoZSBDb250cm9scyB3aWxsIHVwZGF0ZSB0aGUgQ2FtZXJhIG9yIG5vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLkZpeGVkS2V5Q29udHJvbCNhY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9ICh0aGlzLmNhbWVyYSAhPT0gbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoZSBLZXkgQ29udHJvbCBydW5uaW5nLCBwcm92aWRpbmcgaXQgaGFzIGJlZW4gbGlua2VkIHRvIGEgY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3N0YXJ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEtleSBDb250cm9sIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9ICh0aGlzLmNhbWVyYSAhPT0gbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoaXMgS2V5IENvbnRyb2wgZnJvbSBydW5uaW5nLiBDYWxsIGBzdGFydGAgdG8gc3RhcnQgaXQgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjc3RvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBLZXkgQ29udHJvbCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyB0aGlzIEtleSBDb250cm9sIHRvIGEgY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3NldENhbWVyYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byBiaW5kIHRoaXMgS2V5IENvbnRyb2wgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBLZXkgQ29udHJvbCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Q2FtZXJhOiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSByZXN1bHRzIG9mIHByZXNzaW5nIHRoZSBjb250cm9sIGtleXMgdG8gdGhlIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbXVzdCBjYWxsIHRoaXMgZXZlcnkgc3RlcCwgaXQgaXMgbm90IGNhbGxlZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuRml4ZWRLZXlDb250cm9sI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZWx0YSA9PT0gdW5kZWZpbmVkKSB7IGRlbHRhID0gMTsgfVxyXG5cclxuICAgICAgICB2YXIgY2FtID0gdGhpcy5jYW1lcmE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVwICYmIHRoaXMudXAuaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FtLnNjcm9sbFkgLT0gKCh0aGlzLnNwZWVkWSAqIGRlbHRhKSB8IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvd24gJiYgdGhpcy5kb3duLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbS5zY3JvbGxZICs9ICgodGhpcy5zcGVlZFkgKiBkZWx0YSkgfCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0LmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbS5zY3JvbGxYIC09ICgodGhpcy5zcGVlZFggKiBkZWx0YSkgfCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0LmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbS5zY3JvbGxYICs9ICgodGhpcy5zcGVlZFggKiBkZWx0YSkgfCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBDYW1lcmEgem9vbVxyXG5cclxuICAgICAgICBpZiAodGhpcy56b29tSW4gJiYgdGhpcy56b29tSW4uaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FtLnpvb20gLT0gdGhpcy56b29tU3BlZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FtLnpvb20gPCAwLjEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbS56b29tID0gMC4xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuem9vbU91dCAmJiB0aGlzLnpvb21PdXQuaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FtLnpvb20gKz0gdGhpcy56b29tU3BlZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgS2V5IENvbnRyb2wuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5GaXhlZEtleUNvbnRyb2wjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmxlZnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucmlnaHQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudXAgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZG93biA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuem9vbUluID0gbnVsbDtcclxuICAgICAgICB0aGlzLnpvb21PdXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpeGVkS2V5Q29udHJvbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgU21vb3RoZWQgS2V5IENhbWVyYSBDb250cm9sLlxyXG4gKlxyXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgbW92ZW1lbnQgYW5kIHpvb20gb2YgYSBjYW1lcmEgdXNpbmcgdGhlIGRlZmluZWQga2V5cy5cclxuICogVW5saWtlIHRoZSBGaXhlZCBDYW1lcmEgQ29udHJvbCB5b3UgY2FuIGFsc28gcHJvdmlkZSBwaHlzaWNzIHZhbHVlcyBmb3IgYWNjZWxlcmF0aW9uLCBkcmFnIGFuZCBtYXhTcGVlZCBmb3Igc21vb3RoaW5nIGVmZmVjdHMuXHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIGNvbnRyb2xDb25maWcgPSB7XHJcbiAqICAgICBjYW1lcmE6IHRoaXMuY2FtZXJhcy5tYWluLFxyXG4gKiAgICAgbGVmdDogY3Vyc29ycy5sZWZ0LFxyXG4gKiAgICAgcmlnaHQ6IGN1cnNvcnMucmlnaHQsXHJcbiAqICAgICB1cDogY3Vyc29ycy51cCxcclxuICogICAgIGRvd246IGN1cnNvcnMuZG93bixcclxuICogICAgIHpvb21JbjogdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRLZXkoUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlEpLFxyXG4gKiAgICAgem9vbU91dDogdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRLZXkoUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkUpLFxyXG4gKiAgICAgem9vbVNwZWVkOiAwLjAyLFxyXG4gKiAgICAgYWNjZWxlcmF0aW9uOiAwLjA2LFxyXG4gKiAgICAgZHJhZzogMC4wMDA1LFxyXG4gKiAgICAgbWF4U3BlZWQ6IDEuMFxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICogXHJcbiAqIFlvdSBtdXN0IGNhbGwgdGhlIGB1cGRhdGVgIG1ldGhvZCBvZiB0aGlzIGNvbnRyb2xsZXIgZXZlcnkgZnJhbWUuXHJcbiAqXHJcbiAqIEBjbGFzcyBTbW9vdGhlZEtleUNvbnRyb2xcclxuICogQG1lbWJlcm9mIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2xDb25maWd9IGNvbmZpZyAtIFRoZSBTbW9vdGhlZCBLZXkgQ29udHJvbCBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICovXHJcbnZhciBTbW9vdGhlZEtleUNvbnRyb2wgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU21vb3RoZWRLZXlDb250cm9sIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIENhbWVyYSB0aGF0IHRoaXMgQ29udHJvbCB3aWxsIHVwZGF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNjYW1lcmFcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYSA9IEdldFZhbHVlKGNvbmZpZywgJ2NhbWVyYScsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IHRvIGJlIHByZXNzZWQgdGhhdCB3aWxsIG1vdmUgdGhlIENhbWVyYSBsZWZ0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI2xlZnRcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGVmdCA9IEdldFZhbHVlKGNvbmZpZywgJ2xlZnQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleSB0byBiZSBwcmVzc2VkIHRoYXQgd2lsbCBtb3ZlIHRoZSBDYW1lcmEgcmlnaHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjcmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmlnaHQgPSBHZXRWYWx1ZShjb25maWcsICdyaWdodCcsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IHRvIGJlIHByZXNzZWQgdGhhdCB3aWxsIG1vdmUgdGhlIENhbWVyYSB1cC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCN1cFxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLklucHV0LktleWJvYXJkLktleX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51cCA9IEdldFZhbHVlKGNvbmZpZywgJ3VwJywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBLZXkgdG8gYmUgcHJlc3NlZCB0aGF0IHdpbGwgbW92ZSB0aGUgQ2FtZXJhIGRvd24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjZG93blxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLklucHV0LktleWJvYXJkLktleX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kb3duID0gR2V0VmFsdWUoY29uZmlnLCAnZG93bicsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IHRvIGJlIHByZXNzZWQgdGhhdCB3aWxsIHpvb20gdGhlIENhbWVyYSBpbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCN6b29tSW5cclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuem9vbUluID0gR2V0VmFsdWUoY29uZmlnLCAnem9vbUluJywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBLZXkgdG8gYmUgcHJlc3NlZCB0aGF0IHdpbGwgem9vbSB0aGUgQ2FtZXJhIG91dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCN6b29tT3V0XHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnpvb21PdXQgPSBHZXRWYWx1ZShjb25maWcsICd6b29tT3V0JywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzcGVlZCBhdCB3aGljaCB0aGUgY2FtZXJhIHdpbGwgem9vbSBpZiB0aGUgYHpvb21JbmAgb3IgYHpvb21PdXRgIGtleXMgYXJlIHByZXNzZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjem9vbVNwZWVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwLjAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy56b29tU3BlZWQgPSBHZXRWYWx1ZShjb25maWcsICd6b29tU3BlZWQnLCAwLjAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWwgYWNjZWxlcmF0aW9uIHRoZSBjYW1lcmEgd2lsbCBtb3ZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI2FjY2VsWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWNjZWxYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZlcnRpY2FsIGFjY2VsZXJhdGlvbiB0aGUgY2FtZXJhIHdpbGwgbW92ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNhY2NlbFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjY2VsWSA9IDA7XHJcblxyXG4gICAgICAgIHZhciBhY2NlbCA9IEdldFZhbHVlKGNvbmZpZywgJ2FjY2VsZXJhdGlvbicsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGFjY2VsID09PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZWxYID0gYWNjZWw7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZWxZID0gYWNjZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZWxYID0gR2V0VmFsdWUoY29uZmlnLCAnYWNjZWxlcmF0aW9uLngnLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5hY2NlbFkgPSBHZXRWYWx1ZShjb25maWcsICdhY2NlbGVyYXRpb24ueScsIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWwgZHJhZyBhcHBsaWVkIHRvIHRoZSBjYW1lcmEgd2hlbiBpdCBpcyBtb3ZpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjZHJhZ1hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRyYWdYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZlcnRpY2FsIGRyYWcgYXBwbGllZCB0byB0aGUgY2FtZXJhIHdoZW4gaXQgaXMgbW92aW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI2RyYWdZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kcmFnWSA9IDA7XHJcblxyXG4gICAgICAgIHZhciBkcmFnID0gR2V0VmFsdWUoY29uZmlnLCAnZHJhZycsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRyYWcgPT09ICdudW1iZXInKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kcmFnWCA9IGRyYWc7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ1kgPSBkcmFnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdYID0gR2V0VmFsdWUoY29uZmlnLCAnZHJhZy54JywgMCk7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ1kgPSBHZXRWYWx1ZShjb25maWcsICdkcmFnLnknLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXhpbXVtIGhvcml6b250YWwgc3BlZWQgdGhlIGNhbWVyYSB3aWxsIG1vdmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjbWF4U3BlZWRYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhTcGVlZFggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSB2ZXJ0aWNhbCBzcGVlZCB0aGUgY2FtZXJhIHdpbGwgbW92ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNtYXhTcGVlZFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFNwZWVkWSA9IDA7XHJcblxyXG4gICAgICAgIHZhciBtYXhTcGVlZCA9IEdldFZhbHVlKGNvbmZpZywgJ21heFNwZWVkJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbWF4U3BlZWQgPT09ICdudW1iZXInKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXhTcGVlZFggPSBtYXhTcGVlZDtcclxuICAgICAgICAgICAgdGhpcy5tYXhTcGVlZFkgPSBtYXhTcGVlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXhTcGVlZFggPSBHZXRWYWx1ZShjb25maWcsICdtYXhTcGVlZC54JywgMCk7XHJcbiAgICAgICAgICAgIHRoaXMubWF4U3BlZWRZID0gR2V0VmFsdWUoY29uZmlnLCAnbWF4U3BlZWQueScsIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgcHJvcGVydHkgdG8gdHJhY2sgdGhlIHNwZWVkIG9mIHRoZSBjb250cm9sLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI19zcGVlZFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3NwZWVkWCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHByb3BlcnR5IHRvIHRyYWNrIHRoZSBzcGVlZCBvZiB0aGUgY29udHJvbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNfc3BlZWRZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zcGVlZFkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwcm9wZXJ0eSB0byB0cmFjayB0aGUgem9vbSBvZiB0aGUgY29udHJvbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNfem9vbVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fem9vbSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZmxhZyBjb250cm9sbGluZyBpZiB0aGUgQ29udHJvbHMgd2lsbCB1cGRhdGUgdGhlIENhbWVyYSBvciBub3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ2FtZXJhcy5Db250cm9scy5TbW9vdGhlZEtleUNvbnRyb2wjYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAodGhpcy5jYW1lcmEgIT09IG51bGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgS2V5IENvbnRyb2wgcnVubmluZywgcHJvdmlkaW5nIGl0IGhhcyBiZWVuIGxpbmtlZCB0byBhIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNzdGFydFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBLZXkgQ29udHJvbCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAodGhpcy5jYW1lcmEgIT09IG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGlzIEtleSBDb250cm9sIGZyb20gcnVubmluZy4gQ2FsbCBgc3RhcnRgIHRvIHN0YXJ0IGl0IGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI3N0b3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5IENvbnRyb2wgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0b3A6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluZHMgdGhpcyBLZXkgQ29udHJvbCB0byBhIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCNzZXRDYW1lcmFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gYmluZCB0aGlzIEtleSBDb250cm9sIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5IENvbnRyb2wgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldENhbWVyYTogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgcmVzdWx0cyBvZiBwcmVzc2luZyB0aGUgY29udHJvbCBrZXlzIHRvIHRoZSBDYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG11c3QgY2FsbCB0aGlzIGV2ZXJ5IHN0ZXAsIGl0IGlzIG5vdCBjYWxsZWQgYXV0b21hdGljYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DYW1lcmFzLkNvbnRyb2xzLlNtb290aGVkS2V5Q29udHJvbCN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiBUaGlzIGlzIGEgc21vb3RoZWQgYW5kIGNhcHBlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgRlBTIHJhdGUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGVsdGEgPT09IHVuZGVmaW5lZCkgeyBkZWx0YSA9IDE7IH1cclxuXHJcbiAgICAgICAgdmFyIGNhbSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuICAgICAgICAvLyAgQXBwbHkgRGVjZWxlcmF0aW9uXHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcGVlZFggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWRYIC09IHRoaXMuZHJhZ1ggKiBkZWx0YTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZFggPCAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGVlZFggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NwZWVkWCA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZFggKz0gdGhpcy5kcmFnWCAqIGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWVkWCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NwZWVkWCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcGVlZFkgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWRZIC09IHRoaXMuZHJhZ1kgKiBkZWx0YTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZFkgPCAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGVlZFkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3NwZWVkWSA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZFkgKz0gdGhpcy5kcmFnWSAqIGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWVkWSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NwZWVkWSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBDaGVjayBmb3Iga2V5c1xyXG5cclxuICAgICAgICBpZiAodGhpcy51cCAmJiB0aGlzLnVwLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkWSArPSB0aGlzLmFjY2VsWTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZFkgPiB0aGlzLm1heFNwZWVkWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3BlZWRZID0gdGhpcy5tYXhTcGVlZFk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb3duICYmIHRoaXMuZG93bi5pc0Rvd24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZFkgLT0gdGhpcy5hY2NlbFk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3BlZWRZIDwgLXRoaXMubWF4U3BlZWRZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGVlZFkgPSAtdGhpcy5tYXhTcGVlZFk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0LmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkWCArPSB0aGlzLmFjY2VsWDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZFggPiB0aGlzLm1heFNwZWVkWClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3BlZWRYID0gdGhpcy5tYXhTcGVlZFg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0LmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkWCAtPSB0aGlzLmFjY2VsWDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZFggPCAtdGhpcy5tYXhTcGVlZFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NwZWVkWCA9IC10aGlzLm1heFNwZWVkWDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENhbWVyYSB6b29tXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnpvb21JbiAmJiB0aGlzLnpvb21Jbi5pc0Rvd24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl96b29tID0gLXRoaXMuem9vbVNwZWVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnpvb21PdXQgJiYgdGhpcy56b29tT3V0LmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3pvb20gPSB0aGlzLnpvb21TcGVlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fem9vbSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQXBwbHkgdG8gQ2FtZXJhXHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcGVlZFggIT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYW0uc2Nyb2xsWCAtPSAoKHRoaXMuX3NwZWVkWCAqIGRlbHRhKSB8IDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NwZWVkWSAhPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbS5zY3JvbGxZIC09ICgodGhpcy5fc3BlZWRZICogZGVsdGEpIHwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fem9vbSAhPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbS56b29tICs9IHRoaXMuX3pvb207XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FtLnpvb20gPCAwLjAwMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FtLnpvb20gPSAwLjAwMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIEtleSBDb250cm9sLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHMuU21vb3RoZWRLZXlDb250cm9sI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJpZ2h0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnVwID0gbnVsbDtcclxuICAgICAgICB0aGlzLmRvd24gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnpvb21JbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy56b29tT3V0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbW9vdGhlZEtleUNvbnRyb2w7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNhbWVyYXMuQ29udHJvbHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBGaXhlZEtleUNvbnRyb2w6IHJlcXVpcmUoJy4vRml4ZWRLZXlDb250cm9sJyksXHJcbiAgICBTbW9vdGhlZEtleUNvbnRyb2w6IHJlcXVpcmUoJy4vU21vb3RoZWRLZXlDb250cm9sJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNhbWVyYXNcclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuVHlwZXMuQ2FtZXJhc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIENvbnRyb2xzOiByZXF1aXJlKCcuL2NvbnRyb2xzJyksXHJcbiAgICBTY2VuZTJEOiByZXF1aXJlKCcuLzJkJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEdsb2JhbCBjb25zdGFudHMuXHJcbiAqIFxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGhhc2VyIFJlbGVhc2UgVmVyc2lvblxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVkVSU0lPTlxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFZFUlNJT046ICczLjIzLjAnLFxyXG5cclxuICAgIEJsZW5kTW9kZXM6IHJlcXVpcmUoJy4vcmVuZGVyZXIvQmxlbmRNb2RlcycpLFxyXG5cclxuICAgIFNjYWxlTW9kZXM6IHJlcXVpcmUoJy4vcmVuZGVyZXIvU2NhbGVNb2RlcycpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQVVUTyBEZXRlY3QgUmVuZGVyZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5BVVRPXHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEFVVE86IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYW52YXMgUmVuZGVyZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5DQU5WQVNcclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ0FOVkFTOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5XRUJHTFxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBXRUJHTDogMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlYWRsZXNzIFJlbmRlcmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSEVBRExFU1NcclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgSEVBRExFU1M6IDMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbiBQaGFzZXIgdGhlIHZhbHVlIC0xIG1lYW5zICdmb3JldmVyJyBpbiBsb3RzIG9mIGNhc2VzLCB0aGlzIGNvbnN0IGFsbG93cyB5b3UgdG8gdXNlIGl0IGluc3RlYWRcclxuICAgICAqIHRvIGhlbHAgeW91IHJlbWVtYmVyIHdoYXQgdGhlIHZhbHVlIGlzIGRvaW5nIGluIHlvdXIgY29kZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkZPUkVWRVJcclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRk9SRVZFUjogLTEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXJlY3Rpb24gY29uc3RhbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5OT05FXHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIE5PTkU6IDQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXJlY3Rpb24gY29uc3RhbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5VUFxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBVUDogNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpcmVjdGlvbiBjb25zdGFudC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRPV05cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRE9XTjogNixcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpcmVjdGlvbiBjb25zdGFudC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkxFRlRcclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTEVGVDogNyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpcmVjdGlvbiBjb25zdGFudC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlJJR0hUXHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFJJR0hUOiA4XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDT05TVDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRGV2aWNlID0gcmVxdWlyZSgnLi4vZGV2aWNlJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBQaGFzZXJNYXRoID0gcmVxdWlyZSgnLi4vbWF0aC8nKTtcclxudmFyIE5PT1AgPSByZXF1aXJlKCcuLi91dGlscy9OT09QJyk7XHJcbnZhciBEZWZhdWx0UGx1Z2lucyA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvRGVmYXVsdFBsdWdpbnMnKTtcclxudmFyIFZhbHVlVG9Db2xvciA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvY29sb3IvVmFsdWVUb0NvbG9yJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgYWN0aXZlIGdhbWUgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgcGFyc2VkIGZyb20gYSB7QGxpbmsgUGhhc2VyLlR5cGVzLkNvcmUuR2FtZUNvbmZpZ30gb2JqZWN0LlxyXG4gKlxyXG4gKiBAY2xhc3MgQ29uZmlnXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ29yZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkNvcmUuR2FtZUNvbmZpZ30gW0dhbWVDb25maWddIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB5b3VyIFBoYXNlciBHYW1lIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAc2VlIFBoYXNlci5HYW1lI2NvbmZpZ1xyXG4gKi9cclxudmFyIENvbmZpZyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDb25maWcgKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICAgICAgdmFyIGRlZmF1bHRCYW5uZXJDb2xvciA9IFtcclxuICAgICAgICAgICAgJyNmZjAwMDAnLFxyXG4gICAgICAgICAgICAnI2ZmZmYwMCcsXHJcbiAgICAgICAgICAgICcjMDBmZjAwJyxcclxuICAgICAgICAgICAgJyMwMGZmZmYnLFxyXG4gICAgICAgICAgICAnIzAwMDAwMCdcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB2YXIgZGVmYXVsdEJhbm5lclRleHRDb2xvciA9ICcjZmZmZmZmJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHsoaW50ZWdlcnxzdHJpbmcpfSBQaGFzZXIuQ29yZS5Db25maWcjd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHVuZGVybHlpbmcgY2FudmFzLCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IEdldFZhbHVlKGNvbmZpZywgJ3dpZHRoJywgMTAyNCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7KGludGVnZXJ8c3RyaW5nKX0gUGhhc2VyLkNvcmUuQ29uZmlnI2hlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHVuZGVybHlpbmcgY2FudmFzLCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBHZXRWYWx1ZShjb25maWcsICdoZWlnaHQnLCA3NjgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3QgeyhQaGFzZXIuU2NhbGUuWm9vbVR5cGV8aW50ZWdlcil9IFBoYXNlci5Db3JlLkNvbmZpZyN6b29tIC0gVGhlIHpvb20gZmFjdG9yLCBhcyB1c2VkIGJ5IHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuem9vbSA9IEdldFZhbHVlKGNvbmZpZywgJ3pvb20nLCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtudW1iZXJ9IFBoYXNlci5Db3JlLkNvbmZpZyNyZXNvbHV0aW9uIC0gVGhlIGNhbnZhcyBkZXZpY2UgcGl4ZWwgcmVzb2x1dGlvbi4gQ3VycmVudGx5IHVuLXVzZWQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gR2V0VmFsdWUoY29uZmlnLCAncmVzb2x1dGlvbicsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgez8qfSBQaGFzZXIuQ29yZS5Db25maWcjcGFyZW50IC0gQSBwYXJlbnQgRE9NIGVsZW1lbnQgaW50byB3aGljaCB0aGUgY2FudmFzIGNyZWF0ZWQgYnkgdGhlIHJlbmRlcmVyIHdpbGwgYmUgaW5qZWN0ZWQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBHZXRWYWx1ZShjb25maWcsICdwYXJlbnQnLCB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge1BoYXNlci5TY2FsZS5TY2FsZU1vZGVUeXBlfSBQaGFzZXIuQ29yZS5Db25maWcjc2NhbGVNb2RlIC0gVGhlIHNjYWxlIG1vZGUgYXMgdXNlZCBieSB0aGUgU2NhbGUgTWFuYWdlci4gVGhlIGRlZmF1bHQgaXMgemVybywgd2hpY2ggaXMgbm8gc2NhbGluZy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlTW9kZSA9IEdldFZhbHVlKGNvbmZpZywgJ3NjYWxlTW9kZScsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNleHBhbmRQYXJlbnQgLSBJcyB0aGUgU2NhbGUgTWFuYWdlciBhbGxvd2VkIHRvIGFkanVzdCB0aGUgQ1NTIGhlaWdodCBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50IHRvIGJlIDEwMCU/XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5leHBhbmRQYXJlbnQgPSBHZXRWYWx1ZShjb25maWcsICdleHBhbmRQYXJlbnQnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjYXV0b1JvdW5kIC0gQXV0b21hdGljYWxseSByb3VuZCB0aGUgZGlzcGxheSBhbmQgc3R5bGUgc2l6ZXMgb2YgdGhlIGNhbnZhcy4gVGhpcyBjYW4gaGVscCB3aXRoIHBlcmZvcm1hbmNlIGluIGxvd2VyLXBvd2VyZWQgZGV2aWNlcy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1dG9Sb3VuZCA9IEdldFZhbHVlKGNvbmZpZywgJ2F1dG9Sb3VuZCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtQaGFzZXIuU2NhbGUuQ2VudGVyVHlwZX0gUGhhc2VyLkNvcmUuQ29uZmlnI2F1dG9DZW50ZXIgLSBBdXRvbWF0aWNhbGx5IGNlbnRlciB0aGUgY2FudmFzIHdpdGhpbiB0aGUgcGFyZW50P1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYXV0b0NlbnRlciA9IEdldFZhbHVlKGNvbmZpZywgJ2F1dG9DZW50ZXInLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjcmVzaXplSW50ZXJ2YWwgLSBIb3cgbWFueSBtcyBzaG91bGQgZWxhcHNlIGJlZm9yZSBjaGVja2luZyBpZiB0aGUgYnJvd3NlciBzaXplIGhhcyBjaGFuZ2VkP1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVzaXplSW50ZXJ2YWwgPSBHZXRWYWx1ZShjb25maWcsICdyZXNpemVJbnRlcnZhbCcsIDUwMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7PyhIVE1MRWxlbWVudHxzdHJpbmcpfSBQaGFzZXIuQ29yZS5Db25maWcjZnVsbHNjcmVlblRhcmdldCAtIFRoZSBET00gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VudCBpbnRvIGZ1bGwgc2NyZWVuIG1vZGUsIG9yIGl0cyBgaWRgLiBJZiB1bmRlZmluZWQgUGhhc2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gZGl2IGFuZCBpbnNlcnQgdGhlIGNhbnZhcyBpbnRvIGl0IHdoZW4gZW50ZXJpbmcgZnVsbHNjcmVlbiBtb2RlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlblRhcmdldCA9IEdldFZhbHVlKGNvbmZpZywgJ2Z1bGxzY3JlZW5UYXJnZXQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjbWluV2lkdGggLSBUaGUgbWluaW11bSB3aWR0aCwgaW4gcGl4ZWxzLCB0aGUgY2FudmFzIHdpbGwgc2NhbGUgZG93biB0by4gQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIG5vIG1pbmltdW0uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IEdldFZhbHVlKGNvbmZpZywgJ21pbldpZHRoJywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7aW50ZWdlcn0gUGhhc2VyLkNvcmUuQ29uZmlnI21heFdpZHRoIC0gVGhlIG1heGltdW0gd2lkdGgsIGluIHBpeGVscywgdGhlIGNhbnZhcyB3aWxsIHNjYWxlIHVwIHRvLiBBIHZhbHVlIG9mIHplcm8gbWVhbnMgbm8gbWF4aW11bS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gR2V0VmFsdWUoY29uZmlnLCAnbWF4V2lkdGgnLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjbWluSGVpZ2h0IC0gVGhlIG1pbmltdW0gaGVpZ2h0LCBpbiBwaXhlbHMsIHRoZSBjYW52YXMgd2lsbCBzY2FsZSBkb3duIHRvLiBBIHZhbHVlIG9mIHplcm8gbWVhbnMgbm8gbWluaW11bS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1pbkhlaWdodCA9IEdldFZhbHVlKGNvbmZpZywgJ21pbkhlaWdodCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2ludGVnZXJ9IFBoYXNlci5Db3JlLkNvbmZpZyNtYXhIZWlnaHQgLSBUaGUgbWF4aW11bSBoZWlnaHQsIGluIHBpeGVscywgdGhlIGNhbnZhcyB3aWxsIHNjYWxlIHVwIHRvLiBBIHZhbHVlIG9mIHplcm8gbWVhbnMgbm8gbWF4aW11bS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heEhlaWdodCA9IEdldFZhbHVlKGNvbmZpZywgJ21heEhlaWdodCcsIDApO1xyXG5cclxuICAgICAgICAvLyAgU2NhbGUgTWFuYWdlciAtIEFueXRoaW5nIHNldCBpbiBoZXJlIG92ZXItcmlkZXMgYW55dGhpbmcgc2V0IGFib3ZlXHJcblxyXG4gICAgICAgIHZhciBzY2FsZUNvbmZpZyA9IEdldFZhbHVlKGNvbmZpZywgJ3NjYWxlJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChzY2FsZUNvbmZpZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBHZXRWYWx1ZShzY2FsZUNvbmZpZywgJ3dpZHRoJywgdGhpcy53aWR0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbSA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAnem9vbScsIHRoaXMuem9vbSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAncmVzb2x1dGlvbicsIHRoaXMucmVzb2x1dGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdwYXJlbnQnLCB0aGlzLnBhcmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGVNb2RlID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdtb2RlJywgdGhpcy5zY2FsZU1vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZFBhcmVudCA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAnZXhwYW5kUGFyZW50JywgdGhpcy5leHBhbmRQYXJlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9Sb3VuZCA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAnYXV0b1JvdW5kJywgdGhpcy5hdXRvUm91bmQpO1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9DZW50ZXIgPSBHZXRWYWx1ZShzY2FsZUNvbmZpZywgJ2F1dG9DZW50ZXInLCB0aGlzLmF1dG9DZW50ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUludGVydmFsID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdyZXNpemVJbnRlcnZhbCcsIHRoaXMucmVzaXplSW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5UYXJnZXQgPSBHZXRWYWx1ZShzY2FsZUNvbmZpZywgJ2Z1bGxzY3JlZW5UYXJnZXQnLCB0aGlzLmZ1bGxzY3JlZW5UYXJnZXQpO1xyXG4gICAgICAgICAgICB0aGlzLm1pbldpZHRoID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdtaW4ud2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5tYXhXaWR0aCA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAnbWF4LndpZHRoJywgdGhpcy5tYXhXaWR0aCk7XHJcbiAgICAgICAgICAgIHRoaXMubWluSGVpZ2h0ID0gR2V0VmFsdWUoc2NhbGVDb25maWcsICdtaW4uaGVpZ2h0JywgdGhpcy5taW5IZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1heEhlaWdodCA9IEdldFZhbHVlKHNjYWxlQ29uZmlnLCAnbWF4LmhlaWdodCcsIHRoaXMubWF4SGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7bnVtYmVyfSBQaGFzZXIuQ29yZS5Db25maWcjcmVuZGVyVHlwZSAtIEZvcmNlIFBoYXNlciB0byB1c2UgYSBzcGVjaWZpYyByZW5kZXJlci4gQ2FuIGJlIGBDT05TVC5DQU5WQVNgLCBgQ09OU1QuV0VCR0xgLCBgQ09OU1QuSEVBRExFU1NgIG9yIGBDT05TVC5BVVRPYCAoZGVmYXVsdClcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlclR5cGUgPSBHZXRWYWx1ZShjb25maWcsICd0eXBlJywgQ09OU1QuQVVUTyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7P0hUTUxDYW52YXNFbGVtZW50fSBQaGFzZXIuQ29yZS5Db25maWcjY2FudmFzIC0gRm9yY2UgUGhhc2VyIHRvIHVzZSB5b3VyIG93biBDYW52YXMgZWxlbWVudCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbnZhcyA9IEdldFZhbHVlKGNvbmZpZywgJ2NhbnZhcycsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgez8oQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfFdlYkdMUmVuZGVyaW5nQ29udGV4dCl9IFBoYXNlci5Db3JlLkNvbmZpZyNjb250ZXh0IC0gRm9yY2UgUGhhc2VyIHRvIHVzZSB5b3VyIG93biBDYW52YXMgY29udGV4dCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBHZXRWYWx1ZShjb25maWcsICdjb250ZXh0JywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7P3N0cmluZ30gUGhhc2VyLkNvcmUuQ29uZmlnI2NhbnZhc1N0eWxlIC0gT3B0aW9uYWwgQ1NTIGF0dHJpYnV0ZXMgdG8gYmUgc2V0IG9uIHRoZSBjYW52YXMgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzU3R5bGUgPSBHZXRWYWx1ZShjb25maWcsICdjYW52YXNTdHlsZScsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNjdXN0b21FbnZpcm9ubWVudCAtIElzIFBoYXNlciBydW5uaW5nIHVuZGVyIGEgY3VzdG9tIChub24tbmF0aXZlIHdlYikgZW52aXJvbm1lbnQ/IElmIHNvLCBzZXQgdGhpcyB0byBgdHJ1ZWAgdG8gc2tpcCBpbnRlcm5hbCBGZWF0dXJlIGRldGVjdGlvbi4gSWYgYHRydWVgIHRoZSBgcmVuZGVyVHlwZWAgY2Fubm90IGJlIGxlZnQgYXMgYEFVVE9gLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tRW52aXJvbm1lbnQgPSBHZXRWYWx1ZShjb25maWcsICdjdXN0b21FbnZpcm9ubWVudCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHs/b2JqZWN0fSBQaGFzZXIuQ29yZS5Db25maWcjc2NlbmVDb25maWcgLSBUaGUgZGVmYXVsdCBTY2VuZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lQ29uZmlnID0gR2V0VmFsdWUoY29uZmlnLCAnc2NlbmUnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtzdHJpbmdbXX0gUGhhc2VyLkNvcmUuQ29uZmlnI3NlZWQgLSBBIHNlZWQgd2hpY2ggdGhlIFJhbmRvbSBEYXRhIEdlbmVyYXRvciB3aWxsIHVzZS4gSWYgbm90IGdpdmVuLCBhIGR5bmFtaWMgc2VlZCBiYXNlZCBvbiB0aGUgdGltZSBpcyB1c2VkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2VlZCA9IEdldFZhbHVlKGNvbmZpZywgJ3NlZWQnLCBbIChEYXRlLm5vdygpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKSBdKTtcclxuXHJcbiAgICAgICAgUGhhc2VyTWF0aC5STkQgPSBuZXcgUGhhc2VyTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yKHRoaXMuc2VlZCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjZ2FtZVRpdGxlIC0gVGhlIHRpdGxlIG9mIHRoZSBnYW1lLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZVRpdGxlID0gR2V0VmFsdWUoY29uZmlnLCAndGl0bGUnLCAnJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjZ2FtZVVSTCAtIFRoZSBVUkwgb2YgdGhlIGdhbWUuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lVVJMID0gR2V0VmFsdWUoY29uZmlnLCAndXJsJywgJ2h0dHBzOi8vcGhhc2VyLmlvJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjZ2FtZVZlcnNpb24gLSBUaGUgdmVyc2lvbiBvZiB0aGUgZ2FtZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWVWZXJzaW9uID0gR2V0VmFsdWUoY29uZmlnLCAndmVyc2lvbicsICcnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjYXV0b0ZvY3VzIC0gSWYgYHRydWVgIHRoZSB3aW5kb3cgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGdpdmVuIGZvY3VzIGltbWVkaWF0ZWx5IGFuZCBvbiBhbnkgZnV0dXJlIG1vdXNlZG93biBldmVudC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1dG9Gb2N1cyA9IEdldFZhbHVlKGNvbmZpZywgJ2F1dG9Gb2N1cycsIHRydWUpO1xyXG5cclxuICAgICAgICAvLyAgRE9NIEVsZW1lbnQgQ29udGFpbmVyXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7P2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNkb21DcmVhdGVDb250YWluZXIgLSBTaG91bGQgdGhlIGdhbWUgY3JlYXRlIGEgZGl2IGVsZW1lbnQgdG8gYWN0IGFzIGEgRE9NIENvbnRhaW5lcj8gT25seSBlbmFibGUgaWYgeW91J3JlIHVzaW5nIERPTSBFbGVtZW50IG9iamVjdHMuIFlvdSBtdXN0IHByb3ZpZGUgYSBwYXJlbnQgb2JqZWN0IGlmIHlvdSB1c2UgdGhpcyBmZWF0dXJlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZG9tQ3JlYXRlQ29udGFpbmVyID0gR2V0VmFsdWUoY29uZmlnLCAnZG9tLmNyZWF0ZUNvbnRhaW5lcicsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHs/Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2RvbUJlaGluZENhbnZhcyAtIFNob3VsZCB0aGUgRE9NIENvbnRhaW5lciB0aGF0IGlzIGNyZWF0ZWQgKGlmIGBkb20uY3JlYXRlQ29udGFpbmVyYCBpcyB0cnVlKSBiZSBwb3NpdGlvbmVkIGJlaGluZCAodHJ1ZSkgb3Igb3ZlciB0aGUgdG9wIChmYWxzZSwgdGhlIGRlZmF1bHQpIG9mIHRoZSBnYW1lIGNhbnZhcz9cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRvbUJlaGluZENhbnZhcyA9IEdldFZhbHVlKGNvbmZpZywgJ2RvbS5iZWhpbmRDYW52YXMnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vICBJbnB1dFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dEtleWJvYXJkIC0gRW5hYmxlIHRoZSBLZXlib2FyZCBQbHVnaW4uIFRoaXMgY2FuIGJlIGRpc2FibGVkIGluIGdhbWVzIHRoYXQgZG9uJ3QgbmVlZCBrZXlib2FyZCBpbnB1dC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0S2V5Ym9hcmQgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC5rZXlib2FyZCcsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgeyp9IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dEtleWJvYXJkRXZlbnRUYXJnZXQgLSBUaGUgRE9NIFRhcmdldCB0byBsaXN0ZW4gZm9yIGtleWJvYXJkIGV2ZW50cyBvbi4gRGVmYXVsdHMgdG8gYHdpbmRvd2AgaWYgbm90IHNwZWNpZmllZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0S2V5Ym9hcmRFdmVudFRhcmdldCA9IEdldFZhbHVlKGNvbmZpZywgJ2lucHV0LmtleWJvYXJkLnRhcmdldCcsIHdpbmRvdyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7P2ludGVnZXJbXX0gUGhhc2VyLkNvcmUuQ29uZmlnI2lucHV0S2V5Ym9hcmRDYXB0dXJlIC0gYHByZXZlbnREZWZhdWx0YCB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBub24tbW9kaWZpZWQga2V5IHdoaWNoIGhhcyBhIGtleSBjb2RlIGluIHRoaXMgYXJyYXkuIEJ5IGRlZmF1bHQsIGl0IGlzIGVtcHR5LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXRLZXlib2FyZENhcHR1cmUgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC5rZXlib2FyZC5jYXB0dXJlJywgW10pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgeyhib29sZWFufG9iamVjdCl9IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dE1vdXNlIC0gRW5hYmxlIHRoZSBNb3VzZSBQbHVnaW4uIFRoaXMgY2FuIGJlIGRpc2FibGVkIGluIGdhbWVzIHRoYXQgZG9uJ3QgbmVlZCBtb3VzZSBpbnB1dC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0TW91c2UgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC5tb3VzZScsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgez8qfSBQaGFzZXIuQ29yZS5Db25maWcjaW5wdXRNb3VzZUV2ZW50VGFyZ2V0IC0gVGhlIERPTSBUYXJnZXQgdG8gbGlzdGVuIGZvciBtb3VzZSBldmVudHMgb24uIERlZmF1bHRzIHRvIHRoZSBnYW1lIGNhbnZhcyBpZiBub3Qgc3BlY2lmaWVkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXRNb3VzZUV2ZW50VGFyZ2V0ID0gR2V0VmFsdWUoY29uZmlnLCAnaW5wdXQubW91c2UudGFyZ2V0JywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2lucHV0TW91c2VDYXB0dXJlIC0gU2hvdWxkIG1vdXNlIGV2ZW50cyBiZSBjYXB0dXJlZD8gSS5lLiBoYXZlIHByZXZlbnQgZGVmYXVsdCBjYWxsZWQgb24gdGhlbS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0TW91c2VDYXB0dXJlID0gR2V0VmFsdWUoY29uZmlnLCAnaW5wdXQubW91c2UuY2FwdHVyZScsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dFRvdWNoIC0gRW5hYmxlIHRoZSBUb3VjaCBQbHVnaW4uIFRoaXMgY2FuIGJlIGRpc2FibGVkIGluIGdhbWVzIHRoYXQgZG9uJ3QgbmVlZCB0b3VjaCBpbnB1dC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0VG91Y2ggPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC50b3VjaCcsIERldmljZS5pbnB1dC50b3VjaCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Pyp9IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dFRvdWNoRXZlbnRUYXJnZXQgLSBUaGUgRE9NIFRhcmdldCB0byBsaXN0ZW4gZm9yIHRvdWNoIGV2ZW50cyBvbi4gRGVmYXVsdHMgdG8gdGhlIGdhbWUgY2FudmFzIGlmIG5vdCBzcGVjaWZpZWQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnB1dFRvdWNoRXZlbnRUYXJnZXQgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC50b3VjaC50YXJnZXQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjaW5wdXRUb3VjaENhcHR1cmUgLSBTaG91bGQgdG91Y2ggZXZlbnRzIGJlIGNhcHR1cmVkPyBJLmUuIGhhdmUgcHJldmVudCBkZWZhdWx0IGNhbGxlZCBvbiB0aGVtLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXRUb3VjaENhcHR1cmUgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC50b3VjaC5jYXB0dXJlJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7aW50ZWdlcn0gUGhhc2VyLkNvcmUuQ29uZmlnI2lucHV0QWN0aXZlUG9pbnRlcnMgLSBUaGUgbnVtYmVyIG9mIFBvaW50ZXIgb2JqZWN0cyBjcmVhdGVkIGJ5IGRlZmF1bHQuIEluIGEgbW91c2Utb25seSwgb3Igbm9uLW11bHRpIHRvdWNoIGdhbWUsIHlvdSBjYW4gbGVhdmUgdGhpcyBhcyAxLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXRBY3RpdmVQb2ludGVycyA9IEdldFZhbHVlKGNvbmZpZywgJ2lucHV0LmFjdGl2ZVBvaW50ZXJzJywgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7aW50ZWdlcn0gUGhhc2VyLkNvcmUuQ29uZmlnI2lucHV0U21vb3RoRmFjdG9yIC0gVGhlIHNtb290aGluZyBmYWN0b3IgdG8gYXBwbHkgZHVyaW5nIFBvaW50ZXIgbW92ZW1lbnQuIFNlZSB7QGxpbmsgUGhhc2VyLklucHV0LlBvaW50ZXIjc21vb3RoRmFjdG9yfS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlucHV0U21vb3RoRmFjdG9yID0gR2V0VmFsdWUoY29uZmlnLCAnaW5wdXQuc21vb3RoRmFjdG9yJywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2lucHV0V2luZG93RXZlbnRzIC0gU2hvdWxkIFBoYXNlciBsaXN0ZW4gZm9yIGlucHV0IGV2ZW50cyBvbiB0aGUgV2luZG93PyBJZiB5b3UgZGlzYWJsZSB0aGlzLCBldmVudHMgbGlrZSAnUE9JTlRFUl9VUF9PVVRTSURFJyB3aWxsIG5vIGxvbmdlciBmaXJlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXRXaW5kb3dFdmVudHMgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC53aW5kb3dFdmVudHMnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjaW5wdXRHYW1lcGFkIC0gRW5hYmxlIHRoZSBHYW1lcGFkIFBsdWdpbi4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgaW4gZ2FtZXMgdGhhdCBkb24ndCBuZWVkIGdhbWVwYWQgaW5wdXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnB1dEdhbWVwYWQgPSBHZXRWYWx1ZShjb25maWcsICdpbnB1dC5nYW1lcGFkJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgeyp9IFBoYXNlci5Db3JlLkNvbmZpZyNpbnB1dEdhbWVwYWRFdmVudFRhcmdldCAtIFRoZSBET00gVGFyZ2V0IHRvIGxpc3RlbiBmb3IgZ2FtZXBhZCBldmVudHMgb24uIERlZmF1bHRzIHRvIGB3aW5kb3dgIGlmIG5vdCBzcGVjaWZpZWQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnB1dEdhbWVwYWRFdmVudFRhcmdldCA9IEdldFZhbHVlKGNvbmZpZywgJ2lucHV0LmdhbWVwYWQudGFyZ2V0Jywgd2luZG93KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjZGlzYWJsZUNvbnRleHRNZW51IC0gU2V0IHRvIGB0cnVlYCB0byBkaXNhYmxlIHRoZSByaWdodC1jbGljayBjb250ZXh0IG1lbnUuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNhYmxlQ29udGV4dE1lbnUgPSBHZXRWYWx1ZShjb25maWcsICdkaXNhYmxlQ29udGV4dE1lbnUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7UGhhc2VyLlR5cGVzLkNvcmUuQXVkaW9Db25maWd9IFBoYXNlci5Db3JlLkNvbmZpZyNhdWRpbyAtIFRoZSBBdWRpbyBDb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1ZGlvID0gR2V0VmFsdWUoY29uZmlnLCAnYXVkaW8nKTtcclxuXHJcbiAgICAgICAgLy8gIElmIHlvdSBkbzogeyBiYW5uZXI6IGZhbHNlIH0gaXQgd29uJ3QgZGlzcGxheSBhbnkgYmFubmVyIGF0IGFsbFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNoaWRlQmFubmVyIC0gRG9uJ3Qgd3JpdGUgdGhlIGJhbm5lciBsaW5lIHRvIHRoZSBjb25zb2xlLmxvZy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhpZGVCYW5uZXIgPSAoR2V0VmFsdWUoY29uZmlnLCAnYmFubmVyJywgbnVsbCkgPT09IGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjaGlkZVBoYXNlciAtIE9taXQgUGhhc2VyJ3MgbmFtZSBhbmQgdmVyc2lvbiBmcm9tIHRoZSBiYW5uZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oaWRlUGhhc2VyID0gR2V0VmFsdWUoY29uZmlnLCAnYmFubmVyLmhpZGVQaGFzZXInLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjYmFubmVyVGV4dENvbG9yIC0gVGhlIGNvbG9yIG9mIHRoZSBiYW5uZXIgdGV4dC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhbm5lclRleHRDb2xvciA9IEdldFZhbHVlKGNvbmZpZywgJ2Jhbm5lci50ZXh0JywgZGVmYXVsdEJhbm5lclRleHRDb2xvcik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nW119IFBoYXNlci5Db3JlLkNvbmZpZyNiYW5uZXJCYWNrZ3JvdW5kQ29sb3IgLSBUaGUgYmFja2dyb3VuZCBjb2xvcnMgb2YgdGhlIGJhbm5lci5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhbm5lckJhY2tncm91bmRDb2xvciA9IEdldFZhbHVlKGNvbmZpZywgJ2Jhbm5lci5iYWNrZ3JvdW5kJywgZGVmYXVsdEJhbm5lckNvbG9yKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2FtZVRpdGxlID09PSAnJyAmJiB0aGlzLmhpZGVQaGFzZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGVCYW5uZXIgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHs/UGhhc2VyLlR5cGVzLkNvcmUuRlBTQ29uZmlnfSBQaGFzZXIuQ29yZS5Db25maWcjZnBzIC0gVGhlIEZyYW1lIFJhdGUgQ29uZmlndXJhdGlvbiBvYmplY3QsIGFzIHBhcnNlZCBieSB0aGUgVGltZXN0ZXAgY2xhc3MuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mcHMgPSBHZXRWYWx1ZShjb25maWcsICdmcHMnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gIFJlbmRlcmVyIFNldHRpbmdzXHJcbiAgICAgICAgLy8gIFRoZXNlIGNhbiBlaXRoZXIgYmUgaW4gYSBgcmVuZGVyYCBvYmplY3Qgd2l0aGluIHRoZSBDb25maWcsIG9yIHNwZWNpZmllZCBvbiB0aGVpciBvd25cclxuXHJcbiAgICAgICAgdmFyIHJlbmRlckNvbmZpZyA9IEdldFZhbHVlKGNvbmZpZywgJ3JlbmRlcicsIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2FudGlhbGlhcyAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgV2ViR0wgdXNlcyBsaW5lYXIgaW50ZXJwb2xhdGlvbiB0byBkcmF3IHNjYWxlZCBvciByb3RhdGVkIHRleHR1cmVzLCBnaXZpbmcgYSBzbW9vdGggYXBwZWFyYW5jZS4gV2hlbiBzZXQgdG8gYGZhbHNlYCwgV2ViR0wgdXNlcyBuZWFyZXN0LW5laWdoYm9yIGludGVycG9sYXRpb24sIGdpdmluZyBhIGNyaXNwZXIgYXBwZWFyYW5jZS4gYGZhbHNlYCBhbHNvIGRpc2FibGVzIGFudGlhbGlhc2luZyBvZiB0aGUgZ2FtZSBjYW52YXMgaXRzZWxmLCBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBpdCwgd2hlbiB0aGUgZ2FtZSBjYW52YXMgaXMgc2NhbGVkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW50aWFsaWFzID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAnYW50aWFsaWFzJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2FudGlhbGlhc0dMIC0gU2V0cyB0aGUgYGFudGlhbGlhc2AgcHJvcGVydHkgd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyBjcmVhdGVkLiBTZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgaW1wYWN0IGFueSBzdWJzZXF1ZW50IHRleHR1cmVzIHRoYXQgYXJlIGNyZWF0ZWQsIG9yIHRoZSBjYW52YXMgc3R5bGUgYXR0cmlidXRlcy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFudGlhbGlhc0dMID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAnYW50aWFsaWFzR0wnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtzdHJpbmd9IFBoYXNlci5Db3JlLkNvbmZpZyNtaXBtYXBGaWx0ZXIgLSBTZXRzIHRoZSBgbWlwbWFwRmlsdGVyYCBwcm9wZXJ0eSB3aGVuIHRoZSBXZWJHTCByZW5kZXJlciBpcyBjcmVhdGVkLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWlwbWFwRmlsdGVyID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAnbWlwbWFwRmlsdGVyJywgJ0xJTkVBUicpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNkZXN5bmNocm9uaXplZCAtIFdoZW4gc2V0IHRvIGB0cnVlYCBpdCB3aWxsIGNyZWF0ZSBhIGRlc3luY2hyb25pemVkIGNvbnRleHQgZm9yIGJvdGggMkQgYW5kIFdlYkdMLiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOS8wNS9kZXN5bmNocm9uaXplZCBmb3IgZGV0YWlscy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlc3luY2hyb25pemVkID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAnZGVzeW5jaHJvbml6ZWQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI3JvdW5kUGl4ZWxzIC0gRHJhdyB0ZXh0dXJlLWJhc2VkIEdhbWUgT2JqZWN0cyBhdCBvbmx5IHdob2xlLWludGVnZXIgcG9zaXRpb25zLiBHYW1lIE9iamVjdHMgd2l0aG91dCB0ZXh0dXJlcywgbGlrZSBHcmFwaGljcywgaWdub3JlIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yb3VuZFBpeGVscyA9IEdldFZhbHVlKHJlbmRlckNvbmZpZywgJ3JvdW5kUGl4ZWxzJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNwaXhlbEFydCAtIFByZXZlbnQgcGl4ZWwgYXJ0IGZyb20gYmVjb21pbmcgYmx1cnJlZCB3aGVuIHNjYWxlZC4gSXQgd2lsbCByZW1haW4gY3Jpc3AgKHRlbGxzIHRoZSBXZWJHTCByZW5kZXJlciB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB0ZXh0dXJlcyB1c2luZyBhIGxpbmVhciBmaWx0ZXIgbW9kZSkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waXhlbEFydCA9IEdldFZhbHVlKHJlbmRlckNvbmZpZywgJ3BpeGVsQXJ0JywgdGhpcy56b29tICE9PSAxKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGl4ZWxBcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFudGlhbGlhcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJvdW5kUGl4ZWxzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI3RyYW5zcGFyZW50IC0gV2hldGhlciB0aGUgZ2FtZSBjYW52YXMgd2lsbCBoYXZlIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRyYW5zcGFyZW50ID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAndHJhbnNwYXJlbnQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7Ym9vbGVhbn0gUGhhc2VyLkNvcmUuQ29uZmlnI2NsZWFyQmVmb3JlUmVuZGVyIC0gV2hldGhlciB0aGUgZ2FtZSBjYW52YXMgd2lsbCBiZSBjbGVhcmVkIGJldHdlZW4gZWFjaCByZW5kZXJpbmcgZnJhbWUuIFlvdSBjYW4gZGlzYWJsZSB0aGlzIGlmIHlvdSBoYXZlIGEgZnVsbC1zY3JlZW4gYmFja2dyb3VuZCBpbWFnZSBvciBnYW1lIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNsZWFyQmVmb3JlUmVuZGVyID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAnY2xlYXJCZWZvcmVSZW5kZXInLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjcHJlbXVsdGlwbGllZEFscGhhIC0gSW4gV2ViR0wgbW9kZSwgc2V0cyB0aGUgZHJhd2luZyBidWZmZXIgdG8gY29udGFpbiBjb2xvcnMgd2l0aCBwcmUtbXVsdGlwbGllZCBhbHBoYS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IEdldFZhbHVlKHJlbmRlckNvbmZpZywgJ3ByZW11bHRpcGxpZWRBbHBoYScsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2Jvb2xlYW59IFBoYXNlci5Db3JlLkNvbmZpZyNmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IC0gTGV0IHRoZSBicm93c2VyIGFib3J0IGNyZWF0aW5nIGEgV2ViR0wgY29udGV4dCBpZiBpdCBqdWRnZXMgcGVyZm9ybWFuY2Ugd291bGQgYmUgdW5hY2NlcHRhYmxlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IEdldFZhbHVlKHJlbmRlckNvbmZpZywgJ2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjcG93ZXJQcmVmZXJlbmNlIC0gXCJoaWdoLXBlcmZvcm1hbmNlXCIsIFwibG93LXBvd2VyXCIgb3IgXCJkZWZhdWx0XCIuIEEgaGludCB0byB0aGUgYnJvd3NlciBvbiBob3cgbXVjaCBkZXZpY2UgcG93ZXIgdGhlIGdhbWUgbWlnaHQgdXNlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG93ZXJQcmVmZXJlbmNlID0gR2V0VmFsdWUocmVuZGVyQ29uZmlnLCAncG93ZXJQcmVmZXJlbmNlJywgJ2RlZmF1bHQnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjYmF0Y2hTaXplIC0gVGhlIGRlZmF1bHQgV2ViR0wgQmF0Y2ggc2l6ZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhdGNoU2l6ZSA9IEdldFZhbHVlKHJlbmRlckNvbmZpZywgJ2JhdGNoU2l6ZScsIDIwMDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2ludGVnZXJ9IFBoYXNlci5Db3JlLkNvbmZpZyNtYXhMaWdodHMgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlnaHRzIGFsbG93ZWQgdG8gYmUgdmlzaWJsZSB3aXRoaW4gcmFuZ2Ugb2YgYSBzaW5nbGUgQ2FtZXJhIGluIHRoZSBMaWdodE1hbmFnZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhMaWdodHMgPSBHZXRWYWx1ZShyZW5kZXJDb25maWcsICdtYXhMaWdodHMnLCAxMCk7XHJcblxyXG4gICAgICAgIHZhciBiZ2MgPSBHZXRWYWx1ZShjb25maWcsICdiYWNrZ3JvdW5kQ29sb3InLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gUGhhc2VyLkNvcmUuQ29uZmlnI2JhY2tncm91bmRDb2xvciAtIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBnYW1lIGNhbnZhcy4gVGhlIGRlZmF1bHQgaXMgYmxhY2suIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiBgdHJhbnNwYXJlbnRgIGlzIHNldCB0byBgdHJ1ZWAuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBWYWx1ZVRvQ29sb3IoYmdjKTtcclxuXHJcbiAgICAgICAgaWYgKGJnYyA9PT0gMCAmJiB0aGlzLnRyYW5zcGFyZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IuYWxwaGEgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtQaGFzZXIuVHlwZXMuQ29yZS5Cb290Q2FsbGJhY2t9IFBoYXNlci5Db3JlLkNvbmZpZyNwcmVCb290IC0gQ2FsbGVkIGJlZm9yZSBQaGFzZXIgYm9vdHMuIFVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIGFueXRoaW5nIG5vdCByZWxhdGVkIHRvIFBoYXNlciB0aGF0IFBoYXNlciBtYXkgcmVxdWlyZSB3aGlsZSBib290aW5nLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJlQm9vdCA9IEdldFZhbHVlKGNvbmZpZywgJ2NhbGxiYWNrcy5wcmVCb290JywgTk9PUCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7UGhhc2VyLlR5cGVzLkNvcmUuQm9vdENhbGxiYWNrfSBQaGFzZXIuQ29yZS5Db25maWcjcG9zdEJvb3QgLSBBIGZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kIG9mIHRoZSBib290IHNlcXVlbmNlLiBBdCB0aGlzIHBvaW50LCBhbGwgdGhlIGdhbWUgc3lzdGVtcyBoYXZlIHN0YXJ0ZWQgYW5kIHBsdWdpbnMgaGF2ZSBiZWVuIGxvYWRlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvc3RCb290ID0gR2V0VmFsdWUoY29uZmlnLCAnY2FsbGJhY2tzLnBvc3RCb290JywgTk9PUCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7UGhhc2VyLlR5cGVzLkNvcmUuUGh5c2ljc0NvbmZpZ30gUGhhc2VyLkNvcmUuQ29uZmlnI3BoeXNpY3MgLSBUaGUgUGh5c2ljcyBDb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBoeXNpY3MgPSBHZXRWYWx1ZShjb25maWcsICdwaHlzaWNzJywge30pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qgeyhib29sZWFufHN0cmluZyl9IFBoYXNlci5Db3JlLkNvbmZpZyNkZWZhdWx0UGh5c2ljc1N5c3RlbSAtIFRoZSBkZWZhdWx0IHBoeXNpY3Mgc3lzdGVtLiBJdCB3aWxsIGJlIHN0YXJ0ZWQgZm9yIGVhY2ggc2NlbmUuIEVpdGhlciAnYXJjYWRlJywgJ2ltcGFjdCcgb3IgJ21hdHRlcicuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0UGh5c2ljc1N5c3RlbSA9IEdldFZhbHVlKHRoaXMucGh5c2ljcywgJ2RlZmF1bHQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjbG9hZGVyQmFzZVVSTCAtIEEgVVJMIHVzZWQgdG8gcmVzb2x2ZSBwYXRocyBnaXZlbiB0byB0aGUgbG9hZGVyLiBFeGFtcGxlOiAnaHR0cDovL2xhYnMucGhhc2VyLmlvL2Fzc2V0cy8nLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9hZGVyQmFzZVVSTCA9IEdldFZhbHVlKGNvbmZpZywgJ2xvYWRlci5iYXNlVVJMJywgJycpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge3N0cmluZ30gUGhhc2VyLkNvcmUuQ29uZmlnI2xvYWRlclBhdGggLSBBIFVSTCBwYXRoIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRocyBnaXZlbiB0byB0aGUgbG9hZGVyLiBFeGFtcGxlOiAnaW1hZ2VzL3Nwcml0ZXMvJy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWRlclBhdGggPSBHZXRWYWx1ZShjb25maWcsICdsb2FkZXIucGF0aCcsICcnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtpbnRlZ2VyfSBQaGFzZXIuQ29yZS5Db25maWcjbG9hZGVyTWF4UGFyYWxsZWxEb3dubG9hZHMgLSBNYXhpbXVtIHBhcmFsbGVsIGRvd25sb2FkcyBhbGxvd2VkIGZvciByZXNvdXJjZXMgKERlZmF1bHQgdG8gMzIpLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9hZGVyTWF4UGFyYWxsZWxEb3dubG9hZHMgPSBHZXRWYWx1ZShjb25maWcsICdsb2FkZXIubWF4UGFyYWxsZWxEb3dubG9hZHMnLCAzMik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7KHN0cmluZ3x1bmRlZmluZWQpfSBQaGFzZXIuQ29yZS5Db25maWcjbG9hZGVyQ3Jvc3NPcmlnaW4gLSAnYW5vbnltb3VzJywgJ3VzZS1jcmVkZW50aWFscycsIG9yIGB1bmRlZmluZWRgLiBJZiB5b3UncmUgbm90IG1ha2luZyBjcm9zcy1vcmlnaW4gcmVxdWVzdHMsIGxlYXZlIHRoaXMgYXMgYHVuZGVmaW5lZGAuIFNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9DT1JTX3NldHRpbmdzX2F0dHJpYnV0ZXN9LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9hZGVyQ3Jvc3NPcmlnaW4gPSBHZXRWYWx1ZShjb25maWcsICdsb2FkZXIuY3Jvc3NPcmlnaW4nLCB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge3N0cmluZ30gUGhhc2VyLkNvcmUuQ29uZmlnI2xvYWRlclJlc3BvbnNlVHlwZSAtIFRoZSByZXNwb25zZSB0eXBlIG9mIHRoZSBYSFIgcmVxdWVzdCwgZS5nLiBgYmxvYmAsIGB0ZXh0YCwgZXRjLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9hZGVyUmVzcG9uc2VUeXBlID0gR2V0VmFsdWUoY29uZmlnLCAnbG9hZGVyLnJlc3BvbnNlVHlwZScsICcnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjbG9hZGVyQXN5bmMgLSBTaG91bGQgdGhlIFhIUiByZXF1ZXN0IHVzZSBhc3luYyBvciBub3Q/XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2FkZXJBc3luYyA9IEdldFZhbHVlKGNvbmZpZywgJ2xvYWRlci5hc3luYycsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge3N0cmluZ30gUGhhc2VyLkNvcmUuQ29uZmlnI2xvYWRlclVzZXIgLSBPcHRpb25hbCB1c2VybmFtZSBmb3IgYWxsIFhIUiByZXF1ZXN0cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWRlclVzZXIgPSBHZXRWYWx1ZShjb25maWcsICdsb2FkZXIudXNlcicsICcnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtzdHJpbmd9IFBoYXNlci5Db3JlLkNvbmZpZyNsb2FkZXJQYXNzd29yZCAtIE9wdGlvbmFsIHBhc3N3b3JkIGZvciBhbGwgWEhSIHJlcXVlc3RzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9hZGVyUGFzc3dvcmQgPSBHZXRWYWx1ZShjb25maWcsICdsb2FkZXIucGFzc3dvcmQnLCAnJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7aW50ZWdlcn0gUGhhc2VyLkNvcmUuQ29uZmlnI2xvYWRlclRpbWVvdXQgLSBPcHRpb25hbCBYSFIgdGltZW91dCB2YWx1ZSwgaW4gbXMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2FkZXJUaW1lb3V0ID0gR2V0VmFsdWUoY29uZmlnLCAnbG9hZGVyLnRpbWVvdXQnLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHtib29sZWFufSBQaGFzZXIuQ29yZS5Db25maWcjbG9hZGVyV2l0aENyZWRlbnRpYWxzIC0gT3B0aW9uYWwgWEhSIHdpdGhDcmVkZW50aWFscyB2YWx1ZS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWRlcldpdGhDcmVkZW50aWFscyA9IEdldFZhbHVlKGNvbmZpZywgJ2xvYWRlci53aXRoQ3JlZGVudGlhbHMnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogQWxsb3dzIGBwbHVnaW5zYCBwcm9wZXJ0eSB0byBlaXRoZXIgYmUgYW4gYXJyYXksIGluIHdoaWNoIGNhc2UgaXQganVzdCByZXBsYWNlc1xyXG4gICAgICAgICAqIHRoZSBkZWZhdWx0IHBsdWdpbnMgbGlrZSBwcmV2aW91c2x5LCBvciBhIGNvbmZpZyBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBwbHVnaW5zOiB7XHJcbiAgICAgICAgICogICAgZ2xvYmFsOiBbXHJcbiAgICAgICAgICogICAgICAgIHsga2V5OiAnVGVzdFBsdWdpbicsIHBsdWdpbjogVGVzdFBsdWdpbiwgc3RhcnQ6IHRydWUsIGRhdGE6IHsgbXNnOiAnVGhlIHBsdWdpbiBpcyBhbGl2ZScgfSB9LFxyXG4gICAgICAgICAqICAgIF0sXHJcbiAgICAgICAgICogICAgc2NlbmU6IFtcclxuICAgICAgICAgKiAgICAgICAgeyBrZXk6ICdXaXJlRnJhbWVQbHVnaW4nLCBwbHVnaW46IFdpcmVGcmFtZVBsdWdpbiwgc3lzdGVtS2V5OiAnd2lyZUZyYW1lUGx1Z2luJywgc2NlbmVLZXk6ICd3aXJlZnJhbWUnIH1cclxuICAgICAgICAgKiAgICBdLFxyXG4gICAgICAgICAqICAgIGRlZmF1bHQ6IFtdLCBPUlxyXG4gICAgICAgICAqICAgIGRlZmF1bHRNZXJnZTogW1xyXG4gICAgICAgICAqICAgICAgICAnTW9kUGxheWVyJ1xyXG4gICAgICAgICAqICAgIF1cclxuICAgICAgICAgKiB9XHJcbiAgICAgICAgICovXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7YW55fSBQaGFzZXIuQ29yZS5Db25maWcjaW5zdGFsbEdsb2JhbFBsdWdpbnMgLSBBbiBhcnJheSBvZiBnbG9iYWwgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnN0YWxsR2xvYmFsUGx1Z2lucyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge2FueX0gUGhhc2VyLkNvcmUuQ29uZmlnI2luc3RhbGxTY2VuZVBsdWdpbnMgLSBBbiBhcnJheSBvZiBTY2VuZSBsZXZlbCBwbHVnaW5zIHRvIGJlIGluc3RhbGxlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmluc3RhbGxTY2VuZVBsdWdpbnMgPSBbXTtcclxuXHJcbiAgICAgICAgdmFyIHBsdWdpbnMgPSBHZXRWYWx1ZShjb25maWcsICdwbHVnaW5zJywgbnVsbCk7XHJcbiAgICAgICAgdmFyIGRlZmF1bHRQbHVnaW5zID0gRGVmYXVsdFBsdWdpbnMuRGVmYXVsdFNjZW5lO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2lucylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBPbGQgMy43IGFycmF5IGZvcm1hdD9cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2lucykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFBsdWdpbnMgPSBwbHVnaW5zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKElzUGxhaW5PYmplY3QocGx1Z2lucykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFsbEdsb2JhbFBsdWdpbnMgPSBHZXRGYXN0VmFsdWUocGx1Z2lucywgJ2dsb2JhbCcsIFtdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFsbFNjZW5lUGx1Z2lucyA9IEdldEZhc3RWYWx1ZShwbHVnaW5zLCAnc2NlbmUnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2lucy5kZWZhdWx0KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UGx1Z2lucyA9IHBsdWdpbnMuZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGx1Z2lucy5kZWZhdWx0TWVyZ2UpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQbHVnaW5zID0gZGVmYXVsdFBsdWdpbnMuY29uY2F0KHBsdWdpbnMuZGVmYXVsdE1lcmdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGNvbnN0IHthbnl9IFBoYXNlci5Db3JlLkNvbmZpZyNkZWZhdWx0UGx1Z2lucyAtIFRoZSBwbHVnaW5zIGluc3RhbGxlZCBpbnRvIGV2ZXJ5IFNjZW5lIChpbiBhZGRpdGlvbiB0byBDb3JlU2NlbmUgYW5kIEdsb2JhbCkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0UGx1Z2lucyA9IGRlZmF1bHRQbHVnaW5zO1xyXG5cclxuICAgICAgICAvLyAgRGVmYXVsdCAvIE1pc3NpbmcgSW1hZ2VzXHJcbiAgICAgICAgdmFyIHBuZ1ByZWZpeCA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAY29uc3Qge3N0cmluZ30gUGhhc2VyLkNvcmUuQ29uZmlnI2RlZmF1bHRJbWFnZSAtIEEgYmFzZTY0IGVuY29kZWQgUE5HIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGJsYW5rIHRleHR1cmUuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0SW1hZ2UgPSBHZXRWYWx1ZShjb25maWcsICdpbWFnZXMuZGVmYXVsdCcsIHBuZ1ByZWZpeCArICdBUU1BQUFCSnRPaTNBQUFBQTFCTVZFWC8vLytueEJ2SUFBQUFBWFJTVGxNQVFPYllaZ0FBQUJWSlJFRlVlRjdOd0lFQUFBQUFnS0Q5cWRlb2NBTUFvQUFCbTNEa2NBQUFBQUJKUlU1RXJrSmdnZz09Jyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBjb25zdCB7c3RyaW5nfSBQaGFzZXIuQ29yZS5Db25maWcjbWlzc2luZ0ltYWdlIC0gQSBiYXNlNjQgZW5jb2RlZCBQTkcgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgdGV4dHVyZSB3aGVuIGEgdGV4dHVyZSBpcyBhc3NpZ25lZCB0aGF0IGlzIG1pc3Npbmcgb3Igbm90IGxvYWRlZC5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1pc3NpbmdJbWFnZSA9IEdldFZhbHVlKGNvbmZpZywgJ2ltYWdlcy5taXNzaW5nJywgcG5nUHJlZml4ICsgJ0NBSUFBQUQ4R08yakFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSjlKUkVGVWVOcTAxc3NPd3lBTVJGRzQ2di8vTXQxRVNtZ2grREZtRTJHUE9CQVJLYjJOVmpvKzE3UFhMRDhhMStwbDUrQSt3U2dGeWd5bVdZSEJiMEZ0c0toSkRkWmxuY0cySXpKNGF5b01EdjIwd1RtU016Q2xFZ2JXWU5UQWtRMForT0orQS9lV25BYVI5K294Q0Y0T3MwSDhodHNNVXArcHdjZ0JCaU1ObkF3RjhHcUlnTDJoQXphR0ZGZ1phdURQS0FCbW93WjRHTDM2OS8wcndBQ3AyeUEvdHRtdnNRQUFBQUJKUlU1RXJrSmdnZz09Jyk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAod2luZG93LkZPUkNFX1dFQkdMKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclR5cGUgPSBDT05TVC5XRUJHTDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cuRk9SQ0VfQ0FOVkFTKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclR5cGUgPSBDT05TVC5DQU5WQVM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29uZmlnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDYW52YXNJbnRlcnBvbGF0aW9uID0gcmVxdWlyZSgnLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzSW50ZXJwb2xhdGlvbicpO1xyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZlYXR1cmVzID0gcmVxdWlyZSgnLi4vZGV2aWNlL0ZlYXR1cmVzJyk7XHJcblxyXG4vKipcclxuICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgUGhhc2VyLkdhbWUgYW5kIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcmVuZGVyZXIgaXQgd2lsbCB1c2UuXHJcbiAqXHJcbiAqIFJlbGllcyB1cG9uIHR3byB3ZWJwYWNrIGdsb2JhbCBmbGFncyB0byBiZSBkZWZpbmVkOiBgV0VCR0xfUkVOREVSRVJgIGFuZCBgQ0FOVkFTX1JFTkRFUkVSYCBkdXJpbmcgYnVpbGQgdGltZSwgYnV0IG5vdCBhdCBydW4tdGltZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5Db3JlLkNyZWF0ZVJlbmRlcmVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gVGhlIFBoYXNlci5HYW1lIGluc3RhbmNlIG9uIHdoaWNoIHRoZSByZW5kZXJlciB3aWxsIGJlIHNldC5cclxuICovXHJcbnZhciBDcmVhdGVSZW5kZXJlciA9IGZ1bmN0aW9uIChnYW1lKVxyXG57XHJcbiAgICB2YXIgY29uZmlnID0gZ2FtZS5jb25maWc7XHJcblxyXG4gICAgaWYgKChjb25maWcuY3VzdG9tRW52aXJvbm1lbnQgfHwgY29uZmlnLmNhbnZhcykgJiYgY29uZmlnLnJlbmRlclR5cGUgPT09IENPTlNULkFVVE8pXHJcbiAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHNldCBleHBsaWNpdCByZW5kZXJUeXBlIGluIGN1c3RvbSBlbnZpcm9ubWVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBOb3QgYSBjdXN0b20gZW52aXJvbm1lbnQsIGRpZG4ndCBwcm92aWRlIHRoZWlyIG93biBjYW52YXMgYW5kIG5vdCBoZWFkbGVzcywgc28gZGV0ZXJtaW5lIHRoZSByZW5kZXJlcjpcclxuICAgIGlmICghY29uZmlnLmN1c3RvbUVudmlyb25tZW50ICYmICFjb25maWcuY2FudmFzICYmIGNvbmZpZy5yZW5kZXJUeXBlICE9PSBDT05TVC5IRUFETEVTUylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnLnJlbmRlclR5cGUgPT09IENPTlNULkNBTlZBUyB8fCAoY29uZmlnLnJlbmRlclR5cGUgIT09IENPTlNULkNBTlZBUyAmJiAhRmVhdHVyZXMud2ViR0wpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKEZlYXR1cmVzLmNhbnZhcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRoZXkgcmVxdWVzdGVkIENhbnZhcyBhbmQgdGhlaXIgYnJvd3NlciBzdXBwb3J0cyBpdFxyXG4gICAgICAgICAgICAgICAgY29uZmlnLnJlbmRlclR5cGUgPSBDT05TVC5DQU5WQVM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgQ2FudmFzIG9yIFdlYkdMIGNvbnRleHQsIGFib3J0aW5nLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBHYW1lIHJlcXVlc3RlZCBXZWJHTCBhbmQgYnJvd3NlciBzYXlzIGl0IHN1cHBvcnRzIGl0XHJcbiAgICAgICAgICAgIGNvbmZpZy5yZW5kZXJUeXBlID0gQ09OU1QuV0VCR0w7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBQaXhlbCBBcnQgbW9kZT9cclxuICAgIGlmICghY29uZmlnLmFudGlhbGlhcylcclxuICAgIHtcclxuICAgICAgICBDYW52YXNQb29sLmRpc2FibGVTbW9vdGhpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYmFzZVNpemUgPSBnYW1lLnNjYWxlLmJhc2VTaXplO1xyXG5cclxuICAgIHZhciB3aWR0aCA9IGJhc2VTaXplLndpZHRoO1xyXG4gICAgdmFyIGhlaWdodCA9IGJhc2VTaXplLmhlaWdodDtcclxuXHJcbiAgICAvLyAgRG9lcyB0aGUgZ2FtZSBjb25maWcgcHJvdmlkZSBpdHMgb3duIGNhbnZhcyBlbGVtZW50IHRvIHVzZT9cclxuICAgIGlmIChjb25maWcuY2FudmFzKVxyXG4gICAge1xyXG4gICAgICAgIGdhbWUuY2FudmFzID0gY29uZmlnLmNhbnZhcztcclxuXHJcbiAgICAgICAgZ2FtZS5jYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICBnYW1lLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZ2FtZS5jYW52YXMgPSBDYW52YXNQb29sLmNyZWF0ZShnYW1lLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcucmVuZGVyVHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIERvZXMgdGhlIGdhbWUgY29uZmlnIHByb3ZpZGUgc29tZSBjYW52YXMgY3NzIHN0eWxlcyB0byB1c2U/XHJcbiAgICBpZiAoY29uZmlnLmNhbnZhc1N0eWxlKVxyXG4gICAge1xyXG4gICAgICAgIGdhbWUuY2FudmFzLnN0eWxlID0gY29uZmlnLmNhbnZhc1N0eWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBQaXhlbCBBcnQgbW9kZT9cclxuICAgIGlmICghY29uZmlnLmFudGlhbGlhcylcclxuICAgIHtcclxuICAgICAgICBDYW52YXNJbnRlcnBvbGF0aW9uLnNldENyaXNwKGdhbWUuY2FudmFzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLnJlbmRlclR5cGUgPT09IENPTlNULkhFQURMRVNTKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBOb3RoaW5nIG1vcmUgdG8gZG8gaGVyZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgQ2FudmFzUmVuZGVyZXI7XHJcbiAgICB2YXIgV2ViR0xSZW5kZXJlcjtcclxuXHJcbiAgICBpZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSICYmIHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbiAgICB7XHJcbiAgICAgICAgQ2FudmFzUmVuZGVyZXIgPSByZXF1aXJlKCcuLi9yZW5kZXJlci9jYW52YXMvQ2FudmFzUmVuZGVyZXInKTtcclxuICAgICAgICBXZWJHTFJlbmRlcmVyID0gcmVxdWlyZSgnLi4vcmVuZGVyZXIvd2ViZ2wvV2ViR0xSZW5kZXJlcicpO1xyXG5cclxuICAgICAgICAvLyAgTGV0IHRoZSBjb25maWcgcGljayB0aGUgcmVuZGVyZXIgdHlwZSwgYXMgYm90aCBhcmUgaW5jbHVkZWRcclxuICAgICAgICBpZiAoY29uZmlnLnJlbmRlclR5cGUgPT09IENPTlNULldFQkdMKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZS5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKGdhbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lLnJlbmRlcmVyID0gbmV3IENhbnZhc1JlbmRlcmVyKGdhbWUpO1xyXG4gICAgICAgICAgICBnYW1lLmNvbnRleHQgPSBnYW1lLnJlbmRlcmVyLmdhbWVDb250ZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSICYmICF0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG4gICAge1xyXG4gICAgICAgIFdlYkdMUmVuZGVyZXIgPSByZXF1aXJlKCcuLi9yZW5kZXJlci93ZWJnbC9XZWJHTFJlbmRlcmVyJyk7XHJcblxyXG4gICAgICAgIC8vICBGb3JjZSB0aGUgdHlwZSB0byBXZWJHTCwgcmVnYXJkbGVzcyB3aGF0IHdhcyByZXF1ZXN0ZWRcclxuICAgICAgICBjb25maWcucmVuZGVyVHlwZSA9IENPTlNULldFQkdMO1xyXG5cclxuICAgICAgICBnYW1lLnJlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoZ2FtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0eXBlb2YgV0VCR0xfUkVOREVSRVIgJiYgdHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxuICAgIHtcclxuICAgICAgICBDYW52YXNSZW5kZXJlciA9IHJlcXVpcmUoJy4uL3JlbmRlcmVyL2NhbnZhcy9DYW52YXNSZW5kZXJlcicpO1xyXG5cclxuICAgICAgICAvLyAgRm9yY2UgdGhlIHR5cGUgdG8gQ2FudmFzLCByZWdhcmRsZXNzIHdoYXQgd2FzIHJlcXVlc3RlZFxyXG4gICAgICAgIGNvbmZpZy5yZW5kZXJUeXBlID0gQ09OU1QuQ0FOVkFTO1xyXG5cclxuICAgICAgICBnYW1lLnJlbmRlcmVyID0gbmV3IENhbnZhc1JlbmRlcmVyKGdhbWUpO1xyXG5cclxuICAgICAgICBnYW1lLmNvbnRleHQgPSBnYW1lLnJlbmRlcmVyLmdhbWVDb250ZXh0O1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDcmVhdGVSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IFBoYXNlci5HYW1lIGFuZCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGNvbnNvbGUubG9nIGRlYnVnIGhlYWRlci5cclxuICpcclxuICogWW91IGNhbiBjdXN0b21pemUgb3IgZGlzYWJsZSB0aGUgaGVhZGVyIHZpYSB0aGUgR2FtZSBDb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkNvcmUuRGVidWdIZWFkZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWV9IGdhbWUgLSBUaGUgUGhhc2VyLkdhbWUgaW5zdGFuY2Ugd2hpY2ggd2lsbCBvdXRwdXQgdGhpcyBkZWJ1ZyBoZWFkZXIuXHJcbiAqL1xyXG52YXIgRGVidWdIZWFkZXIgPSBmdW5jdGlvbiAoZ2FtZSlcclxue1xyXG4gICAgdmFyIGNvbmZpZyA9IGdhbWUuY29uZmlnO1xyXG5cclxuICAgIGlmIChjb25maWcuaGlkZUJhbm5lcilcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlbmRlclR5cGUgPSAnV2ViR0wnO1xyXG5cclxuICAgIGlmIChjb25maWcucmVuZGVyVHlwZSA9PT0gQ09OU1QuQ0FOVkFTKVxyXG4gICAge1xyXG4gICAgICAgIHJlbmRlclR5cGUgPSAnQ2FudmFzJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNvbmZpZy5yZW5kZXJUeXBlID09PSBDT05TVC5IRUFETEVTUylcclxuICAgIHtcclxuICAgICAgICByZW5kZXJUeXBlID0gJ0hlYWRsZXNzJztcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYXVkaW9Db25maWcgPSBjb25maWcuYXVkaW87XHJcbiAgICB2YXIgZGV2aWNlQXVkaW8gPSBnYW1lLmRldmljZS5hdWRpbztcclxuXHJcbiAgICB2YXIgYXVkaW9UeXBlO1xyXG5cclxuICAgIGlmIChkZXZpY2VBdWRpby53ZWJBdWRpbyAmJiAhKGF1ZGlvQ29uZmlnICYmIGF1ZGlvQ29uZmlnLmRpc2FibGVXZWJBdWRpbykpXHJcbiAgICB7XHJcbiAgICAgICAgYXVkaW9UeXBlID0gJ1dlYiBBdWRpbyc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgoYXVkaW9Db25maWcgJiYgYXVkaW9Db25maWcubm9BdWRpbykgfHwgKCFkZXZpY2VBdWRpby53ZWJBdWRpbyAmJiAhZGV2aWNlQXVkaW8uYXVkaW9EYXRhKSlcclxuICAgIHtcclxuICAgICAgICBhdWRpb1R5cGUgPSAnTm8gQXVkaW8nO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGF1ZGlvVHlwZSA9ICdIVE1MNSBBdWRpbyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFnYW1lLmRldmljZS5icm93c2VyLmllKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjID0gJyc7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbIGMgXTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmJhbm5lckJhY2tncm91bmRDb2xvcikpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbGFzdENvbG9yO1xyXG5cclxuICAgICAgICAgICAgY29uZmlnLmJhbm5lckJhY2tncm91bmRDb2xvci5mb3JFYWNoKGZ1bmN0aW9uIChjb2xvcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYyA9IGMuY29uY2F0KCclYyAnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2goJ2JhY2tncm91bmQ6ICcgKyBjb2xvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgbGFzdENvbG9yID0gY29sb3I7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBpbmplY3QgdGhlIHRleHQgY29sb3JcclxuICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gJ2NvbG9yOiAnICsgY29uZmlnLmJhbm5lclRleHRDb2xvciArICc7IGJhY2tncm91bmQ6ICcgKyBsYXN0Q29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGMgPSBjLmNvbmNhdCgnJWMgJyk7XHJcblxyXG4gICAgICAgICAgICBhcmdzLnB1c2goJ2NvbG9yOiAnICsgY29uZmlnLmJhbm5lclRleHRDb2xvciArICc7IGJhY2tncm91bmQ6ICcgKyBjb25maWcuYmFubmVyQmFja2dyb3VuZENvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBVUkwgbGluayBiYWNrZ3JvdW5kIGNvbG9yIChhbHdheXMgd2hpdGUpXHJcbiAgICAgICAgYXJncy5wdXNoKCdiYWNrZ3JvdW5kOiAjZmZmJyk7XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuZ2FtZVRpdGxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYyA9IGMuY29uY2F0KGNvbmZpZy5nYW1lVGl0bGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5nYW1lVmVyc2lvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYyA9IGMuY29uY2F0KCcgdicgKyBjb25maWcuZ2FtZVZlcnNpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5oaWRlUGhhc2VyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjID0gYy5jb25jYXQoJyAvICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmIgPSAodHlwZW9mIFBMVUdJTl9GQklOU1RBTlQpID8gJy1GQicgOiAnJztcclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuaGlkZVBoYXNlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGMgPSBjLmNvbmNhdCgnUGhhc2VyIHYnICsgQ09OU1QuVkVSU0lPTiArIGZiICsgJyAoJyArIHJlbmRlclR5cGUgKyAnIHwgJyArIGF1ZGlvVHlwZSArICcpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjID0gYy5jb25jYXQoJyAlYyAnICsgY29uZmlnLmdhbWVVUkwpO1xyXG5cclxuICAgICAgICAvLyAgSW5qZWN0IHRoZSBuZXcgc3RyaW5nIGJhY2sgaW50byB0aGUgYXJncyBhcnJheVxyXG4gICAgICAgIGFyZ3NbMF0gPSBjO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmdzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHdpbmRvd1snY29uc29sZSddKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQaGFzZXIgdicgKyBDT05TVC5WRVJTSU9OICsgJyAvIGh0dHBzOi8vcGhhc2VyLmlvJyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERlYnVnSGVhZGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBZGRUb0RPTSA9IHJlcXVpcmUoJy4uL2RvbS9BZGRUb0RPTScpO1xyXG52YXIgQW5pbWF0aW9uTWFuYWdlciA9IHJlcXVpcmUoJy4uL2FuaW1hdGlvbnMvQW5pbWF0aW9uTWFuYWdlcicpO1xyXG52YXIgQ2FjaGVNYW5hZ2VyID0gcmVxdWlyZSgnLi4vY2FjaGUvQ2FjaGVNYW5hZ2VyJyk7XHJcbnZhciBDYW52YXNQb29sID0gcmVxdWlyZSgnLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzUG9vbCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29uZmlnID0gcmVxdWlyZSgnLi9Db25maWcnKTtcclxudmFyIENyZWF0ZURPTUNvbnRhaW5lciA9IHJlcXVpcmUoJy4uL2RvbS9DcmVhdGVET01Db250YWluZXInKTtcclxudmFyIENyZWF0ZVJlbmRlcmVyID0gcmVxdWlyZSgnLi9DcmVhdGVSZW5kZXJlcicpO1xyXG52YXIgRGF0YU1hbmFnZXIgPSByZXF1aXJlKCcuLi9kYXRhL0RhdGFNYW5hZ2VyJyk7XHJcbnZhciBEZWJ1Z0hlYWRlciA9IHJlcXVpcmUoJy4vRGVidWdIZWFkZXInKTtcclxudmFyIERldmljZSA9IHJlcXVpcmUoJy4uL2RldmljZScpO1xyXG52YXIgRE9NQ29udGVudExvYWRlZCA9IHJlcXVpcmUoJy4uL2RvbS9ET01Db250ZW50TG9hZGVkJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgSW5wdXRNYW5hZ2VyID0gcmVxdWlyZSgnLi4vaW5wdXQvSW5wdXRNYW5hZ2VyJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxudmFyIFBsdWdpbk1hbmFnZXIgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbk1hbmFnZXInKTtcclxudmFyIFNjYWxlTWFuYWdlciA9IHJlcXVpcmUoJy4uL3NjYWxlL1NjYWxlTWFuYWdlcicpO1xyXG52YXIgU2NlbmVNYW5hZ2VyID0gcmVxdWlyZSgnLi4vc2NlbmUvU2NlbmVNYW5hZ2VyJyk7XHJcbnZhciBUZXh0dXJlRXZlbnRzID0gcmVxdWlyZSgnLi4vdGV4dHVyZXMvZXZlbnRzJyk7XHJcbnZhciBUZXh0dXJlTWFuYWdlciA9IHJlcXVpcmUoJy4uL3RleHR1cmVzL1RleHR1cmVNYW5hZ2VyJyk7XHJcbnZhciBUaW1lU3RlcCA9IHJlcXVpcmUoJy4vVGltZVN0ZXAnKTtcclxudmFyIFZpc2liaWxpdHlIYW5kbGVyID0gcmVxdWlyZSgnLi9WaXNpYmlsaXR5SGFuZGxlcicpO1xyXG5cclxuaWYgKHR5cGVvZiBGRUFUVVJFX1NPVU5EKVxyXG57XHJcbiAgICB2YXIgU291bmRNYW5hZ2VyQ3JlYXRvciA9IHJlcXVpcmUoJy4uL3NvdW5kL1NvdW5kTWFuYWdlckNyZWF0b3InKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBQTFVHSU5fRkJJTlNUQU5UKVxyXG57XHJcbiAgICB2YXIgRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4gPSByZXF1aXJlKCcuLi8uLi9wbHVnaW5zL2ZiaW5zdGFudC9zcmMvRmFjZWJvb2tJbnN0YW50R2FtZXNQbHVnaW4nKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIFBoYXNlci5HYW1lIGluc3RhbmNlIGlzIHRoZSBtYWluIGNvbnRyb2xsZXIgZm9yIHRoZSBlbnRpcmUgUGhhc2VyIGdhbWUuIEl0IGlzIHJlc3BvbnNpYmxlXHJcbiAqIGZvciBoYW5kbGluZyB0aGUgYm9vdCBwcm9jZXNzLCBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlcywgY3JlYXRpbmcgdGhlIHJlbmRlcmVyLFxyXG4gKiBhbmQgc2V0dGluZy11cCBhbGwgb2YgdGhlIGdsb2JhbCBQaGFzZXIgc3lzdGVtcywgc3VjaCBhcyBzb3VuZCBhbmQgaW5wdXQuXHJcbiAqIE9uY2UgdGhhdCBpcyBjb21wbGV0ZSBpdCB3aWxsIHN0YXJ0IHRoZSBTY2VuZSBNYW5hZ2VyIGFuZCB0aGVuIGJlZ2luIHRoZSBtYWluIGdhbWUgbG9vcC5cclxuICpcclxuICogWW91IHNob3VsZCBnZW5lcmFsbHkgYXZvaWQgYWNjZXNzaW5nIGFueSBvZiB0aGUgc3lzdGVtcyBjcmVhdGVkIGJ5IEdhbWUsIGFuZCBpbnN0ZWFkIHVzZSB0aG9zZVxyXG4gKiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgdmlhIHRoZSBQaGFzZXIuU2NlbmUgU3lzdGVtcyBjbGFzcyBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAY2xhc3MgR2FtZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI0JMVVJcclxuICogQGZpcmVzIFBoYXNlci5Db3JlLkV2ZW50cyNGT0NVU1xyXG4gKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI0hJRERFTlxyXG4gKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI1ZJU0lCTEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkNvcmUuR2FtZUNvbmZpZ30gW0dhbWVDb25maWddIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB5b3VyIFBoYXNlciBHYW1lIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEdhbWUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR2FtZSAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwYXJzZWQgR2FtZSBDb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZXMgc3RvcmVkIHdpdGhpbiB0aGlzIG9iamVjdCBhcmUgcmVhZC1vbmx5IGFuZCBzaG91bGQgbm90IGJlIGNoYW5nZWQgYXQgcnVuLXRpbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNjb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNvcmUuQ29uZmlnfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0gbmV3IENvbmZpZyhjb25maWcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byBlaXRoZXIgdGhlIENhbnZhcyBvciBXZWJHTCBSZW5kZXJlciB0aGF0IHRoaXMgR2FtZSBpcyB1c2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gYW4gSFRNTCBEaXYgRWxlbWVudCB1c2VkIGFzIHRoZSBET00gRWxlbWVudCBDb250YWluZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBPbmx5IHNldCBpZiBgY3JlYXRlRE9NQ29udGFpbmVyYCBpcyBgdHJ1ZWAgaW4gdGhlIGdhbWUgY29uZmlnIChieSBkZWZhdWx0IGl0IGlzIGBmYWxzZWApIGFuZFxyXG4gICAgICAgICAqIGlmIHlvdSBwcm92aWRlIGEgcGFyZW50IGVsZW1lbnQgdG8gaW5zZXJ0IHRoZSBQaGFzZXIgR2FtZSBpbnNpZGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTZWUgdGhlIERPTSBFbGVtZW50IEdhbWUgT2JqZWN0IGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNkb21Db250YWluZXJcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTERpdkVsZW1lbnR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZG9tQ29udGFpbmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEhUTUwgQ2FudmFzIEVsZW1lbnQgdGhhdCBQaGFzZXIgdXNlcyB0byByZW5kZXIgdGhlIGdhbWUuXHJcbiAgICAgICAgICogVGhpcyBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgUGhhc2VyIHVubGVzcyB5b3UgcHJvdmlkZSBhIGBjYW52YXNgIHByb3BlcnR5XHJcbiAgICAgICAgICogaW4geW91ciBHYW1lIENvbmZpZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI2NhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBSZW5kZXJpbmcgQ29udGV4dCBiZWxvbmdpbmcgdG8gdGhlIENhbnZhcyBFbGVtZW50IHRoaXMgZ2FtZSBpcyByZW5kZXJpbmcgdG8uXHJcbiAgICAgICAgICogSWYgdGhlIGdhbWUgaXMgcnVubmluZyB1bmRlciBDYW52YXMgaXQgd2lsbCBiZSBhIDJkIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAgICAgKiBJZiB0aGUgZ2FtZSBpcyBydW5uaW5nIHVuZGVyIFdlYkdMIGl0IHdpbGwgYmUgYSBXZWJHTCBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAgICAgKiBUaGlzIGNvbnRleHQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IFBoYXNlciB1bmxlc3MgeW91IHByb3ZpZGUgYSBgY29udGV4dGAgcHJvcGVydHlcclxuICAgICAgICAgKiBpbiB5b3VyIEdhbWUgQ29uZmlnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjY29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHsoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfFdlYkdMUmVuZGVyaW5nQ29udGV4dCl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGluZGljYXRpbmcgd2hlbiB0aGlzIEdhbWUgaW5zdGFuY2UgaGFzIGZpbmlzaGVkIGl0cyBib290IHByb2Nlc3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNpc0Jvb3RlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNCb290ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBHYW1lIGlzIGN1cnJlbnRseSBydW5uaW5nIGl0cyBnYW1lIHN0ZXAgb3Igbm90LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjaXNSdW5uaW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gRXZlbnQgRW1pdHRlciB3aGljaCBpcyB1c2VkIHRvIGJyb2FkY2FzdCBnYW1lLWxldmVsIGV2ZW50cyBmcm9tIHRoZSBnbG9iYWwgc3lzdGVtcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI2V2ZW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIEFuaW1hdGlvbiBNYW5hZ2VyIGlzIGEgZ2xvYmFsIHN5c3RlbSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgYWxsIGFuaW1hdGlvbnMgdXNlZCB3aXRoaW4geW91ciBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjYW5pbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFuaW1zID0gbmV3IEFuaW1hdGlvbk1hbmFnZXIodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgVGV4dHVyZSBNYW5hZ2VyIGlzIGEgZ2xvYmFsIHN5c3RlbSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgYWxsIHRleHR1cmVzIGJlaW5nIHVzZWQgYnkgeW91ciBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjdGV4dHVyZXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBuZXcgVGV4dHVyZU1hbmFnZXIodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDYWNoZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIENhY2hlIE1hbmFnZXIgaXMgYSBnbG9iYWwgc3lzdGVtIHJlc3BvbnNpYmxlIGZvciBjYWNoaW5nLCBhY2Nlc3NpbmcgYW5kIHJlbGVhc2luZyBleHRlcm5hbCBnYW1lIGFzc2V0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI2NhY2hlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYWNoZS5DYWNoZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBDYWNoZU1hbmFnZXIodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBEYXRhIE1hbmFnZXJcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI3JlZ2lzdHJ5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5EYXRhLkRhdGFNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgRGF0YU1hbmFnZXIodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIElucHV0IE1hbmFnZXIgaXMgYSBnbG9iYWwgc3lzdGVtIHJlc3BvbnNpYmxlIGZvciB0aGUgY2FwdHVyZSBvZiBicm93c2VyLWxldmVsIGlucHV0IGV2ZW50cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI2lucHV0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBJbnB1dE1hbmFnZXIodGhpcywgdGhpcy5jb25maWcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU2NlbmUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSBNYW5hZ2VyIGlzIGEgZ2xvYmFsIHN5c3RlbSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcsIG1vZGlmeWluZyBhbmQgdXBkYXRpbmcgdGhlIFNjZW5lcyBpbiB5b3VyIGdhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lTWFuYWdlcih0aGlzLCB0aGlzLmNvbmZpZy5zY2VuZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBEZXZpY2UgaW5zcGVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBydW5uaW5nIHRoaXMgZ2FtZSwgc3VjaCBhcyBPUywgYnJvd3NlciB2ZW5kb3IgYW5kIGZlYXR1cmUgc3VwcG9ydC5cclxuICAgICAgICAgKiBVc2VkIGJ5IHZhcmlvdXMgc3lzdGVtcyB0byBkZXRlcm1pbmUgY2FwYWJpbGl0aWVzIGFuZCBjb2RlIHBhdGhzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjZGV2aWNlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5EZXZpY2VDb25mfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGV2aWNlID0gRGV2aWNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgU2NhbGUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBTY2FsZSBNYW5hZ2VyIGlzIGEgZ2xvYmFsIHN5c3RlbSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgc2NhbGluZyBvZiB0aGUgZ2FtZSBjYW52YXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNzY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlID0gbmV3IFNjYWxlTWFuYWdlcih0aGlzLCB0aGlzLmNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBiYXNlIFNvdW5kIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgU291bmQgTWFuYWdlciBpcyBhIGdsb2JhbCBzeXN0ZW0gcmVzcG9uc2libGUgZm9yIHRoZSBwbGF5YmFjayBhbmQgdXBkYXRpbmcgb2YgYWxsIGF1ZGlvIGluIHlvdXIgZ2FtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gZGlzYWJsZSB0aGUgaW5jbHVzaW9uIG9mIHRoZSBTb3VuZCBNYW5hZ2VyIGluIHlvdXIgYnVpbGQgYnkgdG9nZ2xpbmcgdGhlIHdlYnBhY2sgYEZFQVRVUkVfU09VTkRgIGZsYWcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNzb3VuZFxyXG4gICAgICAgICAqIEB0eXBlIHsoUGhhc2VyLlNvdW5kLk5vQXVkaW9Tb3VuZE1hbmFnZXJ8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJ8UGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNvdW5kID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBGRUFUVVJFX1NPVU5EKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VuZCA9IFNvdW5kTWFuYWdlckNyZWF0b3IuY3JlYXRlKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIFRpbWUgU3RlcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBUaW1lIFN0ZXAgaXMgYSBnbG9iYWwgc3lzdGVtIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nLXVwIGFuZCByZXNwb25kaW5nIHRvIHRoZSBicm93c2VyIGZyYW1lIGV2ZW50cywgcHJvY2Vzc2luZ1xyXG4gICAgICAgICAqIHRoZW0gYW5kIGNhbGN1bGF0aW5nIGRlbHRhIHZhbHVlcy4gSXQgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGxzIHRoZSBnYW1lIHN0ZXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNsb29wXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5Db3JlLlRpbWVTdGVwfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9vcCA9IG5ldyBUaW1lU3RlcCh0aGlzLCB0aGlzLmNvbmZpZy5mcHMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgUGx1Z2luIE1hbmFnZXIgaXMgYSBnbG9iYWwgc3lzdGVtIHRoYXQgYWxsb3dzIHBsdWdpbnMgdG8gcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIGl0LCBhbmQgY2FuIHRoZW4gaW5zdGFsbFxyXG4gICAgICAgICAqIHRob3NlIHBsdWdpbnMgaW50byBTY2VuZXMgYXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNwbHVnaW5zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3IFBsdWdpbk1hbmFnZXIodGhpcywgdGhpcy5jb25maWcpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIFBMVUdJTl9GQklOU1RBTlQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBUaGlzIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIHBsdWdpbiBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlcixcclxuICAgICAgICAgICAgICogb3IgeW91J3JlIHVzaW5nIHRoZSBzcGVjaWFsIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgY3VzdG9tIGJ1aWxkLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNmYWNlYm9va1xyXG4gICAgICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2lufVxyXG4gICAgICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmZhY2Vib29rID0gbmV3IEZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBHYW1lIHBlbmRpbmcgZGVzdHJ1Y3Rpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGZyYW1lP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjcGVuZGluZ0Rlc3Ryb3lcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3kgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBDYW52YXMgb25jZSB0aGUgZGVzdHJveSBpcyBvdmVyP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWUjcmVtb3ZlQ2FudmFzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbW92ZUNhbnZhcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZW1vdmUgZXZlcnl0aGluZyB3aGVuIHRoZSBnYW1lIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgKiBZb3UgY2Fubm90IGNyZWF0ZSBhIG5ldyBQaGFzZXIgaW5zdGFuY2Ugb24gdGhlIHNhbWUgd2ViIHBhZ2UgYWZ0ZXIgZG9pbmcgdGhpcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lI25vUmV0dXJuXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ub1JldHVybiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEb2VzIHRoZSB3aW5kb3cgdGhlIGdhbWUgaXMgcnVubmluZyBpbiBjdXJyZW50bHkgaGF2ZSBmb2N1cyBvciBub3Q/XHJcbiAgICAgICAgICogVGhpcyBpcyBtb2RpZmllZCBieSB0aGUgVmlzaWJpbGl0eUhhbmRsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZSNoYXNGb2N1c1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGFzRm9jdXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gIFdhaXQgZm9yIHRoZSBET00gUmVhZHkgZXZlbnQsIHRoZW4gY2FsbCBib290LlxyXG4gICAgICAgIERPTUNvbnRlbnRMb2FkZWQodGhpcy5ib290LmJpbmQodGhpcykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIERPTSBpcyByZWFkeS4gSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSByZW5kZXJlcixcclxuICAgICAqIGRpc3BsYXlpbmcgdGhlIERlYnVnIEhlYWRlciwgYWRkaW5nIHRoZSBnYW1lIGNhbnZhcyB0byB0aGUgRE9NIGFuZCBlbWl0dGluZyB0aGUgJ2Jvb3QnIGV2ZW50LlxyXG4gICAgICogSXQgbGlzdGVucyBmb3IgYSAncmVhZHknIGV2ZW50IGZyb20gdGhlIGJhc2Ugc3lzdGVtcyBhbmQgb25jZSByZWNlaXZlZCBpdCB3aWxsIGNhbGwgYEdhbWUuc3RhcnRgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWUjYm9vdFxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Db3JlLkV2ZW50cyNCT09UXHJcbiAgICAgKiBAbGlzdGVucyBQaGFzZXIuVGV4dHVyZXMuRXZlbnRzI1JFQURZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIVBsdWdpbkNhY2hlLmhhc0NvcmUoJ0V2ZW50RW1pdHRlcicpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBYm9ydGluZy4gQ29yZSBQbHVnaW5zIG1pc3NpbmcuJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNCb290ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZpZy5wcmVCb290KHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNjYWxlLnByZUJvb3QoKTtcclxuXHJcbiAgICAgICAgQ3JlYXRlUmVuZGVyZXIodGhpcyk7XHJcblxyXG4gICAgICAgIENyZWF0ZURPTUNvbnRhaW5lcih0aGlzKTtcclxuXHJcbiAgICAgICAgRGVidWdIZWFkZXIodGhpcyk7XHJcblxyXG4gICAgICAgIEFkZFRvRE9NKHRoaXMuY2FudmFzLCB0aGlzLmNvbmZpZy5wYXJlbnQpO1xyXG5cclxuICAgICAgICAvLyAgVGhlIFRleHR1cmUgTWFuYWdlciBoYXMgdG8gd2FpdCBvbiBhIGNvdXBsZSBvZiBub24tYmxvY2tpbmcgZXZlbnRzIGJlZm9yZSBpdCdzIGZ1bGx5IHJlYWR5LlxyXG4gICAgICAgIC8vICBTbyBpdCB3aWxsIGVtaXQgdGhpcyBpbnRlcm5hbCBldmVudCB3aGVuIGRvbmU6XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5vbmNlKFRleHR1cmVFdmVudHMuUkVBRFksIHRoaXMudGV4dHVyZXNSZWFkeSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLkJPT1QpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIFRleHR1cmUgTWFuYWdlciBoYXMgZmluaXNoZWQgc2V0dGluZyB1cCBhbmQgcHJlcGFyaW5nIHRoZVxyXG4gICAgICogZGVmYXVsdCB0ZXh0dXJlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lI3RleHR1cmVzUmVhZHlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWUjUkVBRFlcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqL1xyXG4gICAgdGV4dHVyZXNSZWFkeTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgU3RhcnQgYWxsIHRoZSBvdGhlciBzeXN0ZW1zXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuUkVBRFkpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgR2FtZS5ib290IG9uY2UgYWxsIG9mIHRoZSBnbG9iYWwgc3lzdGVtcyBoYXZlIGZpbmlzaGVkIHNldHRpbmcgdGhlbXNlbHZlcyB1cC5cclxuICAgICAqIEJ5IHRoaXMgcG9pbnQgdGhlIEdhbWUgaXMgbm93IHJlYWR5IHRvIHN0YXJ0IHRoZSBtYWluIGxvb3AgcnVubmluZy5cclxuICAgICAqIEl0IHdpbGwgYWxzbyBlbmFibGUgdGhlIFZpc2liaWxpdHkgSGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lI3N0YXJ0XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZpZy5wb3N0Qm9vdCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxvb3Auc3RhcnQodGhpcy5zdGVwLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxvb3Auc3RhcnQodGhpcy5oZWFkbGVzc1N0ZXAuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBWaXNpYmlsaXR5SGFuZGxlcih0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIGV2ZW50RW1pdHRlciA9IHRoaXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub24oRXZlbnRzLkhJRERFTiwgdGhpcy5vbkhpZGRlbiwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKEV2ZW50cy5WSVNJQkxFLCB0aGlzLm9uVmlzaWJsZSwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKEV2ZW50cy5CTFVSLCB0aGlzLm9uQmx1ciwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKEV2ZW50cy5GT0NVUywgdGhpcy5vbkZvY3VzLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBHYW1lIFN0ZXAuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBUaW1lIFN0ZXAsIG9uY2UgcGVyIGJyb3dzZXIgZnJhbWUgKHR5cGljYWxseSBhcyBhIHJlc3VsdCBvZlxyXG4gICAgICogUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIFNldCBUaW1lb3V0IG9uIHZlcnkgb2xkIGJyb3dzZXJzLilcclxuICAgICAqXHJcbiAgICAgKiBUaGUgc3RlcCB3aWxsIHVwZGF0ZSB0aGUgZ2xvYmFsIG1hbmFnZXJzIGZpcnN0LCB0aGVuIHByb2NlZWQgdG8gdXBkYXRlIGVhY2ggU2NlbmUgaW4gdHVybiwgdmlhIHRoZSBTY2VuZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEl0IHdpbGwgdGhlbiByZW5kZXIgZWFjaCBTY2VuZSBpbiB0dXJuLCB2aWEgdGhlIFJlbmRlcmVyLiBUaGlzIHByb2Nlc3MgZW1pdHMgYHByZXJlbmRlcmAgYW5kIGBwb3N0cmVuZGVyYCBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZSNzdGVwXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI1BSRV9TVEVQXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI1NURVBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ29yZS5FdmVudHMjUE9TVF9TVEVQXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI1BSRV9SRU5ERVJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQ29yZS5FdmVudHMjUE9TVF9SRU5ERVJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZS4gRWl0aGVyIGEgSGlnaCBSZXNvbHV0aW9uIFRpbWVyIHZhbHVlIGlmIGl0IGNvbWVzIGZyb20gUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIERhdGUubm93IGlmIHVzaW5nIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gICAgICovXHJcbiAgICBzdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0Rlc3Ryb3kpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5EZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5ldmVudHM7XHJcblxyXG4gICAgICAgIC8vICBHbG9iYWwgTWFuYWdlcnMgbGlrZSBJbnB1dCBhbmQgU291bmQgdXBkYXRlIGluIHRoZSBwcmVzdGVwXHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5lbWl0KEV2ZW50cy5QUkVfU1RFUCwgdGltZSwgZGVsdGEpO1xyXG5cclxuICAgICAgICAvLyAgVGhpcyBpcyBtb3N0bHkgbWVhbnQgZm9yIHVzZXItbGFuZCBjb2RlIGFuZCBwbHVnaW5zXHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5lbWl0KEV2ZW50cy5TVEVQLCB0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIC8vICBVcGRhdGUgdGhlIFNjZW5lIE1hbmFnZXIgYW5kIGFsbCBhY3RpdmUgU2NlbmVzXHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlKHRpbWUsIGRlbHRhKTtcclxuXHJcbiAgICAgICAgLy8gIE91ciBmaW5hbCBldmVudCBiZWZvcmUgcmVuZGVyaW5nIHN0YXJ0c1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuUE9TVF9TVEVQLCB0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIC8vICBSdW4gdGhlIFByZS1yZW5kZXIgKGNsZWFyaW5nIHRoZSBjYW52YXMsIHNldHRpbmcgYmFja2dyb3VuZCBjb2xvcnMsIGV0YylcclxuXHJcbiAgICAgICAgcmVuZGVyZXIucHJlUmVuZGVyKCk7XHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5lbWl0KEV2ZW50cy5QUkVfUkVOREVSLCByZW5kZXJlciwgdGltZSwgZGVsdGEpO1xyXG5cclxuICAgICAgICAvLyAgVGhlIG1haW4gcmVuZGVyIGxvb3AuIEl0ZXJhdGVzIGFsbCBTY2VuZXMgYW5kIGFsbCBDYW1lcmFzIGluIHRob3NlIHNjZW5lcywgcmVuZGVyaW5nIHRvIHRoZSByZW5kZXJlciBpbnN0YW5jZS5cclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5yZW5kZXIocmVuZGVyZXIpO1xyXG5cclxuICAgICAgICAvLyAgVGhlIFBvc3QtUmVuZGVyIGNhbGwuIFRpZGllcyB1cCBsb29zZSBlbmQsIHRha2VzIHNuYXBzaG90cywgZXRjLlxyXG5cclxuICAgICAgICByZW5kZXJlci5wb3N0UmVuZGVyKCk7XHJcblxyXG4gICAgICAgIC8vICBUaGUgZmluYWwgZXZlbnQgYmVmb3JlIHRoZSBzdGVwIHJlcGVhdHMuIFlvdXIgbGFzdCBjaGFuY2UgdG8gZG8gYW55dGhpbmcgdG8gdGhlIGNhbnZhcyBiZWZvcmUgaXQgYWxsIHN0YXJ0cyBhZ2Fpbi5cclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoRXZlbnRzLlBPU1RfUkVOREVSLCByZW5kZXJlciwgdGltZSwgZGVsdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBHYW1lIFN0ZXAgZm9yIHRoZSBIRUFETEVTUyByZW5kZXJlciBvbmx5LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBtYWluIEdhbWUgU3RlcC4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFRpbWUgU3RlcCwgb25jZSBwZXIgYnJvd3NlciBmcmFtZSAodHlwaWNhbGx5IGFzIGEgcmVzdWx0IG9mXHJcbiAgICAgKiBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgU2V0IFRpbWVvdXQgb24gdmVyeSBvbGQgYnJvd3NlcnMuKVxyXG4gICAgICpcclxuICAgICAqIFRoZSBzdGVwIHdpbGwgdXBkYXRlIHRoZSBnbG9iYWwgbWFuYWdlcnMgZmlyc3QsIHRoZW4gcHJvY2VlZCB0byB1cGRhdGUgZWFjaCBTY2VuZSBpbiB0dXJuLCB2aWEgdGhlIFNjZW5lIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBwcm9jZXNzIGVtaXRzIGBwcmVyZW5kZXJgIGFuZCBgcG9zdHJlbmRlcmAgZXZlbnRzLCBldmVuIHRob3VnaCBub3RoaW5nIGFjdHVhbGx5IGRpc3BsYXlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWUjaGVhZGxlc3NTdGVwXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWUjUFJFX1JFTkRFUlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lI1BPU1RfUkVOREVSXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgaGVhZGxlc3NTdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0Rlc3Ryb3kpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5EZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5ldmVudHM7XHJcblxyXG4gICAgICAgIC8vICBHbG9iYWwgTWFuYWdlcnNcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoRXZlbnRzLlBSRV9TVEVQLCB0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5lbWl0KEV2ZW50cy5TVEVQLCB0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIC8vICBTY2VuZXNcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS51cGRhdGUodGltZSwgZGVsdGEpO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuUE9TVF9TVEVQLCB0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIC8vICBSZW5kZXJcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoRXZlbnRzLlBSRV9SRU5ERVIpO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuUE9TVF9SRU5ERVIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBWaXNpYmlsaXR5IEhhbmRsZXIuXHJcbiAgICAgKiBUaGlzIHdpbGwgcGF1c2UgdGhlIG1haW4gbG9vcCBhbmQgdGhlbiBlbWl0IGEgcGF1c2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZSNvbkhpZGRlblxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Db3JlLkV2ZW50cyNQQVVTRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9uSGlkZGVuOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubG9vcC5wYXVzZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5QQVVTRSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFZpc2liaWxpdHkgSGFuZGxlci5cclxuICAgICAqIFRoaXMgd2lsbCByZXN1bWUgdGhlIG1haW4gbG9vcCBhbmQgdGhlbiBlbWl0IGEgcmVzdW1lIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWUjb25WaXNpYmxlXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI1JFU1VNRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9uVmlzaWJsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvb3AucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlJFU1VNRSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFZpc2liaWxpdHkgSGFuZGxlci5cclxuICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIG1haW4gbG9vcCBpbnRvIGEgJ2JsdXJyZWQnIHN0YXRlLCB3aGljaCBwYXVzZXMgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZSNvbkJsdXJcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvbkJsdXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5oYXNGb2N1cyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmxvb3AuYmx1cigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBWaXNpYmlsaXR5IEhhbmRsZXIuXHJcbiAgICAgKiBUaGlzIHdpbGwgc2V0IHRoZSBtYWluIGxvb3AgaW50byBhICdmb2N1c2VkJyBzdGF0ZSwgd2hpY2ggcmVzdW1lcyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lI29uRm9jdXNcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaGFzRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmxvb3AuZm9jdXMoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGdhbWUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiB0aGUgZ2FtZSBzdGFydHMgcnVubmluZywgdGhlIGZyYW1lIGlzIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIFNldCBUaW1lb3V0LCBmaXJlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lI2dldEZyYW1lXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBnYW1lIGZyYW1lLlxyXG4gICAgICovXHJcbiAgICBnZXRGcmFtZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb29wLmZyYW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRpbWUgdGhhdCB0aGUgY3VycmVudCBnYW1lIHN0ZXAgc3RhcnRlZCBhdCwgYXMgYmFzZWQgb24gYHBlcmZvcm1hbmNlLm5vd2AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZSNnZXRUaW1lXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBnYW1lIHRpbWVzdGFtcC5cclxuICAgICAqL1xyXG4gICAgZ2V0VGltZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb29wLm5vdztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGFncyB0aGlzIEdhbWUgaW5zdGFuY2UgYXMgbmVlZGluZyB0byBiZSBkZXN0cm95ZWQgb24gdGhlIF9uZXh0IGZyYW1lXywgbWFraW5nIHRoaXMgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBJdCB3aWxsIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgZnJhbWUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlbiBjYWxsIGBydW5EZXN0cm95YCBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSBuZWVkIHRvIHJlYWN0IHRvIHRoZSBnYW1lcyBldmVudHVhbCBkZXN0cnVjdGlvbiwgbGlzdGVuIGZvciB0aGUgYERFU1RST1lgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSAqKmRvIG5vdCoqIG5lZWQgdG8gcnVuIFBoYXNlciBhZ2FpbiBvbiB0aGUgc2FtZSB3ZWIgcGFnZSB5b3UgY2FuIHNldCB0aGUgYG5vUmV0dXJuYCBhcmd1bWVudCB0byBgdHJ1ZWAgYW5kIGl0IHdpbGwgZnJlZS11cFxyXG4gICAgICogbWVtb3J5IGJlaW5nIGhlbGQgYnkgdGhlIGNvcmUgUGhhc2VyIHBsdWdpbnMuIElmIHlvdSBkbyBuZWVkIHRvIGNyZWF0ZSBhbm90aGVyIGdhbWUgaW5zdGFuY2Ugb24gdGhlIHNhbWUgcGFnZSwgbGVhdmUgdGhpcyBhcyBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWUjZGVzdHJveVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Db3JlLkV2ZW50cyNERVNUUk9ZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbW92ZUNhbnZhcyAtIFNldCB0byBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdGhlIHBhcmVudCBjYW52YXMgZWxlbWVudCByZW1vdmVkIGZyb20gdGhlIERPTSwgb3IgYGZhbHNlYCB0byBsZWF2ZSBpdCBpbiBwbGFjZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vUmV0dXJuPWZhbHNlXSAtIElmIGB0cnVlYCBhbGwgdGhlIGNvcmUgUGhhc2VyIHBsdWdpbnMgYXJlIGRlc3Ryb3llZC4gWW91IGNhbm5vdCBjcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBvZiBQaGFzZXIgb24gdGhlIHNhbWUgd2ViIHBhZ2UgaWYgeW91IGRvIHRoaXMuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIChyZW1vdmVDYW52YXMsIG5vUmV0dXJuKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChub1JldHVybiA9PT0gdW5kZWZpbmVkKSB7IG5vUmV0dXJuID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRGVzdHJveSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMucmVtb3ZlQ2FudmFzID0gcmVtb3ZlQ2FudmFzO1xyXG4gICAgICAgIHRoaXMubm9SZXR1cm4gPSBub1JldHVybjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIFBoYXNlci5HYW1lIGluc3RhbmNlLCBhbGwgZ2xvYmFsIHN5c3RlbXMsIGFsbCBzdWItc3lzdGVtcyBhbmQgYWxsIFNjZW5lcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lI3J1bkRlc3Ryb3lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgcnVuRGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuREVTVFJPWSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlQ2FudmFzICYmIHRoaXMuY2FudmFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUodGhpcy5jYW52YXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzLnBhcmVudE5vZGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kb21Db250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRvbUNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tQ29udGFpbmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9vcC5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3kgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHYW1lO1xyXG5cclxuLyoqXHJcbiAqIFwiQ29tcHV0ZXJzIGFyZSBnb29kIGF0IGZvbGxvd2luZyBpbnN0cnVjdGlvbnMsIGJ1dCBub3QgYXQgcmVhZGluZyB5b3VyIG1pbmQuXCIgLSBEb25hbGQgS251dGhcclxuICovXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gcmVxdWlyZSgnLi4vZG9tL1JlcXVlc3RBbmltYXRpb25GcmFtZScpO1xyXG5cclxuLy8gaHR0cDovL3d3dy50ZXN0dWZvLmNvbS8jdGVzdD1hbmltYXRpb24tdGltZS1ncmFwaFxyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIGNvcmUgcnVubmVyIGNsYXNzIHRoYXQgUGhhc2VyIHVzZXMgdG8gaGFuZGxlIHRoZSBnYW1lIGxvb3AuIEl0IGNhbiB1c2UgZWl0aGVyIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLFxyXG4gKiBvciBTZXRUaW1lb3V0LCBiYXNlZCBvbiBicm93c2VyIHN1cHBvcnQgYW5kIGNvbmZpZyBzZXR0aW5ncywgdG8gY3JlYXRlIGEgY29udGludW91cyBsb29wIHdpdGhpbiB0aGUgYnJvd3Nlci5cclxuICogXHJcbiAqIEVhY2ggdGltZSB0aGUgbG9vcCBmaXJlcywgYFRpbWVTdGVwLnN0ZXBgIGlzIGNhbGxlZCBhbmQgdGhpcyBpcyB0aGVuIHBhc3NlZCBvbnRvIHRoZSBjb3JlIEdhbWUgdXBkYXRlIGxvb3AsXHJcbiAqIGl0IGlzIHRoZSBjb3JlIGhlYXJ0YmVhdCBvZiB5b3VyIGdhbWUuIEl0IHdpbGwgZmlyZSBhcyBvZnRlbiBhcyBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nXHJcbiAqIG9uIHRoZSB0YXJnZXQgZGV2aWNlLlxyXG4gKiBcclxuICogTm90ZSB0aGF0IHRoZXJlIGFyZSBsb3RzIG9mIHNpdHVhdGlvbnMgd2hlcmUgYSBicm93c2VyIHdpbGwgc3RvcCB1cGRhdGluZyB5b3VyIGdhbWUuIFN1Y2ggYXMgaWYgdGhlIHBsYXllclxyXG4gKiBzd2l0Y2hlcyB0YWJzLCBvciBjb3ZlcnMgdXAgdGhlIGJyb3dzZXIgd2luZG93IHdpdGggYW5vdGhlciBhcHBsaWNhdGlvbi4gSW4gdGhlc2UgY2FzZXMsIHRoZSAnaGVhcnRiZWF0J1xyXG4gKiBvZiB5b3VyIGdhbWUgd2lsbCBwYXVzZSwgYW5kIG9ubHkgcmVzdW1lIHdoZW4gZm9jdXMgaXMgcmV0dXJuZWQgdG8gaXQgYnkgdGhlIHBsYXllci4gVGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkXHJcbiAqIHRoaXMgc2l0dWF0aW9uLCBhbGwgeW91IGNhbiBkbyBpcyB1c2UgdGhlIHZpc2liaWxpdHkgZXZlbnRzIHRoZSBicm93c2VyLCBhbmQgUGhhc2VyLCBwcm92aWRlIHRvIGRldGVjdCB3aGVuXHJcbiAqIGl0IGhhcyBoYXBwZW5lZCBhbmQgdGhlbiBncmFjZWZ1bGx5IHJlY292ZXIuXHJcbiAqXHJcbiAqIEBjbGFzcyBUaW1lU3RlcFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkNvcmVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlIHRoYXQgb3ducyB0aGlzIFRpbWUgU3RlcC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ29yZS5GUFNDb25maWd9IGNvbmZpZ1xyXG4gKi9cclxudmFyIFRpbWVTdGVwID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRpbWVTdGVwIChnYW1lLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBnYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgRE9NIEV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNyYWZcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkRPTS5SZXF1ZXN0QW5pbWF0aW9uRnJhbWV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yYWYgPSBuZXcgUmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZmxhZyB0aGF0IGlzIHNldCBvbmNlIHRoZSBUaW1lU3RlcCBoYXMgc3RhcnRlZCBydW5uaW5nIGFuZCB0b2dnbGVkIHdoZW4gaXQgc3RvcHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNzdGFydGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIHRoYXQgaXMgc2V0IG9uY2UgdGhlIFRpbWVTdGVwIGhhcyBzdGFydGVkIHJ1bm5pbmcgYW5kIHRvZ2dsZWQgd2hlbiBpdCBzdG9wcy5cclxuICAgICAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgdmFsdWUgYW5kIGBzdGFydGVkYCBpcyB0aGF0IGBydW5uaW5nYCBpcyB0b2dnbGVkIHdoZW5cclxuICAgICAgICAgKiB0aGUgVGltZVN0ZXAgaXMgc2VudCB0byBzbGVlcCwgd2hlcmUtYXMgYHN0YXJ0ZWRgIHJlbWFpbnMgYHRydWVgLCBvbmx5IGNoYW5naW5nIGlmXHJcbiAgICAgICAgICogdGhlIFRpbWVTdGVwIGlzIGFjdHVhbGx5IHN0b3BwZWQsIG5vdCBqdXN0IHBhdXNlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI3J1bm5pbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSBmcHMgcmF0ZSB5b3Ugd2FudCB0aGUgVGltZSBTdGVwIHRvIHJ1biBhdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI21pbkZwc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1pbkZwcyA9IEdldFZhbHVlKGNvbmZpZywgJ21pbicsIDUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGFyZ2V0IGZwcyByYXRlIGZvciB0aGUgVGltZSBTdGVwIHRvIHJ1biBhdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIG5vdCBhY3R1YWxseSBjaGFuZ2UgdGhlIHNwZWVkIGF0IHdoaWNoIHRoZSBicm93c2VyIHJ1bnMsIHRoYXQgaXMgYmV5b25kXHJcbiAgICAgICAgICogdGhlIGNvbnRyb2wgb2YgUGhhc2VyLiBJbnN0ZWFkLCBpdCBhbGxvd3MgeW91IHRvIGRldGVybWluZSBwZXJmb3JtYW5jZSBpc3N1ZXMgYW5kIGlmIHRoZSBUaW1lIFN0ZXBcclxuICAgICAgICAgKiBpcyBzcGlyYWxpbmcgb3V0IG9mIGNvbnRyb2wuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCN0YXJnZXRGcHNcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCA2MFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFyZ2V0RnBzID0gR2V0VmFsdWUoY29uZmlnLCAndGFyZ2V0JywgNjApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluRnBzIHZhbHVlIGluIG1zLlxyXG4gICAgICAgICAqIERlZmF1bHRzIHRvIDIwMG1zIGJldHdlZW4gZnJhbWVzIChpLmUuIHN1cGVyIHNsb3chKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjX21pblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9taW4gPSAxMDAwIC8gdGhpcy5taW5GcHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0YXJnZXRGcHMgdmFsdWUgaW4gbXMuXHJcbiAgICAgICAgICogRGVmYXVsdHMgdG8gMTYuNjZtcyBiZXR3ZWVuIGZyYW1lcyAoaS5lLiBub3JtYWwpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNfdGFyZ2V0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RhcmdldCA9IDEwMDAgLyB0aGlzLnRhcmdldEZwcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXhwb25lbnRpYWwgbW92aW5nIGF2ZXJhZ2Ugb2YgdGhlIGZyYW1lcyBwZXIgc2Vjb25kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjYWN0dWFsRnBzXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgNjBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdHVhbEZwcyA9IHRoaXMudGFyZ2V0RnBzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgbmV4dCBmcHMgcmF0ZSB1cGRhdGUgd2lsbCB0YWtlIHBsYWNlLlxyXG4gICAgICAgICAqIFdoZW4gYW4gZnBzIHVwZGF0ZSBoYXBwZW5zLCB0aGUgYGZyYW1lc1RoaXNTZWNvbmRgIHZhbHVlIGlzIHJlc2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjbmV4dEZwc1VwZGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5leHRGcHNVcGRhdGUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBwcm9jZXNzZWQgdGhpcyBzZWNvbmQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNmcmFtZXNUaGlzU2Vjb25kXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVzVGhpc1NlY29uZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBlYWNoIHRpbWUgdGhlIFRpbWUgU3RlcCBzdGVwcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI2NhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5Db3JlLlRpbWVTdGVwQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQGRlZmF1bHQgTk9PUFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBZb3UgY2FuIGZvcmNlIHRoZSBUaW1lIFN0ZXAgdG8gdXNlIFNldCBUaW1lb3V0IGluc3RlYWQgb2YgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgYnkgc2V0dGluZ1xyXG4gICAgICAgICAqIHRoZSBgZm9yY2VTZXRUaW1lT3V0YCBwcm9wZXJ0eSB0byBgdHJ1ZWAgaW4gdGhlIEdhbWUgQ29uZmlndXJhdGlvbiBvYmplY3QuIEl0IGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHJ1bi10aW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjZm9yY2VTZXRUaW1lT3V0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZvcmNlU2V0VGltZU91dCA9IEdldFZhbHVlKGNvbmZpZywgJ2ZvcmNlU2V0VGltZU91dCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUsIGNhbGN1bGF0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHN0ZXAsIGFzIHNtb290aGVkIGJ5IHRoZSBkZWx0YSB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI3RpbWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgZ2FtZSBzdGFydGVkIHJ1bm5pbmcuIFRoaXMgdmFsdWUgaXMgYWRqdXN0ZWQgaWYgdGhlIGdhbWUgaXMgdGhlblxyXG4gICAgICAgICAqIHBhdXNlZCBhbmQgcmVzdW1lcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI3N0YXJ0VGltZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUsIGFzIHJldHVybmVkIGJ5IGBwZXJmb3JtYW5jZS5ub3dgIG9mIHRoZSBwcmV2aW91cyBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjbGFzdFRpbWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxhc3RUaW1lID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgZnJhbWUgdGhlIGdhbWUgaXMgb24uIFRoaXMgY291bnRlciBpcyBpbmNyZW1lbnRlZCBvbmNlIGV2ZXJ5IGdhbWUgc3RlcCwgcmVnYXJkbGVzcyBvZiBob3cgbXVjaFxyXG4gICAgICAgICAqIHRpbWUgaGFzIHBhc3NlZCBhbmQgaXMgdW5hZmZlY3RlZCBieSBkZWx0YSBzbW9vdGhpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNmcmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhlIGJyb3dzZXIgY3VycmVudGx5IGNvbnNpZGVyZWQgaW4gZm9jdXMgYnkgdGhlIFBhZ2UgVmlzaWJpbGl0eSBBUEk/XHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBzZXQgaW4gdGhlIGBibHVyYCBtZXRob2QsIHdoaWNoIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBHYW1lIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjaW5Gb2N1c1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmluRm9jdXMgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBnYW1lIGJlY2FtZSBwYXVzZWQsIGFzIGRldGVybWluZWQgYnkgdGhlIFBhZ2UgVmlzaWJpbGl0eSBBUEkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNfcGF1c2VUaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wYXVzZVRpbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBjb3VudGVyIHRvIGFsbG93IGZvciB0aGUgYnJvd3NlciAnY29vbGluZyBkb3duJyBhZnRlciBjb21pbmcgYmFjayBpbnRvIGZvY3VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjX2Nvb2xEb3duXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29vbERvd24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIHNpbmNlIHRoZSBsYXN0IGdhbWUgc3RlcC4gVGhpcyBpcyBhIGNsYW1wZWQgYW5kIHNtb290aGVkIGF2ZXJhZ2UgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNkZWx0YVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbHRhID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgaW5kZXggb2YgdGhlIGRlbHRhIGhpc3RvcnkgcG9zaXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNkZWx0YUluZGV4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVsdGFJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGFycmF5IGhvbGRpbmcgdGhlIHByZXZpb3VzIGRlbHRhIHZhbHVlcywgdXNlZCBmb3IgZGVsdGEgc21vb3RoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkNvcmUuVGltZVN0ZXAjZGVsdGFIaXN0b3J5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbHRhSGlzdG9yeSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGVsdGEgdmFsdWVzIHRoYXQgYXJlIHJldGFpbmVkIGluIG9yZGVyIHRvIGNhbGN1bGF0ZSBhIHNtb290aGVkIG1vdmluZyBhdmVyYWdlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIEdhbWUgQ29uZmlnIHZpYSB0aGUgYGZwcy5kZWx0YUhpc3RvcnlgIHByb3BlcnR5LiBUaGUgZGVmYXVsdCBpcyAxMC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI2RlbHRhU21vb3RoaW5nTWF4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbHRhU21vb3RoaW5nTWF4ID0gR2V0VmFsdWUoY29uZmlnLCAnZGVsdGFIaXN0b3J5JywgMTApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHRoZSBjb29sZG93biBpcyBzZXQgdG8gYWZ0ZXIgdGhlIGJyb3dzZXIgcGFuaWNzIG92ZXIgdGhlIEZQUyByYXRlLCB1c3VhbGx5XHJcbiAgICAgICAgICogYXMgYSByZXN1bHQgb2Ygc3dpdGNoaW5nIHRhYnMgYW5kIHJlZ2FpbmluZyBmb2N1cy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBHYW1lIENvbmZpZyB2aWEgdGhlIGBmcHMucGFuaWNNYXhgIHByb3BlcnR5LiBUaGUgZGVmYXVsdCBpcyAxMjAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ29yZS5UaW1lU3RlcCNwYW5pY01heFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDEyMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFuaWNNYXggPSBHZXRWYWx1ZShjb25maWcsICdwYW5pY01heCcsIDEyMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhY3R1YWwgZWxhcHNlZCB0aW1lIGluIG1zIGJldHdlZW4gb25lIHVwZGF0ZSBhbmQgdGhlIG5leHQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVW5saWtlIHdpdGggYGRlbHRhYCwgbm8gc21vb3RoaW5nLCBjYXBwaW5nLCBvciBhdmVyYWdpbmcgaXMgYXBwbGllZCB0byB0aGlzIHZhbHVlLlxyXG4gICAgICAgICAqIFNvIHBsZWFzZSBiZSBjYXJlZnVsIHdoZW4gdXNpbmcgdGhpcyB2YWx1ZSBpbiBtYXRoIGNhbGN1bGF0aW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI3Jhd0RlbHRhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yYXdEZWx0YSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lLCBhcyByZXR1cm5lZCBieSBgcGVyZm9ybWFuY2Uubm93YCBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGUgY3VycmVudCBzdGVwLlxyXG4gICAgICAgICAqIFRoaXMgY2FuIGRpZmZlciBmcm9tIHRoZSBgdGltZWAgdmFsdWUgaW4gdGhhdCBpdCBpc24ndCBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBkZWx0YSB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI25vd1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5vdyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFwcGx5IHNtb290aGluZyB0byB0aGUgZGVsdGEgdmFsdWUgdXNlZCB3aXRoaW4gUGhhc2VycyBpbnRlcm5hbCBjYWxjdWxhdGlvbnM/XHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgR2FtZSBDb25maWcgdmlhIHRoZSBgZnBzLnNtb290aFN0ZXBgIHByb3BlcnR5LiBUaGUgZGVmYXVsdCBpcyBgdHJ1ZWAuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogU21vb3RoaW5nIGhlbHBzIHNldHRsZSBkb3duIHRoZSBkZWx0YSB2YWx1ZXMgYWZ0ZXIgYnJvd3NlciB0YWIgc3dpdGNoZXMsIG9yIG90aGVyIHNpdHVhdGlvbnNcclxuICAgICAgICAgKiB3aGljaCBjb3VsZCBjYXVzZSBzaWduaWZpY2FudCBkZWx0YSBzcGlrZXMgb3IgZGlwcy4gQnkgZGVmYXVsdCBpdCBoYXMgYmVlbiBlbmFibGVkIGluIFBoYXNlciAzXHJcbiAgICAgICAgICogc2luY2UgdGhlIGZpcnN0IHZlcnNpb24sIGJ1dCBpcyBub3cgZXhwb3NlZCB1bmRlciB0aGlzIHByb3BlcnR5IChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZ2FtZSBjb25maWdcclxuICAgICAgICAgKiBgc21vb3RoU3RlcGAgdmFsdWUpLCB0byBhbGxvdyB5b3UgdG8gZWFzaWx5IGRpc2FibGUgaXQsIHNob3VsZCB5b3UgcmVxdWlyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Db3JlLlRpbWVTdGVwI3Ntb290aFN0ZXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zbW9vdGhTdGVwID0gR2V0VmFsdWUoY29uZmlnLCAnc21vb3RoU3RlcCcsIHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSB0aGUgR2FtZSBpbnN0YW5jZSB3aGVuIHRoZSBET00gd2luZG93Lm9uQmx1ciBldmVudCB0cmlnZ2Vycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Db3JlLlRpbWVTdGVwI2JsdXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBibHVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5Gb2N1cyA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSB0aGUgR2FtZSBpbnN0YW5jZSB3aGVuIHRoZSBET00gd2luZG93Lm9uRm9jdXMgZXZlbnQgdHJpZ2dlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNmb2N1c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGZvY3VzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5Gb2N1cyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXREZWx0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB2aXNpYmlsaXR5IEFQSSBzYXlzIHRoZSBnYW1lIGlzICdoaWRkZW4nICh0YWIgc3dpdGNoIG91dCBvZiB2aWV3LCBldGMpXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNwYXVzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BhdXNlVGltZSA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlzaWJpbGl0eSBBUEkgc2F5cyB0aGUgZ2FtZSBpcyAndmlzaWJsZScgYWdhaW4gKHRhYiBzd2l0Y2ggYmFjayBpbnRvIHZpZXcsIGV0YylcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Db3JlLlRpbWVTdGVwI3Jlc3VtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0RGVsdGEoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydFRpbWUgKz0gdGhpcy50aW1lIC0gdGhpcy5fcGF1c2VUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgdGltZSwgbGFzdFRpbWUsIGZwcyBhdmVyYWdlcyBhbmQgZGVsdGEgaGlzdG9yeS5cclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYSBicm93c2VyIHNsZWVwcyB0aGVtIHJlc3VtZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNyZXNldERlbHRhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmVzZXREZWx0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbm93ID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWUgPSBub3c7XHJcbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IG5vdztcclxuICAgICAgICB0aGlzLm5leHRGcHNVcGRhdGUgPSBub3cgKyAxMDAwO1xyXG4gICAgICAgIHRoaXMuZnJhbWVzVGhpc1NlY29uZCA9IDA7XHJcblxyXG4gICAgICAgIC8vICBQcmUtcG9wdWxhdGUgc21vb3RoaW5nIGFycmF5XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZWx0YVNtb290aGluZ01heDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kZWx0YUhpc3RvcnlbaV0gPSBNYXRoLm1pbih0aGlzLl90YXJnZXQsIHRoaXMuZGVsdGFIaXN0b3J5W2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGVsdGEgPSAwO1xyXG4gICAgICAgIHRoaXMuZGVsdGFJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuX2Nvb2xEb3duID0gdGhpcy5wYW5pY01heDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIFRpbWUgU3RlcCBydW5uaW5nLCBpZiBpdCBpcyBub3QgYWxyZWFkeSBkb2luZyBzby5cclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBHYW1lIEJvb3QgcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Db3JlLlRpbWVTdGVwI3N0YXJ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Db3JlLlRpbWVTdGVwQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgZWFjaCB0aW1lIHRoZSBUaW1lIFN0ZXAgc3RlcHMuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGVsdGFTbW9vdGhpbmdNYXg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsdGFIaXN0b3J5W2ldID0gdGhpcy5fdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNldERlbHRhKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG4gICAgICAgIHRoaXMucmFmLnN0YXJ0KHRoaXMuc3RlcC5iaW5kKHRoaXMpLCB0aGlzLmZvcmNlU2V0VGltZU91dCwgdGhpcy5fdGFyZ2V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBzdGVwIG1ldGhvZC4gVGhpcyBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBicm93c2VyIHVwZGF0ZXMsIGVpdGhlciBieSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSxcclxuICAgICAqIG9yIGJ5IFNldCBUaW1lb3V0LiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY2FsY3VsYXRpbmcgdGhlIGRlbHRhIHZhbHVlcywgZnJhbWUgdG90YWxzLCBjb29sIGRvd24gaGlzdG9yeSBhbmQgbW9yZS5cclxuICAgICAqIFlvdSBnZW5lcmFsbHkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNzdGVwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RlcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgQmVjYXVzZSB0aGUgdGltZXN0YW1wIHBhc3NlZCBpbiBmcm9tIHJhZiByZXByZXNlbnRzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gdGhyZWFkIGZyYW1lIHRoYXQgd2XigJlyZSBjdXJyZW50bHkgaW4sXHJcbiAgICAgICAgLy8gIG5vdCB0aGUgYWN0dWFsIHRpbWUgbm93LCBhbmQgYXMgd2Ugd2FudCB0byBjb21wYXJlIHRoaXMgdGltZSB2YWx1ZSBhZ2FpbnN0IEV2ZW50IHRpbWVTdGFtcHMgYW5kIHRoZSBsaWtlLCB3ZSBuZWVkIGFcclxuICAgICAgICAvLyAgbW9yZSBhY2N1cmF0ZSBvbmU6XHJcblxyXG4gICAgICAgIHZhciB0aW1lID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgICAgICB0aGlzLm5vdyA9IHRpbWU7XHJcblxyXG4gICAgICAgIHZhciBiZWZvcmUgPSB0aW1lIC0gdGhpcy5sYXN0VGltZTtcclxuXHJcbiAgICAgICAgaWYgKGJlZm9yZSA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQmVjYXVzZSwgQ2hyb21lLlxyXG4gICAgICAgICAgICBiZWZvcmUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yYXdEZWx0YSA9IGJlZm9yZTtcclxuXHJcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuZGVsdGFJbmRleDtcclxuICAgICAgICB2YXIgaGlzdG9yeSA9IHRoaXMuZGVsdGFIaXN0b3J5O1xyXG4gICAgICAgIHZhciBtYXggPSB0aGlzLmRlbHRhU21vb3RoaW5nTWF4O1xyXG5cclxuICAgICAgICAvLyAgZGVsdGEgdGltZSAodGltZSBpcyBpbiBtcylcclxuICAgICAgICB2YXIgZHQgPSBiZWZvcmU7XHJcblxyXG4gICAgICAgIC8vICBEZWx0YSBBdmVyYWdlXHJcbiAgICAgICAgdmFyIGF2ZyA9IGJlZm9yZTtcclxuXHJcbiAgICAgICAgLy8gIFdoZW4gYSBicm93c2VyIHN3aXRjaGVzIHRhYiwgdGhlbiBjb21lcyBiYWNrIGFnYWluLCBpdCB0YWtlcyBhcm91bmQgMTAgZnJhbWVzIGJlZm9yZVxyXG4gICAgICAgIC8vICB0aGUgZGVsdGEgdGltZSBzZXR0bGVzIGRvd24gc28gd2UgZW1wbG95IGEgJ2Nvb2xpbmcgZG93bicgcGVyaW9kIGJlZm9yZSB3ZSBzdGFydFxyXG4gICAgICAgIC8vICB0cnVzdGluZyB0aGUgZGVsdGEgdmFsdWVzIGFnYWluLCB0byBhdm9pZCBzcGlrZXMgZmxvb2RpbmcgdGhyb3VnaCBvdXIgZGVsdGEgYXZlcmFnZVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zbW9vdGhTdGVwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Nvb2xEb3duID4gMCB8fCAhdGhpcy5pbkZvY3VzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb29sRG93bi0tO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBkdCA9IE1hdGgubWluKGR0LCB0aGlzLl90YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKGR0ID4gdGhpcy5fbWluKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgUHJvYmFibHkgc3VwZXIgYmFkIHN0YXJ0IHRpbWUgb3IgYnJvd3NlciB0YWIgY29udGV4dCBsb3NzLFxyXG4gICAgICAgICAgICAgICAgLy8gIHNvIHVzZSB0aGUgbGFzdCAnc2FuZScgZHQgdmFsdWVcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgZHQgPSBoaXN0b3J5W2lkeF07XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8vICBDbGFtcCBkZWx0YSB0byBtaW4gKGluIGNhc2UgaGlzdG9yeSBoYXMgYmVjb21lIGNvcnJ1cHRlZCBzb21laG93KVxyXG4gICAgICAgICAgICAgICAgZHQgPSBNYXRoLm1pbihkdCwgdGhpcy5fbWluKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIC8vICBTbW9vdGggb3V0IHRoZSBkZWx0YSBvdmVyIHRoZSBwcmV2aW91cyBYIGZyYW1lc1xyXG4gICAgXHJcbiAgICAgICAgICAgIC8vICBhZGQgdGhlIGRlbHRhIHRvIHRoZSBzbW9vdGhpbmcgYXJyYXlcclxuICAgICAgICAgICAgaGlzdG9yeVtpZHhdID0gZHQ7XHJcbiAgICBcclxuICAgICAgICAgICAgLy8gIGFkanVzdHMgdGhlIGRlbHRhIGhpc3RvcnkgYXJyYXkgaW5kZXggYmFzZWQgb24gdGhlIHNtb290aGluZyBjb3VudFxyXG4gICAgICAgICAgICAvLyAgdGhpcyBzdG9wcyB0aGUgYXJyYXkgZ3Jvd2luZyBiZXlvbmQgdGhlIHNpemUgb2YgZGVsdGFTbW9vdGhpbmdNYXhcclxuICAgICAgICAgICAgdGhpcy5kZWx0YUluZGV4Kys7XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVsdGFJbmRleCA+IG1heClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWx0YUluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIC8vICBMb29wIHRoZSBoaXN0b3J5IGFycmF5LCBhZGRpbmcgdGhlIGRlbHRhIHZhbHVlcyB0b2dldGhlclxyXG4gICAgICAgICAgICBhdmcgPSAwO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF4OyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF2ZyArPSBoaXN0b3J5W2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgLy8gIFRoZW4gZGl2aWRlIGJ5IHRoZSBhcnJheSBsZW5ndGggdG8gZ2V0IHRoZSBhdmVyYWdlIGRlbHRhXHJcbiAgICAgICAgICAgIGF2ZyAvPSBtYXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgU2V0IGFzIHRoZSB3b3JsZCBkZWx0YSB2YWx1ZVxyXG4gICAgICAgIHRoaXMuZGVsdGEgPSBhdmc7XHJcblxyXG4gICAgICAgIC8vICBSZWFsLXdvcmxkIHRpbWVyIGFkdmFuY2VcclxuICAgICAgICB0aGlzLnRpbWUgKz0gdGhpcy5yYXdEZWx0YTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBlc3RpbWF0ZSBvZiB0aGUgZnJhbWUgcmF0ZSwgYGZwc2AuIEV2ZXJ5IHNlY29uZCwgdGhlIG51bWJlclxyXG4gICAgICAgIC8vIG9mIGZyYW1lcyB0aGF0IG9jY3VycmVkIGluIHRoYXQgc2Vjb25kIGFyZSBpbmNsdWRlZCBpbiBhbiBleHBvbmVudGlhbFxyXG4gICAgICAgIC8vIG1vdmluZyBhdmVyYWdlIG9mIGFsbCBmcmFtZXMgcGVyIHNlY29uZCwgd2l0aCBhbiBhbHBoYSBvZiAwLjI1LiBUaGlzXHJcbiAgICAgICAgLy8gbWVhbnMgdGhhdCBtb3JlIHJlY2VudCBzZWNvbmRzIGFmZmVjdCB0aGUgZXN0aW1hdGVkIGZyYW1lIHJhdGUgbW9yZSB0aGFuXHJcbiAgICAgICAgLy8gb2xkZXIgc2Vjb25kcy5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdoZW4gYSBicm93c2VyIHdpbmRvdyBpcyBOT1QgbWluaW1pemVkLCBidXQgaXMgY292ZXJlZCB1cCAoaS5lLiB5b3UncmUgdXNpbmdcclxuICAgICAgICAvLyBhbm90aGVyIGFwcCB3aGljaCBoYXMgc3Bhd25lZCBhIHdpbmRvdyBvdmVyIHRoZSB0b3Agb2YgdGhlIGJyb3dzZXIpLCB0aGVuIGl0XHJcbiAgICAgICAgLy8gd2lsbCBzdGFydCB0byB0aHJvdHRsZSB0aGUgcmFmIGNhbGxiYWNrIHRpbWUuIEl0IHdhaXRzIGZvciBhIHdoaWxlLCBhbmQgdGhlblxyXG4gICAgICAgIC8vIHN0YXJ0cyB0byBkcm9wIHRoZSBmcmFtZSByYXRlIGF0IDEgZnJhbWUgcGVyIHNlY29uZCB1bnRpbCBpdCdzIGRvd24gdG8ganVzdCBvdmVyIDFmcHMuXHJcbiAgICAgICAgLy8gU28gaWYgdGhlIGdhbWUgd2FzIHJ1bm5pbmcgYXQgNjBmcHMsIGFuZCB0aGUgcGxheWVyIG9wZW5zIGEgbmV3IHdpbmRvdywgdGhlblxyXG4gICAgICAgIC8vIGFmdGVyIDYwIHNlY29uZHMgKCsgdGhlICdidWZmZXIgdGltZScpIGl0J2xsIGJlIGRvd24gdG8gMWZwcywgc28gcmFmaW4nZyBhdCAxSHouXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBXaGVuIHRoZXkgbWFrZSB0aGUgZ2FtZSB2aXNpYmxlIGFnYWluLCB0aGUgZnJhbWUgcmF0ZSBpcyBpbmNyZWFzZWQgYXQgYSByYXRlIG9mXHJcbiAgICAgICAgLy8gYXBwcm94LiA4ZnBzLCBiYWNrIHVwIHRvIDYwZnBzIChvciB0aGUgbWF4IGl0IGNhbiBvYnRhaW4pXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBkZXRlcm1pbmUgaWYgdGhpcyBkcm9wIGluIGZyYW1lIHJhdGUgaXMgYmVjYXVzZSB0aGVcclxuICAgICAgICAvLyBicm93c2VyIGlzIHRocm90dGxpbmcgcmFmLCBvciBiZWNhdXNlIHRoZSBnYW1lIGlzIHN0cnVnZ2xpbmcgd2l0aCBwZXJmb3JtYW5jZVxyXG4gICAgICAgIC8vIGJlY2F1c2UgeW91J3JlIGFza2luZyBpdCB0byBkbyB0b28gbXVjaCBvbiB0aGUgZGV2aWNlLlxyXG5cclxuICAgICAgICBpZiAodGltZSA+IHRoaXMubmV4dEZwc1VwZGF0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDb21wdXRlIHRoZSBuZXcgZXhwb25lbnRpYWwgbW92aW5nIGF2ZXJhZ2Ugd2l0aCBhbiBhbHBoYSBvZiAwLjI1LlxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbEZwcyA9IDAuMjUgKiB0aGlzLmZyYW1lc1RoaXNTZWNvbmQgKyAwLjc1ICogdGhpcy5hY3R1YWxGcHM7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dEZwc1VwZGF0ZSA9IHRpbWUgKyAxMDAwO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lc1RoaXNTZWNvbmQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mcmFtZXNUaGlzU2Vjb25kKys7XHJcblxyXG4gICAgICAgIC8vICBJbnRlcnBvbGF0aW9uIC0gaG93IGZhciBiZXR3ZWVuIHdoYXQgaXMgZXhwZWN0ZWQgYW5kIHdoZXJlIHdlIGFyZT9cclxuICAgICAgICB2YXIgaW50ZXJwb2xhdGlvbiA9IGF2ZyAvIHRoaXMuX3RhcmdldDtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayh0aW1lLCBhdmcsIGludGVycG9sYXRpb24pO1xyXG5cclxuICAgICAgICAvLyAgU2hpZnQgdGltZSB2YWx1ZSBvdmVyXHJcbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IHRpbWU7XHJcblxyXG4gICAgICAgIHRoaXMuZnJhbWUrKztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBjYWxscyBgVGltZVN0ZXAuc3RlcGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCN0aWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdGljazogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0ZXAoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyB0aGUgVGltZVN0ZXAgdG8gc2xlZXAsIHN0b3BwaW5nIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIChvciBTZXRUaW1lb3V0KSBhbmQgdG9nZ2xpbmcgdGhlIGBydW5uaW5nYCBmbGFnIHRvIGZhbHNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNvcmUuVGltZVN0ZXAjc2xlZXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzbGVlcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yYWYuc3RvcCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdha2VzLXVwIHRoZSBUaW1lU3RlcCwgcmVzdGFydGluZyBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSAob3IgU2V0VGltZW91dCkgYW5kIHRvZ2dsaW5nIHRoZSBgcnVubmluZ2AgZmxhZyB0byB0cnVlLlxyXG4gICAgICogVGhlIGBzZWFtbGVzc2AgYXJndW1lbnQgY29udHJvbHMgaWYgdGhlIHdha2UtdXAgc2hvdWxkIGFkanVzdCB0aGUgc3RhcnQgdGltZSBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCN3YWtlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZWFtbGVzcz1mYWxzZV0gLSBBZGp1c3QgdGhlIHN0YXJ0VGltZSBiYXNlZCBvbiB0aGUgbGFzdFRpbWUgdmFsdWVzLlxyXG4gICAgICovXHJcbiAgICB3YWtlOiBmdW5jdGlvbiAoc2VhbWxlc3MpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucnVubmluZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2xlZXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2VhbWxlc3MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSArPSAtdGhpcy5sYXN0VGltZSArICh0aGlzLmxhc3RUaW1lICsgd2luZG93LnBlcmZvcm1hbmNlLm5vdygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmFmLnN0YXJ0KHRoaXMuc3RlcC5iaW5kKHRoaXMpLCB0aGlzLnVzZVJBRik7XHJcblxyXG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuc3RlcCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGR1cmF0aW9uIHdoaWNoIHRoZSBnYW1lIGhhcyBiZWVuIHJ1bm5pbmcsIGluIHNlY29uZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNnZXREdXJhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGR1cmF0aW9uIGluIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGdldER1cmF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMubGFzdFRpbWUgLSB0aGlzLnN0YXJ0VGltZSkgLyAxMDAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGR1cmF0aW9uIHdoaWNoIHRoZSBnYW1lIGhhcyBiZWVuIHJ1bm5pbmcsIGluIG1zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNvcmUuVGltZVN0ZXAjZ2V0RHVyYXRpb25NU1xyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGR1cmF0aW9uIGluIG1zLlxyXG4gICAgICovXHJcbiAgICBnZXREdXJhdGlvbk1TOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMubGFzdFRpbWUgLSB0aGlzLnN0YXJ0VGltZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIFRpbWVTdGVwIHJ1bm5pbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ29yZS5UaW1lU3RlcCNzdG9wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgVGltZVN0ZXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnJhZi5zdG9wKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBUaW1lU3RlcC4gVGhpcyB3aWxsIHN0b3AgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIHN0b3AgdGhlIHN0ZXAsIGNsZWFyIHRoZSBjYWxsYmFja3MgYW5kIG51bGxcclxuICAgICAqIGFueSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkNvcmUuVGltZVN0ZXAjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBOT09QO1xyXG5cclxuICAgICAgICB0aGlzLnJhZiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5nYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaW1lU3RlcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgVmlzaWJpbGl0eSBIYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsaXN0ZW5pbmcgb3V0IGZvciBkb2N1bWVudCBsZXZlbCB2aXNpYmlsaXR5IGNoYW5nZSBldmVudHMuXHJcbiAqIFRoaXMgaW5jbHVkZXMgYHZpc2liaWxpdHljaGFuZ2VgIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LCBhbmQgYmx1ciBhbmQgZm9jdXMgZXZlbnRzLiBJdCB0aGVuIHVzZXNcclxuICogdGhlIHByb3ZpZGVkIEV2ZW50IEVtaXR0ZXIgYW5kIGZpcmVzIHRoZSByZWxhdGVkIGV2ZW50cy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5Db3JlLlZpc2liaWxpdHlIYW5kbGVyXHJcbiAqIEBmaXJlcyBQaGFzZXIuQ29yZS5FdmVudHMjQkxVUlxyXG4gKiBAZmlyZXMgUGhhc2VyLkNvcmUuRXZlbnRzI0ZPQ1VTXHJcbiAqIEBmaXJlcyBQaGFzZXIuQ29yZS5FdmVudHMjSElEREVOXHJcbiAqIEBmaXJlcyBQaGFzZXIuQ29yZS5FdmVudHMjVklTSUJMRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIFRoZSBHYW1lIGluc3RhbmNlIHRoaXMgVmlzaWJpbGl0eSBIYW5kbGVyIGlzIHdvcmtpbmcgb24uXHJcbiAqL1xyXG52YXIgVmlzaWJpbGl0eUhhbmRsZXIgPSBmdW5jdGlvbiAoZ2FtZSlcclxue1xyXG4gICAgdmFyIGhpZGRlblZhcjtcclxuICAgIHZhciBldmVudEVtaXR0ZXIgPSBnYW1lLmV2ZW50cztcclxuXHJcbiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgaGlkZGVuVmFyID0gJ3Zpc2liaWxpdHljaGFuZ2UnO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2ZW5kb3JzID0gWyAnd2Via2l0JywgJ21veicsICdtcycgXTtcclxuXHJcbiAgICAgICAgdmVuZG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnRbcHJlZml4ICsgJ0hpZGRlbiddICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhpZGRlbiA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50W3ByZWZpeCArICdIaWRkZW4nXTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaGlkZGVuVmFyID0gcHJlZml4ICsgJ3Zpc2liaWxpdHljaGFuZ2UnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBvbkNoYW5nZSA9IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuaGlkZGVuIHx8IGV2ZW50LnR5cGUgPT09ICdwYXVzZScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuSElEREVOKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoRXZlbnRzLlZJU0lCTEUpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKGhpZGRlblZhcilcclxuICAgIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGhpZGRlblZhciwgb25DaGFuZ2UsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3cub25ibHVyID0gZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuQkxVUik7XHJcbiAgICB9O1xyXG5cclxuICAgIHdpbmRvdy5vbmZvY3VzID0gZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChFdmVudHMuRk9DVVMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyAgQXV0b21hdGljYWxseSBnaXZlIHRoZSB3aW5kb3cgZm9jdXMgdW5sZXNzIGNvbmZpZyBzYXlzIG90aGVyd2lzZVxyXG4gICAgaWYgKHdpbmRvdy5mb2N1cyAmJiBnYW1lLmNvbmZpZy5hdXRvRm9jdXMpXHJcbiAgICB7XHJcbiAgICAgICAgd2luZG93LmZvY3VzKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZpc2liaWxpdHlIYW5kbGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBCbHVyIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBHYW1lIFZpc2liaWxpdHkgSGFuZGxlciB3aGVuIHRoZSB3aW5kb3cgaW4gd2hpY2ggdGhlIEdhbWUgaW5zdGFuY2UgaXMgZW1iZWRkZWRcclxuICogZW50ZXJzIGEgYmx1cnJlZCBzdGF0ZS4gVGhlIGJsdXIgZXZlbnQgaXMgcmFpc2VkIHdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cy4gVGhpcyBjYW4gaGFwcGVuIGlmIGEgdXNlciBzd2Fwc1xyXG4gKiB0YWIsIG9yIGlmIHRoZXkgc2ltcGx5IHJlbW92ZSBmb2N1cyBmcm9tIHRoZSBicm93c2VyIHRvIGFub3RoZXIgYXBwLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI0JMVVJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdibHVyJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgQm9vdCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZSBoYXMgZmluaXNoZWQgYm9vdGluZywgYnV0IGJlZm9yZSBpdCBpcyByZWFkeSB0byBzdGFydCBydW5uaW5nLlxyXG4gKiBUaGUgZ2xvYmFsIHN5c3RlbXMgdXNlIHRoaXMgZXZlbnQgdG8ga25vdyB3aGVuIHRvIHNldCB0aGVtc2VsdmVzIHVwLCBkaXNwYXRjaGluZyB0aGVpciBvd24gYHJlYWR5YCBldmVudHMgYXMgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ29yZS5FdmVudHMjQk9PVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Jvb3QnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBDb250ZXh0IExvc3QgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEdhbWUgaWYgdGhlIFdlYkdMIFJlbmRlcmVyIGl0IGlzIHVzaW5nIGVuY291bnRlcnMgYSBXZWJHTCBDb250ZXh0IExvc3QgZXZlbnQgZnJvbSB0aGUgYnJvd3Nlci5cclxuICogXHJcbiAqIFRoZSBwYXJ0bmVyIGV2ZW50IGlzIGBDT05URVhUX1JFU1RPUkVEYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNDT05URVhUX0xPU1RcclxuICogQHNpbmNlIDMuMTkuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY29udGV4dGxvc3QnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBDb250ZXh0IFJlc3RvcmVkIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBHYW1lIGlmIHRoZSBXZWJHTCBSZW5kZXJlciBpdCBpcyB1c2luZyBlbmNvdW50ZXJzIGEgV2ViR0wgQ29udGV4dCBSZXN0b3JlZCBldmVudCBmcm9tIHRoZSBicm93c2VyLlxyXG4gKiBcclxuICogVGhlIHBhcnRuZXIgZXZlbnQgaXMgYENPTlRFWFRfTE9TVGAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ29yZS5FdmVudHMjQ09OVEVYVF9SRVNUT1JFRFxyXG4gKiBAc2luY2UgMy4xOS4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjb250ZXh0cmVzdG9yZWQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBEZXN0cm95IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIGdhbWUgaW5zdGFuY2UgaGFzIGJlZW4gdG9sZCB0byBkZXN0cm95IGl0c2VsZi5cclxuICogTG90cyBvZiBpbnRlcm5hbCBzeXN0ZW1zIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIG9yZGVyIHRvIGNsZWFyIHRoZW1zZWx2ZXMgb3V0LlxyXG4gKiBDdXN0b20gcGx1Z2lucyBhbmQgZ2FtZSBjb2RlIHNob3VsZCBhbHNvIGRvIHRoZSBzYW1lLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI0RFU1RST1lcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkZXN0cm95JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgRm9jdXMgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEdhbWUgVmlzaWJpbGl0eSBIYW5kbGVyIHdoZW4gdGhlIHdpbmRvdyBpbiB3aGljaCB0aGUgR2FtZSBpbnN0YW5jZSBpcyBlbWJlZGRlZFxyXG4gKiBlbnRlcnMgYSBmb2N1c2VkIHN0YXRlLiBUaGUgZm9jdXMgZXZlbnQgaXMgcmFpc2VkIHdoZW4gdGhlIHdpbmRvdyByZS1nYWlucyBmb2N1cywgaGF2aW5nIHByZXZpb3VzbHkgbG9zdCBpdC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNGT0NVU1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2ZvY3VzJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgSGlkZGVuIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBHYW1lIFZpc2liaWxpdHkgSGFuZGxlciB3aGVuIHRoZSBkb2N1bWVudCBpbiB3aGljaCB0aGUgR2FtZSBpbnN0YW5jZSBpcyBlbWJlZGRlZFxyXG4gKiBlbnRlcnMgYSBoaWRkZW4gc3RhdGUuIE9ubHkgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHRoZSBWaXNpYmlsaXR5IEFQSSB3aWxsIGNhdXNlIHRoaXMgZXZlbnQgdG8gYmUgZW1pdHRlZC5cclxuICogXHJcbiAqIEluIG1vc3QgbW9kZXJuIGJyb3dzZXJzLCB3aGVuIHRoZSBkb2N1bWVudCBlbnRlcnMgYSBoaWRkZW4gc3RhdGUsIHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBhbmQgc2V0VGltZW91dCwgd2hpY2hcclxuICogY29udHJvbCB0aGUgbWFpbiBnYW1lIGxvb3AsIHdpbGwgYXV0b21hdGljYWxseSBwYXVzZS4gVGhlcmUgaXMgbm8gd2F5IHRvIHN0b3AgdGhpcyBmcm9tIGhhcHBlbmluZy4gSXQgaXMgc29tZXRoaW5nXHJcbiAqIHlvdXIgZ2FtZSBzaG91bGQgYWNjb3VudCBmb3IgaW4gaXRzIG93biBjb2RlLCBzaG91bGQgdGhlIHBhdXNlIGJlIGFuIGlzc3VlIChpLmUuIGZvciBtdWx0aXBsYXllciBnYW1lcylcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNISURERU5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdoaWRkZW4nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBHYW1lIGxvb3AgZW50ZXJzIGEgcGF1c2VkIHN0YXRlLCB1c3VhbGx5IGFzIGEgcmVzdWx0IG9mIHRoZSBWaXNpYmlsaXR5IEhhbmRsZXIuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuQ29yZS5FdmVudHMjUEFVU0VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwYXVzZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIFBvc3QtUmVuZGVyIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlciBwcm9jZXNzLlxyXG4gKiBcclxuICogRXZlcnkgU2NlbmUgd2lsbCBoYXZlIHJlbmRlcmVkIGFuZCBiZWVuIGRyYXduIHRvIHRoZSBjYW52YXMgYnkgdGhlIHRpbWUgdGhpcyBldmVudCBpcyBmaXJlZC5cclxuICogVXNlIGl0IGZvciBhbnkgbGFzdCBtaW51dGUgcG9zdC1wcm9jZXNzaW5nIGJlZm9yZSB0aGUgbmV4dCBnYW1lIHN0ZXAgYmVnaW5zLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI1BPU1RfUkVOREVSXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcnxQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcil9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIgYmVpbmcgdXNlZCBieSB0aGUgR2FtZSBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Bvc3RyZW5kZXInO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBQb3N0LVN0ZXAgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYWZ0ZXIgdGhlIFNjZW5lIE1hbmFnZXIgaGFzIHVwZGF0ZWQuXHJcbiAqIEhvb2sgaW50byBpdCBmcm9tIHBsdWdpbnMgb3Igc3lzdGVtcyB0aGF0IG5lZWQgdG8gZG8gdGhpbmdzIGJlZm9yZSB0aGUgcmVuZGVyIHN0YXJ0cy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNQT1NUX1NURVBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9zdHN0ZXAnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBQcmUtUmVuZGVyIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhbnkgb2YgdGhlIFNjZW5lcyBoYXZlIHN0YXJ0ZWQgdG8gcmVuZGVyLlxyXG4gKiBcclxuICogVGhlIHJlbmRlcmVyIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgdGhpcyBmcmFtZSwgY2xlYXJpbmcgaXRzZWxmIGFuZCBwcmVwYXJpbmcgdG8gcmVjZWl2ZSB0aGUgU2NlbmVzIGZvciByZW5kZXJpbmcsIGJ1dCBpdCB3b24ndCBoYXZlIGFjdHVhbGx5IGRyYXduIGFueXRoaW5nIHlldC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNQUkVfUkVOREVSXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcnxQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcil9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIgYmVpbmcgdXNlZCBieSB0aGUgR2FtZSBpbnN0YW5jZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3ByZXJlbmRlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIFByZS1TdGVwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJlZm9yZSB0aGUgbWFpbiBHYW1lIFN0ZXAgc3RhcnRzLiBCeSB0aGlzIHBvaW50IGluIHRoZSBnYW1lIGN5Y2xlIG5vbmUgb2YgdGhlIFNjZW5lIHVwZGF0ZXMgaGF2ZSB5ZXQgaGFwcGVuZWQuXHJcbiAqIEhvb2sgaW50byBpdCBmcm9tIHBsdWdpbnMgb3Igc3lzdGVtcyB0aGF0IG5lZWQgdG8gdXBkYXRlIGJlZm9yZSB0aGUgU2NlbmUgTWFuYWdlciBkb2VzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI1BSRV9TVEVQXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lLiBFaXRoZXIgYSBIaWdoIFJlc29sdXRpb24gVGltZXIgdmFsdWUgaWYgaXQgY29tZXMgZnJvbSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgRGF0ZS5ub3cgaWYgdXNpbmcgU2V0VGltZW91dC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3ByZXN0ZXAnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBSZWFkeSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZSBoYXMgZmluaXNoZWQgYm9vdGluZywgdGhlIFRleHR1cmUgTWFuYWdlciBpcyBmdWxseSByZWFkeSxcclxuICogYW5kIGFsbCBsb2NhbCBzeXN0ZW1zIGFyZSBub3cgYWJsZSB0byBzdGFydC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNSRUFEWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlYWR5JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgUmVzdW1lIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIGdhbWUgbG9vcCBsZWF2ZXMgYSBwYXVzZWQgc3RhdGUgYW5kIHJlc3VtZXMgcnVubmluZy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Db3JlLkV2ZW50cyNSRVNVTUVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdyZXN1bWUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBTdGVwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGFmdGVyIHRoZSBHYW1lIFByZS1TdGVwIGFuZCBiZWZvcmUgdGhlIFNjZW5lIE1hbmFnZXIgc3RlcHMuXHJcbiAqIEhvb2sgaW50byBpdCBmcm9tIHBsdWdpbnMgb3Igc3lzdGVtcyB0aGF0IG5lZWQgdG8gdXBkYXRlIGJlZm9yZSB0aGUgU2NlbmUgTWFuYWdlciBkb2VzLCBidXQgYWZ0ZXIgdGhlIGNvcmUgU3lzdGVtcyBoYXZlLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI1NURVBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnc3RlcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIFZpc2libGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEdhbWUgVmlzaWJpbGl0eSBIYW5kbGVyIHdoZW4gdGhlIGRvY3VtZW50IGluIHdoaWNoIHRoZSBHYW1lIGluc3RhbmNlIGlzIGVtYmVkZGVkXHJcbiAqIGVudGVycyBhIHZpc2libGUgc3RhdGUsIHByZXZpb3VzbHkgaGF2aW5nIGJlZW4gaGlkZGVuLlxyXG4gKiBcclxuICogT25seSBicm93c2VycyB0aGF0IHN1cHBvcnQgdGhlIFZpc2liaWxpdHkgQVBJIHdpbGwgY2F1c2UgdGhpcyBldmVudCB0byBiZSBlbWl0dGVkLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkNvcmUuRXZlbnRzI1ZJU0lCTEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd2aXNpYmxlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuQ29yZS5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBCTFVSOiByZXF1aXJlKCcuL0JMVVJfRVZFTlQnKSxcclxuICAgIEJPT1Q6IHJlcXVpcmUoJy4vQk9PVF9FVkVOVCcpLFxyXG4gICAgQ09OVEVYVF9MT1NUOiByZXF1aXJlKCcuL0NPTlRFWFRfTE9TVF9FVkVOVCcpLFxyXG4gICAgQ09OVEVYVF9SRVNUT1JFRDogcmVxdWlyZSgnLi9DT05URVhUX1JFU1RPUkVEX0VWRU5UJyksXHJcbiAgICBERVNUUk9ZOiByZXF1aXJlKCcuL0RFU1RST1lfRVZFTlQnKSxcclxuICAgIEZPQ1VTOiByZXF1aXJlKCcuL0ZPQ1VTX0VWRU5UJyksXHJcbiAgICBISURERU46IHJlcXVpcmUoJy4vSElEREVOX0VWRU5UJyksXHJcbiAgICBQQVVTRTogcmVxdWlyZSgnLi9QQVVTRV9FVkVOVCcpLFxyXG4gICAgUE9TVF9SRU5ERVI6IHJlcXVpcmUoJy4vUE9TVF9SRU5ERVJfRVZFTlQnKSxcclxuICAgIFBPU1RfU1RFUDogcmVxdWlyZSgnLi9QT1NUX1NURVBfRVZFTlQnKSxcclxuICAgIFBSRV9SRU5ERVI6IHJlcXVpcmUoJy4vUFJFX1JFTkRFUl9FVkVOVCcpLFxyXG4gICAgUFJFX1NURVA6IHJlcXVpcmUoJy4vUFJFX1NURVBfRVZFTlQnKSxcclxuICAgIFJFQURZOiByZXF1aXJlKCcuL1JFQURZX0VWRU5UJyksXHJcbiAgICBSRVNVTUU6IHJlcXVpcmUoJy4vUkVTVU1FX0VWRU5UJyksXHJcbiAgICBTVEVQOiByZXF1aXJlKCcuL1NURVBfRVZFTlQnKSxcclxuICAgIFZJU0lCTEU6IHJlcXVpcmUoJy4vVklTSUJMRV9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5Db3JlXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ29uZmlnOiByZXF1aXJlKCcuL0NvbmZpZycpLFxyXG4gICAgQ3JlYXRlUmVuZGVyZXI6IHJlcXVpcmUoJy4vQ3JlYXRlUmVuZGVyZXInKSxcclxuICAgIERlYnVnSGVhZGVyOiByZXF1aXJlKCcuL0RlYnVnSGVhZGVyJyksXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJyksXHJcbiAgICBUaW1lU3RlcDogcmVxdWlyZSgnLi9UaW1lU3RlcCcpLFxyXG4gICAgVmlzaWJpbGl0eUhhbmRsZXI6IHJlcXVpcmUoJy4vVmlzaWJpbGl0eUhhbmRsZXInKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXJuZTE2ID0gcmVxdWlyZSgnLi9wYWxldHRlcy9Bcm5lMTYnKTtcclxudmFyIENhbnZhc1Bvb2wgPSByZXF1aXJlKCcuLi9kaXNwbGF5L2NhbnZhcy9DYW52YXNQb29sJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHRleHR1cmUgYmFzZWQgb24gdGhlIGdpdmVuIENyZWF0ZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogXHJcbiAqIFRoZSB0ZXh0dXJlIGlzIGRyYXduIHVzaW5nIGEgZml4ZWQtc2l6ZSBpbmRleGVkIHBhbGV0dGUgb2YgMTYgY29sb3JzLCB3aGVyZSB0aGUgaGV4IHZhbHVlIGluIHRoZVxyXG4gKiBkYXRhIGNlbGxzIG1hcCB0byBhIHNpbmdsZSBjb2xvci4gRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0dXJlIGNvbmZpZyBsb29rZWQgbGlrZSB0aGlzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBzdGFyID0gW1xyXG4gKiAgICcuLi4uLjgyOC4uLi4uJyxcclxuICogICAnLi4uLjcyMjI3Li4uLicsXHJcbiAqICAgJy4uLi44MjIyOC4uLi4nLFxyXG4gKiAgICcuLi43MjIyMjI3Li4uJyxcclxuICogICAnMjIyMjIyMjIyMjIyMicsXHJcbiAqICAgJzgyMjIyMjIyMjIyMjgnLFxyXG4gKiAgICcuNzIyMjIyMjIyMjcuJyxcclxuICogICAnLi43ODc3Nzc3ODcuLicsXHJcbiAqICAgJy4uODc3Nzc3Nzc4Li4nLFxyXG4gKiAgICcuNzg3Nzg4ODc3ODcuJyxcclxuICogICAnLjI3ODg3Ljc4ODcyLicsXHJcbiAqICAgJy43ODcuLi4uLjc4Ny4nXHJcbiAqIF07XHJcbiAqIFxyXG4gKiB0aGlzLnRleHR1cmVzLmdlbmVyYXRlKCdzdGFyJywgeyBkYXRhOiBzdGFyLCBwaXhlbFdpZHRoOiA0IH0pO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIFRoZW4gaXQgd291bGQgZ2VuZXJhdGUgYSB0ZXh0dXJlIHRoYXQgaXMgNTIgeCA0OCBwaXhlbHMgaW4gc2l6ZSwgYmVjYXVzZSBlYWNoIGNlbGwgb2YgdGhlIGRhdGEgYXJyYXlcclxuICogcmVwcmVzZW50cyAxIHBpeGVsIG11bHRpcGxpZWQgYnkgdGhlIGBwaXhlbFdpZHRoYCB2YWx1ZS4gVGhlIGNlbGwgdmFsdWVzLCBzdWNoIGFzIGA4YCwgbWFwcyB0byBjb2xvclxyXG4gKiBudW1iZXIgOCBpbiB0aGUgcGFsZXR0ZS4gSWYgYSBjZWxsIGNvbnRhaW5zIGEgcGVyaW9kIGNoYXJhY3RlciBgLmAgdGhlbiBpdCBpcyB0cmFuc3BhcmVudC5cclxuICogXHJcbiAqIFRoZSBkZWZhdWx0IHBhbGV0dGUgaXMgQXJuZTE2LCBidXQgeW91IGNhbiBzcGVjaWZ5IHlvdXIgb3duIHVzaW5nIHRoZSBgcGFsZXR0ZWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQ3JlYXRlLkdlbmVyYXRlVGV4dHVyZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ3JlYXRlLkdlbmVyYXRlVGV4dHVyZUNvbmZpZ30gY29uZmlnIC0gVGhlIEdlbmVyYXRlIFRleHR1cmUgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBBbiBIVE1MQ2FudmFzRWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZ2VuZXJhdGVkIHRleHR1cmUgZHJhd24gdG8gaXQuXHJcbiAqL1xyXG52YXIgR2VuZXJhdGVUZXh0dXJlID0gZnVuY3Rpb24gKGNvbmZpZylcclxue1xyXG4gICAgdmFyIGRhdGEgPSBHZXRWYWx1ZShjb25maWcsICdkYXRhJywgW10pO1xyXG4gICAgdmFyIGNhbnZhcyA9IEdldFZhbHVlKGNvbmZpZywgJ2NhbnZhcycsIG51bGwpO1xyXG4gICAgdmFyIHBhbGV0dGUgPSBHZXRWYWx1ZShjb25maWcsICdwYWxldHRlJywgQXJuZTE2KTtcclxuICAgIHZhciBwaXhlbFdpZHRoID0gR2V0VmFsdWUoY29uZmlnLCAncGl4ZWxXaWR0aCcsIDEpO1xyXG4gICAgdmFyIHBpeGVsSGVpZ2h0ID0gR2V0VmFsdWUoY29uZmlnLCAncGl4ZWxIZWlnaHQnLCBwaXhlbFdpZHRoKTtcclxuICAgIHZhciByZXNpemVDYW52YXMgPSBHZXRWYWx1ZShjb25maWcsICdyZXNpemVDYW52YXMnLCB0cnVlKTtcclxuICAgIHZhciBjbGVhckNhbnZhcyA9IEdldFZhbHVlKGNvbmZpZywgJ2NsZWFyQ2FudmFzJywgdHJ1ZSk7XHJcbiAgICB2YXIgcHJlUmVuZGVyID0gR2V0VmFsdWUoY29uZmlnLCAncHJlUmVuZGVyJywgbnVsbCk7XHJcbiAgICB2YXIgcG9zdFJlbmRlciA9IEdldFZhbHVlKGNvbmZpZywgJ3Bvc3RSZW5kZXInLCBudWxsKTtcclxuXHJcbiAgICB2YXIgd2lkdGggPSBNYXRoLmZsb29yKE1hdGguYWJzKGRhdGFbMF0ubGVuZ3RoICogcGl4ZWxXaWR0aCkpO1xyXG4gICAgdmFyIGhlaWdodCA9IE1hdGguZmxvb3IoTWF0aC5hYnMoZGF0YS5sZW5ndGggKiBwaXhlbEhlaWdodCkpO1xyXG5cclxuICAgIGlmICghY2FudmFzKVxyXG4gICAge1xyXG4gICAgICAgIGNhbnZhcyA9IENhbnZhc1Bvb2wuY3JlYXRlMkQodGhpcywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgcmVzaXplQ2FudmFzID0gZmFsc2U7XHJcbiAgICAgICAgY2xlYXJDYW52YXMgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzaXplQ2FudmFzKVxyXG4gICAge1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgIGlmIChjbGVhckNhbnZhcylcclxuICAgIHtcclxuICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBwcmVSZW5kZXIgQ2FsbGJhY2s/XHJcbiAgICBpZiAocHJlUmVuZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHByZVJlbmRlcihjYW52YXMsIGN0eCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIERyYXcgaXRcclxuICAgIGZvciAodmFyIHkgPSAwOyB5IDwgZGF0YS5sZW5ndGg7IHkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcm93ID0gZGF0YVt5XTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCByb3cubGVuZ3RoOyB4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZCA9IHJvd1t4XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkICE9PSAnLicgJiYgZCAhPT0gJyAnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gcGFsZXR0ZVtkXTtcclxuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCh4ICogcGl4ZWxXaWR0aCwgeSAqIHBpeGVsSGVpZ2h0LCBwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIHBvc3RSZW5kZXIgQ2FsbGJhY2s/XHJcbiAgICBpZiAocG9zdFJlbmRlcilcclxuICAgIHtcclxuICAgICAgICBwb3N0UmVuZGVyKGNhbnZhcywgY3R4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FudmFzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZW5lcmF0ZVRleHR1cmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkNyZWF0ZVxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIFxyXG4gICAgR2VuZXJhdGVUZXh0dXJlOiByZXF1aXJlKCcuL0dlbmVyYXRlVGV4dHVyZScpLFxyXG4gICAgUGFsZXR0ZXM6IHJlcXVpcmUoJy4vcGFsZXR0ZXMnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQSAxNiBjb2xvciBwYWxldHRlIGJ5IFtBcm5lXShodHRwOi8vYW5kcm9pZGFydHMuY29tL3BhbGV0dGUvMTZwYWwuaHRtKVxyXG4gKlxyXG4gKiBAbmFtZSBQaGFzZXIuQ3JlYXRlLlBhbGV0dGVzLkFSTkUxNlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHR5cGUge1BoYXNlci5UeXBlcy5DcmVhdGUuUGFsZXR0ZX1cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgMDogJyMwMDAnLFxyXG4gICAgMTogJyM5RDlEOUQnLFxyXG4gICAgMjogJyNGRkYnLFxyXG4gICAgMzogJyNCRTI2MzMnLFxyXG4gICAgNDogJyNFMDZGOEInLFxyXG4gICAgNTogJyM0OTNDMkInLFxyXG4gICAgNjogJyNBNDY0MjInLFxyXG4gICAgNzogJyNFQjg5MzEnLFxyXG4gICAgODogJyNGN0UyNkInLFxyXG4gICAgOTogJyMyRjQ4NEUnLFxyXG4gICAgQTogJyM0NDg5MUEnLFxyXG4gICAgQjogJyNBM0NFMjcnLFxyXG4gICAgQzogJyMxQjI2MzInLFxyXG4gICAgRDogJyMwMDU3ODQnLFxyXG4gICAgRTogJyMzMUEyRjInLFxyXG4gICAgRjogJyNCMkRDRUYnXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgMTYgY29sb3IgcGFsZXR0ZSBpbnNwaXJlZCBieSB0aGUgQ29tbW9kb3JlIDY0LlxyXG4gKlxyXG4gKiBAbmFtZSBQaGFzZXIuQ3JlYXRlLlBhbGV0dGVzLkM2NFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHR5cGUge1BoYXNlci5UeXBlcy5DcmVhdGUuUGFsZXR0ZX1cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgMDogJyMwMDAnLFxyXG4gICAgMTogJyNmZmYnLFxyXG4gICAgMjogJyM4YjQxMzEnLFxyXG4gICAgMzogJyM3YmJkYzUnLFxyXG4gICAgNDogJyM4YjQxYWMnLFxyXG4gICAgNTogJyM2YWFjNDEnLFxyXG4gICAgNjogJyMzOTMxYTQnLFxyXG4gICAgNzogJyNkNWRlNzMnLFxyXG4gICAgODogJyM5NDVhMjAnLFxyXG4gICAgOTogJyM1YTQxMDAnLFxyXG4gICAgQTogJyNiZDczNmEnLFxyXG4gICAgQjogJyM1MjUyNTInLFxyXG4gICAgQzogJyM4MzgzODMnLFxyXG4gICAgRDogJyNhY2VlOGInLFxyXG4gICAgRTogJyM3YjczZGUnLFxyXG4gICAgRjogJyNhY2FjYWMnXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgMTYgY29sb3IgQ0dBIGluc3BpcmVkIHBhbGV0dGUgYnkgW0FybmVdKGh0dHA6Ly9hbmRyb2lkYXJ0cy5jb20vcGFsZXR0ZS8xNnBhbC5odG0pXHJcbiAqXHJcbiAqIEBuYW1lIFBoYXNlci5DcmVhdGUuUGFsZXR0ZXMuQ0dBXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAdHlwZSB7UGhhc2VyLlR5cGVzLkNyZWF0ZS5QYWxldHRlfVxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICAwOiAnIzAwMCcsXHJcbiAgICAxOiAnIzIyMzRkMScsXHJcbiAgICAyOiAnIzBjN2U0NScsXHJcbiAgICAzOiAnIzQ0YWFjYycsXHJcbiAgICA0OiAnIzhhMzYyMicsXHJcbiAgICA1OiAnIzVjMmU3OCcsXHJcbiAgICA2OiAnI2FhNWMzZCcsXHJcbiAgICA3OiAnI2I1YjViNScsXHJcbiAgICA4OiAnIzVlNjA2ZScsXHJcbiAgICA5OiAnIzRjODFmYicsXHJcbiAgICBBOiAnIzZjZDk0NycsXHJcbiAgICBCOiAnIzdiZTJmOScsXHJcbiAgICBDOiAnI2ViOGE2MCcsXHJcbiAgICBEOiAnI2UyM2Q2OScsXHJcbiAgICBFOiAnI2ZmZDkzZicsXHJcbiAgICBGOiAnI2ZmZidcclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQSAxNiBjb2xvciBKTVAgcGFsZXR0ZSBieSBbQXJuZV0oaHR0cDovL2FuZHJvaWRhcnRzLmNvbS9wYWxldHRlLzE2cGFsLmh0bSlcclxuICpcclxuICogQG5hbWUgUGhhc2VyLkNyZWF0ZS5QYWxldHRlcy5KTVBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuQ3JlYXRlLlBhbGV0dGV9XHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIDA6ICcjMDAwJyxcclxuICAgIDE6ICcjMTkxMDI4JyxcclxuICAgIDI6ICcjNDZhZjQ1JyxcclxuICAgIDM6ICcjYTFkNjg1JyxcclxuICAgIDQ6ICcjNDUzZTc4JyxcclxuICAgIDU6ICcjNzY2NGZlJyxcclxuICAgIDY6ICcjODMzMTI5JyxcclxuICAgIDc6ICcjOWVjMmU4JyxcclxuICAgIDg6ICcjZGM1MzRiJyxcclxuICAgIDk6ICcjZTE4ZDc5JyxcclxuICAgIEE6ICcjZDZiOTdiJyxcclxuICAgIEI6ICcjZTlkOGExJyxcclxuICAgIEM6ICcjMjE2YzRiJyxcclxuICAgIEQ6ICcjZDM2NWM4JyxcclxuICAgIEU6ICcjYWZhYWI5JyxcclxuICAgIEY6ICcjZjVmNGViJ1xyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBIDE2IGNvbG9yIHBhbGV0dGUgaW5zcGlyZWQgYnkgSmFwYW5lc2UgY29tcHV0ZXJzIGxpa2UgdGhlIE1TWC5cclxuICpcclxuICogQG5hbWUgUGhhc2VyLkNyZWF0ZS5QYWxldHRlcy5NU1hcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuQ3JlYXRlLlBhbGV0dGV9XHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIDA6ICcjMDAwJyxcclxuICAgIDE6ICcjMTkxMDI4JyxcclxuICAgIDI6ICcjNDZhZjQ1JyxcclxuICAgIDM6ICcjYTFkNjg1JyxcclxuICAgIDQ6ICcjNDUzZTc4JyxcclxuICAgIDU6ICcjNzY2NGZlJyxcclxuICAgIDY6ICcjODMzMTI5JyxcclxuICAgIDc6ICcjOWVjMmU4JyxcclxuICAgIDg6ICcjZGM1MzRiJyxcclxuICAgIDk6ICcjZTE4ZDc5JyxcclxuICAgIEE6ICcjZDZiOTdiJyxcclxuICAgIEI6ICcjZTlkOGExJyxcclxuICAgIEM6ICcjMjE2YzRiJyxcclxuICAgIEQ6ICcjZDM2NWM4JyxcclxuICAgIEU6ICcjYWZhYWI5JyxcclxuICAgIEY6ICcjZmZmJ1xyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5DcmVhdGUuUGFsZXR0ZXNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBUk5FMTY6IHJlcXVpcmUoJy4vQXJuZTE2JyksXHJcbiAgICBDNjQ6IHJlcXVpcmUoJy4vQzY0JyksXHJcbiAgICBDR0E6IHJlcXVpcmUoJy4vQ0dBJyksXHJcbiAgICBKTVA6IHJlcXVpcmUoJy4vSk1QJyksXHJcbiAgICBNU1g6IHJlcXVpcmUoJy4vTVNYJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIEJhc2VkIG9uIHRoZSB0aHJlZS5qcyBDdXJ2ZSBjbGFzc2VzIGNyZWF0ZWQgYnkgW3p6ODVdKGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cpXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ3ViaWNCZXppZXIgPSByZXF1aXJlKCcuLi9tYXRoL2ludGVycG9sYXRpb24vQ3ViaWNCZXppZXJJbnRlcnBvbGF0aW9uJyk7XHJcbnZhciBDdXJ2ZSA9IHJlcXVpcmUoJy4vQ3VydmUnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgaGlnaGVyLW9yZGVyIELDqXppZXIgY3VydmUgY29uc3RydWN0ZWQgb2YgZm91ciBwb2ludHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBDdWJpY0JlemllclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuQ3VydmVzLkN1cnZlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ3VydmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IyW10pfSBwMCAtIFN0YXJ0IHBvaW50LCBvciBhbiBhcnJheSBvZiBwb2ludCBwYWlycy5cclxuICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBwMSAtIENvbnRyb2wgUG9pbnQgMS5cclxuICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBwMiAtIENvbnRyb2wgUG9pbnQgMi5cclxuICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBwMyAtIEVuZCBQb2ludC5cclxuICovXHJcbnZhciBDdWJpY0JlemllckN1cnZlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBDdXJ2ZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUgKHAwLCBwMSwgcDIsIHAzKVxyXG4gICAge1xyXG4gICAgICAgIEN1cnZlLmNhbGwodGhpcywgJ0N1YmljQmV6aWVyQ3VydmUnKTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocDApKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcDMgPSBuZXcgVmVjdG9yMihwMFs2XSwgcDBbN10pO1xyXG4gICAgICAgICAgICBwMiA9IG5ldyBWZWN0b3IyKHAwWzRdLCBwMFs1XSk7XHJcbiAgICAgICAgICAgIHAxID0gbmV3IFZlY3RvcjIocDBbMl0sIHAwWzNdKTtcclxuICAgICAgICAgICAgcDAgPSBuZXcgVmVjdG9yMihwMFswXSwgcDBbMV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0YXJ0IHBvaW50IG9mIHRoaXMgY3VydmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyI3AwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMCA9IHAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZmlyc3QgY29udHJvbCBwb2ludCBvZiB0aGlzIGN1cnZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5DdWJpY0JlemllciNwMVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucDEgPSBwMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNlY29uZCBjb250cm9sIHBvaW50IG9mIHRoaXMgY3VydmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyI3AyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMiA9IHAyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZW5kIHBvaW50IG9mIHRoaXMgY3VydmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyI3AzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMyA9IHAzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN0YXJ0aW5nIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3ViaWNCZXppZXIjZ2V0U3RhcnRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEEgVmVjdG9yMiBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgbm90IGdpdmVuIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZS4gSWYgYW4gYG91dGAgb2JqZWN0IHdhcyBnaXZlbiB0aGlzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFN0YXJ0UG9pbnQ6IGZ1bmN0aW9uIChvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dC5jb3B5KHRoaXMucDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHJlc29sdXRpb24gb2YgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3ViaWNCZXppZXIjZ2V0UmVzb2x1dGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzaW9ucyAtIFRoZSBhbW91bnQgb2YgZGl2aXNpb25zIHVzZWQgYnkgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjdXJ2ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzb2x1dGlvbjogZnVuY3Rpb24gKGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZGl2aXNpb25zO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gbGVuZ3RoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdWJpY0JlemllciNnZXRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgcG9zaXRpb24gYWxvbmcgdGhlIGN1cnZlIHRvIHJldHVybi4gV2hlcmUgMCBpcyB0aGUgc3RhcnQgYW5kIDEgaXMgdGhlIGVuZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBBIFZlY3RvcjIgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIG5vdCBnaXZlbiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludCBvbiB0aGUgY3VydmUuIElmIGFuIGBvdXRgIG9iamVjdCB3YXMgZ2l2ZW4gdGhpcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludDogZnVuY3Rpb24gKHQsIG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICB2YXIgcDAgPSB0aGlzLnAwO1xyXG4gICAgICAgIHZhciBwMSA9IHRoaXMucDE7XHJcbiAgICAgICAgdmFyIHAyID0gdGhpcy5wMjtcclxuICAgICAgICB2YXIgcDMgPSB0aGlzLnAzO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0LnNldChDdWJpY0Jlemllcih0LCBwMC54LCBwMS54LCBwMi54LCBwMy54KSwgQ3ViaWNCZXppZXIodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoaXMgY3VydmUgdG8gdGhlIHNwZWNpZmllZCBncmFwaGljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyI2RyYXdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IEcgLSBbZ3JhcGhpY3MsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3MgLSBUaGUgZ3JhcGhpY3Mgb2JqZWN0IHRoaXMgY3VydmUgc2hvdWxkIGJlIGRyYXduIHRvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcG9pbnRzVG90YWw9MzJdIC0gVGhlIG51bWJlciBvZiBpbnRlcm1lZGlhcnkgcG9pbnRzIHRoYXQgbWFrZSB1cCB0aGlzIGN1cnZlLiBBIGhpZ2hlciBudW1iZXIgb2YgcG9pbnRzIHdpbGwgcmVzdWx0IGluIGEgc21vb3RoZXIgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBUaGUgZ3JhcGhpY3Mgb2JqZWN0IHRoaXMgY3VydmUgd2FzIGRyYXduIHRvLiBVc2VmdWwgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgZHJhdzogZnVuY3Rpb24gKGdyYXBoaWNzLCBwb2ludHNUb3RhbClcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRzVG90YWwgPT09IHVuZGVmaW5lZCkgeyBwb2ludHNUb3RhbCA9IDMyOyB9XHJcblxyXG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmdldFBvaW50cyhwb2ludHNUb3RhbCk7XHJcblxyXG4gICAgICAgIGdyYXBoaWNzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGdyYXBoaWNzLm1vdmVUbyh0aGlzLnAwLngsIHRoaXMucDAueSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ3JhcGhpY3MubGluZVRvKHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmFwaGljcy5zdHJva2VQYXRoKCk7XHJcblxyXG4gICAgICAgIC8vICBTbyB5b3UgY2FuIGNoYWluIGdyYXBoaWNzIGNhbGxzXHJcbiAgICAgICAgcmV0dXJuIGdyYXBoaWNzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBKU09OIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGlzIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdWJpY0JlemllciN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5DdXJ2ZXMuSlNPTkN1cnZlfSBUaGUgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGlzIGN1cnZlIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIHBvaW50czogW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wMC54LCB0aGlzLnAwLnksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnAxLngsIHRoaXMucDEueSxcclxuICAgICAgICAgICAgICAgIHRoaXMucDIueCwgdGhpcy5wMi55LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5wMy54LCB0aGlzLnAzLnlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBjdXJ2ZSBmcm9tIGEgSlNPTiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyLmZyb21KU09OXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DdXJ2ZXMuSlNPTkN1cnZlfSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhpcyBjdXJ2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuQ3VydmVzLkN1YmljQmV6aWVyfSBUaGUgY3VydmUgZ2VuZXJhdGVkIGZyb20gdGhlIEpTT04gb2JqZWN0LlxyXG4gKi9cclxuQ3ViaWNCZXppZXJDdXJ2ZS5mcm9tSlNPTiA9IGZ1bmN0aW9uIChkYXRhKVxyXG57XHJcbiAgICB2YXIgcG9pbnRzID0gZGF0YS5wb2ludHM7XHJcblxyXG4gICAgdmFyIHAwID0gbmV3IFZlY3RvcjIocG9pbnRzWzBdLCBwb2ludHNbMV0pO1xyXG4gICAgdmFyIHAxID0gbmV3IFZlY3RvcjIocG9pbnRzWzJdLCBwb2ludHNbM10pO1xyXG4gICAgdmFyIHAyID0gbmV3IFZlY3RvcjIocG9pbnRzWzRdLCBwb2ludHNbNV0pO1xyXG4gICAgdmFyIHAzID0gbmV3IFZlY3RvcjIocG9pbnRzWzZdLCBwb2ludHNbN10pO1xyXG5cclxuICAgIHJldHVybiBuZXcgQ3ViaWNCZXppZXJDdXJ2ZShwMCwgcDEsIHAyLCBwMyk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEN1YmljQmV6aWVyQ3VydmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZyb21Qb2ludHMgPSByZXF1aXJlKCcuLi9nZW9tL3JlY3RhbmdsZS9Gcm9tUG9pbnRzJyk7XHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi9nZW9tL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQmFzZSBDdXJ2ZSBjbGFzcywgd2hpY2ggYWxsIG90aGVyIGN1cnZlIHR5cGVzIGV4dGVuZC5cclxuICpcclxuICogQmFzZWQgb24gdGhlIHRocmVlLmpzIEN1cnZlIGNsYXNzZXMgY3JlYXRlZCBieSBbeno4NV0oaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZylcclxuICpcclxuICogQGNsYXNzIEN1cnZlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ3VydmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgY3VydmUgdHlwZS5cclxuICovXHJcbnZhciBDdXJ2ZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDdXJ2ZSAodHlwZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdHJpbmcgYmFzZWQgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgY3VydmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkN1cnZlI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IG51bWJlciBvZiBkaXZpc2lvbnMgd2l0aGluIHRoZSBjdXJ2ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuQ3VydmUjZGVmYXVsdERpdmlzaW9uc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlZmF1bHREaXZpc2lvbnMgPSA1O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcXVhbnRpdHkgb2YgYXJjIGxlbmd0aCBkaXZpc2lvbnMgd2l0aGluIHRoZSBjdXJ2ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuQ3VydmUjYXJjTGVuZ3RoRGl2aXNpb25zXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAxMDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGNhY2hlZCBhcmMgbGVuZ3RoIHZhbHVlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuQ3VydmUjY2FjaGVBcmNMZW5ndGhzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcltdfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFtdXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG9lcyB0aGUgZGF0YSBvZiB0aGlzIGN1cnZlIG5lZWQgdXBkYXRpbmc/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkN1cnZlI25lZWRzVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGb3IgYSBjdXJ2ZSBvbiBhIFBhdGgsIGBmYWxzZWAgbWVhbnMgdGhlIFBhdGggd2lsbCBpZ25vcmUgdGhpcyBjdXJ2ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuQ3VydmUjYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgY2FsY3VsYXRpb24gVmVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNfdG1wVmVjMkFcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RtcFZlYzJBID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgY2FsY3VsYXRpb24gVmVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNfdG1wVmVjMkJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RtcFZlYzJCID0gbmV3IFZlY3RvcjIoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGlzIGN1cnZlIG9uIHRoZSBnaXZlbiBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGN1cnZlIGlzIGRyYXduIHVzaW5nIGBHcmFwaGljcy5zdHJva2VQb2ludHNgIHNvIHdpbGwgYmUgZHJhd24gYXQgd2hhdGV2ZXIgdGhlIHByZXNlbnQgR3JhcGhpY3Mgc3Ryb2tlIGNvbG9yIGlzLlxyXG4gICAgICogVGhlIEdyYXBoaWNzIG9iamVjdCBpcyBub3QgY2xlYXJlZCBiZWZvcmUgdGhlIGRyYXcsIHNvIHRoZSBjdXJ2ZSB3aWxsIGFwcGVhciBvbi10b3Agb2YgYW55dGhpbmcgZWxzZSBhbHJlYWR5IHJlbmRlcmVkIHRvIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNkcmF3XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBHIC0gW2dyYXBoaWNzLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIGluc3RhbmNlIG9udG8gd2hpY2ggdGhpcyBjdXJ2ZSB3aWxsIGJlIGRyYXduLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcG9pbnRzVG90YWw9MzJdIC0gVGhlIHJlc29sdXRpb24gb2YgdGhlIGN1cnZlLiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSB0aGUgc21vb3RoZXIgaXQgd2lsbCByZW5kZXIsIGF0IHRoZSBjb3N0IG9mIHJlbmRlcmluZyBwZXJmb3JtYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IFRoZSBHcmFwaGljcyBvYmplY3QgdG8gd2hpY2ggdGhlIGN1cnZlIHdhcyBkcmF3bi5cclxuICAgICAqL1xyXG4gICAgZHJhdzogZnVuY3Rpb24gKGdyYXBoaWNzLCBwb2ludHNUb3RhbClcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRzVG90YWwgPT09IHVuZGVmaW5lZCkgeyBwb2ludHNUb3RhbCA9IDMyOyB9XHJcblxyXG4gICAgICAgIC8vICBTbyB5b3UgY2FuIGNoYWluIGdyYXBoaWNzIGNhbGxzXHJcbiAgICAgICAgcmV0dXJuIGdyYXBoaWNzLnN0cm9rZVBvaW50cyh0aGlzLmdldFBvaW50cyhwb2ludHNUb3RhbCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBSZWN0YW5nbGUgd2hlcmUgdGhlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb25zIG1hdGNoIHRoZSBib3VuZHMgb2YgdGhpcyBDdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGNvbnRyb2wgdGhlIGFjY3VyYWN5IG9mIHRoZSBib3VuZHMuIFRoZSB2YWx1ZSBnaXZlbiBpcyB1c2VkIHRvIHdvcmsgb3V0IGhvdyBtYW55IHBvaW50c1xyXG4gICAgICogdG8gcGxvdCBhY3Jvc3MgdGhlIGN1cnZlLiBIaWdoZXIgdmFsdWVzIGFyZSBtb3JlIGFjY3VyYXRlIGF0IHRoZSBjb3N0IG9mIGNhbGN1bGF0aW9uIHNwZWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNnZXRCb3VuZHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBbb3V0XSAtIFRoZSBSZWN0YW5nbGUgdG8gc3RvcmUgdGhlIGJvdW5kcyBpbi4gSWYgZmFsc2V5IGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFthY2N1cmFjeT0xNl0gLSBUaGUgYWNjdXJhY3kgb2YgdGhlIGJvdW5kcyBjYWxjdWxhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBBIFJlY3RhbmdsZSBvYmplY3QgaG9sZGluZyB0aGUgYm91bmRzIG9mIHRoaXMgY3VydmUuIElmIGBvdXRgIHdhcyBnaXZlbiBpdCB3aWxsIGJlIHRoaXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uIChvdXQsIGFjY3VyYWN5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICghb3V0KSB7IG91dCA9IG5ldyBSZWN0YW5nbGUoKTsgfVxyXG4gICAgICAgIGlmIChhY2N1cmFjeSA9PT0gdW5kZWZpbmVkKSB7IGFjY3VyYWN5ID0gMTY7IH1cclxuXHJcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZ2V0TGVuZ3RoKCk7XHJcblxyXG4gICAgICAgIGlmIChhY2N1cmFjeSA+IGxlbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFjY3VyYWN5ID0gbGVuIC8gMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJ2ZSBpbiBwaXhlbHNcclxuICAgICAgICAvLyAgU28gd2UnbGwgaGF2ZSAxIHNwYWNlZCBwb2ludCBwZXIgJ2FjY3VyYWN5JyBwaXhlbHNcclxuXHJcbiAgICAgICAgdmFyIHNwYWNlZCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQobGVuIC8gYWNjdXJhY3kpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEZyb21Qb2ludHModGhpcy5nZXRTcGFjZWRQb2ludHMoc3BhY2VkKSwgb3V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50cywgc3BhY2VkIG91dCBYIGRpc3RhbmNlIHBpeGVscyBhcGFydC5cclxuICAgICAqIFRoZSBzbWFsbGVyIHRoZSBkaXN0YW5jZSwgdGhlIGxhcmdlciB0aGUgYXJyYXkgd2lsbCBiZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3VydmUjZ2V0RGlzdGFuY2VQb2ludHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UsIGluIHBpeGVscywgYmV0d2VlbiBlYWNoIHBvaW50IGFsb25nIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludFtdfSBBbiBBcnJheSBvZiBQb2ludCBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBnZXREaXN0YW5jZVBvaW50czogZnVuY3Rpb24gKGRpc3RhbmNlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsZW4gPSB0aGlzLmdldExlbmd0aCgpO1xyXG5cclxuICAgICAgICB2YXIgc3BhY2VkID0gTWF0aC5tYXgoMSwgbGVuIC8gZGlzdGFuY2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTcGFjZWRQb2ludHMoc3BhY2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBwb2ludCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3VydmUjZ2V0RW5kUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBPcHRpb25hbCBWZWN0b3Igb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVmVjdG9yMiBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY3VydmVzIGVuZCBwb2ludC5cclxuICAgICAqL1xyXG4gICAgZ2V0RW5kUG9pbnQ6IGZ1bmN0aW9uIChvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRBdCgxLCBvdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0b3RhbCBjdXJ2ZSBhcmMgbGVuZ3RoXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldExlbmd0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBjdXJ2ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGVuZ3RoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBsZW5ndGhzW2xlbmd0aHMubGVuZ3RoIC0gMV07XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlc2UgbGVuZ3RocyBhcmVcclxuICAgICAqXHJcbiAgICAgKiAtIFswXSAwXHJcbiAgICAgKiAtIFsxXSBUaGUgZmlyc3Qgc2VnbWVudFxyXG4gICAgICogLSBbMl0gVGhlIGZpcnN0IGFuZCBzZWNvbmQgc2VnbWVudFxyXG4gICAgICogLSAuLi5cclxuICAgICAqIC0gW2RpdmlzaW9uc10gQWxsIHNlZ21lbnRzXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldExlbmd0aHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpdmlzaW9uc10gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucyBvciBzZWdtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJbXX0gQW4gYXJyYXkgb2YgY3VtdWxhdGl2ZSBsZW5ndGhzLlxyXG4gICAgICovXHJcbiAgICBnZXRMZW5ndGhzOiBmdW5jdGlvbiAoZGl2aXNpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCkgeyBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9uczsgfVxyXG5cclxuICAgICAgICBpZiAoKHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSkgJiYgIXRoaXMubmVlZHNVcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBjYWNoZSA9IFtdO1xyXG4gICAgICAgIHZhciBjdXJyZW50O1xyXG4gICAgICAgIHZhciBsYXN0ID0gdGhpcy5nZXRQb2ludCgwLCB0aGlzLl90bXBWZWMyQSk7XHJcbiAgICAgICAgdmFyIHN1bSA9IDA7XHJcblxyXG4gICAgICAgIGNhY2hlLnB1c2goMCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuZ2V0UG9pbnQocCAvIGRpdmlzaW9ucywgdGhpcy5fdG1wVmVjMkIpO1xyXG5cclxuICAgICAgICAgICAgc3VtICs9IGN1cnJlbnQuZGlzdGFuY2UobGFzdCk7XHJcblxyXG4gICAgICAgICAgICBjYWNoZS5wdXNoKHN1bSk7XHJcblxyXG4gICAgICAgICAgICBsYXN0LmNvcHkoY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xyXG5cclxuICAgICAgICByZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTpzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aFxyXG5cclxuICAgIC8vIC0gdSBbMCAuLiAxXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgcG9pbnQgYXQgYSByZWxhdGl2ZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIGJ5IGFyYyBsZW5ndGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldFBvaW50QXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uLCBbMC4uMV0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBwb2ludCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBwb2ludC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRBdDogZnVuY3Rpb24gKHUsIG91dClcclxuICAgIHtcclxuICAgICAgICB2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcodSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvaW50KHQsIG91dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgc2VxdWVuY2Ugb2YgZXZlbmx5IHNwYWNlZCBwb2ludHMgZnJvbSB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBwYXNzIGBkaXZpc2lvbnNgLCBgc3RlcFJhdGVgLCBvciBuZWl0aGVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zIHdpbGwgYmVcclxuICAgICAqXHJcbiAgICAgKiAxLiBgZGl2aXNpb25zYCwgaWYgYGRpdmlzaW9uc2AgPiAwOyBvclxyXG4gICAgICogMi4gYHRoaXMuZ2V0TGVuZ3RoIC8gc3RlcFJhdGVgLCBpZiBgc3RlcFJhdGVgID4gMDsgb3JcclxuICAgICAqIDMuIGB0aGlzLmRlZmF1bHREaXZpc2lvbnNgXHJcbiAgICAgKlxyXG4gICAgICogYDEgKyBkaXZpc2lvbnNgIHBvaW50cyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNnZXRQb2ludHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyW119IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZGl2aXNpb25zXSAtIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zIHRvIG1ha2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBSYXRlXSAtIFRoZSBjdXJ2ZSBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50cywgaW1wbHlpbmcgYGRpdmlzaW9uc2AuXHJcbiAgICAgKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuTWF0aC5WZWN0b3IyW10pfSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IHRvIHN0b3JlIHRoZSBwb2ludHMgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KGFycmF5fFBoYXNlci5NYXRoLlZlY3RvcjJbXSl9IEFuIGFycmF5IG9mIFBvaW50cyBmcm9tIHRoZSBjdXJ2ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRzOiBmdW5jdGlvbiAoZGl2aXNpb25zLCBzdGVwUmF0ZSwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgICAgICAvLyAgSWYgZGl2aXNpb25zIGlzIGEgZmFsc2V5IHZhbHVlIChmYWxzZSwgbnVsbCwgMCwgdW5kZWZpbmVkLCBldGMpIHRoZW4gd2UgY2FsY3VsYXRlIGl0IGJhc2VkIG9uIHRoZSBzdGVwUmF0ZSBpbnN0ZWFkLlxyXG4gICAgICAgIGlmICghZGl2aXNpb25zKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFzdGVwUmF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGl2aXNpb25zID0gdGhpcy5kZWZhdWx0RGl2aXNpb25zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGl2aXNpb25zID0gdGhpcy5nZXRMZW5ndGgoKSAvIHN0ZXBSYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dC5wdXNoKHRoaXMuZ2V0UG9pbnQoZCAvIGRpdmlzaW9ucykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSByYW5kb20gcG9pbnQgZnJvbSB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldFJhbmRvbVBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBwb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgcG9pbnQuXHJcbiAgICAgKi9cclxuICAgIGdldFJhbmRvbVBvaW50OiBmdW5jdGlvbiAob3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvaW50KE1hdGgucmFuZG9tKCksIG91dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBzZXF1ZW5jZSBvZiBlcXVhbGx5IHNwYWNlZCBwb2ludHMgKGJ5IGFyYyBkaXN0YW5jZSkgZnJvbSB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogYDEgKyBkaXZpc2lvbnNgIHBvaW50cyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNnZXRTcGFjZWRQb2ludHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpdmlzaW9ucz10aGlzLmRlZmF1bHREaXZpc2lvbnNdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMgdG8gbWFrZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFJhdGVdIC0gU3RlcCBiZXR3ZWVuIHBvaW50cy4gVXNlZCB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gcmV0dXJuIHdoZW4gZGl2aXNpb25zIGlzIGZhbHN5LiBJZ25vcmVkIGlmIGRpdmlzaW9ucyBpcyBwb3NpdGl2ZS5cclxuICAgICAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5NYXRoLlZlY3RvcjJbXSl9IFtvdXRdIC0gQW4gb3B0aW9uYWwgYXJyYXkgdG8gc3RvcmUgdGhlIHBvaW50cyBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyW119IEFuIGFycmF5IG9mIHBvaW50cy5cclxuICAgICAqL1xyXG4gICAgZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoZGl2aXNpb25zLCBzdGVwUmF0ZSwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgICAgICAvLyAgSWYgZGl2aXNpb25zIGlzIGEgZmFsc2V5IHZhbHVlIChmYWxzZSwgbnVsbCwgMCwgdW5kZWZpbmVkLCBldGMpIHRoZW4gd2UgY2FsY3VsYXRlIGl0IGJhc2VkIG9uIHRoZSBzdGVwUmF0ZSBpbnN0ZWFkLlxyXG4gICAgICAgIGlmICghZGl2aXNpb25zKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFzdGVwUmF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGl2aXNpb25zID0gdGhpcy5kZWZhdWx0RGl2aXNpb25zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGl2aXNpb25zID0gdGhpcy5nZXRMZW5ndGgoKSAvIHN0ZXBSYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyhkIC8gZGl2aXNpb25zLCBudWxsLCBkaXZpc2lvbnMpO1xyXG5cclxuICAgICAgICAgICAgb3V0LnB1c2godGhpcy5nZXRQb2ludCh0KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHBvaW50IGF0IHRoZSBzdGFydCBvZiB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldFN0YXJ0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBBIHBvaW50IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIHBvaW50LlxyXG4gICAgICovXHJcbiAgICBnZXRTdGFydFBvaW50OiBmdW5jdGlvbiAob3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvaW50QXQoMCwgb3V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSB1bml0IHZlY3RvciB0YW5nZW50IGF0IGEgcmVsYXRpdmUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG4gICAgICogSW4gY2FzZSBhbnkgc3ViIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMgdGFuZ2VudCBkZXJpdmF0aW9uLFxyXG4gICAgICogMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcclxuICAgICAqIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3VydmUjZ2V0VGFuZ2VudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBbMC4uMV0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSB2ZWN0b3IgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBWZWN0b3IgYXBwcm94aW1hdGluZyB0aGUgdGFuZ2VudCBsaW5lIGF0IHRoZSBwb2ludCB0IChkZWx0YSArLy0gMC4wMDAxKVxyXG4gICAgICovXHJcbiAgICBnZXRUYW5nZW50OiBmdW5jdGlvbiAodCwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHZhciBkZWx0YSA9IDAuMDAwMTtcclxuICAgICAgICB2YXIgdDEgPSB0IC0gZGVsdGE7XHJcbiAgICAgICAgdmFyIHQyID0gdCArIGRlbHRhO1xyXG5cclxuICAgICAgICAvLyBDYXBwaW5nIGluIGNhc2Ugb2YgZGFuZ2VyXHJcblxyXG4gICAgICAgIGlmICh0MSA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0MSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodDIgPiAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdDIgPSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRQb2ludCh0MSwgdGhpcy5fdG1wVmVjMkEpO1xyXG4gICAgICAgIHRoaXMuZ2V0UG9pbnQodDIsIG91dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuc3VidHJhY3QodGhpcy5fdG1wVmVjMkEpLm5vcm1hbGl6ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgYSByZWxhdGl2ZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIGJ5IGFyYyBsZW5ndGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldFRhbmdlbnRBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHUgLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBbMC4uMV0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSB2ZWN0b3IgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgdGFuZ2VudCB2ZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGdldFRhbmdlbnRBdDogZnVuY3Rpb24gKHUsIG91dClcclxuICAgIHtcclxuICAgICAgICB2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcodSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRhbmdlbnQodCwgb3V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIGRpc3RhbmNlIGluIHBpeGVscywgZ2V0IGEgdCB0byBmaW5kIHAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI2dldFRGcm9tRGlzdGFuY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpdmlzaW9uc10gLSBPcHRpb25hbCBhbW91bnQgb2YgZGl2aXNpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBnZXRURnJvbURpc3RhbmNlOiBmdW5jdGlvbiAoZGlzdGFuY2UsIGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXRvVG1hcHBpbmcoMCwgZGlzdGFuY2UsIGRpdmlzaW9ucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuQ3VydmUjZ2V0VXRvVG1hcHBpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gQSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXZpc2lvbnNdIC0gT3B0aW9uYWwgYW1vdW50IG9mIGRpdmlzaW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlcXVpZGlzdGFudCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0VXRvVG1hcHBpbmc6IGZ1bmN0aW9uICh1LCBkaXN0YW5jZSwgZGl2aXNpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKGRpdmlzaW9ucyk7XHJcblxyXG4gICAgICAgIHZhciBpID0gMDtcclxuICAgICAgICB2YXIgaWwgPSBhcmNMZW5ndGhzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdmFyIHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0XHJcblxyXG4gICAgICAgIGlmIChkaXN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDYW5ub3Qgb3ZlcnNob290IHRoZSBjdXJ2ZVxyXG4gICAgICAgICAgICB0YXJnZXRBcmNMZW5ndGggPSBNYXRoLm1pbihkaXN0YW5jZSwgYXJjTGVuZ3Roc1tpbCAtIDFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbaWwgLSAxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlXHJcblxyXG4gICAgICAgIHZhciBsb3cgPSAwO1xyXG4gICAgICAgIHZhciBoaWdoID0gaWwgLSAxO1xyXG4gICAgICAgIHZhciBjb21wYXJpc29uO1xyXG5cclxuICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpID0gTWF0aC5mbG9vcihsb3cgKyAoaGlnaCAtIGxvdykgLyAyKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0c1xyXG5cclxuICAgICAgICAgICAgY29tcGFyaXNvbiA9IGFyY0xlbmd0aHNbaV0gLSB0YXJnZXRBcmNMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA8IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBoaWdoID0gaSAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBoaWdoID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpID0gaGlnaDtcclxuXHJcbiAgICAgICAgaWYgKGFyY0xlbmd0aHNbaV0gPT09IHRhcmdldEFyY0xlbmd0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBpIC8gKGlsIC0gMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xyXG5cclxuICAgICAgICB2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1tpXTtcclxuICAgICAgICB2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzW2kgKyAxXTtcclxuXHJcbiAgICAgICAgdmFyIHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTtcclxuXHJcbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcclxuXHJcbiAgICAgICAgdmFyIHNlZ21lbnRGcmFjdGlvbiA9ICh0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUpIC8gc2VnbWVudExlbmd0aDtcclxuXHJcbiAgICAgICAgLy8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxyXG5cclxuICAgICAgICByZXR1cm4gKGkgKyBzZWdtZW50RnJhY3Rpb24pIC8gKGlsIC0gMSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIGFuZCBjYWNoZSB0aGUgYXJjIGxlbmd0aHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkN1cnZlI3VwZGF0ZUFyY0xlbmd0aHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLkN1cnZlcy5DdXJ2ZSNnZXRMZW5ndGhzKClcclxuICAgICAqL1xyXG4gICAgdXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRMZW5ndGhzKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ3VydmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIEJhc2VkIG9uIHRoZSB0aHJlZS5qcyBDdXJ2ZSBjbGFzc2VzIGNyZWF0ZWQgYnkgW3p6ODVdKGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cpXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ3VydmUgPSByZXF1aXJlKCcuL0N1cnZlJyk7XHJcbnZhciBEZWdUb1JhZCA9IHJlcXVpcmUoJy4uL21hdGgvRGVnVG9SYWQnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBSYWRUb0RlZyA9IHJlcXVpcmUoJy4uL21hdGgvUmFkVG9EZWcnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEFuIEVsbGlwdGljYWwgQ3VydmUgZGVyaXZlZCBmcm9tIHRoZSBCYXNlIEN1cnZlIGNsYXNzLlxyXG4gKiBcclxuICogU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VsbGlwdGljX2N1cnZlIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBFbGxpcHNlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5DdXJ2ZXMuQ3VydmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5DdXJ2ZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhudW1iZXJ8UGhhc2VyLlR5cGVzLkN1cnZlcy5FbGxpcHNlQ3VydmVDb25maWcpfSBbeD0wXSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVsbGlwc2UsIG9yIGFuIEVsbGlwc2UgQ3VydmUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVsbGlwc2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeFJhZGl1cz0wXSAtIFRoZSBob3Jpem9udGFsIHJhZGl1cyBvZiBlbGxpcHNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3lSYWRpdXM9MF0gLSBUaGUgdmVydGljYWwgcmFkaXVzIG9mIGVsbGlwc2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0QW5nbGU9MF0gLSBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGVsbGlwc2UsIGluIGRlZ3JlZXMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2VuZEFuZ2xlPTM2MF0gLSBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBlbGxpcHNlLCBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgZWxsaXBzZSBhbmdsZXMgYXJlIGdpdmVuIGFzIGNsb2Nrd2lzZSAoYHRydWVgKSBvciBjb3VudGVyLWNsb2Nrd2lzZSAoYGZhbHNlYCkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3JvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBlbGxpcHNlLCBpbiBkZWdyZWVzLlxyXG4gKi9cclxudmFyIEVsbGlwc2VDdXJ2ZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogQ3VydmUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBFbGxpcHNlQ3VydmUgKHgsIHksIHhSYWRpdXMsIHlSYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBjbG9ja3dpc2UsIHJvdGF0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlnID0geDtcclxuXHJcbiAgICAgICAgICAgIHggPSBHZXRWYWx1ZShjb25maWcsICd4JywgMCk7XHJcbiAgICAgICAgICAgIHkgPSBHZXRWYWx1ZShjb25maWcsICd5JywgMCk7XHJcbiAgICAgICAgICAgIHhSYWRpdXMgPSBHZXRWYWx1ZShjb25maWcsICd4UmFkaXVzJywgMCk7XHJcbiAgICAgICAgICAgIHlSYWRpdXMgPSBHZXRWYWx1ZShjb25maWcsICd5UmFkaXVzJywgeFJhZGl1cyk7XHJcbiAgICAgICAgICAgIHN0YXJ0QW5nbGUgPSBHZXRWYWx1ZShjb25maWcsICdzdGFydEFuZ2xlJywgMCk7XHJcbiAgICAgICAgICAgIGVuZEFuZ2xlID0gR2V0VmFsdWUoY29uZmlnLCAnZW5kQW5nbGUnLCAzNjApO1xyXG4gICAgICAgICAgICBjbG9ja3dpc2UgPSBHZXRWYWx1ZShjb25maWcsICdjbG9ja3dpc2UnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJvdGF0aW9uID0gR2V0VmFsdWUoY29uZmlnLCAncm90YXRpb24nLCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHlSYWRpdXMgPT09IHVuZGVmaW5lZCkgeyB5UmFkaXVzID0geFJhZGl1czsgfVxyXG4gICAgICAgICAgICBpZiAoc3RhcnRBbmdsZSA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0QW5nbGUgPSAwOyB9XHJcbiAgICAgICAgICAgIGlmIChlbmRBbmdsZSA9PT0gdW5kZWZpbmVkKSB7IGVuZEFuZ2xlID0gMzYwOyB9XHJcbiAgICAgICAgICAgIGlmIChjbG9ja3dpc2UgPT09IHVuZGVmaW5lZCkgeyBjbG9ja3dpc2UgPSBmYWxzZTsgfVxyXG4gICAgICAgICAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgeyByb3RhdGlvbiA9IDA7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEN1cnZlLmNhbGwodGhpcywgJ0VsbGlwc2VDdXJ2ZScpO1xyXG5cclxuICAgICAgICAvLyAgQ2VudGVyIHBvaW50XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIGVsbGlwc2UuIFVzZWQgZm9yIGNhbGN1bGF0aW5nIHJvdGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3AwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMCA9IG5ldyBWZWN0b3IyKHgsIHkpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCByYWRpdXMgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkVsbGlwc2UjX3hSYWRpdXNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5feFJhZGl1cyA9IHhSYWRpdXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJ0aWNhbCByYWRpdXMgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkVsbGlwc2UjX3lSYWRpdXNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5feVJhZGl1cyA9IHlSYWRpdXM7XHJcblxyXG4gICAgICAgIC8vICBSYWRpYW5zXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdGFydGluZyBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI19zdGFydEFuZ2xlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0QW5nbGUgPSBEZWdUb1JhZChzdGFydEFuZ2xlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGVuZCBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI19lbmRBbmdsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbmRBbmdsZSA9IERlZ1RvUmFkKGVuZEFuZ2xlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW50aS1jbG9ja3dpc2UgZGlyZWN0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI19jbG9ja3dpc2VcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2Nsb2Nrd2lzZSA9IGNsb2Nrd2lzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJvdGF0aW9uIG9mIHRoZSBhcmMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkVsbGlwc2UjX3JvdGF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3JvdGF0aW9uID0gRGVnVG9SYWQocm90YXRpb24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN0YXJ0aW5nIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNnZXRTdGFydFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBWZWN0b3IyIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBub3QgZ2l2ZW4gd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGN1cnZlLiBJZiBhbiBgb3V0YCBvYmplY3Qgd2FzIGdpdmVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0U3RhcnRQb2ludDogZnVuY3Rpb24gKG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludCgwLCBvdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkVsbGlwc2UjZ2V0UmVzb2x1dGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzaW9ucyAtIE9wdGlvbmFsIGRpdmlzaW9ucyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJ2ZSByZXNvbHV0aW9uLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNvbHV0aW9uOiBmdW5jdGlvbiAoZGl2aXNpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBkaXZpc2lvbnMgKiAyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gbGVuZ3RoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI2dldFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgY3VydmUgdG8gcmV0dXJuLiBXaGVyZSAwIGlzIHRoZSBzdGFydCBhbmQgMSBpcyB0aGUgZW5kLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEEgVmVjdG9yMiBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgbm90IGdpdmVuIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZS4gSWYgYW4gYG91dGAgb2JqZWN0IHdhcyBnaXZlbiB0aGlzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50OiBmdW5jdGlvbiAodCwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xyXG4gICAgICAgIHZhciBkZWx0YUFuZ2xlID0gdGhpcy5fZW5kQW5nbGUgLSB0aGlzLl9zdGFydEFuZ2xlO1xyXG4gICAgICAgIHZhciBzYW1lUG9pbnRzID0gTWF0aC5hYnMoZGVsdGFBbmdsZSkgPCBOdW1iZXIuRVBTSUxPTjtcclxuXHJcbiAgICAgICAgLy8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXHJcbiAgICAgICAgd2hpbGUgKGRlbHRhQW5nbGUgPCAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsdGFBbmdsZSArPSB0d29QaTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChkZWx0YUFuZ2xlID4gdHdvUGkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWx0YUFuZ2xlIC09IHR3b1BpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChzYW1lUG9pbnRzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZWx0YUFuZ2xlID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRlbHRhQW5nbGUgPSB0d29QaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb2Nrd2lzZSAmJiAhc2FtZVBvaW50cylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChkZWx0YUFuZ2xlID09PSB0d29QaSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGVsdGFBbmdsZSA9IC0gdHdvUGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYW5nbGUgPSB0aGlzLl9zdGFydEFuZ2xlICsgdCAqIGRlbHRhQW5nbGU7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLnAwLnggKyB0aGlzLl94UmFkaXVzICogTWF0aC5jb3MoYW5nbGUpO1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy5wMC55ICsgdGhpcy5feVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW9uICE9PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoaXMuX3JvdGF0aW9uKTtcclxuICAgICAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHRoaXMuX3JvdGF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIHZhciB0eCA9IHggLSB0aGlzLnAwLng7XHJcbiAgICAgICAgICAgIHZhciB0eSA9IHkgLSB0aGlzLnAwLnk7XHJcblxyXG4gICAgICAgICAgICAvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgICAgICAgIHggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5wMC54O1xyXG4gICAgICAgICAgICB5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMucDAueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuc2V0KHgsIHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGhvcml6b250YWwgcmFkaXVzIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkVsbGlwc2Ujc2V0WFJhZGl1c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGhvcml6b250YWwgcmFkaXVzIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBjdXJ2ZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFhSYWRpdXM6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnhSYWRpdXMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVydGljYWwgcmFkaXVzIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkVsbGlwc2Ujc2V0WVJhZGl1c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZlcnRpY2FsIHJhZGl1cyBvZiB0aGlzIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgY3VydmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRZUmFkaXVzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy55UmFkaXVzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkVsbGlwc2Ujc2V0V2lkdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB3aWR0aCBvZiB0aGlzIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgY3VydmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRXaWR0aDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueFJhZGl1cyA9IHZhbHVlICogMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkVsbGlwc2Ujc2V0SGVpZ2h0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBjdXJ2ZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEhlaWdodDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueVJhZGl1cyA9IHZhbHVlICogMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc3RhcnQgYW5nbGUgb2YgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNzZXRTdGFydEFuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgc3RhcnQgYW5nbGUgb2YgdGhpcyBjdXJ2ZSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIGN1cnZlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U3RhcnRBbmdsZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RhcnRBbmdsZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbmQgYW5nbGUgb2YgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNzZXRFbmRBbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGVuZCBhbmdsZSBvZiB0aGlzIGN1cnZlLCBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgY3VydmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRFbmRBbmdsZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW5kQW5nbGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBpZiB0aGlzIGN1cnZlIGV4dGVuZHMgY2xvY2t3aXNlIG9yIGFudGktY2xvY2t3aXNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3NldENsb2Nrd2lzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFRoZSBjbG9ja3dpc2Ugc3RhdGUgb2YgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIGN1cnZlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q2xvY2t3aXNlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcm90YXRpb24gb2YgdGhpcyBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNzZXRSb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHJvdGF0aW9uIG9mIHRoaXMgY3VydmUsIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBjdXJ2ZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFJvdGF0aW9uOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3hcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wMC54O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wMC54ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3lcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wMC55O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wMC55ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbCByYWRpdXMgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3hSYWRpdXNcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeFJhZGl1czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feFJhZGl1cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3hSYWRpdXMgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJ0aWNhbCByYWRpdXMgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3lSYWRpdXNcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeVJhZGl1czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feVJhZGl1cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3lSYWRpdXMgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiBkZWdyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNzdGFydEFuZ2xlXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0QW5nbGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJhZFRvRGVnKHRoaXMuX3N0YXJ0QW5nbGUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRBbmdsZSA9IERlZ1RvUmFkKHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBlbmQgYW5nbGUgb2YgdGhlIGVsbGlwc2UgaW4gZGVncmVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLkVsbGlwc2UjZW5kQW5nbGVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZW5kQW5nbGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJhZFRvRGVnKHRoaXMuX2VuZEFuZ2xlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZEFuZ2xlID0gRGVnVG9SYWQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogYHRydWVgIGlmIHRoZSBlbGxpcHNlIHJvdGF0aW9uIGlzIGNsb2Nrd2lzZSBvciBgZmFsc2VgIGlmIGFudGktY2xvY2t3aXNlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuRWxsaXBzZSNjbG9ja3dpc2VcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNsb2Nrd2lzZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xvY2t3aXNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xvY2t3aXNlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVsbGlwc2UsIHJlbGF0aXZlIHRvIHRoZSBjZW50ZXIsIGluIGRlZ3JlZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI2FuZ2xlXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICovXHJcbiAgICBhbmdsZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUmFkVG9EZWcodGhpcy5fcm90YXRpb24pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSBEZWdUb1JhZCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVsbGlwc2UsIHJlbGF0aXZlIHRvIHRoZSBjZW50ZXIsIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3JvdGF0aW9uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJvdGF0aW9uOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBKU09OIHNlcmlhbGl6YXRpb24gb2YgdGhlIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5FbGxpcHNlI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09ORWxsaXBzZUN1cnZlfSBUaGUgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGlzIGN1cnZlIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIHg6IHRoaXMucDAueCxcclxuICAgICAgICAgICAgeTogdGhpcy5wMC55LFxyXG4gICAgICAgICAgICB4UmFkaXVzOiB0aGlzLl94UmFkaXVzLFxyXG4gICAgICAgICAgICB5UmFkaXVzOiB0aGlzLl95UmFkaXVzLFxyXG4gICAgICAgICAgICBzdGFydEFuZ2xlOiBSYWRUb0RlZyh0aGlzLl9zdGFydEFuZ2xlKSxcclxuICAgICAgICAgICAgZW5kQW5nbGU6IFJhZFRvRGVnKHRoaXMuX2VuZEFuZ2xlKSxcclxuICAgICAgICAgICAgY2xvY2t3aXNlOiB0aGlzLl9jbG9ja3dpc2UsXHJcbiAgICAgICAgICAgIHJvdGF0aW9uOiBSYWRUb0RlZyh0aGlzLl9yb3RhdGlvbilcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGN1cnZlIGZyb20gdGhlIHByb3ZpZGVkIEVsbGlwc2UgQ3VydmUgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuQ3VydmVzLkVsbGlwc2UuZnJvbUpTT05cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09ORWxsaXBzZUN1cnZlfSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhpcyBjdXJ2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuQ3VydmVzLkVsbGlwc2V9IFRoZSBlbGxpcHNlIGN1cnZlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxuRWxsaXBzZUN1cnZlLmZyb21KU09OID0gZnVuY3Rpb24gKGRhdGEpXHJcbntcclxuICAgIHJldHVybiBuZXcgRWxsaXBzZUN1cnZlKGRhdGEpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFbGxpcHNlQ3VydmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIEJhc2VkIG9uIHRoZSB0aHJlZS5qcyBDdXJ2ZSBjbGFzc2VzIGNyZWF0ZWQgYnkgW3p6ODVdKGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cpXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ3VydmUgPSByZXF1aXJlKCcuL0N1cnZlJyk7XHJcbnZhciBGcm9tUG9pbnRzID0gcmVxdWlyZSgnLi4vZ2VvbS9yZWN0YW5nbGUvRnJvbVBvaW50cycpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG52YXIgdG1wVmVjMiA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIExpbmVDdXJ2ZSBpcyBhIFwiY3VydmVcIiBjb21wcmlzaW5nIGV4YWN0bHkgdHdvIHBvaW50cyAoYSBsaW5lIHNlZ21lbnQpLlxyXG4gKlxyXG4gKiBAY2xhc3MgTGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuQ3VydmVzLkN1cnZlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuQ3VydmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxudW1iZXJbXSl9IHAwIC0gVGhlIGZpcnN0IGVuZHBvaW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwMV0gLSBUaGUgc2Vjb25kIGVuZHBvaW50LlxyXG4gKi9cclxudmFyIExpbmVDdXJ2ZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogQ3VydmUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICAvLyAgdmVjMnMgb3IgYXJyYXlcclxuICAgIGZ1bmN0aW9uIExpbmVDdXJ2ZSAocDAsIHAxKVxyXG4gICAge1xyXG4gICAgICAgIEN1cnZlLmNhbGwodGhpcywgJ0xpbmVDdXJ2ZScpO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwMCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwMSA9IG5ldyBWZWN0b3IyKHAwWzJdLCBwMFszXSk7XHJcbiAgICAgICAgICAgIHAwID0gbmV3IFZlY3RvcjIocDBbMF0sIHAwWzFdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmaXJzdCBlbmRwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuTGluZSNwMFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucDAgPSBwMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNlY29uZCBlbmRwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuTGluZSNwMVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucDEgPSBwMTtcclxuXHJcbiAgICAgICAgLy8gIE92ZXJyaWRlIGRlZmF1bHQgQ3VydmUuYXJjTGVuZ3RoRGl2aXNpb25zXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBxdWFudGl0eSBvZiBhcmMgbGVuZ3RoIGRpdmlzaW9ucyB3aXRoaW4gdGhlIGN1cnZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5MaW5lI2FyY0xlbmd0aERpdmlzaW9uc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIFJlY3RhbmdsZSB3aGVyZSB0aGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgbWF0Y2ggdGhlIGJvdW5kcyBvZiB0aGlzIEN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5MaW5lI2dldEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gW291dF0gLSBBIFJlY3RhbmdsZSBvYmplY3QgdG8gc3RvcmUgdGhlIGJvdW5kcyBpbi4gSWYgbm90IGdpdmVuIGEgbmV3IFJlY3RhbmdsZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBBIFJlY3RhbmdsZSBvYmplY3QgaG9sZGluZyB0aGUgYm91bmRzIG9mIHRoaXMgY3VydmUuIElmIGBvdXRgIHdhcyBnaXZlbiBpdCB3aWxsIGJlIHRoaXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uIChvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBSZWN0YW5nbGUoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gRnJvbVBvaW50cyhbIHRoaXMucDAsIHRoaXMucDEgXSwgb3V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdGFydGluZyBwb2ludCBvbiB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkxpbmUjZ2V0U3RhcnRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEEgVmVjdG9yMiBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgbm90IGdpdmVuIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZS4gSWYgYW4gYG91dGAgb2JqZWN0IHdhcyBnaXZlbiB0aGlzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFN0YXJ0UG9pbnQ6IGZ1bmN0aW9uIChvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dC5jb3B5KHRoaXMucDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkxpbmUjZ2V0UmVzb2x1dGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9MV0gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucyB0byBjb25zaWRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXNvbHV0aW9uLiBFcXVhbCB0byB0aGUgbnVtYmVyIG9mIGRpdmlzaW9ucy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzb2x1dGlvbjogZnVuY3Rpb24gKGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoZGl2aXNpb25zID09PSB1bmRlZmluZWQpIHsgZGl2aXNpb25zID0gMTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGl2aXNpb25zO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gbGVuZ3RoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5MaW5lI2dldFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgY3VydmUgdG8gcmV0dXJuLiBXaGVyZSAwIGlzIHRoZSBzdGFydCBhbmQgMSBpcyB0aGUgZW5kLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEEgVmVjdG9yMiBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgbm90IGdpdmVuIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZS4gSWYgYW4gYG91dGAgb2JqZWN0IHdhcyBnaXZlbiB0aGlzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50OiBmdW5jdGlvbiAodCwgb3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIGlmICh0ID09PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG91dC5jb3B5KHRoaXMucDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3V0LmNvcHkodGhpcy5wMSkuc3VidHJhY3QodGhpcy5wMCkuc2NhbGUodCkuYWRkKHRoaXMucDApO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBwb2ludCBhdCBhIGdpdmVuIHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5MaW5lI2dldFBvaW50QXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gVGhlIHBvc2l0aW9uIGFsb25nIHRoZSBjdXJ2ZSB0byByZXR1cm4uIFdoZXJlIDAgaXMgdGhlIHN0YXJ0IGFuZCAxIGlzIHRoZSBlbmQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBWZWN0b3IyIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBub3QgZ2l2ZW4gd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGN1cnZlLiBJZiBhbiBgb3V0YCBvYmplY3Qgd2FzIGdpdmVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRBdDogZnVuY3Rpb24gKHUsIG91dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQb2ludCh1LCBvdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHNsb3BlIG9mIHRoZSBsaW5lIGFzIGEgdW5pdCB2ZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLkxpbmUjZ2V0VGFuZ2VudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSB0YW5nZW50IHZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZ2V0VGFuZ2VudDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGFuZ2VudCA9IHRtcFZlYzIuY29weSh0aGlzLnAxKS5zdWJ0cmFjdCh0aGlzLnAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuTGluZSNnZXRVdG9UbWFwcGluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHUgLSBBIGZsb2F0IGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpdmlzaW9uc10gLSBPcHRpb25hbCBhbW91bnQgb2YgZGl2aXNpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVxdWlkaXN0YW50IHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKHUsIGRpc3RhbmNlLCBkaXZpc2lvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHQ7XHJcblxyXG4gICAgICAgIGlmIChkaXN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKGRpdmlzaW9ucyk7XHJcbiAgICAgICAgICAgIHZhciBsaW5lTGVuZ3RoID0gYXJjTGVuZ3Roc1thcmNMZW5ndGhzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgLy8gIENhbm5vdCBvdmVyc2hvb3QgdGhlIGN1cnZlXHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRMaW5lTGVuZ3RoID0gTWF0aC5taW4oZGlzdGFuY2UsIGxpbmVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgdCA9IHRhcmdldExpbmVMZW5ndGggLyBsaW5lTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ID0gdTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyAgT3ZlcnJpZGUgZGVmYXVsdCBDdXJ2ZS5kcmF3IGJlY2F1c2UgdGhpcyBpcyBiZXR0ZXIgdGhhbiBjYWxsaW5nIGdldFBvaW50cyBvbiBhIGxpbmUhXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGlzIGN1cnZlIG9uIHRoZSBnaXZlbiBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGN1cnZlIGlzIGRyYXduIHVzaW5nIGBHcmFwaGljcy5saW5lQmV0d2VlbmAgc28gd2lsbCBiZSBkcmF3biBhdCB3aGF0ZXZlciB0aGUgcHJlc2VudCBHcmFwaGljcyBsaW5lIGNvbG9yIGlzLlxyXG4gICAgICogVGhlIEdyYXBoaWNzIG9iamVjdCBpcyBub3QgY2xlYXJlZCBiZWZvcmUgdGhlIGRyYXcsIHNvIHRoZSBjdXJ2ZSB3aWxsIGFwcGVhciBvbi10b3Agb2YgYW55dGhpbmcgZWxzZSBhbHJlYWR5IHJlbmRlcmVkIHRvIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5MaW5lI2RyYXdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IEcgLSBbZ3JhcGhpY3MsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3MgLSBUaGUgR3JhcGhpY3MgaW5zdGFuY2Ugb250byB3aGljaCB0aGlzIGN1cnZlIHdpbGwgYmUgZHJhd24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBUaGUgR3JhcGhpY3Mgb2JqZWN0IHRvIHdoaWNoIHRoZSBjdXJ2ZSB3YXMgZHJhd24uXHJcbiAgICAgKi9cclxuICAgIGRyYXc6IGZ1bmN0aW9uIChncmFwaGljcylcclxuICAgIHtcclxuICAgICAgICBncmFwaGljcy5saW5lQmV0d2Vlbih0aGlzLnAwLngsIHRoaXMucDAueSwgdGhpcy5wMS54LCB0aGlzLnAxLnkpO1xyXG5cclxuICAgICAgICAvLyAgU28geW91IGNhbiBjaGFpbiBncmFwaGljcyBjYWxsc1xyXG4gICAgICAgIHJldHVybiBncmFwaGljcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuTGluZSN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5DdXJ2ZXMuSlNPTkN1cnZlfSBUaGUgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGlzIGN1cnZlIGRhdGEuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIHBvaW50czogW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wMC54LCB0aGlzLnAwLnksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnAxLngsIHRoaXMucDEueVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIENvbmZpZ3VyZXMgdGhpcyBsaW5lIGZyb20gYSBKU09OIHJlcHJlc2VudGF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkN1cnZlcy5MaW5lLmZyb21KU09OXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5DdXJ2ZXMuSlNPTkN1cnZlfSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhpcyBjdXJ2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuQ3VydmVzLkxpbmV9IEEgbmV3IExpbmVDdXJ2ZSBvYmplY3QuXHJcbiAqL1xyXG5MaW5lQ3VydmUuZnJvbUpTT04gPSBmdW5jdGlvbiAoZGF0YSlcclxue1xyXG4gICAgdmFyIHBvaW50cyA9IGRhdGEucG9pbnRzO1xyXG5cclxuICAgIHZhciBwMCA9IG5ldyBWZWN0b3IyKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcclxuICAgIHZhciBwMSA9IG5ldyBWZWN0b3IyKHBvaW50c1syXSwgcG9pbnRzWzNdKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IExpbmVDdXJ2ZShwMCwgcDEpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQ3VydmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEN1cnZlID0gcmVxdWlyZSgnLi9DdXJ2ZScpO1xyXG52YXIgUXVhZHJhdGljQmV6aWVySW50ZXJwb2xhdGlvbiA9IHJlcXVpcmUoJy4uL21hdGgvaW50ZXJwb2xhdGlvbi9RdWFkcmF0aWNCZXppZXJJbnRlcnBvbGF0aW9uJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHF1YWRyYXRpYyBCw6l6aWVyIGN1cnZlIGNvbnN0cnVjdGVkIGZyb20gdHdvIGNvbnRyb2wgcG9pbnRzLlxyXG4gKlxyXG4gKiBAY2xhc3MgUXVhZHJhdGljQmV6aWVyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5DdXJ2ZXMuQ3VydmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5DdXJ2ZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjIuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG51bWJlcltdKX0gcDAgLSBTdGFydCBwb2ludCwgb3IgYW4gYXJyYXkgb2YgcG9pbnQgcGFpcnMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gcDEgLSBDb250cm9sIFBvaW50IDEuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gcDIgLSBDb250cm9sIFBvaW50IDIuXHJcbiAqL1xyXG52YXIgUXVhZHJhdGljQmV6aWVyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBDdXJ2ZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciAocDAsIHAxLCBwMilcclxuICAgIHtcclxuICAgICAgICBDdXJ2ZS5jYWxsKHRoaXMsICdRdWFkcmF0aWNCZXppZXInKTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocDApKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcDIgPSBuZXcgVmVjdG9yMihwMFs0XSwgcDBbNV0pO1xyXG4gICAgICAgICAgICBwMSA9IG5ldyBWZWN0b3IyKHAwWzJdLCBwMFszXSk7XHJcbiAgICAgICAgICAgIHAwID0gbmV3IFZlY3RvcjIocDBbMF0sIHAwWzFdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdGFydCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuUXVhZHJhdGljQmV6aWVyI3AwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMCA9IHAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuUXVhZHJhdGljQmV6aWVyI3AxXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wMSA9IHAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLlF1YWRyYXRpY0JlemllciNwMlxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucDIgPSBwMjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdGFydGluZyBwb2ludCBvbiB0aGUgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlF1YWRyYXRpY0JlemllciNnZXRTdGFydFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBWZWN0b3IyIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBub3QgZ2l2ZW4gd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGN1cnZlLiBJZiBhbiBgb3V0YCBvYmplY3Qgd2FzIGdpdmVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0U3RhcnRQb2ludDogZnVuY3Rpb24gKG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0LmNvcHkodGhpcy5wMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUXVhZHJhdGljQmV6aWVyI2dldFJlc29sdXRpb25cclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc2lvbnMgLSBPcHRpb25hbCBkaXZpc2lvbnMgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VydmUgcmVzb2x1dGlvbi5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzb2x1dGlvbjogZnVuY3Rpb24gKGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZGl2aXNpb25zO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gbGVuZ3RoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5RdWFkcmF0aWNCZXppZXIjZ2V0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIHBvc2l0aW9uIGFsb25nIHRoZSBjdXJ2ZSB0byByZXR1cm4uIFdoZXJlIDAgaXMgdGhlIHN0YXJ0IGFuZCAxIGlzIHRoZSBlbmQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBWZWN0b3IyIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBub3QgZ2l2ZW4gd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGN1cnZlLiBJZiBhbiBgb3V0YCBvYmplY3Qgd2FzIGdpdmVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uICh0LCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIHAwID0gdGhpcy5wMDtcclxuICAgICAgICB2YXIgcDEgPSB0aGlzLnAxO1xyXG4gICAgICAgIHZhciBwMiA9IHRoaXMucDI7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuc2V0KFxyXG4gICAgICAgICAgICBRdWFkcmF0aWNCZXppZXJJbnRlcnBvbGF0aW9uKHQsIHAwLngsIHAxLngsIHAyLngpLFxyXG4gICAgICAgICAgICBRdWFkcmF0aWNCZXppZXJJbnRlcnBvbGF0aW9uKHQsIHAwLnksIHAxLnksIHAyLnkpXHJcbiAgICAgICAgKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyB0aGlzIGN1cnZlIG9uIHRoZSBnaXZlbiBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGN1cnZlIGlzIGRyYXduIHVzaW5nIGBHcmFwaGljcy5zdHJva2VQb2ludHNgIHNvIHdpbGwgYmUgZHJhd24gYXQgd2hhdGV2ZXIgdGhlIHByZXNlbnQgR3JhcGhpY3Mgc3Ryb2tlIGNvbG9yIGlzLlxyXG4gICAgICogVGhlIEdyYXBoaWNzIG9iamVjdCBpcyBub3QgY2xlYXJlZCBiZWZvcmUgdGhlIGRyYXcsIHNvIHRoZSBjdXJ2ZSB3aWxsIGFwcGVhciBvbi10b3Agb2YgYW55dGhpbmcgZWxzZSBhbHJlYWR5IHJlbmRlcmVkIHRvIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5RdWFkcmF0aWNCZXppZXIjZHJhd1xyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gRyAtIFtncmFwaGljcywkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIGBHcmFwaGljc2Agb2JqZWN0IHRvIGRyYXcgb250by5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3BvaW50c1RvdGFsPTMyXSAtIE51bWJlciBvZiBwb2ludHMgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyB0aGUgY3VydmUuIEhpZ2hlciBudW1iZXJzIHJlc3VsdCBpbiBzbW9vdGhlciBjdXJ2ZSBidXQgcmVxdWlyZSBtb3JlIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBgR3JhcGhpY3NgIG9iamVjdCB0aGF0IHdhcyBkcmF3biB0by5cclxuICAgICAqL1xyXG4gICAgZHJhdzogZnVuY3Rpb24gKGdyYXBoaWNzLCBwb2ludHNUb3RhbClcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRzVG90YWwgPT09IHVuZGVmaW5lZCkgeyBwb2ludHNUb3RhbCA9IDMyOyB9XHJcblxyXG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmdldFBvaW50cyhwb2ludHNUb3RhbCk7XHJcblxyXG4gICAgICAgIGdyYXBoaWNzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGdyYXBoaWNzLm1vdmVUbyh0aGlzLnAwLngsIHRoaXMucDAueSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ3JhcGhpY3MubGluZVRvKHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmFwaGljcy5zdHJva2VQYXRoKCk7XHJcblxyXG4gICAgICAgIC8vICBTbyB5b3UgY2FuIGNoYWluIGdyYXBoaWNzIGNhbGxzXHJcbiAgICAgICAgcmV0dXJuIGdyYXBoaWNzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSBjdXJ2ZSBpbnRvIGEgSlNPTiBjb21wYXRpYmxlIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUXVhZHJhdGljQmV6aWVyI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09OQ3VydmV9IFRoZSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoaXMgY3VydmUgZGF0YS5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgICAgICAgcG9pbnRzOiBbXHJcbiAgICAgICAgICAgICAgICB0aGlzLnAwLngsIHRoaXMucDAueSxcclxuICAgICAgICAgICAgICAgIHRoaXMucDEueCwgdGhpcy5wMS55LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5wMi54LCB0aGlzLnAyLnlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgY3VydmUgZnJvbSBhIEpTT04gb2JqZWN0LCBlLiBnLiBjcmVhdGVkIGJ5IGB0b0pTT05gLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkN1cnZlcy5RdWFkcmF0aWNCZXppZXIuZnJvbUpTT05cclxuICogQHNpbmNlIDMuMi4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09OQ3VydmV9IGRhdGEgLSBUaGUgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGlzIGN1cnZlIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5DdXJ2ZXMuUXVhZHJhdGljQmV6aWVyfSBUaGUgY3JlYXRlZCBjdXJ2ZSBpbnN0YW5jZS5cclxuICovXHJcblF1YWRyYXRpY0Jlemllci5mcm9tSlNPTiA9IGZ1bmN0aW9uIChkYXRhKVxyXG57XHJcbiAgICB2YXIgcG9pbnRzID0gZGF0YS5wb2ludHM7XHJcblxyXG4gICAgdmFyIHAwID0gbmV3IFZlY3RvcjIocG9pbnRzWzBdLCBwb2ludHNbMV0pO1xyXG4gICAgdmFyIHAxID0gbmV3IFZlY3RvcjIocG9pbnRzWzJdLCBwb2ludHNbM10pO1xyXG4gICAgdmFyIHAyID0gbmV3IFZlY3RvcjIocG9pbnRzWzRdLCBwb2ludHNbNV0pO1xyXG5cclxuICAgIHJldHVybiBuZXcgUXVhZHJhdGljQmV6aWVyKHAwLCBwMSwgcDIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWFkcmF0aWNCZXppZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIEJhc2VkIG9uIHRoZSB0aHJlZS5qcyBDdXJ2ZSBjbGFzc2VzIGNyZWF0ZWQgYnkgW3p6ODVdKGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cpXHJcblxyXG52YXIgQ2F0bXVsbFJvbSA9IHJlcXVpcmUoJy4uL21hdGgvQ2F0bXVsbFJvbScpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ3VydmUgPSByZXF1aXJlKCcuL0N1cnZlJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBDcmVhdGUgYSBzbW9vdGggMmQgc3BsaW5lIGN1cnZlIGZyb20gYSBzZXJpZXMgb2YgcG9pbnRzLlxyXG4gKlxyXG4gKiBAY2xhc3MgU3BsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5DdXJ2ZXMuQ3VydmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5DdXJ2ZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyW118bnVtYmVyW118bnVtYmVyW11bXSl9IFtwb2ludHNdIC0gVGhlIHBvaW50cyB0aGF0IGNvbmZpZ3VyZSB0aGUgY3VydmUuXHJcbiAqL1xyXG52YXIgU3BsaW5lQ3VydmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEN1cnZlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3BsaW5lQ3VydmUgKHBvaW50cylcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRzID09PSB1bmRlZmluZWQpIHsgcG9pbnRzID0gW107IH1cclxuXHJcbiAgICAgICAgQ3VydmUuY2FsbCh0aGlzLCAnU3BsaW5lQ3VydmUnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFZlY3RvcjIgcG9pbnRzIHRoYXQgY29uZmlndXJlIHRoZSBjdXJ2ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuU3BsaW5lI3BvaW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyW119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmFkZFBvaW50cyhwb2ludHMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGxpc3Qgb2YgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgVmVjdG9yMiBwb2ludHMgb2YgdGhlIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5TcGxpbmUjYWRkUG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyW118bnVtYmVyW118bnVtYmVyW11bXSl9IHBvaW50cyAtIFRoZSBwb2ludHMgdGhhdCBjb25maWd1cmUgdGhlIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgY3VydmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGRQb2ludHM6IGZ1bmN0aW9uIChwb2ludHMpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcCA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBvaW50c1tpXSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHAueCA9IHBvaW50c1tpXTtcclxuICAgICAgICAgICAgICAgIHAueSA9IHBvaW50c1tpICsgMV07XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbaV0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgQW4gYXJyYXkgb2YgYXJyYXlzP1xyXG4gICAgICAgICAgICAgICAgcC54ID0gcG9pbnRzW2ldWzBdO1xyXG4gICAgICAgICAgICAgICAgcC55ID0gcG9pbnRzW2ldWzFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcC54ID0gcG9pbnRzW2ldLng7XHJcbiAgICAgICAgICAgICAgICBwLnkgPSBwb2ludHNbaV0ueTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wb2ludHMucHVzaChwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIHBvaW50IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgVmVjdG9yMiBwb2ludHMgb2YgdGhlIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5TcGxpbmUjYWRkUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIGN1cnZlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhpcyBjdXJ2ZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBuZXcgVmVjdG9yMiBhZGRlZCB0byB0aGUgY3VydmVcclxuICAgICAqL1xyXG4gICAgYWRkUG9pbnQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2ZWMgPSBuZXcgVmVjdG9yMih4LCB5KTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludHMucHVzaCh2ZWMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmVjO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN0YXJ0aW5nIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuU3BsaW5lI2dldFN0YXJ0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBBIFZlY3RvcjIgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIG5vdCBnaXZlbiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludCBvbiB0aGUgY3VydmUuIElmIGFuIGBvdXRgIG9iamVjdCB3YXMgZ2l2ZW4gdGhpcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBnZXRTdGFydFBvaW50OiBmdW5jdGlvbiAob3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQuY29weSh0aGlzLnBvaW50c1swXSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBjdXJ2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuU3BsaW5lI2dldFJlc29sdXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc2lvbnMgLSBPcHRpb25hbCBkaXZpc2lvbnMgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VydmUgcmVzb2x1dGlvbi5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzb2x1dGlvbjogZnVuY3Rpb24gKGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZGl2aXNpb25zICogdGhpcy5wb2ludHMubGVuZ3RoO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gbGVuZ3RoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5TcGxpbmUjZ2V0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIHBvc2l0aW9uIGFsb25nIHRoZSBjdXJ2ZSB0byByZXR1cm4uIFdoZXJlIDAgaXMgdGhlIHN0YXJ0IGFuZCAxIGlzIHRoZSBlbmQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQSBWZWN0b3IyIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0IGluLiBJZiBub3QgZ2l2ZW4gd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGN1cnZlLiBJZiBhbiBgb3V0YCBvYmplY3Qgd2FzIGdpdmVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uICh0LCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xyXG5cclxuICAgICAgICB2YXIgcG9pbnQgPSAocG9pbnRzLmxlbmd0aCAtIDEpICogdDtcclxuXHJcbiAgICAgICAgdmFyIGludFBvaW50ID0gTWF0aC5mbG9vcihwb2ludCk7XHJcblxyXG4gICAgICAgIHZhciB3ZWlnaHQgPSBwb2ludCAtIGludFBvaW50O1xyXG5cclxuICAgICAgICB2YXIgcDAgPSBwb2ludHNbKGludFBvaW50ID09PSAwKSA/IGludFBvaW50IDogaW50UG9pbnQgLSAxXTtcclxuICAgICAgICB2YXIgcDEgPSBwb2ludHNbaW50UG9pbnRdO1xyXG4gICAgICAgIHZhciBwMiA9IHBvaW50c1soaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMikgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMV07XHJcbiAgICAgICAgdmFyIHAzID0gcG9pbnRzWyhpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzKSA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dC5zZXQoQ2F0bXVsbFJvbSh3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLngpLCBDYXRtdWxsUm9tKHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4cG9ydHMgYSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoaXMgY3VydmUgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuU3BsaW5lI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09OQ3VydmV9IFRoZSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoaXMgY3VydmUgZGF0YS5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHRoaXMucG9pbnRzW2ldLngpO1xyXG4gICAgICAgICAgICBwb2ludHMucHVzaCh0aGlzLnBvaW50c1tpXS55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcclxuICAgICAgICAgICAgcG9pbnRzOiBwb2ludHNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogSW1wb3J0cyBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhpcyBjdXJ2ZSBkYXRhLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkN1cnZlcy5TcGxpbmUuZnJvbUpTT05cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09OQ3VydmV9IGRhdGEgLSBUaGUgSlNPTiBvYmplY3QgY29udGFpbmluZyB0aGlzIGN1cnZlIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5DdXJ2ZXMuU3BsaW5lfSBUaGUgc3BsaW5lIGN1cnZlIGNyZWF0ZWQuXHJcbiAqL1xyXG5TcGxpbmVDdXJ2ZS5mcm9tSlNPTiA9IGZ1bmN0aW9uIChkYXRhKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IFNwbGluZUN1cnZlKGRhdGEucG9pbnRzKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3BsaW5lQ3VydmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkN1cnZlc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgUGF0aDogcmVxdWlyZSgnLi9wYXRoL1BhdGgnKSxcclxuXHJcbiAgICBDdWJpY0JlemllcjogcmVxdWlyZSgnLi9DdWJpY0JlemllckN1cnZlJyksXHJcbiAgICBDdXJ2ZTogcmVxdWlyZSgnLi9DdXJ2ZScpLFxyXG4gICAgRWxsaXBzZTogcmVxdWlyZSgnLi9FbGxpcHNlQ3VydmUnKSxcclxuICAgIExpbmU6IHJlcXVpcmUoJy4vTGluZUN1cnZlJyksXHJcbiAgICBRdWFkcmF0aWNCZXppZXI6IHJlcXVpcmUoJy4vUXVhZHJhdGljQmV6aWVyQ3VydmUnKSxcclxuICAgIFNwbGluZTogcmVxdWlyZSgnLi9TcGxpbmVDdXJ2ZScpXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgTW92ZVRvIEN1cnZlIGlzIGEgdmVyeSBzaW1wbGUgY3VydmUgY29uc2lzdGluZyBvZiBvbmx5IGEgc2luZ2xlIHBvaW50LiBJdHMgaW50ZW5kZWQgdXNlIGlzIHRvIG1vdmUgdGhlIGVuZGluZyBwb2ludCBpbiBhIFBhdGguXHJcbiAqXHJcbiAqIEBjbGFzcyBNb3ZlVG9cclxuICogQG1lbWJlcm9mIFBoYXNlci5DdXJ2ZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3hdIC0gYHhgIHBpeGVsIGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBgeWAgcGl4ZWwgY29vcmRpbmF0ZS5cclxuICovXHJcbnZhciBNb3ZlVG8gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTW92ZVRvICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBTa2lwIGxlbmd0aCBjYWxjcyBpbiBwYXRoc1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZW5vdGVzIHRoYXQgdGhpcyBDdXJ2ZSBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIGJvdW5kcywgcG9pbnRzLCBhbmQgZHJhd2luZyBvZiBpdHMgcGFyZW50IFBhdGguIE11c3QgYmUgYGZhbHNlYCBvciBzb21lIG1ldGhvZHMgaW4gdGhlIHBhcmVudCBQYXRoIHdpbGwgdGhyb3cgZXJyb3JzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5Nb3ZlVG8jYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9uZSBwb2ludCB3aGljaCB0aGlzIGN1cnZlIGNvbnNpc3RzIG9mLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5Nb3ZlVG8jcDBcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnAwID0gbmV3IFZlY3RvcjIoeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHBvaW50IGF0IHJlbGF0aXZlIHBvc2l0aW9uIGluIGN1cnZlIGFjY29yZGluZyB0byBsZW5ndGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLk1vdmVUbyNnZXRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgcG9zaXRpb24gYWxvbmcgdGhlIGN1cnZlIHRvIHJldHVybi4gV2hlcmUgMCBpcyB0aGUgc3RhcnQgYW5kIDEgaXMgdGhlIGVuZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBBIFZlY3RvcjIgb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIG5vdCBnaXZlbiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludCBvbiB0aGUgY3VydmUuIElmIGFuIGBvdXRgIG9iamVjdCB3YXMgZ2l2ZW4gdGhpcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludDogZnVuY3Rpb24gKHQsIG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0LmNvcHkodGhpcy5wMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBwb2ludCBhdCBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgY3VydmUuIFRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoaXMgY3VydmUncyBvbmx5IHBvaW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5Nb3ZlVG8jZ2V0UG9pbnRBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHUgLSBUaGUgcG9zaXRpb24gaW4gdGhlIHBhdGggdG8gcmV0cmlldmUsIGJldHdlZW4gMCBhbmQgMS4gTm90IHVzZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gQW4gb3B0aW9uYWwgdmVjdG9yIGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgbW9kaWZpZWQgYG91dGAgdmVjdG9yLCBvciBhIG5ldyBgVmVjdG9yMmAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50QXQ6IGZ1bmN0aW9uICh1LCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnQodSwgb3V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSByZXNvbHV0aW9uIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLk1vdmVUbyNnZXRSZXNvbHV0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXNvbHV0aW9uIG9mIHRoaXMgY3VydmUuIEZvciBhIE1vdmVUbyB0aGUgdmFsdWUgaXMgYWx3YXlzIDEuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc29sdXRpb246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoaXMgY3VydmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLk1vdmVUbyNnZXRMZW5ndGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIGN1cnZlLiBGb3IgYSBNb3ZlVG8gdGhlIHZhbHVlIGlzIGFsd2F5cyAwLlxyXG4gICAgICovXHJcbiAgICBnZXRMZW5ndGg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhpcyBjdXJ2ZSBpbnRvIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5Nb3ZlVG8jdG9KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuQ3VydmVzLkpTT05DdXJ2ZX0gQSBwcmltaXRpdmUgb2JqZWN0IHdpdGggdGhlIGN1cnZlJ3MgdHlwZSBhbmQgb25seSBwb2ludC5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdNb3ZlVG8nLFxyXG4gICAgICAgICAgICBwb2ludHM6IFtcclxuICAgICAgICAgICAgICAgIHRoaXMucDAueCwgdGhpcy5wMC55XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1vdmVUbztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgQmFzZWQgb24gdGhlIHRocmVlLmpzIEN1cnZlIGNsYXNzZXMgY3JlYXRlZCBieSBbeno4NV0oaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZylcclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDdWJpY0JlemllckN1cnZlID0gcmVxdWlyZSgnLi4vQ3ViaWNCZXppZXJDdXJ2ZScpO1xyXG52YXIgRWxsaXBzZUN1cnZlID0gcmVxdWlyZSgnLi4vRWxsaXBzZUN1cnZlJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBMaW5lQ3VydmUgPSByZXF1aXJlKCcuLi9MaW5lQ3VydmUnKTtcclxudmFyIE1vdmVQYXRoVG8gPSByZXF1aXJlKCcuL01vdmVUbycpO1xyXG52YXIgUXVhZHJhdGljQmV6aWVyQ3VydmUgPSByZXF1aXJlKCcuLi9RdWFkcmF0aWNCZXppZXJDdXJ2ZScpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBTcGxpbmVDdXJ2ZSA9IHJlcXVpcmUoJy4uL1NwbGluZUN1cnZlJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBQYXRoIGNvbWJpbmVzIG11bHRpcGxlIEN1cnZlcyBpbnRvIG9uZSBjb250aW51b3VzIGNvbXBvdW5kIGN1cnZlLlxyXG4gKiBJdCBkb2VzIG5vdCBtYXR0ZXIgaG93IG1hbnkgQ3VydmVzIGFyZSBpbiB0aGUgUGF0aCBvciB3aGF0IHR5cGUgdGhleSBhcmUuXHJcbiAqXHJcbiAqIEEgQ3VydmUgaW4gYSBQYXRoIGRvZXMgbm90IGhhdmUgdG8gc3RhcnQgd2hlcmUgdGhlIHByZXZpb3VzIEN1cnZlIGVuZHMgLSB0aGF0IGlzIHRvIHNheSwgYSBQYXRoIGRvZXMgbm90XHJcbiAqIGhhdmUgdG8gYmUgYW4gdW5pbnRlcnJ1cHRlZCBjdXJ2ZS4gT25seSB0aGUgb3JkZXIgb2YgdGhlIEN1cnZlcyBpbmZsdWVuY2VzIHRoZSBhY3R1YWwgcG9pbnRzIG9uIHRoZSBQYXRoLlxyXG4gKlxyXG4gKiBAY2xhc3MgUGF0aFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkN1cnZlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIFBhdGgncyBzdGFydGluZyBwb2ludCBvciBhIHtAbGluayBQaGFzZXIuVHlwZXMuQ3VydmVzLkpTT05QYXRofS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgUGF0aCdzIHN0YXJ0aW5nIHBvaW50LlxyXG4gKi9cclxudmFyIFBhdGggPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUGF0aCAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIFBhdGguXHJcbiAgICAgICAgICogRW1wdHkgYnkgZGVmYXVsdCBhbmQgbmV2ZXIgcG9wdWxhdGVkIGJ5IFBoYXNlciwgdGhpcyBpcyBsZWZ0IGZvciBkZXZlbG9wZXJzIHRvIHVzZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuUGF0aCNuYW1lXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnJ1xyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9ICcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbGlzdCBvZiBDdXJ2ZXMgd2hpY2ggbWFrZSB1cCB0aGlzIFBhdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLlBhdGgjY3VydmVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DdXJ2ZXMuQ3VydmVbXX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VydmVzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWNoZWQgbGVuZ3RoIG9mIGVhY2ggQ3VydmUgaW4gdGhlIFBhdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkge0BsaW5rICNnZXRDdXJ2ZUxlbmd0aHN9LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5QYXRoI2NhY2hlTGVuZ3Roc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJbXX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGVMZW5ndGhzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5QYXRoI2F1dG9DbG9zZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBQYXRoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgZXF1aXZhbGVudCB0byB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IEN1cnZlIGluIHRoZSBQYXRoLiBJbiBhbiBlbXB0eSBQYXRoLCBpdCdzIGFsc28gdHJlYXRlZCBhcyB0aGUgZW5kaW5nIHBvaW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkN1cnZlcy5QYXRoI3N0YXJ0UG9pbnRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSB2ZWN0b3IgdXNlZCB0byBhdm9pZCBvYmplY3QgY3JlYXRpb24gd2hlbiBhZGRpbmcgYSBDdXJ2ZSB0byB0aGUgUGF0aC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5DdXJ2ZXMuUGF0aCNfdG1wVmVjMkFcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RtcFZlYzJBID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgdmVjdG9yIHVzZWQgdG8gYXZvaWQgb2JqZWN0IGNyZWF0aW9uIHdoZW4gYWRkaW5nIGEgQ3VydmUgdG8gdGhlIFBhdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuQ3VydmVzLlBhdGgjX3RtcFZlYzJCXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90bXBWZWMyQiA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZyb21KU09OKHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQuc2V0KHgsIHkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGEgQ3VydmUgdG8gdGhlIGVuZCBvZiB0aGUgUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgQ3VydmUgZG9lcyBub3QgaGF2ZSB0byBzdGFydCB3aGVyZSB0aGUgUGF0aCBlbmRzIG9yLCBmb3IgYW4gZW1wdHkgUGF0aCwgYXQgaXRzIGRlZmluZWQgc3RhcnRpbmcgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjYWRkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DdXJ2ZXMuQ3VydmV9IGN1cnZlIC0gVGhlIEN1cnZlIHRvIGFwcGVuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhdGggb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjdXJ2ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKGN1cnZlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNpcmN1bGFyIEVsbGlwc2UgQ3VydmUgcG9zaXRpb25lZCBhdCB0aGUgZW5kIG9mIHRoZSBQYXRoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2NpcmNsZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2xvY2t3aXNlPWZhbHNlXSAtIGB0cnVlYCB0byBjcmVhdGUgYSBjbG9ja3dpc2UgY2lyY2xlIGFzIG9wcG9zZWQgdG8gYSBjb3VudGVyLWNsb2Nrd2lzZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBjaXJjbGUgaW4gZGVncmVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhdGggb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjaXJjbGVUbzogZnVuY3Rpb24gKHJhZGl1cywgY2xvY2t3aXNlLCByb3RhdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZiAoY2xvY2t3aXNlID09PSB1bmRlZmluZWQpIHsgY2xvY2t3aXNlID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxsaXBzZVRvKHJhZGl1cywgcmFkaXVzLCAwLCAzNjAsIGNsb2Nrd2lzZSwgcm90YXRpb24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgUGF0aCBpcyBjbG9zZWQuXHJcbiAgICAgKlxyXG4gICAgICogQSBjbG9zZWQgUGF0aCBzdGFydHMgYW5kIGVuZHMgYXQgdGhlIHNhbWUgcG9pbnQuIElmIHRoZSBQYXRoIGlzIG5vdCBjbG9zZWQsIGEgc3RyYWlnaHQgTGluZSBDdXJ2ZSB3aWxsIGJlIGNyZWF0ZWQgZnJvbSB0aGUgZW5kaW5nIHBvaW50IGRpcmVjdGx5IHRvIHRoZSBzdGFydGluZyBwb2ludC4gRHVyaW5nIHRoZSBjaGVjaywgdGhlIGFjdHVhbCBzdGFydGluZyBwb2ludCBvZiB0aGUgUGF0aCwgaS5lLiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IEN1cnZlLCB3aWxsIGJlIHVzZWQgYXMgb3Bwb3NlZCB0byB0aGUgUGF0aCdzIGRlZmluZWQge0BsaW5rIHN0YXJ0UG9pbnR9LCB3aGljaCBjb3VsZCBkaWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbiBlbXB0eSBQYXRoIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2Nsb3NlUGF0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXRoIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2xvc2VQYXRoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZFxyXG4gICAgICAgIHZhciBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCk7XHJcbiAgICAgICAgdmFyIGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMV0uZ2V0UG9pbnQoMSk7XHJcblxyXG4gICAgICAgIGlmICghc3RhcnRQb2ludC5lcXVhbHMoZW5kUG9pbnQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFRoaXMgd2lsbCBjb3B5IGEgcmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3JzLCB3aGljaCBwcm9iYWJseSBpc24ndCBzZW5zaWJsZVxyXG4gICAgICAgICAgICB0aGlzLmN1cnZlcy5wdXNoKG5ldyBMaW5lQ3VydmUoZW5kUG9pbnQsIHN0YXJ0UG9pbnQpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBjdWJpYyBiZXppZXIgY3VydmUgc3RhcnRpbmcgYXQgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBhbmQgZW5kaW5nIGF0IHAzLCB1c2luZyBwMSBhbmQgcDIgYXMgY29udHJvbCBwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjY3ViaWNCZXppZXJUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5NYXRoLlZlY3RvcjIpfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiBPciwgaWYgYSBWZWN0b3IyLCB0aGUgcDEgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8UGhhc2VyLk1hdGguVmVjdG9yMil9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuIE9yLCBpZiBhIFZlY3RvcjIsIHRoZSBwMiB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxQaGFzZXIuTWF0aC5WZWN0b3IyKX0gY29udHJvbDFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gT3IsIGlmIGEgVmVjdG9yMiwgdGhlIHAzIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb250cm9sMVldIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gTm90IHVzZWQgaWYgVmVjdG9yMnMgYXJlIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCAzIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29udHJvbDJYXSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LiBOb3QgdXNlZCBpZiBWZWN0b3IycyBhcmUgcHJvdmlkZWQgYXMgdGhlIGZpcnN0IDMgYXJndW1lbnRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb250cm9sMlldIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuIE5vdCB1c2VkIGlmIFZlY3RvcjJzIGFyZSBwcm92aWRlZCBhcyB0aGUgZmlyc3QgMyBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXRoIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY3ViaWNCZXppZXJUbzogZnVuY3Rpb24gKHgsIHksIGNvbnRyb2wxWCwgY29udHJvbDFZLCBjb250cm9sMlgsIGNvbnRyb2wyWSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcDAgPSB0aGlzLmdldEVuZFBvaW50KCk7XHJcbiAgICAgICAgdmFyIHAxO1xyXG4gICAgICAgIHZhciBwMjtcclxuICAgICAgICB2YXIgcDM7XHJcblxyXG4gICAgICAgIC8vICBBc3N1bWUgdGhleSdyZSBhbGwgVmVjdG9yMnNcclxuICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFZlY3RvcjIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwMSA9IHg7XHJcbiAgICAgICAgICAgIHAyID0geTtcclxuICAgICAgICAgICAgcDMgPSBjb250cm9sMVg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHAxID0gbmV3IFZlY3RvcjIoY29udHJvbDFYLCBjb250cm9sMVkpO1xyXG4gICAgICAgICAgICBwMiA9IG5ldyBWZWN0b3IyKGNvbnRyb2wyWCwgY29udHJvbDJZKTtcclxuICAgICAgICAgICAgcDMgPSBuZXcgVmVjdG9yMih4LCB5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZChuZXcgQ3ViaWNCZXppZXJDdXJ2ZShwMCwgcDEsIHAyLCBwMykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyAgQ3JlYXRlcyBhIHF1YWRyYXRpYyBiZXppZXIgY3VydmUgc3RhcnRpbmcgYXQgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBhbmQgZW5kaW5nIGF0IHAyLCB1c2luZyBwMSBhcyBhIGNvbnRyb2wgcG9pbnRcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBRdWFkcmF0aWMgQmV6aWVyIEN1cnZlIHN0YXJ0aW5nIGF0IHRoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIFBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjcXVhZHJhdGljQmV6aWVyVG9cclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxQaGFzZXIuTWF0aC5WZWN0b3IyW10pfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQgb3IsIGlmIGl0J3MgYSBgVmVjdG9yMmAsIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50IG9yLCBpZiBgeGAgaXMgYSBgVmVjdG9yMmAsIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29udHJvbFhdIC0gSWYgYHhgIGlzIG5vdCBhIGBWZWN0b3IyYCwgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29udHJvbFldIC0gSWYgYHhgIGlzIG5vdCBhIGBWZWN0b3IyYCwgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhdGggb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBxdWFkcmF0aWNCZXppZXJUbzogZnVuY3Rpb24gKHgsIHksIGNvbnRyb2xYLCBjb250cm9sWSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcDAgPSB0aGlzLmdldEVuZFBvaW50KCk7XHJcbiAgICAgICAgdmFyIHAxO1xyXG4gICAgICAgIHZhciBwMjtcclxuXHJcbiAgICAgICAgLy8gIEFzc3VtZSB0aGV5J3JlIGFsbCBWZWN0b3Iyc1xyXG4gICAgICAgIGlmICh4IGluc3RhbmNlb2YgVmVjdG9yMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHAxID0geDtcclxuICAgICAgICAgICAgcDIgPSB5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwMSA9IG5ldyBWZWN0b3IyKGNvbnRyb2xYLCBjb250cm9sWSk7XHJcbiAgICAgICAgICAgIHAyID0gbmV3IFZlY3RvcjIoeCwgeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQobmV3IFF1YWRyYXRpY0JlemllckN1cnZlKHAwLCBwMSwgcDIpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhbGwgQ3VydmVzIGluIHRoZSBQYXRoIHRvIGEgR3JhcGhpY3MgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZHJhd1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gRyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3MgLSBUaGUgR3JhcGhpY3MgR2FtZSBPYmplY3QgdG8gZHJhdyB0by5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3BvaW50c1RvdGFsPTMyXSAtIFRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIGRyYXcgZm9yIGVhY2ggQ3VydmUuIEhpZ2hlciBudW1iZXJzIHJlc3VsdCBpbiBhIHNtb290aGVyIGN1cnZlIGJ1dCByZXF1aXJlIG1vcmUgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IFRoZSBHcmFwaGljcyBvYmplY3Qgd2hpY2ggd2FzIGRyYXduIHRvLlxyXG4gICAgICovXHJcbiAgICBkcmF3OiBmdW5jdGlvbiAoZ3JhcGhpY3MsIHBvaW50c1RvdGFsKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY3VydmUuYWN0aXZlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VydmUuZHJhdyhncmFwaGljcywgcG9pbnRzVG90YWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdyYXBoaWNzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gZWxsaXBzZSBjdXJ2ZSBwb3NpdGlvbmVkIGF0IHRoZSBwcmV2aW91cyBlbmQgcG9pbnQsIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2VsbGlwc2VUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4UmFkaXVzPTBdIC0gVGhlIGhvcml6b250YWwgcmFkaXVzIG9mIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3lSYWRpdXM9MF0gLSBUaGUgdmVydGljYWwgcmFkaXVzIG9mIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEFuZ2xlPTBdIC0gVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBlbGxpcHNlLCBpbiBkZWdyZWVzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZW5kQW5nbGU9MzYwXSAtIFRoZSBlbmQgYW5nbGUgb2YgdGhlIGVsbGlwc2UsIGluIGRlZ3JlZXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgZWxsaXBzZSBhbmdsZXMgYXJlIGdpdmVuIGFzIGNsb2Nrd2lzZSAoYHRydWVgKSBvciBjb3VudGVyLWNsb2Nrd2lzZSAoYGZhbHNlYCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBlbGxpcHNlLCBpbiBkZWdyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGF0aCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGVsbGlwc2VUbzogZnVuY3Rpb24gKHhSYWRpdXMsIHlSYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBjbG9ja3dpc2UsIHJvdGF0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbGxpcHNlID0gbmV3IEVsbGlwc2VDdXJ2ZSgwLCAwLCB4UmFkaXVzLCB5UmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgY2xvY2t3aXNlLCByb3RhdGlvbik7XHJcblxyXG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmdldEVuZFBvaW50KHRoaXMuX3RtcFZlYzJBKTtcclxuXHJcbiAgICAgICAgLy8gIENhbGN1bGF0ZSB3aGVyZSB0byBjZW50ZXIgdGhlIGVsbGlwc2VcclxuICAgICAgICB2YXIgc3RhcnQgPSBlbGxpcHNlLmdldFN0YXJ0UG9pbnQodGhpcy5fdG1wVmVjMkIpO1xyXG5cclxuICAgICAgICBlbmQuc3VidHJhY3Qoc3RhcnQpO1xyXG5cclxuICAgICAgICBlbGxpcHNlLnggPSBlbmQueDtcclxuICAgICAgICBlbGxpcHNlLnkgPSBlbmQueTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGVsbGlwc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBQYXRoIGZyb20gYSBQYXRoIENvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm92aWRlZCBvYmplY3Qgc2hvdWxkIGJlIGEge0BsaW5rIFBoYXNlci5UeXBlcy5DdXJ2ZXMuSlNPTlBhdGh9LCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI3RvSlNPTn0uIFByb3ZpZGluZyBhIG1hbGZvcm1lZCBvYmplY3QgbWF5IGNhdXNlIGVycm9ycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUGF0aCNmcm9tSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ3VydmVzLkpTT05QYXRofSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFBhdGggZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhdGggb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmcm9tSlNPTjogZnVuY3Rpb24gKGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIGRhdGEgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXRjaGluZyB0aGUgUGF0aC50b0pTT04gb2JqZWN0IHN0cnVjdHVyZS5cclxuXHJcbiAgICAgICAgdGhpcy5jdXJ2ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmNhY2hlTGVuZ3RocyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0UG9pbnQuc2V0KGRhdGEueCwgZGF0YS55KTtcclxuXHJcbiAgICAgICAgdGhpcy5hdXRvQ2xvc2UgPSBkYXRhLmF1dG9DbG9zZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmN1cnZlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjdXJ2ZSA9IGRhdGEuY3VydmVzW2ldO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjdXJ2ZS50eXBlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdMaW5lQ3VydmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKExpbmVDdXJ2ZS5mcm9tSlNPTihjdXJ2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0VsbGlwc2VDdXJ2ZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQoRWxsaXBzZUN1cnZlLmZyb21KU09OKGN1cnZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnU3BsaW5lQ3VydmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKFNwbGluZUN1cnZlLmZyb21KU09OKGN1cnZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQ3ViaWNCZXppZXJDdXJ2ZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQoQ3ViaWNCZXppZXJDdXJ2ZS5mcm9tSlNPTihjdXJ2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ1F1YWRyYXRpY0JlemllckN1cnZlJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZChRdWFkcmF0aWNCZXppZXJDdXJ2ZS5mcm9tSlNPTihjdXJ2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgUmVjdGFuZ2xlIHdpdGggYSBwb3NpdGlvbiBhbmQgc2l6ZSBtYXRjaGluZyB0aGUgYm91bmRzIG9mIHRoaXMgUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUGF0aCNnZXRCb3VuZHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBbb3V0XSAtIFRoZSBSZWN0YW5nbGUgdG8gc3RvcmUgdGhlIGJvdW5kcyBpbi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2FjY3VyYWN5PTE2XSAtIFRoZSBhY2N1cmFjeSBvZiB0aGUgYm91bmRzIGNhbGN1bGF0aW9ucy4gSGlnaGVyIHZhbHVlcyBhcmUgbW9yZSBhY2N1cmF0ZSBhdCB0aGUgY29zdCBvZiBjYWxjdWxhdGlvbiBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBtb2RpZmllZCBgb3V0YCBSZWN0YW5nbGUsIG9yIGEgbmV3IFJlY3RhbmdsZSBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbiAob3V0LCBhY2N1cmFjeSlcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcbiAgICAgICAgaWYgKGFjY3VyYWN5ID09PSB1bmRlZmluZWQpIHsgYWNjdXJhY3kgPSAxNjsgfVxyXG5cclxuICAgICAgICBvdXQueCA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgb3V0LnkgPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG5cclxuICAgICAgICB2YXIgYm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xyXG4gICAgICAgIHZhciBtYXhSaWdodCA9IE1BVEhfQ09OU1QuTUlOX1NBRkVfSU5URUdFUjtcclxuICAgICAgICB2YXIgbWF4Qm90dG9tID0gTUFUSF9DT05TVC5NSU5fU0FGRV9JTlRFR0VSO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VydmVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWN1cnZlLmFjdGl2ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGN1cnZlLmdldEJvdW5kcyhib3VuZHMsIGFjY3VyYWN5KTtcclxuXHJcbiAgICAgICAgICAgIG91dC54ID0gTWF0aC5taW4ob3V0LngsIGJvdW5kcy54KTtcclxuICAgICAgICAgICAgb3V0LnkgPSBNYXRoLm1pbihvdXQueSwgYm91bmRzLnkpO1xyXG5cclxuICAgICAgICAgICAgbWF4UmlnaHQgPSBNYXRoLm1heChtYXhSaWdodCwgYm91bmRzLnJpZ2h0KTtcclxuICAgICAgICAgICAgbWF4Qm90dG9tID0gTWF0aC5tYXgobWF4Qm90dG9tLCBib3VuZHMuYm90dG9tKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG91dC5yaWdodCA9IG1heFJpZ2h0O1xyXG4gICAgICAgIG91dC5ib3R0b20gPSBtYXhCb3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBsZW5ndGggb2YgdGhlIFBhdGggYXQgdGhlIGVuZCBvZiBlYWNoIEN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWNoZWQgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCBpbiBzdWJzZXF1ZW50IGNhbGxzLiBUaGUgY2FjaGUgaXMgb25seSBpbnZhbGlkYXRlZCB3aGVuIHRoZSB7QGxpbmsgI2N1cnZlc30gYXJyYXkgY2hhbmdlcyBpbiBsZW5ndGgsIGxlYWRpbmcgdG8gcG90ZW50aWFsIGluYWNjdXJhY2llcyBpZiBhIEN1cnZlIGluIHRoZSBQYXRoIGlzIGNoYW5nZWQsIG9yIGlmIGEgQ3VydmUgaXMgcmVtb3ZlZCBhbmQgYW5vdGhlciBpcyBhZGRlZCBpbiBpdHMgcGxhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZ2V0Q3VydmVMZW5ndGhzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJbXX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBQYXRoIGF0IHRoZSBlbmQgb2YgZWFjaCBvbmUgb2YgaXRzIEN1cnZlcy5cclxuICAgICAqL1xyXG4gICAgZ2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGhcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmVcclxuICAgICAgICAvLyBQdXNoIHN1bXMgaW50byBjYWNoZWQgYXJyYXlcclxuXHJcbiAgICAgICAgdmFyIGxlbmd0aHMgPSBbXTtcclxuICAgICAgICB2YXIgc3VtcyA9IDA7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdW1zICs9IHRoaXMuY3VydmVzW2ldLmdldExlbmd0aCgpO1xyXG5cclxuICAgICAgICAgICAgbGVuZ3Rocy5wdXNoKHN1bXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xyXG5cclxuICAgICAgICByZXR1cm4gbGVuZ3RocztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIFBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQSBQYXRoJ3MgZW5kaW5nIHBvaW50IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGVuZGluZyBwb2ludCBvZiB0aGUgbGFzdCBDdXJ2ZSBpbiB0aGUgUGF0aC4gRm9yIGFuIGVtcHR5IFBhdGgsIHRoZSBlbmRpbmcgcG9pbnQgaXMgYXQgdGhlIFBhdGgncyBkZWZpbmVkIHtAbGluayAjc3RhcnRQb2ludH0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZ2V0RW5kUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW291dF0gLSBUaGUgb2JqZWN0IHRvIHN0b3JlIHRoZSBwb2ludCBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgbW9kaWZpZWQgYG91dGAgb2JqZWN0LCBvciBhIG5ldyBWZWN0b3IyIGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxyXG4gICAgICovXHJcbiAgICBnZXRFbmRQb2ludDogZnVuY3Rpb24gKG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJ2ZXMubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aCAtIDFdLmdldFBvaW50KDEsIG91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dC5jb3B5KHRoaXMuc3RhcnRQb2ludCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHtAbGluayAjZ2V0Q3VydmVMZW5ndGhzfVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2dldExlbmd0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBQYXRoLlxyXG4gICAgICovXHJcbiAgICBnZXRMZW5ndGg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGVuc1tsZW5zLmxlbmd0aCAtIDFdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG9cclxuICAgIC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCxcclxuICAgIC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcclxuXHJcbiAgICAvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXHJcbiAgICAvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmVcclxuICAgIC8vIDMuIEdldCB0IGZvciB0aGUgY3VydmVcclxuICAgIC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IGF0IHRoZSBnaXZlbiBub3JtYWxpemVkIGxvY2F0aW9uIChiZXR3ZWVuIDAgYW5kIDEpIG9uIHRoZSBQYXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgZW50aXJlIFBhdGgsIG5vdCB0byBhbiBpbmRpdmlkdWFsIEN1cnZlLiBBIGxvY2F0aW9uIG9mIDAuNSBpcyBhbHdheXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgUGF0aCBhbmQgaXMgdGh1cyBhbiBlcXVhbCBkaXN0YW5jZSBhd2F5IGZyb20gYm90aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBwb2ludHMuIEluIGEgUGF0aCB3aXRoIG9uZSBDdXJ2ZSwgaXQgd291bGQgYmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgQ3VydmU7IGluIGEgUGF0aCB3aXRoIHR3byBDdXJ2ZXMsIGl0IGNvdWxkIGJlIGFueXdoZXJlIG9uIGVpdGhlciBvbmUgb2YgdGhlbSBkZXBlbmRpbmcgb24gdGhlaXIgbGVuZ3Rocy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUGF0aCNnZXRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgbG9jYXRpb24gb2YgdGhlIHBvaW50IHRvIHJldHVybiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBtb2RpZmllZCBgb3V0YCBvYmplY3QsIG9yIGEgbmV3IGBWZWN0b3IyYCBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uICh0LCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTtcclxuICAgICAgICB2YXIgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcclxuICAgICAgICB2YXIgaSA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChpIDwgY3VydmVMZW5ndGhzLmxlbmd0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjdXJ2ZUxlbmd0aHNbaV0gPj0gZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBjdXJ2ZUxlbmd0aHNbaV0gLSBkO1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcclxuICAgICAgICAgICAgICAgIHZhciB1ID0gKHNlZ21lbnRMZW5ndGggPT09IDApID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh1LCBvdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBzZXF1ZW5jZSBvZiBwb2ludHMgb24gdGhlIHBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXZpc2lvbnM9MTJdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMgcGVyIHJlc29sdXRpb24gcGVyIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJbXX0gQW4gYXJyYXkgb2YgVmVjdG9yMiBvYmplY3RzIHRoYXQgY29udGFpbmluZyB0aGUgcG9pbnRzIGFsb25nIHRoZSBQYXRoLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludHM6IGZ1bmN0aW9uIChkaXZpc2lvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkKSB7IGRpdmlzaW9ucyA9IDEyOyB9XHJcblxyXG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcclxuICAgICAgICB2YXIgbGFzdDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1cnZlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjdXJ2ZS5hY3RpdmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGN1cnZlLmdldFJlc29sdXRpb24oZGl2aXNpb25zKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwdHMgPSBjdXJ2ZS5nZXRQb2ludHMocmVzb2x1dGlvbik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ID0gcHRzW2pdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGxhc3QuZXF1YWxzKHBvaW50KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICBsYXN0ID0gcG9pbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXS5lcXVhbHMocG9pbnRzWzBdKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50c1swXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcG9pbnRzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb21seSBjaG9zZW4gcG9pbnQgYW55d2hlcmUgb24gdGhlIHBhdGguIFRoaXMgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBgZ2V0UG9pbnRgIGluIHRoYXQgaXQgbWF5IHJldHVybiBhIHBvaW50IG9uIGFueSBDdXJ2ZSBpbnNpZGUgdGhpcyBwYXRoLlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcywgdGhlIHBvaW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgZXF1YWxseSBzcGFjZWQgc3BhdGlhbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2dldFJhbmRvbVBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gYFZlY3RvcjJgIGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdC4gSWYgYHVuZGVmaW5lZGAgYSBuZXcgYFZlY3RvcjJgIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgbW9kaWZpZWQgYG91dGAgb2JqZWN0LCBvciBhIG5ldyBgVmVjdG9yMmAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFJhbmRvbVBvaW50OiBmdW5jdGlvbiAob3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvaW50KE1hdGgucmFuZG9tKCksIG91dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyB0aGlzIFBhdGggaW50byBhIHNldCBvZiBlcXVhbGx5IHNwYWNlZCBwb2ludHMsXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHJlc3VsdGluZyBwb2ludHMgYXJlIGVxdWFsbHkgc3BhY2VkIHdpdGggcmVzcGVjdCB0byB0aGUgcG9pbnRzJyBwb3NpdGlvbiBvbiB0aGUgcGF0aCwgYnV0IG5vdCBuZWNlc3NhcmlseSBlcXVhbGx5IHNwYWNlZCBzcGF0aWFsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZ2V0U3BhY2VkUG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkaXZpc2lvbnM9NDBdIC0gVGhlIGFtb3VudCBvZiBwb2ludHMgdG8gZGl2aWRlIHRoaXMgUGF0aCBpbnRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJbXX0gQSBsaXN0IG9mIHRoZSBwb2ludHMgdGhpcyBwYXRoIHdhcyBzdWJkaXZpZGVkIGludG8uXHJcbiAgICAgKi9cclxuICAgIGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKGRpdmlzaW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoZGl2aXNpb25zID09PSB1bmRlZmluZWQpIHsgZGl2aXNpb25zID0gNDA7IH1cclxuXHJcbiAgICAgICAgdmFyIHBvaW50cyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHRoaXMuZ2V0UG9pbnQoaSAvIGRpdmlzaW9ucykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b0Nsb3NlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9pbnRzLnB1c2gocG9pbnRzWzBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwb2ludHM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIFBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuQ3VydmVzLlBhdGgjZ2V0U3RhcnRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIGBWZWN0b3IyYCBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBzdG9yaW5nIHRoZSByZXN1bHQuIElmIGB1bmRlZmluZWRgIGEgbmV3IGBWZWN0b3IyYCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIG1vZGlmaWVkIGBvdXRgIG9iamVjdCwgb3IgYSBuZXcgVmVjdG9yMiBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0U3RhcnRQb2ludDogZnVuY3Rpb24gKG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0LmNvcHkodGhpcy5zdGFydFBvaW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCBhIHJlbGF0aXZlIHBvc2l0aW9uIG9uIHRoZSBwYXRoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2dldFRhbmdlbnRcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvbiB0aGUgcGF0aCwgWzAuLjFdLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEEgdmVjdG9yIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVmVjdG9yIGFwcHJveGltYXRpbmcgdGhlIHRhbmdlbnQgbGluZSBhdCB0aGUgcG9pbnQgdCAoZGVsdGEgKy8tIDAuMDAwMSlcclxuICAgICAqL1xyXG4gICAgZ2V0VGFuZ2VudDogZnVuY3Rpb24gKHQsIG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICB2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xyXG4gICAgICAgIHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xyXG4gICAgICAgIHZhciBpID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGN1cnZlTGVuZ3Roc1tpXSA+PSBkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGN1cnZlTGVuZ3Roc1tpXSAtIGQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHUgPSAoc2VnbWVudExlbmd0aCA9PT0gMCkgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJ2ZS5nZXRUYW5nZW50QXQodSwgb3V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGxpbmUgY3VydmUgZnJvbSB0aGUgcHJldmlvdXMgZW5kIHBvaW50IHRvIHgveS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5DdXJ2ZXMuUGF0aCNsaW5lVG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxQaGFzZXIuTWF0aC5WZWN0b3IyKX0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGxpbmUncyBlbmQgcG9pbnQsIG9yIGEgYFZlY3RvcjJgIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBlbmQgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbGluZSdzIGVuZCBwb2ludCwgaWYgYSBudW1iZXIgd2FzIHBhc3NlZCBhcyB0aGUgWCBwYXJhbWV0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXRoIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbGluZVRvOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFZlY3RvcjIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90bXBWZWMyQi5jb3B5KHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90bXBWZWMyQi5zZXQoeCwgeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZW5kID0gdGhpcy5nZXRFbmRQb2ludCh0aGlzLl90bXBWZWMyQSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZChuZXcgTGluZUN1cnZlKFsgZW5kLngsIGVuZC55LCB0aGlzLl90bXBWZWMyQi54LCB0aGlzLl90bXBWZWMyQi55IF0pKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgc3BsaW5lIGN1cnZlIHN0YXJ0aW5nIGF0IHRoZSBwcmV2aW91cyBlbmQgcG9pbnQsIHVzaW5nIHRoZSBnaXZlbiBwb2ludHMgb24gdGhlIGN1cnZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI3NwbGluZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJbXX0gcG9pbnRzIC0gVGhlIHBvaW50cyB0aGUgbmV3bHkgY3JlYXRlZCBzcGxpbmUgY3VydmUgc2hvdWxkIGNvbnNpc3Qgb2YuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXRoIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3BsaW5lVG86IGZ1bmN0aW9uIChwb2ludHMpXHJcbiAgICB7XHJcbiAgICAgICAgcG9pbnRzLnVuc2hpZnQodGhpcy5nZXRFbmRQb2ludCgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKG5ldyBTcGxpbmVDdXJ2ZShwb2ludHMpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgXCJnYXBcIiBpbiB0aGlzIHBhdGggZnJvbSB0aGUgcGF0aCdzIGN1cnJlbnQgZW5kIHBvaW50IHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoaXMgUGF0aCdzIGVuZCBwb2ludCB3aWxsIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiBjb29yZGluYXRlc1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI21vdmVUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5NYXRoLlZlY3RvcjIpfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24gdG8gbW92ZSB0aGUgcGF0aCdzIGVuZCBwb2ludCB0bywgb3IgYSBgVmVjdG9yMmAgY29udGFpbmluZyB0aGUgZW50aXJlIG5ldyBlbmQgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvc2l0aW9uIHRvIG1vdmUgdGhlIHBhdGgncyBlbmQgcG9pbnQgdG8sIGlmIGEgbnVtYmVyIHdhcyBwYXNzZWQgYXMgdGhlIFggY29vcmRpbmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhdGggb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG86IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4IGluc3RhbmNlb2YgVmVjdG9yMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChuZXcgTW92ZVBhdGhUbyh4LngsIHgueSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQobmV3IE1vdmVQYXRoVG8oeCwgeSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGlzIFBhdGggdG8gYSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXRoIGluZm9ybWF0aW9uIGFuZCBpdHMgY29uc3RpdHVlbnQgY3VydmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkN1cnZlcy5KU09OUGF0aH0gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGhpcyBwYXRoJ3MgZGF0YS5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1cnZlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dC5wdXNoKHRoaXMuY3VydmVzW2ldLnRvSlNPTigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdQYXRoJyxcclxuICAgICAgICAgICAgeDogdGhpcy5zdGFydFBvaW50LngsXHJcbiAgICAgICAgICAgIHk6IHRoaXMuc3RhcnRQb2ludC55LFxyXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IHRoaXMuYXV0b0Nsb3NlLFxyXG4gICAgICAgICAgICBjdXJ2ZXM6IG91dFxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI3VwZGF0ZUFyY0xlbmd0aHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FjaGVMZW5ndGhzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZXMgb2YgdGhpcyBQYXRoLCBjbGVhcmluZyBpdHMgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byBvYmplY3RzIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UtY29sbGVjdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkN1cnZlcy5QYXRoI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY3VydmVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFBhdGggT2JqZWN0LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNwYXRoXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgUGF0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBQYXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuQ3VydmVzLlBhdGh9IFRoZSBQYXRoIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3BhdGgnLCBmdW5jdGlvbiAoeCwgeSlcclxue1xyXG4gICAgcmV0dXJuIG5ldyBQYXRoKHgsIHkpO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSBjb250ZXh0LlxyXG4vL1xyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vL1xyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhdGg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4vZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNhbGxiYWNrIERhdGFFYWNoQ2FsbGJhY2tcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXJlbnQgLSBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgRGF0YU1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB2YWx1ZS5cclxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZS5cclxuICogQHBhcmFtIHsuLi4qfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgYWZ0ZXIgdGhlIGdhbWUgb2JqZWN0LCBrZXksIGFuZCBkYXRhLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBEYXRhIE1hbmFnZXIgQ29tcG9uZW50IGZlYXR1cmVzIGEgbWVhbnMgdG8gc3RvcmUgcGllY2VzIG9mIGRhdGEgc3BlY2lmaWMgdG8gYSBHYW1lIE9iamVjdCwgU3lzdGVtIG9yIFBsdWdpbi5cclxuICogWW91IGNhbiB0aGVuIHNlYXJjaCwgcXVlcnkgaXQsIGFuZCByZXRyaWV2ZSB0aGUgZGF0YS4gVGhlIHBhcmVudCBtdXN0IGVpdGhlciBleHRlbmQgRXZlbnRFbWl0dGVyLFxyXG4gKiBvciBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGBldmVudHNgIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgaXQuXHJcbiAqXHJcbiAqIEBjbGFzcyBEYXRhTWFuYWdlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkRhdGFcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50IC0gVGhlIG9iamVjdCB0aGF0IHRoaXMgRGF0YU1hbmFnZXIgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlcn0gW2V2ZW50RW1pdHRlcl0gLSBUaGUgRGF0YU1hbmFnZXIncyBldmVudCBlbWl0dGVyLlxyXG4gKi9cclxudmFyIERhdGFNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIERhdGFNYW5hZ2VyIChwYXJlbnQsIGV2ZW50RW1pdHRlcilcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb2JqZWN0IHRoYXQgdGhpcyBEYXRhTWFuYWdlciBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjcGFyZW50XHJcbiAgICAgICAgICogQHR5cGUgeyp9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBEYXRhTWFuYWdlcidzIGV2ZW50IGVtaXR0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudEVtaXR0ZXI7XHJcblxyXG4gICAgICAgIGlmICghZXZlbnRFbWl0dGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHMgPSAocGFyZW50LmV2ZW50cykgPyBwYXJlbnQuZXZlbnRzIDogcGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRhdGEgbGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI2xpc3RcclxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsICo+fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHt9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXN0ID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwdWJsaWMgdmFsdWVzIGxpc3QuIFlvdSBjYW4gdXNlIHRoaXMgdG8gYWNjZXNzIGFueXRoaW5nIHlvdSBoYXZlIHN0b3JlZFxyXG4gICAgICAgICAqIGluIHRoaXMgRGF0YSBNYW5hZ2VyLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNldCBhIHZhbHVlIGNhbGxlZCBgZ29sZGAgeW91IGNhblxyXG4gICAgICAgICAqIGFjY2VzcyBpdCB2aWE6XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgICAgICogdGhpcy5kYXRhLnZhbHVlcy5nb2xkO1xyXG4gICAgICAgICAqIGBgYFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogWW91IGNhbiBhbHNvIG1vZGlmeSBpdCBkaXJlY3RseTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgICAgICogdGhpcy5kYXRhLnZhbHVlcy5nb2xkICs9IDEwMDA7XHJcbiAgICAgICAgICogYGBgXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBEb2luZyBzbyB3aWxsIGVtaXQgYSBgc2V0ZGF0YWAgZXZlbnQgZnJvbSB0aGUgcGFyZW50IG9mIHRoaXMgRGF0YSBNYW5hZ2VyLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIERvIG5vdCBtb2RpZnkgdGhpcyBvYmplY3QgZGlyZWN0bHkuIEFkZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5IHRvIHRoaXMgb2JqZWN0IHdpbGwgbm90XHJcbiAgICAgICAgICogZW1pdCBhbnkgZXZlbnRzLiBBbHdheXMgdXNlIGBEYXRhTWFuYWdlci5zZXRgIHRvIGNyZWF0ZSBuZXcgaXRlbXMgdGhlIGZpcnN0IHRpbWUgYXJvdW5kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjdmFsdWVzXHJcbiAgICAgICAgICogQHR5cGUge09iamVjdC48c3RyaW5nLCAqPn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB7fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHNldHRpbmcgZGF0YSBpcyBmcm96ZW4gZm9yIHRoaXMgRGF0YU1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNfZnJvemVuXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2Zyb3plbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudC5oYXNPd25Qcm9wZXJ0eSgnc3lzJykgJiYgdGhpcy5ldmVudHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5vbmNlKCdkZXN0cm95JywgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgb3IgdW5kZWZpbmVkIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIGFjY2VzcyB2YWx1ZXMgdmlhIHRoZSBgdmFsdWVzYCBvYmplY3QuIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGEga2V5IGNhbGxlZCBgZ29sZGAgeW91IGNhbiBkbyBlaXRoZXI6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuZGF0YS5nZXQoJ2dvbGQnKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIE9yIGFjY2VzcyB0aGUgdmFsdWUgZGlyZWN0bHk6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuZGF0YS52YWx1ZXMuZ29sZDtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGFycmF5IG9mIGtleXMsIGluIHdoaWNoIGNhc2UgYW4gYXJyYXkgb2YgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQ6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuZGF0YS5nZXQoWyAnZ29sZCcsICdhcm1vcicsICdoZWFsdGgnIF0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBhcHByb2FjaCBpcyB1c2VmdWwgZm9yIGRlc3RydWN0dXJpbmcgYXJyYXlzIGluIEVTNi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5IC0gVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmV0cmlldmUsIG9yIGFuIGFycmF5IG9mIGtleXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4ga2V5LCBvciBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZSBvcmRlciBvZiB3aGljaCB3aWxsIG1hdGNoIHRoZSBpbnB1dCBhcnJheS5cclxuICAgICAqL1xyXG4gICAgZ2V0OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5saXN0O1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGxpc3Rba2V5W2ldXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhbGwgZGF0YSB2YWx1ZXMgaW4gYSBuZXcgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjZ2V0QWxsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3QuPHN0cmluZywgKj59IEFsbCBkYXRhIHZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXN1bHRzID0ge307XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxpc3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0Lmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHNba2V5XSA9IHRoaXMubGlzdFtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWVyaWVzIHRoZSBEYXRhTWFuYWdlciBmb3IgdGhlIHZhbHVlcyBvZiBrZXlzIG1hdGNoaW5nIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNxdWVyeVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IHNlYXJjaCAtIEEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4gSWYgYSBub24tUmVnRXhwIG9iamVjdCBvYmogaXMgcGFzc2VkLCBpdCBpcyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhIFJlZ0V4cCBieSB1c2luZyBuZXcgUmVnRXhwKG9iaikuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0LjxzdHJpbmcsICo+fSBUaGUgdmFsdWVzIG9mIHRoZSBrZXlzIG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5nLlxyXG4gICAgICovXHJcbiAgICBxdWVyeTogZnVuY3Rpb24gKHNlYXJjaClcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzdWx0cyA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5saXN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGtleS5tYXRjaChzZWFyY2gpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzW2tleV0gPSB0aGlzLmxpc3Rba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiB0aGUga2V5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgRGF0YSBNYW5hZ2VyIHRoZW4gaXQgaXMgY3JlYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogZGF0YS5zZXQoJ25hbWUnLCAnUmVkIEdlbSBTdG9uZScpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGtleSB2YWx1ZSBwYWlycyBhcyB0aGUgZmlyc3QgYXJndW1lbnQ6XHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogZGF0YS5zZXQoeyBuYW1lOiAnUmVkIEdlbSBTdG9uZScsIGxldmVsOiAyLCBvd25lcjogJ0xpbmsnLCBnb2xkOiA1MCB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRvIGdldCBhIHZhbHVlIGJhY2sgYWdhaW4geW91IGNhbiBjYWxsIGBnZXRgOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBkYXRhLmdldCgnZ29sZCcpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIE9yIHlvdSBjYW4gYWNjZXNzIHRoZSB2YWx1ZSBkaXJlY3RseSB2aWEgdGhlIGB2YWx1ZXNgIHByb3BlcnR5LCB3aGVyZSBpdCB3b3JrcyBsaWtlIGFueSBvdGhlciB2YXJpYWJsZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogZGF0YS52YWx1ZXMuZ29sZCArPSA1MDtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIGZpcnN0IHNldCwgYSBgc2V0ZGF0YWAgZXZlbnQgaXMgZW1pdHRlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzLCBhIGBjaGFuZ2VkYXRhYCBldmVudCBpcyBlbWl0dGVkIGluc3RlYWQsIGFsb25nIGFuIGV2ZW50IG5hbWVkIGFmdGVyIHRoZSBrZXkuXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHVwZGF0ZWQgYW4gZXhpc3Rpbmcga2V5IGNhbGxlZCBgUGxheWVyTGl2ZXNgIHRoZW4gaXQgd291bGQgZW1pdCB0aGUgZXZlbnQgYGNoYW5nZWRhdGEtUGxheWVyTGl2ZXNgLlxyXG4gICAgICogVGhlc2UgZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCByZWdhcmRsZXNzIGlmIHlvdSB1c2UgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSB2YWx1ZSwgb3IgdGhlIGRpcmVjdCBgdmFsdWVzYCBzZXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZGF0YSBrZXlzIGFyZSBjYXNlLXNlbnNpdGl2ZSBhbmQgbXVzdCBiZSB2YWxpZCBKYXZhU2NyaXB0IE9iamVjdCBwcm9wZXJ0eSBzdHJpbmdzLlxyXG4gICAgICogVGhpcyBtZWFucyB0aGUga2V5cyBgZ29sZGAgYW5kIGBHb2xkYCBhcmUgdHJlYXRlZCBhcyB0d28gdW5pcXVlIHZhbHVlcyB3aXRoaW4gdGhlIERhdGEgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI3NldFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5EYXRhLkV2ZW50cyNTRVRfREFUQVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5EYXRhLkV2ZW50cyNDSEFOR0VfREFUQVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5EYXRhLkV2ZW50cyNDSEFOR0VfREFUQV9LRVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBrZXkgLSBUaGUga2V5IHRvIHNldCB0aGUgdmFsdWUgZm9yLiBPciBhbiBvYmplY3Qgb3Iga2V5IHZhbHVlIHBhaXJzLiBJZiBhbiBvYmplY3QgdGhlIGBkYXRhYCBhcmd1bWVudCBpcyBpZ25vcmVkLlxyXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGdpdmVuIGtleS4gSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGFzIHRoZSBrZXkgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRGF0YU1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Zyb3plbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoa2V5LCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgZW50cnkgaW4ga2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKGVudHJ5LCBrZXlbZW50cnldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5jcmVhc2UgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4gSWYgdGhlIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIERhdGEgTWFuYWdlciB0aGVuIGl0IGlzIGluY3JlYXNlZCBmcm9tIDAuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIGZpcnN0IHNldCwgYSBgc2V0ZGF0YWAgZXZlbnQgaXMgZW1pdHRlZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNpbmNcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjU0VUX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFfS0VZXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IGtleSAtIFRoZSBrZXkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIGZvci5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2RhdGFdIC0gVGhlIHZhbHVlIHRvIGluY3JlYXNlIGZvciB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EYXRhLkRhdGFNYW5hZ2VyfSBUaGlzIERhdGFNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqLyAgICBcclxuICAgIGluYzogZnVuY3Rpb24gKGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fZnJvemVuKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGF0YSA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkpO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXQoa2V5LCAodmFsdWUgKyBkYXRhKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZSBhIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuIElmIHRoZSBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluIHRoZSBEYXRhIE1hbmFnZXIgdGhlbiBpdCBpcyB0b2dnbGVkIGZyb20gZmFsc2UuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIGZpcnN0IHNldCwgYSBgc2V0ZGF0YWAgZXZlbnQgaXMgZW1pdHRlZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciN0b2dnbGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjU0VUX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFfS0VZXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IGtleSAtIFRoZSBrZXkgdG8gdG9nZ2xlIHRoZSB2YWx1ZSBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJ9IFRoaXMgRGF0YU1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovICBcclxuICAgIHRvZ2dsZTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fZnJvemVuKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldChrZXksICF0aGlzLmdldChrZXkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgdmFsdWUgc2V0dGVyLCBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgYHNldGAgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjc2V0VmFsdWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjU0VUX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFfS0VZXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHNldCB0aGUgdmFsdWUgZm9yLlxyXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERhdGFNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VmFsdWU6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Zyb3plbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSGl0IHRoZSBrZXkgZ2V0dGVyLCB3aGljaCB3aWxsIGluIHR1cm4gZW1pdCB0aGUgZXZlbnRzLlxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlc1trZXldID0gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICAgICAgdmFyIGxpc3QgPSB0aGlzLmxpc3Q7XHJcbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cztcclxuICAgICAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMudmFsdWVzLCBrZXksIHtcclxuXHJcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXHJcblxyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0W2tleV07XHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX2Zyb3plbilcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c1ZhbHVlID0gbGlzdFtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0W2tleV0gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5lbWl0KEV2ZW50cy5DSEFOR0VfREFUQSwgcGFyZW50LCBrZXksIHZhbHVlLCBwcmV2aW91c1ZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmVtaXQoRXZlbnRzLkNIQU5HRV9EQVRBX0tFWSArIGtleSwgcGFyZW50LCB2YWx1ZSwgcHJldmlvdXNWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsaXN0W2tleV0gPSBkYXRhO1xyXG5cclxuICAgICAgICAgICAgZXZlbnRzLmVtaXQoRXZlbnRzLlNFVF9EQVRBLCBwYXJlbnQsIGtleSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgYWxsIGRhdGEgZW50cmllcyB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNlYWNoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFFYWNoQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXHJcbiAgICAgKiBAcGFyYW0geyp9IFtjb250ZXh0XSAtIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXHJcbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLCBhZnRlciB0aGUgZ2FtZSBvYmplY3QsIGtleSwgYW5kIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBEYXRhTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICB2YXIgYXJncyA9IFsgdGhpcy5wYXJlbnQsIG51bGwsIHVuZGVmaW5lZCBdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMubGlzdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3NbMV0gPSBrZXk7XHJcbiAgICAgICAgICAgIGFyZ3NbMl0gPSB0aGlzLmxpc3Rba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVyZ2UgdGhlIGdpdmVuIG9iamVjdCBvZiBrZXkgdmFsdWUgcGFpcnMgaW50byB0aGlzIERhdGFNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEFueSBuZXdseSBjcmVhdGVkIHZhbHVlcyB3aWxsIGVtaXQgYSBgc2V0ZGF0YWAgZXZlbnQuIEFueSB1cGRhdGVkIHZhbHVlcyAoc2VlIHRoZSBgb3ZlcndyaXRlYCBhcmd1bWVudClcclxuICAgICAqIHdpbGwgZW1pdCBhIGBjaGFuZ2VkYXRhYCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI21lcmdlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkRhdGEuRXZlbnRzI1NFVF9EQVRBXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkRhdGEuRXZlbnRzI0NIQU5HRV9EQVRBXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkRhdGEuRXZlbnRzI0NIQU5HRV9EQVRBX0tFWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgKj59IGRhdGEgLSBUaGUgZGF0YSB0byBtZXJnZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJ3cml0ZT10cnVlXSAtIFdoZXRoZXIgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGRhdGEuIERlZmF1bHRzIHRvIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBEYXRhTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG1lcmdlOiBmdW5jdGlvbiAoZGF0YSwgb3ZlcndyaXRlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdmVyd3JpdGUgPT09IHVuZGVmaW5lZCkgeyBvdmVyd3JpdGUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIC8vICBNZXJnZSBkYXRhIGZyb20gYW5vdGhlciBjb21wb25lbnQgaW50byB0aGlzIG9uZVxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAob3ZlcndyaXRlIHx8ICghb3ZlcndyaXRlICYmICF0aGlzLmhhcyhrZXkpKSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBrZXkgaXMgZm91bmQgaW4gdGhpcyBEYXRhIE1hbmFnZXIgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcm5hbCBsaXN0cyBhbmQgYVxyXG4gICAgICogYHJlbW92ZWRhdGFgIGV2ZW50IGlzIGVtaXR0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGFycmF5IG9mIGtleXMsIGluIHdoaWNoIGNhc2UgYWxsIGtleXMgaW4gdGhlIGFycmF5IHdpbGwgYmUgcmVtb3ZlZDpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5kYXRhLnJlbW92ZShbICdnb2xkJywgJ2FybW9yJywgJ2hlYWx0aCcgXSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI3JlbW92ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5EYXRhLkV2ZW50cyNSRU1PVkVfREFUQVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5IC0gVGhlIGtleSB0byByZW1vdmUsIG9yIGFuIGFycmF5IG9mIGtleXMgdG8gcmVtb3ZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRGF0YU1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Zyb3plbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVZhbHVlKGtleVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlVmFsdWUoa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHZhbHVlIHJlbW92ZXIsIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBgcmVtb3ZlYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNyZW1vdmVWYWx1ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuRGF0YS5FdmVudHMjUkVNT1ZFX0RBVEFcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBzZXQgdGhlIHZhbHVlIGZvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERhdGFNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVmFsdWU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMubGlzdFtrZXldO1xyXG5cclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMubGlzdFtrZXldO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlJFTU9WRV9EQVRBLCB0aGlzLnBhcmVudCwga2V5LCBkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuICdrZXknLCBkZWxldGVzIGl0IGZyb20gdGhpcyBEYXRhIE1hbmFnZXIsIHRoZW4gcmV0dXJucyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI3BvcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5EYXRhLkV2ZW50cyNSRU1PVkVfREFUQVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJldHJpZXZlIGFuZCBkZWxldGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKi9cclxuICAgIHBvcDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9mcm96ZW4gJiYgdGhpcy5oYXMoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxpc3Rba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3Rba2V5XTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW2tleV07XHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5SRU1PVkVfREFUQSwgdGhpcy5wYXJlbnQsIGtleSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGtleSBpcyBzZXQgaW4gdGhpcyBEYXRhIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIGtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlIGFuZCBtdXN0IGJlIHZhbGlkIEphdmFTY3JpcHQgT2JqZWN0IHByb3BlcnR5IHN0cmluZ3MuXHJcbiAgICAgKiBUaGlzIG1lYW5zIHRoZSBrZXlzIGBnb2xkYCBhbmQgYEdvbGRgIGFyZSB0cmVhdGVkIGFzIHR3byB1bmlxdWUgdmFsdWVzIHdpdGhpbiB0aGUgRGF0YSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjaGFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUga2V5IGV4aXN0cywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhhczogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0Lmhhc093blByb3BlcnR5KGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnJlZXplIG9yIHVuZnJlZXplIHRoaXMgRGF0YSBNYW5hZ2VyLiBBIGZyb3plbiBEYXRhIE1hbmFnZXIgd2lsbCBibG9jayBhbGwgYXR0ZW1wdHNcclxuICAgICAqIHRvIGNyZWF0ZSBuZXcgdmFsdWVzIG9yIHVwZGF0ZSBleGlzdGluZyBvbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjc2V0RnJlZXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gV2hldGhlciB0byBmcmVlemUgb3IgdW5mcmVlemUgdGhlIERhdGEgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERhdGFNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RnJlZXplOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZnJvemVuID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZSBhbGwgZGF0YSBpbiB0aGlzIERhdGEgTWFuYWdlciBhbmQgdW5mcmVlemUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBEYXRhTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxpc3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0W2tleV07XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1trZXldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZnJvemVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgdGhpcyBkYXRhIG1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9mZihFdmVudHMuQ0hBTkdFX0RBVEEpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9mZihFdmVudHMuU0VUX0RBVEEpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9mZihFdmVudHMuUkVNT1ZFX0RBVEEpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBmcm96ZW4gc3RhdGUgb2YgdGhpcyBEYXRhIE1hbmFnZXIuXHJcbiAgICAgKiBBIGZyb3plbiBEYXRhIE1hbmFnZXIgd2lsbCBibG9jayBhbGwgYXR0ZW1wdHMgdG8gY3JlYXRlIG5ldyB2YWx1ZXMgb3IgdXBkYXRlIGV4aXN0aW5nIG9uZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXIjZnJlZXplXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBmcmVlemU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb3plbjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zyb3plbiA9ICh2YWx1ZSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgRGF0YSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyI2NvdW50XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjb3VudDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5saXN0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0W2tleV0gIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGF0YU1hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIERhdGFNYW5hZ2VyID0gcmVxdWlyZSgnLi9EYXRhTWFuYWdlcicpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBTY2VuZUV2ZW50cyA9IHJlcXVpcmUoJy4uL3NjZW5lL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIERhdGEgQ29tcG9uZW50IGZlYXR1cmVzIGEgbWVhbnMgdG8gc3RvcmUgcGllY2VzIG9mIGRhdGEgc3BlY2lmaWMgdG8gYSBHYW1lIE9iamVjdCwgU3lzdGVtIG9yIFBsdWdpbi5cclxuICogWW91IGNhbiB0aGVuIHNlYXJjaCwgcXVlcnkgaXQsIGFuZCByZXRyaWV2ZSB0aGUgZGF0YS4gVGhlIHBhcmVudCBtdXN0IGVpdGhlciBleHRlbmQgRXZlbnRFbWl0dGVyLFxyXG4gKiBvciBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGBldmVudHNgIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgaXQuXHJcbiAqXHJcbiAqIEBjbGFzcyBEYXRhTWFuYWdlclBsdWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkRhdGFcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCB0aGlzIERhdGFNYW5hZ2VyIGJlbG9uZ3MgdG8uXHJcbiAqL1xyXG52YXIgRGF0YU1hbmFnZXJQbHVnaW4gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IERhdGFNYW5hZ2VyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRGF0YU1hbmFnZXJQbHVnaW4gKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIERhdGFNYW5hZ2VyLmNhbGwodGhpcywgc2NlbmUsIHNjZW5lLnN5cy5ldmVudHMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCB0aGlzIERhdGFNYW5hZ2VyIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlclBsdWdpbiNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUncyBTeXN0ZW1zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJQbHVnaW4jc3lzdGVtc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gc2NlbmUuc3lzO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyUGx1Z2luI2Jvb3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmV2ZW50cyA9IHRoaXMuc3lzdGVtcy5ldmVudHM7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGF0YS5EYXRhTWFuYWdlclBsdWdpbiNzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJQbHVnaW4jc2h1dGRvd25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vZmYoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAgICogV2UgbmVlZCB0byBzaHV0ZG93biBhbmQgdGhlbiBraWxsIG9mZiBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyUGx1Z2luI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIERhdGFNYW5hZ2VyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdEYXRhTWFuYWdlclBsdWdpbicsIERhdGFNYW5hZ2VyUGx1Z2luLCAnZGF0YScpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBEYXRhTWFuYWdlclBsdWdpbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIENoYW5nZSBEYXRhIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgRGF0YSBNYW5hZ2VyIHdoZW4gYW4gaXRlbSBpbiB0aGUgZGF0YSBzdG9yZSBpcyBjaGFuZ2VkLlxyXG4gKiBcclxuICogR2FtZSBPYmplY3RzIHdpdGggZGF0YSBlbmFibGVkIGhhdmUgYW4gaW5zdGFuY2Ugb2YgYSBEYXRhIE1hbmFnZXIgdW5kZXIgdGhlIGBkYXRhYCBwcm9wZXJ0eS4gU28sIHRvIGxpc3RlbiBmb3JcclxuICogYSBjaGFuZ2UgZGF0YSBldmVudCBmcm9tIGEgR2FtZSBPYmplY3QgeW91IHdvdWxkIHVzZTogYHNwcml0ZS5kYXRhLm9uKCdjaGFuZ2VkYXRhJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBmb3IgYWxsIGl0ZW1zIHRoYXQgY2hhbmdlIGluIHRoZSBEYXRhIE1hbmFnZXIuXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhlIGNoYW5nZSBvZiBhIHNwZWNpZmljIGl0ZW0sIHVzZSB0aGUgYENIQU5HRV9EQVRBX0tFWV9FVkVOVGAgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge2FueX0gcGFyZW50IC0gQSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB0aGF0IHRoZSBEYXRhIE1hbmFnZXIgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBkYXRhIGl0ZW0gd2l0aGluIHRoZSBEYXRhIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGl0ZW0gaW4gdGhlIERhdGEgTWFuYWdlci5cclxuICogQHBhcmFtIHthbnl9IHByZXZpb3VzVmFsdWUgLSBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGl0ZW0gaW4gdGhlIERhdGEgTWFuYWdlci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NoYW5nZWRhdGEnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQ2hhbmdlIERhdGEgS2V5IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgRGF0YSBNYW5hZ2VyIHdoZW4gYW4gaXRlbSBpbiB0aGUgZGF0YSBzdG9yZSBpcyBjaGFuZ2VkLlxyXG4gKiBcclxuICogR2FtZSBPYmplY3RzIHdpdGggZGF0YSBlbmFibGVkIGhhdmUgYW4gaW5zdGFuY2Ugb2YgYSBEYXRhIE1hbmFnZXIgdW5kZXIgdGhlIGBkYXRhYCBwcm9wZXJ0eS4gU28sIHRvIGxpc3RlbiBmb3JcclxuICogdGhlIGNoYW5nZSBvZiBhIHNwZWNpZmljIGRhdGEgaXRlbSBmcm9tIGEgR2FtZSBPYmplY3QgeW91IHdvdWxkIHVzZTogYHNwcml0ZS5kYXRhLm9uKCdjaGFuZ2VkYXRhLWtleScsIGxpc3RlbmVyKWAsXHJcbiAqIHdoZXJlIGBrZXlgIGlzIHRoZSB1bmlxdWUgc3RyaW5nIGtleSBvZiB0aGUgZGF0YSBpdGVtLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkYXRhIGl0ZW0gc3RvcmVkIGNhbGxlZCBgZ29sZGBcclxuICogdGhlbiB5b3UgY2FuIGxpc3RlbiBmb3IgYHNwcml0ZS5kYXRhLm9uKCdjaGFuZ2VkYXRhLWdvbGQnKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuRGF0YS5FdmVudHMjQ0hBTkdFX0RBVEFfS0VZXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICogXHJcbiAqIEBwYXJhbSB7YW55fSBwYXJlbnQgLSBBIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgaW5zdGFuY2Ugb2YgdGhlIERhdGEgTWFuYWdlciByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIGl0ZW0gdGhhdCB3YXMgdXBkYXRlZCBpbiB0aGUgRGF0YSBNYW5hZ2VyLiBUaGlzIGNhbiBiZSBvZiBhbnkgZGF0YSB0eXBlLCBpLmUuIGEgc3RyaW5nLCBib29sZWFuLCBudW1iZXIsIG9iamVjdCBvciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHthbnl9IHByZXZpb3VzVmFsdWUgLSBUaGUgcHJldmlvdXMgaXRlbSB0aGF0IHdhcyB1cGRhdGVkIGluIHRoZSBEYXRhIE1hbmFnZXIuIFRoaXMgY2FuIGJlIG9mIGFueSBkYXRhIHR5cGUsIGkuZS4gYSBzdHJpbmcsIGJvb2xlYW4sIG51bWJlciwgb2JqZWN0IG9yIGluc3RhbmNlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY2hhbmdlZGF0YS0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUmVtb3ZlIERhdGEgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBEYXRhIE1hbmFnZXIgd2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSBpdC5cclxuICogXHJcbiAqIEdhbWUgT2JqZWN0cyB3aXRoIGRhdGEgZW5hYmxlZCBoYXZlIGFuIGluc3RhbmNlIG9mIGEgRGF0YSBNYW5hZ2VyIHVuZGVyIHRoZSBgZGF0YWAgcHJvcGVydHkuIFNvLCB0byBsaXN0ZW4gZm9yXHJcbiAqIHRoZSByZW1vdmFsIG9mIGEgZGF0YSBpdGVtIG9uIGEgR2FtZSBPYmplY3QgeW91IHdvdWxkIHVzZTogYHNwcml0ZS5kYXRhLm9uKCdyZW1vdmVkYXRhJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5EYXRhLkV2ZW50cyNSRU1PVkVfREFUQVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7YW55fSBwYXJlbnQgLSBBIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgaW5zdGFuY2Ugb2YgdGhlIERhdGEgTWFuYWdlciByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBkYXRhIGl0ZW0gd2l0aGluIHRoZSBEYXRhIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7YW55fSBkYXRhIC0gVGhlIGl0ZW0gdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBEYXRhIE1hbmFnZXIuIFRoaXMgY2FuIGJlIG9mIGFueSBkYXRhIHR5cGUsIGkuZS4gYSBzdHJpbmcsIGJvb2xlYW4sIG51bWJlciwgb2JqZWN0IG9yIGluc3RhbmNlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncmVtb3ZlZGF0YSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTZXQgRGF0YSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIERhdGEgTWFuYWdlciB3aGVuIGEgbmV3IGl0ZW0gaXMgYWRkZWQgdG8gdGhlIGRhdGEgc3RvcmUuXHJcbiAqIFxyXG4gKiBHYW1lIE9iamVjdHMgd2l0aCBkYXRhIGVuYWJsZWQgaGF2ZSBhbiBpbnN0YW5jZSBvZiBhIERhdGEgTWFuYWdlciB1bmRlciB0aGUgYGRhdGFgIHByb3BlcnR5LiBTbywgdG8gbGlzdGVuIGZvclxyXG4gKiB0aGUgYWRkaXRpb24gb2YgYSBuZXcgZGF0YSBpdGVtIG9uIGEgR2FtZSBPYmplY3QgeW91IHdvdWxkIHVzZTogYHNwcml0ZS5kYXRhLm9uKCdzZXRkYXRhJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5EYXRhLkV2ZW50cyNTRVRfREFUQVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7YW55fSBwYXJlbnQgLSBBIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgaW5zdGFuY2Ugb2YgdGhlIERhdGEgTWFuYWdlciByZXNwb25zaWJsZSBmb3IgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUga2V5IG9mIHRoZSBkYXRhIGl0ZW0gd2l0aGluIHRoZSBEYXRhIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7YW55fSBkYXRhIC0gVGhlIGl0ZW0gdGhhdCB3YXMgYWRkZWQgdG8gdGhlIERhdGEgTWFuYWdlci4gVGhpcyBjYW4gYmUgb2YgYW55IGRhdGEgdHlwZSwgaS5lLiBhIHN0cmluZywgYm9vbGVhbiwgbnVtYmVyLCBvYmplY3Qgb3IgaW5zdGFuY2UuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzZXRkYXRhJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuRGF0YS5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDSEFOR0VfREFUQTogcmVxdWlyZSgnLi9DSEFOR0VfREFUQV9FVkVOVCcpLFxyXG4gICAgQ0hBTkdFX0RBVEFfS0VZOiByZXF1aXJlKCcuL0NIQU5HRV9EQVRBX0tFWV9FVkVOVCcpLFxyXG4gICAgUkVNT1ZFX0RBVEE6IHJlcXVpcmUoJy4vUkVNT1ZFX0RBVEFfRVZFTlQnKSxcclxuICAgIFNFVF9EQVRBOiByZXF1aXJlKCcuL1NFVF9EQVRBX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRhdGFcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBEYXRhTWFuYWdlcjogcmVxdWlyZSgnLi9EYXRhTWFuYWdlcicpLFxyXG4gICAgRGF0YU1hbmFnZXJQbHVnaW46IHJlcXVpcmUoJy4vRGF0YU1hbmFnZXJQbHVnaW4nKSxcclxuICAgIEV2ZW50czogcmVxdWlyZSgnLi9ldmVudHMnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnJvd3NlciA9IHJlcXVpcmUoJy4vQnJvd3NlcicpO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgdGhlIGF1ZGlvIHBsYXliYWNrIGNhcGFiaWxpdGllcyBvZiB0aGUgZGV2aWNlIHJ1bm5pbmcgdGhpcyBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICogVGhlc2UgdmFsdWVzIGFyZSByZWFkLW9ubHkgYW5kIHBvcHVsYXRlZCBkdXJpbmcgdGhlIGJvb3Qgc2VxdWVuY2Ugb2YgdGhlIGdhbWUuXHJcbiAqIFRoZXkgYXJlIHRoZW4gcmVmZXJlbmNlZCBieSBpbnRlcm5hbCBnYW1lIHN5c3RlbXMgYW5kIGFyZSBhdmFpbGFibGUgZm9yIHlvdSB0byBhY2Nlc3NcclxuICogdmlhIGB0aGlzLnN5cy5nYW1lLmRldmljZS5hdWRpb2AgZnJvbSB3aXRoaW4gYW55IFNjZW5lLlxyXG4gKiBcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLkRldmljZS5BdWRpb1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXVkaW9EYXRhIC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgSFRNTCBBdWRpbyB0YWdzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRvbGJ5IC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgRUMtMyBEb2xieSBEaWdpdGFsIFBsdXMgZmlsZXM/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbTRhIC0gQ2FuIHRoaXMgZGV2aWNlIGNhbiBwbGF5IG00YSBmaWxlcy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBtcDMgLSBDYW4gdGhpcyBkZXZpY2UgcGxheSBtcDMgZmlsZXM/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb2dnIC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgb2dnIGZpbGVzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wdXMgLSBDYW4gdGhpcyBkZXZpY2UgcGxheSBvcHVzIGZpbGVzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdhdiAtIENhbiB0aGlzIGRldmljZSBwbGF5IHdhdiBmaWxlcz9cclxuICogQHByb3BlcnR5IHtib29sZWFufSB3ZWJBdWRpbyAtIERvZXMgdGhpcyBkZXZpY2UgaGF2ZSB0aGUgV2ViIEF1ZGlvIEFQST9cclxuICogQHByb3BlcnR5IHtib29sZWFufSB3ZWJtIC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgd2VibSBmaWxlcz9cclxuICovXHJcbnZhciBBdWRpbyA9IHtcclxuXHJcbiAgICBhdWRpb0RhdGE6IGZhbHNlLFxyXG4gICAgZG9sYnk6IGZhbHNlLFxyXG4gICAgbTRhOiBmYWxzZSxcclxuICAgIG1wMzogZmFsc2UsXHJcbiAgICBvZ2c6IGZhbHNlLFxyXG4gICAgb3B1czogZmFsc2UsXHJcbiAgICB3YXY6IGZhbHNlLFxyXG4gICAgd2ViQXVkaW86IGZhbHNlLFxyXG4gICAgd2VibTogZmFsc2VcclxuXHJcbn07XHJcblxyXG5mdW5jdGlvbiBpbml0ICgpXHJcbntcclxuICAgIEF1ZGlvLmF1ZGlvRGF0YSA9ICEhKHdpbmRvd1snQXVkaW8nXSk7XHJcblxyXG4gICAgQXVkaW8ud2ViQXVkaW8gPSAhISh3aW5kb3dbJ0F1ZGlvQ29udGV4dCddIHx8IHdpbmRvd1snd2Via2l0QXVkaW9Db250ZXh0J10pO1xyXG5cclxuICAgIHZhciBhdWRpb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdWRpbycpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSAhIWF1ZGlvRWxlbWVudC5jYW5QbGF5VHlwZTtcclxuXHJcbiAgICB0cnlcclxuICAgIHtcclxuICAgICAgICBpZiAocmVzdWx0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGF1ZGlvRWxlbWVudC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEF1ZGlvLm9nZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUoJ2F1ZGlvL29nZzsgY29kZWNzPVwib3B1c1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSB8fCBhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUoJ2F1ZGlvL29wdXM7JykucmVwbGFjZSgvXm5vJC8sICcnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgQXVkaW8ub3B1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUoJ2F1ZGlvL21wZWc7JykucmVwbGFjZSgvXm5vJC8sICcnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgQXVkaW8ubXAzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIE1pbWV0eXBlcyBhY2NlcHRlZDpcclxuICAgICAgICAgICAgLy8gIGRldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9NZWRpYV9mb3JtYXRzX3N1cHBvcnRlZF9ieV90aGVfYXVkaW9fYW5kX3ZpZGVvX2VsZW1lbnRzXHJcbiAgICAgICAgICAgIC8vICBiaXQubHkvaXBob25lb3Njb2RlY3NcclxuICAgICAgICAgICAgaWYgKGF1ZGlvRWxlbWVudC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2OyBjb2RlY3M9XCIxXCInKS5yZXBsYWNlKC9ebm8kLywgJycpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBBdWRpby53YXYgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYXVkaW9FbGVtZW50LmNhblBsYXlUeXBlKCdhdWRpby94LW00YTsnKSB8fCBhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKS5yZXBsYWNlKC9ebm8kLywgJycpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBBdWRpby5tNGEgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYXVkaW9FbGVtZW50LmNhblBsYXlUeXBlKCdhdWRpby93ZWJtOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEF1ZGlvLndlYm0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYXVkaW9FbGVtZW50LmNhblBsYXlUeXBlKCdhdWRpby9tcDQ7Y29kZWNzPVwiZWMtM1wiJykgIT09ICcnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQnJvd3Nlci5lZGdlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvLmRvbGJ5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJyb3dzZXIuc2FmYXJpICYmIEJyb3dzZXIuc2FmYXJpVmVyc2lvbiA+PSA5KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoL01hYyBPUyBYIChcXGQrKV8oXFxkKykvKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1ham9yID0gcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtaW5vciA9IHBhcnNlSW50KFJlZ0V4cC4kMiwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYWpvciA9PT0gMTAgJiYgbWlub3IgPj0gMTEpIHx8IG1ham9yID4gMTApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvLmRvbGJ5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIGRvIGhlcmVcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gQXVkaW87XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gaW5pdCgpO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBPUyA9IHJlcXVpcmUoJy4vT1MnKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHRoZSBicm93c2VyIHR5cGUgYW5kIHZlcnNpb24gcnVubmluZyB0aGlzIFBoYXNlciBHYW1lIGluc3RhbmNlLlxyXG4gKiBUaGVzZSB2YWx1ZXMgYXJlIHJlYWQtb25seSBhbmQgcG9wdWxhdGVkIGR1cmluZyB0aGUgYm9vdCBzZXF1ZW5jZSBvZiB0aGUgZ2FtZS5cclxuICogVGhleSBhcmUgdGhlbiByZWZlcmVuY2VkIGJ5IGludGVybmFsIGdhbWUgc3lzdGVtcyBhbmQgYXJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIGFjY2Vzc1xyXG4gKiB2aWEgYHRoaXMuc3lzLmdhbWUuZGV2aWNlLmJyb3dzZXJgIGZyb20gd2l0aGluIGFueSBTY2VuZS5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5EZXZpY2UuQnJvd3NlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2hyb21lIC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiBDaHJvbWUuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWRnZSAtIFNldCB0byB0cnVlIGlmIHJ1bm5pbmcgaW4gTWljcm9zb2Z0IEVkZ2UgYnJvd3Nlci5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBmaXJlZm94IC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiBGaXJlZm94LlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGllIC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMSBvciBsZXNzIChub3QgRWRnZSkuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbW9iaWxlU2FmYXJpIC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiBNb2JpbGUgU2FmYXJpLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9wZXJhIC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiBPcGVyYS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBzYWZhcmkgLSBTZXQgdG8gdHJ1ZSBpZiBydW5uaW5nIGluIFNhZmFyaS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBzaWxrIC0gU2V0IHRvIHRydWUgaWYgcnVubmluZyBpbiB0aGUgU2lsayBicm93c2VyIChhcyB1c2VkIG9uIHRoZSBBbWF6b24gS2luZGxlKVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRyaWRlbnQgLSBTZXQgdG8gdHJ1ZSBpZiBydW5uaW5nIGEgVHJpZGVudCB2ZXJzaW9uIG9mIEludGVybmV0IEV4cGxvcmVyIChJRTExKylcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNocm9tZVZlcnNpb24gLSBJZiBydW5uaW5nIGluIENocm9tZSB0aGlzIHdpbGwgY29udGFpbiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmaXJlZm94VmVyc2lvbiAtIElmIHJ1bm5pbmcgaW4gRmlyZWZveCB0aGlzIHdpbGwgY29udGFpbiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZVZlcnNpb24gLSBJZiBydW5uaW5nIGluIEludGVybmV0IEV4cGxvcmVyIHRoaXMgd2lsbCBjb250YWluIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci4gQmV5b25kIElFMTAgeW91IHNob3VsZCB1c2UgQnJvd3Nlci50cmlkZW50IGFuZCBCcm93c2VyLnRyaWRlbnRWZXJzaW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2FmYXJpVmVyc2lvbiAtIElmIHJ1bm5pbmcgaW4gU2FmYXJpIHRoaXMgd2lsbCBjb250YWluIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRyaWRlbnRWZXJzaW9uIC0gSWYgcnVubmluZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMSB0aGlzIHdpbGwgY29udGFpbiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuIFNlZSB7QGxpbmsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL21zNTM3NTAzKHY9dnMuODUpLmFzcHh9XHJcbiAqL1xyXG52YXIgQnJvd3NlciA9IHtcclxuXHJcbiAgICBjaHJvbWU6IGZhbHNlLFxyXG4gICAgY2hyb21lVmVyc2lvbjogMCxcclxuICAgIGVkZ2U6IGZhbHNlLFxyXG4gICAgZmlyZWZveDogZmFsc2UsXHJcbiAgICBmaXJlZm94VmVyc2lvbjogMCxcclxuICAgIGllOiBmYWxzZSxcclxuICAgIGllVmVyc2lvbjogMCxcclxuICAgIG1vYmlsZVNhZmFyaTogZmFsc2UsXHJcbiAgICBvcGVyYTogZmFsc2UsXHJcbiAgICBzYWZhcmk6IGZhbHNlLFxyXG4gICAgc2FmYXJpVmVyc2lvbjogMCxcclxuICAgIHNpbGs6IGZhbHNlLFxyXG4gICAgdHJpZGVudDogZmFsc2UsXHJcbiAgICB0cmlkZW50VmVyc2lvbjogMFxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIGluaXQgKClcclxue1xyXG4gICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuXHJcbiAgICBpZiAoL0VkZ2VcXC9cXGQrLy50ZXN0KHVhKSlcclxuICAgIHtcclxuICAgICAgICBCcm93c2VyLmVkZ2UgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoKC9DaHJvbWVcXC8oXFxkKykvKS50ZXN0KHVhKSAmJiAhT1Mud2luZG93c1Bob25lKVxyXG4gICAge1xyXG4gICAgICAgIEJyb3dzZXIuY2hyb21lID0gdHJ1ZTtcclxuICAgICAgICBCcm93c2VyLmNocm9tZVZlcnNpb24gPSBwYXJzZUludChSZWdFeHAuJDEsIDEwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCgvRmlyZWZveFxcRCsoXFxkKykvKS50ZXN0KHVhKSlcclxuICAgIHtcclxuICAgICAgICBCcm93c2VyLmZpcmVmb3ggPSB0cnVlO1xyXG4gICAgICAgIEJyb3dzZXIuZmlyZWZveFZlcnNpb24gPSBwYXJzZUludChSZWdFeHAuJDEsIDEwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCgvQXBwbGVXZWJLaXQvKS50ZXN0KHVhKSAmJiBPUy5pT1MpXHJcbiAgICB7XHJcbiAgICAgICAgQnJvd3Nlci5tb2JpbGVTYWZhcmkgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoKC9NU0lFIChcXGQrXFwuXFxkKyk7LykudGVzdCh1YSkpXHJcbiAgICB7XHJcbiAgICAgICAgQnJvd3Nlci5pZSA9IHRydWU7XHJcbiAgICAgICAgQnJvd3Nlci5pZVZlcnNpb24gPSBwYXJzZUludChSZWdFeHAuJDEsIDEwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCgvT3BlcmEvKS50ZXN0KHVhKSlcclxuICAgIHtcclxuICAgICAgICBCcm93c2VyLm9wZXJhID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCgvU2FmYXJpLykudGVzdCh1YSkgJiYgIU9TLndpbmRvd3NQaG9uZSlcclxuICAgIHtcclxuICAgICAgICBCcm93c2VyLnNhZmFyaSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgoL1RyaWRlbnRcXC8oXFxkK1xcLlxcZCspKC4qKXJ2OihcXGQrXFwuXFxkKykvKS50ZXN0KHVhKSlcclxuICAgIHtcclxuICAgICAgICBCcm93c2VyLmllID0gdHJ1ZTtcclxuICAgICAgICBCcm93c2VyLnRyaWRlbnQgPSB0cnVlO1xyXG4gICAgICAgIEJyb3dzZXIudHJpZGVudFZlcnNpb24gPSBwYXJzZUludChSZWdFeHAuJDEsIDEwKTtcclxuICAgICAgICBCcm93c2VyLmllVmVyc2lvbiA9IHBhcnNlSW50KFJlZ0V4cC4kMywgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBTaWxrIGdldHMgaXRzIG93biBpZiBjbGF1c2UgYmVjYXVzZSBpdHMgdWEgYWxzbyBjb250YWlucyAnU2FmYXJpJ1xyXG4gICAgaWYgKCgvU2lsay8pLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIEJyb3dzZXIuc2lsayA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIEJyb3dzZXI7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gaW5pdCgpO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDYW52YXNQb29sID0gcmVxdWlyZSgnLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzUG9vbCcpO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgdGhlIGNhbnZhcyBmZWF0dXJlcyBvZiB0aGUgYnJvd3NlciBydW5uaW5nIHRoaXMgUGhhc2VyIEdhbWUgaW5zdGFuY2UuXHJcbiAqIFRoZXNlIHZhbHVlcyBhcmUgcmVhZC1vbmx5IGFuZCBwb3B1bGF0ZWQgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlIG9mIHRoZSBnYW1lLlxyXG4gKiBUaGV5IGFyZSB0aGVuIHJlZmVyZW5jZWQgYnkgaW50ZXJuYWwgZ2FtZSBzeXN0ZW1zIGFuZCBhcmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gYWNjZXNzXHJcbiAqIHZpYSBgdGhpcy5zeXMuZ2FtZS5kZXZpY2UuY2FudmFzRmVhdHVyZXNgIGZyb20gd2l0aGluIGFueSBTY2VuZS5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5EZXZpY2UuQ2FudmFzRmVhdHVyZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN1cHBvcnRJbnZlcnNlQWxwaGEgLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBpbnZlcnNlZCBhbHBoYS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBzdXBwb3J0TmV3QmxlbmRNb2RlcyAtIFNldCB0byB0cnVlIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIG5ldyBjYW52YXMgYmxlbmQgbW9kZXMuXHJcbiAqL1xyXG52YXIgQ2FudmFzRmVhdHVyZXMgPSB7XHJcblxyXG4gICAgc3VwcG9ydEludmVyc2VBbHBoYTogZmFsc2UsXHJcbiAgICBzdXBwb3J0TmV3QmxlbmRNb2RlczogZmFsc2VcclxuXHJcbn07XHJcblxyXG5mdW5jdGlvbiBjaGVja0JsZW5kTW9kZSAoKVxyXG57XHJcbiAgICB2YXIgcG5nSGVhZCA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQUJBUU1BQUFERDhwMk9BQUFBQTFCTVZFWC8nO1xyXG4gICAgdmFyIHBuZ0VuZCA9ICdBQUFBQ2tsRVFWUUkxMk5nQUFBQUFnQUI0aUc4TXdBQUFBQkpSVTVFcmtKZ2dnPT0nO1xyXG5cclxuICAgIHZhciBtYWdlbnRhID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgbWFnZW50YS5vbmxvYWQgPSBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB5ZWxsb3cgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgeWVsbG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUoeWVsbG93LCA2LCAxKTtcclxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ211bHRpcGx5JztcclxuXHJcbiAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKG1hZ2VudGEsIDAsIDApO1xyXG4gICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh5ZWxsb3csIDIsIDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldEltYWdlRGF0YSgyLCAwLCAxLCAxKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDIsIDAsIDEsIDEpLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBDYW52YXNQb29sLnJlbW92ZSh5ZWxsb3cpO1xyXG5cclxuICAgICAgICAgICAgQ2FudmFzRmVhdHVyZXMuc3VwcG9ydE5ld0JsZW5kTW9kZXMgPSAoZGF0YVswXSA9PT0gMjU1ICYmIGRhdGFbMV0gPT09IDAgJiYgZGF0YVsyXSA9PT0gMCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgeWVsbG93LnNyYyA9IHBuZ0hlYWQgKyAnL3dDS3h2UkYnICsgcG5nRW5kO1xyXG4gICAgfTtcclxuXHJcbiAgICBtYWdlbnRhLnNyYyA9IHBuZ0hlYWQgKyAnQVA4MDRPYTYnICsgcG5nRW5kO1xyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbnZlcnNlQWxwaGEgKClcclxue1xyXG4gICAgdmFyIGNhbnZhcyA9IENhbnZhc1Bvb2wuY3JlYXRlKHRoaXMsIDIsIDEpO1xyXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDEwLCAyMCwgMzAsIDAuNSknO1xyXG5cclxuICAgIC8vICBEcmF3IGEgc2luZ2xlIHBpeGVsXHJcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xyXG5cclxuICAgIC8vICBHZXQgdGhlIGNvbG9yIHZhbHVlc1xyXG4gICAgdmFyIHMxID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XHJcblxyXG4gICAgaWYgKHMxID09PSBudWxsKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgUGxvdCB0aGVtIHRvIHgyXHJcbiAgICBjb250ZXh0LnB1dEltYWdlRGF0YShzMSwgMSwgMCk7XHJcblxyXG4gICAgLy8gIEdldCB0aG9zZSB2YWx1ZXNcclxuICAgIHZhciBzMiA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDEsIDAsIDEsIDEpO1xyXG5cclxuICAgIC8vICBDb21wYXJlIGFuZCByZXR1cm5cclxuICAgIHJldHVybiAoczIuZGF0YVswXSA9PT0gczEuZGF0YVswXSAmJiBzMi5kYXRhWzFdID09PSBzMS5kYXRhWzFdICYmIHMyLmRhdGFbMl0gPT09IHMxLmRhdGFbMl0gJiYgczIuZGF0YVszXSA9PT0gczEuZGF0YVszXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXQgKClcclxue1xyXG4gICAgaWYgKGRvY3VtZW50ICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgQ2FudmFzRmVhdHVyZXMuc3VwcG9ydE5ld0JsZW5kTW9kZXMgPSBjaGVja0JsZW5kTW9kZSgpO1xyXG4gICAgICAgIENhbnZhc0ZlYXR1cmVzLnN1cHBvcnRJbnZlcnNlQWxwaGEgPSBjaGVja0ludmVyc2VBbHBoYSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBDYW52YXNGZWF0dXJlcztcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBpbml0KCk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE9TID0gcmVxdWlyZSgnLi9PUycpO1xyXG52YXIgQnJvd3NlciA9IHJlcXVpcmUoJy4vQnJvd3NlcicpO1xyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHRoZSBmZWF0dXJlcyBvZiB0aGUgYnJvd3NlciBydW5uaW5nIHRoaXMgUGhhc2VyIEdhbWUgaW5zdGFuY2UuXHJcbiAqIFRoZXNlIHZhbHVlcyBhcmUgcmVhZC1vbmx5IGFuZCBwb3B1bGF0ZWQgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlIG9mIHRoZSBnYW1lLlxyXG4gKiBUaGV5IGFyZSB0aGVuIHJlZmVyZW5jZWQgYnkgaW50ZXJuYWwgZ2FtZSBzeXN0ZW1zIGFuZCBhcmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gYWNjZXNzXHJcbiAqIHZpYSBgdGhpcy5zeXMuZ2FtZS5kZXZpY2UuZmVhdHVyZXNgIGZyb20gd2l0aGluIGFueSBTY2VuZS5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5EZXZpY2UuRmVhdHVyZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBjYW52YXNCaXRCbHRTaGlmdCAtIFRydWUgaWYgY2FudmFzIHN1cHBvcnRzIGEgJ2NvcHknIGJpdGJsdCBvbnRvIGl0c2VsZiB3aGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ2lvbnMgb3ZlcmxhcC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBjYW52YXMgLSBJcyBjYW52YXMgYXZhaWxhYmxlP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZpbGUgLSBJcyBmaWxlIGF2YWlsYWJsZT9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBmaWxlU3lzdGVtIC0gSXMgZmlsZVN5c3RlbSBhdmFpbGFibGU/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2V0VXNlck1lZGlhIC0gRG9lcyB0aGUgZGV2aWNlIHN1cHBvcnQgdGhlIGdldFVzZXJNZWRpYSBBUEk/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbGl0dGxlRW5kaWFuIC0gSXMgdGhlIGRldmljZSBiaWcgb3IgbGl0dGxlIGVuZGlhbj8gKG9ubHkgZGV0ZWN0ZWQgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgVHlwZWRBcnJheXMpXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9jYWxTdG9yYWdlIC0gSXMgbG9jYWxTdG9yYWdlIGF2YWlsYWJsZT9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBwb2ludGVyTG9jayAtIElzIFBvaW50ZXIgTG9jayBhdmFpbGFibGU/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3VwcG9ydDMyYml0IC0gRG9lcyB0aGUgZGV2aWNlIGNvbnRleHQgc3VwcG9ydCAzMmJpdCBwaXhlbCBtYW5pcHVsYXRpb24gdXNpbmcgYXJyYXkgYnVmZmVyIHZpZXdzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpYnJhdGlvbiAtIERvZXMgdGhlIGRldmljZSBzdXBwb3J0IHRoZSBWaWJyYXRpb24gQVBJP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdlYkdMIC0gSXMgd2ViR0wgYXZhaWxhYmxlP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdvcmtlciAtIElzIHdvcmtlciBhdmFpbGFibGU/XHJcbiAqL1xyXG52YXIgRmVhdHVyZXMgPSB7XHJcblxyXG4gICAgY2FudmFzOiBmYWxzZSxcclxuICAgIGNhbnZhc0JpdEJsdFNoaWZ0OiBudWxsLFxyXG4gICAgZmlsZTogZmFsc2UsXHJcbiAgICBmaWxlU3lzdGVtOiBmYWxzZSxcclxuICAgIGdldFVzZXJNZWRpYTogdHJ1ZSxcclxuICAgIGxpdHRsZUVuZGlhbjogZmFsc2UsXHJcbiAgICBsb2NhbFN0b3JhZ2U6IGZhbHNlLFxyXG4gICAgcG9pbnRlckxvY2s6IGZhbHNlLFxyXG4gICAgc3VwcG9ydDMyYml0OiBmYWxzZSxcclxuICAgIHZpYnJhdGlvbjogZmFsc2UsXHJcbiAgICB3ZWJHTDogZmFsc2UsXHJcbiAgICB3b3JrZXI6IGZhbHNlXHJcblxyXG59O1xyXG5cclxuLy8gQ2hlY2sgTGl0dGxlIG9yIEJpZyBFbmRpYW4gc3lzdGVtLlxyXG4vLyBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgKEBtYXR0ZGVzbClcclxuZnVuY3Rpb24gY2hlY2tJc0xpdHRsZUVuZGlhbiAoKVxyXG57XHJcbiAgICB2YXIgYSA9IG5ldyBBcnJheUJ1ZmZlcig0KTtcclxuICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoYSk7XHJcbiAgICB2YXIgYyA9IG5ldyBVaW50MzJBcnJheShhKTtcclxuXHJcbiAgICBiWzBdID0gMHhhMTtcclxuICAgIGJbMV0gPSAweGIyO1xyXG4gICAgYlsyXSA9IDB4YzM7XHJcbiAgICBiWzNdID0gMHhkNDtcclxuXHJcbiAgICBpZiAoY1swXSA9PT0gMHhkNGMzYjJhMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY1swXSA9PT0gMHhhMWIyYzNkNClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIENvdWxkIG5vdCBkZXRlcm1pbmUgZW5kaWFubmVzc1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0ICgpXHJcbntcclxuICAgIEZlYXR1cmVzLmNhbnZhcyA9ICEhd2luZG93WydDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQnXTtcclxuXHJcbiAgICB0cnlcclxuICAgIHtcclxuICAgICAgICBGZWF0dXJlcy5sb2NhbFN0b3JhZ2UgPSAhIWxvY2FsU3RvcmFnZS5nZXRJdGVtO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKVxyXG4gICAge1xyXG4gICAgICAgIEZlYXR1cmVzLmxvY2FsU3RvcmFnZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEZlYXR1cmVzLmZpbGUgPSAhIXdpbmRvd1snRmlsZSddICYmICEhd2luZG93WydGaWxlUmVhZGVyJ10gJiYgISF3aW5kb3dbJ0ZpbGVMaXN0J10gJiYgISF3aW5kb3dbJ0Jsb2InXTtcclxuICAgIEZlYXR1cmVzLmZpbGVTeXN0ZW0gPSAhIXdpbmRvd1sncmVxdWVzdEZpbGVTeXN0ZW0nXTtcclxuXHJcbiAgICB2YXIgaXNVaW50OCA9IGZhbHNlO1xyXG5cclxuICAgIHZhciB0ZXN0V2ViR0wgPSBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aW5kb3dbJ1dlYkdMUmVuZGVyaW5nQ29udGV4dCddKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHJ5XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYW52YXMgPSBDYW52YXNQb29sLmNyZWF0ZVdlYkdMKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGNhbnZhczJEID0gQ2FudmFzUG9vbC5jcmVhdGUyRCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgY3R4MkQgPSBjYW52YXMyRC5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBDYW4ndCBiZSBkb25lIG9uIGEgd2ViZ2wgY29udGV4dFxyXG4gICAgICAgICAgICAgICAgdmFyIGltYWdlID0gY3R4MkQuY3JlYXRlSW1hZ2VEYXRhKDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBUZXN0IHRvIHNlZSBpZiBJbWFnZURhdGEgdXNlcyBDYW52YXNQaXhlbEFycmF5IG9yIFVpbnQ4Q2xhbXBlZEFycmF5LlxyXG4gICAgICAgICAgICAgICAgLy8gIEBhdXRob3IgTWF0dCBEZXNMYXVyaWVycyAoQG1hdHRkZXNsKVxyXG4gICAgICAgICAgICAgICAgaXNVaW50OCA9IGltYWdlLmRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheTtcclxuXHJcbiAgICAgICAgICAgICAgICBDYW52YXNQb29sLnJlbW92ZShjYW52YXMpO1xyXG4gICAgICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUoY2FudmFzMkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiAhIWN0eDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG5cclxuICAgIEZlYXR1cmVzLndlYkdMID0gdGVzdFdlYkdMKCk7XHJcblxyXG4gICAgRmVhdHVyZXMud29ya2VyID0gISF3aW5kb3dbJ1dvcmtlciddO1xyXG5cclxuICAgIEZlYXR1cmVzLnBvaW50ZXJMb2NrID0gJ3BvaW50ZXJMb2NrRWxlbWVudCcgaW4gZG9jdW1lbnQgfHwgJ21velBvaW50ZXJMb2NrRWxlbWVudCcgaW4gZG9jdW1lbnQgfHwgJ3dlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCcgaW4gZG9jdW1lbnQ7XHJcblxyXG4gICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSA9IG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgfHwgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhIHx8IG5hdmlnYXRvci5tc0dldFVzZXJNZWRpYSB8fCBuYXZpZ2F0b3Iub0dldFVzZXJNZWRpYTtcclxuXHJcbiAgICB3aW5kb3cuVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xyXG5cclxuICAgIEZlYXR1cmVzLmdldFVzZXJNZWRpYSA9IEZlYXR1cmVzLmdldFVzZXJNZWRpYSAmJiAhIW5hdmlnYXRvci5nZXRVc2VyTWVkaWEgJiYgISF3aW5kb3cuVVJMO1xyXG5cclxuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIGZpcmVmb3ggKDwgMjEpIGFwcGFyZW50bHkgY2xhaW0gc3VwcG9ydCBidXQgdXNlciBtZWRpYSBkb2VzIG5vdCBhY3R1YWxseSB3b3JrXHJcbiAgICBpZiAoQnJvd3Nlci5maXJlZm94ICYmIEJyb3dzZXIuZmlyZWZveFZlcnNpb24gPCAyMSlcclxuICAgIHtcclxuICAgICAgICBGZWF0dXJlcy5nZXRVc2VyTWVkaWEgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeGNsdWRlcyBpT1MgdmVyc2lvbnMgYXMgdGhleSBnZW5lcmFsbHkgd3JhcCBVSVdlYlZpZXcgKGVnLiBTYWZhcmkgV2ViS2l0KSBhbmQgaXRcclxuICAgIC8vIGlzIHNhZmVyIHRvIG5vdCB0cnkgYW5kIHVzZSB0aGUgZmFzdCBjb3B5LW92ZXIgbWV0aG9kLlxyXG4gICAgaWYgKCFPUy5pT1MgJiYgKEJyb3dzZXIuaWUgfHwgQnJvd3Nlci5maXJlZm94IHx8IEJyb3dzZXIuY2hyb21lKSlcclxuICAgIHtcclxuICAgICAgICBGZWF0dXJlcy5jYW52YXNCaXRCbHRTaGlmdCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gS25vd24gbm90IHRvIHdvcmtcclxuICAgIGlmIChCcm93c2VyLnNhZmFyaSB8fCBCcm93c2VyLm1vYmlsZVNhZmFyaSlcclxuICAgIHtcclxuICAgICAgICBGZWF0dXJlcy5jYW52YXNCaXRCbHRTaGlmdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG5hdmlnYXRvci52aWJyYXRlID0gbmF2aWdhdG9yLnZpYnJhdGUgfHwgbmF2aWdhdG9yLndlYmtpdFZpYnJhdGUgfHwgbmF2aWdhdG9yLm1velZpYnJhdGUgfHwgbmF2aWdhdG9yLm1zVmlicmF0ZTtcclxuXHJcbiAgICBpZiAobmF2aWdhdG9yLnZpYnJhdGUpXHJcbiAgICB7XHJcbiAgICAgICAgRmVhdHVyZXMudmlicmF0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJylcclxuICAgIHtcclxuICAgICAgICBGZWF0dXJlcy5saXR0bGVFbmRpYW4gPSBjaGVja0lzTGl0dGxlRW5kaWFuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgRmVhdHVyZXMuc3VwcG9ydDMyYml0ID0gKFxyXG4gICAgICAgIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgICAgICB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICAgICAgRmVhdHVyZXMubGl0dGxlRW5kaWFuICE9PSBudWxsICYmXHJcbiAgICAgICAgaXNVaW50OFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gRmVhdHVyZXM7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gaW5pdCgpO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIHRoZSBmdWxsIHNjcmVlbiBzdXBwb3J0IG9mIHRoZSBicm93c2VyIHJ1bm5pbmcgdGhpcyBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICogVGhlc2UgdmFsdWVzIGFyZSByZWFkLW9ubHkgYW5kIHBvcHVsYXRlZCBkdXJpbmcgdGhlIGJvb3Qgc2VxdWVuY2Ugb2YgdGhlIGdhbWUuXHJcbiAqIFRoZXkgYXJlIHRoZW4gcmVmZXJlbmNlZCBieSBpbnRlcm5hbCBnYW1lIHN5c3RlbXMgYW5kIGFyZSBhdmFpbGFibGUgZm9yIHlvdSB0byBhY2Nlc3NcclxuICogdmlhIGB0aGlzLnN5cy5nYW1lLmRldmljZS5mdWxsc2NyZWVuYCBmcm9tIHdpdGhpbiBhbnkgU2NlbmUuXHJcbiAqIFxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuRGV2aWNlLkZ1bGxzY3JlZW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGF2YWlsYWJsZSAtIERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCB0aGUgRnVsbCBTY3JlZW4gQVBJP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtleWJvYXJkIC0gRG9lcyB0aGUgYnJvd3NlciBzdXBwb3J0IGFjY2VzcyB0byB0aGUgS2V5Ym9hcmQgZHVyaW5nIEZ1bGwgU2NyZWVuIG1vZGU/XHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYW5jZWwgLSBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgRnVsbCBTY3JlZW4gQVBJIHRoaXMgaG9sZHMgdGhlIGNhbGwgeW91IG5lZWQgdG8gdXNlIHRvIGNhbmNlbCBpdC5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlcXVlc3QgLSBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgRnVsbCBTY3JlZW4gQVBJIHRoaXMgaG9sZHMgdGhlIGNhbGwgeW91IG5lZWQgdG8gdXNlIHRvIGFjdGl2YXRlIGl0LlxyXG4gKi9cclxudmFyIEZ1bGxzY3JlZW4gPSB7XHJcblxyXG4gICAgYXZhaWxhYmxlOiBmYWxzZSxcclxuICAgIGNhbmNlbDogJycsXHJcbiAgICBrZXlib2FyZDogZmFsc2UsXHJcbiAgICByZXF1ZXN0OiAnJ1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4qIENoZWNrcyBmb3Igc3VwcG9ydCBvZiB0aGUgRnVsbCBTY3JlZW4gQVBJLlxyXG4qIFxyXG4qIEBpZ25vcmVcclxuKi9cclxuZnVuY3Rpb24gaW5pdCAoKVxyXG57XHJcbiAgICB2YXIgaTtcclxuXHJcbiAgICB2YXIgc3VmZml4MSA9ICdGdWxsc2NyZWVuJztcclxuICAgIHZhciBzdWZmaXgyID0gJ0Z1bGxTY3JlZW4nO1xyXG5cclxuICAgIHZhciBmcyA9IFtcclxuICAgICAgICAncmVxdWVzdCcgKyBzdWZmaXgxLFxyXG4gICAgICAgICdyZXF1ZXN0JyArIHN1ZmZpeDIsXHJcbiAgICAgICAgJ3dlYmtpdFJlcXVlc3QnICsgc3VmZml4MSxcclxuICAgICAgICAnd2Via2l0UmVxdWVzdCcgKyBzdWZmaXgyLFxyXG4gICAgICAgICdtc1JlcXVlc3QnICsgc3VmZml4MSxcclxuICAgICAgICAnbXNSZXF1ZXN0JyArIHN1ZmZpeDIsXHJcbiAgICAgICAgJ21velJlcXVlc3QnICsgc3VmZml4MixcclxuICAgICAgICAnbW96UmVxdWVzdCcgKyBzdWZmaXgxXHJcbiAgICBdO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBmcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2ZzW2ldXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZ1bGxzY3JlZW4uYXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgRnVsbHNjcmVlbi5yZXF1ZXN0ID0gZnNbaV07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2ZzID0gW1xyXG4gICAgICAgICdjYW5jZWwnICsgc3VmZml4MixcclxuICAgICAgICAnZXhpdCcgKyBzdWZmaXgxLFxyXG4gICAgICAgICd3ZWJraXRDYW5jZWwnICsgc3VmZml4MixcclxuICAgICAgICAnd2Via2l0RXhpdCcgKyBzdWZmaXgxLFxyXG4gICAgICAgICdtc0NhbmNlbCcgKyBzdWZmaXgyLFxyXG4gICAgICAgICdtc0V4aXQnICsgc3VmZml4MSxcclxuICAgICAgICAnbW96Q2FuY2VsJyArIHN1ZmZpeDIsXHJcbiAgICAgICAgJ21vekV4aXQnICsgc3VmZml4MVxyXG4gICAgXTtcclxuXHJcbiAgICBpZiAoRnVsbHNjcmVlbi5hdmFpbGFibGUpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNmcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudFtjZnNbaV1dKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBGdWxsc2NyZWVuLmNhbmNlbCA9IGNmc1tpXTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBLZXlib2FyZCBJbnB1dD9cclxuICAgIC8vICBTYWZhcmkgNS4xIHNheXMgaXQgc3VwcG9ydHMgZnVsbHNjcmVlbiBrZXlib2FyZCwgYnV0IGlzIGx5aW5nLlxyXG4gICAgaWYgKHdpbmRvd1snRWxlbWVudCddICYmIEVsZW1lbnRbJ0FMTE9XX0tFWUJPQVJEX0lOUFVUJ10gJiYgISgvIFZlcnNpb25cXC81XFwuMSg/OlxcLlxcZCspPyBTYWZhcmlcXC8vKS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKVxyXG4gICAge1xyXG4gICAgICAgIEZ1bGxzY3JlZW4ua2V5Ym9hcmQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdWxsc2NyZWVuLCAnYWN0aXZlJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEhKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQpOyB9IH0pO1xyXG5cclxuICAgIHJldHVybiBGdWxsc2NyZWVuO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGluaXQoKTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnJvd3NlciA9IHJlcXVpcmUoJy4vQnJvd3NlcicpO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgdGhlIGlucHV0IHN1cHBvcnQgb2YgdGhlIGJyb3dzZXIgcnVubmluZyB0aGlzIFBoYXNlciBHYW1lIGluc3RhbmNlLlxyXG4gKiBUaGVzZSB2YWx1ZXMgYXJlIHJlYWQtb25seSBhbmQgcG9wdWxhdGVkIGR1cmluZyB0aGUgYm9vdCBzZXF1ZW5jZSBvZiB0aGUgZ2FtZS5cclxuICogVGhleSBhcmUgdGhlbiByZWZlcmVuY2VkIGJ5IGludGVybmFsIGdhbWUgc3lzdGVtcyBhbmQgYXJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIGFjY2Vzc1xyXG4gKiB2aWEgYHRoaXMuc3lzLmdhbWUuZGV2aWNlLmlucHV0YCBmcm9tIHdpdGhpbiBhbnkgU2NlbmUuXHJcbiAqIFxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuRGV2aWNlLklucHV0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB3aGVlbFR5cGUgLSBUaGUgbmV3ZXN0IHR5cGUgb2YgV2hlZWwvU2Nyb2xsIGV2ZW50IHN1cHBvcnRlZDogJ3doZWVsJywgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2FtZXBhZHMgLSBJcyBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMgYXZhaWxhYmxlP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG1zcG9pbnRlciAtIElzIG1zcG9pbnRlciBhdmFpbGFibGU/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdG91Y2ggLSBJcyB0b3VjaCBhdmFpbGFibGU/XHJcbiAqL1xyXG52YXIgSW5wdXQgPSB7XHJcblxyXG4gICAgZ2FtZXBhZHM6IGZhbHNlLFxyXG4gICAgbXNwb2ludGVyOiBmYWxzZSxcclxuICAgIHRvdWNoOiBmYWxzZSxcclxuICAgIHdoZWVsRXZlbnQ6IG51bGxcclxuICAgIFxyXG59O1xyXG5cclxuZnVuY3Rpb24gaW5pdCAoKVxyXG57XHJcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IChuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID49IDEpKVxyXG4gICAge1xyXG4gICAgICAgIElucHV0LnRvdWNoID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgfHwgbmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkKVxyXG4gICAge1xyXG4gICAgICAgIElucHV0Lm1zcG9pbnRlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5hdmlnYXRvci5nZXRHYW1lcGFkcylcclxuICAgIHtcclxuICAgICAgICBJbnB1dC5nYW1lcGFkcyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy93aGVlbFxyXG4gICAgaWYgKCdvbndoZWVsJyBpbiB3aW5kb3cgfHwgKEJyb3dzZXIuaWUgJiYgJ1doZWVsRXZlbnQnIGluIHdpbmRvdykpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRE9NMyBXaGVlbCBFdmVudDogRkYgMTcrLCBJRSA5KywgQ2hyb21lIDMxKywgU2FmYXJpIDcrXHJcbiAgICAgICAgSW5wdXQud2hlZWxFdmVudCA9ICd3aGVlbCc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgnb25tb3VzZXdoZWVsJyBpbiB3aW5kb3cpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gTm9uLUZGIGxlZ2FjeTogSUUgNi05LCBDaHJvbWUgMS0zMSwgU2FmYXJpIDUtNy5cclxuICAgICAgICBJbnB1dC53aGVlbEV2ZW50ID0gJ21vdXNld2hlZWwnO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoQnJvd3Nlci5maXJlZm94ICYmICdNb3VzZVNjcm9sbEV2ZW50JyBpbiB3aW5kb3cpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRkYgcHJpb3IgdG8gMTcuIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNjcnViYmVkLlxyXG4gICAgICAgIElucHV0LndoZWVsRXZlbnQgPSAnRE9NTW91c2VTY3JvbGwnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBJbnB1dDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBpbml0KCk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIGRldmljZSBydW5uaW5nIHRoaXMgUGhhc2VyIEdhbWUgaW5zdGFuY2UuXHJcbiAqIFRoZXNlIHZhbHVlcyBhcmUgcmVhZC1vbmx5IGFuZCBwb3B1bGF0ZWQgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlIG9mIHRoZSBnYW1lLlxyXG4gKiBUaGV5IGFyZSB0aGVuIHJlZmVyZW5jZWQgYnkgaW50ZXJuYWwgZ2FtZSBzeXN0ZW1zIGFuZCBhcmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gYWNjZXNzXHJcbiAqIHZpYSBgdGhpcy5zeXMuZ2FtZS5kZXZpY2Uub3NgIGZyb20gd2l0aGluIGFueSBTY2VuZS5cclxuICpcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLkRldmljZS5PU1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHByb3BlcnR5IHtib29sZWFufSBhbmRyb2lkIC0gSXMgcnVubmluZyBvbiBhbmRyb2lkP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNocm9tZU9TIC0gSXMgcnVubmluZyBvbiBjaHJvbWVPUz9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBjb3Jkb3ZhIC0gSXMgdGhlIGdhbWUgcnVubmluZyB1bmRlciBBcGFjaGUgQ29yZG92YT9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBjcm9zc3dhbGsgLSBJcyB0aGUgZ2FtZSBydW5uaW5nIHVuZGVyIHRoZSBJbnRlbCBDcm9zc3dhbGsgWERLP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlc2t0b3AgLSBJcyBydW5uaW5nIG9uIGEgZGVza3RvcD9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBlamVjdGEgLSBJcyB0aGUgZ2FtZSBydW5uaW5nIHVuZGVyIEVqZWN0YT9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBlbGVjdHJvbiAtIElzIHRoZSBnYW1lIHJ1bm5pbmcgdW5kZXIgR2l0SHViIEVsZWN0cm9uP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlPUyAtIElzIHJ1bm5pbmcgb24gaU9TP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlQYWQgLSBJcyBydW5uaW5nIG9uIGlQYWQ/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaVBob25lIC0gSXMgcnVubmluZyBvbiBpUGhvbmU/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ga2luZGxlIC0gSXMgcnVubmluZyBvbiBhbiBBbWF6b24gS2luZGxlP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxpbnV4IC0gSXMgcnVubmluZyBvbiBsaW51eD9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBtYWNPUyAtIElzIHJ1bm5pbmcgb24gbWFjT1M/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbm9kZSAtIElzIHRoZSBnYW1lIHJ1bm5pbmcgdW5kZXIgTm9kZS5qcz9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBub2RlV2Via2l0IC0gSXMgdGhlIGdhbWUgcnVubmluZyB1bmRlciBOb2RlLVdlYmtpdD9cclxuICogQHByb3BlcnR5IHtib29sZWFufSB3ZWJBcHAgLSBTZXQgdG8gdHJ1ZSBpZiBydW5uaW5nIGFzIGEgV2ViQXBwLCBpLmUuIHdpdGhpbiBhIFdlYlZpZXdcclxuICogQHByb3BlcnR5IHtib29sZWFufSB3aW5kb3dzIC0gSXMgcnVubmluZyBvbiB3aW5kb3dzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpbmRvd3NQaG9uZSAtIElzIHJ1bm5pbmcgb24gYSBXaW5kb3dzIFBob25lP1xyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaU9TVmVyc2lvbiAtIElmIHJ1bm5pbmcgaW4gaU9TIHRoaXMgd2lsbCBjb250YWluIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBpeGVsUmF0aW8gLSBQaXhlbFJhdGlvIG9mIHRoZSBob3N0IGRldmljZT9cclxuICovXHJcbnZhciBPUyA9IHtcclxuXHJcbiAgICBhbmRyb2lkOiBmYWxzZSxcclxuICAgIGNocm9tZU9TOiBmYWxzZSxcclxuICAgIGNvcmRvdmE6IGZhbHNlLFxyXG4gICAgY3Jvc3N3YWxrOiBmYWxzZSxcclxuICAgIGRlc2t0b3A6IGZhbHNlLFxyXG4gICAgZWplY3RhOiBmYWxzZSxcclxuICAgIGVsZWN0cm9uOiBmYWxzZSxcclxuICAgIGlPUzogZmFsc2UsXHJcbiAgICBpT1NWZXJzaW9uOiAwLFxyXG4gICAgaVBhZDogZmFsc2UsXHJcbiAgICBpUGhvbmU6IGZhbHNlLFxyXG4gICAga2luZGxlOiBmYWxzZSxcclxuICAgIGxpbnV4OiBmYWxzZSxcclxuICAgIG1hY09TOiBmYWxzZSxcclxuICAgIG5vZGU6IGZhbHNlLFxyXG4gICAgbm9kZVdlYmtpdDogZmFsc2UsXHJcbiAgICBwaXhlbFJhdGlvOiAxLFxyXG4gICAgd2ViQXBwOiBmYWxzZSxcclxuICAgIHdpbmRvd3M6IGZhbHNlLFxyXG4gICAgd2luZG93c1Bob25lOiBmYWxzZVxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIGluaXQgKClcclxue1xyXG4gICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuXHJcbiAgICBpZiAoL1dpbmRvd3MvLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLndpbmRvd3MgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoL01hYyBPUy8udGVzdCh1YSkgJiYgISgvbGlrZSBNYWMgT1MvLnRlc3QodWEpKSlcclxuICAgIHtcclxuICAgICAgICBPUy5tYWNPUyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgvQW5kcm9pZC8udGVzdCh1YSkpXHJcbiAgICB7XHJcbiAgICAgICAgT1MuYW5kcm9pZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgvTGludXgvLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmxpbnV4ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKC9pUFthb11kfGlQaG9uZS9pLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmlPUyA9IHRydWU7XHJcblxyXG4gICAgICAgIChuYXZpZ2F0b3IuYXBwVmVyc2lvbikubWF0Y2goL09TIChcXGQrKS8pO1xyXG5cclxuICAgICAgICBPUy5pT1NWZXJzaW9uID0gcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCk7XHJcblxyXG4gICAgICAgIE9TLmlQaG9uZSA9IHVhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaXBob25lJykgIT09IC0xO1xyXG4gICAgICAgIE9TLmlQYWQgPSB1YS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2lwYWQnKSAhPT0gLTE7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICgvS2luZGxlLy50ZXN0KHVhKSB8fCAoL1xcYktGW0EtWl1bQS1aXSsvKS50ZXN0KHVhKSB8fCAoL1NpbGsuKk1vYmlsZSBTYWZhcmkvKS50ZXN0KHVhKSlcclxuICAgIHtcclxuICAgICAgICBPUy5raW5kbGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBUaGlzIHdpbGwgTk9UIGRldGVjdCBlYXJseSBnZW5lcmF0aW9ucyBvZiBLaW5kbGUgRmlyZSwgSSB0aGluayB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkuLi5cclxuICAgICAgICAvLyBFLmcuIFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNl8zOyBlbi11czsgU2lsay8xLjEuMC04MCkgQXBwbGVXZWJLaXQvNTMzLjE2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi81LjAgU2FmYXJpLzUzMy4xNiBTaWxrLUFjY2VsZXJhdGVkPXRydWVcIlxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoL0NyT1MvLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmNocm9tZU9TID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoL1dpbmRvd3MgUGhvbmUvaS50ZXN0KHVhKSB8fCAoL0lFTW9iaWxlL2kpLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmFuZHJvaWQgPSBmYWxzZTtcclxuICAgICAgICBPUy5pT1MgPSBmYWxzZTtcclxuICAgICAgICBPUy5tYWNPUyA9IGZhbHNlO1xyXG4gICAgICAgIE9TLndpbmRvd3MgPSB0cnVlO1xyXG4gICAgICAgIE9TLndpbmRvd3NQaG9uZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHNpbGsgPSAoL1NpbGsvKS50ZXN0KHVhKTtcclxuXHJcbiAgICBpZiAoT1Mud2luZG93cyB8fCBPUy5tYWNPUyB8fCAoT1MubGludXggJiYgIXNpbGspIHx8IE9TLmNocm9tZU9TKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmRlc2t0b3AgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBXaW5kb3dzIFBob25lIC8gVGFibGUgcmVzZXRcclxuICAgIGlmIChPUy53aW5kb3dzUGhvbmUgfHwgKCgvV2luZG93cyBOVC9pLnRlc3QodWEpKSAmJiAoL1RvdWNoL2kudGVzdCh1YSkpKSlcclxuICAgIHtcclxuICAgICAgICBPUy5kZXNrdG9wID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFdlYkFwcCBtb2RlIGluIGlPU1xyXG4gICAgaWYgKG5hdmlnYXRvci5zdGFuZGFsb25lKVxyXG4gICAge1xyXG4gICAgICAgIE9TLndlYkFwcCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5jb3Jkb3ZhICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgT1MuY29yZG92YSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSlcclxuICAgIHtcclxuICAgICAgICBPUy5ub2RlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoT1Mubm9kZSAmJiB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gJ29iamVjdCcpXHJcbiAgICB7XHJcbiAgICAgICAgT1Mubm9kZVdlYmtpdCA9ICEhcHJvY2Vzcy52ZXJzaW9uc1snbm9kZS13ZWJraXQnXTtcclxuXHJcbiAgICAgICAgT1MuZWxlY3Ryb24gPSAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5lamVjdGEgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBPUy5lamVjdGEgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgoL0Nyb3Nzd2Fsay8pLnRlc3QodWEpKVxyXG4gICAge1xyXG4gICAgICAgIE9TLmNyb3Nzd2FsayA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgT1MucGl4ZWxSYXRpbyA9IHdpbmRvd1snZGV2aWNlUGl4ZWxSYXRpbyddIHx8IDE7XHJcblxyXG4gICAgcmV0dXJuIE9TO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGluaXQoKTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB0aGUgdmlkZW8gc3VwcG9ydCBvZiB0aGUgYnJvd3NlciBydW5uaW5nIHRoaXMgUGhhc2VyIEdhbWUgaW5zdGFuY2UuXHJcbiAqIFRoZXNlIHZhbHVlcyBhcmUgcmVhZC1vbmx5IGFuZCBwb3B1bGF0ZWQgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlIG9mIHRoZSBnYW1lLlxyXG4gKiBUaGV5IGFyZSB0aGVuIHJlZmVyZW5jZWQgYnkgaW50ZXJuYWwgZ2FtZSBzeXN0ZW1zIGFuZCBhcmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gYWNjZXNzXHJcbiAqIHZpYSBgdGhpcy5zeXMuZ2FtZS5kZXZpY2UudmlkZW9gIGZyb20gd2l0aGluIGFueSBTY2VuZS5cclxuICogXHJcbiAqIEluIFBoYXNlciAzLjIwIHRoZSBwcm9wZXJ0aWVzIHdlcmUgcmVuYW1lZCB0byBkcm9wIHRoZSAnVmlkZW8nIHN1ZmZpeC5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5EZXZpY2UuVmlkZW9cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGgyNjQgLSBDYW4gdGhpcyBkZXZpY2UgcGxheSBoMjY0IG1wNCB2aWRlbyBmaWxlcz9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBobHMgLSBDYW4gdGhpcyBkZXZpY2UgcGxheSBobHMgdmlkZW8gZmlsZXM/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXA0IC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgaDI2NCBtcDQgdmlkZW8gZmlsZXM/XHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb2dnIC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgb2dnIHZpZGVvIGZpbGVzP1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZwOSAtIENhbiB0aGlzIGRldmljZSBwbGF5IHZwOSB2aWRlbyBmaWxlcz9cclxuICogQHByb3BlcnR5IHtib29sZWFufSB3ZWJtIC0gQ2FuIHRoaXMgZGV2aWNlIHBsYXkgd2VibSB2aWRlbyBmaWxlcz9cclxuICovXHJcbnZhciBWaWRlbyA9IHtcclxuXHJcbiAgICBoMjY0OiBmYWxzZSxcclxuICAgIGhsczogZmFsc2UsXHJcbiAgICBtcDQ6IGZhbHNlLFxyXG4gICAgb2dnOiBmYWxzZSxcclxuICAgIHZwOTogZmFsc2UsXHJcbiAgICB3ZWJtOiBmYWxzZVxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIGluaXQgKClcclxue1xyXG4gICAgdmFyIHZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICB2YXIgcmVzdWx0ID0gISF2aWRlb0VsZW1lbnQuY2FuUGxheVR5cGU7XHJcblxyXG4gICAgdHJ5XHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlc3VsdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2aWRlb0VsZW1lbnQuY2FuUGxheVR5cGUoJ3ZpZGVvL29nZzsgY29kZWNzPVwidGhlb3JhXCInKS5yZXBsYWNlKC9ebm8kLywgJycpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBWaWRlby5vZ2cgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmlkZW9FbGVtZW50LmNhblBsYXlUeXBlKCd2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNDJFMDFFXCInKS5yZXBsYWNlKC9ebm8kLywgJycpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IFF1aWNrVGltZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGB1bmRlZmluZWRgLiBnaXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvaXNzdWVzLzU0NlxyXG4gICAgICAgICAgICAgICAgVmlkZW8uaDI2NCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBWaWRlby5tcDQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmlkZW9FbGVtZW50LmNhblBsYXlUeXBlKCd2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDgsIHZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVmlkZW8ud2VibSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2aWRlb0VsZW1lbnQuY2FuUGxheVR5cGUoJ3ZpZGVvL3dlYm07IGNvZGVjcz1cInZwOVwiJykucmVwbGFjZSgvXm5vJC8sICcnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVmlkZW8udnA5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZpZGVvRWxlbWVudC5jYW5QbGF5VHlwZSgnYXBwbGljYXRpb24veC1tcGVnVVJMOyBjb2RlY3M9XCJhdmMxLjQyRTAxRVwiJykucmVwbGFjZSgvXm5vJC8sICcnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVmlkZW8uaGxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIGRvXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFZpZGVvO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGluaXQoKTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgVGhpcyBzaW5nbGV0b24gaXMgaW5zdGFudGlhdGVkIGFzIHNvb24gYXMgUGhhc2VyIGxvYWRzLFxyXG4vLyAgYmVmb3JlIGEgUGhhc2VyLkdhbWUgaW5zdGFuY2UgaGFzIGV2ZW4gYmVlbiBjcmVhdGVkLlxyXG4vLyAgV2hpY2ggbWVhbnMgYWxsIGluc3RhbmNlcyBvZiBQaGFzZXIgR2FtZXMgY2FuIHNoYXJlIGl0LFxyXG4vLyAgd2l0aG91dCBoYXZpbmcgdG8gcmUtcG9sbCB0aGUgZGV2aWNlIGFsbCBvdmVyIGFnYWluXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuRGV2aWNlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuRGV2aWNlQ29uZlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge1BoYXNlci5EZXZpY2UuT1N9IG9zIC0gVGhlIE9TIERldmljZSBmdW5jdGlvbnMuXHJcbiAqIEBwcm9wZXJ0eSB7UGhhc2VyLkRldmljZS5Ccm93c2VyfSBicm93c2VyIC0gVGhlIEJyb3dzZXIgRGV2aWNlIGZ1bmN0aW9ucy5cclxuICogQHByb3BlcnR5IHtQaGFzZXIuRGV2aWNlLkZlYXR1cmVzfSBmZWF0dXJlcyAtIFRoZSBGZWF0dXJlcyBEZXZpY2UgZnVuY3Rpb25zLlxyXG4gKiBAcHJvcGVydHkge1BoYXNlci5EZXZpY2UuSW5wdXR9IGlucHV0IC0gVGhlIElucHV0IERldmljZSBmdW5jdGlvbnMuXHJcbiAqIEBwcm9wZXJ0eSB7UGhhc2VyLkRldmljZS5BdWRpb30gYXVkaW8gLSBUaGUgQXVkaW8gRGV2aWNlIGZ1bmN0aW9ucy5cclxuICogQHByb3BlcnR5IHtQaGFzZXIuRGV2aWNlLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBEZXZpY2UgZnVuY3Rpb25zLlxyXG4gKiBAcHJvcGVydHkge1BoYXNlci5EZXZpY2UuRnVsbHNjcmVlbn0gZnVsbHNjcmVlbiAtIFRoZSBGdWxsc2NyZWVuIERldmljZSBmdW5jdGlvbnMuXHJcbiAqIEBwcm9wZXJ0eSB7UGhhc2VyLkRldmljZS5DYW52YXNGZWF0dXJlc30gY2FudmFzRmVhdHVyZXMgLSBUaGUgQ2FudmFzIERldmljZSBmdW5jdGlvbnMuXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgb3M6IHJlcXVpcmUoJy4vT1MnKSxcclxuICAgIGJyb3dzZXI6IHJlcXVpcmUoJy4vQnJvd3NlcicpLFxyXG4gICAgZmVhdHVyZXM6IHJlcXVpcmUoJy4vRmVhdHVyZXMnKSxcclxuICAgIGlucHV0OiByZXF1aXJlKCcuL0lucHV0JyksXHJcbiAgICBhdWRpbzogcmVxdWlyZSgnLi9BdWRpbycpLFxyXG4gICAgdmlkZW86IHJlcXVpcmUoJy4vVmlkZW8nKSxcclxuICAgIGZ1bGxzY3JlZW46IHJlcXVpcmUoJy4vRnVsbHNjcmVlbicpLFxyXG4gICAgY2FudmFzRmVhdHVyZXM6IHJlcXVpcmUoJy4vQ2FudmFzRmVhdHVyZXMnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQUxJR05fQ09OU1QgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgdG9wLWxlZnQgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uVE9QX0xFRlRcclxuICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgKi9cclxuICAgIFRPUF9MRUZUOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIHRvcC1jZW50ZXIgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uVE9QX0NFTlRFUlxyXG4gICAgKiBAc2luY2UgMy4wLjBcclxuICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAqL1xyXG4gICAgVE9QX0NFTlRFUjogMSxcclxuXHJcbiAgICAvKipcclxuICAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgYSB0b3AtcmlnaHQgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uVE9QX1JJR0hUXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBUT1BfUklHSFQ6IDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgbGVmdC10b3AgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uTEVGVF9UT1BcclxuICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgKi9cclxuICAgIExFRlRfVE9QOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIGxlZnQtY2VudGVyIGFsaWdubWVudCBvciBwb3NpdGlvbi5cclxuICAgICogQGNvbnN0YW50XHJcbiAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkFsaWduLkxFRlRfQ0VOVEVSXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBMRUZUX0NFTlRFUjogNCxcclxuXHJcbiAgICAvKipcclxuICAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgYSBsZWZ0LWJvdHRvbSBhbGlnbm1lbnQgb3IgcG9zaXRpb24uXHJcbiAgICAqIEBjb25zdGFudFxyXG4gICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5BbGlnbi5MRUZUX0JPVFRPTVxyXG4gICAgKiBAc2luY2UgMy4wLjBcclxuICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAqL1xyXG4gICAgTEVGVF9CT1RUT006IDUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgY2VudGVyIGFsaWdubWVudCBvciBwb3NpdGlvbi5cclxuICAgICogQGNvbnN0YW50XHJcbiAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkFsaWduLkNFTlRFUlxyXG4gICAgKiBAc2luY2UgMy4wLjBcclxuICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAqL1xyXG4gICAgQ0VOVEVSOiA2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIHJpZ2h0LXRvcCBhbGlnbm1lbnQgb3IgcG9zaXRpb24uXHJcbiAgICAqIEBjb25zdGFudFxyXG4gICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5BbGlnbi5SSUdIVF9UT1BcclxuICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgKi9cclxuICAgIFJJR0hUX1RPUDogNyxcclxuXHJcbiAgICAvKipcclxuICAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgYSByaWdodC1jZW50ZXIgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uUklHSFRfQ0VOVEVSXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBSSUdIVF9DRU5URVI6IDgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcmlnaHQtYm90dG9tIGFsaWdubWVudCBvciBwb3NpdGlvbi5cclxuICAgICogQGNvbnN0YW50XHJcbiAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkFsaWduLlJJR0hUX0JPVFRPTVxyXG4gICAgKiBAc2luY2UgMy4wLjBcclxuICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAqL1xyXG4gICAgUklHSFRfQk9UVE9NOiA5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBhIGJvdHRvbS1sZWZ0IGFsaWdubWVudCBvciBwb3NpdGlvbi5cclxuICAgICogQGNvbnN0YW50XHJcbiAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkFsaWduLkJPVFRPTV9MRUZUXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBCT1RUT01fTEVGVDogMTAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgYm90dG9tLWNlbnRlciBhbGlnbm1lbnQgb3IgcG9zaXRpb24uXHJcbiAgICAqIEBjb25zdGFudFxyXG4gICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5BbGlnbi5CT1RUT01fQ0VOVEVSXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBCT1RUT01fQ0VOVEVSOiAxMSxcclxuXHJcbiAgICAvKipcclxuICAgICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgYSBib3R0b20tcmlnaHQgYWxpZ25tZW50IG9yIHBvc2l0aW9uLlxyXG4gICAgKiBAY29uc3RhbnRcclxuICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQWxpZ24uQk9UVE9NX1JJR0hUXHJcbiAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICovXHJcbiAgICBCT1RUT01fUklHSFQ6IDEyXHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBTElHTl9DT05TVDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldEJvdHRvbScpO1xyXG52YXIgR2V0Q2VudGVyWCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJYJyk7XHJcbnZhciBTZXRCb3R0b20gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0Qm90dG9tJyk7XHJcbnZhciBTZXRDZW50ZXJYID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldENlbnRlclgnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBpbiB0aGUgYm90dG9tIGNlbnRlciBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5Cb3R0b21DZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduSW4gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgQm90dG9tQ2VudGVyID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduSW4sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRDZW50ZXJYKGdhbWVPYmplY3QsIEdldENlbnRlclgoYWxpZ25JbikgKyBvZmZzZXRYKTtcclxuICAgIFNldEJvdHRvbShnYW1lT2JqZWN0LCBHZXRCb3R0b20oYWxpZ25JbikgKyBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQm90dG9tQ2VudGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRCb3R0b20gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0Qm90dG9tJyk7XHJcbnZhciBHZXRMZWZ0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldExlZnQnKTtcclxudmFyIFNldEJvdHRvbSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRCb3R0b20nKTtcclxudmFyIFNldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0TGVmdCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIGluIHRoZSBib3R0b20gbGVmdCBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5Cb3R0b21MZWZ0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnbkluIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIEJvdHRvbUxlZnQgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Jbiwgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldExlZnQoZ2FtZU9iamVjdCwgR2V0TGVmdChhbGlnbkluKSAtIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnbkluKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCb3R0b21MZWZ0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRCb3R0b20gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0Qm90dG9tJyk7XHJcbnZhciBHZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRSaWdodCcpO1xyXG52YXIgU2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldEJvdHRvbScpO1xyXG52YXIgU2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0UmlnaHQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBpbiB0aGUgYm90dG9tIHJpZ2h0IG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLkluLkJvdHRvbVJpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnbkluIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIEJvdHRvbVJpZ2h0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduSW4sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRSaWdodChnYW1lT2JqZWN0LCBHZXRSaWdodChhbGlnbkluKSArIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnbkluKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCb3R0b21SaWdodDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2VudGVyT24gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvQ2VudGVyT24nKTtcclxudmFyIEdldENlbnRlclggPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0Q2VudGVyWCcpO1xyXG52YXIgR2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJZJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgaW4gdGhlIGNlbnRlciBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5DZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduSW4gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgQ2VudGVyID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduSW4sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBDZW50ZXJPbihnYW1lT2JqZWN0LCBHZXRDZW50ZXJYKGFsaWduSW4pICsgb2Zmc2V0WCwgR2V0Q2VudGVyWShhbGlnbkluKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldENlbnRlclkgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0Q2VudGVyWScpO1xyXG52YXIgR2V0TGVmdCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRMZWZ0Jyk7XHJcbnZhciBTZXRDZW50ZXJZID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldENlbnRlclknKTtcclxudmFyIFNldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0TGVmdCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIGluIHRoZSBsZWZ0IGNlbnRlciBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5MZWZ0Q2VudGVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnbkluIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIExlZnRDZW50ZXIgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Jbiwgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldExlZnQoZ2FtZU9iamVjdCwgR2V0TGVmdChhbGlnbkluKSAtIG9mZnNldFgpO1xyXG4gICAgU2V0Q2VudGVyWShnYW1lT2JqZWN0LCBHZXRDZW50ZXJZKGFsaWduSW4pICsgb2Zmc2V0WSk7XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExlZnRDZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFMSUdOX0NPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxuXHJcbnZhciBBbGlnbkluTWFwID0gW107XHJcblxyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULkJPVFRPTV9DRU5URVJdID0gcmVxdWlyZSgnLi9Cb3R0b21DZW50ZXInKTtcclxuQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5CT1RUT01fTEVGVF0gPSByZXF1aXJlKCcuL0JvdHRvbUxlZnQnKTtcclxuQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5CT1RUT01fUklHSFRdID0gcmVxdWlyZSgnLi9Cb3R0b21SaWdodCcpO1xyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULkNFTlRFUl0gPSByZXF1aXJlKCcuL0NlbnRlcicpO1xyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULkxFRlRfQ0VOVEVSXSA9IHJlcXVpcmUoJy4vTGVmdENlbnRlcicpO1xyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULlJJR0hUX0NFTlRFUl0gPSByZXF1aXJlKCcuL1JpZ2h0Q2VudGVyJyk7XHJcbkFsaWduSW5NYXBbQUxJR05fQ09OU1QuVE9QX0NFTlRFUl0gPSByZXF1aXJlKCcuL1RvcENlbnRlcicpO1xyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULlRPUF9MRUZUXSA9IHJlcXVpcmUoJy4vVG9wTGVmdCcpO1xyXG5BbGlnbkluTWFwW0FMSUdOX0NPTlNULlRPUF9SSUdIVF0gPSByZXF1aXJlKCcuL1RvcFJpZ2h0Jyk7XHJcbkFsaWduSW5NYXBbQUxJR05fQ09OU1QuTEVGVF9CT1RUT01dID0gQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5CT1RUT01fTEVGVF07XHJcbkFsaWduSW5NYXBbQUxJR05fQ09OU1QuTEVGVF9UT1BdID0gQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5UT1BfTEVGVF07XHJcbkFsaWduSW5NYXBbQUxJR05fQ09OU1QuUklHSFRfQk9UVE9NXSA9IEFsaWduSW5NYXBbQUxJR05fQ09OU1QuQk9UVE9NX1JJR0hUXTtcclxuQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5SSUdIVF9UT1BdID0gQWxpZ25Jbk1hcFtBTElHTl9DT05TVC5UT1BfUklHSFRdO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoZSBvdGhlci5cclxuICogVGhlIGFsaWdubWVudCB1c2VkIGlzIGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIGFyZ3VtZW50LCB3aGljaCBpcyBhbiBgQUxJR05fQ09OU1RgIHZhbHVlLCBzdWNoIGFzIGBMRUZUX0NFTlRFUmAgb3IgYFRPUF9SSUdIVGAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5RdWlja1NldFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2NoaWxkLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnbkluIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0byBhbGlnbiB0aGUgR2FtZSBPYmplY3Qgd2l0aC4gVGhpcyBpcyBhbiBhbGlnbiBjb25zdGFudCwgc3VjaCBhcyBgQUxJR05fQ09OU1QuTEVGVF9DRU5URVJgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgUXVpY2tTZXQgPSBmdW5jdGlvbiAoY2hpbGQsIGFsaWduSW4sIHBvc2l0aW9uLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICByZXR1cm4gQWxpZ25Jbk1hcFtwb3NpdGlvbl0oY2hpbGQsIGFsaWduSW4sIG9mZnNldFgsIG9mZnNldFkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWlja1NldDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJZJyk7XHJcbnZhciBHZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRSaWdodCcpO1xyXG52YXIgU2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRDZW50ZXJZJyk7XHJcbnZhciBTZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRSaWdodCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIGluIHRoZSByaWdodCBjZW50ZXIgb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uSW4uUmlnaHRDZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduSW4gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgUmlnaHRDZW50ZXIgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Jbiwgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldFJpZ2h0KGdhbWVPYmplY3QsIEdldFJpZ2h0KGFsaWduSW4pICsgb2Zmc2V0WCk7XHJcbiAgICBTZXRDZW50ZXJZKGdhbWVPYmplY3QsIEdldENlbnRlclkoYWxpZ25JbikgKyBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmlnaHRDZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldENlbnRlclggPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0Q2VudGVyWCcpO1xyXG52YXIgR2V0VG9wID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldFRvcCcpO1xyXG52YXIgU2V0Q2VudGVyWCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRDZW50ZXJYJyk7XHJcbnZhciBTZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0VG9wJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgaW4gdGhlIHRvcCBjZW50ZXIgb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uSW4uVG9wQ2VudGVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnbkluIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIFRvcENlbnRlciA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnbkluLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0Q2VudGVyWChnYW1lT2JqZWN0LCBHZXRDZW50ZXJYKGFsaWduSW4pICsgb2Zmc2V0WCk7XHJcbiAgICBTZXRUb3AoZ2FtZU9iamVjdCwgR2V0VG9wKGFsaWduSW4pIC0gb2Zmc2V0WSk7XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRvcENlbnRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0TGVmdCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRMZWZ0Jyk7XHJcbnZhciBHZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0VG9wJyk7XHJcbnZhciBTZXRMZWZ0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldExlZnQnKTtcclxudmFyIFNldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRUb3AnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBpbiB0aGUgdG9wIGxlZnQgb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uSW4uVG9wTGVmdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25JbiAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBUb3BMZWZ0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduSW4sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRMZWZ0KGdhbWVPYmplY3QsIEdldExlZnQoYWxpZ25JbikgLSBvZmZzZXRYKTtcclxuICAgIFNldFRvcChnYW1lT2JqZWN0LCBHZXRUb3AoYWxpZ25JbikgLSBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVG9wTGVmdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0UmlnaHQnKTtcclxudmFyIEdldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRUb3AnKTtcclxudmFyIFNldFJpZ2h0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldFJpZ2h0Jyk7XHJcbnZhciBTZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0VG9wJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgaW4gdGhlIHRvcCByaWdodCBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Jbi5Ub3BSaWdodFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25JbiAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBUb3BSaWdodCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnbkluLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0UmlnaHQoZ2FtZU9iamVjdCwgR2V0UmlnaHQoYWxpZ25JbikgKyBvZmZzZXRYKTtcclxuICAgIFNldFRvcChnYW1lT2JqZWN0LCBHZXRUb3AoYWxpZ25JbikgLSBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVG9wUmlnaHQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRpc3BsYXkuQWxpZ24uSW5cclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBCb3R0b21DZW50ZXI6IHJlcXVpcmUoJy4vQm90dG9tQ2VudGVyJyksXHJcbiAgICBCb3R0b21MZWZ0OiByZXF1aXJlKCcuL0JvdHRvbUxlZnQnKSxcclxuICAgIEJvdHRvbVJpZ2h0OiByZXF1aXJlKCcuL0JvdHRvbVJpZ2h0JyksXHJcbiAgICBDZW50ZXI6IHJlcXVpcmUoJy4vQ2VudGVyJyksXHJcbiAgICBMZWZ0Q2VudGVyOiByZXF1aXJlKCcuL0xlZnRDZW50ZXInKSxcclxuICAgIFF1aWNrU2V0OiByZXF1aXJlKCcuL1F1aWNrU2V0JyksXHJcbiAgICBSaWdodENlbnRlcjogcmVxdWlyZSgnLi9SaWdodENlbnRlcicpLFxyXG4gICAgVG9wQ2VudGVyOiByZXF1aXJlKCcuL1RvcENlbnRlcicpLFxyXG4gICAgVG9wTGVmdDogcmVxdWlyZSgnLi9Ub3BMZWZ0JyksXHJcbiAgICBUb3BSaWdodDogcmVxdWlyZSgnLi9Ub3BSaWdodCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5EaXNwbGF5LkFsaWduXHJcbiAqL1xyXG5cclxudmFyIEFsaWduID0ge1xyXG5cclxuICAgIEluOiByZXF1aXJlKCcuL2luJyksXHJcbiAgICBUbzogcmVxdWlyZSgnLi90bycpXHJcblxyXG59O1xyXG5cclxuLy8gICBNZXJnZSBpbiB0aGUgY29uc3RzXHJcbkFsaWduID0gRXh0ZW5kKGZhbHNlLCBBbGlnbiwgQ09OU1QpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBbGlnbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldEJvdHRvbScpO1xyXG52YXIgR2V0Q2VudGVyWCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJYJyk7XHJcbnZhciBTZXRDZW50ZXJYID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldENlbnRlclgnKTtcclxudmFyIFNldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRUb3AnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBuZXh0IHRvIHRoZSBib3R0b20gY2VudGVyIHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLkJvdHRvbUNlbnRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBCb3R0b21DZW50ZXIgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Ubywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldENlbnRlclgoZ2FtZU9iamVjdCwgR2V0Q2VudGVyWChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0VG9wKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnblRvKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCb3R0b21DZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldEJvdHRvbSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRCb3R0b20nKTtcclxudmFyIEdldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0TGVmdCcpO1xyXG52YXIgU2V0TGVmdCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRMZWZ0Jyk7XHJcbnZhciBTZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0VG9wJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgbmV4dCB0byB0aGUgYm90dG9tIGxlZnQgcG9zaXRpb24gb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uVG8uQm90dG9tTGVmdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBCb3R0b21MZWZ0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduVG8sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRMZWZ0KGdhbWVPYmplY3QsIEdldExlZnQoYWxpZ25UbykgLSBvZmZzZXRYKTtcclxuICAgIFNldFRvcChnYW1lT2JqZWN0LCBHZXRCb3R0b20oYWxpZ25UbykgKyBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQm90dG9tTGVmdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldEJvdHRvbScpO1xyXG52YXIgR2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0UmlnaHQnKTtcclxudmFyIFNldFJpZ2h0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldFJpZ2h0Jyk7XHJcbnZhciBTZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0VG9wJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgbmV4dCB0byB0aGUgYm90dG9tIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLkJvdHRvbVJpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnblRvIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIEJvdHRvbVJpZ2h0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduVG8sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRSaWdodChnYW1lT2JqZWN0LCBHZXRSaWdodChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0VG9wKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnblRvKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCb3R0b21SaWdodDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldEJvdHRvbScpO1xyXG52YXIgR2V0TGVmdCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRMZWZ0Jyk7XHJcbnZhciBTZXRCb3R0b20gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0Qm90dG9tJyk7XHJcbnZhciBTZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRSaWdodCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIG5leHQgdG8gdGhlIGxlZnQgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLkxlZnRCb3R0b21cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduVG8gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgTGVmdEJvdHRvbSA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnblRvLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0UmlnaHQoZ2FtZU9iamVjdCwgR2V0TGVmdChhbGlnblRvKSAtIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnblRvKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMZWZ0Qm90dG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRDZW50ZXJZID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldENlbnRlclknKTtcclxudmFyIEdldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0TGVmdCcpO1xyXG52YXIgU2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRDZW50ZXJZJyk7XHJcbnZhciBTZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRSaWdodCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIG5leHQgdG8gdGhlIGxlZnQgY2VudGVyIHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLkxlZnRDZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduVG8gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgTGVmdENlbnRlciA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnblRvLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0UmlnaHQoZ2FtZU9iamVjdCwgR2V0TGVmdChhbGlnblRvKSAtIG9mZnNldFgpO1xyXG4gICAgU2V0Q2VudGVyWShnYW1lT2JqZWN0LCBHZXRDZW50ZXJZKGFsaWduVG8pICsgb2Zmc2V0WSk7XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExlZnRDZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0TGVmdCcpO1xyXG52YXIgR2V0VG9wID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldFRvcCcpO1xyXG52YXIgU2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0UmlnaHQnKTtcclxudmFyIFNldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRUb3AnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBuZXh0IHRvIHRoZSBsZWZ0IHRvcCBwb3NpdGlvbiBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Uby5MZWZ0VG9wXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnblRvIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIExlZnRUb3AgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Ubywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldFJpZ2h0KGdhbWVPYmplY3QsIEdldExlZnQoYWxpZ25UbykgLSBvZmZzZXRYKTtcclxuICAgIFNldFRvcChnYW1lT2JqZWN0LCBHZXRUb3AoYWxpZ25UbykgLSBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTGVmdFRvcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgc2FtbWVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBTElHTl9DT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcblxyXG52YXIgQWxpZ25Ub01hcCA9IFtdO1xyXG5cclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5CT1RUT01fQ0VOVEVSXSA9IHJlcXVpcmUoJy4vQm90dG9tQ2VudGVyJyk7XHJcbkFsaWduVG9NYXBbQUxJR05fQ09OU1QuQk9UVE9NX0xFRlRdID0gcmVxdWlyZSgnLi9Cb3R0b21MZWZ0Jyk7XHJcbkFsaWduVG9NYXBbQUxJR05fQ09OU1QuQk9UVE9NX1JJR0hUXSA9IHJlcXVpcmUoJy4vQm90dG9tUmlnaHQnKTtcclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5MRUZUX0JPVFRPTV0gPSByZXF1aXJlKCcuL0xlZnRCb3R0b20nKTtcclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5MRUZUX0NFTlRFUl0gPSByZXF1aXJlKCcuL0xlZnRDZW50ZXInKTtcclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5MRUZUX1RPUF0gPSByZXF1aXJlKCcuL0xlZnRUb3AnKTtcclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5SSUdIVF9CT1RUT01dID0gcmVxdWlyZSgnLi9SaWdodEJvdHRvbScpO1xyXG5BbGlnblRvTWFwW0FMSUdOX0NPTlNULlJJR0hUX0NFTlRFUl0gPSByZXF1aXJlKCcuL1JpZ2h0Q2VudGVyJyk7XHJcbkFsaWduVG9NYXBbQUxJR05fQ09OU1QuUklHSFRfVE9QXSA9IHJlcXVpcmUoJy4vUmlnaHRUb3AnKTtcclxuQWxpZ25Ub01hcFtBTElHTl9DT05TVC5UT1BfQ0VOVEVSXSA9IHJlcXVpcmUoJy4vVG9wQ2VudGVyJyk7XHJcbkFsaWduVG9NYXBbQUxJR05fQ09OU1QuVE9QX0xFRlRdID0gcmVxdWlyZSgnLi9Ub3BMZWZ0Jyk7XHJcbkFsaWduVG9NYXBbQUxJR05fQ09OU1QuVE9QX1JJR0hUXSA9IHJlcXVpcmUoJy4vVG9wUmlnaHQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgbmV4dCB0byBhbm90aGVyLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAqIFRoZSBhbGlnbm1lbnQgdXNlZCBpcyBiYXNlZCBvbiB0aGUgYHBvc2l0aW9uYCBhcmd1bWVudCwgd2hpY2ggaXMgYSBgUGhhc2VyLkRpc3BsYXkuQWxpZ25gIHByb3BlcnR5IHN1Y2ggYXMgYExFRlRfQ0VOVEVSYCBvciBgVE9QX1JJR0hUYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLlF1aWNrU2V0XHJcbiAqIEBzaW5jZSAzLjIyLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2NoaWxkLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnblRvIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0byBhbGlnbiB0aGUgR2FtZSBPYmplY3Qgd2l0aC4gVGhpcyBpcyBhbiBhbGlnbiBjb25zdGFudCwgc3VjaCBhcyBgUGhhc2VyLkRpc3BsYXkuQWxpZ24uTEVGVF9DRU5URVJgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgUXVpY2tTZXQgPSBmdW5jdGlvbiAoY2hpbGQsIGFsaWduVG8sIHBvc2l0aW9uLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICByZXR1cm4gQWxpZ25Ub01hcFtwb3NpdGlvbl0oY2hpbGQsIGFsaWduVG8sIG9mZnNldFgsIG9mZnNldFkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWlja1NldDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldEJvdHRvbScpO1xyXG52YXIgR2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0UmlnaHQnKTtcclxudmFyIFNldEJvdHRvbSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRCb3R0b20nKTtcclxudmFyIFNldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0TGVmdCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIG5leHQgdG8gdGhlIHJpZ2h0IGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Uby5SaWdodEJvdHRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBSaWdodEJvdHRvbSA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnblRvLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0TGVmdChnYW1lT2JqZWN0LCBHZXRSaWdodChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldEJvdHRvbShhbGlnblRvKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSaWdodEJvdHRvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJZJyk7XHJcbnZhciBHZXRSaWdodCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRSaWdodCcpO1xyXG52YXIgU2V0Q2VudGVyWSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRDZW50ZXJZJyk7XHJcbnZhciBTZXRMZWZ0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldExlZnQnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBuZXh0IHRvIHRoZSByaWdodCBjZW50ZXIgcG9zaXRpb24gb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uVG8uUmlnaHRDZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGFsaWduVG8gLSBUaGUgR2FtZSBPYmplY3QgdG8gYmFzZSB0aGUgYWxpZ25tZW50IHBvc2l0aW9uIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFg9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZPTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGFsaWduZWQuXHJcbiAqL1xyXG52YXIgUmlnaHRDZW50ZXIgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Ubywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldExlZnQoZ2FtZU9iamVjdCwgR2V0UmlnaHQoYWxpZ25UbykgKyBvZmZzZXRYKTtcclxuICAgIFNldENlbnRlclkoZ2FtZU9iamVjdCwgR2V0Q2VudGVyWShhbGlnblRvKSArIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSaWdodENlbnRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0UmlnaHQnKTtcclxudmFyIEdldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRUb3AnKTtcclxudmFyIFNldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0TGVmdCcpO1xyXG52YXIgU2V0VG9wID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldFRvcCcpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGdpdmVuIEdhbWUgT2JqZWN0IGFuZCBhbGlnbnMgaXQgc28gdGhhdCBpdCBpcyBwb3NpdGlvbmVkIG5leHQgdG8gdGhlIHJpZ2h0IHRvcCBwb3NpdGlvbiBvZiB0aGUgb3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5BbGlnbi5Uby5SaWdodFRvcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBSaWdodFRvcCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBhbGlnblRvLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgU2V0TGVmdChnYW1lT2JqZWN0LCBHZXRSaWdodChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0VG9wKGdhbWVPYmplY3QsIEdldFRvcChhbGlnblRvKSAtIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSaWdodFRvcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0Q2VudGVyWCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRDZW50ZXJYJyk7XHJcbnZhciBHZXRUb3AgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0VG9wJyk7XHJcbnZhciBTZXRCb3R0b20gPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvU2V0Qm90dG9tJyk7XHJcbnZhciBTZXRDZW50ZXJYID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldENlbnRlclgnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBnaXZlbiBHYW1lIE9iamVjdCBhbmQgYWxpZ25zIGl0IHNvIHRoYXQgaXQgaXMgcG9zaXRpb25lZCBuZXh0IHRvIHRoZSB0b3AgY2VudGVyIHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLlRvcENlbnRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBUb3BDZW50ZXIgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgYWxpZ25Ubywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxue1xyXG4gICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gMDsgfVxyXG4gICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gMDsgfVxyXG5cclxuICAgIFNldENlbnRlclgoZ2FtZU9iamVjdCwgR2V0Q2VudGVyWChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldFRvcChhbGlnblRvKSAtIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUb3BDZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldExlZnQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0TGVmdCcpO1xyXG52YXIgR2V0VG9wID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL0dldFRvcCcpO1xyXG52YXIgU2V0Qm90dG9tID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldEJvdHRvbScpO1xyXG52YXIgU2V0TGVmdCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRMZWZ0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgbmV4dCB0byB0aGUgdG9wIGxlZnQgcG9zaXRpb24gb2YgdGhlIG90aGVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQWxpZ24uVG8uVG9wTGVmdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gYWxpZ25UbyAtIFRoZSBHYW1lIE9iamVjdCB0byBiYXNlIHRoZSBhbGlnbm1lbnQgcG9zaXRpb24gb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWxpZ25lZC5cclxuICovXHJcbnZhciBUb3BMZWZ0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduVG8sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRMZWZ0KGdhbWVPYmplY3QsIEdldExlZnQoYWxpZ25UbykgLSBvZmZzZXRYKTtcclxuICAgIFNldEJvdHRvbShnYW1lT2JqZWN0LCBHZXRUb3AoYWxpZ25UbykgLSBvZmZzZXRZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVG9wTGVmdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0UmlnaHQgPSByZXF1aXJlKCcuLi8uLi9ib3VuZHMvR2V0UmlnaHQnKTtcclxudmFyIEdldFRvcCA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9HZXRUb3AnKTtcclxudmFyIFNldEJvdHRvbSA9IHJlcXVpcmUoJy4uLy4uL2JvdW5kcy9TZXRCb3R0b20nKTtcclxudmFyIFNldFJpZ2h0ID0gcmVxdWlyZSgnLi4vLi4vYm91bmRzL1NldFJpZ2h0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgZ2l2ZW4gR2FtZSBPYmplY3QgYW5kIGFsaWducyBpdCBzbyB0aGF0IGl0IGlzIHBvc2l0aW9uZWQgbmV4dCB0byB0aGUgdG9wIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkFsaWduLlRvLlRvcFJpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBhbGlnblRvIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJhc2UgdGhlIGFsaWdubWVudCBwb3NpdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBwb3NpdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBhbGlnbmVkLlxyXG4gKi9cclxudmFyIFRvcFJpZ2h0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIGFsaWduVG8sIG9mZnNldFgsIG9mZnNldFkpXHJcbntcclxuICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IDA7IH1cclxuXHJcbiAgICBTZXRSaWdodChnYW1lT2JqZWN0LCBHZXRSaWdodChhbGlnblRvKSArIG9mZnNldFgpO1xyXG4gICAgU2V0Qm90dG9tKGdhbWVPYmplY3QsIEdldFRvcChhbGlnblRvKSAtIG9mZnNldFkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUb3BSaWdodDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuRGlzcGxheS5BbGlnbi5Ub1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEJvdHRvbUNlbnRlcjogcmVxdWlyZSgnLi9Cb3R0b21DZW50ZXInKSxcclxuICAgIEJvdHRvbUxlZnQ6IHJlcXVpcmUoJy4vQm90dG9tTGVmdCcpLFxyXG4gICAgQm90dG9tUmlnaHQ6IHJlcXVpcmUoJy4vQm90dG9tUmlnaHQnKSxcclxuICAgIExlZnRCb3R0b206IHJlcXVpcmUoJy4vTGVmdEJvdHRvbScpLFxyXG4gICAgTGVmdENlbnRlcjogcmVxdWlyZSgnLi9MZWZ0Q2VudGVyJyksXHJcbiAgICBMZWZ0VG9wOiByZXF1aXJlKCcuL0xlZnRUb3AnKSxcclxuICAgIFF1aWNrU2V0OiByZXF1aXJlKCcuL1F1aWNrU2V0JyksXHJcbiAgICBSaWdodEJvdHRvbTogcmVxdWlyZSgnLi9SaWdodEJvdHRvbScpLFxyXG4gICAgUmlnaHRDZW50ZXI6IHJlcXVpcmUoJy4vUmlnaHRDZW50ZXInKSxcclxuICAgIFJpZ2h0VG9wOiByZXF1aXJlKCcuL1JpZ2h0VG9wJyksXHJcbiAgICBUb3BDZW50ZXI6IHJlcXVpcmUoJy4vVG9wQ2VudGVyJyksXHJcbiAgICBUb3BMZWZ0OiByZXF1aXJlKCcuL1RvcExlZnQnKSxcclxuICAgIFRvcFJpZ2h0OiByZXF1aXJlKCcuL1RvcFJpZ2h0JylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNldENlbnRlclggPSByZXF1aXJlKCcuL1NldENlbnRlclgnKTtcclxudmFyIFNldENlbnRlclkgPSByZXF1aXJlKCcuL1NldENlbnRlclknKTtcclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIEdhbWUgT2JqZWN0IHNvIHRoYXQgaXQgaXMgY2VudGVyZWQgb24gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLkNlbnRlck9uXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSByZS1wb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdG8gcG9zaXRpb24gdGhlIEdhbWUgT2JqZWN0IG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdCBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBwb3NpdGlvbmVkLlxyXG4gKi9cclxudmFyIENlbnRlck9uID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIHgsIHkpXHJcbntcclxuICAgIFNldENlbnRlclgoZ2FtZU9iamVjdCwgeCk7XHJcblxyXG4gICAgcmV0dXJuIFNldENlbnRlclkoZ2FtZU9iamVjdCwgeSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENlbnRlck9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBib3R0b20gY29vcmRpbmF0ZSBmcm9tIHRoZSBib3VuZHMgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLkdldEJvdHRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBnZXQgdGhlIGJvdW5kcyB2YWx1ZSBmcm9tLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgYm91bmRzIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICovXHJcbnZhciBHZXRCb3R0b20gPSBmdW5jdGlvbiAoZ2FtZU9iamVjdClcclxue1xyXG4gICAgcmV0dXJuIChnYW1lT2JqZWN0LnkgKyBnYW1lT2JqZWN0LmhlaWdodCkgLSAoZ2FtZU9iamVjdC5oZWlnaHQgKiBnYW1lT2JqZWN0Lm9yaWdpblkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRCb3R0b207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNlbnRlciB4IGNvb3JkaW5hdGUgZnJvbSB0aGUgYm91bmRzIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkJvdW5kcy5HZXRDZW50ZXJYXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGdldCB0aGUgYm91bmRzIHZhbHVlIGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNlbnRlciB4IGNvb3JkaW5hdGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqL1xyXG52YXIgR2V0Q2VudGVyWCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG57XHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdC54IC0gKGdhbWVPYmplY3Qud2lkdGggKiBnYW1lT2JqZWN0Lm9yaWdpblgpICsgKGdhbWVPYmplY3Qud2lkdGggKiAwLjUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRDZW50ZXJYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjZW50ZXIgeSBjb29yZGluYXRlIGZyb20gdGhlIGJvdW5kcyBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Cb3VuZHMuR2V0Q2VudGVyWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBnZXQgdGhlIGJvdW5kcyB2YWx1ZSBmcm9tLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjZW50ZXIgeSBjb29yZGluYXRlIG9mIHRoZSBib3VuZHMgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIEdldENlbnRlclkgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdClcclxue1xyXG4gICAgcmV0dXJuIGdhbWVPYmplY3QueSAtIChnYW1lT2JqZWN0LmhlaWdodCAqIGdhbWVPYmplY3Qub3JpZ2luWSkgKyAoZ2FtZU9iamVjdC5oZWlnaHQgKiAwLjUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRDZW50ZXJZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBsZWZ0IGNvb3JkaW5hdGUgZnJvbSB0aGUgYm91bmRzIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkJvdW5kcy5HZXRMZWZ0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGdldCB0aGUgYm91bmRzIHZhbHVlIGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgYm91bmRzIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICovXHJcbnZhciBHZXRMZWZ0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbntcclxuICAgIHJldHVybiBnYW1lT2JqZWN0LnggLSAoZ2FtZU9iamVjdC53aWR0aCAqIGdhbWVPYmplY3Qub3JpZ2luWCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldExlZnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFtb3VudCB0aGUgR2FtZSBPYmplY3QgaXMgdmlzdWFsbHkgb2Zmc2V0IGZyb20gaXRzIHggY29vcmRpbmF0ZS5cclxuICogVGhpcyBpcyB0aGUgc2FtZSBhcyBgd2lkdGggKiBvcmlnaW4ueGAuXHJcbiAqIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGJlID4gMCBpZiBgb3JpZ2luLnhgIGlzIG5vdCBlcXVhbCB0byB6ZXJvLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLkdldE9mZnNldFhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdG8gZ2V0IHRoZSBib3VuZHMgdmFsdWUgZnJvbS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIEdldE9mZnNldFggPSBmdW5jdGlvbiAoZ2FtZU9iamVjdClcclxue1xyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Qud2lkdGggKiBnYW1lT2JqZWN0Lm9yaWdpblg7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE9mZnNldFg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFtb3VudCB0aGUgR2FtZSBPYmplY3QgaXMgdmlzdWFsbHkgb2Zmc2V0IGZyb20gaXRzIHkgY29vcmRpbmF0ZS5cclxuICogVGhpcyBpcyB0aGUgc2FtZSBhcyBgd2lkdGggKiBvcmlnaW4ueWAuXHJcbiAqIFRoaXMgdmFsdWUgd2lsbCBvbmx5IGJlID4gMCBpZiBgb3JpZ2luLnlgIGlzIG5vdCBlcXVhbCB0byB6ZXJvLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLkdldE9mZnNldFlcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdG8gZ2V0IHRoZSBib3VuZHMgdmFsdWUgZnJvbS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICovXHJcbnZhciBHZXRPZmZzZXRZID0gZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbntcclxuICAgIHJldHVybiBnYW1lT2JqZWN0LmhlaWdodCAqIGdhbWVPYmplY3Qub3JpZ2luWTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0T2Zmc2V0WTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcmlnaHQgY29vcmRpbmF0ZSBmcm9tIHRoZSBib3VuZHMgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLkdldFJpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGdldCB0aGUgYm91bmRzIHZhbHVlIGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqL1xyXG52YXIgR2V0UmlnaHQgPSBmdW5jdGlvbiAoZ2FtZU9iamVjdClcclxue1xyXG4gICAgcmV0dXJuIChnYW1lT2JqZWN0LnggKyBnYW1lT2JqZWN0LndpZHRoKSAtIChnYW1lT2JqZWN0LndpZHRoICogZ2FtZU9iamVjdC5vcmlnaW5YKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UmlnaHQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHRvcCBjb29yZGluYXRlIGZyb20gdGhlIGJvdW5kcyBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Cb3VuZHMuR2V0VG9wXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGdldCB0aGUgYm91bmRzIHZhbHVlIGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBib3VuZHMgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIEdldFRvcCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG57XHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdC55IC0gKGdhbWVPYmplY3QuaGVpZ2h0ICogZ2FtZU9iamVjdC5vcmlnaW5ZKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0VG9wO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIEdhbWUgT2JqZWN0IHNvIHRoYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm91bmRzIGFsaWducyB3aXRoIHRoZSBnaXZlbiBjb29yZGluYXRlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLlNldEJvdHRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcmUtcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGNvb3JkaW5hdGUgdG8gcG9zaXRpb24gdGhlIEdhbWUgT2JqZWN0IGJvdW5kcyBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBwb3NpdGlvbmVkLlxyXG4gKi9cclxudmFyIFNldEJvdHRvbSA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCB2YWx1ZSlcclxue1xyXG4gICAgZ2FtZU9iamVjdC55ID0gKHZhbHVlIC0gZ2FtZU9iamVjdC5oZWlnaHQpICsgKGdhbWVPYmplY3QuaGVpZ2h0ICogZ2FtZU9iamVjdC5vcmlnaW5ZKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0Qm90dG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIEdhbWUgT2JqZWN0IHNvIHRoYXQgdGhlIGNlbnRlciB0b3Agb2YgaXRzIGJvdW5kcyBhbGlnbnMgd2l0aCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkJvdW5kcy5TZXRDZW50ZXJYXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSByZS1wb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBjb29yZGluYXRlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdCBib3VuZHMgb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgcG9zaXRpb25lZC5cclxuICovXHJcbnZhciBTZXRDZW50ZXJYID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIHgpXHJcbntcclxuICAgIHZhciBvZmZzZXRYID0gZ2FtZU9iamVjdC53aWR0aCAqIGdhbWVPYmplY3Qub3JpZ2luWDtcclxuXHJcbiAgICBnYW1lT2JqZWN0LnggPSAoeCArIG9mZnNldFgpIC0gKGdhbWVPYmplY3Qud2lkdGggKiAwLjUpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRDZW50ZXJYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIEdhbWUgT2JqZWN0IHNvIHRoYXQgdGhlIGNlbnRlciB0b3Agb2YgaXRzIGJvdW5kcyBhbGlnbnMgd2l0aCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkJvdW5kcy5TZXRDZW50ZXJZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEcgLSBbZ2FtZU9iamVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBiZSByZS1wb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBjb29yZGluYXRlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdCBib3VuZHMgb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgcG9zaXRpb25lZC5cclxuICovXHJcbnZhciBTZXRDZW50ZXJZID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIHkpXHJcbntcclxuICAgIHZhciBvZmZzZXRZID0gZ2FtZU9iamVjdC5oZWlnaHQgKiBnYW1lT2JqZWN0Lm9yaWdpblk7XHJcblxyXG4gICAgZ2FtZU9iamVjdC55ID0gKHkgKyBvZmZzZXRZKSAtIChnYW1lT2JqZWN0LmhlaWdodCAqIDAuNSk7XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldENlbnRlclk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBvc2l0aW9ucyB0aGUgR2FtZSBPYmplY3Qgc28gdGhhdCB0aGUgbGVmdCBvZiBpdHMgYm91bmRzIGFsaWducyB3aXRoIHRoZSBnaXZlbiBjb29yZGluYXRlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLlNldExlZnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHJlLXBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBjb29yZGluYXRlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdCBib3VuZHMgb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgcG9zaXRpb25lZC5cclxuICovXHJcbnZhciBTZXRMZWZ0ID0gZnVuY3Rpb24gKGdhbWVPYmplY3QsIHZhbHVlKVxyXG57XHJcbiAgICBnYW1lT2JqZWN0LnggPSB2YWx1ZSArIChnYW1lT2JqZWN0LndpZHRoICogZ2FtZU9iamVjdC5vcmlnaW5YKTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0TGVmdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUG9zaXRpb25zIHRoZSBHYW1lIE9iamVjdCBzbyB0aGF0IHRoZSBsZWZ0IG9mIGl0cyBib3VuZHMgYWxpZ25zIHdpdGggdGhlIGdpdmVuIGNvb3JkaW5hdGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Cb3VuZHMuU2V0UmlnaHRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gRyAtIFtnYW1lT2JqZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGJlIHJlLXBvc2l0aW9uZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBjb29yZGluYXRlIHRvIHBvc2l0aW9uIHRoZSBHYW1lIE9iamVjdCBib3VuZHMgb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgcG9zaXRpb25lZC5cclxuICovXHJcbnZhciBTZXRSaWdodCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCB2YWx1ZSlcclxue1xyXG4gICAgZ2FtZU9iamVjdC54ID0gKHZhbHVlIC0gZ2FtZU9iamVjdC53aWR0aCkgKyAoZ2FtZU9iamVjdC53aWR0aCAqIGdhbWVPYmplY3Qub3JpZ2luWCk7XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFJpZ2h0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIEdhbWUgT2JqZWN0IHNvIHRoYXQgdGhlIHRvcCBvZiBpdHMgYm91bmRzIGFsaWducyB3aXRoIHRoZSBnaXZlbiBjb29yZGluYXRlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQm91bmRzLlNldFRvcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBHIC0gW2dhbWVPYmplY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdpbGwgYmUgcmUtcG9zaXRpb25lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGNvb3JkaW5hdGUgdG8gcG9zaXRpb24gdGhlIEdhbWUgT2JqZWN0IGJvdW5kcyBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBwb3NpdGlvbmVkLlxyXG4gKi9cclxudmFyIFNldFRvcCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCB2YWx1ZSlcclxue1xyXG4gICAgZ2FtZU9iamVjdC55ID0gdmFsdWUgKyAoZ2FtZU9iamVjdC5oZWlnaHQgKiBnYW1lT2JqZWN0Lm9yaWdpblkpO1xyXG5cclxuICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRUb3A7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRpc3BsYXkuQm91bmRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ2VudGVyT246IHJlcXVpcmUoJy4vQ2VudGVyT24nKSxcclxuICAgIEdldEJvdHRvbTogcmVxdWlyZSgnLi9HZXRCb3R0b20nKSxcclxuICAgIEdldENlbnRlclg6IHJlcXVpcmUoJy4vR2V0Q2VudGVyWCcpLFxyXG4gICAgR2V0Q2VudGVyWTogcmVxdWlyZSgnLi9HZXRDZW50ZXJZJyksXHJcbiAgICBHZXRMZWZ0OiByZXF1aXJlKCcuL0dldExlZnQnKSxcclxuICAgIEdldE9mZnNldFg6IHJlcXVpcmUoJy4vR2V0T2Zmc2V0WCcpLFxyXG4gICAgR2V0T2Zmc2V0WTogcmVxdWlyZSgnLi9HZXRPZmZzZXRZJyksXHJcbiAgICBHZXRSaWdodDogcmVxdWlyZSgnLi9HZXRSaWdodCcpLFxyXG4gICAgR2V0VG9wOiByZXF1aXJlKCcuL0dldFRvcCcpLFxyXG4gICAgU2V0Qm90dG9tOiByZXF1aXJlKCcuL1NldEJvdHRvbScpLFxyXG4gICAgU2V0Q2VudGVyWDogcmVxdWlyZSgnLi9TZXRDZW50ZXJYJyksXHJcbiAgICBTZXRDZW50ZXJZOiByZXF1aXJlKCcuL1NldENlbnRlclknKSxcclxuICAgIFNldExlZnQ6IHJlcXVpcmUoJy4vU2V0TGVmdCcpLFxyXG4gICAgU2V0UmlnaHQ6IHJlcXVpcmUoJy4vU2V0UmlnaHQnKSxcclxuICAgIFNldFRvcDogcmVxdWlyZSgnLi9TZXRUb3AnKVxyXG4gICAgXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRpc3BsYXkuQ2FudmFzLkNhbnZhc0ludGVycG9sYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQ2FudmFzSW50ZXJwb2xhdGlvbiA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIENTUyBpbWFnZS1yZW5kZXJpbmcgcHJvcGVydHkgb24gdGhlIGdpdmVuIGNhbnZhcyB0byBiZSAnY3Jpc3AnIChha2EgJ29wdGltaXplIGNvbnRyYXN0JyBvbiB3ZWJraXQpLlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5DYW52YXMuQ2FudmFzSW50ZXJwb2xhdGlvbi5zZXRDcmlzcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyAtIFRoZSBjYW52YXMgb2JqZWN0IHRvIGhhdmUgdGhlIHN0eWxlIHNldCBvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBjYW52YXMuXHJcbiAgICAgKi9cclxuICAgIHNldENyaXNwOiBmdW5jdGlvbiAoY2FudmFzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0eXBlcyA9IFsgJ29wdGltaXplU3BlZWQnLCAnLW1vei1jcmlzcC1lZGdlcycsICctby1jcmlzcC1lZGdlcycsICctd2Via2l0LW9wdGltaXplLWNvbnRyYXN0JywgJ29wdGltaXplLWNvbnRyYXN0JywgJ2NyaXNwLWVkZ2VzJywgJ3BpeGVsYXRlZCcgXTtcclxuXHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbnZhcy5zdHlsZVsnaW1hZ2UtcmVuZGVyaW5nJ10gPSB0eXBlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjYW52YXMuc3R5bGUubXNJbnRlcnBvbGF0aW9uTW9kZSA9ICduZWFyZXN0LW5laWdoYm9yJztcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBDU1MgaW1hZ2UtcmVuZGVyaW5nIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBjYW52YXMgdG8gYmUgJ2JpY3ViaWMnIChha2EgJ2F1dG8nKS5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ2FudmFzLkNhbnZhc0ludGVycG9sYXRpb24uc2V0QmljdWJpY1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyAtIFRoZSBjYW52YXMgb2JqZWN0IHRvIGhhdmUgdGhlIHN0eWxlIHNldCBvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBjYW52YXMuXHJcbiAgICAgKi9cclxuICAgIHNldEJpY3ViaWM6IGZ1bmN0aW9uIChjYW52YXMpXHJcbiAgICB7XHJcbiAgICAgICAgY2FudmFzLnN0eWxlWydpbWFnZS1yZW5kZXJpbmcnXSA9ICdhdXRvJztcclxuICAgICAgICBjYW52YXMuc3R5bGUubXNJbnRlcnBvbGF0aW9uTW9kZSA9ICdiaWN1YmljJztcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENhbnZhc0ludGVycG9sYXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vLi4vY29uc3QnKTtcclxudmFyIFNtb290aGluZyA9IHJlcXVpcmUoJy4vU21vb3RoaW5nJyk7XHJcblxyXG4vLyBUaGUgcG9vbCBpbnRvIHdoaWNoIHRoZSBjYW52YXMgZWxlbWVudHMgYXJlIHBsYWNlZC5cclxudmFyIHBvb2wgPSBbXTtcclxuXHJcbi8vICBBdXRvbWF0aWNhbGx5IGFwcGx5IHNtb290aGluZyhmYWxzZSkgdG8gY3JlYXRlZCBDYW52YXMgZWxlbWVudHNcclxudmFyIF9kaXNhYmxlQ29udGV4dFNtb290aGluZyA9IGZhbHNlO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBDYW52YXNQb29sIGlzIGEgZ2xvYmFsIHN0YXRpYyBvYmplY3QsIHRoYXQgYWxsb3dzIFBoYXNlciB0byByZWN5Y2xlIGFuZCBwb29sIDJEIENvbnRleHQgQ2FudmFzIERPTSBlbGVtZW50cy5cclxuICogSXQgZG9lcyBub3QgcG9vbCBXZWJHTCBDb250ZXh0cywgYmVjYXVzZSBvbmNlIHRoZSBjb250ZXh0IG9wdGlvbnMgYXJlIHNldCB0aGV5IGNhbm5vdCBiZSBtb2RpZmllZCBhZ2FpbiwgXHJcbiAqIHdoaWNoIGlzIHVzZWxlc3MgZm9yIHNvbWUgb2YgdGhlIFBoYXNlciBwaXBlbGluZXMgLyByZW5kZXJlci5cclxuICpcclxuICogVGhpcyBzaW5nbGV0b24gaXMgaW5zdGFudGlhdGVkIGFzIHNvb24gYXMgUGhhc2VyIGxvYWRzLCBiZWZvcmUgYSBQaGFzZXIuR2FtZSBpbnN0YW5jZSBoYXMgZXZlbiBiZWVuIGNyZWF0ZWQuXHJcbiAqIFdoaWNoIG1lYW5zIGFsbCBpbnN0YW5jZXMgb2YgUGhhc2VyIEdhbWVzIG9uIHRoZSBzYW1lIHBhZ2UgY2FuIHNoYXJlIHRoZSBvbmUgc2luZ2xlIHBvb2wuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRpc3BsYXkuQ2FudmFzLkNhbnZhc1Bvb2xcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQ2FudmFzUG9vbCA9IGZ1bmN0aW9uICgpXHJcbntcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDYW52YXMgRE9NIGVsZW1lbnQsIG9yIHB1bGxzIG9uZSBmcm9tIHRoZSBwb29sIGlmIGZyZWUuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5DYW52YXNQb29sLmNyZWF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBwYXJlbnQgLSBUaGUgcGFyZW50IG9mIHRoZSBDYW52YXMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIENhbnZhcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIENhbnZhcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NhbnZhc1R5cGU9UGhhc2VyLkNBTlZBU10gLSBUaGUgdHlwZSBvZiB0aGUgQ2FudmFzLiBFaXRoZXIgYFBoYXNlci5DQU5WQVNgIG9yIGBQaGFzZXIuV0VCR0xgLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2VsZlBhcmVudD1mYWxzZV0gLSBVc2UgdGhlIGdlbmVyYXRlZCBDYW52YXMgZWxlbWVudCBhcyB0aGUgcGFyZW50P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgY2FudmFzIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZCBvciBwdWxsZWQgZnJvbSB0aGUgcG9vbFxyXG4gICAgICovXHJcbiAgICB2YXIgY3JlYXRlID0gZnVuY3Rpb24gKHBhcmVudCwgd2lkdGgsIGhlaWdodCwgY2FudmFzVHlwZSwgc2VsZlBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDE7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMTsgfVxyXG4gICAgICAgIGlmIChjYW52YXNUeXBlID09PSB1bmRlZmluZWQpIHsgY2FudmFzVHlwZSA9IENPTlNULkNBTlZBUzsgfVxyXG4gICAgICAgIGlmIChzZWxmUGFyZW50ID09PSB1bmRlZmluZWQpIHsgc2VsZlBhcmVudCA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBjYW52YXM7XHJcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGZpcnN0KGNhbnZhc1R5cGUpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29udGFpbmVyID0ge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXHJcbiAgICAgICAgICAgICAgICBjYW52YXM6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogY2FudmFzVHlwZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbnZhc1R5cGUgPT09IENPTlNULkNBTlZBUylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcG9vbC5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhbnZhcyA9IGNvbnRhaW5lci5jYW52YXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG4gICAgICAgICAgICBjYW52YXMgPSBjb250YWluZXIuY2FudmFzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGZQYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250YWluZXIucGFyZW50ID0gY2FudmFzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKF9kaXNhYmxlQ29udGV4dFNtb290aGluZyAmJiBjYW52YXNUeXBlID09PSBDT05TVC5DQU5WQVMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBTbW9vdGhpbmcuZGlzYWJsZShjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FudmFzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FudmFzIERPTSBlbGVtZW50LCBvciBwdWxscyBvbmUgZnJvbSB0aGUgcG9vbCBpZiBmcmVlLlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5DYW52YXMuQ2FudmFzUG9vbC5jcmVhdGUyRFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBwYXJlbnQgLSBUaGUgcGFyZW50IG9mIHRoZSBDYW52YXMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIENhbnZhcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIENhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIGNyZWF0ZWQgY2FudmFzLlxyXG4gICAgICovXHJcbiAgICB2YXIgY3JlYXRlMkQgPSBmdW5jdGlvbiAocGFyZW50LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGUocGFyZW50LCB3aWR0aCwgaGVpZ2h0LCBDT05TVC5DQU5WQVMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ2FudmFzIERPTSBlbGVtZW50LCBvciBwdWxscyBvbmUgZnJvbSB0aGUgcG9vbCBpZiBmcmVlLlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5DYW52YXMuQ2FudmFzUG9vbC5jcmVhdGVXZWJHTFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBwYXJlbnQgLSBUaGUgcGFyZW50IG9mIHRoZSBDYW52YXMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIENhbnZhcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIENhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIGNyZWF0ZWQgV2ViR0wgY2FudmFzLlxyXG4gICAgICovXHJcbiAgICB2YXIgY3JlYXRlV2ViR0wgPSBmdW5jdGlvbiAocGFyZW50LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGUocGFyZW50LCB3aWR0aCwgaGVpZ2h0LCBDT05TVC5XRUJHTCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZnJlZSBjYW52YXMgaW5kZXggZnJvbSB0aGUgcG9vbC5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ2FudmFzLkNhbnZhc1Bvb2wuZmlyc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NhbnZhc1R5cGU9UGhhc2VyLkNBTlZBU10gLSBUaGUgdHlwZSBvZiB0aGUgQ2FudmFzLiBFaXRoZXIgYFBoYXNlci5DQU5WQVNgIG9yIGBQaGFzZXIuV0VCR0xgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgZmlyc3QgZnJlZSBjYW52YXMsIG9yIGBudWxsYCBpZiBhIFdlYkdMIGNhbnZhcyB3YXMgcmVxdWVzdGVkIG9yIGlmIHRoZSBwb29sIGRvZXNuJ3QgaGF2ZSBmcmVlIGNhbnZhc2VzLlxyXG4gICAgICovXHJcbiAgICB2YXIgZmlyc3QgPSBmdW5jdGlvbiAoY2FudmFzVHlwZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoY2FudmFzVHlwZSA9PT0gdW5kZWZpbmVkKSB7IGNhbnZhc1R5cGUgPSBDT05TVC5DQU5WQVM7IH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnZhc1R5cGUgPT09IENPTlNULldFQkdMKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvb2wubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gcG9vbFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnBhcmVudCAmJiBjb250YWluZXIudHlwZSA9PT0gY2FudmFzVHlwZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9va3MgdXAgYSBjYW52YXMgYmFzZWQgb24gaXRzIHBhcmVudCwgYW5kIGlmIGZvdW5kIHB1dHMgaXQgYmFjayBpbiB0aGUgcG9vbCwgZnJlZWluZyBpdCB1cCBmb3IgcmUtdXNlLlxyXG4gICAgICogVGhlIGNhbnZhcyBoYXMgaXRzIHdpZHRoIGFuZCBoZWlnaHQgc2V0IHRvIDEsIGFuZCBpdHMgcGFyZW50IGF0dHJpYnV0ZSBudWxsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5DYW52YXNQb29sLnJlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBwYXJlbnQgLSBUaGUgY2FudmFzIG9yIHRoZSBwYXJlbnQgb2YgdGhlIGNhbnZhcyB0byBmcmVlLlxyXG4gICAgICovXHJcbiAgICB2YXIgcmVtb3ZlID0gZnVuY3Rpb24gKHBhcmVudClcclxuICAgIHtcclxuICAgICAgICAvLyAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYXJlbnQgaXMgYSBjYW52YXMgb2JqZWN0XHJcbiAgICAgICAgdmFyIGlzQ2FudmFzID0gcGFyZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gICAgICAgIHBvb2wuZm9yRWFjaChmdW5jdGlvbiAoY29udGFpbmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKChpc0NhbnZhcyAmJiBjb250YWluZXIuY2FudmFzID09PSBwYXJlbnQpIHx8ICghaXNDYW52YXMgJiYgY29udGFpbmVyLnBhcmVudCA9PT0gcGFyZW50KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnBhcmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuY2FudmFzLndpZHRoID0gMTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jYW52YXMuaGVpZ2h0ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiB1c2VkIGNhbnZhcyBlbGVtZW50cyBpbiB0aGUgcG9vbC5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ2FudmFzLkNhbnZhc1Bvb2wudG90YWxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBudW1iZXIgb2YgdXNlZCBjYW52YXNlcy5cclxuICAgICAqL1xyXG4gICAgdmFyIHRvdGFsID0gZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYyA9IDA7XHJcblxyXG4gICAgICAgIHBvb2wuZm9yRWFjaChmdW5jdGlvbiAoY29udGFpbmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5wYXJlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGMrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJlZSBjYW52YXMgZWxlbWVudHMgaW4gdGhlIHBvb2wuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5DYW52YXNQb29sLmZyZWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBudW1iZXIgb2YgZnJlZSBjYW52YXNlcy5cclxuICAgICAqL1xyXG4gICAgdmFyIGZyZWUgPSBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBwb29sLmxlbmd0aCAtIHRvdGFsKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzYWJsZSBjb250ZXh0IHNtb290aGluZyBvbiBhbnkgbmV3IENhbnZhcyBlbGVtZW50IGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5DYW52YXNQb29sLmRpc2FibGVTbW9vdGhpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2YXIgZGlzYWJsZVNtb290aGluZyA9IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgX2Rpc2FibGVDb250ZXh0U21vb3RoaW5nID0gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgY29udGV4dCBzbW9vdGhpbmcgb24gYW55IG5ldyBDYW52YXMgZWxlbWVudCBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5DYW52YXMuQ2FudmFzUG9vbC5lbmFibGVTbW9vdGhpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2YXIgZW5hYmxlU21vb3RoaW5nID0gZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBfZGlzYWJsZUNvbnRleHRTbW9vdGhpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBjcmVhdGUyRDogY3JlYXRlMkQsXHJcbiAgICAgICAgY3JlYXRlOiBjcmVhdGUsXHJcbiAgICAgICAgY3JlYXRlV2ViR0w6IGNyZWF0ZVdlYkdMLFxyXG4gICAgICAgIGRpc2FibGVTbW9vdGhpbmc6IGRpc2FibGVTbW9vdGhpbmcsXHJcbiAgICAgICAgZW5hYmxlU21vb3RoaW5nOiBlbmFibGVTbW9vdGhpbmcsXHJcbiAgICAgICAgZmlyc3Q6IGZpcnN0LFxyXG4gICAgICAgIGZyZWU6IGZyZWUsXHJcbiAgICAgICAgcG9vbDogcG9vbCxcclxuICAgICAgICByZW1vdmU6IHJlbW92ZSxcclxuICAgICAgICB0b3RhbDogdG90YWxcclxuICAgIH07XHJcbn07XHJcblxyXG4vLyAgSWYgd2UgZXhwb3J0IHRoZSBjYWxsZWQgZnVuY3Rpb24gaGVyZSwgaXQnbGwgb25seSBiZSBpbnZva2VkIG9uY2UgKG5vdCBldmVyeSB0aW1lIGl0J3MgcmVxdWlyZWQpLlxyXG5tb2R1bGUuZXhwb3J0cyA9IENhbnZhc1Bvb2woKTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgQnJvd3NlciBzcGVjaWZpYyBwcmVmaXgsIHNvIG5vdCBnb2luZyB0byBjaGFuZ2UgYmV0d2VlbiBjb250ZXh0cywgb25seSBiZXR3ZWVuIGJyb3dzZXJzXHJcbnZhciBwcmVmaXggPSAnJztcclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5TbW9vdGhpbmdcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgU21vb3RoaW5nID0gZnVuY3Rpb24gKClcclxue1xyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBTbW9vdGhpbmcgRW5hYmxlZCB2ZW5kb3IgcHJlZml4IGJlaW5nIHVzZWQgb24gdGhlIGdpdmVuIGNvbnRleHQsIG9yIG51bGwgaWYgbm90IHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ2FudmFzLlNtb290aGluZy5nZXRQcmVmaXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRHxXZWJHTFJlbmRlcmluZ0NvbnRleHQpfSBjb250ZXh0IC0gVGhlIGNhbnZhcyBjb250ZXh0IHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IHdoaWNoIGNvbnRyb2xzIGltYWdlIHNtb290aGluZyAoZWl0aGVyIGBpbWFnZVNtb290aGluZ0VuYWJsZWRgIG9yIGEgdmVuZG9yLXByZWZpeGVkIHZlcnNpb24gdGhlcmVvZiksIG9yIGBudWxsYCBpZiBub3Qgc3VwcG9ydGVkLlxyXG4gICAgICovXHJcbiAgICB2YXIgZ2V0UHJlZml4ID0gZnVuY3Rpb24gKGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZlbmRvcnMgPSBbICdpJywgJ3dlYmtpdEknLCAnbXNJJywgJ21vekknLCAnb0knIF07XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzID0gdmVuZG9yc1tpXSArICdtYWdlU21vb3RoaW5nRW5hYmxlZCc7XHJcblxyXG4gICAgICAgICAgICBpZiAocyBpbiBjb250ZXh0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgSW1hZ2UgU21vb3RoaW5nIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBjb250ZXh0LiBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBpbWFnZSBzbW9vdGhpbmcuXHJcbiAgICAgKiBCeSBkZWZhdWx0IGJyb3dzZXJzIGhhdmUgaW1hZ2Ugc21vb3RoaW5nIGVuYWJsZWQsIHdoaWNoIGlzbid0IGFsd2F5cyB3aGF0IHlvdSB2aXN1YWxseSB3YW50LCBlc3BlY2lhbGx5XHJcbiAgICAgKiB3aGVuIHVzaW5nIHBpeGVsIGFydCBpbiBhIGdhbWUuIE5vdGUgdGhhdCB0aGlzIHNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IGl0c2VsZiwgc28gdGhhdCBhbnkgaW1hZ2VcclxuICAgICAqIGRyYXduIHRvIHRoZSBjb250ZXh0IHdpbGwgYmUgYWZmZWN0ZWQuIFRoaXMgc2V0cyB0aGUgcHJvcGVydHkgYWNyb3NzIGFsbCBjdXJyZW50IGJyb3dzZXJzIGJ1dCBzdXBwb3J0IGlzXHJcbiAgICAgKiBwYXRjaHkgb24gZWFybGllciBicm93c2VycywgZXNwZWNpYWxseSBvbiBtb2JpbGUuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5TbW9vdGhpbmcuZW5hYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8V2ViR0xSZW5kZXJpbmdDb250ZXh0KX0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9uIHdoaWNoIHRvIGVuYWJsZSBzbW9vdGhpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRHxXZWJHTFJlbmRlcmluZ0NvbnRleHQpfSBUaGUgcHJvdmlkZWQgY29udGV4dC5cclxuICAgICAqL1xyXG4gICAgdmFyIGVuYWJsZSA9IGZ1bmN0aW9uIChjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChwcmVmaXggPT09ICcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJlZml4ID0gZ2V0UHJlZml4KGNvbnRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByZWZpeClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRleHRbcHJlZml4XSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29udGV4dDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBJbWFnZSBTbW9vdGhpbmcgcHJvcGVydHkgb24gdGhlIGdpdmVuIGNvbnRleHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGltYWdlIHNtb290aGluZy5cclxuICAgICAqIEJ5IGRlZmF1bHQgYnJvd3NlcnMgaGF2ZSBpbWFnZSBzbW9vdGhpbmcgZW5hYmxlZCwgd2hpY2ggaXNuJ3QgYWx3YXlzIHdoYXQgeW91IHZpc3VhbGx5IHdhbnQsIGVzcGVjaWFsbHlcclxuICAgICAqIHdoZW4gdXNpbmcgcGl4ZWwgYXJ0IGluIGEgZ2FtZS4gTm90ZSB0aGF0IHRoaXMgc2V0cyB0aGUgcHJvcGVydHkgb24gdGhlIGNvbnRleHQgaXRzZWxmLCBzbyB0aGF0IGFueSBpbWFnZVxyXG4gICAgICogZHJhd24gdG8gdGhlIGNvbnRleHQgd2lsbCBiZSBhZmZlY3RlZC4gVGhpcyBzZXRzIHRoZSBwcm9wZXJ0eSBhY3Jvc3MgYWxsIGN1cnJlbnQgYnJvd3NlcnMgYnV0IHN1cHBvcnQgaXNcclxuICAgICAqIHBhdGNoeSBvbiBlYXJsaWVyIGJyb3dzZXJzLCBlc3BlY2lhbGx5IG9uIG1vYmlsZS5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ2FudmFzLlNtb290aGluZy5kaXNhYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8V2ViR0xSZW5kZXJpbmdDb250ZXh0KX0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9uIHdoaWNoIHRvIGRpc2FibGUgc21vb3RoaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8V2ViR0xSZW5kZXJpbmdDb250ZXh0KX0gVGhlIHByb3ZpZGVkIGNvbnRleHQuXHJcbiAgICAgKi9cclxuICAgIHZhciBkaXNhYmxlID0gZnVuY3Rpb24gKGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gJycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcmVmaXggPSBnZXRQcmVmaXgoY29udGV4dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJlZml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29udGV4dFtwcmVmaXhdID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29udGV4dDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gY29udGV4dCBoYXMgaW1hZ2Ugc21vb3RoaW5nIGVuYWJsZWQsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXHJcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm8gc21vb3RoaW5nIHByZWZpeCBpcyBhdmFpbGFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5TbW9vdGhpbmcuaXNFbmFibGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8V2ViR0xSZW5kZXJpbmdDb250ZXh0KX0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9ib29sZWFufSBgdHJ1ZWAgaWYgc21vb3RoaW5nIGlzIGVuYWJsZWQgb24gdGhlIGNvbnRleHQsIG90aGVyd2lzZSBgZmFsc2VgLiBgbnVsbGAgaWYgbm90IHN1cHBvcnRlZC5cclxuICAgICAqL1xyXG4gICAgdmFyIGlzRW5hYmxlZCA9IGZ1bmN0aW9uIChjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAocHJlZml4ICE9PSBudWxsKSA/IGNvbnRleHRbcHJlZml4XSA6IG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGlzYWJsZTogZGlzYWJsZSxcclxuICAgICAgICBlbmFibGU6IGVuYWJsZSxcclxuICAgICAgICBnZXRQcmVmaXg6IGdldFByZWZpeCxcclxuICAgICAgICBpc0VuYWJsZWQ6IGlzRW5hYmxlZFxyXG4gICAgfTtcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNtb290aGluZygpO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSB0b3VjaC1hY3Rpb24gcHJvcGVydHkgb24gdGhlIGNhbnZhcyBzdHlsZS4gQ2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBkZWZhdWx0IGJyb3dzZXIgdG91Y2ggYWN0aW9ucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNhbnZhcy5Ub3VjaEFjdGlvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIC0gVGhlIGNhbnZhcyBlbGVtZW50IHRvIGhhdmUgdGhlIHN0eWxlIGFwcGxpZWQgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWU9J25vbmUnXSAtIFRoZSB0b3VjaCBhY3Rpb24gdmFsdWUgdG8gc2V0IG9uIHRoZSBjYW52YXMuIFNldCB0byBgbm9uZWAgdG8gZGlzYWJsZSB0b3VjaCBhY3Rpb25zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIGNhbnZhcyBlbGVtZW50LlxyXG4gKi9cclxudmFyIFRvdWNoQWN0aW9uID0gZnVuY3Rpb24gKGNhbnZhcywgdmFsdWUpXHJcbntcclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gJ25vbmUnOyB9XHJcblxyXG4gICAgY2FudmFzLnN0eWxlWydtc1RvdWNoQWN0aW9uJ10gPSB2YWx1ZTtcclxuICAgIGNhbnZhcy5zdHlsZVsnbXMtdG91Y2gtYWN0aW9uJ10gPSB2YWx1ZTtcclxuICAgIGNhbnZhcy5zdHlsZVsndG91Y2gtYWN0aW9uJ10gPSB2YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gY2FudmFzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUb3VjaEFjdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgdXNlci1zZWxlY3QgcHJvcGVydHkgb24gdGhlIGNhbnZhcyBzdHlsZS4gQ2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBkZWZhdWx0IGJyb3dzZXIgc2VsZWN0aW9uIGFjdGlvbnMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5DYW52YXMuVXNlclNlbGVjdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIC0gVGhlIGNhbnZhcyBlbGVtZW50IHRvIGhhdmUgdGhlIHN0eWxlIGFwcGxpZWQgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWU9J25vbmUnXSAtIFRoZSB0b3VjaCBjYWxsb3V0IHZhbHVlIHRvIHNldCBvbiB0aGUgY2FudmFzLiBTZXQgdG8gYG5vbmVgIHRvIGRpc2FibGUgdG91Y2ggY2FsbG91dHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgY2FudmFzIGVsZW1lbnQuXHJcbiAqL1xyXG52YXIgVXNlclNlbGVjdCA9IGZ1bmN0aW9uIChjYW52YXMsIHZhbHVlKVxyXG57XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9ICdub25lJzsgfVxyXG5cclxuICAgIHZhciB2ZW5kb3JzID0gW1xyXG4gICAgICAgICctd2Via2l0LScsXHJcbiAgICAgICAgJy1raHRtbC0nLFxyXG4gICAgICAgICctbW96LScsXHJcbiAgICAgICAgJy1tcy0nLFxyXG4gICAgICAgICcnXHJcbiAgICBdO1xyXG5cclxuICAgIHZlbmRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmVuZG9yKVxyXG4gICAge1xyXG4gICAgICAgIGNhbnZhcy5zdHlsZVt2ZW5kb3IgKyAndXNlci1zZWxlY3QnXSA9IHZhbHVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY2FudmFzLnN0eWxlWyctd2Via2l0LXRvdWNoLWNhbGxvdXQnXSA9IHZhbHVlO1xyXG4gICAgY2FudmFzLnN0eWxlWyctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InXSA9ICdyZ2JhKDAsIDAsIDAsIDApJztcclxuXHJcbiAgICByZXR1cm4gY2FudmFzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBVc2VyU2VsZWN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5EaXNwbGF5LkNhbnZhc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIENhbnZhc0ludGVycG9sYXRpb246IHJlcXVpcmUoJy4vQ2FudmFzSW50ZXJwb2xhdGlvbicpLFxyXG4gICAgQ2FudmFzUG9vbDogcmVxdWlyZSgnLi9DYW52YXNQb29sJyksXHJcbiAgICBTbW9vdGhpbmc6IHJlcXVpcmUoJy4vU21vb3RoaW5nJyksXHJcbiAgICBUb3VjaEFjdGlvbjogcmVxdWlyZSgnLi9Ub3VjaEFjdGlvbicpLFxyXG4gICAgVXNlclNlbGVjdDogcmVxdWlyZSgnLi9Vc2VyU2VsZWN0JylcclxuICAgIFxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHZXRDb2xvciA9IHJlcXVpcmUoJy4vR2V0Q29sb3InKTtcclxudmFyIEdldENvbG9yMzIgPSByZXF1aXJlKCcuL0dldENvbG9yMzInKTtcclxudmFyIEhTVlRvUkdCID0gcmVxdWlyZSgnLi9IU1ZUb1JHQicpO1xyXG52YXIgUkdCVG9IU1YgPSByZXF1aXJlKCcuL1JHQlRvSFNWJyk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuRGlzcGxheS5Db2xvclxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBDb2xvciBjbGFzcyBob2xkcyBhIHNpbmdsZSBjb2xvciB2YWx1ZSBhbmQgYWxsb3dzIGZvciBlYXN5IG1vZGlmaWNhdGlvbiBhbmQgcmVhZGluZyBvZiBpdC5cclxuICpcclxuICogQGNsYXNzIENvbG9yXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuRGlzcGxheVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3JlZD0wXSAtIFRoZSByZWQgY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtncmVlbj0wXSAtIFRoZSBncmVlbiBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2JsdWU9MF0gLSBUaGUgYmx1ZSBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2FscGhhPTI1NV0gLSBUaGUgYWxwaGEgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gKi9cclxudmFyIENvbG9yID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENvbG9yIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAocmVkID09PSB1bmRlZmluZWQpIHsgcmVkID0gMDsgfVxyXG4gICAgICAgIGlmIChncmVlbiA9PT0gdW5kZWZpbmVkKSB7IGdyZWVuID0gMDsgfVxyXG4gICAgICAgIGlmIChibHVlID09PSB1bmRlZmluZWQpIHsgYmx1ZSA9IDA7IH1cclxuICAgICAgICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkgeyBhbHBoYSA9IDI1NTsgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW50ZXJuYWwgcmVkIGNvbG9yIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIGdyZWVuIGNvbG9yIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjZ1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIGJsdWUgY29sb3IgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNiXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmIgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW50ZXJuYWwgYWxwaGEgY29sb3IgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDI1NVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYSA9IDI1NTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGh1ZSBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgY29sb3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNfaFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2ggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2F0dXJhdGlvbiBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqIFRoaXMgY29udHJvbHMgaG93IG11Y2ggb2YgdGhlIGh1ZSB3aWxsIGJlIGluIHRoZSBmaW5hbCBjb2xvciwgd2hlcmUgMSBpcyBmdWxseSBzYXR1cmF0ZWQgYW5kIDAgd2lsbCBnaXZlIHlvdSB3aGl0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkNvbG9yI19zXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsaWdodG5lc3MgY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKiBUaGlzIGNvbnRyb2xzIGhvdyBkYXJrIHRoZSBjb2xvciBpcy4gV2hlcmUgMSBpcyBhcyBicmlnaHQgYXMgcG9zc2libGUgYW5kIDAgaXMgYmxhY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNfdlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3YgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIGNvbG9yIHVwZGF0ZSBsb2NrZWQ/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNfbG9ja2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbG9ja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNhbGN1bGF0ZWQgY29sb3IgdmFsdWVzIGZvciBXZWJHTCB1c2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNnbFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsID0gWyAwLCAwLCAwLCAxIF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByZS1jYWxjdWxhdGVkIGludGVybmFsIGNvbG9yIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjX2NvbG9yXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jb2xvciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByZS1jYWxjdWxhdGVkIGludGVybmFsIGNvbG9yMzIgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNfY29sb3IzMlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29sb3IzMiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByZS1jYWxjdWxhdGVkIGludGVybmFsIGNvbG9yIHJnYiBzdHJpbmcgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNfcmdiYVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAnJ1xyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3JnYmEgPSAnJztcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUbyhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIGNvbG9yIHRvIGJlIHRyYW5zcGFyZW50LiBTZXRzIGFsbCB2YWx1ZXMgdG8gemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI3RyYW5zcGFyZW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gVGhpcyBDb2xvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zcGFyZW50OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMucmVkID0gMDtcclxuICAgICAgICB0aGlzLmdyZWVuID0gMDtcclxuICAgICAgICB0aGlzLmJsdWUgPSAwO1xyXG4gICAgICAgIHRoaXMuYWxwaGEgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIG9mIHRoaXMgQ29sb3IgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuQ29sb3Ijc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVkIC0gVGhlIHJlZCBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGdyZWVuIC0gVGhlIGdyZWVuIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYmx1ZSAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2FscGhhPTI1NV0gLSBUaGUgYWxwaGEgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlSFNWPXRydWVdIC0gVXBkYXRlIHRoZSBIU1YgdmFsdWVzIGFmdGVyIHNldHRpbmcgdGhlIFJHQiB2YWx1ZXM/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFRoaXMgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUbzogZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhLCB1cGRhdGVIU1YpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAyNTU7IH1cclxuICAgICAgICBpZiAodXBkYXRlSFNWID09PSB1bmRlZmluZWQpIHsgdXBkYXRlSFNWID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLl9sb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnJlZCA9IHJlZDtcclxuICAgICAgICB0aGlzLmdyZWVuID0gZ3JlZW47XHJcbiAgICAgICAgdGhpcy5ibHVlID0gYmx1ZTtcclxuICAgICAgICB0aGlzLmFscGhhID0gYWxwaGE7XHJcblxyXG4gICAgICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUodXBkYXRlSFNWKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSBHTCB2YWx1ZXMgb2YgdGhpcyBDb2xvciBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5Db2xvciNzZXRHTFRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVkIC0gVGhlIHJlZCBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGdyZWVuIC0gVGhlIGdyZWVuIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmx1ZSAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gVGhlIGFscGhhIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFRoaXMgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRHTFRvOiBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xvY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMucmVkR0wgPSByZWQ7XHJcbiAgICAgICAgdGhpcy5ncmVlbkdMID0gZ3JlZW47XHJcbiAgICAgICAgdGhpcy5ibHVlR0wgPSBibHVlO1xyXG4gICAgICAgIHRoaXMuYWxwaGFHTCA9IGFscGhhO1xyXG5cclxuICAgICAgICB0aGlzLl9sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIGJhc2VkIG9uIHRoZSBjb2xvciBvYmplY3QgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5Db2xvciNzZXRGcm9tUkdCXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5EaXNwbGF5LklucHV0Q29sb3JPYmplY3R9IGNvbG9yIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYHJgLCBgZ2AsIGBiYCBhbmQgb3B0aW9uYWxseSBgYWAgdmFsdWVzIGluIHRoZSByYW5nZSAwIHRvIDI1NS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gVGhpcyBDb2xvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZyb21SR0I6IGZ1bmN0aW9uIChjb2xvcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnJlZCA9IGNvbG9yLnI7XHJcbiAgICAgICAgdGhpcy5ncmVlbiA9IGNvbG9yLmc7XHJcbiAgICAgICAgdGhpcy5ibHVlID0gY29sb3IuYjtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KCdhJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhID0gY29sb3IuYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29sb3IgYmFzZWQgb24gdGhlIGh1ZSwgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzIHZhbHVlcyBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI3NldEZyb21IU1ZcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaCAtIFRoZSBodWUsIGluIHRoZSByYW5nZSAwIC0gMS4gVGhpcyBpcyB0aGUgYmFzZSBjb2xvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNhdHVyYXRpb24sIGluIHRoZSByYW5nZSAwIC0gMS4gVGhpcyBjb250cm9scyBob3cgbXVjaCBvZiB0aGUgaHVlIHdpbGwgYmUgaW4gdGhlIGZpbmFsIGNvbG9yLCB3aGVyZSAxIGlzIGZ1bGx5IHNhdHVyYXRlZCBhbmQgMCB3aWxsIGdpdmUgeW91IHdoaXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUsIGluIHRoZSByYW5nZSAwIC0gMS4gVGhpcyBjb250cm9scyBob3cgZGFyayB0aGUgY29sb3IgaXMuIFdoZXJlIDEgaXMgYXMgYnJpZ2h0IGFzIHBvc3NpYmxlIGFuZCAwIGlzIGJsYWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBUaGlzIENvbG9yIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RnJvbUhTVjogZnVuY3Rpb24gKGgsIHMsIHYpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEhTVlRvUkdCKGgsIHMsIHYsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGludGVybmFsIGNhY2hlIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI3VwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBUaGlzIENvbG9yIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodXBkYXRlSFNWKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh1cGRhdGVIU1YgPT09IHVuZGVmaW5lZCkgeyB1cGRhdGVIU1YgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fbG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgciA9IHRoaXMucjtcclxuICAgICAgICB2YXIgZyA9IHRoaXMuZztcclxuICAgICAgICB2YXIgYiA9IHRoaXMuYjtcclxuICAgICAgICB2YXIgYSA9IHRoaXMuYTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29sb3IgPSBHZXRDb2xvcihyLCBnLCBiKTtcclxuICAgICAgICB0aGlzLl9jb2xvcjMyID0gR2V0Q29sb3IzMihyLCBnLCBiLCBhKTtcclxuICAgICAgICB0aGlzLl9yZ2JhID0gJ3JnYmEoJyArIHIgKyAnLCcgKyBnICsgJywnICsgYiArICcsJyArIChhIC8gMjU1KSArICcpJztcclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZUhTVilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJHQlRvSFNWKHIsIGcsIGIsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgaHN2IGNhY2hlIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI3VwZGF0ZUhTVlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gVGhpcyBDb2xvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUhTVjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgciA9IHRoaXMucjtcclxuICAgICAgICB2YXIgZyA9IHRoaXMuZztcclxuICAgICAgICB2YXIgYiA9IHRoaXMuYjtcclxuXHJcbiAgICAgICAgUkdCVG9IU1YociwgZywgYiwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBuZXcgQ29sb3IgY29tcG9uZW50IHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGlzIG9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI2Nsb25lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gQSBuZXcgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjbG9uZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IENvbG9yKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIsIHRoaXMuYSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIENvbG9yIG9iamVjdCB0byBiZSBncmF5c2NhbGVkIGJhc2VkIG9uIHRoZSBzaGFkZSB2YWx1ZSBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI2dyYXlcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzaGFkZSAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFRoaXMgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBncmF5OiBmdW5jdGlvbiAoc2hhZGUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0VG8oc2hhZGUsIHNoYWRlLCBzaGFkZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIENvbG9yIG9iamVjdCB0byBiZSBhIHJhbmRvbSBjb2xvciBiZXR3ZWVuIHRoZSBgbWluYCBhbmQgYG1heGAgdmFsdWVzIGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuQ29sb3IjcmFuZG9tXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW21pbj0wXSAtIFRoZSBtaW5pbXVtIHJhbmRvbSBjb2xvciB2YWx1ZS4gQmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFttYXg9MjU1XSAtIFRoZSBtYXhpbXVtIHJhbmRvbSBjb2xvciB2YWx1ZS4gQmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFRoaXMgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByYW5kb206IGZ1bmN0aW9uIChtaW4sIG1heClcclxuICAgIHtcclxuICAgICAgICBpZiAobWluID09PSB1bmRlZmluZWQpIHsgbWluID0gMDsgfVxyXG4gICAgICAgIGlmIChtYXggPT09IHVuZGVmaW5lZCkgeyBtYXggPSAyNTU7IH1cclxuXHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLmZsb29yKG1pbiArIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSk7XHJcbiAgICAgICAgdmFyIGcgPSBNYXRoLmZsb29yKG1pbiArIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSk7XHJcbiAgICAgICAgdmFyIGIgPSBNYXRoLmZsb29yKG1pbiArIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFRvKHIsIGcsIGIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBDb2xvciBvYmplY3QgdG8gYmUgYSByYW5kb20gZ3JheXNjYWxlIGNvbG9yIGJldHdlZW4gdGhlIGBtaW5gIGFuZCBgbWF4YCB2YWx1ZXMgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5Db2xvciNyYW5kb21HcmF5XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW21pbj0wXSAtIFRoZSBtaW5pbXVtIHJhbmRvbSBjb2xvciB2YWx1ZS4gQmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFttYXg9MjU1XSAtIFRoZSBtYXhpbXVtIHJhbmRvbSBjb2xvciB2YWx1ZS4gQmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFRoaXMgQ29sb3Igb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByYW5kb21HcmF5OiBmdW5jdGlvbiAobWluLCBtYXgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkKSB7IG1pbiA9IDA7IH1cclxuICAgICAgICBpZiAobWF4ID09PSB1bmRlZmluZWQpIHsgbWF4ID0gMjU1OyB9XHJcblxyXG4gICAgICAgIHZhciBzID0gTWF0aC5mbG9vcihtaW4gKyBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRUbyhzLCBzLCBzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNyZWFzZSB0aGUgc2F0dXJhdGlvbiBvZiB0aGlzIENvbG9yIGJ5IHRoZSBwZXJjZW50YWdlIGFtb3VudCBnaXZlbi5cclxuICAgICAqIFRoZSBzYXR1cmF0aW9uIGlzIHRoZSBhbW91bnQgb2YgdGhlIGJhc2UgY29sb3IgaW4gdGhlIGh1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI3NhdHVyYXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYW1vdW50IC0gVGhlIHBlcmNlbnRhZ2UgYW1vdW50IHRvIGNoYW5nZSB0aGlzIGNvbG9yIGJ5LiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBUaGlzIENvbG9yIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2F0dXJhdGU6IGZ1bmN0aW9uIChhbW91bnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zICs9IGFtb3VudCAvIDEwMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjcmVhc2UgdGhlIHNhdHVyYXRpb24gb2YgdGhpcyBDb2xvciBieSB0aGUgcGVyY2VudGFnZSBhbW91bnQgZ2l2ZW4uXHJcbiAgICAgKiBUaGUgc2F0dXJhdGlvbiBpcyB0aGUgYW1vdW50IG9mIHRoZSBiYXNlIGNvbG9yIGluIHRoZSBodWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5Db2xvciNkZXNhdHVyYXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYW1vdW50IC0gVGhlIHBlcmNlbnRhZ2UgYW1vdW50IHRvIGNoYW5nZSB0aGlzIGNvbG9yIGJ5LiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBUaGlzIENvbG9yIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZGVzYXR1cmF0ZTogZnVuY3Rpb24gKGFtb3VudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnMgLT0gYW1vdW50IC8gMTAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNyZWFzZSB0aGUgbGlnaHRuZXNzIG9mIHRoaXMgQ29sb3IgYnkgdGhlIHBlcmNlbnRhZ2UgYW1vdW50IGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuQ29sb3IjbGlnaHRlblxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGFtb3VudCAtIFRoZSBwZXJjZW50YWdlIGFtb3VudCB0byBjaGFuZ2UgdGhpcyBjb2xvciBieS4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gVGhpcyBDb2xvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGxpZ2h0ZW46IGZ1bmN0aW9uIChhbW91bnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52ICs9IGFtb3VudCAvIDEwMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjcmVhc2UgdGhlIGxpZ2h0bmVzcyBvZiB0aGlzIENvbG9yIGJ5IHRoZSBwZXJjZW50YWdlIGFtb3VudCBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI2RhcmtlblxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGFtb3VudCAtIFRoZSBwZXJjZW50YWdlIGFtb3VudCB0byBjaGFuZ2UgdGhpcyBjb2xvciBieS4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gVGhpcyBDb2xvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGRhcmtlbjogZnVuY3Rpb24gKGFtb3VudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnYgLT0gYW1vdW50IC8gMTAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcmlnaHRlbiB0aGlzIENvbG9yIGJ5IHRoZSBwZXJjZW50YWdlIGFtb3VudCBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5LkNvbG9yI2JyaWdodGVuXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYW1vdW50IC0gVGhlIHBlcmNlbnRhZ2UgYW1vdW50IHRvIGNoYW5nZSB0aGlzIGNvbG9yIGJ5LiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBUaGlzIENvbG9yIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYnJpZ2h0ZW46IGZ1bmN0aW9uIChhbW91bnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHIgPSB0aGlzLnI7XHJcbiAgICAgICAgdmFyIGcgPSB0aGlzLmc7XHJcbiAgICAgICAgdmFyIGIgPSB0aGlzLmI7XHJcblxyXG4gICAgICAgIHIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHIgLSBNYXRoLnJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7XHJcbiAgICAgICAgZyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgZyAtIE1hdGgucm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTtcclxuICAgICAgICBiID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBiIC0gTWF0aC5yb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRUbyhyLCBnLCBiKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY29sb3Igb2YgdGhpcyBDb2xvciBjb21wb25lbnQsIG5vdCBpbmNsdWRpbmcgdGhlIGFscGhhIGNoYW5uZWwuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjY29sb3JcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjb2xvcjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY29sb3Igb2YgdGhpcyBDb2xvciBjb21wb25lbnQsIGluY2x1ZGluZyB0aGUgYWxwaGEgY2hhbm5lbC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNjb2xvcjMyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgY29sb3IzMjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb3IzMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb2xvciBvZiB0aGlzIENvbG9yIGNvbXBvbmVudCBhcyBhIHN0cmluZyB3aGljaCBjYW4gYmUgdXNlZCBpbiBDU1MgY29sb3IgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkNvbG9yI3JnYmFcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZ2JhOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZ2JhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlZCBjb2xvciB2YWx1ZSwgbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMCB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkNvbG9yI3JlZEdMXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlZEdMOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nbFswXSA9IE1hdGgubWluKE1hdGguYWJzKHZhbHVlKSwgMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnIgPSBNYXRoLmZsb29yKHRoaXMuZ2xbMF0gKiAyNTUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ3JlZW4gY29sb3IgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAgdG8gMS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNncmVlbkdMXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGdyZWVuR0w6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2xbMV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmdsWzFdID0gTWF0aC5taW4oTWF0aC5hYnModmFsdWUpLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZyA9IE1hdGguZmxvb3IodGhpcy5nbFsxXSAqIDI1NSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBibHVlIGNvbG9yIHZhbHVlLCBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjYmx1ZUdMXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJsdWVHTDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbFsyXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2xbMl0gPSBNYXRoLm1pbihNYXRoLmFicyh2YWx1ZSksIDEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5mbG9vcih0aGlzLmdsWzJdICogMjU1KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIGNvbG9yIHZhbHVlLCBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjYWxwaGFHTFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBhbHBoYUdMOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsWzNdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nbFszXSA9IE1hdGgubWluKE1hdGguYWJzKHZhbHVlKSwgMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmEgPSBNYXRoLmZsb29yKHRoaXMuZ2xbM10gKiAyNTUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByZWQgY29sb3IgdmFsdWUsIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAgdG8gMjU1LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkNvbG9yI3JlZFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZWQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yID0gTWF0aC5taW4odmFsdWUsIDI1NSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdsWzBdID0gdmFsdWUgLyAyNTU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBncmVlbiBjb2xvciB2YWx1ZSwgbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMCB0byAyNTUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjZ3JlZW5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZ3JlZW46IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nID0gTWF0aC5taW4odmFsdWUsIDI1NSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdsWzFdID0gdmFsdWUgLyAyNTU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBibHVlIGNvbG9yIHZhbHVlLCBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDI1NS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNibHVlXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJsdWU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iID0gTWF0aC5taW4odmFsdWUsIDI1NSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdsWzJdID0gdmFsdWUgLyAyNTU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhbHBoYSBjb2xvciB2YWx1ZSwgbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMCB0byAyNTUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQ29sb3IjYWxwaGFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYWxwaGE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5mbG9vcihNYXRoLmFicyh2YWx1ZSkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hID0gTWF0aC5taW4odmFsdWUsIDI1NSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdsWzNdID0gdmFsdWUgLyAyNTU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGh1ZSBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogVGhpcyBpcyB0aGUgYmFzZSBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faCA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgSFNWVG9SR0IodmFsdWUsIHRoaXMuX3MsIHRoaXMuX3YsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhdHVyYXRpb24gY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIFRoaXMgY29udHJvbHMgaG93IG11Y2ggb2YgdGhlIGh1ZSB3aWxsIGJlIGluIHRoZSBmaW5hbCBjb2xvciwgd2hlcmUgMSBpcyBmdWxseSBzYXR1cmF0ZWQgYW5kIDAgd2lsbCBnaXZlIHlvdSB3aGl0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5Db2xvciNzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBzOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcyA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgSFNWVG9SR0IodGhpcy5faCwgdmFsdWUsIHRoaXMuX3YsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxpZ2h0bmVzcyBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogVGhpcyBjb250cm9scyBob3cgZGFyayB0aGUgY29sb3IgaXMuIFdoZXJlIDEgaXMgYXMgYnJpZ2h0IGFzIHBvc3NpYmxlIGFuZCAwIGlzIGJsYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkNvbG9yI3ZcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIHY6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Y7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl92ID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBIU1ZUb1JHQih0aGlzLl9oLCB0aGlzLl9zLCB2YWx1ZSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIGdpdmVuIGNvbG9yIHZhbHVlIGludG8gYW4gT2JqZWN0IGNvbnRhaW5pbmcgcixnLGIgYW5kIGEgcHJvcGVydGllcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLkNvbG9yVG9SR0JBXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29sb3IgLSBBIGNvbG9yIHZhbHVlLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5EaXNwbGF5LkNvbG9yT2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIGNvbG9yIHZhbHVlcy5cclxuICovXHJcbnZhciBDb2xvclRvUkdCQSA9IGZ1bmN0aW9uIChjb2xvcilcclxue1xyXG4gICAgdmFyIG91dHB1dCA9IHtcclxuICAgICAgICByOiBjb2xvciA+PiAxNiAmIDB4RkYsXHJcbiAgICAgICAgZzogY29sb3IgPj4gOCAmIDB4RkYsXHJcbiAgICAgICAgYjogY29sb3IgJiAweEZGLFxyXG4gICAgICAgIGE6IDI1NVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoY29sb3IgPiAxNjc3NzIxNSlcclxuICAgIHtcclxuICAgICAgICBvdXRwdXQuYSA9IGNvbG9yID4+PiAyNDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb2xvclRvUkdCQTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgaGV4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBjb2xvciBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5Db21wb25lbnRUb0hleFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBjb2xvciAtIFRoZSBjb2xvciBjaGFubmVsIHRvIGdldCB0aGUgaGV4IHZhbHVlIGZvciwgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIG9mIGxlbmd0aCAyIGNoYXJhY3RlcnMsIGkuZS4gMjU1ID0gZmYsIDEwMCA9IDY0LlxyXG4gKi9cclxudmFyIENvbXBvbmVudFRvSGV4ID0gZnVuY3Rpb24gKGNvbG9yKVxyXG57XHJcbiAgICB2YXIgaGV4ID0gY29sb3IudG9TdHJpbmcoMTYpO1xyXG5cclxuICAgIHJldHVybiAoaGV4Lmxlbmd0aCA9PT0gMSkgPyAnMCcgKyBoZXggOiBoZXg7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudFRvSGV4O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBHaXZlbiAzIHNlcGFyYXRlIGNvbG9yIHZhbHVlcyB0aGlzIHdpbGwgcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgaXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5HZXRDb2xvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSByZWQgLSBUaGUgcmVkIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBncmVlbiAtIFRoZSBncmVlbiBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYmx1ZSAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29tYmluZWQgY29sb3IgdmFsdWUuXHJcbiAqL1xyXG52YXIgR2V0Q29sb3IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSlcclxue1xyXG4gICAgcmV0dXJuIHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRDb2xvcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogR2l2ZW4gYW4gYWxwaGEgYW5kIDMgY29sb3IgdmFsdWVzIHRoaXMgd2lsbCByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBpdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLkdldENvbG9yMzJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gcmVkIC0gVGhlIHJlZCBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZ3JlZW4gLSBUaGUgZ3JlZW4gY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGJsdWUgLSBUaGUgYmx1ZSBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYWxwaGEgLSBUaGUgYWxwaGEgY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb21iaW5lZCBjb2xvciB2YWx1ZS5cclxuICovXHJcbnZhciBHZXRDb2xvcjMyID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKVxyXG57XHJcbiAgICByZXR1cm4gYWxwaGEgPDwgMjQgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0Q29sb3IzMjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29sb3IgPSByZXF1aXJlKCcuL0NvbG9yJyk7XHJcbnZhciBIdWVUb0NvbXBvbmVudCA9IHJlcXVpcmUoJy4vSHVlVG9Db21wb25lbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBIU0wgKGh1ZSwgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzKSB2YWx1ZXMgdG8gYSBQaGFzZXIgQ29sb3Igb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ29sb3IuSFNMVG9Db2xvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGggLSBUaGUgaHVlIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNhdHVyYXRpb24gdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gMS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGwgLSBUaGUgbGlnaHRuZXNzIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBIENvbG9yIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgdGhlIGgsIHMgYW5kIGwgdmFsdWVzLlxyXG4gKi9cclxudmFyIEhTTFRvQ29sb3IgPSBmdW5jdGlvbiAoaCwgcywgbClcclxue1xyXG4gICAgLy8gYWNocm9tYXRpYyBieSBkZWZhdWx0XHJcbiAgICB2YXIgciA9IGw7XHJcbiAgICB2YXIgZyA9IGw7XHJcbiAgICB2YXIgYiA9IGw7XHJcblxyXG4gICAgaWYgKHMgIT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHEgPSAobCA8IDAuNSkgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XHJcbiAgICAgICAgdmFyIHAgPSAyICogbCAtIHE7XHJcblxyXG4gICAgICAgIHIgPSBIdWVUb0NvbXBvbmVudChwLCBxLCBoICsgMSAvIDMpO1xyXG4gICAgICAgIGcgPSBIdWVUb0NvbXBvbmVudChwLCBxLCBoKTtcclxuICAgICAgICBiID0gSHVlVG9Db21wb25lbnQocCwgcSwgaCAtIDEgLyAzKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcbiAgICByZXR1cm4gY29sb3Iuc2V0R0xUbyhyLCBnLCBiLCAxKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSFNMVG9Db2xvcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgSFNWVG9SR0IgPSByZXF1aXJlKCcuL0hTVlRvUkdCJyk7XHJcblxyXG4vKipcclxuICogR2V0IEhTViBjb2xvciB3aGVlbCB2YWx1ZXMgaW4gYW4gYXJyYXkgd2hpY2ggd2lsbCBiZSAzNjAgZWxlbWVudHMgaW4gc2l6ZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLkhTVkNvbG9yV2hlZWxcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcz0xXSAtIFRoZSBzYXR1cmF0aW9uLCBpbiB0aGUgcmFuZ2UgMCAtIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdj0xXSAtIFRoZSB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAgLSAxLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuRGlzcGxheS5Db2xvck9iamVjdFtdfSBBbiBhcnJheSBjb250YWluaW5nIDM2MCBlbGVtZW50cywgd2hlcmUgZWFjaCBjb250YWlucyBhIHNpbmdsZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbG9yIGF0IHRoYXQgcG9pbnQgaW4gdGhlIEhTViBjb2xvciB3aGVlbC5cclxuICovXHJcbnZhciBIU1ZDb2xvcldoZWVsID0gZnVuY3Rpb24gKHMsIHYpXHJcbntcclxuICAgIGlmIChzID09PSB1bmRlZmluZWQpIHsgcyA9IDE7IH1cclxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHsgdiA9IDE7IH1cclxuXHJcbiAgICB2YXIgY29sb3JzID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPD0gMzU5OyBjKyspXHJcbiAgICB7XHJcbiAgICAgICAgY29sb3JzLnB1c2goSFNWVG9SR0IoYyAvIDM1OSwgcywgdikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2xvcnM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEhTVkNvbG9yV2hlZWw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldENvbG9yID0gcmVxdWlyZSgnLi9HZXRDb2xvcicpO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGFuIEhTViAoaHVlLCBzYXR1cmF0aW9uIGFuZCB2YWx1ZSkgY29sb3IgdmFsdWUgdG8gUkdCLlxyXG4gKiBDb252ZXJzaW9uIGZvcm11bGEgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hTTF9jb2xvcl9zcGFjZS5cclxuICogQXNzdW1lcyBIU1YgdmFsdWVzIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMV0uXHJcbiAqIEJhc2VkIG9uIGNvZGUgYnkgTWljaGFlbCBKYWNrc29uIChodHRwczovL2dpdGh1Yi5jb20vbWppamFja3NvbilcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLkhTVlRvUkdCXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaCAtIFRoZSBodWUsIGluIHRoZSByYW5nZSAwIC0gMS4gVGhpcyBpcyB0aGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2F0dXJhdGlvbiwgaW4gdGhlIHJhbmdlIDAgLSAxLiBUaGlzIGNvbnRyb2xzIGhvdyBtdWNoIG9mIHRoZSBodWUgd2lsbCBiZSBpbiB0aGUgZmluYWwgY29sb3IsIHdoZXJlIDEgaXMgZnVsbHkgc2F0dXJhdGVkIGFuZCAwIHdpbGwgZ2l2ZSB5b3Ugd2hpdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMCAtIDEuIFRoaXMgY29udHJvbHMgaG93IGRhcmsgdGhlIGNvbG9yIGlzLiBXaGVyZSAxIGlzIGFzIGJyaWdodCBhcyBwb3NzaWJsZSBhbmQgMCBpcyBibGFjay5cclxuICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLkRpc3BsYXkuQ29sb3JPYmplY3R8UGhhc2VyLkRpc3BsYXkuQ29sb3IpfSBbb3V0XSAtIEEgQ29sb3Igb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLiBJZiBub3QgZ2l2ZW4gYSBuZXcgQ29sb3JPYmplY3Qgd2lsbCBiZSBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLlR5cGVzLkRpc3BsYXkuQ29sb3JPYmplY3R8UGhhc2VyLkRpc3BsYXkuQ29sb3IpfSBBbiBvYmplY3Qgd2l0aCB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSB2YWx1ZXMgc2V0IGluIHRoZSByLCBnIGFuZCBiIHByb3BlcnRpZXMuXHJcbiAqL1xyXG52YXIgSFNWVG9SR0IgPSBmdW5jdGlvbiAoaCwgcywgdiwgb3V0KVxyXG57XHJcbiAgICBpZiAocyA9PT0gdW5kZWZpbmVkKSB7IHMgPSAxOyB9XHJcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7IHYgPSAxOyB9XHJcblxyXG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKGggKiA2KTtcclxuICAgIHZhciBmID0gaCAqIDYgLSBpO1xyXG5cclxuICAgIHZhciBwID0gTWF0aC5mbG9vcigodiAqICgxIC0gcykpICogMjU1KTtcclxuICAgIHZhciBxID0gTWF0aC5mbG9vcigodiAqICgxIC0gZiAqIHMpKSAqIDI1NSk7XHJcbiAgICB2YXIgdCA9IE1hdGguZmxvb3IoKHYgKiAoMSAtICgxIC0gZikgKiBzKSkgKiAyNTUpO1xyXG5cclxuICAgIHYgPSBNYXRoLmZsb29yKHYgKj0gMjU1KTtcclxuXHJcbiAgICB2YXIgciA9IHY7XHJcbiAgICB2YXIgZyA9IHY7XHJcbiAgICB2YXIgYiA9IHY7XHJcblxyXG4gICAgdmFyIGMgPSBpICUgNjtcclxuXHJcbiAgICBpZiAoYyA9PT0gMClcclxuICAgIHtcclxuICAgICAgICBnID0gdDtcclxuICAgICAgICBiID0gcDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGMgPT09IDEpXHJcbiAgICB7XHJcbiAgICAgICAgciA9IHE7XHJcbiAgICAgICAgYiA9IHA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjID09PSAyKVxyXG4gICAge1xyXG4gICAgICAgIHIgPSBwO1xyXG4gICAgICAgIGIgPSB0O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYyA9PT0gMylcclxuICAgIHtcclxuICAgICAgICByID0gcDtcclxuICAgICAgICBnID0gcTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGMgPT09IDQpXHJcbiAgICB7XHJcbiAgICAgICAgciA9IHQ7XHJcbiAgICAgICAgZyA9IHA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjID09PSA1KVxyXG4gICAge1xyXG4gICAgICAgIGcgPSBwO1xyXG4gICAgICAgIGIgPSBxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb3V0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB7IHI6IHIsIGc6IGcsIGI6IGIsIGNvbG9yOiBHZXRDb2xvcihyLCBnLCBiKSB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAob3V0LnNldFRvKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBvdXQuc2V0VG8ociwgZywgYiwgb3V0LmFscGhhLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnIgPSByO1xyXG4gICAgICAgIG91dC5nID0gZztcclxuICAgICAgICBvdXQuYiA9IGI7XHJcbiAgICAgICAgb3V0LmNvbG9yID0gR2V0Q29sb3IociwgZywgYik7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEhTVlRvUkdCO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb2xvciA9IHJlcXVpcmUoJy4vQ29sb3InKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgaW50byBhIFBoYXNlciBDb2xvciBvYmplY3QuXHJcbiAqIFxyXG4gKiBUaGUgaGV4IHN0cmluZyBjYW4gc3VwcGxpZWQgYXMgYCcjMDAzM2ZmJ2Agb3IgdGhlIHNob3J0LWhhbmQgZm9ybWF0IG9mIGAnIzAzZidgOyBpdCBjYW4gYmVnaW4gd2l0aCBhbiBvcHRpb25hbCBcIiNcIiBvciBcIjB4XCIsIG9yIGJlIHVucHJlZml4ZWQuXHJcbiAqXHJcbiAqIEFuIGFscGhhIGNoYW5uZWwgaXMgX25vdF8gc3VwcG9ydGVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ29sb3IuSGV4U3RyaW5nVG9Db2xvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGhleCAtIFRoZSBoZXggY29sb3IgdmFsdWUgdG8gY29udmVydCwgc3VjaCBhcyBgIzAwMzNmZmAgb3IgdGhlIHNob3J0LWhhbmQgZm9ybWF0OiBgIzAzZmAuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBIENvbG9yIG9iamVjdCBwb3B1bGF0ZWQgYnkgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKi9cclxudmFyIEhleFN0cmluZ1RvQ29sb3IgPSBmdW5jdGlvbiAoaGV4KVxyXG57XHJcbiAgICB2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcbiAgICAvLyBFeHBhbmQgc2hvcnRoYW5kIGZvcm0gKGUuZy4gXCIwM0ZcIikgdG8gZnVsbCBmb3JtIChlLmcuIFwiMDAzM0ZGXCIpXHJcbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXig/OiN8MHgpPyhbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKSQvaSwgZnVuY3Rpb24gKG0sIHIsIGcsIGIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSAoL14oPzojfDB4KT8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kpLmV4ZWMoaGV4KTtcclxuXHJcbiAgICBpZiAocmVzdWx0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxNik7XHJcbiAgICAgICAgdmFyIGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcclxuICAgICAgICB2YXIgYiA9IHBhcnNlSW50KHJlc3VsdFszXSwgMTYpO1xyXG5cclxuICAgICAgICBjb2xvci5zZXRUbyhyLCBnLCBiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sb3I7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEhleFN0cmluZ1RvQ29sb3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgaHVlIHRvIGFuIFJHQiBjb2xvci5cclxuICogQmFzZWQgb24gY29kZSBieSBNaWNoYWVsIEphY2tzb24gKGh0dHBzOi8vZ2l0aHViLmNvbS9tamlqYWNrc29uKVxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ29sb3IuSHVlVG9Db21wb25lbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBxXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0XHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbWJpbmVkIGNvbG9yIHZhbHVlLlxyXG4gKi9cclxudmFyIEh1ZVRvQ29tcG9uZW50ID0gZnVuY3Rpb24gKHAsIHEsIHQpXHJcbntcclxuICAgIGlmICh0IDwgMClcclxuICAgIHtcclxuICAgICAgICB0ICs9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHQgPiAxKVxyXG4gICAge1xyXG4gICAgICAgIHQgLT0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodCA8IDEgLyA2KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0IDwgMSAvIDIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHQgPCAyIC8gMylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHA7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEh1ZVRvQ29tcG9uZW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb2xvciA9IHJlcXVpcmUoJy4vQ29sb3InKTtcclxudmFyIEludGVnZXJUb1JHQiA9IHJlcXVpcmUoJy4vSW50ZWdlclRvUkdCJyk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIGdpdmVuIGNvbG9yIHZhbHVlIGludG8gYW4gaW5zdGFuY2Ugb2YgYSBDb2xvciBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5JbnRlZ2VyVG9Db2xvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBpbnB1dCAtIFRoZSBjb2xvciB2YWx1ZSB0byBjb252ZXJ0IGludG8gYSBDb2xvciBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBIENvbG9yIG9iamVjdC5cclxuICovXHJcbnZhciBJbnRlZ2VyVG9Db2xvciA9IGZ1bmN0aW9uIChpbnB1dClcclxue1xyXG4gICAgdmFyIHJnYiA9IEludGVnZXJUb1JHQihpbnB1dCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBDb2xvcihyZ2IuciwgcmdiLmcsIHJnYi5iLCByZ2IuYSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXJUb0NvbG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIGNvbXBvbmVudCBwYXJ0cyBvZiBhIGNvbG9yIGFzIGFuIE9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGFscGhhLCByZWQsIGdyZWVuLCBibHVlLlxyXG4gKlxyXG4gKiBBbHBoYSB3aWxsIG9ubHkgYmUgc2V0IGlmIGl0IGV4aXN0cyBpbiB0aGUgZ2l2ZW4gY29sb3IgKDB4QUFSUkdHQkIpXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5JbnRlZ2VyVG9SR0JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5wdXQgLSBUaGUgY29sb3IgdmFsdWUgdG8gY29udmVydCBpbnRvIGEgQ29sb3Igb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuRGlzcGxheS5Db2xvck9iamVjdH0gQW4gb2JqZWN0IHdpdGggdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzIHNldCBpbiB0aGUgciwgZyBhbmQgYiBwcm9wZXJ0aWVzLlxyXG4gKi9cclxudmFyIEludGVnZXJUb1JHQiA9IGZ1bmN0aW9uIChjb2xvcilcclxue1xyXG4gICAgaWYgKGNvbG9yID4gMTY3NzcyMTUpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFRoZSBjb2xvciB2YWx1ZSBoYXMgYW4gYWxwaGEgY29tcG9uZW50XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYTogY29sb3IgPj4+IDI0LFxyXG4gICAgICAgICAgICByOiBjb2xvciA+PiAxNiAmIDB4RkYsXHJcbiAgICAgICAgICAgIGc6IGNvbG9yID4+IDggJiAweEZGLFxyXG4gICAgICAgICAgICBiOiBjb2xvciAmIDB4RkZcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGE6IDI1NSxcclxuICAgICAgICAgICAgcjogY29sb3IgPj4gMTYgJiAweEZGLFxyXG4gICAgICAgICAgICBnOiBjb2xvciA+PiA4ICYgMHhGRixcclxuICAgICAgICAgICAgYjogY29sb3IgJiAweEZGXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW50ZWdlclRvUkdCO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBMaW5lYXIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0xpbmVhcicpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkRpc3BsYXkuQ29sb3IuSW50ZXJwb2xhdGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5EaXNwbGF5LkNvbG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBJbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGNvbG9yIHJhbmdlcyBvdmVyIHRoZSBsZW5ndGggc3VwcGxpZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5JbnRlcnBvbGF0ZS5SR0JXaXRoUkdCXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuRGlzcGxheS5Db2xvci5JbnRlcnBvbGF0ZVxyXG4gKiBAc3RhdGljXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcjEgLSBSZWQgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBnMSAtIEJsdWUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiMSAtIEdyZWVuIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcjIgLSBSZWQgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBnMiAtIEJsdWUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiMiAtIEdyZWVuIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xMDBdIC0gRGlzdGFuY2UgdG8gaW50ZXJwb2xhdGUgb3Zlci5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXSAtIEluZGV4IHRvIHN0YXJ0IGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5EaXNwbGF5LkNvbG9yT2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW50ZXJwb2xhdGVkIGNvbG9yIHZhbHVlcy5cclxuICovXHJcbnZhciBSR0JXaXRoUkdCID0gZnVuY3Rpb24gKHIxLCBnMSwgYjEsIHIyLCBnMiwgYjIsIGxlbmd0aCwgaW5kZXgpXHJcbntcclxuICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkgeyBsZW5ndGggPSAxMDA7IH1cclxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7IGluZGV4ID0gMDsgfVxyXG5cclxuICAgIHZhciB0ID0gaW5kZXggLyBsZW5ndGg7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByOiBMaW5lYXIocjEsIHIyLCB0KSxcclxuICAgICAgICBnOiBMaW5lYXIoZzEsIGcyLCB0KSxcclxuICAgICAgICBiOiBMaW5lYXIoYjEsIGIyLCB0KVxyXG4gICAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBJbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGNvbG9yIG9iamVjdHMgb3ZlciB0aGUgbGVuZ3RoIHN1cHBsaWVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ29sb3IuSW50ZXJwb2xhdGUuQ29sb3JXaXRoQ29sb3JcclxuICogQG1lbWJlcm9mIFBoYXNlci5EaXNwbGF5LkNvbG9yLkludGVycG9sYXRlXHJcbiAqIEBzdGF0aWNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IGNvbG9yMSAtIFRoZSBmaXJzdCBDb2xvciBvYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IGNvbG9yMiAtIFRoZSBzZWNvbmQgQ29sb3Igb2JqZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xMDBdIC0gRGlzdGFuY2UgdG8gaW50ZXJwb2xhdGUgb3Zlci5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXSAtIEluZGV4IHRvIHN0YXJ0IGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5EaXNwbGF5LkNvbG9yT2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgaW50ZXJwb2xhdGVkIGNvbG9yIHZhbHVlcy5cclxuICovXHJcbnZhciBDb2xvcldpdGhDb2xvciA9IGZ1bmN0aW9uIChjb2xvcjEsIGNvbG9yMiwgbGVuZ3RoLCBpbmRleClcclxue1xyXG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7IGxlbmd0aCA9IDEwMDsgfVxyXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHsgaW5kZXggPSAwOyB9XHJcblxyXG4gICAgcmV0dXJuIFJHQldpdGhSR0IoY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiwgY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiwgbGVuZ3RoLCBpbmRleCk7XHJcbn07XHJcblxyXG4vKipcclxuICogSW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIENvbG9yIG9iamVjdCBhbmQgY29sb3IgdmFsdWVzIG92ZXIgdGhlIGxlbmd0aCBzdXBwbGllZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLkludGVycG9sYXRlLkNvbG9yV2l0aFJHQlxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkRpc3BsYXkuQ29sb3IuSW50ZXJwb2xhdGVcclxuICogQHN0YXRpY1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gY29sb3IxIC0gVGhlIGZpcnN0IENvbG9yIG9iamVjdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHIgLSBSZWQgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gQmx1ZSB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBHcmVlbiB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MTAwXSAtIERpc3RhbmNlIHRvIGludGVycG9sYXRlIG92ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5kZXg9MF0gLSBJbmRleCB0byBzdGFydCBmcm9tLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuRGlzcGxheS5Db2xvck9iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGludGVycG9sYXRlZCBjb2xvciB2YWx1ZXMuXHJcbiAqL1xyXG52YXIgQ29sb3JXaXRoUkdCID0gZnVuY3Rpb24gKGNvbG9yLCByLCBnLCBiLCBsZW5ndGgsIGluZGV4KVxyXG57XHJcbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsgbGVuZ3RoID0gMTAwOyB9XHJcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgeyBpbmRleCA9IDA7IH1cclxuXHJcbiAgICByZXR1cm4gUkdCV2l0aFJHQihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCByLCBnLCBiLCBsZW5ndGgsIGluZGV4KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFJHQldpdGhSR0I6IFJHQldpdGhSR0IsXHJcbiAgICBDb2xvcldpdGhSR0I6IENvbG9yV2l0aFJHQixcclxuICAgIENvbG9yV2l0aENvbG9yOiBDb2xvcldpdGhDb2xvclxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29sb3IgPSByZXF1aXJlKCcuL0NvbG9yJyk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYHJgLCBgZ2AsIGBiYCBhbmQgYGFgIHByb3BlcnRpZXMgaW50byBhIENvbG9yIGNsYXNzIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRpc3BsYXkuQ29sb3IuT2JqZWN0VG9Db2xvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuRGlzcGxheS5JbnB1dENvbG9yT2JqZWN0fSBpbnB1dCAtIEFuIG9iamVjdCBjb250YWluaW5nIGByYCwgYGdgLCBgYmAgYW5kIGBhYCBwcm9wZXJ0aWVzIGluIHRoZSByYW5nZSAwIHRvIDI1NS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IEEgQ29sb3Igb2JqZWN0LlxyXG4gKi9cclxudmFyIE9iamVjdFRvQ29sb3IgPSBmdW5jdGlvbiAoaW5wdXQpXHJcbntcclxuICAgIHJldHVybiBuZXcgQ29sb3IoaW5wdXQuciwgaW5wdXQuZywgaW5wdXQuYiwgaW5wdXQuYSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdFRvQ29sb3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENvbG9yID0gcmVxdWlyZSgnLi9Db2xvcicpO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGEgQ1NTICd3ZWInIHN0cmluZyBpbnRvIGEgUGhhc2VyIENvbG9yIG9iamVjdC5cclxuICogXHJcbiAqIFRoZSB3ZWIgc3RyaW5nIGNhbiBiZSBpbiB0aGUgZm9ybWF0IGAncmdiKHIsZyxiKSdgIG9yIGAncmdiYShyLGcsYixhKSdgIHdoZXJlIHIvZy9iIGFyZSBpbiB0aGUgcmFuZ2UgWzAuLjI1NV0gYW5kIGEgaXMgaW4gdGhlIHJhbmdlIFswLi4xXS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLlJHQlN0cmluZ1RvQ29sb3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSByZ2IgLSBUaGUgQ1NTIGZvcm1hdCBjb2xvciBzdHJpbmcsIHVzaW5nIHRoZSBgcmdiYCBvciBgcmdiYWAgZm9ybWF0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gQSBDb2xvciBvYmplY3QuXHJcbiAqL1xyXG52YXIgUkdCU3RyaW5nVG9Db2xvciA9IGZ1bmN0aW9uIChyZ2IpXHJcbntcclxuICAgIHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSAoL15yZ2JhP1xcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqKD86LFxccyooXFxkKyg/OlxcLlxcZCspPykpP1xccypcXCkkLykuZXhlYyhyZ2IudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgaWYgKHJlc3VsdClcclxuICAgIHtcclxuICAgICAgICB2YXIgciA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApO1xyXG4gICAgICAgIHZhciBnID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxMCk7XHJcbiAgICAgICAgdmFyIGIgPSBwYXJzZUludChyZXN1bHRbM10sIDEwKTtcclxuICAgICAgICB2YXIgYSA9IChyZXN1bHRbNF0gIT09IHVuZGVmaW5lZCkgPyBwYXJzZUZsb2F0KHJlc3VsdFs0XSkgOiAxO1xyXG5cclxuICAgICAgICBjb2xvci5zZXRUbyhyLCBnLCBiLCBhICogMjU1KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sb3I7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJHQlN0cmluZ1RvQ29sb3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU1YgKGh1ZSwgc2F0dXJhdGlvbiBhbmQgdmFsdWUpLlxyXG4gKiBDb252ZXJzaW9uIGZvcm11bGEgZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hTTF9jb2xvcl9zcGFjZS5cclxuICogQXNzdW1lcyBSR0IgdmFsdWVzIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XSBhbmQgcmV0dXJucyBoLCBzIGFuZCB2IGluIHRoZSBzZXQgWzAsIDFdLlxyXG4gKiBCYXNlZCBvbiBjb2RlIGJ5IE1pY2hhZWwgSmFja3NvbiAoaHR0cHM6Ly9naXRodWIuY29tL21qaWphY2tzb24pXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5SR0JUb0hTVlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSByIC0gVGhlIHJlZCBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZyAtIFRoZSBncmVlbiBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYiAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLkRpc3BsYXkuSFNWQ29sb3JPYmplY3R8UGhhc2VyLkRpc3BsYXkuQ29sb3IpfSBbb3V0XSAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgY29sb3IgdmFsdWVzIGluLiBJZiBub3QgZ2l2ZW4gYW4gSFNWIENvbG9yIE9iamVjdCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuVHlwZXMuRGlzcGxheS5IU1ZDb2xvck9iamVjdHxQaGFzZXIuRGlzcGxheS5Db2xvcil9IEFuIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBoYCwgYHNgIGFuZCBgdmAgc2V0LlxyXG4gKi9cclxudmFyIFJHQlRvSFNWID0gZnVuY3Rpb24gKHIsIGcsIGIsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IHsgaDogMCwgczogMCwgdjogMCB9OyB9XHJcblxyXG4gICAgciAvPSAyNTU7XHJcbiAgICBnIC89IDI1NTtcclxuICAgIGIgLz0gMjU1O1xyXG5cclxuICAgIHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcclxuICAgIHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcclxuICAgIHZhciBkID0gbWF4IC0gbWluO1xyXG5cclxuICAgIC8vIGFjaHJvbWF0aWMgYnkgZGVmYXVsdFxyXG4gICAgdmFyIGggPSAwO1xyXG4gICAgdmFyIHMgPSAobWF4ID09PSAwKSA/IDAgOiBkIC8gbWF4O1xyXG4gICAgdmFyIHYgPSBtYXg7XHJcblxyXG4gICAgaWYgKG1heCAhPT0gbWluKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChtYXggPT09IHIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoKGcgPCBiKSA/IDYgOiAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobWF4ID09PSBnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaCA9IChiIC0gcikgLyBkICsgMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobWF4ID09PSBiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGggLz0gNjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3V0Lmhhc093blByb3BlcnR5KCdfaCcpKVxyXG4gICAge1xyXG4gICAgICAgIG91dC5faCA9IGg7XHJcbiAgICAgICAgb3V0Ll9zID0gcztcclxuICAgICAgICBvdXQuX3YgPSB2O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIG91dC5oID0gaDtcclxuICAgICAgICBvdXQucyA9IHM7XHJcbiAgICAgICAgb3V0LnYgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJHQlRvSFNWO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb21wb25lbnRUb0hleCA9IHJlcXVpcmUoJy4vQ29tcG9uZW50VG9IZXgnKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgY29sb3IgdmFsdWVzIGludG8gYW4gSFRNTCBjb21wYXRpYmxlIGNvbG9yIHN0cmluZywgcHJlZml4ZWQgd2l0aCBlaXRoZXIgYCNgIG9yIGAweGAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5SR0JUb1N0cmluZ1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSByIC0gVGhlIHJlZCBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZyAtIFRoZSBncmVlbiBjb2xvciB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYiAtIFRoZSBibHVlIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbYT0yNTVdIC0gVGhlIGFscGhhIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9I10gLSBUaGUgcHJlZml4IG9mIHRoZSBzdHJpbmcuIEVpdGhlciBgI2Agb3IgYDB4YC5cclxuICpcclxuICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZy1iYXNlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sb3IgdmFsdWVzLlxyXG4gKi9cclxudmFyIFJHQlRvU3RyaW5nID0gZnVuY3Rpb24gKHIsIGcsIGIsIGEsIHByZWZpeClcclxue1xyXG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCkgeyBhID0gMjU1OyB9XHJcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHsgcHJlZml4ID0gJyMnOyB9XHJcblxyXG4gICAgaWYgKHByZWZpeCA9PT0gJyMnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAnIycgKyAoKDEgPDwgMjQpICsgKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiKS50b1N0cmluZygxNikuc2xpY2UoMSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICcweCcgKyBDb21wb25lbnRUb0hleChhKSArIENvbXBvbmVudFRvSGV4KHIpICsgQ29tcG9uZW50VG9IZXgoZykgKyBDb21wb25lbnRUb0hleChiKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUkdCVG9TdHJpbmc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJldHdlZW4gPSByZXF1aXJlKCcuLi8uLi9tYXRoL0JldHdlZW4nKTtcclxudmFyIENvbG9yID0gcmVxdWlyZSgnLi9Db2xvcicpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQ29sb3Igb2JqZWN0IHdoZXJlIHRoZSByLCBnLCBhbmQgYiB2YWx1ZXMgaGF2ZSBiZWVuIHNldCB0byByYW5kb20gdmFsdWVzXHJcbiAqIGJhc2VkIG9uIHRoZSBnaXZlbiBtaW4gbWF4IHZhbHVlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5EaXNwbGF5LkNvbG9yLlJhbmRvbVJHQlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbbWluPTBdIC0gVGhlIG1pbmltdW0gdmFsdWUgdG8gc2V0IHRoZSByYW5kb20gcmFuZ2UgZnJvbSAoYmV0d2VlbiAwIGFuZCAyNTUpXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW21heD0yNTVdIC0gVGhlIG1heGltdW0gdmFsdWUgdG8gc2V0IHRoZSByYW5kb20gcmFuZ2UgZnJvbSAoYmV0d2VlbiAwIGFuZCAyNTUpXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBIENvbG9yIG9iamVjdC5cclxuICovXHJcbnZhciBSYW5kb21SR0IgPSBmdW5jdGlvbiAobWluLCBtYXgpXHJcbntcclxuICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCkgeyBtaW4gPSAwOyB9XHJcbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQpIHsgbWF4ID0gMjU1OyB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBDb2xvcihCZXR3ZWVuKG1pbiwgbWF4KSwgQmV0d2VlbihtaW4sIG1heCksIEJldHdlZW4obWluLCBtYXgpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tUkdCO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBIZXhTdHJpbmdUb0NvbG9yID0gcmVxdWlyZSgnLi9IZXhTdHJpbmdUb0NvbG9yJyk7XHJcbnZhciBJbnRlZ2VyVG9Db2xvciA9IHJlcXVpcmUoJy4vSW50ZWdlclRvQ29sb3InKTtcclxudmFyIE9iamVjdFRvQ29sb3IgPSByZXF1aXJlKCcuL09iamVjdFRvQ29sb3InKTtcclxudmFyIFJHQlN0cmluZ1RvQ29sb3IgPSByZXF1aXJlKCcuL1JHQlN0cmluZ1RvQ29sb3InKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc291cmNlIGNvbG9yIHZhbHVlIGludG8gYW4gaW5zdGFuY2Ugb2YgYSBDb2xvciBjbGFzcy5cclxuICogVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcsIHByZWZpeGVkIHdpdGggYHJnYmAgb3IgYSBoZXggc3RyaW5nLCBhIG51bWJlciBvciBhbiBPYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRGlzcGxheS5Db2xvci5WYWx1ZVRvQ29sb3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8UGhhc2VyLlR5cGVzLkRpc3BsYXkuSW5wdXRDb2xvck9iamVjdCl9IGlucHV0IC0gVGhlIHNvdXJjZSBjb2xvciB2YWx1ZSB0byBjb252ZXJ0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5Db2xvcn0gQSBDb2xvciBvYmplY3QuXHJcbiAqL1xyXG52YXIgVmFsdWVUb0NvbG9yID0gZnVuY3Rpb24gKGlucHV0KVxyXG57XHJcbiAgICB2YXIgdCA9IHR5cGVvZiBpbnB1dDtcclxuXHJcbiAgICBzd2l0Y2ggKHQpXHJcbiAgICB7XHJcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcclxuXHJcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIoMCwgMykudG9Mb3dlckNhc2UoKSA9PT0gJ3JnYicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSR0JTdHJpbmdUb0NvbG9yKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBIZXhTdHJpbmdUb0NvbG9yKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlICdudW1iZXInOlxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIEludGVnZXJUb0NvbG9yKGlucHV0KTtcclxuXHJcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3RUb0NvbG9yKGlucHV0KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVmFsdWVUb0NvbG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb2xvciA9IHJlcXVpcmUoJy4vQ29sb3InKTtcclxuXHJcbkNvbG9yLkNvbG9yVG9SR0JBID0gcmVxdWlyZSgnLi9Db2xvclRvUkdCQScpO1xyXG5Db2xvci5Db21wb25lbnRUb0hleCA9IHJlcXVpcmUoJy4vQ29tcG9uZW50VG9IZXgnKTtcclxuQ29sb3IuR2V0Q29sb3IgPSByZXF1aXJlKCcuL0dldENvbG9yJyk7XHJcbkNvbG9yLkdldENvbG9yMzIgPSByZXF1aXJlKCcuL0dldENvbG9yMzInKTtcclxuQ29sb3IuSGV4U3RyaW5nVG9Db2xvciA9IHJlcXVpcmUoJy4vSGV4U3RyaW5nVG9Db2xvcicpO1xyXG5Db2xvci5IU0xUb0NvbG9yID0gcmVxdWlyZSgnLi9IU0xUb0NvbG9yJyk7XHJcbkNvbG9yLkhTVkNvbG9yV2hlZWwgPSByZXF1aXJlKCcuL0hTVkNvbG9yV2hlZWwnKTtcclxuQ29sb3IuSFNWVG9SR0IgPSByZXF1aXJlKCcuL0hTVlRvUkdCJyk7XHJcbkNvbG9yLkh1ZVRvQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9IdWVUb0NvbXBvbmVudCcpO1xyXG5Db2xvci5JbnRlZ2VyVG9Db2xvciA9IHJlcXVpcmUoJy4vSW50ZWdlclRvQ29sb3InKTtcclxuQ29sb3IuSW50ZWdlclRvUkdCID0gcmVxdWlyZSgnLi9JbnRlZ2VyVG9SR0InKTtcclxuQ29sb3IuSW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuL0ludGVycG9sYXRlJyk7XHJcbkNvbG9yLk9iamVjdFRvQ29sb3IgPSByZXF1aXJlKCcuL09iamVjdFRvQ29sb3InKTtcclxuQ29sb3IuUmFuZG9tUkdCID0gcmVxdWlyZSgnLi9SYW5kb21SR0InKTtcclxuQ29sb3IuUkdCU3RyaW5nVG9Db2xvciA9IHJlcXVpcmUoJy4vUkdCU3RyaW5nVG9Db2xvcicpO1xyXG5Db2xvci5SR0JUb0hTViA9IHJlcXVpcmUoJy4vUkdCVG9IU1YnKTtcclxuQ29sb3IuUkdCVG9TdHJpbmcgPSByZXF1aXJlKCcuL1JHQlRvU3RyaW5nJyk7XHJcbkNvbG9yLlZhbHVlVG9Db2xvciA9IHJlcXVpcmUoJy4vVmFsdWVUb0NvbG9yJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5EaXNwbGF5XHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQWxpZ246IHJlcXVpcmUoJy4vYWxpZ24nKSxcclxuICAgIEJhc2VTaGFkZXI6IHJlcXVpcmUoJy4vc2hhZGVyL0Jhc2VTaGFkZXInKSxcclxuICAgIEJvdW5kczogcmVxdWlyZSgnLi9ib3VuZHMnKSxcclxuICAgIENhbnZhczogcmVxdWlyZSgnLi9jYW52YXMnKSxcclxuICAgIENvbG9yOiByZXF1aXJlKCcuL2NvbG9yJyksXHJcbiAgICBNYXNrczogcmVxdWlyZSgnLi9tYXNrJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBCaXRtYXAgTWFzayBjb21iaW5lcyB0aGUgYWxwaGEgKG9wYWNpdHkpIG9mIGEgbWFza2VkIHBpeGVsIHdpdGggdGhlIGFscGhhIG9mIGFub3RoZXIgcGl4ZWwuXHJcbiAqIFVubGlrZSB0aGUgR2VvbWV0cnkgTWFzaywgd2hpY2ggaXMgYSBjbGlwcGluZyBwYXRoLCBhIEJpdG1hcCBNYXNrIGJlaGF2ZXMgbGlrZSBhbiBhbHBoYSBtYXNrLFxyXG4gKiBub3QgYSBjbGlwcGluZyBwYXRoLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHVzaW5nIHRoZSBXZWJHTCBSZW5kZXJlci5cclxuICpcclxuICogQSBCaXRtYXAgTWFzayBjYW4gdXNlIGFueSBHYW1lIE9iamVjdCB0byBkZXRlcm1pbmUgdGhlIGFscGhhIG9mIGVhY2ggcGl4ZWwgb2YgdGhlIG1hc2tlZCBHYW1lIE9iamVjdChzKS5cclxuICogRm9yIGFueSBnaXZlbiBwb2ludCBvZiBhIG1hc2tlZCBHYW1lIE9iamVjdCdzIHRleHR1cmUsIHRoZSBwaXhlbCdzIGFscGhhIHdpbGwgYmUgbXVsdGlwbGllZCBieSB0aGUgYWxwaGFcclxuICogb2YgdGhlIHBpeGVsIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBCaXRtYXAgTWFzaydzIEdhbWUgT2JqZWN0LiBUaGUgY29sb3Igb2YgdGhlIHBpeGVsIGZyb20gdGhlXHJcbiAqIEJpdG1hcCBNYXNrIGRvZXNuJ3QgbWF0dGVyLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgaWYgYSBwdXJlIGJsdWUgcGl4ZWwgd2l0aCBhbiBhbHBoYSBvZiAwLjk1IGlzIG1hc2tlZCB3aXRoIGEgcHVyZSByZWQgcGl4ZWwgd2l0aCBhblxyXG4gKiBhbHBoYSBvZiAwLjUsIHRoZSByZXN1bHRpbmcgcGl4ZWwgd2lsbCBiZSBwdXJlIGJsdWUgd2l0aCBhbiBhbHBoYSBvZiAwLjQ3NS4gTmF0dXJhbGx5LCB0aGlzIG1lYW5zXHJcbiAqIHRoYXQgYSBwaXhlbCBpbiB0aGUgbWFzayB3aXRoIGFuIGFscGhhIG9mIDAgd2lsbCBoaWRlIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVsIGluIGFsbCBtYXNrZWQgR2FtZSBPYmplY3RzXHJcbiAqICBBIHBpeGVsIHdpdGggYW4gYWxwaGEgb2YgMSBpbiB0aGUgbWFza2VkIEdhbWUgT2JqZWN0IHdpbGwgcmVjZWl2ZSB0aGUgc2FtZSBhbHBoYSBhcyB0aGVcclxuICogY29ycmVzcG9uZGluZyBwaXhlbCBpbiB0aGUgbWFzay5cclxuICpcclxuICogVGhlIEJpdG1hcCBNYXNrJ3MgbG9jYXRpb24gbWF0Y2hlcyB0aGUgbG9jYXRpb24gb2YgaXRzIEdhbWUgT2JqZWN0LCBub3QgdGhlIGxvY2F0aW9uIG9mIHRoZVxyXG4gKiBtYXNrZWQgb2JqZWN0cy4gTW92aW5nIG9yIHRyYW5zZm9ybWluZyB0aGUgdW5kZXJseWluZyBHYW1lIE9iamVjdCB3aWxsIGNoYW5nZSB0aGUgbWFza1xyXG4gKiAoYW5kIGFmZmVjdCB0aGUgdmlzaWJpbGl0eSBvZiBhbnkgbWFza2VkIG9iamVjdHMpLCB3aGVyZWFzIG1vdmluZyBvciB0cmFuc2Zvcm1pbmcgYSBtYXNrZWQgb2JqZWN0XHJcbiAqIHdpbGwgbm90IGFmZmVjdCB0aGUgbWFzay5cclxuICpcclxuICogVGhlIEJpdG1hcCBNYXNrIHdpbGwgbm90IHJlbmRlciBpdHMgR2FtZSBPYmplY3QgYnkgaXRzZWxmLiBJZiB0aGUgR2FtZSBPYmplY3QgaXMgbm90IGluIGFcclxuICogU2NlbmUncyBkaXNwbGF5IGxpc3QsIGl0IHdpbGwgb25seSBiZSB1c2VkIGZvciB0aGUgbWFzayBhbmQgaXRzIGZ1bGwgdGV4dHVyZSB3aWxsIG5vdCBiZSBkaXJlY3RseVxyXG4gKiB2aXNpYmxlLiBBZGRpbmcgdGhlIHVuZGVybHlpbmcgR2FtZSBPYmplY3QgdG8gYSBTY2VuZSB3aWxsIG5vdCBjYXVzZSBhbnkgcHJvYmxlbXMgLSBpdCB3aWxsXHJcbiAqIHJlbmRlciBhcyBhIG5vcm1hbCBHYW1lIE9iamVjdCBhbmQgd2lsbCBhbHNvIHNlcnZlIGFzIGEgbWFzay5cclxuICpcclxuICogQGNsYXNzIEJpdG1hcE1hc2tcclxuICogQG1lbWJlcm9mIFBoYXNlci5EaXNwbGF5Lk1hc2tzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHdoaWNoIHRoaXMgQml0bWFwIE1hc2sgd2lsbCBiZSB1c2VkIGluLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSByZW5kZXJhYmxlIC0gQSByZW5kZXJhYmxlIEdhbWUgT2JqZWN0IHRoYXQgdXNlcyBhIHRleHR1cmUsIHN1Y2ggYXMgYSBTcHJpdGUuXHJcbiAqL1xyXG52YXIgQml0bWFwTWFzayA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBCaXRtYXBNYXNrIChzY2VuZSwgcmVuZGVyYWJsZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSBzY2VuZS5zeXMuZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gZWl0aGVyIHRoZSBDYW52YXMgb3IgV2ViR0wgUmVuZGVyZXIgdGhhdCB0aGlzIE1hc2sgaXMgdXNpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlbmRlcmFibGUgR2FtZSBPYmplY3QgdGhhdCB1c2VzIGEgdGV4dHVyZSwgc3VjaCBhcyBhIFNwcml0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkJpdG1hcE1hc2sjYml0bWFwTWFza1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJpdG1hcE1hc2sgPSByZW5kZXJhYmxlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dHVyZSB1c2VkIGZvciB0aGUgbWFzaydzIGZyYW1lYnVmZmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuTWFza3MuQml0bWFwTWFzayNtYXNrVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFza1RleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dHVyZSB1c2VkIGZvciB0aGUgbWFpbiBmcmFtZWJ1ZmZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkJpdG1hcE1hc2sjbWFpblRleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xUZXh0dXJlfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1haW5UZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgQml0bWFwIE1hc2sgaXMgZGlydHkgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI2RpcnR5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZnJhbWVidWZmZXIgdG8gd2hpY2ggYSBtYXNrZWQgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI21haW5GcmFtZWJ1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTEZyYW1lYnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFpbkZyYW1lYnVmZmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZyYW1lYnVmZmVyIHRvIHdoaWNoIHRoZSBCaXRtYXAgTWFzaydzIG1hc2tpbmcgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI21hc2tGcmFtZWJ1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTEZyYW1lYnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFza0ZyYW1lYnVmZmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByZXZpb3VzIGZyYW1lYnVmZmVyIHNldCBpbiB0aGUgcmVuZGVyZXIgYmVmb3JlIHRoaXMgb25lIHdhcyBlbmFibGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuTWFza3MuQml0bWFwTWFzayNwcmV2RnJhbWVidWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xGcmFtZWJ1ZmZlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcmV2RnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGludmVydCB0aGUgbWFza3MgYWxwaGEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJZiBgdHJ1ZWAsIHRoZSBhbHBoYSBvZiB0aGUgbWFza2luZyBwaXhlbCB3aWxsIGJlIGludmVydGVkIGJlZm9yZSBpdCdzIG11bHRpcGxpZWQgd2l0aCB0aGUgbWFza2VkIHBpeGVsLiBFc3NlbnRpYWxseSwgdGhpcyBtZWFucyB0aGF0IGEgbWFza2VkIGFyZWEgd2lsbCBiZSB2aXNpYmxlIG9ubHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYXJlYSBpbiB0aGUgbWFzayBpcyBpbnZpc2libGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI2ludmVydEFscGhhXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMS4yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbnZlcnRBbHBoYSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIG1hc2sgYSBzdGVuY2lsIG1hc2s/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI2lzU3RlbmNpbFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzU3RlbmNpbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIuZ2wpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd2lkdGggPSByZW5kZXJlci53aWR0aDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHJlbmRlcmVyLmhlaWdodDtcclxuICAgICAgICAgICAgdmFyIHBvdCA9ICgod2lkdGggJiAod2lkdGggLSAxKSkgPT09IDAgJiYgKGhlaWdodCAmIChoZWlnaHQgLSAxKSkgPT09IDApO1xyXG4gICAgICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcclxuICAgICAgICAgICAgdmFyIHdyYXAgPSBwb3QgPyBnbC5SRVBFQVQgOiBnbC5DTEFNUF9UT19FREdFO1xyXG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gZ2wuTElORUFSO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tYWluVGV4dHVyZSA9IHJlbmRlcmVyLmNyZWF0ZVRleHR1cmUyRCgwLCBmaWx0ZXIsIGZpbHRlciwgd3JhcCwgd3JhcCwgZ2wuUkdCQSwgbnVsbCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMubWFza1RleHR1cmUgPSByZW5kZXJlci5jcmVhdGVUZXh0dXJlMkQoMCwgZmlsdGVyLCBmaWx0ZXIsIHdyYXAsIHdyYXAsIGdsLlJHQkEsIG51bGwsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1haW5GcmFtZWJ1ZmZlciA9IHJlbmRlcmVyLmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHRoaXMubWFpblRleHR1cmUsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tGcmFtZWJ1ZmZlciA9IHJlbmRlcmVyLmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHRoaXMubWFza1RleHR1cmUsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgc2NlbmUuc3lzLmdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuQ09OVEVYVF9SRVNUT1JFRCwgZnVuY3Rpb24gKHJlbmRlcmVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSByZW5kZXJlci53aWR0aDtcclxuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSByZW5kZXJlci5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG90ID0gKCh3aWR0aCAmICh3aWR0aCAtIDEpKSA9PT0gMCAmJiAoaGVpZ2h0ICYgKGhlaWdodCAtIDEpKSA9PT0gMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcclxuICAgICAgICAgICAgICAgIHZhciB3cmFwID0gcG90ID8gZ2wuUkVQRUFUIDogZ2wuQ0xBTVBfVE9fRURHRTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBnbC5MSU5FQVI7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYWluVGV4dHVyZSA9IHJlbmRlcmVyLmNyZWF0ZVRleHR1cmUyRCgwLCBmaWx0ZXIsIGZpbHRlciwgd3JhcCwgd3JhcCwgZ2wuUkdCQSwgbnVsbCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hc2tUZXh0dXJlID0gcmVuZGVyZXIuY3JlYXRlVGV4dHVyZTJEKDAsIGZpbHRlciwgZmlsdGVyLCB3cmFwLCB3cmFwLCBnbC5SR0JBLCBudWxsLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWFpbkZyYW1lYnVmZmVyID0gcmVuZGVyZXIuY3JlYXRlRnJhbWVidWZmZXIod2lkdGgsIGhlaWdodCwgdGhpcy5tYWluVGV4dHVyZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hc2tGcmFtZWJ1ZmZlciA9IHJlbmRlcmVyLmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHRoaXMubWFza1RleHR1cmUsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgfSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBuZXcgbWFza2luZyBHYW1lIE9iamVjdCBmb3IgdGhlIEJpdG1hcCBNYXNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuTWFza3MuQml0bWFwTWFzayNzZXRCaXRtYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHJlbmRlcmFibGUgLSBBIHJlbmRlcmFibGUgR2FtZSBPYmplY3QgdGhhdCB1c2VzIGEgdGV4dHVyZSwgc3VjaCBhcyBhIFNwcml0ZS5cclxuICAgICAqL1xyXG4gICAgc2V0Qml0bWFwOiBmdW5jdGlvbiAocmVuZGVyYWJsZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJpdG1hcE1hc2sgPSByZW5kZXJhYmxlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBhcmVzIHRoZSBXZWJHTCBSZW5kZXJlciB0byByZW5kZXIgYSBHYW1lIE9iamVjdCB3aXRoIHRoaXMgbWFzayBhcHBsaWVkLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcmVuZGVycyB0aGUgbWFza2luZyBHYW1lIE9iamVjdCB0byB0aGUgbWFzayBmcmFtZWJ1ZmZlciBhbmQgc3dpdGNoZXMgdG8gdGhlIG1haW4gZnJhbWVidWZmZXIgc28gdGhhdCB0aGUgbWFza2VkIEdhbWUgT2JqZWN0IHdpbGwgYmUgcmVuZGVyZWQgdG8gaXQgaW5zdGVhZCBvZiBiZWluZyByZW5kZXJlZCBkaXJlY3RseSB0byB0aGUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI3ByZVJlbmRlcldlYkdMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgV2ViR0wgUmVuZGVyZXIgdG8gcHJlcGFyZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG1hc2tlZE9iamVjdCAtIFRoZSBtYXNrZWQgR2FtZSBPYmplY3Qgd2hpY2ggd2lsbCBiZSBkcmF3bi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdG8gcmVuZGVyIHRvLlxyXG4gICAgICovXHJcbiAgICBwcmVSZW5kZXJXZWJHTDogZnVuY3Rpb24gKHJlbmRlcmVyLCBtYXNrZWRPYmplY3QsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZW5kZXJlci5waXBlbGluZXMuQml0bWFwTWFza1BpcGVsaW5lLmJlZ2luTWFzayh0aGlzLCBtYXNrZWRPYmplY3QsIGNhbWVyYSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluYWxpemVzIHJlbmRlcmluZyBvZiBhIG1hc2tlZCBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHJlc2V0cyB0aGUgcHJldmlvdXNseSBib3VuZCBmcmFtZWJ1ZmZlciBhbmQgc3dpdGNoZXMgdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBCaXRtYXAgTWFzayBQaXBlbGluZSwgd2hpY2ggdXNlcyBhIHNwZWNpYWwgZnJhZ21lbnQgc2hhZGVyIHRvIGFwcGx5IHRoZSBtYXNraW5nIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkJpdG1hcE1hc2sjcG9zdFJlbmRlcldlYkdMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgV2ViR0wgUmVuZGVyZXIgdG8gY2xlYW4gdXAuXHJcbiAgICAgKi9cclxuICAgIHBvc3RSZW5kZXJXZWJHTDogZnVuY3Rpb24gKHJlbmRlcmVyLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmVuZGVyZXIucGlwZWxpbmVzLkJpdG1hcE1hc2tQaXBlbGluZS5lbmRNYXNrKHRoaXMsIGNhbWVyYSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBhIE5PT1AgbWV0aG9kLiBCaXRtYXAgTWFza3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENhbnZhcyBSZW5kZXJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkJpdG1hcE1hc2sjcHJlUmVuZGVyQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgQ2FudmFzIFJlbmRlcmVyIHdoaWNoIHdvdWxkIGJlIHJlbmRlcmVkIHRvLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gbWFzayAtIFRoZSBtYXNrZWQgR2FtZSBPYmplY3Qgd2hpY2ggd291bGQgYmUgcmVuZGVyZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIHJlbmRlciB0by5cclxuICAgICAqL1xyXG4gICAgcHJlUmVuZGVyQ2FudmFzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIE5PT1BcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGEgTk9PUCBtZXRob2QuIEJpdG1hcCBNYXNrcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2FudmFzIFJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuTWFza3MuQml0bWFwTWFzayNwb3N0UmVuZGVyQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgQ2FudmFzIFJlbmRlcmVyIHdoaWNoIHdvdWxkIGJlIHJlbmRlcmVkIHRvLlxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyQ2FudmFzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIE5PT1BcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIEJpdG1hcE1hc2sgYW5kIG51bGxzIGFueSByZWZlcmVuY2VzIGl0IGhvbGRzLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgaWYgYSBHYW1lIE9iamVjdCBpcyBjdXJyZW50bHkgdXNpbmcgdGhpcyBtYXNrIGl0IHdpbGwgX25vdF8gYXV0b21hdGljYWxseSBkZXRlY3QgeW91IGhhdmUgZGVzdHJveWVkIGl0LFxyXG4gICAgICogc28gYmUgc3VyZSB0byBjYWxsIGBjbGVhck1hc2tgIG9uIGFueSBHYW1lIE9iamVjdCB1c2luZyBpdCwgYmVmb3JlIGRlc3Ryb3lpbmcgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYml0bWFwTWFzayA9IG51bGw7XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5tYWluVGV4dHVyZSk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5tYXNrVGV4dHVyZSk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMubWFpbkZyYW1lYnVmZmVyKTtcclxuICAgICAgICAgICAgcmVuZGVyZXIuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5tYXNrRnJhbWVidWZmZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYWluVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYXNrVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYWluRnJhbWVidWZmZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubWFza0ZyYW1lYnVmZmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByZXZGcmFtZWJ1ZmZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQml0bWFwTWFzaztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBHZW9tZXRyeSBNYXNrIGNhbiBiZSBhcHBsaWVkIHRvIGEgR2FtZSBPYmplY3QgdG8gaGlkZSBhbnkgcGl4ZWxzIG9mIGl0IHdoaWNoIGRvbid0IGludGVyc2VjdFxyXG4gKiBhIHZpc2libGUgcGl4ZWwgZnJvbSB0aGUgZ2VvbWV0cnkgbWFzay4gVGhlIG1hc2sgaXMgZXNzZW50aWFsbHkgYSBjbGlwcGluZyBwYXRoIHdoaWNoIGNhbiBvbmx5XHJcbiAqIG1ha2UgYSBtYXNrZWQgcGl4ZWwgZnVsbHkgdmlzaWJsZSBvciBmdWxseSBpbnZpc2libGUgd2l0aG91dCBjaGFuZ2luZyBpdHMgYWxwaGEgKG9wYWNpdHkpLlxyXG4gKlxyXG4gKiBBIEdlb21ldHJ5IE1hc2sgdXNlcyBhIEdyYXBoaWNzIEdhbWUgT2JqZWN0IHRvIGRldGVybWluZSB3aGljaCBwaXhlbHMgb2YgdGhlIG1hc2tlZCBHYW1lIE9iamVjdChzKVxyXG4gKiBzaG91bGQgYmUgY2xpcHBlZC4gRm9yIGFueSBnaXZlbiBwb2ludCBvZiBhIG1hc2tlZCBHYW1lIE9iamVjdCdzIHRleHR1cmUsIHRoZSBwaXhlbCB3aWxsIG9ubHkgYmUgZGlzcGxheWVkXHJcbiAqIGlmIHRoZSBHcmFwaGljcyBHYW1lIE9iamVjdCBvZiB0aGUgR2VvbWV0cnkgTWFzayBoYXMgYSB2aXNpYmxlIHBpeGVsIGF0IHRoZSBzYW1lIHBvc2l0aW9uLiBUaGUgY29sb3IgYW5kXHJcbiAqIGFscGhhIG9mIHRoZSBwaXhlbCBmcm9tIHRoZSBHZW9tZXRyeSBNYXNrIGRvIG5vdCBtYXR0ZXIuXHJcbiAqXHJcbiAqIFRoZSBHZW9tZXRyeSBNYXNrJ3MgbG9jYXRpb24gbWF0Y2hlcyB0aGUgbG9jYXRpb24gb2YgaXRzIEdyYXBoaWNzIG9iamVjdCwgbm90IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWFza2VkIG9iamVjdHMuXHJcbiAqIE1vdmluZyBvciB0cmFuc2Zvcm1pbmcgdGhlIHVuZGVybHlpbmcgR3JhcGhpY3Mgb2JqZWN0IHdpbGwgY2hhbmdlIHRoZSBtYXNrIChhbmQgYWZmZWN0IHRoZSB2aXNpYmlsaXR5XHJcbiAqIG9mIGFueSBtYXNrZWQgb2JqZWN0cyksIHdoZXJlYXMgbW92aW5nIG9yIHRyYW5zZm9ybWluZyBhIG1hc2tlZCBvYmplY3Qgd2lsbCBub3QgYWZmZWN0IHRoZSBtYXNrLlxyXG4gKiBZb3UgY2FuIHRoaW5rIG9mIHRoZSBHZW9tZXRyeSBNYXNrIChvciByYXRoZXIsIG9mIGl0cyBHcmFwaGljcyBvYmplY3QpIGFzIGFuIGludmlzaWJsZSBjdXJ0YWluIHBsYWNlZFxyXG4gKiBpbiBmcm9udCBvZiBhbGwgbWFza2VkIG9iamVjdHMgd2hpY2ggaGFzIGl0cyBvd24gdmlzdWFsIHByb3BlcnRpZXMgYW5kLCBuYXR1cmFsbHksIHJlc3BlY3RzIHRoZSBjYW1lcmEnc1xyXG4gKiB2aXN1YWwgcHJvcGVydGllcywgYnV0IGlzbid0IGFmZmVjdGVkIGJ5IGFuZCBkb2Vzbid0IGZvbGxvdyB0aGUgbWFza2VkIG9iamVjdHMgYnkgaXRzZWxmLlxyXG4gKlxyXG4gKiBAY2xhc3MgR2VvbWV0cnlNYXNrXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuRGlzcGxheS5NYXNrc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoaXMgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3NHZW9tZXRyeSAtIFRoZSBHcmFwaGljcyBHYW1lIE9iamVjdCB0byB1c2UgZm9yIHRoZSBHZW9tZXRyeSBNYXNrLiBEb2Vzbid0IGhhdmUgdG8gYmUgaW4gdGhlIERpc3BsYXkgTGlzdC5cclxuICovXHJcbnZhciBHZW9tZXRyeU1hc2sgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR2VvbWV0cnlNYXNrIChzY2VuZSwgZ3JhcGhpY3NHZW9tZXRyeSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgR3JhcGhpY3Mgb2JqZWN0IHdoaWNoIGRlc2NyaWJlcyB0aGUgR2VvbWV0cnkgTWFzay5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkdlb21ldHJ5TWFzayNnZW9tZXRyeU1hc2tcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnlNYXNrID0gZ3JhcGhpY3NHZW9tZXRyeTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2ltaWxhciB0byB0aGUgQml0bWFwTWFza3MgaW52ZXJ0QWxwaGEgc2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCB0aGVuIGhpZGUgYWxsIHBpeGVsc1xyXG4gICAgICAgICAqIGRyYXduIHRvIHRoZSBHZW9tZXRyeSBNYXNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrI2ludmVydEFscGhhXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW52ZXJ0QWxwaGEgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBtYXNrIGEgc3RlbmNpbCBtYXNrP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrI2lzU3RlbmNpbFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzU3RlbmNpbCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IHN0ZW5jaWwgbGV2ZWwuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2sjbGV2ZWxcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxldmVsID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgbmV3IEdyYXBoaWNzIG9iamVjdCBmb3IgdGhlIEdlb21ldHJ5IE1hc2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2sjc2V0U2hhcGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljc0dlb21ldHJ5IC0gVGhlIEdyYXBoaWNzIG9iamVjdCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBHZW9tZXRyeSBNYXNrLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdlb21ldHJ5IE1hc2tcclxuICAgICAqL1xyXG4gICAgc2V0U2hhcGU6IGZ1bmN0aW9uIChncmFwaGljc0dlb21ldHJ5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnlNYXNrID0gZ3JhcGhpY3NHZW9tZXRyeTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYGludmVydEFscGhhYCBwcm9wZXJ0eSBvZiB0aGlzIEdlb21ldHJ5IE1hc2suXHJcbiAgICAgKiBJbnZlcnRpbmcgdGhlIGFscGhhIGVzc2VudGlhbGx5IGZsaXBzIHRoZSB3YXkgdGhlIG1hc2sgd29ya3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2sjc2V0SW52ZXJ0QWxwaGFcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIEludmVydCB0aGUgYWxwaGEgb2YgdGhpcyBtYXNrP1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdlb21ldHJ5IE1hc2tcclxuICAgICAqL1xyXG4gICAgc2V0SW52ZXJ0QWxwaGE6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnZlcnRBbHBoYSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBHZW9tZXRyeSBNYXNrJ3MgdW5kZXJseWluZyBHcmFwaGljcyBvYmplY3QgdG8gdGhlIE9wZW5HTCBzdGVuY2lsIGJ1ZmZlciBhbmQgZW5hYmxlcyB0aGUgc3RlbmNpbCB0ZXN0LCB3aGljaCBjbGlwcyByZW5kZXJlZCBwaXhlbHMgYWNjb3JkaW5nIHRvIHRoZSBtYXNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrI3ByZVJlbmRlcldlYkdMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZSB0byBkcmF3IHRvLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBHYW1lIE9iamVjdCBpcyBiZWluZyByZW5kZXJlZCB0aHJvdWdoLlxyXG4gICAgICovXHJcbiAgICBwcmVSZW5kZXJXZWJHTDogZnVuY3Rpb24gKHJlbmRlcmVyLCBjaGlsZCwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xyXG5cclxuICAgICAgICAvLyAgRm9yY2UgZmx1c2hpbmcgYmVmb3JlIGRyYXdpbmcgdG8gc3RlbmNpbCBidWZmZXJcclxuICAgICAgICByZW5kZXJlci5mbHVzaCgpO1xyXG5cclxuICAgICAgICBpZiAocmVuZGVyZXIubWFza1N0YWNrLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xyXG5cclxuICAgICAgICAgICAgcmVuZGVyZXIubWFza0NvdW50ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlci5jdXJyZW50Q2FtZXJhTWFzay5tYXNrICE9PSB0aGlzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyZXIuY3VycmVudE1hc2subWFzayA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXJlci5tYXNrU3RhY2sucHVzaCh7IG1hc2s6IHRoaXMsIGNhbWVyYTogY2FtZXJhIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5U3RlbmNpbChyZW5kZXJlciwgY2FtZXJhLCB0cnVlKTtcclxuXHJcbiAgICAgICAgcmVuZGVyZXIubWFza0NvdW50Kys7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyB0aGUgY3VycmVudCBzdGVuY2lsIG1hc2sgdG8gdGhlIHJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrI2FwcGx5U3RlbmNpbFxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlIHRvIGRyYXcgdG8uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBHYW1lIE9iamVjdCBpcyBiZWluZyByZW5kZXJlZCB0aHJvdWdoLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmMgLSBJcyB0aGlzIGFuIElOQ1Igc3RlbmNpbCBvciBhIERFQ1Igc3RlbmNpbD9cclxuICAgICAqL1xyXG4gICAgYXBwbHlTdGVuY2lsOiBmdW5jdGlvbiAocmVuZGVyZXIsIGNhbWVyYSwgaW5jKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xyXG4gICAgICAgIHZhciBnZW9tZXRyeU1hc2sgPSB0aGlzLmdlb21ldHJ5TWFzaztcclxuICAgICAgICB2YXIgbGV2ZWwgPSByZW5kZXJlci5tYXNrQ291bnQ7XHJcblxyXG4gICAgICAgIGdsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgbGV2ZWwsIDB4RkYpO1xyXG4gICAgICAgICAgICBnbC5zdGVuY2lsT3AoZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuSU5DUik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCBsZXZlbCArIDEsIDB4RkYpO1xyXG4gICAgICAgICAgICBnbC5zdGVuY2lsT3AoZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuREVDUik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgV3JpdGUgc3RlbmNpbCBidWZmZXJcclxuICAgICAgICBnZW9tZXRyeU1hc2sucmVuZGVyV2ViR0wocmVuZGVyZXIsIGdlb21ldHJ5TWFzaywgMCwgY2FtZXJhKTtcclxuXHJcbiAgICAgICAgcmVuZGVyZXIuZmx1c2goKTtcclxuXHJcbiAgICAgICAgZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5LRUVQKTtcclxuXHJcbiAgICAgICAgaWYgKGluYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludmVydEFscGhhKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgbGV2ZWwgKyAxLCAweEZGKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCBsZXZlbCArIDEsIDB4RkYpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaW52ZXJ0QWxwaGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5OT1RFUVVBTCwgbGV2ZWwsIDB4RkYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5FUVVBTCwgbGV2ZWwsIDB4RkYpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbHVzaGVzIGFsbCByZW5kZXJlZCBwaXhlbHMgYW5kIGRpc2FibGVzIHRoZSBzdGVuY2lsIHRlc3Qgb2YgYSBXZWJHTCBjb250ZXh0LCB0aHVzIGRpc2FibGluZyB0aGUgbWFzayBmb3IgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2sjcG9zdFJlbmRlcldlYkdMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZSB0byBkcmF3IGZsdXNoLlxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyV2ViR0w6IGZ1bmN0aW9uIChyZW5kZXJlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcclxuXHJcbiAgICAgICAgcmVuZGVyZXIubWFza1N0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICByZW5kZXJlci5tYXNrQ291bnQtLTtcclxuXHJcbiAgICAgICAgaWYgKHJlbmRlcmVyLm1hc2tTdGFjay5sZW5ndGggPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgdGhpcyBpcyB0aGUgb25seSBtYXNrIGluIHRoZSBzdGFjaywgZmx1c2ggYW5kIGRpc2FibGVcclxuICAgICAgICAgICAgcmVuZGVyZXIuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmN1cnJlbnRNYXNrLm1hc2sgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgRm9yY2UgZmx1c2ggYmVmb3JlIGRpc2FibGluZyBzdGVuY2lsIHRlc3RcclxuICAgICAgICAgICAgcmVuZGVyZXIuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcmV2ID0gcmVuZGVyZXIubWFza1N0YWNrW3JlbmRlcmVyLm1hc2tTdGFjay5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIHByZXYubWFzay5hcHBseVN0ZW5jaWwocmVuZGVyZXIsIHByZXYuY2FtZXJhLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVuZGVyZXIuY3VycmVudENhbWVyYU1hc2subWFzayAhPT0gcHJldi5tYXNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5jdXJyZW50TWFzay5tYXNrID0gcHJldi5tYXNrO1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuY3VycmVudE1hc2suY2FtZXJhID0gcHJldi5jYW1lcmE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5jdXJyZW50TWFzay5tYXNrID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjbGlwcGluZyBwYXRoIG9mIGEgMkQgY2FudmFzIGNvbnRleHQgdG8gdGhlIEdlb21ldHJ5IE1hc2sncyB1bmRlcmx5aW5nIEdyYXBoaWNzIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5EaXNwbGF5Lk1hc2tzLkdlb21ldHJ5TWFzayNwcmVSZW5kZXJDYW52YXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgQ2FudmFzIFJlbmRlcmVyIGluc3RhbmNlIHRvIHNldCB0aGUgY2xpcHBpbmcgcGF0aCBvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG1hc2sgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBHYW1lIE9iamVjdCBpcyBiZWluZyByZW5kZXJlZCB0aHJvdWdoLlxyXG4gICAgICovXHJcbiAgICBwcmVSZW5kZXJDYW52YXM6IGZ1bmN0aW9uIChyZW5kZXJlciwgbWFzaywgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnZW9tZXRyeU1hc2sgPSB0aGlzLmdlb21ldHJ5TWFzaztcclxuXHJcbiAgICAgICAgcmVuZGVyZXIuY3VycmVudENvbnRleHQuc2F2ZSgpO1xyXG5cclxuICAgICAgICBnZW9tZXRyeU1hc2sucmVuZGVyQ2FudmFzKHJlbmRlcmVyLCBnZW9tZXRyeU1hc2ssIDAsIGNhbWVyYSwgbnVsbCwgbnVsbCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0LmNsaXAoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN0b3JlIHRoZSBjYW52YXMgY29udGV4dCdzIHByZXZpb3VzIGNsaXBwaW5nIHBhdGgsIHRodXMgdHVybmluZyBvZmYgdGhlIG1hc2sgZm9yIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRpc3BsYXkuTWFza3MuR2VvbWV0cnlNYXNrI3Bvc3RSZW5kZXJDYW52YXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgQ2FudmFzIFJlbmRlcmVyIGluc3RhbmNlIGJlaW5nIHJlc3RvcmVkLlxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyQ2FudmFzOiBmdW5jdGlvbiAocmVuZGVyZXIpXHJcbiAgICB7XHJcbiAgICAgICAgcmVuZGVyZXIuY3VycmVudENvbnRleHQucmVzdG9yZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgR2VvbWV0cnlNYXNrIGFuZCBudWxscyBhbnkgcmVmZXJlbmNlcyBpdCBob2xkcy5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlIHRoYXQgaWYgYSBHYW1lIE9iamVjdCBpcyBjdXJyZW50bHkgdXNpbmcgdGhpcyBtYXNrIGl0IHdpbGwgX25vdF8gYXV0b21hdGljYWxseSBkZXRlY3QgeW91IGhhdmUgZGVzdHJveWVkIGl0LFxyXG4gICAgICogc28gYmUgc3VyZSB0byBjYWxsIGBjbGVhck1hc2tgIG9uIGFueSBHYW1lIE9iamVjdCB1c2luZyBpdCwgYmVmb3JlIGRlc3Ryb3lpbmcgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2sjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeU1hc2sgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdlb21ldHJ5TWFzaztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuRGlzcGxheS5NYXNrc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEJpdG1hcE1hc2s6IHJlcXVpcmUoJy4vQml0bWFwTWFzaycpLFxyXG4gICAgR2VvbWV0cnlNYXNrOiByZXF1aXJlKCcuL0dlb21ldHJ5TWFzaycpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIEJhc2VTaGFkZXIgaXMgYSBzbWFsbCByZXNvdXJjZSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHJlcXVpcmVkIGZvciBhIFdlYkdMIFNoYWRlciB0byBiZSBjcmVhdGVkLlxyXG4gKiBcclxuICogSXQgY29udGFpbnMgdGhlIHJhdyBzb3VyY2UgY29kZSB0byB0aGUgZnJhZ21lbnQgYW5kIHZlcnRleCBzaGFkZXIsIGFzIHdlbGwgYXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lc1xyXG4gKiB0aGUgdW5pZm9ybXMgdGhlIHNoYWRlciByZXF1aXJlcywgaWYgYW55LlxyXG4gKiBcclxuICogQmFzZVNoYWRlcnMgYXJlIHN0b3JlZCBpbiB0aGUgU2hhZGVyIENhY2hlLCBhdmFpbGFibGUgaW4gYSBTY2VuZSB2aWEgYHRoaXMuY2FjaGUuc2hhZGVyc2AgYW5kIGFyZSByZWZlcmVuY2VkXHJcbiAqIGJ5IGEgdW5pcXVlIGtleS1iYXNlZCBzdHJpbmcuIFJldHJpZXZlIHRoZW0gdmlhIGB0aGlzLmNhY2hlLnNoYWRlcnMuZ2V0KGtleSlgLlxyXG4gKiBcclxuICogQmFzZVNoYWRlcnMgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgR0xTTCBGaWxlIExvYWRlciB3aGVuIGxvYWRpbmcgYW4gZXh0ZXJuYWwgc2hhZGVyIHJlc291cmNlLlxyXG4gKiBUaGV5IGNhbiBhbHNvIGJlIGNyZWF0ZWQgYXQgcnVudGltZSwgYWxsb3dpbmcgeW91IHRvIHVzZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc2hhZGVyIHNvdXJjZSBjb2RlLlxyXG4gKiBcclxuICogRGVmYXVsdCBmcmFnbWVudCBhbmQgdmVydGV4IHNvdXJjZSBpcyB1c2VkIGlmIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNldHRpbmctdXAgYSBiYXNpYyBzaGFkZXIsXHJcbiAqIHN1aXRhYmxlIGZvciBkZWJ1ZyByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBjbGFzcyBCYXNlU2hhZGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuRGlzcGxheVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGlzIHNoYWRlci4gTXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzaGFkZXIgY2FjaGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhZ21lbnRTcmNdIC0gVGhlIGZyYWdtZW50IHNvdXJjZSBmb3IgdGhlIHNoYWRlci5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt2ZXJ0ZXhTcmNdIC0gVGhlIHZlcnRleCBzb3VyY2UgZm9yIHRoZSBzaGFkZXIuXHJcbiAqIEBwYXJhbSB7YW55fSBbdW5pZm9ybXNdIC0gT3B0aW9uYWwgb2JqZWN0IGRlZmluaW5nIHRoZSB1bmlmb3JtcyB0aGUgc2hhZGVyIHVzZXMuXHJcbiAqL1xyXG52YXIgQmFzZVNoYWRlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBCYXNlU2hhZGVyIChrZXksIGZyYWdtZW50U3JjLCB2ZXJ0ZXhTcmMsIHVuaWZvcm1zKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghZnJhZ21lbnRTcmMgfHwgZnJhZ21lbnRTcmMgPT09ICcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnJhZ21lbnRTcmMgPSBbXHJcbiAgICAgICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyxcclxuXHJcbiAgICAgICAgICAgICAgICAndW5pZm9ybSB2ZWMyIHJlc29sdXRpb247JyxcclxuXHJcbiAgICAgICAgICAgICAgICAndmFyeWluZyB2ZWMyIGZyYWdDb29yZDsnLFxyXG5cclxuICAgICAgICAgICAgICAgICd2b2lkIG1haW4gKCkgeycsXHJcbiAgICAgICAgICAgICAgICAnICAgIHZlYzIgdXYgPSBmcmFnQ29vcmQgLyByZXNvbHV0aW9uLnh5OycsXHJcbiAgICAgICAgICAgICAgICAnICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodXYueHl4LCAxLjApOycsXHJcbiAgICAgICAgICAgICAgICAnfSdcclxuICAgICAgICAgICAgXS5qb2luKCdcXG4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdmVydGV4U3JjIHx8IHZlcnRleFNyYyA9PT0gJycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2ZXJ0ZXhTcmMgPSBbXHJcbiAgICAgICAgICAgICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyxcclxuXHJcbiAgICAgICAgICAgICAgICAndW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4OycsXHJcbiAgICAgICAgICAgICAgICAndW5pZm9ybSBtYXQ0IHVWaWV3TWF0cml4OycsXHJcbiAgICAgICAgICAgICAgICAndW5pZm9ybSB2ZWMyIHVSZXNvbHV0aW9uOycsXHJcblxyXG4gICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSB2ZWMyIGluUG9zaXRpb247JyxcclxuXHJcbiAgICAgICAgICAgICAgICAndmFyeWluZyB2ZWMyIGZyYWdDb29yZDsnLFxyXG5cclxuICAgICAgICAgICAgICAgICd2b2lkIG1haW4gKCkgeycsXHJcbiAgICAgICAgICAgICAgICAnZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbk1hdHJpeCAqIHVWaWV3TWF0cml4ICogdmVjNChpblBvc2l0aW9uLCAxLjAsIDEuMCk7JyxcclxuICAgICAgICAgICAgICAgICdmcmFnQ29vcmQgPSB2ZWMyKGluUG9zaXRpb24ueCwgdVJlc29sdXRpb24ueSAtIGluUG9zaXRpb24ueSk7JyxcclxuICAgICAgICAgICAgICAgICd9J1xyXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVuaWZvcm1zID09PSB1bmRlZmluZWQpIHsgdW5pZm9ybXMgPSBudWxsOyB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBrZXkgb2YgdGhpcyBzaGFkZXIsIHVuaXF1ZSB3aXRoaW4gdGhlIHNoYWRlciBjYWNoZSBvZiB0aGlzIFBoYXNlciBnYW1lIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQmFzZVNoYWRlciNrZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmtleSA9IGtleTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNvdXJjZSBjb2RlLCBhcyBhIHN0cmluZywgb2YgdGhlIGZyYWdtZW50IHNoYWRlciBiZWluZyB1c2VkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRpc3BsYXkuQmFzZVNoYWRlciNmcmFnbWVudFNyY1xyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhZ21lbnRTcmMgPSBmcmFnbWVudFNyYztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNvdXJjZSBjb2RlLCBhcyBhIHN0cmluZywgb2YgdGhlIHZlcnRleCBzaGFkZXIgYmVpbmcgdXNlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkJhc2VTaGFkZXIjdmVydGV4U3JjXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhTcmMgPSB2ZXJ0ZXhTcmM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHVuaWZvcm1zIGZvciB0aGlzIHNoYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5EaXNwbGF5LkJhc2VTaGFkZXIjdW5pZm9ybXNcclxuICAgICAgICAgKiBAdHlwZSB7P2FueX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IHVuaWZvcm1zO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VTaGFkZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhlIERPTS4gSWYgYSBwYXJlbnQgaXMgcHJvdmlkZWQgdGhlIGVsZW1lbnQgaXMgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50LCBwcm92aWRpbmcgaXQgd2FzIGFibGUgdG8gYWNjZXNzIGl0LlxyXG4gKiBJZiBubyBwYXJlbnQgd2FzIGdpdmVuIGl0IGZhbGxzIGJhY2sgdG8gdXNpbmcgYGRvY3VtZW50LmJvZHlgLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRPTS5BZGRUb0RPTVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBET00uIFVzdWFsbHkgYSBDYW52YXMgb2JqZWN0LlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8SFRNTEVsZW1lbnQpfSBbcGFyZW50XSAtIFRoZSBwYXJlbnQgaW4gd2hpY2ggdG8gYWRkIHRoZSBlbGVtZW50LiBDYW4gYmUgYSBzdHJpbmcgd2hpY2ggaXMgcGFzc2VkIHRvIGBnZXRFbGVtZW50QnlJZGAgb3IgYW4gYWN0dWFsIERPTSBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUaGUgZWxlbWVudCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgRE9NLlxyXG4gKi9cclxudmFyIEFkZFRvRE9NID0gZnVuY3Rpb24gKGVsZW1lbnQsIHBhcmVudClcclxue1xyXG4gICAgdmFyIHRhcmdldDtcclxuXHJcbiAgICBpZiAocGFyZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBIb3BlZnVsbHkgYW4gZWxlbWVudCBJRFxyXG4gICAgICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JyAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUXVpY2sgdGVzdCBmb3IgYSBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICB0YXJnZXQgPSBwYXJlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBGYWxsYmFjaywgY292ZXJzIGFuIGludmFsaWQgSUQgYW5kIGEgbm9uIEhUTUxFbGVtZW50IG9iamVjdFxyXG4gICAgaWYgKCF0YXJnZXQpXHJcbiAgICB7XHJcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuYm9keTtcclxuICAgIH1cclxuXHJcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIGVsZW1lbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFkZFRvRE9NO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBZGRUb0RPTSA9IHJlcXVpcmUoJy4uL2RvbS9BZGRUb0RPTScpO1xyXG5cclxudmFyIENyZWF0ZURPTUNvbnRhaW5lciA9IGZ1bmN0aW9uIChnYW1lKVxyXG57XHJcbiAgICB2YXIgY29uZmlnID0gZ2FtZS5jb25maWc7XHJcblxyXG4gICAgaWYgKCFjb25maWcucGFyZW50IHx8ICFjb25maWcuZG9tQ3JlYXRlQ29udGFpbmVyKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgRE9NIEVsZW1lbnQgQ29udGFpbmVyXHJcbiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgZGl2LnN0eWxlLmNzc1RleHQgPSBbXHJcbiAgICAgICAgJ2Rpc3BsYXk6IGJsb2NrOycsXHJcbiAgICAgICAgJ3dpZHRoOiAnICsgZ2FtZS5zY2FsZS53aWR0aCArICdweDsnLFxyXG4gICAgICAgICdoZWlnaHQ6ICcgKyBnYW1lLnNjYWxlLmhlaWdodCArICdweDsnLFxyXG4gICAgICAgICdwYWRkaW5nOiAwOyBtYXJnaW46IDA7JyxcclxuICAgICAgICAncG9zaXRpb246IGFic29sdXRlOycsXHJcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47JyxcclxuICAgICAgICAncG9pbnRlci1ldmVudHM6IG5vbmU7JyxcclxuICAgICAgICAndHJhbnNmb3JtOiBzY2FsZSgxKTsnLFxyXG4gICAgICAgICd0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDsnXHJcbiAgICBdLmpvaW4oJyAnKTtcclxuXHJcbiAgICBnYW1lLmRvbUNvbnRhaW5lciA9IGRpdjtcclxuXHJcbiAgICBBZGRUb0RPTShkaXYsIGNvbmZpZy5wYXJlbnQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDcmVhdGVET01Db250YWluZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE9TID0gcmVxdWlyZSgnLi4vZGV2aWNlL09TJyk7XHJcblxyXG4vKipcclxuICogQGNhbGxiYWNrIENvbnRlbnRMb2FkZWRDYWxsYmFja1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBJbnNwZWN0cyB0aGUgcmVhZHlTdGF0ZSBvZiB0aGUgZG9jdW1lbnQuIElmIHRoZSBkb2N1bWVudCBpcyBhbHJlYWR5IGNvbXBsZXRlIHRoZW4gaXQgaW52b2tlcyB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAqIElmIG5vdCBjb21wbGV0ZSBpdCBzZXRzIHVwIHNldmVyYWwgZXZlbnQgbGlzdGVuZXJzIHN1Y2ggYXMgYGRldmljZXJlYWR5YCwgYW5kIG9uY2UgdGhvc2UgZmlyZSwgaXQgaW52b2tlcyB0aGUgY2FsbGJhY2suXHJcbiAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZS4gU2hvdWxkIG5vdCB1c3VhbGx5IGJlIGFjY2Vzc2VkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRPTS5ET01Db250ZW50TG9hZGVkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge0NvbnRlbnRMb2FkZWRDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcmVhZHkgYW5kIHRoZSBET00gY29udGVudCBpcyBsb2FkZWQuXHJcbiAqL1xyXG52YXIgRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaylcclxue1xyXG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJylcclxuICAgIHtcclxuICAgICAgICBjYWxsYmFjaygpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNoZWNrID0gZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIGNoZWNrLCB0cnVlKTtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgY2hlY2ssIHRydWUpO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgY2hlY2ssIHRydWUpO1xyXG5cclxuICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkpXHJcbiAgICB7XHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2hlY2ssIDIwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKE9TLmNvcmRvdmEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFJlZi4gaHR0cDovL2RvY3MucGhvbmVnYXAuY29tL2VuLzMuNS4wL2NvcmRvdmFfZXZlbnRzX2V2ZW50cy5tZC5odG1sI2RldmljZXJlYWR5XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBjaGVjaywgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBjaGVjaywgdHJ1ZSk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjaGVjaywgdHJ1ZSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERPTUNvbnRlbnRMb2FkZWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgZG9jdW1lbnQgaW5uZXIgaGVpZ2h0IGFjcm9zcyBpT1MgYW5kIHN0YW5kYXJkIGRldmljZXMuXHJcbiAqIEJhc2VkIG9uIGNvZGUgYnkgQHR5bGVyanBldGVyc29uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRE9NLkdldElubmVySGVpZ2h0XHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBpT1MgLSBJcyB0aGlzIHJ1bm5pbmcgb24gaU9TP1xyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbm5lciBoZWlnaHQgdmFsdWUuXHJcbiAqL1xyXG52YXIgR2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbiAoaU9TKVxyXG57XHJcblxyXG4gICAgaWYgKCFpT1MpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYXhpcyA9IE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbik7XHJcblxyXG4gICAgdmFyIHNpemUgPSB7IHc6IDAsIGg6IDAgfTtcclxuICAgIFxyXG4gICAgdmFyIHJ1bGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgcnVsZXIuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwdmg7IHdpZHRoOiAwOyB0b3A6IDAnKTtcclxuXHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocnVsZXIpO1xyXG5cclxuICAgIHNpemUudyA9IChheGlzID09PSA5MCkgPyBydWxlci5vZmZzZXRIZWlnaHQgOiB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgIHNpemUuaCA9IChheGlzID09PSA5MCkgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHJ1bGVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocnVsZXIpO1xyXG5cclxuICAgIHJ1bGVyID0gbnVsbDtcclxuXHJcbiAgICBpZiAoTWF0aC5hYnMod2luZG93Lm9yaWVudGF0aW9uKSAhPT0gOTApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHNpemUuaDtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc2l6ZS53O1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRJbm5lckhlaWdodDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9zY2FsZS9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgc2NyZWVuIG9yaWVudGF0aW9uIHVzaW5nIHRoZSBPcmllbnRhdGlvbiBBUEkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRE9NLkdldFNjcmVlbk9yaWVudGF0aW9uXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvcmllbnRhdGlvbi5cclxuICovXHJcbnZhciBHZXRTY3JlZW5PcmllbnRhdGlvbiA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG57XHJcbiAgICB2YXIgc2NyZWVuID0gd2luZG93LnNjcmVlbjtcclxuICAgIHZhciBvcmllbnRhdGlvbiA9IChzY3JlZW4pID8gc2NyZWVuLm9yaWVudGF0aW9uIHx8IHNjcmVlbi5tb3pPcmllbnRhdGlvbiB8fCBzY3JlZW4ubXNPcmllbnRhdGlvbiA6IGZhbHNlO1xyXG5cclxuICAgIGlmIChvcmllbnRhdGlvbiAmJiB0eXBlb2Ygb3JpZW50YXRpb24udHlwZSA9PT0gJ3N0cmluZycpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFNjcmVlbiBPcmllbnRhdGlvbiBBUEkgc3BlY2lmaWNhdGlvblxyXG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvbi50eXBlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIG9yaWVudGF0aW9uID09PSAnc3RyaW5nJylcclxuICAgIHtcclxuICAgICAgICAvLyAgbW96IC8gbXMtb3JpZW50YXRpb24gYXJlIHN0cmluZ3NcclxuICAgICAgICByZXR1cm4gb3JpZW50YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNjcmVlbilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHNjcmVlbi5oZWlnaHQgPiBzY3JlZW4ud2lkdGgpID8gQ09OU1QuT1JJRU5UQVRJT04uUE9SVFJBSVQgOiBDT05TVC5PUklFTlRBVElPTi5MQU5EU0NBUEU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2Ygd2luZG93Lm9yaWVudGF0aW9uID09PSAnbnVtYmVyJylcclxuICAgIHtcclxuICAgICAgICAvLyAgVGhpcyBtYXkgY2hhbmdlIGJ5IGRldmljZSBiYXNlZCBvbiBcIm5hdHVyYWxcIiBvcmllbnRhdGlvbi5cclxuICAgICAgICByZXR1cm4gKHdpbmRvdy5vcmllbnRhdGlvbiA9PT0gMCB8fCB3aW5kb3cub3JpZW50YXRpb24gPT09IDE4MCkgPyBDT05TVC5PUklFTlRBVElPTi5QT1JUUkFJVCA6IENPTlNULk9SSUVOVEFUSU9OLkxBTkRTQ0FQRTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgnKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknKS5tYXRjaGVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIENPTlNULk9SSUVOVEFUSU9OLlBPUlRSQUlUO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh3aW5kb3cubWF0Y2hNZWRpYSgnKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJykubWF0Y2hlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBDT05TVC5PUklFTlRBVElPTi5MQU5EU0NBUEU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/IENPTlNULk9SSUVOVEFUSU9OLlBPUlRSQUlUIDogQ09OU1QuT1JJRU5UQVRJT04uTEFORFNDQVBFO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRTY3JlZW5PcmllbnRhdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQXR0ZW1wdHMgdG8gZ2V0IHRoZSB0YXJnZXQgRE9NIGVsZW1lbnQgYmFzZWQgb24gdGhlIGdpdmVuIHZhbHVlLCB3aGljaCBjYW4gYmUgZWl0aGVyXHJcbiAqIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgbG9va2VkLXVwIGJ5IElELCBvciBhbiBlbGVtZW50IG5vZGUuIElmIG5vdGhpbmdcclxuICogY2FuIGJlIGZvdW5kIGl0IHdpbGwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudC5ib2R5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRPTS5HZXRUYXJnZXRcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIERPTSBlbGVtZW50IHRvIGxvb2stdXAuXHJcbiAqL1xyXG52YXIgR2V0VGFyZ2V0ID0gZnVuY3Rpb24gKGVsZW1lbnQpXHJcbntcclxuICAgIHZhciB0YXJnZXQ7XHJcblxyXG4gICAgaWYgKGVsZW1lbnQgIT09ICcnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSG9wZWZ1bGx5IGFuIGVsZW1lbnQgSURcclxuICAgICAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayB0ZXN0IGZvciBhIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgIHRhcmdldCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBGYWxsYmFjayB0byB0aGUgZG9jdW1lbnQgYm9keS4gQ292ZXJzIGFuIGludmFsaWQgSUQgYW5kIGEgbm9uIEhUTUxFbGVtZW50IG9iamVjdC5cclxuICAgIGlmICghdGFyZ2V0KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBVc2UgdGhlIGZ1bGwgd2luZG93XHJcbiAgICAgICAgdGFyZ2V0ID0gZG9jdW1lbnQuYm9keTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUYXJnZXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIHRoZSBnaXZlbiBkYXRhIHN0cmluZyBhbmQgcGFyc2VzIGl0IGFzIFhNTC5cclxuICogRmlyc3QgdHJpZXMgdG8gdXNlIHRoZSB3aW5kb3cuRE9NUGFyc2VyIGFuZCByZXZlcnRzIHRvIHRoZSBNaWNyb3NvZnQuWE1MRE9NIGlmIHRoYXQgZmFpbHMuXHJcbiAqIFRoZSBwYXJzZWQgWE1MIG9iamVjdCBpcyByZXR1cm5lZCwgb3IgYG51bGxgIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBkYXRhLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkRPTS5QYXJzZVhNTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBUaGUgWE1MIHNvdXJjZSBzdG9yZWQgaW4gYSBzdHJpbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4gez8oRE9NUGFyc2VyfEFjdGl2ZVhPYmplY3QpfSBUaGUgcGFyc2VkIFhNTCBkYXRhLCBvciBgbnVsbGAgaWYgdGhlIGRhdGEgY291bGQgbm90IGJlIHBhcnNlZC5cclxuICovXHJcbnZhciBQYXJzZVhNTCA9IGZ1bmN0aW9uIChkYXRhKVxyXG57XHJcbiAgICB2YXIgeG1sID0gJyc7XHJcblxyXG4gICAgdHJ5XHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpbmRvd1snRE9NUGFyc2VyJ10pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZG9tcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgICAgICB4bWwgPSBkb21wYXJzZXIucGFyc2VGcm9tU3RyaW5nKGRhdGEsICd0ZXh0L3htbCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpO1xyXG4gICAgICAgICAgICB4bWwubG9hZFhNTChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSlcclxuICAgIHtcclxuICAgICAgICB4bWwgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgncGFyc2VyZXJyb3InKS5sZW5ndGgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHhtbDtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VYTUw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEF0dGVtcHRzIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIGl0cyBwYXJlbnROb2RlIGluIHRoZSBET00uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuRE9NLlJlbW92ZUZyb21ET01cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdG8gcmVtb3ZlIGZyb20gaXRzIHBhcmVudCBub2RlLlxyXG4gKi9cclxudmFyIFJlbW92ZUZyb21ET00gPSBmdW5jdGlvbiAoZWxlbWVudClcclxue1xyXG4gICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSlcclxuICAgIHtcclxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlbW92ZUZyb21ET007XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIE5PT1AgPSByZXF1aXJlKCcuLi91dGlscy9OT09QJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBYnN0cmFjdHMgYXdheSB0aGUgdXNlIG9mIFJBRiBvciBzZXRUaW1lT3V0IGZvciB0aGUgY29yZSBnYW1lIHVwZGF0ZSBsb29wLlxyXG4gKiBUaGlzIGlzIGludm9rZWQgYXV0b21hdGljYWxseSBieSB0aGUgUGhhc2VyLkdhbWUgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBjbGFzcyBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcclxuICogQG1lbWJlcm9mIFBoYXNlci5ET01cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIFJlcXVlc3RBbmltYXRpb25GcmFtZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKClcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUcnVlIGlmIFJlcXVlc3RBbmltYXRpb25GcmFtZSBpcyBydW5uaW5nLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRE9NLlJlcXVlc3RBbmltYXRpb25GcmFtZSNpc1J1bm5pbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGVhY2ggc3RlcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5ET00uUmVxdWVzdEFuaW1hdGlvbkZyYW1lI2NhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUge0ZyYW1lUmVxdWVzdENhbGxiYWNrfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbW9zdCByZWNlbnQgdGltZXN0YW1wLiBFaXRoZXIgYSBET01IaWdoUmVzVGltZVN0YW1wIHVuZGVyIFJBRiBvciBgRGF0ZS5ub3dgIHVuZGVyIFNldFRpbWVvdXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRE9NLlJlcXVlc3RBbmltYXRpb25GcmFtZSN0aWNrXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWNrID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJ1ZSBpZiB0aGUgc3RlcCBpcyB1c2luZyBzZXRUaW1lb3V0IGluc3RlYWQgb2YgUkFGLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRPTS5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUjaXNTZXRUaW1lT3V0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzU2V0VGltZU91dCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2V0VGltZW91dCBvciBSQUYgY2FsbGJhY2sgSUQgdXNlZCB3aGVuIGNhbmNlbGluZyB0aGVtLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRPTS5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUjdGltZU91dElEXHJcbiAgICAgICAgICogQHR5cGUgez9udW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZU91dElEID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByZXZpb3VzIHRpbWUgdGhlIHN0ZXAgd2FzIGNhbGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5ET00uUmVxdWVzdEFuaW1hdGlvbkZyYW1lI2xhc3RUaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0YXJnZXQgRlBTIHJhdGUgaW4gbXMuXHJcbiAgICAgICAgICogT25seSB1c2VkIHdoZW4gc2V0VGltZW91dCBpcyB1c2VkIGluc3RlYWQgb2YgUkFGLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkRPTS5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUjdGFyZ2V0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gMDtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFJBRiBzdGVwIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHRpY2sgdmFsdWUsIGludm9rZXMgdGhlIGNhbGxiYWNrIGFuZCBzY2hlZHVsZXMgYW5vdGhlciBjYWxsIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5ET00uUmVxdWVzdEFuaW1hdGlvbkZyYW1lI3N0ZXBcclxuICAgICAgICAgKiBAdHlwZSB7RnJhbWVSZXF1ZXN0Q2FsbGJhY2t9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGVwID0gZnVuY3Rpb24gc3RlcCAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEJlY2F1c2Ugd2UgY2Fubm90IHRydXN0IHRoZSB0aW1lIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGZyb20gdGhlIGJyb3dzZXIgYW5kIG5lZWQgaXQga2VwdCBpbiBzeW5jIHdpdGggZXZlbnQgdGltZXNcclxuICAgICAgICAgICAgdmFyIHRpbWVzdGFtcCA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBET01IaWdoUmVzVGltZVN0YW1wXHJcbiAgICAgICAgICAgIF90aGlzLmxhc3RUaW1lID0gX3RoaXMudGljaztcclxuXHJcbiAgICAgICAgICAgIF90aGlzLnRpY2sgPSB0aW1lc3RhbXA7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5jYWxsYmFjayh0aW1lc3RhbXApO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMudGltZU91dElEID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2V0VGltZW91dCBzdGVwIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHRpY2sgdmFsdWUsIGludm9rZXMgdGhlIGNhbGxiYWNrIGFuZCBzY2hlZHVsZXMgYW5vdGhlciBjYWxsIHRvIHNldFRpbWVvdXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuRE9NLlJlcXVlc3RBbmltYXRpb25GcmFtZSNzdGVwVGltZW91dFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0ZXBUaW1lb3V0ID0gZnVuY3Rpb24gc3RlcFRpbWVvdXQgKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkZWxheSA9IE1hdGgubWluKE1hdGgubWF4KF90aGlzLnRhcmdldCAqIDIgKyBfdGhpcy50aWNrIC0gZCwgMCksIF90aGlzLnRhcmdldCk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5sYXN0VGltZSA9IF90aGlzLnRpY2s7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy50aWNrID0gZDtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmNhbGxiYWNrKGQpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMudGltZU91dElEID0gd2luZG93LnNldFRpbWVvdXQoc3RlcFRpbWVvdXQsIGRlbGF5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9yIHNldFRpbWVvdXQgcHJvY2VzcyBydW5uaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkRPTS5SZXF1ZXN0QW5pbWF0aW9uRnJhbWUjc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RnJhbWVSZXF1ZXN0Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBlYWNoIHN0ZXAuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlU2V0VGltZU91dCAtIFNob3VsZCBpdCB1c2UgU2V0VGltZW91dCwgZXZlbiBpZiBSQUYgaXMgYXZhaWxhYmxlP1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRhcmdldEZQUyAtIFRoZSB0YXJnZXQgZnBzIHJhdGUgKGluIG1zKS4gT25seSB1c2VkIHdoZW4gc2V0VGltZW91dCBpcyB1c2VkLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKGNhbGxiYWNrLCBmb3JjZVNldFRpbWVPdXQsIHRhcmdldEZQUylcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZXRUaW1lT3V0ID0gZm9yY2VTZXRUaW1lT3V0O1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldEZQUztcclxuXHJcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWVPdXRJRCA9IChmb3JjZVNldFRpbWVPdXQpID8gd2luZG93LnNldFRpbWVvdXQodGhpcy5zdGVwVGltZW91dCwgMCkgOiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuc3RlcCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBvciBzZXRUaW1lb3V0IGZyb20gcnVubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5ET00uUmVxdWVzdEFuaW1hdGlvbkZyYW1lI3N0b3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU2V0VGltZU91dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVPdXRJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnRpbWVPdXRJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBzdGVwIGZyb20gcnVubmluZyBhbmQgY2xlYXJzIHRoZSBjYWxsYmFjayByZWZlcmVuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRE9NLlJlcXVlc3RBbmltYXRpb25GcmFtZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IE5PT1A7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5ET01cclxuICovXHJcblxyXG52YXIgRG9tID0ge1xyXG5cclxuICAgIEFkZFRvRE9NOiByZXF1aXJlKCcuL0FkZFRvRE9NJyksXHJcbiAgICBET01Db250ZW50TG9hZGVkOiByZXF1aXJlKCcuL0RPTUNvbnRlbnRMb2FkZWQnKSxcclxuICAgIEdldFNjcmVlbk9yaWVudGF0aW9uOiByZXF1aXJlKCcuL0dldFNjcmVlbk9yaWVudGF0aW9uJyksXHJcbiAgICBHZXRUYXJnZXQ6IHJlcXVpcmUoJy4vR2V0VGFyZ2V0JyksXHJcbiAgICBQYXJzZVhNTDogcmVxdWlyZSgnLi9QYXJzZVhNTCcpLFxyXG4gICAgUmVtb3ZlRnJvbURPTTogcmVxdWlyZSgnLi9SZW1vdmVGcm9tRE9NJyksXHJcbiAgICBSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJlcXVpcmUoJy4vUmVxdWVzdEFuaW1hdGlvbkZyYW1lJylcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgRUUgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEV2ZW50RW1pdHRlciBpcyBhIFNjZW5lIFN5c3RlbXMgcGx1Z2luIGNvbXBhdGlibGUgdmVyc2lvbiBvZiBldmVudGVtaXR0ZXIzLlxyXG4gKlxyXG4gKiBAY2xhc3MgRXZlbnRFbWl0dGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuRXZlbnRzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBFdmVudEVtaXR0ZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEVFLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyICgpXHJcbiAgICB7XHJcbiAgICAgICAgRUUuY2FsbCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlciNzaHV0ZG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkIGxpc3RlbmVycy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlciNldmVudE5hbWVzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nfHN5bWJvbD59XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXIjbGlzdGVuZXJzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3ltYm9sKX0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cclxuICpcclxuICogQHJldHVybiB7RnVuY3Rpb25bXX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXIjbGlzdGVuZXJDb3VudFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfHN5bWJvbCl9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyI2VtaXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzeW1ib2wpfSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxyXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlciNvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfHN5bWJvbCl9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIC0gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBgdGhpc2AuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyI2FkZExpc3RlbmVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3ltYm9sKX0gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gLSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IGB0aGlzYC5cclxuICovXHJcblxyXG4vKipcclxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXIjb25jZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfHN5bWJvbCl9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIC0gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBgdGhpc2AuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXIjcmVtb3ZlTGlzdGVuZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzeW1ib2wpfSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZm5dIC0gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHRdIC0gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvbmNlXSAtIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gYHRoaXNgLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyI29mZlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfHN5bWJvbCl9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmbl0gLSBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhpcyBmdW5jdGlvbi5cclxuICogQHBhcmFtIHsqfSBbY29udGV4dF0gLSBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29uY2VdIC0gT25seSByZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBgdGhpc2AuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyI3JlbW92ZUFsbExpc3RlbmVyc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfHN5bWJvbCl9IFtldmVudF0gLSBUaGUgZXZlbnQgbmFtZS5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gYHRoaXNgLlxyXG4gKi9cclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdFdmVudEVtaXR0ZXInLCBFdmVudEVtaXR0ZXIsICdldmVudHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHsgRXZlbnRFbWl0dGVyOiByZXF1aXJlKCcuL0V2ZW50RW1pdHRlcicpIH07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJsZW5kTW9kZXMgPSByZXF1aXJlKCcuLi9yZW5kZXJlci9CbGVuZE1vZGVzJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBHYW1lIE9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2FtZU9iamVjdHMuQnVpbGRHYW1lT2JqZWN0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgaW5pdGlhbCBHYW1lT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q29uZmlnfSBjb25maWcgLSBUaGUgY29uZmlnIHRvIGJ1aWxkIHRoZSBHYW1lT2JqZWN0IHdpdGguXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgYnVpbHQgR2FtZSBPYmplY3QuXHJcbiAqL1xyXG52YXIgQnVpbGRHYW1lT2JqZWN0ID0gZnVuY3Rpb24gKHNjZW5lLCBnYW1lT2JqZWN0LCBjb25maWcpXHJcbntcclxuICAgIC8vICBQb3NpdGlvblxyXG5cclxuICAgIGdhbWVPYmplY3QueCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAneCcsIDApO1xyXG4gICAgZ2FtZU9iamVjdC55ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd5JywgMCk7XHJcbiAgICBnYW1lT2JqZWN0LmRlcHRoID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdkZXB0aCcsIDApO1xyXG5cclxuICAgIC8vICBGbGlwXHJcblxyXG4gICAgZ2FtZU9iamVjdC5mbGlwWCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnZmxpcFgnLCBmYWxzZSk7XHJcbiAgICBnYW1lT2JqZWN0LmZsaXBZID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdmbGlwWScsIGZhbHNlKTtcclxuXHJcbiAgICAvLyAgU2NhbGVcclxuICAgIC8vICBFaXRoZXI6IHsgc2NhbGU6IDIgfSBvciB7IHNjYWxlOiB7IHg6IDIsIHk6IDIgfX1cclxuXHJcbiAgICB2YXIgc2NhbGUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3NjYWxlJywgbnVsbCk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzY2FsZSA9PT0gJ251bWJlcicpXHJcbiAgICB7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRTY2FsZShzY2FsZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzY2FsZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICBnYW1lT2JqZWN0LnNjYWxlWCA9IEdldEFkdmFuY2VkVmFsdWUoc2NhbGUsICd4JywgMSk7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5zY2FsZVkgPSBHZXRBZHZhbmNlZFZhbHVlKHNjYWxlLCAneScsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBTY3JvbGxGYWN0b3JcclxuICAgIC8vICBFaXRoZXI6IHsgc2Nyb2xsRmFjdG9yOiAyIH0gb3IgeyBzY3JvbGxGYWN0b3I6IHsgeDogMiwgeTogMiB9fVxyXG5cclxuICAgIHZhciBzY3JvbGxGYWN0b3IgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3Njcm9sbEZhY3RvcicsIG51bGwpO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygc2Nyb2xsRmFjdG9yID09PSAnbnVtYmVyJylcclxuICAgIHtcclxuICAgICAgICBnYW1lT2JqZWN0LnNldFNjcm9sbEZhY3RvcihzY3JvbGxGYWN0b3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2Nyb2xsRmFjdG9yICE9PSBudWxsKVxyXG4gICAge1xyXG4gICAgICAgIGdhbWVPYmplY3Quc2Nyb2xsRmFjdG9yWCA9IEdldEFkdmFuY2VkVmFsdWUoc2Nyb2xsRmFjdG9yLCAneCcsIDEpO1xyXG4gICAgICAgIGdhbWVPYmplY3Quc2Nyb2xsRmFjdG9yWSA9IEdldEFkdmFuY2VkVmFsdWUoc2Nyb2xsRmFjdG9yLCAneScsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBSb3RhdGlvblxyXG5cclxuICAgIGdhbWVPYmplY3Qucm90YXRpb24gPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3JvdGF0aW9uJywgMCk7XHJcblxyXG4gICAgdmFyIGFuZ2xlID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdhbmdsZScsIG51bGwpO1xyXG5cclxuICAgIGlmIChhbmdsZSAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICBnYW1lT2JqZWN0LmFuZ2xlID0gYW5nbGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFscGhhXHJcblxyXG4gICAgZ2FtZU9iamVjdC5hbHBoYSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnYWxwaGEnLCAxKTtcclxuXHJcbiAgICAvLyAgT3JpZ2luXHJcbiAgICAvLyAgRWl0aGVyOiB7IG9yaWdpbjogMC41IH0gb3IgeyBvcmlnaW46IHsgeDogMC41LCB5OiAwLjUgfX1cclxuXHJcbiAgICB2YXIgb3JpZ2luID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdvcmlnaW4nLCBudWxsKTtcclxuXHJcbiAgICBpZiAodHlwZW9mIG9yaWdpbiA9PT0gJ251bWJlcicpXHJcbiAgICB7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRPcmlnaW4ob3JpZ2luKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG9yaWdpbiAhPT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3ggPSBHZXRBZHZhbmNlZFZhbHVlKG9yaWdpbiwgJ3gnLCAwLjUpO1xyXG4gICAgICAgIHZhciBveSA9IEdldEFkdmFuY2VkVmFsdWUob3JpZ2luLCAneScsIDAuNSk7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3Quc2V0T3JpZ2luKG94LCBveSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEJsZW5kTW9kZVxyXG5cclxuICAgIGdhbWVPYmplY3QuYmxlbmRNb2RlID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdibGVuZE1vZGUnLCBCbGVuZE1vZGVzLk5PUk1BTCk7XHJcblxyXG4gICAgLy8gIFZpc2libGVcclxuXHJcbiAgICBnYW1lT2JqZWN0LnZpc2libGUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3Zpc2libGUnLCB0cnVlKTtcclxuXHJcbiAgICAvLyAgQWRkIHRvIFNjZW5lXHJcblxyXG4gICAgdmFyIGFkZCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnYWRkJywgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKGFkZClcclxuICAgIHtcclxuICAgICAgICBzY2VuZS5zeXMuZGlzcGxheUxpc3QuYWRkKGdhbWVPYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChnYW1lT2JqZWN0LnByZVVwZGF0ZSlcclxuICAgIHtcclxuICAgICAgICBzY2VuZS5zeXMudXBkYXRlTGlzdC5hZGQoZ2FtZU9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJ1aWxkR2FtZU9iamVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBBbmltYXRpb24gY29tcG9uZW50IHRvIGEgU3ByaXRlIGFuZCBwb3B1bGF0ZXMgaXQgYmFzZWQgb24gdGhlIGdpdmVuIGNvbmZpZy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HYW1lT2JqZWN0cy5CdWlsZEdhbWVPYmplY3RBbmltYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gc3ByaXRlIC0gVGhlIHNwcml0ZSB0byBhZGQgYW4gQW5pbWF0aW9uIGNvbXBvbmVudCB0by5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBhbmltYXRpb24gY29uZmlnLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlfSBUaGUgdXBkYXRlZCBTcHJpdGUuXHJcbiAqL1xyXG52YXIgQnVpbGRHYW1lT2JqZWN0QW5pbWF0aW9uID0gZnVuY3Rpb24gKHNwcml0ZSwgY29uZmlnKVxyXG57XHJcbiAgICB2YXIgYW5pbUNvbmZpZyA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnYW5pbXMnLCBudWxsKTtcclxuXHJcbiAgICBpZiAoYW5pbUNvbmZpZyA9PT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc3ByaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgYW5pbUNvbmZpZyA9PT0gJ3N0cmluZycpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIHsgYW5pbXM6ICdrZXknIH1cclxuICAgICAgICBzcHJpdGUuYW5pbXMucGxheShhbmltQ29uZmlnKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiBhbmltQ29uZmlnID09PSAnb2JqZWN0JylcclxuICAgIHtcclxuICAgICAgICAvLyAgeyBhbmltczoge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICBrZXk6IHN0cmluZ1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICBzdGFydEZyYW1lOiBbc3RyaW5nfGludGVnZXJdXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgIGRlbGF5OiBbZmxvYXRdXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgIHJlcGVhdDogW2ludGVnZXJdXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgIHJlcGVhdERlbGF5OiBbZmxvYXRdXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgIHlveW86IFtib29sZWFuXVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICBwbGF5OiBbYm9vbGVhbl1cclxuICAgICAgICAvLyAgICAgICAgICAgICAgZGVsYXllZFBsYXk6IFtib29sZWFuXVxyXG4gICAgICAgIC8vICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gIH1cclxuXHJcbiAgICAgICAgdmFyIGFuaW1zID0gc3ByaXRlLmFuaW1zO1xyXG5cclxuICAgICAgICB2YXIga2V5ID0gR2V0QWR2YW5jZWRWYWx1ZShhbmltQ29uZmlnLCAna2V5JywgdW5kZWZpbmVkKTtcclxuICAgICAgICB2YXIgc3RhcnRGcmFtZSA9IEdldEFkdmFuY2VkVmFsdWUoYW5pbUNvbmZpZywgJ3N0YXJ0RnJhbWUnLCB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICB2YXIgZGVsYXkgPSBHZXRBZHZhbmNlZFZhbHVlKGFuaW1Db25maWcsICdkZWxheScsIDApO1xyXG4gICAgICAgIHZhciByZXBlYXQgPSBHZXRBZHZhbmNlZFZhbHVlKGFuaW1Db25maWcsICdyZXBlYXQnLCAwKTtcclxuICAgICAgICB2YXIgcmVwZWF0RGVsYXkgPSBHZXRBZHZhbmNlZFZhbHVlKGFuaW1Db25maWcsICdyZXBlYXREZWxheScsIDApO1xyXG4gICAgICAgIHZhciB5b3lvID0gR2V0QWR2YW5jZWRWYWx1ZShhbmltQ29uZmlnLCAneW95bycsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdmFyIHBsYXkgPSBHZXRBZHZhbmNlZFZhbHVlKGFuaW1Db25maWcsICdwbGF5JywgZmFsc2UpO1xyXG4gICAgICAgIHZhciBkZWxheWVkUGxheSA9IEdldEFkdmFuY2VkVmFsdWUoYW5pbUNvbmZpZywgJ2RlbGF5ZWRQbGF5JywgMCk7XHJcblxyXG4gICAgICAgIGFuaW1zLnNldERlbGF5KGRlbGF5KTtcclxuICAgICAgICBhbmltcy5zZXRSZXBlYXQocmVwZWF0KTtcclxuICAgICAgICBhbmltcy5zZXRSZXBlYXREZWxheShyZXBlYXREZWxheSk7XHJcbiAgICAgICAgYW5pbXMuc2V0WW95byh5b3lvKTtcclxuXHJcbiAgICAgICAgaWYgKHBsYXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmltcy5wbGF5KGtleSwgc3RhcnRGcmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRlbGF5ZWRQbGF5ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFuaW1zLmRlbGF5ZWRQbGF5KGRlbGF5ZWRQbGF5LCBrZXksIHN0YXJ0RnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmltcy5sb2FkKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzcHJpdGU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJ1aWxkR2FtZU9iamVjdEFuaW1hdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgTGlzdCA9IHJlcXVpcmUoJy4uL3N0cnVjdHMvTGlzdCcpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBTY2VuZUV2ZW50cyA9IHJlcXVpcmUoJy4uL3NjZW5lL2V2ZW50cycpO1xyXG52YXIgU3RhYmxlU29ydCA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L1N0YWJsZVNvcnQnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBEaXNwbGF5IExpc3QgcGx1Z2luLlxyXG4gKlxyXG4gKiBEaXNwbGF5IExpc3RzIGJlbG9uZyB0byBhIFNjZW5lIGFuZCBtYWludGFpbiB0aGUgbGlzdCBvZiBHYW1lIE9iamVjdHMgdG8gcmVuZGVyIGV2ZXJ5IGZyYW1lLlxyXG4gKlxyXG4gKiBTb21lIG9mIHRoZXNlIEdhbWUgT2JqZWN0cyBtYXkgYWxzbyBiZSBwYXJ0IG9mIHRoZSBTY2VuZSdzIFtVcGRhdGUgTGlzdF17QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlVwZGF0ZUxpc3R9LCBmb3IgdXBkYXRpbmcuXHJcbiAqXHJcbiAqIEBjbGFzcyBEaXNwbGF5TGlzdFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuU3RydWN0cy5MaXN0LjxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdD5cclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IHRoaXMgRGlzcGxheSBMaXN0IGJlbG9uZ3MgdG8uXHJcbiAqL1xyXG52YXIgRGlzcGxheUxpc3QgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IExpc3QsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBEaXNwbGF5TGlzdCAoc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgTGlzdC5jYWxsKHRoaXMsIHNjZW5lKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZsYWcgdGhlIGRldGVybWluZXMgd2hldGhlciBHYW1lIE9iamVjdHMgc2hvdWxkIGJlIHNvcnRlZCB3aGVuIGBkZXB0aFNvcnQoKWAgaXMgY2FsbGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I3NvcnRDaGlsZHJlbkZsYWdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc29ydENoaWxkcmVuRmxhZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhhdCB0aGlzIERpc3BsYXkgTGlzdCBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSdzIFN5c3RlbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3Qjc3lzdGVtc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gc2NlbmUuc3lzO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EaXNwbGF5TGlzdCNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I3N0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yY2UgYSBzb3J0IG9mIHRoZSBkaXNwbGF5IGxpc3Qgb24gdGhlIG5leHQgY2FsbCB0byBkZXB0aFNvcnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3QjcXVldWVEZXB0aFNvcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBxdWV1ZURlcHRoU29ydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNvcnRDaGlsZHJlbkZsYWcgPSB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltbWVkaWF0ZWx5IHNvcnRzIHRoZSBkaXNwbGF5IGxpc3QgaWYgdGhlIGZsYWcgaXMgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I2RlcHRoU29ydFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlcHRoU29ydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zb3J0Q2hpbGRyZW5GbGFnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgU3RhYmxlU29ydC5pbnBsYWNlKHRoaXMubGlzdCwgdGhpcy5zb3J0QnlEZXB0aCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNvcnRDaGlsZHJlbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFyZSB0aGUgZGVwdGggb2YgdHdvIEdhbWUgT2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EaXNwbGF5TGlzdCNzb3J0QnlEZXB0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGRBIC0gVGhlIGZpcnN0IEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGRCIC0gVGhlIHNlY29uZCBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkZXB0aHMgb2YgZWFjaCBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc29ydEJ5RGVwdGg6IGZ1bmN0aW9uIChjaGlsZEEsIGNoaWxkQilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gY2hpbGRBLl9kZXB0aCAtIGNoaWxkQi5fZGVwdGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSB3aGljaCBjb250YWlucyBhbGwgb2JqZWN0cyBjdXJyZW50bHkgb24gdGhlIERpc3BsYXkgTGlzdC5cclxuICAgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG1haW4gbGlzdCBhcnJheSwgbm90IGEgY29weSBvZiBpdCwgc28gYmUgY2FyZWZ1bCBub3QgdG8gbW9kaWZ5IGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I2dldENoaWxkcmVuXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gVGhlIGdyb3VwIG1lbWJlcnMuXHJcbiAgICAgKi9cclxuICAgIGdldENoaWxkcmVuOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBzaHV0dGluZyBkb3duLlxyXG4gICAgICogV2UgbmVlZCB0byBraWxsIGFuZCByZXNldCBhbGwgaW50ZXJuYWwgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHN0b3AgbGlzdGVuaW5nIHRvIFNjZW5lIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EaXNwbGF5TGlzdCNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgaSA9IHRoaXMubGlzdC5sZW5ndGg7XHJcblxyXG4gICAgICAgIHdoaWxlIChpLS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RbaV0uZGVzdHJveSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGlzdC5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0I2Rlc3Ryb3lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmV2ZW50cy5vZmYoU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5QbHVnaW5DYWNoZS5yZWdpc3RlcignRGlzcGxheUxpc3QnLCBEaXNwbGF5TGlzdCwgJ2Rpc3BsYXlMaXN0Jyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BsYXlMaXN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzVG9KU09OID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL1RvSlNPTicpO1xyXG52YXIgRGF0YU1hbmFnZXIgPSByZXF1aXJlKCcuLi9kYXRhL0RhdGFNYW5hZ2VyJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIGJhc2UgY2xhc3MgdGhhdCBhbGwgR2FtZSBPYmplY3RzIGV4dGVuZC5cclxuICogWW91IGRvbid0IGNyZWF0ZSBHYW1lT2JqZWN0cyBkaXJlY3RseSBhbmQgdGhleSBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGRpc3BsYXkgbGlzdC5cclxuICogSW5zdGVhZCwgdXNlIHRoZW0gYXMgdGhlIGJhc2UgZm9yIHlvdXIgb3duIGN1c3RvbSBjbGFzc2VzLlxyXG4gKlxyXG4gKiBAY2xhc3MgR2FtZU9iamVjdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgb2YgR2FtZSBPYmplY3QsIGkuZS4gYHNwcml0ZWAuXHJcbiAqL1xyXG52YXIgR2FtZU9iamVjdCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR2FtZU9iamVjdCAoc2NlbmUsIHR5cGUpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuXHJcbiAgICAgICAgICogR2FtZSBPYmplY3RzIGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QsIGkuZS4gYHNwcml0ZWAuXHJcbiAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IFBoYXNlciBidXQgaXMgYXZhaWxhYmxlIGZvciB5b3VyIG93biBjdXN0b20gY2xhc3NlcyB0byBwb3B1bGF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogUGhhc2VyIGl0c2VsZiB3aWxsIG5ldmVyIG1vZGlmeSB0aGlzIHZhbHVlLCBhbHRob3VnaCBwbHVnaW5zIG1heSBkbyBzby5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byB0cmFjayB0aGUgc3RhdGUgb2YgYSBHYW1lIE9iamVjdCBkdXJpbmcgaXRzIGxpZmV0aW1lLiBGb3IgZXhhbXBsZSwgaXQgY291bGQgY2hhbmdlIGZyb21cclxuICAgICAgICAgKiBhIHN0YXRlIG9mICdtb3ZpbmcnLCB0byAnYXR0YWNraW5nJywgdG8gJ2RlYWQnLiBUaGUgc3RhdGUgdmFsdWUgc2hvdWxkIGJlIGFuIGludGVnZXIgKGlkZWFsbHkgbWFwcGVkIHRvIGEgY29uc3RhbnRcclxuICAgICAgICAgKiBpbiB5b3VyIGdhbWUgY29kZSksIG9yIGEgc3RyaW5nLiBUaGVzZSBhcmUgcmVjb21tZW5kZWQgdG8ga2VlcCBpdCBsaWdodCBhbmQgc2ltcGxlLCB3aXRoIGZhc3QgY29tcGFyaXNvbnMuXHJcbiAgICAgICAgICogSWYgeW91IG5lZWQgdG8gc3RvcmUgY29tcGxleCBkYXRhIGFib3V0IHlvdXIgR2FtZSBPYmplY3QsIGxvb2sgYXQgdXNpbmcgdGhlIERhdGEgQ29tcG9uZW50IGluc3RlYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzdGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHsoaW50ZWdlcnxzdHJpbmcpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXRlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBhcmVudCBDb250YWluZXIgb2YgdGhpcyBHYW1lIE9iamVjdCwgaWYgaXQgaGFzIG9uZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3BhcmVudENvbnRhaW5lclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBFbXB0eSBieSBkZWZhdWx0IGFuZCBuZXZlciBwb3B1bGF0ZWQgYnkgUGhhc2VyLCB0aGlzIGlzIGxlZnQgZm9yIGRldmVsb3BlcnMgdG8gdXNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjbmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgJydcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIEEgR2FtZSBPYmplY3Qgd2l0aCBhbiBhY3RpdmUgc3RhdGUgb2YgYHRydWVgIGlzIHByb2Nlc3NlZCBieSB0aGUgU2NlbmVzIFVwZGF0ZUxpc3QsIGlmIGFkZGVkIHRvIGl0LlxyXG4gICAgICAgICAqIEFuIGFjdGl2ZSBvYmplY3QgaXMgb25lIHdoaWNoIGlzIGhhdmluZyBpdHMgbG9naWMgYW5kIGludGVybmFsIHN5c3RlbXMgdXBkYXRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUYWIgSW5kZXggb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGJ5IHBsdWdpbnMgYW5kIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjdGFiSW5kZXhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBEYXRhIE1hbmFnZXIuXHJcbiAgICAgICAgICogSXQgYWxsb3dzIHlvdSB0byBzdG9yZSwgcXVlcnkgYW5kIGdldCBrZXkvdmFsdWUgcGFpcmVkIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgICAgICogYG51bGxgIGJ5IGRlZmF1bHQuIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpZiB5b3UgdXNlIGBnZXREYXRhYCBvciBgc2V0RGF0YWAgb3IgYHNldERhdGFFbmFibGVkYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmbGFncyB0aGF0IGFyZSBjb21wYXJlZCBhZ2FpbnN0IGBSRU5ERVJfTUFTS2AgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCByZW5kZXIgb3Igbm90LlxyXG4gICAgICAgICAqIFRoZSBiaXRzIGFyZSAwMDAxIHwgMDAxMCB8IDAxMDAgfCAxMDAwIHNldCBieSB0aGUgY29tcG9uZW50cyBWaXNpYmxlLCBBbHBoYSwgVHJhbnNmb3JtIGFuZCBUZXh0dXJlIHJlc3BlY3RpdmVseS5cclxuICAgICAgICAgKiBJZiB0aG9zZSBjb21wb25lbnRzIGFyZSBub3QgdXNlZCBieSB5b3VyIGN1c3RvbSBjbGFzcyB0aGVuIHlvdSBjYW4gdXNlIHRoaXMgYml0bWFzayBhcyB5b3Ugd2lzaC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3JlbmRlckZsYWdzXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlckZsYWdzID0gMTU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYml0bWFzayB0aGF0IGNvbnRyb2xzIGlmIHRoaXMgR2FtZSBPYmplY3QgaXMgZHJhd24gYnkgYSBDYW1lcmEgb3Igbm90LlxyXG4gICAgICAgICAqIE5vdCB1c3VhbGx5IHNldCBkaXJlY3RseSwgaW5zdGVhZCBjYWxsIGBDYW1lcmEuaWdub3JlYCwgaG93ZXZlciB5b3UgY2FuXHJcbiAgICAgICAgICogc2V0IHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgdXNpbmcgdGhlIENhbWVyYS5pZCBwcm9wZXJ0eTpcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogdGhpcy5jYW1lcmFGaWx0ZXIgfD0gY2FtZXJhLmlkXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNjYW1lcmFGaWx0ZXJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYUZpbHRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgR2FtZSBPYmplY3QgaXMgZW5hYmxlZCBmb3IgaW5wdXQgdGhlbiB0aGlzIHByb3BlcnR5IHdpbGwgY29udGFpbiBhbiBJbnRlcmFjdGl2ZU9iamVjdCBpbnN0YW5jZS5cclxuICAgICAgICAgKiBOb3QgdXN1YWxseSBzZXQgZGlyZWN0bHkuIEluc3RlYWQgY2FsbCBgR2FtZU9iamVjdC5zZXRJbnRlcmFjdGl2ZSgpYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2lucHV0XHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuSW5wdXQuSW50ZXJhY3RpdmVPYmplY3R9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXQgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIEdhbWUgT2JqZWN0IGlzIGVuYWJsZWQgZm9yIEFyY2FkZSBvciBNYXR0ZXIgUGh5c2ljcyB0aGVuIHRoaXMgcHJvcGVydHkgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgUGh5c2ljcyBCb2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYm9keVxyXG4gICAgICAgICAqIEB0eXBlIHs/KG9iamVjdHxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxNYXR0ZXJKUy5Cb2R5VHlwZSl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgR2FtZSBPYmplY3Qgd2lsbCBpZ25vcmUgYWxsIGNhbGxzIG1hZGUgdG8gaXRzIGRlc3Ryb3kgbWV0aG9kIGlmIHRoaXMgZmxhZyBpcyBzZXQgdG8gYHRydWVgLlxyXG4gICAgICAgICAqIFRoaXMgaW5jbHVkZXMgY2FsbHMgdGhhdCBtYXkgY29tZSBmcm9tIGEgR3JvdXAsIENvbnRhaW5lciBvciB0aGUgU2NlbmUgaXRzZWxmLlxyXG4gICAgICAgICAqIFdoaWxlIGl0IGFsbG93cyB5b3UgdG8gcGVyc2lzdCBhIEdhbWUgT2JqZWN0IGFjcm9zcyBTY2VuZXMsIHBsZWFzZSB1bmRlcnN0YW5kIHlvdSBhcmUgZW50aXJlbHlcclxuICAgICAgICAgKiByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgcmVmZXJlbmNlcyB0byBhbmQgZnJvbSB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjaWdub3JlRGVzdHJveVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pZ25vcmVEZXN0cm95ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vICBUZWxsIHRoZSBTY2VuZSB0byByZS1zb3J0IHRoZSBjaGlsZHJlblxyXG4gICAgICAgIHNjZW5lLnN5cy5xdWV1ZURlcHRoU29ydCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGBhY3RpdmVgIHByb3BlcnR5IG9mIHRoaXMgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgdGhpcyBHYW1lIE9iamVjdCBmb3IgZnVydGhlciBjaGFpbmluZy5cclxuICAgICAqIEEgR2FtZSBPYmplY3Qgd2l0aCBpdHMgYGFjdGl2ZWAgcHJvcGVydHkgc2V0IHRvIGB0cnVlYCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIFNjZW5lcyBVcGRhdGVMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3Qjc2V0QWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVHJ1ZSBpZiB0aGlzIEdhbWUgT2JqZWN0IHNob3VsZCBiZSBzZXQgYXMgYWN0aXZlLCBmYWxzZSBpZiBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBgbmFtZWAgcHJvcGVydHkgb2YgdGhpcyBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyB0aGlzIEdhbWUgT2JqZWN0IGZvciBmdXJ0aGVyIGNoYWluaW5nLlxyXG4gICAgICogVGhlIGBuYW1lYCBwcm9wZXJ0eSBpcyBub3QgcG9wdWxhdGVkIGJ5IFBoYXNlciBhbmQgaXMgcHJlc2VudGVkIGZvciB5b3VyIG93biB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXROYW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgbmFtZSB0byBiZSBnaXZlbiB0byB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZU9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0TmFtZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFBoYXNlciBpdHNlbGYgd2lsbCBuZXZlciBtb2RpZnkgdGhlIFN0YXRlIG9mIGEgR2FtZSBPYmplY3QsIGFsdGhvdWdoIHBsdWdpbnMgbWF5IGRvIHNvLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBHYW1lIE9iamVjdCBjb3VsZCBjaGFuZ2UgZnJvbSBhIHN0YXRlIG9mICdtb3ZpbmcnLCB0byAnYXR0YWNraW5nJywgdG8gJ2RlYWQnLlxyXG4gICAgICogVGhlIHN0YXRlIHZhbHVlIHNob3VsZCB0eXBpY2FsbHkgYmUgYW4gaW50ZWdlciAoaWRlYWxseSBtYXBwZWQgdG8gYSBjb25zdGFudFxyXG4gICAgICogaW4geW91ciBnYW1lIGNvZGUpLCBidXQgY291bGQgYWxzbyBiZSBhIHN0cmluZy4gSXQgaXMgcmVjb21tZW5kZWQgdG8ga2VlcCBpdCBsaWdodCBhbmQgc2ltcGxlLlxyXG4gICAgICogSWYgeW91IG5lZWQgdG8gc3RvcmUgY29tcGxleCBkYXRhIGFib3V0IHlvdXIgR2FtZSBPYmplY3QsIGxvb2sgYXQgdXNpbmcgdGhlIERhdGEgQ29tcG9uZW50IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRTdGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8c3RyaW5nKX0gdmFsdWUgLSBUaGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZU9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBEYXRhIE1hbmFnZXIgY29tcG9uZW50IHRvIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXREYXRhRW5hYmxlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBAc2VlIFBoYXNlci5EYXRhLkRhdGFNYW5hZ2VyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREYXRhRW5hYmxlZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbG93cyB5b3UgdG8gc3RvcmUgYSBrZXkgdmFsdWUgcGFpciB3aXRoaW4gdGhpcyBHYW1lIE9iamVjdHMgRGF0YSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBHYW1lIE9iamVjdCBoYXMgbm90IGJlZW4gZW5hYmxlZCBmb3IgZGF0YSAodmlhIGBzZXREYXRhRW5hYmxlZGApIHRoZW4gaXQgd2lsbCBiZSBlbmFibGVkXHJcbiAgICAgKiBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIERhdGEgTWFuYWdlciB0aGVuIGl0IGlzIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogc3ByaXRlLnNldERhdGEoJ25hbWUnLCAnUmVkIEdlbSBTdG9uZScpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGtleSB2YWx1ZSBwYWlycyBhcyB0aGUgZmlyc3QgYXJndW1lbnQ6XHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogc3ByaXRlLnNldERhdGEoeyBuYW1lOiAnUmVkIEdlbSBTdG9uZScsIGxldmVsOiAyLCBvd25lcjogJ0xpbmsnLCBnb2xkOiA1MCB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRvIGdldCBhIHZhbHVlIGJhY2sgYWdhaW4geW91IGNhbiBjYWxsIGBnZXREYXRhYDpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBzcHJpdGUuZ2V0RGF0YSgnZ29sZCcpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogT3IgeW91IGNhbiBhY2Nlc3MgdGhlIHZhbHVlIGRpcmVjdGx5IHZpYSB0aGUgYHZhbHVlc2AgcHJvcGVydHksIHdoZXJlIGl0IHdvcmtzIGxpa2UgYW55IG90aGVyIHZhcmlhYmxlOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHNwcml0ZS5kYXRhLnZhbHVlcy5nb2xkICs9IDUwO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiB0aGUgdmFsdWUgaXMgZmlyc3Qgc2V0LCBhIGBzZXRkYXRhYCBldmVudCBpcyBlbWl0dGVkIGZyb20gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzLCBhIGBjaGFuZ2VkYXRhYCBldmVudCBpcyBlbWl0dGVkIGluc3RlYWQsIGFsb25nIGFuIGV2ZW50IG5hbWVkIGFmdGVyIHRoZSBrZXkuXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHVwZGF0ZWQgYW4gZXhpc3Rpbmcga2V5IGNhbGxlZCBgUGxheWVyTGl2ZXNgIHRoZW4gaXQgd291bGQgZW1pdCB0aGUgZXZlbnQgYGNoYW5nZWRhdGEtUGxheWVyTGl2ZXNgLlxyXG4gICAgICogVGhlc2UgZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCByZWdhcmRsZXNzIGlmIHlvdSB1c2UgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSB2YWx1ZSwgb3IgdGhlIGRpcmVjdCBgdmFsdWVzYCBzZXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgZGF0YSBrZXlzIGFyZSBjYXNlLXNlbnNpdGl2ZSBhbmQgbXVzdCBiZSB2YWxpZCBKYXZhU2NyaXB0IE9iamVjdCBwcm9wZXJ0eSBzdHJpbmdzLlxyXG4gICAgICogVGhpcyBtZWFucyB0aGUga2V5cyBgZ29sZGAgYW5kIGBHb2xkYCBhcmUgdHJlYXRlZCBhcyB0d28gdW5pcXVlIHZhbHVlcyB3aXRoaW4gdGhlIERhdGEgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldERhdGFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBrZXkgLSBUaGUga2V5IHRvIHNldCB0aGUgdmFsdWUgZm9yLiBPciBhbiBvYmplY3Qgb2Yga2V5IHZhbHVlIHBhaXJzLiBJZiBhbiBvYmplY3QgdGhlIGBkYXRhYCBhcmd1bWVudCBpcyBpZ25vcmVkLlxyXG4gICAgICogQHBhcmFtIHsqfSBbZGF0YV0gLSBUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZ2l2ZW4ga2V5LiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgYXMgdGhlIGtleSB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREYXRhOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluY3JlYXNlIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgd2l0aGluIHRoaXMgR2FtZSBPYmplY3RzIERhdGEgTWFuYWdlci4gSWYgdGhlIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIERhdGEgTWFuYWdlciB0aGVuIGl0IGlzIGluY3JlYXNlZCBmcm9tIDAuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIEdhbWUgT2JqZWN0IGhhcyBub3QgYmVlbiBlbmFibGVkIGZvciBkYXRhICh2aWEgYHNldERhdGFFbmFibGVkYCkgdGhlbiBpdCB3aWxsIGJlIGVuYWJsZWRcclxuICAgICAqIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUga2V5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgRGF0YSBNYW5hZ2VyIHRoZW4gaXQgaXMgY3JlYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiB0aGUgdmFsdWUgaXMgZmlyc3Qgc2V0LCBhIGBzZXRkYXRhYCBldmVudCBpcyBlbWl0dGVkIGZyb20gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2luY0RhdGFcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0ga2V5IC0gVGhlIGtleSB0byBpbmNyZWFzZSB0aGUgdmFsdWUgZm9yLlxyXG4gICAgICogQHBhcmFtIHsqfSBbZGF0YV0gLSBUaGUgdmFsdWUgdG8gaW5jcmVhc2UgZm9yIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBpbmNEYXRhOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5pbmMoa2V5LCB2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZSBhIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgd2l0aGluIHRoaXMgR2FtZSBPYmplY3RzIERhdGEgTWFuYWdlci4gSWYgdGhlIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIERhdGEgTWFuYWdlciB0aGVuIGl0IGlzIHRvZ2dsZWQgZnJvbSBmYWxzZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgR2FtZSBPYmplY3QgaGFzIG5vdCBiZWVuIGVuYWJsZWQgZm9yIGRhdGEgKHZpYSBgc2V0RGF0YUVuYWJsZWRgKSB0aGVuIGl0IHdpbGwgYmUgZW5hYmxlZFxyXG4gICAgICogYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBrZXkgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluIHRoZSBEYXRhIE1hbmFnZXIgdGhlbiBpdCBpcyBjcmVhdGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHRoZSB2YWx1ZSBpcyBmaXJzdCBzZXQsIGEgYHNldGRhdGFgIGV2ZW50IGlzIGVtaXR0ZWQgZnJvbSB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjdG9nZ2xlRGF0YVxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBrZXkgLSBUaGUga2V5IHRvIHRvZ2dsZSB0aGUgdmFsdWUgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZU9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdG9nZ2xlRGF0YTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS50b2dnbGUoa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGlzIEdhbWUgT2JqZWN0cyBEYXRhIE1hbmFnZXIsIG9yIHVuZGVmaW5lZCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBhY2Nlc3MgdmFsdWVzIHZpYSB0aGUgYHZhbHVlc2Agb2JqZWN0LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhIGtleSBjYWxsZWQgYGdvbGRgIHlvdSBjYW4gZG8gZWl0aGVyOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHNwcml0ZS5nZXREYXRhKCdnb2xkJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBPciBhY2Nlc3MgdGhlIHZhbHVlIGRpcmVjdGx5OlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHNwcml0ZS5kYXRhLnZhbHVlcy5nb2xkO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gYXJyYXkgb2Yga2V5cywgaW4gd2hpY2ggY2FzZSBhbiBhcnJheSBvZiB2YWx1ZXMgd2lsbCBiZSByZXR1cm5lZDpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBzcHJpdGUuZ2V0RGF0YShbICdnb2xkJywgJ2FybW9yJywgJ2hlYWx0aCcgXSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGFwcHJvYWNoIGlzIHVzZWZ1bCBmb3IgZGVzdHJ1Y3R1cmluZyBhcnJheXMgaW4gRVM2LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjZ2V0RGF0YVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5IC0gVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmV0cmlldmUsIG9yIGFuIGFycmF5IG9mIGtleXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4ga2V5LCBvciBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZSBvcmRlciBvZiB3aGljaCB3aWxsIG1hdGNoIHRoZSBpbnB1dCBhcnJheS5cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhTWFuYWdlcih0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzcyB0aGlzIEdhbWUgT2JqZWN0IHRvIHRoZSBJbnB1dCBNYW5hZ2VyIHRvIGVuYWJsZSBpdCBmb3IgSW5wdXQuXHJcbiAgICAgKlxyXG4gICAgICogSW5wdXQgd29ya3MgYnkgdXNpbmcgaGl0IGFyZWFzLCB0aGVzZSBhcmUgbmVhcmx5IGFsd2F5cyBnZW9tZXRyaWMgc2hhcGVzLCBzdWNoIGFzIHJlY3RhbmdsZXMgb3IgY2lyY2xlcywgdGhhdCBhY3QgYXMgdGhlIGhpdCBhcmVhXHJcbiAgICAgKiBmb3IgdGhlIEdhbWUgT2JqZWN0LiBIb3dldmVyLCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gaGl0IGFyZWEgc2hhcGUgYW5kIGNhbGxiYWNrLCBzaG91bGQgeW91IHdpc2ggdG8gaGFuZGxlIHNvbWUgbW9yZSBhZHZhbmNlZFxyXG4gICAgICogaW5wdXQgZGV0ZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgaXQgd2lsbCB0cnkgYW5kIGNyZWF0ZSBhIHJlY3RhbmdsZSBoaXQgYXJlYSBiYXNlZCBvbiB0aGUgdGV4dHVyZSBmcmFtZSB0aGUgR2FtZSBPYmplY3QgaXMgdXNpbmcuIElmXHJcbiAgICAgKiB0aGlzIGlzbid0IGEgdGV4dHVyZS1ib3VuZCBvYmplY3QsIHN1Y2ggYXMgYSBHcmFwaGljcyBvciBCaXRtYXBUZXh0IG9iamVjdCwgdGhpcyB3aWxsIGZhaWwsIGFuZCB5b3UnbGwgbmVlZCB0byBwcm92aWRlIGEgc3BlY2lmaWNcclxuICAgICAqIHNoYXBlIGZvciBpdCB0byB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gSW5wdXQgQ29uZmlndXJhdGlvbiBPYmplY3QgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLklucHV0LklucHV0Q29uZmlndXJhdGlvbnxhbnkpfSBbc2hhcGVdIC0gRWl0aGVyIGFuIGlucHV0IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhIGdlb21ldHJpYyBzaGFwZSB0aGF0IGRlZmluZXMgdGhlIGhpdCBhcmVhIGZvciB0aGUgR2FtZSBPYmplY3QuIElmIG5vdCBzcGVjaWZpZWQgYSBSZWN0YW5nbGUgd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIEdhbWUgT2JqZWN0IGlzIGludGVyYWN0ZWQgd2l0aC4gSWYgeW91IHByb3ZpZGUgYSBzaGFwZSB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgYSBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Ryb3Bab25lPWZhbHNlXSAtIFNob3VsZCB0aGlzIEdhbWUgT2JqZWN0IGJlIHRyZWF0ZWQgYXMgYSBkcm9wIHpvbmUgdGFyZ2V0P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZU9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SW50ZXJhY3RpdmU6IGZ1bmN0aW9uIChzaGFwZSwgY2FsbGJhY2ssIGRyb3Bab25lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmlucHV0LmVuYWJsZSh0aGlzLCBzaGFwZSwgY2FsbGJhY2ssIGRyb3Bab25lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgcHJldmlvdXNseSBiZWVuIGVuYWJsZWQgZm9yIGlucHV0LCB0aGlzIHdpbGwgZGlzYWJsZSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBBbiBvYmplY3QgdGhhdCBpcyBkaXNhYmxlZCBmb3IgaW5wdXQgc3RvcHMgcHJvY2Vzc2luZyBvciBiZWluZyBjb25zaWRlcmVkIGZvclxyXG4gICAgICogaW5wdXQgZXZlbnRzLCBidXQgY2FuIGJlIHR1cm5lZCBiYWNrIG9uIGFnYWluIGF0IGFueSB0aW1lIGJ5IHNpbXBseSBjYWxsaW5nXHJcbiAgICAgKiBgc2V0SW50ZXJhY3RpdmUoKWAgd2l0aCBubyBhcmd1bWVudHMgcHJvdmlkZWQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgd2FudCB0byBjb21wbGV0ZWx5IHJlbW92ZSBpbnRlcmFjdGlvbiBmcm9tIHRoaXMgR2FtZSBPYmplY3QgdGhlbiB1c2UgYHJlbW92ZUludGVyYWN0aXZlYCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjZGlzYWJsZUludGVyYWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWVPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGVJbnRlcmFjdGl2ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgcHJldmlvdXNseSBiZWVuIGVuYWJsZWQgZm9yIGlucHV0LCB0aGlzIHdpbGwgcXVldWUgaXRcclxuICAgICAqIGZvciByZW1vdmFsLCBjYXVzaW5nIGl0IHRvIG5vIGxvbmdlciBiZSBpbnRlcmFjdGl2ZS4gVGhlIHJlbW92YWwgaGFwcGVucyBvblxyXG4gICAgICogdGhlIG5leHQgZ2FtZSBzdGVwLCBpdCBpcyBub3QgaW1tZWRpYXRlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBJbnRlcmFjdGl2ZSBPYmplY3QgdGhhdCB3YXMgYXNzaWduZWQgdG8gdGhpcyBHYW1lIE9iamVjdCB3aWxsIGJlIGRlc3Ryb3llZCxcclxuICAgICAqIHJlbW92ZWQgZnJvbSB0aGUgSW5wdXQgTWFuYWdlciBhbmQgY2xlYXJlZCBmcm9tIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IHdpc2ggdG8gcmUtZW5hYmxlIHRoaXMgR2FtZSBPYmplY3QgYXQgYSBsYXRlciBkYXRlIHlvdSB3aWxsIG5lZWQgdG9cclxuICAgICAqIHJlLWNyZWF0ZSBpdHMgSW50ZXJhY3RpdmVPYmplY3QgYnkgY2FsbGluZyBgc2V0SW50ZXJhY3RpdmVgIGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIG9ubHkgdGVtcG9yYXJpbHkgc3RvcCBhbiBvYmplY3QgZnJvbSByZWNlaXZpbmcgaW5wdXQgdGhlbiB1c2VcclxuICAgICAqIGBkaXNhYmxlSW50ZXJhY3RpdmVgIGluc3RlYWQsIGFzIHRoYXQgdG9nZ2xlcyB0aGUgaW50ZXJhY3RpdmUgc3RhdGUsIHdoZXJlLWFzXHJcbiAgICAgKiB0aGlzIGVyYXNlcyBpdCBjb21wbGV0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZXNpemUgYSBoaXQgYXJlYSwgZG9uJ3QgcmVtb3ZlIGFuZCB0aGVuIHNldCBpdCBhcyBiZWluZ1xyXG4gICAgICogaW50ZXJhY3RpdmUuIEluc3RlYWQsIGFjY2VzcyB0aGUgaGl0YXJlYSBvYmplY3QgZGlyZWN0bHkgYW5kIHJlc2l6ZSB0aGUgc2hhcGVcclxuICAgICAqIGJlaW5nIHVzZWQuIEkuZS46IGBzcHJpdGUuaW5wdXQuaGl0QXJlYS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpYCAoYXNzdW1pbmcgdGhlXHJcbiAgICAgKiBzaGFwZSBpcyBhIFJlY3RhbmdsZSwgd2hpY2ggaXQgaXMgYnkgZGVmYXVsdC4pXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNyZW1vdmVJbnRlcmFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVJbnRlcmFjdGl2ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5pbnB1dC5jbGVhcih0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG8gYmUgb3ZlcnJpZGRlbiBieSBjdXN0b20gR2FtZU9iamVjdHMuIEFsbG93cyBiYXNlIG9iamVjdHMgdG8gYmUgdXNlZCBpbiBhIFBvb2wuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gYXJnc1xyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjdG9KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuSlNPTkdhbWVPYmplY3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQ29tcG9uZW50c1RvSlNPTih0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wYXJlcyB0aGUgcmVuZGVyTWFzayB3aXRoIHRoZSByZW5kZXJGbGFncyB0byBzZWUgaWYgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHJlbmRlciBvciBub3QuXHJcbiAgICAgKiBBbHNvIGNoZWNrcyB0aGUgR2FtZSBPYmplY3QgYWdhaW5zdCB0aGUgZ2l2ZW4gQ2FtZXJhcyBleGNsdXNpb24gbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3dpbGxSZW5kZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdG8gY2hlY2sgYWdhaW5zdCB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIEdhbWUgT2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICB3aWxsUmVuZGVyOiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAhKEdhbWVPYmplY3QuUkVOREVSX01BU0sgIT09IHRoaXMucmVuZGVyRmxhZ3MgfHwgKHRoaXMuY2FtZXJhRmlsdGVyICE9PSAwICYmICh0aGlzLmNhbWVyYUZpbHRlciAmIGNhbWVyYS5pZCkpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRpc3BsYXkgbGlzdCBpbmRleCBvZiBlaXRoZXIgdGhpcyBHYW1lIE9iamVjdCwgb3IgaWYgaXQgaGFzIG9uZSxcclxuICAgICAqIGl0cyBwYXJlbnQgQ29udGFpbmVyLiBJdCB0aGVuIGl0ZXJhdGVzIHVwIHRocm91Z2ggYWxsIG9mIHRoZSBwYXJlbnQgY29udGFpbmVycyB1bnRpbCBpdCBoaXRzIHRoZVxyXG4gICAgICogcm9vdCBvZiB0aGUgZGlzcGxheSBsaXN0ICh3aGljaCBpcyBpbmRleCAwIGluIHRoZSByZXR1cm5lZCBhcnJheSkuXHJcbiAgICAgKlxyXG4gICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBJbnB1dFBsdWdpbiBidXQgYWxzbyB1c2VmdWwgaWYgeW91IHdpc2ggdG8gZmluZCBvdXQgdGhlIGRpc3BsYXkgZGVwdGggb2ZcclxuICAgICAqIHRoaXMgR2FtZSBPYmplY3QgYW5kIGFsbCBvZiBpdHMgYW5jZXN0b3JzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjZ2V0SW5kZXhMaXN0XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyW119IEFuIGFycmF5IG9mIGRpc3BsYXkgbGlzdCBwb3NpdGlvbiBpbmRleGVzLlxyXG4gICAgICovXHJcbiAgICBnZXRJbmRleExpc3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtdGhpc1xyXG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Q29udGFpbmVyO1xyXG5cclxuICAgICAgICB2YXIgaW5kZXhlcyA9IFtdO1xyXG5cclxuICAgICAgICB3aGlsZSAocGFyZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaW5kZXhlcy51bnNoaWZ0KFtwYXJlbnQuZ2V0SW5kZXgoY2hpbGQpLCBwYXJlbnQubmFtZV0pO1xyXG4gICAgICAgICAgICBpbmRleGVzLnVuc2hpZnQocGFyZW50LmdldEluZGV4KGNoaWxkKSk7XHJcblxyXG4gICAgICAgICAgICBjaGlsZCA9IHBhcmVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFyZW50LnBhcmVudENvbnRhaW5lcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Q29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpbmRleGVzLnVuc2hpZnQoW3RoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmdldEluZGV4KGNoaWxkKSwgJ3Jvb3QnXSk7XHJcbiAgICAgICAgaW5kZXhlcy51bnNoaWZ0KHRoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmdldEluZGV4KGNoaWxkKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleGVzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgR2FtZSBPYmplY3QgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgRGlzcGxheSBMaXN0IGFuZCBVcGRhdGUgTGlzdCBhbmRcclxuICAgICAqIHNldmVyaW5nIGFsbCB0aWVzIHRvIHBhcmVudCByZXNvdXJjZXMuXHJcbiAgICAgKlxyXG4gICAgICogQWxzbyByZW1vdmVzIGl0c2VsZiBmcm9tIHRoZSBJbnB1dCBNYW5hZ2VyIGFuZCBQaHlzaWNzIE1hbmFnZXIgaWYgcHJldmlvdXNseSBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIFVzZSB0aGlzIHRvIHJlbW92ZSBhIEdhbWUgT2JqZWN0IGZyb20geW91ciBnYW1lIGlmIHlvdSBkb24ndCBldmVyIHBsYW4gdG8gdXNlIGl0IGFnYWluLlxyXG4gICAgICogQXMgbG9uZyBhcyBubyByZWZlcmVuY2UgdG8gaXQgZXhpc3RzIHdpdGhpbiB5b3VyIG93biBjb2RlIGl0IHNob3VsZCBiZWNvbWUgZnJlZSBmb3JcclxuICAgICAqIGdhcmJhZ2UgY29sbGVjdGlvbiBieSB0aGUgYnJvd3Nlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3UganVzdCB3YW50IHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgYW4gb2JqZWN0IHRoZW4gbG9vayBhdCB1c2luZyB0aGVcclxuICAgICAqIEdhbWUgT2JqZWN0IFBvb2wgaW5zdGVhZCBvZiBkZXN0cm95aW5nIGl0LCBhcyBkZXN0cm95ZWQgb2JqZWN0cyBjYW5ub3QgYmUgcmVzdXJyZWN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNkZXN0cm95XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNERVNUUk9ZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tU2NlbmU9ZmFsc2VdIC0gSXMgdGhpcyBHYW1lIE9iamVjdCBiZWluZyBkZXN0cm95ZWQgYXMgdGhlIHJlc3VsdCBvZiBhIFNjZW5lIHNodXRkb3duP1xyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoZnJvbVNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmcm9tU2NlbmUgPT09IHVuZGVmaW5lZCkgeyBmcm9tU2NlbmUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICAvLyAgVGhpcyBHYW1lIE9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZFxyXG4gICAgICAgIGlmICghdGhpcy5zY2VuZSB8fCB0aGlzLmlnbm9yZURlc3Ryb3kpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wcmVEZXN0cm95KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVEZXN0cm95LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRFU1RST1ksIHRoaXMpO1xyXG5cclxuICAgICAgICB2YXIgc3lzID0gdGhpcy5zY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIGlmICghZnJvbVNjZW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3lzLmRpc3BsYXlMaXN0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgc3lzLnVwZGF0ZUxpc3QucmVtb3ZlKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzeXMuaW5wdXQuY2xlYXIodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGVsbCB0aGUgU2NlbmUgdG8gcmUtc29ydCB0aGUgY2hpbGRyZW5cclxuICAgICAgICBpZiAoIWZyb21TY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN5cy5xdWV1ZURlcHRoU29ydCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnRDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgYml0bWFzayB0aGF0IGBHYW1lT2JqZWN0LnJlbmRlckZsYWdzYCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRvIGRldGVybWluZSBpZiB0aGUgR2FtZSBPYmplY3Qgd2lsbCByZW5kZXIgb3Igbm90LlxyXG4gKlxyXG4gKiBAY29uc3RhbnQge2ludGVnZXJ9IFJFTkRFUl9NQVNLXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFxyXG4gKiBAZGVmYXVsdFxyXG4gKi9cclxuR2FtZU9iamVjdC5SRU5ERVJfTUFTSyA9IDE1O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHYW1lT2JqZWN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgR2FtZSBPYmplY3QgQ3JlYXRvciBpcyBhIFNjZW5lIHBsdWdpbiB0aGF0IGFsbG93cyB5b3UgdG8gcXVpY2tseSBjcmVhdGUgbWFueSBjb21tb25cclxuICogdHlwZXMgb2YgR2FtZSBPYmplY3RzIGFuZCByZXR1cm4gdGhlbS4gVW5saWtlIHRoZSBHYW1lIE9iamVjdCBGYWN0b3J5LCB0aGV5IGFyZSBub3QgYXV0b21hdGljYWxseVxyXG4gKiBhZGRlZCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIEdhbWUgT2JqZWN0cyBkaXJlY3RseSByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggdGhlIENyZWF0b3IgYW5kIGluamVjdCB0aGVpciBvd24gY3JlYXRpb25cclxuICogbWV0aG9kcyBpbnRvIHRoZSBjbGFzcy5cclxuICpcclxuICogQGNsYXNzIEdhbWVPYmplY3RDcmVhdG9yXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBGYWN0b3J5IGJlbG9uZ3MuXHJcbiAqL1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR2FtZU9iamVjdENyZWF0b3IgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IENyZWF0b3IgYmVsb25ncy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lLlN5c3RlbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3Ijc3lzdGVtc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIERpc3BsYXkgTGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNkaXNwbGF5TGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3R9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUxpc3Q7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBVcGRhdGUgTGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciN1cGRhdGVMaXN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0fVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3Q7XHJcblxyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub24oU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5LCBvbmx5IG9uY2UsIHdoZW4gdGhlIFNjZW5lIGlzIGZpcnN0IGNyZWF0ZWQuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI2Jvb3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlMaXN0ID0gdGhpcy5zeXN0ZW1zLmRpc3BsYXlMaXN0O1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGlzdCA9IHRoaXMuc3lzdGVtcy51cGRhdGVMaXN0O1xyXG5cclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3Ijc3RhcnRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI3NodXRkb3duXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIGJlaW5nIGRlc3Ryb3llZC5cclxuICAgICAqIFdlIG5lZWQgdG8gc2h1dGRvd24gYW5kIHRoZW4ga2lsbCBvZmYgYWxsIGV4dGVybmFsIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3IjZGVzdHJveVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLy8gIFN0YXRpYyBtZXRob2QgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSBHYW1lIE9iamVjdCBjcmVhdG9yIGZ1bmN0aW9uc1xyXG5cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZmFjdG9yeVR5cGUsIGZhY3RvcnlGdW5jdGlvbilcclxue1xyXG4gICAgaWYgKCFHYW1lT2JqZWN0Q3JlYXRvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoZmFjdG9yeVR5cGUpKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3RDcmVhdG9yLnByb3RvdHlwZVtmYWN0b3J5VHlwZV0gPSBmYWN0b3J5RnVuY3Rpb247XHJcbiAgICB9XHJcbn07XHJcblxyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZW1vdmUgPSBmdW5jdGlvbiAoZmFjdG9yeVR5cGUpXHJcbntcclxuICAgIGlmIChHYW1lT2JqZWN0Q3JlYXRvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoZmFjdG9yeVR5cGUpKVxyXG4gICAge1xyXG4gICAgICAgIGRlbGV0ZSBHYW1lT2JqZWN0Q3JlYXRvci5wcm90b3R5cGVbZmFjdG9yeVR5cGVdO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luQ2FjaGUucmVnaXN0ZXIoJ0dhbWVPYmplY3RDcmVhdG9yJywgR2FtZU9iamVjdENyZWF0b3IsICdtYWtlJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdhbWVPYmplY3RDcmVhdG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgR2FtZSBPYmplY3QgRmFjdG9yeSBpcyBhIFNjZW5lIHBsdWdpbiB0aGF0IGFsbG93cyB5b3UgdG8gcXVpY2tseSBjcmVhdGUgbWFueSBjb21tb25cclxuICogdHlwZXMgb2YgR2FtZSBPYmplY3RzIGFuZCBoYXZlIHRoZW0gYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdpdGggdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBHYW1lIE9iamVjdHMgZGlyZWN0bHkgcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIHRoZSBGYWN0b3J5IGFuZCBpbmplY3QgdGhlaXIgb3duIGNyZWF0aW9uXHJcbiAqIG1ldGhvZHMgaW50byB0aGUgY2xhc3MuXHJcbiAqXHJcbiAqIEBjbGFzcyBHYW1lT2JqZWN0RmFjdG9yeVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgRmFjdG9yeSBiZWxvbmdzLlxyXG4gKi9cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEdhbWVPYmplY3RGYWN0b3J5IChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBGYWN0b3J5IGJlbG9uZ3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3Rvcnkjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZS5TeXN0ZW1zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBzY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBEaXNwbGF5IExpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjZGlzcGxheUxpc3RcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0fVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlMaXN0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgVXBkYXRlIExpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjdXBkYXRlTGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdH1cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0O1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdCA9IHRoaXMuc3lzdGVtcy5kaXNwbGF5TGlzdDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3QgPSB0aGlzLnN5c3RlbXMudXBkYXRlTGlzdDtcclxuXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3N0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBleGlzdGluZyBHYW1lIE9iamVjdCB0byB0aGlzIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBHYW1lIE9iamVjdCByZW5kZXJzLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBEaXNwbGF5IExpc3QuXHJcbiAgICAgKiBJZiBpdCBoYXMgYSBgcHJlVXBkYXRlYCBtZXRob2QsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIFVwZGF0ZSBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I2V4aXN0aW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXApfSBjaGlsZCAtIFRoZSBjaGlsZCB0byBiZSBhZGRlZCB0byB0aGlzIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgYWRkZWQuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0aW5nOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNoaWxkLnJlbmRlckNhbnZhcyB8fCBjaGlsZC5yZW5kZXJXZWJHTClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKGNoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGlsZC5wcmVVcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpc3QuYWRkKGNoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3NodXRkb3duXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIGJlaW5nIGRlc3Ryb3llZC5cclxuICAgICAqIFdlIG5lZWQgdG8gc2h1dGRvd24gYW5kIHRoZW4ga2lsbCBvZmYgYWxsIGV4dGVybmFsIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjZGVzdHJveVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheUxpc3QgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGlzdCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBTdGF0aWMgbWV0aG9kIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgR2FtZSBPYmplY3QgZmFjdG9yeSBmdW5jdGlvbnMuXHJcbiAqIFdpdGggdGhpcyBtZXRob2QgeW91IGNhbiByZWdpc3RlciBhIGN1c3RvbSBHYW1lT2JqZWN0IGZhY3RvcnkgaW4gdGhlIEdhbWVPYmplY3RGYWN0b3J5LFxyXG4gKiBwcm92aWRpbmcgYSBuYW1lIChgZmFjdG9yeVR5cGVgKSBhbmQgdGhlIGNvbnN0cnVjdG9yIChgZmFjdG9yeUZ1bmN0aW9uYCkgaW4gb3JkZXJcclxuICogdG8gYmUgY2FsbGVkIHdoZW4geW91IGNhbGwgdG8gUGhhc2VyLlNjZW5lLmFkZFsgZmFjdG9yeVR5cGUgXSBtZXRob2QuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyXHJcbiAqIEBzdGF0aWNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5VHlwZSAtIFRoZSBrZXkgb2YgdGhlIGZhY3RvcnkgdGhhdCB5b3Ugd2lsbCB1c2UgdG8gY2FsbCB0byBQaGFzZXIuU2NlbmUuYWRkWyBmYWN0b3J5VHlwZSBdIG1ldGhvZC5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gZmFjdG9yeUZ1bmN0aW9uIC0gVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHlvdSBpbnZva2UgdG8gdGhlIFBoYXNlci5TY2VuZS5hZGQgbWV0aG9kLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZmFjdG9yeVR5cGUsIGZhY3RvcnlGdW5jdGlvbilcclxue1xyXG4gICAgaWYgKCFHYW1lT2JqZWN0RmFjdG9yeS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoZmFjdG9yeVR5cGUpKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3RGYWN0b3J5LnByb3RvdHlwZVtmYWN0b3J5VHlwZV0gPSBmYWN0b3J5RnVuY3Rpb247XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogU3RhdGljIG1ldGhvZCBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIEdhbWUgT2JqZWN0IGZhY3RvcnkgZnVuY3Rpb25zLlxyXG4gKiBXaXRoIHRoaXMgbWV0aG9kIHlvdSBjYW4gcmVtb3ZlIGEgY3VzdG9tIEdhbWVPYmplY3QgZmFjdG9yeSByZWdpc3RlcmVkIGluIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSxcclxuICogcHJvdmlkaW5nIGEgaXRzIGBmYWN0b3J5VHlwZWAuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5LnJlbW92ZVxyXG4gKiBAc3RhdGljXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeVR5cGUgLSBUaGUga2V5IG9mIHRoZSBmYWN0b3J5IHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGZyb20gdGhlIEdhbWVPYmplY3RGYWN0b3J5LlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVtb3ZlID0gZnVuY3Rpb24gKGZhY3RvcnlUeXBlKVxyXG57XHJcbiAgICBpZiAoR2FtZU9iamVjdEZhY3RvcnkucHJvdG90eXBlLmhhc093blByb3BlcnR5KGZhY3RvcnlUeXBlKSlcclxuICAgIHtcclxuICAgICAgICBkZWxldGUgR2FtZU9iamVjdEZhY3RvcnkucHJvdG90eXBlW2ZhY3RvcnlUeXBlXTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdHYW1lT2JqZWN0RmFjdG9yeScsIEdhbWVPYmplY3RGYWN0b3J5LCAnYWRkJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdhbWVPYmplY3RGYWN0b3J5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBQcm9jZXNzUXVldWUgPSByZXF1aXJlKCcuLi9zdHJ1Y3RzL1Byb2Nlc3NRdWV1ZScpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBTY2VuZUV2ZW50cyA9IHJlcXVpcmUoJy4uL3NjZW5lL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIFVwZGF0ZSBMaXN0IHBsdWdpbi5cclxuICpcclxuICogVXBkYXRlIExpc3RzIGJlbG9uZyB0byBhIFNjZW5lIGFuZCBtYWludGFpbiB0aGUgbGlzdCBHYW1lIE9iamVjdHMgdG8gYmUgdXBkYXRlZCBldmVyeSBmcmFtZS5cclxuICpcclxuICogU29tZSBvciBhbGwgb2YgdGhlc2UgR2FtZSBPYmplY3RzIG1heSBhbHNvIGJlIHBhcnQgb2YgdGhlIFNjZW5lJ3MgW0Rpc3BsYXkgTGlzdF17QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkRpc3BsYXlMaXN0fSwgZm9yIFJlbmRlcmluZy5cclxuICpcclxuICogQGNsYXNzIFVwZGF0ZUxpc3RcclxuICogQGV4dGVuZHMgUGhhc2VyLlN0cnVjdHMuUHJvY2Vzc1F1ZXVlLjxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdD5cclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IHRoZSBVcGRhdGUgTGlzdCBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIFVwZGF0ZUxpc3QgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFByb2Nlc3NRdWV1ZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFVwZGF0ZUxpc3QgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIFByb2Nlc3NRdWV1ZS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhhdCB0aGUgVXBkYXRlIExpc3QgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSdzIFN5c3RlbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCNzeXN0ZW1zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBzY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBgcGVuZGluZ2AgbGlzdCBpcyBhIHNlbGVjdGlvbiBvZiBpdGVtcyB3aGljaCBhcmUgZHVlIHRvIGJlIG1hZGUgJ2FjdGl2ZScgaW4gdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlVwZGF0ZUxpc3QjX3BlbmRpbmdcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPCo+fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBgYWN0aXZlYCBsaXN0IGlzIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIHdoaWNoIGFyZSBjb25zaWRlcmVkIGFjdGl2ZSBhbmQgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCNfYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjwqPn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFtdXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYGRlc3Ryb3lgIGxpc3QgaXMgYSBzZWxlY3Rpb24gb2YgaXRlbXMgdGhhdCB3ZXJlIGFjdGl2ZSBhbmQgYXJlIGF3YWl0aW5nIGJlaW5nIGRlc3Ryb3llZCBpbiB0aGUgbmV4dCB1cGRhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCNfZGVzdHJveVxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Kj59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhd2FpdGluZyBwcm9jZXNzaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlVwZGF0ZUxpc3QjX3RvUHJvY2Vzc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I2Jvb3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCNzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuVVBEQVRFLCB0aGlzLnNjZW5lVXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub25jZShTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHVwZGF0ZSBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIFByZS11cGRhdGVzIGV2ZXJ5IGFjdGl2ZSBHYW1lIE9iamVjdCBpbiB0aGUgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I3NjZW5lVXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICBzY2VuZVVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fYWN0aXZlO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChnYW1lT2JqZWN0LmFjdGl2ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5wcmVVcGRhdGUuY2FsbChnYW1lT2JqZWN0LCB0aW1lLCBkZWx0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBzaHV0dGluZyBkb3duLlxyXG4gICAgICogXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlVwZGF0ZUxpc3Qjc2h1dGRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgaSA9IHRoaXMuX2FjdGl2ZS5sZW5ndGg7XHJcblxyXG4gICAgICAgIHdoaWxlIChpLS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVbaV0uZGVzdHJveSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGkgPSB0aGlzLl9wZW5kaW5nLmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGktLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdbaV0uZGVzdHJveSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGkgPSB0aGlzLl9kZXN0cm95Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGktLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lbaV0uZGVzdHJveSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcyA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBbXTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95ID0gW107XHJcblxyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMucHJlVXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy5zY2VuZVVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFdlIG5lZWQgdG8gc2h1dGRvd24gYW5kIHRoZW4ga2lsbCBvZmYgYWxsIGV4dGVybmFsIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgaXRlbSB0byB0aGUgVXBkYXRlIExpc3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBpdGVtIGlzIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGxpc3QgYW5kIG1hZGUgYWN0aXZlIGluIHRoZSBuZXh0IHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB0aGF0IHdhcyBhZGRlZC5cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIFVwZGF0ZSBMaXN0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgaXRlbSBpcyBhZGRlZCB0byB0aGUgcGVuZGluZyBkZXN0cm95IGFuZCBmdWxseSByZW1vdmVkIGluIHRoZSBuZXh0IHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB0aGF0IHdhcyByZW1vdmVkLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBhY3RpdmUgaXRlbXMgZnJvbSB0aGlzIFVwZGF0ZSBMaXN0LlxyXG4gICAgICogXHJcbiAgICAgKiBBbGwgdGhlIGl0ZW1zIGFyZSBtYXJrZWQgYXMgJ3BlbmRpbmcgZGVzdHJveScgYW5kIGZ1bGx5IHJlbW92ZWQgaW4gdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlVwZGF0ZUxpc3QjcmVtb3ZlQWxsXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBVcGRhdGUgTGlzdCBvYmplY3QuXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGlzIHF1ZXVlLiBGaXJzdCBpdCB3aWxsIHByb2Nlc3MgYW55IGl0ZW1zIGF3YWl0aW5nIGRlc3RydWN0aW9uLCBhbmQgcmVtb3ZlIHRoZW0uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZW4gaXQgd2lsbCBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBpdGVtcyBwZW5kaW5nIGluc2VydGlvbiwgYW5kIG1vdmUgdGhlbSB0byBhblxyXG4gICAgICogYWN0aXZlIHN0YXRlLiBGaW5hbGx5LCBpdCB3aWxsIHJldHVybiBhIGxpc3Qgb2YgYWN0aXZlIGl0ZW1zIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdCN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0FycmF5LjwqPn0gQSBsaXN0IG9mIGFjdGl2ZSBpdGVtcy5cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBsaXN0IG9mIGFjdGl2ZSBpdGVtcy5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0aXZlIGxpc3QgYXJyYXksIG5vdCBhIGNvcHkgb2YgaXQuXHJcbiAgICAgKiBUaGVyZWZvcmUsIGJlIGNhcmVmdWwgdG8gbm90IG1vZGlmeSB0aGlzIGFycmF5IG91dHNpZGUgb2YgdGhlIFByb2Nlc3NRdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I2dldEFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7QXJyYXkuPCo+fSBBIGxpc3Qgb2YgYWN0aXZlIGl0ZW1zLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFjdGl2ZSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5VcGRhdGVMaXN0I2xlbmd0aFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqL1xyXG59KTtcclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdVcGRhdGVMaXN0JywgVXBkYXRlTGlzdCwgJ3VwZGF0ZUxpc3QnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVXBkYXRlTGlzdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCBvZiBhIEJpdG1hcFRleHQgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIFJldHVybnMgYSBCaXRtYXBUZXh0U2l6ZSBvYmplY3QgdGhhdCBjb250YWlucyBnbG9iYWwgYW5kIGxvY2FsIHZhcmlhbnRzIG9mIHRoZSBHYW1lIE9iamVjdHMgeCBhbmQgeSBjb29yZGluYXRlcyBhbmRcclxuICogaXRzIHdpZHRoIGFuZCBoZWlnaHQuXHJcbiAqXHJcbiAqIFRoZSBnbG9iYWwgcG9zaXRpb24gYW5kIHNpemUgdGFrZSBpbnRvIGFjY291bnQgdGhlIEdhbWUgT2JqZWN0J3MgcG9zaXRpb24gYW5kIHNjYWxlLlxyXG4gKlxyXG4gKiBUaGUgbG9jYWwgcG9zaXRpb24gYW5kIHNpemUganVzdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZvbnQgZGF0YS5cclxuICpcclxuICogQGZ1bmN0aW9uIEdldEJpdG1hcFRleHRTaXplXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuRHluYW1pY0JpdG1hcFRleHR8UGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQpfSBzcmMgLSBUaGUgQml0bWFwVGV4dCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uLCB3aWR0aCBhbmQgaGVpZ2h0IG9mLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb3VuZF0gLSBXaGV0aGVyIHRvIHJvdW5kIHRoZSByZXN1bHRzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3V0XSAtIE9wdGlvbmFsIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0cyBpbiwgdG8gc2F2ZSBjb25zdGFudCBvYmplY3QgY3JlYXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkJpdG1hcFRleHRTaXplfSBUaGUgY2FsY3VsYXRlZCBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgQml0bWFwVGV4dC5cclxuICovXHJcbnZhciBHZXRCaXRtYXBUZXh0U2l6ZSA9IGZ1bmN0aW9uIChzcmMsIHJvdW5kLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBvdXQgPSB7XHJcbiAgICAgICAgICAgIGxvY2FsOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdsb2JhbDoge1xyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsaW5lczoge1xyXG4gICAgICAgICAgICAgICAgc2hvcnRlc3Q6IDAsXHJcbiAgICAgICAgICAgICAgICBsb25nZXN0OiAwLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoczogbnVsbCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3cmFwcGVkVGV4dDogJycsXHJcbiAgICAgICAgICAgIHdvcmRzOiBbXSxcclxuICAgICAgICAgICAgc2NhbGVYOiAwLFxyXG4gICAgICAgICAgICBzY2FsZVk6IDBcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB0ZXh0ID0gc3JjLnRleHQ7XHJcbiAgICB2YXIgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgdmFyIG1heFdpZHRoID0gc3JjLm1heFdpZHRoO1xyXG4gICAgdmFyIHdvcmRXcmFwQ2hhckNvZGUgPSBzcmMud29yZFdyYXBDaGFyQ29kZTtcclxuXHJcbiAgICB2YXIgYnggPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgdmFyIGJ5ID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuICAgIHZhciBidyA9IDA7XHJcbiAgICB2YXIgYmggPSAwO1xyXG5cclxuICAgIHZhciBjaGFycyA9IHNyYy5mb250RGF0YS5jaGFycztcclxuICAgIHZhciBsaW5lSGVpZ2h0ID0gc3JjLmZvbnREYXRhLmxpbmVIZWlnaHQ7XHJcbiAgICB2YXIgbGV0dGVyU3BhY2luZyA9IHNyYy5sZXR0ZXJTcGFjaW5nO1xyXG5cclxuICAgIHZhciB4QWR2YW5jZSA9IDA7XHJcbiAgICB2YXIgeUFkdmFuY2UgPSAwO1xyXG5cclxuICAgIHZhciBjaGFyQ29kZSA9IDA7XHJcblxyXG4gICAgdmFyIGdseXBoID0gbnVsbDtcclxuXHJcbiAgICB2YXIgeCA9IDA7XHJcbiAgICB2YXIgeSA9IDA7XHJcblxyXG4gICAgdmFyIHNjYWxlID0gKHNyYy5mb250U2l6ZSAvIHNyYy5mb250RGF0YS5zaXplKTtcclxuICAgIHZhciBzeCA9IHNjYWxlICogc3JjLnNjYWxlWDtcclxuICAgIHZhciBzeSA9IHNjYWxlICogc3JjLnNjYWxlWTtcclxuXHJcbiAgICB2YXIgbGFzdEdseXBoID0gbnVsbDtcclxuICAgIHZhciBsYXN0Q2hhckNvZGUgPSAwO1xyXG4gICAgdmFyIGxpbmVXaWR0aHMgPSBbXTtcclxuICAgIHZhciBzaG9ydGVzdExpbmUgPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgdmFyIGxvbmdlc3RMaW5lID0gMDtcclxuICAgIHZhciBjdXJyZW50TGluZSA9IDA7XHJcbiAgICB2YXIgY3VycmVudExpbmVXaWR0aCA9IDA7XHJcblxyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgd29yZHMgPSBbXTtcclxuICAgIHZhciBjdXJyZW50ID0gbnVsbDtcclxuXHJcbiAgICAvLyAgU2NhbiBmb3IgYnJlYWNoIG9mIG1heFdpZHRoIGFuZCBpbnNlcnQgY2FycmlhZ2UtcmV0dXJuc1xyXG4gICAgaWYgKG1heFdpZHRoID4gMClcclxuICAgIHtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGV4dExlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hhckNvZGUgPT09IDEwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogY3VycmVudC53b3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpOiBjdXJyZW50LmksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQueCAqIHN4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBjdXJyZW50LnkgKiBzeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdzogY3VycmVudC53ICogc3gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGN1cnJlbnQuaCAqIHN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB4QWR2YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB5QWR2YW5jZSArPSBsaW5lSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgbGFzdEdseXBoID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ2x5cGggPSBjaGFyc1tjaGFyQ29kZV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWdseXBoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxhc3RHbHlwaCAhPT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdseXBoS2VybmluZ09mZnNldCA9IGdseXBoLmtlcm5pbmdbbGFzdENoYXJDb2RlXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNoYXJDb2RlID09PSB3b3JkV3JhcENoYXJDb2RlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZDogY3VycmVudC53b3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpOiBjdXJyZW50LmksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQueCAqIHN4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBjdXJyZW50LnkgKiBzeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdzogY3VycmVudC53ICogc3gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGN1cnJlbnQuaCAqIHN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcjogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIFdlJ3JlIHN0YXJ0aW5nIGEgbmV3IHdvcmQsIHJlY29yZGluZyB0aGUgc3RhcnRpbmcgaW5kZXgsIGV0Y1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB7IHdvcmQ6ICcnLCBpOiBpLCB4OiB4QWR2YW5jZSwgeTogeUFkdmFuY2UsIHc6IDAsIGg6IGxpbmVIZWlnaHQsIGNyOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnQud29yZCA9IGN1cnJlbnQud29yZC5jb25jYXQodGV4dFtpXSk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LncgKz0gZ2x5cGgueE9mZnNldCArIGdseXBoLnhBZHZhbmNlICsgKChnbHlwaEtlcm5pbmdPZmZzZXQgIT09IHVuZGVmaW5lZCkgPyBnbHlwaEtlcm5pbmdPZmZzZXQgOiAwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeEFkdmFuY2UgKz0gZ2x5cGgueEFkdmFuY2UgKyBsZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgICAgICBsYXN0R2x5cGggPSBnbHlwaDtcclxuICAgICAgICAgICAgbGFzdENoYXJDb2RlID0gY2hhckNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgTGFzdCB3b3JkXHJcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3b3Jkcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHdvcmQ6IGN1cnJlbnQud29yZCxcclxuICAgICAgICAgICAgICAgIGk6IGN1cnJlbnQuaSxcclxuICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQueCAqIHN4LFxyXG4gICAgICAgICAgICAgICAgeTogY3VycmVudC55ICogc3ksXHJcbiAgICAgICAgICAgICAgICB3OiBjdXJyZW50LncgKiBzeCxcclxuICAgICAgICAgICAgICAgIGg6IGN1cnJlbnQuaCAqIHN5LFxyXG4gICAgICAgICAgICAgICAgY3I6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFJlc2V0IGZvciB0aGUgbmV4dCBsb29wXHJcbiAgICAgICAgeEFkdmFuY2UgPSAwO1xyXG4gICAgICAgIHlBZHZhbmNlID0gMDtcclxuICAgICAgICBsYXN0R2x5cGggPSBudWxsO1xyXG4gICAgICAgIGxhc3RDaGFyQ29kZSA9IDA7XHJcblxyXG4gICAgICAgIC8vICBMb29wIHRocm91Z2ggdGhlIHdvcmRzIGFycmF5IGFuZCBzZWUgaWYgd2UndmUgZ290IGFueSA+IG1heFdpZHRoXHJcbiAgICAgICAgdmFyIHByZXY7XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XHJcbiAgICAgICAgdmFyIGNycyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSB3b3Jkc1tpXTtcclxuICAgICAgICAgICAgdmFyIGxlZnQgPSBlbnRyeS54O1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSBlbnRyeS54ICsgZW50cnkudztcclxuXHJcbiAgICAgICAgICAgIGlmIChwcmV2KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGxlZnQgLSAocHJldi54ICsgcHJldi53KTtcclxuXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZWZ0IC0gKGRpZmYgKyBwcmV2LncpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByZXYgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgY2hlY2tMZWZ0ID0gbGVmdCAtIG9mZnNldDtcclxuICAgICAgICAgICAgdmFyIGNoZWNrUmlnaHQgPSByaWdodCAtIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjaGVja0xlZnQgPiBtYXhXaWR0aCB8fCBjaGVja1JpZ2h0ID4gbWF4V2lkdGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNycy5wdXNoKGVudHJ5LmkgLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuY3IpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3JzLnB1c2goZW50cnkuaSArIGVudHJ5LndvcmQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gZW50cnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuY3IpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNycy5wdXNoKGVudHJ5LmkgKyBlbnRyeS53b3JkLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIHByZXYgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgc3RyaW5nSW5zZXJ0ID0gZnVuY3Rpb24gKHN0ciwgaW5kZXgsIHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgaW5kZXgpICsgdmFsdWUgKyBzdHIuc3Vic3RyKGluZGV4ICsgMSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gY3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHF1b3Rlc1xyXG4gICAgICAgICAgICB0ZXh0ID0gc3RyaW5nSW5zZXJ0KHRleHQsIGNyc1tpXSwgXCJcXG5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvdXQud3JhcHBlZFRleHQgPSB0ZXh0O1xyXG5cclxuICAgICAgICB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcblxyXG4gICAgICAgIC8vICBSZWNhbGN1bGF0ZWQgaW4gdGhlIG5leHQgbG9vcFxyXG4gICAgICAgIHdvcmRzID0gW107XHJcbiAgICAgICAgY3VycmVudCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRleHRMZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKTtcclxuXHJcbiAgICAgICAgaWYgKGNoYXJDb2RlID09PSAxMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB3b3JkOiBjdXJyZW50LndvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgaTogY3VycmVudC5pLFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnQueCAqIHN4LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGN1cnJlbnQueSAqIHN5LFxyXG4gICAgICAgICAgICAgICAgICAgIHc6IGN1cnJlbnQudyAqIHN4LFxyXG4gICAgICAgICAgICAgICAgICAgIGg6IGN1cnJlbnQuaCAqIHN5XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeEFkdmFuY2UgPSAwO1xyXG4gICAgICAgICAgICB5QWR2YW5jZSArPSBsaW5lSGVpZ2h0O1xyXG4gICAgICAgICAgICBsYXN0R2x5cGggPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgbGluZVdpZHRoc1tjdXJyZW50TGluZV0gPSBjdXJyZW50TGluZVdpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggPiBsb25nZXN0TGluZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbG9uZ2VzdExpbmUgPSBjdXJyZW50TGluZVdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aCA8IHNob3J0ZXN0TGluZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2hvcnRlc3RMaW5lID0gY3VycmVudExpbmVXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudExpbmUrKztcclxuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IDA7XHJcblxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdseXBoID0gY2hhcnNbY2hhckNvZGVdO1xyXG5cclxuICAgICAgICBpZiAoIWdseXBoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB4ID0geEFkdmFuY2U7XHJcbiAgICAgICAgeSA9IHlBZHZhbmNlO1xyXG5cclxuICAgICAgICBpZiAobGFzdEdseXBoICE9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGtlcm5pbmdPZmZzZXQgPSBnbHlwaC5rZXJuaW5nW2xhc3RDaGFyQ29kZV07XHJcblxyXG4gICAgICAgICAgICB4ICs9IChrZXJuaW5nT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8ga2VybmluZ09mZnNldCA6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnggPiB4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnggPSB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJ5ID4geSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ5ID0geTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBndyA9IHggKyBnbHlwaC54QWR2YW5jZTtcclxuICAgICAgICB2YXIgZ2ggPSB5ICsgbGluZUhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKGJ3IDwgZ3cpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidyA9IGd3O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJoIDwgZ2gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBiaCA9IGdoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYXJDb2RlID09PSB3b3JkV3JhcENoYXJDb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHdvcmQ6IGN1cnJlbnQud29yZCxcclxuICAgICAgICAgICAgICAgICAgICBpOiBjdXJyZW50LmksXHJcbiAgICAgICAgICAgICAgICAgICAgeDogY3VycmVudC54ICogc3gsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogY3VycmVudC55ICogc3ksXHJcbiAgICAgICAgICAgICAgICAgICAgdzogY3VycmVudC53ICogc3gsXHJcbiAgICAgICAgICAgICAgICAgICAgaDogY3VycmVudC5oICogc3lcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFdlJ3JlIHN0YXJ0aW5nIGEgbmV3IHdvcmQsIHJlY29yZGluZyB0aGUgc3RhcnRpbmcgaW5kZXgsIGV0Y1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHsgd29yZDogJycsIGk6IGksIHg6IHhBZHZhbmNlLCB5OiB5QWR2YW5jZSwgdzogMCwgaDogbGluZUhlaWdodCB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50LndvcmQgPSBjdXJyZW50LndvcmQuY29uY2F0KHRleHRbaV0pO1xyXG4gICAgICAgICAgICBjdXJyZW50LncgKz0gZ2x5cGgueE9mZnNldCArIGdseXBoLnhBZHZhbmNlICsgKChrZXJuaW5nT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8ga2VybmluZ09mZnNldCA6IDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeEFkdmFuY2UgKz0gZ2x5cGgueEFkdmFuY2UgKyBsZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgIGxhc3RHbHlwaCA9IGdseXBoO1xyXG4gICAgICAgIGxhc3RDaGFyQ29kZSA9IGNoYXJDb2RlO1xyXG4gICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSBndyAqIHNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBMYXN0IHdvcmRcclxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKVxyXG4gICAge1xyXG4gICAgICAgIHdvcmRzLnB1c2goe1xyXG4gICAgICAgICAgICB3b3JkOiBjdXJyZW50LndvcmQsXHJcbiAgICAgICAgICAgIGk6IGN1cnJlbnQuaSxcclxuICAgICAgICAgICAgeDogY3VycmVudC54ICogc3gsXHJcbiAgICAgICAgICAgIHk6IGN1cnJlbnQueSAqIHN5LFxyXG4gICAgICAgICAgICB3OiBjdXJyZW50LncgKiBzeCxcclxuICAgICAgICAgICAgaDogY3VycmVudC5oICogc3lcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsaW5lV2lkdGhzW2N1cnJlbnRMaW5lXSA9IGN1cnJlbnRMaW5lV2lkdGg7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggPiBsb25nZXN0TGluZSlcclxuICAgIHtcclxuICAgICAgICBsb25nZXN0TGluZSA9IGN1cnJlbnRMaW5lV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggPCBzaG9ydGVzdExpbmUpXHJcbiAgICB7XHJcbiAgICAgICAgc2hvcnRlc3RMaW5lID0gY3VycmVudExpbmVXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbG9jYWwgPSBvdXQubG9jYWw7XHJcbiAgICB2YXIgZ2xvYmFsID0gb3V0Lmdsb2JhbDtcclxuICAgIHZhciBsaW5lcyA9IG91dC5saW5lcztcclxuXHJcbiAgICBsb2NhbC54ID0gYnggKiBzY2FsZTtcclxuICAgIGxvY2FsLnkgPSBieSAqIHNjYWxlO1xyXG4gICAgbG9jYWwud2lkdGggPSBidyAqIHNjYWxlO1xyXG4gICAgbG9jYWwuaGVpZ2h0ID0gYmggKiBzY2FsZTtcclxuXHJcbiAgICBnbG9iYWwueCA9IChzcmMueCAtIHNyYy5kaXNwbGF5T3JpZ2luWCkgKyAoYnggKiBzeCk7XHJcbiAgICBnbG9iYWwueSA9IChzcmMueSAtIHNyYy5kaXNwbGF5T3JpZ2luWSkgKyAoYnkgKiBzeSk7XHJcbiAgICBnbG9iYWwud2lkdGggPSBidyAqIHN4O1xyXG4gICAgZ2xvYmFsLmhlaWdodCA9IGJoICogc3k7XHJcblxyXG4gICAgbGluZXMuc2hvcnRlc3QgPSBzaG9ydGVzdExpbmU7XHJcbiAgICBsaW5lcy5sb25nZXN0ID0gbG9uZ2VzdExpbmU7XHJcbiAgICBsaW5lcy5sZW5ndGhzID0gbGluZVdpZHRocztcclxuXHJcbiAgICBpZiAocm91bmQpXHJcbiAgICB7XHJcbiAgICAgICAgbG9jYWwueCA9IE1hdGgucm91bmQobG9jYWwueCk7XHJcbiAgICAgICAgbG9jYWwueSA9IE1hdGgucm91bmQobG9jYWwueSk7XHJcbiAgICAgICAgbG9jYWwud2lkdGggPSBNYXRoLnJvdW5kKGxvY2FsLndpZHRoKTtcclxuICAgICAgICBsb2NhbC5oZWlnaHQgPSBNYXRoLnJvdW5kKGxvY2FsLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGdsb2JhbC54ID0gTWF0aC5yb3VuZChnbG9iYWwueCk7XHJcbiAgICAgICAgZ2xvYmFsLnkgPSBNYXRoLnJvdW5kKGdsb2JhbC55KTtcclxuICAgICAgICBnbG9iYWwud2lkdGggPSBNYXRoLnJvdW5kKGdsb2JhbC53aWR0aCk7XHJcbiAgICAgICAgZ2xvYmFsLmhlaWdodCA9IE1hdGgucm91bmQoZ2xvYmFsLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGxpbmVzLnNob3J0ZXN0ID0gTWF0aC5yb3VuZChzaG9ydGVzdExpbmUpO1xyXG4gICAgICAgIGxpbmVzLmxvbmdlc3QgPSBNYXRoLnJvdW5kKGxvbmdlc3RMaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBvdXQud29yZHMgPSB3b3JkcztcclxuICAgIG91dC5saW5lcy5oZWlnaHQgPSBsaW5lSGVpZ2h0O1xyXG4gICAgb3V0LnNjYWxlWCA9IHNyYy5zY2FsZVg7XHJcbiAgICBvdXQuc2NhbGVZID0gc3JjLnNjYWxlWTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRCaXRtYXBUZXh0U2l6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUGFyc2VYTUxCaXRtYXBGb250ID0gcmVxdWlyZSgnLi9QYXJzZVhNTEJpdG1hcEZvbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBhbiBYTUwgQml0bWFwIEZvbnQgZnJvbSBhbiBBdGxhcy5cclxuICpcclxuICogQWRkcyB0aGUgcGFyc2VkIEJpdG1hcCBGb250IGRhdGEgdG8gdGhlIGNhY2hlIHdpdGggdGhlIGBmb250TmFtZWAga2V5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGFyc2VGcm9tQXRsYXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byBwYXJzZSB0aGUgQml0bWFwIEZvbnQgZm9yLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udE5hbWUgLSBUaGUga2V5IG9mIHRoZSBmb250IHRvIGFkZCB0byB0aGUgQml0bWFwIEZvbnQgY2FjaGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlS2V5IC0gVGhlIGtleSBvZiB0aGUgQml0bWFwRm9udCdzIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcmFtZUtleSAtIFRoZSBrZXkgb2YgdGhlIEJpdG1hcEZvbnQgdGV4dHVyZSdzIGZyYW1lLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30geG1sS2V5IC0gVGhlIGtleSBvZiB0aGUgWE1MIGRhdGEgb2YgdGhlIGZvbnQgdG8gcGFyc2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3hTcGFjaW5nXSAtIFRoZSB4LWF4aXMgc3BhY2luZyB0byBhZGQgYmV0d2VlbiBlYWNoIGxldHRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbeVNwYWNpbmddIC0gVGhlIHktYXhpcyBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGluZSBoZWlnaHQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxyXG4gKi9cclxudmFyIFBhcnNlRnJvbUF0bGFzID0gZnVuY3Rpb24gKHNjZW5lLCBmb250TmFtZSwgdGV4dHVyZUtleSwgZnJhbWVLZXksIHhtbEtleSwgeFNwYWNpbmcsIHlTcGFjaW5nKVxyXG57XHJcbiAgICB2YXIgZnJhbWUgPSBzY2VuZS5zeXMudGV4dHVyZXMuZ2V0RnJhbWUodGV4dHVyZUtleSwgZnJhbWVLZXkpO1xyXG4gICAgdmFyIHhtbCA9IHNjZW5lLnN5cy5jYWNoZS54bWwuZ2V0KHhtbEtleSk7XHJcblxyXG4gICAgaWYgKGZyYW1lICYmIHhtbClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YSA9IFBhcnNlWE1MQml0bWFwRm9udCh4bWwsIHhTcGFjaW5nLCB5U3BhY2luZywgZnJhbWUpO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuY2FjaGUuYml0bWFwRm9udC5hZGQoZm9udE5hbWUsIHsgZGF0YTogZGF0YSwgdGV4dHVyZTogdGV4dHVyZUtleSwgZnJhbWU6IGZyYW1lS2V5IH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlRnJvbUF0bGFzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhIFJldHJvIEZvbnQgY29uZmlndXJhdGlvbiBvYmplY3Qgc28geW91IGNhbiBwYXNzIGl0IHRvIHRoZSBCaXRtYXBUZXh0IGNvbnN0cnVjdG9yXHJcbiAqIGFuZCBjcmVhdGUgYSBCaXRtYXBUZXh0IG9iamVjdCB1c2luZyBhIGZpeGVkLXdpZHRoIHJldHJvIGZvbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2FtZU9iamVjdHMuUmV0cm9Gb250LlBhcnNlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgUGhhc2VyIFNjZW5lLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LlJldHJvRm9udENvbmZpZ30gY29uZmlnIC0gVGhlIGZvbnQgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge29iamVjdH0gQSBwYXJzZWQgQml0bWFwIEZvbnQgZGF0YSBlbnRyeSBmb3IgdGhlIEJpdG1hcCBGb250IGNhY2hlLlxyXG4gKi9cclxudmFyIFBhcnNlUmV0cm9Gb250ID0gZnVuY3Rpb24gKHNjZW5lLCBjb25maWcpXHJcbntcclxuICAgIHZhciB3ID0gY29uZmlnLndpZHRoO1xyXG4gICAgdmFyIGggPSBjb25maWcuaGVpZ2h0O1xyXG4gICAgdmFyIGN4ID0gTWF0aC5mbG9vcih3IC8gMik7XHJcbiAgICB2YXIgY3kgPSBNYXRoLmZsb29yKGggLyAyKTtcclxuICAgIHZhciBsZXR0ZXJzID0gR2V0VmFsdWUoY29uZmlnLCAnY2hhcnMnLCAnJyk7XHJcblxyXG4gICAgaWYgKGxldHRlcnMgPT09ICcnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIga2V5ID0gR2V0VmFsdWUoY29uZmlnLCAnaW1hZ2UnLCAnJyk7XHJcbiAgICB2YXIgb2Zmc2V0WCA9IEdldFZhbHVlKGNvbmZpZywgJ29mZnNldC54JywgMCk7XHJcbiAgICB2YXIgb2Zmc2V0WSA9IEdldFZhbHVlKGNvbmZpZywgJ29mZnNldC55JywgMCk7XHJcbiAgICB2YXIgc3BhY2luZ1ggPSBHZXRWYWx1ZShjb25maWcsICdzcGFjaW5nLngnLCAwKTtcclxuICAgIHZhciBzcGFjaW5nWSA9IEdldFZhbHVlKGNvbmZpZywgJ3NwYWNpbmcueScsIDApO1xyXG4gICAgdmFyIGxpbmVTcGFjaW5nID0gR2V0VmFsdWUoY29uZmlnLCAnbGluZVNwYWNpbmcnLCAwKTtcclxuXHJcbiAgICB2YXIgY2hhcnNQZXJSb3cgPSBHZXRWYWx1ZShjb25maWcsICdjaGFyc1BlclJvdycsIG51bGwpO1xyXG5cclxuICAgIGlmIChjaGFyc1BlclJvdyA9PT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICBjaGFyc1BlclJvdyA9IHNjZW5lLnN5cy50ZXh0dXJlcy5nZXRGcmFtZShrZXkpLndpZHRoIC8gdztcclxuXHJcbiAgICAgICAgaWYgKGNoYXJzUGVyUm93ID4gbGV0dGVycy5sZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGFyc1BlclJvdyA9IGxldHRlcnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgeCA9IG9mZnNldFg7XHJcbiAgICB2YXIgeSA9IG9mZnNldFk7XHJcblxyXG4gICAgdmFyIGRhdGEgPSB7XHJcbiAgICAgICAgcmV0cm9Gb250OiB0cnVlLFxyXG4gICAgICAgIGZvbnQ6IGtleSxcclxuICAgICAgICBzaXplOiB3LFxyXG4gICAgICAgIGxpbmVIZWlnaHQ6IGggKyBsaW5lU3BhY2luZyxcclxuICAgICAgICBjaGFyczoge31cclxuICAgIH07XHJcblxyXG4gICAgdmFyIHIgPSAwO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV0dGVycy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICAvLyB2YXIgbm9kZSA9IGxldHRlcnNbaV07XHJcblxyXG4gICAgICAgIHZhciBjaGFyQ29kZSA9IGxldHRlcnMuY2hhckNvZGVBdChpKTtcclxuXHJcbiAgICAgICAgZGF0YS5jaGFyc1tjaGFyQ29kZV0gPVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeDogeCxcclxuICAgICAgICAgICAgeTogeSxcclxuICAgICAgICAgICAgd2lkdGg6IHcsXHJcbiAgICAgICAgICAgIGhlaWdodDogaCxcclxuICAgICAgICAgICAgY2VudGVyWDogY3gsXHJcbiAgICAgICAgICAgIGNlbnRlclk6IGN5LFxyXG4gICAgICAgICAgICB4T2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICB5T2Zmc2V0OiAwLFxyXG4gICAgICAgICAgICB4QWR2YW5jZTogdyxcclxuICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgIGtlcm5pbmc6IHt9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcisrO1xyXG5cclxuICAgICAgICBpZiAociA9PT0gY2hhcnNQZXJSb3cpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByID0gMDtcclxuICAgICAgICAgICAgeCA9IG9mZnNldFg7XHJcbiAgICAgICAgICAgIHkgKz0gaCArIHNwYWNpbmdZO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4ICs9IHcgKyBzcGFjaW5nWDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGVudHJ5ID0ge1xyXG4gICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgZnJhbWU6IG51bGwsXHJcbiAgICAgICAgdGV4dHVyZToga2V5XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBlbnRyeTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VSZXRyb0ZvbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlYWQgYW4gaW50ZWdlciB2YWx1ZSBmcm9tIGFuIFhNTCBOb2RlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gZ2V0VmFsdWVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBYTUwgTm9kZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUgdG8gcmVhZC5cclxuICpcclxuICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHBhcnNlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFZhbHVlIChub2RlLCBhdHRyaWJ1dGUpXHJcbntcclxuICAgIHJldHVybiBwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpLCAxMCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBhbiBYTUwgZm9udCB0byBCaXRtYXAgRm9udCBkYXRhIGZvciB0aGUgQml0bWFwIEZvbnQgY2FjaGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQYXJzZVhNTEJpdG1hcEZvbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7WE1MRG9jdW1lbnR9IHhtbCAtIFRoZSBYTUwgRG9jdW1lbnQgdG8gcGFyc2UgdGhlIGZvbnQgZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbeFNwYWNpbmc9MF0gLSBUaGUgeC1heGlzIHNwYWNpbmcgdG8gYWRkIGJldHdlZW4gZWFjaCBsZXR0ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3lTcGFjaW5nPTBdIC0gVGhlIHktYXhpcyBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGluZSBoZWlnaHQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBbZnJhbWVdIC0gVGhlIHRleHR1cmUgZnJhbWUgdG8gdGFrZSBpbnRvIGFjY291bnQgd2hpbGUgcGFyc2luZy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkJpdG1hcFRleHQuQml0bWFwRm9udERhdGF9IFRoZSBwYXJzZWQgQml0bWFwIEZvbnQgZGF0YS5cclxuICovXHJcbnZhciBQYXJzZVhNTEJpdG1hcEZvbnQgPSBmdW5jdGlvbiAoeG1sLCB4U3BhY2luZywgeVNwYWNpbmcsIGZyYW1lKVxyXG57XHJcbiAgICBpZiAoeFNwYWNpbmcgPT09IHVuZGVmaW5lZCkgeyB4U3BhY2luZyA9IDA7IH1cclxuICAgIGlmICh5U3BhY2luZyA9PT0gdW5kZWZpbmVkKSB7IHlTcGFjaW5nID0gMDsgfVxyXG5cclxuICAgIHZhciBkYXRhID0ge307XHJcbiAgICB2YXIgaW5mbyA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5mbycpWzBdO1xyXG4gICAgdmFyIGNvbW1vbiA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29tbW9uJylbMF07XHJcblxyXG4gICAgZGF0YS5mb250ID0gaW5mby5nZXRBdHRyaWJ1dGUoJ2ZhY2UnKTtcclxuICAgIGRhdGEuc2l6ZSA9IGdldFZhbHVlKGluZm8sICdzaXplJyk7XHJcbiAgICBkYXRhLmxpbmVIZWlnaHQgPSBnZXRWYWx1ZShjb21tb24sICdsaW5lSGVpZ2h0JykgKyB5U3BhY2luZztcclxuICAgIGRhdGEuY2hhcnMgPSB7fTtcclxuXHJcbiAgICB2YXIgbGV0dGVycyA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2hhcicpO1xyXG5cclxuICAgIHZhciBhZGp1c3RGb3JUcmltID0gKGZyYW1lICE9PSB1bmRlZmluZWQgJiYgZnJhbWUudHJpbW1lZCk7XHJcblxyXG4gICAgaWYgKGFkanVzdEZvclRyaW0pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRvcCA9IGZyYW1lLmhlaWdodDtcclxuICAgICAgICB2YXIgbGVmdCA9IGZyYW1lLndpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGV0dGVycy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgbm9kZSA9IGxldHRlcnNbaV07XHJcblxyXG4gICAgICAgIHZhciBjaGFyQ29kZSA9IGdldFZhbHVlKG5vZGUsICdpZCcpO1xyXG4gICAgICAgIHZhciBneCA9IGdldFZhbHVlKG5vZGUsICd4Jyk7XHJcbiAgICAgICAgdmFyIGd5ID0gZ2V0VmFsdWUobm9kZSwgJ3knKTtcclxuICAgICAgICB2YXIgZ3cgPSBnZXRWYWx1ZShub2RlLCAnd2lkdGgnKTtcclxuICAgICAgICB2YXIgZ2ggPSBnZXRWYWx1ZShub2RlLCAnaGVpZ2h0Jyk7XHJcblxyXG4gICAgICAgIC8vICBIYW5kbGUgZnJhbWUgdHJpbSBpc3N1ZXNcclxuXHJcbiAgICAgICAgaWYgKGFkanVzdEZvclRyaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZ3ggPCBsZWZ0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0ID0gZ3g7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChneSA8IHRvcClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdG9wID0gZ3k7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGEuY2hhcnNbY2hhckNvZGVdID1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHg6IGd4LFxyXG4gICAgICAgICAgICB5OiBneSxcclxuICAgICAgICAgICAgd2lkdGg6IGd3LFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGdoLFxyXG4gICAgICAgICAgICBjZW50ZXJYOiBNYXRoLmZsb29yKGd3IC8gMiksXHJcbiAgICAgICAgICAgIGNlbnRlclk6IE1hdGguZmxvb3IoZ2ggLyAyKSxcclxuICAgICAgICAgICAgeE9mZnNldDogZ2V0VmFsdWUobm9kZSwgJ3hvZmZzZXQnKSxcclxuICAgICAgICAgICAgeU9mZnNldDogZ2V0VmFsdWUobm9kZSwgJ3lvZmZzZXQnKSxcclxuICAgICAgICAgICAgeEFkdmFuY2U6IGdldFZhbHVlKG5vZGUsICd4YWR2YW5jZScpICsgeFNwYWNpbmcsXHJcbiAgICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgICBrZXJuaW5nOiB7fVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFkanVzdEZvclRyaW0gJiYgdG9wICE9PSAwICYmIGxlZnQgIT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE5vdyB3ZSBrbm93IHRoZSB0b3AgYW5kIGxlZnQgY29vcmRpbmF0ZXMgb2YgdGhlIGdseXBocyBpbiB0aGUgb3JpZ2luYWwgZGF0YVxyXG4gICAgICAgIC8vICBzbyB3ZSBjYW4gd29yayBvdXQgaG93IG11Y2ggdG8gYWRqdXN0IHRoZSBnbHlwaHMgYnlcclxuXHJcbiAgICAgICAgZm9yICh2YXIgY29kZSBpbiBkYXRhLmNoYXJzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGdseXBoID0gZGF0YS5jaGFyc1tjb2RlXTtcclxuXHJcbiAgICAgICAgICAgIGdseXBoLnggLT0gZnJhbWUueDtcclxuICAgICAgICAgICAgZ2x5cGgueSAtPSBmcmFtZS55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIga2VybmluZ3MgPSB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2tlcm5pbmcnKTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwga2VybmluZ3MubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGtlcm4gPSBrZXJuaW5nc1tpXTtcclxuXHJcbiAgICAgICAgdmFyIGZpcnN0ID0gZ2V0VmFsdWUoa2VybiwgJ2ZpcnN0Jyk7XHJcbiAgICAgICAgdmFyIHNlY29uZCA9IGdldFZhbHVlKGtlcm4sICdzZWNvbmQnKTtcclxuICAgICAgICB2YXIgYW1vdW50ID0gZ2V0VmFsdWUoa2VybiwgJ2Ftb3VudCcpO1xyXG5cclxuICAgICAgICBkYXRhLmNoYXJzW3NlY29uZF0ua2VybmluZ1tmaXJzdF0gPSBhbW91bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlWE1MQml0bWFwRm9udDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUkVUUk9fRk9OVF9DT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5SZXRyb0ZvbnRcclxuICogQHNpbmNlIDMuNi4wXHJcbiAqL1xyXG5cclxudmFyIFJldHJvRm9udCA9IHsgUGFyc2U6IHJlcXVpcmUoJy4vUGFyc2VSZXRyb0ZvbnQnKSB9O1xyXG5cclxuLy8gICBNZXJnZSBpbiB0aGUgY29uc3RzXHJcblJldHJvRm9udCA9IEV4dGVuZChmYWxzZSwgUmV0cm9Gb250LCBSRVRST19GT05UX0NPTlNUKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmV0cm9Gb250O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSRVRST19GT05UX0NPTlNUID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCBTZXQgMSA9ICAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZXRyb0ZvbnQuVEVYVF9TRVQxXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuNi4wXHJcbiAgICAgKi9cclxuICAgIFRFWFRfU0VUMTogJyAhXCIjJCUmXFwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+JyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgU2V0IDIgPSAgIVwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJldHJvRm9udC5URVhUX1NFVDJcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQyOiAnICFcIiMkJSZcXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCBTZXQgMyA9IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSBcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJldHJvRm9udC5URVhUX1NFVDNcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQzOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5ICcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IFNldCA0ID0gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVogMDEyMzQ1Njc4OVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmV0cm9Gb250LlRFWFRfU0VUNFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBzaW5jZSAzLjYuMFxyXG4gICAgICovXHJcbiAgICBURVhUX1NFVDQ6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAwMTIzNDU2Nzg5JyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgU2V0IDUgPSBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi4sLygpICchPy0qOjAxMjM0NTY3ODlcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJldHJvRm9udC5URVhUX1NFVDVcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQ1OiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVouLC8oKSBcXCchPy0qOjAxMjM0NTY3ODknLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCBTZXQgNiA9IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIT86OzAxMjM0NTY3ODlcIigpLC0uJyBcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJldHJvRm9udC5URVhUX1NFVDZcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQ2OiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVohPzo7MDEyMzQ1Njc4OVwiKCksLS5cXCcgJyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgU2V0IDcgPSBBR01TWSs6NEJITlRaITs1Q0lPVS4/MDZESlBWLCgxN0VLUVdcIikyOEZMUlgtJzM5XHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZXRyb0ZvbnQuVEVYVF9TRVQ3XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuNi4wXHJcbiAgICAgKi9cclxuICAgIFRFWFRfU0VUNzogJ0FHTVNZKzo0QkhOVFohOzVDSU9VLj8wNkRKUFYsKDE3RUtRV1wiKTI4RkxSWC1cXCczOScsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IFNldCA4ID0gMDEyMzQ1Njc4OSAuQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJldHJvRm9udC5URVhUX1NFVDhcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQ4OiAnMDEyMzQ1Njc4OSAuQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCBTZXQgOSA9IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaKCktMDEyMzQ1Njc4OS46LCdcIj8hXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZXRyb0ZvbnQuVEVYVF9TRVQ5XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuNi4wXHJcbiAgICAgKi9cclxuICAgIFRFWFRfU0VUOTogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaKCktMDEyMzQ1Njc4OS46LFxcJ1wiPyEnLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCBTZXQgMTAgPSBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmV0cm9Gb250LlRFWFRfU0VUMTBcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQxMDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRleHQgU2V0IDExID0gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVouLFwiLSshPygpJzo7MDEyMzQ1Njc4OVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmV0cm9Gb250LlRFWFRfU0VUMTFcclxuICAgICAqIEBzaW5jZSAzLjYuMFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgVEVYVF9TRVQxMTogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLixcIi0rIT8oKVxcJzo7MDEyMzQ1Njc4OSdcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJFVFJPX0ZPTlRfQ09OU1Q7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJpdG1hcFRleHQgPSByZXF1aXJlKCcuLi9zdGF0aWMvQml0bWFwVGV4dCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgUmVuZGVyID0gcmVxdWlyZSgnLi9EeW5hbWljQml0bWFwVGV4dFJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQml0bWFwVGV4dCBvYmplY3RzIHdvcmsgYnkgdGFraW5nIGEgdGV4dHVyZSBmaWxlIGFuZCBhbiBYTUwgb3IgSlNPTiBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBmb250IHN0cnVjdHVyZS5cclxuICogXHJcbiAqIER1cmluZyByZW5kZXJpbmcgZm9yIGVhY2ggbGV0dGVyIG9mIHRoZSB0ZXh0IGlzIHJlbmRlcmVkIHRvIHRoZSBkaXNwbGF5LCBwcm9wb3J0aW9uYWxseSBzcGFjZWQgb3V0IGFuZCBhbGlnbmVkIHRvXHJcbiAqIG1hdGNoIHRoZSBmb250IHN0cnVjdHVyZS5cclxuICogXHJcbiAqIER5bmFtaWMgQml0bWFwIFRleHQgb2JqZWN0cyBhcmUgZGlmZmVyZW50IGZyb20gU3RhdGljIEJpdG1hcCBUZXh0IGluIHRoYXQgdGhleSBpbnZva2UgYSBjYWxsYmFjayBmb3IgZWFjaFxyXG4gKiBsZXR0ZXIgYmVpbmcgcmVuZGVyZWQgZHVyaW5nIHRoZSByZW5kZXIgcGFzcy4gVGhpcyBjYWxsYmFjayBhbGxvd3MgeW91IHRvIG1hbmlwdWxhdGUgdGhlIHByb3BlcnRpZXMgb2ZcclxuICogZWFjaCBsZXR0ZXIgYmVpbmcgcmVuZGVyZWQsIHN1Y2ggYXMgaXRzIHBvc2l0aW9uLCBzY2FsZSBvciB0aW50LCBhbGxvd2luZyB5b3UgdG8gY3JlYXRlIGludGVyZXN0aW5nIGVmZmVjdHNcclxuICogbGlrZSBqaWdnbGluZyB0ZXh0LCB3aGljaCBjYW4ndCBiZSBkb25lIHdpdGggU3RhdGljIHRleHQuIFRoaXMgbWVhbnMgdGhhdCBEeW5hbWljIFRleHQgdGFrZXMgbW9yZSBwcm9jZXNzaW5nXHJcbiAqIHRpbWUsIHNvIG9ubHkgdXNlIHRoZW0gaWYgeW91IHJlcXVpcmUgdGhlIGNhbGxiYWNrIGFiaWxpdHkgdGhleSBoYXZlLlxyXG4gKlxyXG4gKiBCaXRtYXBUZXh0IG9iamVjdHMgYXJlIGxlc3MgZmxleGlibGUgdGhhbiBUZXh0IG9iamVjdHMsIGluIHRoYXQgdGhleSBoYXZlIGxlc3MgZmVhdHVyZXMgc3VjaCBhcyBzaGFkb3dzLCBmaWxscyBhbmQgdGhlIGFiaWxpdHlcclxuICogdG8gdXNlIFdlYiBGb250cywgaG93ZXZlciB5b3UgdHJhZGUgdGhpcyBmbGV4aWJpbGl0eSBmb3IgcmVuZGVyaW5nIHNwZWVkLiBZb3UgY2FuIGFsc28gY3JlYXRlIHZpc3VhbGx5IGNvbXBlbGxpbmcgQml0bWFwVGV4dHMgYnlcclxuICogcHJvY2Vzc2luZyB0aGUgZm9udCB0ZXh0dXJlIGluIGFuIGltYWdlIGVkaXRvciwgYXBwbHlpbmcgZmlsbHMgYW5kIGFueSBvdGhlciBlZmZlY3RzIHJlcXVpcmVkLlxyXG4gKlxyXG4gKiBUbyBjcmVhdGUgbXVsdGktbGluZSB0ZXh0IGluc2VydCBcXHIsIFxcbiBvciBcXHJcXG4gZXNjYXBlIGNvZGVzIGludG8gdGhlIHRleHQgc3RyaW5nLlxyXG4gKlxyXG4gKiBUbyBjcmVhdGUgYSBCaXRtYXBUZXh0IGRhdGEgZmlsZXMgeW91IG5lZWQgYSAzcmQgcGFydHkgYXBwIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIEJNRm9udCAoV2luZG93cywgZnJlZSk6IGh0dHA6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvXHJcbiAqIEdseXBoIERlc2lnbmVyIChPUyBYLCBjb21tZXJjaWFsKTogaHR0cDovL3d3dy43MXNxdWFyZWQuY29tL2VuL2dseXBoZGVzaWduZXJcclxuICogTGl0dGVyYSAoV2ViLWJhc2VkLCBmcmVlKTogaHR0cDovL2t2YXphcnMuY29tL2xpdHRlcmEvXHJcbiAqXHJcbiAqIEZvciBtb3N0IHVzZSBjYXNlcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgWE1MLiBJZiB5b3Ugd2lzaCB0byB1c2UgSlNPTiwgdGhlIGZvcm1hdHRpbmcgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSByZXN1bHQgb2ZcclxuICogY29udmVydGluZyBhIHZhbGlkIFhNTCBmaWxlIHRocm91Z2ggdGhlIHBvcHVsYXIgWDJKUyBsaWJyYXJ5LiBBbiBvbmxpbmUgdG9vbCBmb3IgY29udmVyc2lvbiBjYW4gYmUgZm91bmQgaGVyZTogaHR0cDovL2NvZGViZWF1dGlmeS5vcmcveG1sdG9qc29uXHJcbiAqXHJcbiAqIEBjbGFzcyBEeW5hbWljQml0bWFwVGV4dFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gSXQgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhbnkgZ2l2ZW4gdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udCAtIFRoZSBrZXkgb2YgdGhlIGZvbnQgdG8gdXNlIGZyb20gdGhlIEJpdG1hcCBGb250IGNhY2hlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBbdGV4dF0gLSBUaGUgc3RyaW5nLCBvciBhcnJheSBvZiBzdHJpbmdzLCB0byBiZSBzZXQgYXMgdGhlIGNvbnRlbnQgb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBmb250IHNpemUgb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbYWxpZ249MF0gLSBUaGUgYWxpZ25tZW50IG9mIHRoZSB0ZXh0IGluIGEgbXVsdGktbGluZSBCaXRtYXBUZXh0IG9iamVjdC5cclxuICovXHJcbnZhciBEeW5hbWljQml0bWFwVGV4dCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogQml0bWFwVGV4dCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBEeW5hbWljQml0bWFwVGV4dCAoc2NlbmUsIHgsIHksIGZvbnQsIHRleHQsIHNpemUsIGFsaWduKVxyXG4gICAge1xyXG4gICAgICAgIEJpdG1hcFRleHQuY2FsbCh0aGlzLCBzY2VuZSwgeCwgeSwgZm9udCwgdGV4dCwgc2l6ZSwgYWxpZ24pO1xyXG5cclxuICAgICAgICB0aGlzLnR5cGUgPSAnRHluYW1pY0JpdG1hcFRleHQnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIEJpdG1hcCBUZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I3Njcm9sbFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjcm9sbFggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBCaXRtYXAgVGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dCNzY3JvbGxZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY3JvbGxZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNyb3Agd2lkdGggb2YgdGhlIEJpdG1hcCBUZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I2Nyb3BXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3JvcFdpZHRoID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNyb3AgaGVpZ2h0IG9mIHRoZSBCaXRtYXAgVGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dCNjcm9wSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jcm9wSGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjYWxsYmFjayB0aGF0IGFsdGVycyBob3cgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlIEJpdG1hcCBUZXh0IGlzIHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I2Rpc3BsYXlDYWxsYmFja1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5EaXNwbGF5Q2FsbGJhY2t9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5Q2FsbGJhY2s7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkYXRhIG9iamVjdCB0aGF0IGlzIHBvcHVsYXRlZCBkdXJpbmcgcmVuZGVyaW5nLCB0aGVuIHBhc3NlZCB0byB0aGUgZGlzcGxheUNhbGxiYWNrLlxyXG4gICAgICAgICAqIFlvdSBzaG91bGQgbW9kaWZ5IHRoaXMgb2JqZWN0IHRoZW4gcmV0dXJuIGl0IGJhY2sgZnJvbSB0aGUgY2FsbGJhY2suIEl0J3MgdXBkYXRlZCB2YWx1ZXNcclxuICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBzcGVjaWZpYyBnbHlwaC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGlmIHlvdSBuZWVkIGEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0IGxvY2FsbHkgaW4geW91ciBnYW1lIGNvZGUgdGhlbiB5b3VcclxuICAgICAgICAgKiBzaG91bGQgc2hhbGxvdyBjb3B5IGl0LCBhcyBpdCdzIHVwZGF0ZWQgYW5kIHJlLXVzZWQgZm9yIGV2ZXJ5IGdseXBoIGluIHRoZSB0ZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I2NhbGxiYWNrRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5EaXNwbGF5Q2FsbGJhY2tDb25maWd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tEYXRhID0ge1xyXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXHJcbiAgICAgICAgICAgIGNvbG9yOiAwLFxyXG4gICAgICAgICAgICB0aW50OiB7XHJcbiAgICAgICAgICAgICAgICB0b3BMZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgdG9wUmlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICBib3R0b21MZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgICAgIGNoYXJDb2RlOiAwLFxyXG4gICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICBzY2FsZTogMCxcclxuICAgICAgICAgICAgcm90YXRpb246IDAsXHJcbiAgICAgICAgICAgIGRhdGE6IDBcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY3JvcCBzaXplIG9mIHRoaXMgQml0bWFwIFRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRHluYW1pY0JpdG1hcFRleHQjc2V0U2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjcm9wLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGNyb3AuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jcm9wV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmNyb3BIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIGNhbGxiYWNrIHRoYXQgYWx0ZXJzIGhvdyBlYWNoIGNoYXJhY3RlciBvZiB0aGUgQml0bWFwIFRleHQgaXMgcmVuZGVyZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHJlY2VpdmVzIGEge0BsaW5rIFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkRpc3BsYXlDYWxsYmFja0NvbmZpZ30gb2JqZWN0IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciB0aGF0J3NcclxuICAgICAqIGFib3V0IHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICpcclxuICAgICAqIEl0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IHdpdGggYHhgLCBgeWAsIGBzY2FsZWAgYW5kIGByb3RhdGlvbmAgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZVxyXG4gICAgICogdXN1YWwgdmFsdWVzIHdoZW4gcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I3NldERpc3BsYXlDYWxsYmFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5EaXNwbGF5Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGRpc3BsYXkgY2FsbGJhY2sgdG8gc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldERpc3BsYXlDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24gb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dCNzZXRTY3JvbGxYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24gdG8gc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNjcm9sbFg6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNjcm9sbFggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dCNzZXRTY3JvbGxZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIHRvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTY3JvbGxZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxZID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IER5bmFtaWNCaXRtYXBUZXh0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTZXRUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci9jYW52YXMvdXRpbHMvU2V0VHJhbnNmb3JtJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0I3JlbmRlckNhbnZhc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0fSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgRHluYW1pY0JpdG1hcFRleHRDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciB0ZXh0ID0gc3JjLl90ZXh0O1xyXG4gICAgdmFyIHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcclxuXHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgaWYgKHRleHRMZW5ndGggPT09IDAgfHwgIVNldFRyYW5zZm9ybShyZW5kZXJlciwgY3R4LCBzcmMsIGNhbWVyYSwgcGFyZW50TWF0cml4KSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHZhciB0ZXh0dXJlRnJhbWUgPSBzcmMuZnJhbWU7XHJcblxyXG4gICAgdmFyIGRpc3BsYXlDYWxsYmFjayA9IHNyYy5kaXNwbGF5Q2FsbGJhY2s7XHJcbiAgICB2YXIgY2FsbGJhY2tEYXRhID0gc3JjLmNhbGxiYWNrRGF0YTtcclxuXHJcbiAgICB2YXIgY2hhcnMgPSBzcmMuZm9udERhdGEuY2hhcnM7XHJcbiAgICB2YXIgbGluZUhlaWdodCA9IHNyYy5mb250RGF0YS5saW5lSGVpZ2h0O1xyXG4gICAgdmFyIGxldHRlclNwYWNpbmcgPSBzcmMuX2xldHRlclNwYWNpbmc7XHJcblxyXG4gICAgdmFyIHhBZHZhbmNlID0gMDtcclxuICAgIHZhciB5QWR2YW5jZSA9IDA7XHJcblxyXG4gICAgdmFyIGNoYXJDb2RlID0gMDtcclxuXHJcbiAgICB2YXIgZ2x5cGggPSBudWxsO1xyXG4gICAgdmFyIGdseXBoWCA9IDA7XHJcbiAgICB2YXIgZ2x5cGhZID0gMDtcclxuICAgIHZhciBnbHlwaFcgPSAwO1xyXG4gICAgdmFyIGdseXBoSCA9IDA7XHJcblxyXG4gICAgdmFyIHggPSAwO1xyXG4gICAgdmFyIHkgPSAwO1xyXG5cclxuICAgIHZhciBsYXN0R2x5cGggPSBudWxsO1xyXG4gICAgdmFyIGxhc3RDaGFyQ29kZSA9IDA7XHJcblxyXG4gICAgdmFyIGltYWdlID0gc3JjLmZyYW1lLnNvdXJjZS5pbWFnZTtcclxuXHJcbiAgICB2YXIgdGV4dHVyZVggPSB0ZXh0dXJlRnJhbWUuY3V0WDtcclxuICAgIHZhciB0ZXh0dXJlWSA9IHRleHR1cmVGcmFtZS5jdXRZO1xyXG5cclxuICAgIHZhciByb3RhdGlvbiA9IDA7XHJcbiAgICB2YXIgc2NhbGUgPSAwO1xyXG4gICAgdmFyIGJhc2VTY2FsZSA9IChzcmMuX2ZvbnRTaXplIC8gc3JjLmZvbnREYXRhLnNpemUpO1xyXG5cclxuICAgIHZhciBhbGlnbiA9IHNyYy5fYWxpZ247XHJcbiAgICB2YXIgY3VycmVudExpbmUgPSAwO1xyXG4gICAgdmFyIGxpbmVPZmZzZXRYID0gMDtcclxuXHJcbiAgICAvLyAgVXBkYXRlIHRoZSBib3VuZHMgLSBza2lwcGVkIGludGVybmFsbHkgaWYgbm90IGRpcnR5XHJcbiAgICBzcmMuZ2V0VGV4dEJvdW5kcyhmYWxzZSk7XHJcblxyXG4gICAgdmFyIGxpbmVEYXRhID0gc3JjLl9ib3VuZHMubGluZXM7XHJcblxyXG4gICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIGxpbmVPZmZzZXRYID0gKGxpbmVEYXRhLmxvbmdlc3QgLSBsaW5lRGF0YS5sZW5ndGhzWzBdKSAvIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgIHtcclxuICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1swXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnRyYW5zbGF0ZSgtc3JjLmRpc3BsYXlPcmlnaW5YLCAtc3JjLmRpc3BsYXlPcmlnaW5ZKTtcclxuXHJcbiAgICB2YXIgcm91bmRQaXhlbHMgPSBjYW1lcmEucm91bmRQaXhlbHM7XHJcblxyXG4gICAgaWYgKHNyYy5jcm9wV2lkdGggPiAwICYmIHNyYy5jcm9wSGVpZ2h0ID4gMClcclxuICAgIHtcclxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgY3R4LnJlY3QoMCwgMCwgc3JjLmNyb3BXaWR0aCwgc3JjLmNyb3BIZWlnaHQpO1xyXG4gICAgICAgIGN0eC5jbGlwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0TGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFJlc2V0IHRoZSBzY2FsZSAoaW4gY2FzZSB0aGUgY2FsbGJhY2sgY2hhbmdlZCBpdClcclxuICAgICAgICBzY2FsZSA9IGJhc2VTY2FsZTtcclxuICAgICAgICByb3RhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xyXG5cclxuICAgICAgICBpZiAoY2hhckNvZGUgPT09IDEwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY3VycmVudExpbmUrKztcclxuXHJcbiAgICAgICAgICAgIGlmIChhbGlnbiA9PT0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZU9mZnNldFggPSAobGluZURhdGEubG9uZ2VzdCAtIGxpbmVEYXRhLmxlbmd0aHNbY3VycmVudExpbmVdKSAvIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09IDIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRYID0gKGxpbmVEYXRhLmxvbmdlc3QgLSBsaW5lRGF0YS5sZW5ndGhzW2N1cnJlbnRMaW5lXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHhBZHZhbmNlID0gMDtcclxuICAgICAgICAgICAgeUFkdmFuY2UgKz0gbGluZUhlaWdodDtcclxuICAgICAgICAgICAgbGFzdEdseXBoID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2x5cGggPSBjaGFyc1tjaGFyQ29kZV07XHJcblxyXG4gICAgICAgIGlmICghZ2x5cGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdseXBoWCA9IHRleHR1cmVYICsgZ2x5cGgueDtcclxuICAgICAgICBnbHlwaFkgPSB0ZXh0dXJlWSArIGdseXBoLnk7XHJcblxyXG4gICAgICAgIGdseXBoVyA9IGdseXBoLndpZHRoO1xyXG4gICAgICAgIGdseXBoSCA9IGdseXBoLmhlaWdodDtcclxuXHJcbiAgICAgICAgeCA9IChnbHlwaC54T2Zmc2V0ICsgeEFkdmFuY2UpIC0gc3JjLnNjcm9sbFg7XHJcbiAgICAgICAgeSA9IChnbHlwaC55T2Zmc2V0ICsgeUFkdmFuY2UpIC0gc3JjLnNjcm9sbFk7XHJcblxyXG4gICAgICAgIGlmIChsYXN0R2x5cGggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIga2VybmluZ09mZnNldCA9IGdseXBoLmtlcm5pbmdbbGFzdENoYXJDb2RlXTtcclxuICAgICAgICAgICAgeCArPSAoa2VybmluZ09mZnNldCAhPT0gdW5kZWZpbmVkKSA/IGtlcm5pbmdPZmZzZXQgOiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRpc3BsYXlDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5pbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5jaGFyQ29kZSA9IGNoYXJDb2RlO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEueCA9IHg7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS55ID0geTtcclxuICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnNjYWxlID0gc2NhbGU7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEuZGF0YSA9IGdseXBoLmRhdGE7XHJcblxyXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gZGlzcGxheUNhbGxiYWNrKGNhbGxiYWNrRGF0YSk7XHJcblxyXG4gICAgICAgICAgICB4ID0gb3V0cHV0Lng7XHJcbiAgICAgICAgICAgIHkgPSBvdXRwdXQueTtcclxuICAgICAgICAgICAgc2NhbGUgPSBvdXRwdXQuc2NhbGU7XHJcbiAgICAgICAgICAgIHJvdGF0aW9uID0gb3V0cHV0LnJvdGF0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeCAqPSBzY2FsZTtcclxuICAgICAgICB5ICo9IHNjYWxlO1xyXG5cclxuICAgICAgICB4ICs9IGxpbmVPZmZzZXRYO1xyXG5cclxuICAgICAgICB4QWR2YW5jZSArPSBnbHlwaC54QWR2YW5jZSArIGxldHRlclNwYWNpbmc7XHJcbiAgICAgICAgbGFzdEdseXBoID0gZ2x5cGg7XHJcbiAgICAgICAgbGFzdENoYXJDb2RlID0gY2hhckNvZGU7XHJcblxyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIHJlbmRlciBvciBhIHNwYWNlPyBUaGVuIHNraXAgdG8gdGhlIG5leHQgZ2x5cGhcclxuICAgICAgICBpZiAoZ2x5cGhXID09PSAwIHx8IGdseXBoSCA9PT0gMCB8fCBjaGFyQ29kZSA9PT0gMzIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyb3VuZFBpeGVscylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xyXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eC5zYXZlKCk7XHJcblxyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XHJcblxyXG4gICAgICAgIGN0eC5yb3RhdGUocm90YXRpb24pO1xyXG5cclxuICAgICAgICBjdHguc2NhbGUoc2NhbGUsIHNjYWxlKTtcclxuXHJcbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgZ2x5cGhYLCBnbHlwaFksIGdseXBoVywgZ2x5cGhILCAwLCAwLCBnbHlwaFcsIGdseXBoSCk7XHJcblxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnJlc3RvcmUoKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRHluYW1pY0JpdG1hcFRleHRDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQml0bWFwVGV4dCA9IHJlcXVpcmUoJy4vRHluYW1pY0JpdG1hcFRleHQnKTtcclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL0J1aWxkR2FtZU9iamVjdCcpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi8uLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBEeW5hbWljIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBEeW5hbWljIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNkeW5hbWljQml0bWFwVGV4dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICrCslxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkJpdG1hcFRleHRDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuRHluYW1pY0JpdG1hcFRleHR9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ2R5bmFtaWNCaXRtYXBUZXh0JywgZnVuY3Rpb24gKGNvbmZpZywgYWRkVG9TY2VuZSlcclxue1xyXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgdmFyIGZvbnQgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZvbnQnLCAnJyk7XHJcbiAgICB2YXIgdGV4dCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAndGV4dCcsICcnKTtcclxuICAgIHZhciBzaXplID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdzaXplJywgZmFsc2UpO1xyXG5cclxuICAgIHZhciBiaXRtYXBUZXh0ID0gbmV3IEJpdG1hcFRleHQodGhpcy5zY2VuZSwgMCwgMCwgZm9udCwgdGV4dCwgc2l6ZSk7XHJcblxyXG4gICAgaWYgKGFkZFRvU2NlbmUgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBjb25maWcuYWRkID0gYWRkVG9TY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3QodGhpcy5zY2VuZSwgYml0bWFwVGV4dCwgY29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gYml0bWFwVGV4dDtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdENyZWF0b3IgY29udGV4dC5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRHluYW1pY0JpdG1hcFRleHQgPSByZXF1aXJlKCcuL0R5bmFtaWNCaXRtYXBUZXh0Jyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBEeW5hbWljIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICogXHJcbiAqIEJpdG1hcFRleHQgb2JqZWN0cyB3b3JrIGJ5IHRha2luZyBhIHRleHR1cmUgZmlsZSBhbmQgYW4gWE1MIG9yIEpTT04gZmlsZSB0aGF0IGRlc2NyaWJlcyB0aGUgZm9udCBzdHJ1Y3R1cmUuXHJcbiAqIFxyXG4gKiBEdXJpbmcgcmVuZGVyaW5nIGZvciBlYWNoIGxldHRlciBvZiB0aGUgdGV4dCBpcyByZW5kZXJlZCB0byB0aGUgZGlzcGxheSwgcHJvcG9ydGlvbmFsbHkgc3BhY2VkIG91dCBhbmQgYWxpZ25lZCB0b1xyXG4gKiBtYXRjaCB0aGUgZm9udCBzdHJ1Y3R1cmUuXHJcbiAqIFxyXG4gKiBEeW5hbWljIEJpdG1hcCBUZXh0IG9iamVjdHMgYXJlIGRpZmZlcmVudCBmcm9tIFN0YXRpYyBCaXRtYXAgVGV4dCBpbiB0aGF0IHRoZXkgaW52b2tlIGEgY2FsbGJhY2sgZm9yIGVhY2hcclxuICogbGV0dGVyIGJlaW5nIHJlbmRlcmVkIGR1cmluZyB0aGUgcmVuZGVyIHBhc3MuIFRoaXMgY2FsbGJhY2sgYWxsb3dzIHlvdSB0byBtYW5pcHVsYXRlIHRoZSBwcm9wZXJ0aWVzIG9mXHJcbiAqIGVhY2ggbGV0dGVyIGJlaW5nIHJlbmRlcmVkLCBzdWNoIGFzIGl0cyBwb3NpdGlvbiwgc2NhbGUgb3IgdGludCwgYWxsb3dpbmcgeW91IHRvIGNyZWF0ZSBpbnRlcmVzdGluZyBlZmZlY3RzXHJcbiAqIGxpa2UgamlnZ2xpbmcgdGV4dCwgd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIFN0YXRpYyB0ZXh0LiBUaGlzIG1lYW5zIHRoYXQgRHluYW1pYyBUZXh0IHRha2VzIG1vcmUgcHJvY2Vzc2luZ1xyXG4gKiB0aW1lLCBzbyBvbmx5IHVzZSB0aGVtIGlmIHlvdSByZXF1aXJlIHRoZSBjYWxsYmFjayBhYmlsaXR5IHRoZXkgaGF2ZS5cclxuICpcclxuICogQml0bWFwVGV4dCBvYmplY3RzIGFyZSBsZXNzIGZsZXhpYmxlIHRoYW4gVGV4dCBvYmplY3RzLCBpbiB0aGF0IHRoZXkgaGF2ZSBsZXNzIGZlYXR1cmVzIHN1Y2ggYXMgc2hhZG93cywgZmlsbHMgYW5kIHRoZSBhYmlsaXR5XHJcbiAqIHRvIHVzZSBXZWIgRm9udHMsIGhvd2V2ZXIgeW91IHRyYWRlIHRoaXMgZmxleGliaWxpdHkgZm9yIHJlbmRlcmluZyBzcGVlZC4gWW91IGNhbiBhbHNvIGNyZWF0ZSB2aXN1YWxseSBjb21wZWxsaW5nIEJpdG1hcFRleHRzIGJ5XHJcbiAqIHByb2Nlc3NpbmcgdGhlIGZvbnQgdGV4dHVyZSBpbiBhbiBpbWFnZSBlZGl0b3IsIGFwcGx5aW5nIGZpbGxzIGFuZCBhbnkgb3RoZXIgZWZmZWN0cyByZXF1aXJlZC5cclxuICpcclxuICogVG8gY3JlYXRlIG11bHRpLWxpbmUgdGV4dCBpbnNlcnQgXFxyLCBcXG4gb3IgXFxyXFxuIGVzY2FwZSBjb2RlcyBpbnRvIHRoZSB0ZXh0IHN0cmluZy5cclxuICpcclxuICogVG8gY3JlYXRlIGEgQml0bWFwVGV4dCBkYXRhIGZpbGVzIHlvdSBuZWVkIGEgM3JkIHBhcnR5IGFwcCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBCTUZvbnQgKFdpbmRvd3MsIGZyZWUpOiBodHRwOi8vd3d3LmFuZ2VsY29kZS5jb20vcHJvZHVjdHMvYm1mb250L1xyXG4gKiBHbHlwaCBEZXNpZ25lciAoT1MgWCwgY29tbWVyY2lhbCk6IGh0dHA6Ly93d3cuNzFzcXVhcmVkLmNvbS9lbi9nbHlwaGRlc2lnbmVyXHJcbiAqIExpdHRlcmEgKFdlYi1iYXNlZCwgZnJlZSk6IGh0dHA6Ly9rdmF6YXJzLmNvbS9saXR0ZXJhL1xyXG4gKlxyXG4gKiBGb3IgbW9zdCB1c2UgY2FzZXMgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFhNTC4gSWYgeW91IHdpc2ggdG8gdXNlIEpTT04sIHRoZSBmb3JtYXR0aW5nIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgcmVzdWx0IG9mXHJcbiAqIGNvbnZlcnRpbmcgYSB2YWxpZCBYTUwgZmlsZSB0aHJvdWdoIHRoZSBwb3B1bGFyIFgySlMgbGlicmFyeS4gQW4gb25saW5lIHRvb2wgZm9yIGNvbnZlcnNpb24gY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9jb2RlYmVhdXRpZnkub3JnL3htbHRvanNvblxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBEeW5hbWljIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNkeW5hbWljQml0bWFwVGV4dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udCAtIFRoZSBrZXkgb2YgdGhlIGZvbnQgdG8gdXNlIGZyb20gdGhlIEJpdG1hcEZvbnQgY2FjaGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IFt0ZXh0XSAtIFRoZSBzdHJpbmcsIG9yIGFycmF5IG9mIHN0cmluZ3MsIHRvIGJlIHNldCBhcyB0aGUgY29udGVudCBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemVdIC0gVGhlIGZvbnQgc2l6ZSB0byBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignZHluYW1pY0JpdG1hcFRleHQnLCBmdW5jdGlvbiAoeCwgeSwgZm9udCwgdGV4dCwgc2l6ZSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBEeW5hbWljQml0bWFwVGV4dCh0aGlzLnNjZW5lLCB4LCB5LCBmb250LCB0ZXh0LCBzaXplKSk7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RGYWN0b3J5IGNvbnRleHQuXHJcbi8vXHJcbi8vICBUaGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byB1c2U6XHJcbi8vXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vRHluYW1pY0JpdG1hcFRleHRXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0R5bmFtaWNCaXRtYXBUZXh0Q2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5EeW5hbWljQml0bWFwVGV4dCNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkR5bmFtaWNCaXRtYXBUZXh0fSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgRHluYW1pY0JpdG1hcFRleHRXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIHRleHQgPSBzcmMudGV4dDtcclxuICAgIHZhciB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHRleHRMZW5ndGggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgcmVuZGVyZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUsIHNyYyk7XHJcblxyXG4gICAgdmFyIGNyb3AgPSAoc3JjLmNyb3BXaWR0aCA+IDAgfHwgc3JjLmNyb3BIZWlnaHQgPiAwKTtcclxuXHJcbiAgICBpZiAoY3JvcClcclxuICAgIHtcclxuICAgICAgICBwaXBlbGluZS5mbHVzaCgpO1xyXG5cclxuICAgICAgICByZW5kZXJlci5wdXNoU2Npc3NvcihcclxuICAgICAgICAgICAgc3JjLngsXHJcbiAgICAgICAgICAgIHNyYy55LFxyXG4gICAgICAgICAgICBzcmMuY3JvcFdpZHRoICogc3JjLnNjYWxlWCxcclxuICAgICAgICAgICAgc3JjLmNyb3BIZWlnaHQgKiBzcmMuc2NhbGVZXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNwcml0ZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG4gICAgdmFyIGZvbnRNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDQ7XHJcblxyXG4gICAgc3ByaXRlTWF0cml4LmFwcGx5SVRSUyhzcmMueCwgc3JjLnksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcblxyXG4gICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBzcHJpdGVNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5mID0gc3JjLnk7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBieSB0aGUgU3ByaXRlIG1hdHJpeCwgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkoc3ByaXRlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3Rvclk7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBieSB0aGUgU3ByaXRlIG1hdHJpeCwgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkoc3ByaXRlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZnJhbWUgPSBzcmMuZnJhbWU7XHJcbiAgICB2YXIgdGV4dHVyZSA9IGZyYW1lLmdsVGV4dHVyZTtcclxuICAgIHZhciB0ZXh0dXJlWCA9IGZyYW1lLmN1dFg7XHJcbiAgICB2YXIgdGV4dHVyZVkgPSBmcmFtZS5jdXRZO1xyXG4gICAgdmFyIHRleHR1cmVXaWR0aCA9IHRleHR1cmUud2lkdGg7XHJcbiAgICB2YXIgdGV4dHVyZUhlaWdodCA9IHRleHR1cmUuaGVpZ2h0O1xyXG5cclxuICAgIHZhciB0aW50RWZmZWN0ID0gKHNyYy5faXNUaW50ZWQgJiYgc3JjLnRpbnRGaWxsKTtcclxuICAgIHZhciB0aW50VEwgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShzcmMuX3RpbnRUTCwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYVRMKTtcclxuICAgIHZhciB0aW50VFIgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShzcmMuX3RpbnRUUiwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYVRSKTtcclxuICAgIHZhciB0aW50QkwgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShzcmMuX3RpbnRCTCwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYUJMKTtcclxuICAgIHZhciB0aW50QlIgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShzcmMuX3RpbnRCUiwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYUJSKTtcclxuXHJcbiAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQodGV4dHVyZSwgMCk7XHJcblxyXG4gICAgdmFyIHhBZHZhbmNlID0gMDtcclxuICAgIHZhciB5QWR2YW5jZSA9IDA7XHJcbiAgICB2YXIgY2hhckNvZGUgPSAwO1xyXG4gICAgdmFyIGxhc3RDaGFyQ29kZSA9IDA7XHJcbiAgICB2YXIgbGV0dGVyU3BhY2luZyA9IHNyYy5sZXR0ZXJTcGFjaW5nO1xyXG4gICAgdmFyIGdseXBoO1xyXG4gICAgdmFyIGdseXBoWCA9IDA7XHJcbiAgICB2YXIgZ2x5cGhZID0gMDtcclxuICAgIHZhciBnbHlwaFcgPSAwO1xyXG4gICAgdmFyIGdseXBoSCA9IDA7XHJcbiAgICB2YXIgbGFzdEdseXBoO1xyXG4gICAgdmFyIHNjcm9sbFggPSBzcmMuc2Nyb2xsWDtcclxuICAgIHZhciBzY3JvbGxZID0gc3JjLnNjcm9sbFk7XHJcblxyXG4gICAgdmFyIGZvbnREYXRhID0gc3JjLmZvbnREYXRhO1xyXG4gICAgdmFyIGNoYXJzID0gZm9udERhdGEuY2hhcnM7XHJcbiAgICB2YXIgbGluZUhlaWdodCA9IGZvbnREYXRhLmxpbmVIZWlnaHQ7XHJcbiAgICB2YXIgc2NhbGUgPSAoc3JjLmZvbnRTaXplIC8gZm9udERhdGEuc2l6ZSk7XHJcbiAgICB2YXIgcm90YXRpb24gPSAwO1xyXG5cclxuICAgIHZhciBhbGlnbiA9IHNyYy5fYWxpZ247XHJcbiAgICB2YXIgY3VycmVudExpbmUgPSAwO1xyXG4gICAgdmFyIGxpbmVPZmZzZXRYID0gMDtcclxuXHJcbiAgICAvLyAgVXBkYXRlIHRoZSBib3VuZHMgLSBza2lwcGVkIGludGVybmFsbHkgaWYgbm90IGRpcnR5XHJcbiAgICBzcmMuZ2V0VGV4dEJvdW5kcyhmYWxzZSk7XHJcblxyXG4gICAgdmFyIGxpbmVEYXRhID0gc3JjLl9ib3VuZHMubGluZXM7XHJcblxyXG4gICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIGxpbmVPZmZzZXRYID0gKGxpbmVEYXRhLmxvbmdlc3QgLSBsaW5lRGF0YS5sZW5ndGhzWzBdKSAvIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgIHtcclxuICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1swXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJvdW5kUGl4ZWxzID0gY2FtZXJhLnJvdW5kUGl4ZWxzO1xyXG4gICAgdmFyIGRpc3BsYXlDYWxsYmFjayA9IHNyYy5kaXNwbGF5Q2FsbGJhY2s7XHJcbiAgICB2YXIgY2FsbGJhY2tEYXRhID0gc3JjLmNhbGxiYWNrRGF0YTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRMZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKTtcclxuXHJcbiAgICAgICAgLy8gIENhcnJpYWdlLXJldHVyblxyXG4gICAgICAgIGlmIChjaGFyQ29kZSA9PT0gMTApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdXJyZW50TGluZSsrO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1tjdXJyZW50TGluZV0pIC8gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZU9mZnNldFggPSAobGluZURhdGEubG9uZ2VzdCAtIGxpbmVEYXRhLmxlbmd0aHNbY3VycmVudExpbmVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeEFkdmFuY2UgPSAwO1xyXG4gICAgICAgICAgICB5QWR2YW5jZSArPSBsaW5lSGVpZ2h0O1xyXG4gICAgICAgICAgICBsYXN0R2x5cGggPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbHlwaCA9IGNoYXJzW2NoYXJDb2RlXTtcclxuXHJcbiAgICAgICAgaWYgKCFnbHlwaClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2x5cGhYID0gdGV4dHVyZVggKyBnbHlwaC54O1xyXG4gICAgICAgIGdseXBoWSA9IHRleHR1cmVZICsgZ2x5cGgueTtcclxuXHJcbiAgICAgICAgZ2x5cGhXID0gZ2x5cGgud2lkdGg7XHJcbiAgICAgICAgZ2x5cGhIID0gZ2x5cGguaGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgeCA9IChnbHlwaC54T2Zmc2V0ICsgeEFkdmFuY2UpIC0gc2Nyb2xsWDtcclxuICAgICAgICB2YXIgeSA9IChnbHlwaC55T2Zmc2V0ICsgeUFkdmFuY2UpIC0gc2Nyb2xsWTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RHbHlwaCAhPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBrZXJuaW5nT2Zmc2V0ID0gZ2x5cGgua2VybmluZ1tsYXN0Q2hhckNvZGVdO1xyXG4gICAgICAgICAgICB4ICs9IChrZXJuaW5nT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8ga2VybmluZ09mZnNldCA6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB4QWR2YW5jZSArPSBnbHlwaC54QWR2YW5jZSArIGxldHRlclNwYWNpbmc7XHJcbiAgICAgICAgbGFzdEdseXBoID0gZ2x5cGg7XHJcbiAgICAgICAgbGFzdENoYXJDb2RlID0gY2hhckNvZGU7XHJcblxyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIHJlbmRlciBvciBhIHNwYWNlPyBUaGVuIHNraXAgdG8gdGhlIG5leHQgZ2x5cGhcclxuICAgICAgICBpZiAoZ2x5cGhXID09PSAwIHx8IGdseXBoSCA9PT0gMCB8fCBjaGFyQ29kZSA9PT0gMzIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjYWxlID0gKHNyYy5mb250U2l6ZSAvIHNyYy5mb250RGF0YS5zaXplKTtcclxuICAgICAgICByb3RhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIGlmIChkaXNwbGF5Q2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEuY29sb3IgPSAwO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEudGludC50b3BMZWZ0ID0gdGludFRMO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEudGludC50b3BSaWdodCA9IHRpbnRUUjtcclxuICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnRpbnQuYm90dG9tTGVmdCA9IHRpbnRCTDtcclxuICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnRpbnQuYm90dG9tUmlnaHQgPSB0aW50QlI7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5pbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5jaGFyQ29kZSA9IGNoYXJDb2RlO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEueCA9IHg7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS55ID0geTtcclxuICAgICAgICAgICAgY2FsbGJhY2tEYXRhLnNjYWxlID0gc2NhbGU7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrRGF0YS5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGEuZGF0YSA9IGdseXBoLmRhdGE7XHJcblxyXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gZGlzcGxheUNhbGxiYWNrKGNhbGxiYWNrRGF0YSk7XHJcblxyXG4gICAgICAgICAgICB4ID0gb3V0cHV0Lng7XHJcbiAgICAgICAgICAgIHkgPSBvdXRwdXQueTtcclxuICAgICAgICAgICAgc2NhbGUgPSBvdXRwdXQuc2NhbGU7XHJcbiAgICAgICAgICAgIHJvdGF0aW9uID0gb3V0cHV0LnJvdGF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKG91dHB1dC5jb2xvcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGludFRMID0gb3V0cHV0LmNvbG9yO1xyXG4gICAgICAgICAgICAgICAgdGludFRSID0gb3V0cHV0LmNvbG9yO1xyXG4gICAgICAgICAgICAgICAgdGludEJMID0gb3V0cHV0LmNvbG9yO1xyXG4gICAgICAgICAgICAgICAgdGludEJSID0gb3V0cHV0LmNvbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGludFRMID0gb3V0cHV0LnRpbnQudG9wTGVmdDtcclxuICAgICAgICAgICAgICAgIHRpbnRUUiA9IG91dHB1dC50aW50LnRvcFJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGludEJMID0gb3V0cHV0LnRpbnQuYm90dG9tTGVmdDtcclxuICAgICAgICAgICAgICAgIHRpbnRCUiA9IG91dHB1dC50aW50LmJvdHRvbVJpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aW50VEwgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYSh0aW50VEwsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUTCk7XHJcbiAgICAgICAgICAgIHRpbnRUUiA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhKHRpbnRUUiwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYVRSKTtcclxuICAgICAgICAgICAgdGludEJMID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEodGludEJMLCBjYW1lcmEuYWxwaGEgKiBzcmMuX2FscGhhQkwpO1xyXG4gICAgICAgICAgICB0aW50QlIgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYSh0aW50QlIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFCUik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB4ICo9IHNjYWxlO1xyXG4gICAgICAgIHkgKj0gc2NhbGU7XHJcblxyXG4gICAgICAgIHggLT0gc3JjLmRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHkgLT0gc3JjLmRpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICB4ICs9IGxpbmVPZmZzZXRYO1xyXG5cclxuICAgICAgICBmb250TWF0cml4LmFwcGx5SVRSUyh4LCB5LCByb3RhdGlvbiwgc2NhbGUsIHNjYWxlKTtcclxuXHJcbiAgICAgICAgY2FsY01hdHJpeC5tdWx0aXBseShmb250TWF0cml4LCBzcHJpdGVNYXRyaXgpO1xyXG5cclxuICAgICAgICB2YXIgdTAgPSBnbHlwaFggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgdmFyIHYwID0gZ2x5cGhZIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICB2YXIgdTEgPSAoZ2x5cGhYICsgZ2x5cGhXKSAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICB2YXIgdjEgPSAoZ2x5cGhZICsgZ2x5cGhIKSAvIHRleHR1cmVIZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciB4dyA9IGdseXBoVztcclxuICAgICAgICB2YXIgeWggPSBnbHlwaEg7XHJcblxyXG4gICAgICAgIHZhciB0eDAgPSBzcHJpdGVNYXRyaXguZTtcclxuICAgICAgICB2YXIgdHkwID0gc3ByaXRlTWF0cml4LmY7XHJcblxyXG4gICAgICAgIHZhciB0eDEgPSB5aCAqIHNwcml0ZU1hdHJpeC5jICsgc3ByaXRlTWF0cml4LmU7XHJcbiAgICAgICAgdmFyIHR5MSA9IHloICogc3ByaXRlTWF0cml4LmQgKyBzcHJpdGVNYXRyaXguZjtcclxuXHJcbiAgICAgICAgdmFyIHR4MiA9IHh3ICogc3ByaXRlTWF0cml4LmEgKyB5aCAqIHNwcml0ZU1hdHJpeC5jICsgc3ByaXRlTWF0cml4LmU7XHJcbiAgICAgICAgdmFyIHR5MiA9IHh3ICogc3ByaXRlTWF0cml4LmIgKyB5aCAqIHNwcml0ZU1hdHJpeC5kICsgc3ByaXRlTWF0cml4LmY7XHJcblxyXG4gICAgICAgIHZhciB0eDMgPSB4dyAqIHNwcml0ZU1hdHJpeC5hICsgc3ByaXRlTWF0cml4LmU7XHJcbiAgICAgICAgdmFyIHR5MyA9IHh3ICogc3ByaXRlTWF0cml4LmIgKyBzcHJpdGVNYXRyaXguZjtcclxuXHJcbiAgICAgICAgaWYgKHJvdW5kUGl4ZWxzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHgwID0gTWF0aC5yb3VuZCh0eDApO1xyXG4gICAgICAgICAgICB0eTAgPSBNYXRoLnJvdW5kKHR5MCk7XHJcblxyXG4gICAgICAgICAgICB0eDEgPSBNYXRoLnJvdW5kKHR4MSk7XHJcbiAgICAgICAgICAgIHR5MSA9IE1hdGgucm91bmQodHkxKTtcclxuXHJcbiAgICAgICAgICAgIHR4MiA9IE1hdGgucm91bmQodHgyKTtcclxuICAgICAgICAgICAgdHkyID0gTWF0aC5yb3VuZCh0eTIpO1xyXG5cclxuICAgICAgICAgICAgdHgzID0gTWF0aC5yb3VuZCh0eDMpO1xyXG4gICAgICAgICAgICB0eTMgPSBNYXRoLnJvdW5kKHR5Myk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwaXBlbGluZS5iYXRjaFF1YWQodHgwLCB0eTAsIHR4MSwgdHkxLCB0eDIsIHR5MiwgdHgzLCB0eTMsIHUwLCB2MCwgdTEsIHYxLCB0aW50VEwsIHRpbnRUUiwgdGludEJMLCB0aW50QlIsIHRpbnRFZmZlY3QsIHRleHR1cmUsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjcm9wKVxyXG4gICAge1xyXG4gICAgICAgIHBpcGVsaW5lLmZsdXNoKCk7XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLnBvcFNjaXNzb3IoKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRHluYW1pY0JpdG1hcFRleHRXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vLi4vY29tcG9uZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3QnKTtcclxudmFyIEdldEJpdG1hcFRleHRTaXplID0gcmVxdWlyZSgnLi4vR2V0Qml0bWFwVGV4dFNpemUnKTtcclxudmFyIFBhcnNlRnJvbUF0bGFzID0gcmVxdWlyZSgnLi4vUGFyc2VGcm9tQXRsYXMnKTtcclxudmFyIFBhcnNlWE1MQml0bWFwRm9udCA9IHJlcXVpcmUoJy4uL1BhcnNlWE1MQml0bWFwRm9udCcpO1xyXG52YXIgUmVuZGVyID0gcmVxdWlyZSgnLi9CaXRtYXBUZXh0UmVuZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBCaXRtYXBUZXh0IG9iamVjdHMgd29yayBieSB0YWtpbmcgYSB0ZXh0dXJlIGZpbGUgYW5kIGFuIFhNTCBvciBKU09OIGZpbGUgdGhhdCBkZXNjcmliZXMgdGhlIGZvbnQgc3RydWN0dXJlLlxyXG4gKlxyXG4gKiBEdXJpbmcgcmVuZGVyaW5nIGZvciBlYWNoIGxldHRlciBvZiB0aGUgdGV4dCBpcyByZW5kZXJlZCB0byB0aGUgZGlzcGxheSwgcHJvcG9ydGlvbmFsbHkgc3BhY2VkIG91dCBhbmQgYWxpZ25lZCB0b1xyXG4gKiBtYXRjaCB0aGUgZm9udCBzdHJ1Y3R1cmUuXHJcbiAqXHJcbiAqIEJpdG1hcFRleHQgb2JqZWN0cyBhcmUgbGVzcyBmbGV4aWJsZSB0aGFuIFRleHQgb2JqZWN0cywgaW4gdGhhdCB0aGV5IGhhdmUgbGVzcyBmZWF0dXJlcyBzdWNoIGFzIHNoYWRvd3MsIGZpbGxzIGFuZCB0aGUgYWJpbGl0eVxyXG4gKiB0byB1c2UgV2ViIEZvbnRzLCBob3dldmVyIHlvdSB0cmFkZSB0aGlzIGZsZXhpYmlsaXR5IGZvciByZW5kZXJpbmcgc3BlZWQuIFlvdSBjYW4gYWxzbyBjcmVhdGUgdmlzdWFsbHkgY29tcGVsbGluZyBCaXRtYXBUZXh0cyBieVxyXG4gKiBwcm9jZXNzaW5nIHRoZSBmb250IHRleHR1cmUgaW4gYW4gaW1hZ2UgZWRpdG9yLCBhcHBseWluZyBmaWxscyBhbmQgYW55IG90aGVyIGVmZmVjdHMgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIFRvIGNyZWF0ZSBtdWx0aS1saW5lIHRleHQgaW5zZXJ0IFxcciwgXFxuIG9yIFxcclxcbiBlc2NhcGUgY29kZXMgaW50byB0aGUgdGV4dCBzdHJpbmcuXHJcbiAqXHJcbiAqIFRvIGNyZWF0ZSBhIEJpdG1hcFRleHQgZGF0YSBmaWxlcyB5b3UgbmVlZCBhIDNyZCBwYXJ0eSBhcHAgc3VjaCBhczpcclxuICpcclxuICogQk1Gb250IChXaW5kb3dzLCBmcmVlKToge0BsaW5rIGh0dHA6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvfGh0dHA6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvfVxyXG4gKiBHbHlwaCBEZXNpZ25lciAoT1MgWCwgY29tbWVyY2lhbCk6IHtAbGluayBodHRwOi8vd3d3Ljcxc3F1YXJlZC5jb20vZW4vZ2x5cGhkZXNpZ25lcnxodHRwOi8vd3d3Ljcxc3F1YXJlZC5jb20vZW4vZ2x5cGhkZXNpZ25lcn1cclxuICogTGl0dGVyYSAoV2ViLWJhc2VkLCBmcmVlKToge0BsaW5rIGh0dHA6Ly9rdmF6YXJzLmNvbS9saXR0ZXJhL3xodHRwOi8va3ZhemFycy5jb20vbGl0dGVyYS99XHJcbiAqXHJcbiAqIEZvciBtb3N0IHVzZSBjYXNlcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgWE1MLiBJZiB5b3Ugd2lzaCB0byB1c2UgSlNPTiwgdGhlIGZvcm1hdHRpbmcgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSByZXN1bHQgb2ZcclxuICogY29udmVydGluZyBhIHZhbGlkIFhNTCBmaWxlIHRocm91Z2ggdGhlIHBvcHVsYXIgWDJKUyBsaWJyYXJ5LiBBbiBvbmxpbmUgdG9vbCBmb3IgY29udmVyc2lvbiBjYW4gYmUgZm91bmQgaGVyZToge0BsaW5rIGh0dHA6Ly9jb2RlYmVhdXRpZnkub3JnL3htbHRvanNvbnxodHRwOi8vY29kZWJlYXV0aWZ5Lm9yZy94bWx0b2pzb259XHJcbiAqXHJcbiAqIEBjbGFzcyBCaXRtYXBUZXh0XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBJdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGFueSBnaXZlbiB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250IC0gVGhlIGtleSBvZiB0aGUgZm9udCB0byB1c2UgZnJvbSB0aGUgQml0bWFwIEZvbnQgY2FjaGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IFt0ZXh0XSAtIFRoZSBzdHJpbmcsIG9yIGFycmF5IG9mIHN0cmluZ3MsIHRvIGJlIHNldCBhcyB0aGUgY29udGVudCBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemVdIC0gVGhlIGZvbnQgc2l6ZSBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFthbGlnbj0wXSAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHRleHQgaW4gYSBtdWx0aS1saW5lIEJpdG1hcFRleHQgb2JqZWN0LlxyXG4gKi9cclxudmFyIEJpdG1hcFRleHQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdhbWVPYmplY3QsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5BbHBoYSxcclxuICAgICAgICBDb21wb25lbnRzLkJsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGV4dHVyZSxcclxuICAgICAgICBDb21wb25lbnRzLlRpbnQsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEJpdG1hcFRleHQgKHNjZW5lLCB4LCB5LCBmb250LCB0ZXh0LCBzaXplLCBhbGlnbilcclxuICAgIHtcclxuICAgICAgICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKSB7IHRleHQgPSAnJzsgfVxyXG4gICAgICAgIGlmIChhbGlnbiA9PT0gdW5kZWZpbmVkKSB7IGFsaWduID0gMDsgfVxyXG5cclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdCaXRtYXBUZXh0Jyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBrZXkgb2YgdGhlIEJpdG1hcCBGb250IHVzZWQgYnkgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAgICAgKiBUbyBjaGFuZ2UgdGhlIGZvbnQgYWZ0ZXIgY3JlYXRpb24gcGxlYXNlIHVzZSBgc2V0Rm9udGAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNmb250XHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZvbnQgPSBmb250O1xyXG5cclxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnNjZW5lLnN5cy5jYWNoZS5iaXRtYXBGb250LmdldChmb250KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRhdGEgb2YgdGhlIEJpdG1hcCBGb250IHVzZWQgYnkgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I2ZvbnREYXRhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkJpdG1hcEZvbnREYXRhfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZm9udERhdGEgPSBlbnRyeS5kYXRhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dCB0aGF0IHRoaXMgQml0bWFwIFRleHQgb2JqZWN0IGRpc3BsYXlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQjX3RleHRcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGV4dCA9ICcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZm9udCBzaXplIG9mIHRoaXMgQml0bWFwIFRleHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNfZm9udFNpemVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBzaXplIHx8IHRoaXMuZm9udERhdGEuc2l6ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWRkcyAvIFJlbW92ZXMgc3BhY2luZyBiZXR3ZWVuIGNoYXJhY3RlcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBDYW4gYmUgYSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNfbGV0dGVyU3BhY2luZ1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9sZXR0ZXJTcGFjaW5nID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgdGhlIGFsaWdubWVudCBvZiBlYWNoIGxpbmUgb2YgdGV4dCBpbiB0aGlzIEJpdG1hcFRleHQgb2JqZWN0LlxyXG4gICAgICAgICAqIE9ubHkgaGFzIGFueSBlZmZlY3Qgd2hlbiB0aGlzIEJpdG1hcFRleHQgY29udGFpbnMgbXVsdGlwbGUgbGluZXMgb2YgdGV4dCwgc3BsaXQgd2l0aCBjYXJyaWFnZS1yZXR1cm5zLlxyXG4gICAgICAgICAqIEhhcyBubyBlZmZlY3Qgd2l0aCBzaW5nbGUtbGluZXMgb2YgdGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNlZSB0aGUgbWV0aG9kcyBgc2V0TGVmdEFsaWduYCwgYHNldENlbnRlckFsaWduYCBhbmQgYHNldFJpZ2h0QWxpZ25gLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogMCA9IExlZnQgYWxpZ25lZCAoZGVmYXVsdClcclxuICAgICAgICAgKiAxID0gTWlkZGxlIGFsaWduZWRcclxuICAgICAgICAgKiAyID0gUmlnaHQgYWxpZ25lZFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIGFsaWdubWVudCBwb3NpdGlvbiBpcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdCBsaW5lIG9mIHRleHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNfYWxpZ25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIHNpemUgb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I19ib3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkJpdG1hcFRleHQuQml0bWFwVGV4dFNpemV9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9ib3VuZHMgPSBHZXRCaXRtYXBUZXh0U2l6ZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBkaXJ0eSBmbGFnIGZvciBib3VuZHMgY2FsY3VsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNfZGlydHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGNhY2hlIHZhciBob2xkaW5nIHRoZSBtYXhXaWR0aC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I19tYXhXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbWF4V2lkdGggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2hhcmFjdGVyIGNvZGUgdXNlZCB0byBkZXRlY3QgZm9yIHdvcmQgd3JhcHBpbmcuXHJcbiAgICAgICAgICogRGVmYXVsdHMgdG8gMzIgKGEgc3BhY2UgY2hhcmFjdGVyKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I3dvcmRXcmFwQ2hhckNvZGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmRXcmFwQ2hhckNvZGUgPSAzMjtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKGVudHJ5LnRleHR1cmUsIGVudHJ5LmZyYW1lKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKDAsIDApO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dCh0ZXh0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGxpbmVzIG9mIHRleHQgaW4gdGhpcyBCaXRtYXBUZXh0IHRvIGJlIGxlZnQtYWxpZ25lZC5cclxuICAgICAqIFRoaXMgb25seSBoYXMgYW55IGVmZmVjdCBpZiB0aGlzIEJpdG1hcFRleHQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBsaW5lIG9mIHRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNzZXRMZWZ0QWxpZ25cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEJpdG1hcFRleHQgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRMZWZ0QWxpZ246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYWxpZ24gPSBCaXRtYXBUZXh0LkFMSUdOX0xFRlQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBsaW5lcyBvZiB0ZXh0IGluIHRoaXMgQml0bWFwVGV4dCB0byBiZSBjZW50ZXItYWxpZ25lZC5cclxuICAgICAqIFRoaXMgb25seSBoYXMgYW55IGVmZmVjdCBpZiB0aGlzIEJpdG1hcFRleHQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBsaW5lIG9mIHRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNzZXRDZW50ZXJBbGlnblxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQml0bWFwVGV4dCBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENlbnRlckFsaWduOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2FsaWduID0gQml0bWFwVGV4dC5BTElHTl9DRU5URVI7XHJcblxyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBsaW5lcyBvZiB0ZXh0IGluIHRoaXMgQml0bWFwVGV4dCB0byBiZSByaWdodC1hbGlnbmVkLlxyXG4gICAgICogVGhpcyBvbmx5IGhhcyBhbnkgZWZmZWN0IGlmIHRoaXMgQml0bWFwVGV4dCBjb250YWlucyBtb3JlIHRoYW4gb25lIGxpbmUgb2YgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I3NldFJpZ2h0QWxpZ25cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEJpdG1hcFRleHQgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSaWdodEFsaWduOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2FsaWduID0gQml0bWFwVGV4dC5BTElHTl9SSUdIVDtcclxuXHJcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQjc2V0Rm9udFNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIGZvbnQgc2l6ZSB0byBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBCaXRtYXBUZXh0IE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Rm9udFNpemU6IGZ1bmN0aW9uIChzaXplKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gc2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBsZXR0ZXIgc3BhY2luZyBiZXR3ZWVuIGVhY2ggY2hhcmFjdGVyIG9mIHRoaXMgQml0bWFwIFRleHQuXHJcbiAgICAgKiBDYW4gYmUgYSBwb3NpdGl2ZSB2YWx1ZSB0byBpbmNyZWFzZSB0aGUgc3BhY2UsIG9yIG5lZ2F0aXZlIHRvIHJlZHVjZSBpdC5cclxuICAgICAqIFNwYWNpbmcgaXMgYXBwbGllZCBhZnRlciB0aGUga2VybmluZyB2YWx1ZXMgaGF2ZSBiZWVuIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I3NldExldHRlclNwYWNpbmdcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2luZz0wXSAtIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSB0byBhZGQgYmV0d2VlbiBlYWNoIGNoYXJhY3Rlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEJpdG1hcFRleHQgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRMZXR0ZXJTcGFjaW5nOiBmdW5jdGlvbiAoc3BhY2luZylcclxuICAgIHtcclxuICAgICAgICBpZiAoc3BhY2luZyA9PT0gdW5kZWZpbmVkKSB7IHNwYWNpbmcgPSAwOyB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xldHRlclNwYWNpbmcgPSBzcGFjaW5nO1xyXG5cclxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoaXMgQml0bWFwVGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBzdHJpbmdzIHdpbGwgYmUgY29udmVydGVkIGludG8gbXVsdGktbGluZSB0ZXh0LiBVc2UgdGhlIGFsaWduIG1ldGhvZHMgdG8gY2hhbmdlIG11bHRpLWxpbmUgYWxpZ25tZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQjc2V0VGV4dFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0gdmFsdWUgLSBUaGUgc3RyaW5nLCBvciBhcnJheSBvZiBzdHJpbmdzLCB0byBiZSBzZXQgYXMgdGhlIGNvbnRlbnQgb2YgdGhpcyBCaXRtYXBUZXh0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQml0bWFwVGV4dCBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRleHQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuam9pbignXFxuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMudGV4dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RleHQgPSB2YWx1ZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGJvdW5kcyBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gICAgICpcclxuICAgICAqIEFuIG9iamVjdCBpcyByZXR1cm5lZCB0aGF0IGNvbnRhaW5zIHRoZSBwb3NpdGlvbiwgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgQml0bWFwIFRleHQgaW4gbG9jYWwgYW5kIGdsb2JhbFxyXG4gICAgICogY29udGV4dHMuXHJcbiAgICAgKlxyXG4gICAgICogTG9jYWwgc2l6ZSBpcyBiYXNlZCBvbiBqdXN0IHRoZSBmb250IHNpemUgYW5kIGEgWzAsIDBdIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEdsb2JhbCBzaXplIHRha2VzIGludG8gYWNjb3VudCB0aGUgR2FtZSBPYmplY3QncyBzY2FsZSwgd29ybGQgcG9zaXRpb24gYW5kIGRpc3BsYXkgb3JpZ2luLlxyXG4gICAgICpcclxuICAgICAqIEFsc28gaW4gdGhlIG9iamVjdCBpcyBkYXRhIHJlZ2FyZGluZyB0aGUgbGVuZ3RoIG9mIGVhY2ggbGluZSwgc2hvdWxkIHRoaXMgYmUgYSBtdWx0aS1saW5lIEJpdG1hcFRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNnZXRUZXh0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyb3VuZF0gLSBXaGV0aGVyIHRvIHJvdW5kIHRoZSByZXN1bHRzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkJpdG1hcFRleHQuQml0bWFwVGV4dFNpemV9IEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgc2l6ZSBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gICAgICovXHJcbiAgICBnZXRUZXh0Qm91bmRzOiBmdW5jdGlvbiAocm91bmQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIGxvY2FsID0gVGhlIEJpdG1hcFRleHQgYmFzZWQgb24gZm9udFNpemUgYW5kIDB4MCBjb29yZHNcclxuICAgICAgICAvLyAgZ2xvYmFsID0gVGhlIEJpdG1hcFRleHQsIHRha2luZyBpbnRvIGFjY291bnQgc2NhbGUgYW5kIHdvcmxkIHBvc2l0aW9uXHJcbiAgICAgICAgLy8gIGxpbmVzID0gVGhlIEJpdG1hcFRleHQgbGluZSBkYXRhXHJcblxyXG4gICAgICAgIHZhciBib3VuZHMgPSB0aGlzLl9ib3VuZHM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kaXJ0eSB8fCB0aGlzLnNjYWxlWCAhPT0gYm91bmRzLnNjYWxlWCB8fCB0aGlzLnNjYWxlWSAhPT0gYm91bmRzLnNjYWxlWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdldEJpdG1hcFRleHRTaXplKHRoaXMsIHJvdW5kLCBib3VuZHMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJvdW5kcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBmb250IHRoaXMgQml0bWFwVGV4dCBpcyB1c2luZyB0byByZW5kZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG5ldyB0ZXh0dXJlIGlzIGxvYWRlZCBhbmQgYXBwbGllZCB0byB0aGUgQml0bWFwVGV4dC4gVGhlIGV4aXN0aW5nIHRlc3QsIHNpemUgYW5kIGFsaWdubWVudCBhcmUgcHJlc2VydmVkLFxyXG4gICAgICogdW5sZXNzIG92ZXJyaWRkZW4gdmlhIHRoZSBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNzZXRGb250XHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZvbnQgLSBUaGUga2V5IG9mIHRoZSBmb250IHRvIHVzZSBmcm9tIHRoZSBCaXRtYXAgRm9udCBjYWNoZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZV0gLSBUaGUgZm9udCBzaXplIG9mIHRoaXMgQml0bWFwIFRleHQuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGN1cnJlbnQgc2l6ZSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFthbGlnbj0wXSAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHRleHQgaW4gYSBtdWx0aS1saW5lIEJpdG1hcFRleHQgb2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBjdXJyZW50IGFsaWdubWVudCB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBCaXRtYXBUZXh0IE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Rm9udDogZnVuY3Rpb24gKGtleSwgc2l6ZSwgYWxpZ24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkgeyBzaXplID0gdGhpcy5fZm9udFNpemU7IH1cclxuICAgICAgICBpZiAoYWxpZ24gPT09IHVuZGVmaW5lZCkgeyBhbGlnbiA9IHRoaXMuX2FsaWduOyB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgIT09IHRoaXMuZm9udClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuc2NlbmUuc3lzLmNhY2hlLmJpdG1hcEZvbnQuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9udCA9IGtleTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9udERhdGEgPSBlbnRyeS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9udFNpemUgPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWxpZ24gPSBhbGlnbjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHR1cmUoZW50cnkudGV4dHVyZSwgZW50cnkuZnJhbWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIEdldEJpdG1hcFRleHRTaXplKHRoaXMsIGZhbHNlLCB0aGlzLl9ib3VuZHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIGRpc3BsYXkgd2lkdGggb2YgdGhpcyBCaXRtYXBUZXh0IGluIHBpeGVscy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBgQml0bWFwVGV4dC50ZXh0YCBpcyBsb25nZXIgdGhhbiBgbWF4V2lkdGhgIHRoZW4gdGhlIGxpbmVzIHdpbGwgYmUgYXV0b21hdGljYWxseSB3cmFwcGVkXHJcbiAgICAgKiBiYXNlZCBvbiB0aGUgcHJldmlvdXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgZm91bmQgaW4gdGhlIGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gd2hpdGVzcGFjZSB3YXMgZm91bmQgdGhlbiBubyB3cmFwcGluZyB3aWxsIHRha2UgcGxhY2UgYW5kIGNvbnNlcXVlbnRseSB0aGUgYG1heFdpZHRoYCB2YWx1ZSB3aWxsIG5vdCBiZSBob25vcmVkLlxyXG4gICAgICpcclxuICAgICAqIERpc2FibGUgbWF4V2lkdGggYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gMC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHNldCB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgdG8gYmUgc2VhcmNoZWQgZm9yIGJ5IHNldHRpbmcgdGhlIGB3b3JkV3JhcENoYXJDb2RlYCBwYXJhbWV0ZXIgb3IgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNzZXRNYXhXaWR0aFxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBtYXhpbXVtIGRpc3BsYXkgd2lkdGggb2YgdGhpcyBCaXRtYXBUZXh0IGluIHBpeGVscy4gU2V0IHRvIHplcm8gdG8gZGlzYWJsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd29yZFdyYXBDaGFyQ29kZV0gLSBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gY2hlY2sgZm9yIHdoZW4gd29yZCB3cmFwcGluZy4gRGVmYXVsdHMgdG8gMzIgKHRoZSBzcGFjZSBjaGFyYWN0ZXIpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQml0bWFwVGV4dCBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldE1heFdpZHRoOiBmdW5jdGlvbiAodmFsdWUsIHdvcmRXcmFwQ2hhckNvZGUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbWF4V2lkdGggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAod29yZFdyYXBDaGFyQ29kZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JkV3JhcENoYXJDb2RlID0gd29yZFdyYXBDaGFyQ29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xzIHRoZSBhbGlnbm1lbnQgb2YgZWFjaCBsaW5lIG9mIHRleHQgaW4gdGhpcyBCaXRtYXBUZXh0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBPbmx5IGhhcyBhbnkgZWZmZWN0IHdoZW4gdGhpcyBCaXRtYXBUZXh0IGNvbnRhaW5zIG11bHRpcGxlIGxpbmVzIG9mIHRleHQsIHNwbGl0IHdpdGggY2FycmlhZ2UtcmV0dXJucy5cclxuICAgICAqIEhhcyBubyBlZmZlY3Qgd2l0aCBzaW5nbGUtbGluZXMgb2YgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBTZWUgdGhlIG1ldGhvZHMgYHNldExlZnRBbGlnbmAsIGBzZXRDZW50ZXJBbGlnbmAgYW5kIGBzZXRSaWdodEFsaWduYC5cclxuICAgICAqXHJcbiAgICAgKiAwID0gTGVmdCBhbGlnbmVkIChkZWZhdWx0KVxyXG4gICAgICogMSA9IE1pZGRsZSBhbGlnbmVkXHJcbiAgICAgKiAyID0gUmlnaHQgYWxpZ25lZFxyXG4gICAgICpcclxuICAgICAqIFRoZSBhbGlnbm1lbnQgcG9zaXRpb24gaXMgYmFzZWQgb24gdGhlIGxvbmdlc3QgbGluZSBvZiB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I2FsaWduXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgYWxpZ246IHtcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9hbGlnbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FsaWduO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgdGhhdCB0aGlzIEJpdG1hcCBUZXh0IG9iamVjdCBkaXNwbGF5cy5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBtZXRob2QgYHNldFRleHRgIGlmIHlvdSB3YW50IGEgY2hhaW5hYmxlIHdheSB0byBjaGFuZ2UgdGhlIHRleHQgY29udGVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCN0ZXh0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRleHQ6IHtcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRleHQodmFsdWUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGZvbnQgc2l6ZSBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIG1ldGhvZCBgc2V0Rm9udFNpemVgIGlmIHlvdSB3YW50IGEgY2hhaW5hYmxlIHdheSB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNmb250U2l6ZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBmb250U2l6ZToge1xyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvbnRTaXplID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIC8gUmVtb3ZlcyBzcGFjaW5nIGJldHdlZW4gY2hhcmFjdGVycy5cclxuICAgICAqXHJcbiAgICAgKiBDYW4gYmUgYSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSB0aGUgbWV0aG9kIGBzZXRMZXR0ZXJTcGFjaW5nYCBpZiB5b3Ugd2FudCBhIGNoYWluYWJsZSB3YXkgdG8gY2hhbmdlIHRoZSBsZXR0ZXIgc3BhY2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNsZXR0ZXJTcGFjaW5nXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxldHRlclNwYWNpbmc6IHtcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9sZXR0ZXJTcGFjaW5nID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGV0dGVyU3BhY2luZztcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIGRpc3BsYXkgd2lkdGggb2YgdGhpcyBCaXRtYXBUZXh0IGluIHBpeGVscy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBCaXRtYXBUZXh0LnRleHQgaXMgbG9uZ2VyIHRoYW4gbWF4V2lkdGggdGhlbiB0aGUgbGluZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHdyYXBwZWRcclxuICAgICAqIGJhc2VkIG9uIHRoZSBsYXN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGZvdW5kIGluIHRoZSBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIHdoaXRlc3BhY2Ugd2FzIGZvdW5kIHRoZW4gbm8gd3JhcHBpbmcgd2lsbCB0YWtlIHBsYWNlIGFuZCBjb25zZXF1ZW50bHkgdGhlIG1heFdpZHRoIHZhbHVlIHdpbGwgbm90IGJlIGhvbm9yZWQuXHJcbiAgICAgKlxyXG4gICAgICogRGlzYWJsZSBtYXhXaWR0aCBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byAwLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I21heFdpZHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICovXHJcbiAgICBtYXhXaWR0aDoge1xyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heFdpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhpcyBCaXRtYXAgVGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCN3aWR0aFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHdpZHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGV4dEJvdW5kcyhmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYm91bmRzLmdsb2JhbC53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhpcyBiaXRtYXAgdGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dCNoZWlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRUZXh0Qm91bmRzKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ib3VuZHMuZ2xvYmFsLmhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQjdG9KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5KU09OQml0bWFwVGV4dH0gQSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgQml0bWFwIFRleHQuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gQ29tcG9uZW50cy5Ub0pTT04odGhpcyk7XHJcblxyXG4gICAgICAgIC8vICBFeHRyYSBkYXRhIGlzIGFkZGVkIGhlcmVcclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGZvbnQ6IHRoaXMuZm9udCxcclxuICAgICAgICAgICAgdGV4dDogdGhpcy50ZXh0LFxyXG4gICAgICAgICAgICBmb250U2l6ZTogdGhpcy5mb250U2l6ZSxcclxuICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogdGhpcy5sZXR0ZXJTcGFjaW5nLFxyXG4gICAgICAgICAgICBhbGlnbjogdGhpcy5hbGlnblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG91dC5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIExlZnQgYWxpZ24gdGhlIHRleHQgY2hhcmFjdGVycyBpbiBhIG11bHRpLWxpbmUgQml0bWFwVGV4dCBvYmplY3QuXHJcbiAqXHJcbiAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkFMSUdOX0xFRlRcclxuICogQHR5cGUge2ludGVnZXJ9XHJcbiAqIEBzaW5jZSAzLjExLjBcclxuICovXHJcbkJpdG1hcFRleHQuQUxJR05fTEVGVCA9IDA7XHJcblxyXG4vKipcclxuICogQ2VudGVyIGFsaWduIHRoZSB0ZXh0IGNoYXJhY3RlcnMgaW4gYSBtdWx0aS1saW5lIEJpdG1hcFRleHQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5BTElHTl9DRU5URVJcclxuICogQHR5cGUge2ludGVnZXJ9XHJcbiAqIEBzaW5jZSAzLjExLjBcclxuICovXHJcbkJpdG1hcFRleHQuQUxJR05fQ0VOVEVSID0gMTtcclxuXHJcbi8qKlxyXG4gKiBSaWdodCBhbGlnbiB0aGUgdGV4dCBjaGFyYWN0ZXJzIGluIGEgbXVsdGktbGluZSBCaXRtYXBUZXh0IG9iamVjdC5cclxuICpcclxuICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQuQUxJR05fUklHSFRcclxuICogQHR5cGUge2ludGVnZXJ9XHJcbiAqIEBzaW5jZSAzLjExLjBcclxuICovXHJcbkJpdG1hcFRleHQuQUxJR05fUklHSFQgPSAyO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIGFuIFhNTCBCaXRtYXAgRm9udCBmcm9tIGFuIEF0bGFzLlxyXG4gKlxyXG4gKiBBZGRzIHRoZSBwYXJzZWQgQml0bWFwIEZvbnQgZGF0YSB0byB0aGUgY2FjaGUgd2l0aCB0aGUgYGZvbnROYW1lYCBrZXkuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHQuUGFyc2VGcm9tQXRsYXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byBwYXJzZSB0aGUgQml0bWFwIEZvbnQgZm9yLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udE5hbWUgLSBUaGUga2V5IG9mIHRoZSBmb250IHRvIGFkZCB0byB0aGUgQml0bWFwIEZvbnQgY2FjaGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlS2V5IC0gVGhlIGtleSBvZiB0aGUgQml0bWFwRm9udCdzIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcmFtZUtleSAtIFRoZSBrZXkgb2YgdGhlIEJpdG1hcEZvbnQgdGV4dHVyZSdzIGZyYW1lLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30geG1sS2V5IC0gVGhlIGtleSBvZiB0aGUgWE1MIGRhdGEgb2YgdGhlIGZvbnQgdG8gcGFyc2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3hTcGFjaW5nXSAtIFRoZSB4LWF4aXMgc3BhY2luZyB0byBhZGQgYmV0d2VlbiBlYWNoIGxldHRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbeVNwYWNpbmddIC0gVGhlIHktYXhpcyBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGluZSBoZWlnaHQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxyXG4gKi9cclxuQml0bWFwVGV4dC5QYXJzZUZyb21BdGxhcyA9IFBhcnNlRnJvbUF0bGFzO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIGFuIFhNTCBmb250IHRvIEJpdG1hcCBGb250IGRhdGEgZm9yIHRoZSBCaXRtYXAgRm9udCBjYWNoZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dC5QYXJzZVhNTEJpdG1hcEZvbnRcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1hNTERvY3VtZW50fSB4bWwgLSBUaGUgWE1MIERvY3VtZW50IHRvIHBhcnNlIHRoZSBmb250IGZyb20uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3hTcGFjaW5nPTBdIC0gVGhlIHgtYXhpcyBzcGFjaW5nIHRvIGFkZCBiZXR3ZWVuIGVhY2ggbGV0dGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt5U3BhY2luZz0wXSAtIFRoZSB5LWF4aXMgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxpbmUgaGVpZ2h0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gW2ZyYW1lXSAtIFRoZSB0ZXh0dXJlIGZyYW1lIHRvIHRha2UgaW50byBhY2NvdW50IHdoaWxlIHBhcnNpbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkJpdG1hcEZvbnREYXRhfSBUaGUgcGFyc2VkIEJpdG1hcCBGb250IGRhdGEuXHJcbiAqL1xyXG5CaXRtYXBUZXh0LlBhcnNlWE1MQml0bWFwRm9udCA9IFBhcnNlWE1MQml0bWFwRm9udDtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQml0bWFwVGV4dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU2V0VHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I3JlbmRlckNhbnZhc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHR9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBCaXRtYXBUZXh0Q2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgdGV4dCA9IHNyYy5fdGV4dDtcclxuICAgIHZhciB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcblxyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIGlmICh0ZXh0TGVuZ3RoID09PSAwIHx8ICFTZXRUcmFuc2Zvcm0ocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB2YXIgdGV4dHVyZUZyYW1lID0gc3JjLmZyYW1lO1xyXG5cclxuICAgIHZhciBjaGFycyA9IHNyYy5mb250RGF0YS5jaGFycztcclxuICAgIHZhciBsaW5lSGVpZ2h0ID0gc3JjLmZvbnREYXRhLmxpbmVIZWlnaHQ7XHJcbiAgICB2YXIgbGV0dGVyU3BhY2luZyA9IHNyYy5fbGV0dGVyU3BhY2luZztcclxuXHJcbiAgICB2YXIgeEFkdmFuY2UgPSAwO1xyXG4gICAgdmFyIHlBZHZhbmNlID0gMDtcclxuXHJcbiAgICB2YXIgY2hhckNvZGUgPSAwO1xyXG5cclxuICAgIHZhciBnbHlwaCA9IG51bGw7XHJcbiAgICB2YXIgZ2x5cGhYID0gMDtcclxuICAgIHZhciBnbHlwaFkgPSAwO1xyXG4gICAgdmFyIGdseXBoVyA9IDA7XHJcbiAgICB2YXIgZ2x5cGhIID0gMDtcclxuXHJcbiAgICB2YXIgeCA9IDA7XHJcbiAgICB2YXIgeSA9IDA7XHJcblxyXG4gICAgdmFyIGxhc3RHbHlwaCA9IG51bGw7XHJcbiAgICB2YXIgbGFzdENoYXJDb2RlID0gMDtcclxuXHJcbiAgICB2YXIgaW1hZ2UgPSBzcmMuZnJhbWUuc291cmNlLmltYWdlO1xyXG5cclxuICAgIHZhciB0ZXh0dXJlWCA9IHRleHR1cmVGcmFtZS5jdXRYO1xyXG4gICAgdmFyIHRleHR1cmVZID0gdGV4dHVyZUZyYW1lLmN1dFk7XHJcblxyXG4gICAgdmFyIHNjYWxlID0gKHNyYy5fZm9udFNpemUgLyBzcmMuZm9udERhdGEuc2l6ZSk7XHJcblxyXG4gICAgdmFyIGFsaWduID0gc3JjLl9hbGlnbjtcclxuICAgIHZhciBjdXJyZW50TGluZSA9IDA7XHJcbiAgICB2YXIgbGluZU9mZnNldFggPSAwO1xyXG5cclxuICAgIC8vICBVcGRhdGUgdGhlIGJvdW5kcyAtIHNraXBwZWQgaW50ZXJuYWxseSBpZiBub3QgZGlydHlcclxuICAgIHZhciBib3VuZHMgPSBzcmMuZ2V0VGV4dEJvdW5kcyhmYWxzZSk7XHJcblxyXG4gICAgLy8gIEluIGNhc2UgdGhlIG1ldGhvZCBhYm92ZSBjaGFuZ2VkIGl0ICh3b3JkIHdyYXBwaW5nKVxyXG4gICAgaWYgKHNyYy5tYXhXaWR0aCA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgdGV4dCA9IGJvdW5kcy53cmFwcGVkVGV4dDtcclxuICAgICAgICB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGxpbmVEYXRhID0gc3JjLl9ib3VuZHMubGluZXM7XHJcblxyXG4gICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIGxpbmVPZmZzZXRYID0gKGxpbmVEYXRhLmxvbmdlc3QgLSBsaW5lRGF0YS5sZW5ndGhzWzBdKSAvIDI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgIHtcclxuICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1swXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnRyYW5zbGF0ZSgtc3JjLmRpc3BsYXlPcmlnaW5YLCAtc3JjLmRpc3BsYXlPcmlnaW5ZKTtcclxuXHJcbiAgICB2YXIgcm91bmRQaXhlbHMgPSBjYW1lcmEucm91bmRQaXhlbHM7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0TGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgY2hhckNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcblxyXG4gICAgICAgIGlmIChjaGFyQ29kZSA9PT0gMTApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdXJyZW50TGluZSsrO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1tjdXJyZW50TGluZV0pIC8gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZU9mZnNldFggPSAobGluZURhdGEubG9uZ2VzdCAtIGxpbmVEYXRhLmxlbmd0aHNbY3VycmVudExpbmVdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgeEFkdmFuY2UgPSAwO1xyXG4gICAgICAgICAgICB5QWR2YW5jZSArPSBsaW5lSGVpZ2h0O1xyXG4gICAgICAgICAgICBsYXN0R2x5cGggPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbHlwaCA9IGNoYXJzW2NoYXJDb2RlXTtcclxuXHJcbiAgICAgICAgaWYgKCFnbHlwaClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2x5cGhYID0gdGV4dHVyZVggKyBnbHlwaC54O1xyXG4gICAgICAgIGdseXBoWSA9IHRleHR1cmVZICsgZ2x5cGgueTtcclxuXHJcbiAgICAgICAgZ2x5cGhXID0gZ2x5cGgud2lkdGg7XHJcbiAgICAgICAgZ2x5cGhIID0gZ2x5cGguaGVpZ2h0O1xyXG5cclxuICAgICAgICB4ID0gZ2x5cGgueE9mZnNldCArIHhBZHZhbmNlO1xyXG4gICAgICAgIHkgPSBnbHlwaC55T2Zmc2V0ICsgeUFkdmFuY2U7XHJcblxyXG4gICAgICAgIGlmIChsYXN0R2x5cGggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIga2VybmluZ09mZnNldCA9IGdseXBoLmtlcm5pbmdbbGFzdENoYXJDb2RlXTtcclxuICAgICAgICAgICAgeCArPSAoa2VybmluZ09mZnNldCAhPT0gdW5kZWZpbmVkKSA/IGtlcm5pbmdPZmZzZXQgOiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeCAqPSBzY2FsZTtcclxuICAgICAgICB5ICo9IHNjYWxlO1xyXG5cclxuICAgICAgICB4ICs9IGxpbmVPZmZzZXRYO1xyXG5cclxuICAgICAgICB4QWR2YW5jZSArPSBnbHlwaC54QWR2YW5jZSArIGxldHRlclNwYWNpbmc7XHJcbiAgICAgICAgbGFzdEdseXBoID0gZ2x5cGg7XHJcbiAgICAgICAgbGFzdENoYXJDb2RlID0gY2hhckNvZGU7XHJcblxyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIHJlbmRlciBvciBhIHNwYWNlPyBUaGVuIHNraXAgdG8gdGhlIG5leHQgZ2x5cGhcclxuICAgICAgICBpZiAoZ2x5cGhXID09PSAwIHx8IGdseXBoSCA9PT0gMCB8fCBjaGFyQ29kZSA9PT0gMzIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyb3VuZFBpeGVscylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggPSBNYXRoLnJvdW5kKHgpO1xyXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eC5zYXZlKCk7XHJcblxyXG4gICAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XHJcblxyXG4gICAgICAgIGN0eC5zY2FsZShzY2FsZSwgc2NhbGUpO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCBnbHlwaFgsIGdseXBoWSwgZ2x5cGhXLCBnbHlwaEgsIDAsIDAsIGdseXBoVywgZ2x5cGhIKTtcclxuXHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjdHgucmVzdG9yZSgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCaXRtYXBUZXh0Q2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJpdG1hcFRleHQgPSByZXF1aXJlKCcuL0JpdG1hcFRleHQnKTtcclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL0J1aWxkR2FtZU9iamVjdCcpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi8uLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQml0bWFwIFRleHQgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNiaXRtYXBUZXh0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0LkJpdG1hcFRleHRDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKiBcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkJpdG1hcFRleHR9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ2JpdG1hcFRleHQnLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICB2YXIgZm9udCA9IEdldFZhbHVlKGNvbmZpZywgJ2ZvbnQnLCAnJyk7XHJcbiAgICB2YXIgdGV4dCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAndGV4dCcsICcnKTtcclxuICAgIHZhciBzaXplID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdzaXplJywgZmFsc2UpO1xyXG4gICAgdmFyIGFsaWduID0gR2V0VmFsdWUoY29uZmlnLCAnYWxpZ24nLCAwKTtcclxuXHJcbiAgICB2YXIgYml0bWFwVGV4dCA9IG5ldyBCaXRtYXBUZXh0KHRoaXMuc2NlbmUsIDAsIDAsIGZvbnQsIHRleHQsIHNpemUsIGFsaWduKTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdCh0aGlzLnNjZW5lLCBiaXRtYXBUZXh0LCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiBiaXRtYXBUZXh0O1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCaXRtYXBUZXh0ID0gcmVxdWlyZSgnLi9CaXRtYXBUZXh0Jyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBCaXRtYXAgVGV4dCBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqIFxyXG4gKiBCaXRtYXBUZXh0IG9iamVjdHMgd29yayBieSB0YWtpbmcgYSB0ZXh0dXJlIGZpbGUgYW5kIGFuIFhNTCBvciBKU09OIGZpbGUgdGhhdCBkZXNjcmliZXMgdGhlIGZvbnQgc3RydWN0dXJlLlxyXG4gKiBcclxuICogRHVyaW5nIHJlbmRlcmluZyBmb3IgZWFjaCBsZXR0ZXIgb2YgdGhlIHRleHQgaXMgcmVuZGVyZWQgdG8gdGhlIGRpc3BsYXksIHByb3BvcnRpb25hbGx5IHNwYWNlZCBvdXQgYW5kIGFsaWduZWQgdG9cclxuICogbWF0Y2ggdGhlIGZvbnQgc3RydWN0dXJlLlxyXG4gKiBcclxuICogQml0bWFwVGV4dCBvYmplY3RzIGFyZSBsZXNzIGZsZXhpYmxlIHRoYW4gVGV4dCBvYmplY3RzLCBpbiB0aGF0IHRoZXkgaGF2ZSBsZXNzIGZlYXR1cmVzIHN1Y2ggYXMgc2hhZG93cywgZmlsbHMgYW5kIHRoZSBhYmlsaXR5XHJcbiAqIHRvIHVzZSBXZWIgRm9udHMsIGhvd2V2ZXIgeW91IHRyYWRlIHRoaXMgZmxleGliaWxpdHkgZm9yIHJlbmRlcmluZyBzcGVlZC4gWW91IGNhbiBhbHNvIGNyZWF0ZSB2aXN1YWxseSBjb21wZWxsaW5nIEJpdG1hcFRleHRzIGJ5XHJcbiAqIHByb2Nlc3NpbmcgdGhlIGZvbnQgdGV4dHVyZSBpbiBhbiBpbWFnZSBlZGl0b3IsIGFwcGx5aW5nIGZpbGxzIGFuZCBhbnkgb3RoZXIgZWZmZWN0cyByZXF1aXJlZC5cclxuICpcclxuICogVG8gY3JlYXRlIG11bHRpLWxpbmUgdGV4dCBpbnNlcnQgXFxyLCBcXG4gb3IgXFxyXFxuIGVzY2FwZSBjb2RlcyBpbnRvIHRoZSB0ZXh0IHN0cmluZy5cclxuICpcclxuICogVG8gY3JlYXRlIGEgQml0bWFwVGV4dCBkYXRhIGZpbGVzIHlvdSBuZWVkIGEgM3JkIHBhcnR5IGFwcCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBCTUZvbnQgKFdpbmRvd3MsIGZyZWUpOiBodHRwOi8vd3d3LmFuZ2VsY29kZS5jb20vcHJvZHVjdHMvYm1mb250L1xyXG4gKiBHbHlwaCBEZXNpZ25lciAoT1MgWCwgY29tbWVyY2lhbCk6IGh0dHA6Ly93d3cuNzFzcXVhcmVkLmNvbS9lbi9nbHlwaGRlc2lnbmVyXHJcbiAqIExpdHRlcmEgKFdlYi1iYXNlZCwgZnJlZSk6IGh0dHA6Ly9rdmF6YXJzLmNvbS9saXR0ZXJhL1xyXG4gKlxyXG4gKiBGb3IgbW9zdCB1c2UgY2FzZXMgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFhNTC4gSWYgeW91IHdpc2ggdG8gdXNlIEpTT04sIHRoZSBmb3JtYXR0aW5nIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgcmVzdWx0IG9mXHJcbiAqIGNvbnZlcnRpbmcgYSB2YWxpZCBYTUwgZmlsZSB0aHJvdWdoIHRoZSBwb3B1bGFyIFgySlMgbGlicmFyeS4gQW4gb25saW5lIHRvb2wgZm9yIGNvbnZlcnNpb24gY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHA6Ly9jb2RlYmVhdXRpZnkub3JnL3htbHRvanNvblxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBCaXRtYXAgVGV4dCBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjYml0bWFwVGV4dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9udCAtIFRoZSBrZXkgb2YgdGhlIGZvbnQgdG8gdXNlIGZyb20gdGhlIEJpdG1hcEZvbnQgY2FjaGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IFt0ZXh0XSAtIFRoZSBzdHJpbmcsIG9yIGFycmF5IG9mIHN0cmluZ3MsIHRvIGJlIHNldCBhcyB0aGUgY29udGVudCBvZiB0aGlzIEJpdG1hcCBUZXh0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemVdIC0gVGhlIGZvbnQgc2l6ZSB0byBzZXQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2FsaWduPTBdIC0gVGhlIGFsaWdubWVudCBvZiB0aGUgdGV4dCBpbiBhIG11bHRpLWxpbmUgQml0bWFwVGV4dCBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdiaXRtYXBUZXh0JywgZnVuY3Rpb24gKHgsIHksIGZvbnQsIHRleHQsIHNpemUsIGFsaWduKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IEJpdG1hcFRleHQodGhpcy5zY2VuZSwgeCwgeSwgZm9udCwgdGV4dCwgc2l6ZSwgYWxpZ24pKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9CaXRtYXBUZXh0V2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9CaXRtYXBUZXh0Q2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CaXRtYXBUZXh0I3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQml0bWFwVGV4dH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIEJpdG1hcFRleHRXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIHRleHQgPSBzcmMuX3RleHQ7XHJcbiAgICB2YXIgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG5cclxuICAgIGlmICh0ZXh0TGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuIFxyXG4gICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSwgc3JjKTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNwcml0ZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNyYy55O1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGZyYW1lID0gc3JjLmZyYW1lO1xyXG4gICAgdmFyIHRleHR1cmUgPSBmcmFtZS5nbFRleHR1cmU7XHJcbiAgICB2YXIgdGV4dHVyZVggPSBmcmFtZS5jdXRYO1xyXG4gICAgdmFyIHRleHR1cmVZID0gZnJhbWUuY3V0WTtcclxuICAgIHZhciB0ZXh0dXJlV2lkdGggPSB0ZXh0dXJlLndpZHRoO1xyXG4gICAgdmFyIHRleHR1cmVIZWlnaHQgPSB0ZXh0dXJlLmhlaWdodDtcclxuXHJcbiAgICB2YXIgdGludEVmZmVjdCA9IChzcmMuX2lzVGludGVkICYmIHNyYy50aW50RmlsbCk7XHJcbiAgICB2YXIgdGludFRMID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoc3JjLl90aW50VEwsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUTCk7XHJcbiAgICB2YXIgdGludFRSID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoc3JjLl90aW50VFIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUUik7XHJcbiAgICB2YXIgdGludEJMID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoc3JjLl90aW50QkwsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFCTCk7XHJcbiAgICB2YXIgdGludEJSID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoc3JjLl90aW50QlIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFCUik7XHJcblxyXG4gICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgIHZhciB4QWR2YW5jZSA9IDA7XHJcbiAgICB2YXIgeUFkdmFuY2UgPSAwO1xyXG4gICAgdmFyIGNoYXJDb2RlID0gMDtcclxuICAgIHZhciBsYXN0Q2hhckNvZGUgPSAwO1xyXG4gICAgdmFyIGxldHRlclNwYWNpbmcgPSBzcmMuX2xldHRlclNwYWNpbmc7XHJcbiAgICB2YXIgZ2x5cGg7XHJcbiAgICB2YXIgZ2x5cGhYID0gMDtcclxuICAgIHZhciBnbHlwaFkgPSAwO1xyXG4gICAgdmFyIGdseXBoVyA9IDA7XHJcbiAgICB2YXIgZ2x5cGhIID0gMDtcclxuICAgIHZhciBsYXN0R2x5cGg7XHJcblxyXG4gICAgdmFyIGZvbnREYXRhID0gc3JjLmZvbnREYXRhO1xyXG4gICAgdmFyIGNoYXJzID0gZm9udERhdGEuY2hhcnM7XHJcbiAgICB2YXIgbGluZUhlaWdodCA9IGZvbnREYXRhLmxpbmVIZWlnaHQ7XHJcbiAgICB2YXIgc2NhbGUgPSAoc3JjLl9mb250U2l6ZSAvIGZvbnREYXRhLnNpemUpO1xyXG5cclxuICAgIHZhciBhbGlnbiA9IHNyYy5fYWxpZ247XHJcbiAgICB2YXIgY3VycmVudExpbmUgPSAwO1xyXG4gICAgdmFyIGxpbmVPZmZzZXRYID0gMDtcclxuXHJcbiAgICAvLyAgVXBkYXRlIHRoZSBib3VuZHMgLSBza2lwcGVkIGludGVybmFsbHkgaWYgbm90IGRpcnR5XHJcbiAgICB2YXIgYm91bmRzID0gc3JjLmdldFRleHRCb3VuZHMoZmFsc2UpO1xyXG5cclxuICAgIC8vICBJbiBjYXNlIHRoZSBtZXRob2QgYWJvdmUgY2hhbmdlZCBpdCAod29yZCB3cmFwcGluZylcclxuICAgIGlmIChzcmMubWF4V2lkdGggPiAwKVxyXG4gICAge1xyXG4gICAgICAgIHRleHQgPSBib3VuZHMud3JhcHBlZFRleHQ7XHJcbiAgICAgICAgdGV4dExlbmd0aCA9IHRleHQubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBsaW5lRGF0YSA9IHNyYy5fYm91bmRzLmxpbmVzO1xyXG5cclxuICAgIGlmIChhbGlnbiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1swXSkgLyAyO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYWxpZ24gPT09IDIpXHJcbiAgICB7XHJcbiAgICAgICAgbGluZU9mZnNldFggPSAobGluZURhdGEubG9uZ2VzdCAtIGxpbmVEYXRhLmxlbmd0aHNbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByb3VuZFBpeGVscyA9IGNhbWVyYS5yb3VuZFBpeGVscztcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRMZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBjaGFyQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKTtcclxuXHJcbiAgICAgICAgLy8gIENhcnJpYWdlLXJldHVyblxyXG4gICAgICAgIGlmIChjaGFyQ29kZSA9PT0gMTApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdXJyZW50TGluZSsrO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFsaWduID09PSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WCA9IChsaW5lRGF0YS5sb25nZXN0IC0gbGluZURhdGEubGVuZ3Roc1tjdXJyZW50TGluZV0pIC8gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gMilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZU9mZnNldFggPSAobGluZURhdGEubG9uZ2VzdCAtIGxpbmVEYXRhLmxlbmd0aHNbY3VycmVudExpbmVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB4QWR2YW5jZSA9IDA7XHJcbiAgICAgICAgICAgIHlBZHZhbmNlICs9IGxpbmVIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxhc3RHbHlwaCA9IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2x5cGggPSBjaGFyc1tjaGFyQ29kZV07XHJcblxyXG4gICAgICAgIGlmICghZ2x5cGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdseXBoWCA9IHRleHR1cmVYICsgZ2x5cGgueDtcclxuICAgICAgICBnbHlwaFkgPSB0ZXh0dXJlWSArIGdseXBoLnk7XHJcblxyXG4gICAgICAgIGdseXBoVyA9IGdseXBoLndpZHRoO1xyXG4gICAgICAgIGdseXBoSCA9IGdseXBoLmhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHggPSBnbHlwaC54T2Zmc2V0ICsgeEFkdmFuY2U7XHJcbiAgICAgICAgdmFyIHkgPSBnbHlwaC55T2Zmc2V0ICsgeUFkdmFuY2U7XHJcblxyXG4gICAgICAgIGlmIChsYXN0R2x5cGggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIga2VybmluZ09mZnNldCA9IGdseXBoLmtlcm5pbmdbbGFzdENoYXJDb2RlXTtcclxuICAgICAgICAgICAgeCArPSAoa2VybmluZ09mZnNldCAhPT0gdW5kZWZpbmVkKSA/IGtlcm5pbmdPZmZzZXQgOiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeEFkdmFuY2UgKz0gZ2x5cGgueEFkdmFuY2UgKyBsZXR0ZXJTcGFjaW5nO1xyXG4gICAgICAgIGxhc3RHbHlwaCA9IGdseXBoO1xyXG4gICAgICAgIGxhc3RDaGFyQ29kZSA9IGNoYXJDb2RlO1xyXG5cclxuICAgICAgICAvLyAgTm90aGluZyB0byByZW5kZXIgb3IgYSBzcGFjZT8gVGhlbiBza2lwIHRvIHRoZSBuZXh0IGdseXBoXHJcbiAgICAgICAgaWYgKGdseXBoVyA9PT0gMCB8fCBnbHlwaEggPT09IDAgfHwgY2hhckNvZGUgPT09IDMyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB4ICo9IHNjYWxlO1xyXG4gICAgICAgIHkgKj0gc2NhbGU7XHJcblxyXG4gICAgICAgIHggLT0gc3JjLmRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHkgLT0gc3JjLmRpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICB4ICs9IGxpbmVPZmZzZXRYO1xyXG5cclxuICAgICAgICB2YXIgdTAgPSBnbHlwaFggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgdmFyIHYwID0gZ2x5cGhZIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICB2YXIgdTEgPSAoZ2x5cGhYICsgZ2x5cGhXKSAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICB2YXIgdjEgPSAoZ2x5cGhZICsgZ2x5cGhIKSAvIHRleHR1cmVIZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciB4dyA9IHggKyAoZ2x5cGhXICogc2NhbGUpO1xyXG4gICAgICAgIHZhciB5aCA9IHkgKyAoZ2x5cGhIICogc2NhbGUpO1xyXG5cclxuICAgICAgICB2YXIgdHgwID0gY2FsY01hdHJpeC5nZXRYKHgsIHkpO1xyXG4gICAgICAgIHZhciB0eTAgPSBjYWxjTWF0cml4LmdldFkoeCwgeSk7XHJcblxyXG4gICAgICAgIHZhciB0eDEgPSBjYWxjTWF0cml4LmdldFgoeCwgeWgpO1xyXG4gICAgICAgIHZhciB0eTEgPSBjYWxjTWF0cml4LmdldFkoeCwgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgyID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5aCk7XHJcbiAgICAgICAgdmFyIHR5MiA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgzID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5KTtcclxuICAgICAgICB2YXIgdHkzID0gY2FsY01hdHJpeC5nZXRZKHh3LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHJvdW5kUGl4ZWxzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHgwID0gTWF0aC5yb3VuZCh0eDApO1xyXG4gICAgICAgICAgICB0eTAgPSBNYXRoLnJvdW5kKHR5MCk7XHJcblxyXG4gICAgICAgICAgICB0eDEgPSBNYXRoLnJvdW5kKHR4MSk7XHJcbiAgICAgICAgICAgIHR5MSA9IE1hdGgucm91bmQodHkxKTtcclxuXHJcbiAgICAgICAgICAgIHR4MiA9IE1hdGgucm91bmQodHgyKTtcclxuICAgICAgICAgICAgdHkyID0gTWF0aC5yb3VuZCh0eTIpO1xyXG5cclxuICAgICAgICAgICAgdHgzID0gTWF0aC5yb3VuZCh0eDMpO1xyXG4gICAgICAgICAgICB0eTMgPSBNYXRoLnJvdW5kKHR5Myk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwaXBlbGluZS5iYXRjaFF1YWQodHgwLCB0eTAsIHR4MSwgdHkxLCB0eDIsIHR5MiwgdHgzLCB0eTMsIHUwLCB2MCwgdTEsIHYxLCB0aW50VEwsIHRpbnRUUiwgdGludEJMLCB0aW50QlIsIHRpbnRFZmZlY3QsIHRleHR1cmUsIDApO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCaXRtYXBUZXh0V2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmxpdHRlclJlbmRlciA9IHJlcXVpcmUoJy4vQmxpdHRlclJlbmRlcicpO1xyXG52YXIgQm9iID0gcmVxdWlyZSgnLi9Cb2InKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBGcmFtZSA9IHJlcXVpcmUoJy4uLy4uL3RleHR1cmVzL0ZyYW1lJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgTGlzdCA9IHJlcXVpcmUoJy4uLy4uL3N0cnVjdHMvTGlzdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBDcmVhdGVDYWxsYmFja1xyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Cb2J9IGJvYiAtIFRoZSBCb2IgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgQmxpdHRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgQm9iIHdpdGhpbiB0aGUgQmxpdHRlciBkaXNwbGF5IGxpc3QuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBCbGl0dGVyIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBUaGUgQmxpdHRlciBHYW1lIE9iamVjdCBpcyBhIHNwZWNpYWwga2luZCBvZiBjb250YWluZXIgdGhhdCBjcmVhdGVzLCB1cGRhdGVzIGFuZCBtYW5hZ2VzIEJvYiBvYmplY3RzLlxyXG4gKiBCb2JzIGFyZSBkZXNpZ25lZCBmb3IgcmVuZGVyaW5nIHNwZWVkIHJhdGhlciB0aGFuIGZsZXhpYmlsaXR5LiBUaGV5IGNvbnNpc3Qgb2YgYSB0ZXh0dXJlLCBvciBmcmFtZSBmcm9tIGEgdGV4dHVyZSxcclxuICogYSBwb3NpdGlvbiBhbmQgYW4gYWxwaGEgdmFsdWUuIFlvdSBjYW5ub3Qgc2NhbGUgb3Igcm90YXRlIHRoZW0uIFRoZXkgdXNlIGEgYmF0Y2hlZCBkcmF3aW5nIG1ldGhvZCBmb3Igc3BlZWRcclxuICogZHVyaW5nIHJlbmRlcmluZy5cclxuICpcclxuICogQSBCbGl0dGVyIEdhbWUgT2JqZWN0IGhhcyBvbmUgdGV4dHVyZSBib3VuZCB0byBpdC4gQm9icyBjcmVhdGVkIGJ5IHRoZSBCbGl0dGVyIGNhbiB1c2UgYW55IEZyYW1lIGZyb20gdGhpc1xyXG4gKiBUZXh0dXJlIHRvIHJlbmRlciB3aXRoLCBidXQgdGhleSBjYW5ub3QgdXNlIGFueSBvdGhlciBUZXh0dXJlLiBJdCBpcyB0aGlzIHNpbmdsZSB0ZXh0dXJlLWJpbmQgdGhhdCBhbGxvd3NcclxuICogdGhlbSB0aGVpciBzcGVlZC5cclxuICpcclxuICogSWYgeW91IGhhdmUgYSBuZWVkIHRvIGJsYXN0IGEgbGFyZ2Ugdm9sdW1lIG9mIGZyYW1lcyBhcm91bmQgdGhlIHNjcmVlbiB0aGVuIEJsaXR0ZXIgb2JqZWN0cyBhcmUgd2VsbCB3b3J0aFxyXG4gKiBpbnZlc3RpZ2F0aW5nLiBUaGV5IGFyZSBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgdXNpbmcgYXMgYSBiYXNlIGZvciB5b3VyIG93biBzcGVjaWFsIGVmZmVjdHMgc3lzdGVtcy5cclxuICpcclxuICogQGNsYXNzIEJsaXR0ZXJcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gSXQgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhbnkgZ2l2ZW4gdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dHVyZT0nX19ERUZBVUxUJ10gLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgZm9yIHJlbmRlcmluZy4gVGhlIFRleHR1cmUgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lPTBdIC0gVGhlIEZyYW1lIG9mIHRoZSBUZXh0dXJlIHRoYXQgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZS4gT25seSBzZXQgaWYgdGhlIFRleHR1cmUgaGFzIG11bHRpcGxlIGZyYW1lcywgc3VjaCBhcyBhIFRleHR1cmUgQXRsYXMgb3IgU3ByaXRlIFNoZWV0LlxyXG4gKi9cclxudmFyIEJsaXR0ZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdhbWVPYmplY3QsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5BbHBoYSxcclxuICAgICAgICBDb21wb25lbnRzLkJsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlRleHR1cmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIEJsaXR0ZXJSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBCbGl0dGVyIChzY2VuZSwgeCwgeSwgdGV4dHVyZSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnQmxpdHRlcicpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFRleHR1cmUodGV4dHVyZSwgZnJhbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5pbml0UGlwZWxpbmUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNoaWxkcmVuIG9mIHRoaXMgQmxpdHRlci5cclxuICAgICAgICAgKiBUaGlzIExpc3QgY29udGFpbnMgYWxsIG9mIHRoZSBCb2Igb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBCbGl0dGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXIjY2hpbGRyZW5cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlN0cnVjdHMuTGlzdC48UGhhc2VyLkdhbWVPYmplY3RzLkJvYj59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBMaXN0KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdHJhbnNpZW50IGFycmF5IHRoYXQgaG9sZHMgYWxsIG9mIHRoZSBCb2JzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCB0aGlzIGZyYW1lLlxyXG4gICAgICAgICAqIFRoZSBhcnJheSBpcyByZS1wb3B1bGF0ZWQgd2hlbmV2ZXIgdGhlIGRpcnR5IGZsYWcgaXMgc2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXIjcmVuZGVyTGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQm9iW119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVuZGVyTGlzdCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGUgQmxpdHRlciBjb25zaWRlcmVkIGRpcnR5P1xyXG4gICAgICAgICAqIEEgJ2RpcnR5JyBCbGl0dGVyIGhhcyBoYWQgaXRzIGNoaWxkIGNvdW50IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQmxpdHRlciNkaXJ0eVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEJvYiBpbiB0aGlzIEJsaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIEJvYiBpcyBjcmVhdGVkIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcywgcmVsYXRpdmUgdG8gdGhlIEJsaXR0ZXIgYW5kIHVzZXMgdGhlIGdpdmVuIGZyYW1lLlxyXG4gICAgICogQSBCb2IgY2FuIHVzZSBhbnkgZnJhbWUgYmVsb25naW5nIHRvIHRoZSB0ZXh0dXJlIGJvdW5kIHRvIHRoZSBCbGl0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXIjY3JlYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBCb2IuIEJvYiBjb29yZGluYXRlIGFyZSByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24gb2YgdGhlIEJsaXR0ZXIgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgQm9iLiBCb2IgY29vcmRpbmF0ZSBhcmUgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBCbGl0dGVyIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UZXh0dXJlcy5GcmFtZSl9IFtmcmFtZV0gLSBUaGUgRnJhbWUgdGhlIEJvYiB3aWxsIHVzZS4gSXQgX211c3RfIGJlIHBhcnQgb2YgdGhlIFRleHR1cmUgdGhlIHBhcmVudCBCbGl0dGVyIG9iamVjdCBpcyB1c2luZy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBTaG91bGQgdGhlIGNyZWF0ZWQgQm9iIHJlbmRlciBvciBub3Q/XHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleF0gLSBUaGUgcG9zaXRpb24gaW4gdGhlIEJsaXR0ZXJzIERpc3BsYXkgTGlzdCB0byBhZGQgdGhlIG5ldyBCb2IgYXQuIERlZmF1bHRzIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkJvYn0gVGhlIG5ld2x5IGNyZWF0ZWQgQm9iIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoeCwgeSwgZnJhbWUsIHZpc2libGUsIGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2aXNpYmxlID09PSB1bmRlZmluZWQpIHsgdmlzaWJsZSA9IHRydWU7IH1cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgeyBpbmRleCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyB9XHJcblxyXG4gICAgICAgIGlmIChmcmFtZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmZyYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghKGZyYW1lIGluc3RhbmNlb2YgRnJhbWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnJhbWUgPSB0aGlzLnRleHR1cmUuZ2V0KGZyYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBib2IgPSBuZXcgQm9iKHRoaXMsIHgsIHksIGZyYW1lLCB2aXNpYmxlKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRBdChib2IsIGluZGV4LCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9iO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgbXVsdGlwbGUgQm9iIG9iamVjdHMgd2l0aGluIHRoaXMgQmxpdHRlciBhbmQgdGhlbiBwYXNzZXMgZWFjaCBvZiB0aGVtIHRvIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQmxpdHRlciNjcmVhdGVGcm9tQ2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Q3JlYXRlQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciBjcmVhdGluZyBhIGJvYi4gSXQgd2lsbCBiZSBzZW50IHR3byBhcmd1bWVudHM6IFRoZSBCb2IgYW5kIHRoZSBpbmRleCBvZiB0aGUgQm9iLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBxdWFudGl0eSBvZiBCb2Igb2JqZWN0cyB0byBjcmVhdGUuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGV4dHVyZXMuRnJhbWV8c3RyaW5nW118aW50ZWdlcltdfFBoYXNlci5UZXh0dXJlcy5GcmFtZVtdKX0gW2ZyYW1lXSAtIFRoZSBGcmFtZSB0aGUgQm9icyB3aWxsIHVzZS4gSXQgbXVzdCBiZSBwYXJ0IG9mIHRoZSBCbGl0dGVyIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPXRydWVdIC0gU2hvdWxkIHRoZSBjcmVhdGVkIEJvYiByZW5kZXIgb3Igbm90P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5Cb2JbXX0gQW4gYXJyYXkgb2YgQm9iIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUZyb21DYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBxdWFudGl0eSwgZnJhbWUsIHZpc2libGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvYnMgPSB0aGlzLmNyZWF0ZU11bHRpcGxlKHF1YW50aXR5LCBmcmFtZSwgdmlzaWJsZSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9icy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBib2IgPSBib2JzW2ldO1xyXG5cclxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBib2IsIGkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJvYnM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBtdWx0aXBsZSBCb2JzIGluIG9uZSBjYWxsLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBhbW91bnQgY3JlYXRlZCBpcyBjb250cm9sbGVkIGJ5IGEgY29tYmluYXRpb24gb2YgdGhlIGBxdWFudGl0eWAgYXJndW1lbnQgYW5kIHRoZSBudW1iZXIgb2YgZnJhbWVzIHByb3ZpZGVkLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBxdWFudGl0eSBpcyBzZXQgdG8gMTAgYW5kIHlvdSBwcm92aWRlIDIgZnJhbWVzLCB0aGVuIDIwIEJvYnMgd2lsbCBiZSBjcmVhdGVkLiAxMCB3aXRoIHRoZSBmaXJzdFxyXG4gICAgICogZnJhbWUgYW5kIDEwIHdpdGggdGhlIHNlY29uZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CbGl0dGVyI2NyZWF0ZU11bHRpcGxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIHF1YW50aXR5IG9mIEJvYiBvYmplY3RzIHRvIGNyZWF0ZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UZXh0dXJlcy5GcmFtZXxzdHJpbmdbXXxpbnRlZ2VyW118UGhhc2VyLlRleHR1cmVzLkZyYW1lW10pfSBbZnJhbWVdIC0gVGhlIEZyYW1lIHRoZSBCb2JzIHdpbGwgdXNlLiBJdCBtdXN0IGJlIHBhcnQgb2YgdGhlIEJsaXR0ZXIgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBTaG91bGQgdGhlIGNyZWF0ZWQgQm9iIHJlbmRlciBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkJvYltdfSBBbiBhcnJheSBvZiBCb2Igb2JqZWN0cyB0aGF0IHdlcmUgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTXVsdGlwbGU6IGZ1bmN0aW9uIChxdWFudGl0eSwgZnJhbWUsIHZpc2libGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZyYW1lID09PSB1bmRlZmluZWQpIHsgZnJhbWUgPSB0aGlzLmZyYW1lLm5hbWU7IH1cclxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7IHZpc2libGUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcmFtZSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmcmFtZSA9IFsgZnJhbWUgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBib2JzID0gW107XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgZnJhbWUuZm9yRWFjaChmdW5jdGlvbiAoc2luZ2xlRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvYnMucHVzaChfdGhpcy5jcmVhdGUoMCwgMCwgc2luZ2xlRnJhbWUsIHZpc2libGUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9icztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGNoaWxkIGNhbiByZW5kZXIgb3Igbm90LCBieSBjaGVja2luZyBpdHMgYHZpc2libGVgIGFuZCBgYWxwaGFgIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CbGl0dGVyI2NoaWxkQ2FuUmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Cb2J9IGNoaWxkIC0gVGhlIEJvYiB0byBjaGVjayBmb3IgcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBjaGlsZCBjYW4gcmVuZGVyLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgY2hpbGRDYW5SZW5kZXI6IGZ1bmN0aW9uIChjaGlsZClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKGNoaWxkLnZpc2libGUgJiYgY2hpbGQuYWxwaGEgPiAwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEJvYnMgdG8gYmUgcmVuZGVyZWQuXHJcbiAgICAgKiBJZiB0aGUgQmxpdHRlciBpcyBkaXJ0eSB0aGVuIGEgbmV3IGxpc3QgaXMgZ2VuZXJhdGVkIGFuZCBzdG9yZWQgaW4gYHJlbmRlckxpc3RgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXIjZ2V0UmVuZGVyTGlzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkJvYltdfSBBbiBhcnJheSBvZiBCb2Igb2JqZWN0cyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgdGhpcyBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVuZGVyTGlzdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5kaXJ0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTGlzdCA9IHRoaXMuY2hpbGRyZW4ubGlzdC5maWx0ZXIodGhpcy5jaGlsZENhblJlbmRlciwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckxpc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgQm9icyBmcm9tIHRoZSBjaGlsZHJlbiBMaXN0IGFuZCBjbGVhcnMgdGhlIGRpcnR5IGZsYWcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQmxpdHRlciNjbGVhclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgZGVzdHJveSBoYW5kbGVyLCBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVzdHJveSBwcm9jZXNzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXIjcHJlRGVzdHJveVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgKi9cclxuICAgIHByZURlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyTGlzdCA9IFtdO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJsaXR0ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5CbGl0dGVyI3JlbmRlckNhbnZhc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXJ9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBCbGl0dGVyQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgbGlzdCA9IHNyYy5nZXRSZW5kZXJMaXN0KCk7XHJcblxyXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChhbHBoYSA9PT0gMClcclxuICAgIHtcclxuICAgICAgICAvLyAgTm90aGluZyB0byBzZWUsIHNvIGFib3J0IGVhcmx5XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBCbGVuZCBNb2RlICsgU2NhbGUgTW9kZVxyXG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHJlbmRlcmVyLmJsZW5kTW9kZXNbc3JjLmJsZW5kTW9kZV07XHJcblxyXG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICEoIXJlbmRlcmVyLmFudGlhbGlhcyB8fCBzcmMuZnJhbWUuc291cmNlLnNjYWxlTW9kZSk7XHJcblxyXG4gICAgdmFyIGNhbWVyYVNjcm9sbFggPSBzcmMueCAtIGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICB2YXIgY2FtZXJhU2Nyb2xsWSA9IHNyYy55IC0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuXHJcbiAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgcGFyZW50TWF0cml4LmNvcHlUb0NvbnRleHQoY3R4KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcm91bmRQaXhlbHMgPSBjYW1lcmEucm91bmRQaXhlbHM7XHJcblxyXG4gICAgLy8gIFJlbmRlciBib2JzXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvYiA9IGxpc3RbaV07XHJcbiAgICAgICAgdmFyIGZsaXAgPSAoYm9iLmZsaXBYIHx8IGJvYi5mbGlwWSk7XHJcbiAgICAgICAgdmFyIGZyYW1lID0gYm9iLmZyYW1lO1xyXG4gICAgICAgIHZhciBjZCA9IGZyYW1lLmNhbnZhc0RhdGE7XHJcbiAgICAgICAgdmFyIGR4ID0gZnJhbWUueDtcclxuICAgICAgICB2YXIgZHkgPSBmcmFtZS55O1xyXG4gICAgICAgIHZhciBmeCA9IDE7XHJcbiAgICAgICAgdmFyIGZ5ID0gMTtcclxuXHJcbiAgICAgICAgdmFyIGJvYkFscGhhID0gYm9iLmFscGhhICogYWxwaGE7XHJcblxyXG4gICAgICAgIGlmIChib2JBbHBoYSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYm9iQWxwaGE7XHJcbiAgICBcclxuICAgICAgICBpZiAoIWZsaXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocm91bmRQaXhlbHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGR4ID0gTWF0aC5yb3VuZChkeCk7XHJcbiAgICAgICAgICAgICAgICBkeSA9IE1hdGgucm91bmQoZHkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgZnJhbWUuc291cmNlLmltYWdlLFxyXG4gICAgICAgICAgICAgICAgY2QueCxcclxuICAgICAgICAgICAgICAgIGNkLnksXHJcbiAgICAgICAgICAgICAgICBjZC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGNkLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGR4ICsgYm9iLnggKyBjYW1lcmFTY3JvbGxYLFxyXG4gICAgICAgICAgICAgICAgZHkgKyBib2IueSArIGNhbWVyYVNjcm9sbFksXHJcbiAgICAgICAgICAgICAgICBjZC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGNkLmhlaWdodFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYm9iLmZsaXBYKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmeCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZHggLT0gY2Qud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChib2IuZmxpcFkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZ5ID0gLTE7XHJcbiAgICAgICAgICAgICAgICBkeSAtPSBjZC5oZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XHJcbiAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoYm9iLnggKyBjYW1lcmFTY3JvbGxYLCBib2IueSArIGNhbWVyYVNjcm9sbFkpO1xyXG4gICAgICAgICAgICBjdHguc2NhbGUoZngsIGZ5KTtcclxuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShmcmFtZS5zb3VyY2UuaW1hZ2UsIGNkLngsIGNkLnksIGNkLndpZHRoLCBjZC5oZWlnaHQsIGR4LCBkeSwgY2Qud2lkdGgsIGNkLmhlaWdodCk7XHJcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjdHgucmVzdG9yZSgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCbGl0dGVyQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJsaXR0ZXIgPSByZXF1aXJlKCcuL0JsaXR0ZXInKTtcclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0J1aWxkR2FtZU9iamVjdCcpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBCbGl0dGVyIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBCbGl0dGVyIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNibGl0dGVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5CbGl0dGVyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdibGl0dGVyJywgZnVuY3Rpb24gKGNvbmZpZywgYWRkVG9TY2VuZSlcclxue1xyXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgdmFyIGtleSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAna2V5JywgbnVsbCk7XHJcbiAgICB2YXIgZnJhbWUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgbnVsbCk7XHJcblxyXG4gICAgdmFyIGJsaXR0ZXIgPSBuZXcgQmxpdHRlcih0aGlzLnNjZW5lLCAwLCAwLCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdCh0aGlzLnNjZW5lLCBibGl0dGVyLCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiBibGl0dGVyO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCbGl0dGVyID0gcmVxdWlyZSgnLi9CbGl0dGVyJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBCbGl0dGVyIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQmxpdHRlciBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjYmxpdHRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGUgQmxpdHRlciBvYmplY3Qgd2lsbCB1c2UuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBkZWZhdWx0IEZyYW1lIGNoaWxkcmVuIG9mIHRoZSBCbGl0dGVyIHdpbGwgdXNlLlxyXG4gKiBcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXJ9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2JsaXR0ZXInLCBmdW5jdGlvbiAoeCwgeSwga2V5LCBmcmFtZSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBCbGl0dGVyKHRoaXMuc2NlbmUsIHgsIHksIGtleSwgZnJhbWUpKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy8gIFxyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vLyAgXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vQmxpdHRlcldlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vQmxpdHRlckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQmxpdHRlciNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXJ9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBCbGl0dGVyV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBsaXN0ID0gc3JjLmdldFJlbmRlckxpc3QoKTtcclxuXHJcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgcmVuZGVyZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUsIHNyYyk7XHJcblxyXG4gICAgdmFyIGNhbWVyYVNjcm9sbFggPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgdmFyIGNhbWVyYVNjcm9sbFkgPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG5cclxuICAgIGNhbGNNYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICBjYWxjTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmFTY3JvbGxYLCAtY2FtZXJhU2Nyb2xsWSk7XHJcblxyXG4gICAgICAgIGNhbWVyYVNjcm9sbFggPSAwO1xyXG4gICAgICAgIGNhbWVyYVNjcm9sbFkgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBibGl0dGVyWCA9IHNyYy54IC0gY2FtZXJhU2Nyb2xsWDtcclxuICAgIHZhciBibGl0dGVyWSA9IHNyYy55IC0gY2FtZXJhU2Nyb2xsWTtcclxuICAgIHZhciBwcmV2VGV4dHVyZVNvdXJjZUluZGV4ID0gLTE7XHJcbiAgICB2YXIgdGludEVmZmVjdCA9IGZhbHNlO1xyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG4gICAgdmFyIHJvdW5kUGl4ZWxzID0gY2FtZXJhLnJvdW5kUGl4ZWxzO1xyXG5cclxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgYm9iID0gbGlzdFtpbmRleF07XHJcbiAgICAgICAgdmFyIGZyYW1lID0gYm9iLmZyYW1lO1xyXG4gICAgICAgIHZhciBib2JBbHBoYSA9IGJvYi5hbHBoYSAqIGFscGhhO1xyXG5cclxuICAgICAgICBpZiAoYm9iQWxwaGEgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB3aWR0aCA9IGZyYW1lLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBmcmFtZS5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciB4ID0gYmxpdHRlclggKyBib2IueCArIGZyYW1lLng7XHJcbiAgICAgICAgdmFyIHkgPSBibGl0dGVyWSArIGJvYi55ICsgZnJhbWUueTtcclxuXHJcbiAgICAgICAgaWYgKGJvYi5mbGlwWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpZHRoICo9IC0xO1xyXG4gICAgICAgICAgICB4ICs9IGZyYW1lLndpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJvYi5mbGlwWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlaWdodCAqPSAtMTtcclxuICAgICAgICAgICAgeSArPSBmcmFtZS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgeHcgPSB4ICsgd2lkdGg7XHJcbiAgICAgICAgdmFyIHloID0geSArIGhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHR4MCA9IGNhbGNNYXRyaXguZ2V0WCh4LCB5KTtcclxuICAgICAgICB2YXIgdHkwID0gY2FsY01hdHJpeC5nZXRZKHgsIHkpO1xyXG5cclxuICAgICAgICB2YXIgdHgxID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5aCk7XHJcbiAgICAgICAgdmFyIHR5MSA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhKGJvYi50aW50LCBib2JBbHBoYSk7XHJcblxyXG4gICAgICAgIC8vICBCaW5kIHRleHR1cmUgb25seSBpZiB0aGUgVGV4dHVyZSBTb3VyY2UgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXHJcbiAgICAgICAgaWYgKGZyYW1lLnNvdXJjZUluZGV4ICE9PSBwcmV2VGV4dHVyZVNvdXJjZUluZGV4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKGZyYW1lLmdsVGV4dHVyZSwgMCk7XHJcblxyXG4gICAgICAgICAgICBwcmV2VGV4dHVyZVNvdXJjZUluZGV4ID0gZnJhbWUuc291cmNlSW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocm91bmRQaXhlbHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0eDAgPSBNYXRoLnJvdW5kKHR4MCk7XHJcbiAgICAgICAgICAgIHR5MCA9IE1hdGgucm91bmQodHkwKTtcclxuXHJcbiAgICAgICAgICAgIHR4MSA9IE1hdGgucm91bmQodHgxKTtcclxuICAgICAgICAgICAgdHkxID0gTWF0aC5yb3VuZCh0eTEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRMIHgveSwgQkwgeC95LCBCUiB4L3ksIFRSIHgveVxyXG4gICAgICAgIGlmIChwaXBlbGluZS5iYXRjaFF1YWQodHgwLCB0eTAsIHR4MCwgdHkxLCB0eDEsIHR5MSwgdHgxLCB0eTAsIGZyYW1lLnUwLCBmcmFtZS52MCwgZnJhbWUudTEsIGZyYW1lLnYxLCB0aW50LCB0aW50LCB0aW50LCB0aW50LCB0aW50RWZmZWN0LCBmcmFtZS5nbFRleHR1cmUsIDApKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJldlRleHR1cmVTb3VyY2VJbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmxpdHRlcldlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZyYW1lID0gcmVxdWlyZSgnLi4vLi4vdGV4dHVyZXMvRnJhbWUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQm9iIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBBIEJvYiBiZWxvbmdzIHRvIGEgQmxpdHRlciBHYW1lIE9iamVjdC4gVGhlIEJsaXR0ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGFuZCByZW5kZXJpbmcgdGhpcyBvYmplY3QuXHJcbiAqXHJcbiAqIEEgQm9iIGhhcyBhIHBvc2l0aW9uLCBhbHBoYSB2YWx1ZSBhbmQgYSBmcmFtZSBmcm9tIGEgdGV4dHVyZSB0aGF0IGl0IHVzZXMgdG8gcmVuZGVyIHdpdGguIFlvdSBjYW4gYWxzbyB0b2dnbGVcclxuICogdGhlIGZsaXBwZWQgYW5kIHZpc2libGUgc3RhdGUgb2YgdGhlIEJvYi4gVGhlIEZyYW1lIHRoZSBCb2IgdXNlcyB0byByZW5kZXIgY2FuIGJlIGNoYW5nZWQgZHluYW1pY2FsbHksIGJ1dCBpdFxyXG4gKiBtdXN0IGJlIGEgRnJhbWUgd2l0aGluIHRoZSBUZXh0dXJlIHVzZWQgYnkgdGhlIHBhcmVudCBCbGl0dGVyLlxyXG4gKlxyXG4gKiBCb2IgcG9zaXRpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgQmxpdHRlciBwYXJlbnQuIFNvIGlmIHlvdSBtb3ZlIHRoZSBCbGl0dGVyIHBhcmVudCwgYWxsIEJvYiBjaGlsZHJlbiB3aWxsXHJcbiAqIGhhdmUgdGhlaXIgcG9zaXRpb25zIGltcGFjdGVkIGJ5IHRoaXMgY2hhbmdlIGFzIHdlbGwuXHJcbiAqXHJcbiAqIFlvdSBjYW4gbWFuaXB1bGF0ZSBCb2Igb2JqZWN0cyBkaXJlY3RseSBmcm9tIHlvdXIgZ2FtZSBjb2RlLCBidXQgdGhlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiB0aGVtIHNob3VsZCBiZVxyXG4gKiBoYW5kbGVkIHZpYSB0aGUgQmxpdHRlciBwYXJlbnQuXHJcbiAqXHJcbiAqIEBjbGFzcyBCb2JcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXJ9IGJsaXR0ZXIgLSBUaGUgcGFyZW50IEJsaXR0ZXIgb2JqZWN0IGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGlzIEJvYi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZCwgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBCbGl0dGVyIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZCwgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBCbGl0dGVyIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IGZyYW1lIC0gVGhlIEZyYW1lIHRoaXMgQm9iIHdpbGwgcmVuZGVyIHdpdGgsIGFzIGRlZmluZWQgaW4gdGhlIFRleHR1cmUgdGhlIHBhcmVudCBCbGl0dGVyIGlzIHVzaW5nLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZpc2libGUgLSBTaG91bGQgdGhlIEJvYiByZW5kZXIgdmlzaWJsZSBvciBub3QgdG8gc3RhcnQgd2l0aD9cclxuICovXHJcbnZhciBCb2IgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQm9iIChibGl0dGVyLCB4LCB5LCBmcmFtZSwgdmlzaWJsZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQmxpdHRlciBvYmplY3QgdGhhdCB0aGlzIEJvYiBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNwYXJlbnRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkJsaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBibGl0dGVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeCBwb3NpdGlvbiBvZiB0aGlzIEJvYiwgcmVsYXRpdmUgdG8gdGhlIHggcG9zaXRpb24gb2YgdGhlIEJsaXR0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB5IHBvc2l0aW9uIG9mIHRoaXMgQm9iLCByZWxhdGl2ZSB0byB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgQmxpdHRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Cb2IjeVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZyYW1lIHRoYXQgdGhlIEJvYiB1c2VzIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICAgICAqIFRvIGNoYW5nZSB0aGUgZnJhbWUgdXNlIHRoZSBgQm9iLnNldEZyYW1lYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI2ZyYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5GcmFtZX1cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGJsYW5rIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byBzdG9yZSBkYXRhIHJlbGF0ZWQgdG8gdGhpcyBCb2IgaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHt9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kYXRhID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW50IHZhbHVlIG9mIHRoaXMgQm9iLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiN0aW50XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAweGZmZmZmZlxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbnQgPSAweGZmZmZmZjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZpc2libGUgc3RhdGUgb2YgdGhpcyBCb2IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI192aXNpYmxlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl92aXNpYmxlID0gdmlzaWJsZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFscGhhIHZhbHVlIG9mIHRoaXMgQm9iLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNfYWxwaGFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2FscGhhID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWxseSBmbGlwcGVkIHN0YXRlIG9mIHRoZSBCb2IuXHJcbiAgICAgICAgICogQSBCb2IgdGhhdCBpcyBmbGlwcGVkIGhvcml6b250YWxseSB3aWxsIHJlbmRlciBpbnZlcnNlZCBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLlxyXG4gICAgICAgICAqIEZsaXBwaW5nIGFsd2F5cyB0YWtlcyBwbGFjZSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI2ZsaXBYXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mbGlwWCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWxseSBmbGlwcGVkIHN0YXRlIG9mIHRoZSBCb2IuXHJcbiAgICAgICAgICogQSBCb2IgdGhhdCBpcyBmbGlwcGVkIHZlcnRpY2FsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIHZlcnRpY2FsIGF4aXMgKGkuZS4gdXBzaWRlIGRvd24pXHJcbiAgICAgICAgICogRmxpcHBpbmcgYWx3YXlzIHRha2VzIHBsYWNlIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Cb2IjZmxpcFlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZsaXBZID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyB0aGUgVGV4dHVyZSBGcmFtZSBiZWluZyB1c2VkIGJ5IHRoaXMgQm9iLlxyXG4gICAgICogVGhlIGZyYW1lIG11c3QgYmUgcGFydCBvZiB0aGUgVGV4dHVyZSB0aGUgcGFyZW50IEJsaXR0ZXIgaXMgdXNpbmcuXHJcbiAgICAgKiBJZiBubyB2YWx1ZSBpcyBnaXZlbiBpdCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmcmFtZSBvZiB0aGUgQmxpdHRlciBwYXJlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI3NldEZyYW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGV4dHVyZXMuRnJhbWUpfSBbZnJhbWVdIC0gVGhlIGZyYW1lIHRvIGJlIHVzZWQgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEJvYiBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RnJhbWU6IGZ1bmN0aW9uIChmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZnJhbWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSB0aGlzLnBhcmVudC5mcmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZnJhbWUgaW5zdGFuY2VvZiBGcmFtZSAmJiBmcmFtZS50ZXh0dXJlID09PSB0aGlzLnBhcmVudC50ZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy5wYXJlbnQudGV4dHVyZS5nZXQoZnJhbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBmbGlwcGVkIHN0YXRlIG9mIHRoaXMgQm9iIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB1bi1mbGlwcGVkIHN0YXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNyZXNldEZsaXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXNldEZsaXA6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mbGlwWCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMgQm9iLlxyXG4gICAgICpcclxuICAgICAqIENoYW5nZXMgdGhlIHBvc2l0aW9uIHRvIHRoZSB2YWx1ZXMgZ2l2ZW4sIGFuZCBvcHRpb25hbGx5IGNoYW5nZXMgdGhlIGZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEFsc28gcmVzZXRzIHRoZSBmbGlwWCBhbmQgZmxpcFkgdmFsdWVzLCBzZXRzIGFscGhhIGJhY2sgdG8gMSBhbmQgdmlzaWJsZSB0byB0cnVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgQm9iLiBCb2IgY29vcmRpbmF0ZSBhcmUgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBCbGl0dGVyIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIEJvYi4gQm9iIGNvb3JkaW5hdGUgYXJlIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgQmxpdHRlciBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGV4dHVyZXMuRnJhbWUpfSBbZnJhbWVdIC0gVGhlIEZyYW1lIHRoZSBCb2Igd2lsbCB1c2UuIEl0IF9tdXN0XyBiZSBwYXJ0IG9mIHRoZSBUZXh0dXJlIHRoZSBwYXJlbnQgQmxpdHRlciBvYmplY3QgaXMgdXNpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBCb2IgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0OiBmdW5jdGlvbiAoeCwgeSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICB0aGlzLmZsaXBYID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9hbHBoYSA9IDE7XHJcbiAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50LmRpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGcmFtZShmcmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGlzIEJvYiB0byB0aGUgdmFsdWVzIGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIEJvYi4gQm9iIGNvb3JkaW5hdGUgYXJlIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgQmxpdHRlciBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBCb2IuIEJvYiBjb29yZGluYXRlIGFyZSByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24gb2YgdGhlIEJsaXR0ZXIgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGZsaXBwZWQgc3RhdGUgb2YgdGhpcyBCb2IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI3NldEZsaXBYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIGZsaXBwZWQgc3RhdGUuIGBmYWxzZWAgZm9yIG5vIGZsaXAsIG9yIGB0cnVlYCB0byBiZSBmbGlwcGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGbGlwWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmxpcFggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVydGljYWwgZmxpcHBlZCBzdGF0ZSBvZiB0aGlzIEJvYi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Cb2Ijc2V0RmxpcFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgZmxpcHBlZCBzdGF0ZS4gYGZhbHNlYCBmb3Igbm8gZmxpcCwgb3IgYHRydWVgIHRvIGJlIGZsaXBwZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBCb2IgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZsaXBZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mbGlwWSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBmbGlwcGVkIHN0YXRlIG9mIHRoaXMgQm9iLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNzZXRGbGlwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHggLSBUaGUgaG9yaXpvbnRhbCBmbGlwcGVkIHN0YXRlLiBgZmFsc2VgIGZvciBubyBmbGlwLCBvciBgdHJ1ZWAgdG8gYmUgZmxpcHBlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0geSAtIFRoZSBob3Jpem9udGFsIGZsaXBwZWQgc3RhdGUuIGBmYWxzZWAgZm9yIG5vIGZsaXAsIG9yIGB0cnVlYCB0byBiZSBmbGlwcGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGbGlwOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZsaXBYID0geDtcclxuICAgICAgICB0aGlzLmZsaXBZID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIEJvYi5cclxuICAgICAqIFxyXG4gICAgICogQW4gaW52aXNpYmxlIEJvYiB3aWxsIHNraXAgcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNzZXRWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgQWxwaGEgbGV2ZWwgb2YgdGhpcyBCb2IuIFRoZSBhbHBoYSBjb250cm9scyB0aGUgb3BhY2l0eSBvZiB0aGUgR2FtZSBPYmplY3QgYXMgaXQgcmVuZGVycy5cclxuICAgICAqIEFscGhhIHZhbHVlcyBhcmUgcHJvdmlkZWQgYXMgYSBmbG9hdCBiZXR3ZWVuIDAsIGZ1bGx5IHRyYW5zcGFyZW50LCBhbmQgMSwgZnVsbHkgb3BhcXVlLlxyXG4gICAgICogXHJcbiAgICAgKiBBIEJvYiB3aXRoIGFscGhhIDAgd2lsbCBza2lwIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Cb2Ijc2V0QWxwaGFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbHBoYSB2YWx1ZSB1c2VkIGZvciB0aGlzIEJvYi4gQmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbHBoYTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWxwaGEgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGludCBvZiB0aGlzIEJvYi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Cb2Ijc2V0VGludFxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW50IHZhbHVlIHVzZWQgZm9yIHRoaXMgQm9iLiBCZXR3ZWVuIDAgYW5kIDB4ZmZmZmZmLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9iIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaW50OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aW50ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgQm9iIGluc3RhbmNlLlxyXG4gICAgICogUmVtb3ZlcyBpdHNlbGYgZnJvbSB0aGUgQmxpdHRlciBhbmQgY2xlYXJzIHRoZSBwYXJlbnQsIGZyYW1lIGFuZCBkYXRhIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQm9iI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGFyZW50LmRpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnQuY2hpbGRyZW4ucmVtb3ZlKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmZyYW1lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgQm9iLlxyXG4gICAgICogXHJcbiAgICAgKiBBbiBpbnZpc2libGUgQm9iIHdpbGwgc2tpcCByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiN2aXNpYmxlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2aXNpYmxlOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGlydHkgfD0gKHRoaXMuX3Zpc2libGUgIT09IHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBCb2IsIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIFxyXG4gICAgICogQSBCb2Igd2l0aCBhbHBoYSAwIHdpbGwgc2tpcCByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkJvYiNhbHBoYVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBhbHBoYToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGE7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5kaXJ0eSB8PSAoKHRoaXMuX2FscGhhID4gMCkgIT09ICh2YWx1ZSA+IDApKTtcclxuICAgICAgICAgICAgdGhpcy5fYWxwaGEgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJvYjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0NsYW1wJyk7XHJcblxyXG4vLyAgYml0bWFzayBmbGFnIGZvciBHYW1lT2JqZWN0LnJlbmRlck1hc2tcclxudmFyIF9GTEFHID0gMjsgLy8gMDAxMFxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgYWxwaGEgcHJvcGVydGllcyBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgQWxwaGEgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgZ2xvYmFsIGFscGhhIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhI19hbHBoYVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgX2FscGhhOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIHRvcC1sZWZ0IGFscGhhIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhI19hbHBoYVRMXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfYWxwaGFUTDogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuIEhvbGRzIHRoZSB0b3AtcmlnaHQgYWxwaGEgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGEjX2FscGhhVFJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF9hbHBoYVRSOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGJvdHRvbS1sZWZ0IGFscGhhIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhI19hbHBoYUJMXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfYWxwaGFCTDogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuIEhvbGRzIHRoZSBib3R0b20tcmlnaHQgYWxwaGEgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGEjX2FscGhhQlJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF9hbHBoYUJSOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIGFsbCBhbHBoYSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSW1tZWRpYXRlbHkgc2V0cyB0aGUgYWxwaGEgbGV2ZWxzIGJhY2sgdG8gMSAoZnVsbHkgb3BhcXVlKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhI2NsZWFyQWxwaGFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyQWxwaGE6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QWxwaGEoMSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBBbHBoYSBsZXZlbCBvZiB0aGlzIEdhbWUgT2JqZWN0LiBUaGUgYWxwaGEgY29udHJvbHMgdGhlIG9wYWNpdHkgb2YgdGhlIEdhbWUgT2JqZWN0IGFzIGl0IHJlbmRlcnMuXHJcbiAgICAgKiBBbHBoYSB2YWx1ZXMgYXJlIHByb3ZpZGVkIGFzIGEgZmxvYXQgYmV0d2VlbiAwLCBmdWxseSB0cmFuc3BhcmVudCwgYW5kIDEsIGZ1bGx5IG9wYXF1ZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3VyIGdhbWUgaXMgcnVubmluZyB1bmRlciBXZWJHTCB5b3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBmb3VyIGRpZmZlcmVudCBhbHBoYSB2YWx1ZXMsIGVhY2ggb2Ygd2hpY2hcclxuICAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIGZvdXIgY29ybmVycyBvZiB0aGUgR2FtZSBPYmplY3QuIFVuZGVyIENhbnZhcyBvbmx5IHRoZSBgdG9wTGVmdGAgdmFsdWUgZ2l2ZW4gaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhI3NldEFscGhhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RvcExlZnQ9MV0gLSBUaGUgYWxwaGEgdmFsdWUgdXNlZCBmb3IgdGhlIHRvcC1sZWZ0IG9mIHRoZSBHYW1lIE9iamVjdC4gSWYgdGhpcyBpcyB0aGUgb25seSB2YWx1ZSBnaXZlbiBpdCdzIGFwcGxpZWQgYWNyb3NzIHRoZSB3aG9sZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdG9wUmlnaHRdIC0gVGhlIGFscGhhIHZhbHVlIHVzZWQgZm9yIHRoZSB0b3AtcmlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LiBXZWJHTCBvbmx5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b21MZWZ0XSAtIFRoZSBhbHBoYSB2YWx1ZSB1c2VkIGZvciB0aGUgYm90dG9tLWxlZnQgb2YgdGhlIEdhbWUgT2JqZWN0LiBXZWJHTCBvbmx5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b21SaWdodF0gLSBUaGUgYWxwaGEgdmFsdWUgdXNlZCBmb3IgdGhlIGJvdHRvbS1yaWdodCBvZiB0aGUgR2FtZSBPYmplY3QuIFdlYkdMIG9ubHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uICh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRvcExlZnQgPT09IHVuZGVmaW5lZCkgeyB0b3BMZWZ0ID0gMTsgfVxyXG5cclxuICAgICAgICAvLyAgVHJlYXQgYXMgaWYgdGhlcmUgaXMgb25seSBvbmUgYWxwaGEgdmFsdWUgZm9yIHRoZSB3aG9sZSBHYW1lIE9iamVjdFxyXG4gICAgICAgIGlmICh0b3BSaWdodCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5hbHBoYSA9IHRvcExlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FscGhhVEwgPSBDbGFtcCh0b3BMZWZ0LCAwLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fYWxwaGFUUiA9IENsYW1wKHRvcFJpZ2h0LCAwLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5fYWxwaGFCTCA9IENsYW1wKGJvdHRvbUxlZnQsIDAsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLl9hbHBoYUJSID0gQ2xhbXAoYm90dG9tUmlnaHQsIDAsIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGEgZ2xvYmFsIHZhbHVlLCBpbXBhY3RpbmcgdGhlIGVudGlyZSBHYW1lIE9iamVjdCwgbm90IGp1c3QgYSByZWdpb24gb2YgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGEjYWxwaGFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYWxwaGE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBDbGFtcCh2YWx1ZSwgMCwgMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hbHBoYSA9IHY7XHJcbiAgICAgICAgICAgIHRoaXMuX2FscGhhVEwgPSB2O1xyXG4gICAgICAgICAgICB0aGlzLl9hbHBoYVRSID0gdjtcclxuICAgICAgICAgICAgdGhpcy5fYWxwaGFCTCA9IHY7XHJcbiAgICAgICAgICAgIHRoaXMuX2FscGhhQlIgPSB2O1xyXG5cclxuICAgICAgICAgICAgaWYgKHYgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgJj0gfl9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHZhbHVlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcC1sZWZ0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoaXMgdmFsdWUgaXMgaW50ZXJwb2xhdGVkIGZyb20gdGhlIGNvcm5lciB0byB0aGUgY2VudGVyIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYSNhbHBoYVRvcExlZnRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYWxwaGFUb3BMZWZ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbHBoYVRMO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBDbGFtcCh2YWx1ZSwgMCwgMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hbHBoYVRMID0gdjtcclxuXHJcbiAgICAgICAgICAgIGlmICh2ICE9PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWxwaGEgdmFsdWUgc3RhcnRpbmcgZnJvbSB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoaXMgdmFsdWUgaXMgaW50ZXJwb2xhdGVkIGZyb20gdGhlIGNvcm5lciB0byB0aGUgY2VudGVyIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYSNhbHBoYVRvcFJpZ2h0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGFscGhhVG9wUmlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhVFI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdiA9IENsYW1wKHZhbHVlLCAwLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FscGhhVFIgPSB2O1xyXG5cclxuICAgICAgICAgICAgaWYgKHYgIT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD0gX0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhbHBoYSB2YWx1ZSBzdGFydGluZyBmcm9tIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIGludGVycG9sYXRlZCBmcm9tIHRoZSBjb3JuZXIgdG8gdGhlIGNlbnRlciBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGEjYWxwaGFCb3R0b21MZWZ0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGFscGhhQm90dG9tTGVmdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGFCTDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gQ2xhbXAodmFsdWUsIDAsIDEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWxwaGFCTCA9IHY7XHJcblxyXG4gICAgICAgICAgICBpZiAodiAhPT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFscGhhIHZhbHVlIHN0YXJ0aW5nIGZyb20gdGhlIGJvdHRvbS1yaWdodCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIGludGVycG9sYXRlZCBmcm9tIHRoZSBjb3JuZXIgdG8gdGhlIGNlbnRlciBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGEjYWxwaGFCb3R0b21SaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBhbHBoYUJvdHRvbVJpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbHBoYUJSO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBDbGFtcCh2YWx1ZSwgMCwgMSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9hbHBoYUJSID0gdjtcclxuXHJcbiAgICAgICAgICAgIGlmICh2ICE9PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFscGhhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFtcCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvQ2xhbXAnKTtcclxuXHJcbi8vICBiaXRtYXNrIGZsYWcgZm9yIEdhbWVPYmplY3QucmVuZGVyTWFza1xyXG52YXIgX0ZMQUcgPSAyOyAvLyAwMDEwXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBhbHBoYSBwcm9wZXJ0eSBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZVxyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqL1xyXG5cclxudmFyIEFscGhhU2luZ2xlID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGdsb2JhbCBhbHBoYSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZSNfYWxwaGFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF9hbHBoYTogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBhbGwgYWxwaGEgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEltbWVkaWF0ZWx5IHNldHMgdGhlIGFscGhhIGxldmVscyBiYWNrIHRvIDEgKGZ1bGx5IG9wYXF1ZSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZSNjbGVhckFscGhhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjbGVhckFscGhhOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEFscGhhKDEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgQWxwaGEgbGV2ZWwgb2YgdGhpcyBHYW1lIE9iamVjdC4gVGhlIGFscGhhIGNvbnRyb2xzIHRoZSBvcGFjaXR5IG9mIHRoZSBHYW1lIE9iamVjdCBhcyBpdCByZW5kZXJzLlxyXG4gICAgICogQWxwaGEgdmFsdWVzIGFyZSBwcm92aWRlZCBhcyBhIGZsb2F0IGJldHdlZW4gMCwgZnVsbHkgdHJhbnNwYXJlbnQsIGFuZCAxLCBmdWxseSBvcGFxdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZSNzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIFRoZSBhbHBoYSB2YWx1ZSBhcHBsaWVkIGFjcm9zcyB0aGUgd2hvbGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDE7IH1cclxuXHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWxwaGEgdmFsdWUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgaXMgYSBnbG9iYWwgdmFsdWUsIGltcGFjdGluZyB0aGUgZW50aXJlIEdhbWUgT2JqZWN0LCBub3QganVzdCBhIHJlZ2lvbiBvZiBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZSNhbHBoYVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBhbHBoYToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGE7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdiA9IENsYW1wKHZhbHVlLCAwLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FscGhhID0gdjtcclxuXHJcbiAgICAgICAgICAgIGlmICh2ID09PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzICY9IH5fRkxBRztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD0gX0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQWxwaGFTaW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJhc2VBbmltYXRpb24gPSByZXF1aXJlKCcuLi8uLi9hbmltYXRpb25zL0FuaW1hdGlvbicpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vYW5pbWF0aW9ucy9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgR2FtZSBPYmplY3QgQW5pbWF0aW9uIENvbnRyb2xsZXIuXHJcbiAqXHJcbiAqIFRoaXMgY29udHJvbGxlciBsaXZlcyBhcyBhbiBpbnN0YW5jZSB3aXRoaW4gYSBHYW1lIE9iamVjdCwgYWNjZXNzaWJsZSBhcyBgc3ByaXRlLmFuaW1zYC5cclxuICpcclxuICogQGNsYXNzIEFuaW1hdGlvblxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBwYXJlbnQgLSBUaGUgR2FtZSBPYmplY3QgdG8gd2hpY2ggdGhpcyBhbmltYXRpb24gY29udHJvbGxlciBiZWxvbmdzLlxyXG4gKi9cclxudmFyIEFuaW1hdGlvbiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBBbmltYXRpb24gKHBhcmVudClcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgR2FtZSBPYmplY3QgdG8gd2hpY2ggdGhpcyBhbmltYXRpb24gY29udHJvbGxlciBiZWxvbmdzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3BhcmVudFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNhbmltYXRpb25NYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25NYW5hZ2VyID0gcGFyZW50LnNjZW5lLnN5cy5hbmltcztcclxuXHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25NYW5hZ2VyLm9uY2UoRXZlbnRzLlJFTU9WRV9BTklNQVRJT04sIHRoaXMucmVtb3ZlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgYW4gYW5pbWF0aW9uIGN1cnJlbnRseSBwbGF5aW5nIG9yIG5vdD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNpc1BsYXlpbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IEFuaW1hdGlvbiBsb2FkZWQgaW50byB0aGlzIEFuaW1hdGlvbiBDb250cm9sbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2N1cnJlbnRBbmltXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEFuaW0gPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBBbmltYXRpb25GcmFtZSBiZWluZyBkaXNwbGF5ZWQgYnkgdGhpcyBBbmltYXRpb24gQ29udHJvbGxlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNjdXJyZW50RnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBrZXkgb2YgdGhlIG5leHQgQW5pbWF0aW9uIHRvIGJlIGxvYWRlZCBpbnRvIHRoaXMgQW5pbWF0aW9uIENvbnRyb2xsZXIgd2hlbiB0aGUgY3VycmVudCBhbmltYXRpb24gY29tcGxldGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI25leHRBbmltXHJcbiAgICAgICAgICogQHR5cGUgez9zdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5leHRBbmltID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGltZSBzY2FsZSBmYWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZyYW1lIHJhdGUgb2YgcGxheWJhY2sgaW4gZnJhbWVzIHBlciBzZWNvbmQuXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgMjQgaWYgdGhlIGBkdXJhdGlvbmAgcHJvcGVydHkgaXMgYG51bGxgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2ZyYW1lUmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVSYXRlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG93IGxvbmcgdGhlIGFuaW1hdGlvbiBzaG91bGQgcGxheSBmb3IsIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKiBJZiB0aGUgYGZyYW1lUmF0ZWAgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRoZW4gaXQgb3ZlcnJpZGVzIHRoaXMgdmFsdWUsXHJcbiAgICAgICAgICogb3RoZXJ3aXNlIHRoZSBgZnJhbWVSYXRlYCBpcyBkZXJpdmVkIGZyb20gYGR1cmF0aW9uYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBtcyBwZXIgZnJhbWUsIG5vdCBpbmNsdWRpbmcgZnJhbWUgc3BlY2lmaWMgbW9kaWZpZXJzIHRoYXQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIEFuaW1hdGlvbiBkYXRhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI21zUGVyRnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1zUGVyRnJhbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTa2lwIGZyYW1lcyBpZiB0aGUgdGltZSBsYWdzLCBvciBhbHdheXMgYWR2YW5jZWQgYW55d2F5P1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3NraXBNaXNzZWRGcmFtZXNcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5za2lwTWlzc2VkRnJhbWVzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBkZWxheSBiZWZvcmUgc3RhcnRpbmcgcGxheWJhY2ssIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNfZGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2RlbGF5ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uICgtMSBmb3IgaW5maW5pdHkpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3JlcGVhdFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcmVwZWF0ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVsYXkgYmVmb3JlIHRoZSByZXBlYXQgc3RhcnRzLCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3JlcGVhdERlbGF5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yZXBlYXREZWxheSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNob3VsZCB0aGUgYW5pbWF0aW9uIHlveW8/IChyZXZlcnNlIGJhY2sgZG93biB0byB0aGUgc3RhcnQpIGJlZm9yZSByZXBlYXRpbmc/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3lveW9cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5feW95byA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaWxsIHRoZSBwbGF5aGVhZCBtb3ZlIGZvcndhcmRzIChgdHJ1ZWApIG9yIGluIHJldmVyc2UgKGBmYWxzZWApLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2ZvcndhcmRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mb3J3YXJkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gSW50ZXJuYWwgdHJpZ2dlciB0aGF0J3MgcGxheSB0aGUgYW5pbWF0aW9uIGluIHJldmVyc2UgbW9kZSAoJ3RydWUnKSBvciBub3QgKCdmYWxzZScpLFxyXG4gICAgICAgICAqIG5lZWRlZCBiZWNhdXNlIGZvcndhcmQgY2FuIGJlIGNoYW5nZWQgYnkgeW95byBmZWF0dXJlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI19yZXZlcnNlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yZXZlcnNlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHRpbWUgb3ZlcmZsb3cgYWNjdW11bGF0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jYWNjdW11bGF0b3JcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjY3VtdWxhdG9yID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUgcG9pbnQgYXQgd2hpY2ggdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lIHdpbGwgY2hhbmdlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI25leHRUaWNrXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uZXh0VGljayA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVybmFsIGNvdW50ZXIga2VlcGluZyB0cmFjayBvZiBob3cgbWFueSByZXBlYXRzIGFyZSBsZWZ0IHRvIHBsYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcmVwZWF0Q291bnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVwZWF0Q291bnRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVybmFsIGZsYWcga2VlcGluZyB0cmFjayBvZiBwZW5kaW5nIHJlcGVhdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcGVuZGluZ1JlcGVhdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVwZWF0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBBbmltYXRpb24gcGF1c2VkP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI19wYXVzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdhcyB0aGUgYW5pbWF0aW9uIHByZXZpb3VzbHkgcGxheWluZyBiZWZvcmUgYmVpbmcgcGF1c2VkP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI193YXNQbGF5aW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3dhc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgcHJvcGVydHkgdHJhY2tpbmcgaWYgdGhpcyBBbmltYXRpb24gaXMgd2FpdGluZyB0byBzdG9wLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogMCA9IE5vXHJcbiAgICAgICAgICogMSA9IFdhaXRpbmcgZm9yIG1zIHRvIHBhc3NcclxuICAgICAgICAgKiAyID0gV2FpdGluZyBmb3IgcmVwZWF0XHJcbiAgICAgICAgICogMyA9IFdhaXRpbmcgZm9yIHNwZWNpZmljIGZyYW1lXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3BlbmRpbmdTdG9wXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nU3RvcCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHByb3BlcnR5IHVzZWQgYnkgX3BlbmRpbmdTdG9wLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI19wZW5kaW5nU3RvcFZhbHVlXHJcbiAgICAgICAgICogQHR5cGUge2FueX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdG9wVmFsdWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhbiBhbmltYXRpb24gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IG9uZSBjb21wbGV0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGN1cnJlbnQgYW5pbWF0aW9uIG11c3QgZW50ZXIgYSAnY29tcGxldGVkJyBzdGF0ZSBmb3IgdGhpcyB0byBoYXBwZW4sIGkuZS4gZmluaXNoIGFsbCBvZiBpdHMgcmVwZWF0cywgZGVsYXlzLCBldGMsIG9yIGhhdmUgdGhlIGBzdG9wYCBtZXRob2QgY2FsbGVkIGRpcmVjdGx5IG9uIGl0LlxyXG4gICAgICpcclxuICAgICAqIEFuIGFuaW1hdGlvbiBzZXQgdG8gcmVwZWF0IGZvcmV2ZXIgd2lsbCBuZXZlciBlbnRlciBhIGNvbXBsZXRlZCBzdGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGNoYWluIGEgbmV3IGFuaW1hdGlvbiBhdCBhbnkgcG9pbnQsIGluY2x1ZGluZyBiZWZvcmUgdGhlIGN1cnJlbnQgb25lIHN0YXJ0cyBwbGF5aW5nLCBkdXJpbmcgaXQsIG9yIHdoZW4gaXQgZW5kcyAodmlhIGl0cyBgYW5pbWF0aW9uY29tcGxldGVgIGNhbGxiYWNrKS5cclxuICAgICAqIENoYWluZWQgYW5pbWF0aW9ucyBhcmUgc3BlY2lmaWMgdG8gYSBHYW1lIE9iamVjdCwgbWVhbmluZyBkaWZmZXJlbnQgR2FtZSBPYmplY3RzIGNhbiBoYXZlIGRpZmZlcmVudCBjaGFpbmVkIGFuaW1hdGlvbnMgd2l0aG91dCBpbXBhY3RpbmcgdGhlIGdsb2JhbCBhbmltYXRpb24gdGhleSdyZSBwbGF5aW5nLlxyXG4gICAgICpcclxuICAgICAqIENhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMgdG8gcmVzZXQgdGhlIGNoYWluZWQgYW5pbWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2NoYWluXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbil9IFtrZXldIC0gVGhlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIGFuaW1hdGlvbiB0byBwbGF5IG5leHQsIGFzIGRlZmluZWQgcHJldmlvdXNseSBpbiB0aGUgQW5pbWF0aW9uIE1hbmFnZXIuIE9yIGFuIEFuaW1hdGlvbiBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgb3ducyB0aGlzIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIGNoYWluOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBCYXNlQW5pbWF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5ID0ga2V5LmtleTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubmV4dEFuaW0gPSBrZXk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBiZSBkZWxheWVkIGJlZm9yZSBzdGFydGluZyBwbGF5YmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNzZXREZWxheVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdmFsdWU9MF0gLSBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2FpdCBiZWZvcmUgc3RhcnRpbmcgcGxheWJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBzZXREZWxheTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLl9kZWxheSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBiZSBkZWxheWVkIGJlZm9yZSBzdGFydGluZyBwbGF5YmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNnZXREZWxheVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRoZSBBbmltYXRpb24gd2lsbCB3YWl0IGJlZm9yZSBzdGFydGluZyBwbGF5YmFjay5cclxuICAgICAqL1xyXG4gICAgZ2V0RGVsYXk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGF5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdhaXRzIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMsIHRoZW4gc3RhcnRzIHBsYXliYWNrIG9mIHRoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2RlbGF5ZWRQbGF5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGRlbGF5IC0gVGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gcGxheWluZy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gcGxheS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0RnJhbWU9MF0gLSBUaGUgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbiB0byBzdGFydCBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgZGVsYXllZFBsYXk6IGZ1bmN0aW9uIChkZWxheSwga2V5LCBzdGFydEZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGxheShrZXksIHRydWUsIHN0YXJ0RnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLm5leHRUaWNrICs9IGRlbGF5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUga2V5IG9mIHRoZSBhbmltYXRpb24gY3VycmVudGx5IGxvYWRlZCBpbnRvIHRoaXMgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2dldEN1cnJlbnRLZXlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGtleSBvZiB0aGUgQW5pbWF0aW9uIGxvYWRlZCBpbnRvIHRoaXMgY29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBnZXRDdXJyZW50S2V5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRBbmltKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEFuaW0ua2V5O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCB0byBsb2FkIGFuIGFuaW1hdGlvbiBpbnRvIHRoaXMgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2xvYWRcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gbG9hZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0RnJhbWU9MF0gLSBUaGUgc3RhcnQgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgbG9hZDogZnVuY3Rpb24gKGtleSwgc3RhcnRGcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RhcnRGcmFtZSA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0RnJhbWUgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIExvYWQgdGhlIG5ldyBhbmltYXRpb24gaW5cclxuICAgICAgICB0aGlzLmFuaW1hdGlvbk1hbmFnZXIubG9hZCh0aGlzLCBrZXksIHN0YXJ0RnJhbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2UgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGFuZCBzZXQgdGhlIGBpc1BsYXlpbmdgIHByb3BlcnR5IHRvIGBmYWxzZWAuXHJcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgcGF1c2UgaXQgYXQgYSBzcGVjaWZpYyBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNwYXVzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gW2F0RnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgdG8gc2V0IGFmdGVyIHBhdXNpbmcgdGhlIGFuaW1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgb3ducyB0aGlzIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoYXRGcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3dhc1BsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcclxuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdEZyYW1lICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyYW1lKGF0RnJhbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgcGxheWJhY2sgb2YgYSBwYXVzZWQgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBgaXNQbGF5aW5nYCBwcm9wZXJ0eSB0byBgdHJ1ZWAuXHJcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgdGVsbCBpdCB0byBzdGFydCBwbGF5YmFjayBmcm9tIGEgc3BlY2lmaWMgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcmVzdW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBbZnJvbUZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIHRvIHNldCBiZWZvcmUgcmVzdGFydGluZyBwbGF5YmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgb3ducyB0aGlzIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogZnVuY3Rpb24gKGZyb21GcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdGhpcy5fd2FzUGxheWluZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmcm9tRnJhbWUgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJhbWUoZnJvbUZyYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGlzIHBhdXNlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2lzUGF1c2VkXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIGlzUGF1c2VkOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGF5cyBhbiBBbmltYXRpb24gb24gYSBHYW1lIE9iamVjdCB0aGF0IGhhcyB0aGUgQW5pbWF0aW9uIGNvbXBvbmVudCwgc3VjaCBhcyBhIFNwcml0ZS5cclxuICAgICAqXHJcbiAgICAgKiBBbmltYXRpb25zIGFyZSBzdG9yZWQgaW4gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlciBhbmQgYXJlIHJlZmVyZW5jZWQgYnkgYSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNwbGF5XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI29uU3RhcnRFdmVudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbil9IGtleSAtIFRoZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gcGxheSwgYXMgZGVmaW5lZCBwcmV2aW91c2x5IGluIHRoZSBBbmltYXRpb24gTWFuYWdlci4gT3IgYW4gQW5pbWF0aW9uIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlSWZQbGF5aW5nPWZhbHNlXSAtIElmIHRoaXMgYW5pbWF0aW9uIGlzIGFscmVhZHkgcGxheWluZyB0aGVuIGlnbm9yZSB0aGlzIGNhbGwuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEZyYW1lPTBdIC0gT3B0aW9uYWxseSBzdGFydCB0aGUgYW5pbWF0aW9uIHBsYXlpbmcgZnJvbSB0aGlzIGZyYW1lIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcGxheTogZnVuY3Rpb24gKGtleSwgaWdub3JlSWZQbGF5aW5nLCBzdGFydEZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpZ25vcmVJZlBsYXlpbmcgPT09IHVuZGVmaW5lZCkgeyBpZ25vcmVJZlBsYXlpbmcgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChzdGFydEZyYW1lID09PSB1bmRlZmluZWQpIHsgc3RhcnRGcmFtZSA9IDA7IH1cclxuXHJcbiAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIEJhc2VBbmltYXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSBrZXkua2V5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlnbm9yZUlmUGxheWluZyAmJiB0aGlzLmlzUGxheWluZyAmJiB0aGlzLmN1cnJlbnRBbmltLmtleSA9PT0ga2V5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3J3YXJkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9yZXZlcnNlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd2FzUGxheWluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydEFuaW1hdGlvbihrZXksIHN0YXJ0RnJhbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBsYXlzIGFuIEFuaW1hdGlvbiAoaW4gcmV2ZXJzZSBtb2RlKSBvbiB0aGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNwbGF5UmV2ZXJzZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNvblN0YXJ0RXZlbnRcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLkFuaW1hdGlvbnMuQW5pbWF0aW9uKX0ga2V5IC0gVGhlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIGFuaW1hdGlvbiB0byBwbGF5LCBhcyBkZWZpbmVkIHByZXZpb3VzbHkgaW4gdGhlIEFuaW1hdGlvbiBNYW5hZ2VyLiBPciBhbiBBbmltYXRpb24gaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpZ25vcmVJZlBsYXlpbmc9ZmFsc2VdIC0gSWYgYW4gYW5pbWF0aW9uIGlzIGFscmVhZHkgcGxheWluZyB0aGVuIGlnbm9yZSB0aGlzIGNhbGwuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEZyYW1lPTBdIC0gT3B0aW9uYWxseSBzdGFydCB0aGUgYW5pbWF0aW9uIHBsYXlpbmcgZnJvbSB0aGlzIGZyYW1lIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcGxheVJldmVyc2U6IGZ1bmN0aW9uIChrZXksIGlnbm9yZUlmUGxheWluZywgc3RhcnRGcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaWdub3JlSWZQbGF5aW5nID09PSB1bmRlZmluZWQpIHsgaWdub3JlSWZQbGF5aW5nID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoc3RhcnRGcmFtZSA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0RnJhbWUgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBCYXNlQW5pbWF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5ID0ga2V5LmtleTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZ25vcmVJZlBsYXlpbmcgJiYgdGhpcy5pc1BsYXlpbmcgJiYgdGhpcy5jdXJyZW50QW5pbS5rZXkgPT09IGtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9yd2FyZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3JldmVyc2UgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRBbmltYXRpb24oa2V5LCBzdGFydEZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGFuIEFuaW1hdGlvbiBhbmQgZmlyZXMgJ29uU3RhcnRFdmVudCcgZXZlbnQsIGV4dHJhY3RlZCBmcm9tICdwbGF5JyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jX3N0YXJ0QW5pbWF0aW9uXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkFuaW1hdGlvbnMuRXZlbnRzI0FOSU1BVElPTl9TVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkFuaW1hdGlvbnMuRXZlbnRzI1NQUklURV9BTklNQVRJT05fS0VZX1NUQVJUXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gcGxheSwgYXMgZGVmaW5lZCBwcmV2aW91c2x5IGluIHRoZSBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0RnJhbWU9MF0gLSBPcHRpb25hbGx5IHN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZyBmcm9tIHRoaXMgZnJhbWUgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBfc3RhcnRBbmltYXRpb246IGZ1bmN0aW9uIChrZXksIHN0YXJ0RnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5sb2FkKGtleSwgc3RhcnRGcmFtZSk7XHJcblxyXG4gICAgICAgIHZhciBhbmltID0gdGhpcy5jdXJyZW50QW5pbTtcclxuICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IHRoaXMucGFyZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBTaG91bGQgZ2l2ZSB1cyA5LDAwNywxOTksMjU0LDc0MCw5OTEgc2FmZSByZXBlYXRzXHJcbiAgICAgICAgdGhpcy5yZXBlYXRDb3VudGVyID0gKHRoaXMuX3JlcGVhdCA9PT0gLTEpID8gTnVtYmVyLk1BWF9WQUxVRSA6IHRoaXMuX3JlcGVhdDtcclxuXHJcbiAgICAgICAgYW5pbS5nZXRGaXJzdFRpY2sodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdSZXBlYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGFuaW0uc2hvd09uU3RhcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5jdXJyZW50RnJhbWU7XHJcblxyXG4gICAgICAgIGFuaW0uZW1pdChFdmVudHMuQU5JTUFUSU9OX1NUQVJULCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuU1BSSVRFX0FOSU1BVElPTl9LRVlfU1RBUlQgKyBrZXksIGFuaW0sIGZyYW1lLCBnYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5TUFJJVEVfQU5JTUFUSU9OX1NUQVJULCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2UgdGhlIEFuaW1hdGlvbiB0aGF0IGlzIGFscmVhZHkgcGxheWluZyBvbiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcmV2ZXJzZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXZlcnNlID0gIXRoaXMuX3JldmVyc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcndhcmQgPSAhdGhpcy5mb3J3YXJkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgZmFyIHRoaXMgYW5pbWF0aW9uIGlzIHRocm91Z2gsIGlnbm9yaW5nIHJlcGVhdHMgYW5kIHlveW9zLlxyXG4gICAgICogSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub24temVybyByZXBlYXQgZGVmaW5lZCwgYGdldFByb2dyZXNzYCBhbmQgYGdldFRvdGFsUHJvZ3Jlc3NgIHdpbGwgYmUgZGlmZmVyZW50XHJcbiAgICAgKiBiZWNhdXNlIGBnZXRQcm9ncmVzc2AgZG9lc24ndCBpbmNsdWRlIGFueSByZXBlYXRzIG9yIHJlcGVhdCBkZWxheXMsIHdoZXJlYXMgYGdldFRvdGFsUHJvZ3Jlc3NgIGRvZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jZ2V0UHJvZ3Jlc3NcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHByb2dyZXNzIG9mIHRoZSBjdXJyZW50IGFuaW1hdGlvbiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBnZXRQcm9ncmVzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcCA9IHRoaXMuY3VycmVudEZyYW1lLnByb2dyZXNzO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm9yd2FyZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHAgPSAxIC0gcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxIGFuZCB1c2VzIGl0IHRvIHNldCBob3cgZmFyIHRoaXMgYW5pbWF0aW9uIGlzIHRocm91Z2ggcGxheWJhY2suXHJcbiAgICAgKiBEb2VzIG5vdCBmYWN0b3IgaW4gcmVwZWF0cyBvciB5b3lvcywgYnV0IGRvZXMgaGFuZGxlIHBsYXlpbmcgZm9yd2FyZHMgb3IgYmFja3dhcmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3NldFByb2dyZXNzXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ZhbHVlPTBdIC0gVGhlIHByb2dyZXNzIHZhbHVlLCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBzZXRQcm9ncmVzczogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3J3YXJkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxIC0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEN1cnJlbnRGcmFtZSh0aGlzLmN1cnJlbnRBbmltLmdldEZyYW1lQnlQcm9ncmVzcyh2YWx1ZSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIHRoZSByZW1vdmFsIG9mIGFuIGFuaW1hdGlvbiBmcm9tIHRoZSBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNyZW1vdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBrZXkgb2YgdGhlIHJlbW92ZWQgQW5pbWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb259IFthbmltYXRpb25dIC0gVGhlIHJlbW92ZWQgQW5pbWF0aW9uLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXksIGFuaW1hdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZiAoYW5pbWF0aW9uID09PSB1bmRlZmluZWQpIHsgYW5pbWF0aW9uID0gdGhpcy5jdXJyZW50QW5pbTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgJiYgYW5pbWF0aW9uLmtleSA9PT0gdGhpcy5jdXJyZW50QW5pbS5rZXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEZyYW1lKHRoaXMuY3VycmVudEFuaW0uZnJhbWVzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIHJlcGVhdFxyXG4gICAgICogYWZ0ZXIgaXRzIGZpcnN0IGl0ZXJhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHJldHVybnMgMSwgdGhlIGFuaW1hdGlvbiB3aWxsXHJcbiAgICAgKiBwbGF5IGEgdG90YWwgb2YgdHdpY2UgKHRoZSBpbml0aWFsIHBsYXkgcGx1cyAxIHJlcGVhdCkuXHJcbiAgICAgKiBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoZSBhbmltYXRpb24gd2lsbCByZXBlYXQgaW5kZWZpbml0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2dldFJlcGVhdFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCByZXBlYXQuXHJcbiAgICAgKi9cclxuICAgIGdldFJlcGVhdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVwZWF0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdFxyXG4gICAgICogYWZ0ZXIgaXRzIGZpcnN0IGl0ZXJhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHJlcGVhdCBpcyAxLCB0aGUgYW5pbWF0aW9uIHdpbGxcclxuICAgICAqIHBsYXkgYSB0b3RhbCBvZiB0d2ljZSAodGhlIGluaXRpYWwgcGxheSBwbHVzIDEgcmVwZWF0KS5cclxuICAgICAqIFRvIHJlcGVhdCBpbmRlZmluaXRlbHksIHVzZSAtMS4gcmVwZWF0IHNob3VsZCBhbHdheXMgYmUgYW4gaW50ZWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNzZXRSZXBlYXRcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdmFsdWUgLSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgc2V0UmVwZWF0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcmVwZWF0ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMucmVwZWF0Q291bnRlciA9ICh2YWx1ZSA9PT0gLTEpID8gTnVtYmVyLk1BWF9WQUxVRSA6IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIGRlbGF5IGJldHdlZW4gcmVwZWF0cywgaWYgYW55LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2dldFJlcGVhdERlbGF5XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZWxheSBiZXR3ZWVuIHJlcGVhdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlcGVhdERlbGF5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBlYXREZWxheTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gcmVwZWF0cy5cclxuICAgICAqIEZvciBleGFtcGxlLCBpZiBgcmVwZWF0YCBpcyAyIGFuZCBgcmVwZWF0RGVsYXlgIGlzIDEwLCB0aGUgYW5pbWF0aW9uIHdpbGwgcGxheSBpbml0aWFsbHksXHJcbiAgICAgKiB0aGVuIHdhaXQgZm9yIDEwIHNlY29uZHMgYmVmb3JlIHJlcGVhdGluZywgdGhlbiBwbGF5IGFnYWluLCB0aGVuIHdhaXQgYW5vdGhlciAxMCBzZWNvbmRzXHJcbiAgICAgKiBiZWZvcmUgZG9pbmcgaXRzIGZpbmFsIHJlcGVhdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNzZXRSZXBlYXREZWxheVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGRlbGF5IHRvIHdhaXQgYmV0d2VlbiByZXBlYXRzLCBpbiBzZWNvbmRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgc2V0UmVwZWF0RGVsYXk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9yZXBlYXREZWxheSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdGFydHMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZyb20gaXRzIGJlZ2lubmluZywgb3B0aW9uYWxseSBpbmNsdWRpbmcgaXRzIGRlbGF5IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3Jlc3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjQU5JTUFUSU9OX1JFU1RBUlRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuQW5pbWF0aW9ucy5FdmVudHMjU1BSSVRFX0FOSU1BVElPTl9SRVNUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkFuaW1hdGlvbnMuRXZlbnRzI1NQUklURV9BTklNQVRJT05fS0VZX1JFU1RBUlRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVEZWxheT1mYWxzZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlbGF5IHZhbHVlIG9mIHRoZSBhbmltYXRpb24gd2hlbiByZXN0YXJ0aW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCBvd25zIHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgcmVzdGFydDogZnVuY3Rpb24gKGluY2x1ZGVEZWxheSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaW5jbHVkZURlbGF5ID09PSB1bmRlZmluZWQpIHsgaW5jbHVkZURlbGF5ID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGFuaW0gPSB0aGlzLmN1cnJlbnRBbmltO1xyXG5cclxuICAgICAgICBhbmltLmdldEZpcnN0VGljayh0aGlzLCBpbmNsdWRlRGVsYXkpO1xyXG5cclxuICAgICAgICB0aGlzLmZvcndhcmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdSZXBlYXQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gIFNldCBmcmFtZVxyXG4gICAgICAgIHRoaXMudXBkYXRlRnJhbWUoYW5pbS5mcmFtZXNbMF0pO1xyXG5cclxuICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBmcmFtZSA9IHRoaXMuY3VycmVudEZyYW1lO1xyXG5cclxuICAgICAgICBhbmltLmVtaXQoRXZlbnRzLkFOSU1BVElPTl9SRVNUQVJULCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuU1BSSVRFX0FOSU1BVElPTl9LRVlfUkVTVEFSVCArIGFuaW0ua2V5LCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuU1BSSVRFX0FOSU1BVElPTl9SRVNUQVJULCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbW1lZGlhdGVseSBzdG9wcyB0aGUgY3VycmVudCBhbmltYXRpb24gZnJvbSBwbGF5aW5nIGFuZCBkaXNwYXRjaGVzIHRoZSBgYW5pbWF0aW9uY29tcGxldGVgIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGFuaW1hdGlvbiBpcyBzZXQsIG5vIGV2ZW50IHdpbGwgYmUgZGlzcGF0Y2hlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGVyZSBpcyBhbm90aGVyIGFuaW1hdGlvbiBxdWV1ZWQgKHZpYSB0aGUgYGNoYWluYCBtZXRob2QpIHRoZW4gaXQgd2lsbCBzdGFydCBwbGF5aW5nIGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3N0b3BcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jb25Db21wbGV0ZUV2ZW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgb3ducyB0aGlzIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0b3A6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1N0b3AgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBhbmltID0gdGhpcy5jdXJyZW50QW5pbTtcclxuICAgICAgICB2YXIgZnJhbWUgPSB0aGlzLmN1cnJlbnRGcmFtZTtcclxuXHJcbiAgICAgICAgaWYgKGFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmltLmVtaXQoRXZlbnRzLkFOSU1BVElPTl9DT01QTEVURSwgYW5pbSwgZnJhbWUsIGdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5TUFJJVEVfQU5JTUFUSU9OX0tFWV9DT01QTEVURSArIGFuaW0ua2V5LCBhbmltLCBmcmFtZSwgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLlNQUklURV9BTklNQVRJT05fQ09NUExFVEUsIGFuaW0sIGZyYW1lLCBnYW1lT2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5leHRBbmltKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMubmV4dEFuaW07XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5leHRBbmltID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGxheShrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZyb20gcGxheWluZyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgZGVsYXksIGdpdmVuIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNzdG9wQWZ0ZXJEZWxheVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNvbkNvbXBsZXRlRXZlbnRcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGVsYXkgLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzdG9wcGluZyB0aGlzIGFuaW1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgb3ducyB0aGlzIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0b3BBZnRlckRlbGF5OiBmdW5jdGlvbiAoZGVsYXkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1N0b3AgPSAxO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdG9wVmFsdWUgPSBkZWxheTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBmcm9tIHBsYXlpbmcgd2hlbiBpdCBuZXh0IHJlcGVhdHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jc3RvcE9uUmVwZWF0XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI29uQ29tcGxldGVFdmVudFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBzdG9wT25SZXBlYXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1N0b3AgPSAyO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZyb20gcGxheWluZyB3aGVuIGl0IG5leHQgc2V0cyB0aGUgZ2l2ZW4gZnJhbWUuXHJcbiAgICAgKiBJZiB0aGlzIGZyYW1lIGRvZXNuJ3QgZXhpc3Qgd2l0aGluIHRoZSBhbmltYXRpb24gaXQgd2lsbCBub3Qgc3RvcCBpdCBmcm9tIHBsYXlpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jc3RvcE9uRnJhbWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jb25Db21wbGV0ZUV2ZW50XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBmcmFtZSAtIFRoZSBmcmFtZSB0byBjaGVjayBiZWZvcmUgc3RvcHBpbmcgdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBzdG9wT25GcmFtZTogZnVuY3Rpb24gKGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdG9wID0gMztcclxuICAgICAgICB0aGlzLl9wZW5kaW5nU3RvcFZhbHVlID0gZnJhbWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBUaW1lIFNjYWxlIGZhY3RvciwgYWxsb3dpbmcgeW91IHRvIG1ha2UgdGhlIGFuaW1hdGlvbiBnbyBnbyBmYXN0ZXIgb3Igc2xvd2VyIHRoYW4gZGVmYXVsdC5cclxuICAgICAqIFdoZXJlIDEgPSBub3JtYWwgc3BlZWQgKHRoZSBkZWZhdWx0KSwgMC41ID0gaGFsZiBzcGVlZCwgMiA9IGRvdWJsZSBzcGVlZCwgZXRjLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3NldFRpbWVTY2FsZVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIFRoZSB0aW1lIHNjYWxlIGZhY3Rvciwgd2hlcmUgMSBpcyBubyBjaGFuZ2UsIDAuNSBpcyBoYWxmIHNwZWVkLCBldGMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IG93bnMgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBzZXRUaW1lU2NhbGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDE7IH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBUaW1lIFNjYWxlIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNnZXRUaW1lU2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIFRpbWUgU2NhbGUgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbWVTY2FsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZVNjYWxlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgaW4gdGhpcyBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jZ2V0VG90YWxGcmFtZXNcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGluIHRoaXMgYW5pbWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBnZXRUb3RhbEZyYW1lczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50QW5pbS5mcmFtZXMubGVuZ3RoO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnRlcm5hbCB1cGRhdGUgbG9vcCBmb3IgdGhlIEFuaW1hdGlvbiBDb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRBbmltIHx8ICF0aGlzLmlzUGxheWluZyB8fCB0aGlzLmN1cnJlbnRBbmltLnBhdXNlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWNjdW11bGF0b3IgKz0gZGVsdGEgKiB0aGlzLl90aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RvcCA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdG9wVmFsdWUgLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1N0b3BWYWx1ZSA8PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50QW5pbS5jb21wbGV0ZUFuaW1hdGlvbih0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0b3IgPj0gdGhpcy5uZXh0VGljaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEFuaW0uc2V0RnJhbWUodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGdpdmVuIEFuaW1hdGlvbiBGcmFtZSBhcyBiZWluZyB0aGUgY3VycmVudCBmcmFtZVxyXG4gICAgICogYW5kIGFwcGxpZXMgaXQgdG8gdGhlIHBhcmVudCBHYW1lIE9iamVjdCwgYWRqdXN0aW5nIGl0cyBzaXplIGFuZCBvcmlnaW4gYXMgbmVlZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3NldEN1cnJlbnRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25GcmFtZX0gYW5pbWF0aW9uRnJhbWUgLSBUaGUgQW5pbWF0aW9uIEZyYW1lIHRvIHNldCBhcyBiZWluZyBjdXJyZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50IGJlbG9uZ3MgdG8uXHJcbiAgICAgKi9cclxuICAgIHNldEN1cnJlbnRGcmFtZTogZnVuY3Rpb24gKGFuaW1hdGlvbkZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnYW1lT2JqZWN0ID0gdGhpcy5wYXJlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gYW5pbWF0aW9uRnJhbWU7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3QudGV4dHVyZSA9IGFuaW1hdGlvbkZyYW1lLmZyYW1lLnRleHR1cmU7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5mcmFtZSA9IGFuaW1hdGlvbkZyYW1lLmZyYW1lO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5pc0Nyb3BwZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmZyYW1lLnVwZGF0ZUNyb3BVVnMoZ2FtZU9iamVjdC5fY3JvcCwgZ2FtZU9iamVjdC5mbGlwWCwgZ2FtZU9iamVjdC5mbGlwWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LnNldFNpemVUb0ZyYW1lKCk7XHJcblxyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0Ll9vcmlnaW5Db21wb25lbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYW5pbWF0aW9uRnJhbWUuZnJhbWUuY3VzdG9tUGl2b3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3Quc2V0T3JpZ2luKGFuaW1hdGlvbkZyYW1lLmZyYW1lLnBpdm90WCwgYW5pbWF0aW9uRnJhbWUuZnJhbWUucGl2b3RZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBmcmFtZSBjaGFuZ2UgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiN1cGRhdGVGcmFtZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX1VQREFURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5BbmltYXRpb25zLkV2ZW50cyNTUFJJVEVfQU5JTUFUSU9OX0tFWV9VUERBVEVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbkZyYW1lfSBhbmltYXRpb25GcmFtZSAtIFRoZSBhbmltYXRpb24gZnJhbWUgdG8gY2hhbmdlIHRvLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVGcmFtZTogZnVuY3Rpb24gKGFuaW1hdGlvbkZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnYW1lT2JqZWN0ID0gdGhpcy5zZXRDdXJyZW50RnJhbWUoYW5pbWF0aW9uRnJhbWUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYW5pbWF0aW9uRnJhbWUuc2V0QWxwaGEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuYWxwaGEgPSBhbmltYXRpb25GcmFtZS5hbHBoYTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGFuaW0gPSB0aGlzLmN1cnJlbnRBbmltO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5TUFJJVEVfQU5JTUFUSU9OX0tFWV9VUERBVEUgKyBhbmltLmtleSwgYW5pbSwgYW5pbWF0aW9uRnJhbWUsIGdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5TUFJJVEVfQU5JTUFUSU9OX1VQREFURSwgYW5pbSwgYW5pbWF0aW9uRnJhbWUsIGdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTdG9wID09PSAzICYmIHRoaXMuX3BlbmRpbmdTdG9wVmFsdWUgPT09IGFuaW1hdGlvbkZyYW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBbmltLmNvbXBsZXRlQW5pbWF0aW9uKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkdmFuY2VzIHRoZSBhbmltYXRpb24gdG8gdGhlIG5leHQgZnJhbWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHRpbWUgb3IgYW5pbWF0aW9uIHN0YXRlLlxyXG4gICAgICogSWYgdGhlIGFuaW1hdGlvbiBpcyBzZXQgdG8gcmVwZWF0LCBvciB5b3lvLCB0aGlzIHdpbGwgc3RpbGwgdGFrZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbGluZyB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBhbmltYXRpb24uIEkuZS4gaWYgaXQgd2FzIGN1cnJlbnRseVxyXG4gICAgICogcGxheWluZyBpbiByZXZlcnNlLCBjYWxsaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgdGhlbiBjaGFuZ2UgdGhlIGRpcmVjdGlvbiB0byBmb3J3YXJkcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFuaW1hdGlvbiNuZXh0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudCBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBuZXh0RnJhbWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBbmltLm5leHRGcmFtZSh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZHZhbmNlcyB0aGUgYW5pbWF0aW9uIHRvIHRoZSBwcmV2aW91cyBmcmFtZSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZSBvciBhbmltYXRpb24gc3RhdGUuXHJcbiAgICAgKiBJZiB0aGUgYW5pbWF0aW9uIGlzIHNldCB0byByZXBlYXQsIG9yIHlveW8sIHRoaXMgd2lsbCBzdGlsbCB0YWtlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4gSS5lLiBpZiBpdCB3YXMgY3VycmVudGx5XHJcbiAgICAgKiBwbGF5aW5nIGluIGZvcndhcmRzLCBjYWxsaW5nIHRoaXMgbWV0aG9kIGRvZXNuJ3QgdGhlbiBjaGFuZ2UgdGhlIGRpcmVjdGlvbiB0byBiYWNrd2FyZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcHJldmlvdXNGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QgdGhpcyBBbmltYXRpb24gQ29tcG9uZW50IGJlbG9uZ3MgdG8uXHJcbiAgICAgKi9cclxuICAgIHByZXZpb3VzRnJhbWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEFuaW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBbmltLnByZXZpb3VzRnJhbWUodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBpZiB0aGUgY3VycmVudCBBbmltYXRpb24gd2lsbCB5b3lvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLlxyXG4gICAgICogQSB5b3lvJ2luZyBhbmltYXRpb24gd2lsbCBwbGF5IHRocm91Z2ggY29uc2VjdXRpdmVseSwgYW5kIHRoZW4gcmV2ZXJzZS1wbGF5IGJhY2sgdG8gdGhlIHN0YXJ0IGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI3NldFlveW9cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPWZhbHNlXSAtIGB0cnVlYCBpZiB0aGUgYW5pbWF0aW9uIHNob3VsZCB5b3lvLCBgZmFsc2VgIHRvIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoaXMgQW5pbWF0aW9uIENvbXBvbmVudCBiZWxvbmdzIHRvLlxyXG4gICAgICovXHJcbiAgICBzZXRZb3lvOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB0aGlzLl95b3lvID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGlmIHRoZSBjdXJyZW50IEFuaW1hdGlvbiB3aWxsIHlveW8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuXHJcbiAgICAgKiBBIHlveW8naW5nIGFuaW1hdGlvbiB3aWxsIHBsYXkgdGhyb3VnaCBjb25zZWN1dGl2ZWx5LCBhbmQgdGhlbiByZXZlcnNlLXBsYXkgYmFjayB0byB0aGUgc3RhcnQgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jZ2V0WW95b1xyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBhbmltYXRpb24gaXMgc2V0IHRvIHlveW8sIGBmYWxzZWAgaWYgbm90LlxyXG4gICAgICovXHJcbiAgICBnZXRZb3lvOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl95b3lvO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgdGhpcyBBbmltYXRpb24gY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIFVucmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYW5zIHVwIGl0cyByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9uI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uTWFuYWdlci5vZmYoRXZlbnRzLlJFTU9WRV9BTklNQVRJT04sIHRoaXMucmVtb3ZlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25NYW5hZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEFuaW0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBbmltYXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJsZW5kTW9kZXMgPSByZXF1aXJlKCcuLi8uLi9yZW5kZXJlci9CbGVuZE1vZGVzJyk7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBibGVuZCBtb2RlIG9mIGEgR2FtZSBPYmplY3QuXHJcbiAqIFNob3VsZCBiZSBhcHBsaWVkIGFzIGEgbWl4aW4gYW5kIG5vdCB1c2VkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgQmxlbmRNb2RlID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGN1cnJlbnQgYmxlbmQgbW9kZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlI19ibGVuZE1vZGVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfYmxlbmRNb2RlOiBCbGVuZE1vZGVzLk5PUk1BTCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJsZW5kIE1vZGUgYmVpbmcgdXNlZCBieSB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgY2FuIGJlIGEgY29uc3QsIHN1Y2ggYXMgYFBoYXNlci5CbGVuZE1vZGVzLlNDUkVFTmAsIG9yIGFuIGludGVnZXIsIHN1Y2ggYXMgNCAoZm9yIE92ZXJsYXkpXHJcbiAgICAgKlxyXG4gICAgICogVW5kZXIgV2ViR0wgb25seSB0aGUgZm9sbG93aW5nIEJsZW5kIE1vZGVzIGFyZSBhdmFpbGFibGU6XHJcbiAgICAgKlxyXG4gICAgICogKiBBRERcclxuICAgICAqICogTVVMVElQTFlcclxuICAgICAqICogU0NSRUVOXHJcbiAgICAgKiAqIEVSQVNFXHJcbiAgICAgKlxyXG4gICAgICogQ2FudmFzIGhhcyBtb3JlIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gYnJvd3NlciBzdXBwb3J0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBjcmVhdGUgeW91ciBvd24gY3VzdG9tIEJsZW5kIE1vZGVzIGluIFdlYkdMLlxyXG4gICAgICpcclxuICAgICAqIEJsZW5kIG1vZGVzIGhhdmUgZGlmZmVyZW50IGVmZmVjdHMgdW5kZXIgQ2FudmFzIGFuZCBXZWJHTCwgYW5kIGZyb20gYnJvd3NlciB0byBicm93c2VyLCBkZXBlbmRpbmdcclxuICAgICAqIG9uIHN1cHBvcnQuIEJsZW5kIE1vZGVzIGFsc28gY2F1c2UgYSBXZWJHTCBiYXRjaCBmbHVzaCBzaG91bGQgaXQgZW5jb3VudGVyIGEgbmV3IGJsZW5kIG1vZGUuIEZvciB0aGVzZVxyXG4gICAgICogcmVhc29ucyB0cnkgdG8gYmUgY2FyZWZ1bCBhYm91dCB0aGUgY29uc3RydWN0aW9uIG9mIHlvdXIgU2NlbmUgYW5kIHRoZSBmcmVxdWVuY3kgb2Ygd2hpY2ggYmxlbmQgbW9kZXNcclxuICAgICAqIGFyZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZSNibGVuZE1vZGVcclxuICAgICAqIEB0eXBlIHsoUGhhc2VyLkJsZW5kTW9kZXN8c3RyaW5nKX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBibGVuZE1vZGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JsZW5kTW9kZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEJsZW5kTW9kZXNbdmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YWx1ZSB8PSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHZhbHVlID49IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ibGVuZE1vZGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQmxlbmQgTW9kZSBiZWluZyB1c2VkIGJ5IHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBjYW4gYmUgYSBjb25zdCwgc3VjaCBhcyBgUGhhc2VyLkJsZW5kTW9kZXMuU0NSRUVOYCwgb3IgYW4gaW50ZWdlciwgc3VjaCBhcyA0IChmb3IgT3ZlcmxheSlcclxuICAgICAqXHJcbiAgICAgKiBVbmRlciBXZWJHTCBvbmx5IHRoZSBmb2xsb3dpbmcgQmxlbmQgTW9kZXMgYXJlIGF2YWlsYWJsZTpcclxuICAgICAqXHJcbiAgICAgKiAqIEFERFxyXG4gICAgICogKiBNVUxUSVBMWVxyXG4gICAgICogKiBTQ1JFRU5cclxuICAgICAqICogRVJBU0UgKG9ubHkgd29ya3Mgd2hlbiByZW5kZXJpbmcgdG8gYSBmcmFtZWJ1ZmZlciwgbGlrZSBhIFJlbmRlciBUZXh0dXJlKVxyXG4gICAgICpcclxuICAgICAqIENhbnZhcyBoYXMgbW9yZSBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIGJyb3dzZXIgc3VwcG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gY3JlYXRlIHlvdXIgb3duIGN1c3RvbSBCbGVuZCBNb2RlcyBpbiBXZWJHTC5cclxuICAgICAqXHJcbiAgICAgKiBCbGVuZCBtb2RlcyBoYXZlIGRpZmZlcmVudCBlZmZlY3RzIHVuZGVyIENhbnZhcyBhbmQgV2ViR0wsIGFuZCBmcm9tIGJyb3dzZXIgdG8gYnJvd3NlciwgZGVwZW5kaW5nXHJcbiAgICAgKiBvbiBzdXBwb3J0LiBCbGVuZCBNb2RlcyBhbHNvIGNhdXNlIGEgV2ViR0wgYmF0Y2ggZmx1c2ggc2hvdWxkIGl0IGVuY291bnRlciBhIG5ldyBibGVuZCBtb2RlLiBGb3IgdGhlc2VcclxuICAgICAqIHJlYXNvbnMgdHJ5IHRvIGJlIGNhcmVmdWwgYWJvdXQgdGhlIGNvbnN0cnVjdGlvbiBvZiB5b3VyIFNjZW5lIGFuZCB0aGUgZnJlcXVlbmN5IGluIHdoaWNoIGJsZW5kIG1vZGVzXHJcbiAgICAgKiBhcmUgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZSNzZXRCbGVuZE1vZGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuQmxlbmRNb2Rlcyl9IHZhbHVlIC0gVGhlIEJsZW5kTW9kZSB2YWx1ZS4gRWl0aGVyIGEgc3RyaW5nIG9yIGEgQ09OU1QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0QmxlbmRNb2RlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCbGVuZE1vZGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgY2FsY3VsYXRpbmcgYW5kIHNldHRpbmcgdGhlIHNpemUgb2YgYSBub24tRnJhbWUgYmFzZWQgR2FtZSBPYmplY3QuXHJcbiAqIFNob3VsZCBiZSBhcHBsaWVkIGFzIGEgbWl4aW4gYW5kIG5vdCB1c2VkIGRpcmVjdGx5LlxyXG4gKiBcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Db21wdXRlZFNpemVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIENvbXB1dGVkU2l6ZSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYXRpdmUgKHVuLXNjYWxlZCkgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQ2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNpemUgdGhhdCB0aGUgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQgaW4tZ2FtZS5cclxuICAgICAqIEZvciB0aGF0IHlvdSBuZWVkIHRvIGVpdGhlciBzZXQgdGhlIHNjYWxlIG9mIHRoZSBHYW1lIE9iamVjdCAoYHNldFNjYWxlYCkgb3IgdXNlXHJcbiAgICAgKiB0aGUgYGRpc3BsYXlXaWR0aGAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNvbXB1dGVkU2l6ZSN3aWR0aFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB3aWR0aDogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYXRpdmUgKHVuLXNjYWxlZCkgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIENoYW5naW5nIHRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHRoZSBzaXplIHRoYXQgdGhlIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmVkIGluLWdhbWUuXHJcbiAgICAgKiBGb3IgdGhhdCB5b3UgbmVlZCB0byBlaXRoZXIgc2V0IHRoZSBzY2FsZSBvZiB0aGUgR2FtZSBPYmplY3QgKGBzZXRTY2FsZWApIG9yIHVzZVxyXG4gICAgICogdGhlIGBkaXNwbGF5SGVpZ2h0YCBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplI2hlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGlzcGxheWVkIHdpZHRoIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgdmFsdWUgdGFrZXMgaW50byBhY2NvdW50IHRoZSBzY2FsZSBmYWN0b3IuXHJcbiAgICAgKiBcclxuICAgICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGFkanVzdCB0aGUgR2FtZSBPYmplY3QncyBzY2FsZSBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplI2Rpc3BsYXlXaWR0aFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5V2lkdGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVYICogdGhpcy53aWR0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGVYID0gdmFsdWUgLyB0aGlzLndpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpc3BsYXllZCBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB2YWx1ZSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNjYWxlIGZhY3Rvci5cclxuICAgICAqIFxyXG4gICAgICogU2V0dGluZyB0aGlzIHZhbHVlIHdpbGwgYWRqdXN0IHRoZSBHYW1lIE9iamVjdCdzIHNjYWxlIHByb3BlcnR5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Db21wdXRlZFNpemUjZGlzcGxheUhlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5SGVpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxlWSAqIHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSB2YWx1ZSAvIHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW50ZXJuYWwgc2l6ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LCBhcyB1c2VkIGZvciBmcmFtZSBvciBwaHlzaWNzIGJvZHkgY3JlYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgd2lsbCBub3QgY2hhbmdlIHRoZSBzaXplIHRoYXQgdGhlIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmVkIGluLWdhbWUuXHJcbiAgICAgKiBGb3IgdGhhdCB5b3UgbmVlZCB0byBlaXRoZXIgc2V0IHRoZSBzY2FsZSBvZiB0aGUgR2FtZSBPYmplY3QgKGBzZXRTY2FsZWApIG9yIGNhbGwgdGhlXHJcbiAgICAgKiBgc2V0RGlzcGxheVNpemVgIG1ldGhvZCwgd2hpY2ggaXMgdGhlIHNhbWUgdGhpbmcgYXMgY2hhbmdpbmcgdGhlIHNjYWxlIGJ1dCBhbGxvd3MgeW91XHJcbiAgICAgKiB0byBkbyBzbyBieSBnaXZpbmcgcGl4ZWwgdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3UgaGF2ZSBlbmFibGVkIHRoaXMgR2FtZSBPYmplY3QgZm9yIGlucHV0LCBjaGFuZ2luZyB0aGUgc2l6ZSB3aWxsIF9ub3RfIGNoYW5nZSB0aGVcclxuICAgICAqIHNpemUgb2YgdGhlIGhpdCBhcmVhLiBUbyBkbyB0aGlzIHlvdSBzaG91bGQgYWRqdXN0IHRoZSBgaW5wdXQuaGl0QXJlYWAgb2JqZWN0IGRpcmVjdGx5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNvbXB1dGVkU2l6ZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGlzcGxheSBzaXplIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyB3aWxsIGFkanVzdCB0aGUgc2NhbGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplI3NldERpc3BsYXlTaXplXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldERpc3BsYXlTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb21wdXRlZFNpemU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgdGV4dHVyZSBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNyb3BcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKi9cclxuXHJcbnZhciBDcm9wID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyB1c2luZyB0byByZW5kZXIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Dcm9wI3RleHR1cmVcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZXxQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0ZXh0dXJlOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRleHR1cmUgRnJhbWUgdGhpcyBHYW1lIE9iamVjdCBpcyB1c2luZyB0byByZW5kZXIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Dcm9wI2ZyYW1lXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGZyYW1lOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIEdhbWUgT2JqZWN0IGlzIGJlaW5nIGNyb3BwZWQgb3Igbm90LlxyXG4gICAgICogWW91IGNhbiB0b2dnbGUgdGhpcyBhdCBhbnkgdGltZSBhZnRlciBgc2V0Q3JvcGAgaGFzIGJlZW4gY2FsbGVkLCB0byB0dXJuIGNyb3BwaW5nIG9uIG9yIG9mZi5cclxuICAgICAqIEVxdWFsbHksIGNhbGxpbmcgYHNldENyb3BgIHdpdGggbm8gYXJndW1lbnRzIHdpbGwgcmVzZXQgdGhlIGNyb3AgYW5kIGRpc2FibGUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ3JvcCNpc0Nyb3BwZWRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBpc0Nyb3BwZWQ6IGZhbHNlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhIGNyb3AgdG8gYSB0ZXh0dXJlIGJhc2VkIEdhbWUgT2JqZWN0LCBzdWNoIGFzIGEgU3ByaXRlIG9yIEltYWdlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgY3JvcCBpcyBhIHJlY3RhbmdsZSB0aGF0IGxpbWl0cyB0aGUgYXJlYSBvZiB0aGUgdGV4dHVyZSBmcmFtZSB0aGF0IGlzIHZpc2libGUgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqIFxyXG4gICAgICogQ3JvcHBpbmcgYSBHYW1lIE9iamVjdCBkb2VzIG5vdCBjaGFuZ2UgaXRzIHNpemUsIGRpbWVuc2lvbnMsIHBoeXNpY3MgYm9keSBvciBoaXQgYXJlYSwgaXQganVzdFxyXG4gICAgICogY2hhbmdlcyB3aGF0IGlzIHNob3duIHdoZW4gcmVuZGVyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjcm9wIGNvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgdGV4dHVyZSBmcmFtZSwgbm90IHRoZSBHYW1lIE9iamVjdCwgbWVhbmluZyAwIHggMCBpcyB0aGUgdG9wLWxlZnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZXJlZm9yZSwgaWYgeW91IGhhZCBhIEdhbWUgT2JqZWN0IHRoYXQgaGFkIGFuIDgwMHg2MDAgc2l6ZWQgdGV4dHVyZSwgYW5kIHlvdSB3YW50ZWQgdG8gc2hvdyBvbmx5IHRoZSBsZWZ0XHJcbiAgICAgKiBoYWxmIG9mIGl0LCB5b3UgY291bGQgY2FsbCBgc2V0Q3JvcCgwLCAwLCA0MDAsIDYwMClgLlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBpcyBhbHNvIHNjYWxlZCB0byBtYXRjaCB0aGUgR2FtZSBPYmplY3Qgc2NhbGUgYXV0b21hdGljYWxseS4gVGhlcmVmb3JlIGEgY3JvcCByZWN0IG9mIDEwMHg1MCB3b3VsZCBjcm9wXHJcbiAgICAgKiBhbiBhcmVhIG9mIDIwMHgxMDAgd2hlbiBhcHBsaWVkIHRvIGEgR2FtZSBPYmplY3QgdGhhdCBoYWQgYSBzY2FsZSBmYWN0b3Igb2YgMi5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBlaXRoZXIgcGFzcyBpbiBudW1lcmljIHZhbHVlcyBkaXJlY3RseSwgb3IgeW91IGNhbiBwcm92aWRlIGEgc2luZ2xlIFJlY3RhbmdsZSBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIGF0IGFsbCB0byByZXNldCB0aGUgY3JvcCwgb3IgdG9nZ2xlIHRoZSBwcm9wZXJ0eSBgaXNDcm9wcGVkYCB0byBgZmFsc2VgLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3Ugc2hvdWxkIGRvIHRoaXMgaWYgdGhlIGNyb3AgcmVjdGFuZ2xlIGJlY29tZXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZnJhbWUgaXRzZWxmLCBhcyBpdCB3aWxsIGFsbG93XHJcbiAgICAgKiB0aGUgcmVuZGVyZXIgdG8gc2tpcCBzZXZlcmFsIGludGVybmFsIGNhbGN1bGF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNyb3Ajc2V0Q3JvcFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxQaGFzZXIuR2VvbS5SZWN0YW5nbGUpfSBbeF0gLSBUaGUgeCBjb29yZGluYXRlIHRvIHN0YXJ0IHRoZSBjcm9wIGZyb20uIE9yIGEgUGhhc2VyLkdlb20uUmVjdGFuZ2xlIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGFyZSBpZ25vcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gc3RhcnQgdGhlIGNyb3AgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSBjcm9wIHJlY3RhbmdsZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBjcm9wIHJlY3RhbmdsZSBpbiBwaXhlbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Q3JvcDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDcm9wcGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lLnNldENyb3BVVnModGhpcy5fY3JvcCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGhpcy5mbGlwWCwgdGhpcy5mbGlwWSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVjdCA9IHg7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRDcm9wVVZzKHRoaXMuX2Nyb3AsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgdGhpcy5mbGlwWCwgdGhpcy5mbGlwWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNDcm9wcGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHJldHVybnMgYSBibGFuaywgd2VsbC1mb3JtZWQgY3JvcCBvYmplY3QgZm9yIHVzZSBieSBhIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ3JvcCNyZXNldENyb3BPYmplY3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIGNyb3Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXNldENyb3BPYmplY3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHsgdTA6IDAsIHYwOiAwLCB1MTogMCwgdjE6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHg6IDAsIHk6IDAsIGZsaXBYOiBmYWxzZSwgZmxpcFk6IGZhbHNlLCBjeDogMCwgY3k6IDAsIGN3OiAwLCBjaDogMCB9O1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ3JvcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBkZXB0aCBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICogXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIERlcHRoID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGRlcHRoIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGgjX2RlcHRoXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgX2RlcHRoOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlcHRoIG9mIHRoaXMgR2FtZSBPYmplY3Qgd2l0aGluIHRoZSBTY2VuZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRlcHRoIGlzIGFsc28ga25vd24gYXMgdGhlICd6LWluZGV4JyBpbiBzb21lIGVudmlyb25tZW50cywgYW5kIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSByZW5kZXJpbmcgb3JkZXJcclxuICAgICAqIG9mIEdhbWUgT2JqZWN0cywgd2l0aG91dCBhY3R1YWxseSBtb3ZpbmcgdGhlaXIgcG9zaXRpb24gaW4gdGhlIGRpc3BsYXkgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGVwdGggc3RhcnRzIGZyb20gemVybyAodGhlIGRlZmF1bHQgdmFsdWUpIGFuZCBpbmNyZWFzZXMgZnJvbSB0aGF0IHBvaW50LiBBIEdhbWUgT2JqZWN0IHdpdGggYSBoaWdoZXIgZGVwdGhcclxuICAgICAqIHZhbHVlIHdpbGwgYWx3YXlzIHJlbmRlciBpbiBmcm9udCBvZiBvbmUgd2l0aCBhIGxvd2VyIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIFNldHRpbmcgdGhlIGRlcHRoIHdpbGwgcXVldWUgYSBkZXB0aCBzb3J0IGV2ZW50IHdpdGhpbiB0aGUgU2NlbmUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoI2RlcHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlcHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXB0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuc3lzLnF1ZXVlRGVwdGhTb3J0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGVwdGggb2YgdGhpcyBHYW1lIE9iamVjdCB3aXRoaW4gdGhlIFNjZW5lLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGVwdGggaXMgYWxzbyBrbm93biBhcyB0aGUgJ3otaW5kZXgnIGluIHNvbWUgZW52aXJvbm1lbnRzLCBhbmQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHJlbmRlcmluZyBvcmRlclxyXG4gICAgICogb2YgR2FtZSBPYmplY3RzLCB3aXRob3V0IGFjdHVhbGx5IG1vdmluZyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgZGlzcGxheSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBkZXB0aCBzdGFydHMgZnJvbSB6ZXJvICh0aGUgZGVmYXVsdCB2YWx1ZSkgYW5kIGluY3JlYXNlcyBmcm9tIHRoYXQgcG9pbnQuIEEgR2FtZSBPYmplY3Qgd2l0aCBhIGhpZ2hlciBkZXB0aFxyXG4gICAgICogdmFsdWUgd2lsbCBhbHdheXMgcmVuZGVyIGluIGZyb250IG9mIG9uZSB3aXRoIGEgbG93ZXIgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogU2V0dGluZyB0aGUgZGVwdGggd2lsbCBxdWV1ZSBhIGRlcHRoIHNvcnQgZXZlbnQgd2l0aGluIHRoZSBTY2VuZS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aCNzZXREZXB0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB2YWx1ZSAtIFRoZSBkZXB0aCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXREZXB0aDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLmRlcHRoID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGVwdGg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgdmlzdWFsbHkgZmxpcHBpbmcgYSBHYW1lIE9iamVjdC5cclxuICogU2hvdWxkIGJlIGFwcGxpZWQgYXMgYSBtaXhpbiBhbmQgbm90IHVzZWQgZGlyZWN0bHkuXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIEZsaXAgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbGx5IGZsaXBwZWQgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBBIEdhbWUgT2JqZWN0IHRoYXQgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIGhvcml6b250YWwgYXhpcy5cclxuICAgICAqIEZsaXBwaW5nIGFsd2F5cyB0YWtlcyBwbGFjZSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHRleHR1cmUgYW5kIGRvZXMgbm90IGltcGFjdCB0aGUgc2NhbGUgdmFsdWUuXHJcbiAgICAgKiBJZiB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHBoeXNpY3MgYm9keSwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZSBib2R5LiBUaGlzIGlzIGEgcmVuZGVyaW5nIHRvZ2dsZSBvbmx5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwI2ZsaXBYXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZmxpcFg6IGZhbHNlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZlcnRpY2FsbHkgZmxpcHBlZCBzdGF0ZSBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEEgR2FtZSBPYmplY3QgdGhhdCBpcyBmbGlwcGVkIHZlcnRpY2FsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIHZlcnRpY2FsIGF4aXMgKGkuZS4gdXBzaWRlIGRvd24pXHJcbiAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcCNmbGlwWVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGZsaXBZOiBmYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIGhvcml6b250YWwgZmxpcHBlZCBzdGF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBBIEdhbWUgT2JqZWN0IHRoYXQgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIGhvcml6b250YWwgYXhpcy5cclxuICAgICAqIEZsaXBwaW5nIGFsd2F5cyB0YWtlcyBwbGFjZSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHRleHR1cmUgYW5kIGRvZXMgbm90IGltcGFjdCB0aGUgc2NhbGUgdmFsdWUuXHJcbiAgICAgKiBJZiB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHBoeXNpY3MgYm9keSwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZSBib2R5LiBUaGlzIGlzIGEgcmVuZGVyaW5nIHRvZ2dsZSBvbmx5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXAjdG9nZ2xlRmxpcFhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB0b2dnbGVGbGlwWDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZsaXBYID0gIXRoaXMuZmxpcFg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIHZlcnRpY2FsIGZsaXBwZWQgc3RhdGUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwI3RvZ2dsZUZsaXBZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgdG9nZ2xlRmxpcFk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mbGlwWSA9ICF0aGlzLmZsaXBZO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGZsaXBwZWQgc3RhdGUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQSBHYW1lIE9iamVjdCB0aGF0IGlzIGZsaXBwZWQgaG9yaXpvbnRhbGx5IHdpbGwgcmVuZGVyIGludmVyc2VkIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuXHJcbiAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwI3NldEZsaXBYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIGZsaXBwZWQgc3RhdGUuIGBmYWxzZWAgZm9yIG5vIGZsaXAsIG9yIGB0cnVlYCB0byBiZSBmbGlwcGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbGlwWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmxpcFggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVydGljYWwgZmxpcHBlZCBzdGF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXAjc2V0RmxpcFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgZmxpcHBlZCBzdGF0ZS4gYGZhbHNlYCBmb3Igbm8gZmxpcCwgb3IgYHRydWVgIHRvIGJlIGZsaXBwZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsaXBZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mbGlwWSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBmbGlwcGVkIHN0YXRlIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEEgR2FtZSBPYmplY3QgdGhhdCBpcyBmbGlwcGVkIHdpbGwgcmVuZGVyIGludmVyc2VkIG9uIHRoZSBmbGlwcGVkIGF4aXMuXHJcbiAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwI3NldEZsaXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0geCAtIFRoZSBob3Jpem9udGFsIGZsaXBwZWQgc3RhdGUuIGBmYWxzZWAgZm9yIG5vIGZsaXAsIG9yIGB0cnVlYCB0byBiZSBmbGlwcGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB5IC0gVGhlIGhvcml6b250YWwgZmxpcHBlZCBzdGF0ZS4gYGZhbHNlYCBmb3Igbm8gZmxpcCwgb3IgYHRydWVgIHRvIGJlIGZsaXBwZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsaXA6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmxpcFggPSB4O1xyXG4gICAgICAgIHRoaXMuZmxpcFkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZsaXBwZWQgc3RhdGUgb2YgdGhpcyBHYW1lIE9iamVjdCBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdW4tZmxpcHBlZCBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwI3Jlc2V0RmxpcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVzZXRGbGlwOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmxpcFggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxpcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBSb3RhdGVBcm91bmQgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1JvdGF0ZUFyb3VuZCcpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBib3VuZHMgb2YgYSBHYW1lIE9iamVjdC5cclxuICogU2hvdWxkIGJlIGFwcGxpZWQgYXMgYSBtaXhpbiBhbmQgbm90IHVzZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuR2V0Qm91bmRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBHZXRCb3VuZHMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGJvdW5kcyBvdXRwdXQgdmVjdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHMjcHJlcGFyZUJvdW5kc091dHB1dFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IG91dHB1dCAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgdmFsdWVzIGluLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgVmVjdG9yMiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUGFyZW50PWZhbHNlXSAtIElmIHRoaXMgR2FtZSBPYmplY3QgaGFzIGEgcGFyZW50IENvbnRhaW5lciwgaW5jbHVkZSBpdCAoYW5kIGFsbCBvdGhlciBhbmNlc3RvcnMpIGluIHRoZSByZXN1bHRpbmcgdmVjdG9yP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcmVwYXJlQm91bmRzT3V0cHV0OiBmdW5jdGlvbiAob3V0cHV0LCBpbmNsdWRlUGFyZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpbmNsdWRlUGFyZW50ID09PSB1bmRlZmluZWQpIHsgaW5jbHVkZVBhcmVudCA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJvdGF0aW9uICE9PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUm90YXRlQXJvdW5kKG91dHB1dCwgdGhpcy54LCB0aGlzLnksIHRoaXMucm90YXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVQYXJlbnQgJiYgdGhpcy5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFyZW50TWF0cml4ID0gdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0Qm91bmRzVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgICAgICBwYXJlbnRNYXRyaXgudHJhbnNmb3JtUG9pbnQob3V0cHV0LngsIG91dHB1dC55LCBvdXRwdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBjZW50ZXIgY29vcmRpbmF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LCByZWdhcmRsZXNzIG9mIG9yaWdpbi5cclxuICAgICAqIFRoZSByZXR1cm5lZCBwb2ludCBpcyBjYWxjdWxhdGVkIGluIGxvY2FsIHNwYWNlIGFuZCBkb2VzIG5vdCBmYWN0b3IgaW4gYW55IHBhcmVudCBjb250YWluZXJzXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHMjZ2V0Q2VudGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFtvdXRwdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSB2YWx1ZXMgaW4uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBWZWN0b3IyIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2VudGVyOiBmdW5jdGlvbiAob3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gdGhpcy54IC0gKHRoaXMuZGlzcGxheVdpZHRoICogdGhpcy5vcmlnaW5YKSArICh0aGlzLmRpc3BsYXlXaWR0aCAvIDIpO1xyXG4gICAgICAgIG91dHB1dC55ID0gdGhpcy55IC0gKHRoaXMuZGlzcGxheUhlaWdodCAqIHRoaXMub3JpZ2luWSkgKyAodGhpcy5kaXNwbGF5SGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG9wLWxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhpcyBHYW1lIE9iamVjdCwgcmVnYXJkbGVzcyBvZiBvcmlnaW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgcG9pbnQgaXMgY2FsY3VsYXRlZCBpbiBsb2NhbCBzcGFjZSBhbmQgZG9lcyBub3QgZmFjdG9yIGluIGFueSBwYXJlbnQgY29udGFpbmVyc1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuR2V0Qm91bmRzI2dldFRvcExlZnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dHB1dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvYmplY3QgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbi4gSWYgbm90IHByb3ZpZGVkIGEgbmV3IFZlY3RvcjIgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVBhcmVudD1mYWxzZV0gLSBJZiB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHBhcmVudCBDb250YWluZXIsIGluY2x1ZGUgaXQgKGFuZCBhbGwgb3RoZXIgYW5jZXN0b3JzKSBpbiB0aGUgcmVzdWx0aW5nIHZlY3Rvcj9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0VG9wTGVmdDogZnVuY3Rpb24gKG91dHB1dCwgaW5jbHVkZVBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoIW91dHB1dCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gdGhpcy54IC0gKHRoaXMuZGlzcGxheVdpZHRoICogdGhpcy5vcmlnaW5YKTtcclxuICAgICAgICBvdXRwdXQueSA9IHRoaXMueSAtICh0aGlzLmRpc3BsYXlIZWlnaHQgKiB0aGlzLm9yaWdpblkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQm91bmRzT3V0cHV0KG91dHB1dCwgaW5jbHVkZVBhcmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG9wLWNlbnRlciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRUb3BDZW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFtvdXRwdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSB2YWx1ZXMgaW4uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBWZWN0b3IyIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVQYXJlbnQ9ZmFsc2VdIC0gSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwYXJlbnQgQ29udGFpbmVyLCBpbmNsdWRlIGl0IChhbmQgYWxsIG90aGVyIGFuY2VzdG9ycykgaW4gdGhlIHJlc3VsdGluZyB2ZWN0b3I/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gVGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFRvcENlbnRlcjogZnVuY3Rpb24gKG91dHB1dCwgaW5jbHVkZVBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoIW91dHB1dCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gKHRoaXMueCAtICh0aGlzLmRpc3BsYXlXaWR0aCAqIHRoaXMub3JpZ2luWCkpICsgKHRoaXMuZGlzcGxheVdpZHRoIC8gMik7XHJcbiAgICAgICAgb3V0cHV0LnkgPSB0aGlzLnkgLSAodGhpcy5kaXNwbGF5SGVpZ2h0ICogdGhpcy5vcmlnaW5ZKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUJvdW5kc091dHB1dChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRvcC1yaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LCByZWdhcmRsZXNzIG9mIG9yaWdpbi5cclxuICAgICAqIFRoZSByZXR1cm5lZCBwb2ludCBpcyBjYWxjdWxhdGVkIGluIGxvY2FsIHNwYWNlIGFuZCBkb2VzIG5vdCBmYWN0b3IgaW4gYW55IHBhcmVudCBjb250YWluZXJzXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHMjZ2V0VG9wUmlnaHRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dHB1dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvYmplY3QgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbi4gSWYgbm90IHByb3ZpZGVkIGEgbmV3IFZlY3RvcjIgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVBhcmVudD1mYWxzZV0gLSBJZiB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHBhcmVudCBDb250YWluZXIsIGluY2x1ZGUgaXQgKGFuZCBhbGwgb3RoZXIgYW5jZXN0b3JzKSBpbiB0aGUgcmVzdWx0aW5nIHZlY3Rvcj9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0VG9wUmlnaHQ6IGZ1bmN0aW9uIChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFvdXRwdXQpIHsgb3V0cHV0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICBvdXRwdXQueCA9ICh0aGlzLnggLSAodGhpcy5kaXNwbGF5V2lkdGggKiB0aGlzLm9yaWdpblgpKSArIHRoaXMuZGlzcGxheVdpZHRoO1xyXG4gICAgICAgIG91dHB1dC55ID0gdGhpcy55IC0gKHRoaXMuZGlzcGxheUhlaWdodCAqIHRoaXMub3JpZ2luWSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVCb3VuZHNPdXRwdXQob3V0cHV0LCBpbmNsdWRlUGFyZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBsZWZ0LWNlbnRlciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRMZWZ0Q2VudGVyXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBbb3V0cHV0XSAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgdmFsdWVzIGluLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgVmVjdG9yMiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUGFyZW50PWZhbHNlXSAtIElmIHRoaXMgR2FtZSBPYmplY3QgaGFzIGEgcGFyZW50IENvbnRhaW5lciwgaW5jbHVkZSBpdCAoYW5kIGFsbCBvdGhlciBhbmNlc3RvcnMpIGluIHRoZSByZXN1bHRpbmcgdmVjdG9yP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRMZWZ0Q2VudGVyOiBmdW5jdGlvbiAob3V0cHV0LCBpbmNsdWRlUGFyZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmICghb3V0cHV0KSB7IG91dHB1dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgb3V0cHV0LnggPSB0aGlzLnggLSAodGhpcy5kaXNwbGF5V2lkdGggKiB0aGlzLm9yaWdpblgpO1xyXG4gICAgICAgIG91dHB1dC55ID0gKHRoaXMueSAtICh0aGlzLmRpc3BsYXlIZWlnaHQgKiB0aGlzLm9yaWdpblkpKSArICh0aGlzLmRpc3BsYXlIZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUJvdW5kc091dHB1dChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJpZ2h0LWNlbnRlciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRSaWdodENlbnRlclxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW291dHB1dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvYmplY3QgdG8gc3RvcmUgdGhlIHZhbHVlcyBpbi4gSWYgbm90IHByb3ZpZGVkIGEgbmV3IFZlY3RvcjIgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVBhcmVudD1mYWxzZV0gLSBJZiB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHBhcmVudCBDb250YWluZXIsIGluY2x1ZGUgaXQgKGFuZCBhbGwgb3RoZXIgYW5jZXN0b3JzKSBpbiB0aGUgcmVzdWx0aW5nIHZlY3Rvcj9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBUaGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmlnaHRDZW50ZXI6IGZ1bmN0aW9uIChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFvdXRwdXQpIHsgb3V0cHV0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICBvdXRwdXQueCA9ICh0aGlzLnggLSAodGhpcy5kaXNwbGF5V2lkdGggKiB0aGlzLm9yaWdpblgpKSArIHRoaXMuZGlzcGxheVdpZHRoO1xyXG4gICAgICAgIG91dHB1dC55ID0gKHRoaXMueSAtICh0aGlzLmRpc3BsYXlIZWlnaHQgKiB0aGlzLm9yaWdpblkpKSArICh0aGlzLmRpc3BsYXlIZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUJvdW5kc091dHB1dChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGJvdHRvbS1sZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRCb3R0b21MZWZ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFtvdXRwdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSB2YWx1ZXMgaW4uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBWZWN0b3IyIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVQYXJlbnQ9ZmFsc2VdIC0gSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwYXJlbnQgQ29udGFpbmVyLCBpbmNsdWRlIGl0IChhbmQgYWxsIG90aGVyIGFuY2VzdG9ycykgaW4gdGhlIHJlc3VsdGluZyB2ZWN0b3I/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gVGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldEJvdHRvbUxlZnQ6IGZ1bmN0aW9uIChvdXRwdXQsIGluY2x1ZGVQYXJlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFvdXRwdXQpIHsgb3V0cHV0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICBvdXRwdXQueCA9IHRoaXMueCAtICh0aGlzLmRpc3BsYXlXaWR0aCAqIHRoaXMub3JpZ2luWCk7XHJcbiAgICAgICAgb3V0cHV0LnkgPSAodGhpcy55IC0gKHRoaXMuZGlzcGxheUhlaWdodCAqIHRoaXMub3JpZ2luWSkpICsgdGhpcy5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQm91bmRzT3V0cHV0KG91dHB1dCwgaW5jbHVkZVBhcmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYm90dG9tLWNlbnRlciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRCb3R0b21DZW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFtvdXRwdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSB2YWx1ZXMgaW4uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBWZWN0b3IyIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVQYXJlbnQ9ZmFsc2VdIC0gSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwYXJlbnQgQ29udGFpbmVyLCBpbmNsdWRlIGl0IChhbmQgYWxsIG90aGVyIGFuY2VzdG9ycykgaW4gdGhlIHJlc3VsdGluZyB2ZWN0b3I/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8b2JqZWN0KX0gVGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldEJvdHRvbUNlbnRlcjogZnVuY3Rpb24gKG91dHB1dCwgaW5jbHVkZVBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoIW91dHB1dCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gKHRoaXMueCAtICh0aGlzLmRpc3BsYXlXaWR0aCAqIHRoaXMub3JpZ2luWCkpICsgKHRoaXMuZGlzcGxheVdpZHRoIC8gMik7XHJcbiAgICAgICAgb3V0cHV0LnkgPSAodGhpcy55IC0gKHRoaXMuZGlzcGxheUhlaWdodCAqIHRoaXMub3JpZ2luWSkpICsgdGhpcy5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQm91bmRzT3V0cHV0KG91dHB1dCwgaW5jbHVkZVBhcmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHJldHVybmVkIHBvaW50IGlzIGNhbGN1bGF0ZWQgaW4gbG9jYWwgc3BhY2UgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgcGFyZW50IGNvbnRhaW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRCb3R0b21SaWdodFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBbb3V0cHV0XSAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgdmFsdWVzIGluLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgVmVjdG9yMiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlUGFyZW50PWZhbHNlXSAtIElmIHRoaXMgR2FtZSBPYmplY3QgaGFzIGEgcGFyZW50IENvbnRhaW5lciwgaW5jbHVkZSBpdCAoYW5kIGFsbCBvdGhlciBhbmNlc3RvcnMpIGluIHRoZSByZXN1bHRpbmcgdmVjdG9yP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRCb3R0b21SaWdodDogZnVuY3Rpb24gKG91dHB1dCwgaW5jbHVkZVBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoIW91dHB1dCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gKHRoaXMueCAtICh0aGlzLmRpc3BsYXlXaWR0aCAqIHRoaXMub3JpZ2luWCkpICsgdGhpcy5kaXNwbGF5V2lkdGg7XHJcbiAgICAgICAgb3V0cHV0LnkgPSAodGhpcy55IC0gKHRoaXMuZGlzcGxheUhlaWdodCAqIHRoaXMub3JpZ2luWSkpICsgdGhpcy5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQm91bmRzT3V0cHV0KG91dHB1dCwgaW5jbHVkZVBhcmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoaXMgR2FtZSBPYmplY3QsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLlxyXG4gICAgICogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGFuZCByZXR1cm5lZCBpbiBhIFJlY3RhbmdsZSwgb3IgUmVjdGFuZ2xlLWxpa2UsIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kcyNnZXRCb3VuZHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUmVjdGFuZ2xlfG9iamVjdCl9IFtvdXRwdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSB2YWx1ZXMgaW4uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBSZWN0YW5nbGUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5SZWN0YW5nbGV8b2JqZWN0KX0gVGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlIG91dHB1dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldEJvdW5kczogZnVuY3Rpb24gKG91dHB1dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHsgb3V0cHV0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgICAgIC8vICBXZSBjYW4gdXNlIHRoZSBvdXRwdXQgb2JqZWN0IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSB4L3kgY29vcmRzIGluOlxyXG5cclxuICAgICAgICB2YXIgVEx4LCBUTHksIFRSeCwgVFJ5LCBCTHgsIEJMeSwgQlJ4LCBCUnk7XHJcblxyXG4gICAgICAgIC8vIEluc3RlYWQgb2YgZG9pbmcgYSBjaGVjayBpZiBwYXJlbnQgY29udGFpbmVyIGlzIFxyXG4gICAgICAgIC8vIGRlZmluZWQgcGVyIGNvcm5lciB3ZSBvbmx5IGRvIGl0IG9uY2UuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Q29udGFpbmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhcmVudE1hdHJpeCA9IHRoaXMucGFyZW50Q29udGFpbmVyLmdldEJvdW5kc1RyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZXRUb3BMZWZ0KG91dHB1dCk7XHJcbiAgICAgICAgICAgIHBhcmVudE1hdHJpeC50cmFuc2Zvcm1Qb2ludChvdXRwdXQueCwgb3V0cHV0LnksIG91dHB1dCk7XHJcblxyXG4gICAgICAgICAgICBUTHggPSBvdXRwdXQueDtcclxuICAgICAgICAgICAgVEx5ID0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldFRvcFJpZ2h0KG91dHB1dCk7XHJcbiAgICAgICAgICAgIHBhcmVudE1hdHJpeC50cmFuc2Zvcm1Qb2ludChvdXRwdXQueCwgb3V0cHV0LnksIG91dHB1dCk7XHJcblxyXG4gICAgICAgICAgICBUUnggPSBvdXRwdXQueDtcclxuICAgICAgICAgICAgVFJ5ID0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldEJvdHRvbUxlZnQob3V0cHV0KTtcclxuICAgICAgICAgICAgcGFyZW50TWF0cml4LnRyYW5zZm9ybVBvaW50KG91dHB1dC54LCBvdXRwdXQueSwgb3V0cHV0KTtcclxuXHJcbiAgICAgICAgICAgIEJMeCA9IG91dHB1dC54O1xyXG4gICAgICAgICAgICBCTHkgPSBvdXRwdXQueTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Qm90dG9tUmlnaHQob3V0cHV0KTtcclxuICAgICAgICAgICAgcGFyZW50TWF0cml4LnRyYW5zZm9ybVBvaW50KG91dHB1dC54LCBvdXRwdXQueSwgb3V0cHV0KTtcclxuXHJcbiAgICAgICAgICAgIEJSeCA9IG91dHB1dC54O1xyXG4gICAgICAgICAgICBCUnkgPSBvdXRwdXQueTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRUb3BMZWZ0KG91dHB1dCk7XHJcblxyXG4gICAgICAgICAgICBUTHggPSBvdXRwdXQueDtcclxuICAgICAgICAgICAgVEx5ID0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldFRvcFJpZ2h0KG91dHB1dCk7XHJcblxyXG4gICAgICAgICAgICBUUnggPSBvdXRwdXQueDtcclxuICAgICAgICAgICAgVFJ5ID0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldEJvdHRvbUxlZnQob3V0cHV0KTtcclxuXHJcbiAgICAgICAgICAgIEJMeCA9IG91dHB1dC54O1xyXG4gICAgICAgICAgICBCTHkgPSBvdXRwdXQueTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Qm90dG9tUmlnaHQob3V0cHV0KTtcclxuXHJcbiAgICAgICAgICAgIEJSeCA9IG91dHB1dC54O1xyXG4gICAgICAgICAgICBCUnkgPSBvdXRwdXQueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gTWF0aC5taW4oVEx4LCBUUngsIEJMeCwgQlJ4KTtcclxuICAgICAgICBvdXRwdXQueSA9IE1hdGgubWluKFRMeSwgVFJ5LCBCTHksIEJSeSk7XHJcbiAgICAgICAgb3V0cHV0LndpZHRoID0gTWF0aC5tYXgoVEx4LCBUUngsIEJMeCwgQlJ4KSAtIG91dHB1dC54O1xyXG4gICAgICAgIG91dHB1dC5oZWlnaHQgPSBNYXRoLm1heChUTHksIFRSeSwgQkx5LCBCUnkpIC0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRCb3VuZHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJpdG1hcE1hc2sgPSByZXF1aXJlKCcuLi8uLi9kaXNwbGF5L21hc2svQml0bWFwTWFzaycpO1xyXG52YXIgR2VvbWV0cnlNYXNrID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9tYXNrL0dlb21ldHJ5TWFzaycpO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgbWFzayBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIE1hc2sgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgTWFzayB0aGlzIEdhbWUgT2JqZWN0IGlzIHVzaW5nIGR1cmluZyByZW5kZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFzayNtYXNrXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLkRpc3BsYXkuTWFza3MuQml0bWFwTWFza3xQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2t9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgbWFzazogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1hc2sgdGhhdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBtYXNrIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCBhbmQgY2FuIGJlIGVpdGhlciBhIEdlb21ldHJ5TWFzayBvciBhIEJpdG1hcE1hc2suXHJcbiAgICAgKiBOb3RlOiBCaXRtYXAgTWFza3Mgb25seSB3b3JrIG9uIFdlYkdMLiBHZW9tZXRyeSBNYXNrcyB3b3JrIG9uIGJvdGggV2ViR0wgYW5kIENhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIG1hc2sgaXMgYWxyZWFkeSBzZXQgb24gdGhpcyBHYW1lIE9iamVjdCBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlcGxhY2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBNYXNrcyBhcmUgcG9zaXRpb25lZCBpbiBnbG9iYWwgc3BhY2UgYW5kIGFyZSBub3QgcmVsYXRpdmUgdG8gdGhlIEdhbWUgT2JqZWN0IHRvIHdoaWNoIHRoZXlcclxuICAgICAqIGFyZSBhcHBsaWVkLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgbXVsdGlwbGUgR2FtZSBPYmplY3RzIGNhbiBhbGwgc2hhcmUgdGhlIHNhbWUgbWFzay5cclxuICAgICAqIFxyXG4gICAgICogTWFza3MgaGF2ZSBubyBpbXBhY3Qgb24gcGh5c2ljcyBvciBpbnB1dCBkZXRlY3Rpb24uIFRoZXkgYXJlIHB1cmVseSBhIHJlbmRlcmluZyBjb21wb25lbnRcclxuICAgICAqIHRoYXQgYWxsb3dzIHlvdSB0byBsaW1pdCB3aGF0IGlzIHZpc2libGUgZHVyaW5nIHRoZSByZW5kZXIgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2sjc2V0TWFza1xyXG4gICAgICogQHNpbmNlIDMuNi4yXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrfFBoYXNlci5EaXNwbGF5Lk1hc2tzLkdlb21ldHJ5TWFza30gbWFzayAtIFRoZSBtYXNrIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2Ugd2hlbiByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWFzazogZnVuY3Rpb24gKG1hc2spXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBtYXNrIHRoYXQgdGhpcyBHYW1lIE9iamVjdCB3YXMgdXNpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrI2NsZWFyTWFza1xyXG4gICAgICogQHNpbmNlIDMuNi4yXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveU1hc2s9ZmFsc2VdIC0gRGVzdHJveSB0aGUgbWFzayBiZWZvcmUgY2xlYXJpbmcgaXQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgY2xlYXJNYXNrOiBmdW5jdGlvbiAoZGVzdHJveU1hc2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRlc3Ryb3lNYXNrID09PSB1bmRlZmluZWQpIHsgZGVzdHJveU1hc2sgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAoZGVzdHJveU1hc2sgJiYgdGhpcy5tYXNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXNrLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWFzayA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBCaXRtYXAgTWFzay4gVGhpcyBtYXNrIGNhbiBiZSB1c2VkIGJ5IGFueSBHYW1lIE9iamVjdCxcclxuICAgICAqIGluY2x1ZGluZyB0aGlzIG9uZS5cclxuICAgICAqXHJcbiAgICAgKiBUbyBjcmVhdGUgdGhlIG1hc2sgeW91IG5lZWQgdG8gcGFzcyBpbiBhIHJlZmVyZW5jZSB0byBhIHJlbmRlcmFibGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBBIHJlbmRlcmFibGUgR2FtZSBPYmplY3QgaXMgb25lIHRoYXQgdXNlcyBhIHRleHR1cmUgdG8gcmVuZGVyIHdpdGgsIHN1Y2ggYXMgYW5cclxuICAgICAqIEltYWdlLCBTcHJpdGUsIFJlbmRlciBUZXh0dXJlIG9yIEJpdG1hcFRleHQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IGRvIG5vdCBwcm92aWRlIGEgcmVuZGVyYWJsZSBvYmplY3QsIGFuZCB0aGlzIEdhbWUgT2JqZWN0IGhhcyBhIHRleHR1cmUsXHJcbiAgICAgKiBpdCB3aWxsIHVzZSBpdHNlbGYgYXMgdGhlIG9iamVjdC4gVGhpcyBtZWFucyB5b3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gY3JlYXRlXHJcbiAgICAgKiBhIEJpdG1hcCBNYXNrIGZyb20gYW55IHJlbmRlcmFibGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrI2NyZWF0ZUJpdG1hcE1hc2tcclxuICAgICAqIEBzaW5jZSAzLjYuMlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBbcmVuZGVyYWJsZV0gLSBBIHJlbmRlcmFibGUgR2FtZSBPYmplY3QgdGhhdCB1c2VzIGEgdGV4dHVyZSwgc3VjaCBhcyBhIFNwcml0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5NYXNrcy5CaXRtYXBNYXNrfSBUaGlzIEJpdG1hcCBNYXNrIHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUJpdG1hcE1hc2s6IGZ1bmN0aW9uIChyZW5kZXJhYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyZW5kZXJhYmxlID09PSB1bmRlZmluZWQgJiYgKHRoaXMudGV4dHVyZSB8fCB0aGlzLnNoYWRlcikpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzXHJcbiAgICAgICAgICAgIHJlbmRlcmFibGUgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBNYXNrKHRoaXMuc2NlbmUsIHJlbmRlcmFibGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBHZW9tZXRyeSBNYXNrLiBUaGlzIG1hc2sgY2FuIGJlIHVzZWQgYnkgYW55IEdhbWUgT2JqZWN0LFxyXG4gICAgICogaW5jbHVkaW5nIHRoaXMgb25lLlxyXG4gICAgICpcclxuICAgICAqIFRvIGNyZWF0ZSB0aGUgbWFzayB5b3UgbmVlZCB0byBwYXNzIGluIGEgcmVmZXJlbmNlIHRvIGEgR3JhcGhpY3MgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IGRvIG5vdCBwcm92aWRlIGEgZ3JhcGhpY3Mgb2JqZWN0LCBhbmQgdGhpcyBHYW1lIE9iamVjdCBpcyBhbiBpbnN0YW5jZVxyXG4gICAgICogb2YgYSBHcmFwaGljcyBvYmplY3QsIHRoZW4gaXQgd2lsbCB1c2UgaXRzZWxmIHRvIGNyZWF0ZSB0aGUgbWFzay5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZWFucyB5b3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgR2VvbWV0cnkgTWFzayBmcm9tIGFueSBHcmFwaGljcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2sjY3JlYXRlR2VvbWV0cnlNYXNrXHJcbiAgICAgKiBAc2luY2UgMy42LjJcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IFtncmFwaGljc10gLSBBIEdyYXBoaWNzIEdhbWUgT2JqZWN0LiBUaGUgZ2VvbWV0cnkgd2l0aGluIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgbWFzay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuRGlzcGxheS5NYXNrcy5HZW9tZXRyeU1hc2t9IFRoaXMgR2VvbWV0cnkgTWFzayB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVHZW9tZXRyeU1hc2s6IGZ1bmN0aW9uIChncmFwaGljcylcclxuICAgIHtcclxuICAgICAgICBpZiAoZ3JhcGhpY3MgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnR5cGUgPT09ICdHcmFwaGljcycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzXHJcbiAgICAgICAgICAgIGdyYXBoaWNzID0gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgR2VvbWV0cnlNYXNrKHRoaXMuc2NlbmUsIGdyYXBoaWNzKTtcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hc2s7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgb3JpZ2luIG9mIGEgR2FtZSBPYmplY3QuXHJcbiAqIFZhbHVlcyBhcmUgbm9ybWFsaXplZCwgZ2l2ZW4gaW4gdGhlIHJhbmdlIDAgdG8gMS5cclxuICogRGlzcGxheSB2YWx1ZXMgY29udGFpbiB0aGUgY2FsY3VsYXRlZCBwaXhlbCB2YWx1ZXMuXHJcbiAqIFNob3VsZCBiZSBhcHBsaWVkIGFzIGEgbWl4aW4gYW5kIG5vdCB1c2VkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgT3JpZ2luID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYSBHYW1lIE9iamVjdCBoYXMgdGhpcyBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luI19vcmlnaW5Db21wb25lbnRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICovXHJcbiAgICBfb3JpZ2luQ29tcG9uZW50OiB0cnVlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhvcml6b250YWwgb3JpZ2luIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgb3JpZ2luIG1hcHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLjUsIG1lYW5pbmcgYWxsIEdhbWUgT2JqZWN0cyBhcmUgcG9zaXRpb25lZCBiYXNlZCBvbiB0aGVpciBjZW50ZXIuXHJcbiAgICAgKiBTZXR0aW5nIHRoZSB2YWx1ZSB0byAwIG1lYW5zIHRoZSBwb3NpdGlvbiBub3cgcmVsYXRlcyB0byB0aGUgbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luI29yaWdpblhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAwLjVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvcmlnaW5YOiAwLjUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmVydGljYWwgb3JpZ2luIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgb3JpZ2luIG1hcHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLjUsIG1lYW5pbmcgYWxsIEdhbWUgT2JqZWN0cyBhcmUgcG9zaXRpb25lZCBiYXNlZCBvbiB0aGVpciBjZW50ZXIuXHJcbiAgICAgKiBTZXR0aW5nIHRoZSB2YWx1ZSB0byAwIG1lYW5zIHRoZSBwb3NpdGlvbiBub3cgcmVsYXRlcyB0byB0aGUgdG9wIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW4jb3JpZ2luWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDAuNVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9yaWdpblk6IDAuNSxcclxuXHJcbiAgICAvLyAgcHJpdmF0ZSArIHJlYWQgb25seVxyXG4gICAgX2Rpc3BsYXlPcmlnaW5YOiAwLFxyXG4gICAgX2Rpc3BsYXlPcmlnaW5ZOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhvcml6b250YWwgZGlzcGxheSBvcmlnaW4gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoZSBvcmlnaW4gaXMgYSBub3JtYWxpemVkIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIFRoZSBkaXNwbGF5T3JpZ2luIGlzIGEgcGl4ZWwgdmFsdWUsIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBHYW1lIE9iamVjdCBjb21iaW5lZCB3aXRoIHRoZSBvcmlnaW4uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luI2Rpc3BsYXlPcmlnaW5YXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRpc3BsYXlPcmlnaW5YOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlPcmlnaW5YID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luWCA9IHZhbHVlIC8gdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJ0aWNhbCBkaXNwbGF5IG9yaWdpbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhlIG9yaWdpbiBpcyBhIG5vcm1hbGl6ZWQgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogVGhlIGRpc3BsYXlPcmlnaW4gaXMgYSBwaXhlbCB2YWx1ZSwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIEdhbWUgT2JqZWN0IGNvbWJpbmVkIHdpdGggdGhlIG9yaWdpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW4jZGlzcGxheU9yaWdpbllcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGlzcGxheU9yaWdpblk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheU9yaWdpblkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5ZID0gdmFsdWUgLyB0aGlzLmhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG9yaWdpbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSB2YWx1ZXMgYXJlIGdpdmVuIGluIHRoZSByYW5nZSAwIHRvIDEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW4jc2V0T3JpZ2luXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MC41XSAtIFRoZSBob3Jpem9udGFsIG9yaWdpbiB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSB2ZXJ0aWNhbCBvcmlnaW4gdmFsdWUuIElmIG5vdCBkZWZpbmVkIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiBgeGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0T3JpZ2luOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwLjU7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMub3JpZ2luWCA9IHg7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5ZID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG9yaWdpbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGJhc2VkIG9uIHRoZSBQaXZvdCB2YWx1ZXMgaW4gaXRzIEZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luI3NldE9yaWdpbkZyb21GcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0T3JpZ2luRnJvbUZyYW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5mcmFtZSB8fCAhdGhpcy5mcmFtZS5jdXN0b21QaXZvdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE9yaWdpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm9yaWdpblggPSB0aGlzLmZyYW1lLnBpdm90WDtcclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5ZID0gdGhpcy5mcmFtZS5waXZvdFk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGlzcGxheSBvcmlnaW4gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgc2V0dGluZyB0aGUgb3JpZ2luIGlzIHRoYXQgeW91IGNhbiB1c2UgcGl4ZWwgdmFsdWVzIGZvciBzZXR0aW5nIHRoZSBkaXNwbGF5IG9yaWdpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpbiNzZXREaXNwbGF5T3JpZ2luXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBkaXNwbGF5IG9yaWdpbiB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSB2ZXJ0aWNhbCBkaXNwbGF5IG9yaWdpbiB2YWx1ZS4gSWYgbm90IGRlZmluZWQgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIGB4YC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXREaXNwbGF5T3JpZ2luOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0geDsgfVxyXG5cclxuICAgICAgICB0aGlzLmRpc3BsYXlPcmlnaW5YID0geDtcclxuICAgICAgICB0aGlzLmRpc3BsYXlPcmlnaW5ZID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgRGlzcGxheSBPcmlnaW4gY2FjaGVkIHZhbHVlcyBpbnRlcm5hbGx5IHN0b3JlZCBvbiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogWW91IGRvbid0IHVzdWFsbHkgY2FsbCB0aGlzIGRpcmVjdGx5LCBidXQgaXQgaXMgZXhwb3NlZCBmb3IgZWRnZS1jYXNlcyB3aGVyZSB5b3UgbWF5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luI3VwZGF0ZURpc3BsYXlPcmlnaW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZURpc3BsYXlPcmlnaW46IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheU9yaWdpblggPSB0aGlzLm9yaWdpblggKiB0aGlzLndpZHRoO1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlPcmlnaW5ZID0gdGhpcy5vcmlnaW5ZICogdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT3JpZ2luO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBEZWdUb1JhZCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRGVnVG9SYWQnKTtcclxudmFyIEdldEJvb2xlYW4gPSByZXF1aXJlKCcuLi8uLi90d2VlbnMvYnVpbGRlcnMvR2V0Qm9vbGVhbicpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIFRXRUVOX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vdHdlZW5zL3R3ZWVuL2NvbnN0Jyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBtYW5hZ2luZyBhIEdhbWUgT2JqZWN0IGZvbGxvd2luZyBhIFBhdGguXHJcbiAqIFNob3VsZCBiZSBhcHBsaWVkIGFzIGEgbWl4aW4gYW5kIG5vdCB1c2VkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlclxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqL1xyXG5cclxudmFyIFBhdGhGb2xsb3dlciA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBQYXRoIHRoaXMgUGF0aEZvbGxvd2VyIGlzIGZvbGxvd2luZy4gSXQgY2FuIG9ubHkgZm9sbG93IG9uZSBQYXRoIGF0IGEgdGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QYXRoRm9sbG93ZXIjcGF0aFxyXG4gICAgICogQHR5cGUge1BoYXNlci5DdXJ2ZXMuUGF0aH1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwYXRoOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdWxkIHRoZSBQYXRoRm9sbG93ZXIgYXV0b21hdGljYWxseSByb3RhdGUgdG8gcG9pbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgUGF0aD9cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QYXRoRm9sbG93ZXIjcm90YXRlVG9QYXRoXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcm90YXRlVG9QYXRoOiBmYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBQYXRoRm9sbG93ZXIgaXMgcm90YXRpbmcgdG8gbWF0Y2ggdGhlIFBhdGggKEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhdGhGb2xsb3dlciNyb3RhdGVUb1BhdGgpXHJcbiAgICAgKiB0aGlzIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSByb3RhdGlvbiB2YWx1ZS4gVGhpcyBhbGxvd3MgeW91IHRvIHJvdGF0ZSBvYmplY3RzIHRvIGEgcGF0aCBidXQgY29udHJvbFxyXG4gICAgICogdGhlIGFuZ2xlIG9mIHRoZSByb3RhdGlvbiBhcyB3ZWxsLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIjcGF0aFJvdGF0aW9uT2Zmc2V0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBhdGhSb3RhdGlvbk9mZnNldDogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFkZGl0aW9uYWwgdmVjdG9yIHRvIGFkZCB0byB0aGUgUGF0aEZvbGxvd2VycyBwb3NpdGlvbiwgYWxsb3dpbmcgeW91IHRvIG9mZnNldCBpdCBmcm9tIHRoZVxyXG4gICAgICogUGF0aCBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyI3BhdGhPZmZzZXRcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBhdGhPZmZzZXQ6IG51bGwsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFZlY3RvcjIgdGhhdCBzdG9yZXMgdGhlIGN1cnJlbnQgcG9pbnQgb2YgdGhlIHBhdGggdGhlIGZvbGxvd2VyIGlzIG9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIjcGF0aFZlY3RvclxyXG4gICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcGF0aFZlY3RvcjogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkaXN0YW5jZSB0aGUgZm9sbG93ZXIgaGFzIHRyYXZlbGVkIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IG9uZSwgYXQgdGhlIGxhc3QgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIjcGF0aERlbHRhXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgcGF0aERlbHRhOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFR3ZWVuIHVzZWQgZm9yIGZvbGxvd2luZyB0aGUgUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyI3BhdGhUd2VlblxyXG4gICAgICogQHR5cGUge1BoYXNlci5Ud2VlbnMuVHdlZW59XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcGF0aFR3ZWVuOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0dGluZ3MgZm9yIHRoZSBQYXRoRm9sbG93ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhdGhGb2xsb3dlciNwYXRoQ29uZmlnXHJcbiAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIuUGF0aENvbmZpZ31cclxuICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwYXRoQ29uZmlnOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjb3JkcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBmb2xsb3dlciBzbyBpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyI19wcmV2RGlyZWN0aW9uXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgX3ByZXZEaXJlY3Rpb246IFRXRUVOX0NPTlNULlBMQVlJTkdfRk9SV0FSRCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgUGF0aCB0aGF0IHRoaXMgUGF0aEZvbGxvd2VyIHNob3VsZCBmb2xsb3cuXHJcbiAgICAgKlxyXG4gICAgICogT3B0aW9uYWxseSBhY2NlcHRzIHtAbGluayBQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyLlBhdGhDb25maWd9IHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGF0aEZvbGxvd2VyI3NldFBhdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkN1cnZlcy5QYXRofSBwYXRoIC0gVGhlIFBhdGggdGhpcyBQYXRoRm9sbG93ZXIgaXMgZm9sbG93aW5nLiBJdCBjYW4gb25seSBmb2xsb3cgb25lIFBhdGggYXQgYSB0aW1lLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIuUGF0aENvbmZpZ3xQaGFzZXIuVHlwZXMuVHdlZW5zLk51bWJlclR3ZWVuQnVpbGRlckNvbmZpZyl9IFtjb25maWddIC0gU2V0dGluZ3MgZm9yIHRoZSBQYXRoRm9sbG93ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UGF0aDogZnVuY3Rpb24gKHBhdGgsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0gdGhpcy5wYXRoQ29uZmlnOyB9XHJcblxyXG4gICAgICAgIHZhciB0d2VlbiA9IHRoaXMucGF0aFR3ZWVuO1xyXG5cclxuICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4uaXNQbGF5aW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0d2Vlbi5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydEZvbGxvdyhjb25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHdoZXRoZXIgdGhlIFBhdGhGb2xsb3dlciBzaG91bGQgYXV0b21hdGljYWxseSByb3RhdGUgdG8gcG9pbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlciNzZXRSb3RhdGVUb1BhdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBXaGV0aGVyIHRoZSBQYXRoRm9sbG93ZXIgc2hvdWxkIGF1dG9tYXRpY2FsbHkgcm90YXRlIHRvIHBvaW50IGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFBhdGguXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFJvdGF0aW9uIG9mZnNldCBpbiBkZWdyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFJvdGF0ZVRvUGF0aDogZnVuY3Rpb24gKHZhbHVlLCBvZmZzZXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldCA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3RhdGVUb1BhdGggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXRoUm90YXRpb25PZmZzZXQgPSBvZmZzZXQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgUGF0aEZvbGxvd2VyIGFjdGl2ZWx5IGZvbGxvd2luZyBhIFBhdGggb3Igbm90P1xyXG4gICAgICpcclxuICAgICAqIFRvIGJlIGNvbnNpZGVyZWQgYXMgYGlzRm9sbG93aW5nYCBpdCBtdXN0IGJlIGN1cnJlbnRseSBtb3Zpbmcgb24gYSBQYXRoLCBhbmQgbm90IHBhdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlciNpc0ZvbGxvd2luZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlzIHRoaXMgUGF0aEZvbGxvd2VyIGlzIGFjdGl2ZWx5IGZvbGxvd2luZyBhIFBhdGgsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc0ZvbGxvd2luZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLnBhdGhUd2VlbjtcclxuXHJcbiAgICAgICAgcmV0dXJuICh0d2VlbiAmJiB0d2Vlbi5pc1BsYXlpbmcoKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoaXMgUGF0aEZvbGxvd2VyIGZvbGxvd2luZyBpdHMgZ2l2ZW4gUGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlciNzdGFydEZvbGxvd1xyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXRoRm9sbG93ZXIuUGF0aENvbmZpZ3xQaGFzZXIuVHlwZXMuVHdlZW5zLk51bWJlclR3ZWVuQnVpbGRlckNvbmZpZyl9IFtjb25maWc9e31dIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBmb2xsb3csIG9yIGEgUGF0aEZvbGxvd2VyIGNvbmZpZyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0QXQ9MF0gLSBPcHRpb25hbCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgZm9sbG93LCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3RhcnRGb2xsb3c6IGZ1bmN0aW9uIChjb25maWcsIHN0YXJ0QXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcbiAgICAgICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCkgeyBzdGFydEF0ID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgdHdlZW4gPSB0aGlzLnBhdGhUd2VlbjtcclxuXHJcbiAgICAgICAgaWYgKHR3ZWVuICYmIHR3ZWVuLmlzUGxheWluZygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHdlZW4uc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnID0geyBkdXJhdGlvbjogY29uZmlnIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgT3ZlcnJpZGUgaW4gY2FzZSB0aGV5J3ZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBjb25maWdcclxuICAgICAgICBjb25maWcuZnJvbSA9IEdldFZhbHVlKGNvbmZpZywgJ2Zyb20nLCAwKTtcclxuICAgICAgICBjb25maWcudG8gPSBHZXRWYWx1ZShjb25maWcsICd0bycsIDEpO1xyXG5cclxuICAgICAgICB2YXIgcG9zaXRpb25PblBhdGggPSBHZXRCb29sZWFuKGNvbmZpZywgJ3Bvc2l0aW9uT25QYXRoJywgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLnJvdGF0ZVRvUGF0aCA9IEdldEJvb2xlYW4oY29uZmlnLCAncm90YXRlVG9QYXRoJywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMucGF0aFJvdGF0aW9uT2Zmc2V0ID0gR2V0VmFsdWUoY29uZmlnLCAncm90YXRpb25PZmZzZXQnLCAwKTtcclxuXHJcbiAgICAgICAgLy8gIFRoaXMgd29ya3MsIGJ1dCBpdCdzIG5vdCBhbiBpZGVhbCB3YXkgb2YgZG9pbmcgaXQgYXMgdGhlIGZvbGxvd2VyIGp1bXBzIHBvc2l0aW9uXHJcbiAgICAgICAgdmFyIHNlZWsgPSBHZXRWYWx1ZShjb25maWcsICdzdGFydEF0Jywgc3RhcnRBdCk7XHJcblxyXG4gICAgICAgIGlmIChzZWVrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnLm9uU3RhcnQgPSBmdW5jdGlvbiAodHdlZW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0d2VlbkRhdGEgPSB0d2Vlbi5kYXRhWzBdO1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gc2VlaztcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gdHdlZW5EYXRhLmR1cmF0aW9uICogc2VlaztcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gdHdlZW5EYXRhLmVhc2UodHdlZW5EYXRhLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5jdXJyZW50ID0gdHdlZW5EYXRhLnN0YXJ0ICsgKCh0d2VlbkRhdGEuZW5kIC0gdHdlZW5EYXRhLnN0YXJ0KSAqIHYpO1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnRhcmdldFt0d2VlbkRhdGEua2V5XSA9IHR3ZWVuRGF0YS5jdXJyZW50O1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnBhdGhPZmZzZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGhPZmZzZXQgPSBuZXcgVmVjdG9yMih0aGlzLngsIHRoaXMueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMucGF0aFZlY3RvcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0aFZlY3RvciA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMucGF0aERlbHRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXRoRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXRoRGVsdGEucmVzZXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXRoVHdlZW4gPSB0aGlzLnNjZW5lLnN5cy50d2VlbnMuYWRkQ291bnRlcihjb25maWcpO1xyXG5cclxuICAgICAgICAvLyAgVGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGlzIGZvbGxvd2VyXHJcbiAgICAgICAgdGhpcy5wYXRoLmdldFN0YXJ0UG9pbnQodGhpcy5wYXRoT2Zmc2V0KTtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uT25QYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gdGhpcy5wYXRoT2Zmc2V0Lng7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHRoaXMucGF0aE9mZnNldC55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXRoT2Zmc2V0LnggPSB0aGlzLnggLSB0aGlzLnBhdGhPZmZzZXQueDtcclxuICAgICAgICB0aGlzLnBhdGhPZmZzZXQueSA9IHRoaXMueSAtIHRoaXMucGF0aE9mZnNldC55O1xyXG5cclxuICAgICAgICB0aGlzLl9wcmV2RGlyZWN0aW9uID0gVFdFRU5fQ09OU1QuUExBWUlOR19GT1JXQVJEO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yb3RhdGVUb1BhdGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2V0IHRoZSByb3RhdGlvbiBub3cgKGluIGNhc2UgdGhlIHR3ZWVuIGhhcyBhIGRlbGF5IG9uIGl0LCBldGMpXHJcbiAgICAgICAgICAgIHZhciBuZXh0UG9pbnQgPSB0aGlzLnBhdGguZ2V0UG9pbnQoMC4xKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm90YXRpb24gPSBNYXRoLmF0YW4yKG5leHRQb2ludC55IC0gdGhpcy55LCBuZXh0UG9pbnQueCAtIHRoaXMueCkgKyBEZWdUb1JhZCh0aGlzLnBhdGhSb3RhdGlvbk9mZnNldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhdGhDb25maWcgPSBjb25maWc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyB0aGlzIFBhdGhGb2xsb3dlci4gSXQgd2lsbCBzdGlsbCBjb250aW51ZSB0byByZW5kZXIsIGJ1dCBpdCB3aWxsIHJlbWFpbiBtb3Rpb25sZXNzIGF0IHRoZVxyXG4gICAgICogcG9pbnQgb24gdGhlIFBhdGggYXQgd2hpY2ggeW91IHBhdXNlZCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlciNwYXVzZUZvbGxvd1xyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGF1c2VGb2xsb3c6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHR3ZWVuID0gdGhpcy5wYXRoVHdlZW47XHJcblxyXG4gICAgICAgIGlmICh0d2VlbiAmJiB0d2Vlbi5pc1BsYXlpbmcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuLnBhdXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN1bWVzIGEgcHJldmlvdXNseSBwYXVzZWQgUGF0aEZvbGxvd2VyLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBQYXRoRm9sbG93ZXIgd2FzIG5vdCBwYXVzZWQgdGhpcyBoYXMgbm8gZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGF0aEZvbGxvd2VyI3Jlc3VtZUZvbGxvd1xyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lRm9sbG93OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0d2VlbiA9IHRoaXMucGF0aFR3ZWVuO1xyXG5cclxuICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4uaXNQYXVzZWQoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuLnJlc3VtZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhpcyBQYXRoRm9sbG93ZXIgZnJvbSBmb2xsb3dpbmcgdGhlIHBhdGggYW55IGxvbmdlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgaW52b2tlIGFueSAnc3RvcCcgY29uZGl0aW9ucyB0aGF0IG1heSBleGlzdCBvbiB0aGUgUGF0aCwgb3IgZm9yIHRoZSBmb2xsb3dlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBhdGhGb2xsb3dlciNzdG9wRm9sbG93XHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdG9wRm9sbG93OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0d2VlbiA9IHRoaXMucGF0aFR3ZWVuO1xyXG5cclxuICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4uaXNQbGF5aW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0d2Vlbi5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB1cGRhdGUgaGFuZGxlciB0aGF0IGFkdmFuY2VzIHRoaXMgUGF0aEZvbGxvd2VyIGFsb25nIHRoZSBwYXRoLlxyXG4gICAgICpcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBTY2VuZSBzdGVwLCBzaG91bGQgbm90IHR5cGljYWxseSBiZSBjYWxsZWQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QYXRoRm9sbG93ZXIjcGF0aFVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICBwYXRoVXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0d2VlbiA9IHRoaXMucGF0aFR3ZWVuO1xyXG5cclxuICAgICAgICBpZiAodHdlZW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdHdlZW5EYXRhID0gdHdlZW4uZGF0YVswXTtcclxuICAgICAgICAgICAgdmFyIHBhdGhEZWx0YSA9IHRoaXMucGF0aERlbHRhO1xyXG4gICAgICAgICAgICB2YXIgcGF0aFZlY3RvciA9IHRoaXMucGF0aFZlY3RvcjtcclxuXHJcbiAgICAgICAgICAgIHBhdGhEZWx0YS5jb3B5KHBhdGhWZWN0b3IpLm5lZ2F0ZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuQ09NUExFVEUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF0aC5nZXRQb2ludCgxLCBwYXRoVmVjdG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXRoRGVsdGEuYWRkKHBhdGhWZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgcGF0aFZlY3Rvci5hZGQodGhpcy5wYXRoT2Zmc2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHBhdGhWZWN0b3IueCwgcGF0aFZlY3Rvci55KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHdlZW5EYXRhLnN0YXRlICE9PSBUV0VFTl9DT05TVC5QTEFZSU5HX0ZPUldBUkQgJiYgdHdlZW5EYXRhLnN0YXRlICE9PSBUV0VFTl9DT05TVC5QTEFZSU5HX0JBQ0tXQVJEKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSWYgZGVsYXllZCwgZXRjIHRoZW4gYmFpbCBvdXRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXRoLmdldFBvaW50KHR3ZWVuLmdldFZhbHVlKCksIHBhdGhWZWN0b3IpO1xyXG5cclxuICAgICAgICAgICAgcGF0aERlbHRhLmFkZChwYXRoVmVjdG9yKTtcclxuICAgICAgICAgICAgcGF0aFZlY3Rvci5hZGQodGhpcy5wYXRoT2Zmc2V0KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBvbGRYID0gdGhpcy54O1xyXG4gICAgICAgICAgICB2YXIgb2xkWSA9IHRoaXMueTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocGF0aFZlY3Rvci54LCBwYXRoVmVjdG9yLnkpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNwZWVkWCA9IHRoaXMueCAtIG9sZFg7XHJcbiAgICAgICAgICAgIHZhciBzcGVlZFkgPSB0aGlzLnkgLSBvbGRZO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNwZWVkWCA9PT0gMCAmJiBzcGVlZFkgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBCYWlsIG91dCBlYXJseVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHdlZW5EYXRhLnN0YXRlICE9PSB0aGlzLl9wcmV2RGlyZWN0aW9uKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgV2UndmUgY2hhbmdlZCBkaXJlY3Rpb24sIHNvIGRvbid0IGRvIGEgcm90YXRlIHRoaXMgZnJhbWVcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZEaXJlY3Rpb24gPSB0d2VlbkRhdGEuc3RhdGU7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGVUb1BhdGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb24gPSBNYXRoLmF0YW4yKHNwZWVkWSwgc3BlZWRYKSArIERlZ1RvUmFkKHRoaXMucGF0aFJvdGF0aW9uT2Zmc2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhdGhGb2xsb3dlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBXZWJHTCByZW5kZXJpbmcgcGlwZWxpbmUgb2YgYSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAd2ViZ2xPbmx5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBQaXBlbGluZSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbml0aWFsIFdlYkdMIHBpcGVsaW5lIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmUjZGVmYXVsdFBpcGVsaW5lXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmV9XHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVmYXVsdFBpcGVsaW5lOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQgV2ViR0wgcGlwZWxpbmUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZSNwaXBlbGluZVxyXG4gICAgICogQHR5cGUge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lfVxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBpcGVsaW5lOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW5pdGlhbCBXZWJHTCBQaXBlbGluZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lI2luaXRQaXBlbGluZVxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwaXBlbGluZU5hbWU9VGV4dHVyZVRpbnRQaXBlbGluZV0gLSBUaGUgbmFtZSBvZiB0aGUgcGlwZWxpbmUgdG8gc2V0IG9uIHRoaXMgR2FtZSBPYmplY3QuIERlZmF1bHRzIHRvIHRoZSBUZXh0dXJlIFRpbnQgUGlwZWxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwaXBlbGluZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGluaXRQaXBlbGluZTogZnVuY3Rpb24gKHBpcGVsaW5lTmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAocGlwZWxpbmVOYW1lID09PSB1bmRlZmluZWQpIHsgcGlwZWxpbmVOYW1lID0gJ1RleHR1cmVUaW50UGlwZWxpbmUnOyB9XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMuc2NlbmUuc3lzLmdhbWUucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci5nbCAmJiByZW5kZXJlci5oYXNQaXBlbGluZShwaXBlbGluZU5hbWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0UGlwZWxpbmUgPSByZW5kZXJlci5nZXRQaXBlbGluZShwaXBlbGluZU5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnBpcGVsaW5lID0gdGhpcy5kZWZhdWx0UGlwZWxpbmU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhY3RpdmUgV2ViR0wgUGlwZWxpbmUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lI3NldFBpcGVsaW5lXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGlwZWxpbmVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBpcGVsaW5lIHRvIHNldCBvbiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFBpcGVsaW5lOiBmdW5jdGlvbiAocGlwZWxpbmVOYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMuc2NlbmUuc3lzLmdhbWUucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci5nbCAmJiByZW5kZXJlci5oYXNQaXBlbGluZShwaXBlbGluZU5hbWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5waXBlbGluZSA9IHJlbmRlcmVyLmdldFBpcGVsaW5lKHBpcGVsaW5lTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIFdlYkdMIFBpcGVsaW5lIG9mIHRoaXMgR2FtZSBPYmplY3QgYmFjayB0byB0aGUgZGVmYXVsdCBpdCB3YXMgY3JlYXRlZCB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmUjcmVzZXRQaXBlbGluZVxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwaXBlbGluZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0UGlwZWxpbmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5waXBlbGluZSA9IHRoaXMuZGVmYXVsdFBpcGVsaW5lO1xyXG5cclxuICAgICAgICByZXR1cm4gKHRoaXMucGlwZWxpbmUgIT09IG51bGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIFdlYkdMIFBpcGVsaW5lIHRoaXMgR2FtZSBPYmplY3QgaXMgY3VycmVudGx5IHVzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmUjZ2V0UGlwZWxpbmVOYW1lXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmctYmFzZWQgbmFtZSBvZiB0aGUgcGlwZWxpbmUgYmVpbmcgdXNlZCBieSB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRQaXBlbGluZU5hbWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlwZWxpbmUubmFtZTtcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBpcGVsaW5lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIHVzZWQgZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIFNjcm9sbCBGYWN0b3Igb2YgYSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIFNjcm9sbEZhY3RvciA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBob3Jpem9udGFsIHNjcm9sbCBmYWN0b3Igb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgc2Nyb2xsIGZhY3RvciBjb250cm9scyB0aGUgaW5mbHVlbmNlIG9mIHRoZSBtb3ZlbWVudCBvZiBhIENhbWVyYSB1cG9uIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBhIGNhbWVyYSBzY3JvbGxzIGl0IHdpbGwgY2hhbmdlIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmVkIG9uLXNjcmVlbi5cclxuICAgICAqIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgR2FtZSBPYmplY3RzIGFjdHVhbCBwb3NpdGlvbiB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQSB2YWx1ZSBvZiAxIG1lYW5zIGl0IHdpbGwgbW92ZSBleGFjdGx5IGluIHN5bmMgd2l0aCBhIGNhbWVyYS5cclxuICAgICAqIEEgdmFsdWUgb2YgMCBtZWFucyBpdCB3aWxsIG5vdCBtb3ZlIGF0IGFsbCwgZXZlbiBpZiB0aGUgY2FtZXJhIG1vdmVzLlxyXG4gICAgICogT3RoZXIgdmFsdWVzIGNvbnRyb2wgdGhlIGRlZ3JlZSB0byB3aGljaCB0aGUgY2FtZXJhIG1vdmVtZW50IGlzIG1hcHBlZCB0byB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBzY3JvbGwgZmFjdG9yIHZhbHVlcyBvdGhlciB0aGFuIDEgYXJlIG5vdCB0YWtlbiBpbiB0byBjb25zaWRlcmF0aW9uIHdoZW5cclxuICAgICAqIGNhbGN1bGF0aW5nIHBoeXNpY3MgY29sbGlzaW9ucy4gQm9kaWVzIGFsd2F5cyBjb2xsaWRlIGJhc2VkIG9uIHRoZWlyIHdvcmxkIHBvc2l0aW9uLCBidXQgY2hhbmdpbmdcclxuICAgICAqIHRoZSBzY3JvbGwgZmFjdG9yIGlzIGEgdmlzdWFsIGFkanVzdG1lbnQgdG8gd2hlcmUgdGhlIHRleHR1cmVzIGFyZSByZW5kZXJlZCwgd2hpY2ggY2FuIG9mZnNldFxyXG4gICAgICogdGhlbSBmcm9tIHBoeXNpY3MgYm9kaWVzIGlmIG5vdCBhY2NvdW50ZWQgZm9yIGluIHlvdXIgY29kZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3Ijc2Nyb2xsRmFjdG9yWFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzY3JvbGxGYWN0b3JYOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZlcnRpY2FsIHNjcm9sbCBmYWN0b3Igb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgc2Nyb2xsIGZhY3RvciBjb250cm9scyB0aGUgaW5mbHVlbmNlIG9mIHRoZSBtb3ZlbWVudCBvZiBhIENhbWVyYSB1cG9uIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBhIGNhbWVyYSBzY3JvbGxzIGl0IHdpbGwgY2hhbmdlIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmVkIG9uLXNjcmVlbi5cclxuICAgICAqIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgR2FtZSBPYmplY3RzIGFjdHVhbCBwb3NpdGlvbiB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQSB2YWx1ZSBvZiAxIG1lYW5zIGl0IHdpbGwgbW92ZSBleGFjdGx5IGluIHN5bmMgd2l0aCBhIGNhbWVyYS5cclxuICAgICAqIEEgdmFsdWUgb2YgMCBtZWFucyBpdCB3aWxsIG5vdCBtb3ZlIGF0IGFsbCwgZXZlbiBpZiB0aGUgY2FtZXJhIG1vdmVzLlxyXG4gICAgICogT3RoZXIgdmFsdWVzIGNvbnRyb2wgdGhlIGRlZ3JlZSB0byB3aGljaCB0aGUgY2FtZXJhIG1vdmVtZW50IGlzIG1hcHBlZCB0byB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBzY3JvbGwgZmFjdG9yIHZhbHVlcyBvdGhlciB0aGFuIDEgYXJlIG5vdCB0YWtlbiBpbiB0byBjb25zaWRlcmF0aW9uIHdoZW5cclxuICAgICAqIGNhbGN1bGF0aW5nIHBoeXNpY3MgY29sbGlzaW9ucy4gQm9kaWVzIGFsd2F5cyBjb2xsaWRlIGJhc2VkIG9uIHRoZWlyIHdvcmxkIHBvc2l0aW9uLCBidXQgY2hhbmdpbmdcclxuICAgICAqIHRoZSBzY3JvbGwgZmFjdG9yIGlzIGEgdmlzdWFsIGFkanVzdG1lbnQgdG8gd2hlcmUgdGhlIHRleHR1cmVzIGFyZSByZW5kZXJlZCwgd2hpY2ggY2FuIG9mZnNldFxyXG4gICAgICogdGhlbSBmcm9tIHBoeXNpY3MgYm9kaWVzIGlmIG5vdCBhY2NvdW50ZWQgZm9yIGluIHlvdXIgY29kZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3Ijc2Nyb2xsRmFjdG9yWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzY3JvbGxGYWN0b3JZOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2Nyb2xsIGZhY3RvciBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBzY3JvbGwgZmFjdG9yIGNvbnRyb2xzIHRoZSBpbmZsdWVuY2Ugb2YgdGhlIG1vdmVtZW50IG9mIGEgQ2FtZXJhIHVwb24gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBXaGVuIGEgY2FtZXJhIHNjcm9sbHMgaXQgd2lsbCBjaGFuZ2UgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQgb24tc2NyZWVuLlxyXG4gICAgICogSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBHYW1lIE9iamVjdHMgYWN0dWFsIHBvc2l0aW9uIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBBIHZhbHVlIG9mIDEgbWVhbnMgaXQgd2lsbCBtb3ZlIGV4YWN0bHkgaW4gc3luYyB3aXRoIGEgY2FtZXJhLlxyXG4gICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIGl0IHdpbGwgbm90IG1vdmUgYXQgYWxsLCBldmVuIGlmIHRoZSBjYW1lcmEgbW92ZXMuXHJcbiAgICAgKiBPdGhlciB2YWx1ZXMgY29udHJvbCB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZSBjYW1lcmEgbW92ZW1lbnQgaXMgbWFwcGVkIHRvIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHNjcm9sbCBmYWN0b3IgdmFsdWVzIG90aGVyIHRoYW4gMSBhcmUgbm90IHRha2VuIGluIHRvIGNvbnNpZGVyYXRpb24gd2hlblxyXG4gICAgICogY2FsY3VsYXRpbmcgcGh5c2ljcyBjb2xsaXNpb25zLiBCb2RpZXMgYWx3YXlzIGNvbGxpZGUgYmFzZWQgb24gdGhlaXIgd29ybGQgcG9zaXRpb24sIGJ1dCBjaGFuZ2luZ1xyXG4gICAgICogdGhlIHNjcm9sbCBmYWN0b3IgaXMgYSB2aXN1YWwgYWRqdXN0bWVudCB0byB3aGVyZSB0aGUgdGV4dHVyZXMgYXJlIHJlbmRlcmVkLCB3aGljaCBjYW4gb2Zmc2V0XHJcbiAgICAgKiB0aGVtIGZyb20gcGh5c2ljcyBib2RpZXMgaWYgbm90IGFjY291bnRlZCBmb3IgaW4geW91ciBjb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yI3NldFNjcm9sbEZhY3RvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgZmFjdG9yIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgc2Nyb2xsIGZhY3RvciBvZiB0aGlzIEdhbWUgT2JqZWN0LiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHRoZSBgeGAgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2Nyb2xsRmFjdG9yOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWCA9IHg7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxGYWN0b3JZID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY3JvbGxGYWN0b3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgc2l6ZSBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBTaXplID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYSBHYW1lIE9iamVjdCBoYXMgdGhpcyBjb21wb25lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNpemUjX3NpemVDb21wb25lbnRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICovXHJcbiAgICBfc2l6ZUNvbXBvbmVudDogdHJ1ZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYXRpdmUgKHVuLXNjYWxlZCkgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQ2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNpemUgdGhhdCB0aGUgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQgaW4tZ2FtZS5cclxuICAgICAqIEZvciB0aGF0IHlvdSBuZWVkIHRvIGVpdGhlciBzZXQgdGhlIHNjYWxlIG9mIHRoZSBHYW1lIE9iamVjdCAoYHNldFNjYWxlYCkgb3IgdXNlXHJcbiAgICAgKiB0aGUgYGRpc3BsYXlXaWR0aGAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNpemUjd2lkdGhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgd2lkdGg6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmF0aXZlICh1bi1zY2FsZWQpIGhlaWdodCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBDaGFuZ2luZyB0aGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB0aGUgc2l6ZSB0aGF0IHRoZSBHYW1lIE9iamVjdCBpcyByZW5kZXJlZCBpbi1nYW1lLlxyXG4gICAgICogRm9yIHRoYXQgeW91IG5lZWQgdG8gZWl0aGVyIHNldCB0aGUgc2NhbGUgb2YgdGhlIEdhbWUgT2JqZWN0IChgc2V0U2NhbGVgKSBvciB1c2VcclxuICAgICAqIHRoZSBgZGlzcGxheUhlaWdodGAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNpemUjaGVpZ2h0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGhlaWdodDogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkaXNwbGF5ZWQgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB2YWx1ZSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNjYWxlIGZhY3Rvci5cclxuICAgICAqIFxyXG4gICAgICogU2V0dGluZyB0aGlzIHZhbHVlIHdpbGwgYWRqdXN0IHRoZSBHYW1lIE9iamVjdCdzIHNjYWxlIHByb3BlcnR5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplI2Rpc3BsYXlXaWR0aFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5V2lkdGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuc2NhbGVYICogdGhpcy5mcmFtZS5yZWFsV2lkdGgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY2FsZVggPSB2YWx1ZSAvIHRoaXMuZnJhbWUucmVhbFdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpc3BsYXllZCBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB2YWx1ZSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNjYWxlIGZhY3Rvci5cclxuICAgICAqIFxyXG4gICAgICogU2V0dGluZyB0aGlzIHZhbHVlIHdpbGwgYWRqdXN0IHRoZSBHYW1lIE9iamVjdCdzIHNjYWxlIHByb3BlcnR5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplI2Rpc3BsYXlIZWlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGlzcGxheUhlaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnModGhpcy5zY2FsZVkgKiB0aGlzLmZyYW1lLnJlYWxIZWlnaHQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSB2YWx1ZSAvIHRoaXMuZnJhbWUucmVhbEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBHYW1lIE9iamVjdCB0byBiZSB0aGF0IG9mIHRoZSBnaXZlbiBGcmFtZS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNpemUgdGhhdCB0aGUgR2FtZSBPYmplY3QgaXMgcmVuZGVyZWQgaW4tZ2FtZS5cclxuICAgICAqIEZvciB0aGF0IHlvdSBuZWVkIHRvIGVpdGhlciBzZXQgdGhlIHNjYWxlIG9mIHRoZSBHYW1lIE9iamVjdCAoYHNldFNjYWxlYCkgb3IgY2FsbCB0aGVcclxuICAgICAqIGBzZXREaXNwbGF5U2l6ZWAgbWV0aG9kLCB3aGljaCBpcyB0aGUgc2FtZSB0aGluZyBhcyBjaGFuZ2luZyB0aGUgc2NhbGUgYnV0IGFsbG93cyB5b3VcclxuICAgICAqIHRvIGRvIHNvIGJ5IGdpdmluZyBwaXhlbCB2YWx1ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhpcyBHYW1lIE9iamVjdCBmb3IgaW5wdXQsIGNoYW5naW5nIHRoZSBzaXplIHdpbGwgX25vdF8gY2hhbmdlIHRoZVxyXG4gICAgICogc2l6ZSBvZiB0aGUgaGl0IGFyZWEuIFRvIGRvIHRoaXMgeW91IHNob3VsZCBhZGp1c3QgdGhlIGBpbnB1dC5oaXRBcmVhYCBvYmplY3QgZGlyZWN0bHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZSNzZXRTaXplVG9GcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuRnJhbWV9IGZyYW1lIC0gVGhlIGZyYW1lIHRvIGJhc2UgdGhlIHNpemUgb2YgdGhpcyBHYW1lIE9iamVjdCBvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZVRvRnJhbWU6IGZ1bmN0aW9uIChmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZnJhbWUgPT09IHVuZGVmaW5lZCkgeyBmcmFtZSA9IHRoaXMuZnJhbWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IGZyYW1lLnJlYWxXaWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGZyYW1lLnJlYWxIZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGludGVybmFsIHNpemUgb2YgdGhpcyBHYW1lIE9iamVjdCwgYXMgdXNlZCBmb3IgZnJhbWUgb3IgcGh5c2ljcyBib2R5IGNyZWF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgc2l6ZSB0aGF0IHRoZSBHYW1lIE9iamVjdCBpcyByZW5kZXJlZCBpbi1nYW1lLlxyXG4gICAgICogRm9yIHRoYXQgeW91IG5lZWQgdG8gZWl0aGVyIHNldCB0aGUgc2NhbGUgb2YgdGhlIEdhbWUgT2JqZWN0IChgc2V0U2NhbGVgKSBvciBjYWxsIHRoZVxyXG4gICAgICogYHNldERpc3BsYXlTaXplYCBtZXRob2QsIHdoaWNoIGlzIHRoZSBzYW1lIHRoaW5nIGFzIGNoYW5naW5nIHRoZSBzY2FsZSBidXQgYWxsb3dzIHlvdVxyXG4gICAgICogdG8gZG8gc28gYnkgZ2l2aW5nIHBpeGVsIHZhbHVlcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGhhdmUgZW5hYmxlZCB0aGlzIEdhbWUgT2JqZWN0IGZvciBpbnB1dCwgY2hhbmdpbmcgdGhlIHNpemUgd2lsbCBfbm90XyBjaGFuZ2UgdGhlXHJcbiAgICAgKiBzaXplIG9mIHRoZSBoaXQgYXJlYS4gVG8gZG8gdGhpcyB5b3Ugc2hvdWxkIGFkanVzdCB0aGUgYGlucHV0LmhpdEFyZWFgIG9iamVjdCBkaXJlY3RseS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplI3NldFNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkaXNwbGF5IHNpemUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIHdpbGwgYWRqdXN0IHRoZSBzY2FsZS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplI3NldERpc3BsYXlTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldERpc3BsYXlTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTaXplO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBiaXRtYXNrIGZsYWcgZm9yIEdhbWVPYmplY3QucmVuZGVyTWFza1xyXG52YXIgX0ZMQUcgPSA4OyAvLyAxMDAwXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSB0ZXh0dXJlIG9mIGEgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgVGV4dHVyZSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgdXNpbmcgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZSN0ZXh0dXJlXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV8UGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmV9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdGV4dHVyZTogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBUZXh0dXJlIEZyYW1lIHRoaXMgR2FtZSBPYmplY3QgaXMgdXNpbmcgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZSNmcmFtZVxyXG4gICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5GcmFtZX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBmcmFtZTogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGZsYWcuIE5vdCB0byBiZSBzZXQgYnkgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlI2lzQ3JvcHBlZFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBpc0Nyb3BwZWQ6IGZhbHNlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSBhbmQgZnJhbWUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBUZXh0dXJlcyBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBzdHJpbmctYmFzZWQga2V5cywgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlI3NldFRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSl9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHRleHR1cmUgdG8gYmUgdXNlZCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIsIG9yIGEgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBuYW1lIG9yIGluZGV4IG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGV4dHVyZTogZnVuY3Rpb24gKGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEZyYW1lKGZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmFtZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBGcmFtZSBoYXMgdG8gYmVsb25nIHRvIHRoZSBjdXJyZW50IFRleHR1cmUgYmVpbmcgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIENhbGxpbmcgYHNldEZyYW1lYCB3aWxsIG1vZGlmeSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyBvZiB5b3VyIEdhbWUgT2JqZWN0LlxyXG4gICAgICogSXQgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYG9yaWdpbmAgaWYgdGhlIEZyYW1lIGhhcyBhIGN1c3RvbSBwaXZvdCBwb2ludCwgYXMgZXhwb3J0ZWQgZnJvbSBwYWNrYWdlcyBsaWtlIFRleHR1cmUgUGFja2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZSNzZXRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBmcmFtZSAtIFRoZSBuYW1lIG9yIGluZGV4IG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVTaXplPXRydWVdIC0gU2hvdWxkIHRoaXMgY2FsbCBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIEdhbWUgT2JqZWN0P1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlT3JpZ2luPXRydWVdIC0gU2hvdWxkIHRoaXMgY2FsbCBhZGp1c3QgdGhlIG9yaWdpbiBvZiB0aGUgR2FtZSBPYmplY3Q/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RnJhbWU6IGZ1bmN0aW9uIChmcmFtZSwgdXBkYXRlU2l6ZSwgdXBkYXRlT3JpZ2luKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh1cGRhdGVTaXplID09PSB1bmRlZmluZWQpIHsgdXBkYXRlU2l6ZSA9IHRydWU7IH1cclxuICAgICAgICBpZiAodXBkYXRlT3JpZ2luID09PSB1bmRlZmluZWQpIHsgdXBkYXRlT3JpZ2luID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy50ZXh0dXJlLmdldChmcmFtZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5mcmFtZS5jdXRXaWR0aCB8fCAhdGhpcy5mcmFtZS5jdXRIZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzICY9IH5fRkxBRztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zaXplQ29tcG9uZW50ICYmIHVwZGF0ZVNpemUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpemVUb0ZyYW1lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3JpZ2luQ29tcG9uZW50ICYmIHVwZGF0ZU9yaWdpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZyYW1lLmN1c3RvbVBpdm90KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE9yaWdpbih0aGlzLmZyYW1lLnBpdm90WCwgdGhpcy5mcmFtZS5waXZvdFkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGV4dHVyZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgYml0bWFzayBmbGFnIGZvciBHYW1lT2JqZWN0LnJlbmRlck1hc2tcclxudmFyIF9GTEFHID0gODsgLy8gMTAwMFxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgdGV4dHVyZSBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVDcm9wXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBUZXh0dXJlQ3JvcCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgdXNpbmcgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZUNyb3AjdGV4dHVyZVxyXG4gICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRleHR1cmU6IG51bGwsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVGV4dHVyZSBGcmFtZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHVzaW5nIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVDcm9wI2ZyYW1lXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGZyYW1lOiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIEdhbWUgT2JqZWN0IGlzIGJlaW5nIGNyb3BwZWQgb3Igbm90LlxyXG4gICAgICogWW91IGNhbiB0b2dnbGUgdGhpcyBhdCBhbnkgdGltZSBhZnRlciBgc2V0Q3JvcGAgaGFzIGJlZW4gY2FsbGVkLCB0byB0dXJuIGNyb3BwaW5nIG9uIG9yIG9mZi5cclxuICAgICAqIEVxdWFsbHksIGNhbGxpbmcgYHNldENyb3BgIHdpdGggbm8gYXJndW1lbnRzIHdpbGwgcmVzZXQgdGhlIGNyb3AgYW5kIGRpc2FibGUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZUNyb3AjaXNDcm9wcGVkXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgaXNDcm9wcGVkOiBmYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgYSBjcm9wIHRvIGEgdGV4dHVyZSBiYXNlZCBHYW1lIE9iamVjdCwgc3VjaCBhcyBhIFNwcml0ZSBvciBJbWFnZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGNyb3AgaXMgYSByZWN0YW5nbGUgdGhhdCBsaW1pdHMgdGhlIGFyZWEgb2YgdGhlIHRleHR1cmUgZnJhbWUgdGhhdCBpcyB2aXNpYmxlIGR1cmluZyByZW5kZXJpbmcuXHJcbiAgICAgKiBcclxuICAgICAqIENyb3BwaW5nIGEgR2FtZSBPYmplY3QgZG9lcyBub3QgY2hhbmdlIGl0cyBzaXplLCBkaW1lbnNpb25zLCBwaHlzaWNzIGJvZHkgb3IgaGl0IGFyZWEsIGl0IGp1c3RcclxuICAgICAqIGNoYW5nZXMgd2hhdCBpcyBzaG93biB3aGVuIHJlbmRlcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgY3JvcCBjb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHRleHR1cmUgZnJhbWUsIG5vdCB0aGUgR2FtZSBPYmplY3QsIG1lYW5pbmcgMCB4IDAgaXMgdGhlIHRvcC1sZWZ0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGVyZWZvcmUsIGlmIHlvdSBoYWQgYSBHYW1lIE9iamVjdCB0aGF0IGhhZCBhbiA4MDB4NjAwIHNpemVkIHRleHR1cmUsIGFuZCB5b3Ugd2FudGVkIHRvIHNob3cgb25seSB0aGUgbGVmdFxyXG4gICAgICogaGFsZiBvZiBpdCwgeW91IGNvdWxkIGNhbGwgYHNldENyb3AoMCwgMCwgNDAwLCA2MDApYC5cclxuICAgICAqIFxyXG4gICAgICogSXQgaXMgYWxzbyBzY2FsZWQgdG8gbWF0Y2ggdGhlIEdhbWUgT2JqZWN0IHNjYWxlIGF1dG9tYXRpY2FsbHkuIFRoZXJlZm9yZSBhIGNyb3AgcmVjdCBvZiAxMDB4NTAgd291bGQgY3JvcFxyXG4gICAgICogYW4gYXJlYSBvZiAyMDB4MTAwIHdoZW4gYXBwbGllZCB0byBhIEdhbWUgT2JqZWN0IHRoYXQgaGFkIGEgc2NhbGUgZmFjdG9yIG9mIDIuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gZWl0aGVyIHBhc3MgaW4gbnVtZXJpYyB2YWx1ZXMgZGlyZWN0bHksIG9yIHlvdSBjYW4gcHJvdmlkZSBhIHNpbmdsZSBSZWN0YW5nbGUgb2JqZWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudC5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbCB0aGlzIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyBhdCBhbGwgdG8gcmVzZXQgdGhlIGNyb3AsIG9yIHRvZ2dsZSB0aGUgcHJvcGVydHkgYGlzQ3JvcHBlZGAgdG8gYGZhbHNlYC5cclxuICAgICAqIFxyXG4gICAgICogWW91IHNob3VsZCBkbyB0aGlzIGlmIHRoZSBjcm9wIHJlY3RhbmdsZSBiZWNvbWVzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGZyYW1lIGl0c2VsZiwgYXMgaXQgd2lsbCBhbGxvd1xyXG4gICAgICogdGhlIHJlbmRlcmVyIHRvIHNraXAgc2V2ZXJhbCBpbnRlcm5hbCBjYWxjdWxhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlQ3JvcCNzZXRDcm9wXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfFBoYXNlci5HZW9tLlJlY3RhbmdsZSl9IFt4XSAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gc3RhcnQgdGhlIGNyb3AgZnJvbS4gT3IgYSBQaGFzZXIuR2VvbS5SZWN0YW5nbGUgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIGlnbm9yZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgY29vcmRpbmF0ZSB0byBzdGFydCB0aGUgY3JvcCBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGNyb3AgcmVjdGFuZ2xlIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGNyb3AgcmVjdGFuZ2xlIGluIHBpeGVscy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDcm9wOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc0Nyb3BwZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5mcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0Q3JvcFVWcyh0aGlzLl9jcm9wLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmZsaXBYLCB0aGlzLmZsaXBZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciByZWN0ID0geDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lLnNldENyb3BVVnModGhpcy5fY3JvcCwgcmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCB0aGlzLmZsaXBYLCB0aGlzLmZsaXBZKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0Nyb3BwZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSBhbmQgZnJhbWUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBUZXh0dXJlcyBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBzdHJpbmctYmFzZWQga2V5cywgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlQ3JvcCNzZXRUZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgdGV4dHVyZSB0byBiZSB1c2VkLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBuYW1lIG9yIGluZGV4IG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGV4dHVyZTogZnVuY3Rpb24gKGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEZyYW1lKGZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmFtZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBGcmFtZSBoYXMgdG8gYmVsb25nIHRvIHRoZSBjdXJyZW50IFRleHR1cmUgYmVpbmcgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIENhbGxpbmcgYHNldEZyYW1lYCB3aWxsIG1vZGlmeSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyBvZiB5b3VyIEdhbWUgT2JqZWN0LlxyXG4gICAgICogSXQgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYG9yaWdpbmAgaWYgdGhlIEZyYW1lIGhhcyBhIGN1c3RvbSBwaXZvdCBwb2ludCwgYXMgZXhwb3J0ZWQgZnJvbSBwYWNrYWdlcyBsaWtlIFRleHR1cmUgUGFja2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZUNyb3Ajc2V0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gZnJhbWUgLSBUaGUgbmFtZSBvciBpbmRleCBvZiB0aGUgZnJhbWUgd2l0aGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlU2l6ZT10cnVlXSAtIFNob3VsZCB0aGlzIGNhbGwgYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBHYW1lIE9iamVjdD9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZU9yaWdpbj10cnVlXSAtIFNob3VsZCB0aGlzIGNhbGwgYWRqdXN0IHRoZSBvcmlnaW4gb2YgdGhlIEdhbWUgT2JqZWN0P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZyYW1lOiBmdW5jdGlvbiAoZnJhbWUsIHVwZGF0ZVNpemUsIHVwZGF0ZU9yaWdpbilcclxuICAgIHtcclxuICAgICAgICBpZiAodXBkYXRlU2l6ZSA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZVNpemUgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHVwZGF0ZU9yaWdpbiA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZU9yaWdpbiA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5mcmFtZSA9IHRoaXMudGV4dHVyZS5nZXQoZnJhbWUpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZnJhbWUuY3V0V2lkdGggfHwgIXRoaXMuZnJhbWUuY3V0SGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+X0ZMQUc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD0gX0ZMQUc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2l6ZUNvbXBvbmVudCAmJiB1cGRhdGVTaXplKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTaXplVG9GcmFtZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29yaWdpbkNvbXBvbmVudCAmJiB1cGRhdGVPcmlnaW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mcmFtZS5jdXN0b21QaXZvdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW4odGhpcy5mcmFtZS5waXZvdFgsIHRoaXMuZnJhbWUucGl2b3RZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Nyb3BwZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLnVwZGF0ZUNyb3BVVnModGhpcy5fY3JvcCwgdGhpcy5mbGlwWCwgdGhpcy5mbGlwWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCByZXR1cm5zIGEgYmxhbmssIHdlbGwtZm9ybWVkIGNyb3Agb2JqZWN0IGZvciB1c2UgYnkgYSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVDcm9wI3Jlc2V0Q3JvcE9iamVjdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgY3JvcCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Q3JvcE9iamVjdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4geyB1MDogMCwgdjA6IDAsIHUxOiAwLCB2MTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCwgeDogMCwgeTogMCwgZmxpcFg6IGZhbHNlLCBmbGlwWTogZmFsc2UsIGN4OiAwLCBjeTogMCwgY3c6IDAsIGNoOiAwIH07XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUZXh0dXJlQ3JvcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uIEdldENvbG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxudmFyIEdldENvbG9yID0gZnVuY3Rpb24gKHZhbHVlKVxyXG57XHJcbiAgICByZXR1cm4gKHZhbHVlID4+IDE2KSArICh2YWx1ZSAmIDB4ZmYwMCkgKyAoKHZhbHVlICYgMHhmZikgPDwgMTYpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgdGludCBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICogXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAd2ViZ2xPbmx5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBUaW50ID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIHRvcC1sZWZ0IHRpbnQgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnQjX3RpbnRUTFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZGVmYXVsdCAxNjc3NzIxNVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF90aW50VEw6IDE2Nzc3MjE1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIHRvcC1yaWdodCB0aW50IHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I190aW50VFJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMTY3NzcyMTVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfdGludFRSOiAxNjc3NzIxNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuIEhvbGRzIHRoZSBib3R0b20tbGVmdCB0aW50IHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I190aW50QkxcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMTY3NzcyMTVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfdGludEJMOiAxNjc3NzIxNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuIEhvbGRzIHRoZSBib3R0b20tcmlnaHQgdGludCB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludCNfdGludEJSXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDE2Nzc3MjE1XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgX3RpbnRCUjogMTY3NzcyMTUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyBpZiB0aGUgR2FtZSBPYmplY3QgaXMgdGludGVkIG9yIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludCNfaXNUaW50ZWRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIF9pc1RpbnRlZDogZmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIG9yIGFkZGl0aXZlP1xyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I3RpbnRGaWxsXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIHRpbnRGaWxsOiBmYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBhbGwgdGludCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEltbWVkaWF0ZWx5IHNldHMgdGhlIGNvbG9yIHZhbHVlcyBiYWNrIHRvIDB4ZmZmZmZmIGFuZCB0aGUgdGludCB0eXBlIHRvICdhZGRpdGl2ZScsXHJcbiAgICAgKiB3aGljaCByZXN1bHRzIGluIG5vIHZpc2libGUgY2hhbmdlIHRvIHRoZSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludCNjbGVhclRpbnRcclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjbGVhclRpbnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRUaW50KDB4ZmZmZmZmKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNUaW50ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhbiBhZGRpdGl2ZSB0aW50IG9uIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB0aW50IHdvcmtzIGJ5IHRha2luZyB0aGUgcGl4ZWwgY29sb3IgdmFsdWVzIGZyb20gdGhlIEdhbWUgT2JqZWN0cyB0ZXh0dXJlLCBhbmQgdGhlblxyXG4gICAgICogbXVsdGlwbHlpbmcgaXQgYnkgdGhlIGNvbG9yIHZhbHVlIG9mIHRoZSB0aW50LiBZb3UgY2FuIHByb3ZpZGUgZWl0aGVyIG9uZSBjb2xvciB2YWx1ZSxcclxuICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIHdob2xlIEdhbWUgT2JqZWN0IHdpbGwgYmUgdGludGVkIGluIHRoYXQgY29sb3IuIE9yIHlvdSBjYW4gcHJvdmlkZSBhIGNvbG9yXHJcbiAgICAgKiBwZXIgY29ybmVyLiBUaGUgY29sb3JzIGFyZSBibGVuZGVkIHRvZ2V0aGVyIGFjcm9zcyB0aGUgZXh0ZW50IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVG8gbW9kaWZ5IHRoZSB0aW50IGNvbG9yIG9uY2Ugc2V0LCBlaXRoZXIgY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiB3aXRoIG5ldyB2YWx1ZXMgb3IgdXNlIHRoZVxyXG4gICAgICogYHRpbnRgIHByb3BlcnR5IHRvIHNldCBhbGwgY29sb3JzIGF0IG9uY2UuIE9yLCB1c2UgdGhlIHByb3BlcnRpZXMgYHRpbnRUb3BMZWZ0YCwgYHRpbnRUb3BSaWdodCxcclxuICAgICAqIGB0aW50Qm90dG9tTGVmdGAgYW5kIGB0aW50Qm90dG9tUmlnaHRgIHRvIHNldCB0aGUgY29ybmVyIGNvbG9yIHZhbHVlcyBpbmRlcGVuZGVudGx5LlxyXG4gICAgICogXHJcbiAgICAgKiBUbyByZW1vdmUgYSB0aW50IGNhbGwgYGNsZWFyVGludGAuXHJcbiAgICAgKiBcclxuICAgICAqIFRvIHN3YXAgdGhpcyBmcm9tIGJlaW5nIGFuIGFkZGl0aXZlIHRpbnQgdG8gYSBmaWxsIGJhc2VkIHRpbnQgc2V0IHRoZSBwcm9wZXJ0eSBgdGludEZpbGxgIHRvIGB0cnVlYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnQjc2V0VGludFxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdG9wTGVmdD0weGZmZmZmZl0gLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuIElmIG5vIG90aGVyIHZhbHVlcyBhcmUgZ2l2ZW4gdGhpcyB2YWx1ZSBpcyBhcHBsaWVkIGV2ZW5seSwgdGludGluZyB0aGUgd2hvbGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0b3BSaWdodF0gLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSB0b3AtcmlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbYm90dG9tTGVmdF0gLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtib3R0b21SaWdodF0gLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSBib3R0b20tcmlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRUaW50OiBmdW5jdGlvbiAodG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0b3BMZWZ0ID09PSB1bmRlZmluZWQpIHsgdG9wTGVmdCA9IDB4ZmZmZmZmOyB9XHJcblxyXG4gICAgICAgIGlmICh0b3BSaWdodCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdG9wUmlnaHQgPSB0b3BMZWZ0O1xyXG4gICAgICAgICAgICBib3R0b21MZWZ0ID0gdG9wTGVmdDtcclxuICAgICAgICAgICAgYm90dG9tUmlnaHQgPSB0b3BMZWZ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGludFRMID0gR2V0Q29sb3IodG9wTGVmdCk7XHJcbiAgICAgICAgdGhpcy5fdGludFRSID0gR2V0Q29sb3IodG9wUmlnaHQpO1xyXG4gICAgICAgIHRoaXMuX3RpbnRCTCA9IEdldENvbG9yKGJvdHRvbUxlZnQpO1xyXG4gICAgICAgIHRoaXMuX3RpbnRCUiA9IEdldENvbG9yKGJvdHRvbVJpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNUaW50ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnRpbnRGaWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBmaWxsLWJhc2VkIHRpbnQgb24gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVW5saWtlIGFuIGFkZGl0aXZlIHRpbnQsIGEgZmlsbC10aW50IGxpdGVyYWxseSByZXBsYWNlcyB0aGUgcGl4ZWwgY29sb3JzIGZyb20gdGhlIHRleHR1cmVcclxuICAgICAqIHdpdGggdGhvc2UgaW4gdGhlIHRpbnQuIFlvdSBjYW4gdXNlIHRoaXMgZm9yIGVmZmVjdHMgc3VjaCBhcyBtYWtpbmcgYSBwbGF5ZXIgZmxhc2ggJ3doaXRlJ1xyXG4gICAgICogaWYgaGl0IGJ5IHNvbWV0aGluZy4gWW91IGNhbiBwcm92aWRlIGVpdGhlciBvbmUgY29sb3IgdmFsdWUsIGluIHdoaWNoIGNhc2UgdGhlIHdob2xlXHJcbiAgICAgKiBHYW1lIE9iamVjdCB3aWxsIGJlIHJlbmRlcmVkIGluIHRoYXQgY29sb3IuIE9yIHlvdSBjYW4gcHJvdmlkZSBhIGNvbG9yIHBlciBjb3JuZXIuIFRoZSBjb2xvcnNcclxuICAgICAqIGFyZSBibGVuZGVkIHRvZ2V0aGVyIGFjcm9zcyB0aGUgZXh0ZW50IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVG8gbW9kaWZ5IHRoZSB0aW50IGNvbG9yIG9uY2Ugc2V0LCBlaXRoZXIgY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiB3aXRoIG5ldyB2YWx1ZXMgb3IgdXNlIHRoZVxyXG4gICAgICogYHRpbnRgIHByb3BlcnR5IHRvIHNldCBhbGwgY29sb3JzIGF0IG9uY2UuIE9yLCB1c2UgdGhlIHByb3BlcnRpZXMgYHRpbnRUb3BMZWZ0YCwgYHRpbnRUb3BSaWdodCxcclxuICAgICAqIGB0aW50Qm90dG9tTGVmdGAgYW5kIGB0aW50Qm90dG9tUmlnaHRgIHRvIHNldCB0aGUgY29ybmVyIGNvbG9yIHZhbHVlcyBpbmRlcGVuZGVudGx5LlxyXG4gICAgICogXHJcbiAgICAgKiBUbyByZW1vdmUgYSB0aW50IGNhbGwgYGNsZWFyVGludGAuXHJcbiAgICAgKiBcclxuICAgICAqIFRvIHN3YXAgdGhpcyBmcm9tIGJlaW5nIGEgZmlsbC10aW50IHRvIGFuIGFkZGl0aXZlIHRpbnQgc2V0IHRoZSBwcm9wZXJ0eSBgdGludEZpbGxgIHRvIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I3NldFRpbnRGaWxsXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdG9wTGVmdD0weGZmZmZmZl0gLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuIElmIG5vdCBvdGhlciB2YWx1ZXMgYXJlIGdpdmVuIHRoaXMgdmFsdWUgaXMgYXBwbGllZCBldmVubHksIHRpbnRpbmcgdGhlIHdob2xlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdG9wUmlnaHRdIC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JvdHRvbUxlZnRdIC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgYm90dG9tLWxlZnQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbYm90dG9tUmlnaHRdIC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgYm90dG9tLXJpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGludEZpbGw6IGZ1bmN0aW9uICh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRUaW50KHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMudGludEZpbGwgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGludCB2YWx1ZSBiZWluZyBhcHBsaWVkIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIGludGVycG9sYXRlZCBmcm9tIHRoZSBjb3JuZXIgdG8gdGhlIGNlbnRlciBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnQjdGludFRvcExlZnRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHdlYmdsT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbnRUb3BMZWZ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aW50VEw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW50VEwgPSBHZXRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzVGludGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aW50IHZhbHVlIGJlaW5nIGFwcGxpZWQgdG8gdGhlIHRvcC1yaWdodCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIGludGVycG9sYXRlZCBmcm9tIHRoZSBjb3JuZXIgdG8gdGhlIGNlbnRlciBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnQjdGludFRvcFJpZ2h0XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0aW50VG9wUmlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbnRUUjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbnRUUiA9IEdldENvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5faXNUaW50ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpbnQgdmFsdWUgYmVpbmcgYXBwbGllZCB0byB0aGUgYm90dG9tLWxlZnQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhpcyB2YWx1ZSBpcyBpbnRlcnBvbGF0ZWQgZnJvbSB0aGUgY29ybmVyIHRvIHRoZSBjZW50ZXIgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I3RpbnRCb3R0b21MZWZ0XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0aW50Qm90dG9tTGVmdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGludEJMO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGludEJMID0gR2V0Q29sb3IodmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9pc1RpbnRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGludCB2YWx1ZSBiZWluZyBhcHBsaWVkIHRvIHRoZSBib3R0b20tcmlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhpcyB2YWx1ZSBpcyBpbnRlcnBvbGF0ZWQgZnJvbSB0aGUgY29ybmVyIHRvIHRoZSBjZW50ZXIgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I3RpbnRCb3R0b21SaWdodFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdGludEJvdHRvbVJpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aW50QlI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW50QlIgPSBHZXRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzVGludGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aW50IHZhbHVlIGJlaW5nIGFwcGxpZWQgdG8gdGhlIHdob2xlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYSBzZXR0ZXItb25seS4gVXNlIHRoZSBwcm9wZXJ0aWVzIGB0aW50VG9wTGVmdGAgZXRjIHRvIHJlYWQgdGhlIGN1cnJlbnQgdGludCB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludCN0aW50XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0aW50OiB7XHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUaW50KHZhbHVlLCB2YWx1ZSwgdmFsdWUsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRG9lcyB0aGlzIEdhbWUgT2JqZWN0IGhhdmUgYSB0aW50IGFwcGxpZWQgdG8gaXQgb3Igbm90P1xyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50I2lzVGludGVkXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBpc1RpbnRlZDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNUaW50ZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGV4dGVuZGVkIGZ1cnRoZXIgYnkgR2FtZSBPYmplY3Qgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRvSlNPTlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBleHBvcnQgYXMgSlNPTi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkpTT05HYW1lT2JqZWN0fSBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIFRvSlNPTiA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG57XHJcbiAgICB2YXIgb3V0ID0ge1xyXG4gICAgICAgIG5hbWU6IGdhbWVPYmplY3QubmFtZSxcclxuICAgICAgICB0eXBlOiBnYW1lT2JqZWN0LnR5cGUsXHJcbiAgICAgICAgeDogZ2FtZU9iamVjdC54LFxyXG4gICAgICAgIHk6IGdhbWVPYmplY3QueSxcclxuICAgICAgICBkZXB0aDogZ2FtZU9iamVjdC5kZXB0aCxcclxuICAgICAgICBzY2FsZToge1xyXG4gICAgICAgICAgICB4OiBnYW1lT2JqZWN0LnNjYWxlWCxcclxuICAgICAgICAgICAgeTogZ2FtZU9iamVjdC5zY2FsZVlcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9yaWdpbjoge1xyXG4gICAgICAgICAgICB4OiBnYW1lT2JqZWN0Lm9yaWdpblgsXHJcbiAgICAgICAgICAgIHk6IGdhbWVPYmplY3Qub3JpZ2luWVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmxpcFg6IGdhbWVPYmplY3QuZmxpcFgsXHJcbiAgICAgICAgZmxpcFk6IGdhbWVPYmplY3QuZmxpcFksXHJcbiAgICAgICAgcm90YXRpb246IGdhbWVPYmplY3Qucm90YXRpb24sXHJcbiAgICAgICAgYWxwaGE6IGdhbWVPYmplY3QuYWxwaGEsXHJcbiAgICAgICAgdmlzaWJsZTogZ2FtZU9iamVjdC52aXNpYmxlLFxyXG4gICAgICAgIGJsZW5kTW9kZTogZ2FtZU9iamVjdC5ibGVuZE1vZGUsXHJcbiAgICAgICAgdGV4dHVyZUtleTogJycsXHJcbiAgICAgICAgZnJhbWVLZXk6ICcnLFxyXG4gICAgICAgIGRhdGE6IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChnYW1lT2JqZWN0LnRleHR1cmUpXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnRleHR1cmVLZXkgPSBnYW1lT2JqZWN0LnRleHR1cmUua2V5O1xyXG4gICAgICAgIG91dC5mcmFtZUtleSA9IGdhbWVPYmplY3QuZnJhbWUubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUb0pTT047XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG52YXIgV3JhcEFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9hbmdsZS9XcmFwJyk7XHJcbnZhciBXcmFwQW5nbGVEZWdyZWVzID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9hbmdsZS9XcmFwRGVncmVlcycpO1xyXG5cclxuLy8gIGdsb2JhbCBiaXRtYXNrIGZsYWcgZm9yIEdhbWVPYmplY3QucmVuZGVyTWFzayAodXNlZCBieSBTY2FsZSlcclxudmFyIF9GTEFHID0gNDsgLy8gMDEwMFxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgcG9zaXRpb24sIHNjYWxlIGFuZCByb3RhdGlvbiBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgVHJhbnNmb3JtID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGhvcml6b250YWwgc2NhbGUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtI19zY2FsZVhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF9zY2FsZVg6IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgdmVydGljYWwgc2NhbGUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtI19zY2FsZVlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF9zY2FsZVk6IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgcm90YXRpb24gdmFsdWUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jX3JvdGF0aW9uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBfcm90YXRpb246IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSN4XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHg6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSN5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHk6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeiBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIE5vdGU6IFRoZSB6IHBvc2l0aW9uIGRvZXMgbm90IGNvbnRyb2wgdGhlIHJlbmRlcmluZyBvcmRlciBvZiAyRCBHYW1lIE9iamVjdHMuIFVzZVxyXG4gICAgICoge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoI2RlcHRofSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSN6XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHo6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdyBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSN3XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHc6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBzZXR0ZXIgdGhhdCBhbGxvd3MgeW91IHRvIHNldCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0XHJcbiAgICAgKiB0byB0aGUgc2FtZSB2YWx1ZSwgYXQgdGhlIHNhbWUgdGltZS4gV2hlbiByZWFkaW5nIHRoaXMgdmFsdWUgdGhlIHJlc3VsdCByZXR1cm5lZCBpcyBgKHNjYWxlWCArIHNjYWxlWSkgLyAyYC5cclxuICAgICAqXHJcbiAgICAgKiBVc2Ugb2YgdGhpcyBwcm9wZXJ0eSBpbXBsaWVzIHlvdSB3aXNoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzY2FsZXMgdG8gYmUgZXF1YWwgdG8gZWFjaCBvdGhlci4gSWYgdGhpc1xyXG4gICAgICogaXNuJ3QgdGhlIGNhc2UsIHVzZSB0aGUgYHNjYWxlWGAgb3IgYHNjYWxlWWAgcHJvcGVydGllcyBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNzY2FsZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqL1xyXG4gICAgc2NhbGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9zY2FsZVggKyB0aGlzLl9zY2FsZVkpIC8gMjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYWxlWCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FsZVkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+X0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNzY2FsZVhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2NhbGVYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2FsZVg7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FsZVggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+X0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmVydGljYWwgc2NhbGUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2NhbGVZXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNjYWxlWToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NhbGVZO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc2NhbGVZID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgJj0gfl9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFuZ2xlIG9mIHRoaXMgR2FtZSBPYmplY3QgYXMgZXhwcmVzc2VkIGluIGRlZ3JlZXMuXHJcbiAgICAgKlxyXG4gICAgICogUGhhc2VyIHVzZXMgYSByaWdodC1oYW5kIGNsb2Nrd2lzZSByb3RhdGlvbiBzeXN0ZW0sIHdoZXJlIDAgaXMgcmlnaHQsIDkwIGlzIGRvd24sIDE4MC8tMTgwIGlzIGxlZnRcclxuICAgICAqIGFuZCAtOTAgaXMgdXAuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IHByZWZlciB0byB3b3JrIGluIHJhZGlhbnMsIHNlZSB0aGUgYHJvdGF0aW9uYCBwcm9wZXJ0eSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNhbmdsZVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYW5nbGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFdyYXBBbmdsZURlZ3JlZXModGhpcy5fcm90YXRpb24gKiBNQVRIX0NPTlNULlJBRF9UT19ERUcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHZhbHVlIGlzIGluIGRlZ3JlZXNcclxuICAgICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IFdyYXBBbmdsZURlZ3JlZXModmFsdWUpICogTUFUSF9DT05TVC5ERUdfVE9fUkFEO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW5nbGUgb2YgdGhpcyBHYW1lIE9iamVjdCBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIFBoYXNlciB1c2VzIGEgcmlnaHQtaGFuZCBjbG9ja3dpc2Ugcm90YXRpb24gc3lzdGVtLCB3aGVyZSAwIGlzIHJpZ2h0LCBQSS8yIGlzIGRvd24sICstUEkgaXMgbGVmdFxyXG4gICAgICogYW5kIC1QSS8yIGlzIHVwLlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSBwcmVmZXIgdG8gd29yayBpbiBkZWdyZWVzLCBzZWUgdGhlIGBhbmdsZWAgcHJvcGVydHkgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jcm90YXRpb25cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcm90YXRpb246IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHZhbHVlIGlzIGluIHJhZGlhbnNcclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSBXcmFwQW5nbGUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtI3NldFBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIHkgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC4gSWYgbm90IHNldCBpdCB3aWxsIHVzZSB0aGUgYHhgIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gVGhlIHogcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdz0wXSAtIFRoZSB3IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UG9zaXRpb246IGZ1bmN0aW9uICh4LCB5LCB6LCB3KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcbiAgICAgICAgaWYgKHogPT09IHVuZGVmaW5lZCkgeyB6ID0gMDsgfVxyXG4gICAgICAgIGlmICh3ID09PSB1bmRlZmluZWQpIHsgdyA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG4gICAgICAgIHRoaXMueiA9IHo7XHJcbiAgICAgICAgdGhpcy53ID0gdztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCB0byBiZSBhIHJhbmRvbSBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbmZpbmVzIG9mXHJcbiAgICAgKiB0aGUgZ2l2ZW4gYXJlYS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBhcmVhIGlzIHNwZWNpZmllZCBhIHJhbmRvbSBwb3NpdGlvbiBiZXR3ZWVuIDAgeCAwIGFuZCB0aGUgZ2FtZSB3aWR0aCB4IGhlaWdodCBpcyB1c2VkIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHBvc2l0aW9uIGRvZXMgbm90IGZhY3RvciBpbiB0aGUgc2l6ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LCBtZWFuaW5nIHRoYXQgb25seSB0aGUgb3JpZ2luIGlzXHJcbiAgICAgKiBndWFyYW50ZWVkIHRvIGJlIHdpdGhpbiB0aGUgYXJlYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNzZXRSYW5kb21Qb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSByYW5kb20gYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmFuZG9tIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmFuZG9tIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByYW5kb20gYXJlYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRSYW5kb21Qb3NpdGlvbjogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IHRoaXMuc2NlbmUuc3lzLnNjYWxlLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHRoaXMuc2NlbmUuc3lzLnNjYWxlLmhlaWdodDsgfVxyXG5cclxuICAgICAgICB0aGlzLnggPSB4ICsgKE1hdGgucmFuZG9tKCkgKiB3aWR0aCk7XHJcbiAgICAgICAgdGhpcy55ID0geSArIChNYXRoLnJhbmRvbSgpICogaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcm90YXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNzZXRSb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYW5zPTBdIC0gVGhlIHJvdGF0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QsIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Um90YXRpb246IGZ1bmN0aW9uIChyYWRpYW5zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyYWRpYW5zID09PSB1bmRlZmluZWQpIHsgcmFkaWFucyA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IHJhZGlhbnM7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFuZ2xlIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2V0QW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVncmVlcz0wXSAtIFRoZSByb3RhdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LCBpbiBkZWdyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEFuZ2xlOiBmdW5jdGlvbiAoZGVncmVlcylcclxuICAgIHtcclxuICAgICAgICBpZiAoZGVncmVlcyA9PT0gdW5kZWZpbmVkKSB7IGRlZ3JlZXMgPSAwOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYW5nbGUgPSBkZWdyZWVzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtI3NldFNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHNjYWxlIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgc2NhbGUgb2YgdGhpcyBHYW1lIE9iamVjdC4gSWYgbm90IHNldCBpdCB3aWxsIHVzZSB0aGUgYHhgIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNjYWxlOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAxOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0geDsgfVxyXG5cclxuICAgICAgICB0aGlzLnNjYWxlWCA9IHg7XHJcbiAgICAgICAgdGhpcy5zY2FsZVkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2V0WFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0wXSAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0WDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgeSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtI3NldFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWU9MF0gLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHogcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBUaGUgeiBwb3NpdGlvbiBkb2VzIG5vdCBjb250cm9sIHRoZSByZW5kZXJpbmcgb3JkZXIgb2YgMkQgR2FtZSBPYmplY3RzLiBVc2VcclxuICAgICAqIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aCNzZXREZXB0aH0gaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNzZXRaXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ZhbHVlPTBdIC0gVGhlIHogcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRaOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSAwOyB9XHJcblxyXG4gICAgICAgIHRoaXMueiA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB3IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2V0V1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0wXSAtIFRoZSB3IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLncgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbG9jYWwgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNnZXRMb2NhbFRyYW5zZm9ybU1hdHJpeFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IFt0ZW1wTWF0cml4XSAtIFRoZSBtYXRyaXggdG8gcG9wdWxhdGUgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IFRoZSBwb3B1bGF0ZWQgVHJhbnNmb3JtIE1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgZ2V0TG9jYWxUcmFuc2Zvcm1NYXRyaXg6IGZ1bmN0aW9uICh0ZW1wTWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0ZW1wTWF0cml4ID09PSB1bmRlZmluZWQpIHsgdGVtcE1hdHJpeCA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGVtcE1hdHJpeC5hcHBseUlUUlModGhpcy54LCB0aGlzLnksIHRoaXMuX3JvdGF0aW9uLCB0aGlzLl9zY2FsZVgsIHRoaXMuX3NjYWxlWSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgd29ybGQgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhpcyBHYW1lIE9iamVjdCwgZmFjdG9yaW5nIGluIGFueSBwYXJlbnQgQ29udGFpbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNnZXRXb3JsZFRyYW5zZm9ybU1hdHJpeFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IFt0ZW1wTWF0cml4XSAtIFRoZSBtYXRyaXggdG8gcG9wdWxhdGUgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBbcGFyZW50TWF0cml4XSAtIEEgdGVtcG9yYXJ5IG1hdHJpeCB0byBob2xkIHBhcmVudCB2YWx1ZXMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBUaGUgcG9wdWxhdGVkIFRyYW5zZm9ybSBNYXRyaXguXHJcbiAgICAgKi9cclxuICAgIGdldFdvcmxkVHJhbnNmb3JtTWF0cml4OiBmdW5jdGlvbiAodGVtcE1hdHJpeCwgcGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0ZW1wTWF0cml4ID09PSB1bmRlZmluZWQpIHsgdGVtcE1hdHJpeCA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTsgfVxyXG4gICAgICAgIGlmIChwYXJlbnRNYXRyaXggPT09IHVuZGVmaW5lZCkgeyBwYXJlbnRNYXRyaXggPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7IH1cclxuXHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Q29udGFpbmVyO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExvY2FsVHJhbnNmb3JtTWF0cml4KHRlbXBNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGVtcE1hdHJpeC5hcHBseUlUUlModGhpcy54LCB0aGlzLnksIHRoaXMuX3JvdGF0aW9uLCB0aGlzLl9zY2FsZVgsIHRoaXMuX3NjYWxlWSk7XHJcblxyXG4gICAgICAgIHdoaWxlIChwYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRNYXRyaXguYXBwbHlJVFJTKHBhcmVudC54LCBwYXJlbnQueSwgcGFyZW50Ll9yb3RhdGlvbiwgcGFyZW50Ll9zY2FsZVgsIHBhcmVudC5fc2NhbGVZKTtcclxuXHJcbiAgICAgICAgICAgIHBhcmVudE1hdHJpeC5tdWx0aXBseSh0ZW1wTWF0cml4LCB0ZW1wTWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRDb250YWluZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGVtcE1hdHJpeDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdW0gdG90YWwgcm90YXRpb24gb2YgYWxsIG9mIHRoaXMgR2FtZSBPYmplY3RzIHBhcmVudCBDb250YWluZXJzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBpbiByYWRpYW5zIGFuZCB3aWxsIGJlIHplcm8gaWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgbm8gcGFyZW50IGNvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybSNnZXRQYXJlbnRSb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSB0b3RhbCByb3RhdGlvbiwgaW4gcmFkaWFucywgb2YgYWxsIHBhcmVudCBjb250YWluZXJzIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFBhcmVudFJvdGF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByb3RhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudENvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgd2hpbGUgKHBhcmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJvdGF0aW9uICs9IHBhcmVudC5yb3RhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRDb250YWluZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcm90YXRpb247XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIE1hdHJpeCB1c2VkIGZvciBkaXNwbGF5IHRyYW5zZm9ybWF0aW9ucyBmb3IgcmVuZGVyaW5nLlxyXG4gKlxyXG4gKiBJdCBpcyByZXByZXNlbnRlZCBsaWtlIHNvOlxyXG4gKlxyXG4gKiBgYGBcclxuICogfCBhIHwgYyB8IHR4IHxcclxuICogfCBiIHwgZCB8IHR5IHxcclxuICogfCAwIHwgMCB8IDEgIHxcclxuICogYGBgXHJcbiAqXHJcbiAqIEBjbGFzcyBUcmFuc2Zvcm1NYXRyaXhcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFthPTFdIC0gVGhlIFNjYWxlIFggdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYj0wXSAtIFRoZSBTa2V3IFkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYz0wXSAtIFRoZSBTa2V3IFggdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZD0xXSAtIFRoZSBTY2FsZSBZIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3R4PTBdIC0gVGhlIFRyYW5zbGF0ZSBYIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3R5PTBdIC0gVGhlIFRyYW5zbGF0ZSBZIHZhbHVlLlxyXG4gKi9cclxudmFyIFRyYW5zZm9ybU1hdHJpeCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1NYXRyaXggKGEsIGIsIGMsIGQsIHR4LCB0eSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7IGEgPSAxOyB9XHJcbiAgICAgICAgaWYgKGIgPT09IHVuZGVmaW5lZCkgeyBiID0gMDsgfVxyXG4gICAgICAgIGlmIChjID09PSB1bmRlZmluZWQpIHsgYyA9IDA7IH1cclxuICAgICAgICBpZiAoZCA9PT0gdW5kZWZpbmVkKSB7IGQgPSAxOyB9XHJcbiAgICAgICAgaWYgKHR4ID09PSB1bmRlZmluZWQpIHsgdHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHR5ID09PSB1bmRlZmluZWQpIHsgdHkgPSAwOyB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXRyaXggdmFsdWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I21hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KFsgYSwgYiwgYywgZCwgdHgsIHR5LCAwLCAwLCAxIF0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVjb21wb3NlZCBtYXRyaXguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjZGVjb21wb3NlZE1hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWNvbXBvc2VkTWF0cml4ID0ge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVYOiAwLFxyXG4gICAgICAgICAgICB0cmFuc2xhdGVZOiAwLFxyXG4gICAgICAgICAgICBzY2FsZVg6IDEsXHJcbiAgICAgICAgICAgIHNjYWxlWTogMSxcclxuICAgICAgICAgICAgcm90YXRpb246IDBcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2FsZSBYIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNhXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIGE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0cml4WzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRyaXhbMF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTa2V3IFkgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I2JcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqL1xyXG4gICAgYjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXhbMV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHJpeFsxXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNrZXcgWCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjY1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBjOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdHJpeFsyXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0cml4WzJdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NhbGUgWSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjZFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBkOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hdHJpeFszXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0cml4WzNdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVHJhbnNsYXRlIFggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I2VcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0cml4WzRdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRyaXhbNF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBUcmFuc2xhdGUgWSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjZlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgZjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXhbNV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHJpeFs1XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRyYW5zbGF0ZSBYIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCN0eFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICB0eDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXhbNF07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHJpeFs0XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRyYW5zbGF0ZSBZIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCN0eVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICB0eToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRyaXhbNV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHJpeFs1XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJvdGF0aW9uIG9mIHRoZSBNYXRyaXguIFZhbHVlIGlzIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3JvdGF0aW9uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqL1xyXG4gICAgcm90YXRpb246IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWNvcyh0aGlzLmEgLyB0aGlzLnNjYWxlWCkgKiAoKE1hdGguYXRhbigtdGhpcy5jIC8gdGhpcy5hKSA8IDApID8gLTEgOiAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByb3RhdGlvbiBvZiB0aGUgTWF0cml4LCBub3JtYWxpemVkIHRvIGJlIHdpdGhpbiB0aGUgUGhhc2VyIHJpZ2h0LWhhbmRlZFxyXG4gICAgICogY2xvY2t3aXNlIHJvdGF0aW9uIHNwYWNlLiBWYWx1ZSBpcyBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNyb3RhdGlvbk5vcm1hbGl6ZWRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqL1xyXG4gICAgcm90YXRpb25Ob3JtYWxpemVkOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgICAgIHZhciBhID0gbWF0cml4WzBdO1xyXG4gICAgICAgICAgICB2YXIgYiA9IG1hdHJpeFsxXTtcclxuICAgICAgICAgICAgdmFyIGMgPSBtYXRyaXhbMl07XHJcbiAgICAgICAgICAgIHZhciBkID0gbWF0cml4WzNdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGEgfHwgYilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIHIgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHJldHVybiAoYiA+IDApID8gTWF0aC5hY29zKGEgLyB0aGlzLnNjYWxlWCkgOiAtTWF0aC5hY29zKGEgLyB0aGlzLnNjYWxlWCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYyB8fCBkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgcyA9IE1hdGguc3FydChjICogYyArIGQgKiBkKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1BVEhfQ09OU1QuVEFVIC0gKChkID4gMCkgPyBNYXRoLmFjb3MoLWMgLyB0aGlzLnNjYWxlWSkgOiAtTWF0aC5hY29zKGMgLyB0aGlzLnNjYWxlWSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZWNvbXBvc2VkIGhvcml6b250YWwgc2NhbGUgb2YgdGhlIE1hdHJpeC4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3NjYWxlWFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIHNjYWxlWDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh0aGlzLmEgKiB0aGlzLmEpICsgKHRoaXMuYiAqIHRoaXMuYikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlY29tcG9zZWQgdmVydGljYWwgc2NhbGUgb2YgdGhlIE1hdHJpeC4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3NjYWxlWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIHNjYWxlWToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh0aGlzLmMgKiB0aGlzLmMpICsgKHRoaXMuZCAqIHRoaXMuZCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXQgdGhlIE1hdHJpeCB0byBhbiBpZGVudGl0eSBtYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjbG9hZElkZW50aXR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRyYW5zZm9ybU1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgbG9hZElkZW50aXR5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgbWF0cml4WzBdID0gMTtcclxuICAgICAgICBtYXRyaXhbMV0gPSAwO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IDA7XHJcbiAgICAgICAgbWF0cml4WzNdID0gMTtcclxuICAgICAgICBtYXRyaXhbNF0gPSAwO1xyXG4gICAgICAgIG1hdHJpeFs1XSA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZSB0aGUgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3RyYW5zbGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHJhbnNmb3JtTWF0cml4LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgbWF0cml4WzRdID0gbWF0cml4WzBdICogeCArIG1hdHJpeFsyXSAqIHkgKyBtYXRyaXhbNF07XHJcbiAgICAgICAgbWF0cml4WzVdID0gbWF0cml4WzFdICogeCArIG1hdHJpeFszXSAqIHkgKyBtYXRyaXhbNV07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlIHRoZSBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjc2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgc2NhbGUgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBzY2FsZSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRyYW5zZm9ybU1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgc2NhbGU6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgbWF0cml4WzBdICo9IHg7XHJcbiAgICAgICAgbWF0cml4WzFdICo9IHg7XHJcbiAgICAgICAgbWF0cml4WzJdICo9IHk7XHJcbiAgICAgICAgbWF0cml4WzNdICo9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZSB0aGUgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3JvdGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUcmFuc2Zvcm1NYXRyaXguXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZTogZnVuY3Rpb24gKGFuZ2xlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgYSA9IG1hdHJpeFswXTtcclxuICAgICAgICB2YXIgYiA9IG1hdHJpeFsxXTtcclxuICAgICAgICB2YXIgYyA9IG1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgZCA9IG1hdHJpeFszXTtcclxuXHJcbiAgICAgICAgbWF0cml4WzBdID0gYSAqIGNvcyArIGMgKiBzaW47XHJcbiAgICAgICAgbWF0cml4WzFdID0gYiAqIGNvcyArIGQgKiBzaW47XHJcbiAgICAgICAgbWF0cml4WzJdID0gYSAqIC1zaW4gKyBjICogY29zO1xyXG4gICAgICAgIG1hdHJpeFszXSA9IGIgKiAtc2luICsgZCAqIGNvcztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBNYXRyaXggYnkgdGhlIGdpdmVuIE1hdHJpeC5cclxuICAgICAqIFxyXG4gICAgICogSWYgYW4gYG91dGAgTWF0cml4IGlzIGdpdmVuIHRoZW4gdGhlIHJlc3VsdHMgd2lsbCBiZSBzdG9yZWQgaW4gaXQuXHJcbiAgICAgKiBJZiBpdCBpcyBub3QgZ2l2ZW4sIHRoaXMgbWF0cml4IHdpbGwgYmUgdXBkYXRlZCBpbiBwbGFjZSBpbnN0ZWFkLlxyXG4gICAgICogVXNlIGFuIGBvdXRgIE1hdHJpeCBpZiB5b3UgZG8gbm90IHdpc2ggdG8gbXV0YXRlIHRoaXMgbWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I211bHRpcGx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcmhzIC0gVGhlIE1hdHJpeCB0byBtdWx0aXBseSBieS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBbb3V0XSAtIEFuIG9wdGlvbmFsIE1hdHJpeCB0byBzdG9yZSB0aGUgcmVzdWx0cyBpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsodGhpc3xQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgpfSBFaXRoZXIgdGhpcyBUcmFuc2Zvcm1NYXRyaXgsIG9yIHRoZSBgb3V0YCBNYXRyaXgsIGlmIGdpdmVuIGluIHRoZSBhcmd1bWVudHMuXHJcbiAgICAgKi9cclxuICAgIG11bHRpcGx5OiBmdW5jdGlvbiAocmhzLCBvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG4gICAgICAgIHZhciBzb3VyY2UgPSByaHMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgbG9jYWxBID0gbWF0cml4WzBdO1xyXG4gICAgICAgIHZhciBsb2NhbEIgPSBtYXRyaXhbMV07XHJcbiAgICAgICAgdmFyIGxvY2FsQyA9IG1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgbG9jYWxEID0gbWF0cml4WzNdO1xyXG4gICAgICAgIHZhciBsb2NhbEUgPSBtYXRyaXhbNF07XHJcbiAgICAgICAgdmFyIGxvY2FsRiA9IG1hdHJpeFs1XTtcclxuXHJcbiAgICAgICAgdmFyIHNvdXJjZUEgPSBzb3VyY2VbMF07XHJcbiAgICAgICAgdmFyIHNvdXJjZUIgPSBzb3VyY2VbMV07XHJcbiAgICAgICAgdmFyIHNvdXJjZUMgPSBzb3VyY2VbMl07XHJcbiAgICAgICAgdmFyIHNvdXJjZUQgPSBzb3VyY2VbM107XHJcbiAgICAgICAgdmFyIHNvdXJjZUUgPSBzb3VyY2VbNF07XHJcbiAgICAgICAgdmFyIHNvdXJjZUYgPSBzb3VyY2VbNV07XHJcblxyXG4gICAgICAgIHZhciBkZXN0aW5hdGlvbk1hdHJpeCA9IChvdXQgPT09IHVuZGVmaW5lZCkgPyB0aGlzIDogb3V0O1xyXG5cclxuICAgICAgICBkZXN0aW5hdGlvbk1hdHJpeC5hID0gKHNvdXJjZUEgKiBsb2NhbEEpICsgKHNvdXJjZUIgKiBsb2NhbEMpO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uTWF0cml4LmIgPSAoc291cmNlQSAqIGxvY2FsQikgKyAoc291cmNlQiAqIGxvY2FsRCk7XHJcbiAgICAgICAgZGVzdGluYXRpb25NYXRyaXguYyA9IChzb3VyY2VDICogbG9jYWxBKSArIChzb3VyY2VEICogbG9jYWxDKTtcclxuICAgICAgICBkZXN0aW5hdGlvbk1hdHJpeC5kID0gKHNvdXJjZUMgKiBsb2NhbEIpICsgKHNvdXJjZUQgKiBsb2NhbEQpO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uTWF0cml4LmUgPSAoc291cmNlRSAqIGxvY2FsQSkgKyAoc291cmNlRiAqIGxvY2FsQykgKyBsb2NhbEU7XHJcbiAgICAgICAgZGVzdGluYXRpb25NYXRyaXguZiA9IChzb3VyY2VFICogbG9jYWxCKSArIChzb3VyY2VGICogbG9jYWxEKSArIGxvY2FsRjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uTWF0cml4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgTWF0cml4IGJ5IHRoZSBtYXRyaXggZ2l2ZW4sIGluY2x1ZGluZyB0aGUgb2Zmc2V0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgb2Zmc2V0WCBpcyBhZGRlZCB0byB0aGUgdHggdmFsdWU6IGBvZmZzZXRYICogYSArIG9mZnNldFkgKiBjICsgdHhgLlxyXG4gICAgICogVGhlIG9mZnNldFkgaXMgYWRkZWQgdG8gdGhlIHR5IHZhbHVlOiBgb2Zmc2V0WSAqIGIgKyBvZmZzZXRZICogZCArIHR5YC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNtdWx0aXBseVdpdGhPZmZzZXRcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gc3JjIC0gVGhlIHNvdXJjZSBNYXRyaXggdG8gY29weSBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFggLSBIb3Jpem9udGFsIG9mZnNldCB0byBmYWN0b3IgaW4gdG8gdGhlIG11bHRpcGxpY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFkgLSBWZXJ0aWNhbCBvZmZzZXQgdG8gZmFjdG9yIGluIHRvIHRoZSBtdWx0aXBsaWNhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRyYW5zZm9ybU1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgbXVsdGlwbHlXaXRoT2Zmc2V0OiBmdW5jdGlvbiAoc3JjLCBvZmZzZXRYLCBvZmZzZXRZKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuICAgICAgICB2YXIgb3RoZXJNYXRyaXggPSBzcmMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgYTAgPSBtYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGIwID0gbWF0cml4WzFdO1xyXG4gICAgICAgIHZhciBjMCA9IG1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgZDAgPSBtYXRyaXhbM107XHJcbiAgICAgICAgdmFyIHR4MCA9IG1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgdHkwID0gbWF0cml4WzVdO1xyXG5cclxuICAgICAgICB2YXIgcHNlID0gb2Zmc2V0WCAqIGEwICsgb2Zmc2V0WSAqIGMwICsgdHgwO1xyXG4gICAgICAgIHZhciBwc2YgPSBvZmZzZXRYICogYjAgKyBvZmZzZXRZICogZDAgKyB0eTA7XHJcblxyXG4gICAgICAgIHZhciBhMSA9IG90aGVyTWF0cml4WzBdO1xyXG4gICAgICAgIHZhciBiMSA9IG90aGVyTWF0cml4WzFdO1xyXG4gICAgICAgIHZhciBjMSA9IG90aGVyTWF0cml4WzJdO1xyXG4gICAgICAgIHZhciBkMSA9IG90aGVyTWF0cml4WzNdO1xyXG4gICAgICAgIHZhciB0eDEgPSBvdGhlck1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgdHkxID0gb3RoZXJNYXRyaXhbNV07XHJcblxyXG4gICAgICAgIG1hdHJpeFswXSA9IGExICogYTAgKyBiMSAqIGMwO1xyXG4gICAgICAgIG1hdHJpeFsxXSA9IGExICogYjAgKyBiMSAqIGQwO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IGMxICogYTAgKyBkMSAqIGMwO1xyXG4gICAgICAgIG1hdHJpeFszXSA9IGMxICogYjAgKyBkMSAqIGQwO1xyXG4gICAgICAgIG1hdHJpeFs0XSA9IHR4MSAqIGEwICsgdHkxICogYzAgKyBwc2U7XHJcbiAgICAgICAgbWF0cml4WzVdID0gdHgxICogYjAgKyB0eTEgKiBkMCArIHBzZjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtIHRoZSBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjdHJhbnNmb3JtXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSBTY2FsZSBYIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgU2hlYXIgWSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjIC0gVGhlIFNoZWFyIFggdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZCAtIFRoZSBTY2FsZSBZIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR4IC0gVGhlIFRyYW5zbGF0ZSBYIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR5IC0gVGhlIFRyYW5zbGF0ZSBZIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHJhbnNmb3JtTWF0cml4LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB0eCwgdHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgYTAgPSBtYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGIwID0gbWF0cml4WzFdO1xyXG4gICAgICAgIHZhciBjMCA9IG1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgZDAgPSBtYXRyaXhbM107XHJcbiAgICAgICAgdmFyIHR4MCA9IG1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgdHkwID0gbWF0cml4WzVdO1xyXG5cclxuICAgICAgICBtYXRyaXhbMF0gPSBhICogYTAgKyBiICogYzA7XHJcbiAgICAgICAgbWF0cml4WzFdID0gYSAqIGIwICsgYiAqIGQwO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IGMgKiBhMCArIGQgKiBjMDtcclxuICAgICAgICBtYXRyaXhbM10gPSBjICogYjAgKyBkICogZDA7XHJcbiAgICAgICAgbWF0cml4WzRdID0gdHggKiBhMCArIHR5ICogYzAgKyB0eDA7XHJcbiAgICAgICAgbWF0cml4WzVdID0gdHggKiBiMCArIHR5ICogZDAgKyB0eTA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybSBhIHBvaW50IHVzaW5nIHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I3RyYW5zZm9ybVBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRyYW5zZm9ybS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gdHJhbnNmb3JtLlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8UGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBwb2ludCAtIFRoZSBQb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFRoZSBQb2ludCBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy5cclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtUG9pbnQ6IGZ1bmN0aW9uICh4LCB5LCBwb2ludClcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnQgPT09IHVuZGVmaW5lZCkgeyBwb2ludCA9IHsgeDogMCwgeTogMCB9OyB9XHJcblxyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgdmFyIGEgPSBtYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGIgPSBtYXRyaXhbMV07XHJcbiAgICAgICAgdmFyIGMgPSBtYXRyaXhbMl07XHJcbiAgICAgICAgdmFyIGQgPSBtYXRyaXhbM107XHJcbiAgICAgICAgdmFyIHR4ID0gbWF0cml4WzRdO1xyXG4gICAgICAgIHZhciB0eSA9IG1hdHJpeFs1XTtcclxuXHJcbiAgICAgICAgcG9pbnQueCA9IHggKiBhICsgeSAqIGMgKyB0eDtcclxuICAgICAgICBwb2ludC55ID0geCAqIGIgKyB5ICogZCArIHR5O1xyXG5cclxuICAgICAgICByZXR1cm4gcG9pbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoZSBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjaW52ZXJ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRyYW5zZm9ybU1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgaW52ZXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgdmFyIGEgPSBtYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGIgPSBtYXRyaXhbMV07XHJcbiAgICAgICAgdmFyIGMgPSBtYXRyaXhbMl07XHJcbiAgICAgICAgdmFyIGQgPSBtYXRyaXhbM107XHJcbiAgICAgICAgdmFyIHR4ID0gbWF0cml4WzRdO1xyXG4gICAgICAgIHZhciB0eSA9IG1hdHJpeFs1XTtcclxuXHJcbiAgICAgICAgdmFyIG4gPSBhICogZCAtIGIgKiBjO1xyXG5cclxuICAgICAgICBtYXRyaXhbMF0gPSBkIC8gbjtcclxuICAgICAgICBtYXRyaXhbMV0gPSAtYiAvIG47XHJcbiAgICAgICAgbWF0cml4WzJdID0gLWMgLyBuO1xyXG4gICAgICAgIG1hdHJpeFszXSA9IGEgLyBuO1xyXG4gICAgICAgIG1hdHJpeFs0XSA9IChjICogdHkgLSBkICogdHgpIC8gbjtcclxuICAgICAgICBtYXRyaXhbNV0gPSAtKGEgKiB0eSAtIGIgKiB0eCkgLyBuO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCB0byBjb3B5IHRob3NlIG9mIHRoZSBtYXRyaXggZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjY29weUZyb21cclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gc3JjIC0gVGhlIHNvdXJjZSBNYXRyaXggdG8gY29weSBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHJhbnNmb3JtTWF0cml4LlxyXG4gICAgICovXHJcbiAgICBjb3B5RnJvbTogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5tYXRyaXg7XHJcblxyXG4gICAgICAgIG1hdHJpeFswXSA9IHNyYy5hO1xyXG4gICAgICAgIG1hdHJpeFsxXSA9IHNyYy5iO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IHNyYy5jO1xyXG4gICAgICAgIG1hdHJpeFszXSA9IHNyYy5kO1xyXG4gICAgICAgIG1hdHJpeFs0XSA9IHNyYy5lO1xyXG4gICAgICAgIG1hdHJpeFs1XSA9IHNyYy5mO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCB0byBjb3B5IHRob3NlIG9mIHRoZSBhcnJheSBnaXZlbi5cclxuICAgICAqIFdoZXJlIGFycmF5IGluZGV4ZXMgMCwgMSwgMiwgMywgNCBhbmQgNSBhcmUgbWFwcGVkIHRvIGEsIGIsIGMsIGQsIGUgYW5kIGYuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjY29weUZyb21BcnJheVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHNyYyAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gc2V0IGludG8gdGhpcyBtYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUcmFuc2Zvcm1NYXRyaXguXHJcbiAgICAgKi9cclxuICAgIGNvcHlGcm9tQXJyYXk6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICBtYXRyaXhbMF0gPSBzcmNbMF07XHJcbiAgICAgICAgbWF0cml4WzFdID0gc3JjWzFdO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IHNyY1syXTtcclxuICAgICAgICBtYXRyaXhbM10gPSBzcmNbM107XHJcbiAgICAgICAgbWF0cml4WzRdID0gc3JjWzRdO1xyXG4gICAgICAgIG1hdHJpeFs1XSA9IHNyY1s1XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29weSB0aGUgdmFsdWVzIGZyb20gdGhpcyBNYXRyaXggdG8gdGhlIGdpdmVuIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAqIFRoaXMgd2lsbCB1c2UgdGhlIENvbnRleHQudHJhbnNmb3JtIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNjb3B5VG9Db250ZXh0XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgdG8gY29weSB0aGUgbWF0cml4IHZhbHVlcyB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKi9cclxuICAgIGNvcHlUb0NvbnRleHQ6IGZ1bmN0aW9uIChjdHgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICBjdHgudHJhbnNmb3JtKG1hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIG1hdHJpeFszXSwgbWF0cml4WzRdLCBtYXRyaXhbNV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gY3R4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIHRoaXMgTWF0cml4IHRvIHRoZSBnaXZlbiBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKiBUaGlzIHdpbGwgdXNlIHRoZSBDb250ZXh0LnNldFRyYW5zZm9ybSBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjc2V0VG9Db250ZXh0XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgdG8gY29weSB0aGUgbWF0cml4IHZhbHVlcyB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKi9cclxuICAgIHNldFRvQ29udGV4dDogZnVuY3Rpb24gKGN0eClcclxuICAgIHtcclxuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5tYXRyaXg7XHJcblxyXG4gICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjdHg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29weSB0aGUgdmFsdWVzIGluIHRoaXMgTWF0cml4IHRvIHRoZSBhcnJheSBnaXZlbi5cclxuICAgICAqIFxyXG4gICAgICogV2hlcmUgYXJyYXkgaW5kZXhlcyAwLCAxLCAyLCAzLCA0IGFuZCA1IGFyZSBtYXBwZWQgdG8gYSwgYiwgYywgZCwgZSBhbmQgZi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNjb3B5VG9BcnJheVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IFtvdXRdIC0gVGhlIGFycmF5IHRvIGNvcHkgdGhlIG1hdHJpeCB2YWx1ZXMgaW4gdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IHdoZXJlIGVsZW1lbnRzIDAgdG8gNSBjb250YWluIHRoZSB2YWx1ZXMgZnJvbSB0aGlzIG1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgY29weVRvQXJyYXk6IGZ1bmN0aW9uIChvdXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXQgPSBbIG1hdHJpeFswXSwgbWF0cml4WzFdLCBtYXRyaXhbMl0sIG1hdHJpeFszXSwgbWF0cml4WzRdLCBtYXRyaXhbNV0gXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0WzBdID0gbWF0cml4WzBdO1xyXG4gICAgICAgICAgICBvdXRbMV0gPSBtYXRyaXhbMV07XHJcbiAgICAgICAgICAgIG91dFsyXSA9IG1hdHJpeFsyXTtcclxuICAgICAgICAgICAgb3V0WzNdID0gbWF0cml4WzNdO1xyXG4gICAgICAgICAgICBvdXRbNF0gPSBtYXRyaXhbNF07XHJcbiAgICAgICAgICAgIG91dFs1XSA9IG1hdHJpeFs1XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2YWx1ZXMgb2YgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjc2V0VHJhbnNmb3JtXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSBTY2FsZSBYIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgU2hlYXIgWSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjIC0gVGhlIFNoZWFyIFggdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZCAtIFRoZSBTY2FsZSBZIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR4IC0gVGhlIFRyYW5zbGF0ZSBYIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR5IC0gVGhlIFRyYW5zbGF0ZSBZIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHJhbnNmb3JtTWF0cml4LlxyXG4gICAgICovXHJcbiAgICBzZXRUcmFuc2Zvcm06IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCB0eCwgdHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICBtYXRyaXhbMF0gPSBhO1xyXG4gICAgICAgIG1hdHJpeFsxXSA9IGI7XHJcbiAgICAgICAgbWF0cml4WzJdID0gYztcclxuICAgICAgICBtYXRyaXhbM10gPSBkO1xyXG4gICAgICAgIG1hdHJpeFs0XSA9IHR4O1xyXG4gICAgICAgIG1hdHJpeFs1XSA9IHR5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNvbXBvc2UgdGhpcyBNYXRyaXggaW50byBpdHMgdHJhbnNsYXRpb24sIHNjYWxlIGFuZCByb3RhdGlvbiB2YWx1ZXMgdXNpbmcgUVIgZGVjb21wb3NpdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHJlc3VsdCBtdXN0IGJlIGFwcGxpZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciB0byByZXByb2R1Y2UgdGhlIGN1cnJlbnQgbWF0cml4OlxyXG4gICAgICogXHJcbiAgICAgKiB0cmFuc2xhdGUgLT4gcm90YXRlIC0+IHNjYWxlXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjZGVjb21wb3NlTWF0cml4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBkZWNvbXBvc2VkIE1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgZGVjb21wb3NlTWF0cml4OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkZWNvbXBvc2VkTWF0cml4ID0gdGhpcy5kZWNvbXBvc2VkTWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5tYXRyaXg7XHJcblxyXG4gICAgICAgIC8vICBhID0gc2NhbGUgWCAoMSlcclxuICAgICAgICAvLyAgYiA9IHNoZWFyIFkgKDApXHJcbiAgICAgICAgLy8gIGMgPSBzaGVhciBYICgwKVxyXG4gICAgICAgIC8vICBkID0gc2NhbGUgWSAoMSlcclxuXHJcbiAgICAgICAgdmFyIGEgPSBtYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGIgPSBtYXRyaXhbMV07XHJcbiAgICAgICAgdmFyIGMgPSBtYXRyaXhbMl07XHJcbiAgICAgICAgdmFyIGQgPSBtYXRyaXhbM107XHJcblxyXG4gICAgICAgIHZhciBkZXRlcm0gPSBhICogZCAtIGIgKiBjO1xyXG5cclxuICAgICAgICBkZWNvbXBvc2VkTWF0cml4LnRyYW5zbGF0ZVggPSBtYXRyaXhbNF07XHJcbiAgICAgICAgZGVjb21wb3NlZE1hdHJpeC50cmFuc2xhdGVZID0gbWF0cml4WzVdO1xyXG5cclxuICAgICAgICBpZiAoYSB8fCBiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XHJcblxyXG4gICAgICAgICAgICBkZWNvbXBvc2VkTWF0cml4LnJvdGF0aW9uID0gKGIgPiAwKSA/IE1hdGguYWNvcyhhIC8gcikgOiAtTWF0aC5hY29zKGEgLyByKTtcclxuICAgICAgICAgICAgZGVjb21wb3NlZE1hdHJpeC5zY2FsZVggPSByO1xyXG4gICAgICAgICAgICBkZWNvbXBvc2VkTWF0cml4LnNjYWxlWSA9IGRldGVybSAvIHI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGMgfHwgZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpO1xyXG5cclxuICAgICAgICAgICAgZGVjb21wb3NlZE1hdHJpeC5yb3RhdGlvbiA9IE1hdGguUEkgKiAwLjUgLSAoZCA+IDAgPyBNYXRoLmFjb3MoLWMgLyBzKSA6IC1NYXRoLmFjb3MoYyAvIHMpKTtcclxuICAgICAgICAgICAgZGVjb21wb3NlZE1hdHJpeC5zY2FsZVggPSBkZXRlcm0gLyBzO1xyXG4gICAgICAgICAgICBkZWNvbXBvc2VkTWF0cml4LnNjYWxlWSA9IHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlY29tcG9zZWRNYXRyaXgucm90YXRpb24gPSAwO1xyXG4gICAgICAgICAgICBkZWNvbXBvc2VkTWF0cml4LnNjYWxlWCA9IDA7XHJcbiAgICAgICAgICAgIGRlY29tcG9zZWRNYXRyaXguc2NhbGVZID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZWNvbXBvc2VkTWF0cml4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHRoZSBpZGVudGl0eSwgdHJhbnNsYXRlLCByb3RhdGUgYW5kIHNjYWxlIG9wZXJhdGlvbnMgb24gdGhlIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNhcHBseUlUUlNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCB0cmFuc2xhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlWCAtIFRoZSBob3Jpem9udGFsIHNjYWxlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlWSAtIFRoZSB2ZXJ0aWNhbCBzY2FsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRyYW5zZm9ybU1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgYXBwbHlJVFJTOiBmdW5jdGlvbiAoeCwgeSwgcm90YXRpb24sIHNjYWxlWCwgc2NhbGVZKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcbiAgICAgICAgdmFyIHJhZGlhblNpbiA9IE1hdGguc2luKHJvdGF0aW9uKTtcclxuICAgICAgICB2YXIgcmFkaWFuQ29zID0gTWF0aC5jb3Mocm90YXRpb24pO1xyXG5cclxuICAgICAgICAvLyBUcmFuc2xhdGVcclxuICAgICAgICBtYXRyaXhbNF0gPSB4O1xyXG4gICAgICAgIG1hdHJpeFs1XSA9IHk7XHJcblxyXG4gICAgICAgIC8vIFJvdGF0ZSBhbmQgU2NhbGVcclxuICAgICAgICBtYXRyaXhbMF0gPSByYWRpYW5Db3MgKiBzY2FsZVg7XHJcbiAgICAgICAgbWF0cml4WzFdID0gcmFkaWFuU2luICogc2NhbGVYO1xyXG4gICAgICAgIG1hdHJpeFsyXSA9IC1yYWRpYW5TaW4gKiBzY2FsZVk7XHJcbiAgICAgICAgbWF0cml4WzNdID0gcmFkaWFuQ29zICogc2NhbGVZO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyB0aGUgYHhgIGFuZCBgeWAgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IHBvc2l0aW9uIGluIHRoZSBgb3V0cHV0YCB2ZWN0b3IgdGhhdCBpcyB0aGUgaW52ZXJzZSBvZlxyXG4gICAgICogdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggaXRzIHRyYW5zZm9ybWF0aW9uIGFwcGxpZWQuXHJcbiAgICAgKiBcclxuICAgICAqIENhbiBiZSB1c2VkIHRvIHRyYW5zbGF0ZSBwb2ludHMgZnJvbSB3b3JsZCB0byBsb2NhbCBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNhcHBseUludmVyc2VcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHBvc2l0aW9uIHRvIHRyYW5zbGF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gdG8gdHJhbnNsYXRlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0cHV0XSAtIEEgVmVjdG9yMiwgb3IgcG9pbnQtbGlrZSBvYmplY3QsIHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjb29yZGluYXRlcywgaW52ZXJzZS10cmFuc2Zvcm1lZCB0aHJvdWdoIHRoaXMgbWF0cml4LlxyXG4gICAgICovXHJcbiAgICBhcHBseUludmVyc2U6IGZ1bmN0aW9uICh4LCB5LCBvdXRwdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dHB1dCA9PT0gdW5kZWZpbmVkKSB7IG91dHB1dCA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgYSA9IG1hdHJpeFswXTtcclxuICAgICAgICB2YXIgYiA9IG1hdHJpeFsxXTtcclxuICAgICAgICB2YXIgYyA9IG1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgZCA9IG1hdHJpeFszXTtcclxuICAgICAgICB2YXIgdHggPSBtYXRyaXhbNF07XHJcbiAgICAgICAgdmFyIHR5ID0gbWF0cml4WzVdO1xyXG5cclxuICAgICAgICB2YXIgaWQgPSAxIC8gKChhICogZCkgKyAoYyAqIC1iKSk7XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gKGQgKiBpZCAqIHgpICsgKC1jICogaWQgKiB5KSArICgoKHR5ICogYykgLSAodHggKiBkKSkgKiBpZCk7XHJcbiAgICAgICAgb3V0cHV0LnkgPSAoYSAqIGlkICogeSkgKyAoLWIgKiBpZCAqIHgpICsgKCgoLXR5ICogYSkgKyAodHggKiBiKSkgKiBpZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgWCBjb21wb25lbnQgb2YgdGhpcyBtYXRyaXggbXVsdGlwbGllZCBieSB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG4gICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBgeCAqIGEgKyB5ICogYyArIGVgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I2dldFhcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCB4IHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRYOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4geCAqIHRoaXMuYSArIHkgKiB0aGlzLmMgKyB0aGlzLmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgWSBjb21wb25lbnQgb2YgdGhpcyBtYXRyaXggbXVsdGlwbGllZCBieSB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG4gICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBgeCAqIGIgKyB5ICogZCArIGZgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4I2dldFlcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCB5IHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRZOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4geCAqIHRoaXMuYiArIHkgKiB0aGlzLmQgKyB0aGlzLmY7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgQ1NTIFRyYW5zZm9ybSBjYWxsIGFzIGEgYG1hdHJpeGAgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgjZ2V0Q1NTTWF0cml4XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBDU1MgVHJhbnNmb3JtIG1hdHJpeCB2YWx1ZXMuXHJcbiAgICAgKi9cclxuICAgIGdldENTU01hdHJpeDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbSA9IHRoaXMubWF0cml4O1xyXG5cclxuICAgICAgICByZXR1cm4gJ21hdHJpeCgnICsgbVswXSArICcsJyArIG1bMV0gKyAnLCcgKyBtWzJdICsgJywnICsgbVszXSArICcsJyArIG1bNF0gKyAnLCcgKyBtWzVdICsgJyknO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgVHJhbnNmb3JtIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kZWNvbXBvc2VkTWF0cml4ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm1NYXRyaXg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIGJpdG1hc2sgZmxhZyBmb3IgR2FtZU9iamVjdC5yZW5kZXJNYXNrXHJcbnZhciBfRkxBRyA9IDE7IC8vIDAwMDFcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHZpc2liaWxpdHkgb2YgYSBHYW1lIE9iamVjdC5cclxuICogU2hvdWxkIGJlIGFwcGxpZWQgYXMgYSBtaXhpbiBhbmQgbm90IHVzZWQgZGlyZWN0bHkuXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIFZpc2libGUgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgdmlzaWJsZSB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZSNfdmlzaWJsZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIF92aXNpYmxlOiB0cnVlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBBbiBpbnZpc2libGUgR2FtZSBPYmplY3Qgd2lsbCBza2lwIHJlbmRlcmluZywgYnV0IHdpbGwgc3RpbGwgcHJvY2VzcyB1cGRhdGUgbG9naWMuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGUjdmlzaWJsZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdmlzaWJsZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+X0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQW4gaW52aXNpYmxlIEdhbWUgT2JqZWN0IHdpbGwgc2tpcCByZW5kZXJpbmcsIGJ1dCB3aWxsIHN0aWxsIHByb2Nlc3MgdXBkYXRlIGxvZ2ljLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZSNzZXRWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWaXNpYmxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQWxwaGE6IHJlcXVpcmUoJy4vQWxwaGEnKSxcclxuICAgIEFscGhhU2luZ2xlOiByZXF1aXJlKCcuL0FscGhhU2luZ2xlJyksXHJcbiAgICBBbmltYXRpb246IHJlcXVpcmUoJy4vQW5pbWF0aW9uJyksXHJcbiAgICBCbGVuZE1vZGU6IHJlcXVpcmUoJy4vQmxlbmRNb2RlJyksXHJcbiAgICBDb21wdXRlZFNpemU6IHJlcXVpcmUoJy4vQ29tcHV0ZWRTaXplJyksXHJcbiAgICBDcm9wOiByZXF1aXJlKCcuL0Nyb3AnKSxcclxuICAgIERlcHRoOiByZXF1aXJlKCcuL0RlcHRoJyksXHJcbiAgICBGbGlwOiByZXF1aXJlKCcuL0ZsaXAnKSxcclxuICAgIEdldEJvdW5kczogcmVxdWlyZSgnLi9HZXRCb3VuZHMnKSxcclxuICAgIE1hc2s6IHJlcXVpcmUoJy4vTWFzaycpLFxyXG4gICAgT3JpZ2luOiByZXF1aXJlKCcuL09yaWdpbicpLFxyXG4gICAgUGF0aEZvbGxvd2VyOiByZXF1aXJlKCcuL1BhdGhGb2xsb3dlcicpLFxyXG4gICAgUGlwZWxpbmU6IHJlcXVpcmUoJy4vUGlwZWxpbmUnKSxcclxuICAgIFNjcm9sbEZhY3RvcjogcmVxdWlyZSgnLi9TY3JvbGxGYWN0b3InKSxcclxuICAgIFNpemU6IHJlcXVpcmUoJy4vU2l6ZScpLFxyXG4gICAgVGV4dHVyZTogcmVxdWlyZSgnLi9UZXh0dXJlJyksXHJcbiAgICBUZXh0dXJlQ3JvcDogcmVxdWlyZSgnLi9UZXh0dXJlQ3JvcCcpLFxyXG4gICAgVGludDogcmVxdWlyZSgnLi9UaW50JyksXHJcbiAgICBUb0pTT046IHJlcXVpcmUoJy4vVG9KU09OJyksXHJcbiAgICBUcmFuc2Zvcm06IHJlcXVpcmUoJy4vVHJhbnNmb3JtJyksXHJcbiAgICBUcmFuc2Zvcm1NYXRyaXg6IHJlcXVpcmUoJy4vVHJhbnNmb3JtTWF0cml4JyksXHJcbiAgICBWaXNpYmxlOiByZXF1aXJlKCcuL1Zpc2libGUnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmVsaXBlIEFsZm9uc28gPEBiaXRuZW5mZXI+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXJyYXlVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2FycmF5Jyk7XHJcbnZhciBCbGVuZE1vZGVzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvQmxlbmRNb2RlcycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL1JlY3RhbmdsZScpO1xyXG52YXIgUmVuZGVyID0gcmVxdWlyZSgnLi9Db250YWluZXJSZW5kZXInKTtcclxudmFyIFVuaW9uID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvVW5pb24nKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQ29udGFpbmVyIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBBIENvbnRhaW5lciwgYXMgdGhlIG5hbWUgaW1wbGllcywgY2FuICdjb250YWluJyBvdGhlciB0eXBlcyBvZiBHYW1lIE9iamVjdC5cclxuICogV2hlbiBhIEdhbWUgT2JqZWN0IGlzIGFkZGVkIHRvIGEgQ29udGFpbmVyLCB0aGUgQ29udGFpbmVyIGJlY29tZXMgcmVzcG9uc2libGUgZm9yIHRoZSByZW5kZXJpbmcgb2YgaXQuXHJcbiAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERpc3BsYXkgTGlzdCBhbmQgaW5zdGVhZCBhZGRlZCB0byB0aGUgQ29udGFpbmVycyBvd24gaW50ZXJuYWwgbGlzdC5cclxuICpcclxuICogVGhlIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBhdXRvbWF0aWNhbGx5IGJlY29tZXMgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBDb250YWluZXIuXHJcbiAqXHJcbiAqIFRoZSBvcmlnaW4gb2YgYSBDb250YWluZXIgaXMgMHgwIChpbiBsb2NhbCBzcGFjZSkgYW5kIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQuIFRoZSBjaGlsZHJlbiB5b3UgYWRkIHRvIHRoZVxyXG4gKiBDb250YWluZXIgc2hvdWxkIGJlIHBvc2l0aW9uZWQgd2l0aCB0aGlzIHZhbHVlIGluIG1pbmQuIEkuZS4geW91IHNob3VsZCB0cmVhdCAweDAgYXMgYmVpbmcgdGhlIGNlbnRlciBvZlxyXG4gKiB0aGUgQ29udGFpbmVyLCBhbmQgcG9zaXRpb24gY2hpbGRyZW4gcG9zaXRpdmVseSBhbmQgbmVnYXRpdmUgYXJvdW5kIGl0IGFzIHJlcXVpcmVkLlxyXG4gKlxyXG4gKiBXaGVuIHRoZSBDb250YWluZXIgaXMgcmVuZGVyZWQsIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIHJlbmRlcmVkIGFzIHdlbGwsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGV4aXN0XHJcbiAqIHdpdGhpbiB0aGUgQ29udGFpbmVyLiBDb250YWluZXIgY2hpbGRyZW4gY2FuIGJlIHJlcG9zaXRpb25lZCB1c2luZyBtZXRob2RzIHN1Y2ggYXMgYE1vdmVVcGAsIGBNb3ZlRG93bmAgYW5kIGBTZW5kVG9CYWNrYC5cclxuICpcclxuICogSWYgeW91IG1vZGlmeSBhIHRyYW5zZm9ybSBwcm9wZXJ0eSBvZiB0aGUgQ29udGFpbmVyLCBzdWNoIGFzIGBDb250YWluZXIueGAgb3IgYENvbnRhaW5lci5yb3RhdGlvbmAgdGhlbiBpdCB3aWxsXHJcbiAqIGF1dG9tYXRpY2FsbHkgaW5mbHVlbmNlIGFsbCBjaGlsZHJlbiBhcyB3ZWxsLlxyXG4gKlxyXG4gKiBDb250YWluZXJzIGNhbiBpbmNsdWRlIG90aGVyIENvbnRhaW5lcnMgZm9yIGRlZXBseSBuZXN0ZWQgdHJhbnNmb3Jtcy5cclxuICpcclxuICogQ29udGFpbmVycyBjYW4gaGF2ZSBtYXNrcyBzZXQgb24gdGhlbSBhbmQgY2FuIGJlIHVzZWQgYXMgYSBtYXNrIHRvby4gSG93ZXZlciwgQ29udGFpbmVyIGNoaWxkcmVuIGNhbm5vdCBiZSBtYXNrZWQuXHJcbiAqIFRoZSBtYXNrcyBkbyBub3QgJ3N0YWNrIHVwJy4gT25seSBhIENvbnRhaW5lciBvbiB0aGUgcm9vdCBvZiB0aGUgZGlzcGxheSBsaXN0IHdpbGwgdXNlIGl0cyBtYXNrLlxyXG4gKlxyXG4gKiBDb250YWluZXJzIGNhbiBiZSBlbmFibGVkIGZvciBpbnB1dC4gQmVjYXVzZSB0aGV5IGRvIG5vdCBoYXZlIGEgdGV4dHVyZSB5b3UgbmVlZCB0byBwcm92aWRlIGEgc2hhcGUgZm9yIHRoZW1cclxuICogdG8gdXNlIGFzIHRoZWlyIGhpdCBhcmVhLiBDb250YWluZXIgY2hpbGRyZW4gY2FuIGFsc28gYmUgZW5hYmxlZCBmb3IgaW5wdXQsIGluZGVwZW5kZW50IG9mIHRoZSBDb250YWluZXIuXHJcbiAqXHJcbiAqIENvbnRhaW5lcnMgY2FuIGJlIGdpdmVuIGEgcGh5c2ljcyBib2R5IGZvciBlaXRoZXIgQXJjYWRlIFBoeXNpY3MsIEltcGFjdCBQaHlzaWNzIG9yIE1hdHRlciBQaHlzaWNzLiBIb3dldmVyLFxyXG4gKiBpZiBDb250YWluZXIgX2NoaWxkcmVuXyBhcmUgZW5hYmxlZCBmb3IgcGh5c2ljcyB5b3UgbWF5IGdldCB1bmV4cGVjdGVkIHJlc3VsdHMsIHN1Y2ggYXMgb2Zmc2V0IGJvZGllcyxcclxuICogaWYgdGhlIENvbnRhaW5lciBpdHNlbGYsIG9yIGFueSBvZiBpdHMgYW5jZXN0b3JzLCBpcyBwb3NpdGlvbmVkIGFueXdoZXJlIG90aGVyIHRoYW4gYXQgMCB4IDAuIENvbnRhaW5lciBjaGlsZHJlblxyXG4gKiB3aXRoIHBoeXNpY3MgZG8gbm90IGZhY3RvciBpbiB0aGUgQ29udGFpbmVyIGR1ZSB0byB0aGUgZXhjZXNzaXZlIGV4dHJhIGNhbGN1bGF0aW9ucyBuZWVkZWQuIFBsZWFzZSBzdHJ1Y3R1cmVcclxuICogeW91ciBnYW1lIHRvIHdvcmsgYXJvdW5kIHRoaXMuXHJcbiAqXHJcbiAqIEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiB1c2luZyBDb250YWluZXJzLiBUaGV5IGFkZCBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgb3ZlcmhlYWQgaW50b1xyXG4gKiBldmVyeSBvbmUgb2YgdGhlaXIgY2hpbGRyZW4uIFRoZSBkZWVwZXIgeW91IG5lc3QgdGhlbSwgdGhlIG1vcmUgdGhlIGNvc3QgZXNjYWxhdGVzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZVxyXG4gKiBmb3IgaW5wdXQgZXZlbnRzLiBZb3UgYWxzbyBsb29zZSB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIGRpc3BsYXkgZGVwdGggb2YgQ29udGFpbmVyIGNoaWxkcmVuIGluIHRoZSBzYW1lXHJcbiAqIGZsZXhpYmxlIG1hbm5lciBhcyB0aG9zZSBub3Qgd2l0aGluIHRoZW0uIEluIHNob3J0LCBkb24ndCB1c2UgdGhlbSBmb3IgdGhlIHNha2Ugb2YgaXQuIFlvdSBwYXkgYSBzbWFsbCBjb3N0XHJcbiAqIGV2ZXJ5IHRpbWUgeW91IGNyZWF0ZSBvbmUsIHRyeSB0byBzdHJ1Y3R1cmUgeW91ciBnYW1lIGFyb3VuZCBhdm9pZGluZyB0aGF0IHdoZXJlIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAY2xhc3MgQ29udGFpbmVyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBbY2hpbGRyZW5dIC0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIGFkZCB0byB0aGlzIENvbnRhaW5lci5cclxuICovXHJcbnZhciBDb250YWluZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdhbWVPYmplY3QsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5BbHBoYVNpbmdsZSxcclxuICAgICAgICBDb21wb25lbnRzLkJsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzLkNvbXB1dGVkU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQ29udGFpbmVyIChzY2VuZSwgeCwgeSwgY2hpbGRyZW4pXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnQ29udGFpbmVyJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNsaXN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119XHJcbiAgICAgICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXN0ID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvZXMgdGhpcyBDb250YWluZXIgZXhjbHVzaXZlbHkgbWFuYWdlIGl0cyBjaGlsZHJlbj9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIGB0cnVlYCB3aGljaCBtZWFucyBhIGNoaWxkIGFkZGVkIHRvIHRoaXMgQ29udGFpbmVyIGNhbm5vdFxyXG4gICAgICAgICAqIGJlbG9uZyBpbiBhbm90aGVyIENvbnRhaW5lciwgd2hpY2ggaW5jbHVkZXMgdGhlIFNjZW5lIGRpc3BsYXkgbGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIHlvdSBkaXNhYmxlIHRoaXMgdGhlbiB0aGlzIENvbnRhaW5lciB3aWxsIG5vIGxvbmdlciBleGNsdXNpdmVseSBtYW5hZ2UgaXRzIGNoaWxkcmVuLlxyXG4gICAgICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYWxsIGtpbmRzIG9mIGludGVyZXN0aW5nIGdyYXBoaWNhbCBlZmZlY3RzLCBzdWNoIGFzIHJlcGxpY2F0aW5nXHJcbiAgICAgICAgICogR2FtZSBPYmplY3RzIHdpdGhvdXQgcmVwYXJlbnRpbmcgdGhlbSBhbGwgb3ZlciB0aGUgU2NlbmUuXHJcbiAgICAgICAgICogSG93ZXZlciwgZG9pbmcgc28gd2lsbCBwcmV2ZW50IGNoaWxkcmVuIGZyb20gcmVjZWl2aW5nIGFueSBraW5kIG9mIGlucHV0IGV2ZW50IG9yIGhhdmVcclxuICAgICAgICAgKiB0aGVpciBwaHlzaWNzIGJvZGllcyB3b3JrIGJ5IGRlZmF1bHQsIGFzIHRoZXkncmUgbm8gbG9uZ2VyIGEgc2luZ2xlIGVudGl0eSBvbiB0aGVcclxuICAgICAgICAgKiBkaXNwbGF5IGxpc3QsIGJ1dCBhcmUgYmVpbmcgcmVwbGljYXRlZCB3aGVyZS1ldmVyIHRoaXMgQ29udGFpbmVyIGlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNleGNsdXNpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5leGNsdXNpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb250YWluZXJzIGNhbiBoYXZlIGFuIG9wdGlvbmFsIG1heGltdW0gc2l6ZS4gSWYgc2V0IHRvIGFueXRoaW5nIGFib3ZlIDAgaXRcclxuICAgICAgICAgKiB3aWxsIGNvbnN0cmljdCB0aGUgYWRkaXRpb24gb2YgbmV3IEdhbWUgT2JqZWN0cyBpbnRvIHRoZSBDb250YWluZXIsIGNhcHBpbmcgb2ZmXHJcbiAgICAgICAgICogdGhlIG1heGltdW0gbGltaXQgdGhlIENvbnRhaW5lciBjYW4gZ3JvdyBpbiBzaXplIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNtYXhTaXplXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgLTFcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFNpemUgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgVHJhbnNmb3JtIE1hdHJpeCB1c2VkIGZvciBsb2NhbCBzcGFjZSBjb252ZXJzaW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNsb2NhbFRyYW5zZm9ybVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2NhbFRyYW5zZm9ybSA9IG5ldyBDb21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCB1c2VkIHRvIGF2b2lkIG9iamVjdCBjcmVhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjdGVtcFRyYW5zZm9ybU1hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRlbXBUcmFuc2Zvcm1NYXRyaXggPSBuZXcgQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIERpc3BsYXkgTGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjX2Rpc3BsYXlMaXN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5EaXNwbGF5TGlzdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlMaXN0ID0gc2NlbmUuc3lzLmRpc3BsYXlMaXN0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcHJvcGVydHkga2V5IHRvIHNvcnQgYnkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI19zb3J0S2V5XHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3NvcnRLZXkgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgRXZlbnQgRW1pdHRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjX3N5c0V2ZW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N5c0V2ZW50cyA9IHNjZW5lLnN5cy5ldmVudHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBob3Jpem9udGFsIHNjcm9sbCBmYWN0b3Igb2YgdGhpcyBDb250YWluZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgc2Nyb2xsIGZhY3RvciBjb250cm9scyB0aGUgaW5mbHVlbmNlIG9mIHRoZSBtb3ZlbWVudCBvZiBhIENhbWVyYSB1cG9uIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogV2hlbiBhIGNhbWVyYSBzY3JvbGxzIGl0IHdpbGwgY2hhbmdlIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyByZW5kZXJlZCBvbi1zY3JlZW4uXHJcbiAgICAgICAgICogSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBDb250YWluZXJzIGFjdHVhbCBwb3NpdGlvbiB2YWx1ZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogRm9yIGEgQ29udGFpbmVyLCBzZXR0aW5nIHRoaXMgdmFsdWUgd2lsbCBvbmx5IHVwZGF0ZSB0aGUgQ29udGFpbmVyIGl0c2VsZiwgbm90IGl0cyBjaGlsZHJlbi5cclxuICAgICAgICAgKiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIHNjcm9sbEZhY3RvciBvZiB0aGUgY2hpbGRyZW4gYXMgd2VsbCwgdXNlIHRoZSBgc2V0U2Nyb2xsRmFjdG9yYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBIHZhbHVlIG9mIDEgbWVhbnMgaXQgd2lsbCBtb3ZlIGV4YWN0bHkgaW4gc3luYyB3aXRoIGEgY2FtZXJhLlxyXG4gICAgICAgICAqIEEgdmFsdWUgb2YgMCBtZWFucyBpdCB3aWxsIG5vdCBtb3ZlIGF0IGFsbCwgZXZlbiBpZiB0aGUgY2FtZXJhIG1vdmVzLlxyXG4gICAgICAgICAqIE90aGVyIHZhbHVlcyBjb250cm9sIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGNhbWVyYSBtb3ZlbWVudCBpcyBtYXBwZWQgdG8gdGhpcyBDb250YWluZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgc2Nyb2xsIGZhY3RvciB2YWx1ZXMgb3RoZXIgdGhhbiAxIGFyZSBub3QgdGFrZW4gaW4gdG8gY29uc2lkZXJhdGlvbiB3aGVuXHJcbiAgICAgICAgICogY2FsY3VsYXRpbmcgcGh5c2ljcyBjb2xsaXNpb25zLiBCb2RpZXMgYWx3YXlzIGNvbGxpZGUgYmFzZWQgb24gdGhlaXIgd29ybGQgcG9zaXRpb24sIGJ1dCBjaGFuZ2luZ1xyXG4gICAgICAgICAqIHRoZSBzY3JvbGwgZmFjdG9yIGlzIGEgdmlzdWFsIGFkanVzdG1lbnQgdG8gd2hlcmUgdGhlIHRleHR1cmVzIGFyZSByZW5kZXJlZCwgd2hpY2ggY2FuIG9mZnNldFxyXG4gICAgICAgICAqIHRoZW0gZnJvbSBwaHlzaWNzIGJvZGllcyBpZiBub3QgYWNjb3VudGVkIGZvciBpbiB5b3VyIGNvZGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI3Njcm9sbEZhY3RvclhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgc2Nyb2xsIGZhY3RvciBvZiB0aGlzIENvbnRhaW5lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBzY3JvbGwgZmFjdG9yIGNvbnRyb2xzIHRoZSBpbmZsdWVuY2Ugb2YgdGhlIG1vdmVtZW50IG9mIGEgQ2FtZXJhIHVwb24gdGhpcyBDb250YWluZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBXaGVuIGEgY2FtZXJhIHNjcm9sbHMgaXQgd2lsbCBjaGFuZ2UgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIHJlbmRlcmVkIG9uLXNjcmVlbi5cclxuICAgICAgICAgKiBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIENvbnRhaW5lcnMgYWN0dWFsIHBvc2l0aW9uIHZhbHVlcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBGb3IgYSBDb250YWluZXIsIHNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIG9ubHkgdXBkYXRlIHRoZSBDb250YWluZXIgaXRzZWxmLCBub3QgaXRzIGNoaWxkcmVuLlxyXG4gICAgICAgICAqIElmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgc2Nyb2xsRmFjdG9yIG9mIHRoZSBjaGlsZHJlbiBhcyB3ZWxsLCB1c2UgdGhlIGBzZXRTY3JvbGxGYWN0b3JgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEEgdmFsdWUgb2YgMSBtZWFucyBpdCB3aWxsIG1vdmUgZXhhY3RseSBpbiBzeW5jIHdpdGggYSBjYW1lcmEuXHJcbiAgICAgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIGl0IHdpbGwgbm90IG1vdmUgYXQgYWxsLCBldmVuIGlmIHRoZSBjYW1lcmEgbW92ZXMuXHJcbiAgICAgICAgICogT3RoZXIgdmFsdWVzIGNvbnRyb2wgdGhlIGRlZ3JlZSB0byB3aGljaCB0aGUgY2FtZXJhIG1vdmVtZW50IGlzIG1hcHBlZCB0byB0aGlzIENvbnRhaW5lci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBzY3JvbGwgZmFjdG9yIHZhbHVlcyBvdGhlciB0aGFuIDEgYXJlIG5vdCB0YWtlbiBpbiB0byBjb25zaWRlcmF0aW9uIHdoZW5cclxuICAgICAgICAgKiBjYWxjdWxhdGluZyBwaHlzaWNzIGNvbGxpc2lvbnMuIEJvZGllcyBhbHdheXMgY29sbGlkZSBiYXNlZCBvbiB0aGVpciB3b3JsZCBwb3NpdGlvbiwgYnV0IGNoYW5naW5nXHJcbiAgICAgICAgICogdGhlIHNjcm9sbCBmYWN0b3IgaXMgYSB2aXN1YWwgYWRqdXN0bWVudCB0byB3aGVyZSB0aGUgdGV4dHVyZXMgYXJlIHJlbmRlcmVkLCB3aGljaCBjYW4gb2Zmc2V0XHJcbiAgICAgICAgICogdGhlbSBmcm9tIHBoeXNpY3MgYm9kaWVzIGlmIG5vdCBhY2NvdW50ZWQgZm9yIGluIHlvdXIgY29kZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjc2Nyb2xsRmFjdG9yWVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJBbHBoYSgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEJsZW5kTW9kZShCbGVuZE1vZGVzLlNLSVBfQ0hFQ0spO1xyXG5cclxuICAgICAgICBpZiAoY2hpbGRyZW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFkZChjaGlsZHJlbik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHZhbHVlIHRvIGFsbG93IENvbnRhaW5lcnMgdG8gYmUgdXNlZCBmb3IgaW5wdXQgYW5kIHBoeXNpY3MuXHJcbiAgICAgKiBEbyBub3QgY2hhbmdlIHRoaXMgdmFsdWUuIEl0IGhhcyBubyBlZmZlY3Qgb3RoZXIgdGhhbiB0byBicmVhayB0aGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNvcmlnaW5YXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqL1xyXG4gICAgb3JpZ2luWDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gMC41O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgdmFsdWUgdG8gYWxsb3cgQ29udGFpbmVycyB0byBiZSB1c2VkIGZvciBpbnB1dCBhbmQgcGh5c2ljcy5cclxuICAgICAqIERvIG5vdCBjaGFuZ2UgdGhpcyB2YWx1ZS4gSXQgaGFzIG5vIGVmZmVjdCBvdGhlciB0aGFuIHRvIGJyZWFrIHRoaW5ncy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI29yaWdpbllcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBvcmlnaW5ZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiAwLjU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB2YWx1ZSB0byBhbGxvdyBDb250YWluZXJzIHRvIGJlIHVzZWQgZm9yIGlucHV0IGFuZCBwaHlzaWNzLlxyXG4gICAgICogRG8gbm90IGNoYW5nZSB0aGlzIHZhbHVlLiBJdCBoYXMgbm8gZWZmZWN0IG90aGVyIHRoYW4gdG8gYnJlYWsgdGhpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZGlzcGxheU9yaWdpblhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBkaXNwbGF5T3JpZ2luWDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53aWR0aCAqIDAuNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHZhbHVlIHRvIGFsbG93IENvbnRhaW5lcnMgdG8gYmUgdXNlZCBmb3IgaW5wdXQgYW5kIHBoeXNpY3MuXHJcbiAgICAgKiBEbyBub3QgY2hhbmdlIHRoaXMgdmFsdWUuIEl0IGhhcyBubyBlZmZlY3Qgb3RoZXIgdGhhbiB0byBicmVhayB0aGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNkaXNwbGF5T3JpZ2luWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIGRpc3BsYXlPcmlnaW5ZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlaWdodCAqIDAuNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERvZXMgdGhpcyBDb250YWluZXIgZXhjbHVzaXZlbHkgbWFuYWdlIGl0cyBjaGlsZHJlbj9cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBgdHJ1ZWAgd2hpY2ggbWVhbnMgYSBjaGlsZCBhZGRlZCB0byB0aGlzIENvbnRhaW5lciBjYW5ub3RcclxuICAgICAqIGJlbG9uZyBpbiBhbm90aGVyIENvbnRhaW5lciwgd2hpY2ggaW5jbHVkZXMgdGhlIFNjZW5lIGRpc3BsYXkgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3UgZGlzYWJsZSB0aGlzIHRoZW4gdGhpcyBDb250YWluZXIgd2lsbCBubyBsb25nZXIgZXhjbHVzaXZlbHkgbWFuYWdlIGl0cyBjaGlsZHJlbi5cclxuICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYWxsIGtpbmRzIG9mIGludGVyZXN0aW5nIGdyYXBoaWNhbCBlZmZlY3RzLCBzdWNoIGFzIHJlcGxpY2F0aW5nXHJcbiAgICAgKiBHYW1lIE9iamVjdHMgd2l0aG91dCByZXBhcmVudGluZyB0aGVtIGFsbCBvdmVyIHRoZSBTY2VuZS5cclxuICAgICAqIEhvd2V2ZXIsIGRvaW5nIHNvIHdpbGwgcHJldmVudCBjaGlsZHJlbiBmcm9tIHJlY2VpdmluZyBhbnkga2luZCBvZiBpbnB1dCBldmVudCBvciBoYXZlXHJcbiAgICAgKiB0aGVpciBwaHlzaWNzIGJvZGllcyB3b3JrIGJ5IGRlZmF1bHQsIGFzIHRoZXkncmUgbm8gbG9uZ2VyIGEgc2luZ2xlIGVudGl0eSBvbiB0aGVcclxuICAgICAqIGRpc3BsYXkgbGlzdCwgYnV0IGFyZSBiZWluZyByZXBsaWNhdGVkIHdoZXJlLWV2ZXIgdGhpcyBDb250YWluZXIgaXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI3NldEV4Y2x1c2l2ZVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBUaGUgZXhjbHVzaXZlIHN0YXRlIG9mIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBzZXRFeGNsdXNpdmU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5leGNsdXNpdmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoaXMgQ29udGFpbmVyLiBJdCB3b3JrcyBieSBpdGVyYXRpbmcgYWxsIGNoaWxkcmVuIG9mIHRoZSBDb250YWluZXIsXHJcbiAgICAgKiBnZXR0aW5nIHRoZWlyIHJlc3BlY3RpdmUgYm91bmRzLCBhbmQgdGhlbiB3b3JraW5nIG91dCBhIG1pbi1tYXggcmVjdGFuZ2xlIGZyb20gdGhhdC5cclxuICAgICAqIEl0IGRvZXMgbm90IGZhY3RvciBpbiBpZiB0aGUgY2hpbGRyZW4gcmVuZGVyIG9yIG5vdCwgYWxsIGFyZSBpbmNsdWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBTb21lIGNoaWxkcmVuIGFyZSB1bmFibGUgdG8gcmV0dXJuIHRoZWlyIGJvdW5kcywgc3VjaCBhcyBHcmFwaGljcyBvYmplY3RzLCBpbiB3aGljaCBjYXNlXHJcbiAgICAgKiB0aGV5IGFyZSBza2lwcGVkLlxyXG4gICAgICpcclxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgcXVhbnRpdHkgb2YgY2hpbGRyZW4gaW4gdGhpcyBDb250YWluZXIgaXQgY291bGQgYmUgYSByZWFsbHkgZXhwZW5zaXZlIGNhbGwsXHJcbiAgICAgKiBzbyBjYWNoZSBpdCBhbmQgb25seSBwb2xsIGl0IGFzIG5lZWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgYW5kIHJldHVybmVkIGluIGEgUmVjdGFuZ2xlIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gW291dHB1dF0gLSBBIEdlb20uUmVjdGFuZ2xlIG9iamVjdCB0byBzdG9yZSB0aGUgdmFsdWVzIGluLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgUmVjdGFuZ2xlIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBvdXRwdXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uIChvdXRwdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dHB1dCA9PT0gdW5kZWZpbmVkKSB7IG91dHB1dCA9IG5ldyBSZWN0YW5nbGUoKTsgfVxyXG5cclxuICAgICAgICBvdXRwdXQuc2V0VG8odGhpcy54LCB0aGlzLnksIDAsIDApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFyZW50TWF0cml4ID0gdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0Qm91bmRzVHJhbnNmb3JtTWF0cml4KCk7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZFBvc2l0aW9uID0gcGFyZW50TWF0cml4LnRyYW5zZm9ybVBvaW50KHRoaXMueCwgdGhpcy55KTtcclxuICAgICAgICAgICAgb3V0cHV0LnNldFRvKHRyYW5zZm9ybWVkUG9zaXRpb24ueCwgdHJhbnNmb3JtZWRQb3NpdGlvbi55LCAwLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMubGlzdDtcclxuICAgICAgICAgICAgdmFyIHRlbXBSZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGZpcnN0Q2hpbGRCb3VuZHMgPSBjaGlsZHJlblswXS5nZXRCb3VuZHMoKTtcclxuICAgICAgICAgICAgb3V0cHV0LnNldFRvKGZpcnN0Q2hpbGRCb3VuZHMueCwgZmlyc3RDaGlsZEJvdW5kcy55LCBmaXJzdENoaWxkQm91bmRzLndpZHRoLCBmaXJzdENoaWxkQm91bmRzLmhlaWdodCk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IGNoaWxkcmVuW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRCb3VuZHMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0Qm91bmRzKHRlbXBSZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgVW5pb24odGVtcFJlY3QsIG91dHB1dCwgb3V0cHV0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBhZGQgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjYWRkSGFuZGxlclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMganVzdCBhZGRlZCB0byB0aGlzIENvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgYWRkSGFuZGxlcjogZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5vbmNlKEV2ZW50cy5ERVNUUk9ZLCB0aGlzLnJlbW92ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmV4Y2x1c2l2ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXlMaXN0LnJlbW92ZShnYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChnYW1lT2JqZWN0LnBhcmVudENvbnRhaW5lcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5wYXJlbnRDb250YWluZXIucmVtb3ZlKGdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnBhcmVudENvbnRhaW5lciA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHJlbW92ZSBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNyZW1vdmVIYW5kbGVyXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBqdXN0IHJlbW92ZWQgZnJvbSB0aGlzIENvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlSGFuZGxlcjogZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgZ2FtZU9iamVjdC5vZmYoRXZlbnRzLkRFU1RST1ksIHRoaXMucmVtb3ZlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXhjbHVzaXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5wYXJlbnRDb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIFBvaW50LWxpa2Ugb2JqZWN0LCBzdWNoIGFzIGEgVmVjdG9yMiwgR2VvbS5Qb2ludCBvciBvYmplY3Qgd2l0aCBwdWJsaWMgeCBhbmQgeSBwcm9wZXJ0aWVzLFxyXG4gICAgICogYW5kIHRyYW5zZm9ybXMgaXQgaW50byB0aGUgc3BhY2Ugb2YgdGhpcyBDb250YWluZXIsIHRoZW4gcmV0dXJucyBpdCBpbiB0aGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcG9pbnRUb0NvbnRhaW5lclxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fFBoYXNlci5HZW9tLlBvaW50fFBoYXNlci5NYXRoLlZlY3RvcjIpfSBzb3VyY2UgLSBUaGUgU291cmNlIFBvaW50IHRvIGJlIHRyYW5zZm9ybWVkLlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fFBoYXNlci5HZW9tLlBvaW50fFBoYXNlci5NYXRoLlZlY3RvcjIpfSBbb3V0cHV0XSAtIEEgZGVzdGluYXRpb24gb2JqZWN0IHRvIHN0b3JlIHRoZSB0cmFuc2Zvcm1lZCBwb2ludCBpbi4gSWYgbm9uZSBnaXZlbiBhIFZlY3RvcjIgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsob2JqZWN0fFBoYXNlci5HZW9tLlBvaW50fFBoYXNlci5NYXRoLlZlY3RvcjIpfSBUaGUgdHJhbnNmb3JtZWQgcG9pbnQuXHJcbiAgICAgKi9cclxuICAgIHBvaW50VG9Db250YWluZXI6IGZ1bmN0aW9uIChzb3VyY2UsIG91dHB1dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHsgb3V0cHV0ID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbnRhaW5lci5wb2ludFRvQ29udGFpbmVyKHNvdXJjZSwgb3V0cHV0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0cHV0ID0gbmV3IFZlY3RvcjIoc291cmNlLngsIHNvdXJjZS55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0ZW1wTWF0cml4ID0gdGhpcy50ZW1wVHJhbnNmb3JtTWF0cml4O1xyXG5cclxuICAgICAgICAvLyAgTm8gbmVlZCB0byBsb2FkSWRlbnRpdHkgYmVjYXVzZSBhcHBseUlUUlMgb3ZlcndyaXRlcyBldmVyeSB2YWx1ZSBhbnl3YXlcclxuICAgICAgICB0ZW1wTWF0cml4LmFwcGx5SVRSUyh0aGlzLngsIHRoaXMueSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5zY2FsZVgsIHRoaXMuc2NhbGVZKTtcclxuXHJcbiAgICAgICAgdGVtcE1hdHJpeC5pbnZlcnQoKTtcclxuXHJcbiAgICAgICAgdGVtcE1hdHJpeC50cmFuc2Zvcm1Qb2ludChzb3VyY2UueCwgc291cmNlLnksIG91dHB1dCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgd29ybGQgdHJhbnNmb3JtIG1hdHJpeCBhcyB1c2VkIGZvciBCb3VuZHMgY2hlY2tzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgbWF0cml4IGlzIHRlbXBvcmFsIGFuZCBzaG91bGRuJ3QgYmUgc3RvcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNnZXRCb3VuZHNUcmFuc2Zvcm1NYXRyaXhcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gVGhlIHdvcmxkIHRyYW5zZm9ybSBtYXRyaXguXHJcbiAgICAgKi9cclxuICAgIGdldEJvdW5kc1RyYW5zZm9ybU1hdHJpeDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRXb3JsZFRyYW5zZm9ybU1hdHJpeCh0aGlzLnRlbXBUcmFuc2Zvcm1NYXRyaXgsIHRoaXMubG9jYWxUcmFuc2Zvcm0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIEdhbWUgT2JqZWN0LCBvciBhcnJheSBvZiBHYW1lIE9iamVjdHMsIHRvIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEVhY2ggR2FtZSBPYmplY3QgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI2FkZFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCwgb3IgYXJyYXkgb2YgR2FtZSBPYmplY3RzLCB0byBhZGQgdG8gdGhlIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWRkOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5BZGQodGhpcy5saXN0LCBjaGlsZCwgdGhpcy5tYXhTaXplLCB0aGlzLmFkZEhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBHYW1lIE9iamVjdCwgb3IgYXJyYXkgb2YgR2FtZSBPYmplY3RzLCB0byB0aGlzIENvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEV4aXN0aW5nIEdhbWUgT2JqZWN0cyBpbiB0aGUgQ29udGFpbmVyIGFyZSBzaGlmdGVkIHVwLlxyXG4gICAgICpcclxuICAgICAqIEVhY2ggR2FtZSBPYmplY3QgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI2FkZEF0XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0LCBvciBhcnJheSBvZiBHYW1lIE9iamVjdHMsIHRvIGFkZCB0byB0aGUgQ29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBHYW1lIE9iamVjdC9zIGF0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBhZGRBdDogZnVuY3Rpb24gKGNoaWxkLCBpbmRleClcclxuICAgIHtcclxuICAgICAgICBBcnJheVV0aWxzLkFkZEF0KHRoaXMubGlzdCwgY2hpbGQsIGluZGV4LCB0aGlzLm1heFNpemUsIHRoaXMuYWRkSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIEdhbWUgT2JqZWN0IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0QXRcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgcG9zaXRpb24gdG8gZ2V0IHRoZSBHYW1lIE9iamVjdCBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIGBudWxsYCBpZiBub25lIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRBdDogZnVuY3Rpb24gKGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RbaW5kZXhdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBHYW1lIE9iamVjdCBpbiB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IHRvIHNlYXJjaCBmb3IgaW4gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGluZGV4IG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGlzIENvbnRhaW5lciwgb3IgLTEgaWYgbm90IGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRJbmRleDogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihjaGlsZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU29ydCB0aGUgY29udGVudHMgb2YgdGhpcyBDb250YWluZXIgc28gdGhlIGl0ZW1zIGFyZSBpbiBvcmRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkuXHJcbiAgICAgKiBGb3IgZXhhbXBsZTogYHNvcnQoJ2FscGhhJylgIHdvdWxkIHNvcnQgdGhlIGVsZW1lbnRzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGVpciBgYWxwaGFgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNzb3J0XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gbGV4aWNhbGx5IHNvcnQgYnkuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbaGFuZGxlcl0gLSBQcm92aWRlIHlvdXIgb3duIGN1c3RvbSBoYW5kbGVyIGZ1bmN0aW9uLiBXaWxsIHJlY2VpdmUgMiBjaGlsZHJlbiB3aGljaCBpdCBzaG91bGQgY29tcGFyZSBhbmQgcmV0dXJuIGEgYm9vbGVhbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc29ydDogZnVuY3Rpb24gKHByb3BlcnR5LCBoYW5kbGVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghcHJvcGVydHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBoYW5kbGVyID0gZnVuY3Rpb24gKGNoaWxkQSwgY2hpbGRCKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRBW3Byb3BlcnR5XSAtIGNoaWxkQltwcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBBcnJheVV0aWxzLlN0YWJsZVNvcnQuaW5wbGFjZSh0aGlzLmxpc3QsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgY2hpbGQgd2l0aCBpdHMgYG5hbWVgIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBhcmd1bWVudC5cclxuICAgICAqIFNob3VsZCBtb3JlIHRoYW4gb25lIGNoaWxkIGhhdmUgdGhlIHNhbWUgbmFtZSBvbmx5IHRoZSBmaXJzdCBpcyByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0QnlOYW1lXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIHRvIHNlYXJjaCBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgZmlyc3QgY2hpbGQgd2l0aCBhIG1hdGNoaW5nIG5hbWUsIG9yIGBudWxsYCBpZiBub25lIHdlcmUgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGdldEJ5TmFtZTogZnVuY3Rpb24gKG5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuR2V0Rmlyc3QodGhpcy5saXN0LCAnbmFtZScsIG5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gR2FtZSBPYmplY3QgZnJvbSB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0UmFuZG9tXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtsZW5ndGhdIC0gQW4gb3B0aW9uYWwgbGVuZ3RoLCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIChmcm9tIHRoZSBzdGFydEluZGV4KSB0byBjaG9vc2UgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IEEgcmFuZG9tIGNoaWxkIGZyb20gdGhlIENvbnRhaW5lciwgb3IgYG51bGxgIGlmIHRoZSBDb250YWluZXIgaXMgZW1wdHkuXHJcbiAgICAgKi9cclxuICAgIGdldFJhbmRvbTogZnVuY3Rpb24gKHN0YXJ0SW5kZXgsIGxlbmd0aClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5HZXRSYW5kb20odGhpcy5saXN0LCBzdGFydEluZGV4LCBsZW5ndGgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGZpcnN0IEdhbWUgT2JqZWN0IGluIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgcHJvcGVydHkgYW5kIHZhbHVlIHRvIHNlYXJjaCBmb3IsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdGhlIGZpcnN0XHJcbiAgICAgKiBHYW1lIE9iamVjdCBpbiB0aGlzIENvbnRhaW5lciB3aXRoIGEgbWF0Y2hpbmcgcHJvcGVydHkgYW5kIC8gb3IgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIGV4YW1wbGU6IGBnZXRGaXJzdCgndmlzaWJsZScsIHRydWUpYCB3b3VsZCByZXR1cm4gdGhlIGZpcnN0IEdhbWUgT2JqZWN0IHRoYXQgaGFkIGl0cyBgdmlzaWJsZWAgcHJvcGVydHkgc2V0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gbGltaXQgdGhlIHNlYXJjaCB0byB0aGUgYHN0YXJ0SW5kZXhgIC0gYGVuZEluZGV4YCByYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjZ2V0Rmlyc3RcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byB0ZXN0IG9uIGVhY2ggR2FtZSBPYmplY3QgaW4gdGhlIENvbnRhaW5lci5cclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdCB0aGUgcHJvcGVydHkgYWdhaW5zdC4gTXVzdCBwYXNzIGEgc3RyaWN0IChgPT09YCkgY29tcGFyaXNvbiBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0SW5kZXg9MF0gLSBBbiBvcHRpb25hbCBzdGFydCBpbmRleCB0byBzZWFyY2ggZnJvbS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2VuZEluZGV4PUNvbnRhaW5lci5sZW5ndGhdIC0gQW4gb3B0aW9uYWwgZW5kIGluZGV4IHRvIHNlYXJjaCB1cCB0byAoYnV0IG5vdCBpbmNsdWRlZClcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBmaXJzdCBtYXRjaGluZyBHYW1lIE9iamVjdCwgb3IgYG51bGxgIGlmIG5vbmUgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRGaXJzdDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuR2V0Rmlyc3QodGhpcy5saXN0LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCBHYW1lIE9iamVjdHMgaW4gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBtYXRjaGluZyBjcml0ZXJpYSB1c2luZyB0aGUgYHByb3BlcnR5YCBhbmQgYHZhbHVlYCBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIGV4YW1wbGU6IGBnZXRBbGwoJ2JvZHknKWAgd291bGQgcmV0dXJuIG9ubHkgR2FtZSBPYmplY3RzIHRoYXQgaGF2ZSBhIGJvZHkgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB2YWx1ZSB0byBjb21wYXJlIHRoZSBwcm9wZXJ0eSB0bzpcclxuICAgICAqXHJcbiAgICAgKiBgZ2V0QWxsKCd2aXNpYmxlJywgdHJ1ZSlgIHdvdWxkIHJldHVybiBvbmx5IEdhbWUgT2JqZWN0cyB0aGF0IGhhdmUgdGhlaXIgdmlzaWJsZSBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgLlxyXG4gICAgICpcclxuICAgICAqIE9wdGlvbmFsbHkgeW91IGNhbiBzcGVjaWZ5IGEgc3RhcnQgYW5kIGVuZCBpbmRleC4gRm9yIGV4YW1wbGUgaWYgdGhpcyBDb250YWluZXIgaGFkIDEwMCBHYW1lIE9iamVjdHMsXHJcbiAgICAgKiBhbmQgeW91IHNldCBgc3RhcnRJbmRleGAgdG8gMCBhbmQgYGVuZEluZGV4YCB0byA1MCwgaXQgd291bGQgcmV0dXJuIG1hdGNoZXMgZnJvbSBvbmx5XHJcbiAgICAgKiB0aGUgZmlyc3QgNTAgR2FtZSBPYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNnZXRBbGxcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gVGhlIHByb3BlcnR5IHRvIHRlc3Qgb24gZWFjaCBHYW1lIE9iamVjdCBpbiB0aGUgQ29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gLSBJZiBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGUgYHByb3BlcnR5YCBtdXN0IHN0cmljdGx5IGVxdWFsIHRoaXMgdmFsdWUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleD1Db250YWluZXIubGVuZ3RoXSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdXAgdG8gKGJ1dCBub3QgaW5jbHVkZWQpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgR2FtZSBPYmplY3RzIGZyb20gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIGdldEFsbDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuR2V0QWxsKHRoaXMubGlzdCwgcHJvcGVydHksIHZhbHVlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIEdhbWUgT2JqZWN0cyBpbiB0aGlzIENvbnRhaW5lciB0aGF0IGhhdmUgYSBwcm9wZXJ0eVxyXG4gICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlOiBgY291bnQoJ3Zpc2libGUnLCB0cnVlKWAgd291bGQgY291bnQgYWxsIHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgdGhlaXIgdmlzaWJsZSBwcm9wZXJ0eSBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IGxpbWl0IHRoZSBvcGVyYXRpb24gdG8gdGhlIGBzdGFydEluZGV4YCAtIGBlbmRJbmRleGAgcmFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI2NvdW50XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleD1Db250YWluZXIubGVuZ3RoXSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdXAgdG8gKGJ1dCBub3QgaW5jbHVkZWQpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBHYW1lIE9iamVjdHMgaW4gdGhpcyBDb250YWluZXIgd2l0aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgY291bnQ6IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBBcnJheVV0aWxzLkNvdW50QWxsTWF0Y2hpbmcodGhpcy5saXN0LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgcG9zaXRpb24gb2YgdHdvIEdhbWUgT2JqZWN0cyBpbiB0aGlzIENvbnRhaW5lci5cclxuICAgICAqIEJvdGggR2FtZSBPYmplY3RzIG11c3QgYmVsb25nIHRvIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNzd2FwXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZDEgLSBUaGUgZmlyc3QgR2FtZSBPYmplY3QgdG8gc3dhcC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkMiAtIFRoZSBzZWNvbmQgR2FtZSBPYmplY3QgdG8gc3dhcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc3dhcDogZnVuY3Rpb24gKGNoaWxkMSwgY2hpbGQyKVxyXG4gICAge1xyXG4gICAgICAgIEFycmF5VXRpbHMuU3dhcCh0aGlzLmxpc3QsIGNoaWxkMSwgY2hpbGQyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgYSBHYW1lIE9iamVjdCB0byBhIG5ldyBwb3NpdGlvbiB3aXRoaW4gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIEdhbWUgT2JqZWN0IG11c3QgYWxyZWFkeSBiZSBhIGNoaWxkIG9mIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBHYW1lIE9iamVjdCBpcyByZW1vdmVkIGZyb20gaXRzIG9sZCBwb3NpdGlvbiBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgbmV3IG9uZS5cclxuICAgICAqIFRoZXJlZm9yZSB0aGUgQ29udGFpbmVyIHNpemUgZG9lcyBub3QgY2hhbmdlLiBPdGhlciBjaGlsZHJlbiB3aWxsIGNoYW5nZSBwb3NpdGlvbiBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjbW92ZVRvXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCB0byBtb3ZlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0IGluIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG86IGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5Nb3ZlVG8odGhpcy5saXN0LCBjaGlsZCwgaW5kZXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBHYW1lIE9iamVjdCwgb3IgYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBmcm9tIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBHYW1lIE9iamVjdHMgbXVzdCBhbHJlYWR5IGJlIGNoaWxkcmVuIG9mIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBvcHRpb25hbGx5IGNhbGwgYGRlc3Ryb3lgIG9uIGVhY2ggR2FtZSBPYmplY3QgdGhhdCBpcyByZW1vdmVkIGZyb20gdGhlIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0LCBvciBhcnJheSBvZiBHYW1lIE9iamVjdHMsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgQ29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveUNoaWxkPWZhbHNlXSAtIE9wdGlvbmFsbHkgY2FsbCBgZGVzdHJveWAgb24gZWFjaCBjaGlsZCBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChjaGlsZCwgZGVzdHJveUNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXlVdGlscy5SZW1vdmUodGhpcy5saXN0LCBjaGlsZCwgdGhpcy5yZW1vdmVIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKGRlc3Ryb3lDaGlsZCAmJiByZW1vdmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlbW92ZWQpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVkID0gWyByZW1vdmVkIF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlZFtpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIEdhbWUgT2JqZWN0IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseSBjYWxsIGBkZXN0cm95YCBvbiB0aGUgR2FtZSBPYmplY3QsIGlmIG9uZSBpcyBmb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcmVtb3ZlQXRcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIEdhbWUgT2JqZWN0IHRvIGJlIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXN0cm95Q2hpbGQ9ZmFsc2VdIC0gT3B0aW9uYWxseSBjYWxsIGBkZXN0cm95YCBvbiB0aGUgR2FtZSBPYmplY3QgaWYgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChpbmRleCwgZGVzdHJveUNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXlVdGlscy5SZW1vdmVBdCh0aGlzLmxpc3QsIGluZGV4LCB0aGlzLnJlbW92ZUhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAoZGVzdHJveUNoaWxkICYmIHJlbW92ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZW1vdmVkLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIEdhbWUgT2JqZWN0cyBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMgaW4gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIG9wdGlvbmFsbHkgY2FsbCBgZGVzdHJveWAgb24gZWFjaCBHYW1lIE9iamVjdCB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNyZW1vdmVCZXR3ZWVuXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleD1Db250YWluZXIubGVuZ3RoXSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdXAgdG8gKGJ1dCBub3QgaW5jbHVkZWQpXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXN0cm95Q2hpbGQ9ZmFsc2VdIC0gT3B0aW9uYWxseSBjYWxsIGBkZXN0cm95YCBvbiBlYWNoIEdhbWUgT2JqZWN0IHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDb250YWluZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUJldHdlZW46IGZ1bmN0aW9uIChzdGFydEluZGV4LCBlbmRJbmRleCwgZGVzdHJveUNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXlVdGlscy5SZW1vdmVCZXR3ZWVuKHRoaXMubGlzdCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRoaXMucmVtb3ZlSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChkZXN0cm95Q2hpbGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW92ZWQubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZWRbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBHYW1lIE9iamVjdHMgZnJvbSB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseSBjYWxsIGBkZXN0cm95YCBvbiBlYWNoIEdhbWUgT2JqZWN0IHRoYXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI3JlbW92ZUFsbFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveUNoaWxkPWZhbHNlXSAtIE9wdGlvbmFsbHkgY2FsbCBgZGVzdHJveWAgb24gZWFjaCBHYW1lIE9iamVjdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGw6IGZ1bmN0aW9uIChkZXN0cm95Q2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlbW92ZWQgPSBBcnJheVV0aWxzLlJlbW92ZUJldHdlZW4odGhpcy5saXN0LCAwLCB0aGlzLmxpc3QubGVuZ3RoLCB0aGlzLnJlbW92ZUhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAoZGVzdHJveUNoaWxkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdmVkLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVkW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJpbmdzIHRoZSBnaXZlbiBHYW1lIE9iamVjdCB0byB0aGUgdG9wIG9mIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICogVGhpcyB3aWxsIGNhdXNlIGl0IHRvIHJlbmRlciBvbi10b3Agb2YgYW55IG90aGVyIG9iamVjdHMgaW4gdGhlIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjYnJpbmdUb1RvcFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgdG8gYnJpbmcgdG8gdGhlIHRvcCBvZiB0aGUgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBicmluZ1RvVG9wOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5CcmluZ1RvVG9wKHRoaXMubGlzdCwgY2hpbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gR2FtZSBPYmplY3QgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIENvbnRhaW5lci5cclxuICAgICAqIFRoaXMgd2lsbCBjYXVzZSBpdCB0byByZW5kZXIgYmVsb3cgYW55IG90aGVyIG9iamVjdHMgaW4gdGhlIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjc2VuZFRvQmFja1xyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgdG8gc2VuZCB0byB0aGUgYm90dG9tIG9mIHRoZSBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDb250YWluZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNlbmRUb0JhY2s6IGZ1bmN0aW9uIChjaGlsZClcclxuICAgIHtcclxuICAgICAgICBBcnJheVV0aWxzLlNlbmRUb0JhY2sodGhpcy5saXN0LCBjaGlsZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBnaXZlbiBHYW1lIE9iamVjdCB1cCBvbmUgcGxhY2UgaW4gdGhpcyBDb250YWluZXIsIHVubGVzcyBpdCdzIGFscmVhZHkgYXQgdGhlIHRvcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjbW92ZVVwXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCB0byBiZSBtb3ZlZCBpbiB0aGUgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBtb3ZlVXA6IGZ1bmN0aW9uIChjaGlsZClcclxuICAgIHtcclxuICAgICAgICBBcnJheVV0aWxzLk1vdmVVcCh0aGlzLmxpc3QsIGNoaWxkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGdpdmVuIEdhbWUgT2JqZWN0IGRvd24gb25lIHBsYWNlIGluIHRoaXMgQ29udGFpbmVyLCB1bmxlc3MgaXQncyBhbHJlYWR5IGF0IHRoZSBib3R0b20uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI21vdmVEb3duXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCB0byBiZSBtb3ZlZCBpbiB0aGUgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ29udGFpbmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBtb3ZlRG93bjogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIEFycmF5VXRpbHMuTW92ZURvd24odGhpcy5saXN0LCBjaGlsZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiBhbGwgR2FtZSBPYmplY3RzIGluIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNyZXZlcnNlXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxpc3QucmV2ZXJzZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHVmZmxlcyB0aGUgYWxsIEdhbWUgT2JqZWN0cyBpbiB0aGlzIENvbnRhaW5lciB1c2luZyB0aGUgRmlzaGVyLVlhdGVzIGltcGxlbWVudGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNzaHVmZmxlXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2h1ZmZsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBBcnJheVV0aWxzLlNodWZmbGUodGhpcy5saXN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBHYW1lIE9iamVjdCBpbiB0aGlzIENvbnRhaW5lciB3aXRoIHRoZSBuZXcgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgbmV3IEdhbWUgT2JqZWN0IGNhbm5vdCBhbHJlYWR5IGJlIGEgY2hpbGQgb2YgdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI3JlcGxhY2VcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG9sZENoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IGluIHRoaXMgQ29udGFpbmVyIHRoYXQgd2lsbCBiZSByZXBsYWNlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG5ld0NoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveUNoaWxkPWZhbHNlXSAtIE9wdGlvbmFsbHkgY2FsbCBgZGVzdHJveWAgb24gdGhlIEdhbWUgT2JqZWN0IGlmIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDb250YWluZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2U6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbmV3Q2hpbGQsIGRlc3Ryb3lDaGlsZClcclxuICAgIHtcclxuICAgICAgICB2YXIgbW92ZWQgPSBBcnJheVV0aWxzLlJlcGxhY2UodGhpcy5saXN0LCBvbGRDaGlsZCwgbmV3Q2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAobW92ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIobmV3Q2hpbGQpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhhbmRsZXIob2xkQ2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRlc3Ryb3lDaGlsZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gR2FtZSBPYmplY3QgaXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBjaGVjayBkb2VzIG5vdCBzY2FuIG5lc3RlZCBDb250YWluZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNleGlzdHNcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IHRvIGNoZWNrIGZvciB3aXRoaW4gdGhpcyBDb250YWluZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgR2FtZSBPYmplY3QgaXMgYW4gaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgQ29udGFpbmVyLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0czogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5saXN0LmluZGV4T2YoY2hpbGQpID4gLTEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZSBvbiBhbGwgR2FtZSBPYmplY3RzIGluIHRoaXMgQ29udGFpbmVyLlxyXG4gICAgICpcclxuICAgICAqIE9wdGlvbmFsbHkgeW91IGNhbiBzcGVjaWZ5IGEgc3RhcnQgYW5kIGVuZCBpbmRleC4gRm9yIGV4YW1wbGUgaWYgdGhpcyBDb250YWluZXIgaGFkIDEwMCBHYW1lIE9iamVjdHMsXHJcbiAgICAgKiBhbmQgeW91IHNldCBgc3RhcnRJbmRleGAgdG8gMCBhbmQgYGVuZEluZGV4YCB0byA1MCwgaXQgd291bGQgcmV0dXJuIG1hdGNoZXMgZnJvbSBvbmx5XHJcbiAgICAgKiB0aGUgZmlyc3QgNTAgR2FtZSBPYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNzZXRBbGxcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0aGF0IG11c3QgZXhpc3Qgb24gdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGdldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleD1Db250YWluZXIubGVuZ3RoXSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdXAgdG8gKGJ1dCBub3QgaW5jbHVkZWQpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDb250YWluZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEFsbDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5TZXRBbGwodGhpcy5saXN0LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGNhbGxiYWNrIEVhY2hDb250YWluZXJDYWxsYmFja1xyXG4gICAgICogQGdlbmVyaWMgSSAtIFtpdGVtXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gaXRlbSAtIFRoZSBjaGlsZCBHYW1lIE9iamVjdCBvZiB0aGUgQ29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgYWZ0ZXIgdGhlIGNoaWxkLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgYWxsIEdhbWUgT2JqZWN0cyBpbiB0aGlzIENvbnRhaW5lciB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQSBjb3B5IG9mIHRoZSBDb250YWluZXIgaXMgbWFkZSBiZWZvcmUgcGFzc2luZyBlYWNoIGVudHJ5IHRvIHlvdXIgY2FsbGJhY2suXHJcbiAgICAgKiBUaGlzIHByb3RlY3RzIGFnYWluc3QgdGhlIGNhbGxiYWNrIGl0c2VsZiBtb2RpZnlpbmcgdGhlIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3Uga25vdyBmb3Igc3VyZSB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgdGhpcyBDb250YWluZXJcclxuICAgICAqIHRoZW4geW91IGNhbiB1c2UgdGhlIG1vcmUgcGVyZm9ybWFudCBgQ29udGFpbmVyLml0ZXJhdGVgIG1ldGhvZCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNlYWNoXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgY2FsbGJhY2suXHJcbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLCBhZnRlciB0aGUgY2hpbGQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDb250YWluZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICB2YXIgYXJncyA9IFsgbnVsbCBdO1xyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciB0ZW1wID0gdGhpcy5saXN0LnNsaWNlKCk7XHJcbiAgICAgICAgdmFyIGxlbiA9IHRlbXAubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzWzBdID0gdGVtcFtpXTtcclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzc2VzIGFsbCBHYW1lIE9iamVjdHMgaW4gdGhpcyBDb250YWluZXIgdG8gdGhlIGdpdmVuIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIE9ubHkgdXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IGFic29sdXRlbHkga25vdyB0aGF0IHRoZSBDb250YWluZXIgd2lsbCBub3QgYmUgbW9kaWZpZWQgZHVyaW5nXHJcbiAgICAgKiB0aGUgaXRlcmF0aW9uLCBpLmUuIGJ5IHJlbW92aW5nIG9yIGFkZGluZyB0byBpdHMgY29udGVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI2l0ZXJhdGVcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2ssIGFmdGVyIHRoZSBjaGlsZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENvbnRhaW5lciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgaXRlcmF0ZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhcmdzID0gWyBudWxsIF07XHJcbiAgICAgICAgdmFyIGk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzWzBdID0gdGhpcy5saXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzY3JvbGwgZmFjdG9yIG9mIHRoaXMgQ29udGFpbmVyIGFuZCBvcHRpb25hbGx5IGFsbCBvZiBpdHMgY2hpbGRyZW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHNjcm9sbCBmYWN0b3IgY29udHJvbHMgdGhlIGluZmx1ZW5jZSBvZiB0aGUgbW92ZW1lbnQgb2YgYSBDYW1lcmEgdXBvbiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gYSBjYW1lcmEgc2Nyb2xscyBpdCB3aWxsIGNoYW5nZSB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJlZCBvbi1zY3JlZW4uXHJcbiAgICAgKiBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIEdhbWUgT2JqZWN0cyBhY3R1YWwgcG9zaXRpb24gdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEEgdmFsdWUgb2YgMSBtZWFucyBpdCB3aWxsIG1vdmUgZXhhY3RseSBpbiBzeW5jIHdpdGggYSBjYW1lcmEuXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgaXQgd2lsbCBub3QgbW92ZSBhdCBhbGwsIGV2ZW4gaWYgdGhlIGNhbWVyYSBtb3Zlcy5cclxuICAgICAqIE90aGVyIHZhbHVlcyBjb250cm9sIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIGNhbWVyYSBtb3ZlbWVudCBpcyBtYXBwZWQgdG8gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgc2Nyb2xsIGZhY3RvciB2YWx1ZXMgb3RoZXIgdGhhbiAxIGFyZSBub3QgdGFrZW4gaW4gdG8gY29uc2lkZXJhdGlvbiB3aGVuXHJcbiAgICAgKiBjYWxjdWxhdGluZyBwaHlzaWNzIGNvbGxpc2lvbnMuIEJvZGllcyBhbHdheXMgY29sbGlkZSBiYXNlZCBvbiB0aGVpciB3b3JsZCBwb3NpdGlvbiwgYnV0IGNoYW5naW5nXHJcbiAgICAgKiB0aGUgc2Nyb2xsIGZhY3RvciBpcyBhIHZpc3VhbCBhZGp1c3RtZW50IHRvIHdoZXJlIHRoZSB0ZXh0dXJlcyBhcmUgcmVuZGVyZWQsIHdoaWNoIGNhbiBvZmZzZXRcclxuICAgICAqIHRoZW0gZnJvbSBwaHlzaWNzIGJvZGllcyBpZiBub3QgYWNjb3VudGVkIGZvciBpbiB5b3VyIGNvZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI3NldFNjcm9sbEZhY3RvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgZmFjdG9yIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgc2Nyb2xsIGZhY3RvciBvZiB0aGlzIEdhbWUgT2JqZWN0LiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHRoZSBgeGAgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVDaGlsZHJlbj1mYWxzZV0gLSBBcHBseSB0aGlzIHNjcm9sbEZhY3RvciB0byBhbGwgQ29udGFpbmVyIGNoaWxkcmVuIGFzIHdlbGw/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2Nyb2xsRmFjdG9yOiBmdW5jdGlvbiAoeCwgeSwgdXBkYXRlQ2hpbGRyZW4pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0geDsgfVxyXG4gICAgICAgIGlmICh1cGRhdGVDaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZUNoaWxkcmVuID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxGYWN0b3JYID0geDtcclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB5O1xyXG5cclxuICAgICAgICBpZiAodXBkYXRlQ2hpbGRyZW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBBcnJheVV0aWxzLlNldEFsbCh0aGlzLmxpc3QsICdzY3JvbGxGYWN0b3JYJywgeCk7XHJcbiAgICAgICAgICAgIEFycmF5VXRpbHMuU2V0QWxsKHRoaXMubGlzdCwgJ3Njcm9sbEZhY3RvclknLCB5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2YgR2FtZSBPYmplY3RzIGluc2lkZSB0aGlzIENvbnRhaW5lci5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI2xlbmd0aFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBsZW5ndGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBHYW1lIE9iamVjdCB3aXRoaW4gdGhlIENvbnRhaW5lciwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gbW92ZSB0aGUgY3Vyc29yIGJ5IGNhbGxpbmcgYENvbnRhaW5lci5uZXh0YCBhbmQgYENvbnRhaW5lci5wcmV2aW91c2AuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkNvbnRhaW5lciNmaXJzdFxyXG4gICAgICogQHR5cGUgez9QaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIGZpcnN0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgR2FtZSBPYmplY3Qgd2l0aGluIHRoZSBDb250YWluZXIsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIG1vdmUgdGhlIGN1cnNvciBieSBjYWxsaW5nIGBDb250YWluZXIubmV4dGAgYW5kIGBDb250YWluZXIucHJldmlvdXNgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjbGFzdFxyXG4gICAgICogQHR5cGUgez9QaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKi9cclxuICAgIGxhc3Q6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5saXN0Lmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFt0aGlzLnBvc2l0aW9uXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IEdhbWUgT2JqZWN0IHdpdGhpbiB0aGUgQ29udGFpbmVyLCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBtb3ZlIHRoZSBjdXJzb3IgYnkgY2FsbGluZyBgQ29udGFpbmVyLm5leHRgIGFuZCBgQ29udGFpbmVyLnByZXZpb3VzYC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyI25leHRcclxuICAgICAqIEB0eXBlIHs/UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBuZXh0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5saXN0Lmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbisrO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RbdGhpcy5wb3NpdGlvbl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgR2FtZSBPYmplY3Qgd2l0aGluIHRoZSBDb250YWluZXIsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIG1vdmUgdGhlIGN1cnNvciBieSBjYWxsaW5nIGBDb250YWluZXIubmV4dGAgYW5kIGBDb250YWluZXIucHJldmlvdXNgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcHJldmlvdXNcclxuICAgICAqIEB0eXBlIHs/UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICovXHJcbiAgICBwcmV2aW91czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24tLTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0W3RoaXMucG9zaXRpb25dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGRlc3Ryb3kgaGFuZGxlciwgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlc3Ryb3kgcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcHJlRGVzdHJveVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgKi9cclxuICAgIHByZURlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGwoISF0aGlzLmV4Y2x1c2l2ZSk7XHJcblxyXG4gICAgICAgIHRoaXMubG9jYWxUcmFuc2Zvcm0uZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMudGVtcFRyYW5zZm9ybU1hdHJpeC5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlMaXN0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWluZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyfSBjb250YWluZXIgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgQ29udGFpbmVyQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIGNvbnRhaW5lciwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgY2hpbGRyZW4gPSBjb250YWluZXIubGlzdDtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdHJhbnNmb3JtTWF0cml4ID0gY29udGFpbmVyLmxvY2FsVHJhbnNmb3JtO1xyXG4gICAgXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeC5sb2FkSWRlbnRpdHkoKTtcclxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXgubXVsdGlwbHkocGFyZW50TWF0cml4KTtcclxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXgudHJhbnNsYXRlKGNvbnRhaW5lci54LCBjb250YWluZXIueSk7XHJcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4LnJvdGF0ZShjb250YWluZXIucm90YXRpb24pO1xyXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeC5zY2FsZShjb250YWluZXIuc2NhbGVYLCBjb250YWluZXIuc2NhbGVZKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXguYXBwbHlJVFJTKGNvbnRhaW5lci54LCBjb250YWluZXIueSwgY29udGFpbmVyLnJvdGF0aW9uLCBjb250YWluZXIuc2NhbGVYLCBjb250YWluZXIuc2NhbGVZKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY29udGFpbmVySGFzQmxlbmRNb2RlID0gKGNvbnRhaW5lci5ibGVuZE1vZGUgIT09IC0xKTtcclxuXHJcbiAgICBpZiAoIWNvbnRhaW5lckhhc0JsZW5kTW9kZSlcclxuICAgIHtcclxuICAgICAgICAvLyAgSWYgQ29udGFpbmVyIGlzIFNLSVBfVEVTVCB0aGVuIHNldCBibGVuZCBtb2RlIHRvIGJlIE5vcm1hbFxyXG4gICAgICAgIHJlbmRlcmVyLnNldEJsZW5kTW9kZSgwKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYWxwaGEgPSBjb250YWluZXIuX2FscGhhO1xyXG4gICAgdmFyIHNjcm9sbEZhY3RvclggPSBjb250YWluZXIuc2Nyb2xsRmFjdG9yWDtcclxuICAgIHZhciBzY3JvbGxGYWN0b3JZID0gY29udGFpbmVyLnNjcm9sbEZhY3Rvclk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZC53aWxsUmVuZGVyKGNhbWVyYSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjaGlsZEFscGhhID0gY2hpbGQuYWxwaGE7XHJcbiAgICAgICAgdmFyIGNoaWxkU2Nyb2xsRmFjdG9yWCA9IGNoaWxkLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgdmFyIGNoaWxkU2Nyb2xsRmFjdG9yWSA9IGNoaWxkLnNjcm9sbEZhY3Rvclk7XHJcblxyXG4gICAgICAgIGlmICghY29udGFpbmVySGFzQmxlbmRNb2RlICYmIGNoaWxkLmJsZW5kTW9kZSAhPT0gcmVuZGVyZXIuY3VycmVudEJsZW5kTW9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBDb250YWluZXIgZG9lc24ndCBoYXZlIGl0cyBvd24gYmxlbmQgbW9kZSwgdGhlbiBhIGNoaWxkIGNhbiBoYXZlIG9uZVxyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRCbGVuZE1vZGUoY2hpbGQuYmxlbmRNb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBTZXQgcGFyZW50IHZhbHVlc1xyXG4gICAgICAgIGNoaWxkLnNldFNjcm9sbEZhY3RvcihjaGlsZFNjcm9sbEZhY3RvclggKiBzY3JvbGxGYWN0b3JYLCBjaGlsZFNjcm9sbEZhY3RvclkgKiBzY3JvbGxGYWN0b3JZKTtcclxuICAgICAgICBjaGlsZC5zZXRBbHBoYShjaGlsZEFscGhhICogYWxwaGEpO1xyXG5cclxuICAgICAgICAvLyAgUmVuZGVyXHJcbiAgICAgICAgY2hpbGQucmVuZGVyQ2FudmFzKHJlbmRlcmVyLCBjaGlsZCwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgdHJhbnNmb3JtTWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWVzXHJcbiAgICAgICAgY2hpbGQuc2V0QWxwaGEoY2hpbGRBbHBoYSk7XHJcbiAgICAgICAgY2hpbGQuc2V0U2Nyb2xsRmFjdG9yKGNoaWxkU2Nyb2xsRmFjdG9yWCwgY2hpbGRTY3JvbGxGYWN0b3JZKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbmVyQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0J1aWxkR2FtZU9iamVjdCcpO1xyXG52YXIgQ29udGFpbmVyID0gcmVxdWlyZSgnLi9Db250YWluZXInKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQ29udGFpbmVyIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBDb250YWluZXIgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI2NvbnRhaW5lclxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdjb250YWluZXInLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICB2YXIgeCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAneCcsIDApO1xyXG4gICAgdmFyIHkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3knLCAwKTtcclxuXHJcbiAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcih0aGlzLnNjZW5lLCB4LCB5KTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdCh0aGlzLnNjZW5lLCBjb250YWluZXIsIGNvbmZpZyk7XHJcbiAgICBcclxuICAgIHJldHVybiBjb250YWluZXI7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBGZWxpcGUgQWxmb25zbyA8QGJpdG5lbmZlcj5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb250YWluZXIgPSByZXF1aXJlKCcuL0NvbnRhaW5lcicpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQ29udGFpbmVyIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQ29udGFpbmVyIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNjb250YWluZXJcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IFtjaGlsZHJlbl0gLSBBbiBvcHRpb25hbCBhcnJheSBvZiBHYW1lIE9iamVjdHMgdG8gYWRkIHRvIHRoaXMgQ29udGFpbmVyLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29udGFpbmVyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdjb250YWluZXInLCBmdW5jdGlvbiAoeCwgeSwgY2hpbGRyZW4pXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgQ29udGFpbmVyKHRoaXMuc2NlbmUsIHgsIHksIGNoaWxkcmVuKSk7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBGZWxpcGUgQWxmb25zbyA8QGJpdG5lbmZlcj5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9Db250YWluZXJXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0NvbnRhaW5lckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBGZWxpcGUgQWxmb25zbyA8QGJpdG5lbmZlcj5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXIjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db250YWluZXJ9IGNvbnRhaW5lciAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBDb250YWluZXJXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBjb250YWluZXIsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGNoaWxkcmVuID0gY29udGFpbmVyLmxpc3Q7XHJcblxyXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHRyYW5zZm9ybU1hdHJpeCA9IGNvbnRhaW5lci5sb2NhbFRyYW5zZm9ybTtcclxuICAgIFxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXgubG9hZElkZW50aXR5KCk7XHJcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4Lm11bHRpcGx5KHBhcmVudE1hdHJpeCk7XHJcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4LnRyYW5zbGF0ZShjb250YWluZXIueCwgY29udGFpbmVyLnkpO1xyXG4gICAgICAgIHRyYW5zZm9ybU1hdHJpeC5yb3RhdGUoY29udGFpbmVyLnJvdGF0aW9uKTtcclxuICAgICAgICB0cmFuc2Zvcm1NYXRyaXguc2NhbGUoY29udGFpbmVyLnNjYWxlWCwgY29udGFpbmVyLnNjYWxlWSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4LmFwcGx5SVRSUyhjb250YWluZXIueCwgY29udGFpbmVyLnksIGNvbnRhaW5lci5yb3RhdGlvbiwgY29udGFpbmVyLnNjYWxlWCwgY29udGFpbmVyLnNjYWxlWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNvbnRhaW5lckhhc0JsZW5kTW9kZSA9IChjb250YWluZXIuYmxlbmRNb2RlICE9PSAtMSk7XHJcblxyXG4gICAgaWYgKCFjb250YWluZXJIYXNCbGVuZE1vZGUpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIElmIENvbnRhaW5lciBpcyBTS0lQX1RFU1QgdGhlbiBzZXQgYmxlbmQgbW9kZSB0byBiZSBOb3JtYWxcclxuICAgICAgICByZW5kZXJlci5zZXRCbGVuZE1vZGUoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGFscGhhID0gY29udGFpbmVyLmFscGhhO1xyXG5cclxuICAgIHZhciBzY3JvbGxGYWN0b3JYID0gY29udGFpbmVyLnNjcm9sbEZhY3Rvclg7XHJcbiAgICB2YXIgc2Nyb2xsRmFjdG9yWSA9IGNvbnRhaW5lci5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgIHZhciBsaXN0ID0gY2hpbGRyZW47XHJcbiAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZC53aWxsUmVuZGVyKGNhbWVyYSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjaGlsZEFscGhhVG9wTGVmdDtcclxuICAgICAgICB2YXIgY2hpbGRBbHBoYVRvcFJpZ2h0O1xyXG4gICAgICAgIHZhciBjaGlsZEFscGhhQm90dG9tTGVmdDtcclxuICAgICAgICB2YXIgY2hpbGRBbHBoYUJvdHRvbVJpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoY2hpbGQuYWxwaGFUb3BMZWZ0ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZEFscGhhVG9wTGVmdCA9IGNoaWxkLmFscGhhVG9wTGVmdDtcclxuICAgICAgICAgICAgY2hpbGRBbHBoYVRvcFJpZ2h0ID0gY2hpbGQuYWxwaGFUb3BSaWdodDtcclxuICAgICAgICAgICAgY2hpbGRBbHBoYUJvdHRvbUxlZnQgPSBjaGlsZC5hbHBoYUJvdHRvbUxlZnQ7XHJcbiAgICAgICAgICAgIGNoaWxkQWxwaGFCb3R0b21SaWdodCA9IGNoaWxkLmFscGhhQm90dG9tUmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZEFscGhhID0gY2hpbGQuYWxwaGE7XHJcblxyXG4gICAgICAgICAgICBjaGlsZEFscGhhVG9wTGVmdCA9IGNoaWxkQWxwaGE7XHJcbiAgICAgICAgICAgIGNoaWxkQWxwaGFUb3BSaWdodCA9IGNoaWxkQWxwaGE7XHJcbiAgICAgICAgICAgIGNoaWxkQWxwaGFCb3R0b21MZWZ0ID0gY2hpbGRBbHBoYTtcclxuICAgICAgICAgICAgY2hpbGRBbHBoYUJvdHRvbVJpZ2h0ID0gY2hpbGRBbHBoYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjaGlsZFNjcm9sbEZhY3RvclggPSBjaGlsZC5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHZhciBjaGlsZFNjcm9sbEZhY3RvclkgPSBjaGlsZC5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICBpZiAoIWNvbnRhaW5lckhhc0JsZW5kTW9kZSAmJiBjaGlsZC5ibGVuZE1vZGUgIT09IHJlbmRlcmVyLmN1cnJlbnRCbGVuZE1vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgQ29udGFpbmVyIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGJsZW5kIG1vZGUsIHRoZW4gYSBjaGlsZCBjYW4gaGF2ZSBvbmVcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QmxlbmRNb2RlKGNoaWxkLmJsZW5kTW9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbWFzayA9IGNoaWxkLm1hc2s7XHJcblxyXG4gICAgICAgIGlmIChtYXNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWFzay5wcmVSZW5kZXJXZWJHTChyZW5kZXJlciwgY2hpbGQsIGNhbWVyYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdHlwZSA9IGNoaWxkLnR5cGU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlICE9PSByZW5kZXJlci5jdXJyZW50VHlwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLm5ld1R5cGUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZW5kZXJlci5jdXJyZW50VHlwZSA9IHR5cGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXJlci5uZXh0VHlwZU1hdGNoID0gKGkgPCBjaGlsZENvdW50IC0gMSkgPyAobGlzdFtpICsgMV0udHlwZSA9PT0gcmVuZGVyZXIuY3VycmVudFR5cGUpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIC8vICBTZXQgcGFyZW50IHZhbHVlc1xyXG4gICAgICAgIGNoaWxkLnNldFNjcm9sbEZhY3RvcihjaGlsZFNjcm9sbEZhY3RvclggKiBzY3JvbGxGYWN0b3JYLCBjaGlsZFNjcm9sbEZhY3RvclkgKiBzY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgY2hpbGQuc2V0QWxwaGEoY2hpbGRBbHBoYVRvcExlZnQgKiBhbHBoYSwgY2hpbGRBbHBoYVRvcFJpZ2h0ICogYWxwaGEsIGNoaWxkQWxwaGFCb3R0b21MZWZ0ICogYWxwaGEsIGNoaWxkQWxwaGFCb3R0b21SaWdodCAqIGFscGhhKTtcclxuXHJcbiAgICAgICAgLy8gIFJlbmRlclxyXG4gICAgICAgIGNoaWxkLnJlbmRlcldlYkdMKHJlbmRlcmVyLCBjaGlsZCwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgdHJhbnNmb3JtTWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWVzXHJcblxyXG4gICAgICAgIGNoaWxkLnNldEFscGhhKGNoaWxkQWxwaGFUb3BMZWZ0LCBjaGlsZEFscGhhVG9wUmlnaHQsIGNoaWxkQWxwaGFCb3R0b21MZWZ0LCBjaGlsZEFscGhhQm90dG9tUmlnaHQpO1xyXG5cclxuICAgICAgICBjaGlsZC5zZXRTY3JvbGxGYWN0b3IoY2hpbGRTY3JvbGxGYWN0b3JYLCBjaGlsZFNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICBpZiAobWFzaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG1hc2sucG9zdFJlbmRlcldlYkdMKHJlbmRlcmVyLCBjYW1lcmEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyZXIubmV3VHlwZSA9IGZhbHNlO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWluZXJXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQaGFzZXIgQmxlbmQgTW9kZXMgdG8gQ1NTIEJsZW5kIE1vZGVzIE1hcC5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5DU1NCbGVuZE1vZGVzXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXJcclxuICogQHJlYWRvbmx5XHJcbiAqIEBzaW5jZSAzLjEyLjBcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFtcclxuICAgICdub3JtYWwnLFxyXG4gICAgJ211bHRpcGx5JyxcclxuICAgICdtdWx0aXBseScsXHJcbiAgICAnc2NyZWVuJyxcclxuICAgICdvdmVybGF5JyxcclxuICAgICdkYXJrZW4nLFxyXG4gICAgJ2xpZ2h0ZW4nLFxyXG4gICAgJ2NvbG9yLWRvZGdlJyxcclxuICAgICdjb2xvci1idXJuJyxcclxuICAgICdoYXJkLWxpZ2h0JyxcclxuICAgICdzb2Z0LWxpZ2h0JyxcclxuICAgICdkaWZmZXJlbmNlJyxcclxuICAgICdleGNsdXNpb24nLFxyXG4gICAgJ2h1ZScsXHJcbiAgICAnc2F0dXJhdGlvbicsXHJcbiAgICAnY29sb3InLFxyXG4gICAgJ2x1bWlub3NpdHknXHJcbl07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBET01FbGVtZW50UmVuZGVyID0gcmVxdWlyZSgnLi9ET01FbGVtZW50UmVuZGVyJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBSZW1vdmVGcm9tRE9NID0gcmVxdWlyZSgnLi4vLi4vZG9tL1JlbW92ZUZyb21ET00nKTtcclxudmFyIFNDRU5FX0VWRU5UUyA9IHJlcXVpcmUoJy4uLy4uL3NjZW5lL2V2ZW50cycpO1xyXG52YXIgVmVjdG9yNCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yNCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogRE9NIEVsZW1lbnQgR2FtZSBPYmplY3RzIGFyZSBhIHdheSB0byBjb250cm9sIGFuZCBtYW5pcHVsYXRlIEhUTUwgRWxlbWVudHMgb3ZlciB0aGUgdG9wIG9mIHlvdXIgZ2FtZS5cclxuICogXHJcbiAqIEluIG9yZGVyIGZvciBET00gRWxlbWVudHMgdG8gZGlzcGxheSB5b3UgaGF2ZSB0byBlbmFibGUgdGhlbSBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB5b3VyIGdhbWVcclxuICogY29uZmlndXJhdGlvbiBvYmplY3Q6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGRvbSB7XHJcbiAqICAgY3JlYXRlQ29udGFpbmVyOiB0cnVlXHJcbiAqIH1cclxuICogYGBgXHJcbiAqIFxyXG4gKiBXaGVuIHRoaXMgaXMgYWRkZWQsIFBoYXNlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgRE9NIENvbnRhaW5lciBkaXYgdGhhdCBpcyBwb3NpdGlvbmVkIG92ZXIgdGhlIHRvcFxyXG4gKiBvZiB0aGUgZ2FtZSBjYW52YXMuIFRoaXMgZGl2IGlzIHNpemVkIHRvIG1hdGNoIHRoZSBjYW52YXMsIGFuZCBpZiB0aGUgY2FudmFzIHNpemUgY2hhbmdlcywgYXMgYSByZXN1bHQgb2ZcclxuICogc2V0dGluZ3Mgd2l0aGluIHRoZSBTY2FsZSBNYW5hZ2VyLCB0aGUgZG9tIGNvbnRhaW5lciBpcyByZXNpemVkIGFjY29yZGluZ2x5LlxyXG4gKiBcclxuICogWW91IGNhbiBjcmVhdGUgYSBET00gRWxlbWVudCBieSBlaXRoZXIgcGFzc2luZyBpbiBET01TdHJpbmdzLCBvciBieSBwYXNzaW5nIGluIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nXHJcbiAqIEVsZW1lbnQgdGhhdCB5b3Ugd2lzaCB0byBiZSBwbGFjZWQgdW5kZXIgdGhlIGNvbnRyb2wgb2YgUGhhc2VyLiBGb3IgZXhhbXBsZTpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5hZGQuZG9tKHgsIHksICdkaXYnLCAnYmFja2dyb3VuZC1jb2xvcjogbGltZTsgd2lkdGg6IDIyMHB4OyBoZWlnaHQ6IDEwMHB4OyBmb250OiA0OHB4IEFyaWFsJywgJ1BoYXNlcicpO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIFRoZSBhYm92ZSBjb2RlIHdpbGwgaW5zZXJ0IGEgZGl2IGVsZW1lbnQgaW50byB0aGUgRE9NIENvbnRhaW5lciBhdCB0aGUgZ2l2ZW4geC95IGNvb3JkaW5hdGUuIFRoZSBET01TdHJpbmcgaW5cclxuICogdGhlIDR0aCBhcmd1bWVudCBzZXRzIHRoZSBpbml0aWFsIENTUyBzdHlsZSBvZiB0aGUgZGl2IGFuZCB0aGUgZmluYWwgYXJndW1lbnQgaXMgdGhlIGlubmVyIHRleHQuIEluIHRoaXMgY2FzZSxcclxuICogaXQgd2lsbCBjcmVhdGUgYSBsaW1lIGNvbG9yZWQgZGl2IHRoYXQgaXMgMjIwcHggYnkgMTAwcHggaW4gc2l6ZSB3aXRoIHRoZSB0ZXh0IFBoYXNlciBpbiBpdCwgaW4gYW4gQXJpYWwgZm9udC5cclxuICogXHJcbiAqIFlvdSBzaG91bGQgbmVhcmx5IGFsd2F5cywgd2l0aG91dCBleGNlcHRpb24sIHVzZSBleHBsaWNpdGx5IHNpemVkIEhUTUwgRWxlbWVudHMsIGluIG9yZGVyIHRvIGZ1bGx5IGNvbnRyb2xcclxuICogYWxpZ25tZW50IGFuZCBwb3NpdGlvbmluZyBvZiB0aGUgZWxlbWVudHMgbmV4dCB0byByZWd1bGFyIGdhbWUgY29udGVudC5cclxuICogXHJcbiAqIFJhdGhlciB0aGFuIHNwZWNpZnkgdGhlIENTUyBhbmQgSFRNTCBkaXJlY3RseSB5b3UgY2FuIHVzZSB0aGUgYGxvYWQuaHRtbGAgRmlsZSBMb2FkZXIgdG8gbG9hZCBpdCBpbnRvIHRoZVxyXG4gKiBjYWNoZSBhbmQgdGhlbiB1c2UgdGhlIGBjcmVhdGVGcm9tQ2FjaGVgIG1ldGhvZCBpbnN0ZWFkLiBZb3UgY2FuIGFsc28gdXNlIGBjcmVhdGVGcm9tSFRNTGAgYW5kIHZhcmlvdXMgb3RoZXJcclxuICogbWV0aG9kcyBhdmFpbGFibGUgaW4gdGhpcyBjbGFzcyB0byBoZWxwIGNvbnN0cnVjdCB5b3VyIGVsZW1lbnRzLlxyXG4gKiBcclxuICogT25jZSB0aGUgZWxlbWVudCBoYXMgYmVlbiBjcmVhdGVkIHlvdSBjYW4gdGhlbiBjb250cm9sIGl0IGxpa2UgeW91IHdvdWxkIGFueSBvdGhlciBHYW1lIE9iamVjdC4gWW91IGNhbiBzZXQgaXRzXHJcbiAqIHBvc2l0aW9uLCBzY2FsZSwgcm90YXRpb24sIGFscGhhIGFuZCBvdGhlciBwcm9wZXJ0aWVzLiBJdCB3aWxsIG1vdmUgYXMgdGhlIG1haW4gU2NlbmUgQ2FtZXJhIG1vdmVzIGFuZCBiZSBjbGlwcGVkXHJcbiAqIGF0IHRoZSBlZGdlIG9mIHRoZSBjYW52YXMuIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHNvbWUgbGltaXRhdGlvbnMgb2YgRE9NIEVsZW1lbnRzOiBUaGUgb2J2aW91cyBvbmUgaXMgdGhhdFxyXG4gKiB0aGV5IGFwcGVhciBhYm92ZSBvciBiZWxvdyB5b3VyIGdhbWUgY2FudmFzLiBZb3UgY2Fubm90IGJsZW5kIHRoZW0gaW50byB0aGUgZGlzcGxheSBsaXN0LCBtZWFuaW5nIHlvdSBjYW5ub3QgaGF2ZVxyXG4gKiBhIERPTSBFbGVtZW50LCB0aGVuIGEgU3ByaXRlLCB0aGVuIGFub3RoZXIgRE9NIEVsZW1lbnQgYmVoaW5kIGl0LlxyXG4gKiBcclxuICogVGhleSBhbHNvIGNhbm5vdCBiZSBlbmFibGVkIGZvciBpbnB1dC4gVG8gZG8gdGhhdCwgeW91IGhhdmUgdG8gdXNlIHRoZSBgYWRkTGlzdGVuZXJgIG1ldGhvZCB0byBhZGQgbmF0aXZlIGV2ZW50XHJcbiAqIGxpc3RlbmVycyBkaXJlY3RseS4gVGhlIGZpbmFsIGxpbWl0YXRpb24gaXMgdG8gZG8gd2l0aCBjYW1lcmFzLiBUaGUgRE9NIENvbnRhaW5lciBpcyBzaXplZCB0byBtYXRjaCB0aGUgZ2FtZSBjYW52YXNcclxuICogZW50aXJlbHkgYW5kIGNsaXBwZWQgYWNjb3JkaW5nbHkuIERPTSBFbGVtZW50cyByZXNwZWN0IGNhbWVyYSBzY3JvbGxpbmcgYW5kIHNjcm9sbEZhY3RvciBzZXR0aW5ncywgYnV0IGlmIHlvdVxyXG4gKiBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGNhbWVyYSBzbyBpdCBubyBsb25nZXIgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgY2FudmFzLCB0aGV5IHdvbid0IGJlIGNsaXBwZWQgYWNjb3JkaW5nbHkuXHJcbiAqIFxyXG4gKiBBbHNvLCBhbGwgRE9NIEVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBzYW1lIERPTSBDb250YWluZXIsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggU2NlbmUgdGhleSBhcmUgY3JlYXRlZCBpbi5cclxuICogXHJcbiAqIERPTSBFbGVtZW50cyBhcmUgYSBwb3dlcmZ1bCB3YXkgdG8gYWxpZ24gbmF0aXZlIEhUTUwgd2l0aCB5b3VyIFBoYXNlciBHYW1lIE9iamVjdHMuIEZvciBleGFtcGxlLCB5b3UgY2FuIGluc2VydFxyXG4gKiBhIGxvZ2luIGZvcm0gZm9yIGEgbXVsdGlwbGF5ZXIgZ2FtZSBkaXJlY3RseSBpbnRvIHlvdXIgdGl0bGUgc2NyZWVuLiBPciBhIHRleHQgaW5wdXQgYm94IGZvciBhIGhpZ2hzY29yZSB0YWJsZS5cclxuICogT3IgYSBiYW5uZXIgYWQgZnJvbSBhIDNyZCBwYXJ0eSBzZXJ2aWNlLiBPciBwZXJoYXBzIHlvdSdkIGxpa2UgdG8gdXNlIHRoZW0gZm9yIGhpZ2ggcmVzb2x1dGlvbiB0ZXh0IGRpc3BsYXkgYW5kXHJcbiAqIFVJLiBUaGUgY2hvaWNlIGlzIHVwIHRvIHlvdSwganVzdCByZW1lbWJlciB0aGF0IHlvdSdyZSBkZWFsaW5nIHdpdGggc3RhbmRhcmQgSFRNTCBhbmQgQ1NTIGZsb2F0aW5nIG92ZXIgdGhlIHRvcFxyXG4gKiBvZiB5b3VyIGdhbWUsIGFuZCBzaG91bGQgdHJlYXQgaXQgYWNjb3JkaW5nbHkuXHJcbiAqXHJcbiAqIEBjbGFzcyBET01FbGVtZW50XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjE3LjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGFTaW5nbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBET00gRWxlbWVudCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIERPTSBFbGVtZW50IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBbZWxlbWVudF0gLSBBbiBleGlzdGluZyBET00gZWxlbWVudCwgb3IgYSBzdHJpbmcuIElmIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYSAjIGl0IHdpbGwgZG8gYSBgZ2V0RWxlbWVudEJ5SWRgIGxvb2stdXAgb24gdGhlIHN0cmluZyAobWludXMgdGhlIGhhc2gpLiBXaXRob3V0IGEgaGFzaCwgaXQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBlbGVtZW50IHRvIGNyZWF0ZSwgaS5lLiAnZGl2Jy5cclxuICogQHBhcmFtIHsoc3RyaW5nfGFueSl9IFtzdHlsZV0gLSBJZiBhIHN0cmluZywgd2lsbCBiZSBzZXQgZGlyZWN0bHkgYXMgdGhlIGVsZW1lbnRzIGBzdHlsZWAgcHJvcGVydHkgdmFsdWUuIElmIGEgcGxhaW4gb2JqZWN0LCB3aWxsIGJlIGl0ZXJhdGVkIGFuZCB0aGUgdmFsdWVzIHRyYW5zZmVycmVkLiBJbiBib3RoIGNhc2VzIHRoZSB2YWx1ZXMgcmVwbGFjaW5nIHdoYXRldmVyIENTUyBzdHlsZXMgbWF5IGhhdmUgYmVlbiBwcmV2aW91c2x5IHNldC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtpbm5lclRleHRdIC0gSWYgZ2l2ZW4sIHdpbGwgYmUgc2V0IGRpcmVjdGx5IGFzIHRoZSBlbGVtZW50cyBgaW5uZXJUZXh0YCBwcm9wZXJ0eSB2YWx1ZSwgcmVwbGFjaW5nIHdoYXRldmVyIHdhcyB0aGVyZSBiZWZvcmUuXHJcbiAqL1xyXG52YXIgRE9NRWxlbWVudCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhU2luZ2xlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5PcmlnaW4sXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIERPTUVsZW1lbnRSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBET01FbGVtZW50IChzY2VuZSwgeCwgeSwgZWxlbWVudCwgc3R5bGUsIGlubmVyVGV4dClcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdET01FbGVtZW50Jyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgRE9NIENvbnRhaW5lciB0aGF0IHRoZSBHYW1lIGluc3RhbmNlIGNyZWF0ZWQgd2hlbiBpdCBzdGFydGVkLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3BhcmVudFxyXG4gICAgICAgICAqIEB0eXBlIHtFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhcmVudCA9IHNjZW5lLnN5cy5nYW1lLmRvbUNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEhUTUwgQ2FjaGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjY2FjaGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkJhc2VDYWNoZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHNjZW5lLnN5cy5jYWNoZS5odG1sO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYWN0dWFsIERPTSBFbGVtZW50IHRoYXQgdGhpcyBHYW1lIE9iamVjdCBpcyBib3VuZCB0by4gRm9yIGV4YW1wbGUsIGlmIHlvdSd2ZSBjcmVhdGVkIGEgYDxkaXY+YFxyXG4gICAgICAgICAqIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhhdCBlbGVtZW50IHdpdGhpbiB0aGUgZG9tLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I25vZGVcclxuICAgICAgICAgKiBAdHlwZSB7RWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ub2RlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCeSBkZWZhdWx0IGEgRE9NIEVsZW1lbnQgd2lsbCBoYXZlIGl0cyB0cmFuc2Zvcm0sIGRpc3BsYXksIG9wYWNpdHksIHpJbmRleCBhbmQgYmxlbmQgbW9kZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICogdXBkYXRlZCB3aGVuIGl0cyByZW5kZXJlZC4gSWYsIGZvciBzb21lIHJlYXNvbiwgeW91IGRvbid0IHdhbnQgYW55IG9mIHRoZXNlIGNoYW5nZWQgb3RoZXIgdGhhbiB0aGVcclxuICAgICAgICAgKiBDU1MgdHJhbnNmb3JtLCB0aGVuIHNldCB0aGlzIGZsYWcgdG8gYHRydWVgLiBXaGVuIGB0cnVlYCBvbmx5IHRoZSBDU1MgVHJhbnNmb3JtIGlzIGFwcGxpZWQgYW5kIGl0J3NcclxuICAgICAgICAgKiB1cCB0byB5b3UgdG8ga2VlcCB0cmFjayBvZiBhbmQgc2V0IHRoZSBvdGhlciBwcm9wZXJ0aWVzIGFzIHJlcXVpcmVkLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGhhbmR5IGlmLCBmb3IgZXhhbXBsZSwgeW91J3ZlIGEgbmVzdGVkIERPTSBFbGVtZW50IGFuZCB5b3UgZG9uJ3Qgd2FudCB0aGUgb3BhY2l0eSB0byBiZVxyXG4gICAgICAgICAqIHBpY2tlZC11cCBieSBhbnkgb2YgaXRzIGNoaWxkcmVuLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3RyYW5zZm9ybU9ubHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1Pbmx5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbmdsZSwgaW4gcmFkaWFucywgYnkgd2hpY2ggdG8gc2tldyB0aGUgRE9NIEVsZW1lbnQgb24gdGhlIGhvcml6b250YWwgYXhpcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdHJhbnNmb3JtXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjc2tld1hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNrZXdYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFuZ2xlLCBpbiByYWRpYW5zLCBieSB3aGljaCB0byBza2V3IHRoZSBET00gRWxlbWVudCBvbiB0aGUgdmVydGljYWwgYXhpcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdHJhbnNmb3JtXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjc2tld1lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNrZXdZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBWZWN0b3I0IHRoYXQgY29udGFpbnMgdGhlIDNEIHJvdGF0aW9uIG9mIHRoaXMgRE9NIEVsZW1lbnQgYXJvdW5kIGEgZml4ZWQgYXhpcyBpbiAzRCBzcGFjZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBbGwgdmFsdWVzIGluIHRoZSBWZWN0b3I0IGFyZSB0cmVhdGVkIGFzIGRlZ3JlZXMsIHVubGVzcyB0aGUgYHJvdGF0ZTNkQW5nbGVgIHByb3BlcnR5IGlzIGNoYW5nZWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZvbGxvd2luZyBNRE4gcGFnZTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdHJhbnNmb3JtLWZ1bmN0aW9uL3JvdGF0ZTNkXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjcm90YXRlM2RcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yNH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yb3RhdGUzZCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB1bml0IHRoYXQgcmVwcmVzZW50cyB0aGUgM0Qgcm90YXRpb24gdmFsdWVzLiBCeSBkZWZhdWx0IHRoaXMgaXMgYGRlZ2AgZm9yIGRlZ3JlZXMsIGJ1dCBjYW5cclxuICAgICAgICAgKiBiZSBjaGFuZ2VkIHRvIGFueSBzdXBwb3J0ZWQgdW5pdC4gU2VlIHRoaXMgcGFnZSBmb3IgZnVydGhlciBkZXRhaWxzOlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy90cmFuc2Zvcm0tZnVuY3Rpb24vcm90YXRlM2RcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNyb3RhdGUzZEFuZ2xlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yb3RhdGUzZEFuZ2xlID0gJ2RlZyc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYXRpdmUgKHVuLXNjYWxlZCkgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBGb3IgYSBET00gRWxlbWVudCB0aGlzIHByb3BlcnR5IGlzIHJlYWQtb25seS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgcHJvcGVydHkgYGRpc3BsYXlXaWR0aGAgaG9sZHMgdGhlIGNvbXB1dGVkIGJvdW5kcyBvZiB0aGlzIERPTSBFbGVtZW50LCBmYWN0b3JpbmcgaW4gc2NhbGluZy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmF0aXZlICh1bi1zY2FsZWQpIGhlaWdodCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEZvciBhIERPTSBFbGVtZW50IHRoaXMgcHJvcGVydHkgaXMgcmVhZC1vbmx5LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBwcm9wZXJ0eSBgZGlzcGxheUhlaWdodGAgaG9sZHMgdGhlIGNvbXB1dGVkIGJvdW5kcyBvZiB0aGlzIERPTSBFbGVtZW50LCBmYWN0b3JpbmcgaW4gc2NhbGluZy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb21wdXRlZCBkaXNwbGF5IHdpZHRoIG9mIHRoaXMgR2FtZSBPYmplY3QsIGJhc2VkIG9uIHRoZSBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBET00gY2FsbC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgcHJvcGVydHkgYHdpZHRoYCBob2xkcyB0aGUgdW4tc2NhbGVkIHdpZHRoIG9mIHRoaXMgRE9NIEVsZW1lbnQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjZGlzcGxheVdpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5V2lkdGggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY29tcHV0ZWQgZGlzcGxheSBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdCwgYmFzZWQgb24gdGhlIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIERPTSBjYWxsLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBwcm9wZXJ0eSBgaGVpZ2h0YCBob2xkcyB0aGUgdW4tc2NhbGVkIGhlaWdodCBvZiB0aGlzIERPTSBFbGVtZW50LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I2Rpc3BsYXlIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlIZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBuYXRpdmUgZXZlbnQgaGFuZGxlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNoYW5kbGVyXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhhbmRsZXIgPSB0aGlzLmRpc3BhdGNoTmF0aXZlRXZlbnQuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBoYXNoP1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudFswXSA9PT0gJyMnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQoZWxlbWVudC5zdWJzdHIoMSksIHN0eWxlLCBpbm5lclRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIHN0eWxlLCBpbm5lclRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQoZWxlbWVudCwgc3R5bGUsIGlubmVyVGV4dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNDRU5FX0VWRU5UUy5TTEVFUCwgdGhpcy5oYW5kbGVTY2VuZUV2ZW50LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNDRU5FX0VWRU5UUy5XQUtFLCB0aGlzLmhhbmRsZVNjZW5lRXZlbnQsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgYSBTY2VuZSBTbGVlcCBhbmQgV2FrZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I2hhbmRsZVNjZW5lRXZlbnRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IHN5cyAtIFRoZSBTY2VuZSBTeXN0ZW1zLlxyXG4gICAgICovXHJcbiAgICBoYW5kbGVTY2VuZUV2ZW50OiBmdW5jdGlvbiAoc3lzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlO1xyXG4gICAgICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XHJcbiAgICBcclxuICAgICAgICBpZiAobm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgPSAoc3lzLnNldHRpbmdzLnZpc2libGUpID8gJ2Jsb2NrJyA6ICdub25lJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2tldyB2YWx1ZXMgb2YgdGhpcyBET00gRWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdHJhbnNmb3JtXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNzZXRTa2V3XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGFuZ2xlLCBpbiByYWRpYW5zLCBieSB3aGljaCB0byBza2V3IHRoZSBET00gRWxlbWVudCBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIGFuZ2xlLCBpbiByYWRpYW5zLCBieSB3aGljaCB0byBza2V3IHRoZSBET00gRWxlbWVudCBvbiB0aGUgdmVydGljYWwgYXhpcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBET00gRWxlbWVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2tldzogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5za2V3WCA9IHg7XHJcbiAgICAgICAgdGhpcy5za2V3WSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBlcnNwZWN0aXZlIENTUyBwcm9wZXJ0eSBvZiB0aGUgX3BhcmVudCBET00gQ29udGFpbmVyXy4gVGhpcyBkZXRlcm1pbmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB6PTBcclxuICAgICAqIHBsYW5lIGFuZCB0aGUgdXNlciBpbiBvcmRlciB0byBnaXZlIGEgM0QtcG9zaXRpb25lZCBlbGVtZW50IHNvbWUgcGVyc3BlY3RpdmUuIEVhY2ggM0QgZWxlbWVudCB3aXRoXHJcbiAgICAgKiB6ID4gMCBiZWNvbWVzIGxhcmdlcjsgZWFjaCAzRC1lbGVtZW50IHdpdGggeiA8IDAgYmVjb21lcyBzbWFsbGVyLiBUaGUgc3RyZW5ndGggb2YgdGhlIGVmZmVjdCBpcyBkZXRlcm1pbmVkXHJcbiAgICAgKiBieSB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGVyc3BlY3RpdmVcclxuICAgICAqIFxyXG4gICAgICogKipDaGFuZ2luZyB0aGlzIHZhbHVlIGNoYW5nZXMgaXQgZ2xvYmFsbHkgZm9yIGFsbCBET00gRWxlbWVudHMsIGFzIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIHBhcmVudCBjb250YWluZXIuKipcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3NldFBlcnNwZWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHBlcnNwZWN0aXZlIHZhbHVlLCBpbiBwaXhlbHMsIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgeiBwbGFuZSBhbmQgdGhlIHVzZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRE9NIEVsZW1lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFBlcnNwZWN0aXZlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQuc3R5bGUucGVyc3BlY3RpdmUgPSB2YWx1ZSArICdweCc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwZXJzcGVjdGl2ZSBDU1MgcHJvcGVydHkgdmFsdWUgb2YgdGhlIF9wYXJlbnQgRE9NIENvbnRhaW5lcl8uIFRoaXMgZGV0ZXJtaW5lcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgej0wXHJcbiAgICAgKiBwbGFuZSBhbmQgdGhlIHVzZXIgaW4gb3JkZXIgdG8gZ2l2ZSBhIDNELXBvc2l0aW9uZWQgZWxlbWVudCBzb21lIHBlcnNwZWN0aXZlLiBFYWNoIDNEIGVsZW1lbnQgd2l0aFxyXG4gICAgICogeiA+IDAgYmVjb21lcyBsYXJnZXI7IGVhY2ggM0QtZWxlbWVudCB3aXRoIHogPCAwIGJlY29tZXMgc21hbGxlci4gVGhlIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3QgaXMgZGV0ZXJtaW5lZFxyXG4gICAgICogYnkgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BlcnNwZWN0aXZlXHJcbiAgICAgKiBcclxuICAgICAqICoqQ2hhbmdpbmcgdGhpcyB2YWx1ZSBjaGFuZ2VzIGl0IGdsb2JhbGx5IGZvciBhbGwgRE9NIEVsZW1lbnRzLCBhcyB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBwYXJlbnQgY29udGFpbmVyLioqXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3BlcnNwZWN0aXZlXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICBwZXJzcGVjdGl2ZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnBhcmVudC5zdHlsZS5wZXJzcGVjdGl2ZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5zdHlsZS5wZXJzcGVjdGl2ZSA9IHZhbHVlICsgJ3B4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgb25lIG9yIG1vcmUgbmF0aXZlIERPTSBldmVudCBsaXN0ZW5lcnMgb250byB0aGUgdW5kZXJseWluZyBFbGVtZW50IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGUgZXZlbnQgaXMgdGhlbiBkaXNwYXRjaGVkIHZpYSB0aGlzIEdhbWUgT2JqZWN0cyBzdGFuZGFyZCBldmVudCBlbWl0dGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgZXhhbXBsZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdmFyIGRpdiA9IHRoaXMuYWRkLmRvbSh4LCB5LCBlbGVtZW50KTtcclxuICAgICAqIFxyXG4gICAgICogZGl2LmFkZExpc3RlbmVyKCdjbGljaycpO1xyXG4gICAgICogXHJcbiAgICAgKiBkaXYub24oJ2NsaWNrJywgaGFuZGxlcik7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I2FkZExpc3RlbmVyXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50cyAtIFRoZSBET00gZXZlbnQvcyB0byBsaXN0ZW4gZm9yLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgZXZlbnRzIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIHNwYWNlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBET00gRWxlbWVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uIChldmVudHMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGV2ZW50cyA9IGV2ZW50cy5zcGxpdCgnICcpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50c1tpXSwgdGhpcy5oYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgb25lIG9yIG1vcmUgbmF0aXZlIERPTSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgdW5kZXJseWluZyBFbGVtZW50IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNyZW1vdmVMaXN0ZW5lclxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudHMgLSBUaGUgRE9NIGV2ZW50L3MgdG8gc3RvcCBsaXN0ZW5pbmcgZm9yLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgZXZlbnRzIGJ5IHNlcGFyYXRpbmcgdGhlbSB3aXRoIHNwYWNlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBET00gRWxlbWVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIChldmVudHMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGV2ZW50cyA9IGV2ZW50cy5zcGxpdCgnICcpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50c1tpXSwgdGhpcy5oYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgZXZlbnQgcHJveHkgdG8gZGlzcGF0Y2ggbmF0aXZlIERPTSBFdmVudHMgdmlhIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNkaXNwYXRjaE5hdGl2ZUV2ZW50XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCAtIFRoZSBuYXRpdmUgRE9NIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBkaXNwYXRjaE5hdGl2ZUV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LnR5cGUsIGV2ZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmF0aXZlIERPTSBFbGVtZW50LCBhZGRzIGl0IHRvIHRoZSBwYXJlbnQgRE9NIENvbnRhaW5lciBhbmQgdGhlbiBiaW5kcyBpdCB0byB0aGlzIEdhbWUgT2JqZWN0LFxyXG4gICAgICogc28geW91IGNhbiBjb250cm9sIGl0LiBUaGUgYHRhZ05hbWVgIHNob3VsZCBiZSBhIHN0cmluZyBhbmQgaXMgcGFzc2VkIHRvIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50YDpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBvbiBhY2NlcHRhYmxlIHRhZyBuYW1lcyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudC9jcmVhdGVFbGVtZW50XHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gYWxzbyBwYXNzIGluIGEgRE9NU3RyaW5nIG9yIHN0eWxlIG9iamVjdCB0byBzZXQgdGhlIENTUyBvbiB0aGUgY3JlYXRlZCBlbGVtZW50LCBhbmQgYW4gb3B0aW9uYWwgYGlubmVyVGV4dGBcclxuICAgICAqIHZhbHVlIGFzIHdlbGwuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIERPTVN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuY3JlYXRlRWxlbWVudCgnZGl2JywgJ2JhY2tncm91bmQtY29sb3I6IGxpbWU7IHdpZHRoOiAyMjBweDsgaGVpZ2h0OiAxMDBweDsgZm9udDogNDhweCBBcmlhbCcsICdQaGFzZXInKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBBbmQgdXNpbmcgYSBzdHlsZSBvYmplY3Q6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHZhciBzdHlsZSA9IHtcclxuICAgICAqICAgJ2JhY2tncm91bmQtY29sb3InOiAnbGltZSc7XHJcbiAgICAgKiAgICd3aWR0aCc6ICcyMDBweCc7XHJcbiAgICAgKiAgICdoZWlnaHQnOiAnMTAwcHgnO1xyXG4gICAgICogICAnZm9udCc6ICc0OHB4IEFyaWFsJztcclxuICAgICAqIH07XHJcbiAgICAgKiBcclxuICAgICAqIHRoaXMuYWRkLmRvbSgpLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHN0eWxlLCAnUGhhc2VyJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBhbHJlYWR5IGhhcyBhbiBFbGVtZW50LCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSBlbnRpcmVseSBmaXJzdC5cclxuICAgICAqIEFueSBldmVudCBsaXN0ZW5lcnMgeW91IG1heSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZCB3aWxsIG5lZWQgdG8gYmUgcmUtY3JlYXRlZCBhZnRlciB0aGlzIGNhbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNjcmVhdGVFbGVtZW50XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSBBIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBlbGVtZW50IHRvIGJlIGNyZWF0ZWQuIFRoZSBub2RlTmFtZSBvZiB0aGUgY3JlYXRlZCBlbGVtZW50IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIG9mIHRhZ05hbWUuIERvbid0IHVzZSBxdWFsaWZpZWQgbmFtZXMgKGxpa2UgXCJodG1sOmFcIikgd2l0aCB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xhbnkpfSBbc3R5bGVdIC0gRWl0aGVyIGEgRE9NU3RyaW5nIHRoYXQgaG9sZHMgdGhlIENTUyBzdHlsZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgY3JlYXRlZCBlbGVtZW50LCBvciBhbiBvYmplY3QgdGhlIHN0eWxlcyB3aWxsIGJlIHJlYWR5IGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2lubmVyVGV4dF0gLSBBIERPTVN0cmluZyB0aGF0IGhvbGRzIHRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBzZXQgYXMgdGhlIGlubmVyVGV4dCBvZiB0aGUgY3JlYXRlZCBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERPTSBFbGVtZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiAodGFnTmFtZSwgc3R5bGUsIGlubmVyVGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRFbGVtZW50KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSksIHN0eWxlLCBpbm5lclRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmRzIGEgbmV3IERPTSBFbGVtZW50IHRvIHRoaXMgR2FtZSBPYmplY3QuIElmIHRoaXMgR2FtZSBPYmplY3QgYWxyZWFkeSBoYXMgYW4gRWxlbWVudCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIERPTVxyXG4gICAgICogZW50aXJlbHkgZmlyc3QuIEFueSBldmVudCBsaXN0ZW5lcnMgeW91IG1heSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZCB3aWxsIG5lZWQgdG8gYmUgcmUtY3JlYXRlZCBvbiB0aGUgbmV3IGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBgZWxlbWVudGAgYXJndW1lbnQgeW91IHBhc3MgdG8gdGhpcyBtZXRob2QgY2FuIGJlIGVpdGhlciBhIHN0cmluZyB0YWdOYW1lOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiA8aDEgaWQ9XCJoZWFkaW5nXCI+UGhhc2VyPC9oMT5cclxuICAgICAqXHJcbiAgICAgKiB0aGlzLmFkZC5kb20oKS5zZXRFbGVtZW50KCdoZWFkaW5nJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogT3IgYSByZWZlcmVuY2UgdG8gYW4gRWxlbWVudCBpbnN0YW5jZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogPGgxIGlkPVwiaGVhZGluZ1wiPlBoYXNlcjwvaDE+XHJcbiAgICAgKlxyXG4gICAgICogdmFyIGgxID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRpbmcnKTtcclxuICAgICAqIFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuc2V0RWxlbWVudChoMSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYSBET01TdHJpbmcgb3Igc3R5bGUgb2JqZWN0IHRvIHNldCB0aGUgQ1NTIG9uIHRoZSBjcmVhdGVkIGVsZW1lbnQsIGFuZCBhbiBvcHRpb25hbCBgaW5uZXJUZXh0YFxyXG4gICAgICogdmFsdWUgYXMgd2VsbC4gSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgRE9NU3RyaW5nOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmFkZC5kb20oKS5zZXRFbGVtZW50KGgxLCAnYmFja2dyb3VuZC1jb2xvcjogbGltZTsgd2lkdGg6IDIyMHB4OyBoZWlnaHQ6IDEwMHB4OyBmb250OiA0OHB4IEFyaWFsJywgJ1BoYXNlcicpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIEFuZCB1c2luZyBhIHN0eWxlIG9iamVjdDpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdmFyIHN0eWxlID0ge1xyXG4gICAgICogICAnYmFja2dyb3VuZC1jb2xvcic6ICdsaW1lJztcclxuICAgICAqICAgJ3dpZHRoJzogJzIwMHB4JztcclxuICAgICAqICAgJ2hlaWdodCc6ICcxMDBweCc7XHJcbiAgICAgKiAgICdmb250JzogJzQ4cHggQXJpYWwnO1xyXG4gICAgICogfTtcclxuICAgICAqIFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuc2V0RWxlbWVudChoMSwgc3R5bGUsICdQaGFzZXInKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjc2V0RWxlbWVudFxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xFbGVtZW50KX0gZWxlbWVudCAtIElmIGEgc3RyaW5nIGl0IGlzIHBhc3NlZCB0byBgZ2V0RWxlbWVudEJ5SWQoKWAsIG9yIGl0IHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBFbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGFueSl9IFtzdHlsZV0gLSBFaXRoZXIgYSBET01TdHJpbmcgdGhhdCBob2xkcyB0aGUgQ1NTIHN0eWxlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIGVsZW1lbnQsIG9yIGFuIG9iamVjdCB0aGUgc3R5bGVzIHdpbGwgYmUgcmVhZHkgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbaW5uZXJUZXh0XSAtIEEgRE9NU3RyaW5nIHRoYXQgaG9sZHMgdGhlIHRleHQgdGhhdCB3aWxsIGJlIHNldCBhcyB0aGUgaW5uZXJUZXh0IG9mIHRoZSBjcmVhdGVkIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRE9NIEVsZW1lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZSwgaW5uZXJUZXh0KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBBbHJlYWR5IGdvdCBhbiBlbGVtZW50PyBSZW1vdmUgaXQgZmlyc3RcclxuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQoKTtcclxuXHJcbiAgICAgICAgdmFyIHRhcmdldDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBoYXNoP1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudFswXSA9PT0gJyMnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRhcmdldClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub2RlID0gdGFyZ2V0O1xyXG5cclxuICAgICAgICAvLyAgc3R5bGUgY2FuIGJlIGVtcHR5LCBhIHN0cmluZyBvciBhIHBsYWluIG9iamVjdFxyXG4gICAgICAgIGlmIChzdHlsZSAmJiBJc1BsYWluT2JqZWN0KHN0eWxlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdHlsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUgPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBBZGQgLyBPdmVycmlkZSB0aGUgdmFsdWVzIHdlIG5lZWRcclxuXHJcbiAgICAgICAgdGFyZ2V0LnN0eWxlLnpJbmRleCA9ICcwJztcclxuICAgICAgICB0YXJnZXQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG4gICAgICAgIHRhcmdldC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcblxyXG4gICAgICAgIC8vICBOb2RlIGhhbmRsZXJcclxuXHJcbiAgICAgICAgdGFyZ2V0LnBoYXNlciA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSW5uZXJUZXh0XHJcblxyXG4gICAgICAgIGlmIChpbm5lclRleHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXQuaW5uZXJUZXh0ID0gaW5uZXJUZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2l6ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgYmxvY2sgb2YgaHRtbCBmcm9tIHRoZSBIVE1MIENhY2hlLCB0aGF0IGhhcyBwcmV2aW91c2x5IGJlZW4gcHJlbG9hZGVkIGludG8gdGhlIGdhbWUsIGFuZCB0aGVuXHJcbiAgICAgKiBjcmVhdGVzIGEgRE9NIEVsZW1lbnQgZnJvbSBpdC4gVGhlIGxvYWRlZCBIVE1MIGlzIHNldCBhcyB0aGUgYGlubmVySFRNTGAgcHJvcGVydHkgb2YgdGhlIGNyZWF0ZWRcclxuICAgICAqIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEFzc3VtZSB0aGUgZm9sbG93aW5nIGh0bWwgaXMgc3RvcmVkIGluIGEgZmlsZSBjYWxsZWQgYGxvZ2luZm9ybS5odG1sYDpcclxuICAgICAqIFxyXG4gICAgICogYGBgaHRtbFxyXG4gICAgICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVGaWVsZFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBuYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDMycHhcIj5cclxuICAgICAqIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgbmFtZT1cInBsYXlCdXR0b25cIiB2YWx1ZT1cIkxldCdzIFBsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTogMzJweFwiPlxyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFdoaWNoIGlzIGxvYWRlZCBpbnRvIHlvdXIgZ2FtZSB1c2luZyB0aGUgY2FjaGUga2V5ICdsb2dpbic6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMubG9hZC5odG1sKCdsb2dpbicsICdhc3NldHMvbG9naW5mb3JtLmh0bWwnKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBhIERPTSBFbGVtZW50IGZyb20gaXQgdXNpbmcgdGhlIGNhY2hlIGtleTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuY3JlYXRlRnJvbUNhY2hlKCdsb2dpbicpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBvcHRpb25hbCBgZWxlbWVudFR5cGVgIGFyZ3VtZW50IGNvbnRyb2xzIHRoZSBjb250YWluZXIgdGhhdCBpcyBjcmVhdGVkLCBpbnRvIHdoaWNoIHRoZSBsb2FkZWQgaHRtbCBpcyBpbnNlcnRlZC5cclxuICAgICAqIFRoZSBkZWZhdWx0IGlzIGEgcGxhaW4gYGRpdmAgb2JqZWN0LCBidXQgYW55IHZhbGlkIHRhZ05hbWUgY2FuIGJlIGdpdmVuLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGlzIEdhbWUgT2JqZWN0IGFscmVhZHkgaGFzIGFuIEVsZW1lbnQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGVudGlyZWx5IGZpcnN0LlxyXG4gICAgICogQW55IGV2ZW50IGxpc3RlbmVycyB5b3UgbWF5IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkIHdpbGwgbmVlZCB0byBiZSByZS1jcmVhdGVkIGFmdGVyIHRoaXMgY2FsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I2NyZWF0ZUZyb21DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIGtleSBvZiB0aGUgaHRtbCBjYWNoZSBlbnRyeSB0byB1c2UgZm9yIHRoaXMgRE9NIEVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhZ05hbWU9J2RpdiddIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBlbGVtZW50IGludG8gd2hpY2ggYWxsIG9mIHRoZSBsb2FkZWQgaHRtbCB3aWxsIGJlIGluc2VydGVkLiBEZWZhdWx0cyB0byBhIHBsYWluIGRpdiB0YWcuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRE9NIEVsZW1lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUZyb21DYWNoZTogZnVuY3Rpb24gKGtleSwgdGFnTmFtZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaHRtbCA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChodG1sKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVGcm9tSFRNTChodG1sLCB0YWdOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIHRoZW4gY3JlYXRlcyBhIERPTSBFbGVtZW50IGZyb20gaXQuIFRoZSBIVE1MIGlzIHNldCBhcyB0aGUgYGlubmVySFRNTGBcclxuICAgICAqIHByb3BlcnR5IG9mIHRoZSBjcmVhdGVkIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGxldCBmb3JtID0gYFxyXG4gICAgICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5hbWVGaWVsZFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBuYW1lXCIgc3R5bGU9XCJmb250LXNpemU6IDMycHhcIj5cclxuICAgICAqIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgbmFtZT1cInBsYXlCdXR0b25cIiB2YWx1ZT1cIkxldCdzIFBsYXlcIiBzdHlsZT1cImZvbnQtc2l6ZTogMzJweFwiPlxyXG4gICAgICogYDtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBhIERPTSBFbGVtZW50IGZyb20gaXQgdXNpbmcgdGhlIHN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5hZGQuZG9tKCkuY3JlYXRlRnJvbUhUTUwoZm9ybSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVGhlIG9wdGlvbmFsIGBlbGVtZW50VHlwZWAgYXJndW1lbnQgY29udHJvbHMgdGhlIHR5cGUgb2YgY29udGFpbmVyIHRoYXQgaXMgY3JlYXRlZCwgaW50byB3aGljaCB0aGUgaHRtbCBpcyBpbnNlcnRlZC5cclxuICAgICAqIFRoZSBkZWZhdWx0IGlzIGEgcGxhaW4gYGRpdmAgb2JqZWN0LCBidXQgYW55IHZhbGlkIHRhZ05hbWUgY2FuIGJlIGdpdmVuLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGlzIEdhbWUgT2JqZWN0IGFscmVhZHkgaGFzIGFuIEVsZW1lbnQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGVudGlyZWx5IGZpcnN0LlxyXG4gICAgICogQW55IGV2ZW50IGxpc3RlbmVycyB5b3UgbWF5IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkIHdpbGwgbmVlZCB0byBiZSByZS1jcmVhdGVkIGFmdGVyIHRoaXMgY2FsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I2NyZWF0ZUZyb21IVE1MXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBBIHN0cmluZyBvZiBodG1sIHRvIGJlIHNldCBhcyB0aGUgYGlubmVySFRNTGAgcHJvcGVydHkgb2YgdGhlIGNyZWF0ZWQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnTmFtZT0nZGl2J10gLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW50byB3aGljaCBhbGwgb2YgdGhlIGh0bWwgd2lsbCBiZSBpbnNlcnRlZC4gRGVmYXVsdHMgdG8gYSBwbGFpbiBkaXYgdGFnLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERPTSBFbGVtZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVGcm9tSFRNTDogZnVuY3Rpb24gKGh0bWwsIHRhZ05hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRhZ05hbWUgPT09IHVuZGVmaW5lZCkgeyB0YWdOYW1lID0gJ2Rpdic7IH1cclxuXHJcbiAgICAgICAgLy8gIEFscmVhZHkgZ290IGFuIGVsZW1lbnQ/IFJlbW92ZSBpdCBmaXJzdFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCgpO1xyXG5cclxuICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuekluZGV4ID0gJzAnO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG5cclxuICAgICAgICAvLyAgTm9kZSBoYW5kbGVyXHJcblxyXG4gICAgICAgIGVsZW1lbnQucGhhc2VyID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpemUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IERPTSBFbGVtZW50IGJvdW5kIHRvIHRoaXMgR2FtZSBPYmplY3QgZnJvbSB0aGUgRE9NIGVudGlyZWx5IGFuZCByZXNldHMgdGhlXHJcbiAgICAgKiBgbm9kZWAgcHJvcGVydHkgb2YgdGhpcyBHYW1lIE9iamVjdCB0byBiZSBgbnVsbGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNyZW1vdmVFbGVtZW50XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRE9NIEVsZW1lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUVsZW1lbnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJlbW92ZUZyb21ET00odGhpcy5ub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBjYWxscyBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBvbiB0aGUgYG5vZGVgIGFuZCB0aGVuIHNldHMgdGhlIGJvdW5kcyB3aWR0aFxyXG4gICAgICogYW5kIGhlaWdodCBpbnRvIHRoZSBgZGlzcGxheVdpZHRoYCBhbmQgYGRpc3BsYXlIZWlnaHRgIHByb3BlcnRpZXMsIGFuZCB0aGUgYGNsaWVudFdpZHRoYCBhbmQgYGNsaWVudEhlaWdodGBcclxuICAgICAqIHZhbHVlcyBpbnRvIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIHJlc3BlY3RpdmVseS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuZXZlciBhIG5ldyBlbGVtZW50IGlzIGNyZWF0ZWQgb3Igc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjdXBkYXRlU2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIERPTSBFbGVtZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVTaXplOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlO1xyXG5cclxuICAgICAgICB2YXIgbm9kZUJvdW5kcyA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGggPSBub2RlLmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbm9kZS5jbGllbnRIZWlnaHQ7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheVdpZHRoID0gbm9kZUJvdW5kcy53aWR0aCB8fCAwO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUhlaWdodCA9IG5vZGVCb3VuZHMuaGVpZ2h0IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIGZyb20gdGhpcyBET00gRWxlbWVudHMgbm9kZSwgdXNpbmcgYHF1ZXJ5U2VsZWN0b3JBbGwoJyonKWAgYW5kIHRoZW4gaXRlcmF0ZXMgdGhyb3VnaFxyXG4gICAgICogdGhlbSwgbG9va2luZyBmb3IgdGhlIGZpcnN0IG9uZSB0aGF0IGhhcyBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLiBJdCB0aGVuIHJldHVybnMgdGhpcyBjaGlsZFxyXG4gICAgICogaWYgZm91bmQsIG9yIGBudWxsYCBpZiBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNnZXRDaGlsZEJ5UHJvcGVydHlcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHNlYXJjaCB0aGUgY2hpbGRyZW4gZm9yLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBtdXN0IHN0cmljdGx5IGVxdWFsLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHs/RWxlbWVudH0gVGhlIGZpcnN0IG1hdGNoaW5nIGNoaWxkIERPTSBFbGVtZW50LCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRDaGlsZEJ5UHJvcGVydHk6IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV1bcHJvcGVydHldID09PSB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIGZyb20gdGhpcyBET00gRWxlbWVudHMgbm9kZSwgdXNpbmcgYHF1ZXJ5U2VsZWN0b3JBbGwoJyonKWAgYW5kIHRoZW4gaXRlcmF0ZXMgdGhyb3VnaFxyXG4gICAgICogdGhlbSwgbG9va2luZyBmb3IgdGhlIGZpcnN0IG9uZSB0aGF0IGhhcyBhIG1hdGNoaW5nIGlkLiBJdCB0aGVuIHJldHVybnMgdGhpcyBjaGlsZCBpZiBmb3VuZCwgb3IgYG51bGxgIGlmIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQmUgYXdhcmUgdGhhdCBjbGFzcyBhbmQgaWQgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjZ2V0Q2hpbGRCeUlEXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZCB0byBzZWFyY2ggdGhlIGNoaWxkcmVuIGZvci5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7P0VsZW1lbnR9IFRoZSBmaXJzdCBtYXRjaGluZyBjaGlsZCBET00gRWxlbWVudCwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2hpbGRCeUlEOiBmdW5jdGlvbiAoaWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRCeVByb3BlcnR5KCdpZCcsIGlkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBmcm9tIHRoaXMgRE9NIEVsZW1lbnRzIG5vZGUsIHVzaW5nIGBxdWVyeVNlbGVjdG9yQWxsKCcqJylgIGFuZCB0aGVuIGl0ZXJhdGVzIHRocm91Z2hcclxuICAgICAqIHRoZW0sIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBvbmUgdGhhdCBoYXMgYSBtYXRjaGluZyBuYW1lLiBJdCB0aGVuIHJldHVybnMgdGhpcyBjaGlsZCBpZiBmb3VuZCwgb3IgYG51bGxgIGlmIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQmUgYXdhcmUgdGhhdCBjbGFzcyBhbmQgaWQgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjZ2V0Q2hpbGRCeU5hbWVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSB0byBzZWFyY2ggdGhlIGNoaWxkcmVuIGZvci5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7P0VsZW1lbnR9IFRoZSBmaXJzdCBtYXRjaGluZyBjaGlsZCBET00gRWxlbWVudCwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkQnlQcm9wZXJ0eSgnbmFtZScsIG5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGBjbGFzc05hbWVgIHByb3BlcnR5IG9mIHRoZSBET00gRWxlbWVudCBub2RlIGFuZCB1cGRhdGVzIHRoZSBpbnRlcm5hbCBzaXplcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3NldENsYXNzTmFtZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBvciBzcGFjZS1zZXBhcmF0ZWQgY2xhc3NlcyBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBET00gRWxlbWVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Q2xhc3NOYW1lOiBmdW5jdGlvbiAoY2xhc3NOYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBgaW5uZXJUZXh0YCBwcm9wZXJ0eSBvZiB0aGUgRE9NIEVsZW1lbnQgbm9kZSBhbmQgdXBkYXRlcyB0aGUgaW50ZXJuYWwgc2l6ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCBvbmx5IGNlcnRhaW4gdHlwZXMgb2YgRWxlbWVudHMgY2FuIGhhdmUgYGlubmVyVGV4dGAgc2V0IG9uIHRoZW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCNzZXRUZXh0XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gQSBET01TdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByZW5kZXJlZCB0ZXh0IGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRE9NIEVsZW1lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFRleHQ6IGZ1bmN0aW9uICh0ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLm5vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUuaW5uZXJUZXh0ID0gdGV4dDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYGlubmVySFRNTGAgcHJvcGVydHkgb2YgdGhlIERPTSBFbGVtZW50IG5vZGUgYW5kIHVwZGF0ZXMgdGhlIGludGVybmFsIHNpemVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnQjc2V0SFRNTFxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEEgRE9NU3RyaW5nIG9mIGh0bWwgdG8gYmUgc2V0IGFzIHRoZSBgaW5uZXJIVE1MYCBwcm9wZXJ0eSBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBET00gRWxlbWVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0SFRNTDogZnVuY3Rpb24gKGh0bWwpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubm9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5pbm5lckhUTUwgPSBodG1sO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSdW5zIGludGVybmFsIHVwZGF0ZSB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3ByZVVwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudENvbnRhaW5lcjtcclxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTtcclxuXHJcbiAgICAgICAgaWYgKG5vZGUgJiYgcGFyZW50ICYmICFwYXJlbnQud2lsbFJlbmRlcigpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wYXJlcyB0aGUgcmVuZGVyTWFzayB3aXRoIHRoZSByZW5kZXJGbGFncyB0byBzZWUgaWYgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHJlbmRlciBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIERPTUVsZW1lbnRzIGFsd2F5cyByZXR1cm4gYHRydWVgIGFzIHRoZXkgbmVlZCB0byBzdGlsbCBzZXQgdmFsdWVzIGR1cmluZyB0aGUgcmVuZGVyIHBhc3MsIGV2ZW4gaWYgbm90IHZpc2libGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRE9NRWxlbWVudCN3aWxsUmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBHYW1lIE9iamVjdCBzaG91bGQgYmUgcmVuZGVyZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICB3aWxsUmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIHByZS1kZXN0cm95IHN0ZXAgZm9yIHRoZSBET00gRWxlbWVudCwgd2hpY2ggcmVtb3ZlcyB0aGUgdW5kZXJseWluZyBub2RlIGZyb20gdGhlIERPTS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3ByZURlc3Ryb3lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKi9cclxuICAgIHByZURlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmV2ZW50cy5vZmYoU0NFTkVfRVZFTlRTLlNMRUVQLCB0aGlzLmhhbmRsZVNjZW5lRXZlbnQsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmV2ZW50cy5vZmYoU0NFTkVfRVZFTlRTLldBS0UsIHRoaXMuaGFuZGxlU2NlbmVFdmVudCwgdGhpcyk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRE9NRWxlbWVudDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ1NTQmxlbmRNb2RlcyA9IHJlcXVpcmUoJy4vQ1NTQmxlbmRNb2RlcycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ET01FbGVtZW50I3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjE3LjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnR9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBET01FbGVtZW50Q1NTUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgbm9kZSA9IHNyYy5ub2RlO1xyXG4gICAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcclxuICAgIHZhciBzZXR0aW5ncyA9IHNyYy5zY2VuZS5zeXMuc2V0dGluZ3M7XHJcblxyXG4gICAgaWYgKCFub2RlIHx8ICFzdHlsZSB8fCAhc2V0dGluZ3MudmlzaWJsZSB8fCBHYW1lT2JqZWN0LlJFTkRFUl9NQVNLICE9PSBzcmMucmVuZGVyRmxhZ3MgfHwgKHNyYy5jYW1lcmFGaWx0ZXIgIT09IDAgJiYgKHNyYy5jYW1lcmFGaWx0ZXIgJiBjYW1lcmEuaWQpKSB8fCAoc3JjLnBhcmVudENvbnRhaW5lciAmJiAhc3JjLnBhcmVudENvbnRhaW5lci53aWxsUmVuZGVyKCkpKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChub2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBwYXJlbnQgPSBzcmMucGFyZW50Q29udGFpbmVyO1xyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChwYXJlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgYWxwaGEgKj0gcGFyZW50LmFscGhhO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDE7XHJcbiAgICB2YXIgc3JjTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgyO1xyXG4gICAgdmFyIGNhbGNNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgdmFyIGR4ID0gMDtcclxuICAgIHZhciBkeSA9IDA7XHJcblxyXG4gICAgdmFyIHR4ID0gJzAlJztcclxuICAgIHZhciB0eSA9ICcwJSc7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICBkeCA9IChzcmMud2lkdGggKiBzcmMuc2NhbGVYKSAqIHNyYy5vcmlnaW5YO1xyXG4gICAgICAgIGR5ID0gKHNyYy5oZWlnaHQgKiBzcmMuc2NhbGVZKSAqIHNyYy5vcmlnaW5ZO1xyXG5cclxuICAgICAgICBzcmNNYXRyaXguYXBwbHlJVFJTKHNyYy54IC0gZHgsIHNyYy55IC0gZHksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcblxyXG4gICAgICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBzcmNNYXRyaXguZSA9IHNyYy54IC0gZHg7XHJcbiAgICAgICAgc3JjTWF0cml4LmYgPSBzcmMueSAtIGR5O1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIHNyYyBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNyY01hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZHggPSAoc3JjLndpZHRoKSAqIHNyYy5vcmlnaW5YO1xyXG4gICAgICAgIGR5ID0gKHNyYy5oZWlnaHQpICogc3JjLm9yaWdpblk7XHJcbiBcclxuICAgICAgICBzcmNNYXRyaXguYXBwbHlJVFJTKHNyYy54IC0gZHgsIHNyYy55IC0gZHksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgICAgICB0eCA9ICgxMDAgKiBzcmMub3JpZ2luWCkgKyAnJSc7XHJcbiAgICAgICAgdHkgPSAoMTAwICogc3JjLm9yaWdpblkpICsgJyUnO1xyXG5cclxuICAgICAgICBzcmNNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNyY01hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3Rvclk7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBieSB0aGUgc3JjIG1hdHJpeCwgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkoc3JjTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNyYy50cmFuc2Zvcm1Pbmx5KVxyXG4gICAge1xyXG4gICAgICAgIHN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIHN0eWxlLm9wYWNpdHkgPSBhbHBoYTtcclxuICAgICAgICBzdHlsZS56SW5kZXggPSBzcmMuX2RlcHRoO1xyXG4gICAgICAgIHN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XHJcbiAgICAgICAgc3R5bGUubWl4QmxlbmRNb2RlID0gQ1NTQmxlbmRNb2Rlc1tzcmMuX2JsZW5kTW9kZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3RyYW5zZm9ybVxyXG5cclxuICAgIHN0eWxlLnRyYW5zZm9ybSA9XHJcbiAgICAgICAgY2FsY01hdHJpeC5nZXRDU1NNYXRyaXgoKSArXHJcbiAgICAgICAgJyBza2V3KCcgKyBzcmMuc2tld1ggKyAncmFkLCAnICsgc3JjLnNrZXdZICsgJ3JhZCknICtcclxuICAgICAgICAnIHJvdGF0ZTNkKCcgKyBzcmMucm90YXRlM2QueCArICcsJyArIHNyYy5yb3RhdGUzZC55ICsgJywnICsgc3JjLnJvdGF0ZTNkLnogKyAnLCcgKyBzcmMucm90YXRlM2QudyArIHNyYy5yb3RhdGUzZEFuZ2xlICsgJyknO1xyXG5cclxuICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IHR4ICsgJyAnICsgdHk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERPTUVsZW1lbnRDU1NSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRE9NRWxlbWVudCA9IHJlcXVpcmUoJy4vRE9NRWxlbWVudCcpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG5cclxuLyoqXHJcbiAqIERPTSBFbGVtZW50IEdhbWUgT2JqZWN0cyBhcmUgYSB3YXkgdG8gY29udHJvbCBhbmQgbWFuaXB1bGF0ZSBIVE1MIEVsZW1lbnRzIG92ZXIgdGhlIHRvcCBvZiB5b3VyIGdhbWUuXHJcbiAqIFxyXG4gKiBJbiBvcmRlciBmb3IgRE9NIEVsZW1lbnRzIHRvIGRpc3BsYXkgeW91IGhhdmUgdG8gZW5hYmxlIHRoZW0gYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8geW91ciBnYW1lXHJcbiAqIGNvbmZpZ3VyYXRpb24gb2JqZWN0OlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBkb20ge1xyXG4gKiAgIGNyZWF0ZUNvbnRhaW5lcjogdHJ1ZVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKiBcclxuICogV2hlbiB0aGlzIGlzIGFkZGVkLCBQaGFzZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIERPTSBDb250YWluZXIgZGl2IHRoYXQgaXMgcG9zaXRpb25lZCBvdmVyIHRoZSB0b3BcclxuICogb2YgdGhlIGdhbWUgY2FudmFzLiBUaGlzIGRpdiBpcyBzaXplZCB0byBtYXRjaCB0aGUgY2FudmFzLCBhbmQgaWYgdGhlIGNhbnZhcyBzaXplIGNoYW5nZXMsIGFzIGEgcmVzdWx0IG9mXHJcbiAqIHNldHRpbmdzIHdpdGhpbiB0aGUgU2NhbGUgTWFuYWdlciwgdGhlIGRvbSBjb250YWluZXIgaXMgcmVzaXplZCBhY2NvcmRpbmdseS5cclxuICogXHJcbiAqIFlvdSBjYW4gY3JlYXRlIGEgRE9NIEVsZW1lbnQgYnkgZWl0aGVyIHBhc3NpbmcgaW4gRE9NU3RyaW5ncywgb3IgYnkgcGFzc2luZyBpbiBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZ1xyXG4gKiBFbGVtZW50IHRoYXQgeW91IHdpc2ggdG8gYmUgcGxhY2VkIHVuZGVyIHRoZSBjb250cm9sIG9mIFBoYXNlci4gRm9yIGV4YW1wbGU6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMuYWRkLmRvbSh4LCB5LCAnZGl2JywgJ2JhY2tncm91bmQtY29sb3I6IGxpbWU7IHdpZHRoOiAyMjBweDsgaGVpZ2h0OiAxMDBweDsgZm9udDogNDhweCBBcmlhbCcsICdQaGFzZXInKTtcclxuICogYGBgXHJcbiAqIFxyXG4gKiBUaGUgYWJvdmUgY29kZSB3aWxsIGluc2VydCBhIGRpdiBlbGVtZW50IGludG8gdGhlIERPTSBDb250YWluZXIgYXQgdGhlIGdpdmVuIHgveSBjb29yZGluYXRlLiBUaGUgRE9NU3RyaW5nIGluXHJcbiAqIHRoZSA0dGggYXJndW1lbnQgc2V0cyB0aGUgaW5pdGlhbCBDU1Mgc3R5bGUgb2YgdGhlIGRpdiBhbmQgdGhlIGZpbmFsIGFyZ3VtZW50IGlzIHRoZSBpbm5lciB0ZXh0LiBJbiB0aGlzIGNhc2UsXHJcbiAqIGl0IHdpbGwgY3JlYXRlIGEgbGltZSBjb2xvcmVkIGRpdiB0aGF0IGlzIDIyMHB4IGJ5IDEwMHB4IGluIHNpemUgd2l0aCB0aGUgdGV4dCBQaGFzZXIgaW4gaXQsIGluIGFuIEFyaWFsIGZvbnQuXHJcbiAqIFxyXG4gKiBZb3Ugc2hvdWxkIG5lYXJseSBhbHdheXMsIHdpdGhvdXQgZXhjZXB0aW9uLCB1c2UgZXhwbGljaXRseSBzaXplZCBIVE1MIEVsZW1lbnRzLCBpbiBvcmRlciB0byBmdWxseSBjb250cm9sXHJcbiAqIGFsaWdubWVudCBhbmQgcG9zaXRpb25pbmcgb2YgdGhlIGVsZW1lbnRzIG5leHQgdG8gcmVndWxhciBnYW1lIGNvbnRlbnQuXHJcbiAqIFxyXG4gKiBSYXRoZXIgdGhhbiBzcGVjaWZ5IHRoZSBDU1MgYW5kIEhUTUwgZGlyZWN0bHkgeW91IGNhbiB1c2UgdGhlIGBsb2FkLmh0bWxgIEZpbGUgTG9hZGVyIHRvIGxvYWQgaXQgaW50byB0aGVcclxuICogY2FjaGUgYW5kIHRoZW4gdXNlIHRoZSBgY3JlYXRlRnJvbUNhY2hlYCBtZXRob2QgaW5zdGVhZC4gWW91IGNhbiBhbHNvIHVzZSBgY3JlYXRlRnJvbUhUTUxgIGFuZCB2YXJpb3VzIG90aGVyXHJcbiAqIG1ldGhvZHMgYXZhaWxhYmxlIGluIHRoaXMgY2xhc3MgdG8gaGVscCBjb25zdHJ1Y3QgeW91ciBlbGVtZW50cy5cclxuICogXHJcbiAqIE9uY2UgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCB5b3UgY2FuIHRoZW4gY29udHJvbCBpdCBsaWtlIHlvdSB3b3VsZCBhbnkgb3RoZXIgR2FtZSBPYmplY3QuIFlvdSBjYW4gc2V0IGl0c1xyXG4gKiBwb3NpdGlvbiwgc2NhbGUsIHJvdGF0aW9uLCBhbHBoYSBhbmQgb3RoZXIgcHJvcGVydGllcy4gSXQgd2lsbCBtb3ZlIGFzIHRoZSBtYWluIFNjZW5lIENhbWVyYSBtb3ZlcyBhbmQgYmUgY2xpcHBlZFxyXG4gKiBhdCB0aGUgZWRnZSBvZiB0aGUgY2FudmFzLiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciBzb21lIGxpbWl0YXRpb25zIG9mIERPTSBFbGVtZW50czogVGhlIG9idmlvdXMgb25lIGlzIHRoYXRcclxuICogdGhleSBhcHBlYXIgYWJvdmUgb3IgYmVsb3cgeW91ciBnYW1lIGNhbnZhcy4gWW91IGNhbm5vdCBibGVuZCB0aGVtIGludG8gdGhlIGRpc3BsYXkgbGlzdCwgbWVhbmluZyB5b3UgY2Fubm90IGhhdmVcclxuICogYSBET00gRWxlbWVudCwgdGhlbiBhIFNwcml0ZSwgdGhlbiBhbm90aGVyIERPTSBFbGVtZW50IGJlaGluZCBpdC5cclxuICogXHJcbiAqIFRoZXkgYWxzbyBjYW5ub3QgYmUgZW5hYmxlZCBmb3IgaW5wdXQuIFRvIGRvIHRoYXQsIHlvdSBoYXZlIHRvIHVzZSB0aGUgYGFkZExpc3RlbmVyYCBtZXRob2QgdG8gYWRkIG5hdGl2ZSBldmVudFxyXG4gKiBsaXN0ZW5lcnMgZGlyZWN0bHkuIFRoZSBmaW5hbCBsaW1pdGF0aW9uIGlzIHRvIGRvIHdpdGggY2FtZXJhcy4gVGhlIERPTSBDb250YWluZXIgaXMgc2l6ZWQgdG8gbWF0Y2ggdGhlIGdhbWUgY2FudmFzXHJcbiAqIGVudGlyZWx5IGFuZCBjbGlwcGVkIGFjY29yZGluZ2x5LiBET00gRWxlbWVudHMgcmVzcGVjdCBjYW1lcmEgc2Nyb2xsaW5nIGFuZCBzY3JvbGxGYWN0b3Igc2V0dGluZ3MsIGJ1dCBpZiB5b3VcclxuICogY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBjYW1lcmEgc28gaXQgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIGNhbnZhcywgdGhleSB3b24ndCBiZSBjbGlwcGVkIGFjY29yZGluZ2x5LlxyXG4gKiBcclxuICogQWxzbywgYWxsIERPTSBFbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgc2FtZSBET00gQ29udGFpbmVyLCByZWdhcmRsZXNzIG9mIHdoaWNoIFNjZW5lIHRoZXkgYXJlIGNyZWF0ZWQgaW4uXHJcbiAqIFxyXG4gKiBET00gRWxlbWVudHMgYXJlIGEgcG93ZXJmdWwgd2F5IHRvIGFsaWduIG5hdGl2ZSBIVE1MIHdpdGggeW91ciBQaGFzZXIgR2FtZSBPYmplY3RzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBpbnNlcnRcclxuICogYSBsb2dpbiBmb3JtIGZvciBhIG11bHRpcGxheWVyIGdhbWUgZGlyZWN0bHkgaW50byB5b3VyIHRpdGxlIHNjcmVlbi4gT3IgYSB0ZXh0IGlucHV0IGJveCBmb3IgYSBoaWdoc2NvcmUgdGFibGUuXHJcbiAqIE9yIGEgYmFubmVyIGFkIGZyb20gYSAzcmQgcGFydHkgc2VydmljZS4gT3IgcGVyaGFwcyB5b3UnZCBsaWtlIHRvIHVzZSB0aGVtIGZvciBoaWdoIHJlc29sdXRpb24gdGV4dCBkaXNwbGF5IGFuZFxyXG4gKiBVSS4gVGhlIGNob2ljZSBpcyB1cCB0byB5b3UsIGp1c3QgcmVtZW1iZXIgdGhhdCB5b3UncmUgZGVhbGluZyB3aXRoIHN0YW5kYXJkIEhUTUwgYW5kIENTUyBmbG9hdGluZyBvdmVyIHRoZSB0b3BcclxuICogb2YgeW91ciBnYW1lLCBhbmQgc2hvdWxkIHRyZWF0IGl0IGFjY29yZGluZ2x5LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBET00gRWxlbWVudCBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjZG9tXHJcbiAqIEBzaW5jZSAzLjE3LjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIERPTSBFbGVtZW50IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBET00gRWxlbWVudCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fHN0cmluZyl9IFtlbGVtZW50XSAtIEFuIGV4aXN0aW5nIERPTSBlbGVtZW50LCBvciBhIHN0cmluZy4gSWYgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhICMgaXQgd2lsbCBkbyBhIGBnZXRFbGVtZW50QnlJZGAgbG9vay11cCBvbiB0aGUgc3RyaW5nIChtaW51cyB0aGUgaGFzaCkuIFdpdGhvdXQgYSBoYXNoLCBpdCByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gY3JlYXRlLCBpLmUuICdkaXYnLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8YW55KX0gW3N0eWxlXSAtIElmIGEgc3RyaW5nLCB3aWxsIGJlIHNldCBkaXJlY3RseSBhcyB0aGUgZWxlbWVudHMgYHN0eWxlYCBwcm9wZXJ0eSB2YWx1ZS4gSWYgYSBwbGFpbiBvYmplY3QsIHdpbGwgYmUgaXRlcmF0ZWQgYW5kIHRoZSB2YWx1ZXMgdHJhbnNmZXJyZWQuIEluIGJvdGggY2FzZXMgdGhlIHZhbHVlcyByZXBsYWNpbmcgd2hhdGV2ZXIgQ1NTIHN0eWxlcyBtYXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgc2V0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lubmVyVGV4dF0gLSBJZiBnaXZlbiwgd2lsbCBiZSBzZXQgZGlyZWN0bHkgYXMgdGhlIGVsZW1lbnRzIGBpbm5lclRleHRgIHByb3BlcnR5IHZhbHVlLCByZXBsYWNpbmcgd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkRPTUVsZW1lbnR9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2RvbScsIGZ1bmN0aW9uICh4LCB5LCBlbGVtZW50LCBzdHlsZSwgaW5uZXJUZXh0KVxyXG57XHJcbiAgICB2YXIgZ2FtZU9iamVjdCA9IG5ldyBET01FbGVtZW50KHRoaXMuc2NlbmUsIHgsIHksIGVsZW1lbnQsIHN0eWxlLCBpbm5lclRleHQpO1xyXG5cclxuICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKGdhbWVPYmplY3QpO1xyXG4gICAgdGhpcy51cGRhdGVMaXN0LmFkZChnYW1lT2JqZWN0KTtcclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL0RPTUVsZW1lbnRDU1NSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9ET01FbGVtZW50Q1NTUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBEZXN0cm95IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBHYW1lIE9iamVjdCBpbnN0YW5jZSBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IG9uIGEgR2FtZSBPYmplY3QgaW5zdGFuY2UgdXNpbmcgYEdhbWVPYmplY3Qub24oJ2Rlc3Ryb3knLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNERVNUUk9ZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB3aGljaCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkZXN0cm95JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFZpZGVvIEdhbWUgT2JqZWN0IENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBWaWRlbyBmaW5pc2hlcyBwbGF5YmFjayBieSByZWFjaGluZyB0aGUgZW5kIG9mIGl0cyBkdXJhdGlvbi4gSXRcclxuICogaXMgYWxzbyBkaXNwYXRjaGVkIGlmIGEgdmlkZW8gbWFya2VyIHNlcXVlbmNlIGlzIGJlaW5nIHBsYXllZCBhbmQgcmVhY2hlcyB0aGUgZW5kLlxyXG4gKiBcclxuICogTm90ZSB0aGF0IG5vdCBhbGwgdmlkZW9zIGNhbiBmaXJlIHRoaXMgZXZlbnQuIExpdmUgc3RyZWFtcywgZm9yIGV4YW1wbGUsIGhhdmUgbm8gZml4ZWQgZHVyYXRpb24sXHJcbiAqIHNvIG5ldmVyIHRlY2huaWNhbGx5ICdjb21wbGV0ZScuXHJcbiAqIFxyXG4gKiBJZiBhIHZpZGVvIGlzIHN0b3BwZWQgZnJvbSBwbGF5YmFjaywgdmlhIHRoZSBgVmlkZW8uc3RvcGAgbWV0aG9kLCBpdCB3aWxsIGVtaXQgdGhlXHJcbiAqIGBWSURFT19TVE9QYCBldmVudCBpbnN0ZWFkIG9mIHRoaXMgb25lLlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBmcm9tIGEgVmlkZW8gR2FtZSBPYmplY3QgaW5zdGFuY2UgdXNpbmcgYFZpZGVvLm9uKCdjb21wbGV0ZScsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBjb21wbGV0ZWQgcGxheWJhY2suXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBWaWRlbyBHYW1lIE9iamVjdCBDcmVhdGVkIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIHRleHR1cmUgZm9yIGEgVmlkZW8gaGFzIGJlZW4gY3JlYXRlZC4gVGhpcyBoYXBwZW5zXHJcbiAqIHdoZW4gZW5vdWdoIG9mIHRoZSB2aWRlbyBzb3VyY2UgaGFzIGJlZW4gbG9hZGVkIHRoYXQgdGhlIGJyb3dzZXIgaXMgYWJsZSB0byByZW5kZXIgYVxyXG4gKiBmcmFtZSBmcm9tIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBmcm9tIGEgVmlkZW8gR2FtZSBPYmplY3QgaW5zdGFuY2UgdXNpbmcgYFZpZGVvLm9uKCdjcmVhdGVkJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fQ1JFQVRFRFxyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5WaWRlb30gdmlkZW8gLSBUaGUgVmlkZW8gR2FtZSBPYmplY3Qgd2hpY2ggcmFpc2VkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdmlkZW8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdmlkZW8uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjcmVhdGVkJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFZpZGVvIEdhbWUgT2JqZWN0IEVycm9yIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBWaWRlbyB0cmllcyB0byBwbGF5IGEgc291cmNlIHRoYXQgZG9lcyBub3QgZXhpc3QsIG9yIGlzIHRoZSB3cm9uZyBmaWxlIHR5cGUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IGZyb20gYSBWaWRlbyBHYW1lIE9iamVjdCBpbnN0YW5jZSB1c2luZyBgVmlkZW8ub24oJ2Vycm9yJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fRVJST1JcclxuICogQHNpbmNlIDMuMjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW99IHZpZGVvIC0gVGhlIFZpZGVvIEdhbWUgT2JqZWN0IHdoaWNoIHRocmV3IHRoZSBlcnJvci5cclxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBldmVudCB0aGUgYnJvd3NlciByYWlzZWQgZHVyaW5nIHBsYXliYWNrLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZXJyb3InO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVmlkZW8gR2FtZSBPYmplY3QgTG9vcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGEgVmlkZW8gdGhhdCBpcyBjdXJyZW50bHkgcGxheWluZyBoYXMgbG9vcGVkLiBUaGlzIG9ubHlcclxuICogaGFwcGVucyBpZiB0aGUgYGxvb3BgIHBhcmFtZXRlciB3YXMgc3BlY2lmaWVkLCBvciB0aGUgYHNldExvb3BgIG1ldGhvZCB3YXMgY2FsbGVkLFxyXG4gKiBhbmQgaWYgdGhlIHZpZGVvIGhhcyBhIGZpeGVkIGR1cmF0aW9uLiBWaWRlbyBzdHJlYW1zLCBmb3IgZXhhbXBsZSwgY2Fubm90IGxvb3AsIGFzXHJcbiAqIHRoZXkgaGF2ZSBubyBkdXJhdGlvbi5cclxuICogXHJcbiAqIExvb3BpbmcgaXMgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgVmlkZW8gYHRpbWV1cGRhdGVgIGV2ZW50LiBUaGlzIGV2ZW50IGlzIG5vdFxyXG4gKiBmcmFtZS1hY2N1cmF0ZSwgZHVlIHRvIHRoZSB3YXkgYnJvd3NlcnMgd29yaywgc28gcGxlYXNlIGRvIG5vdCByZWx5IG9uIHRoaXMgbG9vcFxyXG4gKiBldmVudCB0byBiZSB0aW1lIG9yIGZyYW1lIHByZWNpc2UuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IGZyb20gYSBWaWRlbyBHYW1lIE9iamVjdCBpbnN0YW5jZSB1c2luZyBgVmlkZW8ub24oJ2xvb3AnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19MT09QXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBoYXMgbG9vcGVkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnbG9vcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBWaWRlbyBHYW1lIE9iamVjdCBQbGF5IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBWaWRlbyBiZWdpbnMgcGxheWJhY2suIEZvciB2aWRlb3MgdGhhdCBkbyBub3QgcmVxdWlyZVxyXG4gKiBpbnRlcmFjdGlvbiB1bmxvY2tpbmcsIHRoaXMgaXMgdXN1YWxseSBhcyBzb29uIGFzIHRoZSBgVmlkZW8ucGxheWAgbWV0aG9kIGlzIGNhbGxlZC5cclxuICogSG93ZXZlciwgZm9yIHZpZGVvcyB0aGF0IHJlcXVpcmUgdW5sb2NraW5nLCBpdCBpcyBmaXJlZCBvbmNlIHBsYXliYWNrIGJlZ2lucyBhZnRlclxyXG4gKiB0aGV5J3ZlIGJlZW4gdW5sb2NrZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IGZyb20gYSBWaWRlbyBHYW1lIE9iamVjdCBpbnN0YW5jZSB1c2luZyBgVmlkZW8ub24oJ3BsYXknLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19QTEFZXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBzdGFydGVkIHBsYXliYWNrLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncGxheSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBWaWRlbyBHYW1lIE9iamVjdCBTZWVrZWQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIFZpZGVvIGNvbXBsZXRlcyBzZWVraW5nIHRvIGEgbmV3IHBvaW50IGluIGl0cyB0aW1lbGluZS5cclxuICogXHJcbiAqIExpc3RlbiBmb3IgaXQgZnJvbSBhIFZpZGVvIEdhbWUgT2JqZWN0IGluc3RhbmNlIHVzaW5nIGBWaWRlby5vbignc2Vla2VkJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fU0VFS0VEXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBjb21wbGV0ZWQgc2Vla2luZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3NlZWtlZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBWaWRlbyBHYW1lIE9iamVjdCBTZWVraW5nIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBWaWRlbyBfYmVnaW5zXyBzZWVraW5nIHRvIGEgbmV3IHBvaW50IGluIGl0cyB0aW1lbGluZS5cclxuICogV2hlbiB0aGUgc2VlayBpcyBjb21wbGV0ZSwgaXQgd2lsbCBkaXNwYXRjaCB0aGUgYFZJREVPX1NFRUtFRGAgZXZlbnQgdG8gY29uY2x1ZGUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IGZyb20gYSBWaWRlbyBHYW1lIE9iamVjdCBpbnN0YW5jZSB1c2luZyBgVmlkZW8ub24oJ3NlZWtpbmcnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19TRUVLSU5HXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBzdGFydGVkIHNlZWtpbmcuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzZWVraW5nJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFZpZGVvIEdhbWUgT2JqZWN0IFN0b3BwZWQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIFZpZGVvIGlzIHN0b3BwZWQgZnJvbSBwbGF5YmFjayB2aWEgYSBjYWxsIHRvIHRoZSBgVmlkZW8uc3RvcGAgbWV0aG9kLFxyXG4gKiBlaXRoZXIgZGlyZWN0bHkgdmlhIGdhbWUgY29kZSwgb3IgaW5kaXJlY3RseSBhcyB0aGUgcmVzdWx0IG9mIGNoYW5naW5nIGEgdmlkZW8gc291cmNlIG9yIGRlc3Ryb3lpbmcgaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIGl0IGZyb20gYSBWaWRlbyBHYW1lIE9iamVjdCBpbnN0YW5jZSB1c2luZyBgVmlkZW8ub24oJ3N0b3AnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19TVE9QXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCBzdG9wcGVkIHBsYXliYWNrLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnc3RvcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBWaWRlbyBHYW1lIE9iamVjdCBUaW1lb3V0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBWaWRlbyBoYXMgZXhoYXVzdGVkIGl0cyBhbGxvY2F0ZWQgdGltZSB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHZpZGVvXHJcbiAqIHNvdXJjZSB0byBzdGFydCBwbGF5YmFjay5cclxuICogXHJcbiAqIExpc3RlbiBmb3IgaXQgZnJvbSBhIFZpZGVvIEdhbWUgT2JqZWN0IGluc3RhbmNlIHVzaW5nIGBWaWRlby5vbigndGltZW91dCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1RJTUVPVVRcclxuICogQHNpbmNlIDMuMjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW99IHZpZGVvIC0gVGhlIFZpZGVvIEdhbWUgT2JqZWN0IHdoaWNoIHRpbWVkIG91dC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3RpbWVvdXQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVmlkZW8gR2FtZSBPYmplY3QgVW5sb2NrZWQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIFZpZGVvIHRoYXQgd2FzIHByZXZlbnRlZCBmcm9tIHBsYXliYWNrIGR1ZSB0byB0aGUgYnJvd3NlcnNcclxuICogTWVkaWEgRW5nYWdlbWVudCBJbnRlcmFjdGlvbiBwb2xpY3ksIGlzIHVubG9ja2VkIGJ5IGEgdXNlciBnZXN0dXJlLlxyXG4gKiBcclxuICogTGlzdGVuIGZvciBpdCBmcm9tIGEgVmlkZW8gR2FtZSBPYmplY3QgaW5zdGFuY2UgdXNpbmcgYFZpZGVvLm9uKCd1bmxvY2tlZCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1VOTE9DS0VEXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSB2aWRlbyAtIFRoZSBWaWRlbyBHYW1lIE9iamVjdCB3aGljaCByYWlzZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndW5sb2NrZWQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBERVNUUk9ZOiByZXF1aXJlKCcuL0RFU1RST1lfRVZFTlQnKSxcclxuICAgIFZJREVPX0NPTVBMRVRFOiByZXF1aXJlKCcuL1ZJREVPX0NPTVBMRVRFX0VWRU5UJyksXHJcbiAgICBWSURFT19DUkVBVEVEOiByZXF1aXJlKCcuL1ZJREVPX0NSRUFURURfRVZFTlQnKSxcclxuICAgIFZJREVPX0VSUk9SOiByZXF1aXJlKCcuL1ZJREVPX0VSUk9SX0VWRU5UJyksXHJcbiAgICBWSURFT19MT09QOiByZXF1aXJlKCcuL1ZJREVPX0xPT1BfRVZFTlQnKSxcclxuICAgIFZJREVPX1BMQVk6IHJlcXVpcmUoJy4vVklERU9fUExBWV9FVkVOVCcpLFxyXG4gICAgVklERU9fU0VFS0VEOiByZXF1aXJlKCcuL1ZJREVPX1NFRUtFRF9FVkVOVCcpLFxyXG4gICAgVklERU9fU0VFS0lORzogcmVxdWlyZSgnLi9WSURFT19TRUVLSU5HX0VWRU5UJyksXHJcbiAgICBWSURFT19TVE9QOiByZXF1aXJlKCcuL1ZJREVPX1NUT1BfRVZFTlQnKSxcclxuICAgIFZJREVPX1RJTUVPVVQ6IHJlcXVpcmUoJy4vVklERU9fVElNRU9VVF9FVkVOVCcpLFxyXG4gICAgVklERU9fVU5MT0NLRUQ6IHJlcXVpcmUoJy4vVklERU9fVU5MT0NLRURfRVZFTlQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Jyk7XHJcbnZhciBFeHRlcm5SZW5kZXIgPSByZXF1aXJlKCcuL0V4dGVyblJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQW4gRXh0ZXJuIEdhbWUgT2JqZWN0IGlzIGEgc3BlY2lhbCB0eXBlIG9mIEdhbWUgT2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBwYXNzXHJcbiAqIHJlbmRlcmluZyBvZmYgdG8gYSAzcmQgcGFydHkuXHJcbiAqIFxyXG4gKiBXaGVuIHlvdSBjcmVhdGUgYW4gRXh0ZXJuIGFuZCBwbGFjZSBpdCBpbiB0aGUgZGlzcGxheSBsaXN0IG9mIGEgU2NlbmUsIHRoZSByZW5kZXJlciB3aWxsXHJcbiAqIHByb2Nlc3MgdGhlIGxpc3QgYXMgdXN1YWwuIFdoZW4gaXQgZmluZHMgYW4gRXh0ZXJuIGl0IHdpbGwgZmx1c2ggdGhlIGN1cnJlbnQgYmF0Y2gsXHJcbiAqIGNsZWFyIGRvd24gdGhlIHBpcGVsaW5lIGFuZCBwcmVwYXJlIGEgdHJhbnNmb3JtIG1hdHJpeCB3aGljaCB5b3VyIHJlbmRlciBmdW5jdGlvbiBjYW5cclxuICogdGFrZSBhZHZhbnRhZ2Ugb2YsIGlmIHJlcXVpcmVkLlxyXG4gKiBcclxuICogVGhlIFdlYkdMIGNvbnRleHQgaXMgdGhlbiBsZWZ0IGlzIGEgJ2NsZWFuJyBzdGF0ZSwgcmVhZHkgZm9yIHlvdSB0byBiaW5kIHlvdXIgb3duIHNoYWRlcnMsXHJcbiAqIG9yIGRyYXcgdG8gaXQsIHdoYXRldmVyIHlvdSB3aXNoIHRvIGRvLiBPbmNlIHlvdSd2ZSBmaW5pc2hlZCwgeW91IHNob3VsZCBmcmVlLXVwIGFueVxyXG4gKiBvZiB5b3VyIHJlc291cmNlcy4gVGhlIEV4dGVybiB3aWxsIHRoZW4gcmViaW5kIHRoZSBQaGFzZXIgcGlwZWxpbmUgYW5kIGNhcnJ5IG9uIFxyXG4gKiByZW5kZXJpbmcgdGhlIGRpc3BsYXkgbGlzdC5cclxuICogXHJcbiAqIEFsdGhvdWdoIHRoaXMgb2JqZWN0IGhhcyBsb3RzIG9mIHByb3BlcnRpZXMgc3VjaCBhcyBBbHBoYSwgQmxlbmQgTW9kZSBhbmQgVGludCwgbm9uZSBvZlxyXG4gKiB0aGVtIGFyZSB1c2VkIGR1cmluZyByZW5kZXJpbmcgdW5sZXNzIHlvdSB0YWtlIGFkdmFudGFnZSBvZiB0aGVtIGluIHlvdXIgb3duIHJlbmRlciBjb2RlLlxyXG4gKlxyXG4gKiBAY2xhc3MgRXh0ZXJuXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGFcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXBcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKi9cclxudmFyIEV4dGVybiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuT3JpZ2luLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlRleHR1cmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UaW50LFxyXG4gICAgICAgIENvbXBvbmVudHMuVHJhbnNmb3JtLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmlzaWJsZSxcclxuICAgICAgICBFeHRlcm5SZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBFeHRlcm4gKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3QuY2FsbCh0aGlzLCBzY2VuZSwgJ0V4dGVybicpO1xyXG4gICAgfSxcclxuXHJcbiAgICBwcmVVcGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIG92ZXJyaWRlIHRoaXMhXHJcbiAgICAgICAgLy8gIEFyZ3VtZW50czogdGltZSwgZGVsdGFcclxuICAgIH0sXHJcblxyXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBvdmVycmlkZSB0aGlzIVxyXG4gICAgICAgIC8vICBBcmd1bWVudHM6IHJlbmRlcmVyLCBjYW1lcmEsIGNhbGNNYXRyaXhcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFeHRlcm47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEV4dGVybiA9IHJlcXVpcmUoJy4vRXh0ZXJuJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm4gR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBFeHRlcm4gR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I2V4dGVyblxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5FeHRlcm59IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2V4dGVybicsIGZ1bmN0aW9uICgpXHJcbntcclxuICAgIHZhciBleHRlcm4gPSBuZXcgRXh0ZXJuKHRoaXMuc2NlbmUpO1xyXG5cclxuICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKGV4dGVybik7XHJcbiAgICB0aGlzLnVwZGF0ZUxpc3QuYWRkKGV4dGVybik7XHJcblxyXG4gICAgcmV0dXJuIGV4dGVybjtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9FeHRlcm5XZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0V4dGVybkNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5FeHRlcm4jcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuRXh0ZXJufSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgRXh0ZXJuV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHJlbmRlcmVyLmN1cnJlbnRQaXBlbGluZTtcclxuXHJcbiAgICByZW5kZXJlci5jbGVhclBpcGVsaW5lKCk7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHJlbmRlcmVyLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzcHJpdGVNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHJlbmRlcmVyLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICBzcHJpdGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5lID0gc3JjLng7XHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmYgPSBzcmMueTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBDYWxsYmFja1xyXG4gICAgc3JjLnJlbmRlci5jYWxsKHNyYywgcmVuZGVyZXIsIGNhbWVyYSwgY2FsY01hdHJpeCk7XHJcblxyXG4gICAgcmVuZGVyZXIucmViaW5kUGlwZWxpbmUocGlwZWxpbmUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFeHRlcm5XZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEFSQzogMCxcclxuICAgIEJFR0lOX1BBVEg6IDEsXHJcbiAgICBDTE9TRV9QQVRIOiAyLFxyXG4gICAgRklMTF9SRUNUOiAzLFxyXG4gICAgTElORV9UTzogNCxcclxuICAgIE1PVkVfVE86IDUsXHJcbiAgICBMSU5FX1NUWUxFOiA2LFxyXG4gICAgRklMTF9TVFlMRTogNyxcclxuICAgIEZJTExfUEFUSDogOCxcclxuICAgIFNUUk9LRV9QQVRIOiA5LFxyXG4gICAgRklMTF9UUklBTkdMRTogMTAsXHJcbiAgICBTVFJPS0VfVFJJQU5HTEU6IDExLFxyXG4gICAgU0FWRTogMTQsXHJcbiAgICBSRVNUT1JFOiAxNSxcclxuICAgIFRSQU5TTEFURTogMTYsXHJcbiAgICBTQ0FMRTogMTcsXHJcbiAgICBST1RBVEU6IDE4LFxyXG4gICAgU0VUX1RFWFRVUkU6IDE5LFxyXG4gICAgQ0xFQVJfVEVYVFVSRTogMjAsXHJcbiAgICBHUkFESUVOVF9GSUxMX1NUWUxFOiAyMSxcclxuICAgIEdSQURJRU5UX0xJTkVfU1RZTEU6IDIyXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCYXNlQ2FtZXJhID0gcmVxdWlyZSgnLi4vLi4vY2FtZXJhcy8yZC9CYXNlQ2FtZXJhLmpzJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21tYW5kcyA9IHJlcXVpcmUoJy4vQ29tbWFuZHMnKTtcclxudmFyIENvbXBvbmVudHNBbHBoYSA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvQWxwaGFTaW5nbGUnKTtcclxudmFyIENvbXBvbmVudHNCbGVuZE1vZGUgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL0JsZW5kTW9kZScpO1xyXG52YXIgQ29tcG9uZW50c0RlcHRoID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9EZXB0aCcpO1xyXG52YXIgQ29tcG9uZW50c01hc2sgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL01hc2snKTtcclxudmFyIENvbXBvbmVudHNQaXBlbGluZSA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvUGlwZWxpbmUnKTtcclxudmFyIENvbXBvbmVudHNUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL1RyYW5zZm9ybScpO1xyXG52YXIgQ29tcG9uZW50c1Zpc2libGUgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL1Zpc2libGUnKTtcclxudmFyIENvbXBvbmVudHNTY3JvbGxGYWN0b3IgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL1Njcm9sbEZhY3RvcicpO1xyXG5cclxudmFyIFRyYW5zZm9ybU1hdHJpeCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvVHJhbnNmb3JtTWF0cml4Jyk7XHJcblxyXG52YXIgRWxsaXBzZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vZWxsaXBzZS9FbGxpcHNlJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBSZW5kZXIgPSByZXF1aXJlKCcuL0dyYXBoaWNzUmVuZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIEdyYXBoaWNzIG9iamVjdCBpcyBhIHdheSB0byBkcmF3IHByaW1pdGl2ZSBzaGFwZXMgdG8geW91ciBnYW1lLiBQcmltaXRpdmVzIGluY2x1ZGUgZm9ybXMgb2YgZ2VvbWV0cnksIHN1Y2ggYXNcclxuICogUmVjdGFuZ2xlcywgQ2lyY2xlcywgYW5kIFBvbHlnb25zLiBUaGV5IGFsc28gaW5jbHVkZSBsaW5lcywgYXJjcyBhbmQgY3VydmVzLiBXaGVuIHlvdSBpbml0aWFsbHkgY3JlYXRlIGEgR3JhcGhpY3NcclxuICogb2JqZWN0IGl0IHdpbGwgYmUgZW1wdHkuXHJcbiAqXHJcbiAqIFRvIGRyYXcgdG8gaXQgeW91IG11c3QgZmlyc3Qgc3BlY2lmeSBhIGxpbmUgc3R5bGUgb3IgZmlsbCBzdHlsZSAob3IgYm90aCksIGRyYXcgc2hhcGVzIHVzaW5nIHBhdGhzLCBhbmQgZmluYWxseVxyXG4gKiBmaWxsIG9yIHN0cm9rZSB0aGVtLiBGb3IgZXhhbXBsZTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBncmFwaGljcy5saW5lU3R5bGUoNSwgMHhGRjAwRkYsIDEuMCk7XHJcbiAqIGdyYXBoaWNzLmJlZ2luUGF0aCgpO1xyXG4gKiBncmFwaGljcy5tb3ZlVG8oMTAwLCAxMDApO1xyXG4gKiBncmFwaGljcy5saW5lVG8oMjAwLCAyMDApO1xyXG4gKiBncmFwaGljcy5jbG9zZVBhdGgoKTtcclxuICogZ3JhcGhpY3Muc3Ryb2tlUGF0aCgpO1xyXG4gKiBgYGBcclxuICpcclxuICogVGhlcmUgYXJlIGFsc28gbWFueSBoZWxwZnVsIG1ldGhvZHMgdGhhdCBkcmF3IGFuZCBmaWxsL3N0cm9rZSBjb21tb24gc2hhcGVzIGZvciB5b3UuXHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZ3JhcGhpY3MubGluZVN0eWxlKDUsIDB4RkYwMEZGLCAxLjApO1xyXG4gKiBncmFwaGljcy5maWxsU3R5bGUoMHhGRkZGRkYsIDEuMCk7XHJcbiAqIGdyYXBoaWNzLmZpbGxSZWN0KDUwLCA1MCwgNDAwLCAyMDApO1xyXG4gKiBncmFwaGljcy5zdHJva2VSZWN0KDUwLCA1MCwgNDAwLCAyMDApO1xyXG4gKiBgYGBcclxuICpcclxuICogV2hlbiBhIEdyYXBoaWNzIG9iamVjdCBpcyByZW5kZXJlZCBpdCB3aWxsIHJlbmRlciBkaWZmZXJlbnRseSBiYXNlZCBvbiBpZiB0aGUgZ2FtZSBpcyBydW5uaW5nIHVuZGVyIENhbnZhcyBvciBXZWJHTC5cclxuICogVW5kZXIgQ2FudmFzIGl0IHdpbGwgdXNlIHRoZSBIVE1MIENhbnZhcyBjb250ZXh0IGRyYXdpbmcgb3BlcmF0aW9ucyB0byBkcmF3IHRoZSBwYXRoLlxyXG4gKiBVbmRlciBXZWJHTCB0aGUgZ3JhcGhpY3MgZGF0YSBpcyBkZWNvbXBvc2VkIGludG8gcG9seWdvbnMuIEJvdGggb2YgdGhlc2UgYXJlIGV4cGVuc2l2ZSBwcm9jZXNzZXMsIGVzcGVjaWFsbHkgd2l0aFxyXG4gKiBjb21wbGV4IHNoYXBlcy5cclxuICpcclxuICogSWYgeW91ciBHcmFwaGljcyBvYmplY3QgZG9lc24ndCBjaGFuZ2UgbXVjaCAob3IgYXQgYWxsKSBvbmNlIHlvdSd2ZSBkcmF3biB5b3VyIHNoYXBlIHRvIGl0LCB0aGVuIHlvdSB3aWxsIGhlbHBcclxuICogcGVyZm9ybWFuY2UgYnkgY2FsbGluZyB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2dlbmVyYXRlVGV4dHVyZX0uIFRoaXMgd2lsbCAnYmFrZScgdGhlIEdyYXBoaWNzIG9iamVjdCBpbnRvXHJcbiAqIGEgVGV4dHVyZSwgYW5kIHJldHVybiBpdC4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIFRleHR1cmUgZm9yIFNwcml0ZXMgb3Igb3RoZXIgZGlzcGxheSBvYmplY3RzLiBJZiB5b3VyIEdyYXBoaWNzIG9iamVjdFxyXG4gKiB1cGRhdGVzIGZyZXF1ZW50bHkgdGhlbiB5b3Ugc2hvdWxkIGF2b2lkIGRvaW5nIHRoaXMsIGFzIGl0IHdpbGwgY29uc3RhbnRseSBnZW5lcmF0ZSBuZXcgdGV4dHVyZXMsIHdoaWNoIHdpbGwgY29uc3VtZVxyXG4gKiBtZW1vcnkuXHJcbiAqXHJcbiAqIEFzIHlvdSBjYW4gdGVsbCwgR3JhcGhpY3Mgb2JqZWN0cyBhcmUgYSBiaXQgb2YgYSB0cmFkZS1vZmYuIFdoaWxlIHRoZXkgYXJlIGV4dHJlbWVseSB1c2VmdWwsIHlvdSBuZWVkIHRvIGJlIGNhcmVmdWxcclxuICogaW4gdGhlaXIgY29tcGxleGl0eSBhbmQgcXVhbnRpdHkgb2YgdGhlbSBpbiB5b3VyIGdhbWUuXHJcbiAqXHJcbiAqIEBjbGFzcyBHcmFwaGljc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGFTaW5nbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdyYXBoaWNzIG9iamVjdCBiZWxvbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5HcmFwaGljcy5PcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25zIHRoYXQgc2V0IHRoZSBwb3NpdGlvbiBhbmQgZGVmYXVsdCBzdHlsZSBvZiB0aGlzIEdyYXBoaWNzIG9iamVjdC5cclxuICovXHJcbnZhciBHcmFwaGljcyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50c0JsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50c01hc2ssXHJcbiAgICAgICAgQ29tcG9uZW50c1BpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHNUcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50c1Zpc2libGUsXHJcbiAgICAgICAgQ29tcG9uZW50c1Njcm9sbEZhY3RvcixcclxuICAgICAgICBSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBHcmFwaGljcyAoc2NlbmUsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSBHZXRWYWx1ZShvcHRpb25zLCAneCcsIDApO1xyXG4gICAgICAgIHZhciB5ID0gR2V0VmFsdWUob3B0aW9ucywgJ3knLCAwKTtcclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnR3JhcGhpY3MnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBkaXNwbGF5IG9yaWdpbiBvZiB0aGUgR3JhcGhpY3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZGlzcGxheU9yaWdpblhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlPcmlnaW5YID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZlcnRpY2FsIGRpc3BsYXkgb3JpZ2luIG9mIHRoZSBHcmFwaGljcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNkaXNwbGF5T3JpZ2luWVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlzcGxheU9yaWdpblkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYXJyYXkgb2YgY29tbWFuZHMgdXNlZCB0byByZW5kZXIgdGhlIEdyYXBoaWNzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2NvbW1hbmRCdWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgZmlsbCBjb2xvciBmb3Igc2hhcGVzIHJlbmRlcmVkIGJ5IHRoaXMgR3JhcGhpY3Mgb2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2RlZmF1bHRGaWxsQ29sb3JcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IC0xXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsbENvbG9yID0gLTE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGZpbGwgYWxwaGEgZm9yIHNoYXBlcyByZW5kZXJlZCBieSB0aGlzIEdyYXBoaWNzIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNkZWZhdWx0RmlsbEFscGhhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsbEFscGhhID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgc3Ryb2tlIHdpZHRoIGZvciBzaGFwZXMgcmVuZGVyZWQgYnkgdGhpcyBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZGVmYXVsdFN0cm9rZVdpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U3Ryb2tlV2lkdGggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBzdHJva2UgY29sb3IgZm9yIHNoYXBlcyByZW5kZXJlZCBieSB0aGlzIEdyYXBoaWNzIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNkZWZhdWx0U3Ryb2tlQ29sb3JcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IC0xXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U3Ryb2tlQ29sb3IgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgc3Ryb2tlIGFscGhhIGZvciBzaGFwZXMgcmVuZGVyZWQgYnkgdGhpcyBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZGVmYXVsdFN0cm9rZUFscGhhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0U3Ryb2tlQWxwaGEgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwcm9wZXJ0eSB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBsaW5lIHdpZHRoIHN0eWxlIHNldHRpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjX2xpbmVXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9saW5lV2lkdGggPSAxLjA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjX3RlbXBNYXRyaXgxXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4MSA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCwgcmUtdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBiYXRjaGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNfdGVtcE1hdHJpeDJcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgyID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI190ZW1wTWF0cml4M1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDMgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFN0eWxlcyhvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgc3R5bGUgc2V0dGluZ3MgZm9yIHRoaXMgR3JhcGhpY3Mgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3NldERlZmF1bHRTdHlsZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyYXBoaWNzLlN0eWxlc30gb3B0aW9ucyAtIFRoZSBzdHlsZXMgdG8gc2V0IGFzIGRlZmF1bHRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldERlZmF1bHRTdHlsZXM6IGZ1bmN0aW9uIChvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChHZXRWYWx1ZShvcHRpb25zLCAnbGluZVN0eWxlJywgbnVsbCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTdHJva2VXaWR0aCA9IEdldFZhbHVlKG9wdGlvbnMsICdsaW5lU3R5bGUud2lkdGgnLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3Ryb2tlQ29sb3IgPSBHZXRWYWx1ZShvcHRpb25zLCAnbGluZVN0eWxlLmNvbG9yJywgMHhmZmZmZmYpO1xyXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTdHJva2VBbHBoYSA9IEdldFZhbHVlKG9wdGlvbnMsICdsaW5lU3R5bGUuYWxwaGEnLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubGluZVN0eWxlKHRoaXMuZGVmYXVsdFN0cm9rZVdpZHRoLCB0aGlzLmRlZmF1bHRTdHJva2VDb2xvciwgdGhpcy5kZWZhdWx0U3Ryb2tlQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEdldFZhbHVlKG9wdGlvbnMsICdmaWxsU3R5bGUnLCBudWxsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZpbGxDb2xvciA9IEdldFZhbHVlKG9wdGlvbnMsICdmaWxsU3R5bGUuY29sb3InLCAweGZmZmZmZik7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEZpbGxBbHBoYSA9IEdldFZhbHVlKG9wdGlvbnMsICdmaWxsU3R5bGUuYWxwaGEnLCAxKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsbFN0eWxlKHRoaXMuZGVmYXVsdEZpbGxDb2xvciwgdGhpcy5kZWZhdWx0RmlsbEFscGhhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY3VycmVudCBsaW5lIHN0eWxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2xpbmVTdHlsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVXaWR0aCAtIFRoZSBzdHJva2Ugd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sb3IgLSBUaGUgc3Ryb2tlIGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYT0xXSAtIFRoZSBzdHJva2UgYWxwaGEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbGluZVN0eWxlOiBmdW5jdGlvbiAobGluZVdpZHRoLCBjb2xvciwgYWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5MSU5FX1NUWUxFLFxyXG4gICAgICAgICAgICBsaW5lV2lkdGgsIGNvbG9yLCBhbHBoYVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX2xpbmVXaWR0aCA9IGxpbmVXaWR0aDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjdXJyZW50IGZpbGwgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbFN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sb3IgLSBUaGUgZmlsbCBjb2xvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYWxwaGE9MV0gLSBUaGUgZmlsbCBhbHBoYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsU3R5bGU6IGZ1bmN0aW9uIChjb2xvciwgYWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5GSUxMX1NUWUxFLFxyXG4gICAgICAgICAgICBjb2xvciwgYWxwaGFcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgZ3JhZGllbnQgZmlsbCBzdHlsZS4gVGhpcyBpcyBhIFdlYkdMIG9ubHkgZmVhdHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZ3JhZGllbnQgY29sb3IgdmFsdWVzIHJlcHJlc2VudCB0aGUgNCBjb3JuZXJzIG9mIGFuIHVudHJhbnNmb3JtZWQgcmVjdGFuZ2xlLlxyXG4gICAgICogVGhlIGdyYWRpZW50IGlzIHVzZWQgdG8gY29sb3IgYWxsIGZpbGxlZCBzaGFwZXMgYW5kIHBhdGhzIGRyYXduIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byB0dXJuIGEgZ3JhZGllbnQgb2ZmLCBjYWxsIGBmaWxsU3R5bGVgIGFuZCBwcm92aWRlIGEgbmV3IHNpbmdsZSBmaWxsIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gZmlsbGluZyBhIHRyaWFuZ2xlIG9ubHkgdGhlIGZpcnN0IDMgY29sb3IgdmFsdWVzIHByb3ZpZGVkIGFyZSB1c2VkIGZvciB0aGUgMyBwb2ludHMgb2YgYSB0cmlhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZlYXR1cmUgaXMgYmVzdCB1c2VkIG9ubHkgb24gcmVjdGFuZ2xlcyBhbmQgdHJpYW5nbGVzLiBBbGwgb3RoZXIgc2hhcGVzIHdpbGwgZ2l2ZSBzdHJhbmdlIHJlc3VsdHMuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGF0IGZvciBvYmplY3RzIHN1Y2ggYXMgYXJjcyBvciBlbGxpcHNlcywgb3IgYW55dGhpbmcgd2hpY2ggaXMgbWFkZSBvdXQgb2YgdHJpYW5nbGVzLCBlYWNoIHRyaWFuZ2xlIHVzZWRcclxuICAgICAqIHdpbGwgYmUgZmlsbGVkIHdpdGggYSBncmFkaWVudCBvbiBpdHMgb3duLiBUaGVyZSBpcyBubyBhYmlsaXR5IHRvIGdyYWRpZW50IGZpbGwgYSBzaGFwZSBvciBwYXRoIGFzIGEgc2luZ2xlXHJcbiAgICAgKiBlbnRpdHkgYXQgdGhpcyB0aW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxHcmFkaWVudFN0eWxlXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0b3BMZWZ0IC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgdG9wLWxlZnQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0b3BSaWdodCAtIFRoZSB0aW50IGJlaW5nIGFwcGxpZWQgdG8gdGhlIHRvcC1yaWdodCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGJvdHRvbUxlZnQgLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGJvdHRvbVJpZ2h0IC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgYm90dG9tLXJpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYWxwaGE9MV0gLSBUaGUgZmlsbCBhbHBoYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsR3JhZGllbnRTdHlsZTogZnVuY3Rpb24gKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodCwgYWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5HUkFESUVOVF9GSUxMX1NUWUxFLFxyXG4gICAgICAgICAgICBhbHBoYSwgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGdyYWRpZW50IGxpbmUgc3R5bGUuIFRoaXMgaXMgYSBXZWJHTCBvbmx5IGZlYXR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGdyYWRpZW50IGNvbG9yIHZhbHVlcyByZXByZXNlbnQgdGhlIDQgY29ybmVycyBvZiBhbiB1bnRyYW5zZm9ybWVkIHJlY3RhbmdsZS5cclxuICAgICAqIFRoZSBncmFkaWVudCBpcyB1c2VkIHRvIGNvbG9yIGFsbCBzdHJva2VkIHNoYXBlcyBhbmQgcGF0aHMgZHJhd24gYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC5cclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHR1cm4gYSBncmFkaWVudCBvZmYsIGNhbGwgYGxpbmVTdHlsZWAgYW5kIHByb3ZpZGUgYSBuZXcgc2luZ2xlIGxpbmUgY29sb3IuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBmZWF0dXJlIGlzIGJlc3QgdXNlZCBvbmx5IG9uIHNpbmdsZSBsaW5lcy4gQWxsIG90aGVyIHNoYXBlcyB3aWxsIGdpdmUgc3RyYW5nZSByZXN1bHRzLlxyXG4gICAgICpcclxuICAgICAqIE5vdGUgdGhhdCBmb3Igb2JqZWN0cyBzdWNoIGFzIGFyY3Mgb3IgZWxsaXBzZXMsIG9yIGFueXRoaW5nIHdoaWNoIGlzIG1hZGUgb3V0IG9mIHRyaWFuZ2xlcywgZWFjaCB0cmlhbmdsZSB1c2VkXHJcbiAgICAgKiB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgZ3JhZGllbnQgb24gaXRzIG93bi4gVGhlcmUgaXMgbm8gYWJpbGl0eSB0byBncmFkaWVudCBzdHJva2UgYSBzaGFwZSBvciBwYXRoIGFzIGEgc2luZ2xlXHJcbiAgICAgKiBlbnRpdHkgYXQgdGhpcyB0aW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2xpbmVHcmFkaWVudFN0eWxlXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVXaWR0aCAtIFRoZSBzdHJva2Ugd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRvcExlZnQgLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSB0b3AtbGVmdCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRvcFJpZ2h0IC0gVGhlIHRpbnQgYmVpbmcgYXBwbGllZCB0byB0aGUgdG9wLXJpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYm90dG9tTGVmdCAtIFRoZSB0aW50IGJlaW5nIGFwcGxpZWQgdG8gdGhlIGJvdHRvbS1sZWZ0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYm90dG9tUmlnaHQgLSBUaGUgdGludCBiZWluZyBhcHBsaWVkIHRvIHRoZSBib3R0b20tcmlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYT0xXSAtIFRoZSBmaWxsIGFscGhhLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGxpbmVHcmFkaWVudFN0eWxlOiBmdW5jdGlvbiAobGluZVdpZHRoLCB0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7IGFscGhhID0gMTsgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuR1JBRElFTlRfTElORV9TVFlMRSxcclxuICAgICAgICAgICAgbGluZVdpZHRoLCBhbHBoYSwgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSBmcmFtZSB0aGlzIEdyYXBoaWNzIE9iamVjdCB3aWxsIHVzZSB3aGVuIGRyYXdpbmcgYWxsIHNoYXBlcyBkZWZpbmVkIGFmdGVyIGNhbGxpbmcgdGhpcy5cclxuICAgICAqXHJcbiAgICAgKiBUZXh0dXJlcyBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBzdHJpbmctYmFzZWQga2V5cywgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogT25jZSBzZXQsIGFsbCBzaGFwZXMgd2lsbCB1c2UgdGhpcyB0ZXh0dXJlLiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIHRvIGNsZWFyIGl0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSB0ZXh0dXJlcyBhcmUgbm90IHRpbGVkLiBUaGV5IGFyZSBzdHJldGNoZWQgdG8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHNoYXBlcyBiZWluZyByZW5kZXJlZC4gRm9yIHRoaXMgcmVhc29uLFxyXG4gICAgICogaXQgd29ya3MgYmVzdCB3aXRoIHNlYW1sZXNzIC8gdGlsZWFibGUgdGV4dHVyZXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG1vZGUgYXJndW1lbnQgY29udHJvbHMgaG93IHRoZSB0ZXh0dXJlcyBhcmUgY29tYmluZWQgd2l0aCB0aGUgZmlsbCBjb2xvcnMuIFRoZSBkZWZhdWx0IHZhbHVlICgwKSB3aWxsXHJcbiAgICAgKiBtdWx0aXBseSB0aGUgdGV4dHVyZSBieSB0aGUgZmlsbCBjb2xvci4gQSB2YWx1ZSBvZiAxIHdpbGwgdXNlIGp1c3QgdGhlIGZpbGwgY29sb3IsIGJ1dCB0aGUgYWxwaGEgZGF0YSBmcm9tIHRoZSB0ZXh0dXJlLFxyXG4gICAgICogYW5kIGEgdmFsdWUgb2YgMiB3aWxsIHVzZSBqdXN0IHRoZSB0ZXh0dXJlIGFuZCBubyBmaWxsIGNvbG9yIGF0IGFsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNzZXRUZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIGtleSBvZiB0aGUgdGV4dHVyZSB0byBiZSB1c2VkLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci4gTGVhdmUgYmxhbmsgdG8gY2xlYXIgYSBwcmV2aW91c2x5IHNldCB0ZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9kZT0wXSAtIFRoZSB0ZXh0dXJlIHRpbnQgbW9kZS4gMCBpcyBtdWx0aXBseSwgMSBpcyBhbHBoYSBvbmx5IGFuZCAyIGlzIHRleHR1cmUgb25seS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUZXh0dXJlOiBmdW5jdGlvbiAoa2V5LCBmcmFtZSwgbW9kZSlcclxuICAgIHtcclxuICAgICAgICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7IG1vZGUgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQ29tbWFuZHMuQ0xFQVJfVEVYVFVSRVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGV4dHVyZUZyYW1lID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0RnJhbWUoa2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dHVyZUZyYW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gMilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gMztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBDb21tYW5kcy5TRVRfVEVYVFVSRSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlRnJhbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnQgYSBuZXcgc2hhcGUgcGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNiZWdpblBhdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGJlZ2luUGF0aDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuQkVHSU5fUEFUSFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjY2xvc2VQYXRoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjbG9zZVBhdGg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyLnB1c2goXHJcbiAgICAgICAgICAgIENvbW1hbmRzLkNMT1NFX1BBVEhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSBjdXJyZW50IHBhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbFBhdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxQYXRoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5GSUxMX1BBVEhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSBjdXJyZW50IHBhdGguXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBHcmFwaGljcy5maWxsUGF0aGAgYW5kIGRvZXMgdGhlIHNhbWUgdGhpbmcuXHJcbiAgICAgKiBJdCB3YXMgYWRkZWQgdG8gbWF0Y2ggdGhlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQgMkQgQVBJLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5GSUxMX1BBVEhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJva2UgdGhlIGN1cnJlbnQgcGF0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNzdHJva2VQYXRoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdHJva2VQYXRoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5TVFJPS0VfUEFUSFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSB0aGUgY3VycmVudCBwYXRoLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIGFuIGFsaWFzIGZvciBgR3JhcGhpY3Muc3Ryb2tlUGF0aGAgYW5kIGRvZXMgdGhlIHNhbWUgdGhpbmcuXHJcbiAgICAgKiBJdCB3YXMgYWRkZWQgdG8gbWF0Y2ggdGhlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQgMkQgQVBJLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuU1RST0tFX1BBVEhcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSBnaXZlbiBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbENpcmNsZVNoYXBlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIGNpcmNsZSB0byBmaWxsLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxDaXJjbGVTaGFwZTogZnVuY3Rpb24gKGNpcmNsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWxsQ2lyY2xlKGNpcmNsZS54LCBjaXJjbGUueSwgY2lyY2xlLnJhZGl1cyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Ryb2tlIHRoZSBnaXZlbiBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc3Ryb2tlQ2lyY2xlU2hhcGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgY2lyY2xlIHRvIHN0cm9rZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdHJva2VDaXJjbGVTaGFwZTogZnVuY3Rpb24gKGNpcmNsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHJva2VDaXJjbGUoY2lyY2xlLngsIGNpcmNsZS55LCBjaXJjbGUucmFkaXVzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIGEgY2lyY2xlIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCByYWRpdXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbENpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxDaXJjbGU6IGZ1bmN0aW9uICh4LCB5LCByYWRpdXMpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5iZWdpblBhdGgoKTtcclxuICAgICAgICB0aGlzLmFyYyh4LCB5LCByYWRpdXMsIDAsIE1BVEhfQ09OU1QuUEkyKTtcclxuICAgICAgICB0aGlzLmZpbGxQYXRoKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSBhIGNpcmNsZSB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgcmFkaXVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZUNpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZUNpcmNsZTogZnVuY3Rpb24gKHgsIHksIHJhZGl1cylcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIHRoaXMuYXJjKHgsIHksIHJhZGl1cywgMCwgTUFUSF9DT05TVC5QSTIpO1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlUGF0aCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSBnaXZlbiByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbFJlY3RTaGFwZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgcmVjdGFuZ2xlIHRvIGZpbGwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZmlsbFJlY3RTaGFwZTogZnVuY3Rpb24gKHJlY3QpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsbFJlY3QocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJva2UgdGhlIGdpdmVuIHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNzdHJva2VSZWN0U2hhcGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIHJlY3RhbmdsZSB0byBzdHJva2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3Ryb2tlUmVjdFNoYXBlOiBmdW5jdGlvbiAocmVjdClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHJva2VSZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCBhIHJlY3RhbmdsZSB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNmaWxsUmVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuRklMTF9SRUNULFxyXG4gICAgICAgICAgICB4LCB5LCB3aWR0aCwgaGVpZ2h0XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Ryb2tlIGEgcmVjdGFuZ2xlIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZVJlY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdHJva2VSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB2YXIgbGluZVdpZHRoSGFsZiA9IHRoaXMuX2xpbmVXaWR0aCAvIDI7XHJcbiAgICAgICAgdmFyIG1pbnggPSB4IC0gbGluZVdpZHRoSGFsZjtcclxuICAgICAgICB2YXIgbWF4eCA9IHggKyBsaW5lV2lkdGhIYWxmO1xyXG5cclxuICAgICAgICB0aGlzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIHRoaXMubW92ZVRvKHgsIHkpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHgsIHkgKyBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlUGF0aCgpO1xyXG5cclxuICAgICAgICB0aGlzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIHRoaXMubW92ZVRvKHggKyB3aWR0aCwgeSk7XHJcbiAgICAgICAgdGhpcy5saW5lVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnN0cm9rZVBhdGgoKTtcclxuXHJcbiAgICAgICAgdGhpcy5iZWdpblBhdGgoKTtcclxuICAgICAgICB0aGlzLm1vdmVUbyhtaW54LCB5KTtcclxuICAgICAgICB0aGlzLmxpbmVUbyhtYXh4ICsgd2lkdGgsIHkpO1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlUGF0aCgpO1xyXG5cclxuICAgICAgICB0aGlzLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIHRoaXMubW92ZVRvKG1pbngsIHkgKyBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKG1heHggKyB3aWR0aCwgeSArIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zdHJva2VQYXRoKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgYSByb3VuZGVkIHJlY3RhbmdsZSB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiwgc2l6ZSBhbmQgcmFkaXVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxSb3VuZGVkUmVjdFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5HcmFwaGljcy5Sb3VuZGVkUmVjdFJhZGl1c3xudW1iZXIpfSBbcmFkaXVzPTIwXSAtIFRoZSBjb3JuZXIgcmFkaXVzOyBJdCBjYW4gYWxzbyBiZSBhbiBvYmplY3QgdG8gc3BlY2lmeSBkaWZmZXJlbnQgcmFkaWkgZm9yIGNvcm5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZmlsbFJvdW5kZWRSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyYWRpdXMgPT09IHVuZGVmaW5lZCkgeyByYWRpdXMgPSAyMDsgfVxyXG5cclxuICAgICAgICB2YXIgdGwgPSByYWRpdXM7XHJcbiAgICAgICAgdmFyIHRyID0gcmFkaXVzO1xyXG4gICAgICAgIHZhciBibCA9IHJhZGl1cztcclxuICAgICAgICB2YXIgYnIgPSByYWRpdXM7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmFkaXVzICE9PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRsID0gR2V0RmFzdFZhbHVlKHJhZGl1cywgJ3RsJywgMjApO1xyXG4gICAgICAgICAgICB0ciA9IEdldEZhc3RWYWx1ZShyYWRpdXMsICd0cicsIDIwKTtcclxuICAgICAgICAgICAgYmwgPSBHZXRGYXN0VmFsdWUocmFkaXVzLCAnYmwnLCAyMCk7XHJcbiAgICAgICAgICAgIGJyID0gR2V0RmFzdFZhbHVlKHJhZGl1cywgJ2JyJywgMjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5iZWdpblBhdGgoKTtcclxuICAgICAgICB0aGlzLm1vdmVUbyh4ICsgdGwsIHkpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHggKyB3aWR0aCAtIHRyLCB5KTtcclxuICAgICAgICB0aGlzLmFyYyh4ICsgd2lkdGggLSB0ciwgeSArIHRyLCB0ciwgLU1BVEhfQ09OU1QuVEFVLCAwKTtcclxuICAgICAgICB0aGlzLmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSBicik7XHJcbiAgICAgICAgdGhpcy5hcmMoeCArIHdpZHRoIC0gYnIsIHkgKyBoZWlnaHQgLSBiciwgYnIsIDAsIE1BVEhfQ09OU1QuVEFVKTtcclxuICAgICAgICB0aGlzLmxpbmVUbyh4ICsgYmwsIHkgKyBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuYXJjKHggKyBibCwgeSArIGhlaWdodCAtIGJsLCBibCwgTUFUSF9DT05TVC5UQVUsIE1hdGguUEkpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHgsIHkgKyB0bCk7XHJcbiAgICAgICAgdGhpcy5hcmMoeCArIHRsLCB5ICsgdGwsIHRsLCAtTWF0aC5QSSwgLU1BVEhfQ09OU1QuVEFVKTtcclxuICAgICAgICB0aGlzLmZpbGxQYXRoKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSBhIHJvdW5kZWQgcmVjdGFuZ2xlIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uLCBzaXplIGFuZCByYWRpdXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc3Ryb2tlUm91bmRlZFJlY3RcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JhcGhpY3MuUm91bmRlZFJlY3RSYWRpdXN8bnVtYmVyKX0gW3JhZGl1cz0yMF0gLSBUaGUgY29ybmVyIHJhZGl1czsgSXQgY2FuIGFsc28gYmUgYW4gb2JqZWN0IHRvIHNwZWNpZnkgZGlmZmVyZW50IHJhZGlpIGZvciBjb3JuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZVJvdW5kZWRSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyYWRpdXMgPT09IHVuZGVmaW5lZCkgeyByYWRpdXMgPSAyMDsgfVxyXG5cclxuICAgICAgICB2YXIgdGwgPSByYWRpdXM7XHJcbiAgICAgICAgdmFyIHRyID0gcmFkaXVzO1xyXG4gICAgICAgIHZhciBibCA9IHJhZGl1cztcclxuICAgICAgICB2YXIgYnIgPSByYWRpdXM7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmFkaXVzICE9PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRsID0gR2V0RmFzdFZhbHVlKHJhZGl1cywgJ3RsJywgMjApO1xyXG4gICAgICAgICAgICB0ciA9IEdldEZhc3RWYWx1ZShyYWRpdXMsICd0cicsIDIwKTtcclxuICAgICAgICAgICAgYmwgPSBHZXRGYXN0VmFsdWUocmFkaXVzLCAnYmwnLCAyMCk7XHJcbiAgICAgICAgICAgIGJyID0gR2V0RmFzdFZhbHVlKHJhZGl1cywgJ2JyJywgMjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5iZWdpblBhdGgoKTtcclxuICAgICAgICB0aGlzLm1vdmVUbyh4ICsgdGwsIHkpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHggKyB3aWR0aCAtIHRyLCB5KTtcclxuICAgICAgICB0aGlzLmFyYyh4ICsgd2lkdGggLSB0ciwgeSArIHRyLCB0ciwgLU1BVEhfQ09OU1QuVEFVLCAwKTtcclxuICAgICAgICB0aGlzLmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSBicik7XHJcbiAgICAgICAgdGhpcy5hcmMoeCArIHdpZHRoIC0gYnIsIHkgKyBoZWlnaHQgLSBiciwgYnIsIDAsIE1BVEhfQ09OU1QuVEFVKTtcclxuICAgICAgICB0aGlzLmxpbmVUbyh4ICsgYmwsIHkgKyBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuYXJjKHggKyBibCwgeSArIGhlaWdodCAtIGJsLCBibCwgTUFUSF9DT05TVC5UQVUsIE1hdGguUEkpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHgsIHkgKyB0bCk7XHJcbiAgICAgICAgdGhpcy5hcmMoeCArIHRsLCB5ICsgdGwsIHRsLCAtTWF0aC5QSSwgLU1BVEhfQ09OU1QuVEFVKTtcclxuICAgICAgICB0aGlzLnN0cm9rZVBhdGgoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCB0aGUgZ2l2ZW4gcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogRHJhd3MgYSBzcXVhcmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCAxIHBpeGVsIGluIHNpemUgYnkgZGVmYXVsdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNmaWxsUG9pbnRTaGFwZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8UGhhc2VyLk1hdGguVmVjdG9yMnxvYmplY3QpfSBwb2ludCAtIFRoZSBwb2ludCB0byBmaWxsLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHNxdWFyZSB0byBkcmF3LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxQb2ludFNoYXBlOiBmdW5jdGlvbiAocG9pbnQsIHNpemUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsbFBvaW50KHBvaW50LngsIHBvaW50LnksIHNpemUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgYSBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogRHJhd3MgYSBzcXVhcmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCAxIHBpeGVsIGluIHNpemUgYnkgZGVmYXVsdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNmaWxsUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHNxdWFyZSB0byBkcmF3LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxQb2ludDogZnVuY3Rpb24gKHgsIHksIHNpemUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFzaXplIHx8IHNpemUgPCAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2l6ZSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggLT0gKHNpemUgLyAyKTtcclxuICAgICAgICAgICAgeSAtPSAoc2l6ZSAvIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyLnB1c2goXHJcbiAgICAgICAgICAgIENvbW1hbmRzLkZJTExfUkVDVCxcclxuICAgICAgICAgICAgeCwgeSwgc2l6ZSwgc2l6ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGwgdGhlIGdpdmVuIHRyaWFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxUcmlhbmdsZVNoYXBlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0byBmaWxsLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbGxUcmlhbmdsZVNoYXBlOiBmdW5jdGlvbiAodHJpYW5nbGUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsbFRyaWFuZ2xlKHRyaWFuZ2xlLngxLCB0cmlhbmdsZS55MSwgdHJpYW5nbGUueDIsIHRyaWFuZ2xlLnkyLCB0cmlhbmdsZS54MywgdHJpYW5nbGUueTMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSB0aGUgZ2l2ZW4gdHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc3Ryb2tlVHJpYW5nbGVTaGFwZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgdHJpYW5nbGUgdG8gc3Ryb2tlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZVRyaWFuZ2xlU2hhcGU6IGZ1bmN0aW9uICh0cmlhbmdsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHJva2VUcmlhbmdsZSh0cmlhbmdsZS54MSwgdHJpYW5nbGUueTEsIHRyaWFuZ2xlLngyLCB0cmlhbmdsZS55MiwgdHJpYW5nbGUueDMsIHRyaWFuZ2xlLnkzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIGEgdHJpYW5nbGUgd2l0aCB0aGUgZ2l2ZW4gcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxUcmlhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTAgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZmlsbFRyaWFuZ2xlOiBmdW5jdGlvbiAoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuRklMTF9UUklBTkdMRSxcclxuICAgICAgICAgICAgeDAsIHkwLCB4MSwgeTEsIHgyLCB5MlxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSBhIHRyaWFuZ2xlIHdpdGggdGhlIGdpdmVuIHBvaW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNzdHJva2VUcmlhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTAgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3Ryb2tlVHJpYW5nbGU6IGZ1bmN0aW9uICh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5TVFJPS0VfVFJJQU5HTEUsXHJcbiAgICAgICAgICAgIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IHRoZSBnaXZlbiBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZUxpbmVTaGFwZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUgdG8gc3Ryb2tlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZUxpbmVTaGFwZTogZnVuY3Rpb24gKGxpbmUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUJldHdlZW4obGluZS54MSwgbGluZS55MSwgbGluZS54MiwgbGluZS55Mik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBhIGxpbmUgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2xpbmVCZXR3ZWVuXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGxpbmVCZXR3ZWVuOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5iZWdpblBhdGgoKTtcclxuICAgICAgICB0aGlzLm1vdmVUbyh4MSwgeTEpO1xyXG4gICAgICAgIHRoaXMubGluZVRvKHgyLCB5Mik7XHJcbiAgICAgICAgdGhpcy5zdHJva2VQYXRoKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgYSBsaW5lIGZyb20gdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogTW92ZXMgdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjbGluZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZHJhdyB0aGUgbGluZSB0by5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBkcmF3IHRoZSBsaW5lIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGxpbmVUbzogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyLnB1c2goXHJcbiAgICAgICAgICAgIENvbW1hbmRzLkxJTkVfVE8sXHJcbiAgICAgICAgICAgIHgsIHlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlIHRoZSBjdXJyZW50IGRyYXdpbmcgcG9zaXRpb24gdG8gdGhlIGdpdmVuIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI21vdmVUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIG1vdmUgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gbW92ZSB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG86IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5NT1ZFX1RPLFxyXG4gICAgICAgICAgICB4LCB5XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Ryb2tlIHRoZSBzaGFwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2YgcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIFBhc3MgYGNsb3NlU2hhcGVgIHRvIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHNoYXBlIGJ5IGpvaW5pbmcgdGhlIGxhc3QgdG8gdGhlIGZpcnN0IHBvaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBQYXNzIGBjbG9zZVBhdGhgIHRvIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHBhdGggYmVmb3JlIGl0IGlzIHN0cm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc3Ryb2tlUG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gcG9pbnRzIC0gVGhlIHBvaW50cyB0byBzdHJva2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9zZVNoYXBlPWZhbHNlXSAtIFdoZW4gYHRydWVgLCB0aGUgc2hhcGUgaXMgY2xvc2VkIGJ5IGpvaW5pbmcgdGhlIGxhc3QgcG9pbnQgdG8gdGhlIGZpcnN0IHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2xvc2VQYXRoPWZhbHNlXSAtIFdoZW4gYHRydWVgLCB0aGUgcGF0aCBpcyBjbG9zZWQgYmVmb3JlIGJlaW5nIHN0cm9rZWQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleF0gLSBUaGUgaW5kZXggb2YgYHBvaW50c2AgdG8gc3RvcCBkcmF3aW5nIGF0LiBEZWZhdWx0cyB0byBgcG9pbnRzLmxlbmd0aGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3Ryb2tlUG9pbnRzOiBmdW5jdGlvbiAocG9pbnRzLCBjbG9zZVNoYXBlLCBjbG9zZVBhdGgsIGVuZEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjbG9zZVNoYXBlID09PSB1bmRlZmluZWQpIHsgY2xvc2VTaGFwZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGNsb3NlUGF0aCA9PT0gdW5kZWZpbmVkKSB7IGNsb3NlUGF0aCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHsgZW5kSW5kZXggPSBwb2ludHMubGVuZ3RoOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgIHRoaXMubW92ZVRvKHBvaW50c1swXS54LCBwb2ludHNbMF0ueSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZW5kSW5kZXg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZVRvKHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xvc2VTaGFwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZVRvKHBvaW50c1swXS54LCBwb2ludHNbMF0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xvc2VQYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3Ryb2tlUGF0aCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxsIHRoZSBzaGFwZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2YgcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIFBhc3MgYGNsb3NlU2hhcGVgIHRvIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHNoYXBlIGJ5IGpvaW5pbmcgdGhlIGxhc3QgdG8gdGhlIGZpcnN0IHBvaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBQYXNzIGBjbG9zZVBhdGhgIHRvIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIHBhdGggYmVmb3JlIGl0IGlzIGZpbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNmaWxsUG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gcG9pbnRzIC0gVGhlIHBvaW50cyB0byBmaWxsLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2xvc2VTaGFwZT1mYWxzZV0gLSBXaGVuIGB0cnVlYCwgdGhlIHNoYXBlIGlzIGNsb3NlZCBieSBqb2luaW5nIHRoZSBsYXN0IHBvaW50IHRvIHRoZSBmaXJzdCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Nsb3NlUGF0aD1mYWxzZV0gLSBXaGVuIGB0cnVlYCwgdGhlIHBhdGggaXMgY2xvc2VkIGJlZm9yZSBiZWluZyBzdHJva2VkLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZW5kSW5kZXhdIC0gVGhlIGluZGV4IG9mIGBwb2ludHNgIHRvIHN0b3AgYXQuIERlZmF1bHRzIHRvIGBwb2ludHMubGVuZ3RoYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsUG9pbnRzOiBmdW5jdGlvbiAocG9pbnRzLCBjbG9zZVNoYXBlLCBjbG9zZVBhdGgsIGVuZEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjbG9zZVNoYXBlID09PSB1bmRlZmluZWQpIHsgY2xvc2VTaGFwZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGNsb3NlUGF0aCA9PT0gdW5kZWZpbmVkKSB7IGNsb3NlUGF0aCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHsgZW5kSW5kZXggPSBwb2ludHMubGVuZ3RoOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgIHRoaXMubW92ZVRvKHBvaW50c1swXS54LCBwb2ludHNbMF0ueSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZW5kSW5kZXg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZVRvKHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xvc2VTaGFwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGluZVRvKHBvaW50c1swXS54LCBwb2ludHNbMF0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xvc2VQYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlsbFBhdGgoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Ryb2tlIHRoZSBnaXZlbiBlbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZUVsbGlwc2VTaGFwZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBlbGxpcHNlIC0gVGhlIGVsbGlwc2UgdG8gc3Ryb2tlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc21vb3RobmVzcz0zMl0gLSBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBkcmF3IHRoZSBlbGxpcHNlIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3Ryb2tlRWxsaXBzZVNoYXBlOiBmdW5jdGlvbiAoZWxsaXBzZSwgc21vb3RobmVzcylcclxuICAgIHtcclxuICAgICAgICBpZiAoc21vb3RobmVzcyA9PT0gdW5kZWZpbmVkKSB7IHNtb290aG5lc3MgPSAzMjsgfVxyXG5cclxuICAgICAgICB2YXIgcG9pbnRzID0gZWxsaXBzZS5nZXRQb2ludHMoc21vb3RobmVzcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cm9rZVBvaW50cyhwb2ludHMsIHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cm9rZSBhbiBlbGxpcHNlIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3N0cm9rZUVsbGlwc2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3Ntb290aG5lc3M9MzJdIC0gVGhlIG51bWJlciBvZiBwb2ludHMgdG8gZHJhdyB0aGUgZWxsaXBzZSB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN0cm9rZUVsbGlwc2U6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzbW9vdGhuZXNzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzbW9vdGhuZXNzID09PSB1bmRlZmluZWQpIHsgc21vb3RobmVzcyA9IDMyOyB9XHJcblxyXG4gICAgICAgIHZhciBlbGxpcHNlID0gbmV3IEVsbGlwc2UoeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBwb2ludHMgPSBlbGxpcHNlLmdldFBvaW50cyhzbW9vdGhuZXNzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Ryb2tlUG9pbnRzKHBvaW50cywgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCB0aGUgZ2l2ZW4gZWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNmaWxsRWxsaXBzZVNoYXBlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgZWxsaXBzZSB0byBmaWxsLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc21vb3RobmVzcz0zMl0gLSBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBkcmF3IHRoZSBlbGxpcHNlIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZmlsbEVsbGlwc2VTaGFwZTogZnVuY3Rpb24gKGVsbGlwc2UsIHNtb290aG5lc3MpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNtb290aG5lc3MgPT09IHVuZGVmaW5lZCkgeyBzbW9vdGhuZXNzID0gMzI7IH1cclxuXHJcbiAgICAgICAgdmFyIHBvaW50cyA9IGVsbGlwc2UuZ2V0UG9pbnRzKHNtb290aG5lc3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5maWxsUG9pbnRzKHBvaW50cywgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsbCBhbiBlbGxpcHNlIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2ZpbGxFbGxpcHNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzbW9vdGhuZXNzPTMyXSAtIFRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIGRyYXcgdGhlIGVsbGlwc2Ugd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsRWxsaXBzZTogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIHNtb290aG5lc3MpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNtb290aG5lc3MgPT09IHVuZGVmaW5lZCkgeyBzbW9vdGhuZXNzID0gMzI7IH1cclxuXHJcbiAgICAgICAgdmFyIGVsbGlwc2UgPSBuZXcgRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdmFyIHBvaW50cyA9IGVsbGlwc2UuZ2V0UG9pbnRzKHNtb290aG5lc3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5maWxsUG9pbnRzKHBvaW50cywgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhdyBhbiBhcmMuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGNpcmNsZXMsIG9yIHBhcnRzIG9mIGNpcmNsZXMuXHJcbiAgICAgKiBcclxuICAgICAqIE1ha2Ugc3VyZSB5b3UgY2FsbCBgYmVnaW5QYXRoYCBiZWZvcmUgc3RhcnRpbmcgdGhlIGFyYyB1bmxlc3MgeW91IHdpc2ggZm9yIHRoZSBhcmMgdG8gYXV0b21hdGljYWxseVxyXG4gICAgICogY2xvc2Ugd2hlbiBmaWxsZWQgb3Igc3Ryb2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgdGhlIG9wdGlvbmFsIGBvdmVyc2hvb3RgIGFyZ3VtZW50IGluY3JlYXNlIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IHRha2UgcGxhY2Ugd2hlblxyXG4gICAgICogdGhlIGFyYyBpcyByZW5kZXJlZCBpbiBXZWJHTC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91J3JlIGRyYXdpbmcgYW4gYXJjIHdpdGggYW4gZXNwZWNpYWxseSB0aGljayBsaW5lLFxyXG4gICAgICogYXMgaXQgd2lsbCBhbGxvdyB0aGUgYXJjIHRvIGZ1bGx5IGpvaW4tdXAuIFRyeSBzbWFsbCB2YWx1ZXMgYXQgZmlyc3QsIGkuZS4gMC4wMS5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjZmlsbFBhdGh9IG9yIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc3Ryb2tlUGF0aH0gYWZ0ZXIgY2FsbGluZ1xyXG4gICAgICogdGhpcyBtZXRob2QgdG8gZHJhdyB0aGUgYXJjLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2FyY1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0QW5nbGUgLSBUaGUgc3RhcnRpbmcgYW5nbGUsIGluIHJhZGlhbnMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kQW5nbGUgLSBUaGUgZW5kaW5nIGFuZ2xlLCBpbiByYWRpYW5zLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYW50aWNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkcmF3aW5nIHNob3VsZCBiZSBhbnRpY2xvY2t3aXNlIG9yIGNsb2Nrd2lzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3ZlcnNob290PTBdIC0gVGhpcyB2YWx1ZSBhbGxvd3MgeW91IHRvIGluY3JlYXNlIHRoZSBzZWdtZW50IGl0ZXJhdGlvbnMgaW4gV2ViR0wgcmVuZGVyaW5nLiBVc2VmdWwgaWYgdGhlIGFyYyBoYXMgYSB0aGljayBzdHJva2UgYW5kIG5lZWRzIHRvIG92ZXJzaG9vdCB0byBqb2luLXVwIGNsZWFubHkuIFVzZSBzbWFsbCBudW1iZXJzIHN1Y2ggYXMgMC4wMSB0byBzdGFydCB3aXRoIGFuZCBpbmNyZWFzZSBhcyBuZWVkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXJjOiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW50aWNsb2Nrd2lzZSwgb3ZlcnNob290KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhbnRpY2xvY2t3aXNlID09PSB1bmRlZmluZWQpIHsgYW50aWNsb2Nrd2lzZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKG92ZXJzaG9vdCA9PT0gdW5kZWZpbmVkKSB7IG92ZXJzaG9vdCA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyLnB1c2goXHJcbiAgICAgICAgICAgIENvbW1hbmRzLkFSQyxcclxuICAgICAgICAgICAgeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW50aWNsb2Nrd2lzZSwgb3ZlcnNob290XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHBpZS1jaGFydCBzbGljZSBzaGFwZSBjZW50ZXJlZCBhdCBgeGAsIGB5YCB3aXRoIHRoZSBnaXZlbiByYWRpdXMuXHJcbiAgICAgKiBZb3UgbXVzdCBkZWZpbmUgdGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGUgb2YgdGhlIHNsaWNlLlxyXG4gICAgICpcclxuICAgICAqIFNldHRpbmcgdGhlIGBhbnRpY2xvY2t3aXNlYCBhcmd1bWVudCB0byBgdHJ1ZWAgY3JlYXRlcyBhIHNoYXBlIHNpbWlsYXIgdG8gUGFjbWFuLlxyXG4gICAgICogU2V0dGluZyBpdCB0byBgZmFsc2VgIGNyZWF0ZXMgYSBzaGFwZSBsaWtlIGEgc2xpY2Ugb2YgcGllLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmVnaW4gYSBuZXcgcGF0aCBhbmQgY2xvc2UgdGhlIHBhdGggYXQgdGhlIGVuZCBvZiBpdC5cclxuICAgICAqIFRvIGRpc3BsYXkgdGhlIGFjdHVhbCBzbGljZSB5b3UgbmVlZCB0byBjYWxsIGVpdGhlciBgc3Ryb2tlUGF0aGAgb3IgYGZpbGxQYXRoYCBhZnRlciBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNzbGljZVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjZW50ZXIgb2YgdGhlIHNsaWNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY2VudGVyIG9mIHRoZSBzbGljZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBzbGljZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEFuZ2xlIC0gVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBzbGljZSwgZ2l2ZW4gaW4gcmFkaWFucy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRBbmdsZSAtIFRoZSBlbmQgYW5nbGUgb2YgdGhlIHNsaWNlLCBnaXZlbiBpbiByYWRpYW5zLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYW50aWNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkcmF3aW5nIHNob3VsZCBiZSBhbnRpY2xvY2t3aXNlIG9yIGNsb2Nrd2lzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3ZlcnNob290PTBdIC0gVGhpcyB2YWx1ZSBhbGxvd3MgeW91IHRvIG92ZXJzaG9vdCB0aGUgZW5kQW5nbGUgYnkgdGhpcyBhbW91bnQuIFVzZWZ1bCBpZiB0aGUgYXJjIGhhcyBhIHRoaWNrIHN0cm9rZSBhbmQgbmVlZHMgdG8gb3ZlcnNob290IHRvIGpvaW4tdXAgY2xlYW5seS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzbGljZTogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGFudGljbG9ja3dpc2UsIG92ZXJzaG9vdClcclxuICAgIHtcclxuICAgICAgICBpZiAoYW50aWNsb2Nrd2lzZSA9PT0gdW5kZWZpbmVkKSB7IGFudGljbG9ja3dpc2UgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChvdmVyc2hvb3QgPT09IHVuZGVmaW5lZCkgeyBvdmVyc2hvb3QgPSAwOyB9XHJcblxyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKENvbW1hbmRzLkJFR0lOX1BBVEgpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChDb21tYW5kcy5NT1ZFX1RPLCB4LCB5KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyLnB1c2goQ29tbWFuZHMuQVJDLCB4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBhbnRpY2xvY2t3aXNlLCBvdmVyc2hvb3QpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChDb21tYW5kcy5DTE9TRV9QQVRIKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBHcmFwaGljcyBieSBwdXNoaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9udG8gYSBzdGFjay5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgbW9zdCByZWNlbnRseSBzYXZlZCBzdGF0ZSBjYW4gdGhlbiBiZSByZXN0b3JlZCB3aXRoIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjcmVzdG9yZX0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjc2F2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2F2ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuU0FWRVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RvcmVzIHRoZSBtb3N0IHJlY2VudGx5IHNhdmVkIHN0YXRlIG9mIHRoZSBHcmFwaGljcyBieSBwb3BwaW5nIGZyb20gdGhlIHN0YXRlIHN0YWNrLlxyXG4gICAgICpcclxuICAgICAqIFVzZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3NhdmV9IHRvIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUsIGFuZCBjYWxsIHRoaXMgYWZ0ZXJ3YXJkcyB0byByZXN0b3JlIHRoYXQgc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlcmUgaXMgbm8gc2F2ZWQgc3RhdGUsIHRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjcmVzdG9yZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzdG9yZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuUkVTVE9SRVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydHMgYSB0cmFuc2xhdGlvbiBjb21tYW5kIGludG8gdGhpcyBHcmFwaGljcyBvYmplY3RzIGNvbW1hbmQgYnVmZmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBBbGwgb2JqZWN0cyBkcmF3biBfYWZ0ZXJfIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBiZSB0cmFuc2xhdGVkXHJcbiAgICAgKiBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgcG9zaXRpb24gb2YgdGhlIEdyYXBoaWNzIG9iamVjdCBpdHNlbGYsXHJcbiAgICAgKiBvbmx5IG9mIHRoZSBvYmplY3RzIGRyYXduIGJ5IGl0IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjdHJhbnNsYXRlQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIHRvIGFwcGx5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gdG8gYXBwbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdHJhbnNsYXRlQ2FudmFzOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIucHVzaChcclxuICAgICAgICAgICAgQ29tbWFuZHMuVFJBTlNMQVRFLFxyXG4gICAgICAgICAgICB4LCB5XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0cyBhIHNjYWxlIGNvbW1hbmQgaW50byB0aGlzIEdyYXBoaWNzIG9iamVjdHMgY29tbWFuZCBidWZmZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEFsbCBvYmplY3RzIGRyYXduIF9hZnRlcl8gY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGJlIHNjYWxlZFxyXG4gICAgICogYnkgdGhlIGdpdmVuIGFtb3VudC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNjYWxlIG9mIHRoZSBHcmFwaGljcyBvYmplY3QgaXRzZWxmLFxyXG4gICAgICogb25seSBvZiB0aGUgb2JqZWN0cyBkcmF3biBieSBpdCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI3NjYWxlQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHNjYWxlIHRvIGFwcGx5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgc2NhbGUgdG8gYXBwbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2NhbGVDYW52YXM6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5TQ0FMRSxcclxuICAgICAgICAgICAgeCwgeVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydHMgYSByb3RhdGlvbiBjb21tYW5kIGludG8gdGhpcyBHcmFwaGljcyBvYmplY3RzIGNvbW1hbmQgYnVmZmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBBbGwgb2JqZWN0cyBkcmF3biBfYWZ0ZXJfIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBiZSByb3RhdGVkXHJcbiAgICAgKiBieSB0aGUgZ2l2ZW4gYW1vdW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgcm90YXRpb24gb2YgdGhlIEdyYXBoaWNzIG9iamVjdCBpdHNlbGYsXHJcbiAgICAgKiBvbmx5IG9mIHRoZSBvYmplY3RzIGRyYXduIGJ5IGl0IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3Mjcm90YXRlQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIFRoZSByb3RhdGlvbiBhbmdsZSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByb3RhdGVDYW52YXM6IGZ1bmN0aW9uIChyYWRpYW5zKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5wdXNoKFxyXG4gICAgICAgICAgICBDb21tYW5kcy5ST1RBVEUsXHJcbiAgICAgICAgICAgIHJhZGlhbnNcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhciB0aGUgY29tbWFuZCBidWZmZXIgYW5kIHJlc2V0IHRoZSBmaWxsIHN0eWxlIGFuZCBsaW5lIHN0eWxlIHRvIHRoZWlyIGRlZmF1bHRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2NsZWFyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjbGVhcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdEZpbGxDb2xvciA+IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5maWxsU3R5bGUodGhpcy5kZWZhdWx0RmlsbENvbG9yLCB0aGlzLmRlZmF1bHRGaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFN0cm9rZUNvbG9yID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVTdHlsZSh0aGlzLmRlZmF1bHRTdHJva2VXaWR0aCwgdGhpcy5kZWZhdWx0U3Ryb2tlQ29sb3IsIHRoaXMuZGVmYXVsdFN0cm9rZUFscGhhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGEgdGV4dHVyZSBmcm9tIHRoaXMgR3JhcGhpY3Mgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIElmIGBrZXlgIGlzIGEgc3RyaW5nIGl0J2xsIGdlbmVyYXRlIGEgbmV3IHRleHR1cmUgdXNpbmcgaXQgYW5kIGFkZCBpdCBpbnRvIHRoZVxyXG4gICAgICogVGV4dHVyZSBNYW5hZ2VyIChhc3N1bWluZyBubyBrZXkgY29uZmxpY3QgaGFwcGVucykuXHJcbiAgICAgKlxyXG4gICAgICogSWYgYGtleWAgaXMgYSBDYW52YXMgaXQgd2lsbCBkcmF3IHRoZSB0ZXh0dXJlIHRvIHRoYXQgY2FudmFzIGNvbnRleHQuIE5vdGUgdGhhdCBpdCB3aWxsIE5PVFxyXG4gICAgICogYXV0b21hdGljYWxseSB1cGxvYWQgaXQgdG8gdGhlIEdQVSBpbiBXZWJHTCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzI2dlbmVyYXRlVGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfEhUTUxDYW52YXNFbGVtZW50KX0ga2V5IC0gVGhlIGtleSB0byBzdG9yZSB0aGUgdGV4dHVyZSB3aXRoIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIsIG9yIGEgQ2FudmFzIHRvIGRyYXcgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGdyYXBoaWNzIHRvIGdlbmVyYXRlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoaWNzIHRvIGdlbmVyYXRlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdlbmVyYXRlVGV4dHVyZTogZnVuY3Rpb24gKGtleSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB2YXIgc3lzID0gdGhpcy5zY2VuZS5zeXM7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gc3lzLmdhbWUucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gc3lzLnNjYWxlLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHN5cy5zY2FsZS5oZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgR3JhcGhpY3MuVGFyZ2V0Q2FtZXJhLnNldFNjZW5lKHRoaXMuc2NlbmUpO1xyXG4gICAgICAgIEdyYXBoaWNzLlRhcmdldENhbWVyYS5zZXRWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICBHcmFwaGljcy5UYXJnZXRDYW1lcmEuc2Nyb2xsWCA9IHRoaXMueDtcclxuICAgICAgICBHcmFwaGljcy5UYXJnZXRDYW1lcmEuc2Nyb2xsWSA9IHRoaXMueTtcclxuXHJcbiAgICAgICAgdmFyIHRleHR1cmU7XHJcbiAgICAgICAgdmFyIGN0eDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHN5cy50ZXh0dXJlcy5leGlzdHMoa2V5KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEtleSBpcyBhIHN0cmluZywgaXQgRE9FUyBleGlzdCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyIEFORCBpcyBhIGNhbnZhcywgc28gZHJhdyB0byBpdFxyXG5cclxuICAgICAgICAgICAgICAgIHRleHR1cmUgPSBzeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHNyYyA9IHRleHR1cmUuZ2V0U291cmNlSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gc3JjLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgS2V5IGlzIGEgc3RyaW5nIGFuZCBkb2Vzbid0IGV4aXN0IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIsIHNvIGdlbmVyYXRlIGFuZCBzYXZlIGl0XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZSA9IHN5cy50ZXh0dXJlcy5jcmVhdGVDYW52YXMoa2V5LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdHggPSB0ZXh0dXJlLmdldFNvdXJjZUltYWdlKCkuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBLZXkgaXMgYSBDYW52YXMsIHNvIGRyYXcgdG8gaXRcclxuXHJcbiAgICAgICAgICAgIGN0eCA9IGtleS5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN0eClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIHZhciBHcmFwaGljc0NhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeCwgcmVuZGVyVGFyZ2V0Q3R4LCBhbGxvd0NsaXApXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FudmFzKHJlbmRlcmVyLCB0aGlzLCAwLCBHcmFwaGljcy5UYXJnZXRDYW1lcmEsIG51bGwsIGN0eCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRleHR1cmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHR1cmUucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBkZXN0cm95IGhhbmRsZXIsIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXN0cm95IHByb2Nlc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjcHJlRGVzdHJveVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgKi9cclxuICAgIHByZURlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyID0gW107XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBIENhbWVyYSB1c2VkIHNwZWNpZmljYWxseSBieSB0aGUgR3JhcGhpY3Mgc3lzdGVtIGZvciByZW5kZXJpbmcgdG8gdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcy5UYXJnZXRDYW1lcmFcclxuICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gKiBAc2luY2UgMy4xLjBcclxuICovXHJcbkdyYXBoaWNzLlRhcmdldENhbWVyYSA9IG5ldyBCYXNlQ2FtZXJhKCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBoaWNzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb21tYW5kcyA9IHJlcXVpcmUoJy4vQ29tbWFuZHMnKTtcclxudmFyIFNldFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL2NhbnZhcy91dGlscy9TZXRUcmFuc2Zvcm0nKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3MjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IFtyZW5kZXJUYXJnZXRDdHhdIC0gVGhlIHRhcmdldCByZW5kZXJpbmcgY29udGV4dC5cclxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0NsaXAgLSBJZiBgdHJ1ZWAgdGhlbiBwYXRoIG9wZXJhdGlvbnMgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgZmlsbCBvcGVyYXRpb25zLlxyXG4gKi9cclxudmFyIEdyYXBoaWNzQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4LCByZW5kZXJUYXJnZXRDdHgsIGFsbG93Q2xpcClcclxue1xyXG4gICAgdmFyIGNvbW1hbmRCdWZmZXIgPSBzcmMuY29tbWFuZEJ1ZmZlcjtcclxuICAgIHZhciBjb21tYW5kQnVmZmVyTGVuZ3RoID0gY29tbWFuZEJ1ZmZlci5sZW5ndGg7XHJcblxyXG4gICAgdmFyIGN0eCA9IHJlbmRlclRhcmdldEN0eCB8fCByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICBpZiAoY29tbWFuZEJ1ZmZlckxlbmd0aCA9PT0gMCB8fCAhU2V0VHJhbnNmb3JtKHJlbmRlcmVyLCBjdHgsIHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGluZUFscGhhID0gMTtcclxuICAgIHZhciBmaWxsQWxwaGEgPSAxO1xyXG4gICAgdmFyIGxpbmVDb2xvciA9IDA7XHJcbiAgICB2YXIgZmlsbENvbG9yID0gMDtcclxuICAgIHZhciBsaW5lV2lkdGggPSAxO1xyXG4gICAgdmFyIHJlZCA9IDA7XHJcbiAgICB2YXIgZ3JlZW4gPSAwO1xyXG4gICAgdmFyIGJsdWUgPSAwO1xyXG5cclxuICAgIC8vICBSZXNldCBhbnkgY3VycmVudGx5IGFjdGl2ZSBwYXRoc1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBjb21tYW5kQnVmZmVyTGVuZ3RoOyArK2luZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb21tYW5kSUQgPSBjb21tYW5kQnVmZmVyW2luZGV4XTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kSUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkFSQzpcclxuICAgICAgICAgICAgICAgIGN0eC5hcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgM10sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDRdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyA1XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgNl1cclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gICs3IGJlY2F1c2Ugb3ZlcnNob290IGlzIHRoZSA3dGggdmFsdWUsIG5vdCB1c2VkIGluIENhbnZhc1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gNztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5MSU5FX1NUWUxFOlxyXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoID0gY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdO1xyXG4gICAgICAgICAgICAgICAgbGluZUNvbG9yID0gY29tbWFuZEJ1ZmZlcltpbmRleCArIDJdO1xyXG4gICAgICAgICAgICAgICAgbGluZUFscGhhID0gY29tbWFuZEJ1ZmZlcltpbmRleCArIDNdO1xyXG4gICAgICAgICAgICAgICAgcmVkID0gKChsaW5lQ29sb3IgJiAweEZGMDAwMCkgPj4+IDE2KTtcclxuICAgICAgICAgICAgICAgIGdyZWVuID0gKChsaW5lQ29sb3IgJiAweEZGMDApID4+PiA4KTtcclxuICAgICAgICAgICAgICAgIGJsdWUgPSAobGluZUNvbG9yICYgMHhGRik7XHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgcmVkICsgJywnICsgZ3JlZW4gKyAnLCcgKyBibHVlICsgJywnICsgbGluZUFscGhhICsgJyknO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuRklMTF9TVFlMRTpcclxuICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IGNvbW1hbmRCdWZmZXJbaW5kZXggKyAxXTtcclxuICAgICAgICAgICAgICAgIGZpbGxBbHBoYSA9IGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXTtcclxuICAgICAgICAgICAgICAgIHJlZCA9ICgoZmlsbENvbG9yICYgMHhGRjAwMDApID4+PiAxNik7XHJcbiAgICAgICAgICAgICAgICBncmVlbiA9ICgoZmlsbENvbG9yICYgMHhGRjAwKSA+Pj4gOCk7XHJcbiAgICAgICAgICAgICAgICBibHVlID0gKGZpbGxDb2xvciAmIDB4RkYpO1xyXG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByZWQgKyAnLCcgKyBncmVlbiArICcsJyArIGJsdWUgKyAnLCcgKyBmaWxsQWxwaGEgKyAnKSc7XHJcbiAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkJFR0lOX1BBVEg6XHJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuQ0xPU0VfUEFUSDpcclxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5GSUxMX1BBVEg6XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93Q2xpcClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLlNUUk9LRV9QQVRIOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd0NsaXApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkZJTExfUkVDVDpcclxuICAgICAgICAgICAgICAgIGlmICghYWxsb3dDbGlwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAzXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDRdXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjdHgucmVjdChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAzXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDRdXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuRklMTF9UUklBTkdMRTpcclxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLCBjb21tYW5kQnVmZmVyW2luZGV4ICsgMl0pO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjb21tYW5kQnVmZmVyW2luZGV4ICsgM10sIGNvbW1hbmRCdWZmZXJbaW5kZXggKyA0XSk7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNvbW1hbmRCdWZmZXJbaW5kZXggKyA1XSwgY29tbWFuZEJ1ZmZlcltpbmRleCArIDZdKTtcclxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGlmICghYWxsb3dDbGlwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpbmRleCArPSA2O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLlNUUk9LRV9UUklBTkdMRTpcclxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLCBjb21tYW5kQnVmZmVyW2luZGV4ICsgMl0pO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhjb21tYW5kQnVmZmVyW2luZGV4ICsgM10sIGNvbW1hbmRCdWZmZXJbaW5kZXggKyA0XSk7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGNvbW1hbmRCdWZmZXJbaW5kZXggKyA1XSwgY29tbWFuZEJ1ZmZlcltpbmRleCArIDZdKTtcclxuICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgICAgIGlmICghYWxsb3dDbGlwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDY7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuTElORV9UTzpcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuTU9WRV9UTzpcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuTElORV9GWF9UTzpcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuTU9WRV9GWF9UTzpcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAyXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuU0FWRTpcclxuICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuUkVTVE9SRTpcclxuICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuVFJBTlNMQVRFOlxyXG4gICAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZShcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDJdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5TQ0FMRTpcclxuICAgICAgICAgICAgICAgIGN0eC5zY2FsZShcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kQnVmZmVyW2luZGV4ICsgMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZEJ1ZmZlcltpbmRleCArIDJdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5ST1RBVEU6XHJcbiAgICAgICAgICAgICAgICBjdHgucm90YXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRCdWZmZXJbaW5kZXggKyAxXVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuR1JBRElFTlRfRklMTF9TVFlMRTpcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuR1JBRElFTlRfTElORV9TVFlMRTpcclxuICAgICAgICAgICAgICAgIGluZGV4ICs9IDY7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuU0VUX1RFWFRVUkU6XHJcbiAgICAgICAgICAgICAgICBpbmRleCArPSAyO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBSZXN0b3JlIHRoZSBjb250ZXh0IHNhdmVkIGluIFNldFRyYW5zZm9ybVxyXG4gICAgY3R4LnJlc3RvcmUoKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR3JhcGhpY3NDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR3JhcGhpY3MgPSByZXF1aXJlKCcuL0dyYXBoaWNzJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBHcmFwaGljcyBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyBpdC5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgR3JhcGhpY3MgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI2dyYXBoaWNzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3RlcignZ3JhcGhpY3MnLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBncmFwaGljcyA9IG5ldyBHcmFwaGljcyh0aGlzLnNjZW5lLCBjb25maWcpO1xyXG5cclxuICAgIGlmIChjb25maWcuYWRkKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmFkZChncmFwaGljcyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBncmFwaGljcztcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdENyZWF0b3IgY29udGV4dC5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR3JhcGhpY3MgPSByZXF1aXJlKCcuL0dyYXBoaWNzJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBHcmFwaGljcyBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEdyYXBoaWNzIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNncmFwaGljc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JhcGhpY3MuT3B0aW9uc30gW2NvbmZpZ10gLSBUaGUgR3JhcGhpY3MgY29uZmlndXJhdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdncmFwaGljcycsIGZ1bmN0aW9uIChjb25maWcpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgR3JhcGhpY3ModGhpcy5zY2VuZSwgY29uZmlnKSk7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RGYWN0b3J5IGNvbnRleHQuXHJcbi8vXHJcbi8vICBUaGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byB1c2U6XHJcbi8vXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vR3JhcGhpY3NXZWJHTFJlbmRlcmVyJyk7XHJcblxyXG4gICAgLy8gIE5lZWRlZCBmb3IgR3JhcGhpY3MuZ2VuZXJhdGVUZXh0dXJlXHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0dyYXBoaWNzQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vR3JhcGhpY3NDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29tbWFuZHMgPSByZXF1aXJlKCcuL0NvbW1hbmRzJyk7XHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vLyAgVE9ETzogUmVtb3ZlIHRoZSB1c2Ugb2YgdGhpc1xyXG52YXIgUG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgpXHJcbntcclxuICAgIHRoaXMueCA9IHg7XHJcbiAgICB0aGlzLnkgPSB5O1xyXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG59O1xyXG5cclxuLy8gIFRPRE86IFJlbW92ZSB0aGUgdXNlIG9mIHRoaXNcclxudmFyIFBhdGggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgpXHJcbntcclxuICAgIHRoaXMucG9pbnRzID0gW107XHJcbiAgICB0aGlzLnBvaW50c0xlbmd0aCA9IDE7XHJcbiAgICB0aGlzLnBvaW50c1swXSA9IG5ldyBQb2ludCh4LCB5LCB3aWR0aCk7XHJcbn07XHJcblxyXG52YXIgbWF0cml4U3RhY2sgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljcyNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgR3JhcGhpY3NXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgaWYgKHNyYy5jb21tYW5kQnVmZmVyLmxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSwgc3JjKTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gc3JjLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBncmFwaGljc01hdHJpeCA9IHNyYy5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY3VycmVudE1hdHJpeCA9IHNyYy5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgY3VycmVudE1hdHJpeC5sb2FkSWRlbnRpdHkoKTtcclxuXHJcbiAgICBncmFwaGljc01hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgZ3JhcGhpY3NNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIGdyYXBoaWNzTWF0cml4LmYgPSBzcmMueTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShncmFwaGljc01hdHJpeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZ3JhcGhpY3NNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIGdyYXBoaWNzTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShncmFwaGljc01hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNvbW1hbmRzID0gc3JjLmNvbW1hbmRCdWZmZXI7XHJcbiAgICB2YXIgYWxwaGEgPSBjYW1lcmEuYWxwaGEgKiBzcmMuYWxwaGE7XHJcblxyXG4gICAgdmFyIGxpbmVXaWR0aCA9IDE7XHJcbiAgICB2YXIgZmlsbFRpbnQgPSBwaXBlbGluZS5maWxsVGludDtcclxuICAgIHZhciBzdHJva2VUaW50ID0gcGlwZWxpbmUuc3Ryb2tlVGludDtcclxuXHJcbiAgICB2YXIgdHggPSAwO1xyXG4gICAgdmFyIHR5ID0gMDtcclxuICAgIHZhciB0YSA9IDA7XHJcbiAgICB2YXIgaXRlclN0ZXAgPSAwLjAxO1xyXG4gICAgdmFyIFBJMiA9IE1hdGguUEkgKiAyO1xyXG5cclxuICAgIHZhciBjbWQ7XHJcblxyXG4gICAgdmFyIHBhdGggPSBbXTtcclxuICAgIHZhciBwYXRoSW5kZXggPSAwO1xyXG4gICAgdmFyIHBhdGhPcGVuID0gZmFsc2U7XHJcbiAgICB2YXIgbGFzdFBhdGggPSBudWxsO1xyXG5cclxuICAgIHZhciBnZXRUaW50ID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwO1xyXG5cclxuICAgIHZhciBjdXJyZW50VGV4dHVyZSA9IHJlbmRlcmVyLmJsYW5rVGV4dHVyZS5nbFRleHR1cmU7XHJcblxyXG4gICAgZm9yICh2YXIgY21kSW5kZXggPSAwOyBjbWRJbmRleCA8IGNvbW1hbmRzLmxlbmd0aDsgY21kSW5kZXgrKylcclxuICAgIHtcclxuICAgICAgICBjbWQgPSBjb21tYW5kc1tjbWRJbmRleF07XHJcblxyXG4gICAgICAgIHN3aXRjaCAoY21kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5CRUdJTl9QQVRIOlxyXG5cclxuICAgICAgICAgICAgICAgIHBhdGgubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHBhdGhPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5DTE9TRV9QQVRIOlxyXG5cclxuICAgICAgICAgICAgICAgIHBhdGhPcGVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICYmIGxhc3RQYXRoLnBvaW50cy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGgucG9pbnRzLnB1c2gobGFzdFBhdGgucG9pbnRzWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5GSUxMX1BBVEg6XHJcbiAgICAgICAgICAgICAgICBmb3IgKHBhdGhJbmRleCA9IDA7IHBhdGhJbmRleCA8IHBhdGgubGVuZ3RoOyBwYXRoSW5kZXgrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQoY3VycmVudFRleHR1cmUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5iYXRjaEZpbGxQYXRoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoW3BhdGhJbmRleF0ucG9pbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF0cml4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyaXhcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLlNUUk9LRV9QQVRIOlxyXG4gICAgICAgICAgICAgICAgZm9yIChwYXRoSW5kZXggPSAwOyBwYXRoSW5kZXggPCBwYXRoLmxlbmd0aDsgcGF0aEluZGV4KyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKGN1cnJlbnRUZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYmF0Y2hTdHJva2VQYXRoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoW3BhdGhJbmRleF0ucG9pbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhPcGVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF0cml4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyaXhcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkxJTkVfU1RZTEU6XHJcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGggPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHZhciBzdHJva2VDb2xvciA9IGNvbW1hbmRzWysrY21kSW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0cm9rZUFscGhhID0gY29tbWFuZHNbKytjbWRJbmRleF0gKiBhbHBoYTtcclxuICAgICAgICAgICAgICAgIHZhciBzdHJva2VUaW50Q29sb3IgPSBnZXRUaW50KHN0cm9rZUNvbG9yLCBzdHJva2VBbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBzdHJva2VUaW50LlRMID0gc3Ryb2tlVGludENvbG9yO1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlVGludC5UUiA9IHN0cm9rZVRpbnRDb2xvcjtcclxuICAgICAgICAgICAgICAgIHN0cm9rZVRpbnQuQkwgPSBzdHJva2VUaW50Q29sb3I7XHJcbiAgICAgICAgICAgICAgICBzdHJva2VUaW50LkJSID0gc3Ryb2tlVGludENvbG9yO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkZJTExfU1RZTEU6XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsbENvbG9yID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsbEFscGhhID0gY29tbWFuZHNbKytjbWRJbmRleF0gKiBhbHBoYTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxsVGludENvbG9yID0gZ2V0VGludChmaWxsQ29sb3IsIGZpbGxBbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5UTCA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5UUiA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5CTCA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5CUiA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuR1JBRElFTlRfRklMTF9TVFlMRTpcclxuICAgICAgICAgICAgICAgIHZhciBncmFkaWVudEZpbGxBbHBoYSA9IGNvbW1hbmRzWysrY21kSW5kZXhdICogYWxwaGE7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5UTCA9IGdldFRpbnQoY29tbWFuZHNbKytjbWRJbmRleF0sIGdyYWRpZW50RmlsbEFscGhhKTtcclxuICAgICAgICAgICAgICAgIGZpbGxUaW50LlRSID0gZ2V0VGludChjb21tYW5kc1srK2NtZEluZGV4XSwgZ3JhZGllbnRGaWxsQWxwaGEpO1xyXG4gICAgICAgICAgICAgICAgZmlsbFRpbnQuQkwgPSBnZXRUaW50KGNvbW1hbmRzWysrY21kSW5kZXhdLCBncmFkaWVudEZpbGxBbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBmaWxsVGludC5CUiA9IGdldFRpbnQoY29tbWFuZHNbKytjbWRJbmRleF0sIGdyYWRpZW50RmlsbEFscGhhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5HUkFESUVOVF9MSU5FX1NUWUxFOlxyXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB2YXIgZ3JhZGllbnRMaW5lQWxwaGEgPSBjb21tYW5kc1srK2NtZEluZGV4XSAqIGFscGhhO1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlVGludC5UTCA9IGdldFRpbnQoY29tbWFuZHNbKytjbWRJbmRleF0sIGdyYWRpZW50TGluZUFscGhhKTtcclxuICAgICAgICAgICAgICAgIHN0cm9rZVRpbnQuVFIgPSBnZXRUaW50KGNvbW1hbmRzWysrY21kSW5kZXhdLCBncmFkaWVudExpbmVBbHBoYSk7XHJcbiAgICAgICAgICAgICAgICBzdHJva2VUaW50LkJMID0gZ2V0VGludChjb21tYW5kc1srK2NtZEluZGV4XSwgZ3JhZGllbnRMaW5lQWxwaGEpO1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlVGludC5CUiA9IGdldFRpbnQoY29tbWFuZHNbKytjbWRJbmRleF0sIGdyYWRpZW50TGluZUFscGhhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5BUkM6XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgIHZhciB4ID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB2YXIgeSA9IGNvbW1hbmRzWysrY21kSW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGNvbW1hbmRzWysrY21kSW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0QW5nbGUgPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHZhciBlbmRBbmdsZSA9IGNvbW1hbmRzWysrY21kSW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFudGljbG9ja3dpc2UgPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHZhciBvdmVyc2hvb3QgPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuXHJcbiAgICAgICAgICAgICAgICBlbmRBbmdsZSAtPSBzdGFydEFuZ2xlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhbnRpY2xvY2t3aXNlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRBbmdsZSA8IC1QSTIpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRBbmdsZSA9IC1QSTI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuZEFuZ2xlID4gMClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlID0gLVBJMiArIGVuZEFuZ2xlICUgUEkyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuZEFuZ2xlID4gUEkyKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlID0gUEkyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kQW5nbGUgPCAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlID0gUEkyICsgZW5kQW5nbGUgJSBQSTI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoID09PSBudWxsKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbmV3IFBhdGgoeCArIE1hdGguY29zKHN0YXJ0QW5nbGUpICogcmFkaXVzLCB5ICsgTWF0aC5zaW4oc3RhcnRBbmdsZSkgKiByYWRpdXMsIGxpbmVXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKGxhc3RQYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb24gKz0gaXRlclN0ZXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdGlvbiA8IDEgKyBvdmVyc2hvb3QpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGEgPSBlbmRBbmdsZSAqIGl0ZXJhdGlvbiArIHN0YXJ0QW5nbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgdHggPSB4ICsgTWF0aC5jb3ModGEpICogcmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHR5ID0geSArIE1hdGguc2luKHRhKSAqIHJhZGl1cztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGgucG9pbnRzLnB1c2gobmV3IFBvaW50KHR4LCB0eSwgbGluZVdpZHRoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbiArPSBpdGVyU3RlcDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0YSA9IGVuZEFuZ2xlICsgc3RhcnRBbmdsZTtcclxuICAgICAgICAgICAgICAgIHR4ID0geCArIE1hdGguY29zKHRhKSAqIHJhZGl1cztcclxuICAgICAgICAgICAgICAgIHR5ID0geSArIE1hdGguc2luKHRhKSAqIHJhZGl1cztcclxuXHJcbiAgICAgICAgICAgICAgICBsYXN0UGF0aC5wb2ludHMucHVzaChuZXcgUG9pbnQodHgsIHR5LCBsaW5lV2lkdGgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuRklMTF9SRUNUOlxyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKGN1cnJlbnRUZXh0dXJlKTtcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmJhdGNoRmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbKytjbWRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbKytjbWRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbKytjbWRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbKytjbWRJbmRleF0sXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hdHJpeCxcclxuICAgICAgICAgICAgICAgICAgICBjYW1NYXRyaXhcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuRklMTF9UUklBTkdMRTpcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRChjdXJyZW50VGV4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5iYXRjaEZpbGxUcmlhbmdsZShcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF0cml4LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbU1hdHJpeFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5TVFJPS0VfVFJJQU5HTEU6XHJcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQoY3VycmVudFRleHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuYmF0Y2hTdHJva2VUcmlhbmdsZShcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kc1srK2NtZEluZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE1hdHJpeCxcclxuICAgICAgICAgICAgICAgICAgICBjYW1NYXRyaXhcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuTElORV9UTzpcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aC5wb2ludHMucHVzaChuZXcgUG9pbnQoY29tbWFuZHNbKytjbWRJbmRleF0sIGNvbW1hbmRzWysrY21kSW5kZXhdLCBsaW5lV2lkdGgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IG5ldyBQYXRoKGNvbW1hbmRzWysrY21kSW5kZXhdLCBjb21tYW5kc1srK2NtZEluZGV4XSwgbGluZVdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoLnB1c2gobGFzdFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLk1PVkVfVE86XHJcbiAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IG5ldyBQYXRoKGNvbW1hbmRzWysrY21kSW5kZXhdLCBjb21tYW5kc1srK2NtZEluZGV4XSwgbGluZVdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChsYXN0UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuU0FWRTpcclxuICAgICAgICAgICAgICAgIG1hdHJpeFN0YWNrLnB1c2goY3VycmVudE1hdHJpeC5jb3B5VG9BcnJheSgpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5SRVNUT1JFOlxyXG4gICAgICAgICAgICAgICAgY3VycmVudE1hdHJpeC5jb3B5RnJvbUFycmF5KG1hdHJpeFN0YWNrLnBvcCgpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5UUkFOU0xBVEU6XHJcbiAgICAgICAgICAgICAgICB4ID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB5ID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TWF0cml4LnRyYW5zbGF0ZSh4LCB5KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5TQ0FMRTpcclxuICAgICAgICAgICAgICAgIHggPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIHkgPSBjb21tYW5kc1srK2NtZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRyaXguc2NhbGUoeCwgeSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuUk9UQVRFOlxyXG4gICAgICAgICAgICAgICAgY3VycmVudE1hdHJpeC5yb3RhdGUoY29tbWFuZHNbKytjbWRJbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLlNFVF9URVhUVVJFOlxyXG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lID0gY29tbWFuZHNbKytjbWRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IGNvbW1hbmRzWysrY21kSW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmN1cnJlbnRGcmFtZSA9IGZyYW1lO1xyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKGZyYW1lLmdsVGV4dHVyZSwgMCk7XHJcbiAgICAgICAgICAgICAgICBwaXBlbGluZS50aW50RWZmZWN0ID0gbW9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VGV4dHVyZSA9IGZyYW1lLmdsVGV4dHVyZTtcclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuQ0xFQVJfVEVYVFVSRTpcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmN1cnJlbnRGcmFtZSA9IHJlbmRlcmVyLmJsYW5rVGV4dHVyZTtcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLnRpbnRFZmZlY3QgPSAyO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHR1cmUgPSByZW5kZXJlci5ibGFua1RleHR1cmUuZ2xUZXh0dXJlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaGljc1dlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFjdGlvbnMgPSByZXF1aXJlKCcuLi8uLi9hY3Rpb25zLycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBSYW5nZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2FycmF5L1JhbmdlJyk7XHJcbnZhciBTZXQgPSByZXF1aXJlKCcuLi8uLi9zdHJ1Y3RzL1NldCcpO1xyXG52YXIgU3ByaXRlID0gcmVxdWlyZSgnLi4vc3ByaXRlL1Nwcml0ZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBHcm91cCBpcyBhIHdheSBmb3IgeW91IHRvIGNyZWF0ZSwgbWFuaXB1bGF0ZSwgb3IgcmVjeWNsZSBzaW1pbGFyIEdhbWUgT2JqZWN0cy5cclxuICpcclxuICogR3JvdXAgbWVtYmVyc2hpcCBpcyBub24tZXhjbHVzaXZlLiBBIEdhbWUgT2JqZWN0IGNhbiBiZWxvbmcgdG8gc2V2ZXJhbCBncm91cHMsIG9uZSBncm91cCwgb3Igbm9uZS5cclxuICpcclxuICogR3JvdXBzIHRoZW1zZWx2ZXMgYXJlbid0IGRpc3BsYXlhYmxlLCBhbmQgY2FuJ3QgYmUgcG9zaXRpb25lZCwgcm90YXRlZCwgc2NhbGVkLCBvciBoaWRkZW4uXHJcbiAqXHJcbiAqIEBjbGFzcyBHcm91cFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoaXMgZ3JvdXAgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDb25maWd8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ3JlYXRlQ29uZmlnKX0gW2NoaWxkcmVuXSAtIEdhbWUgT2JqZWN0cyB0byBhZGQgdG8gdGhpcyBncm91cDsgb3IgdGhlIGBjb25maWdgIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWd9IFtjb25maWddIC0gU2V0dGluZ3MgZm9yIHRoaXMgZ3JvdXAuIElmIGBrZXlgIGlzIHNldCwgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NyZWF0ZU11bHRpcGxlIGlzIGFsc28gY2FsbGVkIHdpdGggdGhlc2Ugc2V0dGluZ3MuXHJcbiAqXHJcbiAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwXHJcbiAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwXHJcbiAqL1xyXG52YXIgR3JvdXAgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR3JvdXAgKHNjZW5lLCBjaGlsZHJlbiwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBUaGV5IGNhbiBwYXNzIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBmaXJzdCBhcmd1bWVudDpcclxuXHJcbiAgICAgICAgLy8gIDEpIEEgc2luZ2xlIGNoaWxkXHJcbiAgICAgICAgLy8gIDIpIEFuIGFycmF5IG9mIGNoaWxkcmVuXHJcbiAgICAgICAgLy8gIDMpIEEgY29uZmlnIG9iamVjdFxyXG4gICAgICAgIC8vICA0KSBBbiBhcnJheSBvZiBjb25maWcgb2JqZWN0c1xyXG5cclxuICAgICAgICAvLyAgT3IgdGhleSBjYW4gcGFzcyBpbiBhIGNoaWxkLCBvciBhcnJheSBvZiBjaGlsZHJlbiBBTkQgYSBjb25maWcgb2JqZWN0XHJcblxyXG4gICAgICAgIGlmIChjb25maWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgY29uZmlnIGhhcyBiZWVuIHNldCwgYXJlIHRoZSBjaGlsZHJlbiBhbiBhcnJheT9cclxuXHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiAhQXJyYXkuaXNBcnJheShjaGlsZHJlbikpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWyBjaGlsZHJlbiBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE5vIGNvbmZpZywgc28gbGV0J3MgY2hlY2sgdGhlIGNoaWxkcmVuIGFyZ3VtZW50XHJcblxyXG4gICAgICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChjaGlsZHJlblswXSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBJdCdzIGFuIGFycmF5IG9mIHBsYWluIGNvbmZpZyBvYmplY3RzXHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChJc1BsYWluT2JqZWN0KGNoaWxkcmVuKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDaGlsZHJlbiBpc24ndCBhbiBhcnJheS4gSXMgaXQgYSBjb25maWcgb2JqZWN0IHRob3VnaD9cclxuICAgICAgICAgICAgY29uZmlnID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgc2NlbmUgdGhpcyBncm91cCBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1lbWJlcnMgb2YgdGhpcyBncm91cC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNjaGlsZHJlblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Pn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IFNldChjaGlsZHJlbik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZmxhZyBpZGVudGlmeWluZyB0aGlzIG9iamVjdCBhcyBhIGdyb3VwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2lzUGFyZW50XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNQYXJlbnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgUGhhc2VyIGJ1dCBpcyBhdmFpbGFibGUgZm9yIHlvdXIgb3duIGN1c3RvbSBjbGFzc2VzIHRvIHBvcHVsYXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICdHcm91cCdcclxuICAgICAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ0dyb3VwJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNsYXNzIHRvIGNyZWF0ZSBuZXcgZ3JvdXAgbWVtYmVycyBmcm9tLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NsYXNzVHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAZGVmYXVsdCBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jbGFzc1R5cGUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY2xhc3NUeXBlJywgU3ByaXRlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhpcyBncm91cC5cclxuICAgICAgICAgKiBFbXB0eSBieSBkZWZhdWx0IGFuZCBuZXZlciBwb3B1bGF0ZWQgYnkgUGhhc2VyLCB0aGlzIGlzIGxlZnQgZm9yIGRldmVsb3BlcnMgdG8gdXNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICcnXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICduYW1lJywgJycpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgZ3JvdXAgcnVucyBpdHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNwcmVVcGRhdGV9IG1ldGhvZFxyXG4gICAgICAgICAqICh3aGljaCBtYXkgdXBkYXRlIGFueSBtZW1iZXJzKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNhY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdhY3RpdmUnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGlzIGdyb3VwLCBpZiB1c2VkIGFzIGEgcG9vbC4gLTEgaXMgbm8gbGltaXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjbWF4U2l6ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBkZWZhdWx0IC0xXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhTaXplID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ21heFNpemUnLCAtMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZGVmYXVsdCB0ZXh0dXJlIGtleSB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgZ3JvdXAgbWVtYmVycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCBpbiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NyZWF0ZX1cclxuICAgICAgICAgKiBidXQgbm90IGluIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlTXVsdGlwbGV9LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2RlZmF1bHRLZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdkZWZhdWx0S2V5JywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZGVmYXVsdCB0ZXh0dXJlIGZyYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBncm91cCBtZW1iZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2RlZmF1bHRGcmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHsoc3RyaW5nfGludGVnZXIpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEZyYW1lID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RlZmF1bHRGcmFtZScsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGNhbGwgdGhlIHVwZGF0ZSBtZXRob2Qgb2YgYW55IG1lbWJlcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjcnVuQ2hpbGRVcGRhdGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3ByZVVwZGF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucnVuQ2hpbGRVcGRhdGUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAncnVuQ2hpbGRVcGRhdGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYWRkaW5nIG9yIGNyZWF0aW5nIGdyb3VwIG1lbWJlcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENhbGxiYWNrfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY3JlYXRlQ2FsbGJhY2snLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiByZW1vdmluZyBncm91cCBtZW1iZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3JlbW92ZUNhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDYWxsYmFja31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbW92ZUNhbGxiYWNrID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3JlbW92ZUNhbGxiYWNrJywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gY3JlYXRpbmcgc2V2ZXJhbCBncm91cCBtZW1iZXJzIGF0IG9uY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlTXVsdGlwbGVDYWxsYmFja1xyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwTXVsdGlwbGVDcmVhdGVDYWxsYmFja31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNyZWF0ZU11bHRpcGxlQ2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY3JlYXRlTXVsdGlwbGVDYWxsYmFjaycsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGFkZGluZyBvciBjcmVhdGluZyBncm91cCBtZW1iZXJzLlxyXG4gICAgICAgICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSBieSBhIEdyb3VwLCBvciBhbnkgY2xhc3MgdGhhdCBleHRlbmRzIGl0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2ludGVybmFsQ3JlYXRlQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENhbGxiYWNrfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxDcmVhdGVDYWxsYmFjayA9IEdldEZhc3RWYWx1ZShjb25maWcsICdpbnRlcm5hbENyZWF0ZUNhbGxiYWNrJywgbnVsbCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gcmVtb3ZpbmcgZ3JvdXAgbWVtYmVycy5cclxuICAgICAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnkgYSBHcm91cCwgb3IgYW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBpdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNpbnRlcm5hbFJlbW92ZUNhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDYWxsYmFja31cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmludGVybmFsUmVtb3ZlQ2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaW50ZXJuYWxSZW1vdmVDYWxsYmFjaycsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNdWx0aXBsZShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoaXMgZ3JvdXAsIHVubGVzcyB0aGUgZ3JvdXAge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNpc0Z1bGwgaXMgZnVsbH0uXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNjcmVhdGVDYWxsYmFja30uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgbmV3IEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgbmV3IEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PWRlZmF1bHRLZXldIC0gVGhlIHRleHR1cmUga2V5IG9mIHRoZSBuZXcgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZT1kZWZhdWx0RnJhbWVdIC0gVGhlIHRleHR1cmUgZnJhbWUgb2YgdGhlIG5ldyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGUjdmlzaWJsZX0gc3RhdGUgb2YgdGhlIG5ldyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FjdGl2ZT10cnVlXSAtIFRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlfSBzdGF0ZSBvZiB0aGUgbmV3IEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2FueX0gVGhlIG5ldyBHYW1lIE9iamVjdCAodXN1YWxseSBhIFNwcml0ZSwgZXRjLikuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUsIHZpc2libGUsIGFjdGl2ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmRlZmF1bHRLZXk7IH1cclxuICAgICAgICBpZiAoZnJhbWUgPT09IHVuZGVmaW5lZCkgeyBmcmFtZSA9IHRoaXMuZGVmYXVsdEZyYW1lOyB9XHJcbiAgICAgICAgaWYgKHZpc2libGUgPT09IHVuZGVmaW5lZCkgeyB2aXNpYmxlID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmIChhY3RpdmUgPT09IHVuZGVmaW5lZCkgeyBhY3RpdmUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIC8vICBQb29sP1xyXG4gICAgICAgIGlmICh0aGlzLmlzRnVsbCgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jbGFzc1R5cGUodGhpcy5zY2VuZSwgeCwgeSwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmFkZChjaGlsZCk7XHJcblxyXG4gICAgICAgIGlmIChjaGlsZC5wcmVVcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lLnN5cy51cGRhdGVMaXN0LmFkZChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGlsZC52aXNpYmxlID0gdmlzaWJsZTtcclxuICAgICAgICBjaGlsZC5zZXRBY3RpdmUoYWN0aXZlKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGQoY2hpbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBzZXZlcmFsIEdhbWUgT2JqZWN0cyBhbmQgYWRkcyB0aGVtIHRvIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIGdyb3VwIGJlY29tZXMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNpc0Z1bGx9LCBubyBmdXJ0aGVyIEdhbWUgT2JqZWN0cyBhcmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBDYWxscyB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NyZWF0ZU11bHRpcGxlQ2FsbGJhY2t9IGFuZCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NyZWF0ZUNhbGxiYWNrfS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNjcmVhdGVNdWx0aXBsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWd8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ3JlYXRlQ29uZmlnW119IGNvbmZpZyAtIENyZWF0aW9uIHNldHRpbmdzLiBUaGlzIGNhbiBiZSBhIHNpbmdsZSBjb25maWd1cmF0aW9uIG9iamVjdCBvciBhbiBhcnJheSBvZiBzdWNoIG9iamVjdHMsIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBpbiB0dXJuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2FueVtdfSBUaGUgbmV3bHkgY3JlYXRlZCBHYW1lIE9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZU11bHRpcGxlOiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRnVsbCgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25maWcgPSBbIGNvbmZpZyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnWzBdLmtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuY3JlYXRlRnJvbUNvbmZpZyhjb25maWdbaV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoZW50cmllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBoZWxwZXIgZm9yIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlTXVsdGlwbGV9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2NyZWF0ZUZyb21Db25maWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ3JlYXRlQ29uZmlnfSBvcHRpb25zIC0gQ3JlYXRpb24gc2V0dGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7YW55W119IFRoZSBuZXdseSBjcmVhdGVkIEdhbWUgT2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlRnJvbUNvbmZpZzogZnVuY3Rpb24gKG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNsYXNzVHlwZSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnY2xhc3NUeXBlJywgdGhpcy5jbGFzc1R5cGUpO1xyXG5cclxuICAgICAgICB2YXIga2V5ID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdrZXknLCB1bmRlZmluZWQpO1xyXG4gICAgICAgIHZhciBmcmFtZSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnZnJhbWUnLCBudWxsKTtcclxuICAgICAgICB2YXIgdmlzaWJsZSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAndmlzaWJsZScsIHRydWUpO1xyXG4gICAgICAgIHZhciBhY3RpdmUgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ2FjdGl2ZScsIHRydWUpO1xyXG5cclxuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xyXG5cclxuICAgICAgICAvLyAgQ2FuJ3QgZG8gYW55dGhpbmcgd2l0aG91dCBhdCBsZWFzdCBhIGtleVxyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAga2V5ID0gWyBrZXkgXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZyYW1lKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnJhbWUgPSBbIGZyYW1lIF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBCdWlsZCBhbiBhcnJheSBvZiBrZXkgZnJhbWUgcGFpcnMgdG8gbG9vcCB0aHJvdWdoXHJcblxyXG4gICAgICAgIHZhciByZXBlYXQgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ3JlcGVhdCcsIDApO1xyXG4gICAgICAgIHZhciByYW5kb21LZXkgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ3JhbmRvbUtleScsIGZhbHNlKTtcclxuICAgICAgICB2YXIgcmFuZG9tRnJhbWUgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ3JhbmRvbUZyYW1lJywgZmFsc2UpO1xyXG4gICAgICAgIHZhciB5b3lvID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICd5b3lvJywgZmFsc2UpO1xyXG4gICAgICAgIHZhciBxdWFudGl0eSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAncXVhbnRpdHknLCBmYWxzZSk7XHJcbiAgICAgICAgdmFyIGZyYW1lUXVhbnRpdHkgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ2ZyYW1lUXVhbnRpdHknLCAxKTtcclxuICAgICAgICB2YXIgbWF4ID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdtYXgnLCAwKTtcclxuXHJcbiAgICAgICAgLy8gIElmIGEgcXVhbnRpdHkgdmFsdWUgaXMgc2V0IHdlIHVzZSB0aGF0IHRvIG92ZXJyaWRlIHRoZSBmcmFtZVF1YW50aXR5XHJcblxyXG4gICAgICAgIHZhciByYW5nZSA9IFJhbmdlKGtleSwgZnJhbWUsIHtcclxuICAgICAgICAgICAgbWF4OiBtYXgsXHJcbiAgICAgICAgICAgIHF0eTogKHF1YW50aXR5KSA/IHF1YW50aXR5IDogZnJhbWVRdWFudGl0eSxcclxuICAgICAgICAgICAgcmFuZG9tOiByYW5kb21LZXksXHJcbiAgICAgICAgICAgIHJhbmRvbUI6IHJhbmRvbUZyYW1lLFxyXG4gICAgICAgICAgICByZXBlYXQ6IHJlcGVhdCxcclxuICAgICAgICAgICAgeW95bzogeW95b1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5jcmVhdGVDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2FsbGJhY2sgPSBvcHRpb25zLmNyZWF0ZUNhbGxiYWNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMucmVtb3ZlQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNhbGxiYWNrID0gb3B0aW9ucy5yZW1vdmVDYWxsYmFjaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgcmFuZ2UubGVuZ3RoOyBjKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3JlYXRlZCA9IHRoaXMuY3JlYXRlKDAsIDAsIHJhbmdlW2NdLmEsIHJhbmdlW2NdLmIsIHZpc2libGUsIGFjdGl2ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNyZWF0ZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goY3JlYXRlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUG9zdC1jcmVhdGlvbiBvcHRpb25zIChhcHBsaWVkIG9ubHkgdG8gdGhvc2UgaXRlbXMgY3JlYXRlZCBpbiB0aGlzIGNhbGwpOlxyXG5cclxuICAgICAgICB2YXIgeCA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRYWS54JywgMCk7XHJcbiAgICAgICAgdmFyIHkgPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0WFkueScsIDApO1xyXG4gICAgICAgIHZhciBzdGVwWCA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRYWS5zdGVwWCcsIDApO1xyXG4gICAgICAgIHZhciBzdGVwWSA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRYWS5zdGVwWScsIDApO1xyXG5cclxuICAgICAgICBBY3Rpb25zLlNldFhZKGVudHJpZXMsIHgsIHksIHN0ZXBYLCBzdGVwWSk7XHJcblxyXG4gICAgICAgIHZhciByb3RhdGlvbiA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRSb3RhdGlvbi52YWx1ZScsIDApO1xyXG4gICAgICAgIHZhciBzdGVwUm90YXRpb24gPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0Um90YXRpb24uc3RlcCcsIDApO1xyXG5cclxuICAgICAgICBBY3Rpb25zLlNldFJvdGF0aW9uKGVudHJpZXMsIHJvdGF0aW9uLCBzdGVwUm90YXRpb24pO1xyXG5cclxuICAgICAgICB2YXIgc2NhbGVYID0gR2V0VmFsdWUob3B0aW9ucywgJ3NldFNjYWxlLngnLCAxKTtcclxuICAgICAgICB2YXIgc2NhbGVZID0gR2V0VmFsdWUob3B0aW9ucywgJ3NldFNjYWxlLnknLCBzY2FsZVgpO1xyXG4gICAgICAgIHZhciBzdGVwU2NhbGVYID0gR2V0VmFsdWUob3B0aW9ucywgJ3NldFNjYWxlLnN0ZXBYJywgMCk7XHJcbiAgICAgICAgdmFyIHN0ZXBTY2FsZVkgPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0U2NhbGUuc3RlcFknLCAwKTtcclxuXHJcbiAgICAgICAgQWN0aW9ucy5TZXRTY2FsZShlbnRyaWVzLCBzY2FsZVgsIHNjYWxlWSwgc3RlcFNjYWxlWCwgc3RlcFNjYWxlWSk7XHJcblxyXG4gICAgICAgIHZhciBhbHBoYSA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRBbHBoYS52YWx1ZScsIDEpO1xyXG4gICAgICAgIHZhciBzdGVwQWxwaGEgPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0QWxwaGEuc3RlcCcsIDApO1xyXG5cclxuICAgICAgICBBY3Rpb25zLlNldEFscGhhKGVudHJpZXMsIGFscGhhLCBzdGVwQWxwaGEpO1xyXG5cclxuICAgICAgICB2YXIgZGVwdGggPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0RGVwdGgudmFsdWUnLCAwKTtcclxuICAgICAgICB2YXIgc3RlcERlcHRoID0gR2V0VmFsdWUob3B0aW9ucywgJ3NldERlcHRoLnN0ZXAnLCAwKTtcclxuXHJcbiAgICAgICAgQWN0aW9ucy5TZXREZXB0aChlbnRyaWVzLCBkZXB0aCwgc3RlcERlcHRoKTtcclxuXHJcbiAgICAgICAgdmFyIHNjcm9sbEZhY3RvclggPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0U2Nyb2xsRmFjdG9yLngnLCAxKTtcclxuICAgICAgICB2YXIgc2Nyb2xsRmFjdG9yWSA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRTY3JvbGxGYWN0b3IueScsIHNjcm9sbEZhY3RvclgpO1xyXG4gICAgICAgIHZhciBzdGVwU2Nyb2xsRmFjdG9yWCA9IEdldFZhbHVlKG9wdGlvbnMsICdzZXRTY3JvbGxGYWN0b3Iuc3RlcFgnLCAwKTtcclxuICAgICAgICB2YXIgc3RlcFNjcm9sbEZhY3RvclkgPSBHZXRWYWx1ZShvcHRpb25zLCAnc2V0U2Nyb2xsRmFjdG9yLnN0ZXBZJywgMCk7XHJcblxyXG4gICAgICAgIEFjdGlvbnMuU2V0U2Nyb2xsRmFjdG9yKGVudHJpZXMsIHNjcm9sbEZhY3RvclgsIHNjcm9sbEZhY3RvclksIHN0ZXBTY3JvbGxGYWN0b3JYLCBzdGVwU2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIHZhciBoaXRBcmVhID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdoaXRBcmVhJywgbnVsbCk7XHJcbiAgICAgICAgdmFyIGhpdEFyZWFDYWxsYmFjayA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnaGl0QXJlYUNhbGxiYWNrJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChoaXRBcmVhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQWN0aW9ucy5TZXRIaXRBcmVhKGVudHJpZXMsIGhpdEFyZWEsIGhpdEFyZWFDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZ3JpZCA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnZ3JpZEFsaWduJywgZmFsc2UpO1xyXG5cclxuICAgICAgICBpZiAoZ3JpZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEFjdGlvbnMuR3JpZEFsaWduKGVudHJpZXMsIGdyaWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3JlYXRlTXVsdGlwbGVDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlTXVsdGlwbGVDYWxsYmFjay5jYWxsKHRoaXMsIGVudHJpZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBhbnkgZ3JvdXAgbWVtYmVycywgaWYge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNydW5DaGlsZFVwZGF0ZX0gaXMgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNwcmVVcGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkNoaWxkVXBkYXRlIHx8IHRoaXMuY2hpbGRyZW4uc2l6ZSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBCZWNhdXNlIGEgR3JvdXAgY2hpbGQgbWF5IG1lc3Mgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBHcm91cCBkdXJpbmcgaXRzIHVwZGF0ZVxyXG4gICAgICAgIHZhciB0ZW1wID0gdGhpcy5jaGlsZHJlbi5lbnRyaWVzLnNsaWNlKCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGVtcFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtLmFjdGl2ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXRlbS51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBHYW1lIE9iamVjdCB0byB0aGlzIGdyb3VwLlxyXG4gICAgICpcclxuICAgICAqIENhbGxzIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY3JlYXRlQ2FsbGJhY2t9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgdG8gYWRkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZT1mYWxzZV0gLSBBbHNvIGFkZCB0aGUgR2FtZSBPYmplY3QgdG8gdGhlIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWRkVG9TY2VuZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYWRkVG9TY2VuZSA9PT0gdW5kZWZpbmVkKSB7IGFkZFRvU2NlbmUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Z1bGwoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5zZXQoY2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbENyZWF0ZUNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbENyZWF0ZUNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3JlYXRlQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFkZFRvU2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lLnN5cy5kaXNwbGF5TGlzdC5hZGQoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkLnByZVVwZGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zeXMudXBkYXRlTGlzdC5hZGQoY2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGlsZC5vbihFdmVudHMuREVTVFJPWSwgdGhpcy5yZW1vdmUsIHRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHNldmVyYWwgR2FtZSBPYmplY3RzIHRvIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNjcmVhdGVDYWxsYmFja30uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjYWRkTXVsdGlwbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gY2hpbGRyZW4gLSBUaGUgR2FtZSBPYmplY3RzIHRvIGFkZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmU9ZmFsc2VdIC0gQWxzbyBhZGQgdGhlIEdhbWUgT2JqZWN0cyB0byB0aGUgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBncm91cC5cclxuICAgICAqL1xyXG4gICAgYWRkTXVsdGlwbGU6IGZ1bmN0aW9uIChjaGlsZHJlbiwgYWRkVG9TY2VuZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYWRkVG9TY2VuZSA9PT0gdW5kZWZpbmVkKSB7IGFkZFRvU2NlbmUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChjaGlsZHJlbltpXSwgYWRkVG9TY2VuZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBtZW1iZXIgb2YgdGhpcyBHcm91cCBhbmQgb3B0aW9uYWxseSByZW1vdmVzIGl0IGZyb20gdGhlIFNjZW5lIGFuZCAvIG9yIGRlc3Ryb3lzIGl0LlxyXG4gICAgICpcclxuICAgICAqIENhbGxzIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjcmVtb3ZlQ2FsbGJhY2t9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgdG8gcmVtb3ZlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVtb3ZlRnJvbVNjZW5lPWZhbHNlXSAtIE9wdGlvbmFsbHkgcmVtb3ZlIHRoZSBHcm91cCBtZW1iZXIgZnJvbSB0aGUgU2NlbmUgaXQgYmVsb25ncyB0by5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rlc3Ryb3lDaGlsZD1mYWxzZV0gLSBPcHRpb25hbGx5IGNhbGwgZGVzdHJveSBvbiB0aGUgcmVtb3ZlZCBHcm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGNoaWxkLCByZW1vdmVGcm9tU2NlbmUsIGRlc3Ryb3lDaGlsZClcclxuICAgIHtcclxuICAgICAgICBpZiAocmVtb3ZlRnJvbVNjZW5lID09PSB1bmRlZmluZWQpIHsgcmVtb3ZlRnJvbVNjZW5lID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoZGVzdHJveUNoaWxkID09PSB1bmRlZmluZWQpIHsgZGVzdHJveUNoaWxkID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5kZWxldGUoY2hpbGQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFJlbW92ZUNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFJlbW92ZUNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2hpbGQub2ZmKEV2ZW50cy5ERVNUUk9ZLCB0aGlzLnJlbW92ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChkZXN0cm95Q2hpbGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJlbW92ZUZyb21TY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkLnNjZW5lLnN5cy5kaXNwbGF5TGlzdC5yZW1vdmUoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkLnByZVVwZGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQuc2NlbmUuc3lzLnVwZGF0ZUxpc3QucmVtb3ZlKGNoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgbWVtYmVycyBvZiB0aGlzIEdyb3VwIGFuZCBvcHRpb25hbGx5IHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBTY2VuZSBhbmQgLyBvciBkZXN0cm95cyB0aGVtLlxyXG4gICAgICpcclxuICAgICAqIERvZXMgbm90IGNhbGwge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNyZW1vdmVDYWxsYmFja30uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY2xlYXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlbW92ZUZyb21TY2VuZT1mYWxzZV0gLSBPcHRpb25hbGx5IHJlbW92ZSBlYWNoIEdyb3VwIG1lbWJlciBmcm9tIHRoZSBTY2VuZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rlc3Ryb3lDaGlsZD1mYWxzZV0gLSBPcHRpb25hbGx5IGNhbGwgZGVzdHJveSBvbiB0aGUgcmVtb3ZlZCBHcm91cCBtZW1iZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAocmVtb3ZlRnJvbVNjZW5lLCBkZXN0cm95Q2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlbW92ZUZyb21TY2VuZSA9PT0gdW5kZWZpbmVkKSB7IHJlbW92ZUZyb21TY2VuZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGRlc3Ryb3lDaGlsZCA9PT0gdW5kZWZpbmVkKSB7IGRlc3Ryb3lDaGlsZCA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGdhbWVPYmplY3QgPSBjaGlsZHJlbi5lbnRyaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5vZmYoRXZlbnRzLkRFU1RST1ksIHRoaXMucmVtb3ZlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkZXN0cm95Q2hpbGQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlbW92ZUZyb21TY2VuZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5zY2VuZS5zeXMuZGlzcGxheUxpc3QucmVtb3ZlKGdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChnYW1lT2JqZWN0LnByZVVwZGF0ZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0LnNjZW5lLnN5cy51cGRhdGVMaXN0LnJlbW92ZShnYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5jbGVhcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiBhIEdhbWUgT2JqZWN0IGlzIGEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjY29udGFpbnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gQSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBHYW1lIE9iamVjdCBpcyBhIG1lbWJlciBvZiB0aGlzIGdyb3VwLlxyXG4gICAgICovXHJcbiAgICBjb250YWluczogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGwgbWVtYmVycyBvZiB0aGUgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjZ2V0Q2hpbGRyZW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IFRoZSBncm91cCBtZW1iZXJzLlxyXG4gICAgICovXHJcbiAgICBnZXRDaGlsZHJlbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5lbnRyaWVzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2YgbWVtYmVycyBvZiB0aGUgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjZ2V0TGVuZ3RoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfVxyXG4gICAgICovXHJcbiAgICBnZXRMZW5ndGg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FucyB0aGUgR3JvdXAsIGZyb20gdG9wIHRvIGJvdHRvbSwgZm9yIHRoZSBmaXJzdCBtZW1iZXIgdGhhdCBoYXMgYW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gc3RhdGUgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50LFxyXG4gICAgICogYXNzaWducyBgeGAgYW5kIGB5YCwgYW5kIHJldHVybnMgdGhlIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBtYXRjaGluZyBtZW1iZXIgaXMgZm91bmQgYW5kIGBjcmVhdGVJZk51bGxgIGlzIHRydWUgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgdXNpbmcgYHhgLCBgeWAsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgLlxyXG4gICAgICogVW5sZXNzIGEgbmV3IG1lbWJlciBpcyBjcmVhdGVkLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYCBhcmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNnZXRGaXJzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3RhdGU9ZmFsc2VdIC0gVGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNhY3RpdmV9IHZhbHVlIHRvIG1hdGNoLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY3JlYXRlSWZOdWxsPWZhbHNlXSAtIENyZWF0ZSBhIG5ldyBHYW1lIE9iamVjdCBpZiBubyBtYXRjaGluZyBtZW1iZXJzIGFyZSBmb3VuZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3hdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PWRlZmF1bHRLZXldIC0gVGhlIHRleHR1cmUga2V5IGFzc2lnbmVkIHRvIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZT1kZWZhdWx0RnJhbWVdIC0gQSB0ZXh0dXJlIGZyYW1lIGFzc2lnbmVkIHRvIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPXRydWVdIC0gVGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlI3Zpc2libGV9IHN0YXRlIG9mIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P2FueX0gVGhlIGZpcnN0IG1hdGNoaW5nIGdyb3VwIG1lbWJlciwgb3IgYSBuZXdseSBjcmVhdGVkIG1lbWJlciwgb3IgbnVsbC5cclxuICAgICAqL1xyXG4gICAgZ2V0Rmlyc3Q6IGZ1bmN0aW9uIChzdGF0ZSwgY3JlYXRlSWZOdWxsLCB4LCB5LCBrZXksIGZyYW1lLCB2aXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhbmRsZXIodHJ1ZSwgMSwgc3RhdGUsIGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIEdyb3VwLCBmcm9tIHRvcCB0byBib3R0b20sIGZvciB0aGUgbnRoIG1lbWJlciB0aGF0IGhhcyBhbiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlfSBzdGF0ZSBtYXRjaGluZyB0aGUgYXJndW1lbnQsXHJcbiAgICAgKiBhc3NpZ25zIGB4YCBhbmQgYHlgLCBhbmQgcmV0dXJucyB0aGUgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIG1hdGNoaW5nIG1lbWJlciBpcyBmb3VuZCBhbmQgYGNyZWF0ZUlmTnVsbGAgaXMgdHJ1ZSBhbmQgdGhlIGdyb3VwIGlzbid0IGZ1bGwgdGhlbiBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBHYW1lIE9iamVjdCB1c2luZyBgeGAsIGB5YCwgYGtleWAsIGBmcmFtZWAsIGFuZCBgdmlzaWJsZWAuXHJcbiAgICAgKiBVbmxlc3MgYSBuZXcgbWVtYmVyIGlzIGNyZWF0ZWQsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgIGFyZSBpZ25vcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2dldEZpcnN0TnRoXHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG50aCAtIFRoZSBudGggbWF0Y2hpbmcgR3JvdXAgbWVtYmVyIHRvIHNlYXJjaCBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGF0ZT1mYWxzZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gdmFsdWUgdG8gbWF0Y2guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjcmVhdGVJZk51bGw9ZmFsc2VdIC0gQ3JlYXRlIGEgbmV3IEdhbWUgT2JqZWN0IGlmIG5vIG1hdGNoaW5nIG1lbWJlcnMgYXJlIGZvdW5kLCB1c2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXk9ZGVmYXVsdEtleV0gLSBUaGUgdGV4dHVyZSBrZXkgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lPWRlZmF1bHRGcmFtZV0gLSBBIHRleHR1cmUgZnJhbWUgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGUjdmlzaWJsZX0gc3RhdGUgb2YgYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/YW55fSBUaGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgbWVtYmVyLCBvciBhIG5ld2x5IGNyZWF0ZWQgbWVtYmVyLCBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBnZXRGaXJzdE50aDogZnVuY3Rpb24gKG50aCwgc3RhdGUsIGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIYW5kbGVyKHRydWUsIG50aCwgc3RhdGUsIGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIEdyb3VwIGZvciB0aGUgbGFzdCBtZW1iZXIgdGhhdCBoYXMgYW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gc3RhdGUgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50LFxyXG4gICAgICogYXNzaWducyBgeGAgYW5kIGB5YCwgYW5kIHJldHVybnMgdGhlIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBtYXRjaGluZyBtZW1iZXIgaXMgZm91bmQgYW5kIGBjcmVhdGVJZk51bGxgIGlzIHRydWUgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgdXNpbmcgYHhgLCBgeWAsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgLlxyXG4gICAgICogVW5sZXNzIGEgbmV3IG1lbWJlciBpcyBjcmVhdGVkLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYCBhcmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNnZXRMYXN0XHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGF0ZT1mYWxzZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gdmFsdWUgdG8gbWF0Y2guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjcmVhdGVJZk51bGw9ZmFsc2VdIC0gQ3JlYXRlIGEgbmV3IEdhbWUgT2JqZWN0IGlmIG5vIG1hdGNoaW5nIG1lbWJlcnMgYXJlIGZvdW5kLCB1c2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXk9ZGVmYXVsdEtleV0gLSBUaGUgdGV4dHVyZSBrZXkgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lPWRlZmF1bHRGcmFtZV0gLSBBIHRleHR1cmUgZnJhbWUgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGUjdmlzaWJsZX0gc3RhdGUgb2YgYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/YW55fSBUaGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgbWVtYmVyLCBvciBhIG5ld2x5IGNyZWF0ZWQgbWVtYmVyLCBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBnZXRMYXN0OiBmdW5jdGlvbiAoc3RhdGUsIGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRIYW5kbGVyKGZhbHNlLCAxLCBzdGF0ZSwgY3JlYXRlSWZOdWxsLCB4LCB5LCBrZXksIGZyYW1lLCB2aXNpYmxlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FucyB0aGUgR3JvdXAgZm9yIHRoZSBsYXN0IG50aCBtZW1iZXIgdGhhdCBoYXMgYW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gc3RhdGUgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50LFxyXG4gICAgICogYXNzaWducyBgeGAgYW5kIGB5YCwgYW5kIHJldHVybnMgdGhlIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBtYXRjaGluZyBtZW1iZXIgaXMgZm91bmQgYW5kIGBjcmVhdGVJZk51bGxgIGlzIHRydWUgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgdXNpbmcgYHhgLCBgeWAsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgLlxyXG4gICAgICogVW5sZXNzIGEgbmV3IG1lbWJlciBpcyBjcmVhdGVkLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYCBhcmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNnZXRMYXN0TnRoXHJcbiAgICAgKiBAc2luY2UgMy42LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG50aCAtIFRoZSBudGggbWF0Y2hpbmcgR3JvdXAgbWVtYmVyIHRvIHNlYXJjaCBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGF0ZT1mYWxzZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gdmFsdWUgdG8gbWF0Y2guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjcmVhdGVJZk51bGw9ZmFsc2VdIC0gQ3JlYXRlIGEgbmV3IEdhbWUgT2JqZWN0IGlmIG5vIG1hdGNoaW5nIG1lbWJlcnMgYXJlIGZvdW5kLCB1c2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXk9ZGVmYXVsdEtleV0gLSBUaGUgdGV4dHVyZSBrZXkgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lPWRlZmF1bHRGcmFtZV0gLSBBIHRleHR1cmUgZnJhbWUgYXNzaWduZWQgdG8gYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc2libGU9dHJ1ZV0gLSBUaGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGUjdmlzaWJsZX0gc3RhdGUgb2YgYSBuZXcgR2FtZSBPYmplY3QgKGlmIG9uZSBpcyBjcmVhdGVkKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/YW55fSBUaGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgbWVtYmVyLCBvciBhIG5ld2x5IGNyZWF0ZWQgbWVtYmVyLCBvciBudWxsLlxyXG4gICAgICovXHJcbiAgICBnZXRMYXN0TnRoOiBmdW5jdGlvbiAobnRoLCBzdGF0ZSwgY3JlYXRlSWZOdWxsLCB4LCB5LCBrZXksIGZyYW1lLCB2aXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhbmRsZXIoZmFsc2UsIG50aCwgc3RhdGUsIGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGdyb3VwIGZvciB0aGUgbGFzdCBtZW1iZXIgdGhhdCBoYXMgYW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gc3RhdGUgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50LFxyXG4gICAgICogYXNzaWducyBgeGAgYW5kIGB5YCwgYW5kIHJldHVybnMgdGhlIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBtYXRjaGluZyBtZW1iZXIgaXMgZm91bmQgYW5kIGBjcmVhdGVJZk51bGxgIGlzIHRydWUgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgdXNpbmcgYHhgLCBgeWAsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgLlxyXG4gICAgICogVW5sZXNzIGEgbmV3IG1lbWJlciBpcyBjcmVhdGVkLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYCBhcmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNnZXRIYW5kbGVyXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3J3YXJkcyAtIFNlYXJjaCBmcm9udCB0byBiYWNrIG9yIGJhY2sgdG8gZnJvbnQ/XHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG50aCAtIFN0b3AgbWF0Y2hpbmcgYWZ0ZXIgbnRoIHN1Y2Nlc3NmdWwgbWF0Y2hlcy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0YXRlPWZhbHNlXSAtIFRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlfSB2YWx1ZSB0byBtYXRjaC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NyZWF0ZUlmTnVsbD1mYWxzZV0gLSBDcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgaWYgbm8gbWF0Y2hpbmcgbWVtYmVycyBhcmUgZm91bmQsIHVzaW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleT1kZWZhdWx0S2V5XSAtIFRoZSB0ZXh0dXJlIGtleSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWU9ZGVmYXVsdEZyYW1lXSAtIEEgdGV4dHVyZSBmcmFtZSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmlzaWJsZT10cnVlXSAtIFRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZSN2aXNpYmxlfSBzdGF0ZSBvZiBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9hbnl9IFRoZSBmaXJzdCBtYXRjaGluZyBncm91cCBtZW1iZXIsIG9yIGEgbmV3bHkgY3JlYXRlZCBtZW1iZXIsIG9yIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGdldEhhbmRsZXI6IGZ1bmN0aW9uIChmb3J3YXJkcywgbnRoLCBzdGF0ZSwgY3JlYXRlSWZOdWxsLCB4LCB5LCBrZXksIGZyYW1lLCB2aXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gdW5kZWZpbmVkKSB7IHN0YXRlID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoY3JlYXRlSWZOdWxsID09PSB1bmRlZmluZWQpIHsgY3JlYXRlSWZOdWxsID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5lbnRyaWVzO1xyXG5cclxuICAgICAgICBpZiAoZm9yd2FyZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QgPSBjaGlsZHJlbltpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZ2FtZU9iamVjdC5hY3RpdmUgPT09IHN0YXRlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbCA9PT0gbnRoKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdhbWVPYmplY3QgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnYW1lT2JqZWN0ID0gY2hpbGRyZW5baV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGdhbWVPYmplY3QuYWN0aXZlID09PSBzdGF0ZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWwgPT09IG50aClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGdhbWVPYmplY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHgpID09PSAnbnVtYmVyJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC54ID0geDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZih5KSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QueSA9IHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBnYW1lT2JqZWN0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEdvdCB0aGlzIGZhcj8gV2UgbmVlZCB0byBjcmVhdGUgb3IgYmFpbFxyXG4gICAgICAgIGlmIChjcmVhdGVJZk51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FucyB0aGUgZ3JvdXAgZm9yIHRoZSBmaXJzdCBtZW1iZXIgdGhhdCBoYXMgYW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I2FjdGl2ZX0gc3RhdGUgc2V0IHRvIGBmYWxzZWAsXHJcbiAgICAgKiBhc3NpZ25zIGB4YCBhbmQgYHlgLCBhbmQgcmV0dXJucyB0aGUgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGluYWN0aXZlIG1lbWJlciBpcyBmb3VuZCBhbmQgdGhlIGdyb3VwIGlzbid0IGZ1bGwgdGhlbiBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBHYW1lIE9iamVjdCB1c2luZyBgeGAsIGB5YCwgYGtleWAsIGBmcmFtZWAsIGFuZCBgdmlzaWJsZWAuXHJcbiAgICAgKiBUaGUgbmV3IEdhbWUgT2JqZWN0IHdpbGwgaGF2ZSBpdHMgYWN0aXZlIHN0YXRlIHNldCB0byBgdHJ1ZWAuXHJcbiAgICAgKiBVbmxlc3MgYSBuZXcgbWVtYmVyIGlzIGNyZWF0ZWQsIGBrZXlgLCBgZnJhbWVgLCBhbmQgYHZpc2libGVgIGFyZSBpZ25vcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleT1kZWZhdWx0S2V5XSAtIFRoZSB0ZXh0dXJlIGtleSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWU9ZGVmYXVsdEZyYW1lXSAtIEEgdGV4dHVyZSBmcmFtZSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmlzaWJsZT10cnVlXSAtIFRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZSN2aXNpYmxlfSBzdGF0ZSBvZiBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9hbnl9IFRoZSBmaXJzdCBpbmFjdGl2ZSBncm91cCBtZW1iZXIsIG9yIGEgbmV3bHkgY3JlYXRlZCBtZW1iZXIsIG9yIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGdldDogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUsIHZpc2libGUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3QoZmFsc2UsIHRydWUsIHgsIHksIGtleSwgZnJhbWUsIHZpc2libGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYW5zIHRoZSBncm91cCBmb3IgdGhlIGZpcnN0IG1lbWJlciB0aGF0IGhhcyBhbiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlfSBzdGF0ZSBzZXQgdG8gYHRydWVgLFxyXG4gICAgICogYXNzaWducyBgeGAgYW5kIGB5YCwgYW5kIHJldHVybnMgdGhlIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBhY3RpdmUgbWVtYmVyIGlzIGZvdW5kIGFuZCBgY3JlYXRlSWZOdWxsYCBpcyBgdHJ1ZWAgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgb25lIHVzaW5nIGB4YCwgYHlgLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYC5cclxuICAgICAqIFVubGVzcyBhIG5ldyBtZW1iZXIgaXMgY3JlYXRlZCwgYGtleWAsIGBmcmFtZWAsIGFuZCBgdmlzaWJsZWAgYXJlIGlnbm9yZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjZ2V0Rmlyc3RBbGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY3JlYXRlSWZOdWxsPWZhbHNlXSAtIENyZWF0ZSBhIG5ldyBHYW1lIE9iamVjdCBpZiBubyBtYXRjaGluZyBtZW1iZXJzIGFyZSBmb3VuZCwgdXNpbmcgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3hdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5PWRlZmF1bHRLZXldIC0gVGhlIHRleHR1cmUga2V5IGFzc2lnbmVkIHRvIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZT1kZWZhdWx0RnJhbWVdIC0gQSB0ZXh0dXJlIGZyYW1lIGFzc2lnbmVkIHRvIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2aXNpYmxlPXRydWVdIC0gVGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlI3Zpc2libGV9IHN0YXRlIG9mIGEgbmV3IEdhbWUgT2JqZWN0IChpZiBvbmUgaXMgY3JlYXRlZCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7YW55fSBUaGUgZmlyc3QgYWN0aXZlIGdyb3VwIG1lbWJlciwgb3IgYSBuZXdseSBjcmVhdGVkIG1lbWJlciwgb3IgbnVsbC5cclxuICAgICAqL1xyXG4gICAgZ2V0Rmlyc3RBbGl2ZTogZnVuY3Rpb24gKGNyZWF0ZUlmTnVsbCwgeCwgeSwga2V5LCBmcmFtZSwgdmlzaWJsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaXJzdCh0cnVlLCBjcmVhdGVJZk51bGwsIHgsIHksIGtleSwgZnJhbWUsIHZpc2libGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYW5zIHRoZSBncm91cCBmb3IgdGhlIGZpcnN0IG1lbWJlciB0aGF0IGhhcyBhbiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlfSBzdGF0ZSBzZXQgdG8gYGZhbHNlYCxcclxuICAgICAqIGFzc2lnbnMgYHhgIGFuZCBgeWAsIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gaW5hY3RpdmUgbWVtYmVyIGlzIGZvdW5kIGFuZCBgY3JlYXRlSWZOdWxsYCBpcyBgdHJ1ZWAgYW5kIHRoZSBncm91cCBpc24ndCBmdWxsIHRoZW4gaXQgd2lsbCBjcmVhdGUgYSBuZXcgb25lIHVzaW5nIGB4YCwgYHlgLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYC5cclxuICAgICAqIFRoZSBuZXcgR2FtZSBPYmplY3Qgd2lsbCBoYXZlIGFuIGFjdGl2ZSBzdGF0ZSBzZXQgdG8gYHRydWVgLlxyXG4gICAgICogVW5sZXNzIGEgbmV3IG1lbWJlciBpcyBjcmVhdGVkLCBga2V5YCwgYGZyYW1lYCwgYW5kIGB2aXNpYmxlYCBhcmUgaWdub3JlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNnZXRGaXJzdERlYWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NyZWF0ZUlmTnVsbD1mYWxzZV0gLSBDcmVhdGUgYSBuZXcgR2FtZSBPYmplY3QgaWYgbm8gbWF0Y2hpbmcgbWVtYmVycyBhcmUgZm91bmQsIHVzaW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleT1kZWZhdWx0S2V5XSAtIFRoZSB0ZXh0dXJlIGtleSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWU9ZGVmYXVsdEZyYW1lXSAtIEEgdGV4dHVyZSBmcmFtZSBhc3NpZ25lZCB0byBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmlzaWJsZT10cnVlXSAtIFRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZSN2aXNpYmxlfSBzdGF0ZSBvZiBhIG5ldyBHYW1lIE9iamVjdCAoaWYgb25lIGlzIGNyZWF0ZWQpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2FueX0gVGhlIGZpcnN0IGluYWN0aXZlIGdyb3VwIG1lbWJlciwgb3IgYSBuZXdseSBjcmVhdGVkIG1lbWJlciwgb3IgbnVsbC5cclxuICAgICAqL1xyXG4gICAgZ2V0Rmlyc3REZWFkOiBmdW5jdGlvbiAoY3JlYXRlSWZOdWxsLCB4LCB5LCBrZXksIGZyYW1lLCB2aXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpcnN0KGZhbHNlLCBjcmVhdGVJZk51bGwsIHgsIHksIGtleSwgZnJhbWUsIHZpc2libGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb24jcGxheSBQbGF5c30gYW4gYW5pbWF0aW9uIGZvciBhbGwgbWVtYmVycyBvZiB0aGlzIGdyb3VwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3BsYXlBbmltYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgYW5pbWF0aW9uIHRvIHBsYXkuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0YXJ0RnJhbWU9MF0gLSBPcHRpb25hbGx5IHN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZyBmcm9tIHRoaXMgZnJhbWUgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHBsYXlBbmltYXRpb246IGZ1bmN0aW9uIChrZXksIHN0YXJ0RnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5QbGF5QW5pbWF0aW9uKHRoaXMuY2hpbGRyZW4uZW50cmllcywga2V5LCBzdGFydEZyYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIGdyb3VwJ3Mgc2l6ZSBhdCBpdHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNtYXhTaXplIG1heGltdW19LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2lzRnVsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIG1lbWJlcnMgZXF1YWxzIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjbWF4U2l6ZX0uXHJcbiAgICAgKi9cclxuICAgIGlzRnVsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5tYXhTaXplID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNoaWxkcmVuLnNpemUgPj0gdGhpcy5tYXhTaXplKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIChvciBpbmFjdGl2ZSkgZ3JvdXAgbWVtYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNjb3VudEFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBDb3VudCBhY3RpdmUgKHRydWUpIG9yIGluYWN0aXZlIChmYWxzZSkgZ3JvdXAgbWVtYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIGdyb3VwIG1lbWJlcnMgd2l0aCBhbiBhY3RpdmUgc3RhdGUgbWF0Y2hpbmcgdGhlIGBhY3RpdmVgIGFyZ3VtZW50LlxyXG4gICAgICovXHJcbiAgICBjb3VudEFjdGl2ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uZW50cmllc1tpXS5hY3RpdmUgPT09IHZhbHVlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ291bnRzIHRoZSBudW1iZXIgb2YgaW4tdXNlIChhY3RpdmUpIGdyb3VwIG1lbWJlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjZ2V0VG90YWxVc2VkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIGdyb3VwIG1lbWJlcnMgd2l0aCBhbiBhY3RpdmUgc3RhdGUgb2YgdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0VG90YWxVc2VkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpZmZlcmVuY2Ugb2Yge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNtYXhTaXplfSBhbmQgdGhlIG51bWJlciBvZiBhY3RpdmUgZ3JvdXAgbWVtYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBncm91cCBtZW1iZXJzIHRoYXQgY291bGQgYmUgY3JlYXRlZCBvciByZWFjdGl2YXRlZCBiZWZvcmUgcmVhY2hpbmcgdGhlIHNpemUgbGltaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjZ2V0VG90YWxGcmVlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBtYXhTaXplIG1pbnVzIHRoZSBudW1iZXIgb2YgYWN0aXZlIGdyb3VwIG51bWJlcnM7IG9yIGEgbGFyZ2UgbnVtYmVyIChpZiBtYXhTaXplIGlzIC0xKS5cclxuICAgICAqL1xyXG4gICAgZ2V0VG90YWxGcmVlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VkID0gdGhpcy5nZXRUb3RhbFVzZWQoKTtcclxuICAgICAgICB2YXIgY2FwYWNpdHkgPSAodGhpcy5tYXhTaXplID09PSAtMSkgPyA5OTk5OTk5OTk5OTkgOiB0aGlzLm1heFNpemU7XHJcblxyXG4gICAgICAgIHJldHVybiAoY2FwYWNpdHkgLSB1c2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIGBrZXlgIG9mIGVhY2ggZ3JvdXAgbWVtYmVyIHRvIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNwcm9wZXJ0eVZhbHVlU2V0XHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSB0byBiZSB1cGRhdGVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHJvcGVydHlWYWx1ZVNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUsIHN0ZXAsIGluZGV4LCBkaXJlY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5Qcm9wZXJ0eVZhbHVlU2V0KHRoaXMuY2hpbGRyZW4uZW50cmllcywga2V5LCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIGBrZXlgIG9mIGVhY2ggZ3JvdXAgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3Byb3BlcnR5VmFsdWVJbmNcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IHRvIGJlIHVwZGF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aXRoaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTFdIC0gVGhlIGRpcmVjdGlvbiB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGFycmF5LiAxIGlzIGZyb20gYmVnaW5uaW5nIHRvIGVuZCwgLTEgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcm9wZXJ0eVZhbHVlSW5jOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgc3RlcCwgaW5kZXgsIGRpcmVjdGlvbilcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlByb3BlcnR5VmFsdWVJbmModGhpcy5jaGlsZHJlbi5lbnRyaWVzLCBrZXksIHZhbHVlLCBzdGVwLCBpbmRleCwgZGlyZWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgeCBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXRYXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRYOiBmdW5jdGlvbiAodmFsdWUsIHN0ZXApXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5TZXRYKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUsIHN0ZXApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB5IG9mIGVhY2ggZ3JvdXAgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3NldFlcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFk6IGZ1bmN0aW9uICh2YWx1ZSwgc3RlcClcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlNldFkodGhpcy5jaGlsZHJlbi5lbnRyaWVzLCB2YWx1ZSwgc3RlcCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHgsIHkgb2YgZWFjaCBncm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjc2V0WFlcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBgeGAgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgYHlgIHByb3BlcnR5IHRvLiBJZiBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXQgdXNlcyB0aGUgYHhgIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB4YCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWT0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB5YCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRYWTogZnVuY3Rpb24gKHgsIHksIHN0ZXBYLCBzdGVwWSlcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlNldFhZKHRoaXMuY2hpbGRyZW4uZW50cmllcywgeCwgeSwgc3RlcFgsIHN0ZXBZKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHggb2YgZWFjaCBncm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjaW5jWFxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGB4YCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaW5jWDogZnVuY3Rpb24gKHZhbHVlLCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuSW5jWCh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHZhbHVlLCBzdGVwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHkgb2YgZWFjaCBncm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjaW5jWVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGB5YCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaW5jWTogZnVuY3Rpb24gKHZhbHVlLCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuSW5jWSh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHZhbHVlLCBzdGVwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHgsIHkgb2YgZWFjaCBncm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjaW5jWFlcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGB4YCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGB5YCBwcm9wZXJ0eS4gSWYgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGl0IHVzZXMgdGhlIGB4YCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFg9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgeGAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgeWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaW5jWFk6IGZ1bmN0aW9uICh4LCB5LCBzdGVwWCwgc3RlcFkpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5JbmNYWSh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHgsIHksIHN0ZXBYLCBzdGVwWSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZ3JvdXAgbWVtYmVycyBjaGFuZ2luZyB0aGUgcG9zaXRpb24gb2YgZWFjaCBlbGVtZW50IHRvIGJlIHRoYXQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjYW1lIGJlZm9yZVxyXG4gICAgICogaXQgaW4gdGhlIGFycmF5IChvciBhZnRlciBpdCBpZiBkaXJlY3Rpb24gPSAxKVxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZmlyc3QgZ3JvdXAgbWVtYmVyIHBvc2l0aW9uIGlzIHNldCB0byB4L3kuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjc2hpZnRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBwbGFjZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gcGxhY2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGF0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlyZWN0aW9uPTBdIC0gVGhlIGl0ZXJhdGlvbiBkaXJlY3Rpb24uIDAgPSBmaXJzdCB0byBsYXN0IGFuZCAxID0gbGFzdCB0byBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2hpZnRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHksIGRpcmVjdGlvbilcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlNoaWZ0UG9zaXRpb24odGhpcy5jaGlsZHJlbi5lbnRyaWVzLCB4LCB5LCBkaXJlY3Rpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbmdsZSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBhbmdsZSB0bywgaW4gZGVncmVlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYW5nbGU6IGZ1bmN0aW9uICh2YWx1ZSwgc3RlcClcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLkFuZ2xlKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUsIHN0ZXApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByb3RhdGlvbiBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNyb3RhdGVcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcm90YXRpb24gdG8sIGluIHJhZGlhbnMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZTogZnVuY3Rpb24gKHZhbHVlLCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuUm90YXRlKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUsIHN0ZXApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIGVhY2ggZ3JvdXAgbWVtYmVyIGFyb3VuZCB0aGUgZ2l2ZW4gcG9pbnQgYnkgdGhlIGdpdmVuIGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3JvdGF0ZUFyb3VuZFxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IHBvaW50IC0gQW55IG9iamVjdCB3aXRoIHB1YmxpYyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSBieSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcm90YXRlQXJvdW5kOiBmdW5jdGlvbiAocG9pbnQsIGFuZ2xlKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuUm90YXRlQXJvdW5kKHRoaXMuY2hpbGRyZW4uZW50cmllcywgcG9pbnQsIGFuZ2xlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyBlYWNoIGdyb3VwIG1lbWJlciBhcm91bmQgdGhlIGdpdmVuIHBvaW50IGJ5IHRoZSBnaXZlbiBhbmdsZSBhbmQgZGlzdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjcm90YXRlQXJvdW5kRGlzdGFuY2VcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlfSBwb2ludCAtIEFueSBvYmplY3Qgd2l0aCBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byByb3RhdGUgYnksIGluIHJhZGlhbnMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgcG9pbnQgb2Ygcm90YXRpb24gaW4gcGl4ZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByb3RhdGVBcm91bmREaXN0YW5jZTogZnVuY3Rpb24gKHBvaW50LCBhbmdsZSwgZGlzdGFuY2UpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5Sb3RhdGVBcm91bmREaXN0YW5jZSh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHBvaW50LCBhbmdsZSwgZGlzdGFuY2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbHBoYSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBhbHBoYSB0by5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uICh2YWx1ZSwgc3RlcClcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlNldEFscGhhKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUsIHN0ZXApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aW50IG9mIGVhY2ggZ3JvdXAgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3NldFRpbnRcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG9wTGVmdCAtIFRoZSB0aW50IGJlaW5nIGFwcGxpZWQgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGl0ZW0uIElmIG90aGVyIHBhcmFtZXRlcnMgYXJlIGdpdmVuIG5vIHZhbHVlLCB0aGlzIHRpbnQgd2lsbCBiZSBhcHBsaWVkIHRvIHdob2xlIGl0ZW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RvcFJpZ2h0XSAtIFRoZSB0aW50IHRvIGJlIGFwcGxpZWQgdG8gdG9wLXJpZ2h0IGNvcm5lciBvZiBpdGVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b21MZWZ0XSAtIFRoZSB0aW50IHRvIGJlIGFwcGxpZWQgdG8gdGhlIGJvdHRvbS1sZWZ0IGNvcm5lciBvZiBpdGVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b21SaWdodF0gLSBUaGUgdGludCB0byBiZSBhcHBsaWVkIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIGl0ZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRpbnQ6IGZ1bmN0aW9uICh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5TZXRUaW50KHRoaXMuY2hpbGRyZW4uZW50cmllcywgdG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgb3JpZ2luWCwgb3JpZ2luWSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXRPcmlnaW5cclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3JpZ2luWCAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBgb3JpZ2luWGAgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29yaWdpblldIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIGBvcmlnaW5ZYCBwcm9wZXJ0eSB0by4gSWYgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGl0IHVzZXMgdGhlIGBvcmlnaW5YYCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFg9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgb3JpZ2luWGAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFk9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgb3JpZ2luWWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0T3JpZ2luOiBmdW5jdGlvbiAob3JpZ2luWCwgb3JpZ2luWSwgc3RlcFgsIHN0ZXBZKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2V0T3JpZ2luKHRoaXMuY2hpbGRyZW4uZW50cmllcywgb3JpZ2luWCwgb3JpZ2luWSwgc3RlcFgsIHN0ZXBZKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2NhbGVYIG9mIGVhY2ggZ3JvdXAgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI3NjYWxlWFxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGB2YWx1ZWAgYW1vdW50LCBtdWx0aXBsaWVkIGJ5IHRoZSBpdGVyYXRpb24gY291bnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2NhbGVYOiBmdW5jdGlvbiAodmFsdWUsIHN0ZXApXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5TY2FsZVgodGhpcy5jaGlsZHJlbi5lbnRyaWVzLCB2YWx1ZSwgc3RlcCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNjYWxlWSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzY2FsZVlcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgdmFsdWVgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNjYWxlWTogZnVuY3Rpb24gKHZhbHVlLCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2NhbGVZKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUsIHN0ZXApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzY2FsZVgsIHNjYWxlWSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzY2FsZVhZXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlWCAtIFRoZSBhbW91bnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBzY2FsZVhgIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZVldIC0gVGhlIGFtb3VudCB0byBiZSBhZGRlZCB0byB0aGUgYHNjYWxlWWAgcHJvcGVydHkuIElmIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpdCB1c2VzIHRoZSBgc2NhbGVYYCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFg9MF0gLSBUaGlzIGlzIGFkZGVkIHRvIHRoZSBgc2NhbGVYYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwWT0wXSAtIFRoaXMgaXMgYWRkZWQgdG8gdGhlIGBzY2FsZVlgIGFtb3VudCwgbXVsdGlwbGllZCBieSB0aGUgaXRlcmF0aW9uIGNvdW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNjYWxlWFk6IGZ1bmN0aW9uIChzY2FsZVgsIHNjYWxlWSwgc3RlcFgsIHN0ZXBZKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2NhbGVYWSh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHNjYWxlWCwgc2NhbGVZLCBzdGVwWCwgc3RlcFkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkZXB0aCBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXREZXB0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdIC0gVGhpcyBpcyBhZGRlZCB0byB0aGUgYHZhbHVlYCBhbW91bnQsIG11bHRpcGxpZWQgYnkgdGhlIGl0ZXJhdGlvbiBjb3VudGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREZXB0aDogZnVuY3Rpb24gKHZhbHVlLCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2V0RGVwdGgodGhpcy5jaGlsZHJlbi5lbnRyaWVzLCB2YWx1ZSwgc3RlcCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGJsZW5kTW9kZSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXRCbGVuZE1vZGVcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJsZW5kTW9kZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2V0QmxlbmRNb2RlKHRoaXMuY2hpbGRyZW4uZW50cmllcywgdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgYWxsIGdyb3VwIG1lbWJlcnMgdG8gdGhlIElucHV0IE1hbmFnZXIgdG8gZW5hYmxlIHRoZW0gZm9yIGlucHV0IHdpdGggaWRlbnRpY2FsIGFyZWFzIGFuZCBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjc2V0SGl0QXJlYVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gaGl0QXJlYSAtIEVpdGhlciBhbiBpbnB1dCBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYSBnZW9tZXRyaWMgc2hhcGUgdGhhdCBkZWZpbmVzIHRoZSBoaXQgYXJlYSBmb3IgdGhlIEdhbWUgT2JqZWN0LiBJZiBub3Qgc3BlY2lmaWVkIGEgUmVjdGFuZ2xlIHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkhpdEFyZWFDYWxsYmFja30gaGl0QXJlYUNhbGxiYWNrIC0gQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIEdhbWUgT2JqZWN0IGlzIGludGVyYWN0ZWQgd2l0aC4gSWYgeW91IHByb3ZpZGUgYSBzaGFwZSB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgYSBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SGl0QXJlYTogZnVuY3Rpb24gKGhpdEFyZWEsIGhpdEFyZWFDYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBBY3Rpb25zLlNldEhpdEFyZWEodGhpcy5jaGlsZHJlbi5lbnRyaWVzLCBoaXRBcmVhLCBoaXRBcmVhQ2FsbGJhY2spO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHVmZmxlcyB0aGUgZ3JvdXAgbWVtYmVycyBpbiBwbGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzaHVmZmxlXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNodWZmbGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5TaHVmZmxlKHRoaXMuY2hpbGRyZW4uZW50cmllcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYWN0aXZhdGVzIGEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAja2lsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIEEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIGtpbGw6IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmNvbnRhaW5zKGdhbWVPYmplY3QpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5zZXRBY3RpdmUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWFjdGl2YXRlcyBhbmQgaGlkZXMgYSBtZW1iZXIgb2YgdGhpcyBncm91cC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNraWxsQW5kSGlkZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIEEgbWVtYmVyIG9mIHRoaXMgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIGtpbGxBbmRIaWRlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5jb250YWlucyhnYW1lT2JqZWN0KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdhbWVPYmplY3Quc2V0QWN0aXZlKGZhbHNlKTtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlzaWJsZSBvZiBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cCNzZXRWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBBbiBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gd2l0aGluIHRoZSBpdGVtcyBhcnJheS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcmVjdGlvbj0xXSAtIFRoZSBkaXJlY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheS4gMSBpcyBmcm9tIGJlZ2lubmluZyB0byBlbmQsIC0xIGZyb20gZW5kIHRvIGJlZ2lubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VmlzaWJsZTogZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgZGlyZWN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIEFjdGlvbnMuU2V0VmlzaWJsZSh0aGlzLmNoaWxkcmVuLmVudHJpZXMsIHZhbHVlLCBpbmRleCwgZGlyZWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG9nZ2xlcyAoZmxpcHMpIHRoZSB2aXNpYmxlIHN0YXRlIG9mIGVhY2ggbWVtYmVyIG9mIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjdG9nZ2xlVmlzaWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHcm91cCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRvZ2dsZVZpc2libGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgQWN0aW9ucy5Ub2dnbGVWaXNpYmxlKHRoaXMuY2hpbGRyZW4uZW50cmllcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtcHRpZXMgdGhpcyBncm91cCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBEb2VzIG5vdCBjYWxsIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXAjcmVtb3ZlQ2FsbGJhY2t9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rlc3Ryb3lDaGlsZHJlbj1mYWxzZV0gLSBBbHNvIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNkZXN0cm95fSBlYWNoIGdyb3VwIG1lbWJlci5cclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKGRlc3Ryb3lDaGlsZHJlbilcclxuICAgIHtcclxuICAgICAgICBpZiAoZGVzdHJveUNoaWxkcmVuID09PSB1bmRlZmluZWQpIHsgZGVzdHJveUNoaWxkcmVuID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgLy8gIFRoaXMgR2FtZSBPYmplY3QgaGFkIGFscmVhZHkgYmVlbiBkZXN0cm95ZWRcclxuICAgICAgICBpZiAoIXRoaXMuc2NlbmUgfHwgdGhpcy5pZ25vcmVEZXN0cm95KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jbGVhcihmYWxzZSwgZGVzdHJveUNoaWxkcmVuKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyb3VwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHcm91cCA9IHJlcXVpcmUoJy4vR3JvdXAnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IEdyb3VwIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBHcm91cCBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3IjZ3JvdXBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdncm91cCcsIGZ1bmN0aW9uIChjb25maWcpXHJcbntcclxuICAgIHJldHVybiBuZXcgR3JvdXAodGhpcy5zY2VuZSwgbnVsbCwgY29uZmlnKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdENyZWF0b3IgY29udGV4dC5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR3JvdXAgPSByZXF1aXJlKCcuL0dyb3VwJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBHcm91cCBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEdyb3VwIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNncm91cFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDb25maWd8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ29uZmlnW10pfSBbY2hpbGRyZW5dIC0gR2FtZSBPYmplY3RzIHRvIGFkZCB0byB0aGlzIEdyb3VwOyBvciB0aGUgYGNvbmZpZ2AgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZ30gW2NvbmZpZ10gLSBBIEdyb3VwIENvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXB9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2dyb3VwJywgZnVuY3Rpb24gKGNoaWxkcmVuLCBjb25maWcpXHJcbntcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUxpc3QuYWRkKG5ldyBHcm91cCh0aGlzLnNjZW5lLCBjaGlsZHJlbiwgY29uZmlnKSk7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxudmFyIEltYWdlUmVuZGVyID0gcmVxdWlyZSgnLi9JbWFnZVJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQW4gSW1hZ2UgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEFuIEltYWdlIGlzIGEgbGlnaHQtd2VpZ2h0IEdhbWUgT2JqZWN0IHVzZWZ1bCBmb3IgdGhlIGRpc3BsYXkgb2Ygc3RhdGljIGltYWdlcyBpbiB5b3VyIGdhbWUsXHJcbiAqIHN1Y2ggYXMgbG9nb3MsIGJhY2tncm91bmRzLCBzY2VuZXJ5IG9yIG90aGVyIG5vbi1hbmltYXRlZCBlbGVtZW50cy4gSW1hZ2VzIGNhbiBoYXZlIGlucHV0XHJcbiAqIGV2ZW50cyBhbmQgcGh5c2ljcyBib2RpZXMsIG9yIGJlIHR3ZWVuZWQsIHRpbnRlZCBvciBzY3JvbGxlZC4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGFuXHJcbiAqIEltYWdlIGFuZCBhIFNwcml0ZSBpcyB0aGF0IHlvdSBjYW5ub3QgYW5pbWF0ZSBhbiBJbWFnZSBhcyB0aGV5IGRvIG5vdCBoYXZlIHRoZSBBbmltYXRpb24gY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAY2xhc3MgSW1hZ2VcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlQ3JvcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICovXHJcbnZhciBJbWFnZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuR2V0Qm91bmRzLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlRleHR1cmVDcm9wLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGludCxcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgSW1hZ2VSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBJbWFnZSAoc2NlbmUsIHgsIHksIHRleHR1cmUsIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3QuY2FsbCh0aGlzLCBzY2VuZSwgJ0ltYWdlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbnRlcm5hbCBjcm9wIGRhdGEgb2JqZWN0LCBhcyB1c2VkIGJ5IGBzZXRDcm9wYCBhbmQgcGFzc2VkIHRvIHRoZSBgRnJhbWUuc2V0Q3JvcFVWc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkltYWdlI19jcm9wXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jcm9wID0gdGhpcy5yZXNldENyb3BPYmplY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKHRleHR1cmUsIGZyYW1lKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZVRvRnJhbWUoKTtcclxuICAgICAgICB0aGlzLnNldE9yaWdpbkZyb21GcmFtZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW1hZ2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5JbWFnZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5JbWFnZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIEltYWdlQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICByZW5kZXJlci5iYXRjaFNwcml0ZShzcmMsIHNyYy5mcmFtZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgSW1hZ2UgPSByZXF1aXJlKCcuL0ltYWdlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBJbWFnZSBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyBpdC5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSW1hZ2UgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI2ltYWdlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5JbWFnZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3RlcignaW1hZ2UnLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICB2YXIga2V5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdrZXknLCBudWxsKTtcclxuICAgIHZhciBmcmFtZSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnZnJhbWUnLCBudWxsKTtcclxuXHJcbiAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UodGhpcy5zY2VuZSwgMCwgMCwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgaWYgKGFkZFRvU2NlbmUgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBjb25maWcuYWRkID0gYWRkVG9TY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3QodGhpcy5zY2VuZSwgaW1hZ2UsIGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIGltYWdlO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBJbWFnZSA9IHJlcXVpcmUoJy4vSW1hZ2UnKTtcclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IEltYWdlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSW1hZ2UgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I2ltYWdlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5JbWFnZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignaW1hZ2UnLCBmdW5jdGlvbiAoeCwgeSwga2V5LCBmcmFtZSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBJbWFnZSh0aGlzLnNjZW5lLCB4LCB5LCBrZXksIGZyYW1lKSk7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RGYWN0b3J5IGNvbnRleHQuXHJcbi8vXHJcbi8vICBUaGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byB1c2U6XHJcbi8vXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vSW1hZ2VXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0ltYWdlQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkltYWdlI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuSW1hZ2V9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBJbWFnZVdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB0aGlzLnBpcGVsaW5lLmJhdGNoU3ByaXRlKHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZVdlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RzID0ge1xyXG5cclxuICAgIEV2ZW50czogcmVxdWlyZSgnLi9ldmVudHMnKSxcclxuXHJcbiAgICBEaXNwbGF5TGlzdDogcmVxdWlyZSgnLi9EaXNwbGF5TGlzdCcpLFxyXG4gICAgR2FtZU9iamVjdENyZWF0b3I6IHJlcXVpcmUoJy4vR2FtZU9iamVjdENyZWF0b3InKSxcclxuICAgIEdhbWVPYmplY3RGYWN0b3J5OiByZXF1aXJlKCcuL0dhbWVPYmplY3RGYWN0b3J5JyksXHJcbiAgICBVcGRhdGVMaXN0OiByZXF1aXJlKCcuL1VwZGF0ZUxpc3QnKSxcclxuXHJcbiAgICBDb21wb25lbnRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMnKSxcclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3Q6IHJlcXVpcmUoJy4vQnVpbGRHYW1lT2JqZWN0JyksXHJcbiAgICBCdWlsZEdhbWVPYmplY3RBbmltYXRpb246IHJlcXVpcmUoJy4vQnVpbGRHYW1lT2JqZWN0QW5pbWF0aW9uJyksXHJcbiAgICBHYW1lT2JqZWN0OiByZXF1aXJlKCcuL0dhbWVPYmplY3QnKSxcclxuICAgIEJpdG1hcFRleHQ6IHJlcXVpcmUoJy4vYml0bWFwdGV4dC9zdGF0aWMvQml0bWFwVGV4dCcpLFxyXG4gICAgQmxpdHRlcjogcmVxdWlyZSgnLi9ibGl0dGVyL0JsaXR0ZXInKSxcclxuICAgIENvbnRhaW5lcjogcmVxdWlyZSgnLi9jb250YWluZXIvQ29udGFpbmVyJyksXHJcbiAgICBET01FbGVtZW50OiByZXF1aXJlKCcuL2RvbWVsZW1lbnQvRE9NRWxlbWVudCcpLFxyXG4gICAgRHluYW1pY0JpdG1hcFRleHQ6IHJlcXVpcmUoJy4vYml0bWFwdGV4dC9keW5hbWljL0R5bmFtaWNCaXRtYXBUZXh0JyksXHJcbiAgICBFeHRlcm46IHJlcXVpcmUoJy4vZXh0ZXJuL0V4dGVybi5qcycpLFxyXG4gICAgR3JhcGhpY3M6IHJlcXVpcmUoJy4vZ3JhcGhpY3MvR3JhcGhpY3MuanMnKSxcclxuICAgIEdyb3VwOiByZXF1aXJlKCcuL2dyb3VwL0dyb3VwJyksXHJcbiAgICBJbWFnZTogcmVxdWlyZSgnLi9pbWFnZS9JbWFnZScpLFxyXG4gICAgUGFydGljbGVzOiByZXF1aXJlKCcuL3BhcnRpY2xlcycpLFxyXG4gICAgUGF0aEZvbGxvd2VyOiByZXF1aXJlKCcuL3BhdGhmb2xsb3dlci9QYXRoRm9sbG93ZXInKSxcclxuICAgIFJlbmRlclRleHR1cmU6IHJlcXVpcmUoJy4vcmVuZGVydGV4dHVyZS9SZW5kZXJUZXh0dXJlJyksXHJcbiAgICBSZXRyb0ZvbnQ6IHJlcXVpcmUoJy4vYml0bWFwdGV4dC9SZXRyb0ZvbnQnKSxcclxuICAgIFJvcGU6IHJlcXVpcmUoJy4vcm9wZS9Sb3BlJyksXHJcbiAgICBTcHJpdGU6IHJlcXVpcmUoJy4vc3ByaXRlL1Nwcml0ZScpLFxyXG4gICAgVGV4dDogcmVxdWlyZSgnLi90ZXh0L3N0YXRpYy9UZXh0JyksXHJcbiAgICBUaWxlU3ByaXRlOiByZXF1aXJlKCcuL3RpbGVzcHJpdGUvVGlsZVNwcml0ZScpLFxyXG4gICAgWm9uZTogcmVxdWlyZSgnLi96b25lL1pvbmUnKSxcclxuICAgIFZpZGVvOiByZXF1aXJlKCcuL3ZpZGVvL1ZpZGVvJyksXHJcblxyXG4gICAgLy8gIFNoYXBlc1xyXG5cclxuICAgIFNoYXBlOiByZXF1aXJlKCcuL3NoYXBlL1NoYXBlJyksXHJcbiAgICBBcmM6IHJlcXVpcmUoJy4vc2hhcGUvYXJjL0FyYycpLFxyXG4gICAgQ3VydmU6IHJlcXVpcmUoJy4vc2hhcGUvY3VydmUvQ3VydmUnKSxcclxuICAgIEVsbGlwc2U6IHJlcXVpcmUoJy4vc2hhcGUvZWxsaXBzZS9FbGxpcHNlJyksXHJcbiAgICBHcmlkOiByZXF1aXJlKCcuL3NoYXBlL2dyaWQvR3JpZCcpLFxyXG4gICAgSXNvQm94OiByZXF1aXJlKCcuL3NoYXBlL2lzb2JveC9Jc29Cb3gnKSxcclxuICAgIElzb1RyaWFuZ2xlOiByZXF1aXJlKCcuL3NoYXBlL2lzb3RyaWFuZ2xlL0lzb1RyaWFuZ2xlJyksXHJcbiAgICBMaW5lOiByZXF1aXJlKCcuL3NoYXBlL2xpbmUvTGluZScpLFxyXG4gICAgUG9seWdvbjogcmVxdWlyZSgnLi9zaGFwZS9wb2x5Z29uL1BvbHlnb24nKSxcclxuICAgIFJlY3RhbmdsZTogcmVxdWlyZSgnLi9zaGFwZS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyksXHJcbiAgICBTdGFyOiByZXF1aXJlKCcuL3NoYXBlL3N0YXIvU3RhcicpLFxyXG4gICAgVHJpYW5nbGU6IHJlcXVpcmUoJy4vc2hhcGUvdHJpYW5nbGUvVHJpYW5nbGUnKSxcclxuXHJcbiAgICAvLyAgR2FtZSBPYmplY3QgRmFjdG9yaWVzXHJcblxyXG4gICAgRmFjdG9yaWVzOiB7XHJcbiAgICAgICAgQmxpdHRlcjogcmVxdWlyZSgnLi9ibGl0dGVyL0JsaXR0ZXJGYWN0b3J5JyksXHJcbiAgICAgICAgQ29udGFpbmVyOiByZXF1aXJlKCcuL2NvbnRhaW5lci9Db250YWluZXJGYWN0b3J5JyksXHJcbiAgICAgICAgRE9NRWxlbWVudDogcmVxdWlyZSgnLi9kb21lbGVtZW50L0RPTUVsZW1lbnRGYWN0b3J5JyksXHJcbiAgICAgICAgRHluYW1pY0JpdG1hcFRleHQ6IHJlcXVpcmUoJy4vYml0bWFwdGV4dC9keW5hbWljL0R5bmFtaWNCaXRtYXBUZXh0RmFjdG9yeScpLFxyXG4gICAgICAgIEV4dGVybjogcmVxdWlyZSgnLi9leHRlcm4vRXh0ZXJuRmFjdG9yeScpLFxyXG4gICAgICAgIEdyYXBoaWNzOiByZXF1aXJlKCcuL2dyYXBoaWNzL0dyYXBoaWNzRmFjdG9yeScpLFxyXG4gICAgICAgIEdyb3VwOiByZXF1aXJlKCcuL2dyb3VwL0dyb3VwRmFjdG9yeScpLFxyXG4gICAgICAgIEltYWdlOiByZXF1aXJlKCcuL2ltYWdlL0ltYWdlRmFjdG9yeScpLFxyXG4gICAgICAgIFBhcnRpY2xlczogcmVxdWlyZSgnLi9wYXJ0aWNsZXMvUGFydGljbGVNYW5hZ2VyRmFjdG9yeScpLFxyXG4gICAgICAgIFBhdGhGb2xsb3dlcjogcmVxdWlyZSgnLi9wYXRoZm9sbG93ZXIvUGF0aEZvbGxvd2VyRmFjdG9yeScpLFxyXG4gICAgICAgIFJlbmRlclRleHR1cmU6IHJlcXVpcmUoJy4vcmVuZGVydGV4dHVyZS9SZW5kZXJUZXh0dXJlRmFjdG9yeScpLFxyXG4gICAgICAgIFJvcGU6IHJlcXVpcmUoJy4vcm9wZS9Sb3BlRmFjdG9yeScpLFxyXG4gICAgICAgIFNwcml0ZTogcmVxdWlyZSgnLi9zcHJpdGUvU3ByaXRlRmFjdG9yeScpLFxyXG4gICAgICAgIFN0YXRpY0JpdG1hcFRleHQ6IHJlcXVpcmUoJy4vYml0bWFwdGV4dC9zdGF0aWMvQml0bWFwVGV4dEZhY3RvcnknKSxcclxuICAgICAgICBUZXh0OiByZXF1aXJlKCcuL3RleHQvc3RhdGljL1RleHRGYWN0b3J5JyksXHJcbiAgICAgICAgVGlsZVNwcml0ZTogcmVxdWlyZSgnLi90aWxlc3ByaXRlL1RpbGVTcHJpdGVGYWN0b3J5JyksXHJcbiAgICAgICAgWm9uZTogcmVxdWlyZSgnLi96b25lL1pvbmVGYWN0b3J5JyksXHJcbiAgICAgICAgVmlkZW86IHJlcXVpcmUoJy4vdmlkZW8vVmlkZW9GYWN0b3J5JyksXHJcblxyXG4gICAgICAgIC8vICBTaGFwZXNcclxuICAgICAgICBBcmM6IHJlcXVpcmUoJy4vc2hhcGUvYXJjL0FyY0ZhY3RvcnknKSxcclxuICAgICAgICBDdXJ2ZTogcmVxdWlyZSgnLi9zaGFwZS9jdXJ2ZS9DdXJ2ZUZhY3RvcnknKSxcclxuICAgICAgICBFbGxpcHNlOiByZXF1aXJlKCcuL3NoYXBlL2VsbGlwc2UvRWxsaXBzZUZhY3RvcnknKSxcclxuICAgICAgICBHcmlkOiByZXF1aXJlKCcuL3NoYXBlL2dyaWQvR3JpZEZhY3RvcnknKSxcclxuICAgICAgICBJc29Cb3g6IHJlcXVpcmUoJy4vc2hhcGUvaXNvYm94L0lzb0JveEZhY3RvcnknKSxcclxuICAgICAgICBJc29UcmlhbmdsZTogcmVxdWlyZSgnLi9zaGFwZS9pc290cmlhbmdsZS9Jc29UcmlhbmdsZUZhY3RvcnknKSxcclxuICAgICAgICBMaW5lOiByZXF1aXJlKCcuL3NoYXBlL2xpbmUvTGluZUZhY3RvcnknKSxcclxuICAgICAgICBQb2x5Z29uOiByZXF1aXJlKCcuL3NoYXBlL3BvbHlnb24vUG9seWdvbkZhY3RvcnknKSxcclxuICAgICAgICBSZWN0YW5nbGU6IHJlcXVpcmUoJy4vc2hhcGUvcmVjdGFuZ2xlL1JlY3RhbmdsZUZhY3RvcnknKSxcclxuICAgICAgICBTdGFyOiByZXF1aXJlKCcuL3NoYXBlL3N0YXIvU3RhckZhY3RvcnknKSxcclxuICAgICAgICBUcmlhbmdsZTogcmVxdWlyZSgnLi9zaGFwZS90cmlhbmdsZS9UcmlhbmdsZUZhY3RvcnknKVxyXG4gICAgfSxcclxuXHJcbiAgICBDcmVhdG9yczoge1xyXG4gICAgICAgIEJsaXR0ZXI6IHJlcXVpcmUoJy4vYmxpdHRlci9CbGl0dGVyQ3JlYXRvcicpLFxyXG4gICAgICAgIENvbnRhaW5lcjogcmVxdWlyZSgnLi9jb250YWluZXIvQ29udGFpbmVyQ3JlYXRvcicpLFxyXG4gICAgICAgIER5bmFtaWNCaXRtYXBUZXh0OiByZXF1aXJlKCcuL2JpdG1hcHRleHQvZHluYW1pYy9EeW5hbWljQml0bWFwVGV4dENyZWF0b3InKSxcclxuICAgICAgICBHcmFwaGljczogcmVxdWlyZSgnLi9ncmFwaGljcy9HcmFwaGljc0NyZWF0b3InKSxcclxuICAgICAgICBHcm91cDogcmVxdWlyZSgnLi9ncm91cC9Hcm91cENyZWF0b3InKSxcclxuICAgICAgICBJbWFnZTogcmVxdWlyZSgnLi9pbWFnZS9JbWFnZUNyZWF0b3InKSxcclxuICAgICAgICBQYXJ0aWNsZXM6IHJlcXVpcmUoJy4vcGFydGljbGVzL1BhcnRpY2xlTWFuYWdlckNyZWF0b3InKSxcclxuICAgICAgICBSZW5kZXJUZXh0dXJlOiByZXF1aXJlKCcuL3JlbmRlcnRleHR1cmUvUmVuZGVyVGV4dHVyZUNyZWF0b3InKSxcclxuICAgICAgICBSb3BlOiByZXF1aXJlKCcuL3JvcGUvUm9wZUNyZWF0b3InKSxcclxuICAgICAgICBTcHJpdGU6IHJlcXVpcmUoJy4vc3ByaXRlL1Nwcml0ZUNyZWF0b3InKSxcclxuICAgICAgICBTdGF0aWNCaXRtYXBUZXh0OiByZXF1aXJlKCcuL2JpdG1hcHRleHQvc3RhdGljL0JpdG1hcFRleHRDcmVhdG9yJyksXHJcbiAgICAgICAgVGV4dDogcmVxdWlyZSgnLi90ZXh0L3N0YXRpYy9UZXh0Q3JlYXRvcicpLFxyXG4gICAgICAgIFRpbGVTcHJpdGU6IHJlcXVpcmUoJy4vdGlsZXNwcml0ZS9UaWxlU3ByaXRlQ3JlYXRvcicpLFxyXG4gICAgICAgIFpvbmU6IHJlcXVpcmUoJy4vem9uZS9ab25lQ3JlYXRvcicpLFxyXG4gICAgICAgIFZpZGVvOiByZXF1aXJlKCcuL3ZpZGVvL1ZpZGVvQ3JlYXRvcicpXHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgLy8gIFdlYkdMIG9ubHkgR2FtZSBPYmplY3RzXHJcbiAgICBHYW1lT2JqZWN0cy5NZXNoID0gcmVxdWlyZSgnLi9tZXNoL01lc2gnKTtcclxuICAgIEdhbWVPYmplY3RzLlF1YWQgPSByZXF1aXJlKCcuL3F1YWQvUXVhZCcpO1xyXG4gICAgR2FtZU9iamVjdHMuU2hhZGVyID0gcmVxdWlyZSgnLi9zaGFkZXIvU2hhZGVyJyk7XHJcblxyXG4gICAgR2FtZU9iamVjdHMuRmFjdG9yaWVzLk1lc2ggPSByZXF1aXJlKCcuL21lc2gvTWVzaEZhY3RvcnknKTtcclxuICAgIEdhbWVPYmplY3RzLkZhY3Rvcmllcy5RdWFkID0gcmVxdWlyZSgnLi9xdWFkL1F1YWRGYWN0b3J5Jyk7XHJcbiAgICBHYW1lT2JqZWN0cy5GYWN0b3JpZXMuU2hhZGVyID0gcmVxdWlyZSgnLi9zaGFkZXIvU2hhZGVyRmFjdG9yeScpO1xyXG5cclxuICAgIEdhbWVPYmplY3RzLkNyZWF0b3JzLk1lc2ggPSByZXF1aXJlKCcuL21lc2gvTWVzaENyZWF0b3InKTtcclxuICAgIEdhbWVPYmplY3RzLkNyZWF0b3JzLlF1YWQgPSByZXF1aXJlKCcuL3F1YWQvUXVhZENyZWF0b3InKTtcclxuICAgIEdhbWVPYmplY3RzLkNyZWF0b3JzLlNoYWRlciA9IHJlcXVpcmUoJy4vc2hhZGVyL1NoYWRlckNyZWF0b3InKTtcclxuXHJcbiAgICBHYW1lT2JqZWN0cy5MaWdodCA9IHJlcXVpcmUoJy4vbGlnaHRzL0xpZ2h0Jyk7XHJcblxyXG4gICAgcmVxdWlyZSgnLi9saWdodHMvTGlnaHRzTWFuYWdlcicpO1xyXG4gICAgcmVxdWlyZSgnLi9saWdodHMvTGlnaHRzUGx1Z2luJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2FtZU9iamVjdHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgMkQgcG9pbnQgbGlnaHQuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBhIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlcn0sIGF2YWlsYWJsZSBmcm9tIHdpdGhpbiBhIHNjZW5lIHZpYSBgdGhpcy5saWdodHNgLlxyXG4gKlxyXG4gKiBBbnkgR2FtZSBPYmplY3RzIHVzaW5nIHRoZSBMaWdodDJEIHBpcGVsaW5lIHdpbGwgdGhlbiBiZSBhZmZlY3RlZCBieSB0aGVzZSBMaWdodHMuXHJcbiAqXHJcbiAqIFRoZXkgY2FuIGFsc28gc2ltcGx5IGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnQgbGlnaHQgZm9yIHlvdXIgb3duIHB1cnBvc2VzLlxyXG4gKlxyXG4gKiBAY2xhc3MgTGlnaHRcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGxpZ2h0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgbGlnaHQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBsaWdodC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHIgLSBUaGUgcmVkIGNvbG9yIG9mIHRoZSBsaWdodC4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gVGhlIGdyZWVuIGNvbG9yIG9mIHRoZSBsaWdodC4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIGJsdWUgY29sb3Igb2YgdGhlIGxpZ2h0LiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVuc2l0eSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGxpZ2h0LlxyXG4gKi9cclxudmFyIExpZ2h0ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIExpZ2h0ICh4LCB5LCByYWRpdXMsIHIsIGcsIGIsIGludGVuc2l0eSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgbGlnaHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHQjeFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBsaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcmFkaXVzIG9mIHRoZSBsaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNyYWRpdXNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcmVkIGNvbG9yIG9mIHRoZSBsaWdodC4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHQjclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yID0gcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdyZWVuIGNvbG9yIG9mIHRoZSBsaWdodC4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHQjZ1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nID0gZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJsdWUgY29sb3Igb2YgdGhlIGxpZ2h0LiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNiXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmIgPSBiO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNpbnRlbnNpdHlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgZmFjdG9yIG9mIHRoZSBsaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzY3JvbGxGYWN0b3JYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAxLjA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgZmFjdG9yIG9mIHRoZSBsaWdodC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzY3JvbGxGYWN0b3JZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSAxLjA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBTZXRzIGJvdGggaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2Nyb2xsIGZhY3RvciB0byAxLiBVc2Uge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzZXRTY3JvbGxGYWN0b3J9IHRvIHNldFxyXG4gICAgICogdGhlIHNjcm9sbCBmYWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHQjc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBsaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBsaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBsaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByIC0gVGhlIHJlZCBjb2xvci4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZyAtIFRoZSBncmVlbiBjb2xvci4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIGNvbG9yLiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbnNpdHkgLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExpZ2h0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0OiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCByLCBnLCBiLCBpbnRlbnNpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcbiAgICAgICAgdGhpcy5yID0gcjtcclxuICAgICAgICB0aGlzLmcgPSBnO1xyXG4gICAgICAgIHRoaXMuYiA9IGI7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5O1xyXG5cclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclggPSAxO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsRmFjdG9yWSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2Nyb2xsIGZhY3RvciBvZiB0aGUgbGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHQjc2V0U2Nyb2xsRmFjdG9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHNjcm9sbCBmYWN0b3Igb2YgdGhlIGxpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgc2Nyb2xsIGZhY3RvciBvZiB0aGUgbGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMaWdodCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNjcm9sbEZhY3RvcjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMTsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxGYWN0b3JYID0geDtcclxuICAgICAgICB0aGlzLnNjcm9sbEZhY3RvclkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNvbG9yIG9mIHRoZSBsaWdodCBmcm9tIGEgc2luZ2xlIGludGVnZXIgUkdCIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0I3NldENvbG9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmdiIC0gVGhlIGludGVnZXIgUkdCIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExpZ2h0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sb3I6IGZ1bmN0aW9uIChyZ2IpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbG9yID0gVXRpbHMuZ2V0RmxvYXRzRnJvbVVpbnRSR0IocmdiKTtcclxuXHJcbiAgICAgICAgdGhpcy5yID0gY29sb3JbMF07XHJcbiAgICAgICAgdGhpcy5nID0gY29sb3JbMV07XHJcbiAgICAgICAgdGhpcy5iID0gY29sb3JbMl07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzZXRJbnRlbnNpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbnNpdHkgLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExpZ2h0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SW50ZW5zaXR5OiBmdW5jdGlvbiAoaW50ZW5zaXR5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgbGlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgbGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMaWdodCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSB4O1xyXG4gICAgICAgIHRoaXMueSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcmFkaXVzIG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodCNzZXRSYWRpdXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBsaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExpZ2h0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UmFkaXVzOiBmdW5jdGlvbiAocmFkaXVzKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaWdodDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgTGlnaHQgPSByZXF1aXJlKCcuL0xpZ2h0Jyk7XHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogQGNhbGxiYWNrIExpZ2h0Rm9yRWFjaFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5MaWdodH0gbGlnaHQgLSBUaGUgTGlnaHQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogTWFuYWdlcyBMaWdodHMgZm9yIGEgU2NlbmUuXHJcbiAqXHJcbiAqIEFmZmVjdHMgdGhlIHJlbmRlcmluZyBvZiBHYW1lIE9iamVjdHMgdXNpbmcgdGhlIGBMaWdodDJEYCBwaXBlbGluZS5cclxuICpcclxuICogQGNsYXNzIExpZ2h0c01hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgTGlnaHRzTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBMaWdodHNNYW5hZ2VyICgpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBvb2wgb2YgTGlnaHRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVXNlZCB0byByZWN5Y2xlIHJlbW92ZWQgTGlnaHRzIGZvciBhIG1vcmUgZWZmaWNpZW50IHVzZSBvZiBtZW1vcnkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNsaWdodFBvb2xcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0W119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpZ2h0UG9vbCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgTGlnaHRzIGluIHRoZSBTY2VuZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNNYW5hZ2VyI2xpZ2h0c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRbXX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGlnaHRzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExpZ2h0cyB0aGF0IGhhdmUgYmVlbiBjdWxsZWQgZnJvbSBhIENhbWVyYSdzIHZpZXdwb3J0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogTGlnaHRzIGluIHRoaXMgbGlzdCB3aWxsIG5vdCBiZSByZW5kZXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNNYW5hZ2VyI2N1bGxlZExpZ2h0c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRbXX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VsbGVkTGlnaHRzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbWJpZW50IGNvbG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXIjYW1iaWVudENvbG9yXHJcbiAgICAgICAgICogQHR5cGUge3sgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciB9fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW1iaWVudENvbG9yID0geyByOiAwLjEsIGc6IDAuMSwgYjogMC4xIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIExpZ2h0cyBNYW5hZ2VyIGlzIGVuYWJsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNhY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaWdodHMgdGhhdCBhIHNpbmdsZSBDYW1lcmEgYW5kIHRoZSBsaWdodHMgc2hhZGVyIGNhbiBwcm9jZXNzLlxyXG4gICAgICAgICAqIENoYW5nZSB0aGlzIHZpYSB0aGUgYG1heExpZ2h0c2AgcHJvcGVydHkgaW4geW91ciBnYW1lIGNvbmZpZywgYXMgaXQgY2Fubm90IGJlIGNoYW5nZWQgYXQgcnVudGltZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNNYW5hZ2VyI21heExpZ2h0c1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE1LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heExpZ2h0cyA9IC0xO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSB0aGUgTGlnaHRzIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNlbmFibGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNNYW5hZ2VyfSBUaGlzIExpZ2h0cyBNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLm1heExpZ2h0cyA9PT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1heExpZ2h0cyA9IHRoaXMuc2NlbmUuc3lzLmdhbWUucmVuZGVyZXIuY29uZmlnLm1heExpZ2h0cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzYWJsZSB0aGUgTGlnaHRzIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNkaXNhYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlcn0gVGhpcyBMaWdodHMgTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3VsbCBhbnkgTGlnaHRzIHRoYXQgYXJlbid0IHZpc2libGUgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBDdWxsaW5nIExpZ2h0cyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBieSBlbnN1cmluZyB0aGF0IG9ubHkgTGlnaHRzIHdpdGhpbiBhIENhbWVyYSdzIHZpZXdwb3J0IGFyZSByZW5kZXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNNYW5hZ2VyI2N1bGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdG8gY3VsbCBMaWdodHMgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5MaWdodFtdfSBUaGUgY3VsbGVkIExpZ2h0cy5cclxuICAgICAqL1xyXG4gICAgY3VsbDogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbGlnaHRzID0gdGhpcy5saWdodHM7XHJcbiAgICAgICAgdmFyIGN1bGxlZExpZ2h0cyA9IHRoaXMuY3VsbGVkTGlnaHRzO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBsaWdodHMubGVuZ3RoO1xyXG4gICAgICAgIHZhciBjYW1lcmFDZW50ZXJYID0gY2FtZXJhLnggKyBjYW1lcmEud2lkdGggLyAyLjA7XHJcbiAgICAgICAgdmFyIGNhbWVyYUNlbnRlclkgPSBjYW1lcmEueSArIGNhbWVyYS5oZWlnaHQgLyAyLjA7XHJcbiAgICAgICAgdmFyIGNhbWVyYVJhZGl1cyA9IChjYW1lcmEud2lkdGggKyBjYW1lcmEuaGVpZ2h0KSAvIDIuMDtcclxuICAgICAgICB2YXIgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcclxuICAgICAgICB2YXIgY2FtZXJhTWF0cml4ID0gY2FtZXJhLm1hdHJpeDtcclxuICAgICAgICB2YXIgdmlld3BvcnRIZWlnaHQgPSB0aGlzLnN5c3RlbXMuZ2FtZS5jb25maWcuaGVpZ2h0O1xyXG5cclxuICAgICAgICBjdWxsZWRMaWdodHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aCAmJiBjdWxsZWRMaWdodHMubGVuZ3RoIDwgdGhpcy5tYXhMaWdodHM7IGluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbGlnaHQgPSBsaWdodHNbaW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgY2FtZXJhTWF0cml4LnRyYW5zZm9ybVBvaW50KGxpZ2h0LngsIGxpZ2h0LnksIHBvaW50KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBXZSdsbCBqdXN0IHVzZSBib3VuZGluZyBzcGhlcmVzIHRvIHRlc3QgaWYgbGlnaHRzIHNob3VsZCBiZSByZW5kZXJlZFxyXG4gICAgICAgICAgICB2YXIgZHggPSBjYW1lcmFDZW50ZXJYIC0gKHBvaW50LnggLSAoY2FtZXJhLnNjcm9sbFggKiBsaWdodC5zY3JvbGxGYWN0b3JYICogY2FtZXJhLnpvb20pKTtcclxuICAgICAgICAgICAgdmFyIGR5ID0gY2FtZXJhQ2VudGVyWSAtICh2aWV3cG9ydEhlaWdodCAtIChwb2ludC55IC0gKGNhbWVyYS5zY3JvbGxZICogbGlnaHQuc2Nyb2xsRmFjdG9yWSkgKiBjYW1lcmEuem9vbSkpO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbGlnaHQucmFkaXVzICsgY2FtZXJhUmFkaXVzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdWxsZWRMaWdodHMucHVzaChsaWdodHNbaW5kZXhdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1bGxlZExpZ2h0cztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVyYXRlIG92ZXIgZWFjaCBMaWdodCB3aXRoIGEgY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNmb3JFYWNoTGlnaHRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TGlnaHRGb3JFYWNofSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggTGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXJ9IFRoaXMgTGlnaHRzIE1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoTGlnaHQ6IGZ1bmN0aW9uIChjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxpZ2h0cyA9IHRoaXMubGlnaHRzO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBsaWdodHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyArK2luZGV4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobGlnaHRzW2luZGV4XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGFtYmllbnQgbGlnaHQgY29sb3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNzZXRBbWJpZW50Q29sb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZ2IgLSBUaGUgaW50ZWdlciBSR0IgY29sb3Igb2YgdGhlIGFtYmllbnQgbGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXJ9IFRoaXMgTGlnaHRzIE1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbWJpZW50Q29sb3I6IGZ1bmN0aW9uIChyZ2IpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbG9yID0gVXRpbHMuZ2V0RmxvYXRzRnJvbVVpbnRSR0IocmdiKTtcclxuXHJcbiAgICAgICAgdGhpcy5hbWJpZW50Q29sb3IuciA9IGNvbG9yWzBdO1xyXG4gICAgICAgIHRoaXMuYW1iaWVudENvbG9yLmcgPSBjb2xvclsxXTtcclxuICAgICAgICB0aGlzLmFtYmllbnRDb2xvci5iID0gY29sb3JbMl07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIExpZ2h0cyBhbGxvd2VkIHRvIGFwcGVhciBhdCBvbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXIjZ2V0TWF4VmlzaWJsZUxpZ2h0c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIG1heGltdW0gbnVtYmVyIG9mIExpZ2h0cyBhbGxvd2VkIHRvIGFwcGVhciBhdCBvbmNlLlxyXG4gICAgICovXHJcbiAgICBnZXRNYXhWaXNpYmxlTGlnaHRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBMaWdodHMgbWFuYWdlZCBieSB0aGlzIExpZ2h0cyBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXIjZ2V0TGlnaHRDb3VudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIG51bWJlciBvZiBMaWdodHMgbWFuYWdlZCBieSB0aGlzIExpZ2h0cyBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBnZXRMaWdodENvdW50OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0cy5sZW5ndGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgTGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNhZGRMaWdodFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIExpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBMaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTEwMF0gLSBUaGUgcmFkaXVzIG9mIHRoZSBMaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmdiPTB4ZmZmZmZmXSAtIFRoZSBpbnRlZ2VyIFJHQiBjb2xvciBvZiB0aGUgbGlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIExpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5MaWdodH0gVGhlIExpZ2h0IHRoYXQgd2FzIGFkZGVkLlxyXG4gICAgICovXHJcbiAgICBhZGRMaWdodDogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgcmdiLCBpbnRlbnNpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbG9yID0gbnVsbDtcclxuICAgICAgICB2YXIgbGlnaHQgPSBudWxsO1xyXG5cclxuICAgICAgICB4ID0gKHggPT09IHVuZGVmaW5lZCkgPyAwLjAgOiB4O1xyXG4gICAgICAgIHkgPSAoeSA9PT0gdW5kZWZpbmVkKSA/IDAuMCA6IHk7XHJcbiAgICAgICAgcmdiID0gKHJnYiA9PT0gdW5kZWZpbmVkKSA/IDB4ZmZmZmZmIDogcmdiO1xyXG4gICAgICAgIHJhZGl1cyA9IChyYWRpdXMgPT09IHVuZGVmaW5lZCkgPyAxMDAuMCA6IHJhZGl1cztcclxuICAgICAgICBpbnRlbnNpdHkgPSAoaW50ZW5zaXR5ID09PSB1bmRlZmluZWQpID8gMS4wIDogaW50ZW5zaXR5O1xyXG5cclxuICAgICAgICBjb2xvciA9IFV0aWxzLmdldEZsb2F0c0Zyb21VaW50UkdCKHJnYik7XHJcbiAgICAgICAgbGlnaHQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5saWdodFBvb2wubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpZ2h0ID0gdGhpcy5saWdodFBvb2wucG9wKCk7XHJcbiAgICAgICAgICAgIGxpZ2h0LnNldCh4LCB5LCByYWRpdXMsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0sIGludGVuc2l0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpZ2h0ID0gbmV3IExpZ2h0KHgsIHksIHJhZGl1cywgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgaW50ZW5zaXR5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGlnaHRzLnB1c2gobGlnaHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlnaHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGEgTGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNyZW1vdmVMaWdodFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHR9IGxpZ2h0IC0gVGhlIExpZ2h0IHRvIHJlbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlcn0gVGhpcyBMaWdodHMgTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUxpZ2h0OiBmdW5jdGlvbiAobGlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5saWdodHMuaW5kZXhPZihsaWdodCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saWdodFBvb2wucHVzaChsaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMubGlnaHRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHV0IGRvd24gdGhlIExpZ2h0cyBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIFJlY3ljbGVzIGFsbCBhY3RpdmUgTGlnaHRzIGludG8gdGhlIExpZ2h0IHBvb2wsIHJlc2V0cyBhbWJpZW50IGxpZ2h0IGNvbG9yIGFuZCBjbGVhcnMgdGhlIGxpc3RzIG9mIExpZ2h0cyBhbmRcclxuICAgICAqIGN1bGxlZCBMaWdodHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNzaHV0ZG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmxpZ2h0cy5sZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saWdodFBvb2wucHVzaCh0aGlzLmxpZ2h0cy5wb3AoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFtYmllbnRDb2xvciA9IHsgcjogMC4xLCBnOiAwLjEsIGI6IDAuMSB9O1xyXG4gICAgICAgIHRoaXMuY3VsbGVkTGlnaHRzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5saWdodHMubGVuZ3RoID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoZSBMaWdodHMgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBDbGVhbnMgdXAgYWxsIHJlZmVyZW5jZXMgYnkgY2FsbGluZyB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXIjc2h1dGRvd259LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpZ2h0c01hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIExpZ2h0c01hbmFnZXIgPSByZXF1aXJlKCcuL0xpZ2h0c01hbmFnZXInKTtcclxudmFyIFBsdWdpbkNhY2hlID0gcmVxdWlyZSgnLi4vLi4vcGx1Z2lucy9QbHVnaW5DYWNoZScpO1xyXG52YXIgU2NlbmVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9zY2VuZS9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgU2NlbmUgcGx1Z2luIHRoYXQgcHJvdmlkZXMgYSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXJ9IGZvciB0aGUgTGlnaHQyRCBwaXBlbGluZS5cclxuICpcclxuICogQXZhaWxhYmxlIGZyb20gd2l0aGluIGEgU2NlbmUgdmlhIGB0aGlzLmxpZ2h0c2AuXHJcbiAqXHJcbiAqIEFkZCBMaWdodHMgdXNpbmcgdGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlciNhZGRMaWdodH0gbWV0aG9kOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIC8vIEVuYWJsZSB0aGUgTGlnaHRzIE1hbmFnZXIgYmVjYXVzZSBpdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0XHJcbiAqIHRoaXMubGlnaHRzLmVuYWJsZSgpO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgYSBMaWdodCBhdCBbNDAwLCAzMDBdIHdpdGggYSByYWRpdXMgb2YgMjAwXHJcbiAqIHRoaXMubGlnaHRzLmFkZExpZ2h0KDQwMCwgMzAwLCAyMDApO1xyXG4gKiBgYGBcclxuICpcclxuICogRm9yIEdhbWUgT2JqZWN0cyB0byBiZSBhZmZlY3RlZCBieSB0aGUgTGlnaHRzIHdoZW4gcmVuZGVyZWQsIHlvdSB3aWxsIG5lZWQgdG8gc2V0IHRoZW0gdG8gdXNlIHRoZSBgTGlnaHQyRGAgcGlwZWxpbmUgbGlrZSBzbzpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBzcHJpdGUuc2V0UGlwZWxpbmUoJ0xpZ2h0MkQnKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBjbGFzcyBMaWdodHNQbHVnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c01hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IHRoaXMgTGlnaHRzIFBsdWdpbiBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIExpZ2h0c1BsdWdpbiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogTGlnaHRzTWFuYWdlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIExpZ2h0c1BsdWdpbiAoc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgdGhpcyBMaWdodHMgUGx1Z2luIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzUGx1Z2luI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSdzIHN5c3RlbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzUGx1Z2luI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgaWYgKCFzY2VuZS5zeXMuc2V0dGluZ3MuaXNCb290ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExpZ2h0c01hbmFnZXIuY2FsbCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb290IHRoZSBMaWdodHMgUGx1Z2luLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkxpZ2h0c1BsdWdpbiNib290XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoZSBMaWdodHMgUGx1Z2luLlxyXG4gICAgICpcclxuICAgICAqIENsZWFucyB1cCBhbGwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaWdodHNQbHVnaW4jZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuUGx1Z2luQ2FjaGUucmVnaXN0ZXIoJ0xpZ2h0c1BsdWdpbicsIExpZ2h0c1BsdWdpbiwgJ2xpZ2h0cycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaWdodHNQbHVnaW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgTWVzaFJlbmRlciA9IHJlcXVpcmUoJy4vTWVzaFJlbmRlcicpO1xyXG52YXIgTk9PUCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgTWVzaCBHYW1lIE9iamVjdC5cclxuICpcclxuICogQGNsYXNzIE1lc2hcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHdlYmdsT25seVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJbXX0gdmVydGljZXMgLSBBbiBhcnJheSBjb250YWluaW5nIHRoZSB2ZXJ0aWNlcyBkYXRhIGZvciB0aGlzIE1lc2guXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHV2IC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdXYgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gKiBAcGFyYW0ge251bWJlcltdfSBjb2xvcnMgLSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2xvciBkYXRhIGZvciB0aGlzIE1lc2guXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IGFscGhhcyAtIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGFscGhhIGRhdGEgZm9yIHRoaXMgTWVzaC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqL1xyXG52YXIgTWVzaCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkJsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlRleHR1cmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIE1lc2hSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBNZXNoIChzY2VuZSwgeCwgeSwgdmVydGljZXMsIHV2LCBjb2xvcnMsIGFscGhhcywgdGV4dHVyZSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnTWVzaCcpO1xyXG5cclxuICAgICAgICBpZiAodmVydGljZXMubGVuZ3RoICE9PSB1di5sZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc2ggVmVydGV4IGNvdW50IG11c3QgbWF0Y2ggVVYgY291bnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB2ZXJ0aWNlc1VCID0gKHZlcnRpY2VzLmxlbmd0aCAvIDIpIHwgMDtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPiAwICYmIGNvbG9ycy5sZW5ndGggPCB2ZXJ0aWNlc1VCKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNoIENvbG9yIGNvdW50IG11c3QgbWF0Y2ggVmVydGV4IGNvdW50Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWxwaGFzLmxlbmd0aCA+IDAgJiYgYWxwaGFzLmxlbmd0aCA8IHZlcnRpY2VzVUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc2ggQWxwaGEgY291bnQgbXVzdCBtYXRjaCBWZXJ0ZXggY291bnQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG5cclxuICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJ0aWNlc1VCOyArK2kpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yc1tpXSA9IDB4RkZGRkZGO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWxwaGFzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJ0aWNlc1VCOyArK2kpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFscGhhc1tpXSA9IDEuMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmVydGljZXMgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLk1lc2gjdmVydGljZXNcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdXYgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLk1lc2gjdXZcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudXYgPSBuZXcgRmxvYXQzMkFycmF5KHV2KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLk1lc2gjY29sb3JzXHJcbiAgICAgICAgICogQHR5cGUge1VpbnQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sb3JzID0gbmV3IFVpbnQzMkFycmF5KGNvbG9ycyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGFscGhhIGRhdGEgZm9yIHRoaXMgTWVzaC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5NZXNoI2FscGhhc1xyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbHBoYXMgPSBuZXcgRmxvYXQzMkFycmF5KGFscGhhcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZpbGwgb3IgYWRkaXRpdmUgbW9kZSB1c2VkIHdoZW4gYmxlbmRpbmcgdGhlIGNvbG9yIHZhbHVlcz9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuTWVzaCN0aW50RmlsbFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGludEZpbGwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKHRleHR1cmUsIGZyYW1lKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZVRvRnJhbWUoKTtcclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxlZnQgaW50ZW50aW9uYWxseSBlbXB0eSBhbmQgZG9lcyBub3QgZG8gYW55dGhpbmcuXHJcbiAgICAgKiBJdCBpcyByZXRhaW5lZCB0byBhbGxvdyBhIE1lc2ggb3IgUXVhZCB0byBiZSBhZGRlZCB0byBhIENvbnRhaW5lci5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTWVzaCNzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICBzZXRBbHBoYTogTk9PUFxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lc2g7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgYSBzdHViIGZ1bmN0aW9uIGZvciBNZXNoLlJlbmRlci4gVGhlcmUgaXMgbm8gQ2FudmFzIHJlbmRlcmVyIGZvciBNZXNoIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLk1lc2gjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuTWVzaH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIE1lc2hDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uICgpXHJcbntcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWVzaENhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIE1lc2ggPSByZXF1aXJlKCcuL01lc2gnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IE1lc2ggR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIE1lc2ggR2FtZSBPYmplY3QgYW5kIFdlYkdMIHN1cHBvcnQgaGF2ZSBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNtZXNoXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5NZXNofSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdtZXNoJywgZnVuY3Rpb24gKGNvbmZpZywgYWRkVG9TY2VuZSlcclxue1xyXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgdmFyIGtleSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAna2V5JywgbnVsbCk7XHJcbiAgICB2YXIgZnJhbWUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgbnVsbCk7XHJcbiAgICB2YXIgdmVydGljZXMgPSBHZXRWYWx1ZShjb25maWcsICd2ZXJ0aWNlcycsIFtdKTtcclxuICAgIHZhciBjb2xvcnMgPSBHZXRWYWx1ZShjb25maWcsICdjb2xvcnMnLCBbXSk7XHJcbiAgICB2YXIgYWxwaGFzID0gR2V0VmFsdWUoY29uZmlnLCAnYWxwaGFzJywgW10pO1xyXG4gICAgdmFyIHV2ID0gR2V0VmFsdWUoY29uZmlnLCAndXYnLCBbXSk7XHJcblxyXG4gICAgdmFyIG1lc2ggPSBuZXcgTWVzaCh0aGlzLnNjZW5lLCAwLCAwLCB2ZXJ0aWNlcywgdXYsIGNvbG9ycywgYWxwaGFzLCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdCh0aGlzLnNjZW5lLCBtZXNoLCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiBtZXNoO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBNZXNoID0gcmVxdWlyZSgnLi9NZXNoJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBNZXNoIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgTWVzaCBHYW1lIE9iamVjdCBhbmQgV2ViR0wgc3VwcG9ydCBoYXZlIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I21lc2hcclxuICogQHdlYmdsT25seVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHZlcnRpY2VzIC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmVydGljZXMgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gKiBAcGFyYW0ge251bWJlcltdfSB1diAtIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHV2IGRhdGEgZm9yIHRoaXMgTWVzaC5cclxuICogQHBhcmFtIHtudW1iZXJbXX0gY29sb3JzIC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgZGF0YSBmb3IgdGhpcyBNZXNoLlxyXG4gKiBAcGFyYW0ge251bWJlcltdfSBhbHBoYXMgLSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBhbHBoYSBkYXRhIGZvciB0aGlzIE1lc2guXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuTWVzaH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICBHYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignbWVzaCcsIGZ1bmN0aW9uICh4LCB5LCB2ZXJ0aWNlcywgdXYsIGNvbG9ycywgYWxwaGFzLCB0ZXh0dXJlLCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IE1lc2godGhpcy5zY2VuZSwgeCwgeSwgdmVydGljZXMsIHV2LCBjb2xvcnMsIGFscGhhcywgdGV4dHVyZSwgZnJhbWUpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9NZXNoV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9NZXNoQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5NZXNoI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuTWVzaH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIE1lc2hXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSwgc3JjKTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNwcml0ZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNyYy55O1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGZyYW1lID0gc3JjLmZyYW1lO1xyXG4gICAgdmFyIHRleHR1cmUgPSBmcmFtZS5nbFRleHR1cmU7XHJcblxyXG4gICAgdmFyIHZlcnRpY2VzID0gc3JjLnZlcnRpY2VzO1xyXG4gICAgdmFyIHV2cyA9IHNyYy51djtcclxuICAgIHZhciBjb2xvcnMgPSBzcmMuY29sb3JzO1xyXG4gICAgdmFyIGFscGhhcyA9IHNyYy5hbHBoYXM7XHJcblxyXG4gICAgdmFyIG1lc2hWZXJ0aWNlc0xlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDtcclxuICAgIHZhciB2ZXJ0ZXhDb3VudCA9IE1hdGguZmxvb3IobWVzaFZlcnRpY2VzTGVuZ3RoICogMC41KTtcclxuXHJcbiAgICBpZiAocGlwZWxpbmUudmVydGV4Q291bnQgKyB2ZXJ0ZXhDb3VudCA+IHBpcGVsaW5lLnZlcnRleENhcGFjaXR5KVxyXG4gICAge1xyXG4gICAgICAgIHBpcGVsaW5lLmZsdXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgIHZhciB2ZXJ0ZXhWaWV3RjMyID0gcGlwZWxpbmUudmVydGV4Vmlld0YzMjtcclxuICAgIHZhciB2ZXJ0ZXhWaWV3VTMyID0gcGlwZWxpbmUudmVydGV4Vmlld1UzMjtcclxuXHJcbiAgICB2YXIgdmVydGV4T2Zmc2V0ID0gKHBpcGVsaW5lLnZlcnRleENvdW50ICogcGlwZWxpbmUudmVydGV4Q29tcG9uZW50Q291bnQpIC0gMTtcclxuXHJcbiAgICB2YXIgY29sb3JJbmRleCA9IDA7XHJcbiAgICB2YXIgdGludEVmZmVjdCA9IHNyYy50aW50RmlsbDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lc2hWZXJ0aWNlc0xlbmd0aDsgaSArPSAyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdmVydGljZXNbaSArIDBdO1xyXG4gICAgICAgIHZhciB5ID0gdmVydGljZXNbaSArIDFdO1xyXG5cclxuICAgICAgICB2YXIgdHggPSB4ICogY2FsY01hdHJpeC5hICsgeSAqIGNhbGNNYXRyaXguYyArIGNhbGNNYXRyaXguZTtcclxuICAgICAgICB2YXIgdHkgPSB4ICogY2FsY01hdHJpeC5iICsgeSAqIGNhbGNNYXRyaXguZCArIGNhbGNNYXRyaXguZjtcclxuXHJcbiAgICAgICAgaWYgKGNhbWVyYS5yb3VuZFBpeGVscylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR4ID0gTWF0aC5yb3VuZCh0eCk7XHJcbiAgICAgICAgICAgIHR5ID0gTWF0aC5yb3VuZCh0eSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHR4O1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdHk7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB1dnNbaSArIDBdO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdXZzW2kgKyAxXTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRFZmZlY3Q7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZlcnRleE9mZnNldF0gPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShjb2xvcnNbY29sb3JJbmRleF0sIGNhbWVyYS5hbHBoYSAqIGFscGhhc1tjb2xvckluZGV4XSk7XHJcblxyXG4gICAgICAgIGNvbG9ySW5kZXgrKztcclxuICAgIH1cclxuXHJcbiAgICBwaXBlbGluZS52ZXJ0ZXhDb3VudCArPSB2ZXJ0ZXhDb3VudDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWVzaFdlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZsb2F0QmV0d2VlbiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRmxvYXRCZXR3ZWVuJyk7XHJcbnZhciBHZXRFYXNlRnVuY3Rpb24gPSByZXF1aXJlKCcuLi8uLi90d2VlbnMvYnVpbGRlcnMvR2V0RWFzZUZ1bmN0aW9uJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBXcmFwID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9XcmFwJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFBhcnRpY2xlIEVtaXR0ZXIgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEZhY2lsaXRhdGVzIGNoYW5naW5nIFBhcnRpY2xlIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgZW1pdHRlZCBhbmQgdGhyb3VnaG91dCB0aGVpciBsaWZldGltZS5cclxuICpcclxuICogQGNsYXNzIEVtaXR0ZXJPcFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWd9IGNvbmZpZyAtIFNldHRpbmdzIGZvciB0aGUgUGFydGljbGUgRW1pdHRlciB0aGF0IG93bnMgdGhpcyBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWx1ZSAtIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtib29sZWFufSBbZW1pdE9ubHk9ZmFsc2VdIC0gV2hldGhlciB0aGUgcHJvcGVydHkgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBhIFBhcnRpY2xlIGlzIGVtaXR0ZWQuXHJcbiAqL1xyXG52YXIgRW1pdHRlck9wID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEVtaXR0ZXJPcCAoY29uZmlnLCBrZXksIGRlZmF1bHRWYWx1ZSwgZW1pdE9ubHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGVtaXRPbmx5ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbWl0T25seSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3Byb3BlcnR5S2V5XHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByb3BlcnR5S2V5ID0ga2V5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3Byb3BlcnR5VmFsdWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2RlZmF1bHRWYWx1ZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2Ygc3RlcHMgZm9yIHN0ZXBwZWQgZWFzaW5nIGJldHdlZW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3N0YXJ0fSBhbmRcclxuICAgICAgICAgKiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZW5kfSB2YWx1ZXMsIHBlciBlbWl0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajc3RlcHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0ZXBzID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0ZXAgY291bnRlciBmb3Igc3RlcHBlZCBlYXNpbmcsIHBlciBlbWl0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjY291bnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdGFydCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSB0byBlYXNlIGJldHdlZW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNzdGFydFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZW5kIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IHRvIGVhc2UgYmV0d2Vlbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2VuZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW5kID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGVhc2luZyBmdW5jdGlvbiB0byB1c2UgZm9yIHVwZGF0aW5nIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNlYXNlXHJcbiAgICAgICAgICogQHR5cGUgez9mdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVhc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIGEgUGFydGljbGUgaXMgZW1pdHRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgb25seSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajb25FbWl0fSBjYWxsYmFja3MgdG8gYmUgc2V0IGFuZFxyXG4gICAgICAgICAqIGFmZmVjdCB0aGlzIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogU2V0IHRvIGBmYWxzZWAgdG8gYWxsb3cgYm90aCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajb25FbWl0fSBhbmRcclxuICAgICAgICAgKiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajb25VcGRhdGV9IGNhbGxiYWNrcyB0byBiZSBzZXQgYW5kIGFmZmVjdCB0aGlzIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZW1pdE9ubHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVtaXRPbmx5ID0gZW1pdE9ubHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0byBydW4gZm9yIFBhcnRpY2xlcyB3aGVuIHRoZXkgYXJlIGVtaXR0ZWQgZnJvbSB0aGUgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI29uRW1pdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdENhbGxiYWNrfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25FbWl0ID0gdGhpcy5kZWZhdWx0RW1pdDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbGxiYWNrIHRvIHJ1biBmb3IgUGFydGljbGVzIHdoZW4gdGhleSBhcmUgdXBkYXRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI29uVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25VcGRhdGVDYWxsYmFja31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uVXBkYXRlID0gdGhpcy5kZWZhdWx0VXBkYXRlO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRDb25maWcoY29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHRoZSBwcm9wZXJ0eSBmcm9tIGEgUGFydGljbGUgRW1pdHRlciBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBPcHRpb25hbGx5IGFjY2VwdHMgYSBuZXcgcHJvcGVydHkga2V5IHRvIHVzZSwgcmVwbGFjaW5nIHRoZSBjdXJyZW50IG9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2xvYWRDb25maWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWd9IFtjb25maWddIC0gU2V0dGluZ3MgZm9yIHRoZSBQYXJ0aWNsZSBFbWl0dGVyIHRoYXQgb3ducyB0aGlzIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtuZXdLZXldIC0gVGhlIG5ldyBrZXkgdG8gdXNlIGZvciB0aGlzIHByb3BlcnR5LCBpZiBhbnkuXHJcbiAgICAgKi9cclxuICAgIGxvYWRDb25maWc6IGZ1bmN0aW9uIChjb25maWcsIG5ld0tleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25maWcgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChuZXdLZXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BlcnR5S2V5ID0gbmV3S2V5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gR2V0RmFzdFZhbHVlKFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlLZXksXHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRNZXRob2RzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVtaXRPbmx5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFJlc2V0IGl0IGJhY2sgYWdhaW5cclxuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZSA9IHRoaXMuZGVmYXVsdFVwZGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUGFydGljbGUgRW1pdHRlciBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBQYXJ0aWNsZSBFbWl0dGVyIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2UgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFuZCB1cGRhdGUgaXRzIGNhbGxiYWNrIG1ldGhvZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNvbkNoYW5nZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgT3Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRNZXRob2RzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajb25FbWl0fSBhbmRcclxuICAgICAqIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNvblVwZGF0ZX0gY2FsbGJhY2tzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50XHJcbiAgICAgKiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjcHJvcGVydHlWYWx1ZX0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNzZXRNZXRob2RzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgT3Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNZXRob2RzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucHJvcGVydHlWYWx1ZTtcclxuXHJcbiAgICAgICAgdmFyIHQgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0ID09PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBFeHBsaWNpdCBzdGF0aWMgdmFsdWU6XHJcbiAgICAgICAgICAgIC8vICB4OiA0MDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMub25FbWl0ID0gdGhpcy5zdGF0aWNWYWx1ZUVtaXQ7XHJcbiAgICAgICAgICAgIHRoaXMub25VcGRhdGUgPSB0aGlzLnN0YXRpY1ZhbHVlVXBkYXRlOyAvLyBIb3c/XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFBpY2tzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXk6XHJcbiAgICAgICAgICAgIC8vICB4OiBbIDEwMCwgMjAwLCAzMDAsIDQwMCBdXHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uRW1pdCA9IHRoaXMucmFuZG9tU3RhdGljVmFsdWVFbWl0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0ID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFRoZSBzYW1lIGFzIHNldHRpbmcganVzdCB0aGUgb25VcGRhdGUgZnVuY3Rpb24gYW5kIG5vIG9uRW1pdCAodW5sZXNzIHRoaXMgb3AgaXMgYW4gZW1pdE9ubHkgb25lKVxyXG4gICAgICAgICAgICAvLyAgQ3VzdG9tIGNhbGxiYWNrLCBtdXN0IHJldHVybiBhIHZhbHVlOlxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgeDogZnVuY3Rpb24gKHBhcnRpY2xlLCBrZXksIHQsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyA1MDtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAqL1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZW1pdE9ubHkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25FbWl0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodCA9PT0gJ29iamVjdCcgJiYgKHRoaXMuaGFzKHZhbHVlLCAncmFuZG9tJykgfHwgdGhpcy5oYXNCb3RoKHZhbHVlLCAnc3RhcnQnLCAnZW5kJykgfHwgdGhpcy5oYXNCb3RoKHZhbHVlLCAnbWluJywgJ21heCcpKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLmhhcyh2YWx1ZSwgJ3N0YXJ0JykgPyB2YWx1ZS5zdGFydCA6IHZhbHVlLm1pbjtcclxuICAgICAgICAgICAgdGhpcy5lbmQgPSB0aGlzLmhhcyh2YWx1ZSwgJ2VuZCcpID8gdmFsdWUuZW5kIDogdmFsdWUubWF4O1xyXG5cclxuICAgICAgICAgICAgdmFyIGlzUmFuZG9tID0gKHRoaXMuaGFzQm90aCh2YWx1ZSwgJ21pbicsICdtYXgnKSB8fCAhIXZhbHVlLnJhbmRvbSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgQSByYW5kb20gc3RhcnRpbmcgdmFsdWUgKHVzaW5nICdtaW4gfCBtYXgnIGluc3RlYWQgb2YgJ3N0YXJ0IHwgZW5kJyBhdXRvbWF0aWNhbGx5IGltcGxpZXMgYSByYW5kb20gdmFsdWUpXHJcblxyXG4gICAgICAgICAgICAvLyAgeDogeyBzdGFydDogMTAwLCBlbmQ6IDQwMCwgcmFuZG9tOiB0cnVlIH0gT1IgeyBtaW46IDEwMCwgbWF4OiA0MDAgfSBPUiB7IHJhbmRvbTogWyAxMDAsIDQwMCBdIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JhbmRvbSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJuZCA9IHZhbHVlLnJhbmRvbTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgeDogeyByYW5kb206IFsgMTAwLCA0MDAgXSB9ID0gdGhlIHNhbWUgYXMgZG9pbmc6IHg6IHsgc3RhcnQ6IDEwMCwgZW5kOiA0MDAsIHJhbmRvbTogdHJ1ZSB9XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShybmQpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBybmRbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQgPSBybmRbMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkVtaXQgPSB0aGlzLnJhbmRvbVJhbmdlZFZhbHVlRW1pdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKHZhbHVlLCAnc3RlcHMnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEEgc3RlcHBlZCAocGVyIGVtaXQpIHJhbmdlXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIHg6IHsgc3RhcnQ6IDEwMCwgZW5kOiA0MDAsIHN0ZXBzOiA2NCB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEluY3JlbWVudHMgYSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGVtaXR0ZXJcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBzID0gdmFsdWUuc3RlcHM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSB0aGlzLnN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25FbWl0ID0gdGhpcy5zdGVwcGVkRW1pdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBBbiBlYXNlZCByYW5nZSAoZGVmYXVsdHMgdG8gTGluZWFyIGlmIG5vdCBzcGVjaWZpZWQpXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIHg6IHsgc3RhcnQ6IDEwMCwgZW5kOiA0MDAsIFsgZWFzZTogJ0xpbmVhcicgXSB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGVhc2VUeXBlID0gdGhpcy5oYXModmFsdWUsICdlYXNlJykgPyB2YWx1ZS5lYXNlIDogJ0xpbmVhcic7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lYXNlID0gR2V0RWFzZUZ1bmN0aW9uKGVhc2VUeXBlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzUmFuZG9tKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FbWl0ID0gdGhpcy5lYXNlZFZhbHVlRW1pdDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgQlVHOiBhbHBoYSwgcm90YXRlLCBzY2FsZVgsIHNjYWxlWSwgb3IgdGludCBhcmUgZWFzZWQgaGVyZSBpZiB7bWluLCBtYXh9IGlzIGdpdmVuLlxyXG4gICAgICAgICAgICAgICAgLy8gIFByb2JhYmx5IHRoaXMgYnJhbmNoIHNob3VsZCBleGNsdWRlIGlzUmFuZG9tIGVudGlyZWx5LlxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25VcGRhdGUgPSB0aGlzLmVhc2VWYWx1ZVVwZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0ID09PSAnb2JqZWN0JyAmJiB0aGlzLmhhc0VpdGhlcih2YWx1ZSwgJ29uRW1pdCcsICdvblVwZGF0ZScpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEN1c3RvbSBvbkVtaXQgYW5kIG9uVXBkYXRlIGNhbGxiYWNrc1xyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgeDoge1xyXG4gICAgICAgICAgICAgICAgLy8gIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcnRpY2xlcyBsaWZlLCB3aGVuIGl0IGlzIGJlaW5nIGNyZWF0ZWRcclxuICAgICAgICAgICAgICAgIG9uRW1pdDogZnVuY3Rpb24gKHBhcnRpY2xlLCBrZXksIHQsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIENhbGxlZCBkdXJpbmcgdGhlIHBhcnRpY2xlcyBsaWZlIG9uIGVhY2ggdXBkYXRlXHJcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogZnVuY3Rpb24gKHBhcnRpY2xlLCBrZXksIHQsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAqL1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKHZhbHVlLCAnb25FbWl0JykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25FbWl0ID0gdmFsdWUub25FbWl0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oYXModmFsdWUsICdvblVwZGF0ZScpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gdmFsdWUub25VcGRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNoYXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGxvb2sgZm9yIGluIHRoZSBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBleGlzdHMgaW4gdGhlIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIGhhczogZnVuY3Rpb24gKG9iamVjdCwga2V5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYm90aCBvZiB0aGUgZ2l2ZW4gcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2hhc0JvdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleTEgLSBUaGUga2V5IG9mIHRoZSBmaXJzdCBwcm9wZXJ0eSB0byBjaGVjayB0aGUgb2JqZWN0IGZvci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkyIC0gVGhlIGtleSBvZiB0aGUgc2Vjb25kIHByb3BlcnR5IHRvIGNoZWNrIHRoZSBvYmplY3QgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBib3RoIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIG9iamVjdCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIGhhc0JvdGg6IGZ1bmN0aW9uIChvYmplY3QsIGtleTEsIGtleTIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkxKSAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5Mik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciBhbiBvYmplY3QgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2hhc0VpdGhlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5MSAtIFRoZSBrZXkgb2YgdGhlIGZpcnN0IHByb3BlcnR5IHRvIGNoZWNrIHRoZSBvYmplY3QgZm9yLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleTIgLSBUaGUga2V5IG9mIHRoZSBzZWNvbmQgcHJvcGVydHkgdG8gY2hlY2sgdGhlIG9iamVjdCBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvcGVydGllcyBleGlzdHMgaW4gdGhlIG9iamVjdCwgYGZhbHNlYCBpZiBuZWl0aGVyIGV4aXN0LlxyXG4gICAgICovXHJcbiAgICBoYXNFaXRoZXI6IGZ1bmN0aW9uIChvYmplY3QsIGtleTEsIGtleTIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkxKSB8fCBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5Mik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJldHVybmVkIHZhbHVlIHNldHMgd2hhdCB0aGUgcHJvcGVydHkgd2lsbCBiZSBhdCB0aGUgU1RBUlQgb2YgdGhlIHBhcnRpY2xlcyBsaWZlLCBvbiBlbWl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZGVmYXVsdEVtaXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV0gLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgZGVmYXVsdEVtaXQ6IGZ1bmN0aW9uIChwYXJ0aWNsZSwga2V5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJldHVybmVkIHZhbHVlIHVwZGF0ZXMgdGhlIHByb3BlcnR5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHBhcnRpY2xlcyBsaWZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZGVmYXVsdFVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBUIHZhbHVlIChiZXR3ZWVuIDAgYW5kIDEpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgZGVmYXVsdFVwZGF0ZTogZnVuY3Rpb24gKHBhcnRpY2xlLCBrZXksIHQsIHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBgb25FbWl0YCBjYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajc3RhdGljVmFsdWVFbWl0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljVmFsdWVFbWl0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsdWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYG9uVXBkYXRlYCBjYWxsYmFjayB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajc3RhdGljVmFsdWVVcGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWNWYWx1ZVVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBvbkVtaXRgIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhIHJhbmRvbSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIGFycmF5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjcmFuZG9tU3RhdGljVmFsdWVFbWl0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICByYW5kb21TdGF0aWNWYWx1ZUVtaXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5wcm9wZXJ0eVZhbHVlLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5VmFsdWVbcmFuZG9tSW5kZXhdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBvbkVtaXRgIGNhbGxiYWNrIHRoYXQgcmV0dXJucyBhIHZhbHVlIGJldHdlZW4gdGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNzdGFydH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZW5kfSByYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3JhbmRvbVJhbmdlZFZhbHVlRW1pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICByYW5kb21SYW5nZWRWYWx1ZUVtaXQ6IGZ1bmN0aW9uIChwYXJ0aWNsZSwga2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IEZsb2F0QmV0d2Vlbih0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XHJcblxyXG4gICAgICAgIGlmIChwYXJ0aWNsZSAmJiBwYXJ0aWNsZS5kYXRhW2tleV0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJ0aWNsZS5kYXRhW2tleV0ubWluID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYG9uRW1pdGAgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGEgc3RlcHBlZCB2YWx1ZSBiZXR3ZWVuIHRoZVxyXG4gICAgICoge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI3N0YXJ0fSBhbmQge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2VuZH1cclxuICAgICAqIHJhbmdlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3Ajc3RlcHBlZEVtaXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIHN0ZXBwZWRFbWl0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jb3VudGVyO1xyXG5cclxuICAgICAgICB2YXIgbmV4dCA9IHRoaXMuY291bnRlciArICh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpIC8gdGhpcy5zdGVwcztcclxuXHJcbiAgICAgICAgdGhpcy5jb3VudGVyID0gV3JhcChuZXh0LCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBvbkVtaXRgIGNhbGxiYWNrIGZvciBhbiBlYXNlZCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBJdCBwcmVwYXJlcyB0aGUgcGFydGljbGUgZm9yIGVhc2luZyBieSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3AjZWFzZVZhbHVlVXBkYXRlfS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2Vhc2VkVmFsdWVFbWl0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIHBhcnRpY2xlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNzdGFydH0sIGFzIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBlYXNlZFZhbHVlRW1pdDogZnVuY3Rpb24gKHBhcnRpY2xlLCBrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHBhcnRpY2xlICYmIHBhcnRpY2xlLmRhdGFba2V5XSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gcGFydGljbGUuZGF0YVtrZXldO1xyXG5cclxuICAgICAgICAgICAgZGF0YS5taW4gPSB0aGlzLnN0YXJ0O1xyXG4gICAgICAgICAgICBkYXRhLm1heCA9IHRoaXMuZW5kO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYG9uVXBkYXRlYCBjYWxsYmFjayB0aGF0IHJldHVybnMgYW4gZWFzZWQgdmFsdWUgYmV0d2VlbiB0aGVcclxuICAgICAqIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNzdGFydH0gYW5kIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcCNlbmR9XHJcbiAgICAgKiByYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wI2Vhc2VWYWx1ZVVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBwYXJ0aWNsZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBUIHZhbHVlIChiZXR3ZWVuIDAgYW5kIDEpXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgZWFzZVZhbHVlVXBkYXRlOiBmdW5jdGlvbiAocGFydGljbGUsIGtleSwgdClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHBhcnRpY2xlLmRhdGFba2V5XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChkYXRhLm1heCAtIGRhdGEubWluKSAqIHRoaXMuZWFzZSh0KSArIGRhdGEubWluO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlck9wO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgR3Jhdml0eVdlbGwgYWN0aW9uIGFwcGxpZXMgYSBmb3JjZSBvbiB0aGUgcGFydGljbGUgdG8gZHJhdyBpdCB0b3dhcmRzLCBvciByZXBlbCBpdCBmcm9tLCBhIHNpbmdsZSBwb2ludC5cclxuICogXHJcbiAqIFRoZSBmb3JjZSBhcHBsaWVkIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcGFydGljbGUgdG8gdGhlIHBvaW50LCBpbiBhY2NvcmRhbmNlIHdpdGggTmV3dG9uJ3MgbGF3IG9mIGdyYXZpdHkuXHJcbiAqIFxyXG4gKiBUaGlzIHNpbXVsYXRlcyB0aGUgZWZmZWN0IG9mIGdyYXZpdHkgb3ZlciBsYXJnZSBkaXN0YW5jZXMgKGFzIGJldHdlZW4gcGxhbmV0cywgZm9yIGV4YW1wbGUpLlxyXG4gKlxyXG4gKiBAY2xhc3MgR3Jhdml0eVdlbGxcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhudW1iZXJ8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbENvbmZpZyl9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgR3Jhdml0eSBXZWxsLCBpbiB3b3JsZCBzcGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgR3Jhdml0eSBXZWxsLCBpbiB3b3JsZCBzcGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtwb3dlcj0wXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgZ3Jhdml0eSBmb3JjZSAtIGxhcmdlciBudW1iZXJzIHByb2R1Y2UgYSBzdHJvbmdlciBmb3JjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtlcHNpbG9uPTEwMF0gLSBUaGUgbWluaW11bSBkaXN0YW5jZSBmb3Igd2hpY2ggdGhlIGdyYXZpdHkgZm9yY2UgaXMgY2FsY3VsYXRlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtncmF2aXR5PTUwXSAtIFRoZSBncmF2aXRhdGlvbmFsIGZvcmNlIG9mIHRoaXMgR3Jhdml0eSBXZWxsLlxyXG4gKi9cclxudmFyIEdyYXZpdHlXZWxsID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEdyYXZpdHlXZWxsICh4LCB5LCBwb3dlciwgZXBzaWxvbiwgZ3Jhdml0eSlcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHg7XHJcblxyXG4gICAgICAgICAgICB4ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3gnLCAwKTtcclxuICAgICAgICAgICAgeSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd5JywgMCk7XHJcbiAgICAgICAgICAgIHBvd2VyID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3Bvd2VyJywgMCk7XHJcbiAgICAgICAgICAgIGVwc2lsb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXBzaWxvbicsIDEwMCk7XHJcbiAgICAgICAgICAgIGdyYXZpdHkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZ3Jhdml0eScsIDUwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgICAgIGlmIChwb3dlciA9PT0gdW5kZWZpbmVkKSB7IHBvd2VyID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAoZXBzaWxvbiA9PT0gdW5kZWZpbmVkKSB7IGVwc2lsb24gPSAxMDA7IH1cclxuICAgICAgICAgICAgaWYgKGdyYXZpdHkgPT09IHVuZGVmaW5lZCkgeyBncmF2aXR5ID0gNTA7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIEdyYXZpdHkgV2VsbCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkdyYXZpdHlXZWxsI3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIEdyYXZpdHkgV2VsbCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkdyYXZpdHlXZWxsI3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueSA9IHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIEdyYXZpdHkgV2VsbC4gQW4gaW5hY3RpdmUgR3Jhdml0eSBXZWxsIHdpbGwgbm90IGluZmx1ZW5jZSBhbnkgcGFydGljbGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbCNhY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBncmF2aXR5IHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbCNfZ3Jhdml0eVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9ncmF2aXR5ID0gZ3Jhdml0eTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgcG93ZXIgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkdyYXZpdHlXZWxsI19wb3dlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcG93ZXIgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBlcHNpbG9uIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbCNfZXBzaWxvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZXBzaWxvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdHJlbmd0aCBvZiB0aGUgZ3Jhdml0eSBmb3JjZSAtIGxhcmdlciBudW1iZXJzIHByb2R1Y2UgYSBzdHJvbmdlciBmb3JjZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGwjcG93ZXJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG93ZXIgPSBwb3dlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gZGlzdGFuY2UgZm9yIHdoaWNoIHRoZSBncmF2aXR5IGZvcmNlIGlzIGNhbGN1bGF0ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkdyYXZpdHlXZWxsI2Vwc2lsb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZXBzaWxvbiA9IGVwc2lsb247XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBQYXJ0aWNsZSBhbmQgdXBkYXRlcyBpdCBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIEdyYXZpdHkgV2VsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGwjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGV9IHBhcnRpY2xlIC0gVGhlIFBhcnRpY2xlIHRvIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgLSBUaGUgZGVsdGEgdmFsdWUgZGl2aWRlZCBieSAxMDAwLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChwYXJ0aWNsZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLnggLSBwYXJ0aWNsZS54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55IC0gcGFydGljbGUueTtcclxuICAgICAgICB2YXIgZFNxID0geCAqIHggKyB5ICogeTtcclxuXHJcbiAgICAgICAgaWYgKGRTcSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KGRTcSk7XHJcblxyXG4gICAgICAgIGlmIChkU3EgPCB0aGlzLl9lcHNpbG9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZFNxID0gdGhpcy5fZXBzaWxvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmYWN0b3IgPSAoKHRoaXMuX3Bvd2VyICogZGVsdGEpIC8gKGRTcSAqIGQpKSAqIDEwMDtcclxuXHJcbiAgICAgICAgcGFydGljbGUudmVsb2NpdHlYICs9IHggKiBmYWN0b3I7XHJcbiAgICAgICAgcGFydGljbGUudmVsb2NpdHlZICs9IHkgKiBmYWN0b3I7XHJcbiAgICB9LFxyXG5cclxuICAgIGVwc2lsb246IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLl9lcHNpbG9uKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24gPSB2YWx1ZSAqIHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIHBvd2VyOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3dlciAvIHRoaXMuX2dyYXZpdHk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3dlciA9IHZhbHVlICogdGhpcy5fZ3Jhdml0eTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICBncmF2aXR5OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncmF2aXR5O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHB3ciA9IHRoaXMucG93ZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyYXZpdHkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5wb3dlciA9IHB3cjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXZpdHlXZWxsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBEZWdUb1JhZCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRGVnVG9SYWQnKTtcclxudmFyIERpc3RhbmNlQmV0d2VlbiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFBhcnRpY2xlIGlzIGEgc2ltcGxlIEdhbWUgT2JqZWN0IGNvbnRyb2xsZWQgYnkgYSBQYXJ0aWNsZSBFbWl0dGVyIGFuZCBNYW5hZ2VyLCBhbmQgcmVuZGVyZWQgYnkgdGhlIE1hbmFnZXIuXHJcbiAqIEl0IHVzZXMgaXRzIG93biBsaWdodHdlaWdodCBwaHlzaWNzIHN5c3RlbSwgYW5kIGNhbiBpbnRlcmFjdCBvbmx5IHdpdGggaXRzIEVtaXR0ZXIncyBib3VuZHMgYW5kIHpvbmVzLlxyXG4gKlxyXG4gKiBAY2xhc3MgUGFydGljbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyfSBlbWl0dGVyIC0gVGhlIEVtaXR0ZXIgdG8gd2hpY2ggdGhpcyBQYXJ0aWNsZSBiZWxvbmdzLlxyXG4gKi9cclxudmFyIFBhcnRpY2xlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFBhcnRpY2xlIChlbWl0dGVyKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBFbWl0dGVyIHRvIHdoaWNoIHRoaXMgUGFydGljbGUgYmVsb25ncy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEEgUGFydGljbGUgY2FuIG9ubHkgYmVsb25nIHRvIGEgc2luZ2xlIEVtaXR0ZXIgYW5kIGlzIGNyZWF0ZWQsIHVwZGF0ZWQgYW5kIGRlc3Ryb3llZCB2aWEgaXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2VtaXR0ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gZW1pdHRlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRleHR1cmUgZnJhbWUgdXNlZCB0byByZW5kZXIgdGhpcyBQYXJ0aWNsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjZnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSN4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggdmVsb2NpdHkgb2YgdGhpcyBQYXJ0aWNsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjdmVsb2NpdHlYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZWxvY2l0eVggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSB2ZWxvY2l0eSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSN2ZWxvY2l0eVlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlbG9jaXR5WSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGFjY2VsZXJhdGlvbiBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNhY2NlbGVyYXRpb25YXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY2NlbGVyYXRpb25YID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgYWNjZWxlcmF0aW9uIG9mIHRoaXMgUGFydGljbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2FjY2VsZXJhdGlvbllcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjY2VsZXJhdGlvblkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBob3Jpem9udGFsIHZlbG9jaXR5IHRoaXMgUGFydGljbGUgY2FuIHRyYXZlbCBhdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjbWF4VmVsb2NpdHlYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxMDAwMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHlYID0gMTAwMDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXhpbXVtIHZlcnRpY2FsIHZlbG9jaXR5IHRoaXMgUGFydGljbGUgY2FuIHRyYXZlbCBhdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjbWF4VmVsb2NpdHlZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxMDAwMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHlZID0gMTAwMDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBib3VuY2luZXNzLCBvciByZXN0aXR1dGlvbiwgb2YgdGhpcyBQYXJ0aWNsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjYm91bmNlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib3VuY2UgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNzY2FsZVhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlWCA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJ0aWNhbCBzY2FsZSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNzY2FsZVlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlWSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNhbHBoYVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWxwaGEgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYW5nbGUgb2YgdGhpcyBQYXJ0aWNsZSBpbiBkZWdyZWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNhbmdsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYW5nbGUgb2YgdGhpcyBQYXJ0aWNsZSBpbiByYWRpYW5zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNyb3RhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGludCBhcHBsaWVkIHRvIHRoaXMgUGFydGljbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI3RpbnRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAd2ViZ2xPbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aW50ID0gMHhmZmZmZmY7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsaWZlc3BhbiBvZiB0aGlzIFBhcnRpY2xlIGluIG1zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNsaWZlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxMDAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saWZlID0gMTAwMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgbGlmZSBvZiB0aGlzIFBhcnRpY2xlIGluIG1zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNsaWZlQ3VycmVudFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTAwMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGlmZUN1cnJlbnQgPSAxMDAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVsYXkgYXBwbGllZCB0byB0aGlzIFBhcnRpY2xlIHVwb24gZW1pc3Npb24sIGluIG1zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNkZWxheUN1cnJlbnRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbGF5Q3VycmVudCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBub3JtYWxpemVkIGxpZmVzcGFuIFQgdmFsdWUsIHdoZXJlIDAgaXMgdGhlIHN0YXJ0IGFuZCAxIGlzIHRoZSBlbmQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2xpZmVUXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saWZlVCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkYXRhIHVzZWQgYnkgdGhlIGVhc2UgZXF1YXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHtcclxuICAgICAgICAgICAgdGludDogeyBtaW46IDB4ZmZmZmZmLCBtYXg6IDB4ZmZmZmZmLCBjdXJyZW50OiAweGZmZmZmZiB9LFxyXG4gICAgICAgICAgICBhbHBoYTogeyBtaW46IDEsIG1heDogMSB9LFxyXG4gICAgICAgICAgICByb3RhdGU6IHsgbWluOiAwLCBtYXg6IDAgfSxcclxuICAgICAgICAgICAgc2NhbGVYOiB7IG1pbjogMSwgbWF4OiAxIH0sXHJcbiAgICAgICAgICAgIHNjYWxlWTogeyBtaW46IDEsIG1heDogMSB9XHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoaXMgUGFydGljbGUgaXMgYWxpdmUgYW5kIHVwZGF0aW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNpc0FsaXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBQYXJ0aWNsZSBpcyBhbGl2ZSBhbmQgdXBkYXRpbmcsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc0FsaXZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5saWZlQ3VycmVudCA+IDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBwYXJ0aWNsZSBiYWNrIHRvIHplcm8uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI3Jlc2V0UG9zaXRpb25cclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgcmVzZXRQb3NpdGlvbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSAwO1xyXG4gICAgICAgIHRoaXMueSA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoaXMgUGFydGljbGUgZnJvbSB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2ZpcmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBsYXVuY2ggdGhpcyBQYXJ0aWNsZSBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGxhdW5jaCB0aGlzIFBhcnRpY2xlIGZyb20uXHJcbiAgICAgKi9cclxuICAgIGZpcmU6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbWl0dGVyID0gdGhpcy5lbWl0dGVyO1xyXG5cclxuICAgICAgICB0aGlzLmZyYW1lID0gZW1pdHRlci5nZXRGcmFtZSgpO1xyXG5cclxuICAgICAgICBpZiAoZW1pdHRlci5lbWl0Wm9uZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBVcGRhdGVzIHBhcnRpY2xlLnggYW5kIHBhcnRpY2xlLnkgZHVyaW5nIHRoaXMgY2FsbFxyXG4gICAgICAgICAgICBlbWl0dGVyLmVtaXRab25lLmdldFBvaW50KHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChlbWl0dGVyLmZvbGxvdylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy54ICs9IGVtaXR0ZXIuZm9sbG93LnggKyBlbWl0dGVyLmZvbGxvd09mZnNldC54O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnggKz0gZW1pdHRlci54Lm9uRW1pdCh0aGlzLCAneCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnggKz0geDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZW1pdHRlci5mb2xsb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueSArPSBlbWl0dGVyLmZvbGxvdy55ICsgZW1pdHRlci5mb2xsb3dPZmZzZXQueTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy55ICs9IGVtaXR0ZXIueS5vbkVtaXQodGhpcywgJ3knKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy55ICs9IHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpZmUgPSBlbWl0dGVyLmxpZmVzcGFuLm9uRW1pdCh0aGlzLCAnbGlmZXNwYW4nKTtcclxuICAgICAgICB0aGlzLmxpZmVDdXJyZW50ID0gdGhpcy5saWZlO1xyXG4gICAgICAgIHRoaXMubGlmZVQgPSAwO1xyXG5cclxuICAgICAgICB2YXIgc3ggPSBlbWl0dGVyLnNwZWVkWC5vbkVtaXQodGhpcywgJ3NwZWVkWCcpO1xyXG4gICAgICAgIHZhciBzeSA9IChlbWl0dGVyLnNwZWVkWSkgPyBlbWl0dGVyLnNwZWVkWS5vbkVtaXQodGhpcywgJ3NwZWVkWScpIDogc3g7XHJcblxyXG4gICAgICAgIGlmIChlbWl0dGVyLnJhZGlhbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByYWQgPSBEZWdUb1JhZChlbWl0dGVyLmFuZ2xlLm9uRW1pdCh0aGlzLCAnYW5nbGUnKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5WCA9IE1hdGguY29zKHJhZCkgKiBNYXRoLmFicyhzeCk7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZID0gTWF0aC5zaW4ocmFkKSAqIE1hdGguYWJzKHN5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZW1pdHRlci5tb3ZlVG8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbXggPSBlbWl0dGVyLm1vdmVUb1gub25FbWl0KHRoaXMsICdtb3ZlVG9YJyk7XHJcbiAgICAgICAgICAgIHZhciBteSA9IChlbWl0dGVyLm1vdmVUb1kpID8gZW1pdHRlci5tb3ZlVG9ZLm9uRW1pdCh0aGlzLCAnbW92ZVRvWScpIDogbXg7XHJcblxyXG4gICAgICAgICAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKG15IC0gdGhpcy55LCBteCAtIHRoaXMueCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3BlZWQgPSBEaXN0YW5jZUJldHdlZW4odGhpcy54LCB0aGlzLnksIG14LCBteSkgLyAodGhpcy5saWZlIC8gMTAwMCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgV2Uga25vdyBob3cgbWFueSBwaXhlbHMgd2UgbmVlZCB0byBtb3ZlLCBidXQgaG93IGZhc3Q/XHJcbiAgICAgICAgICAgIC8vIHZhciBzcGVlZCA9IHRoaXMuZGlzdGFuY2VUb1hZKGRpc3BsYXlPYmplY3QsIHgsIHkpIC8gKG1heFRpbWUgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlYID0gTWF0aC5jb3MoYW5nbGUpICogc3BlZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZID0gTWF0aC5zaW4oYW5nbGUpICogc3BlZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlYID0gc3g7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHlZID0gc3k7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1pdHRlci5hY2NlbGVyYXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFjY2VsZXJhdGlvblggPSBlbWl0dGVyLmFjY2VsZXJhdGlvblgub25FbWl0KHRoaXMsICdhY2NlbGVyYXRpb25YJyk7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uWSA9IGVtaXR0ZXIuYWNjZWxlcmF0aW9uWS5vbkVtaXQodGhpcywgJ2FjY2VsZXJhdGlvblknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHlYID0gZW1pdHRlci5tYXhWZWxvY2l0eVgub25FbWl0KHRoaXMsICdtYXhWZWxvY2l0eVgnKTtcclxuICAgICAgICB0aGlzLm1heFZlbG9jaXR5WSA9IGVtaXR0ZXIubWF4VmVsb2NpdHlZLm9uRW1pdCh0aGlzLCAnbWF4VmVsb2NpdHlZJyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVsYXlDdXJyZW50ID0gZW1pdHRlci5kZWxheS5vbkVtaXQodGhpcywgJ2RlbGF5Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NhbGVYID0gZW1pdHRlci5zY2FsZVgub25FbWl0KHRoaXMsICdzY2FsZVgnKTtcclxuICAgICAgICB0aGlzLnNjYWxlWSA9IChlbWl0dGVyLnNjYWxlWSkgPyBlbWl0dGVyLnNjYWxlWS5vbkVtaXQodGhpcywgJ3NjYWxlWScpIDogdGhpcy5zY2FsZVg7XHJcblxyXG4gICAgICAgIHRoaXMuYW5nbGUgPSBlbWl0dGVyLnJvdGF0ZS5vbkVtaXQodGhpcywgJ3JvdGF0ZScpO1xyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSBEZWdUb1JhZCh0aGlzLmFuZ2xlKTtcclxuXHJcbiAgICAgICAgdGhpcy5ib3VuY2UgPSBlbWl0dGVyLmJvdW5jZS5vbkVtaXQodGhpcywgJ2JvdW5jZScpO1xyXG5cclxuICAgICAgICB0aGlzLmFscGhhID0gZW1pdHRlci5hbHBoYS5vbkVtaXQodGhpcywgJ2FscGhhJyk7XHJcblxyXG4gICAgICAgIHRoaXMudGludCA9IGVtaXR0ZXIudGludC5vbkVtaXQodGhpcywgJ3RpbnQnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBjYWxjdWxhdGVzIHRoZSB2ZWxvY2l0eSBvZiB0aGUgUGFydGljbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlI2NvbXB1dGVWZWxvY2l0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlcn0gZW1pdHRlciAtIFRoZSBFbWl0dGVyIHRoYXQgaXMgdXBkYXRpbmcgdGhpcyBQYXJ0aWNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgLSBUaGUgZGVsdGEgdmFsdWUgZGl2aWRlZCBieSAxMDAwLlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gcHJvY2Vzc29ycyAtIFBhcnRpY2xlIHByb2Nlc3NvcnMgKGdyYXZpdHkgd2VsbHMpLlxyXG4gICAgICovXHJcbiAgICBjb21wdXRlVmVsb2NpdHk6IGZ1bmN0aW9uIChlbWl0dGVyLCBkZWx0YSwgc3RlcCwgcHJvY2Vzc29ycylcclxuICAgIHtcclxuICAgICAgICB2YXIgdnggPSB0aGlzLnZlbG9jaXR5WDtcclxuICAgICAgICB2YXIgdnkgPSB0aGlzLnZlbG9jaXR5WTtcclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy5hY2NlbGVyYXRpb25YO1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMuYWNjZWxlcmF0aW9uWTtcclxuXHJcbiAgICAgICAgdmFyIG14ID0gdGhpcy5tYXhWZWxvY2l0eVg7XHJcbiAgICAgICAgdmFyIG15ID0gdGhpcy5tYXhWZWxvY2l0eVk7XHJcblxyXG4gICAgICAgIHZ4ICs9IChlbWl0dGVyLmdyYXZpdHlYICogc3RlcCk7XHJcbiAgICAgICAgdnkgKz0gKGVtaXR0ZXIuZ3Jhdml0eVkgKiBzdGVwKTtcclxuXHJcbiAgICAgICAgaWYgKGF4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdnggKz0gKGF4ICogc3RlcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2eSArPSAoYXkgKiBzdGVwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2eCA+IG14KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdnggPSBteDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodnggPCAtbXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2eCA9IC1teDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2eSA+IG15KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdnkgPSBteTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodnkgPCAtbXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2eSA9IC1teTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudmVsb2NpdHlYID0gdng7XHJcbiAgICAgICAgdGhpcy52ZWxvY2l0eVkgPSB2eTtcclxuXHJcbiAgICAgICAgLy8gIEFwcGx5IGFueSBhZGRpdGlvbmFsIHByb2Nlc3NvcnNcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2Nlc3NvcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm9jZXNzb3JzW2ldLnVwZGF0ZSh0aGlzLCBkZWx0YSwgc3RlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGlzIFBhcnRpY2xlIGlzIHN0aWxsIHdpdGhpbiB0aGUgYm91bmRzIGRlZmluZWQgYnkgdGhlIGdpdmVuIEVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm90LCBhbmQgZGVwZW5kaW5nIG9uIHRoZSBFbWl0dGVyIGNvbGxpc2lvbiBmbGFncywgdGhlIFBhcnRpY2xlIG1heSBlaXRoZXIgc3RvcCBvciByZWJvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNjaGVja0JvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlcn0gZW1pdHRlciAtIFRoZSBFbWl0dGVyIHRvIGNoZWNrIHRoZSBib3VuZHMgYWdhaW5zdC5cclxuICAgICAqL1xyXG4gICAgY2hlY2tCb3VuZHM6IGZ1bmN0aW9uIChlbWl0dGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib3VuZHMgPSBlbWl0dGVyLmJvdW5kcztcclxuICAgICAgICB2YXIgYm91bmNlID0gLXRoaXMuYm91bmNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy54IDwgYm91bmRzLnggJiYgZW1pdHRlci5jb2xsaWRlTGVmdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IGJvdW5kcy54O1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5WCAqPSBib3VuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMueCA+IGJvdW5kcy5yaWdodCAmJiBlbWl0dGVyLmNvbGxpZGVSaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IGJvdW5kcy5yaWdodDtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eVggKj0gYm91bmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMueSA8IGJvdW5kcy55ICYmIGVtaXR0ZXIuY29sbGlkZVRvcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IGJvdW5kcy55O1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5WSAqPSBib3VuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMueSA+IGJvdW5kcy5ib3R0b20gJiYgZW1pdHRlci5jb2xsaWRlQm90dG9tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy55ID0gYm91bmRzLmJvdHRvbTtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eVkgKj0gYm91bmNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiB1cGRhdGUgbWV0aG9kIGZvciB0aGlzIFBhcnRpY2xlLlxyXG4gICAgICpcclxuICAgICAqIFVwZGF0ZXMgaXRzIGxpZmUgdmFsdWVzLCBjb21wdXRlcyB0aGUgdmVsb2NpdHkgYW5kIHJlcG9zaXRpb25zIHRoZSBQYXJ0aWNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGUjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIC0gVGhlIGRlbHRhIHZhbHVlIGRpdmlkZWQgYnkgMTAwMC5cclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHByb2Nlc3NvcnMgLSBBbiBvcHRpb25hbCBhcnJheSBvZiB1cGRhdGUgcHJvY2Vzc29ycy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFBhcnRpY2xlIGhhcyBub3cgZXhwaXJlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQsIG90aGVyd2lzZSBgZmFsc2VgIGlmIHN0aWxsIGFjdGl2ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoZGVsdGEsIHN0ZXAsIHByb2Nlc3NvcnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsYXlDdXJyZW50ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsYXlDdXJyZW50IC09IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGVtaXR0ZXIgPSB0aGlzLmVtaXR0ZXI7XHJcblxyXG4gICAgICAgIC8vICBIb3cgZmFyIGFsb25nIGluIGxpZmUgaXMgdGhpcyBwYXJ0aWNsZT8gKHQgPSAwIHRvIDEpXHJcbiAgICAgICAgdmFyIHQgPSAxIC0gKHRoaXMubGlmZUN1cnJlbnQgLyB0aGlzLmxpZmUpO1xyXG5cclxuICAgICAgICB0aGlzLmxpZmVUID0gdDtcclxuXHJcbiAgICAgICAgdGhpcy5jb21wdXRlVmVsb2NpdHkoZW1pdHRlciwgZGVsdGEsIHN0ZXAsIHByb2Nlc3NvcnMpO1xyXG5cclxuICAgICAgICB0aGlzLnggKz0gdGhpcy52ZWxvY2l0eVggKiBzdGVwO1xyXG4gICAgICAgIHRoaXMueSArPSB0aGlzLnZlbG9jaXR5WSAqIHN0ZXA7XHJcblxyXG4gICAgICAgIGlmIChlbWl0dGVyLmJvdW5kcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCb3VuZHMoZW1pdHRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1pdHRlci5kZWF0aFpvbmUgJiYgZW1pdHRlci5kZWF0aFpvbmUud2lsbEtpbGwodGhpcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpZmVDdXJyZW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIC8vICBObyBuZWVkIHRvIGdvIGFueSBmdXJ0aGVyLCBwYXJ0aWNsZSBoYXMgYmVlbiBraWxsZWRcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNjYWxlWCA9IGVtaXR0ZXIuc2NhbGVYLm9uVXBkYXRlKHRoaXMsICdzY2FsZVgnLCB0LCB0aGlzLnNjYWxlWCk7XHJcblxyXG4gICAgICAgIGlmIChlbWl0dGVyLnNjYWxlWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gZW1pdHRlci5zY2FsZVkub25VcGRhdGUodGhpcywgJ3NjYWxlWScsIHQsIHRoaXMuc2NhbGVZKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSB0aGlzLnNjYWxlWDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYW5nbGUgPSBlbWl0dGVyLnJvdGF0ZS5vblVwZGF0ZSh0aGlzLCAncm90YXRlJywgdCwgdGhpcy5hbmdsZSk7XHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IERlZ1RvUmFkKHRoaXMuYW5nbGUpO1xyXG5cclxuICAgICAgICB0aGlzLmFscGhhID0gZW1pdHRlci5hbHBoYS5vblVwZGF0ZSh0aGlzLCAnYWxwaGEnLCB0LCB0aGlzLmFscGhhKTtcclxuXHJcbiAgICAgICAgdGhpcy50aW50ID0gZW1pdHRlci50aW50Lm9uVXBkYXRlKHRoaXMsICd0aW50JywgdCwgdGhpcy50aW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5saWZlQ3VycmVudCAtPSBkZWx0YTtcclxuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmxpZmVDdXJyZW50IDw9IDApO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnRpY2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCbGVuZE1vZGVzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvQmxlbmRNb2RlcycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIERlYXRoWm9uZSA9IHJlcXVpcmUoJy4vem9uZXMvRGVhdGhab25lJyk7XHJcbnZhciBFZGdlWm9uZSA9IHJlcXVpcmUoJy4vem9uZXMvRWRnZVpvbmUnKTtcclxudmFyIEVtaXR0ZXJPcCA9IHJlcXVpcmUoJy4vRW1pdHRlck9wJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHZXRSYW5kb20gPSByZXF1aXJlKCcuLi8uLi91dGlscy9hcnJheS9HZXRSYW5kb20nKTtcclxudmFyIEhhc0FueSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9IYXNBbnknKTtcclxudmFyIEhhc1ZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0hhc1ZhbHVlJyk7XHJcbnZhciBQYXJ0aWNsZSA9IHJlcXVpcmUoJy4vUGFydGljbGUnKTtcclxudmFyIFJhbmRvbVpvbmUgPSByZXF1aXJlKCcuL3pvbmVzL1JhbmRvbVpvbmUnKTtcclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL1JlY3RhbmdsZScpO1xyXG52YXIgU3RhYmxlU29ydCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2FycmF5L1N0YWJsZVNvcnQnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxudmFyIFdyYXAgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1dyYXAnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgcGFydGljbGUgZW1pdHRlciByZXByZXNlbnRzIGEgc2luZ2xlIHBhcnRpY2xlIHN0cmVhbS5cclxuICogSXQgY29udHJvbHMgYSBwb29sIG9mIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlIFBhcnRpY2xlc30gYW5kIGlzIGNvbnRyb2xsZWQgYnkgYSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyIFBhcnRpY2xlIEVtaXR0ZXIgTWFuYWdlcn0uXHJcbiAqXHJcbiAqIEBjbGFzcyBQYXJ0aWNsZUVtaXR0ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlcn0gbWFuYWdlciAtIFRoZSBFbWl0dGVyIE1hbmFnZXIgdGhpcyBFbWl0dGVyIGJlbG9uZ3MgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWd9IGNvbmZpZyAtIFNldHRpbmdzIGZvciB0aGlzIGVtaXR0ZXIuXHJcbiAqL1xyXG52YXIgUGFydGljbGVFbWl0dGVyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkJsZW5kTW9kZSxcclxuICAgICAgICBDb21wb25lbnRzLk1hc2ssXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUGFydGljbGVFbWl0dGVyIChtYW5hZ2VyLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEVtaXR0ZXIgTWFuYWdlciB0aGlzIEVtaXR0ZXIgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI21hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0ZXh0dXJlIGFzc2lnbmVkIHRvIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3RleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbWFuYWdlci50ZXh0dXJlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dHVyZSBmcmFtZXMgYXNzaWduZWQgdG8gcGFydGljbGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZnJhbWVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5GcmFtZVtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVzID0gWyBtYW5hZ2VyLmRlZmF1bHRGcmFtZSBdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVmYXVsdCB0ZXh0dXJlIGZyYW1lIGFzc2lnbmVkIHRvIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2RlZmF1bHRGcmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuRnJhbWV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RnJhbWUgPSBtYW5hZ2VyLmRlZmF1bHRGcmFtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTmFtZXMgb2Ygc2ltcGxlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2NvbmZpZ0Zhc3RNYXBcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnRmFzdE1hcCA9IFtcclxuICAgICAgICAgICAgJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgICdibGVuZE1vZGUnLFxyXG4gICAgICAgICAgICAnY29sbGlkZUJvdHRvbScsXHJcbiAgICAgICAgICAgICdjb2xsaWRlTGVmdCcsXHJcbiAgICAgICAgICAgICdjb2xsaWRlUmlnaHQnLFxyXG4gICAgICAgICAgICAnY29sbGlkZVRvcCcsXHJcbiAgICAgICAgICAgICdkZWF0aENhbGxiYWNrJyxcclxuICAgICAgICAgICAgJ2RlYXRoQ2FsbGJhY2tTY29wZScsXHJcbiAgICAgICAgICAgICdlbWl0Q2FsbGJhY2snLFxyXG4gICAgICAgICAgICAnZW1pdENhbGxiYWNrU2NvcGUnLFxyXG4gICAgICAgICAgICAnZm9sbG93JyxcclxuICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXHJcbiAgICAgICAgICAgICdncmF2aXR5WCcsXHJcbiAgICAgICAgICAgICdncmF2aXR5WScsXHJcbiAgICAgICAgICAgICdtYXhQYXJ0aWNsZXMnLFxyXG4gICAgICAgICAgICAnbmFtZScsXHJcbiAgICAgICAgICAgICdvbicsXHJcbiAgICAgICAgICAgICdwYXJ0aWNsZUJyaW5nVG9Ub3AnLFxyXG4gICAgICAgICAgICAncGFydGljbGVDbGFzcycsXHJcbiAgICAgICAgICAgICdyYWRpYWwnLFxyXG4gICAgICAgICAgICAndGltZVNjYWxlJyxcclxuICAgICAgICAgICAgJ3RyYWNrVmlzaWJsZScsXHJcbiAgICAgICAgICAgICd2aXNpYmxlJ1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE5hbWVzIG9mIGNvbXBsZXggY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjY29uZmlnT3BNYXBcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnT3BNYXAgPSBbXHJcbiAgICAgICAgICAgICdhY2NlbGVyYXRpb25YJyxcclxuICAgICAgICAgICAgJ2FjY2VsZXJhdGlvblknLFxyXG4gICAgICAgICAgICAnYW5nbGUnLFxyXG4gICAgICAgICAgICAnYWxwaGEnLFxyXG4gICAgICAgICAgICAnYm91bmNlJyxcclxuICAgICAgICAgICAgJ2RlbGF5JyxcclxuICAgICAgICAgICAgJ2xpZmVzcGFuJyxcclxuICAgICAgICAgICAgJ21heFZlbG9jaXR5WCcsXHJcbiAgICAgICAgICAgICdtYXhWZWxvY2l0eVknLFxyXG4gICAgICAgICAgICAnbW92ZVRvWCcsXHJcbiAgICAgICAgICAgICdtb3ZlVG9ZJyxcclxuICAgICAgICAgICAgJ3F1YW50aXR5JyxcclxuICAgICAgICAgICAgJ3JvdGF0ZScsXHJcbiAgICAgICAgICAgICdzY2FsZVgnLFxyXG4gICAgICAgICAgICAnc2NhbGVZJyxcclxuICAgICAgICAgICAgJ3NwZWVkWCcsXHJcbiAgICAgICAgICAgICdzcGVlZFknLFxyXG4gICAgICAgICAgICAndGludCcsXHJcbiAgICAgICAgICAgICd4JyxcclxuICAgICAgICAgICAgJ3knXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRW1wdHkgYnkgZGVmYXVsdCBhbmQgbmV2ZXIgcG9wdWxhdGVkIGJ5IFBoYXNlciwgdGhpcyBpcyBsZWZ0IGZvciBkZXZlbG9wZXJzIHRvIHVzZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICcnXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gJyc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBQYXJ0aWNsZSBDbGFzcyB3aGljaCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGhpcyBFbWl0dGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcGFydGljbGVDbGFzc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhcnRpY2xlQ2xhc3MgPSBQYXJ0aWNsZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcGFydGljbGUgb3JpZ2luICh3aGVyZSBwYXJ0aWNsZXMgd2lsbCBiZSBlbWl0dGVkKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3hcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0UG9zaXRpb25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ3gnLCAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcGFydGljbGUgb3JpZ2luICh3aGVyZSBwYXJ0aWNsZXMgd2lsbCBiZSBlbWl0dGVkKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3lcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0UG9zaXRpb25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ3knLCAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByYWRpYWwgZW1pdHRlciB3aWxsIGVtaXQgcGFydGljbGVzIGluIGFsbCBkaXJlY3Rpb25zIGJldHdlZW4gYW5nbGUgbWluIGFuZCBtYXgsXHJcbiAgICAgICAgICogdXNpbmcge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NwZWVkfSBhcyB0aGUgdmFsdWUuIElmIHNldCB0byBmYWxzZSB0aGVuIHRoaXMgYWN0cyBhcyBhIHBvaW50IEVtaXR0ZXIuXHJcbiAgICAgICAgICogQSBwb2ludCBlbWl0dGVyIHdpbGwgZW1pdCBwYXJ0aWNsZXMgb25seSBpbiB0aGUgZGlyZWN0aW9uIGRlcml2ZWQgZnJvbSB0aGUgc3BlZWRYIGFuZCBzcGVlZFkgdmFsdWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcmFkaWFsXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0UmFkaWFsXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yYWRpYWwgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb3Jpem9udGFsIGFjY2VsZXJhdGlvbiBhcHBsaWVkIHRvIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZ3Jhdml0eVhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEdyYXZpdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdyYXZpdHlYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVmVydGljYWwgYWNjZWxlcmF0aW9uIGFwcGxpZWQgdG8gZW1pdHRlZCBwYXJ0aWNsZXMsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNncmF2aXR5WVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0R3Jhdml0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ3Jhdml0eVkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIGFjY2VsZXJhdGlvblggYW5kIGFjY2VsZXJhdGlvblkgYXJlIG5vbi16ZXJvLiBTZXQgYXV0b21hdGljYWxseSBkdXJpbmcgY29uZmlndXJhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FjY2VsZXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9yaXpvbnRhbCBhY2NlbGVyYXRpb24gYXBwbGllZCB0byBlbWl0dGVkIHBhcnRpY2xlcywgaW4gcGl4ZWxzIHBlciBzZWNvbmQgc3F1YXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FjY2VsZXJhdGlvblhcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uWCA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnYWNjZWxlcmF0aW9uWCcsIDAsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBWZXJ0aWNhbCBhY2NlbGVyYXRpb24gYXBwbGllZCB0byBlbWl0dGVkIHBhcnRpY2xlcywgaW4gcGl4ZWxzIHBlciBzZWNvbmQgc3F1YXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FjY2VsZXJhdGlvbllcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uWSA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnYWNjZWxlcmF0aW9uWScsIDAsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBob3Jpem9udGFsIHZlbG9jaXR5IG9mIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjbWF4VmVsb2NpdHlYXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDEwMDAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhWZWxvY2l0eVggPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ21heFZlbG9jaXR5WCcsIDEwMDAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1heGltdW0gdmVydGljYWwgdmVsb2NpdHkgb2YgZW1pdHRlZCBwYXJ0aWNsZXMsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNtYXhWZWxvY2l0eVlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTAwMDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFZlbG9jaXR5WSA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnbWF4VmVsb2NpdHlZJywgMTAwMDAsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW5pdGlhbCBob3Jpem9udGFsIHNwZWVkIG9mIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NwZWVkWFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRTcGVlZFhcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNwZWVkWCA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnc3BlZWRYJywgMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbml0aWFsIHZlcnRpY2FsIHNwZWVkIG9mIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NwZWVkWVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRTcGVlZFlcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNwZWVkWSA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnc3BlZWRZJywgMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgbW92ZVRvWCBhbmQgbW92ZVRvWSBhcmUgbm9uemVyby4gU2V0IGF1dG9tYXRpY2FsbHkgZHVyaW5nIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNtb3ZlVG9cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW92ZVRvID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4LWNvb3JkaW5hdGUgZW1pdHRlZCBwYXJ0aWNsZXMgbW92ZSB0b3dhcmQsIHdoZW4ge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI21vdmVUb30gaXMgdHJ1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI21vdmVUb1hcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW92ZVRvWCA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnbW92ZVRvWCcsIDAsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeS1jb29yZGluYXRlIGVtaXR0ZWQgcGFydGljbGVzIG1vdmUgdG93YXJkLCB3aGVuIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNtb3ZlVG99IGlzIHRydWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNtb3ZlVG9ZXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1vdmVUb1kgPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ21vdmVUb1knLCAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciBwYXJ0aWNsZXMgd2lsbCByZWJvdW5kIHdoZW4gdGhleSBtZWV0IHRoZSBlbWl0dGVyIGJvdW5kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2JvdW5jZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib3VuY2UgPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ2JvdW5jZScsIDAsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NjYWxlWFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRTY2FsZVxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0U2NhbGVYXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2FsZVggPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ3NjYWxlWCcsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgc2NhbGUgb2YgZW1pdHRlZCBwYXJ0aWNsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzY2FsZVlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0U2NhbGVcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldFNjYWxlWVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NhbGVZID0gbmV3IEVtaXR0ZXJPcChjb25maWcsICdzY2FsZVknLCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29sb3IgdGludCBhcHBsaWVkIHRvIGVtaXR0ZWQgcGFydGljbGVzLiBBbnkgYWxwaGEgY29tcG9uZW50ICgweEFBMDAwMDAwKSBpcyBpZ25vcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjdGludFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAweGZmZmZmZmZmXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aW50ID0gbmV3IEVtaXR0ZXJPcChjb25maWcsICd0aW50JywgMHhmZmZmZmZmZik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbHBoYSAodHJhbnNwYXJlbmN5KSBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FscGhhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEFscGhhXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbHBoYSA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnYWxwaGEnLCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxpZmVzcGFuIG9mIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBtcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2xpZmVzcGFuXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDEwMDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldExpZmVzcGFuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saWZlc3BhbiA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnbGlmZXNwYW4nLCAxMDAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFuZ2xlIG9mIHRoZSBpbml0aWFsIHZlbG9jaXR5IG9mIGVtaXR0ZWQgcGFydGljbGVzLCBpbiBkZWdyZWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjYW5nbGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgeyBtaW46IDAsIG1heDogMzYwIH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEFuZ2xlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmdsZSA9IG5ldyBFbWl0dGVyT3AoY29uZmlnLCAnYW5nbGUnLCB7IG1pbjogMCwgbWF4OiAzNjAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByb3RhdGlvbiBvZiBlbWl0dGVkIHBhcnRpY2xlcywgaW4gZGVncmVlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3JvdGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcH1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yb3RhdGUgPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ3JvdGF0ZScsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIHBhcnRpY2xlIGlzIGVtaXR0ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNlbWl0Q2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW1pdENhbGxiYWNrID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbGxpbmcgY29udGV4dCBmb3Ige0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2VtaXRDYWxsYmFja30uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNlbWl0Q2FsbGJhY2tTY29wZVxyXG4gICAgICAgICAqIEB0eXBlIHs/Kn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbWl0Q2FsbGJhY2tTY29wZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgcGFydGljbGUgZGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2RlYXRoQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVEZWF0aENhbGxiYWNrfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlYXRoQ2FsbGJhY2sgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FsbGluZyBjb250ZXh0IGZvciB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZGVhdGhDYWxsYmFja30uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNkZWF0aENhbGxiYWNrU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7Pyp9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVhdGhDYWxsYmFja1Njb3BlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IHRvIGhhcmQgbGltaXQgdGhlIGFtb3VudCBvZiBwYXJ0aWNsZSBvYmplY3RzIHRoaXMgZW1pdHRlciBpcyBhbGxvd2VkIHRvIGNyZWF0ZS5cclxuICAgICAgICAgKiAwIG1lYW5zIHVubGltaXRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI21heFBhcnRpY2xlc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFBhcnRpY2xlcyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBtYW55IHBhcnRpY2xlcyBhcmUgZW1pdHRlZCBlYWNoIHRpbWUgcGFydGljbGVzIGFyZSBlbWl0dGVkIChvbmUgZXhwbG9zaW9uIG9yIG9uZSBmbG93IGN5Y2xlKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3F1YW50aXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEZyZXF1ZW5jeVxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0UXVhbnRpdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnF1YW50aXR5ID0gbmV3IEVtaXR0ZXJPcChjb25maWcsICdxdWFudGl0eScsIDEsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb3cgbWFueSBtcyB0byB3YWl0IGFmdGVyIGVtaXNzaW9uIGJlZm9yZSB0aGUgcGFydGljbGVzIHN0YXJ0IHVwZGF0aW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3B9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVsYXkgPSBuZXcgRW1pdHRlck9wKGNvbmZpZywgJ2RlbGF5JywgMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZvciBhIGZsb3cgZW1pdHRlciwgdGhlIHRpbWUgaW50ZXJ2YWwgKD49IDApIGJldHdlZW4gcGFydGljbGUgZmxvdyBjeWNsZXMgaW4gbXMuXHJcbiAgICAgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG9uZSBwYXJ0aWNsZSBmbG93IGN5Y2xlIGZvciBlYWNoIGxvZ2ljIHVwZGF0ZSAodGhlIG1heGltdW0gZmxvdyBmcmVxdWVuY3kpLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcuXHJcbiAgICAgICAgICogRm9yIGFuIGV4cGxvZGluZyBlbWl0dGVyLCB0aGlzIHZhbHVlIHdpbGwgYmUgLTEuXHJcbiAgICAgICAgICogQ2FsbGluZyB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZmxvd30gYWxzbyBwdXRzIHRoZSBlbWl0dGVyIGluIGZsb3cgbW9kZSAoZnJlcXVlbmN5ID49IDApLlxyXG4gICAgICAgICAqIENhbGxpbmcge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2V4cGxvZGV9IGFsc28gcHV0cyB0aGUgZW1pdHRlciBpbiBleHBsb2RlIG1vZGUgKGZyZXF1ZW5jeSA9IC0xKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2ZyZXF1ZW5jeVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0RnJlcXVlbmN5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb250cm9scyBpZiB0aGUgZW1pdHRlciBpcyBjdXJyZW50bHkgZW1pdHRpbmcgYSBwYXJ0aWNsZSBmbG93ICh3aGVuIGZyZXF1ZW5jeSA+PSAwKS5cclxuICAgICAgICAgKiBBbHJlYWR5IGFsaXZlIHBhcnRpY2xlcyB3aWxsIGNvbnRpbnVlIHRvIHVwZGF0ZSB1bnRpbCB0aGV5IGV4cGlyZS5cclxuICAgICAgICAgKiBDb250cm9sbGVkIGJ5IHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdGFydH0gYW5kIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdG9wfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI29uXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub24gPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBOZXdseSBlbWl0dGVkIHBhcnRpY2xlcyBhcmUgYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFydGljbGUgbGlzdCwgaS5lLiByZW5kZXJlZCBhYm92ZSB0aG9zZSBhbHJlYWR5IGFsaXZlLlxyXG4gICAgICAgICAqIFNldCB0byBmYWxzZSB0byBzZW5kIHRoZW0gdG8gdGhlIGJhY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNwYXJ0aWNsZUJyaW5nVG9Ub3BcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYXJ0aWNsZUJyaW5nVG9Ub3AgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZSByYXRlIGFwcGxpZWQgdG8gYWN0aXZlIHBhcnRpY2xlcywgYWZmZWN0aW5nIGxpZmVzcGFuLCBtb3ZlbWVudCwgYW5kIHR3ZWVucy4gVmFsdWVzIGxhcmdlciB0aGFuIDEgYXJlIGZhc3RlciB0aGFuIG5vcm1hbC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgYSBzaGFwZSB0byBlbWl0IHBhcnRpY2xlcyBmcm9tLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZW1pdFpvbmVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmV8UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5SYW5kb21ab25lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEVtaXRab25lXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbWl0Wm9uZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIG9iamVjdCBkZXNjcmliaW5nIGEgc2hhcGUgdGhhdCBkZWFjdGl2YXRlcyBwYXJ0aWNsZXMgd2hlbiB0aGV5IGludGVyYWN0IHdpdGggaXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNkZWF0aFpvbmVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRGVhdGhab25lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldERlYXRoWm9uZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVhdGhab25lID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWN0YW5ndWxhciBib3VuZGFyeSBjb25zdHJhaW5pbmcgcGFydGljbGUgbW92ZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNib3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5HZW9tLlJlY3RhbmdsZX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRCb3VuZHNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgcGFydGljbGVzIGludGVyYWN0IHdpdGggdGhlIGxlZnQgZWRnZSBvZiB0aGUgZW1pdHRlciB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjYm91bmRzfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2NvbGxpZGVMZWZ0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZUxlZnQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHBhcnRpY2xlcyBpbnRlcmFjdCB3aXRoIHRoZSByaWdodCBlZGdlIG9mIHRoZSBlbWl0dGVyIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNib3VuZHN9LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjY29sbGlkZVJpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZVJpZ2h0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciBwYXJ0aWNsZXMgaW50ZXJhY3Qgd2l0aCB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGVtaXR0ZXIge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2JvdW5kc30uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNjb2xsaWRlVG9wXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZVRvcCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgcGFydGljbGVzIGludGVyYWN0IHdpdGggdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBlbWl0dGVyIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNib3VuZHN9LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjY29sbGlkZUJvdHRvbVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbGxpZGVCb3R0b20gPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgZW1pdHRlciB1cGRhdGVzIGl0c2VsZiBhbmQgaXRzIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIENvbnRyb2xsZWQgYnkge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3BhdXNlfVxyXG4gICAgICAgICAqIGFuZCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcmVzdW1lfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FjdGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNldCB0aGlzIHRvIGZhbHNlIHRvIGhpZGUgYW55IGFjdGl2ZSBwYXJ0aWNsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciN2aXNpYmxlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0VmlzaWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBibGVuZCBtb2RlIG9mIHRoaXMgZW1pdHRlcidzIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2JsZW5kTW9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0QmxlbmRNb2RlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSBCbGVuZE1vZGVzLk5PUk1BTDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBHYW1lIE9iamVjdCB3aG9zZSBwb3NpdGlvbiBpcyB1c2VkIGFzIHRoZSBwYXJ0aWNsZSBvcmlnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmb2xsb3dcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3N0YXJ0Rm9sbG93XHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdG9wRm9sbG93XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mb2xsb3cgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBwYXJ0aWNsZSBvcmlnaW4gZnJvbSB0aGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2ZvbGxvd30gdGFyZ2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZm9sbG93T2Zmc2V0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdGFydEZvbGxvd1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZm9sbG93T2Zmc2V0ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgZW1pdHRlcidzIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciN2aXNpYmxlfSBzdGF0ZSB3aWxsIHRyYWNrXHJcbiAgICAgICAgICogdGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmb2xsb3d9IHRhcmdldCdzIHZpc2liaWxpdHkgc3RhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciN0cmFja1Zpc2libGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc3RhcnRGb2xsb3dcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRyYWNrVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCB0ZXh0dXJlIGZyYW1lLCBhcyBhbiBpbmRleCBvZiB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZnJhbWVzfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2N1cnJlbnRGcmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEZyYW1lXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRleHR1cmUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2ZyYW1lc30gYXJlIHNlbGVjdGVkIGF0IHJhbmRvbS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3JhbmRvbUZyYW1lXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0RnJhbWVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJhbmRvbUZyYW1lID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBwYXJ0aWNsZXMgdGhhdCByZWNlaXZlIGEgc2luZ2xlIHRleHR1cmUgZnJhbWUgKHBlciBmcmFtZSBjeWNsZSkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmcmFtZVF1YW50aXR5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0RnJhbWVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lUXVhbnRpdHkgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmFjdGl2ZSBwYXJ0aWNsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNkZWFkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVbXX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVhZCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBY3RpdmUgcGFydGljbGVzXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNhbGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlW119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFsaXZlID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lIHVudGlsIHRoZSBuZXh0IGZsb3cgY3ljbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNfY291bnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvdW50cyB1cCB0byB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZnJhbWVRdWFudGl0eX0uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNfZnJhbWVDb3VudGVyXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZnJhbWVDb3VudGVyID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbUpTT04oY29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVyZ2VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW50byB0aGUgZW1pdHRlcidzIGN1cnJlbnQgc2V0dGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmcm9tSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlckNvbmZpZ30gY29uZmlnIC0gU2V0dGluZ3MgZm9yIHRoaXMgZW1pdHRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIGZyb21KU09OOiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgT25seSB1cGRhdGUgcHJvcGVydGllcyBmcm9tIHRoZWlyIGN1cnJlbnQgc3RhdGUgaWYgdGhleSBleGlzdCBpbiB0aGUgZ2l2ZW4gY29uZmlnXHJcblxyXG4gICAgICAgIHZhciBpID0gMDtcclxuICAgICAgICB2YXIga2V5ID0gJyc7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNvbmZpZ0Zhc3RNYXAubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSB0aGlzLmNvbmZpZ0Zhc3RNYXBbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoSGFzVmFsdWUoY29uZmlnLCBrZXkpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCBrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb25maWdPcE1hcC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleSA9IHRoaXMuY29uZmlnT3BNYXBbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoSGFzVmFsdWUoY29uZmlnLCBrZXkpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0ubG9hZENvbmZpZyhjb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbiA9ICh0aGlzLmFjY2VsZXJhdGlvblgucHJvcGVydHlWYWx1ZSAhPT0gMCB8fCB0aGlzLmFjY2VsZXJhdGlvblkucHJvcGVydHlWYWx1ZSAhPT0gMCk7XHJcblxyXG4gICAgICAgIHRoaXMubW92ZVRvID0gKHRoaXMubW92ZVRvWC5wcm9wZXJ0eVZhbHVlICE9PSAwIHx8IHRoaXMubW92ZVRvWS5wcm9wZXJ0eVZhbHVlICE9PSAwKTtcclxuXHJcbiAgICAgICAgLy8gIFNwZWNpYWwgJ3NwZWVkJyBvdmVycmlkZVxyXG5cclxuICAgICAgICBpZiAoSGFzVmFsdWUoY29uZmlnLCAnc3BlZWQnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3BlZWRYLmxvYWRDb25maWcoY29uZmlnLCAnc3BlZWQnKTtcclxuICAgICAgICAgICAgdGhpcy5zcGVlZFkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIElmIHlvdSBzcGVjaWZ5IHNwZWVkWCwgc3BlZWRZIG9yIG1vdmVUbyB0aGVuIGl0IGNoYW5nZXMgdGhlIGVtaXR0ZXIgZnJvbSByYWRpYWwgdG8gYSBwb2ludCBlbWl0dGVyXHJcbiAgICAgICAgaWYgKEhhc0FueShjb25maWcsIFsgJ3NwZWVkWCcsICdzcGVlZFknIF0pIHx8IHRoaXMubW92ZVRvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yYWRpYWwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBTcGVjaWFsICdzY2FsZScgb3ZlcnJpZGVcclxuXHJcbiAgICAgICAgaWYgKEhhc1ZhbHVlKGNvbmZpZywgJ3NjYWxlJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjYWxlWC5sb2FkQ29uZmlnKGNvbmZpZywgJ3NjYWxlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChIYXNWYWx1ZShjb25maWcsICdjYWxsYmFja1Njb3BlJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FsbGJhY2tTY29wZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdjYWxsYmFja1Njb3BlJywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXRDYWxsYmFja1Njb3BlID0gY2FsbGJhY2tTY29wZTtcclxuICAgICAgICAgICAgdGhpcy5kZWF0aENhbGxiYWNrU2NvcGUgPSBjYWxsYmFja1Njb3BlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEhhc1ZhbHVlKGNvbmZpZywgJ2VtaXRab25lJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEVtaXRab25lKGNvbmZpZy5lbWl0Wm9uZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoSGFzVmFsdWUoY29uZmlnLCAnZGVhdGhab25lJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldERlYXRoWm9uZShjb25maWcuZGVhdGhab25lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChIYXNWYWx1ZShjb25maWcsICdib3VuZHMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm91bmRzKGNvbmZpZy5ib3VuZHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEhhc1ZhbHVlKGNvbmZpZywgJ2ZvbGxvd09mZnNldCcpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mb2xsb3dPZmZzZXQuc2V0RnJvbU9iamVjdChHZXRGYXN0VmFsdWUoY29uZmlnLCAnZm9sbG93T2Zmc2V0JywgMCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEhhc1ZhbHVlKGNvbmZpZywgJ2ZyYW1lJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEZyYW1lKGNvbmZpZy5mcmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBlbWl0dGVyIHN1aXRhYmxlIGZvciBKU09OIHNlcmlhbGl6YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciN0b0pTT05cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3V0cHV0XSAtIEFuIG9iamVjdCB0byBjb3B5IG91dHB1dCBpbnRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgb3V0cHV0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdG9KU09OOiBmdW5jdGlvbiAob3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSB7fTsgfVxyXG5cclxuICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgdmFyIGtleSA9ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb25maWdGYXN0TWFwLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5ID0gdGhpcy5jb25maWdGYXN0TWFwW2ldO1xyXG5cclxuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSB0aGlzW2tleV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb25maWdPcE1hcC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleSA9IHRoaXMuY29uZmlnT3BNYXBbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpc1trZXldKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRba2V5XSA9IHRoaXNba2V5XS50b0pTT04oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIHNwZWNpYWwgaGFuZGxlcnNcclxuICAgICAgICBpZiAoIXRoaXMuc3BlZWRZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsZXRlIG91dHB1dC5zcGVlZFg7XHJcbiAgICAgICAgICAgIG91dHB1dC5zcGVlZCA9IHRoaXMuc3BlZWRYLnRvSlNPTigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjYWxlWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvdXRwdXQuc2NhbGVYO1xyXG4gICAgICAgICAgICBvdXRwdXQuc2NhbGUgPSB0aGlzLnNjYWxlWC50b0pTT04oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGludW91c2x5IG1vdmVzIHRoZSBwYXJ0aWNsZSBvcmlnaW4gdG8gZm9sbG93IGEgR2FtZSBPYmplY3QncyBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3N0YXJ0Rm9sbG93XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSB0YXJnZXQgLSBUaGUgR2FtZSBPYmplY3QgdG8gZm9sbG93LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYPTBdIC0gSG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBhcnRpY2xlIG9yaWdpbiBmcm9tIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WT0wXSAtIFZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcGFydGljbGUgb3JpZ2luIGZyb20gdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdHJhY2tWaXNpYmxlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGVtaXR0ZXIncyB2aXNpYmxlIHN0YXRlIHdpbGwgdHJhY2sgdGhlIHRhcmdldCdzIHZpc2libGUgc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzdGFydEZvbGxvdzogZnVuY3Rpb24gKHRhcmdldCwgb2Zmc2V0WCwgb2Zmc2V0WSwgdHJhY2tWaXNpYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvZmZzZXRYID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WCA9IDA7IH1cclxuICAgICAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHRyYWNrVmlzaWJsZSA9PT0gdW5kZWZpbmVkKSB7IHRyYWNrVmlzaWJsZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9sbG93ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMuZm9sbG93T2Zmc2V0LnNldChvZmZzZXRYLCBvZmZzZXRZKTtcclxuICAgICAgICB0aGlzLnRyYWNrVmlzaWJsZSA9IHRyYWNrVmlzaWJsZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgZm9sbG93aW5nIGEgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdG9wRm9sbG93XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHN0b3BGb2xsb3c6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mb2xsb3cgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZm9sbG93T2Zmc2V0LnNldCgwLCAwKTtcclxuICAgICAgICB0aGlzLnRyYWNrVmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaG9vc2VzIGEgdGV4dHVyZSBmcmFtZSBmcm9tIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmcmFtZXN9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZ2V0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gVGhlIHRleHR1cmUgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIGdldEZyYW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmZyYW1lcy5sZW5ndGggPT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RnJhbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMucmFuZG9tRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gR2V0UmFuZG9tKHRoaXMuZnJhbWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5mcmFtZXNbdGhpcy5jdXJyZW50RnJhbWVdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZnJhbWVDb3VudGVyKys7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZnJhbWVDb3VudGVyID09PSB0aGlzLmZyYW1lUXVhbnRpdHkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lQ291bnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IFdyYXAodGhpcy5jdXJyZW50RnJhbWUgKyAxLCAwLCB0aGlzLl9mcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmcmFtZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGZyYW1lOiAwXHJcbiAgICAvLyBmcmFtZTogJ3JlZCdcclxuICAgIC8vIGZyYW1lOiBbIDAsIDEsIDIsIDMgXVxyXG4gICAgLy8gZnJhbWU6IFsgJ3JlZCcsICdncmVlbicsICdibHVlJywgJ3BpbmsnLCAnd2hpdGUnIF1cclxuICAgIC8vIGZyYW1lOiB7IGZyYW1lczogWyAncmVkJywgJ2dyZWVuJywgJ2JsdWUnLCAncGluaycsICd3aGl0ZScgXSwgW2N5Y2xlOiBib29sXSwgW3F1YW50aXR5OiBpbnRdIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBwYXR0ZXJuIGZvciBhc3NpZ25pbmcgdGV4dHVyZSBmcmFtZXMgdG8gZW1pdHRlZCBwYXJ0aWNsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoYXJyYXl8c3RyaW5nfGludGVnZXJ8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJGcmFtZUNvbmZpZyl9IGZyYW1lcyAtIE9uZSBvciBtb3JlIHRleHR1cmUgZnJhbWVzLCBvciBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGlja1JhbmRvbT10cnVlXSAtIFdoZXRoZXIgZnJhbWVzIHNob3VsZCBiZSBhc3NpZ25lZCBhdCByYW5kb20gZnJvbSBgZnJhbWVzYC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3F1YW50aXR5PTFdIC0gVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBwYXJ0aWNsZXMgdGhhdCB3aWxsIHJlY2VpdmUgZWFjaCBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldEZyYW1lOiBmdW5jdGlvbiAoZnJhbWVzLCBwaWNrUmFuZG9tLCBxdWFudGl0eSlcclxuICAgIHtcclxuICAgICAgICBpZiAocGlja1JhbmRvbSA9PT0gdW5kZWZpbmVkKSB7IHBpY2tSYW5kb20gPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHF1YW50aXR5ID09PSB1bmRlZmluZWQpIHsgcXVhbnRpdHkgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMucmFuZG9tRnJhbWUgPSBwaWNrUmFuZG9tO1xyXG4gICAgICAgIHRoaXMuZnJhbWVRdWFudGl0eSA9IHF1YW50aXR5O1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gMDtcclxuICAgICAgICB0aGlzLl9mcmFtZUNvdW50ZXIgPSAwO1xyXG5cclxuICAgICAgICB2YXIgdCA9IHR5cGVvZiAoZnJhbWVzKTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZnJhbWVzKSB8fCB0ID09PSAnc3RyaW5nJyB8fCB0ID09PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5zZXRFbWl0dGVyRnJhbWVzKGZyYW1lcywgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZyYW1lQ29uZmlnID0gZnJhbWVzO1xyXG5cclxuICAgICAgICAgICAgZnJhbWVzID0gR2V0RmFzdFZhbHVlKGZyYW1lQ29uZmlnLCAnZnJhbWVzJywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZnJhbWVzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXIuc2V0RW1pdHRlckZyYW1lcyhmcmFtZXMsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgaXNDeWNsZSA9IEdldEZhc3RWYWx1ZShmcmFtZUNvbmZpZywgJ2N5Y2xlJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yYW5kb21GcmFtZSA9IChpc0N5Y2xlKSA/IGZhbHNlIDogdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVRdWFudGl0eSA9IEdldEZhc3RWYWx1ZShmcmFtZUNvbmZpZywgJ3F1YW50aXR5JywgcXVhbnRpdHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZnJhbWVMZW5ndGggPSB0aGlzLmZyYW1lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUxlbmd0aCA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVRdWFudGl0eSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZG9tRnJhbWUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR1cm5zIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNyYWRpYWx9IHBhcnRpY2xlIG1vdmVtZW50IG9uIG9yIG9mZi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldFJhZGlhbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBSYWRpYWwgbW9kZSAodHJ1ZSkgb3IgcG9pbnQgbW9kZSAodHJ1ZSkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzZXRSYWRpYWw6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5yYWRpYWwgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGVtaXR0ZXIncyBwYXJ0aWNsZSBvcmlnaW4uXHJcbiAgICAgKiBOZXcgcGFydGljbGVzIHdpbGwgYmUgZW1pdHRlZCBoZXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0UG9zaXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPbkVtaXRUeXBlfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcGFydGljbGUgb3JpZ2luLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV9IHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwYXJ0aWNsZSBvcmlnaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54Lm9uQ2hhbmdlKHgpO1xyXG4gICAgICAgIHRoaXMueS5vbkNoYW5nZSh5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBtb2RpZmllcyBhIHJlY3Rhbmd1bGFyIGJvdW5kYXJ5IGNvbnN0cmFpbmluZyB0aGUgcGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIFRvIHJlbW92ZSB0aGUgYm91bmRhcnksIHNldCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjYm91bmRzfSB0byBudWxsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJCb3VuZHN8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJCb3VuZHNBbHQpfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3VuZGFyeSwgb3IgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJvdW5kYXJ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBib3VuZGFyeS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBib3VuZGFyeS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5kczogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBvYmogPSB4O1xyXG5cclxuICAgICAgICAgICAgeCA9IG9iai54O1xyXG4gICAgICAgICAgICB5ID0gb2JqLnk7XHJcbiAgICAgICAgICAgIHdpZHRoID0gKEhhc1ZhbHVlKG9iaiwgJ3cnKSkgPyBvYmoudyA6IG9iai53aWR0aDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gKEhhc1ZhbHVlKG9iaiwgJ2gnKSkgPyBvYmouaCA6IG9iai5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ib3VuZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kcy5zZXRUbyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW5pdGlhbCBob3Jpem9udGFsIHNwZWVkIG9mIGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICogQ2hhbmdlcyB0aGUgZW1pdHRlciB0byBwb2ludCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0U3BlZWRYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25FbWl0VHlwZX0gdmFsdWUgLSBUaGUgc3BlZWQsIGluIHBpeGVscyBwZXIgc2Vjb25kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0U3BlZWRYOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zcGVlZFgub25DaGFuZ2UodmFsdWUpO1xyXG5cclxuICAgICAgICAvLyAgSWYgeW91IHNwZWNpZnkgc3BlZWRYIGFuZCBZIHRoZW4gaXQgY2hhbmdlcyB0aGUgZW1pdHRlciBmcm9tIHJhZGlhbCB0byBhIHBvaW50IGVtaXR0ZXJcclxuICAgICAgICB0aGlzLnJhZGlhbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHZlcnRpY2FsIHNwZWVkIG9mIGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICogQ2hhbmdlcyB0aGUgZW1pdHRlciB0byBwb2ludCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0U3BlZWRZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25FbWl0VHlwZX0gdmFsdWUgLSBUaGUgc3BlZWQsIGluIHBpeGVscyBwZXIgc2Vjb25kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0U3BlZWRZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3BlZWRZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zcGVlZFkub25DaGFuZ2UodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gIElmIHlvdSBzcGVjaWZ5IHNwZWVkWCBhbmQgWSB0aGVuIGl0IGNoYW5nZXMgdGhlIGVtaXR0ZXIgZnJvbSByYWRpYWwgdG8gYSBwb2ludCBlbWl0dGVyXHJcbiAgICAgICAgICAgIHRoaXMucmFkaWFsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbml0aWFsIHJhZGlhbCBzcGVlZCBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAqIENoYW5nZXMgdGhlIGVtaXR0ZXIgdG8gcmFkaWFsIG1vZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRTcGVlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV9IHZhbHVlIC0gVGhlIHNwZWVkLCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldFNwZWVkOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zcGVlZFgub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3BlZWRZID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gIElmIHlvdSBzcGVjaWZ5IHNwZWVkWCBhbmQgWSB0aGVuIGl0IGNoYW5nZXMgdGhlIGVtaXR0ZXIgZnJvbSByYWRpYWwgdG8gYSBwb2ludCBlbWl0dGVyXHJcbiAgICAgICAgdGhpcy5yYWRpYWwgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIHNjYWxlIG9mIGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0U2NhbGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPblVwZGF0ZVR5cGUpfSB2YWx1ZSAtIFRoZSBzY2FsZSwgcmVsYXRpdmUgdG8gMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldFNjYWxlWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2NhbGVYLm9uQ2hhbmdlKHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVydGljYWwgc2NhbGUgb2YgZW1pdHRlZCBwYXJ0aWNsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRTY2FsZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25FbWl0VHlwZXxQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uVXBkYXRlVHlwZSl9IHZhbHVlIC0gVGhlIHNjYWxlLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0U2NhbGVZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zY2FsZVkub25DaGFuZ2UodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzY2FsZSBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldFNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPblVwZGF0ZVR5cGUpfSB2YWx1ZSAtIFRoZSBzY2FsZSwgcmVsYXRpdmUgdG8gMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldFNjYWxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zY2FsZVgub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2NhbGVZID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBncmF2aXR5IGFwcGxpZWQgdG8gZW1pdHRlZCBwYXJ0aWNsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRHcmF2aXR5WFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gQWNjZWxlcmF0aW9uIGR1ZSB0byBncmF2aXR5LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0R3Jhdml0eVg6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdyYXZpdHlYID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZlcnRpY2FsIGdyYXZpdHkgYXBwbGllZCB0byBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEdyYXZpdHlZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBY2NlbGVyYXRpb24gZHVlIHRvIGdyYXZpdHksIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzZXRHcmF2aXR5WTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ3Jhdml0eVkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZ3Jhdml0eSBhcHBsaWVkIHRvIGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0R3Jhdml0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBIb3Jpem9udGFsIGFjY2VsZXJhdGlvbiBkdWUgdG8gZ3Jhdml0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQgc3F1YXJlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVmVydGljYWwgYWNjZWxlcmF0aW9uIGR1ZSB0byBncmF2aXR5LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0R3Jhdml0eTogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ncmF2aXR5WCA9IHg7XHJcbiAgICAgICAgdGhpcy5ncmF2aXR5WSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG9wYWNpdHkgb2YgZW1pdHRlZCBwYXJ0aWNsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPbkVtaXRUeXBlfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25VcGRhdGVUeXBlKX0gdmFsdWUgLSBBIHZhbHVlIGJldHdlZW4gMCAodHJhbnNwYXJlbnQpIGFuZCAxIChvcGFxdWUpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFscGhhLm9uQ2hhbmdlKHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29sb3IgdGludCBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldFRpbnRcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPblVwZGF0ZVR5cGUpfSB2YWx1ZSAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAweGZmZmZmZi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldFRpbnQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRpbnQub25DaGFuZ2UodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbmdsZSBvZiBhIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNyYWRpYWx9IHBhcnRpY2xlIHN0cmVhbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEVtaXR0ZXJBbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV9IHZhbHVlIC0gVGhlIGFuZ2xlIG9mIHRoZSBpbml0aWFsIHZlbG9jaXR5IG9mIGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0RW1pdHRlckFuZ2xlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmdsZS5vbkNoYW5nZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFuZ2xlIG9mIGEge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3JhZGlhbH0gcGFydGljbGUgc3RyZWFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0QW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPbkVtaXRUeXBlfSB2YWx1ZSAtIFRoZSBhbmdsZSBvZiB0aGUgaW5pdGlhbCB2ZWxvY2l0eSBvZiBlbWl0dGVkIHBhcnRpY2xlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldEFuZ2xlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmdsZS5vbkNoYW5nZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxpZmVzcGFuIG9mIG5ld2x5IGVtaXR0ZWQgcGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0TGlmZXNwYW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyT3BPbkVtaXRUeXBlfSB2YWx1ZSAtIFRoZSBwYXJ0aWNsZSBsaWZlc3BhbiwgaW4gbXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzZXRMaWZlc3BhbjogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlmZXNwYW4ub25DaGFuZ2UodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGFydGljbGVzIHJlbGVhc2VkIGF0IGVhY2ggZmxvdyBjeWNsZSBvciBleHBsb3Npb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzZXRRdWFudGl0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJPcE9uRW1pdFR5cGV9IHF1YW50aXR5IC0gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gcmVsZWFzZSBhdCBlYWNoIGZsb3cgY3ljbGUgb3IgZXhwbG9zaW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0UXVhbnRpdHk6IGZ1bmN0aW9uIChxdWFudGl0eSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnF1YW50aXR5Lm9uQ2hhbmdlKHF1YW50aXR5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZW1pdHRlcidzIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmcmVxdWVuY3l9XHJcbiAgICAgKiBhbmQge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3F1YW50aXR5fS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldEZyZXF1ZW5jeVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyZXF1ZW5jeSAtIFRoZSB0aW1lIGludGVydmFsICg+PSAwKSBvZiBlYWNoIGZsb3cgY3ljbGUsIGluIG1zOyBvciAtMSB0byBwdXQgdGhlIGVtaXR0ZXIgaW4gZXhwbG9zaW9uIG1vZGUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25FbWl0VHlwZX0gW3F1YW50aXR5XSAtIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHRvIHJlbGVhc2UgYXQgZWFjaCBmbG93IGN5Y2xlIG9yIGV4cGxvc2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHNldEZyZXF1ZW5jeTogZnVuY3Rpb24gKGZyZXF1ZW5jeSwgcXVhbnRpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xyXG5cclxuICAgICAgICBpZiAocXVhbnRpdHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnF1YW50aXR5Lm9uQ2hhbmdlKHF1YW50aXR5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgcmVtb3ZlcyB0aGUge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2VtaXRab25lfS5cclxuICAgICAqXHJcbiAgICAgKiBBbiB7QGxpbmsgUGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJFZGdlWm9uZUNvbmZpZyBFZGdlWm9uZX0gcGxhY2VzIHBhcnRpY2xlcyBvbiBpdHMgZWRnZXMuIEl0cyB7QGxpbmsgUGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FZGdlWm9uZVNvdXJjZSBzb3VyY2V9IGNhbiBiZSBhIEN1cnZlLCBQYXRoLCBDaXJjbGUsIEVsbGlwc2UsIExpbmUsIFBvbHlnb24sIFJlY3RhbmdsZSwgb3IgVHJpYW5nbGU7IG9yIGFueSBvYmplY3Qgd2l0aCBhIHN1aXRhYmxlIHtAbGluayBQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVkZ2Vab25lU291cmNlQ2FsbGJhY2sgZ2V0UG9pbnRzfSBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQSB7QGxpbmsgUGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJSYW5kb21ab25lQ29uZmlnIFJhbmRvbVpvbmV9IHBsYWNlcyByYW5kb21seSB3aXRoaW4gaXRzIGludGVyaW9yLiBJdHMge0BsaW5rIFJhbmRvbVpvbmVTb3VyY2Ugc291cmNlfSBjYW4gYmUgYSBDaXJjbGUsIEVsbGlwc2UsIExpbmUsIFBvbHlnb24sIFJlY3RhbmdsZSwgb3IgVHJpYW5nbGU7IG9yIGFueSBvYmplY3Qgd2l0aCBhIHN1aXRhYmxlIHtAbGluayBQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlJhbmRvbVpvbmVTb3VyY2VDYWxsYmFjayBnZXRSYW5kb21Qb2ludH0gbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc2V0RW1pdFpvbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJFZGdlWm9uZUNvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlclJhbmRvbVpvbmVDb25maWd9IFt6b25lQ29uZmlnXSAtIEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSB6b25lLCBvciBgdW5kZWZpbmVkYCB0byByZW1vdmUgYW55IGN1cnJlbnQgZW1pdCB6b25lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0RW1pdFpvbmU6IGZ1bmN0aW9uICh6b25lQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh6b25lQ29uZmlnID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRab25lID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdoZXJlIHNvdXJjZSA9IEdlb20gbGlrZSBDaXJjbGUsIG9yIGEgUGF0aCBvciBDdXJ2ZVxyXG4gICAgICAgICAgICAvLyAgZW1pdFpvbmU6IHsgdHlwZTogJ3JhbmRvbScsIHNvdXJjZTogWCB9XHJcbiAgICAgICAgICAgIC8vICBlbWl0Wm9uZTogeyB0eXBlOiAnZWRnZScsIHNvdXJjZTogWCwgcXVhbnRpdHk6IDMyLCBbc3RlcFJhdGU9MF0sIFt5b3lvPWZhbHNlXSwgW3NlYW1sZXNzPXRydWVdIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gR2V0RmFzdFZhbHVlKHpvbmVDb25maWcsICd0eXBlJywgJ3JhbmRvbScpO1xyXG4gICAgICAgICAgICB2YXIgc291cmNlID0gR2V0RmFzdFZhbHVlKHpvbmVDb25maWcsICdzb3VyY2UnLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncmFuZG9tJzpcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0Wm9uZSA9IG5ldyBSYW5kb21ab25lKHNvdXJjZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2VkZ2UnOlxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbnRpdHkgPSBHZXRGYXN0VmFsdWUoem9uZUNvbmZpZywgJ3F1YW50aXR5JywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBSYXRlID0gR2V0RmFzdFZhbHVlKHpvbmVDb25maWcsICdzdGVwUmF0ZScsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB5b3lvID0gR2V0RmFzdFZhbHVlKHpvbmVDb25maWcsICd5b3lvJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFtbGVzcyA9IEdldEZhc3RWYWx1ZSh6b25lQ29uZmlnLCAnc2VhbWxlc3MnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0Wm9uZSA9IG5ldyBFZGdlWm9uZShzb3VyY2UsIHF1YW50aXR5LCBzdGVwUmF0ZSwgeW95bywgc2VhbWxlc3MpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciByZW1vdmVzIHRoZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZGVhdGhab25lfS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI3NldERlYXRoWm9uZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlckRlYXRoWm9uZUNvbmZpZ30gW3pvbmVDb25maWddIC0gQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHpvbmUsIG9yIGB1bmRlZmluZWRgIHRvIHJlbW92ZSBhbnkgY3VycmVudCBkZWF0aCB6b25lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc2V0RGVhdGhab25lOiBmdW5jdGlvbiAoem9uZUNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoem9uZUNvbmZpZyA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kZWF0aFpvbmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgV2hlcmUgc291cmNlID0gR2VvbSBsaWtlIENpcmNsZSBvciBSZWN0IHRoYXQgc3VwcG9ydHMgYSAnY29udGFpbnMnIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgIC8vICBkZWF0aFpvbmU6IHsgdHlwZTogJ29uRW50ZXInLCBzb3VyY2U6IFggfVxyXG4gICAgICAgICAgICAvLyAgZGVhdGhab25lOiB7IHR5cGU6ICdvbkxlYXZlJywgc291cmNlOiBYIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gR2V0RmFzdFZhbHVlKHpvbmVDb25maWcsICd0eXBlJywgJ29uRW50ZXInKTtcclxuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IEdldEZhc3RWYWx1ZSh6b25lQ29uZmlnLCAnc291cmNlJywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UuY29udGFpbnMgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBraWxsT25FbnRlciA9ICh0eXBlID09PSAnb25FbnRlcicpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGVhdGhab25lID0gbmV3IERlYXRoWm9uZShzb3VyY2UsIGtpbGxPbkVudGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBpbmFjdGl2ZSBwYXJ0aWNsZXMgYW5kIGFkZHMgdGhlbSB0byB0aGlzIGVtaXR0ZXIncyBwb29sLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcmVzZXJ2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBwYXJ0aWNsZUNvdW50IC0gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gY3JlYXRlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgcmVzZXJ2ZTogZnVuY3Rpb24gKHBhcnRpY2xlQ291bnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRlYWQgPSB0aGlzLmRlYWQ7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydGljbGVDb3VudDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVhZC5wdXNoKG5ldyB0aGlzLnBhcnRpY2xlQ2xhc3ModGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSAoaW4tdXNlKSBwYXJ0aWNsZXMgaW4gdGhpcyBlbWl0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZ2V0QWxpdmVQYXJ0aWNsZUNvdW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB3aXRoIGBhY3RpdmU9dHJ1ZWAuXHJcbiAgICAgKi9cclxuICAgIGdldEFsaXZlUGFydGljbGVDb3VudDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbGl2ZS5sZW5ndGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGluYWN0aXZlIChhdmFpbGFibGUpIHBhcnRpY2xlcyBpbiB0aGlzIGVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNnZXREZWFkUGFydGljbGVDb3VudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgd2l0aCBgYWN0aXZlPWZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgZ2V0RGVhZFBhcnRpY2xlQ291bnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVhZC5sZW5ndGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2xlcyBpbiB0aGlzIGVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNnZXRQYXJ0aWNsZUNvdW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcywgaW5jbHVkaW5nIGJvdGggYWxpdmUgYW5kIGRlYWQuXHJcbiAgICAgKi9cclxuICAgIGdldFBhcnRpY2xlQ291bnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxpdmVQYXJ0aWNsZUNvdW50KCkgKyB0aGlzLmdldERlYWRQYXJ0aWNsZUNvdW50KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIGVtaXR0ZXIgaXMgYXQgaXRzIGxpbWl0IChpZiBzZXQpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjYXRMaW1pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBFbWl0dGVyIGlzIGF0IGl0cyBsaW1pdCwgb3IgYGZhbHNlYCBpZiBubyBsaW1pdCwgb3IgYmVsb3cgdGhlIGBtYXhQYXJ0aWNsZXNgIGxldmVsLlxyXG4gICAgICovXHJcbiAgICBhdExpbWl0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5tYXhQYXJ0aWNsZXMgPiAwICYmIHRoaXMuZ2V0UGFydGljbGVDb3VudCgpID09PSB0aGlzLm1heFBhcnRpY2xlcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggbmV3bHkgZW1pdHRlZCBwYXJ0aWNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI29uUGFydGljbGVFbWl0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY29udGV4dF0gLSBUaGUgY2FsbGluZyBjb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgb25QYXJ0aWNsZUVtaXQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDbGVhciBhbnkgcHJldmlvdXNseSBzZXQgY2FsbGJhY2tcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDYWxsYmFja1Njb3BlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDYWxsYmFja1Njb3BlID0gY29udGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggcGFydGljbGUgZGVhdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNvblBhcnRpY2xlRGVhdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZURlYXRoQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY29udGV4dF0gLSBUaGUgZnVuY3Rpb24ncyBjYWxsaW5nIGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBvblBhcnRpY2xlRGVhdGg6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDbGVhciBhbnkgcHJldmlvdXNseSBzZXQgY2FsbGJhY2tcclxuICAgICAgICAgICAgdGhpcy5kZWF0aENhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5kZWF0aENhbGxiYWNrU2NvcGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRlYXRoQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlYXRoQ2FsbGJhY2tTY29wZSA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYWN0aXZhdGVzIGV2ZXJ5IHBhcnRpY2xlIGluIHRoaXMgZW1pdHRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2tpbGxBbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAga2lsbEFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGVhZCA9IHRoaXMuZGVhZDtcclxuICAgICAgICB2YXIgYWxpdmUgPSB0aGlzLmFsaXZlO1xyXG5cclxuICAgICAgICB3aGlsZSAoYWxpdmUubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlYWQucHVzaChhbGl2ZS5wb3AoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoIGFjdGl2ZSBwYXJ0aWNsZSBpbiB0aGlzIGVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmb3JFYWNoQWxpdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgLSBUaGUgZnVuY3Rpb24ncyBjYWxsaW5nIGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoQWxpdmU6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICB2YXIgYWxpdmUgPSB0aGlzLmFsaXZlO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBhbGl2ZS5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7ICsraW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2VuZHMgdGhlIFBhcnRpY2xlIGFuZCB0aGUgRW1pdHRlclxyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGFsaXZlW2luZGV4XSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxscyBhIGZ1bmN0aW9uIGZvciBlYWNoIGluYWN0aXZlIHBhcnRpY2xlIGluIHRoaXMgZW1pdHRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2ZvckVhY2hEZWFkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHsqfSBjb250ZXh0IC0gVGhlIGZ1bmN0aW9uJ3MgY2FsbGluZyBjb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgZm9yRWFjaERlYWQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGVhZCA9IHRoaXMuZGVhZDtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gZGVhZC5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7ICsraW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2VuZHMgdGhlIFBhcnRpY2xlIGFuZCB0aGUgRW1pdHRlclxyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGRlYWRbaW5kZXhdLCB0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR1cm5zIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNvbn0gdGhlIGVtaXR0ZXIgYW5kIHJlc2V0cyB0aGUgZmxvdyBjb3VudGVyLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoaXMgZW1pdHRlciBpcyBpbiBmbG93IG1vZGUgKGZyZXF1ZW5jeSA+PSAwOyB0aGUgZGVmYXVsdCksIHRoZSBwYXJ0aWNsZSBmbG93IHdpbGwgc3RhcnQgKG9yIHJlc3RhcnQpLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoaXMgZW1pdHRlciBpcyBpbiBleHBsb2RlIG1vZGUgKGZyZXF1ZW5jeSA9IC0xKSwgbm90aGluZyB3aWxsIGhhcHBlbi5cclxuICAgICAqIFVzZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZXhwbG9kZX0gb3Ige0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2Zsb3d9IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNzdGFydFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR1cm5zIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNvbiBvZmZ9IHRoZSBlbWl0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc3RvcFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNhY3RpdmUgRGVhY3RpdmF0ZXN9IHRoZSBlbWl0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcGF1c2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUGFydGljbGUgRW1pdHRlci5cclxuICAgICAqL1xyXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2FjdGl2ZSBBY3RpdmF0ZXN9IHRoZSBlbWl0dGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcmVzdW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGVtaXR0ZXIgZnJvbSBpdHMgbWFuYWdlciBhbmQgdGhlIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbW92ZUVtaXR0ZXIodGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvcnRzIGFjdGl2ZSBwYXJ0aWNsZXMgd2l0aCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZGVwdGhTb3J0Q2FsbGJhY2t9LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZGVwdGhTb3J0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBhcnRpY2xlIEVtaXR0ZXIuXHJcbiAgICAgKi9cclxuICAgIGRlcHRoU29ydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBTdGFibGVTb3J0LmlucGxhY2UodGhpcy5hbGl2ZSwgdGhpcy5kZXB0aFNvcnRDYWxsYmFjayk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgdGhlIGVtaXR0ZXIgaW4gZmxvdyBtb2RlIChmcmVxdWVuY3kgPj0gMCkgYW5kIHN0YXJ0cyAob3IgcmVzdGFydHMpIGEgcGFydGljbGUgZmxvdy5cclxuICAgICAqXHJcbiAgICAgKiBUbyByZXN1bWUgYSBmbG93IGF0IHRoZSBjdXJyZW50IGZyZXF1ZW5jeSBhbmQgcXVhbnRpdHksIHVzZSB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjc3RhcnR9IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNmbG93XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJlcXVlbmN5IC0gVGhlIHRpbWUgaW50ZXJ2YWwgKD49IDApIG9mIGVhY2ggZmxvdyBjeWNsZSwgaW4gbXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuRW1pdHRlck9wT25FbWl0VHlwZX0gW2NvdW50PTFdIC0gVGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgdG8gZW1pdCBhdCBlYWNoIGZsb3cgY3ljbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQYXJ0aWNsZSBFbWl0dGVyLlxyXG4gICAgICovXHJcbiAgICBmbG93OiBmdW5jdGlvbiAoZnJlcXVlbmN5LCBjb3VudClcclxuICAgIHtcclxuICAgICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgeyBjb3VudCA9IDE7IH1cclxuXHJcbiAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XHJcblxyXG4gICAgICAgIHRoaXMucXVhbnRpdHkub25DaGFuZ2UoY291bnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zdGFydCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgdGhlIGVtaXR0ZXIgaW4gZXhwbG9kZSBtb2RlIChmcmVxdWVuY3kgPSAtMSksIHN0b3BwaW5nIGFueSBjdXJyZW50IHBhcnRpY2xlIGZsb3csIGFuZCBlbWl0cyBzZXZlcmFsIHBhcnRpY2xlcyBhbGwgYXQgb25jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyI2V4cGxvZGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gY291bnQgLSBUaGUgYW1vdW50IG9mIFBhcnRpY2xlcyB0byBlbWl0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGVtaXQgdGhlIFBhcnRpY2xlcyBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGVtaXQgdGhlIFBhcnRpY2xlcyBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGV9IFRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgUGFydGljbGUuXHJcbiAgICAgKi9cclxuICAgIGV4cGxvZGU6IGZ1bmN0aW9uIChjb3VudCwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IC0xO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5lbWl0UGFydGljbGUoY291bnQsIHgsIHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIHBhcnRpY2xlcyBhdCBhIGdpdmVuIHBvc2l0aW9uIChvciB0aGUgZW1pdHRlcidzIGN1cnJlbnQgcG9zaXRpb24pLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjZW1pdFBhcnRpY2xlQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD10aGlzLnhdIC0gVGhlIHggY29vcmRpbmF0ZSB0byBlbWl0IHRoZSBQYXJ0aWNsZXMgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT10aGlzLnhdIC0gVGhlIHkgY29vcmRpbmF0ZSB0byBlbWl0IHRoZSBQYXJ0aWNsZXMgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NvdW50PXRoaXMucXVhbnRpdHldIC0gVGhlIG51bWJlciBvZiBQYXJ0aWNsZXMgdG8gZW1pdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBUaGUgbW9zdCByZWNlbnRseSBlbWl0dGVkIFBhcnRpY2xlLlxyXG4gICAgICovXHJcbiAgICBlbWl0UGFydGljbGVBdDogZnVuY3Rpb24gKHgsIHksIGNvdW50KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXRQYXJ0aWNsZShjb3VudCwgeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHMgcGFydGljbGVzIGF0IGEgZ2l2ZW4gcG9zaXRpb24gKG9yIHRoZSBlbWl0dGVyJ3MgY3VycmVudCBwb3NpdGlvbikuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNlbWl0UGFydGljbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NvdW50PXRoaXMucXVhbnRpdHldIC0gVGhlIG51bWJlciBvZiBQYXJ0aWNsZXMgdG8gZW1pdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD10aGlzLnhdIC0gVGhlIHggY29vcmRpbmF0ZSB0byBlbWl0IHRoZSBQYXJ0aWNsZXMgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT10aGlzLnhdIC0gVGhlIHkgY29vcmRpbmF0ZSB0byBlbWl0IHRoZSBQYXJ0aWNsZXMgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBUaGUgbW9zdCByZWNlbnRseSBlbWl0dGVkIFBhcnRpY2xlLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZSNmaXJlXHJcbiAgICAgKi9cclxuICAgIGVtaXRQYXJ0aWNsZTogZnVuY3Rpb24gKGNvdW50LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmF0TGltaXQoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY291bnQgPSB0aGlzLnF1YW50aXR5Lm9uRW1pdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRlYWQgPSB0aGlzLmRlYWQ7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0aWNsZSA9IGRlYWQucG9wKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcnRpY2xlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0aWNsZSA9IG5ldyB0aGlzLnBhcnRpY2xlQ2xhc3ModGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBhcnRpY2xlLmZpcmUoeCwgeSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJ0aWNsZUJyaW5nVG9Ub3ApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxpdmUucHVzaChwYXJ0aWNsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsaXZlLnVuc2hpZnQocGFydGljbGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5lbWl0Q2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdENhbGxiYWNrLmNhbGwodGhpcy5lbWl0Q2FsbGJhY2tTY29wZSwgcGFydGljbGUsIHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hdExpbWl0KCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcGFydGljbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGlzIGVtaXR0ZXIgYW5kIGl0cyBwYXJ0aWNsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNwcmVVcGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gbXMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHByZVVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBTY2FsZSB0aGUgZGVsdGFcclxuICAgICAgICBkZWx0YSAqPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcbiAgICAgICAgdmFyIHN0ZXAgPSAoZGVsdGEgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHJhY2tWaXNpYmxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdGhpcy5mb2xsb3cudmlzaWJsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBBbnkgcGFydGljbGUgcHJvY2Vzc29ycz9cclxuICAgICAgICB2YXIgcHJvY2Vzc29ycyA9IHRoaXMubWFuYWdlci5nZXRQcm9jZXNzb3JzKCk7XHJcblxyXG4gICAgICAgIHZhciBwYXJ0aWNsZXMgPSB0aGlzLmFsaXZlO1xyXG4gICAgICAgIHZhciBkZWFkID0gdGhpcy5kZWFkO1xyXG5cclxuICAgICAgICB2YXIgaSA9IDA7XHJcbiAgICAgICAgdmFyIHJpcCA9IFtdO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWNsZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFydGljbGUgPSBwYXJ0aWNsZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgdXBkYXRlIHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXJ0aWNsZSBpcyBub3cgZGVhZCAobGlmZUN1cnJlbnQgPD0gMClcclxuICAgICAgICAgICAgaWYgKHBhcnRpY2xlLnVwZGF0ZShkZWx0YSwgc3RlcCwgcHJvY2Vzc29ycykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJpcC5wdXNoKHsgaW5kZXg6IGksIHBhcnRpY2xlOiBwYXJ0aWNsZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIE1vdmUgZGVhZCBwYXJ0aWNsZXMgdG8gdGhlIGRlYWQgYXJyYXlcclxuICAgICAgICBsZW5ndGggPSByaXAubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAobGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkZWF0aENhbGxiYWNrID0gdGhpcy5kZWF0aENhbGxiYWNrO1xyXG4gICAgICAgICAgICB2YXIgZGVhdGhDYWxsYmFja1Njb3BlID0gdGhpcy5kZWF0aENhbGxiYWNrU2NvcGU7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gcmlwW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBSZW1vdmUgZnJvbSBwYXJ0aWNsZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIHBhcnRpY2xlcy5zcGxpY2UoZW50cnkuaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBBZGQgdG8gZGVhZCBhcnJheVxyXG4gICAgICAgICAgICAgICAgZGVhZC5wdXNoKGVudHJ5LnBhcnRpY2xlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgQ2FsbGJhY2tcclxuICAgICAgICAgICAgICAgIGlmIChkZWF0aENhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlYXRoQ2FsbGJhY2suY2FsbChkZWF0aENhbGxiYWNrU2NvcGUsIGVudHJ5LnBhcnRpY2xlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBlbnRyeS5wYXJ0aWNsZS5yZXNldFBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5vbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFBhcnRpY2xlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlciA8PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRQYXJ0aWNsZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBjb3VudGVyID0gZnJlcXVlbmN5IC0gcmVtYWluZWQgZnJvbSBwcmV2aW91cyBkZWx0YVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY291bnRlciA9ICh0aGlzLmZyZXF1ZW5jeSAtIE1hdGguYWJzKHRoaXMuX2NvdW50ZXIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBwYXJ0aWNsZXMsIGZvciBzb3J0aW5nIHRoZW0gYnkgZGVwdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNkZXB0aFNvcnRDYWxsYmFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGEgLSBUaGUgZmlyc3QgcGFydGljbGUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYiAtIFRoZSBzZWNvbmQgcGFydGljbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGRpZmZlcmVuY2Ugb2YgYSBhbmQgYidzIHkgY29vcmRpbmF0ZXMuXHJcbiAgICAgKi9cclxuICAgIGRlcHRoU29ydENhbGxiYWNrOiBmdW5jdGlvbiAoYSwgYilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gYS55IC0gYi55O1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnRpY2xlRW1pdHRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Jyk7XHJcbnZhciBHcmF2aXR5V2VsbCA9IHJlcXVpcmUoJy4vR3Jhdml0eVdlbGwnKTtcclxudmFyIExpc3QgPSByZXF1aXJlKCcuLi8uLi9zdHJ1Y3RzL0xpc3QnKTtcclxudmFyIFBhcnRpY2xlRW1pdHRlciA9IHJlcXVpcmUoJy4vUGFydGljbGVFbWl0dGVyJyk7XHJcbnZhciBSZW5kZXIgPSByZXF1aXJlKCcuL1BhcnRpY2xlTWFuYWdlclJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBQYXJ0aWNsZSBFbWl0dGVyIE1hbmFnZXIgY3JlYXRlcyBhbmQgY29udHJvbHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyIFBhcnRpY2xlIEVtaXR0ZXJzfSBhbmQge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGwgR3Jhdml0eSBXZWxsc30uXHJcbiAqXHJcbiAqIEBjbGFzcyBQYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBFbWl0dGVyIE1hbmFnZXIgYmVsb25ncy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgRW1pdHRlciBNYW5hZ2VyIHdpbGwgdXNlIHRvIHJlbmRlciBwYXJ0aWNsZXMsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgRW1pdHRlciBNYW5hZ2VyIHdpbGwgdXNlIHRvIHJlbmRlciBwYXJ0aWNsZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWd8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWdbXX0gW2VtaXR0ZXJzXSAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIGVtaXR0ZXJzIHRvIGNyZWF0ZS5cclxuICovXHJcbnZhciBQYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNrLFxyXG4gICAgICAgIENvbXBvbmVudHMuUGlwZWxpbmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIC8vICBmcmFtZSBpcyBvcHRpb25hbCBhbmQgY2FuIGNvbnRhaW4gdGhlIGVtaXR0ZXJzIGFycmF5IG9yIG9iamVjdCBpZiBza2lwcGVkXHJcbiAgICBmdW5jdGlvbiBQYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyIChzY2VuZSwgdGV4dHVyZSwgZnJhbWUsIGVtaXR0ZXJzKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3QuY2FsbCh0aGlzLCBzY2VuZSwgJ1BhcnRpY2xlRW1pdHRlck1hbmFnZXInKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJsZW5kIG1vZGUgYXBwbGllZCB0byBhbGwgZW1pdHRlcnMgYW5kIHBhcnRpY2xlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNibGVuZE1vZGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUgc2NhbGUgYXBwbGllZCB0byBhbGwgZW1pdHRlcnMgYW5kIHBhcnRpY2xlcywgYWZmZWN0aW5nIGZsb3cgcmF0ZSwgbGlmZXNwYW4sIGFuZCBtb3ZlbWVudC5cclxuICAgICAgICAgKiBWYWx1ZXMgbGFyZ2VyIHRoYW4gMSBhcmUgZmFzdGVyIHRoYW4gbm9ybWFsLlxyXG4gICAgICAgICAqIFRoaXMgaXMgbXVsdGlwbGllZCB3aXRoIGFueSB0aW1lU2NhbGUgc2V0IG9uIGVhY2ggaW5kaXZpZHVhbCBlbWl0dGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhpcyBFbWl0dGVyIE1hbmFnZXIncyBwYXJ0aWNsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjdGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRleHR1cmUgZnJhbWUgdXNlZCB0byByZW5kZXIgdGhpcyBFbWl0dGVyIE1hbmFnZXIncyBwYXJ0aWNsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjZnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTmFtZXMgb2YgdGhpcyBFbWl0dGVyIE1hbmFnZXIncyB0ZXh0dXJlIGZyYW1lcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNmcmFtZU5hbWVzXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ1tdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVOYW1lcyA9IFtdO1xyXG5cclxuICAgICAgICAvLyAgZnJhbWUgaXMgb3B0aW9uYWwgYW5kIGNhbiBjb250YWluIHRoZSBlbWl0dGVycyBhcnJheSBvciBvYmplY3QgaWYgc2tpcHBlZFxyXG4gICAgICAgIGlmIChmcmFtZSAhPT0gbnVsbCAmJiAodHlwZW9mIGZyYW1lID09PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGZyYW1lKSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbWl0dGVycyA9IGZyYW1lO1xyXG4gICAgICAgICAgICBmcmFtZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFRleHR1cmUodGV4dHVyZSwgZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgRW1pdHRlcnMgYmVpbmcgbWFuYWdlZCBieSB0aGlzIEVtaXR0ZXIgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNlbWl0dGVyc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5MaXN0LjxQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlcj59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbWl0dGVycyA9IG5ldyBMaXN0KHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgR3Jhdml0eSBXZWxscyBiZWluZyBtYW5hZ2VkIGJ5IHRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3dlbGxzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLkxpc3QuPFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGw+fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2VsbHMgPSBuZXcgTGlzdCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKGVtaXR0ZXJzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFuIGFycmF5IG9mIGVtaXR0ZXIgY29uZmlncz9cclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVtaXR0ZXJzKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZW1pdHRlcnMgPSBbIGVtaXR0ZXJzIF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW1pdHRlcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRW1pdHRlcihlbWl0dGVyc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4dHVyZSBhbmQgZnJhbWUgdGhpcyBFbWl0dGVyIE1hbmFnZXIgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogVGV4dHVyZXMgYXJlIHJlZmVyZW5jZWQgYnkgdGhlaXIgc3RyaW5nLWJhc2VkIGtleXMsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3NldFRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0VGV4dHVyZTogZnVuY3Rpb24gKGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEZyYW1lKGZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmFtZSB0aGlzIEVtaXR0ZXIgTWFuYWdlciB3aWxsIHVzZSB0byByZW5kZXIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgRnJhbWUgaGFzIHRvIGJlbG9uZyB0byB0aGUgY3VycmVudCBUZXh0dXJlIGJlaW5nIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogSXQgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNzZXRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0RnJhbWU6IGZ1bmN0aW9uIChmcmFtZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy50ZXh0dXJlLmdldChmcmFtZSk7XHJcblxyXG4gICAgICAgIHZhciBmcmFtZXMgPSB0aGlzLnRleHR1cmUuZ2V0RnJhbWVzRnJvbVRleHR1cmVTb3VyY2UodGhpcy5mcmFtZS5zb3VyY2VJbmRleCk7XHJcblxyXG4gICAgICAgIHZhciBuYW1lcyA9IFtdO1xyXG5cclxuICAgICAgICBmcmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lcy5wdXNoKHNvdXJjZUZyYW1lLm5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZyYW1lTmFtZXMgPSBuYW1lcztcclxuXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RnJhbWUgPSB0aGlzLmZyYW1lO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc3NpZ25zIHRleHR1cmUgZnJhbWVzIHRvIGFuIGVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjc2V0RW1pdHRlckZyYW1lc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlRleHR1cmVzLkZyYW1lfFBoYXNlci5UZXh0dXJlcy5GcmFtZVtdKX0gZnJhbWVzIC0gVGhlIHRleHR1cmUgZnJhbWVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlcn0gZW1pdHRlciAtIFRoZSBwYXJ0aWNsZSBlbWl0dGVyIHRvIG1vZGlmeS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0RW1pdHRlckZyYW1lczogZnVuY3Rpb24gKGZyYW1lcywgZW1pdHRlcilcclxuICAgIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZnJhbWVzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZyYW1lcyA9IFsgZnJhbWVzIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgb3V0ID0gZW1pdHRlci5mcmFtZXM7XHJcblxyXG4gICAgICAgIG91dC5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmcmFtZSA9IGZyYW1lc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZyYW1lTmFtZXMuaW5kZXhPZihmcmFtZSkgIT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXQucHVzaCh0aGlzLnRleHR1cmUuZ2V0KGZyYW1lKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvdXQubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGVtaXR0ZXIuZGVmYXVsdEZyYW1lID0gb3V0WzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbWl0dGVyLmRlZmF1bHRGcmFtZSA9IHRoaXMuZGVmYXVsdEZyYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBleGlzdGluZyBQYXJ0aWNsZSBFbWl0dGVyIHRvIHRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI2FkZEVtaXR0ZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJ9IGVtaXR0ZXIgLSBUaGUgUGFydGljbGUgRW1pdHRlciB0byBhZGQgdG8gdGhpcyBFbWl0dGVyIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJ9IFRoZSBQYXJ0aWNsZSBFbWl0dGVyIHRoYXQgd2FzIGFkZGVkIHRvIHRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBhZGRFbWl0dGVyOiBmdW5jdGlvbiAoZW1pdHRlcilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbWl0dGVycy5hZGQoZW1pdHRlcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQYXJ0aWNsZSBFbWl0dGVyIG9iamVjdCwgYWRkcyBpdCB0byB0aGlzIEVtaXR0ZXIgTWFuYWdlciBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNjcmVhdGVFbWl0dGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgUGFydGljbGUgRW1pdHRlciB0byBjcmVhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJ9IFRoZSBQYXJ0aWNsZSBFbWl0dGVyIHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRW1pdHRlcihuZXcgUGFydGljbGVFbWl0dGVyKHRoaXMsIGNvbmZpZykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBQYXJ0aWNsZSBFbWl0dGVyIGZyb20gdGhpcyBFbWl0dGVyIE1hbmFnZXIsIGlmIHRoZSBFbWl0dGVyIGJlbG9uZ3MgdG8gdGhpcyBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3JlbW92ZUVtaXR0ZXJcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyfSBlbWl0dGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyfSBUaGUgUGFydGljbGUgRW1pdHRlciBpZiBpdCB3YXMgcmVtb3ZlZCBvciBudWxsIGlmIGl0IHdhcyBub3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUVtaXR0ZXI6IGZ1bmN0aW9uIChlbWl0dGVyKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXR0ZXJzLnJlbW92ZShlbWl0dGVyLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIEdyYXZpdHkgV2VsbCBvYmplY3QgdG8gdGhpcyBFbWl0dGVyIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjYWRkR3Jhdml0eVdlbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbH0gd2VsbCAtIFRoZSBHcmF2aXR5IFdlbGwgdG8gYWRkIHRvIHRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGx9IFRoZSBHcmF2aXR5IFdlbGwgdGhhdCB3YXMgYWRkZWQgdG8gdGhpcyBFbWl0dGVyIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZEdyYXZpdHlXZWxsOiBmdW5jdGlvbiAod2VsbClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53ZWxscy5hZGQod2VsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBHcmF2aXR5IFdlbGwsIGFkZHMgaXQgdG8gdGhpcyBFbWl0dGVyIE1hbmFnZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjY3JlYXRlR3Jhdml0eVdlbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbENvbmZpZ30gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIEdyYXZpdHkgV2VsbCB0byBjcmVhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5HcmF2aXR5V2VsbH0gVGhlIEdyYXZpdHkgV2VsbCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVHcmF2aXR5V2VsbDogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRHcmF2aXR5V2VsbChuZXcgR3Jhdml0eVdlbGwoY29uZmlnKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHMgcGFydGljbGVzIGZyb20gZWFjaCBhY3RpdmUgZW1pdHRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNlbWl0UGFydGljbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2NvdW50XSAtIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHRvIHJlbGVhc2UgZnJvbSBlYWNoIGVtaXR0ZXIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbWl0dGVyJ3Mgb3duIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlciNxdWFudGl0eX0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3hdIC0gVGhlIHgtY29vcmRpbmF0ZSB0byB0byBlbWl0IHBhcnRpY2xlcyBmcm9tLiBUaGUgZGVmYXVsdCBpcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBlbWl0dGVyJ3MgY3VycmVudCBsb2NhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBUaGUgeS1jb29yZGluYXRlIHRvIHRvIGVtaXQgcGFydGljbGVzIGZyb20uIFRoZSBkZWZhdWx0IGlzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVtaXR0ZXIncyBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBlbWl0UGFydGljbGU6IGZ1bmN0aW9uIChjb3VudCwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZW1pdHRlcnMgPSB0aGlzLmVtaXR0ZXJzLmxpc3Q7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW1pdHRlcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW1pdHRlciA9IGVtaXR0ZXJzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVtaXR0ZXIuYWN0aXZlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRQYXJ0aWNsZShjb3VudCwgeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIHBhcnRpY2xlcyBmcm9tIGVhY2ggYWN0aXZlIGVtaXR0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjZW1pdFBhcnRpY2xlQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgeC1jb29yZGluYXRlIHRvIHRvIGVtaXQgcGFydGljbGVzIGZyb20uIFRoZSBkZWZhdWx0IGlzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGVtaXR0ZXIncyBjdXJyZW50IGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5LWNvb3JkaW5hdGUgdG8gdG8gZW1pdCBwYXJ0aWNsZXMgZnJvbS4gVGhlIGRlZmF1bHQgaXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZW1pdHRlcidzIGN1cnJlbnQgbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtjb3VudF0gLSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byByZWxlYXNlIGZyb20gZWFjaCBlbWl0dGVyLiBUaGUgZGVmYXVsdCBpcyB0aGUgZW1pdHRlcidzIG93biB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXIjcXVhbnRpdHl9LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBlbWl0UGFydGljbGVBdDogZnVuY3Rpb24gKHgsIHksIGNvdW50KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVtaXRQYXJ0aWNsZShjb3VudCwgeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2VzIHRoaXMgRW1pdHRlciBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcGF1c2luZyBhbGwgZW1pdHRlcnMsIGFuZCBhbGwgcGFydGljbGVzIG9mIHRob3NlIGVtaXR0ZXJzLCBjdXJyZW50bHkgdW5kZXIgaXRzIGNvbnRyb2wuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHBhcnRpY2xlcyB3aWxsIHN0aWxsIHJlbmRlciwgYnV0IHRoZXkgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlaXIgbG9naWMgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlciNwYXVzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBFbWl0dGVyIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhpcyBFbWl0dGVyIE1hbmFnZXIsIHNob3VsZCBpdCBoYXZlIGJlZW4gcHJldmlvdXNseSBwYXVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjcmVzdW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVtaXR0ZXIgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgYWN0aXZlIHBhcnRpY2xlIHByb2Nlc3NvcnMgKGdyYXZpdHkgd2VsbHMpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI2dldFByb2Nlc3NvcnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuR3Jhdml0eVdlbGxbXX0gLSBUaGUgYWN0aXZlIGdyYXZpdHkgd2VsbHMuXHJcbiAgICAgKi9cclxuICAgIGdldFByb2Nlc3NvcnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2VsbHMuZ2V0QWxsKCdhY3RpdmUnLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGFsbCBhY3RpdmUgZW1pdHRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjcHJlVXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUsIGluIG1zLCBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICBwcmVVcGRhdGU6IGZ1bmN0aW9uICh0aW1lLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICAvLyAgU2NhbGUgdGhlIGRlbHRhXHJcbiAgICAgICAgZGVsdGEgKj0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIHZhciBlbWl0dGVycyA9IHRoaXMuZW1pdHRlcnMubGlzdDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbWl0dGVycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbWl0dGVyID0gZW1pdHRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZW1pdHRlci5hY3RpdmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGVtaXR0ZXIucHJlVXBkYXRlKHRpbWUsIGRlbHRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIE5PT1AgbWV0aG9kIHNvIHlvdSBjYW4gcGFzcyBhbiBFbWl0dGVyTWFuYWdlciB0byBhIENvbnRhaW5lci5cclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLiBJdCBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3NldEFscGhhXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBzZXRBbHBoYTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIE5PT1AgbWV0aG9kIHNvIHlvdSBjYW4gcGFzcyBhbiBFbWl0dGVyTWFuYWdlciB0byBhIENvbnRhaW5lci5cclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLiBJdCBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyI3NldFNjcm9sbEZhY3RvclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgc2V0U2Nyb2xsRmFjdG9yOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgTk9PUCBtZXRob2Qgc28geW91IGNhbiBwYXNzIGFuIEVtaXR0ZXJNYW5hZ2VyIHRvIGEgQ29udGFpbmVyLlxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuIEl0IGlzIGludGVudGlvbmFsbHkgZW1wdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXIjc2V0QmxlbmRNb2RlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTUuMFxyXG4gICAgICovXHJcbiAgICBzZXRCbGVuZE1vZGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFydGljbGVFbWl0dGVyTWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FbWl0dGVyTWFuYWdlciNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuUGFydGljbGVFbWl0dGVyTWFuYWdlcn0gZW1pdHRlck1hbmFnZXIgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgUGFydGljbGVNYW5hZ2VyQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIGVtaXR0ZXJNYW5hZ2VyLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBlbWl0dGVycyA9IGVtaXR0ZXJNYW5hZ2VyLmVtaXR0ZXJzLmxpc3Q7XHJcbiAgICB2YXIgZW1pdHRlcnNMZW5ndGggPSBlbWl0dGVycy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGVtaXR0ZXJzTGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgxLmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG4gICAgdmFyIGNhbGNNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgcGFydGljbGVNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDM7XHJcbiAgICB2YXIgbWFuYWdlck1hdHJpeCA9IHJlbmRlcmVyLl90ZW1wTWF0cml4NC5hcHBseUlUUlMoZW1pdHRlck1hbmFnZXIueCwgZW1pdHRlck1hbmFnZXIueSwgZW1pdHRlck1hbmFnZXIucm90YXRpb24sIGVtaXR0ZXJNYW5hZ2VyLnNjYWxlWCwgZW1pdHRlck1hbmFnZXIuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXgubXVsdGlwbHkobWFuYWdlck1hdHJpeCk7XHJcblxyXG4gICAgdmFyIHJvdW5kUGl4ZWxzID0gY2FtZXJhLnJvdW5kUGl4ZWxzO1xyXG5cclxuICAgIHZhciBjdHggPSByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgIGZvciAodmFyIGUgPSAwOyBlIDwgZW1pdHRlcnNMZW5ndGg7IGUrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgZW1pdHRlciA9IGVtaXR0ZXJzW2VdO1xyXG4gICAgICAgIHZhciBwYXJ0aWNsZXMgPSBlbWl0dGVyLmFsaXZlO1xyXG4gICAgICAgIHZhciBwYXJ0aWNsZUNvdW50ID0gcGFydGljbGVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKCFlbWl0dGVyLnZpc2libGUgfHwgcGFydGljbGVDb3VudCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNjcm9sbFggPSBjYW1lcmEuc2Nyb2xsWCAqIGVtaXR0ZXIuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICB2YXIgc2Nyb2xsWSA9IGNhbWVyYS5zY3JvbGxZICogZW1pdHRlci5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1zY3JvbGxYLCAtc2Nyb2xsWSk7XHJcblxyXG4gICAgICAgICAgICBzY3JvbGxYID0gMDtcclxuICAgICAgICAgICAgc2Nyb2xsWSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gcmVuZGVyZXIuYmxlbmRNb2Rlc1tlbWl0dGVyLmJsZW5kTW9kZV07XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydGljbGVDb3VudDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhcnRpY2xlID0gcGFydGljbGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGFscGhhID0gcGFydGljbGUuYWxwaGEgKiBjYW1lcmEuYWxwaGE7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWxwaGEgPD0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBmcmFtZSA9IHBhcnRpY2xlLmZyYW1lO1xyXG4gICAgICAgICAgICB2YXIgY2QgPSBmcmFtZS5jYW52YXNEYXRhO1xyXG5cclxuICAgICAgICAgICAgdmFyIHggPSAtKGZyYW1lLmhhbGZXaWR0aCk7XHJcbiAgICAgICAgICAgIHZhciB5ID0gLShmcmFtZS5oYWxmSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHBhcnRpY2xlTWF0cml4LmFwcGx5SVRSUygwLCAwLCBwYXJ0aWNsZS5yb3RhdGlvbiwgcGFydGljbGUuc2NhbGVYLCBwYXJ0aWNsZS5zY2FsZVkpO1xyXG5cclxuICAgICAgICAgICAgcGFydGljbGVNYXRyaXguZSA9IHBhcnRpY2xlLnggLSBzY3JvbGxYO1xyXG4gICAgICAgICAgICBwYXJ0aWNsZU1hdHJpeC5mID0gcGFydGljbGUueSAtIHNjcm9sbFk7XHJcblxyXG4gICAgICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkocGFydGljbGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XHJcblxyXG4gICAgICAgICAgICBjYWxjTWF0cml4LmNvcHlUb0NvbnRleHQoY3R4KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyb3VuZFBpeGVscylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeCA9IE1hdGgucm91bmQoeCk7XHJcbiAgICAgICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICEoIXJlbmRlcmVyLmFudGlhbGlhcyB8fCBmcmFtZS5zb3VyY2Uuc2NhbGVNb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoZnJhbWUuc291cmNlLmltYWdlLCBjZC54LCBjZC55LCBjZC53aWR0aCwgY2QuaGVpZ2h0LCB4LCB5LCBjZC53aWR0aCwgY2QuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGN0eC5yZXN0b3JlKCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnRpY2xlTWFuYWdlckNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIFBhcnRpY2xlRW1pdHRlck1hbmFnZXIgPSByZXF1aXJlKCcuL1BhcnRpY2xlRW1pdHRlck1hbmFnZXInKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFBhcnRpY2xlIEVtaXR0ZXIgTWFuYWdlciBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyBpdC5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgUGFydGljbGVzIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNwYXJ0aWNsZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byBjcmVhdGUgaXRzZWxmLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1NjZW5lXSAtIEFkZCB0aGlzIEdhbWUgT2JqZWN0IHRvIHRoZSBTY2VuZSBhZnRlciBjcmVhdGluZyBpdD8gSWYgc2V0IHRoaXMgYXJndW1lbnQgb3ZlcnJpZGVzIHRoZSBgYWRkYCBwcm9wZXJ0eSBpbiB0aGUgY29uZmlnIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdwYXJ0aWNsZXMnLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICB2YXIga2V5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdrZXknLCBudWxsKTtcclxuICAgIHZhciBmcmFtZSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnZnJhbWUnLCBudWxsKTtcclxuICAgIHZhciBlbWl0dGVycyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdlbWl0dGVycycsIG51bGwpO1xyXG5cclxuICAgIC8vICBmcmFtZSBpcyBvcHRpb25hbCBhbmQgY2FuIGNvbnRhaW4gdGhlIGVtaXR0ZXJzIGFycmF5IG9yIG9iamVjdCBpZiBza2lwcGVkXHJcbiAgICB2YXIgbWFuYWdlciA9IG5ldyBQYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyKHRoaXMuc2NlbmUsIGtleSwgZnJhbWUsIGVtaXR0ZXJzKTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhZGQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYWRkJywgZmFsc2UpO1xyXG5cclxuICAgIGlmIChhZGQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdC5hZGQobWFuYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVMaXN0LmFkZChtYW5hZ2VyKTtcclxuXHJcbiAgICByZXR1cm4gbWFuYWdlcjtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIFBhcnRpY2xlRW1pdHRlck1hbmFnZXIgPSByZXF1aXJlKCcuL1BhcnRpY2xlRW1pdHRlck1hbmFnZXInKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFBhcnRpY2xlIEVtaXR0ZXIgTWFuYWdlciBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFBhcnRpY2xlcyBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjcGFydGljbGVzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfG9iamVjdCl9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWd8UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJDb25maWdbXX0gW2VtaXR0ZXJzXSAtIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIG9uZSBvciBtb3JlIGVtaXR0ZXJzIHRvIGNyZWF0ZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZUVtaXR0ZXJNYW5hZ2VyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdwYXJ0aWNsZXMnLCBmdW5jdGlvbiAoa2V5LCBmcmFtZSwgZW1pdHRlcnMpXHJcbntcclxuICAgIHZhciBtYW5hZ2VyID0gbmV3IFBhcnRpY2xlRW1pdHRlck1hbmFnZXIodGhpcy5zY2VuZSwga2V5LCBmcmFtZSwgZW1pdHRlcnMpO1xyXG5cclxuICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKG1hbmFnZXIpO1xyXG4gICAgdGhpcy51cGRhdGVMaXN0LmFkZChtYW5hZ2VyKTtcclxuXHJcbiAgICByZXR1cm4gbWFuYWdlcjtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9QYXJ0aWNsZU1hbmFnZXJXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL1BhcnRpY2xlTWFuYWdlckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLkVtaXR0ZXJNYW5hZ2VyI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlRW1pdHRlck1hbmFnZXJ9IGVtaXR0ZXJNYW5hZ2VyIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFBhcnRpY2xlTWFuYWdlcldlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIGVtaXR0ZXJNYW5hZ2VyLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBlbWl0dGVycyA9IGVtaXR0ZXJNYW5hZ2VyLmVtaXR0ZXJzLmxpc3Q7XHJcbiAgICB2YXIgZW1pdHRlcnNMZW5ndGggPSBlbWl0dGVycy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGVtaXR0ZXJzTGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDEuY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBwYXJ0aWNsZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MztcclxuICAgIHZhciBtYW5hZ2VyTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXg0LmFwcGx5SVRSUyhlbWl0dGVyTWFuYWdlci54LCBlbWl0dGVyTWFuYWdlci55LCBlbWl0dGVyTWFuYWdlci5yb3RhdGlvbiwgZW1pdHRlck1hbmFnZXIuc2NhbGVYLCBlbWl0dGVyTWFuYWdlci5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5tdWx0aXBseShtYW5hZ2VyTWF0cml4KTtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgdmFyIHJvdW5kUGl4ZWxzID0gY2FtZXJhLnJvdW5kUGl4ZWxzO1xyXG4gICAgdmFyIHRleHR1cmUgPSBlbWl0dGVyTWFuYWdlci5kZWZhdWx0RnJhbWUuZ2xUZXh0dXJlO1xyXG4gICAgdmFyIGdldFRpbnQgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXA7XHJcblxyXG4gICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgIGZvciAodmFyIGUgPSAwOyBlIDwgZW1pdHRlcnNMZW5ndGg7IGUrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgZW1pdHRlciA9IGVtaXR0ZXJzW2VdO1xyXG4gICAgICAgIHZhciBwYXJ0aWNsZXMgPSBlbWl0dGVyLmFsaXZlO1xyXG4gICAgICAgIHZhciBwYXJ0aWNsZUNvdW50ID0gcGFydGljbGVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKCFlbWl0dGVyLnZpc2libGUgfHwgcGFydGljbGVDb3VudCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNjcm9sbFggPSBjYW1lcmEuc2Nyb2xsWCAqIGVtaXR0ZXIuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICB2YXIgc2Nyb2xsWSA9IGNhbWVyYS5zY3JvbGxZICogZW1pdHRlci5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1zY3JvbGxYLCAtc2Nyb2xsWSk7XHJcblxyXG4gICAgICAgICAgICBzY3JvbGxYID0gMDtcclxuICAgICAgICAgICAgc2Nyb2xsWSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVuZGVyZXIuc2V0QmxlbmRNb2RlKGVtaXR0ZXIuYmxlbmRNb2RlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBSZWJpbmQgdGhlIHRleHR1cmUgaWYgd2UndmUgZmx1c2hlZFxyXG4gICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQodGV4dHVyZSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1pdHRlci5tYXNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZW1pdHRlci5tYXNrLnByZVJlbmRlcldlYkdMKHJlbmRlcmVyLCBlbWl0dGVyLCBjYW1lcmEpO1xyXG4gICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQodGV4dHVyZSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgdmFyIHRpbnRFZmZlY3QgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRpY2xlQ291bnQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0aWNsZSA9IHBhcnRpY2xlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhbHBoYSA9IHBhcnRpY2xlLmFscGhhICogY2FtZXJhLmFscGhhO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFscGhhIDw9IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgZnJhbWUgPSBwYXJ0aWNsZS5mcmFtZTtcclxuXHJcbiAgICAgICAgICAgIHZhciB4ID0gLShmcmFtZS5oYWxmV2lkdGgpO1xyXG4gICAgICAgICAgICB2YXIgeSA9IC0oZnJhbWUuaGFsZkhlaWdodCk7XHJcbiAgICAgICAgICAgIHZhciB4dyA9IHggKyBmcmFtZS53aWR0aDtcclxuICAgICAgICAgICAgdmFyIHloID0geSArIGZyYW1lLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIHBhcnRpY2xlTWF0cml4LmFwcGx5SVRSUygwLCAwLCBwYXJ0aWNsZS5yb3RhdGlvbiwgcGFydGljbGUuc2NhbGVYLCBwYXJ0aWNsZS5zY2FsZVkpO1xyXG5cclxuICAgICAgICAgICAgcGFydGljbGVNYXRyaXguZSA9IHBhcnRpY2xlLnggLSBzY3JvbGxYO1xyXG4gICAgICAgICAgICBwYXJ0aWNsZU1hdHJpeC5mID0gcGFydGljbGUueSAtIHNjcm9sbFk7XHJcblxyXG4gICAgICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkocGFydGljbGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHR4MCA9IGNhbGNNYXRyaXguZ2V0WCh4LCB5KTtcclxuICAgICAgICAgICAgdmFyIHR5MCA9IGNhbGNNYXRyaXguZ2V0WSh4LCB5KTtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgdHgxID0gY2FsY01hdHJpeC5nZXRYKHgsIHloKTtcclxuICAgICAgICAgICAgdmFyIHR5MSA9IGNhbGNNYXRyaXguZ2V0WSh4LCB5aCk7XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIHR4MiA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeWgpO1xyXG4gICAgICAgICAgICB2YXIgdHkyID0gY2FsY01hdHJpeC5nZXRZKHh3LCB5aCk7XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIHR4MyA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeSk7XHJcbiAgICAgICAgICAgIHZhciB0eTMgPSBjYWxjTWF0cml4LmdldFkoeHcsIHkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJvdW5kUGl4ZWxzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0eDAgPSBNYXRoLnJvdW5kKHR4MCk7XHJcbiAgICAgICAgICAgICAgICB0eTAgPSBNYXRoLnJvdW5kKHR5MCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHR4MSA9IE1hdGgucm91bmQodHgxKTtcclxuICAgICAgICAgICAgICAgIHR5MSA9IE1hdGgucm91bmQodHkxKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdHgyID0gTWF0aC5yb3VuZCh0eDIpO1xyXG4gICAgICAgICAgICAgICAgdHkyID0gTWF0aC5yb3VuZCh0eTIpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICB0eDMgPSBNYXRoLnJvdW5kKHR4Myk7XHJcbiAgICAgICAgICAgICAgICB0eTMgPSBNYXRoLnJvdW5kKHR5Myk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0aW50ID0gZ2V0VGludChwYXJ0aWNsZS50aW50LCBhbHBoYSk7XHJcblxyXG4gICAgICAgICAgICBwaXBlbGluZS5iYXRjaFF1YWQodHgwLCB0eTAsIHR4MSwgdHkxLCB0eDIsIHR5MiwgdHgzLCB0eTMsIGZyYW1lLnUwLCBmcmFtZS52MCwgZnJhbWUudTEsIGZyYW1lLnYxLCB0aW50LCB0aW50LCB0aW50LCB0aW50LCB0aW50RWZmZWN0LCB0ZXh0dXJlLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbWl0dGVyLm1hc2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbWl0dGVyLm1hc2sucG9zdFJlbmRlcldlYkdMKHJlbmRlcmVyLCBjYW1lcmEpO1xyXG4gICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQodGV4dHVyZSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJ0aWNsZU1hbmFnZXJXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBHcmF2aXR5V2VsbDogcmVxdWlyZSgnLi9HcmF2aXR5V2VsbCcpLFxyXG4gICAgUGFydGljbGU6IHJlcXVpcmUoJy4vUGFydGljbGUnKSxcclxuICAgIFBhcnRpY2xlRW1pdHRlcjogcmVxdWlyZSgnLi9QYXJ0aWNsZUVtaXR0ZXInKSxcclxuICAgIFBhcnRpY2xlRW1pdHRlck1hbmFnZXI6IHJlcXVpcmUoJy4vUGFydGljbGVFbWl0dGVyTWFuYWdlcicpLFxyXG4gICAgWm9uZXM6IHJlcXVpcmUoJy4vem9uZXMnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBEZWF0aCBab25lLlxyXG4gKlxyXG4gKiBBIERlYXRoIFpvbmUgaXMgYSBzcGVjaWFsIHR5cGUgb2Ygem9uZSB0aGF0IHdpbGwga2lsbCBhIFBhcnRpY2xlIGFzIHNvb24gYXMgaXQgZWl0aGVyIGVudGVycywgb3IgbGVhdmVzLCB0aGUgem9uZS5cclxuICpcclxuICogVGhlIHpvbmUgY29uc2lzdHMgb2YgYSBgc291cmNlYCB3aGljaCBjb3VsZCBiZSBhIEdlb21ldHJpYyBzaGFwZSwgc3VjaCBhcyBhIFJlY3RhbmdsZSBvciBFbGxpcHNlLCBvciB5b3VyIG93blxyXG4gKiBvYmplY3QgYXMgbG9uZyBhcyBpdCBpbmNsdWRlcyBhIGBjb250YWluc2AgbWV0aG9kIGZvciB3aGljaCB0aGUgUGFydGljbGVzIGNhbiBiZSB0ZXN0ZWQgYWdhaW5zdC5cclxuICpcclxuICogQGNsYXNzIERlYXRoWm9uZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5EZWF0aFpvbmVTb3VyY2V9IHNvdXJjZSAtIEFuIG9iamVjdCBpbnN0YW5jZSB0aGF0IGhhcyBhIGBjb250YWluc2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhIGJvb2xlYW4gd2hlbiBnaXZlbiBgeGAgYW5kIGB5YCBhcmd1bWVudHMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0ga2lsbE9uRW50ZXIgLSBTaG91bGQgdGhlIFBhcnRpY2xlIGJlIGtpbGxlZCB3aGVuIGl0IGVudGVycyB0aGUgem9uZT8gYHRydWVgIG9yIGxlYXZlcyBpdD8gYGZhbHNlYFxyXG4gKi9cclxudmFyIERlYXRoWm9uZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBEZWF0aFpvbmUgKHNvdXJjZSwga2lsbE9uRW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IGluc3RhbmNlIHRoYXQgaGFzIGEgYGNvbnRhaW5zYCBtZXRob2QgdGhhdCByZXR1cm5zIGEgYm9vbGVhbiB3aGVuIGdpdmVuIGB4YCBhbmQgYHlgIGFyZ3VtZW50cy5cclxuICAgICAgICAgKiBUaGlzIGNvdWxkIGJlIGEgR2VvbWV0cnkgc2hhcGUsIHN1Y2ggYXMgYFBoYXNlci5HZW9tLkNpcmNsZWAsIG9yIHlvdXIgb3duIGN1c3RvbSBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkRlYXRoWm9uZSNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5EZWF0aFpvbmVTb3VyY2V9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIFBhcnRpY2xlIHNob3VsZCBiZSBraWxsZWQgaWYgaXQgZW50ZXJzIHRoaXMgem9uZS5cclxuICAgICAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBraWxsIHRoZSBQYXJ0aWNsZSBpZiBpdCBsZWF2ZXMgdGhpcyB6b25lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5EZWF0aFpvbmUja2lsbE9uRW50ZXJcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmtpbGxPbkVudGVyID0ga2lsbE9uRW50ZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBQYXJ0aWNsZSB3aWxsIGJlIGtpbGxlZCBvciBub3QgYnkgdGhpcyB6b25lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5EZWF0aFpvbmUjd2lsbEtpbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgUGFydGljbGUgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0IHRoaXMgem9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm4gYHRydWVgIGlmIHRoZSBQYXJ0aWNsZSBpcyB0byBiZSBraWxsZWQsIG90aGVyd2lzZSByZXR1cm4gYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgd2lsbEtpbGw6IGZ1bmN0aW9uIChwYXJ0aWNsZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgd2l0aGluWm9uZSA9IHRoaXMuc291cmNlLmNvbnRhaW5zKHBhcnRpY2xlLngsIHBhcnRpY2xlLnkpO1xyXG5cclxuICAgICAgICByZXR1cm4gKHdpdGhpblpvbmUgJiYgdGhpcy5raWxsT25FbnRlciB8fCAhd2l0aGluWm9uZSAmJiAhdGhpcy5raWxsT25FbnRlcik7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGVhdGhab25lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHpvbmUgdGhhdCBwbGFjZXMgcGFydGljbGVzIG9uIGEgc2hhcGUncyBlZGdlcy5cclxuICpcclxuICogQGNsYXNzIEVkZ2Vab25lXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVkZ2Vab25lU291cmNlfSBzb3VyY2UgLSBBbiBvYmplY3QgaW5zdGFuY2Ugd2l0aCBhIGBnZXRQb2ludHMocXVhbnRpdHksIHN0ZXBSYXRlKWAgbWV0aG9kIHJldHVybmluZyBhbiBhcnJheSBvZiBwb2ludHMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gcXVhbnRpdHkgLSBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBwbGFjZSBvbiB0aGUgc291cmNlIGVkZ2UuIFNldCB0byAwIHRvIHVzZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwUmF0ZSAtIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcGFydGljbGUuIFdoZW4gc2V0LCBgcXVhbnRpdHlgIGlzIGltcGxpZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gMC5cclxuICogQHBhcmFtIHtib29sZWFufSBbeW95bz1mYWxzZV0gLSBXaGV0aGVyIHBhcnRpY2xlcyBhcmUgcGxhY2VkIGZyb20gc3RhcnQgdG8gZW5kIGFuZCB0aGVuIGVuZCB0byBzdGFydC5cclxuICogQHBhcmFtIHtib29sZWFufSBbc2VhbWxlc3M9dHJ1ZV0gLSBXaGV0aGVyIG9uZSBlbmRwb2ludCB3aWxsIGJlIHJlbW92ZWQgaWYgaXQncyBpZGVudGljYWwgdG8gdGhlIG90aGVyLlxyXG4gKi9cclxudmFyIEVkZ2Vab25lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEVkZ2Vab25lIChzb3VyY2UsIHF1YW50aXR5LCBzdGVwUmF0ZSwgeW95bywgc2VhbWxlc3MpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHlveW8gPT09IHVuZGVmaW5lZCkgeyB5b3lvID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoc2VhbWxlc3MgPT09IHVuZGVmaW5lZCkgeyBzZWFtbGVzcyA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IGluc3RhbmNlIHdpdGggYSBgZ2V0UG9pbnRzKHF1YW50aXR5LCBzdGVwUmF0ZSlgIG1ldGhvZCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgcG9pbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5FZGdlWm9uZSNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5FZGdlWm9uZVNvdXJjZXxQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlJhbmRvbVpvbmVTb3VyY2V9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwb2ludHMgcGxhY2VkIG9uIHRoZSBzb3VyY2UgZWRnZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjcG9pbnRzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HZW9tLlBvaW50W119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBwbGFjZSBvbiB0aGUgc291cmNlIGVkZ2UuIFNldCB0byAwIHRvIHVzZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkVkZ2Vab25lI3F1YW50aXR5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5xdWFudGl0eSA9IHF1YW50aXR5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhcnRpY2xlLiBXaGVuIHNldCwgYHF1YW50aXR5YCBpcyBpbXBsaWVkIGFuZCBzaG91bGQgYmUgc2V0IHRvIDAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkVkZ2Vab25lI3N0ZXBSYXRlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0ZXBSYXRlID0gc3RlcFJhdGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgcGFydGljbGVzIGFyZSBwbGFjZWQgZnJvbSBzdGFydCB0byBlbmQgYW5kIHRoZW4gZW5kIHRvIHN0YXJ0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5FZGdlWm9uZSN5b3lvXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55b3lvID0geW95bztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvdW50ZXIgdXNlZCBmb3IgaXRlcmF0aW5nIHRoZSBFZGdlWm9uZSdzIHBvaW50cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjY291bnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgLTFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvdW50ZXIgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciBvbmUgZW5kcG9pbnQgd2lsbCBiZSByZW1vdmVkIGlmIGl0J3MgaWRlbnRpY2FsIHRvIHRoZSBvdGhlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjc2VhbWxlc3NcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNlYW1sZXNzID0gc2VhbWxlc3M7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVybmFsIGNvdW50IG9mIHRoZSBwb2ludHMgYmVsb25naW5nIHRvIHRoaXMgRWRnZVpvbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkVkZ2Vab25lI19sZW5ndGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVybmFsIHZhbHVlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24gZGlyZWN0aW9uIGZvciB0aGUgRWRnZVpvbmUncyBwb2ludHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAwID0gZm9yd2FyZHMsIDEgPSBiYWNrd2FyZHNcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjX2RpcmVjdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTb3VyY2UoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkVkZ2Vab25lI3BvaW50c30gZnJvbSB0aGUgRWRnZVpvbmUnc1xyXG4gICAgICoge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjc291cmNlfS5cclxuICAgICAqXHJcbiAgICAgKiBBbHNvIHVwZGF0ZXMgaW50ZXJuYWwgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjdXBkYXRlU291cmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEVkZ2UgWm9uZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlU291cmNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucG9pbnRzID0gdGhpcy5zb3VyY2UuZ2V0UG9pbnRzKHRoaXMucXVhbnRpdHksIHRoaXMuc3RlcFJhdGUpO1xyXG5cclxuICAgICAgICAvLyAgUmVtb3ZlIGVuZHM/XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhbWxlc3MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYSA9IHRoaXMucG9pbnRzWzBdO1xyXG4gICAgICAgICAgICB2YXIgYiA9IHRoaXMucG9pbnRzW3RoaXMucG9pbnRzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGEueCA9PT0gYi54ICYmIGEueSA9PT0gYi55KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50cy5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9sZExlbmd0aCA9IHRoaXMuX2xlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gdGhpcy5wb2ludHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAvLyAgQWRqdXN0IGNvdW50ZXIgaWYgd2Ugbm93IGhhdmUgbGVzcyBwb2ludHMgdGhhbiBiZWZvcmVcclxuICAgICAgICBpZiAodGhpcy5fbGVuZ3RoIDwgb2xkTGVuZ3RoICYmIHRoaXMuY291bnRlciA+IHRoaXMuX2xlbmd0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnRlciA9IHRoaXMuX2xlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2UgdGhlIHNvdXJjZSBvZiB0aGUgRWRnZVpvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzLkVkZ2Vab25lI2NoYW5nZVNvdXJjZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLkVkZ2Vab25lU291cmNlfSBzb3VyY2UgLSBBbiBvYmplY3QgaW5zdGFuY2Ugd2l0aCBhIGBnZXRQb2ludHMocXVhbnRpdHksIHN0ZXBSYXRlKWAgbWV0aG9kIHJldHVybmluZyBhbiBhcnJheSBvZiBwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBFZGdlIFpvbmUuXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU291cmNlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuZXh0IHBvaW50IGluIHRoZSBab25lIGFuZCBzZXQgaXRzIGNvb3JkaW5hdGVzIG9uIHRoZSBnaXZlbiBQYXJ0aWNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuRWRnZVpvbmUjZ2V0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5QYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgUGFydGljbGUuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50OiBmdW5jdGlvbiAocGFydGljbGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnRlcisrO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY291bnRlciA+PSB0aGlzLl9sZW5ndGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnlveW8pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZXIgPSB0aGlzLl9sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jb3VudGVyLS07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb3VudGVyID09PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMueW95bylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gdGhpcy5fbGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBvaW50ID0gdGhpcy5wb2ludHNbdGhpcy5jb3VudGVyXTtcclxuXHJcbiAgICAgICAgaWYgKHBvaW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGFydGljbGUueCA9IHBvaW50Lng7XHJcbiAgICAgICAgICAgIHBhcnRpY2xlLnkgPSBwb2ludC55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFZGdlWm9uZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSB6b25lIHRoYXQgcGxhY2VzIHBhcnRpY2xlcyByYW5kb21seSB3aXRoaW4gYSBzaGFwZSdzIGFyZWEuXHJcbiAqXHJcbiAqIEBjbGFzcyBSYW5kb21ab25lXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlpvbmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlJhbmRvbVpvbmVTb3VyY2V9IHNvdXJjZSAtIEFuIG9iamVjdCBpbnN0YW5jZSB3aXRoIGEgYGdldFJhbmRvbVBvaW50KHBvaW50KWAgbWV0aG9kLlxyXG4gKi9cclxudmFyIFJhbmRvbVpvbmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUmFuZG9tWm9uZSAoc291cmNlKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIG9iamVjdCBpbnN0YW5jZSB3aXRoIGEgYGdldFJhbmRvbVBvaW50KHBvaW50KWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlBhcnRpY2xlcy5ab25lcy5SYW5kb21ab25lI3NvdXJjZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuUGFydGljbGVzLlJhbmRvbVpvbmVTb3VyY2V9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGNhbGN1bGF0aW9uIHZlY3Rvci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuUmFuZG9tWm9uZSNfdGVtcFZlY1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYyA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBuZXh0IHBvaW50IGluIHRoZSBab25lIGFuZCBzZXQgaXRzIGNvb3JkaW5hdGVzIG9uIHRoZSBnaXZlbiBQYXJ0aWNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXMuUmFuZG9tWm9uZSNnZXRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUGFydGljbGVzLlBhcnRpY2xlfSBwYXJ0aWNsZSAtIFRoZSBQYXJ0aWNsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uIChwYXJ0aWNsZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdmVjID0gdGhpcy5fdGVtcFZlYztcclxuXHJcbiAgICAgICAgdGhpcy5zb3VyY2UuZ2V0UmFuZG9tUG9pbnQodmVjKTtcclxuXHJcbiAgICAgICAgcGFydGljbGUueCA9IHZlYy54O1xyXG4gICAgICAgIHBhcnRpY2xlLnkgPSB2ZWMueTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYW5kb21ab25lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5HYW1lT2JqZWN0cy5QYXJ0aWNsZXMuWm9uZXNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBEZWF0aFpvbmU6IHJlcXVpcmUoJy4vRGVhdGhab25lJyksXHJcbiAgICBFZGdlWm9uZTogcmVxdWlyZSgnLi9FZGdlWm9uZScpLFxyXG4gICAgUmFuZG9tWm9uZTogcmVxdWlyZSgnLi9SYW5kb21ab25lJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBTcHJpdGUgPSByZXF1aXJlKCcuLi9zcHJpdGUvU3ByaXRlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFBhdGhGb2xsb3dlciBHYW1lIE9iamVjdC5cclxuICpcclxuICogQSBQYXRoRm9sbG93ZXIgaXMgYSBTcHJpdGUgR2FtZSBPYmplY3Qgd2l0aCBzb21lIGV4dHJhIGhlbHBlcnMgdG8gYWxsb3cgaXQgdG8gZm9sbG93IGEgUGF0aCBhdXRvbWF0aWNhbGx5LlxyXG4gKlxyXG4gKiBBbnl0aGluZyB5b3UgY2FuIGRvIHdpdGggYSBzdGFuZGFyZCBTcHJpdGUgY2FuIGJlIGRvbmUgd2l0aCB0aGlzIFBhdGhGb2xsb3dlciwgc3VjaCBhcyBhbmltYXRlIGl0LCB0aW50IGl0LFxyXG4gKiBzY2FsZSBpdCBhbmQgc28gb24uXHJcbiAqXHJcbiAqIFBhdGhGb2xsb3dlcnMgYXJlIGJvdW5kIHRvIGEgc2luZ2xlIFBhdGggYXQgYW55IG9uZSB0aW1lIGFuZCBjYW4gdHJhdmVyc2UgdGhlIGxlbmd0aCBvZiB0aGUgUGF0aCwgZnJvbSBzdGFydFxyXG4gKiB0byBmaW5pc2gsIGZvcndhcmRzIG9yIGJhY2t3YXJkcywgb3IgZnJvbSBhbnkgZ2l2ZW4gcG9pbnQgb24gdGhlIFBhdGggdG8gaXRzIGVuZC4gVGhleSBjYW4gb3B0aW9uYWxseSByb3RhdGVcclxuICogdG8gZmFjZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBwYXRoLCBiZSBvZmZzZXQgZnJvbSB0aGUgcGF0aCBjb29yZGluYXRlcyBvciByb3RhdGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgUGF0aC5cclxuICpcclxuICogQGNsYXNzIFBhdGhGb2xsb3dlclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGF0aEZvbGxvd2VyXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIFBhdGhGb2xsb3dlciBiZWxvbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DdXJ2ZXMuUGF0aH0gcGF0aCAtIFRoZSBQYXRoIHRoaXMgUGF0aEZvbGxvd2VyIGlzIGZvbGxvd2luZy4gSXQgY2FuIG9ubHkgZm9sbG93IG9uZSBQYXRoIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKi9cclxudmFyIFBhdGhGb2xsb3dlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU3ByaXRlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuUGF0aEZvbGxvd2VyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUGF0aEZvbGxvd2VyIChzY2VuZSwgcGF0aCwgeCwgeSwgdGV4dHVyZSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgU3ByaXRlLmNhbGwodGhpcywgc2NlbmUsIHgsIHksIHRleHR1cmUsIGZyYW1lKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB1cGRhdGUgaGFuZGxlciB0aGF0IGFkdmFuY2VzIHRoaXMgUGF0aEZvbGxvd2VyIGFsb25nIHRoZSBwYXRoLlxyXG4gICAgICpcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBTY2VuZSBzdGVwLCBzaG91bGQgbm90IHR5cGljYWxseSBiZSBjYWxsZWQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyI3ByZVVwZGF0ZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGdlbmVyYXRlZCBieSB0aGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgb3IgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmltcy51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgICAgIHRoaXMucGF0aFVwZGF0ZSh0aW1lKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXRoRm9sbG93ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIFBhdGhGb2xsb3dlciA9IHJlcXVpcmUoJy4vUGF0aEZvbGxvd2VyJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBQYXRoRm9sbG93ZXIgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBQYXRoRm9sbG93ZXIgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I2ZvbGxvd2VyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DdXJ2ZXMuUGF0aH0gcGF0aCAtIFRoZSBQYXRoIHRoaXMgUGF0aEZvbGxvd2VyIGlzIGNvbm5lY3RlZCB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUGF0aEZvbGxvd2VyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdmb2xsb3dlcicsIGZ1bmN0aW9uIChwYXRoLCB4LCB5LCBrZXksIGZyYW1lKVxyXG57XHJcbiAgICB2YXIgc3ByaXRlID0gbmV3IFBhdGhGb2xsb3dlcih0aGlzLnNjZW5lLCBwYXRoLCB4LCB5LCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlMaXN0LmFkZChzcHJpdGUpO1xyXG4gICAgdGhpcy51cGRhdGVMaXN0LmFkZChzcHJpdGUpO1xyXG5cclxuICAgIHJldHVybiBzcHJpdGU7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RGYWN0b3J5IGNvbnRleHQuXHJcbi8vXHJcbi8vICBUaGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byB1c2U6XHJcbi8vXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgTWVzaCA9IHJlcXVpcmUoJy4uL21lc2gvTWVzaCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBRdWFkIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBBIFF1YWQgaXMgYSBNZXNoIEdhbWUgT2JqZWN0IHByZS1jb25maWd1cmVkIHdpdGggdHdvIHRyaWFuZ2xlcyBhcnJhbmdlZCBpbnRvIGEgcmVjdGFuZ2xlLCB3aXRoIGEgc2luZ2xlXHJcbiAqIHRleHR1cmUgc3ByZWFkIGFjcm9zcyB0aGVtLlxyXG4gKlxyXG4gKiBZb3UgY2FuIG1hbmlwdWxhdGUgdGhlIGNvcm5lciBwb2ludHMgb2YgdGhlIHF1YWQgdmlhIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHN1Y2ggYXMgYHRvcExlZnRYYCwgYW5kIGFsc29cclxuICogY2hhbmdlIHRoZWlyIGFscGhhIGFuZCBjb2xvciB2YWx1ZXMuIFRoZSBxdWFkIGl0c2VsZiBjYW4gYmUgbW92ZWQgYnkgYWRqdXN0aW5nIHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAY2xhc3MgUXVhZFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuTWVzaFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAd2ViZ2xPbmx5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBRdWFkIGJlbG9uZ3MuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICovXHJcbnZhciBRdWFkID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBNZXNoLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUXVhZCAoc2NlbmUsIHgsIHksIHRleHR1cmUsIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIC8vICAwLS0tLTNcclxuICAgICAgICAvLyAgfFxcICBCfFxyXG4gICAgICAgIC8vICB8IFxcICB8XHJcbiAgICAgICAgLy8gIHwgIFxcIHxcclxuICAgICAgICAvLyAgfCBBIFxcfFxyXG4gICAgICAgIC8vICB8ICAgIFxcXHJcbiAgICAgICAgLy8gIDEtLS0tMlxyXG5cclxuICAgICAgICB2YXIgdmVydGljZXMgPSBbXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIHRsXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIGJsXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIGJyXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIHRsXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIGJyXHJcbiAgICAgICAgICAgIDAsIDAgLy8gdHJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB2YXIgdXYgPSBbXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIHRsXHJcbiAgICAgICAgICAgIDAsIDEsIC8vIGJsXHJcbiAgICAgICAgICAgIDEsIDEsIC8vIGJyXHJcbiAgICAgICAgICAgIDAsIDAsIC8vIHRsXHJcbiAgICAgICAgICAgIDEsIDEsIC8vIGJyXHJcbiAgICAgICAgICAgIDEsIDAgLy8gdHJcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICB2YXIgY29sb3JzID0gW1xyXG4gICAgICAgICAgICAweGZmZmZmZiwgLy8gdGxcclxuICAgICAgICAgICAgMHhmZmZmZmYsIC8vIGJsXHJcbiAgICAgICAgICAgIDB4ZmZmZmZmLCAvLyBiclxyXG4gICAgICAgICAgICAweGZmZmZmZiwgLy8gdGxcclxuICAgICAgICAgICAgMHhmZmZmZmYsIC8vIGJyXHJcbiAgICAgICAgICAgIDB4ZmZmZmZmIC8vIHRyXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgdmFyIGFscGhhcyA9IFtcclxuICAgICAgICAgICAgMSwgLy8gdGxcclxuICAgICAgICAgICAgMSwgLy8gYmxcclxuICAgICAgICAgICAgMSwgLy8gYnJcclxuICAgICAgICAgICAgMSwgLy8gdGxcclxuICAgICAgICAgICAgMSwgLy8gYnJcclxuICAgICAgICAgICAgMSAvLyB0clxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIE1lc2guY2FsbCh0aGlzLCBzY2VuZSwgeCwgeSwgdmVydGljZXMsIHV2LCBjb2xvcnMsIGFscGhhcywgdGV4dHVyZSwgZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2V0UG9zaXRpb24oKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmFtZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBGcmFtZSBoYXMgdG8gYmVsb25nIHRvIHRoZSBjdXJyZW50IFRleHR1cmUgYmVpbmcgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIENhbGxpbmcgYHNldEZyYW1lYCB3aWxsIG1vZGlmeSB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyBvZiB5b3VyIEdhbWUgT2JqZWN0LlxyXG4gICAgICogSXQgd2lsbCBhbHNvIGNoYW5nZSB0aGUgYG9yaWdpbmAgaWYgdGhlIEZyYW1lIGhhcyBhIGN1c3RvbSBwaXZvdCBwb2ludCwgYXMgZXhwb3J0ZWQgZnJvbSBwYWNrYWdlcyBsaWtlIFRleHR1cmUgUGFja2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjc2V0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IGZyYW1lIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGcmFtZTogZnVuY3Rpb24gKGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZnJhbWUgPSB0aGlzLnRleHR1cmUuZ2V0KGZyYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZyYW1lLmN1dFdpZHRoIHx8ICF0aGlzLmZyYW1lLmN1dEhlaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgJj0gfjg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgfD0gODtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZyYW1lID0gdGhpcy5mcmFtZTtcclxuXHJcbiAgICAgICAgLy8gICBUTFxyXG4gICAgICAgIHRoaXMudXZbMF0gPSBmcmFtZS51MDtcclxuICAgICAgICB0aGlzLnV2WzFdID0gZnJhbWUudjA7XHJcblxyXG4gICAgICAgIC8vICAgQkxcclxuICAgICAgICB0aGlzLnV2WzJdID0gZnJhbWUudTA7XHJcbiAgICAgICAgdGhpcy51dlszXSA9IGZyYW1lLnYxO1xyXG5cclxuICAgICAgICAvLyAgIEJSXHJcbiAgICAgICAgdGhpcy51dls0XSA9IGZyYW1lLnUxO1xyXG4gICAgICAgIHRoaXMudXZbNV0gPSBmcmFtZS52MTtcclxuXHJcbiAgICAgICAgLy8gICBUTFxyXG4gICAgICAgIHRoaXMudXZbNl0gPSBmcmFtZS51MDtcclxuICAgICAgICB0aGlzLnV2WzddID0gZnJhbWUudjA7XHJcblxyXG4gICAgICAgIC8vICAgQlJcclxuICAgICAgICB0aGlzLnV2WzhdID0gZnJhbWUudTE7XHJcbiAgICAgICAgdGhpcy51dls5XSA9IGZyYW1lLnYxO1xyXG5cclxuICAgICAgICAvLyAgIFRSXHJcbiAgICAgICAgdGhpcy51dlsxMF0gPSBmcmFtZS51MTtcclxuICAgICAgICB0aGlzLnV2WzExXSA9IGZyYW1lLnYwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wLWxlZnQgeCB2ZXJ0ZXggb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI3RvcExlZnRYXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRvcExlZnRYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyB0aGlzLnZlcnRpY2VzWzBdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNlc1swXSA9IHZhbHVlIC0gdGhpcy54O1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2VzWzZdID0gdmFsdWUgLSB0aGlzLng7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wLWxlZnQgeSB2ZXJ0ZXggb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI3RvcExlZnRZXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRvcExlZnRZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgKyB0aGlzLnZlcnRpY2VzWzFdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNlc1sxXSA9IHZhbHVlIC0gdGhpcy55O1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2VzWzddID0gdmFsdWUgLSB0aGlzLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wLXJpZ2h0IHggdmVydGV4IG9mIHRoaXMgUXVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCN0b3BSaWdodFhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wUmlnaHRYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyB0aGlzLnZlcnRpY2VzWzEwXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXNbMTBdID0gdmFsdWUgLSB0aGlzLng7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wLXJpZ2h0IHkgdmVydGV4IG9mIHRoaXMgUXVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCN0b3BSaWdodFlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wUmlnaHRZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgKyB0aGlzLnZlcnRpY2VzWzExXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXNbMTFdID0gdmFsdWUgLSB0aGlzLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYm90dG9tLWxlZnQgeCB2ZXJ0ZXggb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI2JvdHRvbUxlZnRYXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJvdHRvbUxlZnRYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyB0aGlzLnZlcnRpY2VzWzJdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNlc1syXSA9IHZhbHVlIC0gdGhpcy54O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJvdHRvbS1sZWZ0IHkgdmVydGV4IG9mIHRoaXMgUXVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCNib3R0b21MZWZ0WVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b21MZWZ0WToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ICsgdGhpcy52ZXJ0aWNlc1szXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXNbM10gPSB2YWx1ZSAtIHRoaXMueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20tcmlnaHQgeCB2ZXJ0ZXggb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI2JvdHRvbVJpZ2h0WFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b21SaWdodFg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueCArIHRoaXMudmVydGljZXNbNF07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2VzWzRdID0gdmFsdWUgLSB0aGlzLng7XHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXNbOF0gPSB2YWx1ZSAtIHRoaXMueDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20tcmlnaHQgeSB2ZXJ0ZXggb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI2JvdHRvbVJpZ2h0WVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b21SaWdodFk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueSArIHRoaXMudmVydGljZXNbNV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2VzWzVdID0gdmFsdWUgLSB0aGlzLnk7XHJcbiAgICAgICAgICAgIHRoaXMudmVydGljZXNbOV0gPSB2YWx1ZSAtIHRoaXMueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0b3AtbGVmdCBhbHBoYSB2YWx1ZSBvZiB0aGlzIFF1YWQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjdG9wTGVmdEFscGhhXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRvcExlZnRBbHBoYToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbHBoYXNbMF07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhc1swXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhc1szXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRvcC1yaWdodCBhbHBoYSB2YWx1ZSBvZiB0aGlzIFF1YWQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjdG9wUmlnaHRBbHBoYVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0b3BSaWdodEFscGhhOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFscGhhc1s1XTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxwaGFzWzVdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYm90dG9tLWxlZnQgYWxwaGEgdmFsdWUgb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI2JvdHRvbUxlZnRBbHBoYVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b21MZWZ0QWxwaGE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxwaGFzWzFdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5hbHBoYXNbMV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20tcmlnaHQgYWxwaGEgdmFsdWUgb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5RdWFkI2JvdHRvbVJpZ2h0QWxwaGFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm90dG9tUmlnaHRBbHBoYToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbHBoYXNbMl07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhc1syXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhc1s0XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRvcC1sZWZ0IGNvbG9yIHZhbHVlIG9mIHRoaXMgUXVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCN0b3BMZWZ0Q29sb3JcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wTGVmdENvbG9yOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbG9yc1swXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3JzWzBdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3JzWzNdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG9wLXJpZ2h0IGNvbG9yIHZhbHVlIG9mIHRoaXMgUXVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCN0b3BSaWdodENvbG9yXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRvcFJpZ2h0Q29sb3I6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JzWzVdO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jb2xvcnNbNV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20tbGVmdCBjb2xvciB2YWx1ZSBvZiB0aGlzIFF1YWQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjYm90dG9tTGVmdENvbG9yXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJvdHRvbUxlZnRDb2xvcjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xvcnNbMV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNvbG9yc1sxXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJvdHRvbS1yaWdodCBjb2xvciB2YWx1ZSBvZiB0aGlzIFF1YWQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjYm90dG9tUmlnaHRDb2xvclxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b21SaWdodENvbG9yOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbG9yc1syXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3JzWzJdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3JzWzRdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0b3AtbGVmdCB2ZXJ0ZXggcG9zaXRpb24gb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjc2V0VG9wTGVmdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXguXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VG9wTGVmdDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50b3BMZWZ0WCA9IHg7XHJcbiAgICAgICAgdGhpcy50b3BMZWZ0WSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRvcC1yaWdodCB2ZXJ0ZXggcG9zaXRpb24gb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjc2V0VG9wUmlnaHRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRvcFJpZ2h0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRvcFJpZ2h0WCA9IHg7XHJcbiAgICAgICAgdGhpcy50b3BSaWdodFkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib3R0b20tbGVmdCB2ZXJ0ZXggcG9zaXRpb24gb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjc2V0Qm90dG9tTGVmdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXguXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm90dG9tTGVmdDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib3R0b21MZWZ0WCA9IHg7XHJcbiAgICAgICAgdGhpcy5ib3R0b21MZWZ0WSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGJvdHRvbS1yaWdodCB2ZXJ0ZXggcG9zaXRpb24gb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjc2V0Qm90dG9tUmlnaHRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdHRvbVJpZ2h0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvdHRvbVJpZ2h0WCA9IHg7XHJcbiAgICAgICAgdGhpcy5ib3R0b21SaWdodFkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIHBvc2l0aW9ucyBvZiB0aGUgZm91ciBjb3JuZXIgdmVydGljZXMgb2YgdGhpcyBRdWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjcmVzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzZXRQb3NpdGlvbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgaGFsZldpZHRoID0gTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gMik7XHJcbiAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VG9wTGVmdCh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRUb3BSaWdodCh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRCb3R0b21MZWZ0KHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnNldEJvdHRvbVJpZ2h0KHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBhbHBoYSB2YWx1ZXMgdXNlZCBieSB0aGlzIFF1YWQgYmFjayB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjcmVzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzZXRBbHBoYTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYWxwaGFzID0gdGhpcy5hbHBoYXM7XHJcblxyXG4gICAgICAgIGFscGhhc1swXSA9IDE7XHJcbiAgICAgICAgYWxwaGFzWzFdID0gMTtcclxuICAgICAgICBhbHBoYXNbMl0gPSAxO1xyXG4gICAgICAgIGFscGhhc1szXSA9IDE7XHJcbiAgICAgICAgYWxwaGFzWzRdID0gMTtcclxuICAgICAgICBhbHBoYXNbNV0gPSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIGNvbG9yIHZhbHVlcyB1c2VkIGJ5IHRoaXMgUXVhZCBiYWNrIHRvIDB4ZmZmZmZmLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlF1YWQjcmVzZXRDb2xvcnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Q29sb3JzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb2xvcnMgPSB0aGlzLmNvbG9ycztcclxuXHJcbiAgICAgICAgY29sb3JzWzBdID0gMHhmZmZmZmY7XHJcbiAgICAgICAgY29sb3JzWzFdID0gMHhmZmZmZmY7XHJcbiAgICAgICAgY29sb3JzWzJdID0gMHhmZmZmZmY7XHJcbiAgICAgICAgY29sb3JzWzNdID0gMHhmZmZmZmY7XHJcbiAgICAgICAgY29sb3JzWzRdID0gMHhmZmZmZmY7XHJcbiAgICAgICAgY29sb3JzWzVdID0gMHhmZmZmZmY7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcG9zaXRpb24sIGFscGhhIGFuZCBjb2xvciB2YWx1ZXMgdXNlZCBieSB0aGlzIFF1YWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUXVhZCNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRBbHBoYSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNldENvbG9ycygpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFF1YWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJ1aWxkR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0J1aWxkR2FtZU9iamVjdCcpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBRdWFkID0gcmVxdWlyZSgnLi9RdWFkJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBRdWFkIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBRdWFkIEdhbWUgT2JqZWN0IGFuZCBXZWJHTCBzdXBwb3J0IGhhdmUgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3IjcXVhZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUXVhZH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3RlcigncXVhZCcsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciB4ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd4JywgMCk7XHJcbiAgICB2YXIgeSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAneScsIDApO1xyXG4gICAgdmFyIGtleSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAna2V5JywgbnVsbCk7XHJcbiAgICB2YXIgZnJhbWUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgbnVsbCk7XHJcblxyXG4gICAgdmFyIHF1YWQgPSBuZXcgUXVhZCh0aGlzLnNjZW5lLCB4LCB5LCBrZXksIGZyYW1lKTtcclxuXHJcbiAgICBpZiAoYWRkVG9TY2VuZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbmZpZy5hZGQgPSBhZGRUb1NjZW5lO1xyXG4gICAgfVxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdCh0aGlzLnNjZW5lLCBxdWFkLCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiBxdWFkO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUXVhZCA9IHJlcXVpcmUoJy4vUXVhZCcpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgUXVhZCBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFF1YWQgR2FtZSBPYmplY3QgYW5kIFdlYkdMIHN1cHBvcnQgaGF2ZSBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNxdWFkXHJcbiAqIEB3ZWJnbE9ubHlcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5RdWFkfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIEdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdxdWFkJywgZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBRdWFkKHRoaXMuc2NlbmUsIHgsIHksIGtleSwgZnJhbWUpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy8gIFxyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vLyAgXHJcbi8vICB0aGlzLnNjZW5lIC0gYSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgb3ducyB0aGUgR2FtZU9iamVjdEZhY3RvcnlcclxuLy8gIHRoaXMuZGlzcGxheUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbi8vICB0aGlzLnVwZGF0ZUxpc3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgVXBkYXRlIExpc3QgdGhlIFNjZW5lIG93bnNcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmxlbmRNb2RlcyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL0JsZW5kTW9kZXMnKTtcclxudmFyIENhbWVyYSA9IHJlcXVpcmUoJy4uLy4uL2NhbWVyYXMvMmQvQmFzZUNhbWVyYScpO1xyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uLy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uLy4uL2NvbnN0Jyk7XHJcbnZhciBGcmFtZSA9IHJlcXVpcmUoJy4uLy4uL3RleHR1cmVzL0ZyYW1lJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgUmVuZGVyID0gcmVxdWlyZSgnLi9SZW5kZXJUZXh0dXJlUmVuZGVyJyk7XHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcbnZhciBVVUlEID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvc3RyaW5nL1VVSUQnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgUmVuZGVyIFRleHR1cmUuXHJcbiAqIFxyXG4gKiBBIFJlbmRlciBUZXh0dXJlIGlzIGEgc3BlY2lhbCB0ZXh0dXJlIHRoYXQgYWxsb3dzIGFueSBudW1iZXIgb2YgR2FtZSBPYmplY3RzIHRvIGJlIGRyYXduIHRvIGl0LiBZb3UgY2FuIHRha2UgbWFueSBjb21wbGV4IG9iamVjdHMgYW5kXHJcbiAqIGRyYXcgdGhlbSBhbGwgdG8gdGhpcyBvbmUgdGV4dHVyZSwgd2hpY2ggY2FuIHRoZXkgYmUgdXNlZCBhcyB0aGUgdGV4dHVyZSBmb3Igb3RoZXIgR2FtZSBPYmplY3Qncy4gSXQncyBhIHdheSB0byBnZW5lcmF0ZSBkeW5hbWljXHJcbiAqIHRleHR1cmVzIGF0IHJ1bi10aW1lIHRoYXQgYXJlIFdlYkdMIGZyaWVuZGx5IGFuZCBkb24ndCBpbnZva2UgZXhwZW5zaXZlIEdQVSB1cGxvYWRzLlxyXG4gKiBcclxuICogTm90ZSB0aGF0IHVuZGVyIFdlYkdMIGEgRnJhbWVCdWZmZXIsIHdoaWNoIGlzIHdoYXQgdGhlIFJlbmRlciBUZXh0dXJlIHVzZXMgaW50ZXJuYWxseSwgY2Fubm90IGJlIGFudGktYWxpYXNlZC4gVGhpcyBtZWFuc1xyXG4gKiB0aGF0IHdoZW4gZHJhd2luZyBvYmplY3RzIHN1Y2ggYXMgU2hhcGVzIHRvIGEgUmVuZGVyIFRleHR1cmUgdGhleSB3aWxsIGFwcGVhciB0byBiZSBkcmF3biB3aXRoIG5vIGFsaWFzaW5nLCBob3dldmVyIHRoaXNcclxuICogaXMgYSB0ZWNobmljYWwgbGltaXRhdGlvbiBvZiBXZWJHTC4gVG8gZ2V0IGFyb3VuZCBpdCwgY3JlYXRlIHlvdXIgc2hhcGUgYXMgYSB0ZXh0dXJlIGluIGFuIGFydCBwYWNrYWdlLCB0aGVuIGRyYXcgdGhhdFxyXG4gKiB0byB0aGUgUmVuZGVyIFRleHR1cmUuXHJcbiAqXHJcbiAqIEBjbGFzcyBSZW5kZXJUZXh0dXJlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjIuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNyb3BcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnRcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9MzJdIC0gVGhlIHdpZHRoIG9mIHRoZSBSZW5kZXIgVGV4dHVyZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PTMyXSAtIFRoZSBoZWlnaHQgb2YgdGhlIFJlbmRlciBUZXh0dXJlLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2tleV0gLSBUaGUgdGV4dHVyZSBrZXkgdG8gbWFrZSB0aGUgUmVuZGVyVGV4dHVyZSBmcm9tLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZyYW1lXSAtIHRoZSBmcmFtZSB0byBtYWtlIHRoZSBSZW5kZXJUZXh0dXJlIGZyb20uXHJcbiAqL1xyXG52YXIgUmVuZGVyVGV4dHVyZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ29tcHV0ZWRTaXplLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ3JvcCxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuRmxpcCxcclxuICAgICAgICBDb21wb25lbnRzLkdldEJvdW5kcyxcclxuICAgICAgICBDb21wb25lbnRzLk1hc2ssXHJcbiAgICAgICAgQ29tcG9uZW50cy5PcmlnaW4sXHJcbiAgICAgICAgQ29tcG9uZW50cy5QaXBlbGluZSxcclxuICAgICAgICBDb21wb25lbnRzLlNjcm9sbEZhY3RvcixcclxuICAgICAgICBDb21wb25lbnRzLlRpbnQsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFJlbmRlclRleHR1cmUgKHNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBrZXksIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAzMjsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSAzMjsgfVxyXG5cclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdSZW5kZXJUZXh0dXJlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIGVpdGhlciB0aGUgQ2FudmFzIG9yIFdlYkdMIFJlbmRlcmVyIHRoYXQgdGhlIEdhbWUgaW5zdGFuY2UgaXMgdXNpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNyZW5kZXJlclxyXG4gICAgICAgICAqIEB0eXBlIHsoUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcnxQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcil9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHNjZW5lLnN5cy5nYW1lLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjdGV4dHVyZU1hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gc2NlbmUuc3lzLnRleHR1cmVzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGludCBvZiB0aGUgUmVuZGVyIFRleHR1cmUgd2hlbiByZW5kZXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2dsb2JhbFRpbnRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDB4ZmZmZmZmXHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nbG9iYWxUaW50ID0gMHhmZmZmZmY7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbHBoYSBvZiB0aGUgUmVuZGVyIFRleHR1cmUgd2hlbiByZW5kZXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2dsb2JhbEFscGhhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nbG9iYWxBbHBoYSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBIVE1MIENhbnZhcyBFbGVtZW50IHRoYXQgdGhlIFJlbmRlciBUZXh0dXJlIGlzIGRyYXdpbmcgdG8gd2hlbiB1c2luZyB0aGUgQ2FudmFzIFJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjY2FudmFzXHJcbiAgICAgICAgICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEdMIEZyYW1lIEJ1ZmZlciB0aGlzIFJlbmRlciBUZXh0dXJlIGlzIGRyYXdpbmcgdG8uXHJcbiAgICAgICAgICogVGhpcyBpcyBvbmx5IHNldCBpZiBQaGFzZXIgaXMgcnVubmluZyB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2ZyYW1lYnVmZmVyXHJcbiAgICAgICAgICogQHR5cGUgez9XZWJHTEZyYW1lYnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIFJlbmRlciBUZXh0dXJlIGRpcnR5IG9yIG5vdD8gSWYgbm90IGl0IHdvbid0IHNwZW5kIHRpbWUgY2xlYXJpbmcgb3IgZmlsbGluZyBpdHNlbGYuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNkaXJ0eVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbnRlcm5hbCBjcm9wIGRhdGEgb2JqZWN0LCBhcyB1c2VkIGJ5IGBzZXRDcm9wYCBhbmQgcGFzc2VkIHRvIHRoZSBgRnJhbWUuc2V0Q3JvcFVWc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjX2Nyb3BcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2Nyb3AgPSB0aGlzLnJlc2V0Q3JvcE9iamVjdCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVGV4dHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSN0ZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgRnJhbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjZnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgc2F2ZWQgdGV4dHVyZSBmbGFnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjX3NhdmVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fc2F2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBDYW52YXNQb29sLmNyZWF0ZTJEKHRoaXMsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gIENyZWF0ZSBhIG5ldyBUZXh0dXJlIGZvciB0aGlzIFRleHQgb2JqZWN0XHJcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IHNjZW5lLnN5cy50ZXh0dXJlcy5hZGRDYW52YXMoVVVJRCgpLCB0aGlzLmNhbnZhcyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyAgR2V0IHRoZSBmcmFtZVxyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy50ZXh0dXJlLmdldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBzY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyAgR2V0IHRoZSBmcmFtZVxyXG4gICAgICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy50ZXh0dXJlLmdldChmcmFtZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IHRoaXMuZnJhbWUuc291cmNlLmltYWdlO1xyXG4gICAgICAgICAgICB0aGlzLl9zYXZlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmZyYW1lLmN1dFdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuZnJhbWUuY3V0SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFJlbmRlcmluZyBDb250ZXh0IGJlbG9uZ2luZyB0byB0aGUgQ2FudmFzIEVsZW1lbnQgdGhpcyBSZW5kZXIgVGV4dHVyZSBpcyBkcmF3aW5nIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjY29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgZXJhc2UgbW9kZSBmbGFnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjX2VyYXNlTW9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2VyYXNlTW9kZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBDYW1lcmEgdGhhdCBjYW4gYmUgdXNlZCB0byBtb3ZlIGFyb3VuZCB0aGUgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgICAgICogQ29udHJvbCBpdCBqdXN0IGxpa2UgeW91IHdvdWxkIGFueSBTY2VuZSBDYW1lcmEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaXQgb25seSBpbXBhY3RzIHRoZSBwbGFjZW1lbnQgb2Ygd2hhdFxyXG4gICAgICAgICAqIGlzIGRyYXduIHRvIHRoZSBSZW5kZXIgVGV4dHVyZS4gWW91IGNhbiBzY3JvbGwsIHpvb20gYW5kIHJvdGF0ZSB0aGlzIENhbWVyYS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2NhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmF9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbmV3IENhbWVyYSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIFJlbmRlcmluZyBDb250ZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjZ2xcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMVGV4dHVyZSB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkIHRvIGluIGEgV2ViR0wgQ29udGV4dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2dsVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlci50eXBlID09PSBDT05TVC5XRUJHTClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nbCA9IGdsO1xyXG4gICAgICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IHRoaXMuZnJhbWUuc291cmNlLmdsVGV4dHVyZTtcclxuICAgICAgICAgICAgdGhpcy5kcmF3R2FtZU9iamVjdCA9IHRoaXMuYmF0Y2hHYW1lT2JqZWN0V2ViR0w7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVidWZmZXIgPSByZW5kZXJlci5jcmVhdGVGcmFtZWJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCB0aGlzLmdsVGV4dHVyZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZW5kZXJlci50eXBlID09PSBDT05TVC5DQU5WQVMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRyYXdHYW1lT2JqZWN0ID0gdGhpcy5iYXRjaEdhbWVPYmplY3RDYW52YXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbWVyYS5zZXRTY2VuZShzY2VuZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcblxyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKDAsIDApO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3NldFNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgdGhlIFJlbmRlciBUZXh0dXJlIHRvIHRoZSBuZXcgZGltZW5zaW9ucyBnaXZlbi5cclxuICAgICAqIFxyXG4gICAgICogSWYgUmVuZGVyIFRleHR1cmUgd2FzIGNyZWF0ZWQgZnJvbSBzcGVjaWZpYyBmcmFtZSwgb25seSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgd2lsbCBiZSBjaGFuZ2VkLiBUaGUgc2l6ZSBvZiB0aGUgc291cmNlXHJcbiAgICAgKiB0ZXh0dXJlIHdpbGwgbm90IGNoYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBSZW5kZXIgVGV4dHVyZSB3YXMgbm90IGNyZWF0ZWQgZnJvbSBzcGVjaWZpYyBmcmFtZSwgdGhlIGZvbGxvd2luZyB3aWxsIGhhcHBlbjpcclxuICAgICAqIEluIFdlYkdMIGl0IHdpbGwgZGVzdHJveSBhbmQgdGhlbiByZS1jcmVhdGUgdGhlIGZyYW1lIGJ1ZmZlciBiZWluZyB1c2VkIGJ5IHRoZSBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqIEluIENhbnZhcyBpdCB3aWxsIHJlc2l6ZSB0aGUgdW5kZXJseWluZyBjYW52YXMgZWxlbWVudC5cclxuICAgICAqIEJvdGggYXBwcm9hY2hlcyB3aWxsIGVyYXNlIGV2ZXJ5dGhpbmcgY3VycmVudGx5IGRyYXduIHRvIHRoZSBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgZGltZW5zaW9ucyBnaXZlbiBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgYWxyZWFkeSBiZWluZyB1c2VkLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3Jlc2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9d2lkdGhdIC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIFJlbmRlciBUZXh0dXJlLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGJlIHNldCB0aGUgc2FtZSBhcyB0aGUgYHdpZHRoYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB3aWR0aDsgfVxyXG5cclxuICAgICAgICBpZiAod2lkdGggIT09IHRoaXMud2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmhlaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZyYW1lLm5hbWUgPT09ICdfX0JBU0UnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgUmVzaXplIHRoZSB0ZXh0dXJlXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmUuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5mcmFtZS5zb3VyY2UuZ2xUZXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZ2xUZXh0dXJlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0dXJlMkQoMCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuUkdCQSwgbnVsbCwgd2lkdGgsIGhlaWdodCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVGcmFtZWJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBnbFRleHR1cmUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5zb3VyY2UuaXNSZW5kZXJUZXh0dXJlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5nbFRleHR1cmUgPSBnbFRleHR1cmU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSBnbFRleHR1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZS5zb3VyY2Uud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuc291cmNlLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUmVzaXplIHRoZSBmcmFtZVxyXG5cclxuICAgICAgICAgICAgdmFyIGJhc2VGcmFtZSA9IHRoaXMudGV4dHVyZS5nZXRTb3VyY2VJbWFnZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZnJhbWUuY3V0WCArIHdpZHRoID4gYmFzZUZyYW1lLndpZHRoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGJhc2VGcmFtZS53aWR0aCAtIHRoaXMuZnJhbWUuY3V0WDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZnJhbWUuY3V0WSArIGhlaWdodCA+IGJhc2VGcmFtZS5oZWlnaHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGJhc2VGcmFtZS5oZWlnaHQgLSB0aGlzLmZyYW1lLmN1dFk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0LCB0aGlzLmZyYW1lLmN1dFgsIHRoaXMuZnJhbWUuY3V0WSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuXHJcbiAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0ICYmICFpbnB1dC5jdXN0b21IaXRBcmVhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaW5wdXQuaGl0QXJlYS53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICBpbnB1dC5oaXRBcmVhLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGludCB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3NldEdsb2JhbFRpbnRcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGludCAtIFRoZSB0aW50IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHNldEdsb2JhbFRpbnQ6IGZ1bmN0aW9uICh0aW50KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsVGludCA9IHRpbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYWxwaGEgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNzZXRHbG9iYWxBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGFscGhhIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHNldEdsb2JhbEFscGhhOiBmdW5jdGlvbiAoYWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxBbHBoYSA9IGFscGhhO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9yZXMgYSBjb3B5IG9mIHRoaXMgUmVuZGVyIFRleHR1cmUgaW4gdGhlIFRleHR1cmUgTWFuYWdlciB1c2luZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBBZnRlciBkb2luZyB0aGlzLCBhbnkgdGV4dHVyZSBiYXNlZCBHYW1lIE9iamVjdCwgc3VjaCBhcyBhIFNwcml0ZSwgY2FuIHVzZSB0aGUgY29udGVudHMgb2YgdGhpc1xyXG4gICAgICogUmVuZGVyIFRleHR1cmUgYnkgdXNpbmcgdGhlIHRleHR1cmUga2V5OlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB2YXIgcnQgPSB0aGlzLmFkZC5yZW5kZXJUZXh0dXJlKDAsIDAsIDEyOCwgMTI4KTtcclxuICAgICAqIFxyXG4gICAgICogLy8gRHJhdyBzb21ldGhpbmcgdG8gdGhlIFJlbmRlciBUZXh0dXJlXHJcbiAgICAgKiBcclxuICAgICAqIHJ0LnNhdmVUZXh0dXJlKCdkb29kbGUnKTtcclxuICAgICAqIFxyXG4gICAgICogdGhpcy5hZGQuaW1hZ2UoNDAwLCAzMDAsICdkb29kbGUnKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBVcGRhdGluZyB0aGUgY29udGVudHMgb2YgdGhpcyBSZW5kZXIgVGV4dHVyZSB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIF9hbnlfIEdhbWUgT2JqZWN0XHJcbiAgICAgKiB0aGF0IGlzIHVzaW5nIGl0IGFzIGEgdGV4dHVyZS4gQ2FsbGluZyBgc2F2ZVRleHR1cmVgIGFnYWluIHdpbGwgbm90IHNhdmUgYW5vdGhlciBjb3B5XHJcbiAgICAgKiBvZiB0aGUgc2FtZSB0ZXh0dXJlLCBpdCB3aWxsIGp1c3QgcmVuYW1lIHRoZSBrZXkgb2YgdGhlIGV4aXN0aW5nIGNvcHkuXHJcbiAgICAgKiBcclxuICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBjcmVhdGUgYSBzaW5nbGUgYmFzZSB0ZXh0dXJlLiBZb3UgY2FuIGFkZCBmcmFtZXMgdG8gdGhlIHRleHR1cmVcclxuICAgICAqIGJ5IHVzaW5nIHRoZSBgVGV4dHVyZS5hZGRgIG1ldGhvZC4gQWZ0ZXIgZG9pbmcgdGhpcywgeW91IGNhbiB0aGVuIGFsbG93IEdhbWUgT2JqZWN0c1xyXG4gICAgICogdG8gdXNlIGEgc3BlY2lmaWMgZnJhbWUgZnJvbSBhIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjc2F2ZVRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBrZXkgdG8gc3RvcmUgdGhlIHRleHR1cmUgYXMgd2l0aGluIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSB0aGF0IHdhcyBzYXZlZC5cclxuICAgICAqL1xyXG4gICAgc2F2ZVRleHR1cmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlTWFuYWdlci5yZW5hbWVUZXh0dXJlKHRoaXMudGV4dHVyZS5rZXksIGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fc2F2ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50ZXh0dXJlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGxzIHRoZSBSZW5kZXIgVGV4dHVyZSB3aXRoIHRoZSBnaXZlbiBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2ZpbGxcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZ2IgLSBUaGUgY29sb3IgdG8gZmlsbCB0aGUgUmVuZGVyIFRleHR1cmUgd2l0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYWxwaGE9MV0gLSBUaGUgYWxwaGEgdmFsdWUgdXNlZCBieSB0aGUgZmlsbC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIGZpbGwgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBmaWxsIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9dGhpcy5mcmFtZS5jdXRXaWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGZpbGwgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9dGhpcy5mcmFtZS5jdXRIZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgZmlsbCByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZW5kZXIgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZmlsbDogZnVuY3Rpb24gKHJnYiwgYWxwaGEsIHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHsgYWxwaGEgPSAxOyB9XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IHRoaXMuZnJhbWUuY3V0V2lkdGg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gdGhpcy5mcmFtZS5jdXRIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdmFyIHIgPSAoKHJnYiA+PiAxNikgfCAwKSAmIDB4ZmY7XHJcbiAgICAgICAgdmFyIGcgPSAoKHJnYiA+PiA4KSB8IDApICYgMHhmZjtcclxuICAgICAgICB2YXIgYiA9IChyZ2IgfCAwKSAmIDB4ZmY7XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5mcmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmEucHJlUmVuZGVyKDEsIDEpO1xyXG5cclxuICAgICAgICBpZiAoZ2wpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3ggPSB0aGlzLmNhbWVyYS5fY3g7XHJcbiAgICAgICAgICAgIHZhciBjeSA9IHRoaXMuY2FtZXJhLl9jeTtcclxuICAgICAgICAgICAgdmFyIGN3ID0gdGhpcy5jYW1lcmEuX2N3O1xyXG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzLmNhbWVyYS5fY2g7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucHVzaFNjaXNzb3IoY3gsIGN5LCBjdywgY2gsIGNoKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcbiAgICBcclxuICAgICAgICAgICAgcGlwZWxpbmUucHJvak9ydGhvKDAsIHRoaXMudGV4dHVyZS53aWR0aCwgMCwgdGhpcy50ZXh0dXJlLmhlaWdodCwgLTEwMDAuMCwgMTAwMC4wKTtcclxuXHJcbiAgICAgICAgICAgIHBpcGVsaW5lLmRyYXdGaWxsUmVjdChcclxuICAgICAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBVdGlscy5nZXRUaW50RnJvbUZsb2F0cyhyIC8gMjU1LCBnIC8gMjU1LCBiIC8gMjU1LCAxKSxcclxuICAgICAgICAgICAgICAgIGFscGhhXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKG51bGwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucG9wU2Npc3NvcigpO1xyXG5cclxuICAgICAgICAgICAgcGlwZWxpbmUucHJvak9ydGhvKDAsIHBpcGVsaW5lLndpZHRoLCBwaXBlbGluZS5oZWlnaHQsIDAsIC0xMDAwLjAsIDEwMDAuMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhbHBoYSArICcpJztcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxSZWN0KHggKyBmcmFtZS5jdXRYLCB5ICsgZnJhbWUuY3V0WSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldENvbnRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjY2xlYXJcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUmVuZGVyIFRleHR1cmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmRpcnR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChnbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyLCB0cnVlKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZyYW1lLmN1dFdpZHRoICE9PSB0aGlzLmNhbnZhcy53aWR0aCB8fCB0aGlzLmZyYW1lLmN1dEhlaWdodCAhPT0gdGhpcy5jYW52YXMuaGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsLnNjaXNzb3IodGhpcy5mcmFtZS5jdXRYLCB0aGlzLmZyYW1lLmN1dFksIHRoaXMuZnJhbWUuY3V0V2lkdGgsIHRoaXMuZnJhbWUuY3V0SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0RnJhbWVidWZmZXIobnVsbCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7XHJcbiAgICAgICAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCh0aGlzLmZyYW1lLmN1dFgsIHRoaXMuZnJhbWUuY3V0WSwgdGhpcy5mcmFtZS5jdXRXaWR0aCwgdGhpcy5mcmFtZS5jdXRIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGdpdmVuIG9iamVjdCwgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cywgdG8gdGhpcyBSZW5kZXIgVGV4dHVyZSB1c2luZyBhIGJsZW5kIG1vZGUgb2YgRVJBU0UuXHJcbiAgICAgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGVyYXNpbmcgYW55IGZpbGxlZCBwaXhlbHMgaW4gdGhlIG9iamVjdHMgZnJvbSB0aGlzIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBjYW4gYWNjZXB0IGFueSBvZiB0aGUgZm9sbG93aW5nOlxyXG4gICAgICogXHJcbiAgICAgKiAqIEFueSByZW5kZXJhYmxlIEdhbWUgT2JqZWN0LCBzdWNoIGFzIGEgU3ByaXRlLCBUZXh0LCBHcmFwaGljcyBvciBUaWxlU3ByaXRlLlxyXG4gICAgICogKiBEeW5hbWljIGFuZCBTdGF0aWMgVGlsZW1hcCBMYXllcnMuXHJcbiAgICAgKiAqIEEgR3JvdXAuIFRoZSBjb250ZW50cyBvZiB3aGljaCB3aWxsIGJlIGl0ZXJhdGVkIGFuZCBkcmF3biBpbiB0dXJuLlxyXG4gICAgICogKiBBIENvbnRhaW5lci4gVGhlIGNvbnRlbnRzIG9mIHdoaWNoIHdpbGwgYmUgaXRlcmF0ZWQgZnVsbHksIGFuZCBkcmF3biBpbiB0dXJuLlxyXG4gICAgICogKiBBIFNjZW5lJ3MgRGlzcGxheSBMaXN0LiBQYXNzIGluIGBTY2VuZS5jaGlsZHJlbmAgdG8gZHJhdyB0aGUgd2hvbGUgbGlzdC5cclxuICAgICAqICogQW5vdGhlciBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqICogQSBUZXh0dXJlIEZyYW1lIGluc3RhbmNlLlxyXG4gICAgICogKiBBIHN0cmluZy4gVGhpcyBpcyB1c2VkIHRvIGxvb2stdXAgYSB0ZXh0dXJlIGZyb20gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIFxyXG4gICAgICogTm90ZTogWW91IGNhbm5vdCBlcmFzZSBhIFJlbmRlciBUZXh0dXJlIGZyb20gaXRzZWxmLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiBwYXNzaW5nIGluIGEgR3JvdXAgb3IgQ29udGFpbmVyIGl0IHdpbGwgb25seSBkcmF3IGNoaWxkcmVuIHRoYXQgcmV0dXJuIGB0cnVlYFxyXG4gICAgICogd2hlbiB0aGVpciBgd2lsbFJlbmRlcigpYCBtZXRob2QgaXMgY2FsbGVkLiBJLmUuIGEgQ29udGFpbmVyIHdpdGggMTAgY2hpbGRyZW4sXHJcbiAgICAgKiA1IG9mIHdoaWNoIGhhdmUgYHZpc2libGU9ZmFsc2VgIHdpbGwgb25seSBkcmF3IHRoZSA1IHZpc2libGUgb25lcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgcGFzc2luZyBpbiBhbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgaXQgd2lsbCBkcmF3IHRoZW0gYWxsLCByZWdhcmRsZXNzIGlmXHJcbiAgICAgKiB0aGV5IHBhc3MgYSBgd2lsbFJlbmRlcmAgY2hlY2sgb3Igbm90LlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHBhc3MgaW4gYSBzdHJpbmcgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGxvb2sgZm9yIGEgdGV4dHVyZSBpbiB0aGUgVGV4dHVyZVxyXG4gICAgICogTWFuYWdlciBtYXRjaGluZyB0aGF0IHN0cmluZywgYW5kIGRyYXcgdGhlIGJhc2UgZnJhbWUuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcGFzcyBpbiB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdG8gZHJhdyB0aGUgb2JqZWN0cyBhdC4gVGhlIHVzZSBvZlxyXG4gICAgICogdGhlIGNvb3JkaW5hdGVzIGRpZmZlciBiYXNlZCBvbiB3aGF0IG9iamVjdHMgYXJlIGJlaW5nIGRyYXduLiBJZiB0aGUgb2JqZWN0IGlzXHJcbiAgICAgKiBhIEdyb3VwLCBDb250YWluZXIgb3IgRGlzcGxheSBMaXN0LCB0aGUgY29vcmRpbmF0ZXMgYXJlIF9hZGRlZF8gdG8gdGhlIHBvc2l0aW9uc1xyXG4gICAgICogb2YgdGhlIGNoaWxkcmVuLiBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIG9iamVjdCwgdGhlIGNvb3JkaW5hdGVzIGFyZSBleGFjdC5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBjYXVzZXMgdGhlIFdlYkdMIGJhdGNoIHRvIGZsdXNoLCBzbyBpdCBjYW4gd3JpdGUgdGhlIHRleHR1cmVcclxuICAgICAqIGRhdGEgdG8gdGhlIGZyYW1lYnVmZmVyIGJlaW5nIHVzZWQgaW50ZXJuYWxseS4gVGhlIGJhdGNoIGlzIGZsdXNoZWQgYXQgdGhlIGVuZCxcclxuICAgICAqIGFmdGVyIHRoZSBlbnRyaWVzIGhhdmUgYmVlbiBpdGVyYXRlZC4gU28gaWYgeW91J3ZlIGEgYnVuY2ggb2Ygb2JqZWN0cyB0byBkcmF3LFxyXG4gICAgICogdHJ5IGFuZCBwYXNzIHRoZW0gaW4gYW4gYXJyYXkgaW4gb25lIHNpbmdsZSBjYWxsLCByYXRoZXIgdGhhbiBtYWtpbmcgbG90cyBvZlxyXG4gICAgICogc2VwYXJhdGUgY2FsbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNlcmFzZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBlbnRyaWVzIC0gQW55IHJlbmRlcmFibGUgR2FtZSBPYmplY3QsIG9yIEdyb3VwLCBDb250YWluZXIsIERpc3BsYXkgTGlzdCwgb3RoZXIgUmVuZGVyIFRleHR1cmUsIFRleHR1cmUgRnJhbWUgb3IgYW4gYXJyYXkgb2YgYW55IG9mIHRoZXNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSB4IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEZyYW1lIGF0LCBvciB0aGUgb2Zmc2V0IGFwcGxpZWQgdG8gdGhlIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBUaGUgeSBwb3NpdGlvbiB0byBkcmF3IHRoZSBGcmFtZSBhdCwgb3IgdGhlIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZW5kZXIgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChlbnRyaWVzLCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VyYXNlTW9kZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHZhciBibGVuZE1vZGUgPSB0aGlzLnJlbmRlcmVyLmN1cnJlbnRCbGVuZE1vZGU7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QmxlbmRNb2RlKEJsZW5kTW9kZXMuRVJBU0UpO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXcoZW50cmllcywgeCwgeSwgMSwgMTY3NzcyMTUpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEJsZW5kTW9kZShibGVuZE1vZGUpO1xyXG5cclxuICAgICAgICB0aGlzLl9lcmFzZU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGdpdmVuIG9iamVjdCwgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cywgdG8gdGhpcyBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqIFxyXG4gICAgICogSXQgY2FuIGFjY2VwdCBhbnkgb2YgdGhlIGZvbGxvd2luZzpcclxuICAgICAqIFxyXG4gICAgICogKiBBbnkgcmVuZGVyYWJsZSBHYW1lIE9iamVjdCwgc3VjaCBhcyBhIFNwcml0ZSwgVGV4dCwgR3JhcGhpY3Mgb3IgVGlsZVNwcml0ZS5cclxuICAgICAqICogRHluYW1pYyBhbmQgU3RhdGljIFRpbGVtYXAgTGF5ZXJzLlxyXG4gICAgICogKiBBIEdyb3VwLiBUaGUgY29udGVudHMgb2Ygd2hpY2ggd2lsbCBiZSBpdGVyYXRlZCBhbmQgZHJhd24gaW4gdHVybi5cclxuICAgICAqICogQSBDb250YWluZXIuIFRoZSBjb250ZW50cyBvZiB3aGljaCB3aWxsIGJlIGl0ZXJhdGVkIGZ1bGx5LCBhbmQgZHJhd24gaW4gdHVybi5cclxuICAgICAqICogQSBTY2VuZSdzIERpc3BsYXkgTGlzdC4gUGFzcyBpbiBgU2NlbmUuY2hpbGRyZW5gIHRvIGRyYXcgdGhlIHdob2xlIGxpc3QuXHJcbiAgICAgKiAqIEFub3RoZXIgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKiAqIEEgVGV4dHVyZSBGcmFtZSBpbnN0YW5jZS5cclxuICAgICAqICogQSBzdHJpbmcuIFRoaXMgaXMgdXNlZCB0byBsb29rLXVwIGEgdGV4dHVyZSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGU6IFlvdSBjYW5ub3QgZHJhdyBhIFJlbmRlciBUZXh0dXJlIHRvIGl0c2VsZi5cclxuICAgICAqIFxyXG4gICAgICogSWYgcGFzc2luZyBpbiBhIEdyb3VwIG9yIENvbnRhaW5lciBpdCB3aWxsIG9ubHkgZHJhdyBjaGlsZHJlbiB0aGF0IHJldHVybiBgdHJ1ZWBcclxuICAgICAqIHdoZW4gdGhlaXIgYHdpbGxSZW5kZXIoKWAgbWV0aG9kIGlzIGNhbGxlZC4gSS5lLiBhIENvbnRhaW5lciB3aXRoIDEwIGNoaWxkcmVuLFxyXG4gICAgICogNSBvZiB3aGljaCBoYXZlIGB2aXNpYmxlPWZhbHNlYCB3aWxsIG9ubHkgZHJhdyB0aGUgNSB2aXNpYmxlIG9uZXMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHBhc3NpbmcgaW4gYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIGl0IHdpbGwgZHJhdyB0aGVtIGFsbCwgcmVnYXJkbGVzcyBpZlxyXG4gICAgICogdGhleSBwYXNzIGEgYHdpbGxSZW5kZXJgIGNoZWNrIG9yIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBwYXNzIGluIGEgc3RyaW5nIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBsb29rIGZvciBhIHRleHR1cmUgaW4gdGhlIFRleHR1cmVcclxuICAgICAqIE1hbmFnZXIgbWF0Y2hpbmcgdGhhdCBzdHJpbmcsIGFuZCBkcmF3IHRoZSBiYXNlIGZyYW1lLiBJZiB5b3UgbmVlZCB0byBzcGVjaWZ5XHJcbiAgICAgKiBleGFjdGx5IHdoaWNoIGZyYW1lIHRvIGRyYXcgdGhlbiB1c2UgdGhlIG1ldGhvZCBgZHJhd0ZyYW1lYCBpbnN0ZWFkLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHBhc3MgaW4gdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRvIGRyYXcgdGhlIG9iamVjdHMgYXQuIFRoZSB1c2Ugb2ZcclxuICAgICAqIHRoZSBjb29yZGluYXRlcyBkaWZmZXIgYmFzZWQgb24gd2hhdCBvYmplY3RzIGFyZSBiZWluZyBkcmF3bi4gSWYgdGhlIG9iamVjdCBpc1xyXG4gICAgICogYSBHcm91cCwgQ29udGFpbmVyIG9yIERpc3BsYXkgTGlzdCwgdGhlIGNvb3JkaW5hdGVzIGFyZSBfYWRkZWRfIHRvIHRoZSBwb3NpdGlvbnNcclxuICAgICAqIG9mIHRoZSBjaGlsZHJlbi4gRm9yIGFsbCBvdGhlciB0eXBlcyBvZiBvYmplY3QsIHRoZSBjb29yZGluYXRlcyBhcmUgZXhhY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBgYWxwaGFgIGFuZCBgdGludGAgdmFsdWVzIGFyZSBvbmx5IHVzZWQgYnkgVGV4dHVyZSBGcmFtZXMuXHJcbiAgICAgKiBHYW1lIE9iamVjdHMgdXNlIHRoZWlyIG93biBhbHBoYSBhbmQgdGludCB2YWx1ZXMgd2hlbiBiZWluZyBkcmF3bi5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBjYXVzZXMgdGhlIFdlYkdMIGJhdGNoIHRvIGZsdXNoLCBzbyBpdCBjYW4gd3JpdGUgdGhlIHRleHR1cmVcclxuICAgICAqIGRhdGEgdG8gdGhlIGZyYW1lYnVmZmVyIGJlaW5nIHVzZWQgaW50ZXJuYWxseS4gVGhlIGJhdGNoIGlzIGZsdXNoZWQgYXQgdGhlIGVuZCxcclxuICAgICAqIGFmdGVyIHRoZSBlbnRyaWVzIGhhdmUgYmVlbiBpdGVyYXRlZC4gU28gaWYgeW91J3ZlIGEgYnVuY2ggb2Ygb2JqZWN0cyB0byBkcmF3LFxyXG4gICAgICogdHJ5IGFuZCBwYXNzIHRoZW0gaW4gYW4gYXJyYXkgaW4gb25lIHNpbmdsZSBjYWxsLCByYXRoZXIgdGhhbiBtYWtpbmcgbG90cyBvZlxyXG4gICAgICogc2VwYXJhdGUgY2FsbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNkcmF3XHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZW50cmllcyAtIEFueSByZW5kZXJhYmxlIEdhbWUgT2JqZWN0LCBvciBHcm91cCwgQ29udGFpbmVyLCBEaXNwbGF5IExpc3QsIG90aGVyIFJlbmRlciBUZXh0dXJlLCBUZXh0dXJlIEZyYW1lIG9yIGFuIGFycmF5IG9mIGFueSBvZiB0aGVzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgeCBwb3NpdGlvbiB0byBkcmF3IHRoZSBGcmFtZSBhdCwgb3IgdGhlIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgcG9zaXRpb24gdG8gZHJhdyB0aGUgRnJhbWUgYXQsIG9yIHRoZSBvZmZzZXQgYXBwbGllZCB0byB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYV0gLSAgVGhlIGFscGhhIHZhbHVlLiBPbmx5IHVzZWQgZm9yIFRleHR1cmUgRnJhbWVzIGFuZCBpZiBub3Qgc3BlY2lmaWVkIGRlZmF1bHRzIHRvIHRoZSBgZ2xvYmFsQWxwaGFgIHByb3BlcnR5LiBHYW1lIE9iamVjdHMgdXNlIHRoZWlyIG93biBjdXJyZW50IGFscGhhIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW50XSAtICBXZWJHTCBvbmx5LiBUaGUgdGludCBjb2xvciB2YWx1ZS4gT25seSB1c2VkIGZvciBUZXh0dXJlIEZyYW1lcyBhbmQgaWYgbm90IHNwZWNpZmllZCBkZWZhdWx0cyB0byB0aGUgYGdsb2JhbFRpbnRgIHByb3BlcnR5LiBHYW1lIE9iamVjdHMgdXNlIHRoZWlyIG93biBjdXJyZW50IHRpbnQgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZW5kZXIgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZHJhdzogZnVuY3Rpb24gKGVudHJpZXMsIHgsIHksIGFscGhhLCB0aW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7IGFscGhhID0gdGhpcy5nbG9iYWxBbHBoYTsgfVxyXG5cclxuICAgICAgICBpZiAodGludCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGludCA9ICh0aGlzLmdsb2JhbFRpbnQgPj4gMTYpICsgKHRoaXMuZ2xvYmFsVGludCAmIDB4ZmYwMCkgKyAoKHRoaXMuZ2xvYmFsVGludCAmIDB4ZmYpIDw8IDE2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGludCA9ICh0aW50ID4+IDE2KSArICh0aW50ICYgMHhmZjAwKSArICgodGludCAmIDB4ZmYpIDw8IDE2KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGVudHJpZXMgPSBbIGVudHJpZXMgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhLnByZVJlbmRlcigxLCAxKTtcclxuXHJcbiAgICAgICAgaWYgKGdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGN4ID0gdGhpcy5jYW1lcmEuX2N4O1xyXG4gICAgICAgICAgICB2YXIgY3kgPSB0aGlzLmNhbWVyYS5fY3k7XHJcbiAgICAgICAgICAgIHZhciBjdyA9IHRoaXMuY2FtZXJhLl9jdztcclxuICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5jYW1lcmEuX2NoO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnB1c2hTY2lzc29yKGN4LCBjeSwgY3csIGNoLCBjaCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHBpcGVsaW5lLnByb2pPcnRobygwLCB0aGlzLnRleHR1cmUud2lkdGgsIDAsIHRoaXMudGV4dHVyZS5oZWlnaHQsIC0xMDAwLjAsIDEwMDAuMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJhdGNoTGlzdChlbnRyaWVzLCB4LCB5LCBhbHBoYSwgdGludCk7XHJcblxyXG4gICAgICAgICAgICBwaXBlbGluZS5mbHVzaCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGcmFtZWJ1ZmZlcihudWxsLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnBvcFNjaXNzb3IoKTtcclxuXHJcbiAgICAgICAgICAgIHBpcGVsaW5lLnByb2pPcnRobygwLCBwaXBlbGluZS53aWR0aCwgcGlwZWxpbmUuaGVpZ2h0LCAwLCAtMTAwMC4wLCAxMDAwLjApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldENvbnRleHQodGhpcy5jb250ZXh0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hMaXN0KGVudHJpZXMsIHgsIHksIGFscGhhLCB0aW50KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBUZXh0dXJlIEZyYW1lIHRvIHRoZSBSZW5kZXIgVGV4dHVyZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRleHR1cmVzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZWlyIHN0cmluZy1iYXNlZCBrZXlzLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdmFyIHJ0ID0gdGhpcy5hZGQucmVuZGVyVGV4dHVyZSgwLCAwLCA4MDAsIDYwMCk7XHJcbiAgICAgKiBydC5kcmF3RnJhbWUoa2V5LCBmcmFtZSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBwb3NpdGlvbiwgYWxwaGEgYW5kIHRpbnQgdmFsdWUgdG8gYXBwbHkgdG8gdGhlIGZyYW1lXHJcbiAgICAgKiBiZWZvcmUgaXQgaXMgZHJhd24uXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSBhIGJhdGNoIGZsdXNoLCBzbyBpZiB5b3UndmUgZ290IGEgc3RhY2sgb2YgdGhpbmdzIHRvIGRyYXdcclxuICAgICAqIGluIGEgdGlnaHQgbG9vcCwgdHJ5IHVzaW5nIHRoZSBgZHJhd2AgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBuZWVkIHRvIGRyYXcgYSBTcHJpdGUgdG8gdGhpcyBSZW5kZXIgVGV4dHVyZSwgdXNlIHRoZSBgZHJhd2AgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNkcmF3RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgdGV4dHVyZSB0byBiZSB1c2VkLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBuYW1lIG9yIGluZGV4IG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBwb3NpdGlvbiB0byBkcmF3IHRoZSBmcmFtZSBhdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIHRvIGRyYXcgdGhlIGZyYW1lIGF0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYV0gLSBUaGUgYWxwaGEgdG8gdXNlLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHVzZXMgdGhlIGBnbG9iYWxBbHBoYWAgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbnRdIC0gV2ViR0wgb25seS4gVGhlIHRpbnQgY29sb3IgdG8gdXNlLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHVzZXMgdGhlIGBnbG9iYWxUaW50YCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFJlbmRlciBUZXh0dXJlIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBkcmF3RnJhbWU6IGZ1bmN0aW9uIChrZXksIGZyYW1lLCB4LCB5LCBhbHBoYSwgdGludClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7IGFscGhhID0gdGhpcy5nbG9iYWxBbHBoYTsgfVxyXG5cclxuICAgICAgICBpZiAodGludCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGludCA9ICh0aGlzLmdsb2JhbFRpbnQgPj4gMTYpICsgKHRoaXMuZ2xvYmFsVGludCAmIDB4ZmYwMCkgKyAoKHRoaXMuZ2xvYmFsVGludCAmIDB4ZmYpIDw8IDE2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGludCA9ICh0aW50ID4+IDE2KSArICh0aW50ICYgMHhmZjAwKSArICgodGludCAmIDB4ZmYpIDw8IDE2KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIHRleHR1cmVGcmFtZSA9IHRoaXMudGV4dHVyZU1hbmFnZXIuZ2V0RnJhbWUoa2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0dXJlRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYS5wcmVSZW5kZXIoMSwgMSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZ2wpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjeCA9IHRoaXMuY2FtZXJhLl9jeDtcclxuICAgICAgICAgICAgICAgIHZhciBjeSA9IHRoaXMuY2FtZXJhLl9jeTtcclxuICAgICAgICAgICAgICAgIHZhciBjdyA9IHRoaXMuY2FtZXJhLl9jdztcclxuICAgICAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuY2FtZXJhLl9jaDtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyLCBmYWxzZSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucHVzaFNjaXNzb3IoY3gsIGN5LCBjdywgY2gsIGNoKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLnByb2pPcnRobygwLCB0aGlzLnRleHR1cmUud2lkdGgsIDAsIHRoaXMudGV4dHVyZS5oZWlnaHQsIC0xMDAwLjAsIDEwMDAuMCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5iYXRjaFRleHR1cmVGcmFtZSh0ZXh0dXJlRnJhbWUsIHggKyB0aGlzLmZyYW1lLmN1dFgsIHkgKyB0aGlzLmZyYW1lLmN1dFksIHRpbnQsIGFscGhhLCB0aGlzLmNhbWVyYS5tYXRyaXgsIG51bGwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmZsdXNoKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKG51bGwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnBvcFNjaXNzb3IoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5wcm9qT3J0aG8oMCwgcGlwZWxpbmUud2lkdGgsIHBpcGVsaW5lLmhlaWdodCwgMCwgLTEwMDAuMCwgMTAwMC4wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hUZXh0dXJlRnJhbWUodGV4dHVyZUZyYW1lLCB4ICsgdGhpcy5mcmFtZS5jdXRYLCB5ICsgdGhpcy5mcmFtZS5jdXRZLCBhbHBoYSwgdGludCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGUgZHJhd2luZyBvZiBhbiBhcnJheSBvZiBjaGlsZHJlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2JhdGNoTGlzdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBjaGlsZHJlbiAtIFRoZSBhcnJheSBvZiBHYW1lIE9iamVjdHMgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgeCBwb3NpdGlvbiB0byBvZmZzZXQgdGhlIEdhbWUgT2JqZWN0IGJ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IHBvc2l0aW9uIHRvIG9mZnNldCB0aGUgR2FtZSBPYmplY3QgYnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhXSAtIFRoZSBhbHBoYSB0byB1c2UuIElmIG5vdCBzcGVjaWZpZWQgaXQgdXNlcyB0aGUgYGdsb2JhbEFscGhhYCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGludF0gLSBUaGUgdGludCBjb2xvciB0byB1c2UuIElmIG5vdCBzcGVjaWZpZWQgaXQgdXNlcyB0aGUgYGdsb2JhbFRpbnRgIHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBiYXRjaExpc3Q6IGZ1bmN0aW9uIChjaGlsZHJlbiwgeCwgeSwgYWxwaGEsIHRpbnQpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGNoaWxkcmVuW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeSA9PT0gdGhpcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS5yZW5kZXJXZWJHTCB8fCBlbnRyeS5yZW5kZXJDYW52YXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBHYW1lIE9iamVjdHNcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0dhbWVPYmplY3QoZW50cnksIHgsIHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LmlzUGFyZW50IHx8IGVudHJ5Lmxpc3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBHcm91cHMgLyBEaXNwbGF5IExpc3RzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoR3JvdXAoZW50cnkuZ2V0Q2hpbGRyZW4oKSwgeCwgeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRleHR1cmUga2V5XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoVGV4dHVyZUZyYW1lS2V5KGVudHJ5LCBudWxsLCB4LCB5LCBhbHBoYSwgdGludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkgaW5zdGFuY2VvZiBGcmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRleHR1cmUgRnJhbWUgaW5zdGFuY2VcclxuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hUZXh0dXJlRnJhbWUoZW50cnksIHgsIHksIGFscGhhLCB0aW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEFub3RoZXIgQXJyYXlcclxuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hMaXN0KGVudHJ5LCB4LCB5LCBhbHBoYSwgdGludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGUgZHJhd2luZyBhIFBoYXNlciBHcm91cCBjb250ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2JhdGNoR3JvdXBcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gY2hpbGRyZW4gLSBUaGUgYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIGRyYXcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBwb3NpdGlvbiB0byBvZmZzZXQgdGhlIEdhbWUgT2JqZWN0IGJ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgcG9zaXRpb24gdG8gb2Zmc2V0IHRoZSBHYW1lIE9iamVjdCBieS5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hHcm91cDogZnVuY3Rpb24gKGNoaWxkcmVuLCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIHggKz0gdGhpcy5mcmFtZS5jdXRYO1xyXG4gICAgICAgIHkgKz0gdGhpcy5mcmFtZS5jdXRZO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gY2hpbGRyZW5baV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkud2lsbFJlbmRlcigpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdHggPSBlbnRyeS54ICsgeDtcclxuICAgICAgICAgICAgICAgIHZhciB0eSA9IGVudHJ5LnkgKyB5O1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0dhbWVPYmplY3QoZW50cnksIHR4LCB0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgaGFuZGxlcyBkcmF3aW5nIGEgc2luZ2xlIFBoYXNlciBHYW1lIE9iamVjdCB0byB0aGlzIFJlbmRlciBUZXh0dXJlIHVzaW5nIFdlYkdMLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjYmF0Y2hHYW1lT2JqZWN0V2ViR0xcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBkcmF3LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSB4IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEdhbWUgT2JqZWN0IGF0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEdhbWUgT2JqZWN0IGF0LlxyXG4gICAgICovXHJcbiAgICBiYXRjaEdhbWVPYmplY3RXZWJHTDogZnVuY3Rpb24gKGdhbWVPYmplY3QsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gZ2FtZU9iamVjdC54OyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gZ2FtZU9iamVjdC55OyB9XHJcblxyXG4gICAgICAgIHZhciBwcmV2WCA9IGdhbWVPYmplY3QueDtcclxuICAgICAgICB2YXIgcHJldlkgPSBnYW1lT2JqZWN0Lnk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZXJhc2VNb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRCbGVuZE1vZGUoZ2FtZU9iamVjdC5ibGVuZE1vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRQb3NpdGlvbih4ICsgdGhpcy5mcmFtZS5jdXRYLCB5ICsgdGhpcy5mcmFtZS5jdXRZKTtcclxuICAgICAgICBcclxuICAgICAgICBnYW1lT2JqZWN0LnJlbmRlcldlYkdMKHRoaXMucmVuZGVyZXIsIGdhbWVPYmplY3QsIDAsIHRoaXMuY2FtZXJhLCBudWxsKTtcclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRQb3NpdGlvbihwcmV2WCwgcHJldlkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgZHJhd2luZyBhIHNpbmdsZSBQaGFzZXIgR2FtZSBPYmplY3QgdG8gdGhpcyBSZW5kZXIgVGV4dHVyZSB1c2luZyBDYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNiYXRjaEdhbWVPYmplY3RDYW52YXNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBkcmF3LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSB4IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEdhbWUgT2JqZWN0IGF0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEdhbWUgT2JqZWN0IGF0LlxyXG4gICAgICovXHJcbiAgICBiYXRjaEdhbWVPYmplY3RDYW52YXM6IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IGdhbWVPYmplY3QueDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IGdhbWVPYmplY3QueTsgfVxyXG5cclxuICAgICAgICB2YXIgcHJldlggPSBnYW1lT2JqZWN0Lng7XHJcbiAgICAgICAgdmFyIHByZXZZID0gZ2FtZU9iamVjdC55O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZXJhc2VNb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJsZW5kTW9kZSA9IGdhbWVPYmplY3QuYmxlbmRNb2RlO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5ibGVuZE1vZGUgPSBCbGVuZE1vZGVzLkVSQVNFO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRQb3NpdGlvbih4ICsgdGhpcy5mcmFtZS5jdXRYLCB5ICsgdGhpcy5mcmFtZS5jdXRZKTtcclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5yZW5kZXJDYW52YXModGhpcy5yZW5kZXJlciwgZ2FtZU9iamVjdCwgMCwgdGhpcy5jYW1lcmEsIG51bGwpO1xyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LnNldFBvc2l0aW9uKHByZXZYLCBwcmV2WSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lcmFzZU1vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmJsZW5kTW9kZSA9IGJsZW5kTW9kZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGUgZHJhd2luZyBvZiBhbiBhcnJheSBvZiBjaGlsZHJlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI2JhdGNoVGV4dHVyZUZyYW1lS2V5XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIHRvIG9mZnNldCB0aGUgR2FtZSBPYmplY3QgYnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSBwb3NpdGlvbiB0byBvZmZzZXQgdGhlIEdhbWUgT2JqZWN0IGJ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYV0gLSBUaGUgYWxwaGEgdG8gdXNlLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHVzZXMgdGhlIGBnbG9iYWxBbHBoYWAgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbnRdIC0gVGhlIHRpbnQgY29sb3IgdG8gdXNlLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHVzZXMgdGhlIGBnbG9iYWxUaW50YCBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hUZXh0dXJlRnJhbWVLZXk6IGZ1bmN0aW9uIChrZXksIGZyYW1lLCB4LCB5LCBhbHBoYSwgdGludClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZUZyYW1lID0gdGhpcy50ZXh0dXJlTWFuYWdlci5nZXRGcmFtZShrZXksIGZyYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHR1cmVGcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hUZXh0dXJlRnJhbWUodGV4dHVyZUZyYW1lLCB4LCB5LCBhbHBoYSwgdGludCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgdGhlIGRyYXdpbmcgb2YgYSBUZXh0dXJlIEZyYW1lIHRvIHRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNiYXRjaFRleHR1cmVGcmFtZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gdGV4dHVyZUZyYW1lIC0gVGhlIFRleHR1cmUgRnJhbWUgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIHRvIGRyYXcgdGhlIEZyYW1lIGF0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgcG9zaXRpb24gdG8gZHJhdyB0aGUgRnJhbWUgYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbnRdIC0gQSB0aW50IGNvbG9yIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGZyYW1lIGRyYXduIHRvIHRoZSBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hUZXh0dXJlRnJhbWU6IGZ1bmN0aW9uICh0ZXh0dXJlRnJhbWUsIHgsIHksIGFscGhhLCB0aW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIHggKz0gdGhpcy5mcmFtZS5jdXRYO1xyXG4gICAgICAgIHkgKz0gdGhpcy5mcmFtZS5jdXRZO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGlwZWxpbmUuYmF0Y2hUZXh0dXJlRnJhbWUodGV4dHVyZUZyYW1lLCB4LCB5LCB0aW50LCBhbHBoYSwgdGhpcy5jYW1lcmEubWF0cml4LCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuY29udGV4dDtcclxuICAgICAgICAgICAgdmFyIGNkID0gdGV4dHVyZUZyYW1lLmNhbnZhc0RhdGE7XHJcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0ZXh0dXJlRnJhbWUuc291cmNlLmltYWdlO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSB0aGlzLmNhbWVyYS5tYXRyaXg7XHJcbiAgICBcclxuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5nbG9iYWxBbHBoYTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7XHJcblxyXG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKHNvdXJjZSwgY2QueCwgY2QueSwgY2Qud2lkdGgsIGNkLmhlaWdodCwgeCwgeSwgY2Qud2lkdGgsIGNkLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc25hcHNob3Qgb2YgdGhlIGdpdmVuIGFyZWEgb2YgdGhpcyBSZW5kZXIgVGV4dHVyZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHNuYXBzaG90IGlzIHRha2VuIGltbWVkaWF0ZWx5LlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBjYXB0dXJlIHRoZSB3aG9sZSBSZW5kZXIgVGV4dHVyZSBzZWUgdGhlIGBzbmFwc2hvdGAgbWV0aG9kLiBUbyBjYXB0dXJlIGEgc3BlY2lmaWMgcGl4ZWwsIHNlZSBgc25hcHNob3RQaXhlbGAuXHJcbiAgICAgKiBcclxuICAgICAqIFNuYXBzaG90cyB3b3JrIGJ5IHVzaW5nIHRoZSBXZWJHTCBgcmVhZFBpeGVsc2AgZmVhdHVyZSB0byBncmFiIGV2ZXJ5IHBpeGVsIGZyb20gdGhlIGZyYW1lIGJ1ZmZlciBpbnRvIGFuIEFycmF5QnVmZmVyVmlldy5cclxuICAgICAqIEl0IHRoZW4gcGFyc2VzIHRoaXMsIGNvcHlpbmcgdGhlIGNvbnRlbnRzIHRvIGEgdGVtcG9yYXJ5IENhbnZhcyBhbmQgZmluYWxseSBjcmVhdGluZyBhbiBJbWFnZSBvYmplY3QgZnJvbSBpdCxcclxuICAgICAqIHdoaWNoIGlzIHRoZSBpbWFnZSByZXR1cm5lZCB0byB0aGUgY2FsbGJhY2sgcHJvdmlkZWQuIEFsbCBpbiBhbGwsIHRoaXMgaXMgYSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFuZCBibG9ja2luZyBwcm9jZXNzLFxyXG4gICAgICogd2hpY2ggZ2V0cyBtb3JlIGV4cGVuc2l2ZSB0aGUgbGFyZ2VyIHRoZSBjYW52YXMgc2l6ZSBnZXRzLCBzbyBwbGVhc2UgYmUgY2FyZWZ1bCBob3cgeW91IGVtcGxveSB0aGlzIGluIHlvdXIgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3NuYXBzaG90QXJlYVxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZ3JhYiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBhcmVhIHRvIGdyYWIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlJlbmRlcmVyLlNuYXBzaG90LlNuYXBzaG90Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIEZ1bmN0aW9uIHRvIGludm9rZSBhZnRlciB0aGUgc25hcHNob3QgaW1hZ2UgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0naW1hZ2UvcG5nJ10gLSBUaGUgZm9ybWF0IG9mIHRoZSBpbWFnZSB0byBjcmVhdGUsIHVzdWFsbHkgYGltYWdlL3BuZ2Agb3IgYGltYWdlL2pwZWdgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmNvZGVyT3B0aW9ucz0wLjkyXSAtIFRoZSBpbWFnZSBxdWFsaXR5LCBiZXR3ZWVuIDAgYW5kIDEuIFVzZWQgZm9yIGltYWdlIGZvcm1hdHMgd2l0aCBsb3NzeSBjb21wcmVzc2lvbiwgc3VjaCBhcyBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZW5kZXIgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc25hcHNob3RBcmVhOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIHR5cGUsIGVuY29kZXJPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbmFwc2hvdEZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjYWxsYmFjaywgZmFsc2UsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbmFwc2hvdENhbnZhcyh0aGlzLmNhbnZhcywgY2FsbGJhY2ssIGZhbHNlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBlbmNvZGVyT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSB3aG9sZSBvZiB0aGlzIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgc25hcHNob3QgaXMgdGFrZW4gaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIFRvIGNhcHR1cmUganVzdCBhIHBvcnRpb24gb2YgdGhlIFJlbmRlciBUZXh0dXJlIHNlZSB0aGUgYHNuYXBzaG90QXJlYWAgbWV0aG9kLiBUbyBjYXB0dXJlIGEgc3BlY2lmaWMgcGl4ZWwsIHNlZSBgc25hcHNob3RQaXhlbGAuXHJcbiAgICAgKiBcclxuICAgICAqIFNuYXBzaG90cyB3b3JrIGJ5IHVzaW5nIHRoZSBXZWJHTCBgcmVhZFBpeGVsc2AgZmVhdHVyZSB0byBncmFiIGV2ZXJ5IHBpeGVsIGZyb20gdGhlIGZyYW1lIGJ1ZmZlciBpbnRvIGFuIEFycmF5QnVmZmVyVmlldy5cclxuICAgICAqIEl0IHRoZW4gcGFyc2VzIHRoaXMsIGNvcHlpbmcgdGhlIGNvbnRlbnRzIHRvIGEgdGVtcG9yYXJ5IENhbnZhcyBhbmQgZmluYWxseSBjcmVhdGluZyBhbiBJbWFnZSBvYmplY3QgZnJvbSBpdCxcclxuICAgICAqIHdoaWNoIGlzIHRoZSBpbWFnZSByZXR1cm5lZCB0byB0aGUgY2FsbGJhY2sgcHJvdmlkZWQuIEFsbCBpbiBhbGwsIHRoaXMgaXMgYSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFuZCBibG9ja2luZyBwcm9jZXNzLFxyXG4gICAgICogd2hpY2ggZ2V0cyBtb3JlIGV4cGVuc2l2ZSB0aGUgbGFyZ2VyIHRoZSBjYW52YXMgc2l6ZSBnZXRzLCBzbyBwbGVhc2UgYmUgY2FyZWZ1bCBob3cgeW91IGVtcGxveSB0aGlzIGluIHlvdXIgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3NuYXBzaG90XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgRnVuY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzbmFwc2hvdCBpbWFnZSBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdpbWFnZS9wbmcnXSAtIFRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHRvIGNyZWF0ZSwgdXN1YWxseSBgaW1hZ2UvcG5nYCBvciBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuY29kZXJPcHRpb25zPTAuOTJdIC0gVGhlIGltYWdlIHF1YWxpdHksIGJldHdlZW4gMCBhbmQgMS4gVXNlZCBmb3IgaW1hZ2UgZm9ybWF0cyB3aXRoIGxvc3N5IGNvbXByZXNzaW9uLCBzdWNoIGFzIGBpbWFnZS9qcGVnYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFJlbmRlciBUZXh0dXJlIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzbmFwc2hvdDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBlbmNvZGVyT3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc25hcHNob3RGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgY2FsbGJhY2ssIGZhbHNlLCAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgdHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNuYXBzaG90Q2FudmFzKHRoaXMuY2FudmFzLCBjYWxsYmFjaywgZmFsc2UsIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0eXBlLCBlbmNvZGVyT3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBwaXhlbCBmcm9tIHRoaXMgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBzbmFwc2hvdCBpcyB0YWtlbiBpbW1lZGlhdGVseS5cclxuICAgICAqIFxyXG4gICAgICogVG8gY2FwdHVyZSB0aGUgd2hvbGUgUmVuZGVyIFRleHR1cmUgc2VlIHRoZSBgc25hcHNob3RgIG1ldGhvZC4gVG8gY2FwdHVyZSBhIHNwZWNpZmljIHBvcnRpb24sIHNlZSBgc25hcHNob3RBcmVhYC5cclxuICAgICAqIFxyXG4gICAgICogVW5saWtlIHRoZSBvdGhlciB0d28gc25hcHNob3QgbWV0aG9kcywgdGhpcyBvbmUgd2lsbCBzZW5kIHlvdXIgY2FsbGJhY2sgYSBgQ29sb3JgIG9iamVjdCBjb250YWluaW5nIHRoZSBjb2xvciBkYXRhIGZvclxyXG4gICAgICogdGhlIHJlcXVlc3RlZCBwaXhlbC4gSXQgZG9lc24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBpbnRlcm5hbCBDYW52YXMgb3IgSW1hZ2Ugb2JqZWN0LCBzbyBpcyBhIGxvdCBmYXN0ZXIgdG8gZXhlY3V0ZSxcclxuICAgICAqIHVzaW5nIGxlc3MgbWVtb3J5LCB0aGFuIHRoZSBvdGhlciBzbmFwc2hvdCBtZXRob2RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjc25hcHNob3RQaXhlbFxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlJlbmRlcmVyLlNuYXBzaG90LlNuYXBzaG90Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIEZ1bmN0aW9uIHRvIGludm9rZSBhZnRlciB0aGUgc25hcHNob3QgcGl4ZWwgZGF0YSBpcyBleHRyYWN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZW5kZXIgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc25hcHNob3RQaXhlbDogZnVuY3Rpb24gKHgsIHksIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbmFwc2hvdEZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjYWxsYmFjaywgdHJ1ZSwgeCwgeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc25hcHNob3RDYW52YXModGhpcy5jYW52YXMsIGNhbGxiYWNrLCB0cnVlLCB4LCB5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGRlc3Ryb3kgaGFuZGxlciwgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlc3Ryb3kgcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlI3ByZURlc3Ryb3lcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjkuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2F2ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBDYW52YXNQb29sLnJlbW92ZSh0aGlzLmNhbnZhcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5nbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmEuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZW5kZXJUZXh0dXJlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMi4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgUmVuZGVyVGV4dHVyZUNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgcmVuZGVyZXIuYmF0Y2hTcHJpdGUoc3JjLCBzcmMuZnJhbWUsIGNhbWVyYSwgcGFyZW50TWF0cml4KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVuZGVyVGV4dHVyZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgUmVuZGVyVGV4dHVyZSA9IHJlcXVpcmUoJy4vUmVuZGVyVGV4dHVyZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgUmVuZGVyIFRleHR1cmUgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFJlbmRlciBUZXh0dXJlIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNyZW5kZXJUZXh0dXJlXHJcbiAqIEBzaW5jZSAzLjIuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5SZW5kZXJUZXh0dXJlLlJlbmRlclRleHR1cmVDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3RlcigncmVuZGVyVGV4dHVyZScsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciB4ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd4JywgMCk7XHJcbiAgICB2YXIgeSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAneScsIDApO1xyXG4gICAgdmFyIHdpZHRoID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd3aWR0aCcsIDMyKTtcclxuICAgIHZhciBoZWlnaHQgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2hlaWdodCcsIDMyKTtcclxuICAgIHZhciBrZXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2tleScsIHVuZGVmaW5lZCk7XHJcbiAgICB2YXIgZnJhbWUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB2YXIgcmVuZGVyVGV4dHVyZSA9IG5ldyBSZW5kZXJUZXh0dXJlKHRoaXMuc2NlbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGtleSwgZnJhbWUpO1xyXG5cclxuICAgIGlmIChhZGRUb1NjZW5lICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgY29uZmlnLmFkZCA9IGFkZFRvU2NlbmU7XHJcbiAgICB9XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0KHRoaXMuc2NlbmUsIHJlbmRlclRleHR1cmUsIGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHJlbmRlclRleHR1cmU7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBSZW5kZXJUZXh0dXJlID0gcmVxdWlyZSgnLi9SZW5kZXJUZXh0dXJlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBSZW5kZXIgVGV4dHVyZSBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFJlbmRlciBUZXh0dXJlIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogQSBSZW5kZXIgVGV4dHVyZSBpcyBhIHNwZWNpYWwgdGV4dHVyZSB0aGF0IGFsbG93cyBhbnkgbnVtYmVyIG9mIEdhbWUgT2JqZWN0cyB0byBiZSBkcmF3biB0byBpdC4gWW91IGNhbiB0YWtlIG1hbnkgY29tcGxleCBvYmplY3RzIGFuZFxyXG4gKiBkcmF3IHRoZW0gYWxsIHRvIHRoaXMgb25lIHRleHR1cmUsIHdoaWNoIGNhbiB0aGV5IGJlIHVzZWQgYXMgdGhlIHRleHR1cmUgZm9yIG90aGVyIEdhbWUgT2JqZWN0J3MuIEl0J3MgYSB3YXkgdG8gZ2VuZXJhdGUgZHluYW1pY1xyXG4gKiB0ZXh0dXJlcyBhdCBydW4tdGltZSB0aGF0IGFyZSBXZWJHTCBmcmllbmRseSBhbmQgZG9uJ3QgaW52b2tlIGV4cGVuc2l2ZSBHUFUgdXBsb2Fkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjcmVuZGVyVGV4dHVyZVxyXG4gKiBAc2luY2UgMy4yLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPTMyXSAtIFRoZSB3aWR0aCBvZiB0aGUgUmVuZGVyIFRleHR1cmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0zMl0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBSZW5kZXIgVGV4dHVyZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtrZXldIC0gVGhlIHRleHR1cmUga2V5IHRvIG1ha2UgdGhlIFJlbmRlclRleHR1cmUgZnJvbS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcmFtZV0gLSB0aGUgZnJhbWUgdG8gbWFrZSB0aGUgUmVuZGVyVGV4dHVyZSBmcm9tLlxyXG4gKiBcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmV9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3JlbmRlclRleHR1cmUnLCBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwga2V5LCBmcmFtZSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBSZW5kZXJUZXh0dXJlKHRoaXMuc2NlbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGtleSwgZnJhbWUpKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1JlbmRlclRleHR1cmVXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL1JlbmRlclRleHR1cmVDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVXRpbHMgPSByZXF1aXJlKCcuLi8uLi9yZW5kZXJlci93ZWJnbC9VdGlscycpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlbmRlclRleHR1cmUjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMi4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFJlbmRlclRleHR1cmVXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGZyYW1lID0gc3JjLmZyYW1lO1xyXG4gICAgdmFyIHdpZHRoID0gZnJhbWUud2lkdGg7XHJcbiAgICB2YXIgaGVpZ2h0ID0gZnJhbWUuaGVpZ2h0O1xyXG4gICAgdmFyIGdldFRpbnQgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYTtcclxuXHJcbiAgICB0aGlzLnBpcGVsaW5lLmJhdGNoVGV4dHVyZShcclxuICAgICAgICBzcmMsXHJcbiAgICAgICAgZnJhbWUuZ2xUZXh0dXJlLFxyXG4gICAgICAgIHdpZHRoLCBoZWlnaHQsXHJcbiAgICAgICAgc3JjLngsIHNyYy55LFxyXG4gICAgICAgIHdpZHRoLCBoZWlnaHQsXHJcbiAgICAgICAgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSxcclxuICAgICAgICBzcmMucm90YXRpb24sXHJcbiAgICAgICAgc3JjLmZsaXBYLCAhc3JjLmZsaXBZLFxyXG4gICAgICAgIHNyYy5zY3JvbGxGYWN0b3JYLCBzcmMuc2Nyb2xsRmFjdG9yWSxcclxuICAgICAgICBzcmMuZGlzcGxheU9yaWdpblgsIHNyYy5kaXNwbGF5T3JpZ2luWSxcclxuICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LFxyXG4gICAgICAgIGdldFRpbnQoc3JjLl90aW50VEwsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUTCksXHJcbiAgICAgICAgZ2V0VGludChzcmMuX3RpbnRUUiwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYVRSKSxcclxuICAgICAgICBnZXRUaW50KHNyYy5fdGludEJMLCBjYW1lcmEuYWxwaGEgKiBzcmMuX2FscGhhQkwpLFxyXG4gICAgICAgIGdldFRpbnQoc3JjLl90aW50QlIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFCUiksXHJcbiAgICAgICAgKHNyYy5faXNUaW50ZWQgJiYgc3JjLnRpbnRGaWxsKSxcclxuICAgICAgICAwLCAwLFxyXG4gICAgICAgIGNhbWVyYSxcclxuICAgICAgICBwYXJlbnRNYXRyaXhcclxuICAgICk7XHJcblxyXG4gICAgLy8gIEZvcmNlIGNsZWFyIHRoZSBjdXJyZW50IHRleHR1cmUgc28gdGhhdCBpdGVtcyBuZXh0IGluIHRoZSBiYXRjaCAobGlrZSBHcmFwaGljcykgZG9uJ3QgdHJ5IGFuZCB1c2UgaXRcclxuICAgIHJlbmRlcmVyLnNldEJsYW5rVGV4dHVyZSh0cnVlKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVuZGVyVGV4dHVyZVdlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgUm9wZVJlbmRlciA9IHJlcXVpcmUoJy4vUm9wZVJlbmRlcicpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBSb3BlIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBUaGUgUm9wZSBvYmplY3QgaXMgV2ViR0wgb25seSBhbmQgZG9lcyBub3QgaGF2ZSBhIENhbnZhcyBjb3VudGVycGFydC5cclxuICpcclxuICogQSBSb3BlIGlzIGEgc3BlY2lhbCBraW5kIG9mIEdhbWUgT2JqZWN0IHRoYXQgaGFzIGEgdGV4dHVyZSB0aGF0IHJlcGVhdHMgYWxvbmcgaXRzIGVudGlyZSBsZW5ndGguXHJcbiAqIFVubGlrZSBhIFNwcml0ZSwgaXQgaXNuJ3QgcmVzdHJpY3RlZCB0byB1c2luZyBqdXN0IGEgcXVhZCBhbmQgY2FuIGhhdmUgYXMgbWFueSB2ZXJ0aWNlcyBhcyB5b3UgZGVmaW5lXHJcbiAqIHdoZW4gY3JlYXRpbmcgaXQuIFRoZSB2ZXJ0aWNlcyBjYW4gYmUgYXJyYW5nZWQgaW4gYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHN0cmlwIGFuZCBoYXZlIHRoZWlyIG93blxyXG4gKiBjb2xvciBhbmQgYWxwaGEgdmFsdWVzIGFzIHdlbGwuXHJcbiAqIFxyXG4gKiBBIFJvcGVzIG9yaWdpbiBpcyBhbHdheXMgMC41IHggMC41IGFuZCBjYW5ub3QgYmUgY2hhbmdlZC5cclxuICpcclxuICogQGNsYXNzIFJvcGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHdlYmdsT25seVxyXG4gKiBAc2luY2UgMy4yMy4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhU2luZ2xlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RleHR1cmVdIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci4gSWYgbm90IGdpdmVuLCBgX19ERUZBVUxUYCBpcyB1c2VkLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxudWxsKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICogQHBhcmFtIHsoaW50ZWdlcnxQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZVtdKX0gW3BvaW50cz0yXSAtIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZlcnRpY2VzIGRhdGEgZm9yIHRoaXMgUm9wZSwgb3IgYSBudW1iZXIgdGhhdCBpbmRpY2F0ZXMgaG93IG1hbnkgc2VnbWVudHMgdG8gc3BsaXQgdGhlIHRleHR1cmUgZnJhbWUgaW50by4gSWYgbm9uZSBpcyBwcm92aWRlZCBhIHNpbXBsZSBxdWFkIGlzIGNyZWF0ZWQuIFNlZSBgc2V0UG9pbnRzYCB0byBzZXQgdGhpcyBwb3N0LWNyZWF0aW9uLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtob3Jpem9udGFsPXRydWVdIC0gU2hvdWxkIHRoZSB2ZXJ0aWNlcyBvZiB0aGlzIFJvcGUgYmUgYWxpZ25lZCBob3Jpem9udGFsbHkgKGB0cnVlYCksIG9yIHZlcnRpY2FsbHkgKGBmYWxzZWApP1xyXG4gKiBAcGFyYW0ge251bWJlcltdfSBbY29sb3JzXSAtIEFuIG9wdGlvbmFsIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGRhdGEgZm9yIHRoaXMgUm9wZS4gWW91IHNob3VsZCBwcm92aWRlIG9uZSBjb2xvciB2YWx1ZSBwZXIgcGFpciBvZiB2ZXJ0aWNlcy5cclxuICogQHBhcmFtIHtudW1iZXJbXX0gW2FscGhhc10gLSBBbiBvcHRpb25hbCBhcnJheSBjb250YWluaW5nIHRoZSBhbHBoYSBkYXRhIGZvciB0aGlzIFJvcGUuIFlvdSBzaG91bGQgcHJvdmlkZSBvbmUgYWxwaGEgdmFsdWUgcGVyIHBhaXIgb2YgdmVydGljZXMuXHJcbiAqL1xyXG52YXIgUm9wZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhU2luZ2xlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlRleHR1cmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIFJvcGVSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBSb3BlIChzY2VuZSwgeCwgeSwgdGV4dHVyZSwgZnJhbWUsIHBvaW50cywgaG9yaXpvbnRhbCwgY29sb3JzLCBhbHBoYXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRleHR1cmUgPT09IHVuZGVmaW5lZCkgeyB0ZXh0dXJlID0gJ19fREVGQVVMVCc7IH1cclxuICAgICAgICBpZiAocG9pbnRzID09PSB1bmRlZmluZWQpIHsgcG9pbnRzID0gMjsgfVxyXG4gICAgICAgIGlmIChob3Jpem9udGFsID09PSB1bmRlZmluZWQpIHsgaG9yaXpvbnRhbCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnUm9wZScpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQW5pbWF0aW9uIENvbnRyb2xsZXIgb2YgdGhpcyBSb3BlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjYW5pbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQW5pbWF0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFuaW1zID0gbmV3IENvbXBvbmVudHMuQW5pbWF0aW9uKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBwb2ludHMgZGF0YSBmb3IgdGhpcyBSb3BlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEVhY2ggcG9pbnQgc2hvdWxkIGJlIGdpdmVuIGFzIGEgVmVjdG9yMkxpa2Ugb2JqZWN0IChpLmUuIGEgVmVjdG9yMiwgR2VvbS5Qb2ludCBvciBvYmplY3Qgd2l0aCBwdWJsaWMgeC95IHByb3BlcnRpZXMpLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgZ2l2ZW4gaW4gbG9jYWwgc3BhY2UsIHdoZXJlIDAgeCAwIGlzIHRoZSBzdGFydCBvZiB0aGUgUm9wZSBzdHJpcC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBZb3UgY2FuIG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhpcyBhcnJheSBkaXJlY3RseSBpbiByZWFsLXRpbWUgdG8gY3JlYXRlIGludGVyZXN0aW5nIGVmZmVjdHMuXHJcbiAgICAgICAgICogSWYgeW91IGRvIHNvLCBiZSBzdXJlIHRvIGNhbGwgYHNldERpcnR5YCBfYWZ0ZXJfIG1vZGlmeWluZyB0aGlzIGFycmF5LCBzbyB0aGF0IHRoZSB2ZXJ0aWNlcyBkYXRhIGlzXHJcbiAgICAgICAgICogdXBkYXRlZCBiZWZvcmUgdGhlIG5leHQgcmVuZGVyLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgYHNldFBvaW50c2AgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogU2hvdWxkIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgX3NpemVfIG9mIHRoaXMgYXJyYXksIHRoZW4geW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBgc2V0UG9pbnRzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNwb2ludHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2VbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZlcnRpY2VzIGRhdGEgZm9yIHRoaXMgUm9wZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIGRhdGEgaXMgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBgdXBkYXRlVmVydGljZXNgIG1ldGhvZCwgYmFzZWQgb24gdGhlIHBvaW50cyBwcm92aWRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI3ZlcnRpY2VzXHJcbiAgICAgICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdXYgZGF0YSBmb3IgdGhpcyBSb3BlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgZGF0YSBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIGBzZXRQb2ludHNgIG1ldGhvZCwgYmFzZWQgb24gdGhlIHBvaW50cyBwcm92aWRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI3V2XHJcbiAgICAgICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51djtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgZGF0YSBmb3IgdGhpcyBSb3BlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIENvbG9ycyBzaG91bGQgYmUgZ2l2ZW4gYXMgbnVtZXJpYyBSR0IgdmFsdWVzLCBzdWNoIGFzIDB4ZmYwMDAwLlxyXG4gICAgICAgICAqIFlvdSBzaG91bGQgcHJvdmlkZSBfdHdvXyBjb2xvciB2YWx1ZXMgZm9yIGV2ZXJ5IHBvaW50IGluIHRoZSBSb3BlLCBvbmUgZm9yIHRoZSB0b3AgYW5kIG9uZSBmb3IgdGhlIGJvdHRvbSBvZiBlYWNoIHF1YWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogWW91IGNhbiBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgZGlyZWN0bHkgaW4gcmVhbC10aW1lLCBob3dldmVyLCBzaG91bGQgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBfc2l6ZV9cclxuICAgICAgICAgKiBvZiB0aGUgYXJyYXksIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGBzZXRDb2xvcnNgIG1ldGhvZCBpbnN0ZWFkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjY29sb3JzXHJcbiAgICAgICAgICogQHR5cGUge1VpbnQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbG9ycztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYWxwaGEgZGF0YSBmb3IgdGhpcyBSb3BlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEFscGhhcyBzaG91bGQgYmUgZ2l2ZW4gYXMgZmxvYXQgdmFsdWVzLCBzdWNoIGFzIDAuNS5cclxuICAgICAgICAgKiBZb3Ugc2hvdWxkIHByb3ZpZGUgX3R3b18gYWxwaGEgdmFsdWVzIGZvciBldmVyeSBwb2ludCBpbiB0aGUgUm9wZSwgb25lIGZvciB0aGUgdG9wIGFuZCBvbmUgZm9yIHRoZSBib3R0b20gb2YgZWFjaCBxdWFkLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFlvdSBjYW4gbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGRpcmVjdGx5IGluIHJlYWwtdGltZSwgaG93ZXZlciwgc2hvdWxkIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgX3NpemVfXHJcbiAgICAgICAgICogb2YgdGhlIGFycmF5LCB0aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBgc2V0QWxwaGFzYCBtZXRob2QgaW5zdGVhZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI2FscGhhc1xyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWxwaGFzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGludCBmaWxsIG1vZGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogMCA9IEFuIGFkZGl0aXZlIHRpbnQgKHRoZSBkZWZhdWx0KSwgd2hlcmUgdmVydGljZXMgY29sb3JzIGFyZSBibGVuZGVkIHdpdGggdGhlIHRleHR1cmUuXHJcbiAgICAgICAgICogMSA9IEEgZmlsbCB0aW50LCB3aGVyZSB0aGUgdmVydGljZXMgY29sb3JzIHJlcGxhY2UgdGhlIHRleHR1cmUsIGJ1dCByZXNwZWN0cyB0ZXh0dXJlIGFscGhhLlxyXG4gICAgICAgICAqIDIgPSBBIGNvbXBsZXRlIHRpbnQsIHdoZXJlIHRoZSB2ZXJ0aWNlcyBjb2xvcnMgcmVwbGFjZSB0aGUgdGV4dHVyZSwgaW5jbHVkaW5nIGFscGhhLCBlbnRpcmVseS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSN0aW50RmlsbFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbnRGaWxsID0gKHRleHR1cmUgPT09ICdfX0RFRkFVTFQnKSA/IDIgOiAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgUm9wZSBpcyBtYXJrZWQgYXMgYGRpcnR5YCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGUgaXRzIHZlcnRpY2VzXHJcbiAgICAgICAgICogdGhlIG5leHQgdGltZSBpdCByZW5kZXJzLiBZb3UgY2FuIGFsc28gZm9yY2UgdGhpcyBieSBjYWxsaW5nIGB1cGRhdGVWZXJ0aWNlc2AuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjZGlydHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBcmUgdGhlIFJvcGUgdmVydGljZXMgYWxpZ25lZCBob3Jpem9udGFsbHksIGluIGEgc3RyaXAsIG9yIHZlcnRpY2FsbHksIGluIGEgY29sdW1uP1xyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgc2V0IGR1cmluZyBpbnN0YW50aWF0aW9uIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCBkaXJlY3RseS5cclxuICAgICAgICAgKiBTZWUgdGhlIGBzZXRWZXJ0aWNhbGAgYW5kIGBzZXRIb3Jpem9udGFsYCBtZXRob2RzLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI2hvcml6b250YWxcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsID0gaG9yaXpvbnRhbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWxseSBmbGlwcGVkIHN0YXRlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIEdhbWUgT2JqZWN0IHRoYXQgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIGhvcml6b250YWwgYXhpcy5cclxuICAgICAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICAgICAqIElmIHRoaXMgR2FtZSBPYmplY3QgaGFzIGEgcGh5c2ljcyBib2R5LCBpdCB3aWxsIG5vdCBjaGFuZ2UgdGhlIGJvZHkuIFRoaXMgaXMgYSByZW5kZXJpbmcgdG9nZ2xlIG9ubHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjX2ZsaXBYXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9mbGlwWCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWxseSBmbGlwcGVkIHN0YXRlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIEdhbWUgT2JqZWN0IHRoYXQgaXMgZmxpcHBlZCB2ZXJ0aWNhbGx5IHdpbGwgcmVuZGVyIGludmVyc2VkIG9uIHRoZSB2ZXJ0aWNhbCBheGlzIChpLmUuIHVwc2lkZSBkb3duKVxyXG4gICAgICAgICAqIEZsaXBwaW5nIGFsd2F5cyB0YWtlcyBwbGFjZSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHRleHR1cmUgYW5kIGRvZXMgbm90IGltcGFjdCB0aGUgc2NhbGUgdmFsdWUuXHJcbiAgICAgICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNmbGlwWVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZmxpcFkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgVmVjdG9yMiB1c2VkIGZvciB2ZXJ0aWNlcyB1cGRhdGVzLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI19wZXJwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGVycCA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBjaG9vc2UgdG8gcmVuZGVyIHRoZSB2ZXJ0aWNlcyBvZiB0aGlzIFJvcGUgdG8gYSBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBY2hpZXZlIHRoaXMgYnkgc2V0dGluZyB0aGUgYGRlYnVnQ2FsbGJhY2tgIGFuZCB0aGUgYGRlYnVnR3JhcGhpY2AgcHJvcGVydGllcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBZb3UgY2FuIGRvIHRoaXMgaW4gYSBzaW5nbGUgY2FsbCB2aWEgdGhlIGBSb3BlLnNldERlYnVnYCBtZXRob2QsIHdoaWNoIHdpbGwgdXNlIHRoZVxyXG4gICAgICAgICAqIGJ1aWx0LWluIGRlYnVnIGZ1bmN0aW9uLiBZb3UgY2FuIGFsc28gc2V0IGl0IHRvIHlvdXIgb3duIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2tcclxuICAgICAgICAgKiB3aWxsIGJlIGludm9rZWQgX29uY2UgcGVyIHJlbmRlcl8gYW5kIHNlbnQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGBkZWJ1Z0NhbGxiYWNrKHNyYywgbWVzaExlbmd0aCwgdmVydHMpYFxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGBzcmNgIGlzIHRoZSBSb3BlIGluc3RhbmNlIGJlaW5nIGRlYnVnZ2VkLlxyXG4gICAgICAgICAqIGBtZXNoTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIG1lc2ggdmVydGljZXMgaW4gdG90YWwuXHJcbiAgICAgICAgICogYHZlcnRzYCBpcyBhbiBhcnJheSBvZiB0aGUgdHJhbnNsYXRlZCB2ZXJ0ZXggY29vcmRpbmF0ZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVG8gZGlzYWJsZSByZW5kZXJpbmcsIHNldCB0aGlzIHByb3BlcnR5IGJhY2sgdG8gYG51bGxgLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI2RlYnVnQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVidWdDYWxsYmFjayA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHcmFwaGljcyBpbnN0YW5jZSB0aGF0IHRoZSBkZWJ1ZyB2ZXJ0aWNlcyB3aWxsIGJlIGRyYXduIHRvLCBpZiBgc2V0RGVidWdgIGhhc1xyXG4gICAgICAgICAqIGJlZW4gY2FsbGVkLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI2RlYnVnR3JhcGhpY1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVidWdHcmFwaGljID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKHRleHR1cmUsIGZyYW1lKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZVRvRnJhbWUoKTtcclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgnVGV4dHVyZVRpbnRTdHJpcFBpcGVsaW5lJyk7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50cykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUFycmF5cyhwb2ludHMubGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9pbnRzKHBvaW50cywgY29sb3JzLCBhbHBoYXMpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVZlcnRpY2VzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFJvcGUgdXBkYXRlIGxvb3AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNwcmVVcGRhdGVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHByZXZGcmFtZSA9IHRoaXMuYW5pbXMuY3VycmVudEZyYW1lO1xyXG5cclxuICAgICAgICB0aGlzLmFuaW1zLnVwZGF0ZSh0aW1lLCBkZWx0YSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFuaW1zLmN1cnJlbnRGcmFtZSAhPT0gcHJldkZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVVVnMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWZXJ0aWNlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydCBwbGF5aW5nIHRoZSBnaXZlbiBhbmltYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNwbGF5XHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gcGxheS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lnbm9yZUlmUGxheWluZz1mYWxzZV0gLSBJZiBhbiBhbmltYXRpb24gaXMgYWxyZWFkeSBwbGF5aW5nIHRoZW4gaWdub3JlIHRoaXMgY2FsbC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0RnJhbWU9MF0gLSBPcHRpb25hbGx5IHN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZyBmcm9tIHRoaXMgZnJhbWUgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGxheTogZnVuY3Rpb24gKGtleSwgaWdub3JlSWZQbGF5aW5nLCBzdGFydEZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5pbXMucGxheShrZXksIGlnbm9yZUlmUGxheWluZywgc3RhcnRGcmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZsYWdzIHRoaXMgUm9wZSBhcyBiZWluZyBkaXJ0eS4gQSBkaXJ0eSByb3BlIHdpbGwgcmVjYWxjdWxhdGUgYWxsIG9mIGl0cyB2ZXJ0aWNlcyBkYXRhXHJcbiAgICAgKiB0aGUgX25leHRfIHRpbWUgaXQgcmVuZGVycy4gWW91IHNob3VsZCBzZXQgdGhpcyByb3BlIGFzIGRpcnR5IGlmIHlvdSB1cGRhdGUgdGhlIHBvaW50c1xyXG4gICAgICogYXJyYXkgZGlyZWN0bHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjc2V0RGlydHlcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RGlydHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFsaWdubWVudCBvZiB0aGUgcG9pbnRzIGluIHRoaXMgUm9wZSB0byBiZSBob3Jpem9udGFsLCBpbiBhIHN0cmlwIGZvcm1hdC5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoaXMgUm9wZS4gVGhlIGN1cnJlbnQgcG9pbnRzLCB2ZXJ0aWNlcywgY29sb3JzIGFuZCBhbHBoYVxyXG4gICAgICogdmFsdWVzIHdpbGwgYmUgcmVzZXQgdG8gdGhvZXMgdmFsdWVzIGdpdmVuIGFzIHBhcmFtZXRlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjc2V0SG9yaXpvbnRhbFxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfFBoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlW10pfSBbcG9pbnRzXSAtIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZlcnRpY2VzIGRhdGEgZm9yIHRoaXMgUm9wZSwgb3IgYSBudW1iZXIgdGhhdCBpbmRpY2F0ZXMgaG93IG1hbnkgc2VnbWVudHMgdG8gc3BsaXQgdGhlIHRleHR1cmUgZnJhbWUgaW50by4gSWYgbm9uZSBpcyBwcm92aWRlZCB0aGUgY3VycmVudCBwb2ludHMgbGVuZ3RoIGlzIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbY29sb3JzXSAtIEVpdGhlciBhIHNpbmdsZSBjb2xvciB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gW2FscGhhc10gLSBFaXRoZXIgYSBzaW5nbGUgYWxwaGEgdmFsdWUsIG9yIGFuIGFycmF5IG9mIHZhbHVlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0SG9yaXpvbnRhbDogZnVuY3Rpb24gKHBvaW50cywgY29sb3JzLCBhbHBoYXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHBvaW50cyA9PT0gdW5kZWZpbmVkKSB7IHBvaW50cyA9IHRoaXMucG9pbnRzLmxlbmd0aDsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ob3Jpem9udGFsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmhvcml6b250YWwgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRQb2ludHMocG9pbnRzLCBjb2xvcnMsIGFscGhhcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBwb2ludHMgaW4gdGhpcyBSb3BlIHRvIGJlIHZlcnRpY2FsLCBpbiBhIGNvbHVtbiBmb3JtYXQuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXNldCB0aGlzIFJvcGUuIFRoZSBjdXJyZW50IHBvaW50cywgdmVydGljZXMsIGNvbG9ycyBhbmQgYWxwaGFcclxuICAgICAqIHZhbHVlcyB3aWxsIGJlIHJlc2V0IHRvIHRob2VzIHZhbHVlcyBnaXZlbiBhcyBwYXJhbWV0ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI3NldFZlcnRpY2FsXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2VbXSl9IFtwb2ludHNdIC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmVydGljZXMgZGF0YSBmb3IgdGhpcyBSb3BlLCBvciBhIG51bWJlciB0aGF0IGluZGljYXRlcyBob3cgbWFueSBzZWdtZW50cyB0byBzcGxpdCB0aGUgdGV4dHVyZSBmcmFtZSBpbnRvLiBJZiBub25lIGlzIHByb3ZpZGVkIHRoZSBjdXJyZW50IHBvaW50cyBsZW5ndGggaXMgdXNlZC5cclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IFtjb2xvcnNdIC0gRWl0aGVyIGEgc2luZ2xlIGNvbG9yIHZhbHVlLCBvciBhbiBhcnJheSBvZiB2YWx1ZXMuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbYWxwaGFzXSAtIEVpdGhlciBhIHNpbmdsZSBhbHBoYSB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRWZXJ0aWNhbDogZnVuY3Rpb24gKHBvaW50cywgY29sb3JzLCBhbHBoYXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHBvaW50cyA9PT0gdW5kZWZpbmVkKSB7IHBvaW50cyA9IHRoaXMucG9pbnRzLmxlbmd0aDsgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaG9yaXpvbnRhbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFBvaW50cyhwb2ludHMsIGNvbG9ycywgYWxwaGFzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aW50IGZpbGwgbW9kZS5cclxuICAgICAqIFxyXG4gICAgICogTW9kZSAwIGlzIGFuIGFkZGl0aXZlIHRpbnQsIHRoZSBkZWZhdWx0LCB3aGljaCBibGVuZHMgdGhlIHZlcnRpY2VzIGNvbG9ycyB3aXRoIHRoZSB0ZXh0dXJlLlxyXG4gICAgICogVGhpcyBtb2RlIHJlc3BlY3RzIHRoZSB0ZXh0dXJlIGFscGhhLlxyXG4gICAgICogXHJcbiAgICAgKiBNb2RlIDEgaXMgYSBmaWxsIHRpbnQuIFVubGlrZSBhbiBhZGRpdGl2ZSB0aW50LCBhIGZpbGwtdGludCBsaXRlcmFsbHkgcmVwbGFjZXMgdGhlIHBpeGVsIGNvbG9yc1xyXG4gICAgICogZnJvbSB0aGUgdGV4dHVyZSB3aXRoIHRob3NlIGluIHRoZSB0aW50LiBZb3UgY2FuIHVzZSB0aGlzIGZvciBlZmZlY3RzIHN1Y2ggYXMgbWFraW5nIGEgcGxheWVyIGZsYXNoICd3aGl0ZSdcclxuICAgICAqIGlmIGhpdCBieSBzb21ldGhpbmcuIFRoaXMgbW9kZSByZXNwZWN0cyB0aGUgdGV4dHVyZSBhbHBoYS5cclxuICAgICAqIFxyXG4gICAgICogTW9kZSAyIGlzIGEgY29tcGxldGUgdGludC4gVGhlIHRleHR1cmUgY29sb3JzIGFuZCBhbHBoYSBhcmUgcmVwbGFjZWQgZW50aXJlbHkgYnkgdGhlIHZlcnRpY2VzIGNvbG9ycy5cclxuICAgICAqIFxyXG4gICAgICogU2VlIHRoZSBgc2V0Q29sb3JzYCBtZXRob2QgZm9yIGRldGFpbHMgb2YgaG93IHRvIGNvbG9yIGVhY2ggb2YgdGhlIHZlcnRpY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjc2V0VGludEZpbGxcclxuICAgICAqIEB3ZWJnbE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt2YWx1ZT0wXSAtIFNldCB0byAwIGZvciBhbiBBZGRpdGl2ZSB0aW50LCAxIGZvciBhIGZpbGwgdGludCB3aXRoIGFscGhhLCBvciAyIGZvciBhIGZpbGwgdGludCB3aXRob3V0IGFscGhhLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRUaW50RmlsbDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLnRpbnRGaWxsID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYWxwaGEgdmFsdWVzIHVzZWQgYnkgdGhlIFJvcGUgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBwcm92aWRlIHRoZSB2YWx1ZXMgaW4gYSBudW1iZXIgb2Ygd2F5czpcclxuICAgICAqIFxyXG4gICAgICogMSkgT25lIHNpbmdsZSBudW1lcmljIHZhbHVlOiBgc2V0QWxwaGFzKDAuNSlgIC0gVGhpcyB3aWxsIHNldCBhIHNpbmdsZSBhbHBoYSBmb3IgdGhlIHdob2xlIFJvcGUuXHJcbiAgICAgKiAyKSBUd28gbnVtZXJpYyB2YWx1ZTogYHNldEFscGhhcygxLCAwLjUpYCAtIFRoaXMgd2lsbCBzZXQgYSAndG9wJyBhbmQgJ2JvdHRvbScgYWxwaGEgdmFsdWUgYWNyb3NzIHRoZSB3aG9sZSBSb3BlLlxyXG4gICAgICogMykgQW4gYXJyYXkgb2YgdmFsdWVzOiBgc2V0QWxwaGFzKFsgMSwgMC41LCAwLjIgXSlgXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBwcm92aWRlIGFuIGFycmF5IG9mIHZhbHVlcyBhbmQgdGhlIGFycmF5IGhhcyBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgYHBvaW50c2AgaW4gdGhlIFJvcGUsIGl0XHJcbiAgICAgKiB3aWxsIHVzZSBlYWNoIGFscGhhIHZhbHVlIHBlciByb3BlIHNlZ21lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBwcm92aWRlZCBhcnJheSBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHZhbHVlcyB0aGFuIGBwb2ludHNgIHRoZW4gaXQgd2lsbCB1c2UgdGhlIHZhbHVlcyBpbiBvcmRlciwgZnJvbVxyXG4gICAgICogdGhlIGZpcnN0IFJvcGUgc2VnbWVudCBhbmQgb24sIHVudGlsIGl0IHJ1bnMgb3V0IG9mIHZhbHVlcy4gVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGFscGhhIHZhbHVlcyBhdCBhbGxcclxuICAgICAqIHZlcnRpY2VzIGluIHRoZSBSb3BlLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBgc2V0QWxwaGFzYCAocGx1cmFsKSBhbmQgbm90IGBzZXRBbHBoYWAuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjc2V0QWxwaGFzXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IFthbHBoYXNdIC0gRWl0aGVyIGEgc2luZ2xlIGFscGhhIHZhbHVlLCBvciBhbiBhcnJheSBvZiB2YWx1ZXMuIElmIG5vdGhpbmcgaXMgcHJvdmlkZWQgYWxwaGEgaXMgcmVzZXQgdG8gMS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYm90dG9tQWxwaGFdIC0gQW4gb3B0aW9uYWwgYm90dG9tIGFscGhhIHZhbHVlLiBTZWUgdGhlIG1ldGhvZCBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGFzOiBmdW5jdGlvbiAoYWxwaGFzLCBib3R0b21BbHBoYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdG90YWwgPSB0aGlzLnBvaW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0b3RhbCA8IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjdXJyZW50QWxwaGFzID0gdGhpcy5hbHBoYXM7XHJcblxyXG4gICAgICAgIGlmIChhbHBoYXMgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFscGhhcyA9IFsgMSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShhbHBoYXMpICYmIGJvdHRvbUFscGhhID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbHBoYXMgPSBbIGFscGhhcyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGJvdHRvbUFscGhhICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgVG9wIC8gQm90dG9tIGFscGhhIHBhaXJcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaSAqIDI7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudEFscGhhc1tpbmRleF0gPSBhbHBoYXM7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50QWxwaGFzW2luZGV4ICsgMV0gPSBib3R0b21BbHBoYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChhbHBoYXMubGVuZ3RoID09PSB0b3RhbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiB0aGVyZSBhcmUgZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgYWxwaGFzIGFzIHBvaW50cywgd2UnbGwgY29tYmluZSB0aGUgYWxwaGFzXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGkgKiAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYXNbaW5kZXhdID0gYWxwaGFzW2ldO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEFscGhhc1tpbmRleCArIDFdID0gYWxwaGFzW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwcmV2QWxwaGEgPSBhbHBoYXNbMF07XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpICogMjtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGFscGhhcy5sZW5ndGggPiBpbmRleClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2QWxwaGEgPSBhbHBoYXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYXNbaW5kZXhdID0gcHJldkFscGhhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhbHBoYXMubGVuZ3RoID4gaW5kZXggKyAxKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZBbHBoYSA9IGFscGhhc1tpbmRleCArIDFdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRBbHBoYXNbaW5kZXggKyAxXSA9IHByZXZBbHBoYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29sb3IgdmFsdWVzIHVzZWQgYnkgdGhlIFJvcGUgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAqIFxyXG4gICAgICogQ29sb3JzIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGxldmVsIG9mIHRpbnQgYXBwbGllZCBhY3Jvc3MgdGhlIFJvcGUgdGV4dHVyZS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBwcm92aWRlIHRoZSB2YWx1ZXMgaW4gYSBudW1iZXIgb2Ygd2F5czpcclxuICAgICAqIFxyXG4gICAgICogKiBPbmUgc2luZ2xlIG51bWVyaWMgdmFsdWU6IGBzZXRDb2xvcnMoMHhmZjAwMDApYCAtIFRoaXMgd2lsbCBzZXQgYSBzaW5nbGUgY29sb3IgdGludCBmb3IgdGhlIHdob2xlIFJvcGUuXHJcbiAgICAgKiAqIEFuIGFycmF5IG9mIHZhbHVlczogYHNldENvbG9ycyhbIDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYgXSlgXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBwcm92aWRlIGFuIGFycmF5IG9mIHZhbHVlcyBhbmQgdGhlIGFycmF5IGhhcyBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgYHBvaW50c2AgaW4gdGhlIFJvcGUsIGl0XHJcbiAgICAgKiB3aWxsIHVzZSBlYWNoIGNvbG9yIHBlciByb3BlIHNlZ21lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBwcm92aWRlZCBhcnJheSBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHZhbHVlcyB0aGFuIGBwb2ludHNgIHRoZW4gaXQgd2lsbCB1c2UgdGhlIHZhbHVlcyBpbiBvcmRlciwgZnJvbVxyXG4gICAgICogdGhlIGZpcnN0IFJvcGUgc2VnbWVudCBhbmQgb24sIHVudGlsIGl0IHJ1bnMgb3V0IG9mIHZhbHVlcy4gVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGNvbG9yIHZhbHVlcyBhdCBhbGxcclxuICAgICAqIHZlcnRpY2VzIGluIHRoZSBSb3BlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI3NldENvbG9yc1xyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbY29sb3JzXSAtIEVpdGhlciBhIHNpbmdsZSBjb2xvciB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLiBJZiBub3RoaW5nIGlzIHByb3ZpZGVkIGNvbG9yIGlzIHJlc2V0IHRvIDB4ZmZmZmZmLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xvcnM6IGZ1bmN0aW9uIChjb2xvcnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRvdGFsID0gdGhpcy5wb2ludHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAodG90YWwgPCAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY3VycmVudENvbG9ycyA9IHRoaXMuY29sb3JzO1xyXG5cclxuICAgICAgICBpZiAoY29sb3JzID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb2xvcnMgPSBbIDB4ZmZmZmZmIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGNvbG9ycykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb2xvcnMgPSBbIGNvbG9ycyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPT09IHRvdGFsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIHRoZXJlIGFyZSBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBjb2xvcnMgYXMgcG9pbnRzLCB3ZSdsbCBjb21iaW5lIHRoZSBjb2xvcnNcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaSAqIDI7XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudENvbG9yc1tpbmRleF0gPSBjb2xvcnNbaV07XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29sb3JzW2luZGV4ICsgMV0gPSBjb2xvcnNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHByZXZDb2xvciA9IGNvbG9yc1swXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGkgKiAyO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29sb3JzLmxlbmd0aCA+IGluZGV4KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZDb2xvciA9IGNvbG9yc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudENvbG9yc1tpbmRleF0gPSBwcmV2Q29sb3I7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPiBpbmRleCArIDEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldkNvbG9yID0gY29sb3JzW2luZGV4ICsgMV07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudENvbG9yc1tpbmRleCArIDFdID0gcHJldkNvbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb2ludHMgdXNlZCBieSB0aGlzIFJvcGUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBwb2ludHMgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIFZlY3RvcjIsIG9yIHZlY3RvcjItbGlrZSBvYmplY3RzIChpLmUuIHRob3NlIHdpdGggcHVibGljIHgveSBwcm9wZXJ0aWVzKS5cclxuICAgICAqIFxyXG4gICAgICogRWFjaCBwb2ludCBjb3JyZXNwb25kcyB0byBvbmUgc2VnbWVudCBvZiB0aGUgUm9wZS4gVGhlIG1vcmUgcG9pbnRzIGluIHRoZSBhcnJheSwgdGhlIG1vcmUgc2VnbWVudHMgdGhlIHJvcGUgaGFzLlxyXG4gICAgICogXHJcbiAgICAgKiBQb2ludCBjb29yZGluYXRlcyBhcmUgZ2l2ZW4gaW4gbG9jYWwtc3BhY2UsIG5vdCB3b3JsZC1zcGFjZSwgYW5kIGFyZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlXHJcbiAgICAgKiB0aGlzIFJvcGUgb2JqZWN0IGlzIHVzaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBSb3BlIHVzaW5nIGEgNTEyIHB4IHdpZGUgdGV4dHVyZSwgc3BsaXQgaW50byA0IHNlZ21lbnRzICgxMjhweCBlYWNoKSB3b3VsZCB1c2UgdGhlIGZvbGxvd2luZyBwb2ludHM6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHJvcGUuc2V0UG9pbnRzKFtcclxuICAgICAqICAgeyB4OiAwLCB5OiAwIH0sXHJcbiAgICAgKiAgIHsgeDogMTI4LCB5OiAwIH0sXHJcbiAgICAgKiAgIHsgeDogMjU2LCB5OiAwIH0sXHJcbiAgICAgKiAgIHsgeDogMzg0LCB5OiAwIH1cclxuICAgICAqIF0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIE9yLCB5b3UgY2FuIHByb3ZpZGUgYW4gaW50ZWdlciB0byBkbyB0aGUgc2FtZSB0aGluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogcm9wZS5zZXRQb2ludHMoNCk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogV2hpY2ggd2lsbCBkaXZpZGUgdGhlIFJvcGUgaW50byA0IGVxdWFsbHkgc2l6ZWQgc2VnbWVudHMgYmFzZWQgb24gdGhlIGZyYW1lIHdpZHRoLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGEgZGlmZmVyZW50IG51bWJlciBvZiBwb2ludHMgdGhhbiB0aGUgUm9wZSBoYXMgY3VycmVudGx5IHdpbGxcclxuICAgICAqIF9yZXNldF8gdGhlIGNvbG9yIGFuZCBhbHBoYSB2YWx1ZXMsIHVubGVzcyB5b3UgcHJvdmlkZSB0aGVtIGFzIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNzZXRQb2ludHNcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZVtdKX0gW3BvaW50cz0yXSAtIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZlcnRpY2VzIGRhdGEgZm9yIHRoaXMgUm9wZSwgb3IgYSBudW1iZXIgdGhhdCBpbmRpY2F0ZXMgaG93IG1hbnkgc2VnbWVudHMgdG8gc3BsaXQgdGhlIHRleHR1cmUgZnJhbWUgaW50by4gSWYgbm9uZSBpcyBwcm92aWRlZCBhIHNpbXBsZSBxdWFkIGlzIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbY29sb3JzXSAtIEVpdGhlciBhIHNpbmdsZSBjb2xvciB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gW2FscGhhc10gLSBFaXRoZXIgYSBzaW5nbGUgYWxwaGEgdmFsdWUsIG9yIGFuIGFycmF5IG9mIHZhbHVlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UG9pbnRzOiBmdW5jdGlvbiAocG9pbnRzLCBjb2xvcnMsIGFscGhhcylcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRzID09PSB1bmRlZmluZWQpIHsgcG9pbnRzID0gMjsgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHBvaW50cyA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgR2VuZXJhdGUgYW4gYXJyYXkgYmFzZWQgb24gdGhlIHBvaW50c1xyXG4gICAgICAgICAgICB2YXIgc2VnbWVudHMgPSBwb2ludHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VnbWVudHMgPCAyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWdtZW50cyA9IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBvaW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdmFyIHM7XHJcbiAgICAgICAgICAgIHZhciBmcmFtZVNlZ21lbnQ7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXQ7XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuaG9yaXpvbnRhbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLSh0aGlzLmZyYW1lLmhhbGZXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBmcmFtZVNlZ21lbnQgPSB0aGlzLmZyYW1lLndpZHRoIC8gKHNlZ21lbnRzIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHNlZ21lbnRzOyBzKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goeyB4OiBvZmZzZXQgKyBzICogZnJhbWVTZWdtZW50LCB5OiAwIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLSh0aGlzLmZyYW1lLmhhbGZIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgZnJhbWVTZWdtZW50ID0gdGhpcy5mcmFtZS5oZWlnaHQgLyAoc2VnbWVudHMgLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgc2VnbWVudHM7IHMrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaCh7IHg6IDAsIHk6IG9mZnNldCArIHMgKiBmcmFtZVNlZ21lbnQgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0b3RhbCA9IHBvaW50cy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRUb3RhbCA9IHRoaXMucG9pbnRzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKHRvdGFsIDwgMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUm9wZTogTm90IGVub3VnaCBwb2ludHMgZ2l2ZW4nKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0b3RhbCA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvaW50cy51bnNoaWZ0KHsgeDogMCwgeTogMCB9KTtcclxuICAgICAgICAgICAgdG90YWwrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50VG90YWwgIT09IHRvdGFsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVBcnJheXModG90YWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlVVZzKCk7XHJcblxyXG4gICAgICAgIGlmIChjb2xvcnMgIT09IHVuZGVmaW5lZCAmJiBjb2xvcnMgIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbG9ycyhjb2xvcnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFscGhhcyAhPT0gdW5kZWZpbmVkICYmIGFscGhhcyAhPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWxwaGFzKGFscGhhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGFsbCBvZiB0aGUgVVZzIGJhc2VkIG9uIHRoZSBSb3BlLnBvaW50cyBhbmQgYGZsaXBYYCBhbmQgYGZsaXBZYCBzZXR0aW5ncy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSN1cGRhdGVVVnNcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVVZzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjdXJyZW50VVZzID0gdGhpcy51djtcclxuICAgICAgICB2YXIgdG90YWwgPSB0aGlzLnBvaW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciB1MCA9IHRoaXMuZnJhbWUudTA7XHJcbiAgICAgICAgdmFyIHYwID0gdGhpcy5mcmFtZS52MDtcclxuICAgICAgICB2YXIgdTEgPSB0aGlzLmZyYW1lLnUxO1xyXG4gICAgICAgIHZhciB2MSA9IHRoaXMuZnJhbWUudjE7XHJcblxyXG4gICAgICAgIHZhciBwYXJ0SCA9ICh1MSAtIHUwKSAvICh0b3RhbCAtIDEpO1xyXG4gICAgICAgIHZhciBwYXJ0ViA9ICh2MSAtIHYwKSAvICh0b3RhbCAtIDEpO1xyXG4gICBcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSBpICogNDtcclxuXHJcbiAgICAgICAgICAgIHZhciB1djA7XHJcbiAgICAgICAgICAgIHZhciB1djE7XHJcbiAgICAgICAgICAgIHZhciB1djI7XHJcbiAgICAgICAgICAgIHZhciB1djM7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ob3Jpem9udGFsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmxpcFgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYwID0gdTEgLSAoaSAqIHBhcnRIKTtcclxuICAgICAgICAgICAgICAgICAgICB1djIgPSB1MSAtIChpICogcGFydEgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHV2MCA9IHUwICsgKGkgKiBwYXJ0SCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYyID0gdTAgKyAoaSAqIHBhcnRIKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmxpcFkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYxID0gdjE7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYzID0gdjA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYxID0gdjA7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYzID0gdjE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZmxpcFgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYwID0gdTA7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYyID0gdTE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYwID0gdTE7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYyID0gdTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZsaXBZKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHV2MSA9IHYxIC0gKGkgKiBwYXJ0Vik7XHJcbiAgICAgICAgICAgICAgICAgICAgdXYzID0gdjEgLSAoaSAqIHBhcnRWKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB1djEgPSB2MCArIChpICogcGFydFYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV2MyA9IHYwICsgKGkgKiBwYXJ0Vik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRVVnNbaW5kZXggKyAwXSA9IHV2MDtcclxuICAgICAgICAgICAgY3VycmVudFVWc1tpbmRleCArIDFdID0gdXYxO1xyXG4gICAgICAgICAgICBjdXJyZW50VVZzW2luZGV4ICsgMl0gPSB1djI7XHJcbiAgICAgICAgICAgIGN1cnJlbnRVVnNbaW5kZXggKyAzXSA9IHV2MztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgYWxsIG9mIHRoZSBpbnRlcm5hbCBhcnJheXM6IGB2ZXJ0aWNlc2AsIGB1dmAsIGBjb2xvcnNgIGFuZCBgYWxwaGFzYCB0byB0aGUgbmV3XHJcbiAgICAgKiBnaXZlbiBSb3BlIHNlZ21lbnQgdG90YWwuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjcmVzaXplQXJyYXlzXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbmV3U2l6ZSAtIFRoZSBhbW91bnQgb2Ygc2VnbWVudHMgdG8gc3BsaXQgdGhlIFJvcGUgaW4gdG8uXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZUFycmF5czogZnVuY3Rpb24gKG5ld1NpemUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzO1xyXG4gICAgICAgIHZhciBhbHBoYXMgPSB0aGlzLmFscGhhcztcclxuXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkobmV3U2l6ZSAqIDQpO1xyXG4gICAgICAgIHRoaXMudXYgPSBuZXcgRmxvYXQzMkFycmF5KG5ld1NpemUgKiA0KTtcclxuXHJcbiAgICAgICAgY29sb3JzID0gbmV3IFVpbnQzMkFycmF5KG5ld1NpemUgKiAyKTtcclxuICAgICAgICBhbHBoYXMgPSBuZXcgRmxvYXQzMkFycmF5KG5ld1NpemUgKiAyKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdTaXplICogMjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29sb3JzW2ldID0gMHhmZmZmZmY7XHJcbiAgICAgICAgICAgIGFscGhhc1tpXSA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9ycztcclxuICAgICAgICB0aGlzLmFscGhhcyA9IGFscGhhcztcclxuXHJcbiAgICAgICAgLy8gIHVwZGF0ZVZlcnRpY2VzIGR1cmluZyBuZXh0IHJlbmRlclxyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB2ZXJ0aWNlcyBiYXNlZCBvbiB0aGUgUm9wZSBwb2ludHMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyByZW5kZXJpbmcgaWYgYFJvcGUuZGlydHlgIGlzIGB0cnVlYCwgd2hpY2ggaXMgc2V0XHJcbiAgICAgKiBieSB0aGUgYHNldFBvaW50c2AgYW5kIGBzZXREaXJ0eWAgbWV0aG9kcy4gWW91IHNob3VsZCBmbGFnIHRoZSBSb3BlIGFzIGJlaW5nIGRpcnR5IGlmIHlvdSBtb2RpZnlcclxuICAgICAqIHRoZSBSb3BlIHBvaW50cyBkaXJlY3RseS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSN1cGRhdGVWZXJ0aWNlc1xyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWZXJ0aWNlczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcGVycCA9IHRoaXMuX3BlcnA7XHJcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xyXG4gICAgICAgIHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcblxyXG4gICAgICAgIHZhciB0b3RhbCA9IHBvaW50cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRvdGFsIDwgMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBuZXh0UG9pbnQ7XHJcbiAgICAgICAgdmFyIGxhc3RQb2ludCA9IHBvaW50c1swXTtcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lU2l6ZSA9ICh0aGlzLmhvcml6b250YWwpID8gdGhpcy5mcmFtZS5oYWxmSGVpZ2h0IDogdGhpcy5mcmFtZS5oYWxmV2lkdGg7XHJcbiAgIFxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWw7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIDQ7XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKGkgPCB0b3RhbCAtIDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHRQb2ludCA9IHBvaW50c1tpICsgMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZXh0UG9pbnQgPSBwb2ludDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcGVycC54ID0gbmV4dFBvaW50LnkgLSBsYXN0UG9pbnQueTtcclxuICAgICAgICAgICAgcGVycC55ID0gLShuZXh0UG9pbnQueCAtIGxhc3RQb2ludC54KTtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgcGVycExlbmd0aCA9IHBlcnAubGVuZ3RoKCk7XHJcblxyXG4gICAgICAgICAgICBwZXJwLnggLz0gcGVycExlbmd0aDtcclxuICAgICAgICAgICAgcGVycC55IC89IHBlcnBMZW5ndGg7XHJcbiAgICBcclxuICAgICAgICAgICAgcGVycC54ICo9IGZyYW1lU2l6ZTtcclxuICAgICAgICAgICAgcGVycC55ICo9IGZyYW1lU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIHZlcnRpY2VzW2luZGV4XSA9IHBvaW50LnggKyBwZXJwLng7XHJcbiAgICAgICAgICAgIHZlcnRpY2VzW2luZGV4ICsgMV0gPSBwb2ludC55ICsgcGVycC55O1xyXG4gICAgICAgICAgICB2ZXJ0aWNlc1tpbmRleCArIDJdID0gcG9pbnQueCAtIHBlcnAueDtcclxuICAgICAgICAgICAgdmVydGljZXNbaW5kZXggKyAzXSA9IHBvaW50LnkgLSBwZXJwLnk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGFzdFBvaW50ID0gcG9pbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIHJlbmRlcmluZyBvZiB0aGUgUm9wZSB2ZXJ0aWNlcyB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBlbmFibGUgdGhpcyBmZWF0dXJlLCB5b3UgbXVzdCBjYWxsIGBHcmFwaGljcy5jbGVhcigpYCBpbiB5b3VyIFNjZW5lIGB1cGRhdGVgLFxyXG4gICAgICogb3RoZXJ3aXNlIHRoZSBHcmFwaGljcyBpbnN0YW5jZSB3aWxsIGZpbGwtaW4gd2l0aCBkcmF3IGNhbGxzLiBUaGlzIGlzIG5vdCBkb25lIGF1dG9tYXRpY2FsbHlcclxuICAgICAqIHRvIGFsbG93IGZvciB5b3UgdG8gZGVidWcgcmVuZGVyIG11bHRpcGxlIFJvcGUgb2JqZWN0cyB0byBhIHNpbmdsZSBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIFJvcGUgY2xhc3MgaGFzIGEgYnVpbHQtaW4gZGVidWcgcmVuZGVyaW5nIGNhbGxiYWNrIGBSb3BlLnJlbmRlckRlYnVnVmVydHNgLCBob3dldmVyXHJcbiAgICAgKiB5b3UgY2FuIGFsc28gcHJvdmlkZSB5b3VyIG93biBjYWxsYmFjayB0byBiZSB1c2VkIGluc3RlYWQuIERvIHRoaXMgYnkgc2V0dGluZyB0aGUgYGNhbGxiYWNrYCBwYXJhbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIF9vbmNlIHBlciByZW5kZXJfIGFuZCBzZW50IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcclxuICAgICAqIFxyXG4gICAgICogYGNhbGxiYWNrKHNyYywgbWVzaExlbmd0aCwgdmVydHMpYFxyXG4gICAgICogXHJcbiAgICAgKiBgc3JjYCBpcyB0aGUgUm9wZSBpbnN0YW5jZSBiZWluZyBkZWJ1Z2dlZC5cclxuICAgICAqIGBtZXNoTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIG1lc2ggdmVydGljZXMgaW4gdG90YWwuXHJcbiAgICAgKiBgdmVydHNgIGlzIGFuIGFycmF5IG9mIHRoZSB0cmFuc2xhdGVkIHZlcnRleCBjb29yZGluYXRlcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgdXNpbmcgeW91ciBvd24gY2FsbGJhY2sgeW91IGRvIG5vdCBoYXZlIHRvIHByb3ZpZGUgYSBHcmFwaGljcyBpbnN0YW5jZSB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqIFxyXG4gICAgICogVG8gZGlzYWJsZSBkZWJ1ZyByZW5kZXJpbmcsIHRvIGVpdGhlciB5b3VyIG93biBjYWxsYmFjayBvciB0aGUgYnVpbHQtaW4gb25lLCBjYWxsIHRoaXMgbWV0aG9kXHJcbiAgICAgKiB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNzZXREZWJ1Z1xyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gW2dyYXBoaWNdIC0gVGhlIEdyYXBoaWMgaW5zdGFuY2UgdG8gcmVuZGVyIHRvIGlmIHVzaW5nIHRoZSBidWlsdC1pbiBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGR1cmluZyBkZWJ1ZyByZW5kZXIuIExlYXZlIGFzIHVuZGVmaW5lZCB0byB1c2UgdGhlIGJ1aWx0LWluIGNhbGxiYWNrLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXREZWJ1ZzogZnVuY3Rpb24gKGdyYXBoaWMsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGVidWdHcmFwaGljID0gZ3JhcGhpYztcclxuXHJcbiAgICAgICAgaWYgKCFncmFwaGljICYmICFjYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVidWdDYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFjYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVidWdDYWxsYmFjayA9IHRoaXMucmVuZGVyRGVidWdWZXJ0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kZWJ1Z0NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYnVpbHQtaW4gUm9wZSB2ZXJ0aWNlcyBkZWJ1ZyByZW5kZXJpbmcgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBTZWUgYFJvcGUuc2V0RGVidWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNyZW5kZXJEZWJ1Z1ZlcnRzXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlJvcGV9IHNyYyAtIFRoZSBSb3BlIG9iamVjdCBiZWluZyByZW5kZXJlZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWVzaExlbmd0aCAtIFRoZSBudW1iZXIgb2YgdmVydGljZXMgaW4gdGhlIG1lc2guXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSB2ZXJ0cyAtIEFuIGFycmF5IG9mIHRyYW5zbGF0ZWQgdmVydGV4IGNvb3JkaW5hdGVzLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJEZWJ1Z1ZlcnRzOiBmdW5jdGlvbiAoc3JjLCBtZXNoTGVuZ3RoLCB2ZXJ0cylcclxuICAgIHtcclxuICAgICAgICB2YXIgZ3JhcGhpYyA9IHNyYy5kZWJ1Z0dyYXBoaWM7XHJcblxyXG4gICAgICAgIHZhciBweDAgPSB2ZXJ0c1swXTtcclxuICAgICAgICB2YXIgcHkwID0gdmVydHNbMV07XHJcbiAgICAgICAgdmFyIHB4MSA9IHZlcnRzWzJdO1xyXG4gICAgICAgIHZhciBweTEgPSB2ZXJ0c1szXTtcclxuXHJcbiAgICAgICAgZ3JhcGhpYy5saW5lQmV0d2VlbihweDAsIHB5MCwgcHgxLCBweTEpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gNDsgaSA8IG1lc2hMZW5ndGg7IGkgKz0gNClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB4MCA9IHZlcnRzW2kgKyAwXTtcclxuICAgICAgICAgICAgdmFyIHkwID0gdmVydHNbaSArIDFdO1xyXG4gICAgICAgICAgICB2YXIgeDEgPSB2ZXJ0c1tpICsgMl07XHJcbiAgICAgICAgICAgIHZhciB5MSA9IHZlcnRzW2kgKyAzXTtcclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4ocHgwLCBweTAsIHgwLCB5MCk7XHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4ocHgxLCBweTEsIHgxLCB5MSk7XHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4ocHgxLCBweTEsIHgwLCB5MCk7XHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4oeDAsIHkwLCB4MSwgeTEpO1xyXG5cclxuICAgICAgICAgICAgcHgwID0geDA7XHJcbiAgICAgICAgICAgIHB5MCA9IHkwO1xyXG4gICAgICAgICAgICBweDEgPSB4MTtcclxuICAgICAgICAgICAgcHkxID0geTE7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIHByZS1kZXN0cm95IHN0ZXAgZm9yIHRoZSBSb3BlLCB3aGljaCByZW1vdmVzIHRoZSBBbmltYXRpb24gY29tcG9uZW50IGFuZCB0eXBlZCBhcnJheXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNwcmVEZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5pbXMuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFuaW1zID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLnBvaW50cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy51diA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWxwaGFzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0NhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB0aGlzLmRlYnVnR3JhcGhpYyA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhvcml6b250YWxseSBmbGlwcGVkIHN0YXRlIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQSBHYW1lIE9iamVjdCB0aGF0IGlzIGZsaXBwZWQgaG9yaXpvbnRhbGx5IHdpbGwgcmVuZGVyIGludmVyc2VkIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuXHJcbiAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjZmxpcFhcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgZmxpcFg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZsaXBYO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZmxpcFggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVVWcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZlcnRpY2FsbHkgZmxpcHBlZCBzdGF0ZSBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEEgR2FtZSBPYmplY3QgdGhhdCBpcyBmbGlwcGVkIHZlcnRpY2FsbHkgd2lsbCByZW5kZXIgaW52ZXJzZWQgb24gdGhlIHZlcnRpY2FsIGF4aXMgKGkuZS4gdXBzaWRlIGRvd24pXHJcbiAgICAgKiBGbGlwcGluZyBhbHdheXMgdGFrZXMgcGxhY2UgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0dXJlIGFuZCBkb2VzIG5vdCBpbXBhY3QgdGhlIHNjYWxlIHZhbHVlLlxyXG4gICAgICogSWYgdGhpcyBHYW1lIE9iamVjdCBoYXMgYSBwaHlzaWNzIGJvZHksIGl0IHdpbGwgbm90IGNoYW5nZSB0aGUgYm9keS4gVGhpcyBpcyBhIHJlbmRlcmluZyB0b2dnbGUgb25seS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlJvcGUjZmxpcFlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgZmxpcFk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZsaXBZO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZmxpcFkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVVWcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm9wZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gZm9yIFJvcGUuUmVuZGVyLiBUaGVyZSBpcyBubyBDYW52YXMgcmVuZGVyZXIgZm9yIFJvcGUgb2JqZWN0cy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUm9wZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMjMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUm9wZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIFJvcGVDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uICgpXHJcbntcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm9wZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIFJvcGUgPSByZXF1aXJlKCcuL1JvcGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFJvcGUgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFJvcGUgR2FtZSBPYmplY3QgYW5kIFdlYkdMIHN1cHBvcnQgaGF2ZSBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciNyb3BlXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuUm9wZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3Rlcigncm9wZScsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciBrZXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2tleScsIG51bGwpO1xyXG4gICAgdmFyIGZyYW1lID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdmcmFtZScsIG51bGwpO1xyXG4gICAgdmFyIGhvcml6b250YWwgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2hvcml6b250YWwnLCB0cnVlKTtcclxuICAgIHZhciBwb2ludHMgPSBHZXRWYWx1ZShjb25maWcsICdwb2ludHMnLCB1bmRlZmluZWQpO1xyXG4gICAgdmFyIGNvbG9ycyA9IEdldFZhbHVlKGNvbmZpZywgJ2NvbG9ycycsIHVuZGVmaW5lZCk7XHJcbiAgICB2YXIgYWxwaGFzID0gR2V0VmFsdWUoY29uZmlnLCAnYWxwaGFzJywgdW5kZWZpbmVkKTtcclxuXHJcbiAgICB2YXIgcm9wZSA9IG5ldyBSb3BlKHRoaXMuc2NlbmUsIDAsIDAsIGtleSwgZnJhbWUsIHBvaW50cywgaG9yaXpvbnRhbCwgY29sb3JzLCBhbHBoYXMpO1xyXG5cclxuICAgIGlmIChhZGRUb1NjZW5lICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgY29uZmlnLmFkZCA9IGFkZFRvU2NlbmU7XHJcbiAgICB9XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0KHRoaXMuc2NlbmUsIHJvcGUsIGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHJvcGU7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RDcmVhdG9yIGNvbnRleHQuXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvcGUgPSByZXF1aXJlKCcuL1JvcGUnKTtcclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFJvcGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBSb3BlIEdhbWUgT2JqZWN0IGFuZCBXZWJHTCBzdXBwb3J0IGhhdmUgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3Rvcnkjcm9wZVxyXG4gKiBAd2ViZ2xPbmx5XHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlW119IFtwb2ludHNdIC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmVydGljZXMgZGF0YSBmb3IgdGhpcyBSb3BlLiBJZiBub25lIGlzIHByb3ZpZGVkIGEgc2ltcGxlIHF1YWQgaXMgY3JlYXRlZC4gU2VlIGBzZXRQb2ludHNgIHRvIHNldCB0aGlzIHBvc3QtY3JlYXRpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hvcml6b250YWw9dHJ1ZV0gLSBTaG91bGQgdGhlIHZlcnRpY2VzIG9mIHRoaXMgUm9wZSBiZSBhbGlnbmVkIGhvcml6b250YWxseSAoYHRydWVgKSwgb3IgdmVydGljYWxseSAoYGZhbHNlYCk/XHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IFtjb2xvcnNdIC0gQW4gb3B0aW9uYWwgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgZGF0YSBmb3IgdGhpcyBSb3BlLiBZb3Ugc2hvdWxkIHByb3ZpZGUgb25lIGNvbG9yIHZhbHVlIHBlciBwYWlyIG9mIHZlcnRpY2VzLlxyXG4gKiBAcGFyYW0ge251bWJlcltdfSBbYWxwaGFzXSAtIEFuIG9wdGlvbmFsIGFycmF5IGNvbnRhaW5pbmcgdGhlIGFscGhhIGRhdGEgZm9yIHRoaXMgUm9wZS4gWW91IHNob3VsZCBwcm92aWRlIG9uZSBhbHBoYSB2YWx1ZSBwZXIgcGFpciBvZiB2ZXJ0aWNlcy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlJvcGV9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3JvcGUnLCBmdW5jdGlvbiAoeCwgeSwgdGV4dHVyZSwgZnJhbWUsIHBvaW50cywgaG9yaXpvbnRhbCwgY29sb3JzLCBhbHBoYXMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJvcGUgPSBuZXcgUm9wZSh0aGlzLnNjZW5lLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSwgcG9pbnRzLCBob3Jpem9udGFsLCBjb2xvcnMsIGFscGhhcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheUxpc3QuYWRkKHJvcGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVMaXN0LmFkZChyb3BlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9Sb3BlV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9Sb3BlQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Sb3BlI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlJvcGV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBSb3BlV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHNyYy5waXBlbGluZTtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSwgc3JjKTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNwcml0ZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNyYy55O1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc3ByaXRlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBzcHJpdGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGZyYW1lID0gc3JjLmZyYW1lO1xyXG4gICAgdmFyIHRleHR1cmUgPSBmcmFtZS5nbFRleHR1cmU7XHJcblxyXG4gICAgdmFyIHZlcnRpY2VzID0gc3JjLnZlcnRpY2VzO1xyXG4gICAgdmFyIHV2cyA9IHNyYy51djtcclxuICAgIHZhciBjb2xvcnMgPSBzcmMuY29sb3JzO1xyXG4gICAgdmFyIGFscGhhcyA9IHNyYy5hbHBoYXM7XHJcbiAgICB2YXIgYWxwaGEgPSBzcmMuYWxwaGE7XHJcbiAgICB2YXIgZ2V0VGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcDtcclxuICAgIHZhciByb3VuZFBpeGVscyA9IGNhbWVyYS5yb3VuZFBpeGVscztcclxuXHJcbiAgICB2YXIgbWVzaFZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xyXG4gICAgdmFyIHZlcnRleENvdW50ID0gTWF0aC5mbG9vcihtZXNoVmVydGljZXNMZW5ndGggKiAwLjUpO1xyXG5cclxuICAgIC8vICBCZWNhdXNlIGl0J3MgYSB0cmlhbmdsZSBzdHJpcCBhbmQgd2UgZG9uJ3Qgd2FudCBsb3RzIG9mIGRlZ2VuZXJhdGUgdHJpYW5nbGVzIGpvaW5pbmcgdGhpbmdzIHVwXHJcbiAgICBwaXBlbGluZS5mbHVzaCgpO1xyXG5cclxuICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCh0ZXh0dXJlLCAwKTtcclxuXHJcbiAgICB2YXIgdmVydGV4Vmlld0YzMiA9IHBpcGVsaW5lLnZlcnRleFZpZXdGMzI7XHJcbiAgICB2YXIgdmVydGV4Vmlld1UzMiA9IHBpcGVsaW5lLnZlcnRleFZpZXdVMzI7XHJcblxyXG4gICAgdmFyIHZlcnRleE9mZnNldCA9IChwaXBlbGluZS52ZXJ0ZXhDb3VudCAqIHBpcGVsaW5lLnZlcnRleENvbXBvbmVudENvdW50KSAtIDE7XHJcblxyXG4gICAgdmFyIGNvbG9ySW5kZXggPSAwO1xyXG5cclxuICAgIHZhciB0aW50RWZmZWN0ID0gc3JjLnRpbnRGaWxsO1xyXG5cclxuICAgIGlmIChzcmMuZGlydHkpXHJcbiAgICB7XHJcbiAgICAgICAgc3JjLnVwZGF0ZVZlcnRpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGRlYnVnQ2FsbGJhY2sgPSBzcmMuZGVidWdDYWxsYmFjaztcclxuICAgIHZhciBkZWJ1Z1ZlcnRzID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXNoVmVydGljZXNMZW5ndGg7IGkgKz0gMilcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHZlcnRpY2VzW2kgKyAwXTtcclxuICAgICAgICB2YXIgeSA9IHZlcnRpY2VzW2kgKyAxXTtcclxuXHJcbiAgICAgICAgdmFyIHR4ID0geCAqIGNhbGNNYXRyaXguYSArIHkgKiBjYWxjTWF0cml4LmMgKyBjYWxjTWF0cml4LmU7XHJcbiAgICAgICAgdmFyIHR5ID0geCAqIGNhbGNNYXRyaXguYiArIHkgKiBjYWxjTWF0cml4LmQgKyBjYWxjTWF0cml4LmY7XHJcblxyXG4gICAgICAgIGlmIChyb3VuZFBpeGVscylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR4ID0gTWF0aC5yb3VuZCh0eCk7XHJcbiAgICAgICAgICAgIHR5ID0gTWF0aC5yb3VuZCh0eSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHR4O1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdHk7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB1dnNbaSArIDBdO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdXZzW2kgKyAxXTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRFZmZlY3Q7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZlcnRleE9mZnNldF0gPSBnZXRUaW50KGNvbG9yc1tjb2xvckluZGV4XSwgY2FtZXJhLmFscGhhICogKGFscGhhc1tjb2xvckluZGV4XSAqIGFscGhhKSk7XHJcblxyXG4gICAgICAgIGNvbG9ySW5kZXgrKztcclxuXHJcbiAgICAgICAgaWYgKGRlYnVnQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWJ1Z1ZlcnRzW2kgKyAwXSA9IHR4O1xyXG4gICAgICAgICAgICBkZWJ1Z1ZlcnRzW2kgKyAxXSA9IHR5O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGVidWdDYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBkZWJ1Z0NhbGxiYWNrLmNhbGwoc3JjLCBzcmMsIG1lc2hWZXJ0aWNlc0xlbmd0aCwgZGVidWdWZXJ0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcGlwZWxpbmUudmVydGV4Q291bnQgKz0gdmVydGV4Q291bnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJvcGVXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxudmFyIFNldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L1NldFZhbHVlJyk7XHJcbnZhciBTaGFkZXJSZW5kZXIgPSByZXF1aXJlKCcuL1NoYWRlclJlbmRlcicpO1xyXG52YXIgVHJhbnNmb3JtTWF0cml4ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9UcmFuc2Zvcm1NYXRyaXgnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgU2hhZGVyIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogVGhpcyBHYW1lIE9iamVjdCBhbGxvd3MgeW91IHRvIGVhc2lseSBhZGQgYSBxdWFkIHdpdGggaXRzIG93biBzaGFkZXIgaW50byB0aGUgZGlzcGxheSBsaXN0LCBhbmQgbWFuaXB1bGF0ZSBpdFxyXG4gKiBhcyB5b3Ugd291bGQgYW55IG90aGVyIEdhbWUgT2JqZWN0LCBpbmNsdWRpbmcgc2NhbGluZywgcm90YXRpbmcsIHBvc2l0aW9uaW5nIGFuZCBhZGRpbmcgdG8gQ29udGFpbmVycy4gU2hhZGVyc1xyXG4gKiBjYW4gYmUgbWFza2VkIHdpdGggZWl0aGVyIEJpdG1hcCBvciBHZW9tZXRyeSBtYXNrcyBhbmQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIEJpdG1hcCBNYXNrIGZvciBhIENhbWVyYSBvciBvdGhlclxyXG4gKiBHYW1lIE9iamVjdC4gVGhleSBjYW4gYWxzbyBiZSBtYWRlIGludGVyYWN0aXZlIGFuZCB1c2VkIGZvciBpbnB1dCBldmVudHMuXHJcbiAqIFxyXG4gKiBJdCB3b3JrcyBieSB0YWtpbmcgYSByZWZlcmVuY2UgdG8gYSBgUGhhc2VyLkRpc3BsYXkuQmFzZVNoYWRlcmAgaW5zdGFuY2UsIGFzIGZvdW5kIGluIHRoZSBTaGFkZXIgQ2FjaGUuIFRoZXNlIGNhblxyXG4gKiBiZSBjcmVhdGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUsIG9yIGxvYWRlZCBpbiB2aWEgdGhlIEdMU0wgRmlsZSBMb2FkZXI6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmdsc2woJ2ZpcmUnLCAnc2hhZGVycy9maXJlLmdsc2wuanMnKTtcclxuICogfVxyXG4gKiAgXHJcbiAqIGZ1bmN0aW9uIGNyZWF0ZSAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmFkZC5zaGFkZXIoJ2ZpcmUnLCA0MDAsIDMwMCwgNTEyLCA1MTIpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKiBcclxuICogUGxlYXNlIHNlZSB0aGUgUGhhc2VyIDMgRXhhbXBsZXMgR2l0SHViIHJlcG8gZm9yIGV4YW1wbGVzIG9mIGxvYWRpbmcgYW5kIGNyZWF0aW5nIHNoYWRlcnMgZHluYW1pY2FsbHkuXHJcbiAqIFxyXG4gKiBEdWUgdG8gdGhlIHdheSBpbiB3aGljaCB0aGV5IHdvcmssIHlvdSBjYW5ub3QgZGlyZWN0bHkgY2hhbmdlIHRoZSBhbHBoYSBvciBibGVuZCBtb2RlIG9mIGEgU2hhZGVyLiBUaGlzIHNob3VsZFxyXG4gKiBiZSBoYW5kbGVkIHZpYSBleHBvc2VkIHVuaWZvcm1zIGluIHRoZSBzaGFkZXIgY29kZSBpdHNlbGYuXHJcbiAqIFxyXG4gKiBCeSBkZWZhdWx0IGEgU2hhZGVyIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgc3RhbmRhcmQgc2V0IG9mIHVuaWZvcm1zLiBUaGVzZSB3ZXJlIGFkZGVkIHRvIG1hdGNoIHRob3NlXHJcbiAqIGZvdW5kIG9uIHNpdGVzIHN1Y2ggYXMgU2hhZGVyVG95IG9yIEdMU0xTYW5kYm94LCBhbmQgcHJvdmlkZSBjb21tb24gZnVuY3Rpb25hbGl0eSBhIHNoYWRlciBtYXkgbmVlZCxcclxuICogc3VjaCBhcyB0aGUgdGltZXN0YW1wLCByZXNvbHV0aW9uIG9yIHBvaW50ZXIgcG9zaXRpb24uIFlvdSBjYW4gcmVwbGFjZSB0aGVtIGJ5IHNwZWNpZnlpbmcgeW91ciBvd24gdW5pZm9ybXNcclxuICogaW4gdGhlIEJhc2UgU2hhZGVyLlxyXG4gKiBcclxuICogVGhlc2UgU2hhZGVycyB3b3JrIGJ5IGhhbHRpbmcgdGhlIGN1cnJlbnQgcGlwZWxpbmUgZHVyaW5nIHJlbmRlcmluZywgY3JlYXRpbmcgYSB2aWV3cG9ydCBtYXRjaGVkIHRvIHRoZVxyXG4gKiBzaXplIG9mIHRoaXMgR2FtZSBPYmplY3QgYW5kIHRoZW4gcmVuZGVycyBhIHF1YWQgdXNpbmcgdGhlIGJvdW5kIHNoYWRlci4gQXQgdGhlIGVuZCwgdGhlIHBpcGVsaW5lIGlzIHJlc3RvcmVkLlxyXG4gKiBcclxuICogQmVjYXVzZSBpdCBibG9ja3MgdGhlIHBpcGVsaW5lIGl0IG1lYW5zIGl0IHdpbGwgaW50ZXJydXB0IGFueSBiYXRjaGluZyB0aGF0IGlzIGN1cnJlbnRseSBnb2luZyBvbiwgc28geW91IHNob3VsZFxyXG4gKiB1c2UgdGhlc2UgR2FtZSBPYmplY3RzIHNwYXJpbmdseS4gSWYgeW91IG5lZWQgdG8gaGF2ZSBhIGZ1bGx5IGJhdGNoZWQgY3VzdG9tIHNoYWRlciwgdGhlbiBwbGVhc2UgbG9vayBhdCB1c2luZ1xyXG4gKiBhIGN1c3RvbSBwaXBlbGluZSBpbnN0ZWFkLiBIb3dldmVyLCBmb3IgYmFja2dyb3VuZCBvciBzcGVjaWFsIG1hc2tpbmcgZWZmZWN0cywgdGhleSBhcmUgZXh0cmVtZWx5IGVmZmVjdGl2ZS5cclxuICogXHJcbiAqIEBjbGFzcyBTaGFkZXJcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHdlYmdsT25seVxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNvbXB1dGVkU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuRGlzcGxheS5CYXNlU2hhZGVyKX0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc2hhZGVyIHRvIHVzZSBmcm9tIHRoZSBzaGFkZXIgY2FjaGUsIG9yIGEgQmFzZVNoYWRlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xMjhdIC0gVGhlIHdpZHRoIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbdGV4dHVyZXNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgdGV4dHVyZSBrZXlzIHRvIGJpbmQgdG8gdGhlIGlDaGFubmVsMC4uLjMgdW5pZm9ybXMuIFRoZSB0ZXh0dXJlcyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHthbnl9IFt0ZXh0dXJlRGF0YV0gLSBBZGRpdGlvbmFsIHRleHR1cmUgZGF0YSBpZiB5b3Ugd2FudCB0byBjcmVhdGUgc2hhZGVyIHdpdGggbm9uZSBOUE9UIHRleHR1cmVzLlxyXG4gKi9cclxudmFyIFNoYWRlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkNvbXB1dGVkU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLkRlcHRoLFxyXG4gICAgICAgIENvbXBvbmVudHMuR2V0Qm91bmRzLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlNjcm9sbEZhY3RvcixcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgU2hhZGVyUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2hhZGVyIChzY2VuZSwga2V5LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0dXJlcywgdGV4dHVyZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDEyODsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSAxMjg7IH1cclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnU2hhZGVyJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgR2FtZSBPYmplY3QgY2Fubm90IGhhdmUgYSBibGVuZCBtb2RlLCBzbyBza2lwIGFsbCBjaGVja3MuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNibGVuZE1vZGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJsZW5kTW9kZSA9IC0xO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdW5kZXJseWluZyBzaGFkZXIgb2JqZWN0IGJlaW5nIHVzZWQuXHJcbiAgICAgICAgICogRW1wdHkgYnkgZGVmYXVsdCBhbmQgc2V0IGR1cmluZyBhIGNhbGwgdG8gdGhlIGBzZXRTaGFkZXJgIG1ldGhvZC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3NoYWRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRGlzcGxheS5CYXNlU2hhZGVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNoYWRlcjtcclxuXHJcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gc2NlbmUuc3lzLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZW5kZXJlci5cclxuICAgICAgICAgKiBTaGFkZXJzIG9ubHkgd29yayB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgV2ViR0wgY29udGV4dCBiZWxvbmdpbmcgdG8gdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNnbFxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2wgPSByZW5kZXJlci5nbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmF3IGJ5dGUgYnVmZmVyIG9mIHZlcnRpY2VzIHRoaXMgU2hhZGVyIHVzZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3ZlcnRleERhdGFcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXlCdWZmZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4RGF0YSA9IG5ldyBBcnJheUJ1ZmZlcig2ICogKEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDIpKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFdlYkdMIHZlcnRleCBidWZmZXIgb2JqZWN0IHRoaXMgc2hhZGVyIHVzZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3ZlcnRleEJ1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTEJ1ZmZlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSByZW5kZXJlci5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy52ZXJ0ZXhEYXRhLmJ5dGVMZW5ndGgsIHRoaXMuZ2wuU1RSRUFNX0RSQVcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgV2ViR0wgc2hhZGVyIHByb2dyYW0gdGhpcyBzaGFkZXIgdXNlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjcHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFByb2dyYW19XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVpbnQ4IHZpZXcgdG8gdGhlIHZlcnRleCByYXcgYnVmZmVyLiBVc2VkIGZvciB1cGxvYWRpbmcgdmVydGV4IGJ1ZmZlciByZXNvdXJjZXMgdG8gdGhlIEdQVS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjYnl0ZXNcclxuICAgICAgICAgKiBAdHlwZSB7VWludDhBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMudmVydGV4RGF0YSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZsb2F0MzIgdmlldyBvZiB0aGUgYXJyYXkgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNoYWRlcnMgdmVydGljZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3ZlcnRleFZpZXdGMzJcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGV4RGF0YSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI190ZW1wTWF0cml4MVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDEgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI190ZW1wTWF0cml4MlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDIgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI190ZW1wTWF0cml4M1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDMgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2aWV3IG1hdHJpeCB0aGUgc2hhZGVyIHVzZXMgZHVyaW5nIHJlbmRlcmluZy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3ZpZXdNYXRyaXhcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KFsgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSBdKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByb2plY3Rpb24gbWF0cml4IHRoZSBzaGFkZXIgdXNlcyBkdXJpbmcgcmVuZGVyaW5nLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjcHJvamVjdGlvbk1hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoWyAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxIF0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVmYXVsdCB1bmlmb3JtIG1hcHBpbmdzLiBUaGVzZSBjYW4gYmUgYWRkZWQgdG8gKG9yIHJlcGxhY2VkKSBieSBzcGVjaWZ5aW5nIHlvdXIgb3duIHVuaWZvcm1zIHdoZW5cclxuICAgICAgICAgKiBjcmVhdGluZyB0aGlzIHNoYWRlciBnYW1lIG9iamVjdC4gVGhlIHVuaWZvcm1zIGFyZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSByZW5kZXIgc3RlcC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgZGVmYXVsdHMgYXJlOlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGByZXNvbHV0aW9uYCAoMmYpIC0gU2V0IHRvIHRoZSBzaXplIG9mIHRoaXMgc2hhZGVyLlxyXG4gICAgICAgICAqIGB0aW1lYCAoMWYpIC0gVGhlIGVsYXBzZWQgZ2FtZSB0aW1lLCBpbiBzZWNvbmRzLlxyXG4gICAgICAgICAqIGBtb3VzZWAgKDJmKSAtIElmIGEgcG9pbnRlciBoYXMgYmVlbiBib3VuZCAod2l0aCBgc2V0UG9pbnRlcmApLCB0aGlzIHVuaWZvcm0gY29udGFpbnMgaXRzIHBvc2l0aW9uIGVhY2ggZnJhbWUuXHJcbiAgICAgICAgICogYGRhdGVgICg0ZnYpIC0gQSB2ZWM0IGNvbnRhaW5pbmcgdGhlIHllYXIsIG1vbnRoLCBkYXkgYW5kIHRpbWUgaW4gc2Vjb25kcy5cclxuICAgICAgICAgKiBgc2FtcGxlUmF0ZWAgKDFmKSAtIFNvdW5kIHNhbXBsZSByYXRlLiA0NDEwMCBieSBkZWZhdWx0LlxyXG4gICAgICAgICAqIGBpQ2hhbm5lbDAuLi4zYCAoc2FtcGxlcjJEKSAtIElucHV0IGNoYW5uZWxzIDAgdG8gMy4gYG51bGxgIGJ5IGRlZmF1bHQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciN1bmlmb3Jtc1xyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBvaW50ZXIgYm91bmQgdG8gdGhpcyBzaGFkZXIsIGlmIGFueS5cclxuICAgICAgICAgKiBTZXQgdmlhIHRoZSBjaGFpbmFibGUgYHNldFBvaW50ZXJgIG1ldGhvZCwgb3IgYnkgbW9kaWZ5aW5nIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNwb2ludGVyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5Qb2ludGVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvaW50ZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FjaGVkIHdpZHRoIG9mIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI19yZW5kZXJlcldpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yZW5kZXJlcldpZHRoID0gcmVuZGVyZXIud2lkdGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWNoZWQgaGVpZ2h0IG9mIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI19yZW5kZXJlckhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXJIZWlnaHQgPSByZW5kZXJlci5oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHRleHR1cmUgY291bnQgdHJhY2tlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI190ZXh0dXJlQ291bnRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RleHR1cmVDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBHTCBGcmFtZSBCdWZmZXIgdGhpcyBTaGFkZXIgaXMgZHJhd2luZyB0by5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgc2V0IGlmIHlvdSBoYXZlIGNhbGxlZCBgU2hhZGVyLnNldFJlbmRlclRvVGV4dHVyZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI2ZyYW1lYnVmZmVyXHJcbiAgICAgICAgICogQHR5cGUgez9XZWJHTEZyYW1lYnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMVGV4dHVyZSB0aGlzIFNoYWRlciBpcyByZW5kZXJpbmcgdG8uXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHNldCBpZiB5b3UgaGF2ZSBjYWxsZWQgYFNoYWRlci5zZXRSZW5kZXJUb1RleHR1cmVgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNnbFRleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7P1dlYkdMVGV4dHVyZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nbFRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhpcyBTaGFkZXIgaGFzIGJlZW4gc2V0IHRvIHJlbmRlciB0byBhIHRleHR1cmUgaW5zdGVhZCBvZiB0aGUgZGlzcGxheSBsaXN0LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYHRydWVgIGlmIHlvdSBoYXZlIGNhbGxlZCBgU2hhZGVyLnNldFJlbmRlclRvVGV4dHVyZWAsIG90aGVyd2lzZSBpdCdzIGBmYWxzZWAuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQSBTaGFkZXIgdGhhdCBpcyByZW5kZXJpbmcgdG8gYSB0ZXh0dXJlIF9kb2VzIG5vdF8gYXBwZWFyIG9uIHRoZSBkaXNwbGF5IGxpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3JlbmRlclRvVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlclRvVGV4dHVyZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmUgdGhhdCBoYXMgYmVlbiBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlciBmb3IgdGhpcyBTaGFkZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHNldCBpZiB5b3UgaGF2ZSBjYWxsZWQgYFNoYWRlci5zZXRSZW5kZXJUb1RleHR1cmVgLCBvdGhlcndpc2UgaXQgaXMgYG51bGxgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciN0ZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnNldE9yaWdpbigwLjUsIDAuNSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaGFkZXIoa2V5LCB0ZXh0dXJlcywgdGV4dHVyZURhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmVzIHRoZSByZW5kZXJNYXNrIHdpdGggdGhlIHJlbmRlckZsYWdzIHRvIHNlZSBpZiB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgcmVuZGVyIG9yIG5vdC5cclxuICAgICAqIEFsc28gY2hlY2tzIHRoZSBHYW1lIE9iamVjdCBhZ2FpbnN0IHRoZSBnaXZlbiBDYW1lcmFzIGV4Y2x1c2lvbiBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciN3aWxsUmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIGNoZWNrIGFnYWluc3QgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBHYW1lIE9iamVjdCBzaG91bGQgYmUgcmVuZGVyZWQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgd2lsbFJlbmRlcjogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJUb1RleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICEoR2FtZU9iamVjdC5SRU5ERVJfTUFTSyAhPT0gdGhpcy5yZW5kZXJGbGFncyB8fCAodGhpcy5jYW1lcmFGaWx0ZXIgIT09IDAgJiYgKHRoaXMuY2FtZXJhRmlsdGVyICYgY2FtZXJhLmlkKSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoaXMgU2hhZGVyIHNvIGluc3RlYWQgb2YgcmVuZGVyaW5nIHRvIHRoZSBkaXNwbGF5IGxpc3QgaXQgcmVuZGVycyB0byBhXHJcbiAgICAgKiBXZWJHTCBGcmFtZWJ1ZmZlciBhbmQgV2ViR0wgVGV4dHVyZSBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBvdXRwdXRcclxuICAgICAqIG9mIHRoaXMgc2hhZGVyIGFzIGFuIGlucHV0IGZvciBhbm90aGVyIHNoYWRlciwgYnkgbWFwcGluZyBhIHNhbXBsZXIyRCB1bmlmb3JtXHJcbiAgICAgKiB0byBpdC5cclxuICAgICAqIFxyXG4gICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCB0aGUgYFNoYWRlci5mcmFtZWJ1ZmZlcmAgYW5kIGBTaGFkZXIuZ2xUZXh0dXJlYCBwcm9wZXJ0aWVzXHJcbiAgICAgKiBhcmUgcG9wdWxhdGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gcHJvdmlkZSBhIGtleSB0byB0aGlzIG1ldGhvZC4gRG9pbmcgc28gd2lsbCBjcmVhdGUgYSBQaGFzZXIgVGV4dHVyZVxyXG4gICAgICogZnJvbSB0aGlzIFNoYWRlciBhbmQgc2F2ZSBpdCBpbnRvIHRoZSBUZXh0dXJlIE1hbmFnZXIsIGFsbG93aW5nIHlvdSB0byB0aGVuIHVzZSBpdCBmb3JcclxuICAgICAqIGFueSB0ZXh0dXJlLWJhc2VkIEdhbWUgT2JqZWN0LCBzdWNoIGFzIGEgU3ByaXRlIG9yIEltYWdlOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB2YXIgc2hhZGVyID0gdGhpcy5hZGQuc2hhZGVyKCdteVNoYWRlcicsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICogXHJcbiAgICAgKiBzaGFkZXIuc2V0UmVuZGVyVG9UZXh0dXJlKCdkb29kbGUnKTtcclxuICAgICAqIFxyXG4gICAgICogdGhpcy5hZGQuaW1hZ2UoNDAwLCAzMDAsICdkb29kbGUnKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgaXQgc3RvcmVzIGFuIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhpcyBTaGFkZXIuIFRoYXQgbWVhbnMgYXMgdGhpcyBzaGFkZXIgdXBkYXRlcyxcclxuICAgICAqIHNvIGRvZXMgdGhlIHRleHR1cmUgYW5kIGFueSBvYmplY3QgdXNpbmcgaXQgdG8gcmVuZGVyIHdpdGguIEFsc28sIGlmIHlvdSBkZXN0cm95IHRoaXNcclxuICAgICAqIHNoYWRlciwgYmUgc3VyZSB0byBjbGVhciBhbnkgb2JqZWN0cyB0aGF0IG1heSBoYXZlIGJlZW4gdXNpbmcgaXQgYXMgYSB0ZXh0dXJlIHRvby5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhY2Nlc3MgdGhlIFBoYXNlciBUZXh0dXJlIHRoYXQgaXMgY3JlYXRlZCB2aWEgdGhlIGBTaGFkZXIudGV4dHVyZWAgcHJvcGVydHkuXHJcbiAgICAgKiBcclxuICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBjcmVhdGUgYSBzaW5nbGUgYmFzZSB0ZXh0dXJlLiBZb3UgY2FuIGFkZCBmcmFtZXMgdG8gdGhlIHRleHR1cmVcclxuICAgICAqIGJ5IHVzaW5nIHRoZSBgVGV4dHVyZS5hZGRgIG1ldGhvZC4gQWZ0ZXIgZG9pbmcgdGhpcywgeW91IGNhbiB0aGVuIGFsbG93IEdhbWUgT2JqZWN0c1xyXG4gICAgICogdG8gdXNlIGEgc3BlY2lmaWMgZnJhbWUgZnJvbSBhIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRSZW5kZXJUb1RleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgdW5pcXVlIGtleSB0byBzdG9yZSB0aGUgdGV4dHVyZSBhcyB3aXRoaW4gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbGlwWT1mYWxzZV0gLSBEb2VzIHRoaXMgdGV4dHVyZSBuZWVkIHZlcnRpY2FsbHkgZmxpcHBpbmcgYmVmb3JlIHJlbmRlcmluZz8gVGhpcyBzaG91bGQgdXN1YWxseSBiZSBzZXQgdG8gYHRydWVgIGlmIGJlaW5nIGZlZCBmcm9tIGEgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2hhZGVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRSZW5kZXJUb1RleHR1cmU6IGZ1bmN0aW9uIChrZXksIGZsaXBZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmbGlwWSA9PT0gdW5kZWZpbmVkKSB7IGZsaXBZID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlclRvVGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgICAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gcmVuZGVyZXIuY3JlYXRlVGV4dHVyZUZyb21Tb3VyY2UobnVsbCwgd2lkdGgsIGhlaWdodCwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdsVGV4dHVyZS5mbGlwWSA9IGZsaXBZO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mcmFtZWJ1ZmZlciA9IHJlbmRlcmVyLmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHRoaXMuZ2xUZXh0dXJlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlcldpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVySGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJUb1RleHR1cmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcm9qT3J0aG8oMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGtleSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuYWRkR0xUZXh0dXJlKGtleSwgdGhpcy5nbFRleHR1cmUsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQW5kIG5vdyByZW5kZXIgYXQgbGVhc3Qgb25jZSwgc28gb3VyIHRleHR1cmUgaXNuJ3QgYmxhbmsgb24gdGhlIGZpcnN0IHVwZGF0ZVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFkZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGlwZWxpbmUgPSByZW5kZXJlci5jdXJyZW50UGlwZWxpbmU7XHJcblxyXG4gICAgICAgICAgICByZW5kZXJlci5jbGVhclBpcGVsaW5lKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XHJcbiAgICBcclxuICAgICAgICAgICAgcmVuZGVyZXIucmViaW5kUGlwZWxpbmUocGlwZWxpbmUpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGZyYWdtZW50IGFuZCwgb3B0aW9uYWxseSwgdGhlIHZlcnRleCBzaGFkZXIgc291cmNlIGNvZGUgdGhhdCB0aGlzIFNoYWRlciB3aWxsIHVzZS5cclxuICAgICAqIFRoaXMgd2lsbCBpbW1lZGlhdGVseSBkZWxldGUgdGhlIGFjdGl2ZSBzaGFkZXIgcHJvZ3JhbSwgaWYgc2V0LCBhbmQgdGhlbiBjcmVhdGUgYSBuZXcgb25lXHJcbiAgICAgKiB3aXRoIHRoZSBnaXZlbiBzb3VyY2UuIEZpbmFsbHksIHRoZSBzaGFkZXIgdW5pZm9ybXMgYXJlIGluaXRpYWxpemVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRTaGFkZXJcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5EaXNwbGF5LkJhc2VTaGFkZXIpfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBzaGFkZXIgdG8gdXNlIGZyb20gdGhlIHNoYWRlciBjYWNoZSwgb3IgYSBCYXNlU2hhZGVyIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3RleHR1cmVzXSAtIE9wdGlvbmFsIGFycmF5IG9mIHRleHR1cmUga2V5cyB0byBiaW5kIHRvIHRoZSBpQ2hhbm5lbDAuLi4zIHVuaWZvcm1zLiBUaGUgdGV4dHVyZXMgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW3RleHR1cmVEYXRhXSAtIEFkZGl0aW9uYWwgdGV4dHVyZSBkYXRhLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNoYWRlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2hhZGVyOiBmdW5jdGlvbiAoa2V5LCB0ZXh0dXJlcywgdGV4dHVyZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRleHR1cmVzID09PSB1bmRlZmluZWQpIHsgdGV4dHVyZXMgPSBbXTsgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLnNjZW5lLnN5cy5jYWNoZS5zaGFkZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNhY2hlLmhhcyhrZXkpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1NoYWRlciBtaXNzaW5nOiAnICsga2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgdGhpcy5zaGFkZXIgPSBjYWNoZS5nZXQoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zaGFkZXIgPSBrZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb2dyYW0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcHJvZ3JhbSA9IHJlbmRlcmVyLmNyZWF0ZVByb2dyYW0odGhpcy5zaGFkZXIudmVydGV4U3JjLCB0aGlzLnNoYWRlci5mcmFnbWVudFNyYyk7XHJcblxyXG4gICAgICAgIC8vICBUaGUgZGVmYXVsdCB1bmlmb3JtcyBhdmFpbGFibGUgd2l0aGluIHRoZSB2ZXJ0ZXggc2hhZGVyXHJcbiAgICAgICAgcmVuZGVyZXIuc2V0TWF0cml4NChwcm9ncmFtLCAndVZpZXdNYXRyaXgnLCBmYWxzZSwgdGhpcy52aWV3TWF0cml4KTtcclxuICAgICAgICByZW5kZXJlci5zZXRNYXRyaXg0KHByb2dyYW0sICd1UHJvamVjdGlvbk1hdHJpeCcsIGZhbHNlLCB0aGlzLnByb2plY3Rpb25NYXRyaXgpO1xyXG4gICAgICAgIHJlbmRlcmVyLnNldEZsb2F0Mihwcm9ncmFtLCAndVJlc29sdXRpb24nLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XHJcblxyXG4gICAgICAgIHZhciBkID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBkZWZhdWx0IHVuaWZvcm1zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICAgIHZhciBkZWZhdWx0VW5pZm9ybXMgPSB7XHJcbiAgICAgICAgICAgIHJlc29sdXRpb246IHsgdHlwZTogJzJmJywgdmFsdWU6IHsgeDogdGhpcy53aWR0aCwgeTogdGhpcy5oZWlnaHQgfSB9LFxyXG4gICAgICAgICAgICB0aW1lOiB7IHR5cGU6ICcxZicsIHZhbHVlOiAwIH0sXHJcbiAgICAgICAgICAgIG1vdXNlOiB7IHR5cGU6ICcyZicsIHZhbHVlOiB7IHg6IHRoaXMud2lkdGggLyAyLCB5OiB0aGlzLmhlaWdodCAvIDIgfSB9LFxyXG4gICAgICAgICAgICBkYXRlOiB7IHR5cGU6ICc0ZnYnLCB2YWx1ZTogWyBkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCksIGQuZ2V0SG91cnMoKSAqIDYwICogNjAgKyBkLmdldE1pbnV0ZXMoKSAqIDYwICsgZC5nZXRTZWNvbmRzKCkgXSB9LFxyXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB7IHR5cGU6ICcxZicsIHZhbHVlOiA0NDEwMC4wIH0sXHJcbiAgICAgICAgICAgIGlDaGFubmVsMDogeyB0eXBlOiAnc2FtcGxlcjJEJywgdmFsdWU6IG51bGwsIHRleHR1cmVEYXRhOiB7IHJlcGVhdDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIGlDaGFubmVsMTogeyB0eXBlOiAnc2FtcGxlcjJEJywgdmFsdWU6IG51bGwsIHRleHR1cmVEYXRhOiB7IHJlcGVhdDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIGlDaGFubmVsMjogeyB0eXBlOiAnc2FtcGxlcjJEJywgdmFsdWU6IG51bGwsIHRleHR1cmVEYXRhOiB7IHJlcGVhdDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIGlDaGFubmVsMzogeyB0eXBlOiAnc2FtcGxlcjJEJywgdmFsdWU6IG51bGwsIHRleHR1cmVEYXRhOiB7IHJlcGVhdDogdHJ1ZSB9IH1cclxuICAgICAgICB9O1xyXG4gXHJcbiAgICAgICAgaWYgKHRoaXMuc2hhZGVyLnVuaWZvcm1zKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy51bmlmb3JtcyA9IEV4dGVuZCh0cnVlLCB7fSwgdGhpcy5zaGFkZXIudW5pZm9ybXMsIGRlZmF1bHRVbmlmb3Jtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybXMgPSBkZWZhdWx0VW5pZm9ybXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0dXJlc1tpXSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYW1wbGVyMkQoJ2lDaGFubmVsJyArIGksIHRleHR1cmVzW2ldLCBpLCB0ZXh0dXJlRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFVuaWZvcm1zKCk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvak9ydGhvKDAsIHRoaXMuX3JlbmRlcmVyV2lkdGgsIHRoaXMuX3JlbmRlcmVySGVpZ2h0LCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluZHMgYSBQaGFzZXIgUG9pbnRlciBvYmplY3QgdG8gdGhpcyBTaGFkZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBzY3JlZW4gcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgd2lsbCBiZSBzZXQgaW4gdG8gdGhlIHNoYWRlcnMgYG1vdXNlYCB1bmlmb3JtXHJcbiAgICAgKiBhdXRvbWF0aWNhbGx5IGV2ZXJ5IGZyYW1lLiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIHRvIHVuYmluZCB0aGUgcG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjc2V0UG9pbnRlclxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBbcG9pbnRlcl0gLSBUaGUgUG9pbnRlciB0byBiaW5kIHRvIHRoaXMgc2hhZGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNoYWRlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UG9pbnRlcjogZnVuY3Rpb24gKHBvaW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb2ludGVyID0gcG9pbnRlcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIHNoYWRlciB0byB1c2UgYW4gb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4LlxyXG4gICAgICogVGhpcyBtYXRyaXggaXMgc3RvcmVkIGxvY2FsbHkgaW4gdGhlIGBwcm9qZWN0aW9uTWF0cml4YCBwcm9wZXJ0eSxcclxuICAgICAqIGFzIHdlbGwgYXMgYmVpbmcgYm91bmQgdG8gdGhlIGB1UHJvamVjdGlvbk1hdHJpeGAgdW5pZm9ybS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3Byb2pPcnRob1xyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBUaGUgcmlnaHQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIC0gVGhlIGJvdHRvbSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUaGUgdG9wIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwcm9qT3J0aG86IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3ApXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5lYXIgPSAtMTAwMDtcclxuICAgICAgICB2YXIgZmFyID0gMTAwMDtcclxuXHJcbiAgICAgICAgdmFyIGxlZnRSaWdodCA9IDEgLyAobGVmdCAtIHJpZ2h0KTtcclxuICAgICAgICB2YXIgYm90dG9tVG9wID0gMSAvIChib3R0b20gLSB0b3ApO1xyXG4gICAgICAgIHZhciBuZWFyRmFyID0gMSAvIChuZWFyIC0gZmFyKTtcclxuXHJcbiAgICAgICAgdmFyIHBtID0gdGhpcy5wcm9qZWN0aW9uTWF0cml4O1xyXG5cclxuICAgICAgICBwbVswXSA9IC0yICogbGVmdFJpZ2h0O1xyXG4gICAgICAgIHBtWzVdID0gLTIgKiBib3R0b21Ub3A7XHJcbiAgICAgICAgcG1bMTBdID0gMiAqIG5lYXJGYXI7XHJcbiAgICAgICAgcG1bMTJdID0gKGxlZnQgKyByaWdodCkgKiBsZWZ0UmlnaHQ7XHJcbiAgICAgICAgcG1bMTNdID0gKHRvcCArIGJvdHRvbSkgKiBib3R0b21Ub3A7XHJcbiAgICAgICAgcG1bMTRdID0gKGZhciArIG5lYXIpICogbmVhckZhcjtcclxuXHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0TWF0cml4NChwcm9ncmFtLCAndVByb2plY3Rpb25NYXRyaXgnLCBmYWxzZSwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXJXaWR0aCA9IHJpZ2h0O1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVySGVpZ2h0ID0gYm90dG9tO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBVbmlmb3JtcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBHTFNMX0VTIFNwZWNpZmljYXRpb246IGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc3BlY3MvbGF0ZXN0LzEuMC9cclxuICAgIC8vIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xlcy9zcGVjcy8yLjAvR0xTTF9FU19TcGVjaWZpY2F0aW9uXzEuMC4xNy5wZGZcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGFsbCBvZiB0aGUgdW5pZm9ybXMgdGhpcyBzaGFkZXIgdXNlcy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI2luaXRVbmlmb3Jtc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgaW5pdFVuaWZvcm1zOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMucmVuZGVyZXIuZ2xGdW5jTWFwO1xyXG4gICAgICAgIHZhciBwcm9ncmFtID0gdGhpcy5wcm9ncmFtO1xyXG5cclxuICAgICAgICB0aGlzLl90ZXh0dXJlQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy51bmlmb3JtcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1trZXldO1xyXG5cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSB1bmlmb3JtLnR5cGU7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gbWFwW3R5cGVdO1xyXG5cclxuICAgICAgICAgICAgdW5pZm9ybS51bmlmb3JtTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwga2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc2FtcGxlcjJEJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdW5pZm9ybS5nbE1hdHJpeCA9IGRhdGEubWF0cml4O1xyXG4gICAgICAgICAgICAgICAgdW5pZm9ybS5nbFZhbHVlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB1bmlmb3JtLmdsRnVuYyA9IGRhdGEuZnVuYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgc2FtcGxlcjJEIHVuaWZvcm0gb24gdGhpcyBzaGFkZXIgd2hlcmUgdGhlIHNvdXJjZSB0ZXh0dXJlIGlzIGEgV2ViR0xUZXh0dXJlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gZmVlZCB0aGUgb3V0cHV0IGZyb20gb25lIFNoYWRlciBpbnRvIGFub3RoZXI6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGxldCBzaGFkZXIxID0gdGhpcy5hZGQuc2hhZGVyKGJhc2VTaGFkZXIxLCAwLCAwLCA1MTIsIDUxMikuc2V0UmVuZGVyVG9UZXh0dXJlKCk7XHJcbiAgICAgKiBsZXQgc2hhZGVyMiA9IHRoaXMuYWRkLnNoYWRlcihiYXNlU2hhZGVyMiwgMCwgMCwgNTEyLCA1MTIpLnNldFJlbmRlclRvVGV4dHVyZSgnb3V0cHV0Jyk7XHJcbiAgICAgKiBcclxuICAgICAqIHNoYWRlcjEuc2V0U2FtcGxlcjJEQnVmZmVyKCdpQ2hhbm5lbDAnLCBzaGFkZXIyLmdsVGV4dHVyZSwgNTEyLCA1MTIpO1xyXG4gICAgICogc2hhZGVyMi5zZXRTYW1wbGVyMkRCdWZmZXIoJ2lDaGFubmVsMCcsIHNoYWRlcjEuZ2xUZXh0dXJlLCA1MTIsIDUxMik7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogSW4gdGhlIGFib3ZlIGNvZGUsIHRoZSByZXN1bHQgb2YgYmFzZVNoYWRlcjEgaXMgZmVkIGludG8gU2hhZGVyMiBhcyB0aGUgYGlDaGFubmVsMGAgc2FtcGxlcjJEIHVuaWZvcm0uXHJcbiAgICAgKiBUaGUgcmVzdWx0IG9mIGJhc2VTaGFkZXIyIGlzIHRoZW4gZmVkIGJhY2sgaW50byBzaGFkZXIxIGFnYWluLCBjcmVhdGluZyBhIGZlZWRiYWNrIGxvb3AuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHVzZSBhbiBpbWFnZSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgYXMgYSBzYW1wbGVyMkQgaW5wdXQgZm9yIHRoaXMgc2hhZGVyLFxyXG4gICAgICogc2VlIHRoZSBgU2hhZGVyLnNldFNhbXBsZXIyRGAgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjc2V0U2FtcGxlcjJEQnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlmb3JtS2V5IC0gVGhlIGtleSBvZiB0aGUgc2FtcGxlcjJEIHVuaWZvcm0gdG8gYmUgdXBkYXRlZCwgaS5lLiBgaUNoYW5uZWwwYC5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB0ZXh0dXJlIC0gQSBXZWJHTFRleHR1cmUgcmVmZXJlbmNlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RleHR1cmVJbmRleD0wXSAtIFRoZSB0ZXh0dXJlIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHthbnl9IFt0ZXh0dXJlRGF0YV0gLSBBZGRpdGlvbmFsIHRleHR1cmUgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaGFkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNhbXBsZXIyREJ1ZmZlcjogZnVuY3Rpb24gKHVuaWZvcm1LZXksIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIHRleHR1cmVJbmRleCwgdGV4dHVyZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRleHR1cmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHRleHR1cmVJbmRleCA9IDA7IH1cclxuICAgICAgICBpZiAodGV4dHVyZURhdGEgPT09IHVuZGVmaW5lZCkgeyB0ZXh0dXJlRGF0YSA9IHt9OyB9XHJcblxyXG4gICAgICAgIHZhciB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1bmlmb3JtS2V5XTtcclxuXHJcbiAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHRleHR1cmU7XHJcblxyXG4gICAgICAgIHRleHR1cmVEYXRhLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGV4dHVyZURhdGEuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB1bmlmb3JtLnRleHR1cmVEYXRhID0gdGV4dHVyZURhdGE7XHJcblxyXG4gICAgICAgIHRoaXMuX3RleHR1cmVDb3VudCA9IHRleHR1cmVJbmRleDtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0U2FtcGxlcjJEKHVuaWZvcm0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgc2FtcGxlcjJEIHVuaWZvcm0gb24gdGhpcyBzaGFkZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB0ZXh0dXJlS2V5IGdpdmVuIGlzIHRoZSBrZXkgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIGNhY2hlLiBZb3UgY2Fubm90IHVzZSBhIHNpbmdsZSBmcmFtZVxyXG4gICAgICogZnJvbSBhIHRleHR1cmUsIG9ubHkgdGhlIGZ1bGwgaW1hZ2UuIEFsc28sIGxvdHMgb2Ygc2hhZGVycyBleHBlY3QgdGV4dHVyZXMgdG8gYmUgcG93ZXItb2YtdHdvIHNpemVkLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byB1c2UgYW5vdGhlciBTaGFkZXIgYXMgYSBzYW1wbGVyMkQgaW5wdXQgZm9yIHRoaXMgc2hhZGVyLCBzZWUgdGhlIGBTaGFkZXIuc2V0U2FtcGxlcjJEQnVmZmVyYCBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRTYW1wbGVyMkRcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVuaWZvcm1LZXkgLSBUaGUga2V5IG9mIHRoZSBzYW1wbGVyMkQgdW5pZm9ybSB0byBiZSB1cGRhdGVkLCBpLmUuIGBpQ2hhbm5lbDBgLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVLZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci4gTXVzdCBhbHJlYWR5IGJlIGxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RleHR1cmVJbmRleD0wXSAtIFRoZSB0ZXh0dXJlIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHthbnl9IFt0ZXh0dXJlRGF0YV0gLSBBZGRpdGlvbmFsIHRleHR1cmUgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaGFkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNhbXBsZXIyRDogZnVuY3Rpb24gKHVuaWZvcm1LZXksIHRleHR1cmVLZXksIHRleHR1cmVJbmRleCwgdGV4dHVyZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRleHR1cmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHRleHR1cmVJbmRleCA9IDA7IH1cclxuXHJcbiAgICAgICAgdmFyIHRleHR1cmVNYW5hZ2VyID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXM7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0dXJlTWFuYWdlci5leGlzdHModGV4dHVyZUtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZnJhbWUgPSB0ZXh0dXJlTWFuYWdlci5nZXRGcmFtZSh0ZXh0dXJlS2V5KTtcclxuICAgICAgICAgICAgdmFyIHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VuaWZvcm1LZXldO1xyXG4gICAgICAgICAgICB2YXIgc291cmNlID0gZnJhbWUuc291cmNlO1xyXG5cclxuICAgICAgICAgICAgdW5pZm9ybS50ZXh0dXJlS2V5ID0gdGV4dHVyZUtleTtcclxuICAgICAgICAgICAgdW5pZm9ybS5zb3VyY2UgPSBzb3VyY2UuaW1hZ2U7XHJcbiAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSBmcmFtZS5nbFRleHR1cmU7XHJcblxyXG4gICAgICAgICAgICBpZiAoc291cmNlLmlzR0xUZXh0dXJlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRleHR1cmVEYXRhKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVEYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZURhdGEud2lkdGggPSBzb3VyY2Uud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlRGF0YS5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dHVyZURhdGEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHVuaWZvcm0udGV4dHVyZURhdGEgPSB0ZXh0dXJlRGF0YTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZUNvdW50ID0gdGV4dHVyZUluZGV4O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0U2FtcGxlcjJEKHVuaWZvcm0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIHByb3BlcnR5IG9mIGEgdW5pZm9ybSBhbHJlYWR5IHByZXNlbnQgb24gdGhpcyBzaGFkZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRvIG1vZGlmeSB0aGUgdmFsdWUgb2YgYSB1bmlmb3JtIHN1Y2ggYXMgYSAxZiBvciAxaSB1c2UgdGhlIGB2YWx1ZWAgcHJvcGVydHkgZGlyZWN0bHk6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHNoYWRlci5zZXRVbmlmb3JtKCdzaXplLnZhbHVlJywgMTYpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gdXNlIGRvdCBub3RhdGlvbiB0byBhY2Nlc3MgZGVlcGVyIHZhbHVlcywgZm9yIGV4YW1wbGU6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHNoYWRlci5zZXRVbmlmb3JtKCdyZXNvbHV0aW9uLnZhbHVlLngnLCA1MTIpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjaGFuZ2UgdG8gdGhlIHVuaWZvcm0gd2lsbCB0YWtlIGVmZmVjdCB0aGUgbmV4dCB0aW1lIHRoZSBzaGFkZXIgaXMgcmVuZGVyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRVbmlmb3JtXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB1bmlmb3JtIHRvIG1vZGlmeS4gVXNlIGRvdHMgZm9yIGRlZXAgcHJvcGVydGllcywgaS5lLiBgcmVzb2x1dGlvbi52YWx1ZS54YC5cclxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgaW50byB0aGUgdW5pZm9ybS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaGFkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFVuaWZvcm06IGZ1bmN0aW9uIChrZXksIHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIFNldFZhbHVlKHRoaXMudW5pZm9ybXMsIGtleSwgdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmlmb3JtIG9iamVjdCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgYG51bGxgIGlmIHRoZSB1bmlmb3JtIGNvdWxkbid0IGJlIGZvdW5kLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjZ2V0VW5pZm9ybVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgdW5pZm9ybSB0byByZXR1cm4gdGhlIHZhbHVlIGZvci5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7YW55fSBBIHJlZmVyZW5jZSB0byB0aGUgdW5pZm9ybSBvYmplY3QuIFRoaXMgaXMgbm90IGEgY29weSwgc28gbW9kaWZ5aW5nIGl0IHdpbGwgdXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3QgYWxzby5cclxuICAgICAqL1xyXG4gICAgZ2V0VW5pZm9ybTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0RmFzdFZhbHVlKHRoaXMudW5pZm9ybXMsIGtleSwgbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaG9ydC1jdXQgbWV0aG9kIHRoYXQgd2lsbCBkaXJlY3RseSBzZXQgdGhlIHRleHR1cmUgYmVpbmcgdXNlZCBieSB0aGUgYGlDaGFubmVsMGAgc2FtcGxlcjJEIHVuaWZvcm0uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB0ZXh0dXJlS2V5IGdpdmVuIGlzIHRoZSBrZXkgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIGNhY2hlLiBZb3UgY2Fubm90IHVzZSBhIHNpbmdsZSBmcmFtZVxyXG4gICAgICogZnJvbSBhIHRleHR1cmUsIG9ubHkgdGhlIGZ1bGwgaW1hZ2UuIEFsc28sIGxvdHMgb2Ygc2hhZGVycyBleHBlY3QgdGV4dHVyZXMgdG8gYmUgcG93ZXItb2YtdHdvIHNpemVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjc2V0Q2hhbm5lbDBcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVLZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci4gTXVzdCBhbHJlYWR5IGJlIGxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbdGV4dHVyZURhdGFdIC0gQWRkaXRpb25hbCB0ZXh0dXJlIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2hhZGVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDaGFubmVsMDogZnVuY3Rpb24gKHRleHR1cmVLZXksIHRleHR1cmVEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNhbXBsZXIyRCgnaUNoYW5uZWwwJywgdGV4dHVyZUtleSwgMCwgdGV4dHVyZURhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc2hvcnQtY3V0IG1ldGhvZCB0aGF0IHdpbGwgZGlyZWN0bHkgc2V0IHRoZSB0ZXh0dXJlIGJlaW5nIHVzZWQgYnkgdGhlIGBpQ2hhbm5lbDFgIHNhbXBsZXIyRCB1bmlmb3JtLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgdGV4dHVyZUtleSBnaXZlbiBpcyB0aGUga2V5IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBjYWNoZS4gWW91IGNhbm5vdCB1c2UgYSBzaW5nbGUgZnJhbWVcclxuICAgICAqIGZyb20gYSB0ZXh0dXJlLCBvbmx5IHRoZSBmdWxsIGltYWdlLiBBbHNvLCBsb3RzIG9mIHNoYWRlcnMgZXhwZWN0IHRleHR1cmVzIHRvIGJlIHBvd2VyLW9mLXR3byBzaXplZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3NldENoYW5uZWwxXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlS2V5IC0gVGhlIGtleSBvZiB0aGUgdGV4dHVyZSwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuIE11c3QgYWxyZWFkeSBiZSBsb2FkZWQuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW3RleHR1cmVEYXRhXSAtIEFkZGl0aW9uYWwgdGV4dHVyZSBkYXRhLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNoYWRlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Q2hhbm5lbDE6IGZ1bmN0aW9uICh0ZXh0dXJlS2V5LCB0ZXh0dXJlRGF0YSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRTYW1wbGVyMkQoJ2lDaGFubmVsMScsIHRleHR1cmVLZXksIDEsIHRleHR1cmVEYXRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNob3J0LWN1dCBtZXRob2QgdGhhdCB3aWxsIGRpcmVjdGx5IHNldCB0aGUgdGV4dHVyZSBiZWluZyB1c2VkIGJ5IHRoZSBgaUNoYW5uZWwyYCBzYW1wbGVyMkQgdW5pZm9ybS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHRleHR1cmVLZXkgZ2l2ZW4gaXMgdGhlIGtleSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgY2FjaGUuIFlvdSBjYW5ub3QgdXNlIGEgc2luZ2xlIGZyYW1lXHJcbiAgICAgKiBmcm9tIGEgdGV4dHVyZSwgb25seSB0aGUgZnVsbCBpbWFnZS4gQWxzbywgbG90cyBvZiBzaGFkZXJzIGV4cGVjdCB0ZXh0dXJlcyB0byBiZSBwb3dlci1vZi10d28gc2l6ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRDaGFubmVsMlxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZUtleSAtIFRoZSBrZXkgb2YgdGhlIHRleHR1cmUsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLiBNdXN0IGFscmVhZHkgYmUgbG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFt0ZXh0dXJlRGF0YV0gLSBBZGRpdGlvbmFsIHRleHR1cmUgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaGFkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldENoYW5uZWwyOiBmdW5jdGlvbiAodGV4dHVyZUtleSwgdGV4dHVyZURhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0U2FtcGxlcjJEKCdpQ2hhbm5lbDInLCB0ZXh0dXJlS2V5LCAyLCB0ZXh0dXJlRGF0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaG9ydC1jdXQgbWV0aG9kIHRoYXQgd2lsbCBkaXJlY3RseSBzZXQgdGhlIHRleHR1cmUgYmVpbmcgdXNlZCBieSB0aGUgYGlDaGFubmVsM2Agc2FtcGxlcjJEIHVuaWZvcm0uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB0ZXh0dXJlS2V5IGdpdmVuIGlzIHRoZSBrZXkgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIGNhY2hlLiBZb3UgY2Fubm90IHVzZSBhIHNpbmdsZSBmcmFtZVxyXG4gICAgICogZnJvbSBhIHRleHR1cmUsIG9ubHkgdGhlIGZ1bGwgaW1hZ2UuIEFsc28sIGxvdHMgb2Ygc2hhZGVycyBleHBlY3QgdGV4dHVyZXMgdG8gYmUgcG93ZXItb2YtdHdvIHNpemVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjc2V0Q2hhbm5lbDNcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVLZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci4gTXVzdCBhbHJlYWR5IGJlIGxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbdGV4dHVyZURhdGFdIC0gQWRkaXRpb25hbCB0ZXh0dXJlIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2hhZGVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDaGFubmVsMzogZnVuY3Rpb24gKHRleHR1cmVLZXksIHRleHR1cmVEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNhbXBsZXIyRCgnaUNoYW5uZWwzJywgdGV4dHVyZUtleSwgMywgdGV4dHVyZURhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHRha2VzIGEgc2FtcGxlcjJEIHVuaWZvcm0gYW5kIHByZXBhcmVzIGl0IGZvciB1c2UgYnkgc2V0dGluZyB0aGVcclxuICAgICAqIGdsIHRleHR1cmUgcGFyYW1ldGVycy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI2luaXRTYW1wbGVyMkRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSB1bmlmb3JtIC0gVGhlIHNhbXBsZXIyRCB1bmlmb3JtIHRvIHByb2Nlc3MuXHJcbiAgICAgKi9cclxuICAgIGluaXRTYW1wbGVyMkQ6IGZ1bmN0aW9uICh1bmlmb3JtKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdW5pZm9ybS52YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyB0aGlzLl90ZXh0dXJlQ291bnQpO1xyXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHVuaWZvcm0udmFsdWUpO1xyXG4gICAgXHJcbiAgICAgICAgLy8gIEV4dGVuZGVkIHRleHR1cmUgZGF0YVxyXG5cclxuICAgICAgICB2YXIgZGF0YSA9IHVuaWZvcm0udGV4dHVyZURhdGE7XHJcblxyXG4gICAgICAgIGlmIChkYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMUmVuZGVyaW5nQ29udGV4dC90ZXhJbWFnZTJEXHJcbiAgICBcclxuICAgICAgICAgICAgLy8gIG1hZyAvIG1pbkZpbHRlciBjYW4gYmU6IGdsLkxJTkVBUiwgZ2wuTElORUFSX01JUE1BUF9MSU5FQVIgb3IgZ2wuTkVBUkVTVFxyXG4gICAgICAgICAgICAvLyAgd3JhcFMvVCBjYW4gYmU6IGdsLkNMQU1QX1RPX0VER0Ugb3IgZ2wuUkVQRUFUXHJcbiAgICAgICAgICAgIC8vICBmb3JtYXQgY2FuIGJlOiBnbC5MVU1JTkFOQ0Ugb3IgZ2wuUkdCQVxyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciBtYWdGaWx0ZXIgPSBnbFtHZXRGYXN0VmFsdWUoZGF0YSwgJ21hZ0ZpbHRlcicsICdsaW5lYXInKS50b1VwcGVyQ2FzZSgpXTtcclxuICAgICAgICAgICAgdmFyIG1pbkZpbHRlciA9IGdsW0dldEZhc3RWYWx1ZShkYXRhLCAnbWluRmlsdGVyJywgJ2xpbmVhcicpLnRvVXBwZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB2YXIgd3JhcFMgPSBnbFtHZXRGYXN0VmFsdWUoZGF0YSwgJ3dyYXBTJywgJ3JlcGVhdCcpLnRvVXBwZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB2YXIgd3JhcFQgPSBnbFtHZXRGYXN0VmFsdWUoZGF0YSwgJ3dyYXBUJywgJ3JlcGVhdCcpLnRvVXBwZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB2YXIgZm9ybWF0ID0gZ2xbR2V0RmFzdFZhbHVlKGRhdGEsICdmb3JtYXQnLCAncmdiYScpLnRvVXBwZXJDYXNlKCldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGEucmVwZWF0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3cmFwUyA9IGdsLlJFUEVBVDtcclxuICAgICAgICAgICAgICAgIHdyYXBUID0gZ2wuUkVQRUFUO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAhIWRhdGEuZmxpcFkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGEud2lkdGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IEdldEZhc3RWYWx1ZShkYXRhLCAnd2lkdGgnLCA1MTIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IEdldEZhc3RWYWx1ZShkYXRhLCAnaGVpZ2h0JywgMik7XHJcbiAgICAgICAgICAgICAgICB2YXIgYm9yZGVyID0gR2V0RmFzdFZhbHVlKGRhdGEsICdib3JkZXInLCAwKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gIHRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEFycmF5QnVmZmVyVmlldz8gcGl4ZWxzKVxyXG4gICAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICB0ZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBJbWFnZURhdGE/IHBpeGVscylcclxuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZm9ybWF0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB1bmlmb3JtLnNvdXJjZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTtcclxuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlcik7XHJcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIHdyYXBTKTtcclxuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgd3JhcFQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XHJcbiAgICBcclxuICAgICAgICBnbC51bmlmb3JtMWkodW5pZm9ybS51bmlmb3JtTG9jYXRpb24sIHRoaXMuX3RleHR1cmVDb3VudCk7XHJcbiAgICBcclxuICAgICAgICB0aGlzLl90ZXh0dXJlQ291bnQrKztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTeW5jaHJvbml6ZXMgYWxsIG9mIHRoZSB1bmlmb3JtcyB0aGlzIHNoYWRlciB1c2VzLlxyXG4gICAgICogRWFjaCB1bmlmb3JtcyBnbCBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdHVybi5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3N5bmNVbmlmb3Jtc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgc3luY1VuaWZvcm1zOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIHZhciB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XHJcbiAgICAgICAgdmFyIHVuaWZvcm07XHJcbiAgICAgICAgdmFyIGxlbmd0aDtcclxuICAgICAgICB2YXIgZ2xGdW5jO1xyXG4gICAgICAgIHZhciBsb2NhdGlvbjtcclxuICAgICAgICB2YXIgdmFsdWU7XHJcbiAgICAgICAgdmFyIHRleHR1cmVDb3VudCA9IDA7XHJcbiAgICBcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdW5pZm9ybXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB1bmlmb3JtID0gdW5pZm9ybXNba2V5XTtcclxuXHJcbiAgICAgICAgICAgIGdsRnVuYyA9IHVuaWZvcm0uZ2xGdW5jO1xyXG4gICAgICAgICAgICBsZW5ndGggPSB1bmlmb3JtLmdsVmFsdWVMZW5ndGg7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uID0gdW5pZm9ybS51bmlmb3JtTG9jYXRpb247XHJcbiAgICAgICAgICAgIHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtLmdsTWF0cml4KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdsRnVuYy5jYWxsKGdsLCBsb2NhdGlvbiwgdW5pZm9ybS50cmFuc3Bvc2UsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnbEZ1bmMuY2FsbChnbCwgbG9jYXRpb24sIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsZW5ndGggPT09IDIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdsRnVuYy5jYWxsKGdsLCBsb2NhdGlvbiwgdmFsdWUueCwgdmFsdWUueSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobGVuZ3RoID09PSAzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbEZ1bmMuY2FsbChnbCwgbG9jYXRpb24sIHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLnopO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PT0gNClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2xGdW5jLmNhbGwoZ2wsIGxvY2F0aW9uLCB2YWx1ZS54LCB2YWx1ZS55LCB2YWx1ZS56LCB2YWx1ZS53KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtLnR5cGUgPT09ICdzYW1wbGVyMkQnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsWydURVhUVVJFJyArIHRleHR1cmVDb3VudF0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkobG9jYXRpb24sIHRleHR1cmVDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZUNvdW50Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHJlbmRlci5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgbWF0cml4IElUUlMgYW5kIHRoZW4gc3RvcmVzIHRoZSByZXN1bHRpbmcgdmFsdWUgaW4gdGhlIGB1Vmlld01hdHJpeGAgdW5pZm9ybS5cclxuICAgICAqIEl0IHRoZW4gc2V0cyB1cCB0aGUgdmVydGV4IGJ1ZmZlciBhbmQgc2hhZGVyLCB1cGRhdGVzIGFuZCBzeW5jcyB0aGUgdW5pZm9ybXMgcmVhZHlcclxuICAgICAqIGZvciBmbHVzaCB0byBiZSBjYWxsZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNsb2FkXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBbbWF0cml4MkRdIC0gVGhlIHRyYW5zZm9ybSBtYXRyaXggdG8gdXNlIGR1cmluZyByZW5kZXJpbmcuXHJcbiAgICAgKi9cclxuICAgIGxvYWQ6IGZ1bmN0aW9uIChtYXRyaXgyRClcclxuICAgIHtcclxuICAgICAgICAvLyAgSVRSU1xyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcbiAgICAgICAgdmFyIHZtID0gdGhpcy52aWV3TWF0cml4O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyVG9UZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHggPSAtdGhpcy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICAgICAgICAgIHZhciB5ID0gLXRoaXMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZtWzBdID0gbWF0cml4MkRbMF07XHJcbiAgICAgICAgICAgIHZtWzFdID0gbWF0cml4MkRbMV07XHJcbiAgICAgICAgICAgIHZtWzRdID0gbWF0cml4MkRbMl07XHJcbiAgICAgICAgICAgIHZtWzVdID0gbWF0cml4MkRbM107XHJcbiAgICAgICAgICAgIHZtWzhdID0gbWF0cml4MkRbNF07XHJcbiAgICAgICAgICAgIHZtWzldID0gbWF0cml4MkRbNV07XHJcbiAgICAgICAgICAgIHZtWzEyXSA9IHZtWzBdICogeCArIHZtWzRdICogeTtcclxuICAgICAgICAgICAgdm1bMTNdID0gdm1bMV0gKiB4ICsgdm1bNV0gKiB5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFVwZGF0ZSB2ZXJ0ZXggc2hhZGVyIHVuaWZvcm1zXHJcblxyXG4gICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICd1Vmlld01hdHJpeCcpLCBmYWxzZSwgdm0pO1xyXG4gICAgICAgIGdsLnVuaWZvcm0yZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgJ3VSZXNvbHV0aW9uJyksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLy8gIFVwZGF0ZSBmcmFnbWVudCBzaGFkZXIgdW5pZm9ybXNcclxuXHJcbiAgICAgICAgdmFyIHVuaWZvcm1zID0gdGhpcy51bmlmb3JtcztcclxuICAgICAgICB2YXIgcmVzID0gdW5pZm9ybXMucmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgcmVzLnZhbHVlLnggPSB3aWR0aDtcclxuICAgICAgICByZXMudmFsdWUueSA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgdW5pZm9ybXMudGltZS52YWx1ZSA9IHJlbmRlcmVyLmdhbWUubG9vcC5nZXREdXJhdGlvbigpO1xyXG5cclxuICAgICAgICB2YXIgcG9pbnRlciA9IHRoaXMucG9pbnRlcjtcclxuXHJcbiAgICAgICAgaWYgKHBvaW50ZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbW91c2UgPSB1bmlmb3Jtcy5tb3VzZTtcclxuXHJcbiAgICAgICAgICAgIHZhciBweCA9IHBvaW50ZXIueCAvIHdpZHRoO1xyXG4gICAgICAgICAgICB2YXIgcHkgPSAxIC0gcG9pbnRlci55IC8gaGVpZ2h0O1xyXG4gICAgXHJcbiAgICAgICAgICAgIG1vdXNlLnZhbHVlLnggPSBweC50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICBtb3VzZS52YWx1ZS55ID0gcHkudG9GaXhlZCgyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3luY1VuaWZvcm1zKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHJlbmRlci5cclxuICAgICAqIFxyXG4gICAgICogU2V0cyB0aGUgYWN0aXZlIHNoYWRlciwgbG9hZHMgdGhlIHZlcnRleCBidWZmZXIgYW5kIHRoZW4gZHJhd3MuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNmbHVzaFxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICBmbHVzaDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgQmluZFxyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgICAgICB2YXIgcHJvZ3JhbSA9IHRoaXMucHJvZ3JhbTtcclxuXHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgdmVydGV4QnVmZmVyID0gdGhpcy52ZXJ0ZXhCdWZmZXI7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuICAgICAgICB2YXIgdmVydGV4U2l6ZSA9IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclRvVGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlcik7XHJcblxyXG4gICAgICAgIHZhciBsb2NhdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICdpblBvc2l0aW9uJyk7XHJcblxyXG4gICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcblxyXG4gICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIHZlcnRleFNpemUsIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIERyYXdcclxuXHJcbiAgICAgICAgdmFyIHZmID0gdGhpcy52ZXJ0ZXhWaWV3RjMyO1xyXG5cclxuICAgICAgICB2ZlszXSA9IGhlaWdodDtcclxuICAgICAgICB2Zls0XSA9IHdpZHRoO1xyXG4gICAgICAgIHZmWzVdID0gaGVpZ2h0O1xyXG4gICAgICAgIHZmWzhdID0gd2lkdGg7XHJcbiAgICAgICAgdmZbOV0gPSBoZWlnaHQ7XHJcbiAgICAgICAgdmZbMTBdID0gd2lkdGg7XHJcblxyXG4gICAgICAgIC8vICBGbHVzaFxyXG5cclxuICAgICAgICB2YXIgdmVydGV4Q291bnQgPSA2O1xyXG5cclxuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgdGhpcy5ieXRlcy5zdWJhcnJheSgwLCB2ZXJ0ZXhDb3VudCAqIHZlcnRleFNpemUpKTtcclxuXHJcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIHZlcnRleENvdW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyVG9UZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0RnJhbWVidWZmZXIobnVsbCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIE5PT1AgbWV0aG9kIHNvIHlvdSBjYW4gcGFzcyBhIFNoYWRlciB0byBhIENvbnRhaW5lci5cclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLiBJdCBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNzZXRBbHBoYVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEEgTk9PUCBtZXRob2Qgc28geW91IGNhbiBwYXNzIGEgU2hhZGVyIHRvIGEgQ29udGFpbmVyLlxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuIEl0IGlzIGludGVudGlvbmFsbHkgZW1wdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyI3NldEJsZW5kTW9kZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgc2V0QmxlbmRNb2RlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGRlc3Ryb3kgaGFuZGxlciwgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGRlc3Ryb3kgcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjcHJlRGVzdHJveVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIGdsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcclxuICAgICAgICBnbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhCdWZmZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJUb1RleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVidWZmZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNoYWRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gZm9yIFNoYWRlci5SZW5kZXIuIFRoZXJlIGlzIG5vIENhbnZhcyByZW5kZXJlciBmb3IgU2hhZGVyIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlciNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqL1xyXG52YXIgU2hhZGVyQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAoKVxyXG57XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNoYWRlckNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgU2hhZGVyID0gcmVxdWlyZSgnLi9TaGFkZXInKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFNoYWRlciBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyBpdC5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgU2hhZGVyIEdhbWUgT2JqZWN0IGFuZCBXZWJHTCBzdXBwb3J0IGhhdmUgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3Ijc2hhZGVyXHJcbiAqIEBzaW5jZSAzLjE3LjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvU2NlbmVdIC0gQWRkIHRoaXMgR2FtZSBPYmplY3QgdG8gdGhlIFNjZW5lIGFmdGVyIGNyZWF0aW5nIGl0PyBJZiBzZXQgdGhpcyBhcmd1bWVudCBvdmVycmlkZXMgdGhlIGBhZGRgIHByb3BlcnR5IGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCdzaGFkZXInLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICB2YXIga2V5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdrZXknLCBudWxsKTtcclxuICAgIHZhciB4ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd4JywgMCk7XHJcbiAgICB2YXIgeSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAneScsIDApO1xyXG4gICAgdmFyIHdpZHRoID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd3aWR0aCcsIDEyOCk7XHJcbiAgICB2YXIgaGVpZ2h0ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdoZWlnaHQnLCAxMjgpO1xyXG5cclxuICAgIHZhciBzaGFkZXIgPSBuZXcgU2hhZGVyKHRoaXMuc2NlbmUsIGtleSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgaWYgKGFkZFRvU2NlbmUgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBjb25maWcuYWRkID0gYWRkVG9TY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3QodGhpcy5zY2VuZSwgc2hhZGVyLCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiBzaGFkZXI7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RDcmVhdG9yIGNvbnRleHQuXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNoYWRlciA9IHJlcXVpcmUoJy4vU2hhZGVyJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBTaGFkZXIgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTaGFkZXIgR2FtZSBPYmplY3QgYW5kIFdlYkdMIHN1cHBvcnQgaGF2ZSBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNzaGFkZXJcclxuICogQHdlYmdsT25seVxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuRGlzcGxheS5CYXNlU2hhZGVyKX0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc2hhZGVyIHRvIHVzZSBmcm9tIHRoZSBzaGFkZXIgY2FjaGUsIG9yIGEgQmFzZVNoYWRlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xMjhdIC0gVGhlIHdpZHRoIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbdGV4dHVyZXNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgdGV4dHVyZSBrZXlzIHRvIGJpbmQgdG8gdGhlIGlDaGFubmVsMC4uLjMgdW5pZm9ybXMuIFRoZSB0ZXh0dXJlcyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHtvYmplY3R9IFt0ZXh0dXJlRGF0YV0gLSBPcHRpb25hbCBhZGRpdGlvbmFsIHRleHR1cmUgZGF0YS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlNoYWRlcn0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICBHYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3Rlcignc2hhZGVyJywgZnVuY3Rpb24gKGtleSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGV4dHVyZXMsIHRleHR1cmVEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgU2hhZGVyKHRoaXMuc2NlbmUsIGtleSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdGV4dHVyZXMsIHRleHR1cmVEYXRhKSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9TaGFkZXJXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL1NoYWRlckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFkZXIjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU2hhZGVyfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgU2hhZGVyV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIGlmICghc3JjLnNoYWRlcilcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHBpcGVsaW5lID0gcmVuZGVyZXIuY3VycmVudFBpcGVsaW5lO1xyXG5cclxuICAgIHJlbmRlcmVyLmNsZWFyUGlwZWxpbmUoKTtcclxuXHJcbiAgICBpZiAoc3JjLnJlbmRlclRvVGV4dHVyZSlcclxuICAgIHtcclxuICAgICAgICBzcmMubG9hZCgpO1xyXG4gICAgICAgIHNyYy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjYW1NYXRyaXggPSBzcmMuX3RlbXBNYXRyaXgxO1xyXG4gICAgICAgIHZhciBzaGFwZU1hdHJpeCA9IHNyYy5fdGVtcE1hdHJpeDI7XHJcbiAgICAgICAgdmFyIGNhbGNNYXRyaXggPSBzcmMuX3RlbXBNYXRyaXgzO1xyXG4gICAgXHJcbiAgICAgICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuICAgIFxyXG4gICAgICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuICAgIFxyXG4gICAgICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuICAgIFxyXG4gICAgICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgICAgICBzaGFwZU1hdHJpeC5lID0gc3JjLng7XHJcbiAgICAgICAgICAgIHNoYXBlTWF0cml4LmYgPSBzcmMueTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgICAgICBzaGFwZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3Rvclk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNoYXBlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIFxyXG4gICAgICAgIC8vICBSZW5kZXJlciBzaXplIGNoYW5nZWQ/XHJcbiAgICAgICAgaWYgKHJlbmRlcmVyLndpZHRoICE9PSBzcmMuX3JlbmRlcmVyV2lkdGggfHwgcmVuZGVyZXIuaGVpZ2h0ICE9PSBzcmMuX3JlbmRlcmVySGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3JjLnByb2pPcnRobygwLCByZW5kZXJlci53aWR0aCwgcmVuZGVyZXIuaGVpZ2h0LCAwKTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBzcmMubG9hZChjYWxjTWF0cml4Lm1hdHJpeCk7XHJcbiAgICAgICAgc3JjLmZsdXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyZXIucmViaW5kUGlwZWxpbmUocGlwZWxpbmUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTaGFkZXJXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyBhIGZpbGxlZCBwYXRoIGZvciB0aGUgZ2l2ZW4gU2hhcGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI0ZpbGxQYXRoV2ViR0xcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lfSBwaXBlbGluZSAtIFRoZSBXZWJHTCBQaXBlbGluZSB1c2VkIHRvIHJlbmRlciB0aGlzIFNoYXBlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gY2FsY01hdHJpeCAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4IHVzZWQgdG8gZ2V0IHRoZSBwb3NpdGlvbiB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3Qgc2hhcGUgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgYmFzZSBhbHBoYSB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR4IC0gVGhlIHNvdXJjZSBkaXNwbGF5T3JpZ2luWC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR5IC0gVGhlIHNvdXJjZSBkaXNwbGF5T3JpZ2luWS5cclxuICovXHJcbnZhciBGaWxsUGF0aFdlYkdMID0gZnVuY3Rpb24gKHBpcGVsaW5lLCBjYWxjTWF0cml4LCBzcmMsIGFscGhhLCBkeCwgZHkpXHJcbntcclxuICAgIHZhciBmaWxsVGludENvbG9yID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5maWxsQ29sb3IsIHNyYy5maWxsQWxwaGEgKiBhbHBoYSk7XHJcblxyXG4gICAgdmFyIHBhdGggPSBzcmMucGF0aERhdGE7XHJcbiAgICB2YXIgcGF0aEluZGV4ZXMgPSBzcmMucGF0aEluZGV4ZXM7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoSW5kZXhlcy5sZW5ndGg7IGkgKz0gMylcclxuICAgIHtcclxuICAgICAgICB2YXIgcDAgPSBwYXRoSW5kZXhlc1tpXSAqIDI7XHJcbiAgICAgICAgdmFyIHAxID0gcGF0aEluZGV4ZXNbaSArIDFdICogMjtcclxuICAgICAgICB2YXIgcDIgPSBwYXRoSW5kZXhlc1tpICsgMl0gKiAyO1xyXG5cclxuICAgICAgICB2YXIgeDAgPSBwYXRoW3AwICsgMF0gLSBkeDtcclxuICAgICAgICB2YXIgeTAgPSBwYXRoW3AwICsgMV0gLSBkeTtcclxuICAgICAgICB2YXIgeDEgPSBwYXRoW3AxICsgMF0gLSBkeDtcclxuICAgICAgICB2YXIgeTEgPSBwYXRoW3AxICsgMV0gLSBkeTtcclxuICAgICAgICB2YXIgeDIgPSBwYXRoW3AyICsgMF0gLSBkeDtcclxuICAgICAgICB2YXIgeTIgPSBwYXRoW3AyICsgMV0gLSBkeTtcclxuXHJcbiAgICAgICAgdmFyIHR4MCA9IGNhbGNNYXRyaXguZ2V0WCh4MCwgeTApO1xyXG4gICAgICAgIHZhciB0eTAgPSBjYWxjTWF0cml4LmdldFkoeDAsIHkwKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MSA9IGNhbGNNYXRyaXguZ2V0WCh4MSwgeTEpO1xyXG4gICAgICAgIHZhciB0eTEgPSBjYWxjTWF0cml4LmdldFkoeDEsIHkxKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MiA9IGNhbGNNYXRyaXguZ2V0WCh4MiwgeTIpO1xyXG4gICAgICAgIHZhciB0eTIgPSBjYWxjTWF0cml4LmdldFkoeDIsIHkyKTtcclxuICAgIFxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG5cclxuICAgICAgICBwaXBlbGluZS5iYXRjaFRyaSh0eDAsIHR5MCwgdHgxLCB0eTEsIHR4MiwgdHkyLCAwLCAwLCAxLCAxLCBmaWxsVGludENvbG9yLCBmaWxsVGludENvbG9yLCBmaWxsVGludENvbG9yLCBwaXBlbGluZS50aW50RWZmZWN0KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmlsbFBhdGhXZWJHTDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgZmlsbFN0eWxlIG9uIHRoZSB0YXJnZXQgY29udGV4dCBiYXNlZCBvbiB0aGUgZ2l2ZW4gU2hhcGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI0ZpbGxTdHlsZUNhbnZhc1xyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggLSBUaGUgY29udGV4dCB0byBzZXQgdGhlIGZpbGwgc3R5bGUgb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgdG8gc2V0IHRoZSBmaWxsIHN0eWxlIGZyb20uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYWx0Q29sb3JdIC0gQW4gYWx0ZXJuYXRpdmUgY29sb3IgdG8gcmVuZGVyIHdpdGguXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYWx0QWxwaGFdIC0gQW4gYWx0ZXJuYXRpdmUgYWxwaGEgdG8gcmVuZGVyIHdpdGguXHJcbiAqL1xyXG52YXIgRmlsbFN0eWxlQ2FudmFzID0gZnVuY3Rpb24gKGN0eCwgc3JjLCBhbHRDb2xvciwgYWx0QWxwaGEpXHJcbntcclxuICAgIHZhciBmaWxsQ29sb3IgPSAoYWx0Q29sb3IpID8gYWx0Q29sb3IgOiBzcmMuZmlsbENvbG9yO1xyXG4gICAgdmFyIGZpbGxBbHBoYSA9IChhbHRBbHBoYSkgPyBhbHRBbHBoYSA6IHNyYy5maWxsQWxwaGE7XHJcblxyXG4gICAgdmFyIHJlZCA9ICgoZmlsbENvbG9yICYgMHhGRjAwMDApID4+PiAxNik7XHJcbiAgICB2YXIgZ3JlZW4gPSAoKGZpbGxDb2xvciAmIDB4RkYwMCkgPj4+IDgpO1xyXG4gICAgdmFyIGJsdWUgPSAoZmlsbENvbG9yICYgMHhGRik7XHJcblxyXG4gICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByZWQgKyAnLCcgKyBncmVlbiArICcsJyArIGJsdWUgKyAnLCcgKyBmaWxsQWxwaGEgKyAnKSc7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGxTdHlsZUNhbnZhcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgc3Ryb2tlU3R5bGUgYW5kIGxpbmVXaWR0aCBvbiB0aGUgdGFyZ2V0IGNvbnRleHQgYmFzZWQgb24gdGhlIGdpdmVuIFNoYXBlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZSNMaW5lU3R5bGVDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4IC0gVGhlIGNvbnRleHQgdG8gc2V0IHRoZSBzdHJva2Ugc3R5bGUgb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgdG8gc2V0IHRoZSBzdHJva2Ugc3R5bGUgZnJvbS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFthbHRDb2xvcl0gLSBBbiBhbHRlcm5hdGl2ZSBjb2xvciB0byByZW5kZXIgd2l0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFthbHRBbHBoYV0gLSBBbiBhbHRlcm5hdGl2ZSBhbHBoYSB0byByZW5kZXIgd2l0aC5cclxuICovXHJcbnZhciBMaW5lU3R5bGVDYW52YXMgPSBmdW5jdGlvbiAoY3R4LCBzcmMsIGFsdENvbG9yLCBhbHRBbHBoYSlcclxue1xyXG4gICAgdmFyIHN0cm9rZUNvbG9yID0gKGFsdENvbG9yKSA/IGFsdENvbG9yIDogc3JjLnN0cm9rZUNvbG9yO1xyXG4gICAgdmFyIHN0cm9rZUFscGhhID0gKGFsdEFscGhhKSA/IGFsdEFscGhhIDogc3JjLnN0cm9rZUFscGhhO1xyXG5cclxuICAgIHZhciByZWQgPSAoKHN0cm9rZUNvbG9yICYgMHhGRjAwMDApID4+PiAxNik7XHJcbiAgICB2YXIgZ3JlZW4gPSAoKHN0cm9rZUNvbG9yICYgMHhGRjAwKSA+Pj4gOCk7XHJcbiAgICB2YXIgYmx1ZSA9IChzdHJva2VDb2xvciAmIDB4RkYpO1xyXG5cclxuICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyByZWQgKyAnLCcgKyBncmVlbiArICcsJyArIGJsdWUgKyAnLCcgKyBzdHJva2VBbHBoYSArICcpJztcclxuICAgIGN0eC5saW5lV2lkdGggPSBzcmMubGluZVdpZHRoO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lU3R5bGVDYW52YXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdCcpO1xyXG52YXIgTGluZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vbGluZS9MaW5lJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgU2hhcGUgR2FtZSBPYmplY3QgaXMgYSBiYXNlIGNsYXNzIGZvciB0aGUgdmFyaW91cyBkaWZmZXJlbnQgc2hhcGVzLCBzdWNoIGFzIHRoZSBBcmMsIFN0YXIgb3IgUG9seWdvbi5cclxuICogWW91IGNhbm5vdCBhZGQgYSBTaGFwZSBkaXJlY3RseSB0byB5b3VyIFNjZW5lLCBpdCBpcyBtZWFudCBhcyBhIGJhc2UgZm9yIHlvdXIgb3duIGN1c3RvbSBTaGFwZSBjbGFzc2VzLlxyXG4gKlxyXG4gKiBAY2xhc3MgU2hhcGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVNpbmdsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlXSAtIFRoZSBpbnRlcm5hbCB0eXBlIG9mIHRoZSBTaGFwZS5cclxuICogQHBhcmFtIHthbnl9IFtkYXRhXSAtIFRoZSBkYXRhIG9mIHRoZSBzb3VyY2Ugc2hhcGUgZ2VvbWV0cnksIGlmIGFueS5cclxuICovXHJcbnZhciBTaGFwZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhU2luZ2xlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ29tcHV0ZWRTaXplLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5HZXRCb3VuZHMsXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNrLFxyXG4gICAgICAgIENvbXBvbmVudHMuT3JpZ2luLFxyXG4gICAgICAgIENvbXBvbmVudHMuUGlwZWxpbmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2hhcGUgKHNjZW5lLCB0eXBlLCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHsgdHlwZSA9ICdTaGFwZSc7IH1cclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCB0eXBlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNvdXJjZSBTaGFwZSBkYXRhLiBUeXBpY2FsbHkgYSBnZW9tZXRyeSBvYmplY3QuXHJcbiAgICAgICAgICogWW91IHNob3VsZCBub3QgbWFuaXB1bGF0ZSB0aGlzIGRpcmVjdGx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdlb20gPSBkYXRhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb2xkcyB0aGUgcG9seWdvbiBwYXRoIGRhdGEgZm9yIGZpbGxlZCByZW5kZXJpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjcGF0aERhdGFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF0aERhdGEgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSG9sZHMgdGhlIGVhcmN1dCBwb2x5Z29uIHBhdGggaW5kZXggZGF0YSBmb3IgZmlsbGVkIHJlbmRlcmluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZSNwYXRoSW5kZXhlc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyW119XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF0aEluZGV4ZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZpbGwgY29sb3IgdXNlZCBieSB0aGlzIFNoYXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI2ZpbGxDb2xvclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmlsbENvbG9yID0gMHhmZmZmZmY7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmaWxsIGFscGhhIHZhbHVlIHVzZWQgYnkgdGhpcyBTaGFwZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZSNmaWxsQWxwaGFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdHJva2UgY29sb3IgdXNlZCBieSB0aGlzIFNoYXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI3N0cm9rZUNvbG9yXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IDB4ZmZmZmZmO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3Ryb2tlIGFscGhhIHZhbHVlIHVzZWQgYnkgdGhpcyBTaGFwZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZSNzdHJva2VBbHBoYVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3Ryb2tlIGxpbmUgd2lkdGggdXNlZCBieSB0aGlzIFNoYXBlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI2xpbmVXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgaWYgdGhpcyBTaGFwZSBpcyBmaWxsZWQgb3Igbm90LlxyXG4gICAgICAgICAqIE5vdGUgdGhhdCBzb21lIFNoYXBlcyBkbyBub3Qgc3VwcG9ydCBiZWluZyBmaWxsZWQgKHN1Y2ggYXMgTGluZSBzaGFwZXMpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjaXNGaWxsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc0ZpbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb250cm9scyBpZiB0aGlzIFNoYXBlIGlzIHN0cm9rZWQgb3Igbm90LlxyXG4gICAgICAgICAqIE5vdGUgdGhhdCBzb21lIFNoYXBlcyBkbyBub3Qgc3VwcG9ydCBiZWluZyBzdHJva2VkIChzdWNoIGFzIElzbyBCb3ggc2hhcGVzKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlI2lzU3Ryb2tlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzU3Ryb2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb250cm9scyBpZiB0aGlzIFNoYXBlIHBhdGggaXMgY2xvc2VkIGR1cmluZyByZW5kZXJpbmcgd2hlbiBzdHJva2VkLlxyXG4gICAgICAgICAqIE5vdGUgdGhhdCBzb21lIFNoYXBlcyBhcmUgYWx3YXlzIGNsb3NlZCB3aGVuIHN0cm9rZWQgKHN1Y2ggYXMgRWxsaXBzZSBzaGFwZXMpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjY2xvc2VQYXRoXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2xvc2VQYXRoID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS5cclxuICAgICAgICAgKiBBIExpbmUgdXNlZCB3aGVuIHBhcnNpbmcgaW50ZXJuYWwgcGF0aCBkYXRhIHRvIGF2b2lkIGNvbnN0YW50IG9iamVjdCByZS1jcmVhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5DdXJ2ZSNfdGVtcExpbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdlb20uTGluZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTGluZSA9IG5ldyBMaW5lKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZmlsbCBjb2xvciBhbmQgYWxwaGEgZm9yIHRoaXMgU2hhcGUuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIGZvciB0aGUgU2hhcGUgdG8gbm90IGJlIGZpbGxlZCB0aGVuIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMsIG9yIGp1c3Qgc2V0IGBpc0ZpbGxlZGAgdG8gYGZhbHNlYC5cclxuICAgICAqIFxyXG4gICAgICogTm90ZSB0aGF0IHNvbWUgU2hhcGVzIGRvIG5vdCBzdXBwb3J0IGZpbGwgY29sb3JzLCBzdWNoIGFzIHRoZSBMaW5lIHNoYXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjc2V0RmlsbFN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29sb3JdIC0gVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCB0aGlzIHNoYXBlLiBJZiBub3QgcHJvdmlkZWQgdGhlIFNoYXBlIHdpbGwgbm90IGJlIGZpbGxlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYWxwaGE9MV0gLSBUaGUgYWxwaGEgdmFsdWUgdXNlZCB3aGVuIGZpbGxpbmcgdGhpcyBzaGFwZSwgaWYgYSBmaWxsIGNvbG9yIGlzIGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZpbGxTdHlsZTogZnVuY3Rpb24gKGNvbG9yLCBhbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkgeyBhbHBoYSA9IDE7IH1cclxuXHJcbiAgICAgICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbEFscGhhID0gYWxwaGE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaWxsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc3Ryb2tlIGNvbG9yIGFuZCBhbHBoYSBmb3IgdGhpcyBTaGFwZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IHdpc2ggZm9yIHRoZSBTaGFwZSB0byBub3QgYmUgc3Ryb2tlZCB0aGVuIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMsIG9yIGp1c3Qgc2V0IGBpc1N0cm9rZWRgIHRvIGBmYWxzZWAuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCBzb21lIFNoYXBlcyBkbyBub3Qgc3VwcG9ydCBiZWluZyBzdHJva2VkLCBzdWNoIGFzIHRoZSBJc28gQm94IHNoYXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjc2V0U3Ryb2tlU3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lV2lkdGhdIC0gVGhlIHdpZHRoIG9mIGxpbmUgdG8gc3Ryb2tlIHdpdGguIElmIG5vdCBwcm92aWRlZCBvciB1bmRlZmluZWQgdGhlIFNoYXBlIHdpbGwgbm90IGJlIHN0cm9rZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2NvbG9yXSAtIFRoZSBjb2xvciB1c2VkIHRvIHN0cm9rZSB0aGlzIHNoYXBlLiBJZiBub3QgcHJvdmlkZWQgdGhlIFNoYXBlIHdpbGwgbm90IGJlIHN0cm9rZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gVGhlIGFscGhhIHZhbHVlIHVzZWQgd2hlbiBzdHJva2luZyB0aGlzIHNoYXBlLCBpZiBhIHN0cm9rZSBjb2xvciBpcyBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTdHJva2VTdHlsZTogZnVuY3Rpb24gKGxpbmVXaWR0aCwgY29sb3IsIGFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7IGFscGhhID0gMTsgfVxyXG5cclxuICAgICAgICBpZiAobGluZVdpZHRoID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzU3Ryb2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IGNvbG9yO1xyXG4gICAgICAgICAgICB0aGlzLnN0cm9rZUFscGhhID0gYWxwaGE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTdHJva2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgaWYgdGhpcyBTaGFwZSBwYXRoIGlzIGNsb3NlZCBkdXJpbmcgcmVuZGVyaW5nIHdoZW4gc3Ryb2tlZC5cclxuICAgICAqIE5vdGUgdGhhdCBzb21lIFNoYXBlcyBhcmUgYWx3YXlzIGNsb3NlZCB3aGVuIHN0cm9rZWQgKHN1Y2ggYXMgRWxsaXBzZSBzaGFwZXMpXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZSNzZXRDbG9zZVBhdGhcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFNldCB0byBgdHJ1ZWAgaWYgdGhlIFNoYXBlIHNob3VsZCBiZSBjbG9zZWQgd2hlbiBzdHJva2VkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDbG9zZVBhdGg6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3NlUGF0aCA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBkZXN0cm95IGhhbmRsZXIsIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXN0cm95IHByb2Nlc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjcHJlRGVzdHJveVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2VvbSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdGVtcExpbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucGF0aERhdGEgPSBbXTtcclxuICAgICAgICB0aGlzLnBhdGhJbmRleGVzID0gW107XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2hhcGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIGEgc3Ryb2tlIG91dGxpbmUgYXJvdW5kIHRoZSBnaXZlbiBTaGFwZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGUjU3Ryb2tlUGF0aFdlYkdMXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZX0gcGlwZWxpbmUgLSBUaGUgV2ViR0wgUGlwZWxpbmUgdXNlZCB0byByZW5kZXIgdGhpcyBTaGFwZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBzaGFwZSBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBiYXNlIGFscGhhIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZHggLSBUaGUgc291cmNlIGRpc3BsYXlPcmlnaW5YLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZHkgLSBUaGUgc291cmNlIGRpc3BsYXlPcmlnaW5ZLlxyXG4gKi9cclxudmFyIFN0cm9rZVBhdGhXZWJHTCA9IGZ1bmN0aW9uIChwaXBlbGluZSwgc3JjLCBhbHBoYSwgZHgsIGR5KVxyXG57XHJcbiAgICB2YXIgc3Ryb2tlVGludCA9IHBpcGVsaW5lLnN0cm9rZVRpbnQ7XHJcbiAgICB2YXIgc3Ryb2tlVGludENvbG9yID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5zdHJva2VDb2xvciwgc3JjLnN0cm9rZUFscGhhICogYWxwaGEpO1xyXG5cclxuICAgIHN0cm9rZVRpbnQuVEwgPSBzdHJva2VUaW50Q29sb3I7XHJcbiAgICBzdHJva2VUaW50LlRSID0gc3Ryb2tlVGludENvbG9yO1xyXG4gICAgc3Ryb2tlVGludC5CTCA9IHN0cm9rZVRpbnRDb2xvcjtcclxuICAgIHN0cm9rZVRpbnQuQlIgPSBzdHJva2VUaW50Q29sb3I7XHJcblxyXG4gICAgdmFyIHBhdGggPSBzcmMucGF0aERhdGE7XHJcbiAgICB2YXIgcGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoIC0gMTtcclxuICAgIHZhciBsaW5lV2lkdGggPSBzcmMubGluZVdpZHRoO1xyXG4gICAgdmFyIGhhbGZMaW5lV2lkdGggPSBsaW5lV2lkdGggLyAyO1xyXG5cclxuICAgIHZhciBweDEgPSBwYXRoWzBdIC0gZHg7XHJcbiAgICB2YXIgcHkxID0gcGF0aFsxXSAtIGR5O1xyXG5cclxuICAgIGlmICghc3JjLmNsb3NlUGF0aClcclxuICAgIHtcclxuICAgICAgICBwYXRoTGVuZ3RoIC09IDI7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBwYXRoTGVuZ3RoOyBpICs9IDIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHB4MiA9IHBhdGhbaV0gLSBkeDtcclxuICAgICAgICB2YXIgcHkyID0gcGF0aFtpICsgMV0gLSBkeTtcclxuXHJcbiAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKCk7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLmJhdGNoTGluZShcclxuICAgICAgICAgICAgcHgxLFxyXG4gICAgICAgICAgICBweTEsXHJcbiAgICAgICAgICAgIHB4MixcclxuICAgICAgICAgICAgcHkyLFxyXG4gICAgICAgICAgICBoYWxmTGluZVdpZHRoLFxyXG4gICAgICAgICAgICBoYWxmTGluZVdpZHRoLFxyXG4gICAgICAgICAgICBsaW5lV2lkdGgsXHJcbiAgICAgICAgICAgIGkgLSAyLFxyXG4gICAgICAgICAgICAoc3JjLmNsb3NlUGF0aCkgPyAoaSA9PT0gcGF0aExlbmd0aCAtIDEpIDogZmFsc2VcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBweDEgPSBweDI7XHJcbiAgICAgICAgcHkxID0gcHkyO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdHJva2VQYXRoV2ViR0w7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFyY1JlbmRlciA9IHJlcXVpcmUoJy4vQXJjUmVuZGVyJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBEZWdUb1JhZCA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvRGVnVG9SYWQnKTtcclxudmFyIEVhcmN1dCA9IHJlcXVpcmUoJy4uLy4uLy4uL2dlb20vcG9seWdvbi9FYXJjdXQnKTtcclxudmFyIEdlb21DaXJjbGUgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL2NpcmNsZS9DaXJjbGUnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBTaGFwZSA9IHJlcXVpcmUoJy4uL1NoYXBlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgQXJjIFNoYXBlIGlzIGEgR2FtZSBPYmplY3QgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBTY2VuZSwgR3JvdXAgb3IgQ29udGFpbmVyLiBZb3UgY2FuXHJcbiAqIHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIEdhbWUgT2JqZWN0IGluIHlvdXIgZ2FtZSwgc3VjaCBhcyB0d2VlbmluZyBpdCwgc2NhbGluZyBpdCwgb3IgZW5hYmxpbmdcclxuICogaXQgZm9yIGlucHV0IG9yIHBoeXNpY3MuIEl0IHByb3ZpZGVzIGEgcXVpY2sgYW5kIGVhc3kgd2F5IGZvciB5b3UgdG8gcmVuZGVyIHRoaXMgc2hhcGUgaW4geW91clxyXG4gKiBnYW1lIHdpdGhvdXQgdXNpbmcgYSB0ZXh0dXJlLCB3aGlsZSBzdGlsbCB0YWtpbmcgYWR2YW50YWdlIG9mIGJlaW5nIGZ1bGx5IGJhdGNoZWQgaW4gV2ViR0wuXHJcbiAqIFxyXG4gKiBUaGlzIHNoYXBlIHN1cHBvcnRzIGJvdGggZmlsbCBhbmQgc3Ryb2tlIGNvbG9ycy5cclxuICogXHJcbiAqIFdoZW4gaXQgcmVuZGVycyBpdCBkaXNwbGF5cyBhbiBhcmMgc2hhcGUuIFlvdSBjYW4gY29udHJvbCB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZXMgb2YgdGhlIGFyYyxcclxuICogYXMgd2VsbCBhcyBpZiB0aGUgYW5nbGVzIGFyZSB3aW5kaW5nIGNsb2Nrd2lzZSBvciBhbnRpLWNsb2Nrd2lzZS4gV2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5nc1xyXG4gKiBpdCByZW5kZXJzIGFzIGEgY29tcGxldGUgY2lyY2xlLiBCeSBjaGFuZ2luZyB0aGUgYW5nbGVzIHlvdSBjYW4gY3JlYXRlIG90aGVyIGFyYyBzaGFwZXMsXHJcbiAqIHN1Y2ggYXMgaGFsZi1jaXJjbGVzLlxyXG4gKiBcclxuICogQXJjcyBhbHNvIGhhdmUgYW4gYGl0ZXJhdGlvbnNgIHByb3BlcnR5IGFuZCBjb3JyZXNwb25kaW5nIGBzZXRJdGVyYXRpb25zYCBtZXRob2QuIFRoaXMgYWxsb3dzXHJcbiAqIHlvdSB0byBjb250cm9sIGhvdyBzbW9vdGggdGhlIHNoYXBlIHJlbmRlcnMgaW4gV2ViR0wsIGJ5IGNvbnRyb2xsaW5nIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uc1xyXG4gKiB0aGF0IHRha2UgcGxhY2UgZHVyaW5nIGNvbnN0cnVjdGlvbi5cclxuICpcclxuICogQGNsYXNzIEFyY1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xMjhdIC0gVGhlIHJhZGl1cyBvZiB0aGUgYXJjLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEFuZ2xlPTBdIC0gVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMsIGluIGRlZ3JlZXMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2VuZEFuZ2xlPTM2MF0gLSBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBhcmMsIGluIGRlZ3JlZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FudGljbG9ja3dpc2U9ZmFsc2VdIC0gVGhlIHdpbmRpbmcgb3JkZXIgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGVzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxDb2xvcl0gLSBUaGUgY29sb3IgdGhlIGFyYyB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgYXJjIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gKi9cclxudmFyIEFyYyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU2hhcGUsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQXJjUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQXJjIChzY2VuZSwgeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW50aWNsb2Nrd2lzZSwgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAocmFkaXVzID09PSB1bmRlZmluZWQpIHsgcmFkaXVzID0gMTI4OyB9XHJcbiAgICAgICAgaWYgKHN0YXJ0QW5nbGUgPT09IHVuZGVmaW5lZCkgeyBzdGFydEFuZ2xlID0gMDsgfVxyXG4gICAgICAgIGlmIChlbmRBbmdsZSA9PT0gdW5kZWZpbmVkKSB7IGVuZEFuZ2xlID0gMzYwOyB9XHJcbiAgICAgICAgaWYgKGFudGljbG9ja3dpc2UgPT09IHVuZGVmaW5lZCkgeyBhbnRpY2xvY2t3aXNlID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgU2hhcGUuY2FsbCh0aGlzLCBzY2VuZSwgJ0FyYycsIG5ldyBHZW9tQ2lyY2xlKDAsIDAsIHJhZGl1cykpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgc3RhcnQgYW5nbGUgaW4gZGVncmVlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjX3N0YXJ0QW5nbGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zdGFydEFuZ2xlID0gc3RhcnRBbmdsZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIGVuZCBhbmdsZSBpbiBkZWdyZWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkFyYyNfZW5kQW5nbGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbmRBbmdsZSA9IGVuZEFuZ2xlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgd2luZGluZyBvcmRlciBvZiB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQXJjI19hbnRpY2xvY2t3aXNlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fYW50aWNsb2Nrd2lzZSA9IGFudGljbG9ja3dpc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuIEhvbGRzIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB1c2VkIHdoZW4gZHJhd2luZyB0aGUgYXJjLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkFyYyNfaXRlcmF0aW9uc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMC4wMVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2l0ZXJhdGlvbnMgPSAwLjAxO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG5cclxuICAgICAgICB2YXIgZGlhbWV0ZXIgPSB0aGlzLmdlb20ucmFkaXVzICogMjtcclxuICAgICAgICB0aGlzLnNldFNpemUoZGlhbWV0ZXIsIGRpYW1ldGVyKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsU3R5bGUoZmlsbENvbG9yLCBmaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBhcmMuXHJcbiAgICAgKiBJbmNyZWFzZSB0aGlzIHZhbHVlIGZvciBzbW9vdGhlciBhcmNzLCBhdCB0aGUgY29zdCBvZiBtb3JlIHBvbHlnb25zIGJlaW5nIHJlbmRlcmVkLlxyXG4gICAgICogTW9kaWZ5IHRoaXMgdmFsdWUgYnkgc21hbGwgYW1vdW50cywgc3VjaCBhcyAwLjAxLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjaXRlcmF0aW9uc1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDAuMDFcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqL1xyXG4gICAgaXRlcmF0aW9uczoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlcmF0aW9ucztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2l0ZXJhdGlvbnMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJhZGl1cyBvZiB0aGUgYXJjLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjcmFkaXVzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICByYWRpdXM6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbS5yYWRpdXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmdlb20ucmFkaXVzID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGlhbWV0ZXIgPSB2YWx1ZSAqIDI7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2l6ZShkaWFtZXRlciwgZGlhbWV0ZXIpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYywgaW4gZGVncmVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQXJjI3N0YXJ0QW5nbGVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBzdGFydEFuZ2xlOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydEFuZ2xlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRBbmdsZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBhcmMsIGluIGRlZ3JlZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkFyYyNlbmRBbmdsZVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIGVuZEFuZ2xlOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmRBbmdsZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZEFuZ2xlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aW5kaW5nIG9yZGVyIG9mIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQXJjI2FudGljbG9ja3dpc2VcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBhbnRpY2xvY2t3aXNlOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbnRpY2xvY2t3aXNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fYW50aWNsb2Nrd2lzZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByYWRpdXMgb2YgdGhlIGFyYy5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjc2V0UmFkaXVzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHJhZGl1cyB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRSYWRpdXM6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJhZGl1cyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB1c2VkIHdoZW4gZHJhd2luZyB0aGUgYXJjLlxyXG4gICAgICogSW5jcmVhc2UgdGhpcyB2YWx1ZSBmb3Igc21vb3RoZXIgYXJjcywgYXQgdGhlIGNvc3Qgb2YgbW9yZSBwb2x5Z29ucyBiZWluZyByZW5kZXJlZC5cclxuICAgICAqIE1vZGlmeSB0aGlzIHZhbHVlIGJ5IHNtYWxsIGFtb3VudHMsIHN1Y2ggYXMgMC4wMS5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjc2V0SXRlcmF0aW9uc1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBpdGVyYXRpb25zIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEl0ZXJhdGlvbnM6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDAuMDE7IH1cclxuXHJcbiAgICAgICAgdGhpcy5pdGVyYXRpb25zID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHN0YXJ0aW5nIGFuZ2xlIG9mIHRoZSBhcmMsIGluIGRlZ3JlZXMuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQXJjI3NldFN0YXJ0QW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHN0YXJ0aW5nIGFuZ2xlIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFN0YXJ0QW5nbGU6IGZ1bmN0aW9uIChhbmdsZSwgYW50aWNsb2Nrd2lzZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9zdGFydEFuZ2xlID0gYW5nbGU7XHJcblxyXG4gICAgICAgIGlmIChhbnRpY2xvY2t3aXNlICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9hbnRpY2xvY2t3aXNlID0gYW50aWNsb2Nrd2lzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBlbmRpbmcgYW5nbGUgb2YgdGhlIGFyYywgaW4gZGVncmVlcy5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjc2V0RW5kQW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIGVuZGluZyBhbmdsZSB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRFbmRBbmdsZTogZnVuY3Rpb24gKGFuZ2xlLCBhbnRpY2xvY2t3aXNlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZEFuZ2xlID0gYW5nbGU7XHJcblxyXG4gICAgICAgIGlmIChhbnRpY2xvY2t3aXNlICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9hbnRpY2xvY2t3aXNlID0gYW50aWNsb2Nrd2lzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCB1cGRhdGVzIHRoZSBkYXRhIGFuZCBwYXRoIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjdXBkYXRlRGF0YVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVEYXRhOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdGVwID0gdGhpcy5faXRlcmF0aW9ucztcclxuICAgICAgICB2YXIgaXRlcmF0aW9uID0gc3RlcDtcclxuXHJcbiAgICAgICAgdmFyIHJhZGl1cyA9IHRoaXMuZ2VvbS5yYWRpdXM7XHJcbiAgICAgICAgdmFyIHN0YXJ0QW5nbGUgPSBEZWdUb1JhZCh0aGlzLl9zdGFydEFuZ2xlKTtcclxuICAgICAgICB2YXIgZW5kQW5nbGUgPSBEZWdUb1JhZCh0aGlzLl9lbmRBbmdsZSk7XHJcbiAgICAgICAgdmFyIGFudGljbG9ja3dpc2UgPSB0aGlzLl9hbnRpY2xvY2t3aXNlO1xyXG5cclxuICAgICAgICB2YXIgeCA9IHJhZGl1cztcclxuICAgICAgICB2YXIgeSA9IHJhZGl1cztcclxuXHJcbiAgICAgICAgZW5kQW5nbGUgLT0gc3RhcnRBbmdsZTtcclxuXHJcbiAgICAgICAgaWYgKGFudGljbG9ja3dpc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZW5kQW5nbGUgPCAtTUFUSF9DT05TVC5QSTIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGVuZEFuZ2xlID0gLU1BVEhfQ09OU1QuUEkyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVuZEFuZ2xlID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZW5kQW5nbGUgPSAtTUFUSF9DT05TVC5QSTIgKyBlbmRBbmdsZSAlIE1BVEhfQ09OU1QuUEkyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGVuZEFuZ2xlID4gTUFUSF9DT05TVC5QSTIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbmRBbmdsZSA9IE1BVEhfQ09OU1QuUEkyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbmRBbmdsZSA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbmRBbmdsZSA9IE1BVEhfQ09OU1QuUEkyICsgZW5kQW5nbGUgJSBNQVRIX0NPTlNULlBJMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwYXRoID0gWyB4ICsgTWF0aC5jb3Moc3RhcnRBbmdsZSkgKiByYWRpdXMsIHkgKyBNYXRoLnNpbihzdGFydEFuZ2xlKSAqIHJhZGl1cyBdO1xyXG5cclxuICAgICAgICB2YXIgdGE7XHJcblxyXG4gICAgICAgIHdoaWxlIChpdGVyYXRpb24gPCAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGEgPSBlbmRBbmdsZSAqIGl0ZXJhdGlvbiArIHN0YXJ0QW5nbGU7XHJcblxyXG4gICAgICAgICAgICBwYXRoLnB1c2goeCArIE1hdGguY29zKHRhKSAqIHJhZGl1cywgeSArIE1hdGguc2luKHRhKSAqIHJhZGl1cyk7XHJcblxyXG4gICAgICAgICAgICBpdGVyYXRpb24gKz0gc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRhID0gZW5kQW5nbGUgKyBzdGFydEFuZ2xlO1xyXG5cclxuICAgICAgICBwYXRoLnB1c2goeCArIE1hdGguY29zKHRhKSAqIHJhZGl1cywgeSArIE1hdGguc2luKHRhKSAqIHJhZGl1cyk7XHJcblxyXG4gICAgICAgIHBhdGgucHVzaCh4ICsgTWF0aC5jb3Moc3RhcnRBbmdsZSkgKiByYWRpdXMsIHkgKyBNYXRoLnNpbihzdGFydEFuZ2xlKSAqIHJhZGl1cyk7XHJcblxyXG4gICAgICAgIHRoaXMucGF0aEluZGV4ZXMgPSBFYXJjdXQocGF0aCk7XHJcbiAgICAgICAgdGhpcy5wYXRoRGF0YSA9IHBhdGg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyYztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRGVnVG9SYWQgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL0RlZ1RvUmFkJyk7XHJcbnZhciBGaWxsU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9GaWxsU3R5bGVDYW52YXMnKTtcclxudmFyIExpbmVTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0xpbmVTdHlsZUNhbnZhcycpO1xyXG52YXIgU2V0VHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkFyY30gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIEFyY0NhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIGlmIChTZXRUcmFuc2Zvcm0ocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJhZGl1cyA9IHNyYy5yYWRpdXM7XHJcblxyXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgY3R4LmFyYyhcclxuICAgICAgICAgICAgKHJhZGl1cykgLSBzcmMub3JpZ2luWCAqIChyYWRpdXMgKiAyKSxcclxuICAgICAgICAgICAgKHJhZGl1cykgLSBzcmMub3JpZ2luWSAqIChyYWRpdXMgKiAyKSxcclxuICAgICAgICAgICAgcmFkaXVzLFxyXG4gICAgICAgICAgICBEZWdUb1JhZChzcmMuX3N0YXJ0QW5nbGUpLFxyXG4gICAgICAgICAgICBEZWdUb1JhZChzcmMuX2VuZEFuZ2xlKSxcclxuICAgICAgICAgICAgc3JjLmFudGljbG9ja3dpc2VcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoc3JjLmNsb3NlUGF0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGluZVN0eWxlQ2FudmFzKGN0eCwgc3JjKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBSZXN0b3JlIHRoZSBjb250ZXh0IHNhdmVkIGluIFNldFRyYW5zZm9ybVxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyY0NhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBcmMgPSByZXF1aXJlKCcuL0FyYycpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi8uLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQXJjIFNoYXBlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQXJjIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogVGhlIEFyYyBTaGFwZSBpcyBhIEdhbWUgT2JqZWN0IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgU2NlbmUsIEdyb3VwIG9yIENvbnRhaW5lci4gWW91IGNhblxyXG4gKiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBHYW1lIE9iamVjdCBpbiB5b3VyIGdhbWUsIHN1Y2ggYXMgdHdlZW5pbmcgaXQsIHNjYWxpbmcgaXQsIG9yIGVuYWJsaW5nXHJcbiAqIGl0IGZvciBpbnB1dCBvciBwaHlzaWNzLiBJdCBwcm92aWRlcyBhIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgeW91IHRvIHJlbmRlciB0aGlzIHNoYXBlIGluIHlvdXJcclxuICogZ2FtZSB3aXRob3V0IHVzaW5nIGEgdGV4dHVyZSwgd2hpbGUgc3RpbGwgdGFraW5nIGFkdmFudGFnZSBvZiBiZWluZyBmdWxseSBiYXRjaGVkIGluIFdlYkdMLlxyXG4gKiBcclxuICogVGhpcyBzaGFwZSBzdXBwb3J0cyBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMuXHJcbiAqIFxyXG4gKiBXaGVuIGl0IHJlbmRlcnMgaXQgZGlzcGxheXMgYW4gYXJjIHNoYXBlLiBZb3UgY2FuIGNvbnRyb2wgdGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGVzIG9mIHRoZSBhcmMsXHJcbiAqIGFzIHdlbGwgYXMgaWYgdGhlIGFuZ2xlcyBhcmUgd2luZGluZyBjbG9ja3dpc2Ugb3IgYW50aS1jbG9ja3dpc2UuIFdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3NcclxuICogaXQgcmVuZGVycyBhcyBhIGNvbXBsZXRlIGNpcmNsZS4gQnkgY2hhbmdpbmcgdGhlIGFuZ2xlcyB5b3UgY2FuIGNyZWF0ZSBvdGhlciBhcmMgc2hhcGVzLFxyXG4gKiBzdWNoIGFzIGhhbGYtY2lyY2xlcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjYXJjXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTI4XSAtIFRoZSByYWRpdXMgb2YgdGhlIGFyYy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnRBbmdsZT0wXSAtIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjLCBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRBbmdsZT0zNjBdIC0gVGhlIGVuZCBhbmdsZSBvZiB0aGUgYXJjLCBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthbnRpY2xvY2t3aXNlPWZhbHNlXSAtIFRoZSB3aW5kaW5nIG9yZGVyIG9mIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBhcmMgd2lsbCBiZSBmaWxsZWQgd2l0aCwgaS5lLiAweGZmMDAwMCBmb3IgcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxBbHBoYV0gLSBUaGUgYWxwaGEgdGhlIGFyYyB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkFyY30gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignYXJjJywgZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGFudGljbG9ja3dpc2UsIGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IEFyYyh0aGlzLnNjZW5lLCB4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBhbnRpY2xvY2t3aXNlLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSkpO1xyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IENpcmNsZSBTaGFwZSBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqIFxyXG4gKiBBIENpcmNsZSBpcyBhbiBBcmMgd2l0aCBubyBkZWZpbmVkIHN0YXJ0IGFuZCBlbmQgYW5nbGUsIG1ha2luZyBpdCByZW5kZXIgYXMgYSBjb21wbGV0ZSBjaXJjbGUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEFyYyBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjY2lyY2xlXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTI4XSAtIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBjaXJjbGUgd2lsbCBiZSBmaWxsZWQgd2l0aCwgaS5lLiAweGZmMDAwMCBmb3IgcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxBbHBoYV0gLSBUaGUgYWxwaGEgdGhlIGNpcmNsZSB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkFyY30gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignY2lyY2xlJywgZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgQXJjKHRoaXMuc2NlbmUsIHgsIHksIHJhZGl1cywgMCwgMzYwLCBmYWxzZSwgZmlsbENvbG9yLCBmaWxsQWxwaGEpKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL0FyY1dlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vQXJjQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxQYXRoV2ViR0wgPSByZXF1aXJlKCcuLi9GaWxsUGF0aFdlYkdMJyk7XHJcbnZhciBTdHJva2VQYXRoV2ViR0wgPSByZXF1aXJlKCcuLi9TdHJva2VQYXRoV2ViR0wnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5BcmMjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQXJjfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgQXJjV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzaGFwZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHJlbmRlcmVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHJcbiAgICBzaGFwZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgPSBzcmMueTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBzaGFwZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbU1hdHJpeC5tdWx0aXBseShzaGFwZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcblxyXG4gICAgdmFyIGR4ID0gc3JjLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgIHZhciBkeSA9IHNyYy5fZGlzcGxheU9yaWdpblk7XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgRmlsbFBhdGhXZWJHTChwaXBlbGluZSwgY2FsY01hdHJpeCwgc3JjLCBhbHBoYSwgZHgsIGR5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgIHtcclxuICAgICAgICBTdHJva2VQYXRoV2ViR0wocGlwZWxpbmUsIHNyYywgYWxwaGEsIGR4LCBkeSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyY1dlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEN1cnZlUmVuZGVyID0gcmVxdWlyZSgnLi9DdXJ2ZVJlbmRlcicpO1xyXG52YXIgRWFyY3V0ID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9wb2x5Z29uL0VhcmN1dCcpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBTaGFwZSA9IHJlcXVpcmUoJy4uL1NoYXBlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgQ3VydmUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogVG8gcmVuZGVyIGEgQ3VydmUgU2hhcGUgeW91IG11c3QgZmlyc3QgY3JlYXRlIGEgYFBoYXNlci5DdXJ2ZXMuQ3VydmVgIG9iamVjdCwgdGhlbiBwYXNzIGl0IHRvXHJcbiAqIHRoZSBDdXJ2ZSBTaGFwZSBpbiB0aGUgY29uc3RydWN0b3IuXHJcbiAqIFxyXG4gKiBUaGUgQ3VydmUgc2hhcGUgYWxzbyBoYXMgYSBgc21vb3RobmVzc2AgcHJvcGVydHkgYW5kIGNvcnJlc3BvbmRpbmcgYHNldFNtb290aG5lc3NgIG1ldGhvZC5cclxuICogVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgaG93IHNtb290aCB0aGUgc2hhcGUgcmVuZGVycyBpbiBXZWJHTCwgYnkgY29udHJvbGxpbmcgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zXHJcbiAqIHRoYXQgdGFrZSBwbGFjZSBkdXJpbmcgY29uc3RydWN0aW9uLiBJbmNyZWFzZSBhbmQgZGVjcmVhc2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNtb290aGVyLCBvciBtb3JlXHJcbiAqIGphZ2dlZCwgc2hhcGVzLlxyXG4gKlxyXG4gKiBAY2xhc3MgQ3VydmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtQaGFzZXIuQ3VydmVzLkN1cnZlfSBbY3VydmVdIC0gVGhlIEN1cnZlIG9iamVjdCB0byB1c2UgdG8gY3JlYXRlIHRoZSBTaGFwZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBjdXJ2ZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgY3VydmUgd2lsbCBiZSBmaWxsZWQgd2l0aC4gWW91IGNhbiBhbHNvIHNldCB0aGUgYWxwaGEgb2YgdGhlIG92ZXJhbGwgU2hhcGUgdXNpbmcgaXRzIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAqL1xyXG52YXIgQ3VydmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFNoYXBlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIEN1cnZlUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQ3VydmUgKHNjZW5lLCB4LCB5LCBjdXJ2ZSwgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuXHJcbiAgICAgICAgU2hhcGUuY2FsbCh0aGlzLCBzY2VuZSwgJ0N1cnZlJywgY3VydmUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgcG9pbnRzIHVzZWQgdG8gZHJhdyB0aGUgY3VydmUuIEhpZ2hlciB2YWx1ZXMgY3JlYXRlIHNtb290aGVyIHJlbmRlcnMgYXQgdGhlIGNvc3Qgb2YgbW9yZSB0cmlhbmdsZXMgYmVpbmcgZHJhd24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ3VydmUjX3Ntb290aG5lc3NcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zbW9vdGhuZXNzID0gMzI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuXHJcbiAgICAgICAgICogVGhlIEN1cnZlIGJvdW5kcyByZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuQ3VydmUjX2N1cnZlQm91bmRzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HZW9tLlJlY3RhbmdsZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jdXJ2ZUJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jbG9zZVBhdGggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsU3R5bGUoZmlsbENvbG9yLCBmaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNtb290aG5lc3Mgb2YgdGhlIGN1cnZlLiBUaGUgbnVtYmVyIG9mIHBvaW50cyB1c2VkIHdoZW4gcmVuZGVyaW5nIGl0LlxyXG4gICAgICogSW5jcmVhc2UgdGhpcyB2YWx1ZSBmb3Igc21vb3RoZXIgY3VydmVzLCBhdCB0aGUgY29zdCBvZiBtb3JlIHBvbHlnb25zIGJlaW5nIHJlbmRlcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5DdXJ2ZSNzbW9vdGhuZXNzXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBkZWZhdWx0IDMyXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIHNtb290aG5lc3M6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Ntb290aG5lc3M7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zbW9vdGhuZXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNtb290aG5lc3Mgb2YgdGhlIGN1cnZlLiBUaGUgbnVtYmVyIG9mIHBvaW50cyB1c2VkIHdoZW4gcmVuZGVyaW5nIGl0LlxyXG4gICAgICogSW5jcmVhc2UgdGhpcyB2YWx1ZSBmb3Igc21vb3RoZXIgY3VydmVzLCBhdCB0aGUgY29zdCBvZiBtb3JlIHBvbHlnb25zIGJlaW5nIHJlbmRlcmVkLlxyXG4gICAgICogVGhpcyBjYWxsIGNhbiBiZSBjaGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkN1cnZlI3NldFNtb290aG5lc3NcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHNtb290aG5lc3MgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U21vb3RobmVzczogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3Ntb290aG5lc3MgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHVwZGF0ZXMgdGhlIGRhdGEgYW5kIHBhdGggdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkN1cnZlI3VwZGF0ZURhdGFcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRGF0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fY3VydmVCb3VuZHM7XHJcbiAgICAgICAgdmFyIHNtb290aG5lc3MgPSB0aGlzLl9zbW9vdGhuZXNzO1xyXG5cclxuICAgICAgICAvLyAgVXBkYXRlIHRoZSBib3VuZHMgaW4gY2FzZSB0aGUgdW5kZXJseWluZyBkYXRhIGhhcyBjaGFuZ2VkXHJcbiAgICAgICAgdGhpcy5nZW9tLmdldEJvdW5kcyhib3VuZHMsIHNtb290aG5lc3MpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNpemUoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuXHJcbiAgICAgICAgdmFyIHBhdGggPSBbXTtcclxuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5nZW9tLmdldFBvaW50cyhzbW9vdGhuZXNzKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXRoLnB1c2gocG9pbnRzW2ldLngsIHBvaW50c1tpXS55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhdGgucHVzaChwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnkpO1xyXG5cclxuICAgICAgICB0aGlzLnBhdGhJbmRleGVzID0gRWFyY3V0KHBhdGgpO1xyXG4gICAgICAgIHRoaXMucGF0aERhdGEgPSBwYXRoO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDdXJ2ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmlsbFN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vRmlsbFN0eWxlQ2FudmFzJyk7XHJcbnZhciBMaW5lU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9MaW5lU3R5bGVDYW52YXMnKTtcclxudmFyIFNldFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4uLy4uLy4uL3JlbmRlcmVyL2NhbnZhcy91dGlscy9TZXRUcmFuc2Zvcm0nKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuQ3VydmUjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkN1cnZlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgQ3VydmVDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBjdHggPSByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICBpZiAoU2V0VHJhbnNmb3JtKHJlbmRlcmVyLCBjdHgsIHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblggKyBzcmMuX2N1cnZlQm91bmRzLng7XHJcbiAgICAgICAgdmFyIGR5ID0gc3JjLl9kaXNwbGF5T3JpZ2luWSArIHNyYy5fY3VydmVCb3VuZHMueTtcclxuICAgIFxyXG4gICAgICAgIHZhciBwYXRoID0gc3JjLnBhdGhEYXRhO1xyXG4gICAgICAgIHZhciBwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggLSAxO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIHB4MSA9IHBhdGhbMF0gLSBkeDtcclxuICAgICAgICB2YXIgcHkxID0gcGF0aFsxXSAtIGR5O1xyXG5cclxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgIGN0eC5tb3ZlVG8ocHgxLCBweTEpO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKCFzcmMuY2xvc2VQYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aExlbmd0aCAtPSAyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgcGF0aExlbmd0aDsgaSArPSAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHB4MiA9IHBhdGhbaV0gLSBkeDtcclxuICAgICAgICAgICAgdmFyIHB5MiA9IHBhdGhbaSArIDFdIC0gZHk7XHJcbiAgICBcclxuICAgICAgICAgICAgY3R4LmxpbmVUbyhweDIsIHB5Mik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3JjLmNsb3NlUGF0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGluZVN0eWxlQ2FudmFzKGN0eCwgc3JjKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBSZXN0b3JlIHRoZSBjb250ZXh0IHNhdmVkIGluIFNldFRyYW5zZm9ybVxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEN1cnZlQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIEN1cnZlID0gcmVxdWlyZSgnLi9DdXJ2ZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgQ3VydmUgU2hhcGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBDdXJ2ZSBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogXHJcbiAqIFRoZSBDdXJ2ZSBTaGFwZSBpcyBhIEdhbWUgT2JqZWN0IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgU2NlbmUsIEdyb3VwIG9yIENvbnRhaW5lci4gWW91IGNhblxyXG4gKiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBHYW1lIE9iamVjdCBpbiB5b3VyIGdhbWUsIHN1Y2ggYXMgdHdlZW5pbmcgaXQsIHNjYWxpbmcgaXQsIG9yIGVuYWJsaW5nXHJcbiAqIGl0IGZvciBpbnB1dCBvciBwaHlzaWNzLiBJdCBwcm92aWRlcyBhIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgeW91IHRvIHJlbmRlciB0aGlzIHNoYXBlIGluIHlvdXJcclxuICogZ2FtZSB3aXRob3V0IHVzaW5nIGEgdGV4dHVyZSwgd2hpbGUgc3RpbGwgdGFraW5nIGFkdmFudGFnZSBvZiBiZWluZyBmdWxseSBiYXRjaGVkIGluIFdlYkdMLlxyXG4gKiBcclxuICogVGhpcyBzaGFwZSBzdXBwb3J0cyBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMuXHJcbiAqIFxyXG4gKiBUbyByZW5kZXIgYSBDdXJ2ZSBTaGFwZSB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBgUGhhc2VyLkN1cnZlcy5DdXJ2ZWAgb2JqZWN0LCB0aGVuIHBhc3MgaXQgdG9cclxuICogdGhlIEN1cnZlIFNoYXBlIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuICogXHJcbiAqIFRoZSBDdXJ2ZSBzaGFwZSBhbHNvIGhhcyBhIGBzbW9vdGhuZXNzYCBwcm9wZXJ0eSBhbmQgY29ycmVzcG9uZGluZyBgc2V0U21vb3RobmVzc2AgbWV0aG9kLlxyXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gY29udHJvbCBob3cgc21vb3RoIHRoZSBzaGFwZSByZW5kZXJzIGluIFdlYkdMLCBieSBjb250cm9sbGluZyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnNcclxuICogdGhhdCB0YWtlIHBsYWNlIGR1cmluZyBjb25zdHJ1Y3Rpb24uIEluY3JlYXNlIGFuZCBkZWNyZWFzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc21vb3RoZXIsIG9yIG1vcmVcclxuICogamFnZ2VkLCBzaGFwZXMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I2N1cnZlXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtQaGFzZXIuQ3VydmVzLkN1cnZlfSBbY3VydmVdIC0gVGhlIEN1cnZlIG9iamVjdCB0byB1c2UgdG8gY3JlYXRlIHRoZSBTaGFwZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBjdXJ2ZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgY3VydmUgd2lsbCBiZSBmaWxsZWQgd2l0aC4gWW91IGNhbiBhbHNvIHNldCB0aGUgYWxwaGEgb2YgdGhlIG92ZXJhbGwgU2hhcGUgdXNpbmcgaXRzIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5DdXJ2ZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignY3VydmUnLCBmdW5jdGlvbiAoeCwgeSwgY3VydmUsIGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IEN1cnZlKHRoaXMuc2NlbmUsIHgsIHksIGN1cnZlLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSkpO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vQ3VydmVXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0N1cnZlQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxQYXRoV2ViR0wgPSByZXF1aXJlKCcuLi9GaWxsUGF0aFdlYkdMJyk7XHJcbnZhciBTdHJva2VQYXRoV2ViR0wgPSByZXF1aXJlKCcuLi9TdHJva2VQYXRoV2ViR0wnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5DdXJ2ZSNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5DdXJ2ZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIEN1cnZlV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzaGFwZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHJlbmRlcmVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHJcbiAgICBzaGFwZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgPSBzcmMueTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBzaGFwZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbU1hdHJpeC5tdWx0aXBseShzaGFwZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcblxyXG4gICAgdmFyIGR4ID0gc3JjLl9kaXNwbGF5T3JpZ2luWCArIHNyYy5fY3VydmVCb3VuZHMueDtcclxuICAgIHZhciBkeSA9IHNyYy5fZGlzcGxheU9yaWdpblkgKyBzcmMuX2N1cnZlQm91bmRzLnk7XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgRmlsbFBhdGhXZWJHTChwaXBlbGluZSwgY2FsY01hdHJpeCwgc3JjLCBhbHBoYSwgZHgsIGR5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgIHtcclxuICAgICAgICBTdHJva2VQYXRoV2ViR0wocGlwZWxpbmUsIHNyYywgYWxwaGEsIGR4LCBkeSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEN1cnZlV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRWFyY3V0ID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9wb2x5Z29uL0VhcmN1dCcpO1xyXG52YXIgRWxsaXBzZVJlbmRlciA9IHJlcXVpcmUoJy4vRWxsaXBzZVJlbmRlcicpO1xyXG52YXIgR2VvbUVsbGlwc2UgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL2VsbGlwc2UvRWxsaXBzZScpO1xyXG52YXIgU2hhcGUgPSByZXF1aXJlKCcuLi9TaGFwZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEVsbGlwc2UgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogV2hlbiBpdCByZW5kZXJzIGl0IGRpc3BsYXlzIGFuIGVsbGlwc2Ugc2hhcGUuIFlvdSBjYW4gY29udHJvbCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cclxuICogSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgbWF0Y2ggaXQgd2lsbCByZW5kZXIgYXMgYSBjaXJjbGUuIElmIHRoZSB3aWR0aCBpcyBsZXNzIHRoYW4gdGhlIGhlaWdodCxcclxuICogaXQgd2lsbCBsb29rIG1vcmUgbGlrZSBhbiBlZ2cgc2hhcGUuXHJcbiAqIFxyXG4gKiBUaGUgRWxsaXBzZSBzaGFwZSBhbHNvIGhhcyBhIGBzbW9vdGhuZXNzYCBwcm9wZXJ0eSBhbmQgY29ycmVzcG9uZGluZyBgc2V0U21vb3RobmVzc2AgbWV0aG9kLlxyXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gY29udHJvbCBob3cgc21vb3RoIHRoZSBzaGFwZSByZW5kZXJzIGluIFdlYkdMLCBieSBjb250cm9sbGluZyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnNcclxuICogdGhhdCB0YWtlIHBsYWNlIGR1cmluZyBjb25zdHJ1Y3Rpb24uIEluY3JlYXNlIGFuZCBkZWNyZWFzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc21vb3RoZXIsIG9yIG1vcmVcclxuICogamFnZ2VkLCBzaGFwZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBFbGxpcHNlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5TaGFwZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MTI4XSAtIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZS4gQW4gZWxsaXBzZSB3aXRoIGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgcmVuZGVycyBhcyBhIGNpcmNsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UuIEFuIGVsbGlwc2Ugd2l0aCBlcXVhbCB3aWR0aCBhbmQgaGVpZ2h0IHJlbmRlcnMgYXMgYSBjaXJjbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgZWxsaXBzZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgZWxsaXBzZSB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICovXHJcbnZhciBFbGxpcHNlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBTaGFwZSxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBFbGxpcHNlUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRWxsaXBzZSAoc2NlbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAxMjg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMTI4OyB9XHJcblxyXG4gICAgICAgIFNoYXBlLmNhbGwodGhpcywgc2NlbmUsICdFbGxpcHNlJywgbmV3IEdlb21FbGxpcHNlKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgd2lkdGgsIGhlaWdodCkpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgcG9pbnRzIHVzZWQgdG8gZHJhdyB0aGUgY3VydmUuIEhpZ2hlciB2YWx1ZXMgY3JlYXRlIHNtb290aGVyIHJlbmRlcnMgYXQgdGhlIGNvc3Qgb2YgbW9yZSB0cmlhbmdsZXMgYmVpbmcgZHJhd24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRWxsaXBzZSNfc21vb3RobmVzc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3Ntb290aG5lc3MgPSA2NDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoZmlsbENvbG9yICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEZpbGxTdHlsZShmaWxsQ29sb3IsIGZpbGxBbHBoYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc21vb3RobmVzcyBvZiB0aGUgZWxsaXBzZS4gVGhlIG51bWJlciBvZiBwb2ludHMgdXNlZCB3aGVuIHJlbmRlcmluZyBpdC5cclxuICAgICAqIEluY3JlYXNlIHRoaXMgdmFsdWUgZm9yIGEgc21vb3RoZXIgZWxsaXBzZSwgYXQgdGhlIGNvc3Qgb2YgbW9yZSBwb2x5Z29ucyBiZWluZyByZW5kZXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuRWxsaXBzZSNzbW9vdGhuZXNzXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBkZWZhdWx0IDY0XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIHNtb290aG5lc3M6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Ntb290aG5lc3M7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zbW9vdGhuZXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGVsbGlwc2UgYnkgY2hhbmdpbmcgdGhlIHVuZGVybHlpbmcgZ2VvbWV0cnkgZGF0YSwgcmF0aGVyIHRoYW4gc2NhbGluZyB0aGUgb2JqZWN0LlxyXG4gICAgICogVGhpcyBjYWxsIGNhbiBiZSBjaGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkVsbGlwc2Ujc2V0U2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdlb20uc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNtb290aG5lc3Mgb2YgdGhlIGVsbGlwc2UuIFRoZSBudW1iZXIgb2YgcG9pbnRzIHVzZWQgd2hlbiByZW5kZXJpbmcgaXQuXHJcbiAgICAgKiBJbmNyZWFzZSB0aGlzIHZhbHVlIGZvciBhIHNtb290aGVyIGVsbGlwc2UsIGF0IHRoZSBjb3N0IG9mIG1vcmUgcG9seWdvbnMgYmVpbmcgcmVuZGVyZWQuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRWxsaXBzZSNzZXRTbW9vdGhuZXNzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBzbW9vdGhuZXNzIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNtb290aG5lc3M6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9zbW9vdGhuZXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCB1cGRhdGVzIHRoZSBkYXRhIGFuZCBwYXRoIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5FbGxpcHNlI3VwZGF0ZURhdGFcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRGF0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aCA9IFtdO1xyXG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmdlb20uZ2V0UG9pbnRzKHRoaXMuX3Ntb290aG5lc3MpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaChwb2ludHNbaV0ueCwgcG9pbnRzW2ldLnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGF0aC5wdXNoKHBvaW50c1swXS54LCBwb2ludHNbMF0ueSk7XHJcblxyXG4gICAgICAgIHRoaXMucGF0aEluZGV4ZXMgPSBFYXJjdXQocGF0aCk7XHJcbiAgICAgICAgdGhpcy5wYXRoRGF0YSA9IHBhdGg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVsbGlwc2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0ZpbGxTdHlsZUNhbnZhcycpO1xyXG52YXIgTGluZVN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vTGluZVN0eWxlQ2FudmFzJyk7XHJcbnZhciBTZXRUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci9jYW52YXMvdXRpbHMvU2V0VHJhbnNmb3JtJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkVsbGlwc2UjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkVsbGlwc2V9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBFbGxpcHNlQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgaWYgKFNldFRyYW5zZm9ybShyZW5kZXJlciwgY3R4LCBzcmMsIGNhbWVyYSwgcGFyZW50TWF0cml4KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSBzcmMuX2Rpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciBkeSA9IHNyYy5fZGlzcGxheU9yaWdpblk7XHJcblxyXG4gICAgICAgIHZhciBwYXRoID0gc3JjLnBhdGhEYXRhO1xyXG4gICAgICAgIHZhciBwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggLSAxO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIHB4MSA9IHBhdGhbMF0gLSBkeDtcclxuICAgICAgICB2YXIgcHkxID0gcGF0aFsxXSAtIGR5O1xyXG5cclxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgIGN0eC5tb3ZlVG8ocHgxLCBweTEpO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKCFzcmMuY2xvc2VQYXRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aExlbmd0aCAtPSAyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgcGF0aExlbmd0aDsgaSArPSAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHB4MiA9IHBhdGhbaV0gLSBkeDtcclxuICAgICAgICAgICAgdmFyIHB5MiA9IHBhdGhbaSArIDFdIC0gZHk7XHJcbiAgICBcclxuICAgICAgICAgICAgY3R4LmxpbmVUbyhweDIsIHB5Mik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGluZVN0eWxlQ2FudmFzKGN0eCwgc3JjKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBSZXN0b3JlIHRoZSBjb250ZXh0IHNhdmVkIGluIFNldFRyYW5zZm9ybVxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVsbGlwc2VDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRWxsaXBzZSA9IHJlcXVpcmUoJy4vRWxsaXBzZScpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi8uLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgRWxsaXBzZSBTaGFwZSBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEVsbGlwc2UgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIFxyXG4gKiBUaGUgRWxsaXBzZSBTaGFwZSBpcyBhIEdhbWUgT2JqZWN0IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgU2NlbmUsIEdyb3VwIG9yIENvbnRhaW5lci4gWW91IGNhblxyXG4gKiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBHYW1lIE9iamVjdCBpbiB5b3VyIGdhbWUsIHN1Y2ggYXMgdHdlZW5pbmcgaXQsIHNjYWxpbmcgaXQsIG9yIGVuYWJsaW5nXHJcbiAqIGl0IGZvciBpbnB1dCBvciBwaHlzaWNzLiBJdCBwcm92aWRlcyBhIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgeW91IHRvIHJlbmRlciB0aGlzIHNoYXBlIGluIHlvdXJcclxuICogZ2FtZSB3aXRob3V0IHVzaW5nIGEgdGV4dHVyZSwgd2hpbGUgc3RpbGwgdGFraW5nIGFkdmFudGFnZSBvZiBiZWluZyBmdWxseSBiYXRjaGVkIGluIFdlYkdMLlxyXG4gKiBcclxuICogVGhpcyBzaGFwZSBzdXBwb3J0cyBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMuXHJcbiAqIFxyXG4gKiBXaGVuIGl0IHJlbmRlcnMgaXQgZGlzcGxheXMgYW4gZWxsaXBzZSBzaGFwZS4gWW91IGNhbiBjb250cm9sIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlLlxyXG4gKiBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBtYXRjaCBpdCB3aWxsIHJlbmRlciBhcyBhIGNpcmNsZS4gSWYgdGhlIHdpZHRoIGlzIGxlc3MgdGhhbiB0aGUgaGVpZ2h0LFxyXG4gKiBpdCB3aWxsIGxvb2sgbW9yZSBsaWtlIGFuIGVnZyBzaGFwZS5cclxuICogXHJcbiAqIFRoZSBFbGxpcHNlIHNoYXBlIGFsc28gaGFzIGEgYHNtb290aG5lc3NgIHByb3BlcnR5IGFuZCBjb3JyZXNwb25kaW5nIGBzZXRTbW9vdGhuZXNzYCBtZXRob2QuXHJcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBjb250cm9sIGhvdyBzbW9vdGggdGhlIHNoYXBlIHJlbmRlcnMgaW4gV2ViR0wsIGJ5IGNvbnRyb2xsaW5nIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uc1xyXG4gKiB0aGF0IHRha2UgcGxhY2UgZHVyaW5nIGNvbnN0cnVjdGlvbi4gSW5jcmVhc2UgYW5kIGRlY3JlYXNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBzbW9vdGhlciwgb3IgbW9yZVxyXG4gKiBqYWdnZWQsIHNoYXBlcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjZWxsaXBzZVxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MTI4XSAtIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZS4gQW4gZWxsaXBzZSB3aXRoIGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQgcmVuZGVycyBhcyBhIGNpcmNsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UuIEFuIGVsbGlwc2Ugd2l0aCBlcXVhbCB3aWR0aCBhbmQgaGVpZ2h0IHJlbmRlcnMgYXMgYSBjaXJjbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgZWxsaXBzZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgZWxsaXBzZSB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkVsbGlwc2V9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2VsbGlwc2UnLCBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgRWxsaXBzZSh0aGlzLnNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsQ29sb3IsIGZpbGxBbHBoYSkpO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vRWxsaXBzZVdlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vRWxsaXBzZUNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGaWxsUGF0aFdlYkdMID0gcmVxdWlyZSgnLi4vRmlsbFBhdGhXZWJHTCcpO1xyXG52YXIgU3Ryb2tlUGF0aFdlYkdMID0gcmVxdWlyZSgnLi4vU3Ryb2tlUGF0aFdlYkdMJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuRWxsaXBzZSNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5FbGxpcHNlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgRWxsaXBzZVdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDE7XHJcbiAgICB2YXIgc2hhcGVNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mID0gc3JjLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuICAgIH1cclxuXHJcbiAgICBjYW1NYXRyaXgubXVsdGlwbHkoc2hhcGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICB2YXIgZHkgPSBzcmMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgIHZhciBhbHBoYSA9IGNhbWVyYS5hbHBoYSAqIHNyYy5hbHBoYTtcclxuXHJcbiAgICBpZiAoc3JjLmlzRmlsbGVkKVxyXG4gICAge1xyXG4gICAgICAgIEZpbGxQYXRoV2ViR0wocGlwZWxpbmUsIGNhbGNNYXRyaXgsIHNyYywgYWxwaGEsIGR4LCBkeSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNyYy5pc1N0cm9rZWQpXHJcbiAgICB7XHJcbiAgICAgICAgU3Ryb2tlUGF0aFdlYkdMKHBpcGVsaW5lLCBzcmMsIGFscGhhLCBkeCwgZHkpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFbGxpcHNlV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgU2hhcGUgPSByZXF1aXJlKCcuLi9TaGFwZScpO1xyXG52YXIgR3JpZFJlbmRlciA9IHJlcXVpcmUoJy4vR3JpZFJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEdyaWQgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBmaWxsIGNvbG9ycyBhbmQgY2Fubm90IGJlIHN0cm9rZWQuXHJcbiAqIFxyXG4gKiBBIEdyaWQgU2hhcGUgYWxsb3dzIHlvdSB0byBkaXNwbGF5IGEgZ3JpZCBpbiB5b3VyIGdhbWUsIHdoZXJlIHlvdSBjYW4gY29udHJvbCB0aGUgc2l6ZSBvZiB0aGVcclxuICogZ3JpZCBhcyB3ZWxsIGFzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBncmlkIGNlbGxzLiBZb3UgY2FuIHNldCBhIGZpbGwgY29sb3IgZm9yIGVhY2ggZ3JpZFxyXG4gKiBjZWxsIGFzIHdlbGwgYXMgYW4gYWx0ZXJuYXRlIGZpbGwgY29sb3IuIFdoZW4gdGhlIGFsdGVybmF0ZSBmaWxsIGNvbG9yIGlzIHNldCB0aGVuIHRoZSBncmlkXHJcbiAqIGNlbGxzIHdpbGwgYWx0ZXJuYXRlIHRoZSBmaWxsIGNvbG9ycyBhcyB0aGV5IHJlbmRlciwgY3JlYXRpbmcgYSBjaGVzcy1ib2FyZCBlZmZlY3QuIFlvdSBjYW5cclxuICogYWxzbyBvcHRpb25hbGx5IGhhdmUgYW4gb3V0bGluZSBmaWxsIGNvbG9yLiBJZiBzZXQsIHRoaXMgZHJhd3MgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxsc1xyXG4gKiBpbiB0aGUgZ2l2ZW4gY29sb3IuIElmIHlvdSBzcGVjaWZ5IGFuIG91dGxpbmUgY29sb3Igd2l0aCBhbiBhbHBoYSBvZiB6ZXJvLCB0aGVuIGl0IHdpbGwgZHJhd1xyXG4gKiB0aGUgY2VsbHMgc3BhY2VkIG91dCwgYnV0IHdpdGhvdXQgdGhlIGxpbmVzIGJldHdlZW4gdGhlbS5cclxuICpcclxuICogQGNsYXNzIEdyaWRcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xMjhdIC0gVGhlIHdpZHRoIG9mIHRoZSBncmlkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xMjhdIC0gVGhlIGhlaWdodCBvZiB0aGUgZ3JpZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjZWxsV2lkdGg9MzJdIC0gVGhlIHdpZHRoIG9mIG9uZSBjZWxsIGluIHRoZSBncmlkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NlbGxIZWlnaHQ9MzJdIC0gVGhlIGhlaWdodCBvZiBvbmUgY2VsbCBpbiB0aGUgZ3JpZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQWxwaGFdIC0gVGhlIGFscGhhIHRoZSBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW291dGxpbmVGaWxsQ29sb3JdIC0gVGhlIGNvbG9yIG9mIHRoZSBsaW5lcyBiZXR3ZWVuIHRoZSBncmlkIGNlbGxzLiBTZWUgdGhlIGBzZXRPdXRsaW5lYCBtZXRob2QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3V0bGluZUZpbGxBbHBoYV0gLSBUaGUgYWxwaGEgb2YgdGhlIGxpbmVzIGJldHdlZW4gdGhlIGdyaWQgY2VsbHMuXHJcbiAqL1xyXG52YXIgR3JpZCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU2hhcGUsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgR3JpZFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEdyaWQgKHNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZWxsV2lkdGgsIGNlbGxIZWlnaHQsIGZpbGxDb2xvciwgZmlsbEFscGhhLCBvdXRsaW5lRmlsbENvbG9yLCBvdXRsaW5lRmlsbEFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAxMjg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMTI4OyB9XHJcbiAgICAgICAgaWYgKGNlbGxXaWR0aCA9PT0gdW5kZWZpbmVkKSB7IGNlbGxXaWR0aCA9IDMyOyB9XHJcbiAgICAgICAgaWYgKGNlbGxIZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBjZWxsSGVpZ2h0ID0gMzI7IH1cclxuXHJcbiAgICAgICAgU2hhcGUuY2FsbCh0aGlzLCBzY2VuZSwgJ0dyaWQnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIGVhY2ggZ3JpZCBjZWxsLlxyXG4gICAgICAgICAqIE11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmlkI2NlbGxXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2VsbFdpZHRoID0gY2VsbFdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIGVhY2ggZ3JpZCBjZWxsLlxyXG4gICAgICAgICAqIE11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmlkI2NlbGxIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNlbGxIZWlnaHQgPSBjZWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaWxsIHRoZSBncmlkIHJlbmRlciBpdHMgY2VsbHMgaW4gdGhlIGBmaWxsQ29sb3JgP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjc2hvd0NlbGxzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hvd0NlbGxzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSBsaW5lcyBiZXR3ZWVuIGVhY2ggZ3JpZCBjZWxsLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjb3V0bGluZUZpbGxDb2xvclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub3V0bGluZUZpbGxDb2xvciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbHBoYSB2YWx1ZSBmb3IgdGhlIGNvbG9yIG9mIHRoZSBsaW5lcyBiZXR3ZWVuIGVhY2ggZ3JpZCBjZWxsLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjb3V0bGluZUZpbGxBbHBoYVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub3V0bGluZUZpbGxBbHBoYSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdpbGwgdGhlIGdyaWQgZGlzcGxheSB0aGUgbGluZXMgYmV0d2VlbiBlYWNoIGNlbGwgd2hlbiBpdCByZW5kZXJzP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjc2hvd091dGxpbmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaG93T3V0bGluZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdpbGwgdGhlIGdyaWQgcmVuZGVyIHRoZSBhbHRlcm5hdGluZyBjZWxscyBpbiB0aGUgYGFsdEZpbGxDb2xvcmA/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuR3JpZCNzaG93QWx0Q2VsbHNcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaG93QWx0Q2VsbHMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIHRoZSBhbHRlcm5hdGluZyBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmlkI2FsdEZpbGxDb2xvclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWx0RmlsbENvbG9yO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYWxwaGEgdGhlIGFsdGVybmF0aW5nIGdyaWQgY2VsbHMgd2lsbCBiZSBmaWxsZWQgd2l0aC5cclxuICAgICAgICAgKiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5HcmlkI2FsdEZpbGxBbHBoYVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWx0RmlsbEFscGhhO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsU3R5bGUoZmlsbENvbG9yLCBmaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG91dGxpbmVGaWxsQ29sb3IgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0T3V0bGluZVN0eWxlKG91dGxpbmVGaWxsQ29sb3IsIG91dGxpbmVGaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZmlsbCBjb2xvciBhbmQgYWxwaGEgbGV2ZWwgdGhlIGdyaWQgY2VsbHMgd2lsbCB1c2Ugd2hlbiByZW5kZXJpbmcuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIG5vIHZhbHVlcyB0aGVuIHRoZSBncmlkIGNlbGxzIHdpbGwgbm90IGJlIHJlbmRlcmVkLCBcclxuICAgICAqIGhvd2V2ZXIgdGhlIGdyaWQgbGluZXMgYW5kIGFsdGVybmF0aW5nIGNlbGxzIG1heSBzdGlsbCBiZS5cclxuICAgICAqIFxyXG4gICAgICogQWxzbyBzZWUgdGhlIGBzZXRPdXRsaW5lU3R5bGVgIGFuZCBgc2V0QWx0RmlsbFN0eWxlYCBtZXRob2RzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JpZCNzZXRGaWxsU3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhPTFdIC0gVGhlIGFscGhhIHRoZSBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZpbGxTdHlsZTogZnVuY3Rpb24gKGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmaWxsQWxwaGEgPT09IHVuZGVmaW5lZCkgeyBmaWxsQWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIGlmIChmaWxsQ29sb3IgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0NlbGxzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gZmlsbENvbG9yO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxBbHBoYSA9IGZpbGxBbHBoYTtcclxuICAgICAgICAgICAgdGhpcy5zaG93Q2VsbHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZmlsbCBjb2xvciBhbmQgYWxwaGEgbGV2ZWwgdGhhdCB0aGUgYWx0ZXJuYXRpbmcgZ3JpZCBjZWxscyB3aWxsIHVzZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggbm8gdmFsdWVzIHRoZW4gYWx0ZXJuYXRpbmcgZ3JpZCBjZWxscyB3aWxsIG5vdCBiZSByZW5kZXJlZCBpbiBhIGRpZmZlcmVudCBjb2xvci5cclxuICAgICAqIFxyXG4gICAgICogQWxzbyBzZWUgdGhlIGBzZXRPdXRsaW5lU3R5bGVgIGFuZCBgc2V0RmlsbFN0eWxlYCBtZXRob2RzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR3JpZCNzZXRBbHRGaWxsU3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBhbHRlcm5hdGluZyBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhPTFdIC0gVGhlIGFscGhhIHRoZSBhbHRlcm5hdGluZyBncmlkIGNlbGxzIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEFsdEZpbGxTdHlsZTogZnVuY3Rpb24gKGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmaWxsQWxwaGEgPT09IHVuZGVmaW5lZCkgeyBmaWxsQWxwaGEgPSAxOyB9XHJcblxyXG4gICAgICAgIGlmIChmaWxsQ29sb3IgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0FsdENlbGxzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWx0RmlsbENvbG9yID0gZmlsbENvbG9yO1xyXG4gICAgICAgICAgICB0aGlzLmFsdEZpbGxBbHBoYSA9IGZpbGxBbHBoYTtcclxuICAgICAgICAgICAgdGhpcy5zaG93QWx0Q2VsbHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZmlsbCBjb2xvciBhbmQgYWxwaGEgbGV2ZWwgdGhhdCB0aGUgbGluZXMgYmV0d2VlbiBlYWNoIGdyaWQgY2VsbCB3aWxsIHVzZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggbm8gdmFsdWVzIHRoZW4gdGhlIGdyaWQgbGluZXMgd2lsbCBub3QgYmUgcmVuZGVyZWQgYXQgYWxsLCBob3dldmVyXHJcbiAgICAgKiB0aGUgY2VsbHMgdGhlbXNlbHZlcyBtYXkgc3RpbGwgYmUgaWYgdGhleSBoYXZlIGNvbG9ycyBzZXQuXHJcbiAgICAgKiBcclxuICAgICAqIEFsc28gc2VlIHRoZSBgc2V0RmlsbFN0eWxlYCBhbmQgYHNldEFsdEZpbGxTdHlsZWAgbWV0aG9kcy5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBjYWxsIGNhbiBiZSBjaGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjc2V0T3V0bGluZVN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxscyB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxBbHBoYT0xXSAtIFRoZSBhbHBoYSB0aGUgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxscyB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRPdXRsaW5lU3R5bGU6IGZ1bmN0aW9uIChmaWxsQ29sb3IsIGZpbGxBbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZmlsbEFscGhhID09PSB1bmRlZmluZWQpIHsgZmlsbEFscGhhID0gMTsgfVxyXG5cclxuICAgICAgICBpZiAoZmlsbENvbG9yID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dPdXRsaW5lID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub3V0bGluZUZpbGxDb2xvciA9IGZpbGxDb2xvcjtcclxuICAgICAgICAgICAgdGhpcy5vdXRsaW5lRmlsbEFscGhhID0gZmlsbEFscGhhO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dPdXRsaW5lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyaWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0ZpbGxTdHlsZUNhbnZhcycpO1xyXG52YXIgTGluZVN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vTGluZVN0eWxlQ2FudmFzJyk7XHJcbnZhciBTZXRUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci9jYW52YXMvdXRpbHMvU2V0VHJhbnNmb3JtJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyaWR9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBHcmlkQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgaWYgKFNldFRyYW5zZm9ybShyZW5kZXJlciwgY3R4LCBzcmMsIGNhbWVyYSwgcGFyZW50TWF0cml4KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSAtc3JjLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICB2YXIgZHkgPSAtc3JjLl9kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgICAgICAvLyAgV29yayBvdXQgdGhlIGdyaWQgc2l6ZVxyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSBzcmMud2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHNyYy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBjZWxsV2lkdGggPSBzcmMuY2VsbFdpZHRoO1xyXG4gICAgICAgIHZhciBjZWxsSGVpZ2h0ID0gc3JjLmNlbGxIZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBncmlkV2lkdGggPSBNYXRoLmNlaWwod2lkdGggLyBjZWxsV2lkdGgpO1xyXG4gICAgICAgIHZhciBncmlkSGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxIZWlnaHQpO1xyXG5cclxuICAgICAgICB2YXIgY2VsbFdpZHRoQSA9IGNlbGxXaWR0aDtcclxuICAgICAgICB2YXIgY2VsbEhlaWdodEEgPSBjZWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgY2VsbFdpZHRoQiA9IGNlbGxXaWR0aCAtICgoZ3JpZFdpZHRoICogY2VsbFdpZHRoKSAtIHdpZHRoKTtcclxuICAgICAgICB2YXIgY2VsbEhlaWdodEIgPSBjZWxsSGVpZ2h0IC0gKChncmlkSGVpZ2h0ICogY2VsbEhlaWdodCkgLSBoZWlnaHQpO1xyXG5cclxuICAgICAgICB2YXIgc2hvd0NlbGxzID0gc3JjLnNob3dDZWxscztcclxuICAgICAgICB2YXIgc2hvd0FsdENlbGxzID0gc3JjLnNob3dBbHRDZWxscztcclxuICAgICAgICB2YXIgc2hvd091dGxpbmUgPSBzcmMuc2hvd091dGxpbmU7XHJcblxyXG4gICAgICAgIHZhciB4ID0gMDtcclxuICAgICAgICB2YXIgeSA9IDA7XHJcbiAgICAgICAgdmFyIHIgPSAwO1xyXG4gICAgICAgIHZhciBjdyA9IDA7XHJcbiAgICAgICAgdmFyIGNoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHNob3dPdXRsaW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFRvIG1ha2Ugcm9vbSBmb3IgdGhlIGdyaWQgbGluZXMgKGluIGNhc2UgYWxwaGEgPCAxKVxyXG4gICAgICAgICAgICBjZWxsV2lkdGhBLS07XHJcbiAgICAgICAgICAgIGNlbGxIZWlnaHRBLS07XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbFdpZHRoQiA9PT0gY2VsbFdpZHRoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjZWxsV2lkdGhCLS07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsSGVpZ2h0QiA9PT0gY2VsbEhlaWdodClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2VsbEhlaWdodEItLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3dDZWxscyAmJiBzcmMuZmlsbEFscGhhID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGxTdHlsZUNhbnZhcyhjdHgsIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZ3JpZEhlaWdodDsgeSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0FsdENlbGxzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHIgPSB5ICUgMjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZ3JpZFdpZHRoOyB4KyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dBbHRDZWxscyAmJiByKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcisrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdyA9ICh4IDwgZ3JpZFdpZHRoIC0gMSkgPyBjZWxsV2lkdGhBIDogY2VsbFdpZHRoQjtcclxuICAgICAgICAgICAgICAgICAgICBjaCA9ICh5IDwgZ3JpZEhlaWdodCAtIDEpID8gY2VsbEhlaWdodEEgOiBjZWxsSGVpZ2h0QjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkeCArIHggKiBjZWxsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5ICsgeSAqIGNlbGxIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG93QWx0Q2VsbHMgJiYgc3JjLmFsdEZpbGxBbHBoYSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5hbHRGaWxsQ29sb3IsIHNyYy5hbHRGaWxsQWxwaGEgKiBhbHBoYSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZ3JpZEhlaWdodDsgeSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0FsdENlbGxzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHIgPSB5ICUgMjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZ3JpZFdpZHRoOyB4KyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dBbHRDZWxscyAmJiAhcilcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHIgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdyA9ICh4IDwgZ3JpZFdpZHRoIC0gMSkgPyBjZWxsV2lkdGhBIDogY2VsbFdpZHRoQjtcclxuICAgICAgICAgICAgICAgICAgICBjaCA9ICh5IDwgZ3JpZEhlaWdodCAtIDEpID8gY2VsbEhlaWdodEEgOiBjZWxsSGVpZ2h0QjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkeCArIHggKiBjZWxsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5ICsgeSAqIGNlbGxIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG93T3V0bGluZSAmJiBzcmMub3V0bGluZUZpbGxBbHBoYSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMaW5lU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5vdXRsaW5lRmlsbENvbG9yLCBzcmMub3V0bGluZUZpbGxBbHBoYSAqIGFscGhhKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCBncmlkV2lkdGg7IHgrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHgxID0geCAqIGNlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4MSArIGR4LCBkeSk7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHgxICsgZHgsIGhlaWdodCArIGR5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoeSA9IDE7IHkgPCBncmlkSGVpZ2h0OyB5KyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB5MSA9IHkgKiBjZWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGR4LCB5MSArIGR5KTtcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oZHggKyB3aWR0aCwgeTEgKyBkeSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHcmlkQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIEdyaWQgPSByZXF1aXJlKCcuL0dyaWQnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IEdyaWQgU2hhcGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBHcmlkIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogVGhlIEdyaWQgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBmaWxsIGNvbG9ycyBhbmQgY2Fubm90IGJlIHN0cm9rZWQuXHJcbiAqIFxyXG4gKiBBIEdyaWQgU2hhcGUgYWxsb3dzIHlvdSB0byBkaXNwbGF5IGEgZ3JpZCBpbiB5b3VyIGdhbWUsIHdoZXJlIHlvdSBjYW4gY29udHJvbCB0aGUgc2l6ZSBvZiB0aGVcclxuICogZ3JpZCBhcyB3ZWxsIGFzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBncmlkIGNlbGxzLiBZb3UgY2FuIHNldCBhIGZpbGwgY29sb3IgZm9yIGVhY2ggZ3JpZFxyXG4gKiBjZWxsIGFzIHdlbGwgYXMgYW4gYWx0ZXJuYXRlIGZpbGwgY29sb3IuIFdoZW4gdGhlIGFsdGVybmF0ZSBmaWxsIGNvbG9yIGlzIHNldCB0aGVuIHRoZSBncmlkXHJcbiAqIGNlbGxzIHdpbGwgYWx0ZXJuYXRlIHRoZSBmaWxsIGNvbG9ycyBhcyB0aGV5IHJlbmRlciwgY3JlYXRpbmcgYSBjaGVzcy1ib2FyZCBlZmZlY3QuIFlvdSBjYW5cclxuICogYWxzbyBvcHRpb25hbGx5IGhhdmUgYW4gb3V0bGluZSBmaWxsIGNvbG9yLiBJZiBzZXQsIHRoaXMgZHJhd3MgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxsc1xyXG4gKiBpbiB0aGUgZ2l2ZW4gY29sb3IuIElmIHlvdSBzcGVjaWZ5IGFuIG91dGxpbmUgY29sb3Igd2l0aCBhbiBhbHBoYSBvZiB6ZXJvLCB0aGVuIGl0IHdpbGwgZHJhd1xyXG4gKiB0aGUgY2VsbHMgc3BhY2VkIG91dCwgYnV0IHdpdGhvdXQgdGhlIGxpbmVzIGJldHdlZW4gdGhlbS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjZ3JpZFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MTI4XSAtIFRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGdyaWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY2VsbFdpZHRoPTMyXSAtIFRoZSB3aWR0aCBvZiBvbmUgY2VsbCBpbiB0aGUgZ3JpZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjZWxsSGVpZ2h0PTMyXSAtIFRoZSBoZWlnaHQgb2Ygb25lIGNlbGwgaW4gdGhlIGdyaWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgZ3JpZCBjZWxscyB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgZ3JpZCBjZWxscyB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvdXRsaW5lRmlsbENvbG9yXSAtIFRoZSBjb2xvciBvZiB0aGUgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxscy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvdXRsaW5lRmlsbEFscGhhXSAtIFRoZSBhbHBoYSBvZiB0aGUgbGluZXMgYmV0d2VlbiB0aGUgZ3JpZCBjZWxscy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdyaWR9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2dyaWQnLCBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2VsbFdpZHRoLCBjZWxsSGVpZ2h0LCBmaWxsQ29sb3IsIGZpbGxBbHBoYSwgb3V0bGluZUZpbGxDb2xvciwgb3V0bGluZUZpbGxBbHBoYSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBHcmlkKHRoaXMuc2NlbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCwgZmlsbENvbG9yLCBmaWxsQWxwaGEsIG91dGxpbmVGaWxsQ29sb3IsIG91dGxpbmVGaWxsQWxwaGEpKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL0dyaWRXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0dyaWRDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVXRpbHMgPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci93ZWJnbC9VdGlscycpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdyaWQjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JpZH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIEdyaWRXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNoYXBlTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgyO1xyXG4gICAgdmFyIGNhbGNNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgcmVuZGVyZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xyXG5cclxuICAgIHNoYXBlTWF0cml4LmFwcGx5SVRSUyhzcmMueCwgc3JjLnksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcblxyXG4gICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBzaGFwZU1hdHJpeC5lID0gc3JjLng7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiA9IHNyYy55O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3Rvclk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FtTWF0cml4Lm11bHRpcGx5KHNoYXBlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuXHJcbiAgICBjYWxjTWF0cml4LnRyYW5zbGF0ZSgtc3JjLl9kaXNwbGF5T3JpZ2luWCwgLXNyYy5fZGlzcGxheU9yaWdpblkpO1xyXG5cclxuICAgIHZhciBhbHBoYSA9IGNhbWVyYS5hbHBoYSAqIHNyYy5hbHBoYTtcclxuXHJcbiAgICAvLyAgV29yayBvdXQgdGhlIGdyaWQgc2l6ZVxyXG5cclxuICAgIHZhciB3aWR0aCA9IHNyYy53aWR0aDtcclxuICAgIHZhciBoZWlnaHQgPSBzcmMuaGVpZ2h0O1xyXG5cclxuICAgIHZhciBjZWxsV2lkdGggPSBzcmMuY2VsbFdpZHRoO1xyXG4gICAgdmFyIGNlbGxIZWlnaHQgPSBzcmMuY2VsbEhlaWdodDtcclxuXHJcbiAgICB2YXIgZ3JpZFdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gY2VsbFdpZHRoKTtcclxuICAgIHZhciBncmlkSGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxIZWlnaHQpO1xyXG5cclxuICAgIHZhciBjZWxsV2lkdGhBID0gY2VsbFdpZHRoO1xyXG4gICAgdmFyIGNlbGxIZWlnaHRBID0gY2VsbEhlaWdodDtcclxuXHJcbiAgICB2YXIgY2VsbFdpZHRoQiA9IGNlbGxXaWR0aCAtICgoZ3JpZFdpZHRoICogY2VsbFdpZHRoKSAtIHdpZHRoKTtcclxuICAgIHZhciBjZWxsSGVpZ2h0QiA9IGNlbGxIZWlnaHQgLSAoKGdyaWRIZWlnaHQgKiBjZWxsSGVpZ2h0KSAtIGhlaWdodCk7XHJcblxyXG4gICAgdmFyIGZpbGxUaW50O1xyXG4gICAgdmFyIGZpbGxUaW50Q29sb3I7XHJcblxyXG4gICAgdmFyIHNob3dDZWxscyA9IHNyYy5zaG93Q2VsbHM7XHJcbiAgICB2YXIgc2hvd0FsdENlbGxzID0gc3JjLnNob3dBbHRDZWxscztcclxuICAgIHZhciBzaG93T3V0bGluZSA9IHNyYy5zaG93T3V0bGluZTtcclxuXHJcbiAgICB2YXIgeCA9IDA7XHJcbiAgICB2YXIgeSA9IDA7XHJcbiAgICB2YXIgciA9IDA7XHJcbiAgICB2YXIgY3cgPSAwO1xyXG4gICAgdmFyIGNoID0gMDtcclxuXHJcbiAgICBpZiAoc2hvd091dGxpbmUpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFRvIG1ha2Ugcm9vbSBmb3IgdGhlIGdyaWQgbGluZXMgKGluIGNhc2UgYWxwaGEgPCAxKVxyXG4gICAgICAgIGNlbGxXaWR0aEEtLTtcclxuICAgICAgICBjZWxsSGVpZ2h0QS0tO1xyXG5cclxuICAgICAgICBpZiAoY2VsbFdpZHRoQiA9PT0gY2VsbFdpZHRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2VsbFdpZHRoQi0tO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNlbGxIZWlnaHRCID09PSBjZWxsSGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2VsbEhlaWdodEItLTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3dDZWxscyAmJiBzcmMuZmlsbEFscGhhID4gMClcclxuICAgIHtcclxuICAgICAgICBmaWxsVGludCA9IHBpcGVsaW5lLmZpbGxUaW50O1xyXG4gICAgICAgIGZpbGxUaW50Q29sb3IgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXAoc3JjLmZpbGxDb2xvciwgc3JjLmZpbGxBbHBoYSAqIGFscGhhKTtcclxuICAgIFxyXG4gICAgICAgIGZpbGxUaW50LlRMID0gZmlsbFRpbnRDb2xvcjtcclxuICAgICAgICBmaWxsVGludC5UUiA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgZmlsbFRpbnQuQkwgPSBmaWxsVGludENvbG9yO1xyXG4gICAgICAgIGZpbGxUaW50LkJSID0gZmlsbFRpbnRDb2xvcjtcclxuXHJcbiAgICAgICAgZm9yICh5ID0gMDsgeSA8IGdyaWRIZWlnaHQ7IHkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChzaG93QWx0Q2VsbHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHIgPSB5ICUgMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGdyaWRXaWR0aDsgeCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0FsdENlbGxzICYmIHIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcisrO1xyXG5cclxuICAgICAgICAgICAgICAgIGN3ID0gKHggPCBncmlkV2lkdGggLSAxKSA/IGNlbGxXaWR0aEEgOiBjZWxsV2lkdGhCO1xyXG4gICAgICAgICAgICAgICAgY2ggPSAoeSA8IGdyaWRIZWlnaHQgLSAxKSA/IGNlbGxIZWlnaHRBIDogY2VsbEhlaWdodEI7XHJcblxyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuYmF0Y2hGaWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICB4ICogY2VsbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHkgKiBjZWxsSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGN3LFxyXG4gICAgICAgICAgICAgICAgICAgIGNoXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzaG93QWx0Q2VsbHMgJiYgc3JjLmFsdEZpbGxBbHBoYSA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgZmlsbFRpbnQgPSBwaXBlbGluZS5maWxsVGludDtcclxuICAgICAgICBmaWxsVGludENvbG9yID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5hbHRGaWxsQ29sb3IsIHNyYy5hbHRGaWxsQWxwaGEgKiBhbHBoYSk7XHJcbiAgICBcclxuICAgICAgICBmaWxsVGludC5UTCA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgZmlsbFRpbnQuVFIgPSBmaWxsVGludENvbG9yO1xyXG4gICAgICAgIGZpbGxUaW50LkJMID0gZmlsbFRpbnRDb2xvcjtcclxuICAgICAgICBmaWxsVGludC5CUiA9IGZpbGxUaW50Q29sb3I7XHJcblxyXG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBncmlkSGVpZ2h0OyB5KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoc2hvd0FsdENlbGxzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByID0geSAlIDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBncmlkV2lkdGg7IHgrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dBbHRDZWxscyAmJiAhcilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdyA9ICh4IDwgZ3JpZFdpZHRoIC0gMSkgPyBjZWxsV2lkdGhBIDogY2VsbFdpZHRoQjtcclxuICAgICAgICAgICAgICAgIGNoID0gKHkgPCBncmlkSGVpZ2h0IC0gMSkgPyBjZWxsSGVpZ2h0QSA6IGNlbGxIZWlnaHRCO1xyXG5cclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmJhdGNoRmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgeCAqIGNlbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5ICogY2VsbEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBjdyxcclxuICAgICAgICAgICAgICAgICAgICBjaFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hvd091dGxpbmUgJiYgc3JjLm91dGxpbmVGaWxsQWxwaGEgPiAwKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdHJva2VUaW50ID0gcGlwZWxpbmUuc3Ryb2tlVGludDtcclxuICAgICAgICB2YXIgY29sb3IgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXAoc3JjLm91dGxpbmVGaWxsQ29sb3IsIHNyYy5vdXRsaW5lRmlsbEFscGhhICogYWxwaGEpO1xyXG5cclxuICAgICAgICBzdHJva2VUaW50LlRMID0gY29sb3I7XHJcbiAgICAgICAgc3Ryb2tlVGludC5UUiA9IGNvbG9yO1xyXG4gICAgICAgIHN0cm9rZVRpbnQuQkwgPSBjb2xvcjtcclxuICAgICAgICBzdHJva2VUaW50LkJSID0gY29sb3I7XHJcblxyXG4gICAgICAgIGZvciAoeCA9IDE7IHggPCBncmlkV2lkdGg7IHgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB4MSA9IHggKiBjZWxsV2lkdGg7XHJcblxyXG4gICAgICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQoKTtcclxuXHJcbiAgICAgICAgICAgIHBpcGVsaW5lLmJhdGNoTGluZSh4MSwgMCwgeDEsIGhlaWdodCwgMSwgMSwgMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh5ID0gMTsgeSA8IGdyaWRIZWlnaHQ7IHkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB5MSA9IHkgKiBjZWxsSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKCk7XHJcblxyXG4gICAgICAgICAgICBwaXBlbGluZS5iYXRjaExpbmUoMCwgeTEsIHdpZHRoLCB5MSwgMSwgMSwgMSwgMCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR3JpZFdlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIElzb0JveFJlbmRlciA9IHJlcXVpcmUoJy4vSXNvQm94UmVuZGVyJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBTaGFwZSA9IHJlcXVpcmUoJy4uL1NoYXBlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgSXNvQm94IFNoYXBlIGlzIGEgR2FtZSBPYmplY3QgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBTY2VuZSwgR3JvdXAgb3IgQ29udGFpbmVyLiBZb3UgY2FuXHJcbiAqIHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIEdhbWUgT2JqZWN0IGluIHlvdXIgZ2FtZSwgc3VjaCBhcyB0d2VlbmluZyBpdCwgc2NhbGluZyBpdCwgb3IgZW5hYmxpbmdcclxuICogaXQgZm9yIGlucHV0IG9yIHBoeXNpY3MuIEl0IHByb3ZpZGVzIGEgcXVpY2sgYW5kIGVhc3kgd2F5IGZvciB5b3UgdG8gcmVuZGVyIHRoaXMgc2hhcGUgaW4geW91clxyXG4gKiBnYW1lIHdpdGhvdXQgdXNpbmcgYSB0ZXh0dXJlLCB3aGlsZSBzdGlsbCB0YWtpbmcgYWR2YW50YWdlIG9mIGJlaW5nIGZ1bGx5IGJhdGNoZWQgaW4gV2ViR0wuXHJcbiAqIFxyXG4gKiBUaGlzIHNoYXBlIHN1cHBvcnRzIG9ubHkgZmlsbCBjb2xvcnMgYW5kIGNhbm5vdCBiZSBzdHJva2VkLlxyXG4gKiBcclxuICogQW4gSXNvQm94IGlzIGFuICdpc29tZXRyaWMnIHJlY3RhbmdsZS4gRWFjaCBmYWNlIG9mIGl0IGhhcyBhIGRpZmZlcmVudCBmaWxsIGNvbG9yLiBZb3UgY2FuIHNldFxyXG4gKiB0aGUgY29sb3Igb2YgdGhlIHRvcCwgbGVmdCBhbmQgcmlnaHQgZmFjZXMgb2YgdGhlIHJlY3RhbmdsZSByZXNwZWN0aXZlbHkuIFlvdSBjYW4gYWxzbyBjaG9vc2VcclxuICogd2hpY2ggb2YgdGhlIGZhY2VzIGFyZSByZW5kZXJlZCB2aWEgdGhlIGBzaG93VG9wYCwgYHNob3dMZWZ0YCBhbmQgYHNob3dSaWdodGAgcHJvcGVydGllcy5cclxuICogXHJcbiAqIFlvdSBjYW5ub3QgdmlldyBhbiBJc29Cb3ggZnJvbSB1bmRlci1uZWF0aCwgaG93ZXZlciB5b3UgY2FuIGNoYW5nZSB0aGUgJ2FuZ2xlJyBieSBzZXR0aW5nXHJcbiAqIHRoZSBgcHJvamVjdGlvbmAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEBjbGFzcyBJc29Cb3hcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTQ4XSAtIFRoZSB3aWR0aCBvZiB0aGUgaXNvIGJveCBpbiBwaXhlbHMuIFRoZSBsZWZ0IGFuZCByaWdodCBmYWNlcyB3aWxsIGJlIGV4YWN0bHkgaGFsZiB0aGlzIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0zMl0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpc28gYm94LiBUaGUgbGVmdCBhbmQgcmlnaHQgZmFjZXMgd2lsbCBiZSB0aGlzIHRhbGwuIFRoZSBvdmVyYWxsIGhlaWdodCBvZiB0aGUgaXNvYm94IHdpbGwgYmUgdGhpcyB2YWx1ZSBwbHVzIGhhbGYgdGhlIGBzaXplYCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsVG9wPTB4ZWVlZWVlXSAtIFRoZSBmaWxsIGNvbG9yIG9mIHRoZSB0b3AgZmFjZSBvZiB0aGUgaXNvIGJveC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsTGVmdD0weDk5OTk5OV0gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgbGVmdCBmYWNlIG9mIHRoZSBpc28gYm94LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxSaWdodD0weGNjY2NjY10gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgcmlnaHQgZmFjZSBvZiB0aGUgaXNvIGJveC5cclxuICovXHJcbnZhciBJc29Cb3ggPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFNoYXBlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIElzb0JveFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIElzb0JveCAoc2NlbmUsIHgsIHksIHNpemUsIGhlaWdodCwgZmlsbFRvcCwgZmlsbExlZnQsIGZpbGxSaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHsgc2l6ZSA9IDQ4OyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IDMyOyB9XHJcbiAgICAgICAgaWYgKGZpbGxUb3AgPT09IHVuZGVmaW5lZCkgeyBmaWxsVG9wID0gMHhlZWVlZWU7IH1cclxuICAgICAgICBpZiAoZmlsbExlZnQgPT09IHVuZGVmaW5lZCkgeyBmaWxsTGVmdCA9IDB4OTk5OTk5OyB9XHJcbiAgICAgICAgaWYgKGZpbGxSaWdodCA9PT0gdW5kZWZpbmVkKSB7IGZpbGxSaWdodCA9IDB4Y2NjY2NjOyB9XHJcblxyXG4gICAgICAgIFNoYXBlLmNhbGwodGhpcywgc2NlbmUsICdJc29Cb3gnLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByb2plY3Rpb24gbGV2ZWwgb2YgdGhlIGlzbyBib3guIENoYW5nZSB0aGlzIHRvIGNoYW5nZSB0aGUgJ2FuZ2xlJyBhdCB3aGljaCB5b3UgYXJlIGxvb2tpbmcgYXQgdGhlIGJveC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29Cb3gjcHJvamVjdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDRcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uID0gNDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgdG9wIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNmaWxsVG9wXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5maWxsVG9wID0gZmlsbFRvcDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgbGVmdC1mYWNpbmcgc2lkZSBvZiB0aGUgaXNvIGJveC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29Cb3gjZmlsbExlZnRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxMZWZ0ID0gZmlsbExlZnQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb2xvciB1c2VkIHRvIGZpbGwgaW4gdGhlIHJpZ2h0LWZhY2luZyBzaWRlIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNmaWxsUmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxSaWdodCA9IGZpbGxSaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgaWYgdGhlIHRvcC1mYWNlIG9mIHRoZSBpc28gYm94IGJlIHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNzaG93VG9wXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNob3dUb3AgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb250cm9scyBpZiB0aGUgbGVmdC1mYWNlIG9mIHRoZSBpc28gYm94IGJlIHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNzaG93TGVmdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaG93TGVmdCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENvbnRyb2xzIGlmIHRoZSByaWdodC1mYWNlIG9mIHRoZSBpc28gYm94IGJlIHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNzaG93UmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hvd1JpZ2h0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0ZpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHNpemUsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHByb2plY3Rpb24gbGV2ZWwgb2YgdGhlIGlzbyBib3guIENoYW5nZSB0aGlzIHRvIGNoYW5nZSB0aGUgJ2FuZ2xlJyBhdCB3aGljaCB5b3UgYXJlIGxvb2tpbmcgYXQgdGhlIGJveC5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29Cb3gjc2V0UHJvamVjdGlvblxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvamVjdGlvbiB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRQcm9qZWN0aW9uOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgd2hpY2ggZmFjZXMgb2YgdGhlIGlzbyBib3ggd2lsbCBiZSByZW5kZXJlZC5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29Cb3gjc2V0RmFjZXNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd1RvcD10cnVlXSAtIFNob3cgdGhlIHRvcC1mYWNlIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0xlZnQ9dHJ1ZV0gLSBTaG93IHRoZSBsZWZ0LWZhY2Ugb2YgdGhlIGlzbyBib3guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG93UmlnaHQ9dHJ1ZV0gLSBTaG93IHRoZSByaWdodC1mYWNlIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZhY2VzOiBmdW5jdGlvbiAoc2hvd1RvcCwgc2hvd0xlZnQsIHNob3dSaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoc2hvd1RvcCA9PT0gdW5kZWZpbmVkKSB7IHNob3dUb3AgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHNob3dMZWZ0ID09PSB1bmRlZmluZWQpIHsgc2hvd0xlZnQgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHNob3dSaWdodCA9PT0gdW5kZWZpbmVkKSB7IHNob3dSaWdodCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93VG9wID0gc2hvd1RvcDtcclxuICAgICAgICB0aGlzLnNob3dMZWZ0ID0gc2hvd0xlZnQ7XHJcbiAgICAgICAgdGhpcy5zaG93UmlnaHQgPSBzaG93UmlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGZpbGwgY29sb3JzIGZvciBlYWNoIGZhY2Ugb2YgdGhlIGlzbyBib3guXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuSXNvQm94I3NldEZpbGxTdHlsZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxUb3BdIC0gVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCB0aGUgdG9wIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsTGVmdF0gLSBUaGUgY29sb3IgdXNlZCB0byBmaWxsIGluIHRoZSBsZWZ0LWZhY2luZyBzaWRlIG9mIHRoZSBpc28gYm94LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsUmlnaHRdIC0gVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgcmlnaHQtZmFjaW5nIHNpZGUgb2YgdGhlIGlzbyBib3guXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmlsbFN0eWxlOiBmdW5jdGlvbiAoZmlsbFRvcCwgZmlsbExlZnQsIGZpbGxSaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZpbGxUb3AgPSBmaWxsVG9wO1xyXG4gICAgICAgIHRoaXMuZmlsbExlZnQgPSBmaWxsTGVmdDtcclxuICAgICAgICB0aGlzLmZpbGxSaWdodCA9IGZpbGxSaWdodDtcclxuXHJcbiAgICAgICAgdGhpcy5pc0ZpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElzb0JveDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmlsbFN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vRmlsbFN0eWxlQ2FudmFzJyk7XHJcbnZhciBTZXRUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci9jYW52YXMvdXRpbHMvU2V0VHJhbnNmb3JtJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLklzb0JveCNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuSXNvQm94fSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgSXNvQm94Q2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgaWYgKFNldFRyYW5zZm9ybShyZW5kZXJlciwgY3R4LCBzcmMsIGNhbWVyYSwgcGFyZW50TWF0cml4KSAmJiBzcmMuaXNGaWxsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNpemUgPSBzcmMud2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHNyYy5oZWlnaHQ7XHJcbiAgICBcclxuICAgICAgICB2YXIgc2l6ZUEgPSBzaXplIC8gMjtcclxuICAgICAgICB2YXIgc2l6ZUIgPSBzaXplIC8gc3JjLnByb2plY3Rpb247XHJcblxyXG4gICAgICAgIC8vICBUb3AgRmFjZVxyXG5cclxuICAgICAgICBpZiAoc3JjLnNob3dUb3ApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5maWxsVG9wKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbygwLCAtc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKHNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbyhzaXplQSwgLTEpO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKDAsIHNpemVCIC0gMSk7XHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8oLXNpemVBLCAtMSk7XHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8oLXNpemVBLCAtaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgTGVmdCBGYWNlXHJcblxyXG4gICAgICAgIGlmIChzcmMuc2hvd0xlZnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5maWxsTGVmdCk7XHJcblxyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBcclxuICAgICAgICAgICAgY3R4Lm1vdmVUbygtc2l6ZUEsIDApO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKDAsIHNpemVCKTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbygwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8oLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbygtc2l6ZUEsIDApO1xyXG5cclxuICAgICAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBSaWdodCBGYWNlXHJcblxyXG4gICAgICAgIGlmIChzcmMuc2hvd1JpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRmlsbFN0eWxlQ2FudmFzKGN0eCwgc3JjLCBzcmMuZmlsbFJpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oc2l6ZUEsIDApO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKDAsIHNpemVCKTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbygwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8oc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKHNpemVBLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJc29Cb3hDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi8uLi9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG52YXIgSXNvQm94ID0gcmVxdWlyZSgnLi9Jc29Cb3gnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IElzb0JveCBTaGFwZSBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIElzb0JveCBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogXHJcbiAqIFRoZSBJc29Cb3ggU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBmaWxsIGNvbG9ycyBhbmQgY2Fubm90IGJlIHN0cm9rZWQuXHJcbiAqIFxyXG4gKiBBbiBJc29Cb3ggaXMgYW4gJ2lzb21ldHJpYycgcmVjdGFuZ2xlLiBFYWNoIGZhY2Ugb2YgaXQgaGFzIGEgZGlmZmVyZW50IGZpbGwgY29sb3IuIFlvdSBjYW4gc2V0XHJcbiAqIHRoZSBjb2xvciBvZiB0aGUgdG9wLCBsZWZ0IGFuZCByaWdodCBmYWNlcyBvZiB0aGUgcmVjdGFuZ2xlIHJlc3BlY3RpdmVseS4gWW91IGNhbiBhbHNvIGNob29zZVxyXG4gKiB3aGljaCBvZiB0aGUgZmFjZXMgYXJlIHJlbmRlcmVkIHZpYSB0aGUgYHNob3dUb3BgLCBgc2hvd0xlZnRgIGFuZCBgc2hvd1JpZ2h0YCBwcm9wZXJ0aWVzLlxyXG4gKiBcclxuICogWW91IGNhbm5vdCB2aWV3IGFuIElzb0JveCBmcm9tIHVuZGVyLW5lYXRoLCBob3dldmVyIHlvdSBjYW4gY2hhbmdlIHRoZSAnYW5nbGUnIGJ5IHNldHRpbmdcclxuICogdGhlIGBwcm9qZWN0aW9uYCBwcm9wZXJ0eS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjaXNvYm94XHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTQ4XSAtIFRoZSB3aWR0aCBvZiB0aGUgaXNvIGJveCBpbiBwaXhlbHMuIFRoZSBsZWZ0IGFuZCByaWdodCBmYWNlcyB3aWxsIGJlIGV4YWN0bHkgaGFsZiB0aGlzIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0zMl0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpc28gYm94LiBUaGUgbGVmdCBhbmQgcmlnaHQgZmFjZXMgd2lsbCBiZSB0aGlzIHRhbGwuIFRoZSBvdmVyYWxsIGhlaWdodCBvZiB0aGUgaXNvYm94IHdpbGwgYmUgdGhpcyB2YWx1ZSBwbHVzIGhhbGYgdGhlIGBzaXplYCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsVG9wPTB4ZWVlZWVlXSAtIFRoZSBmaWxsIGNvbG9yIG9mIHRoZSB0b3AgZmFjZSBvZiB0aGUgaXNvIGJveC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsTGVmdD0weDk5OTk5OV0gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgbGVmdCBmYWNlIG9mIHRoZSBpc28gYm94LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxSaWdodD0weGNjY2NjY10gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgcmlnaHQgZmFjZSBvZiB0aGUgaXNvIGJveC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLklzb0JveH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcignaXNvYm94JywgZnVuY3Rpb24gKHgsIHksIHNpemUsIGhlaWdodCwgZmlsbFRvcCwgZmlsbExlZnQsIGZpbGxSaWdodClcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBJc29Cb3godGhpcy5zY2VuZSwgeCwgeSwgc2l6ZSwgaGVpZ2h0LCBmaWxsVG9wLCBmaWxsTGVmdCwgZmlsbFJpZ2h0KSk7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9Jc29Cb3hXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0lzb0JveENhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuSXNvQm94I3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLklzb0JveH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIElzb0JveFdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDE7XHJcbiAgICB2YXIgc2hhcGVNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mID0gc3JjLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuICAgIH1cclxuXHJcbiAgICBjYW1NYXRyaXgubXVsdGlwbHkoc2hhcGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgIHZhciBzaXplID0gc3JjLndpZHRoO1xyXG4gICAgdmFyIGhlaWdodCA9IHNyYy5oZWlnaHQ7XHJcblxyXG4gICAgdmFyIHNpemVBID0gc2l6ZSAvIDI7XHJcbiAgICB2YXIgc2l6ZUIgPSBzaXplIC8gc3JjLnByb2plY3Rpb247XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmICghc3JjLmlzRmlsbGVkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdGludDtcclxuXHJcbiAgICB2YXIgeDA7XHJcbiAgICB2YXIgeTA7XHJcblxyXG4gICAgdmFyIHgxO1xyXG4gICAgdmFyIHkxO1xyXG5cclxuICAgIHZhciB4MjtcclxuICAgIHZhciB5MjtcclxuXHJcbiAgICB2YXIgeDM7XHJcbiAgICB2YXIgeTM7XHJcblxyXG4gICAgLy8gIFRvcCBGYWNlXHJcblxyXG4gICAgaWYgKHNyYy5zaG93VG9wKVxyXG4gICAge1xyXG4gICAgICAgIHRpbnQgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXAoc3JjLmZpbGxUb3AsIGFscGhhKTtcclxuXHJcbiAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICB5MCA9IGNhbGNNYXRyaXguZ2V0WSgtc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgXHJcbiAgICAgICAgeDEgPSBjYWxjTWF0cml4LmdldFgoMCwgLXNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICB5MSA9IGNhbGNNYXRyaXguZ2V0WSgwLCAtc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgXHJcbiAgICAgICAgeDIgPSBjYWxjTWF0cml4LmdldFgoc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgIHkyID0gY2FsY01hdHJpeC5nZXRZKHNpemVBLCAtaGVpZ2h0KTtcclxuICAgIFxyXG4gICAgICAgIHgzID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICB5MyA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQiAtIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG4gICAgXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hRdWFkKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIExlZnQgRmFjZVxyXG5cclxuICAgIGlmIChzcmMuc2hvd0xlZnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcChzcmMuZmlsbExlZnQsIGFscGhhKTtcclxuXHJcbiAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoLXNpemVBLCAwKTtcclxuICAgICAgICB5MCA9IGNhbGNNYXRyaXguZ2V0WSgtc2l6ZUEsIDApO1xyXG4gICAgXHJcbiAgICAgICAgeDEgPSBjYWxjTWF0cml4LmdldFgoMCwgc2l6ZUIpO1xyXG4gICAgICAgIHkxID0gY2FsY01hdHJpeC5nZXRZKDAsIHNpemVCKTtcclxuICAgIFxyXG4gICAgICAgIHgyID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICB5MiA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICBcclxuICAgICAgICB4MyA9IGNhbGNNYXRyaXguZ2V0WCgtc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgIHkzID0gY2FsY01hdHJpeC5nZXRZKC1zaXplQSwgLWhlaWdodCk7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG4gICAgXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hRdWFkKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFJpZ2h0IEZhY2VcclxuXHJcbiAgICBpZiAoc3JjLnNob3dSaWdodClcclxuICAgIHtcclxuICAgICAgICB0aW50ID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5maWxsUmlnaHQsIGFscGhhKTtcclxuXHJcbiAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoc2l6ZUEsIDApO1xyXG4gICAgICAgIHkwID0gY2FsY01hdHJpeC5nZXRZKHNpemVBLCAwKTtcclxuICAgIFxyXG4gICAgICAgIHgxID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCKTtcclxuICAgICAgICB5MSA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQik7XHJcbiAgICBcclxuICAgICAgICB4MiA9IGNhbGNNYXRyaXguZ2V0WCgwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgeTIgPSBjYWxjTWF0cml4LmdldFkoMCwgc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgXHJcbiAgICAgICAgeDMgPSBjYWxjTWF0cml4LmdldFgoc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgIHkzID0gY2FsY01hdHJpeC5nZXRZKHNpemVBLCAtaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKCk7XHJcbiAgICBcclxuICAgICAgICBwaXBlbGluZS5iYXRjaFF1YWQoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCAwLCAwLCAxLCAxLCB0aW50LCB0aW50LCB0aW50LCB0aW50LCAyKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSXNvQm94V2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgSXNvVHJpYW5nbGVSZW5kZXIgPSByZXF1aXJlKCcuL0lzb1RyaWFuZ2xlUmVuZGVyJyk7XHJcbnZhciBTaGFwZSA9IHJlcXVpcmUoJy4uL1NoYXBlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgSXNvVHJpYW5nbGUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBmaWxsIGNvbG9ycyBhbmQgY2Fubm90IGJlIHN0cm9rZWQuXHJcbiAqIFxyXG4gKiBBbiBJc29UcmlhbmdsZSBpcyBhbiAnaXNvbWV0cmljJyB0cmlhbmdsZS4gVGhpbmsgb2YgaXQgbGlrZSBhIHB5cmFtaWQuIEVhY2ggZmFjZSBoYXMgYSBkaWZmZXJlbnRcclxuICogZmlsbCBjb2xvci4gWW91IGNhbiBzZXQgdGhlIGNvbG9yIG9mIHRoZSB0b3AsIGxlZnQgYW5kIHJpZ2h0IGZhY2VzIG9mIHRoZSB0cmlhbmdsZSByZXNwZWN0aXZlbHlcclxuICogWW91IGNhbiBhbHNvIGNob29zZSB3aGljaCBvZiB0aGUgZmFjZXMgYXJlIHJlbmRlcmVkIHZpYSB0aGUgYHNob3dUb3BgLCBgc2hvd0xlZnRgIGFuZCBgc2hvd1JpZ2h0YCBwcm9wZXJ0aWVzLlxyXG4gKiBcclxuICogWW91IGNhbm5vdCB2aWV3IGFuIElzb1RyaWFuZ2xlIGZyb20gdW5kZXItbmVhdGgsIGhvd2V2ZXIgeW91IGNhbiBjaGFuZ2UgdGhlICdhbmdsZScgYnkgc2V0dGluZ1xyXG4gKiB0aGUgYHByb2plY3Rpb25gIHByb3BlcnR5LiBUaGUgYHJldmVyc2VkYCBwcm9wZXJ0eSBjb250cm9scyBpZiB0aGUgSXNvVHJpYW5nbGUgaXMgcmVuZGVyZWQgdXBzaWRlXHJcbiAqIGRvd24gb3Igbm90LlxyXG4gKlxyXG4gKiBAY2xhc3MgSXNvVHJpYW5nbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTQ4XSAtIFRoZSB3aWR0aCBvZiB0aGUgaXNvIHRyaWFuZ2xlIGluIHBpeGVscy4gVGhlIGxlZnQgYW5kIHJpZ2h0IGZhY2VzIHdpbGwgYmUgZXhhY3RseSBoYWxmIHRoaXMgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTMyXSAtIFRoZSBoZWlnaHQgb2YgdGhlIGlzbyB0cmlhbmdsZS4gVGhlIGxlZnQgYW5kIHJpZ2h0IGZhY2VzIHdpbGwgYmUgdGhpcyB0YWxsLiBUaGUgb3ZlcmFsbCBoZWlnaHQgb2YgdGhlIGlzbyB0cmlhbmdsZSB3aWxsIGJlIHRoaXMgdmFsdWUgcGx1cyBoYWxmIHRoZSBgc2l6ZWAgdmFsdWUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2VkPWZhbHNlXSAtIElzIHRoZSBpc28gdHJpYW5nbGUgdXBzaWRlIGRvd24/XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbFRvcD0weGVlZWVlZV0gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgdG9wIGZhY2Ugb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsTGVmdD0weDk5OTk5OV0gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgbGVmdCBmYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbFJpZ2h0PTB4Y2NjY2NjXSAtIFRoZSBmaWxsIGNvbG9yIG9mIHRoZSByaWdodCBmYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUuXHJcbiAqL1xyXG52YXIgSXNvVHJpYW5nbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFNoYXBlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIElzb1RyaWFuZ2xlUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gSXNvVHJpYW5nbGUgKHNjZW5lLCB4LCB5LCBzaXplLCBoZWlnaHQsIHJldmVyc2VkLCBmaWxsVG9wLCBmaWxsTGVmdCwgZmlsbFJpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkgeyBzaXplID0gNDg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMzI7IH1cclxuICAgICAgICBpZiAocmV2ZXJzZWQgPT09IHVuZGVmaW5lZCkgeyByZXZlcnNlZCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGZpbGxUb3AgPT09IHVuZGVmaW5lZCkgeyBmaWxsVG9wID0gMHhlZWVlZWU7IH1cclxuICAgICAgICBpZiAoZmlsbExlZnQgPT09IHVuZGVmaW5lZCkgeyBmaWxsTGVmdCA9IDB4OTk5OTk5OyB9XHJcbiAgICAgICAgaWYgKGZpbGxSaWdodCA9PT0gdW5kZWZpbmVkKSB7IGZpbGxSaWdodCA9IDB4Y2NjY2NjOyB9XHJcblxyXG4gICAgICAgIFNoYXBlLmNhbGwodGhpcywgc2NlbmUsICdJc29UcmlhbmdsZScsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcHJvamVjdGlvbiBsZXZlbCBvZiB0aGUgaXNvIGJveC4gQ2hhbmdlIHRoaXMgdG8gY2hhbmdlIHRoZSAnYW5nbGUnIGF0IHdoaWNoIHlvdSBhcmUgbG9va2luZyBhdCB0aGUgYm94LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb1RyaWFuZ2xlI3Byb2plY3Rpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCA0XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbiA9IDQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb2xvciB1c2VkIHRvIGZpbGwgaW4gdGhlIHRvcCBvZiB0aGUgaXNvIHRyaWFuZ2xlLiBUaGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgdHJpYW5nbGUgaXMgcmV2ZXJzZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGUjZmlsbFRvcFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmlsbFRvcCA9IGZpbGxUb3A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb2xvciB1c2VkIHRvIGZpbGwgaW4gdGhlIGxlZnQtZmFjaW5nIHNpZGUgb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNmaWxsTGVmdFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmlsbExlZnQgPSBmaWxsTGVmdDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgcmlnaHQtZmFjaW5nIHNpZGUgb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNmaWxsUmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxSaWdodCA9IGZpbGxSaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgaWYgdGhlIHRvcC1mYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUgYmUgcmVuZGVyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGUjc2hvd1RvcFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaG93VG9wID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgaWYgdGhlIGxlZnQtZmFjZSBvZiB0aGUgaXNvIHRyaWFuZ2xlIGJlIHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb1RyaWFuZ2xlI3Nob3dMZWZ0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNob3dMZWZ0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29udHJvbHMgaWYgdGhlIHJpZ2h0LWZhY2Ugb2YgdGhlIGlzbyB0cmlhbmdsZSBiZSByZW5kZXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNzaG93UmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hvd1JpZ2h0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0cyBpZiB0aGUgaXNvIHRyaWFuZ2xlIHdpbGwgYmUgcmVuZGVyZWQgdXBzaWRlIGRvd24gb3Igbm90LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLklzb1RyaWFuZ2xlI2lzUmV2ZXJzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzUmV2ZXJzZWQgPSByZXZlcnNlZDtcclxuXHJcbiAgICAgICAgdGhpcy5pc0ZpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHNpemUsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHByb2plY3Rpb24gbGV2ZWwgb2YgdGhlIGlzbyB0cmlhbmdsZS4gQ2hhbmdlIHRoaXMgdG8gY2hhbmdlIHRoZSAnYW5nbGUnIGF0IHdoaWNoIHlvdSBhcmUgbG9va2luZyBhdCB0aGUgcHlyYW1pZC5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNzZXRQcm9qZWN0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9qZWN0aW9uIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFByb2plY3Rpb246IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBpZiB0aGUgaXNvIHRyaWFuZ2xlIHdpbGwgYmUgcmVuZGVyZWQgdXBzaWRlIGRvd24gb3Igbm90LlxyXG4gICAgICogVGhpcyBjYWxsIGNhbiBiZSBjaGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLklzb1RyaWFuZ2xlI3NldFJldmVyc2VkXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmV2ZXJzZWQgLSBTZXRzIGlmIHRoZSBpc28gdHJpYW5nbGUgd2lsbCBiZSByZW5kZXJlZCB1cHNpZGUgZG93biBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UmV2ZXJzZWQ6IGZ1bmN0aW9uIChyZXZlcnNlZClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzUmV2ZXJzZWQgPSByZXZlcnNlZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB3aGljaCBmYWNlcyBvZiB0aGUgaXNvIHRyaWFuZ2xlIHdpbGwgYmUgcmVuZGVyZWQuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGUjc2V0RmFjZXNcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd1RvcD10cnVlXSAtIFNob3cgdGhlIHRvcC1mYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUgKG9ubHkgaWYgYHJldmVyc2VkYCBpcyB0cnVlKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0xlZnQ9dHJ1ZV0gLSBTaG93IHRoZSBsZWZ0LWZhY2Ugb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3dSaWdodD10cnVlXSAtIFNob3cgdGhlIHJpZ2h0LWZhY2Ugb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGYWNlczogZnVuY3Rpb24gKHNob3dUb3AsIHNob3dMZWZ0LCBzaG93UmlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNob3dUb3AgPT09IHVuZGVmaW5lZCkgeyBzaG93VG9wID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmIChzaG93TGVmdCA9PT0gdW5kZWZpbmVkKSB7IHNob3dMZWZ0ID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmIChzaG93UmlnaHQgPT09IHVuZGVmaW5lZCkgeyBzaG93UmlnaHQgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuc2hvd1RvcCA9IHNob3dUb3A7XHJcbiAgICAgICAgdGhpcy5zaG93TGVmdCA9IHNob3dMZWZ0O1xyXG4gICAgICAgIHRoaXMuc2hvd1JpZ2h0ID0gc2hvd1JpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmaWxsIGNvbG9ycyBmb3IgZWFjaCBmYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGUjc2V0RmlsbFN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbFRvcF0gLSBUaGUgY29sb3IgdXNlZCB0byBmaWxsIHRoZSB0b3Agb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbExlZnRdIC0gVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgbGVmdC1mYWNpbmcgc2lkZSBvZiB0aGUgaXNvIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsUmlnaHRdIC0gVGhlIGNvbG9yIHVzZWQgdG8gZmlsbCBpbiB0aGUgcmlnaHQtZmFjaW5nIHNpZGUgb2YgdGhlIGlzbyB0cmlhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGaWxsU3R5bGU6IGZ1bmN0aW9uIChmaWxsVG9wLCBmaWxsTGVmdCwgZmlsbFJpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmlsbFRvcCA9IGZpbGxUb3A7XHJcbiAgICAgICAgdGhpcy5maWxsTGVmdCA9IGZpbGxMZWZ0O1xyXG4gICAgICAgIHRoaXMuZmlsbFJpZ2h0ID0gZmlsbFJpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLmlzRmlsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSXNvVHJpYW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0ZpbGxTdHlsZUNhbnZhcycpO1xyXG52YXIgU2V0VHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBJc29UcmlhbmdsZUNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIGlmIChTZXRUcmFuc2Zvcm0ocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCkgJiYgc3JjLmlzRmlsbGVkKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzaXplID0gc3JjLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBzcmMuaGVpZ2h0O1xyXG4gICAgXHJcbiAgICAgICAgdmFyIHNpemVBID0gc2l6ZSAvIDI7XHJcbiAgICAgICAgdmFyIHNpemVCID0gc2l6ZSAvIHNyYy5wcm9qZWN0aW9uO1xyXG5cclxuICAgICAgICB2YXIgcmV2ZXJzZWQgPSBzcmMuaXNSZXZlcnNlZDtcclxuXHJcbiAgICAgICAgLy8gIFRvcCBGYWNlXHJcblxyXG4gICAgICAgIGlmIChzcmMuc2hvd1RvcCAmJiByZXZlcnNlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGxTdHlsZUNhbnZhcyhjdHgsIHNyYywgc3JjLmZpbGxUb3ApO1xyXG5cclxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgICAgICAgICAgY3R4Lm1vdmVUbygtc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKDAsIC1zaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8oc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgICAgICBjdHgubGluZVRvKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgTGVmdCBGYWNlXHJcblxyXG4gICAgICAgIGlmIChzcmMuc2hvd0xlZnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5maWxsTGVmdCk7XHJcblxyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV2ZXJzZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oMCwgc2l6ZUIpO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbygwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKC1zaXplQSwgMCk7XHJcbiAgICAgICAgICAgICAgICBjdHgubGluZVRvKDAsIHNpemVCKTtcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oMCwgc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdHguZmlsbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFJpZ2h0IEZhY2VcclxuXHJcbiAgICAgICAgaWYgKHNyYy5zaG93UmlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMsIHNyYy5maWxsUmlnaHQpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJldmVyc2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oMCwgc2l6ZUIpO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbygwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHNpemVBLCAwKTtcclxuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oMCwgc2l6ZUIpO1xyXG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbygwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJc29UcmlhbmdsZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBJc29UcmlhbmdsZSA9IHJlcXVpcmUoJy4vSXNvVHJpYW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IElzb1RyaWFuZ2xlIFNoYXBlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSXNvVHJpYW5nbGUgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIFxyXG4gKiBUaGUgSXNvVHJpYW5nbGUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBmaWxsIGNvbG9ycyBhbmQgY2Fubm90IGJlIHN0cm9rZWQuXHJcbiAqIFxyXG4gKiBBbiBJc29UcmlhbmdsZSBpcyBhbiAnaXNvbWV0cmljJyB0cmlhbmdsZS4gVGhpbmsgb2YgaXQgbGlrZSBhIHB5cmFtaWQuIEVhY2ggZmFjZSBoYXMgYSBkaWZmZXJlbnRcclxuICogZmlsbCBjb2xvci4gWW91IGNhbiBzZXQgdGhlIGNvbG9yIG9mIHRoZSB0b3AsIGxlZnQgYW5kIHJpZ2h0IGZhY2VzIG9mIHRoZSB0cmlhbmdsZSByZXNwZWN0aXZlbHlcclxuICogWW91IGNhbiBhbHNvIGNob29zZSB3aGljaCBvZiB0aGUgZmFjZXMgYXJlIHJlbmRlcmVkIHZpYSB0aGUgYHNob3dUb3BgLCBgc2hvd0xlZnRgIGFuZCBgc2hvd1JpZ2h0YCBwcm9wZXJ0aWVzLlxyXG4gKiBcclxuICogWW91IGNhbm5vdCB2aWV3IGFuIElzb1RyaWFuZ2xlIGZyb20gdW5kZXItbmVhdGgsIGhvd2V2ZXIgeW91IGNhbiBjaGFuZ2UgdGhlICdhbmdsZScgYnkgc2V0dGluZ1xyXG4gKiB0aGUgYHByb2plY3Rpb25gIHByb3BlcnR5LiBUaGUgYHJldmVyc2VkYCBwcm9wZXJ0eSBjb250cm9scyBpZiB0aGUgSXNvVHJpYW5nbGUgaXMgcmVuZGVyZWQgdXBzaWRlXHJcbiAqIGRvd24gb3Igbm90LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNpc290cmlhbmdsZVxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT00OF0gLSBUaGUgd2lkdGggb2YgdGhlIGlzbyB0cmlhbmdsZSBpbiBwaXhlbHMuIFRoZSBsZWZ0IGFuZCByaWdodCBmYWNlcyB3aWxsIGJlIGV4YWN0bHkgaGFsZiB0aGlzIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0zMl0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpc28gdHJpYW5nbGUuIFRoZSBsZWZ0IGFuZCByaWdodCBmYWNlcyB3aWxsIGJlIHRoaXMgdGFsbC4gVGhlIG92ZXJhbGwgaGVpZ2h0IG9mIHRoZSBpc28gdHJpYW5nbGUgd2lsbCBiZSB0aGlzIHZhbHVlIHBsdXMgaGFsZiB0aGUgYHNpemVgIHZhbHVlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXZlcnNlZD1mYWxzZV0gLSBJcyB0aGUgaXNvIHRyaWFuZ2xlIHVwc2lkZSBkb3duP1xyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxUb3A9MHhlZWVlZWVdIC0gVGhlIGZpbGwgY29sb3Igb2YgdGhlIHRvcCBmYWNlIG9mIHRoZSBpc28gdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbExlZnQ9MHg5OTk5OTldIC0gVGhlIGZpbGwgY29sb3Igb2YgdGhlIGxlZnQgZmFjZSBvZiB0aGUgaXNvIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxSaWdodD0weGNjY2NjY10gLSBUaGUgZmlsbCBjb2xvciBvZiB0aGUgcmlnaHQgZmFjZSBvZiB0aGUgaXNvIHRyaWFuZ2xlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuSXNvVHJpYW5nbGV9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ2lzb3RyaWFuZ2xlJywgZnVuY3Rpb24gKHgsIHksIHNpemUsIGhlaWdodCwgcmV2ZXJzZWQsIGZpbGxUb3AsIGZpbGxMZWZ0LCBmaWxsUmlnaHQpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgSXNvVHJpYW5nbGUodGhpcy5zY2VuZSwgeCwgeSwgc2l6ZSwgaGVpZ2h0LCByZXZlcnNlZCwgZmlsbFRvcCwgZmlsbExlZnQsIGZpbGxSaWdodCkpO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vSXNvVHJpYW5nbGVXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL0lzb1RyaWFuZ2xlQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZSNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Jc29UcmlhbmdsZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIElzb1RyaWFuZ2xlV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzaGFwZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHJlbmRlcmVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHJcbiAgICBzaGFwZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgPSBzcmMueTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBzaGFwZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbU1hdHJpeC5tdWx0aXBseShzaGFwZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcblxyXG4gICAgdmFyIHNpemUgPSBzcmMud2lkdGg7XHJcbiAgICB2YXIgaGVpZ2h0ID0gc3JjLmhlaWdodDtcclxuXHJcbiAgICB2YXIgc2l6ZUEgPSBzaXplIC8gMjtcclxuICAgIHZhciBzaXplQiA9IHNpemUgLyBzcmMucHJvamVjdGlvbjtcclxuXHJcbiAgICB2YXIgcmV2ZXJzZWQgPSBzcmMuaXNSZXZlcnNlZDtcclxuXHJcbiAgICB2YXIgYWxwaGEgPSBjYW1lcmEuYWxwaGEgKiBzcmMuYWxwaGE7XHJcblxyXG4gICAgaWYgKCFzcmMuaXNGaWxsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB0aW50O1xyXG5cclxuICAgIHZhciB4MDtcclxuICAgIHZhciB5MDtcclxuXHJcbiAgICB2YXIgeDE7XHJcbiAgICB2YXIgeTE7XHJcblxyXG4gICAgdmFyIHgyO1xyXG4gICAgdmFyIHkyO1xyXG5cclxuICAgIC8vICBUb3AgRmFjZVxyXG5cclxuICAgIGlmIChzcmMuc2hvd1RvcCAmJiByZXZlcnNlZClcclxuICAgIHtcclxuICAgICAgICB0aW50ID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5maWxsVG9wLCBhbHBoYSk7XHJcblxyXG4gICAgICAgIHgwID0gY2FsY01hdHJpeC5nZXRYKC1zaXplQSwgLWhlaWdodCk7XHJcbiAgICAgICAgeTAgPSBjYWxjTWF0cml4LmdldFkoLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgIFxyXG4gICAgICAgIHgxID0gY2FsY01hdHJpeC5nZXRYKDAsIC1zaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgeTEgPSBjYWxjTWF0cml4LmdldFkoMCwgLXNpemVCIC0gaGVpZ2h0KTtcclxuICAgIFxyXG4gICAgICAgIHgyID0gY2FsY01hdHJpeC5nZXRYKHNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICB5MiA9IGNhbGNNYXRyaXguZ2V0WShzaXplQSwgLWhlaWdodCk7XHJcbiAgICBcclxuICAgICAgICB2YXIgeDMgPSBjYWxjTWF0cml4LmdldFgoMCwgc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgICAgIHZhciB5MyA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQiAtIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG4gICAgXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hRdWFkKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIExlZnQgRmFjZVxyXG5cclxuICAgIGlmIChzcmMuc2hvd0xlZnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcChzcmMuZmlsbExlZnQsIGFscGhhKTtcclxuXHJcbiAgICAgICAgaWYgKHJldmVyc2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICAgICAgeTAgPSBjYWxjTWF0cml4LmdldFkoLXNpemVBLCAtaGVpZ2h0KTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgeDEgPSBjYWxjTWF0cml4LmdldFgoMCwgc2l6ZUIpO1xyXG4gICAgICAgICAgICB5MSA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHgyID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICAgICAgeTIgPSBjYWxjTWF0cml4LmdldFkoMCwgc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4MCA9IGNhbGNNYXRyaXguZ2V0WCgtc2l6ZUEsIDApO1xyXG4gICAgICAgICAgICB5MCA9IGNhbGNNYXRyaXguZ2V0WSgtc2l6ZUEsIDApO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB4MSA9IGNhbGNNYXRyaXguZ2V0WCgwLCBzaXplQik7XHJcbiAgICAgICAgICAgIHkxID0gY2FsY01hdHJpeC5nZXRZKDAsIHNpemVCKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgeDIgPSBjYWxjTWF0cml4LmdldFgoMCwgc2l6ZUIgLSBoZWlnaHQpO1xyXG4gICAgICAgICAgICB5MiA9IGNhbGNNYXRyaXguZ2V0WSgwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hUcmkoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFJpZ2h0IEZhY2VcclxuXHJcbiAgICBpZiAoc3JjLnNob3dSaWdodClcclxuICAgIHtcclxuICAgICAgICB0aW50ID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5maWxsUmlnaHQsIGFscGhhKTtcclxuXHJcbiAgICAgICAgaWYgKHJldmVyc2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoc2l6ZUEsIC1oZWlnaHQpO1xyXG4gICAgICAgICAgICB5MCA9IGNhbGNNYXRyaXguZ2V0WShzaXplQSwgLWhlaWdodCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHgxID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCKTtcclxuICAgICAgICAgICAgeTEgPSBjYWxjTWF0cml4LmdldFkoMCwgc2l6ZUIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB4MiA9IGNhbGNNYXRyaXguZ2V0WCgwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIHkyID0gY2FsY01hdHJpeC5nZXRZKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeDAgPSBjYWxjTWF0cml4LmdldFgoc2l6ZUEsIDApO1xyXG4gICAgICAgICAgICB5MCA9IGNhbGNNYXRyaXguZ2V0WShzaXplQSwgMCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHgxID0gY2FsY01hdHJpeC5nZXRYKDAsIHNpemVCKTtcclxuICAgICAgICAgICAgeTEgPSBjYWxjTWF0cml4LmdldFkoMCwgc2l6ZUIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB4MiA9IGNhbGNNYXRyaXguZ2V0WCgwLCBzaXplQiAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIHkyID0gY2FsY01hdHJpeC5nZXRZKDAsIHNpemVCIC0gaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG4gICAgXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hUcmkoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElzb1RyaWFuZ2xlV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgU2hhcGUgPSByZXF1aXJlKCcuLi9TaGFwZScpO1xyXG52YXIgR2VvbUxpbmUgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL2xpbmUvTGluZScpO1xyXG52YXIgTGluZVJlbmRlciA9IHJlcXVpcmUoJy4vTGluZVJlbmRlcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIExpbmUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBzdHJva2UgY29sb3JzIGFuZCBjYW5ub3QgYmUgZmlsbGVkLlxyXG4gKiBcclxuICogQSBMaW5lIFNoYXBlIGFsbG93cyB5b3UgdG8gZHJhdyBhIGxpbmUgYmV0d2VlbiB0d28gcG9pbnRzIGluIHlvdXIgZ2FtZS4gWW91IGNhbiBjb250cm9sIHRoZVxyXG4gKiBzdHJva2UgY29sb3IgYW5kIHRoaWNrbmVzcyBvZiB0aGUgbGluZS4gSW4gV2ViR0wgb25seSB5b3UgY2FuIGFsc28gc3BlY2lmeSBhIGRpZmZlcmVudFxyXG4gKiB0aGlja25lc3MgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaW5lLCBhbGxvd2luZyB5b3UgdG8gcmVuZGVyIGxpbmVzIHRoYXQgdGFwZXItb2ZmLlxyXG4gKiBcclxuICogSWYgeW91IG5lZWQgdG8gZHJhdyBtdWx0aXBsZSBsaW5lcyBpbiBhIHNlcXVlbmNlIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlIFBvbHlnb24gU2hhcGUgaW5zdGVhZC5cclxuICpcclxuICogQmUgYXdhcmUgdGhhdCBhcyB3aXRoIGFsbCBHYW1lIE9iamVjdHMgdGhlIGRlZmF1bHQgb3JpZ2luIGlzIDAuNS4gSWYgeW91IG5lZWQgdG8gZHJhdyBhIExpbmVcclxuICogYmV0d2VlbiB0d28gcG9pbnRzIGFuZCB3YW50IHRoZSB4MS95MSB2YWx1ZXMgdG8gbWF0Y2ggdGhlIHgveSB2YWx1ZXMsIHRoZW4gc2V0IHRoZSBvcmlnaW4gdG8gMC5cclxuICpcclxuICogQGNsYXNzIExpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4MT0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5MT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDI9MTI4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTI9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgbGluZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJva2VDb2xvcl0gLSBUaGUgY29sb3IgdGhlIGxpbmUgd2lsbCBiZSBkcmF3biBpbiwgaS5lLiAweGZmMDAwMCBmb3IgcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0cm9rZUFscGhhXSAtIFRoZSBhbHBoYSB0aGUgbGluZSB3aWxsIGJlIGRyYXduIGluLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICovXHJcbnZhciBMaW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBTaGFwZSxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBMaW5lUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTGluZSAoc2NlbmUsIHgsIHksIHgxLCB5MSwgeDIsIHkyLCBzdHJva2VDb2xvciwgc3Ryb2tlQWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAoeDEgPT09IHVuZGVmaW5lZCkgeyB4MSA9IDA7IH1cclxuICAgICAgICBpZiAoeTEgPT09IHVuZGVmaW5lZCkgeyB5MSA9IDA7IH1cclxuICAgICAgICBpZiAoeDIgPT09IHVuZGVmaW5lZCkgeyB4MiA9IDEyODsgfVxyXG4gICAgICAgIGlmICh5MiA9PT0gdW5kZWZpbmVkKSB7IHkyID0gMDsgfVxyXG5cclxuICAgICAgICBTaGFwZS5jYWxsKHRoaXMsIHNjZW5lLCAnTGluZScsIG5ldyBHZW9tTGluZSh4MSwgeTEsIHgyLCB5MikpO1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdlb20ucmlnaHQgLSB0aGlzLmdlb20ubGVmdDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZW9tLmJvdHRvbSAtIHRoaXMuZ2VvbS50b3A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCAob3IgdGhpY2tuZXNzKSBvZiB0aGUgbGluZS5cclxuICAgICAgICAgKiBTZWUgdGhlIHNldExpbmVXaWR0aCBtZXRob2QgZm9yIGV4dHJhIGRldGFpbHMgb24gY2hhbmdpbmcgdGhpcyBvbiBXZWJHTC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5MaW5lI2xpbmVXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS4gSG9sZHMgdGhlIHN0YXJ0IHdpZHRoIG9mIHRoZSBsaW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkxpbmUjX3N0YXJ0V2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0V2lkdGggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcml2YXRlIGludGVybmFsIHZhbHVlLiBIb2xkcyB0aGUgZW5kIHdpZHRoIG9mIHRoZSBsaW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLkxpbmUjX2VuZFdpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9lbmRXaWR0aCA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAoc3Ryb2tlQ29sb3IgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlU3R5bGUoMSwgc3Ryb2tlQ29sb3IsIHN0cm9rZUFscGhhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBsaW5lLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHVzaW5nIHRoZSBXZWJHTCByZW5kZXJlciB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IHN0YXJ0IGFuZCBlbmQgd2lkdGhzLlxyXG4gICAgICogV2hlbiB1c2luZyB0aGUgQ2FudmFzIHJlbmRlcmVyIG9ubHkgdGhlIGBzdGFydFdpZHRoYCB2YWx1ZSBpcyB1c2VkLiBUaGUgYGVuZFdpZHRoYCBpcyBpZ25vcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGluZSNzZXRMaW5lV2lkdGhcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0V2lkdGggLSBUaGUgc3RhcnQgd2lkdGggb2YgdGhlIGxpbmUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZFdpZHRoXSAtIFRoZSBlbmQgd2lkdGggb2YgdGhlIGxpbmUuIE9ubHkgdXNlZCBpbiBXZWJHTC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRMaW5lV2lkdGg6IGZ1bmN0aW9uIChzdGFydFdpZHRoLCBlbmRXaWR0aClcclxuICAgIHtcclxuICAgICAgICBpZiAoZW5kV2lkdGggPT09IHVuZGVmaW5lZCkgeyBlbmRXaWR0aCA9IHN0YXJ0V2lkdGg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5fc3RhcnRXaWR0aCA9IHN0YXJ0V2lkdGg7XHJcbiAgICAgICAgdGhpcy5fZW5kV2lkdGggPSBlbmRXaWR0aDtcclxuXHJcbiAgICAgICAgdGhpcy5saW5lV2lkdGggPSBzdGFydFdpZHRoO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzdGFydCBhbmQgZW5kIGNvb3JkaW5hdGVzIG9mIHRoaXMgTGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaW5lI3NldFRvXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4MT0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeTE9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4Mj0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMaW5lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VG86IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdlb20uc2V0VG8oeDEsIHkxLCB4MiwgeTIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBMaW5lU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9MaW5lU3R5bGVDYW52YXMnKTtcclxudmFyIFNldFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4uLy4uLy4uL3JlbmRlcmVyL2NhbnZhcy91dGlscy9TZXRUcmFuc2Zvcm0nKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuTGluZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuTGluZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIExpbmVDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBjdHggPSByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICBpZiAoU2V0VHJhbnNmb3JtKHJlbmRlcmVyLCBjdHgsIHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICAgICAgdmFyIGR5ID0gc3JjLl9kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgaWYgKHNyYy5pc1N0cm9rZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMaW5lU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgICAgICAgICAgY3R4Lm1vdmVUbyhzcmMuZ2VvbS54MSAtIGR4LCBzcmMuZ2VvbS55MSAtIGR5KTtcclxuICAgICAgICAgICAgY3R4LmxpbmVUbyhzcmMuZ2VvbS54MiAtIGR4LCBzcmMuZ2VvbS55MiAtIGR5KTtcclxuICAgIFxyXG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIExpbmUgPSByZXF1aXJlKCcuL0xpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IExpbmUgU2hhcGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBMaW5lIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogVGhlIExpbmUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgb25seSBzdHJva2UgY29sb3JzIGFuZCBjYW5ub3QgYmUgZmlsbGVkLlxyXG4gKiBcclxuICogQSBMaW5lIFNoYXBlIGFsbG93cyB5b3UgdG8gZHJhdyBhIGxpbmUgYmV0d2VlbiB0d28gcG9pbnRzIGluIHlvdXIgZ2FtZS4gWW91IGNhbiBjb250cm9sIHRoZVxyXG4gKiBzdHJva2UgY29sb3IgYW5kIHRoaWNrbmVzcyBvZiB0aGUgbGluZS4gSW4gV2ViR0wgb25seSB5b3UgY2FuIGFsc28gc3BlY2lmeSBhIGRpZmZlcmVudFxyXG4gKiB0aGlja25lc3MgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaW5lLCBhbGxvd2luZyB5b3UgdG8gcmVuZGVyIGxpbmVzIHRoYXQgdGFwZXItb2ZmLlxyXG4gKiBcclxuICogSWYgeW91IG5lZWQgdG8gZHJhdyBtdWx0aXBsZSBsaW5lcyBpbiBhIHNlcXVlbmNlIHlvdSBtYXkgd2lzaCB0byB1c2UgdGhlIFBvbHlnb24gU2hhcGUgaW5zdGVhZC5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3RvcnkjbGluZVxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDE9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTE9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3gyPTEyOF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3Ryb2tlQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBsaW5lIHdpbGwgYmUgZHJhd24gaW4sIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJva2VBbHBoYV0gLSBUaGUgYWxwaGEgdGhlIGxpbmUgd2lsbCBiZSBkcmF3biBpbi4gWW91IGNhbiBhbHNvIHNldCB0aGUgYWxwaGEgb2YgdGhlIG92ZXJhbGwgU2hhcGUgdXNpbmcgaXRzIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5MaW5lfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdsaW5lJywgZnVuY3Rpb24gKHgsIHksIHgxLCB5MSwgeDIsIHkyLCBzdHJva2VDb2xvciwgc3Ryb2tlQWxwaGEpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgTGluZSh0aGlzLnNjZW5lLCB4LCB5LCB4MSwgeTEsIHgyLCB5Miwgc3Ryb2tlQ29sb3IsIHN0cm9rZUFscGhhKSk7XHJcbn0pO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9MaW5lV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9MaW5lQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5MaW5lI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkxpbmV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBMaW5lV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzaGFwZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mID0gc3JjLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZHggPSBzcmMuX2Rpc3BsYXlPcmlnaW5YO1xyXG4gICAgdmFyIGR5ID0gc3JjLl9kaXNwbGF5T3JpZ2luWTtcclxuICAgIHZhciBhbHBoYSA9IGNhbWVyYS5hbHBoYSAqIHNyYy5hbHBoYTtcclxuXHJcbiAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgIHtcclxuICAgICAgICB2YXIgc3Ryb2tlVGludCA9IHBpcGVsaW5lLnN0cm9rZVRpbnQ7XHJcbiAgICAgICAgdmFyIGNvbG9yID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGFBbmRTd2FwKHNyYy5zdHJva2VDb2xvciwgc3JjLnN0cm9rZUFscGhhICogYWxwaGEpO1xyXG5cclxuICAgICAgICBzdHJva2VUaW50LlRMID0gY29sb3I7XHJcbiAgICAgICAgc3Ryb2tlVGludC5UUiA9IGNvbG9yO1xyXG4gICAgICAgIHN0cm9rZVRpbnQuQkwgPSBjb2xvcjtcclxuICAgICAgICBzdHJva2VUaW50LkJSID0gY29sb3I7XHJcblxyXG4gICAgICAgIHZhciBzdGFydFdpZHRoID0gc3JjLl9zdGFydFdpZHRoO1xyXG4gICAgICAgIHZhciBlbmRXaWR0aCA9IHNyYy5fZW5kV2lkdGg7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLnNldFRleHR1cmUyRCgpO1xyXG5cclxuICAgICAgICBwaXBlbGluZS5iYXRjaExpbmUoXHJcbiAgICAgICAgICAgIHNyYy5nZW9tLngxIC0gZHgsXHJcbiAgICAgICAgICAgIHNyYy5nZW9tLnkxIC0gZHksXHJcbiAgICAgICAgICAgIHNyYy5nZW9tLngyIC0gZHgsXHJcbiAgICAgICAgICAgIHNyYy5nZW9tLnkyIC0gZHksXHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGgsXHJcbiAgICAgICAgICAgIGVuZFdpZHRoLFxyXG4gICAgICAgICAgICAxLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgc2hhcGVNYXRyaXgsXHJcbiAgICAgICAgICAgIGNhbU1hdHJpeFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2x5Z29uUmVuZGVyID0gcmVxdWlyZSgnLi9Qb2x5Z29uUmVuZGVyJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFYXJjdXQgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL3BvbHlnb24vRWFyY3V0Jyk7XHJcbnZhciBHZXRBQUJCID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9wb2x5Z29uL0dldEFBQkInKTtcclxudmFyIEdlb21Qb2x5Z29uID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9wb2x5Z29uL1BvbHlnb24nKTtcclxudmFyIFNoYXBlID0gcmVxdWlyZSgnLi4vU2hhcGUnKTtcclxudmFyIFNtb290aCA9IHJlcXVpcmUoJy4uLy4uLy4uL2dlb20vcG9seWdvbi9TbW9vdGgnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBQb2x5Z29uIFNoYXBlIGlzIGEgR2FtZSBPYmplY3QgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBTY2VuZSwgR3JvdXAgb3IgQ29udGFpbmVyLiBZb3UgY2FuXHJcbiAqIHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIEdhbWUgT2JqZWN0IGluIHlvdXIgZ2FtZSwgc3VjaCBhcyB0d2VlbmluZyBpdCwgc2NhbGluZyBpdCwgb3IgZW5hYmxpbmdcclxuICogaXQgZm9yIGlucHV0IG9yIHBoeXNpY3MuIEl0IHByb3ZpZGVzIGEgcXVpY2sgYW5kIGVhc3kgd2F5IGZvciB5b3UgdG8gcmVuZGVyIHRoaXMgc2hhcGUgaW4geW91clxyXG4gKiBnYW1lIHdpdGhvdXQgdXNpbmcgYSB0ZXh0dXJlLCB3aGlsZSBzdGlsbCB0YWtpbmcgYWR2YW50YWdlIG9mIGJlaW5nIGZ1bGx5IGJhdGNoZWQgaW4gV2ViR0wuXHJcbiAqIFxyXG4gKiBUaGlzIHNoYXBlIHN1cHBvcnRzIGJvdGggZmlsbCBhbmQgc3Ryb2tlIGNvbG9ycy5cclxuICogXHJcbiAqIFRoZSBQb2x5Z29uIFNoYXBlIGlzIGNyZWF0ZWQgYnkgcHJvdmlkaW5nIGEgbGlzdCBvZiBwb2ludHMsIHdoaWNoIGFyZSB0aGVuIHVzZWQgdG8gY3JlYXRlIGFuXHJcbiAqIGludGVybmFsIFBvbHlnb24gZ2VvbWV0cnkgb2JqZWN0LiBUaGUgcG9pbnRzIGNhbiBiZSBzZXQgZnJvbSBhIHZhcmlldHkgb2YgZm9ybWF0czpcclxuICpcclxuICogLSBBIHN0cmluZyBjb250YWluaW5nIHBhaXJlZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlOiBgJzQwIDAgNDAgMjAgMTAwIDIwIDEwMCA4MCA0MCA4MCA0MCAxMDAgMCA1MCdgXHJcbiAqIC0gQW4gYXJyYXkgb2YgUG9pbnQgb3IgVmVjdG9yMiBvYmplY3RzOiBgW25ldyBQaGFzZXIuTWF0aC5WZWN0b3IyKHgxLCB5MSksIC4uLl1gXHJcbiAqIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHB1YmxpYyB4L3kgcHJvcGVydGllczogYFtvYmoxLCBvYmoyLCAuLi5dYFxyXG4gKiAtIEFuIGFycmF5IG9mIHBhaXJlZCBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHBvaW50IGNvb3JkaW5hdGVzOiBgW3gxLHkxLCB4Mix5MiwgLi4uXWBcclxuICogLSBBbiBhcnJheSBvZiBhcnJheXMgd2l0aCB0d28gZWxlbWVudHMgcmVwcmVzZW50aW5nIHgveSBjb29yZGluYXRlczogYFtbeDEsIHkxXSwgW3gyLCB5Ml0sIC4uLl1gXHJcbiAqIFxyXG4gKiBCeSBkZWZhdWx0IHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBvZiB0aGlzIFNoYXBlIHJlZmVyIHRvIHRoZSBjZW50ZXIgb2YgaXQuIEhvd2V2ZXIsIGRlcGVuZGluZ1xyXG4gKiBvbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50cyBwcm92aWRlZCwgdGhlIGZpbmFsIHNoYXBlIG1heSBiZSByZW5kZXJlZCBvZmZzZXQgZnJvbSBpdHMgb3JpZ2luLlxyXG4gKlxyXG4gKiBAY2xhc3MgUG9seWdvblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge2FueX0gW3BvaW50c10gLSBUaGUgcG9pbnRzIHRoYXQgbWFrZSB1cCB0aGUgcG9seWdvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSBwb2x5Z29uIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQWxwaGFdIC0gVGhlIGFscGhhIHRoZSBwb2x5Z29uIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gKi9cclxudmFyIFBvbHlnb24gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFNoYXBlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIFBvbHlnb25SZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBQb2x5Z29uIChzY2VuZSwgeCwgeSwgcG9pbnRzLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICBTaGFwZS5jYWxsKHRoaXMsIHNjZW5lLCAnUG9seWdvbicsIG5ldyBHZW9tUG9seWdvbihwb2ludHMpKTtcclxuXHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IEdldEFBQkIodGhpcy5nZW9tKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLnNldFNpemUoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsU3R5bGUoZmlsbENvbG9yLCBmaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU21vb3RocyB0aGUgcG9seWdvbiBvdmVyIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBzcGVjaWZpZWQuXHJcbiAgICAgKiBUaGUgYmFzZSBwb2x5Z29uIGRhdGEgd2lsbCBiZSB1cGRhdGVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZSBzbW9vdGhlZCB2YWx1ZXMuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUG9seWdvbiNzbW9vdGhcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaXRlcmF0aW9ucz0xXSAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gYXBwbHkgdGhlIHBvbHlnb24gc21vb3RoaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNtb290aDogZnVuY3Rpb24gKGl0ZXJhdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBpdGVyYXRpb25zID0gMTsgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNtb290aCh0aGlzLmdlb20pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHVwZGF0ZXMgdGhlIGRhdGEgYW5kIHBhdGggdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBvbHlnb24jdXBkYXRlRGF0YVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVEYXRhOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwYXRoID0gW107XHJcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuZ2VvbS5wb2ludHM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aC5wdXNoKHBvaW50c1tpXS54LCBwb2ludHNbaV0ueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXRoLnB1c2gocG9pbnRzWzBdLngsIHBvaW50c1swXS55KTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXRoSW5kZXhlcyA9IEVhcmN1dChwYXRoKTtcclxuICAgICAgICB0aGlzLnBhdGhEYXRhID0gcGF0aDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUG9seWdvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmlsbFN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vRmlsbFN0eWxlQ2FudmFzJyk7XHJcbnZhciBMaW5lU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9MaW5lU3R5bGVDYW52YXMnKTtcclxudmFyIFNldFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4uLy4uLy4uL3JlbmRlcmVyL2NhbnZhcy91dGlscy9TZXRUcmFuc2Zvcm0nKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUG9seWdvbiNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUG9seWdvbn0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFBvbHlnb25DYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBjdHggPSByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICBpZiAoU2V0VHJhbnNmb3JtKHJlbmRlcmVyLCBjdHgsIHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICAgICAgdmFyIGR5ID0gc3JjLl9kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIHBhdGggPSBzcmMucGF0aERhdGE7XHJcbiAgICAgICAgdmFyIHBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aCAtIDE7XHJcbiAgICBcclxuICAgICAgICB2YXIgcHgxID0gcGF0aFswXSAtIGR4O1xyXG4gICAgICAgIHZhciBweTEgPSBwYXRoWzFdIC0gZHk7XHJcblxyXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgY3R4Lm1vdmVUbyhweDEsIHB5MSk7XHJcbiAgICBcclxuICAgICAgICBpZiAoIXNyYy5jbG9zZVBhdGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXRoTGVuZ3RoIC09IDI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBwYXRoTGVuZ3RoOyBpICs9IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcHgyID0gcGF0aFtpXSAtIGR4O1xyXG4gICAgICAgICAgICB2YXIgcHkyID0gcGF0aFtpICsgMV0gLSBkeTtcclxuICAgIFxyXG4gICAgICAgICAgICBjdHgubGluZVRvKHB4MiwgcHkyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgaWYgKHNyYy5pc0ZpbGxlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGxTdHlsZUNhbnZhcyhjdHgsIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBjdHguZmlsbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNyYy5pc1N0cm9rZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMaW5lU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG5cclxuICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFJlc3RvcmUgdGhlIGNvbnRleHQgc2F2ZWQgaW4gU2V0VHJhbnNmb3JtXHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUG9seWdvbkNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBQb2x5Z29uID0gcmVxdWlyZSgnLi9Qb2x5Z29uJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBQb2x5Z29uIFNoYXBlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICogXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFBvbHlnb24gR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIFxyXG4gKiBUaGUgUG9seWdvbiBTaGFwZSBpcyBhIEdhbWUgT2JqZWN0IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgU2NlbmUsIEdyb3VwIG9yIENvbnRhaW5lci4gWW91IGNhblxyXG4gKiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBHYW1lIE9iamVjdCBpbiB5b3VyIGdhbWUsIHN1Y2ggYXMgdHdlZW5pbmcgaXQsIHNjYWxpbmcgaXQsIG9yIGVuYWJsaW5nXHJcbiAqIGl0IGZvciBpbnB1dCBvciBwaHlzaWNzLiBJdCBwcm92aWRlcyBhIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgeW91IHRvIHJlbmRlciB0aGlzIHNoYXBlIGluIHlvdXJcclxuICogZ2FtZSB3aXRob3V0IHVzaW5nIGEgdGV4dHVyZSwgd2hpbGUgc3RpbGwgdGFraW5nIGFkdmFudGFnZSBvZiBiZWluZyBmdWxseSBiYXRjaGVkIGluIFdlYkdMLlxyXG4gKiBcclxuICogVGhpcyBzaGFwZSBzdXBwb3J0cyBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMuXHJcbiAqIFxyXG4gKiBUaGUgUG9seWdvbiBTaGFwZSBpcyBjcmVhdGVkIGJ5IHByb3ZpZGluZyBhIGxpc3Qgb2YgcG9pbnRzLCB3aGljaCBhcmUgdGhlbiB1c2VkIHRvIGNyZWF0ZSBhblxyXG4gKiBpbnRlcm5hbCBQb2x5Z29uIGdlb21ldHJ5IG9iamVjdC4gVGhlIHBvaW50cyBjYW4gYmUgc2V0IGZyb20gYSB2YXJpZXR5IG9mIGZvcm1hdHM6XHJcbiAqXHJcbiAqIC0gQW4gYXJyYXkgb2YgUG9pbnQgb3IgVmVjdG9yMiBvYmplY3RzOiBgW25ldyBQaGFzZXIuTWF0aC5WZWN0b3IyKHgxLCB5MSksIC4uLl1gXHJcbiAqIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHB1YmxpYyB4L3kgcHJvcGVydGllczogYFtvYmoxLCBvYmoyLCAuLi5dYFxyXG4gKiAtIEFuIGFycmF5IG9mIHBhaXJlZCBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHBvaW50IGNvb3JkaW5hdGVzOiBgW3gxLHkxLCB4Mix5MiwgLi4uXWBcclxuICogLSBBbiBhcnJheSBvZiBhcnJheXMgd2l0aCB0d28gZWxlbWVudHMgcmVwcmVzZW50aW5nIHgveSBjb29yZGluYXRlczogYFtbeDEsIHkxXSwgW3gyLCB5Ml0sIC4uLl1gXHJcbiAqIFxyXG4gKiBCeSBkZWZhdWx0IHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBvZiB0aGlzIFNoYXBlIHJlZmVyIHRvIHRoZSBjZW50ZXIgb2YgaXQuIEhvd2V2ZXIsIGRlcGVuZGluZ1xyXG4gKiBvbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50cyBwcm92aWRlZCwgdGhlIGZpbmFsIHNoYXBlIG1heSBiZSByZW5kZXJlZCBvZmZzZXQgZnJvbSBpdHMgb3JpZ2luLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNwb2x5Z29uXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHthbnl9IFtwb2ludHNdIC0gVGhlIHBvaW50cyB0aGF0IG1ha2UgdXAgdGhlIHBvbHlnb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgcG9seWdvbiB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgcG9seWdvbiB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlBvbHlnb259IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3BvbHlnb24nLCBmdW5jdGlvbiAoeCwgeSwgcG9pbnRzLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBQb2x5Z29uKHRoaXMuc2NlbmUsIHgsIHksIHBvaW50cywgZmlsbENvbG9yLCBmaWxsQWxwaGEpKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1BvbHlnb25XZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL1BvbHlnb25DYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmlsbFBhdGhXZWJHTCA9IHJlcXVpcmUoJy4uL0ZpbGxQYXRoV2ViR0wnKTtcclxudmFyIFN0cm9rZVBhdGhXZWJHTCA9IHJlcXVpcmUoJy4uL1N0cm9rZVBhdGhXZWJHTCcpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlBvbHlnb24jcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUG9seWdvbn0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFBvbHlnb25XZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIHBpcGVsaW5lID0gdGhpcy5waXBlbGluZTtcclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIHNoYXBlTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgyO1xyXG4gICAgdmFyIGNhbGNNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgcmVuZGVyZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xyXG5cclxuICAgIHNoYXBlTWF0cml4LmFwcGx5SVRSUyhzcmMueCwgc3JjLnksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcblxyXG4gICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBzaGFwZU1hdHJpeC5lID0gc3JjLng7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiA9IHNyYy55O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3Rvclk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FtTWF0cml4Lm11bHRpcGx5KHNoYXBlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuXHJcbiAgICB2YXIgZHggPSBzcmMuX2Rpc3BsYXlPcmlnaW5YO1xyXG4gICAgdmFyIGR5ID0gc3JjLl9kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICB2YXIgYWxwaGEgPSBjYW1lcmEuYWxwaGEgKiBzcmMuYWxwaGE7XHJcblxyXG4gICAgaWYgKHNyYy5pc0ZpbGxlZClcclxuICAgIHtcclxuICAgICAgICBGaWxsUGF0aFdlYkdMKHBpcGVsaW5lLCBjYWxjTWF0cml4LCBzcmMsIGFscGhhLCBkeCwgZHkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAge1xyXG4gICAgICAgIFN0cm9rZVBhdGhXZWJHTChwaXBlbGluZSwgc3JjLCBhbHBoYSwgZHgsIGR5KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUG9seWdvbldlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdlb21SZWN0YW5nbGUgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxudmFyIFNoYXBlID0gcmVxdWlyZSgnLi4vU2hhcGUnKTtcclxudmFyIFJlY3RhbmdsZVJlbmRlciA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlUmVuZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgUmVjdGFuZ2xlIFNoYXBlIGlzIGEgR2FtZSBPYmplY3QgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBTY2VuZSwgR3JvdXAgb3IgQ29udGFpbmVyLiBZb3UgY2FuXHJcbiAqIHRyZWF0IGl0IGxpa2UgYW55IG90aGVyIEdhbWUgT2JqZWN0IGluIHlvdXIgZ2FtZSwgc3VjaCBhcyB0d2VlbmluZyBpdCwgc2NhbGluZyBpdCwgb3IgZW5hYmxpbmdcclxuICogaXQgZm9yIGlucHV0IG9yIHBoeXNpY3MuIEl0IHByb3ZpZGVzIGEgcXVpY2sgYW5kIGVhc3kgd2F5IGZvciB5b3UgdG8gcmVuZGVyIHRoaXMgc2hhcGUgaW4geW91clxyXG4gKiBnYW1lIHdpdGhvdXQgdXNpbmcgYSB0ZXh0dXJlLCB3aGlsZSBzdGlsbCB0YWtpbmcgYWR2YW50YWdlIG9mIGJlaW5nIGZ1bGx5IGJhdGNoZWQgaW4gV2ViR0wuXHJcbiAqIFxyXG4gKiBUaGlzIHNoYXBlIHN1cHBvcnRzIGJvdGggZmlsbCBhbmQgc3Ryb2tlIGNvbG9ycy5cclxuICogXHJcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSByZWN0YW5nbGUgYnkgY2hhbmdpbmcgdGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBSZWN0YW5nbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MTI4XSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xMjhdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxDb2xvcl0gLSBUaGUgY29sb3IgdGhlIHJlY3RhbmdsZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgcmVjdGFuZ2xlIHdpbGwgYmUgZmlsbGVkIHdpdGguIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGFscGhhIG9mIHRoZSBvdmVyYWxsIFNoYXBlIHVzaW5nIGl0cyBgYWxwaGFgIHByb3BlcnR5LlxyXG4gKi9cclxudmFyIFJlY3RhbmdsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU2hhcGUsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgUmVjdGFuZ2xlUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUmVjdGFuZ2xlIChzY2VuZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDEyODsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSAxMjg7IH1cclxuXHJcbiAgICAgICAgU2hhcGUuY2FsbCh0aGlzLCBzY2VuZSwgJ1JlY3RhbmdsZScsIG5ldyBHZW9tUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmIChmaWxsQ29sb3IgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsbFN0eWxlKGZpbGxDb2xvciwgZmlsbEFscGhhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHVwZGF0ZXMgdGhlIGRhdGEgYW5kIHBhdGggdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlY3RhbmdsZSN1cGRhdGVEYXRhXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZURhdGE6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGggPSBbXTtcclxuICAgICAgICB2YXIgcmVjdCA9IHRoaXMuZ2VvbTtcclxuICAgICAgICB2YXIgbGluZSA9IHRoaXMuX3RlbXBMaW5lO1xyXG5cclxuICAgICAgICByZWN0LmdldExpbmVBKGxpbmUpO1xyXG5cclxuICAgICAgICBwYXRoLnB1c2gobGluZS54MSwgbGluZS55MSwgbGluZS54MiwgbGluZS55Mik7XHJcblxyXG4gICAgICAgIHJlY3QuZ2V0TGluZUIobGluZSk7XHJcblxyXG4gICAgICAgIHBhdGgucHVzaChsaW5lLngyLCBsaW5lLnkyKTtcclxuXHJcbiAgICAgICAgcmVjdC5nZXRMaW5lQyhsaW5lKTtcclxuXHJcbiAgICAgICAgcGF0aC5wdXNoKGxpbmUueDIsIGxpbmUueTIpO1xyXG5cclxuICAgICAgICByZWN0LmdldExpbmVEKGxpbmUpO1xyXG5cclxuICAgICAgICBwYXRoLnB1c2gobGluZS54MiwgbGluZS55Mik7XHJcblxyXG4gICAgICAgIHRoaXMucGF0aERhdGEgPSBwYXRoO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZpbGxTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0ZpbGxTdHlsZUNhbnZhcycpO1xyXG52YXIgTGluZVN0eWxlQ2FudmFzID0gcmVxdWlyZSgnLi4vTGluZVN0eWxlQ2FudmFzJyk7XHJcbnZhciBTZXRUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi8uLi8uLi9yZW5kZXJlci9jYW52YXMvdXRpbHMvU2V0VHJhbnNmb3JtJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlJlY3RhbmdsZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUmVjdGFuZ2xlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgUmVjdGFuZ2xlQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgY3R4ID0gcmVuZGVyZXIuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgaWYgKFNldFRyYW5zZm9ybShyZW5kZXJlciwgY3R4LCBzcmMsIGNhbWVyYSwgcGFyZW50TWF0cml4KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSBzcmMuX2Rpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciBkeSA9IHNyYy5fZGlzcGxheU9yaWdpblk7XHJcblxyXG4gICAgICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxsU3R5bGVDYW52YXMoY3R4LCBzcmMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoXHJcbiAgICAgICAgICAgICAgICAtZHgsXHJcbiAgICAgICAgICAgICAgICAtZHksXHJcbiAgICAgICAgICAgICAgICBzcmMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBzcmMuaGVpZ2h0XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExpbmVTdHlsZUNhbnZhcyhjdHgsIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgICAgICBjdHgucmVjdChcclxuICAgICAgICAgICAgICAgIC1keCxcclxuICAgICAgICAgICAgICAgIC1keSxcclxuICAgICAgICAgICAgICAgIHNyYy53aWR0aCxcclxuICAgICAgICAgICAgICAgIHNyYy5oZWlnaHRcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBSZXN0b3JlIHRoZSBjb250ZXh0IHNhdmVkIGluIFNldFRyYW5zZm9ybVxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlY3RhbmdsZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuL1JlY3RhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgUmVjdGFuZ2xlIFNoYXBlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgUmVjdGFuZ2xlIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogVGhlIFJlY3RhbmdsZSBTaGFwZSBpcyBhIEdhbWUgT2JqZWN0IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgU2NlbmUsIEdyb3VwIG9yIENvbnRhaW5lci4gWW91IGNhblxyXG4gKiB0cmVhdCBpdCBsaWtlIGFueSBvdGhlciBHYW1lIE9iamVjdCBpbiB5b3VyIGdhbWUsIHN1Y2ggYXMgdHdlZW5pbmcgaXQsIHNjYWxpbmcgaXQsIG9yIGVuYWJsaW5nXHJcbiAqIGl0IGZvciBpbnB1dCBvciBwaHlzaWNzLiBJdCBwcm92aWRlcyBhIHF1aWNrIGFuZCBlYXN5IHdheSBmb3IgeW91IHRvIHJlbmRlciB0aGlzIHNoYXBlIGluIHlvdXJcclxuICogZ2FtZSB3aXRob3V0IHVzaW5nIGEgdGV4dHVyZSwgd2hpbGUgc3RpbGwgdGFraW5nIGFkdmFudGFnZSBvZiBiZWluZyBmdWxseSBiYXRjaGVkIGluIFdlYkdMLlxyXG4gKiBcclxuICogVGhpcyBzaGFwZSBzdXBwb3J0cyBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgcmVjdGFuZ2xlIGJ5IGNoYW5naW5nIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSNyZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTEyOF0gLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTI4XSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSByZWN0YW5nbGUgd2lsbCBiZSBmaWxsZWQgd2l0aCwgaS5lLiAweGZmMDAwMCBmb3IgcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxBbHBoYV0gLSBUaGUgYWxwaGEgdGhlIHJlY3RhbmdsZSB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlJlY3RhbmdsZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcigncmVjdGFuZ2xlJywgZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IFJlY3RhbmdsZSh0aGlzLnNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmaWxsQ29sb3IsIGZpbGxBbHBoYSkpO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9SZWN0YW5nbGVDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU3Ryb2tlUGF0aFdlYkdMID0gcmVxdWlyZSgnLi4vU3Ryb2tlUGF0aFdlYkdMJyk7XHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuUmVjdGFuZ2xlI3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlJlY3RhbmdsZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFJlY3RhbmdsZVdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDE7XHJcbiAgICB2YXIgc2hhcGVNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mID0gc3JjLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuICAgIH1cclxuXHJcbiAgICBjYW1NYXRyaXgubXVsdGlwbHkoc2hhcGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICB2YXIgZHkgPSBzcmMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChzcmMuaXNGaWxsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGZpbGxUaW50ID0gcGlwZWxpbmUuZmlsbFRpbnQ7XHJcbiAgICAgICAgdmFyIGZpbGxUaW50Q29sb3IgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXAoc3JjLmZpbGxDb2xvciwgc3JjLmZpbGxBbHBoYSAqIGFscGhhKTtcclxuICAgIFxyXG4gICAgICAgIGZpbGxUaW50LlRMID0gZmlsbFRpbnRDb2xvcjtcclxuICAgICAgICBmaWxsVGludC5UUiA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgZmlsbFRpbnQuQkwgPSBmaWxsVGludENvbG9yO1xyXG4gICAgICAgIGZpbGxUaW50LkJSID0gZmlsbFRpbnRDb2xvcjtcclxuXHJcbiAgICAgICAgcGlwZWxpbmUuc2V0VGV4dHVyZTJEKCk7XHJcblxyXG4gICAgICAgIHBpcGVsaW5lLmJhdGNoRmlsbFJlY3QoXHJcbiAgICAgICAgICAgIC1keCxcclxuICAgICAgICAgICAgLWR5LFxyXG4gICAgICAgICAgICBzcmMud2lkdGgsXHJcbiAgICAgICAgICAgIHNyYy5oZWlnaHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAge1xyXG4gICAgICAgIFN0cm9rZVBhdGhXZWJHTChwaXBlbGluZSwgc3JjLCBhbHBoYSwgZHgsIGR5KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVjdGFuZ2xlV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU3RhclJlbmRlciA9IHJlcXVpcmUoJy4vU3RhclJlbmRlcicpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRWFyY3V0ID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9wb2x5Z29uL0VhcmN1dCcpO1xyXG52YXIgU2hhcGUgPSByZXF1aXJlKCcuLi9TaGFwZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIFN0YXIgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogQXMgdGhlIG5hbWUgaW1wbGllcywgdGhlIFN0YXIgc2hhcGUgd2lsbCBkaXNwbGF5IGEgc3RhciBpbiB5b3VyIGdhbWUuIFlvdSBjYW4gY29udHJvbCBzZXZlcmFsXHJcbiAqIGFzcGVjdHMgb2YgaXQgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgY29uc3RpdHV0ZSB0aGUgc3Rhci4gVGhlIGRlZmF1bHQgaXMgNS4gSWZcclxuICogeW91IGNoYW5nZSBpdCB0byA0IGl0IHdpbGwgcmVuZGVyIGFzIGEgZGlhbW9uZC4gSWYgeW91IGluY3JlYXNlIHRoZW0sIHlvdSdsbCBnZXQgYSBtb3JlIHNwaWt5XHJcbiAqIHN0YXIgc2hhcGUuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gY29udHJvbCB0aGUgaW5uZXIgYW5kIG91dGVyIHJhZGl1cywgd2hpY2ggaXMgaG93ICdsb25nJyBlYWNoIHBvaW50IG9mIHRoZSBzdGFyIGlzLlxyXG4gKiBNb2RpZnkgdGhlc2UgdmFsdWVzIHRvIGNyZWF0ZSBtb3JlIGludGVyZXN0aW5nIHNoYXBlcy5cclxuICpcclxuICogQGNsYXNzIFN0YXJcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNoYXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtwb2ludHM9NV0gLSBUaGUgbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgc3Rhci5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtpbm5lclJhZGl1cz0zMl0gLSBUaGUgaW5uZXIgcmFkaXVzIG9mIHRoZSBzdGFyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW291dGVyUmFkaXVzPTY0XSAtIFRoZSBvdXRlciByYWRpdXMgb2YgdGhlIHN0YXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBjb2xvciB0aGUgc3RhciB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgc3RhciB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICovXHJcbnZhciBTdGFyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBTaGFwZSxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBTdGFyUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3RhciAoc2NlbmUsIHgsIHksIHBvaW50cywgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmIChwb2ludHMgPT09IHVuZGVmaW5lZCkgeyBwb2ludHMgPSA1OyB9XHJcbiAgICAgICAgaWYgKGlubmVyUmFkaXVzID09PSB1bmRlZmluZWQpIHsgaW5uZXJSYWRpdXMgPSAzMjsgfVxyXG4gICAgICAgIGlmIChvdXRlclJhZGl1cyA9PT0gdW5kZWZpbmVkKSB7IG91dGVyUmFkaXVzID0gNjQ7IH1cclxuXHJcbiAgICAgICAgU2hhcGUuY2FsbCh0aGlzLCBzY2VuZSwgJ1N0YXInLCBudWxsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS5cclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgc3Rhci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI19wb2ludHNcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wb2ludHMgPSBwb2ludHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFByaXZhdGUgaW50ZXJuYWwgdmFsdWUuXHJcbiAgICAgICAgICogVGhlIGlubmVyIHJhZGl1cyBvZiB0aGUgc3Rhci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI19pbm5lclJhZGl1c1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5faW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJpdmF0ZSBpbnRlcm5hbCB2YWx1ZS5cclxuICAgICAgICAgKiBUaGUgb3V0ZXIgcmFkaXVzIG9mIHRoZSBzdGFyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlN0YXIjX291dGVyUmFkaXVzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZShvdXRlclJhZGl1cyAqIDIsIG91dGVyUmFkaXVzICogMik7XHJcblxyXG4gICAgICAgIGlmIChmaWxsQ29sb3IgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsbFN0eWxlKGZpbGxDb2xvciwgZmlsbEFscGhhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBtYWtlIHVwIHRoZSBTdGFyIHNoYXBlLlxyXG4gICAgICogVGhpcyBjYWxsIGNhbiBiZSBjaGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlN0YXIjc2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIHBvaW50cyB0aGUgU3RhciB3aWxsIGhhdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UG9pbnRzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbm5lciByYWRpdXMgb2YgdGhlIFN0YXIgc2hhcGUuXHJcbiAgICAgKiBUaGlzIGNhbGwgY2FuIGJlIGNoYWluZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU3RhciNzZXRJbm5lclJhZGl1c1xyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIHNldCB0aGUgaW5uZXIgcmFkaXVzIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldElubmVyUmFkaXVzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faW5uZXJSYWRpdXMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG91dGVyIHJhZGl1cyBvZiB0aGUgU3RhciBzaGFwZS5cclxuICAgICAqIFRoaXMgY2FsbCBjYW4gYmUgY2hhaW5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI3NldE91dGVyUmFkaXVzXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc2V0IHRoZSBvdXRlciByYWRpdXMgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0T3V0ZXJSYWRpdXM6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9vdXRlclJhZGl1cyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBtYWtlIHVwIHRoZSBTdGFyIHNoYXBlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI3BvaW50c1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCA1XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKi9cclxuICAgIHBvaW50czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRzID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbm5lciByYWRpdXMgb2YgdGhlIFN0YXIgc2hhcGUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlN0YXIjaW5uZXJSYWRpdXNcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAzMlxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICovXHJcbiAgICBpbm5lclJhZGl1czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJSYWRpdXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pbm5lclJhZGl1cyA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3V0ZXIgcmFkaXVzIG9mIHRoZSBTdGFyIHNoYXBlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI291dGVyUmFkaXVzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgNjRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqL1xyXG4gICAgb3V0ZXJSYWRpdXM6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX291dGVyUmFkaXVzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fb3V0ZXJSYWRpdXMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgdXBkYXRlcyB0aGUgZGF0YSBhbmQgcGF0aCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU3RhciN1cGRhdGVEYXRhXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZURhdGE6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGggPSBbXTtcclxuXHJcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuX3BvaW50cztcclxuICAgICAgICB2YXIgaW5uZXJSYWRpdXMgPSB0aGlzLl9pbm5lclJhZGl1cztcclxuICAgICAgICB2YXIgb3V0ZXJSYWRpdXMgPSB0aGlzLl9vdXRlclJhZGl1cztcclxuXHJcbiAgICAgICAgdmFyIHJvdCA9IE1hdGguUEkgLyAyICogMztcclxuICAgICAgICB2YXIgc3RlcCA9IE1hdGguUEkgLyBwb2ludHM7XHJcblxyXG4gICAgICAgIC8vICBTbyBvcmlnaW4gMC41ID0gdGhlIGNlbnRlciBvZiB0aGUgc3RhclxyXG4gICAgICAgIHZhciB4ID0gb3V0ZXJSYWRpdXM7XHJcbiAgICAgICAgdmFyIHkgPSBvdXRlclJhZGl1cztcclxuICAgIFxyXG4gICAgICAgIHBhdGgucHVzaCh4LCB5ICsgLW91dGVyUmFkaXVzKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaCh4ICsgTWF0aC5jb3Mocm90KSAqIG91dGVyUmFkaXVzLCB5ICsgTWF0aC5zaW4ocm90KSAqIG91dGVyUmFkaXVzKTtcclxuXHJcbiAgICAgICAgICAgIHJvdCArPSBzdGVwO1xyXG5cclxuICAgICAgICAgICAgcGF0aC5wdXNoKHggKyBNYXRoLmNvcyhyb3QpICogaW5uZXJSYWRpdXMsIHkgKyBNYXRoLnNpbihyb3QpICogaW5uZXJSYWRpdXMpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHJvdCArPSBzdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGF0aC5wdXNoKHgsIHkgKyAtb3V0ZXJSYWRpdXMpO1xyXG5cclxuICAgICAgICB0aGlzLnBhdGhJbmRleGVzID0gRWFyY3V0KHBhdGgpO1xyXG4gICAgICAgIHRoaXMucGF0aERhdGEgPSBwYXRoO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGFyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGaWxsU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9GaWxsU3R5bGVDYW52YXMnKTtcclxudmFyIExpbmVTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0xpbmVTdHlsZUNhbnZhcycpO1xyXG52YXIgU2V0VHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TdGFyI3JlbmRlckNhbnZhc1xyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TdGFyfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgU3RhckNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIGlmIChTZXRUcmFuc2Zvcm0ocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGR4ID0gc3JjLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICB2YXIgZHkgPSBzcmMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICB2YXIgcGF0aCA9IHNyYy5wYXRoRGF0YTtcclxuICAgICAgICB2YXIgcGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoIC0gMTtcclxuICAgIFxyXG4gICAgICAgIHZhciBweDEgPSBwYXRoWzBdIC0gZHg7XHJcbiAgICAgICAgdmFyIHB5MSA9IHBhdGhbMV0gLSBkeTtcclxuXHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgICAgICBjdHgubW92ZVRvKHB4MSwgcHkxKTtcclxuICAgIFxyXG4gICAgICAgIGlmICghc3JjLmNsb3NlUGF0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGhMZW5ndGggLT0gMjtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHBhdGhMZW5ndGg7IGkgKz0gMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBweDIgPSBwYXRoW2ldIC0gZHg7XHJcbiAgICAgICAgICAgIHZhciBweTIgPSBwYXRoW2kgKyAxXSAtIGR5O1xyXG4gICAgXHJcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocHgyLCBweTIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xyXG5cclxuICAgICAgICBpZiAoc3JjLmlzRmlsbGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRmlsbFN0eWxlQ2FudmFzKGN0eCwgc3JjKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExpbmVTdHlsZUNhbnZhcyhjdHgsIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGFyQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFN0YXIgPSByZXF1aXJlKCcuL1N0YXInKTtcclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFN0YXIgU2hhcGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTdGFyIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBcclxuICogVGhlIFN0YXIgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogQXMgdGhlIG5hbWUgaW1wbGllcywgdGhlIFN0YXIgc2hhcGUgd2lsbCBkaXNwbGF5IGEgc3RhciBpbiB5b3VyIGdhbWUuIFlvdSBjYW4gY29udHJvbCBzZXZlcmFsXHJcbiAqIGFzcGVjdHMgb2YgaXQgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgY29uc3RpdHV0ZSB0aGUgc3Rhci4gVGhlIGRlZmF1bHQgaXMgNS4gSWZcclxuICogeW91IGNoYW5nZSBpdCB0byA0IGl0IHdpbGwgcmVuZGVyIGFzIGEgZGlhbW9uZC4gSWYgeW91IGluY3JlYXNlIHRoZW0sIHlvdSdsbCBnZXQgYSBtb3JlIHNwaWt5XHJcbiAqIHN0YXIgc2hhcGUuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gY29udHJvbCB0aGUgaW5uZXIgYW5kIG91dGVyIHJhZGl1cywgd2hpY2ggaXMgaG93ICdsb25nJyBlYWNoIHBvaW50IG9mIHRoZSBzdGFyIGlzLlxyXG4gKiBNb2RpZnkgdGhlc2UgdmFsdWVzIHRvIGNyZWF0ZSBtb3JlIGludGVyZXN0aW5nIHNoYXBlcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3Rvcnkjc3RhclxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRzPTVdIC0gVGhlIG51bWJlciBvZiBwb2ludHMgb24gdGhlIHN0YXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5uZXJSYWRpdXM9MzJdIC0gVGhlIGlubmVyIHJhZGl1cyBvZiB0aGUgc3Rhci5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvdXRlclJhZGl1cz02NF0gLSBUaGUgb3V0ZXIgcmFkaXVzIG9mIHRoZSBzdGFyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxDb2xvcl0gLSBUaGUgY29sb3IgdGhlIHN0YXIgd2lsbCBiZSBmaWxsZWQgd2l0aCwgaS5lLiAweGZmMDAwMCBmb3IgcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxBbHBoYV0gLSBUaGUgYWxwaGEgdGhlIHN0YXIgd2lsbCBiZSBmaWxsZWQgd2l0aC4gWW91IGNhbiBhbHNvIHNldCB0aGUgYWxwaGEgb2YgdGhlIG92ZXJhbGwgU2hhcGUgdXNpbmcgaXRzIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TdGFyfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdzdGFyJywgZnVuY3Rpb24gKHgsIHksIHBvaW50cywgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSlcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUxpc3QuYWRkKG5ldyBTdGFyKHRoaXMuc2NlbmUsIHgsIHksIHBvaW50cywgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBmaWxsQ29sb3IsIGZpbGxBbHBoYSkpO1xyXG59KTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vU3RhcldlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vU3RhckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGaWxsUGF0aFdlYkdMID0gcmVxdWlyZSgnLi4vRmlsbFBhdGhXZWJHTCcpO1xyXG52YXIgU3Ryb2tlUGF0aFdlYkdMID0gcmVxdWlyZSgnLi4vU3Ryb2tlUGF0aFdlYkdMJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuU3RhciNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TdGFyfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgU3RhcldlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB2YXIgcGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lO1xyXG5cclxuICAgIHZhciBjYW1NYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDE7XHJcbiAgICB2YXIgc2hhcGVNYXRyaXggPSBwaXBlbGluZS5fdGVtcE1hdHJpeDI7XHJcbiAgICB2YXIgY2FsY01hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcblxyXG4gICAgc2hhcGVNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIHNoYXBlTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBzaGFwZU1hdHJpeC5mID0gc3JjLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuICAgIH1cclxuXHJcbiAgICBjYW1NYXRyaXgubXVsdGlwbHkoc2hhcGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgIHZhciBkeCA9IHNyYy5fZGlzcGxheU9yaWdpblg7XHJcbiAgICB2YXIgZHkgPSBzcmMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgIHZhciBhbHBoYSA9IGNhbWVyYS5hbHBoYSAqIHNyYy5hbHBoYTtcclxuXHJcbiAgICBpZiAoc3JjLmlzRmlsbGVkKVxyXG4gICAge1xyXG4gICAgICAgIEZpbGxQYXRoV2ViR0wocGlwZWxpbmUsIGNhbGNNYXRyaXgsIHNyYywgYWxwaGEsIGR4LCBkeSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNyYy5pc1N0cm9rZWQpXHJcbiAgICB7XHJcbiAgICAgICAgU3Ryb2tlUGF0aFdlYkdMKHBpcGVsaW5lLCBzcmMsIGFscGhhLCBkeCwgZHkpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGFyV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgU2hhcGUgPSByZXF1aXJlKCcuLi9TaGFwZScpO1xyXG52YXIgR2VvbVRyaWFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS90cmlhbmdsZS9UcmlhbmdsZScpO1xyXG52YXIgVHJpYW5nbGVSZW5kZXIgPSByZXF1aXJlKCcuL1RyaWFuZ2xlUmVuZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgVHJpYW5nbGUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogVGhlIFRyaWFuZ2xlIGNvbnNpc3RzIG9mIDMgbGluZXMsIGpvaW5pbmcgdXAgdG8gZm9ybSBhIHRyaWFuZ3VsYXIgc2hhcGUuIFlvdSBjYW4gY29udHJvbCB0aGVcclxuICogcG9zaXRpb24gb2YgZWFjaCBwb2ludCBvZiB0aGVzZSBsaW5lcy4gVGhlIHRyaWFuZ2xlIGlzIGFsd2F5cyBjbG9zZWQgYW5kIGNhbm5vdCBoYXZlIGFuIG9wZW5cclxuICogZmFjZS4gSWYgeW91IHJlcXVpcmUgdGhhdCwgY29uc2lkZXIgdXNpbmcgYSBQb2x5Z29uIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBUcmlhbmdsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuU2hhcGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5HYW1lT2JqZWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3gxPTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHBvaW50IGluIHRoZSB0cmlhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5MT0xMjhdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDI9NjRdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTI9MF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDM9MTI4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB0aGlyZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTM9MTI4XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgdGhpcmQgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxDb2xvcl0gLSBUaGUgY29sb3IgdGhlIHRyaWFuZ2xlIHdpbGwgYmUgZmlsbGVkIHdpdGgsIGkuZS4gMHhmZjAwMDAgZm9yIHJlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQWxwaGFdIC0gVGhlIGFscGhhIHRoZSB0cmlhbmdsZSB3aWxsIGJlIGZpbGxlZCB3aXRoLiBZb3UgY2FuIGFsc28gc2V0IHRoZSBhbHBoYSBvZiB0aGUgb3ZlcmFsbCBTaGFwZSB1c2luZyBpdHMgYGFscGhhYCBwcm9wZXJ0eS5cclxuICovXHJcbnZhciBUcmlhbmdsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU2hhcGUsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgVHJpYW5nbGVSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUcmlhbmdsZSAoc2NlbmUsIHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIGZpbGxDb2xvciwgZmlsbEFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHgxID09PSB1bmRlZmluZWQpIHsgeDEgPSAwOyB9XHJcbiAgICAgICAgaWYgKHkxID09PSB1bmRlZmluZWQpIHsgeTEgPSAxMjg7IH1cclxuICAgICAgICBpZiAoeDIgPT09IHVuZGVmaW5lZCkgeyB4MiA9IDY0OyB9XHJcbiAgICAgICAgaWYgKHkyID09PSB1bmRlZmluZWQpIHsgeTIgPSAwOyB9XHJcbiAgICAgICAgaWYgKHgzID09PSB1bmRlZmluZWQpIHsgeDMgPSAxMjg7IH1cclxuICAgICAgICBpZiAoeTMgPT09IHVuZGVmaW5lZCkgeyB5MyA9IDEyODsgfVxyXG5cclxuICAgICAgICBTaGFwZS5jYWxsKHRoaXMsIHNjZW5lLCAnVHJpYW5nbGUnLCBuZXcgR2VvbVRyaWFuZ2xlKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpKTtcclxuXHJcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZW9tLnJpZ2h0IC0gdGhpcy5nZW9tLmxlZnQ7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuZ2VvbS5ib3R0b20gLSB0aGlzLmdlb20udG9wO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGaWxsU3R5bGUoZmlsbENvbG9yLCBmaWxsQWxwaGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGF0YSBmb3IgdGhlIGxpbmVzIHRoYXQgbWFrZSB1cCB0aGlzIFRyaWFuZ2xlIHNoYXBlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRyaWFuZ2xlI3NldFRvXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4MT0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3kxPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3gyPTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4Mz0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB0aGlyZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3kzPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSB0aGlyZCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VG86IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2VvbS5zZXRUbyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGF0YSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHVwZGF0ZXMgdGhlIGRhdGEgYW5kIHBhdGggdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRyaWFuZ2xlI3VwZGF0ZURhdGFcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRGF0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aCA9IFtdO1xyXG4gICAgICAgIHZhciB0cmkgPSB0aGlzLmdlb207XHJcbiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLl90ZW1wTGluZTtcclxuXHJcbiAgICAgICAgdHJpLmdldExpbmVBKGxpbmUpO1xyXG5cclxuICAgICAgICBwYXRoLnB1c2gobGluZS54MSwgbGluZS55MSwgbGluZS54MiwgbGluZS55Mik7XHJcblxyXG4gICAgICAgIHRyaS5nZXRMaW5lQihsaW5lKTtcclxuXHJcbiAgICAgICAgcGF0aC5wdXNoKGxpbmUueDIsIGxpbmUueTIpO1xyXG5cclxuICAgICAgICB0cmkuZ2V0TGluZUMobGluZSk7XHJcblxyXG4gICAgICAgIHBhdGgucHVzaChsaW5lLngyLCBsaW5lLnkyKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXRoRGF0YSA9IHBhdGg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRyaWFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGaWxsU3R5bGVDYW52YXMgPSByZXF1aXJlKCcuLi9GaWxsU3R5bGVDYW52YXMnKTtcclxudmFyIExpbmVTdHlsZUNhbnZhcyA9IHJlcXVpcmUoJy4uL0xpbmVTdHlsZUNhbnZhcycpO1xyXG52YXIgU2V0VHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvY2FudmFzL3V0aWxzL1NldFRyYW5zZm9ybScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UcmlhbmdsZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVHJpYW5nbGV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBUcmlhbmdsZUNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIGlmIChTZXRUcmFuc2Zvcm0ocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGR4ID0gc3JjLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICB2YXIgZHkgPSBzcmMuX2Rpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICB2YXIgeDEgPSBzcmMuZ2VvbS54MSAtIGR4O1xyXG4gICAgICAgIHZhciB5MSA9IHNyYy5nZW9tLnkxIC0gZHk7XHJcbiAgICAgICAgdmFyIHgyID0gc3JjLmdlb20ueDIgLSBkeDtcclxuICAgICAgICB2YXIgeTIgPSBzcmMuZ2VvbS55MiAtIGR5O1xyXG4gICAgICAgIHZhciB4MyA9IHNyYy5nZW9tLngzIC0gZHg7XHJcbiAgICAgICAgdmFyIHkzID0gc3JjLmdlb20ueTMgLSBkeTtcclxuXHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgICAgICBjdHgubW92ZVRvKHgxLCB5MSk7XHJcbiAgICAgICAgY3R4LmxpbmVUbyh4MiwgeTIpO1xyXG4gICAgICAgIGN0eC5saW5lVG8oeDMsIHkzKTtcclxuXHJcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xyXG5cclxuICAgICAgICBpZiAoc3JjLmlzRmlsbGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRmlsbFN0eWxlQ2FudmFzKGN0eCwgc3JjKTtcclxuXHJcbiAgICAgICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3JjLmlzU3Ryb2tlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExpbmVTdHlsZUNhbnZhcyhjdHgsIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSB0aGUgY29udGV4dCBzYXZlZCBpbiBTZXRUcmFuc2Zvcm1cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUcmlhbmdsZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcbnZhciBUcmlhbmdsZSA9IHJlcXVpcmUoJy4vVHJpYW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFRyaWFuZ2xlIFNoYXBlIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgVHJpYW5nbGUgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIFxyXG4gKiBUaGUgVHJpYW5nbGUgU2hhcGUgaXMgYSBHYW1lIE9iamVjdCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIFNjZW5lLCBHcm91cCBvciBDb250YWluZXIuIFlvdSBjYW5cclxuICogdHJlYXQgaXQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QgaW4geW91ciBnYW1lLCBzdWNoIGFzIHR3ZWVuaW5nIGl0LCBzY2FsaW5nIGl0LCBvciBlbmFibGluZ1xyXG4gKiBpdCBmb3IgaW5wdXQgb3IgcGh5c2ljcy4gSXQgcHJvdmlkZXMgYSBxdWljayBhbmQgZWFzeSB3YXkgZm9yIHlvdSB0byByZW5kZXIgdGhpcyBzaGFwZSBpbiB5b3VyXHJcbiAqIGdhbWUgd2l0aG91dCB1c2luZyBhIHRleHR1cmUsIHdoaWxlIHN0aWxsIHRha2luZyBhZHZhbnRhZ2Ugb2YgYmVpbmcgZnVsbHkgYmF0Y2hlZCBpbiBXZWJHTC5cclxuICogXHJcbiAqIFRoaXMgc2hhcGUgc3VwcG9ydHMgYm90aCBmaWxsIGFuZCBzdHJva2UgY29sb3JzLlxyXG4gKiBcclxuICogVGhlIFRyaWFuZ2xlIGNvbnNpc3RzIG9mIDMgbGluZXMsIGpvaW5pbmcgdXAgdG8gZm9ybSBhIHRyaWFuZ3VsYXIgc2hhcGUuIFlvdSBjYW4gY29udHJvbCB0aGVcclxuICogcG9zaXRpb24gb2YgZWFjaCBwb2ludCBvZiB0aGVzZSBsaW5lcy4gVGhlIHRyaWFuZ2xlIGlzIGFsd2F5cyBjbG9zZWQgYW5kIGNhbm5vdCBoYXZlIGFuIG9wZW5cclxuICogZmFjZS4gSWYgeW91IHJlcXVpcmUgdGhhdCwgY29uc2lkZXIgdXNpbmcgYSBQb2x5Z29uIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3RyaWFuZ2xlXHJcbiAqIEBzaW5jZSAzLjEzLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4MT0wXSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTE9MTI4XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3gyPTY0XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3gzPTEyOF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGhpcmQgcG9pbnQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3kzPTEyOF0gLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHRoaXJkIHBvaW50IGluIHRoZSB0cmlhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsQ29sb3JdIC0gVGhlIGNvbG9yIHRoZSB0cmlhbmdsZSB3aWxsIGJlIGZpbGxlZCB3aXRoLCBpLmUuIDB4ZmYwMDAwIGZvciByZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbEFscGhhXSAtIFRoZSBhbHBoYSB0aGUgdHJpYW5nbGUgd2lsbCBiZSBmaWxsZWQgd2l0aC4gWW91IGNhbiBhbHNvIHNldCB0aGUgYWxwaGEgb2YgdGhlIG92ZXJhbGwgU2hhcGUgdXNpbmcgaXRzIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UcmlhbmdsZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcigndHJpYW5nbGUnLCBmdW5jdGlvbiAoeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgZmlsbENvbG9yLCBmaWxsQWxwaGEpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgVHJpYW5nbGUodGhpcy5zY2VuZSwgeCwgeSwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgZmlsbENvbG9yLCBmaWxsQWxwaGEpKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1RyaWFuZ2xlV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9UcmlhbmdsZUNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTdHJva2VQYXRoV2ViR0wgPSByZXF1aXJlKCcuLi9TdHJva2VQYXRoV2ViR0wnKTtcclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UcmlhbmdsZSNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4xMy4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5UcmlhbmdsZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFRyaWFuZ2xlV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHZhciBwaXBlbGluZSA9IHRoaXMucGlwZWxpbmU7XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBzaGFwZU1hdHJpeCA9IHBpcGVsaW5lLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcGlwZWxpbmUuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIHJlbmRlcmVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHJcbiAgICBzaGFwZU1hdHJpeC5hcHBseUlUUlMoc3JjLngsIHNyYy55LCBzcmMucm90YXRpb24sIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVkpO1xyXG5cclxuICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgc2hhcGVNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIHNoYXBlTWF0cml4LmYgPSBzcmMueTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBzaGFwZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgc2hhcGVNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbU1hdHJpeC5tdWx0aXBseShzaGFwZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcblxyXG4gICAgdmFyIGR4ID0gc3JjLl9kaXNwbGF5T3JpZ2luWDtcclxuICAgIHZhciBkeSA9IHNyYy5fZGlzcGxheU9yaWdpblk7XHJcbiAgICB2YXIgYWxwaGEgPSBjYW1lcmEuYWxwaGEgKiBzcmMuYWxwaGE7XHJcblxyXG4gICAgaWYgKHNyYy5pc0ZpbGxlZClcclxuICAgIHtcclxuICAgICAgICB2YXIgZmlsbFRpbnQgPSBwaXBlbGluZS5maWxsVGludDtcclxuICAgICAgICB2YXIgZmlsbFRpbnRDb2xvciA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcChzcmMuZmlsbENvbG9yLCBzcmMuZmlsbEFscGhhICogYWxwaGEpO1xyXG5cclxuICAgICAgICBmaWxsVGludC5UTCA9IGZpbGxUaW50Q29sb3I7XHJcbiAgICAgICAgZmlsbFRpbnQuVFIgPSBmaWxsVGludENvbG9yO1xyXG4gICAgICAgIGZpbGxUaW50LkJMID0gZmlsbFRpbnRDb2xvcjtcclxuICAgICAgICBmaWxsVGludC5CUiA9IGZpbGxUaW50Q29sb3I7XHJcblxyXG4gICAgICAgIHZhciB4MSA9IHNyYy5nZW9tLngxIC0gZHg7XHJcbiAgICAgICAgdmFyIHkxID0gc3JjLmdlb20ueTEgLSBkeTtcclxuICAgICAgICB2YXIgeDIgPSBzcmMuZ2VvbS54MiAtIGR4O1xyXG4gICAgICAgIHZhciB5MiA9IHNyYy5nZW9tLnkyIC0gZHk7XHJcbiAgICAgICAgdmFyIHgzID0gc3JjLmdlb20ueDMgLSBkeDtcclxuICAgICAgICB2YXIgeTMgPSBzcmMuZ2VvbS55MyAtIGR5O1xyXG5cclxuICAgICAgICBwaXBlbGluZS5zZXRUZXh0dXJlMkQoKTtcclxuXHJcbiAgICAgICAgcGlwZWxpbmUuYmF0Y2hGaWxsVHJpYW5nbGUoXHJcbiAgICAgICAgICAgIHgxLFxyXG4gICAgICAgICAgICB5MSxcclxuICAgICAgICAgICAgeDIsXHJcbiAgICAgICAgICAgIHkyLFxyXG4gICAgICAgICAgICB4MyxcclxuICAgICAgICAgICAgeTMsXHJcbiAgICAgICAgICAgIHNoYXBlTWF0cml4LFxyXG4gICAgICAgICAgICBjYW1NYXRyaXhcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzcmMuaXNTdHJva2VkKVxyXG4gICAge1xyXG4gICAgICAgIFN0cm9rZVBhdGhXZWJHTChwaXBlbGluZSwgc3JjLCBhbHBoYSwgZHgsIGR5KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHJpYW5nbGVXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb25lbnRzID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxudmFyIFNwcml0ZVJlbmRlciA9IHJlcXVpcmUoJy4vU3ByaXRlUmVuZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFNwcml0ZSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQSBTcHJpdGUgR2FtZSBPYmplY3QgaXMgdXNlZCBmb3IgdGhlIGRpc3BsYXkgb2YgYm90aCBzdGF0aWMgYW5kIGFuaW1hdGVkIGltYWdlcyBpbiB5b3VyIGdhbWUuXHJcbiAqIFNwcml0ZXMgY2FuIGhhdmUgaW5wdXQgZXZlbnRzIGFuZCBwaHlzaWNzIGJvZGllcy4gVGhleSBjYW4gYWxzbyBiZSB0d2VlbmVkLCB0aW50ZWQsIHNjcm9sbGVkXHJcbiAqIGFuZCBhbmltYXRlZC5cclxuICpcclxuICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGEgU3ByaXRlIGFuZCBhbiBJbWFnZSBHYW1lIE9iamVjdCBpcyB0aGF0IHlvdSBjYW5ub3QgYW5pbWF0ZSBJbWFnZXMuXHJcbiAqIEFzIHN1Y2gsIFNwcml0ZXMgdGFrZSBhIGZyYWN0aW9uIGxvbmdlciB0byBwcm9jZXNzIGFuZCBoYXZlIGEgbGFyZ2VyIEFQSSBmb290cHJpbnQgZHVlIHRvIHRoZSBBbmltYXRpb25cclxuICogQ29tcG9uZW50LiBJZiB5b3UgZG8gbm90IHJlcXVpcmUgYW5pbWF0aW9uIHRoZW4geW91IGNhbiBzYWZlbHkgdXNlIEltYWdlcyB0byByZXBsYWNlIFNwcml0ZXMgaW4gYWxsIGNhc2VzLlxyXG4gKlxyXG4gKiBAY2xhc3MgU3ByaXRlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNpemVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZUNyb3BcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqL1xyXG52YXIgU3ByaXRlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5CbGVuZE1vZGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5EZXB0aCxcclxuICAgICAgICBDb21wb25lbnRzLkZsaXAsXHJcbiAgICAgICAgQ29tcG9uZW50cy5HZXRCb3VuZHMsXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNrLFxyXG4gICAgICAgIENvbXBvbmVudHMuT3JpZ2luLFxyXG4gICAgICAgIENvbXBvbmVudHMuUGlwZWxpbmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TaXplLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGV4dHVyZUNyb3AsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UaW50LFxyXG4gICAgICAgIENvbXBvbmVudHMuVHJhbnNmb3JtLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmlzaWJsZSxcclxuICAgICAgICBTcHJpdGVSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBTcHJpdGUgKHNjZW5lLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdTcHJpdGUnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIGNyb3AgZGF0YSBvYmplY3QsIGFzIHVzZWQgYnkgYHNldENyb3BgIGFuZCBwYXNzZWQgdG8gdGhlIGBGcmFtZS5zZXRDcm9wVVZzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlI19jcm9wXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jcm9wID0gdGhpcy5yZXNldENyb3BPYmplY3QoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEFuaW1hdGlvbiBDb250cm9sbGVyIG9mIHRoaXMgU3ByaXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZSNhbmltc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbmltYXRpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmltcyA9IG5ldyBDb21wb25lbnRzLkFuaW1hdGlvbih0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKHRleHR1cmUsIGZyYW1lKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZVRvRnJhbWUoKTtcclxuICAgICAgICB0aGlzLnNldE9yaWdpbkZyb21GcmFtZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoaXMgU3ByaXRlJ3MgYW5pbWF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUjcHJlVXBkYXRlXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmltcy51cGRhdGUodGltZSwgZGVsdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IHBsYXlpbmcgdGhlIGdpdmVuIGFuaW1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUjcGxheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBhbmltYXRpb24gdG8gcGxheS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lnbm9yZUlmUGxheWluZz1mYWxzZV0gLSBJZiBhbiBhbmltYXRpb24gaXMgYWxyZWFkeSBwbGF5aW5nIHRoZW4gaWdub3JlIHRoaXMgY2FsbC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0RnJhbWU9MF0gLSBPcHRpb25hbGx5IHN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZyBmcm9tIHRoaXMgZnJhbWUgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGxheTogZnVuY3Rpb24gKGtleSwgaWdub3JlSWZQbGF5aW5nLCBzdGFydEZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5pbXMucGxheShrZXksIGlnbm9yZUlmUGxheWluZywgc3RhcnRGcmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwcml0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUjdG9KU09OXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuSlNPTkdhbWVPYmplY3R9IEEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRvSlNPTjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YSA9IENvbXBvbmVudHMuVG9KU09OKHRoaXMpO1xyXG5cclxuICAgICAgICAvLyAgRXh0cmEgU3ByaXRlIGRhdGEgaXMgYWRkZWQgaGVyZVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBwcmUtZGVzdHJveSBzdGVwIGZvciB0aGUgU3ByaXRlLCB3aGljaCByZW1vdmVzIHRoZSBBbmltYXRpb24gY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZSNwcmVEZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYW5pbXMuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFuaW1zID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwcml0ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBTcHJpdGVDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHJlbmRlcmVyLmJhdGNoU3ByaXRlKHNyYywgc3JjLmZyYW1lLCBjYW1lcmEsIHBhcmVudE1hdHJpeCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwcml0ZUNhbnZhc1JlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCdWlsZEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9CdWlsZEdhbWVPYmplY3QnKTtcclxudmFyIEJ1aWxkR2FtZU9iamVjdEFuaW1hdGlvbiA9IHJlcXVpcmUoJy4uL0J1aWxkR2FtZU9iamVjdEFuaW1hdGlvbicpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBTcHJpdGUgPSByZXF1aXJlKCcuL1Nwcml0ZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgU3ByaXRlIEdhbWUgT2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTcHJpdGUgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI3Nwcml0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuU3ByaXRlLlNwcml0ZUNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ3Nwcml0ZScsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciBrZXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2tleScsIG51bGwpO1xyXG4gICAgdmFyIGZyYW1lID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdmcmFtZScsIG51bGwpO1xyXG5cclxuICAgIHZhciBzcHJpdGUgPSBuZXcgU3ByaXRlKHRoaXMuc2NlbmUsIDAsIDAsIGtleSwgZnJhbWUpO1xyXG5cclxuICAgIGlmIChhZGRUb1NjZW5lICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgY29uZmlnLmFkZCA9IGFkZFRvU2NlbmU7XHJcbiAgICB9XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0KHRoaXMuc2NlbmUsIHNwcml0ZSwgY29uZmlnKTtcclxuXHJcbiAgICAvLyAgU3ByaXRlIHNwZWNpZmljIGNvbmZpZyBvcHRpb25zOlxyXG5cclxuICAgIEJ1aWxkR2FtZU9iamVjdEFuaW1hdGlvbihzcHJpdGUsIGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHNwcml0ZTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIFNwcml0ZSA9IHJlcXVpcmUoJy4vU3ByaXRlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBTcHJpdGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTcHJpdGUgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3Nwcml0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCdzcHJpdGUnLCBmdW5jdGlvbiAoeCwgeSwga2V5LCBmcmFtZSlcclxue1xyXG4gICAgdmFyIHNwcml0ZSA9IG5ldyBTcHJpdGUodGhpcy5zY2VuZSwgeCwgeSwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5TGlzdC5hZGQoc3ByaXRlKTtcclxuICAgIHRoaXMudXBkYXRlTGlzdC5hZGQoc3ByaXRlKTtcclxuXHJcbiAgICByZXR1cm4gc3ByaXRlO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSBjb250ZXh0LlxyXG4vL1xyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vL1xyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1Nwcml0ZVdlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vU3ByaXRlQ2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZSNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZX0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFNwcml0ZVdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICB0aGlzLnBpcGVsaW5lLmJhdGNoU3ByaXRlKHNyYywgY2FtZXJhLCBwYXJlbnRNYXRyaXgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTcHJpdGVXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGRpbWVuc2lvbnMgb2YgdGhlIFRleHQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdhbWVPYmplY3RzLlRleHQuR2V0VGV4dFNpemVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IHRleHQgLSBUaGUgVGV4dCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlRleHQuVGV4dE1ldHJpY3N9IHNpemUgLSBUaGUgVGV4dCBtZXRyaWNzIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSBzaXplLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBsaW5lcyAtIFRoZSBsaW5lcyBvZiB0ZXh0IHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBmcm9tLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtvYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIGRpbWVuc2lvbnMgb2YgdGhlIFRleHQgb2JqZWN0LlxyXG4gKi9cclxudmFyIEdldFRleHRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUsIGxpbmVzKVxyXG57XHJcbiAgICB2YXIgY2FudmFzID0gdGV4dC5jYW52YXM7XHJcbiAgICB2YXIgY29udGV4dCA9IHRleHQuY29udGV4dDtcclxuICAgIHZhciBzdHlsZSA9IHRleHQuc3R5bGU7XHJcblxyXG4gICAgdmFyIGxpbmVXaWR0aHMgPSBbXTtcclxuICAgIHZhciBtYXhMaW5lV2lkdGggPSAwO1xyXG4gICAgdmFyIGRyYXduTGluZXMgPSBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHN0eWxlLm1heExpbmVzID4gMCAmJiBzdHlsZS5tYXhMaW5lcyA8IGxpbmVzLmxlbmd0aClcclxuICAgIHtcclxuICAgICAgICBkcmF3bkxpbmVzID0gc3R5bGUubWF4TGluZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3R5bGUuc3luY0ZvbnQoY2FudmFzLCBjb250ZXh0KTtcclxuXHJcbiAgICAvLyAgVGV4dCBXaWR0aFxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd25MaW5lczsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaW5lV2lkdGggPSBzdHlsZS5zdHJva2VUaGlja25lc3M7XHJcblxyXG4gICAgICAgIGxpbmVXaWR0aCArPSBjb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmVzW2ldKS53aWR0aDtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IGZvciB3cmFwcGVkIHRleHRcclxuICAgICAgICBpZiAoc3R5bGUud29yZFdyYXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaW5lV2lkdGggLT0gY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGluZVdpZHRoc1tpXSA9IE1hdGguY2VpbChsaW5lV2lkdGgpO1xyXG4gICAgICAgIG1heExpbmVXaWR0aCA9IE1hdGgubWF4KG1heExpbmVXaWR0aCwgbGluZVdpZHRoc1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFRleHQgSGVpZ2h0XHJcblxyXG4gICAgdmFyIGxpbmVIZWlnaHQgPSBzaXplLmZvbnRTaXplICsgc3R5bGUuc3Ryb2tlVGhpY2tuZXNzO1xyXG4gICAgdmFyIGhlaWdodCA9IGxpbmVIZWlnaHQgKiBkcmF3bkxpbmVzO1xyXG4gICAgdmFyIGxpbmVTcGFjaW5nID0gdGV4dC5saW5lU3BhY2luZztcclxuXHJcbiAgICAvLyAgQWRqdXN0IGZvciBsaW5lIHNwYWNpbmdcclxuICAgIGlmIChkcmF3bkxpbmVzID4gMSlcclxuICAgIHtcclxuICAgICAgICBoZWlnaHQgKz0gbGluZVNwYWNpbmcgKiAoZHJhd25MaW5lcyAtIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgd2lkdGg6IG1heExpbmVXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICBsaW5lczogZHJhd25MaW5lcyxcclxuICAgICAgICBsaW5lV2lkdGhzOiBsaW5lV2lkdGhzLFxyXG4gICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lU3BhY2luZyxcclxuICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0XHJcbiAgICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUZXh0U2l6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uLy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhc2NlbnQsIGRlc2NlbnQgYW5kIGZvbnRTaXplIG9mIGEgZ2l2ZW4gZm9udCBzdHlsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0Lk1lYXN1cmVUZXh0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGV9IHRleHRTdHlsZSAtIFRoZSBUZXh0U3R5bGUgb2JqZWN0IHRvIG1lYXN1cmUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5UZXh0LlRleHRNZXRyaWNzfSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYXNjZW50LCBkZXNjZW50IGFuZCBmb250U2l6ZSBvZiB0aGUgVGV4dFN0eWxlLlxyXG4gKi9cclxudmFyIE1lYXN1cmVUZXh0ID0gZnVuY3Rpb24gKHRleHRTdHlsZSlcclxue1xyXG4gICAgLy8gQHByb3BlcnR5IHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIC0gVGhlIGNhbnZhcyBlbGVtZW50IHRoYXQgdGhlIHRleHQgaXMgcmVuZGVyZWQuXHJcbiAgICB2YXIgY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUodGhpcyk7XHJcblxyXG4gICAgLy8gQHByb3BlcnR5IHtIVE1MQ2FudmFzRWxlbWVudH0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9mIHRoZSBjYW52YXMgZWxlbWVudCB0aGF0IHRoZSB0ZXh0IGlzIHJlbmRlcmVkIHRvLlxyXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICB0ZXh0U3R5bGUuc3luY0ZvbnQoY2FudmFzLCBjb250ZXh0KTtcclxuXHJcbiAgICB2YXIgd2lkdGggPSBNYXRoLmNlaWwoY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0U3R5bGUudGVzdFN0cmluZykud2lkdGggKiB0ZXh0U3R5bGUuYmFzZWxpbmVYKTtcclxuICAgIHZhciBiYXNlbGluZSA9IHdpZHRoO1xyXG4gICAgdmFyIGhlaWdodCA9IDIgKiBiYXNlbGluZTtcclxuXHJcbiAgICBiYXNlbGluZSA9IGJhc2VsaW5lICogdGV4dFN0eWxlLmJhc2VsaW5lWSB8IDA7XHJcblxyXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyNmMDAnO1xyXG4gICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICBjb250ZXh0LmZvbnQgPSB0ZXh0U3R5bGUuX2ZvbnQ7XHJcblxyXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjMDAwJztcclxuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dFN0eWxlLnRlc3RTdHJpbmcsIDAsIGJhc2VsaW5lKTtcclxuXHJcbiAgICB2YXIgb3V0cHV0ID0ge1xyXG4gICAgICAgIGFzY2VudDogMCxcclxuICAgICAgICBkZXNjZW50OiAwLFxyXG4gICAgICAgIGZvbnRTaXplOiAwXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkpXHJcbiAgICB7XHJcbiAgICAgICAgb3V0cHV0LmFzY2VudCA9IGJhc2VsaW5lO1xyXG4gICAgICAgIG91dHB1dC5kZXNjZW50ID0gYmFzZWxpbmUgKyA2O1xyXG4gICAgICAgIG91dHB1dC5mb250U2l6ZSA9IG91dHB1dC5hc2NlbnQgKyBvdXRwdXQuZGVzY2VudDtcclxuXHJcbiAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUoY2FudmFzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcclxuICAgIHZhciBwaXhlbHMgPSBpbWFnZWRhdGEubGVuZ3RoO1xyXG4gICAgdmFyIGxpbmUgPSB3aWR0aCAqIDQ7XHJcbiAgICB2YXIgaTtcclxuICAgIHZhciBqO1xyXG4gICAgdmFyIGlkeCA9IDA7XHJcbiAgICB2YXIgc3RvcCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGFzY2VudC4gc2NhbiBmcm9tIHRvcCB0byBib3R0b20gdW50aWwgd2UgZmluZCBhIG5vbiByZWQgcGl4ZWxcclxuICAgIGZvciAoaSA9IDA7IGkgPCBiYXNlbGluZTsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lOyBqICs9IDQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2VkYXRhW2lkeCArIGpdICE9PSAyNTUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RvcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkeCArPSBsaW5lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LmFzY2VudCA9IGJhc2VsaW5lIC0gaTtcclxuXHJcbiAgICBpZHggPSBwaXhlbHMgLSBsaW5lO1xyXG4gICAgc3RvcCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGRlc2NlbnQuIHNjYW4gZnJvbSBib3R0b20gdG8gdG9wIHVudGlsIHdlIGZpbmQgYSBub24gcmVkIHBpeGVsXHJcbiAgICBmb3IgKGkgPSBoZWlnaHQ7IGkgPiBiYXNlbGluZTsgaS0tKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lOyBqICs9IDQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoaW1hZ2VkYXRhW2lkeCArIGpdICE9PSAyNTUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc3RvcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkeCAtPSBsaW5lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LmRlc2NlbnQgPSAoaSAtIGJhc2VsaW5lKTtcclxuICAgIG91dHB1dC5mb250U2l6ZSA9IG91dHB1dC5hc2NlbnQgKyBvdXRwdXQuZGVzY2VudDtcclxuXHJcbiAgICBDYW52YXNQb29sLnJlbW92ZShjYW52YXMpO1xyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lYXN1cmVUZXh0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBNZWFzdXJlVGV4dCA9IHJlcXVpcmUoJy4vTWVhc3VyZVRleHQnKTtcclxuXHJcbi8vICBLZXk6IFsgT2JqZWN0IEtleSwgRGVmYXVsdCBWYWx1ZSBdXHJcblxyXG52YXIgcHJvcGVydHlNYXAgPSB7XHJcbiAgICBmb250RmFtaWx5OiBbICdmb250RmFtaWx5JywgJ0NvdXJpZXInIF0sXHJcbiAgICBmb250U2l6ZTogWyAnZm9udFNpemUnLCAnMTZweCcgXSxcclxuICAgIGZvbnRTdHlsZTogWyAnZm9udFN0eWxlJywgJycgXSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogWyAnYmFja2dyb3VuZENvbG9yJywgbnVsbCBdLFxyXG4gICAgY29sb3I6IFsgJ2NvbG9yJywgJyNmZmYnIF0sXHJcbiAgICBzdHJva2U6IFsgJ3N0cm9rZScsICcjZmZmJyBdLFxyXG4gICAgc3Ryb2tlVGhpY2tuZXNzOiBbICdzdHJva2VUaGlja25lc3MnLCAwIF0sXHJcbiAgICBzaGFkb3dPZmZzZXRYOiBbICdzaGFkb3cub2Zmc2V0WCcsIDAgXSxcclxuICAgIHNoYWRvd09mZnNldFk6IFsgJ3NoYWRvdy5vZmZzZXRZJywgMCBdLFxyXG4gICAgc2hhZG93Q29sb3I6IFsgJ3NoYWRvdy5jb2xvcicsICcjMDAwJyBdLFxyXG4gICAgc2hhZG93Qmx1cjogWyAnc2hhZG93LmJsdXInLCAwIF0sXHJcbiAgICBzaGFkb3dTdHJva2U6IFsgJ3NoYWRvdy5zdHJva2UnLCBmYWxzZSBdLFxyXG4gICAgc2hhZG93RmlsbDogWyAnc2hhZG93LmZpbGwnLCBmYWxzZSBdLFxyXG4gICAgYWxpZ246IFsgJ2FsaWduJywgJ2xlZnQnIF0sXHJcbiAgICBtYXhMaW5lczogWyAnbWF4TGluZXMnLCAwIF0sXHJcbiAgICBmaXhlZFdpZHRoOiBbICdmaXhlZFdpZHRoJywgMCBdLFxyXG4gICAgZml4ZWRIZWlnaHQ6IFsgJ2ZpeGVkSGVpZ2h0JywgMCBdLFxyXG4gICAgcmVzb2x1dGlvbjogWyAncmVzb2x1dGlvbicsIDAgXSxcclxuICAgIHJ0bDogWyAncnRsJywgZmFsc2UgXSxcclxuICAgIHRlc3RTdHJpbmc6IFsgJ3Rlc3RTdHJpbmcnLCAnfE3Dg+KAsHFneScgXSxcclxuICAgIGJhc2VsaW5lWDogWyAnYmFzZWxpbmVYJywgMS4yIF0sXHJcbiAgICBiYXNlbGluZVk6IFsgJ2Jhc2VsaW5lWScsIDEuNCBdLFxyXG4gICAgd29yZFdyYXBXaWR0aDogWyAnd29yZFdyYXAud2lkdGgnLCBudWxsIF0sXHJcbiAgICB3b3JkV3JhcENhbGxiYWNrOiBbICd3b3JkV3JhcC5jYWxsYmFjaycsIG51bGwgXSxcclxuICAgIHdvcmRXcmFwQ2FsbGJhY2tTY29wZTogWyAnd29yZFdyYXAuY2FsbGJhY2tTY29wZScsIG51bGwgXSxcclxuICAgIHdvcmRXcmFwVXNlQWR2YW5jZWQ6IFsgJ3dvcmRXcmFwLnVzZUFkdmFuY2VkV3JhcCcsIGZhbHNlIF1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgVGV4dFN0eWxlIGNsYXNzIG1hbmFnZXMgYWxsIG9mIHRoZSBzdHlsZSBzZXR0aW5ncyBmb3IgYSBUZXh0IG9iamVjdC5cclxuICogXHJcbiAqIFRleHQgR2FtZSBPYmplY3RzIGNyZWF0ZSBhIFRleHRTdHlsZSBpbnN0YW5jZSBhdXRvbWF0aWNhbGx5LCB3aGljaCBpc1xyXG4gKiBhY2Nlc3NlZCB2aWEgdGhlIGBUZXh0LnN0eWxlYCBwcm9wZXJ0eS4gWW91IGRvIG5vdCBub3JtYWxseSBuZWVkIHRvXHJcbiAqIGluc3RhbnRpYXRlIG9uZSB5b3Vyc2VsZi5cclxuICpcclxuICogQGNsYXNzIFRleHRTdHlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gdGV4dCAtIFRoZSBUZXh0IG9iamVjdCB0aGF0IHRoaXMgVGV4dFN0eWxlIGlzIHN0eWxpbmcuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlRleHQuVGV4dFN0eWxlfSBzdHlsZSAtIFRoZSBzdHlsZSBzZXR0aW5ncyB0byBzZXQuXHJcbiAqL1xyXG52YXIgVGV4dFN0eWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRleHRTdHlsZSAodGV4dCwgc3R5bGUpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRleHQgb2JqZWN0IHRoYXQgdGhpcyBUZXh0U3R5bGUgaXMgc3R5bGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjcGFyZW50XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gdGV4dDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZvbnQgZmFtaWx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNmb250RmFtaWx5XHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnQ291cmllcidcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZvbnRGYW1pbHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmb250IHNpemUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2ZvbnRTaXplXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnMTZweCdcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZvbnRTaXplO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZm9udCBzdHlsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjZm9udFN0eWxlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZvbnRTdHlsZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJhY2tncm91bmQgY29sb3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2JhY2tncm91bmRDb2xvclxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0ZXh0IGZpbGwgY29sb3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2NvbG9yXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnI2ZmZidcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbG9yO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dCBzdHJva2UgY29sb3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3N0cm9rZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgJyNmZmYnXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdHJva2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0ZXh0IHN0cm9rZSB0aGlja25lc3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3N0cm9rZVRoaWNrbmVzc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3Ryb2tlVGhpY2tuZXNzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaG9yaXpvbnRhbCBzaGFkb3cgb2Zmc2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzaGFkb3dPZmZzZXRYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dPZmZzZXRYO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgc2hhZG93IG9mZnNldC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2hhZG93T2Zmc2V0WVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0WTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNoYWRvdyBjb2xvci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2hhZG93Q29sb3JcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICcjMDAwJ1xyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3I7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzaGFkb3cgYmx1ciByYWRpdXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NoYWRvd0JsdXJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNoYWRvd0JsdXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgc2hhZG93IHN0cm9rZSBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2hhZG93U3Ryb2tlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNoYWRvd1N0cm9rZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciBzaGFkb3cgZmlsbCBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2hhZG93RmlsbFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaGFkb3dGaWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dCBhbGlnbm1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2FsaWduXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnbGVmdCdcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFsaWduO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gZHJhdy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjbWF4TGluZXNcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhMaW5lcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZpeGVkIHdpZHRoIG9mIHRoZSB0ZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogYDBgIG1lYW5zIG5vIGZpeGVkIHdpdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2ZpeGVkV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpeGVkV2lkdGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmaXhlZCBoZWlnaHQgb2YgdGhlIHRleHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBgMGAgbWVhbnMgbm8gZml4ZWQgaGVpZ2h0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNmaXhlZEhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZml4ZWRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZXNvbHV0aW9uIHRoZSB0ZXh0IGlzIHJlbmRlcmVkIHRvIGl0cyBpbnRlcm5hbCBjYW52YXMgYXQuXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMgaXQgd2lsbCB1c2UgdGhlIHJlc29sdXRpb24gc2V0IGluIHRoZSBHYW1lIENvbmZpZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjcmVzb2x1dGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb247XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHRleHQgc2hvdWxkIHJlbmRlciByaWdodCB0byBsZWZ0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNydGxcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucnRsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGVzdCBzdHJpbmcgdG8gdXNlIHdoZW4gbWVhc3VyaW5nIHRoZSBmb250LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSN0ZXN0U3RyaW5nXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnfE3DiXFneSdcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRlc3RTdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBwYWRkaW5nIGFkZGVkIHRvIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBmb250IG1ldHJpY3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2Jhc2VsaW5lWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMS4yXHJcbiAgICAgICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYXNlbGluZVg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgdmVydGljYWwgcGFkZGluZyBhZGRlZCB0byB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IHdoZW4gY2FsY3VsYXRpbmcgdGhlIGZvbnQgbWV0cmljcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjYmFzZWxpbmVZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxLjRcclxuICAgICAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VsaW5lWTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZvbnQgc3R5bGUsIHNpemUgYW5kIGZhbWlseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjX2ZvbnRcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZm9udDtcclxuXHJcbiAgICAgICAgLy8gIFNldCB0byBkZWZhdWx0cyArIHVzZXIgc3R5bGVcclxuICAgICAgICB0aGlzLnNldFN0eWxlKHN0eWxlLCBmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHZhciBtZXRyaWNzID0gR2V0VmFsdWUoc3R5bGUsICdtZXRyaWNzJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAvLyAgUHJvdmlkZSBvcHRpb25hbCBUZXh0TWV0cmljcyBpbiB0aGUgc3R5bGUgb2JqZWN0IHRvIGF2b2lkIHRoZSBjYW52YXMgbG9vay11cCAvIHNjYW5uaW5nXHJcbiAgICAgICAgLy8gIERvaW5nIHRoaXMgaXMgcmVzZXQgaWYgeW91IHRoZW4gY2hhbmdlIHRoZSBmb250IG9mIHRoaXMgVGV4dFN0eWxlIGFmdGVyIGNyZWF0aW9uXHJcbiAgICAgICAgaWYgKG1ldHJpY3MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1ldHJpY3MgPSB7XHJcbiAgICAgICAgICAgICAgICBhc2NlbnQ6IEdldFZhbHVlKG1ldHJpY3MsICdhc2NlbnQnLCAwKSxcclxuICAgICAgICAgICAgICAgIGRlc2NlbnQ6IEdldFZhbHVlKG1ldHJpY3MsICdkZXNjZW50JywgMCksXHJcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogR2V0VmFsdWUobWV0cmljcywgJ2ZvbnRTaXplJywgMClcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tZXRyaWNzID0gTWVhc3VyZVRleHQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dCBzdHlsZS5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGV4dC5zZXRTdHlsZSh7XHJcbiAgICAgKiAgICAgZm9udFNpemU6ICc2NHB4JyxcclxuICAgICAqICAgICBmb250RmFtaWx5OiAnQXJpYWwnLFxyXG4gICAgICogICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgKiAgICAgYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICogICAgIGJhY2tncm91bmRDb2xvcjogJyNmZjAwZmYnXHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0U3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlRleHQuVGV4dFN0eWxlfSBzdHlsZSAtIFRoZSBzdHlsZSBzZXR0aW5ncyB0byBzZXQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVUZXh0PXRydWVdIC0gV2hldGhlciB0byB1cGRhdGUgdGhlIHRleHQgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXREZWZhdWx0cz1mYWxzZV0gLSBVc2UgdGhlIGRlZmF1bHQgdmFsdWVzIGlzIG5vdCBzZXQsIG9yIHRoZSBsb2NhbCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBwYXJlbnQgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUsIHVwZGF0ZVRleHQsIHNldERlZmF1bHRzKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh1cGRhdGVUZXh0ID09PSB1bmRlZmluZWQpIHsgdXBkYXRlVGV4dCA9IHRydWU7IH1cclxuICAgICAgICBpZiAoc2V0RGVmYXVsdHMgPT09IHVuZGVmaW5lZCkgeyBzZXREZWZhdWx0cyA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIC8vICBBdm9pZCB0eXBlIG11dGF0aW9uXHJcbiAgICAgICAgaWYgKHN0eWxlICYmIHN0eWxlLmhhc093blByb3BlcnR5KCdmb250U2l6ZScpICYmIHR5cGVvZiBzdHlsZS5mb250U2l6ZSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHlsZS5mb250U2l6ZSA9IHN0eWxlLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHByb3BlcnR5TWFwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gKHNldERlZmF1bHRzKSA/IHByb3BlcnR5TWFwW2tleV1bMV0gOiB0aGlzW2tleV07XHJcblxyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnd29yZFdyYXBDYWxsYmFjaycgfHwga2V5ID09PSAnd29yZFdyYXBDYWxsYmFja1Njb3BlJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgJiBzY29wZSBzaG91bGQgYmUgc2V0IHdpdGhvdXQgcHJvY2Vzc2luZyB0aGUgdmFsdWVzXHJcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBHZXRWYWx1ZShzdHlsZSwgcHJvcGVydHlNYXBba2V5XVswXSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gR2V0QWR2YW5jZWRWYWx1ZShzdHlsZSwgcHJvcGVydHlNYXBba2V5XVswXSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQWxsb3cgZm9yICdmb250JyBvdmVycmlkZVxyXG4gICAgICAgIHZhciBmb250ID0gR2V0VmFsdWUoc3R5bGUsICdmb250JywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChmb250ICE9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRGb250KGZvbnQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ZvbnQgPSBbIHRoaXMuZm9udFN0eWxlLCB0aGlzLmZvbnRTaXplLCB0aGlzLmZvbnRGYW1pbHkgXS5qb2luKCcgJykudHJpbSgpO1xyXG5cclxuICAgICAgICAvLyAgQWxsb3cgZm9yICdmaWxsJyB0byBiZSB1c2VkIGluIHBsYWNlIG9mICdjb2xvcidcclxuICAgICAgICB2YXIgZmlsbCA9IEdldFZhbHVlKHN0eWxlLCAnZmlsbCcsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoZmlsbCAhPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSBmaWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZVRleHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3luY2hyb25pemUgdGhlIGZvbnQgc2V0dGluZ3MgdG8gdGhlIGdpdmVuIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc3luY0ZvbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyAtIFRoZSBDYW52YXMgRWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IC0gVGhlIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAqL1xyXG4gICAgc3luY0ZvbnQ6IGZ1bmN0aW9uIChjYW52YXMsIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgY29udGV4dC5mb250ID0gdGhpcy5fZm9udDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTeW5jaHJvbml6ZSB0aGUgdGV4dCBzdHlsZSBzZXR0aW5ncyB0byB0aGUgZ2l2ZW4gQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzeW5jU3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyAtIFRoZSBDYW52YXMgRWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IC0gVGhlIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dC5cclxuICAgICAqL1xyXG4gICAgc3luY1N0eWxlOiBmdW5jdGlvbiAoY2FudmFzLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2FscGhhYmV0aWMnO1xyXG5cclxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuY29sb3I7XHJcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHRoaXMuc3Ryb2tlO1xyXG5cclxuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHRoaXMuc3Ryb2tlVGhpY2tuZXNzO1xyXG4gICAgICAgIGNvbnRleHQubGluZUNhcCA9ICdyb3VuZCc7XHJcbiAgICAgICAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3luY2hyb25pemUgdGhlIHNoYWRvdyBzZXR0aW5ncyB0byB0aGUgZ2l2ZW4gQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzeW5jU2hhZG93XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHNoYWRvd3MgYXJlIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICovXHJcbiAgICBzeW5jU2hhZG93OiBmdW5jdGlvbiAoY29udGV4dCwgZW5hYmxlZClcclxuICAgIHtcclxuICAgICAgICBpZiAoZW5hYmxlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuc2hhZG93T2Zmc2V0WCA9IHRoaXMuc2hhZG93T2Zmc2V0WDtcclxuICAgICAgICAgICAgY29udGV4dC5zaGFkb3dPZmZzZXRZID0gdGhpcy5zaGFkb3dPZmZzZXRZO1xyXG4gICAgICAgICAgICBjb250ZXh0LnNoYWRvd0NvbG9yID0gdGhpcy5zaGFkb3dDb2xvcjtcclxuICAgICAgICAgICAgY29udGV4dC5zaGFkb3dCbHVyID0gdGhpcy5zaGFkb3dCbHVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250ZXh0LnNoYWRvd09mZnNldFggPSAwO1xyXG4gICAgICAgICAgICBjb250ZXh0LnNoYWRvd09mZnNldFkgPSAwO1xyXG4gICAgICAgICAgICBjb250ZXh0LnNoYWRvd0NvbG9yID0gMDtcclxuICAgICAgICAgICAgY29udGV4dC5zaGFkb3dCbHVyID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBzdHlsZSBzZXR0aW5ncyBmb3IgdGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlY2FsY3VsYXRlTWV0cmljcyAtIFdoZXRoZXIgdG8gcmVjYWxjdWxhdGUgZm9udCBhbmQgdGV4dCBtZXRyaWNzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIChyZWNhbGN1bGF0ZU1ldHJpY3MpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlY2FsY3VsYXRlTWV0cmljcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvbnQgPSBbIHRoaXMuZm9udFN0eWxlLCB0aGlzLmZvbnRTaXplLCB0aGlzLmZvbnRGYW1pbHkgXS5qb2luKCcgJykudHJpbSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tZXRyaWNzID0gTWVhc3VyZVRleHQodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudXBkYXRlVGV4dCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZm9udC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIHN0cmluZyBpcyBnaXZlbiwgdGhlIGZvbnQgZmFtaWx5IGlzIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgZ2l2ZW4sIHRoZSBgZm9udEZhbWlseWAsIGBmb250U2l6ZWAgYW5kIGBmb250U3R5bGVgXHJcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIHRoYXQgb2JqZWN0IGFyZSBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldEZvbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBmb250IC0gVGhlIGZvbnQgZmFtaWx5IG9yIGZvbnQgc2V0dGluZ3MgdG8gc2V0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlVGV4dD10cnVlXSAtIFdoZXRoZXIgdG8gdXBkYXRlIHRoZSB0ZXh0IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGb250OiBmdW5jdGlvbiAoZm9udCwgdXBkYXRlVGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAodXBkYXRlVGV4dCA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZVRleHQgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciBmb250RmFtaWx5ID0gZm9udDtcclxuICAgICAgICB2YXIgZm9udFNpemUgPSAnJztcclxuICAgICAgICB2YXIgZm9udFN0eWxlID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZm9udCAhPT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb250RmFtaWx5ID0gR2V0VmFsdWUoZm9udCwgJ2ZvbnRGYW1pbHknLCAnQ291cmllcicpO1xyXG4gICAgICAgICAgICBmb250U2l6ZSA9IEdldFZhbHVlKGZvbnQsICdmb250U2l6ZScsICcxNnB4Jyk7XHJcbiAgICAgICAgICAgIGZvbnRTdHlsZSA9IEdldFZhbHVlKGZvbnQsICdmb250U3R5bGUnLCAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmb250U3BsaXQgPSBmb250LnNwbGl0KCcgJyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgaSA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb250U3R5bGUgPSAoZm9udFNwbGl0Lmxlbmd0aCA+IDIpID8gZm9udFNwbGl0W2krK10gOiAnJztcclxuICAgICAgICAgICAgZm9udFNpemUgPSBmb250U3BsaXRbaSsrXSB8fCAnMTZweCc7XHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgPSBmb250U3BsaXRbaSsrXSB8fCAnQ291cmllcic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9udEZhbWlseSAhPT0gdGhpcy5mb250RmFtaWx5IHx8IGZvbnRTaXplICE9PSB0aGlzLmZvbnRTaXplIHx8IGZvbnRTdHlsZSAhPT0gdGhpcy5mb250U3R5bGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5O1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRTaXplID0gZm9udFNpemU7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFN0eWxlID0gZm9udFN0eWxlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVwZGF0ZVRleHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmb250IGZhbWlseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0Rm9udEZhbWlseVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhbWlseSAtIFRoZSBmb250IGZhbWlseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Rm9udEZhbWlseTogZnVuY3Rpb24gKGZhbWlseSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5mb250RmFtaWx5ICE9PSBmYW1pbHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBmYW1pbHk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZvbnQgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldEZvbnRTdHlsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlIC0gVGhlIGZvbnQgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBwYXJlbnQgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZvbnRTdHlsZTogZnVuY3Rpb24gKHN0eWxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmZvbnRTdHlsZSAhPT0gc3R5bGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRTdHlsZSA9IHN0eWxlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmb250IHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldEZvbnRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKX0gc2l6ZSAtIFRoZSBmb250IHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBwYXJlbnQgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZvbnRTaXplOiBmdW5jdGlvbiAoc2l6ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdudW1iZXInKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2l6ZSA9IHNpemUudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mb250U2l6ZSAhPT0gc2l6ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0ZXN0IHN0cmluZyB0byB1c2Ugd2hlbiBtZWFzdXJpbmcgdGhlIGZvbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFRlc3RTdHJpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgdGVzdCBzdHJpbmcgdG8gdXNlIHdoZW4gbWVhc3VyaW5nIHRoZSBmb250LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUZXN0U3RyaW5nOiBmdW5jdGlvbiAoc3RyaW5nKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudGVzdFN0cmluZyA9IHN0cmluZztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIGZpeGVkIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIFBhc3MgaW4gYDBgIGZvciBlaXRoZXIgb2YgdGhlc2UgcGFyYW1ldGVycyB0byBkaXNhYmxlIGZpeGVkIHdpZHRoIG9yIGhlaWdodCByZXNwZWN0aXZlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldEZpeGVkU2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIGZpeGVkIHdpZHRoIHRvIHNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgZml4ZWQgaGVpZ2h0IHRvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Rml4ZWRTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZpeGVkV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmZpeGVkSGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAod2lkdGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhlaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRCYWNrZ3JvdW5kQ29sb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIFRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3I6IGZ1bmN0aW9uIChjb2xvcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dCBmaWxsIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRGaWxsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBUaGUgdGV4dCBmaWxsIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGaWxsOiBmdW5jdGlvbiAoY29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dCBmaWxsIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRDb2xvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gVGhlIHRleHQgZmlsbCBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sb3I6IGZ1bmN0aW9uIChjb2xvcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSByZXNvbHV0aW9uIHVzZWQgYnkgdGhlIFRleHQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBiZSBzZXQgdG8gbWF0Y2ggdGhlIHJlc29sdXRpb24gc2V0IGluIHRoZSBHYW1lIENvbmZpZyxcclxuICAgICAqIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHZpYSB0aGlzIG1ldGhvZC4gSXQgYWxsb3dzIGZvciBtdWNoIGNsZWFyZXIgdGV4dCBvbiBIaWdoIERQSSBkZXZpY2VzLFxyXG4gICAgICogYXQgdGhlIGNvc3Qgb2YgbWVtb3J5IGJlY2F1c2UgaXQgdXNlcyBsYXJnZXIgaW50ZXJuYWwgQ2FudmFzIHRleHR1cmVzIGZvciB0aGUgVGV4dC5cclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIHVzZSB3aXRoIGNhdXRpb24sIGFzIHRoZSBtb3JlIGhpZ2ggcmVzIFRleHQgeW91IGhhdmUsIHRoZSBtb3JlIG1lbW9yeSBpdCB1c2VzIHVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRSZXNvbHV0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHJlc29sdXRpb24gZm9yIHRoaXMgVGV4dCBvYmplY3QgdG8gdXNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSZXNvbHV0aW9uOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzdHJva2Ugc2V0dGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFN0cm9rZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gVGhlIHN0cm9rZSBjb2xvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aGlja25lc3MgLSBUaGUgc3Ryb2tlIHRoaWNrbmVzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U3Ryb2tlOiBmdW5jdGlvbiAoY29sb3IsIHRoaWNrbmVzcylcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpY2tuZXNzID09PSB1bmRlZmluZWQpIHsgdGhpY2tuZXNzID0gdGhpcy5zdHJva2VUaGlja25lc3M7IH1cclxuXHJcbiAgICAgICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQgJiYgdGhpcy5zdHJva2VUaGlja25lc3MgIT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUmVzZXQgdGhlIHN0cm9rZSB0byB6ZXJvIChkaXNhYmxpbmcgaXQpXHJcbiAgICAgICAgICAgIHRoaXMuc3Ryb2tlVGhpY2tuZXNzID0gMDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0cm9rZSAhPT0gY29sb3IgfHwgdGhpcy5zdHJva2VUaGlja25lc3MgIT09IHRoaWNrbmVzcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3Ryb2tlID0gY29sb3I7XHJcbiAgICAgICAgICAgIHRoaXMuc3Ryb2tlVGhpY2tuZXNzID0gdGhpY2tuZXNzO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaGFkb3cgc2V0dGluZ3MuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHJlLW1lYXN1cmVzIHRoZSBwYXJlbnQgVGV4dCBvYmplY3QsXHJcbiAgICAgKiBzbyBvbmx5IGNhbGwgaXQgd2hlbiB5b3UgYWN0dWFsbHkgY2hhbmdlIHRoZSBzaGFkb3cgc2V0dGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFNoYWRvd1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGhvcml6b250YWwgc2hhZG93IG9mZnNldC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB2ZXJ0aWNhbCBzaGFkb3cgb2Zmc2V0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj0nIzAwMCddIC0gVGhlIHNoYWRvdyBjb2xvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYmx1cj0wXSAtIFRoZSBzaGFkb3cgYmx1ciByYWRpdXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaGFkb3dTdHJva2U9ZmFsc2VdIC0gV2hldGhlciB0byBzdHJva2UgdGhlIHNoYWRvdy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NoYWRvd0ZpbGw9dHJ1ZV0gLSBXaGV0aGVyIHRvIGZpbGwgdGhlIHNoYWRvdy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2hhZG93OiBmdW5jdGlvbiAoeCwgeSwgY29sb3IsIGJsdXIsIHNoYWRvd1N0cm9rZSwgc2hhZG93RmlsbClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKSB7IGNvbG9yID0gJyMwMDAnOyB9XHJcbiAgICAgICAgaWYgKGJsdXIgPT09IHVuZGVmaW5lZCkgeyBibHVyID0gMDsgfVxyXG4gICAgICAgIGlmIChzaGFkb3dTdHJva2UgPT09IHVuZGVmaW5lZCkgeyBzaGFkb3dTdHJva2UgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChzaGFkb3dGaWxsID09PSB1bmRlZmluZWQpIHsgc2hhZG93RmlsbCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zaGFkb3dPZmZzZXRYID0geDtcclxuICAgICAgICB0aGlzLnNoYWRvd09mZnNldFkgPSB5O1xyXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBjb2xvcjtcclxuICAgICAgICB0aGlzLnNoYWRvd0JsdXIgPSBibHVyO1xyXG4gICAgICAgIHRoaXMuc2hhZG93U3Ryb2tlID0gc2hhZG93U3Ryb2tlO1xyXG4gICAgICAgIHRoaXMuc2hhZG93RmlsbCA9IHNoYWRvd0ZpbGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaGFkb3cgb2Zmc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRTaGFkb3dPZmZzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIHNoYWRvdyBvZmZzZXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgdmVydGljYWwgc2hhZG93IG9mZnNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2hhZG93T2Zmc2V0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0geDsgfVxyXG5cclxuICAgICAgICB0aGlzLnNoYWRvd09mZnNldFggPSB4O1xyXG4gICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0WSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaGFkb3cgY29sb3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFNoYWRvd0NvbG9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yPScjMDAwJ10gLSBUaGUgc2hhZG93IGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTaGFkb3dDb2xvcjogZnVuY3Rpb24gKGNvbG9yKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKSB7IGNvbG9yID0gJyMwMDAnOyB9XHJcblxyXG4gICAgICAgIHRoaXMuc2hhZG93Q29sb3IgPSBjb2xvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNoYWRvdyBibHVyIHJhZGl1cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0U2hhZG93Qmx1clxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtibHVyPTBdIC0gVGhlIHNoYWRvdyBibHVyIHJhZGl1cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2hhZG93Qmx1cjogZnVuY3Rpb24gKGJsdXIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGJsdXIgPT09IHVuZGVmaW5lZCkgeyBibHVyID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLnNoYWRvd0JsdXIgPSBibHVyO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIHNoYWRvdyBzdHJva2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFNoYWRvd1N0cm9rZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBzaGFkb3cgc3Ryb2tlIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTaGFkb3dTdHJva2U6IGZ1bmN0aW9uIChlbmFibGVkKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2hhZG93U3Ryb2tlID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBzaGFkb3cgZmlsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0U2hhZG93RmlsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBzaGFkb3cgZmlsbCBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2hhZG93RmlsbDogZnVuY3Rpb24gKGVuYWJsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaGFkb3dGaWxsID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHdpZHRoIChpbiBwaXhlbHMpIHRvIHVzZSBmb3Igd3JhcHBpbmcgbGluZXMuXHJcbiAgICAgKlxyXG4gICAgICogUGFzcyBpbiBudWxsIHRvIHJlbW92ZSB3cmFwcGluZyBieSB3aWR0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0V29yZFdyYXBXaWR0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGluIHBpeGVscy4gU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHdyYXBwaW5nLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXNlQWR2YW5jZWRXcmFwPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgYWR2YW5jZWQgd3JhcHBpbmdcclxuICAgICAqIGFsZ29yaXRobS4gSWYgdHJ1ZSwgc3BhY2VzIGFyZSBjb2xsYXBzZWQgYW5kIHdoaXRlc3BhY2UgaXMgdHJpbW1lZCBmcm9tIGxpbmVzLiBJZiBmYWxzZSxcclxuICAgICAqIHNwYWNlcyBhbmQgd2hpdGVzcGFjZSBhcmUgbGVmdCBhcyBpcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gVGhlIHBhcmVudCBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0V29yZFdyYXBXaWR0aDogZnVuY3Rpb24gKHdpZHRoLCB1c2VBZHZhbmNlZFdyYXApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHVzZUFkdmFuY2VkV3JhcCA9PT0gdW5kZWZpbmVkKSB7IHVzZUFkdmFuY2VkV3JhcCA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHRoaXMud29yZFdyYXBXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMud29yZFdyYXBVc2VBZHZhbmNlZCA9IHVzZUFkdmFuY2VkV3JhcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHdyYXBwaW5nIGxpbmVzLlxyXG4gICAgICpcclxuICAgICAqIFBhc3MgaW4gbnVsbCB0byByZW1vdmUgd3JhcHBpbmcgYnkgY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3NldFdvcmRXcmFwQ2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VGV4dFN0eWxlV29yZFdyYXBDYWxsYmFja30gY2FsbGJhY2sgLSBBIGN1c3RvbSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdyYXBwaW5nIHRoZVxyXG4gICAgICogdGV4dC4gSXQgd2lsbCByZWNlaXZlIHR3byBhcmd1bWVudHM6IHRleHQgKHRoZSBzdHJpbmcgdG8gd3JhcCksIHRleHRPYmplY3QgKHRoaXMgVGV4dFxyXG4gICAgICogaW5zdGFuY2UpLiBJdCBzaG91bGQgcmV0dXJuIHRoZSB3cmFwcGVkIGxpbmVzIGVpdGhlciBhcyBhbiBhcnJheSBvZiBsaW5lcyBvciBhcyBhIHN0cmluZyB3aXRoXHJcbiAgICAgKiBuZXdsaW5lIGNoYXJhY3RlcnMgaW4gcGxhY2UgdG8gaW5kaWNhdGUgd2hlcmUgYnJlYWtzIHNob3VsZCBoYXBwZW4uXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3Njb3BlPW51bGxdIC0gVGhlIHNjb3BlIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBwYXJlbnQgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFdvcmRXcmFwQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgc2NvcGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQpIHsgc2NvcGUgPSBudWxsOyB9XHJcblxyXG4gICAgICAgIHRoaXMud29yZFdyYXBDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMud29yZFdyYXBDYWxsYmFja1Njb3BlID0gc2NvcGU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHRleHQgaW4gdGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGFyZ3VtZW50IGNhbiBiZSBvbmUgb2Y6IGBsZWZ0YCwgYHJpZ2h0YCwgYGNlbnRlcmAgb3IgYGp1c3RpZnlgLlxyXG4gICAgICogXHJcbiAgICAgKiBBbGlnbm1lbnQgb25seSB3b3JrcyBpZiB0aGUgVGV4dCBvYmplY3QgaGFzIG1vcmUgdGhhbiBvbmUgbGluZSBvZiB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNzZXRBbGlnblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlnbj0nbGVmdCddIC0gVGhlIHRleHQgYWxpZ25tZW50IGZvciBtdWx0aS1saW5lIHRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBwYXJlbnQgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFsaWduOiBmdW5jdGlvbiAoYWxpZ24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFsaWduID09PSB1bmRlZmluZWQpIHsgYWxpZ24gPSAnbGVmdCc7IH1cclxuXHJcbiAgICAgICAgdGhpcy5hbGlnbiA9IGFsaWduO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gZHJhdy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGUjc2V0TWF4TGluZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW21heD0wXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBkcmF3LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgcGFyZW50IFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXhMaW5lczogZnVuY3Rpb24gKG1heClcclxuICAgIHtcclxuICAgICAgICBpZiAobWF4ID09PSB1bmRlZmluZWQpIHsgbWF4ID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLm1heExpbmVzID0gbWF4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgY3VycmVudCB0ZXh0IG1ldHJpY3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI2dldFRleHRNZXRyaWNzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuVGV4dC5UZXh0TWV0cmljc30gVGhlIHRleHQgbWV0cmljcy5cclxuICAgICAqL1xyXG4gICAgZ2V0VGV4dE1ldHJpY3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1ldHJpY3MgPSB0aGlzLm1ldHJpY3M7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFzY2VudDogbWV0cmljcy5hc2NlbnQsXHJcbiAgICAgICAgICAgIGRlc2NlbnQ6IG1ldHJpY3MuZGVzY2VudCxcclxuICAgICAgICAgICAgZm9udFNpemU6IG1ldHJpY3MuZm9udFNpemVcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFRleHQgU3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dFN0eWxlI3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBUZXh0IFN0eWxlLlxyXG4gICAgICovXHJcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydHlNYXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IHRoaXNba2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG91dHB1dC5tZXRyaWNzID0gdGhpcy5nZXRUZXh0TWV0cmljcygpO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgdGhpcyBUZXh0IFN0eWxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHRTdHlsZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUZXh0U3R5bGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFkZFRvRE9NID0gcmVxdWlyZSgnLi4vLi4vLi4vZG9tL0FkZFRvRE9NJyk7XHJcbnZhciBDYW52YXNQb29sID0gcmVxdWlyZSgnLi4vLi4vLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzUG9vbCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uLy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi8uLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3QnKTtcclxudmFyIEdldFRleHRTaXplID0gcmVxdWlyZSgnLi4vR2V0VGV4dFNpemUnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBSZW1vdmVGcm9tRE9NID0gcmVxdWlyZSgnLi4vLi4vLi4vZG9tL1JlbW92ZUZyb21ET00nKTtcclxudmFyIFRleHRSZW5kZXIgPSByZXF1aXJlKCcuL1RleHRSZW5kZXInKTtcclxudmFyIFRleHRTdHlsZSA9IHJlcXVpcmUoJy4uL1RleHRTdHlsZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUZXh0IEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogVGV4dCBvYmplY3RzIHdvcmsgYnkgY3JlYXRpbmcgdGhlaXIgb3duIGludGVybmFsIGhpZGRlbiBDYW52YXMgYW5kIHRoZW4gcmVuZGVycyB0ZXh0IHRvIGl0IHVzaW5nXHJcbiAqIHRoZSBzdGFuZGFyZCBDYW52YXMgYGZpbGxUZXh0YCBBUEkuIEl0IHRoZW4gY3JlYXRlcyBhIHRleHR1cmUgZnJvbSB0aGlzIGNhbnZhcyB3aGljaCBpcyByZW5kZXJlZFxyXG4gKiB0byB5b3VyIGdhbWUgZHVyaW5nIHRoZSByZW5kZXIgcGFzcy5cclxuICogXHJcbiAqIEJlY2F1c2UgaXQgdXNlcyB0aGUgQ2FudmFzIEFQSSB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIGFsbCB0aGUgZmVhdHVyZXMgdGhpcyBvZmZlcnMsIHN1Y2ggYXNcclxuICogYXBwbHlpbmcgZ3JhZGllbnQgZmlsbHMgdG8gdGhlIHRleHQsIG9yIHN0cm9rZXMsIHNoYWRvd3MgYW5kIG1vcmUuIFlvdSBjYW4gYWxzbyB1c2UgY3VzdG9tIGZvbnRzXHJcbiAqIGxvYWRlZCBleHRlcm5hbGx5LCBzdWNoIGFzIEdvb2dsZSBvciBUeXBlS2l0IFdlYiBmb250cy5cclxuICpcclxuICogKipJbXBvcnRhbnQ6KiogVGhlIGZvbnQgbmFtZSBtdXN0IGJlIHF1b3RlZCBpZiBpdCBjb250YWlucyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBkaWdpdHMgb3JcclxuICogc3BlY2lhbCBjaGFyYWN0ZXJzLCBlaXRoZXIgd2hlbiBjcmVhdGluZyB0aGUgVGV4dCBvYmplY3QsIG9yIHdoZW4gc2V0dGluZyB0aGUgZm9udCB2aWEgYHNldEZvbnRgXHJcbiAqIG9yIGBzZXRGb250RmFtaWx5YCwgZS5nLjpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmFkZC50ZXh0KDAsIDAsICdIZWxsbyBXb3JsZCcsIHsgZm9udEZhbWlseTogJ0dlb3JnaWEsIFwiR291ZHkgQm9va2xldHRlciAxOTExXCIsIFRpbWVzLCBzZXJpZicgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMuYWRkLnRleHQoMCwgMCwgJ0hlbGxvIFdvcmxkJywgeyBmb250OiAnXCJQcmVzcyBTdGFydCAyUFwiJyB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFlvdSBjYW4gb25seSBkaXNwbGF5IGZvbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBsb2FkZWQgYW5kIGF2YWlsYWJsZSB0byB0aGUgYnJvd3NlcjogdGhlcmVmb3JlIGZvbnRzIG11c3RcclxuICogYmUgcHJlLWxvYWRlZC4gUGhhc2VyIGRvZXMgbm90IGRvIHRocyBmb3IgeW91LCBzbyB5b3Ugd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgYSAzcmQgcGFydHkgZm9udCBsb2FkZXIsXHJcbiAqIG9yIGhhdmUgdGhlIGZvbnRzIHJlYWR5IGF2YWlsYWJsZSBpbiB0aGUgQ1NTIG9uIHRoZSBwYWdlIGluIHdoaWNoIHlvdXIgUGhhc2VyIGdhbWUgcmVzaWRlcy5cclxuICpcclxuICogU2VlIHtAbGluayBodHRwOi8vd3d3LmpvcmRhbm0uY28udWsvdGlueXR5cGUgdGhpcyBjb21wYXRpYmlsaXR5IHRhYmxlfSBmb3IgdGhlIGF2YWlsYWJsZSBkZWZhdWx0IGZvbnRzXHJcbiAqIGFjcm9zcyBtb2JpbGUgYnJvd3NlcnMuXHJcbiAqIFxyXG4gKiBBIG5vdGUgb24gcGVyZm9ybWFuY2U6IEV2ZXJ5IHRpbWUgdGhlIGNvbnRlbnRzIG9mIGEgVGV4dCBvYmplY3QgY2hhbmdlcywgaS5lLiBjaGFuZ2luZyB0aGUgdGV4dCBiZWluZ1xyXG4gKiBkaXNwbGF5ZWQsIG9yIHRoZSBzdHlsZSBvZiB0aGUgdGV4dCwgaXQgbmVlZHMgdG8gcmVtYWtlIHRoZSBUZXh0IGNhbnZhcywgYW5kIGlmIG9uIFdlYkdMLCByZS11cGxvYWQgdGhlXHJcbiAqIG5ldyB0ZXh0dXJlIHRvIHRoZSBHUFUuIFRoaXMgY2FuIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gaWYgdXNlZCBvZnRlbiwgb3Igd2l0aCBsYXJnZSBxdWFudGl0aWVzIG9mXHJcbiAqIFRleHQgb2JqZWN0cyBpbiB5b3VyIGdhbWUuIElmIHlvdSBydW4gaW50byBwZXJmb3JtYW5jZSBpc3N1ZXMgeW91IHdvdWxkIGJlIGJldHRlciBvZmYgdXNpbmcgQml0bWFwIFRleHRcclxuICogaW5zdGVhZCwgYXMgaXQgYmVuZWZpdHMgZnJvbSBiYXRjaGluZyBhbmQgYXZvaWRzIGV4cGVuc2l2ZSBDYW52YXMgQVBJIGNhbGxzLlxyXG4gKlxyXG4gKiBAY2xhc3MgVGV4dFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGFcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNvbXB1dGVkU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Dcm9wXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXBcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuR2V0Qm91bmRzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk1hc2tcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSB0ZXh0IC0gVGhlIHRleHQgdGhpcyBUZXh0IG9iamVjdCB3aWxsIGRpc3BsYXkuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlRleHQuVGV4dFN0eWxlfSBzdHlsZSAtIFRoZSB0ZXh0IHN0eWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKlxyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LWZhbWlseSNWYWxpZF9mYW1pbHlfbmFtZXNcclxuICovXHJcbnZhciBUZXh0ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5CbGVuZE1vZGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Db21wdXRlZFNpemUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Dcm9wLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuR2V0Qm91bmRzLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGludCxcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgVGV4dFJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRleHQgKHNjZW5lLCB4LCB5LCB0ZXh0LCBzdHlsZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdUZXh0Jyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZW5kZXJlciBpbiB1c2UgYnkgdGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHNjZW5lLnN5cy5nYW1lLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKDAsIDApO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYW52YXMgZWxlbWVudCB0aGF0IHRoZSB0ZXh0IGlzIHJlbmRlcmVkIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjY2FudmFzXHJcbiAgICAgICAgICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb250ZXh0IG9mIHRoZSBjYW52YXMgZWxlbWVudCB0aGF0IHRoZSB0ZXh0IGlzIHJlbmRlcmVkIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjY29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRleHQgU3R5bGUgb2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogTWFuYWdlcyB0aGUgc3R5bGUgb2YgdGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3N0eWxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0U3R5bGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IG5ldyBUZXh0U3R5bGUodGhpcywgc3R5bGUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgcm91bmQgbGluZSBwb3NpdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNhdXRvUm91bmRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hdXRvUm91bmQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgUmVndWxhciBFeHByZXNzaW9uIHRoYXQgaXMgdXNlZCB0byBzcGxpdCB0aGUgdGV4dCB1cCBpbnRvIGxpbmVzLCBpblxyXG4gICAgICAgICAqIG11bHRpLWxpbmUgdGV4dC4gQnkgZGVmYXVsdCB0aGlzIGlzIGAvKD86XFxyXFxufFxccnxcXG4pL2AuXHJcbiAgICAgICAgICogWW91IGNhbiBjaGFuZ2UgdGhpcyBSZWdFeHAgdG8gYmUgYW55dGhpbmcgZWxzZSB0aGF0IHlvdSBtYXkgbmVlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NwbGl0UmVnRXhwXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNwbGl0UmVnRXhwID0gLyg/OlxcclxcbnxcXHJ8XFxuKS87XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNfdGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGV4dCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmeSBhIHBhZGRpbmcgdmFsdWUgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGxpbmUgd2lkdGggYW5kIGhlaWdodCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBUZXh0IHNpemUuXHJcbiAgICAgICAgICogQWxsb3dzIHlvdSB0byBhZGQgZXh0cmEgc3BhY2luZyBpZiB0aGUgYnJvd3NlciBpcyB1bmFibGUgdG8gYWNjdXJhdGVseSBkZXRlcm1pbmUgdGhlIHRydWUgZm9udCBkaW1lbnNpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjcGFkZGluZ1xyXG4gICAgICAgICAqIEB0eXBlIHt7bGVmdDpudW1iZXIscmlnaHQ6bnVtYmVyLHRvcDpudW1iZXIsYm90dG9tOm51bWJlcn19XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYWRkaW5nID0geyBsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsaW5lIHNwYWNpbmcgdmFsdWUuXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgZm9udCBoZWlnaHQgdG8gY2FsY3VsYXRlIHRoZSBvdmVyYWxsIGxpbmUgaGVpZ2h0LlxyXG4gICAgICAgICAqIE9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGlzIFRleHQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIGxpbmVzIG9mIHRleHQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IHVwZGF0ZSB0aGlzIHByb3BlcnR5IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBgc2V0TGluZVNwYWNpbmdgIG1ldGhvZCwgdGhlblxyXG4gICAgICAgICAqIGJlIHN1cmUgdG8gY2FsbCBgdXBkYXRlVGV4dGAgYWZ0ZXIsIG9yIHlvdSB3b24ndCBzZWUgdGhlIGNoYW5nZSByZWZsZWN0ZWQgaW4gdGhlIFRleHQgb2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjbGluZVNwYWNpbmdcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpbmVTcGFjaW5nID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgdGV4dCBvciBpdHMgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGFuZCBuZWVkIHVwZGF0aW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjZGlydHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gIElmIHJlc29sdXRpb24gd2Fzbid0IHNldCwgdGhlbiB3ZSBnZXQgaXQgZnJvbSB0aGUgZ2FtZSBjb25maWdcclxuICAgICAgICBpZiAodGhpcy5zdHlsZS5yZXNvbHV0aW9uID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZS5yZXNvbHV0aW9uID0gc2NlbmUuc3lzLmdhbWUuY29uZmlnLnJlc29sdXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW50ZXJuYWwgY3JvcCBkYXRhIG9iamVjdCwgYXMgdXNlZCBieSBgc2V0Q3JvcGAgYW5kIHBhc3NlZCB0byB0aGUgYEZyYW1lLnNldENyb3BVVnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I19jcm9wXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jcm9wID0gdGhpcy5yZXNldENyb3BPYmplY3QoKTtcclxuXHJcbiAgICAgICAgLy8gIENyZWF0ZSBhIFRleHR1cmUgZm9yIHRoaXMgVGV4dCBvYmplY3RcclxuICAgICAgICB0aGlzLnRleHR1cmUgPSBzY2VuZS5zeXMudGV4dHVyZXMuYWRkQ2FudmFzKG51bGwsIHRoaXMuY2FudmFzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gIEdldCB0aGUgZnJhbWVcclxuICAgICAgICB0aGlzLmZyYW1lID0gdGhpcy50ZXh0dXJlLmdldCgpO1xyXG5cclxuICAgICAgICAvLyAgU2V0IHRoZSByZXNvbHV0aW9uXHJcbiAgICAgICAgdGhpcy5mcmFtZS5zb3VyY2UucmVzb2x1dGlvbiA9IHRoaXMuc3R5bGUucmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIgJiYgdGhpcy5yZW5kZXJlci5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDbGVhciB0aGUgZGVmYXVsdCAxeDEgZ2xUZXh0dXJlLCBhcyB3ZSBvdmVycmlkZSBpdCBsYXRlclxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5mcmFtZS5zb3VyY2UuZ2xUZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuc291cmNlLmdsVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRSVEwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0KHRleHQpO1xyXG5cclxuICAgICAgICBpZiAoc3R5bGUgJiYgc3R5bGUucGFkZGluZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGFkZGluZyhzdHlsZS5wYWRkaW5nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZS5saW5lU3BhY2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZVNwYWNpbmcoc3R5bGUubGluZVNwYWNpbmcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2NlbmUuc3lzLmdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuQ09OVEVYVF9SRVNUT1JFRCwgZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH0sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgcmlnaHQgdG8gbGVmdCB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjaW5pdFJUTFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGluaXRSVEw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlLnJ0bClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBIZXJlIGlzIHdoZXJlIHRoZSBjcmF6eSBzdGFydHMuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAgRHVlIHRvIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gaXNzdWVzLCB5b3UgY2Fubm90IGZpbGxUZXh0IEJpRGkgdGV4dCB0byBhIGNhbnZhc1xyXG4gICAgICAgIC8vICB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSBET00uIEl0IGp1c3QgY29tcGxldGVseSBpZ25vcmVzIHRoZSBkaXJlY3Rpb24gcHJvcGVydHkuXHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLmRpciA9ICdydGwnO1xyXG5cclxuICAgICAgICAvLyAgRXhwZXJpbWVudGFsIGF0bSwgYnV0IG9uZSBkYXkgLi4uXHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmRpcmVjdGlvbiA9ICdydGwnO1xyXG5cclxuICAgICAgICAvLyAgQWRkIGl0IHRvIHRoZSBET00sIGJ1dCBoaWRkZW4gd2l0aGluIHRoZSBwYXJlbnQgY2FudmFzLlxyXG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgIEFkZFRvRE9NKHRoaXMuY2FudmFzLCB0aGlzLnNjZW5lLnN5cy5jYW52YXMpO1xyXG5cclxuICAgICAgICAvLyAgQW5kIGZpbmFsbHkgd2Ugc2V0IHRoZSB4IG9yaWdpblxyXG4gICAgICAgIHRoaXMub3JpZ2luWCA9IDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3JlZWR5IHdyYXBwaW5nIGFsZ29yaXRobSB0aGF0IHdpbGwgd3JhcCB3b3JkcyBhcyB0aGUgbGluZSBncm93cyBsb25nZXIgdGhhbiBpdHMgaG9yaXpvbnRhbFxyXG4gICAgICogYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjcnVuV29yZFdyYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gcGVyZm9ybSB3b3JkIHdyYXAgZGV0ZWN0aW9uIGFnYWluc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGV4dCBhZnRlciB3cmFwcGluZyBoYXMgYmVlbiBhcHBsaWVkLlxyXG4gICAgICovXHJcbiAgICBydW5Xb3JkV3JhcDogZnVuY3Rpb24gKHRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5zdHlsZTtcclxuXHJcbiAgICAgICAgaWYgKHN0eWxlLndvcmRXcmFwQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3JhcHBlZExpbmVzID0gc3R5bGUud29yZFdyYXBDYWxsYmFjay5jYWxsKHN0eWxlLndvcmRXcmFwQ2FsbGJhY2tTY29wZSwgdGV4dCwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3cmFwcGVkTGluZXMpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVkTGluZXMgPSB3cmFwcGVkTGluZXMuam9pbignXFxuJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkTGluZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0eWxlLndvcmRXcmFwV2lkdGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoc3R5bGUud29yZFdyYXBVc2VBZHZhbmNlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRXb3JkV3JhcCh0ZXh0LCB0aGlzLmNvbnRleHQsIHRoaXMuc3R5bGUud29yZFdyYXBXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNpY1dvcmRXcmFwKHRleHQsIHRoaXMuY29udGV4dCwgdGhpcy5zdHlsZS53b3JkV3JhcFdpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWR2YW5jZWQgd3JhcHBpbmcgYWxnb3JpdGhtIHRoYXQgd2lsbCB3cmFwIHdvcmRzIGFzIHRoZSBsaW5lIGdyb3dzIGxvbmdlciB0aGFuIGl0cyBob3Jpem9udGFsXHJcbiAgICAgKiBib3VuZHMuIENvbnNlY3V0aXZlIHNwYWNlcyB3aWxsIGJlIGNvbGxhcHNlZCBhbmQgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZS4gTGluZXMgd2lsbCBiZVxyXG4gICAgICogdHJpbW1lZCBvZiB3aGl0ZSBzcGFjZSBiZWZvcmUgcHJvY2Vzc2luZy4gVGhyb3dzIGFuIGVycm9yIGlmIHdvcmRXcmFwV2lkdGggaXMgbGVzcyB0aGFuIGFcclxuICAgICAqIHNpbmdsZSBjaGFyYWN0ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNhZHZhbmNlZFdvcmRXcmFwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIHBlcmZvcm0gd29yZCB3cmFwIGRldGVjdGlvbiBhZ2FpbnN0LlxyXG4gICAgICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGNvbnRleHQgLSBUaGUgQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmRXcmFwV2lkdGggLSBUaGUgd29yZCB3cmFwIHdpZHRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHdyYXBwZWQgdGV4dC5cclxuICAgICAqL1xyXG4gICAgYWR2YW5jZWRXb3JkV3JhcDogZnVuY3Rpb24gKHRleHQsIGNvbnRleHQsIHdvcmRXcmFwV2lkdGgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9ICcnO1xyXG5cclxuICAgICAgICAvLyBDb25kZW5zZSBjb25zZWN1dGl2ZSBzcGFjZXMgYW5kIHNwbGl0IGludG8gbGluZXNcclxuICAgICAgICB2YXIgbGluZXMgPSB0ZXh0XHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8gKy9naSwgJyAnKVxyXG4gICAgICAgICAgICAuc3BsaXQodGhpcy5zcGxpdFJlZ0V4cCk7XHJcblxyXG4gICAgICAgIHZhciBsaW5lc0NvdW50ID0gbGluZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzQ291bnQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBvdXQgPSAnJztcclxuXHJcbiAgICAgICAgICAgIC8vIFRyaW0gd2hpdGVzcGFjZVxyXG4gICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9eICp8XFxzKiQvZ2ksICcnKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIGVudGlyZSBsaW5lIGlzIGxlc3MgdGhhbiB3b3JkV3JhcFdpZHRoIGFwcGVuZCB0aGUgZW50aXJlIGxpbmUgYW5kIGV4aXQgZWFybHlcclxuICAgICAgICAgICAgdmFyIGxpbmVXaWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQobGluZSkud2lkdGg7XHJcblxyXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDwgd29yZFdyYXBXaWR0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGxpbmUgKyAnXFxuJztcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNhbGN1bGF0ZSBuZXcgbGluZXNcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRMaW5lV2lkdGggPSB3b3JkV3JhcFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gU3BsaXQgaW50byB3b3Jkc1xyXG4gICAgICAgICAgICB2YXIgd29yZHMgPSBsaW5lLnNwbGl0KCcgJyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHdvcmRzLmxlbmd0aDsgaisrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgd29yZCA9IHdvcmRzW2pdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHdvcmRXaXRoU3BhY2UgPSB3b3JkICsgJyAnO1xyXG4gICAgICAgICAgICAgICAgdmFyIHdvcmRXaWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQod29yZFdpdGhTcGFjZSkud2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdvcmRXaWR0aCA+IGN1cnJlbnRMaW5lV2lkdGgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgd29yZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhdmUgb2ZmIGxldHRlcnMgZnJvbSB3b3JkIHVudGlsIGl0J3Mgc21hbGwgZW5vdWdoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdXb3JkID0gd29yZFdpdGhTcGFjZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdXb3JkLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3V29yZCA9IG5ld1dvcmQuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFdpZHRoID0gY29udGV4dC5tZWFzdXJlVGV4dChuZXdXb3JkKS53aWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29yZFdpZHRoIDw9IGN1cnJlbnRMaW5lV2lkdGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdvcmRXcmFwV2lkdGggaXMgdG9vIHNtYWxsIGZvciBldmVuIGEgc2luZ2xlIGxldHRlciwgc2hhbWUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlIHdpdGggYSBmYXRhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1dvcmQubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdGV4dFxcJ3Mgd29yZFdyYXBXaWR0aCBzZXR0aW5nIGlzIGxlc3MgdGhhbiBhIHNpbmdsZSBjaGFyYWN0ZXIhJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY3VycmVudCB3b3JkIGluIGFycmF5IHdpdGggcmVtYWluZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmRQYXJ0ID0gd29yZC5zdWJzdHIobmV3V29yZC5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNbal0gPSBzZWNvbmRQYXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZpcnN0IHBpZWNlIHRvIG91dHB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gbmV3V29yZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGV4aXN0aW5nIHdvcmQgbGVuZ3RoIGlzIDAsIGRvbid0IGluY2x1ZGUgaXRcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gKHdvcmRzW2pdLmxlbmd0aCkgPyBqIDogaiArIDE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbGxhcHNlIHJlc3Qgb2Ygc2VudGVuY2UgYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgd2hpdGUgc3BhY2VcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVtYWluZGVyID0gd29yZHMuc2xpY2Uob2Zmc2V0KS5qb2luKCcgJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1sgXFxuXSokL2dpLCAnJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgcmVtYWluZGVyIHRvIG5leHQgbGluZVxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzW2kgKyAxXSA9IHJlbWFpbmRlciArICcgJyArIChsaW5lc1tpICsgMV0gfHwgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzQ291bnQgPSBsaW5lcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBQcm9jZXNzaW5nIG9uIHRoaXMgbGluZVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgd29yZCB3aXRoIHNwYWNlIHRvIG91dHB1dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dCArPSB3b3JkV2l0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggLT0gd29yZFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgcHJvY2Vzc2VkIGxpbmUgdG8gb3V0cHV0XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBvdXQucmVwbGFjZSgvWyBcXG5dKiQvZ2ksICcnKSArICdcXG4nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVHJpbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmdcclxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvW1xcc3xcXG5dKiQvZ2ksICcnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHcmVlZHkgd3JhcHBpbmcgYWxnb3JpdGhtIHRoYXQgd2lsbCB3cmFwIHdvcmRzIGFzIHRoZSBsaW5lIGdyb3dzIGxvbmdlciB0aGFuIGl0cyBob3Jpem9udGFsXHJcbiAgICAgKiBib3VuZHMuIFNwYWNlcyBhcmUgbm90IGNvbGxhcHNlZCBhbmQgd2hpdGVzcGFjZSBpcyBub3QgdHJpbW1lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I2Jhc2ljV29yZFdyYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gcGVyZm9ybSB3b3JkIHdyYXAgZGV0ZWN0aW9uIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29yZFdyYXBXaWR0aCAtIFRoZSB3b3JkIHdyYXAgd2lkdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgd3JhcHBlZCB0ZXh0LlxyXG4gICAgICovXHJcbiAgICBiYXNpY1dvcmRXcmFwOiBmdW5jdGlvbiAodGV4dCwgY29udGV4dCwgd29yZFdyYXBXaWR0aClcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCh0aGlzLnNwbGl0UmVnRXhwKTtcclxuICAgICAgICB2YXIgbGFzdExpbmVJbmRleCA9IGxpbmVzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgdmFyIHdoaXRlU3BhY2VXaWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGFzdExpbmVJbmRleDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNwYWNlTGVmdCA9IHdvcmRXcmFwV2lkdGg7XHJcbiAgICAgICAgICAgIHZhciB3b3JkcyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgICAgIHZhciBsYXN0V29yZEluZGV4ID0gd29yZHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGxhc3RXb3JkSW5kZXg7IGorKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1tqXTtcclxuICAgICAgICAgICAgICAgIHZhciB3b3JkV2lkdGggPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHdvcmQpLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgdmFyIHdvcmRXaWR0aFdpdGhTcGFjZSA9IHdvcmRXaWR0aCArIHdoaXRlU3BhY2VXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAod29yZFdpZHRoV2l0aFNwYWNlID4gc3BhY2VMZWZ0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgcHJpbnRpbmcgdGhlIG5ld2xpbmUgaWYgaXQncyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZSB0aGF0IGlzIGdyZWF0ZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSB3b3JkIHdyYXAgd2lkdGguXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXG4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZUxlZnQgPSB3b3JkV3JhcFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gd29yZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaiA8IGxhc3RXb3JkSW5kZXgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgJztcclxuICAgICAgICAgICAgICAgICAgICBzcGFjZUxlZnQgLT0gd29yZFdpZHRoV2l0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlTGVmdCAtPSB3b3JkV2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpIDwgbGFzdExpbmVJbmRleClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXG4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJ1bnMgdGhlIGdpdmVuIHRleHQgdGhyb3VnaCB0aGlzIFRleHQgb2JqZWN0cyB3b3JkIHdyYXBwaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGFuXHJcbiAgICAgKiBhcnJheSwgd2hlcmUgZWFjaCBlbGVtZW50IG9mIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhIHdyYXBwZWQgbGluZSBvZiB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjZ2V0V3JhcHBlZFRleHRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgZm9yIHdoaWNoIHRoZSB3cmFwcGluZyB3aWxsIGJlIGNhbGN1bGF0ZWQuIElmIHVuc3BlY2lmaWVkLCB0aGUgVGV4dCBvYmplY3RzIGN1cnJlbnQgdGV4dCB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgcGllY2VzIG9mIHdyYXBwZWQgdGV4dC5cclxuICAgICAqL1xyXG4gICAgZ2V0V3JhcHBlZFRleHQ6IGZ1bmN0aW9uICh0ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHsgdGV4dCA9IHRoaXMuX3RleHQ7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zdHlsZS5zeW5jRm9udCh0aGlzLmNhbnZhcywgdGhpcy5jb250ZXh0KTtcclxuXHJcbiAgICAgICAgdmFyIHdyYXBwZWRMaW5lcyA9IHRoaXMucnVuV29yZFdyYXAodGV4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiB3cmFwcGVkTGluZXMuc3BsaXQodGhpcy5zcGxpdFJlZ0V4cCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB0ZXh0IHRvIGRpc3BsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aWxsIGJlIGpvaW5lZCB3aXRoIGBcXG5gIGxpbmUgYnJlYWtzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0VGV4dFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0gdmFsdWUgLSBUaGUgc3RyaW5nLCBvciBhcnJheSBvZiBzdHJpbmdzLCB0byBiZSBzZXQgYXMgdGhlIGNvbnRlbnQgb2YgdGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUZXh0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJ1xcbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl90ZXh0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGV4dCA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dCBzdHlsZS5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGV4dC5zZXRTdHlsZSh7XHJcbiAgICAgKiAgICAgZm9udFNpemU6ICc2NHB4JyxcclxuICAgICAqICAgICBmb250RmFtaWx5OiAnQXJpYWwnLFxyXG4gICAgICogICAgIGNvbG9yOiAnI2ZmZmZmZicsXHJcbiAgICAgKiAgICAgYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICogICAgIGJhY2tncm91bmRDb2xvcjogJyNmZjAwZmYnXHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGUgLSBUaGUgc3R5bGUgc2V0dGluZ3MgdG8gc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFN0eWxlOiBmdW5jdGlvbiAoc3R5bGUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0U3R5bGUoc3R5bGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZm9udC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIHN0cmluZyBpcyBnaXZlbiwgdGhlIGZvbnQgZmFtaWx5IGlzIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgZ2l2ZW4sIHRoZSBgZm9udEZhbWlseWAsIGBmb250U2l6ZWAgYW5kIGBmb250U3R5bGVgXHJcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIHRoYXQgb2JqZWN0IGFyZSBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogKipJbXBvcnRhbnQ6KiogVGhlIGZvbnQgbmFtZSBtdXN0IGJlIHF1b3RlZCBpZiBpdCBjb250YWlucyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBkaWdpdHMgb3JcclxuICAgICAqIHNwZWNpYWwgY2hhcmFjdGVyczpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBUZXh0LnNldEZvbnQoJ1wiUHJlc3MgU3RhcnQgMlBcIicpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogRXF1YWxseSwgaWYgeW91IHdpc2ggdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZmFsbGJhY2sgZm9udHMsIHRoZW4geW91IHNob3VsZCBlbnN1cmUgdGhleSBhcmUgYWxsXHJcbiAgICAgKiBxdW90ZWQgcHJvcGVybHksIHRvbzpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBUZXh0LnNldEZvbnQoJ0dlb3JnaWEsIFwiR291ZHkgQm9va2xldHRlciAxOTExXCIsIFRpbWVzLCBzZXJpZicpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNzZXRGb250XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZm9udCAtIFRoZSBmb250IGZhbWlseSBvciBmb250IHNldHRpbmdzIHRvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnQtZmFtaWx5I1ZhbGlkX2ZhbWlseV9uYW1lc1xyXG4gICAgICovXHJcbiAgICBzZXRGb250OiBmdW5jdGlvbiAoZm9udClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXRGb250KGZvbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZm9udCBmYW1pbHkuXHJcbiAgICAgKlxyXG4gICAgICogKipJbXBvcnRhbnQ6KiogVGhlIGZvbnQgbmFtZSBtdXN0IGJlIHF1b3RlZCBpZiBpdCBjb250YWlucyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBkaWdpdHMgb3JcclxuICAgICAqIHNwZWNpYWwgY2hhcmFjdGVyczpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBUZXh0LnNldEZvbnQoJ1wiUHJlc3MgU3RhcnQgMlBcIicpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIEVxdWFsbHksIGlmIHlvdSB3aXNoIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGZhbGxiYWNrIGZvbnRzLCB0aGVuIHlvdSBzaG91bGQgZW5zdXJlIHRoZXkgYXJlIGFsbFxyXG4gICAgICogcXVvdGVkIHByb3Blcmx5LCB0b286XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIFRleHQuc2V0Rm9udCgnR2VvcmdpYSwgXCJHb3VkeSBCb29rbGV0dGVyIDE5MTFcIiwgVGltZXMsIHNlcmlmJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldEZvbnRGYW1pbHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmYW1pbHkgLSBUaGUgZm9udCBmYW1pbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LWZhbWlseSNWYWxpZF9mYW1pbHlfbmFtZXNcclxuICAgICAqL1xyXG4gICAgc2V0Rm9udEZhbWlseTogZnVuY3Rpb24gKGZhbWlseSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXRGb250RmFtaWx5KGZhbWlseSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmb250IHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNzZXRGb250U2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgZm9udCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZvbnRTaXplOiBmdW5jdGlvbiAoc2l6ZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXRGb250U2l6ZShzaXplKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZvbnQgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNzZXRGb250U3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZSAtIFRoZSBmb250IHN0eWxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZvbnRTdHlsZTogZnVuY3Rpb24gKHN0eWxlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldEZvbnRTdHlsZShzdHlsZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgZml4ZWQgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHRleHQuXHJcbiAgICAgKlxyXG4gICAgICogUGFzcyBpbiBgMGAgZm9yIGVpdGhlciBvZiB0aGVzZSBwYXJhbWV0ZXJzIHRvIGRpc2FibGUgZml4ZWQgd2lkdGggb3IgaGVpZ2h0IHJlc3BlY3RpdmVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldEZpeGVkU2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIGZpeGVkIHdpZHRoIHRvIHNldC4gYDBgIGRpc2FibGVzIGZpeGVkIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBmaXhlZCBoZWlnaHQgdG8gc2V0LiBgMGAgZGlzYWJsZXMgZml4ZWQgaGVpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZpeGVkU2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0Rml4ZWRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldEJhY2tncm91bmRDb2xvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gVGhlIGJhY2tncm91bmQgY29sb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbiAoY29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZpbGwgc3R5bGUgdG8gYmUgdXNlZCBieSB0aGUgVGV4dCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBjYW4gYmUgYW55IHZhbGlkIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCBmaWxsU3R5bGUgdmFsdWUsIHN1Y2ggYXNcclxuICAgICAqIGEgY29sb3IgKGluIGhleCwgcmdiLCByZ2JhLCBoc2wgb3IgbmFtZWQgdmFsdWVzKSwgYSBncmFkaWVudCBvciBhIHBhdHRlcm4uXHJcbiAgICAgKlxyXG4gICAgICogU2VlIHRoZSBbTUROIGZpbGxTdHlsZSBkb2NzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEL2ZpbGxTdHlsZSkgZm9yIG1vcmUgZGV0YWlscy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldEZpbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xhbnkpfSBjb2xvciAtIFRoZSB0ZXh0IGZpbGwgc3R5bGUuIENhbiBiZSBhbnkgdmFsaWQgQ2FudmFzUmVuZGVyaW5nQ29udGV4dCBgZmlsbFN0eWxlYCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGaWxsOiBmdW5jdGlvbiAoZmlsbFN0eWxlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldEZpbGwoZmlsbFN0eWxlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRleHQgZmlsbCBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldENvbG9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBUaGUgdGV4dCBmaWxsIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENvbG9yOiBmdW5jdGlvbiAoY29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0Q29sb3IoY29sb3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc3Ryb2tlIHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0U3Ryb2tlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBUaGUgc3Ryb2tlIGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRoaWNrbmVzcyAtIFRoZSBzdHJva2UgdGhpY2tuZXNzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFN0cm9rZTogZnVuY3Rpb24gKGNvbG9yLCB0aGlja25lc3MpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0U3Ryb2tlKGNvbG9yLCB0aGlja25lc3MpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2hhZG93IHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0U2hhZG93XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBzaGFkb3cgb2Zmc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIHNoYWRvdyBvZmZzZXQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yPScjMDAwJ10gLSBUaGUgc2hhZG93IGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtibHVyPTBdIC0gVGhlIHNoYWRvdyBibHVyIHJhZGl1cy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NoYWRvd1N0cm9rZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHN0cm9rZSB0aGUgc2hhZG93LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hhZG93RmlsbD10cnVlXSAtIFdoZXRoZXIgdG8gZmlsbCB0aGUgc2hhZG93LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNoYWRvdzogZnVuY3Rpb24gKHgsIHksIGNvbG9yLCBibHVyLCBzaGFkb3dTdHJva2UsIHNoYWRvd0ZpbGwpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0U2hhZG93KHgsIHksIGNvbG9yLCBibHVyLCBzaGFkb3dTdHJva2UsIHNoYWRvd0ZpbGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2hhZG93IG9mZnNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFNoYWRvd09mZnNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBzaGFkb3cgb2Zmc2V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgc2hhZG93IG9mZnNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTaGFkb3dPZmZzZXQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldFNoYWRvd09mZnNldCh4LCB5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNoYWRvdyBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFNoYWRvd0NvbG9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBUaGUgc2hhZG93IGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNoYWRvd0NvbG9yOiBmdW5jdGlvbiAoY29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0U2hhZG93Q29sb3IoY29sb3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2hhZG93IGJsdXIgcmFkaXVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0U2hhZG93Qmx1clxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJsdXIgLSBUaGUgc2hhZG93IGJsdXIgcmFkaXVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNoYWRvd0JsdXI6IGZ1bmN0aW9uIChibHVyKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldFNoYWRvd0JsdXIoYmx1cik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlIG9yIGRpc2FibGUgc2hhZG93IHN0cm9rZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFNoYWRvd1N0cm9rZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBzaGFkb3cgc3Ryb2tlIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNoYWRvd1N0cm9rZTogZnVuY3Rpb24gKGVuYWJsZWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0U2hhZG93U3Ryb2tlKGVuYWJsZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIHNoYWRvdyBmaWxsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0U2hhZG93RmlsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBzaGFkb3cgZmlsbCBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTaGFkb3dGaWxsOiBmdW5jdGlvbiAoZW5hYmxlZClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXRTaGFkb3dGaWxsKGVuYWJsZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgd2lkdGggKGluIHBpeGVscykgdG8gdXNlIGZvciB3cmFwcGluZyBsaW5lcy4gUGFzcyBpbiBudWxsIHRvIHJlbW92ZSB3cmFwcGluZyBieSB3aWR0aC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFdvcmRXcmFwV2lkdGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7P251bWJlcn0gd2lkdGggLSBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgaW4gcGl4ZWxzLiBTZXQgdG8gbnVsbCB0byByZW1vdmUgd3JhcHBpbmcuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VBZHZhbmNlZFdyYXA9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBhZHZhbmNlZCB3cmFwcGluZ1xyXG4gICAgICogYWxnb3JpdGhtLiBJZiB0cnVlLCBzcGFjZXMgYXJlIGNvbGxhcHNlZCBhbmQgd2hpdGVzcGFjZSBpcyB0cmltbWVkIGZyb20gbGluZXMuIElmIGZhbHNlLFxyXG4gICAgICogc3BhY2VzIGFuZCB3aGl0ZXNwYWNlIGFyZSBsZWZ0IGFzIGlzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFdvcmRXcmFwV2lkdGg6IGZ1bmN0aW9uICh3aWR0aCwgdXNlQWR2YW5jZWRXcmFwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldFdvcmRXcmFwV2lkdGgod2lkdGgsIHVzZUFkdmFuY2VkV3JhcCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciB3cmFwcGluZyBsaW5lcy4gUGFzcyBpbiBudWxsIHRvIHJlbW92ZSB3cmFwcGluZyBieSBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFdvcmRXcmFwQ2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VGV4dFN0eWxlV29yZFdyYXBDYWxsYmFja30gY2FsbGJhY2sgLSBBIGN1c3RvbSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdyYXBwaW5nIHRoZVxyXG4gICAgICogdGV4dC4gSXQgd2lsbCByZWNlaXZlIHR3byBhcmd1bWVudHM6IHRleHQgKHRoZSBzdHJpbmcgdG8gd3JhcCksIHRleHRPYmplY3QgKHRoaXMgVGV4dFxyXG4gICAgICogaW5zdGFuY2UpLiBJdCBzaG91bGQgcmV0dXJuIHRoZSB3cmFwcGVkIGxpbmVzIGVpdGhlciBhcyBhbiBhcnJheSBvZiBsaW5lcyBvciBhcyBhIHN0cmluZyB3aXRoXHJcbiAgICAgKiBuZXdsaW5lIGNoYXJhY3RlcnMgaW4gcGxhY2UgdG8gaW5kaWNhdGUgd2hlcmUgYnJlYWtzIHNob3VsZCBoYXBwZW4uXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3Njb3BlPW51bGxdIC0gVGhlIHNjb3BlIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0V29yZFdyYXBDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBzY29wZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXRXb3JkV3JhcENhbGxiYWNrKGNhbGxiYWNrLCBzY29wZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHRleHQgaW4gdGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGFyZ3VtZW50IGNhbiBiZSBvbmUgb2Y6IGBsZWZ0YCwgYHJpZ2h0YCwgYGNlbnRlcmAgb3IgYGp1c3RpZnlgLlxyXG4gICAgICogXHJcbiAgICAgKiBBbGlnbm1lbnQgb25seSB3b3JrcyBpZiB0aGUgVGV4dCBvYmplY3QgaGFzIG1vcmUgdGhhbiBvbmUgbGluZSBvZiB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0QWxpZ25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpZ249J2xlZnQnXSAtIFRoZSB0ZXh0IGFsaWdubWVudCBmb3IgbXVsdGktbGluZSB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFsaWduOiBmdW5jdGlvbiAoYWxpZ24pXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0QWxpZ24oYWxpZ24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgcmVzb2x1dGlvbiB1c2VkIGJ5IHRoaXMgVGV4dCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQnkgZGVmYXVsdCBpdCB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcmVzb2x1dGlvbiBzZXQgaW4gdGhlIEdhbWUgQ29uZmlnLFxyXG4gICAgICogYnV0IHlvdSBjYW4gb3ZlcnJpZGUgaXQgdmlhIHRoaXMgbWV0aG9kLCBvciBieSBzcGVjaWZ5aW5nIGl0IGluIHRoZSBUZXh0IHN0eWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBhbGxvd3MgZm9yIG11Y2ggY2xlYXJlciB0ZXh0IG9uIEhpZ2ggRFBJIGRldmljZXMsIGF0IHRoZSBjb3N0IG9mIG1lbW9yeSBiZWNhdXNlIGl0IHVzZXMgbGFyZ2VyXHJcbiAgICAgKiBpbnRlcm5hbCBDYW52YXMgdGV4dHVyZXMgZm9yIHRoZSBUZXh0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGVyZWZvcmUsIHBsZWFzZSB1c2Ugd2l0aCBjYXV0aW9uLCBhcyB0aGUgbW9yZSBoaWdoIHJlcyBUZXh0IHlvdSBoYXZlLCB0aGUgbW9yZSBtZW1vcnkgaXQgdXNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFJlc29sdXRpb25cclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcmVzb2x1dGlvbiBmb3IgdGhpcyBUZXh0IG9iamVjdCB0byB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UmVzb2x1dGlvbjogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNldFJlc29sdXRpb24odmFsdWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxpbmUgc3BhY2luZyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIF9hZGRlZF8gdG8gdGhlIGhlaWdodCBvZiB0aGUgZm9udCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBvdmVyYWxsIGxpbmUgaGVpZ2h0LlxyXG4gICAgICogVGhpcyBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhpcyBUZXh0IG9iamVjdCBjb25zaXN0cyBvZiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjc2V0TGluZVNwYWNpbmdcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IHRvIGFkZCB0byB0aGUgZm9udCBoZWlnaHQgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBsaW5lIGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRMaW5lU3BhY2luZzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGluZVNwYWNpbmcgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVGV4dCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdGV4dCBwYWRkaW5nLlxyXG4gICAgICpcclxuICAgICAqICdsZWZ0JyBjYW4gYmUgYW4gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIElmIG9ubHkgJ2xlZnQnIGFuZCAndG9wJyBhcmUgZ2l2ZW4gdGhleSBhcmUgdHJlYXRlZCBhcyAneCcgYW5kICd5Jy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3NldFBhZGRpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuVGV4dC5UZXh0UGFkZGluZyl9IGxlZnQgLSBUaGUgbGVmdCBwYWRkaW5nIHZhbHVlLCBvciBhIHBhZGRpbmcgY29uZmlnIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUaGUgdG9wIHBhZGRpbmcgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBUaGUgcmlnaHQgcGFkZGluZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gLSBUaGUgYm90dG9tIHBhZGRpbmcgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UGFkZGluZzogZnVuY3Rpb24gKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSlcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGxlZnQ7XHJcblxyXG4gICAgICAgICAgICAvLyAgSWYgdGhleSBzcGVjaWZ5IHggYW5kL29yIHkgdGhpcyBhcHBsaWVzIHRvIGFsbFxyXG4gICAgICAgICAgICB2YXIgeCA9IEdldFZhbHVlKGNvbmZpZywgJ3gnLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0ID0geDtcclxuICAgICAgICAgICAgICAgIHJpZ2h0ID0geDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxlZnQgPSBHZXRWYWx1ZShjb25maWcsICdsZWZ0JywgMCk7XHJcbiAgICAgICAgICAgICAgICByaWdodCA9IEdldFZhbHVlKGNvbmZpZywgJ3JpZ2h0JywgbGVmdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB5ID0gR2V0VmFsdWUoY29uZmlnLCAneScsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHkgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRvcCA9IHk7XHJcbiAgICAgICAgICAgICAgICBib3R0b20gPSB5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdG9wID0gR2V0VmFsdWUoY29uZmlnLCAndG9wJywgMCk7XHJcbiAgICAgICAgICAgICAgICBib3R0b20gPSBHZXRWYWx1ZShjb25maWcsICdib3R0b20nLCB0b3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChsZWZ0ID09PSB1bmRlZmluZWQpIHsgbGVmdCA9IDA7IH1cclxuICAgICAgICAgICAgaWYgKHRvcCA9PT0gdW5kZWZpbmVkKSB7IHRvcCA9IGxlZnQ7IH1cclxuICAgICAgICAgICAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHsgcmlnaHQgPSBsZWZ0OyB9XHJcbiAgICAgICAgICAgIGlmIChib3R0b20gPT09IHVuZGVmaW5lZCkgeyBib3R0b20gPSB0b3A7IH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFkZGluZy5sZWZ0ID0gbGVmdDtcclxuICAgICAgICB0aGlzLnBhZGRpbmcudG9wID0gdG9wO1xyXG4gICAgICAgIHRoaXMucGFkZGluZy5yaWdodCA9IHJpZ2h0O1xyXG4gICAgICAgIHRoaXMucGFkZGluZy5ib3R0b20gPSBib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVRleHQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIGRyYXcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNzZXRNYXhMaW5lc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbWF4PTBdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIGRyYXcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0TWF4TGluZXM6IGZ1bmN0aW9uIChtYXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2V0TWF4TGluZXMobWF4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGRpc3BsYXllZCB0ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjdXBkYXRlVGV4dFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGV4dDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XHJcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5zdHlsZTtcclxuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHN0eWxlLnJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIHNpemUgPSBzdHlsZS5tZXRyaWNzO1xyXG5cclxuICAgICAgICBzdHlsZS5zeW5jRm9udChjYW52YXMsIGNvbnRleHQpO1xyXG5cclxuICAgICAgICB2YXIgb3V0cHV0VGV4dCA9IHRoaXMuX3RleHQ7XHJcblxyXG4gICAgICAgIGlmIChzdHlsZS53b3JkV3JhcFdpZHRoIHx8IHN0eWxlLndvcmRXcmFwQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gdGhpcy5ydW5Xb3JkV3JhcCh0aGlzLl90ZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBTcGxpdCB0ZXh0IGludG8gbGluZXNcclxuICAgICAgICB2YXIgbGluZXMgPSBvdXRwdXRUZXh0LnNwbGl0KHRoaXMuc3BsaXRSZWdFeHApO1xyXG5cclxuICAgICAgICB2YXIgdGV4dFNpemUgPSBHZXRUZXh0U2l6ZSh0aGlzLCBzaXplLCBsaW5lcyk7XHJcblxyXG4gICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5wYWRkaW5nO1xyXG5cclxuICAgICAgICB2YXIgdGV4dFdpZHRoO1xyXG5cclxuICAgICAgICBpZiAoc3R5bGUuZml4ZWRXaWR0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0ZXh0U2l6ZS53aWR0aCArIHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS53aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHN0eWxlLmZpeGVkV2lkdGg7XHJcblxyXG4gICAgICAgICAgICB0ZXh0V2lkdGggPSB0aGlzLndpZHRoIC0gcGFkZGluZy5sZWZ0IC0gcGFkZGluZy5yaWdodDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZXh0V2lkdGggPCB0ZXh0U2l6ZS53aWR0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dFdpZHRoID0gdGV4dFNpemUud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdHlsZS5maXhlZEhlaWdodCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGV4dFNpemUuaGVpZ2h0ICsgcGFkZGluZy50b3AgKyBwYWRkaW5nLmJvdHRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBzdHlsZS5maXhlZEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB3ID0gdGhpcy53aWR0aDtcclxuICAgICAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuXHJcbiAgICAgICAgdyAqPSByZXNvbHV0aW9uO1xyXG4gICAgICAgIGggKj0gcmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgdyA9IE1hdGgubWF4KHcsIDEpO1xyXG4gICAgICAgIGggPSBNYXRoLm1heChoLCAxKTtcclxuXHJcbiAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gdyB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdztcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZyYW1lLnNldFNpemUodywgaCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgQmVjYXVzZSByZXNpemluZyB0aGUgY2FudmFzIHJlc2V0cyB0aGUgY29udGV4dFxyXG4gICAgICAgICAgICBzdHlsZS5zeW5jRm9udChjYW52YXMsIGNvbnRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xyXG5cclxuICAgICAgICBjb250ZXh0LnNjYWxlKHJlc29sdXRpb24sIHJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICBpZiAoc3R5bGUuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHlsZS5zeW5jU3R5bGUoY2FudmFzLCBjb250ZXh0KTtcclxuXHJcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XHJcblxyXG4gICAgICAgIC8vICBBcHBseSBwYWRkaW5nXHJcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUocGFkZGluZy5sZWZ0LCBwYWRkaW5nLnRvcCk7XHJcblxyXG4gICAgICAgIHZhciBsaW5lUG9zaXRpb25YO1xyXG4gICAgICAgIHZhciBsaW5lUG9zaXRpb25ZO1xyXG5cclxuICAgICAgICAvLyAgRHJhdyB0ZXh0IGxpbmUgYnkgbGluZVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dFNpemUubGluZXM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpbmVQb3NpdGlvblggPSBzdHlsZS5zdHJva2VUaGlja25lc3MgLyAyO1xyXG4gICAgICAgICAgICBsaW5lUG9zaXRpb25ZID0gKHN0eWxlLnN0cm9rZVRoaWNrbmVzcyAvIDIgKyBpICogdGV4dFNpemUubGluZUhlaWdodCkgKyBzaXplLmFzY2VudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uWSArPSAodGV4dFNpemUubGluZVNwYWNpbmcgKiBpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlLnJ0bClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uWCA9IHcgLSBsaW5lUG9zaXRpb25YO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlLmFsaWduID09PSAncmlnaHQnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb25YICs9IHRleHRXaWR0aCAtIHRleHRTaXplLmxpbmVXaWR0aHNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGUuYWxpZ24gPT09ICdjZW50ZXInKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb25YICs9ICh0ZXh0V2lkdGggLSB0ZXh0U2l6ZS5saW5lV2lkdGhzW2ldKSAvIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGUuYWxpZ24gPT09ICdqdXN0aWZ5JylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRvIGp1c3RpZnkgdGV4dCBsaW5lIGl0cyB3aWR0aCBtdXN0IGJlIG5vIGxlc3MgdGhhbiA4NSUgb2YgZGVmaW5lZCB3aWR0aFxyXG4gICAgICAgICAgICAgICAgdmFyIG1pbmltdW1MZW5ndGhUb0FwcGx5SnVzdGlmaWNhdGlvbiA9IDAuODU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTaXplLmxpbmVXaWR0aHNbaV0gLyB0ZXh0U2l6ZS53aWR0aCA+PSBtaW5pbXVtTGVuZ3RoVG9BcHBseUp1c3RpZmljYXRpb24pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dHJhU3BhY2UgPSB0ZXh0U2l6ZS53aWR0aCAtIHRleHRTaXplLmxpbmVXaWR0aHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYWNlU2l6ZSA9IGNvbnRleHQubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdHJpbW1lZExpbmUgPSBsaW5lc1tpXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gdHJpbW1lZExpbmUuc3BsaXQoJyAnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFTcGFjZSArPSAobGluZXNbaV0ubGVuZ3RoIC0gdHJpbW1lZExpbmUubGVuZ3RoKSAqIHNwYWNlU2l6ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dHJhU3BhY2VDaGFyYWN0ZXJzID0gTWF0aC5mbG9vcihleHRyYVNwYWNlIC8gc3BhY2VTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4dHJhU3BhY2VDaGFyYWN0ZXJzID4gMClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5W2lkeF0gKz0gJyAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaWR4ICsgMSkgJSAoYXJyYXkubGVuZ3RoIC0gMSB8fCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLS1leHRyYVNwYWNlQ2hhcmFjdGVycztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gYXJyYXkuam9pbignICcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUm91bmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxpbmVQb3NpdGlvblggPSBNYXRoLnJvdW5kKGxpbmVQb3NpdGlvblgpO1xyXG4gICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uWSA9IE1hdGgucm91bmQobGluZVBvc2l0aW9uWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5zdHJva2VUaGlja25lc3MpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuc3luY1NoYWRvdyhjb250ZXh0LCBzdHlsZS5zaGFkb3dTdHJva2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tpXSwgbGluZVBvc2l0aW9uWCwgbGluZVBvc2l0aW9uWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5jb2xvcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5zeW5jU2hhZG93KGNvbnRleHQsIHN0eWxlLnNoYWRvd0ZpbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQobGluZXNbaV0sIGxpbmVQb3NpdGlvblgsIGxpbmVQb3NpdGlvblkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIgJiYgdGhpcy5yZW5kZXJlci5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuc291cmNlLmdsVGV4dHVyZSA9IHRoaXMucmVuZGVyZXIuY2FudmFzVG9UZXh0dXJlKGNhbnZhcywgdGhpcy5mcmFtZS5zb3VyY2UuZ2xUZXh0dXJlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWUuZ2xUZXh0dXJlID0gdGhpcy5mcmFtZS5zb3VyY2UuZ2xUZXh0dXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XHJcblxyXG4gICAgICAgIGlmIChpbnB1dCAmJiAhaW5wdXQuY3VzdG9tSGl0QXJlYSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlucHV0LmhpdEFyZWEud2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgICAgICBpbnB1dC5oaXRBcmVhLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHRleHQgbWV0cmljcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I2dldFRleHRNZXRyaWNzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSB0ZXh0IG1ldHJpY3MuXHJcbiAgICAgKi9cclxuICAgIGdldFRleHRNZXRyaWNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFRleHRNZXRyaWNzKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgc3RyaW5nIGJlaW5nIHJlbmRlcmVkIGJ5IHRoaXMgVGV4dCBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCN0ZXh0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRleHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRleHQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBUZXh0IG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3RvSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkpTT05HYW1lT2JqZWN0fSBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIFRleHQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dCA9IENvbXBvbmVudHMuVG9KU09OKHRoaXMpO1xyXG5cclxuICAgICAgICAvLyAgRXh0cmEgVGV4dCBkYXRhIGlzIGFkZGVkIGhlcmVcclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGF1dG9Sb3VuZDogdGhpcy5hdXRvUm91bmQsXHJcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuX3RleHQsXHJcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLnN0eWxlLnRvSlNPTigpLFxyXG4gICAgICAgICAgICBwYWRkaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLnBhZGRpbmcubGVmdCxcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnBhZGRpbmcucmlnaHQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMucGFkZGluZy50b3AsXHJcbiAgICAgICAgICAgICAgICBib3R0b206IHRoaXMucGFkZGluZy5ib3R0b21cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG91dC5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBkZXN0cm95IGhhbmRsZXIsIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXN0cm95IHByb2Nlc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGV4dCNwcmVEZXN0cm95XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcHJlRGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZS5ydGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBSZW1vdmVGcm9tRE9NKHRoaXMuY2FudmFzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIENhbnZhc1Bvb2wucmVtb3ZlKHRoaXMuY2FudmFzKTtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBob3Jpem9udGFsIG9yaWdpbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhlIG9yaWdpbiBtYXBzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC41LCBtZWFuaW5nIGFsbCBHYW1lIE9iamVjdHMgYXJlIHBvc2l0aW9uZWQgYmFzZWQgb24gdGhlaXIgY2VudGVyLlxyXG4gICAgICogU2V0dGluZyB0aGUgdmFsdWUgdG8gMCBtZWFucyB0aGUgcG9zaXRpb24gbm93IHJlbGF0ZXMgdG8gdGhlIGxlZnQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I29yaWdpblhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZlcnRpY2FsIG9yaWdpbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhlIG9yaWdpbiBtYXBzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC41LCBtZWFuaW5nIGFsbCBHYW1lIE9iamVjdHMgYXJlIHBvc2l0aW9uZWQgYmFzZWQgb24gdGhlaXIgY2VudGVyLlxyXG4gICAgICogU2V0dGluZyB0aGUgdmFsdWUgdG8gMCBtZWFucyB0aGUgcG9zaXRpb24gbm93IHJlbGF0ZXMgdG8gdGhlIHRvcCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjb3JpZ2luWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGV4dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRleHQjcmVuZGVyQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFRleHRDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIGlmICgoc3JjLndpZHRoID09PSAwKSB8fCAoc3JjLmhlaWdodCA9PT0gMCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcmVyLmJhdGNoU3ByaXRlKHNyYywgc3JjLmZyYW1lLCBjYW1lcmEsIHBhcmVudE1hdHJpeCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRleHRDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnVpbGRHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vQnVpbGRHYW1lT2JqZWN0Jyk7XHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uLy4uL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIFRleHQgPSByZXF1aXJlKCcuL1RleHQnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFRleHQgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFRleHQgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI3RleHRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byBjcmVhdGUgaXRzZWxmLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1NjZW5lXSAtIEFkZCB0aGlzIEdhbWUgT2JqZWN0IHRvIHRoZSBTY2VuZSBhZnRlciBjcmVhdGluZyBpdD8gSWYgc2V0IHRoaXMgYXJndW1lbnQgb3ZlcnJpZGVzIHRoZSBgYWRkYCBwcm9wZXJ0eSBpbiB0aGUgY29uZmlnIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlRleHR9IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ3RleHQnLCBmdW5jdGlvbiAoY29uZmlnLCBhZGRUb1NjZW5lKVxyXG57XHJcbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICAvLyBzdHlsZSBPYmplY3QgPSB7XHJcbiAgICAvLyAgICAgZm9udDogWyAnZm9udCcsICcxNnB4IENvdXJpZXInIF0sXHJcbiAgICAvLyAgICAgYmFja2dyb3VuZENvbG9yOiBbICdiYWNrZ3JvdW5kQ29sb3InLCBudWxsIF0sXHJcbiAgICAvLyAgICAgZmlsbDogWyAnZmlsbCcsICcjZmZmJyBdLFxyXG4gICAgLy8gICAgIHN0cm9rZTogWyAnc3Ryb2tlJywgJyNmZmYnIF0sXHJcbiAgICAvLyAgICAgc3Ryb2tlVGhpY2tuZXNzOiBbICdzdHJva2VUaGlja25lc3MnLCAwIF0sXHJcbiAgICAvLyAgICAgc2hhZG93T2Zmc2V0WDogWyAnc2hhZG93Lm9mZnNldFgnLCAwIF0sXHJcbiAgICAvLyAgICAgc2hhZG93T2Zmc2V0WTogWyAnc2hhZG93Lm9mZnNldFknLCAwIF0sXHJcbiAgICAvLyAgICAgc2hhZG93Q29sb3I6IFsgJ3NoYWRvdy5jb2xvcicsICcjMDAwJyBdLFxyXG4gICAgLy8gICAgIHNoYWRvd0JsdXI6IFsgJ3NoYWRvdy5ibHVyJywgMCBdLFxyXG4gICAgLy8gICAgIHNoYWRvd1N0cm9rZTogWyAnc2hhZG93LnN0cm9rZScsIGZhbHNlIF0sXHJcbiAgICAvLyAgICAgc2hhZG93RmlsbDogWyAnc2hhZG93LmZpbGwnLCBmYWxzZSBdLFxyXG4gICAgLy8gICAgIGFsaWduOiBbICdhbGlnbicsICdsZWZ0JyBdLFxyXG4gICAgLy8gICAgIG1heExpbmVzOiBbICdtYXhMaW5lcycsIDAgXSxcclxuICAgIC8vICAgICBmaXhlZFdpZHRoOiBbICdmaXhlZFdpZHRoJywgZmFsc2UgXSxcclxuICAgIC8vICAgICBmaXhlZEhlaWdodDogWyAnZml4ZWRIZWlnaHQnLCBmYWxzZSBdLFxyXG4gICAgLy8gICAgIHJ0bDogWyAncnRsJywgZmFsc2UgXVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHZhciBjb250ZW50ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd0ZXh0JywgJycpO1xyXG4gICAgdmFyIHN0eWxlID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdzdHlsZScsIG51bGwpO1xyXG5cclxuICAgIC8vICBQYWRkaW5nXHJcbiAgICAvLyAgICAgIHsgcGFkZGluZzogMiB9XHJcbiAgICAvLyAgICAgIHsgcGFkZGluZzogeyB4OiAsIHk6IH19XHJcbiAgICAvLyAgICAgIHsgcGFkZGluZzogeyBsZWZ0OiAsIHRvcDogfX1cclxuICAgIC8vICAgICAgeyBwYWRkaW5nOiB7IGxlZnQ6ICwgcmlnaHQ6ICwgdG9wOiAsIGJvdHRvbTogfX1cclxuXHJcbiAgICB2YXIgcGFkZGluZyA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAncGFkZGluZycsIG51bGwpO1xyXG5cclxuICAgIGlmIChwYWRkaW5nICE9PSBudWxsKVxyXG4gICAge1xyXG4gICAgICAgIHN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB0ZXh0ID0gbmV3IFRleHQodGhpcy5zY2VuZSwgMCwgMCwgY29udGVudCwgc3R5bGUpO1xyXG5cclxuICAgIGlmIChhZGRUb1NjZW5lICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgY29uZmlnLmFkZCA9IGFkZFRvU2NlbmU7XHJcbiAgICB9XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0KHRoaXMuc2NlbmUsIHRleHQsIGNvbmZpZyk7XHJcblxyXG4gICAgLy8gIFRleHQgc3BlY2lmaWMgY29uZmlnIG9wdGlvbnM6XHJcblxyXG4gICAgdGV4dC5hdXRvUm91bmQgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2F1dG9Sb3VuZCcsIHRydWUpO1xyXG4gICAgdGV4dC5yZXNvbHV0aW9uID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdyZXNvbHV0aW9uJywgMSk7XHJcblxyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RDcmVhdG9yIGNvbnRleHQuXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRleHQgPSByZXF1aXJlKCcuL1RleHQnKTtcclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFRleHQgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKiBcclxuICogQSBUZXh0IEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogVGV4dCBvYmplY3RzIHdvcmsgYnkgY3JlYXRpbmcgdGhlaXIgb3duIGludGVybmFsIGhpZGRlbiBDYW52YXMgYW5kIHRoZW4gcmVuZGVycyB0ZXh0IHRvIGl0IHVzaW5nXHJcbiAqIHRoZSBzdGFuZGFyZCBDYW52YXMgYGZpbGxUZXh0YCBBUEkuIEl0IHRoZW4gY3JlYXRlcyBhIHRleHR1cmUgZnJvbSB0aGlzIGNhbnZhcyB3aGljaCBpcyByZW5kZXJlZFxyXG4gKiB0byB5b3VyIGdhbWUgZHVyaW5nIHRoZSByZW5kZXIgcGFzcy5cclxuICogXHJcbiAqIEJlY2F1c2UgaXQgdXNlcyB0aGUgQ2FudmFzIEFQSSB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIGFsbCB0aGUgZmVhdHVyZXMgdGhpcyBvZmZlcnMsIHN1Y2ggYXNcclxuICogYXBwbHlpbmcgZ3JhZGllbnQgZmlsbHMgdG8gdGhlIHRleHQsIG9yIHN0cm9rZXMsIHNoYWRvd3MgYW5kIG1vcmUuIFlvdSBjYW4gYWxzbyB1c2UgY3VzdG9tIGZvbnRzXHJcbiAqIGxvYWRlZCBleHRlcm5hbGx5LCBzdWNoIGFzIEdvb2dsZSBvciBUeXBlS2l0IFdlYiBmb250cy5cclxuICpcclxuICogWW91IGNhbiBvbmx5IGRpc3BsYXkgZm9udHMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBhbmQgYXZhaWxhYmxlIHRvIHRoZSBicm93c2VyOiB0aGVyZWZvcmUgZm9udHMgbXVzdFxyXG4gKiBiZSBwcmUtbG9hZGVkLiBQaGFzZXIgZG9lcyBub3QgZG8gdGhzIGZvciB5b3UsIHNvIHlvdSB3aWxsIHJlcXVpcmUgdGhlIHVzZSBvZiBhIDNyZCBwYXJ0eSBmb250IGxvYWRlcixcclxuICogb3IgaGF2ZSB0aGUgZm9udHMgcmVhZHkgYXZhaWxhYmxlIGluIHRoZSBDU1Mgb24gdGhlIHBhZ2UgaW4gd2hpY2ggeW91ciBQaGFzZXIgZ2FtZSByZXNpZGVzLlxyXG4gKlxyXG4gKiBTZWUge0BsaW5rIGh0dHA6Ly93d3cuam9yZGFubS5jby51ay90aW55dHlwZSB0aGlzIGNvbXBhdGliaWxpdHkgdGFibGV9IGZvciB0aGUgYXZhaWxhYmxlIGRlZmF1bHQgZm9udHNcclxuICogYWNyb3NzIG1vYmlsZSBicm93c2Vycy5cclxuICogXHJcbiAqIEEgbm90ZSBvbiBwZXJmb3JtYW5jZTogRXZlcnkgdGltZSB0aGUgY29udGVudHMgb2YgYSBUZXh0IG9iamVjdCBjaGFuZ2VzLCBpLmUuIGNoYW5naW5nIHRoZSB0ZXh0IGJlaW5nXHJcbiAqIGRpc3BsYXllZCwgb3IgdGhlIHN0eWxlIG9mIHRoZSB0ZXh0LCBpdCBuZWVkcyB0byByZW1ha2UgdGhlIFRleHQgY2FudmFzLCBhbmQgaWYgb24gV2ViR0wsIHJlLXVwbG9hZCB0aGVcclxuICogbmV3IHRleHR1cmUgdG8gdGhlIEdQVS4gVGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBpZiB1c2VkIG9mdGVuLCBvciB3aXRoIGxhcmdlIHF1YW50aXRpZXMgb2ZcclxuICogVGV4dCBvYmplY3RzIGluIHlvdXIgZ2FtZS4gSWYgeW91IHJ1biBpbnRvIHBlcmZvcm1hbmNlIGlzc3VlcyB5b3Ugd291bGQgYmUgYmV0dGVyIG9mZiB1c2luZyBCaXRtYXAgVGV4dFxyXG4gKiBpbnN0ZWFkLCBhcyBpdCBiZW5lZml0cyBmcm9tIGJhdGNoaW5nIGFuZCBhdm9pZHMgZXhwZW5zaXZlIENhbnZhcyBBUEkgY2FsbHMuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFRleHQgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3RleHRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSB0ZXh0IC0gVGhlIHRleHQgdGhpcyBUZXh0IG9iamVjdCB3aWxsIGRpc3BsYXkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbc3R5bGVdIC0gVGhlIFRleHQgc3R5bGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UZXh0fSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCd0ZXh0JywgZnVuY3Rpb24gKHgsIHksIHRleHQsIHN0eWxlKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IFRleHQodGhpcy5zY2VuZSwgeCwgeSwgdGV4dCwgc3R5bGUpKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxudmFyIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbmlmICh0eXBlb2YgV0VCR0xfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi9UZXh0V2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9UZXh0Q2FudmFzUmVuZGVyZXInKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgcmVuZGVyV2ViR0w6IHJlbmRlcldlYkdMLFxyXG4gICAgcmVuZGVyQ2FudmFzOiByZW5kZXJDYW52YXNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi4vLi4vLi4vcmVuZGVyZXIvd2ViZ2wvVXRpbHMnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UZXh0I3JlbmRlcldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBXZWJHTCByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVGV4dH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFRleHRXZWJHTFJlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgaWYgKChzcmMud2lkdGggPT09IDApIHx8IChzcmMuaGVpZ2h0ID09PSAwKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGZyYW1lID0gc3JjLmZyYW1lO1xyXG4gICAgdmFyIHdpZHRoID0gZnJhbWUud2lkdGg7XHJcbiAgICB2YXIgaGVpZ2h0ID0gZnJhbWUuaGVpZ2h0O1xyXG4gICAgdmFyIGdldFRpbnQgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYTtcclxuXHJcbiAgICB0aGlzLnBpcGVsaW5lLmJhdGNoVGV4dHVyZShcclxuICAgICAgICBzcmMsXHJcbiAgICAgICAgZnJhbWUuZ2xUZXh0dXJlLFxyXG4gICAgICAgIHdpZHRoLCBoZWlnaHQsXHJcbiAgICAgICAgc3JjLngsIHNyYy55LFxyXG4gICAgICAgIHdpZHRoIC8gc3JjLnN0eWxlLnJlc29sdXRpb24sIGhlaWdodCAvIHNyYy5zdHlsZS5yZXNvbHV0aW9uLFxyXG4gICAgICAgIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVksXHJcbiAgICAgICAgc3JjLnJvdGF0aW9uLFxyXG4gICAgICAgIHNyYy5mbGlwWCwgc3JjLmZsaXBZLFxyXG4gICAgICAgIHNyYy5zY3JvbGxGYWN0b3JYLCBzcmMuc2Nyb2xsRmFjdG9yWSxcclxuICAgICAgICBzcmMuZGlzcGxheU9yaWdpblgsIHNyYy5kaXNwbGF5T3JpZ2luWSxcclxuICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LFxyXG4gICAgICAgIGdldFRpbnQoc3JjLl90aW50VEwsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUTCksXHJcbiAgICAgICAgZ2V0VGludChzcmMuX3RpbnRUUiwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYVRSKSxcclxuICAgICAgICBnZXRUaW50KHNyYy5fdGludEJMLCBjYW1lcmEuYWxwaGEgKiBzcmMuX2FscGhhQkwpLFxyXG4gICAgICAgIGdldFRpbnQoc3JjLl90aW50QlIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFCUiksXHJcbiAgICAgICAgKHNyYy5faXNUaW50ZWQgJiYgc3JjLnRpbnRGaWxsKSxcclxuICAgICAgICAwLCAwLFxyXG4gICAgICAgIGNhbWVyYSxcclxuICAgICAgICBwYXJlbnRNYXRyaXhcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRleHRXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDYW52YXNQb29sID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jYW52YXMvQ2FudmFzUG9vbCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3QnKTtcclxudmFyIEdldFBvd2VyT2ZUd28gPSByZXF1aXJlKCcuLi8uLi9tYXRoL3BvdzIvR2V0UG93ZXJPZlR3bycpO1xyXG52YXIgU21vb3RoaW5nID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jYW52YXMvU21vb3RoaW5nJyk7XHJcbnZhciBUaWxlU3ByaXRlUmVuZGVyID0gcmVxdWlyZSgnLi9UaWxlU3ByaXRlUmVuZGVyJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vLyAgYml0bWFzayBmbGFnIGZvciBHYW1lT2JqZWN0LnJlbmRlck1hc2tcclxudmFyIF9GTEFHID0gODsgLy8gMTAwMFxyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUaWxlU3ByaXRlIGlzIGEgU3ByaXRlIHRoYXQgaGFzIGEgcmVwZWF0aW5nIHRleHR1cmUuXHJcbiAqXHJcbiAqIFRoZSB0ZXh0dXJlIGNhbiBiZSBzY3JvbGxlZCBhbmQgc2NhbGVkIGluZGVwZW5kZW50bHkgb2YgdGhlIFRpbGVTcHJpdGUgaXRzZWxmLiBUZXh0dXJlcyB3aWxsIGF1dG9tYXRpY2FsbHkgd3JhcCBhbmRcclxuICogYXJlIGRlc2lnbmVkIHNvIHRoYXQgeW91IGNhbiBjcmVhdGUgZ2FtZSBiYWNrZHJvcHMgdXNpbmcgc2VhbWxlc3MgdGV4dHVyZXMgYXMgYSBzb3VyY2UuXHJcbiAqXHJcbiAqIFlvdSBzaG91bGRuJ3QgZXZlciBjcmVhdGUgYSBUaWxlU3ByaXRlIGFueSBsYXJnZXIgdGhhbiB5b3VyIGFjdHVhbCBjYW52YXMgc2l6ZS4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbGFyZ2UgcmVwZWF0aW5nIGJhY2tncm91bmRcclxuICogdGhhdCBzY3JvbGxzIGFjcm9zcyB0aGUgd2hvbGUgbWFwIG9mIHlvdXIgZ2FtZSwgdGhlbiB5b3UgY3JlYXRlIGEgVGlsZVNwcml0ZSB0aGF0IGZpdHMgdGhlIGNhbnZhcyBzaXplIGFuZCB0aGVuIHVzZSB0aGUgYHRpbGVQb3NpdGlvbmBcclxuICogcHJvcGVydHkgdG8gc2Nyb2xsIHRoZSB0ZXh0dXJlIGFzIHRoZSBwbGF5ZXIgbW92ZXMuIElmIHlvdSBjcmVhdGUgYSBUaWxlU3ByaXRlIHRoYXQgaXMgdGhvdXNhbmRzIG9mIHBpeGVscyBpbiBzaXplIHRoZW4gaXQgd2lsbCBcclxuICogY29uc3VtZSBodWdlIGFtb3VudHMgb2YgbWVtb3J5IGFuZCBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuIFJlbWVtYmVyOiB1c2UgYHRpbGVQb3NpdGlvbmAgdG8gc2Nyb2xsIHlvdXIgdGV4dHVyZSBhbmQgYHRpbGVTY2FsZWAgdG9cclxuICogYWRqdXN0IHRoZSBzY2FsZSBvZiB0aGUgdGV4dHVyZSAtIGRvbid0IHJlc2l6ZSB0aGUgc3ByaXRlIGl0c2VsZiBvciBtYWtlIGl0IGxhcmdlciB0aGFuIGl0IG5lZWRzLlxyXG4gKiBcclxuICogQW4gaW1wb3J0YW50IG5vdGUgYWJvdXQgVGlsZSBTcHJpdGVzIGFuZCBOUE9UIHRleHR1cmVzOiBJbnRlcm5hbGx5LCBUaWxlU3ByaXRlIHRleHR1cmVzIHVzZSBHTF9SRVBFQVQgdG8gcHJvdmlkZVxyXG4gKiBzZWFtbGVzcyByZXBlYXRpbmcgb2YgdGhlIHRleHR1cmVzLiBUaGlzLCBjb21iaW5lZCB3aXRoIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHRleHR1cmVzIGFyZSBoYW5kbGVkIGluIFdlYkdMLCBtZWFuc1xyXG4gKiB0aGV5IG5lZWQgdG8gYmUgUE9UIChwb3dlci1vZi10d28pIHNpemVzIGluIG9yZGVyIHRvIHdyYXAuIElmIHlvdSBwcm92aWRlIGEgTlBPVCAobm9uIHBvd2VyLW9mLXR3bykgdGV4dHVyZSB0byBhXHJcbiAqIFRpbGVTcHJpdGUgaXQgd2lsbCBnZW5lcmF0ZSBhIFBPVCBzaXplZCBjYW52YXMgYW5kIGRyYXcgeW91ciB0ZXh0dXJlIHRvIGl0LCBzY2FsZWQgdXAgdG8gdGhlIFBPVCBzaXplLiBJdCdzIHRoZW5cclxuICogc2NhbGVkIGJhY2sgZG93biBhZ2FpbiBkdXJpbmcgcmVuZGVyaW5nIHRvIHRoZSBvcmlnaW5hbCBkaW1lbnNpb25zLiBXaGlsZSB0aGlzIHdvcmtzLCBpbiB0aGF0IGl0IGFsbG93cyB5b3UgdG8gdXNlXHJcbiAqIGFueSBzaXplIHRleHR1cmUgZm9yIGEgVGlsZSBTcHJpdGUsIGl0IGRvZXMgbWVhbiB0aGF0IE5QT1QgdGV4dHVyZXMgYXJlIGdvaW5nIHRvIGFwcGVhciBhbnRpLWFsaWFzZWQgd2hlbiByZW5kZXJlZCxcclxuICogZHVlIHRvIHRoZSBpbnRlcnBvbGF0aW9uIHRoYXQgdG9vayBwbGFjZSB3aGVuIGl0IHdhcyByZXNpemVkIGludG8gYSBQT1QgdGV4dHVyZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHZpc2libGUgaW5cclxuICogcGl4ZWwgYXJ0IGdyYXBoaWNzLiBJZiB5b3Ugbm90aWNlIGl0IGFuZCBpdCBiZWNvbWVzIGFuIGlzc3VlLCB0aGUgb25seSB3YXkgdG8gYXZvaWQgaXQgaXMgdG8gZW5zdXJlIHRoYXQgeW91XHJcbiAqIHByb3ZpZGUgUE9UIHRleHR1cmVzIGZvciBUaWxlIFNwcml0ZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBUaWxlU3ByaXRlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2FtZU9iamVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQ29tcHV0ZWRTaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkNyb3BcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuTWFza1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnRcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIEdhbWUgT2JqZWN0LiBJZiB6ZXJvIGl0IHdpbGwgdXNlIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGZyYW1lLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LiBJZiB6ZXJvIGl0IHdpbGwgdXNlIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGZyYW1lLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZUtleSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lS2V5XSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICovXHJcbnZhciBUaWxlU3ByaXRlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5CbGVuZE1vZGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Db21wdXRlZFNpemUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Dcm9wLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuR2V0Qm91bmRzLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzayxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlBpcGVsaW5lLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGludCxcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgVGlsZVNwcml0ZVJlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRpbGVTcHJpdGUgKHNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0dXJlS2V5LCBmcmFtZUtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSBzY2VuZS5zeXMuZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnVGlsZVNwcml0ZScpO1xyXG5cclxuICAgICAgICB2YXIgZGlzcGxheVRleHR1cmUgPSBzY2VuZS5zeXMudGV4dHVyZXMuZ2V0KHRleHR1cmVLZXkpO1xyXG4gICAgICAgIHZhciBkaXNwbGF5RnJhbWUgPSBkaXNwbGF5VGV4dHVyZS5nZXQoZnJhbWVLZXkpO1xyXG5cclxuICAgICAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3aWR0aCA9IGRpc3BsYXlGcmFtZS53aWR0aDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gZGlzcGxheUZyYW1lLmhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgdGlsZSBwb3NpdGlvbiB2ZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNfdGlsZVBvc2l0aW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGlsZVBvc2l0aW9uID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgdGlsZSBzY2FsZSB2ZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNfdGlsZVNjYWxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGlsZVNjYWxlID0gbmV3IFZlY3RvcjIoMSwgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIFRpbGUgU3ByaXRlIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LCByZXF1aXJpbmcgYW4gcmUtcmVuZGVyIG9mIGl0cyB0aWxlIHRleHR1cmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTdWNoIGNoYW5nZXMgaW5jbHVkZSB0aGUgdGV4dHVyZSBmcmFtZSBhbmQgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBUaWxlIFNwcml0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI2RpcnR5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZW5kZXJlciBpbiB1c2UgYnkgdGhpcyBUaWxlIFNwcml0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW52YXMgZWxlbWVudCB0aGF0IHRoZSBUaWxlU3ByaXRlIHJlbmRlcnMgaXRzIGZpbGwgcGF0dGVybiBpbiB0by5cclxuICAgICAgICAgKiBPbmx5IHVzZWQgaW4gQ2FudmFzIG1vZGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNjYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7P0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbnZhcyA9IENhbnZhc1Bvb2wuY3JlYXRlKHRoaXMsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ29udGV4dCBvZiB0aGUgQ2FudmFzIGVsZW1lbnQgdGhhdCB0aGUgVGlsZVNwcml0ZSByZW5kZXJzIGl0cyBmaWxsIHBhdHRlcm4gaW4gdG8uXHJcbiAgICAgICAgICogT25seSB1c2VkIGluIENhbnZhcyBtb2RlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjY29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUZXh0dXJlIHRoZSBUaWxlU3ByaXRlIGlzIHVzaW5nIGFzIGl0cyBmaWxsIHBhdHRlcm4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNkaXNwbGF5VGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZXxQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlUZXh0dXJlID0gZGlzcGxheVRleHR1cmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBGcmFtZSB0aGUgVGlsZVNwcml0ZSBpcyB1c2luZyBhcyBpdHMgZmlsbCBwYXR0ZXJuLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjZGlzcGxheUZyYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5GcmFtZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlGcmFtZSA9IGRpc3BsYXlGcmFtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIGNyb3AgZGF0YSBvYmplY3QsIGFzIHVzZWQgYnkgYHNldENyb3BgIGFuZCBwYXNzZWQgdG8gdGhlIGBGcmFtZS5zZXRDcm9wVVZzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNfY3JvcFxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY3JvcCA9IHRoaXMucmVzZXRDcm9wT2JqZWN0KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgdXNpbmcgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSN0ZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IHNjZW5lLnN5cy50ZXh0dXJlcy5hZGRDYW52YXMobnVsbCwgdGhpcy5jYW52YXMsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVGV4dHVyZSBGcmFtZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHVzaW5nIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjZnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWUgPSB0aGlzLnRleHR1cmUuZ2V0KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuZXh0IHBvd2VyIG9mIHR3byB2YWx1ZSBmcm9tIHRoZSB3aWR0aCBvZiB0aGUgRmlsbCBQYXR0ZXJuIGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjcG90V2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvdFdpZHRoID0gR2V0UG93ZXJPZlR3byhkaXNwbGF5RnJhbWUud2lkdGgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmV4dCBwb3dlciBvZiB0d28gdmFsdWUgZnJvbSB0aGUgaGVpZ2h0IG9mIHRoZSBGaWxsIFBhdHRlcm4gZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNwb3RIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvdEhlaWdodCA9IEdldFBvd2VyT2ZUd28oZGlzcGxheUZyYW1lLmhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW52YXMgdGhhdCB0aGUgVGlsZVNwcml0ZXMgdGV4dHVyZSBpcyByZW5kZXJlZCB0by5cclxuICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGEgV2ViR0wgdGV4dHVyZSBmcm9tLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjZmlsbENhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5maWxsQ2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUyRCh0aGlzLCB0aGlzLnBvdFdpZHRoLCB0aGlzLnBvdEhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW52YXMgQ29udGV4dCB1c2VkIHRvIHJlbmRlciB0aGUgVGlsZVNwcml0ZXMgdGV4dHVyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI2ZpbGxDb250ZXh0XHJcbiAgICAgICAgICogQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5maWxsQ29udGV4dCA9IHRoaXMuZmlsbENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGV4dHVyZSB0aGF0IHRoZSBUaWxlIFNwcml0ZSBpcyByZW5kZXJlZCB0bywgd2hpY2ggaXMgdGhlbiByZW5kZXJlZCB0byBhIFNjZW5lLlxyXG4gICAgICAgICAqIEluIFdlYkdMIHRoaXMgaXMgYSBXZWJHTFRleHR1cmUuIEluIENhbnZhcyBpdCdzIGEgQ2FudmFzIEZpbGwgUGF0dGVybi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI2ZpbGxQYXR0ZXJuXHJcbiAgICAgICAgICogQHR5cGUgez8oV2ViR0xUZXh0dXJlfENhbnZhc1BhdHRlcm4pfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxQYXR0ZXJuID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRGcmFtZShmcmFtZUtleSk7XHJcbiAgICAgICAgdGhpcy5zZXRPcmlnaW5Gcm9tRnJhbWUoKTtcclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgpO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZ2FtZS5ldmVudHMub24oR2FtZUV2ZW50cy5DT05URVhUX1JFU1RPUkVELCBmdW5jdGlvbiAocmVuZGVyZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxQYXR0ZXJuID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5maWxsUGF0dGVybiA9IHJlbmRlcmVyLmNyZWF0ZVRleHR1cmUyRCgwLCBnbC5MSU5FQVIsIGdsLkxJTkVBUiwgZ2wuUkVQRUFULCBnbC5SRVBFQVQsIGdsLlJHQkEsIHRoaXMuZmlsbENhbnZhcywgdGhpcy5wb3RXaWR0aCwgdGhpcy5wb3RIZWlnaHQpO1xyXG5cclxuICAgICAgICB9LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0ZXh0dXJlIGFuZCBmcmFtZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRleHR1cmVzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZWlyIHN0cmluZy1iYXNlZCBrZXlzLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI3NldFRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIG5hbWUgb3IgaW5kZXggb2YgdGhlIGZyYW1lIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRUZXh0dXJlOiBmdW5jdGlvbiAoa2V5LCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlUZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEZyYW1lKGZyYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmFtZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBGcmFtZSBoYXMgdG8gYmVsb25nIHRvIHRoZSBjdXJyZW50IFRleHR1cmUgYmVpbmcgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjc2V0RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gZnJhbWUgLSBUaGUgbmFtZSBvciBpbmRleCBvZiB0aGUgZnJhbWUgd2l0aGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZyYW1lOiBmdW5jdGlvbiAoZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5ld0ZyYW1lID0gdGhpcy5kaXNwbGF5VGV4dHVyZS5nZXQoZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLnBvdFdpZHRoID0gR2V0UG93ZXJPZlR3byhuZXdGcmFtZS53aWR0aCk7XHJcbiAgICAgICAgdGhpcy5wb3RIZWlnaHQgPSBHZXRQb3dlck9mVHdvKG5ld0ZyYW1lLmhlaWdodCk7XHJcblxyXG4gICAgICAgIC8vICBTbyB1cGRhdGVDYW52YXMgaXMgdHJpZ2dlcmVkXHJcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSAwO1xyXG5cclxuICAgICAgICBpZiAoIW5ld0ZyYW1lLmN1dFdpZHRoIHx8ICFuZXdGcmFtZS5jdXRIZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzICY9IH5fRkxBRztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheUZyYW1lID0gbmV3RnJhbWU7XHJcblxyXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVUZXh0dXJlKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI3RpbGVQb3NpdGlvblh9IGFuZCB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjdGlsZVBvc2l0aW9uWX0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNzZXRUaWxlUG9zaXRpb25cclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGlzIHNwcml0ZSdzIHRpbGluZyB0ZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoaXMgc3ByaXRlJ3MgdGlsaW5nIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUaWxlIFNwcml0ZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGlsZVBvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50aWxlUG9zaXRpb25YID0geDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh5ICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRpbGVQb3NpdGlvblkgPSB5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB7QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjdGlsZVNjYWxlWH0gYW5kIHtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSN0aWxlU2NhbGVZfS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI3NldFRpbGVTY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGUgdGlsaW5nIHRleHR1cmUuIElmIG5vdCBnaXZlbiBpdCB3aWxsIHVzZSB0aGUgY3VycmVudCBgdGlsZVNjYWxlWGAgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgc2NhbGUgb2YgdGhlIHRpbGluZyB0ZXh0dXJlLiBJZiBub3QgZ2l2ZW4gaXQgd2lsbCB1c2UgdGhlIGB4YCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbGUgU3ByaXRlIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlU2NhbGU6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IHRoaXMudGlsZVNjYWxlWDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy50aWxlU2NhbGVYID0geDtcclxuICAgICAgICB0aGlzLnRpbGVTY2FsZVkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXIgdGhlIHRpbGUgdGV4dHVyZSBpZiBpdCBpcyBkaXJ0eSwgb3IgaWYgdGhlIGZyYW1lIGhhcyBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjdXBkYXRlVGlsZVRleHR1cmVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGlsZVRleHR1cmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpcnR5IHx8ICF0aGlzLnJlbmRlcmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIERyYXcgdGhlIGRpc3BsYXlUZXh0dXJlIHRvIG91ciBmaWxsQ2FudmFzXHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IHRoaXMuZGlzcGxheUZyYW1lO1xyXG5cclxuICAgICAgICBpZiAoZnJhbWUuc291cmNlLmlzUmVuZGVyVGV4dHVyZSB8fCBmcmFtZS5zb3VyY2UuaXNHTFRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RpbGVTcHJpdGVzIGNhbiBvbmx5IHVzZSBJbWFnZSBvciBDYW52YXMgYmFzZWQgdGV4dHVyZXMnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjdHggPSB0aGlzLmZpbGxDb250ZXh0O1xyXG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmZpbGxDYW52YXM7XHJcblxyXG4gICAgICAgIHZhciBmdyA9IHRoaXMucG90V2lkdGg7XHJcbiAgICAgICAgdmFyIGZoID0gdGhpcy5wb3RIZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJlci5nbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZ3ID0gZnJhbWUuY3V0V2lkdGg7XHJcbiAgICAgICAgICAgIGZoID0gZnJhbWUuY3V0SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBmdywgZmgpO1xyXG5cclxuICAgICAgICBjYW52YXMud2lkdGggPSBmdztcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZmg7XHJcblxyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICAgIGZyYW1lLnNvdXJjZS5pbWFnZSxcclxuICAgICAgICAgICAgZnJhbWUuY3V0WCwgZnJhbWUuY3V0WSxcclxuICAgICAgICAgICAgZnJhbWUuY3V0V2lkdGgsIGZyYW1lLmN1dEhlaWdodCxcclxuICAgICAgICAgICAgMCwgMCxcclxuICAgICAgICAgICAgZncsIGZoXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuZ2wpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxQYXR0ZXJuID0gdGhpcy5yZW5kZXJlci5jYW52YXNUb1RleHR1cmUoY2FudmFzLCB0aGlzLmZpbGxQYXR0ZXJuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5maWxsUGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKGNhbnZhcywgJ3JlcGVhdCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYW52YXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXcgdGhlIGZpbGwgcGF0dGVybiB0byB0aGUgaW50ZXJuYWwgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjdXBkYXRlQ2FudmFzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVDYW52YXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuY2FudmFzO1xyXG5cclxuICAgICAgICBpZiAoY2FudmFzLndpZHRoICE9PSB0aGlzLndpZHRoIHx8IGNhbnZhcy5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRTaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXJ0eSB8fCB0aGlzLnJlbmRlcmVyICYmIHRoaXMucmVuZGVyZXIuZ2wpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjdHggPSB0aGlzLmNvbnRleHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zY2VuZS5zeXMuZ2FtZS5jb25maWcuYW50aWFsaWFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgU21vb3RoaW5nLmRpc2FibGUoY3R4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzY2FsZVggPSB0aGlzLl90aWxlU2NhbGUueDtcclxuICAgICAgICB2YXIgc2NhbGVZID0gdGhpcy5fdGlsZVNjYWxlLnk7XHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvblggPSB0aGlzLl90aWxlUG9zaXRpb24ueDtcclxuICAgICAgICB2YXIgcG9zaXRpb25ZID0gdGhpcy5fdGlsZVBvc2l0aW9uLnk7XHJcblxyXG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgICAgICBjdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xyXG5cclxuICAgICAgICBjdHgudHJhbnNsYXRlKC1wb3NpdGlvblgsIC1wb3NpdGlvblkpO1xyXG5cclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5maWxsUGF0dGVybjtcclxuXHJcbiAgICAgICAgY3R4LmZpbGxSZWN0KHBvc2l0aW9uWCwgcG9zaXRpb25ZLCB0aGlzLndpZHRoIC8gc2NhbGVYLCB0aGlzLmhlaWdodCAvIHNjYWxlWSk7XHJcblxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBkZXN0cm95IGhhbmRsZXIsIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXN0cm95IHByb2Nlc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNwcmVEZXN0cm95XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy45LjBcclxuICAgICAqL1xyXG4gICAgcHJlRGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlciAmJiB0aGlzLnJlbmRlcmVyLmdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kZWxldGVUZXh0dXJlKHRoaXMuZmlsbFBhdHRlcm4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUodGhpcy5jYW52YXMpO1xyXG4gICAgICAgIENhbnZhc1Bvb2wucmVtb3ZlKHRoaXMuZmlsbENhbnZhcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZmlsbFBhdHRlcm4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsbENvbnRleHQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsbENhbnZhcyA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheVRleHR1cmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUZyYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBUaWxlIFNwcml0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSN0aWxlUG9zaXRpb25YXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVQb3NpdGlvblg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVQb3NpdGlvbi54O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZVBvc2l0aW9uLnggPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBUaWxlIFNwcml0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSN0aWxlUG9zaXRpb25ZXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVQb3NpdGlvblk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVQb3NpdGlvbi55O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZVBvc2l0aW9uLnkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGUgVGlsZSBTcHJpdGUgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSN0aWxlU2NhbGVYXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICB0aWxlU2NhbGVYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWxlU2NhbGUueDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbGVTY2FsZS54ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZlcnRpY2FsIHNjYWxlIG9mIHRoZSBUaWxlIFNwcml0ZSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlI3RpbGVTY2FsZVlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVTY2FsZVk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVTY2FsZS55O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZVNjYWxlLnkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaWxlU3ByaXRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgQ2FudmFzIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZSNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgVGlsZVNwcml0ZUNhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgc3JjLnVwZGF0ZUNhbnZhcygpO1xyXG5cclxuICAgIHJlbmRlcmVyLmJhdGNoU3ByaXRlKHNyYywgc3JjLmZyYW1lLCBjYW1lcmEsIHBhcmVudE1hdHJpeCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVTcHJpdGVDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnVpbGRHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vQnVpbGRHYW1lT2JqZWN0Jyk7XHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIFRpbGVTcHJpdGUgPSByZXF1aXJlKCcuL1RpbGVTcHJpdGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFRpbGVTcHJpdGUgR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFRpbGVTcHJpdGUgR2FtZSBPYmplY3QgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI3RpbGVTcHJpdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUuVGlsZVNwcml0ZUNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gY3JlYXRlIGl0c2VsZi5cclxuICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9TY2VuZV0gLSBBZGQgdGhpcyBHYW1lIE9iamVjdCB0byB0aGUgU2NlbmUgYWZ0ZXIgY3JlYXRpbmcgaXQ/IElmIHNldCB0aGlzIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgYGFkZGAgcHJvcGVydHkgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCd0aWxlU3ByaXRlJywgZnVuY3Rpb24gKGNvbmZpZywgYWRkVG9TY2VuZSlcclxue1xyXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgdmFyIHggPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3gnLCAwKTtcclxuICAgIHZhciB5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd5JywgMCk7XHJcbiAgICB2YXIgd2lkdGggPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3dpZHRoJywgNTEyKTtcclxuICAgIHZhciBoZWlnaHQgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2hlaWdodCcsIDUxMik7XHJcbiAgICB2YXIga2V5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdrZXknLCAnJyk7XHJcbiAgICB2YXIgZnJhbWUgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgJycpO1xyXG5cclxuICAgIHZhciB0aWxlID0gbmV3IFRpbGVTcHJpdGUodGhpcy5zY2VuZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgaWYgKGFkZFRvU2NlbmUgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICBjb25maWcuYWRkID0gYWRkVG9TY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBCdWlsZEdhbWVPYmplY3QodGhpcy5zY2VuZSwgdGlsZSwgY29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gdGlsZTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRpbGVTcHJpdGUgPSByZXF1aXJlKCcuL1RpbGVTcHJpdGUnKTtcclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdEZhY3RvcnknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFRpbGVTcHJpdGUgR2FtZSBPYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIFNjZW5lLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBUaWxlU3ByaXRlIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSN0aWxlU3ByaXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgR2FtZSBPYmplY3QuIElmIHplcm8gaXQgd2lsbCB1c2UgdGhlIHNpemUgb2YgdGhlIHRleHR1cmUgZnJhbWUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgR2FtZSBPYmplY3QuIElmIHplcm8gaXQgd2lsbCB1c2UgdGhlIHNpemUgb2YgdGhlIHRleHR1cmUgZnJhbWUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVGlsZVNwcml0ZX0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5HYW1lT2JqZWN0RmFjdG9yeS5yZWdpc3RlcigndGlsZVNwcml0ZScsIGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBrZXksIGZyYW1lKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TGlzdC5hZGQobmV3IFRpbGVTcHJpdGUodGhpcy5zY2VuZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwga2V5LCBmcmFtZSkpO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSBjb250ZXh0LlxyXG4vL1xyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vL1xyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1RpbGVTcHJpdGVXZWJHTFJlbmRlcmVyJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgQ0FOVkFTX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuL1RpbGVTcHJpdGVDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVXRpbHMgPSByZXF1aXJlKCcuLi8uLi9yZW5kZXJlci93ZWJnbC9VdGlscycpO1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBXZWJHTCBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlRpbGVTcHJpdGUjcmVuZGVyV2ViR0xcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5UaWxlU3ByaXRlfSBzcmMgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVuZGVyZWQgaW4gdGhpcyBjYWxsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UgLSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgY3VzdG9tIHBpcGVsaW5lcy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0aGF0IGlzIHJlbmRlcmluZyB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGlzIHRyYW5zZm9ybSBtYXRyaXggaXMgZGVmaW5lZCBpZiB0aGUgZ2FtZSBvYmplY3QgaXMgbmVzdGVkXHJcbiAqL1xyXG52YXIgVGlsZVNwcml0ZVdlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICBzcmMudXBkYXRlQ2FudmFzKCk7XHJcblxyXG4gICAgdmFyIGdldFRpbnQgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYTtcclxuXHJcbiAgICB0aGlzLnBpcGVsaW5lLmJhdGNoVGV4dHVyZShcclxuICAgICAgICBzcmMsXHJcbiAgICAgICAgc3JjLmZpbGxQYXR0ZXJuLFxyXG4gICAgICAgIHNyYy5kaXNwbGF5RnJhbWUud2lkdGggKiBzcmMudGlsZVNjYWxlWCwgc3JjLmRpc3BsYXlGcmFtZS5oZWlnaHQgKiBzcmMudGlsZVNjYWxlWSxcclxuICAgICAgICBzcmMueCwgc3JjLnksXHJcbiAgICAgICAgc3JjLndpZHRoLCBzcmMuaGVpZ2h0LFxyXG4gICAgICAgIHNyYy5zY2FsZVgsIHNyYy5zY2FsZVksXHJcbiAgICAgICAgc3JjLnJvdGF0aW9uLFxyXG4gICAgICAgIHNyYy5mbGlwWCwgc3JjLmZsaXBZLFxyXG4gICAgICAgIHNyYy5zY3JvbGxGYWN0b3JYLCBzcmMuc2Nyb2xsRmFjdG9yWSxcclxuICAgICAgICBzcmMub3JpZ2luWCAqIHNyYy53aWR0aCwgc3JjLm9yaWdpblkgKiBzcmMuaGVpZ2h0LFxyXG4gICAgICAgIDAsIDAsIHNyYy53aWR0aCwgc3JjLmhlaWdodCxcclxuICAgICAgICBnZXRUaW50KHNyYy5fdGludFRMLCBjYW1lcmEuYWxwaGEgKiBzcmMuX2FscGhhVEwpLFxyXG4gICAgICAgIGdldFRpbnQoc3JjLl90aW50VFIsIGNhbWVyYS5hbHBoYSAqIHNyYy5fYWxwaGFUUiksXHJcbiAgICAgICAgZ2V0VGludChzcmMuX3RpbnRCTCwgY2FtZXJhLmFscGhhICogc3JjLl9hbHBoYUJMKSxcclxuICAgICAgICBnZXRUaW50KHNyYy5fdGludEJSLCBjYW1lcmEuYWxwaGEgKiBzcmMuX2FscGhhQlIpLFxyXG4gICAgICAgIChzcmMuX2lzVGludGVkICYmIHNyYy50aW50RmlsbCksXHJcbiAgICAgICAgKHNyYy50aWxlUG9zaXRpb25YICUgc3JjLmRpc3BsYXlGcmFtZS53aWR0aCkgLyBzcmMuZGlzcGxheUZyYW1lLndpZHRoLFxyXG4gICAgICAgIChzcmMudGlsZVBvc2l0aW9uWSAlIHNyYy5kaXNwbGF5RnJhbWUuaGVpZ2h0KSAvIHNyYy5kaXNwbGF5RnJhbWUuaGVpZ2h0LFxyXG4gICAgICAgIGNhbWVyYSxcclxuICAgICAgICBwYXJlbnRNYXRyaXhcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVTcHJpdGVXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDbGFtcCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvQ2xhbXAnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cy8nKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Jyk7XHJcbnZhciBTb3VuZEV2ZW50cyA9IHJlcXVpcmUoJy4uLy4uL3NvdW5kL2V2ZW50cy8nKTtcclxudmFyIFVVSUQgPSByZXF1aXJlKCcuLi8uLi91dGlscy9zdHJpbmcvVVVJRCcpO1xyXG52YXIgVmlkZW9SZW5kZXIgPSByZXF1aXJlKCcuL1ZpZGVvUmVuZGVyJyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBWaWRlbyBHYW1lIE9iamVjdC5cclxuICogXHJcbiAqIFRoaXMgR2FtZSBPYmplY3QgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBwbGF5YmFjayBvZiBhIHByZXZpb3VzbHkgbG9hZGVkIHZpZGVvIGZyb20gdGhlIFBoYXNlciBWaWRlbyBDYWNoZSxcclxuICogb3IgcGxheWluZyBhIHZpZGVvIGJhc2VkIG9uIGEgZ2l2ZW4gVVJMLiBWaWRlb3MgY2FuIGJlIGVpdGhlciBsb2NhbCwgb3Igc3RyZWFtZWQuXHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHByZWxvYWQgKCkge1xyXG4gKiAgIHRoaXMubG9hZC52aWRlbygncGl4YXInLCAnbmVtby5tcDQnKTtcclxuICogfVxyXG4gKiBcclxuICogY3JlYXRlICgpIHtcclxuICogICB0aGlzLmFkZC52aWRlbyg0MDAsIDMwMCwgJ3BpeGFyJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqIFxyXG4gKiBUbyBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMsIGEgdmlkZW8gaXMgYSBzdGFuZGFyZCBHYW1lIE9iamVjdCwganVzdCBsaWtlIGEgU3ByaXRlLiBBbmQgYXMgc3VjaCwgeW91IGNhbiBkb1xyXG4gKiBhbGwgdGhlIHVzdWFsIHRoaW5ncyB0byBpdCwgc3VjaCBhcyBzY2FsaW5nLCByb3RhdGluZywgY3JvcHBpbmcsIHRpbnRpbmcsIG1ha2luZyBpbnRlcmFjdGl2ZSwgZ2l2aW5nIGFcclxuICogcGh5c2ljcyBib2R5LCBldGMuXHJcbiAqIFxyXG4gKiBUcmFuc3BhcmVudCB2aWRlb3MgYXJlIGFsc28gcG9zc2libGUgdmlhIHRoZSBXZWJNIGZpbGUgZm9ybWF0LiBQcm92aWRpbmcgdGhlIHZpZGVvIGZpbGUgaGFzIHdhcyBlbmNvZGVkIHdpdGhcclxuICogYW4gYWxwaGEgY2hhbm5lbCwgYW5kIHByb3ZpZGluZyB0aGUgYnJvd3NlciBzdXBwb3J0cyBXZWJNIHBsYXliYWNrIChub3QgYWxsIG9mIHRoZW0gZG8pLCB0aGVuIGl0IHdpbGwgcmVuZGVyXHJcbiAqIGluLWdhbWUgd2l0aCBmdWxsIHRyYW5zcGFyZW5jeS5cclxuICogXHJcbiAqICMjIyBBdXRvcGxheWluZyBWaWRlb3NcclxuICogXHJcbiAqIFZpZGVvcyBjYW4gb25seSBhdXRvcGxheSBpZiB0aGUgYnJvd3NlciBoYXMgYmVlbiB1bmxvY2tlZCB3aXRoIGFuIGludGVyYWN0aW9uLCBvciBzYXRpc2ZpZXMgdGhlIE1FSSBzZXR0aW5ncy5cclxuICogVGhlIHBvbGljaWVzIHRoYXQgY29udHJvbCBhdXRvcGxheWluZyBhcmUgdmFzdCBhbmQgdmFyeSBiZXR3ZWVuIGJyb3dzZXIuXHJcbiAqIFlvdSBjYW4sIGFoZCBzaG91bGQsIHJlYWQgbW9yZSBhYm91dCBpdCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9NZWRpYS9BdXRvcGxheV9ndWlkZVxyXG4gKiBcclxuICogSWYgeW91ciB2aWRlbyBkb2Vzbid0IGNvbnRhaW4gYW55IGF1ZGlvLCB0aGVuIHNldCB0aGUgYG5vQXVkaW9gIHBhcmFtZXRlciB0byBgdHJ1ZWAgd2hlbiB0aGUgdmlkZW8gaXMgX2xvYWRlZF8sXHJcbiAqIGFuZCBpdCB3aWxsIG9mdGVuIGFsbG93IHRoZSB2aWRlbyB0byBwbGF5IGltbWVkaWF0ZWx5OlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBwcmVsb2FkICgpIHtcclxuICogICB0aGlzLmxvYWQudmlkZW8oJ3BpeGFyJywgJ25lbW8ubXA0JywgJ2xvYWRlZGRhdGEnLCBmYWxzZSwgdHJ1ZSk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqIFxyXG4gKiBUaGUgNXRoIHBhcmFtZXRlciBpbiB0aGUgbG9hZCBjYWxsIHRlbGxzIFBoYXNlciB0aGF0IHRoZSB2aWRlbyBkb2Vzbid0IGNvbnRhaW4gYW55IGF1ZGlvIHRyYWNrcy4gVmlkZW8gd2l0aG91dFxyXG4gKiBhdWRpbyBjYW4gYXV0b3BsYXkgd2l0aG91dCByZXF1aXJpbmcgYSB1c2VyIGludGVyYWN0aW9uLiBWaWRlbyB3aXRoIGF1ZGlvIGNhbm5vdCBkbyB0aGlzIHVubGVzcyBpdCBzYXRpc2ZpZXNcclxuICogdGhlIGJyb3dzZXJzIE1FSSBzZXR0aW5ncy4gU2VlIHRoZSBNRE4gQXV0b3BsYXkgR3VpZGUgZm9yIGZ1cnRoZXIgZGV0YWlscy5cclxuICogXHJcbiAqIE5vdGUgdGhhdCBkdWUgdG8gYSBidWcgaW4gSUUxMSB5b3UgY2Fubm90IHBsYXkgYSB2aWRlbyB0ZXh0dXJlIHRvIGEgU3ByaXRlIGluIFdlYkdMLiBGb3IgSUUxMSBmb3JjZSBDYW52YXMgbW9kZS5cclxuICogXHJcbiAqIE1vcmUgZGV0YWlscyBhYm91dCB2aWRlbyBwbGF5YmFjayBhbmQgdGhlIHN1cHBvcnRlZCBtZWRpYSBmb3JtYXRzIGNhbiBiZSBmb3VuZCBvbiBNRE46XHJcbiAqIFxyXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFZpZGVvRWxlbWVudFxyXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9NZWRpYS9Gb3JtYXRzXHJcbiAqXHJcbiAqIEBjbGFzcyBWaWRlb1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5NYXNrXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlQ3JvcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIEdhbWUgT2JqZWN0IGJlbG9uZ3MuIEEgR2FtZSBPYmplY3QgY2FuIG9ubHkgYmVsb25nIHRvIG9uZSBTY2VuZSBhdCBhIHRpbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBPcHRpb25hbCBrZXkgb2YgdGhlIFZpZGVvIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCBwbGF5LCBhcyBzdG9yZWQgaW4gdGhlIFZpZGVvIENhY2hlLlxyXG4gKi9cclxudmFyIFZpZGVvID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5CbGVuZE1vZGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5EZXB0aCxcclxuICAgICAgICBDb21wb25lbnRzLkZsaXAsXHJcbiAgICAgICAgQ29tcG9uZW50cy5HZXRCb3VuZHMsXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNrLFxyXG4gICAgICAgIENvbXBvbmVudHMuT3JpZ2luLFxyXG4gICAgICAgIENvbXBvbmVudHMuUGlwZWxpbmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TaXplLFxyXG4gICAgICAgIENvbXBvbmVudHMuVGV4dHVyZUNyb3AsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UaW50LFxyXG4gICAgICAgIENvbXBvbmVudHMuVHJhbnNmb3JtLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmlzaWJsZSxcclxuICAgICAgICBWaWRlb1JlbmRlclxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFZpZGVvIChzY2VuZSwgeCwgeSwga2V5KVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3QuY2FsbCh0aGlzLCBzY2VuZSwgJ1ZpZGVvJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBIVE1MIFZpZGVvIEVsZW1lbnQgdGhpcyBWaWRlbyBHYW1lIE9iamVjdCBpcyBwbGF5aW5nLlxyXG4gICAgICAgICAqIFdpbGwgYmUgYG51bGxgIHVudGlsIGEgdmlkZW8gaXMgbG9hZGVkIGZvciBwbGF5YmFjay5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyN2aWRlb1xyXG4gICAgICAgICAqIEB0eXBlIHs/SFRNTFZpZGVvRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWRlbyA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBQaGFzZXIgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHVzaW5nIHRvIHJlbmRlciB0aGUgdmlkZW8gdG8uXHJcbiAgICAgICAgICogV2lsbCBiZSBgbnVsbGAgdW50aWwgYSB2aWRlbyBpcyBsb2FkZWQgZm9yIHBsYXliYWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3ZpZGVvVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlkZW9UZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFRleHR1cmVTb3VyY2UgYmVsb25nIHRvIHRoZSBgdmlkZW9UZXh0dXJlYCBUZXh0dXJlIG9iamVjdC5cclxuICAgICAgICAgKiBXaWxsIGJlIGBudWxsYCB1bnRpbCBhIHZpZGVvIGlzIGxvYWRlZCBmb3IgcGxheWJhY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jdmlkZW9UZXh0dXJlU291cmNlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52aWRlb1RleHR1cmVTb3VyY2UgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIFBoYXNlciBDYW52YXNUZXh0dXJlIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIG1vc3QgcmVjZW50IHNuYXBzaG90IHRha2VuIGZyb20gdGhlIHZpZGVvLlxyXG4gICAgICAgICAqIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBpZiBgc25hcHNob3RgIG9yIGBzbmFwc2hvdEFyZWFgIGhhdmUgYmVlbiBjYWxsZWQsIGFuZCB3aWxsIGJlIGBudWxsYCB1bnRpbCB0aGF0IHBvaW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NuYXBzaG90VGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc25hcHNob3RUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgeW91IGhhdmUgc2F2ZWQgdGhpcyB2aWRlbyB0byBhIHRleHR1cmUgdmlhIHRoZSBgc2F2ZVRleHR1cmVgIG1ldGhvZCwgdGhpcyBjb250cm9scyBpZiB0aGUgdmlkZW9cclxuICAgICAgICAgKiBpcyByZW5kZXJlZCB3aXRoIGBmbGlwWWAgaW4gV2ViR0wgb3Igbm90LiBZb3Ugb2Z0ZW4gbmVlZCB0byBzZXQgdGhpcyBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIHZpZGVvIHRleHR1cmVcclxuICAgICAgICAgKiBhcyB0aGUgaW5wdXQgc291cmNlIGZvciBhIHNoYWRlci4gSWYgeW91IGZpbmQgeW91ciB2aWRlbyBpcyBhcHBlYXJpbmcgdXBzaWRlIGRvd24gd2l0aGluIGEgc2hhZGVyIG9yXHJcbiAgICAgICAgICogY3VzdG9tIHBpcGVsaW5lLCBmbGlwIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZmxpcFlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUga2V5IHVzZWQgYnkgdGhlIHRleHR1cmUgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jX2tleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fa2V5ID0gVVVJRCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBmbGFnIGhvbGRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpZGVvIGxvY2ssIHNob3VsZCBkb2N1bWVudCBpbnRlcmFjdGlvbiBiZSByZXF1aXJlZFxyXG4gICAgICAgICAqIGJlZm9yZSBwbGF5YmFjayBjYW4gYmVnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jdG91Y2hMb2NrZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3VjaExvY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNob3VsZCB0aGUgdmlkZW8gYXV0byBwbGF5IHdoZW4gZG9jdW1lbnQgaW50ZXJhY3Rpb24gaXMgcmVxdWlyZWQgYW5kIGhhcHBlbnM/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jcGxheVdoZW5VbmxvY2tlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsYXlXaGVuVW5sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hlbiBzdGFydGluZyBwbGF5YmFjayBvZiBhIHZpZGVvIFBoYXNlciB3aWxsIG1vbml0b3IgaXRzIGByZWFkeVN0YXRlYCB1c2luZyBhIGBzZXRUaW1lb3V0YCBjYWxsLlxyXG4gICAgICAgICAqIFRoZSBgc2V0VGltZW91dGAgaGFwcGVucyBvbmNlIGV2ZXJ5IGBWaWRlby5yZXRyeUludGVydmFsYCBtcy4gSXQgd2lsbCBjYXJyeSBvbiBtb25pdG9yaW5nIHRoZSB2aWRlb1xyXG4gICAgICAgICAqIHN0YXRlIGluIHRoaXMgbWFubmVyIHVudGlsIHRoZSBgcmV0cnlMaW1pdGAgaXMgcmVhY2hlZCBhbmQgdGhlbiBhYm9ydC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNyZXRyeUxpbWl0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmV0cnlMaW1pdCA9IDIwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCByZXRyeSBhdHRlbXB0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3JldHJ5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmV0cnkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIG1zIGJldHdlZW4gZWFjaCByZXRyeSB3aGlsZSBtb25pdG9yaW5nIHRoZSByZWFkeSBzdGF0ZSBvZiBhIGRvd25sb2FkaW5nIHZpZGVvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3JldHJ5SW50ZXJ2YWxcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZXRyeUludGVydmFsID0gNTAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2V0VGltZW91dCBjYWxsYmFjayBJRC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNfcmV0cnlJRFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3JldHJ5SUQgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmlkZW8gd2FzIG11dGVkIGR1ZSB0byBhIHN5c3RlbSBldmVudCwgc3VjaCBhcyB0aGUgZ2FtZSBsb3NpbmcgZm9jdXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jX3N5c3RlbU11dGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fc3lzdGVtTXV0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZpZGVvIHdhcyBtdXRlZCBkdWUgdG8gZ2FtZSBjb2RlLCBub3QgYSBzeXN0ZW0gZXZlbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jX2NvZGVNdXRlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2NvZGVNdXRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmlkZW8gd2FzIHBhdXNlZCBkdWUgdG8gYSBzeXN0ZW0gZXZlbnQsIHN1Y2ggYXMgdGhlIGdhbWUgbG9zaW5nIGZvY3VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI19zeXN0ZW1QYXVzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zeXN0ZW1QYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHZpZGVvIHdhcyBwYXVzZWQgZHVlIHRvIGdhbWUgY29kZSwgbm90IGEgc3lzdGVtIGV2ZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI19jb2RlUGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29kZVBhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9jYWxseSBib3VuZCBldmVudCBjYWxsYmFjayBoYW5kbGVycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNfY2FsbGJhY2tzXHJcbiAgICAgICAgICogQHR5cGUge2FueX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB7XHJcbiAgICAgICAgICAgIHBsYXk6IHRoaXMucGxheUhhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgZXJyb3I6IHRoaXMubG9hZEVycm9ySGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBlbmQ6IHRoaXMuY29tcGxldGVIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIHRpbWU6IHRoaXMudGltZVVwZGF0ZUhhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgc2Vla2luZzogdGhpcy5zZWVraW5nSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBzZWVrZWQ6IHRoaXMuc2Vla2VkSGFuZGxlci5iaW5kKHRoaXMpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIGNyb3AgZGF0YSBvYmplY3QsIGFzIHVzZWQgYnkgYHNldENyb3BgIGFuZCBwYXNzZWQgdG8gdGhlIGBGcmFtZS5zZXRDcm9wVVZzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jX2Nyb3BcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2Nyb3AgPSB0aGlzLnJlc2V0Q3JvcE9iamVjdCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBpbiBhbmQgb3V0IG1hcmtlcnMgZm9yIHNlcXVlbmNlIHBsYXliYWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI21hcmtlcnNcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hcmtlcnMgPSB7fTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGluIG1hcmtlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNfbWFya2VySW5cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9tYXJrZXJJbiA9IC0xO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3V0IG1hcmtlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNfbWFya2VyT3V0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbWFya2VyT3V0ID0gTUFUSF9DT05TVC5NQVhfU0FGRV9JTlRFR0VSO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbGFzdCB0aW1lIHRoZSBUZXh0dXJlU291cmNlIHdhcyB1cGRhdGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI19sYXN0VXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbGFzdFVwZGF0ZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBrZXkgb2YgdGhlIHZpZGVvIGJlaW5nIHBsYXllZCBmcm9tIHRoZSBWaWRlbyBjYWNoZSwgaWYgYW55LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI19jYWNoZUtleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhlIHZpZGVvIGN1cnJlbnRseSBzZWVraW5nP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI19pc1NlZWtpbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9pc1NlZWtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2hvdWxkIHRoZSBWaWRlbyBlbGVtZW50IHRoYXQgdGhpcyBWaWRlbyBpcyB1c2luZywgYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cclxuICAgICAgICAgKiB3aGVuIHRoaXMgVmlkZW8gaXMgZGVzdHJveWVkP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3JlbW92ZVZpZGVvRWxlbWVudE9uRGVzdHJveVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbW92ZVZpZGVvRWxlbWVudE9uRGVzdHJveSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCk7XHJcblxyXG4gICAgICAgIGlmIChrZXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNvdXJjZShrZXksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBnYW1lID0gc2NlbmUuc3lzLmdhbWUuZXZlbnRzO1xyXG5cclxuICAgICAgICBnYW1lLm9uKEdhbWVFdmVudHMuUEFVU0UsIHRoaXMuZ2xvYmFsUGF1c2UsIHRoaXMpO1xyXG4gICAgICAgIGdhbWUub24oR2FtZUV2ZW50cy5SRVNVTUUsIHRoaXMuZ2xvYmFsUmVzdW1lLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIHNvdW5kID0gc2NlbmUuc3lzLnNvdW5kO1xyXG5cclxuICAgICAgICBpZiAoc291bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzb3VuZC5vbihTb3VuZEV2ZW50cy5HTE9CQUxfTVVURSwgdGhpcy5nbG9iYWxNdXRlLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIHRoaXMgdmlkZW8gcGxheWluZy5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgdmlkZW8gaXMgYWxyZWFkeSBwbGF5aW5nLCBvciBoYXMgYmVlbiBxdWV1ZWQgdG8gcGxheSB3aXRoIGBjaGFuZ2VTb3VyY2VgIHRoZW4gdGhpcyBtZXRob2QganVzdCByZXR1cm5zLlxyXG4gICAgICogXHJcbiAgICAgKiBWaWRlb3MgY2FuIG9ubHkgYXV0b3BsYXkgaWYgdGhlIGJyb3dzZXIgaGFzIGJlZW4gdW5sb2NrZWQuIFRoaXMgaGFwcGVucyBpZiB5b3UgaGF2ZSBpbnRlcmFjdGVkIHdpdGggdGhlIGJyb3dzZXIsIGkuZS5cclxuICAgICAqIGJ5IGNsaWNraW5nIG9uIGl0IG9yIHByZXNzaW5nIGEga2V5LCBvciBkdWUgdG8gc2VydmVyIHNldHRpbmdzLiBUaGUgcG9saWNpZXMgdGhhdCBjb250cm9sIGF1dG9wbGF5aW5nIGFyZSB2YXN0IGFuZFxyXG4gICAgICogdmFyeSBiZXR3ZWVuIGJyb3dzZXIuIFlvdSBjYW4gcmVhZCBtb3JlIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL01lZGlhL0F1dG9wbGF5X2d1aWRlXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdXIgdmlkZW8gZG9lc24ndCBjb250YWluIGFueSBhdWRpbywgdGhlbiBzZXQgdGhlIGBub0F1ZGlvYCBwYXJhbWV0ZXIgdG8gYHRydWVgIHdoZW4gdGhlIHZpZGVvIGlzIGxvYWRlZCxcclxuICAgICAqIGFuZCBpdCB3aWxsIG9mdGVuIGFsbG93IHRoZSB2aWRlbyB0byBwbGF5IGltbWVkaWF0ZWx5OlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBwcmVsb2FkICgpIHtcclxuICAgICAqICAgdGhpcy5sb2FkLnZpZGVvKCdwaXhhcicsICduZW1vLm1wNCcsICdsb2FkZWRkYXRhJywgZmFsc2UsIHRydWUpO1xyXG4gICAgICogfVxyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSA1dGggcGFyYW1ldGVyIGluIHRoZSBsb2FkIGNhbGwgdGVsbHMgUGhhc2VyIHRoYXQgdGhlIHZpZGVvIGRvZXNuJ3QgY29udGFpbiBhbnkgYXVkaW8gdHJhY2tzLiBWaWRlbyB3aXRob3V0XHJcbiAgICAgKiBhdWRpbyBjYW4gYXV0b3BsYXkgd2l0aG91dCByZXF1aXJpbmcgYSB1c2VyIGludGVyYWN0aW9uLiBWaWRlbyB3aXRoIGF1ZGlvIGNhbm5vdCBkbyB0aGlzIHVubGVzcyBpdCBzYXRpc2ZpZXNcclxuICAgICAqIHRoZSBicm93c2VycyBNRUkgc2V0dGluZ3MuIFNlZSB0aGUgTUROIEF1dG9wbGF5IEd1aWRlIGZvciBkZXRhaWxzLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3UgbmVlZCBhdWRpbyBpbiB5b3VyIHZpZGVvcywgdGhlbiB5b3UnbGwgaGF2ZSB0byBjb25zaWRlciB0aGUgZmFjdCB0aGF0IHRoZSB2aWRlbyBjYW5ub3Qgc3RhcnQgcGxheWluZyB1bnRpbCB0aGVcclxuICAgICAqIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgYnJvd3NlciwgaW50byB5b3VyIGdhbWUgZmxvdy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNwbGF5XHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvb3A9ZmFsc2VdIC0gU2hvdWxkIHRoZSB2aWRlbyBsb29wIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQ/IFBsZWFzZSBub3RlIHRoYXQgbm90IGFsbCBicm93c2VycyBzdXBwb3J0IF9zZWFtbGVzc18gdmlkZW8gbG9vcGluZyBmb3IgYWxsIGVuY29kaW5nIGZvcm1hdHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFttYXJrZXJJbl0gLSBPcHRpb25hbCBpbiBtYXJrZXIgdGltZSwgaW4gc2Vjb25kcywgZm9yIHBsYXliYWNrIG9mIGEgc2VxdWVuY2Ugb2YgdGhlIHZpZGVvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbWFya2VyT3V0XSAtIE9wdGlvbmFsIG91dCBtYXJrZXIgdGltZSwgaW4gc2Vjb25kcywgZm9yIHBsYXliYWNrIG9mIGEgc2VxdWVuY2Ugb2YgdGhlIHZpZGVvLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHBsYXk6IGZ1bmN0aW9uIChsb29wLCBtYXJrZXJJbiwgbWFya2VyT3V0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICgodGhpcy50b3VjaExvY2tlZCAmJiB0aGlzLnBsYXlXaGVuVW5sb2NrZWQpIHx8IHRoaXMuaXNQbGF5aW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMudmlkZW87XHJcblxyXG4gICAgICAgIGlmICghdmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1ZpZGVvIG5vdCBsb2FkZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxvb3AgPT09IHVuZGVmaW5lZCkgeyBsb29wID0gdmlkZW8ubG9vcDsgfVxyXG5cclxuICAgICAgICB2YXIgc291bmQgPSB0aGlzLnNjZW5lLnN5cy5zb3VuZDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc291bmQgJiYgc291bmQubXV0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBNdXRlIHdpbGwgYmUgc2V0IGJhc2VkIG9uIHRoZSBnbG9iYWwgbXV0ZSBzdGF0ZSBvZiB0aGUgU291bmQgTWFuYWdlciAoaWYgdGhlcmUgaXMgb25lKVxyXG4gICAgICAgICAgICB0aGlzLnNldE11dGUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzTmFOKG1hcmtlckluKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX21hcmtlckluID0gbWFya2VySW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzTmFOKG1hcmtlck91dCkgJiYgbWFya2VyT3V0ID4gbWFya2VySW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJPdXQgPSBtYXJrZXJPdXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2aWRlby5sb29wID0gbG9vcDtcclxuXHJcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcztcclxuXHJcbiAgICAgICAgdmFyIHBsYXlQcm9taXNlID0gdmlkZW8ucGxheSgpO1xyXG5cclxuICAgICAgICBpZiAocGxheVByb21pc2UgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBsYXlQcm9taXNlLnRoZW4odGhpcy5wbGF5UHJvbWlzZVN1Y2Nlc3NIYW5kbGVyLmJpbmQodGhpcykpLmNhdGNoKHRoaXMucGxheVByb21pc2VFcnJvckhhbmRsZXIuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBPbGQtc2Nob29sIGJyb3dzZXJzIHdpdGggbm8gUHJvbWlzZXNcclxuICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGNhbGxiYWNrcy5wbGF5LCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBJZiB2aWRlbyBoYXNuJ3QgZG93bmxvYWRlZCBwcm9wZXJseSB5ZXQgLi4uXHJcbiAgICAgICAgICAgIGlmICh2aWRlby5yZWFkeVN0YXRlIDwgMilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeSA9IHRoaXMucmV0cnlMaW1pdDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXRyeUlEID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5jaGVja1ZpZGVvUHJvZ3Jlc3MuYmluZCh0aGlzKSwgdGhpcy5yZXRyeUludGVydmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFNldCB0aGVzZSBfYWZ0ZXJfIGNhbGxpbmcgYHBsYXlgIG9yIHRoZXkgZG9uJ3QgZmlyZSAodXNlZnVsLCB0aGFua3MgYnJvd3NlcnMpXHJcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBjYWxsYmFja3MuZW5kLCB0cnVlKTtcclxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgY2FsbGJhY2tzLnRpbWUsIHRydWUpO1xyXG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3NlZWtpbmcnLCBjYWxsYmFja3Muc2Vla2luZywgdHJ1ZSk7XHJcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgY2FsbGJhY2tzLnNlZWtlZCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmlkZW8gZWxlbWVudC4gSXQgd29ya3MgYnkgZmlyc3Qgc3RvcHBpbmcgdGhlXHJcbiAgICAgKiBjdXJyZW50IHZpZGVvLCBpZiBwbGF5aW5nLiBUaGVuIGRlbGV0aW5nIHRoZSB2aWRlbyB0ZXh0dXJlLCBpZiBvbmUgaGFzIGJlZW4gY3JlYXRlZC4gRmluYWxseSwgaXQgbWFrZXMgYVxyXG4gICAgICogbmV3IHZpZGVvIHRleHR1cmUgYW5kIHN0YXJ0cyBwbGF5YmFjayBvZiB0aGUgbmV3IHNvdXJjZSB0aHJvdWdoIHRoZSBleGlzdGluZyB2aWRlbyBlbGVtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgcmVhc29uIHlvdSBtYXkgd2lzaCB0byBkbyB0aGlzIGlzIGJlY2F1c2UgdmlkZW9zIHRoYXQgcmVxdWlyZSBpbnRlcmFjdGlvbiB0byB1bmxvY2ssIHJlbWFpbiBpbiBhbiB1bmxvY2tlZFxyXG4gICAgICogc3RhdGUsIGV2ZW4gaWYgeW91IGNoYW5nZSB0aGUgc291cmNlIG9mIHRoZSB2aWRlby4gQnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB0byBhIG5ldyB2aWRlbyB5b3UgYXZvaWQgaGF2aW5nIHRvXHJcbiAgICAgKiBnbyB0aHJvdWdoIHRoZSB1bmxvY2sgcHJvY2VzcyBhZ2Fpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNjaGFuZ2VTb3VyY2VcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFZpZGVvIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCBzd2FwIHRvIHBsYXlpbmcsIGFzIHN0b3JlZCBpbiB0aGUgVmlkZW8gQ2FjaGUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthdXRvcGxheT10cnVlXSAtIFNob3VsZCB0aGUgdmlkZW8gc3RhcnQgcGxheWluZyBpbW1lZGlhdGVseSwgb25jZSB0aGUgc3dhcCBpcyBjb21wbGV0ZT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvb3A9ZmFsc2VdIC0gU2hvdWxkIHRoZSB2aWRlbyBsb29wIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQ/IFBsZWFzZSBub3RlIHRoYXQgbm90IGFsbCBicm93c2VycyBzdXBwb3J0IF9zZWFtbGVzc18gdmlkZW8gbG9vcGluZyBmb3IgYWxsIGVuY29kaW5nIGZvcm1hdHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFttYXJrZXJJbl0gLSBPcHRpb25hbCBpbiBtYXJrZXIgdGltZSwgaW4gc2Vjb25kcywgZm9yIHBsYXliYWNrIG9mIGEgc2VxdWVuY2Ugb2YgdGhlIHZpZGVvLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbWFya2VyT3V0XSAtIE9wdGlvbmFsIG91dCBtYXJrZXIgdGltZSwgaW4gc2Vjb25kcywgZm9yIHBsYXliYWNrIG9mIGEgc2VxdWVuY2Ugb2YgdGhlIHZpZGVvLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZVNvdXJjZTogZnVuY3Rpb24gKGtleSwgYXV0b3BsYXksIGxvb3AsIG1hcmtlckluLCBtYXJrZXJPdXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGF1dG9wbGF5ID09PSB1bmRlZmluZWQpIHsgYXV0b3BsYXkgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciBjdXJyZW50VmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudFZpZGVvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbmV3VmlkZW8gPSB0aGlzLnNjZW5lLnN5cy5jYWNoZS52aWRlby5nZXQoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKG5ld1ZpZGVvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52aWRlbyA9IG5ld1ZpZGVvO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb2RlUGF1c2VkID0gbmV3VmlkZW8ucGF1c2VkO1xyXG4gICAgICAgICAgICB0aGlzLl9jb2RlTXV0ZWQgPSBuZXdWaWRlby5tdXRlZDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZGVvVGV4dHVyZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMucmVtb3ZlKHRoaXMuX2tleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1RleHR1cmUgPSB0aGlzLnNjZW5lLnN5cy50ZXh0dXJlcy5jcmVhdGUodGhpcy5fa2V5LCBuZXdWaWRlbywgbmV3VmlkZW8udmlkZW9XaWR0aCwgbmV3VmlkZW8udmlkZW9IZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1RleHR1cmVTb3VyY2UgPSB0aGlzLnZpZGVvVGV4dHVyZS5zb3VyY2VbMF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVGV4dHVyZS5hZGQoJ19fQkFTRScsIDAsIDAsIDAsIG5ld1ZpZGVvLnZpZGVvV2lkdGgsIG5ld1ZpZGVvLnZpZGVvSGVpZ2h0KTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZSh0aGlzLnZpZGVvVGV4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb0ZyYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX0NSRUFURUQsIHRoaXMsIG5ld1ZpZGVvLnZpZGVvV2lkdGgsIG5ld1ZpZGVvLnZpZGVvSGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGV4dHVyZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuZXdWaWRlby5jdXJyZW50VGltZSA9IDA7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9sYXN0VXBkYXRlID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdXRvcGxheSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5KGxvb3AsIG1hcmtlckluLCBtYXJrZXJPdXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW8gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNlcXVlbmNlIG1hcmtlciB0byB0aGlzIHZpZGVvLlxyXG4gICAgICogXHJcbiAgICAgKiBNYXJrZXJzIGFsbG93IHlvdSB0byBzcGxpdCBhIHZpZGVvIHVwIGludG8gc2VxdWVuY2VzLCBkZWxpbmVhdGVkIGJ5IGEgc3RhcnQgYW5kIGVuZCB0aW1lLCBnaXZlbiBpbiBzZWNvbmRzLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHRoZW4gcGxheSBiYWNrIHNwZWNpZmljIG1hcmtlcnMgdmlhIHRoZSBgcGxheU1hcmtlcmAgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgbWFya2VyIHRpbWluZyBpcyBfbm90XyBmcmFtZS1wZXJmZWN0LiBZb3Ugc2hvdWxkIGNvbnN0cnVjdCB5b3VyIHZpZGVvcyBpbiBzdWNoIGEgd2F5IHRoYXQgeW91IGFsbG93IGZvclxyXG4gICAgICogcGxlbnR5IG9mIGV4dHJhIHBhZGRpbmcgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHNlcXVlbmNlIHRvIGFsbG93IGZvciBkaXNjcmVwYW5jaWVzIGluIGJyb3dzZXIgc2VlayBhbmQgY3VycmVudFRpbWUgYWNjdXJhY3kuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdzNjL21lZGlhLWFuZC1lbnRlcnRhaW5tZW50L2lzc3Vlcy80IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhpcyBpc3N1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNhZGRNYXJrZXJcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEEgdW5pcXVlIG5hbWUgdG8gZ2l2ZSB0aGlzIG1hcmtlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWFya2VySW4gLSBUaGUgdGltZSwgaW4gc2Vjb25kcywgcmVwcmVzZW50aW5nIHRoZSBzdGFydCBvZiB0aGlzIG1hcmtlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWFya2VyT3V0IC0gVGhlIHRpbWUsIGluIHNlY29uZHMsIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoaXMgbWFya2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIGFkZE1hcmtlcjogZnVuY3Rpb24gKGtleSwgbWFya2VySW4sIG1hcmtlck91dClcclxuICAgIHtcclxuICAgICAgICBpZiAoIWlzTmFOKG1hcmtlckluKSAmJiBtYXJrZXJJbiA+PSAwICYmICFpc05hTihtYXJrZXJPdXQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXJrZXJzW2tleV0gPSBbIG1hcmtlckluLCBtYXJrZXJPdXQgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBsYXlzIGEgcHJlLWRlZmluZWQgc2VxdWVuY2UgaW4gdGhpcyB2aWRlby5cclxuICAgICAqIFxyXG4gICAgICogTWFya2VycyBhbGxvdyB5b3UgdG8gc3BsaXQgYSB2aWRlbyB1cCBpbnRvIHNlcXVlbmNlcywgZGVsaW5lYXRlZCBieSBhIHN0YXJ0IGFuZCBlbmQgdGltZSwgZ2l2ZW4gaW4gc2Vjb25kcyBhbmRcclxuICAgICAqIHNwZWNpZmllZCB2aWEgdGhlIGBhZGRNYXJrZXJgIG1ldGhvZC5cclxuICAgICAqIFxyXG4gICAgICogTm90ZSB0aGF0IG1hcmtlciB0aW1pbmcgaXMgX25vdF8gZnJhbWUtcGVyZmVjdC4gWW91IHNob3VsZCBjb25zdHJ1Y3QgeW91ciB2aWRlb3MgaW4gc3VjaCBhIHdheSB0aGF0IHlvdSBhbGxvdyBmb3JcclxuICAgICAqIHBsZW50eSBvZiBleHRyYSBwYWRkaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBzZXF1ZW5jZSB0byBhbGxvdyBmb3IgZGlzY3JlcGFuY2llcyBpbiBicm93c2VyIHNlZWsgYW5kIGN1cnJlbnRUaW1lIGFjY3VyYWN5LlxyXG4gICAgICogXHJcbiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3czYy9tZWRpYS1hbmQtZW50ZXJ0YWlubWVudC9pc3N1ZXMvNCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoaXMgaXNzdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jcGxheU1hcmtlclxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIG1hcmtlciBzZXF1ZW5jZSB0byBwbGF5LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbG9vcD1mYWxzZV0gLSBTaG91bGQgdGhlIHZpZGVvIGxvb3AgYXV0b21hdGljYWxseSB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZD8gUGxlYXNlIG5vdGUgdGhhdCBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgX3NlYW1sZXNzXyB2aWRlbyBsb29waW5nIGZvciBhbGwgZW5jb2RpbmcgZm9ybWF0cy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBWaWRlbyBHYW1lIE9iamVjdCBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICBwbGF5TWFya2VyOiBmdW5jdGlvbiAoa2V5LCBsb29wKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLm1hcmtlcnNba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKG1hcmtlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGxheShsb29wLCBtYXJrZXJbMF0sIG1hcmtlclsxXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSBzZXQgbWFya2VyIGZyb20gdGhpcyB2aWRlby5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIG1hcmtlciBpcyBjdXJyZW50bHkgcGxheWluZyBpdCB3aWxsIF9ub3RfIHN0b3AgcGxheWJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jcmVtb3ZlTWFya2VyXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgbWFya2VyIHRvIHJlbW92ZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBWaWRlbyBHYW1lIE9iamVjdCBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVNYXJrZXI6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMubWFya2Vyc1trZXldO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSB2aWRlbyBhbmQgcmVuZGVycyBpdCB0byBhIENhbnZhc1RleHR1cmUgb2JqZWN0LFxyXG4gICAgICogd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4gWW91IGNhbiBvcHRpb25hbGx5IHJlc2l6ZSB0aGUgZ3JhYiBieSBwYXNzaW5nIGEgd2lkdGggYW5kIGhlaWdodC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYFZpZGVvLnNuYXBzaG90VGV4dHVyZWAgb2JqZWN0LiBDYWxsaW5nIHRoaXMgbWV0aG9kXHJcbiAgICAgKiBtdWx0aXBsZSB0aW1lcyB3aWxsIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgc25hcHNob3Qgd2l0aCB0aGUgbW9zdCByZWNlbnQgb25lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NuYXBzaG90XHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVzdWx0aW5nIENhbnZhc1RleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVzdWx0aW5nIENhbnZhc1RleHR1cmUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlfSBcclxuICAgICAqL1xyXG4gICAgc25hcHNob3Q6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gdGhpcy53aWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB0aGlzLmhlaWdodDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdEFyZWEoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc25hcHNob3Qgb2YgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSB2aWRlbyBhbmQgcmVuZGVycyBpdCB0byBhIENhbnZhc1RleHR1cmUgb2JqZWN0LFxyXG4gICAgICogd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4gWW91IGNhbiBvcHRpb25hbGx5IHJlc2l6ZSB0aGUgZ3JhYiBieSBwYXNzaW5nIGEgZGlmZmVyZW50IGBkZXN0V2lkdGhgIGFuZCBgZGVzdEhlaWdodGAuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBWaWRlby5zbmFwc2hvdFRleHR1cmVgIG9iamVjdC4gQ2FsbGluZyB0aGlzIG1ldGhvZFxyXG4gICAgICogbXVsdGlwbGUgdGltZXMgd2lsbCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIHNuYXBzaG90IHdpdGggdGhlIG1vc3QgcmVjZW50IG9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNzbmFwc2hvdEFyZWFcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeD0wXSAtIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgYXJlYSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt5PTBdIC0gVGhlIHZlcnRpY2FsIGxvY2F0aW9uIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgYXJlYSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzcmNXaWR0aF0gLSBUaGUgd2lkdGggb2YgYXJlYSB0byBncmFiIGZyb20gdGhlIHZpZGVvLiBJZiBub3QgZ2l2ZW4gaXQgd2lsbCBncmFiIHRoZSBmdWxsIHZpZGVvIGRpbWVuc2lvbnMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzcmNIZWlnaHRdIC0gVGhlIGhlaWdodCBvZiBhcmVhIHRvIGdyYWIgZnJvbSB0aGUgdmlkZW8uIElmIG5vdCBnaXZlbiBpdCB3aWxsIGdyYWIgdGhlIGZ1bGwgdmlkZW8gZGltZW5zaW9ucy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2Rlc3RXaWR0aF0gLSBUaGUgZGVzdGluYXRpb24gd2lkdGggb2YgdGhlIGdyYWIsIGFsbG93aW5nIHlvdSB0byByZXNpemUgaXQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtkZXN0SGVpZ2h0XSAtIFRoZSBkZXN0aW5hdGlvbiBoZWlnaHQgb2YgdGhlIGdyYWIsIGFsbG93aW5nIHlvdSB0byByZXNpemUgaXQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlfSBcclxuICAgICAqL1xyXG4gICAgc25hcHNob3RBcmVhOiBmdW5jdGlvbiAoeCwgeSwgc3JjV2lkdGgsIHNyY0hlaWdodCwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHNyY1dpZHRoID09PSB1bmRlZmluZWQpIHsgc3JjV2lkdGggPSB0aGlzLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKHNyY0hlaWdodCA9PT0gdW5kZWZpbmVkKSB7IHNyY0hlaWdodCA9IHRoaXMuaGVpZ2h0OyB9XHJcbiAgICAgICAgaWYgKGRlc3RXaWR0aCA9PT0gdW5kZWZpbmVkKSB7IGRlc3RXaWR0aCA9IHNyY1dpZHRoOyB9XHJcbiAgICAgICAgaWYgKGRlc3RIZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBkZXN0SGVpZ2h0ID0gc3JjSGVpZ2h0OyB9XHJcblxyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMudmlkZW87XHJcbiAgICAgICAgdmFyIHNuYXAgPSB0aGlzLnNuYXBzaG90VGV4dHVyZTtcclxuXHJcbiAgICAgICAgaWYgKCFzbmFwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc25hcCA9IHRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLmNyZWF0ZUNhbnZhcyhVVUlEKCksIGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90VGV4dHVyZSA9IHNuYXA7XHJcblxyXG4gICAgICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNuYXAuY29udGV4dC5kcmF3SW1hZ2UodmlkZW8sIHgsIHksIHNyY1dpZHRoLCBzcmNIZWlnaHQsIDAsIDAsIGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc25hcC5zZXRTaXplKGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNuYXAuY29udGV4dC5kcmF3SW1hZ2UodmlkZW8sIHgsIHksIHNyY1dpZHRoLCBzcmNIZWlnaHQsIDAsIDAsIGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzbmFwLnVwZGF0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyBhIGNvcHkgb2YgdGhpcyBWaWRlb3MgYHNuYXBzaG90VGV4dHVyZWAgaW4gdGhlIFRleHR1cmUgTWFuYWdlciB1c2luZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIHRleHR1cmUgaXMgY3JlYXRlZCB3aGVuIHRoZSBgc25hcHNob3RgIG9yIGBzbmFwc2hvdEFyZWFgIG1ldGhvZHMgYXJlIGNhbGxlZC5cclxuICAgICAqIFxyXG4gICAgICogQWZ0ZXIgZG9pbmcgdGhpcywgYW55IHRleHR1cmUgYmFzZWQgR2FtZSBPYmplY3QsIHN1Y2ggYXMgYSBTcHJpdGUsIGNhbiB1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZVxyXG4gICAgICogc25hcHNob3QgYnkgdXNpbmcgdGhlIHRleHR1cmUga2V5OlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB2YXIgdmlkID0gdGhpcy5hZGQudmlkZW8oMCwgMCwgJ2ludHJvJyk7XHJcbiAgICAgKiBcclxuICAgICAqIHZpZC5zbmFwc2hvdCgpO1xyXG4gICAgICogXHJcbiAgICAgKiB2aWQuc2F2ZVNuYXBzaG90VGV4dHVyZSgnZG9vZGxlJyk7XHJcbiAgICAgKiBcclxuICAgICAqIHRoaXMuYWRkLmltYWdlKDQwMCwgMzAwLCAnZG9vZGxlJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVXBkYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBgc25hcHNob3RUZXh0dXJlYCwgZm9yIGV4YW1wbGUgYnkgY2FsbGluZyBgc25hcHNob3RgIGFnYWluLFxyXG4gICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBfYW55XyBHYW1lIE9iamVjdCB0aGF0IGlzIHVzaW5nIGl0IGFzIGEgdGV4dHVyZS5cclxuICAgICAqIENhbGxpbmcgYHNhdmVTbmFwc2hvdFRleHR1cmVgIGFnYWluIHdpbGwgbm90IHNhdmUgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHRleHR1cmUsXHJcbiAgICAgKiBpdCB3aWxsIGp1c3QgcmVuYW1lIHRoZSBleGlzdGluZyBvbmUuXHJcbiAgICAgKiBcclxuICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBjcmVhdGUgYSBzaW5nbGUgYmFzZSB0ZXh0dXJlLiBZb3UgY2FuIGFkZCBmcmFtZXMgdG8gdGhlIHRleHR1cmVcclxuICAgICAqIGJ5IHVzaW5nIHRoZSBgVGV4dHVyZS5hZGRgIG1ldGhvZC4gQWZ0ZXIgZG9pbmcgdGhpcywgeW91IGNhbiB0aGVuIGFsbG93IEdhbWUgT2JqZWN0c1xyXG4gICAgICogdG8gdXNlIGEgc3BlY2lmaWMgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jc2F2ZVNuYXBzaG90VGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIGtleSB0byBzdG9yZSB0aGUgdGV4dHVyZSBhcyB3aXRoaW4gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmV9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIHNhdmVkLlxyXG4gICAgICovXHJcbiAgICBzYXZlU25hcHNob3RUZXh0dXJlOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnNuYXBzaG90VGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLnJlbmFtZVRleHR1cmUodGhpcy5zbmFwc2hvdFRleHR1cmUua2V5LCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90VGV4dHVyZSA9IHRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLmNyZWF0ZUNhbnZhcyhrZXksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNuYXBzaG90VGV4dHVyZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIFZpZGVvIGZyb20gdGhlIGdpdmVuIFVSTCwgcmVhZHkgZm9yIHBsYXliYWNrIHdpdGggdGhlIGBWaWRlby5wbGF5YCBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gY29udHJvbCBhdCB3aGF0IHBvaW50IHRoZSBicm93c2VyIGRldGVybWluZXMgdGhlIHZpZGVvIGFzIGJlaW5nIHJlYWR5IGZvciBwbGF5YmFjayB2aWFcclxuICAgICAqIHRoZSBgbG9hZEV2ZW50YCBwYXJhbWV0ZXIuIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTFZpZGVvRWxlbWVudFxyXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNsb2FkVVJMXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIG9mIHRoZSB2aWRlbyB0byBsb2FkIG9yIGJlIHN0cmVhbWVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkRXZlbnQ9J2xvYWRlZGRhdGEnXSAtIFRoZSBsb2FkIGV2ZW50IHRvIGxpc3RlbiBmb3IuIEVpdGhlciBgbG9hZGVkZGF0YWAsIGBjYW5wbGF5YCBvciBgY2FucGxheXRocm91Z2hgLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9BdWRpbz1mYWxzZV0gLSBEb2VzIHRoZSB2aWRlbyBoYXZlIGFuIGF1ZGlvIHRyYWNrPyBJZiBub3QgeW91IGNhbiBlbmFibGUgYXV0by1wbGF5aW5nIG9uIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIGxvYWRVUkw6IGZ1bmN0aW9uICh1cmwsIGxvYWRFdmVudCwgbm9BdWRpbylcclxuICAgIHtcclxuICAgICAgICBpZiAobG9hZEV2ZW50ID09PSB1bmRlZmluZWQpIHsgbG9hZEV2ZW50ID0gJ2xvYWRlZGRhdGEnOyB9XHJcbiAgICAgICAgaWYgKG5vQXVkaW8gPT09IHVuZGVmaW5lZCkgeyBub0F1ZGlvID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZGVvVGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLnJlbW92ZSh0aGlzLl9rZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcclxuICAgIFxyXG4gICAgICAgIHZpZGVvLmNvbnRyb2xzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChub0F1ZGlvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2aWRlby5kZWZhdWx0TXV0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICdhdXRvcGxheScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICdwbGF5c2lubGluZScpO1xyXG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgncHJlbG9hZCcsICdhdXRvJyk7XHJcblxyXG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fY2FsbGJhY2tzLmVycm9yLCB0cnVlKTtcclxuXHJcbiAgICAgICAgdmlkZW8uc3JjID0gdXJsO1xyXG5cclxuICAgICAgICB2aWRlby5sb2FkKCk7XHJcblxyXG4gICAgICAgIHRoaXMudmlkZW8gPSB2aWRlbztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnRlcm5hbCBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHBsYXliYWNrIFByb21pc2UgcmVzb2x2ZXMgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3BsYXlQcm9taXNlU3VjY2Vzc0hhbmRsZXJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1BMQVlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKi9cclxuICAgIHBsYXlQcm9taXNlU3VjY2Vzc0hhbmRsZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50b3VjaExvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX1BMQVksIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbWFya2VySW4gPiAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW8uY3VycmVudFRpbWUgPSB0aGlzLl9tYXJrZXJJbjtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnRlcm5hbCBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHBsYXliYWNrIFByb21pc2UgZmFpbHMgdG8gcmVzb2x2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNwbGF5UHJvbWlzZUVycm9ySGFuZGxlclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fRVJST1JcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBlcnJvciAtIFRoZSBQcm9taXNlIHJlc29sdXRpb24gZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHBsYXlQcm9taXNlRXJyb3JIYW5kbGVyOiBmdW5jdGlvbiAoZXJyb3IpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuaW5wdXQub25jZSgncG9pbnRlcmRvd24nLCB0aGlzLnVubG9ja0hhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRvdWNoTG9ja2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBsYXlXaGVuVW5sb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX0VSUk9SLCB0aGlzLCBlcnJvcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZGVvIGVtaXRzIGEgYHBsYXlpbmdgIGV2ZW50IGR1cmluZyBsb2FkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIG9ubHkgbGlzdGVuZWQgZm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBQcm9taXNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNwbGF5SGFuZGxlclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fUExBWVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBwbGF5SGFuZGxlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRvdWNoTG9ja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuVklERU9fUExBWSwgdGhpcyk7XHJcbiAgICAgICBcclxuICAgICAgICB0aGlzLnZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCB0aGlzLl9jYWxsYmFja3MucGxheSwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnRlcm5hbCBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHZpZGVvIGZhaWxzIHRvIGxvYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jbG9hZEVycm9ySGFuZGxlclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fRVJST1JcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGVycm9yIEV2ZW50LlxyXG4gICAgICovXHJcbiAgICBsb2FkRXJyb3JIYW5kbGVyOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuVklERU9fRVJST1IsIHRoaXMsIGV2ZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGludGVybmFsIG1ldGhvZCBpcyBjYWxsZWQgaWYgdGhlIHZpZGVvIGNvdWxkbid0IGJlIHBsYXllZCBiZWNhdXNlIGl0IHdhcyBpbnRlcmFjdGlvbiBsb2NrZWRcclxuICAgICAqIGJ5IHRoZSBicm93c2VyLCBidXQgYW4gaW5wdXQgZXZlbnQgaGFzIHNpbmNlIGJlZW4gcmVjZWl2ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jdW5sb2NrSGFuZGxlclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5HYW1lT2JqZWN0cy5FdmVudHMjVklERU9fVU5MT0NLRURcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1BMQVlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBlcnJvciAtIFRoZSBQcm9taXNlIHJlc29sdXRpb24gZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIHVubG9ja0hhbmRsZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50b3VjaExvY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGxheVdoZW5VbmxvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX1VOTE9DS0VELCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX21hcmtlckluID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gdGhpcy5fbWFya2VySW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5WSURFT19QTEFZLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmlkZW8gY29tcGxldGVzIHBsYXliYWNrLCBpLmUuIHJlYWNoZXMgYW4gYGVuZGVkYCBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBpZiB0aGUgdmlkZW8gaXMgY29taW5nIGZyb20gYSBsaXZlIHN0cmVhbSwgd2hlcmUgdGhlIGR1cmF0aW9uIGlzIGBJbmZpbml0eWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jY29tcGxldGVIYW5kbGVyXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBjb21wbGV0ZUhhbmRsZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5WSURFT19DT01QTEVURSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZGVvIGVtaXRzIGEgYHRpbWVVcGRhdGVgIGV2ZW50IGR1cmluZyBwbGF5YmFjay5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBldmVudCBpcyB0b28gc2xvdyBhbmQgaXJyZWd1bGFyIHRvIGJlIHVzZWQgZm9yIGFjdHVhbCB2aWRlbyB0aW1pbmcgb3IgdGV4dHVyZSB1cGRhdGluZyxcclxuICAgICAqIGJ1dCB3ZSBjYW4gdXNlIGl0IHRvIGRldGVybWluZSBpZiBhIHZpZGVvIGhhcyBsb29wZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jdGltZVVwZGF0ZUhhbmRsZXJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX0xPT1BcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqL1xyXG4gICAgdGltZVVwZGF0ZUhhbmRsZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8gJiYgdGhpcy52aWRlby5jdXJyZW50VGltZSA8IHRoaXMuX2xhc3RVcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX0xPT1AsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbGFzdFVwZGF0ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnRlcm5hbCB1cGRhdGUgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNwcmVVcGRhdGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKi9cclxuICAgIHByZVVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSB2aWRlby5jdXJyZW50VGltZTtcclxuXHJcbiAgICAgICAgICAgIC8vICBEb24ndCByZW5kZXIgYSBuZXcgZnJhbWUgdW5sZXNzIHRoZSB2aWRlbyBoYXMgYWN0dWFsbHkgY2hhbmdlZCB0aW1lXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSAhPT0gdGhpcy5fbGFzdFVwZGF0ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFVwZGF0ZSA9IGN1cnJlbnRUaW1lO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGV4dHVyZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSA+PSB0aGlzLl9tYXJrZXJPdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLmxvb3ApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRoaXMuX21hcmtlckluO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUZXh0dXJlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VXBkYXRlID0gY3VycmVudFRpbWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX0xPT1AsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX0NPTVBMRVRFLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBjYWxsYmFjayB0aGF0IG1vbml0b3JzIHRoZSBkb3dubG9hZCBwcm9ncmVzcyBvZiBhIHZpZGVvIGFmdGVyIGNoYW5naW5nIGl0cyBzb3VyY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jY2hlY2tWaWRlb1Byb2dyZXNzXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19USU1FT1VUXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBjaGVja1ZpZGVvUHJvZ3Jlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8ucmVhZHlTdGF0ZSA+PSAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdlJ3ZlIGdvdCBlbm91Z2ggZGF0YSB0byB1cGRhdGUgdGhlIHRleHR1cmUgZm9yIHBsYXliYWNrXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGV4dHVyZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJldHJ5LS07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JldHJ5SUQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmNoZWNrVmlkZW9Qcm9ncmVzcy5iaW5kKHRoaXMpLCB0aGlzLnJldHJ5SW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5WSURFT19USU1FT1VULCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbiBlbm91Z2ggdmlkZW8gZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBpbiBvcmRlciB0byBjcmVhdGUgYSB0ZXh0dXJlXHJcbiAgICAgKiBmcm9tIGl0LiBUaGUgdGV4dHVyZSBpcyBhc3NpZ25lZCB0byB0aGUgYFZpZGVvLnZpZGVvVGV4dHVyZWAgcHJvcGVydHkgYW5kIGdpdmVuIGEgYmFzZSBmcmFtZSB0aGF0XHJcbiAgICAgKiBlbmNvbXBhc2VzIHRoZSB3aG9sZSB2aWRlbyBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3VwZGF0ZVRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGV4dHVyZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvVGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9UZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuY3JlYXRlKHRoaXMuX2tleSwgdmlkZW8sIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvVGV4dHVyZVNvdXJjZSA9IHRoaXMudmlkZW9UZXh0dXJlLnNvdXJjZVswXTtcclxuICAgICAgICAgICAgdGhpcy52aWRlb1RleHR1cmUuYWRkKCdfX0JBU0UnLCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLnNldFRleHR1cmUodGhpcy52aWRlb1RleHR1cmUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpemVUb0ZyYW1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheU9yaWdpbigpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuVklERU9fQ1JFQVRFRCwgdGhpcywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0ZXh0dXJlU291cmNlID0gdGhpcy52aWRlb1RleHR1cmVTb3VyY2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dHVyZVNvdXJjZS5zb3VyY2UgIT09IHZpZGVvKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlU291cmNlLnNvdXJjZSA9IHZpZGVvO1xyXG4gICAgICAgICAgICAgICAgdGV4dHVyZVNvdXJjZS53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgdGV4dHVyZVNvdXJjZS5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRleHR1cmVTb3VyY2UudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGtleSBvZiB0aGUgY3VycmVudGx5IHBsYXllZCB2aWRlbywgYXMgc3RvcmVkIGluIHRoZSBWaWRlbyBDYWNoZS5cclxuICAgICAqIElmIHRoZSB2aWRlbyBkaWQgbm90IGNvbWUgZnJvbSB0aGUgY2FjaGUgdGhpcyB3aWxsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZ2V0VmlkZW9LZXlcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUga2V5IG9mIHRoZSB2aWRlbyBiZWluZyBwbGF5ZWQgZnJvbSB0aGUgVmlkZW8gQ2FjaGUsIGlmIGFueS5cclxuICAgICAqL1xyXG4gICAgZ2V0VmlkZW9LZXk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlS2V5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZWtzIHRvIGEgZ2l2ZW4gcG9pbnQgaW4gdGhlIHZpZGVvLiBUaGUgdmFsdWUgaXMgZ2l2ZW4gYXMgYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDEsXHJcbiAgICAgKiB3aGVyZSAwIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIHRoZSB2aWRlbyBhbmQgMSByZXByZXNlbnRzIHRoZSBlbmQuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZWtpbmcgb25seSB3b3JrcyBpZiB0aGUgdmlkZW8gaGFzIGEgZHVyYXRpb24sIHNvIHdpbGwgbm90IHdvcmsgZm9yIGxpdmUgc3RyZWFtcy5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiBzZWVraW5nIGJlZ2lucywgdGhpcyB2aWRlbyB3aWxsIGVtaXQgYSBgc2Vla2luZ2AgZXZlbnQuIFdoZW4gdGhlIHZpZGVvIGNvbXBsZXRlc1xyXG4gICAgICogc2Vla2luZyAoaS5lLiByZWFjaGVzIGl0cyBkZXNpZ25hdGVkIHRpbWVzdGFtcCkgaXQgd2lsbCBlbWl0IGEgYHNlZWtlZGAgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHNlZWsgYmFzZWQgb24gdGltZSBpbnN0ZWFkLCB1c2UgdGhlIGBWaWRlby5zZXRDdXJyZW50VGltZWAgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NlZWtUb1xyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcG9pbnQgaW4gdGhlIHZpZGVvIHRvIHNlZWsgdG8uIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHNlZWtUbzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMudmlkZW87XHJcblxyXG4gICAgICAgIGlmICh2aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHZpZGVvLmR1cmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9PSBJbmZpbml0eSAmJiAhaXNOYU4oZHVyYXRpb24pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2Vla1RpbWUgPSBkdXJhdGlvbiAqIHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudFRpbWUoc2Vla1RpbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIGluIHNlY29uZHMuXHJcbiAgICAgKiBJZiB0aGUgbWVkaWEgaGFzIG5vdCBzdGFydGVkIHRvIHBsYXkgYW5kIGhhcyBub3QgYmVlbiBzZWVrZWQsIHRoaXMgdmFsdWUgaXMgdGhlIG1lZGlhJ3MgaW5pdGlhbCBwbGF5YmFjayB0aW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI2dldEN1cnJlbnRUaW1lXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBpbiBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBnZXRDdXJyZW50VGltZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudmlkZW8pID8gdGhpcy52aWRlby5jdXJyZW50VGltZSA6IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Vla3MgdG8gYSBnaXZlbiBwbGF5YmFjayB0aW1lIGluIHRoZSB2aWRlby4gVGhlIHZhbHVlIGlzIGdpdmVuIGluIF9zZWNvbmRzXyBvciBhcyBhIHN0cmluZy5cclxuICAgICAqIFxyXG4gICAgICogU2Vla2luZyBvbmx5IHdvcmtzIGlmIHRoZSB2aWRlbyBoYXMgYSBkdXJhdGlvbiwgc28gd2lsbCBub3Qgd29yayBmb3IgbGl2ZSBzdHJlYW1zLlxyXG4gICAgICogXHJcbiAgICAgKiBXaGVuIHNlZWtpbmcgYmVnaW5zLCB0aGlzIHZpZGVvIHdpbGwgZW1pdCBhIGBzZWVraW5nYCBldmVudC4gV2hlbiB0aGUgdmlkZW8gY29tcGxldGVzXHJcbiAgICAgKiBzZWVraW5nIChpLmUuIHJlYWNoZXMgaXRzIGRlc2lnbmF0ZWQgdGltZXN0YW1wKSBpdCB3aWxsIGVtaXQgYSBgc2Vla2VkYCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBwcm92aWRlIGEgc3RyaW5nIHByZWZpeGVkIHdpdGggZWl0aGVyIGEgYCtgIG9yIGEgYC1gLCBzdWNoIGFzIGArMi41YCBvciBgLTIuNWAuXHJcbiAgICAgKiBJbiB0aGlzIGNhc2UgaXQgd2lsbCBzZWVrIHRvICsvLSB0aGUgdmFsdWUgZ2l2ZW4sIHJlbGF0aXZlIHRvIHRoZSBfY3VycmVudCB0aW1lXy5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IHdpc2ggdG8gc2VlayBiYXNlZCBvbiBhIGR1cmF0aW9uIHBlcmNlbnRhZ2UgaW5zdGVhZCwgdXNlIHRoZSBgVmlkZW8uc2Vla1RvYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jc2V0Q3VycmVudFRpbWVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IHZhbHVlIC0gVGhlIHBsYXliYWNrIHRpbWUgdG8gc2VlayB0byBpbiBzZWNvbmRzLiBDYW4gYmUgZXhwcmVzc2VkIGFzIGEgc3RyaW5nLCBzdWNoIGFzIGArMmAgdG8gc2VlayAyIHNlY29uZHMgYWhlYWQgZnJvbSB0aGUgY3VycmVudCB0aW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHNldEN1cnJlbnRUaW1lOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZpZGVvID0gdGhpcy52aWRlbztcclxuXHJcbiAgICAgICAgaWYgKHZpZGVvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBvcCA9IHZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgICAgdmFyIG51bSA9IHBhcnNlRmxvYXQodmFsdWUuc3Vic3RyKDEpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob3AgPT09ICcrJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZpZGVvLmN1cnJlbnRUaW1lICsgbnVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3AgPT09ICctJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZpZGVvLmN1cnJlbnRUaW1lIC0gbnVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbGFzdFVwZGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFZpZGVvIGlzIGN1cnJlbnRseSBzZWVraW5nLCBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jaXNTZWVraW5nXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgVmlkZW8gaXMgY3VycmVudGx5IHNlZWtpbmcsIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNTZWVraW5nOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1NlZWtpbmc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgc2Vla2luZyBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NlZWtpbmdIYW5kbGVyXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkdhbWVPYmplY3RzLkV2ZW50cyNWSURFT19TRUVLSU5HXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBzZWVraW5nSGFuZGxlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc1NlZWtpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZJREVPX1NFRUtJTkcsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHNlZWtlZCBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NlZWtlZEhhbmRsZXJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1NFRUtFRFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqL1xyXG4gICAgc2Vla2VkSGFuZGxlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc1NlZWtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5WSURFT19TRUVLRUQsIHRoaXMpO1xyXG5cclxuICAgICAgICB2YXIgdmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRleHR1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9ncmVzcyBvZiB0aGUgdmlkZW8uIFByb2dyZXNzIGlzIGRlZmluZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgKHRoZSBzdGFydClcclxuICAgICAqIGFuZCAxICh0aGUgZW5kKS5cclxuICAgICAqIFxyXG4gICAgICogUHJvZ3Jlc3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgaWYgdGhlIHZpZGVvIGhhcyBhIGR1cmF0aW9uLCBvdGhlcndpc2UgaXQgd2lsbCBhbHdheXMgcmV0dXJuIHplcm8uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZ2V0UHJvZ3Jlc3NcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBwcm9ncmVzcyBvZiBwbGF5YmFjay4gSWYgdGhlIHZpZGVvIGhhcyBubyBkdXJhdGlvbiwgd2lsbCBhbHdheXMgcmV0dXJuIHplcm8uXHJcbiAgICAgKi9cclxuICAgIGdldFByb2dyZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMudmlkZW87XHJcblxyXG4gICAgICAgIGlmICh2aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSB2aWRlby5jdXJyZW50VGltZTtcclxuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gdmlkZW8uZHVyYXRpb247XHJcblxyXG4gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT09IEluZmluaXR5ICYmICFpc05hTihkdXJhdGlvbikpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBub3cgLyBkdXJhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoZSBkdXJhdGlvbiAodG90YWwgbGVuZ3RoKSBvZiB0aGUgbWVkaWEgaW4gc2Vjb25kcyxcclxuICAgICAqIG9uIHRoZSBtZWRpYSdzIHRpbWVsaW5lLiBJZiBubyBtZWRpYSBpcyBwcmVzZW50IG9uIHRoZSBlbGVtZW50LCBvciB0aGUgbWVkaWEgaXMgbm90IHZhbGlkLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgTmFOLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgbWVkaWEgaGFzIG5vIGtub3duIGVuZCAoc3VjaCBhcyBmb3IgbGl2ZSBzdHJlYW1zIG9mIHVua25vd24gZHVyYXRpb24sIHdlYiByYWRpbywgbWVkaWEgaW5jb21pbmcgZnJvbSBXZWJSVEMsXHJcbiAgICAgKiBhbmQgc28gZm9ydGgpLCB0aGlzIHZhbHVlIGlzICtJbmZpbml0eS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZ2V0RHVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW5kaWNhdGluZyB0aGUgZHVyYXRpb24gb2YgdGhlIG1lZGlhIGluIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGdldER1cmF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy52aWRlbykgPyB0aGlzLnZpZGVvLmR1cmF0aW9uIDogMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgdmlkZW8sIGlmIG9uZSBpcyBsb2FkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jc2V0TXV0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIFRoZSBtdXRlIHZhbHVlLiBgdHJ1ZWAgaWYgdGhlIHZpZGVvIHNob3VsZCBiZSBtdXRlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVmlkZW8gR2FtZSBPYmplY3QgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0TXV0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb2RlTXV0ZWQgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgdmFyIHZpZGVvID0gdGhpcy52aWRlbztcclxuXHJcbiAgICAgICAgaWYgKHZpZGVvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmlkZW8ubXV0ZWQgPSAodGhpcy5fc3lzdGVtTXV0ZWQpID8gdHJ1ZSA6IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIFZpZGVvIGlzIGN1cnJlbnRseSBtdXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNpc011dGVkXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgVmlkZW8gaXMgY3VycmVudGx5IG11dGVkLCBvciBub3QuXHJcbiAgICAgKi9cclxuICAgIGlzTXV0ZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNdXRlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBnbG9iYWwgbXV0ZSBoYW5kbGVyLiBXaWxsIG11dGUgdGhlIHZpZGVvLCBpZiBwbGF5aW5nLCBpZiB0aGUgZ2xvYmFsIHNvdW5kIHN5c3RlbSBtdXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNnbG9iYWxNdXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXJ8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIpfSBzb3VuZE1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgTWFuYWdlciB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdXRlIC0gVGhlIG11dGUgdmFsdWUuIGB0cnVlYCBpZiB0aGUgU291bmQgTWFuYWdlciBpcyBub3cgbXV0ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBnbG9iYWxNdXRlOiBmdW5jdGlvbiAoc291bmRNYW5hZ2VyLCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9zeXN0ZW1NdXRlZCA9IHZhbHVlO1xyXG5cclxuICAgICAgICB2YXIgdmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2aWRlby5tdXRlZCA9ICh0aGlzLl9jb2RlTXV0ZWQpID8gdHJ1ZSA6IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBnbG9iYWwgcGF1c2UgaGFuZGxlci4gV2lsbCBwYXVzZSB0aGUgdmlkZW8gaWYgdGhlIEdhbWUgaXRzZWxmIHBhdXNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNnbG9iYWxQYXVzZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqL1xyXG4gICAgZ2xvYmFsUGF1c2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc3lzdGVtUGF1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBhdXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGdsb2JhbCByZXN1bWUgaGFuZGxlci4gV2lsbCByZXN1bWUgYSBwYXVzZWQgdmlkZW8gaWYgdGhlIEdhbWUgaXRzZWxmIHJlc3VtZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZ2xvYmFsUmVzdW1lXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBnbG9iYWxSZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc3lzdGVtUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZGVvICYmICF0aGlzLl9jb2RlUGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBhdXNlZCBzdGF0ZSBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCB2aWRlby5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHZpZGVvIGlzIHBsYXlpbmcsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCBgdHJ1ZWAgd2lsbCBwYXVzZSBwbGF5YmFjay5cclxuICAgICAqIElmIHRoZSB2aWRlbyBpcyBwYXVzZWQsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCBgZmFsc2VgIHdpbGwgcmVzdW1lIHBsYXliYWNrLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiBubyB2aWRlbyBpcyBsb2FkZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNzZXRQYXVzZWRcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBUaGUgcGF1c2VkIHZhbHVlLiBgdHJ1ZWAgaWYgdGhlIHZpZGVvIHNob3VsZCBiZSBwYXVzZWQsIGBmYWxzZWAgdG8gcmVzdW1lIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHNldFBhdXNlZDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgdmlkZW8gPSB0aGlzLnZpZGVvO1xyXG5cclxuICAgICAgICB0aGlzLl9jb2RlUGF1c2VkID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh2aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2aWRlby5wYXVzZWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8ucGF1c2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICghdmFsdWUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh2aWRlby5wYXVzZWQgJiYgIXRoaXMuX3N5c3RlbVBhdXNlZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBkb3VibGUgaW5kaWNhdGluZyB0aGUgYXVkaW8gdm9sdW1lLCBmcm9tIDAuMCAoc2lsZW50KSB0byAxLjAgKGxvdWRlc3QpLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNnZXRWb2x1bWVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIGRvdWJsZSBpbmRpY2F0aW5nIHRoZSBhdWRpbyB2b2x1bWUsIGZyb20gMC4wIChzaWxlbnQpIHRvIDEuMCAobG91ZGVzdCkuXHJcbiAgICAgKi9cclxuICAgIGdldFZvbHVtZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudmlkZW8pID8gdGhpcy52aWRlby52b2x1bWUgOiAxO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2b2x1bWUgb2YgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHZpZGVvLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgdmFsdWUgZ2l2ZW4gaXMgYSBkb3VibGUgaW5kaWNhdGluZyB0aGUgYXVkaW8gdm9sdW1lLCBmcm9tIDAuMCAoc2lsZW50KSB0byAxLjAgKGxvdWRlc3QpLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNzZXRWb2x1bWVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIEEgZG91YmxlIGluZGljYXRpbmcgdGhlIGF1ZGlvIHZvbHVtZSwgZnJvbSAwLjAgKHNpbGVudCkgdG8gMS4wIChsb3VkZXN0KS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBWaWRlbyBHYW1lIE9iamVjdCBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICBzZXRWb2x1bWU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IDE7IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvLnZvbHVtZSA9IENsYW1wKHZhbHVlLCAwLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBkb3VibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGJlaW5nIHBsYXllZCBiYWNrLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNnZXRQbGF5YmFja1JhdGVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIGRvdWJsZSB0aGF0IGluZGljYXRlcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgaXMgYmVpbmcgcGxheWVkIGJhY2suXHJcbiAgICAgKi9cclxuICAgIGdldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudmlkZW8pID8gdGhpcy52aWRlby5wbGF5YmFja1JhdGUgOiAxO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIGN1cnJlbnQgdmlkZW8uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB2YWx1ZSBnaXZlbiBpcyBhIGRvdWJsZSB0aGF0IGluZGljYXRlcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbWVkaWEgaXMgYmVpbmcgcGxheWVkIGJhY2suXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3NldFBsYXliYWNrUmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JhdGVdIC0gQSBkb3VibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1lZGlhIGlzIGJlaW5nIHBsYXllZCBiYWNrLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFZpZGVvIEdhbWUgT2JqZWN0IGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKHJhdGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXliYWNrUmF0ZSA9IHJhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVkaWEgZWxlbWVudCBzaG91bGQgc3RhcnQgb3ZlciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jZ2V0TG9vcFxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBBIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lZGlhIGVsZW1lbnQgd2lsbCBzdGFydCBvdmVyIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRMb29wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy52aWRlbykgPyB0aGlzLnZpZGVvLmxvb3AgOiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBsb29wIHN0YXRlIG9mIHRoZSBjdXJyZW50IHZpZGVvLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgdmFsdWUgZ2l2ZW4gaXMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZWRpYSBlbGVtZW50IHdpbGwgc3RhcnQgb3ZlciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC5cclxuICAgICAqIFxyXG4gICAgICogTm90IGFsbCB2aWRlb3MgY2FuIGxvb3AsIGZvciBleGFtcGxlIGxpdmUgc3RyZWFtcy5cclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgX3NlYW1sZXNzXyB2aWRlbyBsb29waW5nIGZvciBhbGwgZW5jb2RpbmcgZm9ybWF0cy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jc2V0TG9vcFxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIEEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVkaWEgZWxlbWVudCB3aWxsIHN0YXJ0IG92ZXIgd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVmlkZW8gR2FtZSBPYmplY3QgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0TG9vcDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy52aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpZGVvIGlzIGN1cnJlbnRseSBwbGF5aW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNpc1BsYXlpbmdcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gQSBib29sZWFuIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSB2aWRlbyBpcyBwbGF5aW5nLCBvciBub3QuXHJcbiAgICAgKi9cclxuICAgIGlzUGxheWluZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudmlkZW8pID8gISh0aGlzLnZpZGVvLnBhdXNlZCB8fCB0aGlzLnZpZGVvLmVuZGVkKSA6IGZhbHNlO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlkZW8gaXMgY3VycmVudGx5IHBhdXNlZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jaXNQYXVzZWRcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gQSBib29sZWFuIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSB2aWRlbyBpcyBwYXVzZWQsIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNQYXVzZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICgodGhpcy52aWRlbyAmJiB0aGlzLnZpZGVvLnBhdXNlZCkgfHwgdGhpcy5fY29kZVBhdXNlZCB8fCB0aGlzLl9zeXN0ZW1QYXVzZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGlzIFZpZGVvIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIgdXNpbmcgdGhlIGdpdmVuIGtleSBhcyBhIGR5bmFtaWMgdGV4dHVyZSxcclxuICAgICAqIHdoaWNoIGFueSB0ZXh0dXJlLWJhc2VkIEdhbWUgT2JqZWN0LCBzdWNoIGFzIGEgU3ByaXRlLCBjYW4gdXNlIGFzIGl0cyB0ZXh0dXJlOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB2YXIgdmlkID0gdGhpcy5hZGQudmlkZW8oMCwgMCwgJ2ludHJvJyk7XHJcbiAgICAgKiBcclxuICAgICAqIHZpZC5wbGF5KCk7XHJcbiAgICAgKiBcclxuICAgICAqIHZpZC5zYXZlVGV4dHVyZSgnZG9vZGxlJyk7XHJcbiAgICAgKiBcclxuICAgICAqIHRoaXMuYWRkLmltYWdlKDQwMCwgMzAwLCAnZG9vZGxlJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVGhlIHNhdmVkIHRleHR1cmUgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkIGFzIHRoZSB2aWRlbyBwbGF5cy4gSWYgeW91IHBhdXNlIHRoaXMgdmlkZW8sXHJcbiAgICAgKiBvciBjaGFuZ2UgaXRzIHNvdXJjZSwgdGhlbiB0aGUgc2F2ZWQgdGV4dHVyZSB1cGRhdGVzIGluc3RhbnRseS5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyBgc2F2ZVRleHR1cmVgIGFnYWluIHdpbGwgbm90IHNhdmUgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHRleHR1cmUsIGl0IHdpbGwganVzdCByZW5hbWUgdGhlIGV4aXN0aW5nIG9uZS5cclxuICAgICAqIFxyXG4gICAgICogQnkgZGVmYXVsdCBpdCB3aWxsIGNyZWF0ZSBhIHNpbmdsZSBiYXNlIHRleHR1cmUuIFlvdSBjYW4gYWRkIGZyYW1lcyB0byB0aGUgdGV4dHVyZVxyXG4gICAgICogYnkgdXNpbmcgdGhlIGBUZXh0dXJlLmFkZGAgbWV0aG9kLiBBZnRlciBkb2luZyB0aGlzLCB5b3UgY2FuIHRoZW4gYWxsb3cgR2FtZSBPYmplY3RzXHJcbiAgICAgKiB0byB1c2UgYSBzcGVjaWZpYyBmcmFtZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGludGVuZCB0byBzYXZlIHRoZSB0ZXh0dXJlIHNvIHlvdSBjYW4gdXNlIGl0IGFzIHRoZSBpbnB1dCBmb3IgYSBTaGFkZXIsIHlvdSBtYXkgbmVlZCB0byBzZXQgdGhlXHJcbiAgICAgKiBgZmxpcFlgIHBhcmFtZXRlciB0byBgdHJ1ZWAgaWYgeW91IGZpbmQgdGhlIHZpZGVvIHJlbmRlcnMgdXBzaWRlIGRvd24gaW4geW91ciBzaGFkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW8jc2F2ZVRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBrZXkgdG8gc3RvcmUgdGhlIHRleHR1cmUgYXMgd2l0aGluIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxpcFk9ZmFsc2VdIC0gU2hvdWxkIHRoZSBXZWJHTCBUZXh0dXJlIHNldCBgVU5QQUNLX01VTFRJUExZX0ZMSVBfWWAgZHVyaW5nIHVwbG9hZD9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgc2F2ZWQuXHJcbiAgICAgKi9cclxuICAgIHNhdmVUZXh0dXJlOiBmdW5jdGlvbiAoa2V5LCBmbGlwWSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZmxpcFkgPT09IHVuZGVmaW5lZCkgeyBmbGlwWSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZGVvVGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLnJlbmFtZVRleHR1cmUodGhpcy5fa2V5LCBrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xyXG5cclxuICAgICAgICB0aGlzLmZsaXBZID0gZmxpcFk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZGVvVGV4dHVyZVNvdXJjZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9UZXh0dXJlU291cmNlLnNldEZsaXBZKGZsaXBZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvVGV4dHVyZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGUgdmlkZW8gcGxheWluZyBhbmQgY2xlYXJzIGFsbCBpbnRlcm5hbCBldmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IG9ubHkgd2lzaCB0byBwYXVzZSBwbGF5YmFjayBvZiB0aGUgdmlkZW8sIGFuZCByZXN1bWUgaXQgYSBsYXRlciB0aW1lLCB1c2UgdGhlIGBWaWRlby5wYXVzZWAgbWV0aG9kIGluc3RlYWQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSB2aWRlbyBoYXNuJ3QgZmluaXNoZWQgZG93bmxvYWRpbmcsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWJvcnQgdGhlIGRvd25sb2FkLiBUbyBkbyB0aGF0IHlvdSBuZWVkIHRvXHJcbiAgICAgKiBjYWxsIGBkZXN0cm95YCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3N0b3BcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuR2FtZU9iamVjdHMuRXZlbnRzI1ZJREVPX1NUT1BcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBWaWRlbyBHYW1lIE9iamVjdCBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMudmlkZW87XHJcblxyXG4gICAgICAgIGlmICh2aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBjYWxsYmFjayBpbiBjYWxsYmFja3MpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoY2FsbGJhY2ssIGNhbGxiYWNrc1tjYWxsYmFja10sIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2aWRlby5wYXVzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JldHJ5SUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3JldHJ5SUQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5WSURFT19TVE9QLCB0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgVmlkZW8gZWxlbWVudCBmcm9tIHRoZSBET00gYnkgY2FsbGluZyBwYXJlbnROb2RlLnJlbW92ZUNoaWxkIG9uIGl0c2VsZi5cclxuICAgICAqIFxyXG4gICAgICogQWxzbyByZW1vdmVzIHRoZSBhdXRvcGxheSBhbmQgc3JjIGF0dHJpYnV0ZXMgYW5kIG51bGxzIHRoZSBWaWRlbyByZWZlcmVuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QgaWYgeW91IHdlcmUgcGxheWluZyBhIHZpZGVvIGZyb20gdGhlIFZpZGVvIENhY2hlIHRoYXRcclxuICAgICAqIHlvdSB3aXNoIHRvIHBsYXkgYWdhaW4gaW4geW91ciBnYW1lLCBvciBpZiBhbm90aGVyIFZpZGVvIG9iamVjdCBpcyBhbHNvIHVzaW5nIHRoZSBzYW1lXHJcbiAgICAgKiB2aWRlby5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGxvYWRlZCBhbiBleHRlcm5hbCB2aWRlbyB2aWEgYFZpZGVvLmxvYWRVUkxgIHRoZW4geW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb25cclxuICAgICAqIHRvIGNsZWFyIHVwIG9uY2UgeW91IGFyZSBkb25lIHdpdGggdGhlIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvI3JlbW92ZVZpZGVvRWxlbWVudFxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICByZW1vdmVWaWRlb0VsZW1lbnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZpZGVvID0gdGhpcy52aWRlbztcclxuXHJcbiAgICAgICAgaWYgKCF2aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWRlby5wYXJlbnROb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmlkZW8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAodmlkZW8uaGFzQ2hpbGROb2RlcygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmlkZW8ucmVtb3ZlQ2hpbGQodmlkZW8uZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2aWRlby5yZW1vdmVBdHRyaWJ1dGUoJ2F1dG9wbGF5Jyk7XHJcbiAgICAgICAgdmlkZW8ucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWRlbyA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB0aGUgcHJlLWRlc3Ryb3kgc3RlcCBmb3IgdGhlIFZpZGVvIG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBjYWxscyBgVmlkZW8uc3RvcGAgYW5kIG9wdGlvbmFsbHkgYFZpZGVvLnJlbW92ZVZpZGVvRWxlbWVudGAuXHJcbiAgICAgKiBcclxuICAgICAqIElmIGFueSBTcHJpdGVzIGFyZSB1c2luZyB0aGlzIFZpZGVvIGFzIHRoZWlyIHRleHR1cmUgaXQgaXMgdXAgdG8geW91IHRvIG1hbmFnZSB0aG9zZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNwcmVEZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICovXHJcbiAgICBwcmVEZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZW1vdmVWaWRlb0VsZW1lbnRPbkRlc3Ryb3kpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVZpZGVvRWxlbWVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdhbWUgPSB0aGlzLnNjZW5lLnN5cy5nYW1lLmV2ZW50cztcclxuXHJcbiAgICAgICAgZ2FtZS5vZmYoR2FtZUV2ZW50cy5QQVVTRSwgdGhpcy5nbG9iYWxQYXVzZSwgdGhpcyk7XHJcbiAgICAgICAgZ2FtZS5vZmYoR2FtZUV2ZW50cy5SRVNVTUUsIHRoaXMuZ2xvYmFsUmVzdW1lLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIHNvdW5kID0gdGhpcy5zY2VuZS5zeXMuc291bmQ7XHJcblxyXG4gICAgICAgIGlmIChzb3VuZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNvdW5kLm9mZihTb3VuZEV2ZW50cy5HTE9CQUxfTVVURSwgdGhpcy5nbG9iYWxNdXRlLCB0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUlEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9yZXRyeUlEKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVmlkZW87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMjAuMFxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW99IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBWaWRlb0NhbnZhc1JlbmRlcmVyID0gZnVuY3Rpb24gKHJlbmRlcmVyLCBzcmMsIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgaWYgKHNyYy52aWRlb1RleHR1cmUpXHJcbiAgICB7XHJcbiAgICAgICAgcmVuZGVyZXIuYmF0Y2hTcHJpdGUoc3JjLCBzcmMuZnJhbWUsIGNhbWVyYSwgcGFyZW50TWF0cml4KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVmlkZW9DYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQnVpbGRHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi4vQnVpbGRHYW1lT2JqZWN0Jyk7XHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIFZpZGVvID0gcmVxdWlyZSgnLi9WaWRlbycpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgVmlkZW8gR2FtZSBPYmplY3QgYW5kIHJldHVybnMgaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFZpZGVvIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvciN2aWRlb1xyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byBjcmVhdGUgaXRzZWxmLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1NjZW5lXSAtIEFkZCB0aGlzIEdhbWUgT2JqZWN0IHRvIHRoZSBTY2VuZSBhZnRlciBjcmVhdGluZyBpdD8gSWYgc2V0IHRoaXMgYXJndW1lbnQgb3ZlcnJpZGVzIHRoZSBgYWRkYCBwcm9wZXJ0eSBpbiB0aGUgY29uZmlnIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLlZpZGVvfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCd2aWRlbycsIGZ1bmN0aW9uIChjb25maWcsIGFkZFRvU2NlbmUpXHJcbntcclxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgIHZhciBrZXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2tleScsIG51bGwpO1xyXG5cclxuICAgIHZhciB2aWRlbyA9IG5ldyBWaWRlbyh0aGlzLnNjZW5lLCAwLCAwLCBrZXkpO1xyXG5cclxuICAgIGlmIChhZGRUb1NjZW5lICE9PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgY29uZmlnLmFkZCA9IGFkZFRvU2NlbmU7XHJcbiAgICB9XHJcblxyXG4gICAgQnVpbGRHYW1lT2JqZWN0KHRoaXMuc2NlbmUsIHZpZGVvLCBjb25maWcpO1xyXG5cclxuICAgIHJldHVybiB2aWRlbztcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdENyZWF0b3IgY29udGV4dC5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVmlkZW8gPSByZXF1aXJlKCcuL1ZpZGVvJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBWaWRlbyBHYW1lIE9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgU2NlbmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFZpZGVvIEdhbWUgT2JqZWN0IGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSN2aWRlb1xyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBPcHRpb25hbCBrZXkgb2YgdGhlIFZpZGVvIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCBwbGF5LCBhcyBzdG9yZWQgaW4gdGhlIFZpZGVvIENhY2hlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuVmlkZW99IFRoZSBHYW1lIE9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3ZpZGVvJywgZnVuY3Rpb24gKHgsIHksIGtleSlcclxue1xyXG4gICAgdmFyIHZpZGVvID0gbmV3IFZpZGVvKHRoaXMuc2NlbmUsIHgsIHksIGtleSk7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5TGlzdC5hZGQodmlkZW8pO1xyXG4gICAgdGhpcy51cGRhdGVMaXN0LmFkZCh2aWRlbyk7XHJcblxyXG4gICAgcmV0dXJuIHZpZGVvO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0RmFjdG9yeSBjb250ZXh0LlxyXG4vL1xyXG4vLyAgVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gdXNlOlxyXG4vL1xyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHJlbmRlcldlYkdMID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuaWYgKHR5cGVvZiBXRUJHTF9SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuL1ZpZGVvV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9WaWRlb0NhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXJzIHRoaXMgR2FtZSBPYmplY3Qgd2l0aCB0aGUgV2ViR0wgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5WaWRlbyNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIFdlYkdMIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5WaWRlb30gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhpcyB0cmFuc2Zvcm0gbWF0cml4IGlzIGRlZmluZWQgaWYgdGhlIGdhbWUgb2JqZWN0IGlzIG5lc3RlZFxyXG4gKi9cclxudmFyIFZpZGVvV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIGlmIChzcmMudmlkZW9UZXh0dXJlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGlwZWxpbmUuYmF0Y2hTcHJpdGUoc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvV2ViR0xSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmxlbmRNb2RlcyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL0JsZW5kTW9kZXMnKTtcclxudmFyIENpcmNsZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vY2lyY2xlL0NpcmNsZScpO1xyXG52YXIgQ2lyY2xlQ29udGFpbnMgPSByZXF1aXJlKCcuLi8uLi9nZW9tL2NpcmNsZS9Db250YWlucycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi9HYW1lT2JqZWN0Jyk7XHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi8uLi9nZW9tL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxudmFyIFJlY3RhbmdsZUNvbnRhaW5zID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvQ29udGFpbnMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgWm9uZSBHYW1lIE9iamVjdC5cclxuICpcclxuICogQSBab25lIGlzIGEgbm9uLXJlbmRlcmluZyByZWN0YW5ndWxhciBHYW1lIE9iamVjdCB0aGF0IGhhcyBhIHBvc2l0aW9uIGFuZCBzaXplLlxyXG4gKiBJdCBoYXMgbm8gdGV4dHVyZSBhbmQgbmV2ZXIgZGlzcGxheXMsIGJ1dCBkb2VzIGxpdmUgb24gdGhlIGRpc3BsYXkgbGlzdCBhbmRcclxuICogY2FuIGJlIG1vdmVkLCBzY2FsZWQgYW5kIHJvdGF0ZWQgbGlrZSBhbnkgb3RoZXIgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEl0cyBwcmltYXJ5IHVzZSBpcyBmb3IgY3JlYXRpbmcgRHJvcCBab25lcyBhbmQgSW5wdXQgSGl0IEFyZWFzIGFuZCBpdCBoYXMgYSBjb3VwbGUgb2YgaGVscGVyIG1ldGhvZHNcclxuICogc3BlY2lmaWNhbGx5IGZvciB0aGlzLiBJdCBpcyBhbHNvIHVzZWZ1bCBmb3Igb2JqZWN0IG92ZXJsYXAgY2hlY2tzLCBvciBhcyBhIGJhc2UgZm9yIHlvdXIgb3duXHJcbiAqIG5vbi1kaXNwbGF5aW5nIEdhbWUgT2JqZWN0cy5cclxuXHJcbiAqIFRoZSBkZWZhdWx0IG9yaWdpbiBpcyAwLjUsIHRoZSBjZW50ZXIgb2YgdGhlIFpvbmUsIHRoZSBzYW1lIGFzIHdpdGggR2FtZSBPYmplY3RzLlxyXG4gKlxyXG4gKiBAY2xhc3MgWm9uZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdhbWVPYmplY3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuR2V0Qm91bmRzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIFpvbmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdhbWVPYmplY3QsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5EZXB0aCxcclxuICAgICAgICBDb21wb25lbnRzLkdldEJvdW5kcyxcclxuICAgICAgICBDb21wb25lbnRzLk9yaWdpbixcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlNjcm9sbEZhY3RvcixcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGVcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBab25lIChzY2VuZSwgeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDE7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5jYWxsKHRoaXMsIHNjZW5lLCAnWm9uZScpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmF0aXZlICh1bi1zY2FsZWQpIHdpZHRoIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuWm9uZSN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmF0aXZlICh1bi1zY2FsZWQpIGhlaWdodCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlpvbmUjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEJsZW5kIE1vZGUgb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIEFsdGhvdWdoIGEgWm9uZSBuZXZlciByZW5kZXJzLCBpdCBzdGlsbCBoYXMgYSBibGVuZCBtb2RlIHRvIGFsbG93IGl0IHRvIGZpdCBzZWFtbGVzc2x5IGludG9cclxuICAgICAgICAgKiBkaXNwbGF5IGxpc3RzIHdpdGhvdXQgY2F1c2luZyBhIGJhdGNoIGZsdXNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdhbWVPYmplY3RzLlpvbmUjYmxlbmRNb2RlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSBCbGVuZE1vZGVzLk5PUk1BTDtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5T3JpZ2luKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpc3BsYXllZCB3aWR0aCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogVGhpcyB2YWx1ZSB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNjYWxlIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2FtZU9iamVjdHMuWm9uZSNkaXNwbGF5V2lkdGhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGlzcGxheVdpZHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxlWCAqIHRoaXMud2lkdGg7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHZhbHVlIC8gdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkaXNwbGF5ZWQgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBUaGlzIHZhbHVlIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2NhbGUgZmFjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI2Rpc3BsYXlIZWlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGlzcGxheUhlaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZVkgKiB0aGlzLmhlaWdodDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gdmFsdWUgLyB0aGlzLmhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3NldFNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2l6ZUlucHV0PXRydWVdIC0gSWYgdGhpcyBab25lIGhhcyBhIFJlY3RhbmdsZSBmb3IgYSBoaXQgYXJlYSB0aGlzIGFyZ3VtZW50IHdpbGwgcmVzaXplIHRoZSBoaXQgYXJlYSBhcyB3ZWxsLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCByZXNpemVJbnB1dClcclxuICAgIHtcclxuICAgICAgICBpZiAocmVzaXplSW5wdXQgPT09IHVuZGVmaW5lZCkgeyByZXNpemVJbnB1dCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlPcmlnaW4oKTtcclxuXHJcbiAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKHJlc2l6ZUlucHV0ICYmIGlucHV0ICYmICFpbnB1dC5jdXN0b21IaXRBcmVhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaW5wdXQuaGl0QXJlYS53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICBpbnB1dC5oaXRBcmVhLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRpc3BsYXkgc2l6ZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQ2FsbGluZyB0aGlzIHdpbGwgYWRqdXN0IHRoZSBzY2FsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3NldERpc3BsYXlTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RGlzcGxheVNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5SGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgWm9uZSB0byBiZSBhIENpcmN1bGFyIERyb3AgWm9uZS5cclxuICAgICAqIFRoZSBjaXJjbGUgaXMgY2VudGVyZWQgb24gdGhpcyBab25lcyBgeGAgYW5kIGB5YCBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3NldENpcmNsZURyb3Bab25lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgQ2lyY2xlIHRoYXQgd2lsbCBmb3JtIHRoZSBEcm9wIFpvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q2lyY2xlRHJvcFpvbmU6IGZ1bmN0aW9uIChyYWRpdXMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RHJvcFpvbmUobmV3IENpcmNsZSgwLCAwLCByYWRpdXMpLCBDaXJjbGVDb250YWlucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIFpvbmUgdG8gYmUgYSBSZWN0YW5nbGUgRHJvcCBab25lLlxyXG4gICAgICogVGhlIHJlY3RhbmdsZSBpcyBjZW50ZXJlZCBvbiB0aGlzIFpvbmVzIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlpvbmUjc2V0UmVjdGFuZ2xlRHJvcFpvbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIGRyb3Agem9uZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZHJvcCB6b25lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFJlY3RhbmdsZURyb3Bab25lOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXREcm9wWm9uZShuZXcgUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpLCBSZWN0YW5nbGVDb250YWlucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxsb3dzIHlvdSB0byBkZWZpbmUgeW91ciBvd24gR2VvbWV0cnkgc2hhcGUgdG8gYmUgdXNlZCBhcyBhIERyb3AgWm9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3NldERyb3Bab25lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc2hhcGUgLSBBIEdlb21ldHJ5IHNoYXBlIGluc3RhbmNlLCBzdWNoIGFzIFBoYXNlci5HZW9tLkVsbGlwc2UsIG9yIHlvdXIgb3duIGN1c3RvbSBzaGFwZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkhpdEFyZWFDYWxsYmFja30gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiB4L3kgY29vcmRzIGl0IGlzIHNlbnQgYXJlIHdpdGhpbiB0aGUgc2hhcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RHJvcFpvbmU6IGZ1bmN0aW9uIChzaGFwZSwgY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNoYXBlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFJlY3RhbmdsZURyb3Bab25lKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuaW5wdXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEludGVyYWN0aXZlKHNoYXBlLCBjYWxsYmFjaywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIE5PT1AgbWV0aG9kIHNvIHlvdSBjYW4gcGFzcyBhIFpvbmUgdG8gYSBDb250YWluZXIuXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy4gSXQgaXMgaW50ZW50aW9uYWxseSBlbXB0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3NldEFscGhhXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBzZXRBbHBoYTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgIH0sXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQSBOT09QIG1ldGhvZCBzbyB5b3UgY2FuIHBhc3MgYSBab25lIHRvIGEgQ29udGFpbmVyIGluIENhbnZhcy5cclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLiBJdCBpcyBpbnRlbnRpb25hbGx5IGVtcHR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLlpvbmUjc2V0QmxlbmRNb2RlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICovXHJcbiAgICBzZXRCbGVuZE1vZGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBab25lIGRvZXMgbm90IHJlbmRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3JlbmRlckNhbnZhc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZW5kZXJDYW52YXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBab25lIGRvZXMgbm90IHJlbmRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5ab25lI3JlbmRlcldlYkdMXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlbmRlcldlYkdMOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFpvbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RDcmVhdG9yID0gcmVxdWlyZSgnLi4vR2FtZU9iamVjdENyZWF0b3InKTtcclxudmFyIEdldEFkdmFuY2VkVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0QWR2YW5jZWRWYWx1ZScpO1xyXG52YXIgWm9uZSA9IHJlcXVpcmUoJy4vWm9uZScpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgWm9uZSBHYW1lIE9iamVjdCBhbmQgcmV0dXJucyBpdC5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgWm9uZSBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3Ijem9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIGNyZWF0ZSBpdHNlbGYuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5ab25lfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RDcmVhdG9yLnJlZ2lzdGVyKCd6b25lJywgZnVuY3Rpb24gKGNvbmZpZylcclxue1xyXG4gICAgdmFyIHggPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3gnLCAwKTtcclxuICAgIHZhciB5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd5JywgMCk7XHJcbiAgICB2YXIgd2lkdGggPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ3dpZHRoJywgMSk7XHJcbiAgICB2YXIgaGVpZ2h0ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdoZWlnaHQnLCB3aWR0aCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBab25lKHRoaXMuc2NlbmUsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG59KTtcclxuXHJcbi8vICBXaGVuIHJlZ2lzdGVyaW5nIGEgZmFjdG9yeSBmdW5jdGlvbiAndGhpcycgcmVmZXJzIHRvIHRoZSBHYW1lT2JqZWN0Q3JlYXRvciBjb250ZXh0LlxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBab25lID0gcmVxdWlyZSgnLi9ab25lJyk7XHJcbnZhciBHYW1lT2JqZWN0RmFjdG9yeSA9IHJlcXVpcmUoJy4uL0dhbWVPYmplY3RGYWN0b3J5Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBab25lIEdhbWUgT2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBTY2VuZS5cclxuICpcclxuICogTm90ZTogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgWm9uZSBHYW1lIE9iamVjdCBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdEZhY3Rvcnkjem9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5ab25lfSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbkdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKCd6b25lJywgZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbntcclxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmFkZChuZXcgWm9uZSh0aGlzLnNjZW5lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7XHJcbn0pO1xyXG5cclxuLy8gIFdoZW4gcmVnaXN0ZXJpbmcgYSBmYWN0b3J5IGZ1bmN0aW9uICd0aGlzJyByZWZlcnMgdG8gdGhlIEdhbWVPYmplY3RGYWN0b3J5IGNvbnRleHQuXHJcbi8vICBcclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy8gIFxyXG4vLyAgdGhpcy5zY2VuZSAtIGEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIEdhbWVPYmplY3RGYWN0b3J5XHJcbi8vICB0aGlzLmRpc3BsYXlMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIERpc3BsYXkgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4vLyAgdGhpcy51cGRhdGVMaXN0IC0gYSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFyZWEgb2YgdGhlIGNpcmNsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5BcmVhXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBnZXQgdGhlIGFyZWEgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWEgb2YgdGhlIENpcmNsZS5cclxuICovXHJcbnZhciBBcmVhID0gZnVuY3Rpb24gKGNpcmNsZSlcclxue1xyXG4gICAgcmV0dXJuIChjaXJjbGUucmFkaXVzID4gMCkgPyBNYXRoLlBJICogY2lyY2xlLnJhZGl1cyAqIGNpcmNsZS5yYWRpdXMgOiAwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBcmVhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb250YWlucyA9IHJlcXVpcmUoJy4vQ29udGFpbnMnKTtcclxudmFyIEdldFBvaW50ID0gcmVxdWlyZSgnLi9HZXRQb2ludCcpO1xyXG52YXIgR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxudmFyIEdFT01fQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgUmFuZG9tID0gcmVxdWlyZSgnLi9SYW5kb20nKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgQ2lyY2xlIG9iamVjdC5cclxuICpcclxuICogVGhpcyBpcyBhIGdlb21ldHJ5IG9iamVjdCwgY29udGFpbmluZyBudW1lcmljYWwgdmFsdWVzIGFuZCByZWxhdGVkIG1ldGhvZHMgdG8gaW5zcGVjdCBhbmQgbW9kaWZ5IHRoZW0uXHJcbiAqIEl0IGlzIG5vdCBhIEdhbWUgT2JqZWN0LCBpbiB0aGF0IHlvdSBjYW5ub3QgYWRkIGl0IHRvIHRoZSBkaXNwbGF5IGxpc3QsIGFuZCBpdCBoYXMgbm8gdGV4dHVyZS5cclxuICogVG8gcmVuZGVyIGEgQ2lyY2xlIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBHcmFwaGljcyBjbGFzcy5cclxuICpcclxuICogQGNsYXNzIENpcmNsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdlb21cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gLSBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuXHJcbiAqL1xyXG52YXIgQ2lyY2xlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENpcmNsZSAoeCwgeSwgcmFkaXVzKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHJhZGl1cyA9PT0gdW5kZWZpbmVkKSB7IHJhZGl1cyA9IDA7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdlb21ldHJ5IGNvbnN0YW50IHR5cGUgb2YgdGhpcyBvYmplY3Q6IGBHRU9NX0NPTlNULkNJUkNMRWAuXHJcbiAgICAgICAgICogVXNlZCBmb3IgZmFzdCB0eXBlIGNvbXBhcmlzb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uQ2lyY2xlI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gR0VPTV9DT05TVC5DSVJDTEU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkNpcmNsZSN4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uQ2lyY2xlI3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW50ZXJuYWwgcmFkaXVzIG9mIHRoZSBjaXJjbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5DaXJjbGUjX3JhZGl1c1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yYWRpdXMgPSByYWRpdXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbnRlcm5hbCBkaWFtZXRlciBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uQ2lyY2xlI19kaWFtZXRlclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kaWFtZXRlciA9IHJhZGl1cyAqIDI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBDaXJjbGUgY29udGFpbnMgdGhlIGdpdmVuIHggLyB5IGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uQ2lyY2xlI2NvbnRhaW5zXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgY2lyY2xlLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQ29udGFpbnModGhpcywgeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIFBvaW50IG9iamVjdCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IG9uIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBDaXJjbGVcclxuICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmdsZSBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuIEkuZS4gYSB2YWx1ZSBvZiAwLjUgd2lsbCBnaXZlIHRoZSBwb2ludFxyXG4gICAgICogYXQgMTgwIGRlZ3JlZXMgYXJvdW5kIHRoZSBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5DaXJjbGUjZ2V0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gLSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgd2hlcmUgMCBlcXVhbHMgMCBkZWdyZWVzLCAwLjUgZXF1YWxzIDE4MCBkZWdyZWVzIGFuZCAxIGVxdWFscyAzNjAgYXJvdW5kIHRoZSBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlcyBpbi4gSWYgbm90IGdpdmVuIGEgUG9pbnQgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gQSBQb2ludCwgb3IgcG9pbnQtbGlrZSBvYmplY3QsIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludCBhcm91bmQgdGhlIGNpcmNsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uIChwb3NpdGlvbiwgcG9pbnQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdldFBvaW50KHRoaXMsIHBvc2l0aW9uLCBwb2ludCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBDaXJjbGUsXHJcbiAgICAgKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVhbnRpdHkgb3Igc3RlcFJhdGUgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uQ2lyY2xlI2dldFBvaW50c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50W119IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBhbW91bnQgb2YgcG9pbnRzIHRvIHJldHVybi4gSWYgYSBmYWxzZXkgdmFsdWUgdGhlIHF1YW50aXR5IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBSYXRlXSAtIFNldHMgdGhlIHF1YW50aXR5IGJ5IGdldHRpbmcgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNpcmNsZSBhbmQgZGl2aWRpbmcgaXQgYnkgdGhlIHN0ZXBSYXRlLlxyXG4gICAgICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gaW5zZXJ0IHRoZSBwb2ludHMgaW4gdG8uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBBbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIHBlcnRhaW5pbmcgdG8gdGhlIHBvaW50cyBhcm91bmQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNpcmNsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRzOiBmdW5jdGlvbiAocXVhbnRpdHksIHN0ZXBSYXRlLCBvdXRwdXQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdldFBvaW50cyh0aGlzLCBxdWFudGl0eSwgc3RlcFJhdGUsIG91dHB1dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gcG9pbnQgZnJvbSBhbnl3aGVyZSB3aXRoaW4gdGhlIENpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkNpcmNsZSNnZXRSYW5kb21Qb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW3BvaW50LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW3BvaW50XSAtIEEgUG9pbnQgb3IgcG9pbnQtbGlrZSBvYmplY3QgdG8gc2V0IHRoZSByYW5kb20gYHhgIGFuZCBgeWAgdmFsdWVzIGluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50IG9iamVjdCB3aXRoIHRoZSByYW5kb20gdmFsdWVzIHNldCBpbiB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmFuZG9tUG9pbnQ6IGZ1bmN0aW9uIChwb2ludClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gUmFuZG9tKHRoaXMsIHBvaW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB4LCB5IGFuZCByYWRpdXMgb2YgdGhpcyBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5DaXJjbGUjc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTBdIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2lyY2xlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VG86IGZ1bmN0aW9uICh4LCB5LCByYWRpdXMpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG4gICAgICAgIHRoaXMuX3JhZGl1cyA9IHJhZGl1cztcclxuICAgICAgICB0aGlzLl9kaWFtZXRlciA9IHJhZGl1cyAqIDI7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBDaXJjbGUgdG8gYmUgZW1wdHkgd2l0aCBhIHJhZGl1cyBvZiB6ZXJvLlxyXG4gICAgICogRG9lcyBub3QgY2hhbmdlIGl0cyBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkNpcmNsZSNzZXRFbXB0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDaXJjbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRFbXB0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9yYWRpdXMgPSAwO1xyXG4gICAgICAgIHRoaXMuX2RpYW1ldGVyID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBDaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5DaXJjbGUjc2V0UG9zaXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENpcmNsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgQ2lyY2xlIGlzIGVtcHR5OiBoYXMgYSByYWRpdXMgb2YgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkNpcmNsZSNpc0VtcHR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBDaXJjbGUgaXMgZW1wdHksIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgaXNFbXB0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuX3JhZGl1cyA8PSAwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFkaXVzIG9mIHRoZSBDaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uQ2lyY2xlI3JhZGl1c1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByYWRpdXM6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGl1cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JhZGl1cyA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9kaWFtZXRlciA9IHZhbHVlICogMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkaWFtZXRlciBvZiB0aGUgQ2lyY2xlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkNpcmNsZSNkaWFtZXRlclxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkaWFtZXRlcjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlhbWV0ZXI7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9kaWFtZXRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9yYWRpdXMgPSB2YWx1ZSAqIDAuNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBDaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uQ2lyY2xlI2xlZnRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgbGVmdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy54IC0gdGhpcy5fcmFkaXVzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gdmFsdWUgKyB0aGlzLl9yYWRpdXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmlnaHQgcG9zaXRpb24gb2YgdGhlIENpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5DaXJjbGUjcmlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueCArIHRoaXMuX3JhZGl1cztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHZhbHVlIC0gdGhpcy5fcmFkaXVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgQ2lyY2xlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkNpcmNsZSN0b3BcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgLSB0aGlzLl9yYWRpdXM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB2YWx1ZSArIHRoaXMuX3JhZGl1cztcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIENpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5DaXJjbGUjYm90dG9tXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJvdHRvbToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55ICsgdGhpcy5fcmFkaXVzO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy55ID0gdmFsdWUgLSB0aGlzLl9yYWRpdXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDaXJjbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGdpdmVuIENpcmNsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5DaXJjdW1mZXJlbmNlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBnZXQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIENpcmNsZS5cclxuICovXHJcbnZhciBDaXJjdW1mZXJlbmNlID0gZnVuY3Rpb24gKGNpcmNsZSlcclxue1xyXG4gICAgcmV0dXJuIDIgKiAoTWF0aC5QSSAqIGNpcmNsZS5yYWRpdXMpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDaXJjdW1mZXJlbmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIFBvaW50IG9iamVjdCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IG9uIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBDaXJjbGUgYmFzZWQgb24gdGhlIGdpdmVuIGFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLkNpcmN1bWZlcmVuY2VQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBnZXQgdGhlIGNpcmN1bWZlcmVuY2UgcG9pbnQgb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIENpcmNsZSB0byB0aGUgY2lyY3VtZmVyZW5jZSB0byByZXR1cm4gdGhlIHBvaW50IGZyb20uIEdpdmVuIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQSBQb2ludCwgb3IgcG9pbnQtbGlrZSBvYmplY3QsIHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLiBJZiBub3QgZ2l2ZW4gYSBQb2ludCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50IG9iamVjdCB3aGVyZSB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcyBhcmUgdGhlIHBvaW50IG9uIHRoZSBjaXJjdW1mZXJlbmNlLlxyXG4gKi9cclxudmFyIENpcmN1bWZlcmVuY2VQb2ludCA9IGZ1bmN0aW9uIChjaXJjbGUsIGFuZ2xlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIG91dC54ID0gY2lyY2xlLnggKyAoY2lyY2xlLnJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKSk7XHJcbiAgICBvdXQueSA9IGNpcmNsZS55ICsgKGNpcmNsZS5yYWRpdXMgKiBNYXRoLnNpbihhbmdsZSkpO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENpcmN1bWZlcmVuY2VQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2lyY2xlID0gcmVxdWlyZSgnLi9DaXJjbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IENpcmNsZSBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gc291cmNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLkNsb25lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5DaXJjbGV8b2JqZWN0KX0gc291cmNlIC0gVGhlIENpcmNsZSB0byBiZSBjbG9uZWQuIENhbiBiZSBhbiBpbnN0YW5jZSBvZiBhIENpcmNsZSBvciBhIGNpcmNsZS1saWtlIG9iamVjdCwgd2l0aCB4LCB5IGFuZCByYWRpdXMgcHJvcGVydGllcy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uQ2lyY2xlfSBBIGNsb25lIG9mIHRoZSBzb3VyY2UgQ2lyY2xlLlxyXG4gKi9cclxudmFyIENsb25lID0gZnVuY3Rpb24gKHNvdXJjZSlcclxue1xyXG4gICAgcmV0dXJuIG5ldyBDaXJjbGUoc291cmNlLngsIHNvdXJjZS55LCBzb3VyY2UucmFkaXVzKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2xvbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgQ2lyY2xlIGNvbnRhaW5zIHRoZSBnaXZlbiB4IC8geSBjb29yZGluYXRlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5Db250YWluc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjaGVjayB3aXRoaW4gdGhlIGNpcmNsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNoZWNrIHdpdGhpbiB0aGUgY2lyY2xlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSBjaXJjbGUsIG90aGVyd2lzZSBmYWxzZS5cclxuICovXHJcbnZhciBDb250YWlucyA9IGZ1bmN0aW9uIChjaXJjbGUsIHgsIHkpXHJcbntcclxuICAgIC8vICBDaGVjayBpZiB4L3kgYXJlIHdpdGhpbiB0aGUgYm91bmRzIGZpcnN0XHJcbiAgICBpZiAoY2lyY2xlLnJhZGl1cyA+IDAgJiYgeCA+PSBjaXJjbGUubGVmdCAmJiB4IDw9IGNpcmNsZS5yaWdodCAmJiB5ID49IGNpcmNsZS50b3AgJiYgeSA8PSBjaXJjbGUuYm90dG9tKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IChjaXJjbGUueCAtIHgpICogKGNpcmNsZS54IC0geCk7XHJcbiAgICAgICAgdmFyIGR5ID0gKGNpcmNsZS55IC0geSkgKiAoY2lyY2xlLnkgLSB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChkeCArIGR5KSA8PSAoY2lyY2xlLnJhZGl1cyAqIGNpcmNsZS5yYWRpdXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIHRvIHNlZSBpZiB0aGUgQ2lyY2xlIGNvbnRhaW5zIHRoZSBnaXZlbiBQb2ludCBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5DaXJjbGUuQ29udGFpbnNQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IHBvaW50IC0gVGhlIFBvaW50IG9iamVjdCB0byBjaGVjayBpZiBpdCdzIHdpdGhpbiB0aGUgQ2lyY2xlIG9yIG5vdC5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgUG9pbnQgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgY2lyY2xlLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAqL1xyXG52YXIgQ29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIChjaXJjbGUsIHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gQ29udGFpbnMoY2lyY2xlLCBwb2ludC54LCBwb2ludC55KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnNQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBDaXJjbGUgY29udGFpbnMgYWxsIGZvdXIgcG9pbnRzIG9mIHRoZSBnaXZlbiBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLkNvbnRhaW5zUmVjdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlJlY3RhbmdsZXxvYmplY3QpfSByZWN0IC0gVGhlIFJlY3RhbmdsZSBvYmplY3QgdG8gY2hlY2sgaWYgaXQncyB3aXRoaW4gdGhlIENpcmNsZSBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYWxsIG9mIHRoZSBSZWN0YW5nbGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgY2lyY2xlLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAqL1xyXG52YXIgQ29udGFpbnNSZWN0ID0gZnVuY3Rpb24gKGNpcmNsZSwgcmVjdClcclxue1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICBDb250YWlucyhjaXJjbGUsIHJlY3QueCwgcmVjdC55KSAmJlxyXG4gICAgICAgIENvbnRhaW5zKGNpcmNsZSwgcmVjdC5yaWdodCwgcmVjdC55KSAmJlxyXG4gICAgICAgIENvbnRhaW5zKGNpcmNsZSwgcmVjdC54LCByZWN0LmJvdHRvbSkgJiZcclxuICAgICAgICBDb250YWlucyhjaXJjbGUsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKVxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnNSZWN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb3BpZXMgdGhlIGB4YCwgYHlgIGFuZCBgcmFkaXVzYCBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzb3VyY2VgIENpcmNsZVxyXG4gKiBpbnRvIHRoZSBnaXZlbiBgZGVzdGAgQ2lyY2xlLCB0aGVuIHJldHVybnMgdGhlIGBkZXN0YCBDaXJjbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5DaXJjbGUuQ29weUZyb21cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5DaXJjbGV9IE8gLSBbZGVzdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gc291cmNlIC0gVGhlIHNvdXJjZSBDaXJjbGUgdG8gY29weSB0aGUgdmFsdWVzIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBkZXN0IC0gVGhlIGRlc3RpbmF0aW9uIENpcmNsZSB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkNpcmNsZX0gVGhlIGRlc3RpbmF0aW9uIENpcmNsZS5cclxuICovXHJcbnZhciBDb3B5RnJvbSA9IGZ1bmN0aW9uIChzb3VyY2UsIGRlc3QpXHJcbntcclxuICAgIHJldHVybiBkZXN0LnNldFRvKHNvdXJjZS54LCBzb3VyY2UueSwgc291cmNlLnJhZGl1cyk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvcHlGcm9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb21wYXJlcyB0aGUgYHhgLCBgeWAgYW5kIGByYWRpdXNgIHByb3BlcnRpZXMgb2YgdGhlIHR3byBnaXZlbiBDaXJjbGVzLlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGV5IGFsbCBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5FcXVhbHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgZmlyc3QgQ2lyY2xlIHRvIGNvbXBhcmUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSB0b0NvbXBhcmUgLSBUaGUgc2Vjb25kIENpcmNsZSB0byBjb21wYXJlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR3byBDaXJjbGVzIGVxdWFsIGVhY2ggb3RoZXIsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIEVxdWFscyA9IGZ1bmN0aW9uIChjaXJjbGUsIHRvQ29tcGFyZSlcclxue1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICBjaXJjbGUueCA9PT0gdG9Db21wYXJlLnggJiZcclxuICAgICAgICBjaXJjbGUueSA9PT0gdG9Db21wYXJlLnkgJiZcclxuICAgICAgICBjaXJjbGUucmFkaXVzID09PSB0b0NvbXBhcmUucmFkaXVzXHJcbiAgICApO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFcXVhbHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIENpcmNsZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5DaXJjbGUuR2V0Qm91bmRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBnZXQgdGhlIGJvdW5kcyBmcm9tLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5SZWN0YW5nbGV8b2JqZWN0KX0gW291dF0gLSBBIFJlY3RhbmdsZSwgb3IgcmVjdGFuZ2xlLWxpa2Ugb2JqZWN0LCB0byBzdG9yZSB0aGUgY2lyY2xlIGJvdW5kcyBpbi4gSWYgbm90IGdpdmVuIGEgbmV3IFJlY3RhbmdsZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5SZWN0YW5nbGV8b2JqZWN0KX0gVGhlIFJlY3RhbmdsZSBvYmplY3QgY29udGFpbmluZyB0aGUgQ2lyY2xlcyBib3VuZHMuXHJcbiAqL1xyXG52YXIgR2V0Qm91bmRzID0gZnVuY3Rpb24gKGNpcmNsZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgb3V0LnggPSBjaXJjbGUubGVmdDtcclxuICAgIG91dC55ID0gY2lyY2xlLnRvcDtcclxuICAgIG91dC53aWR0aCA9IGNpcmNsZS5kaWFtZXRlcjtcclxuICAgIG91dC5oZWlnaHQgPSBjaXJjbGUuZGlhbWV0ZXI7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0Qm91bmRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDaXJjdW1mZXJlbmNlUG9pbnQgPSByZXF1aXJlKCcuL0NpcmN1bWZlcmVuY2VQb2ludCcpO1xyXG52YXIgRnJvbVBlcmNlbnQgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0Zyb21QZXJjZW50Jyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBQb2ludCBvYmplY3QgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludCBvbiB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgQ2lyY2xlXHJcbiAqIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmdsZSBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuIEkuZS4gYSB2YWx1ZSBvZiAwLjUgd2lsbCBnaXZlIHRoZSBwb2ludFxyXG4gKiBhdCAxODAgZGVncmVlcyBhcm91bmQgdGhlIGNpcmNsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5HZXRQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBnZXQgdGhlIGNpcmN1bWZlcmVuY2UgcG9pbnQgb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAwIGVxdWFscyAwIGRlZ3JlZXMsIDAuNSBlcXVhbHMgMTgwIGRlZ3JlZXMgYW5kIDEgZXF1YWxzIDM2MCBhcm91bmQgdGhlIGNpcmNsZS5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dF0gLSBBbiBvYmplY3QgdG8gc3RvcmUgdGhlIHJldHVybiB2YWx1ZXMgaW4uIElmIG5vdCBnaXZlbiBhIFBvaW50IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50LCBvciBwb2ludC1saWtlIG9iamVjdCwgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IGFyb3VuZCB0aGUgY2lyY2xlLlxyXG4gKi9cclxudmFyIEdldFBvaW50ID0gZnVuY3Rpb24gKGNpcmNsZSwgcG9zaXRpb24sIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIGFuZ2xlID0gRnJvbVBlcmNlbnQocG9zaXRpb24sIDAsIE1BVEhfQ09OU1QuUEkyKTtcclxuXHJcbiAgICByZXR1cm4gQ2lyY3VtZmVyZW5jZVBvaW50KGNpcmNsZSwgYW5nbGUsIG91dCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDaXJjdW1mZXJlbmNlID0gcmVxdWlyZSgnLi9DaXJjdW1mZXJlbmNlJyk7XHJcbnZhciBDaXJjdW1mZXJlbmNlUG9pbnQgPSByZXF1aXJlKCcuL0NpcmN1bWZlcmVuY2VQb2ludCcpO1xyXG52YXIgRnJvbVBlcmNlbnQgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0Zyb21QZXJjZW50Jyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgUG9pbnQgb2JqZWN0cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgQ2lyY2xlLFxyXG4gKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVhbnRpdHkgb3Igc3RlcFJhdGUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLkdldFBvaW50c1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gZ2V0IHRoZSBwb2ludHMgZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBhbW91bnQgb2YgcG9pbnRzIHRvIHJldHVybi4gSWYgYSBmYWxzZXkgdmFsdWUgdGhlIHF1YW50aXR5IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFJhdGVdIC0gU2V0cyB0aGUgcXVhbnRpdHkgYnkgZ2V0dGluZyB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2lyY2xlIGFuZCBkaXZpZGluZyBpdCBieSB0aGUgc3RlcFJhdGUuXHJcbiAqIEBwYXJhbSB7YXJyYXl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gaW5zZXJ0IHRoZSBwb2ludHMgaW4gdG8uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50W119IEFuIGFycmF5IG9mIFBvaW50IG9iamVjdHMgcGVydGFpbmluZyB0byB0aGUgcG9pbnRzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2lyY2xlLlxyXG4gKi9cclxudmFyIEdldFBvaW50cyA9IGZ1bmN0aW9uIChjaXJjbGUsIHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICAvLyAgSWYgcXVhbnRpdHkgaXMgYSBmYWxzZXkgdmFsdWUgKGZhbHNlLCBudWxsLCAwLCB1bmRlZmluZWQsIGV0YykgdGhlbiB3ZSBjYWxjdWxhdGUgaXQgYmFzZWQgb24gdGhlIHN0ZXBSYXRlIGluc3RlYWQuXHJcbiAgICBpZiAoIXF1YW50aXR5ICYmIHN0ZXBSYXRlID4gMClcclxuICAgIHtcclxuICAgICAgICBxdWFudGl0eSA9IENpcmN1bWZlcmVuY2UoY2lyY2xlKSAvIHN0ZXBSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgYW5nbGUgPSBGcm9tUGVyY2VudChpIC8gcXVhbnRpdHksIDAsIE1BVEhfQ09OU1QuUEkyKTtcclxuXHJcbiAgICAgICAgb3V0LnB1c2goQ2lyY3VtZmVyZW5jZVBvaW50KGNpcmNsZSwgYW5nbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRQb2ludHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE9mZnNldHMgdGhlIENpcmNsZSBieSB0aGUgdmFsdWVzIGdpdmVuLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLk9mZnNldFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkNpcmNsZX0gTyAtIFtjaXJjbGUsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gYmUgb2Zmc2V0ICh0cmFuc2xhdGVkLilcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYW1vdW50IHRvIGhvcml6b250YWxseSBvZmZzZXQgdGhlIENpcmNsZSBieS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHZlcnRpY2FsbHkgb2Zmc2V0IHRoZSBDaXJjbGUgYnkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkNpcmNsZX0gVGhlIENpcmNsZSB0aGF0IHdhcyBvZmZzZXQuXHJcbiAqL1xyXG52YXIgT2Zmc2V0ID0gZnVuY3Rpb24gKGNpcmNsZSwgeCwgeSlcclxue1xyXG4gICAgY2lyY2xlLnggKz0geDtcclxuICAgIGNpcmNsZS55ICs9IHk7XHJcblxyXG4gICAgcmV0dXJuIGNpcmNsZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT2Zmc2V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBPZmZzZXRzIHRoZSBDaXJjbGUgYnkgdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcyBvZiB0aGUgUG9pbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uQ2lyY2xlLk9mZnNldFBvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uQ2lyY2xlfSBPIC0gW2NpcmNsZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBiZSBvZmZzZXQgKHRyYW5zbGF0ZWQuKVxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBwb2ludCAtIFRoZSBQb2ludCBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIG9mZnNldCB0aGUgQ2lyY2xlIGJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5DaXJjbGV9IFRoZSBDaXJjbGUgdGhhdCB3YXMgb2Zmc2V0LlxyXG4gKi9cclxudmFyIE9mZnNldFBvaW50ID0gZnVuY3Rpb24gKGNpcmNsZSwgcG9pbnQpXHJcbntcclxuICAgIGNpcmNsZS54ICs9IHBvaW50Lng7XHJcbiAgICBjaXJjbGUueSArPSBwb2ludC55O1xyXG5cclxuICAgIHJldHVybiBjaXJjbGU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9mZnNldFBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gcG9pbnQgZnJvbSBhbnl3aGVyZSB3aXRoaW4gdGhlIGdpdmVuIENpcmNsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkNpcmNsZS5SYW5kb21cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZSAtIFRoZSBDaXJjbGUgdG8gZ2V0IGEgcmFuZG9tIHBvaW50IGZyb20uXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQSBQb2ludCBvciBwb2ludC1saWtlIG9iamVjdCB0byBzZXQgdGhlIHJhbmRvbSBgeGAgYW5kIGB5YCB2YWx1ZXMgaW4uXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50IG9iamVjdCB3aXRoIHRoZSByYW5kb20gdmFsdWVzIHNldCBpbiB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICovXHJcbnZhciBSYW5kb20gPSBmdW5jdGlvbiAoY2lyY2xlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHZhciB0ID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xyXG4gICAgdmFyIHUgPSBNYXRoLnJhbmRvbSgpICsgTWF0aC5yYW5kb20oKTtcclxuICAgIHZhciByID0gKHUgPiAxKSA/IDIgLSB1IDogdTtcclxuICAgIHZhciB4ID0gciAqIE1hdGguY29zKHQpO1xyXG4gICAgdmFyIHkgPSByICogTWF0aC5zaW4odCk7XHJcblxyXG4gICAgb3V0LnggPSBjaXJjbGUueCArICh4ICogY2lyY2xlLnJhZGl1cyk7XHJcbiAgICBvdXQueSA9IGNpcmNsZS55ICsgKHkgKiBjaXJjbGUucmFkaXVzKTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYW5kb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENpcmNsZSA9IHJlcXVpcmUoJy4vQ2lyY2xlJyk7XHJcblxyXG5DaXJjbGUuQXJlYSA9IHJlcXVpcmUoJy4vQXJlYScpO1xyXG5DaXJjbGUuQ2lyY3VtZmVyZW5jZSA9IHJlcXVpcmUoJy4vQ2lyY3VtZmVyZW5jZScpO1xyXG5DaXJjbGUuQ2lyY3VtZmVyZW5jZVBvaW50ID0gcmVxdWlyZSgnLi9DaXJjdW1mZXJlbmNlUG9pbnQnKTtcclxuQ2lyY2xlLkNsb25lID0gcmVxdWlyZSgnLi9DbG9uZScpO1xyXG5DaXJjbGUuQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcbkNpcmNsZS5Db250YWluc1BvaW50ID0gcmVxdWlyZSgnLi9Db250YWluc1BvaW50Jyk7XHJcbkNpcmNsZS5Db250YWluc1JlY3QgPSByZXF1aXJlKCcuL0NvbnRhaW5zUmVjdCcpO1xyXG5DaXJjbGUuQ29weUZyb20gPSByZXF1aXJlKCcuL0NvcHlGcm9tJyk7XHJcbkNpcmNsZS5FcXVhbHMgPSByZXF1aXJlKCcuL0VxdWFscycpO1xyXG5DaXJjbGUuR2V0Qm91bmRzID0gcmVxdWlyZSgnLi9HZXRCb3VuZHMnKTtcclxuQ2lyY2xlLkdldFBvaW50ID0gcmVxdWlyZSgnLi9HZXRQb2ludCcpO1xyXG5DaXJjbGUuR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxuQ2lyY2xlLk9mZnNldCA9IHJlcXVpcmUoJy4vT2Zmc2V0Jyk7XHJcbkNpcmNsZS5PZmZzZXRQb2ludCA9IHJlcXVpcmUoJy4vT2Zmc2V0UG9pbnQnKTtcclxuQ2lyY2xlLlJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR0VPTV9DT05TVCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgQ2lyY2xlIEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5DSVJDTEVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICovXHJcbiAgICBDSVJDTEU6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBFbGxpcHNlIEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5FTExJUFNFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqL1xyXG4gICAgRUxMSVBTRTogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgTGluZSBHZW9tZXRyeSBvYmplY3QgdHlwZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uTElORVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKi9cclxuICAgIExJTkU6IDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFBvaW50IEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5QT0lOVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKi9cclxuICAgIFBPSU5UOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBQb2x5Z29uIEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5QT0xZR09OXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqL1xyXG4gICAgUE9MWUdPTjogNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgUmVjdGFuZ2xlIEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5SRUNUQU5HTEVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICovXHJcbiAgICBSRUNUQU5HTEU6IDUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFRyaWFuZ2xlIEdlb21ldHJ5IG9iamVjdCB0eXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UUklBTkdMRVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKi9cclxuICAgIFRSSUFOR0xFOiA2XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHRU9NX0NPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhcmVhIG9mIHRoZSBFbGxpcHNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uRWxsaXBzZS5BcmVhXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBnZXQgdGhlIGFyZWEgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWEgb2YgdGhlIEVsbGlwc2UuXHJcbiAqL1xyXG52YXIgQXJlYSA9IGZ1bmN0aW9uIChlbGxpcHNlKVxyXG57XHJcbiAgICBpZiAoZWxsaXBzZS5pc0VtcHR5KCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIHVuaXRzIHNxdWFyZWRcclxuICAgIHJldHVybiAoZWxsaXBzZS5nZXRNYWpvclJhZGl1cygpICogZWxsaXBzZS5nZXRNaW5vclJhZGl1cygpICogTWF0aC5QSSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyZWE7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGdpdmVuIEVsbGlwc2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkNpcmN1bWZlcmVuY2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gZWxsaXBzZSAtIFRoZSBFbGxpcHNlIHRvIGdldCB0aGUgY2lyY3VtZmVyZW5jZSBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2lyY3VtZmVyZW5jZSBvZiB0aCBFbGxpcHNlLlxyXG4gKi9cclxudmFyIENpcmN1bWZlcmVuY2UgPSBmdW5jdGlvbiAoZWxsaXBzZSlcclxue1xyXG4gICAgdmFyIHJ4ID0gZWxsaXBzZS53aWR0aCAvIDI7XHJcbiAgICB2YXIgcnkgPSBlbGxpcHNlLmhlaWdodCAvIDI7XHJcbiAgICB2YXIgaCA9IE1hdGgucG93KChyeCAtIHJ5KSwgMikgLyBNYXRoLnBvdygocnggKyByeSksIDIpO1xyXG5cclxuICAgIHJldHVybiAoTWF0aC5QSSAqIChyeCArIHJ5KSkgKiAoMSArICgoMyAqIGgpIC8gKDEwICsgTWF0aC5zcXJ0KDQgLSAoMyAqIGgpKSkpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2lyY3VtZmVyZW5jZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBQb2ludCBvYmplY3QgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludCBvbiB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgRWxsaXBzZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gYW5nbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkNpcmN1bWZlcmVuY2VQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBnZXQgdGhlIGNpcmN1bWZlcmVuY2UgcG9pbnQgb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIEVsbGlwc2UgdG8gdGhlIGNpcmN1bWZlcmVuY2UgdG8gcmV0dXJuIHRoZSBwb2ludCBmcm9tLiBHaXZlbiBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIEEgUG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0LCB0byBzdG9yZSB0aGUgcmVzdWx0cyBpbi4gSWYgbm90IGdpdmVuIGEgUG9pbnQgd2lsbCBiZSBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gQSBQb2ludCBvYmplY3Qgd2hlcmUgdGhlIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMgYXJlIHRoZSBwb2ludCBvbiB0aGUgY2lyY3VtZmVyZW5jZS5cclxuICovXHJcbnZhciBDaXJjdW1mZXJlbmNlUG9pbnQgPSBmdW5jdGlvbiAoZWxsaXBzZSwgYW5nbGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIGhhbGZXaWR0aCA9IGVsbGlwc2Uud2lkdGggLyAyO1xyXG4gICAgdmFyIGhhbGZIZWlnaHQgPSBlbGxpcHNlLmhlaWdodCAvIDI7XHJcblxyXG4gICAgb3V0LnggPSBlbGxpcHNlLnggKyBoYWxmV2lkdGggKiBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICBvdXQueSA9IGVsbGlwc2UueSArIGhhbGZIZWlnaHQgKiBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2lyY3VtZmVyZW5jZVBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBFbGxpcHNlID0gcmVxdWlyZSgnLi9FbGxpcHNlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBFbGxpcHNlIGluc3RhbmNlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBzb3VyY2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkNsb25lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IHNvdXJjZSAtIFRoZSBFbGxpcHNlIHRvIGJlIGNsb25lZC4gQ2FuIGJlIGFuIGluc3RhbmNlIG9mIGFuIEVsbGlwc2Ugb3IgYSBlbGxpcHNlLWxpa2Ugb2JqZWN0LCB3aXRoIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgcHJvcGVydGllcy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uRWxsaXBzZX0gQSBjbG9uZSBvZiB0aGUgc291cmNlIEVsbGlwc2UuXHJcbiAqL1xyXG52YXIgQ2xvbmUgPSBmdW5jdGlvbiAoc291cmNlKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IEVsbGlwc2Uoc291cmNlLngsIHNvdXJjZS55LCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDbG9uZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBFbGxpcHNlIGNvbnRhaW5zIHRoZSBnaXZlbiB4IC8geSBjb29yZGluYXRlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkVsbGlwc2UuQ29udGFpbnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gZWxsaXBzZSAtIFRoZSBFbGxpcHNlIHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBlbGxpcHNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBlbGxpcHNlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSBlbGxpcHNlLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAqL1xyXG52YXIgQ29udGFpbnMgPSBmdW5jdGlvbiAoZWxsaXBzZSwgeCwgeSlcclxue1xyXG4gICAgaWYgKGVsbGlwc2Uud2lkdGggPD0gMCB8fCBlbGxpcHNlLmhlaWdodCA8PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgTm9ybWFsaXplIHRoZSBjb29yZHMgdG8gYW4gZWxsaXBzZSB3aXRoIGNlbnRlciAwLDAgYW5kIGEgcmFkaXVzIG9mIDAuNVxyXG4gICAgdmFyIG5vcm14ID0gKCh4IC0gZWxsaXBzZS54KSAvIGVsbGlwc2Uud2lkdGgpO1xyXG4gICAgdmFyIG5vcm15ID0gKCh5IC0gZWxsaXBzZS55KSAvIGVsbGlwc2UuaGVpZ2h0KTtcclxuXHJcbiAgICBub3JteCAqPSBub3JteDtcclxuICAgIG5vcm15ICo9IG5vcm15O1xyXG5cclxuICAgIHJldHVybiAobm9ybXggKyBub3JteSA8IDAuMjUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWlucztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBFbGxpcHNlIGNvbnRhaW5zIHRoZSBnaXZlbiBQb2ludCBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkNvbnRhaW5zUG9pbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gZWxsaXBzZSAtIFRoZSBFbGxpcHNlIHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBwb2ludCAtIFRoZSBQb2ludCBvYmplY3QgdG8gY2hlY2sgaWYgaXQncyB3aXRoaW4gdGhlIENpcmNsZSBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIFBvaW50IGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gdGhlIGNpcmNsZSwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gKi9cclxudmFyIENvbnRhaW5zUG9pbnQgPSBmdW5jdGlvbiAoZWxsaXBzZSwgcG9pbnQpXHJcbntcclxuICAgIHJldHVybiBDb250YWlucyhlbGxpcHNlLCBwb2ludC54LCBwb2ludC55KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnNQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBFbGxpcHNlIGNvbnRhaW5zIGFsbCBmb3VyIHBvaW50cyBvZiB0aGUgZ2l2ZW4gUmVjdGFuZ2xlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkVsbGlwc2UuQ29udGFpbnNSZWN0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBjaGVjay5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUmVjdGFuZ2xlfG9iamVjdCl9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIG9iamVjdCB0byBjaGVjayBpZiBpdCdzIHdpdGhpbiB0aGUgRWxsaXBzZSBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYWxsIG9mIHRoZSBSZWN0YW5nbGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgZWxsaXBzZSwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gKi9cclxudmFyIENvbnRhaW5zUmVjdCA9IGZ1bmN0aW9uIChlbGxpcHNlLCByZWN0KVxyXG57XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIENvbnRhaW5zKGVsbGlwc2UsIHJlY3QueCwgcmVjdC55KSAmJlxyXG4gICAgICAgIENvbnRhaW5zKGVsbGlwc2UsIHJlY3QucmlnaHQsIHJlY3QueSkgJiZcclxuICAgICAgICBDb250YWlucyhlbGxpcHNlLCByZWN0LngsIHJlY3QuYm90dG9tKSAmJlxyXG4gICAgICAgIENvbnRhaW5zKGVsbGlwc2UsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKVxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnNSZWN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb3BpZXMgdGhlIGB4YCwgYHlgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzb3VyY2VgIEVsbGlwc2VcclxuICogaW50byB0aGUgZ2l2ZW4gYGRlc3RgIEVsbGlwc2UsIHRoZW4gcmV0dXJucyB0aGUgYGRlc3RgIEVsbGlwc2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkNvcHlGcm9tXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uRWxsaXBzZX0gTyAtIFtkZXN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gc291cmNlIC0gVGhlIHNvdXJjZSBFbGxpcHNlIHRvIGNvcHkgdGhlIHZhbHVlcyBmcm9tLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gRWxsaXBzZSB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkVsbGlwc2V9IFRoZSBkZXN0aW5hdGlvbiBFbGxpcHNlLlxyXG4gKi9cclxudmFyIENvcHlGcm9tID0gZnVuY3Rpb24gKHNvdXJjZSwgZGVzdClcclxue1xyXG4gICAgcmV0dXJuIGRlc3Quc2V0VG8oc291cmNlLngsIHNvdXJjZS55LCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb3B5RnJvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcbnZhciBHZXRQb2ludCA9IHJlcXVpcmUoJy4vR2V0UG9pbnQnKTtcclxudmFyIEdldFBvaW50cyA9IHJlcXVpcmUoJy4vR2V0UG9pbnRzJyk7XHJcbnZhciBHRU9NX0NPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIFJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBbiBFbGxpcHNlIG9iamVjdC5cclxuICpcclxuICogVGhpcyBpcyBhIGdlb21ldHJ5IG9iamVjdCwgY29udGFpbmluZyBudW1lcmljYWwgdmFsdWVzIGFuZCByZWxhdGVkIG1ldGhvZHMgdG8gaW5zcGVjdCBhbmQgbW9kaWZ5IHRoZW0uXHJcbiAqIEl0IGlzIG5vdCBhIEdhbWUgT2JqZWN0LCBpbiB0aGF0IHlvdSBjYW5ub3QgYWRkIGl0IHRvIHRoZSBkaXNwbGF5IGxpc3QsIGFuZCBpdCBoYXMgbm8gdGV4dHVyZS5cclxuICogVG8gcmVuZGVyIGFuIEVsbGlwc2UgeW91IHNob3VsZCBsb29rIGF0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIEdyYXBoaWNzIGNsYXNzLlxyXG4gKlxyXG4gKiBAY2xhc3MgRWxsaXBzZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkdlb21cclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTBdIC0gVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0wXSAtIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UuXHJcbiAqL1xyXG52YXIgRWxsaXBzZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBFbGxpcHNlICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAwOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IDA7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdlb21ldHJ5IGNvbnN0YW50IHR5cGUgb2YgdGhpcyBvYmplY3Q6IGBHRU9NX0NPTlNULkVMTElQU0VgLlxyXG4gICAgICAgICAqIFVzZWQgZm9yIGZhc3QgdHlwZSBjb21wYXJpc29ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkVsbGlwc2UjdHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSBHRU9NX0NPTlNULkVMTElQU0U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5FbGxpcHNlI3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSB4O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uRWxsaXBzZSN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uRWxsaXBzZSN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkVsbGlwc2UjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBFbGxpcHNlIGNvbnRhaW5zIHRoZSBnaXZlbiB4IC8geSBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkVsbGlwc2UjY29udGFpbnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjaGVjayB3aXRoaW4gdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBlbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gdGhlIGVsbGlwc2UsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgY29udGFpbnM6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBDb250YWlucyh0aGlzLCB4LCB5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgUG9pbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgb24gdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIEVsbGlwc2VcclxuICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmdsZSBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuIEkuZS4gYSB2YWx1ZSBvZiAwLjUgd2lsbCBnaXZlIHRoZSBwb2ludFxyXG4gICAgICogYXQgMTgwIGRlZ3JlZXMgYXJvdW5kIHRoZSBjaXJjbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5FbGxpcHNlI2dldFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIC0gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDAgZXF1YWxzIDAgZGVncmVlcywgMC41IGVxdWFscyAxODAgZGVncmVlcyBhbmQgMSBlcXVhbHMgMzYwIGFyb3VuZCB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSByZXR1cm4gdmFsdWVzIGluLiBJZiBub3QgZ2l2ZW4gYSBQb2ludCBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50LCBvciBwb2ludC1saWtlIG9iamVjdCwgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IGFyb3VuZCB0aGUgZWxsaXBzZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uIChwb3NpdGlvbiwgcG9pbnQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdldFBvaW50KHRoaXMsIHBvc2l0aW9uLCBwb2ludCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBFbGxpcHNlLFxyXG4gICAgICogYmFzZWQgb24gdGhlIGdpdmVuIHF1YW50aXR5IG9yIHN0ZXBSYXRlIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkVsbGlwc2UjZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIGFtb3VudCBvZiBwb2ludHMgdG8gcmV0dXJuLiBJZiBhIGZhbHNleSB2YWx1ZSB0aGUgcXVhbnRpdHkgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIGBzdGVwUmF0ZWAgaW5zdGVhZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFJhdGVdIC0gU2V0cyB0aGUgcXVhbnRpdHkgYnkgZ2V0dGluZyB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgZWxsaXBzZSBhbmQgZGl2aWRpbmcgaXQgYnkgdGhlIHN0ZXBSYXRlLlxyXG4gICAgICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gaW5zZXJ0IHRoZSBwb2ludHMgaW4gdG8uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBBbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIHBlcnRhaW5pbmcgdG8gdGhlIHBvaW50cyBhcm91bmQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50czogZnVuY3Rpb24gKHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHZXRQb2ludHModGhpcywgcXVhbnRpdHksIHN0ZXBSYXRlLCBvdXRwdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIHBvaW50IGZyb20gYW55d2hlcmUgd2l0aGluIHRoZSBnaXZlbiBFbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uRWxsaXBzZSNnZXRSYW5kb21Qb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW3BvaW50LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW3BvaW50XSAtIEEgUG9pbnQgb3IgcG9pbnQtbGlrZSBvYmplY3QgdG8gc2V0IHRoZSByYW5kb20gYHhgIGFuZCBgeWAgdmFsdWVzIGluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50IG9iamVjdCB3aXRoIHRoZSByYW5kb20gdmFsdWVzIHNldCBpbiB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmFuZG9tUG9pbnQ6IGZ1bmN0aW9uIChwb2ludClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gUmFuZG9tKHRoaXMsIHBvaW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgZWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkVsbGlwc2Ujc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRWxsaXBzZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRvOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSB4O1xyXG4gICAgICAgIHRoaXMueSA9IHk7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgRWxsaXBzZSB0byBiZSBlbXB0eSB3aXRoIGEgd2lkdGggYW5kIGhlaWdodCBvZiB6ZXJvLlxyXG4gICAgICogRG9lcyBub3QgY2hhbmdlIGl0cyBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkVsbGlwc2Ujc2V0RW1wdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRWxsaXBzZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEVtcHR5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBFbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uRWxsaXBzZSNzZXRQb3NpdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRWxsaXBzZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIEVsbGlwc2UuXHJcbiAgICAgKiBEb2VzIG5vdCBjaGFuZ2UgaXRzIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uRWxsaXBzZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD13aWR0aF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgRWxsaXBzZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB3aWR0aDsgfVxyXG5cclxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIEVsbGlwc2UgaXMgZW1wdHk6IGhhcyBhIHdpZHRoIG9yIGhlaWdodCBlcXVhbCB0byB6ZXJvLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uRWxsaXBzZSNpc0VtcHR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBFbGxpcHNlIGlzIGVtcHR5LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIGlzRW1wdHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLndpZHRoIDw9IDAgfHwgdGhpcy5oZWlnaHQgPD0gMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWlub3IgcmFkaXVzIG9mIHRoZSBlbGxpcHNlLiBBbHNvIGtub3duIGFzIHRoZSBTZW1pIE1pbm9yIEF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5FbGxpcHNlI2dldE1pbm9yUmFkaXVzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtaW5vciByYWRpdXMuXHJcbiAgICAgKi9cclxuICAgIGdldE1pbm9yUmFkaXVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkgLyAyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1ham9yIHJhZGl1cyBvZiB0aGUgZWxsaXBzZS4gQWxzbyBrbm93biBhcyB0aGUgU2VtaSBNYWpvciBBeGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uRWxsaXBzZSNnZXRNYWpvclJhZGl1c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWFqb3IgcmFkaXVzLlxyXG4gICAgICovXHJcbiAgICBnZXRNYWpvclJhZGl1czogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpIC8gMjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgRWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5FbGxpcHNlI2xlZnRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgbGVmdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy54IC0gKHRoaXMud2lkdGggLyAyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHZhbHVlICsgKHRoaXMud2lkdGggLyAyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgRWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5FbGxpcHNlI3JpZ2h0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyAodGhpcy53aWR0aCAvIDIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gdmFsdWUgLSAodGhpcy53aWR0aCAvIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgRWxsaXBzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5FbGxpcHNlI3RvcFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0b3A6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueSAtICh0aGlzLmhlaWdodCAvIDIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy55ID0gdmFsdWUgKyAodGhpcy5oZWlnaHQgLyAyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIEVsbGlwc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uRWxsaXBzZSNib3R0b21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm90dG9tOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgKyAodGhpcy5oZWlnaHQgLyAyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHZhbHVlIC0gKHRoaXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFbGxpcHNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb21wYXJlcyB0aGUgYHhgLCBgeWAsIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMgb2YgdGhlIHR3byBnaXZlbiBFbGxpcHNlcy5cclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhleSBhbGwgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkVxdWFsc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBlbGxpcHNlIC0gVGhlIGZpcnN0IEVsbGlwc2UgdG8gY29tcGFyZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSB0b0NvbXBhcmUgLSBUaGUgc2Vjb25kIEVsbGlwc2UgdG8gY29tcGFyZS5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gRWxsaXBzZSBlcXVhbCBlYWNoIG90aGVyLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBFcXVhbHMgPSBmdW5jdGlvbiAoZWxsaXBzZSwgdG9Db21wYXJlKVxyXG57XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIGVsbGlwc2UueCA9PT0gdG9Db21wYXJlLnggJiZcclxuICAgICAgICBlbGxpcHNlLnkgPT09IHRvQ29tcGFyZS55ICYmXHJcbiAgICAgICAgZWxsaXBzZS53aWR0aCA9PT0gdG9Db21wYXJlLndpZHRoICYmXHJcbiAgICAgICAgZWxsaXBzZS5oZWlnaHQgPT09IHRvQ29tcGFyZS5oZWlnaHRcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVxdWFscztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vcmVjdGFuZ2xlL1JlY3RhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiB0aGUgRWxsaXBzZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLkdldEJvdW5kc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBlbGxpcHNlIC0gVGhlIEVsbGlwc2UgdG8gZ2V0IHRoZSBib3VuZHMgZnJvbS5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUmVjdGFuZ2xlfG9iamVjdCl9IFtvdXRdIC0gQSBSZWN0YW5nbGUsIG9yIHJlY3RhbmdsZS1saWtlIG9iamVjdCwgdG8gc3RvcmUgdGhlIGVsbGlwc2UgYm91bmRzIGluLiBJZiBub3QgZ2l2ZW4gYSBuZXcgUmVjdGFuZ2xlIHdpbGwgYmUgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlJlY3RhbmdsZXxvYmplY3QpfSBUaGUgUmVjdGFuZ2xlIG9iamVjdCBjb250YWluaW5nIHRoZSBFbGxpcHNlIGJvdW5kcy5cclxuICovXHJcbnZhciBHZXRCb3VuZHMgPSBmdW5jdGlvbiAoZWxsaXBzZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgb3V0LnggPSBlbGxpcHNlLmxlZnQ7XHJcbiAgICBvdXQueSA9IGVsbGlwc2UudG9wO1xyXG4gICAgb3V0LndpZHRoID0gZWxsaXBzZS53aWR0aDtcclxuICAgIG91dC5oZWlnaHQgPSBlbGxpcHNlLmhlaWdodDtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRCb3VuZHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENpcmN1bWZlcmVuY2VQb2ludCA9IHJlcXVpcmUoJy4vQ2lyY3VtZmVyZW5jZVBvaW50Jyk7XHJcbnZhciBGcm9tUGVyY2VudCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRnJvbVBlcmNlbnQnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIFBvaW50IG9iamVjdCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IG9uIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBFbGxpcHNlXHJcbiAqIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmdsZSBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwIHRvIDEuIEkuZS4gYSB2YWx1ZSBvZiAwLjUgd2lsbCBnaXZlIHRoZSBwb2ludFxyXG4gKiBhdCAxODAgZGVncmVlcyBhcm91bmQgdGhlIGNpcmNsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkVsbGlwc2UuR2V0UG9pbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBlbGxpcHNlIC0gVGhlIEVsbGlwc2UgdG8gZ2V0IHRoZSBjaXJjdW1mZXJlbmNlIHBvaW50IG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gLSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgd2hlcmUgMCBlcXVhbHMgMCBkZWdyZWVzLCAwLjUgZXF1YWxzIDE4MCBkZWdyZWVzIGFuZCAxIGVxdWFscyAzNjAgYXJvdW5kIHRoZSBlbGxpcHNlLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIEFuIG9iamVjdCB0byBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlcyBpbi4gSWYgbm90IGdpdmVuIGEgUG9pbnQgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IEEgUG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0LCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgYXJvdW5kIHRoZSBlbGxpcHNlLlxyXG4gKi9cclxudmFyIEdldFBvaW50ID0gZnVuY3Rpb24gKGVsbGlwc2UsIHBvc2l0aW9uLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHZhciBhbmdsZSA9IEZyb21QZXJjZW50KHBvc2l0aW9uLCAwLCBNQVRIX0NPTlNULlBJMik7XHJcblxyXG4gICAgcmV0dXJuIENpcmN1bWZlcmVuY2VQb2ludChlbGxpcHNlLCBhbmdsZSwgb3V0KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG9pbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENpcmN1bWZlcmVuY2UgPSByZXF1aXJlKCcuL0NpcmN1bWZlcmVuY2UnKTtcclxudmFyIENpcmN1bWZlcmVuY2VQb2ludCA9IHJlcXVpcmUoJy4vQ2lyY3VtZmVyZW5jZVBvaW50Jyk7XHJcbnZhciBGcm9tUGVyY2VudCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRnJvbVBlcmNlbnQnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBFbGxpcHNlLFxyXG4gKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcXVhbnRpdHkgb3Igc3RlcFJhdGUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uRWxsaXBzZS5HZXRQb2ludHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludFtdfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBnZXQgdGhlIHBvaW50cyBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIGFtb3VudCBvZiBwb2ludHMgdG8gcmV0dXJuLiBJZiBhIGZhbHNleSB2YWx1ZSB0aGUgcXVhbnRpdHkgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIGBzdGVwUmF0ZWAgaW5zdGVhZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwUmF0ZV0gLSBTZXRzIHRoZSBxdWFudGl0eSBieSBnZXR0aW5nIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBlbGxpcHNlIGFuZCBkaXZpZGluZyBpdCBieSB0aGUgc3RlcFJhdGUuXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBbb3V0XSAtIEFuIGFycmF5IHRvIGluc2VydCB0aGUgcG9pbnRzIGluIHRvLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IEFuIGFycmF5IG9mIFBvaW50IG9iamVjdHMgcGVydGFpbmluZyB0byB0aGUgcG9pbnRzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgZWxsaXBzZS5cclxuICovXHJcbnZhciBHZXRQb2ludHMgPSBmdW5jdGlvbiAoZWxsaXBzZSwgcXVhbnRpdHksIHN0ZXBSYXRlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIC8vICBJZiBxdWFudGl0eSBpcyBhIGZhbHNleSB2YWx1ZSAoZmFsc2UsIG51bGwsIDAsIHVuZGVmaW5lZCwgZXRjKSB0aGVuIHdlIGNhbGN1bGF0ZSBpdCBiYXNlZCBvbiB0aGUgc3RlcFJhdGUgaW5zdGVhZC5cclxuICAgIGlmICghcXVhbnRpdHkgJiYgc3RlcFJhdGUgPiAwKVxyXG4gICAge1xyXG4gICAgICAgIHF1YW50aXR5ID0gQ2lyY3VtZmVyZW5jZShlbGxpcHNlKSAvIHN0ZXBSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgYW5nbGUgPSBGcm9tUGVyY2VudChpIC8gcXVhbnRpdHksIDAsIE1BVEhfQ09OU1QuUEkyKTtcclxuXHJcbiAgICAgICAgb3V0LnB1c2goQ2lyY3VtZmVyZW5jZVBvaW50KGVsbGlwc2UsIGFuZ2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG9pbnRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBPZmZzZXRzIHRoZSBFbGxpcHNlIGJ5IHRoZSB2YWx1ZXMgZ2l2ZW4uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLk9mZnNldFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkVsbGlwc2V9IE8gLSBbZWxsaXBzZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBiZSBvZmZzZXQgKHRyYW5zbGF0ZWQuKVxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gaG9yaXpvbnRhbGx5IG9mZnNldCB0aGUgRWxsaXBzZSBieS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHZlcnRpY2FsbHkgb2Zmc2V0IHRoZSBFbGxpcHNlIGJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBUaGUgRWxsaXBzZSB0aGF0IHdhcyBvZmZzZXQuXHJcbiAqL1xyXG52YXIgT2Zmc2V0ID0gZnVuY3Rpb24gKGVsbGlwc2UsIHgsIHkpXHJcbntcclxuICAgIGVsbGlwc2UueCArPSB4O1xyXG4gICAgZWxsaXBzZS55ICs9IHk7XHJcblxyXG4gICAgcmV0dXJuIGVsbGlwc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9mZnNldDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogT2Zmc2V0cyB0aGUgRWxsaXBzZSBieSB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIG9mIHRoZSBQb2ludCBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLk9mZnNldFBvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uRWxsaXBzZX0gTyAtIFtlbGxpcHNlLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uRWxsaXBzZX0gZWxsaXBzZSAtIFRoZSBFbGxpcHNlIHRvIGJlIG9mZnNldCAodHJhbnNsYXRlZC4pXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IHBvaW50IC0gVGhlIFBvaW50IG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gb2Zmc2V0IHRoZSBFbGxpcHNlIGJ5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5FbGxpcHNlfSBUaGUgRWxsaXBzZSB0aGF0IHdhcyBvZmZzZXQuXHJcbiAqL1xyXG52YXIgT2Zmc2V0UG9pbnQgPSBmdW5jdGlvbiAoZWxsaXBzZSwgcG9pbnQpXHJcbntcclxuICAgIGVsbGlwc2UueCArPSBwb2ludC54O1xyXG4gICAgZWxsaXBzZS55ICs9IHBvaW50Lnk7XHJcblxyXG4gICAgcmV0dXJuIGVsbGlwc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9mZnNldFBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gcG9pbnQgZnJvbSBhbnl3aGVyZSB3aXRoaW4gdGhlIGdpdmVuIEVsbGlwc2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5FbGxpcHNlLlJhbmRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkVsbGlwc2V9IGVsbGlwc2UgLSBUaGUgRWxsaXBzZSB0byBnZXQgYSByYW5kb20gcG9pbnQgZnJvbS5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dF0gLSBBIFBvaW50IG9yIHBvaW50LWxpa2Ugb2JqZWN0IHRvIHNldCB0aGUgcmFuZG9tIGB4YCBhbmQgYHlgIHZhbHVlcyBpbi5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IEEgUG9pbnQgb2JqZWN0IHdpdGggdGhlIHJhbmRvbSB2YWx1ZXMgc2V0IGluIHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gKi9cclxudmFyIFJhbmRvbSA9IGZ1bmN0aW9uIChlbGxpcHNlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHZhciBwID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyO1xyXG4gICAgdmFyIHMgPSBNYXRoLnNxcnQoTWF0aC5yYW5kb20oKSk7XHJcblxyXG4gICAgb3V0LnggPSBlbGxpcHNlLnggKyAoKHMgKiBNYXRoLmNvcyhwKSkgKiBlbGxpcHNlLndpZHRoIC8gMik7XHJcbiAgICBvdXQueSA9IGVsbGlwc2UueSArICgocyAqIE1hdGguc2luKHApKSAqIGVsbGlwc2UuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBFbGxpcHNlID0gcmVxdWlyZSgnLi9FbGxpcHNlJyk7XHJcblxyXG5FbGxpcHNlLkFyZWEgPSByZXF1aXJlKCcuL0FyZWEnKTtcclxuRWxsaXBzZS5DaXJjdW1mZXJlbmNlID0gcmVxdWlyZSgnLi9DaXJjdW1mZXJlbmNlJyk7XHJcbkVsbGlwc2UuQ2lyY3VtZmVyZW5jZVBvaW50ID0gcmVxdWlyZSgnLi9DaXJjdW1mZXJlbmNlUG9pbnQnKTtcclxuRWxsaXBzZS5DbG9uZSA9IHJlcXVpcmUoJy4vQ2xvbmUnKTtcclxuRWxsaXBzZS5Db250YWlucyA9IHJlcXVpcmUoJy4vQ29udGFpbnMnKTtcclxuRWxsaXBzZS5Db250YWluc1BvaW50ID0gcmVxdWlyZSgnLi9Db250YWluc1BvaW50Jyk7XHJcbkVsbGlwc2UuQ29udGFpbnNSZWN0ID0gcmVxdWlyZSgnLi9Db250YWluc1JlY3QnKTtcclxuRWxsaXBzZS5Db3B5RnJvbSA9IHJlcXVpcmUoJy4vQ29weUZyb20nKTtcclxuRWxsaXBzZS5FcXVhbHMgPSByZXF1aXJlKCcuL0VxdWFscycpO1xyXG5FbGxpcHNlLkdldEJvdW5kcyA9IHJlcXVpcmUoJy4vR2V0Qm91bmRzJyk7XHJcbkVsbGlwc2UuR2V0UG9pbnQgPSByZXF1aXJlKCcuL0dldFBvaW50Jyk7XHJcbkVsbGlwc2UuR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxuRWxsaXBzZS5PZmZzZXQgPSByZXF1aXJlKCcuL09mZnNldCcpO1xyXG5FbGxpcHNlLk9mZnNldFBvaW50ID0gcmVxdWlyZSgnLi9PZmZzZXRQb2ludCcpO1xyXG5FbGxpcHNlLlJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVsbGlwc2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkdlb21cclxuICovXHJcblxyXG52YXIgR2VvbSA9IHtcclxuICAgIFxyXG4gICAgQ2lyY2xlOiByZXF1aXJlKCcuL2NpcmNsZScpLFxyXG4gICAgRWxsaXBzZTogcmVxdWlyZSgnLi9lbGxpcHNlJyksXHJcbiAgICBJbnRlcnNlY3RzOiByZXF1aXJlKCcuL2ludGVyc2VjdHMnKSxcclxuICAgIExpbmU6IHJlcXVpcmUoJy4vbGluZScpLFxyXG4gICAgUG9pbnQ6IHJlcXVpcmUoJy4vcG9pbnQnKSxcclxuICAgIFBvbHlnb246IHJlcXVpcmUoJy4vcG9seWdvbicpLFxyXG4gICAgUmVjdGFuZ2xlOiByZXF1aXJlKCcuL3JlY3RhbmdsZScpLFxyXG4gICAgVHJpYW5nbGU6IHJlcXVpcmUoJy4vdHJpYW5nbGUnKVxyXG5cclxufTtcclxuXHJcbi8vICAgTWVyZ2UgaW4gdGhlIGNvbnN0c1xyXG5HZW9tID0gRXh0ZW5kKGZhbHNlLCBHZW9tLCBDT05TVCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdlb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIERpc3RhbmNlQmV0d2VlbiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHR3byBDaXJjbGVzIGludGVyc2VjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuQ2lyY2xlVG9DaXJjbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGVBIC0gVGhlIGZpcnN0IENpcmNsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlQiAtIFRoZSBzZWNvbmQgQ2lyY2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHdvIENpcmNsZXMgaW50ZXJzZWN0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBDaXJjbGVUb0NpcmNsZSA9IGZ1bmN0aW9uIChjaXJjbGVBLCBjaXJjbGVCKVxyXG57XHJcbiAgICByZXR1cm4gKERpc3RhbmNlQmV0d2VlbihjaXJjbGVBLngsIGNpcmNsZUEueSwgY2lyY2xlQi54LCBjaXJjbGVCLnkpIDw9IChjaXJjbGVBLnJhZGl1cyArIGNpcmNsZUIucmFkaXVzKSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZVRvQ2lyY2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgZm9yIGludGVyc2VjdGlvbiBiZXR3ZWVuIGEgY2lyY2xlIGFuZCBhIHJlY3RhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuQ2lyY2xlVG9SZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgY2lyY2xlIHRvIGJlIGNoZWNrZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIHJlY3RhbmdsZSB0byBiZSBjaGVja2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR3byBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgQ2lyY2xlVG9SZWN0YW5nbGUgPSBmdW5jdGlvbiAoY2lyY2xlLCByZWN0KVxyXG57XHJcbiAgICB2YXIgaGFsZldpZHRoID0gcmVjdC53aWR0aCAvIDI7XHJcbiAgICB2YXIgaGFsZkhlaWdodCA9IHJlY3QuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICB2YXIgY3ggPSBNYXRoLmFicyhjaXJjbGUueCAtIHJlY3QueCAtIGhhbGZXaWR0aCk7XHJcbiAgICB2YXIgY3kgPSBNYXRoLmFicyhjaXJjbGUueSAtIHJlY3QueSAtIGhhbGZIZWlnaHQpO1xyXG4gICAgdmFyIHhEaXN0ID0gaGFsZldpZHRoICsgY2lyY2xlLnJhZGl1cztcclxuICAgIHZhciB5RGlzdCA9IGhhbGZIZWlnaHQgKyBjaXJjbGUucmFkaXVzO1xyXG5cclxuICAgIGlmIChjeCA+IHhEaXN0IHx8IGN5ID4geURpc3QpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY3ggPD0gaGFsZldpZHRoIHx8IGN5IDw9IGhhbGZIZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHhDb3JuZXJEaXN0ID0gY3ggLSBoYWxmV2lkdGg7XHJcbiAgICAgICAgdmFyIHlDb3JuZXJEaXN0ID0gY3kgLSBoYWxmSGVpZ2h0O1xyXG4gICAgICAgIHZhciB4Q29ybmVyRGlzdFNxID0geENvcm5lckRpc3QgKiB4Q29ybmVyRGlzdDtcclxuICAgICAgICB2YXIgeUNvcm5lckRpc3RTcSA9IHlDb3JuZXJEaXN0ICogeUNvcm5lckRpc3Q7XHJcbiAgICAgICAgdmFyIG1heENvcm5lckRpc3RTcSA9IGNpcmNsZS5yYWRpdXMgKiBjaXJjbGUucmFkaXVzO1xyXG5cclxuICAgICAgICByZXR1cm4gKHhDb3JuZXJEaXN0U3EgKyB5Q29ybmVyRGlzdFNxIDw9IG1heENvcm5lckRpc3RTcSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZVRvUmVjdGFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIFZhemVsbGVcclxuICogQGF1dGhvciAgICAgICBHZW9mZnJleSBHbGFpdmVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcbnZhciBDaXJjbGVUb0NpcmNsZSA9IHJlcXVpcmUoJy4vQ2lyY2xlVG9DaXJjbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIENpcmNsZXMgaW50ZXJzZWN0IGFuZCByZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFzIGEgUG9pbnQgb2JqZWN0IGFycmF5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5HZXRDaXJjbGVUb0NpcmNsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5DaXJjbGV9IGNpcmNsZUEgLSBUaGUgZmlyc3QgQ2lyY2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGVCIC0gVGhlIHNlY29uZCBDaXJjbGUgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbi5cclxuICogQHBhcmFtIHthcnJheX0gW291dF0gLSBBbiBvcHRpb25hbCBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IHdpdGggdGhlIHBvaW50cyBvZiBpbnRlcnNlY3Rpb24gaWYgb2JqZWN0cyBpbnRlcnNlY3QsIG90aGVyd2lzZSBhbiBlbXB0eSBhcnJheS5cclxuICovXHJcbnZhciBHZXRDaXJjbGVUb0NpcmNsZSA9IGZ1bmN0aW9uIChjaXJjbGVBLCBjaXJjbGVCLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIGlmIChDaXJjbGVUb0NpcmNsZShjaXJjbGVBLCBjaXJjbGVCKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgeDAgPSBjaXJjbGVBLng7XHJcbiAgICAgICAgdmFyIHkwID0gY2lyY2xlQS55O1xyXG4gICAgICAgIHZhciByMCA9IGNpcmNsZUEucmFkaXVzO1xyXG5cclxuICAgICAgICB2YXIgeDEgPSBjaXJjbGVCLng7XHJcbiAgICAgICAgdmFyIHkxID0gY2lyY2xlQi55O1xyXG4gICAgICAgIHZhciByMSA9IGNpcmNsZUIucmFkaXVzO1xyXG5cclxuICAgICAgICB2YXIgY29lZmZpY2llbnRBLCBjb2VmZmljaWVudEIsIGNvZWZmaWNpZW50QywgbGFtYmRhLCB4O1xyXG5cclxuICAgICAgICBpZiAoeTAgPT09IHkxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeCA9ICgocjEgKiByMSkgLSAocjAgKiByMCkgLSAoeDEgKiB4MSkgKyAoeDAgKiB4MCkpIC8gKDIgKiAoeDAgLSB4MSkpO1xyXG5cclxuICAgICAgICAgICAgY29lZmZpY2llbnRBID0gMTtcclxuICAgICAgICAgICAgY29lZmZpY2llbnRCID0gLTIgKiB5MTtcclxuICAgICAgICAgICAgY29lZmZpY2llbnRDID0gKHgxICogeDEpICsgKHggKiB4KSAtICgyICogeDEgKiB4KSArICh5MSAqIHkxKSAtIChyMSAqIHIxKTtcclxuXHJcbiAgICAgICAgICAgIGxhbWJkYSA9IChjb2VmZmljaWVudEIgKiBjb2VmZmljaWVudEIpIC0gKDQgKiBjb2VmZmljaWVudEEgKiBjb2VmZmljaWVudEMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxhbWJkYSA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsICgtY29lZmZpY2llbnRCIC8gKDIgKiBjb2VmZmljaWVudEEpKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxhbWJkYSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dC5wdXNoKG5ldyBQb2ludCh4LCAoLWNvZWZmaWNpZW50QiArIE1hdGguc3FydChsYW1iZGEpKSAvICgyICogY29lZmZpY2llbnRBKSkpO1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsICgtY29lZmZpY2llbnRCIC0gTWF0aC5zcXJ0KGxhbWJkYSkpIC8gKDIgKiBjb2VmZmljaWVudEEpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHYxID0gKHgwIC0geDEpIC8gKHkwIC0geTEpO1xyXG4gICAgICAgICAgICB2YXIgbiA9IChyMSAqIHIxIC0gcjAgKiByMCAtIHgxICogeDEgKyB4MCAqIHgwIC0geTEgKiB5MSArIHkwICogeTApIC8gKDIgKiAoeTAgLSB5MSkpO1xyXG5cclxuICAgICAgICAgICAgY29lZmZpY2llbnRBID0gKHYxICogdjEpICsgMTtcclxuICAgICAgICAgICAgY29lZmZpY2llbnRCID0gKDIgKiB5MCAqIHYxKSAtICgyICogbiAqIHYxKSAtICgyICogeDApO1xyXG4gICAgICAgICAgICBjb2VmZmljaWVudEMgPSAoeDAgKiB4MCkgKyAoeTAgKiB5MCkgKyAobiAqIG4pIC0gKHIwICogcjApIC0gKDIgKiB5MCAqIG4pO1xyXG5cclxuICAgICAgICAgICAgbGFtYmRhID0gKGNvZWZmaWNpZW50QiAqIGNvZWZmaWNpZW50QikgLSAoNCAqIGNvZWZmaWNpZW50QSAqIGNvZWZmaWNpZW50Qyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobGFtYmRhID09PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB4ID0gKC1jb2VmZmljaWVudEIgLyAoMiAqIGNvZWZmaWNpZW50QSkpO1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIChuIC0gKHggKiB2MSkpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobGFtYmRhID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeCA9ICgtY29lZmZpY2llbnRCICsgTWF0aC5zcXJ0KGxhbWJkYSkpIC8gKDIgKiBjb2VmZmljaWVudEEpO1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIChuIC0gKHggKiB2MSkpKSk7XHJcbiAgICAgICAgICAgICAgICB4ID0gKC1jb2VmZmljaWVudEIgLSBNYXRoLnNxcnQobGFtYmRhKSkgLyAoMiAqIGNvZWZmaWNpZW50QSk7XHJcbiAgICAgICAgICAgICAgICBvdXQucHVzaChuZXcgUG9pbnQoeCwgKG4gLSAoeCAqIHYxKSkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRDaXJjbGVUb0NpcmNsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgRmxvcmlhbiBWYXplbGxlXHJcbiAqIEBhdXRob3IgICAgICAgR2VvZmZyZXkgR2xhaXZlXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0TGluZVRvQ2lyY2xlID0gcmVxdWlyZSgnLi9HZXRMaW5lVG9DaXJjbGUnKTtcclxudmFyIENpcmNsZVRvUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi9DaXJjbGVUb1JlY3RhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gYSBjaXJjbGUgYW5kIGEgcmVjdGFuZ2xlLFxyXG4gKiBhbmQgcmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cyBhcyBhIFBvaW50IG9iamVjdCBhcnJheS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuR2V0Q2lyY2xlVG9SZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgY2lyY2xlIHRvIGJlIGNoZWNrZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIHJlY3RhbmdsZSB0byBiZSBjaGVja2VkLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldENpcmNsZVRvUmVjdGFuZ2xlID0gZnVuY3Rpb24gKGNpcmNsZSwgcmVjdCwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICBpZiAoQ2lyY2xlVG9SZWN0YW5nbGUoY2lyY2xlLCByZWN0KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbGluZUEgPSByZWN0LmdldExpbmVBKCk7XHJcbiAgICAgICAgdmFyIGxpbmVCID0gcmVjdC5nZXRMaW5lQigpO1xyXG4gICAgICAgIHZhciBsaW5lQyA9IHJlY3QuZ2V0TGluZUMoKTtcclxuICAgICAgICB2YXIgbGluZUQgPSByZWN0LmdldExpbmVEKCk7XHJcblxyXG4gICAgICAgIEdldExpbmVUb0NpcmNsZShsaW5lQSwgY2lyY2xlLCBvdXQpO1xyXG4gICAgICAgIEdldExpbmVUb0NpcmNsZShsaW5lQiwgY2lyY2xlLCBvdXQpO1xyXG4gICAgICAgIEdldExpbmVUb0NpcmNsZShsaW5lQywgY2lyY2xlLCBvdXQpO1xyXG4gICAgICAgIEdldExpbmVUb0NpcmNsZShsaW5lRCwgY2lyY2xlLCBvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldENpcmNsZVRvUmVjdGFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIFZhemVsbGVcclxuICogQGF1dGhvciAgICAgICBHZW9mZnJleSBHbGFpdmVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcbnZhciBMaW5lVG9DaXJjbGUgPSByZXF1aXJlKCcuL0xpbmVUb0NpcmNsZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGxpbmUgc2VnbWVudCBhbmQgY2lyY2xlLFxyXG4gKiBhbmQgcmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cyBhcyBhIFBvaW50IG9iamVjdCBhcnJheS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuR2V0TGluZVRvQ2lyY2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSBzZWdtZW50IHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIGNpcmNsZSB0byBjaGVjayBhZ2FpbnN0IHRoZSBsaW5lLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldExpbmVUb0NpcmNsZSA9IGZ1bmN0aW9uIChsaW5lLCBjaXJjbGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgaWYgKExpbmVUb0NpcmNsZShsaW5lLCBjaXJjbGUpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBseDEgPSBsaW5lLngxO1xyXG4gICAgICAgIHZhciBseTEgPSBsaW5lLnkxO1xyXG5cclxuICAgICAgICB2YXIgbHgyID0gbGluZS54MjtcclxuICAgICAgICB2YXIgbHkyID0gbGluZS55MjtcclxuXHJcbiAgICAgICAgdmFyIGN4ID0gY2lyY2xlLng7XHJcbiAgICAgICAgdmFyIGN5ID0gY2lyY2xlLnk7XHJcbiAgICAgICAgdmFyIGNyID0gY2lyY2xlLnJhZGl1cztcclxuXHJcbiAgICAgICAgdmFyIGxEaXJYID0gbHgyIC0gbHgxO1xyXG4gICAgICAgIHZhciBsRGlyWSA9IGx5MiAtIGx5MTtcclxuICAgICAgICB2YXIgb0RpclggPSBseDEgLSBjeDtcclxuICAgICAgICB2YXIgb0RpclkgPSBseTEgLSBjeTtcclxuXHJcbiAgICAgICAgdmFyIGNvZWZmaWNpZW50QSA9IGxEaXJYICogbERpclggKyBsRGlyWSAqIGxEaXJZO1xyXG4gICAgICAgIHZhciBjb2VmZmljaWVudEIgPSAyICogKGxEaXJYICogb0RpclggKyBsRGlyWSAqIG9EaXJZKTtcclxuICAgICAgICB2YXIgY29lZmZpY2llbnRDID0gb0RpclggKiBvRGlyWCArIG9EaXJZICogb0RpclkgLSBjciAqIGNyO1xyXG5cclxuICAgICAgICB2YXIgbGFtYmRhID0gKGNvZWZmaWNpZW50QiAqIGNvZWZmaWNpZW50QikgLSAoNCAqIGNvZWZmaWNpZW50QSAqIGNvZWZmaWNpZW50Qyk7XHJcblxyXG4gICAgICAgIHZhciB4LCB5O1xyXG5cclxuICAgICAgICBpZiAobGFtYmRhID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHJvb3QgPSAtY29lZmZpY2llbnRCIC8gKDIgKiBjb2VmZmljaWVudEEpO1xyXG4gICAgICAgICAgICB4ID0gbHgxICsgcm9vdCAqIGxEaXJYO1xyXG4gICAgICAgICAgICB5ID0gbHkxICsgcm9vdCAqIGxEaXJZO1xyXG4gICAgICAgICAgICBpZiAocm9vdCA+PSAwICYmIHJvb3QgPD0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChsYW1iZGEgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHJvb3QxID0gKC1jb2VmZmljaWVudEIgLSBNYXRoLnNxcnQobGFtYmRhKSkgLyAoMiAqIGNvZWZmaWNpZW50QSk7XHJcbiAgICAgICAgICAgIHggPSBseDEgKyByb290MSAqIGxEaXJYO1xyXG4gICAgICAgICAgICB5ID0gbHkxICsgcm9vdDEgKiBsRGlyWTtcclxuICAgICAgICAgICAgaWYgKHJvb3QxID49IDAgJiYgcm9vdDEgPD0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHJvb3QyID0gKC1jb2VmZmljaWVudEIgKyBNYXRoLnNxcnQobGFtYmRhKSkgLyAoMiAqIGNvZWZmaWNpZW50QSk7XHJcbiAgICAgICAgICAgIHggPSBseDEgKyByb290MiAqIGxEaXJYO1xyXG4gICAgICAgICAgICB5ID0gbHkxICsgcm9vdDIgKiBsRGlyWTtcclxuICAgICAgICAgICAgaWYgKHJvb3QyID49IDAgJiYgcm9vdDIgPD0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIHkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRMaW5lVG9DaXJjbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIEZsb3JpYW4gVmF6ZWxsZVxyXG4gKiBAYXV0aG9yICAgICAgIEdlb2ZmcmV5IEdsYWl2ZVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxudmFyIExpbmVUb0xpbmUgPSByZXF1aXJlKCcuL0xpbmVUb0xpbmUnKTtcclxudmFyIExpbmVUb1JlY3RhbmdsZSA9IHJlcXVpcmUoJy4vTGluZVRvUmVjdGFuZ2xlJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGZvciBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgTGluZSBhbmQgYSBSZWN0YW5nbGUgc2hhcGUsXHJcbiAqIGFuZCByZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFzIGEgUG9pbnQgb2JqZWN0IGFycmF5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5HZXRMaW5lVG9SZWN0YW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBMaW5lIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlJlY3RhbmdsZXxvYmplY3QpfSByZWN0IC0gVGhlIFJlY3RhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldExpbmVUb1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChsaW5lLCByZWN0LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIGlmIChMaW5lVG9SZWN0YW5nbGUobGluZSwgcmVjdCkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpbmVBID0gcmVjdC5nZXRMaW5lQSgpO1xyXG4gICAgICAgIHZhciBsaW5lQiA9IHJlY3QuZ2V0TGluZUIoKTtcclxuICAgICAgICB2YXIgbGluZUMgPSByZWN0LmdldExpbmVDKCk7XHJcbiAgICAgICAgdmFyIGxpbmVEID0gcmVjdC5nZXRMaW5lRCgpO1xyXG5cclxuICAgICAgICB2YXIgb3V0cHV0ID0gWyBuZXcgUG9pbnQoKSwgbmV3IFBvaW50KCksIG5ldyBQb2ludCgpLCBuZXcgUG9pbnQoKSBdO1xyXG5cclxuICAgICAgICB2YXIgcmVzdWx0ID0gW1xyXG4gICAgICAgICAgICBMaW5lVG9MaW5lKGxpbmVBLCBsaW5lLCBvdXRwdXRbMF0pLFxyXG4gICAgICAgICAgICBMaW5lVG9MaW5lKGxpbmVCLCBsaW5lLCBvdXRwdXRbMV0pLFxyXG4gICAgICAgICAgICBMaW5lVG9MaW5lKGxpbmVDLCBsaW5lLCBvdXRwdXRbMl0pLFxyXG4gICAgICAgICAgICBMaW5lVG9MaW5lKGxpbmVELCBsaW5lLCBvdXRwdXRbM10pXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0W2ldKSB7IG91dC5wdXNoKG91dHB1dFtpXSk7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0TGluZVRvUmVjdGFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBSZWN0YW5nbGVUb1JlY3RhbmdsZSA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlVG9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIFJlY3RhbmdsZSBzaGFwZXMgaW50ZXJzZWN0IGFuZCByZXR1cm5zIHRoZSBhcmVhIG9mIHRoaXMgaW50ZXJzZWN0aW9uIGFzIFJlY3RhbmdsZSBvYmplY3QuXHJcbiAqIFxyXG4gKiBJZiBvcHRpb25hbCBgb3V0cHV0YCBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgbmV3IFJlY3RhbmdsZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZXJlIGlzIGludGVyc2VjdGlvbiwgaXQgd2lsbCBjb250YWluIGludGVyc2VjdGlvbiBhcmVhLiBJZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24sIGl0IHdpbCBiZSBlbXB0eSBSZWN0YW5nbGUgKGFsbCB2YWx1ZXMgc2V0IHRvIHplcm8pLlxyXG4gKiBcclxuICogSWYgUmVjdGFuZ2xlIG9iamVjdCBpcyBwYXNzZWQgYXMgYG91dHB1dGAgYW5kIHRoZXJlIGlzIGludGVyc2VjdGlvbiwgdGhlbiBpbnRlcnNlY3Rpb24gYXJlYSBkYXRhIHdpbGwgYmUgbG9hZGVkIGludG8gaXQgYW5kIGl0IHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbiwgaXQgd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0IGFueSBjaGFuZ2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLkdldFJlY3RhbmdsZUludGVyc2VjdGlvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3RBIC0gVGhlIGZpcnN0IFJlY3RhbmdsZSBvYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0QiAtIFRoZSBzZWNvbmQgUmVjdGFuZ2xlIG9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFtvdXRwdXRdIC0gT3B0aW9uYWwgUmVjdGFuZ2xlIG9iamVjdC4gSWYgZ2l2ZW4sIHRoZSBpbnRlcnNlY3Rpb24gZGF0YSB3aWxsIGJlIGxvYWRlZCBpbnRvIGl0IChpbiBjYXNlIG9mIG5vIGludGVyc2VjdGlvbiwgaXQgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZCkuIE90aGVyd2lzZSwgbmV3IFJlY3RhbmdsZSBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZCB3aXRoIGVpdGhlciBpbnRlcnNlY3Rpb24gZGF0YSBvciBlbXB0eSAoYWxsIHZhbHVlcyBzZXQgdG8gemVybyksIGlmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBBIHJlY3RhbmdsZSBvYmplY3Qgd2l0aCBpbnRlcnNlY3Rpb24gZGF0YS5cclxuICovXHJcbnZhciBHZXRSZWN0YW5nbGVJbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBvdXRwdXQpXHJcbntcclxuICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSBuZXcgUmVjdGFuZ2xlKCk7IH1cclxuXHJcbiAgICBpZiAoUmVjdGFuZ2xlVG9SZWN0YW5nbGUocmVjdEEsIHJlY3RCKSlcclxuICAgIHtcclxuICAgICAgICBvdXRwdXQueCA9IE1hdGgubWF4KHJlY3RBLngsIHJlY3RCLngpO1xyXG4gICAgICAgIG91dHB1dC55ID0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XHJcbiAgICAgICAgb3V0cHV0LndpZHRoID0gTWF0aC5taW4ocmVjdEEucmlnaHQsIHJlY3RCLnJpZ2h0KSAtIG91dHB1dC54O1xyXG4gICAgICAgIG91dHB1dC5oZWlnaHQgPSBNYXRoLm1pbihyZWN0QS5ib3R0b20sIHJlY3RCLmJvdHRvbSkgLSBvdXRwdXQueTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRSZWN0YW5nbGVJbnRlcnNlY3Rpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIEZsb3JpYW4gVmF6ZWxsZVxyXG4gKiBAYXV0aG9yICAgICAgIEdlb2ZmcmV5IEdsYWl2ZVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldExpbmVUb1JlY3RhbmdsZSA9IHJlcXVpcmUoJy4vR2V0TGluZVRvUmVjdGFuZ2xlJyk7XHJcbnZhciBSZWN0YW5nbGVUb1JlY3RhbmdsZSA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlVG9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIFJlY3RhbmdsZXMgaW50ZXJzZWN0IGFuZCByZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFzIGEgUG9pbnQgb2JqZWN0IGFycmF5LlxyXG4gKlxyXG4gKiBBIFJlY3RhbmdsZSBpbnRlcnNlY3RzIGFub3RoZXIgUmVjdGFuZ2xlIGlmIGFueSBwYXJ0IG9mIGl0cyBib3VuZHMgaXMgd2l0aGluIHRoZSBvdGhlciBSZWN0YW5nbGUncyBib3VuZHMuIEFzIHN1Y2gsIHRoZSB0d28gUmVjdGFuZ2xlcyBhcmUgY29uc2lkZXJlZCBcInNvbGlkXCIuIEEgUmVjdGFuZ2xlIHdpdGggbm8gd2lkdGggb3Igbm8gaGVpZ2h0IHdpbGwgbmV2ZXIgaW50ZXJzZWN0IGFub3RoZXIgUmVjdGFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5HZXRSZWN0YW5nbGVUb1JlY3RhbmdsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3RBIC0gVGhlIGZpcnN0IFJlY3RhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEIgLSBUaGUgc2Vjb25kIFJlY3RhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldFJlY3RhbmdsZVRvUmVjdGFuZ2xlID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICBpZiAoUmVjdGFuZ2xlVG9SZWN0YW5nbGUocmVjdEEsIHJlY3RCKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbGluZUEgPSByZWN0QS5nZXRMaW5lQSgpO1xyXG4gICAgICAgIHZhciBsaW5lQiA9IHJlY3RBLmdldExpbmVCKCk7XHJcbiAgICAgICAgdmFyIGxpbmVDID0gcmVjdEEuZ2V0TGluZUMoKTtcclxuICAgICAgICB2YXIgbGluZUQgPSByZWN0QS5nZXRMaW5lRCgpO1xyXG5cclxuICAgICAgICBHZXRMaW5lVG9SZWN0YW5nbGUobGluZUEsIHJlY3RCLCBvdXQpO1xyXG4gICAgICAgIEdldExpbmVUb1JlY3RhbmdsZShsaW5lQiwgcmVjdEIsIG91dCk7XHJcbiAgICAgICAgR2V0TGluZVRvUmVjdGFuZ2xlKGxpbmVDLCByZWN0Qiwgb3V0KTtcclxuICAgICAgICBHZXRMaW5lVG9SZWN0YW5nbGUobGluZUQsIHJlY3RCLCBvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFJlY3RhbmdsZVRvUmVjdGFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIFZhemVsbGVcclxuICogQGF1dGhvciAgICAgICBHZW9mZnJleSBHbGFpdmVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSZWN0YW5nbGVUb1RyaWFuZ2xlID0gcmVxdWlyZSgnLi9SZWN0YW5nbGVUb1RyaWFuZ2xlJyk7XHJcbnZhciBHZXRMaW5lVG9SZWN0YW5nbGUgPSByZXF1aXJlKCcuL0dldExpbmVUb1JlY3RhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gUmVjdGFuZ2xlIHNoYXBlIGFuZCBUcmlhbmdsZSBzaGFwZSxcclxuICogYW5kIHJldHVybnMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMgYXMgYSBQb2ludCBvYmplY3QgYXJyYXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLkdldFJlY3RhbmdsZVRvVHJpYW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gUmVjdGFuZ2xlIG9iamVjdCB0byB0ZXN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRyaWFuZ2xlIG9iamVjdCB0byB0ZXN0LlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldFJlY3RhbmdsZVRvVHJpYW5nbGUgPSBmdW5jdGlvbiAocmVjdCwgdHJpYW5nbGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgaWYgKFJlY3RhbmdsZVRvVHJpYW5nbGUocmVjdCwgdHJpYW5nbGUpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaW5lQSA9IHRyaWFuZ2xlLmdldExpbmVBKCk7XHJcbiAgICAgICAgdmFyIGxpbmVCID0gdHJpYW5nbGUuZ2V0TGluZUIoKTtcclxuICAgICAgICB2YXIgbGluZUMgPSB0cmlhbmdsZS5nZXRMaW5lQygpO1xyXG5cclxuICAgICAgICBHZXRMaW5lVG9SZWN0YW5nbGUobGluZUEsIHJlY3QsIG91dCk7XHJcbiAgICAgICAgR2V0TGluZVRvUmVjdGFuZ2xlKGxpbmVCLCByZWN0LCBvdXQpO1xyXG4gICAgICAgIEdldExpbmVUb1JlY3RhbmdsZShsaW5lQywgcmVjdCwgb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRSZWN0YW5nbGVUb1RyaWFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIFZhemVsbGVcclxuICogQGF1dGhvciAgICAgICBHZW9mZnJleSBHbGFpdmVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRMaW5lVG9DaXJjbGUgPSByZXF1aXJlKCcuL0dldExpbmVUb0NpcmNsZScpO1xyXG52YXIgVHJpYW5nbGVUb0NpcmNsZSA9IHJlcXVpcmUoJy4vVHJpYW5nbGVUb0NpcmNsZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIFRyaWFuZ2xlIGFuZCBhIENpcmNsZSBpbnRlcnNlY3QsIGFuZCByZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFzIGEgUG9pbnQgb2JqZWN0IGFycmF5LlxyXG4gKlxyXG4gKiBBIENpcmNsZSBpbnRlcnNlY3RzIGEgVHJpYW5nbGUgaWYgaXRzIGNlbnRlciBpcyBsb2NhdGVkIHdpdGhpbiBpdCBvciBpZiBhbnkgb2YgdGhlIFRyaWFuZ2xlJ3Mgc2lkZXMgaW50ZXJzZWN0IHRoZSBDaXJjbGUuIEFzIHN1Y2gsIHRoZSBUcmlhbmdsZSBhbmQgdGhlIENpcmNsZSBhcmUgY29uc2lkZXJlZCBcInNvbGlkXCIgZm9yIHRoZSBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLkdldFRyaWFuZ2xlVG9DaXJjbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgQ2lyY2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqIEBwYXJhbSB7YXJyYXl9IFtvdXRdIC0gQW4gb3B0aW9uYWwgYXJyYXkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHBvaW50cyBvZiBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSB3aXRoIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uIGlmIG9iamVjdHMgaW50ZXJzZWN0LCBvdGhlcndpc2UgYW4gZW1wdHkgYXJyYXkuXHJcbiAqL1xyXG52YXIgR2V0VHJpYW5nbGVUb0NpcmNsZSA9IGZ1bmN0aW9uICh0cmlhbmdsZSwgY2lyY2xlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIGlmIChUcmlhbmdsZVRvQ2lyY2xlKHRyaWFuZ2xlLCBjaXJjbGUpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaW5lQSA9IHRyaWFuZ2xlLmdldExpbmVBKCk7XHJcbiAgICAgICAgdmFyIGxpbmVCID0gdHJpYW5nbGUuZ2V0TGluZUIoKTtcclxuICAgICAgICB2YXIgbGluZUMgPSB0cmlhbmdsZS5nZXRMaW5lQygpO1xyXG5cclxuICAgICAgICBHZXRMaW5lVG9DaXJjbGUobGluZUEsIGNpcmNsZSwgb3V0KTtcclxuICAgICAgICBHZXRMaW5lVG9DaXJjbGUobGluZUIsIGNpcmNsZSwgb3V0KTtcclxuICAgICAgICBHZXRMaW5lVG9DaXJjbGUobGluZUMsIGNpcmNsZSwgb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUcmlhbmdsZVRvQ2lyY2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIFZhemVsbGVcclxuICogQGF1dGhvciAgICAgICBHZW9mZnJleSBHbGFpdmVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcbnZhciBUcmlhbmdsZVRvTGluZSA9IHJlcXVpcmUoJy4vVHJpYW5nbGVUb0xpbmUnKTtcclxudmFyIExpbmVUb0xpbmUgPSByZXF1aXJlKCcuL0xpbmVUb0xpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBUcmlhbmdsZSBhbmQgYSBMaW5lIGludGVyc2VjdCwgYW5kIHJldHVybnMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMgYXMgYSBQb2ludCBvYmplY3QgYXJyYXkuXHJcbiAqXHJcbiAqIFRoZSBMaW5lIGludGVyc2VjdHMgdGhlIFRyaWFuZ2xlIGlmIGl0IHN0YXJ0cyBpbnNpZGUgb2YgaXQsIGVuZHMgaW5zaWRlIG9mIGl0LCBvciBjcm9zc2VzIGFueSBvZiB0aGUgVHJpYW5nbGUncyBzaWRlcy4gVGh1cywgdGhlIFRyaWFuZ2xlIGlzIGNvbnNpZGVyZWQgXCJzb2xpZFwiLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5HZXRUcmlhbmdsZVRvTGluZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gY2hlY2sgd2l0aC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIExpbmUgdG8gY2hlY2sgd2l0aC5cclxuICogQHBhcmFtIHthcnJheX0gW291dF0gLSBBbiBvcHRpb25hbCBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IHdpdGggdGhlIHBvaW50cyBvZiBpbnRlcnNlY3Rpb24gaWYgb2JqZWN0cyBpbnRlcnNlY3QsIG90aGVyd2lzZSBhbiBlbXB0eSBhcnJheS5cclxuICovXHJcbnZhciBHZXRUcmlhbmdsZVRvTGluZSA9IGZ1bmN0aW9uICh0cmlhbmdsZSwgbGluZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICBpZiAoVHJpYW5nbGVUb0xpbmUodHJpYW5nbGUsIGxpbmUpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaW5lQSA9IHRyaWFuZ2xlLmdldExpbmVBKCk7XHJcbiAgICAgICAgdmFyIGxpbmVCID0gdHJpYW5nbGUuZ2V0TGluZUIoKTtcclxuICAgICAgICB2YXIgbGluZUMgPSB0cmlhbmdsZS5nZXRMaW5lQygpO1xyXG5cclxuICAgICAgICB2YXIgb3V0cHV0ID0gWyBuZXcgUG9pbnQoKSwgbmV3IFBvaW50KCksIG5ldyBQb2ludCgpIF07XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXHJcbiAgICAgICAgICAgIExpbmVUb0xpbmUobGluZUEsIGxpbmUsIG91dHB1dFswXSksXHJcbiAgICAgICAgICAgIExpbmVUb0xpbmUobGluZUIsIGxpbmUsIG91dHB1dFsxXSksXHJcbiAgICAgICAgICAgIExpbmVUb0xpbmUobGluZUMsIGxpbmUsIG91dHB1dFsyXSlcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRbaV0pIHsgb3V0LnB1c2gob3V0cHV0W2ldKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUcmlhbmdsZVRvTGluZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgRmxvcmlhbiBWYXplbGxlXHJcbiAqIEBhdXRob3IgICAgICAgR2VvZmZyZXkgR2xhaXZlXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVHJpYW5nbGVUb1RyaWFuZ2xlID0gcmVxdWlyZSgnLi9UcmlhbmdsZVRvVHJpYW5nbGUnKTtcclxudmFyIEdldFRyaWFuZ2xlVG9MaW5lID0gcmVxdWlyZSgnLi9HZXRUcmlhbmdsZVRvTGluZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gVHJpYW5nbGVzIGludGVyc2VjdCwgYW5kIHJldHVybnMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMgYXMgYSBQb2ludCBvYmplY3QgYXJyYXkuXHJcbiAqXHJcbiAqIEEgVHJpYW5nbGUgaW50ZXJzZWN0cyBhbm90aGVyIFRyaWFuZ2xlIGlmIGFueSBwYWlyIG9mIHRoZWlyIGxpbmVzIGludGVyc2VjdHMgb3IgaWYgYW55IHBvaW50IG9mIG9uZSBUcmlhbmdsZSBpcyB3aXRoaW4gdGhlIG90aGVyIFRyaWFuZ2xlLiBUaHVzLCB0aGUgVHJpYW5nbGVzIGFyZSBjb25zaWRlcmVkIFwic29saWRcIi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuR2V0VHJpYW5nbGVUb1RyaWFuZ2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZUEgLSBUaGUgZmlyc3QgVHJpYW5nbGUgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGVCIC0gVGhlIHNlY29uZCBUcmlhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIG9wdGlvbmFsIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBwb2ludHMgb2YgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCB0aGUgcG9pbnRzIG9mIGludGVyc2VjdGlvbiBpZiBvYmplY3RzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LlxyXG4gKi9cclxudmFyIEdldFRyaWFuZ2xlVG9UcmlhbmdsZSA9IGZ1bmN0aW9uICh0cmlhbmdsZUEsIHRyaWFuZ2xlQiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICBpZiAoVHJpYW5nbGVUb1RyaWFuZ2xlKHRyaWFuZ2xlQSwgdHJpYW5nbGVCKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbGluZUEgPSB0cmlhbmdsZUIuZ2V0TGluZUEoKTtcclxuICAgICAgICB2YXIgbGluZUIgPSB0cmlhbmdsZUIuZ2V0TGluZUIoKTtcclxuICAgICAgICB2YXIgbGluZUMgPSB0cmlhbmdsZUIuZ2V0TGluZUMoKTtcclxuXHJcbiAgICAgICAgR2V0VHJpYW5nbGVUb0xpbmUodHJpYW5nbGVBLCBsaW5lQSwgb3V0KTtcclxuICAgICAgICBHZXRUcmlhbmdsZVRvTGluZSh0cmlhbmdsZUEsIGxpbmVCLCBvdXQpO1xyXG4gICAgICAgIEdldFRyaWFuZ2xlVG9MaW5lKHRyaWFuZ2xlQSwgbGluZUMsIG91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0VHJpYW5nbGVUb1RyaWFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDb250YWlucyA9IHJlcXVpcmUoJy4uL2NpcmNsZS9Db250YWlucycpO1xyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxudmFyIHRtcCA9IG5ldyBQb2ludCgpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGxpbmUgc2VnbWVudCBhbmQgY2lyY2xlLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiBjb2RlIGJ5IFtNYXR0IERlc0xhdXJpZXJzXShodHRwczovL2dpdGh1Yi5jb20vbWF0dGRlc2wvbGluZS1jaXJjbGUtY29sbGlzaW9uL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWQpLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5MaW5lVG9DaXJjbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHNlZ21lbnQgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBjaXJjbGUgLSBUaGUgY2lyY2xlIHRvIGNoZWNrIGFnYWluc3QgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fGFueSl9IFtuZWFyZXN0XSAtIEFuIG9wdGlvbmFsIFBvaW50LWxpa2Ugb2JqZWN0LiBJZiBnaXZlbiB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgTGluZSB3aGVyZSB0aGUgY2lyY2xlIGludGVyc2VjdHMgd2lsbCBiZSBzdG9yZWQgaW4gdGhpcyBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHdvIG9iamVjdHMgaW50ZXJzZWN0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBMaW5lVG9DaXJjbGUgPSBmdW5jdGlvbiAobGluZSwgY2lyY2xlLCBuZWFyZXN0KVxyXG57XHJcbiAgICBpZiAobmVhcmVzdCA9PT0gdW5kZWZpbmVkKSB7IG5lYXJlc3QgPSB0bXA7IH1cclxuXHJcbiAgICBpZiAoQ29udGFpbnMoY2lyY2xlLCBsaW5lLngxLCBsaW5lLnkxKSlcclxuICAgIHtcclxuICAgICAgICBuZWFyZXN0LnggPSBsaW5lLngxO1xyXG4gICAgICAgIG5lYXJlc3QueSA9IGxpbmUueTE7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDb250YWlucyhjaXJjbGUsIGxpbmUueDIsIGxpbmUueTIpKVxyXG4gICAge1xyXG4gICAgICAgIG5lYXJlc3QueCA9IGxpbmUueDI7XHJcbiAgICAgICAgbmVhcmVzdC55ID0gbGluZS55MjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGR4ID0gbGluZS54MiAtIGxpbmUueDE7XHJcbiAgICB2YXIgZHkgPSBsaW5lLnkyIC0gbGluZS55MTtcclxuXHJcbiAgICB2YXIgbGN4ID0gY2lyY2xlLnggLSBsaW5lLngxO1xyXG4gICAgdmFyIGxjeSA9IGNpcmNsZS55IC0gbGluZS55MTtcclxuXHJcbiAgICAvLyAgcHJvamVjdCBsYyBvbnRvIGQsIHJlc3VsdGluZyBpbiB2ZWN0b3IgcFxyXG4gICAgdmFyIGRMZW4yID0gKGR4ICogZHgpICsgKGR5ICogZHkpO1xyXG4gICAgdmFyIHB4ID0gZHg7XHJcbiAgICB2YXIgcHkgPSBkeTtcclxuXHJcbiAgICBpZiAoZExlbjIgPiAwKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkcCA9ICgobGN4ICogZHgpICsgKGxjeSAqIGR5KSkgLyBkTGVuMjtcclxuXHJcbiAgICAgICAgcHggKj0gZHA7XHJcbiAgICAgICAgcHkgKj0gZHA7XHJcbiAgICB9XHJcblxyXG4gICAgbmVhcmVzdC54ID0gbGluZS54MSArIHB4O1xyXG4gICAgbmVhcmVzdC55ID0gbGluZS55MSArIHB5O1xyXG4gICAgXHJcbiAgICAvLyAgbGVuMiBvZiBwXHJcbiAgICB2YXIgcExlbjIgPSAocHggKiBweCkgKyAocHkgKiBweSk7XHJcbiAgICBcclxuICAgIHJldHVybiAoXHJcbiAgICAgICAgcExlbjIgPD0gZExlbjIgJiZcclxuICAgICAgICAoKHB4ICogZHgpICsgKHB5ICogZHkpKSA+PSAwICYmXHJcbiAgICAgICAgQ29udGFpbnMoY2lyY2xlLCBuZWFyZXN0LngsIG5lYXJlc3QueSlcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVUb0NpcmNsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLy8gIFRoaXMgaXMgYmFzZWQgb2ZmIGFuIGV4cGxhbmF0aW9uIGFuZCBleHBhbmRlZCBtYXRoIHByZXNlbnRlZCBieSBQYXVsIEJvdXJrZTpcclxuLy8gIFNlZSBodHRwOidsb2NhbC53YXNwLnV3YS5lZHUuYXUvfnBib3Vya2UvZ2VvbWV0cnkvbGluZWxpbmUyZC9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIExpbmVzIGludGVyc2VjdC4gSWYgdGhlIExpbmVzIGFyZSBpZGVudGljYWwsIHRoZXkgd2lsbCBiZSB0cmVhdGVkIGFzIHBhcmFsbGVsIGFuZCB0aHVzIG5vbi1pbnRlcnNlY3RpbmcuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLkxpbmVUb0xpbmVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZTEgLSBUaGUgZmlyc3QgTGluZSB0byBjaGVjay5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lMiAtIFRoZSBzZWNvbmQgTGluZSB0byBjaGVjay5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gW291dF0gLSBBIFBvaW50IGluIHdoaWNoIHRvIG9wdGlvbmFsbHkgc3RvcmUgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gTGluZXMgaW50ZXJzZWN0LCBhbmQgdGhlIGBvdXRgIG9iamVjdCB3aWxsIGJlIHBvcHVsYXRlZCwgaWYgZ2l2ZW4uIE90aGVyd2lzZSwgYGZhbHNlYC5cclxuICovXHJcbnZhciBMaW5lVG9MaW5lID0gZnVuY3Rpb24gKGxpbmUxLCBsaW5lMiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICB2YXIgeDEgPSBsaW5lMS54MTtcclxuICAgIHZhciB5MSA9IGxpbmUxLnkxO1xyXG4gICAgdmFyIHgyID0gbGluZTEueDI7XHJcbiAgICB2YXIgeTIgPSBsaW5lMS55MjtcclxuXHJcbiAgICB2YXIgeDMgPSBsaW5lMi54MTtcclxuICAgIHZhciB5MyA9IGxpbmUyLnkxO1xyXG4gICAgdmFyIHg0ID0gbGluZTIueDI7XHJcbiAgICB2YXIgeTQgPSBsaW5lMi55MjtcclxuXHJcbiAgICB2YXIgbnVtQSA9ICh4NCAtIHgzKSAqICh5MSAtIHkzKSAtICh5NCAtIHkzKSAqICh4MSAtIHgzKTtcclxuICAgIHZhciBudW1CID0gKHgyIC0geDEpICogKHkxIC0geTMpIC0gKHkyIC0geTEpICogKHgxIC0geDMpO1xyXG4gICAgdmFyIGRlTm9tID0gKHk0IC0geTMpICogKHgyIC0geDEpIC0gKHg0IC0geDMpICogKHkyIC0geTEpO1xyXG5cclxuICAgIC8vICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgZGl2aXNpb24gYnkgemVybyAtIHRoaXMgYWxzbyBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluZXMgYXJlIHBhcmFsbGVsLlxyXG4gICAgLy8gIElmIG51bUEgYW5kIG51bUIgd2VyZSBib3RoIGVxdWFsIHRvIHplcm8gdGhlIGxpbmVzIHdvdWxkIGJlIG9uIHRvcCBvZiBlYWNoIG90aGVyIChjb2luY2lkZW50YWwpLlxyXG4gICAgLy8gIFRoaXMgY2hlY2sgaXMgbm90IGRvbmUgYmVjYXVzZSBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIGltcGxlbWVudGF0aW9uICh0aGUgcGFyYWxsZWwgY2hlY2sgYWNjb3VudHMgZm9yIHRoaXMpLlxyXG5cclxuICAgIGlmIChkZU5vbSA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIENhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIGZyYWN0aW9uYWwgcG9pbnQgdGhhdCB0aGUgbGluZXMgcG90ZW50aWFsbHkgaW50ZXJzZWN0LlxyXG5cclxuICAgIHZhciB1QSA9IG51bUEgLyBkZU5vbTtcclxuICAgIHZhciB1QiA9IG51bUIgLyBkZU5vbTtcclxuXHJcbiAgICAvLyAgVGhlIGZyYWN0aW9uYWwgcG9pbnQgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlIGlmIHRoZSBsaW5lcyBpbnRlcnNlY3QuXHJcbiAgICAvLyAgSWYgdGhlIGZyYWN0aW9uYWwgY2FsY3VsYXRpb24gaXMgbGFyZ2VyIHRoYW4gMSBvciBzbWFsbGVyIHRoYW4gMCB0aGUgbGluZXMgd291bGQgbmVlZCB0byBiZSBsb25nZXIgdG8gaW50ZXJzZWN0LlxyXG5cclxuICAgIGlmICh1QSA+PSAwICYmIHVBIDw9IDEgJiYgdUIgPj0gMCAmJiB1QiA8PSAxKVxyXG4gICAge1xyXG4gICAgICAgIG91dC54ID0geDEgKyAodUEgKiAoeDIgLSB4MSkpO1xyXG4gICAgICAgIG91dC55ID0geTEgKyAodUEgKiAoeTIgLSB5MSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVUb0xpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIExpbmUgYW5kIGEgUmVjdGFuZ2xlIHNoYXBlLCBvciBhIHJlY3RhbmdsZS1saWtlXHJcbiAqIG9iamVjdCwgd2l0aCBwdWJsaWMgYHhgLCBgeWAsIGByaWdodGAgYW5kIGBib3R0b21gIHByb3BlcnRpZXMsIHN1Y2ggYXMgYSBTcHJpdGUgb3IgQm9keS5cclxuICpcclxuICogQW4gaW50ZXJzZWN0aW9uIGlzIGNvbnNpZGVyZWQgdmFsaWQgaWY6XHJcbiAqXHJcbiAqIFRoZSBsaW5lIHN0YXJ0cyB3aXRoaW4sIG9yIGVuZHMgd2l0aGluLCB0aGUgUmVjdGFuZ2xlLlxyXG4gKiBUaGUgbGluZSBzZWdtZW50IGludGVyc2VjdHMgb25lIG9mIHRoZSA0IHJlY3RhbmdsZSBlZGdlcy5cclxuICpcclxuICogVGhlIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBmdW5jdGlvbiByZWN0YW5nbGVzIGFyZSBjb25zaWRlcmVkICdzb2xpZCcuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLkxpbmVUb1JlY3RhbmdsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIExpbmUgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbi5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUmVjdGFuZ2xlfG9iamVjdCl9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgTGluZSBhbmQgdGhlIFJlY3RhbmdsZSBpbnRlcnNlY3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxyXG4gKi9cclxudmFyIExpbmVUb1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChsaW5lLCByZWN0KVxyXG57XHJcbiAgICB2YXIgeDEgPSBsaW5lLngxO1xyXG4gICAgdmFyIHkxID0gbGluZS55MTtcclxuXHJcbiAgICB2YXIgeDIgPSBsaW5lLngyO1xyXG4gICAgdmFyIHkyID0gbGluZS55MjtcclxuXHJcbiAgICB2YXIgYngxID0gcmVjdC54O1xyXG4gICAgdmFyIGJ5MSA9IHJlY3QueTtcclxuICAgIHZhciBieDIgPSByZWN0LnJpZ2h0O1xyXG4gICAgdmFyIGJ5MiA9IHJlY3QuYm90dG9tO1xyXG5cclxuICAgIHZhciB0ID0gMDtcclxuXHJcbiAgICAvLyAgSWYgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbGluZSBpcyBpbnNpZGUgdGhlIHJlY3QgdGhlbiB3ZSBhc3N1bWVcclxuICAgIC8vICBjb2xsaXNpb24sIGFzIHJlY3RzIGFyZSBzb2xpZCBmb3Igb3VyIHVzZS1jYXNlLlxyXG5cclxuICAgIGlmICgoeDEgPj0gYngxICYmIHgxIDw9IGJ4MiAmJiB5MSA+PSBieTEgJiYgeTEgPD0gYnkyKSB8fFxyXG4gICAgICAgICh4MiA+PSBieDEgJiYgeDIgPD0gYngyICYmIHkyID49IGJ5MSAmJiB5MiA8PSBieTIpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4MSA8IGJ4MSAmJiB4MiA+PSBieDEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIExlZnQgZWRnZVxyXG4gICAgICAgIHQgPSB5MSArICh5MiAtIHkxKSAqIChieDEgLSB4MSkgLyAoeDIgLSB4MSk7XHJcblxyXG4gICAgICAgIGlmICh0ID4gYnkxICYmIHQgPD0gYnkyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoeDEgPiBieDIgJiYgeDIgPD0gYngyKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBSaWdodCBlZGdlXHJcbiAgICAgICAgdCA9IHkxICsgKHkyIC0geTEpICogKGJ4MiAtIHgxKSAvICh4MiAtIHgxKTtcclxuXHJcbiAgICAgICAgaWYgKHQgPj0gYnkxICYmIHQgPD0gYnkyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh5MSA8IGJ5MSAmJiB5MiA+PSBieTEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFRvcCBlZGdlXHJcbiAgICAgICAgdCA9IHgxICsgKHgyIC0geDEpICogKGJ5MSAtIHkxKSAvICh5MiAtIHkxKTtcclxuXHJcbiAgICAgICAgaWYgKHQgPj0gYngxICYmIHQgPD0gYngyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoeTEgPiBieTIgJiYgeTIgPD0gYnkyKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBCb3R0b20gZWRnZVxyXG4gICAgICAgIHQgPSB4MSArICh4MiAtIHgxKSAqIChieTIgLSB5MSkgLyAoeTIgLSB5MSk7XHJcblxyXG4gICAgICAgIGlmICh0ID49IGJ4MSAmJiB0IDw9IGJ4MilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVUb1JlY3RhbmdsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmxvcmlhbiBNZXJ0ZW5zXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBhIFBvaW50IGZhbGxzIGJldHdlZW4gdGhlIHR3byBlbmQtcG9pbnRzIG9mIGEgTGluZSwgYmFzZWQgb24gdGhlIGdpdmVuIGxpbmUgdGhpY2tuZXNzLlxyXG4gKiBcclxuICogQXNzdW1lcyB0aGF0IHRoZSBsaW5lIGVuZCBwb2ludHMgYXJlIGNpcmN1bGFyLCBub3Qgc3F1YXJlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5Qb2ludFRvTGluZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8YW55KX0gcG9pbnQgLSBUaGUgcG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0IHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSBzZWdtZW50IHRvIHRlc3QgZm9yIGludGVyc2VjdGlvbiBvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lVGhpY2tuZXNzPTFdIC0gVGhlIGxpbmUgdGhpY2tuZXNzLiBBc3N1bWVzIHRoYXQgdGhlIGxpbmUgZW5kIHBvaW50cyBhcmUgY2lyY3VsYXIuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgUG9pbnQgZmFsbHMgb24gdGhlIExpbmUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFBvaW50VG9MaW5lID0gZnVuY3Rpb24gKHBvaW50LCBsaW5lLCBsaW5lVGhpY2tuZXNzKVxyXG57XHJcbiAgICBpZiAobGluZVRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkKSB7IGxpbmVUaGlja25lc3MgPSAxOyB9XHJcblxyXG4gICAgdmFyIHgxID0gbGluZS54MTtcclxuICAgIHZhciB5MSA9IGxpbmUueTE7XHJcblxyXG4gICAgdmFyIHgyID0gbGluZS54MjtcclxuICAgIHZhciB5MiA9IGxpbmUueTI7XHJcblxyXG4gICAgdmFyIHB4ID0gcG9pbnQueDtcclxuICAgIHZhciBweSA9IHBvaW50Lnk7XHJcblxyXG4gICAgdmFyIEwyID0gKCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkpICsgKCh5MiAtIHkxKSAqICh5MiAtIHkxKSkpO1xyXG5cclxuICAgIGlmIChMMiA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHIgPSAoKChweCAtIHgxKSAqICh4MiAtIHgxKSkgKyAoKHB5IC0geTEpICogKHkyIC0geTEpKSkgLyBMMjtcclxuXHJcbiAgICAvLyAgQXNzdW1lIGxpbmUgdGhpY2tuZXNzIGlzIGNpcmN1bGFyXHJcbiAgICBpZiAociA8IDApXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE91dHNpZGUgbGluZTFcclxuICAgICAgICByZXR1cm4gKE1hdGguc3FydCgoKHgxIC0gcHgpICogKHgxIC0gcHgpKSArICgoeTEgLSBweSkgKiAoeTEgLSBweSkpKSA8PSBsaW5lVGhpY2tuZXNzKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKChyID49IDApICYmIChyIDw9IDEpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBPbiB0aGUgbGluZSBzZWdtZW50XHJcbiAgICAgICAgdmFyIHMgPSAoKCh5MSAtIHB5KSAqICh4MiAtIHgxKSkgLSAoKHgxIC0gcHgpICogKHkyIC0geTEpKSkgLyBMMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIChNYXRoLmFicyhzKSAqIE1hdGguc3FydChMMikgPD0gbGluZVRoaWNrbmVzcyk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE91dHNpZGUgbGluZTJcclxuICAgICAgICByZXR1cm4gKE1hdGguc3FydCgoKHgyIC0gcHgpICogKHgyIC0gcHgpKSArICgoeTIgLSBweSkgKiAoeTIgLSBweSkpKSA8PSBsaW5lVGhpY2tuZXNzKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUG9pbnRUb0xpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50VG9MaW5lID0gcmVxdWlyZSgnLi9Qb2ludFRvTGluZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIFBvaW50IGlzIGxvY2F0ZWQgb24gdGhlIGdpdmVuIGxpbmUgc2VnbWVudC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuUG9pbnRUb0xpbmVTZWdtZW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBQb2ludCB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSBzZWdtZW50IHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgUG9pbnQgaXMgb24gdGhlIGdpdmVuIGxpbmUgc2VnbWVudCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgUG9pbnRUb0xpbmVTZWdtZW50ID0gZnVuY3Rpb24gKHBvaW50LCBsaW5lKVxyXG57XHJcbiAgICBpZiAoIVBvaW50VG9MaW5lKHBvaW50LCBsaW5lKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHhNaW4gPSBNYXRoLm1pbihsaW5lLngxLCBsaW5lLngyKTtcclxuICAgIHZhciB4TWF4ID0gTWF0aC5tYXgobGluZS54MSwgbGluZS54Mik7XHJcbiAgICB2YXIgeU1pbiA9IE1hdGgubWluKGxpbmUueTEsIGxpbmUueTIpO1xyXG4gICAgdmFyIHlNYXggPSBNYXRoLm1heChsaW5lLnkxLCBsaW5lLnkyKTtcclxuXHJcbiAgICByZXR1cm4gKChwb2ludC54ID49IHhNaW4gJiYgcG9pbnQueCA8PSB4TWF4KSAmJiAocG9pbnQueSA+PSB5TWluICYmIHBvaW50LnkgPD0geU1heCkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQb2ludFRvTGluZVNlZ21lbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gUmVjdGFuZ2xlcyBpbnRlcnNlY3QuXHJcbiAqXHJcbiAqIEEgUmVjdGFuZ2xlIGludGVyc2VjdHMgYW5vdGhlciBSZWN0YW5nbGUgaWYgYW55IHBhcnQgb2YgaXRzIGJvdW5kcyBpcyB3aXRoaW4gdGhlIG90aGVyIFJlY3RhbmdsZSdzIGJvdW5kcy5cclxuICogQXMgc3VjaCwgdGhlIHR3byBSZWN0YW5nbGVzIGFyZSBjb25zaWRlcmVkIFwic29saWRcIi5cclxuICogQSBSZWN0YW5nbGUgd2l0aCBubyB3aWR0aCBvciBubyBoZWlnaHQgd2lsbCBuZXZlciBpbnRlcnNlY3QgYW5vdGhlciBSZWN0YW5nbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLlJlY3RhbmdsZVRvUmVjdGFuZ2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEEgLSBUaGUgZmlyc3QgUmVjdGFuZ2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0QiAtIFRoZSBzZWNvbmQgUmVjdGFuZ2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHdvIFJlY3RhbmdsZXMgaW50ZXJzZWN0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBSZWN0YW5nbGVUb1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChyZWN0QSwgcmVjdEIpXHJcbntcclxuICAgIGlmIChyZWN0QS53aWR0aCA8PSAwIHx8IHJlY3RBLmhlaWdodCA8PSAwIHx8IHJlY3RCLndpZHRoIDw9IDAgfHwgcmVjdEIuaGVpZ2h0IDw9IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAhKHJlY3RBLnJpZ2h0IDwgcmVjdEIueCB8fCByZWN0QS5ib3R0b20gPCByZWN0Qi55IHx8IHJlY3RBLnggPiByZWN0Qi5yaWdodCB8fCByZWN0QS55ID4gcmVjdEIuYm90dG9tKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVjdGFuZ2xlVG9SZWN0YW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExpbmVUb0xpbmUgPSByZXF1aXJlKCcuL0xpbmVUb0xpbmUnKTtcclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi4vcmVjdGFuZ2xlL0NvbnRhaW5zJyk7XHJcbnZhciBDb250YWluc0FycmF5ID0gcmVxdWlyZSgnLi4vdHJpYW5nbGUvQ29udGFpbnNBcnJheScpO1xyXG52YXIgRGVjb21wb3NlID0gcmVxdWlyZSgnLi4vcmVjdGFuZ2xlL0RlY29tcG9zZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBmb3IgaW50ZXJzZWN0aW9uIGJldHdlZW4gUmVjdGFuZ2xlIHNoYXBlIGFuZCBUcmlhbmdsZSBzaGFwZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuUmVjdGFuZ2xlVG9UcmlhbmdsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBSZWN0YW5nbGUgb2JqZWN0IHRvIHRlc3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVHJpYW5nbGUgb2JqZWN0IHRvIHRlc3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IEEgdmFsdWUgb2YgYHRydWVgIGlmIG9iamVjdHMgaW50ZXJzZWN0OyBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBSZWN0YW5nbGVUb1RyaWFuZ2xlID0gZnVuY3Rpb24gKHJlY3QsIHRyaWFuZ2xlKVxyXG57XHJcbiAgICAvLyAgRmlyc3QgdGhlIGNoZWFwZXN0IG9uZXM6XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAgIHRyaWFuZ2xlLmxlZnQgPiByZWN0LnJpZ2h0IHx8XHJcbiAgICAgICAgdHJpYW5nbGUucmlnaHQgPCByZWN0LmxlZnQgfHxcclxuICAgICAgICB0cmlhbmdsZS50b3AgPiByZWN0LmJvdHRvbSB8fFxyXG4gICAgICAgIHRyaWFuZ2xlLmJvdHRvbSA8IHJlY3QudG9wKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdHJpQSA9IHRyaWFuZ2xlLmdldExpbmVBKCk7XHJcbiAgICB2YXIgdHJpQiA9IHRyaWFuZ2xlLmdldExpbmVCKCk7XHJcbiAgICB2YXIgdHJpQyA9IHRyaWFuZ2xlLmdldExpbmVDKCk7XHJcblxyXG4gICAgLy8gIEFyZSBhbnkgb2YgdGhlIHRyaWFuZ2xlIHBvaW50cyB3aXRoaW4gdGhlIHJlY3RhbmdsZT9cclxuXHJcbiAgICBpZiAoQ29udGFpbnMocmVjdCwgdHJpQS54MSwgdHJpQS55MSkgfHwgQ29udGFpbnMocmVjdCwgdHJpQS54MiwgdHJpQS55MikpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENvbnRhaW5zKHJlY3QsIHRyaUIueDEsIHRyaUIueTEpIHx8IENvbnRhaW5zKHJlY3QsIHRyaUIueDIsIHRyaUIueTIpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDb250YWlucyhyZWN0LCB0cmlDLngxLCB0cmlDLnkxKSB8fCBDb250YWlucyhyZWN0LCB0cmlDLngyLCB0cmlDLnkyKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgQ2hlYXAgdGVzdHMgb3Zlciwgbm93IHRvIHNlZSBpZiBhbnkgb2YgdGhlIGxpbmVzIGludGVyc2VjdCAuLi5cclxuXHJcbiAgICB2YXIgcmVjdEEgPSByZWN0LmdldExpbmVBKCk7XHJcbiAgICB2YXIgcmVjdEIgPSByZWN0LmdldExpbmVCKCk7XHJcbiAgICB2YXIgcmVjdEMgPSByZWN0LmdldExpbmVDKCk7XHJcbiAgICB2YXIgcmVjdEQgPSByZWN0LmdldExpbmVEKCk7XHJcblxyXG4gICAgaWYgKExpbmVUb0xpbmUodHJpQSwgcmVjdEEpIHx8IExpbmVUb0xpbmUodHJpQSwgcmVjdEIpIHx8IExpbmVUb0xpbmUodHJpQSwgcmVjdEMpIHx8IExpbmVUb0xpbmUodHJpQSwgcmVjdEQpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChMaW5lVG9MaW5lKHRyaUIsIHJlY3RBKSB8fCBMaW5lVG9MaW5lKHRyaUIsIHJlY3RCKSB8fCBMaW5lVG9MaW5lKHRyaUIsIHJlY3RDKSB8fCBMaW5lVG9MaW5lKHRyaUIsIHJlY3REKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTGluZVRvTGluZSh0cmlDLCByZWN0QSkgfHwgTGluZVRvTGluZSh0cmlDLCByZWN0QikgfHwgTGluZVRvTGluZSh0cmlDLCByZWN0QykgfHwgTGluZVRvTGluZSh0cmlDLCByZWN0RCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIE5vbmUgb2YgdGhlIGxpbmVzIGludGVyc2VjdCwgc28gYXJlIGFueSByZWN0YW5nbGUgcG9pbnRzIHdpdGhpbiB0aGUgdHJpYW5nbGU/XHJcblxyXG4gICAgdmFyIHBvaW50cyA9IERlY29tcG9zZShyZWN0KTtcclxuICAgIHZhciB3aXRoaW4gPSBDb250YWluc0FycmF5KHRyaWFuZ2xlLCBwb2ludHMsIHRydWUpO1xyXG5cclxuICAgIHJldHVybiAod2l0aGluLmxlbmd0aCA+IDApO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVUb1RyaWFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiByZWN0YW5nbGUgaW50ZXJzZWN0cyB3aXRoIHZhbHVlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkludGVyc2VjdHMuUmVjdGFuZ2xlVG9WYWx1ZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIHJlY3RhbmdsZSBvYmplY3RcclxuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsZWZ0IG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0IG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3Agb2YgdGhlIFJlY3RhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJvdHRvbSBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3RvbGVyYW5jZT0wXSAtIFRvbGVyYW5jZSBhbGxvd2VkIGluIHRoZSBjYWxjdWxhdGlvbiwgZXhwcmVzc2VkIGluIHBpeGVscy5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGludGVyc2VjdGlvbi5cclxuICovXHJcbnZhciBSZWN0YW5nbGVUb1ZhbHVlcyA9IGZ1bmN0aW9uIChyZWN0LCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvbGVyYW5jZSlcclxue1xyXG4gICAgaWYgKHRvbGVyYW5jZSA9PT0gdW5kZWZpbmVkKSB7IHRvbGVyYW5jZSA9IDA7IH1cclxuXHJcbiAgICByZXR1cm4gIShcclxuICAgICAgICBsZWZ0ID4gcmVjdC5yaWdodCArIHRvbGVyYW5jZSB8fFxyXG4gICAgICAgIHJpZ2h0IDwgcmVjdC5sZWZ0IC0gdG9sZXJhbmNlIHx8XHJcbiAgICAgICAgdG9wID4gcmVjdC5ib3R0b20gKyB0b2xlcmFuY2UgfHxcclxuICAgICAgICBib3R0b20gPCByZWN0LnRvcCAtIHRvbGVyYW5jZVxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVjdGFuZ2xlVG9WYWx1ZXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExpbmVUb0NpcmNsZSA9IHJlcXVpcmUoJy4vTGluZVRvQ2lyY2xlJyk7XHJcbnZhciBDb250YWlucyA9IHJlcXVpcmUoJy4uL3RyaWFuZ2xlL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgVHJpYW5nbGUgYW5kIGEgQ2lyY2xlIGludGVyc2VjdC5cclxuICpcclxuICogQSBDaXJjbGUgaW50ZXJzZWN0cyBhIFRyaWFuZ2xlIGlmIGl0cyBjZW50ZXIgaXMgbG9jYXRlZCB3aXRoaW4gaXQgb3IgaWYgYW55IG9mIHRoZSBUcmlhbmdsZSdzIHNpZGVzIGludGVyc2VjdCB0aGUgQ2lyY2xlLiBBcyBzdWNoLCB0aGUgVHJpYW5nbGUgYW5kIHRoZSBDaXJjbGUgYXJlIGNvbnNpZGVyZWQgXCJzb2xpZFwiIGZvciB0aGUgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5UcmlhbmdsZVRvQ2lyY2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkNpcmNsZX0gY2lyY2xlIC0gVGhlIENpcmNsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFRyaWFuZ2xlIGFuZCB0aGUgYENpcmNsZWAgaW50ZXJzZWN0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBUcmlhbmdsZVRvQ2lyY2xlID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBjaXJjbGUpXHJcbntcclxuICAgIC8vICBGaXJzdCB0aGUgY2hlYXBlc3Qgb25lczpcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICAgdHJpYW5nbGUubGVmdCA+IGNpcmNsZS5yaWdodCB8fFxyXG4gICAgICAgIHRyaWFuZ2xlLnJpZ2h0IDwgY2lyY2xlLmxlZnQgfHxcclxuICAgICAgICB0cmlhbmdsZS50b3AgPiBjaXJjbGUuYm90dG9tIHx8XHJcbiAgICAgICAgdHJpYW5nbGUuYm90dG9tIDwgY2lyY2xlLnRvcClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKENvbnRhaW5zKHRyaWFuZ2xlLCBjaXJjbGUueCwgY2lyY2xlLnkpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChMaW5lVG9DaXJjbGUodHJpYW5nbGUuZ2V0TGluZUEoKSwgY2lyY2xlKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTGluZVRvQ2lyY2xlKHRyaWFuZ2xlLmdldExpbmVCKCksIGNpcmNsZSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKExpbmVUb0NpcmNsZSh0cmlhbmdsZS5nZXRMaW5lQygpLCBjaXJjbGUpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHJpYW5nbGVUb0NpcmNsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuLi90cmlhbmdsZS9Db250YWlucycpO1xyXG52YXIgTGluZVRvTGluZSA9IHJlcXVpcmUoJy4vTGluZVRvTGluZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIFRyaWFuZ2xlIGFuZCBhIExpbmUgaW50ZXJzZWN0LlxyXG4gKiBcclxuICogVGhlIExpbmUgaW50ZXJzZWN0cyB0aGUgVHJpYW5nbGUgaWYgaXQgc3RhcnRzIGluc2lkZSBvZiBpdCwgZW5kcyBpbnNpZGUgb2YgaXQsIG9yIGNyb3NzZXMgYW55IG9mIHRoZSBUcmlhbmdsZSdzIHNpZGVzLiBUaHVzLCB0aGUgVHJpYW5nbGUgaXMgY29uc2lkZXJlZCBcInNvbGlkXCIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzLlRyaWFuZ2xlVG9MaW5lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byBjaGVjayB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgTGluZSB0byBjaGVjayB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFRyaWFuZ2xlIGFuZCB0aGUgTGluZSBpbnRlcnNlY3QsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFRyaWFuZ2xlVG9MaW5lID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBsaW5lKVxyXG57XHJcbiAgICAvLyAgSWYgdGhlIFRyaWFuZ2xlIGNvbnRhaW5zIGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIHBvaW50IG9mIHRoZSBsaW5lLCBpdCBpbnRlcnNlY3RzXHJcbiAgICBpZiAoQ29udGFpbnModHJpYW5nbGUsIGxpbmUuZ2V0UG9pbnRBKCkpIHx8IENvbnRhaW5zKHRyaWFuZ2xlLCBsaW5lLmdldFBvaW50QigpKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgTm93IGNoZWNrIHRoZSBsaW5lIGFnYWluc3QgZWFjaCBsaW5lIG9mIHRoZSBUcmlhbmdsZVxyXG4gICAgaWYgKExpbmVUb0xpbmUodHJpYW5nbGUuZ2V0TGluZUEoKSwgbGluZSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKExpbmVUb0xpbmUodHJpYW5nbGUuZ2V0TGluZUIoKSwgbGluZSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKExpbmVUb0xpbmUodHJpYW5nbGUuZ2V0TGluZUMoKSwgbGluZSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUcmlhbmdsZVRvTGluZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnNBcnJheSA9IHJlcXVpcmUoJy4uL3RyaWFuZ2xlL0NvbnRhaW5zQXJyYXknKTtcclxudmFyIERlY29tcG9zZSA9IHJlcXVpcmUoJy4uL3RyaWFuZ2xlL0RlY29tcG9zZScpO1xyXG52YXIgTGluZVRvTGluZSA9IHJlcXVpcmUoJy4vTGluZVRvTGluZScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gVHJpYW5nbGVzIGludGVyc2VjdC5cclxuICpcclxuICogQSBUcmlhbmdsZSBpbnRlcnNlY3RzIGFub3RoZXIgVHJpYW5nbGUgaWYgYW55IHBhaXIgb2YgdGhlaXIgbGluZXMgaW50ZXJzZWN0cyBvciBpZiBhbnkgcG9pbnQgb2Ygb25lIFRyaWFuZ2xlIGlzIHdpdGhpbiB0aGUgb3RoZXIgVHJpYW5nbGUuIFRodXMsIHRoZSBUcmlhbmdsZXMgYXJlIGNvbnNpZGVyZWQgXCJzb2xpZFwiLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uSW50ZXJzZWN0cy5UcmlhbmdsZVRvVHJpYW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlQSAtIFRoZSBmaXJzdCBUcmlhbmdsZSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZUIgLSBUaGUgc2Vjb25kIFRyaWFuZ2xlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgVHJpYW5nbGVzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgVHJpYW5nbGVUb1RyaWFuZ2xlID0gZnVuY3Rpb24gKHRyaWFuZ2xlQSwgdHJpYW5nbGVCKVxyXG57XHJcbiAgICAvLyAgRmlyc3QgdGhlIGNoZWFwZXN0IG9uZXM6XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAgIHRyaWFuZ2xlQS5sZWZ0ID4gdHJpYW5nbGVCLnJpZ2h0IHx8XHJcbiAgICAgICAgdHJpYW5nbGVBLnJpZ2h0IDwgdHJpYW5nbGVCLmxlZnQgfHxcclxuICAgICAgICB0cmlhbmdsZUEudG9wID4gdHJpYW5nbGVCLmJvdHRvbSB8fFxyXG4gICAgICAgIHRyaWFuZ2xlQS5ib3R0b20gPCB0cmlhbmdsZUIudG9wKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGluZUFBID0gdHJpYW5nbGVBLmdldExpbmVBKCk7XHJcbiAgICB2YXIgbGluZUFCID0gdHJpYW5nbGVBLmdldExpbmVCKCk7XHJcbiAgICB2YXIgbGluZUFDID0gdHJpYW5nbGVBLmdldExpbmVDKCk7XHJcblxyXG4gICAgdmFyIGxpbmVCQSA9IHRyaWFuZ2xlQi5nZXRMaW5lQSgpO1xyXG4gICAgdmFyIGxpbmVCQiA9IHRyaWFuZ2xlQi5nZXRMaW5lQigpO1xyXG4gICAgdmFyIGxpbmVCQyA9IHRyaWFuZ2xlQi5nZXRMaW5lQygpO1xyXG5cclxuICAgIC8vICBOb3cgY2hlY2sgdGhlIGxpbmVzIGFnYWluc3QgZWFjaCBsaW5lIG9mIFRyaWFuZ2xlQlxyXG4gICAgaWYgKExpbmVUb0xpbmUobGluZUFBLCBsaW5lQkEpIHx8IExpbmVUb0xpbmUobGluZUFBLCBsaW5lQkIpIHx8IExpbmVUb0xpbmUobGluZUFBLCBsaW5lQkMpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChMaW5lVG9MaW5lKGxpbmVBQiwgbGluZUJBKSB8fCBMaW5lVG9MaW5lKGxpbmVBQiwgbGluZUJCKSB8fCBMaW5lVG9MaW5lKGxpbmVBQiwgbGluZUJDKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTGluZVRvTGluZShsaW5lQUMsIGxpbmVCQSkgfHwgTGluZVRvTGluZShsaW5lQUMsIGxpbmVCQikgfHwgTGluZVRvTGluZShsaW5lQUMsIGxpbmVCQykpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIE5vcGUsIHNvIGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIHBvaW50cyBvZiB0cmlhbmdsZUEgYXJlIHdpdGhpbiB0cmlhbmdsZUJcclxuXHJcbiAgICB2YXIgcG9pbnRzID0gRGVjb21wb3NlKHRyaWFuZ2xlQSk7XHJcbiAgICB2YXIgd2l0aGluID0gQ29udGFpbnNBcnJheSh0cmlhbmdsZUIsIHBvaW50cywgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKHdpdGhpbi5sZW5ndGggPiAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBGaW5hbGx5IGNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIHBvaW50cyBvZiB0cmlhbmdsZUIgYXJlIHdpdGhpbiB0cmlhbmdsZUFcclxuXHJcbiAgICBwb2ludHMgPSBEZWNvbXBvc2UodHJpYW5nbGVCKTtcclxuICAgIHdpdGhpbiA9IENvbnRhaW5zQXJyYXkodHJpYW5nbGVBLCBwb2ludHMsIHRydWUpO1xyXG5cclxuICAgIGlmICh3aXRoaW4ubGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRyaWFuZ2xlVG9UcmlhbmdsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuR2VvbS5JbnRlcnNlY3RzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ2lyY2xlVG9DaXJjbGU6IHJlcXVpcmUoJy4vQ2lyY2xlVG9DaXJjbGUnKSxcclxuICAgIENpcmNsZVRvUmVjdGFuZ2xlOiByZXF1aXJlKCcuL0NpcmNsZVRvUmVjdGFuZ2xlJyksXHJcbiAgICBHZXRDaXJjbGVUb0NpcmNsZTogcmVxdWlyZSgnLi9HZXRDaXJjbGVUb0NpcmNsZScpLFxyXG4gICAgR2V0Q2lyY2xlVG9SZWN0YW5nbGU6IHJlcXVpcmUoJy4vR2V0Q2lyY2xlVG9SZWN0YW5nbGUnKSxcclxuICAgIEdldExpbmVUb0NpcmNsZTogcmVxdWlyZSgnLi9HZXRMaW5lVG9DaXJjbGUnKSxcclxuICAgIEdldExpbmVUb1JlY3RhbmdsZTogcmVxdWlyZSgnLi9HZXRMaW5lVG9SZWN0YW5nbGUnKSxcclxuICAgIEdldFJlY3RhbmdsZUludGVyc2VjdGlvbjogcmVxdWlyZSgnLi9HZXRSZWN0YW5nbGVJbnRlcnNlY3Rpb24nKSxcclxuICAgIEdldFJlY3RhbmdsZVRvUmVjdGFuZ2xlOiByZXF1aXJlKCcuL0dldFJlY3RhbmdsZVRvUmVjdGFuZ2xlJyksXHJcbiAgICBHZXRSZWN0YW5nbGVUb1RyaWFuZ2xlOiByZXF1aXJlKCcuL0dldFJlY3RhbmdsZVRvVHJpYW5nbGUnKSxcclxuICAgIEdldFRyaWFuZ2xlVG9DaXJjbGU6IHJlcXVpcmUoJy4vR2V0VHJpYW5nbGVUb0NpcmNsZScpLFxyXG4gICAgR2V0VHJpYW5nbGVUb0xpbmU6IHJlcXVpcmUoJy4vR2V0VHJpYW5nbGVUb0xpbmUnKSxcclxuICAgIEdldFRyaWFuZ2xlVG9UcmlhbmdsZTogcmVxdWlyZSgnLi9HZXRUcmlhbmdsZVRvVHJpYW5nbGUnKSxcclxuICAgIExpbmVUb0NpcmNsZTogcmVxdWlyZSgnLi9MaW5lVG9DaXJjbGUnKSxcclxuICAgIExpbmVUb0xpbmU6IHJlcXVpcmUoJy4vTGluZVRvTGluZScpLFxyXG4gICAgTGluZVRvUmVjdGFuZ2xlOiByZXF1aXJlKCcuL0xpbmVUb1JlY3RhbmdsZScpLFxyXG4gICAgUG9pbnRUb0xpbmU6IHJlcXVpcmUoJy4vUG9pbnRUb0xpbmUnKSxcclxuICAgIFBvaW50VG9MaW5lU2VnbWVudDogcmVxdWlyZSgnLi9Qb2ludFRvTGluZVNlZ21lbnQnKSxcclxuICAgIFJlY3RhbmdsZVRvUmVjdGFuZ2xlOiByZXF1aXJlKCcuL1JlY3RhbmdsZVRvUmVjdGFuZ2xlJyksXHJcbiAgICBSZWN0YW5nbGVUb1RyaWFuZ2xlOiByZXF1aXJlKCcuL1JlY3RhbmdsZVRvVHJpYW5nbGUnKSxcclxuICAgIFJlY3RhbmdsZVRvVmFsdWVzOiByZXF1aXJlKCcuL1JlY3RhbmdsZVRvVmFsdWVzJyksXHJcbiAgICBUcmlhbmdsZVRvQ2lyY2xlOiByZXF1aXJlKCcuL1RyaWFuZ2xlVG9DaXJjbGUnKSxcclxuICAgIFRyaWFuZ2xlVG9MaW5lOiByZXF1aXJlKCcuL1RyaWFuZ2xlVG9MaW5lJyksXHJcbiAgICBUcmlhbmdsZVRvVHJpYW5nbGU6IHJlcXVpcmUoJy4vVHJpYW5nbGVUb1RyaWFuZ2xlJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgdGhlIGxpbmUgaW4gcmFkaWFucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuQW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIG9mIHRoZSBsaW5lLCBpbiByYWRpYW5zLlxyXG4gKi9cclxudmFyIEFuZ2xlID0gZnVuY3Rpb24gKGxpbmUpXHJcbntcclxuICAgIHJldHVybiBNYXRoLmF0YW4yKGxpbmUueTIgLSBsaW5lLnkxLCBsaW5lLngyIC0gbGluZS54MSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFuZ2xlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBVc2luZyBCcmVzZW5oYW0ncyBsaW5lIGFsZ29yaXRobSB0aGlzIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBjb29yZGluYXRlcyBvbiB0aGlzIGxpbmUuXHJcbiAqXHJcbiAqIFRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb2ludHMgYXJlIHJvdW5kZWQgYmVmb3JlIHRoaXMgcnVucyBhcyB0aGUgYWxnb3JpdGhtIHdvcmtzIG9uIGludGVnZXJzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5CcmVzZW5oYW1Qb2ludHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGVwUmF0ZT0xXSAtIFRoZSBvcHRpb25hbCBzdGVwIHJhdGUgZm9yIHRoZSBwb2ludHMgb24gdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2VbXX0gW3Jlc3VsdHNdIC0gQW4gb3B0aW9uYWwgYXJyYXkgdG8gcHVzaCB0aGUgcmVzdWx0aW5nIGNvb3JkaW5hdGVzIGludG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlW119IFRoZSBhcnJheSBvZiBjb29yZGluYXRlcyBvbiB0aGUgbGluZS5cclxuICovXHJcbnZhciBCcmVzZW5oYW1Qb2ludHMgPSBmdW5jdGlvbiAobGluZSwgc3RlcFJhdGUsIHJlc3VsdHMpXHJcbntcclxuICAgIGlmIChzdGVwUmF0ZSA9PT0gdW5kZWZpbmVkKSB7IHN0ZXBSYXRlID0gMTsgfVxyXG4gICAgaWYgKHJlc3VsdHMgPT09IHVuZGVmaW5lZCkgeyByZXN1bHRzID0gW107IH1cclxuXHJcbiAgICB2YXIgeDEgPSBNYXRoLnJvdW5kKGxpbmUueDEpO1xyXG4gICAgdmFyIHkxID0gTWF0aC5yb3VuZChsaW5lLnkxKTtcclxuICAgIHZhciB4MiA9IE1hdGgucm91bmQobGluZS54Mik7XHJcbiAgICB2YXIgeTIgPSBNYXRoLnJvdW5kKGxpbmUueTIpO1xyXG5cclxuICAgIHZhciBkeCA9IE1hdGguYWJzKHgyIC0geDEpO1xyXG4gICAgdmFyIGR5ID0gTWF0aC5hYnMoeTIgLSB5MSk7XHJcbiAgICB2YXIgc3ggPSAoeDEgPCB4MikgPyAxIDogLTE7XHJcbiAgICB2YXIgc3kgPSAoeTEgPCB5MikgPyAxIDogLTE7XHJcbiAgICB2YXIgZXJyID0gZHggLSBkeTtcclxuXHJcbiAgICByZXN1bHRzLnB1c2goeyB4OiB4MSwgeTogeTEgfSk7XHJcblxyXG4gICAgdmFyIGkgPSAxO1xyXG5cclxuICAgIHdoaWxlICghKCh4MSA9PT0geDIpICYmICh5MSA9PT0geTIpKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZTIgPSBlcnIgPDwgMTtcclxuXHJcbiAgICAgICAgaWYgKGUyID4gLWR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZXJyIC09IGR5O1xyXG4gICAgICAgICAgICB4MSArPSBzeDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlMiA8IGR4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZXJyICs9IGR4O1xyXG4gICAgICAgICAgICB5MSArPSBzeTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpICUgc3RlcFJhdGUgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goeyB4OiB4MSwgeTogeTEgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJyZXNlbmhhbVBvaW50cztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG5cclxuLyoqXHJcbiAqIENlbnRlciBhIGxpbmUgb24gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5DZW50ZXJPblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUgdG8gY2VudGVyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdG8gY2VudGVyIHRoZSBsaW5lIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIGNlbnRlciB0aGUgbGluZSBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uTGluZX0gVGhlIGNlbnRlcmVkIGxpbmUuXHJcbiAqL1xyXG52YXIgQ2VudGVyT24gPSBmdW5jdGlvbiAobGluZSwgeCwgeSlcclxue1xyXG4gICAgdmFyIHR4ID0geCAtICgobGluZS54MSArIGxpbmUueDIpIC8gMik7XHJcbiAgICB2YXIgdHkgPSB5IC0gKChsaW5lLnkxICsgbGluZS55MikgLyAyKTtcclxuXHJcbiAgICBsaW5lLngxICs9IHR4O1xyXG4gICAgbGluZS55MSArPSB0eTtcclxuXHJcbiAgICBsaW5lLngyICs9IHR4O1xyXG4gICAgbGluZS55MiArPSB0eTtcclxuXHJcbiAgICByZXR1cm4gbGluZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2VudGVyT247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExpbmUgPSByZXF1aXJlKCcuL0xpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBDbG9uZSB0aGUgZ2l2ZW4gbGluZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuQ2xvbmVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gc291cmNlIC0gVGhlIHNvdXJjZSBsaW5lIHRvIGNsb25lLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5MaW5lfSBUaGUgY2xvbmVkIGxpbmUuXHJcbiAqL1xyXG52YXIgQ2xvbmUgPSBmdW5jdGlvbiAoc291cmNlKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IExpbmUoc291cmNlLngxLCBzb3VyY2UueTEsIHNvdXJjZS54Miwgc291cmNlLnkyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2xvbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBvZiBvbmUgbGluZSB0byBhIGRlc3RpbmF0aW9uIGxpbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkNvcHlGcm9tXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtkZXN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gc291cmNlIC0gVGhlIHNvdXJjZSBsaW5lIHRvIGNvcHkgdGhlIHZhbHVlcyBmcm9tLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gbGluZSB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IFRoZSBkZXN0aW5hdGlvbiBsaW5lLlxyXG4gKi9cclxudmFyIENvcHlGcm9tID0gZnVuY3Rpb24gKHNvdXJjZSwgZGVzdClcclxue1xyXG4gICAgcmV0dXJuIGRlc3Quc2V0VG8oc291cmNlLngxLCBzb3VyY2UueTEsIHNvdXJjZS54Miwgc291cmNlLnkyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29weUZyb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbXBhcmUgdHdvIGxpbmVzIGZvciBzdHJpY3QgZXF1YWxpdHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkVxdWFsc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGZpcnN0IGxpbmUgdG8gY29tcGFyZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSB0b0NvbXBhcmUgLSBUaGUgc2Vjb25kIGxpbmUgdG8gY29tcGFyZS5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHdvIGxpbmVzIGFyZSBlcXVhbC5cclxuICovXHJcbnZhciBFcXVhbHMgPSBmdW5jdGlvbiAobGluZSwgdG9Db21wYXJlKVxyXG57XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIGxpbmUueDEgPT09IHRvQ29tcGFyZS54MSAmJlxyXG4gICAgICAgIGxpbmUueTEgPT09IHRvQ29tcGFyZS55MSAmJlxyXG4gICAgICAgIGxpbmUueDIgPT09IHRvQ29tcGFyZS54MiAmJlxyXG4gICAgICAgIGxpbmUueTIgPT09IHRvQ29tcGFyZS55MlxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRXF1YWxzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBMZW5ndGggPSByZXF1aXJlKCcuL0xlbmd0aCcpO1xyXG5cclxuLyoqXHJcbiAqIEV4dGVuZHMgdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIG9mIGEgTGluZSBieSB0aGUgZ2l2ZW4gYW1vdW50cy5cclxuICpcclxuICogVGhlIGFtb3VudHMgY2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiBQb3NpdGl2ZSBwb2ludHMgd2lsbCBpbmNyZWFzZSB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lLFxyXG4gKiB3aGlsZSBuZWdhdGl2ZSBvbmVzIHdpbGwgZGVjcmVhc2UgaXQuXHJcbiAqXHJcbiAqIElmIG5vIGByaWdodGAgdmFsdWUgaXMgcHJvdmlkZWQgaXQgd2lsbCBleHRlbmQgdGhlIGxlbmd0aCBvZiB0aGUgbGluZSBlcXVhbGx5IGluIGJvdGggZGlyZWN0aW9ucy5cclxuICpcclxuICogUGFzcyBhIHZhbHVlIG9mIHplcm8gdG8gbGVhdmUgdGhlIHN0YXJ0IG9yIGVuZCBwb2ludCB1bmNoYW5nZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkV4dGVuZFxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIGluc3RhbmNlIHRvIGV4dGVuZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgLSBUaGUgYW1vdW50IHRvIGV4dGVuZCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcmlnaHRdIC0gVGhlIGFtb3VudCB0byBleHRlbmQgdGhlIGVuZCBvZiB0aGUgbGluZSBieS4gSWYgbm90IGdpdmVuIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBgbGVmdGAgdmFsdWUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IFRoZSBtb2RpZmllZCBMaW5lIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEV4dGVuZCA9IGZ1bmN0aW9uIChsaW5lLCBsZWZ0LCByaWdodClcclxue1xyXG4gICAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHsgcmlnaHQgPSBsZWZ0OyB9XHJcblxyXG4gICAgdmFyIGxlbmd0aCA9IExlbmd0aChsaW5lKTtcclxuXHJcbiAgICB2YXIgc2xvcFggPSBsaW5lLngyIC0gbGluZS54MTtcclxuICAgIHZhciBzbG9wWSA9IGxpbmUueTIgLSBsaW5lLnkxO1xyXG5cclxuICAgIGlmIChsZWZ0KVxyXG4gICAge1xyXG4gICAgICAgIGxpbmUueDEgPSBsaW5lLngxIC0gc2xvcFggLyBsZW5ndGggKiBsZWZ0O1xyXG4gICAgICAgIGxpbmUueTEgPSBsaW5lLnkxIC0gc2xvcFkgLyBsZW5ndGggKiBsZWZ0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyaWdodClcclxuICAgIHtcclxuICAgICAgICBsaW5lLngyID0gbGluZS54MiArIHNsb3BYIC8gbGVuZ3RoICogcmlnaHQ7XHJcbiAgICAgICAgbGluZS55MiA9IGxpbmUueTIgKyBzbG9wWSAvIGxlbmd0aCAqIHJpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFeHRlbmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIERpc3RhbmNlQmV0d2VlblBvaW50cyA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuUG9pbnRzJyk7XHJcbnZhciBHZXRFYXNlRnVuY3Rpb24gPSByZXF1aXJlKCcuLi8uLi90d2VlbnMvYnVpbGRlcnMvR2V0RWFzZUZ1bmN0aW9uJyk7XHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBgcXVhbnRpdHlgIFBvaW50cyB3aGVyZSBlYWNoIHBvaW50IGlzIHRha2VuIGZyb20gdGhlIGdpdmVuIExpbmUsXHJcbiAqIHNwYWNlZCBvdXQgYWNjb3JkaW5nIHRvIHRoZSBlYXNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogY29uc3QgbGluZSA9IG5ldyBQaGFzZXIuR2VvbS5MaW5lKDEwMCwgMzAwLCA3MDAsIDMwMCk7XHJcbiAqIGNvbnN0IHBvaW50cyA9IFBoYXNlci5HZW9tLkxpbmUuR2V0RWFzZWRQb2ludHMobGluZSwgJ3NpbmUub3V0JywgMzIpXHJcbiAqIGBgYFxyXG4gKiBcclxuICogSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBgcG9pbnRzYCBhcnJheSB3aWxsIGNvbnRhaW4gMzIgcG9pbnRzIHNwcmVhZC1vdXQgYWNyb3NzXHJcbiAqIHRoZSBsZW5ndGggb2YgYGxpbmVgLCB3aGVyZSB0aGUgcG9zaXRpb24gb2YgZWFjaCBwb2ludCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgU2luZS5vdXRgXHJcbiAqIGVhc2UgZnVuY3Rpb24uXHJcbiAqIFxyXG4gKiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGNvbGxpbmVhciB0aHJlc2hvbGQuIEluIHRoaXMgY2FzZSwgdGhlIHJlc3VsdGluZyBwb2ludHNcclxuICogYXJlIGNoZWNrZWQgYWdhaW5zdCBlYWNoIG90aGVyLCBhbmQgaWYgdGhleSBhcmUgYDwgY29sbGluZWFyVGhyZXNob2xkYCBkaXN0YW5jZSBhcGFydCxcclxuICogdGhleSBhcmUgZHJvcHBlZCBmcm9tIHRoZSByZXN1bHRzLiBUaGlzIGNhbiBoZWxwIGF2b2lkIGxvdHMgb2YgY2x1c3RlcmVkIHBvaW50cyBhdFxyXG4gKiBmYXIgZW5kcyBvZiB0aGUgbGluZSB3aXRoIHRpZ2h0bHktcGFja2VkIGVhc2VzIHN1Y2ggYXMgUXVhcnRpYy4gTGVhdmUgdGhlIHZhbHVlIHNldFxyXG4gKiB0byB6ZXJvIHRvIHNraXAgdGhpcyBjaGVjay5cclxuICogXHJcbiAqIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIGNvbGxpbmVhciB0aHJlc2hvbGQsIHRoZSByZXN1bHRpbmcgYXJyYXkgbWF5IG5vdCBhbHdheXNcclxuICogY29udGFpbiBgcXVhbnRpdHlgIHBvaW50cy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuR2V0RWFzZWRQb2ludHNcclxuICogQHNpbmNlIDMuMjMuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIExpbmUgb2JqZWN0LlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBlYXNlIC0gVGhlIGVhc2UgdG8gdXNlLiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgZnJvbSB0aGUgRWFzZU1hcCwgb3IgYSBjdXN0b20gZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gcXVhbnRpdHkgLSBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byByZXR1cm4uIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSBhIGBjb2xsaW5lYXJUaHJlc2hvbGRgLCB0aGUgcmVzdWx0aW5nIGFycmF5IG1heSBub3QgYWx3YXlzIGNvbnRhaW4gdGhpcyBudW1iZXIgb2YgcG9pbnRzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbGxpbmVhclRocmVzaG9sZD0wXSAtIEFuIG9wdGlvbmFsIHRocmVzaG9sZC4gVGhlIGZpbmFsIGFycmF5IGlzIHJlZHVjZWQgc28gdGhhdCBlYWNoIHBvaW50IGlzIHNwYWNlZCBvdXQgYXQgbGVhc3QgdGhpcyBkaXN0YW5jZSBhcGFydC4gVGhpcyBoZWxwcyByZWR1Y2UgY2x1c3RlcmluZyBpbiBub2lzZXkgZWFzZXMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IFtlYXNlUGFyYW1zXSAtIEFuIG9wdGlvbmFsIGFycmF5IG9mIGVhc2UgcGFyYW1ldGVycyB0byBnbyB3aXRoIHRoZSBlYXNlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludFtdfSBBbiBhcnJheSBvZiBHZW9tLlBvaW50cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIG9uIHRoZSBsaW5lLlxyXG4gKi9cclxudmFyIEdldEVhc2VkUG9pbnRzID0gZnVuY3Rpb24gKGxpbmUsIGVhc2UsIHF1YW50aXR5LCBjb2xsaW5lYXJUaHJlc2hvbGQsIGVhc2VQYXJhbXMpXHJcbntcclxuICAgIGlmIChjb2xsaW5lYXJUaHJlc2hvbGQgPT09IHVuZGVmaW5lZCkgeyBjb2xsaW5lYXJUaHJlc2hvbGQgPSAwOyB9XHJcbiAgICBpZiAoZWFzZVBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7IGVhc2VQYXJhbXMgPSBbXTsgfVxyXG5cclxuICAgIHZhciByZXN1bHRzID0gW107XHJcblxyXG4gICAgdmFyIHgxID0gbGluZS54MTtcclxuICAgIHZhciB5MSA9IGxpbmUueTE7XHJcblxyXG4gICAgdmFyIHNwYWNlWCA9IGxpbmUueDIgLSB4MTtcclxuICAgIHZhciBzcGFjZVkgPSBsaW5lLnkyIC0geTE7XHJcblxyXG4gICAgdmFyIGVhc2VGdW5jID0gR2V0RWFzZUZ1bmN0aW9uKGVhc2UsIGVhc2VQYXJhbXMpO1xyXG5cclxuICAgIHZhciBpO1xyXG4gICAgdmFyIHY7XHJcbiAgICB2YXIgcSA9IHF1YW50aXR5IC0gMTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcTsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHYgPSBlYXNlRnVuYyhpIC8gcSk7XHJcblxyXG4gICAgICAgIHJlc3VsdHMucHVzaChuZXcgUG9pbnQoeDEgKyAoc3BhY2VYICogdiksIHkxICsgKHNwYWNlWSAqIHYpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFsd2F5cyBpbmNsdWRlIHRoZSBlbmQgb2YgdGhlIGxpbmVcclxuICAgIHYgPSBlYXNlRnVuYygxKTtcclxuXHJcbiAgICByZXN1bHRzLnB1c2gobmV3IFBvaW50KHgxICsgKHNwYWNlWCAqIHYpLCB5MSArIChzcGFjZVkgKiB2KSkpO1xyXG5cclxuICAgIC8vICBSZW1vdmUgY29sbGluZWFyIHBhcnRzXHJcbiAgICBpZiAoY29sbGluZWFyVGhyZXNob2xkID4gMClcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJldlBvaW50ID0gcmVzdWx0c1swXTtcclxuXHJcbiAgICAgICAgLy8gIFN0b3JlIHRoZSBuZXcgcmVzdWx0cyBoZXJlXHJcbiAgICAgICAgdmFyIHNvcnRlZFJlc3VsdHMgPSBbIHByZXZQb2ludCBdO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcG9pbnQgPSByZXN1bHRzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKERpc3RhbmNlQmV0d2VlblBvaW50cyhwcmV2UG9pbnQsIHBvaW50KSA+PSBjb2xsaW5lYXJUaHJlc2hvbGQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNvcnRlZFJlc3VsdHMucHVzaChwb2ludCk7XHJcbiAgICAgICAgICAgICAgICBwcmV2UG9pbnQgPSBwb2ludDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRvcCBhbmQgdGFpbFxyXG4gICAgICAgIHZhciBlbmRQb2ludCA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKERpc3RhbmNlQmV0d2VlblBvaW50cyhwcmV2UG9pbnQsIGVuZFBvaW50KSA8IGNvbGxpbmVhclRocmVzaG9sZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNvcnRlZFJlc3VsdHMucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzb3J0ZWRSZXN1bHRzLnB1c2goZW5kUG9pbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gc29ydGVkUmVzdWx0cztcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0RWFzZWRQb2ludHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIG1pZHBvaW50IG9mIHRoZSBnaXZlbiBsaW5lLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5HZXRNaWRQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBnZXQgdGhlIG1pZHBvaW50IG9mLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIEFuIG9wdGlvbmFsIHBvaW50IG9iamVjdCB0byBzdG9yZSB0aGUgbWlkcG9pbnQgaW4uXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBUaGUgbWlkcG9pbnQgb2YgdGhlIExpbmUuXHJcbiAqL1xyXG52YXIgR2V0TWlkUG9pbnQgPSBmdW5jdGlvbiAobGluZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICBvdXQueCA9IChsaW5lLngxICsgbGluZS54MikgLyAyO1xyXG4gICAgb3V0LnkgPSAobGluZS55MSArIGxpbmUueTIpIC8gMjtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRNaWRQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmxvcmlhbiBNZXJ0ZW5zXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgbmVhcmVzdCBwb2ludCBvbiBhIGxpbmUgcGVycGVuZGljdWxhciB0byB0aGUgZ2l2ZW4gcG9pbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkdldE5lYXJlc3RQb2ludFxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUgdG8gZ2V0IHRoZSBuZWFyZXN0IHBvaW50IG9uLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBwb2ludCAtIFRoZSBwb2ludCB0byBnZXQgdGhlIG5lYXJlc3QgcG9pbnQgdG8uXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb3B0aW9uYWwgcG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0LCB0byBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG5lYXJlc3QgcG9pbnQgb24gdGhlIGxpbmUuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBUaGUgbmVhcmVzdCBwb2ludCBvbiB0aGUgbGluZS5cclxuICovXHJcbnZhciBHZXROZWFyZXN0UG9pbnQgPSBmdW5jdGlvbiAobGluZSwgcG9pbnQsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIHgxID0gbGluZS54MTtcclxuICAgIHZhciB5MSA9IGxpbmUueTE7XHJcblxyXG4gICAgdmFyIHgyID0gbGluZS54MjtcclxuICAgIHZhciB5MiA9IGxpbmUueTI7XHJcblxyXG4gICAgdmFyIEwyID0gKCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkpICsgKCh5MiAtIHkxKSAqICh5MiAtIHkxKSkpO1xyXG5cclxuICAgIGlmIChMMiA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByID0gKCgocG9pbnQueCAtIHgxKSAqICh4MiAtIHgxKSkgKyAoKHBvaW50LnkgLSB5MSkgKiAoeTIgLSB5MSkpKSAvIEwyO1xyXG5cclxuICAgIG91dC54ID0geDEgKyAociAqICh4MiAtIHgxKSk7XHJcbiAgICBvdXQueSA9IHkxICsgKHIgKiAoeTIgLSB5MSkpO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE5lYXJlc3RQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTUFUSF9DT05TVCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvY29uc3QnKTtcclxudmFyIEFuZ2xlID0gcmVxdWlyZSgnLi9BbmdsZScpO1xyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgbm9ybWFsIG9mIHRoZSBnaXZlbiBsaW5lLlxyXG4gKlxyXG4gKiBUaGUgbm9ybWFsIG9mIGEgbGluZSBpcyBhIHZlY3RvciB0aGF0IHBvaW50cyBwZXJwZW5kaWN1bGFyIGZyb20gaXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkdldE5vcm1hbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbCBvZi5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dF0gLSBBbiBvcHRpb25hbCBwb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIG5vcm1hbCBpbi5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFRoZSBub3JtYWwgb2YgdGhlIExpbmUuXHJcbiAqL1xyXG52YXIgR2V0Tm9ybWFsID0gZnVuY3Rpb24gKGxpbmUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIGEgPSBBbmdsZShsaW5lKSAtIE1BVEhfQ09OU1QuVEFVO1xyXG5cclxuICAgIG91dC54ID0gTWF0aC5jb3MoYSk7XHJcbiAgICBvdXQueSA9IE1hdGguc2luKGEpO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE5vcm1hbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIEdldCBhIHBvaW50IG9uIGEgbGluZSB0aGF0J3MgYSBnaXZlbiBwZXJjZW50YWdlIGFsb25nIGl0cyBsZW5ndGguXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLkdldFBvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gLSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgd2hlcmUgMCBpcyB0aGUgc3RhcnQsIDAuNSBpcyB0aGUgbWlkZGxlIGFuZCAxIGlzIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb3B0aW9uYWwgcG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0LCB0byBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IG9uIHRoZSBsaW5lLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gVGhlIHBvaW50IG9uIHRoZSBsaW5lLlxyXG4gKi9cclxudmFyIEdldFBvaW50ID0gZnVuY3Rpb24gKGxpbmUsIHBvc2l0aW9uLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIG91dC54ID0gbGluZS54MSArIChsaW5lLngyIC0gbGluZS54MSkgKiBwb3NpdGlvbjtcclxuICAgIG91dC55ID0gbGluZS55MSArIChsaW5lLnkyIC0gbGluZS55MSkgKiBwb3NpdGlvbjtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTGVuZ3RoID0gcmVxdWlyZSgnLi9MZW5ndGgnKTtcclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBHZXQgYSBudW1iZXIgb2YgcG9pbnRzIGFsb25nIGEgbGluZSdzIGxlbmd0aC5cclxuICpcclxuICogUHJvdmlkZSBhIGBxdWFudGl0eWAgdG8gZ2V0IGFuIGV4YWN0IG51bWJlciBvZiBwb2ludHMgYWxvbmcgdGhlIGxpbmUuXHJcbiAqXHJcbiAqIFByb3ZpZGUgYSBgc3RlcFJhdGVgIHRvIGVuc3VyZSBhIHNwZWNpZmljIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBwb2ludCBvbiB0aGUgbGluZS4gU2V0IGBxdWFudGl0eWAgdG8gYDBgIHdoZW5cclxuICogcHJvdmlkaW5nIGEgYHN0ZXBSYXRlYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuR2V0UG9pbnRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gcXVhbnRpdHkgLSBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBwbGFjZSBvbiB0aGUgbGluZS4gU2V0IHRvIGAwYCB0byB1c2UgYHN0ZXBSYXRlYCBpbnN0ZWFkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBSYXRlXSAtIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcG9pbnQgb24gdGhlIGxpbmUuIFdoZW4gc2V0LCBgcXVhbnRpdHlgIGlzIGltcGxpZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gYDBgLlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gW291dF0gLSBBbiBvcHRpb25hbCBhcnJheSBvZiBQb2ludHMsIG9yIHBvaW50LWxpa2Ugb2JqZWN0cywgdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgb24gdGhlIGxpbmUuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gQW4gYXJyYXkgb2YgUG9pbnRzLCBvciBwb2ludC1saWtlIG9iamVjdHMsIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgb24gdGhlIGxpbmUuXHJcbiAqL1xyXG52YXIgR2V0UG9pbnRzID0gZnVuY3Rpb24gKGxpbmUsIHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICAvLyAgSWYgcXVhbnRpdHkgaXMgYSBmYWxzZXkgdmFsdWUgKGZhbHNlLCBudWxsLCAwLCB1bmRlZmluZWQsIGV0YykgdGhlbiB3ZSBjYWxjdWxhdGUgaXQgYmFzZWQgb24gdGhlIHN0ZXBSYXRlIGluc3RlYWQuXHJcbiAgICBpZiAoIXF1YW50aXR5ICYmIHN0ZXBSYXRlID4gMClcclxuICAgIHtcclxuICAgICAgICBxdWFudGl0eSA9IExlbmd0aChsaW5lKSAvIHN0ZXBSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB4MSA9IGxpbmUueDE7XHJcbiAgICB2YXIgeTEgPSBsaW5lLnkxO1xyXG5cclxuICAgIHZhciB4MiA9IGxpbmUueDI7XHJcbiAgICB2YXIgeTIgPSBsaW5lLnkyO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBpIC8gcXVhbnRpdHk7XHJcblxyXG4gICAgICAgIHZhciB4ID0geDEgKyAoeDIgLSB4MSkgKiBwb3NpdGlvbjtcclxuICAgICAgICB2YXIgeSA9IHkxICsgKHkyIC0geTEpICogcG9zaXRpb247XHJcblxyXG4gICAgICAgIG91dC5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG9pbnRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBGbG9yaWFuIE1lcnRlbnNcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIGZyb20gYSBMaW5lIHRvIHRoZSBnaXZlbiBQb2ludC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuR2V0U2hvcnRlc3REaXN0YW5jZVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUgdG8gZ2V0IHRoZSBkaXN0YW5jZSBmcm9tLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBwb2ludCAtIFRoZSBwb2ludCB0byBnZXQgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIHRvLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaG9ydGVzdCBkaXN0YW5jZSBmcm9tIHRoZSBsaW5lIHRvIHRoZSBwb2ludC5cclxuICovXHJcbnZhciBHZXRTaG9ydGVzdERpc3RhbmNlID0gZnVuY3Rpb24gKGxpbmUsIHBvaW50KVxyXG57XHJcbiAgICB2YXIgeDEgPSBsaW5lLngxO1xyXG4gICAgdmFyIHkxID0gbGluZS55MTtcclxuXHJcbiAgICB2YXIgeDIgPSBsaW5lLngyO1xyXG4gICAgdmFyIHkyID0gbGluZS55MjtcclxuXHJcbiAgICB2YXIgTDIgPSAoKCh4MiAtIHgxKSAqICh4MiAtIHgxKSkgKyAoKHkyIC0geTEpICogKHkyIC0geTEpKSk7XHJcblxyXG4gICAgaWYgKEwyID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcyA9ICgoKHkxIC0gcG9pbnQueSkgKiAoeDIgLSB4MSkpIC0gKCh4MSAtIHBvaW50LngpICogKHkyIC0geTEpKSkgLyBMMjtcclxuXHJcbiAgICByZXR1cm4gTWF0aC5hYnMocykgKiBNYXRoLnNxcnQoTDIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRTaG9ydGVzdERpc3RhbmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIGhlaWdodCBvZiB0aGUgZ2l2ZW4gbGluZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuSGVpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIGhlaWdodCBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGVpZ2h0IG9mIHRoZSBsaW5lLlxyXG4gKi9cclxudmFyIEhlaWdodCA9IGZ1bmN0aW9uIChsaW5lKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5hYnMobGluZS55MSAtIGxpbmUueTIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIZWlnaHQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBsaW5lLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5MZW5ndGhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIGxpbmUuXHJcbiAqL1xyXG52YXIgTGVuZ3RoID0gZnVuY3Rpb24gKGxpbmUpXHJcbntcclxuICAgIHJldHVybiBNYXRoLnNxcnQoKGxpbmUueDIgLSBsaW5lLngxKSAqIChsaW5lLngyIC0gbGluZS54MSkgKyAobGluZS55MiAtIGxpbmUueTEpICogKGxpbmUueTIgLSBsaW5lLnkxKSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExlbmd0aDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgR2V0UG9pbnQgPSByZXF1aXJlKCcuL0dldFBvaW50Jyk7XHJcbnZhciBHZXRQb2ludHMgPSByZXF1aXJlKCcuL0dldFBvaW50cycpO1xyXG52YXIgR0VPTV9DT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBSYW5kb20gPSByZXF1aXJlKCcuL1JhbmRvbScpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogRGVmaW5lcyBhIExpbmUgc2VnbWVudCwgYSBwYXJ0IG9mIGEgbGluZSBiZXR3ZWVuIHR3byBlbmRwb2ludHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBMaW5lXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2VvbVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDE9MF0gLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsaW5lcyBzdGFydGluZyBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5MT0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxpbmVzIHN0YXJ0aW5nIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3gyPTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgZW5kaW5nIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgZW5kaW5nIHBvaW50LlxyXG4gKi9cclxudmFyIExpbmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTGluZSAoeDEsIHkxLCB4MiwgeTIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHgxID09PSB1bmRlZmluZWQpIHsgeDEgPSAwOyB9XHJcbiAgICAgICAgaWYgKHkxID09PSB1bmRlZmluZWQpIHsgeTEgPSAwOyB9XHJcbiAgICAgICAgaWYgKHgyID09PSB1bmRlZmluZWQpIHsgeDIgPSAwOyB9XHJcbiAgICAgICAgaWYgKHkyID09PSB1bmRlZmluZWQpIHsgeTIgPSAwOyB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBnZW9tZXRyeSBjb25zdGFudCB0eXBlIG9mIHRoaXMgb2JqZWN0OiBgR0VPTV9DT05TVC5MSU5FYC5cclxuICAgICAgICAgKiBVc2VkIGZvciBmYXN0IHR5cGUgY29tcGFyaXNvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5MaW5lI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gR0VPTV9DT05TVC5MSU5FO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsaW5lcyBzdGFydGluZyBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkxpbmUjeDFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueDEgPSB4MTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgc3RhcnRpbmcgcG9pbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5MaW5lI3kxXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkxID0geTE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxpbmVzIGVuZGluZyBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkxpbmUjeDJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueDIgPSB4MjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgZW5kaW5nIHBvaW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uTGluZSN5MlxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55MiA9IHkyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHBvaW50IG9uIGEgbGluZSB0aGF0J3MgYSBnaXZlbiBwZXJjZW50YWdlIGFsb25nIGl0cyBsZW5ndGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5MaW5lI2dldFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIC0gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDAgaXMgdGhlIHN0YXJ0LCAwLjUgaXMgdGhlIG1pZGRsZSBhbmQgMSBpcyB0aGUgZW5kIG9mIHRoZSBsaW5lLlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvcHRpb25hbCBwb2ludCwgb3IgcG9pbnQtbGlrZSBvYmplY3QsIHRvIHN0b3JlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IEEgUG9pbnQsIG9yIHBvaW50LWxpa2Ugb2JqZWN0LCBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIGxpbmUuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50OiBmdW5jdGlvbiAocG9zaXRpb24sIG91dHB1dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0UG9pbnQodGhpcywgcG9zaXRpb24sIG91dHB1dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgbnVtYmVyIG9mIHBvaW50cyBhbG9uZyBhIGxpbmUncyBsZW5ndGguXHJcbiAgICAgKlxyXG4gICAgICogUHJvdmlkZSBhIGBxdWFudGl0eWAgdG8gZ2V0IGFuIGV4YWN0IG51bWJlciBvZiBwb2ludHMgYWxvbmcgdGhlIGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogUHJvdmlkZSBhIGBzdGVwUmF0ZWAgdG8gZW5zdXJlIGEgc3BlY2lmaWMgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBvaW50IG9uIHRoZSBsaW5lLiBTZXQgYHF1YW50aXR5YCB0byBgMGAgd2hlblxyXG4gICAgICogcHJvdmlkaW5nIGEgYHN0ZXBSYXRlYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkxpbmUjZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIG51bWJlciBvZiBwb2ludHMgdG8gcGxhY2Ugb24gdGhlIGxpbmUuIFNldCB0byBgMGAgdG8gdXNlIGBzdGVwUmF0ZWAgaW5zdGVhZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0ZXBSYXRlXSAtIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcG9pbnQgb24gdGhlIGxpbmUuIFdoZW4gc2V0LCBgcXVhbnRpdHlgIGlzIGltcGxpZWQgYW5kIHNob3VsZCBiZSBzZXQgdG8gYDBgLlxyXG4gICAgICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFtvdXRwdXRdIC0gQW4gb3B0aW9uYWwgYXJyYXkgb2YgUG9pbnRzLCBvciBwb2ludC1saWtlIG9iamVjdHMsIHRvIHN0b3JlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIG9uIHRoZSBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gQW4gYXJyYXkgb2YgUG9pbnRzLCBvciBwb2ludC1saWtlIG9iamVjdHMsIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludHMgb24gdGhlIGxpbmUuXHJcbiAgICAgKi9cclxuICAgIGdldFBvaW50czogZnVuY3Rpb24gKHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHZXRQb2ludHModGhpcywgcXVhbnRpdHksIHN0ZXBSYXRlLCBvdXRwdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHJhbmRvbSBQb2ludCBvbiB0aGUgTGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkxpbmUjZ2V0UmFuZG9tUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtwb2ludCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtwb2ludF0gLSBBbiBpbnN0YW5jZSBvZiBhIFBvaW50IHRvIGJlIG1vZGlmaWVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBBIHJhbmRvbSBQb2ludCBvbiB0aGUgTGluZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmFuZG9tUG9pbnQ6IGZ1bmN0aW9uIChwb2ludClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gUmFuZG9tKHRoaXMsIHBvaW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgbmV3IGNvb3JkaW5hdGVzIGZvciB0aGUgbGluZSBlbmRwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5MaW5lI3NldFRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3gxPTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgc3RhcnRpbmcgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3kxPTBdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgc3RhcnRpbmcgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3gyPTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGluZXMgZW5kaW5nIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5Mj0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxpbmVzIGVuZGluZyBwb2ludC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExpbmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUbzogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4MSA9PT0gdW5kZWZpbmVkKSB7IHgxID0gMDsgfVxyXG4gICAgICAgIGlmICh5MSA9PT0gdW5kZWZpbmVkKSB7IHkxID0gMDsgfVxyXG4gICAgICAgIGlmICh4MiA9PT0gdW5kZWZpbmVkKSB7IHgyID0gMDsgfVxyXG4gICAgICAgIGlmICh5MiA9PT0gdW5kZWZpbmVkKSB7IHkyID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLngxID0geDE7XHJcbiAgICAgICAgdGhpcy55MSA9IHkxO1xyXG5cclxuICAgICAgICB0aGlzLngyID0geDI7XHJcbiAgICAgICAgdGhpcy55MiA9IHkyO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgVmVjdG9yMiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3RhcnQgb2YgdGhpcyBMaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uTGluZSNnZXRQb2ludEFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBPIC0gW3ZlYzIsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFt2ZWMyXSAtIEEgVmVjdG9yMiBvYmplY3QgdG8gc2V0IHRoZSByZXN1bHRzIGluLiBJZiBgdW5kZWZpbmVkYCBhIG5ldyBWZWN0b3IyIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBBIFZlY3RvcjIgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgTGluZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRBOiBmdW5jdGlvbiAodmVjMilcclxuICAgIHtcclxuICAgICAgICBpZiAodmVjMiA9PT0gdW5kZWZpbmVkKSB7IHZlYzIgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHZlYzIuc2V0KHRoaXMueDEsIHRoaXMueTEpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmVjMjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgVmVjdG9yMiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mIHRoaXMgTGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLkxpbmUjZ2V0UG9pbnRCXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLk1hdGguVmVjdG9yMn0gTyAtIFt2ZWMyLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbdmVjMl0gLSBBIFZlY3RvcjIgb2JqZWN0IHRvIHNldCB0aGUgcmVzdWx0cyBpbi4gSWYgYHVuZGVmaW5lZGAgYSBuZXcgVmVjdG9yMiB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gQSBWZWN0b3IyIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgdGhpcyBMaW5lLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludEI6IGZ1bmN0aW9uICh2ZWMyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2ZWMyID09PSB1bmRlZmluZWQpIHsgdmVjMiA9IG5ldyBWZWN0b3IyKCk7IH1cclxuXHJcbiAgICAgICAgdmVjMi5zZXQodGhpcy54MiwgdGhpcy55Mik7XHJcblxyXG4gICAgICAgIHJldHVybiB2ZWMyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBMaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkxpbmUjbGVmdFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsZWZ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLngxLCB0aGlzLngyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLngxIDw9IHRoaXMueDIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueDEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueDIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBMaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLkxpbmUjcmlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMueDEsIHRoaXMueDIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMueDEgPiB0aGlzLngyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLngxID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLngyID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIExpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uTGluZSN0b3BcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnkxLCB0aGlzLnkyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnkxIDw9IHRoaXMueTIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueTEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueTIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgTGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5MaW5lI2JvdHRvbVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b206IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMueTEsIHRoaXMueTIpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMueTEgPiB0aGlzLnkyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnkxID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnkyID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBXcmFwID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9XcmFwJyk7XHJcbnZhciBBbmdsZSA9IHJlcXVpcmUoJy4vQW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIG9mIHRoZSBub3JtYWwgb2YgdGhlIGdpdmVuIGxpbmUgaW4gcmFkaWFucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuTm9ybWFsQW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgdGhlIG5vcm1hbCBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgb2YgdGhlIG5vcm1hbCBvZiB0aGUgbGluZSBpbiByYWRpYW5zLlxyXG4gKi9cclxudmFyIE5vcm1hbEFuZ2xlID0gZnVuY3Rpb24gKGxpbmUpXHJcbntcclxuICAgIHZhciBhbmdsZSA9IEFuZ2xlKGxpbmUpIC0gTUFUSF9DT05TVC5UQVU7XHJcblxyXG4gICAgcmV0dXJuIFdyYXAoYW5nbGUsIC1NYXRoLlBJLCBNYXRoLlBJKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTm9ybWFsQW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcbnZhciBBbmdsZSA9IHJlcXVpcmUoJy4vQW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgbm9ybWFsIHZlY3RvciBvZiB0aGUgZ2l2ZW4gbGluZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuTm9ybWFsWFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIExpbmUgb2JqZWN0IHRvIGdldCB0aGUgbm9ybWFsIHZhbHVlIGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHggY29tcG9uZW50IG9mIHRoZSBub3JtYWwgdmVjdG9yIG9mIHRoZSBsaW5lLlxyXG4gKi9cclxudmFyIE5vcm1hbFggPSBmdW5jdGlvbiAobGluZSlcclxue1xyXG4gICAgcmV0dXJuIE1hdGguY29zKEFuZ2xlKGxpbmUpIC0gTUFUSF9DT05TVC5UQVUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBOb3JtYWxYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG52YXIgQW5nbGUgPSByZXF1aXJlKCcuL0FuZ2xlJyk7XHJcblxyXG4vKipcclxuICogVGhlIFkgdmFsdWUgb2YgdGhlIG5vcm1hbCBvZiB0aGUgZ2l2ZW4gbGluZS5cclxuICogVGhlIG5vcm1hbCBvZiBhIGxpbmUgaXMgYSB2ZWN0b3IgdGhhdCBwb2ludHMgcGVycGVuZGljdWxhciBmcm9tIGl0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5Ob3JtYWxZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbCBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgWSB2YWx1ZSBvZiB0aGUgbm9ybWFsIG9mIHRoZSBMaW5lLlxyXG4gKi9cclxudmFyIE5vcm1hbFkgPSBmdW5jdGlvbiAobGluZSlcclxue1xyXG4gICAgcmV0dXJuIE1hdGguc2luKEFuZ2xlKGxpbmUpIC0gTUFUSF9DT05TVC5UQVUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBOb3JtYWxZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBPZmZzZXQgYSBsaW5lIGJ5IHRoZSBnaXZlbiBhbW91bnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLk9mZnNldFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBvZmZzZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgbGluZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgbGluZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uTGluZX0gVGhlIG9mZnNldCBsaW5lLlxyXG4gKi9cclxudmFyIE9mZnNldCA9IGZ1bmN0aW9uIChsaW5lLCB4LCB5KVxyXG57XHJcbiAgICBsaW5lLngxICs9IHg7XHJcbiAgICBsaW5lLnkxICs9IHk7XHJcblxyXG4gICAgbGluZS54MiArPSB4O1xyXG4gICAgbGluZS55MiArPSB5O1xyXG5cclxuICAgIHJldHVybiBsaW5lO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPZmZzZXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgcGVycGVuZGljdWxhciBzbG9wZSBvZiB0aGUgZ2l2ZW4gbGluZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuUGVycFNsb3BlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIHBlcnBlbmRpY3VsYXIgc2xvcGUgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBlcnBlbmRpY3VsYXIgc2xvcGUgb2YgdGhlIGxpbmUuXHJcbiAqL1xyXG52YXIgUGVycFNsb3BlID0gZnVuY3Rpb24gKGxpbmUpXHJcbntcclxuICAgIHJldHVybiAtKChsaW5lLngyIC0gbGluZS54MSkgLyAobGluZS55MiAtIGxpbmUueTEpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGVycFNsb3BlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBwb2ludCBvbiBhIGdpdmVuIExpbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLlJhbmRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgTGluZSB0byBjYWxjdWxhdGUgdGhlIHJhbmRvbSBQb2ludCBvbi5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dF0gLSBBbiBpbnN0YW5jZSBvZiBhIFBvaW50IHRvIGJlIG1vZGlmaWVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gQSByYW5kb20gUG9pbnQgb24gdGhlIExpbmUuXHJcbiAqL1xyXG52YXIgUmFuZG9tID0gZnVuY3Rpb24gKGxpbmUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIHQgPSBNYXRoLnJhbmRvbSgpO1xyXG5cclxuICAgIG91dC54ID0gbGluZS54MSArIHQgKiAobGluZS54MiAtIGxpbmUueDEpO1xyXG4gICAgb3V0LnkgPSBsaW5lLnkxICsgdCAqIChsaW5lLnkyIC0gbGluZS55MSk7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBbmdsZSA9IHJlcXVpcmUoJy4vQW5nbGUnKTtcclxudmFyIE5vcm1hbEFuZ2xlID0gcmVxdWlyZSgnLi9Ob3JtYWxBbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgcmVmbGVjdGVkIGFuZ2xlIGJldHdlZW4gdHdvIGxpbmVzLlxyXG4gKlxyXG4gKiBUaGlzIGlzIHRoZSBvdXRnb2luZyBhbmdsZSBiYXNlZCBvbiB0aGUgYW5nbGUgb2YgTGluZSAxIGFuZCB0aGUgbm9ybWFsQW5nbGUgb2YgTGluZSAyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5SZWZsZWN0QW5nbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZUEgLSBUaGUgZmlyc3QgbGluZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lQiAtIFRoZSBzZWNvbmQgbGluZS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVmbGVjdGVkIGFuZ2xlIGJldHdlZW4gZWFjaCBsaW5lLlxyXG4gKi9cclxudmFyIFJlZmxlY3RBbmdsZSA9IGZ1bmN0aW9uIChsaW5lQSwgbGluZUIpXHJcbntcclxuICAgIHJldHVybiAoMiAqIE5vcm1hbEFuZ2xlKGxpbmVCKSAtIE1hdGguUEkgLSBBbmdsZShsaW5lQSkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0QW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvdGF0ZUFyb3VuZFhZID0gcmVxdWlyZSgnLi9Sb3RhdGVBcm91bmRYWScpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZSBhIGxpbmUgYXJvdW5kIGl0cyBtaWRwb2ludCBieSB0aGUgZ2l2ZW4gYW5nbGUgaW4gcmFkaWFucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLkxpbmUuUm90YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtsaW5lLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIHJvdGF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IFRoZSByb3RhdGVkIGxpbmUuXHJcbiAqL1xyXG52YXIgUm90YXRlID0gZnVuY3Rpb24gKGxpbmUsIGFuZ2xlKVxyXG57XHJcbiAgICB2YXIgeCA9IChsaW5lLngxICsgbGluZS54MikgLyAyO1xyXG4gICAgdmFyIHkgPSAobGluZS55MSArIGxpbmUueTIpIC8gMjtcclxuXHJcbiAgICByZXR1cm4gUm90YXRlQXJvdW5kWFkobGluZSwgeCwgeSwgYW5nbGUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvdGF0ZUFyb3VuZFhZID0gcmVxdWlyZSgnLi9Sb3RhdGVBcm91bmRYWScpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZSBhIGxpbmUgYXJvdW5kIGEgcG9pbnQgYnkgdGhlIGdpdmVuIGFuZ2xlIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLlJvdGF0ZUFyb3VuZFBvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtsaW5lLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIHJvdGF0ZS5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gcm90YXRlIHRoZSBsaW5lIGFyb3VuZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IFRoZSByb3RhdGVkIGxpbmUuXHJcbiAqL1xyXG52YXIgUm90YXRlQXJvdW5kUG9pbnQgPSBmdW5jdGlvbiAobGluZSwgcG9pbnQsIGFuZ2xlKVxyXG57XHJcbiAgICByZXR1cm4gUm90YXRlQXJvdW5kWFkobGluZSwgcG9pbnQueCwgcG9pbnQueSwgYW5nbGUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmRQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm90YXRlIGEgbGluZSBhcm91bmQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGJ5IHRoZSBnaXZlbiBhbmdsZSBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5Sb3RhdGVBcm91bmRYWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byByb3RhdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB0byByb3RhdGUgdGhlIGxpbmUgYXJvdW5kLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIHJvdGF0ZSB0aGUgbGluZSBhcm91bmQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5MaW5lfSBUaGUgcm90YXRlZCBsaW5lLlxyXG4gKi9cclxudmFyIFJvdGF0ZUFyb3VuZFhZID0gZnVuY3Rpb24gKGxpbmUsIHgsIHksIGFuZ2xlKVxyXG57XHJcbiAgICB2YXIgYyA9IE1hdGguY29zKGFuZ2xlKTtcclxuICAgIHZhciBzID0gTWF0aC5zaW4oYW5nbGUpO1xyXG5cclxuICAgIHZhciB0eCA9IGxpbmUueDEgLSB4O1xyXG4gICAgdmFyIHR5ID0gbGluZS55MSAtIHk7XHJcblxyXG4gICAgbGluZS54MSA9IHR4ICogYyAtIHR5ICogcyArIHg7XHJcbiAgICBsaW5lLnkxID0gdHggKiBzICsgdHkgKiBjICsgeTtcclxuXHJcbiAgICB0eCA9IGxpbmUueDIgLSB4O1xyXG4gICAgdHkgPSBsaW5lLnkyIC0geTtcclxuXHJcbiAgICBsaW5lLngyID0gdHggKiBjIC0gdHkgKiBzICsgeDtcclxuICAgIGxpbmUueTIgPSB0eCAqIHMgKyB0eSAqIGMgKyB5O1xyXG5cclxuICAgIHJldHVybiBsaW5lO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmRYWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0IGEgbGluZSB0byBhIGdpdmVuIHBvc2l0aW9uLCBhbmdsZSBhbmQgbGVuZ3RoLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5TZXRUb0FuZ2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtsaW5lLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gbGluZSAtIFRoZSBsaW5lIHRvIHNldC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBvZiB0aGUgbGluZSBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGxlbmd0aCBvZiB0aGUgbGluZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uTGluZX0gVGhlIHVwZGF0ZWQgbGluZS5cclxuICovXHJcbnZhciBTZXRUb0FuZ2xlID0gZnVuY3Rpb24gKGxpbmUsIHgsIHksIGFuZ2xlLCBsZW5ndGgpXHJcbntcclxuICAgIGxpbmUueDEgPSB4O1xyXG4gICAgbGluZS55MSA9IHk7XHJcblxyXG4gICAgbGluZS54MiA9IHggKyAoTWF0aC5jb3MoYW5nbGUpICogbGVuZ3RoKTtcclxuICAgIGxpbmUueTIgPSB5ICsgKE1hdGguc2luKGFuZ2xlKSAqIGxlbmd0aCk7XHJcblxyXG4gICAgcmV0dXJuIGxpbmU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFRvQW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgc2xvcGUgb2YgdGhlIGdpdmVuIGxpbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5MaW5lLlNsb3BlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IGxpbmUgLSBUaGUgbGluZSB0byBjYWxjdWxhdGUgdGhlIHNsb3BlIG9mLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzbG9wZSBvZiB0aGUgbGluZS5cclxuICovXHJcbnZhciBTbG9wZSA9IGZ1bmN0aW9uIChsaW5lKVxyXG57XHJcbiAgICByZXR1cm4gKGxpbmUueTIgLSBsaW5lLnkxKSAvIChsaW5lLngyIC0gbGluZS54MSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNsb3BlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIHdpZHRoIG9mIHRoZSBnaXZlbiBsaW5lLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uTGluZS5XaWR0aFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBsaW5lIC0gVGhlIGxpbmUgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgd2lkdGggb2YgdGhlIGxpbmUuXHJcbiAqL1xyXG52YXIgV2lkdGggPSBmdW5jdGlvbiAobGluZSlcclxue1xyXG4gICAgcmV0dXJuIE1hdGguYWJzKGxpbmUueDEgLSBsaW5lLngyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2lkdGg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExpbmUgPSByZXF1aXJlKCcuL0xpbmUnKTtcclxuXHJcbkxpbmUuQW5nbGUgPSByZXF1aXJlKCcuL0FuZ2xlJyk7XHJcbkxpbmUuQnJlc2VuaGFtUG9pbnRzID0gcmVxdWlyZSgnLi9CcmVzZW5oYW1Qb2ludHMnKTtcclxuTGluZS5DZW50ZXJPbiA9IHJlcXVpcmUoJy4vQ2VudGVyT24nKTtcclxuTGluZS5DbG9uZSA9IHJlcXVpcmUoJy4vQ2xvbmUnKTtcclxuTGluZS5Db3B5RnJvbSA9IHJlcXVpcmUoJy4vQ29weUZyb20nKTtcclxuTGluZS5FcXVhbHMgPSByZXF1aXJlKCcuL0VxdWFscycpO1xyXG5MaW5lLkV4dGVuZCA9IHJlcXVpcmUoJy4vRXh0ZW5kJyk7XHJcbkxpbmUuR2V0RWFzZWRQb2ludHMgPSByZXF1aXJlKCcuL0dldEVhc2VkUG9pbnRzJyk7XHJcbkxpbmUuR2V0TWlkUG9pbnQgPSByZXF1aXJlKCcuL0dldE1pZFBvaW50Jyk7XHJcbkxpbmUuR2V0TmVhcmVzdFBvaW50ID0gcmVxdWlyZSgnLi9HZXROZWFyZXN0UG9pbnQnKTtcclxuTGluZS5HZXROb3JtYWwgPSByZXF1aXJlKCcuL0dldE5vcm1hbCcpO1xyXG5MaW5lLkdldFBvaW50ID0gcmVxdWlyZSgnLi9HZXRQb2ludCcpO1xyXG5MaW5lLkdldFBvaW50cyA9IHJlcXVpcmUoJy4vR2V0UG9pbnRzJyk7XHJcbkxpbmUuR2V0U2hvcnRlc3REaXN0YW5jZSA9IHJlcXVpcmUoJy4vR2V0U2hvcnRlc3REaXN0YW5jZScpO1xyXG5MaW5lLkhlaWdodCA9IHJlcXVpcmUoJy4vSGVpZ2h0Jyk7XHJcbkxpbmUuTGVuZ3RoID0gcmVxdWlyZSgnLi9MZW5ndGgnKTtcclxuTGluZS5Ob3JtYWxBbmdsZSA9IHJlcXVpcmUoJy4vTm9ybWFsQW5nbGUnKTtcclxuTGluZS5Ob3JtYWxYID0gcmVxdWlyZSgnLi9Ob3JtYWxYJyk7XHJcbkxpbmUuTm9ybWFsWSA9IHJlcXVpcmUoJy4vTm9ybWFsWScpO1xyXG5MaW5lLk9mZnNldCA9IHJlcXVpcmUoJy4vT2Zmc2V0Jyk7XHJcbkxpbmUuUGVycFNsb3BlID0gcmVxdWlyZSgnLi9QZXJwU2xvcGUnKTtcclxuTGluZS5SYW5kb20gPSByZXF1aXJlKCcuL1JhbmRvbScpO1xyXG5MaW5lLlJlZmxlY3RBbmdsZSA9IHJlcXVpcmUoJy4vUmVmbGVjdEFuZ2xlJyk7XHJcbkxpbmUuUm90YXRlID0gcmVxdWlyZSgnLi9Sb3RhdGUnKTtcclxuTGluZS5Sb3RhdGVBcm91bmRQb2ludCA9IHJlcXVpcmUoJy4vUm90YXRlQXJvdW5kUG9pbnQnKTtcclxuTGluZS5Sb3RhdGVBcm91bmRYWSA9IHJlcXVpcmUoJy4vUm90YXRlQXJvdW5kWFknKTtcclxuTGluZS5TZXRUb0FuZ2xlID0gcmVxdWlyZSgnLi9TZXRUb0FuZ2xlJyk7XHJcbkxpbmUuU2xvcGUgPSByZXF1aXJlKCcuL1Nsb3BlJyk7XHJcbkxpbmUuV2lkdGggPSByZXF1aXJlKCcuL1dpZHRoJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFwcGx5IGBNYXRoLmNlaWwoKWAgdG8gZWFjaCBjb29yZGluYXRlIG9mIHRoZSBnaXZlbiBQb2ludC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvaW50LkNlaWxcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtwb2ludCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBQb2ludCB0byBjZWlsLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gVGhlIFBvaW50IHdpdGggYE1hdGguY2VpbCgpYCBhcHBsaWVkIHRvIGl0cyBjb29yZGluYXRlcy5cclxuICovXHJcbnZhciBDZWlsID0gZnVuY3Rpb24gKHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gcG9pbnQuc2V0VG8oTWF0aC5jZWlsKHBvaW50LngpLCBNYXRoLmNlaWwocG9pbnQueSkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDZWlsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4vUG9pbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBDbG9uZSB0aGUgZ2l2ZW4gUG9pbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5DbG9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gc291cmNlIC0gVGhlIHNvdXJjZSBQb2ludCB0byBjbG9uZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IFRoZSBjbG9uZWQgUG9pbnQuXHJcbiAqL1xyXG52YXIgQ2xvbmUgPSBmdW5jdGlvbiAoc291cmNlKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IFBvaW50KHNvdXJjZS54LCBzb3VyY2UueSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENsb25lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgb2Ygb25lIFBvaW50IHRvIGEgZGVzdGluYXRpb24gUG9pbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5Db3B5RnJvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW2Rlc3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gc291cmNlIC0gVGhlIHNvdXJjZSBQb2ludCB0byBjb3B5IHRoZSB2YWx1ZXMgZnJvbS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gZGVzdCAtIFRoZSBkZXN0aW5hdGlvbiBQb2ludCB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBUaGUgZGVzdGluYXRpb24gUG9pbnQuXHJcbiAqL1xyXG52YXIgQ29weUZyb20gPSBmdW5jdGlvbiAoc291cmNlLCBkZXN0KVxyXG57XHJcbiAgICByZXR1cm4gZGVzdC5zZXRUbyhzb3VyY2UueCwgc291cmNlLnkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb3B5RnJvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQSBjb21wYXJpc29uIG9mIHR3byBgUG9pbnRgIG9iamVjdHMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWFsLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9pbnQuRXF1YWxzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBvcmlnaW5hbCBgUG9pbnRgIHRvIGNvbXBhcmUgYWdhaW5zdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gdG9Db21wYXJlIC0gVGhlIHNlY29uZCBgUG9pbnRgIHRvIGNvbXBhcmUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgYm90aCBgUG9pbnRgIG9iamVjdHMgYXJlIGVxdWFsLlxyXG4gKi9cclxudmFyIEVxdWFscyA9IGZ1bmN0aW9uIChwb2ludCwgdG9Db21wYXJlKVxyXG57XHJcbiAgICByZXR1cm4gKHBvaW50LnggPT09IHRvQ29tcGFyZS54ICYmIHBvaW50LnkgPT09IHRvQ29tcGFyZS55KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRXF1YWxzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBgTWF0aC5jZWlsKClgIHRvIGVhY2ggY29vcmRpbmF0ZSBvZiB0aGUgZ2l2ZW4gUG9pbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5GbG9vclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW3BvaW50LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IHBvaW50IC0gVGhlIFBvaW50IHRvIGZsb29yLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gVGhlIFBvaW50IHdpdGggYE1hdGguZmxvb3IoKWAgYXBwbGllZCB0byBpdHMgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG52YXIgRmxvb3IgPSBmdW5jdGlvbiAocG9pbnQpXHJcbntcclxuICAgIHJldHVybiBwb2ludC5zZXRUbyhNYXRoLmZsb29yKHBvaW50LngpLCBNYXRoLmZsb29yKHBvaW50LnkpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxvb3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgY2VudHJvaWQgb3IgZ2VvbWV0cmljIGNlbnRlciBvZiBhIHBsYW5lIGZpZ3VyZSAodGhlIGFyaXRobWV0aWMgbWVhbiBwb3NpdGlvbiBvZiBhbGwgdGhlIHBvaW50cyBpbiB0aGUgZmlndXJlKS5cclxuICogSW5mb3JtYWxseSwgaXQgaXMgdGhlIHBvaW50IGF0IHdoaWNoIGEgY3V0b3V0IG9mIHRoZSBzaGFwZSBjb3VsZCBiZSBwZXJmZWN0bHkgYmFsYW5jZWQgb24gdGhlIHRpcCBvZiBhIHBpbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvaW50LkdldENlbnRyb2lkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2VbXX0gcG9pbnRzIC0gQW4gYXJyYXkgb2YgVmVjdG9yMkxpa2Ugb2JqZWN0cyB0byBnZXQgdGhlIGdlb21ldHJpYyBjZW50ZXIgb2YuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IFtvdXRdIC0gQSBQb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIG91dHB1dCBjb29yZGluYXRlcyBpbi4gSWYgbm90IGdpdmVuLCBhIG5ldyBQb2ludCBpbnN0YW5jZSBpcyBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gQSBQb2ludCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW9tZXRyaWMgY2VudGVyIG9mIHRoZSBnaXZlbiBwb2ludHMuXHJcbiAqL1xyXG52YXIgR2V0Q2VudHJvaWQgPSBmdW5jdGlvbiAocG9pbnRzLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwb2ludHMpKVxyXG4gICAge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR2V0Q2VudHJvaWQgcG9pbnRzIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXknKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGVuID0gcG9pbnRzLmxlbmd0aDtcclxuXHJcbiAgICBpZiAobGVuIDwgMSlcclxuICAgIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dldENlbnRyb2lkIHBvaW50cyBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eScpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobGVuID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIG91dC54ID0gcG9pbnRzWzBdLng7XHJcbiAgICAgICAgb3V0LnkgPSBwb2ludHNbMF0ueTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0LnggKz0gcG9pbnRzW2ldLng7XHJcbiAgICAgICAgICAgIG91dC55ICs9IHBvaW50c1tpXS55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3V0LnggLz0gbGVuO1xyXG4gICAgICAgIG91dC55IC89IGxlbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRDZW50cm9pZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHBvaW50LCB3aGljaCBlcXVpdmFsZW50IHRvIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUgZnJvbSB0aGUgb3JpZ2luIHRvIHRoaXMgcG9pbnQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5HZXRNYWduaXR1ZGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNhbGN1bGF0ZSB0aGUgbWFnbml0dWRlIGZvclxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHRpbmcgbWFnbml0dWRlXHJcbiAqL1xyXG52YXIgR2V0TWFnbml0dWRlID0gZnVuY3Rpb24gKHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KChwb2ludC54ICogcG9pbnQueCkgKyAocG9pbnQueSAqIHBvaW50LnkpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0TWFnbml0dWRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmUgb2YgbWFnbml0dWRlIG9mIGdpdmVuIHBvaW50LihDYW4gYmUgdXNlZCBmb3IgZmFzdCBtYWduaXR1ZGUgY2FsY3VsYXRpb24gb2YgcG9pbnQpXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5HZXRNYWduaXR1ZGVTcVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnQgLSBSZXR1cm5zIHNxdWFyZSBvZiB0aGUgbWFnbml0dWRlL2xlbmd0aCBvZiBnaXZlbiBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm5zIHNxdWFyZSBvZiB0aGUgbWFnbml0dWRlIG9mIGdpdmVuIHBvaW50LlxyXG4gKi9cclxudmFyIEdldE1hZ25pdHVkZVNxID0gZnVuY3Rpb24gKHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gKHBvaW50LnggKiBwb2ludC54KSArIChwb2ludC55ICogcG9pbnQueSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE1hZ25pdHVkZVNxO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgQXhpcyBBbGlnbmVkIEJvdW5kaW5nIEJveCAob3IgYWFiYikgZnJvbSBhbiBhcnJheSBvZiBwb2ludHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5HZXRSZWN0YW5nbGVGcm9tUG9pbnRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlW119IHBvaW50cyAtIEFuIGFycmF5IG9mIFZlY3RvcjJMaWtlIG9iamVjdHMgdG8gZ2V0IHRoZSBBQUJCIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBbb3V0XSAtIEEgUmVjdGFuZ2xlIG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0cyBpbi4gSWYgbm90IGdpdmVuLCBhIG5ldyBSZWN0YW5nbGUgaW5zdGFuY2UgaXMgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBBIFJlY3RhbmdsZSBvYmplY3QgaG9sZGluZyB0aGUgQUFCQiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBwb2ludHMuXHJcbiAqL1xyXG52YXIgR2V0UmVjdGFuZ2xlRnJvbVBvaW50cyA9IGZ1bmN0aW9uIChwb2ludHMsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBSZWN0YW5nbGUoKTsgfVxyXG5cclxuICAgIHZhciB4TWF4ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xyXG4gICAgdmFyIHhNaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XHJcbiAgICB2YXIgeU1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcclxuICAgIHZhciB5TWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcclxuXHJcbiAgICAgICAgaWYgKHBvaW50LnggPiB4TWF4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeE1heCA9IHBvaW50Lng7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocG9pbnQueCA8IHhNaW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4TWluID0gcG9pbnQueDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwb2ludC55ID4geU1heClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHlNYXggPSBwb2ludC55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBvaW50LnkgPCB5TWluKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeU1pbiA9IHBvaW50Lnk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG91dC54ID0geE1pbjtcclxuICAgIG91dC55ID0geU1pbjtcclxuICAgIG91dC53aWR0aCA9IHhNYXggLSB4TWluO1xyXG4gICAgb3V0LmhlaWdodCA9IHlNYXggLSB5TWluO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFJlY3RhbmdsZUZyb21Qb2ludHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGxpbmVhciBpbnRlcnBvbGF0aW9uIHBvaW50IGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb2ludHMsIGJhc2VkIG9uIGB0YC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvaW50LkludGVycG9sYXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IHBvaW50QSAtIFRoZSBzdGFydGluZyBgUG9pbnRgIGZvciB0aGUgaW50ZXJwb2xhdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnRCIC0gVGhlIHRhcmdldCBgUG9pbnRgIGZvciB0aGUgaW50ZXJwb2xhdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt0PTBdIC0gVGhlIGFtb3VudCB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzLiBHZW5lcmFsbHksIGEgdmFsdWUgYmV0d2VlbiAwIChyZXR1cm5zIHRoZSBzdGFydGluZyBgUG9pbnRgKSBhbmQgMSAocmV0dXJucyB0aGUgdGFyZ2V0IGBQb2ludGApLiBJZiBvbWl0dGVkLCAwIGlzIHVzZWQuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb3B0aW9uYWwgYFBvaW50YCBvYmplY3Qgd2hvc2UgYHhgIGFuZCBgeWAgdmFsdWVzIHdpbGwgYmUgc2V0IHRvIHRoZSByZXN1bHQgb2YgdGhlIGludGVycG9sYXRpb24gKGNhbiBhbHNvIGJlIGFueSBvYmplY3Qgd2l0aCBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzKS4gSWYgb21pdHRlZCwgYSBuZXcgYFBvaW50YCBjcmVhdGVkIGFuZCByZXR1cm5lZC5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IEVpdGhlciB0aGUgb2JqZWN0IGZyb20gdGhlIGBvdXRgIGFyZ3VtZW50IHdpdGggdGhlIHByb3BlcnRpZXMgYHhgIGFuZCBgeWAgc2V0IHRvIHRoZSByZXN1bHQgb2YgdGhlIGludGVycG9sYXRpb24gb3IgYSBuZXdseSBjcmVhdGVkIGBQb2ludGAgb2JqZWN0LlxyXG4gKi9cclxudmFyIEludGVycG9sYXRlID0gZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCLCB0LCBvdXQpXHJcbntcclxuICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHsgdCA9IDA7IH1cclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIG91dC54ID0gcG9pbnRBLnggKyAoKHBvaW50Qi54IC0gcG9pbnRBLngpICogdCk7XHJcbiAgICBvdXQueSA9IHBvaW50QS55ICsgKChwb2ludEIueSAtIHBvaW50QS55KSAqIHQpO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEludGVycG9sYXRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTd2FwcyB0aGUgWCBhbmQgdGhlIFkgY29vcmRpbmF0ZSBvZiBhIHBvaW50LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9pbnQuSW52ZXJ0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbcG9pbnQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnQgLSBUaGUgUG9pbnQgdG8gbW9kaWZ5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gVGhlIG1vZGlmaWVkIGBwb2ludGAuXHJcbiAqL1xyXG52YXIgSW52ZXJ0ID0gZnVuY3Rpb24gKHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gcG9pbnQuc2V0VG8ocG9pbnQueSwgcG9pbnQueCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEludmVydDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuL1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogSW52ZXJ0cyBhIFBvaW50J3MgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2ludC5OZWdhdGl2ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBQb2ludCB0byBpbnZlcnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IFtvdXRdIC0gVGhlIFBvaW50IHRvIHJldHVybiB0aGUgaW52ZXJ0ZWQgY29vcmRpbmF0ZXMgaW4uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBUaGUgbW9kaWZpZWQgYG91dGAgUG9pbnQsIG9yIGEgbmV3IFBvaW50IGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxyXG4gKi9cclxudmFyIE5lZ2F0aXZlID0gZnVuY3Rpb24gKHBvaW50LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHJldHVybiBvdXQuc2V0VG8oLXBvaW50LngsIC1wb2ludC55KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTmVnYXRpdmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdFT01fQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogRGVmaW5lcyBhIFBvaW50IGluIDJEIHNwYWNlLCB3aXRoIGFuIHggYW5kIHkgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAY2xhc3MgUG9pbnRcclxuICogQG1lbWJlcm9mIFBoYXNlci5HZW9tXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIFBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoaXMgUG9pbnQuXHJcbiAqL1xyXG52YXIgUG9pbnQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUG9pbnQgKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdlb21ldHJ5IGNvbnN0YW50IHR5cGUgb2YgdGhpcyBvYmplY3Q6IGBHRU9NX0NPTlNULlBPSU5UYC5cclxuICAgICAgICAgKiBVc2VkIGZvciBmYXN0IHR5cGUgY29tcGFyaXNvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5Qb2ludCN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IEdFT01fQ09OU1QuUE9JTlQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhpcyBQb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlBvaW50I3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSB4O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoaXMgUG9pbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5Qb2ludCN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IHRvIHRoZSBnaXZlbiB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5Qb2ludCNzZXRUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIFBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGlzIFBvaW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUG9pbnQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUbzogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuL1BvaW50Jyk7XHJcbnZhciBHZXRNYWduaXR1ZGVTcSA9IHJlcXVpcmUoJy4vR2V0TWFnbml0dWRlU3EnKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSB2ZWN0b3IgcHJvamVjdGlvbiBvZiBgcG9pbnRBYCBvbnRvIHRoZSBub256ZXJvIGBwb2ludEJgLiBUaGlzIGlzIHRoZVxyXG4gKiBvcnRob2dvbmFsIHByb2plY3Rpb24gb2YgYHBvaW50QWAgb250byBhIHN0cmFpZ2h0IGxpbmUgcGFyYWxsZSB0byBgcG9pbnRCYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvaW50LlByb2plY3RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnRBIC0gUG9pbnQgQSwgdG8gYmUgcHJvamVjdGVkIG9udG8gUG9pbnQgQi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnRCIC0gUG9pbnQgQiwgdG8gaGF2ZSBQb2ludCBBIHByb2plY3RlZCB1cG9uIGl0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBbb3V0XSAtIFRoZSBQb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIHBvc2l0aW9uIGluLiBJZiBub3QgZ2l2ZW4sIGEgbmV3IFBvaW50IGluc3RhbmNlIGlzIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBBIFBvaW50IG9iamVjdCBob2xkaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdmVjdG9yIHByb2plY3Rpb24gb2YgYHBvaW50QWAgb250byBgcG9pbnRCYC5cclxuICovXHJcbnZhciBQcm9qZWN0ID0gZnVuY3Rpb24gKHBvaW50QSwgcG9pbnRCLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHZhciBkb3QgPSAoKHBvaW50QS54ICogcG9pbnRCLngpICsgKHBvaW50QS55ICogcG9pbnRCLnkpKTtcclxuICAgIHZhciBhbXQgPSBkb3QgLyBHZXRNYWduaXR1ZGVTcShwb2ludEIpO1xyXG5cclxuICAgIGlmIChhbXQgIT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnggPSBhbXQgKiBwb2ludEIueDtcclxuICAgICAgICBvdXQueSA9IGFtdCAqIHBvaW50Qi55O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFByb2plY3Q7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHZlY3RvciBwcm9qZWN0aW9uIG9mIGBwb2ludEFgIG9udG8gdGhlIG5vbnplcm8gYHBvaW50QmAuIFRoaXMgaXMgdGhlXHJcbiAqIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBvZiBgcG9pbnRBYCBvbnRvIGEgc3RyYWlnaHQgbGluZSBwYXJhbGxlIHRvIGBwb2ludEJgLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9pbnQuUHJvamVjdFVuaXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnRBIC0gUG9pbnQgQSwgdG8gYmUgcHJvamVjdGVkIG9udG8gUG9pbnQgQi4gTXVzdCBiZSBhIG5vcm1hbGl6ZWQgcG9pbnQgd2l0aCBhIG1hZ25pdHVkZSBvZiAxLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludEIgLSBQb2ludCBCLCB0byBoYXZlIFBvaW50IEEgcHJvamVjdGVkIHVwb24gaXQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IFtvdXRdIC0gVGhlIFBvaW50IG9iamVjdCB0byBzdG9yZSB0aGUgcG9zaXRpb24gaW4uIElmIG5vdCBnaXZlbiwgYSBuZXcgUG9pbnQgaW5zdGFuY2UgaXMgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IEEgdW5pdCBQb2ludCBvYmplY3QgaG9sZGluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHZlY3RvciBwcm9qZWN0aW9uIG9mIGBwb2ludEFgIG9udG8gYHBvaW50QmAuXHJcbiAqL1xyXG52YXIgUHJvamVjdFVuaXQgPSBmdW5jdGlvbiAocG9pbnRBLCBwb2ludEIsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgdmFyIGFtdCA9ICgocG9pbnRBLnggKiBwb2ludEIueCkgKyAocG9pbnRBLnkgKiBwb2ludEIueSkpO1xyXG5cclxuICAgIGlmIChhbXQgIT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnggPSBhbXQgKiBwb2ludEIueDtcclxuICAgICAgICBvdXQueSA9IGFtdCAqIHBvaW50Qi55O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFByb2plY3RVbml0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRNYWduaXR1ZGUgPSByZXF1aXJlKCcuL0dldE1hZ25pdHVkZScpO1xyXG5cclxuLyoqXHJcbiAqIENoYW5nZXMgdGhlIG1hZ25pdHVkZSAobGVuZ3RoKSBvZiBhIHR3by1kaW1lbnNpb25hbCB2ZWN0b3Igd2l0aG91dCBjaGFuZ2luZyBpdHMgZGlyZWN0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9pbnQuU2V0TWFnbml0dWRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbcG9pbnQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gcG9pbnQgLSBUaGUgUG9pbnQgdG8gdHJlYXQgYXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWFnbml0dWRlIC0gVGhlIG5ldyBtYWduaXR1ZGUgb2YgdGhlIHZlY3Rvci5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IFRoZSBtb2RpZmllZCBQb2ludC5cclxuICovXHJcbnZhciBTZXRNYWduaXR1ZGUgPSBmdW5jdGlvbiAocG9pbnQsIG1hZ25pdHVkZSlcclxue1xyXG4gICAgaWYgKHBvaW50LnggIT09IDAgfHwgcG9pbnQueSAhPT0gMClcclxuICAgIHtcclxuICAgICAgICB2YXIgbSA9IEdldE1hZ25pdHVkZShwb2ludCk7XHJcblxyXG4gICAgICAgIHBvaW50LnggLz0gbTtcclxuICAgICAgICBwb2ludC55IC89IG07XHJcbiAgICB9XHJcblxyXG4gICAgcG9pbnQueCAqPSBtYWduaXR1ZGU7XHJcbiAgICBwb2ludC55ICo9IG1hZ25pdHVkZTtcclxuXHJcbiAgICByZXR1cm4gcG9pbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldE1hZ25pdHVkZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuL1BvaW50Jyk7XHJcblxyXG5Qb2ludC5DZWlsID0gcmVxdWlyZSgnLi9DZWlsJyk7XHJcblBvaW50LkNsb25lID0gcmVxdWlyZSgnLi9DbG9uZScpO1xyXG5Qb2ludC5Db3B5RnJvbSA9IHJlcXVpcmUoJy4vQ29weUZyb20nKTtcclxuUG9pbnQuRXF1YWxzID0gcmVxdWlyZSgnLi9FcXVhbHMnKTtcclxuUG9pbnQuRmxvb3IgPSByZXF1aXJlKCcuL0Zsb29yJyk7XHJcblBvaW50LkdldENlbnRyb2lkID0gcmVxdWlyZSgnLi9HZXRDZW50cm9pZCcpO1xyXG5Qb2ludC5HZXRNYWduaXR1ZGUgPSByZXF1aXJlKCcuL0dldE1hZ25pdHVkZScpO1xyXG5Qb2ludC5HZXRNYWduaXR1ZGVTcSA9IHJlcXVpcmUoJy4vR2V0TWFnbml0dWRlU3EnKTtcclxuUG9pbnQuR2V0UmVjdGFuZ2xlRnJvbVBvaW50cyA9IHJlcXVpcmUoJy4vR2V0UmVjdGFuZ2xlRnJvbVBvaW50cycpO1xyXG5Qb2ludC5JbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4vSW50ZXJwb2xhdGUnKTtcclxuUG9pbnQuSW52ZXJ0ID0gcmVxdWlyZSgnLi9JbnZlcnQnKTtcclxuUG9pbnQuTmVnYXRpdmUgPSByZXF1aXJlKCcuL05lZ2F0aXZlJyk7XHJcblBvaW50LlByb2plY3QgPSByZXF1aXJlKCcuL1Byb2plY3QnKTtcclxuUG9pbnQuUHJvamVjdFVuaXQgPSByZXF1aXJlKCcuL1Byb2plY3RVbml0Jyk7XHJcblBvaW50LlNldE1hZ25pdHVkZSA9IHJlcXVpcmUoJy4vU2V0TWFnbml0dWRlJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2x5Z29uID0gcmVxdWlyZSgnLi9Qb2x5Z29uJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IHBvbHlnb24gd2hpY2ggaXMgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgcG9seWdvblxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9seWdvbi5DbG9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2x5Z29ufSBwb2x5Z29uIC0gVGhlIHBvbHlnb24gdG8gY3JlYXRlIGEgY2xvbmUgb2ZcclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9seWdvbn0gQSBuZXcgc2VwYXJhdGUgUG9seWdvbiBjbG9uZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvbHlnb24sIGJhc2VkIG9uIHRoZSBzYW1lIHBvaW50cy5cclxuICovXHJcbnZhciBDbG9uZSA9IGZ1bmN0aW9uIChwb2x5Z29uKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IFBvbHlnb24ocG9seWdvbi5wb2ludHMpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDbG9uZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyBDaGVja3Mgd2hldGhlciB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHBvbHlnb24uXHJcbi8vICBBZGFwdGVkIGZyb20gaHR0cDovL3d3dy5lY3NlLnJwaS5lZHUvSG9tZXBhZ2VzL3dyZi9SZXNlYXJjaC9TaG9ydF9Ob3Rlcy9wbnBvbHkuaHRtbCBieSBKb25hcyBSYW9uaSBTb2FyZXMgU2lsdmFcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiBhIFBvbHlnb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2x5Z29uLkNvbnRhaW5zXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvbHlnb259IHBvbHlnb24gLSBUaGUgUG9seWdvbiB0byBjaGVjayBhZ2FpbnN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBQb2x5Z29uLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBDb250YWlucyA9IGZ1bmN0aW9uIChwb2x5Z29uLCB4LCB5KVxyXG57XHJcbiAgICB2YXIgaW5zaWRlID0gZmFsc2U7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IC0xLCBqID0gcG9seWdvbi5wb2ludHMubGVuZ3RoIC0gMTsgKytpIDwgcG9seWdvbi5wb2ludHMubGVuZ3RoOyBqID0gaSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaXggPSBwb2x5Z29uLnBvaW50c1tpXS54O1xyXG4gICAgICAgIHZhciBpeSA9IHBvbHlnb24ucG9pbnRzW2ldLnk7XHJcblxyXG4gICAgICAgIHZhciBqeCA9IHBvbHlnb24ucG9pbnRzW2pdLng7XHJcbiAgICAgICAgdmFyIGp5ID0gcG9seWdvbi5wb2ludHNbal0ueTtcclxuXHJcbiAgICAgICAgaWYgKCgoaXkgPD0geSAmJiB5IDwgankpIHx8IChqeSA8PSB5ICYmIHkgPCBpeSkpICYmICh4IDwgKGp4IC0gaXgpICogKHkgLSBpeSkgLyAoankgLSBpeSkgKyBpeCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zaWRlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWlucztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2tzIHRoZSBnaXZlbiBQb2ludCBhZ2FpbiB0aGUgUG9seWdvbiB0byBzZWUgaWYgdGhlIFBvaW50IGxheXMgd2l0aGluIGl0cyB2ZXJ0aWNlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvbHlnb24uQ29udGFpbnNQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2x5Z29ufSBwb2x5Z29uIC0gVGhlIFBvbHlnb24gdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IHBvaW50IC0gVGhlIFBvaW50IHRvIGNoZWNrIGlmIGl0J3Mgd2l0aGluIHRoZSBQb2x5Z29uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFBvaW50IGlzIHdpdGhpbiB0aGUgUG9seWdvbiwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgQ29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIChwb2x5Z29uLCBwb2ludClcclxue1xyXG4gICAgcmV0dXJuIENvbnRhaW5zKHBvbHlnb24sIHBvaW50LngsIHBvaW50LnkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWluc1BvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBFYXJjdXQgMi4xLjQgKERlY2VtYmVyIDR0aCAyMDE4KVxyXG5cclxuLypcclxuICogSVNDIExpY2Vuc2VcclxuICogXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgTWFwYm94XHJcbiAqIFxyXG4gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZVxyXG4gKiB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlXHJcbiAqIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLlxyXG4gKiBcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG4gKiBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXHJcbiAqIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG4gKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TU1xyXG4gKiBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVJcclxuICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRlxyXG4gKiBUSElTIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZWFyY3V0O1xyXG5cclxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcclxuXHJcbiAgICBkaW0gPSBkaW0gfHwgMjtcclxuXHJcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXHJcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXHJcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcclxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcclxuXHJcbiAgICBpZiAoIW91dGVyTm9kZSB8fCBvdXRlck5vZGUubmV4dCA9PT0gb3V0ZXJOb2RlLnByZXYpIHJldHVybiB0cmlhbmdsZXM7XHJcblxyXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XHJcblxyXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xyXG5cclxuICAgIC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxyXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcclxuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XHJcbiAgICAgICAgbWluWSA9IG1heFkgPSBkYXRhWzFdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XHJcbiAgICAgICAgICAgIHggPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XHJcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XHJcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XHJcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XHJcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxyXG4gICAgICAgIGludlNpemUgPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xyXG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuXHJcbiAgICByZXR1cm4gdHJpYW5nbGVzO1xyXG59XHJcblxyXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xyXG4gICAgdmFyIGksIGxhc3Q7XHJcblxyXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XHJcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xyXG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XHJcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGFzdDtcclxufVxyXG5cclxuLy8gZWxpbWluYXRlIGNvbGxpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXHJcbmZ1bmN0aW9uIGZpbHRlclBvaW50cyhzdGFydCwgZW5kKSB7XHJcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XHJcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XHJcblxyXG4gICAgdmFyIHAgPSBzdGFydCxcclxuICAgICAgICBhZ2FpbjtcclxuICAgIGRvIHtcclxuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXAuc3RlaW5lciAmJiAoZXF1YWxzKHAsIHAubmV4dCkgfHwgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPT09IDApKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XHJcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XHJcbiAgICAgICAgICAgIGlmIChwID09PSBwLm5leHQpIGJyZWFrO1xyXG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSB3aGlsZSAoYWdhaW4gfHwgcCAhPT0gZW5kKTtcclxuXHJcbiAgICByZXR1cm4gZW5kO1xyXG59XHJcblxyXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcclxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIHBhc3MpIHtcclxuICAgIGlmICghZWFyKSByZXR1cm47XHJcblxyXG4gICAgLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuXHJcbiAgICB2YXIgc3RvcCA9IGVhcixcclxuICAgICAgICBwcmV2LCBuZXh0O1xyXG5cclxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxyXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xyXG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcclxuICAgICAgICBuZXh0ID0gZWFyLm5leHQ7XHJcblxyXG4gICAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHtcclxuICAgICAgICAgICAgLy8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcclxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcclxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xyXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChuZXh0LmkgLyBkaW0pO1xyXG5cclxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xyXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XHJcbiAgICAgICAgICAgIHN0b3AgPSBuZXh0Lm5leHQ7XHJcblxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVhciA9IG5leHQ7XHJcblxyXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXHJcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xyXG4gICAgICAgICAgICAvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxyXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcclxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGVhciwgdHJpYW5nbGVzLCBkaW0pO1xyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDIpO1xyXG5cclxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcclxuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XHJcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxyXG4gICAgICAgIGIgPSBlYXIsXHJcbiAgICAgICAgYyA9IGVhci5uZXh0O1xyXG5cclxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcclxuXHJcbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xyXG5cclxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xyXG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXHJcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIHZhciBhID0gZWFyLnByZXYsXHJcbiAgICAgICAgYiA9IGVhcixcclxuICAgICAgICBjID0gZWFyLm5leHQ7XHJcblxyXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxyXG5cclxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXHJcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxyXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcclxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXHJcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xyXG5cclxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XHJcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxyXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuXHJcbiAgICB2YXIgcCA9IGVhci5wcmV2WixcclxuICAgICAgICBuID0gZWFyLm5leHRaO1xyXG5cclxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4Wikge1xyXG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXHJcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5wcmV2WjtcclxuXHJcbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSkgJiZcclxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIG4gPSBuLm5leHRaO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXHJcbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikge1xyXG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXHJcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5wcmV2WjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxyXG4gICAgd2hpbGUgKG4gJiYgbi56IDw9IG1heFopIHtcclxuICAgICAgICBpZiAobiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxyXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbiA9IG4ubmV4dFo7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXHJcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XHJcbiAgICB2YXIgcCA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxyXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XHJcblxyXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcclxuXHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEuaSAvIGRpbSk7XHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XHJcblxyXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTtcclxuXHJcbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcmV0dXJuIHA7XHJcbn1cclxuXHJcbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XHJcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xyXG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cclxuICAgIHZhciBhID0gc3RhcnQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcclxuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XHJcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcclxuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcclxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xsaW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xyXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xyXG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXHJcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiID0gYi5uZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhID0gYS5uZXh0O1xyXG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xyXG59XHJcblxyXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXHJcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xyXG4gICAgdmFyIHF1ZXVlID0gW10sXHJcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xyXG5cclxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcclxuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XHJcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XHJcblxyXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcclxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XHJcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRlck5vZGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcclxuICAgIHJldHVybiBhLnggLSBiLng7XHJcbn1cclxuXHJcbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxyXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xyXG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcclxuICAgIGlmIChvdXRlck5vZGUpIHtcclxuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xyXG4gICAgICAgIGZpbHRlclBvaW50cyhiLCBiLm5leHQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXHJcbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xyXG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXHJcbiAgICAgICAgaHggPSBob2xlLngsXHJcbiAgICAgICAgaHkgPSBob2xlLnksXHJcbiAgICAgICAgcXggPSAtSW5maW5pdHksXHJcbiAgICAgICAgbTtcclxuXHJcbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XHJcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55KSB7XHJcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xyXG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcclxuICAgICAgICAgICAgICAgIHF4ID0geDtcclxuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAubmV4dC55KSByZXR1cm4gcC5uZXh0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcclxuXHJcbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xyXG5cclxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XHJcblxyXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xyXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XHJcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxyXG5cclxuICAgIHZhciBzdG9wID0gbSxcclxuICAgICAgICBteCA9IG0ueCxcclxuICAgICAgICBteSA9IG0ueSxcclxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcclxuICAgICAgICB0YW47XHJcblxyXG4gICAgcCA9IG0ubmV4dDtcclxuXHJcbiAgICB3aGlsZSAocCAhPT0gc3RvcCkge1xyXG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcclxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcclxuXHJcbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcclxuXHJcbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XHJcbiAgICAgICAgICAgICAgICBtID0gcDtcclxuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbTtcclxufVxyXG5cclxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XHJcbiAgICB2YXIgcCA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XHJcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcclxuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XHJcbiAgICBwLnByZXZaID0gbnVsbDtcclxuXHJcbiAgICBzb3J0TGlua2VkKHApO1xyXG59XHJcblxyXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxyXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxyXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcclxuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcclxuICAgICAgICBpblNpemUgPSAxO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBwID0gbGlzdDtcclxuICAgICAgICBsaXN0ID0gbnVsbDtcclxuICAgICAgICB0YWlsID0gbnVsbDtcclxuICAgICAgICBudW1NZXJnZXMgPSAwO1xyXG5cclxuICAgICAgICB3aGlsZSAocCkge1xyXG4gICAgICAgICAgICBudW1NZXJnZXMrKztcclxuICAgICAgICAgICAgcSA9IHA7XHJcbiAgICAgICAgICAgIHBTaXplID0gMDtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xyXG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplICE9PSAwICYmIChxU2l6ZSA9PT0gMCB8fCAhcSB8fCBwLnogPD0gcS56KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xyXG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xyXG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xyXG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xyXG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcclxuXHJcbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcclxuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwID0gcTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xyXG4gICAgICAgIGluU2l6ZSAqPSAyO1xyXG5cclxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG59XHJcblxyXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcclxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcclxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgKiBpbnZTaXplO1xyXG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAqIGludlNpemU7XHJcblxyXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcclxuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XHJcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xyXG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcclxuXHJcbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xyXG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcclxuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XHJcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xyXG5cclxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XHJcbn1cclxuXHJcbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcclxuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcclxuICAgIHZhciBwID0gc3RhcnQsXHJcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCkgbGVmdG1vc3QgPSBwO1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXHJcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcclxuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxyXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXHJcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxyXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xyXG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcclxuICAgICAgICAgICBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpO1xyXG59XHJcblxyXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXHJcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xyXG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxyXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XHJcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XHJcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcclxuICAgIGlmICgoZXF1YWxzKHAxLCBxMSkgJiYgZXF1YWxzKHAyLCBxMikpIHx8XHJcbiAgICAgICAgKGVxdWFscyhwMSwgcTIpICYmIGVxdWFscyhwMiwgcTEpKSkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXHJcbiAgICAgICAgICAgYXJlYShwMiwgcTIsIHAxKSA+IDAgIT09IGFyZWEocDIsIHEyLCBxMSkgPiAwO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xyXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XHJcbiAgICB2YXIgcCA9IGE7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxyXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cclxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XHJcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cclxuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XHJcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cclxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcclxuICAgIHZhciBwID0gYSxcclxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcclxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcclxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxyXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcclxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XHJcblxyXG4gICAgcmV0dXJuIGluc2lkZTtcclxufVxyXG5cclxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xyXG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcclxuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcclxuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxyXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXHJcbiAgICAgICAgYW4gPSBhLm5leHQsXHJcbiAgICAgICAgYnAgPSBiLnByZXY7XHJcblxyXG4gICAgYS5uZXh0ID0gYjtcclxuICAgIGIucHJldiA9IGE7XHJcblxyXG4gICAgYTIubmV4dCA9IGFuO1xyXG4gICAgYW4ucHJldiA9IGEyO1xyXG5cclxuICAgIGIyLm5leHQgPSBhMjtcclxuICAgIGEyLnByZXYgPSBiMjtcclxuXHJcbiAgICBicC5uZXh0ID0gYjI7XHJcbiAgICBiMi5wcmV2ID0gYnA7XHJcblxyXG4gICAgcmV0dXJuIGIyO1xyXG59XHJcblxyXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxyXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcclxuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XHJcblxyXG4gICAgaWYgKCFsYXN0KSB7XHJcbiAgICAgICAgcC5wcmV2ID0gcDtcclxuICAgICAgICBwLm5leHQgPSBwO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xyXG4gICAgICAgIHAucHJldiA9IGxhc3Q7XHJcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xyXG4gICAgICAgIGxhc3QubmV4dCA9IHA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XHJcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcclxuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xyXG5cclxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcclxuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcclxufVxyXG5cclxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XHJcbiAgICAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcclxuICAgIHRoaXMuaSA9IGk7XHJcblxyXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXHJcbiAgICB0aGlzLnggPSB4O1xyXG4gICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0ZXggbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcclxuICAgIHRoaXMucHJldiA9IG51bGw7XHJcbiAgICB0aGlzLm5leHQgPSBudWxsO1xyXG5cclxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcclxuICAgIHRoaXMueiA9IG51bGw7XHJcblxyXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XHJcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcclxuXHJcbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxyXG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XHJcbn1cclxuXHJcbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XHJcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cclxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcclxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcclxuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcclxuXHJcbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcclxuICAgIGlmIChoYXNIb2xlcykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcclxuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcclxuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XHJcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xyXG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXHJcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxyXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxyXG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcclxuICAgIHZhciBzdW0gPSAwO1xyXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xyXG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xyXG4gICAgICAgIGogPSBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1bTtcclxufVxyXG5cclxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXHJcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcclxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXHJcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpID4gMCkge1xyXG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBib3VuZGluZyBBQUJCIHJlY3RhbmdsZSBvZiBhIHBvbHlnb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2x5Z29uLkdldEFBQkJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9seWdvbn0gcG9seWdvbiAtIFRoZSBwb2x5Z29uIHRoYXQgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlJlY3RhbmdsZXxvYmplY3QpfSBbb3V0XSAtIFRoZSByZWN0YW5nbGUgb3Igb2JqZWN0IHRoYXQgaGFzIHgsIHksIHdpZHRoLCBhbmQgaGVpZ2h0IHByb3BlcnRpZXMgdG8gc3RvcmUgdGhlIHJlc3VsdC4gT3B0aW9uYWwuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5SZWN0YW5nbGV8b2JqZWN0KX0gVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgb3Igb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluIHdpdGggcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgb2YgdGhlIHBvbHlnb24ncyBBQUJCLlxyXG4gKi9cclxudmFyIEdldEFBQkIgPSBmdW5jdGlvbiAocG9seWdvbiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgdmFyIG1pblggPSBJbmZpbml0eTtcclxuICAgIHZhciBtaW5ZID0gSW5maW5pdHk7XHJcbiAgICB2YXIgbWF4WCA9IC1taW5YO1xyXG4gICAgdmFyIG1heFkgPSAtbWluWTtcclxuICAgIHZhciBwO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9seWdvbi5wb2ludHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgcCA9IHBvbHlnb24ucG9pbnRzW2ldO1xyXG5cclxuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcclxuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcclxuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcclxuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcclxuICAgIH1cclxuXHJcbiAgICBvdXQueCA9IG1pblg7XHJcbiAgICBvdXQueSA9IG1pblk7XHJcbiAgICBvdXQud2lkdGggPSBtYXhYIC0gbWluWDtcclxuICAgIG91dC5oZWlnaHQgPSBtYXhZIC0gbWluWTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRBQUJCO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vIEV4cG9ydCB0aGUgcG9pbnRzIGFzIGFuIGFycmF5IG9mIGZsYXQgbnVtYmVycywgZm9sbG93aW5nIHRoZSBzZXF1ZW5jZSBbIHgseSwgeCx5LCB4LHkgXVxyXG5cclxuLyoqXHJcbiAqIFN0b3JlcyBhbGwgb2YgdGhlIHBvaW50cyBvZiBhIFBvbHlnb24gaW50byBhIGZsYXQgYXJyYXkgb2YgbnVtYmVycyBmb2xsb3dpbmcgdGhlIHNlcXVlbmNlIFsgeCx5LCB4LHksIHgseSBdLFxyXG4gKiBpLmUuIGVhY2ggcG9pbnQgb2YgdGhlIFBvbHlnb24sIGluIHRoZSBvcmRlciBpdCdzIGRlZmluZWQsIGNvcnJlc3BvbmRzIHRvIHR3byBlbGVtZW50cyBvZiB0aGUgcmVzdWx0YW50XHJcbiAqIGFycmF5IGZvciB0aGUgcG9pbnQncyBYIGFuZCBZIGNvb3JkaW5hdGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5Qb2x5Z29uLkdldE51bWJlckFycmF5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7bnVtYmVyW119IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9seWdvbn0gcG9seWdvbiAtIFRoZSBQb2x5Z29uIHdob3NlIHBvaW50cyB0byBleHBvcnQuXHJcbiAqIEBwYXJhbSB7KGFycmF5fG51bWJlcltdKX0gW291dHB1dF0gLSBBbiBhcnJheSB0byB3aGljaCB0aGUgcG9pbnRzJyBjb29yZGluYXRlcyBzaG91bGQgYmUgYXBwZW5kZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxudW1iZXJbXSl9IFRoZSBtb2RpZmllZCBgb3V0cHV0YCBhcnJheSwgb3IgYSBuZXcgYXJyYXkgaWYgbm9uZSB3YXMgZ2l2ZW4uXHJcbiAqL1xyXG52YXIgR2V0TnVtYmVyQXJyYXkgPSBmdW5jdGlvbiAocG9seWdvbiwgb3V0cHV0KVxyXG57XHJcbiAgICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHsgb3V0cHV0ID0gW107IH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvbHlnb24ucG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHBvbHlnb24ucG9pbnRzW2ldLngpO1xyXG4gICAgICAgIG91dHB1dC5wdXNoKHBvbHlnb24ucG9pbnRzW2ldLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE51bWJlckFycmF5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBMZW5ndGggPSByZXF1aXJlKCcuLi9saW5lL0xlbmd0aCcpO1xyXG52YXIgTGluZSA9IHJlcXVpcmUoJy4uL2xpbmUvTGluZScpO1xyXG52YXIgUGVyaW1ldGVyID0gcmVxdWlyZSgnLi9QZXJpbWV0ZXInKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIFBvaW50IG9iamVjdHMgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50cyBhcm91bmQgdGhlIHBlcmltZXRlciBvZiB0aGUgUG9seWdvbixcclxuICogYmFzZWQgb24gdGhlIGdpdmVuIHF1YW50aXR5IG9yIHN0ZXBSYXRlIHZhbHVlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvbHlnb24uR2V0UG9pbnRzXHJcbiAqIEBzaW5jZSAzLjEyLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2x5Z29ufSBwb2x5Z29uIC0gVGhlIFBvbHlnb24gdG8gZ2V0IHRoZSBwb2ludHMgZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBhbW91bnQgb2YgcG9pbnRzIHRvIHJldHVybi4gSWYgYSBmYWxzZXkgdmFsdWUgdGhlIHF1YW50aXR5IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFJhdGVdIC0gU2V0cyB0aGUgcXVhbnRpdHkgYnkgZ2V0dGluZyB0aGUgcGVyaW1ldGVyIG9mIHRoZSBQb2x5Z29uIGFuZCBkaXZpZGluZyBpdCBieSB0aGUgc3RlcFJhdGUuXHJcbiAqIEBwYXJhbSB7YXJyYXl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gaW5zZXJ0IHRoZSBwb2ludHMgaW4gdG8uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50W119IEFuIGFycmF5IG9mIFBvaW50IG9iamVjdHMgcGVydGFpbmluZyB0byB0aGUgcG9pbnRzIGFyb3VuZCB0aGUgcGVyaW1ldGVyIG9mIHRoZSBQb2x5Z29uLlxyXG4gKi9cclxudmFyIEdldFBvaW50cyA9IGZ1bmN0aW9uIChwb2x5Z29uLCBxdWFudGl0eSwgc3RlcFJhdGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgdmFyIHBvaW50cyA9IHBvbHlnb24ucG9pbnRzO1xyXG4gICAgdmFyIHBlcmltZXRlciA9IFBlcmltZXRlcihwb2x5Z29uKTtcclxuXHJcbiAgICAvLyAgSWYgcXVhbnRpdHkgaXMgYSBmYWxzZXkgdmFsdWUgKGZhbHNlLCBudWxsLCAwLCB1bmRlZmluZWQsIGV0YykgdGhlbiB3ZSBjYWxjdWxhdGUgaXQgYmFzZWQgb24gdGhlIHN0ZXBSYXRlIGluc3RlYWQuXHJcbiAgICBpZiAoIXF1YW50aXR5ICYmIHN0ZXBSYXRlID4gMClcclxuICAgIHtcclxuICAgICAgICBxdWFudGl0eSA9IHBlcmltZXRlciAvIHN0ZXBSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBwZXJpbWV0ZXIgKiAoaSAvIHF1YW50aXR5KTtcclxuICAgICAgICB2YXIgYWNjdW11bGF0ZWRQZXJpbWV0ZXIgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBvaW50cy5sZW5ndGg7IGorKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludEEgPSBwb2ludHNbal07XHJcbiAgICAgICAgICAgIHZhciBwb2ludEIgPSBwb2ludHNbKGogKyAxKSAlIHBvaW50cy5sZW5ndGhdO1xyXG4gICAgICAgICAgICB2YXIgbGluZSA9IG5ldyBMaW5lKFxyXG4gICAgICAgICAgICAgICAgcG9pbnRBLngsXHJcbiAgICAgICAgICAgICAgICBwb2ludEEueSxcclxuICAgICAgICAgICAgICAgIHBvaW50Qi54LFxyXG4gICAgICAgICAgICAgICAgcG9pbnRCLnlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IExlbmd0aChsaW5lKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGFjY3VtdWxhdGVkUGVyaW1ldGVyIHx8IHBvc2l0aW9uID4gYWNjdW11bGF0ZWRQZXJpbWV0ZXIgKyBsZW5ndGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkUGVyaW1ldGVyICs9IGxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcG9pbnQgPSBsaW5lLmdldFBvaW50KChwb3NpdGlvbiAtIGFjY3VtdWxhdGVkUGVyaW1ldGVyKSAvIGxlbmd0aCk7XHJcbiAgICAgICAgICAgIG91dC5wdXNoKHBvaW50KTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRQb2ludHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExlbmd0aCA9IHJlcXVpcmUoJy4uL2xpbmUvTGVuZ3RoJyk7XHJcbnZhciBMaW5lID0gcmVxdWlyZSgnLi4vbGluZS9MaW5lJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcGVyaW1ldGVyIG9mIHRoZSBnaXZlbiBQb2x5Z29uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9seWdvbi5QZXJpbWV0ZXJcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvbHlnb259IHBvbHlnb24gLSBUaGUgUG9seWdvbiB0byBnZXQgdGhlIHBlcmltZXRlciBvZi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcGVyaW1ldGVyIG9mIHRoZSBQb2x5Z29uLlxyXG4gKi9cclxudmFyIFBlcmltZXRlciA9IGZ1bmN0aW9uIChwb2x5Z29uKVxyXG57XHJcbiAgICB2YXIgcG9pbnRzID0gcG9seWdvbi5wb2ludHM7XHJcbiAgICB2YXIgcGVyaW1ldGVyID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9pbnRBID0gcG9pbnRzW2ldO1xyXG4gICAgICAgIHZhciBwb2ludEIgPSBwb2ludHNbKGkgKyAxKSAlIHBvaW50cy5sZW5ndGhdO1xyXG4gICAgICAgIHZhciBsaW5lID0gbmV3IExpbmUoXHJcbiAgICAgICAgICAgIHBvaW50QS54LFxyXG4gICAgICAgICAgICBwb2ludEEueSxcclxuICAgICAgICAgICAgcG9pbnRCLngsXHJcbiAgICAgICAgICAgIHBvaW50Qi55XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcGVyaW1ldGVyICs9IExlbmd0aChsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGVyaW1ldGVyO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQZXJpbWV0ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG52YXIgR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxudmFyIEdFT01fQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBQb2x5Z29uIG9iamVjdFxyXG4gKlxyXG4gKiBUaGUgcG9seWdvbiBpcyBhIGNsb3NlZCBzaGFwZSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBjb25uZWN0ZWQgc3RyYWlnaHQgbGluZXMgZGVmaW5lZCBieSBsaXN0IG9mIG9yZGVyZWQgcG9pbnRzLlxyXG4gKiBTZXZlcmFsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB0byBkZWZpbmUgdGhlIGxpc3Qgb2YgcG9pbnRzLCBjaGVjayB0aGUgc2V0VG8gbWV0aG9kIGZvciBkZXRhaWxzLiBcclxuICogVGhpcyBpcyBhIGdlb21ldHJ5IG9iamVjdCBhbGxvd2luZyB5b3UgdG8gZGVmaW5lIGFuZCBpbnNwZWN0IHRoZSBzaGFwZS5cclxuICogSXQgaXMgbm90IGEgR2FtZSBPYmplY3QsIGluIHRoYXQgeW91IGNhbm5vdCBhZGQgaXQgdG8gdGhlIGRpc3BsYXkgbGlzdCwgYW5kIGl0IGhhcyBubyB0ZXh0dXJlLlxyXG4gKiBUbyByZW5kZXIgYSBQb2x5Z29uIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBHcmFwaGljcyBjbGFzcy5cclxuICpcclxuICogQGNsYXNzIFBvbHlnb25cclxuICogQG1lbWJlcm9mIFBoYXNlci5HZW9tXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludFtdfSBbcG9pbnRzXSAtIExpc3Qgb2YgcG9pbnRzIGRlZmluaW5nIHRoZSBwZXJpbWV0ZXIgb2YgdGhpcyBQb2x5Z29uLiBTZXZlcmFsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZDogXHJcbiAqIC0gQSBzdHJpbmcgY29udGFpbmluZyBwYWlyZWQgeCB5IHZhbHVlcyBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2U6IGAnNDAgMCA0MCAyMCAxMDAgMjAgMTAwIDgwIDQwIDgwIDQwIDEwMCAwIDUwJ2BcclxuICogLSBBbiBhcnJheSBvZiBQb2ludCBvYmplY3RzOiBgW25ldyBQaGFzZXIuUG9pbnQoeDEsIHkxKSwgLi4uXWBcclxuICogLSBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggcHVibGljIHggeSBwcm9wZXJ0aWVzOiBgW29iajEsIG9iajIsIC4uLl1gXHJcbiAqIC0gQW4gYXJyYXkgb2YgcGFpcmVkIG51bWJlcnMgdGhhdCByZXByZXNlbnQgcG9pbnQgY29vcmRpbmF0ZXM6IGBbeDEseTEsIHgyLHkyLCAuLi5dYFxyXG4gKiAtIEFuIGFycmF5IG9mIGFycmF5cyB3aXRoIHR3byBlbGVtZW50cyByZXByZXNlbnRpbmcgeC95IGNvb3JkaW5hdGVzOiBgW1t4MSwgeTFdLCBbeDIsIHkyXSwgLi4uXWBcclxuICovXHJcbnZhciBQb2x5Z29uID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFBvbHlnb24gKHBvaW50cylcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ2VvbWV0cnkgY29uc3RhbnQgdHlwZSBvZiB0aGlzIG9iamVjdDogYEdFT01fQ09OU1QuUE9MWUdPTmAuXHJcbiAgICAgICAgICogVXNlZCBmb3IgZmFzdCB0eXBlIGNvbXBhcmlzb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uUG9seWdvbiN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IEdFT01fQ09OU1QuUE9MWUdPTjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFyZWEgb2YgdGhpcyBQb2x5Z29uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uUG9seWdvbiNhcmVhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hcmVhID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgbnVtYmVyIHBhaXIgb2JqZWN0cyB0aGF0IG1ha2UgdXAgdGhpcyBwb2x5Z29uLiBJLmUuIFsge3gseX0sIHt4LHl9LCB7eCx5fSBdXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5Qb2x5Z29uI3BvaW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2VvbS5Qb2ludFtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9pbnRzID0gW107XHJcblxyXG4gICAgICAgIGlmIChwb2ludHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRvKHBvaW50cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgUG9seWdvbiBjb250YWlucyB0aGUgZ2l2ZW4geCAvIHkgY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5Qb2x5Z29uI2NvbnRhaW5zXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2hlY2sgd2l0aGluIHRoZSBwb2x5Z29uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNoZWNrIHdpdGhpbiB0aGUgcG9seWdvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gdGhlIHBvbHlnb24sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBjb250YWluczogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIENvbnRhaW5zKHRoaXMsIHgsIHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBQb2x5Z29uIHRvIHRoZSBnaXZlbiBwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHBvaW50cyBjYW4gYmUgc2V0IGZyb20gYSB2YXJpZXR5IG9mIGZvcm1hdHM6XHJcbiAgICAgKlxyXG4gICAgICogLSBBIHN0cmluZyBjb250YWluaW5nIHBhaXJlZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlOiBgJzQwIDAgNDAgMjAgMTAwIDIwIDEwMCA4MCA0MCA4MCA0MCAxMDAgMCA1MCdgXHJcbiAgICAgKiAtIEFuIGFycmF5IG9mIFBvaW50IG9iamVjdHM6IGBbbmV3IFBoYXNlci5Qb2ludCh4MSwgeTEpLCAuLi5dYFxyXG4gICAgICogLSBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggcHVibGljIHgveSBwcm9wZXJ0aWVzOiBgW29iajEsIG9iajIsIC4uLl1gXHJcbiAgICAgKiAtIEFuIGFycmF5IG9mIHBhaXJlZCBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHBvaW50IGNvb3JkaW5hdGVzOiBgW3gxLHkxLCB4Mix5MiwgLi4uXWBcclxuICAgICAqIC0gQW4gYXJyYXkgb2YgYXJyYXlzIHdpdGggdHdvIGVsZW1lbnRzIHJlcHJlc2VudGluZyB4L3kgY29vcmRpbmF0ZXM6IGBbW3gxLCB5MV0sIFt4MiwgeTJdLCAuLi5dYFxyXG4gICAgICpcclxuICAgICAqIGBzZXRUb2AgbWF5IGFsc28gYmUgY2FsbGVkIHdpdGhvdXQgYW55IGFyZ3VtZW50cyB0byByZW1vdmUgYWxsIHBvaW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlBvbHlnb24jc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBvaW50cyAtIFBvaW50cyBkZWZpbmluZyB0aGUgcGVyaW1ldGVyIG9mIHRoaXMgcG9seWdvbi4gUGxlYXNlIGNoZWNrIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGFib3ZlIGZvciB0aGUgZGlmZmVyZW50IHN1cHBvcnRlZCBmb3JtYXRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUG9seWdvbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRvOiBmdW5jdGlvbiAocG9pbnRzKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYXJlYSA9IDA7XHJcbiAgICAgICAgdGhpcy5wb2ludHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb2ludHMgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9pbnRzID0gcG9pbnRzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHA7XHJcbiAgICAgICAgdmFyIHkwID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBwb2ludHMgYXJndW1lbnQgaXMgYW4gYXJyYXksIHNvIGl0ZXJhdGUgdGhyb3VnaCBpdFxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcCA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwb2ludHNbaV0gPT09ICdudW1iZXInIHx8IHR5cGVvZiBwb2ludHNbaV0gPT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwLnggPSBwYXJzZUZsb2F0KHBvaW50c1tpXSk7XHJcbiAgICAgICAgICAgICAgICBwLnkgPSBwYXJzZUZsb2F0KHBvaW50c1tpICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocG9pbnRzW2ldKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEFuIGFycmF5IG9mIGFycmF5cz9cclxuICAgICAgICAgICAgICAgIHAueCA9IHBvaW50c1tpXVswXTtcclxuICAgICAgICAgICAgICAgIHAueSA9IHBvaW50c1tpXVsxXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHAueCA9IHBvaW50c1tpXS54O1xyXG4gICAgICAgICAgICAgICAgcC55ID0gcG9pbnRzW2ldLnk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucG9pbnRzLnB1c2gocCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgTG93ZXN0IGJvdW5kYXJ5XHJcbiAgICAgICAgICAgIGlmIChwLnkgPCB5MClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeTAgPSBwLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQXJlYSh5MCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGFyZWEgb2YgdGhlIFBvbHlnb24uIFRoaXMgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wZXJ0eSBQb2x5Z29uLmFyZWFcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlBvbHlnb24jY2FsY3VsYXRlQXJlYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYXJlYSBvZiB0aGUgcG9seWdvbi5cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlQXJlYTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5wb2ludHMubGVuZ3RoIDwgMylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYXJlYSA9IDA7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHN1bSA9IDA7XHJcbiAgICAgICAgdmFyIHAxO1xyXG4gICAgICAgIHZhciBwMjtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwMSA9IHRoaXMucG9pbnRzW2ldO1xyXG4gICAgICAgICAgICBwMiA9IHRoaXMucG9pbnRzW2kgKyAxXTtcclxuXHJcbiAgICAgICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHAxID0gdGhpcy5wb2ludHNbMF07XHJcbiAgICAgICAgcDIgPSB0aGlzLnBvaW50c1t0aGlzLnBvaW50cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgc3VtICs9IChwMS54IC0gcDIueCkgKiAocDIueSArIHAxLnkpO1xyXG5cclxuICAgICAgICB0aGlzLmFyZWEgPSAtc3VtICogMC41O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hcmVhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgUG9pbnQgb2JqZWN0cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIGFyb3VuZCB0aGUgcGVyaW1ldGVyIG9mIHRoZSBQb2x5Z29uLFxyXG4gICAgICogYmFzZWQgb24gdGhlIGdpdmVuIHF1YW50aXR5IG9yIHN0ZXBSYXRlIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlBvbHlnb24jZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50W119IE8gLSBbb3V0cHV0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBhbW91bnQgb2YgcG9pbnRzIHRvIHJldHVybi4gSWYgYSBmYWxzZXkgdmFsdWUgdGhlIHF1YW50aXR5IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgc3RlcFJhdGVgIGluc3RlYWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBSYXRlXSAtIFNldHMgdGhlIHF1YW50aXR5IGJ5IGdldHRpbmcgdGhlIHBlcmltZXRlciBvZiB0aGUgUG9seWdvbiBhbmQgZGl2aWRpbmcgaXQgYnkgdGhlIHN0ZXBSYXRlLlxyXG4gICAgICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gaW5zZXJ0IHRoZSBwb2ludHMgaW4gdG8uIElmIG5vdCBwcm92aWRlZCBhIG5ldyBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBBbiBhcnJheSBvZiBQb2ludCBvYmplY3RzIHBlcnRhaW5pbmcgdG8gdGhlIHBvaW50cyBhcm91bmQgdGhlIHBlcmltZXRlciBvZiB0aGUgUG9seWdvbi5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRzOiBmdW5jdGlvbiAocXVhbnRpdHksIHN0ZXAsIG91dHB1dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0UG9pbnRzKHRoaXMsIHF1YW50aXR5LCBzdGVwLCBvdXRwdXQpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBvbHlnb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgcG9pbnRzIG9mIGEgUG9seWdvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlBvbHlnb24uUmV2ZXJzZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvbHlnb259IE8gLSBbcG9seWdvbiwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvbHlnb259IHBvbHlnb24gLSBUaGUgUG9seWdvbiB0byBtb2RpZnkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvbHlnb259IFRoZSBtb2RpZmllZCBQb2x5Z29uLlxyXG4gKi9cclxudmFyIFJldmVyc2UgPSBmdW5jdGlvbiAocG9seWdvbilcclxue1xyXG4gICAgcG9seWdvbi5wb2ludHMucmV2ZXJzZSgpO1xyXG5cclxuICAgIHJldHVybiBwb2x5Z29uO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZXZlcnNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBJZ29yIE9nbmljaGVua28gPG9nbmljaGVua28uaWdvckBnbWFpbC5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQGlnbm9yZVxyXG4gKi9cclxudmFyIGNvcHkgPSBmdW5jdGlvbiAob3V0LCBhKVxyXG57XHJcbiAgICBvdXRbMF0gPSBhWzBdO1xyXG4gICAgb3V0WzFdID0gYVsxXTtcclxuICBcclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogVGFrZXMgYSBQb2x5Z29uIG9iamVjdCBhbmQgYXBwbGllcyBDaGFpa2luJ3Mgc21vb3RoaW5nIGFsZ29yaXRobSBvbiBpdHMgcG9pbnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUG9seWdvbi5TbW9vdGhcclxuICogQHNpbmNlIDMuMTMuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9seWdvbn0gTyAtIFtwb2x5Z29uLCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9seWdvbn0gcG9seWdvbiAtIFRoZSBwb2x5Z29uIHRvIGJlIHNtb290aGVkLiBUaGUgcG9seWdvbiB3aWxsIGJlIG1vZGlmaWVkIGluLXBsYWNlIGFuZCByZXR1cm5lZC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9seWdvbn0gVGhlIGlucHV0IHBvbHlnb24uXHJcbiAqL1xyXG52YXIgU21vb3RoID0gZnVuY3Rpb24gKHBvbHlnb24pXHJcbntcclxuICAgIHZhciBpO1xyXG4gICAgdmFyIHBvaW50cyA9IFtdO1xyXG4gICAgdmFyIGRhdGEgPSBwb2x5Z29uLnBvaW50cztcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBwb2ludHMucHVzaChbIGRhdGFbaV0ueCwgZGF0YVtpXS55IF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBvdXRwdXQgPSBbXTtcclxuICBcclxuICAgIGlmIChwb2ludHMubGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgICBvdXRwdXQucHVzaChjb3B5KFsgMCwgMCBdLCBwb2ludHNbMF0pKTtcclxuICAgIH1cclxuICBcclxuICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwMCA9IHBvaW50c1tpXTtcclxuICAgICAgICB2YXIgcDEgPSBwb2ludHNbaSArIDFdO1xyXG4gICAgICAgIHZhciBwMHggPSBwMFswXTtcclxuICAgICAgICB2YXIgcDB5ID0gcDBbMV07XHJcbiAgICAgICAgdmFyIHAxeCA9IHAxWzBdO1xyXG4gICAgICAgIHZhciBwMXkgPSBwMVsxXTtcclxuXHJcbiAgICAgICAgb3V0cHV0LnB1c2goWyAwLjg1ICogcDB4ICsgMC4xNSAqIHAxeCwgMC44NSAqIHAweSArIDAuMTUgKiBwMXkgXSk7XHJcbiAgICAgICAgb3V0cHV0LnB1c2goWyAwLjE1ICogcDB4ICsgMC44NSAqIHAxeCwgMC4xNSAqIHAweSArIDAuODUgKiBwMXkgXSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA+IDEpXHJcbiAgICB7XHJcbiAgICAgICAgb3V0cHV0LnB1c2goY29weShbIDAsIDAgXSwgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSkpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcmV0dXJuIHBvbHlnb24uc2V0VG8ob3V0cHV0KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU21vb3RoO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2x5Z29uID0gcmVxdWlyZSgnLi9Qb2x5Z29uJyk7XHJcblxyXG5Qb2x5Z29uLkNsb25lID0gcmVxdWlyZSgnLi9DbG9uZScpO1xyXG5Qb2x5Z29uLkNvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG5Qb2x5Z29uLkNvbnRhaW5zUG9pbnQgPSByZXF1aXJlKCcuL0NvbnRhaW5zUG9pbnQnKTtcclxuUG9seWdvbi5HZXRBQUJCID0gcmVxdWlyZSgnLi9HZXRBQUJCJyk7XHJcblBvbHlnb24uR2V0TnVtYmVyQXJyYXkgPSByZXF1aXJlKCcuL0dldE51bWJlckFycmF5Jyk7XHJcblBvbHlnb24uR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxuUG9seWdvbi5QZXJpbWV0ZXIgPSByZXF1aXJlKCcuL1BlcmltZXRlcicpO1xyXG5Qb2x5Z29uLlJldmVyc2UgPSByZXF1aXJlKCcuL1JldmVyc2UnKTtcclxuUG9seWdvbi5TbW9vdGggPSByZXF1aXJlKCcuL1Ntb290aCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQb2x5Z29uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhcmVhIG9mIHRoZSBnaXZlbiBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkFyZWFcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIHJlY3RhbmdsZSB0byBjYWxjdWxhdGUgdGhlIGFyZWEgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWEgb2YgdGhlIFJlY3RhbmdsZSBvYmplY3QuXHJcbiAqL1xyXG52YXIgQXJlYSA9IGZ1bmN0aW9uIChyZWN0KVxyXG57XHJcbiAgICByZXR1cm4gcmVjdC53aWR0aCAqIHJlY3QuaGVpZ2h0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBcmVhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSb3VuZHMgYSBSZWN0YW5nbGUncyBwb3NpdGlvbiB1cCB0byB0aGUgc21hbGxlc3QgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZWFjaCBjdXJyZW50IGNvb3JkaW5hdGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuQ2VpbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtyZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIFJlY3RhbmdsZSB0byBhZGp1c3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIGFkanVzdGVkIFJlY3RhbmdsZS5cclxuICovXHJcbnZhciBDZWlsID0gZnVuY3Rpb24gKHJlY3QpXHJcbntcclxuICAgIHJlY3QueCA9IE1hdGguY2VpbChyZWN0LngpO1xyXG4gICAgcmVjdC55ID0gTWF0aC5jZWlsKHJlY3QueSk7XHJcblxyXG4gICAgcmV0dXJuIHJlY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENlaWw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJvdW5kcyBhIFJlY3RhbmdsZSdzIHBvc2l0aW9uIGFuZCBzaXplIHVwIHRvIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBlYWNoIHJlc3BlY3RpdmUgdmFsdWUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuQ2VpbEFsbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtyZWN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIFJlY3RhbmdsZSB0byBtb2RpZnkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIG1vZGlmaWVkIFJlY3RhbmdsZS5cclxuICovXHJcbnZhciBDZWlsQWxsID0gZnVuY3Rpb24gKHJlY3QpXHJcbntcclxuICAgIHJlY3QueCA9IE1hdGguY2VpbChyZWN0LngpO1xyXG4gICAgcmVjdC55ID0gTWF0aC5jZWlsKHJlY3QueSk7XHJcbiAgICByZWN0LndpZHRoID0gTWF0aC5jZWlsKHJlY3Qud2lkdGgpO1xyXG4gICAgcmVjdC5oZWlnaHQgPSBNYXRoLmNlaWwocmVjdC5oZWlnaHQpO1xyXG5cclxuICAgIHJldHVybiByZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDZWlsQWxsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vIENlbnRlcnMgdGhpcyBSZWN0YW5nbGUgc28gdGhhdCB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG1hdGNoIHRoZSBnaXZlbiB4IGFuZCB5IHZhbHVlcy5cclxuXHJcbi8qKlxyXG4gKiBNb3ZlcyB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIGEgUmVjdGFuZ2xlIHNvIHRoYXQgaXRzIGNlbnRlciBpcyBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuQ2VudGVyT25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbcmVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgdG8gYmUgY2VudGVyZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgUmVjdGFuZ2xlJ3MgY2VudGVyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIFJlY3RhbmdsZSdzIGNlbnRlci5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgY2VudGVyZWQgcmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIENlbnRlck9uID0gZnVuY3Rpb24gKHJlY3QsIHgsIHkpXHJcbntcclxuICAgIHJlY3QueCA9IHggLSAocmVjdC53aWR0aCAvIDIpO1xyXG4gICAgcmVjdC55ID0geSAtIChyZWN0LmhlaWdodCAvIDIpO1xyXG5cclxuICAgIHJldHVybiByZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDZW50ZXJPbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFJlY3RhbmdsZSB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhlIGdpdmVuIG9uZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5DbG9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHNvdXJjZSAtIFRoZSBSZWN0YW5nbGUgdG8gY2xvbmUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIG5ld2x5IGNyZWF0ZWQgUmVjdGFuZ2xlLCB3aGljaCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBnaXZlbiBvbmUuXHJcbiAqL1xyXG52YXIgQ2xvbmUgPSBmdW5jdGlvbiAoc291cmNlKVxyXG57XHJcbiAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShzb3VyY2UueCwgc291cmNlLnksIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENsb25lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgYSBSZWN0YW5nbGUncyBib3VuZHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuQ29udGFpbnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0IC0gVGhlIFJlY3RhbmdsZSB0byBjaGVjay5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIFJlY3RhbmdsZSdzIGJvdW5kcywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgQ29udGFpbnMgPSBmdW5jdGlvbiAocmVjdCwgeCwgeSlcclxue1xyXG4gICAgaWYgKHJlY3Qud2lkdGggPD0gMCB8fCByZWN0LmhlaWdodCA8PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKHJlY3QueCA8PSB4ICYmIHJlY3QueCArIHJlY3Qud2lkdGggPj0geCAmJiByZWN0LnkgPD0geSAmJiByZWN0LnkgKyByZWN0LmhlaWdodCA+PSB5KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvaW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiBkZWZpbmVkIGJ5IHRoaXMgUmVjdGFuZ2xlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5Db250YWluc1BvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBwb2ludCBvYmplY3QgdG8gYmUgY2hlY2tlZC4gQ2FuIGJlIGEgUGhhc2VyIFBvaW50IG9iamVjdCBvciBhbnkgb2JqZWN0IHdpdGggeCBhbmQgeSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IEEgdmFsdWUgb2YgdHJ1ZSBpZiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvaW50LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAqL1xyXG52YXIgQ29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIChyZWN0LCBwb2ludClcclxue1xyXG4gICAgcmV0dXJuIENvbnRhaW5zKHJlY3QsIHBvaW50LngsIHBvaW50LnkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWluc1BvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiBvbmUgcmVjdGFuZ2xlIGZ1bGx5IGNvbnRhaW5zIGFub3RoZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuQ29udGFpbnNSZWN0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEEgLSBUaGUgZmlyc3QgcmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEIgLSBUaGUgc2Vjb25kIHJlY3RhbmdsZS5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBvbmx5IGlmIHJlY3RBIGZ1bGx5IGNvbnRhaW5zIHJlY3RCLlxyXG4gKi9cclxudmFyIENvbnRhaW5zUmVjdCA9IGZ1bmN0aW9uIChyZWN0QSwgcmVjdEIpXHJcbntcclxuICAgIC8vICBWb2x1bWUgY2hlY2sgKGlmIHJlY3RCIHZvbHVtZSA+IHJlY3RBIHRoZW4gcmVjdEEgY2Fubm90IGNvbnRhaW4gaXQpXHJcbiAgICBpZiAoKHJlY3RCLndpZHRoICogcmVjdEIuaGVpZ2h0KSA+IChyZWN0QS53aWR0aCAqIHJlY3RBLmhlaWdodCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgICAgKHJlY3RCLnggPiByZWN0QS54ICYmIHJlY3RCLnggPCByZWN0QS5yaWdodCkgJiZcclxuICAgICAgICAocmVjdEIucmlnaHQgPiByZWN0QS54ICYmIHJlY3RCLnJpZ2h0IDwgcmVjdEEucmlnaHQpICYmXHJcbiAgICAgICAgKHJlY3RCLnkgPiByZWN0QS55ICYmIHJlY3RCLnkgPCByZWN0QS5ib3R0b20pICYmXHJcbiAgICAgICAgKHJlY3RCLmJvdHRvbSA+IHJlY3RBLnkgJiYgcmVjdEIuYm90dG9tIDwgcmVjdEEuYm90dG9tKVxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnNSZWN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgb2Ygb25lIFJlY3RhbmdsZSB0byBhIGRlc3RpbmF0aW9uIFJlY3RhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5Db3B5RnJvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtkZXN0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBzb3VyY2UgLSBUaGUgc291cmNlIFJlY3RhbmdsZSB0byBjb3B5IHRoZSB2YWx1ZXMgZnJvbS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gUmVjdGFuZ2xlIHRvIGNvcHkgdGhlIHZhbHVlcyB0by5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgZGVzdGluYXRpb24gUmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIENvcHlGcm9tID0gZnVuY3Rpb24gKHNvdXJjZSwgZGVzdClcclxue1xyXG4gICAgcmV0dXJuIGRlc3Quc2V0VG8oc291cmNlLngsIHNvdXJjZS55LCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb3B5RnJvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGFycmF5IG9mIHBvaW50cyBmb3IgZWFjaCBjb3JuZXIgb2YgYSBSZWN0YW5nbGVcclxuICogSWYgYW4gYXJyYXkgaXMgc3BlY2lmaWVkLCBlYWNoIHBvaW50IG9iamVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCBvdGhlcndpc2UgYSBuZXcgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkRlY29tcG9zZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIG9iamVjdCB0byBiZSBkZWNvbXBvc2VkLlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIElmIHByb3ZpZGVkLCBlYWNoIHBvaW50IHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBhcnJheS5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IFdpbGwgcmV0dXJuIHRoZSBhcnJheSB5b3Ugc3BlY2lmaWVkIG9yIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIHBvaW50cyBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIERlY29tcG9zZSA9IGZ1bmN0aW9uIChyZWN0LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIG91dC5wdXNoKHsgeDogcmVjdC54LCB5OiByZWN0LnkgfSk7XHJcbiAgICBvdXQucHVzaCh7IHg6IHJlY3QucmlnaHQsIHk6IHJlY3QueSB9KTtcclxuICAgIG91dC5wdXNoKHsgeDogcmVjdC5yaWdodCwgeTogcmVjdC5ib3R0b20gfSk7XHJcbiAgICBvdXQucHVzaCh7IHg6IHJlY3QueCwgeTogcmVjdC5ib3R0b20gfSk7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGVjb21wb3NlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb21wYXJlcyB0aGUgYHhgLCBgeWAsIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMgb2YgdHdvIHJlY3RhbmdsZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuRXF1YWxzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFJlY3RhbmdsZSBBXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSB0b0NvbXBhcmUgLSBSZWN0YW5nbGUgQlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlY3RhbmdsZXMnIHByb3BlcnRpZXMgYXJlIGFuIGV4YWN0IG1hdGNoLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBFcXVhbHMgPSBmdW5jdGlvbiAocmVjdCwgdG9Db21wYXJlKVxyXG57XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAgIHJlY3QueCA9PT0gdG9Db21wYXJlLnggJiZcclxuICAgICAgICByZWN0LnkgPT09IHRvQ29tcGFyZS55ICYmXHJcbiAgICAgICAgcmVjdC53aWR0aCA9PT0gdG9Db21wYXJlLndpZHRoICYmXHJcbiAgICAgICAgcmVjdC5oZWlnaHQgPT09IHRvQ29tcGFyZS5oZWlnaHRcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVxdWFscztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0QXNwZWN0UmF0aW8gPSByZXF1aXJlKCcuL0dldEFzcGVjdFJhdGlvJyk7XHJcblxyXG4vKipcclxuICogQWRqdXN0cyB0aGUgdGFyZ2V0IHJlY3RhbmdsZSwgY2hhbmdpbmcgaXRzIHdpZHRoLCBoZWlnaHQgYW5kIHBvc2l0aW9uLFxyXG4gKiBzbyB0aGF0IGl0IGZpdHMgaW5zaWRlIHRoZSBhcmVhIG9mIHRoZSBzb3VyY2UgcmVjdGFuZ2xlLCB3aGlsZSBtYWludGFpbmluZyBpdHMgb3JpZ2luYWxcclxuICogYXNwZWN0IHJhdGlvLlxyXG4gKiBcclxuICogVW5saWtlIHRoZSBgRml0T3V0c2lkZWAgZnVuY3Rpb24sIHRoZXJlIG1heSBiZSBzb21lIHNwYWNlIGluc2lkZSB0aGUgc291cmNlIGFyZWEgbm90IGNvdmVyZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuRml0SW5zaWRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3RhcmdldCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gdGFyZ2V0IC0gVGhlIHRhcmdldCByZWN0YW5nbGUgdG8gYWRqdXN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gc291cmNlIC0gVGhlIHNvdXJjZSByZWN0YW5nbGUgdG8gZW52ZWxvcCB0aGUgdGFyZ2V0IGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBtb2RpZmllZCB0YXJnZXQgcmVjdGFuZ2xlIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEZpdEluc2lkZSA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSlcclxue1xyXG4gICAgdmFyIHJhdGlvID0gR2V0QXNwZWN0UmF0aW8odGFyZ2V0KTtcclxuXHJcbiAgICBpZiAocmF0aW8gPCBHZXRBc3BlY3RSYXRpbyhzb3VyY2UpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBUYWxsZXIgdGhhbiBXaWRlXHJcbiAgICAgICAgdGFyZ2V0LnNldFNpemUoc291cmNlLmhlaWdodCAqIHJhdGlvLCBzb3VyY2UuaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICAvLyAgV2lkZXIgdGhhbiBUYWxsXHJcbiAgICAgICAgdGFyZ2V0LnNldFNpemUoc291cmNlLndpZHRoLCBzb3VyY2Uud2lkdGggLyByYXRpbyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRhcmdldC5zZXRQb3NpdGlvbihcclxuICAgICAgICBzb3VyY2UuY2VudGVyWCAtICh0YXJnZXQud2lkdGggLyAyKSxcclxuICAgICAgICBzb3VyY2UuY2VudGVyWSAtICh0YXJnZXQuaGVpZ2h0IC8gMilcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpdEluc2lkZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0QXNwZWN0UmF0aW8gPSByZXF1aXJlKCcuL0dldEFzcGVjdFJhdGlvJyk7XHJcblxyXG4vKipcclxuICogQWRqdXN0cyB0aGUgdGFyZ2V0IHJlY3RhbmdsZSwgY2hhbmdpbmcgaXRzIHdpZHRoLCBoZWlnaHQgYW5kIHBvc2l0aW9uLFxyXG4gKiBzbyB0aGF0IGl0IGZ1bGx5IGNvdmVycyB0aGUgYXJlYSBvZiB0aGUgc291cmNlIHJlY3RhbmdsZSwgd2hpbGUgbWFpbnRhaW5pbmcgaXRzIG9yaWdpbmFsXHJcbiAqIGFzcGVjdCByYXRpby5cclxuICogXHJcbiAqIFVubGlrZSB0aGUgYEZpdEluc2lkZWAgZnVuY3Rpb24sIHRoZSB0YXJnZXQgcmVjdGFuZ2xlIG1heSBleHRlbmQgZnVydGhlciBvdXQgdGhhbiB0aGUgc291cmNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkZpdE91dHNpZGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbdGFyZ2V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHJlY3RhbmdsZSB0byBhZGp1c3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBzb3VyY2UgLSBUaGUgc291cmNlIHJlY3RhbmdsZSB0byBlbnZlbG9wZSB0aGUgdGFyZ2V0IGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBtb2RpZmllZCB0YXJnZXQgcmVjdGFuZ2xlIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIEZpdE91dHNpZGUgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpXHJcbntcclxuICAgIHZhciByYXRpbyA9IEdldEFzcGVjdFJhdGlvKHRhcmdldCk7XHJcblxyXG4gICAgaWYgKHJhdGlvID4gR2V0QXNwZWN0UmF0aW8oc291cmNlKSlcclxuICAgIHtcclxuICAgICAgICAvLyAgV2lkZXIgdGhhbiBUYWxsXHJcbiAgICAgICAgdGFyZ2V0LnNldFNpemUoc291cmNlLmhlaWdodCAqIHJhdGlvLCBzb3VyY2UuaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICAvLyAgVGFsbGVyIHRoYW4gV2lkZVxyXG4gICAgICAgIHRhcmdldC5zZXRTaXplKHNvdXJjZS53aWR0aCwgc291cmNlLndpZHRoIC8gcmF0aW8pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXJnZXQuc2V0UG9zaXRpb24oXHJcbiAgICAgICAgc291cmNlLmNlbnRlclggLSB0YXJnZXQud2lkdGggLyAyLFxyXG4gICAgICAgIHNvdXJjZS5jZW50ZXJZIC0gdGFyZ2V0LmhlaWdodCAvIDJcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpdE91dHNpZGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJvdW5kcyBkb3duIChmbG9vcnMpIHRoZSB0b3AgbGVmdCBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBnaXZlbiBSZWN0YW5nbGUgdG8gdGhlIGxhcmdlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlbVxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkZsb29yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3JlY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgcmVjdGFuZ2xlIHRvIGZsb29yIHRoZSB0b3AgbGVmdCBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIHJlY3RhbmdsZSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB3aXRoIGl0cyBjb29yZGluYXRlcyBmbG9vcmVkLlxyXG4gKi9cclxudmFyIEZsb29yID0gZnVuY3Rpb24gKHJlY3QpXHJcbntcclxuICAgIHJlY3QueCA9IE1hdGguZmxvb3IocmVjdC54KTtcclxuICAgIHJlY3QueSA9IE1hdGguZmxvb3IocmVjdC55KTtcclxuXHJcbiAgICByZXR1cm4gcmVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxvb3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJvdW5kcyBhIFJlY3RhbmdsZSdzIHBvc2l0aW9uIGFuZCBzaXplIGRvd24gdG8gdGhlIGxhcmdlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZWFjaCBjdXJyZW50IGNvb3JkaW5hdGUgb3IgZGltZW5zaW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkZsb29yQWxsXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3JlY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGFkanVzdC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgYWRqdXN0ZWQgUmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIEZsb29yQWxsID0gZnVuY3Rpb24gKHJlY3QpXHJcbntcclxuICAgIHJlY3QueCA9IE1hdGguZmxvb3IocmVjdC54KTtcclxuICAgIHJlY3QueSA9IE1hdGguZmxvb3IocmVjdC55KTtcclxuICAgIHJlY3Qud2lkdGggPSBNYXRoLmZsb29yKHJlY3Qud2lkdGgpO1xyXG4gICAgcmVjdC5oZWlnaHQgPSBNYXRoLmZsb29yKHJlY3QuaGVpZ2h0KTtcclxuXHJcbiAgICByZXR1cm4gcmVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxvb3JBbGw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlJyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG5cclxuLy8gIHBvaW50cyBpcyBhbiBhcnJheSBvZiBQb2ludC1saWtlIG9iamVjdHMsXHJcbi8vICBlaXRoZXIgMiBkaW1lbnNpb25hbCBhcnJheXMsIG9yIG9iamVjdHMgd2l0aCBwdWJsaWMgeC95IHByb3BlcnRpZXM6XHJcbi8vICB2YXIgcG9pbnRzID0gW1xyXG4vLyAgICAgIFsxMDAsIDIwMF0sXHJcbi8vICAgICAgWzIwMCwgNDAwXSxcclxuLy8gICAgICB7IHg6IDMwLCB5OiA2MCB9XHJcbi8vICBdXHJcblxyXG4vKipcclxuICogQ29uc3RydWN0cyBuZXcgUmVjdGFuZ2xlIG9yIHJlcG9zaXRpb25zIGFuZCByZXNpemVzIGFuIGV4aXN0aW5nIFJlY3RhbmdsZSBzbyB0aGF0IGFsbCBvZiB0aGUgZ2l2ZW4gcG9pbnRzIGFyZSBvbiBvciB3aXRoaW4gaXRzIGJvdW5kcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5Gcm9tUG9pbnRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBwb2ludHMgLSBBbiBhcnJheSBvZiBwb2ludHMgKGVpdGhlciBhcnJheXMgd2l0aCB0d28gZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgWCBhbmQgWSBjb29yZGluYXRlIG9yIGFuIG9iamVjdCB3aXRoIHB1YmxpYyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzKSB3aGljaCBzaG91bGQgYmUgc3Vycm91bmRlZCBieSB0aGUgUmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gW291dF0gLSBPcHRpb25hbCBSZWN0YW5nbGUgdG8gYWRqdXN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBhZGp1c3RlZCBgb3V0YCBSZWN0YW5nbGUsIG9yIGEgbmV3IFJlY3RhbmdsZSBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICovXHJcbnZhciBGcm9tUG9pbnRzID0gZnVuY3Rpb24gKHBvaW50cywgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbWluWCA9IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICB2YXIgbWluWSA9IE51bWJlci5NQVhfVkFMVUU7XHJcblxyXG4gICAgdmFyIG1heFggPSBNQVRIX0NPTlNULk1JTl9TQUZFX0lOVEVHRVI7XHJcbiAgICB2YXIgbWF4WSA9IE1BVEhfQ09OU1QuTUlOX1NBRkVfSU5URUdFUjtcclxuXHJcbiAgICB2YXIgcDtcclxuICAgIHZhciBweDtcclxuICAgIHZhciBweTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBwID0gcG9pbnRzW2ldO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHB4ID0gcFswXTtcclxuICAgICAgICAgICAgcHkgPSBwWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBweCA9IHAueDtcclxuICAgICAgICAgICAgcHkgPSBwLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcHgpO1xyXG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBweSk7XHJcblxyXG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBweCk7XHJcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHB5KTtcclxuICAgIH1cclxuXHJcbiAgICBvdXQueCA9IG1pblg7XHJcbiAgICBvdXQueSA9IG1pblk7XHJcbiAgICBvdXQud2lkdGggPSBtYXhYIC0gbWluWDtcclxuICAgIG91dC5oZWlnaHQgPSBtYXhZIC0gbWluWTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGcm9tUG9pbnRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBzYW1tZVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4vUmVjdGFuZ2xlJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIHRoZSBzbWFsbGVzdCBSZWN0YW5nbGUgY29udGFpbmluZyB0d28gY29vcmRpbmF0ZSBwYWlycy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5Gcm9tWFlcclxuICogQHNpbmNlIDMuMjMuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gW291dF0gLSBPcHRpb25hbCBSZWN0YW5nbGUgdG8gYWRqdXN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBhZGp1c3RlZCBgb3V0YCBSZWN0YW5nbGUsIG9yIGEgbmV3IFJlY3RhbmdsZSBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICovXHJcbnZhciBGcm9tWFkgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBSZWN0YW5nbGUoKTsgfVxyXG5cclxuICAgIHJldHVybiBvdXQuc2V0VG8oXHJcbiAgICAgICAgTWF0aC5taW4oeDEsIHgyKSxcclxuICAgICAgICBNYXRoLm1pbih5MSwgeTIpLFxyXG4gICAgICAgIE1hdGguYWJzKHgxIC0geDIpLFxyXG4gICAgICAgIE1hdGguYWJzKHkxIC0geTIpXHJcbiAgICApO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGcm9tWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoL2hlaWdodCByYXRpbyBvZiBhIHJlY3RhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5HZXRBc3BlY3RSYXRpb1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgcmVjdGFuZ2xlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3aWR0aC9oZWlnaHQgcmF0aW8gb2YgdGhlIHJlY3RhbmdsZS5cclxuICovXHJcbnZhciBHZXRBc3BlY3RSYXRpbyA9IGZ1bmN0aW9uIChyZWN0KVxyXG57XHJcbiAgICByZXR1cm4gKHJlY3QuaGVpZ2h0ID09PSAwKSA/IE5hTiA6IHJlY3Qud2lkdGggLyByZWN0LmhlaWdodDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0QXNwZWN0UmF0aW87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjZW50ZXIgb2YgYSBSZWN0YW5nbGUgYXMgYSBQb2ludC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5HZXRDZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGdldCB0aGUgY2VudGVyIG9mLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIE9wdGlvbmFsIHBvaW50LWxpa2Ugb2JqZWN0IHRvIHVwZGF0ZSB3aXRoIHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBUaGUgbW9kaWZpZWQgYG91dGAgb2JqZWN0LCBvciBhIG5ldyBQb2ludCBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICovXHJcbnZhciBHZXRDZW50ZXIgPSBmdW5jdGlvbiAocmVjdCwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICBvdXQueCA9IHJlY3QuY2VudGVyWDtcclxuICAgIG91dC55ID0gcmVjdC5jZW50ZXJZO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldENlbnRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUGVyaW1ldGVyID0gcmVxdWlyZSgnLi9QZXJpbWV0ZXInKTtcclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IGF0IGEgY2VydGFpbiBgcG9zaXRpb25gIG9uIHRoZSBSZWN0YW5nbGUncyBwZXJpbWV0ZXIuXHJcbiAqIFxyXG4gKiBUaGUgYHBvc2l0aW9uYCBpcyBhIGZyYWN0aW9uIGJldHdlZW4gMCBhbmQgMSB3aGljaCBkZWZpbmVzIGhvdyBmYXIgaW50byB0aGUgcGVyaW1ldGVyIHRoZSBwb2ludCBpcy5cclxuICogXHJcbiAqIEEgdmFsdWUgb2YgMCBvciAxIHJldHVybnMgdGhlIHBvaW50IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSwgd2hpbGUgYSB2YWx1ZSBvZiAwLjUgcmV0dXJucyB0aGUgcG9pbnQgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4gVmFsdWVzIGJldHdlZW4gMCBhbmQgMC41IGFyZSBvbiB0aGUgdG9wIG9yIHRoZSByaWdodCBzaWRlIGFuZCB2YWx1ZXMgYmV0d2VlbiAwLjUgYW5kIDEgYXJlIG9uIHRoZSBib3R0b20gb3IgdGhlIGxlZnQgc2lkZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5HZXRQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdGFuZ2xlIC0gVGhlIFJlY3RhbmdsZSB0byBnZXQgdGhlIHBlcmltZXRlciBwb2ludCBmcm9tLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gLSBUaGUgbm9ybWFsaXplZCBkaXN0YW5jZSBpbnRvIHRoZSBSZWN0YW5nbGUncyBwZXJpbWV0ZXIgdG8gcmV0dXJuLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIEFuIG9iamVjdCB0byB1cGRhdGUgd2l0aCB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gVGhlIHVwZGF0ZWQgYG91dHB1dGAgb2JqZWN0LCBvciBhIG5ldyBQb2ludCBpZiBubyBgb3V0cHV0YCBvYmplY3Qgd2FzIGdpdmVuLlxyXG4gKi9cclxudmFyIEdldFBvaW50ID0gZnVuY3Rpb24gKHJlY3RhbmdsZSwgcG9zaXRpb24sIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gMSlcclxuICAgIHtcclxuICAgICAgICBvdXQueCA9IHJlY3RhbmdsZS54O1xyXG4gICAgICAgIG91dC55ID0gcmVjdGFuZ2xlLnk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHAgPSBQZXJpbWV0ZXIocmVjdGFuZ2xlKSAqIHBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA+IDAuNSlcclxuICAgIHtcclxuICAgICAgICBwIC09IChyZWN0YW5nbGUud2lkdGggKyByZWN0YW5nbGUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgaWYgKHAgPD0gcmVjdGFuZ2xlLndpZHRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEZhY2UgM1xyXG4gICAgICAgICAgICBvdXQueCA9IHJlY3RhbmdsZS5yaWdodCAtIHA7XHJcbiAgICAgICAgICAgIG91dC55ID0gcmVjdGFuZ2xlLmJvdHRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEZhY2UgNFxyXG4gICAgICAgICAgICBvdXQueCA9IHJlY3RhbmdsZS54O1xyXG4gICAgICAgICAgICBvdXQueSA9IHJlY3RhbmdsZS5ib3R0b20gLSAocCAtIHJlY3RhbmdsZS53aWR0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocCA8PSByZWN0YW5nbGUud2lkdGgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEZhY2UgMVxyXG4gICAgICAgIG91dC54ID0gcmVjdGFuZ2xlLnggKyBwO1xyXG4gICAgICAgIG91dC55ID0gcmVjdGFuZ2xlLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEZhY2UgMlxyXG4gICAgICAgIG91dC54ID0gcmVjdGFuZ2xlLnJpZ2h0O1xyXG4gICAgICAgIG91dC55ID0gcmVjdGFuZ2xlLnkgKyAocCAtIHJlY3RhbmdsZS53aWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG9pbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFBvaW50ID0gcmVxdWlyZSgnLi9HZXRQb2ludCcpO1xyXG52YXIgUGVyaW1ldGVyID0gcmVxdWlyZSgnLi9QZXJpbWV0ZXInKTtcclxuXHJcbi8vICBSZXR1cm4gYW4gYXJyYXkgb2YgcG9pbnRzIGZyb20gdGhlIHBlcmltZXRlciBvZiB0aGUgcmVjdGFuZ2xlXHJcbi8vICBlYWNoIHNwYWNlZCBvdXQgYmFzZWQgb24gdGhlIHF1YW50aXR5IG9yIHN0ZXAgcmVxdWlyZWRcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYW4gYXJyYXkgb2YgcG9pbnRzIGZyb20gdGhlIHBlcmltZXRlciBvZiB0aGUgcmVjdGFuZ2xlLCBlYWNoIHNwYWNlZCBvdXQgYmFzZWQgb24gdGhlIHF1YW50aXR5IG9yIHN0ZXAgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuR2V0UG9pbnRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3RhbmdsZSAtIFRoZSBSZWN0YW5nbGUgb2JqZWN0IHRvIGdldCB0aGUgcG9pbnRzIGZyb20uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIC0gU3RlcCBiZXR3ZWVuIHBvaW50cy4gVXNlZCB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gcmV0dXJuIHdoZW4gcXVhbnRpdHkgaXMgZmFsc2V5LiBJZ25vcmVkIGlmIHF1YW50aXR5IGlzIHBvc2l0aXZlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIG51bWJlciBvZiBldmVubHkgc3BhY2VkIHBvaW50cyBmcm9tIHRoZSByZWN0YW5nbGVzIHBlcmltZXRlciB0byByZXR1cm4uIElmIGZhbHNleSwgc3RlcCBwYXJhbSB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcG9pbnRzLlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gW291dF0gLSBBbiBvcHRpb25hbCBhcnJheSB0byBzdG9yZSB0aGUgcG9pbnRzIGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IEFuIGFycmF5IG9mIFBvaW50cyBmcm9tIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHJlY3RhbmdsZS5cclxuICovXHJcbnZhciBHZXRQb2ludHMgPSBmdW5jdGlvbiAocmVjdGFuZ2xlLCBxdWFudGl0eSwgc3RlcFJhdGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgLy8gIElmIHF1YW50aXR5IGlzIGEgZmFsc2V5IHZhbHVlIChmYWxzZSwgbnVsbCwgMCwgdW5kZWZpbmVkLCBldGMpIHRoZW4gd2UgY2FsY3VsYXRlIGl0IGJhc2VkIG9uIHRoZSBzdGVwUmF0ZSBpbnN0ZWFkLlxyXG4gICAgaWYgKCFxdWFudGl0eSAmJiBzdGVwUmF0ZSA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgcXVhbnRpdHkgPSBQZXJpbWV0ZXIocmVjdGFuZ2xlKSAvIHN0ZXBSYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBpIC8gcXVhbnRpdHk7XHJcblxyXG4gICAgICAgIG91dC5wdXNoKEdldFBvaW50KHJlY3RhbmdsZSwgcG9zaXRpb24pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRQb2ludHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgUmVjdGFuZ2xlLCBleHByZXNzZWQgYXMgYSBQb2ludCBvYmplY3QuXHJcbiAqIFdpdGggdGhlIHZhbHVlIG9mIHRoZSBgd2lkdGhgIGFzIHRoZSBgeGAgcHJvcGVydHkgYW5kIHRoZSBgaGVpZ2h0YCBhcyB0aGUgYHlgIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkdldFNpemVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGdldCB0aGUgc2l6ZSBmcm9tLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0XSAtIFRoZSBQb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIHNpemUgaW4uIElmIG5vdCBnaXZlbiwgYSBuZXcgUG9pbnQgaW5zdGFuY2UgaXMgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IEEgUG9pbnQgb2JqZWN0IHdoZXJlIGB4YCBob2xkcyB0aGUgd2lkdGggYW5kIGB5YCBob2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAqL1xyXG52YXIgR2V0U2l6ZSA9IGZ1bmN0aW9uIChyZWN0LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIG91dC54ID0gcmVjdC53aWR0aDtcclxuICAgIG91dC55ID0gcmVjdC5oZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0U2l6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2VudGVyT24gPSByZXF1aXJlKCcuL0NlbnRlck9uJyk7XHJcblxyXG5cclxuLyoqXHJcbiAqIEluY3JlYXNlcyB0aGUgc2l6ZSBvZiBhIFJlY3RhbmdsZSBieSBhIHNwZWNpZmllZCBhbW91bnQuXHJcbiAqXHJcbiAqIFRoZSBjZW50ZXIgb2YgdGhlIFJlY3RhbmdsZSBzdGF5cyB0aGUgc2FtZS4gVGhlIGFtb3VudHMgYXJlIGFkZGVkIHRvIGVhY2ggc2lkZSwgc28gdGhlIGFjdHVhbCBpbmNyZWFzZSBpbiB3aWR0aCBvciBoZWlnaHQgaXMgdHdvIHRpbWVzIGJpZ2dlciB0aGFuIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkluZmxhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbcmVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgdG8gaW5mbGF0ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBIb3cgbWFueSBwaXhlbHMgdGhlIGxlZnQgYW5kIHRoZSByaWdodCBzaWRlIHNob3VsZCBiZSBtb3ZlZCBieSBob3Jpem9udGFsbHkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gSG93IG1hbnkgcGl4ZWxzIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSBzaG91bGQgYmUgbW92ZWQgYnkgdmVydGljYWxseS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgaW5mbGF0ZWQgUmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIEluZmxhdGUgPSBmdW5jdGlvbiAocmVjdCwgeCwgeSlcclxue1xyXG4gICAgdmFyIGN4ID0gcmVjdC5jZW50ZXJYO1xyXG4gICAgdmFyIGN5ID0gcmVjdC5jZW50ZXJZO1xyXG5cclxuICAgIHJlY3Quc2V0U2l6ZShyZWN0LndpZHRoICsgKHggKiAyKSwgcmVjdC5oZWlnaHQgKyAoeSAqIDIpKTtcclxuXHJcbiAgICByZXR1cm4gQ2VudGVyT24ocmVjdCwgY3gsIGN5KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW5mbGF0ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi9SZWN0YW5nbGUnKTtcclxudmFyIEludGVyc2VjdHMgPSByZXF1aXJlKCcuLi9pbnRlcnNlY3RzL1JlY3RhbmdsZVRvUmVjdGFuZ2xlJyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgdHdvIFJlY3RhbmdsZXMgYW5kIGZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhleSBpbnRlcnNlY3QuXHJcbiAqIElmIHRoZXkgaW50ZXJzZWN0IGl0IHdpbGwgcmV0dXJuIHRoZSBhcmVhIG9mIGludGVyc2VjdGlvbiBpbiB0aGUgYG91dGAgUmVjdGFuZ2xlLlxyXG4gKiBJZiB0aGV5IGRvIG5vdCBpbnRlcnNlY3QsIHRoZSBgb3V0YCBSZWN0YW5nbGUgd2lsbCBoYXZlIGEgd2lkdGggYW5kIGhlaWdodCBvZiB6ZXJvLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLkludGVyc2VjdGlvblxyXG4gKiBAc2luY2UgMy4xMS4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbcmVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEEgLSBUaGUgZmlyc3QgUmVjdGFuZ2xlIHRvIGdldCB0aGUgaW50ZXJzZWN0aW9uIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0QiAtIFRoZSBzZWNvbmQgUmVjdGFuZ2xlIHRvIGdldCB0aGUgaW50ZXJzZWN0aW9uIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBbb3V0XSAtIEEgUmVjdGFuZ2xlIHRvIHN0b3JlIHRoZSBpbnRlcnNlY3Rpb24gcmVzdWx0cyBpbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgaW50ZXJzZWN0aW9uIHJlc3VsdC4gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHplcm8sIG5vIGludGVyc2VjdGlvbiBvY2N1cnJlZC5cclxuICovXHJcbnZhciBJbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUmVjdGFuZ2xlKCk7IH1cclxuXHJcbiAgICBpZiAoSW50ZXJzZWN0cyhyZWN0QSwgcmVjdEIpKVxyXG4gICAge1xyXG4gICAgICAgIG91dC54ID0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XHJcbiAgICAgICAgb3V0LnkgPSBNYXRoLm1heChyZWN0QS55LCByZWN0Qi55KTtcclxuICAgICAgICBvdXQud2lkdGggPSBNYXRoLm1pbihyZWN0QS5yaWdodCwgcmVjdEIucmlnaHQpIC0gb3V0Lng7XHJcbiAgICAgICAgb3V0LmhlaWdodCA9IE1hdGgubWluKHJlY3RBLmJvdHRvbSwgcmVjdEIuYm90dG9tKSAtIG91dC55O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIG91dC5zZXRFbXB0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyc2VjdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUGVyaW1ldGVyID0gcmVxdWlyZSgnLi9QZXJpbWV0ZXInKTtcclxudmFyIFBvaW50ID0gcmVxdWlyZSgnLi4vcG9pbnQvUG9pbnQnKTtcclxuXHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBwb2ludHMgZnJvbSB0aGUgcGVyaW1ldGVyIG9mIHRoZSBSZWN0YW5nbGUsIHdoZXJlIGVhY2ggcG9pbnQgaXMgc3BhY2VkIG91dCBiYXNlZFxyXG4gKiBvbiBlaXRoZXIgdGhlIGBzdGVwYCB2YWx1ZSwgb3IgdGhlIGBxdWFudGl0eWAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuTWFyY2hpbmdBbnRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGdldCB0aGUgcGVyaW1ldGVyIHBvaW50cyBmcm9tLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXBdIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBwb2ludCBvZiB0aGUgcGVyaW1ldGVyLiBTZXQgdG8gYG51bGxgIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgYHF1YW50aXR5YCBwYXJhbWV0ZXIgaW5zdGVhZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbcXVhbnRpdHldIC0gVGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgdG8gcmV0dXJuLiBUaGUgc3RlcCBpcyB0aGVuIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgUmVjdGFuZ2xlLCBkaXZpZGVkIGJ5IHRoaXMgdmFsdWUuXHJcbiAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBbb3V0XSAtIEFuIGFycmF5IGluIHdoaWNoIHRoZSBwZXJpbWV0ZXIgcG9pbnRzIHdpbGwgYmUgc3RvcmVkLiBJZiBub3QgZ2l2ZW4sIGEgbmV3IGFycmF5IGluc3RhbmNlIGlzIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcGVyaW1ldGVyIHBvaW50cyBmcm9tIHRoZSBSZWN0YW5nbGUuXHJcbiAqL1xyXG52YXIgTWFyY2hpbmdBbnRzID0gZnVuY3Rpb24gKHJlY3QsIHN0ZXAsIHF1YW50aXR5LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBbXTsgfVxyXG5cclxuICAgIGlmICghc3RlcCAmJiAhcXVhbnRpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEJhaWwgb3V0XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgSWYgc3RlcCBpcyBhIGZhbHNleSB2YWx1ZSAoZmFsc2UsIG51bGwsIDAsIHVuZGVmaW5lZCwgZXRjKSB0aGVuIHdlIGNhbGN1bGF0ZVxyXG4gICAgLy8gIGl0IGJhc2VkIG9uIHRoZSBxdWFudGl0eSBpbnN0ZWFkLCBvdGhlcndpc2Ugd2UgYWx3YXlzIHVzZSB0aGUgc3RlcCB2YWx1ZVxyXG4gICAgaWYgKCFzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIHN0ZXAgPSBQZXJpbWV0ZXIocmVjdCkgLyBxdWFudGl0eTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBxdWFudGl0eSA9IE1hdGgucm91bmQoUGVyaW1ldGVyKHJlY3QpIC8gc3RlcCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHggPSByZWN0Lng7XHJcbiAgICB2YXIgeSA9IHJlY3QueTtcclxuICAgIHZhciBmYWNlID0gMDtcclxuXHJcbiAgICAvLyAgTG9vcCBhY3Jvc3MgZWFjaCBmYWNlIG9mIHRoZSByZWN0YW5nbGVcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnB1c2gobmV3IFBvaW50KHgsIHkpKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChmYWNlKVxyXG4gICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgIC8vICBUb3AgZmFjZVxyXG4gICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICB4ICs9IHN0ZXA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHggPj0gcmVjdC5yaWdodClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB5ICs9ICh4IC0gcmVjdC5yaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgeCA9IHJlY3QucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIC8vICBSaWdodCBmYWNlXHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIHkgKz0gc3RlcDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoeSA+PSByZWN0LmJvdHRvbSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gMjtcclxuICAgICAgICAgICAgICAgICAgICB4IC09ICh5IC0gcmVjdC5ib3R0b20pO1xyXG4gICAgICAgICAgICAgICAgICAgIHkgPSByZWN0LmJvdHRvbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gIEJvdHRvbSBmYWNlXHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgIHggLT0gc3RlcDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoeCA8PSByZWN0LmxlZnQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgeSAtPSAocmVjdC5sZWZ0IC0geCk7XHJcbiAgICAgICAgICAgICAgICAgICAgeCA9IHJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gIExlZnQgZmFjZVxyXG4gICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICB5IC09IHN0ZXA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHkgPD0gcmVjdC50b3ApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgeSA9IHJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hcmNoaW5nQW50cztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTWVyZ2VzIGEgUmVjdGFuZ2xlIHdpdGggYSBsaXN0IG9mIHBvaW50cyBieSByZXBvc2l0aW9uaW5nIGFuZC9vciByZXNpemluZyBpdCBzdWNoIHRoYXQgYWxsIHBvaW50cyBhcmUgbG9jYXRlZCBvbiBvciB3aXRoaW4gaXRzIGJvdW5kcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5NZXJnZVBvaW50c1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFt0YXJnZXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHRhcmdldCAtIFRoZSBSZWN0YW5nbGUgd2hpY2ggc2hvdWxkIGJlIG1lcmdlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludFtdfSBwb2ludHMgLSBBbiBhcnJheSBvZiBQb2ludHMgKG9yIGFueSBvYmplY3Qgd2l0aCBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcykgd2hpY2ggc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBSZWN0YW5nbGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIG1vZGlmaWVkIFJlY3RhbmdsZS5cclxuICovXHJcbnZhciBNZXJnZVBvaW50cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHBvaW50cylcclxue1xyXG4gICAgdmFyIG1pblggPSB0YXJnZXQueDtcclxuICAgIHZhciBtYXhYID0gdGFyZ2V0LnJpZ2h0O1xyXG4gICAgdmFyIG1pblkgPSB0YXJnZXQueTtcclxuICAgIHZhciBtYXhZID0gdGFyZ2V0LmJvdHRvbTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcG9pbnRzW2ldLngpO1xyXG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwb2ludHNbaV0ueCk7XHJcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHBvaW50c1tpXS55KTtcclxuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcG9pbnRzW2ldLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRhcmdldC54ID0gbWluWDtcclxuICAgIHRhcmdldC55ID0gbWluWTtcclxuICAgIHRhcmdldC53aWR0aCA9IG1heFggLSBtaW5YO1xyXG4gICAgdGFyZ2V0LmhlaWdodCA9IG1heFkgLSBtaW5ZO1xyXG5cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lcmdlUG9pbnRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBNZXJnZXMgc291cmNlIHJlY3RhbmdsZSBpbnRvIHRhcmdldCByZWN0YW5nbGUgYW5kIHJldHVybnMgdGFyZ2V0XHJcbi8vICBOZWl0aGVyIHJlY3Qgc2hvdWxkIGhhdmUgbmVnYXRpdmUgd2lkdGhzIG9yIGhlaWdodHNcclxuXHJcbi8qKlxyXG4gKiBNZXJnZXMgdGhlIHNvdXJjZSByZWN0YW5nbGUgaW50byB0aGUgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgcmV0dXJucyB0aGUgdGFyZ2V0LlxyXG4gKiBOZWl0aGVyIHJlY3RhbmdsZSBzaG91bGQgaGF2ZSBhIG5lZ2F0aXZlIHdpZHRoIG9yIGhlaWdodC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5NZXJnZVJlY3RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbdGFyZ2V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSB0YXJnZXQgLSBUYXJnZXQgcmVjdGFuZ2xlLiBXaWxsIGJlIG1vZGlmaWVkIHRvIGluY2x1ZGUgc291cmNlIHJlY3RhbmdsZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHNvdXJjZSAtIFJlY3RhbmdsZSB0aGF0IHdpbGwgYmUgbWVyZ2VkIGludG8gdGFyZ2V0IHJlY3RhbmdsZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBNb2RpZmllZCB0YXJnZXQgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgc291cmNlIHJlY3RhbmdsZS5cclxuICovXHJcbnZhciBNZXJnZVJlY3QgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpXHJcbntcclxuICAgIHZhciBtaW5YID0gTWF0aC5taW4odGFyZ2V0LngsIHNvdXJjZS54KTtcclxuICAgIHZhciBtYXhYID0gTWF0aC5tYXgodGFyZ2V0LnJpZ2h0LCBzb3VyY2UucmlnaHQpO1xyXG5cclxuICAgIHRhcmdldC54ID0gbWluWDtcclxuICAgIHRhcmdldC53aWR0aCA9IG1heFggLSBtaW5YO1xyXG5cclxuICAgIHZhciBtaW5ZID0gTWF0aC5taW4odGFyZ2V0LnksIHNvdXJjZS55KTtcclxuICAgIHZhciBtYXhZID0gTWF0aC5tYXgodGFyZ2V0LmJvdHRvbSwgc291cmNlLmJvdHRvbSk7XHJcblxyXG4gICAgdGFyZ2V0LnkgPSBtaW5ZO1xyXG4gICAgdGFyZ2V0LmhlaWdodCA9IG1heFkgLSBtaW5ZO1xyXG5cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lcmdlUmVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTWVyZ2VzIGEgUmVjdGFuZ2xlIHdpdGggYSBwb2ludCBieSByZXBvc2l0aW9uaW5nIGFuZC9vciByZXNpemluZyBpdCBzbyB0aGF0IHRoZSBwb2ludCBpcyBvbiBvciB3aXRoaW4gaXRzIGJvdW5kcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5NZXJnZVhZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3RhcmdldCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gdGFyZ2V0IC0gVGhlIFJlY3RhbmdsZSB3aGljaCBzaG91bGQgYmUgbWVyZ2VkIGFuZCBtb2RpZmllZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGljaCBzaG91bGQgYmUgbWVyZ2VkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoaWNoIHNob3VsZCBiZSBtZXJnZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIG1vZGlmaWVkIGB0YXJnZXRgIFJlY3RhbmdsZS5cclxuICovXHJcbnZhciBNZXJnZVhZID0gZnVuY3Rpb24gKHRhcmdldCwgeCwgeSlcclxue1xyXG4gICAgdmFyIG1pblggPSBNYXRoLm1pbih0YXJnZXQueCwgeCk7XHJcbiAgICB2YXIgbWF4WCA9IE1hdGgubWF4KHRhcmdldC5yaWdodCwgeCk7XHJcblxyXG4gICAgdGFyZ2V0LnggPSBtaW5YO1xyXG4gICAgdGFyZ2V0LndpZHRoID0gbWF4WCAtIG1pblg7XHJcblxyXG4gICAgdmFyIG1pblkgPSBNYXRoLm1pbih0YXJnZXQueSwgeSk7XHJcbiAgICB2YXIgbWF4WSA9IE1hdGgubWF4KHRhcmdldC5ib3R0b20sIHkpO1xyXG5cclxuICAgIHRhcmdldC55ID0gbWluWTtcclxuICAgIHRhcmdldC5oZWlnaHQgPSBtYXhZIC0gbWluWTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNZXJnZVhZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBOdWRnZXMgKHRyYW5zbGF0ZXMpIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgYSBSZWN0YW5nbGUgYnkgYSBnaXZlbiBvZmZzZXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuT2Zmc2V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3JlY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgUmVjdGFuZ2xlIHRvIGFkanVzdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgZGlzdGFuY2UgdG8gbW92ZSB0aGUgUmVjdGFuZ2xlIGhvcml6b250YWxseS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZGlzdGFuY2UgdG8gbW92ZSB0aGUgUmVjdGFuZ2xlIHZlcnRpY2FsbHkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIGFkanVzdGVkIFJlY3RhbmdsZS5cclxuICovXHJcbnZhciBPZmZzZXQgPSBmdW5jdGlvbiAocmVjdCwgeCwgeSlcclxue1xyXG4gICAgcmVjdC54ICs9IHg7XHJcbiAgICByZWN0LnkgKz0geTtcclxuXHJcbiAgICByZXR1cm4gcmVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT2Zmc2V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBOdWRnZXMgKHRyYW5zbGF0ZXMpIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgYSBSZWN0YW5nbGUgYnkgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgKHRyYW5zbGF0aW9uIHZlY3RvcikuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuT2Zmc2V0UG9pbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IE8gLSBbcmVjdCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgdG8gYWRqdXN0LlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxQaGFzZXIuTWF0aC5WZWN0b3IyKX0gcG9pbnQgLSBUaGUgcG9pbnQgd2hvc2UgY29vcmRpbmF0ZXMgc2hvdWxkIGJlIHVzZWQgYXMgYW4gb2Zmc2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFRoZSBhZGp1c3RlZCBSZWN0YW5nbGUuXHJcbiAqL1xyXG52YXIgT2Zmc2V0UG9pbnQgPSBmdW5jdGlvbiAocmVjdCwgcG9pbnQpXHJcbntcclxuICAgIHJlY3QueCArPSBwb2ludC54O1xyXG4gICAgcmVjdC55ICs9IHBvaW50Lnk7XHJcblxyXG4gICAgcmV0dXJuIHJlY3Q7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE9mZnNldFBvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdHdvIFJlY3RhbmdsZXMgb3ZlcmxhcC4gSWYgYSBSZWN0YW5nbGUgaXMgd2l0aGluIGFub3RoZXIgUmVjdGFuZ2xlLCB0aGUgdHdvIHdpbGwgYmUgY29uc2lkZXJlZCBvdmVybGFwcGluZy4gVGh1cywgdGhlIFJlY3RhbmdsZXMgYXJlIHRyZWF0ZWQgYXMgXCJzb2xpZFwiLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLk92ZXJsYXBzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEEgLSBUaGUgZmlyc3QgUmVjdGFuZ2xlIHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdEIgLSBUaGUgc2Vjb25kIFJlY3RhbmdsZSB0byBjaGVjay5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gUmVjdGFuZ2xlcyBvdmVybGFwLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICovXHJcbnZhciBPdmVybGFwcyA9IGZ1bmN0aW9uIChyZWN0QSwgcmVjdEIpXHJcbntcclxuICAgIHJldHVybiAoXHJcbiAgICAgICAgcmVjdEEueCA8IHJlY3RCLnJpZ2h0ICYmXHJcbiAgICAgICAgcmVjdEEucmlnaHQgPiByZWN0Qi54ICYmXHJcbiAgICAgICAgcmVjdEEueSA8IHJlY3RCLmJvdHRvbSAmJlxyXG4gICAgICAgIHJlY3RBLmJvdHRvbSA+IHJlY3RCLnlcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE92ZXJsYXBzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBwZXJpbWV0ZXIgb2YgYSBSZWN0YW5nbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuUGVyaW1ldGVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgdG8gdXNlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwZXJpbWV0ZXIgb2YgdGhlIFJlY3RhbmdsZSwgZXF1YWwgdG8gYCh3aWR0aCAqIDIpICsgKGhlaWdodCAqIDIpYC5cclxuICovXHJcbnZhciBQZXJpbWV0ZXIgPSBmdW5jdGlvbiAocmVjdClcclxue1xyXG4gICAgcmV0dXJuIDIgKiAocmVjdC53aWR0aCArIHJlY3QuaGVpZ2h0KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGVyaW1ldGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcbnZhciBEZWdUb1JhZCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvRGVnVG9SYWQnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgUG9pbnQgZnJvbSB0aGUgcGVyaW1ldGVyIG9mIGEgUmVjdGFuZ2xlIGJhc2VkIG9uIHRoZSBnaXZlbiBhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5QZXJpbWV0ZXJQb2ludFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdGFuZ2xlIC0gVGhlIFJlY3RhbmdsZSB0byBnZXQgdGhlIHBlcmltZXRlciBwb2ludCBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIG9mIHRoZSBwb2ludCwgaW4gZGVncmVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gW291dF0gLSBUaGUgUG9pbnQgb2JqZWN0IHRvIHN0b3JlIHRoZSBwb3NpdGlvbiBpbi4gSWYgbm90IGdpdmVuLCBhIG5ldyBQb2ludCBpbnN0YW5jZSBpcyBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gQSBQb2ludCBvYmplY3QgaG9sZGluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIFJlY3RhbmdsZSBwZXJpbWV0ZXIuXHJcbiAqL1xyXG52YXIgUGVyaW1ldGVyUG9pbnQgPSBmdW5jdGlvbiAocmVjdGFuZ2xlLCBhbmdsZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICBhbmdsZSA9IERlZ1RvUmFkKGFuZ2xlKTtcclxuXHJcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcclxuICAgIHZhciBjID0gTWF0aC5jb3MoYW5nbGUpO1xyXG5cclxuICAgIHZhciBkeCA9IChjID4gMCkgPyByZWN0YW5nbGUud2lkdGggLyAyIDogcmVjdGFuZ2xlLndpZHRoIC8gLTI7XHJcbiAgICB2YXIgZHkgPSAocyA+IDApID8gcmVjdGFuZ2xlLmhlaWdodCAvIDIgOiByZWN0YW5nbGUuaGVpZ2h0IC8gLTI7XHJcblxyXG4gICAgaWYgKE1hdGguYWJzKGR4ICogcykgPCBNYXRoLmFicyhkeSAqIGMpKVxyXG4gICAge1xyXG4gICAgICAgIGR5ID0gKGR4ICogcykgLyBjO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGR4ID0gKGR5ICogYykgLyBzO1xyXG4gICAgfVxyXG5cclxuICAgIG91dC54ID0gZHggKyByZWN0YW5nbGUuY2VudGVyWDtcclxuICAgIG91dC55ID0gZHkgKyByZWN0YW5nbGUuY2VudGVyWTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQZXJpbWV0ZXJQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gcG9pbnQgd2l0aGluIGEgUmVjdGFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLlJhbmRvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBSZWN0YW5nbGUgdG8gcmV0dXJuIGEgcG9pbnQgZnJvbS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gb3V0IC0gVGhlIG9iamVjdCB0byB1cGRhdGUgd2l0aCB0aGUgcG9pbnQncyBjb29yZGluYXRlcy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IFRoZSBtb2RpZmllZCBgb3V0YCBvYmplY3QsIG9yIGEgbmV3IFBvaW50IGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxyXG4gKi9cclxudmFyIFJhbmRvbSA9IGZ1bmN0aW9uIChyZWN0LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIG91dC54ID0gcmVjdC54ICsgKE1hdGgucmFuZG9tKCkgKiByZWN0LndpZHRoKTtcclxuICAgIG91dC55ID0gcmVjdC55ICsgKE1hdGgucmFuZG9tKCkgKiByZWN0LmhlaWdodCk7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCZXR3ZWVuID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9CZXR3ZWVuJyk7XHJcbnZhciBDb250YWluc1JlY3QgPSByZXF1aXJlKCcuL0NvbnRhaW5zUmVjdCcpO1xyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYSByYW5kb20gcG9pbnQgdGhhdCBsaWVzIHdpdGhpbiB0aGUgYG91dGVyYCBSZWN0YW5nbGUsIGJ1dCBvdXRzaWRlIG9mIHRoZSBgaW5uZXJgIFJlY3RhbmdsZS5cclxuICogVGhlIGlubmVyIFJlY3RhbmdsZSBtdXN0IGJlIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIG91dGVyIHJlY3RhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5SYW5kb21PdXRzaWRlXHJcbiAqIEBzaW5jZSAzLjEwLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gb3V0ZXIgLSBUaGUgb3V0ZXIgUmVjdGFuZ2xlIHRvIGdldCB0aGUgcmFuZG9tIHBvaW50IHdpdGhpbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IGlubmVyIC0gVGhlIGlubmVyIFJlY3RhbmdsZSB0byBleGNsdWRlIGZyb20gdGhlIHJldHVybmVkIHBvaW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBbb3V0XSAtIEEgUG9pbnQsIG9yIFBvaW50LWxpa2Ugb2JqZWN0IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIG5vdCBzcGVjaWZpZWQsIGEgbmV3IFBvaW50IHdpbGwgYmUgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IEEgUG9pbnQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJhbmRvbSB2YWx1ZXMgaW4gaXRzIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMuXHJcbiAqL1xyXG52YXIgUmFuZG9tT3V0c2lkZSA9IGZ1bmN0aW9uIChvdXRlciwgaW5uZXIsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IG5ldyBQb2ludCgpOyB9XHJcblxyXG4gICAgaWYgKENvbnRhaW5zUmVjdChvdXRlciwgaW5uZXIpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBQaWNrIGEgcmFuZG9tIHF1YWRyYW50XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyAgVGhlIHF1YWRyYW50cyBkb24ndCBleHRlbmQgdGhlIGZ1bGwgd2lkdGhzIC8gaGVpZ2h0cyBvZiB0aGUgb3V0ZXIgcmVjdCB0byBnaXZlXHJcbiAgICAgICAgLy8gIHVzIGEgYmV0dGVyIHVuaWZvcm1lZCBkaXN0cmlidXRpb24sIG90aGVyd2lzZSB5b3UgZ2V0IGNsdW1waW5nIGluIHRoZSBjb3JuZXJzIHdoZXJlXHJcbiAgICAgICAgLy8gIHRoZSA0IHF1YWRzIHdvdWxkIG92ZXJsYXBcclxuXHJcbiAgICAgICAgc3dpdGNoIChCZXR3ZWVuKDAsIDMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSAwOiAvLyBUb3BcclxuICAgICAgICAgICAgICAgIG91dC54ID0gb3V0ZXIueCArIChNYXRoLnJhbmRvbSgpICogKGlubmVyLnJpZ2h0IC0gb3V0ZXIueCkpO1xyXG4gICAgICAgICAgICAgICAgb3V0LnkgPSBvdXRlci55ICsgKE1hdGgucmFuZG9tKCkgKiAoaW5uZXIudG9wIC0gb3V0ZXIueSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIDE6IC8vIEJvdHRvbVxyXG4gICAgICAgICAgICAgICAgb3V0LnggPSBpbm5lci54ICsgKE1hdGgucmFuZG9tKCkgKiAob3V0ZXIucmlnaHQgLSBpbm5lci54KSk7XHJcbiAgICAgICAgICAgICAgICBvdXQueSA9IGlubmVyLmJvdHRvbSArIChNYXRoLnJhbmRvbSgpICogKG91dGVyLmJvdHRvbSAtIGlubmVyLmJvdHRvbSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIDI6IC8vIExlZnRcclxuICAgICAgICAgICAgICAgIG91dC54ID0gb3V0ZXIueCArIChNYXRoLnJhbmRvbSgpICogKGlubmVyLnggLSBvdXRlci54KSk7XHJcbiAgICAgICAgICAgICAgICBvdXQueSA9IGlubmVyLnkgKyAoTWF0aC5yYW5kb20oKSAqIChvdXRlci5ib3R0b20gLSBpbm5lci55KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgMzogLy8gUmlnaHRcclxuICAgICAgICAgICAgICAgIG91dC54ID0gaW5uZXIucmlnaHQgKyAoTWF0aC5yYW5kb20oKSAqIChvdXRlci5yaWdodCAtIGlubmVyLnJpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICBvdXQueSA9IG91dGVyLnkgKyAoTWF0aC5yYW5kb20oKSAqIChpbm5lci5ib3R0b20gLSBvdXRlci55KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tT3V0c2lkZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29udGFpbnMgPSByZXF1aXJlKCcuL0NvbnRhaW5zJyk7XHJcbnZhciBHZXRQb2ludCA9IHJlcXVpcmUoJy4vR2V0UG9pbnQnKTtcclxudmFyIEdldFBvaW50cyA9IHJlcXVpcmUoJy4vR2V0UG9pbnRzJyk7XHJcbnZhciBHRU9NX0NPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIExpbmUgPSByZXF1aXJlKCcuLi9saW5lL0xpbmUnKTtcclxudmFyIFJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBFbmNhcHN1bGF0ZXMgYSAyRCByZWN0YW5nbGUgZGVmaW5lZCBieSBpdHMgY29ybmVyIHBvaW50IGluIHRoZSB0b3AtbGVmdCBhbmQgaXRzIGV4dGVuZHMgaW4geCAod2lkdGgpIGFuZCB5IChoZWlnaHQpXHJcbiAqXHJcbiAqIEBjbGFzcyBSZWN0YW5nbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5HZW9tXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTBdIC0gVGhlIHdpZHRoIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTBdIC0gVGhlIGhlaWdodCBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gKi9cclxudmFyIFJlY3RhbmdsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBSZWN0YW5nbGUgKHgsIHksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDA7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMDsgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ2VvbWV0cnkgY29uc3RhbnQgdHlwZSBvZiB0aGlzIG9iamVjdDogYEdFT01fQ09OU1QuUkVDVEFOR0xFYC5cclxuICAgICAgICAgKiBVc2VkIGZvciBmYXN0IHR5cGUgY29tcGFyaXNvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjdHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSBHRU9NX0NPTlNULlJFQ1RBTkdMRTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjeFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIFJlY3RhbmdsZSwgaS5lLiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBpdHMgbGVmdCBzaWRlIChkZWZpbmVkIGJ5IGB4YCkgYW5kIGl0cyByaWdodCBzaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI3dpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBSZWN0YW5nbGUsIGkuZS4gdGhlIGRpc3RhbmNlIGJldHdlZW4gaXRzIHRvcCBzaWRlIChkZWZpbmVkIGJ5IGB5YCkgYW5kIGl0cyBib3R0b20gc2lkZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBvaW50IGlzIGluc2lkZSB0aGUgUmVjdGFuZ2xlJ3MgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI2NvbnRhaW5zXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgUmVjdGFuZ2xlJ3MgYm91bmRzLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgY29udGFpbnM6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBDb250YWlucyh0aGlzLCB4LCB5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50IGF0IGEgY2VydGFpbiBgcG9zaXRpb25gIG9uIHRoZSBSZWN0YW5nbGUncyBwZXJpbWV0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBgcG9zaXRpb25gIGlzIGEgZnJhY3Rpb24gYmV0d2VlbiAwIGFuZCAxIHdoaWNoIGRlZmluZXMgaG93IGZhciBpbnRvIHRoZSBwZXJpbWV0ZXIgdGhlIHBvaW50IGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAgb3IgMSByZXR1cm5zIHRoZSBwb2ludCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUsIHdoaWxlIGEgdmFsdWUgb2YgMC41IHJldHVybnMgdGhlIHBvaW50IGF0IHRoZSBib3R0b20gcmlnaHQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuIFZhbHVlcyBiZXR3ZWVuIDAgYW5kIDAuNSBhcmUgb24gdGhlIHRvcCBvciB0aGUgcmlnaHQgc2lkZSBhbmQgdmFsdWVzIGJldHdlZW4gMC41IGFuZCAxIGFyZSBvbiB0aGUgYm90dG9tIG9yIHRoZSBsZWZ0IHNpZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjZ2V0UG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9zaXRpb24gLSBUaGUgbm9ybWFsaXplZCBkaXN0YW5jZSBpbnRvIHRoZSBSZWN0YW5nbGUncyBwZXJpbWV0ZXIgdG8gcmV0dXJuLlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gW291dHB1dF0gLSBBbiBvYmplY3QgdG8gdXBkYXRlIHdpdGggdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gVGhlIHVwZGF0ZWQgYG91dHB1dGAgb2JqZWN0LCBvciBhIG5ldyBQb2ludCBpZiBubyBgb3V0cHV0YCBvYmplY3Qgd2FzIGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludDogZnVuY3Rpb24gKHBvc2l0aW9uLCBvdXRwdXQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdldFBvaW50KHRoaXMsIHBvc2l0aW9uLCBvdXRwdXQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRzIGZyb20gdGhlIHBlcmltZXRlciBvZiB0aGUgUmVjdGFuZ2xlLCBlYWNoIHNwYWNlZCBvdXQgYmFzZWQgb24gdGhlIHF1YW50aXR5IG9yIHN0ZXAgcmVxdWlyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gVGhlIG51bWJlciBvZiBwb2ludHMgdG8gcmV0dXJuLiBTZXQgdG8gYGZhbHNlYCBvciAwIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBvaW50cyAoYHBlcmltZXRlciAvIHN0ZXBSYXRlYCkgZXZlbmx5IHNwYWNlZCBhcm91bmQgdGhlIFJlY3RhbmdsZSBiYXNlZCBvbiB0aGUgYHN0ZXBSYXRlYC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcFJhdGVdIC0gSWYgYHF1YW50aXR5YCBpcyAwLCBkZXRlcm1pbmVzIHRoZSBub3JtYWxpemVkIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByZXR1cm5lZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7KGFycmF5fFBoYXNlci5HZW9tLlBvaW50W10pfSBbb3V0cHV0XSAtIEFuIGFycmF5IHRvIHdoaWNoIHRvIGFwcGVuZCB0aGUgcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gVGhlIG1vZGlmaWVkIGBvdXRwdXRgIGFycmF5LCBvciBhIG5ldyBhcnJheSBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnRzOiBmdW5jdGlvbiAocXVhbnRpdHksIHN0ZXBSYXRlLCBvdXRwdXQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdldFBvaW50cyh0aGlzLCBxdWFudGl0eSwgc3RlcFJhdGUsIG91dHB1dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSBwb2ludCB3aXRoaW4gdGhlIFJlY3RhbmdsZSdzIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNnZXRSYW5kb21Qb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW3BvaW50LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5Qb2ludH0gW3BvaW50XSAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gVGhlIHVwZGF0ZWQgYHBvaW50YCwgb3IgYSBuZXcgUG9pbnQgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFJhbmRvbVBvaW50OiBmdW5jdGlvbiAocG9pbnQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFJhbmRvbSh0aGlzLCBwb2ludCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24sIHdpZHRoLCBhbmQgaGVpZ2h0IG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUmVjdGFuZ2xlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VG86IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IHg7XHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgcG9zaXRpb24sIHdpZHRoLCBhbmQgaGVpZ2h0IG9mIHRoZSBSZWN0YW5nbGUgdG8gMC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNzZXRFbXB0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRFbXB0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRUbygwLCAwLCAwLCAwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI3NldFBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBSZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0geDsgfVxyXG5cclxuICAgICAgICB0aGlzLnggPSB4O1xyXG4gICAgICAgIHRoaXMueSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIFJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggdG8gc2V0IHRoZSBSZWN0YW5nbGUgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD13aWR0aF0gLSBUaGUgaGVpZ2h0IHRvIHNldCB0aGUgUmVjdGFuZ2xlIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgUmVjdGFuZ2xlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHdpZHRoOyB9XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgUmVjdGFuZ2xlIGlzIGVtcHR5LiBBIFJlY3RhbmdsZSBpcyBlbXB0eSBpZiBpdHMgd2lkdGggb3IgaGVpZ2h0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI2lzRW1wdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgUmVjdGFuZ2xlIGlzIGVtcHR5LiBBIFJlY3RhbmdsZSBvYmplY3QgaXMgZW1wdHkgaWYgaXRzIHdpZHRoIG9yIGhlaWdodCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC5cclxuICAgICAqL1xyXG4gICAgaXNFbXB0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMud2lkdGggPD0gMCB8fCB0aGlzLmhlaWdodCA8PSAwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgTGluZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdG9wIG9mIHRoaXMgUmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI2dldExpbmVBXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtsaW5lLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBbbGluZV0gLSBBIExpbmUgb2JqZWN0IHRvIHNldCB0aGUgcmVzdWx0cyBpbi4gSWYgYHVuZGVmaW5lZGAgYSBuZXcgTGluZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdlb20uTGluZX0gQSBMaW5lIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0b3Agb2YgdGhpcyBSZWN0YW5nbGUuXHJcbiAgICAgKi9cclxuICAgIGdldExpbmVBOiBmdW5jdGlvbiAobGluZSlcclxuICAgIHtcclxuICAgICAgICBpZiAobGluZSA9PT0gdW5kZWZpbmVkKSB7IGxpbmUgPSBuZXcgTGluZSgpOyB9XHJcblxyXG4gICAgICAgIGxpbmUuc2V0VG8odGhpcy54LCB0aGlzLnksIHRoaXMucmlnaHQsIHRoaXMueSk7XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBMaW5lIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByaWdodCBvZiB0aGlzIFJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNnZXRMaW5lQlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gW2xpbmVdIC0gQSBMaW5lIG9iamVjdCB0byBzZXQgdGhlIHJlc3VsdHMgaW4uIElmIGB1bmRlZmluZWRgIGEgbmV3IExpbmUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IEEgTGluZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmlnaHQgb2YgdGhpcyBSZWN0YW5nbGUuXHJcbiAgICAgKi9cclxuICAgIGdldExpbmVCOiBmdW5jdGlvbiAobGluZSlcclxuICAgIHtcclxuICAgICAgICBpZiAobGluZSA9PT0gdW5kZWZpbmVkKSB7IGxpbmUgPSBuZXcgTGluZSgpOyB9XHJcblxyXG4gICAgICAgIGxpbmUuc2V0VG8odGhpcy5yaWdodCwgdGhpcy55LCB0aGlzLnJpZ2h0LCB0aGlzLmJvdHRvbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBMaW5lIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBib3R0b20gb2YgdGhpcyBSZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjZ2V0TGluZUNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5MaW5lfSBPIC0gW2xpbmUsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLkxpbmV9IFtsaW5lXSAtIEEgTGluZSBvYmplY3QgdG8gc2V0IHRoZSByZXN1bHRzIGluLiBJZiBgdW5kZWZpbmVkYCBhIG5ldyBMaW5lIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5MaW5lfSBBIExpbmUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIFJlY3RhbmdsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGluZUM6IGZ1bmN0aW9uIChsaW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHsgbGluZSA9IG5ldyBMaW5lKCk7IH1cclxuXHJcbiAgICAgICAgbGluZS5zZXRUbyh0aGlzLnJpZ2h0LCB0aGlzLmJvdHRvbSwgdGhpcy54LCB0aGlzLmJvdHRvbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBMaW5lIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsZWZ0IG9mIHRoaXMgUmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uUmVjdGFuZ2xlI2dldExpbmVEXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uTGluZX0gTyAtIFtsaW5lLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2VvbS5MaW5lfSBbbGluZV0gLSBBIExpbmUgb2JqZWN0IHRvIHNldCB0aGUgcmVzdWx0cyBpbi4gSWYgYHVuZGVmaW5lZGAgYSBuZXcgTGluZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdlb20uTGluZX0gQSBMaW5lIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsZWZ0IG9mIHRoaXMgUmVjdGFuZ2xlLlxyXG4gICAgICovXHJcbiAgICBnZXRMaW5lRDogZnVuY3Rpb24gKGxpbmUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGxpbmUgPT09IHVuZGVmaW5lZCkgeyBsaW5lID0gbmV3IExpbmUoKTsgfVxyXG5cclxuICAgICAgICBsaW5lLnNldFRvKHRoaXMueCwgdGhpcy5ib3R0b20sIHRoaXMueCwgdGhpcy55KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGVmdCBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICogQ2hhbmdpbmcgdGhlIGxlZnQgcHJvcGVydHkgb2YgYSBSZWN0YW5nbGUgb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIHkgYW5kIGhlaWdodCBwcm9wZXJ0aWVzLiBIb3dldmVyIGl0IGRvZXMgYWZmZWN0IHRoZSB3aWR0aCBwcm9wZXJ0eSwgd2hlcmVhcyBjaGFuZ2luZyB0aGUgeCB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHdpZHRoIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNsZWZ0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxlZnQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLnJpZ2h0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnJpZ2h0IC0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMueCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHN1bSBvZiB0aGUgeCBhbmQgd2lkdGggcHJvcGVydGllcy5cclxuICAgICAqIENoYW5naW5nIHRoZSByaWdodCBwcm9wZXJ0eSBvZiBhIFJlY3RhbmdsZSBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGUgeCwgeSBhbmQgaGVpZ2h0IHByb3BlcnRpZXMsIGhvd2V2ZXIgaXQgZG9lcyBhZmZlY3QgdGhlIHdpZHRoIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNyaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLngpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHZhbHVlIC0gdGhpcy54O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3Agb2YgdGhlIFJlY3RhbmdsZS4gQ2hhbmdpbmcgdGhlIHRvcCBwcm9wZXJ0eSBvZiBhIFJlY3RhbmdsZSBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGUgeCBhbmQgd2lkdGggcHJvcGVydGllcy5cclxuICAgICAqIEhvd2V2ZXIgaXQgZG9lcyBhZmZlY3QgdGhlIGhlaWdodCBwcm9wZXJ0eSwgd2hlcmVhcyBjaGFuZ2luZyB0aGUgeSB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGhlaWdodCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjdG9wXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRvcDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID49IHRoaXMuYm90dG9tKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9ICh0aGlzLmJvdHRvbSAtIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy55ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3VtIG9mIHRoZSB5IGFuZCBoZWlnaHQgcHJvcGVydGllcy5cclxuICAgICAqIENoYW5naW5nIHRoZSBib3R0b20gcHJvcGVydHkgb2YgYSBSZWN0YW5nbGUgb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIHgsIHkgYW5kIHdpZHRoIHByb3BlcnRpZXMsIGJ1dCBkb2VzIGNoYW5nZSB0aGUgaGVpZ2h0IHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNib3R0b21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm90dG9tOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgKyB0aGlzLmhlaWdodDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLnkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdmFsdWUgLSB0aGlzLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgUmVjdGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlJlY3RhbmdsZSNjZW50ZXJYXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNlbnRlclg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueCArICh0aGlzLndpZHRoIC8gMik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnggPSB2YWx1ZSAtICh0aGlzLndpZHRoIC8gMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIFJlY3RhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5SZWN0YW5nbGUjY2VudGVyWVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjZW50ZXJZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkgKyAodGhpcy5oZWlnaHQgLyAyKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHZhbHVlIC0gKHRoaXMuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgaWYgdGhlIHR3byBvYmplY3RzIChlaXRoZXIgUmVjdGFuZ2xlcyBvciBSZWN0YW5nbGUtbGlrZSkgaGF2ZSB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyB1bmRlciBzdHJpY3QgZXF1YWxpdHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5SZWN0YW5nbGUuU2FtZURpbWVuc2lvbnNcclxuICogQHNpbmNlIDMuMTUuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBmaXJzdCBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gdG9Db21wYXJlIC0gVGhlIHNlY29uZCBSZWN0YW5nbGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgaGF2ZSBlcXVpdmFsZW50IHZhbHVlcyBmb3IgdGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFNhbWVEaW1lbnNpb25zID0gZnVuY3Rpb24gKHJlY3QsIHRvQ29tcGFyZSlcclxue1xyXG4gICAgcmV0dXJuIChyZWN0LndpZHRoID09PSB0b0NvbXBhcmUud2lkdGggJiYgcmVjdC5oZWlnaHQgPT09IHRvQ29tcGFyZS5oZWlnaHQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTYW1lRGltZW5zaW9ucztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyBTY2FsZXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBSZWN0YW5nbGUgYnkgdGhlIGdpdmVuIGFtb3VudHMuXHJcblxyXG4vKipcclxuICogU2NhbGVzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgUmVjdGFuZ2xlIGJ5IHRoZSBnaXZlbiBhbW91bnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uUmVjdGFuZ2xlLlNjYWxlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBPIC0gW3JlY3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3QgLSBUaGUgYFJlY3RhbmdsZWAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzY2FsZWQgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQocykuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGZhY3RvciBieSB3aGljaCB0byBzY2FsZSB0aGUgcmVjdGFuZ2xlIGhvcml6b250YWxseS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSByZWN0YW5nbGUgdmVydGljYWxseS4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVjdGFuZ2xlIHdpbGwgYmUgc2NhbGVkIGJ5IHRoZSBmYWN0b3IgYHhgIGluIGJvdGggZGlyZWN0aW9ucy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBUaGUgcmVjdGFuZ2xlIG9iamVjdCB3aXRoIHVwZGF0ZWQgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIHNjYWxpbmcgZmFjdG9yKHMpLlxyXG4gKi9cclxudmFyIFNjYWxlID0gZnVuY3Rpb24gKHJlY3QsIHgsIHkpXHJcbntcclxuICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICByZWN0LndpZHRoICo9IHg7XHJcbiAgICByZWN0LmhlaWdodCAqPSB5O1xyXG5cclxuICAgIHJldHVybiByZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2FsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFJlY3RhbmdsZSBvciByZXBvc2l0aW9ucyBhbmQvb3IgcmVzaXplcyBhbiBleGlzdGluZyBSZWN0YW5nbGUgc28gdGhhdCBpdCBlbmNvbXBhc3NlcyB0aGUgdHdvIGdpdmVuIFJlY3RhbmdsZXMsIGkuZS4gY2FsY3VsYXRlcyB0aGVpciB1bmlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlJlY3RhbmdsZS5VbmlvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IHJlY3RBIC0gVGhlIGZpcnN0IFJlY3RhbmdsZSB0byB1c2UuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSByZWN0QiAtIFRoZSBzZWNvbmQgUmVjdGFuZ2xlIHRvIHVzZS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFtvdXRdIC0gVGhlIFJlY3RhbmdsZSB0byBzdG9yZSB0aGUgdW5pb24gaW4uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlJlY3RhbmdsZX0gVGhlIG1vZGlmaWVkIGBvdXRgIFJlY3RhbmdsZSwgb3IgYSBuZXcgUmVjdGFuZ2xlIGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxyXG4gKi9cclxudmFyIFVuaW9uID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgLy8gIENhY2hlIHZhcnMgc28gd2UgY2FuIHVzZSBvbmUgb2YgdGhlIGlucHV0IHJlY3RzIGFzIHRoZSBvdXRwdXQgcmVjdFxyXG4gICAgdmFyIHggPSBNYXRoLm1pbihyZWN0QS54LCByZWN0Qi54KTtcclxuICAgIHZhciB5ID0gTWF0aC5taW4ocmVjdEEueSwgcmVjdEIueSk7XHJcbiAgICB2YXIgdyA9IE1hdGgubWF4KHJlY3RBLnJpZ2h0LCByZWN0Qi5yaWdodCkgLSB4O1xyXG4gICAgdmFyIGggPSBNYXRoLm1heChyZWN0QS5ib3R0b20sIHJlY3RCLmJvdHRvbSkgLSB5O1xyXG5cclxuICAgIHJldHVybiBvdXQuc2V0VG8oeCwgeSwgdywgaCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFVuaW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuL1JlY3RhbmdsZScpO1xyXG5cclxuUmVjdGFuZ2xlLkFyZWEgPSByZXF1aXJlKCcuL0FyZWEnKTtcclxuUmVjdGFuZ2xlLkNlaWwgPSByZXF1aXJlKCcuL0NlaWwnKTtcclxuUmVjdGFuZ2xlLkNlaWxBbGwgPSByZXF1aXJlKCcuL0NlaWxBbGwnKTtcclxuUmVjdGFuZ2xlLkNlbnRlck9uID0gcmVxdWlyZSgnLi9DZW50ZXJPbicpO1xyXG5SZWN0YW5nbGUuQ2xvbmUgPSByZXF1aXJlKCcuL0Nsb25lJyk7XHJcblJlY3RhbmdsZS5Db250YWlucyA9IHJlcXVpcmUoJy4vQ29udGFpbnMnKTtcclxuUmVjdGFuZ2xlLkNvbnRhaW5zUG9pbnQgPSByZXF1aXJlKCcuL0NvbnRhaW5zUG9pbnQnKTtcclxuUmVjdGFuZ2xlLkNvbnRhaW5zUmVjdCA9IHJlcXVpcmUoJy4vQ29udGFpbnNSZWN0Jyk7XHJcblJlY3RhbmdsZS5Db3B5RnJvbSA9IHJlcXVpcmUoJy4vQ29weUZyb20nKTtcclxuUmVjdGFuZ2xlLkRlY29tcG9zZSA9IHJlcXVpcmUoJy4vRGVjb21wb3NlJyk7XHJcblJlY3RhbmdsZS5FcXVhbHMgPSByZXF1aXJlKCcuL0VxdWFscycpO1xyXG5SZWN0YW5nbGUuRml0SW5zaWRlID0gcmVxdWlyZSgnLi9GaXRJbnNpZGUnKTtcclxuUmVjdGFuZ2xlLkZpdE91dHNpZGUgPSByZXF1aXJlKCcuL0ZpdE91dHNpZGUnKTtcclxuUmVjdGFuZ2xlLkZsb29yID0gcmVxdWlyZSgnLi9GbG9vcicpO1xyXG5SZWN0YW5nbGUuRmxvb3JBbGwgPSByZXF1aXJlKCcuL0Zsb29yQWxsJyk7XHJcblJlY3RhbmdsZS5Gcm9tUG9pbnRzID0gcmVxdWlyZSgnLi9Gcm9tUG9pbnRzJyk7XHJcblJlY3RhbmdsZS5Gcm9tWFkgPSByZXF1aXJlKCcuL0Zyb21YWScpO1xyXG5SZWN0YW5nbGUuR2V0QXNwZWN0UmF0aW8gPSByZXF1aXJlKCcuL0dldEFzcGVjdFJhdGlvJyk7XHJcblJlY3RhbmdsZS5HZXRDZW50ZXIgPSByZXF1aXJlKCcuL0dldENlbnRlcicpO1xyXG5SZWN0YW5nbGUuR2V0UG9pbnQgPSByZXF1aXJlKCcuL0dldFBvaW50Jyk7XHJcblJlY3RhbmdsZS5HZXRQb2ludHMgPSByZXF1aXJlKCcuL0dldFBvaW50cycpO1xyXG5SZWN0YW5nbGUuR2V0U2l6ZSA9IHJlcXVpcmUoJy4vR2V0U2l6ZScpO1xyXG5SZWN0YW5nbGUuSW5mbGF0ZSA9IHJlcXVpcmUoJy4vSW5mbGF0ZScpO1xyXG5SZWN0YW5nbGUuSW50ZXJzZWN0aW9uID0gcmVxdWlyZSgnLi9JbnRlcnNlY3Rpb24nKTtcclxuUmVjdGFuZ2xlLk1hcmNoaW5nQW50cyA9IHJlcXVpcmUoJy4vTWFyY2hpbmdBbnRzJyk7XHJcblJlY3RhbmdsZS5NZXJnZVBvaW50cyA9IHJlcXVpcmUoJy4vTWVyZ2VQb2ludHMnKTtcclxuUmVjdGFuZ2xlLk1lcmdlUmVjdCA9IHJlcXVpcmUoJy4vTWVyZ2VSZWN0Jyk7XHJcblJlY3RhbmdsZS5NZXJnZVhZID0gcmVxdWlyZSgnLi9NZXJnZVhZJyk7XHJcblJlY3RhbmdsZS5PZmZzZXQgPSByZXF1aXJlKCcuL09mZnNldCcpO1xyXG5SZWN0YW5nbGUuT2Zmc2V0UG9pbnQgPSByZXF1aXJlKCcuL09mZnNldFBvaW50Jyk7XHJcblJlY3RhbmdsZS5PdmVybGFwcyA9IHJlcXVpcmUoJy4vT3ZlcmxhcHMnKTtcclxuUmVjdGFuZ2xlLlBlcmltZXRlciA9IHJlcXVpcmUoJy4vUGVyaW1ldGVyJyk7XHJcblJlY3RhbmdsZS5QZXJpbWV0ZXJQb2ludCA9IHJlcXVpcmUoJy4vUGVyaW1ldGVyUG9pbnQnKTtcclxuUmVjdGFuZ2xlLlJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblJlY3RhbmdsZS5SYW5kb21PdXRzaWRlID0gcmVxdWlyZSgnLi9SYW5kb21PdXRzaWRlJyk7XHJcblJlY3RhbmdsZS5TYW1lRGltZW5zaW9ucyA9IHJlcXVpcmUoJy4vU2FtZURpbWVuc2lvbnMnKTtcclxuUmVjdGFuZ2xlLlNjYWxlID0gcmVxdWlyZSgnLi9TY2FsZScpO1xyXG5SZWN0YW5nbGUuVW5pb24gPSByZXF1aXJlKCcuL1VuaW9uJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlY3RhbmdsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyBUaGUgMkQgYXJlYSBvZiBhIHRyaWFuZ2xlLiBUaGUgYXJlYSB2YWx1ZSBpcyBhbHdheXMgbm9uLW5lZ2F0aXZlLlxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFyZWEgb2YgYSBUcmlhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLkFyZWFcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIHVzZS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYXJlYSBvZiB0aGUgVHJpYW5nbGUsIGFsd2F5cyBub24tbmVnYXRpdmUuXHJcbiAqL1xyXG52YXIgQXJlYSA9IGZ1bmN0aW9uICh0cmlhbmdsZSlcclxue1xyXG4gICAgdmFyIHgxID0gdHJpYW5nbGUueDE7XHJcbiAgICB2YXIgeTEgPSB0cmlhbmdsZS55MTtcclxuXHJcbiAgICB2YXIgeDIgPSB0cmlhbmdsZS54MjtcclxuICAgIHZhciB5MiA9IHRyaWFuZ2xlLnkyO1xyXG5cclxuICAgIHZhciB4MyA9IHRyaWFuZ2xlLngzO1xyXG4gICAgdmFyIHkzID0gdHJpYW5nbGUueTM7XHJcblxyXG4gICAgcmV0dXJuIE1hdGguYWJzKCgoeDMgLSB4MSkgKiAoeTIgLSB5MSkgLSAoeDIgLSB4MSkgKiAoeTMgLSB5MSkpIC8gMik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyZWE7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRyaWFuZ2xlID0gcmVxdWlyZSgnLi9UcmlhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhbiBlcXVpbGF0ZXJhbCB0cmlhbmdsZS4gSW4gdGhlIGVxdWlsYXRlcmFsIHRyaWFuZ2xlLCBhbGwgdGhlIHNpZGVzIGFyZSB0aGUgc2FtZSBsZW5ndGggKGNvbmdydWVudCkgYW5kIGFsbCB0aGUgYW5nbGVzIGFyZSB0aGUgc2FtZSBzaXplIChjb25ncnVlbnQpLlxyXG4gKiBUaGUgeC95IHNwZWNpZmllcyB0aGUgdG9wLW1pZGRsZSBvZiB0aGUgdHJpYW5nbGUgKHgxL3kxKSBhbmQgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgZWFjaCBzaWRlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuQnVpbGRFcXVpbGF0ZXJhbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBwb2ludCBvZiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0geSBjb29yZGluYXRlIG9mIHRoZSB0b3AgcG9pbnQgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gTGVuZ3RoIG9mIGVhY2ggc2lkZSBvZiB0aGUgdHJpYW5nbGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSBUaGUgVHJpYW5nbGUgb2JqZWN0IG9mIHRoZSBnaXZlbiBzaXplLlxyXG4gKi9cclxudmFyIEJ1aWxkRXF1aWxhdGVyYWwgPSBmdW5jdGlvbiAoeCwgeSwgbGVuZ3RoKVxyXG57XHJcbiAgICB2YXIgaGVpZ2h0ID0gbGVuZ3RoICogKE1hdGguc3FydCgzKSAvIDIpO1xyXG5cclxuICAgIHZhciB4MSA9IHg7XHJcbiAgICB2YXIgeTEgPSB5O1xyXG5cclxuICAgIHZhciB4MiA9IHggKyAobGVuZ3RoIC8gMik7XHJcbiAgICB2YXIgeTIgPSB5ICsgaGVpZ2h0O1xyXG5cclxuICAgIHZhciB4MyA9IHggLSAobGVuZ3RoIC8gMik7XHJcbiAgICB2YXIgeTMgPSB5ICsgaGVpZ2h0O1xyXG5cclxuICAgIHJldHVybiBuZXcgVHJpYW5nbGUoeDEsIHkxLCB4MiwgeTIsIHgzLCB5Myk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJ1aWxkRXF1aWxhdGVyYWw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEVhckN1dCA9IHJlcXVpcmUoJy4uL3BvbHlnb24vRWFyY3V0Jyk7XHJcbnZhciBUcmlhbmdsZSA9IHJlcXVpcmUoJy4vVHJpYW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhbiBhcnJheSBvZiB2ZXJ0ZXggY29vcmRpbmF0ZXMsIGFuZCBvcHRpb25hbGx5IGFuIGFycmF5IG9mIGhvbGUgaW5kaWNlcywgdGhlbiByZXR1cm5zIGFuIGFycmF5XHJcbiAqIG9mIFRyaWFuZ2xlIGluc3RhbmNlcywgd2hlcmUgdGhlIGdpdmVuIHZlcnRpY2VzIGhhdmUgYmVlbiBkZWNvbXBvc2VkIGludG8gYSBzZXJpZXMgb2YgdHJpYW5nbGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuQnVpbGRGcm9tUG9seWdvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlRyaWFuZ2xlW119IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGRhdGEgLSBBIGZsYXQgYXJyYXkgb2YgdmVydGV4IGNvb3JkaW5hdGVzIGxpa2UgW3gwLHkwLCB4MSx5MSwgeDIseTIsIC4uLl1cclxuICogQHBhcmFtIHthcnJheX0gW2hvbGVzPW51bGxdIC0gQW4gYXJyYXkgb2YgaG9sZSBpbmRpY2VzIGlmIGFueSAoZS5nLiBbNSwgOF0gZm9yIGEgMTItdmVydGV4IGlucHV0IHdvdWxkIG1lYW4gb25lIGhvbGUgd2l0aCB2ZXJ0aWNlcyA14oCTNyBhbmQgYW5vdGhlciB3aXRoIDjigJMxMSkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGVYPTFdIC0gSG9yaXpvbnRhbCBzY2FsZSBmYWN0b3IgdG8gbXVsdGlwbHkgdGhlIHJlc3VsdGluZyBwb2ludHMgYnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGVZPTFdIC0gVmVydGljYWwgc2NhbGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSByZXN1bHRpbmcgcG9pbnRzIGJ5LlxyXG4gKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5UcmlhbmdsZVtdKX0gW291dF0gLSBBbiBhcnJheSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIFRyaWFuZ2xlIGluc3RhbmNlcyBpbi4gSWYgbm90IHByb3ZpZGVkLCBhIG5ldyBhcnJheSBpcyBjcmVhdGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdlb20uVHJpYW5nbGVbXSl9IEFuIGFycmF5IG9mIFRyaWFuZ2xlIGluc3RhbmNlcywgd2hlcmUgZWFjaCB0cmlhbmdsZSBpcyBiYXNlZCBvbiB0aGUgZGVjb21wb3NlZCB2ZXJ0aWNlcyBkYXRhLlxyXG4gKi9cclxudmFyIEJ1aWxkRnJvbVBvbHlnb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZXMsIHNjYWxlWCwgc2NhbGVZLCBvdXQpXHJcbntcclxuICAgIGlmIChob2xlcyA9PT0gdW5kZWZpbmVkKSB7IGhvbGVzID0gbnVsbDsgfVxyXG4gICAgaWYgKHNjYWxlWCA9PT0gdW5kZWZpbmVkKSB7IHNjYWxlWCA9IDE7IH1cclxuICAgIGlmIChzY2FsZVkgPT09IHVuZGVmaW5lZCkgeyBzY2FsZVkgPSAxOyB9XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICB2YXIgdHJpcyA9IEVhckN1dChkYXRhLCBob2xlcyk7XHJcblxyXG4gICAgdmFyIGE7XHJcbiAgICB2YXIgYjtcclxuICAgIHZhciBjO1xyXG5cclxuICAgIHZhciB4MTtcclxuICAgIHZhciB5MTtcclxuXHJcbiAgICB2YXIgeDI7XHJcbiAgICB2YXIgeTI7XHJcblxyXG4gICAgdmFyIHgzO1xyXG4gICAgdmFyIHkzO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJpcy5sZW5ndGg7IGkgKz0gMylcclxuICAgIHtcclxuICAgICAgICBhID0gdHJpc1tpXTtcclxuICAgICAgICBiID0gdHJpc1tpICsgMV07XHJcbiAgICAgICAgYyA9IHRyaXNbaSArIDJdO1xyXG5cclxuICAgICAgICB4MSA9IGRhdGFbYSAqIDJdICogc2NhbGVYO1xyXG4gICAgICAgIHkxID0gZGF0YVsoYSAqIDIpICsgMV0gKiBzY2FsZVk7XHJcblxyXG4gICAgICAgIHgyID0gZGF0YVtiICogMl0gKiBzY2FsZVg7XHJcbiAgICAgICAgeTIgPSBkYXRhWyhiICogMikgKyAxXSAqIHNjYWxlWTtcclxuXHJcbiAgICAgICAgeDMgPSBkYXRhW2MgKiAyXSAqIHNjYWxlWDtcclxuICAgICAgICB5MyA9IGRhdGFbKGMgKiAyKSArIDFdICogc2NhbGVZO1xyXG5cclxuICAgICAgICBvdXQucHVzaChuZXcgVHJpYW5nbGUoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJ1aWxkRnJvbVBvbHlnb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRyaWFuZ2xlID0gcmVxdWlyZSgnLi9UcmlhbmdsZScpO1xyXG5cclxuLy8gIEJ1aWxkcyBhIHJpZ2h0IHRyaWFuZ2xlLCB3aXRoIG9uZSA5MCBkZWdyZWUgYW5nbGUgYW5kIHR3byBhY3V0ZSBhbmdsZXNcclxuLy8gIFRoZSB4L3kgaXMgdGhlIGNvb3JkaW5hdGUgb2YgdGhlIDkwIGRlZ3JlZSBhbmdsZSAoYW5kIHdpbGwgbWFwIHRvIHgxL3kxIGluIHRoZSByZXN1bHRpbmcgVHJpYW5nbGUpXHJcbi8vICB3L2ggY2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGFuZCByZXByZXNlbnQgdGhlIGxlbmd0aCBvZiBlYWNoIHNpZGVcclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSByaWdodCB0cmlhbmdsZSwgaS5lLiBvbmUgd2hpY2ggaGFzIGEgOTAtZGVncmVlIGFuZ2xlIGFuZCB0d28gYWN1dGUgYW5nbGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuQnVpbGRSaWdodFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSByaWdodCBhbmdsZSwgd2hpY2ggd2lsbCBhbHNvIGJlIHRoZSBmaXJzdCBYIGNvb3JkaW5hdGUgb2YgdGhlIGNvbnN0cnVjdGVkIFRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0IGFuZ2xlLCB3aGljaCB3aWxsIGFsc28gYmUgdGhlIGZpcnN0IFkgY29vcmRpbmF0ZSBvZiB0aGUgY29uc3RydWN0ZWQgVHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBsZW5ndGggb2YgdGhlIHNpZGUgd2hpY2ggaXMgdG8gdGhlIGxlZnQgb3IgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodCBhbmdsZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBsZW5ndGggb2YgdGhlIHNpZGUgd2hpY2ggaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHJpZ2h0IGFuZ2xlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gVGhlIGNvbnN0cnVjdGVkIHJpZ2h0IFRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIEJ1aWxkUmlnaHQgPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxue1xyXG4gICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHdpZHRoOyB9XHJcblxyXG4gICAgLy8gIDkwIGRlZ3JlZSBhbmdsZVxyXG4gICAgdmFyIHgxID0geDtcclxuICAgIHZhciB5MSA9IHk7XHJcblxyXG4gICAgdmFyIHgyID0geDtcclxuICAgIHZhciB5MiA9IHkgLSBoZWlnaHQ7XHJcblxyXG4gICAgdmFyIHgzID0geCArIHdpZHRoO1xyXG4gICAgdmFyIHkzID0geTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFRyaWFuZ2xlKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCdWlsZFJpZ2h0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDZW50cm9pZCA9IHJlcXVpcmUoJy4vQ2VudHJvaWQnKTtcclxudmFyIE9mZnNldCA9IHJlcXVpcmUoJy4vT2Zmc2V0Jyk7XHJcblxyXG4vKipcclxuICogQGNhbGxiYWNrIENlbnRlckZ1bmN0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIHJldHVybiB0aGUgY2VudGVyIGNvb3JkaW5hdGVzIG9mLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgY2VudGVyIHBvaW50IG9mIHRoZSBUcmlhbmdsZSBhY2NvcmRpbmcgdG8gdGhlIGZ1bmN0aW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQb3NpdGlvbnMgdGhlIFRyaWFuZ2xlIHNvIHRoYXQgaXQgaXMgY2VudGVyZWQgb24gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuQ2VudGVyT25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gTyAtIFt0cmlhbmdsZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0byBiZSBwb3NpdGlvbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdG8gY2VudGVyIG9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIGNlbnRlciBvbi5cclxuICogQHBhcmFtIHtDZW50ZXJGdW5jdGlvbn0gW2NlbnRlckZ1bmNdIC0gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY2VudGVyIHRoZSB0cmlhbmdsZS4gRGVmYXVsdHMgdG8gQ2VudHJvaWQgY2VudGVyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gVGhlIFRyaWFuZ2xlIHRoYXQgd2FzIGNlbnRlcmVkLlxyXG4gKi9cclxudmFyIENlbnRlck9uID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCB4LCB5LCBjZW50ZXJGdW5jKVxyXG57XHJcbiAgICBpZiAoY2VudGVyRnVuYyA9PT0gdW5kZWZpbmVkKSB7IGNlbnRlckZ1bmMgPSBDZW50cm9pZDsgfVxyXG5cclxuICAgIC8vICBHZXQgdGhlIGNlbnRlciBvZiB0aGUgdHJpYW5nbGVcclxuICAgIHZhciBjZW50ZXIgPSBjZW50ZXJGdW5jKHRyaWFuZ2xlKTtcclxuXHJcbiAgICAvLyAgRGlmZmVyZW5jZVxyXG4gICAgdmFyIGRpZmZYID0geCAtIGNlbnRlci54O1xyXG4gICAgdmFyIGRpZmZZID0geSAtIGNlbnRlci55O1xyXG5cclxuICAgIHJldHVybiBPZmZzZXQodHJpYW5nbGUsIGRpZmZYLCBkaWZmWSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENlbnRlck9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vLyAgVGhlIHRocmVlIG1lZGlhbnMgKHRoZSBsaW5lcyBkcmF3biBmcm9tIHRoZSB2ZXJ0aWNlcyB0byB0aGUgYmlzZWN0b3JzIG9mIHRoZSBvcHBvc2l0ZSBzaWRlcylcclxuLy8gIG1lZXQgaW4gdGhlIGNlbnRyb2lkIG9yIGNlbnRlciBvZiBtYXNzIChjZW50ZXIgb2YgZ3Jhdml0eSkuXHJcbi8vICBUaGUgY2VudHJvaWQgZGl2aWRlcyBlYWNoIG1lZGlhbiBpbiBhIHJhdGlvIG9mIDI6MVxyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIGEgVHJpYW5nbGUncyBjZW50cm9pZCwgd2hpY2ggaXMgYWxzbyBpdHMgY2VudGVyIG9mIG1hc3MgKGNlbnRlciBvZiBncmF2aXR5KS5cclxuICpcclxuICogVGhlIGNlbnRyb2lkIGlzIHRoZSBwb2ludCBpbiBhIFRyaWFuZ2xlIGF0IHdoaWNoIGl0cyB0aHJlZSBtZWRpYW5zICh0aGUgbGluZXMgZHJhd24gZnJvbSB0aGUgdmVydGljZXMgdG8gdGhlIGJpc2VjdG9ycyBvZiB0aGUgb3Bwb3NpdGUgc2lkZXMpIG1lZXQuIEl0IGRpdmlkZXMgZWFjaCBvbmUgaW4gYSAyOjEgcmF0aW8uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5DZW50cm9pZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byB1c2UuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb2JqZWN0IHRvIHN0b3JlIHRoZSBjb29yZGluYXRlcyBpbi5cclxuICpcclxuICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFRoZSBgb3V0YCBvYmplY3Qgd2l0aCBtb2RpZmllZCBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLCBvciBhIG5ldyBQb2ludCBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICovXHJcbnZhciBDZW50cm9pZCA9IGZ1bmN0aW9uICh0cmlhbmdsZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICBvdXQueCA9ICh0cmlhbmdsZS54MSArIHRyaWFuZ2xlLngyICsgdHJpYW5nbGUueDMpIC8gMztcclxuICAgIG91dC55ID0gKHRyaWFuZ2xlLnkxICsgdHJpYW5nbGUueTIgKyB0cmlhbmdsZS55MykgLyAzO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENlbnRyb2lkO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vLyAgQWRhcHRlZCBmcm9tIGh0dHA6Ly9iam9ybmhhcnJ0ZWxsLmdpdGh1Yi5pby9qc3RzL2RvYy9hcGkvanN0c19nZW9tX1RyaWFuZ2xlLmpzLmh0bWxcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSAyeDIgbWF0cml4LiBVc2VzIHN0YW5kYXJkIGRvdWJsZS1wcmVjaXNpb24gYXJpdGhtZXRpYywgc28gaXMgc3VzY2VwdGlibGUgdG8gcm91bmQtb2ZmIGVycm9yLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gZGV0XHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbTAwIC0gVGhlIFswLDBdIGVudHJ5IG9mIHRoZSBtYXRyaXguXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtMDEgLSBUaGUgWzAsMV0gZW50cnkgb2YgdGhlIG1hdHJpeC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG0xMCAtIFRoZSBbMSwwXSBlbnRyeSBvZiB0aGUgbWF0cml4LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbTExIC0gVGhlIFsxLDFdIGVudHJ5IG9mIHRoZSBtYXRyaXguXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGRldGVybWluYW50LlxyXG4gKi9cclxuZnVuY3Rpb24gZGV0IChtMDAsIG0wMSwgbTEwLCBtMTEpXHJcbntcclxuICAgIHJldHVybiAobTAwICogbTExKSAtIChtMDEgKiBtMTApO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgdGhlIGNpcmN1bWNlbnRyZSBvZiBhIHRyaWFuZ2xlLiBUaGUgY2lyY3VtY2VudHJlIGlzIHRoZSBjZW50cmUgb2ZcclxuICogdGhlIGNpcmN1bWNpcmNsZSwgdGhlIHNtYWxsZXN0IGNpcmNsZSB3aGljaCBlbmNsb3NlcyB0aGUgdHJpYW5nbGUuIEl0IGlzIGFsc29cclxuICogdGhlIGNvbW1vbiBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgdGhlIHBlcnBlbmRpY3VsYXIgYmlzZWN0b3JzIG9mIHRoZSBzaWRlcyBvZlxyXG4gKiB0aGUgdHJpYW5nbGUsIGFuZCBpcyB0aGUgb25seSBwb2ludCB3aGljaCBoYXMgZXF1YWwgZGlzdGFuY2UgdG8gYWxsIHRocmVlXHJcbiAqIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLkNpcmN1bUNlbnRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5NYXRoLlZlY3RvcjJ9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIGdldCB0aGUgY2lyY3VtY2VudGVyIG9mLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtvdXRdIC0gVGhlIFZlY3RvcjIgb2JqZWN0IHRvIHN0b3JlIHRoZSBwb3NpdGlvbiBpbi4gSWYgbm90IGdpdmVuLCBhIG5ldyBWZWN0b3IyIGluc3RhbmNlIGlzIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IEEgVmVjdG9yMiBvYmplY3QgaG9sZGluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNpcmN1bWNlbnRlciBvZiB0aGUgVHJpYW5nbGUuXHJcbiAqL1xyXG52YXIgQ2lyY3VtQ2VudGVyID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgdmFyIGN4ID0gdHJpYW5nbGUueDM7XHJcbiAgICB2YXIgY3kgPSB0cmlhbmdsZS55MztcclxuXHJcbiAgICB2YXIgYXggPSB0cmlhbmdsZS54MSAtIGN4O1xyXG4gICAgdmFyIGF5ID0gdHJpYW5nbGUueTEgLSBjeTtcclxuXHJcbiAgICB2YXIgYnggPSB0cmlhbmdsZS54MiAtIGN4O1xyXG4gICAgdmFyIGJ5ID0gdHJpYW5nbGUueTIgLSBjeTtcclxuXHJcbiAgICB2YXIgZGVub20gPSAyICogZGV0KGF4LCBheSwgYngsIGJ5KTtcclxuICAgIHZhciBudW14ID0gZGV0KGF5LCBheCAqIGF4ICsgYXkgKiBheSwgYnksIGJ4ICogYnggKyBieSAqIGJ5KTtcclxuICAgIHZhciBudW15ID0gZGV0KGF4LCBheCAqIGF4ICsgYXkgKiBheSwgYngsIGJ4ICogYnggKyBieSAqIGJ5KTtcclxuXHJcbiAgICBvdXQueCA9IGN4IC0gbnVteCAvIGRlbm9tO1xyXG4gICAgb3V0LnkgPSBjeSArIG51bXkgLyBkZW5vbTtcclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDaXJjdW1DZW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENpcmNsZSA9IHJlcXVpcmUoJy4uL2NpcmNsZS9DaXJjbGUnKTtcclxuXHJcbi8vICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbXV0b28vNTYxNzY5MVxyXG5cclxuLyoqXHJcbiAqIEZpbmRzIHRoZSBjaXJjdW1zY3JpYmVkIGNpcmNsZSAoY2lyY3VtY2lyY2xlKSBvZiBhIFRyaWFuZ2xlIG9iamVjdC4gVGhlIGNpcmN1bWNpcmNsZSBpcyB0aGUgY2lyY2xlIHdoaWNoIHRvdWNoZXMgYWxsIG9mIHRoZSB0cmlhbmdsZSdzIHZlcnRpY2VzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuQ2lyY3VtQ2lyY2xlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uQ2lyY2xlfSBPIC0gW291dCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byB1c2UgYXMgaW5wdXQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uQ2lyY2xlfSBbb3V0XSAtIEFuIG9wdGlvbmFsIENpcmNsZSB0byBzdG9yZSB0aGUgcmVzdWx0IGluLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5DaXJjbGV9IFRoZSB1cGRhdGVkIGBvdXRgIENpcmNsZSwgb3IgYSBuZXcgQ2lyY2xlIGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxyXG4gKi9cclxudmFyIENpcmN1bUNpcmNsZSA9IGZ1bmN0aW9uICh0cmlhbmdsZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IENpcmNsZSgpOyB9XHJcblxyXG4gICAgLy8gIEFcclxuICAgIHZhciB4MSA9IHRyaWFuZ2xlLngxO1xyXG4gICAgdmFyIHkxID0gdHJpYW5nbGUueTE7XHJcblxyXG4gICAgLy8gIEJcclxuICAgIHZhciB4MiA9IHRyaWFuZ2xlLngyO1xyXG4gICAgdmFyIHkyID0gdHJpYW5nbGUueTI7XHJcblxyXG4gICAgLy8gIENcclxuICAgIHZhciB4MyA9IHRyaWFuZ2xlLngzO1xyXG4gICAgdmFyIHkzID0gdHJpYW5nbGUueTM7XHJcblxyXG4gICAgdmFyIEEgPSB4MiAtIHgxO1xyXG4gICAgdmFyIEIgPSB5MiAtIHkxO1xyXG4gICAgdmFyIEMgPSB4MyAtIHgxO1xyXG4gICAgdmFyIEQgPSB5MyAtIHkxO1xyXG4gICAgdmFyIEUgPSBBICogKHgxICsgeDIpICsgQiAqICh5MSArIHkyKTtcclxuICAgIHZhciBGID0gQyAqICh4MSArIHgzKSArIEQgKiAoeTEgKyB5Myk7XHJcbiAgICB2YXIgRyA9IDIgKiAoQSAqICh5MyAtIHkyKSAtIEIgKiAoeDMgLSB4MikpO1xyXG5cclxuICAgIHZhciBkeDtcclxuICAgIHZhciBkeTtcclxuXHJcbiAgICAvLyAgSWYgdGhlIHBvaW50cyBvZiB0aGUgdHJpYW5nbGUgYXJlIGNvbGxpbmVhciwgdGhlbiBqdXN0IGZpbmQgdGhlXHJcbiAgICAvLyAgZXh0cmVtZXMgYW5kIHVzZSB0aGUgbWlkcG9pbnQgYXMgdGhlIGNlbnRlciBvZiB0aGUgY2lyY3VtY2lyY2xlLlxyXG5cclxuICAgIGlmIChNYXRoLmFicyhHKSA8IDAuMDAwMDAxKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtaW5YID0gTWF0aC5taW4oeDEsIHgyLCB4Myk7XHJcbiAgICAgICAgdmFyIG1pblkgPSBNYXRoLm1pbih5MSwgeTIsIHkzKTtcclxuICAgICAgICBkeCA9IChNYXRoLm1heCh4MSwgeDIsIHgzKSAtIG1pblgpICogMC41O1xyXG4gICAgICAgIGR5ID0gKE1hdGgubWF4KHkxLCB5MiwgeTMpIC0gbWluWSkgKiAwLjU7XHJcblxyXG4gICAgICAgIG91dC54ID0gbWluWCArIGR4O1xyXG4gICAgICAgIG91dC55ID0gbWluWSArIGR5O1xyXG4gICAgICAgIG91dC5yYWRpdXMgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIG91dC54ID0gKEQgKiBFIC0gQiAqIEYpIC8gRztcclxuICAgICAgICBvdXQueSA9IChBICogRiAtIEMgKiBFKSAvIEc7XHJcbiAgICAgICAgZHggPSBvdXQueCAtIHgxO1xyXG4gICAgICAgIGR5ID0gb3V0LnkgLSB5MTtcclxuICAgICAgICBvdXQucmFkaXVzID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDaXJjdW1DaXJjbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRyaWFuZ2xlID0gcmVxdWlyZSgnLi9UcmlhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIENsb25lcyBhIFRyaWFuZ2xlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLkNsb25lXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSBzb3VyY2UgLSBUaGUgVHJpYW5nbGUgdG8gY2xvbmUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSBBIG5ldyBUcmlhbmdsZSBpZGVudGljYWwgdG8gdGhlIGdpdmVuIG9uZSBidXQgc2VwYXJhdGUgZnJvbSBpdC5cclxuICovXHJcbnZhciBDbG9uZSA9IGZ1bmN0aW9uIChzb3VyY2UpXHJcbntcclxuICAgIHJldHVybiBuZXcgVHJpYW5nbGUoc291cmNlLngxLCBzb3VyY2UueTEsIHNvdXJjZS54Miwgc291cmNlLnkyLCBzb3VyY2UueDMsIHNvdXJjZS55Myk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENsb25lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcG9pbnRpbnBvbHkvXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgcG9pbnQgKGFzIGEgcGFpciBvZiBjb29yZGluYXRlcykgaXMgaW5zaWRlIGEgVHJpYW5nbGUncyBib3VuZHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5Db250YWluc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9pbnQgaXMgaW5zaWRlIHRoZSBUcmlhbmdsZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgQ29udGFpbnMgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHgsIHkpXHJcbntcclxuICAgIHZhciB2MHggPSB0cmlhbmdsZS54MyAtIHRyaWFuZ2xlLngxO1xyXG4gICAgdmFyIHYweSA9IHRyaWFuZ2xlLnkzIC0gdHJpYW5nbGUueTE7XHJcblxyXG4gICAgdmFyIHYxeCA9IHRyaWFuZ2xlLngyIC0gdHJpYW5nbGUueDE7XHJcbiAgICB2YXIgdjF5ID0gdHJpYW5nbGUueTIgLSB0cmlhbmdsZS55MTtcclxuXHJcbiAgICB2YXIgdjJ4ID0geCAtIHRyaWFuZ2xlLngxO1xyXG4gICAgdmFyIHYyeSA9IHkgLSB0cmlhbmdsZS55MTtcclxuXHJcbiAgICB2YXIgZG90MDAgPSAodjB4ICogdjB4KSArICh2MHkgKiB2MHkpO1xyXG4gICAgdmFyIGRvdDAxID0gKHYweCAqIHYxeCkgKyAodjB5ICogdjF5KTtcclxuICAgIHZhciBkb3QwMiA9ICh2MHggKiB2MngpICsgKHYweSAqIHYyeSk7XHJcbiAgICB2YXIgZG90MTEgPSAodjF4ICogdjF4KSArICh2MXkgKiB2MXkpO1xyXG4gICAgdmFyIGRvdDEyID0gKHYxeCAqIHYyeCkgKyAodjF5ICogdjJ5KTtcclxuXHJcbiAgICAvLyBDb21wdXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzXHJcbiAgICB2YXIgYiA9ICgoZG90MDAgKiBkb3QxMSkgLSAoZG90MDEgKiBkb3QwMSkpO1xyXG4gICAgdmFyIGludiA9IChiID09PSAwKSA/IDAgOiAoMSAvIGIpO1xyXG4gICAgdmFyIHUgPSAoKGRvdDExICogZG90MDIpIC0gKGRvdDAxICogZG90MTIpKSAqIGludjtcclxuICAgIHZhciB2ID0gKChkb3QwMCAqIGRvdDEyKSAtIChkb3QwMSAqIGRvdDAyKSkgKiBpbnY7XHJcblxyXG4gICAgcmV0dXJuICh1ID49IDAgJiYgdiA+PSAwICYmICh1ICsgdiA8IDEpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29udGFpbnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9cclxuXHJcbi8vICBwb2ludHMgaXMgYW4gYXJyYXkgb2YgUG9pbnQtbGlrZSBvYmplY3RzIHdpdGggcHVibGljIHgveSBwcm9wZXJ0aWVzXHJcbi8vICByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHBvaW50cyB0aGF0IGFyZSB3aXRoaW4gdGhlIHRyaWFuZ2xlLCBvciBhbiBlbXB0eSBhcnJheSBpZiBub25lXHJcbi8vICBpZiAncmV0dXJuRmlyc3QnIGlzIHRydWUgaXQgd2lsbCByZXR1cm4gYWZ0ZXIgdGhlIGZpcnN0IHBvaW50IHdpdGhpbiB0aGUgdHJpYW5nbGUgaXMgZm91bmRcclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXJzIGFuIGFycmF5IG9mIHBvaW50LWxpa2Ugb2JqZWN0cyB0byBvbmx5IHRob3NlIGNvbnRhaW5lZCB3aXRoaW4gYSB0cmlhbmdsZS5cclxuICogSWYgYHJldHVybkZpcnN0YCBpcyB0cnVlLCB3aWxsIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIG9ubHkgdGhlIGZpcnN0IHBvaW50IGluIHRoZSBwcm92aWRlZCBhcnJheSB0aGF0IGlzIHdpdGhpbiB0aGUgdHJpYW5nbGUgKG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBubyBzdWNoIHBvaW50cykuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5Db250YWluc0FycmF5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0aGF0IHRoZSBwb2ludHMgYXJlIGJlaW5nIGNoZWNrZWQgaW4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnRbXX0gcG9pbnRzIC0gQW4gYXJyYXkgb2YgcG9pbnQtbGlrZSBvYmplY3RzIChvYmplY3RzIHRoYXQgaGF2ZSBhbiBgeGAgYW5kIGB5YCBwcm9wZXJ0eSlcclxuICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuRmlyc3Q9ZmFsc2VdIC0gSWYgYHRydWVgLCByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBvbmx5IHRoZSBmaXJzdCBwb2ludCBmb3VuZCB0aGF0IGlzIHdpdGhpbiB0aGUgdHJpYW5nbGUuXHJcbiAqIEBwYXJhbSB7YXJyYXl9IFtvdXRdIC0gSWYgcHJvdmlkZWQsIHRoZSBwb2ludHMgdGhhdCBhcmUgd2l0aGluIHRoZSB0cmlhbmdsZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgYXJyYXkgaW5zdGVhZCBvZiBiZWluZyBhZGRlZCB0byBhIG5ldyBhcnJheS4gSWYgYHJldHVybkZpcnN0YCBpcyB0cnVlLCBvbmx5IHRoZSBmaXJzdCBwb2ludCBmb3VuZCB3aXRoaW4gdGhlIHRyaWFuZ2xlIHdpbGwgYmUgYXBwZW5kZWQuIFRoaXMgYXJyYXkgd2lsbCBhbHNvIGJlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50W119IEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBwb2ludHMgZnJvbSBgcG9pbnRzYCB0aGF0IGFyZSB3aXRoaW4gdGhlIHRyaWFuZ2xlLCBpZiBhbiBhcnJheSB3YXMgcHJvdmlkZWQgYXMgYG91dGAsIHBvaW50cyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoYXQgYXJyYXkgYW5kIGl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZCBoZXJlLlxyXG4gKi9cclxudmFyIENvbnRhaW5zQXJyYXkgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHBvaW50cywgcmV0dXJuRmlyc3QsIG91dClcclxue1xyXG4gICAgaWYgKHJldHVybkZpcnN0ID09PSB1bmRlZmluZWQpIHsgcmV0dXJuRmlyc3QgPSBmYWxzZTsgfVxyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgdmFyIHYweCA9IHRyaWFuZ2xlLngzIC0gdHJpYW5nbGUueDE7XHJcbiAgICB2YXIgdjB5ID0gdHJpYW5nbGUueTMgLSB0cmlhbmdsZS55MTtcclxuXHJcbiAgICB2YXIgdjF4ID0gdHJpYW5nbGUueDIgLSB0cmlhbmdsZS54MTtcclxuICAgIHZhciB2MXkgPSB0cmlhbmdsZS55MiAtIHRyaWFuZ2xlLnkxO1xyXG5cclxuICAgIHZhciBkb3QwMCA9ICh2MHggKiB2MHgpICsgKHYweSAqIHYweSk7XHJcbiAgICB2YXIgZG90MDEgPSAodjB4ICogdjF4KSArICh2MHkgKiB2MXkpO1xyXG4gICAgdmFyIGRvdDExID0gKHYxeCAqIHYxeCkgKyAodjF5ICogdjF5KTtcclxuXHJcbiAgICAvLyBDb21wdXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzXHJcbiAgICB2YXIgYiA9ICgoZG90MDAgKiBkb3QxMSkgLSAoZG90MDEgKiBkb3QwMSkpO1xyXG4gICAgdmFyIGludiA9IChiID09PSAwKSA/IDAgOiAoMSAvIGIpO1xyXG5cclxuICAgIHZhciB1O1xyXG4gICAgdmFyIHY7XHJcbiAgICB2YXIgdjJ4O1xyXG4gICAgdmFyIHYyeTtcclxuICAgIHZhciBkb3QwMjtcclxuICAgIHZhciBkb3QxMjtcclxuXHJcbiAgICB2YXIgeDEgPSB0cmlhbmdsZS54MTtcclxuICAgIHZhciB5MSA9IHRyaWFuZ2xlLnkxO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHYyeCA9IHBvaW50c1tpXS54IC0geDE7XHJcbiAgICAgICAgdjJ5ID0gcG9pbnRzW2ldLnkgLSB5MTtcclxuXHJcbiAgICAgICAgZG90MDIgPSAodjB4ICogdjJ4KSArICh2MHkgKiB2MnkpO1xyXG4gICAgICAgIGRvdDEyID0gKHYxeCAqIHYyeCkgKyAodjF5ICogdjJ5KTtcclxuXHJcbiAgICAgICAgdSA9ICgoZG90MTEgKiBkb3QwMikgLSAoZG90MDEgKiBkb3QxMikpICogaW52O1xyXG4gICAgICAgIHYgPSAoKGRvdDAwICogZG90MTIpIC0gKGRvdDAxICogZG90MDIpKSAqIGludjtcclxuICAgIFxyXG4gICAgICAgIGlmICh1ID49IDAgJiYgdiA+PSAwICYmICh1ICsgdiA8IDEpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0LnB1c2goeyB4OiBwb2ludHNbaV0ueCwgeTogcG9pbnRzW2ldLnkgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0dXJuRmlyc3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5zQXJyYXk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIGEgdHJpYW5nbGUgY29udGFpbnMgYSBwb2ludC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLkNvbnRhaW5zUG9pbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIHRyaWFuZ2xlLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxQaGFzZXIuTWF0aC5WZWN0b3IyfGFueSl9IHBvaW50IC0gVGhlIHBvaW50IHRvIHRlc3QsIG9yIGFueSBwb2ludC1saWtlIG9iamVjdCB3aXRoIHB1YmxpYyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgdHJpYW5nbGUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIENvbnRhaW5zUG9pbnQgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHBvaW50KVxyXG57XHJcbiAgICByZXR1cm4gQ29udGFpbnModHJpYW5nbGUsIHBvaW50LngsIHBvaW50LnkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb250YWluc1BvaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgb2Ygb25lIFRyaWFuZ2xlIHRvIGEgZGVzdGluYXRpb24gVHJpYW5nbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5Db3B5RnJvbVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSBPIC0gW2Rlc3QsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gc291cmNlIC0gVGhlIHNvdXJjZSBUcmlhbmdsZSB0byBjb3B5IHRoZSB2YWx1ZXMgZnJvbS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gZGVzdCAtIFRoZSBkZXN0aW5hdGlvbiBUcmlhbmdsZSB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSBUaGUgZGVzdGluYXRpb24gVHJpYW5nbGUuXHJcbiAqL1xyXG52YXIgQ29weUZyb20gPSBmdW5jdGlvbiAoc291cmNlLCBkZXN0KVxyXG57XHJcbiAgICByZXR1cm4gZGVzdC5zZXRUbyhzb3VyY2UueDEsIHNvdXJjZS55MSwgc291cmNlLngyLCBzb3VyY2UueTIsIHNvdXJjZS54Mywgc291cmNlLnkzKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29weUZyb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERlY29tcG9zZXMgYSBUcmlhbmdsZSBpbnRvIGFuIGFycmF5IG9mIGl0cyBwb2ludHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5EZWNvbXBvc2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIGRlY29tcG9zZS5cclxuICogQHBhcmFtIHthcnJheX0gW291dF0gLSBBbiBhcnJheSB0byBzdG9yZSB0aGUgcG9pbnRzIGludG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBUaGUgcHJvdmlkZWQgYG91dGAgYXJyYXksIG9yIGEgbmV3IGFycmF5IGlmIG5vbmUgd2FzIHByb3ZpZGVkLCB3aXRoIHRocmVlIG9iamVjdHMgd2l0aCBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBlYWNoIHBvaW50IG9mIHRoZSBUcmlhbmdsZSBhcHBlbmRlZCB0byBpdC5cclxuICovXHJcbnZhciBEZWNvbXBvc2UgPSBmdW5jdGlvbiAodHJpYW5nbGUsIG91dClcclxue1xyXG4gICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgb3V0LnB1c2goeyB4OiB0cmlhbmdsZS54MSwgeTogdHJpYW5nbGUueTEgfSk7XHJcbiAgICBvdXQucHVzaCh7IHg6IHRyaWFuZ2xlLngyLCB5OiB0cmlhbmdsZS55MiB9KTtcclxuICAgIG91dC5wdXNoKHsgeDogdHJpYW5nbGUueDMsIHk6IHRyaWFuZ2xlLnkzIH0pO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERlY29tcG9zZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHR3byB0cmlhbmdsZXMgaGF2ZSB0aGUgc2FtZSBjb29yZGluYXRlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLkVxdWFsc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgZmlyc3QgdHJpYW5nbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRvQ29tcGFyZSAtIFRoZSBzZWNvbmQgdHJpYW5nbGUgdG8gY2hlY2suXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHdvIGdpdmVuIHRyaWFuZ2xlcyBoYXZlIHRoZSBleGFjdCBzYW1lIGNvb3JkaW5hdGVzLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBFcXVhbHMgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHRvQ29tcGFyZSlcclxue1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgICB0cmlhbmdsZS54MSA9PT0gdG9Db21wYXJlLngxICYmXHJcbiAgICAgICAgdHJpYW5nbGUueTEgPT09IHRvQ29tcGFyZS55MSAmJlxyXG4gICAgICAgIHRyaWFuZ2xlLngyID09PSB0b0NvbXBhcmUueDIgJiZcclxuICAgICAgICB0cmlhbmdsZS55MiA9PT0gdG9Db21wYXJlLnkyICYmXHJcbiAgICAgICAgdHJpYW5nbGUueDMgPT09IHRvQ29tcGFyZS54MyAmJlxyXG4gICAgICAgIHRyaWFuZ2xlLnkzID09PSB0b0NvbXBhcmUueTNcclxuICAgICk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVxdWFscztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG52YXIgTGVuZ3RoID0gcmVxdWlyZSgnLi4vbGluZS9MZW5ndGgnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgUG9pbnQgZnJvbSBhcm91bmQgdGhlIHBlcmltZXRlciBvZiBhIFRyaWFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuR2V0UG9pbnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gZ2V0IHRoZSBwb2ludCBvbiBpdHMgcGVyaW1ldGVyIGZyb20uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBhbG9uZyB0aGUgcGVyaW1ldGVyIG9mIHRoZSB0cmlhbmdsZS4gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IFtvdXRdIC0gQW4gb3B0aW9uIFBvaW50LCBvciBQb2ludC1saWtlIG9iamVjdCB0byBzdG9yZSB0aGUgdmFsdWUgaW4uIElmIG5vdCBnaXZlbiBhIG5ldyBQb2ludCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBBIFBvaW50IG9iamVjdCBjb250YWluaW5nIHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIEdldFBvaW50ID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBwb3NpdGlvbiwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICB2YXIgbGluZTEgPSB0cmlhbmdsZS5nZXRMaW5lQSgpO1xyXG4gICAgdmFyIGxpbmUyID0gdHJpYW5nbGUuZ2V0TGluZUIoKTtcclxuICAgIHZhciBsaW5lMyA9IHRyaWFuZ2xlLmdldExpbmVDKCk7XHJcblxyXG4gICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gMSlcclxuICAgIHtcclxuICAgICAgICBvdXQueCA9IGxpbmUxLngxO1xyXG4gICAgICAgIG91dC55ID0gbGluZTEueTE7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGxlbmd0aDEgPSBMZW5ndGgobGluZTEpO1xyXG4gICAgdmFyIGxlbmd0aDIgPSBMZW5ndGgobGluZTIpO1xyXG4gICAgdmFyIGxlbmd0aDMgPSBMZW5ndGgobGluZTMpO1xyXG5cclxuICAgIHZhciBwZXJpbWV0ZXIgPSBsZW5ndGgxICsgbGVuZ3RoMiArIGxlbmd0aDM7XHJcblxyXG4gICAgdmFyIHAgPSBwZXJpbWV0ZXIgKiBwb3NpdGlvbjtcclxuICAgIHZhciBsb2NhbFBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAvLyAgV2hpY2ggbGluZSBpcyBpdCBvbj9cclxuXHJcbiAgICBpZiAocCA8IGxlbmd0aDEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIExpbmUgMVxyXG4gICAgICAgIGxvY2FsUG9zaXRpb24gPSBwIC8gbGVuZ3RoMTtcclxuXHJcbiAgICAgICAgb3V0LnggPSBsaW5lMS54MSArIChsaW5lMS54MiAtIGxpbmUxLngxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICAgICAgb3V0LnkgPSBsaW5lMS55MSArIChsaW5lMS55MiAtIGxpbmUxLnkxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwID4gbGVuZ3RoMSArIGxlbmd0aDIpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIExpbmUgM1xyXG4gICAgICAgIHAgLT0gbGVuZ3RoMSArIGxlbmd0aDI7XHJcbiAgICAgICAgbG9jYWxQb3NpdGlvbiA9IHAgLyBsZW5ndGgzO1xyXG5cclxuICAgICAgICBvdXQueCA9IGxpbmUzLngxICsgKGxpbmUzLngyIC0gbGluZTMueDEpICogbG9jYWxQb3NpdGlvbjtcclxuICAgICAgICBvdXQueSA9IGxpbmUzLnkxICsgKGxpbmUzLnkyIC0gbGluZTMueTEpICogbG9jYWxQb3NpdGlvbjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICAvLyAgTGluZSAyXHJcbiAgICAgICAgcCAtPSBsZW5ndGgxO1xyXG4gICAgICAgIGxvY2FsUG9zaXRpb24gPSBwIC8gbGVuZ3RoMjtcclxuXHJcbiAgICAgICAgb3V0LnggPSBsaW5lMi54MSArIChsaW5lMi54MiAtIGxpbmUyLngxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICAgICAgb3V0LnkgPSBsaW5lMi55MSArIChsaW5lMi55MiAtIGxpbmUyLnkxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG9pbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExlbmd0aCA9IHJlcXVpcmUoJy4uL2xpbmUvTGVuZ3RoJyk7XHJcbnZhciBQb2ludCA9IHJlcXVpcmUoJy4uL3BvaW50L1BvaW50Jyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBvZiBldmVubHkgc3BhY2VkIHBvaW50cyBvbiB0aGUgcGVyaW1ldGVyIG9mIGEgVHJpYW5nbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5HZXRQb2ludHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gZ2V0IHRoZSBwb2ludHMgZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBxdWFudGl0eSAtIFRoZSBudW1iZXIgb2YgZXZlbmx5IHNwYWNlZCBwb2ludHMgdG8gcmV0dXJuLiBTZXQgdG8gMCB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBwb2ludHMgYmFzZWQgb24gdGhlIGBzdGVwUmF0ZWAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwUmF0ZSAtIElmIGBxdWFudGl0eWAgaXMgMCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByZXR1cm5lZCBwb2ludC5cclxuICogQHBhcmFtIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFtvdXRdIC0gQW4gYXJyYXkgdG8gd2hpY2ggdGhlIHBvaW50cyBzaG91bGQgYmUgYXBwZW5kZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gVGhlIG1vZGlmaWVkIGBvdXRgIGFycmF5LCBvciBhIG5ldyBhcnJheSBpZiBub25lIHdhcyBwcm92aWRlZC5cclxuICovXHJcbnZhciBHZXRQb2ludHMgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gW107IH1cclxuXHJcbiAgICB2YXIgbGluZTEgPSB0cmlhbmdsZS5nZXRMaW5lQSgpO1xyXG4gICAgdmFyIGxpbmUyID0gdHJpYW5nbGUuZ2V0TGluZUIoKTtcclxuICAgIHZhciBsaW5lMyA9IHRyaWFuZ2xlLmdldExpbmVDKCk7XHJcblxyXG4gICAgdmFyIGxlbmd0aDEgPSBMZW5ndGgobGluZTEpO1xyXG4gICAgdmFyIGxlbmd0aDIgPSBMZW5ndGgobGluZTIpO1xyXG4gICAgdmFyIGxlbmd0aDMgPSBMZW5ndGgobGluZTMpO1xyXG5cclxuICAgIHZhciBwZXJpbWV0ZXIgPSBsZW5ndGgxICsgbGVuZ3RoMiArIGxlbmd0aDM7XHJcblxyXG4gICAgLy8gIElmIHF1YW50aXR5IGlzIGEgZmFsc2V5IHZhbHVlIChmYWxzZSwgbnVsbCwgMCwgdW5kZWZpbmVkLCBldGMpIHRoZW4gd2UgY2FsY3VsYXRlIGl0IGJhc2VkIG9uIHRoZSBzdGVwUmF0ZSBpbnN0ZWFkLlxyXG4gICAgaWYgKCFxdWFudGl0eSAmJiBzdGVwUmF0ZSA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgcXVhbnRpdHkgPSBwZXJpbWV0ZXIgLyBzdGVwUmF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1YW50aXR5OyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHAgPSBwZXJpbWV0ZXIgKiAoaSAvIHF1YW50aXR5KTtcclxuICAgICAgICB2YXIgbG9jYWxQb3NpdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIHZhciBwb2ludCA9IG5ldyBQb2ludCgpO1xyXG5cclxuICAgICAgICAvLyAgV2hpY2ggbGluZSBpcyBpdCBvbj9cclxuXHJcbiAgICAgICAgaWYgKHAgPCBsZW5ndGgxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIExpbmUgMVxyXG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9uID0gcCAvIGxlbmd0aDE7XHJcblxyXG4gICAgICAgICAgICBwb2ludC54ID0gbGluZTEueDEgKyAobGluZTEueDIgLSBsaW5lMS54MSkgKiBsb2NhbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICBwb2ludC55ID0gbGluZTEueTEgKyAobGluZTEueTIgLSBsaW5lMS55MSkgKiBsb2NhbFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwID4gbGVuZ3RoMSArIGxlbmd0aDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTGluZSAzXHJcbiAgICAgICAgICAgIHAgLT0gbGVuZ3RoMSArIGxlbmd0aDI7XHJcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb24gPSBwIC8gbGVuZ3RoMztcclxuXHJcbiAgICAgICAgICAgIHBvaW50LnggPSBsaW5lMy54MSArIChsaW5lMy54MiAtIGxpbmUzLngxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICAgICAgICAgIHBvaW50LnkgPSBsaW5lMy55MSArIChsaW5lMy55MiAtIGxpbmUzLnkxKSAqIGxvY2FsUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBMaW5lIDJcclxuICAgICAgICAgICAgcCAtPSBsZW5ndGgxO1xyXG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9uID0gcCAvIGxlbmd0aDI7XHJcblxyXG4gICAgICAgICAgICBwb2ludC54ID0gbGluZTIueDEgKyAobGluZTIueDIgLSBsaW5lMi54MSkgKiBsb2NhbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICBwb2ludC55ID0gbGluZTIueTEgKyAobGluZTIueTIgLSBsaW5lMi55MSkgKiBsb2NhbFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3V0LnB1c2gocG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFBvaW50cztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLy8gVGhlIHRocmVlIGFuZ2xlIGJpc2VjdG9ycyBvZiBhIHRyaWFuZ2xlIG1lZXQgaW4gb25lIHBvaW50IGNhbGxlZCB0aGUgaW5jZW50ZXIuXHJcbi8vIEl0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGluY2lyY2xlLCB0aGUgY2lyY2xlIGluc2NyaWJlZCBpbiB0aGUgdHJpYW5nbGUuXHJcblxyXG5mdW5jdGlvbiBnZXRMZW5ndGggKHgxLCB5MSwgeDIsIHkyKVxyXG57XHJcbiAgICB2YXIgeCA9IHgxIC0geDI7XHJcbiAgICB2YXIgeSA9IHkxIC0geTI7XHJcbiAgICB2YXIgbWFnbml0dWRlID0gKHggKiB4KSArICh5ICogeSk7XHJcblxyXG4gICAgcmV0dXJuIE1hdGguc3FydChtYWduaXR1ZGUpO1xyXG59XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGluY2VudGVyIG9mIGEgVHJpYW5nbGUgb2JqZWN0LiBUaGlzIGlzIHRoZSBwb2ludCB3aGVyZSBpdHMgdGhyZWUgYW5nbGUgYmlzZWN0b3JzIG1lZXQgYW5kIGl0J3MgYWxzbyB0aGUgY2VudGVyIG9mIHRoZSBpbmNpcmNsZSwgd2hpY2ggaXMgdGhlIGNpcmNsZSBpbnNjcmliZWQgaW4gdGhlIHRyaWFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuSW5DZW50ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5Qb2ludH0gTyAtIFtvdXQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gZmluZCB0aGUgaW5jZW50ZXIgb2YuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUG9pbnR9IFtvdXRdIC0gQW4gb3B0aW9uYWwgUG9pbnQgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5Qb2ludH0gUG9pbnQgKHgsIHkpIG9mIHRoZSBjZW50ZXIgcGl4ZWwgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIEluQ2VudGVyID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgUG9pbnQoKTsgfVxyXG5cclxuICAgIHZhciB4MSA9IHRyaWFuZ2xlLngxO1xyXG4gICAgdmFyIHkxID0gdHJpYW5nbGUueTE7XHJcblxyXG4gICAgdmFyIHgyID0gdHJpYW5nbGUueDI7XHJcbiAgICB2YXIgeTIgPSB0cmlhbmdsZS55MjtcclxuXHJcbiAgICB2YXIgeDMgPSB0cmlhbmdsZS54MztcclxuICAgIHZhciB5MyA9IHRyaWFuZ2xlLnkzO1xyXG5cclxuICAgIHZhciBkMSA9IGdldExlbmd0aCh4MywgeTMsIHgyLCB5Mik7XHJcbiAgICB2YXIgZDIgPSBnZXRMZW5ndGgoeDEsIHkxLCB4MywgeTMpO1xyXG4gICAgdmFyIGQzID0gZ2V0TGVuZ3RoKHgyLCB5MiwgeDEsIHkxKTtcclxuXHJcbiAgICB2YXIgcCA9IGQxICsgZDIgKyBkMztcclxuXHJcbiAgICBvdXQueCA9ICh4MSAqIGQxICsgeDIgKiBkMiArIHgzICogZDMpIC8gcDtcclxuICAgIG91dC55ID0gKHkxICogZDEgKyB5MiAqIGQyICsgeTMgKiBkMykgLyBwO1xyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluQ2VudGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBNb3ZlcyBlYWNoIHBvaW50ICh2ZXJ0ZXgpIG9mIGEgVHJpYW5nbGUgYnkgYSBnaXZlbiBvZmZzZXQsIHRodXMgbW92aW5nIHRoZSBlbnRpcmUgVHJpYW5nbGUgYnkgdGhhdCBvZmZzZXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5PZmZzZXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gTyAtIFt0cmlhbmdsZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byBtb3ZlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIG9mZnNldCAoZGlzdGFuY2UpIGJ5IHdoaWNoIHRvIG1vdmUgZWFjaCBwb2ludC4gQ2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgKGRpc3RhbmNlKSBieSB3aGljaCB0byBtb3ZlIGVhY2ggcG9pbnQuIENhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IFRoZSBtb2RpZmllZCBUcmlhbmdsZS5cclxuICovXHJcbnZhciBPZmZzZXQgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHgsIHkpXHJcbntcclxuICAgIHRyaWFuZ2xlLngxICs9IHg7XHJcbiAgICB0cmlhbmdsZS55MSArPSB5O1xyXG5cclxuICAgIHRyaWFuZ2xlLngyICs9IHg7XHJcbiAgICB0cmlhbmdsZS55MiArPSB5O1xyXG5cclxuICAgIHRyaWFuZ2xlLngzICs9IHg7XHJcbiAgICB0cmlhbmdsZS55MyArPSB5O1xyXG5cclxuICAgIHJldHVybiB0cmlhbmdsZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT2Zmc2V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBMZW5ndGggPSByZXF1aXJlKCcuLi9saW5lL0xlbmd0aCcpO1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgcGVyaW1ldGVyIG9mIHRoZSBnaXZlbiB0cmlhbmdsZS5cclxuICogQ2FsY3VsYXRlZCBieSBhZGRpbmcgdG9nZXRoZXIgdGhlIGxlbmd0aCBvZiBlYWNoIG9mIHRoZSB0aHJlZSBzaWRlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLlBlcmltZXRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gZ2V0IHRoZSBsZW5ndGggZnJvbS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBUcmlhbmdsZS5cclxuICovXHJcbnZhciBQZXJpbWV0ZXIgPSBmdW5jdGlvbiAodHJpYW5nbGUpXHJcbntcclxuICAgIHZhciBsaW5lMSA9IHRyaWFuZ2xlLmdldExpbmVBKCk7XHJcbiAgICB2YXIgbGluZTIgPSB0cmlhbmdsZS5nZXRMaW5lQigpO1xyXG4gICAgdmFyIGxpbmUzID0gdHJpYW5nbGUuZ2V0TGluZUMoKTtcclxuXHJcbiAgICByZXR1cm4gKExlbmd0aChsaW5lMSkgKyBMZW5ndGgobGluZTIpICsgTGVuZ3RoKGxpbmUzKSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBlcmltZXRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUG9pbnQgPSByZXF1aXJlKCcuLi9wb2ludC9Qb2ludCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gUG9pbnQgZnJvbSB3aXRoaW4gdGhlIGFyZWEgb2YgdGhlIGdpdmVuIFRyaWFuZ2xlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuUmFuZG9tXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbb3V0LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIFRyaWFuZ2xlIHRvIGdldCBhIHJhbmRvbSBwb2ludCBmcm9tLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBbb3V0XSAtIFRoZSBQb2ludCBvYmplY3QgdG8gc3RvcmUgdGhlIHBvc2l0aW9uIGluLiBJZiBub3QgZ2l2ZW4sIGEgbmV3IFBvaW50IGluc3RhbmNlIGlzIGNyZWF0ZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBBIFBvaW50IG9iamVjdCBob2xkaW5nIHRoZSBjb29yZGluYXRlcyBvZiBhIHJhbmRvbSBwb3NpdGlvbiB3aXRoaW4gdGhlIFRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIFJhbmRvbSA9IGZ1bmN0aW9uICh0cmlhbmdsZSwgb3V0KVxyXG57XHJcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHsgb3V0ID0gbmV3IFBvaW50KCk7IH1cclxuXHJcbiAgICAvLyAgQmFzaXMgdmVjdG9yc1xyXG4gICAgdmFyIHV4ID0gdHJpYW5nbGUueDIgLSB0cmlhbmdsZS54MTtcclxuICAgIHZhciB1eSA9IHRyaWFuZ2xlLnkyIC0gdHJpYW5nbGUueTE7XHJcblxyXG4gICAgdmFyIHZ4ID0gdHJpYW5nbGUueDMgLSB0cmlhbmdsZS54MTtcclxuICAgIHZhciB2eSA9IHRyaWFuZ2xlLnkzIC0gdHJpYW5nbGUueTE7XHJcblxyXG4gICAgLy8gIFJhbmRvbSBwb2ludCB3aXRoaW4gdGhlIHVuaXQgc3F1YXJlXHJcbiAgICB2YXIgciA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICB2YXIgcyA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG4gICAgLy8gIFBvaW50IG91dHNpZGUgdGhlIHRyaWFuZ2xlPyBSZW1hcCBpdC5cclxuICAgIGlmIChyICsgcyA+PSAxKVxyXG4gICAge1xyXG4gICAgICAgIHIgPSAxIC0gcjtcclxuICAgICAgICBzID0gMSAtIHM7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0LnggPSB0cmlhbmdsZS54MSArICgodXggKiByKSArICh2eCAqIHMpKTtcclxuICAgIG91dC55ID0gdHJpYW5nbGUueTEgKyAoKHV5ICogcikgKyAodnkgKiBzKSk7XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSb3RhdGVBcm91bmRYWSA9IHJlcXVpcmUoJy4vUm90YXRlQXJvdW5kWFknKTtcclxudmFyIEluQ2VudGVyID0gcmVxdWlyZSgnLi9JbkNlbnRlcicpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBUcmlhbmdsZSBhYm91dCBpdHMgaW5jZW50ZXIsIHdoaWNoIGlzIHRoZSBwb2ludCBhdCB3aGljaCBpdHMgdGhyZWUgYW5nbGUgYmlzZWN0b3JzIG1lZXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuR2VvbS5UcmlhbmdsZS5Sb3RhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gTyAtIFt0cmlhbmdsZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byByb3RhdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBieSB3aGljaCB0byByb3RhdGUgdGhlIFRyaWFuZ2xlLCBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gVGhlIHJvdGF0ZWQgVHJpYW5nbGUuXHJcbiAqL1xyXG52YXIgUm90YXRlID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBhbmdsZSlcclxue1xyXG4gICAgdmFyIHBvaW50ID0gSW5DZW50ZXIodHJpYW5nbGUpO1xyXG5cclxuICAgIHJldHVybiBSb3RhdGVBcm91bmRYWSh0cmlhbmdsZSwgcG9pbnQueCwgcG9pbnQueSwgYW5nbGUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvdGF0ZUFyb3VuZFhZID0gcmVxdWlyZSgnLi9Sb3RhdGVBcm91bmRYWScpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBUcmlhbmdsZSBhdCBhIGNlcnRhaW4gYW5nbGUgYWJvdXQgYSBnaXZlbiBQb2ludCBvciBvYmplY3Qgd2l0aCBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5HZW9tLlRyaWFuZ2xlLlJvdGF0ZUFyb3VuZFBvaW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IE8gLSBbdHJpYW5nbGUsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgVHJpYW5nbGUgdG8gcm90YXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBwb2ludCAtIFRoZSBQb2ludCB0byByb3RhdGUgdGhlIFRyaWFuZ2xlIGFib3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgYnkgd2hpY2ggdG8gcm90YXRlIHRoZSBUcmlhbmdsZSwgaW4gcmFkaWFucy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IFRoZSByb3RhdGVkIFRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIFJvdGF0ZUFyb3VuZFBvaW50ID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCBwb2ludCwgYW5nbGUpXHJcbntcclxuICAgIHJldHVybiBSb3RhdGVBcm91bmRYWSh0cmlhbmdsZSwgcG9pbnQueCwgcG9pbnQueSwgYW5nbGUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmRQb2ludDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm90YXRlcyBhbiBlbnRpcmUgVHJpYW5nbGUgYXQgYSBnaXZlbiBhbmdsZSBhYm91dCBhIHNwZWNpZmljIHBvaW50LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkdlb20uVHJpYW5nbGUuUm90YXRlQXJvdW5kWFlcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIHtQaGFzZXIuR2VvbS5UcmlhbmdsZX0gTyAtIFt0cmlhbmdsZSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HZW9tLlRyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSBUcmlhbmdsZSB0byByb3RhdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gcm90YXRlIHRoZSBUcmlhbmdsZSBhYm91dC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byByb3RhdGUgdGhlIFRyaWFuZ2xlIGFib3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgYnkgd2hpY2ggdG8gcm90YXRlIHRoZSBUcmlhbmdsZSwgaW4gcmFkaWFucy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLkdlb20uVHJpYW5nbGV9IFRoZSByb3RhdGVkIFRyaWFuZ2xlLlxyXG4gKi9cclxudmFyIFJvdGF0ZUFyb3VuZFhZID0gZnVuY3Rpb24gKHRyaWFuZ2xlLCB4LCB5LCBhbmdsZSlcclxue1xyXG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICB2YXIgdHggPSB0cmlhbmdsZS54MSAtIHg7XHJcbiAgICB2YXIgdHkgPSB0cmlhbmdsZS55MSAtIHk7XHJcblxyXG4gICAgdHJpYW5nbGUueDEgPSB0eCAqIGMgLSB0eSAqIHMgKyB4O1xyXG4gICAgdHJpYW5nbGUueTEgPSB0eCAqIHMgKyB0eSAqIGMgKyB5O1xyXG5cclxuICAgIHR4ID0gdHJpYW5nbGUueDIgLSB4O1xyXG4gICAgdHkgPSB0cmlhbmdsZS55MiAtIHk7XHJcblxyXG4gICAgdHJpYW5nbGUueDIgPSB0eCAqIGMgLSB0eSAqIHMgKyB4O1xyXG4gICAgdHJpYW5nbGUueTIgPSB0eCAqIHMgKyB0eSAqIGMgKyB5O1xyXG5cclxuICAgIHR4ID0gdHJpYW5nbGUueDMgLSB4O1xyXG4gICAgdHkgPSB0cmlhbmdsZS55MyAtIHk7XHJcblxyXG4gICAgdHJpYW5nbGUueDMgPSB0eCAqIGMgLSB0eSAqIHMgKyB4O1xyXG4gICAgdHJpYW5nbGUueTMgPSB0eCAqIHMgKyB0eSAqIGMgKyB5O1xyXG5cclxuICAgIHJldHVybiB0cmlhbmdsZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlQXJvdW5kWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbnRhaW5zID0gcmVxdWlyZSgnLi9Db250YWlucycpO1xyXG52YXIgR2V0UG9pbnQgPSByZXF1aXJlKCcuL0dldFBvaW50Jyk7XHJcbnZhciBHZXRQb2ludHMgPSByZXF1aXJlKCcuL0dldFBvaW50cycpO1xyXG52YXIgR0VPTV9DT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBMaW5lID0gcmVxdWlyZSgnLi4vbGluZS9MaW5lJyk7XHJcbnZhciBSYW5kb20gPSByZXF1aXJlKCcuL1JhbmRvbScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSB0cmlhbmdsZSBpcyBhIHBsYW5lIGNyZWF0ZWQgYnkgY29ubmVjdGluZyB0aHJlZSBwb2ludHMuXHJcbiAqIFRoZSBmaXJzdCB0d28gYXJndW1lbnRzIHNwZWNpZnkgdGhlIGZpcnN0IHBvaW50LCB0aGUgbWlkZGxlIHR3byBhcmd1bWVudHNcclxuICogc3BlY2lmeSB0aGUgc2Vjb25kIHBvaW50LCBhbmQgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSB0aGlyZCBwb2ludC5cclxuICpcclxuICogQGNsYXNzIFRyaWFuZ2xlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuR2VvbVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDE9MF0gLSBgeGAgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeTE9MF0gLSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeDI9MF0gLSBgeGAgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3kyPTBdIC0gYHlgIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt4Mz0wXSAtIGB4YCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5Mz0wXSAtIGB5YCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludC5cclxuICovXHJcbnZhciBUcmlhbmdsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUcmlhbmdsZSAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MylcclxuICAgIHtcclxuICAgICAgICBpZiAoeDEgPT09IHVuZGVmaW5lZCkgeyB4MSA9IDA7IH1cclxuICAgICAgICBpZiAoeTEgPT09IHVuZGVmaW5lZCkgeyB5MSA9IDA7IH1cclxuICAgICAgICBpZiAoeDIgPT09IHVuZGVmaW5lZCkgeyB4MiA9IDA7IH1cclxuICAgICAgICBpZiAoeTIgPT09IHVuZGVmaW5lZCkgeyB5MiA9IDA7IH1cclxuICAgICAgICBpZiAoeDMgPT09IHVuZGVmaW5lZCkgeyB4MyA9IDA7IH1cclxuICAgICAgICBpZiAoeTMgPT09IHVuZGVmaW5lZCkgeyB5MyA9IDA7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdlb21ldHJ5IGNvbnN0YW50IHR5cGUgb2YgdGhpcyBvYmplY3Q6IGBHRU9NX0NPTlNULlRSSUFOR0xFYC5cclxuICAgICAgICAgKiBVc2VkIGZvciBmYXN0IHR5cGUgY29tcGFyaXNvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UcmlhbmdsZSN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IEdFT01fQ09OU1QuVFJJQU5HTEU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGB4YCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlRyaWFuZ2xlI3gxXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54MSA9IHgxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UcmlhbmdsZSN5MVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueTEgPSB5MTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogYHhgIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlRyaWFuZ2xlI3gyXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54MiA9IHgyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkdlb20uVHJpYW5nbGUjeTJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkyID0geTI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGB4YCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlRyaWFuZ2xlI3gzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54MyA9IHgzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UcmlhbmdsZSN5M1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueTMgPSB5MztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIHBvaW50cyBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNjb250YWluc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBjb29yZGluYXRlIHBhaXIgaXMgd2l0aGluIHRoZSB0cmlhbmdsZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQ29udGFpbnModGhpcywgeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNwZWNpZmljIHBvaW50ICBvbiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNnZXRQb2ludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLlBvaW50fSBPIC0gW291dHB1dCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFBvc2l0aW9uIGFzIGZsb2F0IHdpdGhpbiBgMGAgYW5kIGAxYC4gYDBgIGVxdWFscyB0aGUgZmlyc3QgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0cHV0XSAtIE9wdGlvbmFsIFBvaW50LCBvciBwb2ludC1saWtlIG9iamVjdCwgdGhhdCB0aGUgY2FsY3VsYXRlZCBwb2ludCB3aWxsIGJlIHdyaXR0ZW4gdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IENhbGN1bGF0ZWQgYFBvaW50YCB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbi4gSXQgaXMgdGhlIHNhbWUgYXMgYG91dHB1dGAgd2hlbiB0aGlzIHBhcmFtZXRlciBoYXMgYmVlbiBnaXZlbi5cclxuICAgICAqL1xyXG4gICAgZ2V0UG9pbnQ6IGZ1bmN0aW9uIChwb3NpdGlvbiwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHZXRQb2ludCh0aGlzLCBwb3NpdGlvbiwgb3V0cHV0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGEgbGlzdCBvZiBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIG9uIHRoZSB0cmlhbmdsZS4gSXQgaXMgZWl0aGVyIHBvc3NpYmxlIHRvIHBhc3MgYW4gYW1vdW50IG9mIHBvaW50cyB0byBiZSBnZW5lcmF0ZWQgKGBxdWFudGl0eWApIG9yIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgKGBzdGVwUmF0ZWApLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkdlb20uVHJpYW5nbGUjZ2V0UG9pbnRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnRbXX0gTyAtIFtvdXRwdXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHF1YW50aXR5IC0gTnVtYmVyIG9mIHBvaW50cyB0byBiZSBnZW5lcmF0ZWQuIENhbiBiZSBmYWxzZXkgd2hlbiBgc3RlcFJhdGVgIHNob3VsZCBiZSB1c2VkLiBBbGwgcG9pbnRzIGhhdmUgdGhlIHNhbWUgZGlzdGFuY2UgYWxvbmcgdGhlIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwUmF0ZV0gLSBEaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuIFdpbGwgb25seSBiZSB1c2VkIHdoZW4gYHF1YW50aXR5YCBpcyBmYWxzZXkuXHJcbiAgICAgKiBAcGFyYW0geyhhcnJheXxQaGFzZXIuR2VvbS5Qb2ludFtdKX0gW291dHB1dF0gLSBPcHRpb25hbCBBcnJheSBmb3Igd3JpdGluZyB0aGUgY2FsY3VsYXRlZCBwb2ludHMgaW50by4gT3RoZXJ3aXNlIGEgbmV3IGFycmF5IHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoYXJyYXl8UGhhc2VyLkdlb20uUG9pbnRbXSl9IFJldHVybnMgYSBsaXN0IG9mIGNhbGN1bGF0ZWQgYFBvaW50YCBpbnN0YW5jZXMgb3IgdGhlIGZpbGxlZCBhcnJheSBwYXNzZWQgYXMgcGFyYW1ldGVyIGBvdXRwdXRgLlxyXG4gICAgICovXHJcbiAgICBnZXRQb2ludHM6IGZ1bmN0aW9uIChxdWFudGl0eSwgc3RlcFJhdGUsIG91dHB1dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0UG9pbnRzKHRoaXMsIHF1YW50aXR5LCBzdGVwUmF0ZSwgb3V0cHV0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHBvaW50IGFsb25nIHRoZSB0cmlhbmdsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5HZW9tLlRyaWFuZ2xlI2dldFJhbmRvbVBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpYyB7UGhhc2VyLkdlb20uUG9pbnR9IE8gLSBbcG9pbnQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HZW9tLlBvaW50fSBbcG9pbnRdIC0gT3B0aW9uYWwgYFBvaW50YCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZC4gT3RoZXJ3aXNlIGEgbmV3IG9uZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdlb20uUG9pbnR9IFJhbmRvbSBgUG9pbnRgLiBXaGVuIHBhcmFtZXRlciBgcG9pbnRgIGhhcyBiZWVuIHByb3ZpZGVkIGl0IHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIGdldFJhbmRvbVBvaW50OiBmdW5jdGlvbiAocG9pbnQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFJhbmRvbSh0aGlzLCBwb2ludCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhbGwgdGhyZWUgcG9pbnRzIG9mIHRoZSB0cmlhbmdsZS4gTGVhdmluZyBvdXQgYW55IGNvb3JkaW5hdGUgc2V0cyBpdCB0byBiZSBgMGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNzZXRUb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4MT0wXSAtIGB4YCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeTE9MF0gLSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3gyPTBdIC0gYHhgIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeTI9MF0gLSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4Mz0wXSAtIGB4YCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeTM9MF0gLSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUcmlhbmdsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRvOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MylcclxuICAgIHtcclxuICAgICAgICBpZiAoeDEgPT09IHVuZGVmaW5lZCkgeyB4MSA9IDA7IH1cclxuICAgICAgICBpZiAoeTEgPT09IHVuZGVmaW5lZCkgeyB5MSA9IDA7IH1cclxuICAgICAgICBpZiAoeDIgPT09IHVuZGVmaW5lZCkgeyB4MiA9IDA7IH1cclxuICAgICAgICBpZiAoeTIgPT09IHVuZGVmaW5lZCkgeyB5MiA9IDA7IH1cclxuICAgICAgICBpZiAoeDMgPT09IHVuZGVmaW5lZCkgeyB4MyA9IDA7IH1cclxuICAgICAgICBpZiAoeTMgPT09IHVuZGVmaW5lZCkgeyB5MyA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy54MSA9IHgxO1xyXG4gICAgICAgIHRoaXMueTEgPSB5MTtcclxuXHJcbiAgICAgICAgdGhpcy54MiA9IHgyO1xyXG4gICAgICAgIHRoaXMueTIgPSB5MjtcclxuXHJcbiAgICAgICAgdGhpcy54MyA9IHgzO1xyXG4gICAgICAgIHRoaXMueTMgPSB5MztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIExpbmUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gTGluZSBBIG9mIHRoaXMgVHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNnZXRMaW5lQVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gW2xpbmVdIC0gQSBMaW5lIG9iamVjdCB0byBzZXQgdGhlIHJlc3VsdHMgaW4uIElmIGB1bmRlZmluZWRgIGEgbmV3IExpbmUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IEEgTGluZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBsaW5lIEEgb2YgdGhpcyBUcmlhbmdsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGluZUE6IGZ1bmN0aW9uIChsaW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHsgbGluZSA9IG5ldyBMaW5lKCk7IH1cclxuXHJcbiAgICAgICAgbGluZS5zZXRUbyh0aGlzLngxLCB0aGlzLnkxLCB0aGlzLngyLCB0aGlzLnkyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIExpbmUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gTGluZSBCIG9mIHRoaXMgVHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNnZXRMaW5lQlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gW2xpbmVdIC0gQSBMaW5lIG9iamVjdCB0byBzZXQgdGhlIHJlc3VsdHMgaW4uIElmIGB1bmRlZmluZWRgIGEgbmV3IExpbmUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IEEgTGluZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBsaW5lIEIgb2YgdGhpcyBUcmlhbmdsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGluZUI6IGZ1bmN0aW9uIChsaW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHsgbGluZSA9IG5ldyBMaW5lKCk7IH1cclxuXHJcbiAgICAgICAgbGluZS5zZXRUbyh0aGlzLngyLCB0aGlzLnkyLCB0aGlzLngzLCB0aGlzLnkzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIExpbmUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gTGluZSBDIG9mIHRoaXMgVHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuR2VvbS5UcmlhbmdsZSNnZXRMaW5lQ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMge1BoYXNlci5HZW9tLkxpbmV9IE8gLSBbbGluZSwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uTGluZX0gW2xpbmVdIC0gQSBMaW5lIG9iamVjdCB0byBzZXQgdGhlIHJlc3VsdHMgaW4uIElmIGB1bmRlZmluZWRgIGEgbmV3IExpbmUgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HZW9tLkxpbmV9IEEgTGluZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBsaW5lIEMgb2YgdGhpcyBUcmlhbmdsZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGluZUM6IGZ1bmN0aW9uIChsaW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChsaW5lID09PSB1bmRlZmluZWQpIHsgbGluZSA9IG5ldyBMaW5lKCk7IH1cclxuXHJcbiAgICAgICAgbGluZS5zZXRUbyh0aGlzLngzLCB0aGlzLnkzLCB0aGlzLngxLCB0aGlzLnkxKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGVmdCBtb3N0IFggY29vcmRpbmF0ZSBvZiB0aGUgdHJpYW5nbGUuIFNldHRpbmcgaXQgbW92ZXMgdGhlIHRyaWFuZ2xlIG9uIHRoZSBYIGF4aXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLkdlb20uVHJpYW5nbGUjbGVmdFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsZWZ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLngxLCB0aGlzLngyLCB0aGlzLngzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLngxIDw9IHRoaXMueDIgJiYgdGhpcy54MSA8PSB0aGlzLngzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy54MSAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMueDIgPD0gdGhpcy54MSAmJiB0aGlzLngyIDw9IHRoaXMueDMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzLngyIC0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy54MyAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLngxIC09IGRpZmY7XHJcbiAgICAgICAgICAgIHRoaXMueDIgLT0gZGlmZjtcclxuICAgICAgICAgICAgdGhpcy54MyAtPSBkaWZmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmlnaHQgbW9zdCBYIGNvb3JkaW5hdGUgb2YgdGhlIHRyaWFuZ2xlLiBTZXR0aW5nIGl0IG1vdmVzIHRoZSB0cmlhbmdsZSBvbiB0aGUgWCBheGlzIGFjY29yZGluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5HZW9tLlRyaWFuZ2xlI3JpZ2h0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLngxLCB0aGlzLngyLCB0aGlzLngzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLngxID49IHRoaXMueDIgJiYgdGhpcy54MSA+PSB0aGlzLngzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy54MSAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMueDIgPj0gdGhpcy54MSAmJiB0aGlzLngyID49IHRoaXMueDMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzLngyIC0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy54MyAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLngxIC09IGRpZmY7XHJcbiAgICAgICAgICAgIHRoaXMueDIgLT0gZGlmZjtcclxuICAgICAgICAgICAgdGhpcy54MyAtPSBkaWZmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVG9wIG1vc3QgWSBjb29yZGluYXRlIG9mIHRoZSB0cmlhbmdsZS4gU2V0dGluZyBpdCBtb3ZlcyB0aGUgdHJpYW5nbGUgb24gdGhlIFkgYXhpcyBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UcmlhbmdsZSN0b3BcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdG9wOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnkxLCB0aGlzLnkyLCB0aGlzLnkzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnkxIDw9IHRoaXMueTIgJiYgdGhpcy55MSA8PSB0aGlzLnkzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy55MSAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMueTIgPD0gdGhpcy55MSAmJiB0aGlzLnkyIDw9IHRoaXMueTMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzLnkyIC0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy55MyAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnkxIC09IGRpZmY7XHJcbiAgICAgICAgICAgIHRoaXMueTIgLT0gZGlmZjtcclxuICAgICAgICAgICAgdGhpcy55MyAtPSBkaWZmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQm90dG9tIG1vc3QgWSBjb29yZGluYXRlIG9mIHRoZSB0cmlhbmdsZS4gU2V0dGluZyBpdCBtb3ZlcyB0aGUgdHJpYW5nbGUgb24gdGhlIFkgYXhpcyBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuR2VvbS5UcmlhbmdsZSNib3R0b21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgYm90dG9tOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnkxLCB0aGlzLnkyLCB0aGlzLnkzKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnkxID49IHRoaXMueTIgJiYgdGhpcy55MSA+PSB0aGlzLnkzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy55MSAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMueTIgPj0gdGhpcy55MSAmJiB0aGlzLnkyID49IHRoaXMueTMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRpZmYgPSB0aGlzLnkyIC0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaWZmID0gdGhpcy55MyAtIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnkxIC09IGRpZmY7XHJcbiAgICAgICAgICAgIHRoaXMueTIgLT0gZGlmZjtcclxuICAgICAgICAgICAgdGhpcy55MyAtPSBkaWZmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHJpYW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRyaWFuZ2xlID0gcmVxdWlyZSgnLi9UcmlhbmdsZScpO1xyXG5cclxuVHJpYW5nbGUuQXJlYSA9IHJlcXVpcmUoJy4vQXJlYScpO1xyXG5UcmlhbmdsZS5CdWlsZEVxdWlsYXRlcmFsID0gcmVxdWlyZSgnLi9CdWlsZEVxdWlsYXRlcmFsJyk7XHJcblRyaWFuZ2xlLkJ1aWxkRnJvbVBvbHlnb24gPSByZXF1aXJlKCcuL0J1aWxkRnJvbVBvbHlnb24nKTtcclxuVHJpYW5nbGUuQnVpbGRSaWdodCA9IHJlcXVpcmUoJy4vQnVpbGRSaWdodCcpO1xyXG5UcmlhbmdsZS5DZW50ZXJPbiA9IHJlcXVpcmUoJy4vQ2VudGVyT24nKTtcclxuVHJpYW5nbGUuQ2VudHJvaWQgPSByZXF1aXJlKCcuL0NlbnRyb2lkJyk7XHJcblRyaWFuZ2xlLkNpcmN1bUNlbnRlciA9IHJlcXVpcmUoJy4vQ2lyY3VtQ2VudGVyJyk7XHJcblRyaWFuZ2xlLkNpcmN1bUNpcmNsZSA9IHJlcXVpcmUoJy4vQ2lyY3VtQ2lyY2xlJyk7XHJcblRyaWFuZ2xlLkNsb25lID0gcmVxdWlyZSgnLi9DbG9uZScpO1xyXG5UcmlhbmdsZS5Db250YWlucyA9IHJlcXVpcmUoJy4vQ29udGFpbnMnKTtcclxuVHJpYW5nbGUuQ29udGFpbnNBcnJheSA9IHJlcXVpcmUoJy4vQ29udGFpbnNBcnJheScpO1xyXG5UcmlhbmdsZS5Db250YWluc1BvaW50ID0gcmVxdWlyZSgnLi9Db250YWluc1BvaW50Jyk7XHJcblRyaWFuZ2xlLkNvcHlGcm9tID0gcmVxdWlyZSgnLi9Db3B5RnJvbScpO1xyXG5UcmlhbmdsZS5EZWNvbXBvc2UgPSByZXF1aXJlKCcuL0RlY29tcG9zZScpO1xyXG5UcmlhbmdsZS5FcXVhbHMgPSByZXF1aXJlKCcuL0VxdWFscycpO1xyXG5UcmlhbmdsZS5HZXRQb2ludCA9IHJlcXVpcmUoJy4vR2V0UG9pbnQnKTtcclxuVHJpYW5nbGUuR2V0UG9pbnRzID0gcmVxdWlyZSgnLi9HZXRQb2ludHMnKTtcclxuVHJpYW5nbGUuSW5DZW50ZXIgPSByZXF1aXJlKCcuL0luQ2VudGVyJyk7XHJcblRyaWFuZ2xlLlBlcmltZXRlciA9IHJlcXVpcmUoJy4vUGVyaW1ldGVyJyk7XHJcblRyaWFuZ2xlLk9mZnNldCA9IHJlcXVpcmUoJy4vT2Zmc2V0Jyk7XHJcblRyaWFuZ2xlLlJhbmRvbSA9IHJlcXVpcmUoJy4vUmFuZG9tJyk7XHJcblRyaWFuZ2xlLlJvdGF0ZSA9IHJlcXVpcmUoJy4vUm90YXRlJyk7XHJcblRyaWFuZ2xlLlJvdGF0ZUFyb3VuZFBvaW50ID0gcmVxdWlyZSgnLi9Sb3RhdGVBcm91bmRQb2ludCcpO1xyXG5UcmlhbmdsZS5Sb3RhdGVBcm91bmRYWSA9IHJlcXVpcmUoJy4vUm90YXRlQXJvdW5kWFknKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHJpYW5nbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgSW50ZXJhY3RpdmUgT2JqZWN0LlxyXG4gKiBcclxuICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgSW5wdXQgTWFuYWdlciB3aGVuIHlvdSBlbmFibGUgYSBHYW1lIE9iamVjdCBmb3IgaW5wdXQuXHJcbiAqXHJcbiAqIFRoZSByZXN1bHRpbmcgSW50ZXJhY3RpdmUgT2JqZWN0IGlzIG1hcHBlZCB0byB0aGUgR2FtZSBPYmplY3QncyBgaW5wdXRgIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLklucHV0LkNyZWF0ZUludGVyYWN0aXZlT2JqZWN0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIHdoaWNoIHRoaXMgSW50ZXJhY3RpdmUgT2JqZWN0IGlzIGJvdW5kLlxyXG4gKiBAcGFyYW0ge2FueX0gaGl0QXJlYSAtIFRoZSBoaXQgYXJlYSBmb3IgdGhpcyBJbnRlcmFjdGl2ZSBPYmplY3QuIFR5cGljYWxseSBhIGdlb21ldHJ5IHNoYXBlLCBsaWtlIGEgUmVjdGFuZ2xlIG9yIENpcmNsZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBoaXRBcmVhQ2FsbGJhY2sgLSBUaGUgJ2NvbnRhaW5zJyBjaGVjayBjYWxsYmFjayB0aGF0IHRoZSBoaXQgYXJlYSBzaGFwZSB3aWxsIHVzZSBmb3IgYWxsIGhpdCB0ZXN0cy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlR5cGVzLklucHV0LkludGVyYWN0aXZlT2JqZWN0fSBUaGUgbmV3IEludGVyYWN0aXZlIE9iamVjdC5cclxuICovXHJcbnZhciBDcmVhdGVJbnRlcmFjdGl2ZU9iamVjdCA9IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBoaXRBcmVhLCBoaXRBcmVhQ2FsbGJhY2spXHJcbntcclxuICAgIHJldHVybiB7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3Q6IGdhbWVPYmplY3QsXHJcblxyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWx3YXlzRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcclxuICAgICAgICBkcm9wWm9uZTogZmFsc2UsXHJcbiAgICAgICAgY3Vyc29yOiBmYWxzZSxcclxuXHJcbiAgICAgICAgdGFyZ2V0OiBudWxsLFxyXG5cclxuICAgICAgICBjYW1lcmE6IG51bGwsXHJcblxyXG4gICAgICAgIGhpdEFyZWE6IGhpdEFyZWEsXHJcbiAgICAgICAgaGl0QXJlYUNhbGxiYWNrOiBoaXRBcmVhQ2FsbGJhY2ssXHJcbiAgICAgICAgaGl0QXJlYURlYnVnOiBudWxsLFxyXG5cclxuICAgICAgICAvLyAgSGFzIHRoZSBkZXYgc3BlY2lmaWVkIHRoZWlyIG93biBzaGFwZSwgb3IgaXMgdGhpcyBib3VuZCB0byB0aGUgdGV4dHVyZSBzaXplP1xyXG4gICAgICAgIGN1c3RvbUhpdEFyZWE6IGZhbHNlLFxyXG5cclxuICAgICAgICBsb2NhbFg6IDAsXHJcbiAgICAgICAgbG9jYWxZOiAwLFxyXG5cclxuICAgICAgICAvLyAgMCA9IE5vdCBiZWluZyBkcmFnZ2VkXHJcbiAgICAgICAgLy8gIDEgPSBCZWluZyBjaGVja2VkIGZvciBkcmFnZ2luZ1xyXG4gICAgICAgIC8vICAyID0gQmVpbmcgZHJhZ2dlZFxyXG4gICAgICAgIGRyYWdTdGF0ZTogMCxcclxuXHJcbiAgICAgICAgZHJhZ1N0YXJ0WDogMCxcclxuICAgICAgICBkcmFnU3RhcnRZOiAwLFxyXG4gICAgICAgIGRyYWdTdGFydFhHbG9iYWw6IDAsXHJcbiAgICAgICAgZHJhZ1N0YXJ0WUdsb2JhbDogMCxcclxuXHJcbiAgICAgICAgZHJhZ1g6IDAsXHJcbiAgICAgICAgZHJhZ1k6IDBcclxuXHJcbiAgICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDcmVhdGVJbnRlcmFjdGl2ZU9iamVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBQaXhlbCBQZXJmZWN0IEhhbmRsZXIgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEFjY2VzcyB2aWEgYElucHV0UGx1Z2luLm1ha2VQaXhlbFBlcmZlY3RgIHJhdGhlciB0aGFuIGNhbGxpbmcgaXQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuSW5wdXQuQ3JlYXRlUGl4ZWxQZXJmZWN0SGFuZGxlclxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfSB0ZXh0dXJlTWFuYWdlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gYWxwaGFUb2xlcmFuY2UgLSBUaGUgYWxwaGEgbGV2ZWwgdGhhdCB0aGUgcGl4ZWwgc2hvdWxkIGJlIGFib3ZlIHRvIGJlIGluY2x1ZGVkIGFzIGEgc3VjY2Vzc2Z1bCBpbnRlcmFjdGlvbi5cclxuICpcclxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBuZXcgUGl4ZWwgUGVyZmVjdCBIYW5kbGVyIGZ1bmN0aW9uLlxyXG4gKi9cclxudmFyIENyZWF0ZVBpeGVsUGVyZmVjdEhhbmRsZXIgPSBmdW5jdGlvbiAodGV4dHVyZU1hbmFnZXIsIGFscGhhVG9sZXJhbmNlKVxyXG57XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGhpdEFyZWEsIHgsIHksIGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFscGhhID0gdGV4dHVyZU1hbmFnZXIuZ2V0UGl4ZWxBbHBoYSh4LCB5LCBnYW1lT2JqZWN0LnRleHR1cmUua2V5LCBnYW1lT2JqZWN0LmZyYW1lLm5hbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKGFscGhhICYmIGFscGhhID49IGFscGhhVG9sZXJhbmNlKTtcclxuICAgIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENyZWF0ZVBpeGVsUGVyZmVjdEhhbmRsZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgS2V5Ym9hcmQgPSByZXF1aXJlKCcuL2tleWJvYXJkL0tleWJvYXJkTWFuYWdlcicpO1xyXG52YXIgTW91c2UgPSByZXF1aXJlKCcuL21vdXNlL01vdXNlTWFuYWdlcicpO1xyXG52YXIgUG9pbnRlciA9IHJlcXVpcmUoJy4vUG9pbnRlcicpO1xyXG52YXIgVG91Y2ggPSByZXF1aXJlKCcuL3RvdWNoL1RvdWNoTWFuYWdlcicpO1xyXG52YXIgVHJhbnNmb3JtTWF0cml4ID0gcmVxdWlyZSgnLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cy9UcmFuc2Zvcm1NYXRyaXgnKTtcclxudmFyIFRyYW5zZm9ybVhZID0gcmVxdWlyZSgnLi4vbWF0aC9UcmFuc2Zvcm1YWScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIElucHV0IE1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSBwb2ludGVyIHJlbGF0ZWQgc3lzdGVtcyBpbiBhIHNpbmdsZSBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICpcclxuICogQmFzZWQgb24gdGhlIEdhbWUgQ29uZmlnIGl0IHdpbGwgY3JlYXRlIGhhbmRsZXJzIGZvciBtb3VzZSBhbmQgdG91Y2ggc3VwcG9ydC5cclxuICpcclxuICogS2V5Ym9hcmQgYW5kIEdhbWVwYWQgYXJlIHBsdWdpbnMsIGhhbmRsZWQgZGlyZWN0bHkgYnkgdGhlIElucHV0UGx1Z2luIGNsYXNzLlxyXG4gKlxyXG4gKiBJdCB0aGVuIG1hbmFnZXMgdGhlIGV2ZW50cywgcG9pbnRlciBjcmVhdGlvbiBhbmQgZ2VuZXJhbCBoaXQgdGVzdCByZWxhdGVkIG9wZXJhdGlvbnMuXHJcbiAqXHJcbiAqIFlvdSByYXJlbHkgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBJbnB1dCBNYW5hZ2VyIGRpcmVjdGx5LCBhbmQgYXMgc3VjaCwgYWxsIG9mIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzXHJcbiAqIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBzaG91bGQgdXNlIHRoZSBJbnB1dCBQbHVnaW4sIHdoaWNoIGlzIGEgU2NlbmUgbGV2ZWwgc3lzdGVtLCByZXNwb25zaWJsZVxyXG4gKiBmb3IgZGVhbGluZyB3aXRoIGFsbCBpbnB1dCBldmVudHMgZm9yIGEgU2NlbmUuXHJcbiAqXHJcbiAqIEBjbGFzcyBJbnB1dE1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5JbnB1dFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWV9IGdhbWUgLSBUaGUgR2FtZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhlIElucHV0IE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgSW5wdXQgQ29uZmlndXJhdGlvbiBvYmplY3QsIGFzIHNldCBpbiB0aGUgR2FtZSBDb25maWcuXHJcbiAqL1xyXG52YXIgSW5wdXRNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIElucHV0TWFuYWdlciAoZ2FtZSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHYW1lIGluc3RhbmNlIHRoYXQgb3ducyB0aGUgSW5wdXQgTWFuYWdlci5cclxuICAgICAgICAgKiBBIEdhbWUgb25seSBtYWludGFpbnMgb24gaW5zdGFuY2Ugb2YgdGhlIElucHV0IE1hbmFnZXIgYXQgYW55IHRpbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBHYW1lIFNjYWxlIE1hbmFnZXIuXHJcbiAgICAgICAgICogVXNlZCBmb3IgYWxsIGJvdW5kcyBjaGVja3MgYW5kIHBvaW50ZXIgc2NhbGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjc2NhbGVNYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NhbGVNYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQ2FudmFzIHRoYXQgaXMgdXNlZCBmb3IgYWxsIERPTSBldmVudCBpbnB1dCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2NhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbnZhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEdhbWUgQ29uZmlndXJhdGlvbiBvYmplY3QsIGFzIHNldCBkdXJpbmcgdGhlIGdhbWUgYm9vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjY29uZmlnXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5Db3JlLkNvbmZpZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgc2V0LCB0aGUgSW5wdXQgTWFuYWdlciB3aWxsIHJ1biBpdHMgdXBkYXRlIGxvb3AgZXZlcnkgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2VuYWJsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEV2ZW50IEVtaXR0ZXIgaW5zdGFuY2UgdGhhdCB0aGUgSW5wdXQgTWFuYWdlciB1c2VzIHRvIGVtaXQgZXZlbnRzIGZyb20uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2V2ZW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXJlIGFueSBtb3VzZSBvciB0b3VjaCBwb2ludGVycyBjdXJyZW50bHkgb3ZlciB0aGUgZ2FtZSBjYW52YXM/XHJcbiAgICAgICAgICogVGhpcyBpcyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbnZhcyBvdmVyIGFuZCBvdXQgaGFuZGxlcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2lzT3ZlclxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzT3ZlciA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IENTUyBjdXJzb3IgdG8gYmUgdXNlZCB3aGVuIGludGVyYWN0aW5nIHdpdGggeW91ciBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogU2VlIHRoZSBgc2V0RGVmYXVsdEN1cnNvcmAgbWV0aG9kIGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2RlZmF1bHRDdXJzb3JcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlZmF1bHRDdXJzb3IgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEtleWJvYXJkIE1hbmFnZXIgY2xhc3MsIGlmIGVuYWJsZWQgdmlhIHRoZSBgaW5wdXQua2V5Ym9hcmRgIEdhbWUgQ29uZmlnIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNrZXlib2FyZFxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5rZXlib2FyZCA9IChjb25maWcuaW5wdXRLZXlib2FyZCkgPyBuZXcgS2V5Ym9hcmQodGhpcykgOiBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTW91c2UgTWFuYWdlciBjbGFzcywgaWYgZW5hYmxlZCB2aWEgdGhlIGBpbnB1dC5tb3VzZWAgR2FtZSBDb25maWcgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI21vdXNlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW91c2UgPSAoY29uZmlnLmlucHV0TW91c2UpID8gbmV3IE1vdXNlKHRoaXMpIDogbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFRvdWNoIE1hbmFnZXIgY2xhc3MsIGlmIGVuYWJsZWQgdmlhIHRoZSBgaW5wdXQudG91Y2hgIEdhbWUgQ29uZmlnIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciN0b3VjaFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuVG91Y2guVG91Y2hNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG91Y2ggPSAoY29uZmlnLmlucHV0VG91Y2gpID8gbmV3IFRvdWNoKHRoaXMpIDogbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgUG9pbnRlcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGdhbWUuXHJcbiAgICAgICAgICogVGhlIGZpcnN0IGVudHJ5IGlzIHJlc2VydmVkIGZvciB0aGUgTW91c2UgUG9pbnRlciwgdGhlIHJlc3QgYXJlIFRvdWNoIFBvaW50ZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQnkgZGVmYXVsdCB0aGVyZSBpcyAxIHRvdWNoIHBvaW50ZXIgZW5hYmxlZC4gSWYgeW91IG5lZWQgbW9yZSB1c2UgdGhlIGBhZGRQb2ludGVyYCBtZXRob2QgdG8gc3RhcnQgdGhlbSxcclxuICAgICAgICAgKiBvciBzZXQgdGhlIGBpbnB1dC5hY3RpdmVQb2ludGVyc2AgcHJvcGVydHkgaW4gdGhlIEdhbWUgQ29uZmlnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNwb2ludGVyc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcltdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvaW50ZXJzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgdG91Y2ggb2JqZWN0cyBhY3RpdmF0ZWQgYW5kIGJlaW5nIHByb2Nlc3NlZCBlYWNoIHVwZGF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gY2hhbmdlIHRoaXMgYnkgZWl0aGVyIGNhbGxpbmcgYGFkZFBvaW50ZXJgIGF0IHJ1bi10aW1lLCBvciBieVxyXG4gICAgICAgICAqIHNldHRpbmcgdGhlIGBpbnB1dC5hY3RpdmVQb2ludGVyc2AgcHJvcGVydHkgaW4gdGhlIEdhbWUgQ29uZmlnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNwb2ludGVyc1RvdGFsXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9pbnRlcnNUb3RhbCA9IGNvbmZpZy5pbnB1dEFjdGl2ZVBvaW50ZXJzO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLmlucHV0VG91Y2ggJiYgdGhpcy5wb2ludGVyc1RvdGFsID09PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb2ludGVyc1RvdGFsID0gMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRoaXMucG9pbnRlcnNUb3RhbDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBuZXcgUG9pbnRlcih0aGlzLCBpKTtcclxuXHJcbiAgICAgICAgICAgIHBvaW50ZXIuc21vb3RoRmFjdG9yID0gY29uZmlnLmlucHV0U21vb3RoRmFjdG9yO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1vdXNlIGhhcyBpdHMgb3duIHVuaXF1ZSBQb2ludGVyIG9iamVjdCwgd2hpY2ggeW91IGNhbiByZWZlcmVuY2UgZGlyZWN0bHkgaWYgbWFraW5nIGEgX2Rlc2t0b3Agc3BlY2lmaWMgZ2FtZV8uXHJcbiAgICAgICAgICogSWYgeW91IGFyZSBzdXBwb3J0aW5nIGJvdGggZGVza3RvcCBhbmQgdG91Y2ggZGV2aWNlcyB0aGVuIGRvIG5vdCB1c2UgdGhpcyBwcm9wZXJ0eSwgaW5zdGVhZCB1c2UgYGFjdGl2ZVBvaW50ZXJgXHJcbiAgICAgICAgICogd2hpY2ggd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBtb3N0IHJlY2VudGx5IGludGVyYWN0ZWQgcG9pbnRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjbW91c2VQb2ludGVyXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tb3VzZVBvaW50ZXIgPSAoY29uZmlnLmlucHV0TW91c2UpID8gdGhpcy5wb2ludGVyc1swXSA6IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtb3N0IHJlY2VudGx5IGFjdGl2ZSBQb2ludGVyIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIHlvdSd2ZSBvbmx5IDEgUG9pbnRlciBpbiB5b3VyIGdhbWUgdGhlbiB0aGlzIHdpbGwgYWNjdXJhdGVseSBiZSBlaXRoZXIgdGhlIGZpcnN0IGZpbmdlciB0b3VjaGVkLCBvciB0aGUgbW91c2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJZiB5b3VyIGdhbWUgZG9lc24ndCBuZWVkIHRvIHN1cHBvcnQgbXVsdGktdG91Y2ggdGhlbiB5b3UgY2FuIHNhZmVseSB1c2UgdGhpcyBwcm9wZXJ0eSBpbiBhbGwgb2YgeW91ciBnYW1lXHJcbiAgICAgICAgICogY29kZSBhbmQgaXQgd2lsbCBhZGFwdCB0byBiZSBlaXRoZXIgdGhlIG1vdXNlIG9yIHRoZSB0b3VjaCwgYmFzZWQgb24gZGV2aWNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNhY3RpdmVQb2ludGVyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5Qb2ludGVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlUG9pbnRlciA9IHRoaXMucG9pbnRlcnNbMF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoZSB0b3AtbW9zdCBTY2VuZSBpbiB0aGUgU2NlbmUgTGlzdCByZWNlaXZlcyBhbiBpbnB1dCBpdCB3aWxsIHN0b3AgaW5wdXQgZnJvbVxyXG4gICAgICAgICAqIHByb3BhZ2F0aW5nIGFueSBsb3dlciBkb3duIHRoZSBzY2VuZSBsaXN0LCBpLmUuIGlmIHlvdSBoYXZlIGEgVUkgU2NlbmUgYXQgdGhlIHRvcFxyXG4gICAgICAgICAqIGFuZCBjbGljayBzb21ldGhpbmcgb24gaXQsIHRoYXQgY2xpY2sgd2lsbCBub3QgdGhlbiBiZSBwYXNzZWQgZG93biB0byBhbnkgb3RoZXJcclxuICAgICAgICAgKiBTY2VuZSBiZWxvdy4gRGlzYWJsZSB0aGlzIHRvIGhhdmUgaW5wdXQgZXZlbnRzIHBhc3NlZCB0aHJvdWdoIGFsbCBTY2VuZXMsIGFsbCB0aGUgdGltZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjZ2xvYmFsVG9wT25seVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsb2JhbFRvcE9ubHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZSB0aGlzIElucHV0IE1hbmFnZXIgd2FzIGxhc3QgdXBkYXRlZC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHBvcHVsYXRlZCBieSB0aGUgR2FtZSBTdGVwIGVhY2ggZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI3RpbWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjJcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlLWN5Y2xlZCBwb2ludC1saWtlIG9iamVjdCB0byBzdG9yZSBoaXQgdGVzdCB2YWx1ZXMgaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI190ZW1wUG9pbnRcclxuICAgICAgICAgKiBAdHlwZSB7e3g6bnVtYmVyLCB5Om51bWJlcn19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wUG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZS1jeWNsZWQgYXJyYXkgdG8gc3RvcmUgaGl0IHJlc3VsdHMgaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI190ZW1wSGl0VGVzdFxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFtdXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcEhpdFRlc3QgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZS1jeWNsZWQgbWF0cml4IHVzZWQgaW4gaGl0IHRlc3QgY2FsY3VsYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNfdGVtcE1hdHJpeFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4ID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlLWN5Y2xlZCBtYXRyaXggdXNlZCBpbiBoaXQgdGVzdCBjYWxjdWxhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI190ZW1wTWF0cml4MlxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDIgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVybmFsIHByaXZhdGUgdmFyIHRoYXQgcmVjb3JkcyBTY2VuZXMgYWJvcnRpbmcgZXZlbnQgcHJvY2Vzc2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjX3RlbXBTa2lwXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcFNraXAgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW50ZXJuYWwgcHJpdmF0ZSBhcnJheSB0aGF0IGF2b2lkcyBuZWVkaW5nIHRvIGNyZWF0ZSBhIG5ldyBhcnJheSBvbiBldmVyeSBET00gbW91c2UgZXZlbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI21vdXNlUG9pbnRlckNvbnRhaW5lclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcltdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW91c2VQb2ludGVyQ29udGFpbmVyID0gWyB0aGlzLm1vdXNlUG9pbnRlciBdO1xyXG5cclxuICAgICAgICBnYW1lLmV2ZW50cy5vbmNlKEdhbWVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQm9vdCBoYW5kbGVyIGlzIGNhbGxlZCBieSBQaGFzZXIuR2FtZSB3aGVuIGl0IGZpcnN0IHN0YXJ0cyB1cC5cclxuICAgICAqIFRoZSByZW5kZXJlciBpcyBhdmFpbGFibGUgYnkgbm93LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNib290XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNNQU5BR0VSX0JPT1RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gdGhpcy5nYW1lLmNhbnZhcztcclxuXHJcbiAgICAgICAgdGhpcy5zY2FsZU1hbmFnZXIgPSB0aGlzLmdhbWUuc2NhbGU7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLk1BTkFHRVJfQk9PVCk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub24oR2FtZUV2ZW50cy5QUkVfUkVOREVSLCB0aGlzLnByZVJlbmRlciwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgY2FudmFzIHN0YXRlIGNoYW5nZSwgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIE1vdXNlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI3NldENhbnZhc092ZXJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVfT1ZFUlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhNb3VzZUV2ZW50fFRvdWNoRXZlbnQpfSBldmVudCAtIFRoZSBET00gRXZlbnQuXHJcbiAgICAgKi9cclxuICAgIHNldENhbnZhc092ZXI6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzT3ZlciA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLkdBTUVfT1ZFUiwgZXZlbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGNhbnZhcyBzdGF0ZSBjaGFuZ2UsIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNb3VzZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNzZXRDYW52YXNPdXRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVfT1VUXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KE1vdXNlRXZlbnR8VG91Y2hFdmVudCl9IGV2ZW50IC0gVGhlIERPTSBFdmVudC5cclxuICAgICAqL1xyXG4gICAgc2V0Q2FudmFzT3V0OiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuR0FNRV9PVVQsIGV2ZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB1cGRhdGUsIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBHYW1lIFN0ZXAgcmlnaHQgYXQgdGhlIHN0YXJ0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNwcmVSZW5kZXJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKi9cclxuICAgIHByZVJlbmRlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZSA9IHRoaXMuZ2FtZS5sb29wLm5vdztcclxuICAgICAgICB2YXIgZGVsdGEgPSB0aGlzLmdhbWUubG9vcC5kZWx0YTtcclxuICAgICAgICB2YXIgc2NlbmVzID0gdGhpcy5nYW1lLnNjZW5lLmdldFNjZW5lcyh0cnVlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgdGhpcy50aW1lID0gdGltZTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuTUFOQUdFUl9VUERBVEUpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjZW5lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IHNjZW5lc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzY2VuZS5zeXMuaW5wdXQgJiYgc2NlbmUuc3lzLmlucHV0LnVwZGF0ZVBvbGwodGltZSwgZGVsdGEpICYmIHRoaXMuZ2xvYmFsVG9wT25seSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIElmIHRoZSBTY2VuZSByZXR1cm5zIHRydWUsIGl0IG1lYW5zIGl0IGNhcHR1cmVkIHNvbWUgaW5wdXQgdGhhdCBubyBvdGhlciBTY2VuZSBzaG91bGQgZ2V0LCBzbyB3ZSBiYWlsIG91dFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGxzIHRoZSBJbnB1dCBzeXN0ZW0gdG8gc2V0IGEgY3VzdG9tIGN1cnNvci5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBjdXJzb3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBjdXJzb3IgdXNlZCB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGdhbWUgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIElmIGFuIEludGVyYWN0aXZlIE9iamVjdCBhbHNvIHNldHMgYSBjdXN0b20gY3Vyc29yLCB0aGlzIGlzIHRoZSBjdXJzb3IgdGhhdCBpcyByZXNldCBhZnRlciBpdHMgdXNlLlxyXG4gICAgICpcclxuICAgICAqIEFueSB2YWxpZCBDU1MgY3Vyc29yIHZhbHVlIGlzIGFsbG93ZWQsIGluY2x1ZGluZyBwYXRocyB0byBpbWFnZSBmaWxlcywgaS5lLjpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LnNldERlZmF1bHRDdXJzb3IoJ3VybChhc3NldHMvY3Vyc29ycy9zd29yZC5jdXIpLCBwb2ludGVyJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIHJlYWQgYWJvdXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYnJvd3NlcnMgd2hlbiBpdCBjb21lcyB0byB0aGUgZmlsZSBmb3JtYXRzIGFuZCBzaXplcyB0aGV5IHN1cHBvcnQ6XHJcbiAgICAgKlxyXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2N1cnNvclxyXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XHJcbiAgICAgKlxyXG4gICAgICogSXQncyB1cCB0byB5b3UgdG8gcGljayBhIHN1aXRhYmxlIGN1cnNvciBmb3JtYXQgdGhhdCB3b3JrcyBhY3Jvc3MgdGhlIHJhbmdlIG9mIGJyb3dzZXJzIHlvdSBuZWVkIHRvIHN1cHBvcnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI3NldERlZmF1bHRDdXJzb3JcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnNvciAtIFRoZSBDU1MgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIGRlZmF1bHQgY3Vyc29yLlxyXG4gICAgICovXHJcbiAgICBzZXREZWZhdWx0Q3Vyc29yOiBmdW5jdGlvbiAoY3Vyc29yKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEN1cnNvciA9IGN1cnNvcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciAhPT0gY3Vyc29yKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIElucHV0UGx1Z2luIHdoZW4gcHJvY2Vzc2luZyBvdmVyIGFuZCBvdXQgZXZlbnRzLlxyXG4gICAgICogXHJcbiAgICAgKiBUZWxscyB0aGUgSW5wdXQgTWFuYWdlciB0byBzZXQgYSBjdXN0b20gY3Vyc29yIGR1cmluZyBpdHMgcG9zdFVwZGF0ZSBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9jdXJzb3JcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjc2V0Q3Vyc29yXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5JbnRlcmFjdGl2ZU9iamVjdH0gaW50ZXJhY3RpdmVPYmplY3QgLSBUaGUgSW50ZXJhY3RpdmUgT2JqZWN0IHRoYXQgY2FsbGVkIHRoaXMgbWV0aG9kLlxyXG4gICAgICovXHJcbiAgICBzZXRDdXJzb3I6IGZ1bmN0aW9uIChpbnRlcmFjdGl2ZU9iamVjdClcclxuICAgIHtcclxuICAgICAgICBpZiAoaW50ZXJhY3RpdmVPYmplY3QuY3Vyc29yKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuY3Vyc29yID0gaW50ZXJhY3RpdmVPYmplY3QuY3Vyc29yO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIElucHV0UGx1Z2luIHdoZW4gcHJvY2Vzc2luZyBvdmVyIGFuZCBvdXQgZXZlbnRzLlxyXG4gICAgICogXHJcbiAgICAgKiBUZWxscyB0aGUgSW5wdXQgTWFuYWdlciB0byBjbGVhciB0aGUgaGFuZCBjdXJzb3IsIGlmIHNldCwgZHVyaW5nIGl0cyBwb3N0VXBkYXRlIHN0ZXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI3Jlc2V0Q3Vyc29yXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5JbnRlcmFjdGl2ZU9iamVjdH0gaW50ZXJhY3RpdmVPYmplY3QgLSBUaGUgSW50ZXJhY3RpdmUgT2JqZWN0IHRoYXQgY2FsbGVkIHRoaXMgbWV0aG9kLlxyXG4gICAgICovXHJcbiAgICByZXNldEN1cnNvcjogZnVuY3Rpb24gKGludGVyYWN0aXZlT2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpbnRlcmFjdGl2ZU9iamVjdC5jdXJzb3IgJiYgdGhpcy5jYW52YXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSB0aGlzLmRlZmF1bHRDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgbmV3IFBvaW50ZXIgb2JqZWN0cyB0byB0aGUgSW5wdXQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBCeSBkZWZhdWx0IFBoYXNlciBjcmVhdGVzIDIgcG9pbnRlciBvYmplY3RzOiBgbW91c2VQb2ludGVyYCBhbmQgYHBvaW50ZXIxYC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBtb3JlIGVpdGhlciBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBvciBieSBzZXR0aW5nIHRoZSBgaW5wdXQuYWN0aXZlUG9pbnRlcnNgIHByb3BlcnR5XHJcbiAgICAgKiBpbiB0aGUgR2FtZSBDb25maWcsIHVwIHRvIGEgbWF4aW11bSBvZiAxMCBwb2ludGVycy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZmlyc3QgMTAgcG9pbnRlcnMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlIGBJbnB1dFBsdWdpbi5wb2ludGVyWGAgcHJvcGVydGllcywgb25jZSB0aGV5IGhhdmUgYmVlbiBhZGRlZFxyXG4gICAgICogdmlhIHRoaXMgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNhZGRQb2ludGVyXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcXVhbnRpdHk9MV0gVGhlIG51bWJlciBvZiBuZXcgUG9pbnRlcnMgdG8gY3JlYXRlLiBBIG1heGltdW0gb2YgMTAgaXMgYWxsb3dlZCBpbiB0b3RhbC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuSW5wdXQuUG9pbnRlcltdfSBBbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgbmV3IFBvaW50ZXIgb2JqZWN0cyB0aGF0IHdlcmUgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkUG9pbnRlcjogZnVuY3Rpb24gKHF1YW50aXR5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChxdWFudGl0eSA9PT0gdW5kZWZpbmVkKSB7IHF1YW50aXR5ID0gMTsgfVxyXG5cclxuICAgICAgICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvaW50ZXJzVG90YWwgKyBxdWFudGl0eSA+IDEwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcXVhbnRpdHkgPSAxMCAtIHRoaXMucG9pbnRlcnNUb3RhbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVhbnRpdHk7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucG9pbnRlcnMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBuZXcgUG9pbnRlcih0aGlzLCBpZCk7XHJcblxyXG4gICAgICAgICAgICBwb2ludGVyLnNtb290aEZhY3RvciA9IHRoaXMuY29uZmlnLmlucHV0U21vb3RoRmFjdG9yO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb2ludGVycy5wdXNoKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb2ludGVyc1RvdGFsKys7XHJcblxyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChwb2ludGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgZ2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSBhY3RpdmUgSW5wdXQgUGx1Z2lucyBpbiB0aGUgZ2FtZVxyXG4gICAgICogYW5kIHVwZGF0ZXMgZWFjaCBvZiB0aGVtIGluIHR1cm4sIGluIHJldmVyc2Ugb3JkZXIgKHRvcCB0byBib3R0b20pLCB0byBhbGxvd1xyXG4gICAgICogZm9yIERPTSB0b3AtbGV2ZWwgZXZlbnQgaGFuZGxpbmcgc2ltdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjdXBkYXRlSW5wdXRQbHVnaW5zXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0eXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgdG8gcHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJbXX0gcG9pbnRlcnMgLSBBbiBhcnJheSBvZiBQb2ludGVycyBvbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUlucHV0UGx1Z2luczogZnVuY3Rpb24gKHR5cGUsIHBvaW50ZXJzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZXMgPSB0aGlzLmdhbWUuc2NlbmUuZ2V0U2NlbmVzKHRydWUsIHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLl90ZW1wU2tpcCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjZW5lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IHNjZW5lc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzY2VuZS5zeXMuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYXB0dXJlID0gc2NlbmUuc3lzLmlucHV0LnVwZGF0ZSh0eXBlLCBwb2ludGVycyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChjYXB0dXJlICYmIHRoaXMuZ2xvYmFsVG9wT25seSkgfHwgdGhpcy5fdGVtcFNraXApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIElmIHRoZSBTY2VuZSByZXR1cm5zIHRydWUsIG9yIGNhbGxlZCBzdG9wUHJvcGFnYXRpb24sIGl0IG1lYW5zIGl0IGNhcHR1cmVkIHNvbWUgaW5wdXQgdGhhdCBubyBvdGhlciBTY2VuZSBzaG91bGQgZ2V0LCBzbyB3ZSBiYWlsIG91dFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gIGV2ZW50LnRhcmdldFRvdWNoZXMgPSBsaXN0IG9mIGFsbCB0b3VjaGVzIG9uIHRoZSBUQVJHRVQgRUxFTUVOVCAoaS5lLiBnYW1lIGRvbSBlbGVtZW50KVxyXG4gICAgLy8gIGV2ZW50LnRvdWNoZXMgPSBsaXN0IG9mIGFsbCB0b3VjaGVzIG9uIHRoZSBFTlRJUkUgRE9DVU1FTlQsIG5vdCBqdXN0IHRoZSB0YXJnZXQgZWxlbWVudFxyXG4gICAgLy8gIGV2ZW50LmNoYW5nZWRUb3VjaGVzID0gdGhlIHRvdWNoZXMgdGhhdCBDSEFOR0VEIGluIHRoaXMgZXZlbnQsIG5vdCB0aGUgdG90YWwgbnVtYmVyIG9mIHRoZW1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhIHRvdWNoIHN0YXJ0IGV2ZW50LCBhcyBwYXNzZWQgaW4gYnkgdGhlIFRvdWNoTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjb25Ub3VjaFN0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBUb3VjaCBldmVudC5cclxuICAgICAqL1xyXG4gICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvaW50ZXJzID0gdGhpcy5wb2ludGVycztcclxuICAgICAgICB2YXIgY2hhbmdlZCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgYysrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNoYW5nZWRUb3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2NdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnBvaW50ZXJzVG90YWw7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBwb2ludGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXBvaW50ZXIuYWN0aXZlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXIudG91Y2hzdGFydChjaGFuZ2VkVG91Y2gsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQb2ludGVyID0gcG9pbnRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dFBsdWdpbnMoQ09OU1QuVE9VQ0hfU1RBUlQsIGNoYW5nZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhIHRvdWNoIG1vdmUgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgVG91Y2hNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvblRvdWNoTW92ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gVG91Y2ggZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvaW50ZXJzID0gdGhpcy5wb2ludGVycztcclxuICAgICAgICB2YXIgY2hhbmdlZCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgYysrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNoYW5nZWRUb3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2NdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnBvaW50ZXJzVG90YWw7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBwb2ludGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRlci5hY3RpdmUgJiYgcG9pbnRlci5pZGVudGlmaWVyID09PSBjaGFuZ2VkVG91Y2guaWRlbnRpZmllcilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLnRvdWNobW92ZShjaGFuZ2VkVG91Y2gsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQb2ludGVyID0gcG9pbnRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dFBsdWdpbnMoQ09OU1QuVE9VQ0hfTU9WRSwgY2hhbmdlZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vICBGb3IgdG91Y2ggZW5kIGl0cyBhIGxpc3Qgb2YgdGhlIHRvdWNoIHBvaW50cyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN1cmZhY2VcclxuICAgIC8vICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RPTS9Ub3VjaExpc3RcclxuICAgIC8vICBldmVudC5jaGFuZ2VkVG91Y2hlcyA9IHRoZSB0b3VjaGVzIHRoYXQgQ0hBTkdFRCBpbiB0aGlzIGV2ZW50LCBub3QgdGhlIHRvdGFsIG51bWJlciBvZiB0aGVtXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgYSB0b3VjaCBlbmQgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgVG91Y2hNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvblRvdWNoRW5kXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBUb3VjaCBldmVudC5cclxuICAgICAqL1xyXG4gICAgb25Ub3VjaEVuZDogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwb2ludGVycyA9IHRoaXMucG9pbnRlcnM7XHJcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGMrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGFuZ2VkVG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tjXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5wb2ludGVyc1RvdGFsOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gcG9pbnRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ZXIuYWN0aXZlICYmIHBvaW50ZXIuaWRlbnRpZmllciA9PT0gY2hhbmdlZFRvdWNoLmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlci50b3VjaGVuZChjaGFuZ2VkVG91Y2gsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dFBsdWdpbnMoQ09OU1QuVE9VQ0hfRU5ELCBjaGFuZ2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgYSB0b3VjaCBjYW5jZWwgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgVG91Y2hNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvblRvdWNoQ2FuY2VsXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBUb3VjaCBldmVudC5cclxuICAgICAqL1xyXG4gICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwb2ludGVycyA9IHRoaXMucG9pbnRlcnM7XHJcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGMrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGFuZ2VkVG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tjXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5wb2ludGVyc1RvdGFsOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gcG9pbnRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ZXIuYWN0aXZlICYmIHBvaW50ZXIuaWRlbnRpZmllciA9PT0gY2hhbmdlZFRvdWNoLmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlci50b3VjaGNhbmNlbChjaGFuZ2VkVG91Y2gsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dFBsdWdpbnMoQ09OU1QuVE9VQ0hfQ0FOQ0VMLCBjaGFuZ2VkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBkb3duIGV2ZW50LCBhcyBwYXNzZWQgaW4gYnkgdGhlIE1vdXNlTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjb25Nb3VzZURvd25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgRE9NIE1vdXNlIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubW91c2VQb2ludGVyLmRvd24oZXZlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLm1vdXNlUG9pbnRlci51cGRhdGVNb3Rpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dFBsdWdpbnMoQ09OU1QuTU9VU0VfRE9XTiwgdGhpcy5tb3VzZVBvaW50ZXJDb250YWluZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhIG1vdXNlIG1vdmUgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgTW91c2VNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvbk1vdXNlTW92ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gTW91c2UgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tb3VzZVBvaW50ZXIubW92ZShldmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VQb2ludGVyLnVwZGF0ZU1vdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0UGx1Z2lucyhDT05TVC5NT1VTRV9NT1ZFLCB0aGlzLm1vdXNlUG9pbnRlckNvbnRhaW5lcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2Vzc2VzIGEgbW91c2UgdXAgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgTW91c2VNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvbk1vdXNlVXBcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgRE9NIE1vdXNlIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1vdXNlUG9pbnRlci51cChldmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VQb2ludGVyLnVwZGF0ZU1vdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0UGx1Z2lucyhDT05TVC5NT1VTRV9VUCwgdGhpcy5tb3VzZVBvaW50ZXJDb250YWluZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhIG1vdXNlIHdoZWVsIGV2ZW50LCBhcyBwYXNzZWQgaW4gYnkgdGhlIE1vdXNlTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjb25Nb3VzZVdoZWVsXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2hlZWxFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBXaGVlbCBldmVudC5cclxuICAgICAqL1xyXG4gICAgb25Nb3VzZVdoZWVsOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tb3VzZVBvaW50ZXIud2hlZWwoZXZlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0UGx1Z2lucyhDT05TVC5NT1VTRV9XSEVFTCwgdGhpcy5tb3VzZVBvaW50ZXJDb250YWluZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhIHBvaW50ZXIgbG9jayBjaGFuZ2UgZXZlbnQsIGFzIHBhc3NlZCBpbiBieSB0aGUgTW91c2VNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNvblBvaW50ZXJMb2NrQ2hhbmdlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSTE9DS19DSEFOR0VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgRE9NIE1vdXNlIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBvblBvaW50ZXJMb2NrQ2hhbmdlOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGlzTG9ja2VkID0gdGhpcy5tb3VzZS5sb2NrZWQ7XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VQb2ludGVyLmxvY2tlZCA9IGlzTG9ja2VkO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5QT0lOVEVSTE9DS19DSEFOR0UsIGV2ZW50LCBpc0xvY2tlZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBHYW1lIE9iamVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBhIGNhbmRpZGF0ZSBmb3IgaW5wdXQgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIENoZWNrcyBpZiB0aGUgR2FtZSBPYmplY3QgaGFzIGFuIGlucHV0IGNvbXBvbmVudCB0aGF0IGlzIGVuYWJsZWQsIHRoYXQgaXQgd2lsbCByZW5kZXIsXHJcbiAgICAgKiBhbmQgZmluYWxseSwgaWYgaXQgaGFzIGEgcGFyZW50LCB0aGF0IHRoZSBwYXJlbnQgcGFyZW50LCBvciBhbnkgYW5jZXN0b3IsIGlzIHZpc2libGUgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNpbnB1dENhbmRpZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIHRlc3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHdoaWNoIGlzIGJlaW5nIHRlc3RlZCBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgR2FtZSBPYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIGlucHV0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaW5wdXRDYW5kaWRhdGU6IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGlucHV0ID0gZ2FtZU9iamVjdC5pbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKCFpbnB1dCB8fCAhaW5wdXQuZW5hYmxlZCB8fCAoIWlucHV0LmFsd2F5c0VuYWJsZWQgJiYgIWdhbWVPYmplY3Qud2lsbFJlbmRlcihjYW1lcmEpKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB2aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB2YXIgcGFyZW50ID0gZ2FtZU9iamVjdC5wYXJlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkb1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC53aWxsUmVuZGVyKGNhbWVyYSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICB9IHdoaWxlIChwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZpc2libGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSBoaXQgdGVzdCB1c2luZyB0aGUgZ2l2ZW4gUG9pbnRlciBhbmQgY2FtZXJhLCBhZ2FpbnN0IGFuIGFycmF5IG9mIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgR2FtZSBPYmplY3RzIGFyZSBjdWxsZWQgYWdhaW5zdCB0aGUgY2FtZXJhLCBhbmQgdGhlbiB0aGUgY29vcmRpbmF0ZXMgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGUgbG9jYWwgY2FtZXJhIHNwYWNlXHJcbiAgICAgKiBhbmQgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhleSBmYWxsIHdpdGhpbiB0aGUgcmVtYWluaW5nIEdhbWUgT2JqZWN0cyBoaXQgYXJlYXMgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIElmIG5vdGhpbmcgaXMgbWF0Y2hlZCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSBJbnB1dFBsdWdpbi5oaXRUZXN0UG9pbnRlciBhbmQgZG9lc24ndCB1c3VhbGx5IG5lZWQgdG8gYmUgaW52b2tlZCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjaGl0VGVzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHRvIHRlc3QgYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGdhbWVPYmplY3RzIC0gQW4gYXJyYXkgb2YgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3RzIHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB3aGljaCBpcyBiZWluZyB0ZXN0ZWQgYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IFtvdXRwdXRdIC0gQW4gYXJyYXkgdG8gc3RvcmUgdGhlIHJlc3VsdHMgaW4uIElmIG5vdCBnaXZlbiwgYSBuZXcgZW1wdHkgYXJyYXkgaXMgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgdGhlIEdhbWUgT2JqZWN0cyB0aGF0IHdlcmUgaGl0IGR1cmluZyB0aGlzIGhpdCB0ZXN0LlxyXG4gICAgICovXHJcbiAgICBoaXRUZXN0OiBmdW5jdGlvbiAocG9pbnRlciwgZ2FtZU9iamVjdHMsIGNhbWVyYSwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSB0aGlzLl90ZW1wSGl0VGVzdDsgfVxyXG5cclxuICAgICAgICB2YXIgdGVtcFBvaW50ID0gdGhpcy5fdGVtcFBvaW50O1xyXG5cclxuICAgICAgICB2YXIgY3N4ID0gY2FtZXJhLnNjcm9sbFg7XHJcbiAgICAgICAgdmFyIGNzeSA9IGNhbWVyYS5zY3JvbGxZO1xyXG5cclxuICAgICAgICBvdXRwdXQubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdmFyIHggPSBwb2ludGVyLng7XHJcbiAgICAgICAgdmFyIHkgPSBwb2ludGVyLnk7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucmVzb2x1dGlvbiAhPT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggKz0gY2FtZXJhLl94O1xyXG4gICAgICAgICAgICB5ICs9IGNhbWVyYS5feTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBTdG9yZXMgdGhlIHdvcmxkIHBvaW50IGluc2lkZSBvZiB0ZW1wUG9pbnRcclxuICAgICAgICBjYW1lcmEuZ2V0V29ybGRQb2ludCh4LCB5LCB0ZW1wUG9pbnQpO1xyXG5cclxuICAgICAgICBwb2ludGVyLndvcmxkWCA9IHRlbXBQb2ludC54O1xyXG4gICAgICAgIHBvaW50ZXIud29ybGRZID0gdGVtcFBvaW50Lnk7XHJcblxyXG4gICAgICAgIHZhciBwb2ludCA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDtcclxuICAgICAgICB2YXIgcGFyZW50TWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDI7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2FtZU9iamVjdHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IGdhbWVPYmplY3RzW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gIENoZWNrcyBpZiB0aGUgR2FtZSBPYmplY3QgY2FuIHJlY2VpdmUgaW5wdXQgKGlzbid0IGJlaW5nIGlnbm9yZWQgYnkgdGhlIGNhbWVyYSwgaW52aXNpYmxlLCBldGMpXHJcbiAgICAgICAgICAgIC8vICBhbmQgYWxzbyBjaGVja3MgYWxsIG9mIGl0cyBwYXJlbnRzLCBpZiBhbnlcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FuZGlkYXRlKGdhbWVPYmplY3QsIGNhbWVyYSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcHggPSB0ZW1wUG9pbnQueCArIChjc3ggKiBnYW1lT2JqZWN0LnNjcm9sbEZhY3RvclgpIC0gY3N4O1xyXG4gICAgICAgICAgICB2YXIgcHkgPSB0ZW1wUG9pbnQueSArIChjc3kgKiBnYW1lT2JqZWN0LnNjcm9sbEZhY3RvclkpIC0gY3N5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGdhbWVPYmplY3QucGFyZW50Q29udGFpbmVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnYW1lT2JqZWN0LmdldFdvcmxkVHJhbnNmb3JtTWF0cml4KG1hdHJpeCwgcGFyZW50TWF0cml4KTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYXRyaXguYXBwbHlJbnZlcnNlKHB4LCBweSwgcG9pbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgVHJhbnNmb3JtWFkocHgsIHB5LCBnYW1lT2JqZWN0LngsIGdhbWVPYmplY3QueSwgZ2FtZU9iamVjdC5yb3RhdGlvbiwgZ2FtZU9iamVjdC5zY2FsZVgsIGdhbWVPYmplY3Quc2NhbGVZLCBwb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5wb2ludFdpdGhpbkhpdEFyZWEoZ2FtZU9iamVjdCwgcG9pbnQueCwgcG9pbnQueSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4geCBhbmQgeSBjb29yZGluYXRlIGFyZSB3aXRoaW4gdGhlIGhpdCBhcmVhIG9mIHRoZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIGNvb3JkaW5hdGUgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zbGF0ZWQgaW50byB0aGUgc3BhY2Ugb2YgdGhlIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSBoaXQgYXJlYSB0aGV5IGFyZSBzZXQgaW50byB0aGUgR2FtZSBPYmplY3RzIElucHV0IGBsb2NhbFhgIGFuZCBgbG9jYWxZYCBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciNwb2ludFdpdGhpbkhpdEFyZWFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgdG8gY2hlY2sgYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHRyYW5zbGF0ZWQgeCBjb29yZGluYXRlIGZvciB0aGUgaGl0IHRlc3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0cmFuc2xhdGVkIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGhpdCB0ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29vcmRpbmF0ZXMgd2VyZSBpbnNpZGUgdGhlIEdhbWUgT2JqZWN0cyBoaXQgYXJlYSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHBvaW50V2l0aGluSGl0QXJlYTogZnVuY3Rpb24gKGdhbWVPYmplY3QsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE5vcm1hbGl6ZSB0aGUgb3JpZ2luXHJcbiAgICAgICAgeCArPSBnYW1lT2JqZWN0LmRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHkgKz0gZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIGlucHV0ID0gZ2FtZU9iamVjdC5pbnB1dDtcclxuXHJcbiAgICAgICAgaWYgKGlucHV0ICYmIGlucHV0LmhpdEFyZWFDYWxsYmFjayhpbnB1dC5oaXRBcmVhLCB4LCB5LCBnYW1lT2JqZWN0KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlucHV0LmxvY2FsWCA9IHg7XHJcbiAgICAgICAgICAgIGlucHV0LmxvY2FsWSA9IHk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHggYW5kIHkgY29vcmRpbmF0ZSBhcmUgd2l0aGluIHRoZSBoaXQgYXJlYSBvZiB0aGUgSW50ZXJhY3RpdmUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgY29vcmRpbmF0ZSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gdHJhbnNsYXRlZCBpbnRvIHRoZSBzcGFjZSBvZiB0aGUgSW50ZXJhY3RpdmUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSBoaXQgYXJlYSB0aGV5IGFyZSBzZXQgaW50byB0aGUgSW50ZXJhY3RpdmUgT2JqZWN0cyBJbnB1dCBgbG9jYWxYYCBhbmQgYGxvY2FsWWAgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXIjcG9pbnRXaXRoaW5JbnRlcmFjdGl2ZU9iamVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSW50ZXJhY3RpdmVPYmplY3R9IG9iamVjdCAtIFRoZSBJbnRlcmFjdGl2ZSBPYmplY3QgdG8gY2hlY2sgYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHRyYW5zbGF0ZWQgeCBjb29yZGluYXRlIGZvciB0aGUgaGl0IHRlc3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0cmFuc2xhdGVkIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGhpdCB0ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29vcmRpbmF0ZXMgd2VyZSBpbnNpZGUgdGhlIEdhbWUgT2JqZWN0cyBoaXQgYXJlYSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHBvaW50V2l0aGluSW50ZXJhY3RpdmVPYmplY3Q6IGZ1bmN0aW9uIChvYmplY3QsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFvYmplY3QuaGl0QXJlYSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBOb3JtYWxpemUgdGhlIG9yaWdpblxyXG4gICAgICAgIHggKz0gb2JqZWN0LmdhbWVPYmplY3QuZGlzcGxheU9yaWdpblg7XHJcbiAgICAgICAgeSArPSBvYmplY3QuZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgb2JqZWN0LmxvY2FsWCA9IHg7XHJcbiAgICAgICAgb2JqZWN0LmxvY2FsWSA9IHk7XHJcblxyXG4gICAgICAgIHJldHVybiBvYmplY3QuaGl0QXJlYUNhbGxiYWNrKG9iamVjdC5oaXRBcmVhLCB4LCB5LCBvYmplY3QpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIHBhZ2VYIGFuZCBwYWdlWSB2YWx1ZXMgb2YgYSBQb2ludGVyIGludG8gdGhlIHNjYWxlZCBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0TWFuYWdlciN0cmFuc2Zvcm1Qb2ludGVyXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWVzIGZvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlWCAtIFRoZSBQYWdlIFggdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVkgLSBUaGUgUGFnZSBZIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB3YXNNb3ZlIC0gQXJlIHdlIHRyYW5zZm9ybWluZyB0aGUgUG9pbnRlciBmcm9tIGEgbW92ZSBldmVudCwgb3IgYW4gdXAgLyBkb3duIGV2ZW50P1xyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1Qb2ludGVyOiBmdW5jdGlvbiAocG9pbnRlciwgcGFnZVgsIHBhZ2VZLCB3YXNNb3ZlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwMCA9IHBvaW50ZXIucG9zaXRpb247XHJcbiAgICAgICAgdmFyIHAxID0gcG9pbnRlci5wcmV2UG9zaXRpb247XHJcblxyXG4gICAgICAgIC8vICBTdG9yZSBwcmV2aW91cyBwb3NpdGlvblxyXG4gICAgICAgIHAxLnggPSBwMC54O1xyXG4gICAgICAgIHAxLnkgPSBwMC55O1xyXG5cclxuICAgICAgICAvLyAgVHJhbnNsYXRlIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgdmFyIHggPSB0aGlzLnNjYWxlTWFuYWdlci50cmFuc2Zvcm1YKHBhZ2VYKTtcclxuICAgICAgICB2YXIgeSA9IHRoaXMuc2NhbGVNYW5hZ2VyLnRyYW5zZm9ybVkocGFnZVkpO1xyXG5cclxuICAgICAgICB2YXIgYSA9IHBvaW50ZXIuc21vb3RoRmFjdG9yO1xyXG5cclxuICAgICAgICBpZiAoIXdhc01vdmUgfHwgYSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBTZXQgaW1tZWRpYXRlbHlcclxuICAgICAgICAgICAgcDAueCA9IHg7XHJcbiAgICAgICAgICAgIHAwLnkgPSB5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQXBwbHkgc21vb3RoaW5nXHJcbiAgICAgICAgICAgIHAwLnggPSB4ICogYSArIHAxLnggKiAoMSAtIGEpO1xyXG4gICAgICAgICAgICBwMC55ID0geSAqIGEgKyBwMS55ICogKDEgLSBhKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIElucHV0IE1hbmFnZXIgYW5kIGFsbCBvZiBpdHMgc3lzdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGVyZSBpcyBubyB3YXkgdG8gcmVjb3ZlciBmcm9tIGRvaW5nIHRoaXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUuZXZlbnRzLm9mZihHYW1lRXZlbnRzLlBSRV9SRU5ERVIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5rZXlib2FyZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmQuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1vdXNlLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvdWNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50b3VjaC5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9pbnRlcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9pbnRlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLl90ZW1wSGl0VGVzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXguZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmdhbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElucHV0TWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2lyY2xlID0gcmVxdWlyZSgnLi4vZ2VvbS9jaXJjbGUvQ2lyY2xlJyk7XHJcbnZhciBDaXJjbGVDb250YWlucyA9IHJlcXVpcmUoJy4uL2dlb20vY2lyY2xlL0NvbnRhaW5zJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIENyZWF0ZUludGVyYWN0aXZlT2JqZWN0ID0gcmVxdWlyZSgnLi9DcmVhdGVJbnRlcmFjdGl2ZU9iamVjdCcpO1xyXG52YXIgQ3JlYXRlUGl4ZWxQZXJmZWN0SGFuZGxlciA9IHJlcXVpcmUoJy4vQ3JlYXRlUGl4ZWxQZXJmZWN0SGFuZGxlcicpO1xyXG52YXIgRGlzdGFuY2VCZXR3ZWVuID0gcmVxdWlyZSgnLi4vbWF0aC9kaXN0YW5jZS9EaXN0YW5jZUJldHdlZW4nKTtcclxudmFyIEVsbGlwc2UgPSByZXF1aXJlKCcuLi9nZW9tL2VsbGlwc2UvRWxsaXBzZScpO1xyXG52YXIgRWxsaXBzZUNvbnRhaW5zID0gcmVxdWlyZSgnLi4vZ2VvbS9lbGxpcHNlL0NvbnRhaW5zJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgR0VPTV9DT05TVCA9IHJlcXVpcmUoJy4uL2dlb20vY29uc3QnKTtcclxudmFyIElucHV0UGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuL0lucHV0UGx1Z2luQ2FjaGUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi9nZW9tL3JlY3RhbmdsZS9SZWN0YW5nbGUnKTtcclxudmFyIFJlY3RhbmdsZUNvbnRhaW5zID0gcmVxdWlyZSgnLi4vZ2VvbS9yZWN0YW5nbGUvQ29udGFpbnMnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcbnZhciBUcmlhbmdsZSA9IHJlcXVpcmUoJy4uL2dlb20vdHJpYW5nbGUvVHJpYW5nbGUnKTtcclxudmFyIFRyaWFuZ2xlQ29udGFpbnMgPSByZXF1aXJlKCcuLi9nZW9tL3RyaWFuZ2xlL0NvbnRhaW5zJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgSW5wdXQgUGx1Z2luIGJlbG9uZ3MgdG8gYSBTY2VuZSBhbmQgaGFuZGxlcyBhbGwgaW5wdXQgcmVsYXRlZCBldmVudHMgYW5kIG9wZXJhdGlvbnMgZm9yIGl0LlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFjY2VzcyBpdCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nIGB0aGlzLmlucHV0YC5cclxuICpcclxuICogSXQgZW1pdHMgZXZlbnRzIGRpcmVjdGx5LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbzpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmlucHV0Lm9uKCdwb2ludGVyZG93bicsIGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFRvIGxpc3RlbiBmb3IgYSBwb2ludGVyIGRvd24gZXZlbnQgYW55d2hlcmUgb24gdGhlIGdhbWUgY2FudmFzLlxyXG4gKlxyXG4gKiBHYW1lIE9iamVjdHMgY2FuIGJlIGVuYWJsZWQgZm9yIGlucHV0IGJ5IGNhbGxpbmcgdGhlaXIgYHNldEludGVyYWN0aXZlYCBtZXRob2QuIEFmdGVyIHdoaWNoIHRoZXlcclxuICogd2lsbCBkaXJlY3RseSBlbWl0IGlucHV0IGV2ZW50czpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgc3ByaXRlID0gdGhpcy5hZGQuc3ByaXRlKHgsIHksIHRleHR1cmUpO1xyXG4gKiBzcHJpdGUuc2V0SW50ZXJhY3RpdmUoKTtcclxuICogc3ByaXRlLm9uKCdwb2ludGVyZG93bicsIGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBsb3RzIG9mIGdhbWUgY29uZmlndXJhdGlvbiBvcHRpb25zIGF2YWlsYWJsZSByZWxhdGluZyB0byBpbnB1dC5cclxuICogU2VlIHRoZSBbSW5wdXQgQ29uZmlnIG9iamVjdF17QGxpbmtjb2RlIFBoYXNlci5UeXBlcy5Db3JlLklucHV0Q29uZmlnfSBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgaG93IHRvIGRlYWwgd2l0aCBQaGFzZXJcclxuICogbGlzdGVuaW5nIGZvciBpbnB1dCBldmVudHMgb3V0c2lkZSBvZiB0aGUgY2FudmFzLCBob3cgdG8gc2V0IGEgZGVmYXVsdCBudW1iZXIgb2YgcG9pbnRlcnMsIGlucHV0XHJcbiAqIGNhcHR1cmUgc2V0dGluZ3MgYW5kIG1vcmUuXHJcbiAqXHJcbiAqIFBsZWFzZSBhbHNvIHNlZSB0aGUgSW5wdXQgZXhhbXBsZXMgYW5kIHR1dG9yaWFscyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cclxuICpcclxuICogQGNsYXNzIElucHV0UGx1Z2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuSW5wdXRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCB0aGlzIElucHV0IFBsdWdpbiBpcyByZXNwb25zaWJsZSBmb3IuXHJcbiAqL1xyXG52YXIgSW5wdXRQbHVnaW4gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIElucHV0UGx1Z2luIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgdGhpcyBJbnB1dCBQbHVnaW4gaXMgcmVzcG9uc2libGUgZm9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBTeXN0ZW1zIGNsYXNzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgU2V0dGluZ3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0dGluZ3NcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc09iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2NlbmUuc3lzLnNldHRpbmdzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBJbnB1dCBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI21hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LklucHV0TWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBzY2VuZS5zeXMuZ2FtZS5pbnB1dDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgZXZlbnQgcXVldWUgdXNlZCBmb3IgcGx1Z2lucyBvbmx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3BsdWdpbkV2ZW50c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsdWdpbkV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYHRydWVgIHRoaXMgSW5wdXQgUGx1Z2luIHdpbGwgcHJvY2VzcyBET00gaW5wdXQgZXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2VuYWJsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIERpc3BsYXkgTGlzdC4gVGhpcyBwcm9wZXJ0eSBpcyBzZXQgZHVyaW5nIHRoZSBgYm9vdGAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2Rpc3BsYXlMaXN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5EaXNwbGF5TGlzdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlMaXN0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgQ2FtZXJhcyBNYW5hZ2VyLiBUaGlzIHByb3BlcnR5IGlzIHNldCBkdXJpbmcgdGhlIGBib290YCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jY2FtZXJhc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmFzO1xyXG5cclxuICAgICAgICAvLyAgSW5qZWN0IHRoZSBhdmFpbGFibGUgaW5wdXQgcGx1Z2lucyBpbnRvIHRoaXMgY2xhc3NcclxuICAgICAgICBJbnB1dFBsdWdpbkNhY2hlLmluc3RhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBNb3VzZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHNldCBpZiBNb3VzZSBzdXBwb3J0IGhhcyBiZWVuIGVuYWJsZWQgaW4geW91ciBHYW1lIENvbmZpZ3VyYXRpb24gZmlsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIHlvdSBqdXN0IHdpc2ggdG8gZ2V0IGFjY2VzcyB0byB0aGUgbW91c2UgcG9pbnRlciwgdXNlIHRoZSBgbW91c2VQb2ludGVyYCBwcm9wZXJ0eSBpbnN0ZWFkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI21vdXNlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW91c2UgPSB0aGlzLm1hbmFnZXIubW91c2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZW4gc2V0IHRvIGB0cnVlYCAodGhlIGRlZmF1bHQpIHRoZSBJbnB1dCBQbHVnaW4gd2lsbCBlbXVsYXRlIERPTSBiZWhhdmlvciBieSBvbmx5IGVtaXR0aW5nIGV2ZW50cyBmcm9tXHJcbiAgICAgICAgICogdGhlIHRvcC1tb3N0IEdhbWUgT2JqZWN0cyBpbiB0aGUgRGlzcGxheSBMaXN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSWYgc2V0IHRvIGBmYWxzZWAgaXQgd2lsbCBlbWl0IGV2ZW50cyBmcm9tIGFsbCBHYW1lIE9iamVjdHMgYmVsb3cgYSBQb2ludGVyLCBub3QganVzdCB0aGUgdG9wIG9uZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiN0b3BPbmx5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG9wT25seSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBvZnRlbiBzaG91bGQgdGhlIFBvaW50ZXJzIGJlIGNoZWNrZWQ/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgdmFsdWUgaXMgYSB0aW1lLCBnaXZlbiBpbiBtcywgYW5kIGlzIHRoZSB0aW1lIHRoYXQgbXVzdCBoYXZlIGVsYXBzZWQgYmV0d2VlbiBnYW1lIHN0ZXBzIGJlZm9yZVxyXG4gICAgICAgICAqIHRoZSBQb2ludGVycyB3aWxsIGJlIHBvbGxlZCBhZ2Fpbi4gV2hlbiBhIHBvaW50ZXIgaXMgcG9sbGVkIGl0IHJ1bnMgYSBoaXQgdGVzdCB0byBzZWUgd2hpY2ggR2FtZVxyXG4gICAgICAgICAqIE9iamVjdHMgYXJlIGN1cnJlbnRseSBiZWxvdyBpdCwgb3IgYmVpbmcgaW50ZXJhY3RlZCB3aXRoIGl0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogUG9pbnRlcnMgd2lsbCAqYWx3YXlzKiBiZSBjaGVja2VkIGlmIHRoZXkgaGF2ZSBiZWVuIG1vdmVkIGJ5IHRoZSB1c2VyLCBvciBwcmVzcyBvciByZWxlYXNlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgb25seSBjb250cm9scyBob3cgb2Z0ZW4gdGhleSB3aWxsIGJlIHBvbGxlZCBpZiB0aGV5IGhhdmUgbm90IGJlZW4gdXBkYXRlZC5cclxuICAgICAgICAgKiBZb3Ugc2hvdWxkIHNldCB0aGlzIGlmIHlvdSB3YW50IHRvIGhhdmUgR2FtZSBPYmplY3RzIGNvbnN0YW50bHkgY2hlY2sgYWdhaW5zdCB0aGUgcG9pbnRlcnMsIGV2ZW5cclxuICAgICAgICAgKiBpZiB0aGUgcG9pbnRlciBkaWRuJ3QgaXRzZWxmIG1vdmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTZXQgdG8gMCB0byBwb2xsIGNvbnN0YW50bHkuIFNldCB0byAtMSB0byBvbmx5IHBvbGwgb24gdXNlciBtb3ZlbWVudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwb2xsUmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IC0xXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wb2xsUmF0ZSA9IC0xO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwb2xsIHRpbWVyIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI19wb2xsVGltZXJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BvbGxUaW1lciA9IDA7XHJcblxyXG4gICAgICAgIHZhciBfZXZlbnREYXRhID0geyBjYW5jZWxsZWQ6IGZhbHNlIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGV2ZW50IHByb3BhZ2F0aW9uIGNhbGxiYWNrIGNvbnRhaW5lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNfZXZlbnRDb250YWluZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLklucHV0LkV2ZW50RGF0YX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9ldmVudENvbnRhaW5lciA9IHtcclxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfZXZlbnREYXRhLmNhbmNlbGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBldmVudCBwcm9wYWdhdGlvbiBkYXRhIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNfZXZlbnREYXRhXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9ldmVudERhdGEgPSBfZXZlbnREYXRhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGlzdGFuY2UsIGluIHBpeGVscywgYSBwb2ludGVyIGhhcyB0byBtb3ZlIHdoaWxlIGJlaW5nIGhlbGQgZG93biwgYmVmb3JlIGl0IHRoaW5rcyBpdCBpcyBiZWluZyBkcmFnZ2VkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2RyYWdEaXN0YW5jZVRocmVzaG9sZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHJhZ0Rpc3RhbmNlVGhyZXNob2xkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtcywgYSBwb2ludGVyIGhhcyB0byBiZSBoZWxkIGRvd24gYmVmb3JlIGl0IHRoaW5rcyBpdCBpcyBkcmFnZ2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHBvbGxpbmcgcmF0ZSBpcyB0byBwb2xsIG9ubHkgb24gbW92ZSBzbyBvbmNlIHRoZSB0aW1lIHRocmVzaG9sZCBpcyByZWFjaGVkIHRoZVxyXG4gICAgICAgICAqIGRyYWcgZXZlbnQgd2lsbCBub3Qgc3RhcnQgdW50aWwgeW91IG1vdmUgdGhlIG1vdXNlLiBJZiB5b3Ugd2FudCBpdCB0byBzdGFydCBpbW1lZGlhdGVseVxyXG4gICAgICAgICAqIHdoZW4gdGhlIHRpbWUgdGhyZXNob2xkIGlzIHJlYWNoZWQsIHlvdSBtdXN0IGluY3JlYXNlIHRoZSBwb2xsaW5nIHJhdGUgYnkgY2FsbGluZ1xyXG4gICAgICAgICAqIFtzZXRQb2xsQWx3YXlzXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldFBvbGxBbHdheXN9IG9yXHJcbiAgICAgICAgICogW3NldFBvbGxSYXRlXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldFBvbGxSYXRlfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNkcmFnVGltZVRocmVzaG9sZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHJhZ1RpbWVUaHJlc2hvbGQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVc2VkIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXN1bHRzIG9mIHRoZSBIaXQgVGVzdFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI190ZW1wXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVzZWQgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJlc3VsdHMgb2YgdGhlIEhpdCBUZXN0IGRyb3Bab25lc1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI190ZW1wWm9uZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBab25lcyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgYWxsIEdhbWUgT2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYmUgaW50ZXJhY3RpdmUgaW4gdGhlIFNjZW5lIHRoaXMgSW5wdXQgUGx1Z2luIGlzIG1hbmFnaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI19saXN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogT2JqZWN0cyB3YWl0aW5nIHRvIGJlIGluc2VydGVkIHRvIHRoZSBsaXN0IG9uIHRoZSBuZXh0IGNhbGwgdG8gJ2JlZ2luJy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNfcGVuZGluZ0luc2VydGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nSW5zZXJ0aW9uID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE9iamVjdHMgd2FpdGluZyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb24gdGhlIG5leHQgY2FsbCB0byAnYmVnaW4nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI19wZW5kaW5nUmVtb3ZhbFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZhbCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgYWxsIEdhbWUgT2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBlbmFibGVkIGZvciBkcmFnZ2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNfZHJhZ2dhYmxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgYWxsIEludGVyYWN0aXZlIE9iamVjdHMgY3VycmVudGx5IGNvbnNpZGVyZWQgYXMgYmVpbmcgJ2RyYWdnYWJsZScgYnkgYW55IHBvaW50ZXIsIGluZGV4ZWQgYnkgcG9pbnRlciBJRC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNfZHJhZ1xyXG4gICAgICAgICAqIEB0eXBlIHt7MDpBcnJheSwxOkFycmF5LDI6QXJyYXksMzpBcnJheSw0OkFycmF5LDU6QXJyYXksNjpBcnJheSw3OkFycmF5LDg6QXJyYXksOTpBcnJheSwxMDpBcnJheX19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kcmFnID0geyAwOiBbXSwgMTogW10sIDI6IFtdLCAzOiBbXSwgNDogW10sIDU6IFtdLCA2OiBbXSwgNzogW10sIDg6IFtdLCA5OiBbXSwgMTA6IFtdIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYXJyYXkgY29udGFpbmluZyB0aGUgZHJhZ1N0YXRlcywgZm9yIHRoaXMgU2NlbmUsIGluZGV4IGJ5IHRoZSBQb2ludGVyIElELlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI19kcmFnU3RhdGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcltdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2RyYWdTdGF0ZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgYWxsIEludGVyYWN0aXZlIE9iamVjdHMgY3VycmVudGx5IGNvbnNpZGVyZWQgYXMgYmVpbmcgJ292ZXInIGJ5IGFueSBwb2ludGVyLCBpbmRleGVkIGJ5IHBvaW50ZXIgSUQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jX292ZXJcclxuICAgICAgICAgKiBAdHlwZSB7ezA6QXJyYXksMTpBcnJheSwyOkFycmF5LDM6QXJyYXksNDpBcnJheSw1OkFycmF5LDY6QXJyYXksNzpBcnJheSw4OkFycmF5LDk6QXJyYXksMTA6QXJyYXl9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb3ZlciA9IHsgMDogW10sIDE6IFtdLCAyOiBbXSwgMzogW10sIDQ6IFtdLCA1OiBbXSwgNjogW10sIDc6IFtdLCA4OiBbXSwgOTogW10sIDEwOiBbXSB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGxpc3Qgb2YgdmFsaWQgRE9NIGV2ZW50IHR5cGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI192YWxpZFR5cGVzXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ1tdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdmFsaWRUeXBlcyA9IFsgJ29uRG93bicsICdvblVwJywgJ29uT3ZlcicsICdvbk91dCcsICdvbk1vdmUnLCAnb25EcmFnU3RhcnQnLCAnb25EcmFnJywgJ29uRHJhZ0VuZCcsICdvbkRyYWdFbnRlcicsICdvbkRyYWdMZWF2ZScsICdvbkRyYWdPdmVyJywgJ29uRHJvcCcgXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgcHJvcGVydHkgdGhhdCB0cmFja3MgZnJhbWUgZXZlbnQgc3RhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jX3VwZGF0ZWRUaGlzRnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl91cGRhdGVkVGhpc0ZyYW1lID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub24oU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5LCBvbmx5IG9uY2UsIHdoZW4gdGhlIFNjZW5lIGlzIGZpcnN0IGNyZWF0ZWQuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2Jvb3RcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0JPT1RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNhbWVyYXMgPSB0aGlzLnN5c3RlbXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdCA9IHRoaXMuc3lzdGVtcy5kaXNwbGF5TGlzdDtcclxuXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcblxyXG4gICAgICAgIC8vICBSZWdpc3RlcmVkIGlucHV0IHBsdWdpbnMgbGlzdGVuIGZvciB0aGlzXHJcbiAgICAgICAgdGhpcy5wbHVnaW5FdmVudHMuZW1pdChFdmVudHMuQk9PVCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3N0YXJ0XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNTVEFSVFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlRSQU5TSVRJT05fU1RBUlQsIHRoaXMudHJhbnNpdGlvbkluLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuVFJBTlNJVElPTl9PVVQsIHRoaXMudHJhbnNpdGlvbk91dCwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlRSQU5TSVRJT05fQ09NUExFVEUsIHRoaXMudHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuUFJFX1VQREFURSwgdGhpcy5wcmVVcGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vbmNlKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmV2ZW50cy5vbihFdmVudHMuR0FNRV9PVVQsIHRoaXMub25HYW1lT3V0LCB0aGlzKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZXZlbnRzLm9uKEV2ZW50cy5HQU1FX09WRVIsIHRoaXMub25HYW1lT3ZlciwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vICBQb3B1bGF0ZSB0aGUgcG9pbnRlciBkcmFnIHN0YXRlc1xyXG4gICAgICAgIHRoaXMuX2RyYWdTdGF0ZSA9IFsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBdO1xyXG5cclxuICAgICAgICAvLyAgUmVnaXN0ZXJlZCBpbnB1dCBwbHVnaW5zIGxpc3RlbiBmb3IgdGhpc1xyXG4gICAgICAgIHRoaXMucGx1Z2luRXZlbnRzLmVtaXQoRXZlbnRzLlNUQVJUKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHYW1lIE92ZXIgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNvbkdhbWVPdmVyXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FX09WRVJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4yXHJcbiAgICAgKi9cclxuICAgIG9uR2FtZU92ZXI6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HQU1FX09WRVIsIGV2ZW50LnRpbWVTdGFtcCwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHYW1lIE91dCBoYW5kbGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI29uR2FtZU91dFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRV9PVVRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4yXHJcbiAgICAgKi9cclxuICAgIG9uR2FtZU91dDogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkdBTUVfT1VULCBldmVudC50aW1lU3RhbXAsIGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHByZS11cGRhdGUgaGFuZGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdGhlIHBlbmRpbmcgcmVtb3ZhbCBhbmQgaW5zZXJ0aW9uIGxpc3RzIGFuZFxyXG4gICAgICogZGVsZXRpbmcgb2xkIEdhbWUgT2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcmVVcGRhdGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNQUkVfVVBEQVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBSZWdpc3RlcmVkIGlucHV0IHBsdWdpbnMgbGlzdGVuIGZvciB0aGlzXHJcbiAgICAgICAgdGhpcy5wbHVnaW5FdmVudHMuZW1pdChFdmVudHMuUFJFX1VQREFURSk7XHJcblxyXG4gICAgICAgIHZhciByZW1vdmVMaXN0ID0gdGhpcy5fcGVuZGluZ1JlbW92YWw7XHJcbiAgICAgICAgdmFyIGluc2VydExpc3QgPSB0aGlzLl9wZW5kaW5nSW5zZXJ0aW9uO1xyXG5cclxuICAgICAgICB2YXIgdG9SZW1vdmUgPSByZW1vdmVMaXN0Lmxlbmd0aDtcclxuICAgICAgICB2YXIgdG9JbnNlcnQgPSBpbnNlcnRMaXN0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKHRvUmVtb3ZlID09PSAwICYmIHRvSW5zZXJ0ID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFF1aWNrIGJhaWxcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLl9saXN0O1xyXG5cclxuICAgICAgICAvLyAgRGVsZXRlIG9sZCBnYW1lT2JqZWN0c1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9SZW1vdmU7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gcmVtb3ZlTGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGN1cnJlbnQuaW5kZXhPZihnYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhcihnYW1lT2JqZWN0LCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENsZWFyIHRoZSByZW1vdmFsIGxpc3RcclxuICAgICAgICByZW1vdmVMaXN0Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92YWwubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgLy8gIE1vdmUgcGVuZGluZ0luc2VydGlvbiB0byBsaXN0IChhbHNvIGNsZWFycyBwZW5kaW5nSW5zZXJ0aW9uIGF0IHRoZSBzYW1lIHRpbWUpXHJcbiAgICAgICAgdGhpcy5fbGlzdCA9IGN1cnJlbnQuY29uY2F0KGluc2VydExpc3Quc3BsaWNlKDApKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGJvdGggdGhpcyBwbHVnaW4gYW5kIHRoZSBTY2VuZSB0byB3aGljaCBpdCBiZWxvbmdzIGlzIGFjdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNpc0FjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGx1Z2luIGFuZCB0aGUgU2NlbmUgaXQgYmVsb25ncyB0byBpcyBhY3RpdmUuXHJcbiAgICAgKi9cclxuICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5lbmFibGVkICYmIHRoaXMuc2NlbmUuc3lzLmlzQWN0aXZlKCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIElucHV0IE1hbmFnZXIuXHJcbiAgICAgKiBJdCBlbWl0cyBldmVudHMgZm9yIHBsdWdpbnMgdG8gbGlzdGVuIHRvIGFuZCBhbHNvIGhhbmRsZXMgcG9sbGluZyB1cGRhdGVzLCBpZiBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3VwZGF0ZVBvbGxcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBsdWdpbiBhbmQgdGhlIFNjZW5lIGl0IGJlbG9uZ3MgdG8gaXMgYWN0aXZlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVQb2xsOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGhlIHBsdWdpbnMgc2hvdWxkIHVwZGF0ZSBldmVyeSBmcmFtZSwgcmVnYXJkbGVzcyBpZiB0aGVyZSBoYXMgYmVlblxyXG4gICAgICAgIC8vICBhbnkgRE9NIGlucHV0IGV2ZW50cyBvciBub3QgKHN1Y2ggYXMgdGhlIEdhbWVwYWQgYW5kIEtleWJvYXJkKVxyXG4gICAgICAgIHRoaXMucGx1Z2luRXZlbnRzLmVtaXQoRXZlbnRzLlVQREFURSwgdGltZSwgZGVsdGEpO1xyXG5cclxuICAgICAgICAvLyAgV2UgY2FuIGxlYXZlIG5vdyBpZiB3ZSd2ZSBhbHJlYWR5IHVwZGF0ZWQgb25jZSB0aGlzIGZyYW1lIHZpYSB0aGUgaW1tZWRpYXRlIERPTSBldmVudCBoYW5kbGVyc1xyXG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVkVGhpc0ZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFRoaXNGcmFtZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7XHJcblxyXG4gICAgICAgIHZhciBwb2ludGVycyA9IG1hbmFnZXIucG9pbnRlcnM7XHJcbiAgICAgICAgdmFyIHBvaW50ZXJzVG90YWwgPSBtYW5hZ2VyLnBvaW50ZXJzVG90YWw7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludGVyc1RvdGFsOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwb2ludGVyc1tpXS51cGRhdGVNb3Rpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBObyBwb2ludCBnb2luZyBhbnkgZnVydGhlciBpZiB0aGVyZSBhcmVuJ3QgYW55IGludGVyYWN0aXZlIG9iamVjdHNcclxuICAgICAgICBpZiAodGhpcy5fbGlzdC5sZW5ndGggPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcmF0ZSA9IHRoaXMucG9sbFJhdGU7XHJcblxyXG4gICAgICAgIGlmIChyYXRlID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmF0ZSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2xsVGltZXIgLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9sbFRpbWVyIDwgMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIERpc2NhcmQgdGltZXIgZGlmZiwgd2UncmUgcmVhZHkgdG8gcG9sbCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9sbFRpbWVyID0gdGhpcy5wb2xsUmF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBOb3QgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgcG9sbCwgc28gYWJvcnQgbm93XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBXZSBnb3QgdGhpcyBmYXI/IFRoZW4gd2Ugc2hvdWxkIHBvbGwgZm9yIG1vdmVtZW50XHJcbiAgICAgICAgdmFyIGNhcHR1cmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludGVyc1RvdGFsOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdG90YWwgPSAwO1xyXG5cclxuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBwb2ludGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBBbHdheXMgcmVzZXQgdGhpcyBhcnJheVxyXG4gICAgICAgICAgICB0aGlzLl90ZW1wWm9uZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBfdGVtcCBjb250YWlucyBhIGhpdCB0ZXN0ZWQgYW5kIGNhbWVyYSBjdWxsZWQgbGlzdCBvZiBJTyBvYmplY3RzXHJcbiAgICAgICAgICAgIHRoaXMuX3RlbXAgPSB0aGlzLmhpdFRlc3RQb2ludGVyKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zb3J0R2FtZU9iamVjdHModGhpcy5fdGVtcCk7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydEdhbWVPYmplY3RzKHRoaXMuX3RlbXBab25lcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50b3BPbmx5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgT25seSB0aGUgdG9wLW1vc3Qgb25lIGNvdW50cyBub3csIHNvIHNhZmVseSBpZ25vcmUgdGhlIHJlc3RcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZW1wLmxlbmd0aClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZW1wLnNwbGljZSgxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVtcFpvbmVzLmxlbmd0aClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZW1wWm9uZXMuc3BsaWNlKDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NPdmVyT3V0RXZlbnRzKHBvaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RHJhZ1N0YXRlKHBvaW50ZXIpID09PSAyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEcmFnVGhyZXNob2xkRXZlbnQocG9pbnRlciwgdGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b3RhbCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBXZSBpbnRlcmFjdGVkIHdpdGggYW4gZXZlbnQgaW4gdGhpcyBTY2VuZSwgc28gYmxvY2sgYW55IFNjZW5lcyBiZWxvdyB1cyBmcm9tIGRvaW5nIHRoZSBzYW1lIHRoaXMgZnJhbWVcclxuICAgICAgICAgICAgICAgIGNhcHR1cmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgRE9NIEV2ZW50IGlzIHJlY2VpdmVkIGJ5IHRoZSBJbnB1dCBNYW5hZ2VyLiBJdCBoYW5kbGVzIGRpc3BhdGNoaW5nIHRoZSBldmVudHNcclxuICAgICAqIHRvIHJlbGV2YW50IGlucHV0IGVuYWJsZWQgR2FtZSBPYmplY3RzIGluIHRoaXMgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jdXBkYXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjVVBEQVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBwcm9jZXNzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcltdfSBwb2ludGVycyAtIEFuIGFycmF5IG9mIFBvaW50ZXJzIG9uIHdoaWNoIHRoZSBldmVudCBvY2N1cnJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBTY2VuZSBoYXMgY2FwdHVyZWQgdGhlIGlucHV0IGV2ZW50cyBmcm9tIGFsbCBvdGhlciBTY2VuZXMsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0eXBlLCBwb2ludGVycylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwb2ludGVyc1RvdGFsID0gcG9pbnRlcnMubGVuZ3RoO1xyXG4gICAgICAgIHZhciBjYXB0dXJlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50ZXJzVG90YWw7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBwb2ludGVyID0gcG9pbnRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgQWx3YXlzIHJlc2V0IHRoaXMgYXJyYXlcclxuICAgICAgICAgICAgdGhpcy5fdGVtcFpvbmVzID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyAgX3RlbXAgY29udGFpbnMgYSBoaXQgdGVzdGVkIGFuZCBjYW1lcmEgY3VsbGVkIGxpc3Qgb2YgSU8gb2JqZWN0c1xyXG4gICAgICAgICAgICB0aGlzLl90ZW1wID0gdGhpcy5oaXRUZXN0UG9pbnRlcihwb2ludGVyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc29ydEdhbWVPYmplY3RzKHRoaXMuX3RlbXApO1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRHYW1lT2JqZWN0cyh0aGlzLl90ZW1wWm9uZXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudG9wT25seSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIE9ubHkgdGhlIHRvcC1tb3N0IG9uZSBjb3VudHMgbm93LCBzbyBzYWZlbHkgaWdub3JlIHRoZSByZXN0XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVtcC5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVtcC5zcGxpY2UoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RlbXBab25lcy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVtcFpvbmVzLnNwbGljZSgxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENPTlNULk1PVVNFX0RPV046XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5wcm9jZXNzRHJhZ0Rvd25FdmVudChwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NEb3duRXZlbnRzKHBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRoaXMucHJvY2Vzc092ZXJPdXRFdmVudHMocG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSBDT05TVC5NT1VTRV9VUDpcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NEcmFnVXBFdmVudChwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NVcEV2ZW50cyhwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NPdmVyT3V0RXZlbnRzKHBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgQ09OU1QuVE9VQ0hfU1RBUlQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5wcm9jZXNzRHJhZ0Rvd25FdmVudChwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NEb3duRXZlbnRzKHBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRoaXMucHJvY2Vzc092ZXJFdmVudHMocG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSBDT05TVC5UT1VDSF9FTkQ6XHJcbiAgICAgICAgICAgICAgICBjYXNlIENPTlNULlRPVUNIX0NBTkNFTDpcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NEcmFnVXBFdmVudChwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NVcEV2ZW50cyhwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NPdXRFdmVudHMocG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSBDT05TVC5NT1VTRV9NT1ZFOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBDT05TVC5UT1VDSF9NT1ZFOlxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRoaXMucHJvY2Vzc0RyYWdNb3ZlRXZlbnQocG9pbnRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5wcm9jZXNzTW92ZUV2ZW50cyhwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0aGlzLnByb2Nlc3NPdmVyT3V0RXZlbnRzKHBvaW50ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgQ09OU1QuTU9VU0VfV0hFRUw6XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5wcm9jZXNzV2hlZWxFdmVudChwb2ludGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRvdGFsID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFdlIGludGVyYWN0ZWQgd2l0aCBhbiBldmVudCBpbiB0aGlzIFNjZW5lLCBzbyBibG9jayBhbnkgU2NlbmVzIGJlbG93IHVzIGZyb20gZG9pbmcgdGhlIHNhbWUgdGhpcyBmcmFtZVxyXG4gICAgICAgICAgICAgICAgY2FwdHVyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl91cGRhdGVkVGhpc0ZyYW1lID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyBhIEdhbWUgT2JqZWN0IHNvIGl0IG5vIGxvbmdlciBoYXMgYW4gSW50ZXJhY3RpdmUgT2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBpdC5cclxuICAgICAqIFRoZSBHYW1lIE9iamVjdCBpcyB0aGVuIHF1ZXVlZCBmb3IgcmVtb3ZhbCBmcm9tIHRoZSBJbnB1dCBQbHVnaW4gb24gdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2NsZWFyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2lsbCBoYXZlIGl0cyBJbnRlcmFjdGl2ZSBPYmplY3QgcmVtb3ZlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBRdWV1ZT1mYWxzZV0gLSBTa2lwIGFkZGluZyB0aGlzIEdhbWUgT2JqZWN0IGludG8gdGhlIHJlbW92YWwgcXVldWU/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IGhhZCBpdHMgSW50ZXJhY3RpdmUgT2JqZWN0IHJlbW92ZWQuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgc2tpcFF1ZXVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChza2lwUXVldWUgPT09IHVuZGVmaW5lZCkgeyBza2lwUXVldWUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgaW5wdXQgPSBnYW1lT2JqZWN0LmlucHV0O1xyXG5cclxuICAgICAgICAvLyBJZiBHYW1lT2JqZWN0LmlucHV0IGFscmVhZHkgY2xlYXJlZCBmcm9tIGhpZ2hlciBjbGFzc1xyXG4gICAgICAgIGlmICghaW5wdXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNraXBRdWV1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucXVldWVGb3JSZW1vdmFsKGdhbWVPYmplY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5wdXQuZ2FtZU9iamVjdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpbnB1dC50YXJnZXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaW5wdXQuaGl0QXJlYSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBpbnB1dC5oaXRBcmVhQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaW5wdXQuY2FsbGJhY2tDb250ZXh0ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucmVzZXRDdXJzb3IoaW5wdXQpO1xyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LmlucHV0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gIENsZWFyIGZyb20gX2RyYWdnYWJsZSwgX2RyYWcgYW5kIF9vdmVyXHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZHJhZ2dhYmxlLmluZGV4T2YoZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbmRleCA9IHRoaXMuX2RyYWdbMF0uaW5kZXhPZihnYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnWzBdLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbmRleCA9IHRoaXMuX292ZXJbMF0uaW5kZXhPZihnYW1lT2JqZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVyWzBdLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNhYmxlcyBJbnB1dCBvbiBhIHNpbmdsZSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBBbiBpbnB1dCBkaXNhYmxlZCBHYW1lIE9iamVjdCBzdGlsbCByZXRhaW5zIGl0cyBJbnRlcmFjdGl2ZSBPYmplY3QgY29tcG9uZW50IGFuZCBjYW4gYmUgcmUtZW5hYmxlZFxyXG4gICAgICogYXQgYW55IHRpbWUsIGJ5IHBhc3NpbmcgaXQgdG8gYElucHV0UGx1Z2luLmVuYWJsZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jZGlzYWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byBoYXZlIGl0cyBpbnB1dCBzeXN0ZW0gZGlzYWJsZWQuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIGdhbWVPYmplY3QuaW5wdXQuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBhIEdhbWUgT2JqZWN0IGZvciBpbnRlcmFjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgR2FtZSBPYmplY3QgYWxyZWFkeSBoYXMgYW4gSW50ZXJhY3RpdmUgT2JqZWN0IGNvbXBvbmVudCwgaXQgaXMgZW5hYmxlZCBhbmQgcmV0dXJuZWQuXHJcbiAgICAgKlxyXG4gICAgICogT3RoZXJ3aXNlLCBhIG5ldyBJbnRlcmFjdGl2ZSBPYmplY3QgY29tcG9uZW50IGlzIGNyZWF0ZWQgYW5kIGFzc2lnbmVkIHRvIHRoZSBHYW1lIE9iamVjdCdzIGBpbnB1dGAgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogSW5wdXQgd29ya3MgYnkgdXNpbmcgaGl0IGFyZWFzLCB0aGVzZSBhcmUgbmVhcmx5IGFsd2F5cyBnZW9tZXRyaWMgc2hhcGVzLCBzdWNoIGFzIHJlY3RhbmdsZXMgb3IgY2lyY2xlcywgdGhhdCBhY3QgYXMgdGhlIGhpdCBhcmVhXHJcbiAgICAgKiBmb3IgdGhlIEdhbWUgT2JqZWN0LiBIb3dldmVyLCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gaGl0IGFyZWEgc2hhcGUgYW5kIGNhbGxiYWNrLCBzaG91bGQgeW91IHdpc2ggdG8gaGFuZGxlIHNvbWUgbW9yZSBhZHZhbmNlZFxyXG4gICAgICogaW5wdXQgZGV0ZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgaXQgd2lsbCB0cnkgYW5kIGNyZWF0ZSBhIHJlY3RhbmdsZSBoaXQgYXJlYSBiYXNlZCBvbiB0aGUgdGV4dHVyZSBmcmFtZSB0aGUgR2FtZSBPYmplY3QgaXMgdXNpbmcuIElmXHJcbiAgICAgKiB0aGlzIGlzbid0IGEgdGV4dHVyZS1ib3VuZCBvYmplY3QsIHN1Y2ggYXMgYSBHcmFwaGljcyBvciBCaXRtYXBUZXh0IG9iamVjdCwgdGhpcyB3aWxsIGZhaWwsIGFuZCB5b3UnbGwgbmVlZCB0byBwcm92aWRlIGEgc3BlY2lmaWNcclxuICAgICAqIHNoYXBlIGZvciBpdCB0byB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gSW5wdXQgQ29uZmlndXJhdGlvbiBPYmplY3QgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jZW5hYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGJlIGVuYWJsZWQgZm9yIGlucHV0LlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLklucHV0LklucHV0Q29uZmlndXJhdGlvbnxhbnkpfSBbc2hhcGVdIC0gRWl0aGVyIGFuIGlucHV0IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhIGdlb21ldHJpYyBzaGFwZSB0aGF0IGRlZmluZXMgdGhlIGhpdCBhcmVhIGZvciB0aGUgR2FtZSBPYmplY3QuIElmIG5vdCBzcGVjaWZpZWQgYSBSZWN0YW5nbGUgd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhlICdjb250YWlucycgZnVuY3Rpb24gdG8gaW52b2tlIHRvIGNoZWNrIGlmIHRoZSBwb2ludGVyIGlzIHdpdGhpbiB0aGUgaGl0IGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkcm9wWm9uZT1mYWxzZV0gLSBJcyB0aGlzIEdhbWUgT2JqZWN0IGEgZHJvcCB6b25lIG9yIG5vdD9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIElucHV0IFBsdWdpbi5cclxuICAgICAqL1xyXG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgc2hhcGUsIGNhbGxiYWNrLCBkcm9wWm9uZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZHJvcFpvbmUgPT09IHVuZGVmaW5lZCkgeyBkcm9wWm9uZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIGl0IGlzIGFscmVhZHkgaGFzIGFuIEludGVyYWN0aXZlT2JqZWN0IHRoZW4ganVzdCBlbmFibGUgaXQgYW5kIHJldHVyblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmlucHV0LmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQ3JlYXRlIGFuIEludGVyYWN0aXZlT2JqZWN0IGFuZCBlbmFibGUgaXRcclxuICAgICAgICAgICAgdGhpcy5zZXRIaXRBcmVhKGdhbWVPYmplY3QsIHNoYXBlLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5pbnB1dCAmJiBkcm9wWm9uZSAmJiAhZ2FtZU9iamVjdC5pbnB1dC5kcm9wWm9uZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdhbWVPYmplY3QuaW5wdXQuZHJvcFpvbmUgPSBkcm9wWm9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIHRoZSBnaXZlbiBQb2ludGVyIGFuZCBwZXJmb3JtcyBhIGhpdCB0ZXN0IGFnYWluc3QgaXQsIHRvIHNlZSB3aGljaCBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdHNcclxuICAgICAqIGl0IGlzIGN1cnJlbnRseSBhYm92ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgaGl0IHRlc3QgaXMgcGVyZm9ybWVkIGFnYWluc3Qgd2hpY2gtZXZlciBDYW1lcmEgdGhlIFBvaW50ZXIgaXMgb3Zlci4gSWYgaXQgaXMgb3ZlciBtdWx0aXBsZVxyXG4gICAgICogY2FtZXJhcywgaXQgc3RhcnRzIGNoZWNraW5nIHRoZSBjYW1lcmEgYXQgdGhlIHRvcCBvZiB0aGUgY2FtZXJhIGxpc3QsIGFuZCBpZiBub3RoaW5nIGlzIGZvdW5kLCBpdGVyYXRlcyBkb3duIHRoZSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2hpdFRlc3RQb2ludGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgdG8gY2hlY2sgYWdhaW5zdCB0aGUgR2FtZSBPYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEFuIGFycmF5IG9mIGFsbCB0aGUgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3RzIHRoZSBQb2ludGVyIHdhcyBhYm92ZS5cclxuICAgICAqL1xyXG4gICAgaGl0VGVzdFBvaW50ZXI6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjYW1lcmFzID0gdGhpcy5jYW1lcmFzLmdldENhbWVyYXNCZWxvd1BvaW50ZXIocG9pbnRlcik7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2FtZXJhcy5sZW5ndGg7IGMrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYW1lcmEgPSBjYW1lcmFzW2NdO1xyXG5cclxuICAgICAgICAgICAgLy8gIEdldCBhIGxpc3Qgb2YgYWxsIG9iamVjdHMgdGhhdCBjYW4gYmUgc2VlbiBieSB0aGUgY2FtZXJhIGJlbG93IHRoZSBwb2ludGVyIGluIHRoZSBzY2VuZSBhbmQgc3RvcmUgaW4gJ292ZXInIGFycmF5LlxyXG4gICAgICAgICAgICAvLyAgQWxsIG9iamVjdHMgaW4gdGhpcyBhcnJheSBhcmUgaW5wdXQgZW5hYmxlZCwgYXMgY2hlY2tlZCBieSB0aGUgaGl0VGVzdCBtZXRob2QsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgbGF0ZXIgb24gYXMgd2VsbC5cclxuICAgICAgICAgICAgdmFyIG92ZXIgPSB0aGlzLm1hbmFnZXIuaGl0VGVzdChwb2ludGVyLCB0aGlzLl9saXN0LCBjYW1lcmEpO1xyXG5cclxuICAgICAgICAgICAgLy8gIEZpbHRlciBvdXQgdGhlIGRyb3Agem9uZXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVyLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gb3ZlcltpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLmlucHV0LmRyb3Bab25lKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RlbXBab25lcy5wdXNoKG9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVyLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBvaW50ZXIuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gdGhlcmUgd2VyZSBubyBHYW1lIE9iamVjdHMgYmVsb3cgdGhlIHBvaW50ZXIsIGJ1dCBpdCB3YXMgc3RpbGwgb3ZlclxyXG4gICAgICAgIC8vICBhIGNhbWVyYSwgc28gc2V0IHRoYXQgdGhlIHRvcC1tb3N0IG9uZSBpbnRvIHRoZSBwb2ludGVyXHJcblxyXG4gICAgICAgIHBvaW50ZXIuY2FtZXJhID0gY2FtZXJhc1swXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgdGhlIFBvaW50ZXIgZG93biBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzRG93bkV2ZW50c1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RPV05cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfRE9XTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjUE9JTlRFUl9ET1dOX09VVFNJREVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciBiZWluZyB0ZXN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc0Rvd25FdmVudHM6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRseU92ZXIgPSB0aGlzLl90ZW1wO1xyXG5cclxuICAgICAgICB2YXIgX2V2ZW50RGF0YSA9IHRoaXMuX2V2ZW50RGF0YTtcclxuICAgICAgICB2YXIgX2V2ZW50Q29udGFpbmVyID0gdGhpcy5fZXZlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIF9ldmVudERhdGEuY2FuY2VsbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vICBHbyB0aHJvdWdoIGFsbCBvYmplY3RzIHRoZSBwb2ludGVyIHdhcyBvdmVyIGFuZCBmaXJlIHRoZWlyIGV2ZW50cyAvIGNhbGxiYWNrc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudGx5T3Zlci5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gY3VycmVudGx5T3ZlcltpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRvdGFsKys7XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOLCBwb2ludGVyLCBnYW1lT2JqZWN0LmlucHV0LmxvY2FsWCwgZ2FtZU9iamVjdC5pbnB1dC5sb2NhbFksIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9ET1dOLCBwb2ludGVyLCBnYW1lT2JqZWN0LCBfZXZlbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSWYgdGhleSByZWxlYXNlZCBvdXRzaWRlIHRoZSBjYW52YXMsIGJ1dCBwcmVzc2VkIGRvd24gaW5zaWRlIGl0LCB3ZSdsbCBzdGlsbCBkaXNwYXRjaCB0aGUgZXZlbnQuXHJcbiAgICAgICAgaWYgKCFhYm9ydGVkICYmIHRoaXMubWFuYWdlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChwb2ludGVyLmRvd25FbGVtZW50ID09PSB0aGlzLm1hbmFnZXIuZ2FtZS5jYW52YXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUE9JTlRFUl9ET1dOLCBwb2ludGVyLCBjdXJyZW50bHlPdmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUE9JTlRFUl9ET1dOX09VVFNJREUsIHBvaW50ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZHJhZyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gUG9pbnRlciBmb3IgdGhpcyBJbnB1dCBQbHVnaW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHN0YXRlIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XHJcbiAgICAgKlxyXG4gICAgICogMCA9IE5vdCBkcmFnZ2luZyBhbnl0aGluZ1xyXG4gICAgICogMSA9IFByaW1hcnkgYnV0dG9uIGRvd24gYW5kIG9iamVjdHMgYmVsb3csIHNvIGNvbGxlY3QgYSBkcmFnbGlzdFxyXG4gICAgICogMiA9IFBvaW50ZXIgYmVpbmcgY2hlY2tlZCBpZiBtZWV0cyBkcmFnIGNyaXRlcmlhXHJcbiAgICAgKiAzID0gUG9pbnRlciBtZWV0cyBjcml0ZXJpYSwgbm90aWZ5IHRoZSBkcmFnbGlzdFxyXG4gICAgICogNCA9IFBvaW50ZXIgYWN0aXZlbHkgZHJhZ2dpbmcgdGhlIGRyYWdsaXN0IGFuZCBoYXMgbW92ZWRcclxuICAgICAqIDUgPSBQb2ludGVyIGFjdGl2ZWx5IGRyYWdnaW5nIGJ1dCBoYXMgYmVlbiByZWxlYXNlZCwgbm90aWZ5IGRyYWdsaXN0XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jZ2V0RHJhZ1N0YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHRvIGdldCB0aGUgZHJhZyBzdGF0ZSBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGRyYWcgc3RhdGUgb2YgdGhlIGdpdmVuIFBvaW50ZXIuXHJcbiAgICAgKi9cclxuICAgIGdldERyYWdTdGF0ZTogZnVuY3Rpb24gKHBvaW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdTdGF0ZVtwb2ludGVyLmlkXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkcmFnIHN0YXRlIG9mIHRoZSBnaXZlbiBQb2ludGVyIGZvciB0aGlzIElucHV0IFBsdWdpbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgc3RhdGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XHJcbiAgICAgKlxyXG4gICAgICogMCA9IE5vdCBkcmFnZ2luZyBhbnl0aGluZ1xyXG4gICAgICogMSA9IFByaW1hcnkgYnV0dG9uIGRvd24gYW5kIG9iamVjdHMgYmVsb3csIHNvIGNvbGxlY3QgYSBkcmFnbGlzdFxyXG4gICAgICogMiA9IFBvaW50ZXIgYmVpbmcgY2hlY2tlZCBpZiBtZWV0cyBkcmFnIGNyaXRlcmlhXHJcbiAgICAgKiAzID0gUG9pbnRlciBtZWV0cyBjcml0ZXJpYSwgbm90aWZ5IHRoZSBkcmFnbGlzdFxyXG4gICAgICogNCA9IFBvaW50ZXIgYWN0aXZlbHkgZHJhZ2dpbmcgdGhlIGRyYWdsaXN0IGFuZCBoYXMgbW92ZWRcclxuICAgICAqIDUgPSBQb2ludGVyIGFjdGl2ZWx5IGRyYWdnaW5nIGJ1dCBoYXMgYmVlbiByZWxlYXNlZCwgbm90aWZ5IGRyYWdsaXN0XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0RHJhZ1N0YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHRvIHNldCB0aGUgZHJhZyBzdGF0ZSBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHN0YXRlIC0gVGhlIGRyYWcgc3RhdGUgdmFsdWUuIEFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1LlxyXG4gICAgICovXHJcbiAgICBzZXREcmFnU3RhdGU6IGZ1bmN0aW9uIChwb2ludGVyLCBzdGF0ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9kcmFnU3RhdGVbcG9pbnRlci5pZF0gPSBzdGF0ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGEgUG9pbnRlciBpcyByZWFkeSB0byBkcmFnIHRoZSBvYmplY3RzIGJlbG93IGl0LCBiYXNlZCBvbiBlaXRoZXIgYSBkaXN0YW5jZVxyXG4gICAgICogb3IgdGltZSB0aHJlc2hvbGQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcHJvY2Vzc0RyYWdUaHJlc2hvbGRFdmVudFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgdG8gY2hlY2sgdGhlIGRyYWcgdGhyZXNob2xkcyBvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZS5cclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc0RyYWdUaHJlc2hvbGRFdmVudDogZnVuY3Rpb24gKHBvaW50ZXIsIHRpbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhc3NlZCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciB0aW1lVGhyZXNob2xkID0gdGhpcy5kcmFnVGltZVRocmVzaG9sZDtcclxuICAgICAgICB2YXIgZGlzdGFuY2VUaHJlc2hvbGQgPSB0aGlzLmRyYWdEaXN0YW5jZVRocmVzaG9sZDtcclxuXHJcbiAgICAgICAgaWYgKGRpc3RhbmNlVGhyZXNob2xkID4gMCAmJiBEaXN0YW5jZUJldHdlZW4ocG9pbnRlci54LCBwb2ludGVyLnksIHBvaW50ZXIuZG93blgsIHBvaW50ZXIuZG93blkpID49IGRpc3RhbmNlVGhyZXNob2xkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEl0IGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgYSBkcmFnXHJcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRpbWVUaHJlc2hvbGQgPiAwICYmICh0aW1lID49IHBvaW50ZXIuZG93blRpbWUgKyB0aW1lVGhyZXNob2xkKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJdCBoYXMgYmVlbiBoZWxkIGRvd24gbG9uZyBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCBhIGRyYWdcclxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXNzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldERyYWdTdGF0ZShwb2ludGVyLCAzKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEcmFnU3RhcnRMaXN0KHBvaW50ZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGRyYWcgbGlzdCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIgYW5kIGRpc3BhdGNoZXMgdGhlIHN0YXJ0IGV2ZW50cyBmb3IgZWFjaCBvYmplY3Qgb24gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcHJvY2Vzc0RyYWdTdGFydExpc3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNEUkFHX1NUQVJUXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfU1RBUlRcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgdG8gcHJvY2VzcyB0aGUgZHJhZyBldmVudCBvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgRFJBR19TVEFSVCB3YXMgY2FsbGVkIG9uLlxyXG4gICAgICovXHJcbiAgICBwcm9jZXNzRHJhZ1N0YXJ0TGlzdDogZnVuY3Rpb24gKHBvaW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIDMgPSBQb2ludGVyIG1lZXRzIGNyaXRlcmlhIGFuZCBpcyBmcmVzaGx5IGRvd24sIG5vdGlmeSB0aGUgZHJhZ2xpc3RcclxuICAgICAgICBpZiAodGhpcy5nZXREcmFnU3RhdGUocG9pbnRlcikgIT09IDMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fZHJhZ1twb2ludGVyLmlkXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGdhbWVPYmplY3QgPSBsaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGlucHV0ID0gZ2FtZU9iamVjdC5pbnB1dDtcclxuXHJcbiAgICAgICAgICAgIGlucHV0LmRyYWdTdGF0ZSA9IDI7XHJcblxyXG4gICAgICAgICAgICBpbnB1dC5kcmFnU3RhcnRYID0gZ2FtZU9iamVjdC54O1xyXG4gICAgICAgICAgICBpbnB1dC5kcmFnU3RhcnRZID0gZ2FtZU9iamVjdC55O1xyXG5cclxuICAgICAgICAgICAgaW5wdXQuZHJhZ1N0YXJ0WEdsb2JhbCA9IHBvaW50ZXIueDtcclxuICAgICAgICAgICAgaW5wdXQuZHJhZ1N0YXJ0WUdsb2JhbCA9IHBvaW50ZXIueTtcclxuXHJcbiAgICAgICAgICAgIGlucHV0LmRyYWdYID0gaW5wdXQuZHJhZ1N0YXJ0WEdsb2JhbCAtIGlucHV0LmRyYWdTdGFydFg7XHJcbiAgICAgICAgICAgIGlucHV0LmRyYWdZID0gaW5wdXQuZHJhZ1N0YXJ0WUdsb2JhbCAtIGlucHV0LmRyYWdTdGFydFk7XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfRFJBR19TVEFSVCwgcG9pbnRlciwgaW5wdXQuZHJhZ1gsIGlucHV0LmRyYWdZKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRFJBR19TVEFSVCwgcG9pbnRlciwgZ2FtZU9iamVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERyYWdTdGF0ZShwb2ludGVyLCA0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3QubGVuZ3RoO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyBhICdkcmFnIGRvd24nIGV2ZW50IGZvciB0aGUgZ2l2ZW4gcG9pbnRlci4gQ2hlY2tzIHRoZSBwb2ludGVyIHN0YXRlLCBidWlsZHMtdXAgdGhlIGRyYWcgbGlzdFxyXG4gICAgICogYW5kIHByZXBhcmVzIHRoZW0gYWxsIGZvciBpbnRlcmFjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzRHJhZ0Rvd25FdmVudFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgdG8gcHJvY2VzcyB0aGUgZHJhZyBldmVudCBvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2VyZSBjb2xsZWN0ZWQgb24gdGhlIGRyYWcgbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc0RyYWdEb3duRXZlbnQ6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjdXJyZW50bHlPdmVyID0gdGhpcy5fdGVtcDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdnYWJsZS5sZW5ndGggPT09IDAgfHwgY3VycmVudGx5T3Zlci5sZW5ndGggPT09IDAgfHwgIXBvaW50ZXIucHJpbWFyeURvd24gfHwgdGhpcy5nZXREcmFnU3RhdGUocG9pbnRlcikgIT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgVGhlcmUgYXJlIG5vIGRyYWdnYWJsZSBpdGVtcywgbm8gb3ZlciBpdGVtcyBvciB0aGUgcG9pbnRlciBpc24ndCBkb3duLCBzbyBsZXQncyBub3QgZXZlbiBib3RoZXIgZ29pbmcgZnVydGhlclxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAxID0gUHJpbWFyeSBidXR0b24gZG93biBhbmQgb2JqZWN0cyBiZWxvdywgc28gY29sbGVjdCBhIGRyYWdsaXN0XHJcbiAgICAgICAgdGhpcy5zZXREcmFnU3RhdGUocG9pbnRlciwgMSk7XHJcblxyXG4gICAgICAgIC8vICBHZXQgZHJhZ2dhYmxlIG9iamVjdHMsIHNvcnQgdGhlbSwgcGljayB0aGUgdG9wIChvciBhbGwpIGFuZCBzdG9yZSB0aGVtIHNvbWV3aGVyZVxyXG4gICAgICAgIHZhciBkcmFnbGlzdCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRseU92ZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IGN1cnJlbnRseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZ2FtZU9iamVjdC5pbnB1dC5kcmFnZ2FibGUgJiYgKGdhbWVPYmplY3QuaW5wdXQuZHJhZ1N0YXRlID09PSAwKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZHJhZ2xpc3QucHVzaChnYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRyYWdsaXN0Lmxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RHJhZ1N0YXRlKHBvaW50ZXIsIDApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRyYWdsaXN0Lmxlbmd0aCA+IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRHYW1lT2JqZWN0cyhkcmFnbGlzdCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50b3BPbmx5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkcmFnbGlzdC5zcGxpY2UoMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBkcmFnbGlzdCBub3cgY29udGFpbnMgYWxsIHBvdGVudGlhbCBjYW5kaWRhdGVzIGZvciBkcmFnZ2luZ1xyXG4gICAgICAgIHRoaXMuX2RyYWdbcG9pbnRlci5pZF0gPSBkcmFnbGlzdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0Rpc3RhbmNlVGhyZXNob2xkID09PSAwICYmIHRoaXMuZHJhZ1RpbWVUaHJlc2hvbGQgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTm8gZHJhZyBjcml0ZXJpYSwgc28gc25hcCBpbW1lZGlhdGVseSB0byBtb2RlIDNcclxuICAgICAgICAgICAgdGhpcy5zZXREcmFnU3RhdGUocG9pbnRlciwgMyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRHJhZ1N0YXJ0TGlzdChwb2ludGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIENoZWNrIHRoZSBkaXN0YW5jZSAvIHRpbWUgb24gdGhlIG5leHQgZXZlbnRcclxuICAgICAgICAgICAgdGhpcy5zZXREcmFnU3RhdGUocG9pbnRlciwgMik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2Vzc2VzIGEgJ2RyYWcgbW92ZScgZXZlbnQgZm9yIHRoZSBnaXZlbiBwb2ludGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3Byb2Nlc3NEcmFnTW92ZUV2ZW50XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjRFJBR19FTlRFUlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjRFJBR1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjRFJBR19MRUFWRVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjRFJBR19PVkVSXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfRU5URVJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfRFJBR1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9EUkFHX0xFQVZFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfT1ZFUlxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciB0byBwcm9jZXNzIHRoZSBkcmFnIGV2ZW50IG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHVwZGF0ZWQgYnkgdGhpcyBkcmFnIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBwcm9jZXNzRHJhZ01vdmVFdmVudDogZnVuY3Rpb24gKHBvaW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIDIgPSBQb2ludGVyIGJlaW5nIGNoZWNrZWQgaWYgbWVldHMgZHJhZyBjcml0ZXJpYVxyXG4gICAgICAgIGlmICh0aGlzLmdldERyYWdTdGF0ZShwb2ludGVyKSA9PT0gMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RyYWdUaHJlc2hvbGRFdmVudChwb2ludGVyLCB0aGlzLm1hbmFnZXIuZ2FtZS5sb29wLm5vdyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXREcmFnU3RhdGUocG9pbnRlcikgIT09IDQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICA0ID0gUG9pbnRlciBhY3RpdmVseSBkcmFnZ2luZyB0aGUgZHJhZ2xpc3QgYW5kIGhhcyBtb3ZlZFxyXG4gICAgICAgIHZhciBkcm9wWm9uZXMgPSB0aGlzLl90ZW1wWm9uZXM7XHJcblxyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fZHJhZ1twb2ludGVyLmlkXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGdhbWVPYmplY3QgPSBsaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGlucHV0ID0gZ2FtZU9iamVjdC5pbnB1dDtcclxuXHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBpbnB1dC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAvLyAgSWYgdGhpcyBHTyBoYXMgYSB0YXJnZXQgdGhlbiBsZXQncyBjaGVjayBpdFxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBkcm9wWm9uZXMuaW5kZXhPZih0YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBHb3QgYSB0YXJnZXQsIGFyZSB3ZSBzdGlsbCBvdmVyIGl0P1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICBXZSdyZSBzdGlsbCBvdmVyIGl0LCBhbmQgaXQncyBzdGlsbCB0aGUgdG9wIG9mIHRoZSBkaXNwbGF5IGxpc3QsIHBoZXcgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX0RSQUdfT1ZFUiwgcG9pbnRlciwgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5EUkFHX09WRVIsIHBvaW50ZXIsIGdhbWVPYmplY3QsIHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmRleCA+IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIFN0aWxsIG92ZXIgaXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIHRvcCBvZiB0aGUgZGlzcGxheSBsaXN0ICh0YXJnZXRzIG11c3QgYWx3YXlzIGJlIGF0IHRoZSB0b3ApXHJcbiAgICAgICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX0RSQUdfTEVBVkUsIHBvaW50ZXIsIHRhcmdldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRFJBR19MRUFWRSwgcG9pbnRlciwgZ2FtZU9iamVjdCwgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQudGFyZ2V0ID0gZHJvcFpvbmVzWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBpbnB1dC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9EUkFHX0VOVEVSLCBwb2ludGVyLCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRSQUdfRU5URVIsIHBvaW50ZXIsIGdhbWVPYmplY3QsIHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIE5vcGUsIHdlJ3ZlIG1vdmVkIG9uIChvciB0aGUgdGFyZ2V0IGhhcyEpLCBsZWF2ZSB0aGUgb2xkIHRhcmdldFxyXG4gICAgICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9EUkFHX0xFQVZFLCBwb2ludGVyLCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRSQUdfTEVBVkUsIHBvaW50ZXIsIGdhbWVPYmplY3QsIHRhcmdldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vICBBbnl0aGluZyBuZXcgdG8gcmVwbGFjZSBpdD9cclxuICAgICAgICAgICAgICAgICAgICAvLyAgWXVwIVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkcm9wWm9uZXNbMF0pXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC50YXJnZXQgPSBkcm9wWm9uZXNbMF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBpbnB1dC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfRFJBR19FTlRFUiwgcG9pbnRlciwgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRFJBR19FTlRFUiwgcG9pbnRlciwgZ2FtZU9iamVjdCwgdGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIE5vcGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIXRhcmdldCAmJiBkcm9wWm9uZXNbMF0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlucHV0LnRhcmdldCA9IGRyb3Bab25lc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBpbnB1dC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX0RSQUdfRU5URVIsIHBvaW50ZXIsIHRhcmdldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5EUkFHX0VOVEVSLCBwb2ludGVyLCBnYW1lT2JqZWN0LCB0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgZHJhZ1g7XHJcbiAgICAgICAgICAgIHZhciBkcmFnWTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZ2FtZU9iamVjdC5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRyYWdYID0gcG9pbnRlci54IC0gaW5wdXQuZHJhZ1g7XHJcbiAgICAgICAgICAgICAgICBkcmFnWSA9IHBvaW50ZXIueSAtIGlucHV0LmRyYWdZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGR4ID0gcG9pbnRlci54IC0gaW5wdXQuZHJhZ1N0YXJ0WEdsb2JhbDtcclxuICAgICAgICAgICAgICAgIHZhciBkeSA9IHBvaW50ZXIueSAtIGlucHV0LmRyYWdTdGFydFlHbG9iYWw7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJvdGF0aW9uID0gZ2FtZU9iamVjdC5nZXRQYXJlbnRSb3RhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBkeFJvdGF0ZWQgPSBkeCAqIE1hdGguY29zKHJvdGF0aW9uKSArIGR5ICogTWF0aC5zaW4ocm90YXRpb24pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGR5Um90YXRlZCA9IGR5ICogTWF0aC5jb3Mocm90YXRpb24pIC0gZHggKiBNYXRoLnNpbihyb3RhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgZHhSb3RhdGVkICo9ICgxIC8gZ2FtZU9iamVjdC5wYXJlbnRDb250YWluZXIuc2NhbGVYKTtcclxuICAgICAgICAgICAgICAgIGR5Um90YXRlZCAqPSAoMSAvIGdhbWVPYmplY3QucGFyZW50Q29udGFpbmVyLnNjYWxlWSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZHJhZ1ggPSBkeFJvdGF0ZWQgKyBpbnB1dC5kcmFnU3RhcnRYO1xyXG4gICAgICAgICAgICAgICAgZHJhZ1kgPSBkeVJvdGF0ZWQgKyBpbnB1dC5kcmFnU3RhcnRZO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfRFJBRywgcG9pbnRlciwgZHJhZ1gsIGRyYWdZKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRFJBRywgcG9pbnRlciwgZ2FtZU9iamVjdCwgZHJhZ1gsIGRyYWdZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0Lmxlbmd0aDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzZXMgYSAnZHJhZyBkb3duJyBldmVudCBmb3IgdGhlIGdpdmVuIHBvaW50ZXIuIENoZWNrcyB0aGUgcG9pbnRlciBzdGF0ZSwgYnVpbGRzLXVwIHRoZSBkcmFnIGxpc3RcclxuICAgICAqIGFuZCBwcmVwYXJlcyB0aGVtIGFsbCBmb3IgaW50ZXJhY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcHJvY2Vzc0RyYWdVcEV2ZW50XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNEUkFHX0VORFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjRFJPUFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9EUkFHX0VORFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9EUk9QXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciB0byBwcm9jZXNzIHRoZSBkcmFnIGV2ZW50IG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHVwZGF0ZWQgYnkgdGhpcyBkcmFnIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBwcm9jZXNzRHJhZ1VwRXZlbnQ6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIC8vICA1ID0gUG9pbnRlciB3YXMgYWN0aXZlbHkgZHJhZ2dpbmcgYnV0IGhhcyBiZWVuIHJlbGVhc2VkLCBub3RpZnkgZHJhZ2xpc3RcclxuICAgICAgICB2YXIgbGlzdCA9IHRoaXMuX2RyYWdbcG9pbnRlci5pZF07XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGdhbWVPYmplY3QuaW5wdXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5wdXQgJiYgaW5wdXQuZHJhZ1N0YXRlID09PSAyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5kcmFnU3RhdGUgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGlucHV0LmRyYWdYID0gaW5wdXQubG9jYWxYIC0gZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICAgICAgICAgIGlucHV0LmRyYWdZID0gaW5wdXQubG9jYWxZIC0gZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZHJvcHBlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBpbnB1dC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfRFJPUCwgcG9pbnRlciwgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5EUk9QLCBwb2ludGVyLCBnYW1lT2JqZWN0LCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpbnB1dC50YXJnZXQgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkcm9wcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgQW5kIGZpbmFsbHkgdGhlIGRyYWdlbmQgZXZlbnRcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfRFJBR19FTkQsIHBvaW50ZXIsIGlucHV0LmRyYWdYLCBpbnB1dC5kcmFnWSwgZHJvcHBlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRFJBR19FTkQsIHBvaW50ZXIsIGdhbWVPYmplY3QsIGRyb3BwZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERyYWdTdGF0ZShwb2ludGVyLCAwKTtcclxuXHJcbiAgICAgICAgbGlzdC5zcGxpY2UoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgdGhlIFBvaW50ZXIgbW92ZW1lbnQgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcHJvY2Vzc01vdmVFdmVudHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfTU9WRVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9NT1ZFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSX01PVkVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgcG9pbnRlciB0byBjaGVjayBmb3IgZXZlbnRzIGFnYWluc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc01vdmVFdmVudHM6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRseU92ZXIgPSB0aGlzLl90ZW1wO1xyXG5cclxuICAgICAgICB2YXIgX2V2ZW50RGF0YSA9IHRoaXMuX2V2ZW50RGF0YTtcclxuICAgICAgICB2YXIgX2V2ZW50Q29udGFpbmVyID0gdGhpcy5fZXZlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIF9ldmVudERhdGEuY2FuY2VsbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vICBHbyB0aHJvdWdoIGFsbCBvYmplY3RzIHRoZSBwb2ludGVyIHdhcyBvdmVyIGFuZCBmaXJlIHRoZWlyIGV2ZW50cyAvIGNhbGxiYWNrc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudGx5T3Zlci5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gY3VycmVudGx5T3ZlcltpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRvdGFsKys7XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfUE9JTlRFUl9NT1ZFLCBwb2ludGVyLCBnYW1lT2JqZWN0LmlucHV0LmxvY2FsWCwgZ2FtZU9iamVjdC5pbnB1dC5sb2NhbFksIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9NT1ZFLCBwb2ludGVyLCBnYW1lT2JqZWN0LCBfZXZlbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50b3BPbmx5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhYm9ydGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QT0lOVEVSX01PVkUsIHBvaW50ZXIsIGN1cnJlbnRseU92ZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgYSBtb3VzZSB3aGVlbCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzV2hlZWxFdmVudFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfUE9JTlRFUl9XSEVFTFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9XSEVFTFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjUE9JTlRFUl9XSEVFTFxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgcG9pbnRlciB0byBjaGVjayBmb3IgZXZlbnRzIGFnYWluc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc1doZWVsRXZlbnQ6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRseU92ZXIgPSB0aGlzLl90ZW1wO1xyXG5cclxuICAgICAgICB2YXIgX2V2ZW50RGF0YSA9IHRoaXMuX2V2ZW50RGF0YTtcclxuICAgICAgICB2YXIgX2V2ZW50Q29udGFpbmVyID0gdGhpcy5fZXZlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIF9ldmVudERhdGEuY2FuY2VsbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBkeCA9IHBvaW50ZXIuZGVsdGFYO1xyXG4gICAgICAgIHZhciBkeSA9IHBvaW50ZXIuZGVsdGFZO1xyXG4gICAgICAgIHZhciBkeiA9IHBvaW50ZXIuZGVsdGFaO1xyXG5cclxuICAgICAgICAvLyAgR28gdGhyb3VnaCBhbGwgb2JqZWN0cyB0aGUgcG9pbnRlciB3YXMgb3ZlciBhbmQgZmlyZSB0aGVpciBldmVudHMgLyBjYWxsYmFja3NcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRseU92ZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IGN1cnJlbnRseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0b3RhbCsrO1xyXG5cclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX1BPSU5URVJfV0hFRUwsIHBvaW50ZXIsIGR4LCBkeSwgZHosIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9XSEVFTCwgcG9pbnRlciwgZ2FtZU9iamVjdCwgZHgsIGR5LCBkeiwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChfZXZlbnREYXRhLmNhbmNlbGxlZCB8fCAhZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhYm9ydGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QT0lOVEVSX1dIRUVMLCBwb2ludGVyLCBjdXJyZW50bHlPdmVyLCBkeCwgZHksIGR6KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBoYW5kbGVzIHRoZSBQb2ludGVyIG92ZXIgZXZlbnRzLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHRvdWNoIGlucHV0IGhpdHMgdGhlIGNhbnZhcywgaGF2aW5nIHByZXZpb3VzbHkgYmVlbiBvZmYgb2YgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcHJvY2Vzc092ZXJFdmVudHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfT1ZFUlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9PVkVSXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSX09WRVJcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIHBvaW50ZXIgdG8gY2hlY2sgZm9yIGV2ZW50cyBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBpbnRlcmFjdGVkIHdpdGguXHJcbiAgICAgKi9cclxuICAgIHByb2Nlc3NPdmVyRXZlbnRzOiBmdW5jdGlvbiAocG9pbnRlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgY3VycmVudGx5T3ZlciA9IHRoaXMuX3RlbXA7XHJcblxyXG4gICAgICAgIHZhciB0b3RhbEludGVyYWN0ZWQgPSAwO1xyXG5cclxuICAgICAgICB2YXIgdG90YWwgPSBjdXJyZW50bHlPdmVyLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdmFyIGp1c3RPdmVyID0gW107XHJcblxyXG4gICAgICAgIGlmICh0b3RhbCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbWFuYWdlciA9IHRoaXMubWFuYWdlcjtcclxuXHJcbiAgICAgICAgICAgIHZhciBfZXZlbnREYXRhID0gdGhpcy5fZXZlbnREYXRhO1xyXG4gICAgICAgICAgICB2YXIgX2V2ZW50Q29udGFpbmVyID0gdGhpcy5fZXZlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBfZXZlbnREYXRhLmNhbmNlbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdmFyIGFib3J0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWw7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdhbWVPYmplY3QgPSBjdXJyZW50bHlPdmVyW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBqdXN0T3Zlci5wdXNoKGdhbWVPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0Q3Vyc29yKGdhbWVPYmplY3QuaW5wdXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9QT0lOVEVSX09WRVIsIHBvaW50ZXIsIGdhbWVPYmplY3QuaW5wdXQubG9jYWxYLCBnYW1lT2JqZWN0LmlucHV0LmxvY2FsWSwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbEludGVyYWN0ZWQrKztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX09WRVIsIHBvaW50ZXIsIGdhbWVPYmplY3QsIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFib3J0ZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUE9JTlRFUl9PVkVSLCBwb2ludGVyLCBqdXN0T3Zlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBUaGVuIHNvcnQgaXQgaW50byBkaXNwbGF5IGxpc3Qgb3JkZXJcclxuICAgICAgICB0aGlzLl9vdmVyW3BvaW50ZXIuaWRdID0ganVzdE92ZXI7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEludGVyYWN0ZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZXJuYWwgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGUgUG9pbnRlciBvdXQgZXZlbnRzLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHRvdWNoIGlucHV0IGxlYXZlcyB0aGUgY2FudmFzLCBhcyBpdCBjYW4gbmV2ZXIgYmUgJ292ZXInIGluIHRoaXMgY2FzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzT3V0RXZlbnRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9QT0lOVEVSX09VVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9PVVRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfT1VUXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBwb2ludGVyIHRvIGNoZWNrIGZvciBldmVudHMgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgaW50ZXJhY3RlZCB3aXRoLlxyXG4gICAgICovXHJcbiAgICBwcm9jZXNzT3V0RXZlbnRzOiBmdW5jdGlvbiAocG9pbnRlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJldmlvdXNseU92ZXIgPSB0aGlzLl9vdmVyW3BvaW50ZXIuaWRdO1xyXG5cclxuICAgICAgICB2YXIgdG90YWxJbnRlcmFjdGVkID0gMDtcclxuXHJcbiAgICAgICAgdmFyIHRvdGFsID0gcHJldmlvdXNseU92ZXIubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAodG90YWwgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7XHJcblxyXG4gICAgICAgICAgICB2YXIgX2V2ZW50RGF0YSA9IHRoaXMuX2V2ZW50RGF0YTtcclxuICAgICAgICAgICAgdmFyIF9ldmVudENvbnRhaW5lciA9IHRoaXMuX2V2ZW50Q29udGFpbmVyO1xyXG5cclxuICAgICAgICAgICAgX2V2ZW50RGF0YS5jYW5jZWxsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHZhciBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNvcnRHYW1lT2JqZWN0cyhwcmV2aW91c2x5T3Zlcik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gcHJldmlvdXNseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIENhbGwgb25PdXQgZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIHByZXZpb3VzbHlPdmVyIGFycmF5XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnYW1lT2JqZWN0ID0gcHJldmlvdXNseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ2FtZU9iamVjdC5pbnB1dClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5yZXNldEN1cnNvcihnYW1lT2JqZWN0LmlucHV0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZ2FtZU9iamVjdC5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX1BPSU5URVJfT1VULCBwb2ludGVyLCBfZXZlbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0b3RhbEludGVyYWN0ZWQrKztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX09VVCwgcG9pbnRlciwgZ2FtZU9iamVjdCwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWFib3J0ZWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QT0lOVEVSX09VVCwgcG9pbnRlciwgcHJldmlvdXNseU92ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9vdmVyW3BvaW50ZXIuaWRdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxJbnRlcmFjdGVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGludGVybmFsIG1ldGhvZCB0aGF0IGhhbmRsZXMgdGhlIFBvaW50ZXIgb3ZlciBhbmQgb3V0IGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzT3Zlck91dEV2ZW50c1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfUE9JTlRFUl9PVkVSXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX09WRVJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfT1ZFUlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9QT0lOVEVSX09VVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9PVVRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfT1VUXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIHBvaW50ZXIgdG8gY2hlY2sgZm9yIGV2ZW50cyBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBpbnRlcmFjdGVkIHdpdGguXHJcbiAgICAgKi9cclxuICAgIHByb2Nlc3NPdmVyT3V0RXZlbnRzOiBmdW5jdGlvbiAocG9pbnRlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgY3VycmVudGx5T3ZlciA9IHRoaXMuX3RlbXA7XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBnYW1lT2JqZWN0O1xyXG4gICAgICAgIHZhciBqdXN0T3V0ID0gW107XHJcbiAgICAgICAgdmFyIGp1c3RPdmVyID0gW107XHJcbiAgICAgICAgdmFyIHN0aWxsT3ZlciA9IFtdO1xyXG4gICAgICAgIHZhciBwcmV2aW91c2x5T3ZlciA9IHRoaXMuX292ZXJbcG9pbnRlci5pZF07XHJcbiAgICAgICAgdmFyIGN1cnJlbnRseURyYWdnaW5nID0gdGhpcy5fZHJhZ1twb2ludGVyLmlkXTtcclxuXHJcbiAgICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7XHJcblxyXG4gICAgICAgIC8vICBHbyB0aHJvdWdoIGFsbCBvYmplY3RzIHRoZSBwb2ludGVyIHdhcyBwcmV2aW91c2x5IG92ZXIsIGFuZCBzZWUgaWYgaXQgc3RpbGwgaXMuXHJcbiAgICAgICAgLy8gIFNwbGl0cyB0aGUgcHJldmlvdXNseU92ZXIgYXJyYXkgaW50byB0d28gcGFydHM6IGp1c3RPdXQgYW5kIHN0aWxsT3ZlclxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJldmlvdXNseU92ZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0ID0gcHJldmlvdXNseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudGx5T3Zlci5pbmRleE9mKGdhbWVPYmplY3QpID09PSAtMSAmJiBjdXJyZW50bHlEcmFnZ2luZy5pbmRleE9mKGdhbWVPYmplY3QpID09PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIE5vdCBpbiB0aGUgY3VycmVudGx5T3ZlciBhcnJheSwgc28gbXVzdCBiZSBvdXRzaWRlIG9mIHRoaXMgb2JqZWN0IG5vd1xyXG4gICAgICAgICAgICAgICAganVzdE91dC5wdXNoKGdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEluIHRoZSBjdXJyZW50bHlPdmVyIGFycmF5XHJcbiAgICAgICAgICAgICAgICBzdGlsbE92ZXIucHVzaChnYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEdvIHRocm91Z2ggYWxsIG9iamVjdHMgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IG92ZXIgKHRoZSBoaXQgdGVzdCByZXN1bHRzKVxyXG4gICAgICAgIC8vICBhbmQgaWYgbm90IGluIHRoZSBwcmV2aW91c2x5T3ZlciBhcnJheSB3ZSBrbm93IGl0J3MgYSBuZXcgZW50cnksIHNvIGFkZCB0byBqdXN0T3ZlclxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50bHlPdmVyLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdCA9IGN1cnJlbnRseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgSXMgdGhpcyBuZXdseSBvdmVyP1xyXG5cclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzbHlPdmVyLmluZGV4T2YoZ2FtZU9iamVjdCkgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBqdXN0T3Zlci5wdXNoKGdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQnkgdGhpcyBwb2ludCB0aGUgYXJyYXlzIGFyZSBmaWxsZWQsIHNvIG5vdyB3ZSBjYW4gcHJvY2VzcyB3aGF0IGhhcHBlbmVkLi4uXHJcblxyXG4gICAgICAgIC8vICBQcm9jZXNzIHRoZSBKdXN0IE91dCBvYmplY3RzXHJcbiAgICAgICAgdmFyIHRvdGFsID0ganVzdE91dC5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciB0b3RhbEludGVyYWN0ZWQgPSAwO1xyXG5cclxuICAgICAgICB2YXIgX2V2ZW50RGF0YSA9IHRoaXMuX2V2ZW50RGF0YTtcclxuICAgICAgICB2YXIgX2V2ZW50Q29udGFpbmVyID0gdGhpcy5fZXZlbnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIF9ldmVudERhdGEuY2FuY2VsbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHZhciBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0b3RhbCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRHYW1lT2JqZWN0cyhqdXN0T3V0KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBDYWxsIG9uT3V0IGZvciBldmVyeXRoaW5nIGluIHRoZSBqdXN0T3V0IGFycmF5XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnYW1lT2JqZWN0ID0ganVzdE91dFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlc2V0IGN1cnNvciBiZWZvcmUgd2UgZW1pdCB0aGUgZXZlbnQsIGluIGNhc2UgdGhleSB3YW50IHRvIGNoYW5nZSBpdCBkdXJpbmcgdGhlIGV2ZW50XHJcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlc2V0Q3Vyc29yKGdhbWVPYmplY3QuaW5wdXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9QT0lOVEVSX09VVCwgcG9pbnRlciwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbEludGVyYWN0ZWQrKztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX09VVCwgcG9pbnRlciwgZ2FtZU9iamVjdCwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghYWJvcnRlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QT0lOVEVSX09VVCwgcG9pbnRlciwganVzdE91dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBQcm9jZXNzIHRoZSBKdXN0IE92ZXIgb2JqZWN0c1xyXG4gICAgICAgIHRvdGFsID0ganVzdE92ZXIubGVuZ3RoO1xyXG5cclxuICAgICAgICBfZXZlbnREYXRhLmNhbmNlbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBhYm9ydGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0b3RhbCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvcnRHYW1lT2JqZWN0cyhqdXN0T3Zlcik7XHJcblxyXG4gICAgICAgICAgICAvLyAgQ2FsbCBvbk92ZXIgZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIGp1c3RPdmVyIGFycmF5XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnYW1lT2JqZWN0ID0ganVzdE92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vICBTZXQgY3Vyc29yIGJlZm9yZSB3ZSBlbWl0IHRoZSBldmVudCwgaW4gY2FzZSB0aGV5IHdhbnQgdG8gY2hhbmdlIGl0IGR1cmluZyB0aGUgZXZlbnRcclxuICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0Q3Vyc29yKGdhbWVPYmplY3QuaW5wdXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuZW1pdChFdmVudHMuR0FNRU9CSkVDVF9QT0lOVEVSX09WRVIsIHBvaW50ZXIsIGdhbWVPYmplY3QuaW5wdXQubG9jYWxYLCBnYW1lT2JqZWN0LmlucHV0LmxvY2FsWSwgX2V2ZW50Q29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0b3RhbEludGVyYWN0ZWQrKztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HQU1FT0JKRUNUX09WRVIsIHBvaW50ZXIsIGdhbWVPYmplY3QsIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWFib3J0ZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUE9JTlRFUl9PVkVSLCBwb2ludGVyLCBqdXN0T3Zlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBBZGQgdGhlIGNvbnRlbnRzIG9mIGp1c3RPdmVyIHRvIHRoZSBwcmV2aW91c2x5IG92ZXIgYXJyYXlcclxuICAgICAgICBwcmV2aW91c2x5T3ZlciA9IHN0aWxsT3Zlci5jb25jYXQoanVzdE92ZXIpO1xyXG5cclxuICAgICAgICAvLyAgVGhlbiBzb3J0IGl0IGludG8gZGlzcGxheSBsaXN0IG9yZGVyXHJcbiAgICAgICAgdGhpcy5fb3Zlcltwb2ludGVyLmlkXSA9IHRoaXMuc29ydEdhbWVPYmplY3RzKHByZXZpb3VzbHlPdmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW50ZXJhY3RlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBoYW5kbGVzIHRoZSBQb2ludGVyIHVwIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwcm9jZXNzVXBFdmVudHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfVVBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfVVBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfVVBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfVVBfT1VUU0lERVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBwb2ludGVyIHRvIGNoZWNrIGZvciBldmVudHMgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgaW50ZXJhY3RlZCB3aXRoLlxyXG4gICAgICovXHJcbiAgICBwcm9jZXNzVXBFdmVudHM6IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjdXJyZW50bHlPdmVyID0gdGhpcy5fdGVtcDtcclxuXHJcbiAgICAgICAgdmFyIF9ldmVudERhdGEgPSB0aGlzLl9ldmVudERhdGE7XHJcbiAgICAgICAgdmFyIF9ldmVudENvbnRhaW5lciA9IHRoaXMuX2V2ZW50Q29udGFpbmVyO1xyXG5cclxuICAgICAgICBfZXZlbnREYXRhLmNhbmNlbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgYWJvcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyAgR28gdGhyb3VnaCBhbGwgb2JqZWN0cyB0aGUgcG9pbnRlciB3YXMgb3ZlciBhbmQgZmlyZSB0aGVpciBldmVudHMgLyBjYWxsYmFja3NcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnRseU92ZXIubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IGN1cnJlbnRseU92ZXJbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfUE9JTlRFUl9VUCwgcG9pbnRlciwgZ2FtZU9iamVjdC5pbnB1dC5sb2NhbFgsIGdhbWVPYmplY3QuaW5wdXQubG9jYWxZLCBfZXZlbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF9ldmVudERhdGEuY2FuY2VsbGVkIHx8ICFnYW1lT2JqZWN0LmlucHV0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkdBTUVPQkpFQ1RfVVAsIHBvaW50ZXIsIGdhbWVPYmplY3QsIF9ldmVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoX2V2ZW50RGF0YS5jYW5jZWxsZWQgfHwgIWdhbWVPYmplY3QuaW5wdXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFib3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBJZiB0aGV5IHJlbGVhc2VkIG91dHNpZGUgdGhlIGNhbnZhcywgYnV0IHByZXNzZWQgZG93biBpbnNpZGUgaXQsIHdlJ2xsIHN0aWxsIGRpc3BhdGNoIHRoZSBldmVudC5cclxuICAgICAgICBpZiAoIWFib3J0ZWQgJiYgdGhpcy5tYW5hZ2VyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHBvaW50ZXIudXBFbGVtZW50ID09PSB0aGlzLm1hbmFnZXIuZ2FtZS5jYW52YXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUE9JTlRFUl9VUCwgcG9pbnRlciwgY3VycmVudGx5T3Zlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlBPSU5URVJfVVBfT1VUU0lERSwgcG9pbnRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50bHlPdmVyLmxlbmd0aDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWV1ZXMgYSBHYW1lIE9iamVjdCBmb3IgaW5zZXJ0aW9uIGludG8gdGhpcyBJbnB1dCBQbHVnaW4gb24gdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3F1ZXVlRm9ySW5zZXJ0aW9uXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgdG8gYWRkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBxdWV1ZUZvckluc2VydGlvbjogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nSW5zZXJ0aW9uLmluZGV4T2YoY2hpbGQpID09PSAtMSAmJiB0aGlzLl9saXN0LmluZGV4T2YoY2hpbGQpID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdJbnNlcnRpb24ucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWV1ZXMgYSBHYW1lIE9iamVjdCBmb3IgcmVtb3ZhbCBmcm9tIHRoaXMgSW5wdXQgUGx1Z2luIG9uIHRoZSBuZXh0IHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNxdWV1ZUZvclJlbW92YWxcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBHYW1lIE9iamVjdCB0byByZW1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBJbnB1dFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHF1ZXVlRm9yUmVtb3ZhbDogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZW1vdmFsLnB1c2goY2hpbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkcmFnZ2FibGUgc3RhdGUgb2YgdGhlIGdpdmVuIGFycmF5IG9mIEdhbWUgT2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBUaGV5IGNhbiBlaXRoZXIgYmUgc2V0IHRvIGJlIGRyYWdnYWJsZSwgb3IgY2FuIGhhdmUgdGhlaXIgZHJhZ2dhYmxlIHN0YXRlIHJlbW92ZWQgYnkgcGFzc2luZyBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEEgR2FtZSBPYmplY3Qgd2lsbCBub3QgZmlyZSBkcmFnIGV2ZW50cyB1bmxlc3MgaXQgaGFzIGJlZW4gc3BlY2lmaWNhbGx5IGVuYWJsZWQgZm9yIGRyYWcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0RHJhZ2dhYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gZ2FtZU9iamVjdHMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgdG8gY2hhbmdlIHRoZSBkcmFnZ2FibGUgc3RhdGUgb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIFNldCB0byBgdHJ1ZWAgaWYgdGhlIEdhbWUgT2JqZWN0cyBzaG91bGQgYmUgbWFkZSBkcmFnZ2FibGUsIGBmYWxzZWAgaWYgdGhleSBzaG91bGQgYmUgdW5zZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBJbnB1dFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldERyYWdnYWJsZTogZnVuY3Rpb24gKGdhbWVPYmplY3RzLCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdhbWVPYmplY3RzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdhbWVPYmplY3RzID0gWyBnYW1lT2JqZWN0cyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYW1lT2JqZWN0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gZ2FtZU9iamVjdHNbaV07XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmlucHV0LmRyYWdnYWJsZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZHJhZ2dhYmxlLmluZGV4T2YoZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgaW5kZXggPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnZ2FibGUucHVzaChnYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICghdmFsdWUgJiYgaW5kZXggPiAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ2dhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gYHNldEludGVyYWN0aXZlYCwgYGVuYWJsZWAgb3IgYHNldEhpdEFyZWFgIHRoYXQgd2lsbCBoYW5kbGVcclxuICAgICAqIHBpeGVsLXBlcmZlY3QgaW5wdXQgZGV0ZWN0aW9uIG9uIGFuIEltYWdlIG9yIFNwcml0ZSBiYXNlZCBHYW1lIE9iamVjdCwgb3IgYW55IGN1c3RvbSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlbS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgY3JlYXRlIGEgc3ByaXRlIHRoYXQgaXMgY2xpY2thYmxlIG9uIGFueSBwaXhlbCB0aGF0IGhhcyBhbiBhbHBoYSB2YWx1ZSA+PSAxLlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuYWRkLnNwcml0ZSh4LCB5LCBrZXkpLnNldEludGVyYWN0aXZlKHRoaXMuaW5wdXQubWFrZVBpeGVsUGVyZmVjdCgpKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBjcmVhdGUgYSBzcHJpdGUgdGhhdCBpcyBjbGlja2FibGUgb24gYW55IHBpeGVsIHRoYXQgaGFzIGFuIGFscGhhIHZhbHVlID49IDE1MC5cclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmFkZC5zcHJpdGUoeCwgeSwga2V5KS5zZXRJbnRlcmFjdGl2ZSh0aGlzLmlucHV0Lm1ha2VQaXhlbFBlcmZlY3QoMTUwKSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gSW50ZXJhY3RpdmUgT2JqZWN0IHBpeGVsIHBlcmZlY3QgaXQgaW1wYWN0cyBhbGwgaW5wdXQgcmVsYXRlZCBldmVudHMgZm9yIGl0OiBkb3duLCB1cCxcclxuICAgICAqIGRyYWdzdGFydCwgZHJhZywgZXRjLlxyXG4gICAgICpcclxuICAgICAqIEFzIGEgcG9pbnRlciBpbnRlcmFjdHMgd2l0aCB0aGUgR2FtZSBPYmplY3QgaXQgd2lsbCBjb25zdGFudGx5IHBvbGwgdGhlIHRleHR1cmUsIGV4dHJhY3RpbmcgYSBzaW5nbGUgcGl4ZWwgZnJvbVxyXG4gICAgICogdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCBjaGVja2luZyBpdHMgY29sb3IgdmFsdWVzLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBwcm9jZXNzLCBzbyBzaG91bGQgb25seSBiZSBlbmFibGVkIG9uXHJcbiAgICAgKiBHYW1lIE9iamVjdHMgdGhhdCByZWFsbHkgbmVlZCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2Fubm90IG1ha2Ugbm9uLXRleHR1cmUgYmFzZWQgR2FtZSBPYmplY3RzIHBpeGVsIHBlcmZlY3QuIFNvIHRoaXMgd2lsbCBub3Qgd29yayBvbiBHcmFwaGljcywgQml0bWFwVGV4dCxcclxuICAgICAqIFJlbmRlciBUZXh0dXJlcywgVGV4dCwgVGlsZW1hcHMsIENvbnRhaW5lcnMgb3IgUGFydGljbGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI21ha2VQaXhlbFBlcmZlY3RcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFthbHBoYVRvbGVyYW5jZT0xXSAtIFRoZSBhbHBoYSBsZXZlbCB0aGF0IHRoZSBwaXhlbCBzaG91bGQgYmUgYWJvdmUgdG8gYmUgaW5jbHVkZWQgYXMgYSBzdWNjZXNzZnVsIGludGVyYWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBBIFBpeGVsIFBlcmZlY3QgSGFuZGxlciBmb3IgdXNlIGFzIGEgaGl0QXJlYSBzaGFwZSBjYWxsYmFjay5cclxuICAgICAqL1xyXG4gICAgbWFrZVBpeGVsUGVyZmVjdDogZnVuY3Rpb24gKGFscGhhVG9sZXJhbmNlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhbHBoYVRvbGVyYW5jZSA9PT0gdW5kZWZpbmVkKSB7IGFscGhhVG9sZXJhbmNlID0gMTsgfVxyXG5cclxuICAgICAgICB2YXIgdGV4dHVyZU1hbmFnZXIgPSB0aGlzLnN5c3RlbXMudGV4dHVyZXM7XHJcblxyXG4gICAgICAgIHJldHVybiBDcmVhdGVQaXhlbFBlcmZlY3RIYW5kbGVyKHRleHR1cmVNYW5hZ2VyLCBhbHBoYVRvbGVyYW5jZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGl0IGFyZWEgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBHYW1lIE9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQSBoaXQgYXJlYSBpcyB0eXBpY2FsbHkgb25lIG9mIHRoZSBnZW9tZXRyaWMgc2hhcGVzIFBoYXNlciBwcm92aWRlcywgc3VjaCBhcyBhIGBQaGFzZXIuR2VvbS5SZWN0YW5nbGVgXHJcbiAgICAgKiBvciBgUGhhc2VyLkdlb20uQ2lyY2xlYC4gSG93ZXZlciwgaXQgY2FuIGJlIGFueSBvYmplY3QgYXMgbG9uZyBhcyBpdCB3b3JrcyB3aXRoIHRoZSBwcm92aWRlZCBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBoaXQgYXJlYSBpcyBwcm92aWRlZCBhIFJlY3RhbmdsZSBpcyBjcmVhdGVkIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBHYW1lIE9iamVjdCwgaWYgcG9zc2libGVcclxuICAgICAqIHRvIGNhbGN1bGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgaGl0IGFyZWEgY2FsbGJhY2sgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gYHhgIGFuZCBgeWAgY29vcmRpbmF0ZSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gaWZcclxuICAgICAqIHRob3NlIHZhbHVlcyBmYWxsIHdpdGhpbiB0aGUgYXJlYSBvZiB0aGUgc2hhcGUgb3Igbm90LiBBbGwgb2YgdGhlIFBoYXNlciBnZW9tZXRyeSBvYmplY3RzIHByb3ZpZGUgdGhpcyxcclxuICAgICAqIHN1Y2ggYXMgYFBoYXNlci5HZW9tLlJlY3RhbmdsZS5Db250YWluc2AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0SGl0QXJlYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGdhbWVPYmplY3RzIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIHNldCB0aGUgaGl0IGFyZWEgb24uXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuSW5wdXQuSW5wdXRDb25maWd1cmF0aW9ufGFueSl9IFtzaGFwZV0gLSBFaXRoZXIgYW4gaW5wdXQgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGEgZ2VvbWV0cmljIHNoYXBlIHRoYXQgZGVmaW5lcyB0aGUgaGl0IGFyZWEgZm9yIHRoZSBHYW1lIE9iamVjdC4gSWYgbm90IHNwZWNpZmllZCBhIFJlY3RhbmdsZSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5IaXRBcmVhQ2FsbGJhY2t9IFtjYWxsYmFja10gLSBUaGUgJ2NvbnRhaW5zJyBmdW5jdGlvbiB0byBpbnZva2UgdG8gY2hlY2sgaWYgdGhlIHBvaW50ZXIgaXMgd2l0aGluIHRoZSBoaXQgYXJlYS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIElucHV0UGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SGl0QXJlYTogZnVuY3Rpb24gKGdhbWVPYmplY3RzLCBzaGFwZSwgY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNoYXBlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRIaXRBcmVhRnJvbVRleHR1cmUoZ2FtZU9iamVjdHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGdhbWVPYmplY3RzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdhbWVPYmplY3RzID0gWyBnYW1lT2JqZWN0cyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRyYWdnYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBkcm9wWm9uZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjdXJzb3IgPSBmYWxzZTtcclxuICAgICAgICB2YXIgdXNlSGFuZEN1cnNvciA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBwaXhlbFBlcmZlY3QgPSBmYWxzZTtcclxuICAgICAgICB2YXIgY3VzdG9tSGl0QXJlYSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vICBDb25maWcgb2JqZWN0P1xyXG4gICAgICAgIGlmIChJc1BsYWluT2JqZWN0KHNoYXBlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBzaGFwZTtcclxuXHJcbiAgICAgICAgICAgIHNoYXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2hpdEFyZWEnLCBudWxsKTtcclxuICAgICAgICAgICAgY2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaGl0QXJlYUNhbGxiYWNrJywgbnVsbCk7XHJcbiAgICAgICAgICAgIGRyYWdnYWJsZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdkcmFnZ2FibGUnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGRyb3Bab25lID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2Ryb3Bab25lJywgZmFsc2UpO1xyXG4gICAgICAgICAgICBjdXJzb3IgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY3Vyc29yJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB1c2VIYW5kQ3Vyc29yID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VzZUhhbmRDdXJzb3InLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBwaXhlbFBlcmZlY3QgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAncGl4ZWxQZXJmZWN0JywgZmFsc2UpO1xyXG4gICAgICAgICAgICB2YXIgYWxwaGFUb2xlcmFuY2UgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYWxwaGFUb2xlcmFuY2UnLCAxKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwaXhlbFBlcmZlY3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNoYXBlID0ge307XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHRoaXMubWFrZVBpeGVsUGVyZmVjdChhbHBoYVRvbGVyYW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICBTdGlsbCBubyBoaXRBcmVhIG9yIGNhbGxiYWNrP1xyXG4gICAgICAgICAgICBpZiAoIXNoYXBlIHx8ICFjYWxsYmFjaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIaXRBcmVhRnJvbVRleHR1cmUoZ2FtZU9iamVjdHMpO1xyXG4gICAgICAgICAgICAgICAgY3VzdG9tSGl0QXJlYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzaGFwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhY2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFjayA9IHNoYXBlO1xyXG4gICAgICAgICAgICBzaGFwZSA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYW1lT2JqZWN0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBnYW1lT2JqZWN0ID0gZ2FtZU9iamVjdHNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAocGl4ZWxQZXJmZWN0ICYmIGdhbWVPYmplY3QudHlwZSA9PT0gJ0NvbnRhaW5lcicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHBpeGVsUGVyZmVjdCB0ZXN0IGEgQ29udGFpbmVyLiBVc2UgYSBjdXN0b20gY2FsbGJhY2suJyk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGlvID0gKCFnYW1lT2JqZWN0LmlucHV0KSA/IENyZWF0ZUludGVyYWN0aXZlT2JqZWN0KGdhbWVPYmplY3QsIHNoYXBlLCBjYWxsYmFjaykgOiBnYW1lT2JqZWN0LmlucHV0O1xyXG5cclxuICAgICAgICAgICAgaW8uY3VzdG9tSGl0QXJlYSA9IGN1c3RvbUhpdEFyZWE7XHJcbiAgICAgICAgICAgIGlvLmRyb3Bab25lID0gZHJvcFpvbmU7XHJcbiAgICAgICAgICAgIGlvLmN1cnNvciA9ICh1c2VIYW5kQ3Vyc29yKSA/ICdwb2ludGVyJyA6IGN1cnNvcjtcclxuXHJcbiAgICAgICAgICAgIGdhbWVPYmplY3QuaW5wdXQgPSBpbztcclxuXHJcbiAgICAgICAgICAgIGlmIChkcmFnZ2FibGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJhZ2dhYmxlKGdhbWVPYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnF1ZXVlRm9ySW5zZXJ0aW9uKGdhbWVPYmplY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGl0IGFyZWEgZm9yIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0byBiZSBhIGBQaGFzZXIuR2VvbS5DaXJjbGVgIHNoYXBlLCB1c2luZ1xyXG4gICAgICogdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCByYWRpdXMgdG8gY29udHJvbCBpdHMgcG9zaXRpb24gYW5kIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0SGl0QXJlYUNpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGdhbWVPYmplY3RzIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIHNldCBhcyBoYXZpbmcgYSBjaXJjbGUgaGl0IGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkhpdEFyZWFDYWxsYmFja30gW2NhbGxiYWNrXSAtIFRoZSBoaXQgYXJlYSBjYWxsYmFjay4gSWYgdW5kZWZpbmVkIGl0IHVzZXMgQ2lyY2xlLkNvbnRhaW5zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRIaXRBcmVhQ2lyY2xlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdHMsIHgsIHksIHJhZGl1cywgY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgY2FsbGJhY2sgPSBDaXJjbGVDb250YWluczsgfVxyXG5cclxuICAgICAgICB2YXIgc2hhcGUgPSBuZXcgQ2lyY2xlKHgsIHksIHJhZGl1cyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEhpdEFyZWEoZ2FtZU9iamVjdHMsIHNoYXBlLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGl0IGFyZWEgZm9yIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0byBiZSBhIGBQaGFzZXIuR2VvbS5FbGxpcHNlYCBzaGFwZSwgdXNpbmdcclxuICAgICAqIHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgZGltZW5zaW9ucyB0byBjb250cm9sIGl0cyBwb3NpdGlvbiBhbmQgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNzZXRIaXRBcmVhRWxsaXBzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGdhbWVPYmplY3RzIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIHNldCBhcyBoYXZpbmcgYW4gZWxsaXBzZSBoaXQgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhlIGhpdCBhcmVhIGNhbGxiYWNrLiBJZiB1bmRlZmluZWQgaXQgdXNlcyBFbGxpcHNlLkNvbnRhaW5zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRIaXRBcmVhRWxsaXBzZTogZnVuY3Rpb24gKGdhbWVPYmplY3RzLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFjayA9IEVsbGlwc2VDb250YWluczsgfVxyXG5cclxuICAgICAgICB2YXIgc2hhcGUgPSBuZXcgRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0SGl0QXJlYShnYW1lT2JqZWN0cywgc2hhcGUsIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBoaXQgYXJlYSBmb3IgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIGJlIGEgYFBoYXNlci5HZW9tLlJlY3RhbmdsZWAgc2hhcGUsIHVzaW5nXHJcbiAgICAgKiB0aGUgR2FtZSBPYmplY3RzIHRleHR1cmUgZnJhbWUgdG8gZGVmaW5lIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgaGl0IGFyZWEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0SGl0QXJlYUZyb21UZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gZ2FtZU9iamVjdHMgLSBBbiBhcnJheSBvZiBHYW1lIE9iamVjdHMgdG8gc2V0IGFzIGhhdmluZyBhbiBlbGxpcHNlIGhpdCBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhlIGhpdCBhcmVhIGNhbGxiYWNrLiBJZiB1bmRlZmluZWQgaXQgdXNlcyBSZWN0YW5nbGUuQ29udGFpbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBJbnB1dFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEhpdEFyZWFGcm9tVGV4dHVyZTogZnVuY3Rpb24gKGdhbWVPYmplY3RzLCBjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFjayA9IFJlY3RhbmdsZUNvbnRhaW5zOyB9XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShnYW1lT2JqZWN0cykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0cyA9IFsgZ2FtZU9iamVjdHMgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2FtZU9iamVjdHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IGdhbWVPYmplY3RzW2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGZyYW1lID0gZ2FtZU9iamVjdC5mcmFtZTtcclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGdhbWVPYmplY3Qud2lkdGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gZ2FtZU9iamVjdC53aWR0aDtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGdhbWVPYmplY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZyYW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGZyYW1lLnJlYWxXaWR0aDtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGZyYW1lLnJlYWxIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChnYW1lT2JqZWN0LnR5cGUgPT09ICdDb250YWluZXInICYmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRhaW5lci5zZXRJbnRlcmFjdGl2ZSBtdXN0IHNwZWNpZnkgYSBTaGFwZSBvciBjYWxsIHNldFNpemUoKSBmaXJzdCcpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMCAmJiBoZWlnaHQgIT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdhbWVPYmplY3QuaW5wdXQgPSBDcmVhdGVJbnRlcmFjdGl2ZU9iamVjdChnYW1lT2JqZWN0LCBuZXcgUmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpLCBjYWxsYmFjayk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZUZvckluc2VydGlvbihnYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGl0IGFyZWEgZm9yIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0byBiZSBhIGBQaGFzZXIuR2VvbS5SZWN0YW5nbGVgIHNoYXBlLCB1c2luZ1xyXG4gICAgICogdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCBkaW1lbnNpb25zIHRvIGNvbnRyb2wgaXRzIHBvc2l0aW9uIGFuZCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldEhpdEFyZWFSZWN0YW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W10pfSBnYW1lT2JqZWN0cyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0byBzZXQgYXMgaGF2aW5nIGEgcmVjdGFuZ3VsYXIgaGl0IGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB0b3AtbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkhpdEFyZWFDYWxsYmFja30gW2NhbGxiYWNrXSAtIFRoZSBoaXQgYXJlYSBjYWxsYmFjay4gSWYgdW5kZWZpbmVkIGl0IHVzZXMgUmVjdGFuZ2xlLkNvbnRhaW5zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRIaXRBcmVhUmVjdGFuZ2xlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNhbGxiYWNrID0gUmVjdGFuZ2xlQ29udGFpbnM7IH1cclxuXHJcbiAgICAgICAgdmFyIHNoYXBlID0gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0SGl0QXJlYShnYW1lT2JqZWN0cywgc2hhcGUsIGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBoaXQgYXJlYSBmb3IgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIGJlIGEgYFBoYXNlci5HZW9tLlRyaWFuZ2xlYCBzaGFwZSwgdXNpbmdcclxuICAgICAqIHRoZSBnaXZlbiBjb29yZGluYXRlcyB0byBjb250cm9sIHRoZSBwb3NpdGlvbiBvZiBpdHMgcG9pbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldEhpdEFyZWFUcmlhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IGdhbWVPYmplY3RzIC0gQW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzIHRvIHNldCBhcyBoYXZpbmcgYSAgdHJpYW5ndWxhciBoaXQgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSB0cmlhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSB0cmlhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludCBvZiB0aGUgdHJpYW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgzIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkzIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgcG9pbnQgb2YgdGhlIHRyaWFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuSGl0QXJlYUNhbGxiYWNrfSBbY2FsbGJhY2tdIC0gVGhlIGhpdCBhcmVhIGNhbGxiYWNrLiBJZiB1bmRlZmluZWQgaXQgdXNlcyBUcmlhbmdsZS5Db250YWlucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIElucHV0UGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SGl0QXJlYVRyaWFuZ2xlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdHMsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNhbGxiYWNrID0gVHJpYW5nbGVDb250YWluczsgfVxyXG5cclxuICAgICAgICB2YXIgc2hhcGUgPSBuZXcgVHJpYW5nbGUoeDEsIHkxLCB4MiwgeTIsIHgzLCB5Myk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEhpdEFyZWEoZ2FtZU9iamVjdHMsIHNoYXBlLCBjYWxsYmFjayk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBJbnB1dCBEZWJ1ZyBTaGFwZSBmb3IgdGhlIGdpdmVuIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBHYW1lIE9iamVjdCBtdXN0IGhhdmUgX2FscmVhZHlfIGJlZW4gZW5hYmxlZCBmb3IgaW5wdXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGludGVuZGVkIHRvIGFzc2lzdCB5b3UgZHVyaW5nIGRldmVsb3BtZW50IGFuZCBkZWJ1Z2dpbmcuXHJcbiAgICAgKlxyXG4gICAgICogRGVidWcgU2hhcGVzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIEdhbWUgT2JqZWN0cyB0aGF0IGFyZSB1c2luZyBzdGFuZGFyZCBQaGFzZXIgR2VvbWV0cnkgZm9yIGlucHV0LFxyXG4gICAgICogaW5jbHVkaW5nOiBDaXJjbGUsIEVsbGlwc2UsIExpbmUsIFBvbHlnb24sIFJlY3RhbmdsZSBhbmQgVHJpYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogR2FtZSBPYmplY3RzIHRoYXQgYXJlIHVzaW5nIHRoZWlyIGF1dG9tYXRpYyBoaXQgYXJlYXMgYXJlIHVzaW5nIFJlY3RhbmdsZXMgYnkgZGVmYXVsdCwgc28gd2lsbCBhbHNvIHdvcmsuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIERlYnVnIFNoYXBlIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBkaXNwbGF5IGxpc3QgYW5kIGlzIHRoZW4ga2VwdCBpbiBzeW5jIHdpdGggdGhlIEdhbWUgT2JqZWN0XHJcbiAgICAgKiBpdCBpcyBjb25uZWN0ZWQgd2l0aC4gU2hvdWxkIHlvdSBuZWVkIHRvIG1vZGlmeSBpdCB5b3Vyc2VsZiwgc3VjaCBhcyB0byBoaWRlIGl0LCB5b3UgY2FuIGFjY2VzcyBpdCB2aWFcclxuICAgICAqIHRoZSBHYW1lIE9iamVjdCBwcm9wZXJ0eTogYEdhbWVPYmplY3QuaW5wdXQuaGl0QXJlYURlYnVnYC5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgR2FtZSBPYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBhIERlYnVnIFNoYXBlIHdpbGwgZmlyc3QgZGVzdHJveSB0aGUgb2xkIHNoYXBlLFxyXG4gICAgICogYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4gSWYgeW91IHdpc2ggdG8gcmVtb3ZlIHRoZSBEZWJ1ZyBTaGFwZSBlbnRpcmVseSwgeW91IHNob3VsZCBjYWxsIHRoZVxyXG4gICAgICogbWV0aG9kIGBJbnB1dFBsdWdpbi5yZW1vdmVEZWJ1Z2AuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGF0IHRoZSBkZWJ1ZyBzaGFwZSB3aWxsIG9ubHkgc2hvdyB0aGUgb3V0bGluZSBvZiB0aGUgaW5wdXQgYXJlYS4gSWYgdGhlIGlucHV0IHRlc3QgaXMgdXNpbmcgYVxyXG4gICAgICogcGl4ZWwgcGVyZmVjdCBjaGVjaywgZm9yIGV4YW1wbGUsIHRoZW4gdGhpcyBpcyBub3QgZGlzcGxheWVkLiBJZiB5b3UgYXJlIHVzaW5nIGEgY3VzdG9tIHNoYXBlLCB0aGF0XHJcbiAgICAgKiBkb2Vzbid0IGV4dGVuZCBvbmUgb2YgdGhlIGJhc2UgUGhhc2VyIEdlb21ldHJ5IG9iamVjdHMsIGFzIHlvdXIgaGl0IGFyZWEsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBub3RcclxuICAgICAqIHdvcmsuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jZW5hYmxlRGVidWdcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGNyZWF0ZSB0aGUgaW5wdXQgZGVidWcgc2hhcGUgZm9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb2xvcj0weDAwZmYwMF0gLSBUaGUgb3V0bGluZSBjb2xvciBvZiB0aGUgZGVidWcgc2hhcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBJbnB1dCBQbHVnaW4uXHJcbiAgICAgKi9cclxuICAgIGVuYWJsZURlYnVnOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgY29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbG9yID09PSB1bmRlZmluZWQpIHsgY29sb3IgPSAweDAwZmYwMDsgfVxyXG5cclxuICAgICAgICB2YXIgaW5wdXQgPSBnYW1lT2JqZWN0LmlucHV0O1xyXG5cclxuICAgICAgICBpZiAoIWlucHV0IHx8ICFpbnB1dC5oaXRBcmVhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgc2hhcGUgPSBpbnB1dC5oaXRBcmVhO1xyXG4gICAgICAgIHZhciBzaGFwZVR5cGUgPSBzaGFwZS50eXBlO1xyXG4gICAgICAgIHZhciBkZWJ1ZyA9IGlucHV0LmhpdEFyZWFEZWJ1ZztcclxuICAgICAgICB2YXIgZmFjdG9yeSA9IHRoaXMuc3lzdGVtcy5hZGQ7XHJcbiAgICAgICAgdmFyIHVwZGF0ZUxpc3QgPSB0aGlzLnN5c3RlbXMudXBkYXRlTGlzdDtcclxuXHJcbiAgICAgICAgaWYgKGRlYnVnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdXBkYXRlTGlzdC5yZW1vdmUoZGVidWcpO1xyXG5cclxuICAgICAgICAgICAgZGVidWcuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgZGVidWcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9mZnNldHggPSAwO1xyXG4gICAgICAgIHZhciBvZmZzZXR5ID0gMDtcclxuICAgICAgICBzd2l0Y2ggKHNoYXBlVHlwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgR0VPTV9DT05TVC5DSVJDTEU6XHJcbiAgICAgICAgICAgICAgICBkZWJ1ZyA9IGZhY3RvcnkuYXJjKDAsIDAsIHNoYXBlLnJhZGl1cyk7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXR4ID0gc2hhcGUueCAtIHNoYXBlLnJhZGl1cztcclxuICAgICAgICAgICAgICAgIG9mZnNldHkgPSBzaGFwZS55IC0gc2hhcGUucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEdFT01fQ09OU1QuRUxMSVBTRTpcclxuICAgICAgICAgICAgICAgIGRlYnVnID0gZmFjdG9yeS5lbGxpcHNlKDAsIDAsIHNoYXBlLndpZHRoLCBzaGFwZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0eCA9IHNoYXBlLnggLSBzaGFwZS53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXR5ID0gc2hhcGUueSAtIHNoYXBlLmhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgR0VPTV9DT05TVC5MSU5FOlxyXG4gICAgICAgICAgICAgICAgZGVidWcgPSBmYWN0b3J5LmxpbmUoMCwgMCwgc2hhcGUueDEsIHNoYXBlLnkxLCBzaGFwZS54Miwgc2hhcGUueTIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEdFT01fQ09OU1QuUE9MWUdPTjpcclxuICAgICAgICAgICAgICAgIGRlYnVnID0gZmFjdG9yeS5wb2x5Z29uKDAsIDAsIHNoYXBlLnBvaW50cyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgR0VPTV9DT05TVC5SRUNUQU5HTEU6XHJcbiAgICAgICAgICAgICAgICBkZWJ1ZyA9IGZhY3RvcnkucmVjdGFuZ2xlKDAsIDAsIHNoYXBlLndpZHRoLCBzaGFwZS5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0eCA9IHNoYXBlLng7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXR5ID0gc2hhcGUueTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBHRU9NX0NPTlNULlRSSUFOR0xFOlxyXG4gICAgICAgICAgICAgICAgZGVidWcgPSBmYWN0b3J5LnRyaWFuZ2xlKDAsIDAsIHNoYXBlLngxLCBzaGFwZS55MSwgc2hhcGUueDIsIHNoYXBlLnkyLCBzaGFwZS54Mywgc2hhcGUueTMpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGVidWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWJ1Zy5pc0ZpbGxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgZGVidWcucHJlVXBkYXRlID0gZnVuY3Rpb24gKClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGVidWcuc2V0U3Ryb2tlU3R5bGUoMSAvIGdhbWVPYmplY3Quc2NhbGUsIGNvbG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkZWJ1Zy5zZXREaXNwbGF5T3JpZ2luKGdhbWVPYmplY3QuZGlzcGxheU9yaWdpblgsIGdhbWVPYmplY3QuZGlzcGxheU9yaWdpblkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciB4ID0gZ2FtZU9iamVjdC54O1xyXG4gICAgICAgICAgICAgICAgdmFyIHkgPSBnYW1lT2JqZWN0Lnk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcm90YXRpb24gPSBnYW1lT2JqZWN0LnJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNjYWxlWCA9IGdhbWVPYmplY3Quc2NhbGVYO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNjYWxlWSA9IGdhbWVPYmplY3Quc2NhbGVZO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChnYW1lT2JqZWN0LnBhcmVudENvbnRhaW5lcilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0cml4ID0gZ2FtZU9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB4ID0gbWF0cml4LnR4O1xyXG4gICAgICAgICAgICAgICAgICAgIHkgPSBtYXRyaXgudHk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSBtYXRyaXgucm90YXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYID0gbWF0cml4LnNjYWxlWDtcclxuICAgICAgICAgICAgICAgICAgICBzY2FsZVkgPSBtYXRyaXguc2NhbGVZO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGRlYnVnLnNldFJvdGF0aW9uKHJvdGF0aW9uKTtcclxuICAgICAgICAgICAgICAgIGRlYnVnLnNldFNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcclxuICAgICAgICAgICAgICAgIGRlYnVnLnNldFBvc2l0aW9uKHggKyBvZmZzZXR4LCB5ICsgb2Zmc2V0eSk7XHJcbiAgICAgICAgICAgICAgICBkZWJ1Zy5zZXRTY3JvbGxGYWN0b3IoZ2FtZU9iamVjdC5zY3JvbGxGYWN0b3JYLCBnYW1lT2JqZWN0LnNjcm9sbEZhY3RvclkpO1xyXG4gICAgICAgICAgICAgICAgZGVidWcuc2V0RGVwdGgoZ2FtZU9iamVjdC5kZXB0aCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB1cGRhdGVMaXN0LmFkZChkZWJ1Zyk7XHJcblxyXG4gICAgICAgICAgICBpbnB1dC5oaXRBcmVhRGVidWcgPSBkZWJ1ZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYW4gSW5wdXQgRGVidWcgU2hhcGUgZnJvbSB0aGUgZ2l2ZW4gR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHNoYXBlIGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhbmQgdGhlIGBoaXRBcmVhRGVidWdgIHByb3BlcnR5IGlzIHNldCB0byBgbnVsbGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcmVtb3ZlRGVidWdcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIHJlbW92ZSB0aGUgaW5wdXQgZGVidWcgc2hhcGUgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIElucHV0IFBsdWdpbi5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRGVidWc6IGZ1bmN0aW9uIChnYW1lT2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbnB1dCA9IGdhbWVPYmplY3QuaW5wdXQ7XHJcblxyXG4gICAgICAgIGlmIChpbnB1dCAmJiBpbnB1dC5oaXRBcmVhRGVidWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGVidWcgPSBpbnB1dC5oaXRBcmVhRGVidWc7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN5c3RlbXMudXBkYXRlTGlzdC5yZW1vdmUoZGVidWcpO1xyXG5cclxuICAgICAgICAgICAgZGVidWcuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgaW5wdXQuaGl0QXJlYURlYnVnID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIFBvaW50ZXJzIHRvIGFsd2F5cyBwb2xsLlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gYSBwb2ludGVyIGlzIHBvbGxlZCBpdCBydW5zIGEgaGl0IHRlc3QgdG8gc2VlIHdoaWNoIEdhbWUgT2JqZWN0cyBhcmUgY3VycmVudGx5IGJlbG93IGl0LFxyXG4gICAgICogb3IgYmVpbmcgaW50ZXJhY3RlZCB3aXRoIGl0LCByZWdhcmRsZXNzIGlmIHRoZSBQb2ludGVyIGhhcyBhY3R1YWxseSBtb3ZlZCBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogWW91IHNob3VsZCBlbmFibGUgdGhpcyBpZiB5b3Ugd2FudCBvYmplY3RzIGluIHlvdXIgZ2FtZSB0byBmaXJlIG92ZXIgLyBvdXQgZXZlbnRzLCBhbmQgdGhlIG9iamVjdHNcclxuICAgICAqIGFyZSBjb25zdGFudGx5IG1vdmluZywgYnV0IHRoZSBwb2ludGVyIG1heSBub3QgaGF2ZS4gUG9sbGluZyBldmVyeSBmcmFtZSBoYXMgYWRkaXRpb25hbCBjb21wdXRhdGlvblxyXG4gICAgICogY29zdHMsIGVzcGVjaWFsbHkgaWYgdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIGludGVyYWN0aXZlIG9iamVjdHMgaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldFBvbGxBbHdheXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb2xsQWx3YXlzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFBvbGxSYXRlKDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIFBvaW50ZXJzIHRvIG9ubHkgcG9sbCB3aGVuIHRoZXkgYXJlIG1vdmVkIG9yIHVwZGF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBhIHBvaW50ZXIgaXMgcG9sbGVkIGl0IHJ1bnMgYSBoaXQgdGVzdCB0byBzZWUgd2hpY2ggR2FtZSBPYmplY3RzIGFyZSBjdXJyZW50bHkgYmVsb3cgaXQsXHJcbiAgICAgKiBvciBiZWluZyBpbnRlcmFjdGVkIHdpdGggaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0UG9sbE9uTW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBJbnB1dFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFBvbGxPbk1vdmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UG9sbFJhdGUoLTEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBvbGwgcmF0ZSB2YWx1ZS4gVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCBzaG91bGQgaGF2ZSBlbGFwc2VkIGJlZm9yZSBhIHBvaW50ZXJcclxuICAgICAqIHdpbGwgYmUgcG9sbGVkIGFnYWluLiBTZWUgdGhlIGBzZXRQb2xsQWx3YXlzYCBhbmQgYHNldFBvbGxPbk1vdmVgIG1ldGhvZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0UG9sbFJhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbXMsIHRoYXQgc2hvdWxkIGVsYXBzZWQgYmVmb3JlIHJlLXBvbGxpbmcgdGhlIHBvaW50ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb2xsUmF0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucG9sbFJhdGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl9wb2xsVGltZXIgPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAgdGhlIGdsb2JhbCBJbnB1dCBNYW5hZ2VyIHdpbGwgZW11bGF0ZSBET00gYmVoYXZpb3IgYnkgb25seSBlbWl0dGluZyBldmVudHMgZnJvbVxyXG4gICAgICogdGhlIHRvcC1tb3N0IFNjZW5lIGluIHRoZSBTY2VuZSBMaXN0LiBCeSBkZWZhdWx0LCBpZiBhIFNjZW5lIHJlY2VpdmVzIGFuIGlucHV0IGV2ZW50IGl0IHdpbGwgdGhlbiBzdG9wIHRoZSBldmVudFxyXG4gICAgICogZnJvbSBmbG93aW5nIGRvd24gdG8gYW55IFNjZW5lcyBiZWxvdyBpdCBpbiB0aGUgU2NlbmUgbGlzdC4gVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NldEdsb2JhbFRvcE9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBTZXQgdG8gYHRydWVgIHRvIHN0b3AgcHJvY2Vzc2luZyBpbnB1dCBldmVudHMgb24gdGhlIFNjZW5lIHRoYXQgcmVjZWl2ZXMgaXQsIG9yIGBmYWxzZWAgdG8gbGV0IHRoZSBldmVudCBjb250aW51ZSBkb3duIHRoZSBTY2VuZSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRHbG9iYWxUb3BPbmx5OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmdsb2JhbFRvcE9ubHkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBzZXQgdG8gYHRydWVgIHRoaXMgSW5wdXQgUGx1Z2luIHdpbGwgZW11bGF0ZSBET00gYmVoYXZpb3IgYnkgb25seSBlbWl0dGluZyBldmVudHMgZnJvbVxyXG4gICAgICogdGhlIHRvcC1tb3N0IEdhbWUgT2JqZWN0cyBpbiB0aGUgRGlzcGxheSBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIElmIHNldCB0byBgZmFsc2VgIGl0IHdpbGwgZW1pdCBldmVudHMgZnJvbSBhbGwgR2FtZSBPYmplY3RzIGJlbG93IGEgUG9pbnRlciwgbm90IGp1c3QgdGhlIHRvcCBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jc2V0VG9wT25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBvbmx5IGluY2x1ZGUgdGhlIHRvcC1tb3N0IEdhbWUgT2JqZWN0LCBvciBgZmFsc2VgIHRvIGluY2x1ZGUgYWxsIEdhbWUgT2JqZWN0cyBpbiBhIGhpdCB0ZXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUb3BPbmx5OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50b3BPbmx5ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgc29ydCB0aGUgYXJyYXkgYW5kIHJldHVybiBpdCwgc28gdGhhdCB0aGUgb2JqZWN0cyBhcmUgaW4gZGVwdGggaW5kZXggb3JkZXJcclxuICAgICAqIHdpdGggdGhlIGxvd2VzdCBhdCB0aGUgYm90dG9tLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NvcnRHYW1lT2JqZWN0c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBnYW1lT2JqZWN0cyAtIEFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cyB0byBiZSBzb3J0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gVGhlIHNvcnRlZCBhcnJheSBvZiBHYW1lIE9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIHNvcnRHYW1lT2JqZWN0czogZnVuY3Rpb24gKGdhbWVPYmplY3RzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0cy5sZW5ndGggPCAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdhbWVPYmplY3RzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZGVwdGhTb3J0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBnYW1lT2JqZWN0cy5zb3J0KHRoaXMuc29ydEhhbmRsZXJHTy5iaW5kKHRoaXMpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIGNoaWxkIGxvd2VzdCBkb3duIHRoZSBkaXNwbGF5IGxpc3QgKHdpdGggdGhlIHNtYWxsZXN0IGluZGV4KVxyXG4gICAgICogV2lsbCBpdGVyYXRlIHRocm91Z2ggYWxsIHBhcmVudCBjb250YWluZXJzLCBpZiBwcmVzZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NvcnRIYW5kbGVyR09cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZEEgLSBUaGUgZmlyc3QgR2FtZSBPYmplY3QgdG8gY29tcGFyZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkQiAtIFRoZSBzZWNvbmQgR2FtZSBPYmplY3QgdG8gY29tcGFyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBSZXR1cm5zIGVpdGhlciBhIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIGludGVnZXIsIG9yIHplcm8gaWYgdGhleSBtYXRjaC5cclxuICAgICAqL1xyXG4gICAgc29ydEhhbmRsZXJHTzogZnVuY3Rpb24gKGNoaWxkQSwgY2hpbGRCKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghY2hpbGRBLnBhcmVudENvbnRhaW5lciAmJiAhY2hpbGRCLnBhcmVudENvbnRhaW5lcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayBiYWlsIG91dCB3aGVuIG5laXRoZXIgY2hpbGQgaGFzIGEgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0LmdldEluZGV4KGNoaWxkQikgLSB0aGlzLmRpc3BsYXlMaXN0LmdldEluZGV4KGNoaWxkQSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNoaWxkQS5wYXJlbnRDb250YWluZXIgPT09IGNoaWxkQi5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUXVpY2sgYmFpbCBvdXQgd2hlbiBib3RoIGNoaWxkcmVuIGhhdmUgdGhlIHNhbWUgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZEIucGFyZW50Q29udGFpbmVyLmdldEluZGV4KGNoaWxkQikgLSBjaGlsZEEucGFyZW50Q29udGFpbmVyLmdldEluZGV4KGNoaWxkQSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNoaWxkQS5wYXJlbnRDb250YWluZXIgPT09IGNoaWxkQilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayBiYWlsIG91dCB3aGVuIGNoaWxkQSBpcyBhIGNoaWxkIG9mIGNoaWxkQlxyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNoaWxkQi5wYXJlbnRDb250YWluZXIgPT09IGNoaWxkQSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayBiYWlsIG91dCB3aGVuIGNoaWxkQSBpcyBhIGNoaWxkIG9mIGNoaWxkQlxyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIENvbnRhaW5lciBpbmRleCBjaGVja1xyXG4gICAgICAgICAgICB2YXIgbGlzdEEgPSBjaGlsZEEuZ2V0SW5kZXhMaXN0KCk7XHJcbiAgICAgICAgICAgIHZhciBsaXN0QiA9IGNoaWxkQi5nZXRJbmRleExpc3QoKTtcclxuICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGxpc3RBLmxlbmd0aCwgbGlzdEIubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleEEgPSBsaXN0QVtpXTtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleEIgPSBsaXN0QltpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhBID09PSBpbmRleEIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIEdvIHRvIHRoZSBuZXh0IGxldmVsIGRvd25cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgTm9uLW1hdGNoaW5nIHBhcmVudHMsIHNvIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleEIgLSBpbmRleEE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0Qi5sZW5ndGggLSBsaXN0QS5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGVjaG5pY2FsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgLi4uXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBpbnB1dCBldmVudCBoYW5kbGVyLCBzdWNoIGFzIGBwb2ludGVyZG93bmAuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBjYWxsZWQsIGl0IHN0b3BzIHRoZSBJbnB1dCBNYW5hZ2VyIGZyb20gYWxsb3dpbmcgX3RoaXMgc3BlY2lmaWMgZXZlbnRfIHRvIGJlIHByb2Nlc3NlZCBieSBhbnkgb3RoZXIgU2NlbmVcclxuICAgICAqIG5vdCB5ZXQgaGFuZGxlZCBpbiB0aGUgc2NlbmUgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNzdG9wUHJvcGFnYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLl90ZW1wU2tpcCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgbmV3IFBvaW50ZXIgb2JqZWN0cyB0byB0aGUgSW5wdXQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBCeSBkZWZhdWx0IFBoYXNlciBjcmVhdGVzIDIgcG9pbnRlciBvYmplY3RzOiBgbW91c2VQb2ludGVyYCBhbmQgYHBvaW50ZXIxYC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBtb3JlIGVpdGhlciBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBvciBieSBzZXR0aW5nIHRoZSBgaW5wdXQuYWN0aXZlUG9pbnRlcnNgIHByb3BlcnR5XHJcbiAgICAgKiBpbiB0aGUgR2FtZSBDb25maWcsIHVwIHRvIGEgbWF4aW11bSBvZiAxMCBwb2ludGVycy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZmlyc3QgMTAgcG9pbnRlcnMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlIGBJbnB1dFBsdWdpbi5wb2ludGVyWGAgcHJvcGVydGllcywgb25jZSB0aGV5IGhhdmUgYmVlbiBhZGRlZFxyXG4gICAgICogdmlhIHRoaXMgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2FkZFBvaW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtxdWFudGl0eT0xXSBUaGUgbnVtYmVyIG9mIG5ldyBQb2ludGVycyB0byBjcmVhdGUuIEEgbWF4aW11bSBvZiAxMCBpcyBhbGxvd2VkIGluIHRvdGFsLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5JbnB1dC5Qb2ludGVyW119IEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBuZXcgUG9pbnRlciBvYmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBhZGRQb2ludGVyOiBmdW5jdGlvbiAocXVhbnRpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5hZGRQb2ludGVyKHF1YW50aXR5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB0aGUgSW5wdXQgc3lzdGVtIHRvIHNldCBhIGN1c3RvbSBjdXJzb3IuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBjdXJzb3Igd2lsbCBiZSB0aGUgZGVmYXVsdCBjdXJzb3IgdXNlZCB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGdhbWUgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIElmIGFuIEludGVyYWN0aXZlIE9iamVjdCBhbHNvIHNldHMgYSBjdXN0b20gY3Vyc29yLCB0aGlzIGlzIHRoZSBjdXJzb3IgdGhhdCBpcyByZXNldCBhZnRlciBpdHMgdXNlLlxyXG4gICAgICpcclxuICAgICAqIEFueSB2YWxpZCBDU1MgY3Vyc29yIHZhbHVlIGlzIGFsbG93ZWQsIGluY2x1ZGluZyBwYXRocyB0byBpbWFnZSBmaWxlcywgaS5lLjpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LnNldERlZmF1bHRDdXJzb3IoJ3VybChhc3NldHMvY3Vyc29ycy9zd29yZC5jdXIpLCBwb2ludGVyJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBQbGVhc2UgcmVhZCBhYm91dCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBicm93c2VycyB3aGVuIGl0IGNvbWVzIHRvIHRoZSBmaWxlIGZvcm1hdHMgYW5kIHNpemVzIHRoZXkgc3VwcG9ydDpcclxuICAgICAqXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY3Vyc29yXHJcbiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1VzZXJfSW50ZXJmYWNlL1VzaW5nX1VSTF92YWx1ZXNfZm9yX3RoZV9jdXJzb3JfcHJvcGVydHlcclxuICAgICAqXHJcbiAgICAgKiBJdCdzIHVwIHRvIHlvdSB0byBwaWNrIGEgc3VpdGFibGUgY3Vyc29yIGZvcm1hdCB0aGF0IHdvcmtzIGFjcm9zcyB0aGUgcmFuZ2Ugb2YgYnJvd3NlcnMgeW91IG5lZWQgdG8gc3VwcG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNzZXREZWZhdWx0Q3Vyc29yXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnNvciAtIFRoZSBDU1MgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIGRlZmF1bHQgY3Vyc29yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgSW5wdXQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldERlZmF1bHRDdXJzb3I6IGZ1bmN0aW9uIChjdXJzb3IpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNldERlZmF1bHRDdXJzb3IoY3Vyc29yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyB0cmFuc2l0aW9uaW5nIGluLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3RyYW5zaXRpb25JblxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICB0cmFuc2l0aW9uSW46IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdGhpcy5zZXR0aW5ncy50cmFuc2l0aW9uQWxsb3dJbnB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGhhcyBmaW5pc2hlZCB0cmFuc2l0aW9uaW5nIGluLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3RyYW5zaXRpb25Db21wbGV0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICB0cmFuc2l0aW9uQ29tcGxldGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLnRyYW5zaXRpb25BbGxvd0lucHV0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyB0cmFuc2l0aW9uaW5nIG91dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiN0cmFuc2l0aW9uT3V0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHRyYW5zaXRpb25PdXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdGhpcy5zZXR0aW5ncy50cmFuc2l0aW9uQWxsb3dJbnB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3NodXRkb3duXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LkV2ZW50cyNTSFVURE9XTlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgUmVnaXN0ZXJlZCBpbnB1dCBwbHVnaW5zIGxpc3RlbiBmb3IgdGhpc1xyXG4gICAgICAgIHRoaXMucGx1Z2luRXZlbnRzLmVtaXQoRXZlbnRzLlNIVVRET1dOKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGVtcC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2xpc3QubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9kcmFnZ2FibGUubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZhbC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdJbnNlcnRpb24ubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9kcmFnU3RhdGUubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ1tpXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVyW2ldID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5UUkFOU0lUSU9OX1NUQVJULCB0aGlzLnRyYW5zaXRpb25JbiwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5UUkFOU0lUSU9OX09VVCwgdGhpcy50cmFuc2l0aW9uT3V0LCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlRSQU5TSVRJT05fQ09NUExFVEUsIHRoaXMudHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMucHJlVXBkYXRlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmV2ZW50cy5vZmYoRXZlbnRzLkdBTUVfT1VULCB0aGlzLm9uR2FtZU91dCwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmV2ZW50cy5vZmYoRXZlbnRzLkdBTUVfT1ZFUiwgdGhpcy5vbkdhbWVPdmVyLCB0aGlzKTtcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2Rlc3Ryb3lcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuRXZlbnRzI0RFU1RST1lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIC8vICBSZWdpc3RlcmVkIGlucHV0IHBsdWdpbnMgbGlzdGVuIGZvciB0aGlzXHJcbiAgICAgICAgdGhpcy5wbHVnaW5FdmVudHMuZW1pdChFdmVudHMuREVTVFJPWSk7XHJcblxyXG4gICAgICAgIHRoaXMucGx1Z2luRXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1vdXNlID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeCBjb29yZGluYXRlcyBvZiB0aGUgQWN0aXZlUG9pbnRlciBiYXNlZCBvbiB0aGUgZmlyc3QgY2FtZXJhIGluIHRoZSBjYW1lcmEgbGlzdC5cclxuICAgICAqIFRoaXMgaXMgb25seSBzYWZlIHRvIHVzZSBpZiB5b3VyIGdhbWUgaGFzIGp1c3QgMSBub24tdHJhbnNmb3JtZWQgY2FtZXJhIGFuZCBkb2Vzbid0IHVzZSBtdWx0aS10b3VjaC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jeFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5hY3RpdmVQb2ludGVyLng7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgeSBjb29yZGluYXRlcyBvZiB0aGUgQWN0aXZlUG9pbnRlciBiYXNlZCBvbiB0aGUgZmlyc3QgY2FtZXJhIGluIHRoZSBjYW1lcmEgbGlzdC5cclxuICAgICAqIFRoaXMgaXMgb25seSBzYWZlIHRvIHVzZSBpZiB5b3VyIGdhbWUgaGFzIGp1c3QgMSBub24tdHJhbnNmb3JtZWQgY2FtZXJhIGFuZCBkb2Vzbid0IHVzZSBtdWx0aS10b3VjaC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jeVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5hY3RpdmVQb2ludGVyLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgYW55IG1vdXNlIG9yIHRvdWNoIHBvaW50ZXJzIGN1cnJlbnRseSBvdmVyIHRoZSBnYW1lIGNhbnZhcz9cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jaXNPdmVyXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBpc092ZXI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5pc092ZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbW91c2UgaGFzIGl0cyBvd24gdW5pcXVlIFBvaW50ZXIgb2JqZWN0LCB3aGljaCB5b3UgY2FuIHJlZmVyZW5jZSBkaXJlY3RseSBpZiBtYWtpbmcgYSBfZGVza3RvcCBzcGVjaWZpYyBnYW1lXy5cclxuICAgICAqIElmIHlvdSBhcmUgc3VwcG9ydGluZyBib3RoIGRlc2t0b3AgYW5kIHRvdWNoIGRldmljZXMgdGhlbiBkbyBub3QgdXNlIHRoaXMgcHJvcGVydHksIGluc3RlYWQgdXNlIGBhY3RpdmVQb2ludGVyYFxyXG4gICAgICogd2hpY2ggd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBtb3N0IHJlY2VudGx5IGludGVyYWN0ZWQgcG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jbW91c2VQb2ludGVyXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgbW91c2VQb2ludGVyOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIubW91c2VQb2ludGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGN1cnJlbnQgYWN0aXZlIGlucHV0IFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2FjdGl2ZVBvaW50ZXJcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZVBvaW50ZXI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5hY3RpdmVQb2ludGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaC1iYXNlZCBQb2ludGVyIG9iamVjdC5cclxuICAgICAqIFRoaXMgd2lsbCBiZSBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IHVubGVzcyB5b3UgYWRkIGEgbmV3IFBvaW50ZXIgdXNpbmcgYGFkZFBvaW50ZXJgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwb2ludGVyMVxyXG4gICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5Qb2ludGVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHBvaW50ZXIxOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucG9pbnRlcnNbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHRvdWNoLWJhc2VkIFBvaW50ZXIgb2JqZWN0LlxyXG4gICAgICogVGhpcyB3aWxsIGJlIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgdW5sZXNzIHlvdSBhZGQgYSBuZXcgUG9pbnRlciB1c2luZyBgYWRkUG9pbnRlcmAuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3BvaW50ZXIyXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgcG9pbnRlcjI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5wb2ludGVyc1syXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgdG91Y2gtYmFzZWQgUG9pbnRlciBvYmplY3QuXHJcbiAgICAgKiBUaGlzIHdpbGwgYmUgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCB1bmxlc3MgeW91IGFkZCBhIG5ldyBQb2ludGVyIHVzaW5nIGBhZGRQb2ludGVyYC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcG9pbnRlcjNcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBwb2ludGVyMzoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnBvaW50ZXJzWzNdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaC1iYXNlZCBQb2ludGVyIG9iamVjdC5cclxuICAgICAqIFRoaXMgd2lsbCBiZSBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IHVubGVzcyB5b3UgYWRkIGEgbmV3IFBvaW50ZXIgdXNpbmcgYGFkZFBvaW50ZXJgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwb2ludGVyNFxyXG4gICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5Qb2ludGVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHBvaW50ZXI0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucG9pbnRlcnNbNF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHRvdWNoLWJhc2VkIFBvaW50ZXIgb2JqZWN0LlxyXG4gICAgICogVGhpcyB3aWxsIGJlIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgdW5sZXNzIHlvdSBhZGQgYSBuZXcgUG9pbnRlciB1c2luZyBgYWRkUG9pbnRlcmAuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3BvaW50ZXI1XHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgcG9pbnRlcjU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5wb2ludGVyc1s1XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgdG91Y2gtYmFzZWQgUG9pbnRlciBvYmplY3QuXHJcbiAgICAgKiBUaGlzIHdpbGwgYmUgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCB1bmxlc3MgeW91IGFkZCBhIG5ldyBQb2ludGVyIHVzaW5nIGBhZGRQb2ludGVyYC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcG9pbnRlcjZcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBwb2ludGVyNjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnBvaW50ZXJzWzZdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaC1iYXNlZCBQb2ludGVyIG9iamVjdC5cclxuICAgICAqIFRoaXMgd2lsbCBiZSBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IHVubGVzcyB5b3UgYWRkIGEgbmV3IFBvaW50ZXIgdXNpbmcgYGFkZFBvaW50ZXJgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwb2ludGVyN1xyXG4gICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5Qb2ludGVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHBvaW50ZXI3OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucG9pbnRlcnNbN107XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHRvdWNoLWJhc2VkIFBvaW50ZXIgb2JqZWN0LlxyXG4gICAgICogVGhpcyB3aWxsIGJlIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgdW5sZXNzIHlvdSBhZGQgYSBuZXcgUG9pbnRlciB1c2luZyBgYWRkUG9pbnRlcmAuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI3BvaW50ZXI4XHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgcG9pbnRlcjg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5wb2ludGVyc1s4XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgdG91Y2gtYmFzZWQgUG9pbnRlciBvYmplY3QuXHJcbiAgICAgKiBUaGlzIHdpbGwgYmUgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCB1bmxlc3MgeW91IGFkZCBhIG5ldyBQb2ludGVyIHVzaW5nIGBhZGRQb2ludGVyYC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW4jcG9pbnRlcjlcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBwb2ludGVyOToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnBvaW50ZXJzWzldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaC1iYXNlZCBQb2ludGVyIG9iamVjdC5cclxuICAgICAqIFRoaXMgd2lsbCBiZSBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IHVubGVzcyB5b3UgYWRkIGEgbmV3IFBvaW50ZXIgdXNpbmcgYGFkZFBvaW50ZXJgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5JbnB1dFBsdWdpbiNwb2ludGVyMTBcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBwb2ludGVyMTA6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5wb2ludGVyc1sxMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuUGx1Z2luQ2FjaGUucmVnaXN0ZXIoJ0lucHV0UGx1Z2luJywgSW5wdXRQbHVnaW4sICdpbnB1dCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbnB1dFBsdWdpbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxuXHJcbi8vICBDb250YWlucyB0aGUgcGx1Z2lucyB0aGF0IFBoYXNlciB1c2VzIGdsb2JhbGx5IGFuZCBsb2NhbGx5LlxyXG4vLyAgVGhlc2UgYXJlIHRoZSBzb3VyY2Ugb2JqZWN0cywgbm90IGluc3RhbnRpYXRlZC5cclxudmFyIGlucHV0UGx1Z2lucyA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLklucHV0LklucHV0UGx1Z2luQ2FjaGVcclxuICovXHJcblxyXG52YXIgSW5wdXRQbHVnaW5DYWNoZSA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIFN0YXRpYyBtZXRob2QgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSBDb3JlIGludGVybmFsIFBsdWdpbnMuXHJcbiAqIEtleSBpcyBhIHJlZmVyZW5jZSB1c2VkIHRvIGdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgb2JqZWN0IChpLmUuIElucHV0UGx1Z2luKVxyXG4gKiBQbHVnaW4gaXMgdGhlIG9iamVjdCB0byBpbnN0YW50aWF0ZSB0byBjcmVhdGUgdGhlIHBsdWdpblxyXG4gKiBNYXBwaW5nIGlzIHdoYXQgdGhlIHBsdWdpbiBpcyBpbmplY3RlZCBpbnRvIHRoZSBTY2VuZS5TeXN0ZW1zIGFzIChpLmUuIGlucHV0KVxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLklucHV0LklucHV0UGx1Z2luQ2FjaGUucmVnaXN0ZXJcclxuICogQHN0YXRpY1xyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBIHJlZmVyZW5jZSB1c2VkIHRvIGdldCB0aGlzIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW4gY2FjaGUuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gYmUgc3RvcmVkLiBTaG91bGQgYmUgdGhlIGNvcmUgb2JqZWN0LCBub3QgaW5zdGFudGlhdGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFwcGluZyAtIElmIHRoaXMgcGx1Z2luIGlzIHRvIGJlIGluamVjdGVkIGludG8gdGhlIElucHV0IFBsdWdpbiwgdGhpcyBpcyB0aGUgcHJvcGVydHkga2V5IHVzZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nc0tleSAtIFRoZSBrZXkgaW4gdGhlIFNjZW5lIFNldHRpbmdzIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGlzIHBsdWdpbiBzaG91bGQgaW5zdGFsbCBvciBub3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdLZXkgLSBUaGUga2V5IGluIHRoZSBHYW1lIENvbmZpZyB0byBjaGVjayB0byBzZWUgaWYgdGhpcyBwbHVnaW4gc2hvdWxkIGluc3RhbGwgb3Igbm90LlxyXG4gKi9cclxuSW5wdXRQbHVnaW5DYWNoZS5yZWdpc3RlciA9IGZ1bmN0aW9uIChrZXksIHBsdWdpbiwgbWFwcGluZywgc2V0dGluZ3NLZXksIGNvbmZpZ0tleSlcclxue1xyXG4gICAgaW5wdXRQbHVnaW5zW2tleV0gPSB7IHBsdWdpbjogcGx1Z2luLCBtYXBwaW5nOiBtYXBwaW5nLCBzZXR0aW5nc0tleTogc2V0dGluZ3NLZXksIGNvbmZpZ0tleTogY29uZmlnS2V5IH07XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgaW5wdXQgcGx1Z2luIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBiYXNlZCBvbiB0aGUgZ2l2ZW4ga2V5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLklucHV0LklucHV0UGx1Z2luQ2FjaGUuZ2V0Q29yZVxyXG4gKiBAc3RhdGljXHJcbiAqIEBzaW5jZSAzLjEwLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGlucHV0IHBsdWdpbiB0byBnZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5JbnB1dC5JbnB1dFBsdWdpbkNvbnRhaW5lcn0gVGhlIGlucHV0IHBsdWdpbiBvYmplY3QuXHJcbiAqL1xyXG5JbnB1dFBsdWdpbkNhY2hlLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChrZXkpXHJcbntcclxuICAgIHJldHVybiBpbnB1dFBsdWdpbnNba2V5XTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBJbnN0YWxscyBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgSW5wdXQgUGx1Z2lucyBpbnRvIHRoZSBnaXZlbiB0YXJnZXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW5DYWNoZS5pbnN0YWxsXHJcbiAqIEBzdGF0aWNcclxuICogQHNpbmNlIDMuMTAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5JbnB1dFBsdWdpbn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBJbnB1dFBsdWdpbiB0byBpbnN0YWxsIHRoZSBwbHVnaW5zIGludG8uXHJcbiAqL1xyXG5JbnB1dFBsdWdpbkNhY2hlLmluc3RhbGwgPSBmdW5jdGlvbiAodGFyZ2V0KVxyXG57XHJcbiAgICB2YXIgc3lzID0gdGFyZ2V0LnNjZW5lLnN5cztcclxuICAgIHZhciBzZXR0aW5ncyA9IHN5cy5zZXR0aW5ncy5pbnB1dDtcclxuICAgIHZhciBjb25maWcgPSBzeXMuZ2FtZS5jb25maWc7XHJcblxyXG4gICAgZm9yICh2YXIga2V5IGluIGlucHV0UGx1Z2lucylcclxuICAgIHtcclxuICAgICAgICB2YXIgc291cmNlID0gaW5wdXRQbHVnaW5zW2tleV0ucGx1Z2luO1xyXG4gICAgICAgIHZhciBtYXBwaW5nID0gaW5wdXRQbHVnaW5zW2tleV0ubWFwcGluZztcclxuICAgICAgICB2YXIgc2V0dGluZ3NLZXkgPSBpbnB1dFBsdWdpbnNba2V5XS5zZXR0aW5nc0tleTtcclxuICAgICAgICB2YXIgY29uZmlnS2V5ID0gaW5wdXRQbHVnaW5zW2tleV0uY29uZmlnS2V5O1xyXG5cclxuICAgICAgICBpZiAoR2V0VmFsdWUoc2V0dGluZ3MsIHNldHRpbmdzS2V5LCBjb25maWdbY29uZmlnS2V5XSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXRbbWFwcGluZ10gPSBuZXcgc291cmNlKHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgYW4gaW5wdXQgcGx1Z2luIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW5DYWNoZS5yZW1vdmVcclxuICogQHN0YXRpY1xyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBpbnB1dCBwbHVnaW4gdG8gcmVtb3ZlLlxyXG4gKi9cclxuSW5wdXRQbHVnaW5DYWNoZS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5KVxyXG57XHJcbiAgICBpZiAoaW5wdXRQbHVnaW5zLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZGVsZXRlIGlucHV0UGx1Z2luc1trZXldO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbnB1dFBsdWdpbkNhY2hlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBbmdsZSA9IHJlcXVpcmUoJy4uL21hdGgvYW5nbGUvQmV0d2VlbicpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgRGlzdGFuY2UgPSByZXF1aXJlKCcuLi9tYXRoL2Rpc3RhbmNlL0Rpc3RhbmNlQmV0d2VlbicpO1xyXG52YXIgRnV6enlFcXVhbCA9IHJlcXVpcmUoJy4uL21hdGgvZnV6enkvRXF1YWwnKTtcclxudmFyIFNtb290aFN0ZXBJbnRlcnBvbGF0aW9uID0gcmVxdWlyZSgnLi4vbWF0aC9pbnRlcnBvbGF0aW9uL1Ntb290aFN0ZXBJbnRlcnBvbGF0aW9uJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFBvaW50ZXIgb2JqZWN0IGVuY2Fwc3VsYXRlcyBib3RoIG1vdXNlIGFuZCB0b3VjaCBpbnB1dCB3aXRoaW4gUGhhc2VyLlxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0LCBQaGFzZXIgd2lsbCBjcmVhdGUgMiBwb2ludGVycyBmb3IgeW91ciBnYW1lIHRvIHVzZS4gSWYgeW91IHJlcXVpcmUgbW9yZSwgaS5lLiBmb3IgYSBtdWx0aS10b3VjaFxyXG4gKiBnYW1lLCB0aGVuIHVzZSB0aGUgYElucHV0UGx1Z2luLmFkZFBvaW50ZXJgIG1ldGhvZCB0byBkbyBzbywgcmF0aGVyIHRoYW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzIGRpcmVjdGx5LFxyXG4gKiBvdGhlcndpc2UgaXQgd29uJ3QgYmUgbWFuYWdlZCBieSB0aGUgaW5wdXQgc3lzdGVtLlxyXG4gKlxyXG4gKiBZb3UgY2FuIHJlZmVyZW5jZSB0aGUgY3VycmVudCBhY3RpdmUgcG9pbnRlciB2aWEgYElucHV0UGx1Z2luLmFjdGl2ZVBvaW50ZXJgLiBZb3UgY2FuIGFsc28gdXNlIHRoZSBwcm9wZXJ0aWVzXHJcbiAqIGBJbnB1dFBsdWdpbi5wb2ludGVyMWAgdGhyb3VnaCB0byBgcG9pbnRlcjEwYCwgZm9yIGVhY2ggcG9pbnRlciB5b3UgaGF2ZSBlbmFibGVkIGluIHlvdXIgZ2FtZS5cclxuICpcclxuICogVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QgYXJlIHNldCBieSB0aGUgSW5wdXQgUGx1Z2luIGR1cmluZyBwcm9jZXNzaW5nLiBUaGlzIG9iamVjdCBpcyB0aGVuIHNlbnQgaW4gYWxsXHJcbiAqIGlucHV0IHJlbGF0ZWQgZXZlbnRzIHRoYXQgdGhlIElucHV0IFBsdWdpbiBlbWl0cywgc28geW91IGNhbiByZWZlcmVuY2UgcHJvcGVydGllcyBmcm9tIGl0IGRpcmVjdGx5IGluIHlvdXJcclxuICogY2FsbGJhY2tzLlxyXG4gKlxyXG4gKiBAY2xhc3MgUG9pbnRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLklucHV0XHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyfSBtYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIElucHV0IE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaWQgLSBUaGUgaW50ZXJuYWwgSUQgb2YgdGhpcyBQb2ludGVyLlxyXG4gKi9cclxudmFyIFBvaW50ZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUG9pbnRlciAobWFuYWdlciwgaWQpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIElucHV0IE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNtYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIElEIG9mIHRoaXMgUG9pbnRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2lkXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbW9zdCByZWNlbnQgbmF0aXZlIERPTSBFdmVudCB0aGlzIFBvaW50ZXIgaGFzIHByb2Nlc3NlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2V2ZW50XHJcbiAgICAgICAgICogQHR5cGUgeyhUb3VjaEV2ZW50fE1vdXNlRXZlbnQpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZXZlbnQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBET00gZWxlbWVudCB0aGUgUG9pbnRlciB3YXMgcHJlc3NlZCBkb3duIG9uLCB0YWtlbiBmcm9tIHRoZSBET00gZXZlbnQuXHJcbiAgICAgICAgICogSW4gYSBkZWZhdWx0IHNldC11cCB0aGlzIHdpbGwgYmUgdGhlIENhbnZhcyB0aGF0IFBoYXNlciBpcyByZW5kZXJpbmcgdG8sIG9yIHRoZSBXaW5kb3cgZWxlbWVudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2Rvd25FbGVtZW50XHJcbiAgICAgICAgICogQHR5cGUge2FueX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kb3duRWxlbWVudDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIERPTSBlbGVtZW50IHRoZSBQb2ludGVyIHdhcyByZWxlYXNlZCBvbiwgdGFrZW4gZnJvbSB0aGUgRE9NIGV2ZW50LlxyXG4gICAgICAgICAqIEluIGEgZGVmYXVsdCBzZXQtdXAgdGhpcyB3aWxsIGJlIHRoZSBDYW52YXMgdGhhdCBQaGFzZXIgaXMgcmVuZGVyaW5nIHRvLCBvciB0aGUgV2luZG93IGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN1cEVsZW1lbnRcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwRWxlbWVudDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbWVyYSB0aGUgUG9pbnRlciBpbnRlcmFjdGVkIHdpdGggZHVyaW5nIGl0cyBsYXN0IHVwZGF0ZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIFBvaW50ZXIgY2FuIG9ubHkgZXZlciBpbnRlcmFjdCB3aXRoIG9uZSBjYW1lcmEgYXQgb25jZSwgd2hpY2ggd2lsbCBiZSB0aGUgdG9wLW1vc3QgY2FtZXJhXHJcbiAgICAgICAgICogaW4gdGhlIGxpc3Qgc2hvdWxkIG11bHRpcGxlIGNhbWVyYXMgYmUgcG9zaXRpb25lZCBvbi10b3Agb2YgZWFjaCBvdGhlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2NhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlYWQtb25seSBwcm9wZXJ0eSB0aGF0IGluZGljYXRlcyB3aGljaCBidXR0b24gd2FzIHByZXNzZWQsIG9yIHJlbGVhc2VkLCBvbiB0aGUgcG9pbnRlclxyXG4gICAgICAgICAqIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgZXZlbnQuIEl0IGlzIG9ubHkgc2V0IGR1cmluZyBgdXBgIGFuZCBgZG93bmAgZXZlbnRzLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIE9uIFRvdWNoIGRldmljZXMgdGhlIHZhbHVlIGlzIGFsd2F5cyAwLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFVzZXJzIG1heSBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYnV0dG9ucyBvbiB0aGVpciBwb2ludGluZyBkZXZpY2Ugc28gdGhhdCBpZiBhbiBldmVudCdzIGJ1dHRvbiBwcm9wZXJ0eVxyXG4gICAgICAgICAqIGlzIHplcm8sIGl0IG1heSBub3QgaGF2ZSBiZWVuIGNhdXNlZCBieSB0aGUgYnV0dG9uIHRoYXQgaXMgcGh5c2ljYWxseSBsZWZ04oCTbW9zdCBvbiB0aGUgcG9pbnRpbmcgZGV2aWNlO1xyXG4gICAgICAgICAqIGhvd2V2ZXIsIGl0IHNob3VsZCBiZWhhdmUgYXMgaWYgdGhlIGxlZnQgYnV0dG9uIHdhcyBjbGlja2VkIGluIHRoZSBzdGFuZGFyZCBidXR0b24gbGF5b3V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjYnV0dG9uXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIDA6IE5vIGJ1dHRvbiBvciB1bi1pbml0aWFsaXplZFxyXG4gICAgICAgICAqIDE6IExlZnQgYnV0dG9uXHJcbiAgICAgICAgICogMjogUmlnaHQgYnV0dG9uXHJcbiAgICAgICAgICogNDogV2hlZWwgYnV0dG9uIG9yIG1pZGRsZSBidXR0b25cclxuICAgICAgICAgKiA4OiA0dGggYnV0dG9uICh0eXBpY2FsbHkgdGhlIFwiQnJvd3NlciBCYWNrXCIgYnV0dG9uKVxyXG4gICAgICAgICAqIDE2OiA1dGggYnV0dG9uICh0eXBpY2FsbHkgdGhlIFwiQnJvd3NlciBGb3J3YXJkXCIgYnV0dG9uKVxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEZvciBhIG1vdXNlIGNvbmZpZ3VyZWQgZm9yIGxlZnQtaGFuZGVkIHVzZSwgdGhlIGJ1dHRvbiBhY3Rpb25zIGFyZSByZXZlcnNlZC5cclxuICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZXMgYXJlIHJlYWQgZnJvbSByaWdodCB0byBsZWZ0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjYnV0dG9uc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJ1dHRvbnMgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIFBvaW50ZXIgaW4gc2NyZWVuIHNwYWNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjcG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByZXZpb3VzIHBvc2l0aW9uIG9mIHRoZSBQb2ludGVyIGluIHNjcmVlbiBzcGFjZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgb2xkIHggYW5kIHkgdmFsdWVzIGFyZSBzdG9yZWQgaW4gaGVyZSBkdXJpbmcgdGhlIElucHV0TWFuYWdlci50cmFuc2Zvcm1Qb2ludGVyIGNhbGwuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVXNlIHRoZSBwcm9wZXJ0aWVzIGB2ZWxvY2l0eWAsIGBhbmdsZWAgYW5kIGBkaXN0YW5jZWAgdG8gY3JlYXRlIHlvdXIgb3duIGdlc3R1cmUgcmVjb2duaXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNwcmV2UG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcmV2UG9zaXRpb24gPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCB2ZWN0b3IgdXNlZCBmb3IgY2FsY3VsYXRpb25zIG9mIHRoZSBwb2ludGVyIHNwZWVkIGFuZCBhbmdsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI21pZFBvaW50XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5taWRQb2ludCA9IG5ldyBWZWN0b3IyKC0xLCAtMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IHZlbG9jaXR5IG9mIHRoZSBQb2ludGVyLCBiYXNlZCBvbiBpdHMgY3VycmVudCBhbmQgcHJldmlvdXMgcG9zaXRpb25zLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgc21vb3RoZWQgb3V0IGVhY2ggZnJhbWUsIGFjY29yZGluZyB0byB0aGUgYG1vdGlvbkZhY3RvcmAgcHJvcGVydHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1cGRhdGVkIHdoZW5ldmVyIHRoZSBQb2ludGVyIG1vdmVzLCByZWdhcmRsZXNzIG9mIGFueSBidXR0b24gc3RhdGVzLiBJbiBvdGhlciB3b3JkcyxcclxuICAgICAgICAgKiBpdCBjaGFuZ2VzIGJhc2VkIG9uIG1vdmVtZW50IGFsb25lIC0gYSBidXR0b24gZG9lc24ndCBoYXZlIHRvIGJlIHByZXNzZWQgZmlyc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN2ZWxvY2l0eVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlbG9jaXR5ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgYW5nbGUgdGhlIFBvaW50ZXIgaXMgbW92aW5nLCBpbiByYWRpYW5zLCBiYXNlZCBvbiBpdHMgcHJldmlvdXMgYW5kIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGFuZ2xlIGlzIGJhc2VkIG9uIHRoZSBvbGQgcG9zaXRpb24gZmFjaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXBkYXRlZCB3aGVuZXZlciB0aGUgUG9pbnRlciBtb3ZlcywgcmVnYXJkbGVzcyBvZiBhbnkgYnV0dG9uIHN0YXRlcy4gSW4gb3RoZXIgd29yZHMsXHJcbiAgICAgICAgICogaXQgY2hhbmdlcyBiYXNlZCBvbiBtb3ZlbWVudCBhbG9uZSAtIGEgYnV0dG9uIGRvZXNuJ3QgaGF2ZSB0byBiZSBwcmVzc2VkIGZpcnN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjYW5nbGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFuZ2xlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpc3RhbmNlIHRoZSBQb2ludGVyIGhhcyBtb3ZlZCwgYmFzZWQgb24gaXRzIHByZXZpb3VzIGFuZCBjdXJyZW50IHBvc2l0aW9uLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgc21vb3RoZWQgb3V0IGVhY2ggZnJhbWUsIGFjY29yZGluZyB0byB0aGUgYG1vdGlvbkZhY3RvcmAgcHJvcGVydHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1cGRhdGVkIHdoZW5ldmVyIHRoZSBQb2ludGVyIG1vdmVzLCByZWdhcmRsZXNzIG9mIGFueSBidXR0b24gc3RhdGVzLiBJbiBvdGhlciB3b3JkcyxcclxuICAgICAgICAgKiBpdCBjaGFuZ2VzIGJhc2VkIG9uIG1vdmVtZW50IGFsb25lIC0gYSBidXR0b24gZG9lc24ndCBoYXZlIHRvIGJlIHByZXNzZWQgZmlyc3QuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IG5lZWQgdGhlIHRvdGFsIGRpc3RhbmNlIHRyYXZlbGxlZCBzaW5jZSB0aGUgcHJpbWFyeSBidXR0b25zIHdhcyBwcmVzc2VkIGRvd24sXHJcbiAgICAgICAgICogdGhlbiB1c2UgdGhlIGBQb2ludGVyLmdldERpc3RhbmNlYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNkaXN0YW5jZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlzdGFuY2UgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc21vb3RoaW5nIGZhY3RvciB0byBhcHBseSB0byB0aGUgUG9pbnRlciBwb3NpdGlvbi5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBEdWUgdG8gdGhlaXIgbmF0dXJlLCBwb2ludGVyIHBvc2l0aW9ucyBhcmUgaW5oZXJlbnRseSBub2lzeS4gV2hpbGUgdGhpcyBpcyBmaW5lIGZvciBsb3RzIG9mIGdhbWVzLCBpZiB5b3UgbmVlZCBjbGVhbmVyIHBvc2l0aW9uc1xyXG4gICAgICAgICAqIHRoZW4geW91IGNhbiBzZXQgdGhpcyB2YWx1ZSB0byBhcHBseSBhbiBhdXRvbWF0aWMgc21vb3RoaW5nIHRvIHRoZSBwb3NpdGlvbnMgYXMgdGhleSBhcmUgcmVjb3JkZWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgemVybyBtZWFucyAnbm8gc21vb3RoaW5nJy5cclxuICAgICAgICAgKiBTZXQgdG8gYSBzbWFsbCB2YWx1ZSwgc3VjaCBhcyAwLjIsIHRvIGFwcGx5IGFuIGF2ZXJhZ2UgbGV2ZWwgb2Ygc21vb3RoaW5nIGJldHdlZW4gcG9zaXRpb25zLiBZb3UgY2FuIGRvIHRoaXMgYnkgY2hhbmdpbmcgdGhpc1xyXG4gICAgICAgICAqIHZhbHVlIGRpcmVjdGx5LCBvciBieSBzZXR0aW5nIHRoZSBgaW5wdXQuc21vb3RoRmFjdG9yYCBwcm9wZXJ0eSBpbiB0aGUgR2FtZSBDb25maWcuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogUG9zaXRpb25zIGFyZSBvbmx5IHNtb290aGVkIHdoZW4gdGhlIHBvaW50ZXIgbW92ZXMuIElmIHRoZSBwcmltYXJ5IGJ1dHRvbiBvbiB0aGlzIFBvaW50ZXIgZW50ZXJzIGFuIFVwIG9yIERvd24gc3RhdGUsIHRoZW4gdGhlIHBvc2l0aW9uXHJcbiAgICAgICAgICogaXMgYWx3YXlzIHByZWNpc2UsIGFuZCBub3Qgc21vb3RoZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNzbW9vdGhGYWN0b3JcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zbW9vdGhGYWN0b3IgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIG1vdGlvbiBzbW9vdGhpbmcgZWFjaCBmcmFtZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHBhc3NlZCB0byB0aGUgU21vb3RoIFN0ZXAgSW50ZXJwb2xhdGlvbiB0aGF0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2ZWxvY2l0eSxcclxuICAgICAgICAgKiBhbmdsZSBhbmQgZGlzdGFuY2Ugb2YgdGhlIFBvaW50ZXIuIEl0J3MgYXBwbGllZCBldmVyeSBmcmFtZSwgdW50aWwgdGhlIG1pZFBvaW50IHJlYWNoZXMgdGhlIGN1cnJlbnRcclxuICAgICAgICAgKiBwb3NpdGlvbiBvZiB0aGUgUG9pbnRlci4gMC4yIHByb3ZpZGVzIGEgZ29vZCBhdmVyYWdlIGJ1dCBjYW4gYmUgaW5jcmVhc2VkIGlmIHlvdSBuZWVkIGFcclxuICAgICAgICAgKiBxdWlja2VyIHVwZGF0ZSBhbmQgYXJlIHdvcmtpbmcgaW4gYSBoaWdoIHBlcmZvcm1hbmNlIGVudmlyb25tZW50LiBOZXZlciBzZXQgdGhpcyB2YWx1ZSB0b1xyXG4gICAgICAgICAqIHplcm8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNtb3Rpb25GYWN0b3JcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDAuMlxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1vdGlvbkZhY3RvciA9IDAuMjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggcG9zaXRpb24gb2YgdGhpcyBQb2ludGVyLCB0cmFuc2xhdGVkIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIG1vc3QgcmVjZW50IENhbWVyYSBpdCBpbnRlcmFjdGVkIHdpdGguXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IHdpc2ggdG8gdXNlIHRoaXMgdmFsdWUgX291dHNpZGVfIG9mIGFuIGlucHV0IGV2ZW50IGhhbmRsZXIgdGhlbiB5b3Ugc2hvdWxkIHVwZGF0ZSBpdCBmaXJzdCBieSBjYWxsaW5nXHJcbiAgICAgICAgICogdGhlIGBQb2ludGVyLnVwZGF0ZVdvcmxkUG9pbnRgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI3dvcmxkWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmxkWCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB5IHBvc2l0aW9uIG9mIHRoaXMgUG9pbnRlciwgdHJhbnNsYXRlZCBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBtb3N0IHJlY2VudCBDYW1lcmEgaXQgaW50ZXJhY3RlZCB3aXRoLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIElmIHlvdSB3aXNoIHRvIHVzZSB0aGlzIHZhbHVlIF9vdXRzaWRlXyBvZiBhbiBpbnB1dCBldmVudCBoYW5kbGVyIHRoZW4geW91IHNob3VsZCB1cGRhdGUgaXQgZmlyc3QgYnkgY2FsbGluZ1xyXG4gICAgICAgICAqIHRoZSBgUG9pbnRlci51cGRhdGVXb3JsZFBvaW50YCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN3b3JsZFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZFkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaW1lIHdoZW4gdGhpcyBQb2ludGVyIHdhcyBtb3N0IHJlY2VudGx5IG1vdmVkIChyZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiBpdHMgYnV0dG9ucywgaWYgYW55KVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjbW92ZVRpbWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1vdmVUaW1lID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogWCBjb29yZGluYXRlIG9mIHRoZSBQb2ludGVyIHdoZW4gQnV0dG9uIDEgKGxlZnQgYnV0dG9uKSwgb3IgVG91Y2gsIHdhcyBwcmVzc2VkLCB1c2VkIGZvciBkcmFnZ2luZyBvYmplY3RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjZG93blhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRvd25YID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogWSBjb29yZGluYXRlIG9mIHRoZSBQb2ludGVyIHdoZW4gQnV0dG9uIDEgKGxlZnQgYnV0dG9uKSwgb3IgVG91Y2gsIHdhcyBwcmVzc2VkLCB1c2VkIGZvciBkcmFnZ2luZyBvYmplY3RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjZG93bllcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRvd25ZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGltZSB3aGVuIEJ1dHRvbiAxIChsZWZ0IGJ1dHRvbiksIG9yIFRvdWNoLCB3YXMgcHJlc3NlZCwgdXNlZCBmb3IgZHJhZ2dpbmcgb2JqZWN0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2Rvd25UaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kb3duVGltZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnRlciB3aGVuIEJ1dHRvbiAxIChsZWZ0IGJ1dHRvbiksIG9yIFRvdWNoLCB3YXMgcmVsZWFzZWQsIHVzZWQgZm9yIGRyYWdnaW5nIG9iamVjdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN1cFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwWCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFkgY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnRlciB3aGVuIEJ1dHRvbiAxIChsZWZ0IGJ1dHRvbiksIG9yIFRvdWNoLCB3YXMgcmVsZWFzZWQsIHVzZWQgZm9yIGRyYWdnaW5nIG9iamVjdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN1cFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwWSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRpbWUgd2hlbiBCdXR0b24gMSAobGVmdCBidXR0b24pLCBvciBUb3VjaCwgd2FzIHJlbGVhc2VkLCB1c2VkIGZvciBkcmFnZ2luZyBvYmplY3RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjdXBUaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51cFRpbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGUgcHJpbWFyeSBidXR0b24gZG93bj8gKHVzdWFsbHkgYnV0dG9uIDAsIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbilcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI3ByaW1hcnlEb3duXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByaW1hcnlEb3duID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIF9hbnlfIGJ1dHRvbiBvbiB0aGlzIHBvaW50ZXIgY29uc2lkZXJlZCBhcyBiZWluZyBkb3duP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjaXNEb3duXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzRG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEaWQgdGhlIHByZXZpb3VzIGlucHV0IGV2ZW50IGNvbWUgZnJvbSBhIFRvdWNoIGlucHV0ICh0cnVlKSBvciBNb3VzZT8gKGZhbHNlKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjd2FzVG91Y2hcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2FzVG91Y2ggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGlkIHRoaXMgUG9pbnRlciBnZXQgY2FuY2VsZWQgYnkgYSB0b3VjaGNhbmNlbCBldmVudD9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBOb3RlOiBcImNhbmNlbGVkXCIgaXMgdGhlIEFtZXJpY2FuLUVuZ2xpc2ggc3BlbGxpbmcgb2YgXCJjYW5jZWxsZWRcIi4gUGxlYXNlIGRvbid0IHN1Ym1pdCBQUnMgY29ycmVjdGluZyBpdCFcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI3dhc0NhbmNlbGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53YXNDYW5jZWxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbW91c2UgaXMgbG9ja2VkLCB0aGUgaG9yaXpvbnRhbCByZWxhdGl2ZSBtb3ZlbWVudCBvZiB0aGUgUG9pbnRlciBpbiBwaXhlbHMgc2luY2UgbGFzdCBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI21vdmVtZW50WFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubW92ZW1lbnRYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIG1vdXNlIGlzIGxvY2tlZCwgdGhlIHZlcnRpY2FsIHJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBQb2ludGVyIGluIHBpeGVscyBzaW5jZSBsYXN0IGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjbW92ZW1lbnRZXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tb3ZlbWVudFkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaWRlbnRpZmllciBwcm9wZXJ0eSBvZiB0aGUgUG9pbnRlciBhcyBzZXQgYnkgdGhlIERPTSBldmVudCB3aGVuIHRoaXMgUG9pbnRlciBpcyBzdGFydGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjaWRlbnRpZmllclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaWRlbnRpZmllciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwb2ludGVySWQgcHJvcGVydHkgb2YgdGhlIFBvaW50ZXIgYXMgc2V0IGJ5IHRoZSBET00gZXZlbnQgd2hlbiB0aGlzIFBvaW50ZXIgaXMgc3RhcnRlZC5cclxuICAgICAgICAgKiBUaGUgYnJvd3NlciBjYW4gYW5kIHdpbGwgcmVjeWNsZSB0aGlzIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjcG9pbnRlcklkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wb2ludGVySWQgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhY3RpdmUgUG9pbnRlciBpcyBvbmUgdGhhdCBpcyBjdXJyZW50bHkgcHJlc3NlZCBkb3duIG9uIHRoZSBkaXNwbGF5LlxyXG4gICAgICAgICAqIEEgTW91c2UgaXMgYWx3YXlzIGNvbnNpZGVyZWQgYXMgYWN0aXZlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBvaW50ZXIjYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gKGlkID09PSAwKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhpcyBwb2ludGVyIFBvaW50ZXIgTG9ja2VkP1xyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIE9ubHkgYSBtb3VzZSBwb2ludGVyIGNhbiBiZSBsb2NrZWQgYW5kIGl0IG9ubHkgYmVjb21lcyBsb2NrZWQgd2hlbiByZXF1ZXN0ZWQgdmlhXHJcbiAgICAgICAgICogdGhlIGJyb3dzZXJzIFBvaW50ZXIgTG9jayBBUEkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogWW91IGNhbiByZXF1ZXN0IHRoaXMgYnkgY2FsbGluZyB0aGUgYHRoaXMuaW5wdXQubW91c2UucmVxdWVzdFBvaW50ZXJMb2NrKClgIG1ldGhvZCBmcm9tXHJcbiAgICAgICAgICogYSBgcG9pbnRlcmRvd25gIG9yIGBwb2ludGVydXBgIGV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNsb2NrZWRcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWwgc2Nyb2xsIGFtb3VudCB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgdXNlciBtb3ZpbmcgYSBtb3VzZSB3aGVlbCBvciBzaW1pbGFyIGlucHV0IGRldmljZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI2RlbHRhWFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbHRhWCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgd2lsbCB0eXBpY2FsbHkgYmUgbGVzcyB0aGFuIDAgaWYgdGhlIHVzZXIgc2Nyb2xscyB1cCBhbmQgZ3JlYXRlciB0aGFuIHplcm8gaWYgc2Nyb2xsaW5nIGRvd24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNkZWx0YVlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWx0YVkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgei1heGlzIHNjcm9sbCBhbW91bnQgdGhhdCBvY2N1cnJlZCBkdWUgdG8gdGhlIHVzZXIgbW92aW5nIGEgbW91c2Ugd2hlZWwgb3Igc2ltaWxhciBpbnB1dCBkZXZpY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciNkZWx0YVpcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWx0YVogPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQ2FtZXJhIGFuZCB1cGRhdGVzIHRoaXMgUG9pbnRlcidzIGB3b3JsZFhgIGFuZCBgd29ybGRZYCB2YWx1ZXMgc28gdGhleSBhcmVcclxuICAgICAqIHRoZSByZXN1bHQgb2YgYSB0cmFuc2xhdGlvbiB0aHJvdWdoIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCB0aGUgdmFsdWVzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB0aGUgbW9tZW50IHRoZSBQb2ludGVyIGlzXHJcbiAgICAgKiB1cGRhdGVkIGJ5IGFuIGlucHV0IGV2ZW50LCBzdWNoIGFzIGEgbW91c2UgbW92ZSwgc28gc2hvdWxkIGJlIHVzZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciN1cGRhdGVXb3JsZFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB3aGljaCBpcyBiZWluZyB0ZXN0ZWQgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFBvaW50ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVXb3JsZFBvaW50OiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG5cclxuICAgICAgICBpZiAoY2FtZXJhLnJlc29sdXRpb24gIT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4ICs9IGNhbWVyYS5feDtcclxuICAgICAgICAgICAgeSArPSBjYW1lcmEuX3k7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgU3RvcmVzIHRoZSB3b3JsZCBwb2ludCBpbnNpZGUgb2YgdGVtcFBvaW50XHJcbiAgICAgICAgdmFyIHRlbXAgPSBjYW1lcmEuZ2V0V29ybGRQb2ludCh4LCB5KTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZFggPSB0ZW1wLng7XHJcbiAgICAgICAgdGhpcy53b3JsZFkgPSB0ZW1wLnk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQ2FtZXJhIGFuZCByZXR1cm5zIGEgVmVjdG9yMiBjb250YWluaW5nIHRoZSB0cmFuc2xhdGVkIHBvc2l0aW9uIG9mIHRoaXMgUG9pbnRlclxyXG4gICAgICogd2l0aGluIHRoYXQgQ2FtZXJhLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhpcyBQb2ludGVycyBwb3NpdGlvbiBpbnRvIGNhbWVyYSBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI3Bvc2l0aW9uVG9DYW1lcmFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdG8gdXNlIGZvciB0aGUgdHJhbnNsYXRpb24uXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IFtvdXRwdXRdIC0gQSBWZWN0b3IyLWxpa2Ugb2JqZWN0IGluIHdoaWNoIHRvIHN0b3JlIHRoZSB0cmFuc2xhdGVkIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfG9iamVjdCl9IEEgVmVjdG9yMiBjb250YWluaW5nIHRoZSB0cmFuc2xhdGVkIGNvb3JkaW5hdGVzIG9mIHRoaXMgUG9pbnRlciwgYmFzZWQgb24gdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgICAqL1xyXG4gICAgcG9zaXRpb25Ub0NhbWVyYTogZnVuY3Rpb24gKGNhbWVyYSwgb3V0cHV0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBjYW1lcmEuZ2V0V29ybGRQb2ludCh0aGlzLngsIHRoaXMueSwgb3V0cHV0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBtb3Rpb24gb2YgdGhpcyBQb2ludGVyLCBpbmNsdWRpbmcgaXRzIHZlbG9jaXR5IGFuZCBhbmdsZSBvZiBtb3ZlbWVudC5cclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGVhY2ggZnJhbWUgYnkgdGhlIElucHV0IE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciN1cGRhdGVNb3Rpb25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZU1vdGlvbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY3ggPSB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICAgICAgdmFyIGN5ID0gdGhpcy5wb3NpdGlvbi55O1xyXG5cclxuICAgICAgICB2YXIgbXggPSB0aGlzLm1pZFBvaW50Lng7XHJcbiAgICAgICAgdmFyIG15ID0gdGhpcy5taWRQb2ludC55O1xyXG5cclxuICAgICAgICBpZiAoY3ggPT09IG14ICYmIGN5ID09PSBteSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBOb3RoaW5nIHRvIGRvIGhlcmVcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIE1vdmluZyB0b3dhcmRzIG91ciBnb2FsIC4uLlxyXG4gICAgICAgIHZhciB2eCA9IFNtb290aFN0ZXBJbnRlcnBvbGF0aW9uKHRoaXMubW90aW9uRmFjdG9yLCBteCwgY3gpO1xyXG4gICAgICAgIHZhciB2eSA9IFNtb290aFN0ZXBJbnRlcnBvbGF0aW9uKHRoaXMubW90aW9uRmFjdG9yLCBteSwgY3kpO1xyXG5cclxuICAgICAgICBpZiAoRnV6enlFcXVhbCh2eCwgY3gsIDAuMSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2eCA9IGN4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEZ1enp5RXF1YWwodnksIGN5LCAwLjEpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdnkgPSBjeTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWlkUG9pbnQuc2V0KHZ4LCB2eSk7XHJcblxyXG4gICAgICAgIHZhciBkeCA9IGN4IC0gdng7XHJcbiAgICAgICAgdmFyIGR5ID0gY3kgLSB2eTtcclxuXHJcbiAgICAgICAgdGhpcy52ZWxvY2l0eS5zZXQoZHgsIGR5KTtcclxuXHJcbiAgICAgICAgdGhpcy5hbmdsZSA9IEFuZ2xlKHZ4LCB2eSwgY3gsIGN5KTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGhhbmRsZSBhIE1vdXNlIFVwIEV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjdXBcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIE1vdXNlIEV2ZW50IHRvIHByb2Nlc3MuXHJcbiAgICAgKi9cclxuICAgIHVwOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCdidXR0b25zJyBpbiBldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYnV0dG9ucyA9IGV2ZW50LmJ1dHRvbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xyXG5cclxuICAgICAgICB0aGlzLnVwRWxlbWVudCA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgLy8gIFNldHMgdGhlIGxvY2FsIHgveSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnRyYW5zZm9ybVBvaW50ZXIodGhpcywgZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vICAwOiBNYWluIGJ1dHRvbiBwcmVzc2VkLCB1c3VhbGx5IHRoZSBsZWZ0IGJ1dHRvbiBvciB0aGUgdW4taW5pdGlhbGl6ZWQgc3RhdGVcclxuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wcmltYXJ5RG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnVwWCA9IHRoaXMueDtcclxuICAgICAgICAgICAgdGhpcy51cFkgPSB0aGlzLnk7XHJcbiAgICAgICAgICAgIHRoaXMudXBUaW1lID0gZXZlbnQudGltZVN0YW1wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy53YXNUb3VjaCA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgYSBNb3VzZSBEb3duIEV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQgLSBUaGUgTW91c2UgRXZlbnQgdG8gcHJvY2Vzcy5cclxuICAgICAqL1xyXG4gICAgZG93bjogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmICgnYnV0dG9ucycgaW4gZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnMgPSBldmVudC5idXR0b25zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xyXG5cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcclxuXHJcbiAgICAgICAgdGhpcy5kb3duRWxlbWVudCA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgLy8gIFNldHMgdGhlIGxvY2FsIHgveSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnRyYW5zZm9ybVBvaW50ZXIodGhpcywgZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vICAwOiBNYWluIGJ1dHRvbiBwcmVzc2VkLCB1c3VhbGx5IHRoZSBsZWZ0IGJ1dHRvbiBvciB0aGUgdW4taW5pdGlhbGl6ZWQgc3RhdGVcclxuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wcmltYXJ5RG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZG93blggPSB0aGlzLng7XHJcbiAgICAgICAgICAgIHRoaXMuZG93blkgPSB0aGlzLnk7XHJcbiAgICAgICAgICAgIHRoaXMuZG93blRpbWUgPSBldmVudC50aW1lU3RhbXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzRG93biA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMud2FzVG91Y2ggPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gaGFuZGxlIGEgTW91c2UgTW92ZSBFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI21vdmVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIE1vdXNlIEV2ZW50IHRvIHByb2Nlc3MuXHJcbiAgICAgKi9cclxuICAgIG1vdmU6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoJ2J1dHRvbnMnIGluIGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25zID0gZXZlbnQuYnV0dG9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgLy8gIFNldHMgdGhlIGxvY2FsIHgveSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnRyYW5zZm9ybVBvaW50ZXIodGhpcywgZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZLCB0cnVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGxlIERPTSBldmVudHMgbWF5IG9jY3VyIHdpdGhpbiBvbmUgZnJhbWUsIGJ1dCBvbmx5IG9uZSBQaGFzZXIgZXZlbnQgd2lsbCBmaXJlXHJcbiAgICAgICAgICAgIHRoaXMubW92ZW1lbnRYID0gZXZlbnQubW92ZW1lbnRYIHx8IGV2ZW50Lm1vek1vdmVtZW50WCB8fCBldmVudC53ZWJraXRNb3ZlbWVudFggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlbWVudFkgPSBldmVudC5tb3ZlbWVudFkgfHwgZXZlbnQubW96TW92ZW1lbnRZIHx8IGV2ZW50LndlYmtpdE1vdmVtZW50WSB8fCAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tb3ZlVGltZSA9IGV2ZW50LnRpbWVTdGFtcDtcclxuXHJcbiAgICAgICAgdGhpcy53YXNUb3VjaCA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgYSBNb3VzZSBXaGVlbCBFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI3doZWVsXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2hlZWxFdmVudH0gZXZlbnQgLSBUaGUgV2hlZWwgRXZlbnQgdG8gcHJvY2Vzcy5cclxuICAgICAqL1xyXG4gICAgd2hlZWw6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoJ2J1dHRvbnMnIGluIGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25zID0gZXZlbnQuYnV0dG9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgLy8gIFNldHMgdGhlIGxvY2FsIHgveSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnRyYW5zZm9ybVBvaW50ZXIodGhpcywgZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVsdGFYID0gZXZlbnQuZGVsdGFYO1xyXG4gICAgICAgIHRoaXMuZGVsdGFZID0gZXZlbnQuZGVsdGFZO1xyXG4gICAgICAgIHRoaXMuZGVsdGFaID0gZXZlbnQuZGVsdGFaO1xyXG5cclxuICAgICAgICB0aGlzLndhc1RvdWNoID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGhhbmRsZSBhIFRvdWNoIFN0YXJ0IEV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjdG91Y2hzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoIC0gVGhlIENoYW5nZWQgVG91Y2ggZnJvbSB0aGUgVG91Y2ggRXZlbnQuXHJcbiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2ZW50IC0gVGhlIGZ1bGwgVG91Y2ggRXZlbnQuXHJcbiAgICAgKi9cclxuICAgIHRvdWNoc3RhcnQ6IGZ1bmN0aW9uICh0b3VjaCwgZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRvdWNoWydwb2ludGVySWQnXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9pbnRlcklkID0gdG91Y2gucG9pbnRlcklkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRvdWNoLnRhcmdldDtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuYnV0dG9ucyA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgdGhpcy5kb3duRWxlbWVudCA9IHRvdWNoLnRhcmdldDtcclxuXHJcbiAgICAgICAgLy8gIFNldHMgdGhlIGxvY2FsIHgveSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnRyYW5zZm9ybVBvaW50ZXIodGhpcywgdG91Y2gucGFnZVgsIHRvdWNoLnBhZ2VZLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWFyeURvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZG93blggPSB0aGlzLng7XHJcbiAgICAgICAgdGhpcy5kb3duWSA9IHRoaXMueTtcclxuICAgICAgICB0aGlzLmRvd25UaW1lID0gZXZlbnQudGltZVN0YW1wO1xyXG5cclxuICAgICAgICB0aGlzLmlzRG93biA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMud2FzVG91Y2ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud2FzQ2FuY2VsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVNb3Rpb24oKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gaGFuZGxlIGEgVG91Y2ggTW92ZSBFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI3RvdWNobW92ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoIC0gVGhlIENoYW5nZWQgVG91Y2ggZnJvbSB0aGUgVG91Y2ggRXZlbnQuXHJcbiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2ZW50IC0gVGhlIGZ1bGwgVG91Y2ggRXZlbnQuXHJcbiAgICAgKi9cclxuICAgIHRvdWNobW92ZTogZnVuY3Rpb24gKHRvdWNoLCBldmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIC8vICBTZXRzIHRoZSBsb2NhbCB4L3kgcHJvcGVydGllc1xyXG4gICAgICAgIHRoaXMubWFuYWdlci50cmFuc2Zvcm1Qb2ludGVyKHRoaXMsIHRvdWNoLnBhZ2VYLCB0b3VjaC5wYWdlWSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMubW92ZVRpbWUgPSBldmVudC50aW1lU3RhbXA7XHJcblxyXG4gICAgICAgIHRoaXMud2FzVG91Y2ggPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU1vdGlvbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgYSBUb3VjaCBFbmQgRXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciN0b3VjaGVuZFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoIC0gVGhlIENoYW5nZWQgVG91Y2ggZnJvbSB0aGUgVG91Y2ggRXZlbnQuXHJcbiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2ZW50IC0gVGhlIGZ1bGwgVG91Y2ggRXZlbnQuXHJcbiAgICAgKi9cclxuICAgIHRvdWNoZW5kOiBmdW5jdGlvbiAodG91Y2gsIGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYnV0dG9ucyA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgdGhpcy51cEVsZW1lbnQgPSB0b3VjaC50YXJnZXQ7XHJcblxyXG4gICAgICAgIC8vICBTZXRzIHRoZSBsb2NhbCB4L3kgcHJvcGVydGllc1xyXG4gICAgICAgIHRoaXMubWFuYWdlci50cmFuc2Zvcm1Qb2ludGVyKHRoaXMsIHRvdWNoLnBhZ2VYLCB0b3VjaC5wYWdlWSwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLnByaW1hcnlEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy51cFggPSB0aGlzLng7XHJcbiAgICAgICAgdGhpcy51cFkgPSB0aGlzLnk7XHJcbiAgICAgICAgdGhpcy51cFRpbWUgPSBldmVudC50aW1lU3RhbXA7XHJcblxyXG4gICAgICAgIHRoaXMuaXNEb3duID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMud2FzVG91Y2ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMud2FzQ2FuY2VsZWQgPSBmYWxzZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU1vdGlvbigpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgYSBUb3VjaCBDYW5jZWwgRXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciN0b3VjaGNhbmNlbFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE1LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaCAtIFRoZSBDaGFuZ2VkIFRvdWNoIGZyb20gdGhlIFRvdWNoIEV2ZW50LlxyXG4gICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBldmVudCAtIFRoZSBmdWxsIFRvdWNoIEV2ZW50LlxyXG4gICAgICovXHJcbiAgICB0b3VjaGNhbmNlbDogZnVuY3Rpb24gKHRvdWNoLCBldmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJ1dHRvbnMgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMudXBFbGVtZW50ID0gdG91Y2gudGFyZ2V0O1xyXG5cclxuICAgICAgICAvLyAgU2V0cyB0aGUgbG9jYWwgeC95IHByb3BlcnRpZXNcclxuICAgICAgICB0aGlzLm1hbmFnZXIudHJhbnNmb3JtUG9pbnRlcih0aGlzLCB0b3VjaC5wYWdlWCwgdG91Y2gucGFnZVksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmltYXJ5RG93biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXBYID0gdGhpcy54O1xyXG4gICAgICAgIHRoaXMudXBZID0gdGhpcy55O1xyXG4gICAgICAgIHRoaXMudXBUaW1lID0gZXZlbnQudGltZVN0YW1wO1xyXG5cclxuICAgICAgICB0aGlzLmlzRG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLndhc1RvdWNoID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndhc0NhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgYW55IGJ1dHRvbnMgYXJlIGJlaW5nIGhlbGQgZG93biBvbiB0aGlzIFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNub0J1dHRvbkRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBubyBidXR0b25zIGFyZSBiZWluZyBoZWxkIGRvd24uXHJcbiAgICAgKi9cclxuICAgIG5vQnV0dG9uRG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnV0dG9ucyA9PT0gMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgbGVmdCBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duIG9uIHRoaXMgUG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2xlZnRCdXR0b25Eb3duXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGxlZnQgYnV0dG9uIGlzIGJlaW5nIGhlbGQgZG93bi5cclxuICAgICAqL1xyXG4gICAgbGVmdEJ1dHRvbkRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbnMgJiAxKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSByaWdodCBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duIG9uIHRoaXMgUG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI3JpZ2h0QnV0dG9uRG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByaWdodCBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duLlxyXG4gICAgICovXHJcbiAgICByaWdodEJ1dHRvbkRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbnMgJiAyKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBtaWRkbGUgYnV0dG9uIGlzIGJlaW5nIGhlbGQgZG93biBvbiB0aGlzIFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNtaWRkbGVCdXR0b25Eb3duXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG1pZGRsZSBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duLlxyXG4gICAgICovXHJcbiAgICBtaWRkbGVCdXR0b25Eb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5idXR0b25zICYgNCkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYmFjayBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duIG9uIHRoaXMgUG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2JhY2tCdXR0b25Eb3duXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGJhY2sgYnV0dG9uIGlzIGJlaW5nIGhlbGQgZG93bi5cclxuICAgICAqL1xyXG4gICAgYmFja0J1dHRvbkRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbnMgJiA4KSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBmb3J3YXJkIGJ1dHRvbiBpcyBiZWluZyBoZWxkIGRvd24gb24gdGhpcyBQb2ludGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjZm9yd2FyZEJ1dHRvbkRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZm9yd2FyZCBidXR0b24gaXMgYmVpbmcgaGVsZCBkb3duLlxyXG4gICAgICovXHJcbiAgICBmb3J3YXJkQnV0dG9uRG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnV0dG9ucyAmIDE2KSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBsZWZ0IGJ1dHRvbiB3YXMganVzdCByZWxlYXNlZCBvbiB0aGlzIFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNsZWZ0QnV0dG9uUmVsZWFzZWRcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGxlZnQgYnV0dG9uIHdhcyBqdXN0IHJlbGVhc2VkLlxyXG4gICAgICovXHJcbiAgICBsZWZ0QnV0dG9uUmVsZWFzZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbiA9PT0gMCAmJiAhdGhpcy5pc0Rvd24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHJpZ2h0IGJ1dHRvbiB3YXMganVzdCByZWxlYXNlZCBvbiB0aGlzIFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNyaWdodEJ1dHRvblJlbGVhc2VkXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByaWdodCBidXR0b24gd2FzIGp1c3QgcmVsZWFzZWQuXHJcbiAgICAgKi9cclxuICAgIHJpZ2h0QnV0dG9uUmVsZWFzZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbiA9PT0gMiAmJiAhdGhpcy5pc0Rvd24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIG1pZGRsZSBidXR0b24gd2FzIGp1c3QgcmVsZWFzZWQgb24gdGhpcyBQb2ludGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjbWlkZGxlQnV0dG9uUmVsZWFzZWRcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG1pZGRsZSBidXR0b24gd2FzIGp1c3QgcmVsZWFzZWQuXHJcbiAgICAgKi9cclxuICAgIG1pZGRsZUJ1dHRvblJlbGVhc2VkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5idXR0b24gPT09IDEgJiYgIXRoaXMuaXNEb3duKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBiYWNrIGJ1dHRvbiB3YXMganVzdCByZWxlYXNlZCBvbiB0aGlzIFBvaW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNiYWNrQnV0dG9uUmVsZWFzZWRcclxuICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGJhY2sgYnV0dG9uIHdhcyBqdXN0IHJlbGVhc2VkLlxyXG4gICAgICovXHJcbiAgICBiYWNrQnV0dG9uUmVsZWFzZWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1dHRvbiA9PT0gMyAmJiAhdGhpcy5pc0Rvd24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGZvcndhcmQgYnV0dG9uIHdhcyBqdXN0IHJlbGVhc2VkIG9uIHRoaXMgUG9pbnRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2ZvcndhcmRCdXR0b25SZWxlYXNlZFxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZm9yd2FyZCBidXR0b24gd2FzIGp1c3QgcmVsZWFzZWQuXHJcbiAgICAgKi9cclxuICAgIGZvcndhcmRCdXR0b25SZWxlYXNlZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnV0dG9uID09PSA0ICYmICF0aGlzLmlzRG93bik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhlIFBvaW50ZXIgaGFzIGEgYnV0dG9uIHByZXNzZWQgZG93biBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIHRoZVxyXG4gICAgICogZGlzdGFuY2UgYmV0d2VlbiB0aGUgUG9pbnRlcidzIGBkb3duWGAgYW5kIGBkb3duWWAgdmFsdWVzIGFuZCB0aGUgY3VycmVudCBwb3NpdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogSWYgbm8gYnV0dG9uIGlzIGhlbGQgZG93biwgaXQgd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVjb3JkZWQgZGlzdGFuY2UsIGJhc2VkIG9uIHdoZXJlXHJcbiAgICAgKiB0aGUgUG9pbnRlciB3YXMgd2hlbiB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZC5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IHdpc2ggdG8gZ2V0IHRoZSBkaXN0YW5jZSBiZWluZyB0cmF2ZWxsZWQgY3VycmVudGx5LCBiYXNlZCBvbiB0aGUgdmVsb2NpdHkgb2YgdGhlIFBvaW50ZXIsXHJcbiAgICAgKiB0aGVuIHNlZSB0aGUgYFBvaW50ZXIuZGlzdGFuY2VgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjZ2V0RGlzdGFuY2VcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSB0aGUgUG9pbnRlciBtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIERpc3RhbmNlKHRoaXMuZG93blgsIHRoaXMuZG93blksIHRoaXMueCwgdGhpcy55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIERpc3RhbmNlKHRoaXMuZG93blgsIHRoaXMuZG93blksIHRoaXMudXBYLCB0aGlzLnVwWSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBQb2ludGVyIGhhcyBhIGJ1dHRvbiBwcmVzc2VkIGRvd24gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiB0aGVcclxuICAgICAqIGhvcml6b250YWwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgUG9pbnRlcidzIGBkb3duWGAgYW5kIGBkb3duWWAgdmFsdWVzIGFuZCB0aGUgY3VycmVudCBwb3NpdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogSWYgbm8gYnV0dG9uIGlzIGhlbGQgZG93biwgaXQgd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVjb3JkZWQgaG9yaXpvbnRhbCBkaXN0YW5jZSwgYmFzZWQgb24gd2hlcmVcclxuICAgICAqIHRoZSBQb2ludGVyIHdhcyB3aGVuIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjZ2V0RGlzdGFuY2VYXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgaG9yaXpvbnRhbCBkaXN0YW5jZSB0aGUgUG9pbnRlciBtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0RGlzdGFuY2VYOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmRvd25YIC0gdGhpcy54KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuZG93blggLSB0aGlzLnVwWCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBQb2ludGVyIGhhcyBhIGJ1dHRvbiBwcmVzc2VkIGRvd24gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiB0aGVcclxuICAgICAqIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdGhlIFBvaW50ZXIncyBgZG93blhgIGFuZCBgZG93bllgIHZhbHVlcyBhbmQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIElmIG5vIGJ1dHRvbiBpcyBoZWxkIGRvd24sIGl0IHdpbGwgcmV0dXJuIHRoZSBsYXN0IHJlY29yZGVkIHZlcnRpY2FsIGRpc3RhbmNlLCBiYXNlZCBvbiB3aGVyZVxyXG4gICAgICogdGhlIFBvaW50ZXIgd2FzIHdoZW4gdGhlIGJ1dHRvbiB3YXMgcmVsZWFzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuUG9pbnRlciNnZXREaXN0YW5jZVlcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSB0aGUgUG9pbnRlciBtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0RGlzdGFuY2VZOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmRvd25ZIC0gdGhpcy55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuZG93blkgLSB0aGlzLnVwWSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBQb2ludGVyIGhhcyBhIGJ1dHRvbiBwcmVzc2VkIGRvd24gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiB0aGVcclxuICAgICAqIGR1cmF0aW9uIHNpbmNlIHRoZSBidXR0b24gd2FzIHByZXNzZWQgZG93bi5cclxuICAgICAqIFxyXG4gICAgICogSWYgbm8gYnV0dG9uIGlzIGhlbGQgZG93biwgaXQgd2lsbCByZXR1cm4gdGhlIGxhc3QgcmVjb3JkZWQgZHVyYXRpb24sIGJhc2VkIG9uIHRoZSB0aW1lXHJcbiAgICAgKiB0aGUgUG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlBvaW50ZXIjZ2V0RHVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiB0aGUgUG9pbnRlciB3YXMgaGVsZCBkb3duIGZvciBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGdldER1cmF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5tYW5hZ2VyLnRpbWUgLSB0aGlzLmRvd25UaW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnVwVGltZSAtIHRoaXMuZG93blRpbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgUG9pbnRlciBoYXMgYSBidXR0b24gcHJlc3NlZCBkb3duIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gdGhlXHJcbiAgICAgKiBhbmdsZSBiZXR3ZWVuIHRoZSBQb2ludGVyJ3MgYGRvd25YYCBhbmQgYGRvd25ZYCB2YWx1ZXMgYW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiBubyBidXR0b24gaXMgaGVsZCBkb3duLCBpdCB3aWxsIHJldHVybiB0aGUgbGFzdCByZWNvcmRlZCBhbmdsZSwgYmFzZWQgb24gd2hlcmVcclxuICAgICAqIHRoZSBQb2ludGVyIHdhcyB3aGVuIHRoZSBidXR0b24gd2FzIHJlbGVhc2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgYW5nbGUgaXMgYmFzZWQgb24gdGhlIG9sZCBwb3NpdGlvbiBmYWNpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIGdldCB0aGUgY3VycmVudCBhbmdsZSwgYmFzZWQgb24gdGhlIHZlbG9jaXR5IG9mIHRoZSBQb2ludGVyLCB0aGVuXHJcbiAgICAgKiBzZWUgdGhlIGBQb2ludGVyLmFuZ2xlYCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2dldEFuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgYmV0d2VlbiB0aGUgUG9pbnRlcidzIGNvb3JkaW5hdGVzIGluIHJhZGlhbnMuXHJcbiAgICAgKi9cclxuICAgIGdldEFuZ2xlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBBbmdsZSh0aGlzLmRvd25YLCB0aGlzLmRvd25ZLCB0aGlzLngsIHRoaXMueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBBbmdsZSh0aGlzLmRvd25YLCB0aGlzLmRvd25ZLCB0aGlzLnVwWCwgdGhpcy51cFkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgUG9pbnRlciBwb3NpdGlvbnMgYW5kIHRoZW4gZ2VuZXJhdGVzIGFuIGFycmF5IG9mIGludGVycG9sYXRlZCB2YWx1ZXMgYmV0d2VlblxyXG4gICAgICogdGhlIHR3by4gVGhlIGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkIHVwIHRvIHRoZSBzaXplIG9mIHRoZSBgc3RlcHNgIGFyZ3VtZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhU2NyaXB0XHJcbiAgICAgKiB2YXIgcG9pbnRzID0gcG9pbnRlci5nZXRJbnRlcnBvbGF0ZWRQb3NpdGlvbig0KTtcclxuICAgICAqIFxyXG4gICAgICogLy8gcG9pbnRzWzBdID0geyB4OiAwLCB5OiAwIH1cclxuICAgICAqIC8vIHBvaW50c1sxXSA9IHsgeDogMiwgeTogMSB9XHJcbiAgICAgKiAvLyBwb2ludHNbMl0gPSB7IHg6IDMsIHk6IDIgfVxyXG4gICAgICogLy8gcG9pbnRzWzNdID0geyB4OiA2LCB5OiAzIH1cclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byBnZXQgc21vb3RoZWQgdmFsdWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb25zLiBET00gcG9pbnRlclxyXG4gICAgICogZXZlbnRzIGNhbiBvZnRlbiBmaXJlIGZhc3RlciB0aGFuIHRoZSBtYWluIGJyb3dzZXIgbG9vcCwgYW5kIHRoaXMgd2lsbCBoZWxwIHlvdSBhdm9pZCBqYW5reSBtb3ZlbWVudFxyXG4gICAgICogZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBhbiBvYmplY3QgZm9sbG93aW5nIGEgUG9pbnRlci5cclxuICAgICAqIFxyXG4gICAgICogTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGFuIG91dHB1dCBhcnJheSBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIHVwIHRvIHRoZSBudW1iZXIgb2Ygc3RlcHMgcHJvdmlkZWQuXHJcbiAgICAgKiBJdCB3aWxsIG5vdCBjbGVhciBhbnkgcHJldmlvdXMgZGF0YSB0aGF0IG1heSBoYXZlIGV4aXN0ZWQgYmV5b25kIHRoZSByYW5nZSBvZiB0aGUgc3RlcHMgY291bnQuXHJcbiAgICAgKiBcclxuICAgICAqIEludGVybmFsbHkgaXQgdXNlcyB0aGUgU21vb3RoIFN0ZXAgaW50ZXJwb2xhdGlvbiBjYWxjdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2dldEludGVycG9sYXRlZFBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0ZXBzPTEwXSAtIFRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGlvbiBzdGVwcyB0byB1c2UuXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBbb3V0XSAtIEFuIGFycmF5IHRvIHN0b3JlIHRoZSByZXN1bHRzIGluLiBJZiBub3QgcHJvdmlkZWQgYSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IG9mIGludGVycG9sYXRlZCB2YWx1ZXMuXHJcbiAgICAgKi9cclxuICAgIGdldEludGVycG9sYXRlZFBvc2l0aW9uOiBmdW5jdGlvbiAoc3RlcHMsIG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RlcHMgPT09IHVuZGVmaW5lZCkgeyBzdGVwcyA9IDEwOyB9XHJcbiAgICAgICAgaWYgKG91dCA9PT0gdW5kZWZpbmVkKSB7IG91dCA9IFtdOyB9XHJcblxyXG4gICAgICAgIHZhciBwcmV2WCA9IHRoaXMucHJldlBvc2l0aW9uLng7XHJcbiAgICAgICAgdmFyIHByZXZZID0gdGhpcy5wcmV2UG9zaXRpb24ueTtcclxuXHJcbiAgICAgICAgdmFyIGN1clggPSB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICAgICAgdmFyIGN1clkgPSB0aGlzLnBvc2l0aW9uLnk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcHM7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0ID0gKDEgLyBzdGVwcykgKiBpO1xyXG5cclxuICAgICAgICAgICAgb3V0W2ldID0geyB4OiBTbW9vdGhTdGVwSW50ZXJwb2xhdGlvbih0LCBwcmV2WCwgY3VyWCksIHk6IFNtb290aFN0ZXBJbnRlcnBvbGF0aW9uKHQsIHByZXZZLCBjdXJZKSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIFBvaW50ZXIgaW5zdGFuY2UgYW5kIHJlc2V0cyBpdHMgZXh0ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Qb2ludGVyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgUG9pbnRlci5cclxuICAgICAqIFRoZSB2YWx1ZSBpcyBpbiBzY3JlZW4gc3BhY2UuXHJcbiAgICAgKiBTZWUgYHdvcmxkWGAgdG8gZ2V0IGEgY2FtZXJhIGNvbnZlcnRlZCBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN4XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHkgcG9zaXRpb24gb2YgdGhpcyBQb2ludGVyLlxyXG4gICAgICogVGhlIHZhbHVlIGlzIGluIHNjcmVlbiBzcGFjZS5cclxuICAgICAqIFNlZSBgd29ybGRZYCB0byBnZXQgYSBjYW1lcmEgY29udmVydGVkIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Qb2ludGVyI3lcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi55O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi55ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lIHdoZW4gdGhpcyBQb2ludGVyIHdhcyBtb3N0IHJlY2VudGx5IHVwZGF0ZWQgYnkgYSBET00gRXZlbnQuXHJcbiAgICAgKiBUaGlzIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIGBldmVudC50aW1lU3RhbXBgIHByb3BlcnR5LlxyXG4gICAgICogSWYgbm8gZXZlbnQgaGFzIHlldCB0YWtlbiBwbGFjZSwgaXQgd2lsbCByZXR1cm4gemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuUG9pbnRlciN0aW1lXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHRpbWU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmV2ZW50KSA/IHRoaXMuZXZlbnQudGltZVN0YW1wIDogMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIElOUFVUX0NPTlNUID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1vdXNlIHBvaW50ZXIgaXMgYmVpbmcgaGVsZCBkb3duLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTU9VU0VfRE9XTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIE1PVVNFX0RPV046IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbW91c2UgcG9pbnRlciBpcyBiZWluZyBtb3ZlZC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0Lk1PVVNFX01PVkVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBNT1VTRV9NT1ZFOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1vdXNlIHBvaW50ZXIgaXMgcmVsZWFzZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5NT1VTRV9VUFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIE1PVVNFX1VQOiAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaCBwb2ludGVyIGhhcyBiZWVuIHN0YXJ0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5UT1VDSF9TVEFSVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIFRPVUNIX1NUQVJUOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaCBwb2ludGVyIGhhcyBiZWVuIHN0YXJ0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5UT1VDSF9NT1ZFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgVE9VQ0hfTU9WRTogNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgdG91Y2ggcG9pbnRlciBoYXMgYmVlbiBzdGFydGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuVE9VQ0hfRU5EXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgVE9VQ0hfRU5EOiA1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBvaW50ZXIgbG9jayBoYXMgY2hhbmdlZC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LlBPSU5URVJfTE9DS19DSEFOR0VcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBQT0lOVEVSX0xPQ0tfQ0hBTkdFOiA2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b3VjaCBwb2ludGVyIGhhcyBiZWVuIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSBicm93c2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuVE9VQ0hfQ0FOQ0VMXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjE1LjBcclxuICAgICAqL1xyXG4gICAgVE9VQ0hfQ0FOQ0VMOiA3LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1vdXNlIHdoZWVsIGNoYW5nZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5NT1VTRV9XSEVFTFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKi9cclxuICAgIE1PVVNFX1dIRUVMOiA4XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJTlBVVF9DT05TVDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIElucHV0IFBsdWdpbiBCb290IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBpbnRlcm5hbCBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gd2hlbiBpdCBib290cywgc2lnbmFsbGluZyB0byBhbGwgb2YgaXRzIHN5c3RlbXMgdG8gY3JlYXRlIHRoZW1zZWx2ZXMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0JPT1RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdib290JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIElucHV0IFBsdWdpbiBEZXN0cm95IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBpbnRlcm5hbCBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gd2hlbiBpdCBpcyBkZXN0cm95ZWQsIHNpZ25hbGxpbmcgdG8gYWxsIG9mIGl0cyBzeXN0ZW1zIHRvIGRlc3Ryb3kgdGhlbXNlbHZlcy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjREVTVFJPWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Rlc3Ryb3knO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBEcmFnIEVuZCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBzdG9wcyBkcmFnZ2luZyBhIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ2RyYWdlbmQnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX0RSQUdfRU5EXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RSQUdfRU5EfSBldmVudCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNEUkFHX0VORFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IHRoYXQgdGhpcyBwb2ludGVyIHN0b3BwZWQgZHJhZ2dpbmcuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkcmFnZW5kJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFBvaW50ZXIgRHJhZyBFbnRlciBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBkcmFncyBhIEdhbWUgT2JqZWN0IGludG8gYSBEcmFnIFRhcmdldC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdkcmFnZW50ZXInLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogQSBQb2ludGVyIGNhbiBvbmx5IGRyYWcgYSBzaW5nbGUgR2FtZSBPYmplY3QgYXQgb25jZS5cclxuICogXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGEgX3NwZWNpZmljXyBHYW1lIE9iamVjdCwgdXNlIHRoZSBbR0FNRU9CSkVDVF9EUkFHX0VOVEVSXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RSQUdfRU5URVJ9IGV2ZW50IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0RSQUdfRU5URVJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCB0aGF0IHRoaXMgcG9pbnRlciBpcyBkcmFnZ2luZy5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gdGFyZ2V0IC0gVGhlIGRyYWcgdGFyZ2V0IHRoYXQgdGhpcyBwb2ludGVyIGhhcyBtb3ZlZCBpbnRvLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZHJhZ2VudGVyJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFBvaW50ZXIgRHJhZyBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBtb3ZlcyB3aGlsZSBkcmFnZ2luZyBhIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ2RyYWcnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogQSBQb2ludGVyIGNhbiBvbmx5IGRyYWcgYSBzaW5nbGUgR2FtZSBPYmplY3QgYXQgb25jZS5cclxuICogXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGEgX3NwZWNpZmljXyBHYW1lIE9iamVjdCwgdXNlIHRoZSBbR0FNRU9CSkVDVF9EUkFHXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RSQUd9IGV2ZW50IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0RSQUdcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCB0aGF0IHRoaXMgcG9pbnRlciBpcyBkcmFnZ2luZy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRyYWdYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgUG9pbnRlciBpcyBjdXJyZW50bHkgZHJhZ2dpbmcgdGhlIEdhbWUgT2JqZWN0LCBpbiB3b3JsZCBzcGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRyYWdZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgUG9pbnRlciBpcyBjdXJyZW50bHkgZHJhZ2dpbmcgdGhlIEdhbWUgT2JqZWN0LCBpbiB3b3JsZCBzcGFjZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWcnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBEcmFnIExlYXZlIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGRyYWdzIGEgR2FtZSBPYmplY3Qgb3V0IG9mIGEgRHJhZyBUYXJnZXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZHJhZ2xlYXZlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEEgUG9pbnRlciBjYW4gb25seSBkcmFnIGEgc2luZ2xlIEdhbWUgT2JqZWN0IGF0IG9uY2UuXHJcbiAqIFxyXG4gKiBUbyBsaXN0ZW4gZm9yIHRoaXMgZXZlbnQgZnJvbSBhIF9zcGVjaWZpY18gR2FtZSBPYmplY3QsIHVzZSB0aGUgW0dBTUVPQkpFQ1RfRFJBR19MRUFWRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9EUkFHX0xFQVZFfSBldmVudCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNEUkFHX0xFQVZFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgdGhhdCB0aGlzIHBvaW50ZXIgaXMgZHJhZ2dpbmcuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHRhcmdldCAtIFRoZSBkcmFnIHRhcmdldCB0aGF0IHRoaXMgcG9pbnRlciBoYXMgbGVmdC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWdsZWF2ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQb2ludGVyIERyYWcgT3ZlciBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBkcmFncyBhIEdhbWUgT2JqZWN0IG92ZXIgYSBEcmFnIFRhcmdldC5cclxuICogXHJcbiAqIFdoZW4gdGhlIEdhbWUgT2JqZWN0IGZpcnN0IGVudGVycyB0aGUgZHJhZyB0YXJnZXQgaXQgd2lsbCBlbWl0IGEgYGRyYWdlbnRlcmAgZXZlbnQuIElmIGl0IHRoZW4gbW92ZXMgd2hpbGUgd2l0aGluXHJcbiAqIHRoZSBkcmFnIHRhcmdldCwgaXQgd2lsbCBlbWl0IHRoaXMgZXZlbnQgaW5zdGVhZC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdkcmFnb3ZlcicsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBBIFBvaW50ZXIgY2FuIG9ubHkgZHJhZyBhIHNpbmdsZSBHYW1lIE9iamVjdCBhdCBvbmNlLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX0RSQUdfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9EUkFHX09WRVJ9IGV2ZW50IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0RSQUdfT1ZFUlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IHRoYXQgdGhpcyBwb2ludGVyIGlzIGRyYWdnaW5nLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSB0YXJnZXQgLSBUaGUgZHJhZyB0YXJnZXQgdGhhdCB0aGlzIHBvaW50ZXIgaGFzIG1vdmVkIG92ZXIuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkcmFnb3Zlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQb2ludGVyIERyYWcgU3RhcnQgSW5wdXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIElucHV0IFBsdWdpbiBiZWxvbmdpbmcgdG8gYSBTY2VuZSBpZiBhIHBvaW50ZXIgc3RhcnRzIHRvIGRyYWcgYW55IEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ2RyYWdzdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBBIFBvaW50ZXIgY2FuIG9ubHkgZHJhZyBhIHNpbmdsZSBHYW1lIE9iamVjdCBhdCBvbmNlLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX0RSQUdfU1RBUlRde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfRFJBR19TVEFSVH0gZXZlbnQgaW5zdGVhZC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjRFJBR19TVEFSVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IHRoYXQgdGhpcyBwb2ludGVyIGlzIGRyYWdnaW5nLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZHJhZ3N0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFBvaW50ZXIgRHJvcCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBkcm9wcyBhIEdhbWUgT2JqZWN0IG9uIGEgRHJhZyBUYXJnZXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZHJvcCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUbyBsaXN0ZW4gZm9yIHRoaXMgZXZlbnQgZnJvbSBhIF9zcGVjaWZpY18gR2FtZSBPYmplY3QsIHVzZSB0aGUgW0dBTUVPQkpFQ1RfRFJPUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9EUk9QfSBldmVudCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNEUk9QXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgdGhhdCB0aGlzIHBvaW50ZXIgd2FzIGRyYWdnaW5nLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSB0YXJnZXQgLSBUaGUgRHJhZyBUYXJnZXQgdGhlIGBnYW1lT2JqZWN0YCBoYXMgYmVlbiBkcm9wcGVkIG9uLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZHJvcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBEb3duIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGlzIHByZXNzZWQgZG93biBvbiBfYW55XyBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdnYW1lb2JqZWN0ZG93bicsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUbyByZWNlaXZlIHRoaXMgZXZlbnQsIHRoZSBHYW1lIE9iamVjdHMgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX1BPSU5URVJfRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX0RPV059IGV2ZW50IGluc3RlYWQuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbR0FNRU9CSkVDVF9QT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9ET1dOXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RPV059XHJcbiAqIDMuIFtQT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfRE9XTn0gb3IgW1BPSU5URVJfRE9XTl9PVVRTSURFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX0RPV05fT1VUU0lERX1cclxuICogXHJcbiAqIFdpdGggdGhlIHRvcCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZpcnN0IGFuZCB0aGVuIGZsb3dpbmcgZG93biB0aGUgbGlzdC4gTm90ZSB0aGF0IGhpZ2hlci11cCBldmVudCBoYW5kbGVycyBjYW4gc3RvcFxyXG4gKiB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9ET1dOXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhlIHBvaW50ZXIgd2FzIHByZXNzZWQgZG93biBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuRXZlbnREYXRhfSBldmVudCAtIFRoZSBQaGFzZXIgaW5wdXQgZXZlbnQuIFlvdSBjYW4gY2FsbCBgc3RvcFByb3BhZ2F0aW9uKClgIHRvIGhhbHQgaXQgZnJvbSBnb2luZyBhbnkgZnVydGhlciBpbiB0aGUgZXZlbnQgZmxvdy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2dhbWVvYmplY3Rkb3duJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IERyYWcgRW5kIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IGlmIGEgcG9pbnRlciBzdG9wcyBkcmFnZ2luZyBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ2RyYWdlbmQnLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlIGFuZCBlbmFibGVkIGZvciBkcmFnLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVdKFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlKSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfRU5EXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkcmFnWCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIFBvaW50ZXIgc3RvcHBlZCBkcmFnZ2luZyB0aGUgR2FtZSBPYmplY3QsIGluIHdvcmxkIHNwYWNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZHJhZ1kgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBQb2ludGVyIHN0b3BwZWQgZHJhZ2dpbmcgdGhlIEdhbWUgT2JqZWN0LCBpbiB3b3JsZCBzcGFjZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWdlbmQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBPYmplY3QgRHJhZyBFbnRlciBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgZHJhZ3MgaXQgaW50byBhIGRyYWcgdGFyZ2V0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSBhIEdhbWUgT2JqZWN0IHVzaW5nOiBgZ2FtZU9iamVjdC5vbignZHJhZ2VudGVyJywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZSBhbmQgZW5hYmxlZCBmb3IgZHJhZy5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9EUkFHX0VOVEVSXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHRhcmdldCAtIFRoZSBkcmFnIHRhcmdldCB0aGF0IHRoaXMgcG9pbnRlciBoYXMgbW92ZWQgaW50by5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWdlbnRlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBEcmFnIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IGlmIGEgcG9pbnRlciBtb3ZlcyB3aGlsZSBkcmFnZ2luZyBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ2RyYWcnLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlIGFuZCBlbmFibGVkIGZvciBkcmFnLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRyYWdYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgUG9pbnRlciBpcyBjdXJyZW50bHkgZHJhZ2dpbmcgdGhlIEdhbWUgT2JqZWN0LCBpbiB3b3JsZCBzcGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRyYWdZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgUG9pbnRlciBpcyBjdXJyZW50bHkgZHJhZ2dpbmcgdGhlIEdhbWUgT2JqZWN0LCBpbiB3b3JsZCBzcGFjZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWcnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBPYmplY3QgRHJhZyBMZWF2ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgZHJhZ3MgaXQgb3V0IG9mIGEgZHJhZyB0YXJnZXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIGEgR2FtZSBPYmplY3QgdXNpbmc6IGBnYW1lT2JqZWN0Lm9uKCdkcmFnbGVhdmUnLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlIGFuZCBlbmFibGVkIGZvciBkcmFnLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfTEVBVkVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gdGFyZ2V0IC0gVGhlIGRyYWcgdGFyZ2V0IHRoYXQgdGhpcyBwb2ludGVyIGhhcyBsZWZ0LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZHJhZ2xlYXZlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IERyYWcgT3ZlciBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgZHJhZ3MgaXQgb3ZlciBhIGRyYWcgdGFyZ2V0LlxyXG4gKiBcclxuICogV2hlbiB0aGUgR2FtZSBPYmplY3QgZmlyc3QgZW50ZXJzIHRoZSBkcmFnIHRhcmdldCBpdCB3aWxsIGVtaXQgYSBgZHJhZ2VudGVyYCBldmVudC4gSWYgaXQgdGhlbiBtb3ZlcyB3aGlsZSB3aXRoaW5cclxuICogdGhlIGRyYWcgdGFyZ2V0LCBpdCB3aWxsIGVtaXQgdGhpcyBldmVudCBpbnN0ZWFkLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSBhIEdhbWUgT2JqZWN0IHVzaW5nOiBgZ2FtZU9iamVjdC5vbignZHJhZ292ZXInLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlIGFuZCBlbmFibGVkIGZvciBkcmFnLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RSQUdfT1ZFUlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSB0YXJnZXQgLSBUaGUgZHJhZyB0YXJnZXQgdGhhdCB0aGlzIHBvaW50ZXIgaGFzIG1vdmVkIG92ZXIuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkcmFnb3Zlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBEcmFnIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IGlmIGEgcG9pbnRlciBzdGFydHMgdG8gZHJhZyBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ2RyYWdzdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqIE5vdGUgdGhhdCB0aGUgc2NvcGUgb2YgdGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGJlIHRoZSBHYW1lIE9iamVjdCBpbnN0YW5jZSBpdHNlbGYuXHJcbiAqIFxyXG4gKiBUbyByZWNlaXZlIHRoaXMgZXZlbnQsIHRoZSBHYW1lIE9iamVjdCBtdXN0IGhhdmUgYmVlbiBzZXQgYXMgaW50ZXJhY3RpdmUgYW5kIGVuYWJsZWQgZm9yIGRyYWcuXHJcbiAqIFNlZSBbR2FtZU9iamVjdC5zZXRJbnRlcmFjdGl2ZV17QGxpbmsgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3Qjc2V0SW50ZXJhY3RpdmV9IGZvciBtb3JlIGRldGFpbHMuXHJcbiAqIFxyXG4gKiBUaGVyZSBhcmUgbG90cyBvZiB1c2VmdWwgZHJhZyByZWxhdGVkIHByb3BlcnRpZXMgdGhhdCBhcmUgc2V0IHdpdGhpbiB0aGUgR2FtZSBPYmplY3Qgd2hlbiBkcmFnZ2luZyBvY2N1cnMuXHJcbiAqIEZvciBleGFtcGxlLCBgZ2FtZU9iamVjdC5pbnB1dC5kcmFnU3RhcnRYYCwgYGRyYWdTdGFydFlgIGFuZCBzbyBvbi5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9EUkFHX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkcmFnWCAtIFRoZSB4IGNvb3JkaW5hdGUgd2hlcmUgdGhlIFBvaW50ZXIgaXMgY3VycmVudGx5IGRyYWdnaW5nIHRoZSBHYW1lIE9iamVjdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkcmFnWSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIFBvaW50ZXIgaXMgY3VycmVudGx5IGRyYWdnaW5nIHRoZSBHYW1lIE9iamVjdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkcmFnc3RhcnQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBPYmplY3QgRHJvcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgZHJvcHMgaXQgb24gYSBEcmFnIFRhcmdldC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ2Ryb3AnLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlIGFuZCBlbmFibGVkIGZvciBkcmFnLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX0RST1BcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gdGFyZ2V0IC0gVGhlIERyYWcgVGFyZ2V0IHRoZSBgZ2FtZU9iamVjdGAgaGFzIGJlZW4gZHJvcHBlZCBvbi5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Ryb3AnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZSBPYmplY3QgTW92ZSBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBpcyBtb3ZlZCBhY3Jvc3MgX2FueV8gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZ2FtZW9iamVjdG1vdmUnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3RzIG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGEgX3NwZWNpZmljXyBHYW1lIE9iamVjdCwgdXNlIHRoZSBbR0FNRU9CSkVDVF9QT0lOVEVSX01PVkVde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9NT1ZFfSBldmVudCBpbnN0ZWFkLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9NT1ZFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfTU9WRX1cclxuICogMi4gW0dBTUVPQkpFQ1RfTU9WRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9NT1ZFfVxyXG4gKiAzLiBbUE9JTlRFUl9NT1ZFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX01PVkV9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfTU9WRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoZSBwb2ludGVyIHdhcyBtb3ZlZCBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuRXZlbnREYXRhfSBldmVudCAtIFRoZSBQaGFzZXIgaW5wdXQgZXZlbnQuIFlvdSBjYW4gY2FsbCBgc3RvcFByb3BhZ2F0aW9uKClgIHRvIGhhbHQgaXQgZnJvbSBnb2luZyBhbnkgZnVydGhlciBpbiB0aGUgZXZlbnQgZmxvdy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2dhbWVvYmplY3Rtb3ZlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IE91dCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBtb3ZlcyBvdXQgb2YgX2FueV8gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZ2FtZW9iamVjdG91dCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUbyByZWNlaXZlIHRoaXMgZXZlbnQsIHRoZSBHYW1lIE9iamVjdHMgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX1BPSU5URVJfT1VUXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfT1VUfSBldmVudCBpbnN0ZWFkLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9PVVRde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9PVVR9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX09VVF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9PVVR9XHJcbiAqIDMuIFtQT0lOVEVSX09VVF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9PVVR9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfT1VUXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhlIHBvaW50ZXIgbW92ZWQgb3V0IG9mLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5FdmVudERhdGF9IGV2ZW50IC0gVGhlIFBoYXNlciBpbnB1dCBldmVudC4gWW91IGNhbiBjYWxsIGBzdG9wUHJvcGFnYXRpb24oKWAgdG8gaGFsdCBpdCBmcm9tIGdvaW5nIGFueSBmdXJ0aGVyIGluIHRoZSBldmVudCBmbG93LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZ2FtZW9iamVjdG91dCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBPdmVyIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIG1vdmVzIG92ZXIgX2FueV8gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZ2FtZW9iamVjdG92ZXInLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3RzIG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGEgX3NwZWNpZmljXyBHYW1lIE9iamVjdCwgdXNlIHRoZSBbR0FNRU9CSkVDVF9QT0lOVEVSX09WRVJde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9PVkVSfSBldmVudCBpbnN0ZWFkLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9PVkVSXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfT1ZFUn1cclxuICogMi4gW0dBTUVPQkpFQ1RfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9PVkVSfVxyXG4gKiAzLiBbUE9JTlRFUl9PVkVSXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX09WRVJ9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfT1ZFUlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoZSBwb2ludGVyIG1vdmVkIG92ZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkV2ZW50RGF0YX0gZXZlbnQgLSBUaGUgUGhhc2VyIGlucHV0IGV2ZW50LiBZb3UgY2FuIGNhbGwgYHN0b3BQcm9wYWdhdGlvbigpYCB0byBoYWx0IGl0IGZyb20gZ29pbmcgYW55IGZ1cnRoZXIgaW4gdGhlIGV2ZW50IGZsb3cuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdnYW1lb2JqZWN0b3Zlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBQb2ludGVyIERvd24gRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYW4gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgaWYgYSBwb2ludGVyIGlzIHByZXNzZWQgZG93biBvbiBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ3BvaW50ZXJkb3duJywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX0RPV059XHJcbiAqIDIuIFtHQU1FT0JKRUNUX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfRE9XTn1cclxuICogMy4gW1BPSU5URVJfRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9ET1dOfSBvciBbUE9JTlRFUl9ET1dOX09VVFNJREVde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfRE9XTl9PVVRTSURFfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfRE9XTlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jYWxYIC0gVGhlIHggY29vcmRpbmF0ZSB0aGF0IHRoZSBQb2ludGVyIGludGVyYWN0ZWQgd2l0aCB0aGlzIG9iamVjdCBvbiwgcmVsYXRpdmUgdG8gdGhlIEdhbWUgT2JqZWN0J3MgdG9wLWxlZnQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2NhbFkgLSBUaGUgeSBjb29yZGluYXRlIHRoYXQgdGhlIFBvaW50ZXIgaW50ZXJhY3RlZCB3aXRoIHRoaXMgb2JqZWN0IG9uLCByZWxhdGl2ZSB0byB0aGUgR2FtZSBPYmplY3QncyB0b3AtbGVmdCBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuRXZlbnREYXRhfSBldmVudCAtIFRoZSBQaGFzZXIgaW5wdXQgZXZlbnQuIFlvdSBjYW4gY2FsbCBgc3RvcFByb3BhZ2F0aW9uKClgIHRvIGhhbHQgaXQgZnJvbSBnb2luZyBhbnkgZnVydGhlciBpbiB0aGUgZXZlbnQgZmxvdy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BvaW50ZXJkb3duJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFBvaW50ZXIgTW92ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgaXMgbW92ZWQgd2hpbGUgb3ZlciBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ3BvaW50ZXJtb3ZlJywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfTU9WRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX01PVkV9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX01PVkVde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfTU9WRX1cclxuICogMy4gW1BPSU5URVJfTU9WRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9NT1ZFfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfTU9WRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jYWxYIC0gVGhlIHggY29vcmRpbmF0ZSB0aGF0IHRoZSBQb2ludGVyIGludGVyYWN0ZWQgd2l0aCB0aGlzIG9iamVjdCBvbiwgcmVsYXRpdmUgdG8gdGhlIEdhbWUgT2JqZWN0J3MgdG9wLWxlZnQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2NhbFkgLSBUaGUgeSBjb29yZGluYXRlIHRoYXQgdGhlIFBvaW50ZXIgaW50ZXJhY3RlZCB3aXRoIHRoaXMgb2JqZWN0IG9uLCByZWxhdGl2ZSB0byB0aGUgR2FtZSBPYmplY3QncyB0b3AtbGVmdCBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuRXZlbnREYXRhfSBldmVudCAtIFRoZSBQaGFzZXIgaW5wdXQgZXZlbnQuIFlvdSBjYW4gY2FsbCBgc3RvcFByb3BhZ2F0aW9uKClgIHRvIGhhbHQgaXQgZnJvbSBnb2luZyBhbnkgZnVydGhlciBpbiB0aGUgZXZlbnQgZmxvdy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BvaW50ZXJtb3ZlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFBvaW50ZXIgT3V0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0IGlmIGEgcG9pbnRlciBtb3ZlcyBvdXQgb2YgaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIGEgR2FtZSBPYmplY3QgdXNpbmc6IGBnYW1lT2JqZWN0Lm9uKCdwb2ludGVyb3V0JywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfT1VUXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfT1VUfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9PVVRde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfT1VUfVxyXG4gKiAzLiBbUE9JTlRFUl9PVVRde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfT1VUfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfT1VUXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkV2ZW50RGF0YX0gZXZlbnQgLSBUaGUgUGhhc2VyIGlucHV0IGV2ZW50LiBZb3UgY2FuIGNhbGwgYHN0b3BQcm9wYWdhdGlvbigpYCB0byBoYWx0IGl0IGZyb20gZ29pbmcgYW55IGZ1cnRoZXIgaW4gdGhlIGV2ZW50IGZsb3cuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwb2ludGVyb3V0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFBvaW50ZXIgT3ZlciBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdCBpZiBhIHBvaW50ZXIgbW92ZXMgb3ZlciBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ3BvaW50ZXJvdmVyJywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX09WRVJ9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX09WRVJde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfT1ZFUn1cclxuICogMy4gW1BPSU5URVJfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9PVkVSfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfT1ZFUlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBUaGUgUG9pbnRlciByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZyB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jYWxYIC0gVGhlIHggY29vcmRpbmF0ZSB0aGF0IHRoZSBQb2ludGVyIGludGVyYWN0ZWQgd2l0aCB0aGlzIG9iamVjdCBvbiwgcmVsYXRpdmUgdG8gdGhlIEdhbWUgT2JqZWN0J3MgdG9wLWxlZnQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2NhbFkgLSBUaGUgeSBjb29yZGluYXRlIHRoYXQgdGhlIFBvaW50ZXIgaW50ZXJhY3RlZCB3aXRoIHRoaXMgb2JqZWN0IG9uLCByZWxhdGl2ZSB0byB0aGUgR2FtZSBPYmplY3QncyB0b3AtbGVmdCBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuRXZlbnREYXRhfSBldmVudCAtIFRoZSBQaGFzZXIgaW5wdXQgZXZlbnQuIFlvdSBjYW4gY2FsbCBgc3RvcFByb3BhZ2F0aW9uKClgIHRvIGhhbHQgaXQgZnJvbSBnb2luZyBhbnkgZnVydGhlciBpbiB0aGUgZXZlbnQgZmxvdy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BvaW50ZXJvdmVyJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFBvaW50ZXIgVXAgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYW4gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgaWYgYSBwb2ludGVyIGlzIHJlbGVhc2VkIHdoaWxlIG92ZXIgaXQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIGEgR2FtZSBPYmplY3QgdXNpbmc6IGBnYW1lT2JqZWN0Lm9uKCdwb2ludGVydXAnLCBsaXN0ZW5lcilgLlxyXG4gKiBOb3RlIHRoYXQgdGhlIHNjb3BlIG9mIHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBiZSB0aGUgR2FtZSBPYmplY3QgaW5zdGFuY2UgaXRzZWxmLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3QgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9VUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX1VQfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9VUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9VUH1cclxuICogMy4gW1BPSU5URVJfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfVVB9IG9yIFtQT0lOVEVSX1VQX09VVFNJREVde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfVVBfT1VUU0lERX1cclxuICogXHJcbiAqIFdpdGggdGhlIHRvcCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZpcnN0IGFuZCB0aGVuIGZsb3dpbmcgZG93biB0aGUgbGlzdC4gTm90ZSB0aGF0IGhpZ2hlci11cCBldmVudCBoYW5kbGVycyBjYW4gc3RvcFxyXG4gKiB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9QT0lOVEVSX1VQXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2NhbFggLSBUaGUgeCBjb29yZGluYXRlIHRoYXQgdGhlIFBvaW50ZXIgaW50ZXJhY3RlZCB3aXRoIHRoaXMgb2JqZWN0IG9uLCByZWxhdGl2ZSB0byB0aGUgR2FtZSBPYmplY3QncyB0b3AtbGVmdCBwb3NpdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IGxvY2FsWSAtIFRoZSB5IGNvb3JkaW5hdGUgdGhhdCB0aGUgUG9pbnRlciBpbnRlcmFjdGVkIHdpdGggdGhpcyBvYmplY3Qgb24sIHJlbGF0aXZlIHRvIHRoZSBHYW1lIE9iamVjdCdzIHRvcC1sZWZ0IHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5FdmVudERhdGF9IGV2ZW50IC0gVGhlIFBoYXNlciBpbnB1dCBldmVudC4gWW91IGNhbiBjYWxsIGBzdG9wUHJvcGFnYXRpb24oKWAgdG8gaGFsdCBpdCBmcm9tIGdvaW5nIGFueSBmdXJ0aGVyIGluIHRoZSBldmVudCBmbG93LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9pbnRlcnVwJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFBvaW50ZXIgV2hlZWwgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYW4gaW50ZXJhY3RpdmUgR2FtZSBPYmplY3QgaWYgYSBwb2ludGVyIGhhcyBpdHMgd2hlZWwgbW92ZWQgd2hpbGUgb3ZlciBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzogYGdhbWVPYmplY3Qub24oJ3doZWVsJywgbGlzdGVuZXIpYC5cclxuICogTm90ZSB0aGF0IHRoZSBzY29wZSBvZiB0aGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYmUgdGhlIEdhbWUgT2JqZWN0IGluc3RhbmNlIGl0c2VsZi5cclxuICogXHJcbiAqIFRvIHJlY2VpdmUgdGhpcyBldmVudCwgdGhlIEdhbWUgT2JqZWN0IG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfV0hFRUxde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9XSEVFTH1cclxuICogMi4gW0dBTUVPQkpFQ1RfV0hFRUxde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfV0hFRUx9XHJcbiAqIDMuIFtQT0lOVEVSX1dIRUVMXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX1dIRUVMfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FT0JKRUNUX1BPSU5URVJfV0hFRUxcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVggLSBUaGUgaG9yaXpvbnRhbCBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGFZIC0gVGhlIHZlcnRpY2FsIHNjcm9sbCBhbW91bnQgdGhhdCBvY2N1cnJlZCBkdWUgdG8gdGhlIHVzZXIgbW92aW5nIGEgbW91c2Ugd2hlZWwgb3Igc2ltaWxhciBpbnB1dCBkZXZpY2UuIFRoaXMgdmFsdWUgd2lsbCB0eXBpY2FsbHkgYmUgbGVzcyB0aGFuIDAgaWYgdGhlIHVzZXIgc2Nyb2xscyB1cCBhbmQgZ3JlYXRlciB0aGFuIHplcm8gaWYgc2Nyb2xsaW5nIGRvd24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVogLSBUaGUgei1heGlzIHNjcm9sbCBhbW91bnQgdGhhdCBvY2N1cnJlZCBkdWUgdG8gdGhlIHVzZXIgbW92aW5nIGEgbW91c2Ugd2hlZWwgb3Igc2ltaWxhciBpbnB1dCBkZXZpY2UuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLklucHV0LkV2ZW50RGF0YX0gZXZlbnQgLSBUaGUgUGhhc2VyIGlucHV0IGV2ZW50LiBZb3UgY2FuIGNhbGwgYHN0b3BQcm9wYWdhdGlvbigpYCB0byBoYWx0IGl0IGZyb20gZ29pbmcgYW55IGZ1cnRoZXIgaW4gdGhlIGV2ZW50IGZsb3cuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd3aGVlbCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lIE9iamVjdCBVcCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBpcyByZWxlYXNlZCB3aGlsZSBvdmVyIF9hbnlfIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ2dhbWVvYmplY3R1cCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUbyByZWNlaXZlIHRoaXMgZXZlbnQsIHRoZSBHYW1lIE9iamVjdHMgbXVzdCBoYXZlIGJlZW4gc2V0IGFzIGludGVyYWN0aXZlLlxyXG4gKiBTZWUgW0dhbWVPYmplY3Quc2V0SW50ZXJhY3RpdmVde0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3NldEludGVyYWN0aXZlfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKiBcclxuICogVG8gbGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gYSBfc3BlY2lmaWNfIEdhbWUgT2JqZWN0LCB1c2UgdGhlIFtHQU1FT0JKRUNUX1BPSU5URVJfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9VUH0gZXZlbnQgaW5zdGVhZC5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9VUH1cclxuICogMi4gW0dBTUVPQkpFQ1RfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfVVB9XHJcbiAqIDMuIFtQT0lOVEVSX1VQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX1VQfSBvciBbUE9JTlRFUl9VUF9PVVRTSURFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX1VQX09VVFNJREV9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI0dBTUVPQkpFQ1RfVVBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGUgcG9pbnRlciB3YXMgb3ZlciB3aGVuIHJlbGVhc2VkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5FdmVudERhdGF9IGV2ZW50IC0gVGhlIFBoYXNlciBpbnB1dCBldmVudC4gWW91IGNhbiBjYWxsIGBzdG9wUHJvcGFnYXRpb24oKWAgdG8gaGFsdCBpdCBmcm9tIGdvaW5nIGFueSBmdXJ0aGVyIGluIHRoZSBldmVudCBmbG93LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZ2FtZW9iamVjdHVwJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWUgT2JqZWN0IFdoZWVsIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGhhcyBpdHMgd2hlZWwgbW92ZWQgd2hpbGUgb3ZlciBfYW55XyBpbnRlcmFjdGl2ZSBHYW1lIE9iamVjdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdnYW1lb2JqZWN0d2hlZWwnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVG8gcmVjZWl2ZSB0aGlzIGV2ZW50LCB0aGUgR2FtZSBPYmplY3RzIG11c3QgaGF2ZSBiZWVuIHNldCBhcyBpbnRlcmFjdGl2ZS5cclxuICogU2VlIFtHYW1lT2JqZWN0LnNldEludGVyYWN0aXZlXXtAbGluayBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCNzZXRJbnRlcmFjdGl2ZX0gZm9yIG1vcmUgZGV0YWlscy5cclxuICogXHJcbiAqIFRvIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGEgX3NwZWNpZmljXyBHYW1lIE9iamVjdCwgdXNlIHRoZSBbR0FNRU9CSkVDVF9QT0lOVEVSX1dIRUVMXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfV0hFRUx9IGV2ZW50IGluc3RlYWQuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbR0FNRU9CSkVDVF9QT0lOVEVSX1dIRUVMXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfV0hFRUx9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX1dIRUVMXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1dIRUVMfVxyXG4gKiAzLiBbUE9JTlRFUl9XSEVFTF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9XSEVFTH1cclxuICogXHJcbiAqIFdpdGggdGhlIHRvcCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZpcnN0IGFuZCB0aGVuIGZsb3dpbmcgZG93biB0aGUgbGlzdC4gTm90ZSB0aGF0IGhpZ2hlci11cCBldmVudCBoYW5kbGVycyBjYW4gc3RvcFxyXG4gKiB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRU9CSkVDVF9XSEVFTFxyXG4gKiBAc2luY2UgMy4xOC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGUgcG9pbnRlciB3YXMgb3ZlciB3aGVuIHRoZSB3aGVlbCBjaGFuZ2VkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGFYIC0gVGhlIGhvcml6b250YWwgc2Nyb2xsIGFtb3VudCB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgdXNlciBtb3ZpbmcgYSBtb3VzZSB3aGVlbCBvciBzaW1pbGFyIGlucHV0IGRldmljZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhWSAtIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLiBUaGlzIHZhbHVlIHdpbGwgdHlwaWNhbGx5IGJlIGxlc3MgdGhhbiAwIGlmIHRoZSB1c2VyIHNjcm9sbHMgdXAgYW5kIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHNjcm9sbGluZyBkb3duLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGFaIC0gVGhlIHotYXhpcyBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5FdmVudERhdGF9IGV2ZW50IC0gVGhlIFBoYXNlciBpbnB1dCBldmVudC4gWW91IGNhbiBjYWxsIGBzdG9wUHJvcGFnYXRpb24oKWAgdG8gaGFsdCBpdCBmcm9tIGdvaW5nIGFueSBmdXJ0aGVyIGluIHRoZSBldmVudCBmbG93LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZ2FtZW9iamVjdHdoZWVsJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIElucHV0IFBsdWdpbiBHYW1lIE91dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGlmIHRoZSBhY3RpdmUgcG9pbnRlciBsZWF2ZXMgdGhlIGdhbWUgY2FudmFzIGFuZCBpcyBub3dcclxuICogb3V0c2lkZSBvZiBpdCwgZWxzZXdoZXJlIG9uIHRoZSB3ZWIgcGFnZS5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdnYW1lb3V0JywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjR0FNRV9PVVRcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lLiBFaXRoZXIgYSBIaWdoIFJlc29sdXRpb24gVGltZXIgdmFsdWUgaWYgaXQgY29tZXMgZnJvbSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgRGF0ZS5ub3cgaWYgdXNpbmcgU2V0VGltZW91dC5cclxuICogQHBhcmFtIHsoTW91c2VFdmVudHxUb3VjaEV2ZW50KX0gZXZlbnQgLSBUaGUgRE9NIEV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjYW52YXMgb3V0LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZ2FtZW91dCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBJbnB1dCBQbHVnaW4gR2FtZSBPdmVyIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gaWYgdGhlIGFjdGl2ZSBwb2ludGVyIGVudGVycyB0aGUgZ2FtZSBjYW52YXMgYW5kIGlzIG5vd1xyXG4gKiBvdmVyIG9mIGl0LCBoYXZpbmcgcHJldmlvdXNseSBiZWVuIGVsc2V3aGVyZSBvbiB0aGUgd2ViIHBhZ2UuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignZ2FtZW92ZXInLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNHQU1FX09WRVJcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lLiBFaXRoZXIgYSBIaWdoIFJlc29sdXRpb24gVGltZXIgdmFsdWUgaWYgaXQgY29tZXMgZnJvbSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgRGF0ZS5ub3cgaWYgdXNpbmcgU2V0VGltZW91dC5cclxuICogQHBhcmFtIHsoTW91c2VFdmVudHxUb3VjaEV2ZW50KX0gZXZlbnQgLSBUaGUgRE9NIEV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjYW52YXMgb3Zlci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2dhbWVvdmVyJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIElucHV0IE1hbmFnZXIgQm9vdCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgaW50ZXJuYWwgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgTWFuYWdlciB3aGVuIGl0IGJvb3RzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNNQU5BR0VSX0JPT1RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdib290JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIElucHV0IE1hbmFnZXIgUHJvY2VzcyBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgaW50ZXJuYWwgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgTWFuYWdlciB3aGVuIG5vdCB1c2luZyB0aGUgbGVnYWN5IHF1ZXVlIHN5c3RlbSxcclxuICogYW5kIGl0IHdhbnRzIHRoZSBJbnB1dCBQbHVnaW5zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNNQU5BR0VSX1BST0NFU1NcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncHJvY2Vzcyc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBJbnB1dCBNYW5hZ2VyIFVwZGF0ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgaW50ZXJuYWwgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgTWFuYWdlciBhcyBwYXJ0IG9mIGl0cyB1cGRhdGUgc3RlcC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjTUFOQUdFUl9VUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd1cGRhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgSW5wdXQgTWFuYWdlciBQb2ludGVyIExvY2sgQ2hhbmdlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBNYW5hZ2VyIHdoZW4gaXQgaXMgcHJvY2Vzc2luZyBhIG5hdGl2ZSBQb2ludGVyIExvY2sgQ2hhbmdlIERPTSBFdmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjUE9JTlRFUkxPQ0tfQ0hBTkdFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBFdmVudC5cclxuICogQHBhcmFtIHtib29sZWFufSBsb2NrZWQgLSBUaGUgbG9ja2VkIHN0YXRlIG9mIHRoZSBNb3VzZSBQb2ludGVyLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9pbnRlcmxvY2tjaGFuZ2UnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBEb3duIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGlzIHByZXNzZWQgZG93biBhbnl3aGVyZS5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdwb2ludGVyZG93bicsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbR0FNRU9CSkVDVF9QT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9ET1dOXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RPV059XHJcbiAqIDMuIFtQT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfRE9XTn0gb3IgW1BPSU5URVJfRE9XTl9PVVRTSURFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX0RPV05fT1VUU0lERX1cclxuICogXHJcbiAqIFdpdGggdGhlIHRvcCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZpcnN0IGFuZCB0aGVuIGZsb3dpbmcgZG93biB0aGUgbGlzdC4gTm90ZSB0aGF0IGhpZ2hlci11cCBldmVudCBoYW5kbGVycyBjYW4gc3RvcFxyXG4gKiB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjUE9JTlRFUl9ET1dOXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gY3VycmVudGx5T3ZlciAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cyB0aGF0IHRoZSBwb2ludGVyIHdhcyBvdmVyIHdoZW4gdGhlIGV2ZW50IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9pbnRlcmRvd24nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBEb3duIE91dHNpZGUgSW5wdXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIElucHV0IFBsdWdpbiBiZWxvbmdpbmcgdG8gYSBTY2VuZSBpZiBhIHBvaW50ZXIgaXMgcHJlc3NlZCBkb3duIGFueXdoZXJlIG91dHNpZGUgb2YgdGhlIGdhbWUgY2FudmFzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ3BvaW50ZXJkb3dub3V0c2lkZScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbR0FNRU9CSkVDVF9QT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9ET1dOfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9ET1dOXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX0RPV059XHJcbiAqIDMuIFtQT0lOVEVSX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfRE9XTn0gb3IgW1BPSU5URVJfRE9XTl9PVVRTSURFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX0RPV05fT1VUU0lERX1cclxuICogXHJcbiAqIFdpdGggdGhlIHRvcCBldmVudCBiZWluZyBkaXNwYXRjaGVkIGZpcnN0IGFuZCB0aGVuIGZsb3dpbmcgZG93biB0aGUgbGlzdC4gTm90ZSB0aGF0IGhpZ2hlci11cCBldmVudCBoYW5kbGVycyBjYW4gc3RvcFxyXG4gKiB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjUE9JTlRFUl9ET1dOX09VVFNJREVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwb2ludGVyZG93bm91dHNpZGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBNb3ZlIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGlzIG1vdmVkIGFueXdoZXJlLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ3BvaW50ZXJtb3ZlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfTU9WRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX01PVkV9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX01PVkVde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfTU9WRX1cclxuICogMy4gW1BPSU5URVJfTU9WRV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9NT1ZFfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSX01PVkVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBjdXJyZW50bHlPdmVyIC0gQW4gYXJyYXkgY29udGFpbmluZyBhbGwgaW50ZXJhY3RpdmUgR2FtZSBPYmplY3RzIHRoYXQgdGhlIHBvaW50ZXIgd2FzIG92ZXIgd2hlbiB0aGUgZXZlbnQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwb2ludGVybW92ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQb2ludGVyIE91dCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBtb3ZlcyBvdXQgb2YgYW55IGludGVyYWN0aXZlIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ3BvaW50ZXJvdXQnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9PVVRde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9PVVR9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX09VVF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9PVVR9XHJcbiAqIDMuIFtQT0lOVEVSX09VVF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9PVVR9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfT1VUXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0ganVzdE91dCAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cyB0aGF0IHRoZSBwb2ludGVyIG1vdmVkIG91dCBvZiB3aGVuIHRoZSBldmVudCB3YXMgY3JlYXRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BvaW50ZXJvdXQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBPdmVyIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIG1vdmVzIG92ZXIgYW55IGludGVyYWN0aXZlIEdhbWUgT2JqZWN0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ3BvaW50ZXJvdmVyJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX09WRVJ9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX09WRVJde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfT1ZFUn1cclxuICogMy4gW1BPSU5URVJfT1ZFUl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9PVkVSfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSX09WRVJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBqdXN0T3ZlciAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cyB0aGF0IHRoZSBwb2ludGVyIG1vdmVkIG92ZXIgd2hlbiB0aGUgZXZlbnQgd2FzIGNyZWF0ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwb2ludGVyb3Zlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQb2ludGVyIFVwIElucHV0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYmVsb25naW5nIHRvIGEgU2NlbmUgaWYgYSBwb2ludGVyIGlzIHJlbGVhc2VkIGFueXdoZXJlLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQub24oJ3BvaW50ZXJ1cCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbR0FNRU9CSkVDVF9QT0lOVEVSX1VQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1BPSU5URVJfVVB9XHJcbiAqIDIuIFtHQU1FT0JKRUNUX1VQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpHQU1FT0JKRUNUX1VQfVxyXG4gKiAzLiBbUE9JTlRFUl9VUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9VUH0gb3IgW1BPSU5URVJfVVBfT1VUU0lERV17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6UE9JTlRFUl9VUF9PVVRTSURFfVxyXG4gKiBcclxuICogV2l0aCB0aGUgdG9wIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQgZmlyc3QgYW5kIHRoZW4gZmxvd2luZyBkb3duIHRoZSBsaXN0LiBOb3RlIHRoYXQgaGlnaGVyLXVwIGV2ZW50IGhhbmRsZXJzIGNhbiBzdG9wXHJcbiAqIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGlzIGV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNQT0lOVEVSX1VQXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gY3VycmVudGx5T3ZlciAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cyB0aGF0IHRoZSBwb2ludGVyIHdhcyBvdmVyIHdoZW4gdGhlIGV2ZW50IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9pbnRlcnVwJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFBvaW50ZXIgVXAgT3V0c2lkZSBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBpcyByZWxlYXNlZCBhbnl3aGVyZSBvdXRzaWRlIG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0Lm9uKCdwb2ludGVydXBvdXRzaWRlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoZSBldmVudCBoaWVyYXJjaHkgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtHQU1FT0JKRUNUX1BPSU5URVJfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfUE9JTlRFUl9VUH1cclxuICogMi4gW0dBTUVPQkpFQ1RfVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OkdBTUVPQkpFQ1RfVVB9XHJcbiAqIDMuIFtQT0lOVEVSX1VQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX1VQfSBvciBbUE9JTlRFUl9VUF9PVVRTSURFXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkV2ZW50cyNldmVudDpQT0lOVEVSX1VQX09VVFNJREV9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfVVBfT1VUU0lERVxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5Qb2ludGVyfSBwb2ludGVyIC0gVGhlIFBvaW50ZXIgcmVzcG9uc2libGUgZm9yIHRyaWdnZXJpbmcgdGhpcyBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BvaW50ZXJ1cG91dHNpZGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUG9pbnRlciBXaGVlbCBJbnB1dCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgSW5wdXQgUGx1Z2luIGJlbG9uZ2luZyB0byBhIFNjZW5lIGlmIGEgcG9pbnRlciBoYXMgaXRzIHdoZWVsIHVwZGF0ZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5vbignd2hlZWwnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW0dBTUVPQkpFQ1RfUE9JTlRFUl9XSEVFTF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9QT0lOVEVSX1dIRUVMfVxyXG4gKiAyLiBbR0FNRU9CSkVDVF9XSEVFTF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5FdmVudHMjZXZlbnQ6R0FNRU9CSkVDVF9XSEVFTH1cclxuICogMy4gW1BPSU5URVJfV0hFRUxde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuRXZlbnRzI2V2ZW50OlBPSU5URVJfV0hFRUx9XHJcbiAqIFxyXG4gKiBXaXRoIHRoZSB0b3AgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZCBmaXJzdCBhbmQgdGhlbiBmbG93aW5nIGRvd24gdGhlIGxpc3QuIE5vdGUgdGhhdCBoaWdoZXItdXAgZXZlbnQgaGFuZGxlcnMgY2FuIHN0b3BcclxuICogdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI1BPSU5URVJfV0hFRUxcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuUG9pbnRlcn0gcG9pbnRlciAtIFRoZSBQb2ludGVyIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gY3VycmVudGx5T3ZlciAtIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGludGVyYWN0aXZlIEdhbWUgT2JqZWN0cyB0aGF0IHRoZSBwb2ludGVyIHdhcyBvdmVyIHdoZW4gdGhlIGV2ZW50IHdhcyBjcmVhdGVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGFYIC0gVGhlIGhvcml6b250YWwgc2Nyb2xsIGFtb3VudCB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgdXNlciBtb3ZpbmcgYSBtb3VzZSB3aGVlbCBvciBzaW1pbGFyIGlucHV0IGRldmljZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhWSAtIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLiBUaGlzIHZhbHVlIHdpbGwgdHlwaWNhbGx5IGJlIGxlc3MgdGhhbiAwIGlmIHRoZSB1c2VyIHNjcm9sbHMgdXAgYW5kIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHNjcm9sbGluZyBkb3duLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGFaIC0gVGhlIHotYXhpcyBzY3JvbGwgYW1vdW50IHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSB1c2VyIG1vdmluZyBhIG1vdXNlIHdoZWVsIG9yIHNpbWlsYXIgaW5wdXQgZGV2aWNlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnd2hlZWwnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgSW5wdXQgUGx1Z2luIFByZS1VcGRhdGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGludGVybmFsIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIElucHV0IFBsdWdpbiBhdCB0aGUgc3RhcnQgb2YgaXRzIGBwcmVVcGRhdGVgIG1ldGhvZC5cclxuICogVGhpcyBob29rIGlzIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgaW5wdXQgcGx1Z2lucywgYnV0IGNhbiBhbHNvIGJlIGxpc3RlbmVkIHRvIGZyb20gdXNlci1sYW5kIGNvZGUuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuRXZlbnRzI1BSRV9VUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwcmV1cGRhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgSW5wdXQgUGx1Z2luIFNodXRkb3duIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBpbnRlcm5hbCBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gd2hlbiBpdCBzaHV0cyBkb3duLCBzaWduYWxsaW5nIHRvIGFsbCBvZiBpdHMgc3lzdGVtcyB0byBzaHV0IHRoZW1zZWx2ZXMgZG93bi5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjU0hVVERPV05cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzaHV0ZG93bic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBJbnB1dCBQbHVnaW4gU3RhcnQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGludGVybmFsIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIElucHV0IFBsdWdpbiB3aGVuIGl0IGhhcyBmaW5pc2hlZCBzZXR0aW5nLXVwLFxyXG4gKiBzaWduYWxsaW5nIHRvIGFsbCBvZiBpdHMgaW50ZXJuYWwgc3lzdGVtcyB0byBzdGFydC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5FdmVudHMjU1RBUlRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBJbnB1dCBQbHVnaW4gVXBkYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBpbnRlcm5hbCBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4gYXQgdGhlIHN0YXJ0IG9mIGl0cyBgdXBkYXRlYCBtZXRob2QuXHJcbiAqIFRoaXMgaG9vayBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIGlucHV0IHBsdWdpbnMsIGJ1dCBjYW4gYWxzbyBiZSBsaXN0ZW5lZCB0byBmcm9tIHVzZXItbGFuZCBjb2RlLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkV2ZW50cyNVUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndXBkYXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuSW5wdXQuRXZlbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQk9PVDogcmVxdWlyZSgnLi9CT09UX0VWRU5UJyksXHJcbiAgICBERVNUUk9ZOiByZXF1aXJlKCcuL0RFU1RST1lfRVZFTlQnKSxcclxuICAgIERSQUdfRU5EOiByZXF1aXJlKCcuL0RSQUdfRU5EX0VWRU5UJyksXHJcbiAgICBEUkFHX0VOVEVSOiByZXF1aXJlKCcuL0RSQUdfRU5URVJfRVZFTlQnKSxcclxuICAgIERSQUc6IHJlcXVpcmUoJy4vRFJBR19FVkVOVCcpLFxyXG4gICAgRFJBR19MRUFWRTogcmVxdWlyZSgnLi9EUkFHX0xFQVZFX0VWRU5UJyksXHJcbiAgICBEUkFHX09WRVI6IHJlcXVpcmUoJy4vRFJBR19PVkVSX0VWRU5UJyksXHJcbiAgICBEUkFHX1NUQVJUOiByZXF1aXJlKCcuL0RSQUdfU1RBUlRfRVZFTlQnKSxcclxuICAgIERST1A6IHJlcXVpcmUoJy4vRFJPUF9FVkVOVCcpLFxyXG4gICAgR0FNRV9PVVQ6IHJlcXVpcmUoJy4vR0FNRV9PVVRfRVZFTlQnKSxcclxuICAgIEdBTUVfT1ZFUjogcmVxdWlyZSgnLi9HQU1FX09WRVJfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfRE9XTjogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX0RPV05fRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfRFJBR19FTkQ6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9EUkFHX0VORF9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9EUkFHX0VOVEVSOiByZXF1aXJlKCcuL0dBTUVPQkpFQ1RfRFJBR19FTlRFUl9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9EUkFHOiByZXF1aXJlKCcuL0dBTUVPQkpFQ1RfRFJBR19FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9EUkFHX0xFQVZFOiByZXF1aXJlKCcuL0dBTUVPQkpFQ1RfRFJBR19MRUFWRV9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9EUkFHX09WRVI6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9EUkFHX09WRVJfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfRFJBR19TVEFSVDogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX0RSQUdfU1RBUlRfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfRFJPUDogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX0RST1BfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfTU9WRTogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX01PVkVfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfT1VUOiByZXF1aXJlKCcuL0dBTUVPQkpFQ1RfT1VUX0VWRU5UJyksXHJcbiAgICBHQU1FT0JKRUNUX09WRVI6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9PVkVSX0VWRU5UJyksXHJcbiAgICBHQU1FT0JKRUNUX1BPSU5URVJfRE9XTjogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX1BPSU5URVJfRE9XTl9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9QT0lOVEVSX01PVkU6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9QT0lOVEVSX01PVkVfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfUE9JTlRFUl9PVVQ6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9QT0lOVEVSX09VVF9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9QT0lOVEVSX09WRVI6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9QT0lOVEVSX09WRVJfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfUE9JTlRFUl9VUDogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX1BPSU5URVJfVVBfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfUE9JTlRFUl9XSEVFTDogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX1BPSU5URVJfV0hFRUxfRVZFTlQnKSxcclxuICAgIEdBTUVPQkpFQ1RfVVA6IHJlcXVpcmUoJy4vR0FNRU9CSkVDVF9VUF9FVkVOVCcpLFxyXG4gICAgR0FNRU9CSkVDVF9XSEVFTDogcmVxdWlyZSgnLi9HQU1FT0JKRUNUX1dIRUVMX0VWRU5UJyksXHJcbiAgICBNQU5BR0VSX0JPT1Q6IHJlcXVpcmUoJy4vTUFOQUdFUl9CT09UX0VWRU5UJyksXHJcbiAgICBNQU5BR0VSX1BST0NFU1M6IHJlcXVpcmUoJy4vTUFOQUdFUl9QUk9DRVNTX0VWRU5UJyksXHJcbiAgICBNQU5BR0VSX1VQREFURTogcmVxdWlyZSgnLi9NQU5BR0VSX1VQREFURV9FVkVOVCcpLFxyXG4gICAgUE9JTlRFUl9ET1dOOiByZXF1aXJlKCcuL1BPSU5URVJfRE9XTl9FVkVOVCcpLFxyXG4gICAgUE9JTlRFUl9ET1dOX09VVFNJREU6IHJlcXVpcmUoJy4vUE9JTlRFUl9ET1dOX09VVFNJREVfRVZFTlQnKSxcclxuICAgIFBPSU5URVJfTU9WRTogcmVxdWlyZSgnLi9QT0lOVEVSX01PVkVfRVZFTlQnKSxcclxuICAgIFBPSU5URVJfT1VUOiByZXF1aXJlKCcuL1BPSU5URVJfT1VUX0VWRU5UJyksXHJcbiAgICBQT0lOVEVSX09WRVI6IHJlcXVpcmUoJy4vUE9JTlRFUl9PVkVSX0VWRU5UJyksXHJcbiAgICBQT0lOVEVSX1VQOiByZXF1aXJlKCcuL1BPSU5URVJfVVBfRVZFTlQnKSxcclxuICAgIFBPSU5URVJfVVBfT1VUU0lERTogcmVxdWlyZSgnLi9QT0lOVEVSX1VQX09VVFNJREVfRVZFTlQnKSxcclxuICAgIFBPSU5URVJfV0hFRUw6IHJlcXVpcmUoJy4vUE9JTlRFUl9XSEVFTF9FVkVOVCcpLFxyXG4gICAgUE9JTlRFUkxPQ0tfQ0hBTkdFOiByZXF1aXJlKCcuL1BPSU5URVJMT0NLX0NIQU5HRV9FVkVOVCcpLFxyXG4gICAgUFJFX1VQREFURTogcmVxdWlyZSgnLi9QUkVfVVBEQVRFX0VWRU5UJyksXHJcbiAgICBTSFVURE9XTjogcmVxdWlyZSgnLi9TSFVURE9XTl9FVkVOVCcpLFxyXG4gICAgU1RBUlQ6IHJlcXVpcmUoJy4vU1RBUlRfRVZFTlQnKSxcclxuICAgIFVQREFURTogcmVxdWlyZSgnLi9VUERBVEVfRVZFTlQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBHYW1lcGFkIEF4aXMuXHJcbiAqIEF4aXMgb2JqZWN0cyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBHYW1lcGFkIGFzIHRoZXkgYXJlIG5lZWRlZC5cclxuICpcclxuICogQGNsYXNzIEF4aXNcclxuICogQG1lbWJlcm9mIFBoYXNlci5JbnB1dC5HYW1lcGFkXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkfSBwYWQgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZXBhZCB0aGF0IHRoaXMgQXhpcyBiZWxvbmdzIHRvLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoaXMgQXhpcy5cclxuICovXHJcbnZhciBBeGlzID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEF4aXMgKHBhZCwgaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEdhbWVwYWQgdGhhdCB0aGlzIEF4aXMgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkF4aXMjcGFkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYWQgPSBwYWQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGVtaXR0ZXIgdG8gdXNlIHRvIGVtaXQgdGhlIGF4aXMgZXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuQXhpcyNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBwYWQuZXZlbnRzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhpcyBBeGlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuQXhpcyNpbmRleFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJhdyBheGlzIHZhbHVlLCBiZXR3ZWVuIC0xIGFuZCAxIHdpdGggMCBiZWluZyBkZWFkIGNlbnRlci5cclxuICAgICAgICAgKiBVc2UgdGhlIG1ldGhvZCBgZ2V0VmFsdWVgIHRvIGdldCBhIG5vcm1hbGl6ZWQgdmFsdWUgd2l0aCB0aGUgdGhyZXNob2xkIGFwcGxpZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5BeGlzI3ZhbHVlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vdmVtZW50IHRvbGVyYW5jZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYXhpcyB2YWx1ZXMgYXJlIGlnbm9yZWQgaW4gYGdldFZhbHVlYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkF4aXMjdGhyZXNob2xkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwLjFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IDAuMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCB1cGRhdGUgaGFuZGxlciBmb3IgdGhpcyBBeGlzLlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEdhbWVwYWQgYXMgcGFydCBvZiBpdHMgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuQXhpcyN1cGRhdGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGF4aXMgbW92ZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBgdGhyZXNob2xkYCB2YWx1ZSB0byB0aGUgYXhpcyBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkF4aXMjZ2V0VmFsdWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGF4aXMgdmFsdWUsIGFkanVzdGVkIGZvciB0aGUgbW92ZW1lbnQgdGhyZXNob2xkLlxyXG4gICAgICovXHJcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKE1hdGguYWJzKHRoaXMudmFsdWUpIDwgdGhpcy50aHJlc2hvbGQpID8gMCA6IHRoaXMudmFsdWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBBeGlzIGluc3RhbmNlIGFuZCByZWxlYXNlcyBleHRlcm5hbCByZWZlcmVuY2VzIGl0IGhvbGRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuQXhpcyNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBeGlzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBidXR0b24gb24gYSBHYW1lcGFkLlxyXG4gKiBCdXR0b24gb2JqZWN0cyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBHYW1lcGFkIGFzIHRoZXkgYXJlIG5lZWRlZC5cclxuICpcclxuICogQGNsYXNzIEJ1dHRvblxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLklucHV0LkdhbWVwYWRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9IHBhZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lcGFkIHRoYXQgdGhpcyBCdXR0b24gYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGlzIEJ1dHRvbi5cclxuICovXHJcbnZhciBCdXR0b24gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQnV0dG9uIChwYWQsIGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lcGFkIHRoYXQgdGhpcyBCdXR0b24gYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbiNwYWRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhZCA9IHBhZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgZW1pdHRlciB0byB1c2UgdG8gZW1pdCB0aGUgYnV0dG9uIGV2ZW50cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbiNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBwYWQubWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGluZGV4IG9mIHRoaXMgQnV0dG9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9uI2luZGV4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b24jdmFsdWVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZhbHVlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FuIGJlIHNldCBmb3IgYW5hbG9ndWUgYnV0dG9ucyB0byBlbmFibGUgYSAncHJlc3N1cmUnIHRocmVzaG9sZCxcclxuICAgICAgICAgKiBiZWZvcmUgYSBidXR0b24gaXMgY29uc2lkZXJlZCBhcyBiZWluZyAncHJlc3NlZCcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b24jdGhyZXNob2xkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aHJlc2hvbGQgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGUgQnV0dG9uIGJlaW5nIHByZXNzZWQgZG93biBvciBub3Q/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b24jcHJlc3NlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcmVzc2VkID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgdXBkYXRlIGhhbmRsZXIgZm9yIHRoaXMgQnV0dG9uLlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEdhbWVwYWQgYXMgcGFydCBvZiBpdHMgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9uI3VwZGF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNCVVRUT05fRE9XTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNCVVRUT05fVVBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHMjR0FNRVBBRF9CVVRUT05fRE9XTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNHQU1FUEFEX0JVVFRPTl9VUFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uLiBCZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgdmFyIHBhZCA9IHRoaXMucGFkO1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA+PSB0aGlzLnRocmVzaG9sZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVzc2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXNzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuQlVUVE9OX0RPV04sIHBhZCwgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWQuZW1pdChFdmVudHMuR0FNRVBBRF9CVVRUT05fRE9XTiwgaW5kZXgsIHZhbHVlLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnByZXNzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnByZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuQlVUVE9OX1VQLCBwYWQsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5wYWQuZW1pdChFdmVudHMuR0FNRVBBRF9CVVRUT05fVVAsIGluZGV4LCB2YWx1ZSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgQnV0dG9uIGluc3RhbmNlIGFuZCByZWxlYXNlcyBleHRlcm5hbCByZWZlcmVuY2VzIGl0IGhvbGRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9uI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBhZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5ldmVudHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJ1dHRvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXhpcyA9IHJlcXVpcmUoJy4vQXhpcycpO1xyXG52YXIgQnV0dG9uID0gcmVxdWlyZSgnLi9CdXR0b24nKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIEdhbWVwYWQuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkLCB1cGRhdGVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBHYW1lcGFkIFBsdWdpbi5cclxuICpcclxuICogQGNsYXNzIEdhbWVwYWRcclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5JbnB1dC5HYW1lcGFkXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2lufSBtYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIEdhbWVwYWQgUGx1Z2luLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5HYW1lcGFkLlBhZH0gcGFkIC0gVGhlIEdhbWVwYWQgb2JqZWN0LCBhcyBleHRyYWN0ZWQgZnJvbSBHYW1lcGFkRXZlbnQuXHJcbiAqL1xyXG52YXIgR2FtZXBhZCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gR2FtZXBhZCAobWFuYWdlciwgcGFkKVxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZXBhZCBQbHVnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI21hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmF0aXZlIEdhbWVwYWQgb2JqZWN0IHRoYXQgaXMgY29ubmVjdGVkIHRvIHRoZSBicm93c2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNwYWRcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhZCA9IHBhZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzdHJpbmcgY29udGFpbmluZyBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cm9sbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBpcyBub3Qgc3RyaWN0bHkgc3BlY2lmaWVkLCBidXQgaW4gRmlyZWZveCBpdCB3aWxsIGNvbnRhaW4gdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uXHJcbiAgICAgICAgICogc2VwYXJhdGVkIGJ5IGRhc2hlcyAoLSk6IHR3byA0LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZ3MgY29udGFpbmluZyB0aGUgVVNCIHZlbmRvciBhbmRcclxuICAgICAgICAgKiBwcm9kdWN0IGlkIG9mIHRoZSBjb250cm9sbGVyLCBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgYXMgcHJvdmlkZWQgYnkgdGhlIGRyaXZlci5cclxuICAgICAgICAgKiBJbiBDaHJvbWUgaXQgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGVyIGFzIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIsXHJcbiAgICAgICAgICogZm9sbG93ZWQgYnkgdmVuZG9yIGFuZCBwcm9kdWN0IDQtZGlnaXQgaGV4YWRlY2ltYWwgc3RyaW5ncy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjaWRcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaWQgPSBwYWQuaWQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGludGVnZXIgdGhhdCBpcyB1bmlxdWUgZm9yIGVhY2ggR2FtZXBhZCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBzeXN0ZW0uXHJcbiAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBtdWx0aXBsZSBjb250cm9sbGVycy5cclxuICAgICAgICAgKiBOb3RlIHRoYXQgZGlzY29ubmVjdGluZyBhIGRldmljZSBhbmQgdGhlbiBjb25uZWN0aW5nIGEgbmV3IGRldmljZSBtYXkgcmV1c2UgdGhlIHByZXZpb3VzIGluZGV4LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNpbmRleFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbmRleCA9IHBhZC5pbmRleDtcclxuXHJcbiAgICAgICAgdmFyIGJ1dHRvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWQuYnV0dG9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1dHRvbnMucHVzaChuZXcgQnV0dG9uKHRoaXMsIGkpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIEdhbWVwYWQgQnV0dG9uIG9iamVjdHMsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpZmZlcmVudCBidXR0b25zIGF2YWlsYWJsZSBvbiB0aGUgR2FtZXBhZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjYnV0dG9uc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b25bXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJ1dHRvbnMgPSBidXR0b25zO1xyXG5cclxuICAgICAgICB2YXIgYXhlcyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFkLmF4ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBheGVzLnB1c2gobmV3IEF4aXModGhpcywgaSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgR2FtZXBhZCBBeGlzIG9iamVjdHMsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpZmZlcmVudCBheGVzIGF2YWlsYWJsZSBvbiB0aGUgR2FtZXBhZCwgaWYgYW55LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNheGVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkF4aXNbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF4ZXMgPSBheGVzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgR2FtZXBhZCdzIEhhcHRpYyBBY3R1YXRvciAoVmlicmF0aW9uIC8gUnVtYmxlIHN1cHBvcnQpLlxyXG4gICAgICAgICAqIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgb25seSBzZXQgaWYgYm90aCBwcmVzZW50IG9uIHRoZSBkZXZpY2UsXHJcbiAgICAgICAgICogYW5kIGV4cG9zZWQgYnkgYm90aCB0aGUgaGFyZHdhcmUgYW5kIGJyb3dzZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI3ZpYnJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtHYW1lcGFkSGFwdGljQWN0dWF0b3J9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlicmF0aW9uID0gcGFkLnZpYnJhdGlvbkFjdHVhdG9yO1xyXG5cclxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vZ2FtZXBhZC8jcmVtYXBwaW5nXHJcblxyXG4gICAgICAgIHZhciBfbm9CdXR0b24gPSB7IHZhbHVlOiAwLCBwcmVzc2VkOiBmYWxzZSB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTGVmdCBCdXR0b24gaW4gdGhlIExlZnQgQ2x1c3Rlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjX0xDTGVmdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fTENMZWZ0ID0gKGJ1dHRvbnNbMTRdKSA/IGJ1dHRvbnNbMTRdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgUmlnaHQgQnV0dG9uIGluIHRoZSBMZWZ0IENsdXN0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI19MQ1JpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9MQ1JpZ2h0ID0gKGJ1dHRvbnNbMTVdKSA/IGJ1dHRvbnNbMTVdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVG9wIEJ1dHRvbiBpbiB0aGUgTGVmdCBDbHVzdGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfTENUb3BcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9ufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX0xDVG9wID0gKGJ1dHRvbnNbMTJdKSA/IGJ1dHRvbnNbMTJdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQm90dG9tIEJ1dHRvbiBpbiB0aGUgTGVmdCBDbHVzdGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfTENCb3R0b21cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9ufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX0xDQm90dG9tID0gKGJ1dHRvbnNbMTNdKSA/IGJ1dHRvbnNbMTNdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTGVmdCBCdXR0b24gaW4gdGhlIFJpZ2h0IENsdXN0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI19SQ0xlZnRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9ufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX1JDTGVmdCA9IChidXR0b25zWzJdKSA/IGJ1dHRvbnNbMl0gOiBfbm9CdXR0b247XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBSaWdodCBCdXR0b24gaW4gdGhlIFJpZ2h0IENsdXN0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI19SQ1JpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9SQ1JpZ2h0ID0gKGJ1dHRvbnNbMV0pID8gYnV0dG9uc1sxXSA6IF9ub0J1dHRvbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFRvcCBCdXR0b24gaW4gdGhlIFJpZ2h0IENsdXN0ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI19SQ1RvcFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fUkNUb3AgPSAoYnV0dG9uc1szXSkgPyBidXR0b25zWzNdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQm90dG9tIEJ1dHRvbiBpbiB0aGUgUmlnaHQgQ2x1c3Rlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjX1JDQm90dG9tXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9SQ0JvdHRvbSA9IChidXR0b25zWzBdKSA/IGJ1dHRvbnNbMF0gOiBfbm9CdXR0b247XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUb3AgTGVmdCBGcm9udCBCdXR0b24gKEwxIFNob3VsZGVyIEJ1dHRvbilcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjX0ZCTGVmdFRvcFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fRkJMZWZ0VG9wID0gKGJ1dHRvbnNbNF0pID8gYnV0dG9uc1s0XSA6IF9ub0J1dHRvbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEJvdHRvbSBMZWZ0IEZyb250IEJ1dHRvbiAoTDIgU2hvdWxkZXIgQnV0dG9uKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfRkJMZWZ0Qm90dG9tXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9GQkxlZnRCb3R0b20gPSAoYnV0dG9uc1s2XSkgPyBidXR0b25zWzZdIDogX25vQnV0dG9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVG9wIFJpZ2h0IEZyb250IEJ1dHRvbiAoUjEgU2hvdWxkZXIgQnV0dG9uKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfRkJSaWdodFRvcFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fRkJSaWdodFRvcCA9IChidXR0b25zWzVdKSA/IGJ1dHRvbnNbNV0gOiBfbm9CdXR0b247XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBCb3R0b20gUmlnaHQgRnJvbnQgQnV0dG9uIChSMiBTaG91bGRlciBCdXR0b24pXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI19GQlJpZ2h0Qm90dG9tXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9GQlJpZ2h0Qm90dG9tID0gKGJ1dHRvbnNbN10pID8gYnV0dG9uc1s3XSA6IF9ub0J1dHRvbjtcclxuXHJcbiAgICAgICAgdmFyIF9ub0F4aXMgPSB7IHZhbHVlOiAwIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBIb3Jpem9udGFsIEF4aXMgZm9yIHRoZSBMZWZ0IFN0aWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfSEF4aXNMZWZ0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9IQXhpc0xlZnQgPSAoYXhlc1swXSkgPyBheGVzWzBdIDogX25vQXhpcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFZlcnRpY2FsIEF4aXMgZm9yIHRoZSBMZWZ0IFN0aWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfVkF4aXNMZWZ0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9WQXhpc0xlZnQgPSAoYXhlc1sxXSkgPyBheGVzWzFdIDogX25vQXhpcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEhvcml6b250YWwgQXhpcyBmb3IgdGhlIFJpZ2h0IFN0aWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfSEF4aXNSaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fSEF4aXNSaWdodCA9IChheGVzWzJdKSA/IGF4ZXNbMl0gOiBfbm9BeGlzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVmVydGljYWwgQXhpcyBmb3IgdGhlIFJpZ2h0IFN0aWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNfVkF4aXNSaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fVkF4aXNSaWdodCA9IChheGVzWzNdKSA/IGF4ZXNbM10gOiBfbm9BeGlzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIFZlY3RvcjIgY29udGFpbmluZyB0aGUgbW9zdCByZWNlbnQgdmFsdWVzIGZyb20gdGhlIEdhbWVwYWQncyBsZWZ0IGF4aXMgc3RpY2suXHJcbiAgICAgICAgICogVGhpcyBpcyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiB0aGUgR2FtZXBhZC51cGRhdGUgY3ljbGUuXHJcbiAgICAgICAgICogVGhlIEggQXhpcyBpcyBtYXBwZWQgdG8gdGhlIGBWZWN0b3IyLnhgIHByb3BlcnR5LCBhbmQgdGhlIFYgQXhpcyB0byB0aGUgYFZlY3RvcjIueWAgcHJvcGVydHkuXHJcbiAgICAgICAgICogVGhlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIEF4aXMgdGhyZXNob2xkcy5cclxuICAgICAgICAgKiBJZiB0aGUgR2FtZXBhZCBkb2VzIG5vdCBoYXZlIGEgbGVmdCBheGlzIHN0aWNrLCB0aGUgdmFsdWVzIHdpbGwgYWx3YXlzIGJlIHplcm8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI2xlZnRTdGlja1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxlZnRTdGljayA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgVmVjdG9yMiBjb250YWluaW5nIHRoZSBtb3N0IHJlY2VudCB2YWx1ZXMgZnJvbSB0aGUgR2FtZXBhZCdzIHJpZ2h0IGF4aXMgc3RpY2suXHJcbiAgICAgICAgICogVGhpcyBpcyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiB0aGUgR2FtZXBhZC51cGRhdGUgY3ljbGUuXHJcbiAgICAgICAgICogVGhlIEggQXhpcyBpcyBtYXBwZWQgdG8gdGhlIGBWZWN0b3IyLnhgIHByb3BlcnR5LCBhbmQgdGhlIFYgQXhpcyB0byB0aGUgYFZlY3RvcjIueWAgcHJvcGVydHkuXHJcbiAgICAgICAgICogVGhlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIEF4aXMgdGhyZXNob2xkcy5cclxuICAgICAgICAgKiBJZiB0aGUgR2FtZXBhZCBkb2VzIG5vdCBoYXZlIGEgcmlnaHQgYXhpcyBzdGljaywgdGhlIHZhbHVlcyB3aWxsIGFsd2F5cyBiZSB6ZXJvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNyaWdodFN0aWNrXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmlnaHRTdGljayA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGF4aXMgdGhpcyBHYW1lcGFkIGNsYWltcyB0byBzdXBwb3J0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNnZXRBeGlzVG90YWxcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgdG90YWwgbnVtYmVyIG9mIGF4ZXMgdGhpcyBHYW1lcGFkIGNsYWltcyB0byBzdXBwb3J0LlxyXG4gICAgICovXHJcbiAgICBnZXRBeGlzVG90YWw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXhlcy5sZW5ndGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gYXhpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5kZXguXHJcbiAgICAgKiBUaGUgaW5kZXggbXVzdCBiZSB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIG9mIGF4ZXMgc3VwcG9ydGVkIGJ5IHRoaXMgR2FtZXBhZC5cclxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIGZsb2F0IGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjZ2V0QXhpc1ZhbHVlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYXhlcyB0byBnZXQgdGhlIHZhbHVlIGZvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgYXhpcywgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBnZXRBeGlzVmFsdWU6IGZ1bmN0aW9uIChpbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5heGVzW2luZGV4XS5nZXRWYWx1ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRocmVzaG9sZCB2YWx1ZSBvZiBhbGwgYXhpcyBvbiB0aGlzIEdhbWVwYWQuXHJcbiAgICAgKiBUaGUgdmFsdWUgaXMgYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDEgYW5kIGlzIHRoZSBhbW91bnQgYmVsb3cgd2hpY2ggdGhlIGF4aXMgaXMgY29uc2lkZXJlZCBhcyBub3QgaGF2aW5nIGJlZW4gbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI3NldEF4aXNUaHJlc2hvbGRcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqL1xyXG4gICAgc2V0QXhpc1RocmVzaG9sZDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5heGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5heGVzW2ldLnRocmVzaG9sZCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnV0dG9ucyB0aGlzIEdhbWVwYWQgY2xhaW1zIHRvIGhhdmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI2dldEJ1dHRvblRvdGFsXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBidXR0b25zIHRoaXMgR2FtZXBhZCBjbGFpbXMgdG8gaGF2ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0QnV0dG9uVG90YWw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9ucy5sZW5ndGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBidXR0b24gYmFzZWQgb24gdGhlIGdpdmVuIGluZGV4LlxyXG4gICAgICogVGhlIGluZGV4IG11c3QgYmUgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBvZiBidXR0b25zIHN1cHBvcnRlZCBieSB0aGlzIEdhbWVwYWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGVpdGhlciAwIG9yIDEgZm9yIGFuIGFuYWxvZ3VlIGJ1dHRvbiwgb3IgYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIDFcclxuICAgICAqIGZvciBhIHByZXNzdXJlLXNlbnNpdGl2ZSBkaWdpdGFsIGJ1dHRvbiwgc3VjaCBhcyB0aGUgc2hvdWxkZXIgYnV0dG9ucyBvbiBhIER1YWwgU2hvY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI2dldEJ1dHRvblZhbHVlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYnV0dG9uIHRvIGdldCB0aGUgdmFsdWUgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSBidXR0b24sIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqL1xyXG4gICAgZ2V0QnV0dG9uVmFsdWU6IGZ1bmN0aW9uIChpbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zW2luZGV4XS52YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBidXR0b24gaXMgcHJlc3NlZCBkb3duIG9yIG5vdC5cclxuICAgICAqIFRoZSBpbmRleCBtdXN0IGJlIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYnV0dG9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBHYW1lcGFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNpc0J1dHRvbkRvd25cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBidXR0b24gdG8gZ2V0IHRoZSB2YWx1ZSBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBidXR0b24gaXMgY29uc2lkZXJlZCBhcyBiZWluZyBwcmVzc2VkIGRvd24sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc0J1dHRvbkRvd246IGZ1bmN0aW9uIChpbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zW2luZGV4XS5wcmVzc2VkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHVwZGF0ZSBoYW5kbGVyIGZvciB0aGlzIEdhbWVwYWQuXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgR2FtZXBhZCBNYW5hZ2VyIGFzIHBhcnQgb2YgaXRzIHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjdXBkYXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHBhZClcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuXHJcbiAgICAgICAgLy8gIFN5bmMgdGhlIGJ1dHRvbiB2YWx1ZXNcclxuXHJcbiAgICAgICAgdmFyIGxvY2FsQnV0dG9ucyA9IHRoaXMuYnV0dG9ucztcclxuICAgICAgICB2YXIgZ2FtZXBhZEJ1dHRvbnMgPSBwYWQuYnV0dG9ucztcclxuXHJcbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsQnV0dG9ucy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvY2FsQnV0dG9uc1tpXS51cGRhdGUoZ2FtZXBhZEJ1dHRvbnNbaV0udmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFN5bmMgdGhlIGF4aXMgdmFsdWVzXHJcblxyXG4gICAgICAgIHZhciBsb2NhbEF4ZXMgPSB0aGlzLmF4ZXM7XHJcbiAgICAgICAgdmFyIGdhbWVwYWRBeGVzID0gcGFkLmF4ZXM7XHJcblxyXG4gICAgICAgIGxlbiA9IGxvY2FsQXhlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvY2FsQXhlc1tpXS51cGRhdGUoZ2FtZXBhZEF4ZXNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxlbiA+PSAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5sZWZ0U3RpY2suc2V0KGxvY2FsQXhlc1swXS5nZXRWYWx1ZSgpLCBsb2NhbEF4ZXNbMV0uZ2V0VmFsdWUoKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobGVuID49IDQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRTdGljay5zZXQobG9jYWxBeGVzWzJdLmdldFZhbHVlKCksIGxvY2FsQXhlc1szXS5nZXRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIEdhbWVwYWQgaW5zdGFuY2UsIGl0cyBidXR0b25zIGFuZCBheGVzLCBhbmQgcmVsZWFzZXMgZXh0ZXJuYWwgcmVmZXJlbmNlcyBpdCBob2xkcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wYWQgPSBudWxsO1xyXG5cclxuICAgICAgICB2YXIgaTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYnV0dG9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5heGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5heGVzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYnV0dG9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuYXhlcyA9IFtdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgR2FtZXBhZCBjdXJyZW50bHkgY29ubmVjdGVkIG9yIG5vdD9cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI2Nvbm5lY3RlZFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgY29ubmVjdGVkOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhZC5jb25uZWN0ZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHRpbWVzdGFtcCBjb250YWluaW5nIHRoZSBtb3N0IHJlY2VudCB0aW1lIHRoaXMgR2FtZXBhZCB3YXMgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI3RpbWVzdGFtcFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0aW1lc3RhbXA6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFkLnRpbWVzdGFtcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoZSBHYW1lcGFkJ3MgTGVmdCBidXR0b24gYmVpbmcgcHJlc3NlZD9cclxuICAgICAqIElmIHRoZSBHYW1lcGFkIGRvZXNuJ3QgaGF2ZSB0aGlzIGJ1dHRvbiBpdCB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuXHJcbiAgICAgKiBUaGlzIGlzIHRoZSBkLXBhZCBsZWZ0IGJ1dHRvbiB1bmRlciBzdGFuZGFyZCBHYW1lcGFkIG1hcHBpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNsZWZ0XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgbGVmdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fTENMZWZ0LnByZXNzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgR2FtZXBhZCdzIFJpZ2h0IGJ1dHRvbiBiZWluZyBwcmVzc2VkP1xyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGQtcGFkIHJpZ2h0IGJ1dHRvbiB1bmRlciBzdGFuZGFyZCBHYW1lcGFkIG1hcHBpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNyaWdodFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHJpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9MQ1JpZ2h0LnByZXNzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgR2FtZXBhZCdzIFVwIGJ1dHRvbiBiZWluZyBwcmVzc2VkP1xyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGQtcGFkIHVwIGJ1dHRvbiB1bmRlciBzdGFuZGFyZCBHYW1lcGFkIG1hcHBpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCN1cFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHVwOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9MQ1RvcC5wcmVzc2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhlIEdhbWVwYWQncyBEb3duIGJ1dHRvbiBiZWluZyBwcmVzc2VkP1xyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cclxuICAgICAqIFRoaXMgaXMgdGhlIGQtcGFkIGRvd24gYnV0dG9uIHVuZGVyIHN0YW5kYXJkIEdhbWVwYWQgbWFwcGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkI2Rvd25cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBkb3duOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9MQ0JvdHRvbS5wcmVzc2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhlIEdhbWVwYWQncyBib3R0b20gYnV0dG9uIGluIHRoZSByaWdodCBidXR0b24gY2x1c3RlciBiZWluZyBwcmVzc2VkP1xyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cclxuICAgICAqIE9uIGEgRHVhbCBTaG9jayBjb250cm9sbGVyIGl0J3MgdGhlIFggYnV0dG9uLlxyXG4gICAgICogT24gYW4gWEJveCBjb250cm9sbGVyIGl0J3MgdGhlIEEgYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjQVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIEE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX1JDQm90dG9tLnByZXNzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgR2FtZXBhZCdzIHRvcCBidXR0b24gaW4gdGhlIHJpZ2h0IGJ1dHRvbiBjbHVzdGVyIGJlaW5nIHByZXNzZWQ/XHJcbiAgICAgKiBJZiB0aGUgR2FtZXBhZCBkb2Vzbid0IGhhdmUgdGhpcyBidXR0b24gaXQgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLlxyXG4gICAgICogT24gYSBEdWFsIFNob2NrIGNvbnRyb2xsZXIgaXQncyB0aGUgVHJpYW5nbGUgYnV0dG9uLlxyXG4gICAgICogT24gYW4gWEJveCBjb250cm9sbGVyIGl0J3MgdGhlIFkgYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjWVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIFk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX1JDVG9wLnByZXNzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgR2FtZXBhZCdzIGxlZnQgYnV0dG9uIGluIHRoZSByaWdodCBidXR0b24gY2x1c3RlciBiZWluZyBwcmVzc2VkP1xyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS5cclxuICAgICAqIE9uIGEgRHVhbCBTaG9jayBjb250cm9sbGVyIGl0J3MgdGhlIFNxdWFyZSBidXR0b24uXHJcbiAgICAgKiBPbiBhbiBYQm94IGNvbnRyb2xsZXIgaXQncyB0aGUgWCBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNYXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgWDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fUkNMZWZ0LnByZXNzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgR2FtZXBhZCdzIHJpZ2h0IGJ1dHRvbiBpbiB0aGUgcmlnaHQgYnV0dG9uIGNsdXN0ZXIgYmVpbmcgcHJlc3NlZD9cclxuICAgICAqIElmIHRoZSBHYW1lcGFkIGRvZXNuJ3QgaGF2ZSB0aGlzIGJ1dHRvbiBpdCB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuXHJcbiAgICAgKiBPbiBhIER1YWwgU2hvY2sgY29udHJvbGxlciBpdCdzIHRoZSBDaXJjbGUgYnV0dG9uLlxyXG4gICAgICogT24gYW4gWEJveCBjb250cm9sbGVyIGl0J3MgdGhlIEIgYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjQlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIEI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX1JDUmlnaHQucHJlc3NlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBHYW1lcGFkJ3MgdG9wIGxlZnQgc2hvdWxkZXIgYnV0dG9uLlxyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLlxyXG4gICAgICogVGhlIHZhbHVlIGlzIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxLCBjb3JyZXNwb25kaW5nIHRvIGhvdyBkZXByZXNzZWQgdGhlIGJ1dHRvbiBpcy5cclxuICAgICAqIE9uIGEgRHVhbCBTaG9jayBjb250cm9sbGVyIGl0J3MgdGhlIEwxIGJ1dHRvbi5cclxuICAgICAqIE9uIGFuIFhCb3ggY29udHJvbGxlciBpdCdzIHRoZSBMQiBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNMMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgTDE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX0ZCTGVmdFRvcC52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBHYW1lcGFkJ3MgYm90dG9tIGxlZnQgc2hvdWxkZXIgYnV0dG9uLlxyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLlxyXG4gICAgICogVGhlIHZhbHVlIGlzIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxLCBjb3JyZXNwb25kaW5nIHRvIGhvdyBkZXByZXNzZWQgdGhlIGJ1dHRvbiBpcy5cclxuICAgICAqIE9uIGEgRHVhbCBTaG9jayBjb250cm9sbGVyIGl0J3MgdGhlIEwyIGJ1dHRvbi5cclxuICAgICAqIE9uIGFuIFhCb3ggY29udHJvbGxlciBpdCdzIHRoZSBMVCBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNMMlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgTDI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX0ZCTGVmdEJvdHRvbS52YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBHYW1lcGFkJ3MgdG9wIHJpZ2h0IHNob3VsZGVyIGJ1dHRvbi5cclxuICAgICAqIElmIHRoZSBHYW1lcGFkIGRvZXNuJ3QgaGF2ZSB0aGlzIGJ1dHRvbiBpdCB3aWxsIGFsd2F5cyByZXR1cm4gemVyby5cclxuICAgICAqIFRoZSB2YWx1ZSBpcyBhIGZsb2F0IGJldHdlZW4gMCBhbmQgMSwgY29ycmVzcG9uZGluZyB0byBob3cgZGVwcmVzc2VkIHRoZSBidXR0b24gaXMuXHJcbiAgICAgKiBPbiBhIER1YWwgU2hvY2sgY29udHJvbGxlciBpdCdzIHRoZSBSMSBidXR0b24uXHJcbiAgICAgKiBPbiBhbiBYQm94IGNvbnRyb2xsZXIgaXQncyB0aGUgUkIgYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWQjUjFcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIFIxOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9GQlJpZ2h0VG9wLnZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEdhbWVwYWQncyBib3R0b20gcmlnaHQgc2hvdWxkZXIgYnV0dG9uLlxyXG4gICAgICogSWYgdGhlIEdhbWVwYWQgZG9lc24ndCBoYXZlIHRoaXMgYnV0dG9uIGl0IHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLlxyXG4gICAgICogVGhlIHZhbHVlIGlzIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCAxLCBjb3JyZXNwb25kaW5nIHRvIGhvdyBkZXByZXNzZWQgdGhlIGJ1dHRvbiBpcy5cclxuICAgICAqIE9uIGEgRHVhbCBTaG9jayBjb250cm9sbGVyIGl0J3MgdGhlIFIyIGJ1dHRvbi5cclxuICAgICAqIE9uIGFuIFhCb3ggY29udHJvbGxlciBpdCdzIHRoZSBSVCBidXR0b24uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZCNSMlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgUjI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX0ZCUmlnaHRCb3R0b20udmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHYW1lcGFkO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2FtZXBhZCA9IHJlcXVpcmUoJy4vR2FtZXBhZCcpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIElucHV0UGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9JbnB1dFBsdWdpbkNhY2hlJyk7XHJcbnZhciBJbnB1dEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEdhbWVwYWQgUGx1Z2luIGlzIGFuIGlucHV0IHBsdWdpbiB0aGF0IGJlbG9uZ3MgdG8gdGhlIFNjZW5lLW93bmVkIElucHV0IHN5c3RlbS5cclxuICpcclxuICogSXRzIHJvbGUgaXMgdG8gbGlzdGVuIGZvciBuYXRpdmUgRE9NIEdhbWVwYWQgRXZlbnRzIGFuZCB0aGVuIHByb2Nlc3MgdGhlbS5cclxuICpcclxuICogWW91IGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCB0aGUgSW5wdXQgc3lzdGVtIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGl0IGF1dG9tYXRpY2FsbHkuXHJcbiAqXHJcbiAqIFlvdSBjYW4gYWNjZXNzIGl0IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmcgYHRoaXMuaW5wdXQuZ2FtZXBhZGAuXHJcbiAqXHJcbiAqIFRvIGxpc3RlbiBmb3IgYSBnYW1lcGFkIGJlaW5nIGNvbm5lY3RlZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmlucHV0LmdhbWVwYWQub25jZSgnY29ubmVjdGVkJywgZnVuY3Rpb24gKHBhZCkge1xyXG4gKiAgICAgLy8gICAncGFkJyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2FtZXBhZCB0aGF0IHdhcyBqdXN0IGNvbm5lY3RlZFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB0aGUgYnJvd3NlciBtYXkgcmVxdWlyZSB5b3UgdG8gcHJlc3MgYSBidXR0b24gb24gYSBnYW1lcGFkIGJlZm9yZSBpdCB3aWxsIGFsbG93IHlvdSB0byBhY2Nlc3MgaXQsXHJcbiAqIHRoaXMgaXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIEhvd2V2ZXIsIGl0IG1heSBhbHNvIHRydXN0IHRoZSBwYWdlIGFscmVhZHksIGluIHdoaWNoIGNhc2UgeW91IHdvbid0IGdldCB0aGVcclxuICogJ2Nvbm5lY3RlZCcgZXZlbnQgYW5kIGluc3RlYWQgc2hvdWxkIGNoZWNrIGBHYW1lcGFkUGx1Z2luLnRvdGFsYCB0byBzZWUgaWYgaXQgdGhpbmtzIHRoZXJlIGFyZSBhbnkgZ2FtZXBhZHNcclxuICogYWxyZWFkeSBjb25uZWN0ZWQuXHJcbiAqXHJcbiAqIE9uY2UgeW91IGhhdmUgcmVjZWl2ZWQgdGhlIGNvbm5lY3RlZCBldmVudCwgb3IgcG9sbGVkIHRoZSBnYW1lcGFkcyBhbmQgZm91bmQgdGhlbSBlbmFibGVkLCB5b3UgY2FuIGFjY2Vzc1xyXG4gKiB0aGVtIHZpYSB0aGUgYnVpbHQtaW4gcHJvcGVydGllcyBgR2FtZXBhZFBsdWdpbi5wYWQxYCB0byBgcGFkNGAsIGZvciB1cCB0byA0IGdhbWUgcGFkcy4gV2l0aCBhIHJlZmVyZW5jZVxyXG4gKiB0byB0aGUgZ2FtZXBhZHMgeW91IGNhbiBwb2xsIGl0cyBidXR0b25zIGFuZCBheGlzIHN0aWNrcy4gU2VlIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGF2YWlsYWJsZSBvblxyXG4gKiB0aGUgYEdhbWVwYWRgIGNsYXNzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEdhbWVwYWQgc3VwcG9ydCBpbiBicm93c2VycyBzZWUgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6XHJcbiAqXHJcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HYW1lcGFkX0FQSVxyXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2FtZXBhZF9BUEkvVXNpbmdfdGhlX0dhbWVwYWRfQVBJXHJcbiAqIGh0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tLzIwMTUvMTEvZ2FtZXBhZC1hcGktaW4td2ViLWdhbWVzL1xyXG4gKiBodHRwOi8vaHRtbDVnYW1lcGFkLmNvbS9cclxuICpcclxuICogQGNsYXNzIEdhbWVwYWRQbHVnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5JbnB1dC5HYW1lcGFkXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LklucHV0UGx1Z2lufSBzY2VuZUlucHV0UGx1Z2luIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIElucHV0IFBsdWdpbiB0aGF0IHRoZSBLZXlib2FyZFBsdWdpbiBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIEdhbWVwYWRQbHVnaW4gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEdhbWVwYWRQbHVnaW4gKHNjZW5lSW5wdXRQbHVnaW4pXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IHRoaXMgSW5wdXQgUGx1Z2luIGlzIHJlc3BvbnNpYmxlIGZvci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmVJbnB1dFBsdWdpbi5zY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgU2V0dGluZ3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI3NldHRpbmdzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NPYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLnNjZW5lLnN5cy5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIElucHV0IFBsdWdpbiB0aGF0IGNyZWF0ZWQgdGhpcyBLZXlib2FyZCBQbHVnaW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI3NjZW5lSW5wdXRQbHVnaW5cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LklucHV0UGx1Z2lufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4gPSBzY2VuZUlucHV0UGx1Z2luO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGJvb2xlYW4gdGhhdCBjb250cm9scyBpZiB0aGUgR2FtZXBhZCBNYW5hZ2VyIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICAgICAqIENhbiBiZSB0b2dnbGVkIG9uIHRoZSBmbHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI2VuYWJsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHYW1lcGFkIEV2ZW50IHRhcmdldCwgYXMgZGVmaW5lZCBpbiB0aGUgR2FtZSBDb25maWcuXHJcbiAgICAgICAgICogVHlwaWNhbGx5IHRoZSBicm93c2VyIHdpbmRvdywgYnV0IGNhbiBiZSBhbnkgaW50ZXJhY3RpdmUgRE9NIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI3RhcmdldFxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiB0aGUgY29ubmVjdGVkIEdhbWVwYWRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNnYW1lcGFkc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkW119XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lcGFkcyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBldmVudCBxdWV1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jcXVldWVcclxuICAgICAgICAgKiBAdHlwZSB7R2FtZXBhZEV2ZW50W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBldmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNvbkdhbWVwYWRIYW5kbGVyXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25HYW1lcGFkSGFuZGxlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgR2FtZXBhZCByZWZlcmVuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI19wYWQxXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGFkMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgR2FtZXBhZCByZWZlcmVuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI19wYWQyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGFkMjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgR2FtZXBhZCByZWZlcmVuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI19wYWQzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGFkMztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgR2FtZXBhZCByZWZlcmVuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI19wYWQ0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGFkNDtcclxuXHJcbiAgICAgICAgc2NlbmVJbnB1dFBsdWdpbi5wbHVnaW5FdmVudHMub25jZShJbnB1dEV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lSW5wdXRQbHVnaW4ucGx1Z2luRXZlbnRzLm9uKElucHV0RXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2FtZSA9IHRoaXMuc2NlbmUuc3lzLmdhbWU7XHJcbiAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncy5pbnB1dDtcclxuICAgICAgICB2YXIgY29uZmlnID0gZ2FtZS5jb25maWc7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IEdldFZhbHVlKHNldHRpbmdzLCAnZ2FtZXBhZCcsIGNvbmZpZy5pbnB1dEdhbWVwYWQpICYmIGdhbWUuZGV2aWNlLmlucHV0LmdhbWVwYWRzO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gR2V0VmFsdWUoc2V0dGluZ3MsICdnYW1lcGFkLnRhcmdldCcsIGNvbmZpZy5pbnB1dEdhbWVwYWRFdmVudFRhcmdldCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmVJbnB1dFBsdWdpbi5wbHVnaW5FdmVudHMub25jZShJbnB1dEV2ZW50cy5ERVNUUk9ZLCB0aGlzLmRlc3Ryb3ksIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBTY2VuZSB3aGVuIGl0IGlzIHN0YXJ0aW5nIHVwLlxyXG4gICAgICogSXQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGxvY2FsIHN5c3RlbXMsIHByb3BlcnRpZXMgYW5kIGxpc3RlbmluZyBmb3IgU2NlbmUgZXZlbnRzLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jc3RhcnRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4ucGx1Z2luRXZlbnRzLm9uY2UoSW5wdXRFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgYm90aCB0aGlzIHBsdWdpbiBhbmQgdGhlIFNjZW5lIHRvIHdoaWNoIGl0IGJlbG9uZ3MgaXMgYWN0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNpc0FjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGx1Z2luIGFuZCB0aGUgU2NlbmUgaXQgYmVsb25ncyB0byBpcyBhY3RpdmUuXHJcbiAgICAgKi9cclxuICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5lbmFibGVkICYmIHRoaXMuc2NlbmUuc3lzLmlzQWN0aXZlKCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyB0aGUgR2FtZXBhZCBFdmVudCBsaXN0ZW5lcnMgcnVubmluZy5cclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgbWFudWFsbHkgaW52b2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jc3RhcnRMaXN0ZW5lcnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0TGlzdGVuZXJzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFfdGhpcy5pc0FjdGl2ZSgpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGV2ZW50IGFscmVhZHkgaGFuZGxlZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5yZWZyZXNoUGFkcygpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMucXVldWUucHVzaChldmVudCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkdhbWVwYWRIYW5kbGVyID0gaGFuZGxlcjtcclxuXHJcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRjb25uZWN0ZWQnLCBoYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRkaXNjb25uZWN0ZWQnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vICBGRiBhbHNvIHN1cHBvcnRzIGdhbWVwYWRidXR0b25kb3duLCBnYW1lcGFkYnV0dG9udXAgYW5kIGdhbWVwYWRheGlzbW92ZSBidXRcclxuICAgICAgICAvLyAgbm90aGluZyBlbHNlIGRvZXMsIGFuZCB3ZSBjYW4gZ2V0IHRob3NlIHZhbHVlcyB2aWEgdGhlIGdhbWVwYWRzIGFueXdheSwgc28gd2Ugd2lsbFxyXG4gICAgICAgIC8vICB1bnRpbCBtb3JlIGJyb3dzZXJzIHN1cHBvcnQgdGhpc1xyXG5cclxuICAgICAgICAvLyAgRmluYWxseSwgbGlzdGVuIGZvciBhbiB1cGRhdGUgZXZlbnQgZnJvbSB0aGUgSW5wdXQgUGx1Z2luXHJcbiAgICAgICAgdGhpcy5zY2VuZUlucHV0UGx1Z2luLnBsdWdpbkV2ZW50cy5vbihJbnB1dEV2ZW50cy5VUERBVEUsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGUgR2FtZXBhZCBFdmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIG1hbnVhbGx5IGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI3N0b3BMaXN0ZW5lcnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHN0b3BMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZ2FtZXBhZGNvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZ2FtZXBhZGRpc2Nvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkSGFuZGxlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmVJbnB1dFBsdWdpbi5wbHVnaW5FdmVudHMub2ZmKElucHV0RXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2Nvbm5lY3RzIGFsbCBjdXJyZW50IEdhbWVwYWRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNkaXNjb25uZWN0QWxsXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIGRpc2Nvbm5lY3RBbGw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdhbWVwYWRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nYW1lcGFkcy5jb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmcmVzaGVzIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBHYW1lcGFkcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYSBnYW1lcGFkIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQsXHJcbiAgICAgKiBhbmQgZHVyaW5nIHRoZSB1cGRhdGUgbG9vcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jcmVmcmVzaFBhZHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHJlZnJlc2hQYWRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb25uZWN0ZWRQYWRzID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzKCk7XHJcblxyXG4gICAgICAgIGlmICghY29ubmVjdGVkUGFkcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdEFsbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZHMgPSB0aGlzLmdhbWVwYWRzO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRQYWRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGl2ZVBhZCA9IGNvbm5lY3RlZFBhZHNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEJlY2F1c2Ugc29tZXRpbWVzIHRoZXkncmUgbnVsbCAoeWVzLCByZWFsbHkpXHJcbiAgICAgICAgICAgICAgICBpZiAoIWxpdmVQYWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gbGl2ZVBhZC5pZDtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpdmVQYWQuaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFBhZCA9IGN1cnJlbnRQYWRzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRQYWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIEEgbmV3IEdhbWVwYWQsIG5vdCBjdXJyZW50bHkgc3RvcmVkIGxvY2FsbHlcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFkID0gbmV3IEdhbWVwYWQodGhpcywgbGl2ZVBhZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWRzW2luZGV4XSA9IG5ld1BhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9wYWQxKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFkMSA9IG5ld1BhZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3BhZDIpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYWQyID0gbmV3UGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fcGFkMylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhZDMgPSBuZXdQYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9wYWQ0KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFkNCA9IG5ld1BhZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50UGFkLmlkICE9PSBpZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgQSBuZXcgR2FtZXBhZCB3aXRoIGEgZGlmZmVyZW50IHZlbmRvciBzdHJpbmcsIGJ1dCBpdCBoYXMgZ290IHRoZSBzYW1lIGluZGV4IGFzIGFuIG9sZCBvbmVcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFkLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZHNbaW5kZXhdID0gbmV3IEdhbWVwYWQodGhpcywgbGl2ZVBhZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIElmIG5laXRoZXIgb2YgdGhlc2UsIGl0J3MgYSBwYWQgd2UndmUgYWxyZWFkeSBnb3QsIHNvIHVwZGF0ZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWQudXBkYXRlKGxpdmVQYWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBjb25uZWN0ZWQgR2FtZXBhZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI2dldEFsbFxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRbXX0gQW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBjb25uZWN0ZWQgR2FtZXBhZHMuXHJcbiAgICAgKi9cclxuICAgIGdldEFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gW107XHJcbiAgICAgICAgdmFyIHBhZHMgPSB0aGlzLmdhbWVwYWRzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocGFkc1tpXSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2gocGFkc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9va3MtdXAgYSBzaW5nbGUgR2FtZXBhZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW5kZXggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI2dldFBhZFxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgR2FtZXBhZCB0byBnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZH0gVGhlIEdhbWVwYWQgbWF0Y2hpbmcgdGhlIGdpdmVuIGluZGV4LCBvciB1bmRlZmluZWQgaWYgbm9uZSB3ZXJlIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRQYWQ6IGZ1bmN0aW9uIChpbmRleClcclxuICAgIHtcclxuICAgICAgICB2YXIgcGFkcyA9IHRoaXMuZ2FtZXBhZHM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFkcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChwYWRzW2ldICYmIHBhZHNbaV0uaW5kZXggPT09IGluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFkc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW50ZXJuYWwgdXBkYXRlIGxvb3AuIFJlZnJlc2hlcyBhbGwgY29ubmVjdGVkIGdhbWVwYWRzIGFuZCBwcm9jZXNzZXMgdGhlaXIgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBJbnB1dCBNYW5hZ2VyLCBpbnZva2VkIGZyb20gdGhlIEdhbWUgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jdXBkYXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNDT05ORUNURURcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHMjRElTQ09OTkVDVEVEXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaFBhZHMoKTtcclxuXHJcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucXVldWUubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAobGVuID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHF1ZXVlID0gdGhpcy5xdWV1ZS5zcGxpY2UoMCwgbGVuKTtcclxuXHJcbiAgICAgICAgLy8gIFByb2Nlc3MgdGhlIGV2ZW50IHF1ZXVlLCBkaXNwYXRjaGluZyBhbGwgb2YgdGhlIGV2ZW50cyB0aGF0IGhhdmUgc3RvcmVkIHVwXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBldmVudCA9IHF1ZXVlW2ldO1xyXG4gICAgICAgICAgICB2YXIgcGFkID0gdGhpcy5nZXRQYWQoZXZlbnQuZ2FtZXBhZC5pbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2dhbWVwYWRjb25uZWN0ZWQnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkNPTk5FQ1RFRCwgcGFkLCBldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ2dhbWVwYWRkaXNjb25uZWN0ZWQnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRJU0NPTk5FQ1RFRCwgcGFkLCBldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1dHMgdGhlIEdhbWVwYWQgUGx1Z2luIGRvd24uXHJcbiAgICAgKiBBbGwgdGhpcyBkb2VzIGlzIHJlbW92ZSBhbnkgbGlzdGVuZXJzIGJvdW5kIHRvIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdEFsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgR2FtZXBhZCBQbHVnaW4sIGRpc2Nvbm5lY3RpbmcgYWxsIEdhbWVwYWRzIGFuZCByZWxlYXNpbmcgaW50ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jZGVzdHJveVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nYW1lcGFkcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdhbWVwYWRzW2ldKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdhbWVwYWRzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nYW1lcGFkcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNvbm5lY3RlZCBnYW1lIHBhZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiN0b3RhbFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHRvdGFsOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdhbWVwYWRzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCBjb25uZWN0ZWQgR2FtZXBhZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgYmUgdW5kZWZpbmVkIGlmIGVpdGhlciBubyBwYWRzIGFyZSBjb25uZWN0ZWQsIG9yIHRoZSBicm93c2VyXHJcbiAgICAgKiBoYXMgbm90IHlldCBpc3N1ZWQgYSBnYW1lcGFkY29ubmVjdCwgd2hpY2ggY2FuIGhhcHBlbiBldmVuIGlmIGEgR2FtZXBhZFxyXG4gICAgICogaXMgcGx1Z2dlZCBpbiwgYnV0IGhhc24ndCB5ZXQgaGFkIGFueSBidXR0b25zIHByZXNzZWQgb24gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZFBsdWdpbiNwYWQxXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LkdhbWVwYWQuR2FtZXBhZH1cclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgcGFkMToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFkMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQgY29ubmVjdGVkIEdhbWVwYWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBpZiBlaXRoZXIgbm8gcGFkcyBhcmUgY29ubmVjdGVkLCBvciB0aGUgYnJvd3NlclxyXG4gICAgICogaGFzIG5vdCB5ZXQgaXNzdWVkIGEgZ2FtZXBhZGNvbm5lY3QsIHdoaWNoIGNhbiBoYXBwZW4gZXZlbiBpZiBhIEdhbWVwYWRcclxuICAgICAqIGlzIHBsdWdnZWQgaW4sIGJ1dCBoYXNuJ3QgeWV0IGhhZCBhbnkgYnV0dG9ucyBwcmVzc2VkIG9uIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jcGFkMlxyXG4gICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHBhZDI6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZDI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgdGhpcmQgY29ubmVjdGVkIEdhbWVwYWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBpZiBlaXRoZXIgbm8gcGFkcyBhcmUgY29ubmVjdGVkLCBvciB0aGUgYnJvd3NlclxyXG4gICAgICogaGFzIG5vdCB5ZXQgaXNzdWVkIGEgZ2FtZXBhZGNvbm5lY3QsIHdoaWNoIGNhbiBoYXBwZW4gZXZlbiBpZiBhIEdhbWVwYWRcclxuICAgICAqIGlzIHBsdWdnZWQgaW4sIGJ1dCBoYXNuJ3QgeWV0IGhhZCBhbnkgYnV0dG9ucyBwcmVzc2VkIG9uIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWRQbHVnaW4jcGFkM1xyXG4gICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5HYW1lcGFkLkdhbWVwYWR9XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKi9cclxuICAgIHBhZDM6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZDM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZm91cnRoIGNvbm5lY3RlZCBHYW1lcGFkLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgZWl0aGVyIG5vIHBhZHMgYXJlIGNvbm5lY3RlZCwgb3IgdGhlIGJyb3dzZXJcclxuICAgICAqIGhhcyBub3QgeWV0IGlzc3VlZCBhIGdhbWVwYWRjb25uZWN0LCB3aGljaCBjYW4gaGFwcGVuIGV2ZW4gaWYgYSBHYW1lcGFkXHJcbiAgICAgKiBpcyBwbHVnZ2VkIGluLCBidXQgaGFzbid0IHlldCBoYWQgYW55IGJ1dHRvbnMgcHJlc3NlZCBvbiBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2luI3BhZDRcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkfVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBwYWQ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYWQ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgR2FtZXBhZCBQbHVnaW4gY2xhc3MsIGlmIGVuYWJsZWQgdmlhIHRoZSBgaW5wdXQuZ2FtZXBhZGAgU2NlbmUgb3IgR2FtZSBDb25maWcgcHJvcGVydHkuXHJcbiAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhY2Nlc3MgR2FtZXBhZHMgY29ubmVjdGVkIHRvIHRoZSBicm93c2VyIGFuZCByZXNwb25kIHRvIGdhbWVwYWQgYnV0dG9ucy5cclxuICpcclxuICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2dhbWVwYWRcclxuICogQHR5cGUgez9QaGFzZXIuSW5wdXQuR2FtZXBhZC5HYW1lcGFkUGx1Z2lufVxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqL1xyXG5JbnB1dFBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdHYW1lcGFkUGx1Z2luJywgR2FtZXBhZFBsdWdpbiwgJ2dhbWVwYWQnLCAnZ2FtZXBhZCcsICdpbnB1dEdhbWVwYWQnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2FtZXBhZFBsdWdpbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGF0YXIgU05FUyBVU0IgQ29udHJvbGxlciBHYW1lcGFkIENvbmZpZ3VyYXRpb24uXHJcbiAqIFVTQiBHYW1lcGFkICAoU1RBTkRBUkQgR0FNRVBBRCBWZW5kb3I6IDAwNzkgUHJvZHVjdDogMDAxMSlcclxuICpcclxuICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuQ29uZmlncy5TTkVTX1VTQlxyXG4gKiBAdHlwZSB7b2JqZWN0fVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFVQOiAxMixcclxuICAgIERPV046IDEzLFxyXG4gICAgTEVGVDogMTQsXHJcbiAgICBSSUdIVDogMTUsXHJcblxyXG4gICAgU0VMRUNUOiA4LFxyXG4gICAgU1RBUlQ6IDksXHJcblxyXG4gICAgQjogMCxcclxuICAgIEE6IDEsXHJcbiAgICBZOiAyLFxyXG4gICAgWDogMyxcclxuXHJcbiAgICBMRUZUX1NIT1VMREVSOiA0LFxyXG4gICAgUklHSFRfU0hPVUxERVI6IDVcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBsYXlTdGF0aW9uIER1YWxTaG9jayA0IEdhbWVwYWQgQ29uZmlndXJhdGlvbi5cclxuICogU29ueSBQbGF5U3RhdGlvbiBEdWFsU2hvY2sgNCAodjIpIHdpcmVsZXNzIGNvbnRyb2xsZXJcclxuICpcclxuICogQG5hbWUgUGhhc2VyLklucHV0LkdhbWVwYWQuQ29uZmlncy5EVUFMU0hPQ0tfNFxyXG4gKiBAdHlwZSB7b2JqZWN0fVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFVQOiAxMixcclxuICAgIERPV046IDEzLFxyXG4gICAgTEVGVDogMTQsXHJcbiAgICBSSUdIVDogMTUsXHJcblxyXG4gICAgU0hBUkU6IDgsXHJcbiAgICBPUFRJT05TOiA5LFxyXG4gICAgUFM6IDE2LFxyXG4gICAgVE9VQ0hCQVI6IDE3LFxyXG5cclxuICAgIFg6IDAsXHJcbiAgICBDSVJDTEU6IDEsXHJcbiAgICBTUVVBUkU6IDIsXHJcbiAgICBUUklBTkdMRTogMyxcclxuXHJcbiAgICBMMTogNCxcclxuICAgIFIxOiA1LFxyXG4gICAgTDI6IDYsXHJcbiAgICBSMjogNyxcclxuICAgIEwzOiAxMCxcclxuICAgIFIzOiAxMSxcclxuXHJcbiAgICBMRUZUX1NUSUNLX0g6IDAsXHJcbiAgICBMRUZUX1NUSUNLX1Y6IDEsXHJcbiAgICBSSUdIVF9TVElDS19IOiAyLFxyXG4gICAgUklHSFRfU1RJQ0tfVjogM1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogWEJveCAzNjAgR2FtZXBhZCBDb25maWd1cmF0aW9uLlxyXG4gKlxyXG4gKiBAbmFtZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5Db25maWdzLlhCT1hfMzYwXHJcbiAqIEB0eXBlIHtvYmplY3R9XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgVVA6IDEyLFxyXG4gICAgRE9XTjogMTMsXHJcbiAgICBMRUZUOiAxNCxcclxuICAgIFJJR0hUOiAxNSxcclxuXHJcbiAgICBNRU5VOiAxNixcclxuXHJcbiAgICBBOiAwLFxyXG4gICAgQjogMSxcclxuICAgIFg6IDIsXHJcbiAgICBZOiAzLFxyXG5cclxuICAgIExCOiA0LFxyXG4gICAgUkI6IDUsXHJcblxyXG4gICAgTFQ6IDYsXHJcbiAgICBSVDogNyxcclxuXHJcbiAgICBCQUNLOiA4LFxyXG4gICAgU1RBUlQ6IDksXHJcblxyXG4gICAgTFM6IDEwLFxyXG4gICAgUlM6IDExLFxyXG5cclxuICAgIExFRlRfU1RJQ0tfSDogMCxcclxuICAgIExFRlRfU1RJQ0tfVjogMSxcclxuICAgIFJJR0hUX1NUSUNLX0g6IDIsXHJcbiAgICBSSUdIVF9TVElDS19WOiAzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5HYW1lcGFkLkNvbmZpZ3NcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBEVUFMU0hPQ0tfNDogcmVxdWlyZSgnLi9Tb255X1BsYXlTdGF0aW9uX0R1YWxTaG9ja180JyksXHJcbiAgICBTTkVTX1VTQjogcmVxdWlyZSgnLi9TTkVTX1VTQl9Db250cm9sbGVyJyksXHJcbiAgICBYQk9YXzM2MDogcmVxdWlyZSgnLi9YQm94MzYwX0NvbnRyb2xsZXInKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdhbWVwYWQgQnV0dG9uIERvd24gRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEdhbWVwYWQgUGx1Z2luIHdoZW4gYSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZCBvbiBhbnkgYWN0aXZlIEdhbWVwYWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5nYW1lcGFkLm9uKCdkb3duJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFlvdSBjYW4gYWxzbyBsaXN0ZW4gZm9yIGEgRE9XTiBldmVudCBmcm9tIGEgR2FtZXBhZCBpbnN0YW5jZS4gU2VlIHRoZSBbR0FNRVBBRF9CVVRUT05fRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNldmVudDpHQU1FUEFEX0JVVFRPTl9ET1dOfSBldmVudCBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNCVVRUT05fRE9XTlxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5HYW1lcGFkfSBwYWQgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZXBhZCBvbiB3aGljaCB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5HYW1lcGFkLkJ1dHRvbn0gYnV0dG9uIC0gQSByZWZlcmVuY2UgdG8gdGhlIEJ1dHRvbiB3aGljaCB3YXMgcHJlc3NlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBidXR0b24gYXQgdGhlIHRpbWUgaXQgd2FzIHByZXNzZWQuIEJldHdlZW4gMCBhbmQgMS4gU29tZSBHYW1lcGFkcyBoYXZlIHByZXNzdXJlLXNlbnNpdGl2ZSBidXR0b25zLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZG93bic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lcGFkIEJ1dHRvbiBVcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgR2FtZXBhZCBQbHVnaW4gd2hlbiBhIGJ1dHRvbiBoYXMgYmVlbiByZWxlYXNlZCBvbiBhbnkgYWN0aXZlIEdhbWVwYWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5nYW1lcGFkLm9uKCd1cCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gbGlzdGVuIGZvciBhbiBVUCBldmVudCBmcm9tIGEgR2FtZXBhZCBpbnN0YW5jZS4gU2VlIHRoZSBbR0FNRVBBRF9CVVRUT05fVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHMjZXZlbnQ6R0FNRVBBRF9CVVRUT05fVVB9IGV2ZW50IGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkdhbWVwYWQuRXZlbnRzI0JVVFRPTl9VUFxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5HYW1lcGFkfSBwYWQgLSBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZXBhZCBvbiB3aGljaCB0aGUgYnV0dG9uIHdhcyByZWxlYXNlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuR2FtZXBhZC5CdXR0b259IGJ1dHRvbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBCdXR0b24gd2hpY2ggd2FzIHJlbGVhc2VkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGJ1dHRvbiBhdCB0aGUgdGltZSBpdCB3YXMgcmVsZWFzZWQuIEJldHdlZW4gMCBhbmQgMS4gU29tZSBHYW1lcGFkcyBoYXZlIHByZXNzdXJlLXNlbnNpdGl2ZSBidXR0b25zLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndXAnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZXBhZCBDb25uZWN0ZWQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEdhbWVwYWQgUGx1Z2luIHdoZW4gYSBHYW1lcGFkIGhhcyBiZWVuIGNvbm5lY3RlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmlucHV0LmdhbWVwYWQub25jZSgnY29ubmVjdGVkJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIE5vdGUgdGhhdCB0aGUgYnJvd3NlciBtYXkgcmVxdWlyZSB5b3UgdG8gcHJlc3MgYSBidXR0b24gb24gYSBnYW1lcGFkIGJlZm9yZSBpdCB3aWxsIGFsbG93IHlvdSB0byBhY2Nlc3MgaXQsXHJcbiAqIHRoaXMgaXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIEhvd2V2ZXIsIGl0IG1heSBhbHNvIHRydXN0IHRoZSBwYWdlIGFscmVhZHksIGluIHdoaWNoIGNhc2UgeW91IHdvbid0IGdldCB0aGVcclxuICogJ2Nvbm5lY3RlZCcgZXZlbnQgYW5kIGluc3RlYWQgc2hvdWxkIGNoZWNrIGBHYW1lcGFkUGx1Z2luLnRvdGFsYCB0byBzZWUgaWYgaXQgdGhpbmtzIHRoZXJlIGFyZSBhbnkgZ2FtZXBhZHNcclxuICogYWxyZWFkeSBjb25uZWN0ZWQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHMjQ09OTkVDVEVEXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuR2FtZXBhZH0gcGFkIC0gQSByZWZlcmVuY2UgdG8gdGhlIEdhbWVwYWQgd2hpY2ggd2FzIGNvbm5lY3RlZC5cclxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBFdmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY29ubmVjdGlvbi5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Nvbm5lY3RlZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lcGFkIERpc2Nvbm5lY3RlZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgR2FtZXBhZCBQbHVnaW4gd2hlbiBhIEdhbWVwYWQgaGFzIGJlZW4gZGlzY29ubmVjdGVkLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQuZ2FtZXBhZC5vbmNlKCdkaXNjb25uZWN0ZWQnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LkdhbWVwYWQuRXZlbnRzI0RJU0NPTk5FQ1RFRFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LkdhbWVwYWR9IHBhZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lcGFkIHdoaWNoIHdhcyBkaXNjb25uZWN0ZWQuXHJcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gRXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGRpc2Nvbm5lY3Rpb24uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkaXNjb25uZWN0ZWQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2FtZXBhZCBCdXR0b24gRG93biBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIEdhbWVwYWQgaW5zdGFuY2Ugd2hlbiBhIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkIG9uIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSBhIEdhbWVwYWQgaW5zdGFuY2UuIE9uY2Ugd2F5IHRvIGdldCB0aGlzIGlzIGZyb20gdGhlIGBwYWQxYCwgYHBhZDJgLCBldGMgcHJvcGVydGllcyBvbiB0aGUgR2FtZXBhZCBQbHVnaW46XHJcbiAqIGB0aGlzLmlucHV0LmdhbWVwYWQucGFkMS5vbignZG93bicsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBOb3RlIHRoYXQgeW91IHdpbGwgbm90IHJlY2VpdmUgYW55IEdhbWVwYWQgYnV0dG9uIGV2ZW50cyB1bnRpbCB0aGUgYnJvd3NlciBjb25zaWRlcnMgdGhlIEdhbWVwYWQgYXMgYmVpbmcgJ2Nvbm5lY3RlZCcuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gbGlzdGVuIGZvciBhIERPV04gZXZlbnQgZnJvbSB0aGUgR2FtZXBhZCBQbHVnaW4uIFNlZSB0aGUgW0JVVFRPTl9ET1dOXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LkdhbWVwYWQuRXZlbnRzI2V2ZW50OkJVVFRPTl9ET1dOfSBldmVudCBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNHQU1FUEFEX0JVVFRPTl9ET1dOXHJcbiAqIEBzaW5jZSAzLjEwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGJ1dHRvbiBhdCB0aGUgdGltZSBpdCB3YXMgcHJlc3NlZC4gQmV0d2VlbiAwIGFuZCAxLiBTb21lIEdhbWVwYWRzIGhhdmUgcHJlc3N1cmUtc2Vuc2l0aXZlIGJ1dHRvbnMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9ufSBidXR0b24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQnV0dG9uIHdoaWNoIHdhcyBwcmVzc2VkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZG93bic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBHYW1lcGFkIEJ1dHRvbiBVcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIEdhbWVwYWQgaW5zdGFuY2Ugd2hlbiBhIGJ1dHRvbiBoYXMgYmVlbiByZWxlYXNlZCBvbiBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gYSBHYW1lcGFkIGluc3RhbmNlLiBPbmNlIHdheSB0byBnZXQgdGhpcyBpcyBmcm9tIHRoZSBgcGFkMWAsIGBwYWQyYCwgZXRjIHByb3BlcnRpZXMgb24gdGhlIEdhbWVwYWQgUGx1Z2luOlxyXG4gKiBgdGhpcy5pbnB1dC5nYW1lcGFkLnBhZDEub24oJ3VwJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIE5vdGUgdGhhdCB5b3Ugd2lsbCBub3QgcmVjZWl2ZSBhbnkgR2FtZXBhZCBidXR0b24gZXZlbnRzIHVudGlsIHRoZSBicm93c2VyIGNvbnNpZGVycyB0aGUgR2FtZXBhZCBhcyBiZWluZyAnY29ubmVjdGVkJy5cclxuICogXHJcbiAqIFlvdSBjYW4gYWxzbyBsaXN0ZW4gZm9yIGFuIFVQIGV2ZW50IGZyb20gdGhlIEdhbWVwYWQgUGx1Z2luLiBTZWUgdGhlIFtCVVRUT05fVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHMjZXZlbnQ6QlVUVE9OX1VQfSBldmVudCBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5HYW1lcGFkLkV2ZW50cyNHQU1FUEFEX0JVVFRPTl9VUFxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcmVsZWFzZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uIGF0IHRoZSB0aW1lIGl0IHdhcyByZWxlYXNlZC4gQmV0d2VlbiAwIGFuZCAxLiBTb21lIEdhbWVwYWRzIGhhdmUgcHJlc3N1cmUtc2Vuc2l0aXZlIGJ1dHRvbnMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LkdhbWVwYWQuQnV0dG9ufSBidXR0b24gLSBBIHJlZmVyZW5jZSB0byB0aGUgQnV0dG9uIHdoaWNoIHdhcyByZWxlYXNlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3VwJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuSW5wdXQuR2FtZXBhZC5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBCVVRUT05fRE9XTjogcmVxdWlyZSgnLi9CVVRUT05fRE9XTl9FVkVOVCcpLFxyXG4gICAgQlVUVE9OX1VQOiByZXF1aXJlKCcuL0JVVFRPTl9VUF9FVkVOVCcpLFxyXG4gICAgQ09OTkVDVEVEOiByZXF1aXJlKCcuL0NPTk5FQ1RFRF9FVkVOVCcpLFxyXG4gICAgRElTQ09OTkVDVEVEOiByZXF1aXJlKCcuL0RJU0NPTk5FQ1RFRF9FVkVOVCcpLFxyXG4gICAgR0FNRVBBRF9CVVRUT05fRE9XTjogcmVxdWlyZSgnLi9HQU1FUEFEX0JVVFRPTl9ET1dOX0VWRU5UJyksXHJcbiAgICBHQU1FUEFEX0JVVFRPTl9VUDogcmVxdWlyZSgnLi9HQU1FUEFEX0JVVFRPTl9VUF9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5HYW1lcGFkXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQXhpczogcmVxdWlyZSgnLi9BeGlzJyksXHJcbiAgICBCdXR0b246IHJlcXVpcmUoJy4vQnV0dG9uJyksXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJyksXHJcbiAgICBHYW1lcGFkOiByZXF1aXJlKCcuL0dhbWVwYWQnKSxcclxuICAgIEdhbWVwYWRQbHVnaW46IHJlcXVpcmUoJy4vR2FtZXBhZFBsdWdpbicpLFxyXG4gICAgXHJcbiAgICBDb25maWdzOiByZXF1aXJlKCcuL2NvbmZpZ3MvJylcclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBFeHRlbmQgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvRXh0ZW5kJyk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuSW5wdXRcclxuICovXHJcblxyXG52YXIgSW5wdXQgPSB7XHJcblxyXG4gICAgQ3JlYXRlSW50ZXJhY3RpdmVPYmplY3Q6IHJlcXVpcmUoJy4vQ3JlYXRlSW50ZXJhY3RpdmVPYmplY3QnKSxcclxuICAgIEV2ZW50czogcmVxdWlyZSgnLi9ldmVudHMnKSxcclxuICAgIEdhbWVwYWQ6IHJlcXVpcmUoJy4vZ2FtZXBhZCcpLFxyXG4gICAgSW5wdXRNYW5hZ2VyOiByZXF1aXJlKCcuL0lucHV0TWFuYWdlcicpLFxyXG4gICAgSW5wdXRQbHVnaW46IHJlcXVpcmUoJy4vSW5wdXRQbHVnaW4nKSxcclxuICAgIElucHV0UGx1Z2luQ2FjaGU6IHJlcXVpcmUoJy4vSW5wdXRQbHVnaW5DYWNoZScpLFxyXG4gICAgS2V5Ym9hcmQ6IHJlcXVpcmUoJy4va2V5Ym9hcmQnKSxcclxuICAgIE1vdXNlOiByZXF1aXJlKCcuL21vdXNlJyksXHJcbiAgICBQb2ludGVyOiByZXF1aXJlKCcuL1BvaW50ZXInKSxcclxuICAgIFRvdWNoOiByZXF1aXJlKCcuL3RvdWNoJylcclxuXHJcbn07XHJcblxyXG4vLyAgIE1lcmdlIGluIHRoZSBjb25zdHNcclxuSW5wdXQgPSBFeHRlbmQoZmFsc2UsIElucHV0LCBDT05TVCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElucHV0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBcnJheVJlbW92ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2FycmF5L1JlbW92ZScpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgR2FtZUV2ZW50cyA9IHJlcXVpcmUoJy4uLy4uL2NvcmUvZXZlbnRzJyk7XHJcbnZhciBJbnB1dEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgS2V5Q29kZXMgPSByZXF1aXJlKCcuLi8uLi9pbnB1dC9rZXlib2FyZC9rZXlzL0tleUNvZGVzJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBLZXlib2FyZCBNYW5hZ2VyIGlzIGEgaGVscGVyIGNsYXNzIHRoYXQgYmVsb25ncyB0byB0aGUgZ2xvYmFsIElucHV0IE1hbmFnZXIuXHJcbiAqIFxyXG4gKiBJdHMgcm9sZSBpcyB0byBsaXN0ZW4gZm9yIG5hdGl2ZSBET00gS2V5Ym9hcmQgRXZlbnRzIGFuZCB0aGVuIHN0b3JlIHRoZW0gZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSB0aGUgS2V5Ym9hcmQgUGx1Z2luLlxyXG4gKiBcclxuICogWW91IGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCB0aGUgSW5wdXQgTWFuYWdlciB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpdCBhdXRvbWF0aWNhbGx5IGlmIGtleWJvYXJkXHJcbiAqIGlucHV0IGhhcyBiZWVuIGVuYWJsZWQgaW4gdGhlIEdhbWUgQ29uZmlnLlxyXG4gKlxyXG4gKiBAY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyfSBpbnB1dE1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgSW5wdXQgTWFuYWdlci5cclxuICovXHJcbnZhciBLZXlib2FyZE1hbmFnZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gS2V5Ym9hcmRNYW5hZ2VyIChpbnB1dE1hbmFnZXIpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIElucHV0IE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI21hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LklucHV0TWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gaW5wdXRNYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBldmVudCBxdWV1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZE1hbmFnZXIjcXVldWVcclxuICAgICAgICAgKiBAdHlwZSB7S2V5Ym9hcmRFdmVudFtdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIHRoYXQgY29udHJvbHMgaWYgdGhlIG5vbi1tb2RpZmllZCBrZXlzLCBtYXRjaGluZyB0aG9zZSBzdG9yZWQgaW4gdGhlIGBjYXB0dXJlc2AgYXJyYXksXHJcbiAgICAgICAgICogaGF2ZSBgcHJldmVudERlZmF1bHRgIGNhbGxlZCBvbiB0aGVtIG9yIG5vdC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIG5vbi1tb2RpZmllZCBrZXkgaXMgb25lIHRoYXQgZG9lc24ndCBoYXZlIGEgbW9kaWZpZXIga2V5IGhlbGQgZG93biB3aXRoIGl0LiBUaGUgbW9kaWZpZXIga2V5cyBhcmVcclxuICAgICAgICAgKiBzaGlmdCwgY29udHJvbCwgYWx0IGFuZCB0aGUgbWV0YSBrZXkgKENvbW1hbmQgb24gYSBNYWMsIHRoZSBXaW5kb3dzIEtleSBvbiBXaW5kb3dzKS5cclxuICAgICAgICAgKiBUaGVyZWZvcmUsIGlmIHRoZSB1c2VyIHByZXNzZXMgc2hpZnQgKyByLCBpdCB3b24ndCBwcmV2ZW50IHRoaXMgY29tYmluYXRpb24sIGJlY2F1c2Ugb2YgdGhlIG1vZGlmaWVyLlxyXG4gICAgICAgICAqIEhvd2V2ZXIsIGlmIHRoZSB1c2VyIHByZXNzZXMganVzdCB0aGUgciBrZXkgb24gaXRzIG93biwgaXQgd2lsbCBoYXZlIGl0cyBldmVudCBwcmV2ZW50ZWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IHdpc2ggdG8gc3RvcCBjYXB0dXJpbmcgdGhlIGtleXMsIGZvciBleGFtcGxlIHN3aXRjaGluZyBvdXQgdG8gYSBET00gYmFzZWQgZWxlbWVudCwgdGhlblxyXG4gICAgICAgICAqIHlvdSBjYW4gdG9nZ2xlIHRoaXMgcHJvcGVydHkgYXQgcnVuLXRpbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI3ByZXZlbnREZWZhdWx0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJldmVudERlZmF1bHQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBLZXkgQ29kZSB2YWx1ZXMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBgcHJldmVudERlZmF1bHRgIGNhbGxlZCBvbiB0aGVtLFxyXG4gICAgICAgICAqIGFzIGxvbmcgYXMgdGhlIGBLZXlib2FyZE1hbmFnZXIucHJldmVudERlZmF1bHRgIGJvb2xlYW4gaXMgc2V0IHRvIGB0cnVlYC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSBhcnJheSBpcyBlbXB0eS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUga2V5IG11c3QgYmUgbm9uLW1vZGlmaWVkIHdoZW4gcHJlc3NlZCBpbiBvcmRlciB0byBiZSBjYXB0dXJlZC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBIG5vbi1tb2RpZmllZCBrZXkgaXMgb25lIHRoYXQgZG9lc24ndCBoYXZlIGEgbW9kaWZpZXIga2V5IGhlbGQgZG93biB3aXRoIGl0LiBUaGUgbW9kaWZpZXIga2V5cyBhcmVcclxuICAgICAgICAgKiBzaGlmdCwgY29udHJvbCwgYWx0IGFuZCB0aGUgbWV0YSBrZXkgKENvbW1hbmQgb24gYSBNYWMsIHRoZSBXaW5kb3dzIEtleSBvbiBXaW5kb3dzKS5cclxuICAgICAgICAgKiBUaGVyZWZvcmUsIGlmIHRoZSB1c2VyIHByZXNzZXMgc2hpZnQgKyByLCBpdCB3b24ndCBwcmV2ZW50IHRoaXMgY29tYmluYXRpb24sIGJlY2F1c2Ugb2YgdGhlIG1vZGlmaWVyLlxyXG4gICAgICAgICAqIEhvd2V2ZXIsIGlmIHRoZSB1c2VyIHByZXNzZXMganVzdCB0aGUgciBrZXkgb24gaXRzIG93biwgaXQgd2lsbCBoYXZlIGl0cyBldmVudCBwcmV2ZW50ZWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IHdpc2ggdG8gc3RvcCBjYXB0dXJpbmcgdGhlIGtleXMsIGZvciBleGFtcGxlIHN3aXRjaGluZyBvdXQgdG8gYSBET00gYmFzZWQgZWxlbWVudCwgdGhlblxyXG4gICAgICAgICAqIHlvdSBjYW4gdG9nZ2xlIHRoZSBgS2V5Ym9hcmRNYW5hZ2VyLnByZXZlbnREZWZhdWx0YCBib29sZWFuIGF0IHJ1bi10aW1lLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIElmIHlvdSBuZWVkIG1vcmUgc3BlY2lmaWMgY29udHJvbCwgeW91IGNhbiBjcmVhdGUgS2V5IG9iamVjdHMgYW5kIHNldCB0aGUgZmxhZyBvbiBlYWNoIG9mIHRob3NlIGluc3RlYWQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBhcnJheSBjYW4gYmUgcG9wdWxhdGVkIHZpYSB0aGUgR2FtZSBDb25maWcgYnkgc2V0dGluZyB0aGUgYGlucHV0LmtleWJvYXJkLmNhcHR1cmVgIGFycmF5LCBvciB5b3VcclxuICAgICAgICAgKiBjYW4gY2FsbCB0aGUgYGFkZENhcHR1cmVgIG1ldGhvZC4gU2VlIGFsc28gYHJlbW92ZUNhcHR1cmVgIGFuZCBgY2xlYXJDYXB0dXJlc2AuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI2NhcHR1cmVzXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYXB0dXJlcyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGJvb2xlYW4gdGhhdCBjb250cm9scyBpZiB0aGUgS2V5Ym9hcmQgTWFuYWdlciBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAgICAgKiBDYW4gYmUgdG9nZ2xlZCBvbiB0aGUgZmx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlciNlbmFibGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBLZXlib2FyZCBFdmVudCB0YXJnZXQsIGFzIGRlZmluZWQgaW4gdGhlIEdhbWUgQ29uZmlnLlxyXG4gICAgICAgICAqIFR5cGljYWxseSB0aGUgd2luZG93IGluIHdoaWNoIHRoZSBnYW1lIGlzIHJlbmRlcmluZywgYnV0IGNhbiBiZSBhbnkgaW50ZXJhY3RpdmUgRE9NIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI3RhcmdldFxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgS2V5IERvd24gRXZlbnQgaGFuZGxlci5cclxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNlbnQgdGhlIG5hdGl2ZSBET00gS2V5RXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI29uS2V5RG93blxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25LZXlEb3duID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleSBVcCBFdmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgc2VudCB0aGUgbmF0aXZlIERPTSBLZXlFdmVudC5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZE1hbmFnZXIjb25LZXlVcFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25LZXlVcCA9IE5PT1A7XHJcblxyXG4gICAgICAgIGlucHV0TWFuYWdlci5ldmVudHMub25jZShJbnB1dEV2ZW50cy5NQU5BR0VSX0JPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEtleWJvYXJkIE1hbmFnZXIgYm9vdCBwcm9jZXNzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlciNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1hbmFnZXIuY29uZmlnO1xyXG5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBjb25maWcuaW5wdXRLZXlib2FyZDtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IGNvbmZpZy5pbnB1dEtleWJvYXJkRXZlbnRUYXJnZXQ7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkQ2FwdHVyZShjb25maWcuaW5wdXRLZXlib2FyZENhcHR1cmUpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0ICYmIHdpbmRvdylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gd2luZG93O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZCAmJiB0aGlzLnRhcmdldClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5nYW1lLmV2ZW50cy5vbihHYW1lRXZlbnRzLlBPU1RfU1RFUCwgdGhpcy5wb3N0VXBkYXRlLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIEtleWJvYXJkIEV2ZW50IGxpc3RlbmVycyBydW5uaW5nLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtYW51YWxseSBpbnZva2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlciNzdGFydExpc3RlbmVyc1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBzdGFydExpc3RlbmVyczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLm9uS2V5RG93biA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFfdGhpcy5lbmFibGVkIHx8ICFfdGhpcy5tYW5hZ2VyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIGV2ZW50IGFscmVhZHkgaGFuZGxlZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghX3RoaXMubWFuYWdlci51c2VRdWV1ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5ldmVudHMuZW1pdChJbnB1dEV2ZW50cy5NQU5BR0VSX1BST0NFU1MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIG1vZGlmaWVkID0gKGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF90aGlzLnByZXZlbnREZWZhdWx0ICYmICFtb2RpZmllZCAmJiBfdGhpcy5jYXB0dXJlcy5pbmRleE9mKGV2ZW50LmtleUNvZGUpID4gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uS2V5VXAgPSBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhX3RoaXMuZW5hYmxlZCB8fCAhX3RoaXMubWFuYWdlcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiBldmVudCBhbHJlYWR5IGhhbmRsZWRcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMucXVldWUucHVzaChldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIV90aGlzLm1hbmFnZXIudXNlUXVldWUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIuZXZlbnRzLmVtaXQoSW5wdXRFdmVudHMuTUFOQUdFUl9QUk9DRVNTKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciBtb2RpZmllZCA9IChldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcmV2ZW50RGVmYXVsdCAmJiAhbW9kaWZpZWQgJiYgX3RoaXMuY2FwdHVyZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA+IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xyXG4gICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBLZXkgRXZlbnQgbGlzdGVuZXJzLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtYW51YWxseSBpbnZva2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlciNzdG9wTGlzdGVuZXJzXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHN0b3BMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XHJcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgZXZlbnQgcXVldWUuXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgSW5wdXQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZE1hbmFnZXIjcG9zdFVwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgcG9zdFVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnF1ZXVlID0gW107XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnkgZGVmYXVsdCB3aGVuIGEga2V5IGlzIHByZXNzZWQgUGhhc2VyIHdpbGwgbm90IHN0b3AgdGhlIGV2ZW50IGZyb20gcHJvcGFnYXRpbmcgdXAgdG8gdGhlIGJyb3dzZXIuXHJcbiAgICAgKiBUaGVyZSBhcmUgc29tZSBrZXlzIHRoaXMgY2FuIGJlIGFubm95aW5nIGZvciwgbGlrZSB0aGUgYXJyb3cga2V5cyBvciBzcGFjZSBiYXIsIHdoaWNoIG1ha2UgdGhlIGJyb3dzZXIgd2luZG93IHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGBhZGRDYXB0dXJlYCBtZXRob2QgZW5hYmxlcyBjb25zdW1pbmcga2V5Ym9hcmQgZXZlbnQgZm9yIHNwZWNpZmljIGtleXMgc28gaXQgZG9lc24ndCBidWJibGUgdXAgdG8gdGhlIHRoZSBicm93c2VyXHJcbiAgICAgKiBhbmQgY2F1c2UgdGhlIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvci5cclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBrZXlib2FyZCBjYXB0dXJlcyBhcmUgZ2xvYmFsLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4gYSBTY2VuZSwgdG8gc2F5IHByZXZlbnRcclxuICAgICAqIHRoZSBTUEFDRSBCQVIgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSBzY3JvbGwsIHRoZW4gaXQgd2lsbCBwcmV2ZW50IGl0IGZvciBhbnkgU2NlbmUgaW4geW91ciBnYW1lLCBub3QganVzdCB0aGUgY2FsbGluZyBvbmUuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcGFzcyBpbiBhIHNpbmdsZSBrZXkgY29kZSB2YWx1ZSwgb3IgYW4gYXJyYXkgb2Yga2V5IGNvZGVzLCBvciBhIHN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRDYXB0dXJlKDYyKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBBbiBhcnJheSBvZiBrZXkgY29kZXM6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuaW5wdXQua2V5Ym9hcmQuYWRkQ2FwdHVyZShbIDYyLCA2MywgNjQgXSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogT3IgYSBzdHJpbmc6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuaW5wdXQua2V5Ym9hcmQuYWRkQ2FwdHVyZSgnVyxTLEEsRCcpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRvIHVzZSBub24tYWxwaGEgbnVtZXJpYyBrZXlzLCB1c2UgYSBzdHJpbmcsIHN1Y2ggYXMgJ1VQJywgJ1NQQUNFJyBvciAnTEVGVCcuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIGFycmF5IG1peGluZyBib3RoIHN0cmluZ3MgYW5kIGtleSBjb2RlIGludGVnZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGVyZSBhcmUgYWN0aXZlIGNhcHR1cmVzIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBgcHJldmVudERlZmF1bHRgIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI2FkZENhcHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8aW50ZWdlcltdfGFueVtdKX0ga2V5Y29kZSAtIFRoZSBLZXkgQ29kZXMgdG8gZW5hYmxlIGNhcHR1cmUgZm9yLCBwcmV2ZW50aW5nIHRoZW0gcmVhY2hpbmcgdGhlIGJyb3dzZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZENhcHR1cmU6IGZ1bmN0aW9uIChrZXljb2RlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2Yga2V5Y29kZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXljb2RlID0ga2V5Y29kZS5zcGxpdCgnLCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtleWNvZGUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5Y29kZSA9IFsga2V5Y29kZSBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gdGhpcy5jYXB0dXJlcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXljb2RlLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvZGUgPSBrZXljb2RlW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29kZSA9IEtleUNvZGVzW2NvZGUudHJpbSgpLnRvVXBwZXJDYXNlKCldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FwdHVyZXMuaW5kZXhPZihjb2RlKSA9PT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhcHR1cmVzLnB1c2goY29kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBjYXB0dXJlcy5sZW5ndGggPiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYW4gZXhpc3Rpbmcga2V5IGNhcHR1cmUuXHJcbiAgICAgKiBcclxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQga2V5Ym9hcmQgY2FwdHVyZXMgYXJlIGdsb2JhbC4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIGEgU2NlbmUsIHRvIHJlbW92ZVxyXG4gICAgICogdGhlIGNhcHR1cmUgb2YgYSBrZXksIHRoZW4gaXQgd2lsbCByZW1vdmUgaXQgZm9yIGFueSBTY2VuZSBpbiB5b3VyIGdhbWUsIG5vdCBqdXN0IHRoZSBjYWxsaW5nIG9uZS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBwYXNzIGluIGEgc2luZ2xlIGtleSBjb2RlIHZhbHVlLCBvciBhbiBhcnJheSBvZiBrZXkgY29kZXMsIG9yIGEgc3RyaW5nOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LmtleWJvYXJkLnJlbW92ZUNhcHR1cmUoNjIpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIEFuIGFycmF5IG9mIGtleSBjb2RlczpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5yZW1vdmVDYXB0dXJlKFsgNjIsIDYzLCA2NCBdKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBPciBhIHN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5yZW1vdmVDYXB0dXJlKCdXLFMsQSxEJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVG8gdXNlIG5vbi1hbHBoYSBudW1lcmljIGtleXMsIHVzZSBhIHN0cmluZywgc3VjaCBhcyAnVVAnLCAnU1BBQ0UnIG9yICdMRUZUJy5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gYXJyYXkgbWl4aW5nIGJvdGggc3RyaW5ncyBhbmQga2V5IGNvZGUgaW50ZWdlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZXJlIGFyZSBubyBjYXB0dXJlcyBsZWZ0IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBgcHJldmVudERlZmF1bHRgIHByb3BlcnR5IGlzIHNldCB0byBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkTWFuYWdlciNyZW1vdmVDYXB0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfGludGVnZXJbXXxhbnlbXSl9IGtleWNvZGUgLSBUaGUgS2V5IENvZGVzIHRvIGRpc2FibGUgY2FwdHVyZSBmb3IsIGFsbG93aW5nIHRoZW0gcmVhY2hpbmcgdGhlIGJyb3dzZXIgYWdhaW4uXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNhcHR1cmU6IGZ1bmN0aW9uIChrZXljb2RlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2Yga2V5Y29kZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXljb2RlID0ga2V5Y29kZS5zcGxpdCgnLCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtleWNvZGUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5Y29kZSA9IFsga2V5Y29kZSBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gdGhpcy5jYXB0dXJlcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXljb2RlLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvZGUgPSBrZXljb2RlW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29kZSA9IEtleUNvZGVzW2NvZGUudG9VcHBlckNhc2UoKV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEFycmF5UmVtb3ZlKGNhcHR1cmVzLCBjb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBjYXB0dXJlcy5sZW5ndGggPiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGtleWJvYXJkIGNhcHR1cmVzIGFuZCBzZXRzIHRoZSBgcHJldmVudERlZmF1bHRgIHByb3BlcnR5IHRvIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI2NsZWFyQ2FwdHVyZXNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgY2xlYXJDYXB0dXJlczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNhcHR1cmVzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMucHJldmVudERlZmF1bHQgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIEtleWJvYXJkIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRNYW5hZ2VyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhckNhcHR1cmVzKCk7XHJcblxyXG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmdhbWUuZXZlbnRzLm9mZihHYW1lRXZlbnRzLlBPU1RfUkVOREVSLCB0aGlzLnBvc3RVcGRhdGUsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBLZXlib2FyZE1hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4vZXZlbnRzJyk7XHJcbnZhciBHYW1lRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vY29yZS9ldmVudHMnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBJbnB1dEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgSW5wdXRQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL0lucHV0UGx1Z2luQ2FjaGUnKTtcclxudmFyIEtleSA9IHJlcXVpcmUoJy4va2V5cy9LZXknKTtcclxudmFyIEtleUNvZGVzID0gcmVxdWlyZSgnLi9rZXlzL0tleUNvZGVzJyk7XHJcbnZhciBLZXlDb21ibyA9IHJlcXVpcmUoJy4vY29tYm8vS2V5Q29tYm8nKTtcclxudmFyIEtleU1hcCA9IHJlcXVpcmUoJy4va2V5cy9LZXlNYXAnKTtcclxudmFyIFNuYXBGbG9vciA9IHJlcXVpcmUoJy4uLy4uL21hdGgvc25hcC9TbmFwRmxvb3InKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBLZXlib2FyZCBQbHVnaW4gaXMgYW4gaW5wdXQgcGx1Z2luIHRoYXQgYmVsb25ncyB0byB0aGUgU2NlbmUtb3duZWQgSW5wdXQgc3lzdGVtLlxyXG4gKiBcclxuICogSXRzIHJvbGUgaXMgdG8gbGlzdGVuIGZvciBuYXRpdmUgRE9NIEtleWJvYXJkIEV2ZW50cyBhbmQgdGhlbiBwcm9jZXNzIHRoZW0uXHJcbiAqIFxyXG4gKiBZb3UgZG8gbm90IG5lZWQgdG8gY3JlYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHksIHRoZSBJbnB1dCBzeXN0ZW0gd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgaXQgYXV0b21hdGljYWxseS5cclxuICogXHJcbiAqIFlvdSBjYW4gYWNjZXNzIGl0IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmcgYHRoaXMuaW5wdXQua2V5Ym9hcmRgLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbzpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmlucHV0LmtleWJvYXJkLm9uKCdrZXlkb3duJywgY2FsbGJhY2ssIGNvbnRleHQpO1xyXG4gKiBgYGBcclxuICpcclxuICogT3IsIHRvIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBrZXk6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMuaW5wdXQua2V5Ym9hcmQub24oJ2tleWRvd24tQScsIGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFlvdSBjYW4gYWxzbyBjcmVhdGUgS2V5IG9iamVjdHMsIHdoaWNoIHlvdSBjYW4gdGhlbiBwb2xsIGluIHlvdXIgZ2FtZSBsb29wOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBzcGFjZUJhciA9IHRoaXMuaW5wdXQua2V5Ym9hcmQuYWRkS2V5KFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5TUEFDRSk7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcGFyYWxsZWwgU2NlbmVzLCBlYWNoIHRyeWluZyB0byBnZXQga2V5Ym9hcmQgaW5wdXQsIGJlIHN1cmUgdG8gZGlzYWJsZSBjYXB0dXJlIG9uIHRoZW0gdG8gc3RvcCB0aGVtIGZyb21cclxuICogc3RlYWxpbmcgaW5wdXQgZnJvbSBhbm90aGVyIFNjZW5lIGluIHRoZSBsaXN0LiBZb3UgY2FuIGRvIHRoaXMgd2l0aCBgdGhpcy5pbnB1dC5rZXlib2FyZC5lbmFibGVkID0gZmFsc2VgIHdpdGhpbiB0aGVcclxuICogU2NlbmUgdG8gc3RvcCBhbGwgaW5wdXQsIG9yIGB0aGlzLmlucHV0LmtleWJvYXJkLnByZXZlbnREZWZhdWx0ID0gZmFsc2VgIHRvIHN0b3AgYSBTY2VuZSBoYWx0aW5nIGlucHV0IG9uIGFub3RoZXIgU2NlbmUuXHJcbiAqXHJcbiAqIF9Ob3RlXzogTWFueSBrZXlib2FyZHMgYXJlIHVuYWJsZSB0byBwcm9jZXNzIGNlcnRhaW4gY29tYmluYXRpb25zIG9mIGtleXMgZHVlIHRvIGhhcmR3YXJlIGxpbWl0YXRpb25zIGtub3duIGFzIGdob3N0aW5nLlxyXG4gKiBTZWUgaHR0cDovL3d3dy5odG1sNWdhbWVkZXZzLmNvbS90b3BpYy80ODc2LWltcG9zc2libGUtdG8tdXNlLW1vcmUtdGhhbi0yLWtleWJvYXJkLWlucHV0LWJ1dHRvbnMtYXQtdGhlLXNhbWUtdGltZS8gZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogQWxzbyBwbGVhc2UgYmUgYXdhcmUgdGhhdCBjZXJ0YWluIGJyb3dzZXIgZXh0ZW5zaW9ucyBjYW4gZGlzYWJsZSBvciBvdmVycmlkZSBQaGFzZXIga2V5Ym9hcmQgaGFuZGxpbmcuXHJcbiAqIEZvciBleGFtcGxlIHRoZSBDaHJvbWUgZXh0ZW5zaW9uIHZpbWl1bSBpcyBrbm93biB0byBkaXNhYmxlIFBoYXNlciBmcm9tIHVzaW5nIHRoZSBEIGtleSwgd2hpbGUgRXZlck5vdGUgZGlzYWJsZXMgdGhlIGJhY2t0aWNrIGtleS5cclxuICogQW5kIHRoZXJlIGFyZSBvdGhlcnMuIFNvLCBwbGVhc2UgY2hlY2sgeW91ciBleHRlbnNpb25zIGJlZm9yZSBvcGVuaW5nIFBoYXNlciBpc3N1ZXMgYWJvdXQga2V5cyB0aGF0IGRvbid0IHdvcmsuXHJcbiAqXHJcbiAqIEBjbGFzcyBLZXlib2FyZFBsdWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLklucHV0LktleWJvYXJkXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LklucHV0UGx1Z2lufSBzY2VuZUlucHV0UGx1Z2luIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIElucHV0IFBsdWdpbiB0aGF0IHRoZSBLZXlib2FyZFBsdWdpbiBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIEtleWJvYXJkUGx1Z2luID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBLZXlib2FyZFBsdWdpbiAoc2NlbmVJbnB1dFBsdWdpbilcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGNvcmUgZ2FtZSwgc28gd2UgY2FuIGxpc3RlbiBmb3IgdmlzaWJpbGl0eSBldmVudHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gc2NlbmVJbnB1dFBsdWdpbi5zeXN0ZW1zLmdhbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IHRoaXMgSW5wdXQgUGx1Z2luIGlzIHJlc3BvbnNpYmxlIGZvci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZUlucHV0UGx1Z2luLnNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBTZXR0aW5ncy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNzZXR0aW5nc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuU2NlbmVzLlNldHRpbmdzT2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5zY2VuZS5zeXMuc2V0dGluZ3M7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBJbnB1dCBQbHVnaW4gdGhhdCBjcmVhdGVkIHRoaXMgS2V5Ym9hcmQgUGx1Z2luLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI3NjZW5lSW5wdXRQbHVnaW5cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LklucHV0UGx1Z2lufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4gPSBzY2VuZUlucHV0UGx1Z2luO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIEtleWJvYXJkIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuSW5wdXRQbHVnaW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHNjZW5lSW5wdXRQbHVnaW4ubWFuYWdlci5rZXlib2FyZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBib29sZWFuIHRoYXQgY29udHJvbHMgaWYgdGhpcyBLZXlib2FyZCBQbHVnaW4gaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgICAgICogQ2FuIGJlIHRvZ2dsZWQgb24gdGhlIGZseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNlbmFibGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBLZXkgb2JqZWN0cyB0byBwcm9jZXNzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2tleXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleVtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgS2V5Q29tYm8gb2JqZWN0cyB0byBwcm9jZXNzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2NvbWJvc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm9bXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb21ib3MgPSBbXTtcclxuXHJcbiAgICAgICAgc2NlbmVJbnB1dFBsdWdpbi5wbHVnaW5FdmVudHMub25jZShJbnB1dEV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lSW5wdXRQbHVnaW4ucGx1Z2luRXZlbnRzLm9uKElucHV0RXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuaW5wdXQ7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IEdldFZhbHVlKHNldHRpbmdzLCAna2V5Ym9hcmQnLCB0cnVlKTtcclxuXHJcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gR2V0VmFsdWUoc2V0dGluZ3MsICdrZXlib2FyZC5jYXB0dXJlJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChjYXB0dXJlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2FwdHVyZXMoY2FwdHVyZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZUlucHV0UGx1Z2luLnBsdWdpbkV2ZW50cy5vbmNlKElucHV0RXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI3N0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zY2VuZUlucHV0UGx1Z2luLm1hbmFnZXIudXNlUXVldWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4ucGx1Z2luRXZlbnRzLm9uKElucHV0RXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4ubWFuYWdlci5ldmVudHMub24oSW5wdXRFdmVudHMuTUFOQUdFUl9QUk9DRVNTLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNjZW5lSW5wdXRQbHVnaW4ucGx1Z2luRXZlbnRzLm9uY2UoSW5wdXRFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuQkxVUiwgdGhpcy5yZXNldEtleXMsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgYm90aCB0aGlzIHBsdWdpbiBhbmQgdGhlIFNjZW5lIHRvIHdoaWNoIGl0IGJlbG9uZ3MgaXMgYWN0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2lzQWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwbHVnaW4gYW5kIHRoZSBTY2VuZSBpdCBiZWxvbmdzIHRvIGlzIGFjdGl2ZS5cclxuICAgICAqL1xyXG4gICAgaXNBY3RpdmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmVuYWJsZWQgJiYgdGhpcy5zY2VuZS5zeXMuaXNBY3RpdmUoKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnkgZGVmYXVsdCB3aGVuIGEga2V5IGlzIHByZXNzZWQgUGhhc2VyIHdpbGwgbm90IHN0b3AgdGhlIGV2ZW50IGZyb20gcHJvcGFnYXRpbmcgdXAgdG8gdGhlIGJyb3dzZXIuXHJcbiAgICAgKiBUaGVyZSBhcmUgc29tZSBrZXlzIHRoaXMgY2FuIGJlIGFubm95aW5nIGZvciwgbGlrZSB0aGUgYXJyb3cga2V5cyBvciBzcGFjZSBiYXIsIHdoaWNoIG1ha2UgdGhlIGJyb3dzZXIgd2luZG93IHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGBhZGRDYXB0dXJlYCBtZXRob2QgZW5hYmxlcyBjb25zdW1pbmcga2V5Ym9hcmQgZXZlbnRzIGZvciBzcGVjaWZpYyBrZXlzLCBzbyB0aGV5IGRvbid0IGJ1YmJsZSB1cCB0aGUgYnJvd3NlclxyXG4gICAgICogYW5kIGNhdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9ycy5cclxuICAgICAqIFxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCBrZXlib2FyZCBjYXB0dXJlcyBhcmUgZ2xvYmFsLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4gYSBTY2VuZSwgdG8gc2F5IHByZXZlbnRcclxuICAgICAqIHRoZSBTUEFDRSBCQVIgZnJvbSB0cmlnZ2VyaW5nIGEgcGFnZSBzY3JvbGwsIHRoZW4gaXQgd2lsbCBwcmV2ZW50IGl0IGZvciBhbnkgU2NlbmUgaW4geW91ciBnYW1lLCBub3QganVzdCB0aGUgY2FsbGluZyBvbmUuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcGFzcyBhIHNpbmdsZSBrZXkgY29kZSB2YWx1ZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRDYXB0dXJlKDYyKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBBbiBhcnJheSBvZiBrZXkgY29kZXM6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuaW5wdXQua2V5Ym9hcmQuYWRkQ2FwdHVyZShbIDYyLCA2MywgNjQgXSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogT3IsIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRDYXB0dXJlKCdXLFMsQSxEJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVG8gdXNlIG5vbi1hbHBoYSBudW1lcmljIGtleXMsIHVzZSBhIHN0cmluZywgc3VjaCBhcyAnVVAnLCAnU1BBQ0UnIG9yICdMRUZUJy5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gYXJyYXkgbWl4aW5nIGJvdGggc3RyaW5ncyBhbmQga2V5IGNvZGUgaW50ZWdlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jYWRkQ2FwdHVyZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxpbnRlZ2VyW118YW55W10pfSBrZXljb2RlIC0gVGhlIEtleSBDb2RlcyB0byBlbmFibGUgZXZlbnQgY2FwdHVyZSBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBLZXlib2FyZFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFkZENhcHR1cmU6IGZ1bmN0aW9uIChrZXljb2RlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5hZGRDYXB0dXJlKGtleWNvZGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV4aXN0aW5nIGtleSBjYXB0dXJlLlxyXG4gICAgICogXHJcbiAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGtleWJvYXJkIGNhcHR1cmVzIGFyZSBnbG9iYWwuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiBhIFNjZW5lLCB0byByZW1vdmVcclxuICAgICAqIHRoZSBjYXB0dXJlIG9mIGEga2V5LCB0aGVuIGl0IHdpbGwgcmVtb3ZlIGl0IGZvciBhbnkgU2NlbmUgaW4geW91ciBnYW1lLCBub3QganVzdCB0aGUgY2FsbGluZyBvbmUuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcGFzcyBhIHNpbmdsZSBrZXkgY29kZSB2YWx1ZTpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5yZW1vdmVDYXB0dXJlKDYyKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBBbiBhcnJheSBvZiBrZXkgY29kZXM6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMuaW5wdXQua2V5Ym9hcmQucmVtb3ZlQ2FwdHVyZShbIDYyLCA2MywgNjQgXSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogT3IsIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZzpcclxuICAgICAqIFxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5yZW1vdmVDYXB0dXJlKCdXLFMsQSxEJyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogVG8gdXNlIG5vbi1hbHBoYSBudW1lcmljIGtleXMsIHVzZSBhIHN0cmluZywgc3VjaCBhcyAnVVAnLCAnU1BBQ0UnIG9yICdMRUZUJy5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gYXJyYXkgbWl4aW5nIGJvdGggc3RyaW5ncyBhbmQga2V5IGNvZGUgaW50ZWdlcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jcmVtb3ZlQ2FwdHVyZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxpbnRlZ2VyW118YW55W10pfSBrZXljb2RlIC0gVGhlIEtleSBDb2RlcyB0byBkaXNhYmxlIGV2ZW50IGNhcHR1cmUgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5Ym9hcmRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVDYXB0dXJlOiBmdW5jdGlvbiAoa2V5Y29kZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1hbmFnZXIucmVtb3ZlQ2FwdHVyZShrZXljb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUga2V5Ym9hcmQgY2FwdHVyZXMgY3VycmVudGx5IGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jZ2V0Q2FwdHVyZXNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcltdfSBBbiBhcnJheSBvZiBhbGwgdGhlIGN1cnJlbnRseSBjYXB0dXJpbmcga2V5IGNvZGVzLlxyXG4gICAgICovXHJcbiAgICBnZXRDYXB0dXJlczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmNhcHR1cmVzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbG93cyBQaGFzZXIgdG8gcHJldmVudCBhbnkga2V5IGNhcHR1cmVzIHlvdSBtYXkgaGF2ZSBkZWZpbmVkIGZyb20gYnViYmxpbmcgdXAgdGhlIGJyb3dzZXIuXHJcbiAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIHJlLWVuYWJsZSBldmVudCBjYXB0dXJpbmcgaWYgeW91IGhhZCBwYXVzZWQgaXQgdmlhIGBkaXNhYmxlR2xvYmFsQ2FwdHVyZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jZW5hYmxlR2xvYmFsQ2FwdHVyZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5Ym9hcmRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBlbmFibGVHbG9iYWxDYXB0dXJlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5wcmV2ZW50RGVmYXVsdCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2FibGVzIFBoYXNlciBmcm9tIHByZXZlbnRpbmcgYW55IGtleSBjYXB0dXJlcyB5b3UgbWF5IGhhdmUgZGVmaW5lZCwgd2l0aG91dCBhY3R1YWxseSByZW1vdmluZyB0aGVtLlxyXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIGV2ZW50IGNhcHR1cmluZyBpZiwgZm9yIGV4YW1wbGUsIHlvdSBzd2FwIHRvIGEgRE9NIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jZGlzYWJsZUdsb2JhbENhcHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEtleWJvYXJkUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZGlzYWJsZUdsb2JhbENhcHR1cmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnByZXZlbnREZWZhdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYWxsIGtleWJvYXJkIGNhcHR1cmVzLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGdsb2JhbCBjaGFuZ2UuIEl0IHdpbGwgY2xlYXIgYWxsIGV2ZW50IGNhcHR1cmVzIGFjcm9zcyB5b3VyIGdhbWUsIG5vdCBqdXN0IGZvciB0aGlzIHNwZWNpZmljIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2NsZWFyQ2FwdHVyZXNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEtleWJvYXJkUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2xlYXJDYXB0dXJlczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuY2xlYXJDYXB0dXJlcygpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIDQgaG90a2V5cyBmb3IgVXAsIERvd24sIExlZnQgYW5kIFJpZ2h0LCBhbmQgYWxzbyBTcGFjZSBCYXIgYW5kIHNoaWZ0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2NyZWF0ZUN1cnNvcktleXNcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuSW5wdXQuS2V5Ym9hcmQuQ3Vyc29yS2V5c30gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXM6IGB1cGAsIGBkb3duYCwgYGxlZnRgLCBgcmlnaHRgLCBgc3BhY2VgIGFuZCBgc2hpZnRgLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDdXJzb3JLZXlzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEtleXMoe1xyXG4gICAgICAgICAgICB1cDogS2V5Q29kZXMuVVAsXHJcbiAgICAgICAgICAgIGRvd246IEtleUNvZGVzLkRPV04sXHJcbiAgICAgICAgICAgIGxlZnQ6IEtleUNvZGVzLkxFRlQsXHJcbiAgICAgICAgICAgIHJpZ2h0OiBLZXlDb2Rlcy5SSUdIVCxcclxuICAgICAgICAgICAgc3BhY2U6IEtleUNvZGVzLlNQQUNFLFxyXG4gICAgICAgICAgICBzaGlmdDogS2V5Q29kZXMuU0hJRlRcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHByYWN0aWNhbCB3YXkgdG8gY3JlYXRlIGFuIG9iamVjdCBjb250YWluaW5nIHVzZXIgc2VsZWN0ZWQgaG90a2V5cy5cclxuICAgICAqXHJcbiAgICAgKiBGb3IgZXhhbXBsZTpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LmtleWJvYXJkLmFkZEtleXMoeyAndXAnOiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuVywgJ2Rvd24nOiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuUyB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiB3b3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgKGB1cGAgYW5kIGBkb3duYCkgbWFwcGVkIHRvIFcgYW5kIFMge0BsaW5rIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9IG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBhbHNvIHBhc3MgaW4gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LmtleWJvYXJkLmFkZEtleXMoJ1csUyxBLEQnKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFdoaWNoIHdpbGwgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIFcsIFMsIEEgYW5kIEQgbWFwcGVkIHRvIHRoZSByZWxldmFudCBLZXkgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBUbyB1c2Ugbm9uLWFscGhhIG51bWVyaWMga2V5cywgdXNlIGEgc3RyaW5nLCBzdWNoIGFzICdVUCcsICdTUEFDRScgb3IgJ0xFRlQnLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2FkZEtleXNcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhvYmplY3R8c3RyaW5nKX0ga2V5cyAtIEFuIG9iamVjdCBjb250YWluaW5nIEtleSBDb2Rlcywgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZW5hYmxlQ2FwdHVyZT10cnVlXSAtIEF1dG9tYXRpY2FsbHkgY2FsbCBgcHJldmVudERlZmF1bHRgIG9uIHRoZSBuYXRpdmUgRE9NIGJyb3dzZXIgZXZlbnQgZm9yIHRoZSBrZXkgY29kZXMgYmVpbmcgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtlbWl0T25SZXBlYXQ9ZmFsc2VdIC0gQ29udHJvbHMgaWYgdGhlIEtleSB3aWxsIGNvbnRpbnVvdXNseSBlbWl0IGEgJ2Rvd24nIGV2ZW50IHdoaWxlIGJlaW5nIGhlbGQgZG93biAodHJ1ZSksIG9yIGVtaXQgdGhlIGV2ZW50IGp1c3Qgb25jZSAoZmFsc2UsIHRoZSBkZWZhdWx0KS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIEtleSBvYmplY3RzIG1hcHBlZCB0byB0aGUgaW5wdXQgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgYWRkS2V5czogZnVuY3Rpb24gKGtleXMsIGVuYWJsZUNhcHR1cmUsIGVtaXRPblJlcGVhdClcclxuICAgIHtcclxuICAgICAgICBpZiAoZW5hYmxlQ2FwdHVyZSA9PT0gdW5kZWZpbmVkKSB7IGVuYWJsZUNhcHR1cmUgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKGVtaXRPblJlcGVhdCA9PT0gdW5kZWZpbmVkKSB7IGVtaXRPblJlcGVhdCA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBrZXlzID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLnNwbGl0KCcsJyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50S2V5ID0ga2V5c1tpXS50cmltKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2N1cnJlbnRLZXldID0gdGhpcy5hZGRLZXkoY3VycmVudEtleSwgZW5hYmxlQ2FwdHVyZSwgZW1pdE9uUmVwZWF0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4ga2V5cylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSB0aGlzLmFkZEtleShrZXlzW2tleV0sIGVuYWJsZUNhcHR1cmUsIGVtaXRPblJlcGVhdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIEtleSBvYmplY3QgdG8gdGhpcyBLZXlib2FyZCBQbHVnaW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGdpdmVuIGFyZ3VtZW50IGNhbiBiZSBlaXRoZXIgYW4gZXhpc3RpbmcgS2V5IG9iamVjdCwgYSBzdHJpbmcsIHN1Y2ggYXMgYEFgIG9yIGBTUEFDRWAsIG9yIGEga2V5IGNvZGUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgYSBLZXkgb2JqZWN0IGlzIGdpdmVuLCBhbmQgb25lIGFscmVhZHkgZXhpc3RzIG1hdGNoaW5nIHRoZSBzYW1lIGtleSBjb2RlLCB0aGUgZXhpc3Rpbmcgb25lIGlzIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jYWRkS2V5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLklucHV0LktleWJvYXJkLktleXxzdHJpbmd8aW50ZWdlcil9IGtleSAtIEVpdGhlciBhIEtleSBvYmplY3QsIGEgc3RyaW5nLCBzdWNoIGFzIGBBYCBvciBgU1BBQ0VgLCBvciBhIGtleSBjb2RlIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZW5hYmxlQ2FwdHVyZT10cnVlXSAtIEF1dG9tYXRpY2FsbHkgY2FsbCBgcHJldmVudERlZmF1bHRgIG9uIHRoZSBuYXRpdmUgRE9NIGJyb3dzZXIgZXZlbnQgZm9yIHRoZSBrZXkgY29kZXMgYmVpbmcgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtlbWl0T25SZXBlYXQ9ZmFsc2VdIC0gQ29udHJvbHMgaWYgdGhlIEtleSB3aWxsIGNvbnRpbnVvdXNseSBlbWl0IGEgJ2Rvd24nIGV2ZW50IHdoaWxlIGJlaW5nIGhlbGQgZG93biAodHJ1ZSksIG9yIGVtaXQgdGhlIGV2ZW50IGp1c3Qgb25jZSAoZmFsc2UsIHRoZSBkZWZhdWx0KS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fSBUaGUgbmV3bHkgY3JlYXRlZCBLZXkgb2JqZWN0LCBvciBhIHJlZmVyZW5jZSB0byBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQgaW4gdGhlIGtleXMgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGFkZEtleTogZnVuY3Rpb24gKGtleSwgZW5hYmxlQ2FwdHVyZSwgZW1pdE9uUmVwZWF0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChlbmFibGVDYXB0dXJlID09PSB1bmRlZmluZWQpIHsgZW5hYmxlQ2FwdHVyZSA9IHRydWU7IH1cclxuICAgICAgICBpZiAoZW1pdE9uUmVwZWF0ID09PSB1bmRlZmluZWQpIHsgZW1pdE9uUmVwZWF0ID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGtleXMgPSB0aGlzLmtleXM7XHJcblxyXG4gICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBLZXkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaWR4ID0ga2V5cy5pbmRleE9mKGtleSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaWR4ID4gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleXNbaWR4XSA9IGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleXNba2V5LmtleUNvZGVdID0ga2V5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZW5hYmxlQ2FwdHVyZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDYXB0dXJlKGtleS5rZXlDb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAga2V5LnNldEVtaXRPblJlcGVhdChlbWl0T25SZXBlYXQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleSA9IEtleUNvZGVzW2tleS50b1VwcGVyQ2FzZSgpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgha2V5c1trZXldKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5c1trZXldID0gbmV3IEtleSh0aGlzLCBrZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVuYWJsZUNhcHR1cmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2FwdHVyZShrZXkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBrZXlzW2tleV0uc2V0RW1pdE9uUmVwZWF0KGVtaXRPblJlcGVhdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ga2V5c1trZXldO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBLZXkgb2JqZWN0IGZyb20gdGhpcyBLZXlib2FyZCBQbHVnaW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGdpdmVuIGFyZ3VtZW50IGNhbiBiZSBlaXRoZXIgYSBLZXkgb2JqZWN0LCBhIHN0cmluZywgc3VjaCBhcyBgQWAgb3IgYFNQQUNFYCwgb3IgYSBrZXkgY29kZSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNyZW1vdmVLZXlcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fHN0cmluZ3xpbnRlZ2VyKX0ga2V5IC0gRWl0aGVyIGEgS2V5IG9iamVjdCwgYSBzdHJpbmcsIHN1Y2ggYXMgYEFgIG9yIGBTUEFDRWAsIG9yIGEga2V5IGNvZGUgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXN0cm95PWZhbHNlXSAtIENhbGwgYEtleS5kZXN0cm95YCBvbiB0aGUgcmVtb3ZlZCBLZXkgb2JqZWN0P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5Ym9hcmRQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVLZXk6IGZ1bmN0aW9uIChrZXksIGRlc3Ryb3kpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRlc3Ryb3kgPT09IHVuZGVmaW5lZCkgeyBkZXN0cm95ID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGtleXMgPSB0aGlzLmtleXM7XHJcbiAgICAgICAgdmFyIHJlZjtcclxuXHJcbiAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIEtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpZHggPSBrZXlzLmluZGV4T2Yoa2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpZHggPiAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVmID0gdGhpcy5rZXlzW2lkeF07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlzW2lkeF0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSBLZXlDb2Rlc1trZXkudG9VcHBlckNhc2UoKV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoa2V5c1trZXldKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVmID0ga2V5c1trZXldO1xyXG5cclxuICAgICAgICAgICAga2V5c1trZXldID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlZilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlZi5wbHVnaW4gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlZi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgS2V5Q29tYm8uXHJcbiAgICAgKiBcclxuICAgICAqIEEgS2V5Q29tYm8gd2lsbCBsaXN0ZW4gZm9yIGEgc3BlY2lmaWMgc3RyaW5nIG9mIGtleXMgZnJvbSB0aGUgS2V5Ym9hcmQsIGFuZCB3aGVuIGl0IHJlY2VpdmVzIHRoZW1cclxuICAgICAqIGl0IHdpbGwgZW1pdCBhIGBrZXljb21ib21hdGNoYCBldmVudCBmcm9tIHRoaXMgS2V5Ym9hcmQgUGx1Z2luLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBrZXlzIHRvIGJlIGxpc3RlbmVkIGZvciBjYW4gYmUgZGVmaW5lZCBhczpcclxuICAgICAqXHJcbiAgICAgKiBBIHN0cmluZyAoaS5lLiAnQVRBUkknKVxyXG4gICAgICogQW4gYXJyYXkgb2YgZWl0aGVyIGludGVnZXJzIChrZXkgY29kZXMpIG9yIHN0cmluZ3MsIG9yIGEgbWl4dHVyZSBvZiBib3RoXHJcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzIChzdWNoIGFzIEtleSBvYmplY3RzKSB3aXRoIGEgcHVibGljICdrZXlDb2RlJyBwcm9wZXJ0eVxyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlLCB0byBsaXN0ZW4gZm9yIHRoZSBLb25hbWkgY29kZSAodXAsIHVwLCBkb3duLCBkb3duLCBsZWZ0LCByaWdodCwgbGVmdCwgcmlnaHQsIGIsIGEsIGVudGVyKVxyXG4gICAgICogeW91IGNvdWxkIHBhc3MgdGhlIGZvbGxvd2luZyBhcnJheSBvZiBrZXkgY29kZXM6XHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5pbnB1dC5rZXlib2FyZC5jcmVhdGVDb21ibyhbIDM4LCAzOCwgNDAsIDQwLCAzNywgMzksIDM3LCAzOSwgNjYsIDY1LCAxMyBdLCB7IHJlc2V0T25NYXRjaDogdHJ1ZSB9KTtcclxuICAgICAqXHJcbiAgICAgKiB0aGlzLmlucHV0LmtleWJvYXJkLm9uKCdrZXljb21ib21hdGNoJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0tvbmFtaSBDb2RlIGVudGVyZWQhJyk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIE9yLCB0byBsaXN0ZW4gZm9yIHRoZSB1c2VyIGVudGVyaW5nIHRoZSB3b3JkIFBIQVNFUjpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLmlucHV0LmtleWJvYXJkLmNyZWF0ZUNvbWJvKCdQSEFTRVInKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2NyZWF0ZUNvbWJvXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJbXXxvYmplY3RbXSl9IGtleXMgLSBUaGUga2V5cyB0aGF0IGNvbXByaXNlIHRoaXMgY29tYm8uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5JbnB1dC5LZXlib2FyZC5LZXlDb21ib0NvbmZpZ30gW2NvbmZpZ10gLSBBIEtleSBDb21ibyBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm99IFRoZSBuZXcgS2V5Q29tYm8gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDb21ibzogZnVuY3Rpb24gKGtleXMsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IEtleUNvbWJvKHRoaXMsIGtleXMsIGNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBLZXkgb2JqZWN0IGlzIGN1cnJlbnRseSBiZWluZyBoZWxkIGRvd24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIGNoZWNraW5nIHRoZSBgS2V5LmlzRG93bmAgcHJvcGVydHkgZGlyZWN0bHkgaXMgdGhhdCB5b3UgY2FuIHByb3ZpZGVcclxuICAgICAqIGEgZHVyYXRpb24gdG8gdGhpcyBtZXRob2QuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIGEga2V5IHByZXNzIHRvIGZpcmUgYSBidWxsZXQsIGJ1dCB5b3Ugb25seSB3YW50ZWRcclxuICAgICAqIGl0IHRvIGJlIGFibGUgdG8gZmlyZSBldmVyeSAxMDBtcywgdGhlbiB5b3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIGBkdXJhdGlvbmAgb2YgMTAwIGFuZCBpdFxyXG4gICAgICogd2lsbCBvbmx5IHJldHVybiBgdHJ1ZWAgZXZlcnkgMTAwbXMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBLZXlib2FyZCBQbHVnaW4gaGFzIGJlZW4gZGlzYWJsZWQsIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI2NoZWNrRG93blxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleX0ga2V5IC0gQSBLZXkgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkdXJhdGlvbj0wXSAtIFRoZSBkdXJhdGlvbiB3aGljaCBtdXN0IGhhdmUgZWxhcHNlZCBiZWZvcmUgdGhpcyBLZXkgaXMgY29uc2lkZXJlZCBhcyBiZWluZyBkb3duLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIEtleSBpcyBkb3duIHdpdGhpbiB0aGUgZHVyYXRpb24gc3BlY2lmaWVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgY2hlY2tEb3duOiBmdW5jdGlvbiAoa2V5LCBkdXJhdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVkICYmIGtleS5pc0Rvd24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdCA9IFNuYXBGbG9vcih0aGlzLnRpbWUgLSBrZXkudGltZURvd24sIGR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ID4ga2V5Ll90aWNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXkuX3RpY2sgPSB0O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgdXBkYXRlIGhhbmRsZXIgY2FsbGVkIGJ5IHRoZSBJbnB1dCBQbHVnaW4sIHdoaWNoIGlzIGluIHR1cm4gaW52b2tlZCBieSB0aGUgR2FtZSBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI3VwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBxdWV1ZSA9IHRoaXMubWFuYWdlci5xdWV1ZTtcclxuICAgICAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSB8fCBsZW4gPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcclxuXHJcbiAgICAgICAgLy8gIFByb2Nlc3MgdGhlIGV2ZW50IHF1ZXVlLCBkaXNwYXRjaGluZyBhbGwgb2YgdGhlIGV2ZW50cyB0aGF0IGhhdmUgc3RvcmVkIHVwXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBldmVudCA9IHF1ZXVlW2ldO1xyXG4gICAgICAgICAgICB2YXIgY29kZSA9IGV2ZW50LmtleUNvZGU7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2NvZGVdO1xyXG4gICAgICAgICAgICB2YXIgcmVwZWF0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIChpdCdzIHRvbyBsYXRlIGZvciB0aGUgYnJvd3NlciB0byB1c2UgdGhlbSBhbnl3YXksIHNvIHdlIG1heSBhcyB3ZWxsKVxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsbGVkID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBFdmVudCBhbGxvd2VkIHRvIGZsb3cgYWNyb3NzIGFsbCBoYW5kbGVycyBpbiB0aGlzIFNjZW5lLCBhbmQgYW55IG90aGVyIFNjZW5lIGluIHRoZSBTY2VuZSBsaXN0XHJcbiAgICAgICAgICAgICAgICBldmVudC5jYW5jZWxsZWQgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBXb24ndCByZWFjaCBhbnkgbW9yZSBsb2NhbCAoU2NlbmUgbGV2ZWwpIGhhbmRsZXJzXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmNhbmNlbGxlZCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvLyAgV29uJ3QgcmVhY2ggYW55IG1vcmUgaGFuZGxlcnMgaW4gYW55IFNjZW5lIGZ1cnRoZXIgZG93biB0aGUgU2NlbmUgbGlzdFxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5jYW5jZWxsZWQgPSAtMTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxsZWQgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgVGhpcyBldmVudCBoYXMgYmVlbiBzdG9wcGVkIGZyb20gYnJvYWRjYXN0aW5nIHRvIGFueSBvdGhlciBTY2VuZSwgc28gYWJvcnQuXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEtleSBzcGVjaWZpYyBjYWxsYmFjayBmaXJzdFxyXG4gICAgICAgICAgICAgICAgaWYgKGtleSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSBrZXkuaXNEb3duO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBrZXkub25Eb3duKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmNhbmNlbGxlZCAmJiAoIWtleSB8fCAhcmVwZWF0KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoS2V5TWFwW2NvZGVdKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5LRVlfRE9XTiArIEtleU1hcFtjb2RlXSwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIERlcHJlY2F0ZWQsIGtlcHQgaW4gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAzLjE1XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICBUbyBiZSByZW1vdmVkIGJ5IDMuMjAuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgna2V5ZG93bl8nICsgS2V5TWFwW2NvZGVdLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmNhbmNlbGxlZClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQU5ZX0tFWV9ET1dOLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEtleSBzcGVjaWZpYyBjYWxsYmFjayBmaXJzdFxyXG4gICAgICAgICAgICAgICAgaWYgKGtleSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXkub25VcChldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5jYW5jZWxsZWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEtleU1hcFtjb2RlXSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuS0VZX1VQICsgS2V5TWFwW2NvZGVdLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgRGVwcmVjYXRlZCwga2VwdCBpbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDMuMTVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFRvIGJlIHJlbW92ZWQgYnkgMy4yMC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdrZXl1cF8nICsgS2V5TWFwW2NvZGVdLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmNhbmNlbGxlZClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQU5ZX0tFWV9VUCwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIFJlc2V0IHRoZSBjYW5jZWwgc3RhdGUgZm9yIG90aGVyIFNjZW5lcyB0byB1c2VcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmNhbmNlbGxlZCA9PT0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuY2FuY2VsbGVkID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgYWxsIEtleSBvYmplY3RzIGNyZWF0ZWQgYnkgX3RoaXNfIEtleWJvYXJkIFBsdWdpbiBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdW4tcHJlc3NlZCBzdGF0ZXMuXHJcbiAgICAgKiBUaGlzIGNhbiBvbmx5IHJlc2V0IGtleXMgY3JlYXRlZCB2aWEgdGhlIGBhZGRLZXlgLCBgYWRkS2V5c2Agb3IgYGNyZWF0ZUN1cnNvcktleXNgIG1ldGhvZHMuXHJcbiAgICAgKiBJZiB5b3UgaGF2ZSBjcmVhdGVkIGEgS2V5IG9iamVjdCBkaXJlY3RseSB5b3UnbGwgbmVlZCB0byByZXNldCBpdCB5b3Vyc2VsZi5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgS2V5Ym9hcmQgUGx1Z2luIHNodXRzIGRvd24sIGJ1dCBjYW4gYmVcclxuICAgICAqIGludm9rZWQgZGlyZWN0bHkgYXQgYW55IHRpbWUgeW91IHJlcXVpcmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW4jcmVzZXRLZXlzXHJcbiAgICAgKiBAc2luY2UgMy4xNS4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBLZXlib2FyZFBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0S2V5czogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEJlY2F1c2UgaXQncyBhIHNwYXJzZWx5IHBvcHVsYXRlZCBhcnJheVxyXG4gICAgICAgICAgICBpZiAoa2V5c1tpXSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAga2V5c1tpXS5yZXNldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHV0cyB0aGlzIEtleWJvYXJkIFBsdWdpbiBkb3duLiBUaGlzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGFza3M6XHJcbiAgICAgKiBcclxuICAgICAqIDEgLSBSZXNldHMgYWxsIGtleXMgY3JlYXRlZCBieSB0aGlzIEtleWJvYXJkIHBsdWdpbi5cclxuICAgICAqIDIgLSBTdG9wcyBhbmQgcmVtb3ZlcyB0aGUga2V5Ym9hcmQgZXZlbnQgbGlzdGVuZXJzLlxyXG4gICAgICogMyAtIENsZWFycyBvdXQgYW55IHBlbmRpbmcgcmVxdWVzdHMgaW4gdGhlIHF1ZXVlLCB3aXRob3V0IHByb2Nlc3NpbmcgdGhlbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNldEtleXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2NlbmVJbnB1dFBsdWdpbi5tYW5hZ2VyLnVzZVF1ZXVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zY2VuZUlucHV0UGx1Z2luLnBsdWdpbkV2ZW50cy5vZmYoSW5wdXRFdmVudHMuVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmVJbnB1dFBsdWdpbi5tYW5hZ2VyLmV2ZW50cy5vZmYoSW5wdXRFdmVudHMuTUFOQUdFUl9QUk9DRVNTLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUuZXZlbnRzLm9mZihHYW1lRXZlbnRzLkJMVVIsIHRoaXMucmVzZXRLZXlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgS2V5Ym9hcmQgUGx1Z2luIGluc3RhbmNlIGFuZCBhbGwgcmVmZXJlbmNlcyBpdCBob2xkcywgcGx1cyBjbGVhcnMgb3V0IGxvY2FsIGFycmF5cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbiNkZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdmFyIGtleXMgPSB0aGlzLmtleXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBCZWNhdXNlIGl0J3MgYSBzcGFyc2VseSBwb3B1bGF0ZWQgYXJyYXlcclxuICAgICAgICAgICAgaWYgKGtleXNbaV0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleXNbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcclxuICAgICAgICB0aGlzLmNvbWJvcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZUlucHV0UGx1Z2luID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHRpbWUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2luI3RpbWVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICB0aW1lOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjZW5lSW5wdXRQbHVnaW4ubWFuYWdlci50aW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgS2V5Ym9hcmQgUGx1Z2luIGNsYXNzLCBpZiBlbmFibGVkIHZpYSB0aGUgYGlucHV0LmtleWJvYXJkYCBTY2VuZSBvciBHYW1lIENvbmZpZyBwcm9wZXJ0eS5cclxuICogVXNlIHRoaXMgdG8gY3JlYXRlIEtleSBvYmplY3RzIGFuZCBsaXN0ZW4gZm9yIGtleWJvYXJkIHNwZWNpZmljIGV2ZW50cy5cclxuICpcclxuICogQG5hbWUgUGhhc2VyLklucHV0LklucHV0UGx1Z2luI2tleWJvYXJkXHJcbiAqIEB0eXBlIHs/UGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2lufVxyXG4gKiBAc2luY2UgMy4xMC4wXHJcbiAqL1xyXG5JbnB1dFBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdLZXlib2FyZFBsdWdpbicsIEtleWJvYXJkUGx1Z2luLCAna2V5Ym9hcmQnLCAna2V5Ym9hcmQnLCAnaW5wdXRLZXlib2FyZCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBLZXlib2FyZFBsdWdpbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBLZXlDb21ibyBjbGFzcy5cclxuICogUmV0dXJuIGB0cnVlYCBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNvbWJvLCBgZmFsc2VgIGlmIG5vdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21iby5BZHZhbmNlS2V5Q29tYm9cclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIEtleWJvYXJkIEV2ZW50LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ib30gY29tYm8gLSBUaGUgS2V5Q29tYm8gb2JqZWN0IHRvIGFkdmFuY2UuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGNvbWJvLCBgZmFsc2VgIGlmIG5vdC5cclxuICovXHJcbnZhciBBZHZhbmNlS2V5Q29tYm8gPSBmdW5jdGlvbiAoZXZlbnQsIGNvbWJvKVxyXG57XHJcbiAgICBjb21iby50aW1lTGFzdE1hdGNoZWQgPSBldmVudC50aW1lU3RhbXA7XHJcbiAgICBjb21iby5pbmRleCsrO1xyXG5cclxuICAgIGlmIChjb21iby5pbmRleCA9PT0gY29tYm8uc2l6ZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBjb21iby5jdXJyZW50ID0gY29tYm8ua2V5Q29kZXNbY29tYm8uaW5kZXhdO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQWR2YW5jZUtleUNvbWJvO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIFByb2Nlc3NLZXlDb21ibyA9IHJlcXVpcmUoJy4vUHJvY2Vzc0tleUNvbWJvJyk7XHJcbnZhciBSZXNldEtleUNvbWJvID0gcmVxdWlyZSgnLi9SZXNldEtleUNvbWJvJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIEtleUNvbWJvIHdpbGwgbGlzdGVuIGZvciBhIHNwZWNpZmljIHN0cmluZyBvZiBrZXlzIGZyb20gdGhlIEtleWJvYXJkLCBhbmQgd2hlbiBpdCByZWNlaXZlcyB0aGVtXHJcbiAqIGl0IHdpbGwgZW1pdCBhIGBrZXljb21ib21hdGNoYCBldmVudCBmcm9tIHRoZSBLZXlib2FyZCBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBUaGUga2V5cyB0byBiZSBsaXN0ZW5lZCBmb3IgY2FuIGJlIGRlZmluZWQgYXM6XHJcbiAqXHJcbiAqIEEgc3RyaW5nIChpLmUuICdBVEFSSScpXHJcbiAqIEFuIGFycmF5IG9mIGVpdGhlciBpbnRlZ2VycyAoa2V5IGNvZGVzKSBvciBzdHJpbmdzLCBvciBhIG1peHR1cmUgb2YgYm90aFxyXG4gKiBBbiBhcnJheSBvZiBvYmplY3RzIChzdWNoIGFzIEtleSBvYmplY3RzKSB3aXRoIGEgcHVibGljICdrZXlDb2RlJyBwcm9wZXJ0eVxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgdG8gbGlzdGVuIGZvciB0aGUgS29uYW1pIGNvZGUgKHVwLCB1cCwgZG93biwgZG93biwgbGVmdCwgcmlnaHQsIGxlZnQsIHJpZ2h0LCBiLCBhLCBlbnRlcilcclxuICogeW91IGNvdWxkIHBhc3MgdGhlIGZvbGxvd2luZyBhcnJheSBvZiBrZXkgY29kZXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5pbnB1dC5rZXlib2FyZC5jcmVhdGVDb21ibyhbIDM4LCAzOCwgNDAsIDQwLCAzNywgMzksIDM3LCAzOSwgNjYsIDY1LCAxMyBdLCB7IHJlc2V0T25NYXRjaDogdHJ1ZSB9KTtcclxuICpcclxuICogdGhpcy5pbnB1dC5rZXlib2FyZC5vbigna2V5Y29tYm9tYXRjaCcsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gKiAgICAgY29uc29sZS5sb2coJ0tvbmFtaSBDb2RlIGVudGVyZWQhJyk7XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogT3IsIHRvIGxpc3RlbiBmb3IgdGhlIHVzZXIgZW50ZXJpbmcgdGhlIHdvcmQgUEhBU0VSOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMuaW5wdXQua2V5Ym9hcmQuY3JlYXRlQ29tYm8oJ1BIQVNFUicpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGNsYXNzIEtleUNvbWJvXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBsaXN0ZW5zIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjQU5ZX0tFWV9ET1dOXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlib2FyZFBsdWdpbn0ga2V5Ym9hcmRQbHVnaW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgS2V5Ym9hcmQgUGx1Z2luLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcltdfG9iamVjdFtdKX0ga2V5cyAtIFRoZSBrZXlzIHRoYXQgY29tcHJpc2UgdGhpcyBjb21iby5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm9Db25maWd9IFtjb25maWddIC0gQSBLZXkgQ29tYm8gY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqL1xyXG52YXIgS2V5Q29tYm8gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gS2V5Q29tYm8gKGtleWJvYXJkUGx1Z2luLCBrZXlzLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgICAgIC8vICBDYW4ndCBoYXZlIGEgemVybyBvciBzaW5nbGUgbGVuZ3RoIGNvbWJvIChzdHJpbmcgb3IgYXJyYXkgYmFzZWQpXHJcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoIDwgMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBLZXlib2FyZCBNYW5hZ2VyXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0ga2V5Ym9hcmRQbHVnaW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgZmxhZyB0aGF0IGNvbnRyb2xzIGlmIHRoaXMgS2V5IENvbWJvIGlzIGFjdGl2ZWx5IHByb2Nlc3Npbmcga2V5cyBvciBub3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jZW5hYmxlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiB0aGUga2V5Y29kZXMgdGhhdCBjb21wcmlzZSB0aGlzIGNvbWJvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvI2tleUNvZGVzXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFtdXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5rZXlDb2RlcyA9IFtdO1xyXG5cclxuICAgICAgICAvLyAgaWYgJ2tleXMnIGlzIGEgc3RyaW5nIHdlIG5lZWQgdG8gZ2V0IHRoZSBrZXljb2RlIG9mIGVhY2ggY2hhcmFjdGVyIGluIGl0XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGFyID0ga2V5c1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhciA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5Q29kZXMucHVzaChjaGFyLnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNoYXIgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleUNvZGVzLnB1c2goY2hhcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhci5oYXNPd25Qcm9wZXJ0eSgna2V5Q29kZScpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleUNvZGVzLnB1c2goY2hhci5rZXlDb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQga2V5Q29kZSB0aGUgY29tYm8gaXMgd2FpdGluZyBmb3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jY3VycmVudFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMua2V5Q29kZXNbMF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBrZXkgYmVpbmcgd2FpdGVkIGZvciBpbiB0aGUgJ2tleXMnIHN0cmluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNpbmRleFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGlzIGNvbWJvIChpbiBrZXljb2RlcylcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNzaXplXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNpemUgPSB0aGlzLmtleUNvZGVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUgdGhlIHByZXZpb3VzIGtleSBpbiB0aGUgY29tYm8gd2FzIG1hdGNoZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jdGltZUxhc3RNYXRjaGVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aW1lTGFzdE1hdGNoZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIYXMgdGhpcyBLZXkgQ29tYm8gYmVlbiBtYXRjaGVkIHlldD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNtYXRjaGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hdGNoZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUgdGhlIGVudGlyZSBjb21ibyB3YXMgbWF0Y2hlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyN0aW1lTWF0Y2hlZFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZU1hdGNoZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGV5IHByZXNzIHRoZSB3cm9uZyBrZXkgZG8gd2UgcmVzZXQgdGhlIGNvbWJvP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvI3Jlc2V0T25Xcm9uZ0tleVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlc2V0T25Xcm9uZ0tleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdyZXNldE9uV3JvbmdLZXknLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1heCBkZWxheSBpbiBtcyBiZXR3ZWVuIGVhY2gga2V5IHByZXNzLiBBYm92ZSB0aGlzIHRoZSBjb21ibyBpcyByZXNldC4gMCBtZWFucyBkaXNhYmxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNtYXhLZXlEZWxheVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heEtleURlbGF5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ21heEtleURlbGF5JywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHByZXZpb3VzbHkgbWF0Y2hlZCBhbmQgdGhleSBwcmVzcyB0aGUgZmlyc3Qga2V5IG9mIHRoZSBjb21ibyBhZ2Fpbiwgd2lsbCBpdCByZXNldD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNyZXNldE9uTWF0Y2hcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVzZXRPbk1hdGNoID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3Jlc2V0T25NYXRjaCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGNvbWJvIG1hdGNoZXMsIHdpbGwgaXQgZGVsZXRlIGl0c2VsZj9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb21ibyNkZWxldGVPbk1hdGNoXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlbGV0ZU9uTWF0Y2ggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZGVsZXRlT25NYXRjaCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdmFyIG9uS2V5RG93bkhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMubWF0Y2hlZCB8fCAhX3RoaXMuZW5hYmxlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbWF0Y2hlZCA9IFByb2Nlc3NLZXlDb21ibyhldmVudCwgX3RoaXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1hdGNoZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIuZW1pdChFdmVudHMuQ09NQk9fTUFUQ0gsIF90aGlzLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLnJlc2V0T25NYXRjaClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBSZXNldEtleUNvbWJvKF90aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmRlbGV0ZU9uTWF0Y2gpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGludGVybmFsIEtleSBEb3duIGhhbmRsZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jb25LZXlEb3duXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7S2V5Ym9hcmRLZXlkb3duQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQGZpcmVzIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjQ09NQk9fTUFUQ0hcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uS2V5RG93biA9IG9uS2V5RG93bkhhbmRsZXI7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5vbihFdmVudHMuQU5ZX0tFWV9ET1dOLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSG93IGZhciBjb21wbGV0ZSBpcyB0aGlzIGNvbWJvPyBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jcHJvZ3Jlc3NcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwcm9ncmVzczoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAvIHRoaXMuc2l6ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgS2V5IENvbWJvIGFuZCBhbGwgb2YgaXRzIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8jZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5rZXlDb2RlcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIub2ZmKEV2ZW50cy5BTllfS0VZX0RPV04sIHRoaXMub25LZXlEb3duKTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBLZXlDb21ibztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQWR2YW5jZUtleUNvbWJvID0gcmVxdWlyZSgnLi9BZHZhbmNlS2V5Q29tYm8nKTtcclxuXHJcbi8qKlxyXG4gKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIEtleUNvbWJvIGNsYXNzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvLlByb2Nlc3NLZXlDb21ib1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgS2V5Ym9hcmQgRXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvfSBjb21ibyAtIFRoZSBLZXlDb21ibyBvYmplY3QgdG8gYmUgcHJvY2Vzc2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbWJvIHdhcyBtYXRjaGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBQcm9jZXNzS2V5Q29tYm8gPSBmdW5jdGlvbiAoZXZlbnQsIGNvbWJvKVxyXG57XHJcbiAgICBpZiAoY29tYm8ubWF0Y2hlZClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY29tYm9NYXRjaGVkID0gZmFsc2U7XHJcbiAgICB2YXIga2V5TWF0Y2hlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBjb21iby5jdXJyZW50KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBLZXkgd2FzIGNvcnJlY3RcclxuXHJcbiAgICAgICAgaWYgKGNvbWJvLmluZGV4ID4gMCAmJiBjb21iby5tYXhLZXlEZWxheSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgV2UgaGF2ZSB0byBjaGVjayB0byBzZWUgaWYgdGhlIGRlbGF5IGJldHdlZW5cclxuICAgICAgICAgICAgLy8gIHRoZSBuZXcga2V5IGFuZCB0aGUgb2xkIG9uZSB3YXMgdG9vIGxvbmcgKGlmIGVuYWJsZWQpXHJcblxyXG4gICAgICAgICAgICB2YXIgdGltZUxpbWl0ID0gY29tYm8udGltZUxhc3RNYXRjaGVkICsgY29tYm8ubWF4S2V5RGVsYXk7XHJcblxyXG4gICAgICAgICAgICAvLyAgQ2hlY2sgaWYgdGhleSBwcmVzc2VkIGl0IGluIHRpbWUgb3Igbm90XHJcbiAgICAgICAgICAgIGlmIChldmVudC50aW1lU3RhbXAgPD0gdGltZUxpbWl0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXlNYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbWJvTWF0Y2hlZCA9IEFkdmFuY2VLZXlDb21ibyhldmVudCwgY29tYm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleU1hdGNoZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gIFdlIGRvbid0IGNoZWNrIHRoZSB0aW1lIGZvciB0aGUgZmlyc3Qga2V5IHByZXNzZWQsIHNvIGp1c3QgYWR2YW5jZSBpdFxyXG4gICAgICAgICAgICBjb21ib01hdGNoZWQgPSBBZHZhbmNlS2V5Q29tYm8oZXZlbnQsIGNvbWJvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFrZXlNYXRjaGVkICYmIGNvbWJvLnJlc2V0T25Xcm9uZ0tleSlcclxuICAgIHtcclxuICAgICAgICAvLyAgV3Jvbmcga2V5IHdhcyBwcmVzc2VkXHJcbiAgICAgICAgY29tYm8uaW5kZXggPSAwO1xyXG4gICAgICAgIGNvbWJvLmN1cnJlbnQgPSBjb21iby5rZXlDb2Rlc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tYm9NYXRjaGVkKVxyXG4gICAge1xyXG4gICAgICAgIGNvbWJvLnRpbWVMYXN0TWF0Y2hlZCA9IGV2ZW50LnRpbWVTdGFtcDtcclxuICAgICAgICBjb21iby5tYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICBjb21iby50aW1lTWF0Y2hlZCA9IGV2ZW50LnRpbWVTdGFtcDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29tYm9NYXRjaGVkO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzS2V5Q29tYm87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgS2V5Q29tYm8gY2xhc3MuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm8uUmVzZXRLZXlDb21ib1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm99IGNvbWJvIC0gVGhlIEtleUNvbWJvIHRvIHJlc2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29tYm99IFRoZSBLZXlDb21iby5cclxuICovXHJcbnZhciBSZXNldEtleUNvbWJvID0gZnVuY3Rpb24gKGNvbWJvKVxyXG57XHJcbiAgICBjb21iby5jdXJyZW50ID0gY29tYm8ua2V5Q29kZXNbMF07XHJcbiAgICBjb21iby5pbmRleCA9IDA7XHJcbiAgICBjb21iby50aW1lTGFzdE1hdGNoZWQgPSAwO1xyXG4gICAgY29tYm8ubWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgY29tYm8udGltZU1hdGNoZWQgPSAwO1xyXG5cclxuICAgIHJldHVybiBjb21ibztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVzZXRLZXlDb21ibztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEdsb2JhbCBLZXkgRG93biBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgS2V5Ym9hcmQgUGx1Z2luIHdoZW4gYW55IGtleSBvbiB0aGUga2V5Ym9hcmQgaXMgcHJlc3NlZCBkb3duLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMuaW5wdXQua2V5Ym9hcmQub24oJ2tleWRvd24nLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogWW91IGNhbiBhbHNvIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBrZXkgYmVpbmcgcHJlc3NlZC4gU2VlIFtLZXlib2FyZC5FdmVudHMuS0VZX0RPV05de0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuRXZlbnRzI2V2ZW50OktFWV9ET1dOfSBmb3IgZGV0YWlscy5cclxuICogXHJcbiAqIEZpbmFsbHksIHlvdSBjYW4gY3JlYXRlIEtleSBvYmplY3RzLCB3aGljaCB5b3UgY2FuIGFsc28gbGlzdGVuIGZvciBldmVudHMgZnJvbS4gU2VlIFtLZXlib2FyZC5FdmVudHMuRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjZXZlbnQ6RE9XTn0gZm9yIGRldGFpbHMuXHJcbiAqIFxyXG4gKiBfTm90ZV86IE1hbnkga2V5Ym9hcmRzIGFyZSB1bmFibGUgdG8gcHJvY2VzcyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBrZXlzIGR1ZSB0byBoYXJkd2FyZSBsaW1pdGF0aW9ucyBrbm93biBhcyBnaG9zdGluZy5cclxuICogUmVhZCBbdGhpcyBhcnRpY2xlIG9uIGdob3N0aW5nXXtAbGluayBodHRwOi8vd3d3Lmh0bWw1Z2FtZWRldnMuY29tL3RvcGljLzQ4NzYtaW1wb3NzaWJsZS10by11c2UtbW9yZS10aGFuLTIta2V5Ym9hcmQtaW5wdXQtYnV0dG9ucy1hdC10aGUtc2FtZS10aW1lL30gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIEFsc28sIHBsZWFzZSBiZSBhd2FyZSB0aGF0IHNvbWUgYnJvd3NlciBleHRlbnNpb25zIGNhbiBkaXNhYmxlIG9yIG92ZXJyaWRlIFBoYXNlciBrZXlib2FyZCBoYW5kbGluZy5cclxuICogRm9yIGV4YW1wbGUsIHRoZSBDaHJvbWUgZXh0ZW5zaW9uIHZpbWl1bSBpcyBrbm93biB0byBkaXNhYmxlIFBoYXNlciBmcm9tIHVzaW5nIHRoZSBEIGtleSwgd2hpbGUgRXZlck5vdGUgZGlzYWJsZXMgdGhlIGJhY2t0aWNrIGtleS5cclxuICogVGhlcmUgYXJlIG90aGVycy4gU28sIHBsZWFzZSBjaGVjayB5b3VyIGV4dGVuc2lvbnMgaWYgeW91IGZpbmQgeW91IGhhdmUgc3BlY2lmaWMga2V5cyB0aGF0IGRvbid0IHdvcmsuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuRXZlbnRzI0FOWV9LRVlfRE9XTlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBLZXlib2FyZCBFdmVudC4gWW91IGNhbiBpbnNwZWN0IHRoaXMgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQsIGFueSBtb2RpZmllcnMsIGV0Yy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2tleWRvd24nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgR2xvYmFsIEtleSBVcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgS2V5Ym9hcmQgUGx1Z2luIHdoZW4gYW55IGtleSBvbiB0aGUga2V5Ym9hcmQgaXMgcmVsZWFzZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5pbnB1dC5rZXlib2FyZC5vbigna2V5dXAnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogWW91IGNhbiBhbHNvIGxpc3RlbiBmb3IgYSBzcGVjaWZpYyBrZXkgYmVpbmcgcmVsZWFzZWQuIFNlZSBbS2V5Ym9hcmQuRXZlbnRzLktFWV9VUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjZXZlbnQ6S0VZX1VQfSBmb3IgZGV0YWlscy5cclxuICogXHJcbiAqIEZpbmFsbHksIHlvdSBjYW4gY3JlYXRlIEtleSBvYmplY3RzLCB3aGljaCB5b3UgY2FuIGFsc28gbGlzdGVuIGZvciBldmVudHMgZnJvbS4gU2VlIFtLZXlib2FyZC5FdmVudHMuVVBde0BsaW5rY29kZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuRXZlbnRzI2V2ZW50OlVQfSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjQU5ZX0tFWV9VUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBLZXlib2FyZCBFdmVudC4gWW91IGNhbiBpbnNwZWN0IHRoaXMgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUga2V5IHRoYXQgd2FzIHJlbGVhc2VkLCBhbnkgbW9kaWZpZXJzLCBldGMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdrZXl1cCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBLZXkgQ29tYm8gTWF0Y2ggRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEtleWJvYXJkIFBsdWdpbiB3aGVuIGEgW0tleSBDb21ib117QGxpbmsgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvfSBpcyBtYXRjaGVkLlxyXG4gKiBcclxuICogTGlzdGVuIGZvciB0aGlzIGV2ZW50IGZyb20gdGhlIEtleSBQbHVnaW4gYWZ0ZXIgYSBjb21ibyBoYXMgYmVlbiBjcmVhdGVkOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmlucHV0LmtleWJvYXJkLmNyZWF0ZUNvbWJvKFsgMzgsIDM4LCA0MCwgNDAsIDM3LCAzOSwgMzcsIDM5LCA2NiwgNjUsIDEzIF0sIHsgcmVzZXRPbk1hdGNoOiB0cnVlIH0pO1xyXG4gKlxyXG4gKiB0aGlzLmlucHV0LmtleWJvYXJkLm9uKCdrZXljb21ib21hdGNoJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAqICAgICBjb25zb2xlLmxvZygnS29uYW1pIENvZGUgZW50ZXJlZCEnKTtcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNDT01CT19NQVRDSFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleUNvbWJvfSBrZXljb21ibyAtIFRoZSBLZXkgQ29tYm8gb2JqZWN0IHRoYXQgd2FzIG1hdGNoZWQuXHJcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBLZXlib2FyZCBFdmVudCBvZiB0aGUgZmluYWwga2V5IGluIHRoZSBjb21iby4gWW91IGNhbiBpbnNwZWN0IHRoaXMgdG8gbGVhcm4gbW9yZSBhYm91dCBhbnkgbW9kaWZpZXJzLCBldGMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdrZXljb21ib21hdGNoJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEtleSBEb3duIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgW0tleV17QGxpbmsgUGhhc2VyLklucHV0LktleWJvYXJkLktleX0gb2JqZWN0IHdoZW4gaXQgaXMgcHJlc3NlZC5cclxuICogXHJcbiAqIExpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBLZXkgb2JqZWN0IGluc3RhbmNlIGRpcmVjdGx5OlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgc3BhY2VCYXIgPSB0aGlzLmlucHV0LmtleWJvYXJkLmFkZEtleShQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuU1BBQ0UpO1xyXG4gKiBcclxuICogc3BhY2VCYXIub24oJ2Rvd24nLCBsaXN0ZW5lcilcclxuICogYGBgXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgZ2VuZXJpYyAnZ2xvYmFsJyBsaXN0ZW5lci4gU2VlIFtLZXlib2FyZC5FdmVudHMuQU5ZX0tFWV9ET1dOXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNldmVudDpBTllfS0VZX0RPV059IGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNET1dOXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fSBrZXkgLSBUaGUgS2V5IG9iamVjdCB0aGF0IHdhcyBwcmVzc2VkLlxyXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gS2V5Ym9hcmQgRXZlbnQuIFlvdSBjYW4gaW5zcGVjdCB0aGlzIHRvIGxlYXJuIG1vcmUgYWJvdXQgYW55IG1vZGlmaWVycywgZXRjLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZG93bic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBLZXkgRG93biBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgS2V5Ym9hcmQgUGx1Z2luIHdoZW4gYW55IGtleSBvbiB0aGUga2V5Ym9hcmQgaXMgcHJlc3NlZCBkb3duLlxyXG4gKiBcclxuICogVW5saWtlIHRoZSBgQU5ZX0tFWV9ET1dOYCBldmVudCwgdGhpcyBvbmUgaGFzIGEgc3BlY2lhbCBkeW5hbWljIGV2ZW50IG5hbWUuIEZvciBleGFtcGxlLCB0byBsaXN0ZW4gZm9yIHRoZSBgQWAga2V5IGJlaW5nIHByZXNzZWRcclxuICogdXNlIHRoZSBmb2xsb3dpbmcgZnJvbSB3aXRoaW4gYSBTY2VuZTogYHRoaXMuaW5wdXQua2V5Ym9hcmQub24oJ2tleWRvd24tQScsIGxpc3RlbmVyKWAuIFlvdSBjYW4gcmVwbGFjZSB0aGUgYC1BYCBwYXJ0IG9mIHRoZSBldmVudFxyXG4gKiBuYW1lIHdpdGggYW55IHZhbGlkIFtLZXkgQ29kZSBzdHJpbmdde0BsaW5rIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlc30uIEZvciBleGFtcGxlLCB0aGlzIHdpbGwgbGlzdGVuIGZvciB0aGUgc3BhY2UgYmFyOiBcclxuICogYHRoaXMuaW5wdXQua2V5Ym9hcmQub24oJ2tleWRvd24tU1BBQ0UnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogWW91IGNhbiBhbHNvIGNyZWF0ZSBhIGdlbmVyaWMgJ2dsb2JhbCcgbGlzdGVuZXIuIFNlZSBbS2V5Ym9hcmQuRXZlbnRzLkFOWV9LRVlfRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjZXZlbnQ6QU5ZX0tFWV9ET1dOfSBmb3IgZGV0YWlscy5cclxuICogXHJcbiAqIEZpbmFsbHksIHlvdSBjYW4gY3JlYXRlIEtleSBvYmplY3RzLCB3aGljaCB5b3UgY2FuIGFsc28gbGlzdGVuIGZvciBldmVudHMgZnJvbS4gU2VlIFtLZXlib2FyZC5FdmVudHMuRE9XTl17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjZXZlbnQ6RE9XTn0gZm9yIGRldGFpbHMuXHJcbiAqIFxyXG4gKiBfTm90ZV86IE1hbnkga2V5Ym9hcmRzIGFyZSB1bmFibGUgdG8gcHJvY2VzcyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBrZXlzIGR1ZSB0byBoYXJkd2FyZSBsaW1pdGF0aW9ucyBrbm93biBhcyBnaG9zdGluZy5cclxuICogUmVhZCBbdGhpcyBhcnRpY2xlIG9uIGdob3N0aW5nXXtAbGluayBodHRwOi8vd3d3Lmh0bWw1Z2FtZWRldnMuY29tL3RvcGljLzQ4NzYtaW1wb3NzaWJsZS10by11c2UtbW9yZS10aGFuLTIta2V5Ym9hcmQtaW5wdXQtYnV0dG9ucy1hdC10aGUtc2FtZS10aW1lL30gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIEFsc28sIHBsZWFzZSBiZSBhd2FyZSB0aGF0IHNvbWUgYnJvd3NlciBleHRlbnNpb25zIGNhbiBkaXNhYmxlIG9yIG92ZXJyaWRlIFBoYXNlciBrZXlib2FyZCBoYW5kbGluZy5cclxuICogRm9yIGV4YW1wbGUsIHRoZSBDaHJvbWUgZXh0ZW5zaW9uIHZpbWl1bSBpcyBrbm93biB0byBkaXNhYmxlIFBoYXNlciBmcm9tIHVzaW5nIHRoZSBEIGtleSwgd2hpbGUgRXZlck5vdGUgZGlzYWJsZXMgdGhlIGJhY2t0aWNrIGtleS5cclxuICogVGhlcmUgYXJlIG90aGVycy4gU28sIHBsZWFzZSBjaGVjayB5b3VyIGV4dGVuc2lvbnMgaWYgeW91IGZpbmQgeW91IGhhdmUgc3BlY2lmaWMga2V5cyB0aGF0IGRvbid0IHdvcmsuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuRXZlbnRzI0tFWV9ET1dOXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCAtIFRoZSBuYXRpdmUgRE9NIEtleWJvYXJkIEV2ZW50LiBZb3UgY2FuIGluc3BlY3QgdGhpcyB0byBsZWFybiBtb3JlIGFib3V0IHRoZSBrZXkgdGhhdCB3YXMgcHJlc3NlZCwgYW55IG1vZGlmaWVycywgZXRjLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAna2V5ZG93bi0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgS2V5IFVwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBLZXlib2FyZCBQbHVnaW4gd2hlbiBhbnkga2V5IG9uIHRoZSBrZXlib2FyZCBpcyByZWxlYXNlZC5cclxuICogXHJcbiAqIFVubGlrZSB0aGUgYEFOWV9LRVlfVVBgIGV2ZW50LCB0aGlzIG9uZSBoYXMgYSBzcGVjaWFsIGR5bmFtaWMgZXZlbnQgbmFtZS4gRm9yIGV4YW1wbGUsIHRvIGxpc3RlbiBmb3IgdGhlIGBBYCBrZXkgYmVpbmcgcmVsZWFzZWRcclxuICogdXNlIHRoZSBmb2xsb3dpbmcgZnJvbSB3aXRoaW4gYSBTY2VuZTogYHRoaXMuaW5wdXQua2V5Ym9hcmQub24oJ2tleXVwLUEnLCBsaXN0ZW5lcilgLiBZb3UgY2FuIHJlcGxhY2UgdGhlIGAtQWAgcGFydCBvZiB0aGUgZXZlbnRcclxuICogbmFtZSB3aXRoIGFueSB2YWxpZCBbS2V5IENvZGUgc3RyaW5nXXtAbGluayBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXN9LiBGb3IgZXhhbXBsZSwgdGhpcyB3aWxsIGxpc3RlbiBmb3IgdGhlIHNwYWNlIGJhcjogXHJcbiAqIGB0aGlzLmlucHV0LmtleWJvYXJkLm9uKCdrZXl1cC1TUEFDRScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgZ2VuZXJpYyAnZ2xvYmFsJyBsaXN0ZW5lci4gU2VlIFtLZXlib2FyZC5FdmVudHMuQU5ZX0tFWV9VUF17QGxpbmtjb2RlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjZXZlbnQ6QU5ZX0tFWV9VUH0gZm9yIGRldGFpbHMuXHJcbiAqIFxyXG4gKiBGaW5hbGx5LCB5b3UgY2FuIGNyZWF0ZSBLZXkgb2JqZWN0cywgd2hpY2ggeW91IGNhbiBhbHNvIGxpc3RlbiBmb3IgZXZlbnRzIGZyb20uIFNlZSBbS2V5Ym9hcmQuRXZlbnRzLlVQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNldmVudDpVUH0gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuRXZlbnRzI0tFWV9VUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBLZXlib2FyZCBFdmVudC4gWW91IGNhbiBpbnNwZWN0IHRoaXMgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUga2V5IHRoYXQgd2FzIHJlbGVhc2VkLCBhbnkgbW9kaWZpZXJzLCBldGMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdrZXl1cC0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgS2V5IFVwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgW0tleV17QGxpbmsgUGhhc2VyLklucHV0LktleWJvYXJkLktleX0gb2JqZWN0IHdoZW4gaXQgaXMgcmVsZWFzZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gZm9yIHRoaXMgZXZlbnQgZnJvbSB0aGUgS2V5IG9iamVjdCBpbnN0YW5jZSBkaXJlY3RseTpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHNwYWNlQmFyID0gdGhpcy5pbnB1dC5rZXlib2FyZC5hZGRLZXkoUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlNQQUNFKTtcclxuICogXHJcbiAqIHNwYWNlQmFyLm9uKCd1cCcsIGxpc3RlbmVyKVxyXG4gKiBgYGBcclxuICogXHJcbiAqIFlvdSBjYW4gYWxzbyBjcmVhdGUgYSBnZW5lcmljICdnbG9iYWwnIGxpc3RlbmVyLiBTZWUgW0tleWJvYXJkLkV2ZW50cy5BTllfS0VZX1VQXXtAbGlua2NvZGUgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNldmVudDpBTllfS0VZX1VQfSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHMjVVBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9IGtleSAtIFRoZSBLZXkgb2JqZWN0IHRoYXQgd2FzIHJlbGVhc2VkLlxyXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gS2V5Ym9hcmQgRXZlbnQuIFlvdSBjYW4gaW5zcGVjdCB0aGlzIHRvIGxlYXJuIG1vcmUgYWJvdXQgYW55IG1vZGlmaWVycywgZXRjLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndXAnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBTllfS0VZX0RPV046IHJlcXVpcmUoJy4vQU5ZX0tFWV9ET1dOX0VWRU5UJyksXHJcbiAgICBBTllfS0VZX1VQOiByZXF1aXJlKCcuL0FOWV9LRVlfVVBfRVZFTlQnKSxcclxuICAgIENPTUJPX01BVENIOiByZXF1aXJlKCcuL0NPTUJPX01BVENIX0VWRU5UJyksXHJcbiAgICBET1dOOiByZXF1aXJlKCcuL0RPV05fRVZFTlQnKSxcclxuICAgIEtFWV9ET1dOOiByZXF1aXJlKCcuL0tFWV9ET1dOX0VWRU5UJyksXHJcbiAgICBLRVlfVVA6IHJlcXVpcmUoJy4vS0VZX1VQX0VWRU5UJyksXHJcbiAgICBVUDogcmVxdWlyZSgnLi9VUF9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5LZXlib2FyZFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEV2ZW50czogcmVxdWlyZSgnLi9ldmVudHMnKSxcclxuXHJcbiAgICBLZXlib2FyZE1hbmFnZXI6IHJlcXVpcmUoJy4vS2V5Ym9hcmRNYW5hZ2VyJyksXHJcbiAgICBLZXlib2FyZFBsdWdpbjogcmVxdWlyZSgnLi9LZXlib2FyZFBsdWdpbicpLFxyXG5cclxuICAgIEtleTogcmVxdWlyZSgnLi9rZXlzL0tleScpLFxyXG4gICAgS2V5Q29kZXM6IHJlcXVpcmUoJy4va2V5cy9LZXlDb2RlcycpLFxyXG5cclxuICAgIEtleUNvbWJvOiByZXF1aXJlKCcuL2NvbWJvL0tleUNvbWJvJyksXHJcblxyXG4gICAgSnVzdERvd246IHJlcXVpcmUoJy4va2V5cy9KdXN0RG93bicpLFxyXG4gICAgSnVzdFVwOiByZXF1aXJlKCcuL2tleXMvSnVzdFVwJyksXHJcbiAgICBEb3duRHVyYXRpb246IHJlcXVpcmUoJy4va2V5cy9Eb3duRHVyYXRpb24nKSxcclxuICAgIFVwRHVyYXRpb246IHJlcXVpcmUoJy4va2V5cy9VcER1cmF0aW9uJylcclxuICAgIFxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgS2V5IHdhcyBwcmVzc2VkIGRvd24gd2l0aGluIHRoZSBgZHVyYXRpb25gIHZhbHVlIGdpdmVuLCBiYXNlZCBvbiB0aGUgY3VycmVudFxyXG4gKiBnYW1lIGNsb2NrIHRpbWUuIE9yIGBmYWxzZWAgaWYgaXQgZWl0aGVyIGlzbid0IGRvd24sIG9yIHdhcyBwcmVzc2VkIGRvd24gbG9uZ2VyIGFnbyB0aGFuIHRoZSBnaXZlbiBkdXJhdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5JbnB1dC5LZXlib2FyZC5Eb3duRHVyYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleX0ga2V5IC0gVGhlIEtleSBvYmplY3QgdG8gdGVzdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249NTBdIC0gVGhlIGR1cmF0aW9uLCBpbiBtcywgd2l0aGluIHdoaWNoIHRoZSBrZXkgbXVzdCBoYXZlIGJlZW4gcHJlc3NlZCBkb3duLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIEtleSB3YXMgcHJlc3NlZCBkb3duIHdpdGhpbiBgZHVyYXRpb25gIG1zIGFnbywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgRG93bkR1cmF0aW9uID0gZnVuY3Rpb24gKGtleSwgZHVyYXRpb24pXHJcbntcclxuICAgIGlmIChkdXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7IGR1cmF0aW9uID0gNTA7IH1cclxuXHJcbiAgICB2YXIgY3VycmVudCA9IGtleS5wbHVnaW4uZ2FtZS5sb29wLnRpbWUgLSBrZXkudGltZURvd247XHJcblxyXG4gICAgcmV0dXJuIChrZXkuaXNEb3duICYmIGN1cnJlbnQgPCBkdXJhdGlvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERvd25EdXJhdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIGp1c3REb3duIHZhbHVlIGFsbG93cyB5b3UgdG8gdGVzdCBpZiB0aGlzIEtleSBoYXMganVzdCBiZWVuIHByZXNzZWQgZG93biBvciBub3QuXHJcbiAqIFxyXG4gKiBXaGVuIHlvdSBjaGVjayB0aGlzIHZhbHVlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYCBpZiB0aGUgS2V5IGlzIGRvd24sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKiBcclxuICogWW91IGNhbiBvbmx5IGNhbGwganVzdERvd24gb25jZSBwZXIga2V5IHByZXNzLiBJdCB3aWxsIG9ubHkgcmV0dXJuIGB0cnVlYCBvbmNlLCB1bnRpbCB0aGUgS2V5IGlzIHJlbGVhc2VkIGFuZCBwcmVzc2VkIGRvd24gYWdhaW4uXHJcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgaXQgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBjaGVjayBpZiB0aGlzIGtleSBpcyBkb3duIHdpdGhvdXQgdXNpbmcgYW4gZXZlbnQsIHN1Y2ggYXMgaW4gYSBjb3JlIGdhbWUgbG9vcC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5JbnB1dC5LZXlib2FyZC5KdXN0RG93blxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5fSBrZXkgLSBUaGUgS2V5IHRvIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGp1c3QgZG93biBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgS2V5IHdhcyBqdXN0IHByZXNzZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIEp1c3REb3duID0gZnVuY3Rpb24gKGtleSlcclxue1xyXG4gICAgaWYgKGtleS5fanVzdERvd24pXHJcbiAgICB7XHJcbiAgICAgICAga2V5Ll9qdXN0RG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEp1c3REb3duO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUganVzdFVwIHZhbHVlIGFsbG93cyB5b3UgdG8gdGVzdCBpZiB0aGlzIEtleSBoYXMganVzdCBiZWVuIHJlbGVhc2VkIG9yIG5vdC5cclxuICogXHJcbiAqIFdoZW4geW91IGNoZWNrIHRoaXMgdmFsdWUgaXQgd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBLZXkgaXMgdXAsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKiBcclxuICogWW91IGNhbiBvbmx5IGNhbGwgSnVzdFVwIG9uY2UgcGVyIGtleSByZWxlYXNlLiBJdCB3aWxsIG9ubHkgcmV0dXJuIGB0cnVlYCBvbmNlLCB1bnRpbCB0aGUgS2V5IGlzIHByZXNzZWQgZG93biBhbmQgcmVsZWFzZWQgYWdhaW4uXHJcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgaXQgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3Ugd2FudCB0byBjaGVjayBpZiB0aGlzIGtleSBpcyB1cCB3aXRob3V0IHVzaW5nIGFuIGV2ZW50LCBzdWNoIGFzIGluIGEgY29yZSBnYW1lIGxvb3AuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuSnVzdFVwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5LZXlib2FyZC5LZXl9IGtleSAtIFRoZSBLZXkgdG8gY2hlY2sgdG8gc2VlIGlmIGl0J3MganVzdCB1cCBvciBub3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgS2V5IHdhcyBqdXN0IHJlbGVhc2VkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBKdXN0VXAgPSBmdW5jdGlvbiAoa2V5KVxyXG57XHJcbiAgICBpZiAoa2V5Ll9qdXN0VXApXHJcbiAgICB7XHJcbiAgICAgICAga2V5Ll9qdXN0VXAgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBKdXN0VXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBnZW5lcmljIEtleSBvYmplY3Qgd2hpY2ggY2FuIGJlIHBhc3NlZCB0byB0aGUgUHJvY2VzcyBmdW5jdGlvbnMgKGFuZCBzbyBvbilcclxuICoga2V5Y29kZSBtdXN0IGJlIGFuIGludGVnZXJcclxuICpcclxuICogQGNsYXNzIEtleVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLklucHV0LktleWJvYXJkXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Ym9hcmRQbHVnaW59IHBsdWdpbiAtIFRoZSBLZXlib2FyZCBQbHVnaW4gaW5zdGFuY2UgdGhhdCBvd25zIHRoaXMgS2V5IG9iamVjdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBrZXlDb2RlIC0gVGhlIGtleWNvZGUgb2YgdGhpcyBrZXkuXHJcbiAqL1xyXG52YXIgS2V5ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBLZXkgKHBsdWdpbiwga2V5Q29kZSlcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEtleWJvYXJkIFBsdWdpbiBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyBLZXkgb2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNwbHVnaW5cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleWJvYXJkUGx1Z2lufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGtleWNvZGUgb2YgdGhpcyBrZXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5I2tleUNvZGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmtleUNvZGUgPSBrZXlDb2RlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3JpZ2luYWwgRE9NIGV2ZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNvcmlnaW5hbEV2ZW50XHJcbiAgICAgICAgICogQHR5cGUge0tleWJvYXJkRXZlbnR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYW4gdGhpcyBLZXkgYmUgcHJvY2Vzc2VkP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNlbmFibGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBcImRvd25cIiBzdGF0ZSBvZiB0aGUga2V5LiBUaGlzIHdpbGwgcmVtYWluIGB0cnVlYCBmb3IgYXMgbG9uZyBhcyB0aGUga2V5Ym9hcmQgdGhpbmtzIHRoaXMga2V5IGlzIGhlbGQgZG93bi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjaXNEb3duXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzRG93biA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgXCJ1cFwiIHN0YXRlIG9mIHRoZSBrZXkuIFRoaXMgd2lsbCByZW1haW4gYHRydWVgIGZvciBhcyBsb25nIGFzIHRoZSBrZXlib2FyZCB0aGlua3MgdGhpcyBrZXkgaXMgdXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5I2lzVXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1VwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRvd24gc3RhdGUgb2YgdGhlIEFMVCBrZXksIGlmIHByZXNzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGlzIGtleS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjYWx0S2V5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFsdEtleSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZG93biBzdGF0ZSBvZiB0aGUgQ1RSTCBrZXksIGlmIHByZXNzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGlzIGtleS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjY3RybEtleVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdHJsS2V5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkb3duIHN0YXRlIG9mIHRoZSBTSElGVCBrZXksIGlmIHByZXNzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGlzIGtleS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjc2hpZnRLZXlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2hpZnRLZXkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRvd24gc3RhdGUgb2YgdGhlIE1ldGEga2V5LCBpZiBwcmVzc2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhpcyBrZXkuXHJcbiAgICAgICAgICogT24gYSBNYWMgdGhlIE1ldGEgS2V5IGlzIHRoZSBDb21tYW5kIGtleS4gT24gV2luZG93cyBrZXlib2FyZHMsIGl0J3MgdGhlIFdpbmRvd3Mga2V5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNtZXRhS2V5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tZXRhS2V5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbW9kaWZpZXIga2V5LiAwIGZvciBzdGFuZGFyZCAob3IgdW5rbm93biksIDEgZm9yIGxlZnQsIDIgZm9yIHJpZ2h0LCAzIGZvciBudW1wYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5I2xvY2F0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUga2V5IHdhcyBsYXN0IHByZXNzZWQgZG93bi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjdGltZURvd25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbWVEb3duID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhpcyBrZXkgd2FzIGhlbGQgZG93biBmb3IgaW4gdGhlIHByZXZpb3VzIGRvd24gLSB1cCBzZXF1ZW5jZS5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzbid0IHVwZGF0ZWQgZXZlcnkgZ2FtZSBzdGVwLCBvbmx5IHdoZW4gdGhlIEtleSBjaGFuZ2VzIHN0YXRlLlxyXG4gICAgICAgICAqIFRvIGdldCB0aGUgY3VycmVudCBkdXJhdGlvbiB1c2UgdGhlIGBnZXREdXJhdGlvbmAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgbGFzdCByZWxlYXNlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjdGltZVVwXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aW1lVXAgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGVuIGEga2V5IGlzIGhlbGQgZG93biBzaG91bGQgaXQgY29udGludW91c2x5IGZpcmUgdGhlIGBkb3duYCBldmVudCBlYWNoIHRpbWUgaXQgcmVwZWF0cz9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBCeSBkZWZhdWx0IGl0IHdpbGwgZW1pdCB0aGUgYGRvd25gIGV2ZW50IGp1c3Qgb25jZSwgYnV0IGlmIHlvdSB3aXNoIHRvIHJlY2VpdmUgdGhlIGV2ZW50XHJcbiAgICAgICAgICogZm9yIGVhY2ggcmVwZWF0IGFzIHdlbGwsIGVuYWJsZSB0aGlzIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNlbWl0T25SZXBlYXRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVtaXRPblJlcGVhdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIGtleSBpcyBoZWxkIGRvd24gdGhpcyBob2xkcyBkb3duIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSBoYXMgJ3JlcGVhdGVkJy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjcmVwZWF0c1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVwZWF0cyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRydWUgaWYgdGhlIGtleSBoYXMganVzdCBiZWVuIHByZXNzZWQgKE5PVEU6IHJlcXVpcmVzIHRvIGJlIHJlc2V0LCBzZWUganVzdERvd24gZ2V0dGVyKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNfanVzdERvd25cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fanVzdERvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJ1ZSBpZiB0aGUga2V5IGhhcyBqdXN0IGJlZW4gcHJlc3NlZCAoTk9URTogcmVxdWlyZXMgdG8gYmUgcmVzZXQsIHNlZSBqdXN0RG93biBnZXR0ZXIpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5I19qdXN0VXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fanVzdFVwID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHRpY2sgY291bnRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjX3RpY2tcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RpY2sgPSAtMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9scyBpZiB0aGlzIEtleSB3aWxsIGNvbnRpbnVvdXNseSBlbWl0IGEgYGRvd25gIGV2ZW50IHdoaWxlIGJlaW5nIGhlbGQgZG93biAodHJ1ZSksXHJcbiAgICAgKiBvciBlbWl0IHRoZSBldmVudCBqdXN0IG9uY2UsIG9uIGZpcnN0IHByZXNzLCBhbmQgdGhlbiBza2lwIGZ1dHVyZSBldmVudHMgKGZhbHNlKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjc2V0RW1pdE9uUmVwZWF0XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBFbWl0IGBkb3duYCBldmVudHMgb24gcmVwZWF0ZWQga2V5IGRvd24gYWN0aW9ucywgb3IganVzdCBvbmNlP1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEtleSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RW1pdE9uUmVwZWF0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbWl0T25SZXBlYXQgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2Vzc2VzIHRoZSBLZXkgRG93biBhY3Rpb24gZm9yIHRoaXMgS2V5LlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEtleWJvYXJkIFBsdWdpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjb25Eb3duXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNET1dOXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQgLSBUaGUgbmF0aXZlIERPTSBLZXlib2FyZCBldmVudC5cclxuICAgICAqL1xyXG4gICAgb25Eb3duOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hbHRLZXkgPSBldmVudC5hbHRLZXk7XHJcbiAgICAgICAgdGhpcy5jdHJsS2V5ID0gZXZlbnQuY3RybEtleTtcclxuICAgICAgICB0aGlzLnNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XHJcbiAgICAgICAgdGhpcy5tZXRhS2V5ID0gZXZlbnQubWV0YUtleTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uID0gZXZlbnQubG9jYXRpb247XHJcbiAgICBcclxuICAgICAgICB0aGlzLnJlcGVhdHMrKztcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRG93bilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNEb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5pc1VwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMudGltZURvd24gPSBldmVudC50aW1lU3RhbXA7XHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9qdXN0RG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2p1c3RVcCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5ET1dOLCB0aGlzLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZW1pdE9uUmVwZWF0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5ET1dOLCB0aGlzLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgS2V5IFVwIGFjdGlvbiBmb3IgdGhpcyBLZXkuXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgS2V5Ym9hcmQgUGx1Z2luLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNvblVwXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLklucHV0LktleWJvYXJkLkV2ZW50cyNVUFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IC0gVGhlIG5hdGl2ZSBET00gS2V5Ym9hcmQgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIG9uVXA6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzVXAgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGltZVVwID0gZXZlbnQudGltZVN0YW1wO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLnRpbWVVcCAtIHRoaXMudGltZURvd247XHJcbiAgICAgICAgdGhpcy5yZXBlYXRzID0gMDtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuX2p1c3REb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fanVzdFVwID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl90aWNrID0gLTE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5VUCwgdGhpcywgZXZlbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIEtleSBvYmplY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bi1wcmVzc2VkIHN0YXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LktleWJvYXJkLktleSNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgS2V5IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1VwID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFsdEtleSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3RybEtleSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hpZnRLZXkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1ldGFLZXkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRpbWVEb3duID0gMDtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuICAgICAgICB0aGlzLnRpbWVVcCA9IDA7XHJcbiAgICAgICAgdGhpcy5yZXBlYXRzID0gMDtcclxuICAgICAgICB0aGlzLl9qdXN0RG93biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2p1c3RVcCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RpY2sgPSAtMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZHVyYXRpb24sIGluIG1zLCB0aGF0IHRoZSBLZXkgaGFzIGJlZW4gaGVsZCBkb3duIGZvci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGtleSBpcyBub3QgY3VycmVudGx5IGRvd24gaXQgd2lsbCByZXR1cm4gemVyby5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGdldCB0aGUgZHVyYXRpb24gdGhlIEtleSB3YXMgaGVsZCBkb3duIGZvciBpbiB0aGUgcHJldmlvdXMgdXAtZG93biBjeWNsZSxcclxuICAgICAqIHVzZSB0aGUgYEtleS5kdXJhdGlvbmAgcHJvcGVydHkgdmFsdWUgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjZ2V0RHVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZHVyYXRpb24sIGluIG1zLCB0aGF0IHRoZSBLZXkgaGFzIGJlZW4gaGVsZCBkb3duIGZvciBpZiBjdXJyZW50bHkgZG93bi5cclxuICAgICAqL1xyXG4gICAgZ2V0RHVyYXRpb246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnBsdWdpbi5nYW1lLmxvb3AudGltZSAtIHRoaXMudGltZURvd24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbnkgYm91bmQgZXZlbnQgaGFuZGxlcnMgYW5kIHJlbW92ZXMgbG9jYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXkjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMucGx1Z2luID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBLZXk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEtleWJvYXJkIENvZGVzLlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlc1xyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLklucHV0LktleWJvYXJkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbnZhciBLZXlDb2RlcyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBCQUNLU1BBQ0Uga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuQkFDS1NQQUNFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBCQUNLU1BBQ0U6IDgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVEFCIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlRBQlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgVEFCOiA5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEVOVEVSIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkVOVEVSXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBFTlRFUjogMTMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU0hJRlQga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuU0hJRlRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFNISUZUOiAxNixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDVFJMIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkNUUkxcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIENUUkw6IDE3LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEFMVCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5BTFRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEFMVDogMTgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgUEFVU0Uga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuUEFVU0VcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBBVVNFOiAxOSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDQVBTX0xPQ0sga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuQ0FQU19MT0NLXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBDQVBTX0xPQ0s6IDIwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEVTQyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5FU0NcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEVTQzogMjcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU1BBQ0Uga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuU1BBQ0VcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFNQQUNFOiAzMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBQQUdFX1VQIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlBBR0VfVVBcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBBR0VfVVA6IDMzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFBBR0VfRE9XTiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5QQUdFX0RPV05cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBBR0VfRE9XTjogMzQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgRU5EIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkVORFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRU5EOiAzNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBIT01FIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkhPTUVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEhPTUU6IDM2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExFRlQga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTEVGVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTEVGVDogMzcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVVAga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuVVBcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFVQOiAzOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBSSUdIVCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5SSUdIVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUklHSFQ6IDM5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIERPV04ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRE9XTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRE9XTjogNDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgUFJJTlRfU0NSRUVOIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlBSSU5UX1NDUkVFTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUFJJTlRfU0NSRUVOOiA0MixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBJTlNFUlQga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuSU5TRVJUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBJTlNFUlQ6IDQ1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIERFTEVURSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5ERUxFVEVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERFTEVURTogNDYsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgWkVSTyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5aRVJPXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBaRVJPOiA0OCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBPTkUga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuT05FXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBPTkU6IDQ5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRXTyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5UV09cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFRXTzogNTAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVEhSRUUga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuVEhSRUVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFRIUkVFOiA1MSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGT1VSIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkZPVVJcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEZPVVI6IDUyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEZJVkUga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRklWRVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRklWRTogNTMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU0lYIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlNJWFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU0lYOiA1NCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTRVZFTiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5TRVZFTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU0VWRU46IDU1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEVJR0hUIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkVJR0hUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBFSUdIVDogNTYsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgTklORSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OSU5FXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOSU5FOiA1NyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBOVU1QQURfWkVSTyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OVU1QQURfWkVST1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTlVNUEFEX1pFUk86IDk2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9PTkUga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTlVNUEFEX09ORVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTlVNUEFEX09ORTogOTcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgTlVNUEFEX1RXTyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OVU1QQURfVFdPXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOVU1QQURfVFdPOiA5OCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBOVU1QQURfVEhSRUUga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTlVNUEFEX1RIUkVFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOVU1QQURfVEhSRUU6IDk5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9GT1VSIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLk5VTVBBRF9GT1VSXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOVU1QQURfRk9VUjogMTAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9GSVZFIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLk5VTVBBRF9GSVZFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOVU1QQURfRklWRTogMTAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9TSVgga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTlVNUEFEX1NJWFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTlVNUEFEX1NJWDogMTAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9TRVZFTiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OVU1QQURfU0VWRU5cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIE5VTVBBRF9TRVZFTjogMTAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9FSUdIVCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OVU1QQURfRUlHSFRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIE5VTVBBRF9FSUdIVDogMTA0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE5VTVBBRF9OSU5FIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLk5VTVBBRF9OSU5FXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOVU1QQURfTklORTogMTA1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE51bXBhZCBBZGRpdGlvbiAoKykga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTlVNUEFEX0FERFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKi9cclxuICAgIE5VTVBBRF9BREQ6IDEwNyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBOdW1wYWQgU3VidHJhY3Rpb24gKC0pIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLk5VTVBBRF9TVUJUUkFDVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKi9cclxuICAgIE5VTVBBRF9TVUJUUkFDVDogMTA5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEEga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuQVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQTogNjUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5CXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBCOiA2NixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkNcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEM6IDY3LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEQga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRDogNjgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgRSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5FXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBFOiA2OSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkZcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEY6IDcwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEcga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuR1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRzogNzEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgSCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5IXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBIOiA3MixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBJIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLklcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEk6IDczLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEoga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuSlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgSjogNzQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgSyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5LXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBLOiA3NSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBMIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkxcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEw6IDc2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIE0ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuTVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTTogNzcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgTiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5OXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOOiA3OCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBPIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLk9cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIE86IDc5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFAga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuUFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUDogODAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgUSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5RXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBROiA4MSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBSIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlJcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFI6IDgyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFMga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuU1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUzogODMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5UXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBUOiA4NCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBVIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFU6IDg1LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFYga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuVlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgVjogODYsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgVyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5XXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBXOiA4NyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBYIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlhcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFg6IDg4LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFkga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgWTogODksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgWiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5aXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBaOiA5MCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GMVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjE6IDExMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GMlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjI6IDExMyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GM1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjM6IDExNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGNCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GNFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjQ6IDExNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGNSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GNVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjU6IDExNixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGNiBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GNlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjY6IDExNyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGNyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GN1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjc6IDExOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGOCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GOFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjg6IDExOSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGOSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5GOVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRjk6IDEyMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMTAga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRjEwXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGMTA6IDEyMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMTEga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRjExXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGMTE6IDEyMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGMTIga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuRjEyXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGMTI6IDEyMyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTRU1JQ09MT04ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuU0VNSUNPTE9OXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBTRU1JQ09MT046IDE4NixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBQTFVTIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLlBMVVNcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBMVVM6IDE4NyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDT01NQSBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5DT01NQVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ09NTUE6IDE4OCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBNSU5VUyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5NSU5VU1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTUlOVVM6IDE4OSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBQRVJJT0Qga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuUEVSSU9EXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBQRVJJT0Q6IDE5MCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGT1JXQVJEX1NMQVNIIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkZPUldBUkRfU0xBU0hcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEZPUldBUkRfU0xBU0g6IDE5MSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBCQUNLX1NMQVNIIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkJBQ0tfU0xBU0hcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEJBQ0tfU0xBU0g6IDIyMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBRVU9URVMga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuUVVPVEVTXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBRVU9URVM6IDIyMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBCQUNLVElDSyBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5CQUNLVElDS1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQkFDS1RJQ0s6IDE5MixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBPUEVOX0JSQUNLRVQga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuS2V5Ym9hcmQuS2V5Q29kZXMuT1BFTl9CUkFDS0VUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBPUEVOX0JSQUNLRVQ6IDIxOSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDTE9TRURfQlJBQ0tFVCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5DTE9TRURfQlJBQ0tFVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ0xPU0VEX0JSQUNLRVQ6IDIyMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTRU1JQ09MT05fRklSRUZPWCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5TRU1JQ09MT05fRklSRUZPWFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU0VNSUNPTE9OX0ZJUkVGT1g6IDU5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIENPTE9OIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkNPTE9OXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBDT0xPTjogNTgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQ09NTUFfRklSRUZPWF9XSU5ET1dTIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkNPTU1BX0ZJUkVGT1hfV0lORE9XU1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ09NTUFfRklSRUZPWF9XSU5ET1dTOiA2MCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBDT01NQV9GSVJFRk9YIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkNPTU1BX0ZJUkVGT1hcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIENPTU1BX0ZJUkVGT1g6IDYyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEJSQUNLRVRfUklHSFRfRklSRUZPWCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5LZXlib2FyZC5LZXlDb2Rlcy5CUkFDS0VUX1JJR0hUX0ZJUkVGT1hcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEJSQUNLRVRfUklHSFRfRklSRUZPWDogMTc0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEJSQUNLRVRfTEVGVF9GSVJFRk9YIGtleS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLklucHV0LktleWJvYXJkLktleUNvZGVzLkJSQUNLRVRfTEVGVF9GSVJFRk9YXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBCUkFDS0VUX0xFRlRfRklSRUZPWDogMTc1XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEtleUNvZGVzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBLZXlDb2RlcyA9IHJlcXVpcmUoJy4vS2V5Q29kZXMnKTtcclxuXHJcbnZhciBLZXlNYXAgPSB7fTtcclxuXHJcbmZvciAodmFyIGtleSBpbiBLZXlDb2Rlcylcclxue1xyXG4gICAgS2V5TWFwW0tleUNvZGVzW2tleV1dID0ga2V5O1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEtleU1hcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIEtleSB3YXMgcmVsZWFzZWQgd2l0aGluIHRoZSBgZHVyYXRpb25gIHZhbHVlIGdpdmVuLCBiYXNlZCBvbiB0aGUgY3VycmVudFxyXG4gKiBnYW1lIGNsb2NrIHRpbWUuIE9yIHJldHVybnMgYGZhbHNlYCBpZiBpdCBlaXRoZXIgaXNuJ3QgdXAsIG9yIHdhcyByZWxlYXNlZCBsb25nZXIgYWdvIHRoYW4gdGhlIGdpdmVuIGR1cmF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLklucHV0LktleWJvYXJkLlVwRHVyYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LktleWJvYXJkLktleX0ga2V5IC0gVGhlIEtleSBvYmplY3QgdG8gdGVzdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZHVyYXRpb249NTBdIC0gVGhlIGR1cmF0aW9uLCBpbiBtcywgd2l0aGluIHdoaWNoIHRoZSBrZXkgbXVzdCBoYXZlIGJlZW4gcmVsZWFzZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgS2V5IHdhcyByZWxlYXNlZCB3aXRoaW4gYGR1cmF0aW9uYCBtcyBhZ28sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFVwRHVyYXRpb24gPSBmdW5jdGlvbiAoa2V5LCBkdXJhdGlvbilcclxue1xyXG4gICAgaWYgKGR1cmF0aW9uID09PSB1bmRlZmluZWQpIHsgZHVyYXRpb24gPSA1MDsgfVxyXG5cclxuICAgIHZhciBjdXJyZW50ID0ga2V5LnBsdWdpbi5nYW1lLmxvb3AudGltZSAtIGtleS50aW1lVXA7XHJcblxyXG4gICAgcmV0dXJuIChrZXkuaXNVcCAmJiBjdXJyZW50IDwgZHVyYXRpb24pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBVcER1cmF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBGZWF0dXJlcyA9IHJlcXVpcmUoJy4uLy4uL2RldmljZS9GZWF0dXJlcycpO1xyXG52YXIgSW5wdXRFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIE5PT1AgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG5cclxuLy8gIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50XHJcbi8vICBodHRwczovL2dpdGh1Yi5jb20vV0lDRy9FdmVudExpc3RlbmVyT3B0aW9ucy9ibG9iL2doLXBhZ2VzL2V4cGxhaW5lci5tZFxyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIE1vdXNlIE1hbmFnZXIgaXMgYSBoZWxwZXIgY2xhc3MgdGhhdCBiZWxvbmdzIHRvIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gKiBcclxuICogSXRzIHJvbGUgaXMgdG8gbGlzdGVuIGZvciBuYXRpdmUgRE9NIE1vdXNlIEV2ZW50cyBhbmQgdGhlbiBwYXNzIHRoZW0gb250byB0aGUgSW5wdXQgTWFuYWdlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKiBcclxuICogWW91IGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCB0aGUgSW5wdXQgTWFuYWdlciB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpdCBhdXRvbWF0aWNhbGx5LlxyXG4gKlxyXG4gKiBAY2xhc3MgTW91c2VNYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuSW5wdXQuTW91c2VcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXJ9IGlucHV0TWFuYWdlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gKi9cclxudmFyIE1vdXNlTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBNb3VzZU1hbmFnZXIgKGlucHV0TWFuYWdlcilcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgSW5wdXQgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuSW5wdXQuSW5wdXRNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IGlucHV0TWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSB0aGUgRE9NIG1vdXNlIGV2ZW50cyB3aWxsIGhhdmUgZXZlbnQucHJldmVudERlZmF1bHQgYXBwbGllZCB0byB0aGVtLCBpZiBmYWxzZSB0aGV5IHdpbGwgcHJvcGFnYXRlIGZ1bGx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciNjYXB0dXJlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FwdHVyZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYm9vbGVhbiB0aGF0IGNvbnRyb2xzIGlmIHRoZSBNb3VzZSBNYW5hZ2VyIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICAgICAqIENhbiBiZSB0b2dnbGVkIG9uIHRoZSBmbHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI2VuYWJsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgTW91c2UgdGFyZ2V0LCBhcyBkZWZpbmVkIGluIHRoZSBHYW1lIENvbmZpZy5cclxuICAgICAgICAgKiBUeXBpY2FsbHkgdGhlIGNhbnZhcyB0byB3aGljaCB0aGUgZ2FtZSBpcyByZW5kZXJpbmcsIGJ1dCBjYW4gYmUgYW55IGludGVyYWN0aXZlIERPTSBlbGVtZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciN0YXJnZXRcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbW91c2UgaGFzIGJlZW4gcG9pbnRlciBsb2NrZWQgc3VjY2Vzc2Z1bGx5IHRoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjbG9ja2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgTW91c2UgTW92ZSBFdmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgc2VudCB0aGUgbmF0aXZlIERPTSBNb3VzZUV2ZW50LlxyXG4gICAgICAgICAqIEluaXRpYWxseSBlbXB0eSBhbmQgYm91bmQgaW4gdGhlIGBzdGFydExpc3RlbmVyc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciNvbk1vdXNlTW92ZVxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbk1vdXNlTW92ZSA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBNb3VzZSBEb3duIEV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzZW50IHRoZSBuYXRpdmUgRE9NIE1vdXNlRXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI29uTW91c2VEb3duXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VEb3duID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIE1vdXNlIFVwIEV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzZW50IHRoZSBuYXRpdmUgRE9NIE1vdXNlRXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI29uTW91c2VVcFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbk1vdXNlVXAgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgTW91c2UgRG93biBFdmVudCBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZXZlbnRzIG9uIHRoZSBXaW5kb3cuXHJcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzZW50IHRoZSBuYXRpdmUgRE9NIE1vdXNlRXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI29uTW91c2VEb3duV2luZG93XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VEb3duV2luZG93ID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIE1vdXNlIFVwIEV2ZW50IGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBldmVudHMgb24gdGhlIFdpbmRvdy5cclxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNlbnQgdGhlIG5hdGl2ZSBET00gTW91c2VFdmVudC5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjb25Nb3VzZVVwV2luZG93XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VVcFdpbmRvdyA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBNb3VzZSBPdmVyIEV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzZW50IHRoZSBuYXRpdmUgRE9NIE1vdXNlRXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI29uTW91c2VPdmVyXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VPdmVyID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIE1vdXNlIE91dCBFdmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgc2VudCB0aGUgbmF0aXZlIERPTSBNb3VzZUV2ZW50LlxyXG4gICAgICAgICAqIEluaXRpYWxseSBlbXB0eSBhbmQgYm91bmQgaW4gdGhlIGBzdGFydExpc3RlbmVyc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciNvbk1vdXNlT3V0XHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VPdXQgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgTW91c2UgV2hlZWwgRXZlbnQgaGFuZGxlci5cclxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNlbnQgdGhlIG5hdGl2ZSBET00gTW91c2VFdmVudC5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjb25Nb3VzZVdoZWVsXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE4LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbCA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHBvaW50ZXJMb2NrQ2hhbmdlIGhhbmRsZXIuXHJcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzZW50IHRoZSBuYXRpdmUgRE9NIE1vdXNlRXZlbnQuXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI3BvaW50ZXJMb2NrQ2hhbmdlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9pbnRlckxvY2tDaGFuZ2UgPSBOT09QO1xyXG5cclxuICAgICAgICBpbnB1dE1hbmFnZXIuZXZlbnRzLm9uY2UoSW5wdXRFdmVudHMuTUFOQUdFUl9CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBUb3VjaCBNYW5hZ2VyIGJvb3QgcHJvY2Vzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1hbmFnZXIuY29uZmlnO1xyXG5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBjb25maWcuaW5wdXRNb3VzZTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IGNvbmZpZy5pbnB1dE1vdXNlRXZlbnRUYXJnZXQ7XHJcbiAgICAgICAgdGhpcy5jYXB0dXJlID0gY29uZmlnLmlucHV0TW91c2VDYXB0dXJlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMudGFyZ2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLm1hbmFnZXIuZ2FtZS5jYW52YXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnRhcmdldCA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudGFyZ2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuZGlzYWJsZUNvbnRleHRNZW51KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udGV4dE1lbnUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdGhpcy50YXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHRzIHRvIGRpc2FibGUgdGhlIGNvbnRleHQgbWVudSBmcm9tIGFwcGVhcmluZyBpZiB5b3UgcmlnaHQtY2xpY2sgb24gdGhlIGJyb3dzZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFdvcmtzIGJ5IGxpc3RlbmluZyBmb3IgdGhlIGBjb250ZXh0bWVudWAgZXZlbnQgYW5kIHByZXZlbnQgZGVmYXVsdGluZyBpdC5cclxuICAgICAqIFxyXG4gICAgICogVXNlIHRoaXMgaWYgeW91IG5lZWQgdG8gZW5hYmxlIHJpZ2h0LWJ1dHRvbiBtb3VzZSBzdXBwb3J0IGluIHlvdXIgZ2FtZSwgYW5kIHRoZSBicm93c2VyXHJcbiAgICAgKiBtZW51IGtlZXBzIGdldHRpbmcgaW4gdGhlIHdheS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjZGlzYWJsZUNvbnRleHRNZW51XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vdXNlIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGVDb250ZXh0TWVudTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBpdCwgeW91IGNhbiByZXF1ZXN0IHRoYXQgdGhlIHBvaW50ZXIgYmUgbG9ja2VkIHRvIHRoZSBicm93c2VyIHdpbmRvdy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGNsYXNzaWNhbGx5IGtub3duIGFzICdGUFMgY29udHJvbHMnLCB3aGVyZSB0aGUgcG9pbnRlciBjYW4ndCBsZWF2ZSB0aGUgYnJvd3NlciB1bnRpbFxyXG4gICAgICogdGhlIHVzZXIgcHJlc3NlcyBhbiBleGl0IGtleS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgYnJvd3NlciBzdWNjZXNzZnVsbHkgZW50ZXJzIGEgbG9ja2VkIHN0YXRlLCBhIGBQT0lOVEVSX0xPQ0tfQ0hBTkdFX0VWRU5UYCB3aWxsIGJlIGRpc3BhdGNoZWQsXHJcbiAgICAgKiBmcm9tIHRoZSBnYW1lcyBJbnB1dCBNYW5hZ2VyLCB3aXRoIGFuIGBpc1BvaW50ZXJMb2NrZWRgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgcG9pbnRlciBsb2NrIGNhbiBvbmx5IGJlIGVuYWJsZWQgYWZ0ZXIgYW4gJ2VuZ2FnZW1lbnQgZ2VzdHVyZScsXHJcbiAgICAgKiBzZWU6IGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9wb2ludGVybG9jay8jZGZuLWVuZ2FnZW1lbnQtZ2VzdHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5JbnB1dC5Nb3VzZS5Nb3VzZU1hbmFnZXIjcmVxdWVzdFBvaW50ZXJMb2NrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmVxdWVzdFBvaW50ZXJMb2NrOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChGZWF0dXJlcy5wb2ludGVyTG9jaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LnJlcXVlc3RQb2ludGVyTG9jayA9IGVsZW1lbnQucmVxdWVzdFBvaW50ZXJMb2NrIHx8IGVsZW1lbnQubW96UmVxdWVzdFBvaW50ZXJMb2NrIHx8IGVsZW1lbnQud2Via2l0UmVxdWVzdFBvaW50ZXJMb2NrO1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgcG9pbnRlciBsb2NrLCB0aGlzIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBwb2ludGVyIGxvY2sgaXMgcmVsZWFzZWQuIElmXHJcbiAgICAgKiB0aGUgYnJvd3NlciBzdWNjZXNzZnVsbHkgZW50ZXJzIGEgbG9ja2VkIHN0YXRlLCBhICdQT0lOVEVSX0xPQ0tfQ0hBTkdFX0VWRU5UJyB3aWxsIGJlXHJcbiAgICAgKiBkaXNwYXRjaGVkIC0gZnJvbSB0aGUgZ2FtZSdzIGlucHV0IG1hbmFnZXIgLSB3aXRoIGFuIGBpc1BvaW50ZXJMb2NrZWRgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciNyZWxlYXNlUG9pbnRlckxvY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZWxlYXNlUG9pbnRlckxvY2s6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKEZlYXR1cmVzLnBvaW50ZXJMb2NrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrID0gZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrIHx8IGRvY3VtZW50Lm1vekV4aXRQb2ludGVyTG9jayB8fCBkb2N1bWVudC53ZWJraXRFeGl0UG9pbnRlckxvY2s7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jaygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIE1vdXNlIEV2ZW50IGxpc3RlbmVycyBydW5uaW5nLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtYW51YWxseSBpbnZva2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0Lk1vdXNlLk1vdXNlTWFuYWdlciNzdGFydExpc3RlbmVyc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0TGlzdGVuZXJzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMubWFuYWdlci5jYW52YXM7XHJcbiAgICAgICAgdmFyIGF1dG9Gb2N1cyA9ICh3aW5kb3cgJiYgd2luZG93LmZvY3VzICYmIHRoaXMubWFuYWdlci5nYW1lLmNvbmZpZy5hdXRvRm9jdXMpO1xyXG5cclxuICAgICAgICB0aGlzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIF90aGlzLmVuYWJsZWQgJiYgX3RoaXMubWFuYWdlciAmJiBfdGhpcy5tYW5hZ2VyLmVuYWJsZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIub25Nb3VzZU1vdmUoZXZlbnQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY2FwdHVyZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChhdXRvRm9jdXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgX3RoaXMuZW5hYmxlZCAmJiBfdGhpcy5tYW5hZ2VyICYmIF90aGlzLm1hbmFnZXIuZW5hYmxlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5vbk1vdXNlRG93bihldmVudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jYXB0dXJlICYmIGV2ZW50LnRhcmdldCA9PT0gY2FudmFzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uTW91c2VEb3duV2luZG93ID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIF90aGlzLmVuYWJsZWQgJiYgX3RoaXMubWFuYWdlciAmJiBfdGhpcy5tYW5hZ2VyLmVuYWJsZWQgJiYgZXZlbnQudGFyZ2V0ICE9PSBjYW52YXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBPbmx5IHByb2Nlc3MgdGhlIGV2ZW50IGlmIHRoZSB0YXJnZXQgaXNuJ3QgdGhlIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5vbk1vdXNlRG93bihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uTW91c2VVcCA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLm9uTW91c2VVcChldmVudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jYXB0dXJlICYmIGV2ZW50LnRhcmdldCA9PT0gY2FudmFzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uTW91c2VVcFdpbmRvdyA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkICYmIGV2ZW50LnRhcmdldCAhPT0gY2FudmFzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgT25seSBwcm9jZXNzIHRoZSBldmVudCBpZiB0aGUgdGFyZ2V0IGlzbid0IHRoZSBjYW52YXNcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIub25Nb3VzZVVwKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMub25Nb3VzZU92ZXIgPSBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgX3RoaXMuZW5hYmxlZCAmJiBfdGhpcy5tYW5hZ2VyICYmIF90aGlzLm1hbmFnZXIuZW5hYmxlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5zZXRDYW52YXNPdmVyKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMub25Nb3VzZU91dCA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLnNldENhbnZhc091dChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbCA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLm9uTW91c2VXaGVlbChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcblxyXG4gICAgICAgIGlmICghdGFyZ2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBhc3NpdmUgPSB7IHBhc3NpdmU6IHRydWUgfTtcclxuICAgICAgICB2YXIgbm9uUGFzc2l2ZSA9IHsgcGFzc2l2ZTogZmFsc2UgfTtcclxuXHJcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUsICh0aGlzLmNhcHR1cmUpID8gbm9uUGFzc2l2ZSA6IHBhc3NpdmUpO1xyXG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duLCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwLCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5vbk1vdXNlT3ZlciwgKHRoaXMuY2FwdHVyZSkgPyBub25QYXNzaXZlIDogcGFzc2l2ZSk7XHJcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5vbk1vdXNlT3V0LCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbCwgKHRoaXMuY2FwdHVyZSkgPyBub25QYXNzaXZlIDogcGFzc2l2ZSk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cgJiYgdGhpcy5tYW5hZ2VyLmdhbWUuY29uZmlnLmlucHV0V2luZG93RXZlbnRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25XaW5kb3csIG5vblBhc3NpdmUpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwV2luZG93LCBub25QYXNzaXZlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChGZWF0dXJlcy5wb2ludGVyTG9jaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucG9pbnRlckxvY2tDaGFuZ2UgPSBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmxvY2tlZCA9IChkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgPT09IGVsZW1lbnQgfHwgZG9jdW1lbnQubW96UG9pbnRlckxvY2tFbGVtZW50ID09PSBlbGVtZW50IHx8IGRvY3VtZW50LndlYmtpdFBvaW50ZXJMb2NrRWxlbWVudCA9PT0gZWxlbWVudCkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5vblBvaW50ZXJMb2NrQ2hhbmdlKGV2ZW50KTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5wb2ludGVyTG9ja0NoYW5nZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21venBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5wb2ludGVyTG9ja0NoYW5nZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHBvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5wb2ludGVyTG9ja0NoYW5nZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBNb3VzZSBFdmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIG1hbnVhbGx5IGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI3N0b3BMaXN0ZW5lcnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzdG9wTGlzdGVuZXJzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuXHJcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duKTtcclxuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcclxuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5vbk1vdXNlT3Zlcik7XHJcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5vbk1vdXNlT3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duV2luZG93KTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcFdpbmRvdyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoRmVhdHVyZXMucG9pbnRlckxvY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybG9ja2NoYW5nZScsIHRoaXMucG9pbnRlckxvY2tDaGFuZ2UsIHRydWUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pwb2ludGVybG9ja2NoYW5nZScsIHRoaXMucG9pbnRlckxvY2tDaGFuZ2UsIHRydWUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRwb2ludGVybG9ja2NoYW5nZScsIHRoaXMucG9pbnRlckxvY2tDaGFuZ2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIE1vdXNlIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuTW91c2UuTW91c2VNYW5hZ2VyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNb3VzZU1hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLklucHV0Lk1vdXNlXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgKi9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgTW91c2VNYW5hZ2VyOiByZXF1aXJlKCcuL01vdXNlTWFuYWdlcicpXHJcbiAgICAgICBcclxufTtcclxuLyogZXNsaW50LWVuYWJsZSAqL1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBJbnB1dEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgTk9PUCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaF9ldmVudHNcclxuLy8gaHR0cHM6Ly9wYXRyaWNraGxhdWtlLmdpdGh1Yi5pby90b3VjaC90ZXN0cy9yZXN1bHRzL1xyXG4vLyBodHRwczovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi9tb2JpbGUvdG91Y2gvXHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgVG91Y2ggTWFuYWdlciBpcyBhIGhlbHBlciBjbGFzcyB0aGF0IGJlbG9uZ3MgdG8gdGhlIElucHV0IE1hbmFnZXIuXHJcbiAqIFxyXG4gKiBJdHMgcm9sZSBpcyB0byBsaXN0ZW4gZm9yIG5hdGl2ZSBET00gVG91Y2ggRXZlbnRzIGFuZCB0aGVuIHBhc3MgdGhlbSBvbnRvIHRoZSBJbnB1dCBNYW5hZ2VyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqIFxyXG4gKiBZb3UgZG8gbm90IG5lZWQgdG8gY3JlYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHksIHRoZSBJbnB1dCBNYW5hZ2VyIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGl0IGF1dG9tYXRpY2FsbHkuXHJcbiAqXHJcbiAqIEBjbGFzcyBUb3VjaE1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5JbnB1dC5Ub3VjaFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLklucHV0LklucHV0TWFuYWdlcn0gaW5wdXRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIElucHV0IE1hbmFnZXIuXHJcbiAqL1xyXG52YXIgVG91Y2hNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRvdWNoTWFuYWdlciAoaW5wdXRNYW5hZ2VyKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBJbnB1dCBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNtYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5JbnB1dC5JbnB1dE1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gaW5wdXRNYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlIHRoZSBET00gZXZlbnRzIHdpbGwgaGF2ZSBldmVudC5wcmV2ZW50RGVmYXVsdCBhcHBsaWVkIHRvIHRoZW0sIGlmIGZhbHNlIHRoZXkgd2lsbCBwcm9wYWdhdGUgZnVsbHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuVG91Y2guVG91Y2hNYW5hZ2VyI2NhcHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYXB0dXJlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBib29sZWFuIHRoYXQgY29udHJvbHMgaWYgdGhlIFRvdWNoIE1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgICAgICogQ2FuIGJlIHRvZ2dsZWQgb24gdGhlIGZseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjZW5hYmxlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUb3VjaCBFdmVudCB0YXJnZXQsIGFzIGRlZmluZWQgaW4gdGhlIEdhbWUgQ29uZmlnLlxyXG4gICAgICAgICAqIFR5cGljYWxseSB0aGUgY2FudmFzIHRvIHdoaWNoIHRoZSBnYW1lIGlzIHJlbmRlcmluZywgYnV0IGNhbiBiZSBhbnkgaW50ZXJhY3RpdmUgRE9NIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuVG91Y2guVG91Y2hNYW5hZ2VyI3RhcmdldFxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50YXJnZXQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUb3VjaCBTdGFydCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIEluaXRpYWxseSBlbXB0eSBhbmQgYm91bmQgaW4gdGhlIGBzdGFydExpc3RlbmVyc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNvblRvdWNoU3RhcnRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vblRvdWNoU3RhcnQgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVG91Y2ggU3RhcnQgZXZlbnQgaGFuZGxlciBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZm9yIGV2ZW50cyBvbiB0aGUgV2luZG93LlxyXG4gICAgICAgICAqIEluaXRpYWxseSBlbXB0eSBhbmQgYm91bmQgaW4gdGhlIGBzdGFydExpc3RlbmVyc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNvblRvdWNoU3RhcnRXaW5kb3dcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0V2luZG93ID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRvdWNoIE1vdmUgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjb25Ub3VjaE1vdmVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZSA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUb3VjaCBFbmQgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjb25Ub3VjaEVuZFxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uVG91Y2hFbmQgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVG91Y2ggRW5kIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gc3BlY2lmaWNhbGx5IGZvciBldmVudHMgb24gdGhlIFdpbmRvdy5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjb25Ub3VjaEVuZFdpbmRvd1xyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vblRvdWNoRW5kV2luZG93ID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRvdWNoIENhbmNlbCBldmVudCBoYW5kbGVyIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIEluaXRpYWxseSBlbXB0eSBhbmQgYm91bmQgaW4gdGhlIGBzdGFydExpc3RlbmVyc2AgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNvblRvdWNoQ2FuY2VsXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE1LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uVG91Y2hDYW5jZWwgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVG91Y2ggQ2FuY2VsIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gc3BlY2lmaWNhbGx5IGZvciBldmVudHMgb24gdGhlIFdpbmRvdy5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjb25Ub3VjaENhbmNlbFdpbmRvd1xyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vblRvdWNoQ2FuY2VsV2luZG93ID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRvdWNoIE92ZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvbi5cclxuICAgICAgICAgKiBJbml0aWFsbHkgZW1wdHkgYW5kIGJvdW5kIGluIHRoZSBgc3RhcnRMaXN0ZW5lcnNgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5JbnB1dC5Ub3VjaC5Ub3VjaE1hbmFnZXIjb25Ub3VjaE92ZXJcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25Ub3VjaE92ZXIgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVG91Y2ggT3V0IGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uXHJcbiAgICAgICAgICogSW5pdGlhbGx5IGVtcHR5IGFuZCBib3VuZCBpbiB0aGUgYHN0YXJ0TGlzdGVuZXJzYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuSW5wdXQuVG91Y2guVG91Y2hNYW5hZ2VyI29uVG91Y2hPdXRcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25Ub3VjaE91dCA9IE5PT1A7XHJcblxyXG4gICAgICAgIGlucHV0TWFuYWdlci5ldmVudHMub25jZShJbnB1dEV2ZW50cy5NQU5BR0VSX0JPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFRvdWNoIE1hbmFnZXIgYm9vdCBwcm9jZXNzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubWFuYWdlci5jb25maWc7XHJcblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGNvbmZpZy5pbnB1dFRvdWNoO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gY29uZmlnLmlucHV0VG91Y2hFdmVudFRhcmdldDtcclxuICAgICAgICB0aGlzLmNhcHR1cmUgPSBjb25maWcuaW5wdXRUb3VjaENhcHR1cmU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy50YXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMubWFuYWdlci5nYW1lLmNhbnZhcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuZGlzYWJsZUNvbnRleHRNZW51KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29udGV4dE1lbnUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdGhpcy50YXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGVtcHRzIHRvIGRpc2FibGUgdGhlIGNvbnRleHQgbWVudSBmcm9tIGFwcGVhcmluZyBpZiB5b3UgdG91Y2gtaG9sZCBvbiB0aGUgYnJvd3Nlci5cclxuICAgICAqIFxyXG4gICAgICogV29ya3MgYnkgbGlzdGVuaW5nIGZvciB0aGUgYGNvbnRleHRtZW51YCBldmVudCBhbmQgcHJldmVudCBkZWZhdWx0aW5nIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byBkaXNhYmxlIHRoZSBPUyBjb250ZXh0IG1lbnUgb24gbW9iaWxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNkaXNhYmxlQ29udGV4dE1lbnVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRvdWNoIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGVDb250ZXh0TWVudTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIFRvdWNoIEV2ZW50IGxpc3RlbmVycyBydW5uaW5nIGFzIGxvbmcgYXMgYW4gaW5wdXQgdGFyZ2V0IGlzIHNldC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgVG91Y2ggSW5wdXQgaXMgZW5hYmxlZCBpbiB0aGUgZ2FtZSBjb25maWcsXHJcbiAgICAgKiB3aGljaCBpdCBpcyBieSBkZWZhdWx0LiBIb3dldmVyLCB5b3UgY2FuIGNhbGwgaXQgbWFudWFsbHkgc2hvdWxkIHlvdSBuZWVkIHRvXHJcbiAgICAgKiBkZWxheSBpbnB1dCBjYXB0dXJpbmcgdW50aWwgbGF0ZXIgaW4gdGhlIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuSW5wdXQuVG91Y2guVG91Y2hNYW5hZ2VyI3N0YXJ0TGlzdGVuZXJzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RhcnRMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5tYW5hZ2VyLmNhbnZhcztcclxuICAgICAgICB2YXIgYXV0b0ZvY3VzID0gKHdpbmRvdyAmJiB3aW5kb3cuZm9jdXMgJiYgdGhpcy5tYW5hZ2VyLmdhbWUuY29uZmlnLmF1dG9Gb2N1cyk7XHJcblxyXG4gICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGF1dG9Gb2N1cylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLm9uVG91Y2hTdGFydChldmVudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jYXB0dXJlICYmIGV2ZW50LmNhbmNlbGFibGUgJiYgZXZlbnQudGFyZ2V0ID09PSBjYW52YXMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0V2luZG93ID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIF90aGlzLmVuYWJsZWQgJiYgX3RoaXMubWFuYWdlciAmJiBfdGhpcy5tYW5hZ2VyLmVuYWJsZWQgJiYgZXZlbnQudGFyZ2V0ICE9PSBjYW52YXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBPbmx5IHByb2Nlc3MgdGhlIGV2ZW50IGlmIHRoZSB0YXJnZXQgaXNuJ3QgdGhlIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5vblRvdWNoU3RhcnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLm9uVG91Y2hNb3ZlKGV2ZW50KTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmNhcHR1cmUgJiYgZXZlbnQuY2FuY2VsYWJsZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRvdWNoRW5kID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIF90aGlzLmVuYWJsZWQgJiYgX3RoaXMubWFuYWdlciAmJiBfdGhpcy5tYW5hZ2VyLmVuYWJsZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIub25Ub3VjaEVuZChldmVudCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jYXB0dXJlICYmIGV2ZW50LmNhbmNlbGFibGUgJiYgZXZlbnQudGFyZ2V0ID09PSBjYW52YXMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMub25Ub3VjaEVuZFdpbmRvdyA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkICYmIGV2ZW50LnRhcmdldCAhPT0gY2FudmFzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgT25seSBwcm9jZXNzIHRoZSBldmVudCBpZiB0aGUgdGFyZ2V0IGlzbid0IHRoZSBjYW52YXNcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIub25Ub3VjaEVuZChldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm9uVG91Y2hDYW5jZWwgPSBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgJiYgX3RoaXMuZW5hYmxlZCAmJiBfdGhpcy5tYW5hZ2VyICYmIF90aGlzLm1hbmFnZXIuZW5hYmxlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMubWFuYWdlci5vblRvdWNoQ2FuY2VsKGV2ZW50KTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmNhcHR1cmUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMub25Ub3VjaENhbmNlbFdpbmRvdyA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLm9uVG91Y2hDYW5jZWwoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRvdWNoT3ZlciA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBfdGhpcy5lbmFibGVkICYmIF90aGlzLm1hbmFnZXIgJiYgX3RoaXMubWFuYWdlci5lbmFibGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5tYW5hZ2VyLnNldENhbnZhc092ZXIoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vblRvdWNoT3V0ID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIF90aGlzLmVuYWJsZWQgJiYgX3RoaXMubWFuYWdlciAmJiBfdGhpcy5tYW5hZ2VyLmVuYWJsZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm1hbmFnZXIuc2V0Q2FudmFzT3V0KGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuXHJcbiAgICAgICAgaWYgKCF0YXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGFzc2l2ZSA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xyXG4gICAgICAgIHZhciBub25QYXNzaXZlID0geyBwYXNzaXZlOiBmYWxzZSB9O1xyXG5cclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0LCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSwgKHRoaXMuY2FwdHVyZSkgPyBub25QYXNzaXZlIDogcGFzc2l2ZSk7XHJcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kLCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uVG91Y2hDYW5jZWwsICh0aGlzLmNhcHR1cmUpID8gbm9uUGFzc2l2ZSA6IHBhc3NpdmUpO1xyXG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG92ZXInLCB0aGlzLm9uVG91Y2hPdmVyLCAodGhpcy5jYXB0dXJlKSA/IG5vblBhc3NpdmUgOiBwYXNzaXZlKTtcclxuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hvdXQnLCB0aGlzLm9uVG91Y2hPdXQsICh0aGlzLmNhcHR1cmUpID8gbm9uUGFzc2l2ZSA6IHBhc3NpdmUpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93ICYmIHRoaXMubWFuYWdlci5nYW1lLmNvbmZpZy5pbnB1dFdpbmRvd0V2ZW50cylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnRXaW5kb3csIG5vblBhc3NpdmUpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmRXaW5kb3csIG5vblBhc3NpdmUpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uVG91Y2hDYW5jZWxXaW5kb3csIG5vblBhc3NpdmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGUgVG91Y2ggRXZlbnQgbGlzdGVuZXJzLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBtYW51YWxseSBpbnZva2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNzdG9wTGlzdGVuZXJzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RvcExpc3RlbmVyczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7XHJcblxyXG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnQpO1xyXG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uVG91Y2hNb3ZlKTtcclxuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmQpO1xyXG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMub25Ub3VjaENhbmNlbCk7XHJcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNob3ZlcicsIHRoaXMub25Ub3VjaE92ZXIpO1xyXG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG91dCcsIHRoaXMub25Ub3VjaE91dCk7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0V2luZG93KTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kV2luZG93KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBUb3VjaCBNYW5hZ2VyIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLklucHV0LlRvdWNoLlRvdWNoTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVG91Y2hNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5JbnB1dC5Ub3VjaFxyXG4gKi9cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFRvdWNoTWFuYWdlcjogcmVxdWlyZSgnLi9Ub3VjaE1hbmFnZXInKVxyXG4gICAgICAgXHJcbn07XHJcbi8qIGVzbGludC1lbmFibGUgKi9cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgR2V0VVJMID0gcmVxdWlyZSgnLi9HZXRVUkwnKTtcclxudmFyIE1lcmdlWEhSU2V0dGluZ3MgPSByZXF1aXJlKCcuL01lcmdlWEhSU2V0dGluZ3MnKTtcclxudmFyIFhIUkxvYWRlciA9IHJlcXVpcmUoJy4vWEhSTG9hZGVyJyk7XHJcbnZhciBYSFJTZXR0aW5ncyA9IHJlcXVpcmUoJy4vWEhSU2V0dGluZ3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBiYXNlIEZpbGUgY2xhc3MgdXNlZCBieSBhbGwgRmlsZSBUeXBlcyB0aGF0IHRoZSBMb2FkZXIgY2FuIHN1cHBvcnQuXHJcbiAqIFlvdSBzaG91bGRuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgRmlsZSBkaXJlY3RseSwgYnV0IHNob3VsZCBleHRlbmQgaXQgd2l0aCB5b3VyIG93biBjbGFzcywgc2V0dGluZyBhIGN1c3RvbSB0eXBlIGFuZCBwcm9jZXNzaW5nIG1ldGhvZHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBGaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gVGhlIExvYWRlciB0aGF0IGlzIGdvaW5nIHRvIGxvYWQgdGhpcyBGaWxlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZUNvbmZpZ30gZmlsZUNvbmZpZyAtIFRoZSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBhcyBjcmVhdGVkIGJ5IHRoZSBmaWxlIHR5cGUuXHJcbiAqL1xyXG52YXIgRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBGaWxlIChsb2FkZXIsIGZpbGVDb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIGdvaW5nIHRvIGxvYWQgdGhpcyBmaWxlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI2xvYWRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIENhY2hlLCBvciBUZXh0dXJlIE1hbmFnZXIsIHRoYXQgaXMgZ29pbmcgdG8gc3RvcmUgdGhpcyBmaWxlIGlmIGl0IGxvYWRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI2NhY2hlXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlcil9XHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IEdldEZhc3RWYWx1ZShmaWxlQ29uZmlnLCAnY2FjaGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmaWxlIHR5cGUgc3RyaW5nIChpbWFnZSwganNvbiwgZXRjKSBmb3Igc29ydGluZyB3aXRoaW4gdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSBHZXRGYXN0VmFsdWUoZmlsZUNvbmZpZywgJ3R5cGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVuaXF1ZSBjYWNoZSBrZXkgKHVuaXF1ZSB3aXRoaW4gaXRzIGZpbGUgdHlwZSlcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSNrZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMua2V5ID0gR2V0RmFzdFZhbHVlKGZpbGVDb25maWcsICdrZXknLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHZhciBsb2FkS2V5ID0gdGhpcy5rZXk7XHJcblxyXG4gICAgICAgIGlmIChsb2FkZXIucHJlZml4ICYmIGxvYWRlci5wcmVmaXggIT09ICcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5rZXkgPSBsb2FkZXIucHJlZml4ICsgbG9hZEtleTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy50eXBlIHx8ICF0aGlzLmtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgY2FsbGluZyBcXCdMb2FkZXIuJyArIHRoaXMudHlwZSArICdcXCcgaW52YWxpZCBrZXkgcHJvdmlkZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBmaWxlLCBub3QgaW5jbHVkaW5nIGJhc2VVUkwuXHJcbiAgICAgICAgICogQXV0b21hdGljYWxseSBoYXMgTG9hZGVyLnBhdGggcHJlcGVuZGVkIHRvIGl0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI3VybFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51cmwgPSBHZXRGYXN0VmFsdWUoZmlsZUNvbmZpZywgJ3VybCcpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy51cmwgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXJsID0gbG9hZGVyLnBhdGggKyBsb2FkS2V5ICsgJy4nICsgR2V0RmFzdFZhbHVlKGZpbGVDb25maWcsICdleHRlbnNpb24nLCAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZih0aGlzLnVybCkgIT09ICdmdW5jdGlvbicgJiYgdGhpcy51cmwuaW5kZXhPZignYmxvYjonKSAhPT0gMCAmJiB0aGlzLnVybC5pbmRleE9mKCdkYXRhOicpICE9PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy51cmwgPSBsb2FkZXIucGF0aCArIHRoaXMudXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZpbmFsIFVSTCB0aGlzIGZpbGUgd2lsbCBsb2FkIGZyb20sIGluY2x1ZGluZyBiYXNlVVJMIGFuZCBwYXRoLlxyXG4gICAgICAgICAqIFNldCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIExvYWRlciBjYWxscyAnbG9hZCcgb24gdGhpcyBmaWxlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI3NyY1xyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zcmMgPSAnJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1lcmdlZCBYSFJTZXR0aW5ncyBmb3IgdGhpcyBmaWxlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI3hoclNldHRpbmdzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54aHJTZXR0aW5ncyA9IFhIUlNldHRpbmdzKEdldEZhc3RWYWx1ZShmaWxlQ29uZmlnLCAncmVzcG9uc2VUeXBlJywgdW5kZWZpbmVkKSk7XHJcblxyXG4gICAgICAgIGlmIChHZXRGYXN0VmFsdWUoZmlsZUNvbmZpZywgJ3hoclNldHRpbmdzJywgZmFsc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54aHJTZXR0aW5ncyA9IE1lcmdlWEhSU2V0dGluZ3ModGhpcy54aHJTZXR0aW5ncywgR2V0RmFzdFZhbHVlKGZpbGVDb25maWcsICd4aHJTZXR0aW5ncycsIHt9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgWE1MSHR0cFJlcXVlc3QgaW5zdGFuY2UgKGFzIGNyZWF0ZWQgYnkgWEhSIExvYWRlcikgdGhhdCBpcyBsb2FkaW5nIHRoaXMgRmlsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSN4aHJMb2FkZXJcclxuICAgICAgICAgKiBAdHlwZSB7P1hNTEh0dHBSZXF1ZXN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMueGhyTG9hZGVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbGUuIE9uZSBvZiB0aGUgRklMRV9DT05TVCB2YWx1ZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZpbGUjc3RhdGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXRlID0gKHR5cGVvZih0aGlzLnVybCkgPT09ICdmdW5jdGlvbicpID8gQ09OU1QuRklMRV9QT1BVTEFURUQgOiBDT05TVC5GSUxFX1BFTkRJTkc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBzaXplIG9mIHRoaXMgZmlsZS5cclxuICAgICAgICAgKiBTZXQgYnkgb25Qcm9ncmVzcyBhbmQgb25seSBpZiBsb2FkaW5nIHZpYSBYSFIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZpbGUjYnl0ZXNUb3RhbFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnl0ZXNUb3RhbCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVwZGF0ZWQgYXMgdGhlIGZpbGUgbG9hZHMuXHJcbiAgICAgICAgICogT25seSBzZXQgaWYgbG9hZGluZyB2aWEgWEhSLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI2J5dGVzTG9hZGVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnl0ZXNMb2FkZWQgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBwZXJjZW50YWdlIHZhbHVlIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGhvdyBtdWNoIG9mIHRoaXMgZmlsZSBoYXMgbG9hZGVkLlxyXG4gICAgICAgICAqIE9ubHkgc2V0IGlmIGxvYWRpbmcgdmlhIFhIUi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSNwZXJjZW50Q29tcGxldGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IC0xXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wZXJjZW50Q29tcGxldGUgPSAtMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRm9yIENPUnMgYmFzZWQgbG9hZGluZy5cclxuICAgICAgICAgKiBJZiB0aGlzIGlzIHVuZGVmaW5lZCB0aGVuIHRoZSBGaWxlIHdpbGwgY2hlY2sgQmFzZUxvYWRlci5jcm9zc09yaWdpbiBhbmQgdXNlIHRoYXQgKGlmIHNldClcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSNjcm9zc09yaWdpblxyXG4gICAgICAgICAqIEB0eXBlIHsoc3RyaW5nfHVuZGVmaW5lZCl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jcm9zc09yaWdpbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByb2Nlc3NlZCBmaWxlIGRhdGEsIHN0b3JlZCBoZXJlIGFmdGVyIHRoZSBmaWxlIGhhcyBsb2FkZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZpbGUjZGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHsqfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25maWcgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkgZmlsZSB0eXBlcyB0byBzdG9yZSB0cmFuc2l0aW9uYWwgZGF0YS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRmlsZSNjb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7Kn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IEdldEZhc3RWYWx1ZShmaWxlQ29uZmlnLCAnY29uZmlnJywge30pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGlzIGEgbXVsdGlwYXJ0IGZpbGUsIGkuZS4gYW4gYXRsYXMgYW5kIGl0cyBqc29uIHRvZ2V0aGVyLCB0aGVuIHRoaXMgaXMgYSByZWZlcmVuY2VcclxuICAgICAgICAgKiB0byB0aGUgcGFyZW50IE11bHRpRmlsZS4gU2V0IGFuZCB1c2VkIGludGVybmFsbHkgYnkgdGhlIExvYWRlciBvciBzcGVjaWZpYyBmaWxlIHR5cGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GaWxlI211bHRpRmlsZVxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLkxvYWRlci5NdWx0aUZpbGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdWx0aUZpbGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvZXMgdGhpcyBmaWxlIGhhdmUgYW4gYXNzb2NpYXRlZCBsaW5rZWQgZmlsZT8gU3VjaCBhcyBhbiBpbWFnZSBhbmQgYSBub3JtYWwgbWFwLlxyXG4gICAgICAgICAqIEF0bGFzZXMgYW5kIEJpdG1hcCBGb250cyB1c2UgdGhlIG11bHRpRmlsZSwgYmVjYXVzZSB0aG9zZSBmaWxlcyBuZWVkIGxvYWRpbmcgdG9nZXRoZXIgYnV0IGFyZW4ndFxyXG4gICAgICAgICAqIGFjdHVhbGx5IGJvdW5kIGJ5IGRhdGEsIHdoZXJlLWFzIGEgbGlua0ZpbGUgaXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZpbGUjbGlua0ZpbGVcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5Mb2FkZXIuRmlsZX1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpbmtGaWxlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpbmtzIHRoaXMgRmlsZSB3aXRoIGFub3RoZXIsIHNvIHRoZXkgZGVwZW5kIHVwb24gZWFjaCBvdGhlciBmb3IgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZSNzZXRMaW5rXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuRmlsZX0gZmlsZUIgLSBUaGUgZmlsZSB0byBsaW5rIHRvIHRoaXMgb25lLlxyXG4gICAgICovXHJcbiAgICBzZXRMaW5rOiBmdW5jdGlvbiAoZmlsZUIpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saW5rRmlsZSA9IGZpbGVCO1xyXG5cclxuICAgICAgICBmaWxlQi5saW5rRmlsZSA9IHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoZSBYSFJMb2FkZXIgaW5zdGFuY2UgdGhpcyBmaWxlIGlzIHVzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlI3Jlc2V0WEhSXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmVzZXRYSFI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMueGhyTG9hZGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54aHJMb2FkZXIub25sb2FkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLnhockxvYWRlci5vbmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB0aGlzLnhockxvYWRlci5vbnByb2dyZXNzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIExvYWRlciwgc3RhcnRzIHRoZSBhY3R1YWwgZmlsZSBkb3dubG9hZGluZy5cclxuICAgICAqIER1cmluZyB0aGUgbG9hZCB0aGUgbWV0aG9kcyBvbkxvYWQsIG9uRXJyb3IgYW5kIG9uUHJvZ3Jlc3MgYXJlIGNhbGxlZCwgYmFzZWQgb24gdGhlIFhIUiBldmVudHMuXHJcbiAgICAgKiBZb3Ugc2hvdWxkbid0IG5vcm1hbGx5IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHksIGl0J3MgbWVhbnQgdG8gYmUgaW52b2tlZCBieSB0aGUgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlI2xvYWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsb2FkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDT05TVC5GSUxFX1BPUFVMQVRFRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDYW4gaGFwcGVuIGZvciBleGFtcGxlIGluIGEgSlNPTkZpbGUgaWYgdGhleSd2ZSBwcm92aWRlZCBhIEpTT04gb2JqZWN0IGluc3RlYWQgb2YgYSBVUkxcclxuICAgICAgICAgICAgdGhpcy5sb2FkZXIubmV4dEZpbGUodGhpcywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3JjID0gR2V0VVJMKHRoaXMsIHRoaXMubG9hZGVyLmJhc2VVUkwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc3JjLmluZGV4T2YoJ2RhdGE6JykgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWwgZGF0YSBVUklzIGFyZSBub3Qgc3VwcG9ydGVkOiAnICsgdGhpcy5rZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRoZSBjcmVhdGlvbiBvZiB0aGlzIFhIUkxvYWRlciBzdGFydHMgdGhlIGxvYWQgcHJvY2VzcyBnb2luZy5cclxuICAgICAgICAgICAgICAgIC8vICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbCB0aGUgZm9sbG93aW5nLCBiYXNlZCBvbiB0aGUgbG9hZCBvdXRjb21lOlxyXG4gICAgICAgICAgICAgICAgLy8gIFxyXG4gICAgICAgICAgICAgICAgLy8geGhyLm9ubG9hZCA9IHRoaXMub25Mb2FkXHJcbiAgICAgICAgICAgICAgICAvLyB4aHIub25lcnJvciA9IHRoaXMub25FcnJvclxyXG4gICAgICAgICAgICAgICAgLy8geGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3NcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnhockxvYWRlciA9IFhIUkxvYWRlcih0aGlzLCB0aGlzLmxvYWRlci54aHIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBmaWxlIGZpbmlzaGVzIGxvYWRpbmcsIGlzIHNlbnQgYSBET00gUHJvZ3Jlc3NFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZSNvbkxvYWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhociAtIFRoZSBYTUxIdHRwUmVxdWVzdCB0aGF0IGNhdXNlZCB0aGlzIG9ubG9hZCBldmVudC5cclxuICAgICAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQgLSBUaGUgRE9NIFByb2dyZXNzRXZlbnQgdGhhdCByZXN1bHRlZCBmcm9tIHRoaXMgbG9hZC5cclxuICAgICAqL1xyXG4gICAgb25Mb2FkOiBmdW5jdGlvbiAoeGhyLCBldmVudClcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9jYWxGaWxlT2sgPSAoKHhoci5yZXNwb25zZVVSTCAmJiB4aHIucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmIGV2ZW50LnRhcmdldC5zdGF0dXMgPT09IDApKTtcclxuXHJcbiAgICAgICAgdmFyIHN1Y2Nlc3MgPSAhKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQuc3RhdHVzICE9PSAyMDApIHx8IGxvY2FsRmlsZU9rO1xyXG5cclxuICAgICAgICAvLyAgSGFuZGxlIEhUVFAgc3RhdHVzIGNvZGVzIG9mIDR4eCBhbmQgNXh4IGFzIGVycm9ycywgZXZlbiBpZiB4aHIub25lcnJvciB3YXMgbm90IGNhbGxlZC5cclxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQgJiYgeGhyLnN0YXR1cyA+PSA0MDAgJiYgeGhyLnN0YXR1cyA8PSA1OTkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0WEhSKCk7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLm5leHRGaWxlKHRoaXMsIHN1Y2Nlc3MpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpZiB0aGUgZmlsZSBlcnJvcnMgd2hpbGUgbG9hZGluZywgaXMgc2VudCBhIERPTSBQcm9ncmVzc0V2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlI29uRXJyb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhociAtIFRoZSBYTUxIdHRwUmVxdWVzdCB0aGF0IGNhdXNlZCB0aGlzIG9ubG9hZCBldmVudC5cclxuICAgICAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQgLSBUaGUgRE9NIFByb2dyZXNzRXZlbnQgdGhhdCByZXN1bHRlZCBmcm9tIHRoaXMgZXJyb3IuXHJcbiAgICAgKi9cclxuICAgIG9uRXJyb3I6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNldFhIUigpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5uZXh0RmlsZSh0aGlzLCBmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGR1cmluZyB0aGUgZmlsZSBsb2FkIHByb2dyZXNzLiBJcyBzZW50IGEgRE9NIFByb2dyZXNzRXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUjb25Qcm9ncmVzc1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuRXZlbnRzI0ZJTEVfUFJPR1JFU1NcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQgLSBUaGUgRE9NIFByb2dyZXNzRXZlbnQuXHJcbiAgICAgKi9cclxuICAgIG9uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChldmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYnl0ZXNMb2FkZWQgPSBldmVudC5sb2FkZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuYnl0ZXNUb3RhbCA9IGV2ZW50LnRvdGFsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wZXJjZW50Q29tcGxldGUgPSBNYXRoLm1pbigodGhpcy5ieXRlc0xvYWRlZCAvIHRoaXMuYnl0ZXNUb3RhbCksIDEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkZXIuZW1pdChFdmVudHMuRklMRV9QUk9HUkVTUywgdGhpcywgdGhpcy5wZXJjZW50Q29tcGxldGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc3VhbGx5IG92ZXJyaWRkZW4gYnkgdGhlIEZpbGVUeXBlcyBhbmQgaXMgY2FsbGVkIGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YSwgZm9yIGV4YW1wbGUgYSBKU09OIGZpbGUgd2lsbCBwYXJzZSBpdHNlbGYgZHVyaW5nIHRoaXMgc3RhZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUjb25Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25Qcm9jZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX1BST0NFU1NJTkc7XHJcblxyXG4gICAgICAgIHRoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRmlsZSBoYXMgY29tcGxldGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBDaGVja3Mgb24gdGhlIHN0YXRlIG9mIGl0cyBtdWx0aWZpbGUsIGlmIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZSNvblByb2Nlc3NDb21wbGV0ZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2Vzc0NvbXBsZXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX0NPTVBMRVRFO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tdWx0aUZpbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpRmlsZS5vbkZpbGVDb21wbGV0ZSh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLmZpbGVQcm9jZXNzQ29tcGxldGUodGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIEZpbGUgaGFzIGNvbXBsZXRlZCBwcm9jZXNzaW5nIGJ1dCBpdCBnZW5lcmF0ZWQgYW4gZXJyb3IuXHJcbiAgICAgKiBDaGVja3Mgb24gdGhlIHN0YXRlIG9mIGl0cyBtdWx0aWZpbGUsIGlmIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZSNvblByb2Nlc3NFcnJvclxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2Vzc0Vycm9yOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX0VSUk9SRUQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm11bHRpRmlsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlGaWxlLm9uRmlsZUZhaWxlZCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLmZpbGVQcm9jZXNzQ29tcGxldGUodGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGEga2V5IG1hdGNoaW5nIHRoZSBvbmUgdXNlZCBieSB0aGlzIGZpbGUgZXhpc3RzIGluIHRoZSB0YXJnZXQgQ2FjaGUgb3Igbm90LlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgTG9hZGVyUGx1Z2luIHRvIGRlY2lkZSBpZiB0aGUgZmlsZSBjYW4gYmUgc2FmZWx5XHJcbiAgICAgKiBsb2FkZWQgb3Igd2lsbCBjb25mbGljdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZSNoYXNDYWNoZUNvbmZsaWN0XHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYWRkaW5nIHRoaXMgZmlsZSB3aWxsIGNhdXNlIGEgY29uZmxpY3QsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBoYXNDYWNoZUNvbmZsaWN0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5jYWNoZSAmJiB0aGlzLmNhY2hlLmV4aXN0cyh0aGlzLmtleSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvZnRlbiBvdmVycmlkZGVuIGJ5IHNwZWNpZmljIGZpbGUgdHlwZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUjYWRkVG9DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FjaGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlLmFkZCh0aGlzLmtleSwgdGhpcy5kYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3koKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgb25jZSB0aGUgZmlsZSBoYXMgYmVlbiBhZGRlZCB0byBpdHMgY2FjaGUgYW5kIGlzIG5vdyByZWFkeSBmb3IgZGVsZXRpb24gZnJvbSB0aGUgTG9hZGVyLlxyXG4gICAgICogSXQgd2lsbCBlbWl0IGEgYGZpbGVjb21wbGV0ZWAgZXZlbnQgZnJvbSB0aGUgTG9hZGVyUGx1Z2luLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlI3BlbmRpbmdEZXN0cm95XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5FdmVudHMjRklMRV9DT01QTEVURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuRXZlbnRzI0ZJTEVfS0VZX0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgcGVuZGluZ0Rlc3Ryb3k6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsgZGF0YSA9IHRoaXMuZGF0YTsgfVxyXG5cclxuICAgICAgICB2YXIga2V5ID0gdGhpcy5rZXk7XHJcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLmVtaXQoRXZlbnRzLkZJTEVfQ09NUExFVEUsIGtleSwgdHlwZSwgZGF0YSk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXIuZW1pdChFdmVudHMuRklMRV9LRVlfQ09NUExFVEUgKyB0eXBlICsgJy0nICsga2V5LCBrZXksIHR5cGUsIGRhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5mbGFnRm9yUmVtb3ZhbCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoaXMgRmlsZSBhbmQgYW55IHJlZmVyZW5jZXMgaXQgaG9sZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMueGhyU2V0dGluZ3MgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubXVsdGlGaWxlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxpbmtGaWxlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgb2JqZWN0IFVSTCB1c2luZyBVUkwgQVBJIGFuZCBzZXR0aW5nIGl0IGFzIGltYWdlICdzcmMnIGF0dHJpYnV0ZS5cclxuICogSWYgVVJMIEFQSSBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IG9uIG9sZCBicm93c2VycykgaXQgZmFsbHMgYmFjayB0byBjcmVhdGluZyBCYXNlNjQgZW5jb2RlZCB1cmwgdXNpbmcgRmlsZVJlYWRlci5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUuY3JlYXRlT2JqZWN0VVJMXHJcbiAqIEBzdGF0aWNcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltYWdlIC0gSW1hZ2Ugb2JqZWN0IHdoaWNoICdzcmMnIGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvIG9iamVjdCBVUkwuXHJcbiAqIEBwYXJhbSB7QmxvYn0gYmxvYiAtIEEgQmxvYiBvYmplY3QgdG8gY3JlYXRlIGFuIG9iamVjdCBVUkwgZm9yLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdFR5cGUgLSBEZWZhdWx0IG1pbWUgdHlwZSB1c2VkIGlmIGJsb2IgdHlwZSBpcyBub3QgYXZhaWxhYmxlLlxyXG4gKi9cclxuRmlsZS5jcmVhdGVPYmplY3RVUkwgPSBmdW5jdGlvbiAoaW1hZ2UsIGJsb2IsIGRlZmF1bHRUeXBlKVxyXG57XHJcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJylcclxuICAgIHtcclxuICAgICAgICBpbWFnZS5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnY3Jvc3NPcmlnaW4nKTtcclxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gJ2RhdGE6JyArIChibG9iLnR5cGUgfHwgZGVmYXVsdFR5cGUpICsgJztiYXNlNjQsJyArIHJlYWRlci5yZXN1bHQuc3BsaXQoJywnKVsxXTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZWFkZXIub25lcnJvciA9IGltYWdlLm9uZXJyb3I7XHJcblxyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFN0YXRpYyBtZXRob2QgZm9yIHJlbGVhc2luZyBhbiBleGlzdGluZyBvYmplY3QgVVJMIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNyZWF0ZWRcclxuICogYnkgY2FsbGluZyB7QGxpbmsgRmlsZSNjcmVhdGVPYmplY3RVUkx9IG1ldGhvZC5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGUucmV2b2tlT2JqZWN0VVJMXHJcbiAqIEBzdGF0aWNcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltYWdlIC0gSW1hZ2Ugb2JqZWN0IHdoaWNoICdzcmMnIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmV2b2tlZC5cclxuICovXHJcbkZpbGUucmV2b2tlT2JqZWN0VVJMID0gZnVuY3Rpb24gKGltYWdlKVxyXG57XHJcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJylcclxuICAgIHtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltYWdlLnNyYyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIHR5cGVzID0ge307XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc01hbmFnZXJcclxuICovXHJcblxyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBtZXRob2QgY2FsbGVkIHdoZW4gYSBMb2FkZXJQbHVnaW4gaXMgY3JlYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogTG9vcHMgdGhyb3VnaCB0aGUgbG9jYWwgdHlwZXMgb2JqZWN0IGFuZCBpbmplY3RzIGFsbCBvZiB0aGVtIGFzXHJcbiAgICAgKiBwcm9wZXJ0aWVzIGludG8gdGhlIExvYWRlclBsdWdpbiBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzTWFuYWdlci5pbnN0YWxsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gVGhlIExvYWRlclBsdWdpbiB0byBpbnN0YWxsIHRoZSB0eXBlcyBpbnRvLlxyXG4gICAgICovXHJcbiAgICBpbnN0YWxsOiBmdW5jdGlvbiAobG9hZGVyKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0eXBlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRlcltrZXldID0gdHlwZXNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhdGljIG1ldGhvZCBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIEZpbGUgVHlwZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBrZXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCB0aGUgZmlsZXMgdmlhIHRoZSBMb2FkZXIsIGkuZS4gYGltYWdlYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBtZXRob2QgbmFtZSBpbiB0aGUgTG9hZGVyUGx1Z2luLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZmFjdG9yeUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBMb2FkZXJQbHVnaW4ua2V5IGlzIGludm9rZWQuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoa2V5LCBmYWN0b3J5RnVuY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdHlwZXNba2V5XSA9IGZhY3RvcnlGdW5jdGlvbjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVkIGFsbCBhc3NvY2lhdGVkIGZpbGUgdHlwZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc01hbmFnZXIuZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdHlwZXMgPSB7fTtcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGVUeXBlc01hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgRmlsZSBhbmQgYSBiYXNlVVJMIHZhbHVlIHRoaXMgcmV0dXJucyB0aGUgVVJMIHRoZSBGaWxlIHdpbGwgdXNlIHRvIGRvd25sb2FkIGZyb20uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTG9hZGVyLkdldFVSTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGUgLSBUaGUgRmlsZSBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIC0gQSBkZWZhdWx0IGJhc2UgVVJMLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVUkwgdGhlIEZpbGUgd2lsbCB1c2UuXHJcbiAqL1xyXG52YXIgR2V0VVJMID0gZnVuY3Rpb24gKGZpbGUsIGJhc2VVUkwpXHJcbntcclxuICAgIGlmICghZmlsZS51cmwpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWxlLnVybC5tYXRjaCgvXig/OmJsb2I6fGRhdGE6fGh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcL3xcXC9cXC8pLykpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZpbGUudXJsO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBiYXNlVVJMICsgZmlsZS51cmw7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFVSTDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBDdXN0b21TZXQgPSByZXF1aXJlKCcuLi9zdHJ1Y3RzL1NldCcpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIFBsdWdpbkNhY2hlID0gcmVxdWlyZSgnLi4vcGx1Z2lucy9QbHVnaW5DYWNoZScpO1xyXG52YXIgU2NlbmVFdmVudHMgPSByZXF1aXJlKCcuLi9zY2VuZS9ldmVudHMnKTtcclxudmFyIFhIUlNldHRpbmdzID0gcmVxdWlyZSgnLi9YSFJTZXR0aW5ncycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIExvYWRlciBoYW5kbGVzIGxvYWRpbmcgYWxsIGV4dGVybmFsIGNvbnRlbnQgc3VjaCBhcyBJbWFnZXMsIFNvdW5kcywgVGV4dHVyZSBBdGxhc2VzIGFuZCBkYXRhIGZpbGVzLlxyXG4gKiBZb3UgdHlwaWNhbGx5IGludGVyYWN0IHdpdGggaXQgdmlhIGB0aGlzLmxvYWRgIGluIHlvdXIgU2NlbmUuIFNjZW5lcyBjYW4gaGF2ZSBhIGBwcmVsb2FkYCBtZXRob2QsIHdoaWNoIGlzIGFsd2F5c1xyXG4gKiBjYWxsZWQgYmVmb3JlIHRoZSBTY2VuZXMgYGNyZWF0ZWAgbWV0aG9kLCBhbGxvd2luZyB5b3UgdG8gcHJlbG9hZCBhc3NldHMgdGhhdCB0aGUgU2NlbmUgbWF5IG5lZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBjYWxsIGFueSBgdGhpcy5sb2FkYCBtZXRob2RzIGZyb20gb3V0c2lkZSBvZiBgU2NlbmUucHJlbG9hZGAgdGhlbiB5b3UgbmVlZCB0byBzdGFydCB0aGUgTG9hZGVyIGdvaW5nXHJcbiAqIHlvdXJzZWxmIGJ5IGNhbGxpbmcgYExvYWRlci5zdGFydCgpYC4gSXQncyBvbmx5IGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBkdXJpbmcgdGhlIFNjZW5lIHByZWxvYWQuXHJcbiAqXHJcbiAqIFRoZSBMb2FkZXIgdXNlcyBhIGNvbWJpbmF0aW9uIG9mIHRhZyBsb2FkaW5nIChlZy4gQXVkaW8gZWxlbWVudHMpIGFuZCBYSFIgYW5kIHByb3ZpZGVzIHByb2dyZXNzIGFuZCBjb21wbGV0aW9uIGV2ZW50cy5cclxuICogRmlsZXMgYXJlIGxvYWRlZCBpbiBwYXJhbGxlbCBieSBkZWZhdWx0LiBUaGUgYW1vdW50IG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgY2FuIGJlIGNvbnRyb2xsZWQgaW4geW91ciBHYW1lIENvbmZpZ3VyYXRpb24uXHJcbiAqXHJcbiAqIE9uY2UgdGhlIExvYWRlciBoYXMgc3RhcnRlZCBsb2FkaW5nIHlvdSBhcmUgc3RpbGwgYWJsZSB0byBhZGQgZmlsZXMgdG8gaXQuIFRoZXNlIGNhbiBiZSBpbmplY3RlZCBhcyBhIHJlc3VsdCBvZiBhIGxvYWRlclxyXG4gKiBldmVudCwgdGhlIHR5cGUgb2YgZmlsZSBiZWluZyBsb2FkZWQgKHN1Y2ggYXMgYSBwYWNrIGZpbGUpIG9yIG90aGVyIGV4dGVybmFsIGV2ZW50cy4gQXMgbG9uZyBhcyB0aGUgTG9hZGVyIGhhc24ndCBmaW5pc2hlZFxyXG4gKiBzaW1wbHkgYWRkaW5nIGEgbmV3IGZpbGUgdG8gaXQsIHdoaWxlIHJ1bm5pbmcsIHdpbGwgZW5zdXJlIGl0J3MgYWRkZWQgaW50byB0aGUgY3VycmVudCBxdWV1ZS5cclxuICpcclxuICogRXZlcnkgU2NlbmUgaGFzIGl0cyBvd24gaW5zdGFuY2Ugb2YgdGhlIExvYWRlciBhbmQgdGhleSBhcmUgYm91bmQgdG8gdGhlIFNjZW5lIGluIHdoaWNoIHRoZXkgYXJlIGNyZWF0ZWQuIEhvd2V2ZXIsXHJcbiAqIGFzc2V0cyBsb2FkZWQgYnkgdGhlIExvYWRlciBhcmUgcGxhY2VkIGludG8gZ2xvYmFsIGdhbWUtbGV2ZWwgY2FjaGVzLiBGb3IgZXhhbXBsZSwgbG9hZGluZyBhbiBYTUwgZmlsZSB3aWxsIHBsYWNlIHRoYXRcclxuICogZmlsZSBpbnNpZGUgYEdhbWUuY2FjaGUueG1sYCwgd2hpY2ggaXMgYWNjZXNzaWJsZSBmcm9tIGV2ZXJ5IFNjZW5lIGluIHlvdXIgZ2FtZSwgbm8gbWF0dGVyIHdobyB3YXMgcmVzcG9uc2libGVcclxuICogZm9yIGxvYWRpbmcgaXQuIFRoZSBzYW1lIGlzIHRydWUgb2YgVGV4dHVyZXMuIEEgdGV4dHVyZSBsb2FkZWQgaW4gb25lIFNjZW5lIGlzIGluc3RhbnRseSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIFNjZW5lc1xyXG4gKiBpbiB5b3VyIGdhbWUuXHJcbiAqXHJcbiAqIFRoZSBMb2FkZXIgd29ya3MgYnkgdXNpbmcgY3VzdG9tIEZpbGUgVHlwZXMuIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIEZpbGVUeXBlc01hbmFnZXIsIHdoaWNoIGluamVjdHMgdGhlbSBpbnRvIHRoZSBMb2FkZXJcclxuICogd2hlbiBpdCdzIGluc3RhbnRpYXRlZC4gWW91IGNhbiBjcmVhdGUgeW91ciBvd24gY3VzdG9tIGZpbGUgdHlwZXMgYnkgZXh0ZW5kaW5nIGVpdGhlciB0aGUgRmlsZSBvciBNdWx0aUZpbGUgY2xhc3Nlcy5cclxuICogU2VlIHRob3NlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBMb2FkZXJQbHVnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXJcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgd2hpY2ggb3ducyB0aGlzIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbnZhciBMb2FkZXJQbHVnaW4gPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIExvYWRlclBsdWdpbiAoc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBnYW1lQ29uZmlnID0gc2NlbmUuc3lzLmdhbWUuY29uZmlnO1xyXG4gICAgICAgIHZhciBzY2VuZUNvbmZpZyA9IHNjZW5lLnN5cy5zZXR0aW5ncy5sb2FkZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSB3aGljaCBvd25zIHRoaXMgTG9hZGVyIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzeXN0ZW1zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBzY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgQ2FjaGUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2NhY2hlTWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYW5hZ2VyID0gc2NlbmUuc3lzLmNhY2hlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RleHR1cmVNYW5hZ2VyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gc2NlbmUuc3lzLnRleHR1cmVzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIFNjZW5lIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY2VuZU1hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lTWFuYWdlciA9IHNjZW5lLnN5cy5nYW1lLnNjZW5lO1xyXG5cclxuICAgICAgICAvLyAgSW5qZWN0IHRoZSBhdmFpbGFibGUgZmlsZXR5cGVzIGludG8gdGhlIExvYWRlclxyXG4gICAgICAgIEZpbGVUeXBlc01hbmFnZXIuaW5zdGFsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb3B0aW9uYWwgcHJlZml4IHRoYXQgaXMgYXV0b21hdGljYWxseSBwcmVwZW5kZWQgdG8gdGhlIHN0YXJ0IG9mIGV2ZXJ5IGZpbGUga2V5LlxyXG4gICAgICAgICAqIElmIHByZWZpeCB3YXMgYE1FTlUuYCBhbmQgeW91IGxvYWQgYW4gaW1hZ2Ugd2l0aCB0aGUga2V5ICdCYWNrZ3JvdW5kJyB0aGUgcmVzdWx0aW5nIGtleSB3b3VsZCBiZSBgTUVOVS5CYWNrZ3JvdW5kYC5cclxuICAgICAgICAgKiBZb3UgY2FuIHNldCB0aGlzIGRpcmVjdGx5LCBvciBjYWxsIGBMb2FkZXIuc2V0UHJlZml4KClgLiBJdCB3aWxsIHRoZW4gYWZmZWN0IGV2ZXJ5IGZpbGUgYWRkZWQgdG8gdGhlIExvYWRlclxyXG4gICAgICAgICAqIGZyb20gdGhhdCBwb2ludCBvbi4gSXQgZG9lcyBfbm90XyBjaGFuZ2UgYW55IGZpbGUgYWxyZWFkeSBpbiB0aGUgbG9hZCBxdWV1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3ByZWZpeFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgJydcclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByZWZpeCA9ICcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmFsdWUgb2YgYHBhdGhgLCBpZiBzZXQsIGlzIHBsYWNlZCBiZWZvcmUgYW55IF9yZWxhdGl2ZV8gZmlsZSBwYXRoIGdpdmVuLiBGb3IgZXhhbXBsZTpcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAgICAgKiB0aGlzLmxvYWQucGF0aCA9IFwiaW1hZ2VzL3Nwcml0ZXMvXCI7XHJcbiAgICAgICAgICogdGhpcy5sb2FkLmltYWdlKFwiYmFsbFwiLCBcImJhbGwucG5nXCIpO1xyXG4gICAgICAgICAqIHRoaXMubG9hZC5pbWFnZShcInRyZWVcIiwgXCJsZXZlbDEvb2FrdHJlZS5wbmdcIik7XHJcbiAgICAgICAgICogdGhpcy5sb2FkLmltYWdlKFwiYm9vbVwiLCBcImh0dHA6Ly9zZXJ2ZXIuY29tL2V4cGxvZGUucG5nXCIpO1xyXG4gICAgICAgICAqIGBgYFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogV291bGQgbG9hZCB0aGUgYGJhbGxgIGZpbGUgZnJvbSBgaW1hZ2VzL3Nwcml0ZXMvYmFsbC5wbmdgIGFuZCB0aGUgdHJlZSBmcm9tXHJcbiAgICAgICAgICogYGltYWdlcy9zcHJpdGVzL2xldmVsMS9vYWt0cmVlLnBuZ2AgYnV0IHRoZSBmaWxlIGBib29tYCB3b3VsZCBsb2FkIGZyb20gdGhlIFVSTFxyXG4gICAgICAgICAqIGdpdmVuIGFzIGl0J3MgYW4gYWJzb2x1dGUgVVJMLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgcGF0aCBpcyBhZGRlZCBiZWZvcmUgdGhlIGZpbGVuYW1lIGJ1dCAqYWZ0ZXIqIHRoZSBiYXNlVVJMIChpZiBzZXQuKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSWYgeW91IHNldCB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IHRoZW4gaXQgX211c3RfIGVuZCB3aXRoIGEgXCIvXCIuIEFsdGVybmF0aXZlbHksIGNhbGwgYHNldFBhdGgoKWAgYW5kIGl0J2xsIGRvIGl0IGZvciB5b3UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNwYXRoXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnJ1xyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB5b3Ugd2FudCB0byBhcHBlbmQgYSBVUkwgYmVmb3JlIHRoZSBwYXRoIG9mIGFueSBhc3NldCB5b3UgY2FuIHNldCB0aGlzIGhlcmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBVc2VmdWwgaWYgYWxsb3dpbmcgdGhlIGFzc2V0IGJhc2UgdXJsIHRvIGJlIGNvbmZpZ3VyZWQgb3V0c2lkZSBvZiB0aGUgZ2FtZSBjb2RlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSWYgeW91IHNldCB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IHRoZW4gaXQgX211c3RfIGVuZCB3aXRoIGEgXCIvXCIuIEFsdGVybmF0aXZlbHksIGNhbGwgYHNldEJhc2VVUkwoKWAgYW5kIGl0J2xsIGRvIGl0IGZvciB5b3UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNiYXNlVVJMXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAZGVmYXVsdCAnJ1xyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmFzZVVSTCA9ICcnO1xyXG5cclxuICAgICAgICB0aGlzLnNldEJhc2VVUkwoR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAnYmFzZVVSTCcsIGdhbWVDb25maWcubG9hZGVyQmFzZVVSTCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBhdGgoR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAncGF0aCcsIGdhbWVDb25maWcubG9hZGVyUGF0aCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFByZWZpeChHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICdwcmVmaXgnLCBnYW1lQ29uZmlnLmxvYWRlclByZWZpeCkpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgLyBwYXJhbGxlbCByZXNvdXJjZXMgdG8gdHJ5IGFuZCBmZXRjaCBhdCBvbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogT2xkIGJyb3dzZXJzIGxpbWl0IDYgcmVxdWVzdHMgcGVyIGRvbWFpbjsgbW9kZXJuIG9uZXMsIGVzcGVjaWFsbHkgdGhvc2Ugd2l0aCBIVFRQLzIgZG9uJ3QgbGltaXQgaXQgYXQgYWxsLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgMzIgYnV0IHlvdSBjYW4gY2hhbmdlIHRoaXMgaW4geW91ciBHYW1lIENvbmZpZywgb3IgYnkgY2hhbmdpbmcgdGhpcyBwcm9wZXJ0eSBiZWZvcmUgdGhlIExvYWRlciBzdGFydHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNtYXhQYXJhbGxlbERvd25sb2Fkc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWF4UGFyYWxsZWxEb3dubG9hZHMgPSBHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICdtYXhQYXJhbGxlbERvd25sb2FkcycsIGdhbWVDb25maWcubG9hZGVyTWF4UGFyYWxsZWxEb3dubG9hZHMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB4aHIgc3BlY2lmaWMgZ2xvYmFsIHNldHRpbmdzIChjYW4gYmUgb3ZlcnJpZGRlbiBvbiBhIHBlci1maWxlIGJhc2lzKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jeGhyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54aHIgPSBYSFJTZXR0aW5ncyhcclxuICAgICAgICAgICAgR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAncmVzcG9uc2VUeXBlJywgZ2FtZUNvbmZpZy5sb2FkZXJSZXNwb25zZVR5cGUpLFxyXG4gICAgICAgICAgICBHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICdhc3luYycsIGdhbWVDb25maWcubG9hZGVyQXN5bmMpLFxyXG4gICAgICAgICAgICBHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICd1c2VyJywgZ2FtZUNvbmZpZy5sb2FkZXJVc2VyKSxcclxuICAgICAgICAgICAgR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAncGFzc3dvcmQnLCBnYW1lQ29uZmlnLmxvYWRlclBhc3N3b3JkKSxcclxuICAgICAgICAgICAgR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAndGltZW91dCcsIGdhbWVDb25maWcubG9hZGVyVGltZW91dCksXHJcbiAgICAgICAgICAgIEdldEZhc3RWYWx1ZShzY2VuZUNvbmZpZywgJ3dpdGhDcmVkZW50aWFscycsIGdhbWVDb25maWcubG9hZGVyV2l0aENyZWRlbnRpYWxzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjcm9zc09yaWdpbiB2YWx1ZSBhcHBsaWVkIHRvIGxvYWRlZCBpbWFnZXMuIFZlcnkgb2Z0ZW4gdGhpcyBuZWVkcyB0byBiZSBzZXQgdG8gJ2Fub255bW91cycuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNjcm9zc09yaWdpblxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jcm9zc09yaWdpbiA9IEdldEZhc3RWYWx1ZShzY2VuZUNvbmZpZywgJ2Nyb3NzT3JpZ2luJywgZ2FtZUNvbmZpZy5sb2FkZXJDcm9zc09yaWdpbik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdG8gbG9hZC4gSXQgbWF5IG5vdCBhbHdheXMgYmUgYWNjdXJhdGUgYmVjYXVzZSB5b3UgbWF5IGFkZCB0byB0aGUgTG9hZGVyIGR1cmluZyB0aGUgcHJvY2Vzc1xyXG4gICAgICAgICAqIG9mIGxvYWRpbmcsIGVzcGVjaWFsbHkgaWYgeW91IGxvYWQgYSBQYWNrIEZpbGUuIFRoZXJlZm9yZSB0aGlzIHZhbHVlIGNhbiBjaGFuZ2UsIGJ1dCBpbiBtb3N0IGNhc2VzIHJlbWFpbnMgc3RhdGljLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdG90YWxUb0xvYWRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbFRvTG9hZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwcm9ncmVzcyBvZiB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLCBhcyBhIGZsb2F0IHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKiBUaGlzIGlzIHVwZGF0ZWQgYXV0b21hdGljYWxseSBhcyBmaWxlcyBjb21wbGV0ZSBsb2FkaW5nLlxyXG4gICAgICAgICAqIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB2YWx1ZSB0byBnbyBkb3duIGFnYWluIGlmIHlvdSBhZGQgY29udGVudCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlIGR1cmluZyBhIGxvYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNwcm9ncmVzc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaWxlcyBhcmUgcGxhY2VkIGluIHRoaXMgU2V0IHdoZW4gdGhleSdyZSBhZGRlZCB0byB0aGUgTG9hZGVyIHZpYSBgYWRkRmlsZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGV5IGFyZSBtb3ZlZCB0byB0aGUgYGluZmxpZ2h0YCBTZXQgd2hlbiB0aGV5IHN0YXJ0IGxvYWRpbmcsIGFuZCBhc3N1bWluZyBhIHN1Y2Nlc3NmdWxcclxuICAgICAgICAgKiBsb2FkLCB0byB0aGUgYHF1ZXVlYCBTZXQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEJ5IHRoZSBlbmQgb2YgdGhlIGxvYWQgcHJvY2VzcyB0aGlzIFNldCB3aWxsIGJlIGVtcHR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jbGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFBoYXNlci5Mb2FkZXIuRmlsZT59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXN0ID0gbmV3IEN1c3RvbVNldCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaWxlcyBhcmUgc3RvcmVkIGluIHRoaXMgU2V0IHdoaWxlIHRoZXkncmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbG9hZGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZCB0aGV5IGFyZSBtb3ZlZCB0byB0aGUgYHF1ZXVlYCBTZXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBCeSB0aGUgZW5kIG9mIHRoZSBsb2FkIHByb2Nlc3MgdGhpcyBTZXQgd2lsbCBiZSBlbXB0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2luZmxpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLlNldC48UGhhc2VyLkxvYWRlci5GaWxlPn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmluZmxpZ2h0ID0gbmV3IEN1c3RvbVNldCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaWxlcyBhcmUgc3RvcmVkIGluIHRoaXMgU2V0IHdoaWxlIHRoZXkncmUgYmVpbmcgcHJvY2Vzc2VkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSWYgdGhlIHByb2Nlc3MgaXMgc3VjY2Vzc2Z1bCB0aGV5IGFyZSBtb3ZlZCB0byB0aGVpciBmaW5hbCBkZXN0aW5hdGlvbiwgd2hpY2ggY291bGQgYmVcclxuICAgICAgICAgKiBhIENhY2hlIG9yIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBsb2FkIHByb2Nlc3MgdGhpcyBTZXQgd2lsbCBiZSBlbXB0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3F1ZXVlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLlNldC48UGhhc2VyLkxvYWRlci5GaWxlPn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IEN1c3RvbVNldCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBTZXQgaW4gd2hpY2ggZmlsZXMgYXJlIHN0b3JlZCBhZnRlciBwcm9jZXNzaW5nLFxyXG4gICAgICAgICAqIGF3YWl0aW5nIGRlc3RydWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxvYWQgcHJvY2Vzcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI19kZWxldGVRdWV1ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFBoYXNlci5Mb2FkZXIuRmlsZT59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kZWxldGVRdWV1ZSA9IG5ldyBDdXN0b21TZXQoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGZhaWxlZCB0byBsb2FkIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgbG9hZC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHJlc2V0IHdoZW4geW91IGNhbGwgYExvYWRlci5zdGFydGAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiN0b3RhbEZhaWxlZFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdGFsRmFpbGVkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IHN1Y2Nlc3NmdWxseSBsb2FkZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCBsb2FkLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgcmVzZXQgd2hlbiB5b3UgY2FsbCBgTG9hZGVyLnN0YXJ0YC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RvdGFsQ29tcGxldGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbENvbXBsZXRlID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExvYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3N0YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkxPQURFUl9JRExFO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBpbmRleCBiZWluZyB1c2VkIGJ5IG11bHRpLWZpbGUgbG9hZGVycyB0byBhdm9pZCBrZXkgY2xhc2hlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI211bHRpS2V5SW5kZXhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm11bHRpS2V5SW5kZXggPSAwO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnBsdWdpblN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2Jvb3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNwbHVnaW5TdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMVxyXG4gICAgICovXHJcbiAgICBwbHVnaW5TdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHlvdSB3YW50IHRvIGFwcGVuZCBhIFVSTCBiZWZvcmUgdGhlIHBhdGggb2YgYW55IGFzc2V0IHlvdSBjYW4gc2V0IHRoaXMgaGVyZS5cclxuICAgICAqXHJcbiAgICAgKiBVc2VmdWwgaWYgYWxsb3dpbmcgdGhlIGFzc2V0IGJhc2UgdXJsIHRvIGJlIGNvbmZpZ3VyZWQgb3V0c2lkZSBvZiB0aGUgZ2FtZSBjb2RlLlxyXG4gICAgICpcclxuICAgICAqIE9uY2UgYSBiYXNlIFVSTCBpcyBzZXQgaXQgd2lsbCBhZmZlY3QgZXZlcnkgZmlsZSBsb2FkZWQgYnkgdGhlIExvYWRlciBmcm9tIHRoYXQgcG9pbnQgb24uIEl0IGRvZXMgX25vdF8gY2hhbmdlIGFueVxyXG4gICAgICogZmlsZSBfYWxyZWFkeV8gYmVpbmcgbG9hZGVkLiBUbyByZXNldCBpdCwgY2FsbCB0aGlzIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NldEJhc2VVUkxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gdXNlLiBMZWF2ZSBlbXB0eSB0byByZXNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExvYWRlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJhc2VVUkw6IGZ1bmN0aW9uICh1cmwpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7IHVybCA9ICcnOyB9XHJcblxyXG4gICAgICAgIGlmICh1cmwgIT09ICcnICYmIHVybC5zdWJzdHIoLTEpICE9PSAnLycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwuY29uY2F0KCcvJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJhc2VVUkwgPSB1cmw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSBvZiBgcGF0aGAsIGlmIHNldCwgaXMgcGxhY2VkIGJlZm9yZSBhbnkgX3JlbGF0aXZlXyBmaWxlIHBhdGggZ2l2ZW4uIEZvciBleGFtcGxlOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMubG9hZC5zZXRQYXRoKFwiaW1hZ2VzL3Nwcml0ZXMvXCIpO1xyXG4gICAgICogdGhpcy5sb2FkLmltYWdlKFwiYmFsbFwiLCBcImJhbGwucG5nXCIpO1xyXG4gICAgICogdGhpcy5sb2FkLmltYWdlKFwidHJlZVwiLCBcImxldmVsMS9vYWt0cmVlLnBuZ1wiKTtcclxuICAgICAqIHRoaXMubG9hZC5pbWFnZShcImJvb21cIiwgXCJodHRwOi8vc2VydmVyLmNvbS9leHBsb2RlLnBuZ1wiKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFdvdWxkIGxvYWQgdGhlIGBiYWxsYCBmaWxlIGZyb20gYGltYWdlcy9zcHJpdGVzL2JhbGwucG5nYCBhbmQgdGhlIHRyZWUgZnJvbVxyXG4gICAgICogYGltYWdlcy9zcHJpdGVzL2xldmVsMS9vYWt0cmVlLnBuZ2AgYnV0IHRoZSBmaWxlIGBib29tYCB3b3VsZCBsb2FkIGZyb20gdGhlIFVSTFxyXG4gICAgICogZ2l2ZW4gYXMgaXQncyBhbiBhYnNvbHV0ZSBVUkwuXHJcbiAgICAgKlxyXG4gICAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgcGF0aCBpcyBhZGRlZCBiZWZvcmUgdGhlIGZpbGVuYW1lIGJ1dCAqYWZ0ZXIqIHRoZSBiYXNlVVJMIChpZiBzZXQuKVxyXG4gICAgICpcclxuICAgICAqIE9uY2UgYSBwYXRoIGlzIHNldCBpdCB3aWxsIHRoZW4gYWZmZWN0IGV2ZXJ5IGZpbGUgYWRkZWQgdG8gdGhlIExvYWRlciBmcm9tIHRoYXQgcG9pbnQgb24uIEl0IGRvZXMgX25vdF8gY2hhbmdlIGFueVxyXG4gICAgICogZmlsZSBfYWxyZWFkeV8gaW4gdGhlIGxvYWQgcXVldWUuIFRvIHJlc2V0IGl0LCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2V0UGF0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYXRoIHRvIHVzZS4gTGVhdmUgZW1wdHkgdG8gcmVzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBMb2FkZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQYXRoOiBmdW5jdGlvbiAocGF0aClcclxuICAgIHtcclxuICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7IHBhdGggPSAnJzsgfVxyXG5cclxuICAgICAgICBpZiAocGF0aCAhPT0gJycgJiYgcGF0aC5zdWJzdHIoLTEpICE9PSAnLycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXRoID0gcGF0aC5jb25jYXQoJy8nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIG9wdGlvbmFsIHByZWZpeCB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIHRoZSBzdGFydCBvZiBldmVyeSBmaWxlIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBwcmVmaXggd2FzIGBNRU5VLmAgYW5kIHlvdSBsb2FkIGFuIGltYWdlIHdpdGggdGhlIGtleSAnQmFja2dyb3VuZCcgdGhlIHJlc3VsdGluZyBrZXkgd291bGQgYmUgYE1FTlUuQmFja2dyb3VuZGAuXHJcbiAgICAgKlxyXG4gICAgICogT25jZSBhIHByZWZpeCBpcyBzZXQgaXQgd2lsbCB0aGVuIGFmZmVjdCBldmVyeSBmaWxlIGFkZGVkIHRvIHRoZSBMb2FkZXIgZnJvbSB0aGF0IHBvaW50IG9uLiBJdCBkb2VzIF9ub3RfIGNoYW5nZSBhbnlcclxuICAgICAqIGZpbGUgX2FscmVhZHlfIGluIHRoZSBsb2FkIHF1ZXVlLiBUbyByZXNldCBpdCwgY2FsbCB0aGlzIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NldFByZWZpeFxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXhdIC0gVGhlIHByZWZpeCB0byB1c2UuIExlYXZlIGVtcHR5IHRvIHJlc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTG9hZGVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UHJlZml4OiBmdW5jdGlvbiAocHJlZml4KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkgeyBwcmVmaXggPSAnJzsgfVxyXG5cclxuICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQ3Jvc3MgT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgdmFsdWUgdXNlZCB3aGVuIGxvYWRpbmcgZmlsZXMuXHJcbiAgICAgKlxyXG4gICAgICogRmlsZXMgY2FuIG92ZXJyaWRlIHRoaXMgdmFsdWUgb24gYSBwZXItZmlsZSBiYXNpcyBieSBzcGVjaWZ5aW5nIGFuIGFsdGVybmF0aXZlIGBjcm9zc09yaWdpbmAgdmFsdWUgaW4gdGhlaXIgZmlsZSBjb25maWcuXHJcbiAgICAgKlxyXG4gICAgICogT25jZSBDT1JzIGlzIHNldCBpdCB3aWxsIHRoZW4gYWZmZWN0IGV2ZXJ5IGZpbGUgbG9hZGVkIGJ5IHRoZSBMb2FkZXIgZnJvbSB0aGF0IHBvaW50IG9uLCBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgaGF2ZVxyXG4gICAgICogdGhlaXIgb3duIENPUnMgc2V0dGluZy4gVG8gcmVzZXQgaXQsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBhYm91dCBDT1JzIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NPUlNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NldENPUlNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY3Jvc3NPcmlnaW5dIC0gVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGBjcm9zc09yaWdpbmAgcHJvcGVydHkgaW4gdGhlIGxvYWQgcmVxdWVzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExvYWRlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENPUlM6IGZ1bmN0aW9uIChjcm9zc09yaWdpbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBmaWxlLCBvciBhcnJheSBvZiBmaWxlcywgaW50byB0aGUgbG9hZCBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZmlsZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBQaGFzZXIuTG9hZGVyLkZpbGVgLCBvciBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdC4gVGhlIExvYWRlciB3aWxsIGNoZWNrIHRoYXQgdGhlIGtleVxyXG4gICAgICogdXNlZCBieSB0aGUgZmlsZSB3b24ndCBjb25mbGljdCB3aXRoIGFueSBvdGhlciBrZXkgZWl0aGVyIGluIHRoZSBsb2FkZXIsIHRoZSBpbmZsaWdodCBxdWV1ZSBvciB0aGUgdGFyZ2V0IGNhY2hlLlxyXG4gICAgICogSWYgYWxsb3dlZCBpdCB3aWxsIHRoZW4gYWRkIHRoZSBmaWxlIGludG8gdGhlIHBlbmRpbmcgbGlzdCwgcmVhZCBmb3IgdGhlIGxvYWQgdG8gc3RhcnQuIE9yLCBpZiB0aGUgbG9hZCBoYXMgYWxyZWFkeVxyXG4gICAgICogc3RhcnRlZCwgcmVhZHkgZm9yIHRoZSBuZXh0IGJhdGNoIG9mIGZpbGVzIHRvIGJlIHB1bGxlZCBmcm9tIHRoZSBsaXN0IHRvIHRoZSBpbmZsaWdodCBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBZb3Ugc2hvdWxkIG5vdCBub3JtYWxseSBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LCBidXQgcmF0aGVyIHVzZSBvbmUgb2YgdGhlIExvYWRlciBtZXRob2RzIGxpa2UgYGltYWdlYCBvciBgYXRsYXNgLFxyXG4gICAgICogaG93ZXZlciB5b3UgY2FuIGNhbGwgdGhpcyBhcyBsb25nIGFzIHRoZSBmaWxlIGdpdmVuIHRvIGl0IGlzIHdlbGwgZm9ybWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYWRkRmlsZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuRXZlbnRzI0FERFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkxvYWRlci5GaWxlfFBoYXNlci5Mb2FkZXIuRmlsZVtdKX0gZmlsZSAtIFRoZSBmaWxlLCBvciBhcnJheSBvZiBmaWxlcywgdG8gYmUgYWRkZWQgdG8gdGhlIGxvYWQgcXVldWUuXHJcbiAgICAgKi9cclxuICAgIGFkZEZpbGU6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWxlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpbGUgPSBbIGZpbGUgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gZmlsZVtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBEb2VzIHRoZSBmaWxlIGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9yIHRleHR1cmUgbWFuYWdlcj9cclxuICAgICAgICAgICAgLy8gIE9yIHdpbGwgaXQgY29uZmxpY3Qgd2l0aCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgcXVldWUgb3IgaW5mbGlnaHQ/XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5rZXlFeGlzdHMoaXRlbSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5zZXQoaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5BREQsIGl0ZW0ua2V5LCBpdGVtLnR5cGUsIHRoaXMsIGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTG9hZGluZygpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxUb0xvYWQrKztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRoZSBrZXkgYW5kIHR5cGUgb2YgdGhlIGdpdmVuIGZpbGUgdG8gc2VlIGlmIGl0IHdpbGwgY29uZmxpY3Qgd2l0aCBhbnl0aGluZyBhbHJlYWR5XHJcbiAgICAgKiBpbiBhIENhY2hlLCB0aGUgVGV4dHVyZSBNYW5hZ2VyLCBvciB0aGUgbGlzdCBvciBpbmZsaWdodCBxdWV1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNrZXlFeGlzdHNcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5GaWxlfSBmaWxlIC0gVGhlIGZpbGUgdG8gY2hlY2sgdGhlIGtleSBvZi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYWRkaW5nIHRoaXMgZmlsZSB3aWxsIGNhdXNlIGEgY2FjaGUgb3IgcXVldWUgY29uZmxpY3QsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBrZXlFeGlzdHM6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBrZXlDb25mbGljdCA9IGZpbGUuaGFzQ2FjaGVDb25mbGljdCgpO1xyXG5cclxuICAgICAgICBpZiAoIWtleUNvbmZsaWN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0Lml0ZXJhdGUoZnVuY3Rpb24gKGl0ZW0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IGZpbGUudHlwZSAmJiBpdGVtLmtleSA9PT0gZmlsZS5rZXkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5Q29uZmxpY3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgha2V5Q29uZmxpY3QgJiYgdGhpcy5pc0xvYWRpbmcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5mbGlnaHQuaXRlcmF0ZShmdW5jdGlvbiAoaXRlbSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gZmlsZS50eXBlICYmIGl0ZW0ua2V5ID09PSBmaWxlLmtleSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlDb25mbGljdCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5pdGVyYXRlKGZ1bmN0aW9uIChpdGVtKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBmaWxlLnR5cGUgJiYgaXRlbS5rZXkgPT09IGZpbGUua2V5KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGtleUNvbmZsaWN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ga2V5Q29uZmxpY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSB3ZWxsIGZvcm1lZCwgZnVsbHkgcGFyc2VkIHBhY2sgZmlsZSBvYmplY3QgYW5kIGFkZHMgaXRzIGVudHJpZXMgaW50byB0aGUgbG9hZCBxdWV1ZS4gVXN1YWxseSB5b3UgZG8gbm90IGNhbGxcclxuICAgICAqIHRoaXMgbWV0aG9kIGRpcmVjdGx5LCBidXQgaW5zdGVhZCB1c2UgYExvYWRlci5wYWNrYCBhbmQgc3VwcGx5IGEgcGF0aCB0byBhIEpTT04gZmlsZSB0aGF0IGhvbGRzIHRoZVxyXG4gICAgICogcGFjayBkYXRhLiBIb3dldmVyLCBpZiB5b3UndmUgZ290IHRoZSBkYXRhIHByZXBhcmVkIHlvdSBjYW4gcGFzcyBpdCB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCBrZXkuIElmIHlvdSBkbyB0aGVuIGl0IHdpbGwgb25seSBhZGQgdGhlIGVudHJpZXMgZnJvbSB0aGF0IHBhcnQgb2YgdGhlIHBhY2sgaW50b1xyXG4gICAgICogdG8gdGhlIGxvYWQgcXVldWUuIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBhZGQgYWxsIGVudHJpZXMgaXQgZmluZHMuIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHBhY2sgZmlsZSBmb3JtYXRcclxuICAgICAqIHNlZSB0aGUgYExvYWRlclBsdWdpbi5wYWNrYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhZGRQYWNrXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFjayAtIFRoZSBQYWNrIEZpbGUgZGF0YSB0byBiZSBwYXJzZWQgYW5kIGVhY2ggZW50cnkgb2YgaXQgdG8gYWRkZWQgdG8gdGhlIGxvYWQgcXVldWUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhY2tLZXldIC0gQW4gb3B0aW9uYWwga2V5IHRvIHVzZSBmcm9tIHRoZSBwYWNrIGZpbGUgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYW55IGZpbGVzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgYWRkUGFjazogZnVuY3Rpb24gKHBhY2ssIHBhY2tLZXkpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIGlmIG5vIHBhY2tLZXkgcHJvdmlkZWQgd2UnbGwgYWRkIGV2ZXJ5dGhpbmcgdG8gdGhlIHF1ZXVlXHJcbiAgICAgICAgaWYgKHBhY2tLZXkgJiYgcGFjay5oYXNPd25Qcm9wZXJ0eShwYWNrS2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhY2sgPSB7IHBhY2tLZXk6IHBhY2tbcGFja0tleV0gfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0b3RhbCA9IDA7XHJcblxyXG4gICAgICAgIC8vICBTdG9yZSB0aGUgbG9hZGVyIHNldHRpbmdzIGluIGNhc2UgdGhpcyBwYWNrIHJlcGxhY2VzIHRoZW1cclxuICAgICAgICB2YXIgY3VycmVudEJhc2VVUkwgPSB0aGlzLmJhc2VVUkw7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRQYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgICAgIHZhciBjdXJyZW50UHJlZml4ID0gdGhpcy5wcmVmaXg7XHJcblxyXG4gICAgICAgIC8vICBIZXJlIHdlIGdvIC4uLlxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFjaywga2V5KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBwYWNrW2tleV07XHJcblxyXG4gICAgICAgICAgICAvLyAgQW55IG1ldGEgZGF0YSB0byBwcm9jZXNzP1xyXG4gICAgICAgICAgICB2YXIgYmFzZVVSTCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdiYXNlVVJMJywgY3VycmVudEJhc2VVUkwpO1xyXG4gICAgICAgICAgICB2YXIgcGF0aCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdwYXRoJywgY3VycmVudFBhdGgpO1xyXG4gICAgICAgICAgICB2YXIgcHJlZml4ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3ByZWZpeCcsIGN1cnJlbnRQcmVmaXgpO1xyXG4gICAgICAgICAgICB2YXIgZmlsZXMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZmlsZXMnLCBudWxsKTtcclxuICAgICAgICAgICAgdmFyIGRlZmF1bHRUeXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RlZmF1bHRUeXBlJywgJ3ZvaWQnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGVzKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCYXNlVVJMKGJhc2VVUkwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXRoKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVmaXgocHJlZml4KTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZmlsZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSAoZmlsZS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpKSA/IGZpbGUudHlwZSA6IGRlZmF1bHRUeXBlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1t0eXBlXSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbdHlwZV0oZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzZXQgdGhlIGxvYWRlciBzZXR0aW5nc1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZVVSTChjdXJyZW50QmFzZVVSTCk7XHJcbiAgICAgICAgdGhpcy5zZXRQYXRoKGN1cnJlbnRQYXRoKTtcclxuICAgICAgICB0aGlzLnNldFByZWZpeChjdXJyZW50UHJlZml4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuICh0b3RhbCA+IDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoZSBMb2FkZXIgYWN0aXZlbHkgbG9hZGluZywgb3IgcHJvY2Vzc2luZyBsb2FkZWQgZmlsZXM/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNpc0xvYWRpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgTG9hZGVyIGlzIGJ1c3kgbG9hZGluZyBvciBwcm9jZXNzaW5nLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNMb2FkaW5nOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gQ09OU1QuTE9BREVSX0xPQURJTkcgfHwgdGhpcy5zdGF0ZSA9PT0gQ09OU1QuTE9BREVSX1BST0NFU1NJTkcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoZSBMb2FkZXIgcmVhZHkgdG8gc3RhcnQgYSBuZXcgbG9hZD9cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2lzUmVhZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgTG9hZGVyIGlzIHJlYWR5IHRvIHN0YXJ0IGEgbmV3IGxvYWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc1JlYWR5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gQ09OU1QuTE9BREVSX0lETEUgfHwgdGhpcy5zdGF0ZSA9PT0gQ09OU1QuTE9BREVSX0NPTVBMRVRFKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIExvYWRlciBydW5uaW5nLiBUaGlzIHdpbGwgcmVzZXQgdGhlIHByb2dyZXNzIGFuZCB0b3RhbHMgYW5kIHRoZW4gZW1pdCBhIGBzdGFydGAgZXZlbnQuXHJcbiAgICAgKiBJZiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZSBxdWV1ZSB0aGUgTG9hZGVyIHdpbGwgaW1tZWRpYXRlbHkgY29tcGxldGUsIG90aGVyd2lzZSBpdCB3aWxsIHN0YXJ0XHJcbiAgICAgKiBsb2FkaW5nIHRoZSBmaXJzdCBiYXRjaCBvZiBmaWxlcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgTG9hZGVyIGlzIHN0YXJ0ZWQgYXV0b21hdGljYWxseSBpZiB0aGUgcXVldWUgaXMgcG9wdWxhdGVkIHdpdGhpbiB5b3VyIFNjZW5lcyBgcHJlbG9hZGAgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEhvd2V2ZXIsIG91dHNpZGUgb2YgdGhpcywgeW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCB0byBzdGFydCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgTG9hZGVyIGlzIGFscmVhZHkgcnVubmluZyB0aGlzIG1ldGhvZCB3aWxsIHNpbXBseSByZXR1cm4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzdGFydFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuRXZlbnRzI1NUQVJUXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVhZHkoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsRmFpbGVkID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsQ29tcGxldGUgPSAwO1xyXG4gICAgICAgIHRoaXMudG90YWxUb0xvYWQgPSB0aGlzLmxpc3Quc2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5TVEFSVCwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxpc3Quc2l6ZSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZENvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5MT0FERVJfTE9BRElORztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5mbGlnaHQuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzcygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0xvYWRRdWV1ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbihTY2VuZUV2ZW50cy5VUERBVEUsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBsb2FkIHByb2Nlc3MuXHJcbiAgICAgKiBJdCB1cGRhdGVzIHRoZSBgcHJvZ3Jlc3NgIHZhbHVlIGFuZCB0aGVuIGVtaXRzIGEgcHJvZ3Jlc3MgZXZlbnQsIHdoaWNoIHlvdSBjYW4gdXNlIHRvXHJcbiAgICAgKiBkaXNwbGF5IGEgbG9hZGluZyBiYXIgaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdXBkYXRlUHJvZ3Jlc3NcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkV2ZW50cyNQUk9HUkVTU1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVByb2dyZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAxIC0gKCh0aGlzLmxpc3Quc2l6ZSArIHRoaXMuaW5mbGlnaHQuc2l6ZSkgLyB0aGlzLnRvdGFsVG9Mb2FkKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QUk9HUkVTUywgdGhpcy5wcm9ncmVzcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBsb2FkIHByb2Nlc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiN1cGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDT05TVC5MT0FERVJfTE9BRElORyAmJiB0aGlzLmxpc3Quc2l6ZSA+IDAgJiYgdGhpcy5pbmZsaWdodC5zaXplIDwgdGhpcy5tYXhQYXJhbGxlbERvd25sb2FkcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tMb2FkUXVldWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZXJuYWwgbWV0aG9kIGNhbGxlZCBieSB0aGUgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIEl0IHdpbGwgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZSBmaWxlcyBpbiB0aGUgcGVuZGluZyBsaXN0IHRoYXQgbmVlZCBsb2FkaW5nLCBhbmQgaWYgc28gaXQgd2lsbCBtb3ZlXHJcbiAgICAgKiB0aGVtIGZyb20gdGhlIGxpc3QgU2V0IGludG8gdGhlIGluZmxpZ2h0IFNldCwgc2V0IHRoZWlyIENPUnMgZmxhZyBhbmQgc3RhcnQgdGhlbSBsb2FkaW5nLlxyXG4gICAgICpcclxuICAgICAqIEl0IHdpbGwgY2Fycnlpbmcgb24gZG9pbmcgdGhpcyBmb3IgZWFjaCBmaWxlIGluIHRoZSBwZW5kaW5nIGxpc3QgdW50aWwgaXQgcnVucyBvdXQsIG9yIGhpdHMgdGhlIG1heCBhbGxvd2VkIHBhcmFsbGVsIGRvd25sb2Fkcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2NoZWNrTG9hZFF1ZXVlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGNoZWNrTG9hZFF1ZXVlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdC5lYWNoKGZ1bmN0aW9uIChmaWxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGZpbGUuc3RhdGUgPT09IENPTlNULkZJTEVfUE9QVUxBVEVEIHx8IChmaWxlLnN0YXRlID09PSBDT05TVC5GSUxFX1BFTkRJTkcgJiYgdGhpcy5pbmZsaWdodC5zaXplIDwgdGhpcy5tYXhQYXJhbGxlbERvd25sb2FkcykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5mbGlnaHQuc2V0KGZpbGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5kZWxldGUoZmlsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIElmIHRoZSBmaWxlIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGNyb3NzT3JpZ2luIHNldCwgd2UnbGwgdXNlIHRoZSBMb2FkZXJzICh3aGljaCBpcyB1bmRlZmluZWQgYnkgZGVmYXVsdClcclxuICAgICAgICAgICAgICAgIGlmICghZmlsZS5jcm9zc09yaWdpbilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBmaWxlLmxvYWQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaW5mbGlnaHQuc2l6ZSA9PT0gdGhpcy5tYXhQYXJhbGxlbERvd25sb2FkcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFRlbGxzIHRoZSBTZXQgaXRlcmF0b3IgdG8gYWJvcnRcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFhIUkxvYWRlciBiZWxvbmcgdG8gYSBGaWxlLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVtb3ZlIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIGluZmxpZ2h0IFNldCBhbmQgdXBkYXRlIHRoZSBsb2FkIHByb2dyZXNzLlxyXG4gICAgICogSWYgdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWwgaXRzIGBvblByb2Nlc3NgIG1ldGhvZCBpcyBjYWxsZWQsIG90aGVyd2lzZSBpdCBpcyBhZGRlZCB0byB0aGUgZGVsZXRlIHF1ZXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jbmV4dEZpbGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkV2ZW50cyNGSUxFX0xPQURcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkV2ZW50cyNGSUxFX0xPQURfRVJST1JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5GaWxlfSBmaWxlIC0gVGhlIEZpbGUgdGhhdCBqdXN0IGZpbmlzaGVkIGxvYWRpbmcsIG9yIGVycm9yZWQgZHVyaW5nIGxvYWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc3MgLSBgdHJ1ZWAgaWYgdGhlIGZpbGUgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIG5leHRGaWxlOiBmdW5jdGlvbiAoZmlsZSwgc3VjY2VzcylcclxuICAgIHtcclxuICAgICAgICAvLyAgSGFzIHRoZSBnYW1lIGJlZW4gZGVzdHJveWVkIGR1cmluZyBsb2FkPyBJZiBzbywgYmFpbCBvdXQgbm93LlxyXG4gICAgICAgIGlmICghdGhpcy5pbmZsaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5mbGlnaHQuZGVsZXRlKGZpbGUpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzKCk7XHJcblxyXG4gICAgICAgIGlmIChzdWNjZXNzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50b3RhbENvbXBsZXRlKys7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnNldChmaWxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRklMRV9MT0FELCBmaWxlKTtcclxuXHJcbiAgICAgICAgICAgIGZpbGUub25Qcm9jZXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxGYWlsZWQrKztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RlbGV0ZVF1ZXVlLnNldChmaWxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRklMRV9MT0FEX0VSUk9SLCBmaWxlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZVByb2Nlc3NDb21wbGV0ZShmaWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZXJuYWwgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEZpbGUgd2hlbiBpdCBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgcHJvY2VzcyB3YXMgc3VjY2Vzc2Z1bCwgYW5kIHRoZSBGaWxlIGlzbid0IHBhcnQgb2YgYSBNdWx0aUZpbGUsIGl0cyBgYWRkVG9DYWNoZWAgbWV0aG9kIGlzIGNhbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBJdCB0aGlzIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMgdG8gbG9hZCBgbG9hZENvbXBsZXRlYCBpcyBjYWxsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNmaWxlUHJvY2Vzc0NvbXBsZXRlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuRmlsZX0gZmlsZSAtIFRoZSBmaWxlIHRoYXQgaGFzIGZpbmlzaGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKi9cclxuICAgIGZpbGVQcm9jZXNzQ29tcGxldGU6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBIYXMgdGhlIGdhbWUgYmVlbiBkZXN0cm95ZWQgZHVyaW5nIGxvYWQ/IElmIHNvLCBiYWlsIG91dCBub3cuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjZW5lIHx8ICF0aGlzLnN5c3RlbXMgfHwgIXRoaXMuc3lzdGVtcy5nYW1lIHx8IHRoaXMuc3lzdGVtcy5nYW1lLnBlbmRpbmdEZXN0cm95KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRoaXMgZmlsZSBoYXMgZmFpbGVkLCBzbyBtb3ZlIGl0IHRvIHRoZSBmYWlsZWQgU2V0XHJcbiAgICAgICAgaWYgKGZpbGUuc3RhdGUgPT09IENPTlNULkZJTEVfRVJST1JFRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChmaWxlLm11bHRpRmlsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmlsZS5tdWx0aUZpbGUub25GaWxlRmFpbGVkKGZpbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZpbGUuc3RhdGUgPT09IENPTlNULkZJTEVfQ09NUExFVEUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZmlsZS5tdWx0aUZpbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxlLm11bHRpRmlsZS5pc1JlYWR5VG9Qcm9jZXNzKCkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIElmIHdlIGdvdCBoZXJlIHRoZW4gYWxsIGZpbGVzIHRoZSBsaW5rIGZpbGUgbmVlZHMgYXJlIHJlYWR5IHRvIGFkZCB0byB0aGUgY2FjaGVcclxuICAgICAgICAgICAgICAgICAgICBmaWxlLm11bHRpRmlsZS5hZGRUb0NhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSWYgd2UgZ290IGhlcmUsIHRoZW4gdGhlIGZpbGUgcHJvY2Vzc2VkLCBzbyBsZXQgaXQgYWRkIGl0c2VsZiB0byBpdHMgY2FjaGVcclxuICAgICAgICAgICAgICAgIGZpbGUuYWRkVG9DYWNoZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlXHJcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWxldGUoZmlsZSk7XHJcblxyXG4gICAgICAgIC8vICBOb3RoaW5nIGxlZnQgdG8gZG8/XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxpc3Quc2l6ZSA9PT0gMCAmJiB0aGlzLmluZmxpZ2h0LnNpemUgPT09IDAgJiYgdGhpcy5xdWV1ZS5zaXplID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkQ29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF0IHRoZSBlbmQgd2hlbiB0aGUgbG9hZCBxdWV1ZSBpcyBleGhhdXN0ZWQgYW5kIGFsbCBmaWxlcyBoYXZlIGVpdGhlciBsb2FkZWQgb3IgZXJyb3JlZC5cclxuICAgICAqIEJ5IHRoaXMgcG9pbnQgZXZlcnkgbG9hZGVkIGZpbGUgd2lsbCBub3cgYmUgaW4gaXRzIGFzc29jaWF0ZWQgY2FjaGUgYW5kIHJlYWR5IGZvciB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQWxzbyBjbGVhcnMgZG93biB0aGUgU2V0cywgcHV0cyBwcm9ncmVzcyB0byAxIGFuZCBjbGVhcnMgdGhlIGRlbGV0aW9uIHF1ZXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jbG9hZENvbXBsZXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5FdmVudHMjQ09NUExFVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkV2ZW50cyNQT1NUX1BST0NFU1NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBsb2FkQ29tcGxldGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QT1NUX1BST0NFU1MsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3QuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmluZmxpZ2h0LmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5xdWV1ZS5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkxPQURFUl9DT01QTEVURTtcclxuXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vZmYoU2NlbmVFdmVudHMuVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIC8vICBDYWxsICdkZXN0cm95JyBvbiBlYWNoIGZpbGUgcmVhZHkgZm9yIGRlbGV0aW9uXHJcbiAgICAgICAgdGhpcy5fZGVsZXRlUXVldWUuaXRlcmF0ZUxvY2FsKCdkZXN0cm95Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbGV0ZVF1ZXVlLmNsZWFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuQ09NUExFVEUsIHRoaXMsIHRoaXMudG90YWxDb21wbGV0ZSwgdGhpcy50b3RhbEZhaWxlZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIEZpbGUgaW50byB0aGUgcGVuZGluZy1kZWxldGlvbiBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2ZsYWdGb3JSZW1vdmFsXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuRmlsZX0gZmlsZSAtIFRoZSBGaWxlIHRvIGJlIHF1ZXVlZCBmb3IgZGVsZXRpb24gd2hlbiB0aGUgTG9hZGVyIGNvbXBsZXRlcy5cclxuICAgICAqL1xyXG4gICAgZmxhZ0ZvclJlbW92YWw6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2RlbGV0ZVF1ZXVlLnNldChmaWxlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gSlNPTiBkYXRhIGludG8gYSBmaWxlIHRoYXQgdGhlIGJyb3dzZXIgdGhlbiBwcm9tcHRzIHlvdSB0byBkb3dubG9hZCBzbyB5b3UgY2FuIHNhdmUgaXQgbG9jYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGF0YSBtdXN0IGJlIHdlbGwgZm9ybWVkIEpTT04gYW5kIHJlYWR5LXBhcnNlZCwgbm90IGEgSmF2YVNjcmlwdCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzYXZlSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIC0gVGhlIEpTT04gZGF0YSwgcmVhZHkgcGFyc2VkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmaWxlbmFtZT1maWxlLmpzb25dIC0gVGhlIG5hbWUgdG8gc2F2ZSB0aGUgSlNPTiBmaWxlIGFzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTG9hZGVyIHBsdWdpbi5cclxuICAgICAqL1xyXG4gICAgc2F2ZUpTT046IGZ1bmN0aW9uIChkYXRhLCBmaWxlbmFtZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zYXZlKEpTT04uc3RyaW5naWZ5KGRhdGEpLCBmaWxlbmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2F1c2VzIHRoZSBicm93c2VyIHRvIHNhdmUgdGhlIGdpdmVuIGRhdGEgYXMgYSBmaWxlIHRvIGl0cyBkZWZhdWx0IERvd25sb2FkcyBmb2xkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQ3JlYXRlcyBhIERPTSBsZXZlbCBhbmNob3IgbGluaywgYXNzaWducyBpdCBhcyBiZWluZyBhIGBkb3dubG9hZGAgYW5jaG9yLCBzZXRzIHRoZSBocmVmXHJcbiAgICAgKiB0byBiZSBhbiBPYmplY3RVUkwgYmFzZWQgb24gdGhlIGdpdmVuIGRhdGEsIGFuZCB0aGVuIGludm9rZXMgYSBjbGljayBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NhdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSAtIFRoZSBkYXRhIHRvIGJlIHNhdmVkLiBXaWxsIGJlIHBhc3NlZCB0aHJvdWdoIFVSTC5jcmVhdGVPYmplY3RVUkwuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGVuYW1lPWZpbGUuanNvbl0gLSBUaGUgZmlsZW5hbWUgdG8gc2F2ZSB0aGUgZmlsZSBhcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZXR5cGU9YXBwbGljYXRpb24vanNvbl0gLSBUaGUgZmlsZSB0eXBlIHRvIHVzZSB3aGVuIHNhdmluZyB0aGUgZmlsZS4gRGVmYXVsdHMgdG8gSlNPTi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIExvYWRlciBwbHVnaW4uXHJcbiAgICAgKi9cclxuICAgIHNhdmU6IGZ1bmN0aW9uIChkYXRhLCBmaWxlbmFtZSwgZmlsZXR5cGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQpIHsgZmlsZW5hbWUgPSAnZmlsZS5qc29uJzsgfVxyXG4gICAgICAgIGlmIChmaWxldHlwZSA9PT0gdW5kZWZpbmVkKSB7IGZpbGV0eXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nOyB9XHJcblxyXG4gICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoWyBkYXRhIF0sIHsgdHlwZTogZmlsZXR5cGUgfSk7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuXHJcbiAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgIGEudGV4dENvbnRlbnQgPSAnRG93bmxvYWQgJyArIGZpbGVuYW1lO1xyXG4gICAgICAgIGEuaHJlZiA9IHVybDtcclxuICAgICAgICBhLmNsaWNrKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBjbGVhciBhbGwgbGlzdHMgYW5kIHJlc2V0IHRoZSBiYXNlIFVSTCwgcGF0aCBhbmQgcHJlZml4LlxyXG4gICAgICpcclxuICAgICAqIFdhcm5pbmc6IElmIHRoZSBMb2FkZXIgaXMgY3VycmVudGx5IGRvd25sb2FkaW5nIGZpbGVzLCBvciBoYXMgZmlsZXMgaW4gaXRzIHF1ZXVlLCB0aGV5IHdpbGwgYmUgYWJvcnRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3Jlc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0LmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5pbmZsaWdodC5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMucXVldWUuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdmFyIGdhbWVDb25maWcgPSB0aGlzLnN5c3RlbXMuZ2FtZS5jb25maWc7XHJcbiAgICAgICAgdmFyIHNjZW5lQ29uZmlnID0gdGhpcy5zeXN0ZW1zLnNldHRpbmdzLmxvYWRlcjtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRCYXNlVVJMKEdldEZhc3RWYWx1ZShzY2VuZUNvbmZpZywgJ2Jhc2VVUkwnLCBnYW1lQ29uZmlnLmxvYWRlckJhc2VVUkwpKTtcclxuICAgICAgICB0aGlzLnNldFBhdGgoR2V0RmFzdFZhbHVlKHNjZW5lQ29uZmlnLCAncGF0aCcsIGdhbWVDb25maWcubG9hZGVyUGF0aCkpO1xyXG4gICAgICAgIHRoaXMuc2V0UHJlZml4KEdldEZhc3RWYWx1ZShzY2VuZUNvbmZpZywgJ3ByZWZpeCcsIGdhbWVDb25maWcubG9hZGVyUHJlZml4KSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5MT0FERVJfSURMRTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIHNodXR0aW5nIGRvd24uXHJcbiAgICAgKiBXZSBuZWVkIHRvIGtpbGwgYW5kIHJlc2V0IGFsbCBpbnRlcm5hbCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgc3RvcCBsaXN0ZW5pbmcgdG8gU2NlbmUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2h1dGRvd25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuTE9BREVSX1NIVVRET1dOO1xyXG5cclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5VUERBVEUsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jZGVzdHJveVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkxPQURFUl9ERVNUUk9ZRUQ7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub2ZmKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnBsdWdpblN0YXJ0LCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5saXN0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmluZmxpZ2h0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnF1ZXVlID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNhY2hlTWFuYWdlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZU1hbmFnZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5QbHVnaW5DYWNoZS5yZWdpc3RlcignTG9hZGVyJywgTG9hZGVyUGx1Z2luLCAnbG9hZCcpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMb2FkZXJQbHVnaW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxudmFyIFhIUlNldHRpbmdzID0gcmVxdWlyZSgnLi9YSFJTZXR0aW5ncycpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIHR3byBYSFJTZXR0aW5ncyBPYmplY3RzIGFuZCBjcmVhdGVzIGEgbmV3IFhIUlNldHRpbmdzIG9iamVjdCBmcm9tIHRoZW0uXHJcbiAqXHJcbiAqIFRoZSBuZXcgb2JqZWN0IGlzIHNlZWRlZCBieSB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBnbG9iYWwgc2V0dGluZ3MsIGJ1dCBhbnkgc2V0dGluZyBpblxyXG4gKiB0aGUgbG9jYWwgb2JqZWN0IG92ZXJyaWRlcyB0aGUgZ2xvYmFsIG9uZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTG9hZGVyLk1lcmdlWEhSU2V0dGluZ3NcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBYSFJTZXR0aW5ncyBvYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gbG9jYWwgLSBUaGUgbG9jYWwgWEhSU2V0dGluZ3Mgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBBIG5ld2x5IGZvcm1lZCBYSFJTZXR0aW5ncyBvYmplY3QuXHJcbiAqL1xyXG52YXIgTWVyZ2VYSFJTZXR0aW5ncyA9IGZ1bmN0aW9uIChnbG9iYWwsIGxvY2FsKVxyXG57XHJcbiAgICB2YXIgb3V0cHV0ID0gKGdsb2JhbCA9PT0gdW5kZWZpbmVkKSA/IFhIUlNldHRpbmdzKCkgOiBFeHRlbmQoe30sIGdsb2JhbCk7XHJcblxyXG4gICAgaWYgKGxvY2FsKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIHNldHRpbmcgaW4gbG9jYWwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobG9jYWxbc2V0dGluZ10gIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0W3NldHRpbmddID0gbG9jYWxbc2V0dGluZ107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWVyZ2VYSFJTZXR0aW5ncztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBNdWx0aUZpbGUgaXMgYSBzcGVjaWFsIGtpbmQgb2YgcGFyZW50IHRoYXQgY29udGFpbnMgdHdvLCBvciBtb3JlLCBGaWxlcyBhcyBjaGlsZHJlbiBhbmQgbG9va3MgYWZ0ZXJcclxuICogdGhlIGxvYWRpbmcgYW5kIHByb2Nlc3Npbmcgb2YgdGhlbSBhbGwuIEl0IGlzIGNvbW1vbmx5IGV4dGVuZGVkIGFuZCB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgZmlsZSB0eXBlcyBzdWNoIGFzIEF0bGFzSlNPTiBvciBCaXRtYXBGb250LlxyXG4gKiBcclxuICogWW91IHNob3VsZG4ndCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBNdWx0aUZpbGUgZGlyZWN0bHksIGJ1dCBzaG91bGQgZXh0ZW5kIGl0IHdpdGggeW91ciBvd24gY2xhc3MsIHNldHRpbmcgYSBjdXN0b20gdHlwZSBhbmQgcHJvY2Vzc2luZyBtZXRob2RzLlxyXG4gKlxyXG4gKiBAY2xhc3MgTXVsdGlGaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy43LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gVGhlIExvYWRlciB0aGF0IGlzIGdvaW5nIHRvIGxvYWQgdGhpcyBGaWxlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBmaWxlIHR5cGUgc3RyaW5nIGZvciBzb3J0aW5nIHdpdGhpbiB0aGUgTG9hZGVyLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlIGxvYWRlci5cclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGVbXX0gZmlsZXMgLSBBbiBhcnJheSBvZiBGaWxlcyB0aGF0IG1ha2UtdXAgdGhpcyBNdWx0aUZpbGUuXHJcbiAqL1xyXG52YXIgTXVsdGlGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE11bHRpRmlsZSAobG9hZGVyLCB0eXBlLCBrZXksIGZpbGVzKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyBnb2luZyB0byBsb2FkIHRoaXMgZmlsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI2xvYWRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZpbGUgdHlwZSBzdHJpbmcgZm9yIHNvcnRpbmcgd2l0aGluIHRoZSBMb2FkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVbmlxdWUgY2FjaGUga2V5ICh1bmlxdWUgd2l0aGluIGl0cyBmaWxlIHR5cGUpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNrZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBpbmRleCBiZWluZyB1c2VkIGJ5IG11bHRpLWZpbGUgbG9hZGVycyB0byBhdm9pZCBrZXkgY2xhc2hlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI211bHRpS2V5SW5kZXhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm11bHRpS2V5SW5kZXggPSBsb2FkZXIubXVsdGlLZXlJbmRleCsrO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBcnJheSBvZiBmaWxlcyB0aGF0IG1ha2UgdXAgdGhpcyBNdWx0aUZpbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNmaWxlc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTG9hZGVyLkZpbGVbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb21wbGV0aW9uIHN0YXR1cyBvZiB0aGlzIE11bHRpRmlsZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI2NvbXBsZXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXBsZXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdG8gbG9hZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI3BlbmRpbmdcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmlsZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgZmFpbGVkIHRvIGxvYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNmYWlsZWRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHN0b3JhZ2UgY29udGFpbmVyIGZvciB0cmFuc2llbnQgZGF0YSB0aGF0IHRoZSBsb2FkaW5nIGZpbGVzIG5lZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNjb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXJzIGJhc2VVUkwgYXQgdGhlIHRpbWUgdGhpcyBNdWx0aUZpbGUgd2FzIGNyZWF0ZWQuXHJcbiAgICAgICAgICogVXNlZCB0byBwb3B1bGF0ZSBjaGlsZC1maWxlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI2Jhc2VVUkxcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VVUkwgPSBsb2FkZXIuYmFzZVVSTDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlcnMgcGF0aCBhdCB0aGUgdGltZSB0aGlzIE11bHRpRmlsZSB3YXMgY3JlYXRlZC5cclxuICAgICAgICAgKiBVc2VkIHRvIHBvcHVsYXRlIGNoaWxkLWZpbGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5NdWx0aUZpbGUjcGF0aFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF0aCA9IGxvYWRlci5wYXRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVycyBwcmVmaXggYXQgdGhlIHRpbWUgdGhpcyBNdWx0aUZpbGUgd2FzIGNyZWF0ZWQuXHJcbiAgICAgICAgICogVXNlZCB0byBwb3B1bGF0ZSBjaGlsZC1maWxlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI3ByZWZpeFxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJlZml4ID0gbG9hZGVyLnByZWZpeDtcclxuXHJcbiAgICAgICAgLy8gIExpbmsgdGhlIGZpbGVzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpbGVzW2ldLm11bHRpRmlsZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGlzIE11bHRpRmlsZSBpcyByZWFkeSB0byBwcm9jZXNzIGl0cyBjaGlsZHJlbiBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNpc1JlYWR5VG9Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYWxsIGNoaWxkcmVuIG9mIHRoaXMgTXVsdGlGaWxlIGhhdmUgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNSZWFkeVRvUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMucGVuZGluZyA9PT0gMCAmJiB0aGlzLmZhaWxlZCA9PT0gMCAmJiAhdGhpcy5jb21wbGV0ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbm90aGVyIGNoaWxkIHRvIHRoaXMgTXVsdGlGaWxlLCBpbmNyZWFzZXMgdGhlIHBlbmRpbmcgY291bnQgYW5kIHJlc2V0cyB0aGUgY29tcGxldGlvbiBzdGF0dXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZSNhZGRUb011bHRpRmlsZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGVzIC0gVGhlIEZpbGUgdG8gYWRkIHRvIHRoaXMgTXVsdGlGaWxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Mb2FkZXIuTXVsdGlGaWxlfSBUaGlzIE11bHRpRmlsZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWRkVG9NdWx0aUZpbGU6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcclxuXHJcbiAgICAgICAgZmlsZS5tdWx0aUZpbGUgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnBlbmRpbmcrKztcclxuXHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgZWFjaCBGaWxlIHdoZW4gaXQgZmluaXNoZXMgbG9hZGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlI29uRmlsZUNvbXBsZXRlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuRmlsZX0gZmlsZSAtIFRoZSBGaWxlIHRoYXQgaGFzIGNvbXBsZXRlZCBwcm9jZXNzaW5nLlxyXG4gICAgICovXHJcbiAgICBvbkZpbGVDb21wbGV0ZTogZnVuY3Rpb24gKGZpbGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKGZpbGUpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nLS07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBlYWNoIEZpbGUgdGhhdCBmYWlscyB0byBsb2FkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5NdWx0aUZpbGUjb25GaWxlRmFpbGVkXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuRmlsZX0gZmlsZSAtIFRoZSBGaWxlIHRoYXQgaGFzIGZhaWxlZCB0byBsb2FkLlxyXG4gICAgICovXHJcbiAgICBvbkZpbGVGYWlsZWQ6IGZ1bmN0aW9uIChmaWxlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE11bHRpRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTWVyZ2VYSFJTZXR0aW5ncyA9IHJlcXVpcmUoJy4vTWVyZ2VYSFJTZXR0aW5ncycpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgWE1MSHR0cFJlcXVlc3QgKHhocikgb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBGaWxlIGFuZCBYSFJTZXR0aW5nc1xyXG4gKiBhbmQgc3RhcnRzIHRoZSBkb3dubG9hZCBvZiBpdC4gSXQgdXNlcyB0aGUgRmlsZXMgb3duIFhIUlNldHRpbmdzIGFuZCBtZXJnZXMgdGhlbVxyXG4gKiB3aXRoIHRoZSBnbG9iYWwgWEhSU2V0dGluZ3Mgb2JqZWN0IHRvIHNldCB0aGUgeGhyIHZhbHVlcyBiZWZvcmUgZG93bmxvYWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTG9hZGVyLlhIUkxvYWRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGUgLSBUaGUgRmlsZSB0byBkb3dubG9hZC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBnbG9iYWxYSFJTZXR0aW5ncyAtIFRoZSBnbG9iYWwgWEhSU2V0dGluZ3Mgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtYTUxIdHRwUmVxdWVzdH0gVGhlIFhIUiBvYmplY3QuXHJcbiAqL1xyXG52YXIgWEhSTG9hZGVyID0gZnVuY3Rpb24gKGZpbGUsIGdsb2JhbFhIUlNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgY29uZmlnID0gTWVyZ2VYSFJTZXR0aW5ncyhnbG9iYWxYSFJTZXR0aW5ncywgZmlsZS54aHJTZXR0aW5ncyk7XHJcblxyXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG5cclxuICAgIHhoci5vcGVuKCdHRVQnLCBmaWxlLnNyYywgY29uZmlnLmFzeW5jLCBjb25maWcudXNlciwgY29uZmlnLnBhc3N3b3JkKTtcclxuXHJcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gZmlsZS54aHJTZXR0aW5ncy5yZXNwb25zZVR5cGU7XHJcbiAgICB4aHIudGltZW91dCA9IGNvbmZpZy50aW1lb3V0O1xyXG5cclxuICAgIGlmIChjb25maWcuaGVhZGVycylcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnLmhlYWRlcnMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGNvbmZpZy5oZWFkZXJzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLmhlYWRlciAmJiBjb25maWcuaGVhZGVyVmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoY29uZmlnLmhlYWRlciwgY29uZmlnLmhlYWRlclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLnJlcXVlc3RlZFdpdGgpXHJcbiAgICB7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCBjb25maWcucmVxdWVzdGVkV2l0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5vdmVycmlkZU1pbWVUeXBlKVxyXG4gICAge1xyXG4gICAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKGNvbmZpZy5vdmVycmlkZU1pbWVUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscylcclxuICAgIHtcclxuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgcmVxdWVzdCwgdGhlIHhoci5yZXNwb25zZSBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4gdGhlIHJlcXVlc3RlZCBkYXRhIGFzIGEgRE9NU3RyaW5nLCBBcnJheUJ1ZmZlciwgQmxvYiwgb3IgRG9jdW1lbnQgKGRlcGVuZGluZyBvbiB3aGF0IHdhcyBzZXQgZm9yIHJlc3BvbnNlVHlwZS4pXHJcblxyXG4gICAgeGhyLm9ubG9hZCA9IGZpbGUub25Mb2FkLmJpbmQoZmlsZSwgeGhyKTtcclxuICAgIHhoci5vbmVycm9yID0gZmlsZS5vbkVycm9yLmJpbmQoZmlsZSwgeGhyKTtcclxuICAgIHhoci5vbnByb2dyZXNzID0gZmlsZS5vblByb2dyZXNzLmJpbmQoZmlsZSk7XHJcblxyXG4gICAgLy8gIFRoaXMgaXMgdGhlIG9ubHkgc3RhbmRhcmQgbWV0aG9kLCB0aGUgb25lcyBhYm92ZSBhcmUgYnJvd3NlciBhZGRpdGlvbnMgKG1heWJlIG5vdCB1bml2ZXJzYWw/KVxyXG4gICAgLy8geGhyLm9ucmVhZHlzdGF0ZWNoYW5nZVxyXG5cclxuICAgIHhoci5zZW5kKCk7XHJcblxyXG4gICAgcmV0dXJuIHhocjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWEhSTG9hZGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIFhIUlNldHRpbmdzIE9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLkxvYWRlci5YSFJTZXR0aW5nc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdFJlc3BvbnNlVHlwZX0gW3Jlc3BvbnNlVHlwZT0nJ10gLSBUaGUgcmVzcG9uc2VUeXBlLCBzdWNoIGFzICd0ZXh0Jy5cclxuICogQHBhcmFtIHtib29sZWFufSBbYXN5bmM9dHJ1ZV0gLSBTaG91bGQgdGhlIFhIUiByZXF1ZXN0IHVzZSBhc3luYyBvciBub3Q/XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXNlcj0nJ10gLSBPcHRpb25hbCB1c2VybmFtZSBmb3IgdGhlIFhIUiByZXF1ZXN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkPScnXSAtIE9wdGlvbmFsIHBhc3N3b3JkIGZvciB0aGUgWEhSIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbWVvdXQ9MF0gLSBPcHRpb25hbCBYSFIgdGltZW91dCB2YWx1ZS5cclxuICogQHBhcmFtIHtib29sZWFufSBbd2l0aENyZWRlbnRpYWxzPWZhbHNlXSAtIE9wdGlvbmFsIFhIUiB3aXRoQ3JlZGVudGlhbHMgdmFsdWUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFRoZSBYSFJTZXR0aW5ncyBvYmplY3QgYXMgdXNlZCBieSB0aGUgTG9hZGVyLlxyXG4gKi9cclxudmFyIFhIUlNldHRpbmdzID0gZnVuY3Rpb24gKHJlc3BvbnNlVHlwZSwgYXN5bmMsIHVzZXIsIHBhc3N3b3JkLCB0aW1lb3V0LCB3aXRoQ3JlZGVudGlhbHMpXHJcbntcclxuICAgIGlmIChyZXNwb25zZVR5cGUgPT09IHVuZGVmaW5lZCkgeyByZXNwb25zZVR5cGUgPSAnJzsgfVxyXG4gICAgaWYgKGFzeW5jID09PSB1bmRlZmluZWQpIHsgYXN5bmMgPSB0cnVlOyB9XHJcbiAgICBpZiAodXNlciA9PT0gdW5kZWZpbmVkKSB7IHVzZXIgPSAnJzsgfVxyXG4gICAgaWYgKHBhc3N3b3JkID09PSB1bmRlZmluZWQpIHsgcGFzc3dvcmQgPSAnJzsgfVxyXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkgeyB0aW1lb3V0ID0gMDsgfVxyXG4gICAgaWYgKHdpdGhDcmVkZW50aWFscyA9PT0gdW5kZWZpbmVkKSB7IHdpdGhDcmVkZW50aWFscyA9IGZhbHNlOyB9XHJcblxyXG4gICAgLy8gQmVmb3JlIHNlbmRpbmcgYSByZXF1ZXN0LCBzZXQgdGhlIHhoci5yZXNwb25zZVR5cGUgdG8gXCJ0ZXh0XCIsXHJcbiAgICAvLyBcImFycmF5YnVmZmVyXCIsIFwiYmxvYlwiLCBvciBcImRvY3VtZW50XCIsIGRlcGVuZGluZyBvbiB5b3VyIGRhdGEgbmVlZHMuXHJcbiAgICAvLyBOb3RlLCBzZXR0aW5nIHhoci5yZXNwb25zZVR5cGUgPSAnJyAob3Igb21pdHRpbmcpIHdpbGwgZGVmYXVsdCB0aGUgcmVzcG9uc2UgdG8gXCJ0ZXh0XCIuXHJcblxyXG4gICAgcmV0dXJuIHtcclxuXHJcbiAgICAgICAgLy8gIElnbm9yZWQgYnkgdGhlIExvYWRlciwgb25seSB1c2VkIGJ5IEZpbGUuXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiByZXNwb25zZVR5cGUsXHJcblxyXG4gICAgICAgIGFzeW5jOiBhc3luYyxcclxuXHJcbiAgICAgICAgLy8gIGNyZWRlbnRpYWxzXHJcbiAgICAgICAgdXNlcjogdXNlcixcclxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXHJcblxyXG4gICAgICAgIC8vICB0aW1lb3V0IGluIG1zICgwID0gbm8gdGltZW91dClcclxuICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxyXG5cclxuICAgICAgICAvLyAgc2V0UmVxdWVzdEhlYWRlclxyXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcclxuICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICBoZWFkZXJWYWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHJlcXVlc3RlZFdpdGg6IGZhbHNlLFxyXG5cclxuICAgICAgICAvLyAgb3ZlcnJpZGVNaW1lVHlwZVxyXG4gICAgICAgIG92ZXJyaWRlTWltZVR5cGU6IHVuZGVmaW5lZCxcclxuXHJcbiAgICAgICAgLy8gIHdpdGhDcmVkZW50aWFsc1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogd2l0aENyZWRlbnRpYWxzXHJcblxyXG4gICAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gWEhSU2V0dGluZ3M7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZJTEVfQ09OU1QgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgTG9hZGVyIGlzIGlkbGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTE9BREVSX0lETEVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIExPQURFUl9JRExFOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExvYWRlciBpcyBhY3RpdmVseSBsb2FkaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxPQURFUl9MT0FESU5HXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBMT0FERVJfTE9BRElORzogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBMb2FkZXIgaXMgcHJvY2Vzc2luZyBmaWxlcyBpcyBoYXMgbG9hZGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxPQURFUl9QUk9DRVNTSU5HXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBMT0FERVJfUFJPQ0VTU0lORzogMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBMb2FkZXIgaGFzIGNvbXBsZXRlZCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxPQURFUl9DT01QTEVURVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTE9BREVSX0NPTVBMRVRFOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExvYWRlciBpcyBzaHV0dGluZyBkb3duLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkxPQURFUl9TSFVURE9XTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTE9BREVSX1NIVVRET1dOOiA0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExvYWRlciBoYXMgYmVlbiBkZXN0cm95ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuTE9BREVSX0RFU1RST1lFRFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTE9BREVSX0RFU1RST1lFRDogNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGUgaXMgaW4gdGhlIGxvYWQgcXVldWUgYnV0IG5vdCB5ZXQgc3RhcnRlZFxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZJTEVfUEVORElOR1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRklMRV9QRU5ESU5HOiAxMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGUgaGFzIGJlZW4gc3RhcnRlZCB0byBsb2FkIGJ5IHRoZSBsb2FkZXIgKG9uTG9hZCBjYWxsZWQpXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRklMRV9MT0FESU5HXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGSUxFX0xPQURJTkc6IDExLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsZSBoYXMgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgYXdhaXRpbmcgcHJvY2Vzc2luZyAgICBcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GSUxFX0xPQURFRFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRklMRV9MT0FERUQ6IDEyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsZSBmYWlsZWQgdG8gbG9hZFxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZJTEVfRkFJTEVEXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGSUxFX0ZBSUxFRDogMTMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWxlIGlzIGJlaW5nIHByb2Nlc3NlZCAob25Qcm9jZXNzIGNhbGxiYWNrKVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTG9hZGVyLkZJTEVfUFJPQ0VTU0lOR1xyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRklMRV9QUk9DRVNTSU5HOiAxNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBGaWxlIGhhcyBlcnJvcmVkIHNvbWVob3cgZHVyaW5nIHByb2Nlc3NpbmcuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRklMRV9FUlJPUkVEXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGSUxFX0VSUk9SRUQ6IDE2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlsZSBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZy5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GSUxFX0NPTVBMRVRFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBGSUxFX0NPTVBMRVRFOiAxNyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGUgaGFzIGJlZW4gZGVzdHJveWVkXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Mb2FkZXIuRklMRV9ERVNUUk9ZRURcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEZJTEVfREVTVFJPWUVEOiAxOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbGUgd2FzIHBvcHVsYXRlZCBmcm9tIGxvY2FsIGRhdGEgYW5kIGRvZXNuJ3QgbmVlZCBhbiBIVFRQIHJlcXVlc3RcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkxvYWRlci5GSUxFX1BPUFVMQVRFRFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRklMRV9QT1BVTEFURUQ6IDE5XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGSUxFX0NPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTG9hZGVyIFBsdWdpbiBBZGQgRmlsZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGEgbmV3IGZpbGUgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBMb2FkZXIgYW5kIHBsYWNlZCBpbnRvIHRoZSBsb2FkIHF1ZXVlLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubG9hZC5vbignYWRkZmlsZScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBJZiB5b3UgYWRkIGxvdHMgb2YgZmlsZXMgdG8gYSBMb2FkZXIgZnJvbSBhIGBwcmVsb2FkYCBtZXRob2QsIGl0IHdpbGwgZGlzcGF0Y2ggdGhpcyBldmVudCBmb3IgZWFjaCBvbmUgb2YgdGhlbS5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Mb2FkZXIuRXZlbnRzI0FERFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIGtleSBvZiB0aGUgZmlsZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgTG9hZGVyLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBbZmlsZSB0eXBlXXtAbGluayBQaGFzZXIuTG9hZGVyLkZpbGUjdHlwZX0gc3RyaW5nIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBMb2FkZXIsIGkuZS4gYGltYWdlYC5cclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciBQbHVnaW4gdGhhdCBkaXNwYXRjaGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5GaWxlfSBmaWxlIC0gQSByZWZlcmVuY2UgdG8gdGhlIEZpbGUgd2hpY2ggd2FzIGFkZGVkIHRvIHRoZSBMb2FkZXIuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhZGRmaWxlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIExvYWRlciBQbHVnaW4gQ29tcGxldGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiB0aGUgTG9hZGVyIGhhcyBmdWxseSBwcm9jZXNzZWQgZXZlcnl0aGluZyBpbiB0aGUgbG9hZCBxdWV1ZS5cclxuICogQnkgdGhpcyBwb2ludCBldmVyeSBsb2FkZWQgZmlsZSB3aWxsIG5vdyBiZSBpbiBpdHMgYXNzb2NpYXRlZCBjYWNoZSBhbmQgcmVhZHkgZm9yIHVzZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmxvYWQub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Mb2FkZXIuRXZlbnRzI0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciBQbHVnaW4gdGhhdCBkaXNwYXRjaGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdG90YWxDb21wbGV0ZSAtIFRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCBzdWNjZXNzZnVsbHkgbG9hZGVkLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRvdGFsRmFpbGVkIC0gVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGZhaWxlZCB0byBsb2FkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY29tcGxldGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgRmlsZSBMb2FkIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBMb2FkZXIgUGx1Z2luIHdoZW4gYW55IGZpbGUgaW4gdGhlIHF1ZXVlIGZpbmlzaGVzIGxvYWRpbmcuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5sb2FkLm9uKCdmaWxlY29tcGxldGUnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogWW91IGNhbiBhbHNvIGxpc3RlbiBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYSBzcGVjaWZpYyBmaWxlLiBTZWUgdGhlIFtGSUxFX0tFWV9DT01QTEVURV17QGxpbmtjb2RlIFBoYXNlci5Mb2FkZXIuRXZlbnRzI2V2ZW50OkZJTEVfS0VZX0NPTVBMRVRFfSBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Mb2FkZXIuRXZlbnRzI0ZJTEVfQ09NUExFVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgZmlsZSB0aGF0IGp1c3QgbG9hZGVkIGFuZCBmaW5pc2hlZCBwcm9jZXNzaW5nLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBbZmlsZSB0eXBlXXtAbGluayBQaGFzZXIuTG9hZGVyLkZpbGUjdHlwZX0gb2YgdGhlIGZpbGUgdGhhdCBqdXN0IGxvYWRlZCwgaS5lLiBgaW1hZ2VgLlxyXG4gKiBAcGFyYW0ge2FueX0gZGF0YSAtIFRoZSByYXcgZGF0YSB0aGUgZmlsZSBjb250YWluZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdmaWxlY29tcGxldGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgRmlsZSBMb2FkIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBMb2FkZXIgUGx1Z2luIHdoZW4gYW55IGZpbGUgaW4gdGhlIHF1ZXVlIGZpbmlzaGVzIGxvYWRpbmcuXHJcbiAqIFxyXG4gKiBJdCB1c2VzIGEgc3BlY2lhbCBkeW5hbWljIGV2ZW50IG5hbWUgY29uc3RydWN0ZWQgZnJvbSB0aGUga2V5IGFuZCB0eXBlIG9mIHRoZSBmaWxlLlxyXG4gKiBcclxuICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGxvYWRlZCBhbiBgaW1hZ2VgIHdpdGggYSBrZXkgb2YgYG1vbnN0ZXJgLCB5b3UgY2FuIGxpc3RlbiBmb3IgaXRcclxuICogdXNpbmcgdGhlIGZvbGxvd2luZzpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQub24oJ2ZpbGVjb21wbGV0ZS1pbWFnZS1tb25zdGVyJywgZnVuY3Rpb24gKGtleSwgdHlwZSwgZGF0YSkge1xyXG4gKiAgICAgLy8gWW91ciBoYW5kbGVyIGNvZGVcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBPciwgaWYgeW91IGhhdmUgbG9hZGVkIGEgdGV4dHVyZSBgYXRsYXNgIHdpdGggYSBrZXkgb2YgYExldmVsMWA6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5vbignZmlsZWNvbXBsZXRlLWF0bGFzLUxldmVsMScsIGZ1bmN0aW9uIChrZXksIHR5cGUsIGRhdGEpIHtcclxuICogICAgIC8vIFlvdXIgaGFuZGxlciBjb2RlXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIE9yLCBpZiB5b3UgaGF2ZSBsb2FkZWQgYSBzcHJpdGUgc2hlZXQgd2l0aCBhIGtleSBvZiBgRXhwbG9zaW9uYCBhbmQgYSBwcmVmaXggb2YgYEdBTUVPVkVSYDpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLm9uKCdmaWxlY29tcGxldGUtc3ByaXRlc2hlZXQtR0FNRU9WRVJFeHBsb3Npb24nLCBmdW5jdGlvbiAoa2V5LCB0eXBlLCBkYXRhKSB7XHJcbiAqICAgICAvLyBZb3VyIGhhbmRsZXIgY29kZVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqIFxyXG4gKiBZb3UgY2FuIGFsc28gbGlzdGVuIGZvciB0aGUgZ2VuZXJpYyBjb21wbGV0aW9uIG9mIGZpbGVzLiBTZWUgdGhlIFtGSUxFX0NPTVBMRVRFXXtAbGlua2NvZGUgUGhhc2VyLkxvYWRlci5FdmVudHMjZXZlbnQ6RklMRV9DT01QTEVURX0gZXZlbnQuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuTG9hZGVyLkV2ZW50cyNGSUxFX0tFWV9DT01QTEVURVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBmaWxlIHRoYXQganVzdCBsb2FkZWQgYW5kIGZpbmlzaGVkIHByb2Nlc3NpbmcuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIFtmaWxlIHR5cGVde0BsaW5rIFBoYXNlci5Mb2FkZXIuRmlsZSN0eXBlfSBvZiB0aGUgZmlsZSB0aGF0IGp1c3QgbG9hZGVkLCBpLmUuIGBpbWFnZWAuXHJcbiAqIEBwYXJhbSB7YW55fSBkYXRhIC0gVGhlIHJhdyBkYXRhIHRoZSBmaWxlIGNvbnRhaW5lZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2ZpbGVjb21wbGV0ZS0nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgRmlsZSBMb2FkIEVycm9yIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBMb2FkZXIgUGx1Z2luIHdoZW4gYSBmaWxlIGZhaWxzIHRvIGxvYWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5sb2FkLm9uKCdsb2FkZXJyb3InLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkxvYWRlci5FdmVudHMjRklMRV9MT0FEX0VSUk9SXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGUgLSBBIHJlZmVyZW5jZSB0byB0aGUgRmlsZSB3aGljaCBlcnJvcmVkIGR1cmluZyBsb2FkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnbG9hZGVycm9yJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEZpbGUgTG9hZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgTG9hZGVyIFBsdWdpbiB3aGVuIGEgZmlsZSBmaW5pc2hlcyBsb2FkaW5nLFxyXG4gKiBidXQgX2JlZm9yZV8gaXQgaXMgcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgaW50ZXJuYWwgUGhhc2VyIGNhY2hlcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmxvYWQub24oJ2xvYWQnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkxvYWRlci5FdmVudHMjRklMRV9MT0FEXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGUgLSBBIHJlZmVyZW5jZSB0byB0aGUgRmlsZSB3aGljaCBqdXN0IGZpbmlzaGVkIGxvYWRpbmcuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdsb2FkJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEZpbGUgTG9hZCBQcm9ncmVzcyBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgTG9hZGVyIFBsdWdpbiBkdXJpbmcgdGhlIGxvYWQgb2YgYSBmaWxlLCBpZiB0aGUgYnJvd3NlciByZWNlaXZlcyBhIERPTSBQcm9ncmVzc0V2ZW50IGFuZFxyXG4gKiB0aGUgYGxlbmd0aENvbXB1dGFibGVgIGV2ZW50IHByb3BlcnR5IGlzIHRydWUuIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBhbmQgYnJvd3NlciBpbiB1c2UsIHRoaXMgbWF5LCBvciBtYXkgbm90IGhhcHBlbi5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmxvYWQub24oJ2ZpbGVwcm9ncmVzcycsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuTG9hZGVyLkV2ZW50cyNGSUxFX1BST0dSRVNTXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkZpbGV9IGZpbGUgLSBBIHJlZmVyZW5jZSB0byB0aGUgRmlsZSB3aGljaCBlcnJvcmVkIGR1cmluZyBsb2FkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudENvbXBsZXRlIC0gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBob3cgJ2NvbXBsZXRlJyB0aGlzIGZpbGUgaXMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdmaWxlcHJvZ3Jlc3MnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTG9hZGVyIFBsdWdpbiBQb3N0IFByb2Nlc3MgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIExvYWRlciBQbHVnaW4gd2hlbiB0aGUgTG9hZGVyIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIGxvYWQgcXVldWUuXHJcbiAqIEl0IGlzIGRpc3BhdGNoZWQgYmVmb3JlIHRoZSBpbnRlcm5hbCBsaXN0cyBhcmUgY2xlYXJlZCBhbmQgZWFjaCBGaWxlIGlzIGRlc3Ryb3llZC5cclxuICogXHJcbiAqIFVzZSB0aGlzIGhvb2sgdG8gcGVyZm9ybSBhbnkgbGFzdCBtaW51dGUgcHJvY2Vzc2luZyBvZiBmaWxlcyB0aGF0IGNhbiBvbmx5IGhhcHBlbiBvbmNlIHRoZVxyXG4gKiBMb2FkZXIgaGFzIGNvbXBsZXRlZCwgYnV0IHByaW9yIHRvIGl0IGVtaXR0aW5nIHRoZSBgY29tcGxldGVgIGV2ZW50LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubG9hZC5vbigncG9zdHByb2Nlc3MnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLkxvYWRlci5FdmVudHMjUE9TVF9QUk9DRVNTXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciBQbHVnaW4gdGhhdCBkaXNwYXRjaGVkIHRoaXMgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwb3N0cHJvY2Vzcyc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBMb2FkZXIgUGx1Z2luIFByb2dyZXNzIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIExvYWRlciB1cGRhdGVzIGl0cyBsb2FkIHByb2dyZXNzLCB0eXBpY2FsbHkgYXMgYSByZXN1bHQgb2YgYSBmaWxlIGhhdmluZyBjb21wbGV0ZWQgbG9hZGluZy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmxvYWQub24oJ3Byb2dyZXNzJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Mb2FkZXIuRXZlbnRzI1BST0dSRVNTXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtudW1iZXJ9IHByb2dyZXNzIC0gVGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb2YgdGhlIGxvYWQuIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncHJvZ3Jlc3MnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTG9hZGVyIFBsdWdpbiBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBMb2FkZXIgc3RhcnRzIHJ1bm5pbmcuIEF0IHRoaXMgcG9pbnQgbG9hZCBwcm9ncmVzcyBpcyB6ZXJvLlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGV2ZW4gaWYgdGhlcmUgYXJlbid0IGFueSBmaWxlcyBpbiB0aGUgbG9hZCBxdWV1ZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLmxvYWQub24oJ3N0YXJ0JywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Mb2FkZXIuRXZlbnRzI1NUQVJUXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciBQbHVnaW4gdGhhdCBkaXNwYXRjaGVkIHRoaXMgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkxvYWRlci5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBREQ6IHJlcXVpcmUoJy4vQUREX0VWRU5UJyksXHJcbiAgICBDT01QTEVURTogcmVxdWlyZSgnLi9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgRklMRV9DT01QTEVURTogcmVxdWlyZSgnLi9GSUxFX0NPTVBMRVRFX0VWRU5UJyksXHJcbiAgICBGSUxFX0tFWV9DT01QTEVURTogcmVxdWlyZSgnLi9GSUxFX0tFWV9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgRklMRV9MT0FEX0VSUk9SOiByZXF1aXJlKCcuL0ZJTEVfTE9BRF9FUlJPUl9FVkVOVCcpLFxyXG4gICAgRklMRV9MT0FEOiByZXF1aXJlKCcuL0ZJTEVfTE9BRF9FVkVOVCcpLFxyXG4gICAgRklMRV9QUk9HUkVTUzogcmVxdWlyZSgnLi9GSUxFX1BST0dSRVNTX0VWRU5UJyksXHJcbiAgICBQT1NUX1BST0NFU1M6IHJlcXVpcmUoJy4vUE9TVF9QUk9DRVNTX0VWRU5UJyksXHJcbiAgICBQUk9HUkVTUzogcmVxdWlyZSgnLi9QUk9HUkVTU19FVkVOVCcpLFxyXG4gICAgU1RBUlQ6IHJlcXVpcmUoJy4vU1RBUlRfRVZFTlQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEpTT05GaWxlID0gcmVxdWlyZSgnLi9KU09ORmlsZS5qcycpO1xyXG52YXIgTG9hZGVyRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBBbmltYXRpb24gSlNPTiBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYW5pbWF0aW9uIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhbmltYXRpb24uXHJcbiAqXHJcbiAqIEBjbGFzcyBBbmltYXRpb25KU09ORmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YUtleV0gLSBXaGVuIHRoZSBKU09OIGZpbGUgbG9hZHMgb25seSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBDYWNoZS5cclxuICovXHJcbnZhciBBbmltYXRpb25KU09ORmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogSlNPTkZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICAvLyAgdXJsIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBsaWtlIGEgcHJvcGVyIHVybCwgb3IgYW4gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSByZWFkeS1tYWRlIEpTIE9iamVjdFxyXG4gICAgLy8gIGRhdGFLZXkgYWxsb3dzIHlvdSB0byBwbHVjayBhIHNwZWNpZmljIG9iamVjdCBvdXQgb2YgdGhlIEpTT04gYW5kIHB1dCBqdXN0IHRoYXQgaW50byB0aGUgY2FjaGUsIHJhdGhlciB0aGFuIHRoZSB3aG9sZSB0aGluZ1xyXG5cclxuICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkpTT05GaWxlIChsb2FkZXIsIGtleSwgdXJsLCB4aHJTZXR0aW5ncywgZGF0YUtleSlcclxuICAgIHtcclxuICAgICAgICBKU09ORmlsZS5jYWxsKHRoaXMsIGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzLCBkYXRhS2V5KTtcclxuXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ2FuaW1hdGlvbkpTT04nO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkFuaW1hdGlvbkpTT05GaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgV2UgbmVlZCB0byBob29rIGludG8gdGhpcyBldmVudDpcclxuICAgICAgICB0aGlzLmxvYWRlci5vbmNlKExvYWRlckV2ZW50cy5QT1NUX1BST0NFU1MsIHRoaXMub25Mb2FkQ29tcGxldGUsIHRoaXMpO1xyXG5cclxuICAgICAgICAvLyAgQnV0IHRoZSByZXN0IGlzIHRoZSBzYW1lIGFzIGEgbm9ybWFsIEpTT04gZmlsZVxyXG4gICAgICAgIEpTT05GaWxlLnByb3RvdHlwZS5vblByb2Nlc3MuY2FsbCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9hZCBwcm9jZXNzLCBhZnRlciB0aGUgTG9hZGVyIGhhcyBmaW5pc2hlZCBhbGwgZmlsZXMgaW4gaXRzIHF1ZXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuQW5pbWF0aW9uSlNPTkZpbGUjb25Mb2FkQ29tcGxldGVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvbkxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvYWRlci5zeXN0ZW1zLmFuaW1zLmZyb21KU09OKHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIEFuaW1hdGlvbiBKU09OIERhdGEgZmlsZSwgb3IgYXJyYXkgb2YgQW5pbWF0aW9uIEpTT04gZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmFuaW1hdGlvbignYmFkZGllQW5pbXMnLCAnZmlsZXMvQmFkZGllQW5pbXMuanNvbicpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBjYWxsIHRoaXMgZnJvbSBvdXRzaWRlIG9mIGBwcmVsb2FkYCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHN0YXJ0aW5nIHRoZSBMb2FkZXIgYWZ0ZXJ3YXJkcyBhbmQgbW9uaXRvcmluZ1xyXG4gKiBpdHMgZXZlbnRzIHRvIGtub3cgd2hlbiBpdCdzIHNhZmUgdG8gdXNlIHRoZSBhc3NldC4gUGxlYXNlIHNlZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4gY2xhc3MgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBKU09OIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBKU09OIENhY2hlLlxyXG4gKiBMb2FkaW5nIGEgZmlsZSB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgdGFrZW4gd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nLiBJZiB5b3Ugd2lzaCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGVcclxuICogdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgSlNPTiBDYWNoZSBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5hbmltYXRpb24oe1xyXG4gKiAgICAga2V5OiAnYmFkZGllQW5pbXMnLFxyXG4gKiAgICAgdXJsOiAnZmlsZXMvQmFkZGllQW5pbXMuanNvbidcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcGFzc2VkIHRvIHRoZSBnbG9iYWwgQW5pbWF0aW9uIE1hbmFnZXJzIGBmcm9tSlNPTmAgbWV0aG9kLlxyXG4gKiBUaGlzIHdpbGwgcGFyc2UgYWxsIG9mIHRoZSBKU09OIGRhdGEgYW5kIGNyZWF0ZSBhbmltYXRpb24gZGF0YSBmcm9tIGl0LiBUaGlzIHByb2Nlc3MgaGFwcGVucyBhdCB0aGUgdmVyeSBlbmRcclxuICogb2YgdGhlIExvYWRlciwgb25jZSBldmVyeSBvdGhlciBmaWxlIGluIHRoZSBsb2FkIHF1ZXVlIGhhcyBmaW5pc2hlZC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBhbGxvdyB5b3UgdG8gbG9hZFxyXG4gKiBib3RoIGFuaW1hdGlvbiBkYXRhIGFuZCB0aGUgaW1hZ2VzIGl0IHJlbGllcyB1cG9uIGluIHRoZSBzYW1lIGxvYWQgY2FsbC5cclxuICpcclxuICogT25jZSB0aGUgYW5pbWF0aW9uIGRhdGEgaGFzIGJlZW4gcGFyc2VkIHlvdSB3aWxsIGJlIGFibGUgdG8gcGxheSBhbmltYXRpb25zIHVzaW5nIHRoYXQgZGF0YS5cclxuICogUGxlYXNlIHNlZSB0aGUgQW5pbWF0aW9uIE1hbmFnZXIgYGZyb21KU09OYCBtZXRob2QgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZm9ybWF0IGFuZCBwbGF5YmFjay5cclxuICpcclxuICogWW91IGNhbiBhbHNvIGFjY2VzcyB0aGUgcmF3IGFuaW1hdGlvbiBkYXRhIGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmFuaW1hdGlvbignYmFkZGllQW5pbXMnLCAnZmlsZXMvQmFkZGllQW5pbXMuanNvbicpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgZGF0YSA9IHRoaXMuY2FjaGUuanNvbi5nZXQoJ2JhZGRpZUFuaW1zJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBXYXZlc2AgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuV2F2ZXNgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBKU09OIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImRhdGFcIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiZGF0YS5qc29uXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmpzb25gIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseSBwcm92aWRlIGEgYGRhdGFLZXlgIHRvIHVzZS4gVGhpcyBhbGxvd3MgeW91IHRvIGV4dHJhY3Qgb25seSBhIHBhcnQgb2YgdGhlIEpTT04gYW5kIHN0b3JlIGl0IGluIHRoZSBDYWNoZSxcclxuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGZpbGUuIEZvciBleGFtcGxlLCBpZiB5b3VyIEpTT04gZGF0YSBoYWQgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOlxyXG4gKlxyXG4gKiBgYGBqc29uXHJcbiAqIHtcclxuICogICAgIFwibGV2ZWwxXCI6IHtcclxuICogICAgICAgICBcImJhZGRpZXNcIjoge1xyXG4gKiAgICAgICAgICAgICBcImFsaWVuc1wiOiB7fSxcclxuICogICAgICAgICAgICAgXCJib3NzXCI6IHt9XHJcbiAqICAgICAgICAgfVxyXG4gKiAgICAgfSxcclxuICogICAgIFwibGV2ZWwyXCI6IHt9LFxyXG4gKiAgICAgXCJsZXZlbDNcIjoge31cclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQW5kIGlmIHlvdSBvbmx5IHdhbnRlZCB0byBjcmVhdGUgYW5pbWF0aW9ucyBmcm9tIHRoZSBgYm9zc2AgZGF0YSwgdGhlbiB5b3UgY291bGQgcGFzcyBgbGV2ZWwxLmJhZGRpZXMuYm9zc2BhcyB0aGUgYGRhdGFLZXlgLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEpTT04gRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYW5pbWF0aW9uXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+Lmpzb25gLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc29uXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YUtleV0gLSBXaGVuIHRoZSBBbmltYXRpb24gSlNPTiBmaWxlIGxvYWRzIG9ubHkgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQ2FjaGUgYW5kIHVzZWQgdG8gY3JlYXRlIGFuaW1hdGlvbiBkYXRhLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdhbmltYXRpb24nLCBmdW5jdGlvbiAoa2V5LCB1cmwsIGRhdGFLZXksIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICAvLyAgU3VwcG9ydHMgYW4gT2JqZWN0IGZpbGUgZGVmaW5pdGlvbiBpbiB0aGUga2V5IGFyZ3VtZW50XHJcbiAgICAvLyAgT3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiB0aGUga2V5IGFyZ3VtZW50XHJcbiAgICAvLyAgT3IgYSBzaW5nbGUgZW50cnkgd2hlcmUgYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gZGVmaW5lZFxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEFuaW1hdGlvbkpTT05GaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEFuaW1hdGlvbkpTT05GaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncywgZGF0YUtleSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQW5pbWF0aW9uSlNPTkZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJbWFnZUZpbGUgPSByZXF1aXJlKCcuL0ltYWdlRmlsZS5qcycpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBKU09ORmlsZSA9IHJlcXVpcmUoJy4vSlNPTkZpbGUuanMnKTtcclxudmFyIE11bHRpRmlsZSA9IHJlcXVpcmUoJy4uL011bHRpRmlsZS5qcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgSlNPTiBiYXNlZCBUZXh0dXJlIEF0bGFzIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhdGxhcyBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYXRsYXMuXHJcbiAqXHJcbiAqIGh0dHBzOi8vd3d3LmNvZGVhbmR3ZWIuY29tL3RleHR1cmVwYWNrZXIvdHV0b3JpYWxzL2hvdy10by1jcmVhdGUtc3ByaXRlLXNoZWV0cy1mb3ItcGhhc2VyMz9zb3VyY2U9cGhvdG9uc3Rvcm1cclxuICpcclxuICogQGNsYXNzIEF0bGFzSlNPTkZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5NdWx0aUZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdGxhc0pTT05GaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3RleHR1cmVVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGltYWdlIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ucG5nYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ucG5nXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXRsYXNVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGF0bGFzIGpzb24gZGF0YSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+Lmpzb25gLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc29uXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3RleHR1cmVYaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBhdGxhcyBpbWFnZSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFthdGxhc1hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF0bGFzIGpzb24gZmlsZS4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICovXHJcbnZhciBBdGxhc0pTT05GaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBNdWx0aUZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBBdGxhc0pTT05GaWxlIChsb2FkZXIsIGtleSwgdGV4dHVyZVVSTCwgYXRsYXNVUkwsIHRleHR1cmVYaHJTZXR0aW5ncywgYXRsYXNYaHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICB2YXIgaW1hZ2U7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcblxyXG4gICAgICAgIGlmIChJc1BsYWluT2JqZWN0KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlnID0ga2V5O1xyXG5cclxuICAgICAgICAgICAga2V5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2tleScpO1xyXG5cclxuICAgICAgICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2VGaWxlKGxvYWRlciwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgICB1cmw6IEdldEZhc3RWYWx1ZShjb25maWcsICd0ZXh0dXJlVVJMJyksXHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IEdldEZhc3RWYWx1ZShjb25maWcsICd0ZXh0dXJlRXh0ZW5zaW9uJywgJ3BuZycpLFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsTWFwOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnbm9ybWFsTWFwJyksXHJcbiAgICAgICAgICAgICAgICB4aHJTZXR0aW5nczogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVYaHJTZXR0aW5ncycpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZGF0YSA9IG5ldyBKU09ORmlsZShsb2FkZXIsIHtcclxuICAgICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgICAgdXJsOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXRsYXNVUkwnKSxcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbjogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2F0bGFzRXh0ZW5zaW9uJywgJ2pzb24nKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXRsYXNYaHJTZXR0aW5ncycpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCBrZXksIHRleHR1cmVVUkwsIHRleHR1cmVYaHJTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgSlNPTkZpbGUobG9hZGVyLCBrZXksIGF0bGFzVVJMLCBhdGxhc1hoclNldHRpbmdzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbWFnZS5saW5rRmlsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJbWFnZSBoYXMgYSBub3JtYWwgbWFwXHJcbiAgICAgICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ2F0bGFzanNvbicsIGtleSwgWyBpbWFnZSwgZGF0YSwgaW1hZ2UubGlua0ZpbGUgXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ2F0bGFzanNvbicsIGtleSwgWyBpbWFnZSwgZGF0YSBdKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzSlNPTkZpbGUjYWRkVG9DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FjaGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkeVRvUHJvY2VzcygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy5maWxlc1swXTtcclxuICAgICAgICAgICAgdmFyIGpzb24gPSB0aGlzLmZpbGVzWzFdO1xyXG4gICAgICAgICAgICB2YXIgbm9ybWFsTWFwID0gKHRoaXMuZmlsZXNbMl0pID8gdGhpcy5maWxlc1syXS5kYXRhIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyLnRleHR1cmVNYW5hZ2VyLmFkZEF0bGFzKGltYWdlLmtleSwgaW1hZ2UuZGF0YSwganNvbi5kYXRhLCBub3JtYWxNYXApO1xyXG5cclxuICAgICAgICAgICAganNvbi5hZGRUb0NhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgSlNPTiBiYXNlZCBUZXh0dXJlIEF0bGFzLCBvciBhcnJheSBvZiBhdGxhc2VzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5hdGxhcygnbWFpbm1lbnUnLCAnaW1hZ2VzL01haW5NZW51LnBuZycsICdpbWFnZXMvTWFpbk1lbnUuanNvbicpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBjYWxsIHRoaXMgZnJvbSBvdXRzaWRlIG9mIGBwcmVsb2FkYCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHN0YXJ0aW5nIHRoZSBMb2FkZXIgYWZ0ZXJ3YXJkcyBhbmQgbW9uaXRvcmluZ1xyXG4gKiBpdHMgZXZlbnRzIHRvIGtub3cgd2hlbiBpdCdzIHNhZmUgdG8gdXNlIHRoZSBhc3NldC4gUGxlYXNlIHNlZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4gY2xhc3MgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogUGhhc2VyIGV4cGVjdHMgdGhlIGF0bGFzIGRhdGEgdG8gYmUgcHJvdmlkZWQgaW4gYSBKU09OIGZpbGUsIHVzaW5nIGVpdGhlciB0aGUgSlNPTiBIYXNoIG9yIEpTT04gQXJyYXkgZm9ybWF0LlxyXG4gKiBUaGVzZSBmaWxlcyBhcmUgY3JlYXRlZCBieSBzb2Z0d2FyZSBzdWNoIGFzIFRleHR1cmUgUGFja2VyLCBTaG9lYm94IGFuZCBBZG9iZSBGbGFzaCAvIEFuaW1hdGUuXHJcbiAqIElmIHlvdSBhcmUgdXNpbmcgVGV4dHVyZSBQYWNrZXIgYW5kIGhhdmUgZW5hYmxlZCBtdWx0aS1hdGxhcyBzdXBwb3J0LCB0aGVuIHBsZWFzZSB1c2UgdGhlIFBoYXNlciBNdWx0aSBBdGxhcyBsb2FkZXJcclxuICogaW5zdGVhZCBvZiB0aGlzIG9uZS5cclxuICpcclxuICogUGhhc2VyIGNhbiBsb2FkIGFsbCBjb21tb24gaW1hZ2UgdHlwZXM6IHBuZywganBnLCBnaWYgYW5kIGFueSBvdGhlciBmb3JtYXQgdGhlIGJyb3dzZXIgY2FuIG5hdGl2ZWx5IGhhbmRsZS5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5hdGxhcyh7XHJcbiAqICAgICBrZXk6ICdtYWlubWVudScsXHJcbiAqICAgICB0ZXh0dXJlVVJMOiAnaW1hZ2VzL01haW5NZW51LnBuZycsXHJcbiAqICAgICBhdGxhc1VSTDogJ2ltYWdlcy9NYWluTWVudS5qc29uJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzSlNPTkZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhIFVSTCBmb3IgdGhlIGF0bGFzIEpTT04gZGF0YSB5b3UgY2FuIGFsc28gcGFzcyBpbiBhIHdlbGwgZm9ybWVkIEpTT04gb2JqZWN0IGluc3RlYWQuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGF0bGFzIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gdXNlIGZyYW1lcyBmcm9tIGl0IGFzIHRleHR1cmVzIGZvciBhIEdhbWUgT2JqZWN0IGJ5IHJlZmVyZW5jaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF0bGFzKCdtYWlubWVudScsICdpbWFnZXMvTWFpbk1lbnUucG5nJywgJ2ltYWdlcy9NYWluTWVudS5qc29uJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHRoaXMuYWRkLmltYWdlKHgsIHksICdtYWlubWVudScsICdiYWNrZ3JvdW5kJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUbyBnZXQgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgZnJhbWVzIHdpdGhpbiBhbiBhdGxhcyBwbGVhc2UgY29uc3VsdCB5b3VyIFRleHR1cmUgQXRsYXMgc29mdHdhcmUuXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIHNwZWNpZmllZCBhIHByZWZpeCBpbiB0aGUgbG9hZGVyLCB2aWEgYExvYWRlci5zZXRQcmVmaXhgIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGlzIGZpbGVzXHJcbiAqIGtleS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggd2FzIGBNRU5VLmAgYW5kIHRoZSBrZXkgd2FzIGBCYWNrZ3JvdW5kYCB0aGUgZmluYWwga2V5IHdpbGwgYmUgYE1FTlUuQmFja2dyb3VuZGAgYW5kXHJcbiAqIHRoaXMgaXMgd2hhdCB5b3Ugd291bGQgdXNlIHRvIHJldHJpZXZlIHRoZSBpbWFnZSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqXHJcbiAqIFRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMIGlzIHJlbGF0aXZlIHRoZSBgTG9hZGVyLmJhc2VVUkxgIGFuZCBgTG9hZGVyLnBhdGhgIHZhbHVlcyB3aWxsIGJlIHByZXBlbmRlZCB0byBpdC5cclxuICpcclxuICogSWYgdGhlIFVSTCBpc24ndCBzcGVjaWZpZWQgdGhlIExvYWRlciB3aWxsIHRha2UgdGhlIGtleSBhbmQgY3JlYXRlIGEgZmlsZW5hbWUgZnJvbSB0aGF0LiBGb3IgZXhhbXBsZSBpZiB0aGUga2V5IGlzIFwiYWxpZW5cIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiYWxpZW4ucG5nXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLnBuZ2AgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIFBoYXNlciBhbHNvIHN1cHBvcnRzIHRoZSBhdXRvbWF0aWMgbG9hZGluZyBvZiBhc3NvY2lhdGVkIG5vcm1hbCBtYXBzLiBJZiB5b3UgaGF2ZSBhIG5vcm1hbCBtYXAgdG8gZ28gd2l0aCB0aGlzIGltYWdlLFxyXG4gKiB0aGVuIHlvdSBjYW4gc3BlY2lmeSBpdCBieSBwcm92aWRpbmcgYW4gYXJyYXkgYXMgdGhlIGB1cmxgIHdoZXJlIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgbm9ybWFsIG1hcDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuYXRsYXMoJ21haW5tZW51JywgWyAnaW1hZ2VzL01haW5NZW51LnBuZycsICdpbWFnZXMvTWFpbk1lbnUtbi5wbmcnIF0sICdpbWFnZXMvTWFpbk1lbnUuanNvbicpO1xyXG4gKiBgYGBcclxuICpcclxuICogT3IsIGlmIHlvdSBhcmUgdXNpbmcgYSBjb25maWcgb2JqZWN0IHVzZSB0aGUgYG5vcm1hbE1hcGAgcHJvcGVydHk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF0bGFzKHtcclxuICogICAgIGtleTogJ21haW5tZW51JyxcclxuICogICAgIHRleHR1cmVVUkw6ICdpbWFnZXMvTWFpbk1lbnUucG5nJyxcclxuICogICAgIG5vcm1hbE1hcDogJ2ltYWdlcy9NYWluTWVudS1uLnBuZycsXHJcbiAqICAgICBhdGxhc1VSTDogJ2ltYWdlcy9NYWluTWVudS5qc29uJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBub3JtYWwgbWFwIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSBjb25kaXRpb25zIGFzIHRoZSBpbWFnZSBmaWxlIHdpdGggcmVnYXJkIHRvIHRoZSBwYXRoLCBiYXNlVVJMLCBDT1JzIGFuZCBYSFIgU2V0dGluZ3MuXHJcbiAqIE5vcm1hbCBtYXBzIGFyZSBhIFdlYkdMIG9ubHkgZmVhdHVyZS5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBBdGxhcyBKU09OIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F0bGFzXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdGxhc0pTT05GaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzSlNPTkZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt0ZXh0dXJlVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgdGV4dHVyZSBpbWFnZSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnBuZ2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnBuZ1wiLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0bGFzVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgdGV4dHVyZSBhdGxhcyBqc29uIGRhdGEgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt0ZXh0dXJlWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgYXRsYXMgaW1hZ2UgZmlsZS4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbYXRsYXNYaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBhdGxhcyBqc29uIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdhdGxhcycsIGZ1bmN0aW9uIChrZXksIHRleHR1cmVVUkwsIGF0bGFzVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MsIGF0bGFzWGhyU2V0dGluZ3MpXHJcbntcclxuICAgIHZhciBtdWx0aWZpbGU7XHJcblxyXG4gICAgLy8gIFN1cHBvcnRzIGFuIE9iamVjdCBmaWxlIGRlZmluaXRpb24gaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGEgc2luZ2xlIGVudHJ5IHdoZXJlIGFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIGRlZmluZWRcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbXVsdGlmaWxlID0gbmV3IEF0bGFzSlNPTkZpbGUodGhpcywga2V5W2ldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBtdWx0aWZpbGUgPSBuZXcgQXRsYXNKU09ORmlsZSh0aGlzLCBrZXksIHRleHR1cmVVUkwsIGF0bGFzVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MsIGF0bGFzWGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEZpbGUobXVsdGlmaWxlLmZpbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEF0bGFzSlNPTkZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJbWFnZUZpbGUgPSByZXF1aXJlKCcuL0ltYWdlRmlsZS5qcycpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBNdWx0aUZpbGUgPSByZXF1aXJlKCcuLi9NdWx0aUZpbGUuanMnKTtcclxudmFyIFhNTEZpbGUgPSByZXF1aXJlKCcuL1hNTEZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFhNTCBiYXNlZCBUZXh0dXJlIEF0bGFzIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhdGxhc1hNTCBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYXRsYXNYTUwuXHJcbiAqXHJcbiAqIEBjbGFzcyBBdGxhc1hNTEZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5NdWx0aUZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy43LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdGxhc1hNTEZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdGV4dHVyZVVSTF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhlIHRleHR1cmUgaW1hZ2UgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5wbmdgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5wbmdcIi5cclxuICogQHBhcmFtIHtzdHJpbmd9IFthdGxhc1VSTF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhlIHRleHR1cmUgYXRsYXMgeG1sIGRhdGEgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi54bWxgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi54bWxcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbdGV4dHVyZVhoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF0bGFzIGltYWdlIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW2F0bGFzWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgYXRsYXMgeG1sIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqL1xyXG52YXIgQXRsYXNYTUxGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBNdWx0aUZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBBdGxhc1hNTEZpbGUgKGxvYWRlciwga2V5LCB0ZXh0dXJlVVJMLCBhdGxhc1VSTCwgdGV4dHVyZVhoclNldHRpbmdzLCBhdGxhc1hoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbWFnZTtcclxuICAgICAgICB2YXIgZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcblxyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVybDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVVUkwnKSxcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbjogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVFeHRlbnNpb24nLCAncG5nJyksXHJcbiAgICAgICAgICAgICAgICBub3JtYWxNYXA6IEdldEZhc3RWYWx1ZShjb25maWcsICdub3JtYWxNYXAnKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGV4dHVyZVhoclNldHRpbmdzJylcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gbmV3IFhNTEZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVybDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2F0bGFzVVJMJyksXHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IEdldEZhc3RWYWx1ZShjb25maWcsICdhdGxhc0V4dGVuc2lvbicsICd4bWwnKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXRsYXNYaHJTZXR0aW5ncycpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCBrZXksIHRleHR1cmVVUkwsIHRleHR1cmVYaHJTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgWE1MRmlsZShsb2FkZXIsIGtleSwgYXRsYXNVUkwsIGF0bGFzWGhyU2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGltYWdlLmxpbmtGaWxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEltYWdlIGhhcyBhIG5vcm1hbCBtYXBcclxuICAgICAgICAgICAgTXVsdGlGaWxlLmNhbGwodGhpcywgbG9hZGVyLCAnYXRsYXN4bWwnLCBrZXksIFsgaW1hZ2UsIGRhdGEsIGltYWdlLmxpbmtGaWxlIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBNdWx0aUZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsICdhdGxhc3htbCcsIGtleSwgWyBpbWFnZSwgZGF0YSBdKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzWE1MRmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5VG9Qcm9jZXNzKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLmZpbGVzWzBdO1xyXG4gICAgICAgICAgICB2YXIgeG1sID0gdGhpcy5maWxlc1sxXTtcclxuICAgICAgICAgICAgdmFyIG5vcm1hbE1hcCA9ICh0aGlzLmZpbGVzWzJdKSA/IHRoaXMuZmlsZXNbMl0uZGF0YSA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRlci50ZXh0dXJlTWFuYWdlci5hZGRBdGxhc1hNTChpbWFnZS5rZXksIGltYWdlLmRhdGEsIHhtbC5kYXRhLCBub3JtYWxNYXApO1xyXG5cclxuICAgICAgICAgICAgeG1sLmFkZFRvQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gWE1MIGJhc2VkIFRleHR1cmUgQXRsYXMsIG9yIGFycmF5IG9mIGF0bGFzZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmF0bGFzWE1MKCdtYWlubWVudScsICdpbWFnZXMvTWFpbk1lbnUucG5nJywgJ2ltYWdlcy9NYWluTWVudS54bWwnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBJZiB5b3UgY2FsbCB0aGlzIGZyb20gb3V0c2lkZSBvZiBgcHJlbG9hZGAgdGhlbiB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBzdGFydGluZyB0aGUgTG9hZGVyIGFmdGVyd2FyZHMgYW5kIG1vbml0b3JpbmdcclxuICogaXRzIGV2ZW50cyB0byBrbm93IHdoZW4gaXQncyBzYWZlIHRvIHVzZSB0aGUgYXNzZXQuIFBsZWFzZSBzZWUgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luIGNsYXNzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIFBoYXNlciBleHBlY3RzIHRoZSBhdGxhcyBkYXRhIHRvIGJlIHByb3ZpZGVkIGluIGFuIFhNTCBmaWxlIGZvcm1hdC5cclxuICogVGhlc2UgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgc29mdHdhcmUgc3VjaCBhcyBTaG9lYm94IGFuZCBBZG9iZSBGbGFzaCAvIEFuaW1hdGUuXHJcbiAqXHJcbiAqIFBoYXNlciBjYW4gbG9hZCBhbGwgY29tbW9uIGltYWdlIHR5cGVzOiBwbmcsIGpwZywgZ2lmIGFuZCBhbnkgb3RoZXIgZm9ybWF0IHRoZSBicm93c2VyIGNhbiBuYXRpdmVseSBoYW5kbGUuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuYXRsYXNYTUwoe1xyXG4gKiAgICAga2V5OiAnbWFpbm1lbnUnLFxyXG4gKiAgICAgdGV4dHVyZVVSTDogJ2ltYWdlcy9NYWluTWVudS5wbmcnLFxyXG4gKiAgICAgYXRsYXNVUkw6ICdpbWFnZXMvTWFpbk1lbnUueG1sJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzWE1MRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgYXRsYXMgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiB1c2UgZnJhbWVzIGZyb20gaXQgYXMgdGV4dHVyZXMgZm9yIGEgR2FtZSBPYmplY3QgYnkgcmVmZXJlbmNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuYXRsYXNYTUwoJ21haW5tZW51JywgJ2ltYWdlcy9NYWluTWVudS5wbmcnLCAnaW1hZ2VzL01haW5NZW51LnhtbCcpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLmFkZC5pbWFnZSh4LCB5LCAnbWFpbm1lbnUnLCAnYmFja2dyb3VuZCcpO1xyXG4gKiBgYGBcclxuICpcclxuICogVG8gZ2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGZyYW1lcyB3aXRoaW4gYW4gYXRsYXMgcGxlYXNlIGNvbnN1bHQgeW91ciBUZXh0dXJlIEF0bGFzIHNvZnR3YXJlLlxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTUVOVS5gIGFuZCB0aGUga2V5IHdhcyBgQmFja2dyb3VuZGAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBNRU5VLkJhY2tncm91bmRgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgaW1hZ2UgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLnBuZ1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5wbmdgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBQaGFzZXIgYWxzbyBzdXBwb3J0cyB0aGUgYXV0b21hdGljIGxvYWRpbmcgb2YgYXNzb2NpYXRlZCBub3JtYWwgbWFwcy4gSWYgeW91IGhhdmUgYSBub3JtYWwgbWFwIHRvIGdvIHdpdGggdGhpcyBpbWFnZSxcclxuICogdGhlbiB5b3UgY2FuIHNwZWNpZnkgaXQgYnkgcHJvdmlkaW5nIGFuIGFycmF5IGFzIHRoZSBgdXJsYCB3aGVyZSB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIG5vcm1hbCBtYXA6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF0bGFzWE1MKCdtYWlubWVudScsIFsgJ2ltYWdlcy9NYWluTWVudS5wbmcnLCAnaW1hZ2VzL01haW5NZW51LW4ucG5nJyBdLCAnaW1hZ2VzL01haW5NZW51LnhtbCcpO1xyXG4gKiBgYGBcclxuICpcclxuICogT3IsIGlmIHlvdSBhcmUgdXNpbmcgYSBjb25maWcgb2JqZWN0IHVzZSB0aGUgYG5vcm1hbE1hcGAgcHJvcGVydHk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF0bGFzWE1MKHtcclxuICogICAgIGtleTogJ21haW5tZW51JyxcclxuICogICAgIHRleHR1cmVVUkw6ICdpbWFnZXMvTWFpbk1lbnUucG5nJyxcclxuICogICAgIG5vcm1hbE1hcDogJ2ltYWdlcy9NYWluTWVudS1uLnBuZycsXHJcbiAqICAgICBhdGxhc1VSTDogJ2ltYWdlcy9NYWluTWVudS54bWwnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogVGhlIG5vcm1hbCBtYXAgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgdGhlIGltYWdlIGZpbGUgd2l0aCByZWdhcmQgdG8gdGhlIHBhdGgsIGJhc2VVUkwsIENPUnMgYW5kIFhIUiBTZXR0aW5ncy5cclxuICogTm9ybWFsIG1hcHMgYXJlIGEgV2ViR0wgb25seSBmZWF0dXJlLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEF0bGFzIFhNTCBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhdGxhc1hNTFxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjcuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXRsYXNYTUxGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkF0bGFzWE1MRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3RleHR1cmVVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGltYWdlIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ucG5nYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ucG5nXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXRsYXNVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGF0bGFzIHhtbCBkYXRhIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ueG1sYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ueG1sXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3RleHR1cmVYaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBhdGxhcyBpbWFnZSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFthdGxhc1hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF0bGFzIHhtbCBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcignYXRsYXNYTUwnLCBmdW5jdGlvbiAoa2V5LCB0ZXh0dXJlVVJMLCBhdGxhc1VSTCwgdGV4dHVyZVhoclNldHRpbmdzLCBhdGxhc1hoclNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgbXVsdGlmaWxlO1xyXG5cclxuICAgIC8vICBTdXBwb3J0cyBhbiBPYmplY3QgZmlsZSBkZWZpbml0aW9uIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhbiBhcnJheSBvZiBvYmplY3RzIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhIHNpbmdsZSBlbnRyeSB3aGVyZSBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBkZWZpbmVkXHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG11bHRpZmlsZSA9IG5ldyBBdGxhc1hNTEZpbGUodGhpcywga2V5W2ldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBtdWx0aWZpbGUgPSBuZXcgQXRsYXNYTUxGaWxlKHRoaXMsIGtleSwgdGV4dHVyZVVSTCwgYXRsYXNVUkwsIHRleHR1cmVYaHJTZXR0aW5ncywgYXRsYXNYaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQXRsYXNYTUxGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIEhUTUw1QXVkaW9GaWxlID0gcmVxdWlyZSgnLi9IVE1MNUF1ZGlvRmlsZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBBdWRpbyBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYXVkaW8gbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F1ZGlvLlxyXG4gKlxyXG4gKiBAY2xhc3MgQXVkaW9GaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkF1ZGlvRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHthbnl9IFt1cmxDb25maWddIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tIGluIGEgY29uZmlnIG9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0ge0F1ZGlvQ29udGV4dH0gW2F1ZGlvQ29udGV4dF0gLSBUaGUgQXVkaW9Db250ZXh0IHRoaXMgZmlsZSB3aWxsIHVzZSB0byBwcm9jZXNzIGl0c2VsZi5cclxuICovXHJcbnZhciBBdWRpb0ZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICAvLyAgVVJMIGlzIGFuIG9iamVjdCBjcmVhdGVkIGJ5IEF1ZGlvRmlsZS5maW5kQXVkaW9VUkxcclxuICAgIGZ1bmN0aW9uIEF1ZGlvRmlsZSAobG9hZGVyLCBrZXksIHVybENvbmZpZywgeGhyU2V0dGluZ3MsIGF1ZGlvQ29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgYXVkaW9Db250ZXh0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2NvbnRleHQnLCBhdWRpb0NvbnRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhdWRpbycsXHJcbiAgICAgICAgICAgIGNhY2hlOiBsb2FkZXIuY2FjaGVNYW5hZ2VyLmF1ZGlvLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IHVybENvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybENvbmZpZy51cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5ncyxcclxuICAgICAgICAgICAgY29uZmlnOiB7IGNvbnRleHQ6IGF1ZGlvQ29udGV4dCB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9GaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBpbnRlcmVzdGluZyByZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBdWRpby93ZWItYXVkaW8tYXBpL2lzc3Vlcy8xMzA1XHJcbiAgICAgICAgdGhpcy5jb25maWcuY29udGV4dC5kZWNvZGVBdWRpb0RhdGEodGhpcy54aHJMb2FkZXIucmVzcG9uc2UsXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChhdWRpb0J1ZmZlcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YSA9IGF1ZGlvQnVmZmVyO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVjb2RpbmcgYXVkaW86ICcgKyB0aGlzLmtleSArICcgLSAnLCBlID8gZS5tZXNzYWdlIDogbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlnLmNvbnRleHQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5BdWRpb0ZpbGUuY3JlYXRlID0gZnVuY3Rpb24gKGxvYWRlciwga2V5LCB1cmxzLCBjb25maWcsIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgZ2FtZSA9IGxvYWRlci5zeXN0ZW1zLmdhbWU7XHJcbiAgICB2YXIgYXVkaW9Db25maWcgPSBnYW1lLmNvbmZpZy5hdWRpbztcclxuICAgIHZhciBkZXZpY2VBdWRpbyA9IGdhbWUuZGV2aWNlLmF1ZGlvO1xyXG5cclxuICAgIC8vICB1cmwgbWF5IGJlIGluc2lkZSBrZXksIHdoaWNoIG1heSBiZSBhbiBvYmplY3RcclxuICAgIGlmIChJc1BsYWluT2JqZWN0KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgdXJscyA9IEdldEZhc3RWYWx1ZShrZXksICd1cmwnLCBbXSk7XHJcbiAgICAgICAgY29uZmlnID0gR2V0RmFzdFZhbHVlKGtleSwgJ2NvbmZpZycsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdXJsQ29uZmlnID0gQXVkaW9GaWxlLmdldEF1ZGlvVVJMKGdhbWUsIHVybHMpO1xyXG5cclxuICAgIGlmICghdXJsQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTIvMDIvSFRNTDUtYXVkaW8tYW5kLXRoZS1XZWItQXVkaW8tQVBJLWFyZS1CRkZzXHJcbiAgICAvLyB2YXIgc3RyZWFtID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3N0cmVhbScsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoZGV2aWNlQXVkaW8ud2ViQXVkaW8gJiYgIShhdWRpb0NvbmZpZyAmJiBhdWRpb0NvbmZpZy5kaXNhYmxlV2ViQXVkaW8pKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBuZXcgQXVkaW9GaWxlKGxvYWRlciwga2V5LCB1cmxDb25maWcsIHhoclNldHRpbmdzLCBnYW1lLnNvdW5kLmNvbnRleHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBuZXcgSFRNTDVBdWRpb0ZpbGUobG9hZGVyLCBrZXksIHVybENvbmZpZywgY29uZmlnKTtcclxuICAgIH1cclxufTtcclxuXHJcbkF1ZGlvRmlsZS5nZXRBdWRpb1VSTCA9IGZ1bmN0aW9uIChnYW1lLCB1cmxzKVxyXG57XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJscykpXHJcbiAgICB7XHJcbiAgICAgICAgdXJscyA9IFsgdXJscyBdO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgdXJsID0gR2V0RmFzdFZhbHVlKHVybHNbaV0sICd1cmwnLCB1cmxzW2ldKTtcclxuXHJcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCdibG9iOicpID09PSAwIHx8IHVybC5pbmRleE9mKCdkYXRhOicpID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBhdWRpb1R5cGUgPSB1cmwubWF0Y2goL1xcLihbYS16QS1aMC05XSspKCR8XFw/KS8pO1xyXG5cclxuICAgICAgICBhdWRpb1R5cGUgPSBHZXRGYXN0VmFsdWUodXJsc1tpXSwgJ3R5cGUnLCAoYXVkaW9UeXBlKSA/IGF1ZGlvVHlwZVsxXSA6ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZS5kZXZpY2UuYXVkaW9bYXVkaW9UeXBlXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGF1ZGlvVHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIEF1ZGlvIG9yIEhUTUw1QXVkaW8gZmlsZSwgb3IgYXJyYXkgb2YgYXVkaW8gZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmF1ZGlvKCd0aXRsZScsIFsgJ211c2ljL1RpdGxlLm9nZycsICdtdXNpYy9UaXRsZS5tcDMnLCAnbXVzaWMvVGl0bGUubTRhJyBdKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nLiBJdCBpcyB1c2VkIHRvIGFkZCB0aGUgZmlsZSB0byB0aGUgZ2xvYmFsIEF1ZGlvIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBBdWRpbyBDYWNoZS5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIEF1ZGlvIENhY2hlIGZpcnN0LCBiZWZvcmUgbG9hZGluZyBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF1ZGlvKHtcclxuICogICAgIGtleTogJ3RpdGxlJyxcclxuICogICAgIHVybDogWyAnbXVzaWMvVGl0bGUub2dnJywgJ211c2ljL1RpdGxlLm1wMycsICdtdXNpYy9UaXRsZS5tNGEnIF1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdWRpb0ZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIFRoZSBVUkxzIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTHMgYXJlIHJlbGF0aXZlIHRoZSBgTG9hZGVyLmJhc2VVUkxgIGFuZCBgTG9hZGVyLnBhdGhgIHZhbHVlcyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGVtLlxyXG4gKlxyXG4gKiBEdWUgdG8gZGlmZmVyZW50IGJyb3dzZXJzIHN1cHBvcnRpbmcgZGlmZmVyZW50IGF1ZGlvIGZpbGUgdHlwZXMgeW91IHNob3VsZCB1c3VhbGx5IHByb3ZpZGUgeW91ciBhdWRpbyBmaWxlcyBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cy5cclxuICogb2dnLCBtcDMgYW5kIG00YSBhcmUgdGhlIG1vc3QgY29tbW9uLiBJZiB5b3UgcHJvdmlkZSBhbiBhcnJheSBvZiBVUkxzIHRoZW4gdGhlIExvYWRlciB3aWxsIGRldGVybWluZSB3aGljaCBfb25lXyBmaWxlIHRvIGxvYWQgYmFzZWQgb25cclxuICogYnJvd3NlciBzdXBwb3J0LlxyXG4gKlxyXG4gKiBJZiBhdWRpbyBoYXMgYmVlbiBkaXNhYmxlZCBpbiB5b3VyIGdhbWUsIGVpdGhlciB2aWEgdGhlIGdhbWUgY29uZmlnLCBvciBsYWNrIG9mIHN1cHBvcnQgZnJvbSB0aGUgZGV2aWNlLCB0aGVuIG5vIGF1ZGlvIHdpbGwgYmUgbG9hZGVkLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIEF1ZGlvIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F1ZGlvXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdWRpb0ZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9GaWxlQ29uZmlnW10pfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFycmF5IG9mIHRoZW0uXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IFt1cmxzXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgYXVkaW8gZmlsZXMgZnJvbS5cclxuICogQHBhcmFtIHthbnl9IFtjb25maWddIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gYGluc3RhbmNlc2AgcHJvcGVydHkgZm9yIEhUTUw1QXVkaW8uIERlZmF1bHRzIHRvIDEuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ2F1ZGlvJywgZnVuY3Rpb24gKGtleSwgdXJscywgY29uZmlnLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgdmFyIGdhbWUgPSB0aGlzLnN5c3RlbXMuZ2FtZTtcclxuICAgIHZhciBhdWRpb0NvbmZpZyA9IGdhbWUuY29uZmlnLmF1ZGlvO1xyXG4gICAgdmFyIGRldmljZUF1ZGlvID0gZ2FtZS5kZXZpY2UuYXVkaW87XHJcblxyXG4gICAgaWYgKChhdWRpb0NvbmZpZyAmJiBhdWRpb0NvbmZpZy5ub0F1ZGlvKSB8fCAoIWRldmljZUF1ZGlvLndlYkF1ZGlvICYmICFkZXZpY2VBdWRpby5hdWRpb0RhdGEpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBTb3VuZHMgYXJlIGRpc2FibGVkLCBzbyBza2lwIGxvYWRpbmcgYXVkaW9cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICB2YXIgYXVkaW9GaWxlO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgYXVkaW9GaWxlID0gQXVkaW9GaWxlLmNyZWF0ZSh0aGlzLCBrZXlbaV0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF1ZGlvRmlsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlKGF1ZGlvRmlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgYXVkaW9GaWxlID0gQXVkaW9GaWxlLmNyZWF0ZSh0aGlzLCBrZXksIHVybHMsIGNvbmZpZywgeGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICBpZiAoYXVkaW9GaWxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKGF1ZGlvRmlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQXVkaW9GaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBdWRpb0ZpbGUgPSByZXF1aXJlKCcuL0F1ZGlvRmlsZS5qcycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG52YXIgSlNPTkZpbGUgPSByZXF1aXJlKCcuL0pTT05GaWxlLmpzJyk7XHJcbnZhciBNdWx0aUZpbGUgPSByZXF1aXJlKCcuLi9NdWx0aUZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEFuIEF1ZGlvIFNwcml0ZSBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYXVkaW9TcHJpdGUgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F1ZGlvU3ByaXRlLlxyXG4gKlxyXG4gKiBAY2xhc3MgQXVkaW9TcHJpdGVGaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9TcHJpdGVGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ganNvblVSTCAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUganNvbiBmaWxlIGZyb20uIE9yIGEgd2VsbCBmb3JtZWQgSlNPTiBvYmplY3QgdG8gdXNlIGluc3RlYWQuXHJcbiAqIEBwYXJhbSB7eyhzdHJpbmd8c3RyaW5nW10pfX0gW2F1ZGlvVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgYXVkaW8gZmlsZSBmcm9tLiBJZiBlbXB0eSBpdCB3aWxsIGJlIG9idGFpbmVkIGJ5IHBhcnNpbmcgdGhlIEpTT04gZmlsZS5cclxuICogQHBhcmFtIHthbnl9IFthdWRpb0NvbmZpZ10gLSBUaGUgYXVkaW8gY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFthdWRpb1hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF1ZGlvIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW2pzb25YaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBqc29uIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqL1xyXG52YXIgQXVkaW9TcHJpdGVGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBNdWx0aUZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBBdWRpb1Nwcml0ZUZpbGUgKGxvYWRlciwga2V5LCBqc29uVVJMLCBhdWRpb1VSTCwgYXVkaW9Db25maWcsIGF1ZGlvWGhyU2V0dGluZ3MsIGpzb25YaHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAganNvblVSTCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdqc29uVVJMJyk7XHJcbiAgICAgICAgICAgIGF1ZGlvVVJMID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2F1ZGlvVVJMJyk7XHJcbiAgICAgICAgICAgIGF1ZGlvQ29uZmlnID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2F1ZGlvQ29uZmlnJyk7XHJcbiAgICAgICAgICAgIGF1ZGlvWGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXVkaW9YaHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBqc29uWGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnanNvblhoclNldHRpbmdzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGF0YTtcclxuXHJcbiAgICAgICAgLy8gIE5vIHVybD8gdGhlbiB3ZSdyZSBnb2luZyB0byBkbyBhIGpzb24gbG9hZCBhbmQgcGFyc2UgaXQgZnJvbSB0aGF0XHJcbiAgICAgICAgaWYgKCFhdWRpb1VSTClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgSlNPTkZpbGUobG9hZGVyLCBrZXksIGpzb25VUkwsIGpzb25YaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgICBNdWx0aUZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsICdhdWRpb3Nwcml0ZScsIGtleSwgWyBkYXRhIF0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25maWcucmVzb3VyY2VMb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXVkaW9Db25maWcgPSBhdWRpb0NvbmZpZztcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXVkaW9YaHJTZXR0aW5ncyA9IGF1ZGlvWGhyU2V0dGluZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhdWRpbyA9IEF1ZGlvRmlsZS5jcmVhdGUobG9hZGVyLCBrZXksIGF1ZGlvVVJMLCBhdWRpb0NvbmZpZywgYXVkaW9YaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXVkaW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgSlNPTkZpbGUobG9hZGVyLCBrZXksIGpzb25VUkwsIGpzb25YaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgICAgICAgTXVsdGlGaWxlLmNhbGwodGhpcywgbG9hZGVyLCAnYXVkaW9zcHJpdGUnLCBrZXksIFsgYXVkaW8sIGRhdGEgXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcucmVzb3VyY2VMb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGJ5IGVhY2ggRmlsZSB3aGVuIGl0IGZpbmlzaGVzIGxvYWRpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5BdWRpb1Nwcml0ZUZpbGUjb25GaWxlQ29tcGxldGVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5GaWxlfSBmaWxlIC0gVGhlIEZpbGUgdGhhdCBoYXMgY29tcGxldGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKi9cclxuICAgIG9uRmlsZUNvbXBsZXRlOiBmdW5jdGlvbiAoZmlsZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoZmlsZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmctLTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5yZXNvdXJjZUxvYWQgJiYgZmlsZS50eXBlID09PSAnanNvbicgJiYgZmlsZS5kYXRhLmhhc093blByb3BlcnR5KCdyZXNvdXJjZXMnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEluc3BlY3QgdGhlIGRhdGEgZm9yIHRoZSBmaWxlcyB0byBub3cgbG9hZFxyXG4gICAgICAgICAgICAgICAgdmFyIHVybHMgPSBmaWxlLmRhdGEucmVzb3VyY2VzO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBhdWRpb0NvbmZpZyA9IEdldEZhc3RWYWx1ZSh0aGlzLmNvbmZpZywgJ2F1ZGlvQ29uZmlnJyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXVkaW9YaHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZSh0aGlzLmNvbmZpZywgJ2F1ZGlvWGhyU2V0dGluZ3MnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgYXVkaW8gPSBBdWRpb0ZpbGUuY3JlYXRlKHRoaXMubG9hZGVyLCBmaWxlLmtleSwgdXJscywgYXVkaW9Db25maWcsIGF1ZGlvWGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdWRpbylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvTXVsdGlGaWxlKGF1ZGlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZXIuYWRkRmlsZShhdWRpbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkF1ZGlvU3ByaXRlRmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5VG9Qcm9jZXNzKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZmlsZUEgPSB0aGlzLmZpbGVzWzBdO1xyXG4gICAgICAgICAgICB2YXIgZmlsZUIgPSB0aGlzLmZpbGVzWzFdO1xyXG5cclxuICAgICAgICAgICAgZmlsZUEuYWRkVG9DYWNoZSgpO1xyXG4gICAgICAgICAgICBmaWxlQi5hZGRUb0NhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgSlNPTiBiYXNlZCBBdWRpbyBTcHJpdGUsIG9yIGFycmF5IG9mIGF1ZGlvIHNwcml0ZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmF1ZGlvU3ByaXRlKCdreW9iaScsICdreW9iaS5qc29uJywgW1xyXG4gKiAgICAgICAgICdreW9iaS5vZ2cnLFxyXG4gKiAgICAgICAgICdreW9iaS5tcDMnLFxyXG4gKiAgICAgICAgICdreW9iaS5tNGEnXHJcbiAqICAgICBdKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQXVkaW8gU3ByaXRlcyBhcmUgYSBjb21iaW5hdGlvbiBvZiBhdWRpbyBmaWxlcyBhbmQgYSBKU09OIGNvbmZpZ3VyYXRpb24uXHJcbiAqIFRoZSBKU09OIGZvbGxvd3MgdGhlIGZvcm1hdCBvZiB0aGF0IGNyZWF0ZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL3RvbmlzdGlpZ2kvYXVkaW9zcHJpdGVcclxuICpcclxuICogSWYgdGhlIEpTT04gZmlsZSBpbmNsdWRlcyBhICdyZXNvdXJjZScgb2JqZWN0IHRoZW4geW91IGNhbiBsZXQgUGhhc2VyIHBhcnNlIGl0IGFuZCBsb2FkIHRoZSBhdWRpb1xyXG4gKiBmaWxlcyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIGl0cyBjb250ZW50LiBUbyBkbyB0aGlzIGV4Y2x1ZGUgdGhlIGF1ZGlvIFVSTHMgZnJvbSB0aGUgbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5hdWRpb1Nwcml0ZSgna3lvYmknLCAna3lvYmkuanNvbicpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBjYWxsIHRoaXMgZnJvbSBvdXRzaWRlIG9mIGBwcmVsb2FkYCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHN0YXJ0aW5nIHRoZSBMb2FkZXIgYWZ0ZXJ3YXJkcyBhbmQgbW9uaXRvcmluZ1xyXG4gKiBpdHMgZXZlbnRzIHRvIGtub3cgd2hlbiBpdCdzIHNhZmUgdG8gdXNlIHRoZSBhc3NldC4gUGxlYXNlIHNlZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4gY2xhc3MgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBBdWRpbyBDYWNoZSB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgQXVkaW8gQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBBdWRpbyBDYWNoZSBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5hdWRpb1Nwcml0ZSh7XHJcbiAqICAgICBrZXk6ICdreW9iaScsXHJcbiAqICAgICBqc29uVVJMOiAnYXVkaW8vS3lvYmkuanNvbicsXHJcbiAqICAgICBhdWRpb1VSTDogW1xyXG4gKiAgICAgICAgICdhdWRpby9LeW9iaS5vZ2cnLFxyXG4gKiAgICAgICAgICdhdWRpby9LeW9iaS5tcDMnLFxyXG4gKiAgICAgICAgICdhdWRpby9LeW9iaS5tNGEnXHJcbiAqICAgICBdXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9TcHJpdGVGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBVUkwgZm9yIHRoZSBhdWRpbyBKU09OIGRhdGEgeW91IGNhbiBhbHNvIHBhc3MgaW4gYSB3ZWxsIGZvcm1lZCBKU09OIG9iamVjdCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBhdWRpbyBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIHVzZSBpdCBjcmVhdGUgYW4gQXVkaW8gU3ByaXRlIGJ5IHJlZmVyZW5jaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF1ZGlvU3ByaXRlKCdreW9iaScsICdreW9iaS5qc29uJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkQXVkaW9TcHJpdGUoJ2t5b2JpJyk7XHJcbiAqIG11c2ljLnBsYXkoJ3RpdGxlJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTUVOVS5gIGFuZCB0aGUga2V5IHdhcyBgQmFja2dyb3VuZGAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBNRU5VLkJhY2tncm91bmRgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgaW1hZ2UgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIER1ZSB0byBkaWZmZXJlbnQgYnJvd3NlcnMgc3VwcG9ydGluZyBkaWZmZXJlbnQgYXVkaW8gZmlsZSB0eXBlcyB5b3Ugc2hvdWxkIHVzdWFsbHkgcHJvdmlkZSB5b3VyIGF1ZGlvIGZpbGVzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzLlxyXG4gKiBvZ2csIG1wMyBhbmQgbTRhIGFyZSB0aGUgbW9zdCBjb21tb24uIElmIHlvdSBwcm92aWRlIGFuIGFycmF5IG9mIFVSTHMgdGhlbiB0aGUgTG9hZGVyIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIF9vbmVfIGZpbGUgdG8gbG9hZCBiYXNlZCBvblxyXG4gKiBicm93c2VyIHN1cHBvcnQuXHJcbiAqXHJcbiAqIElmIGF1ZGlvIGhhcyBiZWVuIGRpc2FibGVkIGluIHlvdXIgZ2FtZSwgZWl0aGVyIHZpYSB0aGUgZ2FtZSBjb25maWcsIG9yIGxhY2sgb2Ygc3VwcG9ydCBmcm9tIHRoZSBkZXZpY2UsIHRoZW4gbm8gYXVkaW8gd2lsbCBiZSBsb2FkZWQuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQXVkaW8gU3ByaXRlIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F1ZGlvU3ByaXRlXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5BdWRpb1Nwcml0ZUZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9TcHJpdGVGaWxlQ29uZmlnW10pfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFuIGFycmF5IG9mIG9iamVjdHMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBqc29uVVJMIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSBqc29uIGZpbGUgZnJvbS4gT3IgYSB3ZWxsIGZvcm1lZCBKU09OIG9iamVjdCB0byB1c2UgaW5zdGVhZC5cclxuICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0gW2F1ZGlvVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgYXVkaW8gZmlsZSBmcm9tLiBJZiBlbXB0eSBpdCB3aWxsIGJlIG9idGFpbmVkIGJ5IHBhcnNpbmcgdGhlIEpTT04gZmlsZS5cclxuICogQHBhcmFtIHthbnl9IFthdWRpb0NvbmZpZ10gLSBUaGUgYXVkaW8gY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFthdWRpb1hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF1ZGlvIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW2pzb25YaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBqc29uIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdhdWRpb1Nwcml0ZScsIGZ1bmN0aW9uIChrZXksIGpzb25VUkwsIGF1ZGlvVVJMLCBhdWRpb0NvbmZpZywgYXVkaW9YaHJTZXR0aW5ncywganNvblhoclNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgZ2FtZSA9IHRoaXMuc3lzdGVtcy5nYW1lO1xyXG4gICAgdmFyIGdhbWVBdWRpb0NvbmZpZyA9IGdhbWUuY29uZmlnLmF1ZGlvO1xyXG4gICAgdmFyIGRldmljZUF1ZGlvID0gZ2FtZS5kZXZpY2UuYXVkaW87XHJcblxyXG4gICAgaWYgKChnYW1lQXVkaW9Db25maWcgJiYgZ2FtZUF1ZGlvQ29uZmlnLm5vQXVkaW8pIHx8ICghZGV2aWNlQXVkaW8ud2ViQXVkaW8gJiYgIWRldmljZUF1ZGlvLmF1ZGlvRGF0YSkpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFNvdW5kcyBhcmUgZGlzYWJsZWQsIHNvIHNraXAgbG9hZGluZyBhdWRpb1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBtdWx0aWZpbGU7XHJcblxyXG4gICAgLy8gIFN1cHBvcnRzIGFuIE9iamVjdCBmaWxlIGRlZmluaXRpb24gaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGEgc2luZ2xlIGVudHJ5IHdoZXJlIGFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIGRlZmluZWRcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbXVsdGlmaWxlID0gbmV3IEF1ZGlvU3ByaXRlRmlsZSh0aGlzLCBrZXlbaV0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG11bHRpZmlsZS5maWxlcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG11bHRpZmlsZS5maWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgbXVsdGlmaWxlID0gbmV3IEF1ZGlvU3ByaXRlRmlsZSh0aGlzLCBrZXksIGpzb25VUkwsIGF1ZGlvVVJMLCBhdWRpb0NvbmZpZywgYXVkaW9YaHJTZXR0aW5ncywganNvblhoclNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgaWYgKG11bHRpZmlsZS5maWxlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBCaW5hcnkgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2JpbmFyeSBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYmluYXJ5LlxyXG4gKlxyXG4gKiBAY2xhc3MgQmluYXJ5RmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5CaW5hcnlGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LmJpbmAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmJpblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7YW55fSBbZGF0YVR5cGVdIC0gT3B0aW9uYWwgdHlwZSB0byBjYXN0IHRoZSBiaW5hcnkgZmlsZSB0byBvbmNlIGxvYWRlZC4gRm9yIGV4YW1wbGUsIGBVaW50OEFycmF5YC5cclxuICovXHJcbnZhciBCaW5hcnlGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQmluYXJ5RmlsZSAobG9hZGVyLCBrZXksIHVybCwgeGhyU2V0dGluZ3MsIGRhdGFUeXBlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnYmluJztcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2V4dGVuc2lvbicsIGV4dGVuc2lvbik7XHJcbiAgICAgICAgICAgIGRhdGFUeXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RhdGFUeXBlJywgZGF0YVR5cGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdiaW5hcnknLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLmNhY2hlTWFuYWdlci5iaW5hcnksXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3M6IHhoclNldHRpbmdzLFxyXG4gICAgICAgICAgICBjb25maWc6IHsgZGF0YVR5cGU6IGRhdGFUeXBlIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5CaW5hcnlGaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB2YXIgY3RvciA9IHRoaXMuY29uZmlnLmRhdGFUeXBlO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSAoY3RvcikgPyBuZXcgY3Rvcih0aGlzLnhockxvYWRlci5yZXNwb25zZSkgOiB0aGlzLnhockxvYWRlci5yZXNwb25zZTtcclxuXHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhIEJpbmFyeSBmaWxlLCBvciBhcnJheSBvZiBCaW5hcnkgZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmJpbmFyeSgnZG9vbScsICdmaWxlcy9Eb29tLndhZCcpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgQmluYXJ5IENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBCaW5hcnkgQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBCaW5hcnkgQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuYmluYXJ5KHtcclxuICogICAgIGtleTogJ2Rvb20nLFxyXG4gKiAgICAgdXJsOiAnZmlsZXMvRG9vbS53YWQnLFxyXG4gKiAgICAgZGF0YVR5cGU6IFVpbnQ4QXJyYXlcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5CaW5hcnlGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmJpbmFyeSgnZG9vbScsICdmaWxlcy9Eb29tLndhZCcpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgZGF0YSA9IHRoaXMuY2FjaGUuYmluYXJ5LmdldCgnZG9vbScpO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYExFVkVMMS5gIGFuZCB0aGUga2V5IHdhcyBgRGF0YWAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuRGF0YWAgYW5kXHJcbiAqIHRoaXMgaXMgd2hhdCB5b3Ugd291bGQgdXNlIHRvIHJldHJpZXZlIHRoZSB0ZXh0IGZyb20gdGhlIEJpbmFyeSBDYWNoZS5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJkb29tXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImRvb20uYmluXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmJpbmAgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQmluYXJ5IEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2JpbmFyeVxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQmluYXJ5RmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5CaW5hcnlGaWxlQ29uZmlnW10pfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFycmF5IG9mIHRoZW0uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uYmluYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uYmluXCIuXHJcbiAqIEBwYXJhbSB7YW55fSBbZGF0YVR5cGVdIC0gT3B0aW9uYWwgdHlwZSB0byBjYXN0IHRoZSBiaW5hcnkgZmlsZSB0byBvbmNlIGxvYWRlZC4gRm9yIGV4YW1wbGUsIGBVaW50OEFycmF5YC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcignYmluYXJ5JywgZnVuY3Rpb24gKGtleSwgdXJsLCBkYXRhVHlwZSwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBCaW5hcnlGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEJpbmFyeUZpbGUodGhpcywga2V5LCB1cmwsIHhoclNldHRpbmdzLCBkYXRhVHlwZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmluYXJ5RmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIEltYWdlRmlsZSA9IHJlcXVpcmUoJy4vSW1hZ2VGaWxlLmpzJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxudmFyIE11bHRpRmlsZSA9IHJlcXVpcmUoJy4uL011bHRpRmlsZS5qcycpO1xyXG52YXIgUGFyc2VYTUxCaXRtYXBGb250ID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvYml0bWFwdGV4dC9QYXJzZVhNTEJpdG1hcEZvbnQuanMnKTtcclxudmFyIFhNTEZpbGUgPSByZXF1aXJlKCcuL1hNTEZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIEJpdG1hcCBGb250IGJhc2VkIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNiaXRtYXBGb250IG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNiaXRtYXBGb250LlxyXG4gKlxyXG4gKiBAY2xhc3MgQml0bWFwRm9udEZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5NdWx0aUZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5CaXRtYXBGb250RmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt0ZXh0dXJlVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgZm9udCBpbWFnZSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnBuZ2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnBuZ1wiLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZvbnREYXRhVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgZm9udCB4bWwgZGF0YSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnhtbGAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnhtbFwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt0ZXh0dXJlWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZm9udCBpbWFnZSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFtmb250RGF0YVhoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGZvbnQgZGF0YSB4bWwgZmlsZS4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICovXHJcbnZhciBCaXRtYXBGb250RmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogTXVsdGlGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQml0bWFwRm9udEZpbGUgKGxvYWRlciwga2V5LCB0ZXh0dXJlVVJMLCBmb250RGF0YVVSTCwgdGV4dHVyZVhoclNldHRpbmdzLCBmb250RGF0YVhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbWFnZTtcclxuICAgICAgICB2YXIgZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcblxyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVybDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVVUkwnKSxcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbjogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVFeHRlbnNpb24nLCAncG5nJyksXHJcbiAgICAgICAgICAgICAgICBub3JtYWxNYXA6IEdldEZhc3RWYWx1ZShjb25maWcsICdub3JtYWxNYXAnKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGV4dHVyZVhoclNldHRpbmdzJylcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBkYXRhID0gbmV3IFhNTEZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVybDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2ZvbnREYXRhVVJMJyksXHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IEdldEZhc3RWYWx1ZShjb25maWcsICdmb250RGF0YUV4dGVuc2lvbicsICd4bWwnKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZm9udERhdGFYaHJTZXR0aW5ncycpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCBrZXksIHRleHR1cmVVUkwsIHRleHR1cmVYaHJTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgWE1MRmlsZShsb2FkZXIsIGtleSwgZm9udERhdGFVUkwsIGZvbnREYXRhWGhyU2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGltYWdlLmxpbmtGaWxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEltYWdlIGhhcyBhIG5vcm1hbCBtYXBcclxuICAgICAgICAgICAgTXVsdGlGaWxlLmNhbGwodGhpcywgbG9hZGVyLCAnYml0bWFwZm9udCcsIGtleSwgWyBpbWFnZSwgZGF0YSwgaW1hZ2UubGlua0ZpbGUgXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ2JpdG1hcGZvbnQnLCBrZXksIFsgaW1hZ2UsIGRhdGEgXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5CaXRtYXBGb250RmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5VG9Qcm9jZXNzKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW1hZ2UgPSB0aGlzLmZpbGVzWzBdO1xyXG4gICAgICAgICAgICB2YXIgeG1sID0gdGhpcy5maWxlc1sxXTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlLmFkZFRvQ2FjaGUoKTtcclxuICAgICAgICAgICAgeG1sLmFkZFRvQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyLmNhY2hlTWFuYWdlci5iaXRtYXBGb250LmFkZChpbWFnZS5rZXksIHsgZGF0YTogUGFyc2VYTUxCaXRtYXBGb250KHhtbC5kYXRhKSwgdGV4dHVyZTogaW1hZ2Uua2V5LCBmcmFtZTogbnVsbCB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gWE1MIGJhc2VkIEJpdG1hcCBGb250LCBvciBhcnJheSBvZiBmb250cywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcblxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmJpdG1hcEZvbnQoJ2dvbGRlbkZvbnQnLCAnaW1hZ2VzL0dvbGRGb250LnBuZycsICdpbWFnZXMvR29sZEZvbnQueG1sJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogSWYgeW91IGNhbGwgdGhpcyBmcm9tIG91dHNpZGUgb2YgYHByZWxvYWRgIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdGhlIExvYWRlciBhZnRlcndhcmRzIGFuZCBtb25pdG9yaW5nXHJcbiAqIGl0cyBldmVudHMgdG8ga25vdyB3aGVuIGl0J3Mgc2FmZSB0byB1c2UgdGhlIGFzc2V0LiBQbGVhc2Ugc2VlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiBjbGFzcyBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBQaGFzZXIgZXhwZWN0cyB0aGUgZm9udCBkYXRhIHRvIGJlIHByb3ZpZGVkIGluIGFuIFhNTCBmaWxlIGZvcm1hdC5cclxuICogVGhlc2UgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgc29mdHdhcmUgc3VjaCBhcyB0aGUgW0FuZ2VsY29kZSBCaXRtYXAgRm9udCBHZW5lcmF0b3JdKGh0dHA6Ly93d3cuYW5nZWxjb2RlLmNvbS9wcm9kdWN0cy9ibWZvbnQvKSxcclxuICogW0xpdHRlcmFdKGh0dHA6Ly9rdmF6YXJzLmNvbS9saXR0ZXJhLykgb3IgW0dseXBoIERlc2lnbmVyXShodHRwczovLzcxc3F1YXJlZC5jb20vZ2x5cGhkZXNpZ25lcilcclxuICpcclxuICogUGhhc2VyIGNhbiBsb2FkIGFsbCBjb21tb24gaW1hZ2UgdHlwZXM6IHBuZywganBnLCBnaWYgYW5kIGFueSBvdGhlciBmb3JtYXQgdGhlIGJyb3dzZXIgY2FuIG5hdGl2ZWx5IGhhbmRsZS5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5iaXRtYXBGb250KHtcclxuICogICAgIGtleTogJ2dvbGRlbkZvbnQnLFxyXG4gKiAgICAgdGV4dHVyZVVSTDogJ2ltYWdlcy9Hb2xkRm9udC5wbmcnLFxyXG4gKiAgICAgZm9udERhdGFVUkw6ICdpbWFnZXMvR29sZEZvbnQueG1sJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkJpdG1hcEZvbnRGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBhdGxhcyBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIHVzZSBrZXkgb2YgaXQgd2hlbiBjcmVhdGluZyBhIEJpdG1hcCBUZXh0IEdhbWUgT2JqZWN0OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5iaXRtYXBGb250KCdnb2xkZW5Gb250JywgJ2ltYWdlcy9Hb2xkRm9udC5wbmcnLCAnaW1hZ2VzL0dvbGRGb250LnhtbCcpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLmFkZC5iaXRtYXBUZXh0KHgsIHksICdnb2xkZW5Gb250JywgJ0hlbGxvIFdvcmxkJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTUVOVS5gIGFuZCB0aGUga2V5IHdhcyBgQmFja2dyb3VuZGAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBNRU5VLkJhY2tncm91bmRgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB3aGVuIGNyZWF0aW5nIGEgQml0bWFwIFRleHQgb2JqZWN0LlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLnBuZ1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5wbmdgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBQaGFzZXIgYWxzbyBzdXBwb3J0cyB0aGUgYXV0b21hdGljIGxvYWRpbmcgb2YgYXNzb2NpYXRlZCBub3JtYWwgbWFwcy4gSWYgeW91IGhhdmUgYSBub3JtYWwgbWFwIHRvIGdvIHdpdGggdGhpcyBpbWFnZSxcclxuICogdGhlbiB5b3UgY2FuIHNwZWNpZnkgaXQgYnkgcHJvdmlkaW5nIGFuIGFycmF5IGFzIHRoZSBgdXJsYCB3aGVyZSB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIG5vcm1hbCBtYXA6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmJpdG1hcEZvbnQoJ2dvbGRlbkZvbnQnLCBbICdpbWFnZXMvR29sZEZvbnQucG5nJywgJ2ltYWdlcy9Hb2xkRm9udC1uLnBuZycgXSwgJ2ltYWdlcy9Hb2xkRm9udC54bWwnKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE9yLCBpZiB5b3UgYXJlIHVzaW5nIGEgY29uZmlnIG9iamVjdCB1c2UgdGhlIGBub3JtYWxNYXBgIHByb3BlcnR5OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5iaXRtYXBGb250KHtcclxuICogICAgIGtleTogJ2dvbGRlbkZvbnQnLFxyXG4gKiAgICAgdGV4dHVyZVVSTDogJ2ltYWdlcy9Hb2xkRm9udC5wbmcnLFxyXG4gKiAgICAgbm9ybWFsTWFwOiAnaW1hZ2VzL0dvbGRGb250LW4ucG5nJyxcclxuICogICAgIGZvbnREYXRhVVJMOiAnaW1hZ2VzL0dvbGRGb250LnhtbCdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgbm9ybWFsIG1hcCBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgY29uZGl0aW9ucyBhcyB0aGUgaW1hZ2UgZmlsZSB3aXRoIHJlZ2FyZCB0byB0aGUgcGF0aCwgYmFzZVVSTCwgQ09ScyBhbmQgWEhSIFNldHRpbmdzLlxyXG4gKiBOb3JtYWwgbWFwcyBhcmUgYSBXZWJHTCBvbmx5IGZlYXR1cmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgQml0bWFwIEZvbnQgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jYml0bWFwRm9udFxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQml0bWFwRm9udEZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQml0bWFwRm9udEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt0ZXh0dXJlVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgZm9udCBpbWFnZSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnBuZ2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnBuZ1wiLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZvbnREYXRhVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgZm9udCB4bWwgZGF0YSBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnhtbGAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnhtbFwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt0ZXh0dXJlWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZm9udCBpbWFnZSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFtmb250RGF0YVhoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGZvbnQgZGF0YSB4bWwgZmlsZS4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ2JpdG1hcEZvbnQnLCBmdW5jdGlvbiAoa2V5LCB0ZXh0dXJlVVJMLCBmb250RGF0YVVSTCwgdGV4dHVyZVhoclNldHRpbmdzLCBmb250RGF0YVhoclNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgbXVsdGlmaWxlO1xyXG5cclxuICAgIC8vICBTdXBwb3J0cyBhbiBPYmplY3QgZmlsZSBkZWZpbml0aW9uIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhbiBhcnJheSBvZiBvYmplY3RzIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhIHNpbmdsZSBlbnRyeSB3aGVyZSBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBkZWZpbmVkXHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG11bHRpZmlsZSA9IG5ldyBCaXRtYXBGb250RmlsZSh0aGlzLCBrZXlbaV0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG11bHRpZmlsZS5maWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIG11bHRpZmlsZSA9IG5ldyBCaXRtYXBGb250RmlsZSh0aGlzLCBrZXksIHRleHR1cmVVUkwsIGZvbnREYXRhVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MsIGZvbnREYXRhWGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEZpbGUobXVsdGlmaWxlLmZpbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJpdG1hcEZvbnRGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgQ1NTIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNjc3MgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2Nzcy5cclxuICpcclxuICogQGNsYXNzIENTU0ZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkNTU0ZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uanNgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc1wiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgQ1NTRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRmlsZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENTU0ZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnY3NzJztcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2V4dGVuc2lvbicsIGV4dGVuc2lvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlsZUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ3NjcmlwdCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5nc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsIGZpbGVDb25maWcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkNTU0ZpbGUjb25Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICAgIHRoaXMuZGF0YS5kZWZlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZGF0YS5pbm5lckhUTUwgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhIENTUyBmaWxlLCBvciBhcnJheSBvZiBDU1MgZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLmNzcygnaGVhZGVycycsICdzdHlsZXMvaGVhZGVycy5jc3MnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nIGFuZCBub3QgYWxyZWFkeSBpbi11c2UgYnkgYW5vdGhlciBmaWxlIGluIHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmNzcyh7XHJcbiAqICAgICBrZXk6ICdoZWFkZXJzJyxcclxuICogICAgIHVybDogJ3N0eWxlcy9oZWFkZXJzLmNzcydcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5DU1NGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIHN0eWxlIERPTSBlbGVtZW50XHJcbiAqIHZpYSBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKWAuIEl0IHdpbGwgaGF2ZSBpdHMgYGRlZmVyYCBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UgYW5kIHRoZW4gdGhlXHJcbiAqIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWQgdG8gYGRvY3VtZW50LmhlYWRgLiBUaGUgQ1NTIHN0eWxlcyBhcmUgdGhlbiBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLmNzc1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5jc3NgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIENTUyBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNjc3NcclxuICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI0FERFxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5DU1NGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkNTU0ZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5jc3NgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5jc3NcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcignY3NzJywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IENTU0ZpbGUodGhpcywga2V5W2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsZShuZXcgQ1NTRmlsZSh0aGlzLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENTU0ZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBTaGFkZXIgPSByZXF1aXJlKCcuLi8uLi9kaXNwbGF5L3NoYWRlci9CYXNlU2hhZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBHTFNMIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNnbHNsIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNnbHNsLlxyXG4gKlxyXG4gKiBAY2xhc3MgR0xTTEZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuR0xTTEZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4udHh0YCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4udHh0XCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2hhZGVyVHlwZT0nZnJhZ21lbnQnXSAtIFRoZSB0eXBlIG9mIHNoYWRlci4gRWl0aGVyIGBmcmFnbWVudGAgZm9yIGEgZnJhZ21lbnQgc2hhZGVyLCBvciBgdmVydGV4YCBmb3IgYSB2ZXJ0ZXggc2hhZGVyLiBUaGlzIGlzIGlnbm9yZWQgaWYgeW91IGxvYWQgYSBzaGFkZXIgYnVuZGxlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgR0xTTEZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBHTFNMRmlsZSAobG9hZGVyLCBrZXksIHVybCwgc2hhZGVyVHlwZSwgeGhyU2V0dGluZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV4dGVuc2lvbiA9ICdnbHNsJztcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgc2hhZGVyVHlwZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdzaGFkZXJUeXBlJywgJ2ZyYWdtZW50Jyk7XHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3hoclNldHRpbmdzJyk7XHJcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IEdldEZhc3RWYWx1ZShjb25maWcsICdleHRlbnNpb24nLCBleHRlbnNpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzaGFkZXJUeXBlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzaGFkZXJUeXBlID0gJ2ZyYWdtZW50JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnZ2xzbCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBsb2FkZXIuY2FjaGVNYW5hZ2VyLnNoYWRlcixcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgc2hhZGVyVHlwZTogc2hhZGVyVHlwZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3NcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5HTFNMRmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy54aHJMb2FkZXIucmVzcG9uc2VUZXh0O1xyXG5cclxuICAgICAgICB0aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkdMU0xGaWxlI2FkZFRvQ2FjaGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YS5zcGxpdCgnXFxuJyk7XHJcblxyXG4gICAgICAgIC8vICBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIHNoYWRlciBidW5kbGUsIG9yIHJhdyBnbHNsIGZpbGUuXHJcbiAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5leHRyYWN0QmxvY2soZGF0YSwgMCk7XHJcblxyXG4gICAgICAgIGlmIChibG9jaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdoaWxlIChibG9jaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0U2hhZGVyTmFtZShibG9jay5oZWFkZXIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNoYWRlclR5cGUgPSB0aGlzLmdldFNoYWRlclR5cGUoYmxvY2suaGVhZGVyKTtcclxuICAgICAgICAgICAgICAgIHZhciB1bmlmb3JtcyA9IHRoaXMuZ2V0U2hhZGVyVW5pZm9ybXMoYmxvY2suaGVhZGVyKTtcclxuICAgICAgICAgICAgICAgIHZhciBzaGFkZXJTcmMgPSBibG9jay5zaGFkZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKGtleSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNoYWRlciA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGFkZXJUeXBlID09PSAnZnJhZ21lbnQnKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U3JjID0gc2hhZGVyU3JjO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXIudmVydGV4U3JjID0gc2hhZGVyU3JjO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFkZXIudW5pZm9ybXMpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXIudW5pZm9ybXMgPSB1bmlmb3JtcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFkZXJUeXBlID09PSAnZnJhZ21lbnQnKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuYWRkKGtleSwgbmV3IFNoYWRlcihrZXksIHNoYWRlclNyYywgJycsIHVuaWZvcm1zKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5hZGQoa2V5LCBuZXcgU2hhZGVyKGtleSwgJycsIHNoYWRlclNyYywgdW5pZm9ybXMpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuZXh0cmFjdEJsb2NrKGRhdGEsIGJsb2NrLm9mZnNldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb25maWcuc2hhZGVyVHlwZSA9PT0gJ2ZyYWdtZW50JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBTaW5nbGUgc2hhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuYWRkKHRoaXMua2V5LCBuZXcgU2hhZGVyKHRoaXMua2V5LCB0aGlzLmRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZS5hZGQodGhpcy5rZXksIG5ldyBTaGFkZXIodGhpcy5rZXksICcnLCB0aGlzLmRhdGEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3koKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgZnJvbSB0aGUgaGVhZGVyIGJsb2NrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuR0xTTEZpbGUjZ2V0U2hhZGVyTmFtZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlclNvdXJjZSAtIFRoZSBoZWFkZXIgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzaGFkZXIgbmFtZS5cclxuICAgICAqL1xyXG4gICAgZ2V0U2hhZGVyTmFtZTogZnVuY3Rpb24gKGhlYWRlclNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlclNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gaGVhZGVyU291cmNlW2ldLnRyaW0oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lLnN1YnN0cmluZygwLCA1KSA9PT0gJ25hbWU6JylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKDUpLnRyaW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHNoYWRlciBmcm9tIHRoZSBoZWFkZXIgYmxvY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5HTFNMRmlsZSNnZXRTaGFkZXJUeXBlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaGVhZGVyU291cmNlIC0gVGhlIGhlYWRlciBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNoYWRlciB0eXBlLiBFaXRoZXIgJ2ZyYWdtZW50JyBvciAndmVydGV4Jy5cclxuICAgICAqL1xyXG4gICAgZ2V0U2hhZGVyVHlwZTogZnVuY3Rpb24gKGhlYWRlclNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlclNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gaGVhZGVyU291cmNlW2ldLnRyaW0oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lLnN1YnN0cmluZygwLCA1KSA9PT0gJ3R5cGU6JylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKDUpLnRyaW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNoYWRlclR5cGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2hhZGVyIHVuaWZvcm1zIGZyb20gdGhlIGhlYWRlciBibG9jay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkdMU0xGaWxlI2dldFNoYWRlclVuaWZvcm1zXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaGVhZGVyU291cmNlIC0gVGhlIGhlYWRlciBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2FueX0gVGhlIHNoYWRlciB1bmlmb3JtcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFNoYWRlclVuaWZvcm1zOiBmdW5jdGlvbiAoaGVhZGVyU291cmNlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB1bmlmb3JtcyA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlclNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gaGVhZGVyU291cmNlW2ldLnRyaW0oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lLnN1YnN0cmluZygwLCA4KSA9PT0gJ3VuaWZvcm0uJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGxpbmUuaW5kZXhPZignOicpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwb3MpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGxpbmUuc3Vic3RyaW5nKDgsIHBvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IEpTT04ucGFyc2UobGluZS5zdWJzdHJpbmcocG9zICsgMSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB1bmlmb3JtIEpTT046ICcgKyBrZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc3NlcyB0aGUgc2hhZGVyIGZpbGUgYW5kIGV4dHJhY3RzIHRoZSByZWxldmFudCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuR0xTTEZpbGUjZXh0cmFjdEJsb2NrXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGRhdGEgLSBUaGUgYXJyYXkgb2Ygc2hhZGVyIGRhdGEgdG8gcHJvY2Vzcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCB0byBzdGFydCBwcm9jZXNzaW5nIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7YW55fSBUaGUgcHJvY2Vzc2VkIHNoYWRlciBibG9jaywgb3IgbnVsbC5cclxuICAgICAqL1xyXG4gICAgZXh0cmFjdEJsb2NrOiBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBoZWFkZXJTdGFydCA9IC0xO1xyXG4gICAgICAgIHZhciBoZWFkZXJFbmQgPSAtMTtcclxuICAgICAgICB2YXIgYmxvY2tFbmQgPSAtMTtcclxuICAgICAgICB2YXIgaGVhZGVyT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjYXB0dXJlU291cmNlID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGhlYWRlclNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHZhciBzaGFkZXJTb3VyY2UgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbGluZSA9IGRhdGFbaV0udHJpbSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxpbmUgPT09ICctLS0nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyU3RhcnQgPT09IC0xKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlclN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWRlck9wZW4pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRW5kID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNvdXJjZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIFdlJ3ZlIGhpdCBhbm90aGVyIC0tLSBkZWxpbWl0ZXIsIGJyZWFrIG91dFxyXG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTb3VyY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChoZWFkZXJPcGVuKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJTb3VyY2UucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjYXB0dXJlU291cmNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzaGFkZXJTb3VyY2UucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgICAgIGJsb2NrRW5kID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFoZWFkZXJPcGVuICYmIGhlYWRlckVuZCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4geyBoZWFkZXI6IGhlYWRlclNvdXJjZSwgc2hhZGVyOiBzaGFkZXJTb3VyY2Uuam9pbignXFxuJyksIG9mZnNldDogYmxvY2tFbmQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhIEdMU0wgZmlsZSwgb3IgYXJyYXkgb2YgR0xTTCBmaWxlcywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICogSW4gUGhhc2VyIDMgR0xTTCBmaWxlcyBhcmUganVzdCBwbGFpbiBUZXh0IGZpbGVzIGF0IHRoZSBjdXJyZW50IG1vbWVudCBpbiB0aW1lLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5nbHNsKCdwbGFzbWEnLCAnc2hhZGVycy9QbGFzbWEuZ2xzbCcpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgU2hhZGVyIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBTaGFkZXIgQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBTaGFkZXIgQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuZ2xzbCh7XHJcbiAqICAgICBrZXk6ICdwbGFzbWEnLFxyXG4gKiAgICAgc2hhZGVyVHlwZTogJ2ZyYWdtZW50JyxcclxuICogICAgIHVybDogJ3NoYWRlcnMvUGxhc21hLmdsc2wnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuR0xTTEZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiBhY2Nlc3MgaXQgZnJvbSBpdHMgQ2FjaGUgdXNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuZ2xzbCgncGxhc21hJywgJ3NoYWRlcnMvUGxhc21hLmdsc2wnKTtcclxuICogLy8gYW5kIGxhdGVyIGluIHlvdXIgZ2FtZSAuLi5cclxuICogdmFyIGRhdGEgPSB0aGlzLmNhY2hlLnNoYWRlci5nZXQoJ3BsYXNtYScpO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYEZYLmAgYW5kIHRoZSBrZXkgd2FzIGBQbGFzbWFgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgRlguUGxhc21hYCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIHRleHQgZnJvbSB0aGUgU2hhZGVyIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcInBsYXNtYVwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJwbGFzbWEuZ2xzbFwiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5nbHNsYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBHTFNMIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2dsc2xcclxuICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI0FERFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkdMU0xGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkdMU0xGaWxlQ29uZmlnW10pfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFycmF5IG9mIHRoZW0uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uZ2xzbGAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmdsc2xcIi5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJUeXBlPSdmcmFnbWVudCddIC0gVGhlIHR5cGUgb2Ygc2hhZGVyLiBFaXRoZXIgYGZyYWdtZW50YCBmb3IgYSBmcmFnbWVudCBzaGFkZXIsIG9yIGB2ZXJ0ZXhgIGZvciBhIHZlcnRleCBzaGFkZXIuIFRoaXMgaXMgaWdub3JlZCBpZiB5b3UgbG9hZCBhIHNoYWRlciBidW5kbGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ2dsc2wnLCBmdW5jdGlvbiAoa2V5LCB1cmwsIHNoYWRlclR5cGUsIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIGl0J3MgYW4gYXJyYXkgaXQgaGFzIHRvIGJlIGFuIGFycmF5IG9mIE9iamVjdHMsIHNvIHdlIGdldCBldmVyeXRoaW5nIG91dCBvZiB0aGUgJ2tleScgb2JqZWN0XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShuZXcgR0xTTEZpbGUodGhpcywga2V5W2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsZShuZXcgR0xTTEZpbGUodGhpcywga2V5LCB1cmwsIHNoYWRlclR5cGUsIHhoclNldHRpbmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHTFNMRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgR2V0VVJMID0gcmVxdWlyZSgnLi4vR2V0VVJMJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIEF1ZGlvIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNhdWRpbyBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqIFxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2F1ZGlvLlxyXG4gKlxyXG4gKiBAY2xhc3MgSFRNTDVBdWRpb0ZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuQXVkaW9GaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybENvbmZpZ10gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEV4dHJhIFhIUiBTZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZmlsZS5cclxuICovXHJcbnZhciBIVE1MNUF1ZGlvRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRmlsZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEhUTUw1QXVkaW9GaWxlIChsb2FkZXIsIGtleSwgdXJsQ29uZmlnLCBhdWRpb0NvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgYXVkaW9Db25maWcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY29uZmlnJywgYXVkaW9Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhdWRpbycsXHJcbiAgICAgICAgICAgIGNhY2hlOiBsb2FkZXIuY2FjaGVNYW5hZ2VyLmF1ZGlvLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IHVybENvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmxDb25maWcudXJsLFxyXG4gICAgICAgICAgICBjb25maWc6IGF1ZGlvQ29uZmlnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8vICBOZXcgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGlzIGNsYXNzXHJcbiAgICAgICAgdGhpcy5sb2NrZWQgPSAnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3c7XHJcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZpbGVzTG9hZGVkID0gMDtcclxuICAgICAgICB0aGlzLmZpbGVzVG90YWwgPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBmaWxlIGZpbmlzaGVzIGxvYWRpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5IVE1MNUF1ZGlvRmlsZSNvbkxvYWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvbkxvYWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5uZXh0RmlsZSh0aGlzLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgaWYgdGhlIGZpbGUgZXJyb3JzIHdoaWxlIGxvYWRpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5IVE1MNUF1ZGlvRmlsZSNvbkVycm9yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25FcnJvcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhdWRpbyA9IHRoaXMuZGF0YVtpXTtcclxuXHJcbiAgICAgICAgICAgIGF1ZGlvLm9uY2FucGxheXRocm91Z2ggPSBudWxsO1xyXG4gICAgICAgICAgICBhdWRpby5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLm5leHRGaWxlKHRoaXMsIGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgZHVyaW5nIHRoZSBmaWxlIGxvYWQgcHJvZ3Jlc3MuIElzIHNlbnQgYSBET00gUHJvZ3Jlc3NFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkhUTUw1QXVkaW9GaWxlI29uUHJvZ3Jlc3NcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkV2ZW50cyNGSUxFX1BST0dSRVNTXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25Qcm9ncmVzczogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhdWRpbyA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgYXVkaW8ub25jYW5wbGF5dGhyb3VnaCA9IG51bGw7XHJcbiAgICAgICAgYXVkaW8ub25lcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZmlsZXNMb2FkZWQrKztcclxuXHJcbiAgICAgICAgdGhpcy5wZXJjZW50Q29tcGxldGUgPSBNYXRoLm1pbigodGhpcy5maWxlc0xvYWRlZCAvIHRoaXMuZmlsZXNUb3RhbCksIDEpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5lbWl0KEV2ZW50cy5GSUxFX1BST0dSRVNTLCB0aGlzLCB0aGlzLnBlcmNlbnRDb21wbGV0ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbGVzTG9hZGVkID09PSB0aGlzLmZpbGVzVG90YWwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm9uTG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIExvYWRlciwgc3RhcnRzIHRoZSBhY3R1YWwgZmlsZSBkb3dubG9hZGluZy5cclxuICAgICAqIER1cmluZyB0aGUgbG9hZCB0aGUgbWV0aG9kcyBvbkxvYWQsIG9uRXJyb3IgYW5kIG9uUHJvZ3Jlc3MgYXJlIGNhbGxlZCwgYmFzZWQgb24gdGhlIFhIUiBldmVudHMuXHJcbiAgICAgKiBZb3Ugc2hvdWxkbid0IG5vcm1hbGx5IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHksIGl0J3MgbWVhbnQgdG8gYmUgaW52b2tlZCBieSB0aGUgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuSFRNTDVBdWRpb0ZpbGUjbG9hZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxvYWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gW107XHJcblxyXG4gICAgICAgIHZhciBpbnN0YW5jZXMgPSAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuaW5zdGFuY2VzKSB8fCAxO1xyXG5cclxuICAgICAgICB0aGlzLmZpbGVzVG90YWwgPSBpbnN0YW5jZXM7XHJcbiAgICAgICAgdGhpcy5maWxlc0xvYWRlZCA9IDA7XHJcbiAgICAgICAgdGhpcy5wZXJjZW50Q29tcGxldGUgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluc3RhbmNlczsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGF1ZGlvID0gbmV3IEF1ZGlvKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWF1ZGlvLmRhdGFzZXQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvLmRhdGFzZXQgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXVkaW8uZGF0YXNldC5uYW1lID0gdGhpcy5rZXkgKyAoJzAnICsgaSkuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgICBhdWRpby5kYXRhc2V0LnVzZWQgPSAnZmFsc2UnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubG9ja2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhdWRpby5kYXRhc2V0LmxvY2tlZCA9ICd0cnVlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvLmRhdGFzZXQubG9ja2VkID0gJ2ZhbHNlJztcclxuXHJcbiAgICAgICAgICAgICAgICBhdWRpby5wcmVsb2FkID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgYXVkaW8ub25jYW5wbGF5dGhyb3VnaCA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgYXVkaW8ub25lcnJvciA9IHRoaXMub25FcnJvci5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGEucHVzaChhdWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXVkaW8gPSB0aGlzLmRhdGFbaV07XHJcbiAgICAgICAgICAgIGF1ZGlvLnNyYyA9IEdldFVSTCh0aGlzLCB0aGlzLmxvYWRlci5iYXNlVVJMKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2NrZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvLmxvYWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFRoaXMgaXMgc3VwZXItZGFuZ2Vyb3VzIGJ1dCB3b3Jrcy4gUmFjZSBjb25kaXRpb24gcG90ZW50aWFsIGhpZ2guXHJcbiAgICAgICAgICAgIC8vICBJcyB0aGVyZSBhbm90aGVyIHdheT9cclxuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uTG9hZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSFRNTDVBdWRpb0ZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBIVE1MIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNodG1sIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNodG1sLlxyXG4gKlxyXG4gKiBAY2xhc3MgSFRNTEZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkhUTUxGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnR4dGAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmh0bWxcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIEhUTUxGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gSFRNTEZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnaHRtbCc7XHJcblxyXG4gICAgICAgIGlmIChJc1BsYWluT2JqZWN0KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlnID0ga2V5O1xyXG5cclxuICAgICAgICAgICAga2V5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2tleScpO1xyXG4gICAgICAgICAgICB1cmwgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndXJsJyk7XHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3hoclNldHRpbmdzJyk7XHJcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IEdldEZhc3RWYWx1ZShjb25maWcsICdleHRlbnNpb24nLCBleHRlbnNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgY2FjaGU6IGxvYWRlci5jYWNoZU1hbmFnZXIuaHRtbCxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5nc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsIGZpbGVDb25maWcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkhUTUxGaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgIHRoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gSFRNTCBmaWxlLCBvciBhcnJheSBvZiBIVE1MIGZpbGVzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5odG1sKCdzdG9yeScsICdmaWxlcy9Mb2dpbkZvcm0uaHRtbCcpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgSFRNTCBDYWNoZSB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgSFRNTCBDYWNoZS5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIEhUTUwgQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuaHRtbCh7XHJcbiAqICAgICBrZXk6ICdsb2dpbicsXHJcbiAqICAgICB1cmw6ICdmaWxlcy9Mb2dpbkZvcm0uaHRtbCdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5IVE1MRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIGFjY2VzcyBpdCBmcm9tIGl0cyBDYWNoZSB1c2luZyBpdHMga2V5OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5odG1sKCdsb2dpbicsICdmaWxlcy9Mb2dpbkZvcm0uaHRtbCcpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgZGF0YSA9IHRoaXMuY2FjaGUuaHRtbC5nZXQoJ2xvZ2luJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBTdG9yeWAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuU3RvcnlgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgaHRtbCBmcm9tIHRoZSBIVE1MIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcInN0b3J5XCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcInN0b3J5Lmh0bWxcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuaHRtbGAgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSFRNTCBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNodG1sXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSFRNTEZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSFRNTEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5odG1sYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uaHRtbFwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdodG1sJywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEhUTUxGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEhUTUxGaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSFRNTEZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBIVE1MIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNodG1sVGV4dHVyZSBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jaHRtbFRleHR1cmUuXHJcbiAqXHJcbiAqIEBjbGFzcyBIVE1MVGV4dHVyZUZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkhUTUxUZXh0dXJlRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5wbmdgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5wbmdcIi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlIHRoZSBIVE1MIHdpbGwgYmUgcmVuZGVyZWQgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlIHRoZSBIVE1MIHdpbGwgYmUgcmVuZGVyZWQgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEV4dHJhIFhIUiBTZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZmlsZS5cclxuICovXHJcbnZhciBIVE1MVGV4dHVyZUZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBIVE1MVGV4dHVyZUZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHdpZHRoLCBoZWlnaHQsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gNTEyOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IDUxMjsgfVxyXG5cclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ2h0bWwnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgd2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnd2lkdGgnLCB3aWR0aCk7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdoZWlnaHQnLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdodG1sJyxcclxuICAgICAgICAgICAgY2FjaGU6IGxvYWRlci50ZXh0dXJlTWFuYWdlcixcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5ncyxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuSFRNTFRleHR1cmVGaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB2YXIgdyA9IHRoaXMuY29uZmlnLndpZHRoO1xyXG4gICAgICAgIHZhciBoID0gdGhpcy5jb25maWcuaGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICBkYXRhLnB1c2goJzxzdmcgd2lkdGg9XCInICsgdyArICdweFwiIGhlaWdodD1cIicgKyBoICsgJ3B4XCIgdmlld0JveD1cIjAgMCAnICsgdyArICcgJyArIGggKyAnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPicpO1xyXG4gICAgICAgIGRhdGEucHVzaCgnPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPicpO1xyXG4gICAgICAgIGRhdGEucHVzaCgnPGJvZHkgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+Jyk7XHJcbiAgICAgICAgZGF0YS5wdXNoKHRoaXMueGhyTG9hZGVyLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgZGF0YS5wdXNoKCc8L2JvZHk+Jyk7XHJcbiAgICAgICAgZGF0YS5wdXNoKCc8L2ZvcmVpZ25PYmplY3Q+Jyk7XHJcbiAgICAgICAgZGF0YS5wdXNoKCc8L3N2Zz4nKTtcclxuXHJcbiAgICAgICAgdmFyIHN2ZyA9IFsgZGF0YS5qb2luKCdcXG4nKSBdO1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRyeVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJsb2IgPSBuZXcgd2luZG93LkJsb2Ioc3ZnLCB7IHR5cGU6ICdpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLnN0YXRlID0gQ09OU1QuRklMRV9FUlJPUkVEO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEub25sb2FkID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGUucmV2b2tlT2JqZWN0VVJMKF90aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEub25lcnJvciA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBGaWxlLnJldm9rZU9iamVjdFVSTChfdGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLm9uUHJvY2Vzc0Vycm9yKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jcmVhdGVPYmplY3RVUkwodGhpcy5kYXRhLCBibG9iLCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5IVE1MVGV4dHVyZUZpbGUjYWRkVG9DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FjaGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLmNhY2hlLmFkZEltYWdlKHRoaXMua2V5LCB0aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLnBlbmRpbmdEZXN0cm95KHRleHR1cmUpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBIVE1MIEZpbGUsIG9yIGFycmF5IG9mIEhUTUwgRmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuIFdoZW4gdGhlIGZpbGVzIGFyZSBsb2FkZWQgdGhleVxyXG4gKiB3aWxsIGJlIHJlbmRlcmVkIHRvIHRleHR1cmVzIGFuZCBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQuaHRtbFRleHR1cmUoJ2luc3RydWN0aW9ucycsICdjb250ZW50L2ludHJvLmh0bWwnLCAyNTYsIDUxMik7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5odG1sVGV4dHVyZSh7XHJcbiAqICAgICBrZXk6ICdpbnN0cnVjdGlvbnMnLFxyXG4gKiAgICAgdXJsOiAnY29udGVudC9pbnRyby5odG1sJyxcclxuICogICAgIHdpZHRoOiAyNTYsXHJcbiAqICAgICBoZWlnaHQ6IDUxMlxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkhUTUxUZXh0dXJlRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIHVzZSBpdCBhcyBhIHRleHR1cmUgZm9yIGEgR2FtZSBPYmplY3QgYnkgcmVmZXJlbmNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuaHRtbFRleHR1cmUoJ2luc3RydWN0aW9ucycsICdjb250ZW50L2ludHJvLmh0bWwnLCAyNTYsIDUxMik7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHRoaXMuYWRkLmltYWdlKHgsIHksICdpbnN0cnVjdGlvbnMnKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIHNwZWNpZmllZCBhIHByZWZpeCBpbiB0aGUgbG9hZGVyLCB2aWEgYExvYWRlci5zZXRQcmVmaXhgIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGlzIGZpbGVzXHJcbiAqIGtleS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggd2FzIGBNRU5VLmAgYW5kIHRoZSBrZXkgd2FzIGBCYWNrZ3JvdW5kYCB0aGUgZmluYWwga2V5IHdpbGwgYmUgYE1FTlUuQmFja2dyb3VuZGAgYW5kXHJcbiAqIHRoaXMgaXMgd2hhdCB5b3Ugd291bGQgdXNlIHRvIHJldHJpZXZlIHRoZSBpbWFnZSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqXHJcbiAqIFRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMIGlzIHJlbGF0aXZlIHRoZSBgTG9hZGVyLmJhc2VVUkxgIGFuZCBgTG9hZGVyLnBhdGhgIHZhbHVlcyB3aWxsIGJlIHByZXBlbmRlZCB0byBpdC5cclxuICpcclxuICogSWYgdGhlIFVSTCBpc24ndCBzcGVjaWZpZWQgdGhlIExvYWRlciB3aWxsIHRha2UgdGhlIGtleSBhbmQgY3JlYXRlIGEgZmlsZW5hbWUgZnJvbSB0aGF0LiBGb3IgZXhhbXBsZSBpZiB0aGUga2V5IGlzIFwiYWxpZW5cIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiYWxpZW4uaHRtbFwiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5odG1sYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogVGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIHRvIHdoaWNoIHRoZSBIVE1MIHdpbGwgYmUgcmVuZGVyZWQuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSB0aGVzZVxyXG4gKiBhdXRvbWF0aWNhbGx5LCBzbyB5b3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUgdGhlbSwgZWl0aGVyIGFzIGFyZ3VtZW50cyBvciBpbiB0aGUgZmlsZSBjb25maWcgb2JqZWN0LlxyXG4gKiBXaGVuIHRoZSBIVE1MIGZpbGUgaGFzIGxvYWRlZCBhIG5ldyBTVkcgZWxlbWVudCBpcyBjcmVhdGVkIHdpdGggYSBzaXplIGFuZCB2aWV3Ym94IHNldCB0byB0aGUgd2lkdGggYW5kIGhlaWdodCBnaXZlbi5cclxuICogVGhlIFNWRyBmaWxlIGhhcyBhIGJvZHkgdGFnIGFkZGVkIHRvIGl0LCB3aXRoIHRoZSBIVE1MIGZpbGUgY29udGVudHMgaW5jbHVkZWQuIEl0IHRoZW4gY2FsbHMgYHdpbmRvdy5CbG9iYCBvbiB0aGUgU1ZHLFxyXG4gKiBhbmQgaWYgc3VjY2Vzc2Z1bCBpcyBhZGRlZCB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyLCBvdGhlcndpc2UgaXQgZmFpbHMgcHJvY2Vzc2luZy4gVGhlIG92ZXJhbGwgcXVhbGl0eSBvZiB0aGUgcmVuZGVyZWRcclxuICogSFRNTCBkZXBlbmRzIG9uIHlvdXIgYnJvd3NlciwgYW5kIHNvbWUgb2YgdGhlbSBtYXkgbm90IGV2ZW4gc3VwcG9ydCB0aGUgc3ZnIC8gYmxvYiBwcm9jZXNzIHVzZWQuIEJlIGF3YXJlIHRoYXQgdGhlcmUgYXJlXHJcbiAqIGxpbWl0YXRpb25zIG9uIHdoYXQgSFRNTCBjYW4gYmUgaW5zaWRlIGFuIFNWRy4gWW91IGNhbiBmaW5kIG91dCBtb3JlIGRldGFpbHMgaW4gdGhpc1xyXG4gKiBbTW96aWxsYSBNRE4gZW50cnldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNfQVBJL0RyYXdpbmdfRE9NX29iamVjdHNfaW50b19hX2NhbnZhcykuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSFRNTFRleHR1cmVGaWxlIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2h0bWxUZXh0dXJlXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSFRNTFRleHR1cmVGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkhUTUxUZXh0dXJlRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+Lmh0bWxgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5odG1sXCIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPTUxMl0gLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUgdGhlIEhUTUwgd2lsbCBiZSByZW5kZXJlZCB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PTUxMl0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlIHRoZSBIVE1MIHdpbGwgYmUgcmVuZGVyZWQgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ2h0bWxUZXh0dXJlJywgZnVuY3Rpb24gKGtleSwgdXJsLCB3aWR0aCwgaGVpZ2h0LCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEhUTUxUZXh0dXJlRmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBIVE1MVGV4dHVyZUZpbGUodGhpcywga2V5LCB1cmwsIHdpZHRoLCBoZWlnaHQsIHhoclNldHRpbmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIVE1MVGV4dHVyZUZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBJbWFnZSBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jaW1hZ2UgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI2ltYWdlLlxyXG4gKlxyXG4gKiBAY2xhc3MgSW1hZ2VGaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5wbmdgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5wbmdcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRnJhbWVDb25maWd9IFtmcmFtZUNvbmZpZ10gLSBUaGUgZnJhbWUgY29uZmlndXJhdGlvbiBvYmplY3QuIE9ubHkgcHJvdmlkZWQgZm9yLCBhbmQgdXNlZCBieSwgU3ByaXRlIFNoZWV0cy5cclxuICovXHJcbnZhciBJbWFnZUZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBJbWFnZUZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzLCBmcmFtZUNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ3BuZyc7XHJcbiAgICAgICAgdmFyIG5vcm1hbE1hcFVSTDtcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgbm9ybWFsTWFwVVJMID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ25vcm1hbE1hcCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgZnJhbWVDb25maWcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZnJhbWVDb25maWcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub3JtYWxNYXBVUkwgPSB1cmxbMV07XHJcbiAgICAgICAgICAgIHVybCA9IHVybFswXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLnRleHR1cmVNYW5hZ2VyLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IGV4dGVuc2lvbixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3M6IHhoclNldHRpbmdzLFxyXG4gICAgICAgICAgICBjb25maWc6IGZyYW1lQ29uZmlnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8vICBEbyB3ZSBoYXZlIGEgbm9ybWFsIG1hcCB0byBsb2FkIGFzIHdlbGw/XHJcbiAgICAgICAgaWYgKG5vcm1hbE1hcFVSTClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBub3JtYWxNYXAgPSBuZXcgSW1hZ2VGaWxlKGxvYWRlciwgdGhpcy5rZXksIG5vcm1hbE1hcFVSTCwgeGhyU2V0dGluZ3MsIGZyYW1lQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIG5vcm1hbE1hcC50eXBlID0gJ25vcm1hbE1hcCc7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldExpbmsobm9ybWFsTWFwKTtcclxuXHJcbiAgICAgICAgICAgIGxvYWRlci5hZGRGaWxlKG5vcm1hbE1hcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5vbmxvYWQgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRmlsZS5yZXZva2VPYmplY3RVUkwoX3RoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5vbmVycm9yID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGUucmV2b2tlT2JqZWN0VVJMKF90aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzRXJyb3IoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNyZWF0ZU9iamVjdFVSTCh0aGlzLmRhdGEsIHRoaXMueGhyTG9hZGVyLnJlc3BvbnNlLCAnaW1hZ2UvcG5nJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZTtcclxuICAgICAgICB2YXIgbGlua0ZpbGUgPSB0aGlzLmxpbmtGaWxlO1xyXG5cclxuICAgICAgICBpZiAobGlua0ZpbGUgJiYgbGlua0ZpbGUuc3RhdGUgPT09IENPTlNULkZJTEVfQ09NUExFVEUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnaW1hZ2UnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jYWNoZS5hZGRJbWFnZSh0aGlzLmtleSwgdGhpcy5kYXRhLCBsaW5rRmlsZS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHR1cmUgPSB0aGlzLmNhY2hlLmFkZEltYWdlKGxpbmtGaWxlLmtleSwgbGlua0ZpbGUuZGF0YSwgdGhpcy5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGVzdHJveSh0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIGxpbmtGaWxlLnBlbmRpbmdEZXN0cm95KHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghbGlua0ZpbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jYWNoZS5hZGRJbWFnZSh0aGlzLmtleSwgdGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3kodGV4dHVyZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBJbWFnZSwgb3IgYXJyYXkgb2YgSW1hZ2VzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5pbWFnZSgnbG9nbycsICdpbWFnZXMvcGhhc2VyTG9nby5wbmcnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBQaGFzZXIgY2FuIGxvYWQgYWxsIGNvbW1vbiBpbWFnZSB0eXBlczogcG5nLCBqcGcsIGdpZiBhbmQgYW55IG90aGVyIGZvcm1hdCB0aGUgYnJvd3NlciBjYW4gbmF0aXZlbHkgaGFuZGxlLlxyXG4gKiBJZiB5b3UgdHJ5IHRvIGxvYWQgYW4gYW5pbWF0ZWQgZ2lmIG9ubHkgdGhlIGZpcnN0IGZyYW1lIHdpbGwgYmUgcmVuZGVyZWQuIEJyb3dzZXJzIGRvIG5vdCBuYXRpdmVseSBzdXBwb3J0IHBsYXliYWNrXHJcbiAqIG9mIGFuaW1hdGVkIGdpZnMgdG8gQ2FudmFzIGVsZW1lbnRzLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nLiBJdCBpcyB1c2VkIHRvIGFkZCB0aGUgZmlsZSB0byB0aGUgZ2xvYmFsIFRleHR1cmUgTWFuYWdlciB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBMb2FkaW5nIGEgZmlsZSB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgdGFrZW4gd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nLiBJZiB5b3Ugd2lzaCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGVcclxuICogdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIGZpcnN0LCBiZWZvcmUgbG9hZGluZyBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmltYWdlKHtcclxuICogICAgIGtleTogJ2xvZ28nLFxyXG4gKiAgICAgdXJsOiAnaW1hZ2VzL0F0YXJpTG9nby5wbmcnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSW1hZ2VGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gdXNlIGl0IGFzIGEgdGV4dHVyZSBmb3IgYSBHYW1lIE9iamVjdCBieSByZWZlcmVuY2luZyBpdHMga2V5OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5pbWFnZSgnbG9nbycsICdpbWFnZXMvQXRhcmlMb2dvLnBuZycpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLmFkZC5pbWFnZSh4LCB5LCAnbG9nbycpO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYE1FTlUuYCBhbmQgdGhlIGtleSB3YXMgYEJhY2tncm91bmRgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgTUVOVS5CYWNrZ3JvdW5kYCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIGltYWdlIGZyb20gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJhbGllblwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJhbGllbi5wbmdcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAucG5nYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogUGhhc2VyIGFsc28gc3VwcG9ydHMgdGhlIGF1dG9tYXRpYyBsb2FkaW5nIG9mIGFzc29jaWF0ZWQgbm9ybWFsIG1hcHMuIElmIHlvdSBoYXZlIGEgbm9ybWFsIG1hcCB0byBnbyB3aXRoIHRoaXMgaW1hZ2UsXHJcbiAqIHRoZW4geW91IGNhbiBzcGVjaWZ5IGl0IGJ5IHByb3ZpZGluZyBhbiBhcnJheSBhcyB0aGUgYHVybGAgd2hlcmUgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBub3JtYWwgbWFwOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5pbWFnZSgnbG9nbycsIFsgJ2ltYWdlcy9BdGFyaUxvZ28ucG5nJywgJ2ltYWdlcy9BdGFyaUxvZ28tbi5wbmcnIF0pO1xyXG4gKiBgYGBcclxuICpcclxuICogT3IsIGlmIHlvdSBhcmUgdXNpbmcgYSBjb25maWcgb2JqZWN0IHVzZSB0aGUgYG5vcm1hbE1hcGAgcHJvcGVydHk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmltYWdlKHtcclxuICogICAgIGtleTogJ2xvZ28nLFxyXG4gKiAgICAgdXJsOiAnaW1hZ2VzL0F0YXJpTG9nby5wbmcnLFxyXG4gKiAgICAgbm9ybWFsTWFwOiAnaW1hZ2VzL0F0YXJpTG9nby1uLnBuZydcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgbm9ybWFsIG1hcCBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgY29uZGl0aW9ucyBhcyB0aGUgaW1hZ2UgZmlsZSB3aXRoIHJlZ2FyZCB0byB0aGUgcGF0aCwgYmFzZVVSTCwgQ09ScyBhbmQgWEhSIFNldHRpbmdzLlxyXG4gKiBOb3JtYWwgbWFwcyBhcmUgYSBXZWJHTCBvbmx5IGZlYXR1cmUuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSW1hZ2UgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jaW1hZ2VcclxuICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI0FERFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5JbWFnZUZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5wbmdgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5wbmdcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcignaW1hZ2UnLCBmdW5jdGlvbiAoa2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIGl0J3MgYW4gYXJyYXkgaXQgaGFzIHRvIGJlIGFuIGFycmF5IG9mIE9iamVjdHMsIHNvIHdlIGdldCBldmVyeXRoaW5nIG91dCBvZiB0aGUgJ2tleScgb2JqZWN0XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShuZXcgSW1hZ2VGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IEltYWdlRmlsZSh0aGlzLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRmlsZSA9IHJlcXVpcmUoJy4uL0ZpbGUnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBKU09OIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNqc29uIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNqc29uLlxyXG4gKlxyXG4gKiBAY2xhc3MgSlNPTkZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSlNPTkZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uanNvbmAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzb25cIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2RhdGFLZXldIC0gV2hlbiB0aGUgSlNPTiBmaWxlIGxvYWRzIG9ubHkgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQ2FjaGUuXHJcbiAqL1xyXG52YXIgSlNPTkZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICAvLyAgdXJsIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBsaWtlIGEgcHJvcGVyIHVybCwgb3IgYW4gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSByZWFkeS1tYWRlIEpTIE9iamVjdFxyXG4gICAgLy8gIGRhdGFLZXkgYWxsb3dzIHlvdSB0byBwbHVjayBhIHNwZWNpZmljIG9iamVjdCBvdXQgb2YgdGhlIEpTT04gYW5kIHB1dCBqdXN0IHRoYXQgaW50byB0aGUgY2FjaGUsIHJhdGhlciB0aGFuIHRoZSB3aG9sZSB0aGluZ1xyXG5cclxuICAgIGZ1bmN0aW9uIEpTT05GaWxlIChsb2FkZXIsIGtleSwgdXJsLCB4aHJTZXR0aW5ncywgZGF0YUtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ2pzb24nO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgZGF0YUtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdkYXRhS2V5JywgZGF0YUtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlsZUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLmNhY2hlTWFuYWdlci5qc29uLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IGV4dGVuc2lvbixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3M6IHhoclNldHRpbmdzLFxyXG4gICAgICAgICAgICBjb25maWc6IGRhdGFLZXlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3QodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBPYmplY3QgcHJvdmlkZWQgaW5zdGVhZCBvZiBhIFVSTCwgc28gbm8gbmVlZCB0byBhY3R1YWxseSBsb2FkIGl0IChwb3B1bGF0ZSBkYXRhIHdpdGggdmFsdWUpXHJcbiAgICAgICAgICAgIGlmIChkYXRhS2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBHZXRWYWx1ZSh1cmwsIGRhdGFLZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gdXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QT1BVTEFURUQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IExvYWRlci5uZXh0RmlsZS5cclxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoYXQgZXh0cmEgd29yayB0aGlzIEZpbGUgZG9lcyB3aXRoIGl0cyBsb2FkZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLkpTT05GaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gQ09OU1QuRklMRV9QT1BVTEFURUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHRoaXMueGhyTG9hZGVyLnJlc3BvbnNlVGV4dCk7XHJcblxyXG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5jb25maWc7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEdldFZhbHVlKGpzb24sIGtleSwganNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBqc29uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgSlNPTiBmaWxlLCBvciBhcnJheSBvZiBKU09OIGZpbGVzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5qc29uKCd3YXZlZGF0YScsICdmaWxlcy9BbGllbldhdmVEYXRhLmpzb24nKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nLiBJdCBpcyB1c2VkIHRvIGFkZCB0aGUgZmlsZSB0byB0aGUgZ2xvYmFsIEpTT04gQ2FjaGUgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIEpTT04gQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBKU09OIENhY2hlIGZpcnN0LCBiZWZvcmUgbG9hZGluZyBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmpzb24oe1xyXG4gKiAgICAga2V5OiAnd2F2ZWRhdGEnLFxyXG4gKiAgICAgdXJsOiAnZmlsZXMvQWxpZW5XYXZlRGF0YS5qc29uJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkpTT05GaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmpzb24oJ3dhdmVkYXRhJywgJ2ZpbGVzL0FsaWVuV2F2ZURhdGEuanNvbicpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgZGF0YSA9IHRoaXMuY2FjaGUuanNvbi5nZXQoJ3dhdmVkYXRhJyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBXYXZlc2AgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuV2F2ZXNgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBKU09OIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImRhdGFcIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiZGF0YS5qc29uXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmpzb25gIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseSBwcm92aWRlIGEgYGRhdGFLZXlgIHRvIHVzZS4gVGhpcyBhbGxvd3MgeW91IHRvIGV4dHJhY3Qgb25seSBhIHBhcnQgb2YgdGhlIEpTT04gYW5kIHN0b3JlIGl0IGluIHRoZSBDYWNoZSxcclxuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGZpbGUuIEZvciBleGFtcGxlLCBpZiB5b3VyIEpTT04gZGF0YSBoYWQgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOlxyXG4gKlxyXG4gKiBgYGBqc29uXHJcbiAqIHtcclxuICogICAgIFwibGV2ZWwxXCI6IHtcclxuICogICAgICAgICBcImJhZGRpZXNcIjoge1xyXG4gKiAgICAgICAgICAgICBcImFsaWVuc1wiOiB7fSxcclxuICogICAgICAgICAgICAgXCJib3NzXCI6IHt9XHJcbiAqICAgICAgICAgfVxyXG4gKiAgICAgfSxcclxuICogICAgIFwibGV2ZWwyXCI6IHt9LFxyXG4gKiAgICAgXCJsZXZlbDNcIjoge31cclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQW5kIHlvdSBvbmx5IHdhbnRlZCB0byBzdG9yZSB0aGUgYGJvc3NgIGRhdGEgaW4gdGhlIENhY2hlLCB0aGVuIHlvdSBjb3VsZCBwYXNzIGBsZXZlbDEuYmFkZGllcy5ib3NzYGFzIHRoZSBgZGF0YUtleWAuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgSlNPTiBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNqc29uXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5KU09ORmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+Lmpzb25gLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc29uXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YUtleV0gLSBXaGVuIHRoZSBKU09OIGZpbGUgbG9hZHMgb25seSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBDYWNoZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcignanNvbicsIGZ1bmN0aW9uIChrZXksIHVybCwgZGF0YUtleSwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBKU09ORmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBKU09ORmlsZSh0aGlzLCBrZXksIHVybCwgeGhyU2V0dGluZ3MsIGRhdGFLZXkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEpTT05GaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSW1hZ2VGaWxlID0gcmVxdWlyZSgnLi9JbWFnZUZpbGUuanMnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG52YXIgSlNPTkZpbGUgPSByZXF1aXJlKCcuL0pTT05GaWxlLmpzJyk7XHJcbnZhciBNdWx0aUZpbGUgPSByZXF1aXJlKCcuLi9NdWx0aUZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIE11bHRpIFRleHR1cmUgQXRsYXMgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI211bHRpYXRsYXMgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI211bHRpYXRsYXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBNdWx0aUF0bGFzRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLk11bHRpQXRsYXNGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSBvZiB0aGUgZmlsZS4gTXVzdCBiZSB1bmlxdWUgd2l0aGluIGJvdGggdGhlIExvYWRlciBhbmQgdGhlIFRleHR1cmUgTWFuYWdlci4gT3IgYSBjb25maWcgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0bGFzVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgbXVsdGkgYXRsYXMganNvbiBmaWxlIGZyb20uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHRleHR1cmVzIGRlZmluZWQgaW4gdGhlIGF0bGFzIGRhdGEuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVVSTF0gLSBPcHRpb25hbCBCYXNlIFVSTCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB0ZXh0dXJlcyBkZWZpbmVkIGluIHRoZSBhdGxhcyBkYXRhLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFthdGxhc1hoclNldHRpbmdzXSAtIEV4dHJhIFhIUiBTZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBhdGxhcyBqc29uIGZpbGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3RleHR1cmVYaHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGUgdGV4dHVyZSBmaWxlcy5cclxuICovXHJcbnZhciBNdWx0aUF0bGFzRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogTXVsdGlGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTXVsdGlBdGxhc0ZpbGUgKGxvYWRlciwga2V5LCBhdGxhc1VSTCwgcGF0aCwgYmFzZVVSTCwgYXRsYXNYaHJTZXR0aW5ncywgdGV4dHVyZVhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChJc1BsYWluT2JqZWN0KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlnID0ga2V5O1xyXG5cclxuICAgICAgICAgICAga2V5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2tleScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnLCBmYWxzZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGF0bGFzVVJMID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXRsYXNVUkwgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXRsYXNVUkwnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXRsYXNYaHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBwYXRoID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3BhdGgnKTtcclxuICAgICAgICAgICAgYmFzZVVSTCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdiYXNlVVJMJyk7XHJcbiAgICAgICAgICAgIHRleHR1cmVYaHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0ZXh0dXJlWGhyU2V0dGluZ3MnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkYXRhID0gbmV3IEpTT05GaWxlKGxvYWRlciwga2V5LCBhdGxhc1VSTCwgYXRsYXNYaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ211bHRpYXRsYXMnLCBrZXksIFsgZGF0YSBdKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25maWcucGF0aCA9IHBhdGg7XHJcbiAgICAgICAgdGhpcy5jb25maWcuYmFzZVVSTCA9IGJhc2VVUkw7XHJcbiAgICAgICAgdGhpcy5jb25maWcudGV4dHVyZVhoclNldHRpbmdzID0gdGV4dHVyZVhoclNldHRpbmdzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBlYWNoIEZpbGUgd2hlbiBpdCBmaW5pc2hlcyBsb2FkaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuTXVsdGlBdGxhc0ZpbGUjb25GaWxlQ29tcGxldGVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5GaWxlfSBmaWxlIC0gVGhlIEZpbGUgdGhhdCBoYXMgY29tcGxldGVkIHByb2Nlc3NpbmcuXHJcbiAgICAgKi9cclxuICAgIG9uRmlsZUNvbXBsZXRlOiBmdW5jdGlvbiAoZmlsZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoZmlsZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmctLTtcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlLnR5cGUgPT09ICdqc29uJyAmJiBmaWxlLmRhdGEuaGFzT3duUHJvcGVydHkoJ3RleHR1cmVzJykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBJbnNwZWN0IHRoZSBkYXRhIGZvciB0aGUgZmlsZXMgdG8gbm93IGxvYWRcclxuICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlcyA9IGZpbGUuZGF0YS50ZXh0dXJlcztcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgICAgICAgICB2YXIgbG9hZGVyID0gdGhpcy5sb2FkZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRCYXNlVVJMID0gbG9hZGVyLmJhc2VVUkw7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFBhdGggPSBsb2FkZXIucGF0aDtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50UHJlZml4ID0gbG9hZGVyLnByZWZpeDtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgYmFzZVVSTCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdiYXNlVVJMJywgdGhpcy5iYXNlVVJMKTtcclxuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3BhdGgnLCB0aGlzLnBhdGgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdwcmVmaXgnLCB0aGlzLnByZWZpeCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGV4dHVyZVhoclNldHRpbmdzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RleHR1cmVYaHJTZXR0aW5ncycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvYWRlci5zZXRCYXNlVVJMKGJhc2VVUkwpO1xyXG4gICAgICAgICAgICAgICAgbG9hZGVyLnNldFBhdGgocGF0aCk7XHJcbiAgICAgICAgICAgICAgICBsb2FkZXIuc2V0UHJlZml4KHByZWZpeCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgXCJpbWFnZVwiOiBcInRleHR1cmUtcGFja2VyLW11bHRpLWF0bGFzLTAucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHR1cmVVUkwgPSB0ZXh0dXJlc1tpXS5pbWFnZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9ICdNQScgKyB0aGlzLm11bHRpS2V5SW5kZXggKyAnXycgKyB0ZXh0dXJlVVJMO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2VGaWxlKGxvYWRlciwga2V5LCB0ZXh0dXJlVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvTXVsdGlGaWxlKGltYWdlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmFkZEZpbGUoaW1hZ2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyAgXCJub3JtYWxNYXBcIjogXCJ0ZXh0dXJlLXBhY2tlci1tdWx0aS1hdGxhcy0wX24ucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzW2ldLm5vcm1hbE1hcClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxNYXAgPSBuZXcgSW1hZ2VGaWxlKGxvYWRlciwga2V5LCB0ZXh0dXJlc1tpXS5ub3JtYWxNYXAsIHRleHR1cmVYaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxNYXAudHlwZSA9ICdub3JtYWxNYXAnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0TGluayhub3JtYWxNYXApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb011bHRpRmlsZShub3JtYWxNYXApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmFkZEZpbGUobm9ybWFsTWFwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlc2V0IHRoZSBsb2FkZXIgc2V0dGluZ3NcclxuICAgICAgICAgICAgICAgIGxvYWRlci5zZXRCYXNlVVJMKGN1cnJlbnRCYXNlVVJMKTtcclxuICAgICAgICAgICAgICAgIGxvYWRlci5zZXRQYXRoKGN1cnJlbnRQYXRoKTtcclxuICAgICAgICAgICAgICAgIGxvYWRlci5zZXRQcmVmaXgoY3VycmVudFByZWZpeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGlzIGZpbGUgdG8gaXRzIHRhcmdldCBjYWNoZSB1cG9uIHN1Y2Nlc3NmdWwgbG9hZGluZyBhbmQgcHJvY2Vzc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLk11bHRpQXRsYXNGaWxlI2FkZFRvQ2FjaGVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBhZGRUb0NhY2hlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUmVhZHlUb1Byb2Nlc3MoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmaWxlSlNPTiA9IHRoaXMuZmlsZXNbMF07XHJcblxyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgaW1hZ2VzID0gW107XHJcbiAgICAgICAgICAgIHZhciBub3JtYWxNYXBzID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS50eXBlID09PSAnbm9ybWFsTWFwJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgcG9zID0gZmlsZS5rZXkuaW5kZXhPZignXycpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGZpbGUua2V5LnN1YnN0cihwb3MgKyAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBmaWxlLmRhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIE5vdyB3ZSBuZWVkIHRvIGZpbmQgb3V0IHdoaWNoIGpzb24gZW50cnkgdGhpcyBtYXBwZWQgdG9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZmlsZUpTT04uZGF0YS50ZXh0dXJlcy5sZW5ndGg7IHQrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGZpbGVKU09OLmRhdGEudGV4dHVyZXNbdF07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmltYWdlID09PSBrZXkpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goaXRlbSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5saW5rRmlsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTWFwcy5wdXNoKGZpbGUubGlua0ZpbGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vcm1hbE1hcHMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBub3JtYWxNYXBzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRlci50ZXh0dXJlTWFuYWdlci5hZGRBdGxhc0pTT05BcnJheSh0aGlzLmtleSwgaW1hZ2VzLCBkYXRhLCBub3JtYWxNYXBzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbaV0ucGVuZGluZ0Rlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSBNdWx0aSBUZXh0dXJlIEF0bGFzLCBvciBhcnJheSBvZiBtdWx0aSBhdGxhc2VzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5tdWx0aWF0bGFzKCdsZXZlbDEnLCAnaW1hZ2VzL0xldmVsMS5qc29uJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogSWYgeW91IGNhbGwgdGhpcyBmcm9tIG91dHNpZGUgb2YgYHByZWxvYWRgIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgdGhlIExvYWRlciBhZnRlcndhcmRzIGFuZCBtb25pdG9yaW5nXHJcbiAqIGl0cyBldmVudHMgdG8ga25vdyB3aGVuIGl0J3Mgc2FmZSB0byB1c2UgdGhlIGFzc2V0LiBQbGVhc2Ugc2VlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiBjbGFzcyBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBQaGFzZXIgZXhwZWN0cyB0aGUgYXRsYXMgZGF0YSB0byBiZSBwcm92aWRlZCBpbiBhIEpTT04gZmlsZSBhcyBleHBvcnRlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBUZXh0dXJlIFBhY2tlcixcclxuICogdmVyc2lvbiA0LjYuMyBvciBhYm92ZSwgd2hlcmUgeW91IGhhdmUgbWFkZSBzdXJlIHRvIHVzZSB0aGUgUGhhc2VyIDMgRXhwb3J0IG9wdGlvbi5cclxuICpcclxuICogVGhlIHdheSBpdCB3b3JrcyBpbnRlcm5hbGx5IGlzIHRoYXQgeW91IHByb3ZpZGUgYSBVUkwgdG8gdGhlIEpTT04gZmlsZS4gUGhhc2VyIHRoZW4gbG9hZHMgdGhpcyBKU09OLCBwYXJzZXMgaXQgYW5kXHJcbiAqIGV4dHJhY3RzIHdoaWNoIHRleHR1cmUgZmlsZXMgaXQgYWxzbyBuZWVkcyB0byBsb2FkIHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLiBJZiB0aGUgSlNPTiBhbHNvIGRlZmluZXMgbm9ybWFsIG1hcHMsXHJcbiAqIFBoYXNlciB3aWxsIGxvYWQgdGhvc2UgYXMgd2VsbC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5tdWx0aWF0bGFzKHtcclxuICogICAgIGtleTogJ2xldmVsMScsXHJcbiAqICAgICBhdGxhc1VSTDogJ2ltYWdlcy9MZXZlbDEuanNvbidcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5NdWx0aUF0bGFzRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGEgVVJMIGZvciB0aGUgYXRsYXMgSlNPTiBkYXRhIHlvdSBjYW4gYWxzbyBwYXNzIGluIGEgd2VsbCBmb3JtZWQgSlNPTiBvYmplY3QgaW5zdGVhZC5cclxuICpcclxuICogT25jZSB0aGUgYXRsYXMgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiB1c2UgZnJhbWVzIGZyb20gaXQgYXMgdGV4dHVyZXMgZm9yIGEgR2FtZSBPYmplY3QgYnkgcmVmZXJlbmNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQubXVsdGlhdGxhcygnbGV2ZWwxJywgJ2ltYWdlcy9MZXZlbDEuanNvbicpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLmFkZC5pbWFnZSh4LCB5LCAnbGV2ZWwxJywgJ2JhY2tncm91bmQnKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFRvIGdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBmcmFtZXMgd2l0aGluIGFuIGF0bGFzIHBsZWFzZSBjb25zdWx0IHlvdXIgVGV4dHVyZSBBdGxhcyBzb2Z0d2FyZS5cclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYE1FTlUuYCBhbmQgdGhlIGtleSB3YXMgYEJhY2tncm91bmRgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgTUVOVS5CYWNrZ3JvdW5kYCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIGltYWdlIGZyb20gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJhbGllblwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJhbGllbi5wbmdcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAucG5nYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBNdWx0aSBBdGxhcyBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNtdWx0aWF0bGFzXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5NdWx0aUF0bGFzRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5NdWx0aUF0bGFzRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2F0bGFzVVJMXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGUgdGV4dHVyZSBhdGxhcyBqc29uIGRhdGEgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSB0ZXh0dXJlcyBkZWZpbmVkIGluIHRoZSBhdGxhcyBkYXRhLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VVUkxdIC0gT3B0aW9uYWwgQmFzZSBVUkwgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgdGV4dHVyZXMgZGVmaW5lZCBpbiB0aGUgYXRsYXMgZGF0YS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbYXRsYXNYaHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBhdGxhcyBqc29uIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdtdWx0aWF0bGFzJywgZnVuY3Rpb24gKGtleSwgYXRsYXNVUkwsIHBhdGgsIGJhc2VVUkwsIGF0bGFzWGhyU2V0dGluZ3MpXHJcbntcclxuICAgIHZhciBtdWx0aWZpbGU7XHJcblxyXG4gICAgLy8gIFN1cHBvcnRzIGFuIE9iamVjdCBmaWxlIGRlZmluaXRpb24gaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGEgc2luZ2xlIGVudHJ5IHdoZXJlIGFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIGRlZmluZWRcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbXVsdGlmaWxlID0gbmV3IE11bHRpQXRsYXNGaWxlKHRoaXMsIGtleVtpXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobXVsdGlmaWxlLmZpbGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgbXVsdGlmaWxlID0gbmV3IE11bHRpQXRsYXNGaWxlKHRoaXMsIGtleSwgYXRsYXNVUkwsIHBhdGgsIGJhc2VVUkwsIGF0bGFzWGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEZpbGUobXVsdGlmaWxlLmZpbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE11bHRpQXRsYXNGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBNdWx0aUZpbGUgPSByZXF1aXJlKCcuLi9NdWx0aUZpbGUuanMnKTtcclxudmFyIFNjcmlwdEZpbGUgPSByZXF1aXJlKCcuL1NjcmlwdEZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgTXVsdGkgU2NyaXB0IEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY3JpcHRzIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY3JpcHRzLlxyXG4gKlxyXG4gKiBAY2xhc3MgTXVsdGlTY3JpcHRGaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuTXVsdGlGaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLk11bHRpU2NyaXB0RmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3VybF0gLSBBbiBhcnJheSBvZiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkxzIHRvIGxvYWQgdGhlIHNjcmlwdCBmaWxlcyBmcm9tLiBUaGV5IGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGdpdmVuIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgc2NyaXB0IGZpbGVzLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKi9cclxudmFyIE11bHRpU2NyaXB0RmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogTXVsdGlGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTXVsdGlTY3JpcHRGaWxlIChsb2FkZXIsIGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ2pzJztcclxuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2V4dGVuc2lvbicsIGV4dGVuc2lvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHVybCA9IFsgdXJsIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVybC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY3JpcHRGaWxlID0gbmV3IFNjcmlwdEZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSArICdfJyArIGkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHVybDogdXJsW2ldLFxyXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3NcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25Qcm9jZXNzIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgIHNjcmlwdEZpbGUub25Qcm9jZXNzID0gZnVuY3Rpb24gKClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZmlsZXMucHVzaChzY3JpcHRGaWxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ3NjcmlwdHMnLCBrZXksIGZpbGVzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoaXMgZmlsZSB0byBpdHMgdGFyZ2V0IGNhY2hlIHVwb24gc3VjY2Vzc2Z1bCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuTXVsdGlTY3JpcHRGaWxlI2FkZFRvQ2FjaGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5VG9Qcm9jZXNzKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWxlLmRhdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgIGZpbGUuZGF0YS5sYW5ndWFnZSA9ICdqYXZhc2NyaXB0JztcclxuICAgICAgICAgICAgICAgIGZpbGUuZGF0YS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgICAgICAgICBmaWxlLmRhdGEuZGVmZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZpbGUuZGF0YS50ZXh0ID0gZmlsZS54aHJMb2FkZXIucmVzcG9uc2VUZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZmlsZS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBhcnJheSBvZiBTY3JpcHQgZmlsZXMgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCB0aGUgYFNjcmlwdEZpbGVgIGZpbGUgdHlwZSBpcyB0aGF0IHlvdSBnaXZlIGFuIGFycmF5IG9mIHNjcmlwdHMgdG8gdGhpcyBtZXRob2QsXHJcbiAqIGFuZCB0aGUgc2NyaXB0cyBhcmUgdGhlbiBwcm9jZXNzZWQgX2V4YWN0bHlfIGluIHRoYXQgb3JkZXIuIFRoaXMgYWxsb3dzIHlvdSB0byBsb2FkIGEgYnVuY2ggb2Ygc2NyaXB0cyB0aGF0XHJcbiAqIG1heSBoYXZlIGRlcGVuZGVuY2llcyBvbiBlYWNoIG90aGVyIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlIGFzeW5jIG5hdHVyZSBvZiB0cmFkaXRpb25hbCBzY3JpcHQgbG9hZGluZy5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQuc2NyaXB0cygnUG9zdFByb2Nlc3MnLCBbXHJcbiAqICAgICAgICAgJ2xpYnMvc2hhZGVycy9Db3B5U2hhZGVyLmpzJyxcclxuICogICAgICAgICAnbGlicy9wb3N0cHJvY2Vzc2luZy9FZmZlY3RDb21wb3Nlci5qcycsXHJcbiAqICAgICAgICAgJ2xpYnMvcG9zdHByb2Nlc3NpbmcvUmVuZGVyUGFzcy5qcycsXHJcbiAqICAgICAgICAgJ2xpYnMvcG9zdHByb2Nlc3NpbmcvTWFza1Bhc3MuanMnLFxyXG4gKiAgICAgICAgICdsaWJzL3Bvc3Rwcm9jZXNzaW5nL1NoYWRlclBhc3MuanMnLFxyXG4gKiAgICAgICAgICdsaWJzL3Bvc3Rwcm9jZXNzaW5nL0FmdGVyaW1hZ2VQYXNzLmpzJ1xyXG4gKiAgICBdKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogSW4gdGhlIGNvZGUgYWJvdmUgdGhlIHNjcmlwdCBmaWxlcyB3aWxsIGFsbCBiZSBsb2FkZWQgaW4gcGFyYWxsZWwgYnV0IG9ubHkgcHJvY2Vzc2VkIChpLmUuIGludm9rZWQpIGluIHRoZSBleGFjdFxyXG4gKiBvcmRlciBnaXZlbiBpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRoZSBmaWxlcyBhcmUgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gVGhleSBhcmUgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGVzIGFyZSBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGVzIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlcyB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZyBhbmQgbm90IGFscmVhZHkgaW4tdXNlIGJ5IGFub3RoZXIgZmlsZSBpbiB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5zY3JpcHRzKHtcclxuICogICAgIGtleTogJ1Bvc3RQcm9jZXNzJyxcclxuICogICAgIHVybDogW1xyXG4gKiAgICAgICAgICdsaWJzL3NoYWRlcnMvQ29weVNoYWRlci5qcycsXHJcbiAqICAgICAgICAgJ2xpYnMvcG9zdHByb2Nlc3NpbmcvRWZmZWN0Q29tcG9zZXIuanMnLFxyXG4gKiAgICAgICAgICdsaWJzL3Bvc3Rwcm9jZXNzaW5nL1JlbmRlclBhc3MuanMnLFxyXG4gKiAgICAgICAgICdsaWJzL3Bvc3Rwcm9jZXNzaW5nL01hc2tQYXNzLmpzJyxcclxuICogICAgICAgICAnbGlicy9wb3N0cHJvY2Vzc2luZy9TaGFkZXJQYXNzLmpzJyxcclxuICogICAgICAgICAnbGlicy9wb3N0cHJvY2Vzc2luZy9BZnRlcmltYWdlUGFzcy5qcydcclxuICogICAgICAgIF1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5NdWx0aVNjcmlwdEZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgYWxsIHRoZSBmaWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgdGhleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY29udmVydGVkIGludG8gYSBzY3JpcHQgZWxlbWVudFxyXG4gKiB2aWEgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpYC4gVGhleSB3aWxsIGhhdmUgdGhlaXIgbGFuZ3VhZ2Ugc2V0IHRvIEphdmFTY3JpcHQsIGBkZWZlcmAgc2V0IHRvXHJcbiAqIGZhbHNlIGFuZCB0aGVuIHRoZSByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkIHRvIGBkb2N1bWVudC5oZWFkYC4gQW55IGNvZGUgdGhlbiBpbiB0aGVcclxuICogc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQuIFRoaXMgaXMgZG9uZSBpbiB0aGUgZXhhY3Qgb3JkZXIgdGhlIGZpbGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHVybCBhcnJheS5cclxuICpcclxuICogVGhlIFVSTHMgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMcyBhcmUgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZW0uXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgTXVsdGlTY3JpcHQgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NyaXB0c1xyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjE3LjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLk11bHRpU2NyaXB0RmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5NdWx0aVNjcmlwdEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3VybF0gLSBBbiBhcnJheSBvZiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkxzIHRvIGxvYWQgdGhlIHNjcmlwdCBmaWxlcyBmcm9tLiBUaGV5IGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGdpdmVuIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtleHRlbnNpb249J2pzJ10gLSBUaGUgZGVmYXVsdCBmaWxlIGV4dGVuc2lvbiB0byB1c2UgaWYgbm8gdXJsIGlzIHByb3ZpZGVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGVzZSBmaWxlcy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ3NjcmlwdHMnLCBmdW5jdGlvbiAoa2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICB2YXIgbXVsdGlmaWxlO1xyXG5cclxuICAgIC8vICBTdXBwb3J0cyBhbiBPYmplY3QgZmlsZSBkZWZpbml0aW9uIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhbiBhcnJheSBvZiBvYmplY3RzIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhIHNpbmdsZSBlbnRyeSB3aGVyZSBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBkZWZpbmVkXHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG11bHRpZmlsZSA9IG5ldyBNdWx0aVNjcmlwdEZpbGUodGhpcywga2V5W2ldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBtdWx0aWZpbGUgPSBuZXcgTXVsdGlTY3JpcHRGaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTXVsdGlTY3JpcHRGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgSlNPTkZpbGUgPSByZXF1aXJlKCcuL0pTT05GaWxlLmpzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBKU09OIFBhY2sgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3BhY2sgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3BhY2suXHJcbiAqXHJcbiAqIEBjbGFzcyBQYWNrRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy43LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5QYWNrRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YUtleV0gLSBXaGVuIHRoZSBKU09OIGZpbGUgbG9hZHMgb25seSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBDYWNoZS5cclxuICovXHJcbnZhciBQYWNrRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogSlNPTkZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICAvLyAgdXJsIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgaXMgdHJlYXRlZCBsaWtlIGEgcHJvcGVyIHVybCwgb3IgYW4gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGl0IGlzIHRyZWF0ZWQgYXMgYSByZWFkeS1tYWRlIEpTIE9iamVjdFxyXG4gICAgLy8gIGRhdGFLZXkgYWxsb3dzIHlvdSB0byBwbHVjayBhIHNwZWNpZmljIG9iamVjdCBvdXQgb2YgdGhlIEpTT04gYW5kIHB1dCBqdXN0IHRoYXQgaW50byB0aGUgY2FjaGUsIHJhdGhlciB0aGFuIHRoZSB3aG9sZSB0aGluZ1xyXG5cclxuICAgIGZ1bmN0aW9uIFBhY2tGaWxlIChsb2FkZXIsIGtleSwgdXJsLCB4aHJTZXR0aW5ncywgZGF0YUtleSlcclxuICAgIHtcclxuICAgICAgICBKU09ORmlsZS5jYWxsKHRoaXMsIGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzLCBkYXRhS2V5KTtcclxuXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ3BhY2tmaWxlJztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5QYWNrRmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IENPTlNULkZJTEVfUE9QVUxBVEVEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UodGhpcy54aHJMb2FkZXIucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBMZXQncyBwYXNzIHRoZSBwYWNrIGZpbGUgZGF0YSBvdmVyIHRvIHRoZSBMb2FkZXIgLi4uXHJcbiAgICAgICAgdGhpcy5sb2FkZXIuYWRkUGFjayh0aGlzLmRhdGEsIHRoaXMuY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhIEpTT04gRmlsZSBQYWNrLCBvciBhcnJheSBvZiBwYWNrcywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQucGFjaygnbGV2ZWwxJywgJ2RhdGEvTGV2ZWwxRmlsZXMuanNvbicpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBBIEZpbGUgUGFjayBpcyBhIEpTT04gZmlsZSAob3Igb2JqZWN0KSB0aGF0IGNvbnRhaW5zIGRldGFpbHMgYWJvdXQgb3RoZXIgZmlsZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQgaW50byB0aGUgTG9hZGVyLlxyXG4gKiBIZXJlIGlzIGEgc21hbGwgZXhhbXBsZTpcclxuICpcclxuICogYGBganNvblxyXG4gKiB7XHJcbiAqICAgIFwidGVzdDFcIjoge1xyXG4gKiAgICAgICAgXCJmaWxlc1wiOiBbXHJcbiAqICAgICAgICAgICAge1xyXG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZVwiLFxyXG4gKiAgICAgICAgICAgICAgICBcImtleVwiOiBcInRhaWtvZHJ1bW1hc3RlclwiLFxyXG4gKiAgICAgICAgICAgICAgICBcInVybFwiOiBcImFzc2V0cy9waWNzL3RhaWtvZHJ1bW1hc3Rlci5qcGdcIlxyXG4gKiAgICAgICAgICAgIH0sXHJcbiAqICAgICAgICAgICAge1xyXG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbWFnZVwiLFxyXG4gKiAgICAgICAgICAgICAgICBcImtleVwiOiBcInN1a2FzdWthLWNodGhvbGx5XCIsXHJcbiAqICAgICAgICAgICAgICAgIFwidXJsXCI6IFwiYXNzZXRzL3BpY3Mvc3VrYXN1a2EtY2h0aG9sbHkucG5nXCJcclxuICogICAgICAgICAgICB9XHJcbiAqICAgICAgICBdXHJcbiAqICAgIH0sXHJcbiAqICAgIFwibWV0YVwiOiB7XHJcbiAqICAgICAgICBcImdlbmVyYXRlZFwiOiBcIjE0MDEzODAzMjczNzNcIixcclxuICogICAgICAgIFwiYXBwXCI6IFwiUGhhc2VyIDMgQXNzZXQgUGFja2VyXCIsXHJcbiAqICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vcGhhc2VyLmlvXCIsXHJcbiAqICAgICAgICBcInZlcnNpb25cIjogXCIxLjBcIixcclxuICogICAgICAgIFwiY29weXJpZ2h0XCI6IFwiUGhvdG9uIFN0b3JtIEx0ZC4gMjAxOFwiXHJcbiAqICAgIH1cclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIHBhY2sgY2FuIGJlIHNwbGl0IGludG8gc2VjdGlvbnMuIEluIHRoZSBleGFtcGxlIGFib3ZlIHlvdSdsbCBzZWUgYSBzZWN0aW9uIGNhbGxlZCBgdGVzdDEuIFlvdSBjYW4gdGVsbFxyXG4gKiB0aGUgYGxvYWQucGFja2AgbWV0aG9kIHRvIHBhcnNlIG9ubHkgYSBwYXJ0aWN1bGFyIHNlY3Rpb24gb2YgYSBwYWNrLiBUaGUgcGFjayBpcyBzdG9yZWQgaW4gdGhlIEpTT04gQ2FjaGUsXHJcbiAqIHNvIHlvdSBjYW4gcGFzcyBpdCB0byB0aGUgTG9hZGVyIHRvIHByb2Nlc3MgYWRkaXRpb25hbCBzZWN0aW9ucyBhcyBuZWVkZWQgaW4geW91ciBnYW1lLCBvciB5b3UgY2FuIGp1c3QgbG9hZFxyXG4gKiB0aGVtIGFsbCBhdCBvbmNlIHdpdGhvdXQgc3BlY2lmeWluZyBhbnl0aGluZy5cclxuICpcclxuICogVGhlIHBhY2sgZmlsZSBjYW4gY29udGFpbiBhbiBlbnRyeSBmb3IgYW55IHR5cGUgb2YgZmlsZSB0aGF0IFBoYXNlciBjYW4gbG9hZC4gVGhlIG9iamVjdCBzdHJ1Y3R1cmVzIGV4YWN0bHlcclxuICogbWF0Y2ggdGhhdCBvZiB0aGUgZmlsZSB0eXBlIGNvbmZpZ3MsIGFuZCBhbGwgcHJvcGVydGllcyBhdmFpbGFibGUgd2l0aGluIHRoZSBmaWxlIHR5cGUgY29uZmlncyBjYW4gYmUgdXNlZFxyXG4gKiBpbiB0aGUgcGFjayBmaWxlIHRvby5cclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBJZiB5b3UgY2FsbCB0aGlzIGZyb20gb3V0c2lkZSBvZiBgcHJlbG9hZGAgdGhlbiB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBzdGFydGluZyB0aGUgTG9hZGVyIGFmdGVyd2FyZHMgYW5kIG1vbml0b3JpbmdcclxuICogaXRzIGV2ZW50cyB0byBrbm93IHdoZW4gaXQncyBzYWZlIHRvIHVzZSB0aGUgYXNzZXQuIFBsZWFzZSBzZWUgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luIGNsYXNzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgSlNPTiBDYWNoZSB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgSlNPTiBDYWNoZS5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIEpTT04gQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQucGFjayh7XHJcbiAqICAgICBrZXk6ICdsZXZlbDEnLFxyXG4gKiAgICAgdXJsOiAnZGF0YS9MZXZlbDFGaWxlcy5qc29uJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlBhY2tGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBXYXZlc2AgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuV2F2ZXNgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBKU09OIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImRhdGFcIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiZGF0YS5qc29uXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmpzb25gIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFsc28gb3B0aW9uYWxseSBwcm92aWRlIGEgYGRhdGFLZXlgIHRvIHVzZS4gVGhpcyBhbGxvd3MgeW91IHRvIGV4dHJhY3Qgb25seSBhIHBhcnQgb2YgdGhlIEpTT04gYW5kIHN0b3JlIGl0IGluIHRoZSBDYWNoZSxcclxuICogcmF0aGVyIHRoYW4gdGhlIHdob2xlIGZpbGUuIEZvciBleGFtcGxlLCBpZiB5b3VyIEpTT04gZGF0YSBoYWQgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOlxyXG4gKlxyXG4gKiBgYGBqc29uXHJcbiAqIHtcclxuICogICAgIFwibGV2ZWwxXCI6IHtcclxuICogICAgICAgICBcImJhZGRpZXNcIjoge1xyXG4gKiAgICAgICAgICAgICBcImFsaWVuc1wiOiB7fSxcclxuICogICAgICAgICAgICAgXCJib3NzXCI6IHt9XHJcbiAqICAgICAgICAgfVxyXG4gKiAgICAgfSxcclxuICogICAgIFwibGV2ZWwyXCI6IHt9LFxyXG4gKiAgICAgXCJsZXZlbDNcIjoge31cclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQW5kIHlvdSBvbmx5IHdhbnRlZCB0byBzdG9yZSB0aGUgYGJvc3NgIGRhdGEgaW4gdGhlIENhY2hlLCB0aGVuIHlvdSBjb3VsZCBwYXNzIGBsZXZlbDEuYmFkZGllcy5ib3NzYGFzIHRoZSBgZGF0YUtleWAuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgUGFjayBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNwYWNrXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5QYWNrRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5QYWNrRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+Lmpzb25gLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc29uXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YUtleV0gLSBXaGVuIHRoZSBKU09OIGZpbGUgbG9hZHMgb25seSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBDYWNoZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcigncGFjaycsIGZ1bmN0aW9uIChrZXksIHVybCwgcGFja0tleSwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIC8vICBTdXBwb3J0cyBhbiBPYmplY3QgZmlsZSBkZWZpbml0aW9uIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhbiBhcnJheSBvZiBvYmplY3RzIGluIHRoZSBrZXkgYXJndW1lbnRcclxuICAgIC8vICBPciBhIHNpbmdsZSBlbnRyeSB3aGVyZSBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBkZWZpbmVkXHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShuZXcgUGFja0ZpbGUodGhpcywga2V5W2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsZShuZXcgUGFja0ZpbGUodGhpcywga2V5LCB1cmwsIHhoclNldHRpbmdzLCBwYWNrS2V5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYWNrRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRmlsZSA9IHJlcXVpcmUoJy4uL0ZpbGUnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFBsdWdpbiBTY3JpcHQgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3BsdWdpbiBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jcGx1Z2luLlxyXG4gKlxyXG4gKiBAY2xhc3MgUGx1Z2luRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5QbHVnaW5GaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LmpzYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNcIi5cclxuICogQHBhcmFtIHtib29sZWFufSBbc3RhcnQ9ZmFsc2VdIC0gQXV0b21hdGljYWxseSBzdGFydCB0aGUgcGx1Z2luIGFmdGVyIGxvYWRpbmc/XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWFwcGluZ10gLSBJZiB0aGlzIHBsdWdpbiBpcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBTY2VuZSwgdGhpcyBpcyB0aGUgcHJvcGVydHkga2V5IHVzZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEV4dHJhIFhIUiBTZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZmlsZS5cclxuICovXHJcbnZhciBQbHVnaW5GaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUGx1Z2luRmlsZSAobG9hZGVyLCBrZXksIHVybCwgc3RhcnQsIG1hcHBpbmcsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnanMnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgc3RhcnQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3RhcnQnKTtcclxuICAgICAgICAgICAgbWFwcGluZyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdtYXBwaW5nJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlsZUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ3BsdWdpbicsXHJcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5ncyxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXHJcbiAgICAgICAgICAgICAgICBtYXBwaW5nOiBtYXBwaW5nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHVybCB2YXJpYWJsZSByZWZlcnMgdG8gYSBjbGFzcywgYWRkIHRoZSBwbHVnaW4gZGlyZWN0bHlcclxuICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHVybDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX1BPUFVMQVRFRDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuUGx1Z2luRmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBsdWdpbk1hbmFnZXIgPSB0aGlzLmxvYWRlci5zeXN0ZW1zLnBsdWdpbnM7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xyXG5cclxuICAgICAgICB2YXIgc3RhcnQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3RhcnQnLCBmYWxzZSk7XHJcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnbWFwcGluZycsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ09OU1QuRklMRV9QT1BVTEFURUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmluc3RhbGwodGhpcy5rZXksIHRoaXMuZGF0YSwgc3RhcnQsIG1hcHBpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUGx1Z2luIGFkZGVkIHZpYSBhIGpzIGZpbGVcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEubGFuZ3VhZ2UgPSAnamF2YXNjcmlwdCc7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5kZWZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEudGV4dCA9IHRoaXMueGhyTG9hZGVyLnJlc3BvbnNlVGV4dDtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwbHVnaW4gPSBwbHVnaW5NYW5hZ2VyLmluc3RhbGwodGhpcy5rZXksIHdpbmRvd1t0aGlzLmtleV0sIHN0YXJ0LCBtYXBwaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdGFydCB8fCBtYXBwaW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSW5zdGFsbCBpbnRvIHRoZSBjdXJyZW50IFNjZW5lIFN5c3RlbXMgYW5kIFNjZW5lXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlci5zeXN0ZW1zW21hcHBpbmddID0gcGx1Z2luO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZXIuc2NlbmVbbWFwcGluZ10gPSBwbHVnaW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSBQbHVnaW4gU2NyaXB0IGZpbGUsIG9yIGFycmF5IG9mIHBsdWdpbiBmaWxlcywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQucGx1Z2luKCdtb2RwbGF5ZXInLCAncGx1Z2lucy9Nb2RQbGF5ZXIuanMnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nIGFuZCBub3QgYWxyZWFkeSBpbi11c2UgYnkgYW5vdGhlciBmaWxlIGluIHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnBsdWdpbih7XHJcbiAqICAgICBrZXk6ICdtb2RwbGF5ZXInLFxyXG4gKiAgICAgdXJsOiAncGx1Z2lucy9Nb2RQbGF5ZXIuanMnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuUGx1Z2luRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY29udmVydGVkIGludG8gYSBzY3JpcHQgZWxlbWVudFxyXG4gKiB2aWEgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpYC4gSXQgd2lsbCBoYXZlIGl0cyBsYW5ndWFnZSBzZXQgdG8gSmF2YVNjcmlwdCwgYGRlZmVyYCBzZXQgdG9cclxuICogZmFsc2UgYW5kIHRoZW4gdGhlIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYmUgYXBwZW5kZWQgdG8gYGRvY3VtZW50LmhlYWRgLiBBbnkgY29kZSB0aGVuIGluIHRoZVxyXG4gKiBzY3JpcHQgd2lsbCBiZSBleGVjdXRlZC4gSXQgd2lsbCB0aGVuIGJlIHBhc3NlZCB0byB0aGUgUGhhc2VyIFBsdWdpbkNhY2hlLnJlZ2lzdGVyIG1ldGhvZC5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJhbGllblwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJhbGllbi5qc1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5qc2AgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgUGx1Z2luIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3BsdWdpblxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuUGx1Z2luRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5QbHVnaW5GaWxlQ29uZmlnW10pfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QsIG9yIGFycmF5IG9mIHRoZW0uXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbil9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzXCIuIE9yLCBhIHBsdWdpbiBmdW5jdGlvbi5cclxuICogQHBhcmFtIHtib29sZWFufSBbc3RhcnRdIC0gQXV0b21hdGljYWxseSBzdGFydCB0aGUgcGx1Z2luIGFmdGVyIGxvYWRpbmc/XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWFwcGluZ10gLSBJZiB0aGlzIHBsdWdpbiBpcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBTY2VuZSwgdGhpcyBpcyB0aGUgcHJvcGVydHkga2V5IHVzZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ3BsdWdpbicsIGZ1bmN0aW9uIChrZXksIHVybCwgc3RhcnQsIG1hcHBpbmcsIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIGl0J3MgYW4gYXJyYXkgaXQgaGFzIHRvIGJlIGFuIGFycmF5IG9mIE9iamVjdHMsIHNvIHdlIGdldCBldmVyeXRoaW5nIG91dCBvZiB0aGUgJ2tleScgb2JqZWN0XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShuZXcgUGx1Z2luRmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBQbHVnaW5GaWxlKHRoaXMsIGtleSwgdXJsLCBzdGFydCwgbWFwcGluZywgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBsdWdpbkZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBTVkcgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3N2ZyBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc3ZnLlxyXG4gKlxyXG4gKiBAY2xhc3MgU1ZHRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TVkdGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnN2Z2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnN2Z1wiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNWR1NpemVDb25maWd9IFtzdmdDb25maWddIC0gVGhlIHN2ZyBzaXplIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgU1ZHRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRmlsZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFNWR0ZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHN2Z0NvbmZpZywgeGhyU2V0dGluZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV4dGVuc2lvbiA9ICdzdmcnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICBzdmdDb25maWcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3ZnQ29uZmlnJywge30pO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnc3ZnJyxcclxuICAgICAgICAgICAgY2FjaGU6IGxvYWRlci50ZXh0dXJlTWFuYWdlcixcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5ncyxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogR2V0RmFzdFZhbHVlKHN2Z0NvbmZpZywgJ3dpZHRoJyksXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IEdldEZhc3RWYWx1ZShzdmdDb25maWcsICdoZWlnaHQnKSxcclxuICAgICAgICAgICAgICAgIHNjYWxlOiBHZXRGYXN0VmFsdWUoc3ZnQ29uZmlnLCAnc2NhbGUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuU1ZHRmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcbiAgICAgICAgdmFyIHN2ZyA9IFsgdGV4dCBdO1xyXG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMuY29uZmlnLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmNvbmZpZy5oZWlnaHQ7XHJcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5jb25maWcuc2NhbGU7XHJcblxyXG4gICAgICAgIHJlc2l6ZTogaWYgKHdpZHRoICYmIGhlaWdodCB8fCBzY2FsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB4bWwgPSBudWxsO1xyXG4gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgICAgICB4bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xyXG4gICAgICAgICAgICB2YXIgc3ZnWE1MID0geG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKVswXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBoYXNWaWV3Qm94ID0gc3ZnWE1MLmhhc0F0dHJpYnV0ZSgndmlld0JveCcpO1xyXG4gICAgICAgICAgICB2YXIgc3ZnV2lkdGggPSBwYXJzZUZsb2F0KHN2Z1hNTC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xyXG4gICAgICAgICAgICB2YXIgc3ZnSGVpZ2h0ID0gcGFyc2VGbG9hdChzdmdYTUwuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWhhc1ZpZXdCb3ggJiYgc3ZnV2lkdGggJiYgc3ZnSGVpZ2h0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSWYgdGhlcmUncyBubyB2aWV3Qm94IGF0dHJpYnV0ZSwgc2V0IG9uZVxyXG4gICAgICAgICAgICAgICAgc3ZnWE1MLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwICAwICcgKyBzdmdXaWR0aCArICcgJyArIHN2Z0hlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaGFzVmlld0JveCAmJiAhc3ZnV2lkdGggJiYgIXN2Z0hlaWdodClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEdldCB0aGUgdy9oIGZyb20gdGhlIHZpZXdib3hcclxuICAgICAgICAgICAgICAgIHZhciB2aWV3Qm94ID0gc3ZnWE1MLmdldEF0dHJpYnV0ZSgndmlld0JveCcpLnNwbGl0KC9cXHMrfCwvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdmdXaWR0aCA9IHZpZXdCb3hbMl07XHJcbiAgICAgICAgICAgICAgICBzdmdIZWlnaHQgPSB2aWV3Qm94WzNdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2NhbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdmdXaWR0aCAmJiBzdmdIZWlnaHQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBzdmdXaWR0aCAqIHNjYWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IHN2Z0hlaWdodCAqIHNjYWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlc2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3ZnWE1MLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB3aWR0aC50b1N0cmluZygpICsgJ3B4Jyk7XHJcbiAgICAgICAgICAgIHN2Z1hNTC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGhlaWdodC50b1N0cmluZygpICsgJ3B4Jyk7XHJcblxyXG4gICAgICAgICAgICBzdmcgPSBbIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhzdmdYTUwpIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBibG9iID0gbmV3IHdpbmRvdy5CbG9iKHN2ZywgeyB0eXBlOiAnaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04JyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm9uUHJvY2Vzc0Vycm9yKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgcmV0cnkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLm9ubG9hZCA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIXJldHJ5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBGaWxlLnJldm9rZU9iamVjdFVSTChfdGhpcy5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEub25lcnJvciA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2FmYXJpIDggcmUtdHJ5XHJcbiAgICAgICAgICAgIGlmICghcmV0cnkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBGaWxlLnJldm9rZU9iamVjdFVSTChfdGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhLnNyYyA9ICdkYXRhOmltYWdlL3N2Zyt4bWwsJyArIGVuY29kZVVSSUNvbXBvbmVudChzdmcuam9pbignJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25Qcm9jZXNzRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEZpbGUuY3JlYXRlT2JqZWN0VVJMKHRoaXMuZGF0YSwgYmxvYiwgJ2ltYWdlL3N2Zyt4bWwnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoaXMgZmlsZSB0byBpdHMgdGFyZ2V0IGNhY2hlIHVwb24gc3VjY2Vzc2Z1bCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuU1ZHRmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuY2FjaGUuYWRkSW1hZ2UodGhpcy5rZXksIHRoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3kodGV4dHVyZSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIFNWRyBGaWxlLCBvciBhcnJheSBvZiBTVkcgRmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuIFdoZW4gdGhlIGZpbGVzIGFyZSBsb2FkZWQgdGhleVxyXG4gKiB3aWxsIGJlIHJlbmRlcmVkIHRvIGJpdG1hcCB0ZXh0dXJlcyBhbmQgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnN2ZygnbW9ydHknLCAnaW1hZ2VzL01vcnR5LnN2ZycpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuc3ZnKHtcclxuICogICAgIGtleTogJ21vcnR5JyxcclxuICogICAgIHVybDogJ2ltYWdlcy9Nb3J0eS5zdmcnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuU1ZHRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIHVzZSBpdCBhcyBhIHRleHR1cmUgZm9yIGEgR2FtZSBPYmplY3QgYnkgcmVmZXJlbmNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuc3ZnKCdtb3J0eScsICdpbWFnZXMvTW9ydHkuc3ZnJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHRoaXMuYWRkLmltYWdlKHgsIHksICdtb3J0eScpO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYE1FTlUuYCBhbmQgdGhlIGtleSB3YXMgYEJhY2tncm91bmRgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgTUVOVS5CYWNrZ3JvdW5kYCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIGltYWdlIGZyb20gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJhbGllblwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJhbGllbi5odG1sXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmh0bWxgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBZb3UgY2FuIG9wdGlvbmFsbHkgcGFzcyBhbiBTVkcgUmVzaXplIENvbmZpZ3VyYXRpb24gb2JqZWN0IHdoZW4geW91IGxvYWQgYW4gU1ZHIGZpbGUuIEJ5IGRlZmF1bHQgdGhlIFNWRyB3aWxsIGJlIHJlbmRlcmVkIHRvIGEgdGV4dHVyZVxyXG4gKiBhdCB0aGUgc2FtZSBzaXplIGRlZmluZWQgaW4gdGhlIFNWRyBmaWxlIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIHRoaXMgaXNuJ3QgYWx3YXlzIGRlc2lyYWJsZS4gWW91IG1heSB3aXNoIHRvIHJlc2l6ZSB0aGUgU1ZHIChlaXRoZXIgZG93blxyXG4gKiBvciB1cCkgdG8gaW1wcm92ZSB0ZXh0dXJlIGNsYXJpdHksIG9yIHJlZHVjZSB0ZXh0dXJlIG1lbW9yeSBjb25zdW1wdGlvbi4gWW91IGNhbiBlaXRoZXIgc3BlY2lmeSBhbiBleGFjdCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHJlc2l6ZVxyXG4gKiB0aGUgU1ZHIHRvOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnN2ZygnbW9ydHknLCAnaW1hZ2VzL01vcnR5LnN2ZycsIHsgd2lkdGg6IDMwMCwgaGVpZ2h0OiA2MDAgfSk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIE9yIHdoZW4gdXNpbmcgYSBjb25maWd1cmF0aW9uIG9iamVjdDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuc3ZnKHtcclxuICogICAgIGtleTogJ21vcnR5JyxcclxuICogICAgIHVybDogJ2ltYWdlcy9Nb3J0eS5zdmcnLFxyXG4gKiAgICAgc3ZnQ29uZmlnOiB7XHJcbiAqICAgICAgICAgd2lkdGg6IDMwMCxcclxuICogICAgICAgICBoZWlnaHQ6IDYwMFxyXG4gKiAgICAgfVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4ganVzdCBwcm92aWRlIGEgc2NhbGUgZmFjdG9yIGluc3RlYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQuc3ZnKCdtb3J0eScsICdpbWFnZXMvTW9ydHkuc3ZnJywgeyBzY2FsZTogMi41IH0pO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBPciB3aGVuIHVzaW5nIGEgY29uZmlndXJhdGlvbiBvYmplY3Q6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnN2Zyh7XHJcbiAqICAgICBrZXk6ICdtb3J0eScsXHJcbiAqICAgICB1cmw6ICdpbWFnZXMvTW9ydHkuc3ZnJyxcclxuICogICAgIHN2Z0NvbmZpZzoge1xyXG4gKiAgICAgICAgIHNjYWxlOiAyLjVcclxuICogICAgIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiBzY2FsZSwgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgYXJlIGFsbCBnaXZlbiwgdGhlIHNjYWxlIGhhcyBwcmlvcml0eSBhbmQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIGFyZSBpZ25vcmVkLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFNWRyBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzdmdcclxuICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI0FERFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNWR0ZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuU1ZHRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnN2Z2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnN2Z1wiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNWR1NpemVDb25maWd9IFtzdmdDb25maWddIC0gVGhlIHN2ZyBzaXplIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCdzdmcnLCBmdW5jdGlvbiAoa2V5LCB1cmwsIHN2Z0NvbmZpZywgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBTVkdGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFNWR0ZpbGUodGhpcywga2V5LCB1cmwsIHN2Z0NvbmZpZywgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNWR0ZpbGU7XHJcblxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQW4gZXh0ZXJuYWwgU2NlbmUgSmF2YVNjcmlwdCBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NlbmVGaWxlIG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY2VuZUZpbGUuXHJcbiAqXHJcbiAqIEBjbGFzcyBTY2VuZUZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjZW5lRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEV4dHJhIFhIUiBTZXR0aW5ncyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZmlsZS5cclxuICovXHJcbnZhciBTY2VuZUZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBTY2VuZUZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnanMnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBsb2FkZXIuY2FjaGVNYW5hZ2VyLnRleHQsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3NcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5TY2VuZUZpbGUjb25Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgIHRoaXMub25Qcm9jZXNzQ29tcGxldGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoaXMgZmlsZSB0byBpdHMgdGFyZ2V0IGNhY2hlIHVwb24gc3VjY2Vzc2Z1bCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuU2NlbmVGaWxlI2FkZFRvQ2FjaGVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY29kZSA9IHRoaXMuZGF0YS5jb25jYXQoJyhmdW5jdGlvbigpe1xcbicgKyAncmV0dXJuIG5ldyAnICsgdGhpcy5rZXkgKyAnKCk7XFxuJyArICd9KS5jYWxsKHRoaXMpOycpO1xyXG5cclxuICAgICAgICAvLyAgU3RvcHMgcm9sbHVwIGZyb20gZnJlYWtpbmcgb3V0IGR1cmluZyBidWlsZFxyXG4gICAgICAgIHZhciBldmFsMiA9IGV2YWw7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGVyLnNjZW5lTWFuYWdlci5hZGQodGhpcy5rZXksIGV2YWwyKGNvZGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIGV4dGVybmFsIFNjZW5lIGZpbGUsIG9yIGFycmF5IG9mIFNjZW5lIGZpbGVzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5zY2VuZUZpbGUoJ0xldmVsMScsICdzcmMvTGV2ZWwxLmpzJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBTY2VuZSBNYW5hZ2VyIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqXHJcbiAqIEZvciBhIFNjZW5lIEZpbGUgaXQncyB2aXRhbGx5IGltcG9ydGFudCB0aGF0IHRoZSBrZXkgbWF0Y2hlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgSmF2YVNjcmlwdCBmaWxlLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSBoZXJlIGlzIHRoZSBzb3VyY2UgZmlsZTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjbGFzcyBFeHRlcm5hbFNjZW5lIGV4dGVuZHMgUGhhc2VyLlNjZW5lIHtcclxuICpcclxuICogICAgIGNvbnN0cnVjdG9yICgpXHJcbiAqICAgICB7XHJcbiAqICAgICAgICAgc3VwZXIoJ215U2NlbmUnKTtcclxuICogICAgIH1cclxuICpcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogQmVjYXVzZSB0aGUgY2xhc3MgaXMgY2FsbGVkIGBFeHRlcm5hbFNjZW5lYCB0aGF0IGlzIHRoZSBleGFjdCBzYW1lIGtleSB5b3UgbXVzdCB1c2Ugd2hlbiBsb2FkaW5nIGl0OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnNjZW5lRmlsZSgnRXh0ZXJuYWxTY2VuZScsICdzcmMveW91clNjZW5lLmpzJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBrZXkgdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU2NlbmUgTWFuYWdlciBjYW4gZWl0aGVyIGJlIHNldCB0byB0aGUgc2FtZSwgb3IgeW91IGNhbiBvdmVycmlkZSBpdCBpbiB0aGUgU2NlbmVcclxuICogY29uc3RydWN0b3IsIGFzIHdlJ3ZlIGRvbmUgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHdoZXJlIHRoZSBTY2VuZSBrZXkgd2FzIGNoYW5nZWQgdG8gYG15U2NlbmVgLlxyXG4gKlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIFNjZW5lcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFNjZW5lIE1hbmFnZXIuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBTY2VuZSBNYW5hZ2VyIGZpcnN0LCBiZWZvcmUgbG9hZGluZyBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnNjZW5lRmlsZSh7XHJcbiAqICAgICBrZXk6ICdMZXZlbDEnLFxyXG4gKiAgICAgdXJsOiAnc3JjL0xldmVsMS5qcydcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TY2VuZUZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgU2NlbmUgTWFuYWdlci5cclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQuc2NlbmVGaWxlKCdMZXZlbDEnLCAnc3JjL0xldmVsMS5qcycpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLnNjZW5lLnN0YXJ0KCdMZXZlbDEnKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIHNwZWNpZmllZCBhIHByZWZpeCBpbiB0aGUgbG9hZGVyLCB2aWEgYExvYWRlci5zZXRQcmVmaXhgIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGlzIGZpbGVzXHJcbiAqIGtleS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggd2FzIGBXT1JMRDEuYCBhbmQgdGhlIGtleSB3YXMgYFN0b3J5YCB0aGUgZmluYWwga2V5IHdpbGwgYmUgYFdPUkxEMS5TdG9yeWAgYW5kXHJcbiAqIHRoaXMgaXMgd2hhdCB5b3Ugd291bGQgdXNlIHRvIHJldHJpZXZlIHRoZSB0ZXh0IGZyb20gdGhlIFNjZW5lIE1hbmFnZXIuXHJcbiAqXHJcbiAqIFRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMIGlzIHJlbGF0aXZlIHRoZSBgTG9hZGVyLmJhc2VVUkxgIGFuZCBgTG9hZGVyLnBhdGhgIHZhbHVlcyB3aWxsIGJlIHByZXBlbmRlZCB0byBpdC5cclxuICpcclxuICogSWYgdGhlIFVSTCBpc24ndCBzcGVjaWZpZWQgdGhlIExvYWRlciB3aWxsIHRha2UgdGhlIGtleSBhbmQgY3JlYXRlIGEgZmlsZW5hbWUgZnJvbSB0aGF0LiBGb3IgZXhhbXBsZSBpZiB0aGUga2V5IGlzIFwic3RvcnlcIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwic3RvcnkuanNcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuanNgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFNjZW5lIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NjZW5lRmlsZVxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjZW5lRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TY2VuZUZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ3NjZW5lRmlsZScsIGZ1bmN0aW9uIChrZXksIHVybCwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBTY2VuZUZpbGUodGhpcywga2V5W2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsZShuZXcgU2NlbmVGaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2NlbmVGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgU2NlbmUgUGx1Z2luIFNjcmlwdCBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NlbmVQbHVnaW4gbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3NjZW5lUGx1Z2luLlxyXG4gKlxyXG4gKiBAY2xhc3MgU2NlbmVQbHVnaW5GaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjZW5lUGx1Z2luRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3lzdGVtS2V5XSAtIElmIHRoaXMgcGx1Z2luIGlzIHRvIGJlIGFkZGVkIHRvIFNjZW5lLlN5c3RlbXMsIHRoaXMgaXMgdGhlIHByb3BlcnR5IGtleSBmb3IgaXQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2NlbmVLZXldIC0gSWYgdGhpcyBwbHVnaW4gaXMgdG8gYmUgYWRkZWQgdG8gdGhlIFNjZW5lLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSBrZXkgZm9yIGl0LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgU2NlbmVQbHVnaW5GaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2NlbmVQbHVnaW5GaWxlIChsb2FkZXIsIGtleSwgdXJsLCBzeXN0ZW1LZXksIHNjZW5lS2V5LCB4aHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ2pzJztcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2V4dGVuc2lvbicsIGV4dGVuc2lvbik7XHJcbiAgICAgICAgICAgIHN5c3RlbUtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdzeXN0ZW1LZXknKTtcclxuICAgICAgICAgICAgc2NlbmVLZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2NlbmVLZXknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnc2NlbmVQbHVnaW4nLFxyXG4gICAgICAgICAgICBjYWNoZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgc3lzdGVtS2V5OiBzeXN0ZW1LZXksXHJcbiAgICAgICAgICAgICAgICBzY2VuZUtleTogc2NlbmVLZXlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsIGZpbGVDb25maWcpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgdXJsIHZhcmlhYmxlIHJlZmVycyB0byBhIGNsYXNzLCBhZGQgdGhlIHBsdWdpbiBkaXJlY3RseVxyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0gdXJsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUE9QVUxBVEVEO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5TY2VuZVBsdWdpbkZpbGUjb25Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqL1xyXG4gICAgb25Qcm9jZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwbHVnaW5NYW5hZ2VyID0gdGhpcy5sb2FkZXIuc3lzdGVtcy5wbHVnaW5zO1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZztcclxuXHJcbiAgICAgICAgdmFyIGtleSA9IHRoaXMua2V5O1xyXG4gICAgICAgIHZhciBzeXN0ZW1LZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3lzdGVtS2V5Jywga2V5KTtcclxuICAgICAgICB2YXIgc2NlbmVLZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2NlbmVLZXknLCBrZXkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ09OU1QuRklMRV9QT1BVTEFURUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmluc3RhbGxTY2VuZVBsdWdpbihzeXN0ZW1LZXksIHRoaXMuZGF0YSwgc2NlbmVLZXksIHRoaXMubG9hZGVyLnNjZW5lLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFBsdWdpbiBhZGRlZCB2aWEgYSBqcyBmaWxlXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX1BST0NFU1NJTkc7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmxhbmd1YWdlID0gJ2phdmFzY3JpcHQnO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuZGVmZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLnRleHQgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmluc3RhbGxTY2VuZVBsdWdpbihzeXN0ZW1LZXksIHdpbmRvd1t0aGlzLmtleV0sIHNjZW5lS2V5LCB0aGlzLmxvYWRlci5zY2VuZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgU2NlbmUgUGx1Z2luIFNjcmlwdCBmaWxlLCBvciBhcnJheSBvZiBwbHVnaW4gZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnNjZW5lUGx1Z2luKCdNb2RQbGF5ZXInLCAncGx1Z2lucy9Nb2RQbGF5ZXIuanMnLCAnbW9kUGxheWVyJywgJ21vZHMnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nIGFuZCBub3QgYWxyZWFkeSBpbi11c2UgYnkgYW5vdGhlciBmaWxlIGluIHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnNjZW5lUGx1Z2luKHtcclxuICogICAgIGtleTogJ21vZHBsYXllcicsXHJcbiAqICAgICB1cmw6ICdwbHVnaW5zL01vZFBsYXllci5qcydcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TY2VuZVBsdWdpbkZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNvbnZlcnRlZCBpbnRvIGEgc2NyaXB0IGVsZW1lbnRcclxuICogdmlhIGBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKWAuIEl0IHdpbGwgaGF2ZSBpdHMgbGFuZ3VhZ2Ugc2V0IHRvIEphdmFTY3JpcHQsIGBkZWZlcmAgc2V0IHRvXHJcbiAqIGZhbHNlIGFuZCB0aGVuIHRoZSByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkIHRvIGBkb2N1bWVudC5oZWFkYC4gQW55IGNvZGUgdGhlbiBpbiB0aGVcclxuICogc2NyaXB0IHdpbGwgYmUgZXhlY3V0ZWQuIEl0IHdpbGwgdGhlbiBiZSBwYXNzZWQgdG8gdGhlIFBoYXNlciBQbHVnaW5DYWNoZS5yZWdpc3RlciBtZXRob2QuXHJcbiAqXHJcbiAqIFRoZSBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMIGlzIHJlbGF0aXZlIHRoZSBgTG9hZGVyLmJhc2VVUkxgIGFuZCBgTG9hZGVyLnBhdGhgIHZhbHVlcyB3aWxsIGJlIHByZXBlbmRlZCB0byBpdC5cclxuICpcclxuICogSWYgdGhlIFVSTCBpc24ndCBzcGVjaWZpZWQgdGhlIExvYWRlciB3aWxsIHRha2UgdGhlIGtleSBhbmQgY3JlYXRlIGEgZmlsZW5hbWUgZnJvbSB0aGF0LiBGb3IgZXhhbXBsZSBpZiB0aGUga2V5IGlzIFwiYWxpZW5cIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiYWxpZW4uanNcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuanNgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFNjcmlwdCBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY2VuZVBsdWdpblxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuU2NlbmVQbHVnaW5GaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjZW5lUGx1Z2luRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uanNgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc1wiLiBPciwgc2V0IHRvIGEgcGx1Z2luIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N5c3RlbUtleV0gLSBJZiB0aGlzIHBsdWdpbiBpcyB0byBiZSBhZGRlZCB0byBTY2VuZS5TeXN0ZW1zLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSBrZXkgZm9yIGl0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NjZW5lS2V5XSAtIElmIHRoaXMgcGx1Z2luIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBTY2VuZSwgdGhpcyBpcyB0aGUgcHJvcGVydHkga2V5IGZvciBpdC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3Rlcignc2NlbmVQbHVnaW4nLCBmdW5jdGlvbiAoa2V5LCB1cmwsIHN5c3RlbUtleSwgc2NlbmVLZXksIHhoclNldHRpbmdzKVxyXG57XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIGl0J3MgYW4gYXJyYXkgaXQgaGFzIHRvIGJlIGFuIGFycmF5IG9mIE9iamVjdHMsIHNvIHdlIGdldCBldmVyeXRoaW5nIG91dCBvZiB0aGUgJ2tleScgb2JqZWN0XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShuZXcgU2NlbmVQbHVnaW5GaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFNjZW5lUGx1Z2luRmlsZSh0aGlzLCBrZXksIHVybCwgc3lzdGVtS2V5LCBzY2VuZUtleSwgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNjZW5lUGx1Z2luRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRmlsZSA9IHJlcXVpcmUoJy4uL0ZpbGUnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFNjcmlwdCBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NyaXB0IG1ldGhvZCBhbmQgYXJlIG5vdCB0eXBpY2FsbHkgY3JlYXRlZCBkaXJlY3RseS5cclxuICpcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzY3JpcHQuXHJcbiAqXHJcbiAqIEBjbGFzcyBTY3JpcHRGaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjcmlwdEZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uanNgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5qc1wiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgU2NyaXB0RmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRmlsZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFNjcmlwdEZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnanMnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnc2NyaXB0JyxcclxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IGV4dGVuc2lvbixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3M6IHhoclNldHRpbmdzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuU2NyaXB0RmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICAgICAgdGhpcy5kYXRhLmxhbmd1YWdlID0gJ2phdmFzY3JpcHQnO1xyXG4gICAgICAgIHRoaXMuZGF0YS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgdGhpcy5kYXRhLmRlZmVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kYXRhLnRleHQgPSB0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQ7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogQWRkcyBhIFNjcmlwdCBmaWxlLCBvciBhcnJheSBvZiBTY3JpcHQgZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnNjcmlwdCgnYWxpZW5zJywgJ2xpYi9hbGllbnMuanMnKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nIGFuZCBub3QgYWxyZWFkeSBpbi11c2UgYnkgYW5vdGhlciBmaWxlIGluIHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnNjcmlwdCh7XHJcbiAqICAgICBrZXk6ICdhbGllbnMnLFxyXG4gKiAgICAgdXJsOiAnbGliL2FsaWVucy5qcydcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TY3JpcHRGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBjb252ZXJ0ZWQgaW50byBhIHNjcmlwdCBlbGVtZW50XHJcbiAqIHZpYSBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylgLiBJdCB3aWxsIGhhdmUgaXRzIGxhbmd1YWdlIHNldCB0byBKYXZhU2NyaXB0LCBgZGVmZXJgIHNldCB0b1xyXG4gKiBmYWxzZSBhbmQgdGhlbiB0aGUgcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZCB0byBgZG9jdW1lbnQuaGVhZGAuIEFueSBjb2RlIHRoZW4gaW4gdGhlXHJcbiAqIHNjcmlwdCB3aWxsIGJlIGV4ZWN1dGVkLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLmpzXCIuIEl0IHdpbGwgYWx3YXlzIGFkZCBgLmpzYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBTY3JpcHQgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc2NyaXB0XHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TY3JpcHRGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNjcmlwdEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW3hoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdC4gVXNlZCBpbiByZXBsYWNlbWVudCBvZiB0aGUgTG9hZGVycyBkZWZhdWx0IFhIUiBTZXR0aW5ncy5cclxuICpcclxuICogQHJldHVybiB7dGhpc30gVGhlIExvYWRlciBpbnN0YW5jZS5cclxuICovXHJcbkZpbGVUeXBlc01hbmFnZXIucmVnaXN0ZXIoJ3NjcmlwdCcsIGZ1bmN0aW9uIChrZXksIHVybCwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBTY3JpcHRGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFNjcmlwdEZpbGUodGhpcywga2V5LCB1cmwsIHhoclNldHRpbmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY3JpcHRGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgSW1hZ2VGaWxlID0gcmVxdWlyZSgnLi9JbWFnZUZpbGUuanMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFNwcml0ZSBTaGVldCBJbWFnZSBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jc3ByaXRlc2hlZXQgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKiBcclxuICogRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbGwgdGhlIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvcHRpb25zIG1lYW4gcGxlYXNlIHNlZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzcHJpdGVzaGVldC5cclxuICpcclxuICogQGNsYXNzIFNwcml0ZVNoZWV0RmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TcHJpdGVTaGVldEZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ucG5nYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ucG5nXCIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuSW1hZ2VGcmFtZUNvbmZpZ30gW2ZyYW1lQ29uZmlnXSAtIFRoZSBmcmFtZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIFNwcml0ZVNoZWV0RmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogSW1hZ2VGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3ByaXRlU2hlZXRGaWxlIChsb2FkZXIsIGtleSwgdXJsLCBmcmFtZUNvbmZpZywgeGhyU2V0dGluZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgSW1hZ2VGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBrZXksIHVybCwgeGhyU2V0dGluZ3MsIGZyYW1lQ29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ3Nwcml0ZXNoZWV0JztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoaXMgZmlsZSB0byBpdHMgdGFyZ2V0IGNhY2hlIHVwb24gc3VjY2Vzc2Z1bCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuU3ByaXRlU2hlZXRGaWxlI2FkZFRvQ2FjaGVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBhZGRUb0NhY2hlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5jYWNoZS5hZGRTcHJpdGVTaGVldCh0aGlzLmtleSwgdGhpcy5kYXRhLCB0aGlzLmNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMucGVuZGluZ0Rlc3Ryb3kodGV4dHVyZSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgU3ByaXRlIFNoZWV0IEltYWdlLCBvciBhcnJheSBvZiBTcHJpdGUgU2hlZXQgSW1hZ2VzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBUaGUgdGVybSAnU3ByaXRlIFNoZWV0JyBpbiBQaGFzZXIgbWVhbnMgYSBmaXhlZC1zaXplIHNoZWV0LiBXaGVyZSBldmVyeSBmcmFtZSBpbiB0aGUgc2hlZXQgaXMgdGhlIGV4YWN0IHNhbWUgc2l6ZSxcclxuICogYW5kIHlvdSByZWZlcmVuY2UgdGhvc2UgZnJhbWVzIHVzaW5nIG51bWJlcnMsIG5vdCBmcmFtZSBuYW1lcy4gVGhpcyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgYSBUZXh0dXJlIEF0bGFzLCB3aGVyZVxyXG4gKiB0aGUgZnJhbWVzIGFyZSBwYWNrZWQgaW4gYSB3YXkgd2hlcmUgdGhleSB0YWtlIHVwIHRoZSBsZWFzdCBhbW91bnQgb2Ygc3BhY2UsIGFuZCBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBuYW1lcyxcclxuICogbm90IG51bWJlcnMuIFNvbWUgYXJ0aWNsZXMgYW5kIHNvZnR3YXJlIHVzZSB0aGUgdGVybSAnU3ByaXRlIFNoZWV0JyB0byBtZWFuIFRleHR1cmUgQXRsYXMsIHNvIHBsZWFzZSBiZSBhd2FyZSBvZlxyXG4gKiB3aGF0IHNvcnQgb2YgZmlsZSB5b3UncmUgYWN0dWFsbHkgdHJ5aW5nIHRvIGxvYWQuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC5zcHJpdGVzaGVldCgnYm90JywgJ2ltYWdlcy9yb2JvdC5wbmcnLCB7IGZyYW1lV2lkdGg6IDMyLCBmcmFtZUhlaWdodDogMzggfSk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICogXHJcbiAqIFBoYXNlciBjYW4gbG9hZCBhbGwgY29tbW9uIGltYWdlIHR5cGVzOiBwbmcsIGpwZywgZ2lmIGFuZCBhbnkgb3RoZXIgZm9ybWF0IHRoZSBicm93c2VyIGNhbiBuYXRpdmVseSBoYW5kbGUuXHJcbiAqIElmIHlvdSB0cnkgdG8gbG9hZCBhbiBhbmltYXRlZCBnaWYgb25seSB0aGUgZmlyc3QgZnJhbWUgd2lsbCBiZSByZW5kZXJlZC4gQnJvd3NlcnMgZG8gbm90IG5hdGl2ZWx5IHN1cHBvcnQgcGxheWJhY2tcclxuICogb2YgYW5pbWF0ZWQgZ2lmcyB0byBDYW52YXMgZWxlbWVudHMuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnNwcml0ZXNoZWV0KHtcclxuICogICAgIGtleTogJ2JvdCcsXHJcbiAqICAgICB1cmw6ICdpbWFnZXMvcm9ib3QucG5nJyxcclxuICogICAgIGZyYW1lQ29uZmlnOiB7XHJcbiAqICAgICAgICAgZnJhbWVXaWR0aDogMzIsXHJcbiAqICAgICAgICAgZnJhbWVIZWlnaHQ6IDM4LFxyXG4gKiAgICAgICAgIHN0YXJ0RnJhbWU6IDAsXHJcbiAqICAgICAgICAgZW5kRnJhbWU6IDhcclxuICogICAgIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5TcHJpdGVTaGVldEZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiB1c2UgaXQgYXMgYSB0ZXh0dXJlIGZvciBhIEdhbWUgT2JqZWN0IGJ5IHJlZmVyZW5jaW5nIGl0cyBrZXk6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5zcHJpdGVzaGVldCgnYm90JywgJ2ltYWdlcy9yb2JvdC5wbmcnLCB7IGZyYW1lV2lkdGg6IDMyLCBmcmFtZUhlaWdodDogMzggfSk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHRoaXMuYWRkLmltYWdlKHgsIHksICdib3QnLCAwKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIElmIHlvdSBoYXZlIHNwZWNpZmllZCBhIHByZWZpeCBpbiB0aGUgbG9hZGVyLCB2aWEgYExvYWRlci5zZXRQcmVmaXhgIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGlzIGZpbGVzXHJcbiAqIGtleS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwcmVmaXggd2FzIGBQTEFZRVIuYCBhbmQgdGhlIGtleSB3YXMgYFJ1bm5pbmdgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgUExBWUVSLlJ1bm5pbmdgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgaW1hZ2UgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLnBuZ1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5wbmdgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBQaGFzZXIgYWxzbyBzdXBwb3J0cyB0aGUgYXV0b21hdGljIGxvYWRpbmcgb2YgYXNzb2NpYXRlZCBub3JtYWwgbWFwcy4gSWYgeW91IGhhdmUgYSBub3JtYWwgbWFwIHRvIGdvIHdpdGggdGhpcyBpbWFnZSxcclxuICogdGhlbiB5b3UgY2FuIHNwZWNpZnkgaXQgYnkgcHJvdmlkaW5nIGFuIGFycmF5IGFzIHRoZSBgdXJsYCB3aGVyZSB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIG5vcm1hbCBtYXA6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC5zcHJpdGVzaGVldCgnbG9nbycsIFsgJ2ltYWdlcy9BdGFyaUxvZ28ucG5nJywgJ2ltYWdlcy9BdGFyaUxvZ28tbi5wbmcnIF0sIHsgZnJhbWVXaWR0aDogMjU2LCBmcmFtZUhlaWdodDogODAgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBPciwgaWYgeW91IGFyZSB1c2luZyBhIGNvbmZpZyBvYmplY3QgdXNlIHRoZSBgbm9ybWFsTWFwYCBwcm9wZXJ0eTpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnNwcml0ZXNoZWV0KHtcclxuICogICAgIGtleTogJ2xvZ28nLFxyXG4gKiAgICAgdXJsOiAnaW1hZ2VzL0F0YXJpTG9nby5wbmcnLFxyXG4gKiAgICAgbm9ybWFsTWFwOiAnaW1hZ2VzL0F0YXJpTG9nby1uLnBuZycsXHJcbiAqICAgICBmcmFtZUNvbmZpZzoge1xyXG4gKiAgICAgICAgIGZyYW1lV2lkdGg6IDI1NixcclxuICogICAgICAgICBmcmFtZUhlaWdodDogODBcclxuICogICAgIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgbm9ybWFsIG1hcCBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgY29uZGl0aW9ucyBhcyB0aGUgaW1hZ2UgZmlsZSB3aXRoIHJlZ2FyZCB0byB0aGUgcGF0aCwgYmFzZVVSTCwgQ09ScyBhbmQgWEhSIFNldHRpbmdzLlxyXG4gKiBOb3JtYWwgbWFwcyBhcmUgYSBXZWJHTCBvbmx5IGZlYXR1cmUuXHJcbiAqIFxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFNwcml0ZSBTaGVldCBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNzcHJpdGVzaGVldFxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuU3ByaXRlU2hlZXRGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlNwcml0ZVNoZWV0RmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnBuZ2AsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnBuZ1wiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLkltYWdlRnJhbWVDb25maWd9IFtmcmFtZUNvbmZpZ10gLSBUaGUgZnJhbWUgY29uZmlndXJhdGlvbiBvYmplY3QuIEF0IGEgbWluaW11bSBpdCBzaG91bGQgaGF2ZSBhIGBmcmFtZVdpZHRoYCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3Rlcignc3ByaXRlc2hlZXQnLCBmdW5jdGlvbiAoa2V5LCB1cmwsIGZyYW1lQ29uZmlnLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFNwcml0ZVNoZWV0RmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBTcHJpdGVTaGVldEZpbGUodGhpcywga2V5LCB1cmwsIGZyYW1lQ29uZmlnLCB4aHJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3ByaXRlU2hlZXRGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgVGV4dCBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGV4dCBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGV4dC5cclxuICpcclxuICogQGNsYXNzIFRleHRGaWxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Mb2FkZXIuRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlRleHRGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LnR4dGAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLnR4dFwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgVGV4dEZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUZXh0RmlsZSAobG9hZGVyLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV4dGVuc2lvbiA9ICd0eHQnO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuICAgICAgICAgICAgdXJsID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3VybCcpO1xyXG4gICAgICAgICAgICB4aHJTZXR0aW5ncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4aHJTZXR0aW5ncycpO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZXh0ZW5zaW9uJywgZXh0ZW5zaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGNhY2hlOiBsb2FkZXIuY2FjaGVNYW5hZ2VyLnRleHQsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3NcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5UZXh0RmlsZSNvblByb2Nlc3NcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy54aHJMb2FkZXIucmVzcG9uc2VUZXh0O1xyXG5cclxuICAgICAgICB0aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgVGV4dCBmaWxlLCBvciBhcnJheSBvZiBUZXh0IGZpbGVzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC50ZXh0KCdzdG9yeScsICdmaWxlcy9JbnRyb1N0b3J5LnR4dCcpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgVGV4dCBDYWNoZSB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVGV4dCBDYWNoZS5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHQgQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQudGV4dCh7XHJcbiAqICAgICBrZXk6ICdzdG9yeScsXHJcbiAqICAgICB1cmw6ICdmaWxlcy9JbnRyb1N0b3J5LnR4dCdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UZXh0RmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgbG9hZGluZyB5b3UgY2FuIGFjY2VzcyBpdCBmcm9tIGl0cyBDYWNoZSB1c2luZyBpdHMga2V5OlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC50ZXh0KCdzdG9yeScsICdmaWxlcy9JbnRyb1N0b3J5LnR4dCcpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgZGF0YSA9IHRoaXMuY2FjaGUudGV4dC5nZXQoJ3N0b3J5Jyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBTdG9yeWAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuU3RvcnlgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBUZXh0IENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcInN0b3J5XCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcInN0b3J5LnR4dFwiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC50eHRgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFRleHQgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGV4dFxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGV4dEZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGV4dEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi50eHRgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi50eHRcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcigndGV4dCcsIGZ1bmN0aW9uIChrZXksIHVybCwgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgaXQncyBhbiBhcnJheSBpdCBoYXMgdG8gYmUgYW4gYXJyYXkgb2YgT2JqZWN0cywgc28gd2UgZ2V0IGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSAna2V5JyBvYmplY3RcclxuICAgICAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBUZXh0RmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBUZXh0RmlsZSh0aGlzLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRleHRGaWxlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcbnZhciBGaWxlID0gcmVxdWlyZSgnLi4vRmlsZScpO1xyXG52YXIgRmlsZVR5cGVzTWFuYWdlciA9IHJlcXVpcmUoJy4uL0ZpbGVUeXBlc01hbmFnZXInKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSXNQbGFpbk9iamVjdCcpO1xyXG52YXIgVElMRU1BUF9GT1JNQVRTID0gcmVxdWlyZSgnLi4vLi4vdGlsZW1hcHMvRm9ybWF0cycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgVGlsZW1hcCBDU1YgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RpbGVtYXBDU1YgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RpbGVtYXBDU1YuXHJcbiAqXHJcbiAqIEBjbGFzcyBUaWxlbWFwQ1NWRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwQ1NWRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5jc3ZgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi5jc3ZcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIFRpbGVtYXBDU1ZGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBGaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVGlsZW1hcENTVkZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBleHRlbnNpb24gPSAnY3N2JztcclxuXHJcbiAgICAgICAgaWYgKElzUGxhaW5PYmplY3Qoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAna2V5Jyk7XHJcbiAgICAgICAgICAgIHVybCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd1cmwnKTtcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3MgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneGhyU2V0dGluZ3MnKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2V4dGVuc2lvbicsIGV4dGVuc2lvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlsZUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ3RpbGVtYXBDU1YnLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLmNhY2hlTWFuYWdlci50aWxlbWFwLFxyXG4gICAgICAgICAgICBleHRlbnNpb246IGV4dGVuc2lvbixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgeGhyU2V0dGluZ3M6IHhoclNldHRpbmdzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMudGlsZW1hcEZvcm1hdCA9IFRJTEVNQVBfRk9STUFUUy5DU1Y7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuVGlsZW1hcENTVkZpbGUjb25Qcm9jZXNzXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgb25Qcm9jZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSBDT05TVC5GSUxFX1BST0NFU1NJTkc7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMueGhyTG9hZGVyLnJlc3BvbnNlVGV4dDtcclxuXHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwQ1NWRmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZWRhdGEgPSB7IGZvcm1hdDogdGhpcy50aWxlbWFwRm9ybWF0LCBkYXRhOiB0aGlzLmRhdGEgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZS5hZGQodGhpcy5rZXksIHRpbGVkYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRGVzdHJveSh0aWxlZGF0YSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgQ1NWIFRpbGVtYXAgZmlsZSwgb3IgYXJyYXkgb2YgQ1NWIGZpbGVzLCB0byB0aGUgY3VycmVudCBsb2FkIHF1ZXVlLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB3aXRoaW4geW91ciBTY2VuZSdzIGBwcmVsb2FkYCwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXMgeW91IHdpc2ggdG8gbG9hZDpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC50aWxlbWFwQ1NWKCdsZXZlbDEnLCAnbWFwcy9MZXZlbDEuY3N2Jyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRpbGVtYXAgQ1NWIGRhdGEgY2FuIGJlIGNyZWF0ZWQgaW4gYSB0ZXh0IGVkaXRvciwgb3IgYSAzcmQgcGFydHkgYXBwIHRoYXQgZXhwb3J0cyBhcyBDU1YuXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUaWxlbWFwIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBUaWxlbWFwIENhY2hlLlxyXG4gKiBMb2FkaW5nIGEgZmlsZSB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgdGFrZW4gd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nLiBJZiB5b3Ugd2lzaCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGVcclxuICogdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgVGV4dCBDYWNoZSBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC50aWxlbWFwQ1NWKHtcclxuICogICAgIGtleTogJ2xldmVsMScsXHJcbiAqICAgICB1cmw6ICdtYXBzL0xldmVsMS5jc3YnXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGlsZW1hcENTVkZpbGVDb25maWdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIE9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiBhY2Nlc3MgaXQgZnJvbSBpdHMgQ2FjaGUgdXNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQudGlsZW1hcENTVignbGV2ZWwxJywgJ21hcHMvTGV2ZWwxLmNzdicpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB2YXIgbWFwID0gdGhpcy5tYWtlLnRpbGVtYXAoeyBrZXk6ICdsZXZlbDEnIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYExFVkVMMS5gIGFuZCB0aGUga2V5IHdhcyBgU3RvcnlgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgTEVWRUwxLlN0b3J5YCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIHRleHQgZnJvbSB0aGUgVGlsZW1hcCBDYWNoZS5cclxuICpcclxuICogVGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIElmIHRoZSBVUkwgaXMgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGl0LlxyXG4gKlxyXG4gKiBJZiB0aGUgVVJMIGlzbid0IHNwZWNpZmllZCB0aGUgTG9hZGVyIHdpbGwgdGFrZSB0aGUga2V5IGFuZCBjcmVhdGUgYSBmaWxlbmFtZSBmcm9tIHRoYXQuIEZvciBleGFtcGxlIGlmIHRoZSBrZXkgaXMgXCJsZXZlbFwiXHJcbiAqIGFuZCBubyBVUkwgaXMgZ2l2ZW4gdGhlbiB0aGUgTG9hZGVyIHdpbGwgc2V0IHRoZSBVUkwgdG8gYmUgXCJsZXZlbC5jc3ZcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuY3N2YCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBUaWxlbWFwIENTViBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiN0aWxlbWFwQ1NWXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwQ1NWRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwQ1NWRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhpcyBmaWxlIGZyb20uIElmIHVuZGVmaW5lZCBvciBgbnVsbGAgaXQgd2lsbCBiZSBzZXQgdG8gYDxrZXk+LmNzdmAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmNzdlwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCd0aWxlbWFwQ1NWJywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFRpbGVtYXBDU1ZGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFRpbGVtYXBDU1ZGaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZW1hcENTVkZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBKU09ORmlsZSA9IHJlcXVpcmUoJy4vSlNPTkZpbGUuanMnKTtcclxudmFyIFRJTEVNQVBfRk9STUFUUyA9IHJlcXVpcmUoJy4uLy4uL3RpbGVtYXBzL0Zvcm1hdHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIEltcGFjdC5qcyBUaWxlbWFwIEpTT04gRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RpbGVtYXBJbXBhY3QgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RpbGVtYXBJbXBhY3QuXHJcbiAqXHJcbiAqIEBjbGFzcyBUaWxlbWFwSW1wYWN0RmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy43LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwSW1wYWN0RmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBFeHRyYSBYSFIgU2V0dGluZ3Mgc3BlY2lmaWNhbGx5IGZvciB0aGlzIGZpbGUuXHJcbiAqL1xyXG52YXIgVGlsZW1hcEltcGFjdEZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEpTT05GaWxlLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVGlsZW1hcEltcGFjdEZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIEpTT05GaWxlLmNhbGwodGhpcywgbG9hZGVyLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLnR5cGUgPSAndGlsZW1hcEpTT04nO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlID0gbG9hZGVyLmNhY2hlTWFuYWdlci50aWxlbWFwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwSW1wYWN0RmlsZSNhZGRUb0NhY2hlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgYWRkVG9DYWNoZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZWRhdGEgPSB7IGZvcm1hdDogVElMRU1BUF9GT1JNQVRTLldFTFRNRUlTVEVSLCBkYXRhOiB0aGlzLmRhdGEgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZS5hZGQodGhpcy5rZXksIHRpbGVkYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRGVzdHJveSh0aWxlZGF0YSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIEltcGFjdC5qcyBUaWxlbWFwIGZpbGUsIG9yIGFycmF5IG9mIG1hcCBmaWxlcywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQudGlsZW1hcEltcGFjdCgnbGV2ZWwxJywgJ21hcHMvTGV2ZWwxLmpzb24nKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogSW1wYWN0IFRpbGVtYXAgZGF0YSBpcyBjcmVhdGVkIHRoZSBJbXBhY3QuanMgTWFwIEVkaXRvciBjYWxsZWQgV2VsdG1laXN0ZXIuXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUaWxlbWFwIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBUaWxlbWFwIENhY2hlLlxyXG4gKiBMb2FkaW5nIGEgZmlsZSB1c2luZyBhIGtleSB0aGF0IGlzIGFscmVhZHkgdGFrZW4gd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nLiBJZiB5b3Ugd2lzaCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGVcclxuICogdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgVGV4dCBDYWNoZSBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC50aWxlbWFwSW1wYWN0KHtcclxuICogICAgIGtleTogJ2xldmVsMScsXHJcbiAqICAgICB1cmw6ICdtYXBzL0xldmVsMS5qc29uJ1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlRpbGVtYXBJbXBhY3RGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnRpbGVtYXBJbXBhY3QoJ2xldmVsMScsICdtYXBzL0xldmVsMS5qc29uJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHZhciBtYXAgPSB0aGlzLm1ha2UudGlsZW1hcCh7IGtleTogJ2xldmVsMScgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBTdG9yeWAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuU3RvcnlgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBUaWxlbWFwIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImxldmVsXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImxldmVsLmpzb25cIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuanNvbmAgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgVGlsZW1hcCBJbXBhY3QgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGlsZW1hcEltcGFjdFxyXG4gKiBAZmlyZXMgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jQUREXHJcbiAqIEBzaW5jZSAzLjcuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGlsZW1hcEltcGFjdEZpbGVDb25maWd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGlsZW1hcEltcGFjdEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCd0aWxlbWFwSW1wYWN0JywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFRpbGVtYXBJbXBhY3RGaWxlKHRoaXMsIGtleVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFRpbGVtYXBJbXBhY3RGaWxlKHRoaXMsIGtleSwgdXJsLCB4aHJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZW1hcEltcGFjdEZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBKU09ORmlsZSA9IHJlcXVpcmUoJy4vSlNPTkZpbGUuanMnKTtcclxudmFyIFRJTEVNQVBfRk9STUFUUyA9IHJlcXVpcmUoJy4uLy4uL3RpbGVtYXBzL0Zvcm1hdHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFRpbGVkIFRpbGVtYXAgSlNPTiBGaWxlIHN1aXRhYmxlIGZvciBsb2FkaW5nIGJ5IHRoZSBMb2FkZXIuXHJcbiAqXHJcbiAqIFRoZXNlIGFyZSBjcmVhdGVkIHdoZW4geW91IHVzZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGlsZW1hcFRpbGVkSlNPTiBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdGlsZW1hcFRpbGVkSlNPTi5cclxuICpcclxuICogQGNsYXNzIFRpbGVtYXBKU09ORmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLkZpbGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn0gbG9hZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIExvYWRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIGZpbGUuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwSlNPTkZpbGVDb25maWcpfSBrZXkgLSBUaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBmaWxlLCBvciBhIGZpbGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gbG9hZCB0aGlzIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4uanNvbmAsIGkuZS4gaWYgYGtleWAgd2FzIFwiYWxpZW5cIiB0aGVuIHRoZSBVUkwgd2lsbCBiZSBcImFsaWVuLmpzb25cIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIFRpbGVtYXBKU09ORmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogSlNPTkZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUaWxlbWFwSlNPTkZpbGUgKGxvYWRlciwga2V5LCB1cmwsIHhoclNldHRpbmdzKVxyXG4gICAge1xyXG4gICAgICAgIEpTT05GaWxlLmNhbGwodGhpcywgbG9hZGVyLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpO1xyXG5cclxuICAgICAgICB0aGlzLnR5cGUgPSAndGlsZW1hcEpTT04nO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlID0gbG9hZGVyLmNhY2hlTWFuYWdlci50aWxlbWFwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhpcyBmaWxlIHRvIGl0cyB0YXJnZXQgY2FjaGUgdXBvbiBzdWNjZXNzZnVsIGxvYWRpbmcgYW5kIHByb2Nlc3NpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwSlNPTkZpbGUjYWRkVG9DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FjaGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGVkYXRhID0geyBmb3JtYXQ6IFRJTEVNQVBfRk9STUFUUy5USUxFRF9KU09OLCBkYXRhOiB0aGlzLmRhdGEgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWNoZS5hZGQodGhpcy5rZXksIHRpbGVkYXRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRGVzdHJveSh0aWxlZGF0YSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgVGlsZWQgSlNPTiBUaWxlbWFwIGZpbGUsIG9yIGFycmF5IG9mIG1hcCBmaWxlcywgdG8gdGhlIGN1cnJlbnQgbG9hZCBxdWV1ZS5cclxuICpcclxuICogWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd2l0aGluIHlvdXIgU2NlbmUncyBgcHJlbG9hZGAsIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGVzIHlvdSB3aXNoIHRvIGxvYWQ6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogZnVuY3Rpb24gcHJlbG9hZCAoKVxyXG4gKiB7XHJcbiAqICAgICB0aGlzLmxvYWQudGlsZW1hcFRpbGVkSlNPTignbGV2ZWwxJywgJ21hcHMvTGV2ZWwxLmpzb24nKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVGhlIFRpbGVtYXAgZGF0YSBpcyBjcmVhdGVkIHVzaW5nIHRoZSBUaWxlZCBNYXAgRWRpdG9yIGFuZCBzZWxlY3RpbmcgSlNPTiBhcyB0aGUgZXhwb3J0IGZvcm1hdC5cclxuICpcclxuICogVGhlIGZpbGUgaXMgKipub3QqKiBsb2FkZWQgcmlnaHQgYXdheS4gSXQgaXMgYWRkZWQgdG8gYSBxdWV1ZSByZWFkeSB0byBiZSBsb2FkZWQgZWl0aGVyIHdoZW4gdGhlIGxvYWRlciBzdGFydHMsXHJcbiAqIG9yIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCB3aGVuIHRoZSBuZXh0IGZyZWUgbG9hZCBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSBpZiB5b3VcclxuICogYXJlIGNhbGxpbmcgdGhpcyBmcm9tIHdpdGhpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kLCBvciBhIHJlbGF0ZWQgY2FsbGJhY2suIEJlY2F1c2UgdGhlIGZpbGUgaXMgcXVldWVkXHJcbiAqIGl0IG1lYW5zIHlvdSBjYW5ub3QgdXNlIHRoZSBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dCBtdXN0IHdhaXQgZm9yIHRoZSBmaWxlIHRvIGNvbXBsZXRlLlxyXG4gKiBUaGUgdHlwaWNhbCBmbG93IGZvciBhIFBoYXNlciBTY2VuZSBpcyB0aGF0IHlvdSBsb2FkIGFzc2V0cyBpbiB0aGUgU2NlbmUncyBgcHJlbG9hZGAgbWV0aG9kIGFuZCB0aGVuIHdoZW4gdGhlXHJcbiAqIFNjZW5lJ3MgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCB5b3UgYXJlIGd1YXJhbnRlZWQgdGhhdCBhbGwgb2YgdGhvc2UgYXNzZXRzIGFyZSByZWFkeSBmb3IgdXNlIGFuZCBoYXZlIGJlZW5cclxuICogbG9hZGVkLlxyXG4gKlxyXG4gKiBUaGUga2V5IG11c3QgYmUgYSB1bmlxdWUgU3RyaW5nLiBJdCBpcyB1c2VkIHRvIGFkZCB0aGUgZmlsZSB0byB0aGUgZ2xvYmFsIFRpbGVtYXAgQ2FjaGUgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRpbGVtYXAgQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBUZXh0IENhY2hlIGZpcnN0LCBiZWZvcmUgbG9hZGluZyBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEluc3RlYWQgb2YgcGFzc2luZyBhcmd1bWVudHMgeW91IGNhbiBwYXNzIGEgY29uZmlndXJhdGlvbiBvYmplY3QsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnRpbGVtYXBUaWxlZEpTT04oe1xyXG4gKiAgICAga2V5OiAnbGV2ZWwxJyxcclxuICogICAgIHVybDogJ21hcHMvTGV2ZWwxLmpzb24nXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgUGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVGlsZW1hcEpTT05GaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnRpbGVtYXBUaWxlZEpTT04oJ2xldmVsMScsICdtYXBzL0xldmVsMS5qc29uJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHZhciBtYXAgPSB0aGlzLm1ha2UudGlsZW1hcCh7IGtleTogJ2xldmVsMScgfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTEVWRUwxLmAgYW5kIHRoZSBrZXkgd2FzIGBTdG9yeWAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBMRVZFTDEuU3RvcnlgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgdGV4dCBmcm9tIHRoZSBUaWxlbWFwIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImxldmVsXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImxldmVsLmpzb25cIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAuanNvbmAgYXMgdGhlIGV4dGVuc2lvbiwgYWx0aG91Z2hcclxuICogdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBtZXRob2QgYXJndW1lbnRzLiBJZiB5b3UgZG8gbm90IGRlc2lyZSB0aGlzIGFjdGlvbiB0aGVuIHByb3ZpZGUgYSBVUkwuXHJcbiAqXHJcbiAqIE5vdGU6IFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyB0eXBlIG9mIGZpbGUgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgVGlsZW1hcCBKU09OIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3RpbGVtYXBUaWxlZEpTT05cclxuICogQGZpcmVzIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI0FERFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlRpbGVtYXBKU09ORmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5UaWxlbWFwSlNPTkZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi5qc29uYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4uanNvblwiLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Mb2FkZXIuWEhSU2V0dGluZ3NPYmplY3R9IFt4aHJTZXR0aW5nc10gLSBBbiBYSFIgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBvYmplY3QuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3RoaXN9IFRoZSBMb2FkZXIgaW5zdGFuY2UuXHJcbiAqL1xyXG5GaWxlVHlwZXNNYW5hZ2VyLnJlZ2lzdGVyKCd0aWxlbWFwVGlsZWRKU09OJywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFRpbGVtYXBKU09ORmlsZSh0aGlzLCBrZXlbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlKG5ldyBUaWxlbWFwSlNPTkZpbGUodGhpcywga2V5LCB1cmwsIHhoclNldHRpbmdzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaWxlbWFwSlNPTkZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJbWFnZUZpbGUgPSByZXF1aXJlKCcuL0ltYWdlRmlsZS5qcycpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcbnZhciBNdWx0aUZpbGUgPSByZXF1aXJlKCcuLi9NdWx0aUZpbGUuanMnKTtcclxudmFyIFRleHRGaWxlID0gcmVxdWlyZSgnLi9UZXh0RmlsZS5qcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBzaW5nbGUgdGV4dCBmaWxlIGJhc2VkIFVuaXR5IFRleHR1cmUgQXRsYXMgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3VuaXR5QXRsYXMgbWV0aG9kIGFuZCBhcmUgbm90IHR5cGljYWxseSBjcmVhdGVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3VuaXR5QXRsYXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBVbml0eUF0bGFzRmlsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuTG9hZGVyLk11bHRpRmlsZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlVuaXR5QXRsYXNGaWxlQ29uZmlnKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3RleHR1cmVVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGltYWdlIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ucG5nYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ucG5nXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXRsYXNVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGF0bGFzIGRhdGEgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi50eHRgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi50eHRcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbdGV4dHVyZVhoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF0bGFzIGltYWdlIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW2F0bGFzWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgYXRsYXMgZGF0YSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKi9cclxudmFyIFVuaXR5QXRsYXNGaWxlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBNdWx0aUZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBVbml0eUF0bGFzRmlsZSAobG9hZGVyLCBrZXksIHRleHR1cmVVUkwsIGF0bGFzVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MsIGF0bGFzWGhyU2V0dGluZ3MpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGltYWdlO1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG5cclxuICAgICAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGtleTtcclxuXHJcbiAgICAgICAgICAgIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdrZXknKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlRmlsZShsb2FkZXIsIHtcclxuICAgICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgICAgdXJsOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGV4dHVyZVVSTCcpLFxyXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGV4dHVyZUV4dGVuc2lvbicsICdwbmcnKSxcclxuICAgICAgICAgICAgICAgIG5vcm1hbE1hcDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ25vcm1hbE1hcCcpLFxyXG4gICAgICAgICAgICAgICAgeGhyU2V0dGluZ3M6IEdldEZhc3RWYWx1ZShjb25maWcsICd0ZXh0dXJlWGhyU2V0dGluZ3MnKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVGV4dEZpbGUobG9hZGVyLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVybDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2F0bGFzVVJMJyksXHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IEdldEZhc3RWYWx1ZShjb25maWcsICdhdGxhc0V4dGVuc2lvbicsICd0eHQnKSxcclxuICAgICAgICAgICAgICAgIHhoclNldHRpbmdzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYXRsYXNYaHJTZXR0aW5ncycpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpbWFnZSA9IG5ldyBJbWFnZUZpbGUobG9hZGVyLCBrZXksIHRleHR1cmVVUkwsIHRleHR1cmVYaHJTZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVGV4dEZpbGUobG9hZGVyLCBrZXksIGF0bGFzVVJMLCBhdGxhc1hoclNldHRpbmdzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbWFnZS5saW5rRmlsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJbWFnZSBoYXMgYSBub3JtYWwgbWFwXHJcbiAgICAgICAgICAgIE11bHRpRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgJ3VuaXR5YXRsYXMnLCBrZXksIFsgaW1hZ2UsIGRhdGEsIGltYWdlLmxpbmtGaWxlIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBNdWx0aUZpbGUuY2FsbCh0aGlzLCBsb2FkZXIsICd1bml0eWF0bGFzJywga2V5LCBbIGltYWdlLCBkYXRhIF0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoaXMgZmlsZSB0byBpdHMgdGFyZ2V0IGNhY2hlIHVwb24gc3VjY2Vzc2Z1bCBsb2FkaW5nIGFuZCBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuVW5pdHlBdGxhc0ZpbGUjYWRkVG9DYWNoZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FjaGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkeVRvUHJvY2VzcygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGltYWdlID0gdGhpcy5maWxlc1swXTtcclxuICAgICAgICAgICAgdmFyIHRleHQgPSB0aGlzLmZpbGVzWzFdO1xyXG4gICAgICAgICAgICB2YXIgbm9ybWFsTWFwID0gKHRoaXMuZmlsZXNbMl0pID8gdGhpcy5maWxlc1syXS5kYXRhIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyLnRleHR1cmVNYW5hZ2VyLmFkZFVuaXR5QXRsYXMoaW1hZ2Uua2V5LCBpbWFnZS5kYXRhLCB0ZXh0LmRhdGEsIG5vcm1hbE1hcCk7XHJcblxyXG4gICAgICAgICAgICB0ZXh0LmFkZFRvQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSBVbml0eSBZQU1MIGJhc2VkIFRleHR1cmUgQXRsYXMsIG9yIGFycmF5IG9mIGF0bGFzZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnVuaXR5QXRsYXMoJ21haW5tZW51JywgJ2ltYWdlcy9NYWluTWVudS5wbmcnLCAnaW1hZ2VzL01haW5NZW51LnR4dCcpO1xyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGUgZmlsZSBpcyAqKm5vdCoqIGxvYWRlZCByaWdodCBhd2F5LiBJdCBpcyBhZGRlZCB0byBhIHF1ZXVlIHJlYWR5IHRvIGJlIGxvYWRlZCBlaXRoZXIgd2hlbiB0aGUgbG9hZGVyIHN0YXJ0cyxcclxuICogb3IgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcsIHdoZW4gdGhlIG5leHQgZnJlZSBsb2FkIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGlmIHlvdVxyXG4gKiBhcmUgY2FsbGluZyB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QsIG9yIGEgcmVsYXRlZCBjYWxsYmFjay4gQmVjYXVzZSB0aGUgZmlsZSBpcyBxdWV1ZWRcclxuICogaXQgbWVhbnMgeW91IGNhbm5vdCB1c2UgdGhlIGZpbGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYnV0IG11c3Qgd2FpdCBmb3IgdGhlIGZpbGUgdG8gY29tcGxldGUuXHJcbiAqIFRoZSB0eXBpY2FsIGZsb3cgZm9yIGEgUGhhc2VyIFNjZW5lIGlzIHRoYXQgeW91IGxvYWQgYXNzZXRzIGluIHRoZSBTY2VuZSdzIGBwcmVsb2FkYCBtZXRob2QgYW5kIHRoZW4gd2hlbiB0aGVcclxuICogU2NlbmUncyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkIHlvdSBhcmUgZ3VhcmFudGVlZCB0aGF0IGFsbCBvZiB0aG9zZSBhc3NldHMgYXJlIHJlYWR5IGZvciB1c2UgYW5kIGhhdmUgYmVlblxyXG4gKiBsb2FkZWQuXHJcbiAqXHJcbiAqIElmIHlvdSBjYWxsIHRoaXMgZnJvbSBvdXRzaWRlIG9mIGBwcmVsb2FkYCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHN0YXJ0aW5nIHRoZSBMb2FkZXIgYWZ0ZXJ3YXJkcyBhbmQgbW9uaXRvcmluZ1xyXG4gKiBpdHMgZXZlbnRzIHRvIGtub3cgd2hlbiBpdCdzIHNhZmUgdG8gdXNlIHRoZSBhc3NldC4gUGxlYXNlIHNlZSB0aGUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4gY2xhc3MgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogUGhhc2VyIGV4cGVjdHMgdGhlIGF0bGFzIGRhdGEgdG8gYmUgcHJvdmlkZWQgaW4gYSBZQU1MIGZvcm1hdHRlZCB0ZXh0IGZpbGUgYXMgZXhwb3J0ZWQgZnJvbSBVbml0eS5cclxuICpcclxuICogUGhhc2VyIGNhbiBsb2FkIGFsbCBjb21tb24gaW1hZ2UgdHlwZXM6IHBuZywganBnLCBnaWYgYW5kIGFueSBvdGhlciBmb3JtYXQgdGhlIGJyb3dzZXIgY2FuIG5hdGl2ZWx5IGhhbmRsZS5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBUZXh0dXJlIE1hbmFnZXIgdXBvbiBhIHN1Y2Nlc3NmdWwgbG9hZC5cclxuICogVGhlIGtleSBzaG91bGQgYmUgdW5pcXVlIGJvdGggaW4gdGVybXMgb2YgZmlsZXMgYmVpbmcgbG9hZGVkIGFuZCBmaWxlcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogTG9hZGluZyBhIGZpbGUgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IHRha2VuIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4gSWYgeW91IHdpc2ggdG8gcmVwbGFjZSBhbiBleGlzdGluZyBmaWxlXHJcbiAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFRleHR1cmUgTWFuYWdlciBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBJbnN0ZWFkIG9mIHBhc3NpbmcgYXJndW1lbnRzIHlvdSBjYW4gcGFzcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBzdWNoIGFzOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC51bml0eUF0bGFzKHtcclxuICogICAgIGtleTogJ21haW5tZW51JyxcclxuICogICAgIHRleHR1cmVVUkw6ICdpbWFnZXMvTWFpbk1lbnUucG5nJyxcclxuICogICAgIGF0bGFzVVJMOiAnaW1hZ2VzL01haW5NZW51LnR4dCdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5Vbml0eUF0bGFzRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogT25jZSB0aGUgYXRsYXMgaGFzIGZpbmlzaGVkIGxvYWRpbmcgeW91IGNhbiB1c2UgZnJhbWVzIGZyb20gaXQgYXMgdGV4dHVyZXMgZm9yIGEgR2FtZSBPYmplY3QgYnkgcmVmZXJlbmNpbmcgaXRzIGtleTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQudW5pdHlBdGxhcygnbWFpbm1lbnUnLCAnaW1hZ2VzL01haW5NZW51LnBuZycsICdpbWFnZXMvTWFpbk1lbnUuanNvbicpO1xyXG4gKiAvLyBhbmQgbGF0ZXIgaW4geW91ciBnYW1lIC4uLlxyXG4gKiB0aGlzLmFkZC5pbWFnZSh4LCB5LCAnbWFpbm1lbnUnLCAnYmFja2dyb3VuZCcpO1xyXG4gKiBgYGBcclxuICpcclxuICogVG8gZ2V0IGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGZyYW1lcyB3aXRoaW4gYW4gYXRsYXMgcGxlYXNlIGNvbnN1bHQgeW91ciBUZXh0dXJlIEF0bGFzIHNvZnR3YXJlLlxyXG4gKlxyXG4gKiBJZiB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBwcmVmaXggaW4gdGhlIGxvYWRlciwgdmlhIGBMb2FkZXIuc2V0UHJlZml4YCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBmaWxlc1xyXG4gKiBrZXkuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IHdhcyBgTUVOVS5gIGFuZCB0aGUga2V5IHdhcyBgQmFja2dyb3VuZGAgdGhlIGZpbmFsIGtleSB3aWxsIGJlIGBNRU5VLkJhY2tncm91bmRgIGFuZFxyXG4gKiB0aGlzIGlzIHdoYXQgeW91IHdvdWxkIHVzZSB0byByZXRyaWV2ZSB0aGUgaW1hZ2UgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImFsaWVuXCJcclxuICogYW5kIG5vIFVSTCBpcyBnaXZlbiB0aGVuIHRoZSBMb2FkZXIgd2lsbCBzZXQgdGhlIFVSTCB0byBiZSBcImFsaWVuLnBuZ1wiLiBJdCB3aWxsIGFsd2F5cyBhZGQgYC5wbmdgIGFzIHRoZSBleHRlbnNpb24sIGFsdGhvdWdoXHJcbiAqIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaWYgdXNpbmcgYW4gb2JqZWN0IGluc3RlYWQgb2YgbWV0aG9kIGFyZ3VtZW50cy4gSWYgeW91IGRvIG5vdCBkZXNpcmUgdGhpcyBhY3Rpb24gdGhlbiBwcm92aWRlIGEgVVJMLlxyXG4gKlxyXG4gKiBQaGFzZXIgYWxzbyBzdXBwb3J0cyB0aGUgYXV0b21hdGljIGxvYWRpbmcgb2YgYXNzb2NpYXRlZCBub3JtYWwgbWFwcy4gSWYgeW91IGhhdmUgYSBub3JtYWwgbWFwIHRvIGdvIHdpdGggdGhpcyBpbWFnZSxcclxuICogdGhlbiB5b3UgY2FuIHNwZWNpZnkgaXQgYnkgcHJvdmlkaW5nIGFuIGFycmF5IGFzIHRoZSBgdXJsYCB3aGVyZSB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIG5vcm1hbCBtYXA6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnVuaXR5QXRsYXMoJ21haW5tZW51JywgWyAnaW1hZ2VzL01haW5NZW51LnBuZycsICdpbWFnZXMvTWFpbk1lbnUtbi5wbmcnIF0sICdpbWFnZXMvTWFpbk1lbnUudHh0Jyk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBPciwgaWYgeW91IGFyZSB1c2luZyBhIGNvbmZpZyBvYmplY3QgdXNlIHRoZSBgbm9ybWFsTWFwYCBwcm9wZXJ0eTpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQudW5pdHlBdGxhcyh7XHJcbiAqICAgICBrZXk6ICdtYWlubWVudScsXHJcbiAqICAgICB0ZXh0dXJlVVJMOiAnaW1hZ2VzL01haW5NZW51LnBuZycsXHJcbiAqICAgICBub3JtYWxNYXA6ICdpbWFnZXMvTWFpbk1lbnUtbi5wbmcnLFxyXG4gKiAgICAgYXRsYXNVUkw6ICdpbWFnZXMvTWFpbk1lbnUudHh0J1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBub3JtYWwgbWFwIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSBjb25kaXRpb25zIGFzIHRoZSBpbWFnZSBmaWxlIHdpdGggcmVnYXJkIHRvIHRoZSBwYXRoLCBiYXNlVVJMLCBDT1JzIGFuZCBYSFIgU2V0dGluZ3MuXHJcbiAqIE5vcm1hbCBtYXBzIGFyZSBhIFdlYkdMIG9ubHkgZmVhdHVyZS5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBVbml0eSBBdGxhcyBGaWxlIHR5cGUgaGFzIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqIEl0IGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCBidWlsZCBidXQgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gY3VzdG9tIGJ1aWxkcy5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiN1bml0eUF0bGFzXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5Vbml0eUF0bGFzRmlsZUNvbmZpZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5Vbml0eUF0bGFzRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3RleHR1cmVVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGltYWdlIGZpbGUgZnJvbS4gSWYgdW5kZWZpbmVkIG9yIGBudWxsYCBpdCB3aWxsIGJlIHNldCB0byBgPGtleT4ucG5nYCwgaS5lLiBpZiBga2V5YCB3YXMgXCJhbGllblwiIHRoZW4gdGhlIFVSTCB3aWxsIGJlIFwiYWxpZW4ucG5nXCIuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXRsYXNVUkxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoZSB0ZXh0dXJlIGF0bGFzIGRhdGEgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi50eHRgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi50eHRcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbdGV4dHVyZVhoclNldHRpbmdzXSAtIEFuIFhIUiBTZXR0aW5ncyBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGF0bGFzIGltYWdlIGZpbGUuIFVzZWQgaW4gcmVwbGFjZW1lbnQgb2YgdGhlIExvYWRlcnMgZGVmYXVsdCBYSFIgU2V0dGluZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkxvYWRlci5YSFJTZXR0aW5nc09iamVjdH0gW2F0bGFzWGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgYXRsYXMgZGF0YSBmaWxlLiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcigndW5pdHlBdGxhcycsIGZ1bmN0aW9uIChrZXksIHRleHR1cmVVUkwsIGF0bGFzVVJMLCB0ZXh0dXJlWGhyU2V0dGluZ3MsIGF0bGFzWGhyU2V0dGluZ3MpXHJcbntcclxuICAgIHZhciBtdWx0aWZpbGU7XHJcblxyXG4gICAgLy8gIFN1cHBvcnRzIGFuIE9iamVjdCBmaWxlIGRlZmluaXRpb24gaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGFuIGFycmF5IG9mIG9iamVjdHMgaW4gdGhlIGtleSBhcmd1bWVudFxyXG4gICAgLy8gIE9yIGEgc2luZ2xlIGVudHJ5IHdoZXJlIGFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIGRlZmluZWRcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbXVsdGlmaWxlID0gbmV3IFVuaXR5QXRsYXNGaWxlKHRoaXMsIGtleVtpXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobXVsdGlmaWxlLmZpbGVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgbXVsdGlmaWxlID0gbmV3IFVuaXR5QXRsYXNGaWxlKHRoaXMsIGtleSwgdGV4dHVyZVVSTCwgYXRsYXNVUkwsIHRleHR1cmVYaHJTZXR0aW5ncywgYXRsYXNYaHJTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkRmlsZShtdWx0aWZpbGUuZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVW5pdHlBdGxhc0ZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIEZpbGUgPSByZXF1aXJlKCcuLi9GaWxlJyk7XHJcbnZhciBGaWxlVHlwZXNNYW5hZ2VyID0gcmVxdWlyZSgnLi4vRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2V0VVJMID0gcmVxdWlyZSgnLi4vR2V0VVJMJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2luZ2xlIFZpZGVvIEZpbGUgc3VpdGFibGUgZm9yIGxvYWRpbmcgYnkgdGhlIExvYWRlci5cclxuICpcclxuICogVGhlc2UgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiN2aWRlbyBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEZvciBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgYWxsIHRoZSBhcmd1bWVudHMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtZWFuIHBsZWFzZSBzZWUgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jdmlkZW8uXHJcbiAqXHJcbiAqIEBjbGFzcyBWaWRlb0ZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgTG9hZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZmlsZS5cclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlZpZGVvRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHthbnl9IFt1cmxDb25maWddIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tIGluIGEgY29uZmlnIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtsb2FkRXZlbnRdIC0gVGhlIGxvYWQgZXZlbnQgdG8gbGlzdGVuIGZvciB3aGVuIF9ub3RfIGxvYWRpbmcgYXMgYSBibG9iLiBFaXRoZXIgJ2xvYWRlZGRhdGEnLCAnY2FucGxheScgb3IgJ2NhbnBsYXl0aHJvdWdoJy5cclxuICogQHBhcmFtIHtib29sZWFufSBbYXNCbG9iXSAtIExvYWQgdGhlIHZpZGVvIGFzIGEgZGF0YSBibG9iLCBvciB2aWEgdGhlIFZpZGVvIGVsZW1lbnQ/XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vQXVkaW9dIC0gRG9lcyB0aGUgdmlkZW8gaGF2ZSBhbiBhdWRpbyB0cmFjaz8gSWYgbm90IHlvdSBjYW4gZW5hYmxlIGF1dG8tcGxheWluZyBvbiBpdC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIFZpZGVvRmlsZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRmlsZSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIC8vICBVUkwgaXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgVmlkZW9GaWxlLmdldFZpZGVvVVJMXHJcbiAgICBmdW5jdGlvbiBWaWRlb0ZpbGUgKGxvYWRlciwga2V5LCB1cmxDb25maWcsIGxvYWRFdmVudCwgYXNCbG9iLCBub0F1ZGlvLCB4aHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICBpZiAobG9hZEV2ZW50ID09PSB1bmRlZmluZWQpIHsgbG9hZEV2ZW50ID0gJ2xvYWRlZGRhdGEnOyB9XHJcbiAgICAgICAgaWYgKGFzQmxvYiA9PT0gdW5kZWZpbmVkKSB7IGFzQmxvYiA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKG5vQXVkaW8gPT09IHVuZGVmaW5lZCkgeyBub0F1ZGlvID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgaWYgKGxvYWRFdmVudCAhPT0gJ2xvYWRlZGRhdGEnICYmIGxvYWRFdmVudCAhPT0gJ2NhbnBsYXknICYmIGxvYWRFdmVudCAhPT0gJ2NhbnBsYXl0aHJvdWdoJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRFdmVudCA9ICdsb2FkZWRkYXRhJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmaWxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAndmlkZW8nLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLmNhY2hlTWFuYWdlci52aWRlbyxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uOiB1cmxDb25maWcudHlwZSxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB1cmw6IHVybENvbmZpZy51cmwsXHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzOiB4aHJTZXR0aW5ncyxcclxuICAgICAgICAgICAgY29uZmlnOiB7XHJcbiAgICAgICAgICAgICAgICBsb2FkRXZlbnQ6IGxvYWRFdmVudCxcclxuICAgICAgICAgICAgICAgIGFzQmxvYjogYXNCbG9iLFxyXG4gICAgICAgICAgICAgICAgbm9BdWRpbzogbm9BdWRpb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkxvYWRDYWxsYmFjayA9IHRoaXMub25WaWRlb0xvYWRIYW5kbGVyLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkVycm9yQ2FsbGJhY2sgPSB0aGlzLm9uVmlkZW9FcnJvckhhbmRsZXIuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgRmlsZS5jYWxsKHRoaXMsIGxvYWRlciwgZmlsZUNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgTG9hZGVyLm5leHRGaWxlLlxyXG4gICAgICogVGhpcyBtZXRob2QgY29udHJvbHMgd2hhdCBleHRyYSB3b3JrIHRoaXMgRmlsZSBkb2VzIHdpdGggaXRzIGxvYWRlZCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuVmlkZW9GaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBvblByb2Nlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENPTlNULkZJTEVfUFJPQ0VTU0lORztcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hc0Jsb2IpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgTG9hZCBWaWRlbyBhcyBibG9iXHJcblxyXG4gICAgICAgIHZhciB2aWRlbyA9IHRoaXMuY3JlYXRlVmlkZW9FbGVtZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YSA9IHZpZGVvO1xyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEub25sb2FkZWRkYXRhID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLm9uUHJvY2Vzc0NvbXBsZXRlKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhLm9uZXJyb3IgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRmlsZS5yZXZva2VPYmplY3RVUkwoX3RoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5vblByb2Nlc3NFcnJvcigpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEZpbGUuY3JlYXRlT2JqZWN0VVJMKHZpZGVvLCB0aGlzLnhockxvYWRlci5yZXNwb25zZSwgJycpO1xyXG5cclxuICAgICAgICB2aWRlby5sb2FkKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFZpZGVvIEVsZW1lbnQgd2l0aGluIHRoZSBET00uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5WaWRlb0ZpbGUjY3JlYXRlVmlkZW9FbGVtZW50XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0hUTUxWaWRlb0VsZW1lbnR9IFRoZSBuZXdseSBjcmVhdGVkIFZpZGVvIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVZpZGVvRWxlbWVudDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xyXG5cclxuICAgICAgICB2aWRlby5jb250cm9scyA9IGZhbHNlO1xyXG4gICAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gdGhpcy5sb2FkZXIuY3Jvc3NPcmlnaW47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub0F1ZGlvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2aWRlby5kZWZhdWx0TXV0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICdhdXRvcGxheScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICdwbGF5c2lubGluZScpO1xyXG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgncHJlbG9hZCcsICdhdXRvJyk7XHJcblxyXG4gICAgICAgIHJldHVybiB2aWRlbztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBsb2FkIGV2ZW50IGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuVmlkZW9GaWxlI29uVmlkZW9Mb2FkSGFuZGxlclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Byb2dyZXNzRXZlbnR9IGV2ZW50IC0gVGhlIERPTSBQcm9ncmVzc0V2ZW50IHRoYXQgcmVzdWx0ZWQgZnJvbSB0aGlzIGxvYWQuXHJcbiAgICAgKi9cclxuICAgIG9uVmlkZW9Mb2FkSGFuZGxlcjogZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWRlbyA9IGV2ZW50LnRhcmdldDtcclxuXHJcbiAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmNvbmZpZy5sb2FkRXZlbnQsIHRoaXMub25Mb2FkQ2FsbGJhY2ssIHRydWUpO1xyXG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yQ2FsbGJhY2ssIHRydWUpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSB2aWRlbztcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldFhIUigpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5uZXh0RmlsZSh0aGlzLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBsb2FkIGVycm9yIGV2ZW50IGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXMuVmlkZW9GaWxlI29uVmlkZW9FcnJvckhhbmRsZXJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBldmVudCAtIFRoZSBET00gUHJvZ3Jlc3NFdmVudCB0aGF0IHJlc3VsdGVkIGZyb20gdGhpcyBsb2FkLlxyXG4gICAgICovXHJcbiAgICBvblZpZGVvRXJyb3JIYW5kbGVyOiBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZpZGVvID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICBpZiAodmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuY29uZmlnLmxvYWRFdmVudCwgdGhpcy5vbkxvYWRDYWxsYmFjaywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yQ2FsbGJhY2ssIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNldFhIUigpO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRlci5uZXh0RmlsZSh0aGlzLCBmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGJ5IHRoZSBMb2FkZXIsIHN0YXJ0cyB0aGUgYWN0dWFsIGZpbGUgZG93bmxvYWRpbmcuXHJcbiAgICAgKiBEdXJpbmcgdGhlIGxvYWQgdGhlIG1ldGhvZHMgb25Mb2FkLCBvbkVycm9yIGFuZCBvblByb2dyZXNzIGFyZSBjYWxsZWQsIGJhc2VkIG9uIHRoZSBYSFIgZXZlbnRzLlxyXG4gICAgICogWW91IHNob3VsZG4ndCBub3JtYWxseSBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LCBpdCdzIG1lYW50IHRvIGJlIGludm9rZWQgYnkgdGhlIExvYWRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuRmlsZVR5cGVzLlZpZGVvRmlsZSNsb2FkXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKi9cclxuICAgIGxvYWQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxvYWRFdmVudCA9IHRoaXMuY29uZmlnLmxvYWRFdmVudDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFzQmxvYilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEZpbGUucHJvdG90eXBlLmxvYWQuY2FsbCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wZXJjZW50Q29tcGxldGUgPSAwO1xyXG5cclxuICAgICAgICAgICAgdmFyIHZpZGVvID0gdGhpcy5jcmVhdGVWaWRlb0VsZW1lbnQoKTtcclxuXHJcbiAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIobG9hZEV2ZW50LCB0aGlzLm9uTG9hZENhbGxiYWNrLCB0cnVlKTtcclxuICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLm9uRXJyb3JDYWxsYmFjaywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB2aWRlby5zcmMgPSBHZXRVUkwodGhpcywgdGhpcy5sb2FkZXIuYmFzZVVSTCk7XHJcblxyXG4gICAgICAgICAgICB2aWRlby5sb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5WaWRlb0ZpbGUuY3JlYXRlID0gZnVuY3Rpb24gKGxvYWRlciwga2V5LCB1cmxzLCBsb2FkRXZlbnQsIGFzQmxvYiwgbm9BdWRpbywgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIHZhciBnYW1lID0gbG9hZGVyLnN5c3RlbXMuZ2FtZTtcclxuXHJcbiAgICAvLyAgdXJsIG1heSBiZSBpbnNpZGUga2V5LCB3aGljaCBtYXkgYmUgYW4gb2JqZWN0XHJcbiAgICBpZiAoSXNQbGFpbk9iamVjdChrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIHVybHMgPSBHZXRGYXN0VmFsdWUoa2V5LCAndXJsJywgW10pO1xyXG4gICAgICAgIGxvYWRFdmVudCA9IEdldEZhc3RWYWx1ZShrZXksICdsb2FkRXZlbnQnLCAnbG9hZGVkZGF0YScpO1xyXG4gICAgICAgIGFzQmxvYiA9IEdldEZhc3RWYWx1ZShrZXksICdhc0Jsb2InLCBmYWxzZSk7XHJcbiAgICAgICAgbm9BdWRpbyA9IEdldEZhc3RWYWx1ZShrZXksICdub0F1ZGlvJywgZmFsc2UpO1xyXG4gICAgICAgIHhoclNldHRpbmdzID0gR2V0RmFzdFZhbHVlKGtleSwgJ3hoclNldHRpbmdzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHVybENvbmZpZyA9IFZpZGVvRmlsZS5nZXRWaWRlb1VSTChnYW1lLCB1cmxzKTtcclxuXHJcbiAgICBpZiAodXJsQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBuZXcgVmlkZW9GaWxlKGxvYWRlciwga2V5LCB1cmxDb25maWcsIGxvYWRFdmVudCwgYXNCbG9iLCBub0F1ZGlvLCB4aHJTZXR0aW5ncyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5WaWRlb0ZpbGUuZ2V0VmlkZW9VUkwgPSBmdW5jdGlvbiAoZ2FtZSwgdXJscylcclxue1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVybHMpKVxyXG4gICAge1xyXG4gICAgICAgIHVybHMgPSBbIHVybHMgXTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVybCA9IEdldEZhc3RWYWx1ZSh1cmxzW2ldLCAndXJsJywgdXJsc1tpXSk7XHJcblxyXG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignYmxvYjonKSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICcnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmlkZW9UeXBlO1xyXG5cclxuICAgICAgICBpZiAodXJsLmluZGV4T2YoJ2RhdGE6JykgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2aWRlb1R5cGUgPSB1cmwuc3BsaXQoJywnKVswXS5tYXRjaCgvXFwvKC4qPyk7Lyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZpZGVvVHlwZSA9IHVybC5tYXRjaCgvXFwuKFthLXpBLVowLTldKykoJHxcXD8pLyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2aWRlb1R5cGUgPSBHZXRGYXN0VmFsdWUodXJsc1tpXSwgJ3R5cGUnLCAodmlkZW9UeXBlKSA/IHZpZGVvVHlwZVsxXSA6ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZS5kZXZpY2UudmlkZW9bdmlkZW9UeXBlXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IHZpZGVvVHlwZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgVmlkZW8gZmlsZSwgb3IgYXJyYXkgb2YgdmlkZW8gZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKlxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIGZ1bmN0aW9uIHByZWxvYWQgKClcclxuICoge1xyXG4gKiAgICAgdGhpcy5sb2FkLnZpZGVvKCdpbnRybycsIFsgJ3ZpZGVvL2xldmVsMS5tcDQnLCAndmlkZW8vbGV2ZWwxLndlYm0nLCAndmlkZW8vbGV2ZWwxLm1vdicgXSk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICpcclxuICogVGhlIGtleSBtdXN0IGJlIGEgdW5pcXVlIFN0cmluZy4gSXQgaXMgdXNlZCB0byBhZGQgdGhlIGZpbGUgdG8gdGhlIGdsb2JhbCBWaWRlbyBDYWNoZSB1cG9uIGEgc3VjY2Vzc2Z1bCBsb2FkLlxyXG4gKiBUaGUga2V5IHNob3VsZCBiZSB1bmlxdWUgYm90aCBpbiB0ZXJtcyBvZiBmaWxlcyBiZWluZyBsb2FkZWQgYW5kIGZpbGVzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVmlkZW8gQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBWaWRlbyBDYWNoZSBmaXJzdCwgYmVmb3JlIGxvYWRpbmcgYSBuZXcgb25lLlxyXG4gICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLmxvYWQudmlkZW8oe1xyXG4gKiAgICAga2V5OiAnaW50cm8nLFxyXG4gKiAgICAgdXJsOiBbICd2aWRlby9sZXZlbDEubXA0JywgJ3ZpZGVvL2xldmVsMS53ZWJtJywgJ3ZpZGVvL2xldmVsMS5tb3YnIF0sXHJcbiAqICAgICBhc0Jsb2I6IGZhbHNlLFxyXG4gKiAgICAgbm9BdWRpbzogdHJ1ZVxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlZpZGVvRmlsZUNvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogVGhlIFVSTHMgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiB0aGUgVVJMcyBhcmUgcmVsYXRpdmUgdGhlIGBMb2FkZXIuYmFzZVVSTGAgYW5kIGBMb2FkZXIucGF0aGAgdmFsdWVzIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZW0uXHJcbiAqXHJcbiAqIER1ZSB0byBkaWZmZXJlbnQgYnJvd3NlcnMgc3VwcG9ydGluZyBkaWZmZXJlbnQgdmlkZW8gZmlsZSB0eXBlcyB5b3Ugc2hvdWxkIHVzdWFsbHkgcHJvdmlkZSB5b3VyIHZpZGVvIGZpbGVzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzLlxyXG4gKiBtcDQsIG1vdiBhbmQgd2VibSBhcmUgdGhlIG1vc3QgY29tbW9uLiBJZiB5b3UgcHJvdmlkZSBhbiBhcnJheSBvZiBVUkxzIHRoZW4gdGhlIExvYWRlciB3aWxsIGRldGVybWluZSB3aGljaCBfb25lXyBmaWxlIHRvIGxvYWQgYmFzZWQgb25cclxuICogYnJvd3NlciBzdXBwb3J0LCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBpbiB0aGUgYXJyYXkgYW5kIHByb2dyZXNzaW5nIHRvIHRoZSBlbmQuXHJcbiAqXHJcbiAqIFVubGlrZSBtb3N0IGFzc2V0LXR5cGVzLCB2aWRlb3MgZG8gbm90IF9uZWVkXyB0byBiZSBwcmVsb2FkZWQuIFlvdSBjYW4gY3JlYXRlIGEgVmlkZW8gR2FtZSBPYmplY3QgYW5kIHRoZW4gY2FsbCBpdHMgYGxvYWRVUkxgIG1ldGhvZCxcclxuICogdG8gbG9hZCBhIHZpZGVvIGF0IHJ1bi10aW1lLCByYXRoZXIgdGhhbiBpbiBhZHZhbmNlLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgdHlwZSBvZiBmaWxlIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIFZpZGVvIEZpbGUgdHlwZSBoYXMgYmVlbiBidWlsdCBpbnRvIFBoYXNlci5cclxuICogSXQgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0IGJ1aWxkIGJ1dCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBjdXN0b20gYnVpbGRzLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3ZpZGVvXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuVmlkZW9GaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlZpZGVvRmlsZUNvbmZpZ1tdKX0ga2V5IC0gVGhlIGtleSB0byB1c2UgZm9yIHRoaXMgZmlsZSwgb3IgYSBmaWxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhcnJheSBvZiB0aGVtLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBbdXJsc10gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGxvYWQgdGhlIHZpZGVvIGZpbGVzIGZyb20uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbG9hZEV2ZW50PSdsb2FkZWRkYXRhJ10gLSBUaGUgbG9hZCBldmVudCB0byBsaXN0ZW4gZm9yIHdoZW4gX25vdF8gbG9hZGluZyBhcyBhIGJsb2IuIEVpdGhlciBgbG9hZGVkZGF0YWAsIGBjYW5wbGF5YCBvciBgY2FucGxheXRocm91Z2hgLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthc0Jsb2I9ZmFsc2VdIC0gTG9hZCB0aGUgdmlkZW8gYXMgYSBkYXRhIGJsb2IsIG9yIHN0cmVhbSBpdCB2aWEgdGhlIFZpZGVvIGVsZW1lbnQ/XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vQXVkaW89ZmFsc2VdIC0gRG9lcyB0aGUgdmlkZW8gaGF2ZSBhbiBhdWRpbyB0cmFjaz8gSWYgbm90IHlvdSBjYW4gZW5hYmxlIGF1dG8tcGxheWluZyBvbiBpdC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcigndmlkZW8nLCBmdW5jdGlvbiAoa2V5LCB1cmxzLCBsb2FkRXZlbnQsIGFzQmxvYiwgbm9BdWRpbywgeGhyU2V0dGluZ3MpXHJcbntcclxuICAgIHZhciB2aWRlb0ZpbGU7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB2aWRlb0ZpbGUgPSBWaWRlb0ZpbGUuY3JlYXRlKHRoaXMsIGtleVtpXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodmlkZW9GaWxlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbGUodmlkZW9GaWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB2aWRlb0ZpbGUgPSBWaWRlb0ZpbGUuY3JlYXRlKHRoaXMsIGtleSwgdXJscywgbG9hZEV2ZW50LCBhc0Jsb2IsIG5vQXVkaW8sIHhoclNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgaWYgKHZpZGVvRmlsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZSh2aWRlb0ZpbGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvRmlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRmlsZSA9IHJlcXVpcmUoJy4uL0ZpbGUnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9GaWxlVHlwZXNNYW5hZ2VyJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxudmFyIFBhcnNlWE1MID0gcmVxdWlyZSgnLi4vLi4vZG9tL1BhcnNlWE1MJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHNpbmdsZSBYTUwgRmlsZSBzdWl0YWJsZSBmb3IgbG9hZGluZyBieSB0aGUgTG9hZGVyLlxyXG4gKlxyXG4gKiBUaGVzZSBhcmUgY3JlYXRlZCB3aGVuIHlvdSB1c2UgdGhlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3htbCBtZXRob2QgYW5kIGFyZSBub3QgdHlwaWNhbGx5IGNyZWF0ZWQgZGlyZWN0bHkuXHJcbiAqIFxyXG4gKiBGb3IgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IGFsbCB0aGUgYXJndW1lbnRzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgbWVhbiBwbGVhc2Ugc2VlIFBoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2luI3htbC5cclxuICpcclxuICogQGNsYXNzIFhNTEZpbGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkxvYWRlci5GaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBMb2FkZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyBmaWxlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLkxvYWRlci5GaWxlVHlwZXMuWE1MRmlsZUNvbmZpZyl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi54bWxgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi54bWxcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gRXh0cmEgWEhSIFNldHRpbmdzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBmaWxlLlxyXG4gKi9cclxudmFyIFhNTEZpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEZpbGUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBYTUxGaWxlIChsb2FkZXIsIGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxuICAgIHtcclxuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gJ3htbCc7XHJcblxyXG4gICAgICAgIGlmIChJc1BsYWluT2JqZWN0KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29uZmlnID0ga2V5O1xyXG5cclxuICAgICAgICAgICAga2V5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2tleScpO1xyXG4gICAgICAgICAgICB1cmwgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndXJsJyk7XHJcbiAgICAgICAgICAgIHhoclNldHRpbmdzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3hoclNldHRpbmdzJyk7XHJcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IEdldEZhc3RWYWx1ZShjb25maWcsICdleHRlbnNpb24nLCBleHRlbnNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZpbGVDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICd4bWwnLFxyXG4gICAgICAgICAgICBjYWNoZTogbG9hZGVyLmNhY2hlTWFuYWdlci54bWwsXHJcbiAgICAgICAgICAgIGV4dGVuc2lvbjogZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICB4aHJTZXR0aW5nczogeGhyU2V0dGluZ3NcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBGaWxlLmNhbGwodGhpcywgbG9hZGVyLCBmaWxlQ29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSBMb2FkZXIubmV4dEZpbGUuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyB3aGF0IGV4dHJhIHdvcmsgdGhpcyBGaWxlIGRvZXMgd2l0aCBpdHMgbG9hZGVkIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTG9hZGVyLkZpbGVUeXBlcy5YTUxGaWxlI29uUHJvY2Vzc1xyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKi9cclxuICAgIG9uUHJvY2VzczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gQ09OU1QuRklMRV9QUk9DRVNTSU5HO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBQYXJzZVhNTCh0aGlzLnhockxvYWRlci5yZXNwb25zZVRleHQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5vblByb2Nlc3NDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgWE1MRmlsZTogJyArIHRoaXMua2V5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMub25Qcm9jZXNzRXJyb3IoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGFuIFhNTCBmaWxlLCBvciBhcnJheSBvZiBYTUwgZmlsZXMsIHRvIHRoZSBjdXJyZW50IGxvYWQgcXVldWUuXHJcbiAqXHJcbiAqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHdpdGhpbiB5b3VyIFNjZW5lJ3MgYHByZWxvYWRgLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxlcyB5b3Ugd2lzaCB0byBsb2FkOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBmdW5jdGlvbiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICAgIHRoaXMubG9hZC54bWwoJ3dhdmVkYXRhJywgJ2ZpbGVzL0FsaWVuV2F2ZURhdGEueG1sJyk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFRoZSBmaWxlIGlzICoqbm90KiogbG9hZGVkIHJpZ2h0IGF3YXkuIEl0IGlzIGFkZGVkIHRvIGEgcXVldWUgcmVhZHkgdG8gYmUgbG9hZGVkIGVpdGhlciB3aGVuIHRoZSBsb2FkZXIgc3RhcnRzLFxyXG4gKiBvciBpZiBpdCdzIGFscmVhZHkgcnVubmluZywgd2hlbiB0aGUgbmV4dCBmcmVlIGxvYWQgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaWYgeW91XHJcbiAqIGFyZSBjYWxsaW5nIHRoaXMgZnJvbSB3aXRoaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCwgb3IgYSByZWxhdGVkIGNhbGxiYWNrLiBCZWNhdXNlIHRoZSBmaWxlIGlzIHF1ZXVlZFxyXG4gKiBpdCBtZWFucyB5b3UgY2Fubm90IHVzZSB0aGUgZmlsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBidXQgbXVzdCB3YWl0IGZvciB0aGUgZmlsZSB0byBjb21wbGV0ZS5cclxuICogVGhlIHR5cGljYWwgZmxvdyBmb3IgYSBQaGFzZXIgU2NlbmUgaXMgdGhhdCB5b3UgbG9hZCBhc3NldHMgaW4gdGhlIFNjZW5lJ3MgYHByZWxvYWRgIG1ldGhvZCBhbmQgdGhlbiB3aGVuIHRoZVxyXG4gKiBTY2VuZSdzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQgeW91IGFyZSBndWFyYW50ZWVkIHRoYXQgYWxsIG9mIHRob3NlIGFzc2V0cyBhcmUgcmVhZHkgZm9yIHVzZSBhbmQgaGF2ZSBiZWVuXHJcbiAqIGxvYWRlZC5cclxuICogXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSBhIHVuaXF1ZSBTdHJpbmcuIEl0IGlzIHVzZWQgdG8gYWRkIHRoZSBmaWxlIHRvIHRoZSBnbG9iYWwgWE1MIENhY2hlIHVwb24gYSBzdWNjZXNzZnVsIGxvYWQuXHJcbiAqIFRoZSBrZXkgc2hvdWxkIGJlIHVuaXF1ZSBib3RoIGluIHRlcm1zIG9mIGZpbGVzIGJlaW5nIGxvYWRlZCBhbmQgZmlsZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBYTUwgQ2FjaGUuXHJcbiAqIExvYWRpbmcgYSBmaWxlIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSB0YWtlbiB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuIElmIHlvdSB3aXNoIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZVxyXG4gKiB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBYTUwgQ2FjaGUgZmlyc3QsIGJlZm9yZSBsb2FkaW5nIGEgbmV3IG9uZS5cclxuICpcclxuICogSW5zdGVhZCBvZiBwYXNzaW5nIGFyZ3VtZW50cyB5b3UgY2FuIHBhc3MgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgc3VjaCBhczpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLnhtbCh7XHJcbiAqICAgICBrZXk6ICd3YXZlZGF0YScsXHJcbiAqICAgICB1cmw6ICdmaWxlcy9BbGllbldhdmVEYXRhLnhtbCdcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5YTUxGaWxlQ29uZmlnYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBPbmNlIHRoZSBmaWxlIGhhcyBmaW5pc2hlZCBsb2FkaW5nIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gaXRzIENhY2hlIHVzaW5nIGl0cyBrZXk6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubG9hZC54bWwoJ3dhdmVkYXRhJywgJ2ZpbGVzL0FsaWVuV2F2ZURhdGEueG1sJyk7XHJcbiAqIC8vIGFuZCBsYXRlciBpbiB5b3VyIGdhbWUgLi4uXHJcbiAqIHZhciBkYXRhID0gdGhpcy5jYWNoZS54bWwuZ2V0KCd3YXZlZGF0YScpO1xyXG4gKiBgYGBcclxuICpcclxuICogSWYgeW91IGhhdmUgc3BlY2lmaWVkIGEgcHJlZml4IGluIHRoZSBsb2FkZXIsIHZpYSBgTG9hZGVyLnNldFByZWZpeGAgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgZmlsZXNcclxuICoga2V5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHByZWZpeCB3YXMgYExFVkVMMS5gIGFuZCB0aGUga2V5IHdhcyBgV2F2ZXNgIHRoZSBmaW5hbCBrZXkgd2lsbCBiZSBgTEVWRUwxLldhdmVzYCBhbmRcclxuICogdGhpcyBpcyB3aGF0IHlvdSB3b3VsZCB1c2UgdG8gcmV0cmlldmUgdGhlIHRleHQgZnJvbSB0aGUgWE1MIENhY2hlLlxyXG4gKlxyXG4gKiBUaGUgVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgdGhlIFVSTCBpcyByZWxhdGl2ZSB0aGUgYExvYWRlci5iYXNlVVJMYCBhbmQgYExvYWRlci5wYXRoYCB2YWx1ZXMgd2lsbCBiZSBwcmVwZW5kZWQgdG8gaXQuXHJcbiAqXHJcbiAqIElmIHRoZSBVUkwgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBMb2FkZXIgd2lsbCB0YWtlIHRoZSBrZXkgYW5kIGNyZWF0ZSBhIGZpbGVuYW1lIGZyb20gdGhhdC4gRm9yIGV4YW1wbGUgaWYgdGhlIGtleSBpcyBcImRhdGFcIlxyXG4gKiBhbmQgbm8gVVJMIGlzIGdpdmVuIHRoZW4gdGhlIExvYWRlciB3aWxsIHNldCB0aGUgVVJMIHRvIGJlIFwiZGF0YS54bWxcIi4gSXQgd2lsbCBhbHdheXMgYWRkIGAueG1sYCBhcyB0aGUgZXh0ZW5zaW9uLCBhbHRob3VnaFxyXG4gKiB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGlmIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIG1ldGhvZCBhcmd1bWVudHMuIElmIHlvdSBkbyBub3QgZGVzaXJlIHRoaXMgYWN0aW9uIHRoZW4gcHJvdmlkZSBhIFVSTC5cclxuICpcclxuICogTm90ZTogVGhlIGFiaWxpdHkgdG8gbG9hZCB0aGlzIHR5cGUgb2YgZmlsZSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIHRoZSBYTUwgRmlsZSB0eXBlIGhhcyBiZWVuIGJ1aWx0IGludG8gUGhhc2VyLlxyXG4gKiBJdCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgYnVpbGQgYnV0IGNhbiBiZSBleGNsdWRlZCBmcm9tIGN1c3RvbSBidWlsZHMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW4jeG1sXHJcbiAqIEBmaXJlcyBQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbiNBRERcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuTG9hZGVyLkZpbGVUeXBlcy5YTUxGaWxlQ29uZmlnfFBoYXNlci5UeXBlcy5Mb2FkZXIuRmlsZVR5cGVzLlhNTEZpbGVDb25maWdbXSl9IGtleSAtIFRoZSBrZXkgdG8gdXNlIGZvciB0aGlzIGZpbGUsIG9yIGEgZmlsZSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYXJyYXkgb2YgdGhlbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBsb2FkIHRoaXMgZmlsZSBmcm9tLiBJZiB1bmRlZmluZWQgb3IgYG51bGxgIGl0IHdpbGwgYmUgc2V0IHRvIGA8a2V5Pi54bWxgLCBpLmUuIGlmIGBrZXlgIHdhcyBcImFsaWVuXCIgdGhlbiB0aGUgVVJMIHdpbGwgYmUgXCJhbGllbi54bWxcIi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTG9hZGVyLlhIUlNldHRpbmdzT2JqZWN0fSBbeGhyU2V0dGluZ3NdIC0gQW4gWEhSIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBVc2VkIGluIHJlcGxhY2VtZW50IG9mIHRoZSBMb2FkZXJzIGRlZmF1bHQgWEhSIFNldHRpbmdzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHt0aGlzfSBUaGUgTG9hZGVyIGluc3RhbmNlLlxyXG4gKi9cclxuRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcigneG1sJywgZnVuY3Rpb24gKGtleSwgdXJsLCB4aHJTZXR0aW5ncylcclxue1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBJZiBpdCdzIGFuIGFycmF5IGl0IGhhcyB0byBiZSBhbiBhcnJheSBvZiBPYmplY3RzLCBzbyB3ZSBnZXQgZXZlcnl0aGluZyBvdXQgb2YgdGhlICdrZXknIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmFkZEZpbGUobmV3IFhNTEZpbGUodGhpcywga2V5W2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsZShuZXcgWE1MRmlsZSh0aGlzLCBrZXksIHVybCwgeGhyU2V0dGluZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFhNTEZpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLkxvYWRlci5GaWxlVHlwZXNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBbmltYXRpb25KU09ORmlsZTogcmVxdWlyZSgnLi9BbmltYXRpb25KU09ORmlsZScpLFxyXG4gICAgQXRsYXNKU09ORmlsZTogcmVxdWlyZSgnLi9BdGxhc0pTT05GaWxlJyksXHJcbiAgICBBdGxhc1hNTEZpbGU6IHJlcXVpcmUoJy4vQXRsYXNYTUxGaWxlJyksXHJcbiAgICBBdWRpb0ZpbGU6IHJlcXVpcmUoJy4vQXVkaW9GaWxlJyksXHJcbiAgICBBdWRpb1Nwcml0ZUZpbGU6IHJlcXVpcmUoJy4vQXVkaW9TcHJpdGVGaWxlJyksXHJcbiAgICBCaW5hcnlGaWxlOiByZXF1aXJlKCcuL0JpbmFyeUZpbGUnKSxcclxuICAgIEJpdG1hcEZvbnRGaWxlOiByZXF1aXJlKCcuL0JpdG1hcEZvbnRGaWxlJyksXHJcbiAgICBDU1NGaWxlOiByZXF1aXJlKCcuL0NTU0ZpbGUnKSxcclxuICAgIEdMU0xGaWxlOiByZXF1aXJlKCcuL0dMU0xGaWxlJyksXHJcbiAgICBIVE1MNUF1ZGlvRmlsZTogcmVxdWlyZSgnLi9IVE1MNUF1ZGlvRmlsZScpLFxyXG4gICAgSFRNTEZpbGU6IHJlcXVpcmUoJy4vSFRNTEZpbGUnKSxcclxuICAgIEhUTUxUZXh0dXJlRmlsZTogcmVxdWlyZSgnLi9IVE1MVGV4dHVyZUZpbGUnKSxcclxuICAgIEltYWdlRmlsZTogcmVxdWlyZSgnLi9JbWFnZUZpbGUnKSxcclxuICAgIEpTT05GaWxlOiByZXF1aXJlKCcuL0pTT05GaWxlJyksXHJcbiAgICBNdWx0aUF0bGFzRmlsZTogcmVxdWlyZSgnLi9NdWx0aUF0bGFzRmlsZScpLFxyXG4gICAgTXVsdGlTY3JpcHRGaWxlOiByZXF1aXJlKCcuL011bHRpU2NyaXB0RmlsZScpLFxyXG4gICAgUGFja0ZpbGU6IHJlcXVpcmUoJy4vUGFja0ZpbGUnKSxcclxuICAgIFBsdWdpbkZpbGU6IHJlcXVpcmUoJy4vUGx1Z2luRmlsZScpLFxyXG4gICAgU2NlbmVGaWxlOiByZXF1aXJlKCcuL1NjZW5lRmlsZScpLFxyXG4gICAgU2NlbmVQbHVnaW5GaWxlOiByZXF1aXJlKCcuL1NjZW5lUGx1Z2luRmlsZScpLFxyXG4gICAgU2NyaXB0RmlsZTogcmVxdWlyZSgnLi9TY3JpcHRGaWxlJyksXHJcbiAgICBTcHJpdGVTaGVldEZpbGU6IHJlcXVpcmUoJy4vU3ByaXRlU2hlZXRGaWxlJyksXHJcbiAgICBTVkdGaWxlOiByZXF1aXJlKCcuL1NWR0ZpbGUnKSxcclxuICAgIFRleHRGaWxlOiByZXF1aXJlKCcuL1RleHRGaWxlJyksXHJcbiAgICBUaWxlbWFwQ1NWRmlsZTogcmVxdWlyZSgnLi9UaWxlbWFwQ1NWRmlsZScpLFxyXG4gICAgVGlsZW1hcEltcGFjdEZpbGU6IHJlcXVpcmUoJy4vVGlsZW1hcEltcGFjdEZpbGUnKSxcclxuICAgIFRpbGVtYXBKU09ORmlsZTogcmVxdWlyZSgnLi9UaWxlbWFwSlNPTkZpbGUnKSxcclxuICAgIFVuaXR5QXRsYXNGaWxlOiByZXF1aXJlKCcuL1VuaXR5QXRsYXNGaWxlJyksXHJcbiAgICBWaWRlb0ZpbGU6IHJlcXVpcmUoJy4vVmlkZW9GaWxlJyksXHJcbiAgICBYTUxGaWxlOiByZXF1aXJlKCcuL1hNTEZpbGUnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBFeHRlbmQgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvRXh0ZW5kJyk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTG9hZGVyXHJcbiAqL1xyXG5cclxudmFyIExvYWRlciA9IHtcclxuXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJyksXHJcblxyXG4gICAgRmlsZVR5cGVzOiByZXF1aXJlKCcuL2ZpbGV0eXBlcycpLFxyXG5cclxuICAgIEZpbGU6IHJlcXVpcmUoJy4vRmlsZScpLFxyXG4gICAgRmlsZVR5cGVzTWFuYWdlcjogcmVxdWlyZSgnLi9GaWxlVHlwZXNNYW5hZ2VyJyksXHJcbiAgICBHZXRVUkw6IHJlcXVpcmUoJy4vR2V0VVJMJyksXHJcbiAgICBMb2FkZXJQbHVnaW46IHJlcXVpcmUoJy4vTG9hZGVyUGx1Z2luJyksXHJcbiAgICBNZXJnZVhIUlNldHRpbmdzOiByZXF1aXJlKCcuL01lcmdlWEhSU2V0dGluZ3MnKSxcclxuICAgIE11bHRpRmlsZTogcmVxdWlyZSgnLi9NdWx0aUZpbGUnKSxcclxuICAgIFhIUkxvYWRlcjogcmVxdWlyZSgnLi9YSFJMb2FkZXInKSxcclxuICAgIFhIUlNldHRpbmdzOiByZXF1aXJlKCcuL1hIUlNldHRpbmdzJylcclxuXHJcbn07XHJcblxyXG4vLyAgIE1lcmdlIGluIHRoZSBjb25zdHNcclxuTG9hZGVyID0gRXh0ZW5kKGZhbHNlLCBMb2FkZXIsIENPTlNUKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTG9hZGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIG1lYW4gYXZlcmFnZSBvZiB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQXZlcmFnZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJbXX0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byBhdmVyYWdlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhdmVyYWdlIHZhbHVlLlxyXG4gKi9cclxudmFyIEF2ZXJhZ2UgPSBmdW5jdGlvbiAodmFsdWVzKVxyXG57XHJcbiAgICB2YXIgc3VtID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBzdW0gKz0gKCt2YWx1ZXNbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdW0gLyB2YWx1ZXMubGVuZ3RoO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBdmVyYWdlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGYWN0b3JpYWwgPSByZXF1aXJlKCcuL0ZhY3RvcmlhbCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIEJlcm5zdGVpbiBiYXNpcyBmcm9tIHRoZSB0aHJlZSBmYWN0b3JpYWwgY29lZmZpY2llbnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQmVybnN0ZWluXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbiAtIFRoZSBmaXJzdCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGkgLSBUaGUgc2Vjb25kIHZhbHVlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBCZXJuc3RlaW4gYmFzaXMgb2YgRmFjdG9yaWFsKG4pIC8gRmFjdG9yaWFsKGkpIC8gRmFjdG9yaWFsKG4gLSBpKVxyXG4gKi9cclxudmFyIEJlcm5zdGVpbiA9IGZ1bmN0aW9uIChuLCBpKVxyXG57XHJcbiAgICByZXR1cm4gRmFjdG9yaWFsKG4pIC8gRmFjdG9yaWFsKGkpIC8gRmFjdG9yaWFsKG4gLSBpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmVybnN0ZWluO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiB0aGUgYG1pbmAgYW5kIGBtYXhgIHZhbHVlcywgaW5jbHVzaXZlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQmV0d2VlblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZS5cclxuICpcclxuICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHJhbmRvbSBpbnRlZ2VyLlxyXG4gKi9cclxudmFyIEJldHdlZW4gPSBmdW5jdGlvbiAobWluLCBtYXgpXHJcbntcclxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCZXR3ZWVuO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgQ2F0bXVsbC1Sb20gdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcG9pbnRzLCBiYXNlZCBvbiBhbiBhbHBoYSBvZiAwLjUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5DYXRtdWxsUm9tXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBhbW91bnQgdG8gaW50ZXJwb2xhdGUgYnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMCAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDEgLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMiAtIFRoZSB0aGlyZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDMgLSBUaGUgZm91cnRoIGNvbnRyb2wgcG9pbnQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIENhdG11bGwtUm9tIHZhbHVlLlxyXG4gKi9cclxudmFyIENhdG11bGxSb20gPSBmdW5jdGlvbiAodCwgcDAsIHAxLCBwMiwgcDMpXHJcbntcclxuICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcclxuICAgIHZhciB2MSA9IChwMyAtIHAxKSAqIDAuNTtcclxuICAgIHZhciB0MiA9IHQgKiB0O1xyXG4gICAgdmFyIHQzID0gdCAqIHQyO1xyXG5cclxuICAgIHJldHVybiAoMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSkgKiB0MyArICgtMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEpICogdDIgKyB2MCAqIHQgKyBwMTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2F0bXVsbFJvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2VpbHMgdG8gc29tZSBwbGFjZSBjb21wYXJhdGl2ZSB0byBhIGBiYXNlYCwgZGVmYXVsdCBpcyAxMCBmb3IgZGVjaW1hbCBwbGFjZS5cclxuICpcclxuICogVGhlIGBwbGFjZWAgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBvd2VyIGFwcGxpZWQgdG8gYGJhc2VgIHRvIGdldCB0aGF0IHBsYWNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQ2VpbFRvXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcm91bmQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGxhY2U9MF0gLSBUaGUgcGxhY2UgdG8gcm91bmQgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2Jhc2U9MTBdIC0gVGhlIGJhc2UgdG8gcm91bmQgaW4uIERlZmF1bHQgaXMgMTAgZm9yIGRlY2ltYWwuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJvdW5kZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgQ2VpbFRvID0gZnVuY3Rpb24gKHZhbHVlLCBwbGFjZSwgYmFzZSlcclxue1xyXG4gICAgaWYgKHBsYWNlID09PSB1bmRlZmluZWQpIHsgcGxhY2UgPSAwOyB9XHJcbiAgICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkKSB7IGJhc2UgPSAxMDsgfVxyXG5cclxuICAgIHZhciBwID0gTWF0aC5wb3coYmFzZSwgLXBsYWNlKTtcclxuXHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHZhbHVlICogcCkgLyBwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDZWlsVG87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEZvcmNlIGEgdmFsdWUgd2l0aGluIHRoZSBib3VuZGFyaWVzIGJ5IGNsYW1waW5nIGl0IHRvIHRoZSByYW5nZSBgbWluYCwgYG1heGAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5DbGFtcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNsYW1wZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSBib3VuZHMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSBib3VuZHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsYW1wZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgQ2xhbXAgPSBmdW5jdGlvbiAodmFsdWUsIG1pbiwgbWF4KVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENsYW1wO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhbmdsZSBmcm9tIGRlZ3JlZXMsIHRvIHRoZSBlcXVpdmFsZW50IGFuZ2xlIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EZWdUb1JhZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBkZWdyZWVzIC0gVGhlIGFuZ2xlIChpbiBkZWdyZWVzKSB0byBjb252ZXJ0IHRvIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGdpdmVuIGFuZ2xlIGNvbnZlcnRlZCB0byByYWRpYW5zLlxyXG4gKi9cclxudmFyIERlZ1RvUmFkID0gZnVuY3Rpb24gKGRlZ3JlZXMpXHJcbntcclxuICAgIHJldHVybiBkZWdyZWVzICogQ09OU1QuREVHX1RPX1JBRDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGVnVG9SYWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aXZlIGRpZmZlcmVuY2Ugb2YgdHdvIGdpdmVuIG51bWJlcnMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EaWZmZXJlbmNlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSBmaXJzdCBudW1iZXIgaW4gdGhlIGNhbGN1bGF0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBzZWNvbmQgbnVtYmVyIGluIHRoZSBjYWxjdWxhdGlvbi5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcG9zaXRpdmUgZGlmZmVyZW5jZSBvZiB0aGUgdHdvIGdpdmVuIG51bWJlcnMuXHJcbiAqL1xyXG52YXIgRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChhLCBiKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBEaWZmZXJlbmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBmYWN0b3JpYWwgb2YgYSBnaXZlbiBudW1iZXIgZm9yIGludGVnZXIgdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRmFjdG9yaWFsXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBIHBvc2l0aXZlIGludGVnZXIgdG8gY2FsY3VsYXRlIHRoZSBmYWN0b3JpYWwgb2YuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZhY3RvcmlhbCBvZiB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKi9cclxudmFyIEZhY3RvcmlhbCA9IGZ1bmN0aW9uICh2YWx1ZSlcclxue1xyXG4gICAgaWYgKHZhbHVlID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXMgPSB2YWx1ZTtcclxuXHJcbiAgICB3aGlsZSAoLS12YWx1ZSlcclxuICAgIHtcclxuICAgICAgICByZXMgKj0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmFjdG9yaWFsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGJvdW5kcywgbWluaW11bSBpbmNsdXNpdmUsIG1heGltdW0gZXhjbHVzaXZlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRmxvYXRCZXR3ZWVuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgZmxvYXQsIGluY2x1c2l2ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSB1cHBlciBib3VuZCBmb3IgdGhlIGZsb2F0IGV4Y2x1c2l2ZS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdCB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLlxyXG4gKi9cclxudmFyIEZsb2F0QmV0d2VlbiA9IGZ1bmN0aW9uIChtaW4sIG1heClcclxue1xyXG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxvYXRCZXR3ZWVuO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGbG9vcnMgdG8gc29tZSBwbGFjZSBjb21wYXJhdGl2ZSB0byBhIGBiYXNlYCwgZGVmYXVsdCBpcyAxMCBmb3IgZGVjaW1hbCBwbGFjZS5cclxuICpcclxuICogVGhlIGBwbGFjZWAgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBvd2VyIGFwcGxpZWQgdG8gYGJhc2VgIHRvIGdldCB0aGF0IHBsYWNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRmxvb3JUb1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJvdW5kLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtwbGFjZT0wXSAtIFRoZSBwbGFjZSB0byByb3VuZCB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbYmFzZT0xMF0gLSBUaGUgYmFzZSB0byByb3VuZCBpbi4gRGVmYXVsdCBpcyAxMCBmb3IgZGVjaW1hbC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcm91bmRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBGbG9vclRvID0gZnVuY3Rpb24gKHZhbHVlLCBwbGFjZSwgYmFzZSlcclxue1xyXG4gICAgaWYgKHBsYWNlID09PSB1bmRlZmluZWQpIHsgcGxhY2UgPSAwOyB9XHJcbiAgICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkKSB7IGJhc2UgPSAxMDsgfVxyXG5cclxuICAgIHZhciBwID0gTWF0aC5wb3coYmFzZSwgLXBsYWNlKTtcclxuXHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSAqIHApIC8gcDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmxvb3JUbztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuL0NsYW1wJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJuIGEgdmFsdWUgYmFzZWQgb24gdGhlIHJhbmdlIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIGFuZCB0aGUgcGVyY2VudGFnZSBnaXZlbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkZyb21QZXJjZW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcGVyY2VudCAtIEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxIHJlcHJlc2VudGluZyB0aGUgcGVyY2VudGFnZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW21heF0gLSBUaGUgbWF4aW11bSB2YWx1ZS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgdGhhdCBpcyBgcGVyY2VudGAgcGVyY2VudCBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YC5cclxuICovXHJcbnZhciBGcm9tUGVyY2VudCA9IGZ1bmN0aW9uIChwZXJjZW50LCBtaW4sIG1heClcclxue1xyXG4gICAgcGVyY2VudCA9IENsYW1wKHBlcmNlbnQsIDAsIDEpO1xyXG5cclxuICAgIHJldHVybiAobWF4IC0gbWluKSAqIHBlcmNlbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZyb21QZXJjZW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgYSBwZXItbXMgc3BlZWQgZnJvbSBhIGRpc3RhbmNlIGFuZCB0aW1lIChnaXZlbiBpbiBzZWNvbmRzKS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkdldFNwZWVkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZSAtIFRoZSB0aW1lLCBpbiBzZWNvbmRzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcGVlZCwgaW4gZGlzdGFuY2UgcGVyIG1zLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyA0MDBweCBvdmVyIDEgc2Vjb25kIGlzIDAuNCBweC9tc1xyXG4gKiBQaGFzZXIuTWF0aC5HZXRTcGVlZCg0MDAsIDEpIC8vIC0+IDAuNFxyXG4gKi9cclxudmFyIEdldFNwZWVkID0gZnVuY3Rpb24gKGRpc3RhbmNlLCB0aW1lKVxyXG57XHJcbiAgICByZXR1cm4gKGRpc3RhbmNlIC8gdGltZSkgLyAxMDAwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRTcGVlZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYSBnaXZlbiB2YWx1ZSBpcyBhbiBldmVuIG51bWJlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLklzRXZlblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG51bWJlciB0byBwZXJmb3JtIHRoZSBjaGVjayB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBudW1iZXIgaXMgZXZlbiBvciBub3QuXHJcbiAqL1xyXG52YXIgSXNFdmVuID0gZnVuY3Rpb24gKHZhbHVlKVxyXG57XHJcbiAgICAvLyBVc2UgYWJzdHJhY3QgZXF1YWxpdHkgPT0gZm9yIFwiaXMgbnVtYmVyXCIgdGVzdFxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcclxuICAgIHJldHVybiAodmFsdWUgPT0gcGFyc2VGbG9hdCh2YWx1ZSkpID8gISh2YWx1ZSAlIDIpIDogdm9pZCAwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJc0V2ZW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgZ2l2ZW4gdmFsdWUgaXMgYW4gZXZlbiBudW1iZXIgdXNpbmcgYSBzdHJpY3QgdHlwZSBjaGVjay5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLklzRXZlblN0cmljdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG51bWJlciB0byBwZXJmb3JtIHRoZSBjaGVjayB3aXRoLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBudW1iZXIgaXMgZXZlbiBvciBub3QuXHJcbiAqL1xyXG52YXIgSXNFdmVuU3RyaWN0ID0gZnVuY3Rpb24gKHZhbHVlKVxyXG57XHJcbiAgICAvLyBVc2Ugc3RyaWN0IGVxdWFsaXR5ID09PSBmb3IgXCJpcyBudW1iZXJcIiB0ZXN0XHJcbiAgICByZXR1cm4gKHZhbHVlID09PSBwYXJzZUZsb2F0KHZhbHVlKSkgPyAhKHZhbHVlICUgMikgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElzRXZlblN0cmljdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyBhIGxpbmVhciAoaW50ZXJwb2xhdGlvbikgdmFsdWUgb3ZlciB0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguTGluZWFyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDAgLSBUaGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMSAtIFRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIHBlcmNlbnRhZ2UgYmV0d2VlbiBwMCBhbmQgcDEgdG8gcmV0dXJuLCByZXByZXNlbnRlZCBhcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN0ZXAgdCUgb2YgdGhlIHdheSBiZXR3ZWVuIHAwIGFuZCBwMS5cclxuICovXHJcbnZhciBMaW5lYXIgPSBmdW5jdGlvbiAocDAsIHAxLCB0KVxyXG57XHJcbiAgICByZXR1cm4gKHAxIC0gcDApICogdCArIHAwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lYXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIEFkYXB0ZWQgZnJvbSBbZ2wtbWF0cml4XShodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXgpIGJ5IHRvamlcclxuLy8gIGFuZCBbdmVjbWF0aF0oaHR0cHM6Ly9naXRodWIuY29tL21hdHRkZXNsL3ZlY21hdGgpIGJ5IG1hdHRkZXNsXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSB0aHJlZS1kaW1lbnNpb25hbCBtYXRyaXguXHJcbiAqXHJcbiAqIERlZmF1bHRzIHRvIHRoZSBpZGVudGl0eSBtYXRyaXggd2hlbiBpbnN0YW50aWF0ZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBNYXRyaXgzXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuTWF0aFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4M30gW21dIC0gT3B0aW9uYWwgTWF0cml4MyB0byBjb3B5IHZhbHVlcyBmcm9tLlxyXG4gKi9cclxudmFyIE1hdHJpeDMgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTWF0cml4MyAobSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF0cml4IHZhbHVlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLk1hdHJpeDMjdmFsXHJcbiAgICAgICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZhbCA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XHJcblxyXG4gICAgICAgIGlmIChtKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFzc3VtZSBNYXRyaXgzIHdpdGggdmFsOlxyXG4gICAgICAgICAgICB0aGlzLmNvcHkobSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBEZWZhdWx0IHRvIGlkZW50aXR5XHJcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIGNsb25lIG9mIHRoaXMgTWF0cml4My5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDMjY2xvbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IEEgY2xvbmUgb2YgdGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBjbG9uZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1hdHJpeDModGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgYW4gYWxpYXMgZm9yIGBNYXRyaXgzLmNvcHlgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4MyNzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4M30gc3JjIC0gVGhlIE1hdHJpeCB0byBzZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCdzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weShzcmMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhIGdpdmVuIE1hdHJpeCBpbnRvIHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4MyNjb3B5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDN9IHNyYyAtIFRoZSBNYXRyaXggdG8gY29weSB0aGUgdmFsdWVzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuICAgICAgICB2YXIgYSA9IHNyYy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IGFbMF07XHJcbiAgICAgICAgb3V0WzFdID0gYVsxXTtcclxuICAgICAgICBvdXRbMl0gPSBhWzJdO1xyXG4gICAgICAgIG91dFszXSA9IGFbM107XHJcbiAgICAgICAgb3V0WzRdID0gYVs0XTtcclxuICAgICAgICBvdXRbNV0gPSBhWzVdO1xyXG4gICAgICAgIG91dFs2XSA9IGFbNl07XHJcbiAgICAgICAgb3V0WzddID0gYVs3XTtcclxuICAgICAgICBvdXRbOF0gPSBhWzhdO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYSBnaXZlbiBNYXRyaXg0IGludG8gdGhpcyBNYXRyaXgzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4MyNmcm9tTWF0NFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBtIC0gVGhlIE1hdHJpeDQgdG8gY29weSB0aGUgdmFsdWVzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBmcm9tTWF0NDogZnVuY3Rpb24gKG0pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSBtLnZhbDtcclxuICAgICAgICB2YXIgb3V0ID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IGFbMF07XHJcbiAgICAgICAgb3V0WzFdID0gYVsxXTtcclxuICAgICAgICBvdXRbMl0gPSBhWzJdO1xyXG4gICAgICAgIG91dFszXSA9IGFbNF07XHJcbiAgICAgICAgb3V0WzRdID0gYVs1XTtcclxuICAgICAgICBvdXRbNV0gPSBhWzZdO1xyXG4gICAgICAgIG91dFs2XSA9IGFbOF07XHJcbiAgICAgICAgb3V0WzddID0gYVs5XTtcclxuICAgICAgICBvdXRbOF0gPSBhWzEwXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2YWx1ZXMgb2YgdGhpcyBNYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI2Zyb21BcnJheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gYSAtIFRoZSBhcnJheSB0byBjb3B5IHRoZSB2YWx1ZXMgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXgzfSBUaGlzIE1hdHJpeDMuXHJcbiAgICAgKi9cclxuICAgIGZyb21BcnJheTogZnVuY3Rpb24gKGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICBvdXRbMF0gPSBhWzBdO1xyXG4gICAgICAgIG91dFsxXSA9IGFbMV07XHJcbiAgICAgICAgb3V0WzJdID0gYVsyXTtcclxuICAgICAgICBvdXRbM10gPSBhWzNdO1xyXG4gICAgICAgIG91dFs0XSA9IGFbNF07XHJcbiAgICAgICAgb3V0WzVdID0gYVs1XTtcclxuICAgICAgICBvdXRbNl0gPSBhWzZdO1xyXG4gICAgICAgIG91dFs3XSA9IGFbN107XHJcbiAgICAgICAgb3V0WzhdID0gYVs4XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXQgdGhpcyBNYXRyaXggdG8gYW4gaWRlbnRpdHkgKGRlZmF1bHQpIG1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDMjaWRlbnRpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IFRoaXMgTWF0cml4My5cclxuICAgICAqL1xyXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICBvdXRbMF0gPSAxO1xyXG4gICAgICAgIG91dFsxXSA9IDA7XHJcbiAgICAgICAgb3V0WzJdID0gMDtcclxuICAgICAgICBvdXRbM10gPSAwO1xyXG4gICAgICAgIG91dFs0XSA9IDE7XHJcbiAgICAgICAgb3V0WzVdID0gMDtcclxuICAgICAgICBvdXRbNl0gPSAwO1xyXG4gICAgICAgIG91dFs3XSA9IDA7XHJcbiAgICAgICAgb3V0WzhdID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNwb3NlIHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4MyN0cmFuc3Bvc2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IFRoaXMgTWF0cml4My5cclxuICAgICAqL1xyXG4gICAgdHJhbnNwb3NlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNV07XHJcblxyXG4gICAgICAgIGFbMV0gPSBhWzNdO1xyXG4gICAgICAgIGFbMl0gPSBhWzZdO1xyXG4gICAgICAgIGFbM10gPSBhMDE7XHJcbiAgICAgICAgYVs1XSA9IGFbN107XHJcbiAgICAgICAgYVs2XSA9IGEwMjtcclxuICAgICAgICBhWzddID0gYTEyO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZlcnQgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI2ludmVydFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBpbnZlcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGExMCA9IGFbM107XHJcbiAgICAgICAgdmFyIGExMSA9IGFbNF07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNV07XHJcbiAgICAgICAgdmFyIGEyMCA9IGFbNl07XHJcbiAgICAgICAgdmFyIGEyMSA9IGFbN107XHJcbiAgICAgICAgdmFyIGEyMiA9IGFbOF07XHJcblxyXG4gICAgICAgIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjE7XHJcbiAgICAgICAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjA7XHJcbiAgICAgICAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMDtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxyXG4gICAgICAgIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XHJcblxyXG4gICAgICAgIGlmICghZGV0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZXQgPSAxIC8gZGV0O1xyXG5cclxuICAgICAgICBhWzBdID0gYjAxICogZGV0O1xyXG4gICAgICAgIGFbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXQ7XHJcbiAgICAgICAgYVsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xyXG4gICAgICAgIGFbM10gPSBiMTEgKiBkZXQ7XHJcbiAgICAgICAgYVs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0O1xyXG4gICAgICAgIGFbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XHJcbiAgICAgICAgYVs2XSA9IGIyMSAqIGRldDtcclxuICAgICAgICBhWzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0O1xyXG4gICAgICAgIGFbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBhZGpvaW50LCBvciBhZGp1Z2F0ZSwgb2YgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI2Fkam9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IFRoaXMgTWF0cml4My5cclxuICAgICAqL1xyXG4gICAgYWRqb2ludDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTEwID0gYVszXTtcclxuICAgICAgICB2YXIgYTExID0gYVs0XTtcclxuICAgICAgICB2YXIgYTEyID0gYVs1XTtcclxuICAgICAgICB2YXIgYTIwID0gYVs2XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs3XTtcclxuICAgICAgICB2YXIgYTIyID0gYVs4XTtcclxuXHJcbiAgICAgICAgYVswXSA9IChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpO1xyXG4gICAgICAgIGFbMV0gPSAoYTAyICogYTIxIC0gYTAxICogYTIyKTtcclxuICAgICAgICBhWzJdID0gKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XHJcbiAgICAgICAgYVszXSA9IChhMTIgKiBhMjAgLSBhMTAgKiBhMjIpO1xyXG4gICAgICAgIGFbNF0gPSAoYTAwICogYTIyIC0gYTAyICogYTIwKTtcclxuICAgICAgICBhWzVdID0gKGEwMiAqIGExMCAtIGEwMCAqIGExMik7XHJcbiAgICAgICAgYVs2XSA9IChhMTAgKiBhMjEgLSBhMTEgKiBhMjApO1xyXG4gICAgICAgIGFbN10gPSAoYTAxICogYTIwIC0gYTAwICogYTIxKTtcclxuICAgICAgICBhWzhdID0gKGEwMCAqIGExMSAtIGEwMSAqIGExMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI2RldGVybWluYW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZXRlcm1pbmFudCBvZiB0aGlzIE1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGExMCA9IGFbM107XHJcbiAgICAgICAgdmFyIGExMSA9IGFbNF07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNV07XHJcbiAgICAgICAgdmFyIGEyMCA9IGFbNl07XHJcbiAgICAgICAgdmFyIGEyMSA9IGFbN107XHJcbiAgICAgICAgdmFyIGEyMiA9IGFbOF07XHJcblxyXG4gICAgICAgIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoaXMgTWF0cml4IGJ5IHRoZSBnaXZlbiBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI211bHRpcGx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDN9IHNyYyAtIFRoZSBNYXRyaXggdG8gbXVsdGlwbHkgdGhpcyBNYXRyaXggYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBtdWx0aXBseTogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTEwID0gYVszXTtcclxuICAgICAgICB2YXIgYTExID0gYVs0XTtcclxuICAgICAgICB2YXIgYTEyID0gYVs1XTtcclxuICAgICAgICB2YXIgYTIwID0gYVs2XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs3XTtcclxuICAgICAgICB2YXIgYTIyID0gYVs4XTtcclxuXHJcbiAgICAgICAgdmFyIGIgPSBzcmMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYjAwID0gYlswXTtcclxuICAgICAgICB2YXIgYjAxID0gYlsxXTtcclxuICAgICAgICB2YXIgYjAyID0gYlsyXTtcclxuICAgICAgICB2YXIgYjEwID0gYlszXTtcclxuICAgICAgICB2YXIgYjExID0gYls0XTtcclxuICAgICAgICB2YXIgYjEyID0gYls1XTtcclxuICAgICAgICB2YXIgYjIwID0gYls2XTtcclxuICAgICAgICB2YXIgYjIxID0gYls3XTtcclxuICAgICAgICB2YXIgYjIyID0gYls4XTtcclxuXHJcbiAgICAgICAgYVswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcclxuICAgICAgICBhWzFdID0gYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxO1xyXG4gICAgICAgIGFbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XHJcblxyXG4gICAgICAgIGFbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XHJcbiAgICAgICAgYVs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcclxuICAgICAgICBhWzVdID0gYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyO1xyXG5cclxuICAgICAgICBhWzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xyXG4gICAgICAgIGFbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XHJcbiAgICAgICAgYVs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNsYXRlIHRoaXMgTWF0cml4IHVzaW5nIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI3RyYW5zbGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFZlY3RvciB0byB0cmFuc2xhdGUgdGhpcyBNYXRyaXggd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXgzfSBUaGlzIE1hdHJpeDMuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuICAgICAgICB2YXIgeCA9IHYueDtcclxuICAgICAgICB2YXIgeSA9IHYueTtcclxuXHJcbiAgICAgICAgYVs2XSA9IHggKiBhWzBdICsgeSAqIGFbM10gKyBhWzZdO1xyXG4gICAgICAgIGFbN10gPSB4ICogYVsxXSArIHkgKiBhWzRdICsgYVs3XTtcclxuICAgICAgICBhWzhdID0geCAqIGFbMl0gKyB5ICogYVs1XSArIGFbOF07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgcm90YXRpb24gdHJhbnNmb3JtYXRpb24gdG8gdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI3JvdGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZCAtIFRoZSBhbmdsZSBpbiByYWRpYW5zIHRvIHJvdGF0ZSBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXgzfSBUaGlzIE1hdHJpeDMuXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZTogZnVuY3Rpb24gKHJhZClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTEwID0gYVszXTtcclxuICAgICAgICB2YXIgYTExID0gYVs0XTtcclxuICAgICAgICB2YXIgYTEyID0gYVs1XTtcclxuXHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgIHZhciBjID0gTWF0aC5jb3MocmFkKTtcclxuXHJcbiAgICAgICAgYVswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xyXG4gICAgICAgIGFbMV0gPSBjICogYTAxICsgcyAqIGExMTtcclxuICAgICAgICBhWzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XHJcblxyXG4gICAgICAgIGFbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcclxuICAgICAgICBhWzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XHJcbiAgICAgICAgYVs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSBhIHNjYWxlIHRyYW5zZm9ybWF0aW9uIHRvIHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIFVzZXMgdGhlIGB4YCBhbmQgYHlgIGNvbXBvbmVudHMgb2YgdGhlIGdpdmVuIFZlY3RvciB0byBzY2FsZSB0aGUgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4MyNzY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFZlY3RvciB0byBzY2FsZSB0aGlzIE1hdHJpeCB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IFRoaXMgTWF0cml4My5cclxuICAgICAqL1xyXG4gICAgc2NhbGU6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIHggPSB2Lng7XHJcbiAgICAgICAgdmFyIHkgPSB2Lnk7XHJcblxyXG4gICAgICAgIGFbMF0gPSB4ICogYVswXTtcclxuICAgICAgICBhWzFdID0geCAqIGFbMV07XHJcbiAgICAgICAgYVsyXSA9IHggKiBhWzJdO1xyXG5cclxuICAgICAgICBhWzNdID0geSAqIGFbM107XHJcbiAgICAgICAgYVs0XSA9IHkgKiBhWzRdO1xyXG4gICAgICAgIGFbNV0gPSB5ICogYVs1XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2YWx1ZXMgb2YgdGhpcyBNYXRyaXggZnJvbSB0aGUgZ2l2ZW4gUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDMjZnJvbVF1YXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguUXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uIHRvIHNldCB0aGUgdmFsdWVzIG9mIHRoaXMgTWF0cml4IGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4M30gVGhpcyBNYXRyaXgzLlxyXG4gICAgICovXHJcbiAgICBmcm9tUXVhdDogZnVuY3Rpb24gKHEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSBxLng7XHJcbiAgICAgICAgdmFyIHkgPSBxLnk7XHJcbiAgICAgICAgdmFyIHogPSBxLno7XHJcbiAgICAgICAgdmFyIHcgPSBxLnc7XHJcblxyXG4gICAgICAgIHZhciB4MiA9IHggKyB4O1xyXG4gICAgICAgIHZhciB5MiA9IHkgKyB5O1xyXG4gICAgICAgIHZhciB6MiA9IHogKyB6O1xyXG5cclxuICAgICAgICB2YXIgeHggPSB4ICogeDI7XHJcbiAgICAgICAgdmFyIHh5ID0geCAqIHkyO1xyXG4gICAgICAgIHZhciB4eiA9IHggKiB6MjtcclxuXHJcbiAgICAgICAgdmFyIHl5ID0geSAqIHkyO1xyXG4gICAgICAgIHZhciB5eiA9IHkgKiB6MjtcclxuICAgICAgICB2YXIgenogPSB6ICogejI7XHJcblxyXG4gICAgICAgIHZhciB3eCA9IHcgKiB4MjtcclxuICAgICAgICB2YXIgd3kgPSB3ICogeTI7XHJcbiAgICAgICAgdmFyIHd6ID0gdyAqIHoyO1xyXG5cclxuICAgICAgICB2YXIgb3V0ID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XHJcbiAgICAgICAgb3V0WzNdID0geHkgKyB3ejtcclxuICAgICAgICBvdXRbNl0gPSB4eiAtIHd5O1xyXG5cclxuICAgICAgICBvdXRbMV0gPSB4eSAtIHd6O1xyXG4gICAgICAgIG91dFs0XSA9IDEgLSAoeHggKyB6eik7XHJcbiAgICAgICAgb3V0WzddID0geXogKyB3eDtcclxuXHJcbiAgICAgICAgb3V0WzJdID0geHogKyB3eTtcclxuICAgICAgICBvdXRbNV0gPSB5eiAtIHd4O1xyXG4gICAgICAgIG91dFs4XSA9IDEgLSAoeHggKyB5eSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWVzIG9mIHRoaXMgTWF0cml4MyB0byBiZSBub3JtYWxpemVkIGZyb20gdGhlIGdpdmVuIE1hdHJpeDQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXgzI25vcm1hbEZyb21NYXQ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDR9IG0gLSBUaGUgTWF0cml4NCB0byBub3JtYWxpemUgdGhlIHZhbHVlcyBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDN9IFRoaXMgTWF0cml4My5cclxuICAgICAqL1xyXG4gICAgbm9ybWFsRnJvbU1hdDQ6IGZ1bmN0aW9uIChtKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gbS52YWw7XHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTAzID0gYVszXTtcclxuXHJcbiAgICAgICAgdmFyIGExMCA9IGFbNF07XHJcbiAgICAgICAgdmFyIGExMSA9IGFbNV07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNl07XHJcbiAgICAgICAgdmFyIGExMyA9IGFbN107XHJcblxyXG4gICAgICAgIHZhciBhMjAgPSBhWzhdO1xyXG4gICAgICAgIHZhciBhMjEgPSBhWzldO1xyXG4gICAgICAgIHZhciBhMjIgPSBhWzEwXTtcclxuICAgICAgICB2YXIgYTIzID0gYVsxMV07XHJcblxyXG4gICAgICAgIHZhciBhMzAgPSBhWzEyXTtcclxuICAgICAgICB2YXIgYTMxID0gYVsxM107XHJcbiAgICAgICAgdmFyIGEzMiA9IGFbMTRdO1xyXG4gICAgICAgIHZhciBhMzMgPSBhWzE1XTtcclxuXHJcbiAgICAgICAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcclxuICAgICAgICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xyXG4gICAgICAgIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XHJcbiAgICAgICAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcclxuXHJcbiAgICAgICAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcclxuICAgICAgICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xyXG4gICAgICAgIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XHJcbiAgICAgICAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcclxuXHJcbiAgICAgICAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcclxuICAgICAgICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xyXG4gICAgICAgIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XHJcbiAgICAgICAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxyXG4gICAgICAgIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XHJcblxyXG4gICAgICAgIGlmICghZGV0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZXQgPSAxIC8gZGV0O1xyXG5cclxuICAgICAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcclxuICAgICAgICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcclxuICAgICAgICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcclxuXHJcbiAgICAgICAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XHJcbiAgICAgICAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XHJcbiAgICAgICAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XHJcblxyXG4gICAgICAgIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xyXG4gICAgICAgIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xyXG4gICAgICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXRyaXgzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBBZGFwdGVkIGZyb20gW2dsLW1hdHJpeF0oaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4KSBieSB0b2ppXHJcbi8vICBhbmQgW3ZlY21hdGhdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC92ZWNtYXRoKSBieSBtYXR0ZGVzbFxyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbnZhciBFUFNJTE9OID0gMC4wMDAwMDE7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIGZvdXItZGltZW5zaW9uYWwgbWF0cml4LlxyXG4gKlxyXG4gKiBAY2xhc3MgTWF0cml4NFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLk1hdGhcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFttXSAtIE9wdGlvbmFsIE1hdHJpeDQgdG8gY29weSB2YWx1ZXMgZnJvbS5cclxuICovXHJcbnZhciBNYXRyaXg0ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE1hdHJpeDQgKG0pXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1hdHJpeCB2YWx1ZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5NYXRyaXg0I3ZhbFxyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52YWwgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcclxuXHJcbiAgICAgICAgaWYgKG0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQXNzdW1lIE1hdHJpeDQgd2l0aCB2YWw6XHJcbiAgICAgICAgICAgIHRoaXMuY29weShtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIERlZmF1bHQgdG8gaWRlbnRpdHlcclxuICAgICAgICAgICAgdGhpcy5pZGVudGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgY2xvbmUgb2YgdGhpcyBNYXRyaXg0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNjbG9uZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gQSBjbG9uZSBvZiB0aGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIGNsb25lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBuZXcgTWF0cml4NCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gIFRPRE8gLSBTaG91bGQgd29yayB3aXRoIGJhc2ljIHZhbHVlc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgYW4gYWxpYXMgZm9yIGBNYXRyaXg0LmNvcHlgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4NH0gc3JjIC0gVGhlIE1hdHJpeCB0byBzZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCdzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weShzcmMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhIGdpdmVuIE1hdHJpeCBpbnRvIHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNjb3B5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDR9IHNyYyAtIFRoZSBNYXRyaXggdG8gY29weSB0aGUgdmFsdWVzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuICAgICAgICB2YXIgYSA9IHNyYy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IGFbMF07XHJcbiAgICAgICAgb3V0WzFdID0gYVsxXTtcclxuICAgICAgICBvdXRbMl0gPSBhWzJdO1xyXG4gICAgICAgIG91dFszXSA9IGFbM107XHJcbiAgICAgICAgb3V0WzRdID0gYVs0XTtcclxuICAgICAgICBvdXRbNV0gPSBhWzVdO1xyXG4gICAgICAgIG91dFs2XSA9IGFbNl07XHJcbiAgICAgICAgb3V0WzddID0gYVs3XTtcclxuICAgICAgICBvdXRbOF0gPSBhWzhdO1xyXG4gICAgICAgIG91dFs5XSA9IGFbOV07XHJcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xyXG4gICAgICAgIG91dFsxMV0gPSBhWzExXTtcclxuICAgICAgICBvdXRbMTJdID0gYVsxMl07XHJcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xyXG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcclxuICAgICAgICBvdXRbMTVdID0gYVsxNV07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWVzIG9mIHRoaXMgTWF0cml4IGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNmcm9tQXJyYXlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGEgLSBUaGUgYXJyYXkgdG8gY29weSB0aGUgdmFsdWVzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBmcm9tQXJyYXk6IGZ1bmN0aW9uIChhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgb3V0WzBdID0gYVswXTtcclxuICAgICAgICBvdXRbMV0gPSBhWzFdO1xyXG4gICAgICAgIG91dFsyXSA9IGFbMl07XHJcbiAgICAgICAgb3V0WzNdID0gYVszXTtcclxuICAgICAgICBvdXRbNF0gPSBhWzRdO1xyXG4gICAgICAgIG91dFs1XSA9IGFbNV07XHJcbiAgICAgICAgb3V0WzZdID0gYVs2XTtcclxuICAgICAgICBvdXRbN10gPSBhWzddO1xyXG4gICAgICAgIG91dFs4XSA9IGFbOF07XHJcbiAgICAgICAgb3V0WzldID0gYVs5XTtcclxuICAgICAgICBvdXRbMTBdID0gYVsxMF07XHJcbiAgICAgICAgb3V0WzExXSA9IGFbMTFdO1xyXG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcclxuICAgICAgICBvdXRbMTNdID0gYVsxM107XHJcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xyXG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXQgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogU2V0cyBhbGwgdmFsdWVzIHRvIGAwYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjemVyb1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICB6ZXJvOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgb3V0WzBdID0gMDtcclxuICAgICAgICBvdXRbMV0gPSAwO1xyXG4gICAgICAgIG91dFsyXSA9IDA7XHJcbiAgICAgICAgb3V0WzNdID0gMDtcclxuICAgICAgICBvdXRbNF0gPSAwO1xyXG4gICAgICAgIG91dFs1XSA9IDA7XHJcbiAgICAgICAgb3V0WzZdID0gMDtcclxuICAgICAgICBvdXRbN10gPSAwO1xyXG4gICAgICAgIG91dFs4XSA9IDA7XHJcbiAgICAgICAgb3V0WzldID0gMDtcclxuICAgICAgICBvdXRbMTBdID0gMDtcclxuICAgICAgICBvdXRbMTFdID0gMDtcclxuICAgICAgICBvdXRbMTJdID0gMDtcclxuICAgICAgICBvdXRbMTNdID0gMDtcclxuICAgICAgICBvdXRbMTRdID0gMDtcclxuICAgICAgICBvdXRbMTVdID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBgeGAsIGB5YCBhbmQgYHpgIHZhbHVlcyBvZiB0aGlzIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjeHl6XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICB4eXo6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaWRlbnRpdHkoKTtcclxuXHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICBvdXRbMTJdID0geDtcclxuICAgICAgICBvdXRbMTNdID0geTtcclxuICAgICAgICBvdXRbMTRdID0gejtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzY2FsaW5nIHZhbHVlcyBvZiB0aGlzIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjc2NhbGluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBzY2FsaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBzY2FsaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiBzY2FsaW5nIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgc2NhbGluZzogZnVuY3Rpb24gKHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy56ZXJvKCk7XHJcblxyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgb3V0WzBdID0geDtcclxuICAgICAgICBvdXRbNV0gPSB5O1xyXG4gICAgICAgIG91dFsxMF0gPSB6O1xyXG4gICAgICAgIG91dFsxNV0gPSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldCB0aGlzIE1hdHJpeCB0byBhbiBpZGVudGl0eSAoZGVmYXVsdCkgbWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNpZGVudGl0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBpZGVudGl0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9IDE7XHJcbiAgICAgICAgb3V0WzFdID0gMDtcclxuICAgICAgICBvdXRbMl0gPSAwO1xyXG4gICAgICAgIG91dFszXSA9IDA7XHJcbiAgICAgICAgb3V0WzRdID0gMDtcclxuICAgICAgICBvdXRbNV0gPSAxO1xyXG4gICAgICAgIG91dFs2XSA9IDA7XHJcbiAgICAgICAgb3V0WzddID0gMDtcclxuICAgICAgICBvdXRbOF0gPSAwO1xyXG4gICAgICAgIG91dFs5XSA9IDA7XHJcbiAgICAgICAgb3V0WzEwXSA9IDE7XHJcbiAgICAgICAgb3V0WzExXSA9IDA7XHJcbiAgICAgICAgb3V0WzEyXSA9IDA7XHJcbiAgICAgICAgb3V0WzEzXSA9IDA7XHJcbiAgICAgICAgb3V0WzE0XSA9IDA7XHJcbiAgICAgICAgb3V0WzE1XSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zcG9zZSB0aGlzIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjdHJhbnNwb3NlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zcG9zZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTAzID0gYVszXTtcclxuICAgICAgICB2YXIgYTEyID0gYVs2XTtcclxuICAgICAgICB2YXIgYTEzID0gYVs3XTtcclxuICAgICAgICB2YXIgYTIzID0gYVsxMV07XHJcblxyXG4gICAgICAgIGFbMV0gPSBhWzRdO1xyXG4gICAgICAgIGFbMl0gPSBhWzhdO1xyXG4gICAgICAgIGFbM10gPSBhWzEyXTtcclxuICAgICAgICBhWzRdID0gYTAxO1xyXG4gICAgICAgIGFbNl0gPSBhWzldO1xyXG4gICAgICAgIGFbN10gPSBhWzEzXTtcclxuICAgICAgICBhWzhdID0gYTAyO1xyXG4gICAgICAgIGFbOV0gPSBhMTI7XHJcbiAgICAgICAgYVsxMV0gPSBhWzE0XTtcclxuICAgICAgICBhWzEyXSA9IGEwMztcclxuICAgICAgICBhWzEzXSA9IGExMztcclxuICAgICAgICBhWzE0XSA9IGEyMztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52ZXJ0IHRoaXMgTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNpbnZlcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgaW52ZXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIHZhciBhMDAgPSBhWzBdO1xyXG4gICAgICAgIHZhciBhMDEgPSBhWzFdO1xyXG4gICAgICAgIHZhciBhMDIgPSBhWzJdO1xyXG4gICAgICAgIHZhciBhMDMgPSBhWzNdO1xyXG5cclxuICAgICAgICB2YXIgYTEwID0gYVs0XTtcclxuICAgICAgICB2YXIgYTExID0gYVs1XTtcclxuICAgICAgICB2YXIgYTEyID0gYVs2XTtcclxuICAgICAgICB2YXIgYTEzID0gYVs3XTtcclxuXHJcbiAgICAgICAgdmFyIGEyMCA9IGFbOF07XHJcbiAgICAgICAgdmFyIGEyMSA9IGFbOV07XHJcbiAgICAgICAgdmFyIGEyMiA9IGFbMTBdO1xyXG4gICAgICAgIHZhciBhMjMgPSBhWzExXTtcclxuXHJcbiAgICAgICAgdmFyIGEzMCA9IGFbMTJdO1xyXG4gICAgICAgIHZhciBhMzEgPSBhWzEzXTtcclxuICAgICAgICB2YXIgYTMyID0gYVsxNF07XHJcbiAgICAgICAgdmFyIGEzMyA9IGFbMTVdO1xyXG5cclxuICAgICAgICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xyXG4gICAgICAgIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XHJcbiAgICAgICAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcclxuICAgICAgICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xyXG5cclxuICAgICAgICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xyXG4gICAgICAgIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XHJcbiAgICAgICAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcclxuICAgICAgICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xyXG5cclxuICAgICAgICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xyXG4gICAgICAgIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XHJcbiAgICAgICAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcclxuICAgICAgICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XHJcbiAgICAgICAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcclxuXHJcbiAgICAgICAgaWYgKCFkZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRldCA9IDEgLyBkZXQ7XHJcblxyXG4gICAgICAgIGFbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcclxuICAgICAgICBhWzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XHJcbiAgICAgICAgYVsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xyXG4gICAgICAgIGFbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcclxuICAgICAgICBhWzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XHJcbiAgICAgICAgYVs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xyXG4gICAgICAgIGFbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcclxuICAgICAgICBhWzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XHJcbiAgICAgICAgYVs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xyXG4gICAgICAgIGFbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcclxuICAgICAgICBhWzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xyXG4gICAgICAgIGFbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XHJcbiAgICAgICAgYVsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcclxuICAgICAgICBhWzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xyXG4gICAgICAgIGFbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XHJcbiAgICAgICAgYVsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBhZGpvaW50LCBvciBhZGp1Z2F0ZSwgb2YgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I2Fkam9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgYWRqb2ludDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTAzID0gYVszXTtcclxuXHJcbiAgICAgICAgdmFyIGExMCA9IGFbNF07XHJcbiAgICAgICAgdmFyIGExMSA9IGFbNV07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNl07XHJcbiAgICAgICAgdmFyIGExMyA9IGFbN107XHJcblxyXG4gICAgICAgIHZhciBhMjAgPSBhWzhdO1xyXG4gICAgICAgIHZhciBhMjEgPSBhWzldO1xyXG4gICAgICAgIHZhciBhMjIgPSBhWzEwXTtcclxuICAgICAgICB2YXIgYTIzID0gYVsxMV07XHJcblxyXG4gICAgICAgIHZhciBhMzAgPSBhWzEyXTtcclxuICAgICAgICB2YXIgYTMxID0gYVsxM107XHJcbiAgICAgICAgdmFyIGEzMiA9IGFbMTRdO1xyXG4gICAgICAgIHZhciBhMzMgPSBhWzE1XTtcclxuXHJcbiAgICAgICAgYVswXSA9IChhMTEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xyXG4gICAgICAgIGFbMV0gPSAtKGEwMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XHJcbiAgICAgICAgYVsyXSA9IChhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xyXG4gICAgICAgIGFbM10gPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XHJcbiAgICAgICAgYVs0XSA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcclxuICAgICAgICBhWzVdID0gKGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XHJcbiAgICAgICAgYVs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcclxuICAgICAgICBhWzddID0gKGEwMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTEwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XHJcbiAgICAgICAgYVs4XSA9IChhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkpO1xyXG4gICAgICAgIGFbOV0gPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XHJcbiAgICAgICAgYVsxMF0gPSAoYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcclxuICAgICAgICBhWzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcclxuICAgICAgICBhWzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcclxuICAgICAgICBhWzEzXSA9IChhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkpO1xyXG4gICAgICAgIGFbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xyXG4gICAgICAgIGFbMTVdID0gKGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I2RldGVybWluYW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZXRlcm1pbmFudCBvZiB0aGlzIE1hdHJpeC5cclxuICAgICAqL1xyXG4gICAgZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGEwMyA9IGFbM107XHJcblxyXG4gICAgICAgIHZhciBhMTAgPSBhWzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSBhWzVdO1xyXG4gICAgICAgIHZhciBhMTIgPSBhWzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSBhWzddO1xyXG5cclxuICAgICAgICB2YXIgYTIwID0gYVs4XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs5XTtcclxuICAgICAgICB2YXIgYTIyID0gYVsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IGFbMTFdO1xyXG5cclxuICAgICAgICB2YXIgYTMwID0gYVsxMl07XHJcbiAgICAgICAgdmFyIGEzMSA9IGFbMTNdO1xyXG4gICAgICAgIHZhciBhMzIgPSBhWzE0XTtcclxuICAgICAgICB2YXIgYTMzID0gYVsxNV07XHJcblxyXG4gICAgICAgIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XHJcbiAgICAgICAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcclxuICAgICAgICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xyXG4gICAgICAgIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XHJcbiAgICAgICAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcclxuICAgICAgICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xyXG4gICAgICAgIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XHJcbiAgICAgICAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcclxuICAgICAgICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xyXG4gICAgICAgIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XHJcbiAgICAgICAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcclxuICAgICAgICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XHJcbiAgICAgICAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGlzIE1hdHJpeCBieSB0aGUgZ2l2ZW4gTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNtdWx0aXBseVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBzcmMgLSBUaGUgTWF0cml4IHRvIG11bHRpcGx5IHRoaXMgTWF0cml4IGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGEwMyA9IGFbM107XHJcblxyXG4gICAgICAgIHZhciBhMTAgPSBhWzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSBhWzVdO1xyXG4gICAgICAgIHZhciBhMTIgPSBhWzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSBhWzddO1xyXG5cclxuICAgICAgICB2YXIgYTIwID0gYVs4XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs5XTtcclxuICAgICAgICB2YXIgYTIyID0gYVsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IGFbMTFdO1xyXG5cclxuICAgICAgICB2YXIgYTMwID0gYVsxMl07XHJcbiAgICAgICAgdmFyIGEzMSA9IGFbMTNdO1xyXG4gICAgICAgIHZhciBhMzIgPSBhWzE0XTtcclxuICAgICAgICB2YXIgYTMzID0gYVsxNV07XHJcblxyXG4gICAgICAgIHZhciBiID0gc3JjLnZhbDtcclxuXHJcbiAgICAgICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XHJcbiAgICAgICAgdmFyIGIwID0gYlswXTtcclxuICAgICAgICB2YXIgYjEgPSBiWzFdO1xyXG4gICAgICAgIHZhciBiMiA9IGJbMl07XHJcbiAgICAgICAgdmFyIGIzID0gYlszXTtcclxuXHJcbiAgICAgICAgYVswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xyXG4gICAgICAgIGFbMV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcclxuICAgICAgICBhWzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XHJcbiAgICAgICAgYVszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xyXG5cclxuICAgICAgICBiMCA9IGJbNF07XHJcbiAgICAgICAgYjEgPSBiWzVdO1xyXG4gICAgICAgIGIyID0gYls2XTtcclxuICAgICAgICBiMyA9IGJbN107XHJcblxyXG4gICAgICAgIGFbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcclxuICAgICAgICBhWzVdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XHJcbiAgICAgICAgYVs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xyXG4gICAgICAgIGFbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcclxuXHJcbiAgICAgICAgYjAgPSBiWzhdO1xyXG4gICAgICAgIGIxID0gYls5XTtcclxuICAgICAgICBiMiA9IGJbMTBdO1xyXG4gICAgICAgIGIzID0gYlsxMV07XHJcblxyXG4gICAgICAgIGFbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcclxuICAgICAgICBhWzldID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XHJcbiAgICAgICAgYVsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcclxuICAgICAgICBhWzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xyXG5cclxuICAgICAgICBiMCA9IGJbMTJdO1xyXG4gICAgICAgIGIxID0gYlsxM107XHJcbiAgICAgICAgYjIgPSBiWzE0XTtcclxuICAgICAgICBiMyA9IGJbMTVdO1xyXG5cclxuICAgICAgICBhWzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xyXG4gICAgICAgIGFbMTNdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XHJcbiAgICAgICAgYVsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcclxuICAgICAgICBhWzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGUgdmFsdWVzIG9mIHRoaXMgTWF0cml4NCBieSB0aG9zZSBnaXZlbiBpbiB0aGUgYHNyY2AgYXJndW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I211bHRpcGx5TG9jYWxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4NH0gc3JjIC0gVGhlIHNvdXJjZSBNYXRyaXg0IHRoYXQgdGhpcyBNYXRyaXg0IGlzIG11bHRpcGxpZWQgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBtdWx0aXBseUxvY2FsOiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gW107XHJcbiAgICAgICAgdmFyIG0xID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIG0yID0gc3JjLnZhbDtcclxuXHJcbiAgICAgICAgYVswXSA9IG0xWzBdICogbTJbMF0gKyBtMVsxXSAqIG0yWzRdICsgbTFbMl0gKiBtMls4XSArIG0xWzNdICogbTJbMTJdO1xyXG4gICAgICAgIGFbMV0gPSBtMVswXSAqIG0yWzFdICsgbTFbMV0gKiBtMls1XSArIG0xWzJdICogbTJbOV0gKyBtMVszXSAqIG0yWzEzXTtcclxuICAgICAgICBhWzJdID0gbTFbMF0gKiBtMlsyXSArIG0xWzFdICogbTJbNl0gKyBtMVsyXSAqIG0yWzEwXSArIG0xWzNdICogbTJbMTRdO1xyXG4gICAgICAgIGFbM10gPSBtMVswXSAqIG0yWzNdICsgbTFbMV0gKiBtMls3XSArIG0xWzJdICogbTJbMTFdICsgbTFbM10gKiBtMlsxNV07XHJcblxyXG4gICAgICAgIGFbNF0gPSBtMVs0XSAqIG0yWzBdICsgbTFbNV0gKiBtMls0XSArIG0xWzZdICogbTJbOF0gKyBtMVs3XSAqIG0yWzEyXTtcclxuICAgICAgICBhWzVdID0gbTFbNF0gKiBtMlsxXSArIG0xWzVdICogbTJbNV0gKyBtMVs2XSAqIG0yWzldICsgbTFbN10gKiBtMlsxM107XHJcbiAgICAgICAgYVs2XSA9IG0xWzRdICogbTJbMl0gKyBtMVs1XSAqIG0yWzZdICsgbTFbNl0gKiBtMlsxMF0gKyBtMVs3XSAqIG0yWzE0XTtcclxuICAgICAgICBhWzddID0gbTFbNF0gKiBtMlszXSArIG0xWzVdICogbTJbN10gKyBtMVs2XSAqIG0yWzExXSArIG0xWzddICogbTJbMTVdO1xyXG5cclxuICAgICAgICBhWzhdID0gbTFbOF0gKiBtMlswXSArIG0xWzldICogbTJbNF0gKyBtMVsxMF0gKiBtMls4XSArIG0xWzExXSAqIG0yWzEyXTtcclxuICAgICAgICBhWzldID0gbTFbOF0gKiBtMlsxXSArIG0xWzldICogbTJbNV0gKyBtMVsxMF0gKiBtMls5XSArIG0xWzExXSAqIG0yWzEzXTtcclxuICAgICAgICBhWzEwXSA9IG0xWzhdICogbTJbMl0gKyBtMVs5XSAqIG0yWzZdICsgbTFbMTBdICogbTJbMTBdICsgbTFbMTFdICogbTJbMTRdO1xyXG4gICAgICAgIGFbMTFdID0gbTFbOF0gKiBtMlszXSArIG0xWzldICogbTJbN10gKyBtMVsxMF0gKiBtMlsxMV0gKyBtMVsxMV0gKiBtMlsxNV07XHJcblxyXG4gICAgICAgIGFbMTJdID0gbTFbMTJdICogbTJbMF0gKyBtMVsxM10gKiBtMls0XSArIG0xWzE0XSAqIG0yWzhdICsgbTFbMTVdICogbTJbMTJdO1xyXG4gICAgICAgIGFbMTNdID0gbTFbMTJdICogbTJbMV0gKyBtMVsxM10gKiBtMls1XSArIG0xWzE0XSAqIG0yWzldICsgbTFbMTVdICogbTJbMTNdO1xyXG4gICAgICAgIGFbMTRdID0gbTFbMTJdICogbTJbMl0gKyBtMVsxM10gKiBtMls2XSArIG0xWzE0XSAqIG0yWzEwXSArIG0xWzE1XSAqIG0yWzE0XTtcclxuICAgICAgICBhWzE1XSA9IG0xWzEyXSAqIG0yWzNdICsgbTFbMTNdICogbTJbN10gKyBtMVsxNF0gKiBtMlsxMV0gKyBtMVsxNV0gKiBtMlsxNV07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheShhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2xhdGUgdGhpcyBNYXRyaXggdXNpbmcgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjdHJhbnNsYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFZlY3RvciB0byB0cmFuc2xhdGUgdGhpcyBNYXRyaXggd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB2Lng7XHJcbiAgICAgICAgdmFyIHkgPSB2Lnk7XHJcbiAgICAgICAgdmFyIHogPSB2Lno7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgYVsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcclxuICAgICAgICBhWzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xyXG4gICAgICAgIGFbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xyXG4gICAgICAgIGFbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2xhdGUgdGhpcyBNYXRyaXggdXNpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjdHJhbnNsYXRlWFlaXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgdHJhbnNsYXRlWFlaOiBmdW5jdGlvbiAoeCwgeSwgeilcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICBhWzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xyXG4gICAgICAgIGFbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XHJcbiAgICAgICAgYVsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XHJcbiAgICAgICAgYVsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgc2NhbGUgdHJhbnNmb3JtYXRpb24gdG8gdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogVXNlcyB0aGUgYHhgLCBgeWAgYW5kIGB6YCBjb21wb25lbnRzIG9mIHRoZSBnaXZlbiBWZWN0b3IgdG8gc2NhbGUgdGhlIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjc2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjN8UGhhc2VyLk1hdGguVmVjdG9yNCl9IHYgLSBUaGUgVmVjdG9yIHRvIHNjYWxlIHRoaXMgTWF0cml4IHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBzY2FsZTogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB2Lng7XHJcbiAgICAgICAgdmFyIHkgPSB2Lnk7XHJcbiAgICAgICAgdmFyIHogPSB2Lno7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgYVswXSA9IGFbMF0gKiB4O1xyXG4gICAgICAgIGFbMV0gPSBhWzFdICogeDtcclxuICAgICAgICBhWzJdID0gYVsyXSAqIHg7XHJcbiAgICAgICAgYVszXSA9IGFbM10gKiB4O1xyXG5cclxuICAgICAgICBhWzRdID0gYVs0XSAqIHk7XHJcbiAgICAgICAgYVs1XSA9IGFbNV0gKiB5O1xyXG4gICAgICAgIGFbNl0gPSBhWzZdICogeTtcclxuICAgICAgICBhWzddID0gYVs3XSAqIHk7XHJcblxyXG4gICAgICAgIGFbOF0gPSBhWzhdICogejtcclxuICAgICAgICBhWzldID0gYVs5XSAqIHo7XHJcbiAgICAgICAgYVsxMF0gPSBhWzEwXSAqIHo7XHJcbiAgICAgICAgYVsxMV0gPSBhWzExXSAqIHo7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgc2NhbGUgdHJhbnNmb3JtYXRpb24gdG8gdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I3NjYWxlWFlaXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgc2NhbGVYWVo6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIGFbMF0gPSBhWzBdICogeDtcclxuICAgICAgICBhWzFdID0gYVsxXSAqIHg7XHJcbiAgICAgICAgYVsyXSA9IGFbMl0gKiB4O1xyXG4gICAgICAgIGFbM10gPSBhWzNdICogeDtcclxuXHJcbiAgICAgICAgYVs0XSA9IGFbNF0gKiB5O1xyXG4gICAgICAgIGFbNV0gPSBhWzVdICogeTtcclxuICAgICAgICBhWzZdID0gYVs2XSAqIHk7XHJcbiAgICAgICAgYVs3XSA9IGFbN10gKiB5O1xyXG5cclxuICAgICAgICBhWzhdID0gYVs4XSAqIHo7XHJcbiAgICAgICAgYVs5XSA9IGFbOV0gKiB6O1xyXG4gICAgICAgIGFbMTBdID0gYVsxMF0gKiB6O1xyXG4gICAgICAgIGFbMTFdID0gYVsxMV0gKiB6O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXJpdmUgYSByb3RhdGlvbiBtYXRyaXggYXJvdW5kIHRoZSBnaXZlbiBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNtYWtlUm90YXRpb25BeGlzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSBheGlzIC0gVGhlIHJvdGF0aW9uIGF4aXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgcm90YXRpb24gYW5nbGUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIG1ha2VSb3RhdGlvbkF4aXM6IGZ1bmN0aW9uIChheGlzLCBhbmdsZSlcclxuICAgIHtcclxuICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9hcnRpY2xlcy9hcnRpY2xlMTE5OS5hc3BcclxuXHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAgICAgdmFyIHQgPSAxIC0gYztcclxuICAgICAgICB2YXIgeCA9IGF4aXMueDtcclxuICAgICAgICB2YXIgeSA9IGF4aXMueTtcclxuICAgICAgICB2YXIgeiA9IGF4aXMuejtcclxuICAgICAgICB2YXIgdHggPSB0ICogeDtcclxuICAgICAgICB2YXIgdHkgPSB0ICogeTtcclxuXHJcbiAgICAgICAgdGhpcy5mcm9tQXJyYXkoW1xyXG4gICAgICAgICAgICB0eCAqIHggKyBjLCB0eCAqIHkgLSBzICogeiwgdHggKiB6ICsgcyAqIHksIDAsXHJcbiAgICAgICAgICAgIHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcclxuICAgICAgICAgICAgdHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxyXG4gICAgICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgICAgXSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IGEgcm90YXRpb24gdHJhbnNmb3JtYXRpb24gdG8gdGhpcyBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I3JvdGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZCAtIFRoZSBhbmdsZSBpbiByYWRpYW5zIHRvIHJvdGF0ZSBieS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gYXhpcyAtIFRoZSBheGlzIHRvIHJvdGF0ZSB1cG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgcm90YXRlOiBmdW5jdGlvbiAocmFkLCBheGlzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIHggPSBheGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSBheGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSBheGlzLno7XHJcbiAgICAgICAgdmFyIGxlbiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopO1xyXG5cclxuICAgICAgICBpZiAoTWF0aC5hYnMobGVuKSA8IEVQU0lMT04pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxlbiA9IDEgLyBsZW47XHJcbiAgICAgICAgeCAqPSBsZW47XHJcbiAgICAgICAgeSAqPSBsZW47XHJcbiAgICAgICAgeiAqPSBsZW47XHJcblxyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcclxuICAgICAgICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XHJcbiAgICAgICAgdmFyIHQgPSAxIC0gYztcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGEwMyA9IGFbM107XHJcblxyXG4gICAgICAgIHZhciBhMTAgPSBhWzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSBhWzVdO1xyXG4gICAgICAgIHZhciBhMTIgPSBhWzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSBhWzddO1xyXG5cclxuICAgICAgICB2YXIgYTIwID0gYVs4XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs5XTtcclxuICAgICAgICB2YXIgYTIyID0gYVsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IGFbMTFdO1xyXG5cclxuICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcclxuICAgICAgICB2YXIgYjAwID0geCAqIHggKiB0ICsgYztcclxuICAgICAgICB2YXIgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XHJcbiAgICAgICAgdmFyIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xyXG5cclxuICAgICAgICB2YXIgYjEwID0geCAqIHkgKiB0IC0geiAqIHM7XHJcbiAgICAgICAgdmFyIGIxMSA9IHkgKiB5ICogdCArIGM7XHJcbiAgICAgICAgdmFyIGIxMiA9IHogKiB5ICogdCArIHggKiBzO1xyXG5cclxuICAgICAgICB2YXIgYjIwID0geCAqIHogKiB0ICsgeSAqIHM7XHJcbiAgICAgICAgdmFyIGIyMSA9IHkgKiB6ICogdCAtIHggKiBzO1xyXG4gICAgICAgIHZhciBiMjIgPSB6ICogeiAqIHQgKyBjO1xyXG5cclxuICAgICAgICAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxyXG4gICAgICAgIGFbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XHJcbiAgICAgICAgYVsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcclxuICAgICAgICBhWzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xyXG4gICAgICAgIGFbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XHJcbiAgICAgICAgYVs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcclxuICAgICAgICBhWzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xyXG4gICAgICAgIGFbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XHJcbiAgICAgICAgYVs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcclxuICAgICAgICBhWzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xyXG4gICAgICAgIGFbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XHJcbiAgICAgICAgYVsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XHJcbiAgICAgICAgYVsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZSB0aGlzIG1hdHJpeCBvbiBpdHMgWCBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNyb3RhdGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMgdG8gcm90YXRlIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgcm90YXRlWDogZnVuY3Rpb24gKHJhZClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9IHRoaXMudmFsO1xyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcclxuICAgICAgICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XHJcblxyXG4gICAgICAgIHZhciBhMTAgPSBhWzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSBhWzVdO1xyXG4gICAgICAgIHZhciBhMTIgPSBhWzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSBhWzddO1xyXG5cclxuICAgICAgICB2YXIgYTIwID0gYVs4XTtcclxuICAgICAgICB2YXIgYTIxID0gYVs5XTtcclxuICAgICAgICB2YXIgYTIyID0gYVsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IGFbMTFdO1xyXG5cclxuICAgICAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXHJcbiAgICAgICAgYVs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xyXG4gICAgICAgIGFbNV0gPSBhMTEgKiBjICsgYTIxICogcztcclxuICAgICAgICBhWzZdID0gYTEyICogYyArIGEyMiAqIHM7XHJcbiAgICAgICAgYVs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xyXG4gICAgICAgIGFbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcclxuICAgICAgICBhWzldID0gYTIxICogYyAtIGExMSAqIHM7XHJcbiAgICAgICAgYVsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcclxuICAgICAgICBhWzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGUgdGhpcyBtYXRyaXggb24gaXRzIFkgYXhpcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjcm90YXRlWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZCAtIFRoZSBhbmdsZSB0byByb3RhdGUgYnksIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICByb3RhdGVZOiBmdW5jdGlvbiAocmFkKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgIHZhciBjID0gTWF0aC5jb3MocmFkKTtcclxuXHJcbiAgICAgICAgdmFyIGEwMCA9IGFbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IGFbMV07XHJcbiAgICAgICAgdmFyIGEwMiA9IGFbMl07XHJcbiAgICAgICAgdmFyIGEwMyA9IGFbM107XHJcblxyXG4gICAgICAgIHZhciBhMjAgPSBhWzhdO1xyXG4gICAgICAgIHZhciBhMjEgPSBhWzldO1xyXG4gICAgICAgIHZhciBhMjIgPSBhWzEwXTtcclxuICAgICAgICB2YXIgYTIzID0gYVsxMV07XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cclxuICAgICAgICBhWzBdID0gYTAwICogYyAtIGEyMCAqIHM7XHJcbiAgICAgICAgYVsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xyXG4gICAgICAgIGFbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcclxuICAgICAgICBhWzNdID0gYTAzICogYyAtIGEyMyAqIHM7XHJcbiAgICAgICAgYVs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xyXG4gICAgICAgIGFbOV0gPSBhMDEgKiBzICsgYTIxICogYztcclxuICAgICAgICBhWzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xyXG4gICAgICAgIGFbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZSB0aGlzIG1hdHJpeCBvbiBpdHMgWiBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNyb3RhdGVaXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSBieSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZVo6IGZ1bmN0aW9uIChyYWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGEgPSB0aGlzLnZhbDtcclxuICAgICAgICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gYVswXTtcclxuICAgICAgICB2YXIgYTAxID0gYVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gYVsyXTtcclxuICAgICAgICB2YXIgYTAzID0gYVszXTtcclxuXHJcbiAgICAgICAgdmFyIGExMCA9IGFbNF07XHJcbiAgICAgICAgdmFyIGExMSA9IGFbNV07XHJcbiAgICAgICAgdmFyIGExMiA9IGFbNl07XHJcbiAgICAgICAgdmFyIGExMyA9IGFbN107XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cclxuICAgICAgICBhWzBdID0gYTAwICogYyArIGExMCAqIHM7XHJcbiAgICAgICAgYVsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xyXG4gICAgICAgIGFbMl0gPSBhMDIgKiBjICsgYTEyICogcztcclxuICAgICAgICBhWzNdID0gYTAzICogYyArIGExMyAqIHM7XHJcbiAgICAgICAgYVs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xyXG4gICAgICAgIGFbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcclxuICAgICAgICBhWzZdID0gYTEyICogYyAtIGEwMiAqIHM7XHJcbiAgICAgICAgYVs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCBmcm9tIHRoZSBnaXZlbiByb3RhdGlvbiBRdWF0ZXJuaW9uIGFuZCB0cmFuc2xhdGlvbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I2Zyb21Sb3RhdGlvblRyYW5zbGF0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbiB0byBzZXQgcm90YXRpb24gZnJvbS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdiAtIFRoZSBWZWN0b3IgdG8gc2V0IHRyYW5zbGF0aW9uIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbjogZnVuY3Rpb24gKHEsIHYpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gUXVhdGVybmlvbiBtYXRoXHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgeCA9IHEueDtcclxuICAgICAgICB2YXIgeSA9IHEueTtcclxuICAgICAgICB2YXIgeiA9IHEuejtcclxuICAgICAgICB2YXIgdyA9IHEudztcclxuXHJcbiAgICAgICAgdmFyIHgyID0geCArIHg7XHJcbiAgICAgICAgdmFyIHkyID0geSArIHk7XHJcbiAgICAgICAgdmFyIHoyID0geiArIHo7XHJcblxyXG4gICAgICAgIHZhciB4eCA9IHggKiB4MjtcclxuICAgICAgICB2YXIgeHkgPSB4ICogeTI7XHJcbiAgICAgICAgdmFyIHh6ID0geCAqIHoyO1xyXG5cclxuICAgICAgICB2YXIgeXkgPSB5ICogeTI7XHJcbiAgICAgICAgdmFyIHl6ID0geSAqIHoyO1xyXG4gICAgICAgIHZhciB6eiA9IHogKiB6MjtcclxuXHJcbiAgICAgICAgdmFyIHd4ID0gdyAqIHgyO1xyXG4gICAgICAgIHZhciB3eSA9IHcgKiB5MjtcclxuICAgICAgICB2YXIgd3ogPSB3ICogejI7XHJcblxyXG4gICAgICAgIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XHJcbiAgICAgICAgb3V0WzFdID0geHkgKyB3ejtcclxuICAgICAgICBvdXRbMl0gPSB4eiAtIHd5O1xyXG4gICAgICAgIG91dFszXSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs0XSA9IHh5IC0gd3o7XHJcbiAgICAgICAgb3V0WzVdID0gMSAtICh4eCArIHp6KTtcclxuICAgICAgICBvdXRbNl0gPSB5eiArIHd4O1xyXG4gICAgICAgIG91dFs3XSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs4XSA9IHh6ICsgd3k7XHJcbiAgICAgICAgb3V0WzldID0geXogLSB3eDtcclxuICAgICAgICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcclxuICAgICAgICBvdXRbMTFdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzEyXSA9IHYueDtcclxuICAgICAgICBvdXRbMTNdID0gdi55O1xyXG4gICAgICAgIG91dFsxNF0gPSB2Lno7XHJcbiAgICAgICAgb3V0WzE1XSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWVzIG9mIHRoaXMgTWF0cml4IGZyb20gdGhlIGdpdmVuIFF1YXRlcm5pb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I2Zyb21RdWF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbiB0byBzZXQgdGhlIHZhbHVlcyBvZiB0aGlzIE1hdHJpeCBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgZnJvbVF1YXQ6IGZ1bmN0aW9uIChxKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIHggPSBxLng7XHJcbiAgICAgICAgdmFyIHkgPSBxLnk7XHJcbiAgICAgICAgdmFyIHogPSBxLno7XHJcbiAgICAgICAgdmFyIHcgPSBxLnc7XHJcblxyXG4gICAgICAgIHZhciB4MiA9IHggKyB4O1xyXG4gICAgICAgIHZhciB5MiA9IHkgKyB5O1xyXG4gICAgICAgIHZhciB6MiA9IHogKyB6O1xyXG5cclxuICAgICAgICB2YXIgeHggPSB4ICogeDI7XHJcbiAgICAgICAgdmFyIHh5ID0geCAqIHkyO1xyXG4gICAgICAgIHZhciB4eiA9IHggKiB6MjtcclxuXHJcbiAgICAgICAgdmFyIHl5ID0geSAqIHkyO1xyXG4gICAgICAgIHZhciB5eiA9IHkgKiB6MjtcclxuICAgICAgICB2YXIgenogPSB6ICogejI7XHJcblxyXG4gICAgICAgIHZhciB3eCA9IHcgKiB4MjtcclxuICAgICAgICB2YXIgd3kgPSB3ICogeTI7XHJcbiAgICAgICAgdmFyIHd6ID0gdyAqIHoyO1xyXG5cclxuICAgICAgICBvdXRbMF0gPSAxIC0gKHl5ICsgenopO1xyXG4gICAgICAgIG91dFsxXSA9IHh5ICsgd3o7XHJcbiAgICAgICAgb3V0WzJdID0geHogLSB3eTtcclxuICAgICAgICBvdXRbM10gPSAwO1xyXG5cclxuICAgICAgICBvdXRbNF0gPSB4eSAtIHd6O1xyXG4gICAgICAgIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XHJcbiAgICAgICAgb3V0WzZdID0geXogKyB3eDtcclxuICAgICAgICBvdXRbN10gPSAwO1xyXG5cclxuICAgICAgICBvdXRbOF0gPSB4eiArIHd5O1xyXG4gICAgICAgIG91dFs5XSA9IHl6IC0gd3g7XHJcbiAgICAgICAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XHJcbiAgICAgICAgb3V0WzExXSA9IDA7XHJcblxyXG4gICAgICAgIG91dFsxMl0gPSAwO1xyXG4gICAgICAgIG91dFsxM10gPSAwO1xyXG4gICAgICAgIG91dFsxNF0gPSAwO1xyXG4gICAgICAgIG91dFsxNV0gPSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjZnJ1c3R1bVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCAtIFRoZSByaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gLSBUaGUgYm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvcCAtIFRoZSB0b3AgYm91bmQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmVhciAtIFRoZSBuZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZhciAtIFRoZSBmYXIgYm91bmQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBmcnVzdHVtOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG5cclxuICAgICAgICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCk7XHJcbiAgICAgICAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xyXG4gICAgICAgIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XHJcblxyXG4gICAgICAgIG91dFswXSA9IChuZWFyICogMikgKiBybDtcclxuICAgICAgICBvdXRbMV0gPSAwO1xyXG4gICAgICAgIG91dFsyXSA9IDA7XHJcbiAgICAgICAgb3V0WzNdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzRdID0gMDtcclxuICAgICAgICBvdXRbNV0gPSAobmVhciAqIDIpICogdGI7XHJcbiAgICAgICAgb3V0WzZdID0gMDtcclxuICAgICAgICBvdXRbN10gPSAwO1xyXG5cclxuICAgICAgICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xyXG4gICAgICAgIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XHJcbiAgICAgICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xyXG4gICAgICAgIG91dFsxMV0gPSAtMTtcclxuXHJcbiAgICAgICAgb3V0WzEyXSA9IDA7XHJcbiAgICAgICAgb3V0WzEzXSA9IDA7XHJcbiAgICAgICAgb3V0WzE0XSA9IChmYXIgKiBuZWFyICogMikgKiBuZjtcclxuICAgICAgICBvdXRbMTVdID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGUgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5NYXRyaXg0I3BlcnNwZWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZm92eSAtIFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCAtIEFzcGVjdCByYXRpby4gVHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoICAvaGVpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZhciAtIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIHBlcnNwZWN0aXZlOiBmdW5jdGlvbiAoZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG91dCA9IHRoaXMudmFsO1xyXG4gICAgICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpO1xyXG4gICAgICAgIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XHJcblxyXG4gICAgICAgIG91dFswXSA9IGYgLyBhc3BlY3Q7XHJcbiAgICAgICAgb3V0WzFdID0gMDtcclxuICAgICAgICBvdXRbMl0gPSAwO1xyXG4gICAgICAgIG91dFszXSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs0XSA9IDA7XHJcbiAgICAgICAgb3V0WzVdID0gZjtcclxuICAgICAgICBvdXRbNl0gPSAwO1xyXG4gICAgICAgIG91dFs3XSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs4XSA9IDA7XHJcbiAgICAgICAgb3V0WzldID0gMDtcclxuICAgICAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XHJcbiAgICAgICAgb3V0WzExXSA9IC0xO1xyXG5cclxuICAgICAgICBvdXRbMTJdID0gMDtcclxuICAgICAgICBvdXRbMTNdID0gMDtcclxuICAgICAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mO1xyXG4gICAgICAgIG91dFsxNV0gPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjcGVyc3BlY3RpdmVMSFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmVhciAtIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZmFyIC0gRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgcGVyc3BlY3RpdmVMSDogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIG5lYXIsIGZhcilcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gdGhpcy52YWw7XHJcblxyXG4gICAgICAgIG91dFswXSA9ICgyICogbmVhcikgLyB3aWR0aDtcclxuICAgICAgICBvdXRbMV0gPSAwO1xyXG4gICAgICAgIG91dFsyXSA9IDA7XHJcbiAgICAgICAgb3V0WzNdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzRdID0gMDtcclxuICAgICAgICBvdXRbNV0gPSAoMiAqIG5lYXIpIC8gaGVpZ2h0O1xyXG4gICAgICAgIG91dFs2XSA9IDA7XHJcbiAgICAgICAgb3V0WzddID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzhdID0gMDtcclxuICAgICAgICBvdXRbOV0gPSAwO1xyXG4gICAgICAgIG91dFsxMF0gPSAtZmFyIC8gKG5lYXIgLSBmYXIpO1xyXG4gICAgICAgIG91dFsxMV0gPSAxO1xyXG5cclxuICAgICAgICBvdXRbMTJdID0gMDtcclxuICAgICAgICBvdXRbMTNdID0gMDtcclxuICAgICAgICBvdXRbMTRdID0gKG5lYXIgKiBmYXIpIC8gKG5lYXIgLSBmYXIpO1xyXG4gICAgICAgIG91dFsxNV0gPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBhbiBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjb3J0aG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgYm91bmQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBUaGUgcmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIC0gVGhlIGJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBUaGUgbmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgLSBUaGUgZmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgb3J0aG86IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcilcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gdGhpcy52YWw7XHJcbiAgICAgICAgdmFyIGxyID0gbGVmdCAtIHJpZ2h0O1xyXG4gICAgICAgIHZhciBidCA9IGJvdHRvbSAtIHRvcDtcclxuICAgICAgICB2YXIgbmYgPSBuZWFyIC0gZmFyO1xyXG5cclxuICAgICAgICAvLyAgQXZvaWQgZGl2aXNpb24gYnkgemVyb1xyXG4gICAgICAgIGxyID0gKGxyID09PSAwKSA/IGxyIDogMSAvIGxyO1xyXG4gICAgICAgIGJ0ID0gKGJ0ID09PSAwKSA/IGJ0IDogMSAvIGJ0O1xyXG4gICAgICAgIG5mID0gKG5mID09PSAwKSA/IG5mIDogMSAvIG5mO1xyXG5cclxuICAgICAgICBvdXRbMF0gPSAtMiAqIGxyO1xyXG4gICAgICAgIG91dFsxXSA9IDA7XHJcbiAgICAgICAgb3V0WzJdID0gMDtcclxuICAgICAgICBvdXRbM10gPSAwO1xyXG5cclxuICAgICAgICBvdXRbNF0gPSAwO1xyXG4gICAgICAgIG91dFs1XSA9IC0yICogYnQ7XHJcbiAgICAgICAgb3V0WzZdID0gMDtcclxuICAgICAgICBvdXRbN10gPSAwO1xyXG5cclxuICAgICAgICBvdXRbOF0gPSAwO1xyXG4gICAgICAgIG91dFs5XSA9IDA7XHJcbiAgICAgICAgb3V0WzEwXSA9IDIgKiBuZjtcclxuICAgICAgICBvdXRbMTFdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XHJcbiAgICAgICAgb3V0WzEzXSA9ICh0b3AgKyBib3R0b20pICogYnQ7XHJcbiAgICAgICAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xyXG4gICAgICAgIG91dFsxNV0gPSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmF0ZSBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCNsb29rQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gZXllIC0gUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBjZW50ZXIgLSBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdXAgLSB2ZWMzIHBvaW50aW5nIHVwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLk1hdHJpeDR9IFRoaXMgTWF0cml4NC5cclxuICAgICAqL1xyXG4gICAgbG9va0F0OiBmdW5jdGlvbiAoZXllLCBjZW50ZXIsIHVwKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXQgPSB0aGlzLnZhbDtcclxuXHJcbiAgICAgICAgdmFyIGV5ZXggPSBleWUueDtcclxuICAgICAgICB2YXIgZXlleSA9IGV5ZS55O1xyXG4gICAgICAgIHZhciBleWV6ID0gZXllLno7XHJcblxyXG4gICAgICAgIHZhciB1cHggPSB1cC54O1xyXG4gICAgICAgIHZhciB1cHkgPSB1cC55O1xyXG4gICAgICAgIHZhciB1cHogPSB1cC56O1xyXG5cclxuICAgICAgICB2YXIgY2VudGVyeCA9IGNlbnRlci54O1xyXG4gICAgICAgIHZhciBjZW50ZXJ5ID0gY2VudGVyLnk7XHJcbiAgICAgICAgdmFyIGNlbnRlcnogPSBjZW50ZXIuejtcclxuXHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IEVQU0lMT04gJiZcclxuICAgICAgICAgICAgTWF0aC5hYnMoZXlleSAtIGNlbnRlcnkpIDwgRVBTSUxPTiAmJlxyXG4gICAgICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCBFUFNJTE9OKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xyXG4gICAgICAgIHZhciB6MSA9IGV5ZXkgLSBjZW50ZXJ5O1xyXG4gICAgICAgIHZhciB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xyXG5cclxuICAgICAgICB2YXIgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xyXG5cclxuICAgICAgICB6MCAqPSBsZW47XHJcbiAgICAgICAgejEgKj0gbGVuO1xyXG4gICAgICAgIHoyICo9IGxlbjtcclxuXHJcbiAgICAgICAgdmFyIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcclxuICAgICAgICB2YXIgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xyXG4gICAgICAgIHZhciB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XHJcblxyXG4gICAgICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xyXG5cclxuICAgICAgICBpZiAoIWxlbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHgwID0gMDtcclxuICAgICAgICAgICAgeDEgPSAwO1xyXG4gICAgICAgICAgICB4MiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxlbiA9IDEgLyBsZW47XHJcbiAgICAgICAgICAgIHgwICo9IGxlbjtcclxuICAgICAgICAgICAgeDEgKj0gbGVuO1xyXG4gICAgICAgICAgICB4MiAqPSBsZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcclxuICAgICAgICB2YXIgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcclxuICAgICAgICB2YXIgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcclxuXHJcbiAgICAgICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XHJcblxyXG4gICAgICAgIGlmICghbGVuKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeTAgPSAwO1xyXG4gICAgICAgICAgICB5MSA9IDA7XHJcbiAgICAgICAgICAgIHkyID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGVuID0gMSAvIGxlbjtcclxuICAgICAgICAgICAgeTAgKj0gbGVuO1xyXG4gICAgICAgICAgICB5MSAqPSBsZW47XHJcbiAgICAgICAgICAgIHkyICo9IGxlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG91dFswXSA9IHgwO1xyXG4gICAgICAgIG91dFsxXSA9IHkwO1xyXG4gICAgICAgIG91dFsyXSA9IHowO1xyXG4gICAgICAgIG91dFszXSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs0XSA9IHgxO1xyXG4gICAgICAgIG91dFs1XSA9IHkxO1xyXG4gICAgICAgIG91dFs2XSA9IHoxO1xyXG4gICAgICAgIG91dFs3XSA9IDA7XHJcblxyXG4gICAgICAgIG91dFs4XSA9IHgyO1xyXG4gICAgICAgIG91dFs5XSA9IHkyO1xyXG4gICAgICAgIG91dFsxMF0gPSB6MjtcclxuICAgICAgICBvdXRbMTFdID0gMDtcclxuXHJcbiAgICAgICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcclxuICAgICAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xyXG4gICAgICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XHJcbiAgICAgICAgb3V0WzE1XSA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWVzIG9mIHRoaXMgbWF0cml4IGZyb20gdGhlIGdpdmVuIGB5YXdgLCBgcGl0Y2hgIGFuZCBgcm9sbGAgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguTWF0cml4NCN5YXdQaXRjaFJvbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5YXcgLSBUaGUgeWF3IHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBpdGNoIC0gVGhlIHBpdGNoIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvbGwgLSBUaGUgcm9sbCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBUaGlzIE1hdHJpeDQuXHJcbiAgICAgKi9cclxuICAgIHlhd1BpdGNoUm9sbDogZnVuY3Rpb24gKHlhdywgcGl0Y2gsIHJvbGwpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy56ZXJvKCk7XHJcbiAgICAgICAgX3RlbXBNYXQxLnplcm8oKTtcclxuICAgICAgICBfdGVtcE1hdDIuemVybygpO1xyXG5cclxuICAgICAgICB2YXIgbTAgPSB0aGlzLnZhbDtcclxuICAgICAgICB2YXIgbTEgPSBfdGVtcE1hdDEudmFsO1xyXG4gICAgICAgIHZhciBtMiA9IF90ZW1wTWF0Mi52YWw7XHJcblxyXG4gICAgICAgIC8vICBSb3RhdGUgWlxyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocm9sbCk7XHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyb2xsKTtcclxuXHJcbiAgICAgICAgbTBbMTBdID0gMTtcclxuICAgICAgICBtMFsxNV0gPSAxO1xyXG4gICAgICAgIG0wWzBdID0gYztcclxuICAgICAgICBtMFsxXSA9IHM7XHJcbiAgICAgICAgbTBbNF0gPSAtcztcclxuICAgICAgICBtMFs1XSA9IGM7XHJcblxyXG4gICAgICAgIC8vICBSb3RhdGUgWFxyXG4gICAgICAgIHMgPSBNYXRoLnNpbihwaXRjaCk7XHJcbiAgICAgICAgYyA9IE1hdGguY29zKHBpdGNoKTtcclxuXHJcbiAgICAgICAgbTFbMF0gPSAxO1xyXG4gICAgICAgIG0xWzE1XSA9IDE7XHJcbiAgICAgICAgbTFbNV0gPSBjO1xyXG4gICAgICAgIG0xWzEwXSA9IGM7XHJcbiAgICAgICAgbTFbOV0gPSAtcztcclxuICAgICAgICBtMVs2XSA9IHM7XHJcblxyXG4gICAgICAgIC8vICBSb3RhdGUgWVxyXG4gICAgICAgIHMgPSBNYXRoLnNpbih5YXcpO1xyXG4gICAgICAgIGMgPSBNYXRoLmNvcyh5YXcpO1xyXG5cclxuICAgICAgICBtMls1XSA9IDE7XHJcbiAgICAgICAgbTJbMTVdID0gMTtcclxuICAgICAgICBtMlswXSA9IGM7XHJcbiAgICAgICAgbTJbMl0gPSAtcztcclxuICAgICAgICBtMls4XSA9IHM7XHJcbiAgICAgICAgbTJbMTBdID0gYztcclxuXHJcbiAgICAgICAgdGhpcy5tdWx0aXBseUxvY2FsKF90ZW1wTWF0MSk7XHJcbiAgICAgICAgdGhpcy5tdWx0aXBseUxvY2FsKF90ZW1wTWF0Mik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXRlIGEgd29ybGQgbWF0cml4IGZyb20gdGhlIGdpdmVuIHJvdGF0aW9uLCBwb3NpdGlvbiwgc2NhbGUsIHZpZXcgbWF0cml4IGFuZCBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLk1hdHJpeDQjc2V0V29ybGRNYXRyaXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gcm90YXRpb24gLSBUaGUgcm90YXRpb24gb2YgdGhlIHdvcmxkIG1hdHJpeC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIHdvcmxkIG1hdHJpeC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gc2NhbGUgLSBUaGUgc2NhbGUgb2YgdGhlIHdvcmxkIG1hdHJpeC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4NH0gW3ZpZXdNYXRyaXhdIC0gVGhlIHZpZXcgbWF0cml4LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBbcHJvamVjdGlvbk1hdHJpeF0gLSBUaGUgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguTWF0cml4NH0gVGhpcyBNYXRyaXg0LlxyXG4gICAgICovXHJcbiAgICBzZXRXb3JsZE1hdHJpeDogZnVuY3Rpb24gKHJvdGF0aW9uLCBwb3NpdGlvbiwgc2NhbGUsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy55YXdQaXRjaFJvbGwocm90YXRpb24ueSwgcm90YXRpb24ueCwgcm90YXRpb24ueik7XHJcblxyXG4gICAgICAgIF90ZW1wTWF0MS5zY2FsaW5nKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopO1xyXG4gICAgICAgIF90ZW1wTWF0Mi54eXoocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcblxyXG4gICAgICAgIHRoaXMubXVsdGlwbHlMb2NhbChfdGVtcE1hdDEpO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbHlMb2NhbChfdGVtcE1hdDIpO1xyXG5cclxuICAgICAgICBpZiAodmlld01hdHJpeCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aXBseUxvY2FsKHZpZXdNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb2plY3Rpb25NYXRyaXggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbHlMb2NhbChwcm9qZWN0aW9uTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG52YXIgX3RlbXBNYXQxID0gbmV3IE1hdHJpeDQoKTtcclxudmFyIF90ZW1wTWF0MiA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhbiBgYW1vdW50YCB0byBhIGB2YWx1ZWAsIGxpbWl0aW5nIHRoZSBtYXhpbXVtIHJlc3VsdCB0byBgbWF4YC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLk1heEFkZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFkZCB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCAtIFRoZSBhbW91bnQgdG8gYWRkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUgdG8gcmV0dXJuLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHRpbmcgdmFsdWUuXHJcbiAqL1xyXG52YXIgTWF4QWRkID0gZnVuY3Rpb24gKHZhbHVlLCBhbW91bnQsIG1heClcclxue1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHZhbHVlICsgYW1vdW50LCBtYXgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXhBZGQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFN1YnRyYWN0IGFuIGBhbW91bnRgIGZyb20gYHZhbHVlYCwgbGltaXRpbmcgdGhlIG1pbmltdW0gcmVzdWx0IHRvIGBtaW5gLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguTWluU3ViXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc3VidHJhY3QgZnJvbS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSB0byByZXR1cm4uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdGluZyB2YWx1ZS5cclxuICovXHJcbnZhciBNaW5TdWIgPSBmdW5jdGlvbiAodmFsdWUsIGFtb3VudCwgbWluKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5tYXgodmFsdWUgLSBhbW91bnQsIG1pbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1pblN1YjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogV29yayBvdXQgd2hhdCBwZXJjZW50YWdlIGB2YWx1ZWAgaXMgb2YgdGhlIHJhbmdlIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLlxyXG4gKiBJZiBgbWF4YCBpc24ndCBnaXZlbiB0aGVuIGl0IHdpbGwgcmV0dXJuIHRoZSBwZXJjZW50YWdlIG9mIGB2YWx1ZWAgdG8gYG1pbmAuXHJcbiAqXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGFuIGB1cHBlck1heGAgdmFsdWUsIHdoaWNoIGlzIGEgbWlkLXdheSBwb2ludCBpbiB0aGUgcmFuZ2UgdGhhdCByZXByZXNlbnRzIDEwMCUsIGFmdGVyIHdoaWNoIHRoZSAlIHN0YXJ0cyB0byBnbyBkb3duIHRvIHplcm8gYWdhaW4uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5QZXJjZW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBwZXJjZW50YWdlIG9mLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4XSAtIFRoZSBtYXhpbXVtIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyTWF4XSAtIFRoZSBtaWQtd2F5IHBvaW50IGluIHRoZSByYW5nZSB0aGF0IHJlcHJlc2VudHMgMTAwJS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSByZXByZXNlbnRpbmcgdGhlIHBlcmNlbnRhZ2UuXHJcbiAqL1xyXG52YXIgUGVyY2VudCA9IGZ1bmN0aW9uICh2YWx1ZSwgbWluLCBtYXgsIHVwcGVyTWF4KVxyXG57XHJcbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQpIHsgbWF4ID0gbWluICsgMTsgfVxyXG5cclxuICAgIHZhciBwZXJjZW50YWdlID0gKHZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pO1xyXG5cclxuICAgIGlmIChwZXJjZW50YWdlID4gMSlcclxuICAgIHtcclxuICAgICAgICBpZiAodXBwZXJNYXggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAoKHVwcGVyTWF4IC0gdmFsdWUpKSAvICh1cHBlck1heCAtIG1heCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGVyY2VudGFnZSA8IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHBlcmNlbnRhZ2UgPCAwKVxyXG4gICAge1xyXG4gICAgICAgIHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwZXJjZW50YWdlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQZXJjZW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBBZGFwdGVkIGZyb20gW2dsLW1hdHJpeF0oaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4KSBieSB0b2ppXHJcbi8vICBhbmQgW3ZlY21hdGhdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC92ZWNtYXRoKSBieSBtYXR0ZGVzbFxyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFZlY3RvcjMgPSByZXF1aXJlKCcuL1ZlY3RvcjMnKTtcclxudmFyIE1hdHJpeDMgPSByZXF1aXJlKCcuL01hdHJpeDMnKTtcclxuXHJcbnZhciBFUFNJTE9OID0gMC4wMDAwMDE7XHJcblxyXG4vLyAgU29tZSBzaGFyZWQgJ3ByaXZhdGUnIGFycmF5c1xyXG52YXIgc2lOZXh0ID0gbmV3IEludDhBcnJheShbIDEsIDIsIDAgXSk7XHJcbnZhciB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KFsgMCwgMCwgMCBdKTtcclxuXHJcbnZhciB4VW5pdFZlYzMgPSBuZXcgVmVjdG9yMygxLCAwLCAwKTtcclxudmFyIHlVbml0VmVjMyA9IG5ldyBWZWN0b3IzKDAsIDEsIDApO1xyXG5cclxudmFyIHRtcHZlYyA9IG5ldyBWZWN0b3IzKCk7XHJcbnZhciB0bXBNYXQzID0gbmV3IE1hdHJpeDMoKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgcXVhdGVybmlvbi5cclxuICpcclxuICogQGNsYXNzIFF1YXRlcm5pb25cclxuICogQG1lbWJlcm9mIFBoYXNlci5NYXRoXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSB4IGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt6XSAtIFRoZSB6IGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt3XSAtIFRoZSB3IGNvbXBvbmVudC5cclxuICovXHJcbnZhciBRdWF0ZXJuaW9uID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFF1YXRlcm5pb24gKHgsIHksIHosIHcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggY29tcG9uZW50IG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jeFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBjb21wb25lbnQgb2YgdGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguUXVhdGVybmlvbiN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB6IGNvbXBvbmVudCBvZiB0aGlzIFF1YXRlcm5pb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3pcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHcgY29tcG9uZW50IG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jd1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0geC54IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHgueSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB4LnogfHwgMDtcclxuICAgICAgICAgICAgdGhpcy53ID0geC53IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB6IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMudyA9IHcgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29weSB0aGUgY29tcG9uZW50cyBvZiBhIGdpdmVuIFF1YXRlcm5pb24gb3IgVmVjdG9yIGludG8gdGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNjb3B5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufFBoYXNlci5NYXRoLlZlY3RvcjQpfSBzcmMgLSBUaGUgUXVhdGVybmlvbiBvciBWZWN0b3IgdG8gY29weSB0aGUgY29tcG9uZW50cyBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgY29weTogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSBzcmMueDtcclxuICAgICAgICB0aGlzLnkgPSBzcmMueTtcclxuICAgICAgICB0aGlzLnogPSBzcmMuejtcclxuICAgICAgICB0aGlzLncgPSBzcmMudztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjb21wb25lbnRzIG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8b2JqZWN0KX0gW3g9MF0gLSBUaGUgeCBjb21wb25lbnQsIG9yIGFuIG9iamVjdCBjb250YWluaW5nIHgsIHksIHosIGFuZCB3IGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3o9MF0gLSBUaGUgeiBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3c9MF0gLSBUaGUgdyBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguUXVhdGVybmlvbn0gVGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uICh4LCB5LCB6LCB3KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnggPSB4LnggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geC55IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueiA9IHgueiB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLncgPSB4LncgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0geCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB5IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueiA9IHogfHwgMDtcclxuICAgICAgICAgICAgdGhpcy53ID0gdyB8fCAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgZ2l2ZW4gUXVhdGVybmlvbiBvciBWZWN0b3IgdG8gdGhpcyBRdWF0ZXJuaW9uLiBBZGRpdGlvbiBpcyBjb21wb25lbnQtd2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jYWRkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFF1YXRlcm5pb24gb3IgVmVjdG9yIHRvIGFkZCB0byB0aGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguUXVhdGVybmlvbn0gVGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCArPSB2Lng7XHJcbiAgICAgICAgdGhpcy55ICs9IHYueTtcclxuICAgICAgICB0aGlzLnogKz0gdi56O1xyXG4gICAgICAgIHRoaXMudyArPSB2Lnc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRyYWN0IGEgZ2l2ZW4gUXVhdGVybmlvbiBvciBWZWN0b3IgZnJvbSB0aGlzIFF1YXRlcm5pb24uIFN1YnRyYWN0aW9uIGlzIGNvbXBvbmVudC13aXNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNzdWJ0cmFjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguUXVhdGVybmlvbnxQaGFzZXIuTWF0aC5WZWN0b3I0KX0gdiAtIFRoZSBRdWF0ZXJuaW9uIG9yIFZlY3RvciB0byBzdWJ0cmFjdCBmcm9tIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHN1YnRyYWN0OiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggLT0gdi54O1xyXG4gICAgICAgIHRoaXMueSAtPSB2Lnk7XHJcbiAgICAgICAgdGhpcy56IC09IHYuejtcclxuICAgICAgICB0aGlzLncgLT0gdi53O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FsZSB0aGlzIFF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNzY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlIC0gVGhlIHZhbHVlIHRvIHNjYWxlIHRoaXMgUXVhdGVybmlvbiBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHNjYWxlOiBmdW5jdGlvbiAoc2NhbGUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ICo9IHNjYWxlO1xyXG4gICAgICAgIHRoaXMueSAqPSBzY2FsZTtcclxuICAgICAgICB0aGlzLnogKj0gc2NhbGU7XHJcbiAgICAgICAgdGhpcy53ICo9IHNjYWxlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI2xlbmd0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgbGVuZ3RoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciB6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciB3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGlzIFF1YXRlcm5pb24gc3F1YXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jbGVuZ3RoU3FcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIFF1YXRlcm5pb24sIHNxdWFyZWQuXHJcbiAgICAgKi9cclxuICAgIGxlbmd0aFNxOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciB6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciB3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsaXplIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jbm9ybWFsaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgdyA9IHRoaXMudztcclxuICAgICAgICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XHJcblxyXG4gICAgICAgIGlmIChsZW4gPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy54ID0geCAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy55ID0geSAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy56ID0geiAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy53ID0gdyAqIGxlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgb2YgdGhpcyBRdWF0ZXJuaW9uIGFuZCB0aGUgZ2l2ZW4gUXVhdGVybmlvbiBvciBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI2RvdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguUXVhdGVybmlvbnxQaGFzZXIuTWF0aC5WZWN0b3I0KX0gdiAtIFRoZSBRdWF0ZXJuaW9uIG9yIFZlY3RvciB0byBkb3QgcHJvZHVjdCB3aXRoIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIFF1YXRlcm5pb24gYW5kIHRoZSBnaXZlbiBRdWF0ZXJuaW9uIG9yIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZG90OiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpbmVhcmx5IGludGVycG9sYXRlIHRoaXMgUXVhdGVybmlvbiB0b3dhcmRzIHRoZSBnaXZlbiBRdWF0ZXJuaW9uIG9yIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jbGVycFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguUXVhdGVybmlvbnxQaGFzZXIuTWF0aC5WZWN0b3I0KX0gdiAtIFRoZSBRdWF0ZXJuaW9uIG9yIFZlY3RvciB0byBpbnRlcnBvbGF0ZSB0b3dhcmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt0PTBdIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgaW50ZXJwb2xhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIGxlcnA6IGZ1bmN0aW9uICh2LCB0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHsgdCA9IDA7IH1cclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgYXogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGF3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICB0aGlzLnggPSBheCArIHQgKiAodi54IC0gYXgpO1xyXG4gICAgICAgIHRoaXMueSA9IGF5ICsgdCAqICh2LnkgLSBheSk7XHJcbiAgICAgICAgdGhpcy56ID0gYXogKyB0ICogKHYueiAtIGF6KTtcclxuICAgICAgICB0aGlzLncgPSBhdyArIHQgKiAodi53IC0gYXcpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoaXMgUXVhdGVybmlvbiBiYXNlZCBvbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3JvdGF0aW9uVG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gYSAtIFRoZSB0cmFuc2Zvcm0gcm90YXRpb24gdmVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBiIC0gVGhlIHRhcmdldCByb3RhdGlvbiB2ZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguUXVhdGVybmlvbn0gVGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICByb3RhdGlvblRvOiBmdW5jdGlvbiAoYSwgYilcclxuICAgIHtcclxuICAgICAgICB2YXIgZG90ID0gYS54ICogYi54ICsgYS55ICogYi55ICsgYS56ICogYi56O1xyXG5cclxuICAgICAgICBpZiAoZG90IDwgLTAuOTk5OTk5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRtcHZlYy5jb3B5KHhVbml0VmVjMykuY3Jvc3MoYSkubGVuZ3RoKCkgPCBFUFNJTE9OKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0bXB2ZWMuY29weSh5VW5pdFZlYzMpLmNyb3NzKGEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0bXB2ZWMubm9ybWFsaXplKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRBeGlzQW5nbGUodG1wdmVjLCBNYXRoLlBJKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gMDtcclxuICAgICAgICAgICAgdGhpcy55ID0gMDtcclxuICAgICAgICAgICAgdGhpcy56ID0gMDtcclxuICAgICAgICAgICAgdGhpcy53ID0gMTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0bXB2ZWMuY29weShhKS5jcm9zcyhiKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMueCA9IHRtcHZlYy54O1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB0bXB2ZWMueTtcclxuICAgICAgICAgICAgdGhpcy56ID0gdG1wdmVjLno7XHJcbiAgICAgICAgICAgIHRoaXMudyA9IDEgKyBkb3Q7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBheGVzIG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jc2V0QXhlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSB2aWV3IC0gVGhlIHZpZXcgYXhpcy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gcmlnaHQgLSBUaGUgcmlnaHQgYXhpcy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdXAgLSBUaGUgdXB3YXJkcyBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgc2V0QXhlczogZnVuY3Rpb24gKHZpZXcsIHJpZ2h0LCB1cClcclxuICAgIHtcclxuICAgICAgICB2YXIgbSA9IHRtcE1hdDMudmFsO1xyXG5cclxuICAgICAgICBtWzBdID0gcmlnaHQueDtcclxuICAgICAgICBtWzNdID0gcmlnaHQueTtcclxuICAgICAgICBtWzZdID0gcmlnaHQuejtcclxuXHJcbiAgICAgICAgbVsxXSA9IHVwLng7XHJcbiAgICAgICAgbVs0XSA9IHVwLnk7XHJcbiAgICAgICAgbVs3XSA9IHVwLno7XHJcblxyXG4gICAgICAgIG1bMl0gPSAtdmlldy54O1xyXG4gICAgICAgIG1bNV0gPSAtdmlldy55O1xyXG4gICAgICAgIG1bOF0gPSAtdmlldy56O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5mcm9tTWF0Myh0bXBNYXQzKS5ub3JtYWxpemUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldCB0aGlzIE1hdHJpeCB0byBhbiBpZGVudGl0eSAoZGVmYXVsdCkgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jaWRlbnRpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgaWRlbnRpdHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0gMDtcclxuICAgICAgICB0aGlzLnkgPSAwO1xyXG4gICAgICAgIHRoaXMueiA9IDA7XHJcbiAgICAgICAgdGhpcy53ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBheGlzIGFuZ2xlIG9mIHRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jc2V0QXhpc0FuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IGF4aXMgLSBUaGUgYXhpcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWQgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHNldEF4aXNBbmdsZTogZnVuY3Rpb24gKGF4aXMsIHJhZClcclxuICAgIHtcclxuICAgICAgICByYWQgPSByYWQgKiAwLjU7XHJcblxyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcclxuXHJcbiAgICAgICAgdGhpcy54ID0gcyAqIGF4aXMueDtcclxuICAgICAgICB0aGlzLnkgPSBzICogYXhpcy55O1xyXG4gICAgICAgIHRoaXMueiA9IHMgKiBheGlzLno7XHJcbiAgICAgICAgdGhpcy53ID0gTWF0aC5jb3MocmFkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhpcyBRdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBRdWF0ZXJuaW9uIG9yIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlF1YXRlcm5pb24jbXVsdGlwbHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlF1YXRlcm5pb258UGhhc2VyLk1hdGguVmVjdG9yNCl9IGIgLSBUaGUgUXVhdGVybmlvbiBvciBWZWN0b3IgdG8gbXVsdGlwbHkgdGhpcyBRdWF0ZXJuaW9uIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgbXVsdGlwbHk6IGZ1bmN0aW9uIChiKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBheCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgYXkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGF6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciBhdyA9IHRoaXMudztcclxuXHJcbiAgICAgICAgdmFyIGJ4ID0gYi54O1xyXG4gICAgICAgIHZhciBieSA9IGIueTtcclxuICAgICAgICB2YXIgYnogPSBiLno7XHJcbiAgICAgICAgdmFyIGJ3ID0gYi53O1xyXG5cclxuICAgICAgICB0aGlzLnggPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xyXG4gICAgICAgIHRoaXMueSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XHJcbiAgICAgICAgdGhpcy56ID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcclxuICAgICAgICB0aGlzLncgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTbW9vdGhseSBsaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGlzIFF1YXRlcm5pb24gdG93YXJkcyB0aGUgZ2l2ZW4gUXVhdGVybmlvbiBvciBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3NsZXJwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufFBoYXNlci5NYXRoLlZlY3RvcjQpfSBiIC0gVGhlIFF1YXRlcm5pb24gb3IgVmVjdG9yIHRvIGludGVycG9sYXRlIHRvd2FyZHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBwZXJjZW50YWdlIG9mIGludGVycG9sYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguUXVhdGVybmlvbn0gVGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICovXHJcbiAgICBzbGVycDogZnVuY3Rpb24gKGIsIHQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gYmVuY2htYXJrczogaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgYXogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGF3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICB2YXIgYnggPSBiLng7XHJcbiAgICAgICAgdmFyIGJ5ID0gYi55O1xyXG4gICAgICAgIHZhciBieiA9IGIuejtcclxuICAgICAgICB2YXIgYncgPSBiLnc7XHJcblxyXG4gICAgICAgIC8vIGNhbGMgY29zaW5lXHJcbiAgICAgICAgdmFyIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidztcclxuXHJcbiAgICAgICAgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXHJcbiAgICAgICAgaWYgKGNvc29tIDwgMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvc29tID0gLWNvc29tO1xyXG4gICAgICAgICAgICBieCA9IC0gYng7XHJcbiAgICAgICAgICAgIGJ5ID0gLSBieTtcclxuICAgICAgICAgICAgYnogPSAtIGJ6O1xyXG4gICAgICAgICAgICBidyA9IC0gYnc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBcImZyb21cIiBhbmQgXCJ0b1wiIHF1YXRlcm5pb25zIGFyZSB2ZXJ5IGNsb3NlXHJcbiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxyXG4gICAgICAgIHZhciBzY2FsZTAgPSAxIC0gdDtcclxuICAgICAgICB2YXIgc2NhbGUxID0gdDtcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xyXG4gICAgICAgIGlmICgoMSAtIGNvc29tKSA+IEVQU0lMT04pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcclxuICAgICAgICAgICAgdmFyIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcclxuICAgICAgICAgICAgdmFyIHNpbm9tID0gTWF0aC5zaW4ob21lZ2EpO1xyXG5cclxuICAgICAgICAgICAgc2NhbGUwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XHJcbiAgICAgICAgICAgIHNjYWxlMSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBmaW5hbCB2YWx1ZXNcclxuICAgICAgICB0aGlzLnggPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4O1xyXG4gICAgICAgIHRoaXMueSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7XHJcbiAgICAgICAgdGhpcy56ID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcclxuICAgICAgICB0aGlzLncgPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZlcnQgdGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNpbnZlcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgaW52ZXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhMCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgYTEgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGEyID0gdGhpcy56O1xyXG4gICAgICAgIHZhciBhMyA9IHRoaXMudztcclxuXHJcbiAgICAgICAgdmFyIGRvdCA9IGEwICogYTAgKyBhMSAqIGExICsgYTIgKiBhMiArIGEzICogYTM7XHJcbiAgICAgICAgdmFyIGludkRvdCA9IChkb3QpID8gMSAvIGRvdCA6IDA7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXHJcblxyXG4gICAgICAgIHRoaXMueCA9IC1hMCAqIGludkRvdDtcclxuICAgICAgICB0aGlzLnkgPSAtYTEgKiBpbnZEb3Q7XHJcbiAgICAgICAgdGhpcy56ID0gLWEyICogaW52RG90O1xyXG4gICAgICAgIHRoaXMudyA9IGEzICogaW52RG90O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IHRoaXMgUXVhdGVybmlvbiBpbnRvIGl0cyBjb25qdWdhdGUuXHJcbiAgICAgKlxyXG4gICAgICogU2V0cyB0aGUgeCwgeSBhbmQgeiBjb21wb25lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNjb25qdWdhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlF1YXRlcm5pb259IFRoaXMgUXVhdGVybmlvbi5cclxuICAgICAqL1xyXG4gICAgY29uanVnYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IC10aGlzLng7XHJcbiAgICAgICAgdGhpcy55ID0gLXRoaXMueTtcclxuICAgICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGUgdGhpcyBRdWF0ZXJuaW9uIG9uIHRoZSBYIGF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3JvdGF0ZVhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWQgLSBUaGUgcm90YXRpb24gYW5nbGUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZVg6IGZ1bmN0aW9uIChyYWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmFkICo9IDAuNTtcclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgYXogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGF3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICB2YXIgYnggPSBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgIHZhciBidyA9IE1hdGguY29zKHJhZCk7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IGF4ICogYncgKyBhdyAqIGJ4O1xyXG4gICAgICAgIHRoaXMueSA9IGF5ICogYncgKyBheiAqIGJ4O1xyXG4gICAgICAgIHRoaXMueiA9IGF6ICogYncgLSBheSAqIGJ4O1xyXG4gICAgICAgIHRoaXMudyA9IGF3ICogYncgLSBheCAqIGJ4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGUgdGhpcyBRdWF0ZXJuaW9uIG9uIHRoZSBZIGF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3JvdGF0ZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWQgLSBUaGUgcm90YXRpb24gYW5nbGUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZVk6IGZ1bmN0aW9uIChyYWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmFkICo9IDAuNTtcclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgYXogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGF3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgIHZhciBidyA9IE1hdGguY29zKHJhZCk7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IGF4ICogYncgLSBheiAqIGJ5O1xyXG4gICAgICAgIHRoaXMueSA9IGF5ICogYncgKyBhdyAqIGJ5O1xyXG4gICAgICAgIHRoaXMueiA9IGF6ICogYncgKyBheCAqIGJ5O1xyXG4gICAgICAgIHRoaXMudyA9IGF3ICogYncgLSBheSAqIGJ5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGUgdGhpcyBRdWF0ZXJuaW9uIG9uIHRoZSBaIGF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5RdWF0ZXJuaW9uI3JvdGF0ZVpcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWQgLSBUaGUgcm90YXRpb24gYW5nbGUgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZVo6IGZ1bmN0aW9uIChyYWQpXHJcbiAgICB7XHJcbiAgICAgICAgcmFkICo9IDAuNTtcclxuXHJcbiAgICAgICAgdmFyIGF4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciBheSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgYXogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGF3ID0gdGhpcy53O1xyXG5cclxuICAgICAgICB2YXIgYnogPSBNYXRoLnNpbihyYWQpO1xyXG4gICAgICAgIHZhciBidyA9IE1hdGguY29zKHJhZCk7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IGF4ICogYncgKyBheSAqIGJ6O1xyXG4gICAgICAgIHRoaXMueSA9IGF5ICogYncgLSBheCAqIGJ6O1xyXG4gICAgICAgIHRoaXMueiA9IGF6ICogYncgKyBhdyAqIGJ6O1xyXG4gICAgICAgIHRoaXMudyA9IGF3ICogYncgLSBheiAqIGJ6O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSB1bml0IChvciByb3RhdGlvbikgUXVhdGVybmlvbiBmcm9tIGl0cyB4LCB5LCBhbmQgeiBjb21wb25lbnRzLlxyXG4gICAgICpcclxuICAgICAqIFNldHMgdGhlIHcgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNjYWxjdWxhdGVXXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVc6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcblxyXG4gICAgICAgIHRoaXMudyA9IC1NYXRoLnNxcnQoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCB0aGUgZ2l2ZW4gTWF0cml4IGludG8gdGhpcyBRdWF0ZXJuaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUXVhdGVybmlvbiNmcm9tTWF0M1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXgzfSBtYXQgLSBUaGUgTWF0cml4IHRvIGNvbnZlcnQgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBUaGlzIFF1YXRlcm5pb24uXHJcbiAgICAgKi9cclxuICAgIGZyb21NYXQzOiBmdW5jdGlvbiAobWF0KVxyXG4gICAge1xyXG4gICAgICAgIC8vIGJlbmNobWFya3M6XHJcbiAgICAgICAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vdHlwZWQtYXJyYXktYWNjZXNzLXNwZWVkXHJcbiAgICAgICAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vY29udmVyc2lvbi1vZi0zeDMtbWF0cml4LXRvLXF1YXRlcm5pb25cclxuXHJcbiAgICAgICAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcclxuICAgICAgICAvLyBhcnRpY2xlIFwiUXVhdGVybmlvbiBDYWxjdWx1cyBhbmQgRmFzdCBBbmltYXRpb25cIi5cclxuICAgICAgICB2YXIgbSA9IG1hdC52YWw7XHJcbiAgICAgICAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcclxuICAgICAgICB2YXIgZlJvb3Q7XHJcblxyXG4gICAgICAgIGlmIChmVHJhY2UgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxyXG4gICAgICAgICAgICBmUm9vdCA9IE1hdGguc3FydChmVHJhY2UgKyAxLjApOyAvLyAyd1xyXG5cclxuICAgICAgICAgICAgdGhpcy53ID0gMC41ICogZlJvb3Q7XHJcblxyXG4gICAgICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcclxuXHJcbiAgICAgICAgICAgIHRoaXMueCA9IChtWzddIC0gbVs1XSkgKiBmUm9vdDtcclxuICAgICAgICAgICAgdGhpcy55ID0gKG1bMl0gLSBtWzZdKSAqIGZSb290O1xyXG4gICAgICAgICAgICB0aGlzLnogPSAobVszXSAtIG1bMV0pICogZlJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIHx3fCA8PSAxLzJcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1bNF0gPiBtWzBdKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG1bOF0gPiBtW2kgKiAzICsgaV0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGkgPSAyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgaiA9IHNpTmV4dFtpXTtcclxuICAgICAgICAgICAgdmFyIGsgPSBzaU5leHRbal07XHJcblxyXG4gICAgICAgICAgICAvLyAgVGhpcyBpc24ndCBxdWl0ZSBhcyBjbGVhbiB3aXRob3V0IGFycmF5IGFjY2Vzc1xyXG4gICAgICAgICAgICBmUm9vdCA9IE1hdGguc3FydChtW2kgKiAzICsgaV0gLSBtW2ogKiAzICsgal0gLSBtW2sgKiAzICsga10gKyAxKTtcclxuICAgICAgICAgICAgdG1wW2ldID0gMC41ICogZlJvb3Q7XHJcblxyXG4gICAgICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xyXG5cclxuICAgICAgICAgICAgdG1wW2pdID0gKG1baiAqIDMgKyBpXSArIG1baSAqIDMgKyBqXSkgKiBmUm9vdDtcclxuICAgICAgICAgICAgdG1wW2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMueCA9IHRtcFswXTtcclxuICAgICAgICAgICAgdGhpcy55ID0gdG1wWzFdO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB0bXBbMl07XHJcbiAgICAgICAgICAgIHRoaXMudyA9IChtW2sgKiAzICsgal0gLSBtW2ogKiAzICsga10pICogZlJvb3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWF0ZXJuaW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhbmdsZSBpbiByYWRpYW5zLCB0byB0aGUgZXF1aXZhbGVudCBhbmdsZSBpbiBkZWdyZWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUmFkVG9EZWdcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMgdG8gY29udmVydCBvdCBkZWdyZWVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgZ2l2ZW4gYW5nbGUgY29udmVydGVkIHRvIGRlZ3JlZXMuXHJcbiAqL1xyXG52YXIgUmFkVG9EZWcgPSBmdW5jdGlvbiAocmFkaWFucylcclxue1xyXG4gICAgcmV0dXJuIHJhZGlhbnMgKiBDT05TVC5SQURfVE9fREVHO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYWRUb0RlZztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ29tcHV0ZSBhIHJhbmRvbSB1bml0IHZlY3Rvci5cclxuICpcclxuICogQ29tcHV0ZXMgcmFuZG9tIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHZlY3RvciBiZXR3ZWVuIC0xIGFuZCAxIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgZGlyZWN0aW9uLlxyXG4gKlxyXG4gKiBPcHRpb25hbGx5IGFjY2VwdHMgYSBzY2FsZSB2YWx1ZSB0byBzY2FsZSB0aGUgcmVzdWx0aW5nIHZlY3RvciBieS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlJhbmRvbVhZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHZlY3RvciAtIFRoZSBWZWN0b3IgdG8gY29tcHV0ZSByYW5kb20gdmFsdWVzIGZvci5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xXSAtIFRoZSBzY2FsZSBvZiB0aGUgcmFuZG9tIHZhbHVlcy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIGdpdmVuIFZlY3Rvci5cclxuICovXHJcbnZhciBSYW5kb21YWSA9IGZ1bmN0aW9uICh2ZWN0b3IsIHNjYWxlKVxyXG57XHJcbiAgICBpZiAoc2NhbGUgPT09IHVuZGVmaW5lZCkgeyBzY2FsZSA9IDE7IH1cclxuXHJcbiAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcclxuXHJcbiAgICB2ZWN0b3IueCA9IE1hdGguY29zKHIpICogc2NhbGU7XHJcbiAgICB2ZWN0b3IueSA9IE1hdGguc2luKHIpICogc2NhbGU7XHJcblxyXG4gICAgcmV0dXJuIHZlY3RvcjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGUgYSByYW5kb20gcG9zaXRpb24gdmVjdG9yIGluIGEgc3BoZXJpY2FsIGFyZWEsIG9wdGlvbmFsbHkgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gcmFkaXVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUmFuZG9tWFlaXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IHZlYzMgLSBUaGUgVmVjdG9yIHRvIGNvbXB1dGUgcmFuZG9tIHZhbHVlcyBmb3IuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gVGhlIHJhZGl1cy5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhlIGdpdmVuIFZlY3Rvci5cclxuICovXHJcbnZhciBSYW5kb21YWVogPSBmdW5jdGlvbiAodmVjMywgcmFkaXVzKVxyXG57XHJcbiAgICBpZiAocmFkaXVzID09PSB1bmRlZmluZWQpIHsgcmFkaXVzID0gMTsgfVxyXG5cclxuICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xyXG4gICAgdmFyIHogPSAoTWF0aC5yYW5kb20oKSAqIDIpIC0gMTtcclxuICAgIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMSAtIHogKiB6KSAqIHJhZGl1cztcclxuXHJcbiAgICB2ZWMzLnggPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcclxuICAgIHZlYzMueSA9IE1hdGguc2luKHIpICogelNjYWxlO1xyXG4gICAgdmVjMy56ID0geiAqIHJhZGl1cztcclxuXHJcbiAgICByZXR1cm4gdmVjMztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tWFlaO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlIGEgcmFuZG9tIGZvdXItZGltZW5zaW9uYWwgdmVjdG9yLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUmFuZG9tWFlaV1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSB2ZWM0IC0gVGhlIFZlY3RvciB0byBjb21wdXRlIHJhbmRvbSB2YWx1ZXMgZm9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTFdIC0gVGhlIHNjYWxlIG9mIHRoZSByYW5kb20gdmFsdWVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBUaGUgZ2l2ZW4gVmVjdG9yLlxyXG4gKi9cclxudmFyIFJhbmRvbVhZWlcgPSBmdW5jdGlvbiAodmVjNCwgc2NhbGUpXHJcbntcclxuICAgIGlmIChzY2FsZSA9PT0gdW5kZWZpbmVkKSB7IHNjYWxlID0gMTsgfVxyXG5cclxuICAgIC8vIFRPRE86IE5vdCBzcGhlcmljYWw7IHNob3VsZCBmaXggdGhpcyBmb3IgbW9yZSB1bmlmb3JtIGRpc3RyaWJ1dGlvblxyXG4gICAgdmVjNC54ID0gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSkgKiBzY2FsZTtcclxuICAgIHZlYzQueSA9IChNYXRoLnJhbmRvbSgpICogMiAtIDEpICogc2NhbGU7XHJcbiAgICB2ZWM0LnogPSAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKSAqIHNjYWxlO1xyXG4gICAgdmVjNC53ID0gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSkgKiBzY2FsZTtcclxuXHJcbiAgICByZXR1cm4gdmVjNDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tWFlaVztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm90YXRlIGEgZ2l2ZW4gcG9pbnQgYnkgYSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIG9yaWdpbiAoMCwgMCksIGluIGFuIGFudGktY2xvY2t3aXNlIGRpcmVjdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlJvdGF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gYmUgcm90YXRlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIHRvIGJlIHJvdGF0ZWQgYnkgaW4gYW4gYW50aWNsb2Nrd2lzZSBkaXJlY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HZW9tLlBvaW50fSBUaGUgZ2l2ZW4gcG9pbnQsIHJvdGF0ZWQgYnkgdGhlIGdpdmVuIGFuZ2xlIGluIGFuIGFudGljbG9ja3dpc2UgZGlyZWN0aW9uLlxyXG4gKi9cclxudmFyIFJvdGF0ZSA9IGZ1bmN0aW9uIChwb2ludCwgYW5nbGUpXHJcbntcclxuICAgIHZhciB4ID0gcG9pbnQueDtcclxuICAgIHZhciB5ID0gcG9pbnQueTtcclxuXHJcbiAgICBwb2ludC54ID0gKHggKiBNYXRoLmNvcyhhbmdsZSkpIC0gKHkgKiBNYXRoLnNpbihhbmdsZSkpO1xyXG4gICAgcG9pbnQueSA9ICh4ICogTWF0aC5zaW4oYW5nbGUpKSArICh5ICogTWF0aC5jb3MoYW5nbGUpKTtcclxuXHJcbiAgICByZXR1cm4gcG9pbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJvdGF0ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm90YXRlIGEgYHBvaW50YCBhcm91bmQgYHhgIGFuZCBgeWAgdG8gdGhlIGdpdmVuIGBhbmdsZWAsIGF0IHRoZSBzYW1lIGRpc3RhbmNlLlxyXG4gKlxyXG4gKiBJbiBwb2xhciBub3RhdGlvbiwgdGhpcyBtYXBzIGEgcG9pbnQgZnJvbSAociwgdCkgdG8gKHIsIGFuZ2xlKSwgdnMuIHRoZSBvcmlnaW4gKHgsIHkpLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUm90YXRlQXJvdW5kXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IFQgLSBbcG9pbnQsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uUG9pbnR8b2JqZWN0KX0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gYmUgcm90YXRlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIHRvIHJvdGF0ZSBhcm91bmQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgdG8gcm90YXRlIGFyb3VuZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlfSBUaGUgZ2l2ZW4gcG9pbnQuXHJcbiAqL1xyXG52YXIgUm90YXRlQXJvdW5kID0gZnVuY3Rpb24gKHBvaW50LCB4LCB5LCBhbmdsZSlcclxue1xyXG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICB2YXIgcyA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICB2YXIgdHggPSBwb2ludC54IC0geDtcclxuICAgIHZhciB0eSA9IHBvaW50LnkgLSB5O1xyXG5cclxuICAgIHBvaW50LnggPSB0eCAqIGMgLSB0eSAqIHMgKyB4O1xyXG4gICAgcG9pbnQueSA9IHR4ICogcyArIHR5ICogYyArIHk7XHJcblxyXG4gICAgcmV0dXJuIHBvaW50O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVBcm91bmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZSBhIGBwb2ludGAgYXJvdW5kIGB4YCBhbmQgYHlgIGJ5IHRoZSBnaXZlbiBgYW5nbGVgIGFuZCBgZGlzdGFuY2VgLlxyXG4gKlxyXG4gKiBJbiBwb2xhciBub3RhdGlvbiwgdGhpcyBtYXBzIGEgcG9pbnQgZnJvbSAociwgdCkgdG8gKGRpc3RhbmNlLCB0ICsgYW5nbGUpLCB2cy4gdGhlIG9yaWdpbiAoeCwgeSkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5Sb3RhdGVBcm91bmREaXN0YW5jZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlfSBUIC0gW3BvaW50LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLlBvaW50fG9iamVjdCl9IHBvaW50IC0gVGhlIHBvaW50IHRvIGJlIHJvdGF0ZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB0byByb3RhdGUgYXJvdW5kLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIHRvIHJvdGF0ZSBhcm91bmQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgZnJvbSAoeCwgeSkgdG8gcGxhY2UgdGhlIHBvaW50IGF0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gVGhlIGdpdmVuIHBvaW50LlxyXG4gKi9cclxudmFyIFJvdGF0ZUFyb3VuZERpc3RhbmNlID0gZnVuY3Rpb24gKHBvaW50LCB4LCB5LCBhbmdsZSwgZGlzdGFuY2UpXHJcbntcclxuICAgIHZhciB0ID0gYW5nbGUgKyBNYXRoLmF0YW4yKHBvaW50LnkgLSB5LCBwb2ludC54IC0geCk7XHJcblxyXG4gICAgcG9pbnQueCA9IHggKyAoZGlzdGFuY2UgKiBNYXRoLmNvcyh0KSk7XHJcbiAgICBwb2ludC55ID0geSArIChkaXN0YW5jZSAqIE1hdGguc2luKHQpKTtcclxuXHJcbiAgICByZXR1cm4gcG9pbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJvdGF0ZUFyb3VuZERpc3RhbmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBWZWN0b3IzID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IzJyk7XHJcbnZhciBNYXRyaXg0ID0gcmVxdWlyZSgnLi4vbWF0aC9NYXRyaXg0Jyk7XHJcbnZhciBRdWF0ZXJuaW9uID0gcmVxdWlyZSgnLi4vbWF0aC9RdWF0ZXJuaW9uJyk7XHJcblxyXG52YXIgdG1wTWF0NCA9IG5ldyBNYXRyaXg0KCk7XHJcbnZhciB0bXBRdWF0ID0gbmV3IFF1YXRlcm5pb24oKTtcclxudmFyIHRtcFZlYzMgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgYSB2ZWN0b3IgaW4gcGxhY2UgYnkgYXhpcyBhbmdsZS5cclxuICpcclxuICogVGhpcyBpcyB0aGUgc2FtZSBhcyB0cmFuc2Zvcm1pbmcgYSBwb2ludCBieSBhblxyXG4gKiBheGlzLWFuZ2xlIHF1YXRlcm5pb24sIGJ1dCBpdCBoYXMgaGlnaGVyIHByZWNpc2lvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlJvdGF0ZVZlYzNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdmVjIC0gVGhlIHZlY3RvciB0byBiZSByb3RhdGVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IGF4aXMgLSBUaGUgYXhpcyB0byByb3RhdGUgYXJvdW5kLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGUgZ2l2ZW4gdmVjdG9yLlxyXG4gKi9cclxudmFyIFJvdGF0ZVZlYzMgPSBmdW5jdGlvbiAodmVjLCBheGlzLCByYWRpYW5zKVxyXG57XHJcbiAgICAvLyAgU2V0IHRoZSBxdWF0ZXJuaW9uIHRvIG91ciBheGlzIGFuZ2xlXHJcbiAgICB0bXBRdWF0LnNldEF4aXNBbmdsZShheGlzLCByYWRpYW5zKTtcclxuXHJcbiAgICAvLyAgQ3JlYXRlIGEgcm90YXRpb24gbWF0cml4IGZyb20gdGhlIGF4aXMgYW5nbGVcclxuICAgIHRtcE1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24odG1wUXVhdCwgdG1wVmVjMy5zZXQoMCwgMCwgMCkpO1xyXG5cclxuICAgIC8vICBNdWx0aXBseSBvdXIgdmVjdG9yIGJ5IHRoZSByb3RhdGlvbiBtYXRyaXhcclxuICAgIHJldHVybiB2ZWMudHJhbnNmb3JtTWF0NCh0bXBNYXQ0KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlVmVjMztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm91bmQgYSBnaXZlbiBudW1iZXIgc28gaXQgaXMgZnVydGhlciBhd2F5IGZyb20gemVyby4gVGhhdCBpcywgcG9zaXRpdmUgbnVtYmVycyBhcmUgcm91bmRlZCB1cCwgYW5kIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJvdW5kZWQgZG93bi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlJvdW5kQXdheUZyb21aZXJvXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIHJvdW5kLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByb3VuZGVkIG51bWJlciwgcm91bmRlZCBhd2F5IGZyb20gemVyby5cclxuICovXHJcbnZhciBSb3VuZEF3YXlGcm9tWmVybyA9IGZ1bmN0aW9uICh2YWx1ZSlcclxue1xyXG4gICAgLy8gXCJPcHBvc2l0ZVwiIG9mIHRydW5jYXRlLlxyXG4gICAgcmV0dXJuICh2YWx1ZSA+IDApID8gTWF0aC5jZWlsKHZhbHVlKSA6IE1hdGguZmxvb3IodmFsdWUpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3VuZEF3YXlGcm9tWmVybztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUm91bmQgYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gcHJlY2lzaW9uLlxyXG4gKiBcclxuICogRm9yIGV4YW1wbGU6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIFJvdW5kVG8oMTIzLjQ1NiwgMCkgPSAxMjNcclxuICogUm91bmRUbygxMjMuNDU2LCAxKSA9IDEyMFxyXG4gKiBSb3VuZFRvKDEyMy40NTYsIDIpID0gMTAwXHJcbiAqIGBgYFxyXG4gKiBcclxuICogVG8gcm91bmQgdGhlIGRlY2ltYWwsIGkuZS4gdG8gcm91bmQgdG8gcHJlY2lzaW9uLCBwYXNzIGluIGEgbmVnYXRpdmUgYHBsYWNlYDpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogUm91bmRUbygxMjMuNDU2Nzg5LCAwKSA9IDEyM1xyXG4gKiBSb3VuZFRvKDEyMy40NTY3ODksIC0xKSA9IDEyMy41XHJcbiAqIFJvdW5kVG8oMTIzLjQ1Njc4OSwgLTIpID0gMTIzLjQ2XHJcbiAqIFJvdW5kVG8oMTIzLjQ1Njc4OSwgLTMpID0gMTIzLjQ1N1xyXG4gKiBgYGBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlJvdW5kVG9cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByb3VuZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbcGxhY2U9MF0gLSBUaGUgcGxhY2UgdG8gcm91bmQgdG8uIFBvc2l0aXZlIHRvIHJvdW5kIHRoZSB1bml0cywgbmVnYXRpdmUgdG8gcm91bmQgdGhlIGRlY2ltYWwuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2Jhc2U9MTBdIC0gVGhlIGJhc2UgdG8gcm91bmQgaW4uIERlZmF1bHQgaXMgMTAgZm9yIGRlY2ltYWwuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJvdW5kZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgUm91bmRUbyA9IGZ1bmN0aW9uICh2YWx1ZSwgcGxhY2UsIGJhc2UpXHJcbntcclxuICAgIGlmIChwbGFjZSA9PT0gdW5kZWZpbmVkKSB7IHBsYWNlID0gMDsgfVxyXG4gICAgaWYgKGJhc2UgPT09IHVuZGVmaW5lZCkgeyBiYXNlID0gMTA7IH1cclxuXHJcbiAgICB2YXIgcCA9IE1hdGgucG93KGJhc2UsIC1wbGFjZSk7XHJcblxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBwKSAvIHA7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJvdW5kVG87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgc2VyaWVzIG9mIHNpbmUgYW5kIGNvc2luZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5TaW5Db3NUYWJsZUdlbmVyYXRvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpbkFtcD0xXSAtIFRoZSBzaW5lIHZhbHVlIGFtcGxpdHVkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb3NBbXA9MV0gLSBUaGUgY29zaW5lIHZhbHVlIGFtcGxpdHVkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmcmVxdWVuY3k9MV0gLSBUaGUgZnJlcXVlbmN5IG9mIHRoZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5NYXRoLlNpbkNvc1RhYmxlfSBUaGUgZ2VuZXJhdGVkIHZhbHVlcy5cclxuICovXHJcbnZhciBTaW5Db3NUYWJsZUdlbmVyYXRvciA9IGZ1bmN0aW9uIChsZW5ndGgsIHNpbkFtcCwgY29zQW1wLCBmcmVxdWVuY3kpXHJcbntcclxuICAgIGlmIChzaW5BbXAgPT09IHVuZGVmaW5lZCkgeyBzaW5BbXAgPSAxOyB9XHJcbiAgICBpZiAoY29zQW1wID09PSB1bmRlZmluZWQpIHsgY29zQW1wID0gMTsgfVxyXG4gICAgaWYgKGZyZXF1ZW5jeSA9PT0gdW5kZWZpbmVkKSB7IGZyZXF1ZW5jeSA9IDE7IH1cclxuXHJcbiAgICBmcmVxdWVuY3kgKj0gTWF0aC5QSSAvIGxlbmd0aDtcclxuXHJcbiAgICB2YXIgY29zID0gW107XHJcbiAgICB2YXIgc2luID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBsZW5ndGg7IGMrKylcclxuICAgIHtcclxuICAgICAgICBjb3NBbXAgLT0gc2luQW1wICogZnJlcXVlbmN5O1xyXG4gICAgICAgIHNpbkFtcCArPSBjb3NBbXAgKiBmcmVxdWVuY3k7XHJcblxyXG4gICAgICAgIGNvc1tjXSA9IGNvc0FtcDtcclxuICAgICAgICBzaW5bY10gPSBzaW5BbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBzaW46IHNpbixcclxuICAgICAgICBjb3M6IGNvcyxcclxuICAgICAgICBsZW5ndGg6IGxlbmd0aFxyXG4gICAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2luQ29zVGFibGVHZW5lcmF0b3I7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSBhIHNtb290aCBpbnRlcnBvbGF0aW9uIHBlcmNlbnRhZ2Ugb2YgYHhgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLlxyXG4gKlxyXG4gKiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIG51bWJlciBgeGAgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgMCBpZiBgeGAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZWZ0IGVkZ2UsXHJcbiAqIDEgaWYgYHhgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQgZWRnZSwgYW5kIHNtb290aGx5IGludGVycG9sYXRlcywgdXNpbmcgYSBIZXJtaXRlIHBvbHlub21pYWwsXHJcbiAqIGJldHdlZW4gMCBhbmQgMSBvdGhlcndpc2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5TbW9vdGhTdGVwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwfVxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBpbnB1dCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlLCBhbHNvIGtub3duIGFzIHRoZSAnbGVmdCBlZGdlJywgYXNzdW1lZCBzbWFsbGVyIHRoYW4gdGhlICdyaWdodCBlZGdlJy5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlLCBhbHNvIGtub3duIGFzIHRoZSAncmlnaHQgZWRnZScsIGFzc3VtZWQgZ3JlYXRlciB0aGFuIHRoZSAnbGVmdCBlZGdlJy5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcGVyY2VudGFnZSBvZiBpbnRlcnBvbGF0aW9uLCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqL1xyXG52YXIgU21vb3RoU3RlcCA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heClcclxue1xyXG4gICAgaWYgKHggPD0gbWluKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4ID49IG1heClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuXHJcbiAgICB4ID0gKHggLSBtaW4pIC8gKG1heCAtIG1pbik7XHJcblxyXG4gICAgcmV0dXJuIHggKiB4ICogKDMgLSAyICogeCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNtb290aFN0ZXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSBhIHNtb290aGVyIGludGVycG9sYXRpb24gcGVyY2VudGFnZSBvZiBgeGAgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAuXHJcbiAqXHJcbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aGUgbnVtYmVyIGB4YCBhcyBhbiBhcmd1bWVudCBhbmQgcmV0dXJucyAwIGlmIGB4YCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlZnQgZWRnZSxcclxuICogMSBpZiBgeGAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodCBlZGdlLCBhbmQgc21vb3RobHkgaW50ZXJwb2xhdGVzLCB1c2luZyBhIEhlcm1pdGUgcG9seW5vbWlhbCxcclxuICogYmV0d2VlbiAwIGFuZCAxIG90aGVyd2lzZS5cclxuICpcclxuICogUHJvZHVjZXMgYW4gZXZlbiBzbW9vdGhlciBpbnRlcnBvbGF0aW9uIHRoYW4ge0BsaW5rIFBoYXNlci5NYXRoLlNtb290aFN0ZXB9LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguU21vb3RoZXJTdGVwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwI1ZhcmlhdGlvbnN9XHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGlucHV0IHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUsIGFsc28ga25vd24gYXMgdGhlICdsZWZ0IGVkZ2UnLCBhc3N1bWVkIHNtYWxsZXIgdGhhbiB0aGUgJ3JpZ2h0IGVkZ2UnLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUsIGFsc28ga25vd24gYXMgdGhlICdyaWdodCBlZGdlJywgYXNzdW1lZCBncmVhdGVyIHRoYW4gdGhlICdsZWZ0IGVkZ2UnLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwZXJjZW50YWdlIG9mIGludGVycG9sYXRpb24sIGJldHdlZW4gMCBhbmQgMS5cclxuICovXHJcbnZhciBTbW9vdGhlclN0ZXAgPSBmdW5jdGlvbiAoeCwgbWluLCBtYXgpXHJcbntcclxuICAgIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoeCAtIG1pbikgLyAobWF4IC0gbWluKSkpO1xyXG5cclxuICAgIHJldHVybiB4ICogeCAqIHggKiAoeCAqICh4ICogNiAtIDE1KSArIDEwKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU21vb3RoZXJTdGVwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIFZlY3RvcjIgY29udGFpbmluZyB0aGUgeCBhbmQgeSBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gaW5kZXggaW4gYSBgd2lkdGhgIHggYGhlaWdodGAgc2l6ZWQgZ3JpZC5cclxuICogXHJcbiAqIEZvciBleGFtcGxlLCBpbiBhIDYgeCA0IGdyaWQsIGluZGV4IDE2IHdvdWxkIGVxdWFsIHg6IDQgeTogMi5cclxuICogXHJcbiAqIElmIHRoZSBnaXZlbiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgYW4gZW1wdHkgVmVjdG9yMiBpcyByZXR1cm5lZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlRvWFlcclxuICogQHNpbmNlIDMuMTkuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgZ3JpZCB0byBnZXQgdGhlIHgveSB2YWx1ZSBmb3IuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGdyaWQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgZ3JpZC5cclxuICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbb3V0XSAtIEFuIG9wdGlvbmFsIFZlY3RvcjIgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgbm90IGdpdmVuLCBhIG5ldyBWZWN0b3IyIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZC5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gQSBWZWN0b3IyIHdoZXJlIHRoZSB4IGFuZCB5IHByb3BlcnRpZXMgY29udGFpbiB0aGUgZ2l2ZW4gZ3JpZCBpbmRleC5cclxuICovXHJcbnZhciBUb1hZID0gZnVuY3Rpb24gKGluZGV4LCB3aWR0aCwgaGVpZ2h0LCBvdXQpXHJcbntcclxuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkgeyBvdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgdmFyIHggPSAwO1xyXG4gICAgdmFyIHkgPSAwO1xyXG4gICAgdmFyIHRvdGFsID0gd2lkdGggKiBoZWlnaHQ7XHJcblxyXG4gICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8PSB0b3RhbClcclxuICAgIHtcclxuICAgICAgICBpZiAoaW5kZXggPiB3aWR0aCAtIDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB5ID0gTWF0aC5mbG9vcihpbmRleCAvIHdpZHRoKTtcclxuICAgICAgICAgICAgeCA9IGluZGV4IC0gKHkgKiB3aWR0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG91dC5zZXQoeCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVG9YWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4vVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBhbmQgdHJhbnNmb3JtcyB0aGVtIGludG8gdGhlIHNhbWUgc3BhY2UgYXNcclxuICogZGVmaW5lZCBieSB0aGUgcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5UcmFuc2Zvcm1YWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGJlIHRyYW5zZm9ybWVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gYmUgdHJhbnNmb3JtZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblggLSBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB0cmFuc2Zvcm0gcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvblkgLSBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgdHJhbnNmb3JtIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcm90YXRpb24gLSBSb3RhdGlvbiBvZiB0aGUgdHJhbnNmb3JtIHBvaW50LCBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2NhbGVYIC0gSG9yaXpvbnRhbCBzY2FsZSBvZiB0aGUgdHJhbnNmb3JtIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZIC0gVmVydGljYWwgc2NhbGUgb2YgdGhlIHRyYW5zZm9ybSBwb2ludC5cclxuICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBbb3V0cHV0XSAtIFRoZSBvdXRwdXQgdmVjdG9yLCBwb2ludCBvciBvYmplY3QgZm9yIHRoZSB0cmFuc2xhdGVkIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuR2VvbS5Qb2ludHxvYmplY3QpfSBUaGUgdHJhbnNsYXRlZCBwb2ludC5cclxuICovXHJcbnZhciBUcmFuc2Zvcm1YWSA9IGZ1bmN0aW9uICh4LCB5LCBwb3NpdGlvblgsIHBvc2l0aW9uWSwgcm90YXRpb24sIHNjYWxlWCwgc2NhbGVZLCBvdXRwdXQpXHJcbntcclxuICAgIGlmIChvdXRwdXQgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXQgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgdmFyIHJhZGlhblNpbiA9IE1hdGguc2luKHJvdGF0aW9uKTtcclxuICAgIHZhciByYWRpYW5Db3MgPSBNYXRoLmNvcyhyb3RhdGlvbik7XHJcblxyXG4gICAgLy8gUm90YXRlIGFuZCBTY2FsZVxyXG4gICAgdmFyIGEgPSByYWRpYW5Db3MgKiBzY2FsZVg7XHJcbiAgICB2YXIgYiA9IHJhZGlhblNpbiAqIHNjYWxlWDtcclxuICAgIHZhciBjID0gLXJhZGlhblNpbiAqIHNjYWxlWTtcclxuICAgIHZhciBkID0gcmFkaWFuQ29zICogc2NhbGVZO1xyXG5cclxuICAgIC8vICBJbnZlcnRcclxuICAgIHZhciBpZCA9IDEgLyAoKGEgKiBkKSArIChjICogLWIpKTtcclxuXHJcbiAgICBvdXRwdXQueCA9IChkICogaWQgKiB4KSArICgtYyAqIGlkICogeSkgKyAoKChwb3NpdGlvblkgKiBjKSAtIChwb3NpdGlvblggKiBkKSkgKiBpZCk7XHJcbiAgICBvdXRwdXQueSA9IChhICogaWQgKiB5KSArICgtYiAqIGlkICogeCkgKyAoKCgtcG9zaXRpb25ZICogYSkgKyAocG9zaXRpb25YICogYikpICogaWQpO1xyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybVhZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBBZGFwdGVkIGZyb20gW2dsLW1hdHJpeF0oaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4KSBieSB0b2ppXHJcbi8vICBhbmQgW3ZlY21hdGhdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC92ZWNtYXRoKSBieSBtYXR0ZGVzbFxyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEZ1enp5RXF1YWwgPSByZXF1aXJlKCcuLi9tYXRoL2Z1enp5L0VxdWFsJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yIGluIDJEIHNwYWNlLlxyXG4gKlxyXG4gKiBBIHR3by1jb21wb25lbnQgdmVjdG9yLlxyXG4gKlxyXG4gKiBAY2xhc3MgVmVjdG9yMlxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLk1hdGhcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcnxQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gW3hdIC0gVGhlIHggY29tcG9uZW50LCBvciBhbiBvYmplY3Qgd2l0aCBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgY29tcG9uZW50LlxyXG4gKi9cclxudmFyIFZlY3RvcjIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVmVjdG9yMiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeCBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3IyI3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3IyI3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0geC54IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHgueSB8fCAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnggPSB4IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHkgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIGNsb25lIG9mIHRoaXMgVmVjdG9yMi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjY2xvbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IEEgY2xvbmUgb2YgdGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBjbG9uZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgdGhlIGNvbXBvbmVudHMgb2YgYSBnaXZlbiBWZWN0b3IgaW50byB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjY29weVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzcmMgLSBUaGUgVmVjdG9yIHRvIGNvcHkgdGhlIGNvbXBvbmVudHMgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIGNvcHk6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ID0gc3JjLnggfHwgMDtcclxuICAgICAgICB0aGlzLnkgPSBzcmMueSB8fCAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNvbXBvbmVudCB2YWx1ZXMgb2YgdGhpcyBWZWN0b3IgZnJvbSBhIGdpdmVuIFZlY3RvcjJMaWtlIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjc2V0RnJvbU9iamVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBjb21wb25lbnQgdmFsdWVzIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAob2JqKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IG9iai54IHx8IDA7XHJcbiAgICAgICAgdGhpcy55ID0gb2JqLnkgfHwgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBgeGAgYW5kIGB5YCBjb21wb25lbnRzIG9mIHRoZSB0aGlzIFZlY3RvciB0byB0aGUgZ2l2ZW4gYHhgIGFuZCBgeWAgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggdmFsdWUgdG8gc2V0IGZvciB0aGlzIFZlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSB5IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbiBhbGlhcyBmb3IgYFZlY3RvcjIuc2V0YC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjc2V0VG9cclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggdmFsdWUgdG8gc2V0IGZvciB0aGlzIFZlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSB5IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzZXRUbzogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KHgsIHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGB4YCBhbmQgYHlgIHZhbHVlcyBvZiB0aGlzIG9iamVjdCBmcm9tIGEgZ2l2ZW4gcG9sYXIgY29vcmRpbmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjc2V0VG9Qb2xhclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF6aW11dGggLSBUaGUgYW5ndWxhciBjb29yZGluYXRlLCBpbiByYWRpYW5zLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBUaGUgcmFkaWFsIGNvb3JkaW5hdGUgKGxlbmd0aCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzZXRUb1BvbGFyOiBmdW5jdGlvbiAoYXppbXV0aCwgcmFkaXVzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyYWRpdXMgPT0gbnVsbCkgeyByYWRpdXMgPSAxOyB9XHJcblxyXG4gICAgICAgIHRoaXMueCA9IE1hdGguY29zKGF6aW11dGgpICogcmFkaXVzO1xyXG4gICAgICAgIHRoaXMueSA9IE1hdGguc2luKGF6aW11dGgpICogcmFkaXVzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgVmVjdG9yIGlzIGVxdWFsIHRvIGEgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIFBlcmZvcm1zIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrIGFnYWluc3QgZWFjaCBWZWN0b3IncyBjb21wb25lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNlcXVhbHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcGFyZSB3aXRoIHRoaXMgVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIFZlY3RvciBpcyBlcXVhbCB0byB0aGlzIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZXF1YWxzOiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKCh0aGlzLnggPT09IHYueCkgJiYgKHRoaXMueSA9PT0gdi55KSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciB0aGlzIFZlY3RvciBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIGEgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNmdXp6eUVxdWFsc1xyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcGFyZSB3aXRoIHRoaXMgVmVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlcHNpbG9uPTAuMDAwMV0gLSBUaGUgdG9sZXJhbmNlIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYm90aCBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBvZiB0aGUgeCBhbmQgeSBjb21wb25lbnRzIGFyZSBzbWFsbGVyIHRoYW4gYGVwc2lsb25gLlxyXG4gICAgICovXHJcbiAgICBmdXp6eUVxdWFsczogZnVuY3Rpb24gKHYsIGVwc2lsb24pXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIChGdXp6eUVxdWFsKHRoaXMueCwgdi54LCBlcHNpbG9uKSAmJiBGdXp6eUVxdWFsKHRoaXMueSwgdi55LCBlcHNpbG9uKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgcG9zaXRpdmUgeC1heGlzLCBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgYmV0d2VlbiB0aGlzIFZlY3RvciwgYW5kIHRoZSBwb3NpdGl2ZSB4LWF4aXMsIGdpdmVuIGluIHJhZGlhbnMuXHJcbiAgICAgKi9cclxuICAgIGFuZ2xlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGNvbXB1dGVzIHRoZSBhbmdsZSBpbiByYWRpYW5zIHdpdGggcmVzcGVjdCB0byB0aGUgcG9zaXRpdmUgeC1heGlzXHJcblxyXG4gICAgICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xyXG5cclxuICAgICAgICBpZiAoYW5nbGUgPCAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW5nbGUgKz0gMiAqIE1hdGguUEk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYW5nbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBhbmdsZSBvZiB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjc2V0QW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUsIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzZXRBbmdsZTogZnVuY3Rpb24gKGFuZ2xlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFRvUG9sYXIoYW5nbGUsIHRoaXMubGVuZ3RoKCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGdpdmVuIFZlY3RvciB0byB0aGlzIFZlY3Rvci4gQWRkaXRpb24gaXMgY29tcG9uZW50LXdpc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzcmMgLSBUaGUgVmVjdG9yIHRvIGFkZCB0byB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggKz0gc3JjLng7XHJcbiAgICAgICAgdGhpcy55ICs9IHNyYy55O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdWJ0cmFjdCB0aGUgZ2l2ZW4gVmVjdG9yIGZyb20gdGhpcyBWZWN0b3IuIFN1YnRyYWN0aW9uIGlzIGNvbXBvbmVudC13aXNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNzdWJ0cmFjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzcmMgLSBUaGUgVmVjdG9yIHRvIHN1YnRyYWN0IGZyb20gdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggLT0gc3JjLng7XHJcbiAgICAgICAgdGhpcy55IC09IHNyYy55O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtIGEgY29tcG9uZW50LXdpc2UgbXVsdGlwbGljYXRpb24gYmV0d2VlbiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBNdWx0aXBsaWVzIHRoaXMgVmVjdG9yIGJ5IHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI211bHRpcGx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHNyYyAtIFRoZSBWZWN0b3IgdG8gbXVsdGlwbHkgdGhpcyBWZWN0b3IgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBtdWx0aXBseTogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggKj0gc3JjLng7XHJcbiAgICAgICAgdGhpcy55ICo9IHNyYy55O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FsZSB0aGlzIFZlY3RvciBieSB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI3NjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2NhbGUgdGhpcyBWZWN0b3IgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBzY2FsZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpc0Zpbml0ZSh2YWx1ZSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnggKj0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMueSAqPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gMDtcclxuICAgICAgICAgICAgdGhpcy55ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gYSBjb21wb25lbnQtd2lzZSBkaXZpc2lvbiBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIERpdmlkZXMgdGhpcyBWZWN0b3IgYnkgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjZGl2aWRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHNyYyAtIFRoZSBWZWN0b3IgdG8gZGl2aWRlIHRoaXMgVmVjdG9yIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoaXMgVmVjdG9yMi5cclxuICAgICAqL1xyXG4gICAgZGl2aWRlOiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCAvPSBzcmMueDtcclxuICAgICAgICB0aGlzLnkgLz0gc3JjLnk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZ2F0ZSB0aGUgYHhgIGFuZCBgeWAgY29tcG9uZW50cyBvZiB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjbmVnYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIG5lZ2F0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSAtdGhpcy54O1xyXG4gICAgICAgIHRoaXMueSA9IC10aGlzLnk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjZGlzdGFuY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gc3JjIC0gVGhlIFZlY3RvciB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlIGZyb20gdGhpcyBWZWN0b3IgdG8gdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZGlzdGFuY2U6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGR4ID0gc3JjLnggLSB0aGlzLng7XHJcbiAgICAgICAgdmFyIGR5ID0gc3JjLnkgLSB0aGlzLnk7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvciwgc3F1YXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjZGlzdGFuY2VTcVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzcmMgLSBUaGUgVmVjdG9yIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgZnJvbSB0aGlzIFZlY3RvciB0byB0aGUgZ2l2ZW4gVmVjdG9yLCBzcXVhcmVkLlxyXG4gICAgICovXHJcbiAgICBkaXN0YW5jZVNxOiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHNyYy54IC0gdGhpcy54O1xyXG4gICAgICAgIHZhciBkeSA9IHNyYy55IC0gdGhpcy55O1xyXG5cclxuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBsZW5ndGggKG9yIG1hZ25pdHVkZSkgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI2xlbmd0aFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBsZW5ndGg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBsZW5ndGggKG9yIG1hZ25pdHVkZSkgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI3NldExlbmd0aFxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIHNldExlbmd0aDogZnVuY3Rpb24gKGxlbmd0aClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5zY2FsZShsZW5ndGgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoaXMgVmVjdG9yIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI2xlbmd0aFNxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyBWZWN0b3IsIHNxdWFyZWQuXHJcbiAgICAgKi9cclxuICAgIGxlbmd0aFNxOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG5cclxuICAgICAgICByZXR1cm4geCAqIHggKyB5ICogeTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemUgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogTWFrZXMgdGhlIHZlY3RvciBhIHVuaXQgbGVuZ3RoIHZlY3RvciAobWFnbml0dWRlIG9mIDEpIGluIHRoZSBzYW1lIGRpcmVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjbm9ybWFsaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgbGVuID0geCAqIHggKyB5ICogeTtcclxuXHJcbiAgICAgICAgaWYgKGxlbiA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnggPSB4ICogbGVuO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB5ICogbGVuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlIHRoaXMgVmVjdG9yIHRvIGl0cyBwZXJwZW5kaWN1bGFyLCBpbiB0aGUgcG9zaXRpdmUgZGlyZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNub3JtYWxpemVSaWdodEhhbmRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoaXMgVmVjdG9yMi5cclxuICAgICAqL1xyXG4gICAgbm9ybWFsaXplUmlnaHRIYW5kOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG5cclxuICAgICAgICB0aGlzLnggPSB0aGlzLnkgKiAtMTtcclxuICAgICAgICB0aGlzLnkgPSB4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGUgdGhpcyBWZWN0b3IgdG8gaXRzIHBlcnBlbmRpY3VsYXIsIGluIHRoZSBuZWdhdGl2ZSBkaXJlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI25vcm1hbGl6ZUxlZnRIYW5kXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBub3JtYWxpemVMZWZ0SGFuZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuXHJcbiAgICAgICAgdGhpcy54ID0gdGhpcy55O1xyXG4gICAgICAgIHRoaXMueSA9IHggKiAtMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjZG90XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHNyYyAtIFRoZSBWZWN0b3IyIHRvIGRvdCBwcm9kdWN0IHdpdGggdGhpcyBWZWN0b3IyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBkb3Q6IGZ1bmN0aW9uIChzcmMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMueCAqIHNyYy54ICsgdGhpcy55ICogc3JjLnk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNjcm9zc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBzcmMgLSBUaGUgVmVjdG9yMiB0byBjcm9zcyB3aXRoIHRoaXMgVmVjdG9yMi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICovXHJcbiAgICBjcm9zczogZnVuY3Rpb24gKHNyYylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy54ICogc3JjLnkgLSB0aGlzLnkgKiBzcmMueDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEludGVycG9sYXRlcyB0aGlzIFZlY3RvciB0b3dhcmRzIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI2xlcnBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gc3JjIC0gVGhlIFZlY3RvcjIgdG8gaW50ZXJwb2xhdGUgdG93YXJkcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdD0wXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHBlcmNlbnRhZ2UsIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIGxlcnA6IGZ1bmN0aW9uIChzcmMsIHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHQgPT09IHVuZGVmaW5lZCkgeyB0ID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgYXggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIGF5ID0gdGhpcy55O1xyXG5cclxuICAgICAgICB0aGlzLnggPSBheCArIHQgKiAoc3JjLnggLSBheCk7XHJcbiAgICAgICAgdGhpcy55ID0gYXkgKyB0ICogKHNyYy55IC0gYXkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gdGhpcyBWZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiN0cmFuc2Zvcm1NYXQzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDN9IG1hdCAtIFRoZSBNYXRyaXgzIHRvIHRyYW5zZm9ybSB0aGlzIFZlY3RvcjIgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybU1hdDM6IGZ1bmN0aW9uIChtYXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIG0gPSBtYXQudmFsO1xyXG5cclxuICAgICAgICB0aGlzLnggPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcclxuICAgICAgICB0aGlzLnkgPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhbnNmb3JtIHRoaXMgVmVjdG9yIHdpdGggdGhlIGdpdmVuIE1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjdHJhbnNmb3JtTWF0NFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBtYXQgLSBUaGUgTWF0cml4NCB0byB0cmFuc2Zvcm0gdGhpcyBWZWN0b3IyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1NYXQ0OiBmdW5jdGlvbiAobWF0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciBtID0gbWF0LnZhbDtcclxuXHJcbiAgICAgICAgdGhpcy54ID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xyXG4gICAgICAgIHRoaXMueSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSB0aGlzIFZlY3RvciB0aGUgemVybyB2ZWN0b3IgKDAsIDApLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSAwO1xyXG4gICAgICAgIHRoaXMueSA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpbWl0IHRoZSBsZW5ndGggKG9yIG1hZ25pdHVkZSkgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IyI2xpbWl0XHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIGxlbmd0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIGxpbWl0OiBmdW5jdGlvbiAobWF4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCgpO1xyXG5cclxuICAgICAgICBpZiAobGVuICYmIGxlbiA+IG1heClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NhbGUobWF4IC8gbGVuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmxlY3QgdGhpcyBWZWN0b3Igb2ZmIGEgbGluZSBkZWZpbmVkIGJ5IGEgbm9ybWFsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMiNyZWZsZWN0XHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBub3JtYWwgLSBBIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoaXMgVmVjdG9yMi5cclxuICAgICAqL1xyXG4gICAgcmVmbGVjdDogZnVuY3Rpb24gKG5vcm1hbClcclxuICAgIHtcclxuICAgICAgICBub3JtYWwgPSBub3JtYWwuY2xvbmUoKS5ub3JtYWxpemUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VidHJhY3Qobm9ybWFsLnNjYWxlKDIgKiB0aGlzLmRvdChub3JtYWwpKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmbGVjdCB0aGlzIFZlY3RvciBhY3Jvc3MgYW5vdGhlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjbWlycm9yXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBheGlzIC0gQSB2ZWN0b3IgdG8gcmVmbGVjdCBhY3Jvc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhpcyBWZWN0b3IyLlxyXG4gICAgICovXHJcbiAgICBtaXJyb3I6IGZ1bmN0aW9uIChheGlzKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3QoYXhpcykubmVnYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlIHRoaXMgVmVjdG9yIGJ5IGFuIGFuZ2xlIGFtb3VudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjIjcm90YXRlXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSBieSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGlzIFZlY3RvcjIuXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZTogZnVuY3Rpb24gKGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhkZWx0YSk7XHJcbiAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKGRlbHRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSwgc2luICogdGhpcy54ICsgY29zICogdGhpcy55KTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIHplcm8gVmVjdG9yMiBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICpcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMi5aRVJPXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gKiBAc2luY2UgMy4xLjBcclxuICovXHJcblZlY3RvcjIuWkVSTyA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4vKipcclxuICogQSBzdGF0aWMgcmlnaHQgVmVjdG9yMiBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICpcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMi5SSUdIVFxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMi5SSUdIVCA9IG5ldyBWZWN0b3IyKDEsIDApO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIGxlZnQgVmVjdG9yMiBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICpcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMi5MRUZUXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5WZWN0b3IyLkxFRlQgPSBuZXcgVmVjdG9yMigtMSwgMCk7XHJcblxyXG4vKipcclxuICogQSBzdGF0aWMgdXAgVmVjdG9yMiBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICpcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMi5VUFxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMi5VUCA9IG5ldyBWZWN0b3IyKDAsIC0xKTtcclxuXHJcbi8qKlxyXG4gKiBBIHN0YXRpYyBkb3duIFZlY3RvcjIgZm9yIHVzZSBieSByZWZlcmVuY2UuXHJcbiAqXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjIuRE9XTlxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMi5ET1dOID0gbmV3IFZlY3RvcjIoMCwgMSk7XHJcblxyXG4vKipcclxuICogQSBzdGF0aWMgb25lIFZlY3RvcjIgZm9yIHVzZSBieSByZWZlcmVuY2UuXHJcbiAqXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjIuT05FXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5WZWN0b3IyLk9ORSA9IG5ldyBWZWN0b3IyKDEsIDEpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3IyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBBZGFwdGVkIGZyb20gW2dsLW1hdHJpeF0oaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4KSBieSB0b2ppXHJcbi8vICBhbmQgW3ZlY21hdGhdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC92ZWNtYXRoKSBieSBtYXR0ZGVzbFxyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3IgaW4gM0Qgc3BhY2UuXHJcbiAqXHJcbiAqIEEgdGhyZWUtY29tcG9uZW50IHZlY3Rvci5cclxuICpcclxuICogQGNsYXNzIFZlY3RvcjNcclxuICogQG1lbWJlcm9mIFBoYXNlci5NYXRoXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSB4IGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt6XSAtIFRoZSB6IGNvbXBvbmVudC5cclxuICovXHJcbnZhciBWZWN0b3IzID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFZlY3RvcjMgKHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggY29tcG9uZW50IG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMyN4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgY29tcG9uZW50IG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMyN5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHogY29tcG9uZW50IG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMyN6XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy56ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHgueCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB4LnkgfHwgMDtcclxuICAgICAgICAgICAgdGhpcy56ID0geC56IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB6IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIFZlY3RvciB0byBwb2ludCB1cC5cclxuICAgICAqXHJcbiAgICAgKiBTZXRzIHRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIHRvIDEsIGFuZCB0aGUgb3RoZXJzIHRvIDAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI3VwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHVwOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IDA7XHJcbiAgICAgICAgdGhpcy55ID0gMTtcclxuICAgICAgICB0aGlzLnogPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIGEgY2xvbmUgb2YgdGhpcyBWZWN0b3IzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNjbG9uZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gQSBuZXcgVmVjdG9yMyBvYmplY3QgY29udGFpbmluZyB0aGlzIFZlY3RvcnMgdmFsdWVzLlxyXG4gICAgICovXHJcbiAgICBjbG9uZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjModGhpcy54LCB0aGlzLnksIHRoaXMueik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjcm9zcyAodmVjdG9yKSBwcm9kdWN0IG9mIHR3byBnaXZlbiBWZWN0b3JzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNjcm9zc1ZlY3RvcnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gYSAtIFRoZSBmaXJzdCBWZWN0b3IgdG8gbXVsdGlwbHkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIFZlY3RvciB0byBtdWx0aXBseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKGEsIGIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGF4ID0gYS54O1xyXG4gICAgICAgIHZhciBheSA9IGEueTtcclxuICAgICAgICB2YXIgYXogPSBhLno7XHJcbiAgICAgICAgdmFyIGJ4ID0gYi54O1xyXG4gICAgICAgIHZhciBieSA9IGIueTtcclxuICAgICAgICB2YXIgYnogPSBiLno7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xyXG4gICAgICAgIHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xyXG4gICAgICAgIHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgVmVjdG9yIGlzIGVxdWFsIHRvIGEgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIFBlcmZvcm1zIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrIGFnYWluc3QgZWFjaCBWZWN0b3IncyBjb21wb25lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNlcXVhbHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdiAtIFRoZSBWZWN0b3IzIHRvIGNvbXBhcmUgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB0d28gdmVjdG9ycyBzdHJpY3RseSBtYXRjaCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICBlcXVhbHM6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAoKHRoaXMueCA9PT0gdi54KSAmJiAodGhpcy55ID09PSB2LnkpICYmICh0aGlzLnogPT09IHYueikpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcHkgdGhlIGNvbXBvbmVudHMgb2YgYSBnaXZlbiBWZWN0b3IgaW50byB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjY29weVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzKX0gc3JjIC0gVGhlIFZlY3RvciB0byBjb3B5IHRoZSBjb21wb25lbnRzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IHNyYy54O1xyXG4gICAgICAgIHRoaXMueSA9IHNyYy55O1xyXG4gICAgICAgIHRoaXMueiA9IHNyYy56IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYHhgLCBgeWAsIGFuZCBgemAgY29tcG9uZW50cyBvZiB0aGlzIFZlY3RvciB0byB0aGUgZ2l2ZW4gYHhgLCBgeWAsIGFuZCBgemAgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxvYmplY3QpfSB4IC0gVGhlIHggdmFsdWUgdG8gc2V0IGZvciB0aGlzIFZlY3Rvciwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeCwgeSBhbmQgeiBjb21wb25lbnRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pdIC0gVGhlIHogdmFsdWUgdG8gc2V0IGZvciB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHNldDogZnVuY3Rpb24gKHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHgueCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB4LnkgfHwgMDtcclxuICAgICAgICAgICAgdGhpcy56ID0geC56IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB6IHx8IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBnaXZlbiBWZWN0b3IgdG8gdGhpcyBWZWN0b3IuIEFkZGl0aW9uIGlzIGNvbXBvbmVudC13aXNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8UGhhc2VyLk1hdGguVmVjdG9yMyl9IHYgLSBUaGUgVmVjdG9yIHRvIGFkZCB0byB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ICs9IHYueDtcclxuICAgICAgICB0aGlzLnkgKz0gdi55O1xyXG4gICAgICAgIHRoaXMueiArPSB2LnogfHwgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VidHJhY3QgdGhlIGdpdmVuIFZlY3RvciBmcm9tIHRoaXMgVmVjdG9yLiBTdWJ0cmFjdGlvbiBpcyBjb21wb25lbnQtd2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjc3VidHJhY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8UGhhc2VyLk1hdGguVmVjdG9yMyl9IHYgLSBUaGUgVmVjdG9yIHRvIHN1YnRyYWN0IGZyb20gdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54IC09IHYueDtcclxuICAgICAgICB0aGlzLnkgLT0gdi55O1xyXG4gICAgICAgIHRoaXMueiAtPSB2LnogfHwgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybSBhIGNvbXBvbmVudC13aXNlIG11bHRpcGxpY2F0aW9uIGJldHdlZW4gdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogTXVsdGlwbGllcyB0aGlzIFZlY3RvciBieSB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNtdWx0aXBseVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzKX0gdiAtIFRoZSBWZWN0b3IgdG8gbXVsdGlwbHkgdGhpcyBWZWN0b3IgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICBtdWx0aXBseTogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ICo9IHYueDtcclxuICAgICAgICB0aGlzLnkgKj0gdi55O1xyXG4gICAgICAgIHRoaXMueiAqPSB2LnogfHwgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGUgdGhpcyBWZWN0b3IgYnkgdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNzY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlIC0gVGhlIHZhbHVlIHRvIHNjYWxlIHRoaXMgVmVjdG9yIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFRoaXMgVmVjdG9yMy5cclxuICAgICAqL1xyXG4gICAgc2NhbGU6IGZ1bmN0aW9uIChzY2FsZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaXNGaW5pdGUoc2NhbGUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ICo9IHNjYWxlO1xyXG4gICAgICAgICAgICB0aGlzLnkgKj0gc2NhbGU7XHJcbiAgICAgICAgICAgIHRoaXMueiAqPSBzY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0gMDtcclxuICAgICAgICAgICAgdGhpcy55ID0gMDtcclxuICAgICAgICAgICAgdGhpcy56ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gYSBjb21wb25lbnQtd2lzZSBkaXZpc2lvbiBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIERpdmlkZXMgdGhpcyBWZWN0b3IgYnkgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjZGl2aWRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfFBoYXNlci5NYXRoLlZlY3RvcjMpfSB2IC0gVGhlIFZlY3RvciB0byBkaXZpZGUgdGhpcyBWZWN0b3IgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICBkaXZpZGU6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCAvPSB2Lng7XHJcbiAgICAgICAgdGhpcy55IC89IHYueTtcclxuICAgICAgICB0aGlzLnogLz0gdi56IHx8IDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZ2F0ZSB0aGUgYHhgLCBgeWAgYW5kIGB6YCBjb21wb25lbnRzIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNuZWdhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFRoaXMgVmVjdG9yMy5cclxuICAgICAqL1xyXG4gICAgbmVnYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IC10aGlzLng7XHJcbiAgICAgICAgdGhpcy55ID0gLXRoaXMueTtcclxuICAgICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI2Rpc3RhbmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfFBoYXNlci5NYXRoLlZlY3RvcjMpfSB2IC0gVGhlIFZlY3RvciB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlIGZyb20gdGhpcyBWZWN0b3IgdG8gdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZGlzdGFuY2U6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHYueCAtIHRoaXMueDtcclxuICAgICAgICB2YXIgZHkgPSB2LnkgLSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGR6ID0gdi56IC0gdGhpcy56IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IsIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI2Rpc3RhbmNlU3FcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8UGhhc2VyLk1hdGguVmVjdG9yMyl9IHYgLSBUaGUgVmVjdG9yIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgZnJvbSB0aGlzIFZlY3RvciB0byB0aGUgZ2l2ZW4gVmVjdG9yLCBzcXVhcmVkLlxyXG4gICAgICovXHJcbiAgICBkaXN0YW5jZVNxOiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSB2LnggLSB0aGlzLng7XHJcbiAgICAgICAgdmFyIGR5ID0gdi55IC0gdGhpcy55O1xyXG4gICAgICAgIHZhciBkeiA9IHYueiAtIHRoaXMueiB8fCAwO1xyXG5cclxuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIChvciBtYWduaXR1ZGUpIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNsZW5ndGhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgbGVuZ3RoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciB6ID0gdGhpcy56O1xyXG5cclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhpcyBWZWN0b3Igc3F1YXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjbGVuZ3RoU3FcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIFZlY3Rvciwgc3F1YXJlZC5cclxuICAgICAqL1xyXG4gICAgbGVuZ3RoU3E6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcblxyXG4gICAgICAgIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsaXplIHRoaXMgVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIE1ha2VzIHRoZSB2ZWN0b3IgYSB1bml0IGxlbmd0aCB2ZWN0b3IgKG1hZ25pdHVkZSBvZiAxKSBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI25vcm1hbGl6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICBub3JtYWxpemU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcclxuXHJcbiAgICAgICAgaWYgKGxlbiA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnggPSB4ICogbGVuO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB5ICogbGVuO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB6ICogbGVuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjZG90XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IHYgLSBUaGUgVmVjdG9yMyB0byBkb3QgcHJvZHVjdCB3aXRoIHRoaXMgVmVjdG9yMy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIFZlY3RvciBhbmQgYHZgLlxyXG4gICAgICovXHJcbiAgICBkb3Q6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjcm9zcyAodmVjdG9yKSBwcm9kdWN0IG9mIHRoaXMgVmVjdG9yICh3aGljaCB3aWxsIGJlIG1vZGlmaWVkKSBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjY3Jvc3NcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yM30gdiAtIFRoZSBWZWN0b3IgdG8gY3Jvc3MgcHJvZHVjdCB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFRoaXMgVmVjdG9yMy5cclxuICAgICAqL1xyXG4gICAgY3Jvc3M6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBheCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgYXkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGF6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciBieCA9IHYueDtcclxuICAgICAgICB2YXIgYnkgPSB2Lnk7XHJcbiAgICAgICAgdmFyIGJ6ID0gdi56O1xyXG5cclxuICAgICAgICB0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcclxuICAgICAgICB0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcclxuICAgICAgICB0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGluZWFybHkgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGlzIFZlY3RvciBhbmQgdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBJbnRlcnBvbGF0ZXMgdGhpcyBWZWN0b3IgdG93YXJkcyB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyNsZXJwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjN9IHYgLSBUaGUgVmVjdG9yMyB0byBpbnRlcnBvbGF0ZSB0b3dhcmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt0PTBdIC0gVGhlIGludGVycG9sYXRpb24gcGVyY2VudGFnZSwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFRoaXMgVmVjdG9yMy5cclxuICAgICAqL1xyXG4gICAgbGVycDogZnVuY3Rpb24gKHYsIHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHQgPT09IHVuZGVmaW5lZCkgeyB0ID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgYXggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIGF5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciBheiA9IHRoaXMuejtcclxuXHJcbiAgICAgICAgdGhpcy54ID0gYXggKyB0ICogKHYueCAtIGF4KTtcclxuICAgICAgICB0aGlzLnkgPSBheSArIHQgKiAodi55IC0gYXkpO1xyXG4gICAgICAgIHRoaXMueiA9IGF6ICsgdCAqICh2LnogLSBheik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybSB0aGlzIFZlY3RvciB3aXRoIHRoZSBnaXZlbiBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI3RyYW5zZm9ybU1hdDNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4M30gbWF0IC0gVGhlIE1hdHJpeDMgdG8gdHJhbnNmb3JtIHRoaXMgVmVjdG9yMyB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjN9IFRoaXMgVmVjdG9yMy5cclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtTWF0MzogZnVuY3Rpb24gKG1hdClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgbSA9IG1hdC52YWw7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IHggKiBtWzBdICsgeSAqIG1bM10gKyB6ICogbVs2XTtcclxuICAgICAgICB0aGlzLnkgPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XHJcbiAgICAgICAgdGhpcy56ID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gdGhpcyBWZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gTWF0cml4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyN0cmFuc2Zvcm1NYXQ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLk1hdHJpeDR9IG1hdCAtIFRoZSBNYXRyaXg0IHRvIHRyYW5zZm9ybSB0aGlzIFZlY3RvcjMgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHRyYW5zZm9ybU1hdDQ6IGZ1bmN0aW9uIChtYXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIG0gPSBtYXQudmFsO1xyXG5cclxuICAgICAgICB0aGlzLnggPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXTtcclxuICAgICAgICB0aGlzLnkgPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXTtcclxuICAgICAgICB0aGlzLnogPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoaXMgVmVjdG9yMyB3aXRoIHRoZSBnaXZlbiBNYXRyaXg0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yMyN0cmFuc2Zvcm1Db29yZGluYXRlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBtYXQgLSBUaGUgTWF0cml4NCB0byB0cmFuc2Zvcm0gdGhpcyBWZWN0b3IzIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1Db29yZGluYXRlczogZnVuY3Rpb24gKG1hdClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgbSA9IG1hdC52YWw7XHJcblxyXG4gICAgICAgIHZhciB0eCA9ICh4ICogbVswXSkgKyAoeSAqIG1bNF0pICsgKHogKiBtWzhdKSArIG1bMTJdO1xyXG4gICAgICAgIHZhciB0eSA9ICh4ICogbVsxXSkgKyAoeSAqIG1bNV0pICsgKHogKiBtWzldKSArIG1bMTNdO1xyXG4gICAgICAgIHZhciB0eiA9ICh4ICogbVsyXSkgKyAoeSAqIG1bNl0pICsgKHogKiBtWzEwXSkgKyBtWzE0XTtcclxuICAgICAgICB2YXIgdHcgPSAoeCAqIG1bM10pICsgKHkgKiBtWzddKSArICh6ICogbVsxMV0pICsgbVsxNV07XHJcblxyXG4gICAgICAgIHRoaXMueCA9IHR4IC8gdHc7XHJcbiAgICAgICAgdGhpcy55ID0gdHkgLyB0dztcclxuICAgICAgICB0aGlzLnogPSB0eiAvIHR3O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gdGhpcyBWZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjdHJhbnNmb3JtUXVhdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHRoaXMgVmVjdG9yIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yM30gVGhpcyBWZWN0b3IzLlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1RdWF0OiBmdW5jdGlvbiAocSlcclxuICAgIHtcclxuICAgICAgICAvLyBiZW5jaG1hcmtzOiBodHRwOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9uc1xyXG4gICAgICAgIHZhciB4ID0gdGhpcy54O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xyXG4gICAgICAgIHZhciB6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciBxeCA9IHEueDtcclxuICAgICAgICB2YXIgcXkgPSBxLnk7XHJcbiAgICAgICAgdmFyIHF6ID0gcS56O1xyXG4gICAgICAgIHZhciBxdyA9IHEudztcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcclxuICAgICAgICB2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XHJcbiAgICAgICAgdmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xyXG4gICAgICAgIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcclxuICAgICAgICB2YXIgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xyXG5cclxuICAgICAgICAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XHJcbiAgICAgICAgdGhpcy54ID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcclxuICAgICAgICB0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6O1xyXG4gICAgICAgIHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGxpZXMgdGhpcyBWZWN0b3IzIGJ5IHRoZSBzcGVjaWZpZWQgbWF0cml4LCBhcHBseWluZyBhIFcgZGl2aWRlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvamVjdGlvbixcclxuICAgICAqIGUuZy4gdW5wcm9qZWN0aW5nIGEgMkQgcG9pbnQgaW50byAzRCBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjMjcHJvamVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5NYXRyaXg0fSBtYXQgLSBUaGUgTWF0cml4NCB0byBtdWx0aXBseSB0aGlzIFZlY3RvcjMgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHByb2plY3Q6IGZ1bmN0aW9uIChtYXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIG0gPSBtYXQudmFsO1xyXG5cclxuICAgICAgICB2YXIgYTAwID0gbVswXTtcclxuICAgICAgICB2YXIgYTAxID0gbVsxXTtcclxuICAgICAgICB2YXIgYTAyID0gbVsyXTtcclxuICAgICAgICB2YXIgYTAzID0gbVszXTtcclxuICAgICAgICB2YXIgYTEwID0gbVs0XTtcclxuICAgICAgICB2YXIgYTExID0gbVs1XTtcclxuICAgICAgICB2YXIgYTEyID0gbVs2XTtcclxuICAgICAgICB2YXIgYTEzID0gbVs3XTtcclxuICAgICAgICB2YXIgYTIwID0gbVs4XTtcclxuICAgICAgICB2YXIgYTIxID0gbVs5XTtcclxuICAgICAgICB2YXIgYTIyID0gbVsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IG1bMTFdO1xyXG4gICAgICAgIHZhciBhMzAgPSBtWzEyXTtcclxuICAgICAgICB2YXIgYTMxID0gbVsxM107XHJcbiAgICAgICAgdmFyIGEzMiA9IG1bMTRdO1xyXG4gICAgICAgIHZhciBhMzMgPSBtWzE1XTtcclxuXHJcbiAgICAgICAgdmFyIGx3ID0gMSAvICh4ICogYTAzICsgeSAqIGExMyArIHogKiBhMjMgKyBhMzMpO1xyXG5cclxuICAgICAgICB0aGlzLnggPSAoeCAqIGEwMCArIHkgKiBhMTAgKyB6ICogYTIwICsgYTMwKSAqIGx3O1xyXG4gICAgICAgIHRoaXMueSA9ICh4ICogYTAxICsgeSAqIGExMSArIHogKiBhMjEgKyBhMzEpICogbHc7XHJcbiAgICAgICAgdGhpcy56ID0gKHggKiBhMDIgKyB5ICogYTEyICsgeiAqIGEyMiArIGEzMikgKiBsdztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVW5wcm9qZWN0IHRoaXMgcG9pbnQgZnJvbSAyRCBzcGFjZSB0byAzRCBzcGFjZS5cclxuICAgICAqIFRoZSBwb2ludCBzaG91bGQgaGF2ZSBpdHMgeCBhbmQgeSBwcm9wZXJ0aWVzIHNldCB0b1xyXG4gICAgICogMkQgc2NyZWVuIHNwYWNlLCBhbmQgdGhlIHogZWl0aGVyIGF0IDAgKG5lYXIgcGxhbmUpXHJcbiAgICAgKiBvciAxIChmYXIgcGxhbmUpLiBUaGUgcHJvdmlkZWQgbWF0cml4IGlzIGFzc3VtZWQgdG8gYWxyZWFkeVxyXG4gICAgICogYmUgY29tYmluZWQsIGkuZS4gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbC5cclxuICAgICAqXHJcbiAgICAgKiBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhpcyB2ZWN0b3IncyAoeCwgeSwgeikgY29tcG9uZW50cyB3aWxsXHJcbiAgICAgKiByZXByZXNlbnQgdGhlIHVucHJvamVjdGVkIDNEIGNvb3JkaW5hdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI3VucHJvamVjdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSB2aWV3cG9ydCAtIFNjcmVlbiB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4NH0gaW52UHJvamVjdGlvblZpZXcgLSBDb21iaW5lZCBwcm9qZWN0aW9uIGFuZCB2aWV3IG1hdHJpeC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHVucHJvamVjdDogZnVuY3Rpb24gKHZpZXdwb3J0LCBpbnZQcm9qZWN0aW9uVmlldylcclxuICAgIHtcclxuICAgICAgICB2YXIgdmlld1ggPSB2aWV3cG9ydC54O1xyXG4gICAgICAgIHZhciB2aWV3WSA9IHZpZXdwb3J0Lnk7XHJcbiAgICAgICAgdmFyIHZpZXdXaWR0aCA9IHZpZXdwb3J0Lno7XHJcbiAgICAgICAgdmFyIHZpZXdIZWlnaHQgPSB2aWV3cG9ydC53O1xyXG5cclxuICAgICAgICB2YXIgeCA9IHRoaXMueCAtIHZpZXdYO1xyXG4gICAgICAgIHZhciB5ID0gKHZpZXdIZWlnaHQgLSB0aGlzLnkgLSAxKSAtIHZpZXdZO1xyXG4gICAgICAgIHZhciB6ID0gdGhpcy56O1xyXG5cclxuICAgICAgICB0aGlzLnggPSAoMiAqIHgpIC8gdmlld1dpZHRoIC0gMTtcclxuICAgICAgICB0aGlzLnkgPSAoMiAqIHkpIC8gdmlld0hlaWdodCAtIDE7XHJcbiAgICAgICAgdGhpcy56ID0gMiAqIHogLSAxO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0KGludlByb2plY3Rpb25WaWV3KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlIHRoaXMgVmVjdG9yIHRoZSB6ZXJvIHZlY3RvciAoMCwgMCwgMCkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3IzI3Jlc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IzfSBUaGlzIFZlY3RvcjMuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IDA7XHJcbiAgICAgICAgdGhpcy55ID0gMDtcclxuICAgICAgICB0aGlzLnogPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIHplcm8gVmVjdG9yMyBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICogXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjMuWkVST1xyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yM31cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMy5aRVJPID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHN0YXRpYyByaWdodCBWZWN0b3IzIGZvciB1c2UgYnkgcmVmZXJlbmNlLlxyXG4gKiBcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMy5SSUdIVFxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yM31cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMy5SSUdIVCA9IG5ldyBWZWN0b3IzKDEsIDAsIDApO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIGxlZnQgVmVjdG9yMyBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICogXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjMuTEVGVFxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yM31cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMy5MRUZUID0gbmV3IFZlY3RvcjMoLTEsIDAsIDApO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIHVwIFZlY3RvcjMgZm9yIHVzZSBieSByZWZlcmVuY2UuXHJcbiAqIFxyXG4gKiBUaGlzIGNvbnN0YW50IGlzIG1lYW50IGZvciBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3IzLlVQXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IzfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5WZWN0b3IzLlVQID0gbmV3IFZlY3RvcjMoMCwgLTEsIDApO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhdGljIGRvd24gVmVjdG9yMyBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICogXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjMuRE9XTlxyXG4gKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yM31cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuVmVjdG9yMy5ET1dOID0gbmV3IFZlY3RvcjMoMCwgMSwgMCk7XHJcblxyXG4vKipcclxuICogQSBzdGF0aWMgZm9yd2FyZCBWZWN0b3IzIGZvciB1c2UgYnkgcmVmZXJlbmNlLlxyXG4gKiBcclxuICogVGhpcyBjb25zdGFudCBpcyBtZWFudCBmb3IgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQG5hbWUgUGhhc2VyLk1hdGguVmVjdG9yMy5GT1JXQVJEXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IzfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5WZWN0b3IzLkZPUldBUkQgPSBuZXcgVmVjdG9yMygwLCAwLCAxKTtcclxuXHJcbi8qKlxyXG4gKiBBIHN0YXRpYyBiYWNrIFZlY3RvcjMgZm9yIHVzZSBieSByZWZlcmVuY2UuXHJcbiAqIFxyXG4gKiBUaGlzIGNvbnN0YW50IGlzIG1lYW50IGZvciBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3IzLkJBQ0tcclxuICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjN9XHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICovXHJcblZlY3RvcjMuQkFDSyA9IG5ldyBWZWN0b3IzKDAsIDAsIC0xKTtcclxuXHJcbi8qKlxyXG4gKiBBIHN0YXRpYyBvbmUgVmVjdG9yMyBmb3IgdXNlIGJ5IHJlZmVyZW5jZS5cclxuICogXHJcbiAqIFRoaXMgY29uc3RhbnQgaXMgbWVhbnQgZm9yIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBkaXJlY3RseS5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEBuYW1lIFBoYXNlci5NYXRoLlZlY3RvcjMuT05FXHJcbiAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IzfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5WZWN0b3IzLk9ORSA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3IzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBBZGFwdGVkIGZyb20gW2dsLW1hdHJpeF0oaHR0cHM6Ly9naXRodWIuY29tL3RvamkvZ2wtbWF0cml4KSBieSB0b2ppXHJcbi8vICBhbmQgW3ZlY21hdGhdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0ZGVzbC92ZWNtYXRoKSBieSBtYXR0ZGVzbFxyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3IgaW4gNEQgc3BhY2UuXHJcbiAqXHJcbiAqIEEgZm91ci1jb21wb25lbnQgdmVjdG9yLlxyXG4gKlxyXG4gKiBAY2xhc3MgVmVjdG9yNFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLk1hdGhcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3hdIC0gVGhlIHggY29tcG9uZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgY29tcG9uZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3pdIC0gVGhlIHogY29tcG9uZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ddIC0gVGhlIHcgY29tcG9uZW50LlxyXG4gKi9cclxudmFyIFZlY3RvcjQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVmVjdG9yNCAoeCwgeSwgeiwgdylcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeCBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3I0I3hcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3I0I3lcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeiBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3I0I3pcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnogPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdyBjb21wb25lbnQgb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5WZWN0b3I0I3dcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLncgPSAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0geC54IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueSA9IHgueSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB4LnogfHwgMDtcclxuICAgICAgICAgICAgdGhpcy53ID0geC53IHx8IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMueCA9IHggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnogPSB6IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMudyA9IHcgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSBhIGNsb25lIG9mIHRoaXMgVmVjdG9yNC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjY2xvbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjR9IEEgY2xvbmUgb2YgdGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICBjbG9uZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjQodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3B5IHRoZSBjb21wb25lbnRzIG9mIGEgZ2l2ZW4gVmVjdG9yIGludG8gdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I2NvcHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yNH0gc3JjIC0gVGhlIFZlY3RvciB0byBjb3B5IHRoZSBjb21wb25lbnRzIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAoc3JjKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IHNyYy54O1xyXG4gICAgICAgIHRoaXMueSA9IHNyYy55O1xyXG4gICAgICAgIHRoaXMueiA9IHNyYy56IHx8IDA7XHJcbiAgICAgICAgdGhpcy53ID0gc3JjLncgfHwgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciB0aGlzIFZlY3RvciBpcyBlcXVhbCB0byBhIGdpdmVuIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBQZXJmb3JtcyBhIHN0cmljdCBxdWFsaXR5IGNoZWNrIGFnYWluc3QgZWFjaCBWZWN0b3IncyBjb21wb25lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNlcXVhbHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gY2hlY2sgZXF1YWxpdHkgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0d28gVmVjdG9ycyBhcmUgZXF1YWwgb3Igbm90LlxyXG4gICAgICovXHJcbiAgICBlcXVhbHM6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAoKHRoaXMueCA9PT0gdi54KSAmJiAodGhpcy55ID09PSB2LnkpICYmICh0aGlzLnogPT09IHYueikgJiYgKHRoaXMudyA9PT0gdi53KSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBgeGAsIGB5YCwgYHpgIGFuZCBgd2AgY29tcG9uZW50cyBvZiB0aGUgdGhpcyBWZWN0b3IgdG8gdGhlIGdpdmVuIGB4YCwgYHlgLCBgemAgYW5kIGB3YCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I3NldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG9iamVjdCl9IHggLSBUaGUgeCB2YWx1ZSB0byBzZXQgZm9yIHRoaXMgVmVjdG9yLCBvciBhbiBvYmplY3QgY29udGFpbmluZyB4LCB5LCB6IGFuZCB3IGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB6IHZhbHVlIHRvIHNldCBmb3IgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uICh4LCB5LCB6LCB3KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnggPSB4LnggfHwgMDtcclxuICAgICAgICAgICAgdGhpcy55ID0geC55IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueiA9IHgueiB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLncgPSB4LncgfHwgMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy54ID0geCB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnkgPSB5IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMueiA9IHogfHwgMDtcclxuICAgICAgICAgICAgdGhpcy53ID0gdyB8fCAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgZ2l2ZW4gVmVjdG9yIHRvIHRoaXMgVmVjdG9yLiBBZGRpdGlvbiBpcyBjb21wb25lbnQtd2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjYWRkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfFBoYXNlci5NYXRoLlZlY3RvcjN8UGhhc2VyLk1hdGguVmVjdG9yNCl9IHYgLSBUaGUgVmVjdG9yIHRvIGFkZCB0byB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBUaGlzIFZlY3RvcjQuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ICs9IHYueDtcclxuICAgICAgICB0aGlzLnkgKz0gdi55O1xyXG4gICAgICAgIHRoaXMueiArPSB2LnogfHwgMDtcclxuICAgICAgICB0aGlzLncgKz0gdi53IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnRyYWN0IHRoZSBnaXZlbiBWZWN0b3IgZnJvbSB0aGlzIFZlY3Rvci4gU3VidHJhY3Rpb24gaXMgY29tcG9uZW50LXdpc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I3N1YnRyYWN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfFBoYXNlci5NYXRoLlZlY3RvcjN8UGhhc2VyLk1hdGguVmVjdG9yNCl9IHYgLSBUaGUgVmVjdG9yIHRvIHN1YnRyYWN0IGZyb20gdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICBzdWJ0cmFjdDogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54IC09IHYueDtcclxuICAgICAgICB0aGlzLnkgLT0gdi55O1xyXG4gICAgICAgIHRoaXMueiAtPSB2LnogfHwgMDtcclxuICAgICAgICB0aGlzLncgLT0gdi53IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlIHRoaXMgVmVjdG9yIGJ5IHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjc2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZSAtIFRoZSB2YWx1ZSB0byBzY2FsZSB0aGlzIFZlY3RvciBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBUaGlzIFZlY3RvcjQuXHJcbiAgICAgKi9cclxuICAgIHNjYWxlOiBmdW5jdGlvbiAoc2NhbGUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy54ICo9IHNjYWxlO1xyXG4gICAgICAgIHRoaXMueSAqPSBzY2FsZTtcclxuICAgICAgICB0aGlzLnogKj0gc2NhbGU7XHJcbiAgICAgICAgdGhpcy53ICo9IHNjYWxlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCAob3IgbWFnbml0dWRlKSBvZiB0aGlzIFZlY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjbGVuZ3RoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyBWZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGxlbmd0aDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgdyA9IHRoaXMudztcclxuXHJcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhpcyBWZWN0b3Igc3F1YXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjbGVuZ3RoU3FcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIFZlY3Rvciwgc3F1YXJlZC5cclxuICAgICAqL1xyXG4gICAgbGVuZ3RoU3E6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIHcgPSB0aGlzLnc7XHJcblxyXG4gICAgICAgIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpemUgdGhpcyBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogTWFrZXMgdGhlIHZlY3RvciBhIHVuaXQgbGVuZ3RoIHZlY3RvciAobWFnbml0dWRlIG9mIDEpIGluIHRoZSBzYW1lIGRpcmVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjbm9ybWFsaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBUaGlzIFZlY3RvcjQuXHJcbiAgICAgKi9cclxuICAgIG5vcm1hbGl6ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgdyA9IHRoaXMudztcclxuICAgICAgICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XHJcblxyXG4gICAgICAgIGlmIChsZW4gPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy54ID0geCAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy55ID0geSAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy56ID0geiAqIGxlbjtcclxuICAgICAgICAgICAgdGhpcy53ID0gdyAqIGxlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgb2YgdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I2RvdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSB2IC0gVGhlIFZlY3RvcjQgdG8gZG90IHByb2R1Y3Qgd2l0aCB0aGlzIFZlY3RvcjQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZG90IHByb2R1Y3Qgb2YgdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKi9cclxuICAgIGRvdDogZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEludGVycG9sYXRlcyB0aGlzIFZlY3RvciB0b3dhcmRzIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I2xlcnBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yNH0gdiAtIFRoZSBWZWN0b3I0IHRvIGludGVycG9sYXRlIHRvd2FyZHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Q9MF0gLSBUaGUgaW50ZXJwb2xhdGlvbiBwZXJjZW50YWdlLCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICBsZXJwOiBmdW5jdGlvbiAodiwgdClcclxuICAgIHtcclxuICAgICAgICBpZiAodCA9PT0gdW5kZWZpbmVkKSB7IHQgPSAwOyB9XHJcblxyXG4gICAgICAgIHZhciBheCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgYXkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGF6ID0gdGhpcy56O1xyXG4gICAgICAgIHZhciBhdyA9IHRoaXMudztcclxuXHJcbiAgICAgICAgdGhpcy54ID0gYXggKyB0ICogKHYueCAtIGF4KTtcclxuICAgICAgICB0aGlzLnkgPSBheSArIHQgKiAodi55IC0gYXkpO1xyXG4gICAgICAgIHRoaXMueiA9IGF6ICsgdCAqICh2LnogLSBheik7XHJcbiAgICAgICAgdGhpcy53ID0gYXcgKyB0ICogKHYudyAtIGF3KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybSBhIGNvbXBvbmVudC13aXNlIG11bHRpcGxpY2F0aW9uIGJldHdlZW4gdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogTXVsdGlwbGllcyB0aGlzIFZlY3RvciBieSB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNtdWx0aXBseVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFZlY3RvciB0byBtdWx0aXBseSB0aGlzIFZlY3RvciBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3I0fSBUaGlzIFZlY3RvcjQuXHJcbiAgICAgKi9cclxuICAgIG11bHRpcGx5OiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggKj0gdi54O1xyXG4gICAgICAgIHRoaXMueSAqPSB2Lnk7XHJcbiAgICAgICAgdGhpcy56ICo9IHYueiB8fCAxO1xyXG4gICAgICAgIHRoaXMudyAqPSB2LncgfHwgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybSBhIGNvbXBvbmVudC13aXNlIGRpdmlzaW9uIGJldHdlZW4gdGhpcyBWZWN0b3IgYW5kIHRoZSBnaXZlbiBWZWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogRGl2aWRlcyB0aGlzIFZlY3RvciBieSB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNkaXZpZGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8UGhhc2VyLk1hdGguVmVjdG9yM3xQaGFzZXIuTWF0aC5WZWN0b3I0KX0gdiAtIFRoZSBWZWN0b3IgdG8gZGl2aWRlIHRoaXMgVmVjdG9yIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjR9IFRoaXMgVmVjdG9yNC5cclxuICAgICAqL1xyXG4gICAgZGl2aWRlOiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggLz0gdi54O1xyXG4gICAgICAgIHRoaXMueSAvPSB2Lnk7XHJcbiAgICAgICAgdGhpcy56IC89IHYueiB8fCAxO1xyXG4gICAgICAgIHRoaXMudyAvPSB2LncgfHwgMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNkaXN0YW5jZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxQaGFzZXIuTWF0aC5WZWN0b3IzfFBoYXNlci5NYXRoLlZlY3RvcjQpfSB2IC0gVGhlIFZlY3RvciB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlIGZyb20gdGhpcyBWZWN0b3IgdG8gdGhlIGdpdmVuIFZlY3Rvci5cclxuICAgICAqL1xyXG4gICAgZGlzdGFuY2U6IGZ1bmN0aW9uICh2KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkeCA9IHYueCAtIHRoaXMueDtcclxuICAgICAgICB2YXIgZHkgPSB2LnkgLSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIGR6ID0gdi56IC0gdGhpcy56IHx8IDA7XHJcbiAgICAgICAgdmFyIGR3ID0gdi53IC0gdGhpcy53IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6ICsgZHcgKiBkdyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgVmVjdG9yIGFuZCB0aGUgZ2l2ZW4gVmVjdG9yLCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNkaXN0YW5jZVNxXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuTWF0aC5WZWN0b3IyfFBoYXNlci5NYXRoLlZlY3RvcjN8UGhhc2VyLk1hdGguVmVjdG9yNCl9IHYgLSBUaGUgVmVjdG9yIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgZnJvbSB0aGlzIFZlY3RvciB0byB0aGUgZ2l2ZW4gVmVjdG9yLCBzcXVhcmVkLlxyXG4gICAgICovXHJcbiAgICBkaXN0YW5jZVNxOiBmdW5jdGlvbiAodilcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSB2LnggLSB0aGlzLng7XHJcbiAgICAgICAgdmFyIGR5ID0gdi55IC0gdGhpcy55O1xyXG4gICAgICAgIHZhciBkeiA9IHYueiAtIHRoaXMueiB8fCAwO1xyXG4gICAgICAgIHZhciBkdyA9IHYudyAtIHRoaXMudyB8fCAwO1xyXG5cclxuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6ICsgZHcgKiBkdztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGB4YCwgYHlgLCBgemAgYW5kIGB3YCBjb21wb25lbnRzIG9mIHRoaXMgVmVjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNuZWdhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjR9IFRoaXMgVmVjdG9yNC5cclxuICAgICAqL1xyXG4gICAgbmVnYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMueCA9IC10aGlzLng7XHJcbiAgICAgICAgdGhpcy55ID0gLXRoaXMueTtcclxuICAgICAgICB0aGlzLnogPSAtdGhpcy56O1xyXG4gICAgICAgIHRoaXMudyA9IC10aGlzLnc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybSB0aGlzIFZlY3RvciB3aXRoIHRoZSBnaXZlbiBNYXRyaXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5WZWN0b3I0I3RyYW5zZm9ybU1hdDRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguTWF0cml4NH0gbWF0IC0gVGhlIE1hdHJpeDQgdG8gdHJhbnNmb3JtIHRoaXMgVmVjdG9yNCB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjR9IFRoaXMgVmVjdG9yNC5cclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtTWF0NDogZnVuY3Rpb24gKG1hdClcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IHRoaXMueDtcclxuICAgICAgICB2YXIgeSA9IHRoaXMueTtcclxuICAgICAgICB2YXIgeiA9IHRoaXMuejtcclxuICAgICAgICB2YXIgdyA9IHRoaXMudztcclxuICAgICAgICB2YXIgbSA9IG1hdC52YWw7XHJcblxyXG4gICAgICAgIHRoaXMueCA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcclxuICAgICAgICB0aGlzLnkgPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XHJcbiAgICAgICAgdGhpcy56ID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdICogdztcclxuICAgICAgICB0aGlzLncgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm0gdGhpcyBWZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gUXVhdGVybmlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlZlY3RvcjQjdHJhbnNmb3JtUXVhdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5RdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHRoaXMgVmVjdG9yIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1RdWF0OiBmdW5jdGlvbiAocSlcclxuICAgIHtcclxuICAgICAgICAvLyBUT0RPOiBpcyB0aGlzIHJlYWxseSB0aGUgc2FtZSBhcyBWZWN0b3IzP1xyXG4gICAgICAgIC8vIEFsc28sIHdoYXQgYWJvdXQgdGhpczogaHR0cDovL21vbGVjdWxhcm11c2luZ3Mud29yZHByZXNzLmNvbS8yMDEzLzA1LzI0L2EtZmFzdGVyLXF1YXRlcm5pb24tdmVjdG9yLW11bHRpcGxpY2F0aW9uL1xyXG4gICAgICAgIC8vIGJlbmNobWFya3M6IGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zXHJcbiAgICAgICAgdmFyIHggPSB0aGlzLng7XHJcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XHJcbiAgICAgICAgdmFyIHogPSB0aGlzLno7XHJcbiAgICAgICAgdmFyIHF4ID0gcS54O1xyXG4gICAgICAgIHZhciBxeSA9IHEueTtcclxuICAgICAgICB2YXIgcXogPSBxLno7XHJcbiAgICAgICAgdmFyIHF3ID0gcS53O1xyXG5cclxuICAgICAgICAvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY1xyXG4gICAgICAgIHZhciBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcclxuICAgICAgICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XHJcbiAgICAgICAgdmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xyXG4gICAgICAgIHZhciBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcclxuICAgICAgICB0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xyXG4gICAgICAgIHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XHJcbiAgICAgICAgdGhpcy56ID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZSB0aGlzIFZlY3RvciB0aGUgemVybyB2ZWN0b3IgKDAsIDAsIDAsIDApLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguVmVjdG9yNCNyZXNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yNH0gVGhpcyBWZWN0b3I0LlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnggPSAwO1xyXG4gICAgICAgIHRoaXMueSA9IDA7XHJcbiAgICAgICAgdGhpcy56ID0gMDtcclxuICAgICAgICB0aGlzLncgPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuLy8gIFRPRE86IENoZWNrIGlmIHRoZXNlIGFyZSByZXF1aXJlZCBpbnRlcm5hbGx5LCBpZiBub3QsIHJlbW92ZS5cclxuVmVjdG9yNC5wcm90b3R5cGUuc3ViID0gVmVjdG9yNC5wcm90b3R5cGUuc3VidHJhY3Q7XHJcblZlY3RvcjQucHJvdG90eXBlLm11bCA9IFZlY3RvcjQucHJvdG90eXBlLm11bHRpcGx5O1xyXG5WZWN0b3I0LnByb3RvdHlwZS5kaXYgPSBWZWN0b3I0LnByb3RvdHlwZS5kaXZpZGU7XHJcblZlY3RvcjQucHJvdG90eXBlLmRpc3QgPSBWZWN0b3I0LnByb3RvdHlwZS5kaXN0YW5jZTtcclxuVmVjdG9yNC5wcm90b3R5cGUuZGlzdFNxID0gVmVjdG9yNC5wcm90b3R5cGUuZGlzdGFuY2VTcTtcclxuVmVjdG9yNC5wcm90b3R5cGUubGVuID0gVmVjdG9yNC5wcm90b3R5cGUubGVuZ3RoO1xyXG5WZWN0b3I0LnByb3RvdHlwZS5sZW5TcSA9IFZlY3RvcjQucHJvdG90eXBlLmxlbmd0aFNxO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3I0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIHdpdGhpbiB0aGUgZ2l2ZW4gYHRvbGVyYW5jZWAgb2YgZWFjaCBvdGhlci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLldpdGhpblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gdXNlIGluIHRoZSBjYWxjdWxhdGlvbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIHVzZSBpbiB0aGUgY2FsY3VsYXRpb24uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b2xlcmFuY2UgLSBUaGUgdG9sZXJhbmNlLiBBbnl0aGluZyBlcXVhbCB0byBvciBsZXNzIHRoYW4gdGhpcyB2YWx1ZSBpcyBjb25zaWRlcmVkIGFzIGJlaW5nIHdpdGhpbiByYW5nZS5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGFgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdG9sZXJhbmNlIG9mIGBiYC5cclxuICovXHJcbnZhciBXaXRoaW4gPSBmdW5jdGlvbiAoYSwgYiwgdG9sZXJhbmNlKVxyXG57XHJcbiAgICByZXR1cm4gKE1hdGguYWJzKGEgLSBiKSA8PSB0b2xlcmFuY2UpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXaXRoaW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFdyYXAgdGhlIGdpdmVuIGB2YWx1ZWAgYmV0d2VlbiBgbWluYCBhbmQgYG1heC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLldyYXBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB3cmFwLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZS5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgd3JhcHBlZCB2YWx1ZS5cclxuICovXHJcbnZhciBXcmFwID0gZnVuY3Rpb24gKHZhbHVlLCBtaW4sIG1heClcclxue1xyXG4gICAgdmFyIHJhbmdlID0gbWF4IC0gbWluO1xyXG5cclxuICAgIHJldHVybiAobWluICsgKCgoKHZhbHVlIC0gbWluKSAlIHJhbmdlKSArIHJhbmdlKSAlIHJhbmdlKSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFdyYXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEZpbmQgdGhlIGFuZ2xlIG9mIGEgc2VnbWVudCBmcm9tICh4MSwgeTEpIC0+ICh4MiwgeTIpLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQW5nbGUuQmV0d2VlblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuICovXHJcbnZhciBCZXR3ZWVuID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5MiAtIHkxLCB4MiAtIHgxKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmV0d2VlbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogRmluZCB0aGUgYW5nbGUgb2YgYSBzZWdtZW50IGZyb20gKHBvaW50MS54LCBwb2ludDEueSkgLT4gKHBvaW50Mi54LCBwb2ludDIueSkuXHJcbiAqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgZmlyc3QgcG9pbnQgdG8gdGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkFuZ2xlLkJldHdlZW5Qb2ludHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IHBvaW50MSAtIFRoZSBmaXJzdCBwb2ludC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gcG9pbnQyIC0gVGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuICovXHJcbnZhciBCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24gKHBvaW50MSwgcG9pbnQyKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5hdGFuMihwb2ludDIueSAtIHBvaW50MS55LCBwb2ludDIueCAtIHBvaW50MS54KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmV0d2VlblBvaW50cztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogRmluZCB0aGUgYW5nbGUgb2YgYSBzZWdtZW50IGZyb20gKHBvaW50MS54LCBwb2ludDEueSkgLT4gKHBvaW50Mi54LCBwb2ludDIueSkuXHJcbiAqXHJcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIHtAbGluayBQaGFzZXIuTWF0aC5BbmdsZS5CZXR3ZWVuUG9pbnRzfSBpcyB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgeSBjb29yZGluYXRlXHJcbiAqIHRyYXZlbHMgZG93biB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQW5nbGUuQmV0d2VlblBvaW50c1lcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IHBvaW50MSAtIFRoZSBmaXJzdCBwb2ludC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gcG9pbnQyIC0gVGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuICovXHJcbnZhciBCZXR3ZWVuUG9pbnRzWSA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50Milcclxue1xyXG4gICAgcmV0dXJuIE1hdGguYXRhbjIocG9pbnQyLnggLSBwb2ludDEueCwgcG9pbnQyLnkgLSBwb2ludDEueSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJldHdlZW5Qb2ludHNZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGaW5kIHRoZSBhbmdsZSBvZiBhIHNlZ21lbnQgZnJvbSAoeDEsIHkxKSAtPiAoeDIsIHkyKS5cclxuICpcclxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQge0BsaW5rIFBoYXNlci5NYXRoLkFuZ2xlLkJldHdlZW59IGlzIHRoYXQgdGhpcyBhc3N1bWVzIHRoZSB5IGNvb3JkaW5hdGVcclxuICogdHJhdmVscyBkb3duIHRoZSBzY3JlZW4uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5BbmdsZS5CZXR3ZWVuWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuICovXHJcbnZhciBCZXR3ZWVuWSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Milcclxue1xyXG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeDIgLSB4MSwgeTIgLSB5MSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJldHdlZW5ZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4uL2NvbnN0Jyk7XHJcblxyXG4vKipcclxuICogVGFrZXMgYW4gYW5nbGUgaW4gUGhhc2VycyBkZWZhdWx0IGNsb2Nrd2lzZSBmb3JtYXQgYW5kIGNvbnZlcnRzIGl0IHNvIHRoYXRcclxuICogMCBpcyBOb3J0aCwgOTAgaXMgV2VzdCwgMTgwIGlzIFNvdXRoIGFuZCAyNzAgaXMgRWFzdCxcclxuICogdGhlcmVmb3JlIHJ1bm5pbmcgY291bnRlci1jbG9ja3dpc2UgaW5zdGVhZCBvZiBjbG9ja3dpc2UuXHJcbiAqIFxyXG4gKiBZb3UgY2FuIHBhc3MgaW4gdGhlIGFuZ2xlIGZyb20gYSBHYW1lIE9iamVjdCB1c2luZzpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIGNvbnZlcnRlZCA9IENvdW50ZXJDbG9ja3dpc2UoZ2FtZW9iamVjdC5yb3RhdGlvbik7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogQWxsIHZhbHVlcyBmb3IgdGhpcyBmdW5jdGlvbiBhcmUgaW4gcmFkaWFucy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkFuZ2xlLkNvdW50ZXJDbG9ja3dpc2VcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgdG8gY29udmVydCwgaW4gcmFkaWFucy5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29udmVydGVkIGFuZ2xlLCBpbiByYWRpYW5zLlxyXG4gKi9cclxudmFyIENvdW50ZXJDbG9ja3dpc2UgPSBmdW5jdGlvbiAoYW5nbGUpXHJcbntcclxuICAgIGlmIChhbmdsZSA+IE1hdGguUEkpXHJcbiAgICB7XHJcbiAgICAgICAgYW5nbGUgLT0gQ09OU1QuUEkyO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBNYXRoLmFicygoKChhbmdsZSArIENPTlNULlRBVSkgJSBDT05TVC5QSTIpIC0gQ09OU1QuUEkyKSAlIENPTlNULlBJMik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvdW50ZXJDbG9ja3dpc2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhbiBhbmdsZSB0byB0aGUgWzAsIDJwaV0gcmFuZ2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5BbmdsZS5Ob3JtYWxpemVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byBub3JtYWxpemUsIGluIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG5vcm1hbGl6ZWQgYW5nbGUsIGluIHJhZGlhbnMuXHJcbiAqL1xyXG52YXIgTm9ybWFsaXplID0gZnVuY3Rpb24gKGFuZ2xlKVxyXG57XHJcbiAgICBhbmdsZSA9IGFuZ2xlICUgKDIgKiBNYXRoLlBJKTtcclxuXHJcbiAgICBpZiAoYW5nbGUgPj0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gYW5nbGU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGFuZ2xlICsgMiAqIE1hdGguUEk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE5vcm1hbGl6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgQHNhbW1lXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmxvYXRCZXR3ZWVuID0gcmVxdWlyZSgnLi4vRmxvYXRCZXR3ZWVuJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBhbmdsZSBpbiB0aGUgcmFuZ2UgWy1waSwgcGldLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQW5nbGUuUmFuZG9tXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUsIGluIHJhZGlhbnMuXHJcbiAqL1xyXG52YXIgUmFuZG9tID0gZnVuY3Rpb24gKClcclxue1xyXG4gICAgcmV0dXJuIEZsb2F0QmV0d2VlbigtTWF0aC5QSSwgTWF0aC5QSSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmRvbTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgQHNhbW1lXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRmxvYXRCZXR3ZWVuID0gcmVxdWlyZSgnLi4vRmxvYXRCZXR3ZWVuJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBhbmdsZSBpbiB0aGUgcmFuZ2UgWy0xODAsIDE4MF0uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5BbmdsZS5SYW5kb21EZWdyZWVzXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUsIGluIGRlZ3JlZXMuXHJcbiAqL1xyXG52YXIgUmFuZG9tRGVncmVlcyA9IGZ1bmN0aW9uICgpXHJcbntcclxuICAgIHJldHVybiBGbG9hdEJldHdlZW4oLTE4MCwgMTgwKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tRGVncmVlcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTm9ybWFsaXplID0gcmVxdWlyZSgnLi9Ob3JtYWxpemUnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXZlcnNlIHRoZSBnaXZlbiBhbmdsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkFuZ2xlLlJldmVyc2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byByZXZlcnNlLCBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXZlcnNlZCBhbmdsZSwgaW4gcmFkaWFucy5cclxuICovXHJcbnZhciBSZXZlcnNlID0gZnVuY3Rpb24gKGFuZ2xlKVxyXG57XHJcbiAgICByZXR1cm4gTm9ybWFsaXplKGFuZ2xlICsgTWF0aC5QSSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJldmVyc2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgYGN1cnJlbnRBbmdsZWAgdG93YXJkcyBgdGFyZ2V0QW5nbGVgLCB0YWtpbmcgdGhlIHNob3J0ZXN0IHJvdGF0aW9uIGRpc3RhbmNlLiBUaGUgYGxlcnBgIGFyZ3VtZW50IGlzIHRoZSBhbW91bnQgdG8gcm90YXRlIGJ5IGluIHRoaXMgY2FsbC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkFuZ2xlLlJvdGF0ZVRvXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEFuZ2xlIC0gVGhlIGN1cnJlbnQgYW5nbGUsIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXRBbmdsZSAtIFRoZSB0YXJnZXQgYW5nbGUgdG8gcm90YXRlIHRvLCBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlcnA9MC4wNV0gLSBUaGUgbGVycCB2YWx1ZSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgYW5nbGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFkanVzdGVkIGFuZ2xlLlxyXG4gKi9cclxudmFyIFJvdGF0ZVRvID0gZnVuY3Rpb24gKGN1cnJlbnRBbmdsZSwgdGFyZ2V0QW5nbGUsIGxlcnApXHJcbntcclxuICAgIGlmIChsZXJwID09PSB1bmRlZmluZWQpIHsgbGVycCA9IDAuMDU7IH1cclxuXHJcbiAgICBpZiAoY3VycmVudEFuZ2xlID09PSB0YXJnZXRBbmdsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudEFuZ2xlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChNYXRoLmFicyh0YXJnZXRBbmdsZSAtIGN1cnJlbnRBbmdsZSkgPD0gbGVycCB8fCBNYXRoLmFicyh0YXJnZXRBbmdsZSAtIGN1cnJlbnRBbmdsZSkgPj0gKE1BVEhfQ09OU1QuUEkyIC0gbGVycCkpXHJcbiAgICB7XHJcbiAgICAgICAgY3VycmVudEFuZ2xlID0gdGFyZ2V0QW5nbGU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHRhcmdldEFuZ2xlIC0gY3VycmVudEFuZ2xlKSA+IE1hdGguUEkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0QW5nbGUgPCBjdXJyZW50QW5nbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldEFuZ2xlICs9IE1BVEhfQ09OU1QuUEkyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0QW5nbGUgLT0gTUFUSF9DT05TVC5QSTI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRBbmdsZSA+IGN1cnJlbnRBbmdsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRBbmdsZSArPSBsZXJwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0YXJnZXRBbmdsZSA8IGN1cnJlbnRBbmdsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRBbmdsZSAtPSBsZXJwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudEFuZ2xlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVUbztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgc2hvcnRlc3QgYW5nbGUgYmV0d2VlbiBgYW5nbGUxYCBhbmQgYGFuZ2xlMmAuXHJcbiAqXHJcbiAqIEJvdGggYW5nbGVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIC0xODAgdG8gMTgwLCB3aGljaCBpcyB0aGUgc2FtZSBjbGFtcGVkXHJcbiAqIHJhbmdlIHRoYXQgYHNwcml0ZS5hbmdsZWAgdXNlcywgc28geW91IGNhbiBwYXNzIGluIHR3byBzcHJpdGUgYW5nbGVzIHRvXHJcbiAqIHRoaXMgbWV0aG9kIGFuZCBnZXQgdGhlIHNob3J0ZXN0IGFuZ2xlIGJhY2sgYmV0d2VlbiB0aGUgdHdvIG9mIHRoZW0uXHJcbiAqXHJcbiAqIFRoZSBhbmdsZSByZXR1cm5lZCB3aWxsIGJlIGluIHRoZSBzYW1lIHJhbmdlLiBJZiB0aGUgcmV0dXJuZWQgYW5nbGUgaXNcclxuICogZ3JlYXRlciB0aGFuIDAgdGhlbiBpdCdzIGEgY291bnRlci1jbG9ja3dpc2Ugcm90YXRpb24sIGlmIDwgMCB0aGVuIGl0J3NcclxuICogYSBjbG9ja3dpc2Ugcm90YXRpb24uXHJcbiAqXHJcbiAqIFRPRE86IFdyYXAgdGhlIGFuZ2xlcyBpbiB0aGlzIGZ1bmN0aW9uP1xyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQW5nbGUuU2hvcnRlc3RCZXR3ZWVuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYW5nbGUxIC0gVGhlIGZpcnN0IGFuZ2xlIGluIHRoZSByYW5nZSAtMTgwIHRvIDE4MC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlMiAtIFRoZSBzZWNvbmQgYW5nbGUgaW4gdGhlIHJhbmdlIC0xODAgdG8gMTgwLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaG9ydGVzdCBhbmdsZSwgaW4gZGVncmVlcy4gSWYgZ3JlYXRlciB0aGFuIHplcm8gaXQncyBhIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uLlxyXG4gKi9cclxudmFyIFNob3J0ZXN0QmV0d2VlbiA9IGZ1bmN0aW9uIChhbmdsZTEsIGFuZ2xlMilcclxue1xyXG4gICAgdmFyIGRpZmZlcmVuY2UgPSBhbmdsZTIgLSBhbmdsZTE7XHJcblxyXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHRpbWVzID0gTWF0aC5mbG9vcigoZGlmZmVyZW5jZSAtICgtMTgwKSkgLyAzNjApO1xyXG5cclxuICAgIHJldHVybiBkaWZmZXJlbmNlIC0gKHRpbWVzICogMzYwKTtcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNob3J0ZXN0QmV0d2VlbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTWF0aFdyYXAgPSByZXF1aXJlKCcuLi9XcmFwJyk7XHJcblxyXG4vKipcclxuICogV3JhcCBhbiBhbmdsZS5cclxuICpcclxuICogV3JhcHMgdGhlIGFuZ2xlIHRvIGEgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIC1QSSB0byBQSS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkFuZ2xlLldyYXBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byB3cmFwLCBpbiByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3cmFwcGVkIGFuZ2xlLCBpbiByYWRpYW5zLlxyXG4gKi9cclxudmFyIFdyYXAgPSBmdW5jdGlvbiAoYW5nbGUpXHJcbntcclxuICAgIHJldHVybiBNYXRoV3JhcChhbmdsZSwgLU1hdGguUEksIE1hdGguUEkpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXcmFwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBXcmFwID0gcmVxdWlyZSgnLi4vV3JhcCcpO1xyXG5cclxuLyoqXHJcbiAqIFdyYXAgYW4gYW5nbGUgaW4gZGVncmVlcy5cclxuICpcclxuICogV3JhcHMgdGhlIGFuZ2xlIHRvIGEgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIC0xODAgdG8gMTgwLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguQW5nbGUuV3JhcERlZ3JlZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byB3cmFwLCBpbiBkZWdyZWVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3cmFwcGVkIGFuZ2xlLCBpbiBkZWdyZWVzLlxyXG4gKi9cclxudmFyIFdyYXBEZWdyZWVzID0gZnVuY3Rpb24gKGFuZ2xlKVxyXG57XHJcbiAgICByZXR1cm4gV3JhcChhbmdsZSwgLTE4MCwgMTgwKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV3JhcERlZ3JlZXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguQW5nbGVcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBCZXR3ZWVuOiByZXF1aXJlKCcuL0JldHdlZW4nKSxcclxuICAgIEJldHdlZW5Qb2ludHM6IHJlcXVpcmUoJy4vQmV0d2VlblBvaW50cycpLFxyXG4gICAgQmV0d2VlblBvaW50c1k6IHJlcXVpcmUoJy4vQmV0d2VlblBvaW50c1knKSxcclxuICAgIEJldHdlZW5ZOiByZXF1aXJlKCcuL0JldHdlZW5ZJyksXHJcbiAgICBDb3VudGVyQ2xvY2t3aXNlOiByZXF1aXJlKCcuL0NvdW50ZXJDbG9ja3dpc2UnKSxcclxuICAgIE5vcm1hbGl6ZTogcmVxdWlyZSgnLi9Ob3JtYWxpemUnKSxcclxuICAgIFJhbmRvbTogcmVxdWlyZSgnLi9SYW5kb20nKSxcclxuICAgIFJhbmRvbURlZ3JlZXM6IHJlcXVpcmUoJy4vUmFuZG9tRGVncmVlcycpLFxyXG4gICAgUmV2ZXJzZTogcmVxdWlyZSgnLi9SZXZlcnNlJyksXHJcbiAgICBSb3RhdGVUbzogcmVxdWlyZSgnLi9Sb3RhdGVUbycpLFxyXG4gICAgU2hvcnRlc3RCZXR3ZWVuOiByZXF1aXJlKCcuL1Nob3J0ZXN0QmV0d2VlbicpLFxyXG4gICAgV3JhcDogcmVxdWlyZSgnLi9XcmFwJyksXHJcbiAgICBXcmFwRGVncmVlczogcmVxdWlyZSgnLi9XcmFwRGVncmVlcycpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBNQVRIX0NPTlNUID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHZhbHVlIG9mIFBJICogMi5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLk1hdGguUEkyXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBJMjogTWF0aC5QSSAqIDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdmFsdWUgb2YgUEkgKiAwLjUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlRBVVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBUQVU6IE1hdGguUEkgKiAwLjUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBlcHNpbG9uIHZhbHVlICgxLjBlLTYpXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLkVQU0lMT05cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRVBTSUxPTjogMS4wZS02LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGNvbnZlcnRpbmcgZGVncmVlcyB0byByYWRpYW5zIChQSSAvIDE4MClcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLk1hdGguREVHX1RPX1JBRFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBERUdfVE9fUkFEOiBNYXRoLlBJIC8gMTgwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGNvbnZlcnRpbmcgcmFkaWFucyB0byBkZWdyZWVzICgxODAgLyBQSSlcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLk1hdGguUkFEX1RPX0RFR1xyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBSQURfVE9fREVHOiAxODAgLyBNYXRoLlBJLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yLlxyXG4gICAgICogVGhpcyBpcyBub3Qgc2V0IHVudGlsIHRoZSBHYW1lIGJvb3RzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5STkRcclxuICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFJORDogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHNhZmUgaW50ZWdlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMuXHJcbiAgICAgKiBXZSB1c2UgYSBjb25zdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEludGVybmV0IEV4cGxvcmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5NSU5fU0FGRV9JTlRFR0VSXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICovXHJcbiAgICBNSU5fU0FGRV9JTlRFR0VSOiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMuXHJcbiAgICAgKiBXZSB1c2UgYSBjb25zdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEludGVybmV0IEV4cGxvcmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICovXHJcbiAgICBNQVhfU0FGRV9JTlRFR0VSOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxXHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNQVRIX0NPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNldHMgb2YgY29vcmRpbmF0ZXMgKHBvaW50cykuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EaXN0YW5jZS5CZXR3ZWVuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcG9pbnQuXHJcbiAqL1xyXG52YXIgRGlzdGFuY2VCZXR3ZWVuID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKVxyXG57XHJcbiAgICB2YXIgZHggPSB4MSAtIHgyO1xyXG4gICAgdmFyIGR5ID0geTEgLSB5MjtcclxuXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGlzdGFuY2VCZXR3ZWVuO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBzYW1tZVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRGlzdGFuY2UuQmV0d2VlblBvaW50c1xyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IGEgLSBUaGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IGIgLSBUaGUgc2Vjb25kIHBvaW50LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHMuXHJcbiAqL1xyXG52YXIgRGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24gKGEsIGIpXHJcbntcclxuICAgIHZhciBkeCA9IGEueCAtIGIueDtcclxuICAgIHZhciBkeSA9IGEueSAtIGIueTtcclxuXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGlzdGFuY2VCZXR3ZWVuUG9pbnRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBzYW1tZVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EaXN0YW5jZS5CZXR3ZWVuUG9pbnRzU3F1YXJlZFxyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IGEgLSBUaGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLk1hdGguVmVjdG9yMkxpa2V9IGIgLSBUaGUgc2Vjb25kIHBvaW50LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50cy5cclxuICovXHJcbnZhciBEaXN0YW5jZUJldHdlZW5Qb2ludHNTcXVhcmVkID0gZnVuY3Rpb24gKGEsIGIpXHJcbntcclxuICAgIHZhciBkeCA9IGEueCAtIGIueDtcclxuICAgIHZhciBkeSA9IGEueSAtIGIueTtcclxuXHJcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERpc3RhbmNlQmV0d2VlblBvaW50c1NxdWFyZWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIHNhbW1lXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBDaGVieXNoZXYgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2V0cyBvZiBjb29yZGluYXRlcyAocG9pbnRzKS5cclxuICpcclxuICogQ2hlYnlzaGV2IGRpc3RhbmNlIChvciBjaGVzc2JvYXJkIGRpc3RhbmNlKSBpcyB0aGUgbWF4aW11bSBvZiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGlzdGFuY2VzLlxyXG4gKiBJdCdzIHRoZSBlZmZlY3RpdmUgZGlzdGFuY2Ugd2hlbiBtb3ZlbWVudCBjYW4gYmUgaG9yaXpvbnRhbCwgdmVydGljYWwsIG9yIGRpYWdvbmFsLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRGlzdGFuY2UuQ2hlYnlzaGV2XHJcbiAqIEBzaW5jZSAzLjIyLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBvaW50LlxyXG4gKi9cclxudmFyIENoZWJ5c2hldkRpc3RhbmNlID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKVxyXG57XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoeDEgLSB4MiksIE1hdGguYWJzKHkxIC0geTIpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2hlYnlzaGV2RGlzdGFuY2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2V0cyBvZiBjb29yZGluYXRlcyAocG9pbnRzKSB0byB0aGUgcG93ZXIgb2YgYHBvd2AuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EaXN0YW5jZS5Qb3dlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHBvdyAtIFRoZSBleHBvbmVudC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBvaW50LlxyXG4gKi9cclxudmFyIERpc3RhbmNlUG93ZXIgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHBvdylcclxue1xyXG4gICAgaWYgKHBvdyA9PT0gdW5kZWZpbmVkKSB7IHBvdyA9IDI7IH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIHBvdykgKyBNYXRoLnBvdyh5MiAtIHkxLCBwb3cpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRGlzdGFuY2VQb3dlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgc2FtbWVcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIHNuYWtlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNldHMgb2YgY29vcmRpbmF0ZXMgKHBvaW50cykuXHJcbiAqXHJcbiAqIFNuYWtlIGRpc3RhbmNlIChyZWN0aWxpbmVhciBkaXN0YW5jZSwgTWFuaGF0dGFuIGRpc3RhbmNlKSBpcyB0aGUgc3VtIG9mIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaXN0YW5jZXMuXHJcbiAqIEl0J3MgdGhlIGVmZmVjdGl2ZSBkaXN0YW5jZSB3aGVuIG1vdmVtZW50IGlzIGFsbG93ZWQgb25seSBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSAoYnV0IG5vdCBib3RoKS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkRpc3RhbmNlLlNuYWtlXHJcbiAqIEBzaW5jZSAzLjIyLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHgxIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBvaW50LlxyXG4gKi9cclxudmFyIFNuYWtlRGlzdGFuY2UgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpXHJcbntcclxuICAgIHJldHVybiBNYXRoLmFicyh4MSAtIHgyKSArIE1hdGguYWJzKHkxIC0geTIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbmFrZURpc3RhbmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNldHMgb2YgY29vcmRpbmF0ZXMgKHBvaW50cyksIHNxdWFyZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5EaXN0YW5jZS5TcXVhcmVkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcG9pbnQsIHNxdWFyZWQuXHJcbiAqL1xyXG52YXIgRGlzdGFuY2VTcXVhcmVkID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKVxyXG57XHJcbiAgICB2YXIgZHggPSB4MSAtIHgyO1xyXG4gICAgdmFyIGR5ID0geTEgLSB5MjtcclxuXHJcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERpc3RhbmNlU3F1YXJlZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTWF0aC5EaXN0YW5jZVxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEJldHdlZW46IHJlcXVpcmUoJy4vRGlzdGFuY2VCZXR3ZWVuJyksXHJcbiAgICBCZXR3ZWVuUG9pbnRzOiByZXF1aXJlKCcuL0Rpc3RhbmNlQmV0d2VlblBvaW50cycpLFxyXG4gICAgQmV0d2VlblBvaW50c1NxdWFyZWQ6IHJlcXVpcmUoJy4vRGlzdGFuY2VCZXR3ZWVuUG9pbnRzU3F1YXJlZCcpLFxyXG4gICAgQ2hlYnlzaGV2OiByZXF1aXJlKCcuL0Rpc3RhbmNlQ2hlYnlzaGV2JyksXHJcbiAgICBQb3dlcjogcmVxdWlyZSgnLi9EaXN0YW5jZVBvd2VyJyksXHJcbiAgICBTbmFrZTogcmVxdWlyZSgnLi9EaXN0YW5jZVNuYWtlJyksXHJcbiAgICBTcXVhcmVkOiByZXF1aXJlKCcuL0Rpc3RhbmNlU3F1YXJlZCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCYWNrID0gcmVxdWlyZSgnLi9iYWNrJyk7XHJcbnZhciBCb3VuY2UgPSByZXF1aXJlKCcuL2JvdW5jZScpO1xyXG52YXIgQ2lyY3VsYXIgPSByZXF1aXJlKCcuL2NpcmN1bGFyJyk7XHJcbnZhciBDdWJpYyA9IHJlcXVpcmUoJy4vY3ViaWMnKTtcclxudmFyIEVsYXN0aWMgPSByZXF1aXJlKCcuL2VsYXN0aWMnKTtcclxudmFyIEV4cG8gPSByZXF1aXJlKCcuL2V4cG8nKTtcclxudmFyIExpbmVhciA9IHJlcXVpcmUoJy4vbGluZWFyJyk7XHJcbnZhciBRdWFkcmF0aWMgPSByZXF1aXJlKCcuL3F1YWRyYXRpYycpO1xyXG52YXIgUXVhcnRpYyA9IHJlcXVpcmUoJy4vcXVhcnRpYycpO1xyXG52YXIgUXVpbnRpYyA9IHJlcXVpcmUoJy4vcXVpbnRpYycpO1xyXG52YXIgU2luZSA9IHJlcXVpcmUoJy4vc2luZScpO1xyXG52YXIgU3RlcHBlZCA9IHJlcXVpcmUoJy4vc3RlcHBlZCcpO1xyXG5cclxuLy8gIEVhc2VNYXBcclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgUG93ZXIwOiBMaW5lYXIsXHJcbiAgICBQb3dlcjE6IFF1YWRyYXRpYy5PdXQsXHJcbiAgICBQb3dlcjI6IEN1YmljLk91dCxcclxuICAgIFBvd2VyMzogUXVhcnRpYy5PdXQsXHJcbiAgICBQb3dlcjQ6IFF1aW50aWMuT3V0LFxyXG5cclxuICAgIExpbmVhcjogTGluZWFyLFxyXG4gICAgUXVhZDogUXVhZHJhdGljLk91dCxcclxuICAgIEN1YmljOiBDdWJpYy5PdXQsXHJcbiAgICBRdWFydDogUXVhcnRpYy5PdXQsXHJcbiAgICBRdWludDogUXVpbnRpYy5PdXQsXHJcbiAgICBTaW5lOiBTaW5lLk91dCxcclxuICAgIEV4cG86IEV4cG8uT3V0LFxyXG4gICAgQ2lyYzogQ2lyY3VsYXIuT3V0LFxyXG4gICAgRWxhc3RpYzogRWxhc3RpYy5PdXQsXHJcbiAgICBCYWNrOiBCYWNrLk91dCxcclxuICAgIEJvdW5jZTogQm91bmNlLk91dCxcclxuICAgIFN0ZXBwZWQ6IFN0ZXBwZWQsXHJcblxyXG4gICAgJ1F1YWQuZWFzZUluJzogUXVhZHJhdGljLkluLFxyXG4gICAgJ0N1YmljLmVhc2VJbic6IEN1YmljLkluLFxyXG4gICAgJ1F1YXJ0LmVhc2VJbic6IFF1YXJ0aWMuSW4sXHJcbiAgICAnUXVpbnQuZWFzZUluJzogUXVpbnRpYy5JbixcclxuICAgICdTaW5lLmVhc2VJbic6IFNpbmUuSW4sXHJcbiAgICAnRXhwby5lYXNlSW4nOiBFeHBvLkluLFxyXG4gICAgJ0NpcmMuZWFzZUluJzogQ2lyY3VsYXIuSW4sXHJcbiAgICAnRWxhc3RpYy5lYXNlSW4nOiBFbGFzdGljLkluLFxyXG4gICAgJ0JhY2suZWFzZUluJzogQmFjay5JbixcclxuICAgICdCb3VuY2UuZWFzZUluJzogQm91bmNlLkluLFxyXG5cclxuICAgICdRdWFkLmVhc2VPdXQnOiBRdWFkcmF0aWMuT3V0LFxyXG4gICAgJ0N1YmljLmVhc2VPdXQnOiBDdWJpYy5PdXQsXHJcbiAgICAnUXVhcnQuZWFzZU91dCc6IFF1YXJ0aWMuT3V0LFxyXG4gICAgJ1F1aW50LmVhc2VPdXQnOiBRdWludGljLk91dCxcclxuICAgICdTaW5lLmVhc2VPdXQnOiBTaW5lLk91dCxcclxuICAgICdFeHBvLmVhc2VPdXQnOiBFeHBvLk91dCxcclxuICAgICdDaXJjLmVhc2VPdXQnOiBDaXJjdWxhci5PdXQsXHJcbiAgICAnRWxhc3RpYy5lYXNlT3V0JzogRWxhc3RpYy5PdXQsXHJcbiAgICAnQmFjay5lYXNlT3V0JzogQmFjay5PdXQsXHJcbiAgICAnQm91bmNlLmVhc2VPdXQnOiBCb3VuY2UuT3V0LFxyXG5cclxuICAgICdRdWFkLmVhc2VJbk91dCc6IFF1YWRyYXRpYy5Jbk91dCxcclxuICAgICdDdWJpYy5lYXNlSW5PdXQnOiBDdWJpYy5Jbk91dCxcclxuICAgICdRdWFydC5lYXNlSW5PdXQnOiBRdWFydGljLkluT3V0LFxyXG4gICAgJ1F1aW50LmVhc2VJbk91dCc6IFF1aW50aWMuSW5PdXQsXHJcbiAgICAnU2luZS5lYXNlSW5PdXQnOiBTaW5lLkluT3V0LFxyXG4gICAgJ0V4cG8uZWFzZUluT3V0JzogRXhwby5Jbk91dCxcclxuICAgICdDaXJjLmVhc2VJbk91dCc6IENpcmN1bGFyLkluT3V0LFxyXG4gICAgJ0VsYXN0aWMuZWFzZUluT3V0JzogRWxhc3RpYy5Jbk91dCxcclxuICAgICdCYWNrLmVhc2VJbk91dCc6IEJhY2suSW5PdXQsXHJcbiAgICAnQm91bmNlLmVhc2VJbk91dCc6IEJvdW5jZS5Jbk91dFxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQmFjayBlYXNlLWluLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLkJhY2suSW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3ZlcnNob290PTEuNzAxNThdIC0gVGhlIG92ZXJzaG9vdCBhbW91bnQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW4gPSBmdW5jdGlvbiAodiwgb3ZlcnNob290KVxyXG57XHJcbiAgICBpZiAob3ZlcnNob290ID09PSB1bmRlZmluZWQpIHsgb3ZlcnNob290ID0gMS43MDE1ODsgfVxyXG5cclxuICAgIHJldHVybiB2ICogdiAqICgob3ZlcnNob290ICsgMSkgKiB2IC0gb3ZlcnNob290KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEJhY2sgZWFzZS1pbi9vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuQmFjay5Jbk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvdmVyc2hvb3Q9MS43MDE1OF0gLSBUaGUgb3ZlcnNob290IGFtb3VudC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbk91dCA9IGZ1bmN0aW9uICh2LCBvdmVyc2hvb3QpXHJcbntcclxuICAgIGlmIChvdmVyc2hvb3QgPT09IHVuZGVmaW5lZCkgeyBvdmVyc2hvb3QgPSAxLjcwMTU4OyB9XHJcblxyXG4gICAgdmFyIHMgPSBvdmVyc2hvb3QgKiAxLjUyNTtcclxuXHJcbiAgICBpZiAoKHYgKj0gMikgPCAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiAodiAqIHYgKiAoKHMgKyAxKSAqIHYgLSBzKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDAuNSAqICgodiAtPSAyKSAqIHYgKiAoKHMgKyAxKSAqIHYgKyBzKSArIDIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbk91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQmFjayBlYXNlLW91dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5CYWNrLk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvdmVyc2hvb3Q9MS43MDE1OF0gLSBUaGUgb3ZlcnNob290IGFtb3VudC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBPdXQgPSBmdW5jdGlvbiAodiwgb3ZlcnNob290KVxyXG57XHJcbiAgICBpZiAob3ZlcnNob290ID09PSB1bmRlZmluZWQpIHsgb3ZlcnNob290ID0gMS43MDE1ODsgfVxyXG5cclxuICAgIHJldHVybiAtLXYgKiB2ICogKChvdmVyc2hvb3QgKyAxKSAqIHYgKyBvdmVyc2hvb3QpICsgMTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5NYXRoLkVhc2luZy5CYWNrXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgSW46IHJlcXVpcmUoJy4vSW4nKSxcclxuICAgIE91dDogcmVxdWlyZSgnLi9PdXQnKSxcclxuICAgIEluT3V0OiByZXF1aXJlKCcuL0luT3V0JylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEJvdW5jZSBlYXNlLWluLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLkJvdW5jZS5JblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICB2ID0gMSAtIHY7XHJcblxyXG4gICAgaWYgKHYgPCAxIC8gMi43NSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMSAtICg3LjU2MjUgKiB2ICogdik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2IDwgMiAvIDIuNzUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDEgLSAoNy41NjI1ICogKHYgLT0gMS41IC8gMi43NSkgKiB2ICsgMC43NSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2IDwgMi41IC8gMi43NSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMSAtICg3LjU2MjUgKiAodiAtPSAyLjI1IC8gMi43NSkgKiB2ICsgMC45Mzc1KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMSAtICg3LjU2MjUgKiAodiAtPSAyLjYyNSAvIDIuNzUpICogdiArIDAuOTg0Mzc1KTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEJvdW5jZSBlYXNlLWluL291dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5Cb3VuY2UuSW5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW5PdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgdmFyIHJldmVyc2UgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodiA8IDAuNSlcclxuICAgIHtcclxuICAgICAgICB2ID0gMSAtICh2ICogMik7XHJcbiAgICAgICAgcmV2ZXJzZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdiA9ICh2ICogMikgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2IDwgMSAvIDIuNzUpXHJcbiAgICB7XHJcbiAgICAgICAgdiA9IDcuNTYyNSAqIHYgKiB2O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodiA8IDIgLyAyLjc1KVxyXG4gICAge1xyXG4gICAgICAgIHYgPSA3LjU2MjUgKiAodiAtPSAxLjUgLyAyLjc1KSAqIHYgKyAwLjc1O1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodiA8IDIuNSAvIDIuNzUpXHJcbiAgICB7XHJcbiAgICAgICAgdiA9IDcuNTYyNSAqICh2IC09IDIuMjUgLyAyLjc1KSAqIHYgKyAwLjkzNzU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdiA9IDcuNTYyNSAqICh2IC09IDIuNjI1IC8gMi43NSkgKiB2ICsgMC45ODQzNzU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJldmVyc2UpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICgxIC0gdikgKiAwLjU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHYgKiAwLjUgKyAwLjU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBCb3VuY2UgZWFzZS1vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuQm91bmNlLk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBPdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgaWYgKHYgPCAxIC8gMi43NSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gNy41NjI1ICogdiAqIHY7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2IDwgMiAvIDIuNzUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDcuNTYyNSAqICh2IC09IDEuNSAvIDIuNzUpICogdiArIDAuNzU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2IDwgMi41IC8gMi43NSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gNy41NjI1ICogKHYgLT0gMi4yNSAvIDIuNzUpICogdiArIDAuOTM3NTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gNy41NjI1ICogKHYgLT0gMi42MjUgLyAyLjc1KSAqIHYgKyAwLjk4NDM3NTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5NYXRoLkVhc2luZy5Cb3VuY2VcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBJbjogcmVxdWlyZSgnLi9JbicpLFxyXG4gICAgT3V0OiByZXF1aXJlKCcuL091dCcpLFxyXG4gICAgSW5PdXQ6IHJlcXVpcmUoJy4vSW5PdXQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2lyY3VsYXIgZWFzZS1pbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5DaXJjdWxhci5JblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdiAqIHYpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2lyY3VsYXIgZWFzZS1pbi9vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuQ2lyY3VsYXIuSW5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW5PdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgaWYgKCh2ICo9IDIpIDwgMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHYgKiB2KSAtIDEpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiAoTWF0aC5zcXJ0KDEgLSAodiAtPSAyKSAqIHYpICsgMSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaXJjdWxhciBlYXNlLW91dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5DaXJjdWxhci5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgT3V0ID0gZnVuY3Rpb24gKHYpXHJcbntcclxuICAgIHJldHVybiBNYXRoLnNxcnQoMSAtICgtLXYgKiB2KSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTWF0aC5FYXNpbmcuQ2lyY3VsYXJcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBJbjogcmVxdWlyZSgnLi9JbicpLFxyXG4gICAgT3V0OiByZXF1aXJlKCcuL091dCcpLFxyXG4gICAgSW5PdXQ6IHJlcXVpcmUoJy4vSW5PdXQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ3ViaWMgZWFzZS1pbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5DdWJpYy5JblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gdiAqIHYgKiB2O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ3ViaWMgZWFzZS1pbi9vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuQ3ViaWMuSW5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW5PdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgaWYgKCh2ICo9IDIpIDwgMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMC41ICogdiAqIHYgKiB2O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiAoKHYgLT0gMikgKiB2ICogdiArIDIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbk91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ3ViaWMgZWFzZS1vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuQ3ViaWMuT3V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIE91dCA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gLS12ICogdiAqIHYgKyAxO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPdXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRWFzaW5nLkN1YmljXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgSW46IHJlcXVpcmUoJy4vSW4nKSxcclxuICAgIE91dDogcmVxdWlyZSgnLi9PdXQnKSxcclxuICAgIEluT3V0OiByZXF1aXJlKCcuL0luT3V0JylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEVsYXN0aWMgZWFzZS1pbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5FbGFzdGljLkluXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2FtcGxpdHVkZT0wLjFdIC0gVGhlIGFtcGxpdHVkZSBvZiB0aGUgZWxhc3RpYyBlYXNlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3BlcmlvZD0wLjFdIC0gU2V0cyBob3cgdGlnaHQgdGhlIHNpbmUtd2F2ZSBpcywgd2hlcmUgc21hbGxlciB2YWx1ZXMgYXJlIHRpZ2h0ZXIgd2F2ZXMsIHdoaWNoIHJlc3VsdCBpbiBtb3JlIGN5Y2xlcy5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2LCBhbXBsaXR1ZGUsIHBlcmlvZClcclxue1xyXG4gICAgaWYgKGFtcGxpdHVkZSA9PT0gdW5kZWZpbmVkKSB7IGFtcGxpdHVkZSA9IDAuMTsgfVxyXG4gICAgaWYgKHBlcmlvZCA9PT0gdW5kZWZpbmVkKSB7IHBlcmlvZCA9IDAuMTsgfVxyXG5cclxuICAgIGlmICh2ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB2YXIgcyA9IHBlcmlvZCAvIDQ7XHJcblxyXG4gICAgICAgIGlmIChhbXBsaXR1ZGUgPCAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW1wbGl0dWRlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcyA9IHBlcmlvZCAqIE1hdGguYXNpbigxIC8gYW1wbGl0dWRlKSAvICgyICogTWF0aC5QSSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gLShhbXBsaXR1ZGUgKiBNYXRoLnBvdygyLCAxMCAqICh2IC09IDEpKSAqIE1hdGguc2luKCh2IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcGVyaW9kKSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBFbGFzdGljIGVhc2UtaW4vb3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLkVsYXN0aWMuSW5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYW1wbGl0dWRlPTAuMV0gLSBUaGUgYW1wbGl0dWRlIG9mIHRoZSBlbGFzdGljIGVhc2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGVyaW9kPTAuMV0gLSBTZXRzIGhvdyB0aWdodCB0aGUgc2luZS13YXZlIGlzLCB3aGVyZSBzbWFsbGVyIHZhbHVlcyBhcmUgdGlnaHRlciB3YXZlcywgd2hpY2ggcmVzdWx0IGluIG1vcmUgY3ljbGVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIEluT3V0ID0gZnVuY3Rpb24gKHYsIGFtcGxpdHVkZSwgcGVyaW9kKVxyXG57XHJcbiAgICBpZiAoYW1wbGl0dWRlID09PSB1bmRlZmluZWQpIHsgYW1wbGl0dWRlID0gMC4xOyB9XHJcbiAgICBpZiAocGVyaW9kID09PSB1bmRlZmluZWQpIHsgcGVyaW9kID0gMC4xOyB9XHJcblxyXG4gICAgaWYgKHYgPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2ID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzID0gcGVyaW9kIC8gNDtcclxuXHJcbiAgICAgICAgaWYgKGFtcGxpdHVkZSA8IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbXBsaXR1ZGUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzID0gcGVyaW9kICogTWF0aC5hc2luKDEgLyBhbXBsaXR1ZGUpIC8gKDIgKiBNYXRoLlBJKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgodiAqPSAyKSA8IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqIChhbXBsaXR1ZGUgKiBNYXRoLnBvdygyLCAxMCAqICh2IC09IDEpKSAqIE1hdGguc2luKCh2IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcGVyaW9kKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbXBsaXR1ZGUgKiBNYXRoLnBvdygyLCAtMTAgKiAodiAtPSAxKSkgKiBNYXRoLnNpbigodiAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHBlcmlvZCkgKiAwLjUgKyAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW5PdXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEVsYXN0aWMgZWFzZS1vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuRWxhc3RpYy5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbYW1wbGl0dWRlPTAuMV0gLSBUaGUgYW1wbGl0dWRlIG9mIHRoZSBlbGFzdGljIGVhc2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGVyaW9kPTAuMV0gLSBTZXRzIGhvdyB0aWdodCB0aGUgc2luZS13YXZlIGlzLCB3aGVyZSBzbWFsbGVyIHZhbHVlcyBhcmUgdGlnaHRlciB3YXZlcywgd2hpY2ggcmVzdWx0IGluIG1vcmUgY3ljbGVzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIE91dCA9IGZ1bmN0aW9uICh2LCBhbXBsaXR1ZGUsIHBlcmlvZClcclxue1xyXG4gICAgaWYgKGFtcGxpdHVkZSA9PT0gdW5kZWZpbmVkKSB7IGFtcGxpdHVkZSA9IDAuMTsgfVxyXG4gICAgaWYgKHBlcmlvZCA9PT0gdW5kZWZpbmVkKSB7IHBlcmlvZCA9IDAuMTsgfVxyXG5cclxuICAgIGlmICh2ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB2YXIgcyA9IHBlcmlvZCAvIDQ7XHJcblxyXG4gICAgICAgIGlmIChhbXBsaXR1ZGUgPCAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW1wbGl0dWRlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcyA9IHBlcmlvZCAqIE1hdGguYXNpbigxIC8gYW1wbGl0dWRlKSAvICgyICogTWF0aC5QSSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGFtcGxpdHVkZSAqIE1hdGgucG93KDIsIC0xMCAqIHYpICogTWF0aC5zaW4oKHYgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwZXJpb2QpICsgMSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTWF0aC5FYXNpbmcuRWxhc3RpY1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEluOiByZXF1aXJlKCcuL0luJyksXHJcbiAgICBPdXQ6IHJlcXVpcmUoJy4vT3V0JyksXHJcbiAgICBJbk91dDogcmVxdWlyZSgnLi9Jbk91dCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBFeHBvbmVudGlhbCBlYXNlLWluLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLkV4cG8uSW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW4gPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogKHYgLSAxKSkgLSAwLjAwMTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEV4cG9uZW50aWFsIGVhc2UtaW4vb3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLkV4cG8uSW5PdXRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW5PdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgaWYgKCh2ICo9IDIpIDwgMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMiwgMTAgKiAodiAtIDEpKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMC41ICogKDIgLSBNYXRoLnBvdygyLCAtMTAgKiAodiAtIDEpKSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBFeHBvbmVudGlhbCBlYXNlLW91dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5FeHBvLk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBPdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgcmV0dXJuIDEgLSBNYXRoLnBvdygyLCAtMTAgKiB2KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5NYXRoLkVhc2luZy5FeHBvXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgSW46IHJlcXVpcmUoJy4vSW4nKSxcclxuICAgIE91dDogcmVxdWlyZSgnLi9PdXQnKSxcclxuICAgIEluT3V0OiByZXF1aXJlKCcuL0luT3V0JylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRWFzaW5nXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQmFjazogcmVxdWlyZSgnLi9iYWNrJyksXHJcbiAgICBCb3VuY2U6IHJlcXVpcmUoJy4vYm91bmNlJyksXHJcbiAgICBDaXJjdWxhcjogcmVxdWlyZSgnLi9jaXJjdWxhcicpLFxyXG4gICAgQ3ViaWM6IHJlcXVpcmUoJy4vY3ViaWMnKSxcclxuICAgIEVsYXN0aWM6IHJlcXVpcmUoJy4vZWxhc3RpYycpLFxyXG4gICAgRXhwbzogcmVxdWlyZSgnLi9leHBvJyksXHJcbiAgICBMaW5lYXI6IHJlcXVpcmUoJy4vbGluZWFyJyksXHJcbiAgICBRdWFkcmF0aWM6IHJlcXVpcmUoJy4vcXVhZHJhdGljJyksXHJcbiAgICBRdWFydGljOiByZXF1aXJlKCcuL3F1YXJ0aWMnKSxcclxuICAgIFF1aW50aWM6IHJlcXVpcmUoJy4vcXVpbnRpYycpLFxyXG4gICAgU2luZTogcmVxdWlyZSgnLi9zaW5lJyksXHJcbiAgICBTdGVwcGVkOiByZXF1aXJlKCcuL3N0ZXBwZWQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTGluZWFyIGVhc2luZyAobm8gdmFyaWF0aW9uKS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5MaW5lYXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgTGluZWFyID0gZnVuY3Rpb24gKHYpXHJcbntcclxuICAgIHJldHVybiB2O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBMaW5lYXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL0xpbmVhcicpO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBRdWFkcmF0aWMgZWFzZS1pbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5RdWFkcmF0aWMuSW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW4gPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgcmV0dXJuIHYgKiB2O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUXVhZHJhdGljIGVhc2UtaW4vb3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLlF1YWRyYXRpYy5Jbk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbk91dCA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICBpZiAoKHYgKj0gMikgPCAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiB2ICogdjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gLTAuNSAqICgtLXYgKiAodiAtIDIpIC0gMSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBRdWFkcmF0aWMgZWFzZS1vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuUXVhZHJhdGljLk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBPdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgcmV0dXJuIHYgKiAoMiAtIHYpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPdXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRWFzaW5nLlF1YWRyYXRpY1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEluOiByZXF1aXJlKCcuL0luJyksXHJcbiAgICBPdXQ6IHJlcXVpcmUoJy4vT3V0JyksXHJcbiAgICBJbk91dDogcmVxdWlyZSgnLi9Jbk91dCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBRdWFydGljIGVhc2UtaW4uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuUXVhcnRpYy5JblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gdiAqIHYgKiB2ICogdjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFF1YXJ0aWMgZWFzZS1pbi9vdXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuUXVhcnRpYy5Jbk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbk91dCA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICBpZiAoKHYgKj0gMikgPCAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiB2ICogdiAqIHYgKiB2O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAtMC41ICogKCh2IC09IDIpICogdiAqIHYgKiB2IC0gMik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBRdWFydGljIGVhc2Utb3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLlF1YXJ0aWMuT3V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIE91dCA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gMSAtICgtLXYgKiB2ICogdiAqIHYpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPdXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRWFzaW5nLlF1YXJ0aWNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBJbjogcmVxdWlyZSgnLi9JbicpLFxyXG4gICAgT3V0OiByZXF1aXJlKCcuL091dCcpLFxyXG4gICAgSW5PdXQ6IHJlcXVpcmUoJy4vSW5PdXQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUXVpbnRpYyBlYXNlLWluLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLlF1aW50aWMuSW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2IC0gVGhlIHZhbHVlIHRvIGJlIHR3ZWVuZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgSW4gPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgcmV0dXJuIHYgKiB2ICogdiAqIHYgKiB2O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUXVpbnRpYyBlYXNlLWluL291dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5RdWludGljLkluT3V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIEluT3V0ID0gZnVuY3Rpb24gKHYpXHJcbntcclxuICAgIGlmICgodiAqPSAyKSA8IDEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDAuNSAqIHYgKiB2ICogdiAqIHYgKiB2O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwLjUgKiAoKHYgLT0gMikgKiB2ICogdiAqIHYgKiB2ICsgMik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluT3V0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBRdWludGljIGVhc2Utb3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguRWFzaW5nLlF1aW50aWMuT3V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIE91dCA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICByZXR1cm4gLS12ICogdiAqIHYgKiB2ICogdiArIDE7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTWF0aC5FYXNpbmcuUXVpbnRpY1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEluOiByZXF1aXJlKCcuL0luJyksXHJcbiAgICBPdXQ6IHJlcXVpcmUoJy4vT3V0JyksXHJcbiAgICBJbk91dDogcmVxdWlyZSgnLi9Jbk91dCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTaW51c29pZGFsIGVhc2UtaW4uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuU2luZS5JblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBJbiA9IGZ1bmN0aW9uICh2KVxyXG57XHJcbiAgICBpZiAodiA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHYgPT09IDEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLmNvcyh2ICogTWF0aC5QSSAvIDIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2ludXNvaWRhbCBlYXNlLWluL291dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5TaW5lLkluT3V0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdiAtIFRoZSB2YWx1ZSB0byBiZSB0d2VlbmVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0d2VlbmVkIHZhbHVlLlxyXG4gKi9cclxudmFyIEluT3V0ID0gZnVuY3Rpb24gKHYpXHJcbntcclxuICAgIGlmICh2ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodiA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMC41ICogKDEgLSBNYXRoLmNvcyhNYXRoLlBJICogdikpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbk91dDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2ludXNvaWRhbCBlYXNlLW91dC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkVhc2luZy5TaW5lLk91dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICpcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHdlZW5lZCB2YWx1ZS5cclxuICovXHJcbnZhciBPdXQgPSBmdW5jdGlvbiAodilcclxue1xyXG4gICAgaWYgKHYgPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2ID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnNpbih2ICogTWF0aC5QSSAvIDIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPdXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRWFzaW5nLlNpbmVcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBJbjogcmVxdWlyZSgnLi9JbicpLFxyXG4gICAgT3V0OiByZXF1aXJlKCcuL091dCcpLFxyXG4gICAgSW5PdXQ6IHJlcXVpcmUoJy4vSW5PdXQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU3RlcHBlZCBlYXNpbmcuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5FYXNpbmcuU3RlcHBlZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHYgLSBUaGUgdmFsdWUgdG8gYmUgdHdlZW5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwcz0xXSAtIFRoZSBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIGVhc2UuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHR3ZWVuZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgU3RlcHBlZCA9IGZ1bmN0aW9uICh2LCBzdGVwcylcclxue1xyXG4gICAgaWYgKHN0ZXBzID09PSB1bmRlZmluZWQpIHsgc3RlcHMgPSAxOyB9XHJcblxyXG4gICAgaWYgKHYgPD0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHYgPj0gMSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKCgoc3RlcHMgKiB2KSB8IDApICsgMSkgKiAoMSAvIHN0ZXBzKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3RlcHBlZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuTWF0aC5FYXNpbmcuU3RlcHBlZFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9TdGVwcGVkJyk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgZnV6enkgY2VpbGluZyBvZiB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5GdXp6eS5DZWlsXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZXBzaWxvbj0wLjAwMDFdIC0gVGhlIGVwc2lsb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZ1enp5IGNlaWxpbmcgb2YgdGhlIHZhbHVlLlxyXG4gKi9cclxudmFyIENlaWwgPSBmdW5jdGlvbiAodmFsdWUsIGVwc2lsb24pXHJcbntcclxuICAgIGlmIChlcHNpbG9uID09PSB1bmRlZmluZWQpIHsgZXBzaWxvbiA9IDAuMDAwMTsgfVxyXG5cclxuICAgIHJldHVybiBNYXRoLmNlaWwodmFsdWUgLSBlcHNpbG9uKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2VpbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBmdXp6aWx5IGVxdWFsLlxyXG4gKlxyXG4gKiBUd28gbnVtYmVycyBhcmUgZnV6emlseSBlcXVhbCBpZiB0aGVpciBkaWZmZXJlbmNlIGlzIGxlc3MgdGhhbiBgZXBzaWxvbmAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5GdXp6eS5FcXVhbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgZmlyc3QgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIHNlY29uZCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtlcHNpbG9uPTAuMDAwMV0gLSBUaGUgZXBzaWxvbi5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGZ1enppbHkgZXF1YWwsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIEVxdWFsID0gZnVuY3Rpb24gKGEsIGIsIGVwc2lsb24pXHJcbntcclxuICAgIGlmIChlcHNpbG9uID09PSB1bmRlZmluZWQpIHsgZXBzaWxvbiA9IDAuMDAwMTsgfVxyXG5cclxuICAgIHJldHVybiBNYXRoLmFicyhhIC0gYikgPCBlcHNpbG9uO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFcXVhbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBmdXp6eSBmbG9vciBvZiB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5GdXp6eS5GbG9vclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2Vwc2lsb249MC4wMDAxXSAtIFRoZSBlcHNpbG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmbG9vciBvZiB0aGUgdmFsdWUuXHJcbiAqL1xyXG52YXIgRmxvb3IgPSBmdW5jdGlvbiAodmFsdWUsIGVwc2lsb24pXHJcbntcclxuICAgIGlmIChlcHNpbG9uID09PSB1bmRlZmluZWQpIHsgZXBzaWxvbiA9IDAuMDAwMTsgfVxyXG5cclxuICAgIHJldHVybiBNYXRoLmZsb29yKHZhbHVlICsgZXBzaWxvbik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZsb29yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVjayB3aGV0aGVyIGBhYCBpcyBmdXp6aWx5IGdyZWF0ZXIgdGhhbiBgYmAuXHJcbiAqXHJcbiAqIGBhYCBpcyBmdXp6aWx5IGdyZWF0ZXIgdGhhbiBgYmAgaWYgaXQgaXMgbW9yZSB0aGFuIGBiIC0gZXBzaWxvbmAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5GdXp6eS5HcmVhdGVyVGhhblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgZmlyc3QgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIHNlY29uZCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtlcHNpbG9uPTAuMDAwMV0gLSBUaGUgZXBzaWxvbi5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIGBhYCBpcyBmdXp6aWx5IGdyZWF0ZXIgdGhhbiB0aGFuIGBiYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgR3JlYXRlclRoYW4gPSBmdW5jdGlvbiAoYSwgYiwgZXBzaWxvbilcclxue1xyXG4gICAgaWYgKGVwc2lsb24gPT09IHVuZGVmaW5lZCkgeyBlcHNpbG9uID0gMC4wMDAxOyB9XHJcblxyXG4gICAgcmV0dXJuIGEgPiBiIC0gZXBzaWxvbjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR3JlYXRlclRoYW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIHdoZXRoZXIgYGFgIGlzIGZ1enppbHkgbGVzcyB0aGFuIGBiYC5cclxuICpcclxuICogYGFgIGlzIGZ1enppbHkgbGVzcyB0aGFuIGBiYCBpZiBpdCBpcyBsZXNzIHRoYW4gYGIgKyBlcHNpbG9uYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkZ1enp5Lkxlc3NUaGFuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSBmaXJzdCB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgc2Vjb25kIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2Vwc2lsb249MC4wMDAxXSAtIFRoZSBlcHNpbG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYGFgIGlzIGZ1enppbHkgbGVzcyB0aGFuIGBiYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgTGVzc1RoYW4gPSBmdW5jdGlvbiAoYSwgYiwgZXBzaWxvbilcclxue1xyXG4gICAgaWYgKGVwc2lsb24gPT09IHVuZGVmaW5lZCkgeyBlcHNpbG9uID0gMC4wMDAxOyB9XHJcblxyXG4gICAgcmV0dXJuIGEgPCBiICsgZXBzaWxvbjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTGVzc1RoYW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguRnV6enlcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDZWlsOiByZXF1aXJlKCcuL0NlaWwnKSxcclxuICAgIEVxdWFsOiByZXF1aXJlKCcuL0VxdWFsJyksXHJcbiAgICBGbG9vcjogcmVxdWlyZSgnLi9GbG9vcicpLFxyXG4gICAgR3JlYXRlclRoYW46IHJlcXVpcmUoJy4vR3JlYXRlclRoYW4nKSxcclxuICAgIExlc3NUaGFuOiByZXF1aXJlKCcuL0xlc3NUaGFuJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGhcclxuICovXHJcblxyXG52YXIgUGhhc2VyTWF0aCA9IHtcclxuXHJcbiAgICAvLyAgQ29sbGVjdGlvbnMgb2YgZnVuY3Rpb25zXHJcbiAgICBBbmdsZTogcmVxdWlyZSgnLi9hbmdsZS8nKSxcclxuICAgIERpc3RhbmNlOiByZXF1aXJlKCcuL2Rpc3RhbmNlLycpLFxyXG4gICAgRWFzaW5nOiByZXF1aXJlKCcuL2Vhc2luZy8nKSxcclxuICAgIEZ1enp5OiByZXF1aXJlKCcuL2Z1enp5LycpLFxyXG4gICAgSW50ZXJwb2xhdGlvbjogcmVxdWlyZSgnLi9pbnRlcnBvbGF0aW9uLycpLFxyXG4gICAgUG93MjogcmVxdWlyZSgnLi9wb3cyLycpLFxyXG4gICAgU25hcDogcmVxdWlyZSgnLi9zbmFwLycpLFxyXG5cclxuICAgIC8vICBFeHBvc2UgdGhlIFJORyBDbGFzc1xyXG4gICAgUmFuZG9tRGF0YUdlbmVyYXRvcjogcmVxdWlyZSgnLi9yYW5kb20tZGF0YS1nZW5lcmF0b3IvUmFuZG9tRGF0YUdlbmVyYXRvcicpLFxyXG5cclxuICAgIC8vICBTaW5nbGUgZnVuY3Rpb25zXHJcbiAgICBBdmVyYWdlOiByZXF1aXJlKCcuL0F2ZXJhZ2UnKSxcclxuICAgIEJlcm5zdGVpbjogcmVxdWlyZSgnLi9CZXJuc3RlaW4nKSxcclxuICAgIEJldHdlZW46IHJlcXVpcmUoJy4vQmV0d2VlbicpLFxyXG4gICAgQ2F0bXVsbFJvbTogcmVxdWlyZSgnLi9DYXRtdWxsUm9tJyksXHJcbiAgICBDZWlsVG86IHJlcXVpcmUoJy4vQ2VpbFRvJyksXHJcbiAgICBDbGFtcDogcmVxdWlyZSgnLi9DbGFtcCcpLFxyXG4gICAgRGVnVG9SYWQ6IHJlcXVpcmUoJy4vRGVnVG9SYWQnKSxcclxuICAgIERpZmZlcmVuY2U6IHJlcXVpcmUoJy4vRGlmZmVyZW5jZScpLFxyXG4gICAgRmFjdG9yaWFsOiByZXF1aXJlKCcuL0ZhY3RvcmlhbCcpLFxyXG4gICAgRmxvYXRCZXR3ZWVuOiByZXF1aXJlKCcuL0Zsb2F0QmV0d2VlbicpLFxyXG4gICAgRmxvb3JUbzogcmVxdWlyZSgnLi9GbG9vclRvJyksXHJcbiAgICBGcm9tUGVyY2VudDogcmVxdWlyZSgnLi9Gcm9tUGVyY2VudCcpLFxyXG4gICAgR2V0U3BlZWQ6IHJlcXVpcmUoJy4vR2V0U3BlZWQnKSxcclxuICAgIElzRXZlbjogcmVxdWlyZSgnLi9Jc0V2ZW4nKSxcclxuICAgIElzRXZlblN0cmljdDogcmVxdWlyZSgnLi9Jc0V2ZW5TdHJpY3QnKSxcclxuICAgIExpbmVhcjogcmVxdWlyZSgnLi9MaW5lYXInKSxcclxuICAgIE1heEFkZDogcmVxdWlyZSgnLi9NYXhBZGQnKSxcclxuICAgIE1pblN1YjogcmVxdWlyZSgnLi9NaW5TdWInKSxcclxuICAgIFBlcmNlbnQ6IHJlcXVpcmUoJy4vUGVyY2VudCcpLFxyXG4gICAgUmFkVG9EZWc6IHJlcXVpcmUoJy4vUmFkVG9EZWcnKSxcclxuICAgIFJhbmRvbVhZOiByZXF1aXJlKCcuL1JhbmRvbVhZJyksXHJcbiAgICBSYW5kb21YWVo6IHJlcXVpcmUoJy4vUmFuZG9tWFlaJyksXHJcbiAgICBSYW5kb21YWVpXOiByZXF1aXJlKCcuL1JhbmRvbVhZWlcnKSxcclxuICAgIFJvdGF0ZTogcmVxdWlyZSgnLi9Sb3RhdGUnKSxcclxuICAgIFJvdGF0ZUFyb3VuZDogcmVxdWlyZSgnLi9Sb3RhdGVBcm91bmQnKSxcclxuICAgIFJvdGF0ZUFyb3VuZERpc3RhbmNlOiByZXF1aXJlKCcuL1JvdGF0ZUFyb3VuZERpc3RhbmNlJyksXHJcbiAgICBSb3VuZEF3YXlGcm9tWmVybzogcmVxdWlyZSgnLi9Sb3VuZEF3YXlGcm9tWmVybycpLFxyXG4gICAgUm91bmRUbzogcmVxdWlyZSgnLi9Sb3VuZFRvJyksXHJcbiAgICBTaW5Db3NUYWJsZUdlbmVyYXRvcjogcmVxdWlyZSgnLi9TaW5Db3NUYWJsZUdlbmVyYXRvcicpLFxyXG4gICAgU21vb3RoZXJTdGVwOiByZXF1aXJlKCcuL1Ntb290aGVyU3RlcCcpLFxyXG4gICAgU21vb3RoU3RlcDogcmVxdWlyZSgnLi9TbW9vdGhTdGVwJyksXHJcbiAgICBUb1hZOiByZXF1aXJlKCcuL1RvWFknKSxcclxuICAgIFRyYW5zZm9ybVhZOiByZXF1aXJlKCcuL1RyYW5zZm9ybVhZJyksXHJcbiAgICBXaXRoaW46IHJlcXVpcmUoJy4vV2l0aGluJyksXHJcbiAgICBXcmFwOiByZXF1aXJlKCcuL1dyYXAnKSxcclxuXHJcbiAgICAvLyAgVmVjdG9yIGNsYXNzZXNcclxuICAgIFZlY3RvcjI6IHJlcXVpcmUoJy4vVmVjdG9yMicpLFxyXG4gICAgVmVjdG9yMzogcmVxdWlyZSgnLi9WZWN0b3IzJyksXHJcbiAgICBWZWN0b3I0OiByZXF1aXJlKCcuL1ZlY3RvcjQnKSxcclxuICAgIE1hdHJpeDM6IHJlcXVpcmUoJy4vTWF0cml4MycpLFxyXG4gICAgTWF0cml4NDogcmVxdWlyZSgnLi9NYXRyaXg0JyksXHJcbiAgICBRdWF0ZXJuaW9uOiByZXF1aXJlKCcuL1F1YXRlcm5pb24nKSxcclxuICAgIFJvdGF0ZVZlYzM6IHJlcXVpcmUoJy4vUm90YXRlVmVjMycpXHJcblxyXG59O1xyXG5cclxuLy8gICBNZXJnZSBpbiB0aGUgY29uc3RzXHJcblxyXG5QaGFzZXJNYXRoID0gRXh0ZW5kKGZhbHNlLCBQaGFzZXJNYXRoLCBDT05TVCk7XHJcblxyXG4vLyAgRXhwb3J0IGl0XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBoYXNlck1hdGg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJlcm5zdGVpbiA9IHJlcXVpcmUoJy4uL0Jlcm5zdGVpbicpO1xyXG5cclxuLyoqXHJcbiAqIEEgYmV6aWVyIGludGVycG9sYXRpb24gbWV0aG9kLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguSW50ZXJwb2xhdGlvbi5CZXppZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHYgLSBUaGUgaW5wdXQgYXJyYXkgb2YgdmFsdWVzIHRvIGludGVycG9sYXRlIGJldHdlZW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBrIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgaW50ZXJwb2xhdGlvbiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgQmV6aWVySW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh2LCBrKVxyXG57XHJcbiAgICB2YXIgYiA9IDA7XHJcbiAgICB2YXIgbiA9IHYubGVuZ3RoIC0gMTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBuOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgYiArPSBNYXRoLnBvdygxIC0gaywgbiAtIGkpICogTWF0aC5wb3coaywgaSkgKiB2W2ldICogQmVybnN0ZWluKG4sIGkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBiO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCZXppZXJJbnRlcnBvbGF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDYXRtdWxsUm9tID0gcmVxdWlyZSgnLi4vQ2F0bXVsbFJvbScpO1xyXG5cclxuLyoqXHJcbiAqIEEgQ2F0bXVsbC1Sb20gaW50ZXJwb2xhdGlvbiBtZXRob2QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5JbnRlcnBvbGF0aW9uLkNhdG11bGxSb21cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHYgLSBUaGUgaW5wdXQgYXJyYXkgb2YgdmFsdWVzIHRvIGludGVycG9sYXRlIGJldHdlZW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBrIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgaW50ZXJwb2xhdGlvbiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgQ2F0bXVsbFJvbUludGVycG9sYXRpb24gPSBmdW5jdGlvbiAodiwgaylcclxue1xyXG4gICAgdmFyIG0gPSB2Lmxlbmd0aCAtIDE7XHJcbiAgICB2YXIgZiA9IG0gKiBrO1xyXG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKGYpO1xyXG5cclxuICAgIGlmICh2WzBdID09PSB2W21dKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrIDwgMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGkgPSBNYXRoLmZsb29yKGYgPSBtICogKDEgKyBrKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gQ2F0bXVsbFJvbShmIC0gaSwgdlsoaSAtIDEgKyBtKSAlIG1dLCB2W2ldLCB2WyhpICsgMSkgJSBtXSwgdlsoaSArIDIpICUgbV0pO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrIDwgMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB2WzBdIC0gKENhdG11bGxSb20oLWYsIHZbMF0sIHZbMF0sIHZbMV0sIHZbMV0pIC0gdlswXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoayA+IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdlttXSAtIChDYXRtdWxsUm9tKGYgLSBtLCB2W21dLCB2W21dLCB2W20gLSAxXSwgdlttIC0gMV0pIC0gdlttXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gQ2F0bXVsbFJvbShmIC0gaSwgdltpID8gaSAtIDEgOiAwXSwgdltpXSwgdlttIDwgaSArIDEgPyBtIDogaSArIDFdLCB2W20gPCBpICsgMiA/IG0gOiBpICsgMl0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYXRtdWxsUm9tSW50ZXJwb2xhdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQGlnbm9yZVxyXG4gKi9cclxuZnVuY3Rpb24gUDAgKHQsIHApXHJcbntcclxuICAgIHZhciBrID0gMSAtIHQ7XHJcblxyXG4gICAgcmV0dXJuIGsgKiBrICogayAqIHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBQMSAodCwgcClcclxue1xyXG4gICAgdmFyIGsgPSAxIC0gdDtcclxuXHJcbiAgICByZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBQMiAodCwgcClcclxue1xyXG4gICAgcmV0dXJuIDMgKiAoMSAtIHQpICogdCAqIHQgKiBwO1xyXG59XHJcblxyXG4vKipcclxuICogQGlnbm9yZVxyXG4gKi9cclxuZnVuY3Rpb24gUDMgKHQsIHApXHJcbntcclxuICAgIHJldHVybiB0ICogdCAqIHQgKiBwO1xyXG59XHJcblxyXG4vKipcclxuICogQSBjdWJpYyBiZXppZXIgaW50ZXJwb2xhdGlvbiBtZXRob2QuXHJcbiAqXHJcbiAqIGh0dHBzOi8vbWVkaXVtLmNvbS9AYWRyaWFuX2Nvb25leS9iZXppZXItaW50ZXJwb2xhdGlvbi0xM2I2ODU2MzMxM2FcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkludGVycG9sYXRpb24uQ3ViaWNCZXppZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIHBlcmNlbnRhZ2Ugb2YgaW50ZXJwb2xhdGlvbiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDAgLSBUaGUgc3RhcnQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMSAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDIgLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMyAtIFRoZSBlbmQgcG9pbnQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBDdWJpY0JlemllckludGVycG9sYXRpb24gPSBmdW5jdGlvbiAodCwgcDAsIHAxLCBwMiwgcDMpXHJcbntcclxuICAgIHJldHVybiBQMCh0LCBwMCkgKyBQMSh0LCBwMSkgKyBQMih0LCBwMikgKyBQMyh0LCBwMyk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEN1YmljQmV6aWVySW50ZXJwb2xhdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTGluZWFyID0gcmVxdWlyZSgnLi4vTGluZWFyJyk7XHJcblxyXG4vKipcclxuICogQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBtZXRob2QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5JbnRlcnBvbGF0aW9uLkxpbmVhclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb259XHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHYgLSBUaGUgaW5wdXQgYXJyYXkgb2YgdmFsdWVzIHRvIGludGVycG9sYXRlIGJldHdlZW4uXHJcbiAqIEBwYXJhbSB7IW51bWJlcn0gayAtIFRoZSBwZXJjZW50YWdlIG9mIGludGVycG9sYXRpb24sIGJldHdlZW4gMCBhbmQgMS5cclxuICpcclxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBMaW5lYXJJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKHYsIGspXHJcbntcclxuICAgIHZhciBtID0gdi5sZW5ndGggLSAxO1xyXG4gICAgdmFyIGYgPSBtICogaztcclxuICAgIHZhciBpID0gTWF0aC5mbG9vcihmKTtcclxuXHJcbiAgICBpZiAoayA8IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExpbmVhcih2WzBdLCB2WzFdLCBmKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGsgPiAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMaW5lYXIodlttXSwgdlttIC0gMV0sIG0gLSBmKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGluZWFyKHZbaV0sIHZbKGkgKyAxID4gbSkgPyBtIDogaSArIDFdLCBmIC0gaSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVhckludGVycG9sYXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmZ1bmN0aW9uIFAwICh0LCBwKVxyXG57XHJcbiAgICB2YXIgayA9IDEgLSB0O1xyXG5cclxuICAgIHJldHVybiBrICogayAqIHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBQMSAodCwgcClcclxue1xyXG4gICAgcmV0dXJuIDIgKiAoMSAtIHQpICogdCAqIHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBQMiAodCwgcClcclxue1xyXG4gICAgcmV0dXJuIHQgKiB0ICogcDtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL21hc3Rlci9zcmMvZXh0cmFzL2NvcmUvSW50ZXJwb2xhdGlvbnMuanNcclxuXHJcbi8qKlxyXG4gKiBBIHF1YWRyYXRpYyBiZXppZXIgaW50ZXJwb2xhdGlvbiBtZXRob2QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5JbnRlcnBvbGF0aW9uLlF1YWRyYXRpY0JlemllclxyXG4gKiBAc2luY2UgMy4yLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgcGVyY2VudGFnZSBvZiBpbnRlcnBvbGF0aW9uLCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMCAtIFRoZSBzdGFydCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAxIC0gVGhlIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMiAtIFRoZSBlbmQgcG9pbnQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBRdWFkcmF0aWNCZXppZXJJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKHQsIHAwLCBwMSwgcDIpXHJcbntcclxuICAgIHJldHVybiBQMCh0LCBwMCkgKyBQMSh0LCBwMSkgKyBQMih0LCBwMik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFF1YWRyYXRpY0JlemllckludGVycG9sYXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNtb290aFN0ZXAgPSByZXF1aXJlKCcuLi9TbW9vdGhTdGVwJyk7XHJcblxyXG4vKipcclxuICogQSBTbW9vdGggU3RlcCBpbnRlcnBvbGF0aW9uIG1ldGhvZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkludGVycG9sYXRpb24uU21vb3RoU3RlcFxyXG4gKiBAc2luY2UgMy45LjBcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcH1cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgcGVyY2VudGFnZSBvZiBpbnRlcnBvbGF0aW9uLCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSwgYWxzbyBrbm93biBhcyB0aGUgJ2xlZnQgZWRnZScsIGFzc3VtZWQgc21hbGxlciB0aGFuIHRoZSAncmlnaHQgZWRnZScuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSwgYWxzbyBrbm93biBhcyB0aGUgJ3JpZ2h0IGVkZ2UnLCBhc3N1bWVkIGdyZWF0ZXIgdGhhbiB0aGUgJ2xlZnQgZWRnZScuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBTbW9vdGhTdGVwSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh0LCBtaW4sIG1heClcclxue1xyXG4gICAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogU21vb3RoU3RlcCh0LCAwLCAxKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU21vb3RoU3RlcEludGVycG9sYXRpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNtb290aGVyU3RlcCA9IHJlcXVpcmUoJy4uL1Ntb290aGVyU3RlcCcpO1xyXG5cclxuLyoqXHJcbiAqIEEgU21vb3RoZXIgU3RlcCBpbnRlcnBvbGF0aW9uIG1ldGhvZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLkludGVycG9sYXRpb24uU21vb3RoZXJTdGVwXHJcbiAqIEBzaW5jZSAzLjkuMFxyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwI1ZhcmlhdGlvbnN9XHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIHBlcmNlbnRhZ2Ugb2YgaW50ZXJwb2xhdGlvbiwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUsIGFsc28ga25vd24gYXMgdGhlICdsZWZ0IGVkZ2UnLCBhc3N1bWVkIHNtYWxsZXIgdGhhbiB0aGUgJ3JpZ2h0IGVkZ2UnLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUsIGFsc28ga25vd24gYXMgdGhlICdyaWdodCBlZGdlJywgYXNzdW1lZCBncmVhdGVyIHRoYW4gdGhlICdsZWZ0IGVkZ2UnLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgU21vb3RoZXJTdGVwSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh0LCBtaW4sIG1heClcclxue1xyXG4gICAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogU21vb3RoZXJTdGVwKHQsIDAsIDEpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbW9vdGhlclN0ZXBJbnRlcnBvbGF0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5NYXRoLkludGVycG9sYXRpb25cclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBCZXppZXI6IHJlcXVpcmUoJy4vQmV6aWVySW50ZXJwb2xhdGlvbicpLFxyXG4gICAgQ2F0bXVsbFJvbTogcmVxdWlyZSgnLi9DYXRtdWxsUm9tSW50ZXJwb2xhdGlvbicpLFxyXG4gICAgQ3ViaWNCZXppZXI6IHJlcXVpcmUoJy4vQ3ViaWNCZXppZXJJbnRlcnBvbGF0aW9uJyksXHJcbiAgICBMaW5lYXI6IHJlcXVpcmUoJy4vTGluZWFySW50ZXJwb2xhdGlvbicpLFxyXG4gICAgUXVhZHJhdGljQmV6aWVyOiByZXF1aXJlKCcuL1F1YWRyYXRpY0JlemllckludGVycG9sYXRpb24nKSxcclxuICAgIFNtb290aFN0ZXA6IHJlcXVpcmUoJy4vU21vb3RoU3RlcEludGVycG9sYXRpb24nKSxcclxuICAgIFNtb290aGVyU3RlcDogcmVxdWlyZSgnLi9TbW9vdGhlclN0ZXBJbnRlcnBvbGF0aW9uJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG5lYXJlc3QgcG93ZXIgb2YgMiB0byB0aGUgZ2l2ZW4gYHZhbHVlYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5NYXRoLlBvdzIuR2V0TmV4dFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbmVhcmVzdCBwb3dlciBvZiAyIHRvIGB2YWx1ZWAuXHJcbiAqL1xyXG52YXIgR2V0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICh2YWx1ZSlcclxue1xyXG4gICAgdmFyIGluZGV4ID0gTWF0aC5sb2codmFsdWUpIC8gMC42OTMxNDcxODA1NTk5NDUzO1xyXG5cclxuICAgIHJldHVybiAoMSA8PCBNYXRoLmNlaWwoaW5kZXgpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0UG93ZXJPZlR3bztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgYSBwb3dlciBvZiB0d28uXHJcbiAqIFVzZWZ1bCBmb3IgY2hlY2tpbmcgdGV4dHVyZSBkaW1lbnNpb25zLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUG93Mi5Jc1NpemVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgYSBwb3dlciBvZiB0d28sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIElzU2l6ZVBvd2VyT2ZUd28gPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxue1xyXG4gICAgcmV0dXJuICh3aWR0aCA+IDAgJiYgKHdpZHRoICYgKHdpZHRoIC0gMSkpID09PSAwICYmIGhlaWdodCA+IDAgJiYgKGhlaWdodCAmIChoZWlnaHQgLSAxKSkgPT09IDApO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJc1NpemVQb3dlck9mVHdvO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyB0aGUgdmFsdWUgYW5kIHJldHVybnMgYHRydWVgIGlmIGl0IGlzIGEgcG93ZXIgb2YgdHdvLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguUG93Mi5Jc1ZhbHVlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQncyBhIHBvd2VyIG9mIHR3by5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBvd2VyIG9mIHR3bywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgSXNWYWx1ZVBvd2VyT2ZUd28gPSBmdW5jdGlvbiAodmFsdWUpXHJcbntcclxuICAgIHJldHVybiAodmFsdWUgPiAwICYmICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IElzVmFsdWVQb3dlck9mVHdvO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5NYXRoLlBvdzJcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBHZXROZXh0OiByZXF1aXJlKCcuL0dldFBvd2VyT2ZUd28nKSxcclxuICAgIElzU2l6ZTogcmVxdWlyZSgnLi9Jc1NpemVQb3dlck9mVHdvJyksXHJcbiAgICBJc1ZhbHVlOiByZXF1aXJlKCcuL0lzVmFsdWVQb3dlck9mVHdvJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgc2VlZGVkIFJhbmRvbSBEYXRhIEdlbmVyYXRvci5cclxuICogXHJcbiAqIEFjY2VzcyB2aWEgYFBoYXNlci5NYXRoLlJORGAgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBwcmUtZGVmaW5lZFxyXG4gKiBieSBQaGFzZXIuIE9yLCBjcmVhdGUgeW91ciBvd24gaW5zdGFuY2UgdG8gdXNlIGFzIHlvdSByZXF1aXJlLlxyXG4gKiBcclxuICogVGhlIGBNYXRoLlJORGAgZ2VuZXJhdG9yIGlzIHNlZWRlZCBieSB0aGUgR2FtZSBDb25maWcgcHJvcGVydHkgdmFsdWUgYHNlZWRgLlxyXG4gKiBJZiBubyBzdWNoIGNvbmZpZyBwcm9wZXJ0eSBleGlzdHMsIGEgcmFuZG9tIG51bWJlciBpcyB1c2VkLlxyXG4gKiBcclxuICogSWYgeW91IGNyZWF0ZSB5b3VyIG93biBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHlvdSBzaG91bGQgcHJvdmlkZSBhIHNlZWQgZm9yIGl0LlxyXG4gKiBJZiBubyBzZWVkIGlzIGdpdmVuIGl0IHdpbGwgdXNlIGEgJ3JhbmRvbScgb25lIGJhc2VkIG9uIERhdGUubm93LlxyXG4gKlxyXG4gKiBAY2xhc3MgUmFuZG9tRGF0YUdlbmVyYXRvclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLk1hdGhcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBbc2VlZHNdIC0gVGhlIHNlZWRzIHRvIHVzZSBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxyXG4gKi9cclxudmFyIFJhbmRvbURhdGFHZW5lcmF0b3IgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUmFuZG9tRGF0YUdlbmVyYXRvciAoc2VlZHMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNlZWRzID09PSB1bmRlZmluZWQpIHsgc2VlZHMgPSBbIChEYXRlLm5vdygpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoKSBdOyB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHZhci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3IjY1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgdmFyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNzMFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zMCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHZhci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3IjczFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuczEgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCB2YXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI3MyXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnMyID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgdmFyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNuXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm4gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTaWducyB0byBjaG9vc2UgZnJvbS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3Ijc2lnbnNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaWducyA9IFsgLTEsIDEgXTtcclxuXHJcbiAgICAgICAgaWYgKHNlZWRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0KHNlZWRzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSByYW5kb20gaGVscGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNybmRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIG51bWJlci5cclxuICAgICAqL1xyXG4gICAgcm5kOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxyXG5cclxuICAgICAgICB0aGlzLmMgPSB0IHwgMDtcclxuICAgICAgICB0aGlzLnMwID0gdGhpcy5zMTtcclxuICAgICAgICB0aGlzLnMxID0gdGhpcy5zMjtcclxuICAgICAgICB0aGlzLnMyID0gdCAtIHRoaXMuYztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuczI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHNlZWQgaGFzaC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3IjaGFzaFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIC0gVGhlIHZhbHVlIHRvIGhhc2guXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaGVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBoYXNoOiBmdW5jdGlvbiAoZGF0YSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaDtcclxuICAgICAgICB2YXIgbiA9IHRoaXMubjtcclxuXHJcbiAgICAgICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbiArPSBkYXRhLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgIGggPSAwLjAyNTE5NjAzMjgyNDE2OTM4ICogbjtcclxuICAgICAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgICAgIGggLT0gbjtcclxuICAgICAgICAgICAgaCAqPSBuO1xyXG4gICAgICAgICAgICBuID0gaCA+Pj4gMDtcclxuICAgICAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgICAgICBuICs9IGggKiAweDEwMDAwMDAwMDsvLyAyXjMyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm4gPSBuO1xyXG5cclxuICAgICAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsvLyAyXi0zMlxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSByYW5kb20gZGF0YSBnZW5lcmF0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI2luaXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IHNlZWRzIC0gVGhlIHNlZWRzIHRvIGluaXRpYWxpemUgdGhlIHJhbmRvbSBkYXRhIGdlbmVyYXRvciB3aXRoLlxyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoc2VlZHMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWVkcyA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlKHNlZWRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb3coc2VlZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldCB0aGUgc2VlZCBvZiB0aGUgcmFuZG9tIGRhdGEgZ2VuZXJhdG9yLlxyXG4gICAgICpcclxuICAgICAqIF9Ob3RlXzogdGhlIHNlZWQgYXJyYXkgaXMgb25seSBwcm9jZXNzZWQgdXAgdG8gdGhlIGZpcnN0IGB1bmRlZmluZWRgIChvciBgbnVsbGApIHZhbHVlLCBzaG91bGQgc3VjaCBiZSBwcmVzZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNzb3dcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNlZWRzIC0gVGhlIGFycmF5IG9mIHNlZWRzOiB0aGUgYHRvU3RyaW5nKClgIG9mIGVhY2ggdmFsdWUgaXMgdXNlZC5cclxuICAgICAqL1xyXG4gICAgc293OiBmdW5jdGlvbiAoc2VlZHMpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gQWx3YXlzIHJlc2V0IHRvIGRlZmF1bHQgc2VlZFxyXG4gICAgICAgIHRoaXMubiA9IDB4ZWZjODI0OWQ7XHJcbiAgICAgICAgdGhpcy5zMCA9IHRoaXMuaGFzaCgnICcpO1xyXG4gICAgICAgIHRoaXMuczEgPSB0aGlzLmhhc2goJyAnKTtcclxuICAgICAgICB0aGlzLnMyID0gdGhpcy5oYXNoKCcgJyk7XHJcbiAgICAgICAgdGhpcy5jID0gMTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWVkcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFwcGx5IGFueSBzZWVkc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VlZHMubGVuZ3RoICYmIChzZWVkc1tpXSAhPSBudWxsKTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNlZWQgPSBzZWVkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuczAgLT0gdGhpcy5oYXNoKHNlZWQpO1xyXG4gICAgICAgICAgICB0aGlzLnMwICs9IH5+KHRoaXMuczAgPCAwKTtcclxuICAgICAgICAgICAgdGhpcy5zMSAtPSB0aGlzLmhhc2goc2VlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuczEgKz0gfn4odGhpcy5zMSA8IDApO1xyXG4gICAgICAgICAgICB0aGlzLnMyIC09IHRoaXMuaGFzaChzZWVkKTtcclxuICAgICAgICAgICAgdGhpcy5zMiArPSB+fih0aGlzLnMyIDwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDJeMzIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI2ludGVnZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDJeMzIuXHJcbiAgICAgKi9cclxuICAgIGludGVnZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gMl4zMlxyXG4gICAgICAgIHJldHVybiB0aGlzLnJuZCgpICogMHgxMDAwMDAwMDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSByZWFsIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI2ZyYWNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICBmcmFjOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIDJeLTUzXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm5kKCkgKyAodGhpcy5ybmQoKSAqIDB4MjAwMDAwIHwgMCkgKiAxLjExMDIyMzAyNDYyNTE1NjVlLTE2O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiAwIGFuZCAyXjMyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNyZWFsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl4zMi5cclxuICAgICAqL1xyXG4gICAgcmVhbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlZ2VyKCkgKyB0aGlzLmZyYWMoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBhbmQgaW5jbHVkaW5nIG1pbiBhbmQgbWF4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNpbnRlZ2VySW5SYW5nZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuICAgICAqL1xyXG4gICAgaW50ZWdlckluUmFuZ2U6IGZ1bmN0aW9uIChtaW4sIG1heClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnJlYWxJblJhbmdlKDAsIG1heCAtIG1pbiArIDEpICsgbWluKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBhbmQgaW5jbHVkaW5nIG1pbiBhbmQgbWF4LlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgYW4gYWxpYXMgZm9yIFJhbmRvbURhdGFHZW5lcmF0b3IuaW50ZWdlckluUmFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI2JldHdlZW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXguXHJcbiAgICAgKi9cclxuICAgIGJldHdlZW46IGZ1bmN0aW9uIChtaW4sIG1heClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnJlYWxJblJhbmdlKDAsIG1heCAtIG1pbiArIDEpICsgbWluKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI3JlYWxJblJhbmdlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSByYW5nZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG4gICAgICovXHJcbiAgICByZWFsSW5SYW5nZTogZnVuY3Rpb24gKG1pbiwgbWF4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZyYWMoKSAqIChtYXggLSBtaW4pICsgbWluO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiAtMSBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3Ijbm9ybWFsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDEuXHJcbiAgICAgKi9cclxuICAgIG5vcm1hbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gMSAtICgyICogdGhpcy5mcmFjKCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB2YWxpZCBSRkM0MTIyIHZlcnNpb240IElEIGhleCBzdHJpbmcgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMzA4MzY4XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI3V1aWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gQSB2YWxpZCBSRkM0MTIyIHZlcnNpb240IElEIGhleCBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgdXVpZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYSA9ICcnO1xyXG4gICAgICAgIHZhciBiID0gJyc7XHJcblxyXG4gICAgICAgIGZvciAoYiA9IGEgPSAnJzsgYSsrIDwgMzY7IGIgKz0gfmEgJSA1IHwgYSAqIDMgJiA0ID8gKGEgXiAxNSA/IDggXiB0aGlzLmZyYWMoKSAqIChhIF4gMjAgPyAxNiA6IDQpIDogNCkudG9TdHJpbmcoMTYpIDogJy0nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSB3aXRoaW4gdGhlIGdpdmVuIGFycmF5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNwaWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQGdlbmVyaWMgVFxyXG4gICAgICogQGdlbmVyaWNVc2Uge1RbXX0gLSBbYXJyYXldXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RbXX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gcGljayBhIHJhbmRvbSBlbGVtZW50IGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7VH0gQSByYW5kb20gbWVtYmVyIG9mIHRoZSBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcGljazogZnVuY3Rpb24gKGFycmF5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBhcnJheVt0aGlzLmludGVnZXJJblJhbmdlKDAsIGFycmF5Lmxlbmd0aCAtIDEpXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgc2lnbiB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGljYXRpb24gb3BlcmF0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI3NpZ25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLTEgb3IgKzEuXHJcbiAgICAgKi9cclxuICAgIHNpZ246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGljayh0aGlzLnNpZ25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSB3aXRoaW4gdGhlIGdpdmVuIGFycmF5LCBmYXZvcmluZyB0aGUgZWFybGllciBlbnRyaWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciN3ZWlnaHRlZFBpY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljIFRcclxuICAgICAqIEBnZW5lcmljVXNlIHtUW119IC0gW2FycmF5XVxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUW119IGFycmF5IC0gVGhlIGFycmF5IHRvIHBpY2sgYSByYW5kb20gZWxlbWVudCBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1R9IEEgcmFuZG9tIG1lbWJlciBvZiB0aGUgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIHdlaWdodGVkUGljazogZnVuY3Rpb24gKGFycmF5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBhcnJheVt+fihNYXRoLnBvdyh0aGlzLmZyYWMoKSwgMikgKiAoYXJyYXkubGVuZ3RoIC0gMSkgKyAwLjUpXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHRpbWVzdGFtcCBiZXR3ZWVuIG1pbiBhbmQgbWF4LCBvciBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgMjAwMCBhbmQgdGhlIGVuZCBvZiAyMDIwIGlmIG1pbiBhbmQgbWF4IGFyZW4ndCBzcGVjaWZpZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI3RpbWVzdGFtcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSB0aW1lc3RhbXAgYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuICAgICAqL1xyXG4gICAgdGltZXN0YW1wOiBmdW5jdGlvbiAobWluLCBtYXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbEluUmFuZ2UobWluIHx8IDk0NjY4NDgwMDAwMCwgbWF4IHx8IDE1Nzc4NjIwMDAwMDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gYW5nbGUgYmV0d2VlbiAtMTgwIGFuZCAxODAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuTWF0aC5SYW5kb21EYXRhR2VuZXJhdG9yI2FuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIC0xODAgYW5kIDE4MC5cclxuICAgICAqL1xyXG4gICAgYW5nbGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZWdlckluUmFuZ2UoLTE4MCwgMTgwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIHJvdGF0aW9uIGluIHJhZGlhbnMsIGJldHdlZW4gLTMuMTQxIGFuZCAzLjE0MVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLk1hdGguUmFuZG9tRGF0YUdlbmVyYXRvciNyb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAtMy4xNDEgYW5kIDMuMTQxXHJcbiAgICAgKi9cclxuICAgIHJvdGF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWxJblJhbmdlKC0zLjE0MTU5MjYsIDMuMTQxNTkyNik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBTZXRzIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLiBUaGlzIGFsbG93cyB5b3UgdG8gcmV0YWluIHRoZSB2YWx1ZXNcclxuICAgICAqIHRoYXQgdGhlIGdlbmVyYXRvciBpcyB1c2luZyBiZXR3ZWVuIGdhbWVzLCBpLmUuIGluIGEgZ2FtZSBzYXZlIGZpbGUuXHJcbiAgICAgKlxyXG4gICAgICogVG8gc2VlZCB0aGlzIGdlbmVyYXRvciB3aXRoIGEgcHJldmlvdXNseSBzYXZlZCBzdGF0ZSB5b3UgY2FuIHBhc3MgaXQgYXMgdGhlXHJcbiAgICAgKiBgc2VlZGAgdmFsdWUgaW4geW91ciBnYW1lIGNvbmZpZywgb3IgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSBhZnRlciBQaGFzZXIgaGFzIGJvb3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHdpdGggbm8gcGFyYW1ldGVycyB0byByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgcHJvdmlkaW5nIGEgc3RhdGUgaXQgc2hvdWxkIG1hdGNoIHRoZSBzYW1lIGZvcm1hdCB0aGF0IHRoaXMgbWV0aG9kXHJcbiAgICAgKiByZXR1cm5zLCB3aGljaCBpcyBhIHN0cmluZyB3aXRoIGEgaGVhZGVyIGAhcm5kYCBmb2xsb3dlZCBieSB0aGUgYGNgLFxyXG4gICAgICogYHMwYCwgYHMxYCBhbmQgYHMyYCB2YWx1ZXMgcmVzcGVjdGl2ZWx5LCBlYWNoIGNvbW1hLWRlbGltaXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3Ijc3RhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RhdGVdIC0gR2VuZXJhdG9yIHN0YXRlIHRvIGJlIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuXHJcbiAgICAgKi9cclxuICAgIHN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgc3RhdGUubWF0Y2goL14hcm5kLykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdGF0ZSA9IHN0YXRlLnNwbGl0KCcsJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmMgPSBwYXJzZUZsb2F0KHN0YXRlWzFdKTtcclxuICAgICAgICAgICAgdGhpcy5zMCA9IHBhcnNlRmxvYXQoc3RhdGVbMl0pO1xyXG4gICAgICAgICAgICB0aGlzLnMxID0gcGFyc2VGbG9hdChzdGF0ZVszXSk7XHJcbiAgICAgICAgICAgIHRoaXMuczIgPSBwYXJzZUZsb2F0KHN0YXRlWzRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbICchcm5kJywgdGhpcy5jLCB0aGlzLnMwLCB0aGlzLnMxLCB0aGlzLnMyIF0uam9pbignLCcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNodWZmbGVzIHRoZSBnaXZlbiBhcnJheSwgdXNpbmcgdGhlIGN1cnJlbnQgc2VlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5NYXRoLlJhbmRvbURhdGFHZW5lcmF0b3Ijc2h1ZmZsZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWMgVFxyXG4gICAgICogQGdlbmVyaWNVc2Uge1RbXX0gLSBbYXJyYXksJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RbXX0gW2FycmF5XSAtIFRoZSBhcnJheSB0byBiZSBzaHVmZmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtUW119IFRoZSBzaHVmZmxlZCBhcnJheS5cclxuICAgICAqL1xyXG4gICAgc2h1ZmZsZTogZnVuY3Rpb24gKGFycmF5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsZW4gPSBhcnJheS5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gbGVuOyBpID4gMDsgaS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcih0aGlzLmZyYWMoKSAqIChpICsgMSkpO1xyXG4gICAgICAgICAgICB2YXIgaXRlbUF0SW5kZXggPSBhcnJheVtyYW5kb21JbmRleF07XHJcblxyXG4gICAgICAgICAgICBhcnJheVtyYW5kb21JbmRleF0gPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgYXJyYXlbaV0gPSBpdGVtQXRJbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSYW5kb21EYXRhR2VuZXJhdG9yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTbmFwIGEgdmFsdWUgdG8gbmVhcmVzdCBncmlkIHNsaWNlLCB1c2luZyBjZWlsLlxyXG4gKlxyXG4gKiBFeGFtcGxlOiBpZiB5b3UgaGF2ZSBhbiBpbnRlcnZhbCBnYXAgb2YgYDVgIGFuZCBhIHBvc2l0aW9uIG9mIGAxMmAuLi4geW91IHdpbGwgc25hcCB0byBgMTVgLlxyXG4gKiBBcyB3aWxsIGAxNGAgc25hcCB0byBgMTVgLi4uIGJ1dCBgMTZgIHdpbGwgc25hcCB0byBgMjBgLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguU25hcC5DZWlsXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc25hcC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGdhcCAtIFRoZSBpbnRlcnZhbCBnYXAgb2YgdGhlIGdyaWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gLSBPcHRpb25hbCBzdGFydGluZyBvZmZzZXQgZm9yIGdhcC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZGl2aWRlPWZhbHNlXSAtIElmIGB0cnVlYCBpdCB3aWxsIGRpdmlkZSB0aGUgc25hcHBlZCB2YWx1ZSBieSB0aGUgZ2FwIGJlZm9yZSByZXR1cm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNuYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgU25hcENlaWwgPSBmdW5jdGlvbiAodmFsdWUsIGdhcCwgc3RhcnQsIGRpdmlkZSlcclxue1xyXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHsgc3RhcnQgPSAwOyB9XHJcblxyXG4gICAgaWYgKGdhcCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsdWUgLT0gc3RhcnQ7XHJcbiAgICB2YWx1ZSA9IGdhcCAqIE1hdGguY2VpbCh2YWx1ZSAvIGdhcCk7XHJcblxyXG4gICAgcmV0dXJuIChkaXZpZGUpID8gKHN0YXJ0ICsgdmFsdWUpIC8gZ2FwIDogc3RhcnQgKyB2YWx1ZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU25hcENlaWw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFNuYXAgYSB2YWx1ZSB0byBuZWFyZXN0IGdyaWQgc2xpY2UsIHVzaW5nIGZsb29yLlxyXG4gKlxyXG4gKiBFeGFtcGxlOiBpZiB5b3UgaGF2ZSBhbiBpbnRlcnZhbCBnYXAgb2YgYDVgIGFuZCBhIHBvc2l0aW9uIG9mIGAxMmAuLi4geW91IHdpbGwgc25hcCB0byBgMTBgLlxyXG4gKiBBcyB3aWxsIGAxNGAgc25hcCB0byBgMTBgLi4uIGJ1dCBgMTZgIHdpbGwgc25hcCB0byBgMTVgLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLk1hdGguU25hcC5GbG9vclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNuYXAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBnYXAgLSBUaGUgaW50ZXJ2YWwgZ2FwIG9mIHRoZSBncmlkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIC0gT3B0aW9uYWwgc3RhcnRpbmcgb2Zmc2V0IGZvciBnYXAuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RpdmlkZT1mYWxzZV0gLSBJZiBgdHJ1ZWAgaXQgd2lsbCBkaXZpZGUgdGhlIHNuYXBwZWQgdmFsdWUgYnkgdGhlIGdhcCBiZWZvcmUgcmV0dXJuaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzbmFwcGVkIHZhbHVlLlxyXG4gKi9cclxudmFyIFNuYXBGbG9vciA9IGZ1bmN0aW9uICh2YWx1ZSwgZ2FwLCBzdGFydCwgZGl2aWRlKVxyXG57XHJcbiAgICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkgeyBzdGFydCA9IDA7IH1cclxuXHJcbiAgICBpZiAoZ2FwID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZSAtPSBzdGFydDtcclxuICAgIHZhbHVlID0gZ2FwICogTWF0aC5mbG9vcih2YWx1ZSAvIGdhcCk7XHJcblxyXG4gICAgcmV0dXJuIChkaXZpZGUpID8gKHN0YXJ0ICsgdmFsdWUpIC8gZ2FwIDogc3RhcnQgKyB2YWx1ZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU25hcEZsb29yO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTbmFwIGEgdmFsdWUgdG8gbmVhcmVzdCBncmlkIHNsaWNlLCB1c2luZyByb3VuZGluZy5cclxuICpcclxuICogRXhhbXBsZTogaWYgeW91IGhhdmUgYW4gaW50ZXJ2YWwgZ2FwIG9mIGA1YCBhbmQgYSBwb3NpdGlvbiBvZiBgMTJgLi4uIHlvdSB3aWxsIHNuYXAgdG8gYDEwYCB3aGVyZWFzIGAxNGAgd2lsbCBzbmFwIHRvIGAxNWAuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuTWF0aC5TbmFwLlRvXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc25hcC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGdhcCAtIFRoZSBpbnRlcnZhbCBnYXAgb2YgdGhlIGdyaWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gLSBPcHRpb25hbCBzdGFydGluZyBvZmZzZXQgZm9yIGdhcC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZGl2aWRlPWZhbHNlXSAtIElmIGB0cnVlYCBpdCB3aWxsIGRpdmlkZSB0aGUgc25hcHBlZCB2YWx1ZSBieSB0aGUgZ2FwIGJlZm9yZSByZXR1cm5pbmcuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNuYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgU25hcFRvID0gZnVuY3Rpb24gKHZhbHVlLCBnYXAsIHN0YXJ0LCBkaXZpZGUpXHJcbntcclxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0ID0gMDsgfVxyXG5cclxuICAgIGlmIChnYXAgPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlIC09IHN0YXJ0O1xyXG4gICAgdmFsdWUgPSBnYXAgKiBNYXRoLnJvdW5kKHZhbHVlIC8gZ2FwKTtcclxuXHJcbiAgICByZXR1cm4gKGRpdmlkZSkgPyAoc3RhcnQgKyB2YWx1ZSkgLyBnYXAgOiBzdGFydCArIHZhbHVlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbmFwVG87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLk1hdGguU25hcFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIENlaWw6IHJlcXVpcmUoJy4vU25hcENlaWwnKSxcclxuICAgIEZsb29yOiByZXF1aXJlKCcuL1NuYXBGbG9vcicpLFxyXG4gICAgVG86IHJlcXVpcmUoJy4vU25hcFRvJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxucmVxdWlyZSgnLi9wb2x5ZmlsbHMnKTtcclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyXHJcbiAqL1xyXG5cclxudmFyIFBoYXNlciA9IHtcclxuXHJcbiAgICBBY3Rpb25zOiByZXF1aXJlKCcuL2FjdGlvbnMnKSxcclxuICAgIEFuaW1hdGlvbnM6IHJlcXVpcmUoJy4vYW5pbWF0aW9ucycpLFxyXG4gICAgQmxlbmRNb2RlczogcmVxdWlyZSgnLi9yZW5kZXJlci9CbGVuZE1vZGVzJyksXHJcbiAgICBDYWNoZTogcmVxdWlyZSgnLi9jYWNoZScpLFxyXG4gICAgQ2FtZXJhczogcmVxdWlyZSgnLi9jYW1lcmFzJyksXHJcbiAgICBDb3JlOiByZXF1aXJlKCcuL2NvcmUnKSxcclxuICAgIENsYXNzOiByZXF1aXJlKCcuL3V0aWxzL0NsYXNzJyksXHJcbiAgICBDcmVhdGU6IHJlcXVpcmUoJy4vY3JlYXRlJyksXHJcbiAgICBDdXJ2ZXM6IHJlcXVpcmUoJy4vY3VydmVzJyksXHJcbiAgICBEYXRhOiByZXF1aXJlKCcuL2RhdGEnKSxcclxuICAgIERpc3BsYXk6IHJlcXVpcmUoJy4vZGlzcGxheScpLFxyXG4gICAgRE9NOiByZXF1aXJlKCcuL2RvbScpLFxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpLFxyXG4gICAgR2FtZTogcmVxdWlyZSgnLi9jb3JlL0dhbWUnKSxcclxuICAgIEdhbWVPYmplY3RzOiByZXF1aXJlKCcuL2dhbWVvYmplY3RzJyksXHJcbiAgICBHZW9tOiByZXF1aXJlKCcuL2dlb20nKSxcclxuICAgIElucHV0OiByZXF1aXJlKCcuL2lucHV0JyksXHJcbiAgICBMb2FkZXI6IHJlcXVpcmUoJy4vbG9hZGVyJyksXHJcbiAgICBNYXRoOiByZXF1aXJlKCcuL21hdGgnKSxcclxuICAgIFBoeXNpY3M6IHJlcXVpcmUoJy4vcGh5c2ljcycpLFxyXG4gICAgUGx1Z2luczogcmVxdWlyZSgnLi9wbHVnaW5zJyksXHJcbiAgICBSZW5kZXJlcjogcmVxdWlyZSgnLi9yZW5kZXJlcicpLFxyXG4gICAgU2NhbGU6IHJlcXVpcmUoJy4vc2NhbGUnKSxcclxuICAgIFNjYWxlTW9kZXM6IHJlcXVpcmUoJy4vcmVuZGVyZXIvU2NhbGVNb2RlcycpLFxyXG4gICAgU2NlbmU6IHJlcXVpcmUoJy4vc2NlbmUvU2NlbmUnKSxcclxuICAgIFNjZW5lczogcmVxdWlyZSgnLi9zY2VuZScpLFxyXG4gICAgU3RydWN0czogcmVxdWlyZSgnLi9zdHJ1Y3RzJyksXHJcbiAgICBUZXh0dXJlczogcmVxdWlyZSgnLi90ZXh0dXJlcycpLFxyXG4gICAgVGlsZW1hcHM6IHJlcXVpcmUoJy4vdGlsZW1hcHMnKSxcclxuICAgIFRpbWU6IHJlcXVpcmUoJy4vdGltZScpLFxyXG4gICAgVHdlZW5zOiByZXF1aXJlKCcuL3R3ZWVucycpLFxyXG4gICAgVXRpbHM6IHJlcXVpcmUoJy4vdXRpbHMnKVxyXG5cclxufTtcclxuXHJcbi8vICBNZXJnZSBpbiB0aGUgb3B0aW9uYWwgcGx1Z2luc1xyXG5cclxuaWYgKHR5cGVvZiBGRUFUVVJFX1NPVU5EKVxyXG57XHJcbiAgICBQaGFzZXIuU291bmQgPSByZXF1aXJlKCcuL3NvdW5kJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUExVR0lOX0NBTUVSQTNEKVxyXG57XHJcbiAgICBQaGFzZXIuQ2FtZXJhcy5TcHJpdGUzRCA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvY2FtZXJhM2Qvc3JjJyk7XHJcbiAgICBQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlM0QgPSByZXF1aXJlKCcuLi9wbHVnaW5zL2NhbWVyYTNkL3NyYy9zcHJpdGUzZC9TcHJpdGUzRCcpO1xyXG4gICAgUGhhc2VyLkdhbWVPYmplY3RzLkZhY3Rvcmllcy5TcHJpdGUzRCA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvY2FtZXJhM2Qvc3JjL3Nwcml0ZTNkL1Nwcml0ZTNERmFjdG9yeScpO1xyXG4gICAgUGhhc2VyLkdhbWVPYmplY3RzLkNyZWF0b3JzLlNwcml0ZTNEID0gcmVxdWlyZSgnLi4vcGx1Z2lucy9jYW1lcmEzZC9zcmMvc3ByaXRlM2QvU3ByaXRlM0RDcmVhdG9yJyk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUExVR0lOX0ZCSU5TVEFOVClcclxue1xyXG4gICAgUGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luID0gcmVxdWlyZSgnLi4vcGx1Z2lucy9mYmluc3RhbnQvc3JjL0ZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2luJyk7XHJcbn1cclxuXHJcbi8vICAgTWVyZ2UgaW4gdGhlIGNvbnN0c1xyXG5cclxuUGhhc2VyID0gRXh0ZW5kKGZhbHNlLCBQaGFzZXIsIENPTlNUKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgcm9vdCB0eXBlcyBuYW1lc3BhY2UuXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UeXBlc1xyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqL1xyXG5cclxuLy8gIEV4cG9ydCBpdFxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQaGFzZXI7XHJcblxyXG5nbG9iYWwuUGhhc2VyID0gUGhhc2VyO1xyXG5cclxuLypcclxuICogXCJEb2N1bWVudGF0aW9uIGlzIGxpa2UgcGl6emE6IHdoZW4gaXQgaXMgZ29vZCwgaXQgaXMgdmVyeSwgdmVyeSBnb29kO1xyXG4gKiBhbmQgd2hlbiBpdCBpcyBiYWQsIGl0IGlzIGJldHRlciB0aGFuIG5vdGhpbmcuXCJcclxuICogIC0tIERpY2sgQnJhbmRvblxyXG4gKi9cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4vY29tcG9uZW50cycpO1xyXG52YXIgSW1hZ2UgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9pbWFnZS9JbWFnZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQW4gQXJjYWRlIFBoeXNpY3MgSW1hZ2UgaXMgYW4gSW1hZ2Ugd2l0aCBhbiBBcmNhZGUgUGh5c2ljcyBib2R5IGFuZCByZWxhdGVkIGNvbXBvbmVudHMuXHJcbiAqIFRoZSBib2R5IGNhbiBiZSBkeW5hbWljIG9yIHN0YXRpYy5cclxuICpcclxuICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIEFyY2FkZSBJbWFnZSBhbmQgYW4gQXJjYWRlIFNwcml0ZSBpcyB0aGF0IHlvdSBjYW5ub3QgYW5pbWF0ZSBhbiBBcmNhZGUgSW1hZ2UuXHJcbiAqXHJcbiAqIEBjbGFzcyBJbWFnZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuSW1hZ2VcclxuICogQG1lbWJlcm9mIFBoYXNlci5QaHlzaWNzLkFyY2FkZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkFjY2VsZXJhdGlvblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5Bbmd1bGFyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkJvdW5jZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5EZWJ1Z1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5EcmFnXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkVuYWJsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5GcmljdGlvblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5HcmF2aXR5XHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkltbW92YWJsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5NYXNzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLlNpemVcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuVmVsb2NpdHlcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQWxwaGFcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuQmxlbmRNb2RlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkRlcHRoXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkZsaXBcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuR2V0Qm91bmRzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLk9yaWdpblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5QaXBlbGluZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TY3JvbGxGYWN0b3JcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UZXh0dXJlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRpbnRcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgR2FtZSBPYmplY3QgYmVsb25ncy4gQSBHYW1lIE9iamVjdCBjYW4gb25seSBiZWxvbmcgdG8gb25lIFNjZW5lIGF0IGEgdGltZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKi9cclxudmFyIEFyY2FkZUltYWdlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBJbWFnZSxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFjY2VsZXJhdGlvbixcclxuICAgICAgICBDb21wb25lbnRzLkFuZ3VsYXIsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Cb3VuY2UsXHJcbiAgICAgICAgQ29tcG9uZW50cy5EZWJ1ZyxcclxuICAgICAgICBDb21wb25lbnRzLkRyYWcsXHJcbiAgICAgICAgQ29tcG9uZW50cy5FbmFibGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GcmljdGlvbixcclxuICAgICAgICBDb21wb25lbnRzLkdyYXZpdHksXHJcbiAgICAgICAgQ29tcG9uZW50cy5JbW1vdmFibGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNzLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2l6ZSxcclxuICAgICAgICBDb21wb25lbnRzLlZlbG9jaXR5XHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQXJjYWRlSW1hZ2UgKHNjZW5lLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBJbWFnZS5jYWxsKHRoaXMsIHNjZW5lLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgR2FtZSBPYmplY3QncyBQaHlzaWNzIEJvZHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuSW1hZ2UjYm9keVxyXG4gICAgICAgICAqIEB0eXBlIHs/KFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5KX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBcmNhZGVJbWFnZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRGVnVG9SYWQgPSByZXF1aXJlKCcuLi8uLi9tYXRoL0RlZ1RvUmFkJyk7XHJcbnZhciBEaXN0YW5jZUJldHdlZW4gPSByZXF1aXJlKCcuLi8uLi9tYXRoL2Rpc3RhbmNlL0Rpc3RhbmNlQmV0d2VlbicpO1xyXG52YXIgRGlzdGFuY2VTcXVhcmVkID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9kaXN0YW5jZS9EaXN0YW5jZVNxdWFyZWQnKTtcclxudmFyIEZhY3RvcnkgPSByZXF1aXJlKCcuL0ZhY3RvcnknKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIE1lcmdlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L01lcmdlJyk7XHJcbnZhciBPdmVybGFwQ2lyYyA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9PdmVybGFwQ2lyYycpO1xyXG52YXIgT3ZlcmxhcFJlY3QgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvT3ZlcmxhcFJlY3QnKTtcclxudmFyIFBsdWdpbkNhY2hlID0gcmVxdWlyZSgnLi4vLi4vcGx1Z2lucy9QbHVnaW5DYWNoZScpO1xyXG52YXIgU2NlbmVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9zY2VuZS9ldmVudHMnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxudmFyIFdvcmxkID0gcmVxdWlyZSgnLi9Xb3JsZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEFyY2FkZSBQaHlzaWNzIFBsdWdpbiBiZWxvbmdzIHRvIGEgU2NlbmUgYW5kIHNldHMgdXAgYW5kIG1hbmFnZXMgdGhlIFNjZW5lJ3MgcGh5c2ljcyBzaW11bGF0aW9uLlxyXG4gKiBJdCBhbHNvIGhvbGRzIHNvbWUgdXNlZnVsIG1ldGhvZHMgZm9yIG1vdmluZyBhbmQgcm90YXRpbmcgQXJjYWRlIFBoeXNpY3MgQm9kaWVzLlxyXG4gKlxyXG4gKiBZb3UgY2FuIGFjY2VzcyBpdCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nIGB0aGlzLnBoeXNpY3NgLlxyXG4gKlxyXG4gKiBBcmNhZGUgUGh5c2ljcyB1c2VzIHRoZSBQcm9qZWN0aW9uIE1ldGhvZCBvZiBjb2xsaXNpb24gcmVzb2x1dGlvbiBhbmQgc2VwYXJhdGlvbi4gV2hpbGUgaXQncyBmYXN0IGFuZCBzdWl0YWJsZVxyXG4gKiBmb3IgJ2FyY2FkZScgc3R5bGUgZ2FtZXMgaXQgbGFja3Mgc3RhYmlsaXR5IHdoZW4gbXVsdGlwbGUgb2JqZWN0cyBhcmUgaW4gY2xvc2UgcHJveGltaXR5IG9yIHJlc3RpbmcgdXBvbiBlYWNoIG90aGVyLlxyXG4gKiBUaGUgc2VwYXJhdGlvbiB0aGF0IHN0b3BzIHR3byBvYmplY3RzIHBlbmV0cmF0aW5nIG1heSBjcmVhdGUgYSBuZXcgcGVuZXRyYXRpb24gYWdhaW5zdCBhIGRpZmZlcmVudCBvYmplY3QuIElmIHlvdVxyXG4gKiByZXF1aXJlIGEgaGlnaCBsZXZlbCBvZiBzdGFiaWxpdHkgcGxlYXNlIGNvbnNpZGVyIHVzaW5nIGFuIGFsdGVybmF0aXZlIHBoeXNpY3Mgc3lzdGVtLCBzdWNoIGFzIE1hdHRlci5qcy5cclxuICpcclxuICogQGNsYXNzIEFyY2FkZVBoeXNpY3NcclxuICogQG1lbWJlcm9mIFBoYXNlci5QaHlzaWNzLkFyY2FkZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IHRoaXMgUGx1Z2luIGJlbG9uZ3MgdG8uXHJcbiAqL1xyXG52YXIgQXJjYWRlUGh5c2ljcyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBBcmNhZGVQaHlzaWNzIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhhdCB0aGlzIFBsdWdpbiBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3Mjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFNjZW5lJ3MgU3lzdGVtcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25maWd1cmF0aW9uIG9iamVjdC4gVW5pb24gb2YgdGhlIGBwaHlzaWNzLmFyY2FkZS4qYCBwcm9wZXJ0aWVzIG9mIHRoZSBHYW1lQ29uZmlnIGFuZCBTY2VuZUNvbmZpZyBvYmplY3RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjY29uZmlnXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwaHlzaWNzIHNpbXVsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyN3b3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IGhvbGRpbmcgdGhlIEFyY2FkZSBQaHlzaWNzIGZhY3RvcnkgbWV0aG9kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI2FkZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFkZDtcclxuXHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkJPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHksIG9ubHkgb25jZSwgd2hlbiB0aGUgU2NlbmUgaXMgZmlyc3QgY3JlYXRlZC5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG5ldyBXb3JsZCh0aGlzLnNjZW5lLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgdGhpcy5hZGQgPSBuZXcgRmFjdG9yeSh0aGlzLndvcmxkKTtcclxuXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3Mjc3RhcnRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndvcmxkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JsZCA9IG5ldyBXb3JsZCh0aGlzLnNjZW5lLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkID0gbmV3IEZhY3RvcnkodGhpcy53b3JsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy53b3JsZC51cGRhdGUsIHRoaXMud29ybGQpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vbihTY2VuZUV2ZW50cy5QT1NUX1VQREFURSwgdGhpcy53b3JsZC5wb3N0VXBkYXRlLCB0aGlzLndvcmxkKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub25jZShTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgcGh5c2ljcyBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudCBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI2dldENvbmZpZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcGh5c2ljcyBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBnZXRDb25maWc6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdhbWVDb25maWcgPSB0aGlzLnN5c3RlbXMuZ2FtZS5jb25maWcucGh5c2ljcztcclxuICAgICAgICB2YXIgc2NlbmVDb25maWcgPSB0aGlzLnN5c3RlbXMuc2V0dGluZ3MucGh5c2ljcztcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IE1lcmdlKFxyXG4gICAgICAgICAgICBHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICdhcmNhZGUnLCB7fSksXHJcbiAgICAgICAgICAgIEdldEZhc3RWYWx1ZShnYW1lQ29uZmlnLCAnYXJjYWRlJywge30pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXN0cyBpZiBHYW1lIE9iamVjdHMgb3ZlcmxhcC4gU2VlIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjb3ZlcmxhcH1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI292ZXJsYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gb2JqZWN0MSAtIFRoZSBmaXJzdCBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gW29iamVjdDJdIC0gVGhlIHNlY29uZCBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBjaGVjaywgb3IgYHVuZGVmaW5lZGAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW2NvbGxpZGVDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgb3ZlcmxhcC4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0geyp9IFtjYWxsYmFja0NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdG8gcnVuIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgR2FtZSBPYmplY3Qgb3ZlcmxhcHMgYW5vdGhlci5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNvdmVybGFwXHJcbiAgICAgKi9cclxuICAgIG92ZXJsYXA6IGZ1bmN0aW9uIChvYmplY3QxLCBvYmplY3QyLCBvdmVybGFwQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdmVybGFwQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBvdmVybGFwQ2FsbGJhY2sgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKHByb2Nlc3NDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IHByb2Nlc3NDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2tDb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY2FsbGJhY2tDb250ZXh0ID0gb3ZlcmxhcENhbGxiYWNrOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkLmNvbGxpZGVPYmplY3RzKG9iamVjdDEsIG9iamVjdDIsIG92ZXJsYXBDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIHRydWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgY29sbGlzaW9uIGNoZWNrIGFuZCBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIHR3byBwaHlzaWNzIGVuYWJsZWQgb2JqZWN0cyBnaXZlbiwgd2hpY2ggY2FuIGJlIHNpbmdsZVxyXG4gICAgICogR2FtZSBPYmplY3RzLCBhcnJheXMgb2YgR2FtZSBPYmplY3RzLCBQaHlzaWNzIEdyb3VwcywgYXJyYXlzIG9mIFBoeXNpY3MgR3JvdXBzIG9yIG5vcm1hbCBHcm91cHMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IGRvbid0IHJlcXVpcmUgc2VwYXJhdGlvbiB0aGVuIHVzZSB7QGxpbmsgI292ZXJsYXB9IGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdHdvIEdyb3VwcyBvciBhcnJheXMgYXJlIHBhc3NlZCwgZWFjaCBtZW1iZXIgb2Ygb25lIHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgZWFjaCBtZW1iZXIgb2YgdGhlIG90aGVyLlxyXG4gICAgICpcclxuICAgICAqIElmICoqb25seSoqIG9uZSBHcm91cCBpcyBwYXNzZWQgKGFzIGBvYmplY3QxYCksIGVhY2ggbWVtYmVyIG9mIHRoZSBHcm91cCB3aWxsIGJlIGNvbGxpZGVkIGFnYWluc3QgdGhlIG90aGVyIG1lbWJlcnMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgKipvbmx5Kiogb25lIEFycmF5IGlzIHBhc3NlZCwgdGhlIGFycmF5IGlzIGl0ZXJhdGVkIGFuZCBldmVyeSBlbGVtZW50IGluIGl0IGlzIHRlc3RlZCBhZ2FpbnN0IHRoZSBvdGhlcnMuXHJcbiAgICAgKlxyXG4gICAgICogVHdvIGNhbGxiYWNrcyBjYW4gYmUgcHJvdmlkZWQuIFRoZSBgY29sbGlkZUNhbGxiYWNrYCBpcyBpbnZva2VkIGlmIGEgY29sbGlzaW9uIG9jY3VycyBhbmQgdGhlIHR3byBjb2xsaWRpbmdcclxuICAgICAqIG9iamVjdHMgYXJlIHBhc3NlZCB0byBpdC5cclxuICAgICAqXHJcbiAgICAgKiBBcmNhZGUgUGh5c2ljcyB1c2VzIHRoZSBQcm9qZWN0aW9uIE1ldGhvZCBvZiBjb2xsaXNpb24gcmVzb2x1dGlvbiBhbmQgc2VwYXJhdGlvbi4gV2hpbGUgaXQncyBmYXN0IGFuZCBzdWl0YWJsZVxyXG4gICAgICogZm9yICdhcmNhZGUnIHN0eWxlIGdhbWVzIGl0IGxhY2tzIHN0YWJpbGl0eSB3aGVuIG11bHRpcGxlIG9iamVjdHMgYXJlIGluIGNsb3NlIHByb3hpbWl0eSBvciByZXN0aW5nIHVwb24gZWFjaCBvdGhlci5cclxuICAgICAqIFRoZSBzZXBhcmF0aW9uIHRoYXQgc3RvcHMgdHdvIG9iamVjdHMgcGVuZXRyYXRpbmcgbWF5IGNyZWF0ZSBhIG5ldyBwZW5ldHJhdGlvbiBhZ2FpbnN0IGEgZGlmZmVyZW50IG9iamVjdC4gSWYgeW91XHJcbiAgICAgKiByZXF1aXJlIGEgaGlnaCBsZXZlbCBvZiBzdGFiaWxpdHkgcGxlYXNlIGNvbnNpZGVyIHVzaW5nIGFuIGFsdGVybmF0aXZlIHBoeXNpY3Mgc3lzdGVtLCBzdWNoIGFzIE1hdHRlci5qcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI2NvbGxpZGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gb2JqZWN0MSAtIFRoZSBmaXJzdCBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gW29iamVjdDJdIC0gVGhlIHNlY29uZCBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBjaGVjaywgb3IgYHVuZGVmaW5lZGAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW2NvbGxpZGVDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgY29sbGlkZS4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0geyp9IFtjYWxsYmFja0NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdG8gcnVuIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgR2FtZSBPYmplY3RzIHdlcmUgc2VwYXJhdGVkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZVxyXG4gICAgICovXHJcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiAob2JqZWN0MSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoY29sbGlkZUNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgY29sbGlkZUNhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChwcm9jZXNzQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBwcm9jZXNzQ2FsbGJhY2sgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNhbGxiYWNrQ29udGV4dCA9IGNvbGxpZGVDYWxsYmFjazsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy53b3JsZC5jb2xsaWRlT2JqZWN0cyhvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBmYWxzZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBhZHZhbmNlZCBtZXRob2QgaXMgc3BlY2lmaWNhbGx5IGZvciB0ZXN0aW5nIGZvciBjb2xsaXNpb24gYmV0d2VlbiBhIHNpbmdsZSBTcHJpdGUgYW5kIGFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBZb3Ugc2hvdWxkIGdlbmVyYWxseSB1c2UgdGhlIGBjb2xsaWRlYCBtZXRob2QgaW5zdGVhZCwgd2l0aCBhIFNwcml0ZSB2cy4gYSBUaWxlbWFwIExheWVyLCBhcyB0aGF0IHdpbGwgcGVyZm9ybVxyXG4gICAgICogdGlsZSBmaWx0ZXJpbmcgYW5kIGN1bGxpbmcgZm9yIHlvdSwgYXMgd2VsbCBhcyBoYW5kbGUgdGhlIGludGVyZXN0aW5nIGZhY2UgY29sbGlzaW9uIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgb2ZmZXJlZCBmb3IgdGhvc2Ugd2hvIHdvdWxkIGxpa2UgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbiB3aXRoIHNwZWNpZmljIFRpbGVzIGluIGEgbGF5ZXIsIHdpdGhvdXRcclxuICAgICAqIGhhdmluZyB0byBzZXQgYW55IGNvbGxpc2lvbiBhdHRyaWJ1dGVzIG9uIHRoZSB0aWxlcyBpbiBxdWVzdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIHBlcmZvcm0gcXVpY2sgZHluYW1pYyBjb2xsaXNpb25zXHJcbiAgICAgKiBvbiBzbWFsbCBzZXRzIG9mIFRpbGVzLiBBcyBzdWNoLCBubyBjdWxsaW5nIG9yIGNoZWNrcyBhcmUgbWFkZSB0byB0aGUgYXJyYXkgb2YgVGlsZXMgZ2l2ZW4gdG8gdGhpcyBtZXRob2QsXHJcbiAgICAgKiB5b3Ugc2hvdWxkIGZpbHRlciB0aGVtIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogSW1wb3J0YW50OiBVc2Ugb2YgdGhpcyBtZXRob2Qgc2tpcHMgdGhlIGBpbnRlcmVzdGluZyBmYWNlc2Agc3lzdGVtIHRoYXQgVGlsZW1hcCBMYXllcnMgdXNlLiBUaGlzIG1lYW5zIGlmIHlvdSBoYXZlXHJcbiAgICAgKiBzYXkgYSByb3cgb3IgY29sdW1uIG9mIHRpbGVzLCBhbmQgeW91IGp1bXAgaW50bywgb3Igd2FsayBvdmVyIHRoZW0sIGl0J3MgcG9zc2libGUgdG8gZ2V0IHN0dWNrIG9uIHRoZSBlZGdlcyBvZiB0aGVcclxuICAgICAqIHRpbGVzIGFzIHRoZSBpbnRlcmVzdGluZyBmYWNlIGNhbGN1bGF0aW9ucyBhcmUgc2tpcHBlZC4gSG93ZXZlciwgZm9yIHF1aWNrLWZpcmUgc21hbGwgY29sbGlzaW9uIHNldCB0ZXN0cyBvblxyXG4gICAgICogZHluYW1pYyBtYXBzLCB0aGlzIG1ldGhvZCBjYW4gcHJvdmUgdmVyeSB1c2VmdWwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNjb2xsaWRlVGlsZXNcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1RJTEVfQ09MTElERVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHNwcml0ZSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gdGlsZXMgLSBBbiBhcnJheSBvZiBUaWxlcyB0byBjaGVjayBmb3IgY29sbGlzaW9uIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW2NvbGxpZGVDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgY29sbGlkZS4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0byBydW4gdGhlIGNhbGxiYWNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFueSBvYmplY3RzIG92ZXJsYXAgKHdpdGggYG92ZXJsYXBPbmx5YCk7IG9yIHRydWUgaWYgYW55IG92ZXJsYXBwaW5nIG9iamVjdHMgd2VyZSBzZXBhcmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNvbGxpZGVUaWxlczogZnVuY3Rpb24gKHNwcml0ZSwgdGlsZXMsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuY29sbGlkZVRpbGVzKHNwcml0ZSwgdGlsZXMsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgYWR2YW5jZWQgbWV0aG9kIGlzIHNwZWNpZmljYWxseSBmb3IgdGVzdGluZyBmb3Igb3ZlcmxhcHMgYmV0d2VlbiBhIHNpbmdsZSBTcHJpdGUgYW5kIGFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBZb3Ugc2hvdWxkIGdlbmVyYWxseSB1c2UgdGhlIGBvdmVybGFwYCBtZXRob2QgaW5zdGVhZCwgd2l0aCBhIFNwcml0ZSB2cy4gYSBUaWxlbWFwIExheWVyLCBhcyB0aGF0IHdpbGwgcGVyZm9ybVxyXG4gICAgICogdGlsZSBmaWx0ZXJpbmcgYW5kIGN1bGxpbmcgZm9yIHlvdSwgYXMgd2VsbCBhcyBoYW5kbGUgdGhlIGludGVyZXN0aW5nIGZhY2UgY29sbGlzaW9uIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgb2ZmZXJlZCBmb3IgdGhvc2Ugd2hvIHdvdWxkIGxpa2UgdG8gY2hlY2sgZm9yIG92ZXJsYXBzIHdpdGggc3BlY2lmaWMgVGlsZXMgaW4gYSBsYXllciwgd2l0aG91dFxyXG4gICAgICogaGF2aW5nIHRvIHNldCBhbnkgY29sbGlzaW9uIGF0dHJpYnV0ZXMgb24gdGhlIHRpbGVzIGluIHF1ZXN0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBxdWljayBkeW5hbWljIG92ZXJsYXBcclxuICAgICAqIHRlc3RzIG9uIHNtYWxsIHNldHMgb2YgVGlsZXMuIEFzIHN1Y2gsIG5vIGN1bGxpbmcgb3IgY2hlY2tzIGFyZSBtYWRlIHRvIHRoZSBhcnJheSBvZiBUaWxlcyBnaXZlbiB0byB0aGlzIG1ldGhvZCxcclxuICAgICAqIHlvdSBzaG91bGQgZmlsdGVyIHRoZW0gYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI292ZXJsYXBUaWxlc1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjVElMRV9PVkVSTEFQXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gc3ByaXRlIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSB0aWxlcyAtIEFuIGFycmF5IG9mIFRpbGVzIHRvIGNoZWNrIGZvciBjb2xsaXNpb24gYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgb3ZlcmxhcFRpbGVzOiBmdW5jdGlvbiAoc3ByaXRlLCB0aWxlcywgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53b3JsZC5vdmVybGFwVGlsZXMoc3ByaXRlLCB0aWxlcywgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2VzIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjcGF1c2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gVGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkLnBhdXNlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lcyB0aGUgc2ltdWxhdGlvbiAoaWYgcGF1c2VkKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI3Jlc3VtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfSBUaGUgc2ltdWxhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkLnJlc3VtZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbi54L3kgcHJvcGVydHkgb24gdGhlIGdhbWUgb2JqZWN0IHNvIGl0IHdpbGwgbW92ZSB0b3dhcmRzIHRoZSB4L3kgY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIHJhdGUgKGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQpXHJcbiAgICAgKlxyXG4gICAgICogWW91IG11c3QgZ2l2ZSBhIG1heGltdW0gc3BlZWQgdmFsdWUsIGJleW9uZCB3aGljaCB0aGUgZ2FtZSBvYmplY3Qgd29uJ3QgZ28gYW55IGZhc3Rlci5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBUaGUgZ2FtZSBvYmplY3QgZG9lcyBub3QgY29udGludW91c2x5IHRyYWNrIHRoZSB0YXJnZXQuIElmIHRoZSB0YXJnZXQgY2hhbmdlcyBsb2NhdGlvbiBkdXJpbmcgdHJhbnNpdCB0aGUgZ2FtZSBvYmplY3Qgd2lsbCBub3QgbW9kaWZ5IGl0cyBjb3Vyc2UuXHJcbiAgICAgKiBOb3RlOiBUaGUgZ2FtZSBvYmplY3QgZG9lc24ndCBzdG9wIG1vdmluZyBvbmNlIGl0IHJlYWNoZXMgdGhlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjYWNjZWxlcmF0ZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gQW55IEdhbWUgT2JqZWN0IHdpdGggYW4gQXJjYWRlIFBoeXNpY3MgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBhY2NlbGVyYXRlIHRvd2FyZHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gYWNjZWxlcmF0ZSB0b3dhcmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzcGVlZD02MF0gLSBUaGUgYWNjZWxlcmF0aW9uIChjaGFuZ2UgaW4gc3BlZWQpIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3hTcGVlZE1heD01MDBdIC0gVGhlIG1heGltdW0geCB2ZWxvY2l0eSB0aGUgZ2FtZSBvYmplY3QgY2FuIHJlYWNoLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5U3BlZWRNYXg9NTAwXSAtIFRoZSBtYXhpbXVtIHkgdmVsb2NpdHkgdGhlIGdhbWUgb2JqZWN0IGNhbiByZWFjaC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSAoaW4gcmFkaWFucykgdGhhdCB0aGUgb2JqZWN0IHNob3VsZCBiZSB2aXN1YWxseSBzZXQgdG8gaW4gb3JkZXIgdG8gbWF0Y2ggaXRzIG5ldyB2ZWxvY2l0eS5cclxuICAgICAqL1xyXG4gICAgYWNjZWxlcmF0ZVRvOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgeCwgeSwgc3BlZWQsIHhTcGVlZE1heCwgeVNwZWVkTWF4KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzcGVlZCA9PT0gdW5kZWZpbmVkKSB7IHNwZWVkID0gNjA7IH1cclxuXHJcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMih5IC0gZ2FtZU9iamVjdC55LCB4IC0gZ2FtZU9iamVjdC54KTtcclxuXHJcbiAgICAgICAgZ2FtZU9iamVjdC5ib2R5LmFjY2VsZXJhdGlvbi5zZXRUb1BvbGFyKGFuZ2xlLCBzcGVlZCk7XHJcblxyXG4gICAgICAgIGlmICh4U3BlZWRNYXggIT09IHVuZGVmaW5lZCAmJiB5U3BlZWRNYXggIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdhbWVPYmplY3QuYm9keS5tYXhWZWxvY2l0eS5zZXQoeFNwZWVkTWF4LCB5U3BlZWRNYXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFuZ2xlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbi54L3kgcHJvcGVydHkgb24gdGhlIGdhbWUgb2JqZWN0IHNvIGl0IHdpbGwgbW92ZSB0b3dhcmRzIHRoZSB4L3kgY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIHJhdGUgKGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQpXHJcbiAgICAgKlxyXG4gICAgICogWW91IG11c3QgZ2l2ZSBhIG1heGltdW0gc3BlZWQgdmFsdWUsIGJleW9uZCB3aGljaCB0aGUgZ2FtZSBvYmplY3Qgd29uJ3QgZ28gYW55IGZhc3Rlci5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBUaGUgZ2FtZSBvYmplY3QgZG9lcyBub3QgY29udGludW91c2x5IHRyYWNrIHRoZSB0YXJnZXQuIElmIHRoZSB0YXJnZXQgY2hhbmdlcyBsb2NhdGlvbiBkdXJpbmcgdHJhbnNpdCB0aGUgZ2FtZSBvYmplY3Qgd2lsbCBub3QgbW9kaWZ5IGl0cyBjb3Vyc2UuXHJcbiAgICAgKiBOb3RlOiBUaGUgZ2FtZSBvYmplY3QgZG9lc24ndCBzdG9wIG1vdmluZyBvbmNlIGl0IHJlYWNoZXMgdGhlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjYWNjZWxlcmF0ZVRvT2JqZWN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gQW55IEdhbWUgT2JqZWN0IHdpdGggYW4gQXJjYWRlIFBoeXNpY3MgYm9keS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGRlc3RpbmF0aW9uIC0gVGhlIEdhbWUgT2JqZWN0IHRvIG1vdmUgdG93YXJkcy4gQ2FuIGJlIGFueSBvYmplY3QgYnV0IG11c3QgaGF2ZSB2aXNpYmxlIHgveSBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzcGVlZD02MF0gLSBUaGUgYWNjZWxlcmF0aW9uIChjaGFuZ2UgaW4gc3BlZWQpIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3hTcGVlZE1heD01MDBdIC0gVGhlIG1heGltdW0geCB2ZWxvY2l0eSB0aGUgZ2FtZSBvYmplY3QgY2FuIHJlYWNoLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5U3BlZWRNYXg9NTAwXSAtIFRoZSBtYXhpbXVtIHkgdmVsb2NpdHkgdGhlIGdhbWUgb2JqZWN0IGNhbiByZWFjaC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSAoaW4gcmFkaWFucykgdGhhdCB0aGUgb2JqZWN0IHNob3VsZCBiZSB2aXN1YWxseSBzZXQgdG8gaW4gb3JkZXIgdG8gbWF0Y2ggaXRzIG5ldyB2ZWxvY2l0eS5cclxuICAgICAqL1xyXG4gICAgYWNjZWxlcmF0ZVRvT2JqZWN0OiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgZGVzdGluYXRpb24sIHNwZWVkLCB4U3BlZWRNYXgsIHlTcGVlZE1heClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY2NlbGVyYXRlVG8oZ2FtZU9iamVjdCwgZGVzdGluYXRpb24ueCwgZGVzdGluYXRpb24ueSwgc3BlZWQsIHhTcGVlZE1heCwgeVNwZWVkTWF4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgQm9keSBvciBHYW1lIE9iamVjdCBjbG9zZXN0IHRvIGEgc291cmNlIHBvaW50IG9yIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIGB0YXJnZXRzYCBhcmd1bWVudCBpcyBwYXNzZWQsIHRoaXMgbWV0aG9kIGZpbmRzIHRoZSBjbG9zZXN0IG9mIHRob3NlLlxyXG4gICAgICogVGhlIHRhcmdldHMgY2FuIGJlIEFyY2FkZSBQaHlzaWNzIEdhbWUgT2JqZWN0cywgRHluYW1pYyBCb2RpZXMsIG9yIFN0YXRpYyBCb2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gYHRhcmdldHNgIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhpcyBtZXRob2QgZmluZHMgdGhlIGNsb3Nlc3QgRHluYW1pYyBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIElmIHR3byBvciBtb3JlIHRhcmdldHMgYXJlIHRoZSBleGFjdCBzYW1lIGRpc3RhbmNlIGZyb20gdGhlIHNvdXJjZSBwb2ludCwgb25seSB0aGUgZmlyc3QgdGFyZ2V0XHJcbiAgICAgKiBpcyByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI2Nsb3Nlc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBzb3VyY2UgLSBBbnkgb2JqZWN0IHdpdGggcHVibGljIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMsIHN1Y2ggYXMgYSBHYW1lIE9iamVjdCBvciBHZW9tZXRyeSBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keVtdfFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5W118UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXSl9IFt0YXJnZXRzXSAtIFRoZSB0YXJnZXRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez8oUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl8UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QpfSBUaGUgdGFyZ2V0IGNsb3Nlc3QgdG8gdGhlIGdpdmVuIHNvdXJjZSBwb2ludC5cclxuICAgICAqL1xyXG4gICAgY2xvc2VzdDogZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0cylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRhcmdldHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXRzID0gdGhpcy53b3JsZC5ib2RpZXMuZW50cmllcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgIHZhciBjbG9zZXN0ID0gbnVsbDtcclxuICAgICAgICB2YXIgeCA9IHNvdXJjZS54O1xyXG4gICAgICAgIHZhciB5ID0gc291cmNlLnk7XHJcbiAgICAgICAgdmFyIGxlbiA9IHRhcmdldHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRhcmdldHNbaV07XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gdGFyZ2V0LmJvZHkgfHwgdGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0IHx8IHNvdXJjZSA9PT0gYm9keSB8fCBzb3VyY2UgPT09IGJvZHkuZ2FtZU9iamVjdCB8fCBzb3VyY2UgPT09IGJvZHkuY2VudGVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gRGlzdGFuY2VTcXVhcmVkKHgsIHksIGJvZHkuY2VudGVyLngsIGJvZHkuY2VudGVyLnkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbWluKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgbWluID0gZGlzdGFuY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9zZXN0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHRoZSBCb2R5IG9yIEdhbWUgT2JqZWN0IGZhcnRoZXN0IGZyb20gYSBzb3VyY2UgcG9pbnQgb3Igb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIElmIGEgYHRhcmdldHNgIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhpcyBtZXRob2QgZmluZHMgdGhlIGZhcnRoZXN0IG9mIHRob3NlLlxyXG4gICAgICogVGhlIHRhcmdldHMgY2FuIGJlIEFyY2FkZSBQaHlzaWNzIEdhbWUgT2JqZWN0cywgRHluYW1pYyBCb2RpZXMsIG9yIFN0YXRpYyBCb2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gYHRhcmdldHNgIGFyZ3VtZW50IGlzIHBhc3NlZCwgdGhpcyBtZXRob2QgZmluZHMgdGhlIGZhcnRoZXN0IER5bmFtaWMgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0d28gb3IgbW9yZSB0YXJnZXRzIGFyZSB0aGUgZXhhY3Qgc2FtZSBkaXN0YW5jZSBmcm9tIHRoZSBzb3VyY2UgcG9pbnQsIG9ubHkgdGhlIGZpcnN0IHRhcmdldFxyXG4gICAgICogaXMgcmV0dXJuZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNmdXJ0aGVzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IHNvdXJjZSAtIEFueSBvYmplY3Qgd2l0aCBwdWJsaWMgYHhgIGFuZCBgeWAgcHJvcGVydGllcywgc3VjaCBhcyBhIEdhbWUgT2JqZWN0IG9yIEdlb21ldHJ5IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5W118UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHlbXXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdKX0gW3RhcmdldHNdIC0gVGhlIHRhcmdldHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7PyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keXxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdCl9IFRoZSB0YXJnZXQgZmFydGhlc3QgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIHBvaW50LlxyXG4gICAgICovXHJcbiAgICBmdXJ0aGVzdDogZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0cylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRhcmdldHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXRzID0gdGhpcy53b3JsZC5ib2RpZXMuZW50cmllcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBtYXggPSAtMTtcclxuICAgICAgICB2YXIgZmFydGhlc3QgPSBudWxsO1xyXG4gICAgICAgIHZhciB4ID0gc291cmNlLng7XHJcbiAgICAgICAgdmFyIHkgPSBzb3VyY2UueTtcclxuICAgICAgICB2YXIgbGVuID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0c1tpXTtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSB0YXJnZXQuYm9keSB8fCB0YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoc291cmNlID09PSB0YXJnZXQgfHwgc291cmNlID09PSBib2R5IHx8IHNvdXJjZSA9PT0gYm9keS5nYW1lT2JqZWN0IHx8IHNvdXJjZSA9PT0gYm9keS5jZW50ZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBEaXN0YW5jZVNxdWFyZWQoeCwgeSwgYm9keS5jZW50ZXIueCwgYm9keS5jZW50ZXIueSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiBtYXgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhcnRoZXN0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgbWF4ID0gZGlzdGFuY2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFydGhlc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZSB0aGUgZ2l2ZW4gZGlzcGxheSBvYmplY3QgdG93YXJkcyB0aGUgeC95IGNvb3JkaW5hdGVzIGF0IGEgc3RlYWR5IHZlbG9jaXR5LlxyXG4gICAgICogSWYgeW91IHNwZWNpZnkgYSBtYXhUaW1lIHRoZW4gaXQgd2lsbCBhZGp1c3QgdGhlIHNwZWVkIChvdmVyLXdyaXRpbmcgd2hhdCB5b3Ugc2V0KSBzbyBpdCBhcnJpdmVzIGF0IHRoZSBkZXN0aW5hdGlvbiBpbiB0aGF0IG51bWJlciBvZiBzZWNvbmRzLlxyXG4gICAgICogVGltaW5ncyBhcmUgYXBwcm94aW1hdGUgZHVlIHRvIHRoZSB3YXkgYnJvd3NlciB0aW1lcnMgd29yay4gQWxsb3cgZm9yIGEgdmFyaWFuY2Ugb2YgKy0gNTBtcy5cclxuICAgICAqIE5vdGU6IFRoZSBkaXNwbGF5IG9iamVjdCBkb2VzIG5vdCBjb250aW51b3VzbHkgdHJhY2sgdGhlIHRhcmdldC4gSWYgdGhlIHRhcmdldCBjaGFuZ2VzIGxvY2F0aW9uIGR1cmluZyB0cmFuc2l0IHRoZSBkaXNwbGF5IG9iamVjdCB3aWxsIG5vdCBtb2RpZnkgaXRzIGNvdXJzZS5cclxuICAgICAqIE5vdGU6IFRoZSBkaXNwbGF5IG9iamVjdCBkb2Vzbid0IHN0b3AgbW92aW5nIG9uY2UgaXQgcmVhY2hlcyB0aGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBOb3RlOiBEb2Vzbid0IHRha2UgaW50byBhY2NvdW50IGFjY2VsZXJhdGlvbiwgbWF4VmVsb2NpdHkgb3IgZHJhZyAoaWYgeW91J3ZlIHNldCBkcmFnIG9yIGFjY2VsZXJhdGlvbiB0b28gaGlnaCB0aGlzIG9iamVjdCBtYXkgbm90IG1vdmUgYXQgYWxsKVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjbW92ZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gQW55IEdhbWUgT2JqZWN0IHdpdGggYW4gQXJjYWRlIFBoeXNpY3MgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBtb3ZlIHRvd2FyZHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gbW92ZSB0b3dhcmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzcGVlZD02MF0gLSBUaGUgc3BlZWQgaXQgd2lsbCBtb3ZlLCBpbiBwaXhlbHMgcGVyIHNlY29uZCAoZGVmYXVsdCBpcyA2MCBwaXhlbHMvc2VjKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhUaW1lPTBdIC0gVGltZSBnaXZlbiBpbiBtaWxsaXNlY29uZHMgKDEwMDAgPSAxIHNlYykuIElmIHNldCB0aGUgc3BlZWQgaXMgYWRqdXN0ZWQgc28gdGhlIG9iamVjdCB3aWxsIGFycml2ZSBhdCBkZXN0aW5hdGlvbiBpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIChpbiByYWRpYW5zKSB0aGF0IHRoZSBvYmplY3Qgc2hvdWxkIGJlIHZpc3VhbGx5IHNldCB0byBpbiBvcmRlciB0byBtYXRjaCBpdHMgbmV3IHZlbG9jaXR5LlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG86IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCB4LCB5LCBzcGVlZCwgbWF4VGltZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoc3BlZWQgPT09IHVuZGVmaW5lZCkgeyBzcGVlZCA9IDYwOyB9XHJcbiAgICAgICAgaWYgKG1heFRpbWUgPT09IHVuZGVmaW5lZCkgeyBtYXhUaW1lID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKHkgLSBnYW1lT2JqZWN0LnksIHggLSBnYW1lT2JqZWN0LngpO1xyXG5cclxuICAgICAgICBpZiAobWF4VGltZSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgV2Uga25vdyBob3cgbWFueSBwaXhlbHMgd2UgbmVlZCB0byBtb3ZlLCBidXQgaG93IGZhc3Q/XHJcbiAgICAgICAgICAgIHNwZWVkID0gRGlzdGFuY2VCZXR3ZWVuKGdhbWVPYmplY3QueCwgZ2FtZU9iamVjdC55LCB4LCB5KSAvIChtYXhUaW1lIC8gMTAwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LmJvZHkudmVsb2NpdHkuc2V0VG9Qb2xhcihhbmdsZSwgc3BlZWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gYW5nbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZSB0aGUgZ2l2ZW4gZGlzcGxheSBvYmplY3QgdG93YXJkcyB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGF0IGEgc3RlYWR5IHZlbG9jaXR5LlxyXG4gICAgICogSWYgeW91IHNwZWNpZnkgYSBtYXhUaW1lIHRoZW4gaXQgd2lsbCBhZGp1c3QgdGhlIHNwZWVkIChvdmVyd3JpdGluZyB3aGF0IHlvdSBzZXQpIHNvIGl0IGFycml2ZXMgYXQgdGhlIGRlc3RpbmF0aW9uIGluIHRoYXQgbnVtYmVyIG9mIHNlY29uZHMuXHJcbiAgICAgKiBUaW1pbmdzIGFyZSBhcHByb3hpbWF0ZSBkdWUgdG8gdGhlIHdheSBicm93c2VyIHRpbWVycyB3b3JrLiBBbGxvdyBmb3IgYSB2YXJpYW5jZSBvZiArLSA1MG1zLlxyXG4gICAgICogTm90ZTogVGhlIGRpc3BsYXkgb2JqZWN0IGRvZXMgbm90IGNvbnRpbnVvdXNseSB0cmFjayB0aGUgdGFyZ2V0LiBJZiB0aGUgdGFyZ2V0IGNoYW5nZXMgbG9jYXRpb24gZHVyaW5nIHRyYW5zaXQgdGhlIGRpc3BsYXkgb2JqZWN0IHdpbGwgbm90IG1vZGlmeSBpdHMgY291cnNlLlxyXG4gICAgICogTm90ZTogVGhlIGRpc3BsYXkgb2JqZWN0IGRvZXNuJ3Qgc3RvcCBtb3Zpbmcgb25jZSBpdCByZWFjaGVzIHRoZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcy5cclxuICAgICAqIE5vdGU6IERvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgYWNjZWxlcmF0aW9uLCBtYXhWZWxvY2l0eSBvciBkcmFnIChpZiB5b3UndmUgc2V0IGRyYWcgb3IgYWNjZWxlcmF0aW9uIHRvbyBoaWdoIHRoaXMgb2JqZWN0IG1heSBub3QgbW92ZSBhdCBhbGwpXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNtb3ZlVG9PYmplY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBBbnkgR2FtZSBPYmplY3Qgd2l0aCBhbiBBcmNhZGUgUGh5c2ljcyBib2R5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRlc3RpbmF0aW9uIC0gQW55IG9iamVjdCB3aXRoIHB1YmxpYyBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLCBzdWNoIGFzIGEgR2FtZSBPYmplY3Qgb3IgR2VvbWV0cnkgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzcGVlZD02MF0gLSBUaGUgc3BlZWQgaXQgd2lsbCBtb3ZlLCBpbiBwaXhlbHMgcGVyIHNlY29uZCAoZGVmYXVsdCBpcyA2MCBwaXhlbHMvc2VjKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhUaW1lPTBdIC0gVGltZSBnaXZlbiBpbiBtaWxsaXNlY29uZHMgKDEwMDAgPSAxIHNlYykuIElmIHNldCB0aGUgc3BlZWQgaXMgYWRqdXN0ZWQgc28gdGhlIG9iamVjdCB3aWxsIGFycml2ZSBhdCBkZXN0aW5hdGlvbiBpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIChpbiByYWRpYW5zKSB0aGF0IHRoZSBvYmplY3Qgc2hvdWxkIGJlIHZpc3VhbGx5IHNldCB0byBpbiBvcmRlciB0byBtYXRjaCBpdHMgbmV3IHZlbG9jaXR5LlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG9PYmplY3Q6IGZ1bmN0aW9uIChnYW1lT2JqZWN0LCBkZXN0aW5hdGlvbiwgc3BlZWQsIG1heFRpbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW92ZVRvKGdhbWVPYmplY3QsIGRlc3RpbmF0aW9uLngsIGRlc3RpbmF0aW9uLnksIHNwZWVkLCBtYXhUaW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGFuZCBzcGVlZCBjYWxjdWxhdGUgdGhlIHZlbG9jaXR5IGFuZCByZXR1cm4gaXQgYXMgYSB2ZWN0b3IsIG9yIHNldCBpdCB0byB0aGUgZ2l2ZW4gdmVjdG9yIG9iamVjdC5cclxuICAgICAqIE9uZSB3YXkgdG8gdXNlIHRoaXMgaXM6IHZlbG9jaXR5RnJvbUFuZ2xlKGFuZ2xlLCAyMDAsIHNwcml0ZS5ib2R5LnZlbG9jaXR5KSB3aGljaCB3aWxsIHNldCB0aGUgdmFsdWVzIGRpcmVjdGx5IHRvIHRoZSBzcHJpdGUncyB2ZWxvY2l0eSBhbmQgbm90IGNyZWF0ZSBhIG5ldyB2ZWN0b3Igb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3MjdmVsb2NpdHlGcm9tQW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiBkZWdyZWVzIGNhbGN1bGF0ZWQgaW4gY2xvY2t3aXNlIHBvc2l0aXZlIGRpcmVjdGlvbiAoZG93biA9IDkwIGRlZ3JlZXMgcG9zaXRpdmUsIHJpZ2h0ID0gMCBkZWdyZWVzIHBvc2l0aXZlLCB1cCA9IDkwIGRlZ3JlZXMgbmVnYXRpdmUpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NwZWVkPTYwXSAtIFRoZSBzcGVlZCBpdCB3aWxsIG1vdmUsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFt2ZWMyXSAtIFRoZSBWZWN0b3IyIGluIHdoaWNoIHRoZSB4IGFuZCB5IHByb3BlcnRpZXMgd2lsbCBiZSBzZXQgdG8gdGhlIGNhbGN1bGF0ZWQgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn0gVGhlIFZlY3RvcjIgdGhhdCBzdG9yZXMgdGhlIHZlbG9jaXR5LlxyXG4gICAgICovXHJcbiAgICB2ZWxvY2l0eUZyb21BbmdsZTogZnVuY3Rpb24gKGFuZ2xlLCBzcGVlZCwgdmVjMilcclxuICAgIHtcclxuICAgICAgICBpZiAoc3BlZWQgPT09IHVuZGVmaW5lZCkgeyBzcGVlZCA9IDYwOyB9XHJcbiAgICAgICAgaWYgKHZlYzIgPT09IHVuZGVmaW5lZCkgeyB2ZWMyID0gbmV3IFZlY3RvcjIoKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmVjMi5zZXRUb1BvbGFyKERlZ1RvUmFkKGFuZ2xlKSwgc3BlZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIHRoZSByb3RhdGlvbiAoaW4gcmFkaWFucykgYW5kIHNwZWVkIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYW5kIHJldHVybiBpdCBhcyBhIHZlY3Rvciwgb3Igc2V0IGl0IHRvIHRoZSBnaXZlbiB2ZWN0b3Igb2JqZWN0LlxyXG4gICAgICogT25lIHdheSB0byB1c2UgdGhpcyBpczogdmVsb2NpdHlGcm9tUm90YXRpb24ocm90YXRpb24sIDIwMCwgc3ByaXRlLmJvZHkudmVsb2NpdHkpIHdoaWNoIHdpbGwgc2V0IHRoZSB2YWx1ZXMgZGlyZWN0bHkgdG8gdGhlIHNwcml0ZSdzIHZlbG9jaXR5IGFuZCBub3QgY3JlYXRlIGEgbmV3IHZlY3RvciBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyN2ZWxvY2l0eUZyb21Sb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0aW9uIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NwZWVkPTYwXSAtIFRoZSBzcGVlZCBpdCB3aWxsIG1vdmUsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWRcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW3ZlYzJdIC0gVGhlIFZlY3RvcjIgaW4gd2hpY2ggdGhlIHggYW5kIHkgcHJvcGVydGllcyB3aWxsIGJlIHNldCB0byB0aGUgY2FsY3VsYXRlZCB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgVmVjdG9yMiB0aGF0IHN0b3JlcyB0aGUgdmVsb2NpdHkuXHJcbiAgICAgKi9cclxuICAgIHZlbG9jaXR5RnJvbVJvdGF0aW9uOiBmdW5jdGlvbiAocm90YXRpb24sIHNwZWVkLCB2ZWMyKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzcGVlZCA9PT0gdW5kZWZpbmVkKSB7IHNwZWVkID0gNjA7IH1cclxuICAgICAgICBpZiAodmVjMiA9PT0gdW5kZWZpbmVkKSB7IHZlYzIgPSBuZXcgVmVjdG9yMigpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB2ZWMyLnNldFRvUG9sYXIocm90YXRpb24sIHNwZWVkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNlYXJjaCB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBwaHlzaWNzIGJvZGllcyB0aGF0XHJcbiAgICAgKiBvdmVybGFwIHdpdGggaXQuIEl0IGNhbiByZXR1cm4gZWl0aGVyIER5bmFtaWMsIFN0YXRpYyBib2RpZXMgb3IgYSBtaXh0dXJlIG9mIGJvdGguXHJcbiAgICAgKlxyXG4gICAgICogQSBib2R5IG9ubHkgaGFzIHRvIGludGVyc2VjdCB3aXRoIHRoZSBzZWFyY2ggYXJlYSB0byBiZSBjb25zaWRlcmVkLCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZnVsbHlcclxuICAgICAqIGNvbnRhaW5lZCB3aXRoaW4gaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgQXJjYWRlIFBoeXNpY3MgaXMgc2V0IHRvIHVzZSB0aGUgUlRyZWUgKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpIHRoZW4gdGhlIHNlYXJjaCBmb3IgaXMgZXh0cmVtZWx5IGZhc3QsXHJcbiAgICAgKiBvdGhlcndpc2UgdGhlIHNlYXJjaCBpcyBPKE4pIGZvciBEeW5hbWljIEJvZGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5BcmNhZGVQaHlzaWNzI292ZXJsYXBSZWN0XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdG9wLWxlZnQgeCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0b3AtbGVmdCB5IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gc2VhcmNoIHdpdGhpbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYXJlYSB0byBzZWFyY2ggd2l0aGluLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgdG8gc2VhcmNoIHdpdGhpbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVEeW5hbWljPXRydWVdIC0gU2hvdWxkIHRoZSBzZWFyY2ggaW5jbHVkZSBEeW5hbWljIEJvZGllcz9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVTdGF0aWM9ZmFsc2VdIC0gU2hvdWxkIHRoZSBzZWFyY2ggaW5jbHVkZSBTdGF0aWMgQm9kaWVzP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keVtdfFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5W10pfSBBbiBhcnJheSBvZiBib2RpZXMgdGhhdCBvdmVybGFwIHdpdGggdGhlIGdpdmVuIGFyZWEuXHJcbiAgICAgKi9cclxuICAgIG92ZXJsYXBSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgaW5jbHVkZUR5bmFtaWMsIGluY2x1ZGVTdGF0aWMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE92ZXJsYXBSZWN0KHRoaXMud29ybGQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGluY2x1ZGVEeW5hbWljLCBpbmNsdWRlU3RhdGljKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNlYXJjaCB0aGUgZ2l2ZW4gY2lyY3VsYXIgYXJlYSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBwaHlzaWNzIGJvZGllcyB0aGF0XHJcbiAgICAgKiBvdmVybGFwIHdpdGggaXQuIEl0IGNhbiByZXR1cm4gZWl0aGVyIER5bmFtaWMsIFN0YXRpYyBib2RpZXMgb3IgYSBtaXh0dXJlIG9mIGJvdGguXHJcbiAgICAgKlxyXG4gICAgICogQSBib2R5IG9ubHkgaGFzIHRvIGludGVyc2VjdCB3aXRoIHRoZSBzZWFyY2ggYXJlYSB0byBiZSBjb25zaWRlcmVkLCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZnVsbHlcclxuICAgICAqIGNvbnRhaW5lZCB3aXRoaW4gaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgQXJjYWRlIFBoeXNpY3MgaXMgc2V0IHRvIHVzZSB0aGUgUlRyZWUgKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpIHRoZW4gdGhlIHNlYXJjaCBpcyByYXRoZXIgZmFzdCxcclxuICAgICAqIG90aGVyd2lzZSB0aGUgc2VhcmNoIGlzIE8oTikgZm9yIER5bmFtaWMgQm9kaWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVBoeXNpY3Mjb3ZlcmxhcENpcmNcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJlYSB0byBzZWFyY2ggd2l0aGluLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyZWEgdG8gc2VhcmNoIHdpdGhpbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlRHluYW1pYz10cnVlXSAtIFNob3VsZCB0aGUgc2VhcmNoIGluY2x1ZGUgRHluYW1pYyBCb2RpZXM/XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlU3RhdGljPWZhbHNlXSAtIFNob3VsZCB0aGUgc2VhcmNoIGluY2x1ZGUgU3RhdGljIEJvZGllcz9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHlbXXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keVtdKX0gQW4gYXJyYXkgb2YgYm9kaWVzIHRoYXQgb3ZlcmxhcCB3aXRoIHRoZSBnaXZlbiBhcmVhLlxyXG4gICAgICovXHJcbiAgICBvdmVybGFwQ2lyYzogZnVuY3Rpb24gKHgsIHksIHJhZGl1cywgaW5jbHVkZUR5bmFtaWMsIGluY2x1ZGVTdGF0aWMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE92ZXJsYXBDaXJjKHRoaXMud29ybGQsIHgsIHksIHJhZGl1cywgaW5jbHVkZUR5bmFtaWMsIGluY2x1ZGVTdGF0aWMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgc2h1dHRpbmcgZG93bi5cclxuICAgICAqIFdlIG5lZWQgdG8ga2lsbCBhbmQgcmVzZXQgYWxsIGludGVybmFsIHByb3BlcnRpZXMgYXMgd2VsbCBhcyBzdG9wIGxpc3RlbmluZyB0byBTY2VuZSBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNzaHV0ZG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNodXRkb3duOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy53b3JsZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBBbHJlYWR5IGRlc3Ryb3llZFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5VUERBVEUsIHRoaXMud29ybGQudXBkYXRlLCB0aGlzLndvcmxkKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBPU1RfVVBEQVRFLCB0aGlzLndvcmxkLnBvc3RVcGRhdGUsIHRoaXMud29ybGQpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZC5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy53b3JsZC5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkID0gbnVsbDtcclxuICAgICAgICB0aGlzLndvcmxkID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU2NlbmUgdGhhdCBvd25zIHRoaXMgcGx1Z2luIGlzIGJlaW5nIGRlc3Ryb3llZC5cclxuICAgICAqIFdlIG5lZWQgdG8gc2h1dGRvd24gYW5kIHRoZW4ga2lsbCBvZmYgYWxsIGV4dGVybmFsIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljcyNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmV2ZW50cy5vZmYoU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5QbHVnaW5DYWNoZS5yZWdpc3RlcignQXJjYWRlUGh5c2ljcycsIEFyY2FkZVBoeXNpY3MsICdhcmNhZGVQaHlzaWNzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFyY2FkZVBoeXNpY3M7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMnKTtcclxudmFyIFNwcml0ZSA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL3Nwcml0ZS9TcHJpdGUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEFuIEFyY2FkZSBQaHlzaWNzIFNwcml0ZSBpcyBhIFNwcml0ZSB3aXRoIGFuIEFyY2FkZSBQaHlzaWNzIGJvZHkgYW5kIHJlbGF0ZWQgY29tcG9uZW50cy5cclxuICogVGhlIGJvZHkgY2FuIGJlIGR5bmFtaWMgb3Igc3RhdGljLlxyXG4gKlxyXG4gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYW4gQXJjYWRlIFNwcml0ZSBhbmQgYW4gQXJjYWRlIEltYWdlIGlzIHRoYXQgeW91IGNhbm5vdCBhbmltYXRlIGFuIEFyY2FkZSBJbWFnZS5cclxuICogSWYgeW91IGRvIG5vdCByZXF1aXJlIGFuaW1hdGlvbiB0aGVuIHlvdSBjYW4gc2FmZWx5IHVzZSBBcmNhZGUgSW1hZ2VzIGluc3RlYWQgb2YgQXJjYWRlIFNwcml0ZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBTcHJpdGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuQXJjYWRlXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQWNjZWxlcmF0aW9uXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkFuZ3VsYXJcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQm91bmNlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRlYnVnXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRyYWdcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRW5hYmxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkZyaWN0aW9uXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkdyYXZpdHlcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuSW1tb3ZhYmxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLk1hc3NcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLiBBIEdhbWUgT2JqZWN0IGNhbiBvbmx5IGJlbG9uZyB0byBvbmUgU2NlbmUgYXQgYSB0aW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAqL1xyXG52YXIgQXJjYWRlU3ByaXRlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBTcHJpdGUsXHJcblxyXG4gICAgTWl4aW5zOiBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5BY2NlbGVyYXRpb24sXHJcbiAgICAgICAgQ29tcG9uZW50cy5Bbmd1bGFyLFxyXG4gICAgICAgIENvbXBvbmVudHMuQm91bmNlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVidWcsXHJcbiAgICAgICAgQ29tcG9uZW50cy5EcmFnLFxyXG4gICAgICAgIENvbXBvbmVudHMuRW5hYmxlLFxyXG4gICAgICAgIENvbXBvbmVudHMuRnJpY3Rpb24sXHJcbiAgICAgICAgQ29tcG9uZW50cy5HcmF2aXR5LFxyXG4gICAgICAgIENvbXBvbmVudHMuSW1tb3ZhYmxlLFxyXG4gICAgICAgIENvbXBvbmVudHMuTWFzcyxcclxuICAgICAgICBDb21wb25lbnRzLlNpemUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEFyY2FkZVNwcml0ZSAoc2NlbmUsIHgsIHksIHRleHR1cmUsIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIFNwcml0ZS5jYWxsKHRoaXMsIHNjZW5lLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgR2FtZSBPYmplY3QncyBQaHlzaWNzIEJvZHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3ByaXRlI2JvZHlcclxuICAgICAgICAgKiBAdHlwZSB7PyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQXJjYWRlU3ByaXRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBCZW5qYW1pbiBELiBSaWNoYXJkcyA8YmVuamFtaW5kcmljaGFyZHNAZ21haWwuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIFJhZFRvRGVnID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9SYWRUb0RlZycpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBSZWN0YW5nbGVDb250YWlucyA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL0NvbnRhaW5zJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIER5bmFtaWMgQXJjYWRlIEJvZHkuXHJcbiAqXHJcbiAqIEl0cyBzdGF0aWMgY291bnRlcnBhcnQgaXMge0BsaW5rIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fS5cclxuICpcclxuICogQGNsYXNzIEJvZHlcclxuICogQG1lbWJlcm9mIFBoYXNlci5QaHlzaWNzLkFyY2FkZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfSB3b3JsZCAtIFRoZSBBcmNhZGUgUGh5c2ljcyBzaW11bGF0aW9uIHRoaXMgQm9keSBiZWxvbmdzIHRvLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRoaXMgQm9keSBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIEJvZHkgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQm9keSAod29ybGQsIGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHdpZHRoID0gKGdhbWVPYmplY3QuZGlzcGxheVdpZHRoKSA/IGdhbWVPYmplY3QuZGlzcGxheVdpZHRoIDogNjQ7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IChnYW1lT2JqZWN0LmRpc3BsYXlIZWlnaHQpID8gZ2FtZU9iamVjdC5kaXNwbGF5SGVpZ2h0IDogNjQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBBcmNhZGUgUGh5c2ljcyBzaW11bGF0aW9uIHRoaXMgQm9keSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjd29ybGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud29ybGQgPSB3b3JsZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEdhbWUgT2JqZWN0IHRoaXMgQm9keSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZ2FtZU9iamVjdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWVPYmplY3QgPSBnYW1lT2JqZWN0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbnMgYXBwbGllZCB0byB0aGlzIEJvZHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN0cmFuc2Zvcm1cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xyXG4gICAgICAgICAgICB4OiBnYW1lT2JqZWN0LngsXHJcbiAgICAgICAgICAgIHk6IGdhbWVPYmplY3QueSxcclxuICAgICAgICAgICAgcm90YXRpb246IGdhbWVPYmplY3QuYW5nbGUsXHJcbiAgICAgICAgICAgIHNjYWxlWDogZ2FtZU9iamVjdC5zY2FsZVgsXHJcbiAgICAgICAgICAgIHNjYWxlWTogZ2FtZU9iamVjdC5zY2FsZVksXHJcbiAgICAgICAgICAgIGRpc3BsYXlPcmlnaW5YOiBnYW1lT2JqZWN0LmRpc3BsYXlPcmlnaW5YLFxyXG4gICAgICAgICAgICBkaXNwbGF5T3JpZ2luWTogZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIEJvZHkncyBib3VuZGFyeSBpcyBkcmF3biB0byB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2RlYnVnU2hvd0JvZHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlYnVnU2hvd0JvZHkgPSB3b3JsZC5kZWZhdWx0cy5kZWJ1Z1Nob3dCb2R5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBCb2R5J3MgdmVsb2NpdHkgaXMgZHJhd24gdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWJ1Z1Nob3dWZWxvY2l0eVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVidWdTaG93VmVsb2NpdHkgPSB3b3JsZC5kZWZhdWx0cy5kZWJ1Z1Nob3dWZWxvY2l0eTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIG9mIHRoaXMgQm9keSBvbiB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2RlYnVnQm9keUNvbG9yXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0JvZHlDb2xvciA9IHdvcmxkLmRlZmF1bHRzLmJvZHlEZWJ1Z0NvbG9yO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSBpcyB1cGRhdGVkIGJ5IHRoZSBwaHlzaWNzIHNpbXVsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNlbmFibGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbmFibGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSdzIGJvdW5kYXJ5IGlzIGNpcmN1bGFyICh0cnVlKSBvciByZWN0YW5ndWxhciAoZmFsc2UpLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjaXNDaXJjbGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0Q2lyY2xlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc0NpcmNsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIEJvZHkgaXMgY2lyY3VsYXIsIHRoaXMgaXMgdGhlIHVuc2NhbGVkIHJhZGl1cyBvZiB0aGUgQm9keSdzIGJvdW5kYXJ5LCBhcyBzZXQgYnkgc2V0Q2lyY2xlKCksIGluIHNvdXJjZSBwaXhlbHMuXHJcbiAgICAgICAgICogVGhlIHRydWUgcmFkaXVzIGlzIGVxdWFsIHRvIGBoYWxmV2lkdGhgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcmFkaXVzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRDaXJjbGVcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJhZGl1cyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhpcyBCb2R5J3MgcG9zaXRpb24gZnJvbSBpdHMgR2FtZSBPYmplY3QncyBwb3NpdGlvbiwgaW4gc291cmNlIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29mZnNldFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0T2Zmc2V0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBCb2R5IHdpdGhpbiB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3Bvc2l0aW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnggLSBnYW1lT2JqZWN0LnNjYWxlWCAqIGdhbWVPYmplY3QuZGlzcGxheU9yaWdpblgsXHJcbiAgICAgICAgICAgIGdhbWVPYmplY3QueSAtIGdhbWVPYmplY3Quc2NhbGVZICogZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwb3NpdGlvbiBvZiB0aGlzIEJvZHkgZHVyaW5nIHRoZSBwcmV2aW91cyBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcHJldlxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJldiA9IG5ldyBWZWN0b3IyKGdhbWVPYmplY3QueCwgZ2FtZU9iamVjdC55KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoaXMgQm9keSBkdXJpbmcgdGhlIHByZXZpb3VzIGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcHJldkZyYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJldkZyYW1lID0gbmV3IFZlY3RvcjIoZ2FtZU9iamVjdC54LCBnYW1lT2JqZWN0LnkpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSdzIGByb3RhdGlvbmAgaXMgYWZmZWN0ZWQgYnkgaXRzIGFuZ3VsYXIgYWNjZWxlcmF0aW9uIGFuZCBhbmd1bGFyIHZlbG9jaXR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYWxsb3dSb3RhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFsbG93Um90YXRpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIGJvZHkncyByb3RhdGlvbiwgaW4gZGVncmVlcywgYmFzZWQgb24gaXRzIGFuZ3VsYXIgYWNjZWxlcmF0aW9uIGFuZCBhbmd1bGFyIHZlbG9jaXR5LlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3Mgcm90YXRpb24gY29udHJvbHMgdGhlIGBhbmdsZWAgb2YgaXRzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIEl0IGRvZXNuJ3Qgcm90YXRlIHRoZSBCb2R5J3MgYm91bmRhcnksIHdoaWNoIGlzIGFsd2F5cyBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlIG9yIGEgY2lyY2xlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcm90YXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSBnYW1lT2JqZWN0LmFuZ2xlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQm9keSByb3RhdGlvbiwgaW4gZGVncmVlcywgZHVyaW5nIHRoZSBwcmV2aW91cyBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcHJlUm90YXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJlUm90YXRpb24gPSBnYW1lT2JqZWN0LmFuZ2xlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIEJvZHkgYm91bmRhcnksIGluIHBpeGVscy5cclxuICAgICAgICAgKiBJZiB0aGUgQm9keSBpcyBjaXJjdWxhciwgdGhpcyBpcyBhbHNvIHRoZSBkaWFtZXRlci5cclxuICAgICAgICAgKiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIHdpZHRoIHVzZSB0aGUgYEJvZHkuc2V0U2l6ZWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjd2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDY0XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBCb2R5IGJvdW5kYXJ5LCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICogSWYgdGhlIEJvZHkgaXMgY2lyY3VsYXIsIHRoaXMgaXMgYWxzbyB0aGUgZGlhbWV0ZXIuXHJcbiAgICAgICAgICogSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBoZWlnaHQgdXNlIHRoZSBgQm9keS5zZXRTaXplYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDY0XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB1bnNjYWxlZCB3aWR0aCBvZiB0aGUgQm9keSwgaW4gc291cmNlIHBpeGVscywgYXMgc2V0IGJ5IHNldFNpemUoKS5cclxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpcyB0aGUgd2lkdGggb2YgdGhlIEJvZHkncyBHYW1lIE9iamVjdCdzIHRleHR1cmUgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzb3VyY2VXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRTaXplXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2VXaWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdW5zY2FsZWQgaGVpZ2h0IG9mIHRoZSBCb2R5LCBpbiBzb3VyY2UgcGl4ZWxzLCBhcyBzZXQgYnkgc2V0U2l6ZSgpLlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIHRoZSBoZWlnaHQgb2YgdGhlIEJvZHkncyBHYW1lIE9iamVjdCdzIHRleHR1cmUgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzb3VyY2VIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0U2l6ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc291cmNlSGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5mcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlV2lkdGggPSBnYW1lT2JqZWN0LmZyYW1lLnJlYWxXaWR0aDtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VIZWlnaHQgPSBnYW1lT2JqZWN0LmZyYW1lLnJlYWxIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIYWxmIHRoZSBCb2R5J3Mgd2lkdGgsIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2hhbGZXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oYWxmV2lkdGggPSBNYXRoLmFicyh3aWR0aCAvIDIpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIYWxmIHRoZSBCb2R5J3MgaGVpZ2h0LCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNoYWxmSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhhbGZIZWlnaHQgPSBNYXRoLmFicyhoZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNlbnRlciBvZiB0aGUgQm9keSdzIGJvdW5kYXJ5LlxyXG4gICAgICAgICAqIFRoZSBtaWRwb2ludCBvZiBpdHMgYHBvc2l0aW9uYCAodG9wLWxlZnQgY29ybmVyKSBhbmQgaXRzIGJvdHRvbS1yaWdodCBjb3JuZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNjZW50ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKHRoaXMucG9zaXRpb24ueCArIHRoaXMuaGFsZldpZHRoLCB0aGlzLnBvc2l0aW9uLnkgKyB0aGlzLmhhbGZIZWlnaHQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQm9keSdzIHZlbG9jaXR5LCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3ZlbG9jaXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZWxvY2l0eSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgY2hhbmdlIGluIHBvc2l0aW9uIChkdWUgdG8gdmVsb2NpdHkpIGF0IHRoZSBsYXN0IHN0ZXAsIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBzaXplIG9mIHRoaXMgdmFsdWUgZGVwZW5kcyBvbiB0aGUgc2ltdWxhdGlvbidzIHN0ZXAgcmF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I25ld1ZlbG9jaXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uZXdWZWxvY2l0eSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgYWJzb2x1dGUgbWF4aW11bSBjaGFuZ2UgaW4gcG9zaXRpb24sIGluIHBpeGVscyBwZXIgc3RlcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2RlbHRhTWF4XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWx0YU1heCA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgY2hhbmdlIGluIHZlbG9jaXR5LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYWNjZWxlcmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY2NlbGVyYXRpb24gPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSdzIHZlbG9jaXR5IGlzIGFmZmVjdGVkIGJ5IGl0cyBgZHJhZ2AuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNhbGxvd0RyYWdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbGxvd0RyYWcgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGVuIGB1c2VEYW1waW5nYCBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGlzIGlzIGFic29sdXRlIGxvc3Mgb2YgdmVsb2NpdHkgZHVlIHRvIG1vdmVtZW50LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkIChhIHZlY3RvcikuXHJcbiAgICAgICAgICogVGhlIHggYW5kIHkgY29tcG9uZW50cyBhcmUgYXBwbGllZCBzZXBhcmF0ZWx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogV2hlbiBgdXNlRGFtcGluZ2AgaXMgdHJ1ZSwgdGhpcyBpcyAxIG1pbnVzIHRoZSBkYW1waW5nIGZhY3RvciAoYSBudW1iZXIpLlxyXG4gICAgICAgICAqIEEgdmFsdWUgb2YgMSBtZWFucyB0aGUgQm9keSBsb3NlcyBubyB2ZWxvY2l0eS5cclxuICAgICAgICAgKiBBIHZhbHVlIG9mIDAuOTUgbWVhbnMgdGhlIEJvZHkgbG9zZXMgNSUgb2YgaXRzIHZlbG9jaXR5IHBlciBzdGVwLlxyXG4gICAgICAgICAqIEEgdmFsdWUgb2YgMC41IG1lYW5zIHRoZSBCb2R5IGxvc2VzIDUwJSBvZiBpdHMgdmVsb2NpdHkgcGVyIHN0ZXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBEcmFnIGlzIGFwcGxpZWQgb25seSB3aGVuIGBhY2NlbGVyYXRpb25gIGlzIHplcm8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkcmFnXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuTWF0aC5WZWN0b3IyfG51bWJlcil9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kcmFnID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIEJvZHkncyBwb3NpdGlvbiBpcyBhZmZlY3RlZCBieSBncmF2aXR5IChsb2NhbCBvciB3b3JsZCkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNhbGxvd0dyYXZpdHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNncmF2aXR5XHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjZ3Jhdml0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWxsb3dHcmF2aXR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWNjZWxlcmF0aW9uIGR1ZSB0byBncmF2aXR5IChzcGVjaWZpYyB0byB0aGlzIEJvZHkpLCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICAgICAqIFRvdGFsIGdyYXZpdHkgaXMgdGhlIHN1bSBvZiB0aGlzIHZlY3RvciBhbmQgdGhlIHNpbXVsYXRpb24ncyBgZ3Jhdml0eWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNncmF2aXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjZ3Jhdml0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ3Jhdml0eSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlYm91bmQgZm9sbG93aW5nIGEgY29sbGlzaW9uLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYm91bmNlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib3VuY2UgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWJvdW5kIGZvbGxvd2luZyBhIGNvbGxpc2lvbiB3aXRoIHRoZSB3b3JsZCBib3VuZGFyeSwgcmVsYXRpdmUgdG8gMS5cclxuICAgICAgICAgKiBJZiBudWxsLCBgYm91bmNlYCBpcyB1c2VkIGluc3RlYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN3b3JsZEJvdW5jZVxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZEJvdW5jZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZWN0YW5nbGUgdXNlZCBmb3Igd29ybGQgYm91bmRhcnkgY29sbGlzaW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRoZSB3b3JsZCBib3VuZGFyeSByZWN0YW5nbGUuIE9yLCBpZiB0aGlzIEJvZHkgd2FzXHJcbiAgICAgICAgICogY3JlYXRlZCBieSBhIFBoeXNpY3MgR3JvdXAsIHRoZW4gd2hhdGV2ZXIgcmVjdGFuZ2xlIHRoYXQgR3JvdXAgZGVmaW5lZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBjYW4gYWxzbyBjaGFuZ2UgaXQgYnkgdXNpbmcgdGhlIGBCb2R5LnNldEJvdW5kc1JlY3RhbmdsZWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjY3VzdG9tQm91bmRzUmVjdGFuZ2xlXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuR2VvbS5SZWN0YW5nbGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1c3RvbUJvdW5kc1JlY3RhbmdsZSA9IHdvcmxkLmJvdW5kcztcclxuXHJcbiAgICAgICAgLy8gIElmIHRydWUgdGhpcyBCb2R5IHdpbGwgZGlzcGF0Y2ggZXZlbnRzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbXVsYXRpb24gZW1pdHMgYSBgd29ybGRib3VuZHNgIGV2ZW50IHdoZW4gdGhpcyBCb2R5IGNvbGxpZGVzIHdpdGggdGhlIHdvcmxkIGJvdW5kYXJ5IChhbmQgYGNvbGxpZGVXb3JsZEJvdW5kc2AgaXMgYWxzbyB0cnVlKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uV29ybGRCb3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI1dPUkxEX0JPVU5EU1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25Xb3JsZEJvdW5kcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzaW11bGF0aW9uIGVtaXRzIGEgYGNvbGxpZGVgIGV2ZW50IHdoZW4gdGhpcyBCb2R5IGNvbGxpZGVzIHdpdGggYW5vdGhlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uQ29sbGlkZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjQ09MTElERVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25Db2xsaWRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbXVsYXRpb24gZW1pdHMgYW4gYG92ZXJsYXBgIGV2ZW50IHdoZW4gdGhpcyBCb2R5IG92ZXJsYXBzIHdpdGggYW5vdGhlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uT3ZlcmxhcFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjT1ZFUkxBUFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25PdmVybGFwID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgYWJzb2x1dGUgbWF4aW11bSB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXHJcbiAgICAgICAgICogVGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvbXBvbmVudHMgYXJlIGFwcGxpZWQgc2VwYXJhdGVseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I21heFZlbG9jaXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhWZWxvY2l0eSA9IG5ldyBWZWN0b3IyKDEwMDAwLCAxMDAwMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXhpbXVtIHNwZWVkIHRoaXMgQm9keSBpcyBhbGxvd2VkIHRvIHJlYWNoLCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIG5vdCBuZWdhdGl2ZSBpdCBsaW1pdHMgdGhlIHNjYWxhciB2YWx1ZSBvZiBzcGVlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEFueSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBubyBtYXhpbXVtIGlzIGJlaW5nIGFwcGxpZWQgKHRoZSBkZWZhdWx0KS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I21heFNwZWVkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFNwZWVkID0gLTE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgQm9keSBpcyBgaW1tb3ZhYmxlYCBhbmQgaW4gbW90aW9uLCBgZnJpY3Rpb25gIGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoaXMgQm9keSdzIG1vdGlvbiByZWNlaXZlZCBieSB0aGUgcmlkaW5nIEJvZHkgb24gZWFjaCBheGlzLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICAgICAqIFRoZSBob3Jpem9udGFsIGNvbXBvbmVudCAoeCkgaXMgYXBwbGllZCBvbmx5IHdoZW4gdHdvIGNvbGxpZGluZyBCb2RpZXMgYXJlIHNlcGFyYXRlZCB2ZXJ0aWNhbGx5LlxyXG4gICAgICAgICAqIFRoZSB2ZXJ0aWNhbCBjb21wb25lbnQgKHkpIGlzIGFwcGxpZWQgb25seSB3aGVuIHR3byBjb2xsaWRpbmcgQm9kaWVzIGFyZSBzZXBhcmF0ZWQgaG9yaXpvbnRhbGx5LlxyXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlICgxLCAwKSBtb3ZlcyB0aGUgcmlkaW5nIEJvZHkgaG9yaXpvbnRhbGx5IGluIGVxdWFsIHByb3BvcnRpb24gdG8gdGhpcyBCb2R5IGFuZCB2ZXJ0aWNhbGx5IG5vdCBhdCBhbGwuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNmcmljdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJpY3Rpb24gPSBuZXcgVmVjdG9yMigxLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBCb2R5IGlzIHVzaW5nIGBkcmFnYCBmb3IgZGVjZWxlcmF0aW9uIHRoaXMgcHJvcGVydHkgY29udHJvbHMgaG93IHRoZSBkcmFnIGlzIGFwcGxpZWQuXHJcbiAgICAgICAgICogSWYgc2V0IHRvIGB0cnVlYCBkcmFnIHdpbGwgdXNlIGEgZGFtcGluZyBlZmZlY3QgcmF0aGVyIHRoYW4gYSBsaW5lYXIgYXBwcm9hY2guIElmIHlvdSBhcmVcclxuICAgICAgICAgKiBjcmVhdGluZyBhIGdhbWUgd2hlcmUgdGhlIEJvZHkgbW92ZXMgZnJlZWx5IGF0IGFueSBhbmdsZSAoaS5lLiBsaWtlIHRoZSB3YXkgdGhlIHNoaXAgbW92ZXMgaW5cclxuICAgICAgICAgKiB0aGUgZ2FtZSBBc3Rlcm9pZHMpIHRoZW4geW91IHdpbGwgZ2V0IGEgZmFyIHNtb290aGVyIGFuZCBtb3JlIHZpc3VhbGx5IGNvcnJlY3QgZGVjZWxlcmF0aW9uXHJcbiAgICAgICAgICogYnkgdXNpbmcgZGFtcGluZywgYXZvaWRpbmcgdGhlIGF4aXMtZHJpZnQgdGhhdCBpcyBwcm9uZSB3aXRoIGxpbmVhciBkZWNlbGVyYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJZiB5b3UgZW5hYmxlIHRoaXMgcHJvcGVydHkgdGhlbiB5b3Ugc2hvdWxkIHVzZSBmYXIgc21hbGxlciBgZHJhZ2AgdmFsdWVzIHRoYW4gd2l0aCBsaW5lYXIsIGFzXHJcbiAgICAgICAgICogdGhleSBhcmUgdXNlZCBhcyBhIG11bHRpcGxpZXIgb24gdGhlIHZlbG9jaXR5LiBWYWx1ZXMgc3VjaCBhcyAwLjk1IHdpbGwgZ2l2ZSBhIG5pY2Ugc2xvd1xyXG4gICAgICAgICAqIGRlY2VsZXJhdGlvbiwgd2hlcmUtYXMgc21hbGxlciB2YWx1ZXMsIHN1Y2ggYXMgMC41IHdpbGwgc3RvcCBhbiBvYmplY3QgYWxtb3N0IGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjdXNlRGFtcGluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudXNlRGFtcGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcmF0ZSBvZiBjaGFuZ2Ugb2YgdGhpcyBCb2R5J3MgYHJvdGF0aW9uYCwgaW4gZGVncmVlcyBwZXIgc2Vjb25kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYW5ndWxhclZlbG9jaXR5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmd1bGFyVmVsb2NpdHkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQm9keSdzIGFuZ3VsYXIgYWNjZWxlcmF0aW9uIChjaGFuZ2UgaW4gYW5ndWxhciB2ZWxvY2l0eSksIGluIGRlZ3JlZXMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYW5ndWxhckFjY2VsZXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckFjY2VsZXJhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExvc3Mgb2YgYW5ndWxhciB2ZWxvY2l0eSBkdWUgdG8gYW5ndWxhciBtb3ZlbWVudCwgaW4gZGVncmVlcyBwZXIgc2Vjb25kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQW5ndWxhciBkcmFnIGlzIGFwcGxpZWQgb25seSB3aGVuIGFuZ3VsYXIgYWNjZWxlcmF0aW9uIGlzIHplcm8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNhbmd1bGFyRHJhZ1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckRyYWcgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQm9keSdzIG1heGltdW0gYW5ndWxhciB2ZWxvY2l0eSwgaW4gZGVncmVlcyBwZXIgc2Vjb25kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjbWF4QW5ndWxhclxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTAwMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWF4QW5ndWxhciA9IDEwMDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgaW5lcnRpYSwgcmVsYXRpdmUgdG8gYSBkZWZhdWx0IHVuaXQgKDEpLlxyXG4gICAgICAgICAqIFdpdGggYGJvdW5jZWAsIHRoaXMgYWZmZWN0cyB0aGUgZXhjaGFuZ2Ugb2YgbW9tZW50dW0gKHZlbG9jaXRpZXMpIGR1cmluZyBjb2xsaXNpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjbWFzc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFzcyA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxjdWxhdGVkIGFuZ2xlIG9mIHRoaXMgQm9keSdzIHZlbG9jaXR5IHZlY3RvciwgaW4gcmFkaWFucywgZHVyaW5nIHRoZSBsYXN0IHN0ZXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNhbmdsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FsY3VsYXRlZCBtYWduaXR1ZGUgb2YgdGhlIEJvZHkncyB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQsIGR1cmluZyB0aGUgbGFzdCBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc3BlZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNwZWVkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgQm9keSdzIHZlbG9jaXR5LCBhcyBjYWxjdWxhdGVkIGR1cmluZyB0aGUgbGFzdCBzdGVwLlxyXG4gICAgICAgICAqIElmIHRoZSBCb2R5IGlzIG1vdmluZyBvbiBib3RoIGF4ZXMgKGRpYWdvbmFsbHkpLCB0aGlzIGRlc2NyaWJlcyBtb3Rpb24gb24gdGhlIHZlcnRpY2FsIGF4aXMgb25seS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2ZhY2luZ1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmFjaW5nID0gQ09OU1QuRkFDSU5HX05PTkU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyBCb2R5IGNhbiBiZSBtb3ZlZCBieSBjb2xsaXNpb25zIHdpdGggYW5vdGhlciBCb2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjaW1tb3ZhYmxlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmltbW92YWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBCb2R5J3MgcG9zaXRpb24gYW5kIHJvdGF0aW9uIGFyZSBhZmZlY3RlZCBieSBpdHMgdmVsb2NpdHksIGFjY2VsZXJhdGlvbiwgZHJhZywgYW5kIGdyYXZpdHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNtb3Zlc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1vdmVzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGRpc2FibGluZyB0aGUgZGVmYXVsdCBob3Jpem9udGFsIHNlcGFyYXRpb24gb2YgY29sbGlkaW5nIGJvZGllcy5cclxuICAgICAgICAgKiBQYXNzIHlvdXIgb3duIGBjb2xsaWRlQ2FsbGJhY2tgIHRvIHRoZSBjb2xsaWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2N1c3RvbVNlcGFyYXRlWFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXN0b21TZXBhcmF0ZVggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGRpc2FibGluZyB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGNvbGxpZGluZyBib2RpZXMuXHJcbiAgICAgICAgICogUGFzcyB5b3VyIG93biBgY29sbGlkZUNhbGxiYWNrYCB0byB0aGUgY29sbGlkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNjdXN0b21TZXBhcmF0ZVlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU2VwYXJhdGVZID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCBhbm90aGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjb3ZlcmxhcFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCBhbm90aGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjb3ZlcmxhcFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFtb3VudCBvZiBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgQm9keSBpcyBjaXJjdWxhciBhbmQgY29sbGlkaW5nIHdpdGggYW5vdGhlciBjaXJjdWxhciBib2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjb3ZlcmxhcFJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBSID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIEJvZHkgaXMgb3ZlcmxhcHBlZCB3aXRoIGFub3RoZXIgYW5kIGJvdGggYXJlIG5vdCBtb3ZpbmcsIG9uIGF0IGxlYXN0IG9uZSBheGlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZW1iZWRkZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW1iZWRkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIEJvZHkgaW50ZXJhY3RzIHdpdGggdGhlIHdvcmxkIGJvdW5kYXJ5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjY29sbGlkZVdvcmxkQm91bmRzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbGxpZGVXb3JsZEJvdW5kcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSBpcyBjaGVja2VkIGZvciBjb2xsaXNpb25zIGFuZCBmb3Igd2hpY2ggZGlyZWN0aW9ucy5cclxuICAgICAgICAgKiBZb3UgY2FuIHNldCBgY2hlY2tDb2xsaXNpb24ubm9uZSA9IHRydWVgIHRvIGRpc2FibGUgY29sbGlzaW9uIGNoZWNrcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2NoZWNrQ29sbGlzaW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVCb2R5Q29sbGlzaW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb24gPSB7IG5vbmU6IGZhbHNlLCB1cDogdHJ1ZSwgZG93bjogdHJ1ZSwgbGVmdDogdHJ1ZSwgcmlnaHQ6IHRydWUgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIEJvZHkgaXMgY29sbGlkaW5nIHdpdGggYSBCb2R5IG9yIFN0YXRpYyBCb2R5IGFuZCBpbiB3aGljaCBkaXJlY3Rpb24uXHJcbiAgICAgICAgICogSW4gYSBjb2xsaXNpb24gd2hlcmUgYm90aCBib2RpZXMgaGF2ZSB6ZXJvIHZlbG9jaXR5LCBgZW1iZWRkZWRgIHdpbGwgYmUgc2V0IGluc3RlYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN0b3VjaGluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQm9keUNvbGxpc2lvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYmxvY2tlZFxyXG4gICAgICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZW1iZWRkZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdWNoaW5nID0geyBub25lOiB0cnVlLCB1cDogZmFsc2UsIGRvd246IGZhbHNlLCBsZWZ0OiBmYWxzZSwgcmlnaHQ6IGZhbHNlIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgQm9keSdzIGB0b3VjaGluZ2AgdmFsdWUgZHVyaW5nIHRoZSBwcmV2aW91cyBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjd2FzVG91Y2hpbmdcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUJvZHlDb2xsaXNpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3RvdWNoaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53YXNUb3VjaGluZyA9IHsgbm9uZTogdHJ1ZSwgdXA6IGZhbHNlLCBkb3duOiBmYWxzZSwgbGVmdDogZmFsc2UsIHJpZ2h0OiBmYWxzZSB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCBhIFN0YXRpYyBCb2R5LCBhIHRpbGUsIG9yIHRoZSB3b3JsZCBib3VuZGFyeS5cclxuICAgICAgICAgKiBJbiBhIGNvbGxpc2lvbiB3aXRoIGEgU3RhdGljIEJvZHksIGlmIHRoaXMgQm9keSBoYXMgemVybyB2ZWxvY2l0eSB0aGVuIGBlbWJlZGRlZGAgd2lsbCBiZSBzZXQgaW5zdGVhZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2Jsb2NrZWRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUJvZHlDb2xsaXNpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2VtYmVkZGVkXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN0b3VjaGluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmxvY2tlZCA9IHsgbm9uZTogdHJ1ZSwgdXA6IGZhbHNlLCBkb3duOiBmYWxzZSwgbGVmdDogZmFsc2UsIHJpZ2h0OiBmYWxzZSB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemUgdGhpcyBCb2R5J3MgZGltZW5zaW9ucyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHMgR2FtZSBPYmplY3QncyB2aXN1YWwgYm91bmRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc3luY0JvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICogQHNlZSBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHMjZ2V0Qm91bmRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeW5jQm91bmRzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBCb2R5J3MgcGh5c2ljcyB0eXBlIChkeW5hbWljIG9yIHN0YXRpYykuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNwaHlzaWNzVHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFBoYXNlci5QaHlzaWNzLkFyY2FkZS5EWU5BTUlDX0JPRFlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBoeXNpY3NUeXBlID0gQ09OU1QuRFlOQU1JQ19CT0RZO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWNoZWQgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGUgQm9keSdzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjX3N4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N4ID0gZ2FtZU9iamVjdC5zY2FsZVg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENhY2hlZCB2ZXJ0aWNhbCBzY2FsZSBvZiB0aGUgQm9keSdzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjX3N5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N5ID0gZ2FtZU9iamVjdC5zY2FsZVk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxjdWxhdGVkIGNoYW5nZSBpbiB0aGUgQm9keSdzIGhvcml6b250YWwgcG9zaXRpb24gZHVyaW5nIHRoZSBsYXN0IHN0ZXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNfZHhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2R4ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbGN1bGF0ZWQgY2hhbmdlIGluIHRoZSBCb2R5J3MgdmVydGljYWwgcG9zaXRpb24gZHVyaW5nIHRoZSBsYXN0IHN0ZXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNfZHlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2R5ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZpbmFsIGNhbGN1bGF0ZWQgY2hhbmdlIGluIHRoZSBCb2R5J3MgaG9yaXpvbnRhbCBwb3NpdGlvbiBhcyBvZiBgcG9zdFVwZGF0ZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNfdHhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90eCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmaW5hbCBjYWxjdWxhdGVkIGNoYW5nZSBpbiB0aGUgQm9keSdzIHZlcnRpY2FsIHBvc2l0aW9uIGFzIG9mIGBwb3N0VXBkYXRlYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I190eVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3R5ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3RvcmVzIHRoZSBHYW1lIE9iamVjdCdzIGJvdW5kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I19ib3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fYm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIEJvZHkncyBgdHJhbnNmb3JtYCwgYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgY2VudGVyYCBmcm9tIGl0cyBHYW1lIE9iamVjdC5cclxuICAgICAqIFRoZSBCb2R5J3MgYHBvc2l0aW9uYCBpc24ndCBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjdXBkYXRlQm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlQm91bmRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzcHJpdGUgPSB0aGlzLmdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIC8vICBDb250YWluZXI/XHJcblxyXG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybTtcclxuXHJcbiAgICAgICAgaWYgKHNwcml0ZS5wYXJlbnRDb250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbWF0cml4ID0gc3ByaXRlLmdldFdvcmxkVHJhbnNmb3JtTWF0cml4KHRoaXMud29ybGQuX3RlbXBNYXRyaXgsIHRoaXMud29ybGQuX3RlbXBNYXRyaXgyKTtcclxuXHJcbiAgICAgICAgICAgIHRyYW5zZm9ybS54ID0gbWF0cml4LnR4O1xyXG4gICAgICAgICAgICB0cmFuc2Zvcm0ueSA9IG1hdHJpeC50eTtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnJvdGF0aW9uID0gUmFkVG9EZWcobWF0cml4LnJvdGF0aW9uKTtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlWCA9IG1hdHJpeC5zY2FsZVg7XHJcbiAgICAgICAgICAgIHRyYW5zZm9ybS5zY2FsZVkgPSBtYXRyaXguc2NhbGVZO1xyXG4gICAgICAgICAgICB0cmFuc2Zvcm0uZGlzcGxheU9yaWdpblggPSBzcHJpdGUuZGlzcGxheU9yaWdpblg7XHJcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kaXNwbGF5T3JpZ2luWSA9IHNwcml0ZS5kaXNwbGF5T3JpZ2luWTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnggPSBzcHJpdGUueDtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnkgPSBzcHJpdGUueTtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnJvdGF0aW9uID0gc3ByaXRlLmFuZ2xlO1xyXG4gICAgICAgICAgICB0cmFuc2Zvcm0uc2NhbGVYID0gc3ByaXRlLnNjYWxlWDtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLnNjYWxlWSA9IHNwcml0ZS5zY2FsZVk7XHJcbiAgICAgICAgICAgIHRyYW5zZm9ybS5kaXNwbGF5T3JpZ2luWCA9IHNwcml0ZS5kaXNwbGF5T3JpZ2luWDtcclxuICAgICAgICAgICAgdHJhbnNmb3JtLmRpc3BsYXlPcmlnaW5ZID0gc3ByaXRlLmRpc3BsYXlPcmlnaW5ZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlY2FsYyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zeW5jQm91bmRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGIgPSBzcHJpdGUuZ2V0Qm91bmRzKHRoaXMuX2JvdW5kcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gYi53aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBiLmhlaWdodDtcclxuICAgICAgICAgICAgcmVjYWxjID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFzeCA9IE1hdGguYWJzKHRyYW5zZm9ybS5zY2FsZVgpO1xyXG4gICAgICAgICAgICB2YXIgYXN5ID0gTWF0aC5hYnModHJhbnNmb3JtLnNjYWxlWSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3ggIT09IGFzeCB8fCB0aGlzLl9zeSAhPT0gYXN5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2VXaWR0aCAqIGFzeDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2VIZWlnaHQgKiBhc3k7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zeCA9IGFzeDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N5ID0gYXN5O1xyXG4gICAgICAgICAgICAgICAgcmVjYWxjID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlY2FsYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFsZldpZHRoID0gTWF0aC5mbG9vcih0aGlzLndpZHRoIC8gMik7XHJcbiAgICAgICAgICAgIHRoaXMuaGFsZkhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5oZWlnaHQgLyAyKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDZW50ZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgQm9keSdzIGBjZW50ZXJgIGZyb20gaXRzIGBwb3NpdGlvbmAsIGB3aWR0aGAsIGFuZCBgaGVpZ2h0YC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3VwZGF0ZUNlbnRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNlbnRlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNlbnRlci5zZXQodGhpcy5wb3NpdGlvbi54ICsgdGhpcy5oYWxmV2lkdGgsIHRoaXMucG9zaXRpb24ueSArIHRoaXMuaGFsZkhlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGFyZXMgdGhlIEJvZHkgZm9yIGEgcGh5c2ljcyBzdGVwIGJ5IHJlc2V0dGluZyB0aGUgYHdhc1RvdWNoaW5nYCwgYHRvdWNoaW5nYCBhbmQgYGJsb2NrZWRgIHN0YXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgcGh5c2ljcyB3b3JsZCBpcyBnb2luZyB0byBydW4gYSBzdGVwIHRoaXMgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNyZXNldEZsYWdzXHJcbiAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgKi9cclxuICAgIHJlc2V0RmxhZ3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFN0b3JlIGFuZCByZXNldCBjb2xsaXNpb24gZmxhZ3NcclxuICAgICAgICB2YXIgd2FzVG91Y2hpbmcgPSB0aGlzLndhc1RvdWNoaW5nO1xyXG4gICAgICAgIHZhciB0b3VjaGluZyA9IHRoaXMudG91Y2hpbmc7XHJcbiAgICAgICAgdmFyIGJsb2NrZWQgPSB0aGlzLmJsb2NrZWQ7XHJcblxyXG4gICAgICAgIHdhc1RvdWNoaW5nLm5vbmUgPSB0b3VjaGluZy5ub25lO1xyXG4gICAgICAgIHdhc1RvdWNoaW5nLnVwID0gdG91Y2hpbmcudXA7XHJcbiAgICAgICAgd2FzVG91Y2hpbmcuZG93biA9IHRvdWNoaW5nLmRvd247XHJcbiAgICAgICAgd2FzVG91Y2hpbmcubGVmdCA9IHRvdWNoaW5nLmxlZnQ7XHJcbiAgICAgICAgd2FzVG91Y2hpbmcucmlnaHQgPSB0b3VjaGluZy5yaWdodDtcclxuXHJcbiAgICAgICAgdG91Y2hpbmcubm9uZSA9IHRydWU7XHJcbiAgICAgICAgdG91Y2hpbmcudXAgPSBmYWxzZTtcclxuICAgICAgICB0b3VjaGluZy5kb3duID0gZmFsc2U7XHJcbiAgICAgICAgdG91Y2hpbmcubGVmdCA9IGZhbHNlO1xyXG4gICAgICAgIHRvdWNoaW5nLnJpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGJsb2NrZWQubm9uZSA9IHRydWU7XHJcbiAgICAgICAgYmxvY2tlZC51cCA9IGZhbHNlO1xyXG4gICAgICAgIGJsb2NrZWQuZG93biA9IGZhbHNlO1xyXG4gICAgICAgIGJsb2NrZWQubGVmdCA9IGZhbHNlO1xyXG4gICAgICAgIGJsb2NrZWQucmlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5vdmVybGFwUiA9IDA7XHJcbiAgICAgICAgdGhpcy5vdmVybGFwWCA9IDA7XHJcbiAgICAgICAgdGhpcy5vdmVybGFwWSA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuZW1iZWRkZWQgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTeW5jcyB0aGUgcG9zaXRpb24gYm9keSBwb3NpdGlvbiB3aXRoIHRoZSBwYXJlbnQgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IGdhbWUgZnJhbWUsIHJlZ2FyZGxlc3MgaWYgdGhlIHdvcmxkIHN0ZXBzIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3ByZVVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2lsbFN0ZXAgLSBXaWxsIHRoaXMgQm9keSBydW4gYW4gdXBkYXRlIGFzIHdlbGw/XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSwgaW4gc2Vjb25kcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgcHJlVXBkYXRlOiBmdW5jdGlvbiAod2lsbFN0ZXAsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aWxsU3RlcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRGbGFncygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcclxuXHJcbiAgICAgICAgdmFyIHNwcml0ZSA9IHRoaXMudHJhbnNmb3JtO1xyXG5cclxuICAgICAgICB0aGlzLnBvc2l0aW9uLnggPSBzcHJpdGUueCArIHNwcml0ZS5zY2FsZVggKiAodGhpcy5vZmZzZXQueCAtIHNwcml0ZS5kaXNwbGF5T3JpZ2luWCk7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbi55ID0gc3ByaXRlLnkgKyBzcHJpdGUuc2NhbGVZICogKHRoaXMub2Zmc2V0LnkgLSBzcHJpdGUuZGlzcGxheU9yaWdpblkpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNlbnRlcigpO1xyXG5cclxuICAgICAgICB0aGlzLnJvdGF0aW9uID0gc3ByaXRlLnJvdGF0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLnByZVJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW92ZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnByZXYueCA9IHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgdGhpcy5wcmV2LnkgPSB0aGlzLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIHRoaXMucHJldkZyYW1lLnggPSB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIHRoaXMucHJldkZyYW1lLnkgPSB0aGlzLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2lsbFN0ZXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShkZWx0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgc2luZ2xlIHBoeXNpY3Mgc3RlcCBhbmQgdXBkYXRlcyB0aGUgYm9keSB2ZWxvY2l0eSwgYW5nbGUsIHNwZWVkIGFuZCBvdGhlciBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyIGdhbWUgZnJhbWUsIGRlcGVuZGluZyBvbiB0aGUgcGh5c2ljcyBzdGVwIHJhdGUuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHJlc3VsdHMgYXJlIHN5bmNlZCBiYWNrIHRvIHRoZSBHYW1lIE9iamVjdCBpbiBgcG9zdFVwZGF0ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN1cGRhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1dPUkxEX0JPVU5EU1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUsIGluIHNlY29uZHMsIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJldi54ID0gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICAgIHRoaXMucHJldi55ID0gdGhpcy5wb3NpdGlvbi55O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tb3ZlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud29ybGQudXBkYXRlTW90aW9uKHRoaXMsIGRlbHRhKTtcclxuXHJcbiAgICAgICAgICAgIHZhciB2eCA9IHRoaXMudmVsb2NpdHkueDtcclxuICAgICAgICAgICAgdmFyIHZ5ID0gdGhpcy52ZWxvY2l0eS55O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5uZXdWZWxvY2l0eS5zZXQodnggKiBkZWx0YSwgdnkgKiBkZWx0YSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLmFkZCh0aGlzLm5ld1ZlbG9jaXR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2VudGVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFuZ2xlID0gTWF0aC5hdGFuMih2eSwgdngpO1xyXG4gICAgICAgICAgICB0aGlzLnNwZWVkID0gTWF0aC5zcXJ0KHZ4ICogdnggKyB2eSAqIHZ5KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBOb3cgdGhlIHVwZGF0ZSB3aWxsIHRocm93IGNvbGxpc2lvbiBjaGVja3MgYXQgdGhlIEJvZHlcclxuICAgICAgICAgICAgLy8gIEFuZCBmaW5hbGx5IHdlJ2xsIGludGVncmF0ZSB0aGUgbmV3IHBvc2l0aW9uIGJhY2sgdG8gdGhlIFNwcml0ZSBpbiBwb3N0VXBkYXRlXHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb2xsaWRlV29ybGRCb3VuZHMgJiYgdGhpcy5jaGVja1dvcmxkQm91bmRzKCkgJiYgdGhpcy5vbldvcmxkQm91bmRzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmxkLmVtaXQoRXZlbnRzLldPUkxEX0JPVU5EUywgdGhpcywgdGhpcy5ibG9ja2VkLnVwLCB0aGlzLmJsb2NrZWQuZG93biwgdGhpcy5ibG9ja2VkLmxlZnQsIHRoaXMuYmxvY2tlZC5yaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2R4ID0gdGhpcy5wb3NpdGlvbi54IC0gdGhpcy5wcmV2Lng7XHJcbiAgICAgICAgdGhpcy5fZHkgPSB0aGlzLnBvc2l0aW9uLnkgLSB0aGlzLnByZXYueTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGZWVkcyB0aGUgQm9keSByZXN1bHRzIGJhY2sgaW50byB0aGUgcGFyZW50IEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSBnYW1lIGZyYW1lLCByZWdhcmRsZXNzIGlmIHRoZSB3b3JsZCBzdGVwcyBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNwb3N0VXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcG9zdFVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZHggPSB0aGlzLnBvc2l0aW9uLnggLSB0aGlzLnByZXZGcmFtZS54O1xyXG4gICAgICAgIHZhciBkeSA9IHRoaXMucG9zaXRpb24ueSAtIHRoaXMucHJldkZyYW1lLnk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vdmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG14ID0gdGhpcy5kZWx0YU1heC54O1xyXG4gICAgICAgICAgICB2YXIgbXkgPSB0aGlzLmRlbHRhTWF4Lnk7XHJcblxyXG4gICAgICAgICAgICBpZiAobXggIT09IDAgJiYgZHggIT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChkeCA8IDAgJiYgZHggPCAtbXgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHggPSAtbXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkeCA+IDAgJiYgZHggPiBteClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkeCA9IG14O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobXkgIT09IDAgJiYgZHkgIT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChkeSA8IDAgJiYgZHkgPCAtbXkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHkgPSAtbXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkeSA+IDAgJiYgZHkgPiBteSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkeSA9IG15O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdhbWVPYmplY3QueCArPSBkeDtcclxuICAgICAgICAgICAgdGhpcy5nYW1lT2JqZWN0LnkgKz0gZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZHggPCAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mYWNpbmcgPSBDT05TVC5GQUNJTkdfTEVGVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZHggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mYWNpbmcgPSBDT05TVC5GQUNJTkdfUklHSFQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZHkgPCAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mYWNpbmcgPSBDT05TVC5GQUNJTkdfVVA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGR5ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmFjaW5nID0gQ09OU1QuRkFDSU5HX0RPV047XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbGxvd1JvdGF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nYW1lT2JqZWN0LmFuZ2xlICs9IHRoaXMuZGVsdGFaKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90eCA9IGR4O1xyXG4gICAgICAgIHRoaXMuX3R5ID0gZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGN1c3RvbSBjb2xsaXNpb24gYm91bmRhcnkgcmVjdGFuZ2xlLiBVc2UgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGN1c3RvbVxyXG4gICAgICogYm91bmRhcnkgaW5zdGVhZCBvZiB0aGUgd29ybGQgYm91bmRhcmllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEJvdW5kc1JlY3RhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gez9QaGFzZXIuR2VvbS5SZWN0YW5nbGV9IFtib3VuZHNdIC0gVGhlIG5ldyBib3VuZGFyeSByZWN0YW5nbGUuIFBhc3MgYG51bGxgIHRvIHVzZSB0aGUgV29ybGQgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5kc1JlY3RhbmdsZTogZnVuY3Rpb24gKGJvdW5kcylcclxuICAgIHtcclxuICAgICAgICB0aGlzLmN1c3RvbUJvdW5kc1JlY3RhbmdsZSA9ICghYm91bmRzKSA/IHRoaXMud29ybGQuYm91bmRzIDogYm91bmRzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgZm9yIGNvbGxpc2lvbnMgYmV0d2VlbiB0aGlzIEJvZHkgYW5kIHRoZSB3b3JsZCBib3VuZGFyeSBhbmQgc2VwYXJhdGVzIHRoZW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNjaGVja1dvcmxkQm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCB0aGUgd29ybGQgYm91bmRhcnkuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrV29ybGRCb3VuZHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247XHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuY3VzdG9tQm91bmRzUmVjdGFuZ2xlO1xyXG4gICAgICAgIHZhciBjaGVjayA9IHRoaXMud29ybGQuY2hlY2tDb2xsaXNpb247XHJcblxyXG4gICAgICAgIHZhciBieCA9ICh0aGlzLndvcmxkQm91bmNlKSA/IC10aGlzLndvcmxkQm91bmNlLnggOiAtdGhpcy5ib3VuY2UueDtcclxuICAgICAgICB2YXIgYnkgPSAodGhpcy53b3JsZEJvdW5jZSkgPyAtdGhpcy53b3JsZEJvdW5jZS55IDogLXRoaXMuYm91bmNlLnk7XHJcblxyXG4gICAgICAgIHZhciB3YXNTZXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHBvcy54IDwgYm91bmRzLnggJiYgY2hlY2subGVmdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvcy54ID0gYm91bmRzLng7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueCAqPSBieDtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja2VkLmxlZnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB3YXNTZXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnJpZ2h0ID4gYm91bmRzLnJpZ2h0ICYmIGNoZWNrLnJpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9zLnggPSBib3VuZHMucmlnaHQgLSB0aGlzLndpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5LnggKj0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tlZC5yaWdodCA9IHRydWU7XHJcbiAgICAgICAgICAgIHdhc1NldCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocG9zLnkgPCBib3VuZHMueSAmJiBjaGVjay51cClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvcy55ID0gYm91bmRzLnk7XHJcbiAgICAgICAgICAgIHRoaXMudmVsb2NpdHkueSAqPSBieTtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja2VkLnVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2FzU2V0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5ib3R0b20gPiBib3VuZHMuYm90dG9tICYmIGNoZWNrLmRvd24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwb3MueSA9IGJvdW5kcy5ib3R0b20gLSB0aGlzLmhlaWdodDtcclxuICAgICAgICAgICAgdGhpcy52ZWxvY2l0eS55ICo9IGJ5O1xyXG4gICAgICAgICAgICB0aGlzLmJsb2NrZWQuZG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIHdhc1NldCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FzU2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB3YXNTZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBCb2R5J3MgcG9zaXRpb24gZnJvbSBpdHMgR2FtZSBPYmplY3QncyBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldE9mZnNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQsIGluIHNvdXJjZSBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgb2Zmc2V0LCBpbiBzb3VyY2UgcGl4ZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5vZmZzZXQuc2V0KHgsIHkpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2VudGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNpemVzIGFuZCBwb3NpdGlvbnMgdGhpcyBCb2R5J3MgYm91bmRhcnksIGFzIGEgcmVjdGFuZ2xlLlxyXG4gICAgICogTW9kaWZpZXMgdGhlIEJvZHkgYG9mZnNldGAgaWYgYGNlbnRlcmAgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLlxyXG4gICAgICogUmVzZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRvIG1hdGNoIGN1cnJlbnQgZnJhbWUsIGlmIG5vIHdpZHRoIGFuZCBoZWlnaHQgcHJvdmlkZWQgYW5kIGEgZnJhbWUgaXMgZm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIEJvZHkgaW4gcGl4ZWxzLiBDYW5ub3QgYmUgemVyby4gSWYgbm90IGdpdmVuLCBhbmQgdGhlIHBhcmVudCBHYW1lIE9iamVjdCBoYXMgYSBmcmFtZSwgaXQgd2lsbCB1c2UgdGhlIGZyYW1lIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIEJvZHkgaW4gcGl4ZWxzLiBDYW5ub3QgYmUgemVyby4gSWYgbm90IGdpdmVuLCBhbmQgdGhlIHBhcmVudCBHYW1lIE9iamVjdCBoYXMgYSBmcmFtZSwgaXQgd2lsbCB1c2UgdGhlIGZyYW1lIGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NlbnRlcj10cnVlXSAtIE1vZGlmeSB0aGUgQm9keSdzIGBvZmZzZXRgLCBwbGFjaW5nIHRoZSBCb2R5J3MgY2VudGVyIG9uIGl0cyBHYW1lIE9iamVjdCdzIGNlbnRlci4gT25seSB3b3JrcyBpZiB0aGUgR2FtZSBPYmplY3QgaGFzIHRoZSBgZ2V0Q2VudGVyYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCBjZW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNlbnRlciA9PT0gdW5kZWZpbmVkKSB7IGNlbnRlciA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdmFyIGdhbWVPYmplY3QgPSB0aGlzLmdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIGlmICghd2lkdGggJiYgZ2FtZU9iamVjdC5mcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gZ2FtZU9iamVjdC5mcmFtZS5yZWFsV2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWhlaWdodCAmJiBnYW1lT2JqZWN0LmZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gZ2FtZU9iamVjdC5mcmFtZS5yZWFsSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zb3VyY2VXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuc291cmNlSGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2VXaWR0aCAqIHRoaXMuX3N4O1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2VIZWlnaHQgKiB0aGlzLl9zeTtcclxuXHJcbiAgICAgICAgdGhpcy5oYWxmV2lkdGggPSBNYXRoLmZsb29yKHRoaXMud2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQ2VudGVyKCk7XHJcblxyXG4gICAgICAgIGlmIChjZW50ZXIgJiYgZ2FtZU9iamVjdC5nZXRDZW50ZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb3ggPSAoZ2FtZU9iamVjdC53aWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgIHZhciBveSA9IChnYW1lT2JqZWN0LmhlaWdodCAtIGhlaWdodCkgLyAyO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vZmZzZXQuc2V0KG94LCBveSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzQ2lyY2xlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yYWRpdXMgPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaXplcyBhbmQgcG9zaXRpb25zIHRoaXMgQm9keSdzIGJvdW5kYXJ5LCBhcyBhIGNpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldENpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIEJvZHksIGluIHNvdXJjZSBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFhdIC0gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBCb2R5IGZyb20gaXRzIEdhbWUgT2JqZWN0LCBpbiBzb3VyY2UgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIEJvZHkgZnJvbSBpdHMgR2FtZSBPYmplY3QsIGluIHNvdXJjZSBwaXhlbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENpcmNsZTogZnVuY3Rpb24gKHJhZGl1cywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxuICAgIHtcclxuICAgICAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSB0aGlzLm9mZnNldC54OyB9XHJcbiAgICAgICAgaWYgKG9mZnNldFkgPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRZID0gdGhpcy5vZmZzZXQueTsgfVxyXG5cclxuICAgICAgICBpZiAocmFkaXVzID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDaXJjbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlV2lkdGggPSByYWRpdXMgKiAyO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUhlaWdodCA9IHJhZGl1cyAqIDI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2VXaWR0aCAqIHRoaXMuX3N4O1xyXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuc291cmNlSGVpZ2h0ICogdGhpcy5fc3k7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhhbGZXaWR0aCA9IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDIpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9mZnNldC5zZXQob2Zmc2V0WCwgb2Zmc2V0WSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbnRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2lyY2xlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBCb2R5IHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy4gQWxzbyBwb3NpdGlvbnMgaXRzIHBhcmVudCBHYW1lIE9iamVjdCB0byB0aGUgc2FtZSBjb29yZGluYXRlcy5cclxuICAgICAqIElmIHRoZSBCb2R5IGhhZCBhbnkgdmVsb2NpdHkgb3IgYWNjZWxlcmF0aW9uIGl0IGlzIGxvc3QgYXMgYSByZXN1bHQgb2YgY2FsbGluZyB0aGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcmVzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gdG8gcGxhY2UgdGhlIEdhbWUgT2JqZWN0IGFuZCBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gdG8gcGxhY2UgdGhlIEdhbWUgT2JqZWN0IGFuZCBCb2R5LlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wKCk7XHJcblxyXG4gICAgICAgIHZhciBnYW1lT2JqZWN0ID0gdGhpcy5nYW1lT2JqZWN0O1xyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LnNldFBvc2l0aW9uKHgsIHkpO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5nZXRUb3BMZWZ0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5nZXRUb3BMZWZ0KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnNldCh4LCB5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldi5jb3B5KHRoaXMucG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMucHJldkZyYW1lLmNvcHkodGhpcy5wb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSBnYW1lT2JqZWN0LmFuZ2xlO1xyXG4gICAgICAgIHRoaXMucHJlUm90YXRpb24gPSBnYW1lT2JqZWN0LmFuZ2xlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2VudGVyKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhY2NlbGVyYXRpb24sIHZlbG9jaXR5LCBhbmQgc3BlZWQgdG8gemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3N0b3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkuc2V0KDApO1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uLnNldCgwKTtcclxuICAgICAgICB0aGlzLnNwZWVkID0gMDtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJWZWxvY2l0eSA9IDA7XHJcbiAgICAgICAgdGhpcy5hbmd1bGFyQWNjZWxlcmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIEJvZHkncyBlZGdlcyBpbnRvIGFuIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2dldEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQm9keUJvdW5kc30gb2JqIC0gQW4gb2JqZWN0IHRvIGNvcHkgdGhlIHZhbHVlcyBpbnRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVCb2R5Qm91bmRzfSAtIEFuIG9iamVjdCB3aXRoIHt4LCB5LCByaWdodCwgYm90dG9tfS5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbiAob2JqKVxyXG4gICAge1xyXG4gICAgICAgIG9iai54ID0gdGhpcy54O1xyXG4gICAgICAgIG9iai55ID0gdGhpcy55O1xyXG4gICAgICAgIG9iai5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgb2JqLmJvdHRvbSA9IHRoaXMuYm90dG9tO1xyXG5cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoaXMgQm9keSdzIGJvdW5kYXJ5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjaGl0VGVzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmICh4LCB5KSBpcyB3aXRoaW4gdGhpcyBCb2R5LlxyXG4gICAgICovXHJcbiAgICBoaXRUZXN0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNDaXJjbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ29udGFpbnModGhpcywgeCwgeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQ2hlY2sgaWYgeC95IGFyZSB3aXRoaW4gdGhlIGJvdW5kcyBmaXJzdFxyXG4gICAgICAgIGlmICh0aGlzLnJhZGl1cyA+IDAgJiYgeCA+PSB0aGlzLmxlZnQgJiYgeCA8PSB0aGlzLnJpZ2h0ICYmIHkgPj0gdGhpcy50b3AgJiYgeSA8PSB0aGlzLmJvdHRvbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkeCA9ICh0aGlzLmNlbnRlci54IC0geCkgKiAodGhpcy5jZW50ZXIueCAtIHgpO1xyXG4gICAgICAgICAgICB2YXIgZHkgPSAodGhpcy5jZW50ZXIueSAtIHkpICogKHRoaXMuY2VudGVyLnkgLSB5KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoZHggKyBkeSkgPD0gKHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBCb2R5IGlzIHRvdWNoaW5nIGEgdGlsZSBvciB0aGUgd29ybGQgYm91bmRhcnkgd2hpbGUgbW92aW5nIGRvd24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNvbkZsb29yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYmxvY2tlZFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdG91Y2hpbmcuXHJcbiAgICAgKi9cclxuICAgIG9uRmxvb3I6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tlZC5kb3duO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBCb2R5IGlzIHRvdWNoaW5nIGEgdGlsZSBvciB0aGUgd29ybGQgYm91bmRhcnkgd2hpbGUgbW92aW5nIHVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjb25DZWlsaW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYmxvY2tlZFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdG91Y2hpbmcuXHJcbiAgICAgKi9cclxuICAgIG9uQ2VpbGluZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja2VkLnVwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBCb2R5IGlzIHRvdWNoaW5nIGEgdGlsZSBvciB0aGUgd29ybGQgYm91bmRhcnkgd2hpbGUgbW92aW5nIGxlZnQgb3IgcmlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNvbldhbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNibG9ja2VkXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0b3VjaGluZy5cclxuICAgICAqL1xyXG4gICAgb25XYWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5ibG9ja2VkLmxlZnQgfHwgdGhpcy5ibG9ja2VkLnJpZ2h0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWJzb2x1dGUgKG5vbi1uZWdhdGl2ZSkgY2hhbmdlIGluIHRoaXMgQm9keSdzIGhvcml6b250YWwgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2RlbHRhQWJzWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGVsdGEgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlbHRhQWJzWDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuX2R4ID4gMCkgPyB0aGlzLl9keCA6IC10aGlzLl9keDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYWJzb2x1dGUgKG5vbi1uZWdhdGl2ZSkgY2hhbmdlIGluIHRoaXMgQm9keSdzIHZlcnRpY2FsIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWx0YUFic1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBkZWx0YUFic1k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl9keSA+IDApID8gdGhpcy5fZHkgOiAtdGhpcy5fZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNoYW5nZSBpbiB0aGlzIEJvZHkncyBob3Jpem9udGFsIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIHNldCBkdXJpbmcgdGhlIEJvZHkncyB1cGRhdGUgcGhhc2UuXHJcbiAgICAgKlxyXG4gICAgICogQXMgYSBCb2R5IGNhbiB1cGRhdGUgbXVsdGlwbGUgdGltZXMgcGVyIHN0ZXAgdGhpcyBtYXkgbm90IGhvbGQgdGhlIGZpbmFsXHJcbiAgICAgKiBkZWx0YSB2YWx1ZSBmb3IgdGhlIEJvZHkuIEluIHRoaXMgY2FzZSwgcGxlYXNlIHNlZSB0aGUgYGRlbHRhWEZpbmFsYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWx0YVhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBkZWx0YVg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjaGFuZ2UgaW4gdGhpcyBCb2R5J3MgdmVydGljYWwgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgc3RlcC5cclxuICAgICAqIFRoaXMgdmFsdWUgaXMgc2V0IGR1cmluZyB0aGUgQm9keSdzIHVwZGF0ZSBwaGFzZS5cclxuICAgICAqXHJcbiAgICAgKiBBcyBhIEJvZHkgY2FuIHVwZGF0ZSBtdWx0aXBsZSB0aW1lcyBwZXIgc3RlcCB0aGlzIG1heSBub3QgaG9sZCB0aGUgZmluYWxcclxuICAgICAqIGRlbHRhIHZhbHVlIGZvciB0aGUgQm9keS4gSW4gdGhpcyBjYXNlLCBwbGVhc2Ugc2VlIHRoZSBgZGVsdGFZRmluYWxgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2RlbHRhWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGVsdGEgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlbHRhWTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNoYW5nZSBpbiB0aGlzIEJvZHkncyBob3Jpem9udGFsIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIGdhbWUgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgdmFsdWUgaXMgc2V0IGR1cmluZyB0aGUgYHBvc3RVcGRhdGVgIHBoYXNlIGFuZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlXHJcbiAgICAgKiBgZGVsdGFNYXhgIGFuZCBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBCZWNhdXNlIHRoaXMgdmFsdWUgaXMgbm90IGNhbGN1bGF0ZWQgdW50aWwgYHBvc3RVcGRhdGVgLCB5b3UgbXVzdCBsaXN0ZW4gZm9yIGl0XHJcbiAgICAgKiBkdXJpbmcgYSBTY2VuZSBgUE9TVF9VUERBVEVgIG9yIGBSRU5ERVJgIGV2ZW50LCBhbmQgbm90IGluIGB1cGRhdGVgLCBhcyBpdCB3aWxsXHJcbiAgICAgKiBub3QgYmUgY2FsY3VsYXRlZCBieSB0aGF0IHBvaW50LiBJZiB5b3UgX2RvXyB1c2UgdGhlc2UgdmFsdWVzIGluIGB1cGRhdGVgIHRoZXlcclxuICAgICAqIHdpbGwgcmVwcmVzZW50IHRoZSBkZWx0YSBmcm9tIHRoZSBfcHJldmlvdXNfIGdhbWUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWx0YVhGaW5hbFxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpbmFsIGRlbHRhIHggdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlbHRhWEZpbmFsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90eDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2hhbmdlIGluIHRoaXMgQm9keSdzIHZlcnRpY2FsIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIGdhbWUgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgdmFsdWUgaXMgc2V0IGR1cmluZyB0aGUgYHBvc3RVcGRhdGVgIHBoYXNlIGFuZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlXHJcbiAgICAgKiBgZGVsdGFNYXhgIGFuZCBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBCZWNhdXNlIHRoaXMgdmFsdWUgaXMgbm90IGNhbGN1bGF0ZWQgdW50aWwgYHBvc3RVcGRhdGVgLCB5b3UgbXVzdCBsaXN0ZW4gZm9yIGl0XHJcbiAgICAgKiBkdXJpbmcgYSBTY2VuZSBgUE9TVF9VUERBVEVgIG9yIGBSRU5ERVJgIGV2ZW50LCBhbmQgbm90IGluIGB1cGRhdGVgLCBhcyBpdCB3aWxsXHJcbiAgICAgKiBub3QgYmUgY2FsY3VsYXRlZCBieSB0aGF0IHBvaW50LiBJZiB5b3UgX2RvXyB1c2UgdGhlc2UgdmFsdWVzIGluIGB1cGRhdGVgIHRoZXlcclxuICAgICAqIHdpbGwgcmVwcmVzZW50IHRoZSBkZWx0YSBmcm9tIHRoZSBfcHJldmlvdXNfIGdhbWUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWx0YVlGaW5hbFxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpbmFsIGRlbHRhIHkgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGRlbHRhWUZpbmFsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90eTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2hhbmdlIGluIHRoaXMgQm9keSdzIHJvdGF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAsIGluIGRlZ3JlZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNkZWx0YVpcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBkZWx0YVo6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm90YXRpb24gLSB0aGlzLnByZVJvdGF0aW9uO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2FibGVzIHRoaXMgQm9keSBhbmQgbWFya3MgaXQgZm9yIGRlbGV0aW9uIGJ5IHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmFibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud29ybGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLnBlbmRpbmdEZXN0cm95LnNldCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhpcyBCb2R5J3MgYm91bmRhcnkgYW5kIHZlbG9jaXR5LCBpZiBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZHJhd0RlYnVnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpYyAtIFRoZSBHcmFwaGljcyBvYmplY3QgdG8gZHJhdyBvbi5cclxuICAgICAqL1xyXG4gICAgZHJhd0RlYnVnOiBmdW5jdGlvbiAoZ3JhcGhpYylcclxuICAgIHtcclxuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3NpdGlvbjtcclxuXHJcbiAgICAgICAgdmFyIHggPSBwb3MueCArIHRoaXMuaGFsZldpZHRoO1xyXG4gICAgICAgIHZhciB5ID0gcG9zLnkgKyB0aGlzLmhhbGZIZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnU2hvd0JvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBncmFwaGljLmxpbmVTdHlsZShncmFwaGljLmRlZmF1bHRTdHJva2VXaWR0aCwgdGhpcy5kZWJ1Z0JvZHlDb2xvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0NpcmNsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JhcGhpYy5zdHJva2VDaXJjbGUoeCwgeSwgdGhpcy53aWR0aCAvIDIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIE9ubHkgZHJhdyB0aGUgc2lkZXMgd2hlcmUgY2hlY2tDb2xsaXNpb24gaXMgdHJ1ZSwgc2ltaWxhciB0byBkZWJ1Z2dlciBpbiBsYXllclxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24udXApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYy5saW5lQmV0d2Vlbihwb3MueCwgcG9zLnksIHBvcy54ICsgdGhpcy53aWR0aCwgcG9zLnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrQ29sbGlzaW9uLnJpZ2h0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4ocG9zLnggKyB0aGlzLndpZHRoLCBwb3MueSwgcG9zLnggKyB0aGlzLndpZHRoLCBwb3MueSArIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0NvbGxpc2lvbi5kb3duKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4ocG9zLngsIHBvcy55ICsgdGhpcy5oZWlnaHQsIHBvcy54ICsgdGhpcy53aWR0aCwgcG9zLnkgKyB0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tDb2xsaXNpb24ubGVmdClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBncmFwaGljLmxpbmVCZXR3ZWVuKHBvcy54LCBwb3MueSwgcG9zLngsIHBvcy55ICsgdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z1Nob3dWZWxvY2l0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZVN0eWxlKGdyYXBoaWMuZGVmYXVsdFN0cm9rZVdpZHRoLCB0aGlzLndvcmxkLmRlZmF1bHRzLnZlbG9jaXR5RGVidWdDb2xvciwgMSk7XHJcbiAgICAgICAgICAgIGdyYXBoaWMubGluZUJldHdlZW4oeCwgeSwgeCArIHRoaXMudmVsb2NpdHkueCAvIDIsIHkgKyB0aGlzLnZlbG9jaXR5LnkgLyAyKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGlzIEJvZHkgd2lsbCBiZSBkcmF3biB0byB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3dpbGxEcmF3RGVidWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgZWl0aGVyIGBkZWJ1Z1Nob3dCb2R5YCBvciBgZGVidWdTaG93VmVsb2NpdHlgIGFyZSBlbmFibGVkLlxyXG4gICAgICovXHJcbiAgICB3aWxsRHJhd0RlYnVnOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5kZWJ1Z1Nob3dCb2R5IHx8IHRoaXMuZGVidWdTaG93VmVsb2NpdHkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgd2hldGhlciB0aGlzIEJvZHkgY29sbGlkZXMgd2l0aCB0aGUgd29ybGQgYm91bmRhcnkuXHJcbiAgICAgKlxyXG4gICAgICogT3B0aW9uYWxseSBhbHNvIHNldHMgdGhlIFdvcmxkIEJvdW5jZSB2YWx1ZXMuIElmIHRoZSBgQm9keS53b3JsZEJvdW5jZWAgaXMgbnVsbCwgaXQncyBzZXQgdG8gYSBuZXcgUGhhc2VyLk1hdGguVmVjdG9yMiBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldENvbGxpZGVXb3JsZEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhpcyBib2R5IHNob3VsZCBjb2xsaWRlIHdpdGggdGhlIHdvcmxkIGJvdW5kcywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2JvdW5jZVhdIC0gSWYgZ2l2ZW4gdGhpcyB3aWxsIGJlIHJlcGxhY2UgdGhlIGB3b3JsZEJvdW5jZS54YCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYm91bmNlWV0gLSBJZiBnaXZlbiB0aGlzIHdpbGwgYmUgcmVwbGFjZSB0aGUgYHdvcmxkQm91bmNlLnlgIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaWRlV29ybGRCb3VuZHM6IGZ1bmN0aW9uICh2YWx1ZSwgYm91bmNlWCwgYm91bmNlWSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5jb2xsaWRlV29ybGRCb3VuZHMgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgdmFyIHNldEJvdW5jZVggPSAoYm91bmNlWCAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgICB2YXIgc2V0Qm91bmNlWSA9IChib3VuY2VZICE9PSB1bmRlZmluZWQpO1xyXG5cclxuICAgICAgICBpZiAoc2V0Qm91bmNlWCB8fCBzZXRCb3VuY2VZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLndvcmxkQm91bmNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmxkQm91bmNlID0gbmV3IFZlY3RvcjIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNldEJvdW5jZVgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud29ybGRCb3VuY2UueCA9IGJvdW5jZVg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZXRCb3VuY2VZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndvcmxkQm91bmNlLnkgPSBib3VuY2VZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRWZWxvY2l0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgdmVsb2NpdHksIGluIHBpeGVscyBwZXIgc2Vjb25kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eTogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52ZWxvY2l0eS5zZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHggPSB0aGlzLnZlbG9jaXR5Lng7XHJcbiAgICAgICAgeSA9IHRoaXMudmVsb2NpdHkueTtcclxuXHJcbiAgICAgICAgdGhpcy5zcGVlZCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGhvcml6b250YWwgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRWZWxvY2l0eVhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5WDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkueCA9IHZhbHVlO1xyXG5cclxuICAgICAgICB2YXIgeCA9IHZhbHVlO1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy52ZWxvY2l0eS55O1xyXG5cclxuICAgICAgICB0aGlzLnNwZWVkID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgdmVydGljYWwgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRWZWxvY2l0eVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5WTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudmVsb2NpdHkueSA9IHZhbHVlO1xyXG5cclxuICAgICAgICB2YXIgeCA9IHRoaXMudmVsb2NpdHkueDtcclxuICAgICAgICB2YXIgeSA9IHZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLnNwZWVkID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgbWF4aW11bSB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldE1heFZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCB2ZWxvY2l0eSwgaW4gcGl4ZWxzIHBlciBzZWNvbmQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgdmVsb2NpdHksIGluIHBpeGVscyBwZXIgc2Vjb25kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXhWZWxvY2l0eTogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYXhWZWxvY2l0eS5zZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1heGltdW0gc3BlZWQgdGhlIEJvZHkgY2FuIG1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRNYXhTcGVlZFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBtYXhpbXVtIHNwZWVkIHZhbHVlLCBpbiBwaXhlbHMgcGVyIHNlY29uZC4gU2V0IHRvIGEgbmVnYXRpdmUgdmFsdWUgdG8gZGlzYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0TWF4U3BlZWQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1heFNwZWVkID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBib3VuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRCb3VuY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgYm91bmNlLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgYm91bmNlLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRCb3VuY2U6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm91bmNlLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGhvcml6b250YWwgYm91bmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0Qm91bmNlWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGJvdW5jZSwgcmVsYXRpdmUgdG8gMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm91bmNlWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm91bmNlLnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIHZlcnRpY2FsIGJvdW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEJvdW5jZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBib3VuY2UsIHJlbGF0aXZlIHRvIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5jZVk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvdW5jZS55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBhY2NlbGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRBY2NlbGVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29tcG9uZW50LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29tcG9uZW50LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBY2NlbGVyYXRpb246IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGhvcml6b250YWwgYWNjZWxlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0QWNjZWxlcmF0aW9uWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFjY2VsZXJhdGlvbiwgaW4gcGl4ZWxzIHBlciBzZWNvbmQgc3F1YXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWNjZWxlcmF0aW9uWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWNjZWxlcmF0aW9uLnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIHZlcnRpY2FsIGFjY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEFjY2VsZXJhdGlvbllcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhY2NlbGVyYXRpb24sIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFjY2VsZXJhdGlvblk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjY2VsZXJhdGlvbi55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEFsbG93RHJhZ1xyXG4gICAgICogQHNpbmNlIDMuOS4wXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2FsbG93RHJhZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gYHRydWVgIHRvIGFsbG93IGRyYWcgb24gdGhpcyBib2R5LCBvciBgZmFsc2VgIHRvIGRpc2FibGUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFsbG93RHJhZzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLmFsbG93RHJhZyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGdyYXZpdHkncyBlZmZlY3Qgb24gdGhpcyBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0QWxsb3dHcmF2aXR5XHJcbiAgICAgKiBAc2luY2UgMy45LjBcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYWxsb3dHcmF2aXR5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBgdHJ1ZWAgdG8gYWxsb3cgZ3Jhdml0eSBvbiB0aGlzIGJvZHksIG9yIGBmYWxzZWAgdG8gZGlzYWJsZSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWxsb3dHcmF2aXR5OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYWxsb3dHcmF2aXR5ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcm90YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRBbGxvd1JvdGF0aW9uXHJcbiAgICAgKiBAc2luY2UgMy45LjBcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjYWxsb3dSb3RhdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gYHRydWVgIHRvIGFsbG93IHJvdGF0aW9uIG9uIHRoaXMgYm9keSwgb3IgYGZhbHNlYCB0byBkaXNhYmxlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbGxvd1JvdGF0aW9uOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYWxsb3dSb3RhdGlvbiA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldERyYWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29tcG9uZW50LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29tcG9uZW50LCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREcmFnOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRyYWcuc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgaG9yaXpvbnRhbCBkcmFnLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0RHJhZ1hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBkcmFnLCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREcmFnWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZHJhZy54ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyB2ZXJ0aWNhbCBkcmFnLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0RHJhZ1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBkcmFnLCBpbiBwaXhlbHMgcGVyIHNlY29uZCBzcXVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREcmFnWTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZHJhZy55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBncmF2aXR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0R3Jhdml0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb21wb25lbnQsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb21wb25lbnQsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEdyYXZpdHk6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ3Jhdml0eS5zZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBob3Jpem9udGFsIGdyYXZpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRHcmF2aXR5WFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGdyYXZpdHksIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEdyYXZpdHlYOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ncmF2aXR5LnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIHZlcnRpY2FsIGdyYXZpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRHcmF2aXR5WVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGdyYXZpdHksIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEdyYXZpdHlZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ncmF2aXR5LnkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGZyaWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0RnJpY3Rpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29tcG9uZW50LCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29tcG9uZW50LCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGcmljdGlvbjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mcmljdGlvbi5zZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBob3Jpem9udGFsIGZyaWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0RnJpY3Rpb25YXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZnJpY3Rpb24gdmFsdWUsIHJlbGF0aXZlIHRvIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZyaWN0aW9uWDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZnJpY3Rpb24ueCA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgdmVydGljYWwgZnJpY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNzZXRGcmljdGlvbllcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBmcmljdGlvbiB2YWx1ZSwgcmVsYXRpdmUgdG8gMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RnJpY3Rpb25ZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mcmljdGlvbi55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBhbmd1bGFyIHZlbG9jaXR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0QW5ndWxhclZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmVsb2NpdHksIGluIGRlZ3JlZXMgcGVyIHNlY29uZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gVGhpcyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QW5ndWxhclZlbG9jaXR5OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmd1bGFyVmVsb2NpdHkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGFuZ3VsYXIgYWNjZWxlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0QW5ndWxhckFjY2VsZXJhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGFjY2VsZXJhdGlvbiwgaW4gZGVncmVlcyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFuZ3VsYXJBY2NlbGVyYXRpb246IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJBY2NlbGVyYXRpb24gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGFuZ3VsYXIgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEFuZ3VsYXJEcmFnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZHJhZywgaW4gZGVncmVlcyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IFRoaXMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFuZ3VsYXJEcmFnOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hbmd1bGFyRHJhZyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBCb2R5J3MgbWFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldE1hc3NcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBtYXNzIHZhbHVlLCByZWxhdGl2ZSB0byAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXNzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tYXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEJvZHkncyBgaW1tb3ZhYmxlYCBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3NldEltbW92YWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIGBpbW1vdmFibGVgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRJbW1vdmFibGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5pbW1vdmFibGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgQm9keSdzIGBlbmFibGVgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjc2V0RW5hYmxlXHJcbiAgICAgKiBAc2luY2UgMy4xNS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmFsdWU9dHJ1ZV0gLSBUaGUgdmFsdWUgdG8gYXNzaWduIHRvIGBlbmFibGVgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBUaGlzIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRFbmFibGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdGhpcy5lbmFibGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEJvZHkncyBob3Jpem9udGFsIHBvc2l0aW9uIChsZWZ0IGVkZ2UpLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I3hcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi54ID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQm9keSdzIHZlcnRpY2FsIHBvc2l0aW9uICh0b3AgZWRnZSkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjeVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB5OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnkgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIEJvZHkncyBib3VuZGFyeS4gSWRlbnRpY2FsIHRvIHguXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjbGVmdFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxlZnQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSByaWdodCBlZGdlIG9mIHRoZSBCb2R5J3MgYm91bmRhcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcmlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54ICsgdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0b3AgZWRnZSBvZiB0aGUgQm9keSdzIGJvdW5kYXJ5LiBJZGVudGljYWwgdG8geS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSN0b3BcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0b3A6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBib3R0b20gZWRnZSBvZiB0aGlzIEJvZHkncyBib3VuZGFyeS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNib3R0b21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b206IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueSArIHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQm9keTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQW4gQXJjYWRlIFBoeXNpY3MgQ29sbGlkZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNoZWNrIGZvciBjb2xsaXNpb24sIG9yIG92ZXJsYXBzLCBiZXR3ZWVuIHR3byBvYmplY3RzXHJcbiAqIGV2ZXJ5IHN0ZXAuIElmIGEgY29sbGlzaW9uLCBvciBvdmVybGFwLCBvY2N1cnMgaXQgd2lsbCBpbnZva2UgdGhlIGdpdmVuIGNhbGxiYWNrcy5cclxuICpcclxuICogQGNsYXNzIENvbGxpZGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5BcmNhZGVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gd29ybGQgLSBUaGUgQXJjYWRlIHBoeXNpY3MgV29ybGQgdGhhdCB3aWxsIG1hbmFnZSB0aGUgY29sbGlzaW9ucy5cclxuICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIFdoZXRoZXIgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbnMgb3Igb3ZlcmxhcC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QxIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVDb2xsaWRlclR5cGV9IG9iamVjdDIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gY29sbGlkZUNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0d28gb2JqZWN0cyBjb2xsaWRlLlxyXG4gKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gcHJvY2Vzc0NhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0d28gb2JqZWN0cyBjb2xsaWRlLiBNdXN0IHJldHVybiBhIGJvb2xlYW4uXHJcbiAqIEBwYXJhbSB7YW55fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gY2FsbCB0aGUgY2FsbGJhY2tzLlxyXG4gKi9cclxudmFyIENvbGxpZGVyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIENvbGxpZGVyICh3b3JsZCwgb3ZlcmxhcE9ubHksIG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdvcmxkIGluIHdoaWNoIHRoZSBib2RpZXMgd2lsbCBjb2xsaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyI3dvcmxkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmxkID0gd29ybGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2xsaWRlciAodW51c2VkIGJ5IFBoYXNlcikuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXIjbmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gJyc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbGxpZGVyIGlzIGFjdGl2ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db2xsaWRlciNhY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRvIGNoZWNrIGZvciBjb2xsaXNpb25zIG9yIG92ZXJsYXBzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyI292ZXJsYXBPbmx5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vdmVybGFwT25seSA9IG92ZXJsYXBPbmx5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXIjb2JqZWN0MVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2JqZWN0MSA9IG9iamVjdDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXIjb2JqZWN0MlxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2JqZWN0MiA9IG9iamVjdDI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db2xsaWRlciNjb2xsaWRlQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZUNhbGxiYWNrID0gY29sbGlkZUNhbGxiYWNrO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIHByb2Nlc3NDYWxsYmFjayBleGlzdHMgaXQgbXVzdCByZXR1cm4gdHJ1ZSBvciBjb2xsaXNpb24gY2hlY2tpbmcgd2lsbCBiZSBza2lwcGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyI3Byb2Nlc3NDYWxsYmFja1xyXG4gICAgICAgICAqIEB0eXBlIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQ2FsbGJhY2sgPSBwcm9jZXNzQ2FsbGJhY2s7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb250ZXh0IHRoZSBjb2xsaWRlQ2FsbGJhY2sgYW5kIHByb2Nlc3NDYWxsYmFjayB3aWxsIHJ1biBpbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db2xsaWRlciNjYWxsYmFja0NvbnRleHRcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tDb250ZXh0ID0gY2FsbGJhY2tDb250ZXh0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgbmFtZSBmb3IgdGhlIENvbGxpZGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBQaGFzZXIgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUsIGl0J3MgZm9yIHlvdXIgb3duIHJlZmVyZW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db2xsaWRlciNzZXROYW1lXHJcbiAgICAgKiBAc2luY2UgMy4xLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIHRvIGFzc2lnbiB0byB0aGUgQ29sbGlkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyfSBUaGlzIENvbGxpZGVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXROYW1lOiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgV29ybGQgYXMgcGFydCBvZiBpdHMgc3RlcCBwcm9jZXNzaW5nLCBpbml0aWFsIG9wZXJhdGlvbiBvZiBjb2xsaXNpb24gY2hlY2tpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXIjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMud29ybGQuY29sbGlkZU9iamVjdHMoXHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0MSxcclxuICAgICAgICAgICAgdGhpcy5vYmplY3QyLFxyXG4gICAgICAgICAgICB0aGlzLmNvbGxpZGVDYWxsYmFjayxcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2FsbGJhY2ssXHJcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tDb250ZXh0LFxyXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXBPbmx5XHJcbiAgICAgICAgKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIENvbGxpZGVyIGZyb20gV29ybGQgYW5kIGRpc3Bvc2VzIG9mIGl0cyByZXNvdXJjZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZC5yZW1vdmVDb2xsaWRlcih0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMub2JqZWN0MSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5vYmplY3QyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5jb2xsaWRlQ2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0NhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrQ29udGV4dCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29sbGlkZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEFyY2FkZUltYWdlID0gcmVxdWlyZSgnLi9BcmNhZGVJbWFnZScpO1xyXG52YXIgQXJjYWRlU3ByaXRlID0gcmVxdWlyZSgnLi9BcmNhZGVTcHJpdGUnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgUGh5c2ljc0dyb3VwID0gcmVxdWlyZSgnLi9QaHlzaWNzR3JvdXAnKTtcclxudmFyIFN0YXRpY1BoeXNpY3NHcm91cCA9IHJlcXVpcmUoJy4vU3RhdGljUGh5c2ljc0dyb3VwJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgQXJjYWRlIFBoeXNpY3MgRmFjdG9yeSBhbGxvd3MgeW91IHRvIGVhc2lseSBjcmVhdGUgQXJjYWRlIFBoeXNpY3MgZW5hYmxlZCBHYW1lIE9iamVjdHMuXHJcbiAqIE9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSB0aGlzIEZhY3RvcnkgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHBoeXNpY3Mgd29ybGQuXHJcbiAqXHJcbiAqIEBjbGFzcyBGYWN0b3J5XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5BcmNhZGVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gd29ybGQgLSBUaGUgQXJjYWRlIFBoeXNpY3MgV29ybGQgaW5zdGFuY2UuXHJcbiAqL1xyXG52YXIgRmFjdG9yeSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBGYWN0b3J5ICh3b3JsZClcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQXJjYWRlIFBoeXNpY3MgV29ybGQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRmFjdG9yeSN3b3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZCA9IHdvcmxkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhpcyBBcmNhZGUgUGh5c2ljcyBpbnN0YW5jZSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkZhY3Rvcnkjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSB3b3JsZC5zY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lLlN5c3RlbXMgdGhpcyBBcmNhZGUgUGh5c2ljcyBpbnN0YW5jZSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkZhY3Rvcnkjc3lzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5cyA9IHdvcmxkLnNjZW5lLnN5cztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFyY2FkZSBQaHlzaWNzIENvbGxpZGVyIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GYWN0b3J5I2NvbGxpZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cHxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXBbXSl9IG9iamVjdDEgLSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cHxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXBbXSl9IG9iamVjdDIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtjb2xsaWRlQ2FsbGJhY2tdIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0d28gb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0d28gb2JqZWN0cyBjb2xsaWRlLiBNdXN0IHJldHVybiBhIGJvb2xlYW4uXHJcbiAgICAgKiBAcGFyYW0geyp9IFtjYWxsYmFja0NvbnRleHRdIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGNhbGwgdGhlIGNhbGxiYWNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXJ9IFRoZSBDb2xsaWRlciB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjb2xsaWRlcjogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuYWRkQ29sbGlkZXIob2JqZWN0MSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBcmNhZGUgUGh5c2ljcyBDb2xsaWRlciBPdmVybGFwIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GYWN0b3J5I292ZXJsYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W118UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwfFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cFtdKX0gb2JqZWN0MSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdHxQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cHxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXBbXSl9IG9iamVjdDIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3Igb3ZlcmxhcC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbcHJvY2Vzc0NhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS4gTXVzdCByZXR1cm4gYSBib29sZWFuLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBjYWxsIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyfSBUaGUgQ29sbGlkZXIgdGhhdCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgb3ZlcmxhcDogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQuYWRkT3ZlcmxhcChvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFuIEFyY2FkZSBQaHlzaWNzIEJvZHkgdG8gdGhlIGdpdmVuIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkZhY3RvcnkjZXhpc3RpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBBIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdGF0aWM9ZmFsc2VdIC0gQ3JlYXRlIGEgU3RhdGljIGJvZHkgKHRydWUpIG9yIER5bmFtaWMgYm9keSAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0aW5nOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgaXNTdGF0aWMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSAoaXNTdGF0aWMpID8gQ09OU1QuU1RBVElDX0JPRFkgOiBDT05TVC5EWU5BTUlDX0JPRFk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuZW5hYmxlQm9keShnYW1lT2JqZWN0LCB0eXBlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBcmNhZGUgSW1hZ2Ugb2JqZWN0IHdpdGggYSBTdGF0aWMgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GYWN0b3J5I3N0YXRpY0ltYWdlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkltYWdlfSBUaGUgSW1hZ2Ugb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpY0ltYWdlOiBmdW5jdGlvbiAoeCwgeSwga2V5LCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgQXJjYWRlSW1hZ2UodGhpcy5zY2VuZSwgeCwgeSwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzLmRpc3BsYXlMaXN0LmFkZChpbWFnZSk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuZW5hYmxlQm9keShpbWFnZSwgQ09OU1QuU1RBVElDX0JPRFkpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW1hZ2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBBcmNhZGUgSW1hZ2Ugb2JqZWN0IHdpdGggYSBEeW5hbWljIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRmFjdG9yeSNpbWFnZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5JbWFnZX0gVGhlIEltYWdlIG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBpbWFnZTogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEFyY2FkZUltYWdlKHRoaXMuc2NlbmUsIHgsIHksIGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICB0aGlzLnN5cy5kaXNwbGF5TGlzdC5hZGQoaW1hZ2UpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLmVuYWJsZUJvZHkoaW1hZ2UsIENPTlNULkRZTkFNSUNfQk9EWSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbWFnZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFyY2FkZSBTcHJpdGUgb2JqZWN0IHdpdGggYSBTdGF0aWMgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GYWN0b3J5I3N0YXRpY1Nwcml0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmUgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TcHJpdGV9IFRoZSBTcHJpdGUgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpY1Nwcml0ZTogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNwcml0ZSA9IG5ldyBBcmNhZGVTcHJpdGUodGhpcy5zY2VuZSwgeCwgeSwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzLmRpc3BsYXlMaXN0LmFkZChzcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuc3lzLnVwZGF0ZUxpc3QuYWRkKHNwcml0ZSk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuZW5hYmxlQm9keShzcHJpdGUsIENPTlNULlNUQVRJQ19CT0RZKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNwcml0ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFyY2FkZSBTcHJpdGUgb2JqZWN0IHdpdGggYSBEeW5hbWljIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRmFjdG9yeSNzcHJpdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3Qgd2lsbCB1c2UgdG8gcmVuZGVyIHdpdGgsIGFzIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TcHJpdGV9IFRoZSBTcHJpdGUgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIHNwcml0ZTogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNwcml0ZSA9IG5ldyBBcmNhZGVTcHJpdGUodGhpcy5zY2VuZSwgeCwgeSwga2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzLmRpc3BsYXlMaXN0LmFkZChzcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuc3lzLnVwZGF0ZUxpc3QuYWRkKHNwcml0ZSk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuZW5hYmxlQm9keShzcHJpdGUsIENPTlNULkRZTkFNSUNfQk9EWSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzcHJpdGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFN0YXRpYyBQaHlzaWNzIEdyb3VwIG9iamVjdC5cclxuICAgICAqIEFsbCBHYW1lIE9iamVjdHMgY3JlYXRlZCBieSB0aGlzIEdyb3VwIHdpbGwgYXV0b21hdGljYWxseSBiZSBzdGF0aWMgQXJjYWRlIFBoeXNpY3Mgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GYWN0b3J5I3N0YXRpY0dyb3VwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWcpfSBbY2hpbGRyZW5dIC0gR2FtZSBPYmplY3RzIHRvIGFkZCB0byB0aGlzIGdyb3VwOyBvciB0aGUgYGNvbmZpZ2AgYXJndW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWd9IFtjb25maWddIC0gU2V0dGluZ3MgZm9yIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwfSBUaGUgU3RhdGljIEdyb3VwIG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWNHcm91cDogZnVuY3Rpb24gKGNoaWxkcmVuLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3lzLnVwZGF0ZUxpc3QuYWRkKG5ldyBTdGF0aWNQaHlzaWNzR3JvdXAodGhpcy53b3JsZCwgdGhpcy53b3JsZC5zY2VuZSwgY2hpbGRyZW4sIGNvbmZpZykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBQaHlzaWNzIEdyb3VwIG9iamVjdC5cclxuICAgICAqIEFsbCBHYW1lIE9iamVjdHMgY3JlYXRlZCBieSB0aGlzIEdyb3VwIHdpbGwgYXV0b21hdGljYWxseSBiZSBkeW5hbWljIEFyY2FkZSBQaHlzaWNzIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRmFjdG9yeSNncm91cFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuUGh5c2ljc0dyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZyl9IFtjaGlsZHJlbl0gLSBHYW1lIE9iamVjdHMgdG8gYWRkIHRvIHRoaXMgZ3JvdXA7IG9yIHRoZSBgY29uZmlnYCBhcmd1bWVudC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLlBoeXNpY3NHcm91cENvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWd9IFtjb25maWddIC0gU2V0dGluZ3MgZm9yIHRoaXMgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwfSBUaGUgR3JvdXAgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGdyb3VwOiBmdW5jdGlvbiAoY2hpbGRyZW4sIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zeXMudXBkYXRlTGlzdC5hZGQobmV3IFBoeXNpY3NHcm91cCh0aGlzLndvcmxkLCB0aGlzLndvcmxkLnNjZW5lLCBjaGlsZHJlbiwgY29uZmlnKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBGYWN0b3J5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkZhY3RvcnkjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZhY3Rvcnk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIGhvcml6b250YWwgb3ZlcmxhcCBiZXR3ZWVuIHR3byBhcmNhZGUgcGh5c2ljcyBib2RpZXMgYW5kIHNldHMgdGhlaXIgcHJvcGVydGllc1xyXG4gKiBhY2NvcmRpbmdseSwgaW5jbHVkaW5nOiBgdG91Y2hpbmcubGVmdGAsIGB0b3VjaGluZy5yaWdodGAsIGB0b3VjaGluZy5ub25lYCBhbmQgYG92ZXJsYXBYJy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5HZXRPdmVybGFwWFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgQm9keSB0byBzZXBhcmF0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTIgLSBUaGUgc2Vjb25kIEJvZHkgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmxhcE9ubHkgLSBJcyB0aGlzIGFuIG92ZXJsYXAgb25seSBjaGVjaywgb3IgcGFydCBvZiBzZXBhcmF0aW9uP1xyXG4gKiBAcGFyYW0ge251bWJlcn0gYmlhcyAtIEEgdmFsdWUgYWRkZWQgdG8gdGhlIGRlbHRhIHZhbHVlcyBkdXJpbmcgY29sbGlzaW9uIGNoZWNrcy4gSW5jcmVhc2UgaXQgdG8gcHJldmVudCBzcHJpdGUgdHVubmVsaW5nKHNwcml0ZXMgcGFzc2luZyB0aHJvdWdoIGFub3RoZXIgaW5zdGVhZCBvZiBjb2xsaWRpbmcpLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbW91bnQgb2Ygb3ZlcmxhcC5cclxuICovXHJcbnZhciBHZXRPdmVybGFwWCA9IGZ1bmN0aW9uIChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCBiaWFzKVxyXG57XHJcbiAgICB2YXIgb3ZlcmxhcCA9IDA7XHJcbiAgICB2YXIgbWF4T3ZlcmxhcCA9IGJvZHkxLmRlbHRhQWJzWCgpICsgYm9keTIuZGVsdGFBYnNYKCkgKyBiaWFzO1xyXG5cclxuICAgIGlmIChib2R5MS5fZHggPT09IDAgJiYgYm9keTIuX2R4ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBUaGV5IG92ZXJsYXAgYnV0IG5laXRoZXIgb2YgdGhlbSBhcmUgbW92aW5nXHJcbiAgICAgICAgYm9keTEuZW1iZWRkZWQgPSB0cnVlO1xyXG4gICAgICAgIGJvZHkyLmVtYmVkZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGJvZHkxLl9keCA+IGJvZHkyLl9keClcclxuICAgIHtcclxuICAgICAgICAvLyAgQm9keTEgaXMgbW92aW5nIHJpZ2h0IGFuZCAvIG9yIEJvZHkyIGlzIG1vdmluZyBsZWZ0XHJcbiAgICAgICAgb3ZlcmxhcCA9IGJvZHkxLnJpZ2h0IC0gYm9keTIueDtcclxuXHJcbiAgICAgICAgaWYgKChvdmVybGFwID4gbWF4T3ZlcmxhcCAmJiAhb3ZlcmxhcE9ubHkpIHx8IGJvZHkxLmNoZWNrQ29sbGlzaW9uLnJpZ2h0ID09PSBmYWxzZSB8fCBib2R5Mi5jaGVja0NvbGxpc2lvbi5sZWZ0ID09PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG92ZXJsYXAgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5MS50b3VjaGluZy5ub25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJvZHkxLnRvdWNoaW5nLnJpZ2h0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGJvZHkyLnRvdWNoaW5nLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgYm9keTIudG91Y2hpbmcubGVmdCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keTIucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5MS5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJvZHkxLmJsb2NrZWQucmlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keTEucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5Mi5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJvZHkyLmJsb2NrZWQubGVmdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChib2R5MS5fZHggPCBib2R5Mi5fZHgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEJvZHkxIGlzIG1vdmluZyBsZWZ0IGFuZC9vciBCb2R5MiBpcyBtb3ZpbmcgcmlnaHRcclxuICAgICAgICBvdmVybGFwID0gYm9keTEueCAtIGJvZHkyLndpZHRoIC0gYm9keTIueDtcclxuXHJcbiAgICAgICAgaWYgKCgtb3ZlcmxhcCA+IG1heE92ZXJsYXAgJiYgIW92ZXJsYXBPbmx5KSB8fCBib2R5MS5jaGVja0NvbGxpc2lvbi5sZWZ0ID09PSBmYWxzZSB8fCBib2R5Mi5jaGVja0NvbGxpc2lvbi5yaWdodCA9PT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdmVybGFwID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keTEudG91Y2hpbmcubm9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBib2R5MS50b3VjaGluZy5sZWZ0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGJvZHkyLnRvdWNoaW5nLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgYm9keTIudG91Y2hpbmcucmlnaHQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkyLnBoeXNpY3NUeXBlID09PSBDT05TVC5TVEFUSUNfQk9EWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYm9keTEuYmxvY2tlZC5ub25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBib2R5MS5ibG9ja2VkLmxlZnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keTEucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5Mi5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJvZHkyLmJsb2NrZWQucmlnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBSZXNldHMgdGhlIG92ZXJsYXBYIHRvIHplcm8gaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgb3IgdG8gdGhlIGFjdHVhbCBwaXhlbCB2YWx1ZSBpZiB0aGVyZSBpc1xyXG4gICAgYm9keTEub3ZlcmxhcFggPSBvdmVybGFwO1xyXG4gICAgYm9keTIub3ZlcmxhcFggPSBvdmVybGFwO1xyXG5cclxuICAgIHJldHVybiBvdmVybGFwO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRPdmVybGFwWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgdmVydGljYWwgb3ZlcmxhcCBiZXR3ZWVuIHR3byBhcmNhZGUgcGh5c2ljcyBib2RpZXMgYW5kIHNldHMgdGhlaXIgcHJvcGVydGllc1xyXG4gKiBhY2NvcmRpbmdseSwgaW5jbHVkaW5nOiBgdG91Y2hpbmcudXBgLCBgdG91Y2hpbmcuZG93bmAsIGB0b3VjaGluZy5ub25lYCBhbmQgYG92ZXJsYXBZJy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5HZXRPdmVybGFwWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgQm9keSB0byBzZXBhcmF0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTIgLSBUaGUgc2Vjb25kIEJvZHkgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmxhcE9ubHkgLSBJcyB0aGlzIGFuIG92ZXJsYXAgb25seSBjaGVjaywgb3IgcGFydCBvZiBzZXBhcmF0aW9uP1xyXG4gKiBAcGFyYW0ge251bWJlcn0gYmlhcyAtIEEgdmFsdWUgYWRkZWQgdG8gdGhlIGRlbHRhIHZhbHVlcyBkdXJpbmcgY29sbGlzaW9uIGNoZWNrcy4gSW5jcmVhc2UgaXQgdG8gcHJldmVudCBzcHJpdGUgdHVubmVsaW5nKHNwcml0ZXMgcGFzc2luZyB0aHJvdWdoIGFub3RoZXIgaW5zdGVhZCBvZiBjb2xsaWRpbmcpLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbW91bnQgb2Ygb3ZlcmxhcC5cclxuICovXHJcbnZhciBHZXRPdmVybGFwWSA9IGZ1bmN0aW9uIChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCBiaWFzKVxyXG57XHJcbiAgICB2YXIgb3ZlcmxhcCA9IDA7XHJcbiAgICB2YXIgbWF4T3ZlcmxhcCA9IGJvZHkxLmRlbHRhQWJzWSgpICsgYm9keTIuZGVsdGFBYnNZKCkgKyBiaWFzO1xyXG5cclxuICAgIGlmIChib2R5MS5fZHkgPT09IDAgJiYgYm9keTIuX2R5ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBUaGV5IG92ZXJsYXAgYnV0IG5laXRoZXIgb2YgdGhlbSBhcmUgbW92aW5nXHJcbiAgICAgICAgYm9keTEuZW1iZWRkZWQgPSB0cnVlO1xyXG4gICAgICAgIGJvZHkyLmVtYmVkZGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGJvZHkxLl9keSA+IGJvZHkyLl9keSlcclxuICAgIHtcclxuICAgICAgICAvLyAgQm9keTEgaXMgbW92aW5nIGRvd24gYW5kL29yIEJvZHkyIGlzIG1vdmluZyB1cFxyXG4gICAgICAgIG92ZXJsYXAgPSBib2R5MS5ib3R0b20gLSBib2R5Mi55O1xyXG5cclxuICAgICAgICBpZiAoKG92ZXJsYXAgPiBtYXhPdmVybGFwICYmICFvdmVybGFwT25seSkgfHwgYm9keTEuY2hlY2tDb2xsaXNpb24uZG93biA9PT0gZmFsc2UgfHwgYm9keTIuY2hlY2tDb2xsaXNpb24udXAgPT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3ZlcmxhcCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkxLnRvdWNoaW5nLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgYm9keTEudG91Y2hpbmcuZG93biA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBib2R5Mi50b3VjaGluZy5ub25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJvZHkyLnRvdWNoaW5nLnVwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib2R5Mi5waHlzaWNzVHlwZSA9PT0gQ09OU1QuU1RBVElDX0JPRFkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkxLmJsb2NrZWQubm9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYm9keTEuYmxvY2tlZC5kb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkxLnBoeXNpY3NUeXBlID09PSBDT05TVC5TVEFUSUNfQk9EWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYm9keTIuYmxvY2tlZC5ub25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBib2R5Mi5ibG9ja2VkLnVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGJvZHkxLl9keSA8IGJvZHkyLl9keSlcclxuICAgIHtcclxuICAgICAgICAvLyAgQm9keTEgaXMgbW92aW5nIHVwIGFuZC9vciBCb2R5MiBpcyBtb3ZpbmcgZG93blxyXG4gICAgICAgIG92ZXJsYXAgPSBib2R5MS55IC0gYm9keTIuYm90dG9tO1xyXG5cclxuICAgICAgICBpZiAoKC1vdmVybGFwID4gbWF4T3ZlcmxhcCAmJiAhb3ZlcmxhcE9ubHkpIHx8IGJvZHkxLmNoZWNrQ29sbGlzaW9uLnVwID09PSBmYWxzZSB8fCBib2R5Mi5jaGVja0NvbGxpc2lvbi5kb3duID09PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG92ZXJsYXAgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5MS50b3VjaGluZy5ub25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJvZHkxLnRvdWNoaW5nLnVwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGJvZHkyLnRvdWNoaW5nLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgYm9keTIudG91Y2hpbmcuZG93biA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keTIucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5MS5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJvZHkxLmJsb2NrZWQudXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keTEucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5Mi5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJvZHkyLmJsb2NrZWQuZG93biA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFJlc2V0cyB0aGUgb3ZlcmxhcFkgdG8gemVybyBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCBvciB0byB0aGUgYWN0dWFsIHBpeGVsIHZhbHVlIGlmIHRoZXJlIGlzXHJcbiAgICBib2R5MS5vdmVybGFwWSA9IG92ZXJsYXA7XHJcbiAgICBib2R5Mi5vdmVybGFwWSA9IG92ZXJsYXA7XHJcblxyXG4gICAgcmV0dXJuIG92ZXJsYXA7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE92ZXJsYXBZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBcmNhZGVTcHJpdGUgPSByZXF1aXJlKCcuL0FyY2FkZVNwcml0ZScpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHcm91cCA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL2dyb3VwL0dyb3VwJyk7XHJcbnZhciBJc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEFuIEFyY2FkZSBQaHlzaWNzIEdyb3VwIG9iamVjdC5cclxuICpcclxuICogQWxsIEdhbWUgT2JqZWN0cyBjcmVhdGVkIGJ5IG9yIGFkZGVkIHRvIHRoaXMgR3JvdXAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGdpdmVuIGR5bmFtaWMgQXJjYWRlIFBoeXNpY3MgYm9kaWVzLCBpZiB0aGV5IGhhdmUgbm8gYm9keS5cclxuICpcclxuICogSXRzIHN0YXRpYyBjb3VudGVycGFydCBpcyB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwfS5cclxuICpcclxuICogQGNsYXNzIEdyb3VwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Hcm91cFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuQXJjYWRlXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGR9IHdvcmxkIC0gVGhlIHBoeXNpY3Mgc2ltdWxhdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoaXMgZ3JvdXAgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuUGh5c2ljc0dyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZyl9IFtjaGlsZHJlbl0gLSBHYW1lIE9iamVjdHMgdG8gYWRkIHRvIHRoaXMgZ3JvdXA7IG9yIHRoZSBgY29uZmlnYCBhcmd1bWVudC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuUGh5c2ljc0dyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZ30gW2NvbmZpZ10gLSBTZXR0aW5ncyBmb3IgdGhpcyBncm91cC5cclxuICovXHJcbnZhciBQaHlzaWNzR3JvdXAgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdyb3VwLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gUGh5c2ljc0dyb3VwICh3b3JsZCwgc2NlbmUsIGNoaWxkcmVuLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiAmJiAhY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxDcmVhdGVDYWxsYmFjazogdGhpcy5jcmVhdGVDYWxsYmFja0hhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbFJlbW92ZUNhbGxiYWNrOiB0aGlzLnJlbW92ZUNhbGxiYWNrSGFuZGxlclxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChJc1BsYWluT2JqZWN0KGNoaWxkcmVuKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBjaGlsZHJlbiBpcyBhIHBsYWluIG9iamVjdCwgc28gc3dpenpsZSB0aGVtOlxyXG4gICAgICAgICAgICBjb25maWcgPSBjaGlsZHJlbjtcclxuICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uZmlnLmludGVybmFsQ3JlYXRlQ2FsbGJhY2sgPSB0aGlzLmNyZWF0ZUNhbGxiYWNrSGFuZGxlcjtcclxuICAgICAgICAgICAgY29uZmlnLmludGVybmFsUmVtb3ZlQ2FsbGJhY2sgPSB0aGlzLnJlbW92ZUNhbGxiYWNrSGFuZGxlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgSXNQbGFpbk9iamVjdChjaGlsZHJlblswXSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgY2hpbGRyZW4gaXMgYW4gYXJyYXkgb2YgcGxhaW4gb2JqZWN0c1xyXG4gICAgICAgICAgICBjb25maWcgPSBjaGlsZHJlblswXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChzaW5nbGVDb25maWcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNpbmdsZUNvbmZpZy5pbnRlcm5hbENyZWF0ZUNhbGxiYWNrID0gX3RoaXMuY3JlYXRlQ2FsbGJhY2tIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgc2luZ2xlQ29uZmlnLmludGVybmFsUmVtb3ZlQ2FsbGJhY2sgPSBfdGhpcy5yZW1vdmVDYWxsYmFja0hhbmRsZXI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBjb25maWcgaXMgbm90IGRlZmluZWQgYW5kIGNoaWxkcmVuIGlzIG5vdCBhIHBsYWluIG9iamVjdCBub3IgYW4gYXJyYXkgb2YgcGxhaW4gb2JqZWN0c1xyXG4gICAgICAgICAgICBjb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbENyZWF0ZUNhbGxiYWNrOiB0aGlzLmNyZWF0ZUNhbGxiYWNrSGFuZGxlcixcclxuICAgICAgICAgICAgICAgIGludGVybmFsUmVtb3ZlQ2FsbGJhY2s6IHRoaXMucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcGh5c2ljcyBzaW11bGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwI3dvcmxkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmxkID0gd29ybGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjbGFzcyB0byBjcmVhdGUgbmV3IEdyb3VwIG1lbWJlcnMgZnJvbS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgc2hvdWxkIGJlIGVpdGhlciBgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkltYWdlYCwgYFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TcHJpdGVgLCBvciBhIGNsYXNzIGV4dGVuZGluZyBvbmUgb2YgdGhvc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuR3JvdXAjY2xhc3NUeXBlXHJcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IEFyY2FkZVNwcml0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbmZpZy5jbGFzc1R5cGUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY2xhc3NUeXBlJywgQXJjYWRlU3ByaXRlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBoeXNpY3MgdHlwZSBvZiB0aGUgR3JvdXAncyBtZW1iZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwI3BoeXNpY3NUeXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkRZTkFNSUNfQk9EWVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGh5c2ljc1R5cGUgPSBDT05TVC5EWU5BTUlDX0JPRFk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQgcGh5c2ljcyBwcm9wZXJ0aWVzIGFwcGxpZWQgdG8gR2FtZSBPYmplY3RzIGFkZGVkIHRvIHRoZSBHcm91cCBvciBjcmVhdGVkIGJ5IHRoZSBHcm91cC4gRGVyaXZlZCBmcm9tIHRoZSBgY29uZmlnYCBhcmd1bWVudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Hcm91cCNkZWZhdWx0c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuUGh5c2ljc0dyb3VwRGVmYXVsdHN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHtcclxuICAgICAgICAgICAgc2V0Q29sbGlkZVdvcmxkQm91bmRzOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY29sbGlkZVdvcmxkQm91bmRzJywgZmFsc2UpLFxyXG4gICAgICAgICAgICBzZXRCb3VuZHNSZWN0YW5nbGU6IEdldEZhc3RWYWx1ZShjb25maWcsICdjdXN0b21Cb3VuZHNSZWN0YW5nbGUnLCBudWxsKSxcclxuICAgICAgICAgICAgc2V0QWNjZWxlcmF0aW9uWDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2FjY2VsZXJhdGlvblgnLCAwKSxcclxuICAgICAgICAgICAgc2V0QWNjZWxlcmF0aW9uWTogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2FjY2VsZXJhdGlvblknLCAwKSxcclxuICAgICAgICAgICAgc2V0QWxsb3dEcmFnOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYWxsb3dEcmFnJywgdHJ1ZSksXHJcbiAgICAgICAgICAgIHNldEFsbG93R3Jhdml0eTogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2FsbG93R3Jhdml0eScsIHRydWUpLFxyXG4gICAgICAgICAgICBzZXRBbGxvd1JvdGF0aW9uOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYWxsb3dSb3RhdGlvbicsIHRydWUpLFxyXG4gICAgICAgICAgICBzZXRCb3VuY2VYOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYm91bmNlWCcsIDApLFxyXG4gICAgICAgICAgICBzZXRCb3VuY2VZOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYm91bmNlWScsIDApLFxyXG4gICAgICAgICAgICBzZXREcmFnWDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RyYWdYJywgMCksXHJcbiAgICAgICAgICAgIHNldERyYWdZOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZHJhZ1knLCAwKSxcclxuICAgICAgICAgICAgc2V0RW5hYmxlOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZW5hYmxlJywgdHJ1ZSksXHJcbiAgICAgICAgICAgIHNldEdyYXZpdHlYOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZ3Jhdml0eVgnLCAwKSxcclxuICAgICAgICAgICAgc2V0R3Jhdml0eVk6IEdldEZhc3RWYWx1ZShjb25maWcsICdncmF2aXR5WScsIDApLFxyXG4gICAgICAgICAgICBzZXRGcmljdGlvblg6IEdldEZhc3RWYWx1ZShjb25maWcsICdmcmljdGlvblgnLCAwKSxcclxuICAgICAgICAgICAgc2V0RnJpY3Rpb25ZOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZnJpY3Rpb25ZJywgMCksXHJcbiAgICAgICAgICAgIHNldFZlbG9jaXR5WDogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3ZlbG9jaXR5WCcsIDApLFxyXG4gICAgICAgICAgICBzZXRWZWxvY2l0eVk6IEdldEZhc3RWYWx1ZShjb25maWcsICd2ZWxvY2l0eVknLCAwKSxcclxuICAgICAgICAgICAgc2V0QW5ndWxhclZlbG9jaXR5OiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYW5ndWxhclZlbG9jaXR5JywgMCksXHJcbiAgICAgICAgICAgIHNldEFuZ3VsYXJBY2NlbGVyYXRpb246IEdldEZhc3RWYWx1ZShjb25maWcsICdhbmd1bGFyQWNjZWxlcmF0aW9uJywgMCksXHJcbiAgICAgICAgICAgIHNldEFuZ3VsYXJEcmFnOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYW5ndWxhckRyYWcnLCAwKSxcclxuICAgICAgICAgICAgc2V0TWFzczogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ21hc3MnLCAxKSxcclxuICAgICAgICAgICAgc2V0SW1tb3ZhYmxlOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaW1tb3ZhYmxlJywgZmFsc2UpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEdyb3VwLmNhbGwodGhpcywgc2NlbmUsIGNoaWxkcmVuLCBjb25maWcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgUGhhc2VyIGJ1dCBpcyBhdmFpbGFibGUgZm9yIHlvdXIgb3duIGN1c3RvbSBjbGFzc2VzIHRvIHBvcHVsYXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBkZWZhdWx0ICdQaHlzaWNzR3JvdXAnXHJcbiAgICAgICAgICogQHNpbmNlIDMuMjEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9ICdQaHlzaWNzR3JvdXAnO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgYSBHYW1lIE9iamVjdCdzIEJvZHkgYW5kIGFzc2lnbnMgYGRlZmF1bHRzYC4gQ2FsbGVkIHdoZW4gYSBHcm91cCBtZW1iZXIgaXMgYWRkZWQgb3IgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Hcm91cCNjcmVhdGVDYWxsYmFja0hhbmRsZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGNoaWxkIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIGFkZGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDYWxsYmFja0hhbmRsZXI6IGZ1bmN0aW9uIChjaGlsZClcclxuICAgIHtcclxuICAgICAgICBpZiAoIWNoaWxkLmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmVuYWJsZUJvZHkoY2hpbGQsIENPTlNULkRZTkFNSUNfQk9EWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYm9keSA9IGNoaWxkLmJvZHk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRlZmF1bHRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keVtrZXldKHRoaXMuZGVmYXVsdHNba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2FibGVzIGEgR2FtZSBPYmplY3QncyBCb2R5LiBDYWxsZWQgd2hlbiBhIEdyb3VwIG1lbWJlciBpcyByZW1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwI3JlbW92ZUNhbGxiYWNrSGFuZGxlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGQgLSBUaGUgR2FtZSBPYmplY3QgYmVpbmcgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2FsbGJhY2tIYW5kbGVyOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNoaWxkLmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmRpc2FibGVCb2R5KGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVsb2NpdHkgb2YgZWFjaCBHcm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuR3JvdXAjc2V0VmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgdmVsb2NpdHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCB2ZWxvY2l0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoZSB2ZWxvY2l0eSBpbmNyZW1lbnQuIFdoZW4gc2V0LCB0aGUgZmlyc3QgbWVtYmVyIHJlY2VpdmVzIHZlbG9jaXR5ICh4LCB5KSwgdGhlIHNlY29uZCAoeCArIHN0ZXAsIHkgKyBzdGVwKSwgYW5kIHNvIG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Hcm91cH0gVGhpcyBQaHlzaWNzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VmVsb2NpdHk6IGZ1bmN0aW9uICh4LCB5LCBzdGVwKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzdGVwID09PSB1bmRlZmluZWQpIHsgc3RlcCA9IDA7IH1cclxuXHJcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRDaGlsZHJlbigpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXNbaV0uYm9keS52ZWxvY2l0eS5zZXQoeCArIChpICogc3RlcCksIHkgKyAoaSAqIHN0ZXApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGhvcml6b250YWwgdmVsb2NpdHkgb2YgZWFjaCBHcm91cCBtZW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuR3JvdXAjc2V0VmVsb2NpdHlYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmVsb2NpdHkgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF0gLSBUaGUgdmVsb2NpdHkgaW5jcmVtZW50LiBXaGVuIHNldCwgdGhlIGZpcnN0IG1lbWJlciByZWNlaXZlcyB2ZWxvY2l0eSAoeCksIHRoZSBzZWNvbmQgKHggKyBzdGVwKSwgYW5kIHNvIG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Hcm91cH0gVGhpcyBQaHlzaWNzIEdyb3VwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VmVsb2NpdHlYOiBmdW5jdGlvbiAodmFsdWUsIHN0ZXApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHN0ZXAgPT09IHVuZGVmaW5lZCkgeyBzdGVwID0gMDsgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmdldENoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtc1tpXS5ib2R5LnZlbG9jaXR5LnggPSB2YWx1ZSArIChpICogc3RlcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCB2ZWxvY2l0eSBvZiBlYWNoIEdyb3VwIG1lbWJlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Hcm91cCNzZXRWZWxvY2l0eVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2ZWxvY2l0eSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0wXSAtIFRoZSB2ZWxvY2l0eSBpbmNyZW1lbnQuIFdoZW4gc2V0LCB0aGUgZmlyc3QgbWVtYmVyIHJlY2VpdmVzIHZlbG9jaXR5ICh5KSwgdGhlIHNlY29uZCAoeSArIHN0ZXApLCBhbmQgc28gb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwfSBUaGlzIFBoeXNpY3MgR3JvdXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eVk6IGZ1bmN0aW9uICh2YWx1ZSwgc3RlcClcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RlcCA9PT0gdW5kZWZpbmVkKSB7IHN0ZXAgPSAwOyB9XHJcblxyXG4gICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldLmJvZHkudmVsb2NpdHkueSA9IHZhbHVlICsgKGkgKiBzdGVwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBoeXNpY3NHcm91cDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0T3ZlcmxhcFggPSByZXF1aXJlKCcuL0dldE92ZXJsYXBYJyk7XHJcblxyXG4vKipcclxuICogU2VwYXJhdGVzIHR3byBvdmVybGFwcGluZyBib2RpZXMgb24gdGhlIFgtYXhpcyAoaG9yaXpvbnRhbGx5KS5cclxuICpcclxuICogU2VwYXJhdGlvbiBpbnZvbHZlcyBtb3ZpbmcgdHdvIG92ZXJsYXBwaW5nIGJvZGllcyBzbyB0aGV5IGRvbid0IG92ZXJsYXAgYW55bW9yZSBhbmQgYWRqdXN0aW5nIHRoZWlyIHZlbG9jaXRpZXMgYmFzZWQgb24gdGhlaXIgbWFzcy4gVGhpcyBpcyBhIGNvcmUgcGFydCBvZiBjb2xsaXNpb24gZGV0ZWN0aW9uLlxyXG4gKlxyXG4gKiBUaGUgYm9kaWVzIHdvbid0IGJlIHNlcGFyYXRlZCBpZiB0aGVyZSBpcyBubyBob3Jpem9udGFsIG92ZXJsYXAgYmV0d2VlbiB0aGVtLCBpZiB0aGV5IGFyZSBzdGF0aWMsIG9yIGlmIGVpdGhlciBvbmUgdXNlcyBjdXN0b20gbG9naWMgZm9yIGl0cyBzZXBhcmF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlNlcGFyYXRlWFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgQm9keSB0byBzZXBhcmF0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTIgLSBUaGUgc2Vjb25kIEJvZHkgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmxhcE9ubHkgLSBJZiBgdHJ1ZWAsIHRoZSBib2RpZXMgd2lsbCBvbmx5IGhhdmUgdGhlaXIgb3ZlcmxhcCBkYXRhIHNldCBhbmQgbm8gc2VwYXJhdGlvbiB3aWxsIHRha2UgcGxhY2UuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiaWFzIC0gQSB2YWx1ZSB0byBhZGQgdG8gdGhlIGRlbHRhIHZhbHVlIGR1cmluZyBvdmVybGFwIGNoZWNraW5nLiBVc2VkIHRvIHByZXZlbnQgc3ByaXRlIHR1bm5lbGluZy5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gYm9kaWVzIG92ZXJsYXAgaG9yaXpvbnRhbGx5LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBTZXBhcmF0ZVggPSBmdW5jdGlvbiAoYm9keTEsIGJvZHkyLCBvdmVybGFwT25seSwgYmlhcylcclxue1xyXG4gICAgdmFyIG92ZXJsYXAgPSBHZXRPdmVybGFwWChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCBiaWFzKTtcclxuXHJcbiAgICAvLyAgQ2FuJ3Qgc2VwYXJhdGUgdHdvIGltbW92YWJsZSBib2RpZXMsIG9yIGEgYm9keSB3aXRoIGl0cyBvd24gY3VzdG9tIHNlcGFyYXRpb24gbG9naWNcclxuICAgIGlmIChvdmVybGFwT25seSB8fCBvdmVybGFwID09PSAwIHx8IChib2R5MS5pbW1vdmFibGUgJiYgYm9keTIuaW1tb3ZhYmxlKSB8fCBib2R5MS5jdXN0b21TZXBhcmF0ZVggfHwgYm9keTIuY3VzdG9tU2VwYXJhdGVYKVxyXG4gICAge1xyXG4gICAgICAgIC8vICByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3YXMgc29tZSBvdmVybGFwLCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAgICByZXR1cm4gKG92ZXJsYXAgIT09IDApIHx8IChib2R5MS5lbWJlZGRlZCAmJiBib2R5Mi5lbWJlZGRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFkanVzdCB0aGVpciBwb3NpdGlvbnMgYW5kIHZlbG9jaXRpZXMgYWNjb3JkaW5nbHkgKGlmIHRoZXJlIHdhcyBhbnkgb3ZlcmxhcClcclxuICAgIHZhciB2MSA9IGJvZHkxLnZlbG9jaXR5Lng7XHJcbiAgICB2YXIgdjIgPSBib2R5Mi52ZWxvY2l0eS54O1xyXG5cclxuICAgIGlmICghYm9keTEuaW1tb3ZhYmxlICYmICFib2R5Mi5pbW1vdmFibGUpXHJcbiAgICB7XHJcbiAgICAgICAgb3ZlcmxhcCAqPSAwLjU7XHJcblxyXG4gICAgICAgIGJvZHkxLnggLT0gb3ZlcmxhcDtcclxuICAgICAgICBib2R5Mi54ICs9IG92ZXJsYXA7XHJcblxyXG4gICAgICAgIHZhciBudjEgPSBNYXRoLnNxcnQoKHYyICogdjIgKiBib2R5Mi5tYXNzKSAvIGJvZHkxLm1hc3MpICogKCh2MiA+IDApID8gMSA6IC0xKTtcclxuICAgICAgICB2YXIgbnYyID0gTWF0aC5zcXJ0KCh2MSAqIHYxICogYm9keTEubWFzcykgLyBib2R5Mi5tYXNzKSAqICgodjEgPiAwKSA/IDEgOiAtMSk7XHJcbiAgICAgICAgdmFyIGF2ZyA9IChudjEgKyBudjIpICogMC41O1xyXG5cclxuICAgICAgICBudjEgLT0gYXZnO1xyXG4gICAgICAgIG52MiAtPSBhdmc7XHJcblxyXG4gICAgICAgIGJvZHkxLnZlbG9jaXR5LnggPSBhdmcgKyBudjEgKiBib2R5MS5ib3VuY2UueDtcclxuICAgICAgICBib2R5Mi52ZWxvY2l0eS54ID0gYXZnICsgbnYyICogYm9keTIuYm91bmNlLng7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghYm9keTEuaW1tb3ZhYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGJvZHkxLnggLT0gb3ZlcmxhcDtcclxuICAgICAgICBib2R5MS52ZWxvY2l0eS54ID0gdjIgLSB2MSAqIGJvZHkxLmJvdW5jZS54O1xyXG5cclxuICAgICAgICAvLyAgVGhpcyBpcyBzcGVjaWFsIGNhc2UgY29kZSB0aGF0IGhhbmRsZXMgdGhpbmdzIGxpa2UgdmVydGljYWxseSBtb3ZpbmcgcGxhdGZvcm1zIHlvdSBjYW4gcmlkZVxyXG4gICAgICAgIGlmIChib2R5Mi5tb3ZlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkxLnkgKz0gKGJvZHkyLnkgLSBib2R5Mi5wcmV2LnkpICogYm9keTIuZnJpY3Rpb24ueTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgYm9keTIueCArPSBvdmVybGFwO1xyXG4gICAgICAgIGJvZHkyLnZlbG9jaXR5LnggPSB2MSAtIHYyICogYm9keTIuYm91bmNlLng7XHJcblxyXG4gICAgICAgIC8vICBUaGlzIGlzIHNwZWNpYWwgY2FzZSBjb2RlIHRoYXQgaGFuZGxlcyB0aGluZ3MgbGlrZSB2ZXJ0aWNhbGx5IG1vdmluZyBwbGF0Zm9ybXMgeW91IGNhbiByaWRlXHJcbiAgICAgICAgaWYgKGJvZHkxLm1vdmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keTIueSArPSAoYm9keTEueSAtIGJvZHkxLnByZXYueSkgKiBib2R5MS5mcmljdGlvbi55O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAgSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gdGhlcmUgV0FTIG92ZXJsYXAsIGFuZCBzZXBhcmF0aW9uIGlzIGNvbXBsZXRlLCBzbyByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNlcGFyYXRlWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0T3ZlcmxhcFkgPSByZXF1aXJlKCcuL0dldE92ZXJsYXBZJyk7XHJcblxyXG4vKipcclxuICogU2VwYXJhdGVzIHR3byBvdmVybGFwcGluZyBib2RpZXMgb24gdGhlIFktYXhpcyAodmVydGljYWxseSkuXHJcbiAqXHJcbiAqIFNlcGFyYXRpb24gaW52b2x2ZXMgbW92aW5nIHR3byBvdmVybGFwcGluZyBib2RpZXMgc28gdGhleSBkb24ndCBvdmVybGFwIGFueW1vcmUgYW5kIGFkanVzdGluZyB0aGVpciB2ZWxvY2l0aWVzIGJhc2VkIG9uIHRoZWlyIG1hc3MuIFRoaXMgaXMgYSBjb3JlIHBhcnQgb2YgY29sbGlzaW9uIGRldGVjdGlvbi5cclxuICpcclxuICogVGhlIGJvZGllcyB3b24ndCBiZSBzZXBhcmF0ZWQgaWYgdGhlcmUgaXMgbm8gdmVydGljYWwgb3ZlcmxhcCBiZXR3ZWVuIHRoZW0sIGlmIHRoZXkgYXJlIHN0YXRpYywgb3IgaWYgZWl0aGVyIG9uZSB1c2VzIGN1c3RvbSBsb2dpYyBmb3IgaXRzIHNlcGFyYXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU2VwYXJhdGVZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5MSAtIFRoZSBmaXJzdCBCb2R5IHRvIHNlcGFyYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5MiAtIFRoZSBzZWNvbmQgQm9keSB0byBzZXBhcmF0ZS5cclxuICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIElmIGB0cnVlYCwgdGhlIGJvZGllcyB3aWxsIG9ubHkgaGF2ZSB0aGVpciBvdmVybGFwIGRhdGEgc2V0IGFuZCBubyBzZXBhcmF0aW9uIHdpbGwgdGFrZSBwbGFjZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGJpYXMgLSBBIHZhbHVlIHRvIGFkZCB0byB0aGUgZGVsdGEgdmFsdWUgZHVyaW5nIG92ZXJsYXAgY2hlY2tpbmcuIFVzZWQgdG8gcHJldmVudCBzcHJpdGUgdHVubmVsaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR3byBib2RpZXMgb3ZlcmxhcCB2ZXJ0aWNhbGx5LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBTZXBhcmF0ZVkgPSBmdW5jdGlvbiAoYm9keTEsIGJvZHkyLCBvdmVybGFwT25seSwgYmlhcylcclxue1xyXG4gICAgdmFyIG92ZXJsYXAgPSBHZXRPdmVybGFwWShib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCBiaWFzKTtcclxuXHJcbiAgICAvLyAgQ2FuJ3Qgc2VwYXJhdGUgdHdvIGltbW92YWJsZSBib2RpZXMsIG9yIGEgYm9keSB3aXRoIGl0cyBvd24gY3VzdG9tIHNlcGFyYXRpb24gbG9naWNcclxuICAgIGlmIChvdmVybGFwT25seSB8fCBvdmVybGFwID09PSAwIHx8IChib2R5MS5pbW1vdmFibGUgJiYgYm9keTIuaW1tb3ZhYmxlKSB8fCBib2R5MS5jdXN0b21TZXBhcmF0ZVkgfHwgYm9keTIuY3VzdG9tU2VwYXJhdGVZKVxyXG4gICAge1xyXG4gICAgICAgIC8vICByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3YXMgc29tZSBvdmVybGFwLCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAgICByZXR1cm4gKG92ZXJsYXAgIT09IDApIHx8IChib2R5MS5lbWJlZGRlZCAmJiBib2R5Mi5lbWJlZGRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFkanVzdCB0aGVpciBwb3NpdGlvbnMgYW5kIHZlbG9jaXRpZXMgYWNjb3JkaW5nbHkgKGlmIHRoZXJlIHdhcyBhbnkgb3ZlcmxhcClcclxuICAgIHZhciB2MSA9IGJvZHkxLnZlbG9jaXR5Lnk7XHJcbiAgICB2YXIgdjIgPSBib2R5Mi52ZWxvY2l0eS55O1xyXG5cclxuICAgIGlmICghYm9keTEuaW1tb3ZhYmxlICYmICFib2R5Mi5pbW1vdmFibGUpXHJcbiAgICB7XHJcbiAgICAgICAgb3ZlcmxhcCAqPSAwLjU7XHJcblxyXG4gICAgICAgIGJvZHkxLnkgLT0gb3ZlcmxhcDtcclxuICAgICAgICBib2R5Mi55ICs9IG92ZXJsYXA7XHJcblxyXG4gICAgICAgIHZhciBudjEgPSBNYXRoLnNxcnQoKHYyICogdjIgKiBib2R5Mi5tYXNzKSAvIGJvZHkxLm1hc3MpICogKCh2MiA+IDApID8gMSA6IC0xKTtcclxuICAgICAgICB2YXIgbnYyID0gTWF0aC5zcXJ0KCh2MSAqIHYxICogYm9keTEubWFzcykgLyBib2R5Mi5tYXNzKSAqICgodjEgPiAwKSA/IDEgOiAtMSk7XHJcbiAgICAgICAgdmFyIGF2ZyA9IChudjEgKyBudjIpICogMC41O1xyXG5cclxuICAgICAgICBudjEgLT0gYXZnO1xyXG4gICAgICAgIG52MiAtPSBhdmc7XHJcblxyXG4gICAgICAgIGJvZHkxLnZlbG9jaXR5LnkgPSBhdmcgKyBudjEgKiBib2R5MS5ib3VuY2UueTtcclxuICAgICAgICBib2R5Mi52ZWxvY2l0eS55ID0gYXZnICsgbnYyICogYm9keTIuYm91bmNlLnk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghYm9keTEuaW1tb3ZhYmxlKVxyXG4gICAge1xyXG4gICAgICAgIGJvZHkxLnkgLT0gb3ZlcmxhcDtcclxuICAgICAgICBib2R5MS52ZWxvY2l0eS55ID0gdjIgLSB2MSAqIGJvZHkxLmJvdW5jZS55O1xyXG5cclxuICAgICAgICAvLyAgVGhpcyBpcyBzcGVjaWFsIGNhc2UgY29kZSB0aGF0IGhhbmRsZXMgdGhpbmdzIGxpa2UgaG9yaXpvbnRhbCBtb3ZpbmcgcGxhdGZvcm1zIHlvdSBjYW4gcmlkZVxyXG4gICAgICAgIGlmIChib2R5Mi5tb3ZlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkxLnggKz0gKGJvZHkyLnggLSBib2R5Mi5wcmV2LngpICogYm9keTIuZnJpY3Rpb24ueDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgYm9keTIueSArPSBvdmVybGFwO1xyXG4gICAgICAgIGJvZHkyLnZlbG9jaXR5LnkgPSB2MSAtIHYyICogYm9keTIuYm91bmNlLnk7XHJcblxyXG4gICAgICAgIC8vICBUaGlzIGlzIHNwZWNpYWwgY2FzZSBjb2RlIHRoYXQgaGFuZGxlcyB0aGluZ3MgbGlrZSBob3Jpem9udGFsIG1vdmluZyBwbGF0Zm9ybXMgeW91IGNhbiByaWRlXHJcbiAgICAgICAgaWYgKGJvZHkxLm1vdmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keTIueCArPSAoYm9keTEueCAtIGJvZHkxLnByZXYueCkgKiBib2R5MS5mcmljdGlvbi54O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAgSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gdGhlcmUgV0FTIG92ZXJsYXAsIGFuZCBzZXBhcmF0aW9uIGlzIGNvbXBsZXRlLCBzbyByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNlcGFyYXRlWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2lyY2xlQ29udGFpbnMgPSByZXF1aXJlKCcuLi8uLi9nZW9tL2NpcmNsZS9Db250YWlucycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBSZWN0YW5nbGVDb250YWlucyA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL0NvbnRhaW5zJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFN0YXRpYyBBcmNhZGUgUGh5c2ljcyBCb2R5LlxyXG4gKlxyXG4gKiBBIFN0YXRpYyBCb2R5IG5ldmVyIG1vdmVzLCBhbmQgaXNuJ3QgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZWQgd2l0aCBpdHMgcGFyZW50IEdhbWUgT2JqZWN0LlxyXG4gKiBUaGF0IG1lYW5zIGlmIHlvdSBtYWtlIGFueSBjaGFuZ2UgdG8gdGhlIHBhcmVudCdzIG9yaWdpbiwgcG9zaXRpb24sIG9yIHNjYWxlIGFmdGVyIGNyZWF0aW5nIG9yIGFkZGluZyB0aGUgYm9keSwgeW91J2xsIG5lZWQgdG8gdXBkYXRlIHRoZSBTdGF0aWMgQm9keSBtYW51YWxseS5cclxuICpcclxuICogQSBTdGF0aWMgQm9keSBjYW4gY29sbGlkZSB3aXRoIG90aGVyIEJvZGllcywgYnV0IGlzIG5ldmVyIG1vdmVkIGJ5IGNvbGxpc2lvbnMuXHJcbiAqXHJcbiAqIEl0cyBkeW5hbWljIGNvdW50ZXJwYXJ0IGlzIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0uXHJcbiAqXHJcbiAqIEBjbGFzcyBTdGF0aWNCb2R5XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5BcmNhZGVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gd29ybGQgLSBUaGUgQXJjYWRlIFBoeXNpY3Mgc2ltdWxhdGlvbiB0aGlzIFN0YXRpYyBCb2R5IGJlbG9uZ3MgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhpcyBTdGF0aWMgQm9keSBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIFN0YXRpY0JvZHkgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3RhdGljQm9keSAod29ybGQsIGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHdpZHRoID0gKGdhbWVPYmplY3QuZGlzcGxheVdpZHRoKSA/IGdhbWVPYmplY3QuZGlzcGxheVdpZHRoIDogNjQ7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IChnYW1lT2JqZWN0LmRpc3BsYXlIZWlnaHQpID8gZ2FtZU9iamVjdC5kaXNwbGF5SGVpZ2h0IDogNjQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBBcmNhZGUgUGh5c2ljcyBzaW11bGF0aW9uIHRoaXMgU3RhdGljIEJvZHkgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3dvcmxkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmxkID0gd29ybGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHYW1lIE9iamVjdCB0aGlzIFN0YXRpYyBCb2R5IGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNnYW1lT2JqZWN0XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZU9iamVjdCA9IGdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIFN0YXRpYyBCb2R5J3MgYm91bmRhcnkgaXMgZHJhd24gdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNkZWJ1Z1Nob3dCb2R5XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWJ1Z1Nob3dCb2R5ID0gd29ybGQuZGVmYXVsdHMuZGVidWdTaG93U3RhdGljQm9keTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbG9yIG9mIHRoaXMgU3RhdGljIEJvZHkgb24gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNkZWJ1Z0JvZHlDb2xvclxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVidWdCb2R5Q29sb3IgPSB3b3JsZC5kZWZhdWx0cy5zdGF0aWNCb2R5RGVidWdDb2xvcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpYyBCb2R5IGlzIHVwZGF0ZWQgYnkgdGhlIHBoeXNpY3Mgc2ltdWxhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2VuYWJsZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVuYWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhpcyBTdGF0aWMgQm9keSdzIGJvdW5kYXJ5IGlzIGNpcmN1bGFyIChgdHJ1ZWApIG9yIHJlY3Rhbmd1bGFyIChgZmFsc2VgKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2lzQ2lyY2xlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzQ2lyY2xlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgU3RhdGljIEJvZHkgaXMgY2lyY3VsYXIsIHRoaXMgaXMgdGhlIHJhZGl1cyBvZiB0aGUgYm91bmRhcnksIGFzIHNldCBieSB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjc2V0Q2lyY2xlfSwgaW4gcGl4ZWxzLlxyXG4gICAgICAgICAqIEVxdWFsIHRvIGBoYWxmV2lkdGhgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcmFkaXVzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yYWRpdXMgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb2Zmc2V0IHNldCBieSB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjc2V0Q2lyY2xlfSBvciB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjc2V0U2l6ZX0uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGRvZXNuJ3QgYWZmZWN0IHRoZSBTdGF0aWMgQm9keSdzIHBvc2l0aW9uLCBiZWNhdXNlIGEgU3RhdGljIEJvZHkgZG9lcyBub3QgZm9sbG93IGl0cyBHYW1lIE9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I29mZnNldFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoaXMgU3RhdGljIEJvZHkgd2l0aGluIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3IFZlY3RvcjIoZ2FtZU9iamVjdC54IC0gZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWCwgZ2FtZU9iamVjdC55IC0gZ2FtZU9iamVjdC5kaXNwbGF5T3JpZ2luWSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgU3RhdGljIEJvZHkncyBib3VuZGFyeSwgaW4gcGl4ZWxzLlxyXG4gICAgICAgICAqIElmIHRoZSBTdGF0aWMgQm9keSBpcyBjaXJjdWxhciwgdGhpcyBpcyBhbHNvIHRoZSBTdGF0aWMgQm9keSdzIGRpYW1ldGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjd2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgU3RhdGljIEJvZHkncyBib3VuZGFyeSwgaW4gcGl4ZWxzLlxyXG4gICAgICAgICAqIElmIHRoZSBTdGF0aWMgQm9keSBpcyBjaXJjdWxhciwgdGhpcyBpcyBhbHNvIHRoZSBTdGF0aWMgQm9keSdzIGRpYW1ldGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGFsZiB0aGUgU3RhdGljIEJvZHkncyB3aWR0aCwgaW4gcGl4ZWxzLlxyXG4gICAgICAgICAqIElmIHRoZSBTdGF0aWMgQm9keSBpcyBjaXJjdWxhciwgdGhpcyBpcyBhbHNvIHRoZSBTdGF0aWMgQm9keSdzIHJhZGl1cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2hhbGZXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oYWxmV2lkdGggPSBNYXRoLmFicyh0aGlzLndpZHRoIC8gMik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhhbGYgdGhlIFN0YXRpYyBCb2R5J3MgaGVpZ2h0LCBpbiBwaXhlbHMuXHJcbiAgICAgICAgICogSWYgdGhlIFN0YXRpYyBCb2R5IGlzIGNpcmN1bGFyLCB0aGlzIGlzIGFsc28gdGhlIFN0YXRpYyBCb2R5J3MgcmFkaXVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjaGFsZkhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oYWxmSGVpZ2h0ID0gTWF0aC5hYnModGhpcy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNlbnRlciBvZiB0aGUgU3RhdGljIEJvZHkncyBib3VuZGFyeS5cclxuICAgICAgICAgKiBUaGlzIGlzIHRoZSBtaWRwb2ludCBvZiBpdHMgYHBvc2l0aW9uYCAodG9wLWxlZnQgY29ybmVyKSBhbmQgaXRzIGJvdHRvbS1yaWdodCBjb3JuZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNjZW50ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKHRoaXMucG9zaXRpb24ueCArIHRoaXMuaGFsZldpZHRoLCB0aGlzLnBvc2l0aW9uLnkgKyB0aGlzLmhhbGZIZWlnaHQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGNvbnN0YW50IHplcm8gdmVsb2NpdHkgdXNlZCBieSB0aGUgQXJjYWRlIFBoeXNpY3Mgc2ltdWxhdGlvbiBmb3IgY2FsY3VsYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjdmVsb2NpdHlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlbG9jaXR5ID0gVmVjdG9yMi5aRVJPO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGNvbnN0YW50IGBmYWxzZWAgdmFsdWUgZXhwZWN0ZWQgYnkgdGhlIEFyY2FkZSBQaHlzaWNzIHNpbXVsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNhbGxvd0dyYXZpdHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWxsb3dHcmF2aXR5ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdyYXZpdGF0aW9uYWwgZm9yY2UgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyBCb2R5LiBWYWx1ZXMgYXJlIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuIEFsd2F5cyB6ZXJvIGZvciBhIFN0YXRpYyBCb2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjZ3Jhdml0eVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ3Jhdml0eSA9IFZlY3RvcjIuWkVSTztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVib3VuZCwgb3IgcmVzdGl0dXRpb24sIGZvbGxvd2luZyBhIGNvbGxpc2lvbiwgcmVsYXRpdmUgdG8gMS4gQWx3YXlzIHplcm8gZm9yIGEgU3RhdGljIEJvZHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNib3VuY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJvdW5jZSA9IFZlY3RvcjIuWkVSTztcclxuXHJcbiAgICAgICAgLy8gIElmIHRydWUgdGhpcyBCb2R5IHdpbGwgZGlzcGF0Y2ggZXZlbnRzXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbXVsYXRpb24gZW1pdHMgYSBgd29ybGRib3VuZHNgIGV2ZW50IHdoZW4gdGhpcyBTdGF0aWNCb2R5IGNvbGxpZGVzIHdpdGggdGhlIHdvcmxkIGJvdW5kYXJ5LlxyXG4gICAgICAgICAqIEFsd2F5cyBmYWxzZSBmb3IgYSBTdGF0aWMgQm9keS4gKFN0YXRpYyBCb2RpZXMgbmV2ZXIgY29sbGlkZSB3aXRoIHRoZSB3b3JsZCBib3VuZGFyeSBhbmQgbmV2ZXIgdHJpZ2dlciBhIGB3b3JsZGJvdW5kc2AgZXZlbnQuKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjb25Xb3JsZEJvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbldvcmxkQm91bmRzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbXVsYXRpb24gZW1pdHMgYSBgY29sbGlkZWAgZXZlbnQgd2hlbiB0aGlzIFN0YXRpY0JvZHkgY29sbGlkZXMgd2l0aCBhbm90aGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjb25Db2xsaWRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uQ29sbGlkZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzaW11bGF0aW9uIGVtaXRzIGFuIGBvdmVybGFwYCBldmVudCB3aGVuIHRoaXMgU3RhdGljQm9keSBvdmVybGFwcyB3aXRoIGFub3RoZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNvbk92ZXJsYXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25PdmVybGFwID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTdGF0aWNCb2R5J3MgaW5lcnRpYSwgcmVsYXRpdmUgdG8gYSBkZWZhdWx0IHVuaXQgKDEpLiBXaXRoIGBib3VuY2VgLCB0aGlzIGFmZmVjdHMgdGhlIGV4Y2hhbmdlIG9mIG1vbWVudHVtICh2ZWxvY2l0aWVzKSBkdXJpbmcgY29sbGlzaW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I21hc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hc3MgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgb2JqZWN0IGNhbiBiZSBtb3ZlZCBieSBjb2xsaXNpb25zIHdpdGggYW5vdGhlciBib2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjaW1tb3ZhYmxlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1tb3ZhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGRpc2FibGluZyB0aGUgZGVmYXVsdCBob3Jpem9udGFsIHNlcGFyYXRpb24gb2YgY29sbGlkaW5nIGJvZGllcy4gUGFzcyB5b3VyIG93biBgY29sbGlkZUhhbmRsZXJgIHRvIHRoZSBjb2xsaWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2N1c3RvbVNlcGFyYXRlWFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXN0b21TZXBhcmF0ZVggPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIGRpc2FibGluZyB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGNvbGxpZGluZyBib2RpZXMuIFBhc3MgeW91ciBvd24gYGNvbGxpZGVIYW5kbGVyYCB0byB0aGUgY29sbGlkZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNjdXN0b21TZXBhcmF0ZVlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU2VwYXJhdGVZID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCBhbm90aGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjb3ZlcmxhcFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgQm9keSBpcyBjb2xsaWRpbmcgd2l0aCBhbm90aGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjb3ZlcmxhcFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBZID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFtb3VudCBvZiBvdmVybGFwIChiZWZvcmUgc2VwYXJhdGlvbiksIGlmIHRoaXMgU3RhdGljQm9keSBpcyBjaXJjdWxhciBhbmQgY29sbGlkaW5nIHdpdGggYW5vdGhlciBjaXJjdWxhciBib2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjb3ZlcmxhcFJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm92ZXJsYXBSID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpY0JvZHkgaGFzIGV2ZXIgb3ZlcmxhcHBlZCB3aXRoIGFub3RoZXIgd2hpbGUgYm90aCB3ZXJlIG5vdCBtb3ZpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNlbWJlZGRlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbWJlZGRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoaXMgU3RhdGljQm9keSBpbnRlcmFjdHMgd2l0aCB0aGUgd29ybGQgYm91bmRhcnkuXHJcbiAgICAgICAgICogQWx3YXlzIGZhbHNlIGZvciBhIFN0YXRpYyBCb2R5LiAoU3RhdGljIEJvZGllcyBuZXZlciBjb2xsaWRlIHdpdGggdGhlIHdvcmxkIGJvdW5kYXJ5LilcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2NvbGxpZGVXb3JsZEJvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb2xsaWRlV29ybGRCb3VuZHMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpY0JvZHkgaXMgY2hlY2tlZCBmb3IgY29sbGlzaW9ucyBhbmQgZm9yIHdoaWNoIGRpcmVjdGlvbnMuIFlvdSBjYW4gc2V0IGBjaGVja0NvbGxpc2lvbi5ub25lID0gZmFsc2VgIHRvIGRpc2FibGUgY29sbGlzaW9uIGNoZWNrcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2NoZWNrQ29sbGlzaW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVCb2R5Q29sbGlzaW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb24gPSB7IG5vbmU6IGZhbHNlLCB1cDogdHJ1ZSwgZG93bjogdHJ1ZSwgbGVmdDogdHJ1ZSwgcmlnaHQ6IHRydWUgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpY0JvZHkgaGFzIGV2ZXIgY29sbGlkZWQgd2l0aCBhbm90aGVyIGJvZHkgYW5kIGluIHdoaWNoIGRpcmVjdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3RvdWNoaW5nXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVCb2R5Q29sbGlzaW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG91Y2hpbmcgPSB7IG5vbmU6IHRydWUsIHVwOiBmYWxzZSwgZG93bjogZmFsc2UsIGxlZnQ6IGZhbHNlLCByaWdodDogZmFsc2UgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpY0JvZHkgd2FzIGNvbGxpZGluZyB3aXRoIGFub3RoZXIgYm9keSBkdXJpbmcgdGhlIGxhc3Qgc3RlcCBvciBhbnkgcHJldmlvdXMgc3RlcCwgYW5kIGluIHdoaWNoIGRpcmVjdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3dhc1RvdWNoaW5nXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVCb2R5Q29sbGlzaW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2FzVG91Y2hpbmcgPSB7IG5vbmU6IHRydWUsIHVwOiBmYWxzZSwgZG93bjogZmFsc2UsIGxlZnQ6IGZhbHNlLCByaWdodDogZmFsc2UgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGlzIFN0YXRpY0JvZHkgaGFzIGV2ZXIgY29sbGlkZWQgd2l0aCBhIHRpbGUgb3IgdGhlIHdvcmxkIGJvdW5kYXJ5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjYmxvY2tlZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQm9keUNvbGxpc2lvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJsb2NrZWQgPSB7IG5vbmU6IHRydWUsIHVwOiBmYWxzZSwgZG93bjogZmFsc2UsIGxlZnQ6IGZhbHNlLCByaWdodDogZmFsc2UgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFN0YXRpY0JvZHkncyBwaHlzaWNzIHR5cGUgKHN0YXRpYyBieSBkZWZhdWx0KS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3BoeXNpY3NUeXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlNUQVRJQ19CT0RZXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waHlzaWNzVHlwZSA9IENPTlNULlNUQVRJQ19CT0RZO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FsY3VsYXRlZCBjaGFuZ2UgaW4gdGhlIFN0YXRpYyBCb2R5J3MgaG9yaXpvbnRhbCBwb3NpdGlvbiBkdXJpbmcgdGhlIGN1cnJlbnQgc3RlcC5cclxuICAgICAgICAgKiBGb3IgYSBzdGF0aWMgYm9keSB0aGlzIGlzIGFsd2F5cyB6ZXJvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjX2R4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZHggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FsY3VsYXRlZCBjaGFuZ2UgaW4gdGhlIFN0YXRpYyBCb2R5J3MgdmVydGljYWwgcG9zaXRpb24gZHVyaW5nIHRoZSBjdXJyZW50IHN0ZXAuXHJcbiAgICAgICAgICogRm9yIGEgc3RhdGljIGJvZHkgdGhpcyBpcyBhbHdheXMgemVyby5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I19keVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2R5ID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBHYW1lIE9iamVjdCB0aGlzIEJvZHkgaXMgYm91bmQgdG8uXHJcbiAgICAgKiBGaXJzdCBpdCByZW1vdmVzIGl0cyByZWZlcmVuY2UgZnJvbSB0aGUgb2xkIEdhbWUgT2JqZWN0LCB0aGVuIHNldHMgdGhlIG5ldyBvbmUuXHJcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9ucyBvZiB0aGlzIEJvZHkgdG8gcmVmbGVjdCB0aGF0IG9mIHRoZSBuZXcgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNzZXRHYW1lT2JqZWN0XHJcbiAgICAgKiBAc2luY2UgMy4xLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIG5ldyBHYW1lIE9iamVjdCB0aGF0IHdpbGwgb3duIHRoaXMgQm9keS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZT10cnVlXSAtIFJlcG9zaXRpb24gYW5kIHJlc2l6ZSB0aGlzIEJvZHkgdG8gbWF0Y2ggdGhlIG5ldyBHYW1lIE9iamVjdD9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keX0gVGhpcyBTdGF0aWMgQm9keSBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSN1cGRhdGVGcm9tR2FtZU9iamVjdFxyXG4gICAgICovXHJcbiAgICBzZXRHYW1lT2JqZWN0OiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwgdXBkYXRlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0ICYmIGdhbWVPYmplY3QgIT09IHRoaXMuZ2FtZU9iamVjdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBSZW1vdmUgdGhpcyBib2R5IGZyb20gdGhlIG9sZCBnYW1lIG9iamVjdFxyXG4gICAgICAgICAgICB0aGlzLmdhbWVPYmplY3QuYm9keSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LmJvZHkgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgLy8gIFVwZGF0ZSBvdXIgcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIHRoaXMuZ2FtZU9iamVjdCA9IGdhbWVPYmplY3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXBkYXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGcm9tR2FtZU9iamVjdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3luY3MgdGhlIFN0YXRpYyBCb2R5J3MgcG9zaXRpb24gYW5kIHNpemUgd2l0aCBpdHMgcGFyZW50IEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjdXBkYXRlRnJvbUdhbWVPYmplY3RcclxuICAgICAqIEBzaW5jZSAzLjEuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBUaGlzIFN0YXRpYyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlRnJvbUdhbWVPYmplY3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZC5zdGF0aWNUcmVlLnJlbW92ZSh0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIGdhbWVPYmplY3QgPSB0aGlzLmdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIGdhbWVPYmplY3QuZ2V0VG9wTGVmdCh0aGlzLnBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IGdhbWVPYmplY3QuZGlzcGxheVdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZ2FtZU9iamVjdC5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLmhhbGZXaWR0aCA9IE1hdGguYWJzKHRoaXMud2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmhhbGZIZWlnaHQgPSBNYXRoLmFicyh0aGlzLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICB0aGlzLmNlbnRlci5zZXQodGhpcy5wb3NpdGlvbi54ICsgdGhpcy5oYWxmV2lkdGgsIHRoaXMucG9zaXRpb24ueSArIHRoaXMuaGFsZkhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuc3RhdGljVHJlZS5pbnNlcnQodGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBvc2l0aW9ucyB0aGUgU3RhdGljIEJvZHkgYXQgYW4gb2Zmc2V0IGZyb20gaXRzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjc2V0T2Zmc2V0XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgU3RhdGljIEJvZHkgZnJvbSB0aGUgR2FtZSBPYmplY3QncyBgeGAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIFN0YXRpYyBCb2R5IGZyb20gdGhlIEdhbWUgT2JqZWN0J3MgYHlgLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBUaGlzIFN0YXRpYyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0T2Zmc2V0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSB4OyB9XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuc3RhdGljVHJlZS5yZW1vdmUodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueCAtPSB0aGlzLm9mZnNldC54O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueSAtPSB0aGlzLm9mZnNldC55O1xyXG5cclxuICAgICAgICB0aGlzLm9mZnNldC5zZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueCArPSB0aGlzLm9mZnNldC54O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24ueSArPSB0aGlzLm9mZnNldC55O1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNlbnRlcigpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUuaW5zZXJ0KHRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBTdGF0aWMgQm9keS5cclxuICAgICAqIFdoZW4gYGNlbnRlcmAgaXMgdHJ1ZSwgYWxzbyByZXBvc2l0aW9ucyBpdC5cclxuICAgICAqIFJlc2V0cyB0aGUgd2lkdGggYW5kIGhlaWdodCB0byBtYXRjaCBjdXJyZW50IGZyYW1lLCBpZiBubyB3aWR0aCBhbmQgaGVpZ2h0IHByb3ZpZGVkIGFuZCBhIGZyYW1lIGlzIGZvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjc2V0U2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSBTdGF0aWMgQm9keSBpbiBwaXhlbHMuIENhbm5vdCBiZSB6ZXJvLiBJZiBub3QgZ2l2ZW4sIGFuZCB0aGUgcGFyZW50IEdhbWUgT2JqZWN0IGhhcyBhIGZyYW1lLCBpdCB3aWxsIHVzZSB0aGUgZnJhbWUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgU3RhdGljIEJvZHkgaW4gcGl4ZWxzLiBDYW5ub3QgYmUgemVyby4gSWYgbm90IGdpdmVuLCBhbmQgdGhlIHBhcmVudCBHYW1lIE9iamVjdCBoYXMgYSBmcmFtZSwgaXQgd2lsbCB1c2UgdGhlIGZyYW1lIGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NlbnRlcj10cnVlXSAtIFBsYWNlIHRoZSBTdGF0aWMgQm9keSdzIGNlbnRlciBvbiBpdHMgR2FtZSBPYmplY3QncyBjZW50ZXIuIE9ubHkgd29ya3MgaWYgdGhlIEdhbWUgT2JqZWN0IGhhcyB0aGUgYGdldENlbnRlcmAgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBUaGlzIFN0YXRpYyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIGNlbnRlcilcclxuICAgIHtcclxuICAgICAgICBpZiAoY2VudGVyID09PSB1bmRlZmluZWQpIHsgY2VudGVyID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgZ2FtZU9iamVjdCA9IHRoaXMuZ2FtZU9iamVjdDtcclxuXHJcbiAgICAgICAgaWYgKCF3aWR0aCAmJiBnYW1lT2JqZWN0LmZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggPSBnYW1lT2JqZWN0LmZyYW1lLnJlYWxXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaGVpZ2h0ICYmIGdhbWVPYmplY3QuZnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBnYW1lT2JqZWN0LmZyYW1lLnJlYWxIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUucmVtb3ZlKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHRoaXMuaGFsZldpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpO1xyXG4gICAgICAgIHRoaXMuaGFsZkhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIGlmIChjZW50ZXIgJiYgZ2FtZU9iamVjdC5nZXRDZW50ZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb3ggPSBnYW1lT2JqZWN0LmRpc3BsYXlXaWR0aCAvIDI7XHJcbiAgICAgICAgICAgIHZhciBveSA9IGdhbWVPYmplY3QuZGlzcGxheUhlaWdodCAvIDI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnggLT0gdGhpcy5vZmZzZXQueDtcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi55IC09IHRoaXMub2Zmc2V0Lnk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9mZnNldC5zZXQob3ggLSB0aGlzLmhhbGZXaWR0aCwgb3kgLSB0aGlzLmhhbGZIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi54ICs9IHRoaXMub2Zmc2V0Lng7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24ueSArPSB0aGlzLm9mZnNldC55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDZW50ZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NpcmNsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmFkaXVzID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZC5zdGF0aWNUcmVlLmluc2VydCh0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGlzIFN0YXRpYyBCb2R5IHRvIGhhdmUgYSBjaXJjdWxhciBib2R5IGFuZCBzZXRzIGl0cyBzaXplIGFuZCBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3NldENpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIFN0YXRpY0JvZHksIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WF0gLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIFN0YXRpY0JvZHkgZnJvbSBpdHMgR2FtZSBPYmplY3QsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WV0gLSBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBTdGF0aWNCb2R5IGZyb20gaXRzIEdhbWUgT2JqZWN0LCBpbiBwaXhlbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHl9IFRoaXMgU3RhdGljIEJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDaXJjbGU6IGZ1bmN0aW9uIChyYWRpdXMsIG9mZnNldFgsIG9mZnNldFkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG9mZnNldFggPT09IHVuZGVmaW5lZCkgeyBvZmZzZXRYID0gdGhpcy5vZmZzZXQueDsgfVxyXG4gICAgICAgIGlmIChvZmZzZXRZID09PSB1bmRlZmluZWQpIHsgb2Zmc2V0WSA9IHRoaXMub2Zmc2V0Lnk7IH1cclxuXHJcbiAgICAgICAgaWYgKHJhZGl1cyA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUucmVtb3ZlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0NpcmNsZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSByYWRpdXMgKiAyO1xyXG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHJhZGl1cyAqIDI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhhbGZXaWR0aCA9IE1hdGguZmxvb3IodGhpcy53aWR0aCAvIDIpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9mZnNldC5zZXQob2Zmc2V0WCwgb2Zmc2V0WSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbnRlcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy53b3JsZC5zdGF0aWNUcmVlLmluc2VydCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NpcmNsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgU3RhdGljQm9keSdzIGBjZW50ZXJgIGZyb20gaXRzIGBwb3NpdGlvbmAgYW5kIGRpbWVuc2lvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSN1cGRhdGVDZW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVDZW50ZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jZW50ZXIuc2V0KHRoaXMucG9zaXRpb24ueCArIHRoaXMuaGFsZldpZHRoLCB0aGlzLnBvc2l0aW9uLnkgKyB0aGlzLmhhbGZIZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIEJvZHkgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzLiBBbHNvIHBvc2l0aW9ucyBpdHMgcGFyZW50IEdhbWUgT2JqZWN0IHRvIHRoZSBzYW1lIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcmVzZXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeF0gLSBUaGUgeCBjb29yZGluYXRlIHRvIHJlc2V0IHRoZSBib2R5IHRvLiBJZiBub3QgZ2l2ZW4gd2lsbCB1c2UgdGhlIHBhcmVudCBHYW1lIE9iamVjdCdzIGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgY29vcmRpbmF0ZSB0byByZXNldCB0aGUgYm9keSB0by4gSWYgbm90IGdpdmVuIHdpbGwgdXNlIHRoZSBwYXJlbnQgR2FtZSBPYmplY3QncyBjb29yZGluYXRlLlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdhbWVPYmplY3QgPSB0aGlzLmdhbWVPYmplY3Q7XHJcblxyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IGdhbWVPYmplY3QueDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IGdhbWVPYmplY3QueTsgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUucmVtb3ZlKHRoaXMpO1xyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LnNldFBvc2l0aW9uKHgsIHkpO1xyXG5cclxuICAgICAgICBnYW1lT2JqZWN0LmdldFRvcExlZnQodGhpcy5wb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQ2VudGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuc3RhdGljVHJlZS5pbnNlcnQodGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTk9PUCBmdW5jdGlvbi4gQSBTdGF0aWMgQm9keSBjYW5ub3QgYmUgc3RvcHBlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3N0b3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBUaGlzIFN0YXRpYyBCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBhbmQgYm90dG9tIHJpZ2h0IHBvaW50cyBvZiB0aGUgU3RhdGljQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2dldEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQm9keUJvdW5kc30gb2JqIC0gVGhlIG9iamVjdCB3aGljaCB3aWxsIGhvbGQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUJvZHlCb3VuZHN9IFRoZSBzYW1lIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgd2l0aCBgeGAsIGB5YCwgYHJpZ2h0YCBhbmQgYGJvdHRvbWAgdmFsdWVzIG1hdGNoaW5nIHRoZSByZXNwZWN0aXZlIHZhbHVlcyBvZiB0aGUgU3RhdGljQm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRzOiBmdW5jdGlvbiAob2JqKVxyXG4gICAge1xyXG4gICAgICAgIG9iai54ID0gdGhpcy54O1xyXG4gICAgICAgIG9iai55ID0gdGhpcy55O1xyXG4gICAgICAgIG9iai5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgb2JqLmJvdHRvbSA9IHRoaXMuYm90dG9tO1xyXG5cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgYSBnaXZlbiB4LHkgY29vcmRpbmF0ZSBpcyBjb2xsaWRpbmcgd2l0aCB0aGlzIFN0YXRpYyBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjaGl0VGVzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGNoZWNrIGFnYWluc3QgdGhpcyBib2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGNoZWNrIGFnYWluc3QgdGhpcyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZ2l2ZW4gY29vcmRpbmF0ZSBsaWVzIHdpdGhpbiB0aGlzIGJvZHksIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBoaXRUZXN0OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuaXNDaXJjbGUpID8gQ2lyY2xlQ29udGFpbnModGhpcywgeCwgeSkgOiBSZWN0YW5nbGVDb250YWlucyh0aGlzLCB4LCB5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOT09QXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNwb3N0VXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKi9cclxuICAgIHBvc3RVcGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFic29sdXRlIChub24tbmVnYXRpdmUpIGNoYW5nZSBpbiB0aGlzIFN0YXRpY0JvZHkncyBob3Jpem9udGFsIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuIEFsd2F5cyB6ZXJvLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjZGVsdGFBYnNYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEFsd2F5cyB6ZXJvIGZvciBhIFN0YXRpYyBCb2R5LlxyXG4gICAgICovXHJcbiAgICBkZWx0YUFic1g6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGFic29sdXRlIChub24tbmVnYXRpdmUpIGNoYW5nZSBpbiB0aGlzIFN0YXRpY0JvZHkncyB2ZXJ0aWNhbCBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBzdGVwLiBBbHdheXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2RlbHRhQWJzWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBbHdheXMgemVybyBmb3IgYSBTdGF0aWMgQm9keS5cclxuICAgICAqL1xyXG4gICAgZGVsdGFBYnNZOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjaGFuZ2UgaW4gdGhpcyBTdGF0aWNCb2R5J3MgaG9yaXpvbnRhbCBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBzdGVwLiBBbHdheXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2RlbHRhWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2hhbmdlIGluIHRoaXMgU3RhdGljQm9keSdzIHZlbG9jaXR5IGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuIEFsd2F5cyB6ZXJvLlxyXG4gICAgICovXHJcbiAgICBkZWx0YVg6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNoYW5nZSBpbiB0aGlzIFN0YXRpY0JvZHkncyB2ZXJ0aWNhbCBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBzdGVwLiBBbHdheXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2RlbHRhWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2hhbmdlIGluIHRoaXMgU3RhdGljQm9keSdzIHZlbG9jaXR5IGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuIEFsd2F5cyB6ZXJvLlxyXG4gICAgICovXHJcbiAgICBkZWx0YVk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNoYW5nZSBpbiB0aGlzIFN0YXRpY0JvZHkncyByb3RhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBzdGVwLiBBbHdheXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2RlbHRhWlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2hhbmdlIGluIHRoaXMgU3RhdGljQm9keSdzIHJvdGF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuIEFsd2F5cyB6ZXJvLlxyXG4gICAgICovXHJcbiAgICBkZWx0YVo6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzYWJsZXMgdGhpcyBCb2R5IGFuZCBtYXJrcyBpdCBmb3IgZGVzdHJ1Y3Rpb24gZHVyaW5nIHRoZSBuZXh0IHN0ZXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmVuYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLnBlbmRpbmdEZXN0cm95LnNldCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgU3RhdGljQm9keSBmb3IgdmlzdWFsIGRlYnVnZ2luZyBwdXJwb3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2RyYXdEZWJ1Z1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWMgLSBUaGUgR3JhcGhpY3Mgb2JqZWN0IHRvIHVzZSBmb3IgdGhlIGRlYnVnIGRyYXdpbmcgb2YgdGhlIFN0YXRpY0JvZHkuXHJcbiAgICAgKi9cclxuICAgIGRyYXdEZWJ1ZzogZnVuY3Rpb24gKGdyYXBoaWMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247XHJcblxyXG4gICAgICAgIHZhciB4ID0gcG9zLnggKyB0aGlzLmhhbGZXaWR0aDtcclxuICAgICAgICB2YXIgeSA9IHBvcy55ICsgdGhpcy5oYWxmSGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z1Nob3dCb2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ3JhcGhpYy5saW5lU3R5bGUoZ3JhcGhpYy5kZWZhdWx0U3Ryb2tlV2lkdGgsIHRoaXMuZGVidWdCb2R5Q29sb3IsIDEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDaXJjbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyYXBoaWMuc3Ryb2tlQ2lyY2xlKHgsIHksIHRoaXMud2lkdGggLyAyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyYXBoaWMuc3Ryb2tlUmVjdChwb3MueCwgcG9zLnksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFN0YXRpY0JvZHkgaXMgZ29pbmcgdG8gYmUgc2hvd2luZyBhIGRlYnVnIHZpc3VhbGl6YXRpb24gZHVyaW5nIHBvc3RVcGRhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSN3aWxsRHJhd0RlYnVnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIG9yIG5vdCB0aGUgU3RhdGljQm9keSBpcyBnb2luZyB0byBzaG93IHRoZSBkZWJ1ZyB2aXN1YWxpemF0aW9uIGR1cmluZyBwb3N0VXBkYXRlLlxyXG4gICAgICovXHJcbiAgICB3aWxsRHJhd0RlYnVnOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnU2hvd0JvZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgTWFzcyBvZiB0aGUgU3RhdGljQm9keS4gV2lsbCBzZXQgdGhlIE1hc3MgdG8gMC4xIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNzZXRNYXNzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBNYXNzIHRvLiBWYWx1ZXMgb2YgemVybyBvciBsZXNzIGFyZSBjaGFuZ2VkIHRvIDAuMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keX0gVGhpcyBTdGF0aWMgQm9keSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldE1hc3M6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPD0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBDYXVzZXMgaGF2b2Mgb3RoZXJ3aXNlXHJcbiAgICAgICAgICAgIHZhbHVlID0gMC4xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIFN0YXRpY0JvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjeFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB4OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUucmVtb3ZlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi54ID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLndvcmxkLnN0YXRpY1RyZWUuaW5zZXJ0KHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgU3RhdGljQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSN5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHk6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud29ybGQuc3RhdGljVHJlZS5yZW1vdmUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uLnkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMud29ybGQuc3RhdGljVHJlZS5pbnNlcnQodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsZWZ0LW1vc3QgeCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHRoZSBTdGF0aWNCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I2xlZnRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsZWZ0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLng7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmlnaHQtbW9zdCB4IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgdGhlIFN0YXRpY0JvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcmlnaHRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByaWdodDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54ICsgdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoaWdoZXN0IHkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiB0aGUgU3RhdGljQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSN0b3BcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB0b3A6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsb3dlc3QgeSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHRoZSBTdGF0aWNCb2R5LiAoeSArIGhlaWdodClcclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNib3R0b21cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib3R0b206IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ueSArIHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3RhdGljQm9keTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXJjYWRlU3ByaXRlID0gcmVxdWlyZSgnLi9BcmNhZGVTcHJpdGUnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgR3JvdXAgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9ncm91cC9Hcm91cCcpO1xyXG52YXIgSXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9Jc1BsYWluT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBbiBBcmNhZGUgUGh5c2ljcyBTdGF0aWMgR3JvdXAgb2JqZWN0LlxyXG4gKlxyXG4gKiBBbGwgR2FtZSBPYmplY3RzIGNyZWF0ZWQgYnkgb3IgYWRkZWQgdG8gdGhpcyBHcm91cCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ2l2ZW4gc3RhdGljIEFyY2FkZSBQaHlzaWNzIGJvZGllcywgaWYgdGhleSBoYXZlIG5vIGJvZHkuXHJcbiAqXHJcbiAqIEl0cyBkeW5hbWljIGNvdW50ZXJwYXJ0IGlzIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuR3JvdXB9LlxyXG4gKlxyXG4gKiBAY2xhc3MgU3RhdGljR3JvdXBcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5BcmNhZGVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gd29ybGQgLSBUaGUgcGh5c2ljcyBzaW11bGF0aW9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhpcyBncm91cCBiZWxvbmdzIHRvLlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENvbmZpZ3xQaGFzZXIuVHlwZXMuR2FtZU9iamVjdHMuR3JvdXAuR3JvdXBDcmVhdGVDb25maWcpfSBbY2hpbGRyZW5dIC0gR2FtZSBPYmplY3RzIHRvIGFkZCB0byB0aGlzIGdyb3VwOyBvciB0aGUgYGNvbmZpZ2AgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLkdyb3VwLkdyb3VwQ29uZmlnfFBoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5Hcm91cC5Hcm91cENyZWF0ZUNvbmZpZ30gW2NvbmZpZ10gLSBTZXR0aW5ncyBmb3IgdGhpcyBncm91cC5cclxuICovXHJcbnZhciBTdGF0aWNQaHlzaWNzR3JvdXAgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEdyb3VwLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3RhdGljUGh5c2ljc0dyb3VwICh3b3JsZCwgc2NlbmUsIGNoaWxkcmVuLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiAmJiAhY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxDcmVhdGVDYWxsYmFjazogdGhpcy5jcmVhdGVDYWxsYmFja0hhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbFJlbW92ZUNhbGxiYWNrOiB0aGlzLnJlbW92ZUNhbGxiYWNrSGFuZGxlcixcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU11bHRpcGxlQ2FsbGJhY2s6IHRoaXMuY3JlYXRlTXVsdGlwbGVDYWxsYmFja0hhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc1R5cGU6IEFyY2FkZVNwcml0ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChJc1BsYWluT2JqZWN0KGNoaWxkcmVuKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBjaGlsZHJlbiBpcyBhIHBsYWluIG9iamVjdCwgc28gc3dpenpsZSB0aGVtOlxyXG4gICAgICAgICAgICBjb25maWcgPSBjaGlsZHJlbjtcclxuICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uZmlnLmludGVybmFsQ3JlYXRlQ2FsbGJhY2sgPSB0aGlzLmNyZWF0ZUNhbGxiYWNrSGFuZGxlcjtcclxuICAgICAgICAgICAgY29uZmlnLmludGVybmFsUmVtb3ZlQ2FsbGJhY2sgPSB0aGlzLnJlbW92ZUNhbGxiYWNrSGFuZGxlcjtcclxuICAgICAgICAgICAgY29uZmlnLmNyZWF0ZU11bHRpcGxlQ2FsbGJhY2sgPSB0aGlzLmNyZWF0ZU11bHRpcGxlQ2FsbGJhY2tIYW5kbGVyO1xyXG4gICAgICAgICAgICBjb25maWcuY2xhc3NUeXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2NsYXNzVHlwZScsIEFyY2FkZVNwcml0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pICYmIElzUGxhaW5PYmplY3QoY2hpbGRyZW5bMF0pKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIGNoaWxkcmVuIGlzIGFuIGFycmF5IG9mIHBsYWluIG9iamVjdHNcclxuICAgICAgICAgICAgY29uZmlnID0gY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uIChzaW5nbGVDb25maWcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNpbmdsZUNvbmZpZy5pbnRlcm5hbENyZWF0ZUNhbGxiYWNrID0gdGhpcy5jcmVhdGVDYWxsYmFja0hhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICBzaW5nbGVDb25maWcuaW50ZXJuYWxSZW1vdmVDYWxsYmFjayA9IHRoaXMucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgc2luZ2xlQ29uZmlnLmNyZWF0ZU11bHRpcGxlQ2FsbGJhY2sgPSB0aGlzLmNyZWF0ZU11bHRpcGxlQ2FsbGJhY2tIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgc2luZ2xlQ29uZmlnLmNsYXNzVHlwZSA9IEdldEZhc3RWYWx1ZShzaW5nbGVDb25maWcsICdjbGFzc1R5cGUnLCBBcmNhZGVTcHJpdGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwaHlzaWNzIHNpbXVsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljR3JvdXAjd29ybGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud29ybGQgPSB3b3JsZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNjZW5lIHRoaXMgZ3JvdXAgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNHcm91cCNwaHlzaWNzVHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TVEFUSUNfQk9EWVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGh5c2ljc1R5cGUgPSBDT05TVC5TVEFUSUNfQk9EWTtcclxuXHJcbiAgICAgICAgR3JvdXAuY2FsbCh0aGlzLCBzY2VuZSwgY2hpbGRyZW4sIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBQaGFzZXIgYnV0IGlzIGF2YWlsYWJsZSBmb3IgeW91ciBvd24gY3VzdG9tIGNsYXNzZXMgdG8gcG9wdWxhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljR3JvdXAjdHlwZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQGRlZmF1bHQgJ1N0YXRpY1BoeXNpY3NHcm91cCdcclxuICAgICAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ1N0YXRpY1BoeXNpY3NHcm91cCc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHN0YXRpYyBwaHlzaWNzIGJvZHkgdG8gdGhlIG5ldyBncm91cCBtZW1iZXIgKGlmIGl0IGxhY2tzIG9uZSkgYW5kIGFkZHMgaXQgdG8gdGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljR3JvdXAjY3JlYXRlQ2FsbGJhY2tIYW5kbGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBuZXcgZ3JvdXAgbWVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2VuYWJsZUJvZHlcclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ2FsbGJhY2tIYW5kbGVyOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFjaGlsZC5ib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JsZC5lbmFibGVCb2R5KGNoaWxkLCBDT05TVC5TVEFUSUNfQk9EWSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2FibGVzIHRoZSBncm91cCBtZW1iZXIncyBwaHlzaWNzIGJvZHksIHJlbW92aW5nIGl0IGZyb20gdGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljR3JvdXAjcmVtb3ZlQ2FsbGJhY2tIYW5kbGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBjaGlsZCAtIFRoZSBncm91cCBtZW1iZXIgYmVpbmcgcmVtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNkaXNhYmxlQm9keVxyXG4gICAgICovXHJcbiAgICByZW1vdmVDYWxsYmFja0hhbmRsZXI6IGZ1bmN0aW9uIChjaGlsZClcclxuICAgIHtcclxuICAgICAgICBpZiAoY2hpbGQuYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud29ybGQuZGlzYWJsZUJvZHkoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZyZXNoZXMgdGhlIGdyb3VwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwI2NyZWF0ZU11bHRpcGxlQ2FsbGJhY2tIYW5kbGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IGVudHJpZXMgLSBUaGUgbmV3bHkgY3JlYXRlZCBncm91cCBtZW1iZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwI3JlZnJlc2hcclxuICAgICAqL1xyXG4gICAgY3JlYXRlTXVsdGlwbGVDYWxsYmFja0hhbmRsZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIGVhY2ggQm9keSB0byB0aGUgcG9zaXRpb24gb2YgaXRzIHBhcmVudCBHYW1lIE9iamVjdC5cclxuICAgICAqIEJvZHkgc2l6ZXMgYXJlbid0IGNoYW5nZWQgKHVzZSB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRW5hYmxlI3JlZnJlc2hCb2R5fSBmb3IgdGhhdCkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljR3JvdXAjcmVmcmVzaFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0dyb3VwfSBUaGlzIGdyb3VwLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcmVzZXRcclxuICAgICAqL1xyXG4gICAgcmVmcmVzaDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmVudHJpZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZHJlbltpXS5ib2R5LnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGF0aWNQaHlzaWNzR3JvdXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJvZHkgPSByZXF1aXJlKCcuL0JvZHknKTtcclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9DbGFtcCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29sbGlkZXIgPSByZXF1aXJlKCcuL0NvbGxpZGVyJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIERpc3RhbmNlQmV0d2VlbiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgRnV6enlFcXVhbCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZnV6enkvRXF1YWwnKTtcclxudmFyIEZ1enp5R3JlYXRlclRoYW4gPSByZXF1aXJlKCcuLi8uLi9tYXRoL2Z1enp5L0dyZWF0ZXJUaGFuJyk7XHJcbnZhciBGdXp6eUxlc3NUaGFuID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9mdXp6eS9MZXNzVGhhbicpO1xyXG52YXIgR2V0T3ZlcmxhcFggPSByZXF1aXJlKCcuL0dldE92ZXJsYXBYJyk7XHJcbnZhciBHZXRPdmVybGFwWSA9IHJlcXVpcmUoJy4vR2V0T3ZlcmxhcFknKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBQcm9jZXNzUXVldWUgPSByZXF1aXJlKCcuLi8uLi9zdHJ1Y3RzL1Byb2Nlc3NRdWV1ZScpO1xyXG52YXIgUHJvY2Vzc1RpbGVDYWxsYmFja3MgPSByZXF1aXJlKCcuL3RpbGVtYXAvUHJvY2Vzc1RpbGVDYWxsYmFja3MnKTtcclxudmFyIFJlY3RhbmdsZSA9IHJlcXVpcmUoJy4uLy4uL2dlb20vcmVjdGFuZ2xlL1JlY3RhbmdsZScpO1xyXG52YXIgUlRyZWUgPSByZXF1aXJlKCcuLi8uLi9zdHJ1Y3RzL1JUcmVlJyk7XHJcbnZhciBTZXBhcmF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGVtYXAvU2VwYXJhdGVUaWxlJyk7XHJcbnZhciBTZXBhcmF0ZVggPSByZXF1aXJlKCcuL1NlcGFyYXRlWCcpO1xyXG52YXIgU2VwYXJhdGVZID0gcmVxdWlyZSgnLi9TZXBhcmF0ZVknKTtcclxudmFyIFNldCA9IHJlcXVpcmUoJy4uLy4uL3N0cnVjdHMvU2V0Jyk7XHJcbnZhciBTdGF0aWNCb2R5ID0gcmVxdWlyZSgnLi9TdGF0aWNCb2R5Jyk7XHJcbnZhciBUaWxlSW50ZXJzZWN0c0JvZHkgPSByZXF1aXJlKCcuL3RpbGVtYXAvVGlsZUludGVyc2VjdHNCb2R5Jyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG52YXIgV3JhcCA9IHJlcXVpcmUoJy4uLy4uL21hdGgvV3JhcCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIEFyY2FkZSBQaHlzaWNzIFdvcmxkLlxyXG4gKlxyXG4gKiBUaGUgV29ybGQgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nLCBtYW5hZ2luZywgY29sbGlkaW5nIGFuZCB1cGRhdGluZyBhbGwgb2YgdGhlIGJvZGllcyB3aXRoaW4gaXQuXHJcbiAqXHJcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBXb3JsZCBiZWxvbmdzIHRvIGEgUGhhc2VyLlNjZW5lIGFuZCBpcyBhY2Nlc3NlZCB2aWEgdGhlIHByb3BlcnR5IGBwaHlzaWNzLndvcmxkYC5cclxuICpcclxuICogQGNsYXNzIFdvcmxkXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5BcmNhZGVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBXb3JsZCBpbnN0YW5jZSBiZWxvbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVXb3JsZENvbmZpZ30gY29uZmlnIC0gQW4gQXJjYWRlIFBoeXNpY3MgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqL1xyXG52YXIgV29ybGQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFdvcmxkIChzY2VuZSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhpcyBzaW11bGF0aW9uIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRHluYW1pYyBCb2RpZXMgaW4gdGhpcyBzaW11bGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2JvZGllc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5Pn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJvZGllcyA9IG5ldyBTZXQoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3RhdGljIEJvZGllcyBpbiB0aGlzIHNpbXVsYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjc3RhdGljQm9kaWVzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLlNldC48UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHk+fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3RhdGljQm9kaWVzID0gbmV3IFNldCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdGF0aWMgQm9kaWVzIG1hcmtlZCBmb3IgZGVsZXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjcGVuZGluZ0Rlc3Ryb3lcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlN0cnVjdHMuU2V0LjwoUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl8UGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkpPn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBlbmRpbmdEZXN0cm95ID0gbmV3IFNldCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIHNpbXVsYXRpb24ncyBjb2xsaXNpb24gcHJvY2Vzc29ycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlcnNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlN0cnVjdHMuUHJvY2Vzc1F1ZXVlLjxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29sbGlkZXI+fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZXJzID0gbmV3IFByb2Nlc3NRdWV1ZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBY2NlbGVyYXRpb24gb2YgQm9kaWVzIGR1ZSB0byBncmF2aXR5LCBpbiBwaXhlbHMgcGVyIHNlY29uZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNncmF2aXR5XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ncmF2aXR5ID0gbmV3IFZlY3RvcjIoR2V0VmFsdWUoY29uZmlnLCAnZ3Jhdml0eS54JywgMCksIEdldFZhbHVlKGNvbmZpZywgJ2dyYXZpdHkueScsIDApKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBib3VuZGFyeSBjb25zdHJhaW5pbmcgQm9kaWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2JvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKFxyXG4gICAgICAgICAgICBHZXRWYWx1ZShjb25maWcsICd4JywgMCksXHJcbiAgICAgICAgICAgIEdldFZhbHVlKGNvbmZpZywgJ3knLCAwKSxcclxuICAgICAgICAgICAgR2V0VmFsdWUoY29uZmlnLCAnd2lkdGgnLCBzY2VuZS5zeXMuc2NhbGUud2lkdGgpLFxyXG4gICAgICAgICAgICBHZXRWYWx1ZShjb25maWcsICdoZWlnaHQnLCBzY2VuZS5zeXMuc2NhbGUuaGVpZ2h0KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBib3VuZGFyeSBlZGdlcyB0aGF0IEJvZGllcyBjYW4gY29sbGlkZSB3aXRoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NoZWNrQ29sbGlzaW9uXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5DaGVja0NvbGxpc2lvbk9iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNoZWNrQ29sbGlzaW9uID0ge1xyXG4gICAgICAgICAgICB1cDogR2V0VmFsdWUoY29uZmlnLCAnY2hlY2tDb2xsaXNpb24udXAnLCB0cnVlKSxcclxuICAgICAgICAgICAgZG93bjogR2V0VmFsdWUoY29uZmlnLCAnY2hlY2tDb2xsaXNpb24uZG93bicsIHRydWUpLFxyXG4gICAgICAgICAgICBsZWZ0OiBHZXRWYWx1ZShjb25maWcsICdjaGVja0NvbGxpc2lvbi5sZWZ0JywgdHJ1ZSksXHJcbiAgICAgICAgICAgIHJpZ2h0OiBHZXRWYWx1ZShjb25maWcsICdjaGVja0NvbGxpc2lvbi5yaWdodCcsIHRydWUpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBwaHlzaWNzIHN0ZXBzIHRvIGJlIHRha2VuIHBlciBzZWNvbmQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seS4gVXNlIHRoZSBgc2V0RlBTYCBtZXRob2QgdG8gbW9kaWZ5IGl0IGF0IHJ1bi10aW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2Zwc1xyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgNjBcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mcHMgPSBHZXRWYWx1ZShjb25maWcsICdmcHMnLCA2MCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNob3VsZCBQaHlzaWNzIHVzZSBhIGZpeGVkIHVwZGF0ZSB0aW1lLXN0ZXAgKHRydWUpIG9yIHN5bmMgdG8gdGhlIHJlbmRlciBmcHMgKGZhbHNlKT8uIFxyXG4gICAgICAgICAqIEZhbHNlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgZGlzYWJsZXMgZnBzIGFuZCB0aW1lU2NhbGUgcHJvcGVydGllcy4gXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjZml4ZWRTdGVwXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpeGVkU3RlcCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgZWxhcHNlZCBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNfZWxhcHNlZFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGZyYW1lIHRpbWUgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjX2ZyYW1lVGltZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZnJhbWVUaW1lID0gMSAvIHRoaXMuZnBzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBmcmFtZSB0aW1lIG1zIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI19mcmFtZVRpbWVNU1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZnJhbWVUaW1lTVMgPSAxMDAwICogdGhpcy5fZnJhbWVUaW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHN0ZXBzIHRoYXQgdG9vayBwbGFjZSBpbiB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNzdGVwc0xhc3RGcmFtZVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3RlcHNMYXN0RnJhbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTY2FsaW5nIGZhY3RvciBhcHBsaWVkIHRvIHRoZSBmcmFtZSByYXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogLSAxLjAgPSBub3JtYWwgc3BlZWRcclxuICAgICAgICAgKiAtIDIuMCA9IGhhbGYgc3BlZWRcclxuICAgICAgICAgKiAtIDAuNSA9IGRvdWJsZSBzcGVlZFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IEdldFZhbHVlKGNvbmZpZywgJ3RpbWVTY2FsZScsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBhYnNvbHV0ZSBkaWZmZXJlbmNlIG9mIGEgQm9keSdzIHBlci1zdGVwIHZlbG9jaXR5IGFuZCBpdHMgb3ZlcmxhcCB3aXRoIGFub3RoZXIgQm9keSB0aGF0IHdpbGwgcmVzdWx0IGluIHNlcGFyYXRpb24gb24gKmVhY2ggYXhpcyouXHJcbiAgICAgICAgICogTGFyZ2VyIHZhbHVlcyBmYXZvciBzZXBhcmF0aW9uLlxyXG4gICAgICAgICAqIFNtYWxsZXIgdmFsdWVzIGZhdm9yIG5vIHNlcGFyYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjT1ZFUkxBUF9CSUFTXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCA0XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5PVkVSTEFQX0JJQVMgPSBHZXRWYWx1ZShjb25maWcsICdvdmVybGFwQmlhcycsIDQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIEJvZHkncyBvdmVybGFwIHdpdGggYSB0aWxlIHRoYXQgd2lsbCByZXN1bHQgaW4gc2VwYXJhdGlvbiBvbiAqZWFjaCBheGlzKi5cclxuICAgICAgICAgKiBMYXJnZXIgdmFsdWVzIGZhdm9yIHNlcGFyYXRpb24uXHJcbiAgICAgICAgICogU21hbGxlciB2YWx1ZXMgZmF2b3Igbm8gc2VwYXJhdGlvbi5cclxuICAgICAgICAgKiBUaGUgb3B0aW11bSB2YWx1ZSBtYXkgYmUgc2ltaWxhciB0byB0aGUgdGlsZSBzaXplLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI1RJTEVfQklBU1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMTZcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLlRJTEVfQklBUyA9IEdldFZhbHVlKGNvbmZpZywgJ3RpbGVCaWFzJywgMTYpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbHdheXMgc2VwYXJhdGUgb3ZlcmxhcHBpbmcgQm9kaWVzIGhvcml6b250YWxseSBiZWZvcmUgdmVydGljYWxseS5cclxuICAgICAgICAgKiBGYWxzZSAodGhlIGRlZmF1bHQpIG1lYW5zIEJvZGllcyBhcmUgZmlyc3Qgc2VwYXJhdGVkIG9uIHRoZSBheGlzIG9mIGdyZWF0ZXIgZ3Jhdml0eSwgb3IgdGhlIHZlcnRpY2FsIGF4aXMgaWYgbmVpdGhlciBpcyBncmVhdGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2ZvcmNlWFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mb3JjZVggPSBHZXRWYWx1ZShjb25maWcsICdmb3JjZVgnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbXVsYXRpb24gYWR2YW5jZXMgd2l0aCB0aGUgZ2FtZSBsb29wLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2lzUGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gR2V0VmFsdWUoY29uZmlnLCAnaXNQYXVzZWQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRlbXBvcmFyeSB0b3RhbCBvZiBjb2xsaWRpbmcgQm9kaWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI190b3RhbFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdG90YWwgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFbmFibGVzIHRoZSBkZWJ1ZyBkaXNwbGF5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2RyYXdEZWJ1Z1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kcmF3RGVidWcgPSBHZXRWYWx1ZShjb25maWcsICdkZWJ1ZycsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGdyYXBoaWNzIG9iamVjdCBkcmF3aW5nIHRoZSBkZWJ1ZyBkaXNwbGF5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2RlYnVnR3JhcGhpY1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0dyYXBoaWM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQgZGVidWcgZGlzcGxheSBzZXR0aW5ncyBmb3IgbmV3IEJvZGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNkZWZhdWx0c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlV29ybGREZWZhdWx0c31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICBkZWJ1Z1Nob3dCb2R5OiBHZXRWYWx1ZShjb25maWcsICdkZWJ1Z1Nob3dCb2R5JywgdHJ1ZSksXHJcbiAgICAgICAgICAgIGRlYnVnU2hvd1N0YXRpY0JvZHk6IEdldFZhbHVlKGNvbmZpZywgJ2RlYnVnU2hvd1N0YXRpY0JvZHknLCB0cnVlKSxcclxuICAgICAgICAgICAgZGVidWdTaG93VmVsb2NpdHk6IEdldFZhbHVlKGNvbmZpZywgJ2RlYnVnU2hvd1ZlbG9jaXR5JywgdHJ1ZSksXHJcbiAgICAgICAgICAgIGJvZHlEZWJ1Z0NvbG9yOiBHZXRWYWx1ZShjb25maWcsICdkZWJ1Z0JvZHlDb2xvcicsIDB4ZmYwMGZmKSxcclxuICAgICAgICAgICAgc3RhdGljQm9keURlYnVnQ29sb3I6IEdldFZhbHVlKGNvbmZpZywgJ2RlYnVnU3RhdGljQm9keUNvbG9yJywgMHgwMDAwZmYpLFxyXG4gICAgICAgICAgICB2ZWxvY2l0eURlYnVnQ29sb3I6IEdldFZhbHVlKGNvbmZpZywgJ2RlYnVnVmVsb2NpdHlDb2xvcicsIDB4MDBmZjAwKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBwZXIgbm9kZSBvbiB0aGUgUlRyZWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIGlzIGlnbm9yZWQgaWYgYHVzZVRyZWVgIGlzIGBmYWxzZWAuIElmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIGJvZGllcyBpblxyXG4gICAgICAgICAqIHlvdXIgd29ybGQgdGhlbiB5b3UgbWF5IGZpbmQgc2VhcmNoIHBlcmZvcm1hbmNlIGltcHJvdmVzIGJ5IGluY3JlYXNpbmcgdGhpcyB2YWx1ZSxcclxuICAgICAgICAgKiB0byBhbGxvdyBtb3JlIGl0ZW1zIHBlciBub2RlIGFuZCBsZXNzIG5vZGUgZGl2aXNpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjbWF4RW50cmllc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDE2XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhFbnRyaWVzID0gR2V0VmFsdWUoY29uZmlnLCAnbWF4RW50cmllcycsIDE2KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2hvdWxkIHRoaXMgQXJjYWRlIFBoeXNpY3MgV29ybGQgdXNlIGFuIFJUcmVlIGZvciBEeW5hbWljIGFuZCBTdGF0aWMgUGh5c2ljcyBib2RpZXM/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBBbiBSVHJlZSBpcyBhIGZhc3Qgd2F5IG9mIHNwYXRpYWxseSBzb3J0aW5nIG9mIGFsbCB0aGUgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAgICAgKiBIb3dldmVyLCBhdCBjZXJ0YWluIGxpbWl0cywgdGhlIGNvc3Qgb2YgY2xlYXJpbmcgYW5kIGluc2VydGluZyB0aGUgYm9kaWVzIGludG8gdGhlXHJcbiAgICAgICAgICogdHJlZSBldmVyeSBmcmFtZSBiZWNvbWVzIG1vcmUgZXhwZW5zaXZlIHRoYW4gdGhlIHNlYXJjaCBzcGVlZCBnYWlucyBpdCBwcm92aWRlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIHlvdSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIGR5bmFtaWMgYm9kaWVzIGluIHlvdXIgd29ybGQgdGhlbiBpdCBtYXkgYmUgYmVzdCB0b1xyXG4gICAgICAgICAqIGRpc2FibGUgdGhlIHVzZSBvZiB0aGUgUlRyZWUgYnkgc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWAgaW4gdGhlIHBoeXNpY3MgY29uZmlnLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBpdCBjYW4gY29wZSB3aXRoIGRlcGVuZHMgb24gYnJvd3NlciBhbmQgZGV2aWNlLCBidXQgYSBjb25zZXJ2YXRpdmUgZXN0aW1hdGVcclxuICAgICAgICAgKiBvZiBhcm91bmQgNSwwMDAgYm9kaWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHRoZSBtYXggYmVmb3JlIGRpc2FibGluZyBpdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoaXMgb25seSBhcHBsaWVzIHRvIGR5bmFtaWMgYm9kaWVzLiBTdGF0aWMgYm9kaWVzIGFyZSBhbHdheXMga2VwdCBpbiBhbiBSVHJlZSxcclxuICAgICAgICAgKiBiZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBjbGVhcmVkIGV2ZXJ5IGZyYW1lLCBzbyB5b3UgYmVuZWZpdCBmcm9tIHRoZVxyXG4gICAgICAgICAqIG1hc3NpdmUgc2VhcmNoIHNwZWVkcyBhbGwgdGhlIHRpbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjdXNlVHJlZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51c2VUcmVlID0gR2V0VmFsdWUoY29uZmlnLCAndXNlVHJlZScsIHRydWUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3BhdGlhbCBpbmRleCBvZiBEeW5hbWljIEJvZGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCN0cmVlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLlJUcmVlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBSVHJlZSh0aGlzLm1heEVudHJpZXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3BhdGlhbCBpbmRleCBvZiBTdGF0aWMgQm9kaWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3N0YXRpY1RyZWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlN0cnVjdHMuUlRyZWV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGF0aWNUcmVlID0gbmV3IFJUcmVlKHRoaXMubWF4RW50cmllcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlY3ljbGVkIGlucHV0IGZvciB0cmVlIHNlYXJjaGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3RyZWVNaW5NYXhcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZVdvcmxkVHJlZU1pbk1heH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRyZWVNaW5NYXggPSB7IG1pblg6IDAsIG1pblk6IDAsIG1heFg6IDAsIG1heFk6IDAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCB1c2VkIGJ5IGJvZGllcyBmb3IgY2FsY3VsYXRpb25zIHdpdGhvdXQgdGhlbSBuZWVkaW5nIHRoZWlyIG93biBsb2NhbCBjb3B5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI190ZW1wTWF0cml4XHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4ID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4IHVzZWQgYnkgYm9kaWVzIGZvciBjYWxjdWxhdGlvbnMgd2l0aG91dCB0aGVtIG5lZWRpbmcgdGhlaXIgb3duIGxvY2FsIGNvcHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjX3RlbXBNYXRyaXgyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4MiA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJhd0RlYnVnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWJ1Z0dyYXBoaWMoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBBcmNhZGUgUGh5c2ljcyBCb2R5IHRvIGEgR2FtZSBPYmplY3QsIGFuIGFycmF5IG9mIEdhbWUgT2JqZWN0cywgb3IgdGhlIGNoaWxkcmVuIG9mIGEgR3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCB0aGUgYGVuYWJsZUJvZHlgIG1ldGhvZCBpcyB0aGF0IHlvdSBjYW4gcGFzcyBhcnJheXMgb3IgR3JvdXBzXHJcbiAgICAgKiB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgaWYgdGhlIGJvZGllcyBhcmUgdG8gYmUgRHluYW1pYyBvciBTdGF0aWMuIEEgZHluYW1pYyBib2R5IGNhbiBtb3ZlIHZpYSB2ZWxvY2l0eSBhbmRcclxuICAgICAqIGFjY2VsZXJhdGlvbi4gQSBzdGF0aWMgYm9keSByZW1haW5zIGZpeGVkIGluIHBsYWNlIGFuZCBhcyBzdWNoIGlzIGFibGUgdG8gdXNlIGFuIG9wdGltaXplZCBzZWFyY2hcclxuICAgICAqIHRyZWUsIG1ha2luZyBpdCBpZGVhbCBmb3Igc3RhdGljIGVsZW1lbnRzIHN1Y2ggYXMgbGV2ZWwgb2JqZWN0cy4gWW91IGNhbiBzdGlsbCBjb2xsaWRlIGFuZCBvdmVybGFwXHJcbiAgICAgKiB3aXRoIHN0YXRpYyBib2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogTm9ybWFsbHksIHJhdGhlciB0aGFuIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHksIHlvdSdkIHVzZSB0aGUgaGVscGVyIG1ldGhvZHMgYXZhaWxhYmxlIGluIHRoZVxyXG4gICAgICogQXJjYWRlIFBoeXNpY3MgRmFjdG9yeSwgc3VjaCBhczpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLnBoeXNpY3MuYWRkLmltYWdlKHgsIHksIHRleHR1cmVLZXkpO1xyXG4gICAgICogdGhpcy5waHlzaWNzLmFkZC5zcHJpdGUoeCwgeSwgdGV4dHVyZUtleSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBDYWxsaW5nIGZhY3RvcnkgbWV0aG9kcyBlbmNhcHN1bGF0ZXMgdGhlIGNyZWF0aW9uIG9mIGEgR2FtZSBPYmplY3QgYW5kIHRoZSBjcmVhdGlvbiBvZiBpdHNcclxuICAgICAqIGJvZHkgYXQgdGhlIHNhbWUgdGltZS4gSWYgeW91IGFyZSBjcmVhdGluZyBjdXN0b20gY2xhc3NlcyB0aGVuIHlvdSBjYW4gcGFzcyB0aGVtIHRvIHRoaXNcclxuICAgICAqIG1ldGhvZCB0byBoYXZlIHRoZWlyIGJvZGllcyBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2VuYWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXB8UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwW10pfSBvYmplY3QgLSBUaGUgb2JqZWN0LCBvciBvYmplY3RzLCBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGJvZGllcy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2JvZHlUeXBlXSAtIFRoZSB0eXBlIG9mIEJvZHkgdG8gY3JlYXRlLiBFaXRoZXIgYERZTkFNSUNfQk9EWWAgb3IgYFNUQVRJQ19CT0RZYC5cclxuICAgICAqL1xyXG4gICAgZW5hYmxlOiBmdW5jdGlvbiAob2JqZWN0LCBib2R5VHlwZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYm9keVR5cGUgPT09IHVuZGVmaW5lZCkgeyBib2R5VHlwZSA9IENPTlNULkRZTkFNSUNfQk9EWTsgfVxyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9iamVjdCA9IFsgb2JqZWN0IF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IG9iamVjdFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc1BhcmVudClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZW50cnkuZ2V0Q2hpbGRyZW4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNoaWxkcmVuLmxlbmd0aDsgYysrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2NdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNQYXJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgSGFuZGxlIEdyb3VwcyBuZXN0ZWQgaW5zaWRlIG9mIEdyb3Vwc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZShjaGlsZCwgYm9keVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUJvZHkoY2hpbGQsIGJvZHlUeXBlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUJvZHkoZW50cnksIGJvZHlUeXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIEFyY2FkZSBQaHlzaWNzIEJvZHkgb24gYSBzaW5nbGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIEdhbWUgT2JqZWN0IGFscmVhZHkgaGFzIGEgYm9keSwgdGhpcyBtZXRob2Qgd2lsbCBzaW1wbHkgYWRkIGl0IGJhY2sgaW50byB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgaWYgdGhlIGJvZHkgaXMgRHluYW1pYyBvciBTdGF0aWMuIEEgZHluYW1pYyBib2R5IGNhbiBtb3ZlIHZpYSB2ZWxvY2l0eSBhbmRcclxuICAgICAqIGFjY2VsZXJhdGlvbi4gQSBzdGF0aWMgYm9keSByZW1haW5zIGZpeGVkIGluIHBsYWNlIGFuZCBhcyBzdWNoIGlzIGFibGUgdG8gdXNlIGFuIG9wdGltaXplZCBzZWFyY2hcclxuICAgICAqIHRyZWUsIG1ha2luZyBpdCBpZGVhbCBmb3Igc3RhdGljIGVsZW1lbnRzIHN1Y2ggYXMgbGV2ZWwgb2JqZWN0cy4gWW91IGNhbiBzdGlsbCBjb2xsaWRlIGFuZCBvdmVybGFwXHJcbiAgICAgKiB3aXRoIHN0YXRpYyBib2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogTm9ybWFsbHksIHJhdGhlciB0aGFuIGNhbGxpbmcgdGhpcyBtZXRob2QgZGlyZWN0bHksIHlvdSdkIHVzZSB0aGUgaGVscGVyIG1ldGhvZHMgYXZhaWxhYmxlIGluIHRoZVxyXG4gICAgICogQXJjYWRlIFBoeXNpY3MgRmFjdG9yeSwgc3VjaCBhczpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLnBoeXNpY3MuYWRkLmltYWdlKHgsIHksIHRleHR1cmVLZXkpO1xyXG4gICAgICogdGhpcy5waHlzaWNzLmFkZC5zcHJpdGUoeCwgeSwgdGV4dHVyZUtleSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBDYWxsaW5nIGZhY3RvcnkgbWV0aG9kcyBlbmNhcHN1bGF0ZXMgdGhlIGNyZWF0aW9uIG9mIGEgR2FtZSBPYmplY3QgYW5kIHRoZSBjcmVhdGlvbiBvZiBpdHNcclxuICAgICAqIGJvZHkgYXQgdGhlIHNhbWUgdGltZS4gSWYgeW91IGFyZSBjcmVhdGluZyBjdXN0b20gY2xhc3NlcyB0aGVuIHlvdSBjYW4gcGFzcyB0aGVtIHRvIHRoaXNcclxuICAgICAqIG1ldGhvZCB0byBoYXZlIHRoZWlyIGJvZGllcyBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2VuYWJsZUJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtib2R5VHlwZV0gLSBUaGUgdHlwZSBvZiBCb2R5IHRvIGNyZWF0ZS4gRWl0aGVyIGBEWU5BTUlDX0JPRFlgIG9yIGBTVEFUSUNfQk9EWWAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCBvbiB3aGljaCB0aGUgYm9keSB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgZW5hYmxlQm9keTogZnVuY3Rpb24gKG9iamVjdCwgYm9keVR5cGUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGJvZHlUeXBlID09PSB1bmRlZmluZWQpIHsgYm9keVR5cGUgPSBDT05TVC5EWU5BTUlDX0JPRFk7IH1cclxuXHJcbiAgICAgICAgaWYgKCFvYmplY3QuYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChib2R5VHlwZSA9PT0gQ09OU1QuRFlOQU1JQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3QuYm9keSA9IG5ldyBCb2R5KHRoaXMsIG9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoYm9keVR5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3QuYm9keSA9IG5ldyBTdGF0aWNCb2R5KHRoaXMsIG9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWRkKG9iamVjdC5ib2R5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIEFyY2FkZSBQaHlzaWNzIEJvZHkgb3IgU3RhdGljQm9keSB0byB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYm9keSBpcyBlbmFibGVkIGFuZCBhZGRlZCB0byB0aGUgbG9jYWwgc2VhcmNoIHRyZWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5KX0gYm9keSAtIFRoZSBCb2R5IHRvIGJlIGFkZGVkIHRvIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSl9IFRoZSBCb2R5IHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChib2R5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChib2R5LnBoeXNpY3NUeXBlID09PSBDT05TVC5EWU5BTUlDX0JPRFkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZGllcy5zZXQoYm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGJvZHkucGh5c2ljc1R5cGUgPT09IENPTlNULlNUQVRJQ19CT0RZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0aWNCb2RpZXMuc2V0KGJvZHkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0aWNUcmVlLmluc2VydChib2R5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJvZHkuZW5hYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJvZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzYWJsZXMgdGhlIEFyY2FkZSBQaHlzaWNzIEJvZHkgb2YgYSBHYW1lIE9iamVjdCwgYW4gYXJyYXkgb2YgR2FtZSBPYmplY3RzLCBvciB0aGUgY2hpbGRyZW4gb2YgYSBHcm91cC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBgZGlzYWJsZUJvZHlgIG1ldGhvZCBpcyB0aGF0IHlvdSBjYW4gcGFzcyBhcnJheXMgb3IgR3JvdXBzXHJcbiAgICAgKiB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYm9keSBpdHNlbGYgaXMgbm90IGRlbGV0ZWQsIGl0IGp1c3QgaGFzIGl0cyBgZW5hYmxlYCBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UsIHdoaWNoXHJcbiAgICAgKiBtZWFucyB5b3UgY2FuIHJlLWVuYWJsZSBpdCBhZ2FpbiBhdCBhbnkgcG9pbnQgYnkgcGFzc2luZyBpdCB0byBlbmFibGUgYFdvcmxkLmVuYWJsZWAgb3IgYFdvcmxkLmFkZGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjZGlzYWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXXxQaGFzZXIuR2FtZU9iamVjdHMuR3JvdXB8UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwW10pfSBvYmplY3QgLSBUaGUgb2JqZWN0LCBvciBvYmplY3RzLCBvbiB3aGljaCB0byBkaXNhYmxlIHRoZSBib2RpZXMuXHJcbiAgICAgKi9cclxuICAgIGRpc2FibGU6IGZ1bmN0aW9uIChvYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9iamVjdCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvYmplY3QgPSBbIG9iamVjdCBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSBvYmplY3RbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkuaXNQYXJlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVudHJ5LmdldENoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaGlsZHJlbi5sZW5ndGg7IGMrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltjXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzUGFyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIEhhbmRsZSBHcm91cHMgbmVzdGVkIGluc2lkZSBvZiBHcm91cHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQm9keShjaGlsZC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVCb2R5KGVudHJ5LmJvZHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc2FibGVzIGFuIGV4aXN0aW5nIEFyY2FkZSBQaHlzaWNzIEJvZHkgb3IgU3RhdGljQm9keSBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBib2R5IGlzIGRpc2FibGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIGxvY2FsIHNlYXJjaCB0cmVlcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYm9keSBpdHNlbGYgaXMgbm90IGRlbGV0ZWQsIGl0IGp1c3QgaGFzIGl0cyBgZW5hYmxlYCBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UsIHdoaWNoXHJcbiAgICAgKiBtZWFucyB5b3UgY2FuIHJlLWVuYWJsZSBpdCBhZ2FpbiBhdCBhbnkgcG9pbnQgYnkgcGFzc2luZyBpdCB0byBlbmFibGUgYFdvcmxkLmVuYWJsZWAgb3IgYFdvcmxkLmFkZGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjZGlzYWJsZUJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5KX0gYm9keSAtIFRoZSBCb2R5IHRvIGJlIGRpc2FibGVkLlxyXG4gICAgICovXHJcbiAgICBkaXNhYmxlQm9keTogZnVuY3Rpb24gKGJvZHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmUoYm9keSk7XHJcblxyXG4gICAgICAgIGJvZHkuZW5hYmxlID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBBcmNhZGUgUGh5c2ljcyBCb2R5IG9yIFN0YXRpY0JvZHkgZnJvbSB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYm9keSBpcyBkaXNhYmxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBsb2NhbCBzZWFyY2ggdHJlZXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGJvZHkgaXRzZWxmIGlzIG5vdCBkZWxldGVkLCBpdCBqdXN0IGhhcyBpdHMgYGVuYWJsZWRgIHByb3BlcnR5IHNldCB0byBmYWxzZSwgd2hpY2hcclxuICAgICAqIG1lYW5zIHlvdSBjYW4gcmUtZW5hYmxlIGl0IGFnYWluIGF0IGFueSBwb2ludCBieSBwYXNzaW5nIGl0IHRvIGVuYWJsZSBgZW5hYmxlYCBvciBgYWRkYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNyZW1vdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5KX0gYm9keSAtIFRoZSBib2R5IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoYm9keSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYm9keS5waHlzaWNzVHlwZSA9PT0gQ09OU1QuRFlOQU1JQ19CT0RZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50cmVlLnJlbW92ZShib2R5KTtcclxuICAgICAgICAgICAgdGhpcy5ib2RpZXMuZGVsZXRlKGJvZHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChib2R5LnBoeXNpY3NUeXBlID09PSBDT05TVC5TVEFUSUNfQk9EWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGljQm9kaWVzLmRlbGV0ZShib2R5KTtcclxuICAgICAgICAgICAgdGhpcy5zdGF0aWNUcmVlLnJlbW92ZShib2R5KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEdyYXBoaWNzIEdhbWUgT2JqZWN0IHRoYXQgdGhlIHdvcmxkIHdpbGwgdXNlIHRvIHJlbmRlciB0aGUgZGVidWcgZGlzcGxheSB0by5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIFdvcmxkIGlzIGluc3RhbnRpYXRlZCBpZiB0aGUgYGRlYnVnYCBjb25maWcgcHJvcGVydHlcclxuICAgICAqIHdhcyBzZXQgdG8gYHRydWVgLiBIb3dldmVyLCB5b3UgY2FuIGNhbGwgaXQgYXQgYW55IHBvaW50IHNob3VsZCB5b3UgbmVlZCB0byBkaXNwbGF5IHRoZVxyXG4gICAgICogZGVidWcgR3JhcGhpYyBmcm9tIGEgZml4ZWQgcG9pbnQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBjb250cm9sIHdoaWNoIG9iamVjdHMgYXJlIGRyYXduIHRvIHRoZSBHcmFwaGljcyBvYmplY3QsIGFuZCB0aGUgY29sb3JzIHRoZXkgdXNlLFxyXG4gICAgICogYnkgc2V0dGluZyB0aGUgZGVidWcgcHJvcGVydGllcyBpbiB0aGUgcGh5c2ljcyBjb25maWcuXHJcbiAgICAgKlxyXG4gICAgICogWW91IHNob3VsZCBub3QgdHlwaWNhbGx5IHVzZSB0aGlzIGluIGEgcHJvZHVjdGlvbiBnYW1lLiBVc2UgaXQgdG8gYWlkIGR1cmluZyBkZWJ1Z2dpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY3JlYXRlRGVidWdHcmFwaGljXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IFRoZSBHcmFwaGljcyBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZCBmb3IgdXNlIGJ5IHRoZSBXb3JsZC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlRGVidWdHcmFwaGljOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBncmFwaGljID0gdGhpcy5zY2VuZS5zeXMuYWRkLmdyYXBoaWNzKHsgeDogMCwgeTogMCB9KTtcclxuXHJcbiAgICAgICAgZ3JhcGhpYy5zZXREZXB0aChOdW1iZXIuTUFYX1ZBTFVFKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0dyYXBoaWMgPSBncmFwaGljO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdEZWJ1ZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiBncmFwaGljO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBvc2l0aW9uLCBzaXplIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBXb3JsZCBib3VuZGFyeS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgV29ybGQgYm91bmRhcnkgaXMgYW4gaW52aXNpYmxlIHJlY3RhbmdsZSB0aGF0IGRlZmluZXMgdGhlIGVkZ2VzIG9mIHRoZSBXb3JsZC5cclxuICAgICAqIElmIGEgQm9keSBpcyBzZXQgdG8gY29sbGlkZSB3aXRoIHRoZSB3b3JsZCBib3VuZHMgdGhlbiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc3RvcFxyXG4gICAgICogd2hlbiBpdCByZWFjaGVzIGFueSBvZiB0aGUgZWRnZXMuIFlvdSBjYW4gb3B0aW9uYWxseSBzZXQgd2hpY2ggZWRnZXMgb2YgdGhlIGJvdW5kYXJ5XHJcbiAgICAgKiBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3NldEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdG9wLWxlZnQgeCBjb29yZGluYXRlIG9mIHRoZSBib3VuZGFyeS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHRvcC1sZWZ0IHkgY29vcmRpbmF0ZSBvZiB0aGUgYm91bmRhcnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGJvdW5kYXJ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGJvdW5kYXJ5LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hlY2tMZWZ0XSAtIFNob3VsZCBib2RpZXMgY2hlY2sgYWdhaW5zdCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3VuZGFyeT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoZWNrUmlnaHRdIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3VuZGFyeT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoZWNrVXBdIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSB0b3AgZWRnZSBvZiB0aGUgYm91bmRhcnk/XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGVja0Rvd25dIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm91bmRhcnk/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfSBUaGlzIFdvcmxkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm91bmRzOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2hlY2tMZWZ0LCBjaGVja1JpZ2h0LCBjaGVja1VwLCBjaGVja0Rvd24pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib3VuZHMuc2V0VG8oeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmIChjaGVja0xlZnQgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm91bmRzQ29sbGlzaW9uKGNoZWNrTGVmdCwgY2hlY2tSaWdodCwgY2hlY2tVcCwgY2hlY2tEb3duKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29sbGlzaW9ucyBvbiBlYWNoIGVkZ2Ugb2YgdGhlIFdvcmxkIGJvdW5kYXJ5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3NldEJvdW5kc0NvbGxpc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbGVmdD10cnVlXSAtIFNob3VsZCBib2RpZXMgY2hlY2sgYWdhaW5zdCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3VuZGFyeT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JpZ2h0PXRydWVdIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3VuZGFyeT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwPXRydWVdIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSB0b3AgZWRnZSBvZiB0aGUgYm91bmRhcnk/XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb3duPXRydWVdIC0gU2hvdWxkIGJvZGllcyBjaGVjayBhZ2FpbnN0IHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm91bmRhcnk/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfSBUaGlzIFdvcmxkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm91bmRzQ29sbGlzaW9uOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIHVwLCBkb3duKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChsZWZ0ID09PSB1bmRlZmluZWQpIHsgbGVmdCA9IHRydWU7IH1cclxuICAgICAgICBpZiAocmlnaHQgPT09IHVuZGVmaW5lZCkgeyByaWdodCA9IHRydWU7IH1cclxuICAgICAgICBpZiAodXAgPT09IHVuZGVmaW5lZCkgeyB1cCA9IHRydWU7IH1cclxuICAgICAgICBpZiAoZG93biA9PT0gdW5kZWZpbmVkKSB7IGRvd24gPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb24ubGVmdCA9IGxlZnQ7XHJcbiAgICAgICAgdGhpcy5jaGVja0NvbGxpc2lvbi5yaWdodCA9IHJpZ2h0O1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb24udXAgPSB1cDtcclxuICAgICAgICB0aGlzLmNoZWNrQ29sbGlzaW9uLmRvd24gPSBkb3duO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXVzZXMgdGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQSBwYXVzZWQgc2ltdWxhdGlvbiBkb2VzIG5vdCB1cGRhdGUgYW55IGV4aXN0aW5nIGJvZGllcywgb3IgcnVuIGFueSBDb2xsaWRlcnMuXHJcbiAgICAgKlxyXG4gICAgICogSG93ZXZlciwgeW91IGNhbiBzdGlsbCBlbmFibGUgYW5kIGRpc2FibGUgYm9kaWVzIHdpdGhpbiBpdCwgb3IgbWFudWFsbHkgcnVuIGNvbGxpZGUgb3Igb3ZlcmxhcFxyXG4gICAgICogY2hlY2tzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3BhdXNlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNQQVVTRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkfSBUaGlzIFdvcmxkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuUEFVU0UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXN1bWVzIHRoZSBzaW11bGF0aW9uLCBpZiBwYXVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjcmVzdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNSRVNVTUVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZH0gVGhpcyBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuUkVTVU1FKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xsaWRlciBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQSBDb2xsaWRlciBpcyBhIHdheSB0byBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gY29sbGlzaW9uIGNoZWNrcyBiZXR3ZWVuIHR3byBvYmplY3RzLFxyXG4gICAgICogY2FsbGluZyB0aGUgY29sbGlkZSBhbmQgcHJvY2VzcyBjYWxsYmFja3MgaWYgdGhleSBvY2N1ci5cclxuICAgICAqXHJcbiAgICAgKiBDb2xsaWRlcnMgYXJlIHJ1biBhcyBwYXJ0IG9mIHRoZSBXb3JsZCB1cGRhdGUsIGFmdGVyIGFsbCBvZiB0aGUgQm9kaWVzIGhhdmUgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBCeSBjcmVhdGluZyBhIENvbGxpZGVyIHlvdSBkb24ndCBuZWVkIHRoZW4gY2FsbCBgV29ybGQuY29sbGlkZWAgaW4geW91ciBgdXBkYXRlYCBsb29wLFxyXG4gICAgICogYXMgaXQgd2lsbCBiZSBoYW5kbGVkIGZvciB5b3UgYXV0b21hdGljYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNhZGRDb2xsaWRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QxIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QyIC0gVGhlIHNlY29uZCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbcHJvY2Vzc0NhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS4gTXVzdCByZXR1cm4gYSBib29sZWFuLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBjYWxsIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyfSBUaGUgQ29sbGlkZXIgdGhhdCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkQ29sbGlkZXI6IGZ1bmN0aW9uIChvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb2xsaWRlQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBjb2xsaWRlQ2FsbGJhY2sgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKHByb2Nlc3NDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IHByb2Nlc3NDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2tDb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY2FsbGJhY2tDb250ZXh0ID0gY29sbGlkZUNhbGxiYWNrOyB9XHJcblxyXG4gICAgICAgIHZhciBjb2xsaWRlciA9IG5ldyBDb2xsaWRlcih0aGlzLCBmYWxzZSwgb2JqZWN0MSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sbGlkZXJzLmFkZChjb2xsaWRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2xsaWRlcjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE92ZXJsYXAgQ29sbGlkZXIgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEEgQ29sbGlkZXIgaXMgYSB3YXkgdG8gYXV0b21hdGljYWxseSBwZXJmb3JtIG92ZXJsYXAgY2hlY2tzIGJldHdlZW4gdHdvIG9iamVjdHMsXHJcbiAgICAgKiBjYWxsaW5nIHRoZSBjb2xsaWRlIGFuZCBwcm9jZXNzIGNhbGxiYWNrcyBpZiB0aGV5IG9jY3VyLlxyXG4gICAgICpcclxuICAgICAqIENvbGxpZGVycyBhcmUgcnVuIGFzIHBhcnQgb2YgdGhlIFdvcmxkIHVwZGF0ZSwgYWZ0ZXIgYWxsIG9mIHRoZSBCb2RpZXMgaGF2ZSB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEJ5IGNyZWF0aW5nIGEgQ29sbGlkZXIgeW91IGRvbid0IG5lZWQgdGhlbiBjYWxsIGBXb3JsZC5vdmVybGFwYCBpbiB5b3VyIGB1cGRhdGVgIGxvb3AsXHJcbiAgICAgKiBhcyBpdCB3aWxsIGJlIGhhbmRsZWQgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2FkZE92ZXJsYXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gb2JqZWN0MSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLkFyY2FkZS5BcmNhZGVDb2xsaWRlclR5cGV9IG9iamVjdDIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3Igb3ZlcmxhcC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgb3ZlcmxhcC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbcHJvY2Vzc0NhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgb3ZlcmxhcC4gTXVzdCByZXR1cm4gYSBib29sZWFuLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBjYWxsIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyfSBUaGUgQ29sbGlkZXIgdGhhdCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkT3ZlcmxhcDogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbGxpZGVDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNvbGxpZGVDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAocHJvY2Vzc0NhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgcHJvY2Vzc0NhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChjYWxsYmFja0NvbnRleHQgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFja0NvbnRleHQgPSBjb2xsaWRlQ2FsbGJhY2s7IH1cclxuXHJcbiAgICAgICAgdmFyIGNvbGxpZGVyID0gbmV3IENvbGxpZGVyKHRoaXMsIHRydWUsIG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbGxpZGVycy5hZGQoY29sbGlkZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sbGlkZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIENvbGxpZGVyIGZyb20gdGhlIHNpbXVsYXRpb24gc28gaXQgaXMgbm8gbG9uZ2VyIHByb2Nlc3NlZC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkZXN0cm95IHRoZSBDb2xsaWRlci4gSWYgeW91IHdpc2ggdG8gYWRkIGl0IGJhY2sgYXQgYSBsYXRlciBzdGFnZSB5b3UgY2FuIGNhbGxcclxuICAgICAqIGBXb3JsZC5jb2xsaWRlcnMuYWRkKENvbGxpZGVyKWAuXHJcbiAgICAgKlxyXG4gICAgICogSWYgeW91IG5vIGxvbmdlciBuZWVkIHRoZSBDb2xsaWRlciB5b3UgY2FuIGNhbGwgdGhlIGBDb2xsaWRlci5kZXN0cm95YCBtZXRob2QgaW5zdGVhZCwgd2hpY2ggd2lsbFxyXG4gICAgICogYXV0b21hdGljYWxseSBjbGVhciBhbGwgb2YgaXRzIHJlZmVyZW5jZXMgYW5kIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIFdvcmxkLiBJZiB5b3UgY2FsbCBkZXN0cm95IG9uXHJcbiAgICAgKiBhIENvbGxpZGVyIHlvdSBfZG9uJ3RfIG5lZWQgdG8gcGFzcyBpdCB0byB0aGlzIG1ldGhvZCB0b28uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjcmVtb3ZlQ29sbGlkZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbGxpZGVyfSBjb2xsaWRlciAtIFRoZSBDb2xsaWRlciB0byByZW1vdmUgZnJvbSB0aGUgc2ltdWxhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGR9IFRoaXMgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVDb2xsaWRlcjogZnVuY3Rpb24gKGNvbGxpZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29sbGlkZXJzLnJlbW92ZShjb2xsaWRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGZyYW1lIHJhdGUgdG8gcnVuIHRoZSBzaW11bGF0aW9uIGF0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBmcmFtZSByYXRlIHZhbHVlIGlzIHVzZWQgdG8gc2ltdWxhdGUgYSBmaXhlZCB1cGRhdGUgdGltZSBzdGVwLiBUaGlzIGZpeGVkXHJcbiAgICAgKiB0aW1lIHN0ZXAgYWxsb3dzIGZvciBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRldGVybWluaXN0aWMgZ2FtZSBzdGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZyYW1lIHJhdGUgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZ2FtZSBpcyByZW5kZXJpbmcuIFRoZVxyXG4gICAgICogaGlnaGVyIHlvdSBzZXQgdGhlIGZwcywgdGhlIG1vcmUgcGh5c2ljcyBzaW11bGF0aW9uIHN0ZXBzIHdpbGwgb2NjdXIgcGVyIGdhbWUgc3RlcC5cclxuICAgICAqIENvbnZlcnNlbHksIHRoZSBsb3dlciB5b3Ugc2V0IGl0LCB0aGUgbGVzcyB3aWxsIHRha2UgcGxhY2UuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IGFkdmFuY2UgdGhlIHNpbXVsYXRpb24gZGlyZWN0bHkgeW91cnNlbGYgYnkgY2FsbGluZyB0aGUgYHN0ZXBgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNzZXRGUFNcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGZyYW1lcmF0ZSAtIFRoZSBmcmFtZSByYXRlIHRvIGFkdmFuY2UgdGhlIHNpbXVsYXRpb24gYXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZQUzogZnVuY3Rpb24gKGZyYW1lcmF0ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZwcyA9IGZyYW1lcmF0ZTtcclxuICAgICAgICB0aGlzLl9mcmFtZVRpbWUgPSAxIC8gdGhpcy5mcHM7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVUaW1lTVMgPSAxMDAwICogdGhpcy5fZnJhbWVUaW1lO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZHZhbmNlcyB0aGUgc2ltdWxhdGlvbiBiYXNlZCBvbiB0aGUgZWxhcHNlZCB0aW1lIGFuZCBmcHMgcmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHlvdXIgU2NlbmUgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgaW52b2tlZCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCN1cGRhdGVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1dPUkxEX1NURVBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGdlbmVyYXRlZCBieSB0aGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgb3IgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lLCBpbiBtcywgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5ib2RpZXMuc2l6ZSA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBmaXhlZERlbHRhID0gdGhpcy5fZnJhbWVUaW1lO1xyXG4gICAgICAgIHZhciBtc1BlckZyYW1lID0gdGhpcy5fZnJhbWVUaW1lTVMgKiB0aGlzLnRpbWVTY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCArPSBkZWx0YTtcclxuXHJcbiAgICAgICAgLy8gIFVwZGF0ZSBhbGwgYWN0aXZlIGJvZGllc1xyXG4gICAgICAgIHZhciBib2R5O1xyXG4gICAgICAgIHZhciBib2RpZXMgPSB0aGlzLmJvZGllcy5lbnRyaWVzO1xyXG5cclxuICAgICAgICAvLyAgV2lsbCBhIHN0ZXAgaGFwcGVuIHRoaXMgZnJhbWU/XHJcbiAgICAgICAgdmFyIHdpbGxTdGVwID0gKHRoaXMuX2VsYXBzZWQgPj0gbXNQZXJGcmFtZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5maXhlZFN0ZXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmaXhlZERlbHRhID0gZGVsdGEgKiAwLjAwMTtcclxuICAgICAgICAgICAgd2lsbFN0ZXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5ID0gYm9kaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkuZW5hYmxlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5LnByZVVwZGF0ZSh3aWxsU3RlcCwgZml4ZWREZWx0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBXZSBrbm93IHRoYXQgYSBzdGVwIHdpbGwgaGFwcGVuIHRoaXMgZnJhbWUsIHNvIGxldCdzIGJ1bmRsZSBpdCBhbGwgdG9nZXRoZXIgdG8gc2F2ZSBicmFuY2hpbmcgYW5kIGl0ZXJhdGlvbiBjb3N0c1xyXG4gICAgICAgIGlmICh3aWxsU3RlcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsYXBzZWQgLT0gbXNQZXJGcmFtZTtcclxuICAgICAgICAgICAgdGhpcy5zdGVwc0xhc3RGcmFtZSA9IDE7XHJcblxyXG4gICAgICAgICAgICAvLyAgT3B0aW9uYWxseSBwb3B1bGF0ZSBvdXIgZHluYW1pYyBjb2xsaXNpb24gdHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy51c2VUcmVlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWUuY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJlZS5sb2FkKGJvZGllcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICBQcm9jZXNzIGFueSBjb2xsaWRlcnNcclxuICAgICAgICAgICAgdmFyIGNvbGxpZGVycyA9IHRoaXMuY29sbGlkZXJzLnVwZGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbGxpZGVycy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbGxpZGVyID0gY29sbGlkZXJzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb2xsaWRlci5hY3RpdmUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sbGlkZXIudXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuV09STERfU1RFUCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUHJvY2VzcyBhbnkgYWRkaXRpb25hbCBzdGVwcyB0aGlzIGZyYW1lXHJcbiAgICAgICAgd2hpbGUgKHRoaXMuX2VsYXBzZWQgPj0gbXNQZXJGcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsYXBzZWQgLT0gbXNQZXJGcmFtZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RlcChmaXhlZERlbHRhKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWR2YW5jZXMgdGhlIHNpbXVsYXRpb24gYnkgYSB0aW1lIGluY3JlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNzdGVwXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNXT1JMRF9TVEVQXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgYW1vdW50LCBpbiBzZWNvbmRzLCBieSB3aGljaCB0byBhZHZhbmNlIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICovXHJcbiAgICBzdGVwOiBmdW5jdGlvbiAoZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFVwZGF0ZSBhbGwgYWN0aXZlIGJvZGllc1xyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBib2R5O1xyXG4gICAgICAgIHZhciBib2RpZXMgPSB0aGlzLmJvZGllcy5lbnRyaWVzO1xyXG4gICAgICAgIHZhciBsZW4gPSBib2RpZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5ID0gYm9kaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkuZW5hYmxlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5LnVwZGF0ZShkZWx0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBPcHRpb25hbGx5IHBvcHVsYXRlIG91ciBkeW5hbWljIGNvbGxpc2lvbiB0cmVlXHJcbiAgICAgICAgaWYgKHRoaXMudXNlVHJlZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudHJlZS5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnRyZWUubG9hZChib2RpZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFByb2Nlc3MgYW55IGNvbGxpZGVyc1xyXG4gICAgICAgIHZhciBjb2xsaWRlcnMgPSB0aGlzLmNvbGxpZGVycy51cGRhdGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbGxpZGVycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb2xsaWRlciA9IGNvbGxpZGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb2xsaWRlci5hY3RpdmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbGxpZGVyLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLldPUkxEX1NURVApO1xyXG5cclxuICAgICAgICB0aGlzLnN0ZXBzTGFzdEZyYW1lKys7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBib2RpZXMsIGRyYXdzIHRoZSBkZWJ1ZyBkaXNwbGF5LCBhbmQgaGFuZGxlcyBwZW5kaW5nIHF1ZXVlIG9wZXJhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjcG9zdFVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBvc3RVcGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGJvZHk7XHJcbiAgICAgICAgdmFyIGJvZGllcyA9IHRoaXMuYm9kaWVzLmVudHJpZXM7XHJcbiAgICAgICAgdmFyIGxlbiA9IGJvZGllcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciBkeW5hbWljID0gdGhpcy5ib2RpZXM7XHJcbiAgICAgICAgdmFyIHN0YXRpY0JvZGllcyA9IHRoaXMuc3RhdGljQm9kaWVzO1xyXG5cclxuICAgICAgICAvLyAgV2UgZG9uJ3QgbmVlZCB0byBwb3N0VXBkYXRlIGlmIHRoZXJlIHdhc24ndCBhIHN0ZXAgdGhpcyBmcmFtZVxyXG4gICAgICAgIGlmICh0aGlzLnN0ZXBzTGFzdEZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGVwc0xhc3RGcmFtZSA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkuZW5hYmxlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucG9zdFVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcmF3RGVidWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZ3JhcGhpY3MgPSB0aGlzLmRlYnVnR3JhcGhpYztcclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkud2lsbERyYXdEZWJ1ZygpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuZHJhd0RlYnVnKGdyYXBoaWNzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYm9kaWVzID0gc3RhdGljQm9kaWVzLmVudHJpZXM7XHJcbiAgICAgICAgICAgIGxlbiA9IGJvZGllcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkud2lsbERyYXdEZWJ1ZygpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkuZHJhd0RlYnVnKGdyYXBoaWNzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdEZXN0cm95O1xyXG5cclxuICAgICAgICBpZiAocGVuZGluZy5zaXplID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkeW5hbWljVHJlZSA9IHRoaXMudHJlZTtcclxuICAgICAgICAgICAgdmFyIHN0YXRpY1RyZWUgPSB0aGlzLnN0YXRpY1RyZWU7XHJcblxyXG4gICAgICAgICAgICBib2RpZXMgPSBwZW5kaW5nLmVudHJpZXM7XHJcbiAgICAgICAgICAgIGxlbiA9IGJvZGllcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkucGh5c2ljc1R5cGUgPT09IENPTlNULkRZTkFNSUNfQk9EWSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljVHJlZS5yZW1vdmUoYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy5kZWxldGUoYm9keSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChib2R5LnBoeXNpY3NUeXBlID09PSBDT05TVC5TVEFUSUNfQk9EWSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNUcmVlLnJlbW92ZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0aWNCb2RpZXMuZGVsZXRlKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJvZHkud29ybGQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBib2R5LmdhbWVPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBlbmRpbmcuY2xlYXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBhIEJvZHkncyB2ZWxvY2l0eSBhbmQgdXBkYXRlcyBpdHMgcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjdXBkYXRlTW90aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5IC0gVGhlIEJvZHkgdG8gYmUgdXBkYXRlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB2YWx1ZSB0byBiZSB1c2VkIGluIHRoZSBtb3Rpb24gY2FsY3VsYXRpb25zLCBpbiBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVNb3Rpb246IGZ1bmN0aW9uIChib2R5LCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYm9keS5hbGxvd1JvdGF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQW5ndWxhclZlbG9jaXR5KGJvZHksIGRlbHRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29tcHV0ZVZlbG9jaXR5KGJvZHksIGRlbHRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGEgQm9keSdzIGFuZ3VsYXIgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29tcHV0ZUFuZ3VsYXJWZWxvY2l0eVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBjb21wdXRlIHRoZSB2ZWxvY2l0eSBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24sIGluIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGNvbXB1dGVBbmd1bGFyVmVsb2NpdHk6IGZ1bmN0aW9uIChib2R5LCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdmVsb2NpdHkgPSBib2R5LmFuZ3VsYXJWZWxvY2l0eTtcclxuICAgICAgICB2YXIgYWNjZWxlcmF0aW9uID0gYm9keS5hbmd1bGFyQWNjZWxlcmF0aW9uO1xyXG4gICAgICAgIHZhciBkcmFnID0gYm9keS5hbmd1bGFyRHJhZztcclxuICAgICAgICB2YXIgbWF4ID0gYm9keS5tYXhBbmd1bGFyO1xyXG5cclxuICAgICAgICBpZiAoYWNjZWxlcmF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmVsb2NpdHkgKz0gYWNjZWxlcmF0aW9uICogZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGJvZHkuYWxsb3dEcmFnICYmIGRyYWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkcmFnICo9IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKEZ1enp5R3JlYXRlclRoYW4odmVsb2NpdHkgLSBkcmFnLCAwLCAwLjEpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2ZWxvY2l0eSAtPSBkcmFnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKEZ1enp5TGVzc1RoYW4odmVsb2NpdHkgKyBkcmFnLCAwLCAwLjEpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2ZWxvY2l0eSArPSBkcmFnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2ZWxvY2l0eSA9IENsYW1wKHZlbG9jaXR5LCAtbWF4LCBtYXgpO1xyXG5cclxuICAgICAgICB2YXIgdmVsb2NpdHlEZWx0YSA9IHZlbG9jaXR5IC0gYm9keS5hbmd1bGFyVmVsb2NpdHk7XHJcblxyXG4gICAgICAgIGJvZHkuYW5ndWxhclZlbG9jaXR5ICs9IHZlbG9jaXR5RGVsdGE7XHJcbiAgICAgICAgYm9keS5yb3RhdGlvbiArPSAoYm9keS5hbmd1bGFyVmVsb2NpdHkgKiBkZWx0YSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBhIEJvZHkncyBwZXItYXhpcyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb21wdXRlVmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBjb21wdXRlIHRoZSB2ZWxvY2l0eSBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdmFsdWUgdG8gYmUgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24sIGluIHNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGNvbXB1dGVWZWxvY2l0eTogZnVuY3Rpb24gKGJvZHksIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2ZWxvY2l0eVggPSBib2R5LnZlbG9jaXR5Lng7XHJcbiAgICAgICAgdmFyIGFjY2VsZXJhdGlvblggPSBib2R5LmFjY2VsZXJhdGlvbi54O1xyXG4gICAgICAgIHZhciBkcmFnWCA9IGJvZHkuZHJhZy54O1xyXG4gICAgICAgIHZhciBtYXhYID0gYm9keS5tYXhWZWxvY2l0eS54O1xyXG5cclxuICAgICAgICB2YXIgdmVsb2NpdHlZID0gYm9keS52ZWxvY2l0eS55O1xyXG4gICAgICAgIHZhciBhY2NlbGVyYXRpb25ZID0gYm9keS5hY2NlbGVyYXRpb24ueTtcclxuICAgICAgICB2YXIgZHJhZ1kgPSBib2R5LmRyYWcueTtcclxuICAgICAgICB2YXIgbWF4WSA9IGJvZHkubWF4VmVsb2NpdHkueTtcclxuXHJcbiAgICAgICAgdmFyIHNwZWVkID0gYm9keS5zcGVlZDtcclxuICAgICAgICB2YXIgbWF4U3BlZWQgPSBib2R5Lm1heFNwZWVkO1xyXG4gICAgICAgIHZhciBhbGxvd0RyYWcgPSBib2R5LmFsbG93RHJhZztcclxuICAgICAgICB2YXIgdXNlRGFtcGluZyA9IGJvZHkudXNlRGFtcGluZztcclxuXHJcbiAgICAgICAgaWYgKGJvZHkuYWxsb3dHcmF2aXR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmVsb2NpdHlYICs9ICh0aGlzLmdyYXZpdHkueCArIGJvZHkuZ3Jhdml0eS54KSAqIGRlbHRhO1xyXG4gICAgICAgICAgICB2ZWxvY2l0eVkgKz0gKHRoaXMuZ3Jhdml0eS55ICsgYm9keS5ncmF2aXR5LnkpICogZGVsdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWNjZWxlcmF0aW9uWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZlbG9jaXR5WCArPSBhY2NlbGVyYXRpb25YICogZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFsbG93RHJhZyAmJiBkcmFnWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh1c2VEYW1waW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgRGFtcGluZyBiYXNlZCBkZWNlbGVyYXRpb25cclxuXHJcbiAgICAgICAgICAgICAgICB2ZWxvY2l0eVggKj0gZHJhZ1g7XHJcblxyXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBNYXRoLnNxcnQodmVsb2NpdHlYICogdmVsb2NpdHlYICsgdmVsb2NpdHlZICogdmVsb2NpdHlZKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoRnV6enlFcXVhbChzcGVlZCwgMCwgMC4wMDEpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgTGluZWFyIGRlY2VsZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgZHJhZ1ggKj0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEZ1enp5R3JlYXRlclRoYW4odmVsb2NpdHlYIC0gZHJhZ1gsIDAsIDAuMDEpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WCAtPSBkcmFnWDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZ1enp5TGVzc1RoYW4odmVsb2NpdHlYICsgZHJhZ1gsIDAsIDAuMDEpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WCArPSBkcmFnWDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVggPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWNjZWxlcmF0aW9uWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZlbG9jaXR5WSArPSBhY2NlbGVyYXRpb25ZICogZGVsdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGFsbG93RHJhZyAmJiBkcmFnWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh1c2VEYW1waW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgRGFtcGluZyBiYXNlZCBkZWNlbGVyYXRpb25cclxuICAgICAgICAgICAgICAgIHZlbG9jaXR5WSAqPSBkcmFnWTtcclxuXHJcbiAgICAgICAgICAgICAgICBzcGVlZCA9IE1hdGguc3FydCh2ZWxvY2l0eVggKiB2ZWxvY2l0eVggKyB2ZWxvY2l0eVkgKiB2ZWxvY2l0eVkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChGdXp6eUVxdWFsKHNwZWVkLCAwLCAwLjAwMSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBMaW5lYXIgZGVjZWxlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICBkcmFnWSAqPSBkZWx0YTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoRnV6enlHcmVhdGVyVGhhbih2ZWxvY2l0eVkgLSBkcmFnWSwgMCwgMC4wMSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZIC09IGRyYWdZO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoRnV6enlMZXNzVGhhbih2ZWxvY2l0eVkgKyBkcmFnWSwgMCwgMC4wMSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZICs9IGRyYWdZO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZlbG9jaXR5WCA9IENsYW1wKHZlbG9jaXR5WCwgLW1heFgsIG1heFgpO1xyXG4gICAgICAgIHZlbG9jaXR5WSA9IENsYW1wKHZlbG9jaXR5WSwgLW1heFksIG1heFkpO1xyXG5cclxuICAgICAgICBib2R5LnZlbG9jaXR5LnNldCh2ZWxvY2l0eVgsIHZlbG9jaXR5WSk7XHJcblxyXG4gICAgICAgIGlmIChtYXhTcGVlZCA+IC0xICYmIHNwZWVkID4gbWF4U3BlZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5LnZlbG9jaXR5Lm5vcm1hbGl6ZSgpLnNjYWxlKG1heFNwZWVkKTtcclxuICAgICAgICAgICAgc3BlZWQgPSBtYXhTcGVlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJvZHkuc3BlZWQgPSBzcGVlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXBhcmF0ZXMgdHdvIEJvZGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNzZXBhcmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjQ09MTElERVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjT1ZFUkxBUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgQm9keSB0byBiZSBzZXBhcmF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5MiAtIFRoZSBzZWNvbmQgQm9keSB0byBiZSBzZXBhcmF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBUaGUgcHJvY2VzcyBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0byBpbnZva2UgdGhlIGNhbGxiYWNrLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmxhcE9ubHldIC0gSWYgdGhpcyBhIGNvbGxpZGUgb3Igb3ZlcmxhcCBjaGVjaz9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHNlcGFyYXRpb24gb2NjdXJyZWQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgc2VwYXJhdGU6IGZ1bmN0aW9uIChib2R5MSwgYm9keTIsIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSlcclxuICAgIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFib2R5MS5lbmFibGUgfHxcclxuICAgICAgICAgICAgIWJvZHkyLmVuYWJsZSB8fFxyXG4gICAgICAgICAgICBib2R5MS5jaGVja0NvbGxpc2lvbi5ub25lIHx8XHJcbiAgICAgICAgICAgIGJvZHkyLmNoZWNrQ29sbGlzaW9uLm5vbmUgfHxcclxuICAgICAgICAgICAgIXRoaXMuaW50ZXJzZWN0cyhib2R5MSwgYm9keTIpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRoZXkgb3ZlcmxhcC4gSXMgdGhlcmUgYSBjdXN0b20gcHJvY2VzcyBjYWxsYmFjaz8gSWYgaXQgcmV0dXJucyB0cnVlIHRoZW4gd2UgY2FuIGNhcnJ5IG9uLCBvdGhlcndpc2Ugd2Ugc2hvdWxkIGFib3J0LlxyXG4gICAgICAgIGlmIChwcm9jZXNzQ2FsbGJhY2sgJiYgcHJvY2Vzc0NhbGxiYWNrLmNhbGwoY2FsbGJhY2tDb250ZXh0LCBib2R5MS5nYW1lT2JqZWN0LCBib2R5Mi5nYW1lT2JqZWN0KSA9PT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQ2lyY2xlIHZzLiBDaXJjbGUgcXVpY2sgYmFpbCBvdXRcclxuICAgICAgICBpZiAoYm9keTEuaXNDaXJjbGUgJiYgYm9keTIuaXNDaXJjbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXBhcmF0ZUNpcmNsZShib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgYm9kaWVzIGluIGEgY29sbGlzaW9uIGNpcmNsZSBhbmQgcmVjdGFuZ2xlXHJcbiAgICAgICAgLy8gSWYgYSBjb2xsaXNpb24gb2NjdXJzIGluIHRoZSBjb3JuZXIgcG9pbnRzIG9mIHRoZSByZWN0YW5nbGUsIHRoZSBib2R5IGJlaGF2ZSBsaWtlIGNpcmNsZXNcclxuXHJcbiAgICAgICAgLy8gIEVpdGhlciBib2R5MSBvciBib2R5MiBpcyBhIGNpcmNsZVxyXG4gICAgICAgIGlmIChib2R5MS5pc0NpcmNsZSAhPT0gYm9keTIuaXNDaXJjbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYm9keVJlY3QgPSAoYm9keTEuaXNDaXJjbGUpID8gYm9keTIgOiBib2R5MTtcclxuICAgICAgICAgICAgdmFyIGJvZHlDaXJjbGUgPSAoYm9keTEuaXNDaXJjbGUpID8gYm9keTEgOiBib2R5MjtcclxuXHJcbiAgICAgICAgICAgIHZhciByZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgeDogYm9keVJlY3QueCxcclxuICAgICAgICAgICAgICAgIHk6IGJvZHlSZWN0LnksXHJcbiAgICAgICAgICAgICAgICByaWdodDogYm9keVJlY3QucmlnaHQsXHJcbiAgICAgICAgICAgICAgICBib3R0b206IGJvZHlSZWN0LmJvdHRvbVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGNpcmNsZSA9IGJvZHlDaXJjbGUuY2VudGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNpcmNsZS55IDwgcmVjdC55IHx8IGNpcmNsZS55ID4gcmVjdC5ib3R0b20pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaXJjbGUueCA8IHJlY3QueCB8fCBjaXJjbGUueCA+IHJlY3QucmlnaHQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VwYXJhdGVDaXJjbGUoYm9keTEsIGJvZHkyLCBvdmVybGFwT25seSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciByZXN1bHRYID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHJlc3VsdFkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gIERvIHdlIHNlcGFyYXRlIG9uIHggb3IgeSBmaXJzdD9cclxuICAgICAgICBpZiAodGhpcy5mb3JjZVggfHwgTWF0aC5hYnModGhpcy5ncmF2aXR5LnkgKyBib2R5MS5ncmF2aXR5LnkpIDwgTWF0aC5hYnModGhpcy5ncmF2aXR5LnggKyBib2R5MS5ncmF2aXR5LngpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVzdWx0WCA9IFNlcGFyYXRlWChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCB0aGlzLk9WRVJMQVBfQklBUyk7XHJcblxyXG4gICAgICAgICAgICAvLyAgQXJlIHRoZXkgc3RpbGwgaW50ZXJzZWN0aW5nPyBMZXQncyBkbyB0aGUgb3RoZXIgYXhpcyB0aGVuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVyc2VjdHMoYm9keTEsIGJvZHkyKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0WSA9IFNlcGFyYXRlWShib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCB0aGlzLk9WRVJMQVBfQklBUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVzdWx0WSA9IFNlcGFyYXRlWShib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCB0aGlzLk9WRVJMQVBfQklBUyk7XHJcblxyXG4gICAgICAgICAgICAvLyAgQXJlIHRoZXkgc3RpbGwgaW50ZXJzZWN0aW5nPyBMZXQncyBkbyB0aGUgb3RoZXIgYXhpcyB0aGVuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVyc2VjdHMoYm9keTEsIGJvZHkyKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0WCA9IFNlcGFyYXRlWChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCB0aGlzLk9WRVJMQVBfQklBUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSAocmVzdWx0WCB8fCByZXN1bHRZKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwT25seSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkxLm9uT3ZlcmxhcCB8fCBib2R5Mi5vbk92ZXJsYXApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5PVkVSTEFQLCBib2R5MS5nYW1lT2JqZWN0LCBib2R5Mi5nYW1lT2JqZWN0LCBib2R5MSwgYm9keTIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGJvZHkxLm9uQ29sbGlkZSB8fCBib2R5Mi5vbkNvbGxpZGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQ09MTElERSwgYm9keTEuZ2FtZU9iamVjdCwgYm9keTIuZ2FtZU9iamVjdCwgYm9keTEsIGJvZHkyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXBhcmF0ZXMgdHdvIEJvZGllcywgd2hlbiBib3RoIGFyZSBjaXJjdWxhci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNzZXBhcmF0ZUNpcmNsZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjQ09MTElERVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjT1ZFUkxBUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgQm9keSB0byBiZSBzZXBhcmF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5MiAtIFRoZSBzZWNvbmQgQm9keSB0byBiZSBzZXBhcmF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVybGFwT25seV0gLSBJZiB0aGlzIGEgY29sbGlkZSBvciBvdmVybGFwIGNoZWNrP1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtiaWFzXSAtIEEgc21hbGwgdmFsdWUgYWRkZWQgdG8gdGhlIGNhbGN1bGF0aW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHNlcGFyYXRpb24gb2NjdXJyZWQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgc2VwYXJhdGVDaXJjbGU6IGZ1bmN0aW9uIChib2R5MSwgYm9keTIsIG92ZXJsYXBPbmx5LCBiaWFzKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBTZXQgdGhlIGJvdW5kaW5nIGJveCBvdmVybGFwIHZhbHVlcyBpbnRvIHRoZSBib2RpZXMgdGhlbXNlbHZlcyAoaGVuY2Ugd2UgZG9uJ3QgdXNlIHRoZSByZXR1cm4gdmFsdWVzIGhlcmUpXHJcbiAgICAgICAgR2V0T3ZlcmxhcFgoYm9keTEsIGJvZHkyLCBmYWxzZSwgYmlhcyk7XHJcbiAgICAgICAgR2V0T3ZlcmxhcFkoYm9keTEsIGJvZHkyLCBmYWxzZSwgYmlhcyk7XHJcblxyXG4gICAgICAgIHZhciBvdmVybGFwID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGJvZHkxLmlzQ2lyY2xlICE9PSBib2R5Mi5pc0NpcmNsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgeDogKGJvZHkyLmlzQ2lyY2xlKSA/IGJvZHkxLnBvc2l0aW9uLnggOiBib2R5Mi5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgICAgeTogKGJvZHkyLmlzQ2lyY2xlKSA/IGJvZHkxLnBvc2l0aW9uLnkgOiBib2R5Mi5wb3NpdGlvbi55LFxyXG4gICAgICAgICAgICAgICAgcmlnaHQ6IChib2R5Mi5pc0NpcmNsZSkgPyBib2R5MS5yaWdodCA6IGJvZHkyLnJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiAoYm9keTIuaXNDaXJjbGUpID8gYm9keTEuYm90dG9tIDogYm9keTIuYm90dG9tXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgY2lyY2xlID0ge1xyXG4gICAgICAgICAgICAgICAgeDogKGJvZHkxLmlzQ2lyY2xlKSA/IGJvZHkxLmNlbnRlci54IDogYm9keTIuY2VudGVyLngsXHJcbiAgICAgICAgICAgICAgICB5OiAoYm9keTEuaXNDaXJjbGUpID8gYm9keTEuY2VudGVyLnkgOiBib2R5Mi5jZW50ZXIueSxcclxuICAgICAgICAgICAgICAgIHJhZGl1czogKGJvZHkxLmlzQ2lyY2xlKSA/IGJvZHkxLmhhbGZXaWR0aCA6IGJvZHkyLmhhbGZXaWR0aFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNpcmNsZS55IDwgcmVjdC55KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2lyY2xlLnggPCByZWN0LngpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9IERpc3RhbmNlQmV0d2VlbihjaXJjbGUueCwgY2lyY2xlLnksIHJlY3QueCwgcmVjdC55KSAtIGNpcmNsZS5yYWRpdXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaXJjbGUueCA+IHJlY3QucmlnaHQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9IERpc3RhbmNlQmV0d2VlbihjaXJjbGUueCwgY2lyY2xlLnksIHJlY3QucmlnaHQsIHJlY3QueSkgLSBjaXJjbGUucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNpcmNsZS55ID4gcmVjdC5ib3R0b20pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaXJjbGUueCA8IHJlY3QueClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGFwID0gRGlzdGFuY2VCZXR3ZWVuKGNpcmNsZS54LCBjaXJjbGUueSwgcmVjdC54LCByZWN0LmJvdHRvbSkgLSBjaXJjbGUucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2lyY2xlLnggPiByZWN0LnJpZ2h0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSBEaXN0YW5jZUJldHdlZW4oY2lyY2xlLngsIGNpcmNsZS55LCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkgLSBjaXJjbGUucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvdmVybGFwICo9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdmVybGFwID0gKGJvZHkxLmhhbGZXaWR0aCArIGJvZHkyLmhhbGZXaWR0aCkgLSBEaXN0YW5jZUJldHdlZW4oYm9keTEuY2VudGVyLngsIGJvZHkxLmNlbnRlci55LCBib2R5Mi5jZW50ZXIueCwgYm9keTIuY2VudGVyLnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENhbid0IHNlcGFyYXRlIHR3byBpbW1vdmFibGUgYm9kaWVzLCBvciBhIGJvZHkgd2l0aCBpdHMgb3duIGN1c3RvbSBzZXBhcmF0aW9uIGxvZ2ljXHJcbiAgICAgICAgaWYgKG92ZXJsYXBPbmx5IHx8IG92ZXJsYXAgPT09IDAgfHwgKGJvZHkxLmltbW92YWJsZSAmJiBib2R5Mi5pbW1vdmFibGUpIHx8IGJvZHkxLmN1c3RvbVNlcGFyYXRlWCB8fCBib2R5Mi5jdXN0b21TZXBhcmF0ZVgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAob3ZlcmxhcCAhPT0gMCAmJiAoYm9keTEub25PdmVybGFwIHx8IGJvZHkyLm9uT3ZlcmxhcCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuT1ZFUkxBUCwgYm9keTEuZ2FtZU9iamVjdCwgYm9keTIuZ2FtZU9iamVjdCwgYm9keTEsIGJvZHkyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIHJldHVybiB0cnVlIGlmIHRoZXJlIHdhcyBzb21lIG92ZXJsYXAsIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gKG92ZXJsYXAgIT09IDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGR4ID0gYm9keTEuY2VudGVyLnggLSBib2R5Mi5jZW50ZXIueDtcclxuICAgICAgICB2YXIgZHkgPSBib2R5MS5jZW50ZXIueSAtIGJvZHkyLmNlbnRlci55O1xyXG4gICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KE1hdGgucG93KGR4LCAyKSArIE1hdGgucG93KGR5LCAyKSk7XHJcbiAgICAgICAgdmFyIG54ID0gKChib2R5Mi5jZW50ZXIueCAtIGJvZHkxLmNlbnRlci54KSAvIGQpIHx8IDA7XHJcbiAgICAgICAgdmFyIG55ID0gKChib2R5Mi5jZW50ZXIueSAtIGJvZHkxLmNlbnRlci55KSAvIGQpIHx8IDA7XHJcbiAgICAgICAgdmFyIHAgPSAyICogKGJvZHkxLnZlbG9jaXR5LnggKiBueCArIGJvZHkxLnZlbG9jaXR5LnkgKiBueSAtIGJvZHkyLnZlbG9jaXR5LnggKiBueCAtIGJvZHkyLnZlbG9jaXR5LnkgKiBueSkgLyAoYm9keTEubWFzcyArIGJvZHkyLm1hc3MpO1xyXG5cclxuICAgICAgICBpZiAoIWJvZHkxLmltbW92YWJsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkxLnZlbG9jaXR5LnggPSAoYm9keTEudmVsb2NpdHkueCAtIHAgKiBib2R5MS5tYXNzICogbngpO1xyXG4gICAgICAgICAgICBib2R5MS52ZWxvY2l0eS55ID0gKGJvZHkxLnZlbG9jaXR5LnkgLSBwICogYm9keTEubWFzcyAqIG55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYm9keTIuaW1tb3ZhYmxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keTIudmVsb2NpdHkueCA9IChib2R5Mi52ZWxvY2l0eS54ICsgcCAqIGJvZHkyLm1hc3MgKiBueCk7XHJcbiAgICAgICAgICAgIGJvZHkyLnZlbG9jaXR5LnkgPSAoYm9keTIudmVsb2NpdHkueSArIHAgKiBib2R5Mi5tYXNzICogbnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGR2eCA9IGJvZHkyLnZlbG9jaXR5LnggLSBib2R5MS52ZWxvY2l0eS54O1xyXG4gICAgICAgIHZhciBkdnkgPSBib2R5Mi52ZWxvY2l0eS55IC0gYm9keTEudmVsb2NpdHkueTtcclxuICAgICAgICB2YXIgYW5nbGVDb2xsaXNpb24gPSBNYXRoLmF0YW4yKGR2eSwgZHZ4KTtcclxuXHJcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fZnJhbWVUaW1lO1xyXG5cclxuICAgICAgICBpZiAoIWJvZHkxLmltbW92YWJsZSAmJiAhYm9keTIuaW1tb3ZhYmxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3ZlcmxhcCAvPSAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFib2R5MS5pbW1vdmFibGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5MS54ICs9IChib2R5MS52ZWxvY2l0eS54ICogZGVsdGEpIC0gb3ZlcmxhcCAqIE1hdGguY29zKGFuZ2xlQ29sbGlzaW9uKTtcclxuICAgICAgICAgICAgYm9keTEueSArPSAoYm9keTEudmVsb2NpdHkueSAqIGRlbHRhKSAtIG92ZXJsYXAgKiBNYXRoLnNpbihhbmdsZUNvbGxpc2lvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWJvZHkyLmltbW92YWJsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkyLnggKz0gKGJvZHkyLnZlbG9jaXR5LnggKiBkZWx0YSkgKyBvdmVybGFwICogTWF0aC5jb3MoYW5nbGVDb2xsaXNpb24pO1xyXG4gICAgICAgICAgICBib2R5Mi55ICs9IChib2R5Mi52ZWxvY2l0eS55ICogZGVsdGEpICsgb3ZlcmxhcCAqIE1hdGguc2luKGFuZ2xlQ29sbGlzaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJvZHkxLnZlbG9jaXR5LnggKj0gYm9keTEuYm91bmNlLng7XHJcbiAgICAgICAgYm9keTEudmVsb2NpdHkueSAqPSBib2R5MS5ib3VuY2UueTtcclxuICAgICAgICBib2R5Mi52ZWxvY2l0eS54ICo9IGJvZHkyLmJvdW5jZS54O1xyXG4gICAgICAgIGJvZHkyLnZlbG9jaXR5LnkgKj0gYm9keTIuYm91bmNlLnk7XHJcblxyXG4gICAgICAgIGlmIChib2R5MS5vbkNvbGxpZGUgfHwgYm9keTIub25Db2xsaWRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5DT0xMSURFLCBib2R5MS5nYW1lT2JqZWN0LCBib2R5Mi5nYW1lT2JqZWN0LCBib2R5MSwgYm9keTIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0d28gQm9kaWVzIGludGVyc2VjdCBhdCBhbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjaW50ZXJzZWN0c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgYm9keSB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkyIC0gVGhlIHNlY29uZCBib2R5IHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR3byBib2RpZXMgaW50ZXJzZWN0LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdHM6IGZ1bmN0aW9uIChib2R5MSwgYm9keTIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGJvZHkxID09PSBib2R5MilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghYm9keTEuaXNDaXJjbGUgJiYgIWJvZHkyLmlzQ2lyY2xlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFJlY3QgdnMuIFJlY3RcclxuICAgICAgICAgICAgcmV0dXJuICEoXHJcbiAgICAgICAgICAgICAgICBib2R5MS5yaWdodCA8PSBib2R5Mi5wb3NpdGlvbi54IHx8XHJcbiAgICAgICAgICAgICAgICBib2R5MS5ib3R0b20gPD0gYm9keTIucG9zaXRpb24ueSB8fFxyXG4gICAgICAgICAgICAgICAgYm9keTEucG9zaXRpb24ueCA+PSBib2R5Mi5yaWdodCB8fFxyXG4gICAgICAgICAgICAgICAgYm9keTEucG9zaXRpb24ueSA+PSBib2R5Mi5ib3R0b21cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYm9keTEuaXNDaXJjbGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYm9keTIuaXNDaXJjbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBDaXJjbGUgdnMuIENpcmNsZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIERpc3RhbmNlQmV0d2Vlbihib2R5MS5jZW50ZXIueCwgYm9keTEuY2VudGVyLnksIGJvZHkyLmNlbnRlci54LCBib2R5Mi5jZW50ZXIueSkgPD0gKGJvZHkxLmhhbGZXaWR0aCArIGJvZHkyLmhhbGZXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgQ2lyY2xlIHZzLiBSZWN0XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaXJjbGVCb2R5SW50ZXJzZWN0cyhib2R5MSwgYm9keTIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBSZWN0IHZzLiBDaXJjbGVcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2lyY2xlQm9keUludGVyc2VjdHMoYm9keTIsIGJvZHkxKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVzdHMgaWYgYSBjaXJjdWxhciBCb2R5IGludGVyc2VjdHMgd2l0aCBhbm90aGVyIEJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY2lyY2xlQm9keUludGVyc2VjdHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGNpcmNsZSAtIFRoZSBjaXJjdWxhciBib2R5IHRvIHRlc3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5IC0gVGhlIHJlY3Rhbmd1bGFyIGJvZHkgdG8gdGVzdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB0d28gYm9kaWVzIGludGVyc2VjdCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICBjaXJjbGVCb2R5SW50ZXJzZWN0czogZnVuY3Rpb24gKGNpcmNsZSwgYm9keSlcclxuICAgIHtcclxuICAgICAgICB2YXIgeCA9IENsYW1wKGNpcmNsZS5jZW50ZXIueCwgYm9keS5sZWZ0LCBib2R5LnJpZ2h0KTtcclxuICAgICAgICB2YXIgeSA9IENsYW1wKGNpcmNsZS5jZW50ZXIueSwgYm9keS50b3AsIGJvZHkuYm90dG9tKTtcclxuXHJcbiAgICAgICAgdmFyIGR4ID0gKGNpcmNsZS5jZW50ZXIueCAtIHgpICogKGNpcmNsZS5jZW50ZXIueCAtIHgpO1xyXG4gICAgICAgIHZhciBkeSA9IChjaXJjbGUuY2VudGVyLnkgLSB5KSAqIChjaXJjbGUuY2VudGVyLnkgLSB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChkeCArIGR5KSA8PSAoY2lyY2xlLmhhbGZXaWR0aCAqIGNpcmNsZS5oYWxmV2lkdGgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlc3RzIGlmIEdhbWUgT2JqZWN0cyBvdmVybGFwLlxyXG4gICAgICpcclxuICAgICAqIFNlZSBkZXRhaWxzIGluIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZX0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjb3ZlcmxhcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QxIC0gVGhlIGZpcnN0IG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzIHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBbb2JqZWN0Ml0gLSBUaGUgc2Vjb25kIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzIHRvIGNoZWNrLCBvciBgdW5kZWZpbmVkYC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbb3ZlcmxhcENhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBvdmVybGFwLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBvdmVybGFwQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0byBydW4gdGhlIGNhbGxiYWNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBHYW1lIE9iamVjdCBvdmVybGFwcyBhbm90aGVyLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGVcclxuICAgICAqL1xyXG4gICAgb3ZlcmxhcDogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIG92ZXJsYXBDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG92ZXJsYXBDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IG92ZXJsYXBDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAocHJvY2Vzc0NhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgcHJvY2Vzc0NhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChjYWxsYmFja0NvbnRleHQgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFja0NvbnRleHQgPSBvdmVybGFwQ2FsbGJhY2s7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlkZU9iamVjdHMob2JqZWN0MSwgb2JqZWN0Miwgb3ZlcmxhcENhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSBjb2xsaXNpb24gY2hlY2sgYW5kIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIHBoeXNpY3MgZW5hYmxlZCBvYmplY3RzIGdpdmVuLCB3aGljaCBjYW4gYmUgc2luZ2xlXHJcbiAgICAgKiBHYW1lIE9iamVjdHMsIGFycmF5cyBvZiBHYW1lIE9iamVjdHMsIFBoeXNpY3MgR3JvdXBzLCBhcnJheXMgb2YgUGh5c2ljcyBHcm91cHMgb3Igbm9ybWFsIEdyb3Vwcy5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3UgZG9uJ3QgcmVxdWlyZSBzZXBhcmF0aW9uIHRoZW4gdXNlIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjb3ZlcmxhcH0gaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0d28gR3JvdXBzIG9yIGFycmF5cyBhcmUgcGFzc2VkLCBlYWNoIG1lbWJlciBvZiBvbmUgd2lsbCBiZSB0ZXN0ZWQgYWdhaW5zdCBlYWNoIG1lbWJlciBvZiB0aGUgb3RoZXIuXHJcbiAgICAgKlxyXG4gICAgICogSWYgKipvbmx5Kiogb25lIEdyb3VwIGlzIHBhc3NlZCAoYXMgYG9iamVjdDFgKSwgZWFjaCBtZW1iZXIgb2YgdGhlIEdyb3VwIHdpbGwgYmUgY29sbGlkZWQgYWdhaW5zdCB0aGUgb3RoZXIgbWVtYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBJZiAqKm9ubHkqKiBvbmUgQXJyYXkgaXMgcGFzc2VkLCB0aGUgYXJyYXkgaXMgaXRlcmF0ZWQgYW5kIGV2ZXJ5IGVsZW1lbnQgaW4gaXQgaXMgdGVzdGVkIGFnYWluc3QgdGhlIG90aGVycy5cclxuICAgICAqXHJcbiAgICAgKiBUd28gY2FsbGJhY2tzIGNhbiBiZSBwcm92aWRlZDsgdGhleSByZWNlaXZlIHRoZSBjb2xsaWRpbmcgZ2FtZSBvYmplY3RzIGFzIGFyZ3VtZW50cy5cclxuICAgICAqIElmIGFuIG92ZXJsYXAgaXMgZGV0ZWN0ZWQsIHRoZSBgcHJvY2Vzc0NhbGxiYWNrYCBpcyBjYWxsZWQgZmlyc3QuIEl0IGNhbiBjYW5jZWwgdGhlIGNvbGxpc2lvbiBieSByZXR1cm5pbmcgZmFsc2UuXHJcbiAgICAgKiBOZXh0IHRoZSBvYmplY3RzIGFyZSBzZXBhcmF0ZWQgYW5kIGBjb2xsaWRlQ2FsbGJhY2tgIGlzIGludm9rZWQuXHJcbiAgICAgKlxyXG4gICAgICogQXJjYWRlIFBoeXNpY3MgdXNlcyB0aGUgUHJvamVjdGlvbiBNZXRob2Qgb2YgY29sbGlzaW9uIHJlc29sdXRpb24gYW5kIHNlcGFyYXRpb24uIFdoaWxlIGl0J3MgZmFzdCBhbmQgc3VpdGFibGVcclxuICAgICAqIGZvciAnYXJjYWRlJyBzdHlsZSBnYW1lcyBpdCBsYWNrcyBzdGFiaWxpdHkgd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFyZSBpbiBjbG9zZSBwcm94aW1pdHkgb3IgcmVzdGluZyB1cG9uIGVhY2ggb3RoZXIuXHJcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiB0aGF0IHN0b3BzIHR3byBvYmplY3RzIHBlbmV0cmF0aW5nIG1heSBjcmVhdGUgYSBuZXcgcGVuZXRyYXRpb24gYWdhaW5zdCBhIGRpZmZlcmVudCBvYmplY3QuIElmIHlvdVxyXG4gICAgICogcmVxdWlyZSBhIGhpZ2ggbGV2ZWwgb2Ygc3RhYmlsaXR5IHBsZWFzZSBjb25zaWRlciB1c2luZyBhbiBhbHRlcm5hdGl2ZSBwaHlzaWNzIHN5c3RlbSwgc3VjaCBhcyBNYXR0ZXIuanMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QxIC0gVGhlIGZpcnN0IG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzIHRvIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBbb2JqZWN0Ml0gLSBUaGUgc2Vjb25kIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzIHRvIGNoZWNrLCBvciBgdW5kZWZpbmVkYC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIGNvbGxpZGUuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBhbnkgb3ZlcmxhcHBpbmcgR2FtZSBPYmplY3RzIHdlcmUgc2VwYXJhdGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZTogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbGxpZGVDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IGNvbGxpZGVDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAocHJvY2Vzc0NhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgcHJvY2Vzc0NhbGxiYWNrID0gbnVsbDsgfVxyXG4gICAgICAgIGlmIChjYWxsYmFja0NvbnRleHQgPT09IHVuZGVmaW5lZCkgeyBjYWxsYmFja0NvbnRleHQgPSBjb2xsaWRlQ2FsbGJhY2s7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlkZU9iamVjdHMob2JqZWN0MSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbi4gUGxlYXNlIHVzZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGVPYmplY3RzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBvYmplY3QxIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5BcmNhZGUuQXJjYWRlQ29sbGlkZXJUeXBlfSBbb2JqZWN0Ml0gLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IGNvbGxpZGVDYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBwcm9jZXNzQ2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHR3byBvYmplY3RzIGNvbGxpZGUuIE11c3QgcmV0dXJuIGEgYm9vbGVhbi5cclxuICAgICAqIEBwYXJhbSB7YW55fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gY2FsbCB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIFdoZXRoZXIgdGhpcyBpcyBhIGNvbGxpc2lvbiBvciBvdmVybGFwIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZU9iamVjdHM6IGZ1bmN0aW9uIChvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgajtcclxuXHJcbiAgICAgICAgaWYgKG9iamVjdDEuaXNQYXJlbnQgJiYgb2JqZWN0MS5waHlzaWNzVHlwZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2JqZWN0MSA9IG9iamVjdDEuY2hpbGRyZW4uZW50cmllcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYmplY3QyICYmIG9iamVjdDIuaXNQYXJlbnQgJiYgb2JqZWN0Mi5waHlzaWNzVHlwZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2JqZWN0MiA9IG9iamVjdDIuY2hpbGRyZW4uZW50cmllcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvYmplY3QxaXNBcnJheSA9IEFycmF5LmlzQXJyYXkob2JqZWN0MSk7XHJcbiAgICAgICAgdmFyIG9iamVjdDJpc0FycmF5ID0gQXJyYXkuaXNBcnJheShvYmplY3QyKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdG90YWwgPSAwO1xyXG5cclxuICAgICAgICBpZiAoIW9iamVjdDFpc0FycmF5ICYmICFvYmplY3QyaXNBcnJheSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBOZWl0aGVyIG9mIHRoZW0gYXJlIGFycmF5cyAtIGRvIHRoaXMgZmlyc3QgYXMgaXQncyB0aGUgbW9zdCBjb21tb24gdXNlLWNhc2VcclxuICAgICAgICAgICAgdGhpcy5jb2xsaWRlSGFuZGxlcihvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFvYmplY3QxaXNBcnJheSAmJiBvYmplY3QyaXNBcnJheSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBPYmplY3QgMiBpcyBhbiBBcnJheVxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqZWN0Mi5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaWRlSGFuZGxlcihvYmplY3QxLCBvYmplY3QyW2ldLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAob2JqZWN0MWlzQXJyYXkgJiYgIW9iamVjdDJpc0FycmF5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE9iamVjdCAxIGlzIGFuIEFycmF5XHJcbiAgICAgICAgICAgIGlmICghb2JqZWN0MilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFNwZWNpYWwgY2FzZSBmb3IgYXJyYXkgdnMuIHNlbGZcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3QxLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IG9iamVjdDFbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgb2JqZWN0MS5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBqKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaWRlSGFuZGxlcihjaGlsZCwgb2JqZWN0MVtqXSwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3QxLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGlkZUhhbmRsZXIob2JqZWN0MVtpXSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBUaGV5J3JlIGJvdGggYXJyYXlzXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3QxLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2JqZWN0Mi5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpZGVIYW5kbGVyKG9iamVjdDFbaV0sIG9iamVjdDJbal0sIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl90b3RhbCA+IDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbi4gUGxlYXNlIHVzZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZSBhbmQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI292ZXJsYXAgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlSGFuZGxlclxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gb2JqZWN0MSAtIFRoZSBmaXJzdCBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuQXJjYWRlLkFyY2FkZUNvbGxpZGVyVHlwZX0gb2JqZWN0MiAtIFRoZSBzZWNvbmQgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gY2hlY2ssIG9yIGB1bmRlZmluZWRgLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IGNvbGxpZGVDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIGNvbGxpZGUuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gcHJvY2Vzc0NhbGxiYWNrIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgY29sbGlkZS4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tDb250ZXh0IC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdG8gcnVuIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJsYXBPbmx5IC0gV2hldGhlciB0aGlzIGlzIGEgY29sbGlzaW9uIG9yIG92ZXJsYXAgY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbnkgb2JqZWN0cyBvdmVybGFwICh3aXRoIGBvdmVybGFwT25seWApOyBvciB0cnVlIGlmIGFueSBvdmVybGFwcGluZyBvYmplY3RzIHdlcmUgc2VwYXJhdGVkLlxyXG4gICAgICovXHJcbiAgICBjb2xsaWRlSGFuZGxlcjogZnVuY3Rpb24gKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBDb2xsaWRlIEdyb3VwIHdpdGggU2VsZlxyXG4gICAgICAgIC8vICBPbmx5IGNvbGxpZGUgdmFsaWQgb2JqZWN0c1xyXG4gICAgICAgIGlmIChvYmplY3QyID09PSB1bmRlZmluZWQgJiYgb2JqZWN0MS5pc1BhcmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpZGVHcm91cFZzR3JvdXAob2JqZWN0MSwgb2JqZWN0MSwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIElmIG5laXRoZXIgb2YgdGhlIG9iamVjdHMgYXJlIHNldCB0aGVuIGJhaWwgb3V0XHJcbiAgICAgICAgaWYgKCFvYmplY3QxIHx8ICFvYmplY3QyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEEgQm9keVxyXG4gICAgICAgIGlmIChvYmplY3QxLmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAob2JqZWN0Mi5ib2R5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaWRlU3ByaXRlVnNTcHJpdGUob2JqZWN0MSwgb2JqZWN0MiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdDIuaXNQYXJlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpZGVTcHJpdGVWc0dyb3VwKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QyLmlzVGlsZW1hcClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlkZVNwcml0ZVZzVGlsZW1hcExheWVyKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEdST1VQU1xyXG4gICAgICAgIGVsc2UgaWYgKG9iamVjdDEuaXNQYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAob2JqZWN0Mi5ib2R5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaWRlU3ByaXRlVnNHcm91cChvYmplY3QyLCBvYmplY3QxLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0Mi5pc1BhcmVudClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlkZUdyb3VwVnNHcm91cChvYmplY3QxLCBvYmplY3QyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0Mi5pc1RpbGVtYXApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpZGVHcm91cFZzVGlsZW1hcExheWVyKG9iamVjdDEsIG9iamVjdDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRJTEVNQVAgTEFZRVJTXHJcbiAgICAgICAgZWxzZSBpZiAob2JqZWN0MS5pc1RpbGVtYXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAob2JqZWN0Mi5ib2R5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaWRlU3ByaXRlVnNUaWxlbWFwTGF5ZXIob2JqZWN0Miwgb2JqZWN0MSwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdDIuaXNQYXJlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpZGVHcm91cFZzVGlsZW1hcExheWVyKG9iamVjdDIsIG9iamVjdDEsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBoYW5kbGVyIGZvciBTcHJpdGUgdnMuIFNwcml0ZSBjb2xsaXNpb25zLlxyXG4gICAgICogUGxlYXNlIHVzZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGVTcHJpdGVWc1Nwcml0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHNwcml0ZTEgLSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBzcHJpdGUyIC0gVGhlIHNlY29uZCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIGNvbGxpZGUuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIFdoZXRoZXIgdGhpcyBpcyBhIGNvbGxpc2lvbiBvciBvdmVybGFwIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZVNwcml0ZVZzU3ByaXRlOiBmdW5jdGlvbiAoc3ByaXRlMSwgc3ByaXRlMiwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFzcHJpdGUxLmJvZHkgfHwgIXNwcml0ZTIuYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlcGFyYXRlKHNwcml0ZTEuYm9keSwgc3ByaXRlMi5ib2R5LCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGNvbGxpZGVDYWxsYmFjaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29sbGlkZUNhbGxiYWNrLmNhbGwoY2FsbGJhY2tDb250ZXh0LCBzcHJpdGUxLCBzcHJpdGUyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG90YWwrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIFNwcml0ZSB2cy4gR3JvdXAgY29sbGlzaW9ucy5cclxuICAgICAqIFBsZWFzZSB1c2UgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGUgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlU3ByaXRlVnNHcm91cFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHNwcml0ZSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwfSBncm91cCAtIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gY29sbGlkZUNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0d28gb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IHByb2Nlc3NDYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdHdvIG9iamVjdHMgY29sbGlkZS4gTXVzdCByZXR1cm4gYSBib29sZWFuLlxyXG4gICAgICogQHBhcmFtIHthbnl9IGNhbGxiYWNrQ29udGV4dCAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBjYWxsIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJsYXBPbmx5IC0gV2hldGhlciB0aGlzIGlzIGEgY29sbGlzaW9uIG9yIG92ZXJsYXAgY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBTcHJpdGUgY29sbGlkZWQgd2l0aCB0aGUgZ2l2ZW4gR3JvdXAsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBjb2xsaWRlU3ByaXRlVnNHcm91cDogZnVuY3Rpb24gKHNwcml0ZSwgZ3JvdXAsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib2R5QSA9IHNwcml0ZS5ib2R5O1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAwIHx8ICFib2R5QSB8fCAhYm9keUEuZW5hYmxlIHx8IGJvZHlBLmNoZWNrQ29sbGlzaW9uLm5vbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgRG9lcyBzcHJpdGUgY29sbGlkZSB3aXRoIGFueXRoaW5nP1xyXG5cclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgbGVuO1xyXG4gICAgICAgIHZhciBib2R5QjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlVHJlZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBtaW5NYXggPSB0aGlzLnRyZWVNaW5NYXg7XHJcblxyXG4gICAgICAgICAgICBtaW5NYXgubWluWCA9IGJvZHlBLmxlZnQ7XHJcbiAgICAgICAgICAgIG1pbk1heC5taW5ZID0gYm9keUEudG9wO1xyXG4gICAgICAgICAgICBtaW5NYXgubWF4WCA9IGJvZHlBLnJpZ2h0O1xyXG4gICAgICAgICAgICBtaW5NYXgubWF4WSA9IGJvZHlBLmJvdHRvbTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gKGdyb3VwLnBoeXNpY3NUeXBlID09PSBDT05TVC5EWU5BTUlDX0JPRFkpID8gdGhpcy50cmVlLnNlYXJjaChtaW5NYXgpIDogdGhpcy5zdGF0aWNUcmVlLnNlYXJjaChtaW5NYXgpO1xyXG5cclxuICAgICAgICAgICAgbGVuID0gcmVzdWx0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHlCID0gcmVzdWx0c1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keUEgPT09IGJvZHlCIHx8ICFib2R5Qi5lbmFibGUgfHwgYm9keUIuY2hlY2tDb2xsaXNpb24ubm9uZSB8fCAhZ3JvdXAuY29udGFpbnMoYm9keUIuZ2FtZU9iamVjdCkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIFNraXAgaWYgY29tcGFyaW5nIGFnYWluc3QgaXRzZWxmLCBvciBpZiBib2R5QiBpc24ndCBjb2xsaWRhYmxlLCBvciBpZiBib2R5QiBpc24ndCBhY3R1YWxseSBwYXJ0IG9mIHRoZSBHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlcGFyYXRlKGJvZHlBLCBib2R5QiwgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlkZUNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlkZUNhbGxiYWNrLmNhbGwoY2FsbGJhY2tDb250ZXh0LCBib2R5QS5nYW1lT2JqZWN0LCBib2R5Qi5nYW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvdGFsKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZ3JvdXAuZ2V0Q2hpbGRyZW4oKTtcclxuICAgICAgICAgICAgdmFyIHNraXBJbmRleCA9IGdyb3VwLmNoaWxkcmVuLmVudHJpZXMuaW5kZXhPZihzcHJpdGUpO1xyXG5cclxuICAgICAgICAgICAgbGVuID0gY2hpbGRyZW4ubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5QiA9IGNoaWxkcmVuW2ldLmJvZHk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFib2R5QiB8fCBpID09PSBza2lwSW5kZXggfHwgIWJvZHlCLmVuYWJsZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZShib2R5QSwgYm9keUIsIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpZGVDYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpZGVDYWxsYmFjay5jYWxsKGNhbGxiYWNrQ29udGV4dCwgYm9keUEuZ2FtZU9iamVjdCwgYm9keUIuZ2FtZU9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90b3RhbCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIEdyb3VwIHZzLiBUaWxlbWFwIGNvbGxpc2lvbnMuXHJcbiAgICAgKiBQbGVhc2UgdXNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZUdyb3VwVnNUaWxlbWFwTGF5ZXJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Hcm91cH0gZ3JvdXAgLSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gdGlsZW1hcExheWVyIC0gVGhlIHNlY29uZCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIGNvbGxpZGUuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIFdoZXRoZXIgdGhpcyBpcyBhIGNvbGxpc2lvbiBvciBvdmVybGFwIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZUdyb3VwVnNUaWxlbWFwTGF5ZXI6IGZ1bmN0aW9uIChncm91cCwgdGlsZW1hcExheWVyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSlcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpbGRyZW4gPSBncm91cC5nZXRDaGlsZHJlbigpO1xyXG5cclxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRpZENvbGxpZGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ib2R5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2xsaWRlU3ByaXRlVnNUaWxlbWFwTGF5ZXIoY2hpbGRyZW5baV0sIHRpbGVtYXBMYXllciwgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHkpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZENvbGxpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGlkQ29sbGlkZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGFkdmFuY2VkIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgZm9yIHRlc3RpbmcgZm9yIGNvbGxpc2lvbiBiZXR3ZWVuIGEgc2luZ2xlIFNwcml0ZSBhbmQgYW4gYXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZSB0aGUgYGNvbGxpZGVgIG1ldGhvZCBpbnN0ZWFkLCB3aXRoIGEgU3ByaXRlIHZzLiBhIFRpbGVtYXAgTGF5ZXIsIGFzIHRoYXQgd2lsbCBwZXJmb3JtXHJcbiAgICAgKiB0aWxlIGZpbHRlcmluZyBhbmQgY3VsbGluZyBmb3IgeW91LCBhcyB3ZWxsIGFzIGhhbmRsZSB0aGUgaW50ZXJlc3RpbmcgZmFjZSBjb2xsaXNpb24gYXV0b21hdGljYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvZmZlcmVkIGZvciB0aG9zZSB3aG8gd291bGQgbGlrZSB0byBjaGVjayBmb3IgY29sbGlzaW9uIHdpdGggc3BlY2lmaWMgVGlsZXMgaW4gYSBsYXllciwgd2l0aG91dFxyXG4gICAgICogaGF2aW5nIHRvIHNldCBhbnkgY29sbGlzaW9uIGF0dHJpYnV0ZXMgb24gdGhlIHRpbGVzIGluIHF1ZXN0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBxdWljayBkeW5hbWljIGNvbGxpc2lvbnNcclxuICAgICAqIG9uIHNtYWxsIHNldHMgb2YgVGlsZXMuIEFzIHN1Y2gsIG5vIGN1bGxpbmcgb3IgY2hlY2tzIGFyZSBtYWRlIHRvIHRoZSBhcnJheSBvZiBUaWxlcyBnaXZlbiB0byB0aGlzIG1ldGhvZCxcclxuICAgICAqIHlvdSBzaG91bGQgZmlsdGVyIHRoZW0gYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBJbXBvcnRhbnQ6IFVzZSBvZiB0aGlzIG1ldGhvZCBza2lwcyB0aGUgYGludGVyZXN0aW5nIGZhY2VzYCBzeXN0ZW0gdGhhdCBUaWxlbWFwIExheWVycyB1c2UuIFRoaXMgbWVhbnMgaWYgeW91IGhhdmVcclxuICAgICAqIHNheSBhIHJvdyBvciBjb2x1bW4gb2YgdGlsZXMsIGFuZCB5b3UganVtcCBpbnRvLCBvciB3YWxrIG92ZXIgdGhlbSwgaXQncyBwb3NzaWJsZSB0byBnZXQgc3R1Y2sgb24gdGhlIGVkZ2VzIG9mIHRoZVxyXG4gICAgICogdGlsZXMgYXMgdGhlIGludGVyZXN0aW5nIGZhY2UgY2FsY3VsYXRpb25zIGFyZSBza2lwcGVkLiBIb3dldmVyLCBmb3IgcXVpY2stZmlyZSBzbWFsbCBjb2xsaXNpb24gc2V0IHRlc3RzIG9uXHJcbiAgICAgKiBkeW5hbWljIG1hcHMsIHRoaXMgbWV0aG9kIGNhbiBwcm92ZSB2ZXJ5IHVzZWZ1bC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlVGlsZXNcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1RJTEVfQ09MTElERVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHNwcml0ZSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gdGlsZXMgLSBBbiBhcnJheSBvZiBUaWxlcyB0byBjaGVjayBmb3IgY29sbGlzaW9uIGFnYWluc3QuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW2NvbGxpZGVDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgY29sbGlkZS4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0byBydW4gdGhlIGNhbGxiYWNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFueSBvYmplY3RzIG92ZXJsYXAgKHdpdGggYG92ZXJsYXBPbmx5YCk7IG9yIHRydWUgaWYgYW55IG92ZXJsYXBwaW5nIG9iamVjdHMgd2VyZSBzZXBhcmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNvbGxpZGVUaWxlczogZnVuY3Rpb24gKHNwcml0ZSwgdGlsZXMsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFzcHJpdGUuYm9keS5lbmFibGUgfHwgdGlsZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaWRlU3ByaXRlVnNUaWxlc0hhbmRsZXIoc3ByaXRlLCB0aWxlcywgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBhZHZhbmNlZCBtZXRob2QgaXMgc3BlY2lmaWNhbGx5IGZvciB0ZXN0aW5nIGZvciBvdmVybGFwcyBiZXR3ZWVuIGEgc2luZ2xlIFNwcml0ZSBhbmQgYW4gYXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZSB0aGUgYG92ZXJsYXBgIG1ldGhvZCBpbnN0ZWFkLCB3aXRoIGEgU3ByaXRlIHZzLiBhIFRpbGVtYXAgTGF5ZXIsIGFzIHRoYXQgd2lsbCBwZXJmb3JtXHJcbiAgICAgKiB0aWxlIGZpbHRlcmluZyBhbmQgY3VsbGluZyBmb3IgeW91LCBhcyB3ZWxsIGFzIGhhbmRsZSB0aGUgaW50ZXJlc3RpbmcgZmFjZSBjb2xsaXNpb24gYXV0b21hdGljYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvZmZlcmVkIGZvciB0aG9zZSB3aG8gd291bGQgbGlrZSB0byBjaGVjayBmb3Igb3ZlcmxhcHMgd2l0aCBzcGVjaWZpYyBUaWxlcyBpbiBhIGxheWVyLCB3aXRob3V0XHJcbiAgICAgKiBoYXZpbmcgdG8gc2V0IGFueSBjb2xsaXNpb24gYXR0cmlidXRlcyBvbiB0aGUgdGlsZXMgaW4gcXVlc3Rpb24uIFRoaXMgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHF1aWNrIGR5bmFtaWMgb3ZlcmxhcFxyXG4gICAgICogdGVzdHMgb24gc21hbGwgc2V0cyBvZiBUaWxlcy4gQXMgc3VjaCwgbm8gY3VsbGluZyBvciBjaGVja3MgYXJlIG1hZGUgdG8gdGhlIGFycmF5IG9mIFRpbGVzIGdpdmVuIHRvIHRoaXMgbWV0aG9kLFxyXG4gICAgICogeW91IHNob3VsZCBmaWx0ZXIgdGhlbSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoaXMgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI292ZXJsYXBUaWxlc1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjVElMRV9PVkVSTEFQXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gc3ByaXRlIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSB0aWxlcyAtIEFuIGFycmF5IG9mIFRpbGVzIHRvIGNoZWNrIGZvciBjb2xsaXNpb24gYWdhaW5zdC5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgb3ZlcmxhcFRpbGVzOiBmdW5jdGlvbiAoc3ByaXRlLCB0aWxlcywgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXNwcml0ZS5ib2R5LmVuYWJsZSB8fCB0aWxlcy5sZW5ndGggPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpZGVTcHJpdGVWc1RpbGVzSGFuZGxlcihzcHJpdGUsIHRpbGVzLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIFNwcml0ZSB2cy4gVGlsZW1hcCBjb2xsaXNpb25zLlxyXG4gICAgICogUGxlYXNlIHVzZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGVTcHJpdGVWc1RpbGVtYXBMYXllclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjVElMRV9DT0xMSURFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNUSUxFX09WRVJMQVBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IHNwcml0ZSAtIFRoZSBmaXJzdCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSB0aWxlbWFwTGF5ZXIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtjb2xsaWRlQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgaWYgdGhlIG9iamVjdHMgY29sbGlkZS5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbcHJvY2Vzc0NhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgbGV0cyB5b3UgcGVyZm9ybSBhZGRpdGlvbmFsIGNoZWNrcyBhZ2FpbnN0IHRoZSB0d28gb2JqZWN0cyBpZiB0aGV5IGNvbGxpZGUuIElmIHRoaXMgaXMgc2V0IHRoZW4gYGNvbGxpZGVDYWxsYmFja2Agd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGlzIGNhbGxiYWNrIHJldHVybnMgYHRydWVgLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtjYWxsYmFja0NvbnRleHRdIC0gVGhlIGNvbnRleHQgaW4gd2hpY2ggdG8gcnVuIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVybGFwT25seV0gLSBXaGV0aGVyIHRoaXMgaXMgYSBjb2xsaXNpb24gb3Igb3ZlcmxhcCBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFueSBvYmplY3RzIG92ZXJsYXAgKHdpdGggYG92ZXJsYXBPbmx5YCk7IG9yIHRydWUgaWYgYW55IG92ZXJsYXBwaW5nIG9iamVjdHMgd2VyZSBzZXBhcmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNvbGxpZGVTcHJpdGVWc1RpbGVtYXBMYXllcjogZnVuY3Rpb24gKHNwcml0ZSwgdGlsZW1hcExheWVyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSlcclxuICAgIHtcclxuICAgICAgICB2YXIgYm9keSA9IHNwcml0ZS5ib2R5O1xyXG5cclxuICAgICAgICBpZiAoIWJvZHkuZW5hYmxlIHx8IGJvZHkuY2hlY2tDb2xsaXNpb24ubm9uZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB4ID0gYm9keS5wb3NpdGlvbi54O1xyXG4gICAgICAgIHZhciB5ID0gYm9keS5wb3NpdGlvbi55O1xyXG4gICAgICAgIHZhciB3ID0gYm9keS53aWR0aDtcclxuICAgICAgICB2YXIgaCA9IGJvZHkuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyBUT0RPOiB0aGlzIGxvZ2ljIHNob3VsZCBiZSBlbmNhcHN1bGF0ZWQgd2l0aGluIHRoZSBUaWxlbWFwIEFQSSBhdCBzb21lIHBvaW50LlxyXG4gICAgICAgIC8vIElmIHRoZSBtYXBzIGJhc2UgdGlsZSBzaXplIGRpZmZlcnMgZnJvbSB0aGUgbGF5ZXIncyB0aWxlIHNpemUsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZVxyXG4gICAgICAgIC8vIHNlbGVjdGlvbiBhcmVhIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3by5cclxuICAgICAgICB2YXIgbGF5ZXJEYXRhID0gdGlsZW1hcExheWVyLmxheWVyO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXJEYXRhLnRpbGVXaWR0aCA+IGxheWVyRGF0YS5iYXNlVGlsZVdpZHRoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gVGhlIHggb3JpZ2luIG9mIGEgdGlsZSBpcyB0aGUgbGVmdCBzaWRlLCBzbyB4IGFuZCB3aWR0aCBuZWVkIHRvIGJlIGFkanVzdGVkLlxyXG4gICAgICAgICAgICB2YXIgeERpZmYgPSAobGF5ZXJEYXRhLnRpbGVXaWR0aCAtIGxheWVyRGF0YS5iYXNlVGlsZVdpZHRoKSAqIHRpbGVtYXBMYXllci5zY2FsZVg7XHJcbiAgICAgICAgICAgIHggLT0geERpZmY7XHJcbiAgICAgICAgICAgIHcgKz0geERpZmY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXJEYXRhLnRpbGVIZWlnaHQgPiBsYXllckRhdGEuYmFzZVRpbGVIZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBUaGUgeSBvcmlnaW4gb2YgYSB0aWxlIGlzIHRoZSBib3R0b20gc2lkZSwgc28ganVzdCB0aGUgaGVpZ2h0IG5lZWRzIHRvIGJlIGFkanVzdGVkLlxyXG4gICAgICAgICAgICB2YXIgeURpZmYgPSAobGF5ZXJEYXRhLnRpbGVIZWlnaHQgLSBsYXllckRhdGEuYmFzZVRpbGVIZWlnaHQpICogdGlsZW1hcExheWVyLnNjYWxlWTtcclxuICAgICAgICAgICAgaCArPSB5RGlmZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBtYXBEYXRhID0gdGlsZW1hcExheWVyLmdldFRpbGVzV2l0aGluV29ybGRYWSh4LCB5LCB3LCBoKTtcclxuXHJcbiAgICAgICAgaWYgKG1hcERhdGEubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaWRlU3ByaXRlVnNUaWxlc0hhbmRsZXIoc3ByaXRlLCBtYXBEYXRhLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIFNwcml0ZSB2cy4gVGlsZW1hcCBjb2xsaXNpb25zLlxyXG4gICAgICogUGxlYXNlIHVzZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZSBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2NvbGxpZGVTcHJpdGVWc1RpbGVzSGFuZGxlclxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjVElMRV9DT0xMSURFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNUSUxFX09WRVJMQVBcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gc3ByaXRlIC0gVGhlIGZpcnN0IG9iamVjdCB0byBjaGVjayBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IHRpbGVtYXBMYXllciAtIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW2NvbGxpZGVDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgb2JqZWN0cyBjb2xsaWRlLlxyXG4gICAgICogQHBhcmFtIHtBcmNhZGVQaHlzaWNzQ2FsbGJhY2t9IFtwcm9jZXNzQ2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBsZXRzIHlvdSBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzIGFnYWluc3QgdGhlIHR3byBvYmplY3RzIGlmIHRoZXkgY29sbGlkZS4gSWYgdGhpcyBpcyBzZXQgdGhlbiBgY29sbGlkZUNhbGxiYWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0byBydW4gdGhlIGNhbGxiYWNrcy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJsYXBPbmx5XSAtIFdoZXRoZXIgdGhpcyBpcyBhIGNvbGxpc2lvbiBvciBvdmVybGFwIGNoZWNrLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNMYXllcl0gLSBJcyB0aGlzIGNoZWNrIGNvbWluZyBmcm9tIGEgVGlsZW1hcExheWVyIG9yIGFuIGFycmF5IG9mIHRpbGVzP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZVNwcml0ZVZzVGlsZXNIYW5kbGVyOiBmdW5jdGlvbiAoc3ByaXRlLCB0aWxlcywgY29sbGlkZUNhbGxiYWNrLCBwcm9jZXNzQ2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgb3ZlcmxhcE9ubHksIGlzTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvZHkgPSBzcHJpdGUuYm9keTtcclxuXHJcbiAgICAgICAgdmFyIHRpbGU7XHJcbiAgICAgICAgdmFyIHRpbGVXb3JsZFJlY3QgPSB7IGxlZnQ6IDAsIHJpZ2h0OiAwLCB0b3A6IDAsIGJvdHRvbTogMCB9O1xyXG4gICAgICAgIHZhciB0aWxlbWFwTGF5ZXI7XHJcbiAgICAgICAgdmFyIGNvbGxpc2lvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGlsZSA9IHRpbGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgdGlsZW1hcExheWVyID0gdGlsZS50aWxlbWFwTGF5ZXI7XHJcblxyXG4gICAgICAgICAgICB0aWxlV29ybGRSZWN0LmxlZnQgPSB0aWxlbWFwTGF5ZXIudGlsZVRvV29ybGRYKHRpbGUueCk7XHJcbiAgICAgICAgICAgIHRpbGVXb3JsZFJlY3QudG9wID0gdGlsZW1hcExheWVyLnRpbGVUb1dvcmxkWSh0aWxlLnkpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIG1hcCdzIGJhc2UgdGlsZSBzaXplIGRpZmZlcnMgZnJvbSB0aGUgbGF5ZXIncyB0aWxlIHNpemUsIG9ubHkgdGhlIHRvcCBvZiB0aGUgcmVjdFxyXG4gICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBhZGp1c3RlZCBzaW5jZSBpdHMgb3JpZ2luIGlzICgwLCAxKS5cclxuICAgICAgICAgICAgaWYgKHRpbGUuYmFzZUhlaWdodCAhPT0gdGlsZS5oZWlnaHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpbGVXb3JsZFJlY3QudG9wIC09ICh0aWxlLmhlaWdodCAtIHRpbGUuYmFzZUhlaWdodCkgKiB0aWxlbWFwTGF5ZXIuc2NhbGVZO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aWxlV29ybGRSZWN0LnJpZ2h0ID0gdGlsZVdvcmxkUmVjdC5sZWZ0ICsgdGlsZS53aWR0aCAqIHRpbGVtYXBMYXllci5zY2FsZVg7XHJcbiAgICAgICAgICAgIHRpbGVXb3JsZFJlY3QuYm90dG9tID0gdGlsZVdvcmxkUmVjdC50b3AgKyB0aWxlLmhlaWdodCAqIHRpbGVtYXBMYXllci5zY2FsZVk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVGlsZUludGVyc2VjdHNCb2R5KHRpbGVXb3JsZFJlY3QsIGJvZHkpXHJcbiAgICAgICAgICAgICAgICAmJiAoIXByb2Nlc3NDYWxsYmFjayB8fCBwcm9jZXNzQ2FsbGJhY2suY2FsbChjYWxsYmFja0NvbnRleHQsIHNwcml0ZSwgdGlsZSkpXHJcbiAgICAgICAgICAgICAgICAmJiBQcm9jZXNzVGlsZUNhbGxiYWNrcyh0aWxlLCBzcHJpdGUpXHJcbiAgICAgICAgICAgICAgICAmJiAob3ZlcmxhcE9ubHkgfHwgU2VwYXJhdGVUaWxlKGksIGJvZHksIHRpbGUsIHRpbGVXb3JsZFJlY3QsIHRpbGVtYXBMYXllciwgdGhpcy5USUxFX0JJQVMsIGlzTGF5ZXIpKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG90YWwrKztcclxuXHJcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb2xsaWRlQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sbGlkZUNhbGxiYWNrLmNhbGwoY2FsbGJhY2tDb250ZXh0LCBzcHJpdGUsIHRpbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvdmVybGFwT25seSAmJiBib2R5Lm9uT3ZlcmxhcClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlRJTEVfT1ZFUkxBUCwgc3ByaXRlLCB0aWxlLCBib2R5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJvZHkub25Db2xsaWRlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuVElMRV9DT0xMSURFLCBzcHJpdGUsIHRpbGUsIGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29sbGlzaW9uO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhlbHBlciBmb3IgR3JvdXAgdnMuIEdyb3VwIGNvbGxpc2lvbnMuXHJcbiAgICAgKiBQbGVhc2UgdXNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Xb3JsZCNjb2xsaWRlIGluc3RlYWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjY29sbGlkZUdyb3VwVnNHcm91cFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyb3VwfSBncm91cDEgLSBUaGUgZmlyc3Qgb2JqZWN0IHRvIGNoZWNrIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Hcm91cH0gZ3JvdXAyIC0gVGhlIHNlY29uZCBvYmplY3QgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7QXJjYWRlUGh5c2ljc0NhbGxiYWNrfSBbY29sbGlkZUNhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBvYmplY3RzIGNvbGxpZGUuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIG9iamVjdHMgaWYgdGhleSBjb2xsaWRlLiBJZiB0aGlzIGlzIHNldCB0aGVuIGBjb2xsaWRlQ2FsbGJhY2tgIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7YW55fSBbY2FsbGJhY2tDb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvdmVybGFwT25seSAtIFdoZXRoZXIgdGhpcyBpcyBhIGNvbGxpc2lvbiBvciBvdmVybGFwIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW55IG9iamVjdHMgb3ZlcmxhcCAod2l0aCBgb3ZlcmxhcE9ubHlgKTsgb3IgdHJ1ZSBpZiBhbnkgb3ZlcmxhcHBpbmcgb2JqZWN0cyB3ZXJlIHNlcGFyYXRlZC5cclxuICAgICAqL1xyXG4gICAgY29sbGlkZUdyb3VwVnNHcm91cDogZnVuY3Rpb24gKGdyb3VwMSwgZ3JvdXAyLCBjb2xsaWRlQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBvdmVybGFwT25seSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZ3JvdXAxLmxlbmd0aCA9PT0gMCB8fCBncm91cDIubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gZ3JvdXAxLmdldENoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNvbGxpZGVTcHJpdGVWc0dyb3VwKGNoaWxkcmVuW2ldLCBncm91cDIsIGNvbGxpZGVDYWxsYmFjaywgcHJvY2Vzc0NhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIG92ZXJsYXBPbmx5KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JhcCBhbiBvYmplY3QncyBjb29yZGluYXRlcyAob3Igc2V2ZXJhbCBvYmplY3RzJyBjb29yZGluYXRlcykgd2l0aGluIHtAbGluayBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjYm91bmRzfS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIG91dHNpZGUgYW55IGJvdW5kYXJ5IGVkZ2UgKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSksIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHNhbWUgb2Zmc2V0IGZyb20gdGhlIG9wcG9zaXRlIGVkZ2UgKHRoZSBpbnRlcmlvcikuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjd3JhcFxyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3QgLSBBIEdhbWUgT2JqZWN0LCBhIEdyb3VwLCBhbiBvYmplY3Qgd2l0aCBgeGAgYW5kIGB5YCBjb29yZGluYXRlcywgb3IgYW4gYXJyYXkgb2Ygc3VjaCBvYmplY3RzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWRkaW5nPTBdIC0gQW4gYW1vdW50IGFkZGVkIHRvIGVhY2ggYm91bmRhcnkgZWRnZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgd3JhcDogZnVuY3Rpb24gKG9iamVjdCwgcGFkZGluZylcclxuICAgIHtcclxuICAgICAgICBpZiAob2JqZWN0LmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndyYXBPYmplY3Qob2JqZWN0LCBwYWRkaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAob2JqZWN0LmdldENoaWxkcmVuKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53cmFwQXJyYXkob2JqZWN0LmdldENoaWxkcmVuKCksIHBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndyYXBBcnJheShvYmplY3QsIHBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndyYXBPYmplY3Qob2JqZWN0LCBwYWRkaW5nKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JhcCBlYWNoIG9iamVjdCdzIGNvb3JkaW5hdGVzIHdpdGhpbiB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2JvdW5kc30uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjd3JhcEFycmF5XHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5LjwqPn0gb2JqZWN0cyAtIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gYmUgd3JhcHBlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFkZGluZz0wXSAtIEFuIGFtb3VudCBhZGRlZCB0byB0aGUgYm91bmRhcnkuXHJcbiAgICAgKi9cclxuICAgIHdyYXBBcnJheTogZnVuY3Rpb24gKG9iamVjdHMsIHBhZGRpbmcpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53cmFwT2JqZWN0KG9iamVjdHNbaV0sIHBhZGRpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwIGFuIG9iamVjdCdzIGNvb3JkaW5hdGVzIHdpdGhpbiB7QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2JvdW5kc30uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuV29ybGQjd3JhcE9iamVjdFxyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3QgLSBBIEdhbWUgT2JqZWN0LCBhIFBoeXNpY3MgQm9keSwgb3IgYW55IG9iamVjdCB3aXRoIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZGRpbmc9MF0gLSBBbiBhbW91bnQgYWRkZWQgdG8gdGhlIGJvdW5kYXJ5LlxyXG4gICAgICovXHJcbiAgICB3cmFwT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0LCBwYWRkaW5nKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChwYWRkaW5nID09PSB1bmRlZmluZWQpIHsgcGFkZGluZyA9IDA7IH1cclxuXHJcbiAgICAgICAgb2JqZWN0LnggPSBXcmFwKG9iamVjdC54LCB0aGlzLmJvdW5kcy5sZWZ0IC0gcGFkZGluZywgdGhpcy5ib3VuZHMucmlnaHQgKyBwYWRkaW5nKTtcclxuICAgICAgICBvYmplY3QueSA9IFdyYXAob2JqZWN0LnksIHRoaXMuYm91bmRzLnRvcCAtIHBhZGRpbmcsIHRoaXMuYm91bmRzLmJvdHRvbSArIHBhZGRpbmcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNodXRzIGRvd24gdGhlIHNpbXVsYXRpb24sIGNsZWFyaW5nIHBoeXNpY3MgZGF0YSBhbmQgcmVtb3ZpbmcgbGlzdGVuZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI3NodXRkb3duXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50cmVlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zdGF0aWNUcmVlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ib2RpZXMuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLnN0YXRpY0JvZGllcy5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuY29sbGlkZXJzLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHV0cyBkb3duIHRoZSBzaW11bGF0aW9uIGFuZCBkaXNjb25uZWN0cyBpdCBmcm9tIHRoZSBjdXJyZW50IHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLldvcmxkI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV29ybGQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgYWNjZWxlcmF0aW9uIHByb3BlcnRpZXMgb2YgYW4gQXJjYWRlIFBoeXNpY3MgQm9keS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5BY2NlbGVyYXRpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQWNjZWxlcmF0aW9uID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSdzIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFjY2VsZXJhdGlvbi4gSWYgdGhlIHZlcnRpY2FsIGFjY2VsZXJhdGlvbiB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZSB2ZXJ0aWNhbCBhY2NlbGVyYXRpb24gaXMgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBob3Jpem9udGFsIGFjY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkFjY2VsZXJhdGlvbiNzZXRBY2NlbGVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgYWNjZWxlcmF0aW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgYWNjZWxlcmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWNjZWxlcmF0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuYWNjZWxlcmF0aW9uLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSdzIGhvcml6b250YWwgYWNjZWxlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQWNjZWxlcmF0aW9uI3NldEFjY2VsZXJhdGlvblhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBob3Jpem9udGFsIGFjY2VsZXJhdGlvblxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEFjY2VsZXJhdGlvblg6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuYWNjZWxlcmF0aW9uLnggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSdzIHZlcnRpY2FsIGFjY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkFjY2VsZXJhdGlvbiNzZXRBY2NlbGVyYXRpb25ZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmVydGljYWwgYWNjZWxlcmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWNjZWxlcmF0aW9uWTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5hY2NlbGVyYXRpb24ueSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFjY2VsZXJhdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBhbmd1bGFyIGFjY2VsZXJhdGlvbiBwcm9wZXJ0aWVzIG9mIGFuIEFyY2FkZSBQaHlzaWNzIEJvZHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQW5ndWxhclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBBbmd1bGFyID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYW5ndWxhciB2ZWxvY2l0eSBvZiB0aGUgYm9keS5cclxuICAgICAqIFxyXG4gICAgICogSW4gQXJjYWRlIFBoeXNpY3MsIGJvZGllcyBjYW5ub3Qgcm90YXRlLiBUaGV5IGFyZSBhbHdheXMgYXhpcy1hbGlnbmVkLlxyXG4gICAgICogSG93ZXZlciwgdGhleSBjYW4gaGF2ZSBhbmd1bGFyIG1vdGlvbiwgd2hpY2ggaXMgcGFzc2VkIG9uIHRvIHRoZSBHYW1lIE9iamVjdCBib3VuZCB0byB0aGUgYm9keSxcclxuICAgICAqIGNhdXNpbmcgdGhlbSB0byB2aXN1YWxseSByb3RhdGUsIGV2ZW4gdGhvdWdoIHRoZSBib2R5IHJlbWFpbnMgYXhpcy1hbGlnbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQW5ndWxhciNzZXRBbmd1bGFyVmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgYW5ndWxhciB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbmd1bGFyVmVsb2NpdHk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuYW5ndWxhclZlbG9jaXR5ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFuZ3VsYXIgYWNjZWxlcmF0aW9uIG9mIHRoZSBib2R5LlxyXG4gICAgICogXHJcbiAgICAgKiBJbiBBcmNhZGUgUGh5c2ljcywgYm9kaWVzIGNhbm5vdCByb3RhdGUuIFRoZXkgYXJlIGFsd2F5cyBheGlzLWFsaWduZWQuXHJcbiAgICAgKiBIb3dldmVyLCB0aGV5IGNhbiBoYXZlIGFuZ3VsYXIgbW90aW9uLCB3aGljaCBpcyBwYXNzZWQgb24gdG8gdGhlIEdhbWUgT2JqZWN0IGJvdW5kIHRvIHRoZSBib2R5LFxyXG4gICAgICogY2F1c2luZyB0aGVtIHRvIHZpc3VhbGx5IHJvdGF0ZSwgZXZlbiB0aG91Z2ggdGhlIGJvZHkgcmVtYWlucyBheGlzLWFsaWduZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5Bbmd1bGFyI3NldEFuZ3VsYXJBY2NlbGVyYXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgYW5ndWxhciBhY2NlbGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QW5ndWxhckFjY2VsZXJhdGlvbjogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5hbmd1bGFyQWNjZWxlcmF0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFuZ3VsYXIgZHJhZyBvZiB0aGUgYm9keS4gRHJhZyBpcyBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHZlbG9jaXR5LCBwcm92aWRpbmcgYSBmb3JtIG9mIGRlY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkFuZ3VsYXIjc2V0QW5ndWxhckRyYWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbmd1bGFyRHJhZzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5hbmd1bGFyRHJhZyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFuZ3VsYXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgYm91bmNlIHByb3BlcnRpZXMgb2YgYW4gQXJjYWRlIFBoeXNpY3MgQm9keS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5Cb3VuY2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQm91bmNlID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm91bmNlIHZhbHVlcyBvZiB0aGlzIGJvZHkuXHJcbiAgICAgKiBcclxuICAgICAqIEJvdW5jZSBpcyB0aGUgYW1vdW50IG9mIHJlc3RpdHV0aW9uLCBvciBlbGFzdGljaXR5LCB0aGUgYm9keSBoYXMgd2hlbiBpdCBjb2xsaWRlcyB3aXRoIGFub3RoZXIgb2JqZWN0LlxyXG4gICAgICogQSB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgaXQgd2lsbCByZXRhaW4gaXRzIGZ1bGwgdmVsb2NpdHkgYWZ0ZXIgdGhlIHJlYm91bmQuIEEgdmFsdWUgb2YgMCBtZWFucyBpdCB3aWxsIG5vdCByZWJvdW5kIGF0IGFsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkJvdW5jZSNzZXRCb3VuY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFtb3VudCBvZiBob3Jpem9udGFsIGJvdW5jZSB0byBhcHBseSBvbiBjb2xsaXNpb24uIEEgZmxvYXQsIHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgYW1vdW50IG9mIHZlcnRpY2FsIGJvdW5jZSB0byBhcHBseSBvbiBjb2xsaXNpb24uIEEgZmxvYXQsIHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm91bmNlOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuYm91bmNlLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBib3VuY2UgdmFsdWUgZm9yIHRoaXMgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkJvdW5jZSNzZXRCb3VuY2VYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIGhvcml6b250YWwgYm91bmNlIHRvIGFwcGx5IG9uIGNvbGxpc2lvbi4gQSBmbG9hdCwgdHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRCb3VuY2VYOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmJvdW5jZS54ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZlcnRpY2FsIGJvdW5jZSB2YWx1ZSBmb3IgdGhpcyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuQm91bmNlI3NldEJvdW5jZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdmVydGljYWwgYm91bmNlIHRvIGFwcGx5IG9uIGNvbGxpc2lvbi4gQSBmbG9hdCwgdHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRCb3VuY2VZOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmJvdW5jZS55ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgd2hldGhlciB0aGlzIEJvZHkgY29sbGlkZXMgd2l0aCB0aGUgd29ybGQgYm91bmRhcnkuXHJcbiAgICAgKiBcclxuICAgICAqIE9wdGlvbmFsbHkgYWxzbyBzZXRzIHRoZSBXb3JsZCBCb3VuY2UgdmFsdWVzLiBJZiB0aGUgYEJvZHkud29ybGRCb3VuY2VgIGlzIG51bGwsIGl0J3Mgc2V0IHRvIGEgbmV3IFBoYXNlci5NYXRoLlZlY3RvcjIgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5Cb3VuY2Ujc2V0Q29sbGlkZVdvcmxkQm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIGB0cnVlYCBpZiB0aGlzIGJvZHkgc2hvdWxkIGNvbGxpZGUgd2l0aCB0aGUgd29ybGQgYm91bmRzLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYm91bmNlWF0gLSBJZiBnaXZlbiB0aGlzIHdpbGwgYmUgcmVwbGFjZSB0aGUgYHdvcmxkQm91bmNlLnhgIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtib3VuY2VZXSAtIElmIGdpdmVuIHRoaXMgd2lsbCBiZSByZXBsYWNlIHRoZSBgd29ybGRCb3VuY2UueWAgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlkZVdvcmxkQm91bmRzOiBmdW5jdGlvbiAodmFsdWUsIGJvdW5jZVgsIGJvdW5jZVkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LnNldENvbGxpZGVXb3JsZEJvdW5kcyh2YWx1ZSwgYm91bmNlWCwgYm91bmNlWSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQm91bmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGRlYnVnIHByb3BlcnRpZXMgb2YgYW4gQXJjYWRlIFBoeXNpY3MgQm9keS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5EZWJ1Z1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBEZWJ1ZyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRlYnVnIHZhbHVlcyBvZiB0aGlzIGJvZHkuXHJcbiAgICAgKiBcclxuICAgICAqIEJvZGllcyB3aWxsIG9ubHkgZHJhdyB0aGVpciBkZWJ1ZyBpZiBkZWJ1ZyBoYXMgYmVlbiBlbmFibGVkIGZvciBBcmNhZGUgUGh5c2ljcyBhcyBhIHdob2xlLlxyXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgcGVyZm9ybWFuY2UgY29zdCBpbiBkcmF3aW5nIGRlYnVnIGRpc3BsYXlzLiBJdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBwcm9kdWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRGVidWcjc2V0RGVidWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvd0JvZHkgLSBTZXQgdG8gYHRydWVgIHRvIGhhdmUgdGhpcyBib2R5IHJlbmRlciBpdHMgb3V0bGluZSB0byB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvd1ZlbG9jaXR5IC0gU2V0IHRvIGB0cnVlYCB0byBoYXZlIHRoaXMgYm9keSByZW5kZXIgYSB2ZWxvY2l0eSBtYXJrZXIgdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYm9keUNvbG9yIC0gVGhlIGNvbG9yIG9mIHRoZSBib2R5IG91dGxpbmUgd2hlbiByZW5kZXJlZCB0byB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREZWJ1ZzogZnVuY3Rpb24gKHNob3dCb2R5LCBzaG93VmVsb2NpdHksIGJvZHlDb2xvcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRlYnVnU2hvd0JvZHkgPSBzaG93Qm9keTtcclxuICAgICAgICB0aGlzLmRlYnVnU2hvd1ZlbG9jaXR5ID0gc2hvd1ZlbG9jaXR5O1xyXG4gICAgICAgIHRoaXMuZGVidWdCb2R5Q29sb3IgPSBib2R5Q29sb3I7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbG9yIG9mIHRoZSBib2R5IG91dGxpbmUgd2hlbiBpdCByZW5kZXJzIHRvIHRoZSBkZWJ1ZyBkaXNwbGF5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRGVidWcjc2V0RGVidWdCb2R5Q29sb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBjb2xvciBvZiB0aGUgYm9keSBvdXRsaW5lIHdoZW4gcmVuZGVyZWQgdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RGVidWdCb2R5Q29sb3I6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuZGVidWdCb2R5Q29sb3IgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoYXZlIHRoaXMgYm9keSByZW5kZXIgaXRzIG91dGxpbmUgdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRGVidWcjZGVidWdTaG93Qm9keVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVidWdTaG93Qm9keToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LmRlYnVnU2hvd0JvZHk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZGVidWdTaG93Qm9keSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoYXZlIHRoaXMgYm9keSByZW5kZXIgYSB2ZWxvY2l0eSBtYXJrZXIgdG8gdGhlIGRlYnVnIGRpc3BsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRGVidWcjZGVidWdTaG93VmVsb2NpdHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlYnVnU2hvd1ZlbG9jaXR5OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkuZGVidWdTaG93VmVsb2NpdHk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZGVidWdTaG93VmVsb2NpdHkgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb2xvciBvZiB0aGUgYm9keSBvdXRsaW5lIHdoZW4gaXQgcmVuZGVycyB0byB0aGUgZGVidWcgZGlzcGxheS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5EZWJ1ZyNkZWJ1Z0JvZHlDb2xvclxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZWJ1Z0JvZHlDb2xvcjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LmRlYnVnQm9keUNvbG9yO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ib2R5LmRlYnVnQm9keUNvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERlYnVnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGRyYWcgcHJvcGVydGllcyBvZiBhbiBBcmNhZGUgUGh5c2ljcyBCb2R5LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRyYWdcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgRHJhZyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGJvZHkncyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkcmFnLiBJZiB0aGUgdmVydGljYWwgZHJhZyB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZSB2ZXJ0aWNhbCBkcmFnIGlzIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgaG9yaXpvbnRhbCBkcmFnLlxyXG4gICAgICpcclxuICAgICAqIERyYWcgY2FuIGJlIGNvbnNpZGVyZWQgYXMgYSBmb3JtIG9mIGRlY2VsZXJhdGlvbiB0aGF0IHdpbGwgcmV0dXJuIHRoZSB2ZWxvY2l0eSBvZiBhIGJvZHkgYmFjayB0byB6ZXJvIG92ZXIgdGltZS5cclxuICAgICAqIEl0IGlzIHRoZSBhYnNvbHV0ZSBsb3NzIG9mIHZlbG9jaXR5IGR1ZSB0byBtb3ZlbWVudCwgaW4gcGl4ZWxzIHBlciBzZWNvbmQgc3F1YXJlZC5cclxuICAgICAqIFRoZSB4IGFuZCB5IGNvbXBvbmVudHMgYXJlIGFwcGxpZWQgc2VwYXJhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBXaGVuIGB1c2VEYW1waW5nYCBpcyB0cnVlLCB0aGlzIGlzIDEgbWludXMgdGhlIGRhbXBpbmcgZmFjdG9yLlxyXG4gICAgICogQSB2YWx1ZSBvZiAxIG1lYW5zIHRoZSBCb2R5IGxvc2VzIG5vIHZlbG9jaXR5LlxyXG4gICAgICogQSB2YWx1ZSBvZiAwLjk1IG1lYW5zIHRoZSBCb2R5IGxvc2VzIDUlIG9mIGl0cyB2ZWxvY2l0eSBwZXIgc3RlcC5cclxuICAgICAqIEEgdmFsdWUgb2YgMC41IG1lYW5zIHRoZSBCb2R5IGxvc2VzIDUwJSBvZiBpdHMgdmVsb2NpdHkgcGVyIHN0ZXAuXHJcbiAgICAgKlxyXG4gICAgICogRHJhZyBpcyBhcHBsaWVkIG9ubHkgd2hlbiBgYWNjZWxlcmF0aW9uYCBpcyB6ZXJvLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRHJhZyNzZXREcmFnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBkcmFnIHRvIGFwcGx5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBkcmFnIHRvIGFwcGx5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldERyYWc6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5kcmFnLnNldCh4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSdzIGhvcml6b250YWwgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBEcmFnIGNhbiBiZSBjb25zaWRlcmVkIGFzIGEgZm9ybSBvZiBkZWNlbGVyYXRpb24gdGhhdCB3aWxsIHJldHVybiB0aGUgdmVsb2NpdHkgb2YgYSBib2R5IGJhY2sgdG8gemVybyBvdmVyIHRpbWUuXHJcbiAgICAgKiBJdCBpcyB0aGUgYWJzb2x1dGUgbG9zcyBvZiB2ZWxvY2l0eSBkdWUgdG8gbW92ZW1lbnQsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBUaGUgeCBhbmQgeSBjb21wb25lbnRzIGFyZSBhcHBsaWVkIHNlcGFyYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBgdXNlRGFtcGluZ2AgaXMgdHJ1ZSwgdGhpcyBpcyAxIG1pbnVzIHRoZSBkYW1waW5nIGZhY3Rvci5cclxuICAgICAqIEEgdmFsdWUgb2YgMSBtZWFucyB0aGUgQm9keSBsb3NlcyBubyB2ZWxvY2l0eS5cclxuICAgICAqIEEgdmFsdWUgb2YgMC45NSBtZWFucyB0aGUgQm9keSBsb3NlcyA1JSBvZiBpdHMgdmVsb2NpdHkgcGVyIHN0ZXAuXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAuNSBtZWFucyB0aGUgQm9keSBsb3NlcyA1MCUgb2YgaXRzIHZlbG9jaXR5IHBlciBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIERyYWcgaXMgYXBwbGllZCBvbmx5IHdoZW4gYGFjY2VsZXJhdGlvbmAgaXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRyYWcjc2V0RHJhZ1hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBkcmFnIHRvIGFwcGx5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldERyYWdYOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmRyYWcueCA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib2R5J3MgdmVydGljYWwgZHJhZy5cclxuICAgICAqXHJcbiAgICAgKiBEcmFnIGNhbiBiZSBjb25zaWRlcmVkIGFzIGEgZm9ybSBvZiBkZWNlbGVyYXRpb24gdGhhdCB3aWxsIHJldHVybiB0aGUgdmVsb2NpdHkgb2YgYSBib2R5IGJhY2sgdG8gemVybyBvdmVyIHRpbWUuXHJcbiAgICAgKiBJdCBpcyB0aGUgYWJzb2x1dGUgbG9zcyBvZiB2ZWxvY2l0eSBkdWUgdG8gbW92ZW1lbnQsIGluIHBpeGVscyBwZXIgc2Vjb25kIHNxdWFyZWQuXHJcbiAgICAgKiBUaGUgeCBhbmQgeSBjb21wb25lbnRzIGFyZSBhcHBsaWVkIHNlcGFyYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBgdXNlRGFtcGluZ2AgaXMgdHJ1ZSwgdGhpcyBpcyAxIG1pbnVzIHRoZSBkYW1waW5nIGZhY3Rvci5cclxuICAgICAqIEEgdmFsdWUgb2YgMSBtZWFucyB0aGUgQm9keSBsb3NlcyBubyB2ZWxvY2l0eS5cclxuICAgICAqIEEgdmFsdWUgb2YgMC45NSBtZWFucyB0aGUgQm9keSBsb3NlcyA1JSBvZiBpdHMgdmVsb2NpdHkgcGVyIHN0ZXAuXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAuNSBtZWFucyB0aGUgQm9keSBsb3NlcyA1MCUgb2YgaXRzIHZlbG9jaXR5IHBlciBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIERyYWcgaXMgYXBwbGllZCBvbmx5IHdoZW4gYGFjY2VsZXJhdGlvbmAgaXMgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRyYWcjc2V0RHJhZ1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdmVydGljYWwgZHJhZyB0byBhcHBseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREcmFnWTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5kcmFnLnkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdGhpcyBCb2R5IGlzIHVzaW5nIGBkcmFnYCBmb3IgZGVjZWxlcmF0aW9uIHRoaXMgZnVuY3Rpb24gY29udHJvbHMgaG93IHRoZSBkcmFnIGlzIGFwcGxpZWQuXHJcbiAgICAgKiBJZiBzZXQgdG8gYHRydWVgIGRyYWcgd2lsbCB1c2UgYSBkYW1waW5nIGVmZmVjdCByYXRoZXIgdGhhbiBhIGxpbmVhciBhcHByb2FjaC4gSWYgeW91IGFyZVxyXG4gICAgICogY3JlYXRpbmcgYSBnYW1lIHdoZXJlIHRoZSBCb2R5IG1vdmVzIGZyZWVseSBhdCBhbnkgYW5nbGUgKGkuZS4gbGlrZSB0aGUgd2F5IHRoZSBzaGlwIG1vdmVzIGluXHJcbiAgICAgKiB0aGUgZ2FtZSBBc3Rlcm9pZHMpIHRoZW4geW91IHdpbGwgZ2V0IGEgZmFyIHNtb290aGVyIGFuZCBtb3JlIHZpc3VhbGx5IGNvcnJlY3QgZGVjZWxlcmF0aW9uXHJcbiAgICAgKiBieSB1c2luZyBkYW1waW5nLCBhdm9pZGluZyB0aGUgYXhpcy1kcmlmdCB0aGF0IGlzIHByb25lIHdpdGggbGluZWFyIGRlY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3UgZW5hYmxlIHRoaXMgcHJvcGVydHkgdGhlbiB5b3Ugc2hvdWxkIHVzZSBmYXIgc21hbGxlciBgZHJhZ2AgdmFsdWVzIHRoYW4gd2l0aCBsaW5lYXIsIGFzXHJcbiAgICAgKiB0aGV5IGFyZSB1c2VkIGFzIGEgbXVsdGlwbGllciBvbiB0aGUgdmVsb2NpdHkuIFZhbHVlcyBzdWNoIGFzIDAuOTUgd2lsbCBnaXZlIGEgbmljZSBzbG93XHJcbiAgICAgKiBkZWNlbGVyYXRpb24sIHdoZXJlLWFzIHNtYWxsZXIgdmFsdWVzLCBzdWNoIGFzIDAuNSB3aWxsIHN0b3AgYW4gb2JqZWN0IGFsbW9zdCBpbW1lZGlhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkRyYWcjc2V0RGFtcGluZ1xyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBgdHJ1ZWAgdG8gdXNlIGRhbXBpbmcgZm9yIGRlY2VsZXJhdGlvbiwgb3IgYGZhbHNlYCB0byB1c2UgbGluZWFyIGRlY2VsZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREYW1waW5nOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LnVzZURhbXBpbmcgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBEcmFnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIHVzZWQgZm9yIHNldHRpbmcgdGhlIGVuYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIEFyY2FkZSBQaHlzaWNzIEJvZHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRW5hYmxlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIEVuYWJsZSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgdGhpcyBHYW1lIE9iamVjdCdzIEJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5FbmFibGUjZW5hYmxlQm9keVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXNldCAtIEFsc28gcmVzZXQgdGhlIEJvZHkgYW5kIHBsYWNlIGl0IGF0ICh4LCB5KS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gdG8gcGxhY2UgdGhlIEdhbWUgT2JqZWN0IGFuZCBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiB0byBwbGFjZSB0aGUgR2FtZSBPYmplY3QgYW5kIEJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZUdhbWVPYmplY3QgLSBBbHNvIGFjdGl2YXRlIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dHYW1lT2JqZWN0IC0gQWxzbyBzaG93IHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2VuYWJsZVxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNlbmFibGVcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcmVzZXRcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlN0YXRpY0JvZHkjcmVzZXRcclxuICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlXHJcbiAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3Zpc2libGVcclxuICAgICAqL1xyXG4gICAgZW5hYmxlQm9keTogZnVuY3Rpb24gKHJlc2V0LCB4LCB5LCBlbmFibGVHYW1lT2JqZWN0LCBzaG93R2FtZU9iamVjdClcclxuICAgIHtcclxuICAgICAgICBpZiAocmVzZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkucmVzZXQoeCwgeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5hYmxlR2FtZU9iamVjdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9keS5nYW1lT2JqZWN0LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvd0dhbWVPYmplY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZ2FtZU9iamVjdC52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYm9keS5lbmFibGUgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbmQgZGlzYWJsZXMgdGhpcyBHYW1lIE9iamVjdCdzIEJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5FbmFibGUjZGlzYWJsZUJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc2FibGVHYW1lT2JqZWN0PWZhbHNlXSAtIEFsc28gZGVhY3RpdmF0ZSB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZUdhbWVPYmplY3Q9ZmFsc2VdIC0gQWxzbyBoaWRlIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2VuYWJsZVxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNlbmFibGVcclxuICAgICAqIEBzZWUgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QjYWN0aXZlXHJcbiAgICAgKiBAc2VlIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0I3Zpc2libGVcclxuICAgICAqL1xyXG4gICAgZGlzYWJsZUJvZHk6IGZ1bmN0aW9uIChkaXNhYmxlR2FtZU9iamVjdCwgaGlkZUdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRpc2FibGVHYW1lT2JqZWN0ID09PSB1bmRlZmluZWQpIHsgZGlzYWJsZUdhbWVPYmplY3QgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChoaWRlR2FtZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7IGhpZGVHYW1lT2JqZWN0ID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5ib2R5LnN0b3AoKTtcclxuXHJcbiAgICAgICAgdGhpcy5ib2R5LmVuYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZGlzYWJsZUdhbWVPYmplY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZ2FtZU9iamVjdC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoaWRlR2FtZU9iamVjdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9keS5nYW1lT2JqZWN0LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN5bmNzIHRoZSBCb2R5J3MgcG9zaXRpb24gYW5kIHNpemUgd2l0aCBpdHMgcGFyZW50IEdhbWUgT2JqZWN0LlxyXG4gICAgICogWW91IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIGZvciBEeW5hbWljIEJvZGllcywgYXMgaXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICogQnV0IGZvciBTdGF0aWMgYm9kaWVzIGl0J3MgYSB1c2VmdWwgd2F5IG9mIG1vZGlmeWluZyB0aGUgcG9zaXRpb24gb2YgYSBTdGF0aWMgQm9keVxyXG4gICAgICogaW4gdGhlIFBoeXNpY3MgV29ybGQsIGJhc2VkIG9uIGl0cyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkVuYWJsZSNyZWZyZXNoQm9keVxyXG4gICAgICogQHNpbmNlIDMuMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5I3VwZGF0ZUZyb21HYW1lT2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHJlZnJlc2hCb2R5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS51cGRhdGVGcm9tR2FtZU9iamVjdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVuYWJsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTWV0aG9kcyBmb3Igc2V0dGluZyB0aGUgZnJpY3Rpb24gb2YgYW4gQXJjYWRlIFBoeXNpY3MgQm9keS5cclxuICpcclxuICogSW4gQXJjYWRlIFBoeXNpY3MsIGZyaWN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlIG9mIG1vdGlvbiB0cmFuc2ZlciBmcm9tIGFuIFwiaW1tb3ZhYmxlXCIgYm9keSB0byBhIHJpZGluZyBib2R5LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkZyaWN0aW9uXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2ZyaWN0aW9uXHJcbiAqL1xyXG52YXIgRnJpY3Rpb24gPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmcmljdGlvbiBvZiB0aGlzIGdhbWUgb2JqZWN0J3MgcGh5c2ljcyBib2R5LlxyXG4gICAgICogSW4gQXJjYWRlIFBoeXNpY3MsIGZyaWN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlIG9mIG1vdGlvbiB0cmFuc2ZlciBmcm9tIGFuIFwiaW1tb3ZhYmxlXCIgYm9keSB0byBhIHJpZGluZyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuRnJpY3Rpb24jc2V0RnJpY3Rpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFtb3VudCBvZiBob3Jpem9udGFsIGZyaWN0aW9uIHRvIGFwcGx5LCBbMCwgMV0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgYW1vdW50IG9mIHZlcnRpY2FsIGZyaWN0aW9uIHRvIGFwcGx5LCBbMCwgMV0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2ZyaWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHNldEZyaWN0aW9uOiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuZnJpY3Rpb24uc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGZyaWN0aW9uIG9mIHRoaXMgZ2FtZSBvYmplY3QncyBwaHlzaWNzIGJvZHkuXHJcbiAgICAgKiBUaGlzIGNhbiBtb3ZlIGEgcmlkaW5nIGJvZHkgaG9yaXpvbnRhbGx5IHdoZW4gaXQgY29sbGlkZXMgd2l0aCB0aGlzIG9uZSBvbiB0aGUgdmVydGljYWwgYXhpcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkZyaWN0aW9uI3NldEZyaWN0aW9uWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYW1vdW50IG9mIGZyaWN0aW9uIHRvIGFwcGx5LCBbMCwgMV0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I2ZyaWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHNldEZyaWN0aW9uWDogZnVuY3Rpb24gKHgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmZyaWN0aW9uLnggPSB4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBmcmljdGlvbiBvZiB0aGlzIGdhbWUgb2JqZWN0J3MgcGh5c2ljcyBib2R5LlxyXG4gICAgICogVGhpcyBjYW4gbW92ZSBhIHJpZGluZyBib2R5IHZlcnRpY2FsbHkgd2hlbiBpdCBjb2xsaWRlcyB3aXRoIHRoaXMgb25lIG9uIHRoZSBob3Jpem9udGFsIGF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5GcmljdGlvbiNzZXRGcmljdGlvbllcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFtb3VudCBvZiBmcmljdGlvbiB0byBhcHBseSwgWzAsIDFdLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNmcmljdGlvblxyXG4gICAgICovXHJcbiAgICBzZXRGcmljdGlvblk6IGZ1bmN0aW9uICh5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5mcmljdGlvbi55ID0geTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGcmljdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3Igc2V0dGluZyB0aGUgZ3Jhdml0eSBwcm9wZXJ0aWVzIG9mIGFuIEFyY2FkZSBQaHlzaWNzIEdhbWUgT2JqZWN0LlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5HcmF2aXR5XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIEdyYXZpdHkgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIFggYW5kIFkgdmFsdWVzIG9mIHRoZSBncmF2aXRhdGlvbmFsIHB1bGwgdG8gYWN0IHVwb24gdGhpcyBBcmNhZGUgUGh5c2ljcyBHYW1lIE9iamVjdC4gVmFsdWVzIGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4gTGFyZ2VyIHZhbHVlcyByZXN1bHQgaW4gYSBzdHJvbmdlciBlZmZlY3QuXHJcbiAgICAgKiBcclxuICAgICAqIElmIG9ubHkgb25lIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBmb3IgYm90aCB0aGUgWCBhbmQgWSBheGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuR3Jhdml0eSNzZXRHcmF2aXR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBncmF2aXRhdGlvbmFsIGZvcmNlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFgtYXhpcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSBncmF2aXRhdGlvbmFsIGZvcmNlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFktYXhpcy4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgWCB2YWx1ZSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0R3Jhdml0eTogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmdyYXZpdHkuc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGdyYXZpdGF0aW9uYWwgZm9yY2UgdG8gYmUgYXBwbGllZCB0byB0aGUgWCBheGlzLiBWYWx1ZSBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGEgc3Ryb25nZXIgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuR3Jhdml0eSNzZXRHcmF2aXR5WFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgZ3Jhdml0YXRpb25hbCBmb3JjZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBYLWF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0R3Jhdml0eVg6IGZ1bmN0aW9uICh4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5ncmF2aXR5LnggPSB4O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGdyYXZpdGF0aW9uYWwgZm9yY2UgdG8gYmUgYXBwbGllZCB0byB0aGUgWSBheGlzLiBWYWx1ZSBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIGEgc3Ryb25nZXIgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuR3Jhdml0eSNzZXRHcmF2aXR5WVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZ3Jhdml0YXRpb25hbCBmb3JjZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBZLWF4aXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0R3Jhdml0eVk6IGZ1bmN0aW9uICh5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5ncmF2aXR5LnkgPSB5O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXZpdHk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgaW1tb3ZhYmxlIHByb3BlcnRpZXMgb2YgYW4gQXJjYWRlIFBoeXNpY3MgQm9keS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5JbW1vdmFibGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgSW1tb3ZhYmxlID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBXaGV0aGVyIHRoaXMgQm9keSBjYW4gYmUgbW92ZWQgYnkgY29sbGlzaW9ucyB3aXRoIGFub3RoZXIgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLkltbW92YWJsZSNzZXRJbW1vdmFibGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gU2V0cyBpZiB0aGlzIGJvZHkgY2FuIGJlIG1vdmVkIGJ5IGNvbGxpc2lvbnMgd2l0aCBhbm90aGVyIEJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SW1tb3ZhYmxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuYm9keS5pbW1vdmFibGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJbW1vdmFibGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIG1ldGhvZHMgdXNlZCBmb3Igc2V0dGluZyB0aGUgbWFzcyBwcm9wZXJ0aWVzIG9mIGFuIEFyY2FkZSBQaHlzaWNzIEJvZHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuTWFzc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBNYXNzID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWFzcyBvZiB0aGUgcGh5c2ljcyBib2R5XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5NYXNzI3NldE1hc3NcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE5ldyB2YWx1ZSBmb3IgdGhlIG1hc3Mgb2YgdGhlIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0TWFzczogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5tYXNzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWFzcztcclxuIiwidmFyIE92ZXJsYXBSZWN0ID0gcmVxdWlyZSgnLi9PdmVybGFwUmVjdCcpO1xyXG52YXIgQ2lyY2xlID0gcmVxdWlyZSgnLi4vLi4vLi4vZ2VvbS9jaXJjbGUvQ2lyY2xlJyk7XHJcbnZhciBDaXJjbGVUb0NpcmNsZSA9IHJlcXVpcmUoJy4uLy4uLy4uL2dlb20vaW50ZXJzZWN0cy9DaXJjbGVUb0NpcmNsZScpO1xyXG52YXIgQ2lyY2xlVG9SZWN0YW5nbGUgPSByZXF1aXJlKCcuLi8uLi8uLi9nZW9tL2ludGVyc2VjdHMvQ2lyY2xlVG9SZWN0YW5nbGUnKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHNlYXJjaCB0aGUgZ2l2ZW4gY2lyY3VsYXIgYXJlYSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBwaHlzaWNzIGJvZGllcyB0aGF0XHJcbiAqIG92ZXJsYXAgd2l0aCBpdC4gSXQgY2FuIHJldHVybiBlaXRoZXIgRHluYW1pYywgU3RhdGljIGJvZGllcyBvciBhIG1peHR1cmUgb2YgYm90aC5cclxuICpcclxuICogQSBib2R5IG9ubHkgaGFzIHRvIGludGVyc2VjdCB3aXRoIHRoZSBzZWFyY2ggYXJlYSB0byBiZSBjb25zaWRlcmVkLCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgZnVsbHlcclxuICogY29udGFpbmVkIHdpdGhpbiBpdC5cclxuICpcclxuICogSWYgQXJjYWRlIFBoeXNpY3MgaXMgc2V0IHRvIHVzZSB0aGUgUlRyZWUgKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpIHRoZW4gdGhlIHNlYXJjaCBpcyByYXRoZXIgZmFzdCxcclxuICogb3RoZXJ3aXNlIHRoZSBzZWFyY2ggaXMgTyhOKSBmb3IgRHluYW1pYyBCb2RpZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5PdmVybGFwQ2lyY1xyXG4gKiBAc2luY2UgMy4yMS4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVEeW5hbWljPXRydWVdIC0gU2hvdWxkIHRoZSBzZWFyY2ggaW5jbHVkZSBEeW5hbWljIEJvZGllcz9cclxuICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVN0YXRpYz1mYWxzZV0gLSBTaG91bGQgdGhlIHNlYXJjaCBpbmNsdWRlIFN0YXRpYyBCb2RpZXM/XHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keVtdfFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5W10pfSBBbiBhcnJheSBvZiBib2RpZXMgdGhhdCBvdmVybGFwIHdpdGggdGhlIGdpdmVuIGFyZWEuXHJcbiAqL1xyXG52YXIgT3ZlcmxhcENpcmMgPSBmdW5jdGlvbiAod29ybGQsIHgsIHksIHJhZGl1cywgaW5jbHVkZUR5bmFtaWMsIGluY2x1ZGVTdGF0aWMpXHJcbntcclxuICAgIHZhciBib2RpZXNJblJlY3QgPSBPdmVybGFwUmVjdCh3b3JsZCwgeCAtIHJhZGl1cywgeSAtIHJhZGl1cywgMiAqIHJhZGl1cywgMiAqIHJhZGl1cywgaW5jbHVkZUR5bmFtaWMsIGluY2x1ZGVTdGF0aWMpO1xyXG5cclxuICAgIGlmIChib2RpZXNJblJlY3QubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBib2RpZXNJblJlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGFyZWEgPSBuZXcgQ2lyY2xlKHgsIHksIHJhZGl1cyk7XHJcbiAgICB2YXIgY2lyY0Zyb21Cb2R5ID0gbmV3IENpcmNsZSgpO1xyXG4gICAgdmFyIGJvZGllc0luQXJlYSA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzSW5SZWN0Lmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib2R5ID0gYm9kaWVzSW5SZWN0W2ldO1xyXG5cclxuICAgICAgICBpZiAoYm9keS5pc0NpcmNsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNpcmNGcm9tQm9keS5zZXRUbyhib2R5LmNlbnRlci54LCBib2R5LmNlbnRlci55LCBib2R5LmhhbGZXaWR0aCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoQ2lyY2xlVG9DaXJjbGUoYXJlYSwgY2lyY0Zyb21Cb2R5KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYm9kaWVzSW5BcmVhLnB1c2goYm9keSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoQ2lyY2xlVG9SZWN0YW5nbGUoYXJlYSwgYm9keSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2RpZXNJbkFyZWEucHVzaChib2R5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJvZGllc0luQXJlYTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT3ZlcmxhcENpcmM7XHJcbiIsIi8qKlxyXG4gKiBUaGlzIG1ldGhvZCB3aWxsIHNlYXJjaCB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBwaHlzaWNzIGJvZGllcyB0aGF0XHJcbiAqIG92ZXJsYXAgd2l0aCBpdC4gSXQgY2FuIHJldHVybiBlaXRoZXIgRHluYW1pYywgU3RhdGljIGJvZGllcyBvciBhIG1peHR1cmUgb2YgYm90aC5cclxuICogXHJcbiAqIEEgYm9keSBvbmx5IGhhcyB0byBpbnRlcnNlY3Qgd2l0aCB0aGUgc2VhcmNoIGFyZWEgdG8gYmUgY29uc2lkZXJlZCwgaXQgZG9lc24ndCBoYXZlIHRvIGJlIGZ1bGx5XHJcbiAqIGNvbnRhaW5lZCB3aXRoaW4gaXQuXHJcbiAqIFxyXG4gKiBJZiBBcmNhZGUgUGh5c2ljcyBpcyBzZXQgdG8gdXNlIHRoZSBSVHJlZSAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdCkgdGhlbiB0aGUgc2VhcmNoIGZvciBpcyBleHRyZW1lbHkgZmFzdCxcclxuICogb3RoZXJ3aXNlIHRoZSBzZWFyY2ggaXMgTyhOKSBmb3IgRHluYW1pYyBCb2RpZXMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5PdmVybGFwUmVjdFxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHRvcC1sZWZ0IHggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBzZWFyY2ggd2l0aGluLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0b3AtbGVmdCB5IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gc2VhcmNoIHdpdGhpbi5cclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBhcmVhIHRvIHNlYXJjaCB3aXRoaW4uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVEeW5hbWljPXRydWVdIC0gU2hvdWxkIHRoZSBzZWFyY2ggaW5jbHVkZSBEeW5hbWljIEJvZGllcz9cclxuICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZVN0YXRpYz1mYWxzZV0gLSBTaG91bGQgdGhlIHNlYXJjaCBpbmNsdWRlIFN0YXRpYyBCb2RpZXM/XHJcbiAqXHJcbiAqIEByZXR1cm4geyhQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keVtdfFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5W10pfSBBbiBhcnJheSBvZiBib2RpZXMgdGhhdCBvdmVybGFwIHdpdGggdGhlIGdpdmVuIGFyZWEuXHJcbiAqL1xyXG52YXIgT3ZlcmxhcFJlY3QgPSBmdW5jdGlvbiAod29ybGQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGluY2x1ZGVEeW5hbWljLCBpbmNsdWRlU3RhdGljKVxyXG57XHJcbiAgICBpZiAoaW5jbHVkZUR5bmFtaWMgPT09IHVuZGVmaW5lZCkgeyBpbmNsdWRlRHluYW1pYyA9IHRydWU7IH1cclxuICAgIGlmIChpbmNsdWRlU3RhdGljID09PSB1bmRlZmluZWQpIHsgaW5jbHVkZVN0YXRpYyA9IGZhbHNlOyB9XHJcblxyXG4gICAgdmFyIGR5bmFtaWNCb2RpZXMgPSBbXTtcclxuICAgIHZhciBzdGF0aWNCb2RpZXMgPSBbXTtcclxuXHJcbiAgICB2YXIgbWluTWF4ID0gd29ybGQudHJlZU1pbk1heDtcclxuXHJcbiAgICBtaW5NYXgubWluWCA9IHg7XHJcbiAgICBtaW5NYXgubWluWSA9IHk7XHJcbiAgICBtaW5NYXgubWF4WCA9IHggKyB3aWR0aDtcclxuICAgIG1pbk1heC5tYXhZID0geSArIGhlaWdodDtcclxuXHJcbiAgICBpZiAoaW5jbHVkZVN0YXRpYylcclxuICAgIHtcclxuICAgICAgICBzdGF0aWNCb2RpZXMgPSB3b3JsZC5zdGF0aWNUcmVlLnNlYXJjaChtaW5NYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbmNsdWRlRHluYW1pYyAmJiB3b3JsZC51c2VUcmVlKVxyXG4gICAge1xyXG4gICAgICAgIGR5bmFtaWNCb2RpZXMgPSB3b3JsZC50cmVlLnNlYXJjaChtaW5NYXgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaW5jbHVkZUR5bmFtaWMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvZGllcyA9IHdvcmxkLmJvZGllcztcclxuXHJcbiAgICAgICAgdmFyIGZha2VCb2R5ID1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB4LFxyXG4gICAgICAgICAgICAgICAgeTogeVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgICB0b3A6IHksXHJcbiAgICAgICAgICAgIHJpZ2h0OiB4ICsgd2lkdGgsXHJcbiAgICAgICAgICAgIGJvdHRvbTogeSArIGhlaWdodCxcclxuICAgICAgICAgICAgaXNDaXJjbGU6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGludGVyc2VjdHMgPSB3b3JsZC5pbnRlcnNlY3RzO1xyXG5cclxuICAgICAgICBib2RpZXMuaXRlcmF0ZShmdW5jdGlvbiAodGFyZ2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGludGVyc2VjdHModGFyZ2V0LCBmYWtlQm9keSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGR5bmFtaWNCb2RpZXMucHVzaCh0YXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGF0aWNCb2RpZXMuY29uY2F0KGR5bmFtaWNCb2RpZXMpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBPdmVybGFwUmVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3Igc2V0dGluZyB0aGUgc2l6ZSBvZiBhbiBBcmNhZGUgUGh5c2ljcyBHYW1lIE9iamVjdC5cclxuICogU2hvdWxkIGJlIGFwcGxpZWQgYXMgYSBtaXhpbiBhbmQgbm90IHVzZWQgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuU2l6ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBTaXplID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSBvZmZzZXQuIFRoaXMgYWxsb3dzIHlvdSB0byBhZGp1c3QgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2VudGVyIG9mIHRoZSBib2R5XHJcbiAgICAgKiBhbmQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIHBhcmVudCBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLlNpemUjc2V0T2Zmc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gb2Zmc2V0IHRoZSBib2R5IGZyb20gdGhlIHBhcmVudCBHYW1lIE9iamVjdCBhbG9uZyB0aGUgeC1heGlzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIGFtb3VudCB0byBvZmZzZXQgdGhlIGJvZHkgZnJvbSB0aGUgcGFyZW50IEdhbWUgT2JqZWN0IGFsb25nIHRoZSB5LWF4aXMuIERlZmF1bHRzIHRvIHRoZSB2YWx1ZSBnaXZlbiBmb3IgdGhlIHgtYXhpcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRPZmZzZXQ6IGZ1bmN0aW9uICh4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5zZXRPZmZzZXQoeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBwaHlzaWNzIGJvZHkuIFNldHRpbmcgdGhlIHNpemUgZG9lcyBub3QgYWRqdXN0IHRoZSBkaW1lbnNpb25zXHJcbiAgICAgKiBvZiB0aGUgcGFyZW50IEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuU2l6ZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBwaHlzaWNzIGJvZHksIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcGh5c2ljcyBib2R5LCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjZW50ZXI9dHJ1ZV0gLSBTaG91bGQgdGhlIGJvZHkgYmUgcmUtcG9zaXRpb25lZCBzbyBpdHMgY2VudGVyIGFsaWducyB3aXRoIHRoZSBwYXJlbnQgR2FtZSBPYmplY3Q/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIGNlbnRlcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0LCBjZW50ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgcGh5c2ljcyBib2R5IHRvIHVzZSBhIGNpcmNsZSBmb3IgY29sbGlzaW9uIGluc3RlYWQgb2YgYSByZWN0YW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5TaXplI3NldENpcmNsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIHBoeXNpY3MgYm9keSwgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRYXSAtIFRoZSBhbW91bnQgdG8gb2Zmc2V0IHRoZSBib2R5IGZyb20gdGhlIHBhcmVudCBHYW1lIE9iamVjdCBhbG9uZyB0aGUgeC1heGlzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXRZXSAtIFRoZSBhbW91bnQgdG8gb2Zmc2V0IHRoZSBib2R5IGZyb20gdGhlIHBhcmVudCBHYW1lIE9iamVjdCBhbG9uZyB0aGUgeS1heGlzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENpcmNsZTogZnVuY3Rpb24gKHJhZGl1cywgb2Zmc2V0WCwgb2Zmc2V0WSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuc2V0Q2lyY2xlKHJhZGl1cywgb2Zmc2V0WCwgb2Zmc2V0WSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2l6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9kaWZ5aW5nIHRoZSB2ZWxvY2l0eSBvZiBhbiBBcmNhZGUgUGh5c2ljcyBib2R5LlxyXG4gKlxyXG4gKiBTaG91bGQgYmUgYXBwbGllZCBhcyBhIG1peGluIGFuZCBub3QgdXNlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBWZWxvY2l0eSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZlbG9jaXR5IG9mIHRoZSBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkNvbXBvbmVudHMuVmVsb2NpdHkjc2V0VmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgdmVsb2NpdHkgb2YgdGhlIGJvZHkuIFBvc2l0aXZlIHZhbHVlcyBtb3ZlIHRoZSBib2R5IHRvIHRoZSByaWdodCwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIG1vdmUgaXQgdG8gdGhlIGxlZnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgdmVsb2NpdHkgb2YgdGhlIGJvZHkuIFBvc2l0aXZlIHZhbHVlcyBtb3ZlIHRoZSBib2R5IGRvd24sIHdoaWxlIG5lZ2F0aXZlIHZhbHVlcyBtb3ZlIGl0IHVwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuc2V0VmVsb2NpdHkoeCwgeSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBib2R5J3MgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogUG9zaXRpdmUgdmFsdWVzIG1vdmUgdGhlIGJvZHkgdG8gdGhlIHJpZ2h0LCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgbW92ZSBpdCB0byB0aGUgbGVmdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLlZlbG9jaXR5I3NldFZlbG9jaXR5WFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgbmV3IGhvcml6b250YWwgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VmVsb2NpdHlYOiBmdW5jdGlvbiAoeClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuc2V0VmVsb2NpdHlYKHgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIGJvZHkncyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBQb3NpdGl2ZSB2YWx1ZXMgbW92ZSB0aGUgYm9keSBkb3duLCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgbW92ZSBpdCB1cC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLlZlbG9jaXR5I3NldFZlbG9jaXR5WVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgbmV3IHZlcnRpY2FsIHZlbG9jaXR5IG9mIHRoZSBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5WTogZnVuY3Rpb24gKHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LnNldFZlbG9jaXR5WSh5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWF4aW11bSB2ZWxvY2l0eSBvZiB0aGUgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzLlZlbG9jaXR5I3NldE1heFZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBuZXcgbWF4aW11bSBob3Jpem9udGFsIHZlbG9jaXR5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIG5ldyBtYXhpbXVtIHZlcnRpY2FsIHZlbG9jaXR5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldE1heFZlbG9jaXR5OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkubWF4VmVsb2NpdHkuc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZlbG9jaXR5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Db21wb25lbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQWNjZWxlcmF0aW9uOiByZXF1aXJlKCcuL0FjY2VsZXJhdGlvbicpLFxyXG4gICAgQW5ndWxhcjogcmVxdWlyZSgnLi9Bbmd1bGFyJyksXHJcbiAgICBCb3VuY2U6IHJlcXVpcmUoJy4vQm91bmNlJyksXHJcbiAgICBEZWJ1ZzogcmVxdWlyZSgnLi9EZWJ1ZycpLFxyXG4gICAgRHJhZzogcmVxdWlyZSgnLi9EcmFnJyksXHJcbiAgICBFbmFibGU6IHJlcXVpcmUoJy4vRW5hYmxlJyksXHJcbiAgICBGcmljdGlvbjogcmVxdWlyZSgnLi9GcmljdGlvbicpLFxyXG4gICAgR3Jhdml0eTogcmVxdWlyZSgnLi9HcmF2aXR5JyksXHJcbiAgICBJbW1vdmFibGU6IHJlcXVpcmUoJy4vSW1tb3ZhYmxlJyksXHJcbiAgICBNYXNzOiByZXF1aXJlKCcuL01hc3MnKSxcclxuICAgIFNpemU6IHJlcXVpcmUoJy4vU2l6ZScpLFxyXG4gICAgVmVsb2NpdHk6IHJlcXVpcmUoJy4vVmVsb2NpdHknKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQXJjYWRlIFBoeXNpY3MgY29uc3RzLlxyXG4gKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHluYW1pYyBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5EWU5BTUlDX0JPRFlcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjcGh5c2ljc1R5cGVcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdyb3VwI3BoeXNpY3NUeXBlXHJcbiAgICAgKi9cclxuICAgIERZTkFNSUNfQk9EWTogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TVEFUSUNfQk9EWVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNwaHlzaWNzVHlwZVxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keSNwaHlzaWNzVHlwZVxyXG4gICAgICovXHJcbiAgICBTVEFUSUNfQk9EWTogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyY2FkZSBQaHlzaWNzIEdyb3VwIGNvbnRhaW5pbmcgRHluYW1pYyBCb2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkdST1VQXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgR1JPVVA6IDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFRpbGVtYXAgTGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlRJTEVNQVBMQVlFUlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFRJTEVNQVBMQVlFUjogMyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhY2luZyBubyBkaXJlY3Rpb24gKGluaXRpYWwgdmFsdWUpLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GQUNJTkdfTk9ORVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNmYWNpbmdcclxuICAgICAqL1xyXG4gICAgRkFDSU5HX05PTkU6IDEwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmFjaW5nIHVwLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GQUNJTkdfVVBcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZmFjaW5nXHJcbiAgICAgKi9cclxuICAgIEZBQ0lOR19VUDogMTEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGYWNpbmcgZG93bi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRkFDSU5HX0RPV05cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZmFjaW5nXHJcbiAgICAgKi9cclxuICAgIEZBQ0lOR19ET1dOOiAxMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZhY2luZyBsZWZ0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GQUNJTkdfTEVGVFxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keSNmYWNpbmdcclxuICAgICAqL1xyXG4gICAgRkFDSU5HX0xFRlQ6IDEzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmFjaW5nIHJpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5GQUNJTkdfUklHSFRcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBzZWUgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjZmFjaW5nXHJcbiAgICAgKi9cclxuICAgIEZBQ0lOR19SSUdIVDogMTRcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQXJjYWRlIFBoeXNpY3MgV29ybGQgQ29sbGlkZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBBcmNhZGUgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSBpZiB0d28gYm9kaWVzIGNvbGxpZGUgX2FuZF8gYXQgbGVhc3RcclxuICogb25lIG9mIHRoZW0gaGFzIHRoZWlyIFtvbkNvbGxpZGVde0BsaW5rIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uQ29sbGlkZX0gcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cclxuICogXHJcbiAqIEl0IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1lYW5zIHRvIGhhbmRsaW5nIGNvbGxpZGUgZXZlbnRzIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWxsYmFjayBhcHByb2FjaC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnBoeXNpY3Mud29ybGQub24oJ2NvbGxpZGUnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogUGxlYXNlIG5vdGUgdGhhdCAnY29sbGlkZScgYW5kICdvdmVybGFwJyBhcmUgdHdvIGRpZmZlcmVudCB0aGluZ3MgaW4gQXJjYWRlIFBoeXNpY3MuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI0NPTExJREVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0MSAtIFRoZSBmaXJzdCBHYW1lIE9iamVjdCBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uLiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgYGJvZHkxYC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdDIgLSBUaGUgc2Vjb25kIEdhbWUgT2JqZWN0IGludm9sdmVkIGluIHRoZSBjb2xsaXNpb24uIFRoaXMgaXMgdGhlIHBhcmVudCBvZiBgYm9keTJgLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBib2R5MSAtIFRoZSBmaXJzdCBQaHlzaWNzIEJvZHkgaW52b2x2ZWQgaW4gdGhlIGNvbGxpc2lvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keX0gYm9keTIgLSBUaGUgc2Vjb25kIFBoeXNpY3MgQm9keSBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnY29sbGlkZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBBcmNhZGUgUGh5c2ljcyBXb3JsZCBPdmVybGFwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIEFyY2FkZSBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGlmIHR3byBib2RpZXMgb3ZlcmxhcCBfYW5kXyBhdCBsZWFzdFxyXG4gKiBvbmUgb2YgdGhlbSBoYXMgdGhlaXIgW29uT3ZlcmxhcF17QGxpbmsgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHkjb25PdmVybGFwfSBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgLlxyXG4gKiBcclxuICogSXQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgbWVhbnMgdG8gaGFuZGxpbmcgb3ZlcmxhcCBldmVudHMgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhbGxiYWNrIGFwcHJvYWNoLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMucGh5c2ljcy53b3JsZC5vbignb3ZlcmxhcCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBQbGVhc2Ugbm90ZSB0aGF0ICdjb2xsaWRlJyBhbmQgJ292ZXJsYXAnIGFyZSB0d28gZGlmZmVyZW50IHRoaW5ncyBpbiBBcmNhZGUgUGh5c2ljcy5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjT1ZFUkxBUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QxIC0gVGhlIGZpcnN0IEdhbWUgT2JqZWN0IGludm9sdmVkIGluIHRoZSBvdmVybGFwLiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgYGJvZHkxYC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdDIgLSBUaGUgc2Vjb25kIEdhbWUgT2JqZWN0IGludm9sdmVkIGluIHRoZSBvdmVybGFwLiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgYGJvZHkyYC5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keXxQaGFzZXIuUGh5c2ljcy5BcmNhZGUuU3RhdGljQm9keX0gYm9keTEgLSBUaGUgZmlyc3QgUGh5c2ljcyBCb2R5IGludm9sdmVkIGluIHRoZSBvdmVybGFwLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fFBoYXNlci5QaHlzaWNzLkFyY2FkZS5TdGF0aWNCb2R5fSBib2R5MiAtIFRoZSBzZWNvbmQgUGh5c2ljcyBCb2R5IGludm9sdmVkIGluIHRoZSBvdmVybGFwLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnb3ZlcmxhcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBBcmNhZGUgUGh5c2ljcyBXb3JsZCBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBBcmNhZGUgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSB3aGVuIGl0IGlzIHBhdXNlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnBoeXNpY3Mud29ybGQub24oJ3BhdXNlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLkFyY2FkZS5FdmVudHMjUEFVU0VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwYXVzZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBBcmNhZGUgUGh5c2ljcyBXb3JsZCBSZXN1bWUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYW4gQXJjYWRlIFBoeXNpY3MgV29ybGQgaW5zdGFuY2Ugd2hlbiBpdCByZXN1bWVzIGZyb20gYSBwYXVzZWQgc3RhdGUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5waHlzaWNzLndvcmxkLm9uKCdyZXN1bWUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNSRVNVTUVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdyZXN1bWUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQXJjYWRlIFBoeXNpY3MgVGlsZSBDb2xsaWRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIEFyY2FkZSBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGlmIGEgYm9keSBjb2xsaWRlcyB3aXRoIGEgVGlsZSBfYW5kX1xyXG4gKiBoYXMgaXRzIFtvbkNvbGxpZGVde0BsaW5rIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uQ29sbGlkZX0gcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cclxuICogXHJcbiAqIEl0IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1lYW5zIHRvIGhhbmRsaW5nIGNvbGxpZGUgZXZlbnRzIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWxsYmFjayBhcHByb2FjaC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnBoeXNpY3Mud29ybGQub24oJ3RpbGVjb2xsaWRlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFBsZWFzZSBub3RlIHRoYXQgJ2NvbGxpZGUnIGFuZCAnb3ZlcmxhcCcgYXJlIHR3byBkaWZmZXJlbnQgdGhpbmdzIGluIEFyY2FkZSBQaHlzaWNzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNUSUxFX0NPTExJREVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uLiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgYGJvZHlgLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSB0aWxlIC0gVGhlIHRpbGUgdGhlIGJvZHkgY29sbGlkZWQgd2l0aC5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQm9keX0gYm9keSAtIFRoZSBBcmNhZGUgUGh5c2ljcyBCb2R5IG9mIHRoZSBHYW1lIE9iamVjdCBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndGlsZWNvbGxpZGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQXJjYWRlIFBoeXNpY3MgVGlsZSBPdmVybGFwIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGFuIEFyY2FkZSBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGlmIGEgYm9keSBvdmVybGFwcyB3aXRoIGEgVGlsZSBfYW5kX1xyXG4gKiBoYXMgaXRzIFtvbk92ZXJsYXBde0BsaW5rIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uT3ZlcmxhcH0gcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cclxuICogXHJcbiAqIEl0IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1lYW5zIHRvIGhhbmRsaW5nIG92ZXJsYXAgZXZlbnRzIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWxsYmFjayBhcHByb2FjaC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnBoeXNpY3Mud29ybGQub24oJ3RpbGVvdmVybGFwJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFBsZWFzZSBub3RlIHRoYXQgJ2NvbGxpZGUnIGFuZCAnb3ZlcmxhcCcgYXJlIHR3byBkaWZmZXJlbnQgdGhpbmdzIGluIEFyY2FkZSBQaHlzaWNzLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuQXJjYWRlLkV2ZW50cyNUSUxFX09WRVJMQVBcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCBpbnZvbHZlZCBpbiB0aGUgb3ZlcmxhcC4gVGhpcyBpcyB0aGUgcGFyZW50IG9mIGBib2R5YC5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gdGlsZSAtIFRoZSB0aWxlIHRoZSBib2R5IG92ZXJsYXBwZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQXJjYWRlIFBoeXNpY3MgQm9keSBvZiB0aGUgR2FtZSBPYmplY3QgaW52b2x2ZWQgaW4gdGhlIG92ZXJsYXAuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd0aWxlb3ZlcmxhcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBBcmNhZGUgUGh5c2ljcyBXb3JsZCBCb3VuZHMgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYW4gQXJjYWRlIFBoeXNpY3MgV29ybGQgaW5zdGFuY2UgaWYgYSBib2R5IG1ha2VzIGNvbnRhY3Qgd2l0aCB0aGUgd29ybGQgYm91bmRzIF9hbmRfXHJcbiAqIGl0IGhhcyBpdHMgW29uV29ybGRCb3VuZHNde0BsaW5rIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5I29uV29ybGRCb3VuZHN9IHByb3BlcnR5IHNldCB0byBgdHJ1ZWAuXHJcbiAqIFxyXG4gKiBJdCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBtZWFucyB0byBoYW5kbGluZyBjb2xsaWRlIGV2ZW50cyByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FsbGJhY2sgYXBwcm9hY2guXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5waHlzaWNzLndvcmxkLm9uKCd3b3JsZGJvdW5kcycsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1dPUkxEX0JPVU5EU1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQXJjYWRlIFBoeXNpY3MgQm9keSB0aGF0IGhpdCB0aGUgd29ybGQgYm91bmRzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVwIC0gSXMgdGhlIEJvZHkgYmxvY2tlZCB1cD8gSS5lLiBjb2xsaWRlZCB3aXRoIHRoZSB0b3Agb2YgdGhlIHdvcmxkIGJvdW5kcy5cclxuICogQHBhcmFtIHtib29sZWFufSBkb3duIC0gSXMgdGhlIEJvZHkgYmxvY2tlZCBkb3duPyBJLmUuIGNvbGxpZGVkIHdpdGggdGhlIGJvdHRvbSBvZiB0aGUgd29ybGQgYm91bmRzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxlZnQgLSBJcyB0aGUgQm9keSBibG9ja2VkIGxlZnQ/IEkuZS4gY29sbGlkZWQgd2l0aCB0aGUgbGVmdCBvZiB0aGUgd29ybGQgYm91bmRzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJpZ2h0IC0gSXMgdGhlIEJvZHkgYmxvY2tlZCByaWdodD8gSS5lLiBjb2xsaWRlZCB3aXRoIHRoZSByaWdodCBvZiB0aGUgd29ybGQgYm91bmRzLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnd29ybGRib3VuZHMnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgQXJjYWRlIFBoeXNpY3MgV29ybGQgU3RlcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBBcmNhZGUgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSB3aGVuZXZlciBhIHBoeXNpY3Mgc3RlcCBpcyBydW4uXHJcbiAqIEl0IGlzIGVtaXR0ZWQgX2FmdGVyXyB0aGUgYm9kaWVzIGFuZCBjb2xsaWRlcnMgaGF2ZSBiZWVuIHVwZGF0ZWQuXHJcbiAqIFxyXG4gKiBJbiBoaWdoIGZyYW1lcmF0ZSBzZXR0aW5ncyB0aGlzIGNhbiBiZSBtdWx0aXBsZSB0aW1lcyBwZXIgZ2FtZSBmcmFtZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnBoeXNpY3Mud29ybGQub24oJ3dvcmxkc3RlcCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzI1dPUkxEX1NURVBcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnd29ybGRzdGVwJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuRXZlbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ09MTElERTogcmVxdWlyZSgnLi9DT0xMSURFX0VWRU5UJyksXHJcbiAgICBPVkVSTEFQOiByZXF1aXJlKCcuL09WRVJMQVBfRVZFTlQnKSxcclxuICAgIFBBVVNFOiByZXF1aXJlKCcuL1BBVVNFX0VWRU5UJyksXHJcbiAgICBSRVNVTUU6IHJlcXVpcmUoJy4vUkVTVU1FX0VWRU5UJyksXHJcbiAgICBUSUxFX0NPTExJREU6IHJlcXVpcmUoJy4vVElMRV9DT0xMSURFX0VWRU5UJyksXHJcbiAgICBUSUxFX09WRVJMQVA6IHJlcXVpcmUoJy4vVElMRV9PVkVSTEFQX0VWRU5UJyksXHJcbiAgICBXT1JMRF9CT1VORFM6IHJlcXVpcmUoJy4vV09STERfQk9VTkRTX0VWRU5UJyksXHJcbiAgICBXT1JMRF9TVEVQOiByZXF1aXJlKCcuL1dPUkxEX1NURVBfRVZFTlQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBFeHRlbmQgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvRXh0ZW5kJyk7XHJcblxyXG4vKipcclxuICogQGNhbGxiYWNrIEFyY2FkZVBoeXNpY3NDYWxsYmFja1xyXG4gKlxyXG4gKiBBIGNhbGxiYWNrIHJlY2VpdmluZyB0d28gR2FtZSBPYmplY3RzLlxyXG4gKlxyXG4gKiBXaGVuIGNvbGxpZGluZyBhIHNpbmdsZSBzcHJpdGUgd2l0aCBhIEdyb3VwIG9yIFRpbGVtYXBMYXllciwgYG9iamVjdDFgIGlzIGFsd2F5cyB0aGUgc3ByaXRlLlxyXG4gKlxyXG4gKiBGb3IgYWxsIG90aGVyIGNhc2VzLCBgb2JqZWN0MWAgYW5kIGBvYmplY3QyYCBtYXRjaCB0aGUgc2FtZSBhcmd1bWVudHMgaW4gYGNvbGxpZGUoKWAgb3IgYG92ZXJsYXAoKWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG9iamVjdDEgLSBUaGUgZmlyc3QgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG9iamVjdDIgLSBUaGUgc2Vjb25kIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLkFyY2FkZVxyXG4gKi9cclxuXHJcbnZhciBBcmNhZGUgPSB7XHJcblxyXG4gICAgQXJjYWRlUGh5c2ljczogcmVxdWlyZSgnLi9BcmNhZGVQaHlzaWNzJyksXHJcbiAgICBCb2R5OiByZXF1aXJlKCcuL0JvZHknKSxcclxuICAgIENvbGxpZGVyOiByZXF1aXJlKCcuL0NvbGxpZGVyJyksXHJcbiAgICBDb21wb25lbnRzOiByZXF1aXJlKCcuL2NvbXBvbmVudHMnKSxcclxuICAgIEV2ZW50czogcmVxdWlyZSgnLi9ldmVudHMnKSxcclxuICAgIEZhY3Rvcnk6IHJlcXVpcmUoJy4vRmFjdG9yeScpLFxyXG4gICAgR3JvdXA6IHJlcXVpcmUoJy4vUGh5c2ljc0dyb3VwJyksXHJcbiAgICBJbWFnZTogcmVxdWlyZSgnLi9BcmNhZGVJbWFnZScpLFxyXG4gICAgU3ByaXRlOiByZXF1aXJlKCcuL0FyY2FkZVNwcml0ZScpLFxyXG4gICAgU3RhdGljQm9keTogcmVxdWlyZSgnLi9TdGF0aWNCb2R5JyksXHJcbiAgICBTdGF0aWNHcm91cDogcmVxdWlyZSgnLi9TdGF0aWNQaHlzaWNzR3JvdXAnKSxcclxuICAgIFdvcmxkOiByZXF1aXJlKCcuL1dvcmxkJylcclxuXHJcbn07XHJcblxyXG4vLyAgIE1lcmdlIGluIHRoZSBjb25zdHNcclxuQXJjYWRlID0gRXh0ZW5kKGZhbHNlLCBBcmNhZGUsIENPTlNUKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQXJjYWRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIGNvbGxpc2lvbiBjYWxsYmFja3MgYmV0d2VlbiBhIHNpbmdsZSB0aWxlIGFuZCBhbiBBcmNhZGUgUGh5c2ljcyBlbmFibGVkIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlBoeXNpY3MuQXJjYWRlLlRpbGVtYXAuUHJvY2Vzc1RpbGVDYWxsYmFja3NcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IHRpbGUgLSBUaGUgVGlsZSB0byBwcm9jZXNzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGV9IHNwcml0ZSAtIFRoZSBHYW1lIE9iamVjdCB0byBwcm9jZXNzIHdpdGggdGhlIFRpbGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRoZSByZXN1bHQgb2YgdGhlIGNhbGxiYWNrLCBgdHJ1ZWAgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZywgb3IgYGZhbHNlYCB0byBza2lwIHRoaXMgcGFpci5cclxuICovXHJcbnZhciBQcm9jZXNzVGlsZUNhbGxiYWNrcyA9IGZ1bmN0aW9uICh0aWxlLCBzcHJpdGUpXHJcbntcclxuICAgIC8vICBUaWxlIGNhbGxiYWNrcyB0YWtlIHByaW9yaXR5IG92ZXIgbGF5ZXIgbGV2ZWwgY2FsbGJhY2tzXHJcbiAgICBpZiAodGlsZS5jb2xsaXNpb25DYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gIXRpbGUuY29sbGlzaW9uQ2FsbGJhY2suY2FsbCh0aWxlLmNvbGxpc2lvbkNhbGxiYWNrQ29udGV4dCwgc3ByaXRlLCB0aWxlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRpbGUubGF5ZXIuY2FsbGJhY2tzW3RpbGUuaW5kZXhdKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAhdGlsZS5sYXllci5jYWxsYmFja3NbdGlsZS5pbmRleF0uY2FsbGJhY2suY2FsbChcclxuICAgICAgICAgICAgdGlsZS5sYXllci5jYWxsYmFja3NbdGlsZS5pbmRleF0uY2FsbGJhY2tDb250ZXh0LCBzcHJpdGUsIHRpbGVcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzVGlsZUNhbGxiYWNrcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgc2VwYXJhdGlvbiBvZiBhIHBoeXNpY3MgYm9keSBmcm9tIGEgdGlsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5UaWxlbWFwLlByb2Nlc3NUaWxlU2VwYXJhdGlvblhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQm9keSBvYmplY3QgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggc2VwYXJhdGlvbiBhbW91bnQuXHJcbiAqL1xyXG52YXIgUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWCA9IGZ1bmN0aW9uIChib2R5LCB4KVxyXG57XHJcbiAgICBpZiAoeCA8IDApXHJcbiAgICB7XHJcbiAgICAgICAgYm9keS5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICBib2R5LmJsb2NrZWQubGVmdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh4ID4gMClcclxuICAgIHtcclxuICAgICAgICBib2R5LmJsb2NrZWQubm9uZSA9IGZhbHNlO1xyXG4gICAgICAgIGJvZHkuYmxvY2tlZC5yaWdodCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYm9keS5wb3NpdGlvbi54IC09IHg7XHJcblxyXG4gICAgaWYgKGJvZHkuYm91bmNlLnggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgYm9keS52ZWxvY2l0eS54ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBib2R5LnZlbG9jaXR5LnggPSAtYm9keS52ZWxvY2l0eS54ICogYm9keS5ib3VuY2UueDtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgc2VwYXJhdGlvbiBvZiBhIHBoeXNpY3MgYm9keSBmcm9tIGEgdGlsZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5UaWxlbWFwLlByb2Nlc3NUaWxlU2VwYXJhdGlvbllcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQm9keSBvYmplY3QgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgc2VwYXJhdGlvbiBhbW91bnQuXHJcbiAqL1xyXG52YXIgUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWSA9IGZ1bmN0aW9uIChib2R5LCB5KVxyXG57XHJcbiAgICBpZiAoeSA8IDApXHJcbiAgICB7XHJcbiAgICAgICAgYm9keS5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICBib2R5LmJsb2NrZWQudXAgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoeSA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgYm9keS5ibG9ja2VkLm5vbmUgPSBmYWxzZTtcclxuICAgICAgICBib2R5LmJsb2NrZWQuZG93biA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYm9keS5wb3NpdGlvbi55IC09IHk7XHJcblxyXG4gICAgaWYgKGJvZHkuYm91bmNlLnkgPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgYm9keS52ZWxvY2l0eS55ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBib2R5LnZlbG9jaXR5LnkgPSAtYm9keS52ZWxvY2l0eS55ICogYm9keS5ib3VuY2UueTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVGlsZUNoZWNrWCA9IHJlcXVpcmUoJy4vVGlsZUNoZWNrWCcpO1xyXG52YXIgVGlsZUNoZWNrWSA9IHJlcXVpcmUoJy4vVGlsZUNoZWNrWScpO1xyXG52YXIgVGlsZUludGVyc2VjdHNCb2R5ID0gcmVxdWlyZSgnLi9UaWxlSW50ZXJzZWN0c0JvZHknKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29yZSBzZXBhcmF0aW9uIGZ1bmN0aW9uIHRvIHNlcGFyYXRlIGEgcGh5c2ljcyBib2R5IGFuZCBhIHRpbGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuVGlsZW1hcC5TZXBhcmF0ZVRpbGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpIC0gVGhlIGluZGV4IG9mIHRoZSB0aWxlIHdpdGhpbiB0aGUgbWFwIGRhdGEuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgQm9keSBvYmplY3QgdG8gc2VwYXJhdGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IHRpbGUgLSBUaGUgdGlsZSB0byBjb2xsaWRlIGFnYWluc3QuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSB0aWxlV29ybGRSZWN0IC0gQSByZWN0YW5nbGUtbGlrZSBvYmplY3QgZGVmaW5pbmcgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRpbGUuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSB0aWxlbWFwTGF5ZXIgLSBUaGUgdGlsZW1hcExheWVyIHRvIGNvbGxpZGUgYWdhaW5zdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbGVCaWFzIC0gVGhlIHRpbGUgYmlhcyB2YWx1ZS4gUG9wdWxhdGVkIGJ5IHRoZSBgV29ybGQuVElMRV9CSUFTYCBjb25zdGFudC5cclxuICogQHBhcmFtIHtib29sZWFufSBpc0xheWVyIC0gSXMgdGhpcyBjaGVjayBjb21pbmcgZnJvbSBhIFRpbGVtYXBMYXllciBvciBhbiBhcnJheSBvZiB0aWxlcz9cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBib2R5IHdhcyBzZXBhcmF0ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFNlcGFyYXRlVGlsZSA9IGZ1bmN0aW9uIChpLCBib2R5LCB0aWxlLCB0aWxlV29ybGRSZWN0LCB0aWxlbWFwTGF5ZXIsIHRpbGVCaWFzLCBpc0xheWVyKVxyXG57XHJcbiAgICB2YXIgdGlsZUxlZnQgPSB0aWxlV29ybGRSZWN0LmxlZnQ7XHJcbiAgICB2YXIgdGlsZVRvcCA9IHRpbGVXb3JsZFJlY3QudG9wO1xyXG4gICAgdmFyIHRpbGVSaWdodCA9IHRpbGVXb3JsZFJlY3QucmlnaHQ7XHJcbiAgICB2YXIgdGlsZUJvdHRvbSA9IHRpbGVXb3JsZFJlY3QuYm90dG9tO1xyXG4gICAgdmFyIGZhY2VIb3Jpem9udGFsID0gdGlsZS5mYWNlTGVmdCB8fCB0aWxlLmZhY2VSaWdodDtcclxuICAgIHZhciBmYWNlVmVydGljYWwgPSB0aWxlLmZhY2VUb3AgfHwgdGlsZS5mYWNlQm90dG9tO1xyXG5cclxuICAgIGlmICghaXNMYXllcilcclxuICAgIHtcclxuICAgICAgICBmYWNlSG9yaXpvbnRhbCA9IHRydWU7XHJcbiAgICAgICAgZmFjZVZlcnRpY2FsID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgV2UgZG9uJ3QgbmVlZCB0byBnbyBhbnkgZnVydGhlciBpZiB0aGlzIHRpbGUgZG9lc24ndCBhY3R1YWxseSBoYXZlIGFueSBjb2xsaWRpbmcgZmFjZXMuIFRoaXNcclxuICAgIC8vICBjb3VsZCBoYXBwZW4gaWYgdGhlIHRpbGUgd2FzIG1lYW50IHRvIGJlIGNvbGxpZGVkIHdpdGggcmU6IGEgY2FsbGJhY2ssIGJ1dCBvdGhlcndpc2UgaXNuJ3RcclxuICAgIC8vICBuZWVkZWQgZm9yIHNlcGFyYXRpb24uXHJcbiAgICBpZiAoIWZhY2VIb3Jpem9udGFsICYmICFmYWNlVmVydGljYWwpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBveCA9IDA7XHJcbiAgICB2YXIgb3kgPSAwO1xyXG4gICAgdmFyIG1pblggPSAwO1xyXG4gICAgdmFyIG1pblkgPSAxO1xyXG5cclxuICAgIGlmIChib2R5LmRlbHRhQWJzWCgpID4gYm9keS5kZWx0YUFic1koKSlcclxuICAgIHtcclxuICAgICAgICAvLyAgTW92aW5nIGZhc3RlciBob3Jpem9udGFsbHksIGNoZWNrIFggYXhpcyBmaXJzdFxyXG4gICAgICAgIG1pblggPSAtMTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGJvZHkuZGVsdGFBYnNYKCkgPCBib2R5LmRlbHRhQWJzWSgpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNb3ZpbmcgZmFzdGVyIHZlcnRpY2FsbHksIGNoZWNrIFkgYXhpcyBmaXJzdFxyXG4gICAgICAgIG1pblkgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYm9keS5kZWx0YVgoKSAhPT0gMCAmJiBib2R5LmRlbHRhWSgpICE9PSAwICYmIGZhY2VIb3Jpem9udGFsICYmIGZhY2VWZXJ0aWNhbClcclxuICAgIHtcclxuICAgICAgICAvLyAgV2Ugb25seSBuZWVkIGRvIHRoaXMgaWYgYm90aCBheGVzIGhhdmUgY29sbGlkaW5nIGZhY2VzIEFORCB3ZSdyZSBtb3ZpbmcgaW4gYm90aFxyXG4gICAgICAgIC8vICBkaXJlY3Rpb25zXHJcbiAgICAgICAgbWluWCA9IE1hdGgubWluKE1hdGguYWJzKGJvZHkucG9zaXRpb24ueCAtIHRpbGVSaWdodCksIE1hdGguYWJzKGJvZHkucmlnaHQgLSB0aWxlTGVmdCkpO1xyXG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihNYXRoLmFicyhib2R5LnBvc2l0aW9uLnkgLSB0aWxlQm90dG9tKSwgTWF0aC5hYnMoYm9keS5ib3R0b20gLSB0aWxlVG9wKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1pblggPCBtaW5ZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmYWNlSG9yaXpvbnRhbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG94ID0gVGlsZUNoZWNrWChib2R5LCB0aWxlLCB0aWxlTGVmdCwgdGlsZVJpZ2h0LCB0aWxlQmlhcywgaXNMYXllcik7XHJcblxyXG4gICAgICAgICAgICAvLyAgVGhhdCdzIGhvcml6b250YWwgZG9uZSwgY2hlY2sgaWYgd2Ugc3RpbGwgaW50ZXJzZWN0cz8gSWYgbm90IHRoZW4gd2UgY2FuIHJldHVybiBub3dcclxuICAgICAgICAgICAgaWYgKG94ICE9PSAwICYmICFUaWxlSW50ZXJzZWN0c0JvZHkodGlsZVdvcmxkUmVjdCwgYm9keSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmFjZVZlcnRpY2FsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3kgPSBUaWxlQ2hlY2tZKGJvZHksIHRpbGUsIHRpbGVUb3AsIHRpbGVCb3R0b20sIHRpbGVCaWFzLCBpc0xheWVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZhY2VWZXJ0aWNhbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG95ID0gVGlsZUNoZWNrWShib2R5LCB0aWxlLCB0aWxlVG9wLCB0aWxlQm90dG9tLCB0aWxlQmlhcywgaXNMYXllcik7XHJcblxyXG4gICAgICAgICAgICAvLyAgVGhhdCdzIHZlcnRpY2FsIGRvbmUsIGNoZWNrIGlmIHdlIHN0aWxsIGludGVyc2VjdHM/IElmIG5vdCB0aGVuIHdlIGNhbiByZXR1cm4gbm93XHJcbiAgICAgICAgICAgIGlmIChveSAhPT0gMCAmJiAhVGlsZUludGVyc2VjdHNCb2R5KHRpbGVXb3JsZFJlY3QsIGJvZHkpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZhY2VIb3Jpem9udGFsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3ggPSBUaWxlQ2hlY2tYKGJvZHksIHRpbGUsIHRpbGVMZWZ0LCB0aWxlUmlnaHQsIHRpbGVCaWFzLCBpc0xheWVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChveCAhPT0gMCB8fCBveSAhPT0gMCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNlcGFyYXRlVGlsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWCA9IHJlcXVpcmUoJy4vUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWCcpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIHRoZSBib2R5IGFnYWluc3QgdGhlIGdpdmVuIHRpbGUgb24gdGhlIFggYXhpcy5cclxuICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBTZXBhcmF0ZVRpbGUgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuVGlsZW1hcC5UaWxlQ2hlY2tYXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5IC0gVGhlIEJvZHkgb2JqZWN0IHRvIHNlcGFyYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSB0aWxlIC0gVGhlIHRpbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aWxlTGVmdCAtIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSB0aWxlIHdpdGhpbiB0aGUgdGlsZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbGVSaWdodCAtIFRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgdGlsZSB3aXRoaW4gdGhlIHRpbGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aWxlQmlhcyAtIFRoZSB0aWxlIGJpYXMgdmFsdWUuIFBvcHVsYXRlZCBieSB0aGUgYFdvcmxkLlRJTEVfQklBU2AgY29uc3RhbnQuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMYXllciAtIElzIHRoaXMgY2hlY2sgY29taW5nIGZyb20gYSBUaWxlbWFwTGF5ZXIgb3IgYW4gYXJyYXkgb2YgdGlsZXM/XHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFtb3VudCBvZiBzZXBhcmF0aW9uIHRoYXQgb2NjdXJyZWQuXHJcbiAqL1xyXG52YXIgVGlsZUNoZWNrWCA9IGZ1bmN0aW9uIChib2R5LCB0aWxlLCB0aWxlTGVmdCwgdGlsZVJpZ2h0LCB0aWxlQmlhcywgaXNMYXllcilcclxue1xyXG4gICAgdmFyIG94ID0gMDtcclxuXHJcbiAgICB2YXIgZmFjZUxlZnQgPSB0aWxlLmZhY2VMZWZ0O1xyXG4gICAgdmFyIGZhY2VSaWdodCA9IHRpbGUuZmFjZVJpZ2h0O1xyXG4gICAgdmFyIGNvbGxpZGVMZWZ0ID0gdGlsZS5jb2xsaWRlTGVmdDtcclxuICAgIHZhciBjb2xsaWRlUmlnaHQgPSB0aWxlLmNvbGxpZGVSaWdodDtcclxuXHJcbiAgICBpZiAoIWlzTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgZmFjZUxlZnQgPSB0cnVlO1xyXG4gICAgICAgIGZhY2VSaWdodCA9IHRydWU7XHJcbiAgICAgICAgY29sbGlkZUxlZnQgPSB0cnVlO1xyXG4gICAgICAgIGNvbGxpZGVSaWdodCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJvZHkuZGVsdGFYKCkgPCAwICYmIGNvbGxpZGVSaWdodCAmJiBib2R5LmNoZWNrQ29sbGlzaW9uLmxlZnQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEJvZHkgaXMgbW92aW5nIExFRlRcclxuICAgICAgICBpZiAoZmFjZVJpZ2h0ICYmIGJvZHkueCA8IHRpbGVSaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG94ID0gYm9keS54IC0gdGlsZVJpZ2h0O1xyXG5cclxuICAgICAgICAgICAgaWYgKG94IDwgLXRpbGVCaWFzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBveCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChib2R5LmRlbHRhWCgpID4gMCAmJiBjb2xsaWRlTGVmdCAmJiBib2R5LmNoZWNrQ29sbGlzaW9uLnJpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBCb2R5IGlzIG1vdmluZyBSSUdIVFxyXG4gICAgICAgIGlmIChmYWNlTGVmdCAmJiBib2R5LnJpZ2h0ID4gdGlsZUxlZnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBveCA9IGJvZHkucmlnaHQgLSB0aWxlTGVmdDtcclxuXHJcbiAgICAgICAgICAgIGlmIChveCA+IHRpbGVCaWFzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBveCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG94ICE9PSAwKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChib2R5LmN1c3RvbVNlcGFyYXRlWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkub3ZlcmxhcFggPSBveDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWChib2R5LCBveCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBveDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZUNoZWNrWDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWSA9IHJlcXVpcmUoJy4vUHJvY2Vzc1RpbGVTZXBhcmF0aW9uWScpO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIHRoZSBib2R5IGFnYWluc3QgdGhlIGdpdmVuIHRpbGUgb24gdGhlIFkgYXhpcy5cclxuICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBTZXBhcmF0ZVRpbGUgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5BcmNhZGUuVGlsZW1hcC5UaWxlQ2hlY2tZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLkFyY2FkZS5Cb2R5fSBib2R5IC0gVGhlIEJvZHkgb2JqZWN0IHRvIHNlcGFyYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSB0aWxlIC0gVGhlIHRpbGUgdG8gY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aWxlVG9wIC0gVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgdGlsZSB3aXRoaW4gdGhlIHRpbGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aWxlQm90dG9tIC0gVGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgdGlsZSB3aXRoaW4gdGhlIHRpbGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aWxlQmlhcyAtIFRoZSB0aWxlIGJpYXMgdmFsdWUuIFBvcHVsYXRlZCBieSB0aGUgYFdvcmxkLlRJTEVfQklBU2AgY29uc3RhbnQuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNMYXllciAtIElzIHRoaXMgY2hlY2sgY29taW5nIGZyb20gYSBUaWxlbWFwTGF5ZXIgb3IgYW4gYXJyYXkgb2YgdGlsZXM/XHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFtb3VudCBvZiBzZXBhcmF0aW9uIHRoYXQgb2NjdXJyZWQuXHJcbiAqL1xyXG52YXIgVGlsZUNoZWNrWSA9IGZ1bmN0aW9uIChib2R5LCB0aWxlLCB0aWxlVG9wLCB0aWxlQm90dG9tLCB0aWxlQmlhcywgaXNMYXllcilcclxue1xyXG4gICAgdmFyIG95ID0gMDtcclxuXHJcbiAgICB2YXIgZmFjZVRvcCA9IHRpbGUuZmFjZVRvcDtcclxuICAgIHZhciBmYWNlQm90dG9tID0gdGlsZS5mYWNlQm90dG9tO1xyXG4gICAgdmFyIGNvbGxpZGVVcCA9IHRpbGUuY29sbGlkZVVwO1xyXG4gICAgdmFyIGNvbGxpZGVEb3duID0gdGlsZS5jb2xsaWRlRG93bjtcclxuXHJcbiAgICBpZiAoIWlzTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgZmFjZVRvcCA9IHRydWU7XHJcbiAgICAgICAgZmFjZUJvdHRvbSA9IHRydWU7XHJcbiAgICAgICAgY29sbGlkZVVwID0gdHJ1ZTtcclxuICAgICAgICBjb2xsaWRlRG93biA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJvZHkuZGVsdGFZKCkgPCAwICYmIGNvbGxpZGVEb3duICYmIGJvZHkuY2hlY2tDb2xsaXNpb24udXApXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEJvZHkgaXMgbW92aW5nIFVQXHJcbiAgICAgICAgaWYgKGZhY2VCb3R0b20gJiYgYm9keS55IDwgdGlsZUJvdHRvbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG95ID0gYm9keS55IC0gdGlsZUJvdHRvbTtcclxuXHJcbiAgICAgICAgICAgIGlmIChveSA8IC10aWxlQmlhcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3kgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYm9keS5kZWx0YVkoKSA+IDAgJiYgY29sbGlkZVVwICYmIGJvZHkuY2hlY2tDb2xsaXNpb24uZG93bilcclxuICAgIHtcclxuICAgICAgICAvLyAgQm9keSBpcyBtb3ZpbmcgRE9XTlxyXG4gICAgICAgIGlmIChmYWNlVG9wICYmIGJvZHkuYm90dG9tID4gdGlsZVRvcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG95ID0gYm9keS5ib3R0b20gLSB0aWxlVG9wO1xyXG5cclxuICAgICAgICAgICAgaWYgKG95ID4gdGlsZUJpYXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG95ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob3kgIT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGJvZHkuY3VzdG9tU2VwYXJhdGVZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keS5vdmVybGFwWSA9IG95O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBQcm9jZXNzVGlsZVNlcGFyYXRpb25ZKGJvZHksIG95KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG95O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaWxlQ2hlY2tZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgZm9yIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiB0aWxlIHJlY3RhbmdsZS1saWtlIG9iamVjdCBhbmQgYW4gQXJjYWRlIFBoeXNpY3MgYm9keS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLkFyY2FkZS5UaWxlbWFwLlRpbGVJbnRlcnNlY3RzQm9keVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHt7IGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlciwgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyIH19IHRpbGVXb3JsZFJlY3QgLSBBIHJlY3RhbmdsZSBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSB0aWxlIHBsYWNlbWVudCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuQXJjYWRlLkJvZHl9IGJvZHkgLSBUaGUgYm9keSB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uIGFnYWluc3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIG9mIHRoZSB0aWxlIGludGVyc2VjdHMgd2l0aCB0aGUgYm9keSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgVGlsZUludGVyc2VjdHNCb2R5ID0gZnVuY3Rpb24gKHRpbGVXb3JsZFJlY3QsIGJvZHkpXHJcbntcclxuICAgIC8vIEN1cnJlbnRseSwgYWxsIGJvZGllcyBhcmUgdHJlYXRlZCBhcyByZWN0YW5nbGVzIHdoZW4gY29sbGlkaW5nIHdpdGggYSBUaWxlLlxyXG5cclxuICAgIHJldHVybiAhKFxyXG4gICAgICAgIGJvZHkucmlnaHQgPD0gdGlsZVdvcmxkUmVjdC5sZWZ0IHx8XHJcbiAgICAgICAgYm9keS5ib3R0b20gPD0gdGlsZVdvcmxkUmVjdC50b3AgfHxcclxuICAgICAgICBib2R5LnBvc2l0aW9uLnggPj0gdGlsZVdvcmxkUmVjdC5yaWdodCB8fFxyXG4gICAgICAgIGJvZHkucG9zaXRpb24ueSA+PSB0aWxlV29ybGRSZWN0LmJvdHRvbVxyXG4gICAgKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZUludGVyc2VjdHNCb2R5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlR5cGVzLlBoeXNpY3NcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBcmNhZGU6IHJlcXVpcmUoJy4vYXJjYWRlJyksXHJcbiAgICBNYXR0ZXI6IHJlcXVpcmUoJy4vbWF0dGVyLWpzJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFxyXG4gKiBUaGUgQm9keSBCb3VuZHMgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0byBoZWxwIHlvdSBleHRyYWN0IHRoZSB3b3JsZCBjb29yZGluYXRlcyBmcm9tIHZhcmlvdXMgcG9pbnRzIGFyb3VuZFxyXG4gKiB0aGUgYm91bmRzIG9mIGEgTWF0dGVyIEJvZHkuIEJlY2F1c2UgTWF0dGVyIGJvZGllcyBhcmUgcG9zaXRpb25lZCBiYXNlZCBvbiB0aGVpciBjZW50ZXIgb2YgbWFzcywgYW5kIG5vdCBhXHJcbiAqIGRpbWVuc2lvbiBiYXNlZCBjZW50ZXIsIHlvdSBvZnRlbiBuZWVkIHRvIGdldCB0aGUgYm91bmRzIGNvb3JkaW5hdGVzIGluIG9yZGVyIHRvIHByb3Blcmx5IGFsaWduIHRoZW0gaW4gdGhlIHdvcmxkLlxyXG4gKiBcclxuICogWW91IGNhbiBhY2Nlc3MgdGhpcyBjbGFzcyB2aWEgdGhlIE1hdHRlclBoeXNpY3MgY2xhc3MgZnJvbSBhIFNjZW5lLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLm1hdHRlci5ib2R5Qm91bmRzLmdldFRvcExlZnQoYm9keSk7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogU2VlIGFsc28gdGhlIGBNYXR0ZXJQaHlzaWNzLmFsaWduQm9keWAgbWV0aG9kLlxyXG4gKlxyXG4gKiBAY2xhc3MgQm9keUJvdW5kc1xyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqL1xyXG52YXIgQm9keUJvdW5kcyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBCb2R5Qm91bmRzICgpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBWZWN0b3IyIHRoYXQgc3RvcmVzIHRoZSB0ZW1wb3JhcnkgYm91bmRzIGNlbnRlciB2YWx1ZSBkdXJpbmcgY2FsY3VsYXRpb25zIGJ5IG1ldGhvZHMgaW4gdGhpcyBjbGFzcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2JvdW5kc0NlbnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJvdW5kc0NlbnRlciA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgVmVjdG9yMiB0aGF0IHN0b3JlcyB0aGUgdGVtcG9yYXJ5IGNlbnRlciBkaWZmIHZhbHVlcyBkdXJpbmcgY2FsY3VsYXRpb25zIGJ5IG1ldGhvZHMgaW4gdGhpcyBjbGFzcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2NlbnRlckRpZmZcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jZW50ZXJEaWZmID0gbmV3IFZlY3RvcjIoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJvZHkgdG8gZ2V0IHRoZSBib3VuZHMgZGlmZiB2YWx1ZXMgZnJvbSBpdC5cclxuICAgICAqIFxyXG4gICAgICogVGhleSdyZSBzdG9yZWQgaW4gdGhpcyBjbGFzcyBpbiB0aGUgdGVtcG9yYXJ5IHByb3BlcnRpZXMgYGJvdW5kc0NlbnRlcmAgYW5kIGBjZW50ZXJEaWZmYC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYWxsIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBjbGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI3BhcnNlQm9keVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBnZXQgdGhlIGJvdW5kcyBwb3NpdGlvbiBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCB3YXMgYWJsZSB0byBnZXQgdGhlIGJvdW5kcywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHBhcnNlQm9keTogZnVuY3Rpb24gKGJvZHkpXHJcbiAgICB7XHJcbiAgICAgICAgYm9keSA9IChib2R5Lmhhc093blByb3BlcnR5KCdib2R5JykpID8gYm9keS5ib2R5IDogYm9keTtcclxuXHJcbiAgICAgICAgaWYgKCFib2R5Lmhhc093blByb3BlcnR5KCdib3VuZHMnKSB8fCAhYm9keS5oYXNPd25Qcm9wZXJ0eSgnY2VudGVyT2ZNYXNzJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYm91bmRzQ2VudGVyID0gdGhpcy5ib3VuZHNDZW50ZXI7XHJcbiAgICAgICAgdmFyIGNlbnRlckRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgIHZhciBib3VuZHNXaWR0aCA9IGJvZHkuYm91bmRzLm1heC54IC0gYm9keS5ib3VuZHMubWluLng7XHJcbiAgICAgICAgdmFyIGJvdW5kc0hlaWdodCA9IGJvZHkuYm91bmRzLm1heC55IC0gYm9keS5ib3VuZHMubWluLnk7XHJcblxyXG4gICAgICAgIHZhciBib2R5Q2VudGVyWCA9IGJvdW5kc1dpZHRoICogYm9keS5jZW50ZXJPZk1hc3MueDtcclxuICAgICAgICB2YXIgYm9keUNlbnRlclkgPSBib3VuZHNIZWlnaHQgKiBib2R5LmNlbnRlck9mTWFzcy55O1xyXG5cclxuICAgICAgICBib3VuZHNDZW50ZXIuc2V0KGJvdW5kc1dpZHRoIC8gMiwgYm91bmRzSGVpZ2h0IC8gMik7XHJcbiAgICAgICAgY2VudGVyRGlmZi5zZXQoYm9keUNlbnRlclggLSBib3VuZHNDZW50ZXIueCwgYm9keUNlbnRlclkgLSBib3VuZHNDZW50ZXIueSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQm9keSBhbmQgcmV0dXJucyB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldFRvcExlZnRcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fSBib2R5IC0gVGhlIEJvZHkgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfGZhbHNlKX0gQSBWZWN0b3IyIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzLCBvciBgZmFsc2VgIGlmIGl0IHdhcyB1bmFibGUgdG8gcGFyc2UgdGhlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldFRvcExlZnQ6IGZ1bmN0aW9uIChib2R5LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcnNlQm9keShib2R5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kc0NlbnRlcjtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICB4ICsgY2VudGVyLnggKyBkaWZmLngsXHJcbiAgICAgICAgICAgICAgICB5ICsgY2VudGVyLnkgKyBkaWZmLnlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEJvZHkgYW5kIHJldHVybnMgdGhlIHdvcmxkIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtY2VudGVyIG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldFRvcENlbnRlclxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBnZXQgdGhlIHBvc2l0aW9uIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgcmV0dXJuZWQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8ZmFsc2UpfSBBIFZlY3RvcjIgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMsIG9yIGBmYWxzZWAgaWYgaXQgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0VG9wQ2VudGVyOiBmdW5jdGlvbiAoYm9keSwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJzZUJvZHkoYm9keSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5ib3VuZHNDZW50ZXI7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gdGhpcy5jZW50ZXJEaWZmO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICAgICAgeCArIGRpZmYueCxcclxuICAgICAgICAgICAgICAgIHkgKyBjZW50ZXIueSArIGRpZmYueVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQm9keSBhbmQgcmV0dXJucyB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1yaWdodCBvZiBpdHMgX2JvdW5kc18uXHJcbiAgICAgKiBcclxuICAgICAqIEJvZHkgYm91bmRzIGFyZSB1cGRhdGVkIGJ5IE1hdHRlciBlYWNoIHN0ZXAgYW5kIGZhY3RvciBpbiBzY2FsZSBhbmQgcm90YXRpb24uXHJcbiAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSB3b3JsZCBjb29yZGluYXRlIGJhc2VkIG9uIHRoZSBib2RpZXMgX2N1cnJlbnRfIHBvc2l0aW9uIGFuZCBib3VuZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQm9keUJvdW5kcyNnZXRUb3BSaWdodFxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBnZXQgdGhlIHBvc2l0aW9uIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgcmV0dXJuZWQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8ZmFsc2UpfSBBIFZlY3RvcjIgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMsIG9yIGBmYWxzZWAgaWYgaXQgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0VG9wUmlnaHQ6IGZ1bmN0aW9uIChib2R5LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcnNlQm9keShib2R5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kc0NlbnRlcjtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICB4IC0gKGNlbnRlci54IC0gZGlmZi54KSxcclxuICAgICAgICAgICAgICAgIHkgKyBjZW50ZXIueSArIGRpZmYueVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQm9keSBhbmQgcmV0dXJucyB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIGxlZnQtY2VudGVyIG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldExlZnRDZW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fSBib2R5IC0gVGhlIEJvZHkgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfGZhbHNlKX0gQSBWZWN0b3IyIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzLCBvciBgZmFsc2VgIGlmIGl0IHdhcyB1bmFibGUgdG8gcGFyc2UgdGhlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldExlZnRDZW50ZXI6IGZ1bmN0aW9uIChib2R5LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcnNlQm9keShib2R5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kc0NlbnRlcjtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICB4ICsgY2VudGVyLnggKyBkaWZmLngsXHJcbiAgICAgICAgICAgICAgICB5ICsgZGlmZi55XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBCb2R5IGFuZCByZXR1cm5zIHRoZSB3b3JsZCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldENlbnRlclxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBnZXQgdGhlIHBvc2l0aW9uIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgcmV0dXJuZWQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5NYXRoLlZlY3RvcjJ8ZmFsc2UpfSBBIFZlY3RvcjIgY29udGFpbmluZyB0aGUgY29vcmRpbmF0ZXMsIG9yIGBmYWxzZWAgaWYgaXQgd2FzIHVuYWJsZSB0byBwYXJzZSB0aGUgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2VudGVyOiBmdW5jdGlvbiAoYm9keSwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJzZUJvZHkoYm9keSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGlmZiA9IHRoaXMuY2VudGVyRGlmZjtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihcclxuICAgICAgICAgICAgICAgIHggKyBkaWZmLngsXHJcbiAgICAgICAgICAgICAgICB5ICsgZGlmZi55XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBCb2R5IGFuZCByZXR1cm5zIHRoZSB3b3JsZCBjb29yZGluYXRlcyBvZiB0aGUgcmlnaHQtY2VudGVyIG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldFJpZ2h0Q2VudGVyXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keX0gYm9keSAtIFRoZSBCb2R5IHRvIGdldCB0aGUgcG9zaXRpb24gZnJvbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgcmV0dXJuZWQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxmYWxzZSl9IEEgVmVjdG9yMiBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcywgb3IgYGZhbHNlYCBpZiBpdCB3YXMgdW5hYmxlIHRvIHBhcnNlIHRoZSBib2R5LlxyXG4gICAgICovXHJcbiAgICBnZXRSaWdodENlbnRlcjogZnVuY3Rpb24gKGJvZHksIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyc2VCb2R5KGJvZHkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNlbnRlciA9IHRoaXMuYm91bmRzQ2VudGVyO1xyXG4gICAgICAgICAgICB2YXIgZGlmZiA9IHRoaXMuY2VudGVyRGlmZjtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMihcclxuICAgICAgICAgICAgICAgIHggLSAoY2VudGVyLnggLSBkaWZmLngpLFxyXG4gICAgICAgICAgICAgICAgeSArIGRpZmYueVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQm9keSBhbmQgcmV0dXJucyB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIGJvdHRvbS1sZWZ0IG9mIGl0cyBfYm91bmRzXy5cclxuICAgICAqIFxyXG4gICAgICogQm9keSBib3VuZHMgYXJlIHVwZGF0ZWQgYnkgTWF0dGVyIGVhY2ggc3RlcCBhbmQgZmFjdG9yIGluIHNjYWxlIGFuZCByb3RhdGlvbi5cclxuICAgICAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgYmFzZWQgb24gdGhlIGJvZGllcyBfY3VycmVudF8gcG9zaXRpb24gYW5kIGJvdW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Cb2R5Qm91bmRzI2dldEJvdHRvbUxlZnRcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fSBib2R5IC0gVGhlIEJvZHkgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfGZhbHNlKX0gQSBWZWN0b3IyIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzLCBvciBgZmFsc2VgIGlmIGl0IHdhcyB1bmFibGUgdG8gcGFyc2UgdGhlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldEJvdHRvbUxlZnQ6IGZ1bmN0aW9uIChib2R5LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcnNlQm9keShib2R5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kc0NlbnRlcjtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICB4ICsgY2VudGVyLnggKyBkaWZmLngsXHJcbiAgICAgICAgICAgICAgICB5IC0gKGNlbnRlci55IC0gZGlmZi55KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgQm9keSBhbmQgcmV0dXJucyB0aGUgd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIGJvdHRvbS1jZW50ZXIgb2YgaXRzIF9ib3VuZHNfLlxyXG4gICAgICogXHJcbiAgICAgKiBCb2R5IGJvdW5kcyBhcmUgdXBkYXRlZCBieSBNYXR0ZXIgZWFjaCBzdGVwIGFuZCBmYWN0b3IgaW4gc2NhbGUgYW5kIHJvdGF0aW9uLlxyXG4gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgd29ybGQgY29vcmRpbmF0ZSBiYXNlZCBvbiB0aGUgYm9kaWVzIF9jdXJyZW50XyBwb3NpdGlvbiBhbmQgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkJvZHlCb3VuZHMjZ2V0Qm90dG9tQ2VudGVyXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keX0gYm9keSAtIFRoZSBCb2R5IHRvIGdldCB0aGUgcG9zaXRpb24gZnJvbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IHRvIGFkZCB0byB0aGUgcmV0dXJuZWQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLk1hdGguVmVjdG9yMnxmYWxzZSl9IEEgVmVjdG9yMiBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcywgb3IgYGZhbHNlYCBpZiBpdCB3YXMgdW5hYmxlIHRvIHBhcnNlIHRoZSBib2R5LlxyXG4gICAgICovXHJcbiAgICBnZXRCb3R0b21DZW50ZXI6IGZ1bmN0aW9uIChib2R5LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcnNlQm9keShib2R5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kc0NlbnRlcjtcclxuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmNlbnRlckRpZmY7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIoXHJcbiAgICAgICAgICAgICAgICB4ICsgZGlmZi54LFxyXG4gICAgICAgICAgICAgICAgeSAtIChjZW50ZXIueSAtIGRpZmYueSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEJvZHkgYW5kIHJldHVybnMgdGhlIHdvcmxkIGNvb3JkaW5hdGVzIG9mIHRoZSBib3R0b20tcmlnaHQgb2YgaXRzIF9ib3VuZHNfLlxyXG4gICAgICogXHJcbiAgICAgKiBCb2R5IGJvdW5kcyBhcmUgdXBkYXRlZCBieSBNYXR0ZXIgZWFjaCBzdGVwIGFuZCBmYWN0b3IgaW4gc2NhbGUgYW5kIHJvdGF0aW9uLlxyXG4gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgd29ybGQgY29vcmRpbmF0ZSBiYXNlZCBvbiB0aGUgYm9kaWVzIF9jdXJyZW50XyBwb3NpdGlvbiBhbmQgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkJvZHlCb3VuZHMjZ2V0Qm90dG9tUmlnaHRcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fSBib2R5IC0gVGhlIEJvZHkgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gT3B0aW9uYWwgaG9yaXpvbnRhbCBvZmZzZXQgdG8gYWRkIHRvIHRoZSByZXR1cm5lZCBjb29yZGluYXRlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCB0byBhZGQgdG8gdGhlIHJldHVybmVkIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuTWF0aC5WZWN0b3IyfGZhbHNlKX0gQSBWZWN0b3IyIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzLCBvciBgZmFsc2VgIGlmIGl0IHdhcyB1bmFibGUgdG8gcGFyc2UgdGhlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldEJvdHRvbVJpZ2h0OiBmdW5jdGlvbiAoYm9keSwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJzZUJvZHkoYm9keSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2VudGVyID0gdGhpcy5ib3VuZHNDZW50ZXI7XHJcbiAgICAgICAgICAgIHZhciBkaWZmID0gdGhpcy5jZW50ZXJEaWZmO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKFxyXG4gICAgICAgICAgICAgICAgeCAtIChjZW50ZXIueCAtIGRpZmYueCksXHJcbiAgICAgICAgICAgICAgICB5IC0gKGNlbnRlci55IC0gZGlmZi55KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJvZHlCb3VuZHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclxyXG4gKi9cclxuXHJcbnZhciBNYXR0ZXIgPSByZXF1aXJlKCcuL2xpYi9jb3JlL01hdHRlcicpO1xyXG5cclxuTWF0dGVyLkJvZHkgPSByZXF1aXJlKCcuL2xpYi9ib2R5L0JvZHknKTtcclxuTWF0dGVyLkNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQ29tcG9zaXRlJyk7XHJcbk1hdHRlci5Xb3JsZCA9IHJlcXVpcmUoJy4vbGliL2JvZHkvV29ybGQnKTtcclxuXHJcbk1hdHRlci5EZXRlY3RvciA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9EZXRlY3RvcicpO1xyXG5NYXR0ZXIuR3JpZCA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9HcmlkJyk7XHJcbk1hdHRlci5QYWlycyA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9QYWlycycpO1xyXG5NYXR0ZXIuUGFpciA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9QYWlyJyk7XHJcbk1hdHRlci5RdWVyeSA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9RdWVyeScpO1xyXG5NYXR0ZXIuUmVzb2x2ZXIgPSByZXF1aXJlKCcuL2xpYi9jb2xsaXNpb24vUmVzb2x2ZXInKTtcclxuTWF0dGVyLlNBVCA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9TQVQnKTtcclxuXHJcbk1hdHRlci5Db25zdHJhaW50ID0gcmVxdWlyZSgnLi9saWIvY29uc3RyYWludC9Db25zdHJhaW50Jyk7XHJcblxyXG5NYXR0ZXIuQ29tbW9uID0gcmVxdWlyZSgnLi9saWIvY29yZS9Db21tb24nKTtcclxuTWF0dGVyLkVuZ2luZSA9IHJlcXVpcmUoJy4vbGliL2NvcmUvRW5naW5lJyk7XHJcbk1hdHRlci5FdmVudHMgPSByZXF1aXJlKCcuL2xpYi9jb3JlL0V2ZW50cycpO1xyXG5NYXR0ZXIuU2xlZXBpbmcgPSByZXF1aXJlKCcuL2xpYi9jb3JlL1NsZWVwaW5nJyk7XHJcbk1hdHRlci5QbHVnaW4gPSByZXF1aXJlKCcuL2xpYi9jb3JlL1BsdWdpbicpO1xyXG5cclxuTWF0dGVyLkJvZGllcyA9IHJlcXVpcmUoJy4vbGliL2ZhY3RvcnkvQm9kaWVzJyk7XHJcbk1hdHRlci5Db21wb3NpdGVzID0gcmVxdWlyZSgnLi9saWIvZmFjdG9yeS9Db21wb3NpdGVzJyk7XHJcblxyXG5NYXR0ZXIuQXhlcyA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L0F4ZXMnKTtcclxuTWF0dGVyLkJvdW5kcyA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L0JvdW5kcycpO1xyXG5NYXR0ZXIuU3ZnID0gcmVxdWlyZSgnLi9saWIvZ2VvbWV0cnkvU3ZnJyk7XHJcbk1hdHRlci5WZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9WZWN0b3InKTtcclxuTWF0dGVyLlZlcnRpY2VzID0gcmVxdWlyZSgnLi9saWIvZ2VvbWV0cnkvVmVydGljZXMnKTtcclxuXHJcbi8vIGFsaWFzZXNcclxuXHJcbk1hdHRlci5Xb3JsZC5hZGQgPSBNYXR0ZXIuQ29tcG9zaXRlLmFkZDtcclxuTWF0dGVyLldvcmxkLnJlbW92ZSA9IE1hdHRlci5Db21wb3NpdGUucmVtb3ZlO1xyXG5NYXR0ZXIuV29ybGQuYWRkQ29tcG9zaXRlID0gTWF0dGVyLkNvbXBvc2l0ZS5hZGRDb21wb3NpdGU7XHJcbk1hdHRlci5Xb3JsZC5hZGRCb2R5ID0gTWF0dGVyLkNvbXBvc2l0ZS5hZGRCb2R5O1xyXG5NYXR0ZXIuV29ybGQuYWRkQ29uc3RyYWludCA9IE1hdHRlci5Db21wb3NpdGUuYWRkQ29uc3RyYWludDtcclxuTWF0dGVyLldvcmxkLmNsZWFyID0gTWF0dGVyLkNvbXBvc2l0ZS5jbGVhcjtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb2RpZXMgPSByZXF1aXJlKCcuL2xpYi9mYWN0b3J5L0JvZGllcycpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9zaXRlcyA9IHJlcXVpcmUoJy4vbGliL2ZhY3RvcnkvQ29tcG9zaXRlcycpO1xyXG52YXIgQ29uc3RyYWludCA9IHJlcXVpcmUoJy4vbGliL2NvbnN0cmFpbnQvQ29uc3RyYWludCcpO1xyXG52YXIgU3ZnID0gcmVxdWlyZSgnLi9saWIvZ2VvbWV0cnkvU3ZnJyk7XHJcbnZhciBNYXR0ZXJHYW1lT2JqZWN0ID0gcmVxdWlyZSgnLi9NYXR0ZXJHYW1lT2JqZWN0Jyk7XHJcbnZhciBNYXR0ZXJJbWFnZSA9IHJlcXVpcmUoJy4vTWF0dGVySW1hZ2UnKTtcclxudmFyIE1hdHRlclNwcml0ZSA9IHJlcXVpcmUoJy4vTWF0dGVyU3ByaXRlJyk7XHJcbnZhciBNYXR0ZXJUaWxlQm9keSA9IHJlcXVpcmUoJy4vTWF0dGVyVGlsZUJvZHknKTtcclxudmFyIFBoeXNpY3NFZGl0b3JQYXJzZXIgPSByZXF1aXJlKCcuL1BoeXNpY3NFZGl0b3JQYXJzZXInKTtcclxudmFyIFBoeXNpY3NKU09OUGFyc2VyID0gcmVxdWlyZSgnLi9QaHlzaWNzSlNPTlBhcnNlcicpO1xyXG52YXIgUG9pbnRlckNvbnN0cmFpbnQgPSByZXF1aXJlKCcuL1BvaW50ZXJDb25zdHJhaW50Jyk7XHJcbnZhciBWZXJ0aWNlcyA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L1ZlcnRpY2VzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgTWF0dGVyIEZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIHF1aWNrbHkgY3JlYXRpbmcgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB0eXBlcyBvZlxyXG4gKiBib2RpZXMsIGNvbnN0cmFpbnRzIGFuZCBHYW1lIE9iamVjdHMgYW5kIGFkZGluZyB0aGVtIGludG8gdGhlIHBoeXNpY3Mgd29ybGQuXHJcbiAqIFxyXG4gKiBZb3UgYWNjZXNzIHRoZSBmYWN0b3J5IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmcgYGFkZGA6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMubWF0dGVyLmFkZC5yZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogVXNlIG9mIHRoZSBGYWN0b3J5IGlzIG9wdGlvbmFsLiBBbGwgb2YgdGhlIG9iamVjdHMgaXQgY3JlYXRlcyBjYW4gYWxzbyBiZSBjcmVhdGVkXHJcbiAqIGRpcmVjdGx5IHZpYSB5b3VyIG93biBjb2RlIG9yIGNvbnN0cnVjdG9ycy4gSXQgaXMgcHJvdmlkZWQgYXMgYSBtZWFucyB0byBrZWVwIHlvdXJcclxuICogY29kZSBjb25jaXNlLlxyXG4gKlxyXG4gKiBAY2xhc3MgRmFjdG9yeVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IHdvcmxkIC0gVGhlIE1hdHRlciBXb3JsZCB3aGljaCB0aGlzIEZhY3RvcnkgYWRkcyB0by5cclxuICovXHJcbnZhciBGYWN0b3J5ID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEZhY3RvcnkgKHdvcmxkKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBNYXR0ZXIgV29ybGQgd2hpY2ggdGhpcyBGYWN0b3J5IGFkZHMgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSN3b3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZCA9IHdvcmxkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgd2hpY2ggdGhpcyBGYWN0b3J5J3MgTWF0dGVyIFdvcmxkIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHdvcmxkLnNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUuU3lzdGVtcyB0aGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNzeXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzID0gd29ybGQuc2NlbmUuc3lzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmlnaWQgcmVjdGFuZ3VsYXIgQm9keSBhbmQgYWRkcyBpdCB0byB0aGUgV29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNyZWN0YW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIEJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIEJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgQm9keS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gQSBNYXR0ZXIgSlMgQm9keS5cclxuICAgICAqL1xyXG4gICAgcmVjdGFuZ2xlOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICB2YXIgYm9keSA9IEJvZGllcy5yZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIHRyYXBlem9pZGFsIEJvZHkgYW5kIGFkZHMgaXQgdG8gdGhlIFdvcmxkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjdHJhcGV6b2lkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgQm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0cmFwZXpvaWQgQm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0cmFwZXpvaWQgQm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzbG9wZSAtIFRoZSBzbG9wZSBvZiB0aGUgdHJhcGV6b2lkLiAwIGNyZWF0ZXMgYSByZWN0YW5nbGUsIHdoaWxlIDEgY3JlYXRlcyBhIHRyaWFuZ2xlLiBQb3NpdGl2ZSB2YWx1ZXMgbWFrZSB0aGUgdG9wIHNpZGUgc2hvcnRlciwgd2hpbGUgbmVnYXRpdmUgdmFsdWVzIG1ha2UgdGhlIGJvdHRvbSBzaWRlIHNob3J0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IEEgTWF0dGVyIEpTIEJvZHkuXHJcbiAgICAgKi9cclxuICAgIHRyYXBlem9pZDogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIHNsb3BlLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib2R5ID0gQm9kaWVzLnRyYXBlem9pZCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzbG9wZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIGNpcmN1bGFyIEJvZHkgYW5kIGFkZHMgaXQgdG8gdGhlIFdvcmxkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjY2lyY2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgQm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4U2lkZXNdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZGVzIHRvIHVzZSBmb3IgdGhlIHBvbHlnb24gd2hpY2ggd2lsbCBhcHByb3hpbWF0ZSB0aGlzIGNpcmNsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gQSBNYXR0ZXIgSlMgQm9keS5cclxuICAgICAqL1xyXG4gICAgY2lyY2xlOiBmdW5jdGlvbiAoeCwgeSwgcmFkaXVzLCBvcHRpb25zLCBtYXhTaWRlcylcclxuICAgIHtcclxuICAgICAgICB2YXIgYm9keSA9IEJvZGllcy5jaXJjbGUoeCwgeSwgcmFkaXVzLCBvcHRpb25zLCBtYXhTaWRlcyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIHBvbHlnb25hbCBCb2R5IGFuZCBhZGRzIGl0IHRvIHRoZSBXb3JsZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I3BvbHlnb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIEJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lkZXMgLSBUaGUgbnVtYmVyIG9mIHNpZGVzIHRoZSBwb2x5Z29uIHdpbGwgaGF2ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgXCJyYWRpdXNcIiBvZiB0aGUgcG9seWdvbiwgaS5lLiB0aGUgZGlzdGFuY2UgZnJvbSBpdHMgY2VudGVyIHRvIGFueSB2ZXJ0ZXguIFRoaXMgaXMgYWxzbyB0aGUgcmFkaXVzIG9mIGl0cyBjaXJjdW1jaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IEEgTWF0dGVyIEpTIEJvZHkuXHJcbiAgICAgKi9cclxuICAgIHBvbHlnb246IGZ1bmN0aW9uICh4LCB5LCBzaWRlcywgcmFkaXVzLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib2R5ID0gQm9kaWVzLnBvbHlnb24oeCwgeSwgc2lkZXMsIHJhZGl1cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgYm9keSB1c2luZyB0aGUgc3VwcGxpZWQgdmVydGljZXMgKG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgbXVsdGlwbGUgc2V0cyBvZiB2ZXJ0aWNlcykgYW5kIGFkZHMgaXQgdG8gdGhlIFdvcmxkLlxyXG4gICAgICogSWYgdGhlIHZlcnRpY2VzIGFyZSBjb252ZXgsIHRoZXkgd2lsbCBwYXNzIHRocm91Z2ggYXMgc3VwcGxpZWQuIE90aGVyd2lzZSwgaWYgdGhlIHZlcnRpY2VzIGFyZSBjb25jYXZlLCB0aGV5IHdpbGwgYmUgZGVjb21wb3NlZC4gTm90ZSB0aGF0IHRoaXMgcHJvY2VzcyBpcyBub3QgZ3VhcmFudGVlZCB0byBzdXBwb3J0IGNvbXBsZXggc2V0cyBvZiB2ZXJ0aWNlcywgZS5nLiBvbmVzIHdpdGggaG9sZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNmcm9tVmVydGljZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIEJvZHkuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8YXJyYXkpfSB2ZXJ0ZXhTZXRzIC0gVGhlIHZlcnRpY2VzIGRhdGEuIEVpdGhlciBhIHBhdGggc3RyaW5nIG9yIGFuIGFycmF5IG9mIHZlcnRpY2VzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxhZ0ludGVybmFsPWZhbHNlXSAtIEZsYWcgaW50ZXJuYWwgZWRnZXMgKGNvaW5jaWRlbnQgcGFydCBlZGdlcylcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmVtb3ZlQ29sbGluZWFyPTAuMDFdIC0gV2hldGhlciBNYXR0ZXIuanMgd2lsbCBkaXNjYXJkIGNvbGxpbmVhciBlZGdlcyAodG8gaW1wcm92ZSBwZXJmb3JtYW5jZSkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbmltdW1BcmVhPTEwXSAtIER1cmluZyBkZWNvbXBvc2l0aW9uIGRpc2NhcmQgcGFydHMgdGhhdCBoYXZlIGFuIGFyZWEgbGVzcyB0aGFuIHRoaXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IEEgTWF0dGVyIEpTIEJvZHkuXHJcbiAgICAgKi9cclxuICAgIGZyb21WZXJ0aWNlczogZnVuY3Rpb24gKHgsIHksIHZlcnRleFNldHMsIG9wdGlvbnMsIGZsYWdJbnRlcm5hbCwgcmVtb3ZlQ29sbGluZWFyLCBtaW5pbXVtQXJlYSlcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZlcnRleFNldHMgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmVydGV4U2V0cyA9IFZlcnRpY2VzLmZyb21QYXRoKHZlcnRleFNldHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGJvZHkgPSBCb2RpZXMuZnJvbVZlcnRpY2VzKHgsIHksIHZlcnRleFNldHMsIG9wdGlvbnMsIGZsYWdJbnRlcm5hbCwgcmVtb3ZlQ29sbGluZWFyLCBtaW5pbXVtQXJlYSk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgYm9keSB1c2luZyBkYXRhIGV4cG9ydGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIFBoeXNpY3NFZGl0b3IgKGh0dHBzOi8vd3d3LmNvZGVhbmR3ZWIuY29tL3BoeXNpY3NlZGl0b3IpXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBQaHlzaWNzRWRpdG9yIGZpbGUgc2hvdWxkIGJlIGxvYWRlZCBhcyBKU09OOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBwcmVsb2FkICgpXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgIHRoaXMubG9hZC5qc29uKCd2ZWhpY2xlcycsICdhc3NldHMvdmVoaWNsZXMuanNvbik7XHJcbiAgICAgKiB9XHJcbiAgICAgKiBcclxuICAgICAqIGNyZWF0ZSAoKVxyXG4gICAgICoge1xyXG4gICAgICogICBjb25zdCB2ZWhpY2xlU2hhcGVzID0gdGhpcy5jYWNoZS5qc29uLmdldCgndmVoaWNsZXMnKTtcclxuICAgICAqICAgdGhpcy5tYXR0ZXIuYWRkLmZyb21QaHlzaWNzRWRpdG9yKDQwMCwgMzAwLCB2ZWhpY2xlU2hhcGVzLnRydWNrKTtcclxuICAgICAqIH1cclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBEbyBub3QgcGFzcyB0aGUgZW50aXJlIEpTT04gZmlsZSB0byB0aGlzIG1ldGhvZCwgYnV0IGluc3RlYWQgcGFzcyBvbmUgb2YgdGhlIHNoYXBlcyBjb250YWluZWQgd2l0aGluIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3UgcGFzIGluIGFuIGBvcHRpb25zYCBvYmplY3QsIGFueSBzZXR0aW5ncyBpbiB0aGVyZSB3aWxsIG92ZXJyaWRlIHRob3NlIGluIHRoZSBQaHlzaWNzRWRpdG9yIGNvbmZpZyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNmcm9tUGh5c2ljc0VkaXRvclxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgd29ybGQgbG9jYXRpb24gb2YgdGhlIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCB3b3JsZCBsb2NhdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7YW55fSBjb25maWcgLSBUaGUgSlNPTiBkYXRhIGV4cG9ydGVkIGZyb20gUGh5c2ljc0VkaXRvci5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvV29ybGQ9dHJ1ZV0gLSBTaG91bGQgdGhlIG5ld2x5IGNyZWF0ZWQgYm9keSBiZSBpbW1lZGlhdGVseSBhZGRlZCB0byB0aGUgV29ybGQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IEEgTWF0dGVyIEpTIEJvZHkuXHJcbiAgICAgKi9cclxuICAgIGZyb21QaHlzaWNzRWRpdG9yOiBmdW5jdGlvbiAoeCwgeSwgY29uZmlnLCBvcHRpb25zLCBhZGRUb1dvcmxkKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhZGRUb1dvcmxkID09PSB1bmRlZmluZWQpIHsgYWRkVG9Xb3JsZCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdmFyIGJvZHkgPSBQaHlzaWNzRWRpdG9yUGFyc2VyLnBhcnNlQm9keSh4LCB5LCBjb25maWcsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBpZiAoYWRkVG9Xb3JsZCAmJiAhdGhpcy53b3JsZC5oYXMoYm9keSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmFkZChib2R5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBib2R5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBib2R5IHVzaW5nIHRoZSBwYXRoIGRhdGEgZnJvbSBhbiBTVkcgZmlsZS5cclxuICAgICAqIFxyXG4gICAgICogU1ZHIFBhcnNpbmcgcmVxdWlyZXMgdGhlIHBhdGhzZWcgcG9seWZpbGwgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHJvZ2Vycy9wYXRoc2VnXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBTVkcgZmlsZSBzaG91bGQgYmUgbG9hZGVkIGFzIFhNTCwgYXMgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhlIGFiaWxpdHkgdG8gZXh0cmFjdFxyXG4gICAgICogdGhlIHBhdGggZGF0YSBmcm9tIGl0LiBJLmUuOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiBwcmVsb2FkICgpXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgIHRoaXMubG9hZC54bWwoJ2ZhY2UnLCAnYXNzZXRzL2ZhY2Uuc3ZnKTtcclxuICAgICAqIH1cclxuICAgICAqIFxyXG4gICAgICogY3JlYXRlICgpXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgIHRoaXMubWF0dGVyLmFkZC5mcm9tU1ZHKDQwMCwgMzAwLCB0aGlzLmNhY2hlLnhtbC5nZXQoJ2ZhY2UnKSk7XHJcbiAgICAgKiB9XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I2Zyb21TVkdcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0geG1sIC0gVGhlIFNWRyBQYXRoIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTFdIC0gU2NhbGUgdGhlIHZlcnRpY2VzIGJ5IHRoaXMgYW1vdW50IGFmdGVyIGNyZWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9Xb3JsZD10cnVlXSAtIFNob3VsZCB0aGUgbmV3bHkgY3JlYXRlZCBib2R5IGJlIGltbWVkaWF0ZWx5IGFkZGVkIHRvIHRoZSBXb3JsZD9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gQSBNYXR0ZXIgSlMgQm9keS5cclxuICAgICAqL1xyXG4gICAgZnJvbVNWRzogZnVuY3Rpb24gKHgsIHksIHhtbCwgc2NhbGUsIG9wdGlvbnMsIGFkZFRvV29ybGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNjYWxlID09PSB1bmRlZmluZWQpIHsgc2NhbGUgPSAxOyB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0ge307IH1cclxuICAgICAgICBpZiAoYWRkVG9Xb3JsZCA9PT0gdW5kZWZpbmVkKSB7IGFkZFRvV29ybGQgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciBwYXRoID0geG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXRoJyk7XHJcbiAgICAgICAgdmFyIHZlcnRleFNldHMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBvaW50cyA9IFN2Zy5wYXRoVG9WZXJ0aWNlcyhwYXRoW2ldLCAzMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2NhbGUgIT09IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFZlcnRpY2VzLnNjYWxlKHBvaW50cywgc2NhbGUsIHNjYWxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmVydGV4U2V0cy5wdXNoKHBvaW50cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYm9keSA9IEJvZGllcy5mcm9tVmVydGljZXMoeCwgeSwgdmVydGV4U2V0cywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGlmIChhZGRUb1dvcmxkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JsZC5hZGQoYm9keSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgYm9keSB1c2luZyB0aGUgc3VwcGxpZWQgcGh5c2ljcyBkYXRhLCBhcyBwcm92aWRlZCBieSBhIEpTT04gZmlsZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRhdGEgZmlsZSBzaG91bGQgYmUgbG9hZGVkIGFzIEpTT046XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHByZWxvYWQgKClcclxuICAgICAqIHtcclxuICAgICAqICAgdGhpcy5sb2FkLmpzb24oJ25pbmphcycsICdhc3NldHMvbmluamFzLmpzb24pO1xyXG4gICAgICogfVxyXG4gICAgICogXHJcbiAgICAgKiBjcmVhdGUgKClcclxuICAgICAqIHtcclxuICAgICAqICAgY29uc3QgbmluamFTaGFwZXMgPSB0aGlzLmNhY2hlLmpzb24uZ2V0KCduaW5qYXMnKTtcclxuICAgICAqIFxyXG4gICAgICogICB0aGlzLm1hdHRlci5hZGQuZnJvbUpTT04oNDAwLCAzMDAsIG5pbmphU2hhcGVzLnNoaW5vYmkpO1xyXG4gICAgICogfVxyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIERvIG5vdCBwYXNzIHRoZSBlbnRpcmUgSlNPTiBmaWxlIHRvIHRoaXMgbWV0aG9kLCBidXQgaW5zdGVhZCBwYXNzIG9uZSBvZiB0aGUgc2hhcGVzIGNvbnRhaW5lZCB3aXRoaW4gaXQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBwYXMgaW4gYW4gYG9wdGlvbnNgIG9iamVjdCwgYW55IHNldHRpbmdzIGluIHRoZXJlIHdpbGwgb3ZlcnJpZGUgdGhvc2UgaW4gdGhlIGNvbmZpZyBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEpTT04gZmlsZSBpcyBhcyBmb2xsb3dzOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGB0ZXh0XHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICdnZW5lcmF0b3JfaW5mbyc6IC8vIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIEpTT04gZGF0YVxyXG4gICAgICogICAnc2hhcGVOYW1lJzoge1xyXG4gICAgICogICAgICd0eXBlJzogLy8gVGhlIHR5cGUgb2YgYm9keVxyXG4gICAgICogICAgICdsYWJlbCc6IC8vIE9wdGlvbmFsIGJvZHkgbGFiZWxcclxuICAgICAqICAgICAndmVydGljZXMnOiAvLyBBbiBhcnJheSwgb3IgYW4gYXJyYXkgb2YgYXJyYXlzLCBjb250YWluaW5nIHRoZSB2ZXJ0ZXggZGF0YSBpbiB4L3kgb2JqZWN0IHBhaXJzXHJcbiAgICAgKiAgIH1cclxuICAgICAqIH1cclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBBdCB0aGUgdGltZSBvZiB3cml0aW5nLCBvbmx5IHRoZSBQaGFzZXIgUGh5c2ljcyBUcmFjZXIgQXBwIGV4cG9ydHMgaW4gdGhpcyBmb3JtYXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNmcm9tSlNPTlxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7YW55fSBjb25maWcgLSBUaGUgSlNPTiBwaHlzaWNzIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1dvcmxkPXRydWVdIC0gU2hvdWxkIHRoZSBuZXdseSBjcmVhdGVkIGJvZHkgYmUgaW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIFdvcmxkP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkJvZHlUeXBlfSBBIE1hdHRlciBKUyBCb2R5LlxyXG4gICAgICovXHJcbiAgICBmcm9tSlNPTjogZnVuY3Rpb24gKHgsIHksIGNvbmZpZywgb3B0aW9ucywgYWRkVG9Xb3JsZClcclxuICAgIHtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgICAgIGlmIChhZGRUb1dvcmxkID09PSB1bmRlZmluZWQpIHsgYWRkVG9Xb3JsZCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdmFyIGJvZHkgPSBQaHlzaWNzSlNPTlBhcnNlci5wYXJzZUJvZHkoeCwgeSwgY29uZmlnLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKGJvZHkgJiYgYWRkVG9Xb3JsZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMud29ybGQuYWRkKGJvZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJvZHk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIE1hdHRlciBJbWFnZSBvYmplY3RzIGNyZWF0ZWQgaW4gYSBncmlkIGFycmFuZ2VtZW50LlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBib2R5IGJvdW5kcyB0byBwcmV2ZW50IG92ZXJsYXBzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjaW1hZ2VTdGFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IGZyYW1lIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLiBTZXQgdG8gYG51bGxgIHRvIHNraXAgdGhpcyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBjb21wb3NpdGUgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBjb21wb3NpdGUgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbnMgLSBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93cyAtIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZ3JpZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29sdW1uR2FwPTBdIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBjb2x1bW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jvd0dhcD0wXSAtIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcm93LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbXBvc2l0ZVR5cGV9IEEgTWF0dGVyIEpTIENvbXBvc2l0ZSBTdGFjay5cclxuICAgICAqL1xyXG4gICAgaW1hZ2VTdGFjazogZnVuY3Rpb24gKGtleSwgZnJhbWUsIHgsIHksIGNvbHVtbnMsIHJvd3MsIGNvbHVtbkdhcCwgcm93R2FwLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb2x1bW5HYXAgPT09IHVuZGVmaW5lZCkgeyBjb2x1bW5HYXAgPSAwOyB9XHJcbiAgICAgICAgaWYgKHJvd0dhcCA9PT0gdW5kZWZpbmVkKSB7IHJvd0dhcCA9IDA7IH1cclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG5cclxuICAgICAgICB2YXIgd29ybGQgPSB0aGlzLndvcmxkO1xyXG4gICAgICAgIHZhciBkaXNwbGF5TGlzdCA9IHRoaXMuc3lzLmRpc3BsYXlMaXN0O1xyXG5cclxuICAgICAgICBvcHRpb25zLmFkZFRvV29ybGQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIHN0YWNrID0gQ29tcG9zaXRlcy5zdGFjayh4LCB5LCBjb2x1bW5zLCByb3dzLCBjb2x1bW5HYXAsIHJvd0dhcCwgZnVuY3Rpb24gKHgsIHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgTWF0dGVySW1hZ2Uod29ybGQsIHgsIHksIGtleSwgZnJhbWUsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgZGlzcGxheUxpc3QuYWRkKGltYWdlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpbWFnZS5ib2R5O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB3b3JsZC5hZGQoc3RhY2spO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIGJvZGllcyBjcmVhdGVkIGluIHRoZSBjYWxsYmFjayBpbiBhIGdyaWQgYXJyYW5nZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgYm9keSBib3VuZHMgdG8gcHJldmVudCBvdmVybGFwcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I3N0YWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgY29tcG9zaXRlIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgY29tcG9zaXRlIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zIC0gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBncmlkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3MgLSBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdyaWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uR2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBjb2x1bW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93R2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByb3cuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0aGF0IGNyZWF0ZXMgdGhlIHN0YWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbXBvc2l0ZVR5cGV9IEEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIG9iamVjdHMgY3JlYXRlZCBpbiB0aGUgY2FsbGJhY2suXHJcbiAgICAgKi9cclxuICAgIHN0YWNrOiBmdW5jdGlvbiAoeCwgeSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdGFjayA9IENvbXBvc2l0ZXMuc3RhY2soeCwgeSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZC5hZGQoc3RhY2spO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RhY2s7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIGJvZGllcyBjcmVhdGVkIGluIHRoZSBjYWxsYmFjayBpbiBhIHB5cmFtaWQgYXJyYW5nZW1lbnQuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGJvZHkgYm91bmRzIHRvIHByZXZlbnQgb3ZlcmxhcHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNweXJhbWlkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgY29tcG9zaXRlIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgY29tcG9zaXRlIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zIC0gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBweXJhbWlkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3MgLSBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHB5cmFtaWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uR2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBjb2x1bW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93R2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByb3cuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbXBvc2l0ZVR5cGV9IEEgTWF0dGVyIEpTIENvbXBvc2l0ZSBweXJhbWlkLlxyXG4gICAgICovXHJcbiAgICBweXJhbWlkOiBmdW5jdGlvbiAoeCwgeSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdGFjayA9IENvbXBvc2l0ZXMucHlyYW1pZCh4LCB5LCBjb2x1bW5zLCByb3dzLCBjb2x1bW5HYXAsIHJvd0dhcCwgY2FsbGJhY2spO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLmFkZChzdGFjayk7XHJcblxyXG4gICAgICAgIHJldHVybiBzdGFjaztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFpbnMgYWxsIGJvZGllcyBpbiB0aGUgZ2l2ZW4gY29tcG9zaXRlIHRvZ2V0aGVyIHVzaW5nIGNvbnN0cmFpbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjY2hhaW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQ29tcG9zaXRlVHlwZX0gY29tcG9zaXRlIC0gVGhlIGNvbXBvc2l0ZSBpbiB3aGljaCBhbGwgYm9kaWVzIHdpbGwgYmUgY2hhaW5lZCB0b2dldGhlciBzZXF1ZW50aWFsbHkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geE9mZnNldEEgLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIEJvZHlBIGNvbnN0cmFpbnQuIFRoaXMgaXMgYSBwZXJjZW50YWdlIGJhc2VkIG9uIHRoZSBib2R5IHNpemUsIG5vdCBhIHdvcmxkIHBvc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlPZmZzZXRBIC0gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgQm9keUEgY29uc3RyYWludC4gVGhpcyBpcyBhIHBlcmNlbnRhZ2UgYmFzZWQgb24gdGhlIGJvZHkgc2l6ZSwgbm90IGEgd29ybGQgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geE9mZnNldEIgLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIEJvZHlCIGNvbnN0cmFpbnQuIFRoaXMgaXMgYSBwZXJjZW50YWdlIGJhc2VkIG9uIHRoZSBib2R5IHNpemUsIG5vdCBhIHdvcmxkIHBvc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlPZmZzZXRCIC0gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgQm9keUIgY29uc3RyYWludC4gVGhpcyBpcyBhIHBlcmNlbnRhZ2UgYmFzZWQgb24gdGhlIGJvZHkgc2l6ZSwgbm90IGEgd29ybGQgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJDb25zdHJhaW50Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBDb25zdHJhaW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBDb25zdHJhaW50IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQ29tcG9zaXRlVHlwZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBtZXRob2QuXHJcbiAgICAgKi9cclxuICAgIGNoYWluOiBmdW5jdGlvbiAoY29tcG9zaXRlLCB4T2Zmc2V0QSwgeU9mZnNldEEsIHhPZmZzZXRCLCB5T2Zmc2V0Qiwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQ29tcG9zaXRlcy5jaGFpbihjb21wb3NpdGUsIHhPZmZzZXRBLCB5T2Zmc2V0QSwgeE9mZnNldEIsIHlPZmZzZXRCLCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0cyBib2RpZXMgaW4gdGhlIGNvbXBvc2l0ZSB3aXRoIGNvbnN0cmFpbnRzIGluIGEgZ3JpZCBwYXR0ZXJuLCB3aXRoIG9wdGlvbmFsIGNyb3NzIGJyYWNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I21lc2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQ29tcG9zaXRlVHlwZX0gY29tcG9zaXRlIC0gVGhlIGNvbXBvc2l0ZSBpbiB3aGljaCBhbGwgYm9kaWVzIHdpbGwgYmUgY2hhaW5lZCB0b2dldGhlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zIC0gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBtZXNoLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3MgLSBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1lc2guXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNyb3NzQnJhY2UgLSBDcmVhdGUgY3Jvc3MgYnJhY2VzIGZvciB0aGUgbWVzaCBhcyB3ZWxsP1xyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbXBvc2l0ZVR5cGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLlxyXG4gICAgICovXHJcbiAgICBtZXNoOiBmdW5jdGlvbiAoY29tcG9zaXRlLCBjb2x1bW5zLCByb3dzLCBjcm9zc0JyYWNlLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBDb21wb3NpdGVzLm1lc2goY29tcG9zaXRlLCBjb2x1bW5zLCByb3dzLCBjcm9zc0JyYWNlLCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggYSBOZXd0b24ncyBDcmFkbGUgc2V0dXAgb2YgYm9kaWVzIGFuZCBjb25zdHJhaW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I25ld3RvbnNDcmFkbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBjcmFkbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGNyYWRsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgLSBUaGUgbnVtYmVyIG9mIGJhbGxzIGluIHRoZSBjcmFkbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSByYWRpdXMgb2YgZWFjaCBiYWxsIGluIHRoZSBjcmFkbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGxlbmd0aCBvZiB0aGUgJ3N0cmluZycgdGhlIGJhbGxzIGhhbmcgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Db21wb3NpdGVUeXBlfSBBIE5ld3RvbidzIGNyYWRsZSBjb21wb3NpdGUuXHJcbiAgICAgKi9cclxuICAgIG5ld3RvbnNDcmFkbGU6IGZ1bmN0aW9uICh4LCB5LCBudW1iZXIsIHNpemUsIGxlbmd0aClcclxuICAgIHtcclxuICAgICAgICB2YXIgY29tcG9zaXRlID0gQ29tcG9zaXRlcy5uZXd0b25zQ3JhZGxlKHgsIHksIG51bWJlciwgc2l6ZSwgbGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZC5hZGQoY29tcG9zaXRlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggc2ltcGxlIGNhciBzZXR1cCBvZiBib2RpZXMgYW5kIGNvbnN0cmFpbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjY2FyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBjYXIgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGNhciBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGNhciBjaGFzaXMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY2FyIGNoYXNpcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aGVlbFNpemUgLSBUaGUgcmFkaXVzIG9mIHRoZSBjYXIgd2hlZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbXBvc2l0ZVR5cGV9IEEgbmV3IGNvbXBvc2l0ZSBjYXIgYm9keS5cclxuICAgICAqL1xyXG4gICAgY2FyOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgd2hlZWxTaXplKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb21wb3NpdGUgPSBDb21wb3NpdGVzLmNhcih4LCB5LCB3aWR0aCwgaGVpZ2h0LCB3aGVlbFNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLmFkZChjb21wb3NpdGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgc29mdCBib2R5IGxpa2Ugb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3Rvcnkjc29mdEJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBjb21wb3NpdGUgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBjb21wb3NpdGUgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbnMgLSBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIENvbXBvc2l0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzIC0gVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBDb21wb3NpdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uR2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBjb2x1bW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93R2FwIC0gVGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCByb3cuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNyb3NzQnJhY2UgLSBgdHJ1ZWAgdG8gY3JlYXRlIGNyb3NzIGJyYWNlcyBiZXR3ZWVuIHRoZSBib2RpZXMsIG9yIGBmYWxzZWAgdG8gY3JlYXRlIGp1c3Qgc3RyYWlnaHQgYnJhY2VzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhcnRpY2xlUmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGlzIGNpcmNsdWxhciBjb21wb3NpdGUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbcGFydGljbGVPcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckNvbnN0cmFpbnRDb25maWd9IFtjb25zdHJhaW50T3B0aW9uc10gLSBBbiBvcHRpb25hbCBDb25zdHJhaW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBDb25zdHJhaW50IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQ29tcG9zaXRlVHlwZX0gQSBuZXcgY29tcG9zaXRlIHNpbXBsZSBzb2Z0IGJvZHkuXHJcbiAgICAgKi9cclxuICAgIHNvZnRCb2R5OiBmdW5jdGlvbiAoeCwgeSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNyb3NzQnJhY2UsIHBhcnRpY2xlUmFkaXVzLCBwYXJ0aWNsZU9wdGlvbnMsIGNvbnN0cmFpbnRPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb21wb3NpdGUgPSBDb21wb3NpdGVzLnNvZnRCb2R5KHgsIHksIGNvbHVtbnMsIHJvd3MsIGNvbHVtbkdhcCwgcm93R2FwLCBjcm9zc0JyYWNlLCBwYXJ0aWNsZVJhZGl1cywgcGFydGljbGVPcHRpb25zLCBjb25zdHJhaW50T3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGNvbXBvc2l0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgYW4gYWxpYXMgZm9yIGBGYWN0b3J5LmNvbnN0cmFpbnRgLlxyXG4gICAgICogXHJcbiAgICAgKiBDb25zdHJhaW50cyAob3Igam9pbnRzKSBhcmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGF0IGEgZml4ZWQgZGlzdGFuY2UgbXVzdCBiZSBtYWludGFpbmVkXHJcbiAgICAgKiBiZXR3ZWVuIHR3byBib2RpZXMsIG9yIGEgYm9keSBhbmQgYSBmaXhlZCB3b3JsZC1zcGFjZSBwb3NpdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHN0aWZmbmVzcyBvZiBjb25zdHJhaW50cyBjYW4gYmUgbW9kaWZpZWQgdG8gY3JlYXRlIHNwcmluZ3Mgb3IgZWxhc3RpYy5cclxuICAgICAqIFxyXG4gICAgICogVG8gc2ltdWxhdGUgYSByZXZvbHV0ZSBjb25zdHJhaW50IChvciBwaW4gam9pbnQpIHNldCBgbGVuZ3RoOiAwYCBhbmQgYSBoaWdoIGBzdGlmZm5lc3NgXHJcbiAgICAgKiB2YWx1ZSAoZS5nLiBgMC43YCBvciBhYm92ZSkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBjb25zdHJhaW50IGlzIHVuc3RhYmxlLCB0cnkgbG93ZXJpbmcgdGhlIGBzdGlmZm5lc3NgIHZhbHVlIGFuZCAvIG9yIGluY3JlYXNpbmdcclxuICAgICAqIGBjb25zdHJhaW50SXRlcmF0aW9uc2Agd2l0aGluIHRoZSBNYXR0ZXIgQ29uZmlnLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgY29tcG91bmQgYm9kaWVzLCBjb25zdHJhaW50cyBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmVudCBib2R5IGFuZCBub3Qgb25lIG9mIGl0cyBwYXJ0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I2pvaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QSAtIFRoZSBmaXJzdCBwb3NzaWJsZSBgQm9keWAgdGhhdCB0aGlzIGNvbnN0cmFpbnQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QiAtIFRoZSBzZWNvbmQgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIC0gQSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXN0aW5nIGxlbmd0aCBvZiB0aGUgY29uc3RyYWludC4gSWYgbm90IGdpdmVuIGl0IGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBpbiBgQ29uc3RyYWludC5jcmVhdGVgIGZyb20gaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBhbmQgYGNvbnN0cmFpbnQuYm9keUJgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGlmZm5lc3M9MV0gLSBBIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgc2hvdWxkIGJlIHZlcnkgc3RpZmYuIEEgdmFsdWUgb2YgYDAuMmAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgYWN0cyBhcyBhIHNvZnQgc3ByaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBBIE1hdHRlciBKUyBDb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICBqb2ludDogZnVuY3Rpb24gKGJvZHlBLCBib2R5QiwgbGVuZ3RoLCBzdGlmZm5lc3MsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWludChib2R5QSwgYm9keUIsIGxlbmd0aCwgc3RpZmZuZXNzLCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhbiBhbGlhcyBmb3IgYEZhY3RvcnkuY29uc3RyYWludGAuXHJcbiAgICAgKiBcclxuICAgICAqIENvbnN0cmFpbnRzIChvciBqb2ludHMpIGFyZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoYXQgYSBmaXhlZCBkaXN0YW5jZSBtdXN0IGJlIG1haW50YWluZWRcclxuICAgICAqIGJldHdlZW4gdHdvIGJvZGllcywgb3IgYSBib2R5IGFuZCBhIGZpeGVkIHdvcmxkLXNwYWNlIHBvc2l0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgc3RpZmZuZXNzIG9mIGNvbnN0cmFpbnRzIGNhbiBiZSBtb2RpZmllZCB0byBjcmVhdGUgc3ByaW5ncyBvciBlbGFzdGljLlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBzaW11bGF0ZSBhIHJldm9sdXRlIGNvbnN0cmFpbnQgKG9yIHBpbiBqb2ludCkgc2V0IGBsZW5ndGg6IDBgIGFuZCBhIGhpZ2ggYHN0aWZmbmVzc2BcclxuICAgICAqIHZhbHVlIChlLmcuIGAwLjdgIG9yIGFib3ZlKS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGNvbnN0cmFpbnQgaXMgdW5zdGFibGUsIHRyeSBsb3dlcmluZyB0aGUgYHN0aWZmbmVzc2AgdmFsdWUgYW5kIC8gb3IgaW5jcmVhc2luZ1xyXG4gICAgICogYGNvbnN0cmFpbnRJdGVyYXRpb25zYCB3aXRoaW4gdGhlIE1hdHRlciBDb25maWcuXHJcbiAgICAgKiBcclxuICAgICAqIEZvciBjb21wb3VuZCBib2RpZXMsIGNvbnN0cmFpbnRzIG11c3QgYmUgYXBwbGllZCB0byB0aGUgcGFyZW50IGJvZHkgYW5kIG5vdCBvbmUgb2YgaXRzIHBhcnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3Rvcnkjc3ByaW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QSAtIFRoZSBmaXJzdCBwb3NzaWJsZSBgQm9keWAgdGhhdCB0aGlzIGNvbnN0cmFpbnQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QiAtIFRoZSBzZWNvbmQgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIC0gQSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXN0aW5nIGxlbmd0aCBvZiB0aGUgY29uc3RyYWludC4gSWYgbm90IGdpdmVuIGl0IGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBpbiBgQ29uc3RyYWludC5jcmVhdGVgIGZyb20gaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBhbmQgYGNvbnN0cmFpbnQuYm9keUJgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGlmZm5lc3M9MV0gLSBBIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgc2hvdWxkIGJlIHZlcnkgc3RpZmYuIEEgdmFsdWUgb2YgYDAuMmAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgYWN0cyBhcyBhIHNvZnQgc3ByaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBBIE1hdHRlciBKUyBDb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICBzcHJpbmc6IGZ1bmN0aW9uIChib2R5QSwgYm9keUIsIGxlbmd0aCwgc3RpZmZuZXNzLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbnQoYm9keUEsIGJvZHlCLCBsZW5ndGgsIHN0aWZmbmVzcywgb3B0aW9ucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RyYWludHMgKG9yIGpvaW50cykgYXJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhhdCBhIGZpeGVkIGRpc3RhbmNlIG11c3QgYmUgbWFpbnRhaW5lZFxyXG4gICAgICogYmV0d2VlbiB0d28gYm9kaWVzLCBvciBhIGJvZHkgYW5kIGEgZml4ZWQgd29ybGQtc3BhY2UgcG9zaXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBzdGlmZm5lc3Mgb2YgY29uc3RyYWludHMgY2FuIGJlIG1vZGlmaWVkIHRvIGNyZWF0ZSBzcHJpbmdzIG9yIGVsYXN0aWMuXHJcbiAgICAgKiBcclxuICAgICAqIFRvIHNpbXVsYXRlIGEgcmV2b2x1dGUgY29uc3RyYWludCAob3IgcGluIGpvaW50KSBzZXQgYGxlbmd0aDogMGAgYW5kIGEgaGlnaCBgc3RpZmZuZXNzYFxyXG4gICAgICogdmFsdWUgKGUuZy4gYDAuN2Agb3IgYWJvdmUpLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgY29uc3RyYWludCBpcyB1bnN0YWJsZSwgdHJ5IGxvd2VyaW5nIHRoZSBgc3RpZmZuZXNzYCB2YWx1ZSBhbmQgLyBvciBpbmNyZWFzaW5nXHJcbiAgICAgKiBgY29uc3RyYWludEl0ZXJhdGlvbnNgIHdpdGhpbiB0aGUgTWF0dGVyIENvbmZpZy5cclxuICAgICAqIFxyXG4gICAgICogRm9yIGNvbXBvdW5kIGJvZGllcywgY29uc3RyYWludHMgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJlbnQgYm9keSBhbmQgbm90IG9uZSBvZiBpdHMgcGFydHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNjb25zdHJhaW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QSAtIFRoZSBmaXJzdCBwb3NzaWJsZSBgQm9keWAgdGhhdCB0aGlzIGNvbnN0cmFpbnQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QiAtIFRoZSBzZWNvbmQgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIC0gQSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXN0aW5nIGxlbmd0aCBvZiB0aGUgY29uc3RyYWludC4gSWYgbm90IGdpdmVuIGl0IGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBpbiBgQ29uc3RyYWludC5jcmVhdGVgIGZyb20gaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBhbmQgYGNvbnN0cmFpbnQuYm9keUJgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGlmZm5lc3M9MV0gLSBBIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgc2hvdWxkIGJlIHZlcnkgc3RpZmYuIEEgdmFsdWUgb2YgYDAuMmAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgYWN0cyBhcyBhIHNvZnQgc3ByaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBBIE1hdHRlciBKUyBDb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICBjb25zdHJhaW50OiBmdW5jdGlvbiAoYm9keUEsIGJvZHlCLCBsZW5ndGgsIHN0aWZmbmVzcywgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RpZmZuZXNzID09PSB1bmRlZmluZWQpIHsgc3RpZmZuZXNzID0gMTsgfVxyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHsgb3B0aW9ucyA9IHt9OyB9XHJcblxyXG4gICAgICAgIG9wdGlvbnMuYm9keUEgPSAoYm9keUEudHlwZSA9PT0gJ2JvZHknKSA/IGJvZHlBIDogYm9keUEuYm9keTtcclxuICAgICAgICBvcHRpb25zLmJvZHlCID0gKGJvZHlCLnR5cGUgPT09ICdib2R5JykgPyBib2R5QiA6IGJvZHlCLmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghaXNOYU4obGVuZ3RoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID0gbGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3B0aW9ucy5zdGlmZm5lc3MgPSBzdGlmZm5lc3M7XHJcblxyXG4gICAgICAgIHZhciBjb25zdHJhaW50ID0gQ29uc3RyYWludC5jcmVhdGUob3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMud29ybGQuYWRkKGNvbnN0cmFpbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29uc3RyYWludDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJhaW50cyAob3Igam9pbnRzKSBhcmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGF0IGEgZml4ZWQgZGlzdGFuY2UgbXVzdCBiZSBtYWludGFpbmVkXHJcbiAgICAgKiBiZXR3ZWVuIHR3byBib2RpZXMsIG9yIGEgYm9keSBhbmQgYSBmaXhlZCB3b3JsZC1zcGFjZSBwb3NpdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQSB3b3JsZCBjb25zdHJhaW50IGhhcyBvbmx5IG9uZSBib2R5LCB5b3Ugc2hvdWxkIHNwZWNpZnkgYSBgcG9pbnRBYCBwb3NpdGlvbiBpblxyXG4gICAgICogdGhlIGNvbnN0cmFpbnQgb3B0aW9ucyBwYXJhbWV0ZXIgdG8gYXR0YWNoIHRoZSBjb25zdHJhaW50IHRvIHRoZSB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHN0aWZmbmVzcyBvZiBjb25zdHJhaW50cyBjYW4gYmUgbW9kaWZpZWQgdG8gY3JlYXRlIHNwcmluZ3Mgb3IgZWxhc3RpYy5cclxuICAgICAqIFxyXG4gICAgICogVG8gc2ltdWxhdGUgYSByZXZvbHV0ZSBjb25zdHJhaW50IChvciBwaW4gam9pbnQpIHNldCBgbGVuZ3RoOiAwYCBhbmQgYSBoaWdoIGBzdGlmZm5lc3NgXHJcbiAgICAgKiB2YWx1ZSAoZS5nLiBgMC43YCBvciBhYm92ZSkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBjb25zdHJhaW50IGlzIHVuc3RhYmxlLCB0cnkgbG93ZXJpbmcgdGhlIGBzdGlmZm5lc3NgIHZhbHVlIGFuZCAvIG9yIGluY3JlYXNpbmdcclxuICAgICAqIGBjb25zdHJhaW50SXRlcmF0aW9uc2Agd2l0aGluIHRoZSBNYXR0ZXIgQ29uZmlnLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgY29tcG91bmQgYm9kaWVzLCBjb25zdHJhaW50cyBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmVudCBib2R5IGFuZCBub3Qgb25lIG9mIGl0cyBwYXJ0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I3dvcmxkQ29uc3RyYWludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keSAtIFRoZSBNYXR0ZXIgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGhdIC0gQSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXN0aW5nIGxlbmd0aCBvZiB0aGUgY29uc3RyYWludC4gSWYgbm90IGdpdmVuIGl0IGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSBpbiBgQ29uc3RyYWludC5jcmVhdGVgIGZyb20gaW5pdGlhbCBwb3NpdGlvbnMgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBhbmQgYGNvbnN0cmFpbnQuYm9keUJgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGlmZm5lc3M9MV0gLSBBIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgc2hvdWxkIGJlIHZlcnkgc3RpZmYuIEEgdmFsdWUgb2YgYDAuMmAgbWVhbnMgdGhlIGNvbnN0cmFpbnQgYWN0cyBhcyBhIHNvZnQgc3ByaW5nLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBBIE1hdHRlciBKUyBDb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICB3b3JsZENvbnN0cmFpbnQ6IGZ1bmN0aW9uIChib2R5LCBsZW5ndGgsIHN0aWZmbmVzcywgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoc3RpZmZuZXNzID09PSB1bmRlZmluZWQpIHsgc3RpZmZuZXNzID0gMTsgfVxyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHsgb3B0aW9ucyA9IHt9OyB9XHJcblxyXG4gICAgICAgIG9wdGlvbnMuYm9keUIgPSAoYm9keS50eXBlID09PSAnYm9keScpID8gYm9keSA6IGJvZHkuYm9keTtcclxuXHJcbiAgICAgICAgaWYgKCFpc05hTihsZW5ndGgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggPSBsZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRpb25zLnN0aWZmbmVzcyA9IHN0aWZmbmVzcztcclxuXHJcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBDb25zdHJhaW50LmNyZWF0ZShvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZC5hZGQoY29uc3RyYWludCk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb25zdHJhaW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGFuIGFsaWFzIGZvciBgRmFjdG9yeS5wb2ludGVyQ29uc3RyYWludGAuXHJcbiAgICAgKiBcclxuICAgICAqIEEgUG9pbnRlciBDb25zdHJhaW50IGlzIGEgc3BlY2lhbCB0eXBlIG9mIGNvbnN0cmFpbnQgdGhhdCBhbGxvd3MgeW91IHRvIGNsaWNrXHJcbiAgICAgKiBhbmQgZHJhZyBib2RpZXMgaW4gYSBNYXR0ZXIgV29ybGQuIEl0IG1vbml0b3JzIHRoZSBhY3RpdmUgUG9pbnRlcnMgaW4gYSBTY2VuZSxcclxuICAgICAqIGFuZCB3aGVuIG9uZSBpcyBwcmVzc2VkIGRvd24gaXQgY2hlY2tzIHRvIHNlZSBpZiB0aGF0IGhpdCBhbnkgcGFydCBvZiBhbnkgYWN0aXZlXHJcbiAgICAgKiBib2R5IGluIHRoZSB3b3JsZC4gSWYgaXQgZGlkLCBhbmQgdGhlIGJvZHkgaGFzIGlucHV0IGVuYWJsZWQsIGl0IHdpbGwgYmVnaW4gdG9cclxuICAgICAqIGRyYWcgaXQgdW50aWwgZWl0aGVyIHJlbGVhc2VkLCBvciB5b3Ugc3RvcCBpdCB2aWEgdGhlIGBzdG9wRHJhZ2AgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIGFkanVzdCB0aGUgc3RpZmZuZXNzLCBsZW5ndGggYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbnN0cmFpbnQgdmlhXHJcbiAgICAgKiB0aGUgYG9wdGlvbnNgIG9iamVjdCBvbiBjcmVhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5GYWN0b3J5I21vdXNlU3ByaW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJDb25zdHJhaW50Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBDb25zdHJhaW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBDb25zdHJhaW50IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQ29uc3RyYWludFR5cGV9IEEgTWF0dGVyIEpTIENvbnN0cmFpbnQuXHJcbiAgICAgKi9cclxuICAgIG1vdXNlU3ByaW5nOiBmdW5jdGlvbiAob3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb2ludGVyQ29uc3RyYWludChvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFBvaW50ZXIgQ29uc3RyYWludCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBjb25zdHJhaW50IHRoYXQgYWxsb3dzIHlvdSB0byBjbGlja1xyXG4gICAgICogYW5kIGRyYWcgYm9kaWVzIGluIGEgTWF0dGVyIFdvcmxkLiBJdCBtb25pdG9ycyB0aGUgYWN0aXZlIFBvaW50ZXJzIGluIGEgU2NlbmUsXHJcbiAgICAgKiBhbmQgd2hlbiBvbmUgaXMgcHJlc3NlZCBkb3duIGl0IGNoZWNrcyB0byBzZWUgaWYgdGhhdCBoaXQgYW55IHBhcnQgb2YgYW55IGFjdGl2ZVxyXG4gICAgICogYm9keSBpbiB0aGUgd29ybGQuIElmIGl0IGRpZCwgYW5kIHRoZSBib2R5IGhhcyBpbnB1dCBlbmFibGVkLCBpdCB3aWxsIGJlZ2luIHRvXHJcbiAgICAgKiBkcmFnIGl0IHVudGlsIGVpdGhlciByZWxlYXNlZCwgb3IgeW91IHN0b3AgaXQgdmlhIHRoZSBgc3RvcERyYWdgIG1ldGhvZC5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhZGp1c3QgdGhlIHN0aWZmbmVzcywgbGVuZ3RoIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSBjb25zdHJhaW50IHZpYVxyXG4gICAgICogdGhlIGBvcHRpb25zYCBvYmplY3Qgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNwb2ludGVyQ29uc3RyYWludFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29uc3RyYWludENvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQ29uc3RyYWludCBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBBIE1hdHRlciBKUyBDb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICBwb2ludGVyQ29uc3RyYWludDogZnVuY3Rpb24gKG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0ge307IH1cclxuXHJcbiAgICAgICAgaWYgKCFvcHRpb25zLmhhc093blByb3BlcnR5KCdyZW5kZXInKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucmVuZGVyID0geyB2aXNpYmxlOiBmYWxzZSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBvaW50ZXJDb25zdHJhaW50ID0gbmV3IFBvaW50ZXJDb25zdHJhaW50KHRoaXMuc2NlbmUsIHRoaXMud29ybGQsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLmFkZChwb2ludGVyQ29uc3RyYWludC5jb25zdHJhaW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBvaW50ZXJDb25zdHJhaW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBNYXR0ZXIgUGh5c2ljcyBJbWFnZSBHYW1lIE9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogQW4gSW1hZ2UgaXMgYSBsaWdodC13ZWlnaHQgR2FtZSBPYmplY3QgdXNlZnVsIGZvciB0aGUgZGlzcGxheSBvZiBzdGF0aWMgaW1hZ2VzIGluIHlvdXIgZ2FtZSxcclxuICAgICAqIHN1Y2ggYXMgbG9nb3MsIGJhY2tncm91bmRzLCBzY2VuZXJ5IG9yIG90aGVyIG5vbi1hbmltYXRlZCBlbGVtZW50cy4gSW1hZ2VzIGNhbiBoYXZlIGlucHV0XHJcbiAgICAgKiBldmVudHMgYW5kIHBoeXNpY3MgYm9kaWVzLCBvciBiZSB0d2VlbmVkLCB0aW50ZWQgb3Igc2Nyb2xsZWQuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBhblxyXG4gICAgICogSW1hZ2UgYW5kIGEgU3ByaXRlIGlzIHRoYXQgeW91IGNhbm5vdCBhbmltYXRlIGFuIEltYWdlIGFzIHRoZXkgZG8gbm90IGhhdmUgdGhlIEFuaW1hdGlvbiBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNpbWFnZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtmcmFtZV0gLSBBbiBvcHRpb25hbCBmcmFtZSBmcm9tIHRoZSBUZXh0dXJlIHRoaXMgR2FtZSBPYmplY3QgaXMgcmVuZGVyaW5nIHdpdGguIFNldCB0byBgbnVsbGAgdG8gc2tpcCB0aGlzIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5JbWFnZX0gVGhlIE1hdHRlciBJbWFnZSBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaW1hZ2U6IGZ1bmN0aW9uICh4LCB5LCBrZXksIGZyYW1lLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbWFnZSA9IG5ldyBNYXR0ZXJJbWFnZSh0aGlzLndvcmxkLCB4LCB5LCBrZXksIGZyYW1lLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5zeXMuZGlzcGxheUxpc3QuYWRkKGltYWdlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGltYWdlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSB3cmFwcGVyIGFyb3VuZCBhIFRpbGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBjb3JyZXNwb25kaW5nIE1hdHRlciBib2R5LiBBIHRpbGUgY2FuIG9ubHlcclxuICAgICAqIGhhdmUgb25lIE1hdHRlciBib2R5IGFzc29jaWF0ZWQgd2l0aCBpdC4gWW91IGNhbiBlaXRoZXIgcGFzcyBpbiBhbiBleGlzdGluZyBNYXR0ZXIgYm9keSBmb3JcclxuICAgICAqIHRoZSB0aWxlIG9yIGFsbG93IHRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgYm9keSBmb3IgeW91LiBJZiB0aGUgVGlsZSBoYXMgYVxyXG4gICAgICogY29sbGlzaW9uIGdyb3VwIChkZWZpbmVkIGluIFRpbGVkKSwgdGhvc2Ugc2hhcGVzIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJvZHkuIElmIG5vdCwgdGhlXHJcbiAgICAgKiB0aWxlJ3MgcmVjdGFuZ2xlIGJvdW5kaW5nIGJveCB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNvcnJlc3BvbmRpbmcgYm9keSB3aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlIFRpbGUgaXRzZWxmIHZpYSBUaWxlLnBoeXNpY3MubWF0dGVyQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBub3QgYWxsIFRpbGVkIGNvbGxpc2lvbiBzaGFwZXMgYXJlIHN1cHBvcnRlZC4gU2VlXHJcbiAgICAgKiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuVGlsZUJvZHkjc2V0RnJvbVRpbGVDb2xsaXNpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSN0aWxlQm9keVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gdGlsZSAtIFRoZSB0YXJnZXQgdGlsZSB0aGF0IHNob3VsZCBoYXZlIGEgTWF0dGVyIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJUaWxlT3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIE1hdHRlciBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keX0gVGhlIE1hdHRlciBUaWxlIEJvZHkgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRpbGVCb2R5OiBmdW5jdGlvbiAodGlsZSwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1hdHRlclRpbGVCb2R5KHRoaXMud29ybGQsIHRpbGUsIG9wdGlvbnMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBNYXR0ZXIgUGh5c2ljcyBTcHJpdGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQSBTcHJpdGUgR2FtZSBPYmplY3QgaXMgdXNlZCBmb3IgdGhlIGRpc3BsYXkgb2YgYm90aCBzdGF0aWMgYW5kIGFuaW1hdGVkIGltYWdlcyBpbiB5b3VyIGdhbWUuXHJcbiAgICAgKiBTcHJpdGVzIGNhbiBoYXZlIGlucHV0IGV2ZW50cyBhbmQgcGh5c2ljcyBib2RpZXMuIFRoZXkgY2FuIGFsc28gYmUgdHdlZW5lZCwgdGludGVkLCBzY3JvbGxlZFxyXG4gICAgICogYW5kIGFuaW1hdGVkLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBhIFNwcml0ZSBhbmQgYW4gSW1hZ2UgR2FtZSBPYmplY3QgaXMgdGhhdCB5b3UgY2Fubm90IGFuaW1hdGUgSW1hZ2VzLlxyXG4gICAgICogQXMgc3VjaCwgU3ByaXRlcyB0YWtlIGEgZnJhY3Rpb24gbG9uZ2VyIHRvIHByb2Nlc3MgYW5kIGhhdmUgYSBsYXJnZXIgQVBJIGZvb3RwcmludCBkdWUgdG8gdGhlIEFuaW1hdGlvblxyXG4gICAgICogQ29tcG9uZW50LiBJZiB5b3UgZG8gbm90IHJlcXVpcmUgYW5pbWF0aW9uIHRoZW4geW91IGNhbiBzYWZlbHkgdXNlIEltYWdlcyB0byByZXBsYWNlIFNwcml0ZXMgaW4gYWxsIGNhc2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3Rvcnkjc3ByaXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC4gU2V0IHRvIGBudWxsYCB0byBza2lwIHRoaXMgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLlNwcml0ZX0gVGhlIE1hdHRlciBTcHJpdGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNwcml0ZTogZnVuY3Rpb24gKHgsIHksIGtleSwgZnJhbWUsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNwcml0ZSA9IG5ldyBNYXR0ZXJTcHJpdGUodGhpcy53b3JsZCwgeCwgeSwga2V5LCBmcmFtZSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzLmRpc3BsYXlMaXN0LmFkZChzcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuc3lzLnVwZGF0ZUxpc3QuYWRkKHNwcml0ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzcHJpdGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYW4gZXhpc3RpbmcgR2FtZSBPYmplY3QgYW5kIGluamVjdHMgYWxsIG9mIHRoZSBNYXR0ZXIgQ29tcG9uZW50cyBpbnRvIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGVuYWJsZXMgeW91IHRvIHVzZSBjb21wb25lbnQgbWV0aG9kcyBzdWNoIGFzIGBzZXRWZWxvY2l0eWAgb3IgYGlzU2Vuc29yYCBkaXJlY3RseSBmcm9tXHJcbiAgICAgKiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gcGFzcyBpbiBlaXRoZXIgYSBNYXR0ZXIgQm9keSBDb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYSBNYXR0ZXIgQm9keSBpbnN0YW5jZVxyXG4gICAgICogdG8gbGluayB3aXRoIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRmFjdG9yeSNnYW1lT2JqZWN0XHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gVGhlIEdhbWUgT2JqZWN0IHRvIGluamVjdCB0aGUgTWF0dGVyIENvbXBvbmVudHMgaW4gdG8uXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ3xNYXR0ZXJKUy5Cb2R5KX0gW29wdGlvbnNdIC0gQSBNYXR0ZXIgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBNYXR0ZXIgQm9keS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvV29ybGQ9dHJ1ZV0gLSBBZGQgdGhpcyBNYXR0ZXIgQm9keSB0byB0aGUgV29ybGQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGF0IGhhZCB0aGUgTWF0dGVyIENvbXBvbmVudHMgaW5qZWN0ZWQgaW50byBpdC5cclxuICAgICAqL1xyXG4gICAgZ2FtZU9iamVjdDogZnVuY3Rpb24gKGdhbWVPYmplY3QsIG9wdGlvbnMsIGFkZFRvV29ybGQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE1hdHRlckdhbWVPYmplY3QodGhpcy53b3JsZCwgZ2FtZU9iamVjdCwgb3B0aW9ucywgYWRkVG9Xb3JsZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBGYWN0b3J5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3RvcnkjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZhY3Rvcnk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBhIGdldHRlciBvciBzZXR0ZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBoYXNHZXR0ZXJPclNldHRlclxyXG4gKiBAcHJpdmF0ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gZGVmIC0gVGhlIG9iamVjdCB0byBjaGVjay5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBpdCBoYXMgYSBnZXR0ZXIgb3Igc2V0dGVyLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBoYXNHZXR0ZXJPclNldHRlciAoZGVmKVxyXG57XHJcbiAgICByZXR1cm4gKCEhZGVmLmdldCAmJiB0eXBlb2YgZGVmLmdldCA9PT0gJ2Z1bmN0aW9uJykgfHwgKCEhZGVmLnNldCAmJiB0eXBlb2YgZGVmLnNldCA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIE1hdHRlciBHYW1lIE9iamVjdCBpcyBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBjb21iaW5lIGFueSBQaGFzZXIgR2FtZSBPYmplY3QsXHJcbiAqIGluY2x1ZGluZyB0aG9zZSB5b3UgaGF2ZSBleHRlbmRlZCBvciBjcmVhdGVkIHlvdXJzZWxmLCB3aXRoIGFsbCBvZiB0aGUgTWF0dGVyIENvbXBvbmVudHMuXHJcbiAqIFxyXG4gKiBUaGlzIGVuYWJsZXMgeW91IHRvIHVzZSBjb21wb25lbnQgbWV0aG9kcyBzdWNoIGFzIGBzZXRWZWxvY2l0eWAgb3IgYGlzU2Vuc29yYCBkaXJlY3RseSBmcm9tXHJcbiAqIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyR2FtZU9iamVjdFxyXG4gKiBAc2luY2UgMy4zLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IHdvcmxkIC0gVGhlIE1hdHRlciB3b3JsZCB0byBhZGQgdGhlIGJvZHkgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IGdhbWVPYmplY3QgLSBUaGUgR2FtZSBPYmplY3QgdGhhdCB3aWxsIGhhdmUgdGhlIE1hdHRlciBib2R5IGFwcGxpZWQgdG8gaXQuXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfE1hdHRlckpTLkJvZHkpfSBbb3B0aW9uc10gLSBBIE1hdHRlciBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhbiBpbnN0YW5jZSBvZiBhIE1hdHRlciBCb2R5LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRUb1dvcmxkPXRydWVdIC0gU2hvdWxkIHRoZSBuZXdseSBjcmVhdGVkIGJvZHkgYmUgaW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIFdvcmxkP1xyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgTWF0dGVyIGJvZHkuXHJcbiAqL1xyXG52YXIgTWF0dGVyR2FtZU9iamVjdCA9IGZ1bmN0aW9uICh3b3JsZCwgZ2FtZU9iamVjdCwgb3B0aW9ucywgYWRkVG9Xb3JsZClcclxue1xyXG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0ge307IH1cclxuICAgIGlmIChhZGRUb1dvcmxkID09PSB1bmRlZmluZWQpIHsgYWRkVG9Xb3JsZCA9IHRydWU7IH1cclxuXHJcbiAgICB2YXIgeCA9IGdhbWVPYmplY3QueDtcclxuICAgIHZhciB5ID0gZ2FtZU9iamVjdC55O1xyXG5cclxuICAgIC8vICBUZW1wIGJvZHkgcG9zIHRvIGF2b2lkIGJvZHkgbnVsbCBjaGVja3NcclxuICAgIGdhbWVPYmplY3QuYm9keSA9IHtcclxuICAgICAgICB0ZW1wOiB0cnVlLFxyXG4gICAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgIHg6IHgsXHJcbiAgICAgICAgICAgIHk6IHlcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBtaXhpbnMgPSBbXHJcbiAgICAgICAgQ29tcG9uZW50cy5Cb3VuY2UsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Db2xsaXNpb24sXHJcbiAgICAgICAgQ29tcG9uZW50cy5Gb3JjZSxcclxuICAgICAgICBDb21wb25lbnRzLkZyaWN0aW9uLFxyXG4gICAgICAgIENvbXBvbmVudHMuR3Jhdml0eSxcclxuICAgICAgICBDb21wb25lbnRzLk1hc3MsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TZW5zb3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TZXRCb2R5LFxyXG4gICAgICAgIENvbXBvbmVudHMuU2xlZXAsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TdGF0aWMsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyAgRmlyc3QgbGV0J3MgaW5qZWN0IGFsbCBvZiB0aGUgY29tcG9uZW50cyBpbnRvIHRoZSBHYW1lIE9iamVjdFxyXG4gICAgbWl4aW5zLmZvckVhY2goZnVuY3Rpb24gKG1peGluKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBtaXhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChoYXNHZXR0ZXJPclNldHRlcihtaXhpbltrZXldKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdhbWVPYmplY3QsIGtleSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGdldDogbWl4aW5ba2V5XS5nZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBtaXhpbltrZXldLnNldFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2FtZU9iamVjdCwga2V5LCB7dmFsdWU6IG1peGluW2tleV19KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICBnYW1lT2JqZWN0LndvcmxkID0gd29ybGQ7XHJcblxyXG4gICAgZ2FtZU9iamVjdC5fdGVtcFZlYzIgPSBuZXcgVmVjdG9yMih4LCB5KTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndHlwZScpICYmIG9wdGlvbnMudHlwZSA9PT0gJ2JvZHknKVxyXG4gICAge1xyXG4gICAgICAgIGdhbWVPYmplY3Quc2V0RXhpc3RpbmdCb2R5KG9wdGlvbnMsIGFkZFRvV29ybGQpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzaGFwZSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnc2hhcGUnLCBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKCFzaGFwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNoYXBlID0gJ3JlY3RhbmdsZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRpb25zLmFkZFRvV29ybGQgPSBhZGRUb1dvcmxkO1xyXG4gICAgXHJcbiAgICAgICAgZ2FtZU9iamVjdC5zZXRCb2R5KHNoYXBlLCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ2FtZU9iamVjdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyR2FtZU9iamVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4vY29tcG9uZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL0dhbWVPYmplY3QnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIEltYWdlID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvaW1hZ2UvSW1hZ2UnKTtcclxudmFyIFBpcGVsaW5lID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cy9QaXBlbGluZScpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBNYXR0ZXIgUGh5c2ljcyBJbWFnZSBHYW1lIE9iamVjdC5cclxuICogXHJcbiAqIEFuIEltYWdlIGlzIGEgbGlnaHQtd2VpZ2h0IEdhbWUgT2JqZWN0IHVzZWZ1bCBmb3IgdGhlIGRpc3BsYXkgb2Ygc3RhdGljIGltYWdlcyBpbiB5b3VyIGdhbWUsXHJcbiAqIHN1Y2ggYXMgbG9nb3MsIGJhY2tncm91bmRzLCBzY2VuZXJ5IG9yIG90aGVyIG5vbi1hbmltYXRlZCBlbGVtZW50cy4gSW1hZ2VzIGNhbiBoYXZlIGlucHV0XHJcbiAqIGV2ZW50cyBhbmQgcGh5c2ljcyBib2RpZXMsIG9yIGJlIHR3ZWVuZWQsIHRpbnRlZCBvciBzY3JvbGxlZC4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGFuXHJcbiAqIEltYWdlIGFuZCBhIFNwcml0ZSBpcyB0aGF0IHlvdSBjYW5ub3QgYW5pbWF0ZSBhbiBJbWFnZSBhcyB0aGV5IGRvIG5vdCBoYXZlIHRoZSBBbmltYXRpb24gY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAY2xhc3MgSW1hZ2VcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkltYWdlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXJcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Cb3VuY2VcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuQ29sbGlzaW9uXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkZvcmNlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkZyaWN0aW9uXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkdyYXZpdHlcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuTWFzc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TZW5zb3JcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2V0Qm9keVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TbGVlcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TdGF0aWNcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlZlbG9jaXR5XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5EZXB0aFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkdldEJvdW5kc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5PcmlnaW5cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuU2Nyb2xsRmFjdG9yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNpemVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGV4dHVyZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UaW50XHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkfSB3b3JsZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBNYXR0ZXIuV29ybGQgaW5zdGFuY2UgdGhhdCB0aGlzIGJvZHkgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIEdhbWUgT2JqZWN0IGluIHRoZSB3b3JsZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlIC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IHdpbGwgdXNlIHRvIHJlbmRlciB3aXRoLCBhcyBzdG9yZWQgaW4gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gQW4gb3B0aW9uYWwgZnJhbWUgZnJvbSB0aGUgVGV4dHVyZSB0aGlzIEdhbWUgT2JqZWN0IGlzIHJlbmRlcmluZyB3aXRoLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAqL1xyXG52YXIgTWF0dGVySW1hZ2UgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEltYWdlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQm91bmNlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ29sbGlzaW9uLFxyXG4gICAgICAgIENvbXBvbmVudHMuRm9yY2UsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GcmljdGlvbixcclxuICAgICAgICBDb21wb25lbnRzLkdyYXZpdHksXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNzLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Vuc29yLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2V0Qm9keSxcclxuICAgICAgICBDb21wb25lbnRzLlNsZWVwLFxyXG4gICAgICAgIENvbXBvbmVudHMuU3RhdGljLFxyXG4gICAgICAgIENvbXBvbmVudHMuVHJhbnNmb3JtLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmVsb2NpdHksXHJcbiAgICAgICAgUGlwZWxpbmVcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBNYXR0ZXJJbWFnZSAod29ybGQsIHgsIHksIHRleHR1cmUsIGZyYW1lLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIEdhbWVPYmplY3QuY2FsbCh0aGlzLCB3b3JsZC5zY2VuZSwgJ0ltYWdlJyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZSh0ZXh0dXJlLCBmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplVG9GcmFtZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBNYXR0ZXIuV29ybGQgaW5zdGFuY2UgdGhhdCB0aGlzIGJvZHkgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5JbWFnZSN3b3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZCA9IHdvcmxkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCB0ZW1wIHZlY3RvciB1c2VkIGZvciB2ZWxvY2l0eSBhbmQgZm9yY2UgY2FsY3VsYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkltYWdlI190ZW1wVmVjMlxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIgPSBuZXcgVmVjdG9yMih4LCB5KTtcclxuXHJcbiAgICAgICAgdmFyIHNoYXBlID0gR2V0RmFzdFZhbHVlKG9wdGlvbnMsICdzaGFwZScsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2hhcGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEJvZHkoc2hhcGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFJlY3RhbmdsZSh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRQaXBlbGluZSgnVGV4dHVyZVRpbnRQaXBlbGluZScpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHRlckltYWdlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBBTElHTl9DT05TVCA9IHJlcXVpcmUoJy4uLy4uL2Rpc3BsYXkvYWxpZ24vY29uc3QnKTtcclxudmFyIEF4ZXMgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9BeGVzJyk7XHJcbnZhciBCb2RpZXMgPSByZXF1aXJlKCcuL2xpYi9mYWN0b3J5L0JvZGllcycpO1xyXG52YXIgQm9keSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgQm9keUJvdW5kcyA9IHJlcXVpcmUoJy4vQm9keUJvdW5kcycpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi9saWIvZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDb21wb3NpdGUgPSByZXF1aXJlKCcuL2xpYi9ib2R5L0NvbXBvc2l0ZScpO1xyXG52YXIgQ29tcG9zaXRlcyA9IHJlcXVpcmUoJy4vbGliL2ZhY3RvcnkvQ29tcG9zaXRlcycpO1xyXG52YXIgQ29uc3RyYWludCA9IHJlcXVpcmUoJy4vbGliL2NvbnN0cmFpbnQvQ29uc3RyYWludCcpO1xyXG52YXIgRGV0ZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb2xsaXNpb24vRGV0ZWN0b3InKTtcclxudmFyIERpc3RhbmNlQmV0d2VlbiA9IHJlcXVpcmUoJy4uLy4uL21hdGgvZGlzdGFuY2UvRGlzdGFuY2VCZXR3ZWVuJyk7XHJcbnZhciBGYWN0b3J5ID0gcmVxdWlyZSgnLi9GYWN0b3J5Jyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgR3JpZCA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9HcmlkJyk7XHJcbnZhciBNYXR0ZXJBdHRyYWN0b3JzID0gcmVxdWlyZSgnLi9saWIvcGx1Z2lucy9NYXR0ZXJBdHRyYWN0b3JzJyk7XHJcbnZhciBNYXR0ZXJDb2xsaXNpb25FdmVudHMgPSByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL01hdHRlckNvbGxpc2lvbkV2ZW50cycpO1xyXG52YXIgTWF0dGVyTGliID0gcmVxdWlyZSgnLi9saWIvY29yZS9NYXR0ZXInKTtcclxudmFyIE1hdHRlcldyYXAgPSByZXF1aXJlKCcuL2xpYi9wbHVnaW5zL01hdHRlcldyYXAnKTtcclxudmFyIE1lcmdlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L01lcmdlJyk7XHJcbnZhciBQYWlyID0gcmVxdWlyZSgnLi9saWIvY29sbGlzaW9uL1BhaXInKTtcclxudmFyIFBhaXJzID0gcmVxdWlyZSgnLi9saWIvY29sbGlzaW9uL1BhaXJzJyk7XHJcbnZhciBQbHVnaW4gPSByZXF1aXJlKCcuL2xpYi9jb3JlL1BsdWdpbicpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi8uLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBRdWVyeSA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9RdWVyeScpO1xyXG52YXIgUmVzb2x2ZXIgPSByZXF1aXJlKCcuL2xpYi9jb2xsaXNpb24vUmVzb2x2ZXInKTtcclxudmFyIFNBVCA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9TQVQnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vc2NlbmUvZXZlbnRzJyk7XHJcbnZhciBTdmcgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9TdmcnKTtcclxudmFyIFZlY3RvciA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L1ZlY3RvcicpO1xyXG52YXIgVmVydGljZXMgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9WZXJ0aWNlcycpO1xyXG52YXIgV29ybGQgPSByZXF1aXJlKCcuL1dvcmxkJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgUGhhc2VyIE1hdHRlciBwbHVnaW4gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIHRoZSBNYXR0ZXIgSlMgUGh5c2ljcyBFbmdpbmUgd2l0aGluIHlvdXIgUGhhc2VyIGdhbWVzLlxyXG4gKiBcclxuICogVW5saWtlIEFyY2FkZSBQaHlzaWNzLCB0aGUgb3RoZXIgcGh5c2ljcyBzeXN0ZW0gcHJvdmlkZWQgd2l0aCBQaGFzZXIsIE1hdHRlciBKUyBpcyBhIGZ1bGwtYm9keSBwaHlzaWNzIHN5c3RlbS5cclxuICogSXQgZmVhdHVyZXM6XHJcbiAqIFxyXG4gKiAqIFJpZ2lkIGJvZGllc1xyXG4gKiAqIENvbXBvdW5kIGJvZGllc1xyXG4gKiAqIENvbXBvc2l0ZSBib2RpZXNcclxuICogKiBDb25jYXZlIGFuZCBjb252ZXggaHVsbHNcclxuICogKiBQaHlzaWNhbCBwcm9wZXJ0aWVzIChtYXNzLCBhcmVhLCBkZW5zaXR5IGV0Yy4pXHJcbiAqICogUmVzdGl0dXRpb24gKGVsYXN0aWMgYW5kIGluZWxhc3RpYyBjb2xsaXNpb25zKVxyXG4gKiAqIENvbGxpc2lvbnMgKGJyb2FkLXBoYXNlLCBtaWQtcGhhc2UgYW5kIG5hcnJvdy1waGFzZSlcclxuICogKiBTdGFibGUgc3RhY2tpbmcgYW5kIHJlc3RpbmdcclxuICogKiBDb25zZXJ2YXRpb24gb2YgbW9tZW50dW1cclxuICogKiBGcmljdGlvbiBhbmQgcmVzaXN0YW5jZVxyXG4gKiAqIENvbnN0cmFpbnRzXHJcbiAqICogR3Jhdml0eVxyXG4gKiAqIFNsZWVwaW5nIGFuZCBzdGF0aWMgYm9kaWVzXHJcbiAqICogUm91bmRlZCBjb3JuZXJzIChjaGFtZmVyaW5nKVxyXG4gKiAqIFZpZXdzICh0cmFuc2xhdGUsIHpvb20pXHJcbiAqICogQ29sbGlzaW9uIHF1ZXJpZXMgKHJheWNhc3RpbmcsIHJlZ2lvbiB0ZXN0cylcclxuICogKiBUaW1lIHNjYWxpbmcgKHNsb3ctbW8sIHNwZWVkLXVwKVxyXG4gKiBcclxuICogQ29uZmlndXJhdGlvbiBvZiBNYXR0ZXIgaXMgaGFuZGxlZCB2aWEgdGhlIE1hdHRlciBXb3JsZCBDb25maWcgb2JqZWN0LCB3aGljaCBjYW4gYmUgcGFzc2VkIGluIGVpdGhlciB0aGVcclxuICogUGhhc2VyIEdhbWUgQ29uZmlnLCBvciBQaGFzZXIgU2NlbmUgQ29uZmlnLiBIZXJlIGlzIGEgYmFzaWMgZXhhbXBsZTpcclxuICogXHJcbiAqIGBgYGpzXHJcbiAqIHBoeXNpY3M6IHtcclxuICogICAgIGRlZmF1bHQ6ICdtYXR0ZXInLFxyXG4gKiAgICAgbWF0dGVyOiB7XHJcbiAqICAgICAgICAgZW5hYmxlU2xlZXBpbmc6IHRydWUsXHJcbiAqICAgICAgICAgZ3Jhdml0eToge1xyXG4gKiAgICAgICAgICAgICB5OiAwXHJcbiAqICAgICAgICAgfSxcclxuICogICAgICAgICBkZWJ1Zzoge1xyXG4gKiAgICAgICAgICAgICBzaG93Qm9keTogdHJ1ZSxcclxuICogICAgICAgICAgICAgc2hvd1N0YXRpY0JvZHk6IHRydWVcclxuICogICAgICAgICB9XHJcbiAqICAgICB9XHJcbiAqIH1cclxuICogYGBgXHJcbiAqIFxyXG4gKiBUaGlzIGNsYXNzIGFjdHMgYXMgYW4gaW50ZXJmYWNlIGJldHdlZW4gYSBQaGFzZXIgU2NlbmUgYW5kIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBNYXR0ZXIgRW5naW5lLlxyXG4gKiBcclxuICogVXNlIGl0IHRvIGFjY2VzcyB0aGUgbW9zdCBjb21tb24gTWF0dGVyIGZlYXR1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLlxyXG4gKiBcclxuICogWW91IGNhbiBmaW5kIGRldGFpbHMsIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIG9uIHRoZSBNYXR0ZXIgSlMgd2Vic2l0ZTogaHR0cHM6Ly9icm0uaW8vbWF0dGVyLWpzL1xyXG4gKlxyXG4gKiBAY2xhc3MgTWF0dGVyUGh5c2ljc1xyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFBoYXNlciBTY2VuZSB0aGF0IG93bnMgdGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICovXHJcbnZhciBNYXR0ZXJQaHlzaWNzID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE1hdHRlclBoeXNpY3MgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBQaGFzZXIgU2NlbmUgdGhhdCBvd25zIHRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2VcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBTeXN0ZW1zIHRoYXQgYmVsb25nIHRvIHRoZSBTY2VuZSBvd25pbmcgdGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBhcnNlZCBNYXR0ZXIgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNjb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlcldvcmxkQ29uZmlnfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIE1hdHRlciBXb3JsZCBjbGFzcy4gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHVwZGF0aW5nIG9mIHRoZVxyXG4gICAgICAgICAqIE1hdHRlciBQaHlzaWNzIHdvcmxkLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGRlYnVnIGRyYXdpbmcgZnVuY3Rpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3Mjd29ybGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud29ybGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBNYXR0ZXIgRmFjdG9yeS4gVGhpcyBjbGFzcyBwcm92aWRlcyBsb3RzIG9mIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYVxyXG4gICAgICAgICAqIHdpZGUgdmFyaWV0eSBvZiBwaHlzaWNzIG9iamVjdHMgYW5kIGFkZHMgdGhlbSBhdXRvbWF0aWNhbGx5IHRvIHRoZSBNYXR0ZXIgV29ybGQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB0byBjdXQtZG93biBvbiB0aGUgYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQgaW4geW91ciBnYW1lLCBob3dldmVyLFxyXG4gICAgICAgICAqIHVzZSBvZiB0aGUgRmFjdG9yeSBpcyBlbnRpcmVseSBvcHRpb25hbCBhbmQgc2hvdWxkIGJlIHNlZW4gYXMgYSBkZXZlbG9wbWVudCBhaWQuIEl0J3NcclxuICAgICAgICAgKiBwZXJmZWN0bHkgcG9zc2libGUgdG8gY3JlYXRlIGFuZCBhZGQgY29tcG9uZW50cyB0byB0aGUgTWF0dGVyIHdvcmxkIHdpdGhvdXQgdXNpbmcgaXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNhZGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkZhY3Rvcnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hZGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBCb2R5IEJvdW5kcyBjbGFzcy4gVGhpcyBjbGFzcyBjb250YWlucyBmdW5jdGlvbnMgdXNlZCBmb3IgZ2V0dGluZyB0aGVcclxuICAgICAgICAgKiB3b3JsZCBwb3NpdGlvbiBmcm9tIHZhcmlvdXMgcG9pbnRzIGFyb3VuZCB0aGUgYm91bmRzIG9mIGEgcGh5c2ljcyBib2R5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjYm9keUJvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQm9keUJvdW5kc31cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib2R5Qm91bmRzO1xyXG5cclxuICAgICAgICAvLyAgQm9keVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuQm9keWAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgYm9keSBtb2RlbHMuXHJcbiAgICAgICAgICogQSBgTWF0dGVyLkJvZHlgIGlzIGEgcmlnaWQgYm9keSB0aGF0IGNhbiBiZSBzaW11bGF0ZWQgYnkgYSBgTWF0dGVyLkVuZ2luZWAuXHJcbiAgICAgICAgICogRmFjdG9yaWVzIGZvciBjb21tb25seSB1c2VkIGJvZHkgY29uZmlndXJhdGlvbnMgKHN1Y2ggYXMgcmVjdGFuZ2xlcywgY2lyY2xlcyBhbmQgb3RoZXIgcG9seWdvbnMpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYEJvZGllc2AgbW9kdWxlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjYm9keVxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5Cb2R5RmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib2R5ID0gQm9keTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuQ29tcG9zaXRlYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuQ29tcG9zaXRlYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBjb21wb3NpdGUgYm9kaWVzLlxyXG4gICAgICAgICAqIEEgY29tcG9zaXRlIGJvZHkgaXMgYSBjb2xsZWN0aW9uIG9mIGBNYXR0ZXIuQm9keWAsIGBNYXR0ZXIuQ29uc3RyYWludGAgYW5kIG90aGVyIGBNYXR0ZXIuQ29tcG9zaXRlYCwgdGhlcmVmb3JlIGNvbXBvc2l0ZXMgZm9ybSBhIHRyZWUgc3RydWN0dXJlLlxyXG4gICAgICAgICAqIEl0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB0byBtb2RpZnkgY29tcG9zaXRlcywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZWlyIHByb3BlcnRpZXMuXHJcbiAgICAgICAgICogTm90ZSB0aGF0IHRoZSBgTWF0dGVyLldvcmxkYCBvYmplY3QgaXMgYWxzbyBhIHR5cGUgb2YgYE1hdHRlci5Db21wb3NpdGVgIGFuZCBhcyBzdWNoIGFsbCBjb21wb3NpdGUgbWV0aG9kcyBoZXJlIGNhbiBhbHNvIG9wZXJhdGUgb24gYSBgTWF0dGVyLldvcmxkYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2NvbXBvc2l0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5Db21wb3NpdGVGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXBvc2l0ZSA9IENvbXBvc2l0ZTtcclxuXHJcbiAgICAgICAgLy8gIENvbGxpc2lvbjpcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuRGV0ZWN0b3JgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5EZXRlY3RvcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGRldGVjdGluZyBjb2xsaXNpb25zIGdpdmVuIGEgc2V0IG9mIHBhaXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjZGV0ZWN0b3JcclxuICAgICAgICAgKiBAdHlwZSB7TWF0dGVySlMuRGV0ZWN0b3JGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRldGVjdG9yID0gRGV0ZWN0b3I7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgTWF0dGVyLkdyaWRgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5HcmlkYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBjb2xsaXNpb24gYnJvYWRwaGFzZSBncmlkIHN0cnVjdHVyZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNncmlkXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLkdyaWRGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdyaWQgPSBHcmlkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5QYWlyYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuUGFpcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjcGFpclxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5QYWlyRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYWlyID0gUGFpcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuUGFpcnNgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5QYWlyc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXIgc2V0cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3BhaXJzXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlBhaXJzRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wYWlycyA9IFBhaXJzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5RdWVyeWAgbW9kdWxlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBgTWF0dGVyLlF1ZXJ5YCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyBjb2xsaXNpb24gcXVlcmllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3F1ZXJ5XHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlF1ZXJ5RmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5xdWVyeSA9IFF1ZXJ5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5SZXNvbHZlcmAgbW9kdWxlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBgTWF0dGVyLlJlc29sdmVyYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgcmVzb2x2aW5nIGNvbGxpc2lvbiBwYWlycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3Jlc29sdmVyXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlJlc29sdmVyRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IFJlc29sdmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5TQVRgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5TQVRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBkZXRlY3RpbmcgY29sbGlzaW9ucyB1c2luZyB0aGUgU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzYXRcclxuICAgICAgICAgKiBAdHlwZSB7TWF0dGVySlMuU0FURmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zYXQgPSBTQVQ7XHJcblxyXG4gICAgICAgIC8vICBDb25zdHJhaW50XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgTWF0dGVyLkNvbnN0cmFpbnRgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5Db25zdHJhaW50YCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBjb25zdHJhaW50cy5cclxuICAgICAgICAgKiBDb25zdHJhaW50cyBhcmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGF0IGEgZml4ZWQgZGlzdGFuY2UgbXVzdCBiZSBtYWludGFpbmVkIGJldHdlZW4gdHdvIGJvZGllcyAob3IgYSBib2R5IGFuZCBhIGZpeGVkIHdvcmxkLXNwYWNlIHBvc2l0aW9uKS5cclxuICAgICAgICAgKiBUaGUgc3RpZmZuZXNzIG9mIGNvbnN0cmFpbnRzIGNhbiBiZSBtb2RpZmllZCB0byBjcmVhdGUgc3ByaW5ncyBvciBlbGFzdGljLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjY29uc3RyYWludFxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5Db25zdHJhaW50RmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb25zdHJhaW50ID0gQ29uc3RyYWludDtcclxuXHJcbiAgICAgICAgLy8gIEZhY3RvcnlcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuQm9kaWVzYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuQm9kaWVzYCBtb2R1bGUgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZyByaWdpZCBib2RpZXNcclxuICAgICAgICAgKiB3aXRoIGNvbW1vbmx5IHVzZWQgYm9keSBjb25maWd1cmF0aW9ucyAoc3VjaCBhcyByZWN0YW5nbGVzLCBjaXJjbGVzIGFuZCBvdGhlciBwb2x5Z29ucykuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNib2RpZXNcclxuICAgICAgICAgKiBAdHlwZSB7TWF0dGVySlMuQm9kaWVzRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ib2RpZXMgPSBCb2RpZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgTWF0dGVyLkNvbXBvc2l0ZXNgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5Db21wb3NpdGVzYCBtb2R1bGUgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZyBjb21wb3NpdGUgYm9kaWVzXHJcbiAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIGNvbmZpZ3VyYXRpb25zIChzdWNoIGFzIHN0YWNrcyBhbmQgY2hhaW5zKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2NvbXBvc2l0ZXNcclxuICAgICAgICAgKiBAdHlwZSB7TWF0dGVySlMuQ29tcG9zaXRlc0ZhY3Rvcnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29tcG9zaXRlcyA9IENvbXBvc2l0ZXM7XHJcblxyXG4gICAgICAgIC8vICBHZW9tZXRyeVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5BeGVzYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuQXhlc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgc2V0cyBvZiBheGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjYXhlc1xyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5BeGVzRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5heGVzID0gQXhlcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuQm91bmRzYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuQm91bmRzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94ZXMgKEFBQkIpLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjYm91bmRzXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLkJvdW5kc0ZhY3Rvcnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYm91bmRzID0gQm91bmRzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5TdmdgIG1vZHVsZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYE1hdHRlci5TdmdgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjb252ZXJ0aW5nIFNWRyBpbWFnZXMgaW50byBhbiBhcnJheSBvZiB2ZWN0b3IgcG9pbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVG8gdXNlIHRoaXMgbW9kdWxlIHlvdSBhbHNvIG5lZWQgdGhlIFNWR1BhdGhTZWcgcG9seWZpbGw6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9nZXJzL3BhdGhzZWdcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3N2Z1xyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5TdmdGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN2ZyA9IFN2ZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBNYXR0ZXIuVmVjdG9yYCBtb2R1bGUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGBNYXR0ZXIuVmVjdG9yYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyB2ZWN0b3JzLlxyXG4gICAgICAgICAqIFZlY3RvcnMgYXJlIHRoZSBiYXNpcyBvZiBhbGwgdGhlIGdlb21ldHJ5IHJlbGF0ZWQgb3BlcmF0aW9ucyBpbiB0aGUgZW5naW5lLlxyXG4gICAgICAgICAqIEEgYE1hdHRlci5WZWN0b3JgIG9iamVjdCBpcyBvZiB0aGUgZm9ybSBgeyB4OiAwLCB5OiAwIH1gLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjdmVjdG9yXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlZlY3RvckZhY3Rvcnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVjdG9yID0gVmVjdG9yO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5WZXJ0aWNlc2AgbW9kdWxlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBgTWF0dGVyLlZlcnRpY2VzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBzZXRzIG9mIHZlcnRpY2VzLlxyXG4gICAgICAgICAqIEEgc2V0IG9mIHZlcnRpY2VzIGlzIGFuIGFycmF5IG9mIGBNYXR0ZXIuVmVjdG9yYCB3aXRoIGFkZGl0aW9uYWwgaW5kZXhpbmcgcHJvcGVydGllcyBpbnNlcnRlZCBieSBgVmVydGljZXMuY3JlYXRlYC5cclxuICAgICAgICAgKiBBIGBNYXR0ZXIuQm9keWAgbWFpbnRhaW5zIGEgc2V0IG9mIHZlcnRpY2VzIHRvIHJlcHJlc2VudCB0aGUgc2hhcGUgb2YgdGhlIG9iamVjdCAoaXRzIGNvbnZleCBodWxsKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3ZlcnRpY2VzXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlZlcnRpY2VzRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IFZlcnRpY2VzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYE1hdHRlci5WZXJ0aWNlc2AgbW9kdWxlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBgTWF0dGVyLlZlcnRpY2VzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBzZXRzIG9mIHZlcnRpY2VzLlxyXG4gICAgICAgICAqIEEgc2V0IG9mIHZlcnRpY2VzIGlzIGFuIGFycmF5IG9mIGBNYXR0ZXIuVmVjdG9yYCB3aXRoIGFkZGl0aW9uYWwgaW5kZXhpbmcgcHJvcGVydGllcyBpbnNlcnRlZCBieSBgVmVydGljZXMuY3JlYXRlYC5cclxuICAgICAgICAgKiBBIGBNYXR0ZXIuQm9keWAgbWFpbnRhaW5zIGEgc2V0IG9mIHZlcnRpY2VzIHRvIHJlcHJlc2VudCB0aGUgc2hhcGUgb2YgdGhlIG9iamVjdCAoaXRzIGNvbnZleCBodWxsKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3ZlcnRzXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlZlcnRpY2VzRmFjdG9yeX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0cyA9IFZlcnRpY2VzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBpbnRlcm5hbCB0ZW1wIHZlY3RvciB1c2VkIGZvciB2ZWxvY2l0eSBhbmQgZm9yY2UgY2FsY3VsYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjX3RlbXBWZWMyXHJcbiAgICAgICAgICogQHR5cGUge01hdHRlckpTLlZlY3Rvcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wVmVjMiA9IFZlY3Rvci5jcmVhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gIE1hdHRlciBwbHVnaW5zXHJcblxyXG4gICAgICAgIGlmIChHZXRWYWx1ZSh0aGlzLmNvbmZpZywgJ3BsdWdpbnMuY29sbGlzaW9uZXZlbnRzJywgdHJ1ZSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNvbGxpc2lvbkV2ZW50c1BsdWdpbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEdldFZhbHVlKHRoaXMuY29uZmlnLCAncGx1Z2lucy5hdHRyYWN0b3JzJywgZmFsc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVBdHRyYWN0b3JQbHVnaW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChHZXRWYWx1ZSh0aGlzLmNvbmZpZywgJ3BsdWdpbnMud3JhcCcsIGZhbHNlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlV3JhcFBsdWdpbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUmVzb2x2ZXIuX3Jlc3RpbmdUaHJlc2ggPSBHZXRWYWx1ZSh0aGlzLmNvbmZpZywgJ3Jlc3RpbmdUaHJlc2gnLCA0KTtcclxuICAgICAgICBSZXNvbHZlci5fcmVzdGluZ1RocmVzaFRhbmdlbnQgPSBHZXRWYWx1ZSh0aGlzLmNvbmZpZywgJ3Jlc3RpbmdUaHJlc2hUYW5nZW50JywgNik7XHJcbiAgICAgICAgUmVzb2x2ZXIuX3Bvc2l0aW9uRGFtcGVuID0gR2V0VmFsdWUodGhpcy5jb25maWcsICdwb3NpdGlvbkRhbXBlbicsIDAuOSk7XHJcbiAgICAgICAgUmVzb2x2ZXIuX3Bvc2l0aW9uV2FybWluZyA9IEdldFZhbHVlKHRoaXMuY29uZmlnLCAncG9zaXRpb25XYXJtaW5nJywgMC44KTtcclxuICAgICAgICBSZXNvbHZlci5fZnJpY3Rpb25Ob3JtYWxNdWx0aXBsaWVyID0gR2V0VmFsdWUodGhpcy5jb25maWcsICdmcmljdGlvbk5vcm1hbE11bHRpcGxpZXInLCA1KTtcclxuXHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkJPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHksIG9ubHkgb25jZSwgd2hlbiB0aGUgU2NlbmUgaXMgZmlyc3QgY3JlYXRlZC5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNib290XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4xXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG5ldyBXb3JsZCh0aGlzLnNjZW5lLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgdGhpcy5hZGQgPSBuZXcgRmFjdG9yeSh0aGlzLndvcmxkKTtcclxuICAgICAgICB0aGlzLmJvZHlCb3VuZHMgPSBuZXcgQm9keUJvdW5kcygpO1xyXG5cclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMud29ybGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkID0gbmV3IFdvcmxkKHRoaXMuc2NlbmUsIHRoaXMuY29uZmlnKTtcclxuICAgICAgICAgICAgdGhpcy5hZGQgPSBuZXcgRmFjdG9yeSh0aGlzLndvcmxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuVVBEQVRFLCB0aGlzLndvcmxkLnVwZGF0ZSwgdGhpcy53b3JsZCk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlBPU1RfVVBEQVRFLCB0aGlzLndvcmxkLnBvc3RVcGRhdGUsIHRoaXMud29ybGQpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vbmNlKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGludGVybmFsIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGlzIGNsYXNzIHN0YXJ0cyBhbmQgcmV0cmlldmVzIHRoZSBmaW5hbCBNYXR0ZXIgV29ybGQgQ29uZmlnLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjZ2V0Q29uZmlnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyV29ybGRDb25maWd9IFRoZSBNYXR0ZXIgV29ybGQgQ29uZmlnLlxyXG4gICAgICovXHJcbiAgICBnZXRDb25maWc6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdhbWVDb25maWcgPSB0aGlzLnN5c3RlbXMuZ2FtZS5jb25maWcucGh5c2ljcztcclxuICAgICAgICB2YXIgc2NlbmVDb25maWcgPSB0aGlzLnN5c3RlbXMuc2V0dGluZ3MucGh5c2ljcztcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IE1lcmdlKFxyXG4gICAgICAgICAgICBHZXRGYXN0VmFsdWUoc2NlbmVDb25maWcsICdtYXR0ZXInLCB7fSksXHJcbiAgICAgICAgICAgIEdldEZhc3RWYWx1ZShnYW1lQ29uZmlnLCAnbWF0dGVyJywge30pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIHRoZSBNYXR0ZXIgQXR0cmFjdG9ycyBQbHVnaW4uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBhdHRyYWN0b3JzIHBsdWdpbiB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gYXBwbHkgY29udGludWFsIGZvcmNlcyBvbiBib2RpZXMuXHJcbiAgICAgKiBJdCdzIHBvc3NpYmxlIHRvIHNpbXVsYXRlIGVmZmVjdHMgc3VjaCBhcyB3aW5kLCBncmF2aXR5IGFuZCBtYWduZXRpc20uXHJcbiAgICAgKiBcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWF0dHJhY3RvcnNcclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgYHBsdWdpbnMuYXR0cmFjdG9yc2AgaXMgc2V0IGluIHRoZSBNYXR0ZXIgV29ybGQgQ29uZmlnLlxyXG4gICAgICogSG93ZXZlciwgeW91IGNhbiBhbHNvIGNhbGwgaXQgZGlyZWN0bHkgZnJvbSB3aXRoaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjZW5hYmxlQXR0cmFjdG9yUGx1Z2luXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZW5hYmxlQXR0cmFjdG9yUGx1Z2luOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIFBsdWdpbi5yZWdpc3RlcihNYXR0ZXJBdHRyYWN0b3JzKTtcclxuICAgICAgICBQbHVnaW4udXNlKE1hdHRlckxpYiwgTWF0dGVyQXR0cmFjdG9ycyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgdGhlIE1hdHRlciBXcmFwIFBsdWdpbi5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGNvb3JkaW5hdGUgd3JhcHBpbmcgcGx1Z2luIHRoYXQgYXV0b21hdGljYWxseSB3cmFwcyB0aGUgcG9zaXRpb24gb2YgYm9kaWVzIHN1Y2ggdGhhdCB0aGV5IGFsd2F5cyBzdGF5XHJcbiAgICAgKiB3aXRoaW4gdGhlIGdpdmVuIGJvdW5kcy4gVXBvbiBjcm9zc2luZyBhIGJvdW5kYXJ5IHRoZSBib2R5IHdpbGwgYXBwZWFyIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBib3VuZHMsXHJcbiAgICAgKiB3aGlsZSBtYWludGFpbmluZyBpdHMgdmVsb2NpdHkuXHJcbiAgICAgKiBcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLXdyYXBcclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgaWYgYHBsdWdpbnMud3JhcGAgaXMgc2V0IGluIHRoZSBNYXR0ZXIgV29ybGQgQ29uZmlnLlxyXG4gICAgICogSG93ZXZlciwgeW91IGNhbiBhbHNvIGNhbGwgaXQgZGlyZWN0bHkgZnJvbSB3aXRoaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjZW5hYmxlV3JhcFBsdWdpblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGVuYWJsZVdyYXBQbHVnaW46IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgUGx1Z2luLnJlZ2lzdGVyKE1hdHRlcldyYXApO1xyXG4gICAgICAgIFBsdWdpbi51c2UoTWF0dGVyTGliLCBNYXR0ZXJXcmFwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyB0aGUgTWF0dGVyIENvbGxpc2lvbiBFdmVudHMgUGx1Z2luLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBwbHVnaW4gaXMgZW5hYmxlZCBieSBkZWZhdWx0LiBTbyB5b3Ugc2hvdWxkIG9ubHkgZXZlciBuZWVkIHRvIGNhbGwgdGhpc1xyXG4gICAgICogbWV0aG9kIGlmIHlvdSBoYXZlIHNwZWNpZmljYWxseSBkaXNhYmxlZCB0aGUgcGx1Z2luIGluIHlvdXIgTWF0dGVyIFdvcmxkIENvbmZpZy5cclxuICAgICAqIFlvdSBjYW4gZGlzYWJsZSBpdCBieSBzZXR0aW5nIGBwbHVnaW5zLmNvbGxpc2lvbmV2ZW50czogZmFsc2VgIGluIHlvdXIgTWF0dGVyIFdvcmxkIENvbmZpZy5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBwbHVnaW4gdHJpZ2dlcnMgdGhyZWUgbmV3IGV2ZW50cyBvbiBNYXR0ZXIuQm9keTpcclxuICAgICAqIFxyXG4gICAgICogMS4gYG9uQ29sbGlkZWBcclxuICAgICAqIDIuIGBvbkNvbGxpZGVFbmRgXHJcbiAgICAgKiAzLiBgb25Db2xsaWRlQWN0aXZlYFxyXG4gICAgICogXHJcbiAgICAgKiBUaGVzZSBldmVudHMgY29ycmVzcG9uZCB0byB0aGUgTWF0dGVyLmpzIGV2ZW50cyBgY29sbGlzaW9uU3RhcnRgLCBgY29sbGlzaW9uQWN0aXZlYCBhbmQgYGNvbGxpc2lvbkVuZGAsIHJlc3BlY3RpdmVseS5cclxuICAgICAqIFlvdSBjYW4gbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyB2aWEgTWF0dGVyLkV2ZW50cyBvciB0aGV5IHdpbGwgYWxzbyBiZSBlbWl0dGVkIGZyb20gdGhlIE1hdHRlciBXb3JsZC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBwbHVnaW4gYWxzbyBleHRlbmRzIE1hdHRlci5Cb2R5IHdpdGggdGhyZWUgY29udmVuaWVuY2UgZnVuY3Rpb25zOlxyXG4gICAgICogXHJcbiAgICAgKiBgTWF0dGVyLkJvZHkuc2V0T25Db2xsaWRlKGNhbGxiYWNrKWBcclxuICAgICAqIGBNYXR0ZXIuQm9keS5zZXRPbkNvbGxpZGVFbmQoY2FsbGJhY2spYFxyXG4gICAgICogYE1hdHRlci5Cb2R5LnNldE9uQ29sbGlkZUFjdGl2ZShjYWxsYmFjaylgXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcmVnaXN0ZXIgZXZlbnQgY2FsbGJhY2tzIGJ5IHByb3ZpZGluZyBhIGZ1bmN0aW9uIG9mIHR5cGUgKHBhaXI6IE1hdHRlci5QYWlyKSA9PiB2b2lkXHJcbiAgICAgKiBcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9keHUvbWF0dGVyLWNvbGxpc2lvbi1ldmVudHNcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2VuYWJsZUNvbGxpc2lvbkV2ZW50c1BsdWdpblxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBlbmFibGVDb2xsaXNpb25FdmVudHNQbHVnaW46IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgUGx1Z2luLnJlZ2lzdGVyKE1hdHRlckNvbGxpc2lvbkV2ZW50cyk7XHJcbiAgICAgICAgUGx1Z2luLnVzZShNYXR0ZXJMaWIsIE1hdHRlckNvbGxpc2lvbkV2ZW50cyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyB0aGUgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGFuZCBzZXRzIGBlbmFibGVkYCB0byBgZmFsc2VgLlxyXG4gICAgICogXHJcbiAgICAgKiBBIHBhdXNlZCB3b3JsZCB3aWxsIG5vdCBydW4gYW55IHNpbXVsYXRpb25zIGZvciB0aGUgZHVyYXRpb24gaXQgaXMgcGF1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjcGF1c2VcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzI1BBVVNFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IFRoZSBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwYXVzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53b3JsZC5wYXVzZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgZnJvbSBhIHBhdXNlZCBzdGF0ZSBhbmQgc2V0cyBgZW5hYmxlZGAgdG8gYHRydWVgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjcmVzdW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IFRoZSBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGQucmVzdW1lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgTWF0dGVyIEVuZ2luZSB0byBydW4gYXQgZml4ZWQgdGltZXN0ZXAgb2YgNjBIeiBhbmQgZW5hYmxlcyBgYXV0b1VwZGF0ZWAuXHJcbiAgICAgKiBJZiB5b3UgaGF2ZSBzZXQgYSBjdXN0b20gYGdldERlbHRhYCBmdW5jdGlvbiB0aGVuIHRoaXMgd2lsbCBvdmVycmlkZSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3NldDYwSHpcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldDYwSHo6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZC5nZXREZWx0YSA9IHRoaXMud29ybGQudXBkYXRlNjBIejtcclxuICAgICAgICB0aGlzLndvcmxkLmF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBNYXR0ZXIgRW5naW5lIHRvIHJ1biBhdCBmaXhlZCB0aW1lc3RlcCBvZiAzMEh6IGFuZCBlbmFibGVzIGBhdXRvVXBkYXRlYC5cclxuICAgICAqIElmIHlvdSBoYXZlIHNldCBhIGN1c3RvbSBgZ2V0RGVsdGFgIGZ1bmN0aW9uIHRoZW4gdGhpcyB3aWxsIG92ZXJyaWRlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3Mjc2V0MzBIelxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0MzBIejogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLndvcmxkLmdldERlbHRhID0gdGhpcy53b3JsZC51cGRhdGUzMEh6O1xyXG4gICAgICAgIHRoaXMud29ybGQuYXV0b1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hbnVhbGx5IGFkdmFuY2VzIHRoZSBwaHlzaWNzIHNpbXVsYXRpb24gYnkgb25lIGl0ZXJhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IHBhc3MgaW4gdGhlIGBkZWx0YWAgYW5kIGBjb3JyZWN0aW9uYCB2YWx1ZXMgdG8gYmUgdXNlZCBieSBFbmdpbmUudXBkYXRlLlxyXG4gICAgICogSWYgdW5kZWZpbmVkIHRoZXkgdXNlIHRoZSBNYXR0ZXIgZGVmYXVsdHMgb2YgNjBIeiBhbmQgbm8gY29ycmVjdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyBgc3RlcGAgZGlyZWN0bHkgYnlwYXNzZXMgYW55IGNoZWNrcyBvZiBgZW5hYmxlZGAgb3IgYGF1dG9VcGRhdGVgLlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBhbHNvIGlnbm9yZXMgYW55IGN1c3RvbSBgZ2V0RGVsdGFgIGZ1bmN0aW9ucywgYXMgeW91IHNob3VsZCBiZSBwYXNzaW5nIHRoZSBkZWx0YVxyXG4gICAgICogdmFsdWUgaW4gdG8gdGhpcyBjYWxsLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWRqdXN0IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IEVuZ2luZS51cGRhdGUgcGVyZm9ybXMgaW50ZXJuYWxseS5cclxuICAgICAqIFVzZSB0aGUgU2NlbmUgTWF0dGVyIFBoeXNpY3MgY29uZmlnIG9iamVjdCB0byBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxyXG4gICAgICpcclxuICAgICAqIHBvc2l0aW9uSXRlcmF0aW9ucyAoZGVmYXVsdHMgdG8gNilcclxuICAgICAqIHZlbG9jaXR5SXRlcmF0aW9ucyAoZGVmYXVsdHMgdG8gNClcclxuICAgICAqIGNvbnN0cmFpbnRJdGVyYXRpb25zIChkZWZhdWx0cyB0byAyKVxyXG4gICAgICpcclxuICAgICAqIEFkanVzdGluZyB0aGVzZSB2YWx1ZXMgY2FuIGhlbHAgcGVyZm9ybWFuY2UgaW4gY2VydGFpbiBzaXR1YXRpb25zLCBkZXBlbmRpbmcgb24gdGhlIHBoeXNpY3MgcmVxdWlyZW1lbnRzXHJcbiAgICAgKiBvZiB5b3VyIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzdGVwXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbHRhPTE2LjY2Nl0gLSBUaGUgZGVsdGEgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2NvcnJlY3Rpb249MV0gLSBPcHRpb25hbCBkZWx0YSBjb3JyZWN0aW9uIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzdGVwOiBmdW5jdGlvbiAoZGVsdGEsIGNvcnJlY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53b3JsZC5zdGVwKGRlbHRhLCBjb3JyZWN0aW9uKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZlcnRpY2VzIG9mIHRoZSBnaXZlbiBib2R5LCBvciBhbiBhcnJheSBvZiBib2RpZXMsIGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludCwgb3Igbm90LlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHBhc3MgaW4gZWl0aGVyIGEgc2luZ2xlIGJvZHksIG9yIGFuIGFycmF5IG9mIGJvZGllcyB0byBiZSBjaGVja2VkLiBUaGlzIG1ldGhvZCB3aWxsXHJcbiAgICAgKiByZXR1cm4gYHRydWVgIGlmIF9hbnlfIG9mIHRoZSBib2RpZXMgaW4gdGhlIGFycmF5IGNvbnRhaW4gdGhlIHBvaW50LiBTZWUgdGhlIGBpbnRlcnNlY3RQb2ludGAgbWV0aG9kIGlmIHlvdSBuZWVkXHJcbiAgICAgKiB0byBnZXQgYSBsaXN0IG9mIGludGVyc2VjdGluZyBib2RpZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBwb2ludCBzaG91bGQgYmUgdHJhbnNmb3JtZWQgaW50byB0aGUgTWF0dGVyIFdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtIGluIGFkdmFuY2UuIFRoaXMgaGFwcGVucyBieVxyXG4gICAgICogZGVmYXVsdCB3aXRoIElucHV0IFBvaW50ZXJzLCBidXQgaWYgeW91IHdpc2ggdG8gdXNlIHBvaW50cyBmcm9tIGFub3RoZXIgc3lzdGVtIHlvdSBtYXkgbmVlZCB0b1xyXG4gICAgICogdHJhbnNmb3JtIHRoZW0gYmVmb3JlIHBhc3NpbmcgdGhlbS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNjb250YWluc1BvaW50XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl8UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXSl9IGJvZHkgLSBUaGUgYm9keSwgb3IgYW4gYXJyYXkgb2YgYm9kaWVzLCB0byBjaGVjayBhZ2FpbnN0IHRoZSBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBwb2ludC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwb2ludCBpcyB3aXRoaW4gb25lIG9mIHRoZSBib2RpZXMgZ2l2ZW4sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBjb250YWluc1BvaW50OiBmdW5jdGlvbiAoYm9keSwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBib2R5ID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9keSk7XHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFZlY3Rvci5jcmVhdGUoeCwgeSk7XHJcblxyXG4gICAgICAgIHZhciByZXN1bHQgPSBRdWVyeS5wb2ludChib2R5LCBwb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHJldHVybiAocmVzdWx0Lmxlbmd0aCA+IDApID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgdG8gc2VlIGlmIGFueSB2ZXJ0aWNlcyBvZiB0aGUgZ2l2ZW4gYm9kaWVzIGNvbnRhaW4gaXQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIG5vIGJvZGllcyBhcmUgcHJvdmlkZWQgaXQgd2lsbCBzZWFyY2ggYWxsIGJvZGllcyBpbiB0aGUgTWF0dGVyIFdvcmxkLCBpbmNsdWRpbmcgd2l0aGluIENvbXBvc2l0ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjb29yZGluYXRlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgaW50byB0aGUgTWF0dGVyIFdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtIGluIGFkdmFuY2UuIFRoaXMgaGFwcGVucyBieVxyXG4gICAgICogZGVmYXVsdCB3aXRoIElucHV0IFBvaW50ZXJzLCBidXQgaWYgeW91IHdpc2ggdG8gdXNlIGNvb3JkaW5hdGVzIGZyb20gYW5vdGhlciBzeXN0ZW0geW91IG1heSBuZWVkIHRvXHJcbiAgICAgKiB0cmFuc2Zvcm0gdGhlbSBiZWZvcmUgcGFzc2luZyB0aGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2ludGVyc2VjdFBvaW50XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keVtdfSBbYm9kaWVzXSAtIEFuIGFycmF5IG9mIGJvZGllcyB0byBjaGVjay4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgc2VhcmNoIGFsbCBib2RpZXMgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keVtdfSBBbiBhcnJheSBvZiBib2RpZXMgd2hpY2ggY29udGFpbiB0aGUgZ2l2ZW4gcG9pbnQuXHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdFBvaW50OiBmdW5jdGlvbiAoeCwgeSwgYm9kaWVzKVxyXG4gICAge1xyXG4gICAgICAgIGJvZGllcyA9IHRoaXMuZ2V0TWF0dGVyQm9kaWVzKGJvZGllcyk7XHJcblxyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFZlY3Rvci5jcmVhdGUoeCwgeSk7XHJcblxyXG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IFF1ZXJ5LnBvaW50KGJvZGllcywgcG9zaXRpb24pO1xyXG5cclxuICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAoYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChvdXRwdXQuaW5kZXhPZihib2R5KSA9PT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGJvZHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIHRvIHNlZSBpZiBhbnkgdmVydGljZXMgb2YgdGhlIGdpdmVuIGJvZGllcyBpbnRlcnNlY3Qgd2l0aCBpdC5cclxuICAgICAqIE9yLCBpZiB0aGUgYG91dHNpZGVgIHBhcmFtZXRlciBpcyBzZXQgdG8gYHRydWVgLCBpdCBjaGVja3MgdG8gc2VlIHdoaWNoIGJvZGllcyBkbyBub3RcclxuICAgICAqIGludGVyc2VjdCB3aXRoIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiBubyBib2RpZXMgYXJlIHByb3ZpZGVkIGl0IHdpbGwgc2VhcmNoIGFsbCBib2RpZXMgaW4gdGhlIE1hdHRlciBXb3JsZCwgaW5jbHVkaW5nIHdpdGhpbiBDb21wb3NpdGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2ludGVyc2VjdFJlY3RcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW291dHNpZGU9ZmFsc2VdIC0gSWYgYGZhbHNlYCBpdCBjaGVja3MgZm9yIHZlcnRpY2VzIGluc2lkZSB0aGUgYXJlYSwgaWYgYHRydWVgIGl0IGNoZWNrcyBmb3IgdmVydGljZXMgb3V0c2lkZSB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gW2JvZGllc10gLSBBbiBhcnJheSBvZiBib2RpZXMgdG8gY2hlY2suIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHNlYXJjaCBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gQW4gYXJyYXkgb2YgYm9kaWVzIHRoYXQgaW50ZXJzZWN0IHdpdGggdGhlIGdpdmVuIGFyZWEuXHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdFJlY3Q6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvdXRzaWRlLCBib2RpZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG91dHNpZGUgPT09IHVuZGVmaW5lZCkgeyBvdXRzaWRlID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHtcclxuICAgICAgICAgICAgbWluOiB7IHg6IHgsIHk6IHkgfSxcclxuICAgICAgICAgICAgbWF4OiB7IHg6IHggKyB3aWR0aCwgeTogeSArIGhlaWdodCB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICB2YXIgcmVzdWx0ID0gUXVlcnkucmVnaW9uKGJvZGllcywgYm91bmRzLCBvdXRzaWRlKTtcclxuXHJcbiAgICAgICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAob3V0cHV0LmluZGV4T2YoYm9keSkgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChib2R5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0aGUgZ2l2ZW4gcmF5IHNlZ21lbnQgdG8gc2VlIGlmIGFueSB2ZXJ0aWNlcyBvZiB0aGUgZ2l2ZW4gYm9kaWVzIGludGVyc2VjdCB3aXRoIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiBubyBib2RpZXMgYXJlIHByb3ZpZGVkIGl0IHdpbGwgc2VhcmNoIGFsbCBib2RpZXMgaW4gdGhlIE1hdHRlciBXb3JsZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSByYXkgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlIGByYXlXaWR0aGAgcGFyYW1ldGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2ludGVyc2VjdFJheVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IG9mIHRoZSByYXkgc2VnbWVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBvZiB0aGUgcmF5IHNlZ21lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSBlbmQgb2YgdGhlIHJheSBzZWdtZW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIC0gVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgcmF5IHNlZ21lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JheVdpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByYXkgc2VnbWVudC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gW2JvZGllc10gLSBBbiBhcnJheSBvZiBib2RpZXMgdG8gY2hlY2suIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHNlYXJjaCBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gQW4gYXJyYXkgb2YgYm9kaWVzIHdob3MgdmVydGljZXMgaW50ZXJzZWN0IHdpdGggdGhlIHJheSBzZWdtZW50LlxyXG4gICAgICovXHJcbiAgICBpbnRlcnNlY3RSYXk6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgcmF5V2lkdGgsIGJvZGllcylcclxuICAgIHtcclxuICAgICAgICBpZiAocmF5V2lkdGggPT09IHVuZGVmaW5lZCkgeyByYXlXaWR0aCA9IDE7IH1cclxuICAgICAgICBcclxuICAgICAgICBib2RpZXMgPSB0aGlzLmdldE1hdHRlckJvZGllcyhib2RpZXMpO1xyXG5cclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgdmFyIGNvbGxpc2lvbnMgPSBRdWVyeS5yYXkoYm9kaWVzLCBWZWN0b3IuY3JlYXRlKHgxLCB5MSksIFZlY3Rvci5jcmVhdGUoeDIsIHkyKSwgcmF5V2lkdGgpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxpc2lvbnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2xsaXNpb25zW2ldLmJvZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdGhlIGdpdmVuIE1hdHRlciBCb2R5IHRvIHNlZSBpZiBpdCBpbnRlcnNlY3RzIHdpdGggYW55IG9mIHRoZSBnaXZlbiBib2RpZXMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIG5vIGJvZGllcyBhcmUgcHJvdmlkZWQgaXQgd2lsbCBjaGVjayBhZ2FpbnN0IGFsbCBib2RpZXMgaW4gdGhlIE1hdHRlciBXb3JsZC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNpbnRlcnNlY3RCb2R5XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keX0gYm9keSAtIFRoZSB0YXJnZXQgYm9keS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gW2JvZGllc10gLSBBbiBhcnJheSBvZiBib2RpZXMgdG8gY2hlY2sgdGhlIHRhcmdldCBib2R5IGFnYWluc3QuIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIHNlYXJjaCBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gQW4gYXJyYXkgb2YgYm9kaWVzIHdob3MgdmVydGljZXMgaW50ZXJzZWN0IHdpdGggdGFyZ2V0IGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdEJvZHk6IGZ1bmN0aW9uIChib2R5LCBib2RpZXMpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHZhciBjb2xsaXNpb25zID0gUXVlcnkuY29sbGlkZXMoYm9keSwgYm9kaWVzKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsaXNpb25zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhaXIgPSBjb2xsaXNpb25zW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhaXIuYm9keUEgPT09IGJvZHkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhaXIuYm9keUIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFpci5ib2R5QSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGJvZHksIG9yIGFuIGFycmF5IG9mIHRhcmdldCBib2RpZXMsIGludGVyc2VjdHMgd2l0aCBhbnkgb2YgdGhlIGdpdmVuIGJvZGllcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgaW50ZXJzZWN0aW9uIG9jY3VycyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBgdHJ1ZWAgYW5kLCBpZiBwcm92aWRlZCwgaW52b2tlIHRoZSBjYWxsYmFja3MuXHJcbiAgICAgKiBcclxuICAgICAqIElmIG5vIGJvZGllcyBhcmUgcHJvdmlkZWQgZm9yIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRoZSB0YXJnZXQgd2lsbCBjaGVjayBhZ2FpbiBhbGwgYm9kaWVzIGluIHRoZSBNYXR0ZXIgV29ybGQuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCBib2RpZXMgY2FuIG9ubHkgb3ZlcmxhcCBpZiB0aGV5IGFyZSBpbiBub24tY29sbGlkaW5nIGNvbGxpc2lvbiBncm91cHMgb3IgY2F0ZWdvcmllcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IHByb3ZpZGUgYSBgcHJvY2Vzc0NhbGxiYWNrYCB0aGVuIHRoZSB0d28gYm9kaWVzIHRoYXQgb3ZlcmxhcCBhcmUgc2VudCB0byBpdC4gVGhpcyBjYWxsYmFja1xyXG4gICAgICogbXVzdCByZXR1cm4gYSBib29sZWFuIGFuZCBpcyB1c2VkIHRvIGFsbG93IHlvdSB0byBwZXJmb3JtIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0ZXN0cyBiZWZvcmUgYSBmaW5hbFxyXG4gICAgICogb3V0Y29tZSBpcyBkZWNpZGVkLiBJZiBpdCByZXR1cm5zIGB0cnVlYCB0aGVuIHRoZSBib2RpZXMgYXJlIGZpbmFsbHkgcGFzc2VkIHRvIHRoZSBgb3ZlcmxhcENhbGxiYWNrYCwgaWYgc2V0LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3UgcHJvdmlkZSBhbiBgb3ZlcmxhcENhbGxiYWNrYCB0aGVuIHRoZSBtYXRjaGluZyBwYWlycyBvZiBvdmVybGFwcGluZyBib2RpZXMgd2lsbCBiZSBzZW50IHRvIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBCb3RoIGNhbGxiYWNrcyBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOiBgZnVuY3Rpb24gKGJvZHlBLCBib2R5QiwgY29sbGlzaW9uSW5mbylgIHdoZXJlIGBib2R5QWAgaXMgYWx3YXlzXHJcbiAgICAgKiB0aGUgdGFyZ2V0IGJvZHkuIFRoZSBgY29sbGlzaW9uSW5mb2Agb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSwgc3VjaCBhcyB0aGUgYW5nbGUgYW5kIGRlcHRoIG9mIHBlbmV0cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI292ZXJsYXBcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keXxQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keVtdKX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBib2R5LCBvciBhcnJheSBvZiB0YXJnZXQgYm9kaWVzLCB0byBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gW2JvZGllc10gLSBUaGUgc2Vjb25kIGJvZHksIG9yIGFycmF5IG9mIGJvZGllcywgdG8gY2hlY2suIElmIGZhbHNleSBpdCB3aWxsIGNoZWNrIGFnYWluc3QgYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW292ZXJsYXBDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBpZiB0aGUgYm9kaWVzIG92ZXJsYXAuXHJcbiAgICAgKiBAcGFyYW0ge0FyY2FkZVBoeXNpY3NDYWxsYmFja30gW3Byb2Nlc3NDYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGxldHMgeW91IHBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgYWdhaW5zdCB0aGUgdHdvIGJvZGllcyBpZiB0aGV5IG92ZXJsYXAuIElmIHRoaXMgaXMgc2V0IHRoZW4gYG92ZXJsYXBDYWxsYmFja2Agd2lsbCBvbmx5IGJlIGludm9rZWQgaWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIGB0cnVlYC5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCwgb3Igc2NvcGUsIGluIHdoaWNoIHRvIHJ1biB0aGUgY2FsbGJhY2tzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHRhcmdldCBib2R5IGludGVyc2VjdHMgd2l0aCBfYW55XyBvZiB0aGUgYm9kaWVzIGdpdmVuLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgb3ZlcmxhcDogZnVuY3Rpb24gKHRhcmdldCwgYm9kaWVzLCBvdmVybGFwQ2FsbGJhY2ssIHByb2Nlc3NDYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvdmVybGFwQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyBvdmVybGFwQ2FsbGJhY2sgPSBudWxsOyB9XHJcbiAgICAgICAgaWYgKHByb2Nlc3NDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IHByb2Nlc3NDYWxsYmFjayA9IG51bGw7IH1cclxuICAgICAgICBpZiAoY2FsbGJhY2tDb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY2FsbGJhY2tDb250ZXh0ID0gb3ZlcmxhcENhbGxiYWNrOyB9XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gWyB0YXJnZXQgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0TWF0dGVyQm9kaWVzKHRhcmdldCk7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIG1hdGNoID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGFyZ2V0W2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvbGxpc2lvbnMgPSBRdWVyeS5jb2xsaWRlcyhlbnRyeSwgYm9kaWVzKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29sbGlzaW9ucy5sZW5ndGg7IGMrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZm8gPSBjb2xsaXNpb25zW2NdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGJvZHlCID0gKGluZm8uYm9keUEuaWQgPT09IGVudHJ5LmlkKSA/IGluZm8uYm9keUIgOiBpbmZvLmJvZHlBO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc0NhbGxiYWNrIHx8IHByb2Nlc3NDYWxsYmFjay5jYWxsKGNhbGxiYWNrQ29udGV4dCwgZW50cnksIGJvZHlCLCBpbmZvKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGFwQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwQ2FsbGJhY2suY2FsbChjYWxsYmFja0NvbnRleHQsIGVudHJ5LCBib2R5QiwgaW5mbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFwcm9jZXNzQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgSWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgZXZlcnkgYm9keSwganVzdCBleGl0IHdoZW4gdGhlIGZpcnN0IGlzIGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbGxpc2lvbiBmaWx0ZXIgY2F0ZWdvcnkgb2YgYWxsIGdpdmVuIE1hdHRlciBCb2RpZXMgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG51bWJlciBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGJldHdlZW4gMl4wICg9IDEpIGFuZCAyXjMxLlxyXG4gICAgICogXHJcbiAgICAgKiBCb2RpZXMgd2l0aCBkaWZmZXJlbnQgY29sbGlzaW9uIGdyb3VwcyAoc2VlIHtAbGluayAjc2V0Q29sbGlzaW9uR3JvdXB9KSB3aWxsIG9ubHkgY29sbGlkZSBpZiB0aGVpciBjb2xsaXNpb25cclxuICAgICAqIGNhdGVnb3JpZXMgYXJlIGluY2x1ZGVkIGluIHRoZWlyIGNvbGxpc2lvbiBtYXNrcyAoc2VlIHtAbGluayAjc2V0Q29sbGlkZXNXaXRofSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzZXRDb2xsaXNpb25DYXRlZ29yeVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXX0gYm9kaWVzIC0gQW4gYXJyYXkgb2YgYm9kaWVzIHRvIHVwZGF0ZS4gSWYgZmFsc2V5IGl0IHdpbGwgdXNlIGFsbCBib2RpZXMgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVW5pcXVlIGNhdGVnb3J5IGJpdGZpZWxkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldENvbGxpc2lvbkNhdGVnb3J5OiBmdW5jdGlvbiAoYm9kaWVzLCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBib2RpZXMgPSB0aGlzLmdldE1hdHRlckJvZGllcyhib2RpZXMpO1xyXG5cclxuICAgICAgICBib2RpZXMuZm9yRWFjaChmdW5jdGlvbiAoYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkuY29sbGlzaW9uRmlsdGVyLmNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbGxpc2lvbiBmaWx0ZXIgZ3JvdXAgb2YgYWxsIGdpdmVuIE1hdHRlciBCb2RpZXMgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgZ3JvdXAgdmFsdWUgaXMgemVybywgb3IgaWYgdHdvIE1hdHRlciBCb2RpZXMgaGF2ZSBkaWZmZXJlbnQgZ3JvdXAgdmFsdWVzLFxyXG4gICAgICogdGhleSB3aWxsIGNvbGxpZGUgYWNjb3JkaW5nIHRvIHRoZSB1c3VhbCBjb2xsaXNpb24gZmlsdGVyIHJ1bGVzIChzZWUge0BsaW5rICNzZXRDb2xsaXNpb25DYXRlZ29yeX0gYW5kIHtAbGluayAjc2V0Q29sbGlzaW9uR3JvdXB9KS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdHdvIE1hdHRlciBCb2RpZXMgaGF2ZSB0aGUgc2FtZSBwb3NpdGl2ZSBncm91cCB2YWx1ZSwgdGhleSB3aWxsIGFsd2F5cyBjb2xsaWRlO1xyXG4gICAgICogaWYgdGhleSBoYXZlIHRoZSBzYW1lIG5lZ2F0aXZlIGdyb3VwIHZhbHVlIHRoZXkgd2lsbCBuZXZlciBjb2xsaWRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3Mjc2V0Q29sbGlzaW9uR3JvdXBcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5W119IGJvZGllcyAtIEFuIGFycmF5IG9mIGJvZGllcyB0byB1cGRhdGUuIElmIGZhbHNleSBpdCB3aWxsIHVzZSBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFVuaXF1ZSBncm91cCBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaXNpb25Hcm91cDogZnVuY3Rpb24gKGJvZGllcywgdmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgYm9kaWVzLmZvckVhY2goZnVuY3Rpb24gKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5LmNvbGxpc2lvbkZpbHRlci5ncm91cCA9IHZhbHVlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2xsaXNpb24gZmlsdGVyIG1hc2sgb2YgYWxsIGdpdmVuIE1hdHRlciBCb2RpZXMgdG8gdGhlIGdpdmVuIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBUd28gTWF0dGVyIEJvZGllcyB3aXRoIGRpZmZlcmVudCBjb2xsaXNpb24gZ3JvdXBzIHdpbGwgb25seSBjb2xsaWRlIGlmIGVhY2ggb25lIGluY2x1ZGVzIHRoZSBvdGhlcnNcclxuICAgICAqIGNhdGVnb3J5IGluIGl0cyBtYXNrIGJhc2VkIG9uIGEgYml0d2lzZSBBTkQgb3BlcmF0aW9uOiBgKGNhdGVnb3J5QSAmIG1hc2tCKSAhPT0gMGAgYW5kIFxyXG4gICAgICogYChjYXRlZ29yeUIgJiBtYXNrQSkgIT09IDBgIGFyZSBib3RoIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzZXRDb2xsaWRlc1dpdGhcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5W119IGJvZGllcyAtIEFuIGFycmF5IG9mIGJvZGllcyB0byB1cGRhdGUuIElmIGZhbHNleSBpdCB3aWxsIHVzZSBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IGNhdGVnb3JpZXMgLSBBIHVuaXF1ZSBjYXRlZ29yeSBiaXRmaWVsZCwgb3IgYW4gYXJyYXkgb2YgdGhlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaWRlc1dpdGg6IGZ1bmN0aW9uIChib2RpZXMsIGNhdGVnb3JpZXMpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIGZsYWdzID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhdGVnb3JpZXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmxhZ3MgPSBjYXRlZ29yaWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZsYWdzIHw9IGNhdGVnb3JpZXNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJvZGllcy5mb3JFYWNoKGZ1bmN0aW9uIChib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keS5jb2xsaXNpb25GaWx0ZXIubWFzayA9IGZsYWdzO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhbiBhcnJheSBhbmQgcmV0dXJucyBhIG5ldyBhcnJheSBtYWRlIGZyb20gYWxsIG9mIHRoZSBNYXR0ZXIgQm9kaWVzIGZvdW5kIGluIHRoZSBvcmlnaW5hbCBhcnJheS5cclxuICAgICAqIFxyXG4gICAgICogRm9yIGV4YW1wbGUsIHBhc3NpbmcgaW4gTWF0dGVyIEdhbWUgT2JqZWN0cywgc3VjaCBhcyBhIGJ1bmNoIG9mIE1hdHRlciBTcHJpdGVzLCB0byB0aGlzIG1ldGhvZCwgd291bGRcclxuICAgICAqIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGVpciBuYXRpdmUgTWF0dGVyIEJvZHkgb2JqZWN0cy5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGBib2RpZXNgIGFyZ3VtZW50IGlzIGZhbHNleSwgaXQgd2lsbCByZXR1cm4gYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNnZXRNYXR0ZXJCb2RpZXNcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBbYm9kaWVzXSAtIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gZXh0cmFjdCB0aGUgYm9kaWVzIGZyb20uIElmIGZhbHNleSwgaXQgd2lsbCByZXR1cm4gYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGVbXX0gQW4gYXJyYXkgb2YgbmF0aXZlIE1hdHRlciBCb2R5IG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGdldE1hdHRlckJvZGllczogZnVuY3Rpb24gKGJvZGllcylcclxuICAgIHtcclxuICAgICAgICBpZiAoIWJvZGllcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmxkLmdldEFsbEJvZGllcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJvZGllcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2RpZXMgPSBbIGJvZGllcyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gKGJvZGllc1tpXS5oYXNPd25Qcm9wZXJ0eSgnYm9keScpKSA/IGJvZGllc1tpXS5ib2R5IDogYm9kaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgb3V0cHV0LnB1c2goYm9keSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYm90aCB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgbGluZWFyIHZlbG9jaXR5IG9mIHRoZSBwaHlzaWNzIGJvZGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3NldFZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl8UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXSl9IGJvZGllcyAtIEVpdGhlciBhIHNpbmdsZSBCb2R5LCBvciBhbiBhcnJheSBvZiBib2RpZXMgdG8gdXBkYXRlLiBJZiBmYWxzZXkgaXQgd2lsbCB1c2UgYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGxpbmVhciB2ZWxvY2l0eSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIGxpbmVhciB2ZWxvY2l0eSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eTogZnVuY3Rpb24gKGJvZGllcywgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBib2RpZXMgPSB0aGlzLmdldE1hdHRlckJvZGllcyhib2RpZXMpO1xyXG5cclxuICAgICAgICB2YXIgdmVjMiA9IHRoaXMuX3RlbXBWZWMyO1xyXG5cclxuICAgICAgICB2ZWMyLnggPSB4O1xyXG4gICAgICAgIHZlYzIueSA9IHk7XHJcblxyXG4gICAgICAgIGJvZGllcy5mb3JFYWNoKGZ1bmN0aW9uIChib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQm9keS5zZXRWZWxvY2l0eShib2R5LCB2ZWMyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBqdXN0IHRoZSBob3Jpem9udGFsIGxpbmVhciB2ZWxvY2l0eSBvZiB0aGUgcGh5c2ljcyBib2RpZXMuXHJcbiAgICAgKiBUaGUgdmVydGljYWwgdmVsb2NpdHkgb2YgdGhlIGJvZHkgaXMgdW5jaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3Mjc2V0VmVsb2NpdHlYXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl8UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXSl9IGJvZGllcyAtIEVpdGhlciBhIHNpbmdsZSBCb2R5LCBvciBhbiBhcnJheSBvZiBib2RpZXMgdG8gdXBkYXRlLiBJZiBmYWxzZXkgaXQgd2lsbCB1c2UgYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIGxpbmVhciB2ZWxvY2l0eSB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eVg6IGZ1bmN0aW9uIChib2RpZXMsIHgpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIHZlYzIgPSB0aGlzLl90ZW1wVmVjMjtcclxuXHJcbiAgICAgICAgdmVjMi54ID0geDtcclxuXHJcbiAgICAgICAgYm9kaWVzLmZvckVhY2goZnVuY3Rpb24gKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2ZWMyLnkgPSBib2R5LnZlbG9jaXR5Lnk7XHJcbiAgICAgICAgICAgIEJvZHkuc2V0VmVsb2NpdHkoYm9keSwgdmVjMik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMganVzdCB0aGUgdmVydGljYWwgbGluZWFyIHZlbG9jaXR5IG9mIHRoZSBwaHlzaWNzIGJvZGllcy5cclxuICAgICAqIFRoZSBob3Jpem9udGFsIHZlbG9jaXR5IG9mIHRoZSBib2R5IGlzIHVuY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI3NldFZlbG9jaXR5WVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5W10pfSBib2RpZXMgLSBFaXRoZXIgYSBzaW5nbGUgQm9keSwgb3IgYW4gYXJyYXkgb2YgYm9kaWVzIHRvIHVwZGF0ZS4gSWYgZmFsc2V5IGl0IHdpbGwgdXNlIGFsbCBib2RpZXMgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgbGluZWFyIHZlbG9jaXR5IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5WTogZnVuY3Rpb24gKGJvZGllcywgeSlcclxuICAgIHtcclxuICAgICAgICBib2RpZXMgPSB0aGlzLmdldE1hdHRlckJvZGllcyhib2RpZXMpO1xyXG5cclxuICAgICAgICB2YXIgdmVjMiA9IHRoaXMuX3RlbXBWZWMyO1xyXG5cclxuICAgICAgICB2ZWMyLnkgPSB5O1xyXG5cclxuICAgICAgICBib2RpZXMuZm9yRWFjaChmdW5jdGlvbiAoYm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZlYzIueCA9IGJvZHkudmVsb2NpdHkueDtcclxuICAgICAgICAgICAgQm9keS5zZXRWZWxvY2l0eShib2R5LCB2ZWMyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYW5ndWxhciB2ZWxvY2l0eSBvZiB0aGUgYm9kaWVzIGluc3RhbnRseS5cclxuICAgICAqIFBvc2l0aW9uLCBhbmdsZSwgZm9yY2UgZXRjLiBhcmUgdW5jaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3Mjc2V0QW5ndWxhclZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl8UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXSl9IGJvZGllcyAtIEVpdGhlciBhIHNpbmdsZSBCb2R5LCBvciBhbiBhcnJheSBvZiBib2RpZXMgdG8gdXBkYXRlLiBJZiBmYWxzZXkgaXQgd2lsbCB1c2UgYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgYW5ndWxhciB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBQaHlzaWNzIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRBbmd1bGFyVmVsb2NpdHk6IGZ1bmN0aW9uIChib2RpZXMsIHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGJvZGllcyA9IHRoaXMuZ2V0TWF0dGVyQm9kaWVzKGJvZGllcyk7XHJcblxyXG4gICAgICAgIGJvZGllcy5mb3JFYWNoKGZ1bmN0aW9uIChib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQm9keS5zZXRBbmd1bGFyVmVsb2NpdHkoYm9keSwgdmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgZm9yY2UgdG8gYSBib2R5LCBhdCB0aGUgYm9kaWVzIGN1cnJlbnQgcG9zaXRpb24sIGluY2x1ZGluZyByZXN1bHRpbmcgdG9ycXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjYXBwbHlGb3JjZVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5fFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5W10pfSBib2RpZXMgLSBFaXRoZXIgYSBzaW5nbGUgQm9keSwgb3IgYW4gYXJyYXkgb2YgYm9kaWVzIHRvIHVwZGF0ZS4gSWYgZmFsc2V5IGl0IHdpbGwgdXNlIGFsbCBib2RpZXMgaW4gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuTWF0aC5WZWN0b3IyTGlrZX0gZm9yY2UgLSBBIFZlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgZm9yY2UgdG8gYXBwbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYXBwbHlGb3JjZTogZnVuY3Rpb24gKGJvZGllcywgZm9yY2UpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIHZlYzIgPSB0aGlzLl90ZW1wVmVjMjtcclxuXHJcbiAgICAgICAgYm9kaWVzLmZvckVhY2goZnVuY3Rpb24gKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2ZWMyLnggPSBib2R5LnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIHZlYzIueSA9IGJvZHkucG9zaXRpb24ueTtcclxuXHJcbiAgICAgICAgICAgIEJvZHkuYXBwbHlGb3JjZShib2R5LCB2ZWMyLCBmb3JjZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgYSBmb3JjZSB0byBhIGJvZHksIGZyb20gdGhlIGdpdmVuIHdvcmxkIHBvc2l0aW9uLCBpbmNsdWRpbmcgcmVzdWx0aW5nIHRvcnF1ZS5cclxuICAgICAqIElmIG5vIGFuZ2xlIGlzIGdpdmVuLCB0aGUgY3VycmVudCBib2R5IGFuZ2xlIGlzIHVzZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFVzZSB2ZXJ5IHNtYWxsIHNwZWVkIHZhbHVlcywgc3VjaCBhcyAwLjEsIGRlcGVuZGluZyBvbiB0aGUgbWFzcyBhbmQgcmVxdWlyZWQgdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNhcHBseUZvcmNlRnJvbVBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl8UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlbXSl9IGJvZGllcyAtIEVpdGhlciBhIHNpbmdsZSBCb2R5LCBvciBhbiBhcnJheSBvZiBib2RpZXMgdG8gdXBkYXRlLiBJZiBmYWxzZXkgaXQgd2lsbCB1c2UgYWxsIGJvZGllcyBpbiB0aGUgd29ybGQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5NYXRoLlZlY3RvcjJMaWtlfSBwb3NpdGlvbiAtIEEgVmVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvbiB0byBhcHBseSB0aGUgZm9yY2UgYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWQgLSBBIHNwZWVkIHZhbHVlIHRvIGJlIGFwcGxpZWQgdG8gYSBkaXJlY3Rpb25hbCBmb3JjZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYW5nbGVdIC0gVGhlIGFuZ2xlLCBpbiByYWRpYW5zLCB0byBhcHBseSB0aGUgZm9yY2UgZnJvbS4gTGVhdmUgdW5kZWZpbmVkIHRvIHVzZSB0aGUgY3VycmVudCBib2R5IGFuZ2xlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFBoeXNpY3MgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGFwcGx5Rm9yY2VGcm9tUG9zaXRpb246IGZ1bmN0aW9uIChib2RpZXMsIHBvc2l0aW9uLCBzcGVlZCwgYW5nbGUpXHJcbiAgICB7XHJcbiAgICAgICAgYm9kaWVzID0gdGhpcy5nZXRNYXR0ZXJCb2RpZXMoYm9kaWVzKTtcclxuXHJcbiAgICAgICAgdmFyIHZlYzIgPSB0aGlzLl90ZW1wVmVjMjtcclxuXHJcbiAgICAgICAgYm9kaWVzLmZvckVhY2goZnVuY3Rpb24gKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYW5nbGUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYW5nbGUgPSBib2R5LmFuZ2xlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2ZWMyLnggPSBzcGVlZCAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICAgICAgdmVjMi55ID0gc3BlZWQgKiBNYXRoLnNpbihhbmdsZSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LmFwcGx5Rm9yY2UoYm9keSwgcG9zaXRpb24sIHZlYzIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSBhIGZvcmNlIHRvIGEgYm9keSBiYXNlZCBvbiB0aGUgZ2l2ZW4gYW5nbGUgYW5kIHNwZWVkLlxyXG4gICAgICogSWYgbm8gYW5nbGUgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGJvZHkgYW5nbGUgaXMgdXNlZC5cclxuICAgICAqIFxyXG4gICAgICogVXNlIHZlcnkgc21hbGwgc3BlZWQgdmFsdWVzLCBzdWNoIGFzIDAuMSwgZGVwZW5kaW5nIG9uIHRoZSBtYXNzIGFuZCByZXF1aXJlZCB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2FwcGx5Rm9yY2VGcm9tQW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keXxQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keVtdKX0gYm9kaWVzIC0gRWl0aGVyIGEgc2luZ2xlIEJvZHksIG9yIGFuIGFycmF5IG9mIGJvZGllcyB0byB1cGRhdGUuIElmIGZhbHNleSBpdCB3aWxsIHVzZSBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCAtIEEgc3BlZWQgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBhIGRpcmVjdGlvbmFsIGZvcmNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbmdsZV0gLSBUaGUgYW5nbGUsIGluIHJhZGlhbnMsIHRvIGFwcGx5IHRoZSBmb3JjZSBmcm9tLiBMZWF2ZSB1bmRlZmluZWQgdG8gdXNlIHRoZSBjdXJyZW50IGJvZHkgYW5nbGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYXBwbHlGb3JjZUZyb21BbmdsZTogZnVuY3Rpb24gKGJvZGllcywgc3BlZWQsIGFuZ2xlKVxyXG4gICAge1xyXG4gICAgICAgIGJvZGllcyA9IHRoaXMuZ2V0TWF0dGVyQm9kaWVzKGJvZGllcyk7XHJcblxyXG4gICAgICAgIHZhciB2ZWMyID0gdGhpcy5fdGVtcFZlYzI7XHJcblxyXG4gICAgICAgIGJvZGllcy5mb3JFYWNoKGZ1bmN0aW9uIChib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGFuZ2xlID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFuZ2xlID0gYm9keS5hbmdsZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmVjMi54ID0gc3BlZWQgKiBNYXRoLmNvcyhhbmdsZSk7XHJcbiAgICAgICAgICAgIHZlYzIueSA9IHNwZWVkICogTWF0aC5zaW4oYW5nbGUpO1xyXG5cclxuICAgICAgICAgICAgQm9keS5hcHBseUZvcmNlKGJvZHksIHsgeDogYm9keS5wb3NpdGlvbi54LCB5OiBib2R5LnBvc2l0aW9uLnkgfSwgdmVjMik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gY29uc3RyYWludCwgd2hpY2ggaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNnZXRDb25zdHJhaW50TGVuZ3RoXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5Db25zdHJhaW50VHlwZX0gY29uc3RyYWludCAtIFRoZSBjb25zdHJhaW50IHRvIGdldCB0aGUgbGVuZ3RoIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBjb25zdHJhaW50LlxyXG4gICAgICovXHJcbiAgICBnZXRDb25zdHJhaW50TGVuZ3RoOiBmdW5jdGlvbiAoY29uc3RyYWludClcclxuICAgIHtcclxuICAgICAgICB2YXIgYVggPSBjb25zdHJhaW50LnBvaW50QS54O1xyXG4gICAgICAgIHZhciBhWSA9IGNvbnN0cmFpbnQucG9pbnRBLnk7XHJcbiAgICAgICAgdmFyIGJYID0gY29uc3RyYWludC5wb2ludEIueDtcclxuICAgICAgICB2YXIgYlkgPSBjb25zdHJhaW50LnBvaW50Qi55O1xyXG5cclxuICAgICAgICBpZiAoY29uc3RyYWludC5ib2R5QSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFYICs9IGNvbnN0cmFpbnQuYm9keUEucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgYVkgKz0gY29uc3RyYWludC5ib2R5QS5wb3NpdGlvbi55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQuYm9keUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBiWCArPSBjb25zdHJhaW50LmJvZHlCLnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIGJZICs9IGNvbnN0cmFpbnQuYm9keUIucG9zaXRpb24ueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBEaXN0YW5jZUJldHdlZW4oYVgsIGFZLCBiWCwgYlkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsaWducyBhIEJvZHksIG9yIE1hdHRlciBHYW1lIE9iamVjdCwgYWdhaW5zdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBhbGlnbm1lbnQgdGFrZXMgcGxhY2UgdXNpbmcgdGhlIGJvZHkgYm91bmRzLCB3aGljaCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGluZ3NcclxuICAgICAqIGxpa2UgYm9keSBzY2FsZSBhbmQgcm90YXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEFsdGhvdWdoIGEgQm9keSBoYXMgYSBgcG9zaXRpb25gIHByb3BlcnR5LCBpdCBpcyBiYXNlZCBvbiB0aGUgY2VudGVyIG9mIG1hc3MgZm9yIHRoZSBib2R5LFxyXG4gICAgICogbm90IGEgZGltZW5zaW9uIGJhc2VkIGNlbnRlci4gVGhpcyBtYWtlcyBhbGlnbmluZyBib2RpZXMgZGlmZmljdWx0LCBlc3BlY2lhbGx5IGlmIHRoZXkgaGF2ZVxyXG4gICAgICogcm90YXRlZCBvciBzY2FsZWQuIFRoaXMgbWV0aG9kIHdpbGwgZGVyaXZlIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBib2R5IGJvdW5kcyBhbmRcclxuICAgICAqIGl0cyBjZW50ZXIgb2YgbWFzcyBvZmZzZXQsIGluIG9yZGVyIHRvIGFsaWduIHRoZSBib2R5IHdpdGggdGhlIGdpdmVuIGNvb3JkaW5hdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGFsaWduIGEgYm9keSBzbyBpdCBzYXQgaW4gdGhlIGJvdHRvbS1jZW50ZXIgb2YgdGhlXHJcbiAgICAgKiBTY2VuZSwgYW5kIHRoZSB3b3JsZCB3YXMgODAwIHggNjAwIGluIHNpemU6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMubWF0dGVyLmFsaWduQm9keShib2R5LCA0MDAsIDYwMCwgUGhhc2VyLkRpc3BsYXkuQWxpZ24uQk9UVE9NX0NFTlRFUik7XHJcbiAgICAgKiBgYGBcclxuICAgICAqIFxyXG4gICAgICogWW91IHBhc3MgaW4gNDAwIGZvciB0aGUgeCBjb29yZGluYXRlLCBiZWNhdXNlIHRoYXQgaXMgdGhlIGNlbnRlciBvZiB0aGUgd29ybGQsIGFuZCA2MDAgZm9yXHJcbiAgICAgKiB0aGUgeSBjb29yZGluYXRlLCBhcyB0aGF0IGlzIHRoZSBiYXNlIG9mIHRoZSB3b3JsZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5NYXR0ZXJQaHlzaWNzI2FsaWduQm9keVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHl9IGJvZHkgLSBUaGUgQm9keSB0byBhbGlnbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gdG8gYWxpZ24gdGhlIGJvZHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBhbGlnbiB0aGUgYm9keSB0by5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYWxpZ24gLSBPbmUgb2YgdGhlIGBQaGFzZXIuRGlzcGxheS5BbGlnbmAgY29uc3RhbnRzLCBzdWNoIGFzIGBQaGFzZXIuRGlzcGxheS5BbGlnbi5UT1BfTEVGVGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgUGh5c2ljcyBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWxpZ25Cb2R5OiBmdW5jdGlvbiAoYm9keSwgeCwgeSwgYWxpZ24pXHJcbiAgICB7XHJcbiAgICAgICAgYm9keSA9IChib2R5Lmhhc093blByb3BlcnR5KCdib2R5JykpID8gYm9keS5ib2R5IDogYm9keTtcclxuXHJcbiAgICAgICAgdmFyIHBvcztcclxuXHJcbiAgICAgICAgc3dpdGNoIChhbGlnbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuVE9QX0xFRlQ6XHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuTEVGVF9UT1A6XHJcbiAgICAgICAgICAgICAgICBwb3MgPSB0aGlzLmJvZHlCb3VuZHMuZ2V0VG9wTGVmdChib2R5LCB4LCB5KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBBTElHTl9DT05TVC5UT1BfQ0VOVEVSOlxyXG4gICAgICAgICAgICAgICAgcG9zID0gdGhpcy5ib2R5Qm91bmRzLmdldFRvcENlbnRlcihib2R5LCB4LCB5KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuVE9QX1JJR0hUOlxyXG4gICAgICAgICAgICBjYXNlIEFMSUdOX0NPTlNULlJJR0hUX1RPUDpcclxuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuYm9keUJvdW5kcy5nZXRUb3BSaWdodChib2R5LCB4LCB5KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBBTElHTl9DT05TVC5MRUZUX0NFTlRFUjpcclxuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuYm9keUJvdW5kcy5nZXRMZWZ0Q2VudGVyKGJvZHksIHgsIHkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEFMSUdOX0NPTlNULkNFTlRFUjpcclxuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuYm9keUJvdW5kcy5nZXRDZW50ZXIoYm9keSwgeCwgeSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuUklHSFRfQ0VOVEVSOlxyXG4gICAgICAgICAgICAgICAgcG9zID0gdGhpcy5ib2R5Qm91bmRzLmdldFJpZ2h0Q2VudGVyKGJvZHksIHgsIHkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEFMSUdOX0NPTlNULkxFRlRfQk9UVE9NOlxyXG4gICAgICAgICAgICBjYXNlIEFMSUdOX0NPTlNULkJPVFRPTV9MRUZUOlxyXG4gICAgICAgICAgICAgICAgcG9zID0gdGhpcy5ib2R5Qm91bmRzLmdldEJvdHRvbUxlZnQoYm9keSwgeCwgeSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuQk9UVE9NX0NFTlRFUjpcclxuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuYm9keUJvdW5kcy5nZXRCb3R0b21DZW50ZXIoYm9keSwgeCwgeSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQUxJR05fQ09OU1QuQk9UVE9NX1JJR0hUOlxyXG4gICAgICAgICAgICBjYXNlIEFMSUdOX0NPTlNULlJJR0hUX0JPVFRPTTpcclxuICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuYm9keUJvdW5kcy5nZXRCb3R0b21SaWdodChib2R5LCB4LCB5KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBvcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwgcG9zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgc2h1dHRpbmcgZG93bi5cclxuICAgICAqIFdlIG5lZWQgdG8ga2lsbCBhbmQgcmVzZXQgYWxsIGludGVybmFsIHByb3BlcnRpZXMgYXMgd2VsbCBhcyBzdG9wIGxpc3RlbmluZyB0byBTY2VuZSBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUGh5c2ljcyNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud29ybGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy53b3JsZC51cGRhdGUsIHRoaXMud29ybGQpO1xyXG4gICAgICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBPU1RfVVBEQVRFLCB0aGlzLndvcmxkLnBvc3RVcGRhdGUsIHRoaXMud29ybGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9mZihTY2VuZUV2ZW50cy5TSFVURE9XTiwgdGhpcy5zaHV0ZG93biwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFkZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLndvcmxkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JsZC5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy53b3JsZCA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3MjZGVzdHJveVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdNYXR0ZXJQaHlzaWNzJywgTWF0dGVyUGh5c2ljcywgJ21hdHRlclBoeXNpY3MnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyUGh5c2ljcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQW5pbWF0aW9uQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cy9BbmltYXRpb24nKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0Jyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBQaXBlbGluZSA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvUGlwZWxpbmUnKTtcclxudmFyIFNwcml0ZSA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL3Nwcml0ZS9TcHJpdGUnKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgTWF0dGVyIFBoeXNpY3MgU3ByaXRlIEdhbWUgT2JqZWN0LlxyXG4gKlxyXG4gKiBBIFNwcml0ZSBHYW1lIE9iamVjdCBpcyB1c2VkIGZvciB0aGUgZGlzcGxheSBvZiBib3RoIHN0YXRpYyBhbmQgYW5pbWF0ZWQgaW1hZ2VzIGluIHlvdXIgZ2FtZS5cclxuICogU3ByaXRlcyBjYW4gaGF2ZSBpbnB1dCBldmVudHMgYW5kIHBoeXNpY3MgYm9kaWVzLiBUaGV5IGNhbiBhbHNvIGJlIHR3ZWVuZWQsIHRpbnRlZCwgc2Nyb2xsZWRcclxuICogYW5kIGFuaW1hdGVkLlxyXG4gKlxyXG4gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYSBTcHJpdGUgYW5kIGFuIEltYWdlIEdhbWUgT2JqZWN0IGlzIHRoYXQgeW91IGNhbm5vdCBhbmltYXRlIEltYWdlcy5cclxuICogQXMgc3VjaCwgU3ByaXRlcyB0YWtlIGEgZnJhY3Rpb24gbG9uZ2VyIHRvIHByb2Nlc3MgYW5kIGhhdmUgYSBsYXJnZXIgQVBJIGZvb3RwcmludCBkdWUgdG8gdGhlIEFuaW1hdGlvblxyXG4gKiBDb21wb25lbnQuIElmIHlvdSBkbyBub3QgcmVxdWlyZSBhbmltYXRpb24gdGhlbiB5b3UgY2FuIHNhZmVseSB1c2UgSW1hZ2VzIHRvIHJlcGxhY2UgU3ByaXRlcyBpbiBhbGwgY2FzZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBTcHJpdGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuQm91bmNlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkNvbGxpc2lvblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Gb3JjZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5GcmljdGlvblxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5HcmF2aXR5XHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLk1hc3NcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2Vuc29yXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNldEJvZHlcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2xlZXBcclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU3RhdGljXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5CbGVuZE1vZGVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5TaXplXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVGludFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZH0gd29ybGQgLSBBIHJlZmVyZW5jZSB0byB0aGUgTWF0dGVyLldvcmxkIGluc3RhbmNlIHRoYXQgdGhpcyBib2R5IGJlbG9uZ3MgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdCBpbiB0aGUgd29ybGQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QgaW4gdGhlIHdvcmxkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCB3aWxsIHVzZSB0byByZW5kZXIgd2l0aCwgYXMgc3RvcmVkIGluIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIEFuIG9wdGlvbmFsIGZyYW1lIGZyb20gdGhlIFRleHR1cmUgdGhpcyBHYW1lIE9iamVjdCBpcyByZW5kZXJpbmcgd2l0aC5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gKi9cclxudmFyIE1hdHRlclNwcml0ZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogU3ByaXRlLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQm91bmNlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ29sbGlzaW9uLFxyXG4gICAgICAgIENvbXBvbmVudHMuRm9yY2UsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GcmljdGlvbixcclxuICAgICAgICBDb21wb25lbnRzLkdyYXZpdHksXHJcbiAgICAgICAgQ29tcG9uZW50cy5NYXNzLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Vuc29yLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2V0Qm9keSxcclxuICAgICAgICBDb21wb25lbnRzLlNsZWVwLFxyXG4gICAgICAgIENvbXBvbmVudHMuU3RhdGljLFxyXG4gICAgICAgIENvbXBvbmVudHMuVHJhbnNmb3JtLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmVsb2NpdHksXHJcbiAgICAgICAgUGlwZWxpbmVcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBNYXR0ZXJTcHJpdGUgKHdvcmxkLCB4LCB5LCB0ZXh0dXJlLCBmcmFtZSwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgd29ybGQuc2NlbmUsICdTcHJpdGUnKTtcclxuXHJcbiAgICAgICAgdGhpcy5hbmltcyA9IG5ldyBBbmltYXRpb25Db21wb25lbnQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZSh0ZXh0dXJlLCBmcmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplVG9GcmFtZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBNYXR0ZXIuV29ybGQgaW5zdGFuY2UgdGhhdCB0aGlzIGJvZHkgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5TcHJpdGUjd29ybGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud29ybGQgPSB3b3JsZDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW50ZXJuYWwgdGVtcCB2ZWN0b3IgdXNlZCBmb3IgdmVsb2NpdHkgYW5kIGZvcmNlIGNhbGN1bGF0aW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5TcHJpdGUjX3RlbXBWZWMyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wVmVjMiA9IG5ldyBWZWN0b3IyKHgsIHkpO1xyXG5cclxuICAgICAgICB2YXIgc2hhcGUgPSBHZXRGYXN0VmFsdWUob3B0aW9ucywgJ3NoYXBlJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChzaGFwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keShzaGFwZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmVjdGFuZ2xlKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oeCwgeSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFBpcGVsaW5lKCdUZXh0dXJlVGludFBpcGVsaW5lJyk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyU3ByaXRlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb2RpZXMgPSByZXF1aXJlKCcuL2xpYi9mYWN0b3J5L0JvZGllcycpO1xyXG52YXIgQm9keSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4vY29tcG9uZW50cycpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgSGFzVmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvSGFzVmFsdWUnKTtcclxudmFyIFZlcnRpY2VzID0gcmVxdWlyZSgnLi9saWIvZ2VvbWV0cnkvVmVydGljZXMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgd3JhcHBlciBhcm91bmQgYSBUaWxlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgY29ycmVzcG9uZGluZyBNYXR0ZXIgYm9keS4gQSB0aWxlIGNhbiBvbmx5XHJcbiAqIGhhdmUgb25lIE1hdHRlciBib2R5IGFzc29jaWF0ZWQgd2l0aCBpdC4gWW91IGNhbiBlaXRoZXIgcGFzcyBpbiBhbiBleGlzdGluZyBNYXR0ZXIgYm9keSBmb3JcclxuICogdGhlIHRpbGUgb3IgYWxsb3cgdGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBib2R5IGZvciB5b3UuIElmIHRoZSBUaWxlIGhhcyBhXHJcbiAqIGNvbGxpc2lvbiBncm91cCAoZGVmaW5lZCBpbiBUaWxlZCksIHRob3NlIHNoYXBlcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBib2R5LiBJZiBub3QsIHRoZVxyXG4gKiB0aWxlJ3MgcmVjdGFuZ2xlIGJvdW5kaW5nIGJveCB3aWxsIGJlIHVzZWQuXHJcbiAqXHJcbiAqIFRoZSBjb3JyZXNwb25kaW5nIGJvZHkgd2lsbCBiZSBhY2Nlc3NpYmxlIG9uIHRoZSBUaWxlIGl0c2VsZiB2aWEgVGlsZS5waHlzaWNzLm1hdHRlckJvZHkuXHJcbiAqXHJcbiAqIE5vdGU6IG5vdCBhbGwgVGlsZWQgY29sbGlzaW9uIHNoYXBlcyBhcmUgc3VwcG9ydGVkLiBTZWVcclxuICogUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5I3NldEZyb21UaWxlQ29sbGlzaW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gKlxyXG4gKiBAY2xhc3MgVGlsZUJvZHlcclxuICogQG1lbWJlcm9mIFBoYXNlci5QaHlzaWNzLk1hdHRlclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkJvdW5jZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb25cclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuRnJpY3Rpb25cclxuICogQGV4dGVuZHMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuR3Jhdml0eVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5NYXNzXHJcbiAqIEBleHRlbmRzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNlbnNvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TbGVlcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TdGF0aWNcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IHdvcmxkIC0gVGhlIE1hdHRlciB3b3JsZCBpbnN0YW5jZSB0aGlzIGJvZHkgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gdGlsZSAtIFRoZSB0YXJnZXQgdGlsZSB0aGF0IHNob3VsZCBoYXZlIGEgTWF0dGVyIGJvZHkuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlclRpbGVPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgTWF0dGVyIGJvZHkuXHJcbiAqL1xyXG52YXIgTWF0dGVyVGlsZUJvZHkgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkJvdW5jZSxcclxuICAgICAgICBDb21wb25lbnRzLkNvbGxpc2lvbixcclxuICAgICAgICBDb21wb25lbnRzLkZyaWN0aW9uLFxyXG4gICAgICAgIENvbXBvbmVudHMuR3Jhdml0eSxcclxuICAgICAgICBDb21wb25lbnRzLk1hc3MsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TZW5zb3IsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TbGVlcCxcclxuICAgICAgICBDb21wb25lbnRzLlN0YXRpY1xyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE1hdHRlclRpbGVCb2R5ICh3b3JsZCwgdGlsZSwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbGUgb2JqZWN0IHRoZSBib2R5IGlzIGFzc29jaWF0ZWQgd2l0aC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keSN0aWxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5UaWxlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZSA9IHRpbGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBNYXR0ZXIgd29ybGQgdGhlIGJvZHkgZXhpc3RzIHdpdGhpbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keSN3b3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53b3JsZCA9IHdvcmxkO1xyXG5cclxuICAgICAgICAvLyBJbnN0YWxsIGEgcmVmZXJlbmNlIHRvICd0aGlzJyBvbiB0aGUgdGlsZSBhbmQgZW5zdXJlIHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXR0ZXIgYm9keVxyXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGlsZVxyXG4gICAgICAgIGlmICh0aWxlLnBoeXNpY3MubWF0dGVyQm9keSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpbGUucGh5c2ljcy5tYXR0ZXJCb2R5LmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRpbGUucGh5c2ljcy5tYXR0ZXJCb2R5ID0gdGhpcztcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBib2R5IGVpdGhlciBmcm9tIGFuIGV4aXN0aW5nIGJvZHkgKGlmIHByb3ZpZGVkKSwgdGhlIHNoYXBlcyBpbiB0aGUgdGlsZXNldFxyXG4gICAgICAgIC8vIGNvbGxpc2lvbiBsYXllciAoaWYgaXQgZXhpc3RzKSBvciBhIHJlY3RhbmdsZSBtYXRjaGluZyB0aGUgdGlsZS5cclxuICAgICAgICB2YXIgYm9keSA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnYm9keScsIG51bGwpO1xyXG5cclxuICAgICAgICB2YXIgYWRkVG9Xb3JsZCA9IEdldEZhc3RWYWx1ZShvcHRpb25zLCAnYWRkVG9Xb3JsZCcsIHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoIWJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29sbGlzaW9uR3JvdXAgPSB0aWxlLmdldENvbGxpc2lvbkdyb3VwKCk7XHJcbiAgICAgICAgICAgIHZhciBjb2xsaXNpb25PYmplY3RzID0gR2V0RmFzdFZhbHVlKGNvbGxpc2lvbkdyb3VwLCAnb2JqZWN0cycsIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25PYmplY3RzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RnJvbVRpbGVDb2xsaXNpb24ob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZyb21UaWxlUmVjdGFuZ2xlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keShib2R5LCBhZGRUb1dvcmxkKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBib2R5IHRvIGEgcmVjdGFuZ2xlIHRoYXQgbWF0Y2hlcyB0aGUgYm91bmRzIG9mIHRoZSB0aWxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5I3NldEZyb21UaWxlUmVjdGFuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5VGlsZU9wdGlvbnN9IFtvcHRpb25zXSAtIE9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBNYXR0ZXIgYm9keS4gU2VlIE1hdHRlckpTLkJvZHkgZm9yIGEgbGlzdCBvZiB3aGF0IE1hdHRlciBhY2NlcHRzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuVGlsZUJvZHl9IFRoaXMgVGlsZUJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGcm9tVGlsZVJlY3RhbmdsZTogZnVuY3Rpb24gKG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0ge307IH1cclxuICAgICAgICBpZiAoIUhhc1ZhbHVlKG9wdGlvbnMsICdpc1N0YXRpYycpKSB7IG9wdGlvbnMuaXNTdGF0aWMgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKCFIYXNWYWx1ZShvcHRpb25zLCAnYWRkVG9Xb3JsZCcpKSB7IG9wdGlvbnMuYWRkVG9Xb3JsZCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMudGlsZS5nZXRCb3VuZHMoKTtcclxuICAgICAgICB2YXIgY3ggPSBib3VuZHMueCArIChib3VuZHMud2lkdGggLyAyKTtcclxuICAgICAgICB2YXIgY3kgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgdmFyIGJvZHkgPSBCb2RpZXMucmVjdGFuZ2xlKGN4LCBjeSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRCb2R5KGJvZHksIG9wdGlvbnMuYWRkVG9Xb3JsZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgYm9keSBmcm9tIHRoZSBjb2xsaXNpb24gZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBUaWxlLiBUaGlzIGlzIHR5cGljYWxseVxyXG4gICAgICogc2V0IHVwIGluIFRpbGVkJ3MgY29sbGlzaW9uIGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBNYXR0ZXIgZG9lc24ndCBzdXBwb3J0IGFsbCBzaGFwZXMgZnJvbSBUaWxlZC4gUmVjdGFuZ2xlcyBhbmQgcG9seWdvbnMgYXJlIGRpcmVjdGx5XHJcbiAgICAgKiBzdXBwb3J0ZWQuIEVsbGlwc2VzIGFyZSBjb252ZXJ0ZWQgaW50byBjaXJjbGUgYm9kaWVzLiBQb2x5bGluZXMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBhcmVcclxuICAgICAqIGNsb3NlZCBwb2x5Z29ucy4gSWYgYSB0aWxlIGhhcyBtdWx0aXBsZSBzaGFwZXMsIGEgbXVsdGktcGFydCBib2R5IHdpbGwgYmUgY3JlYXRlZC4gQ29uY2F2ZVxyXG4gICAgICogc2hhcGVzIGFyZSBzdXBwb3J0ZWQgaWYgcG9seS1kZWNvbXAgbGlicmFyeSBpcyBpbmNsdWRlZC4gRGVjb21wb3NpdGlvbiBpcyBub3QgZ3VhcmFudGVlZCB0b1xyXG4gICAgICogd29yayBmb3IgY29tcGxleCBzaGFwZXMgKGUuZy4gaG9sZXMpLCBzbyBpdCdzIG9mdGVuIGJlc3QgdG8gbWFudWFsbHkgZGVjb21wb3NlIGEgY29uY2F2ZVxyXG4gICAgICogcG9seWdvbiBpbnRvIG11bHRpcGxlIGNvbnZleCBwb2x5Z29ucyB5b3Vyc2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keSNzZXRGcm9tVGlsZUNvbGxpc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keVRpbGVPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgTWF0dGVyIGJvZHkuIFNlZSBNYXR0ZXJKUy5Cb2R5IGZvciBhIGxpc3Qgb2Ygd2hhdCBNYXR0ZXIgYWNjZXB0cy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5fSBUaGlzIFRpbGVCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RnJvbVRpbGVDb2xsaXNpb246IGZ1bmN0aW9uIChvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHsgb3B0aW9ucyA9IHt9OyB9XHJcbiAgICAgICAgaWYgKCFIYXNWYWx1ZShvcHRpb25zLCAnaXNTdGF0aWMnKSkgeyBvcHRpb25zLmlzU3RhdGljID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmICghSGFzVmFsdWUob3B0aW9ucywgJ2FkZFRvV29ybGQnKSkgeyBvcHRpb25zLmFkZFRvV29ybGQgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciBzeCA9IHRoaXMudGlsZS50aWxlbWFwTGF5ZXIuc2NhbGVYO1xyXG4gICAgICAgIHZhciBzeSA9IHRoaXMudGlsZS50aWxlbWFwTGF5ZXIuc2NhbGVZO1xyXG4gICAgICAgIHZhciB0aWxlWCA9IHRoaXMudGlsZS5nZXRMZWZ0KCk7XHJcbiAgICAgICAgdmFyIHRpbGVZID0gdGhpcy50aWxlLmdldFRvcCgpO1xyXG4gICAgICAgIHZhciBjb2xsaXNpb25Hcm91cCA9IHRoaXMudGlsZS5nZXRDb2xsaXNpb25Hcm91cCgpO1xyXG4gICAgICAgIHZhciBjb2xsaXNpb25PYmplY3RzID0gR2V0RmFzdFZhbHVlKGNvbGxpc2lvbkdyb3VwLCAnb2JqZWN0cycsIFtdKTtcclxuXHJcbiAgICAgICAgdmFyIHBhcnRzID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uT2JqZWN0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBjb2xsaXNpb25PYmplY3RzW2ldO1xyXG4gICAgICAgICAgICB2YXIgb3ggPSB0aWxlWCArIChvYmplY3QueCAqIHN4KTtcclxuICAgICAgICAgICAgdmFyIG95ID0gdGlsZVkgKyAob2JqZWN0LnkgKiBzeSk7XHJcbiAgICAgICAgICAgIHZhciBvdyA9IG9iamVjdC53aWR0aCAqIHN4O1xyXG4gICAgICAgICAgICB2YXIgb2ggPSBvYmplY3QuaGVpZ2h0ICogc3k7XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChvYmplY3QucmVjdGFuZ2xlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gQm9kaWVzLnJlY3RhbmdsZShveCArIG93IC8gMiwgb3kgKyBvaCAvIDIsIG93LCBvaCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0LmVsbGlwc2UpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBCb2RpZXMuY2lyY2xlKG94ICsgb3cgLyAyLCBveSArIG9oIC8gMiwgb3cgLyAyLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChvYmplY3QucG9seWdvbiB8fCBvYmplY3QucG9seWxpbmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIFBvbHlnb25zIGFuZCBwb2x5bGluZXMgYXJlIGJvdGggdHJlYXRlZCBhcyBjbG9zZWQgcG9seWdvbnNcclxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbFBvaW50cyA9IG9iamVjdC5wb2x5Z29uID8gb2JqZWN0LnBvbHlnb24gOiBvYmplY3QucG9seWxpbmU7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IG9yaWdpbmFsUG9pbnRzLm1hcChmdW5jdGlvbiAocClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4OiBwLnggKiBzeCwgeTogcC55ICogc3kgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFZlcnRpY2VzLmNyZWF0ZShwb2ludHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFBvaW50cyBhcmUgcmVsYXRpdmUgdG8gdGhlIG9iamVjdCdzIG9yaWdpbiAoZmlyc3QgcG9pbnQgcGxhY2VkIGluIFRpbGVkKSwgYnV0XHJcbiAgICAgICAgICAgICAgICAvLyBtYXR0ZXIgZXhwZWN0cyBwb2ludHMgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGNlbnRlciBvZiBtYXNzLiBUaGlzIG9ubHkgYXBwbGllcyB0b1xyXG4gICAgICAgICAgICAgICAgLy8gY29udmV4IHNoYXBlcy4gV2hlbiBhIGNvbmNhdmUgc2hhcGUgaXMgZGVjb21wb3NlZCwgbXVsdGlwbGUgcGFydHMgYXJlIGNyZWF0ZWQgYW5kXHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBhcmUgcG9zaXRpb25lZCByZWxhdGl2ZSB0byAob3gsIG95KS5cclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAvLyAgVXBkYXRlOiA4dGggSmFudWFyeSAyMDE5IC0gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE1hdHRlciBuZWVkcyB0aGUgVmVydGljZXMgYWRqdXN0ZWQsXHJcbiAgICAgICAgICAgICAgICAvLyAgcmVnYXJkbGVzcyBpZiBjb252ZXggb3IgY29uY2F2ZS5cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gVmVydGljZXMuY2VudHJlKHZlcnRpY2VzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBveCArPSBjZW50ZXIueDtcclxuICAgICAgICAgICAgICAgIG95ICs9IGNlbnRlci55O1xyXG5cclxuICAgICAgICAgICAgICAgIGJvZHkgPSBCb2RpZXMuZnJvbVZlcnRpY2VzKG94LCBveSwgdmVydGljZXMsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChib2R5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keShwYXJ0c1swXSwgb3B0aW9ucy5hZGRUb1dvcmxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocGFydHMubGVuZ3RoID4gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFydHMgPSBwYXJ0cztcclxuICAgICAgICAgICAgdGhpcy5zZXRCb2R5KEJvZHkuY3JlYXRlKG9wdGlvbnMpLCBvcHRpb25zLmFkZFRvV29ybGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBib2R5IHRvIHRoZSBnaXZlbiBib2R5LiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBwcmV2aW91cyBib2R5LCBpZiBvbmUgYWxyZWFkeVxyXG4gICAgICogZXhpc3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5I3NldEJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQm9keVR5cGV9IGJvZHkgLSBUaGUgbmV3IE1hdHRlciBib2R5IHRvIHVzZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZFRvV29ybGQ9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byBhZGQgdGhlIGJvZHkgdG8gdGhlIE1hdHRlciB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5fSBUaGlzIFRpbGVCb2R5IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm9keTogZnVuY3Rpb24gKGJvZHksIGFkZFRvV29ybGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFkZFRvV29ybGQgPT09IHVuZGVmaW5lZCkgeyBhZGRUb1dvcmxkID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVCb2R5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xyXG4gICAgICAgIHRoaXMuYm9keS5nYW1lT2JqZWN0ID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGFkZFRvV29ybGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmFkZCh0aGlzLmJvZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBib2R5IGZyb20gdGhlIFRpbGVCb2R5IGFuZCBmcm9tIHRoZSBNYXR0ZXIgd29ybGRcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keSNyZW1vdmVCb2R5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuVGlsZUJvZHl9IFRoaXMgVGlsZUJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVCb2R5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLnJlbW92ZSh0aGlzLmJvZHkpO1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZ2FtZU9iamVjdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgdGhpcy5ib2R5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBib2R5IGZyb20gdGhlIHRpbGUgYW5kIHRoZSB3b3JsZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5UaWxlQm9keSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuVGlsZUJvZHl9IFRoaXMgVGlsZUJvZHkgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQm9keSgpO1xyXG4gICAgICAgIHRoaXMudGlsZS5waHlzaWNzLm1hdHRlckJvZHkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXR0ZXJUaWxlQm9keTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgSm9hY2hpbSBHcmlsbCA8am9hY2hpbUBjb2RlYW5kd2ViLmNvbT5cclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDE4IENvZGVBbmRXZWIgR21iSFxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJvZGllcyA9IHJlcXVpcmUoJy4vbGliL2ZhY3RvcnkvQm9kaWVzJyk7XHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi9saWIvYm9keS9Cb2R5Jyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuL2xpYi9jb3JlL0NvbW1vbicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgVmVydGljZXMgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9WZXJ0aWNlcycpO1xyXG5cclxuLyoqXHJcbiAqIFVzZSBQaHlzaWNzRWRpdG9yUGFyc2VyLnBhcnNlQm9keSgpIHRvIGJ1aWxkIGEgTWF0dGVyIGJvZHkgb2JqZWN0LCBiYXNlZCBvbiBhIHBoeXNpY3MgZGF0YSBmaWxlXHJcbiAqIGNyZWF0ZWQgYW5kIGV4cG9ydGVkIHdpdGggUGh5c2ljc0VkaXRvciAoaHR0cHM6Ly93d3cuY29kZWFuZHdlYi5jb20vcGh5c2ljc2VkaXRvcikuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBoeXNpY3NFZGl0b3JQYXJzZXJcclxuICogQHNpbmNlIDMuMTAuMFxyXG4gKi9cclxudmFyIFBoeXNpY3NFZGl0b3JQYXJzZXIgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBib2R5IGVsZW1lbnQgZXhwb3J0ZWQgYnkgUGh5c2ljc0VkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBoeXNpY3NFZGl0b3JQYXJzZXIucGFyc2VCb2R5XHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCB3b3JsZCBsb2NhdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHdvcmxkIGxvY2F0aW9uIG9mIHRoZSBib2R5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBib2R5IGNvbmZpZ3VyYXRpb24gYW5kIGZpeHR1cmUgKGNoaWxkIGJvZHkpIGRlZmluaXRpb25zLCBhcyBleHBvcnRlZCBieSBQaHlzaWNzRWRpdG9yLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gQSBjb21wb3VuZCBNYXR0ZXIgSlMgQm9keS5cclxuICAgICAqL1xyXG4gICAgcGFyc2VCb2R5OiBmdW5jdGlvbiAoeCwgeSwgY29uZmlnLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHsgb3B0aW9ucyA9IHt9OyB9XHJcblxyXG4gICAgICAgIHZhciBmaXh0dXJlQ29uZmlncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdmaXh0dXJlcycsIFtdKTtcclxuICAgICAgICB2YXIgZml4dHVyZXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgZmMgPSAwOyBmYyA8IGZpeHR1cmVDb25maWdzLmxlbmd0aDsgZmMrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmaXh0dXJlUGFydHMgPSB0aGlzLnBhcnNlRml4dHVyZShmaXh0dXJlQ29uZmlnc1tmY10pO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaXh0dXJlUGFydHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZpeHR1cmVzLnB1c2goZml4dHVyZVBhcnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG1hdHRlckNvbmZpZyA9IENvbW1vbi5jbG9uZShjb25maWcsIHRydWUpO1xyXG5cclxuICAgICAgICBDb21tb24uZXh0ZW5kKG1hdHRlckNvbmZpZywgb3B0aW9ucywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRlbGV0ZSBtYXR0ZXJDb25maWcuZml4dHVyZXM7XHJcbiAgICAgICAgZGVsZXRlIG1hdHRlckNvbmZpZy50eXBlO1xyXG5cclxuICAgICAgICB2YXIgYm9keSA9IEJvZHkuY3JlYXRlKG1hdHRlckNvbmZpZyk7XHJcblxyXG4gICAgICAgIEJvZHkuc2V0UGFydHMoYm9keSwgZml4dHVyZXMpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwgeyB4OiB4LCB5OiB5IH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYW4gZWxlbWVudCBvZiB0aGUgXCJmaXh0dXJlc1wiIGxpc3QgZXhwb3J0ZWQgYnkgUGh5c2ljc0VkaXRvclxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUGh5c2ljc0VkaXRvclBhcnNlci5wYXJzZUZpeHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZml4dHVyZUNvbmZpZyAtIFRoZSBmaXh0dXJlIG9iamVjdCB0byBwYXJzZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGVbXX0gLSBBbiBhcnJheSBvZiBNYXR0ZXIgSlMgQm9kaWVzLlxyXG4gICAgICovXHJcbiAgICBwYXJzZUZpeHR1cmU6IGZ1bmN0aW9uIChmaXh0dXJlQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtYXR0ZXJDb25maWcgPSBDb21tb24uZXh0ZW5kKHt9LCBmYWxzZSwgZml4dHVyZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIGRlbGV0ZSBtYXR0ZXJDb25maWcuY2lyY2xlO1xyXG4gICAgICAgIGRlbGV0ZSBtYXR0ZXJDb25maWcudmVydGljZXM7XHJcblxyXG4gICAgICAgIHZhciBmaXh0dXJlcztcclxuXHJcbiAgICAgICAgaWYgKGZpeHR1cmVDb25maWcuY2lyY2xlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHggPSBHZXRGYXN0VmFsdWUoZml4dHVyZUNvbmZpZy5jaXJjbGUsICd4Jyk7XHJcbiAgICAgICAgICAgIHZhciB5ID0gR2V0RmFzdFZhbHVlKGZpeHR1cmVDb25maWcuY2lyY2xlLCAneScpO1xyXG4gICAgICAgICAgICB2YXIgciA9IEdldEZhc3RWYWx1ZShmaXh0dXJlQ29uZmlnLmNpcmNsZSwgJ3JhZGl1cycpO1xyXG4gICAgICAgICAgICBmaXh0dXJlcyA9IFsgQm9kaWVzLmNpcmNsZSh4LCB5LCByLCBtYXR0ZXJDb25maWcpIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZpeHR1cmVDb25maWcudmVydGljZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmaXh0dXJlcyA9IHRoaXMucGFyc2VWZXJ0aWNlcyhmaXh0dXJlQ29uZmlnLnZlcnRpY2VzLCBtYXR0ZXJDb25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZpeHR1cmVzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyB0aGUgXCJ2ZXJ0aWNlc1wiIGxpc3RzIGV4cG9ydGVkIGJ5IFBoeXNpY3NFZGl0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5QaHlzaWNzLk1hdHRlci5QaHlzaWNzRWRpdG9yUGFyc2VyLnBhcnNlVmVydGljZXNcclxuICAgICAqIEBzaW5jZSAzLjEwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSB2ZXJ0ZXhTZXRzIC0gVGhlIHZlcnRleCBsaXN0cyB0byBwYXJzZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGVbXX0gLSBBbiBhcnJheSBvZiBNYXR0ZXIgSlMgQm9kaWVzLlxyXG4gICAgICovXHJcbiAgICBwYXJzZVZlcnRpY2VzOiBmdW5jdGlvbiAodmVydGV4U2V0cywgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG5cclxuICAgICAgICB2YXIgcGFydHMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCB2ZXJ0ZXhTZXRzLmxlbmd0aDsgdisrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgVmVydGljZXMuY2xvY2t3aXNlU29ydCh2ZXJ0ZXhTZXRzW3ZdKTtcclxuXHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogVmVydGljZXMuY2VudHJlKHZlcnRleFNldHNbdl0pLFxyXG4gICAgICAgICAgICAgICAgdmVydGljZXM6IHZlcnRleFNldHNbdl1cclxuICAgICAgICAgICAgfSwgb3B0aW9ucykpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZsYWcgY29pbmNpZGVudCBwYXJ0IGVkZ2VzXHJcbiAgICAgICAgcmV0dXJuIEJvZGllcy5mbGFnQ29pbmNpZGVudFBhcnRzKHBhcnRzKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGh5c2ljc0VkaXRvclBhcnNlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQm9kaWVzID0gcmVxdWlyZSgnLi9saWIvZmFjdG9yeS9Cb2RpZXMnKTtcclxudmFyIEJvZHkgPSByZXF1aXJlKCcuL2xpYi9ib2R5L0JvZHknKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgYm9keSB1c2luZyB0aGUgc3VwcGxpZWQgcGh5c2ljcyBkYXRhLCBhcyBwcm92aWRlZCBieSBhIEpTT04gZmlsZS5cclxuICogXHJcbiAqIFRoZSBkYXRhIGZpbGUgc2hvdWxkIGJlIGxvYWRlZCBhcyBKU09OOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBwcmVsb2FkICgpXHJcbiAqIHtcclxuICogICB0aGlzLmxvYWQuanNvbignbmluamFzJywgJ2Fzc2V0cy9uaW5qYXMuanNvbik7XHJcbiAqIH1cclxuICogXHJcbiAqIGNyZWF0ZSAoKVxyXG4gKiB7XHJcbiAqICAgY29uc3QgbmluamFTaGFwZXMgPSB0aGlzLmNhY2hlLmpzb24uZ2V0KCduaW5qYXMnKTtcclxuICogXHJcbiAqICAgdGhpcy5tYXR0ZXIuYWRkLmZyb21KU09OKDQwMCwgMzAwLCBuaW5qYVNoYXBlcy5zaGlub2JpKTtcclxuICogfVxyXG4gKiBgYGBcclxuICogXHJcbiAqIERvIG5vdCBwYXNzIHRoZSBlbnRpcmUgSlNPTiBmaWxlIHRvIHRoaXMgbWV0aG9kLCBidXQgaW5zdGVhZCBwYXNzIG9uZSBvZiB0aGUgc2hhcGVzIGNvbnRhaW5lZCB3aXRoaW4gaXQuXHJcbiAqIFxyXG4gKiBJZiB5b3UgcGFzIGluIGFuIGBvcHRpb25zYCBvYmplY3QsIGFueSBzZXR0aW5ncyBpbiB0aGVyZSB3aWxsIG92ZXJyaWRlIHRob3NlIGluIHRoZSBjb25maWcgb2JqZWN0LlxyXG4gKiBcclxuICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgSlNPTiBmaWxlIGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiBgYGB0ZXh0XHJcbiAqIHtcclxuICogICAnZ2VuZXJhdG9yX2luZm8nOiAvLyBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVkIHRoZSBKU09OIGRhdGFcclxuICogICAnc2hhcGVOYW1lJzoge1xyXG4gKiAgICAgJ3R5cGUnOiAvLyBUaGUgdHlwZSBvZiBib2R5XHJcbiAqICAgICAnbGFiZWwnOiAvLyBPcHRpb25hbCBib2R5IGxhYmVsXHJcbiAqICAgICAndmVydGljZXMnOiAvLyBBbiBhcnJheSwgb3IgYW4gYXJyYXkgb2YgYXJyYXlzLCBjb250YWluaW5nIHRoZSB2ZXJ0ZXggZGF0YSBpbiB4L3kgb2JqZWN0IHBhaXJzXHJcbiAqICAgfVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKiBcclxuICogQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgb25seSB0aGUgUGhhc2VyIFBoeXNpY3MgVHJhY2VyIEFwcCBleHBvcnRzIGluIHRoaXMgZm9ybWF0LlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLk1hdHRlci5QaHlzaWNzSlNPTlBhcnNlclxyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqL1xyXG52YXIgUGh5c2ljc0pTT05QYXJzZXIgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBib2R5IGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gSlNPTiBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUGh5c2ljc0pTT05QYXJzZXIucGFyc2VCb2R5XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCB3b3JsZCBsb2NhdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHdvcmxkIGxvY2F0aW9uIG9mIHRoZSBib2R5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBib2R5IGNvbmZpZ3VyYXRpb24gZGF0YS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IEEgTWF0dGVyIEpTIEJvZHkuXHJcbiAgICAgKi9cclxuICAgIHBhcnNlQm9keTogZnVuY3Rpb24gKHgsIHksIGNvbmZpZywgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG5cclxuICAgICAgICB2YXIgYm9keTtcclxuICAgICAgICB2YXIgdmVydGV4U2V0cyA9IGNvbmZpZy52ZXJ0aWNlcztcclxuXHJcbiAgICAgICAgaWYgKHZlcnRleFNldHMubGVuZ3RoID09PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEp1c3QgYSBzaW5nbGUgQm9keVxyXG4gICAgICAgICAgICBvcHRpb25zLnZlcnRpY2VzID0gdmVydGV4U2V0c1swXTtcclxuXHJcbiAgICAgICAgICAgIGJvZHkgPSBCb2R5LmNyZWF0ZShvcHRpb25zKTtcclxuXHJcbiAgICAgICAgICAgIEJvZGllcy5mbGFnQ29pbmNpZGVudFBhcnRzKGJvZHkucGFydHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFydHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGV4U2V0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBCb2R5LmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgdmVydGljZXM6IHZlcnRleFNldHNbaV1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gocGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEJvZGllcy5mbGFnQ29pbmNpZGVudFBhcnRzKHBhcnRzKTtcclxuXHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFydHMgPSBwYXJ0cztcclxuXHJcbiAgICAgICAgICAgIGJvZHkgPSBCb2R5LmNyZWF0ZShvcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJvZHkubGFiZWwgPSBjb25maWcubGFiZWw7XHJcblxyXG4gICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwgeyB4OiB4LCB5OiB5IH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBoeXNpY3NKU09OUGFyc2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb3VuZHMgPSByZXF1aXJlKCcuL2xpYi9nZW9tZXRyeS9Cb3VuZHMnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQ29tcG9zaXRlJyk7XHJcbnZhciBDb25zdHJhaW50ID0gcmVxdWlyZSgnLi9saWIvY29uc3RyYWludC9Db25zdHJhaW50Jyk7XHJcbnZhciBEZXRlY3RvciA9IHJlcXVpcmUoJy4vbGliL2NvbGxpc2lvbi9EZXRlY3RvcicpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIElucHV0RXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vaW5wdXQvZXZlbnRzJyk7XHJcbnZhciBNZXJnZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9NZXJnZScpO1xyXG52YXIgU2xlZXBpbmcgPSByZXF1aXJlKCcuL2xpYi9jb3JlL1NsZWVwaW5nJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9WZWN0b3IyJyk7XHJcbnZhciBWZXJ0aWNlcyA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L1ZlcnRpY2VzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFBvaW50ZXIgQ29uc3RyYWludCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBjb25zdHJhaW50IHRoYXQgYWxsb3dzIHlvdSB0byBjbGlja1xyXG4gKiBhbmQgZHJhZyBib2RpZXMgaW4gYSBNYXR0ZXIgV29ybGQuIEl0IG1vbml0b3JzIHRoZSBhY3RpdmUgUG9pbnRlcnMgaW4gYSBTY2VuZSxcclxuICogYW5kIHdoZW4gb25lIGlzIHByZXNzZWQgZG93biBpdCBjaGVja3MgdG8gc2VlIGlmIHRoYXQgaGl0IGFueSBwYXJ0IG9mIGFueSBhY3RpdmVcclxuICogYm9keSBpbiB0aGUgd29ybGQuIElmIGl0IGRpZCwgYW5kIHRoZSBib2R5IGhhcyBpbnB1dCBlbmFibGVkLCBpdCB3aWxsIGJlZ2luIHRvXHJcbiAqIGRyYWcgaXQgdW50aWwgZWl0aGVyIHJlbGVhc2VkLCBvciB5b3Ugc3RvcCBpdCB2aWEgdGhlIGBzdG9wRHJhZ2AgbWV0aG9kLlxyXG4gKiBcclxuICogWW91IGNhbiBhZGp1c3QgdGhlIHN0aWZmbmVzcywgbGVuZ3RoIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZSBjb25zdHJhaW50IHZpYVxyXG4gKiB0aGUgYG9wdGlvbnNgIG9iamVjdCBvbiBjcmVhdGlvbi5cclxuICpcclxuICogQGNsYXNzIFBvaW50ZXJDb25zdHJhaW50XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGh5c2ljcy5NYXR0ZXJcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBQb2ludGVyIENvbnN0cmFpbnQgYmVsb25ncy5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGR9IHdvcmxkIC0gQSByZWZlcmVuY2UgdG8gdGhlIE1hdHRlciBXb3JsZCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIENvbnN0cmFpbnQgYmVsb25ncy5cclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIEEgQ29uc3RyYWludCBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICovXHJcbnZhciBQb2ludGVyQ29uc3RyYWludCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBQb2ludGVyQ29uc3RyYWludCAoc2NlbmUsIHdvcmxkLCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHsgb3B0aW9ucyA9IHt9OyB9XHJcblxyXG4gICAgICAgIC8vICBEZWZhdWx0c1xyXG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcclxuICAgICAgICAgICAgbGFiZWw6ICdQb2ludGVyIENvbnN0cmFpbnQnLFxyXG4gICAgICAgICAgICBwb2ludEE6IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICBwb2ludEI6IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICBsZW5ndGg6IDAuMDEsXHJcbiAgICAgICAgICAgIHN0aWZmbmVzczogMC4xLFxyXG4gICAgICAgICAgICBhbmd1bGFyU3RpZmZuZXNzOiAxLFxyXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAweDAwMDEsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiAweEZGRkZGRkZGLFxyXG4gICAgICAgICAgICAgICAgZ3JvdXA6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0byB3aGljaCB0aGlzIFBvaW50ZXIgQ29uc3RyYWludCBiZWxvbmdzLlxyXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgU2NlbmUgYXMgdGhlIE1hdHRlciBXb3JsZCBpbnN0YW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgTWF0dGVyIFdvcmxkIGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgQ29uc3RyYWludCBiZWxvbmdzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBvaW50ZXJDb25zdHJhaW50I3dvcmxkXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndvcmxkID0gd29ybGQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBDYW1lcmEgdGhlIFBvaW50ZXIgd2FzIGludGVyYWN0aW5nIHdpdGggd2hlbiB0aGUgaW5wdXRcclxuICAgICAgICAgKiBkb3duIGV2ZW50IHdhcyBwcm9jZXNzZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjY2FtZXJhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FtZXJhID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIElucHV0IFBvaW50ZXIgdGhhdCBhY3RpdmF0ZWQgdGhpcyBDb25zdHJhaW50LlxyXG4gICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBgb25Eb3duYCBoYW5kbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBvaW50ZXJDb25zdHJhaW50I3BvaW50ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9pbnRlciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoaXMgQ29uc3RyYWludCBhY3RpdmUgb3Igbm90P1xyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEFuIGFjdGl2ZSBjb25zdHJhaW50IHdpbGwgYmUgcHJvY2Vzc2VkIGVhY2ggdXBkYXRlLiBBbiBpbmFjdGl2ZSBvbmUgd2lsbCBiZSBza2lwcGVkLlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIHRvZ2dsZSBhIFBvaW50ZXIgQ29uc3RyYWludCBvbiBhbmQgb2ZmLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBvaW50ZXJDb25zdHJhaW50I2FjdGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbnRlcm5hbCB0cmFuc2Zvcm1lZCBwb3NpdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCNwb3NpdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYm9keSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkcmFnZ2VkLCBpZiBhbnkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjYm9keVxyXG4gICAgICAgICAqIEB0eXBlIHs/TWF0dGVySlMuQm9keVR5cGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwYXJ0IG9mIHRoZSBib2R5IHRoYXQgd2FzIGNsaWNrZWQgb24gdG8gc3RhcnQgdGhlIGRyYWcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjcGFydFxyXG4gICAgICAgICAqIEB0eXBlIHs/TWF0dGVySlMuQm9keVR5cGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFydCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYXRpdmUgTWF0dGVyIENvbnN0cmFpbnQgdGhhdCBpcyB1c2VkIHRvIGF0dGFjaCB0byBib2RpZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjY29uc3RyYWludFxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5Db25zdHJhaW50VHlwZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBDb25zdHJhaW50LmNyZWF0ZShNZXJnZShvcHRpb25zLCBkZWZhdWx0cykpO1xyXG5cclxuICAgICAgICB0aGlzLndvcmxkLm9uKEV2ZW50cy5CRUZPUkVfVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHNjZW5lLnN5cy5pbnB1dC5vbihJbnB1dEV2ZW50cy5QT0lOVEVSX0RPV04sIHRoaXMub25Eb3duLCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuaW5wdXQub24oSW5wdXRFdmVudHMuUE9JTlRFUl9VUCwgdGhpcy5vblVwLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIFBvaW50ZXIgaGFzIGJlZW4gcHJlc3NlZCBkb3duIG9udG8gdGhlIFNjZW5lLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGlzIENvbnN0cmFpbnQgZG9lc24ndCBoYXZlIGFuIGFjdGl2ZSBQb2ludGVyIHRoZW4gYSBoaXQgdGVzdCBpcyBzZXQgdG9cclxuICAgICAqIHJ1biBhZ2FpbnN0IGFsbCBhY3RpdmUgYm9kaWVzIGluIHRoZSB3b3JsZCBkdXJpbmcgdGhlIF9uZXh0XyBjYWxsIHRvIGB1cGRhdGVgLlxyXG4gICAgICogSWYgYSBib2R5IGlzIGZvdW5kLCBpdCBpcyBib3VuZCB0byB0aGlzIGNvbnN0cmFpbnQgYW5kIHRoZSBkcmFnIGJlZ2lucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCNvbkRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgUG9pbnRlciB0aGF0IHdhcyBwcmVzc2VkLlxyXG4gICAgICovXHJcbiAgICBvbkRvd246IGZ1bmN0aW9uIChwb2ludGVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wb2ludGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb2ludGVyID0gcG9pbnRlcjtcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmEgPSBwb2ludGVyLmNhbWVyYTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBQb2ludGVyIGhhcyBiZWVuIHJlbGVhc2VkIGZyb20gdGhlIFNjZW5lLiBJZiBpdCB3YXMgdGhlIG9uZSB0aGlzIGNvbnN0cmFpbnQgd2FzIHVzaW5nLCBpdCdzIGNsZWFyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjb25VcFxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLklucHV0LlBvaW50ZXJ9IHBvaW50ZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgUG9pbnRlciB0aGF0IHdhcyBwcmVzc2VkLlxyXG4gICAgICovXHJcbiAgICBvblVwOiBmdW5jdGlvbiAocG9pbnRlcilcclxuICAgIHtcclxuICAgICAgICBpZiAocG9pbnRlciA9PT0gdGhpcy5wb2ludGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wb2ludGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgYWxsIGFjdGl2ZSBib2RpZXMgaW4gdGhlIGN1cnJlbnQgTWF0dGVyIFdvcmxkIHRvIHNlZSBpZiBhbnkgb2YgdGhlbVxyXG4gICAgICogYXJlIGhpdCBieSB0aGUgUG9pbnRlci4gVGhlIF9maXJzdCBvbmVfIGZvdW5kIHRvIGhpdCBpcyBzZXQgYXMgdGhlIGFjdGl2ZSBjb250cmFpbnRcclxuICAgICAqIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnQjZ2V0Qm9keVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjRFJBR19TVEFSVFxyXG4gICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYSBib2R5IHdhcyBmb3VuZCBhbmQgc2V0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm9keTogZnVuY3Rpb24gKHBvaW50ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zaXRpb247XHJcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuY2FtZXJhLmdldFdvcmxkUG9pbnQocG9pbnRlci54LCBwb2ludGVyLnksIHBvcyk7XHJcblxyXG4gICAgICAgIHZhciBib2RpZXMgPSBDb21wb3NpdGUuYWxsQm9kaWVzKHRoaXMud29ybGQubG9jYWxXb3JsZCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWJvZHkuaWdub3JlUG9pbnRlciAmJlxyXG4gICAgICAgICAgICAgICAgQm91bmRzLmNvbnRhaW5zKGJvZHkuYm91bmRzLCBwb3MpICYmXHJcbiAgICAgICAgICAgICAgICBEZXRlY3Rvci5jYW5Db2xsaWRlKGJvZHkuY29sbGlzaW9uRmlsdGVyLCBjb25zdHJhaW50LmNvbGxpc2lvbkZpbHRlcikpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpdFRlc3RCb2R5KGJvZHksIHBvcykpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JsZC5lbWl0KEV2ZW50cy5EUkFHX1NUQVJULCBib2R5LCB0aGlzLnBhcnQsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYW5zIHRoZSBjdXJyZW50IGJvZHkgdG8gZGV0ZXJtaW5lIGlmIGEgcGFydCBvZiBpdCB3YXMgY2xpY2tlZCBvbi5cclxuICAgICAqIElmIGEgcGFydCBpcyBmb3VuZCB0aGUgYm9keSBpcyBzZXQgYXMgdGhlIGBjb25zdHJhaW50LmJvZHlCYCBwcm9wZXJ0eSxcclxuICAgICAqIGFzIHdlbGwgYXMgdGhlIGBib2R5YCBwcm9wZXJ0eSBvZiB0aGlzIGNsYXNzLiBUaGUgcGFydCBpcyBhbHNvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCNoaXRUZXN0Qm9keVxyXG4gICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQm9keVR5cGV9IGJvZHkgLSBUaGUgTWF0dGVyIEJvZHkgdG8gY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IHBvc2l0aW9uIC0gQSB0cmFuc2xhdGVkIGhpdCB0ZXN0IHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBhIHBhcnQgb2YgdGhlIGJvZHkgd2FzIGhpdCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhpdFRlc3RCb2R5OiBmdW5jdGlvbiAoYm9keSwgcG9zaXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XHJcbiAgICAgICAgdmFyIHBhcnRzTGVuZ3RoID0gYm9keS5wYXJ0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciBzdGFydCA9IChwYXJ0c0xlbmd0aCA+IDEpID8gMSA6IDA7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IHBhcnRzTGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoVmVydGljZXMuY29udGFpbnMocGFydC52ZXJ0aWNlcywgcG9zaXRpb24pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LnBvaW50QSA9IHBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgY29uc3RyYWludC5wb2ludEIgPSB7IHg6IHBvc2l0aW9uLnggLSBib2R5LnBvc2l0aW9uLngsIHk6IHBvc2l0aW9uLnkgLSBib2R5LnBvc2l0aW9uLnkgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50LmJvZHlCID0gYm9keTtcclxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQuYW5nbGVCID0gYm9keS5hbmdsZTtcclxuXHJcbiAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoYm9keSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFydCA9IHBhcnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgdXBkYXRlIGhhbmRsZXIuIENhbGxlZCBpbiB0aGUgTWF0dGVyIEJFRk9SRV9VUERBVEUgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCN1cGRhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzI0RSQUdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBvaW50ZXIgPSB0aGlzLnBvaW50ZXI7XHJcbiAgICAgICAgdmFyIGJvZHkgPSB0aGlzLmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUgfHwgIXBvaW50ZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoYm9keSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wRHJhZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXBvaW50ZXIuaXNEb3duICYmIGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BEcmFnKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHBvaW50ZXIuaXNEb3duKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFib2R5ICYmICF0aGlzLmdldEJvZHkocG9pbnRlcikpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYm9keSA9IHRoaXMuYm9keTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICB2YXIgY29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludDtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLmNhbWVyYS5nZXRXb3JsZFBvaW50KHBvaW50ZXIueCwgcG9pbnRlci55LCBwb3MpO1xyXG4gICBcclxuICAgICAgICAgICAgLy8gIERyYWcgdXBkYXRlXHJcbiAgICAgICAgICAgIGNvbnN0cmFpbnQucG9pbnRBLnggPSBwb3MueDtcclxuICAgICAgICAgICAgY29uc3RyYWludC5wb2ludEEueSA9IHBvcy55O1xyXG5cclxuICAgICAgICAgICAgU2xlZXBpbmcuc2V0KGJvZHksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMud29ybGQuZW1pdChFdmVudHMuRFJBRywgYm9keSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIHRoZSBQb2ludGVyIENvbnN0cmFpbnQgZnJvbSBkcmFnZ2luZyB0aGUgYm9keSBhbnkgZnVydGhlci5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBpZiB0aGUgUG9pbnRlciBpcyByZWxlYXNlZCB3aGlsZSBhY3RpdmVseVxyXG4gICAgICogZHJhZ2dpbmcgYSBib2R5LiBPciwgeW91IGNhbiBjYWxsIGl0IG1hbnVhbGx5IHRvIHJlbGVhc2UgYSBib2R5IGZyb20gYVxyXG4gICAgICogY29uc3RyYWludCB3aXRob3V0IGhhdmluZyB0byBmaXJzdCByZWxlYXNlIHRoZSBwb2ludGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlBvaW50ZXJDb25zdHJhaW50I3N0b3BEcmFnXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNEUkFHX0VORFxyXG4gICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICovXHJcbiAgICBzdG9wRHJhZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgYm9keSA9IHRoaXMuYm9keTtcclxuICAgICAgICB2YXIgY29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludDtcclxuXHJcbiAgICAgICAgY29uc3RyYWludC5ib2R5QiA9IG51bGw7XHJcbiAgICAgICAgY29uc3RyYWludC5wb2ludEIgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLnBvaW50ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wYXJ0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmVtaXQoRXZlbnRzLkRSQUdfRU5ELCBib2R5LCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBQb2ludGVyIENvbnN0cmFpbnQgaW5zdGFuY2UgYW5kIGFsbCBvZiBpdHMgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLndvcmxkLnJlbW92ZUNvbnN0cmFpbnQodGhpcy5jb25zdHJhaW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludGVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wYXJ0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy53b3JsZC5vZmYoRXZlbnRzLkJFRk9SRV9VUERBVEUsIHRoaXMudXBkYXRlKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuaW5wdXQub2ZmKElucHV0RXZlbnRzLlBPSU5URVJfRE9XTiwgdGhpcy5vbkRvd24sIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmlucHV0Lm9mZihJbnB1dEV2ZW50cy5QT0lOVEVSX1VQLCB0aGlzLm9uVXAsIHRoaXMpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50ZXJDb25zdHJhaW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb2RpZXMgPSByZXF1aXJlKCcuL2xpYi9mYWN0b3J5L0JvZGllcycpO1xyXG52YXIgQm9keSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi9saWIvY29yZS9Db21tb24nKTtcclxudmFyIENvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vbGliL2JvZHkvQ29tcG9zaXRlJyk7XHJcbnZhciBFbmdpbmUgPSByZXF1aXJlKCcuL2xpYi9jb3JlL0VuZ2luZScpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBNYXR0ZXJCb2R5ID0gcmVxdWlyZSgnLi9saWIvYm9keS9Cb2R5Jyk7XHJcbnZhciBNYXR0ZXJFdmVudHMgPSByZXF1aXJlKCcuL2xpYi9jb3JlL0V2ZW50cycpO1xyXG52YXIgTWF0dGVyVGlsZUJvZHkgPSByZXF1aXJlKCcuL01hdHRlclRpbGVCb2R5Jyk7XHJcbnZhciBNYXR0ZXJXb3JsZCA9IHJlcXVpcmUoJy4vbGliL2JvZHkvV29ybGQnKTtcclxudmFyIFZlY3RvciA9IHJlcXVpcmUoJy4vbGliL2dlb21ldHJ5L1ZlY3RvcicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIE1hdHRlciBXb3JsZCBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgb25lIHNpbmdsZSBpbnN0YW5jZSBvZiBhIE1hdHRlciBQaHlzaWNzIFdvcmxkIGZvciBQaGFzZXIuXHJcbiAqIFxyXG4gKiBBY2Nlc3MgdGhpcyB2aWEgYHRoaXMubWF0dGVyLndvcmxkYCBmcm9tIHdpdGhpbiBhIFNjZW5lLlxyXG4gKiBcclxuICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgTWF0dGVyIEpTIFdvcmxkIENvbXBvc2l0ZSBhbG9uZyB3aXRoIHRoZSBNYXR0ZXIgSlMgRW5naW5lIGR1cmluZyBpbnN0YW50aWF0aW9uLiBJdCBhbHNvXHJcbiAqIGhhbmRsZXMgZGVsdGEgdGltaW5nLCBib3VuZHMsIGJvZHkgYW5kIGNvbnN0cmFpbnQgY3JlYXRpb24gYW5kIGRlYnVnIGRyYXdpbmcuXHJcbiAqIFxyXG4gKiBJZiB5b3Ugd2lzaCB0byBhY2Nlc3MgdGhlIE1hdHRlciBKUyBXb3JsZCBvYmplY3QgZGlyZWN0bHksIHNlZSB0aGUgYGxvY2FsV29ybGRgIHByb3BlcnR5LlxyXG4gKiBJZiB5b3Ugd2lzaCB0byBhY2Nlc3MgdGhlIE1hdHRlciBFbmdpbmUgZGlyZWN0bHksIHNlZSB0aGUgYGVuZ2luZWAgcHJvcGVydHkuXHJcbiAqIFxyXG4gKiBUaGlzIGNsYXNzIGlzIGFuIEV2ZW50IEVtaXR0ZXIgYW5kIHdpbGwgcHJveHkgX2FsbF8gTWF0dGVyIEpTIGV2ZW50cywgYXMgdGhleSBhcmUgcmVjZWl2ZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBXb3JsZFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGJlbG9uZ3MuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlcldvcmxkQ29uZmlnfSBjb25maWcgLSBUaGUgTWF0dGVyIFdvcmxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxudmFyIFdvcmxkID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBXb3JsZCAoc2NlbmUsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFNjZW5lIHRvIHdoaWNoIHRoaXMgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGJlbG9uZ3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIE1hdHRlckpTIEVuZ2luZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNlbmdpbmVcclxuICAgICAgICAgKiBAdHlwZSB7TWF0dGVySlMuRW5naW5lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW5naW5lID0gRW5naW5lLmNyZWF0ZShjb25maWcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGBXb3JsZGAgY29tcG9zaXRlIG9iamVjdCB0aGF0IHdpbGwgY29udGFpbiBhbGwgc2ltdWxhdGVkIGJvZGllcyBhbmQgY29uc3RyYWludHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjbG9jYWxXb3JsZFxyXG4gICAgICAgICAqIEB0eXBlIHtNYXR0ZXJKUy5Xb3JsZH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQgPSB0aGlzLmVuZ2luZS53b3JsZDtcclxuXHJcbiAgICAgICAgdmFyIGdyYXZpdHkgPSBHZXRWYWx1ZShjb25maWcsICdncmF2aXR5JywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChncmF2aXR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRHcmF2aXR5KGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnNjYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZ3Jhdml0eSA9PT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEdyYXZpdHkoMCwgMCwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgNCB3YWxsIGJvZGllcyB0aGF0IGJvdW5kIHRoZSBwaHlzaWNzIHdvcmxkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3dhbGxzXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndhbGxzID0geyBsZWZ0OiBudWxsLCByaWdodDogbnVsbCwgdG9wOiBudWxsLCBib3R0b206IG51bGwgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBmbGFnIHRoYXQgdG9nZ2xlcyBpZiB0aGUgd29ybGQgaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZW5hYmxlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBHZXRWYWx1ZShjb25maWcsICdlbmFibGVkJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb3JyZWN0aW9uIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgdGltZSBjb3JyZWN0aW9uIGZhY3RvciB0byBhcHBseSB0byB0aGUgdXBkYXRlLlxyXG4gICAgICAgICAqIFRoaXMgY2FuIGhlbHAgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHNpbXVsYXRpb24gaW4gY2FzZXMgd2hlcmUgZGVsdGEgaXMgY2hhbmdpbmcgYmV0d2VlbiB1cGRhdGVzLlxyXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiBjb3JyZWN0aW9uIGlzIGRlZmluZWQgYXMgZGVsdGEgLyBsYXN0RGVsdGEsIGkuZS4gdGhlIHBlcmNlbnRhZ2UgY2hhbmdlIG9mIGRlbHRhIG92ZXIgdGhlIGxhc3Qgc3RlcC5cclxuICAgICAgICAgKiBUaGVyZWZvcmUgdGhlIHZhbHVlIGlzIGFsd2F5cyAxIChubyBjb3JyZWN0aW9uKSB3aGVuIGRlbHRhIGlzIGNvbnN0YW50IChvciB3aGVuIG5vIGNvcnJlY3Rpb24gaXMgZGVzaXJlZCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxyXG4gICAgICAgICAqIFNlZSB0aGUgcGFwZXIgb24gVGltZSBDb3JyZWN0ZWQgVmVybGV0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI2NvcnJlY3Rpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvcnJlY3Rpb24gPSBHZXRWYWx1ZShjb25maWcsICdjb3JyZWN0aW9uJywgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGNvcmUgZ2FtZSBsb29wIHN0ZXBzLCB3aGljaCBpcyBib3VuZCB0byB0aGVcclxuICAgICAgICAgKiBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBmcmVxdWVuY3kgdW5sZXNzIG90aGVyd2lzZSBtb2RpZmllZC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHR3byB2YWx1ZXM6IGB0aW1lYCBhbmQgYGRlbHRhYCwgYm90aCBvZiB3aGljaCBjb21lIGZyb20gdGhlIGdhbWUgc3RlcCB2YWx1ZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSXQgbXVzdCByZXR1cm4gYSBudW1iZXIuIFRoaXMgbnVtYmVyIGlzIHVzZWQgYXMgdGhlIGRlbHRhIHZhbHVlIHBhc3NlZCB0byBNYXR0ZXIuRW5naW5lLnVwZGF0ZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gd2l0aCB5b3VyIG93biB0byBkZWZpbmUgeW91ciBvd24gdGltZXN0ZXAuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSBFbmdpbmUgbXVsdGlwbGUgdGltZXMgaW4gYSBzaW5nbGUgZ2FtZSBzdGVwIHRoZW4gY2FsbFxyXG4gICAgICAgICAqIGBXb3JsZC51cGRhdGVgIGFzIG1hbnkgdGltZXMgYXMgcmVxdWlyZWQuIEVhY2ggY2FsbCB3aWxsIHRyaWdnZXIgdGhlIGBnZXREZWx0YWAgZnVuY3Rpb24uXHJcbiAgICAgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciB3aGVuIHRoZSBFbmdpbmUgdXBkYXRlcyB0aGVuIHNlZSB0aGUgcHJvcGVydHkgYGF1dG9VcGRhdGVgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogWW91IGNhbiBhbHNvIGFkanVzdCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCBFbmdpbmUudXBkYXRlIHBlcmZvcm1zLlxyXG4gICAgICAgICAqIFVzZSB0aGUgU2NlbmUgTWF0dGVyIFBoeXNpY3MgY29uZmlnIG9iamVjdCB0byBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogcG9zaXRpb25JdGVyYXRpb25zIChkZWZhdWx0cyB0byA2KVxyXG4gICAgICAgICAqIHZlbG9jaXR5SXRlcmF0aW9ucyAoZGVmYXVsdHMgdG8gNClcclxuICAgICAgICAgKiBjb25zdHJhaW50SXRlcmF0aW9ucyAoZGVmYXVsdHMgdG8gMilcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEFkanVzdGluZyB0aGVzZSB2YWx1ZXMgY2FuIGhlbHAgcGVyZm9ybWFuY2UgaW4gY2VydGFpbiBzaXR1YXRpb25zLCBkZXBlbmRpbmcgb24gdGhlIHBoeXNpY3MgcmVxdWlyZW1lbnRzXHJcbiAgICAgICAgICogb2YgeW91ciBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI2dldERlbHRhXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2V0RGVsdGEgPSBHZXRWYWx1ZShjb25maWcsICdnZXREZWx0YScsIHRoaXMudXBkYXRlNjBIeik7XHJcblxyXG4gICAgICAgIHZhciBydW5uZXJDb25maWcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAncnVubmVyJywge30pO1xyXG5cclxuICAgICAgICB2YXIgaGFzRlBTID0gR2V0RmFzdFZhbHVlKHJ1bm5lckNvbmZpZywgJ2ZwcycsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdmFyIGZwcyA9IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdmcHMnLCA2MCk7XHJcblxyXG4gICAgICAgIHZhciBkZWx0YSA9IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdkZWx0YScsIDEwMDAgLyBmcHMpO1xyXG4gICAgICAgIHZhciBkZWx0YU1pbiA9IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdkZWx0YU1pbicsIDEwMDAgLyBmcHMpO1xyXG4gICAgICAgIHZhciBkZWx0YU1heCA9IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdkZWx0YU1heCcsIDEwMDAgLyAoZnBzICogMC41KSk7XHJcblxyXG4gICAgICAgIGlmICghaGFzRlBTKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnBzID0gMTAwMCAvIGRlbHRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIE1hdHRlciBKUyBSdW5uZXIgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBvYmplY3QgaXMgcG9wdWxhdGVkIHZpYSB0aGUgTWF0dGVyIENvbmZpZ3VyYXRpb24gb2JqZWN0J3MgYHJ1bm5lcmAgcHJvcGVydHkgYW5kIGlzXHJcbiAgICAgICAgICogdXBkYXRlZCBjb25zdGFudGx5IGR1cmluZyB0aGUgZ2FtZSBzdGVwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3J1bm5lclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyUnVubmVyQ29uZmlnfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJ1bm5lciA9IHtcclxuICAgICAgICAgICAgZnBzOiBmcHMsXHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdjb3JyZWN0aW9uJywgMSksXHJcbiAgICAgICAgICAgIGRlbHRhU2FtcGxlU2l6ZTogR2V0RmFzdFZhbHVlKHJ1bm5lckNvbmZpZywgJ2RlbHRhU2FtcGxlU2l6ZScsIDYwKSxcclxuICAgICAgICAgICAgY291bnRlclRpbWVzdGFtcDogMCxcclxuICAgICAgICAgICAgZnJhbWVDb3VudGVyOiAwLFxyXG4gICAgICAgICAgICBkZWx0YUhpc3Rvcnk6IFtdLFxyXG4gICAgICAgICAgICB0aW1lUHJldjogbnVsbCxcclxuICAgICAgICAgICAgdGltZVNjYWxlUHJldjogMSxcclxuICAgICAgICAgICAgZnJhbWVSZXF1ZXN0SWQ6IG51bGwsXHJcbiAgICAgICAgICAgIGlzRml4ZWQ6IEdldEZhc3RWYWx1ZShydW5uZXJDb25maWcsICdpc0ZpeGVkJywgZmFsc2UpLFxyXG4gICAgICAgICAgICBkZWx0YTogZGVsdGEsXHJcbiAgICAgICAgICAgIGRlbHRhTWluOiBkZWx0YU1pbixcclxuICAgICAgICAgICAgZGVsdGFNYXg6IGRlbHRhTWF4XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXV0b21hdGljYWxseSBjYWxsIEVuZ2luZS51cGRhdGUgZXZlcnkgdGltZSB0aGUgZ2FtZSBzdGVwcy5cclxuICAgICAgICAgKiBJZiB5b3UgZGlzYWJsZSB0aGlzIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBgV29ybGQuc3RlcGAgZGlyZWN0bHkgZnJvbSB5b3VyIGdhbWUuXHJcbiAgICAgICAgICogSWYgeW91IGNhbGwgYHNldDYwSHpgIG9yIGBzZXQzMEh6YCB0aGVuIGBhdXRvVXBkYXRlYCBpcyByZXNldCB0byBgdHJ1ZWAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjYXV0b1VwZGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1dG9VcGRhdGUgPSBHZXRWYWx1ZShjb25maWcsICdhdXRvVXBkYXRlJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHZhciBkZWJ1Z0NvbmZpZyA9IEdldFZhbHVlKGNvbmZpZywgJ2RlYnVnJywgZmFsc2UpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGZsYWcgdGhhdCBjb250cm9scyBpZiB0aGUgZGVidWcgZ3JhcGhpY3Mgd2lsbCBiZSBkcmF3biB0byBvciBub3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZHJhd0RlYnVnXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRyYXdEZWJ1ZyA9ICh0eXBlb2YoZGVidWdDb25maWcpID09PSAnb2JqZWN0JykgPyB0cnVlIDogZGVidWdDb25maWc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBHcmFwaGljcyBvYmplY3QgdGhlIGRlYnVnIGJvZGllcyBhcmUgZHJhd24gdG8sIGlmIGVuYWJsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZGVidWdHcmFwaGljXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRlYnVnR3JhcGhpYztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlYnVnIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgb2JqZWN0IGFyZSByZWFkIGZyb20gdGhlIE1hdHRlciBXb3JsZCBDb25maWcgYGRlYnVnYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBXaGVuIGEgbmV3IEJvZHkgb3IgQ29uc3RyYWludCBpcyBfYWRkZWQgdG8gdGhlIFdvcmxkXywgdGhleSBhcmUgZ2l2ZW4gdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhpcyBvYmplY3QsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZXkgaGF2ZSB0aGVpciBvd24gYHJlbmRlcmAgb2JqZWN0IHNldCB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlbS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBOb3RlIHRoYXQgd2hpbGUgeW91IGNhbiBtb2RpZnkgdGhlIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGluIHRoaXMgb2JqZWN0IGF0IHJ1bi10aW1lLCBpdCB3aWxsIG5vdCBjaGFuZ2VcclxuICAgICAgICAgKiBhbnkgb2YgdGhlIE1hdHRlciBvYmplY3RzIF9hbHJlYWR5IGFkZGVkXy4gSXQgd2lsbCBvbmx5IGltcGFjdCBvYmplY3RzIG5ld2x5IGFkZGVkIHRvIHRoZSB3b3JsZCwgb3Igb25lXHJcbiAgICAgICAgICogdGhhdCBpcyByZW1vdmVkIGFuZCB0aGVuIHJlLWFkZGVkIGF0IGEgbGF0ZXIgdGltZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNkZWJ1Z0NvbmZpZ1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyRGVidWdDb25maWd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVidWdDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHNob3dBeGVzOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzaG93QXhlcycsIGZhbHNlKSxcclxuICAgICAgICAgICAgc2hvd0FuZ2xlSW5kaWNhdG9yOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzaG93QW5nbGVJbmRpY2F0b3InLCBmYWxzZSksXHJcbiAgICAgICAgICAgIGFuZ2xlQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2FuZ2xlQ29sb3InLCAweGU4MTE1MyksXHJcblxyXG4gICAgICAgICAgICBzaG93QnJvYWRwaGFzZTogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd0Jyb2FkcGhhc2UnLCBmYWxzZSksXHJcbiAgICAgICAgICAgIGJyb2FkcGhhc2VDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnYnJvYWRwaGFzZUNvbG9yJywgMHhmZmI0MDApLFxyXG5cclxuICAgICAgICAgICAgc2hvd0JvdW5kczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd0JvdW5kcycsIGZhbHNlKSxcclxuICAgICAgICAgICAgYm91bmRzQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2JvdW5kc0NvbG9yJywgMHhmZmZmZmYpLFxyXG5cclxuICAgICAgICAgICAgc2hvd1ZlbG9jaXR5OiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzaG93VmVsb2NpdHknLCBmYWxzZSksXHJcbiAgICAgICAgICAgIHZlbG9jaXR5Q29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3ZlbG9jaXR5Q29sb3InLCAweDAwYWVlZiksXHJcblxyXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd0NvbGxpc2lvbnMnLCBmYWxzZSksXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbkNvbG9yOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdjb2xsaXNpb25Db2xvcicsIDB4ZjU5NTBjKSxcclxuXHJcbiAgICAgICAgICAgIHNob3dTZXBhcmF0aW9uczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd1NlcGFyYXRpb25zJywgZmFsc2UpLFxyXG4gICAgICAgICAgICBzZXBhcmF0aW9uQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3NlcGFyYXRpb25Db2xvcicsIDB4ZmZhNTAwKSxcclxuXHJcbiAgICAgICAgICAgIHNob3dCb2R5OiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzaG93Qm9keScsIHRydWUpLFxyXG4gICAgICAgICAgICBzaG93U3RhdGljQm9keTogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd1N0YXRpY0JvZHknLCB0cnVlKSxcclxuICAgICAgICAgICAgc2hvd0ludGVybmFsRWRnZXM6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3Nob3dJbnRlcm5hbEVkZ2VzJywgZmFsc2UpLFxyXG5cclxuICAgICAgICAgICAgcmVuZGVyRmlsbDogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAncmVuZGVyRmlsbCcsIGZhbHNlKSxcclxuICAgICAgICAgICAgcmVuZGVyTGluZTogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAncmVuZGVyTGluZScsIHRydWUpLFxyXG5cclxuICAgICAgICAgICAgZmlsbENvbG9yOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdmaWxsQ29sb3InLCAweDEwNjkwOSksXHJcbiAgICAgICAgICAgIGZpbGxPcGFjaXR5OiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdmaWxsT3BhY2l0eScsIDEpLFxyXG4gICAgICAgICAgICBsaW5lQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2xpbmVDb2xvcicsIDB4MjhkZTE5KSxcclxuICAgICAgICAgICAgbGluZU9wYWNpdHk6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2xpbmVPcGFjaXR5JywgMSksXHJcbiAgICAgICAgICAgIGxpbmVUaGlja25lc3M6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2xpbmVUaGlja25lc3MnLCAxKSxcclxuXHJcbiAgICAgICAgICAgIHN0YXRpY0ZpbGxDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc3RhdGljRmlsbENvbG9yJywgMHgwZDE3N2IpLFxyXG4gICAgICAgICAgICBzdGF0aWNMaW5lQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3N0YXRpY0xpbmVDb2xvcicsIDB4MTMyN2U0KSxcclxuXHJcbiAgICAgICAgICAgIHNob3dTbGVlcGluZzogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd1NsZWVwaW5nJywgZmFsc2UpLFxyXG4gICAgICAgICAgICBzdGF0aWNCb2R5U2xlZXBPcGFjaXR5OiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzdGF0aWNCb2R5U2xlZXBPcGFjaXR5JywgMC43KSxcclxuICAgICAgICAgICAgc2xlZXBGaWxsQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3NsZWVwRmlsbENvbG9yJywgMHg0NjQ2NDYpLFxyXG4gICAgICAgICAgICBzbGVlcExpbmVDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2xlZXBMaW5lQ29sb3InLCAweDk5OWE5OSksXHJcblxyXG4gICAgICAgICAgICBzaG93U2Vuc29yczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd1NlbnNvcnMnLCB0cnVlKSxcclxuICAgICAgICAgICAgc2Vuc29yRmlsbENvbG9yOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzZW5zb3JGaWxsQ29sb3InLCAweDBkMTc3YiksXHJcbiAgICAgICAgICAgIHNlbnNvckxpbmVDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2Vuc29yTGluZUNvbG9yJywgMHgxMzI3ZTQpLFxyXG5cclxuICAgICAgICAgICAgc2hvd1Bvc2l0aW9uczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd1Bvc2l0aW9ucycsIHRydWUpLFxyXG4gICAgICAgICAgICBwb3NpdGlvblNpemU6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ3Bvc2l0aW9uU2l6ZScsIDQpLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkNvbG9yOiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdwb3NpdGlvbkNvbG9yJywgMHhlMDQyZGEpLFxyXG5cclxuICAgICAgICAgICAgc2hvd0pvaW50OiBHZXRGYXN0VmFsdWUoZGVidWdDb25maWcsICdzaG93Sm9pbnQnLCB0cnVlKSxcclxuICAgICAgICAgICAgam9pbnRDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnam9pbnRDb2xvcicsIDB4ZTBlMDQyKSxcclxuICAgICAgICAgICAgam9pbnRMaW5lT3BhY2l0eTogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnam9pbnRMaW5lT3BhY2l0eScsIDEpLFxyXG4gICAgICAgICAgICBqb2ludExpbmVUaGlja25lc3M6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2pvaW50TGluZVRoaWNrbmVzcycsIDIpLFxyXG5cclxuICAgICAgICAgICAgcGluU2l6ZTogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAncGluU2l6ZScsIDQpLFxyXG4gICAgICAgICAgICBwaW5Db2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAncGluQ29sb3InLCAweDQyZTBlMCksXHJcblxyXG4gICAgICAgICAgICBzcHJpbmdDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc3ByaW5nQ29sb3InLCAweGUwNDJlMCksXHJcblxyXG4gICAgICAgICAgICBhbmNob3JDb2xvcjogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnYW5jaG9yQ29sb3InLCAweGVmZWZlZiksXHJcbiAgICAgICAgICAgIGFuY2hvclNpemU6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2FuY2hvclNpemUnLCA0KSxcclxuXHJcbiAgICAgICAgICAgIHNob3dDb252ZXhIdWxsczogR2V0RmFzdFZhbHVlKGRlYnVnQ29uZmlnLCAnc2hvd0NvbnZleEh1bGxzJywgZmFsc2UpLFxyXG4gICAgICAgICAgICBodWxsQ29sb3I6IEdldEZhc3RWYWx1ZShkZWJ1Z0NvbmZpZywgJ2h1bGxDb2xvcicsIDB4ZDcwM2QwKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyYXdEZWJ1ZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVidWdHcmFwaGljKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEV2ZW50c1Byb3h5KCk7XHJcblxyXG4gICAgICAgIC8vICBDcmVhdGUgdGhlIHdhbGxzXHJcblxyXG4gICAgICAgIGlmIChHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2V0Qm91bmRzJywgZmFsc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJvdW5kc0NvbmZpZyA9IGNvbmZpZ1snc2V0Qm91bmRzJ107XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJvdW5kc0NvbmZpZyA9PT0gJ2Jvb2xlYW4nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJvdW5kcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHggPSBHZXRGYXN0VmFsdWUoYm91bmRzQ29uZmlnLCAneCcsIDApO1xyXG4gICAgICAgICAgICAgICAgdmFyIHkgPSBHZXRGYXN0VmFsdWUoYm91bmRzQ29uZmlnLCAneScsIDApO1xyXG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gR2V0RmFzdFZhbHVlKGJvdW5kc0NvbmZpZywgJ3dpZHRoJywgc2NlbmUuc3lzLnNjYWxlLndpZHRoKTtcclxuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBHZXRGYXN0VmFsdWUoYm91bmRzQ29uZmlnLCAnaGVpZ2h0Jywgc2NlbmUuc3lzLnNjYWxlLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGhpY2tuZXNzID0gR2V0RmFzdFZhbHVlKGJvdW5kc0NvbmZpZywgJ3RoaWNrbmVzcycsIDY0KTtcclxuICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gR2V0RmFzdFZhbHVlKGJvdW5kc0NvbmZpZywgJ2xlZnQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHZhciByaWdodCA9IEdldEZhc3RWYWx1ZShib3VuZHNDb25maWcsICdyaWdodCcsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRvcCA9IEdldEZhc3RWYWx1ZShib3VuZHNDb25maWcsICd0b3AnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHZhciBib3R0b20gPSBHZXRGYXN0VmFsdWUoYm91bmRzQ29uZmlnLCAnYm90dG9tJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCb3VuZHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgdGhpY2tuZXNzLCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRlYnVnIHJlbmRlciBzdHlsZSBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBNYXR0ZXIgQ29tcG9zaXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBDb21wb3NpdGVzIHRoZW1zZWx2ZXMgZG8gbm90IHJlbmRlciwgYnV0IHRoZXkgY2FuIGNvbnRhaW4gYm9kaWVzLCBjb25zdHJhaW50cyBhbmQgb3RoZXIgY29tcG9zaXRlcyB0aGF0IG1heSBkby5cclxuICAgICAqIFNvIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvc2l0ZSBhcmUgcGFzc2VkIHRvIHRoZSBgc2V0Qm9keVJlbmRlclN0eWxlYCwgYHNldENvbXBvc2l0ZVJlbmRlclN0eWxlYCBhbmRcclxuICAgICAqIGBzZXRDb25zdHJhaW50UmVuZGVyU3R5bGVgIG1ldGhvZHMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3NldENvbXBvc2l0ZVJlbmRlclN0eWxlXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5Db21wb3NpdGVUeXBlfSBjb21wb3NpdGUgLSBUaGUgTWF0dGVyIENvbXBvc2l0ZSB0byBzZXQgdGhlIHJlbmRlciBzdHlsZSBvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0Q29tcG9zaXRlUmVuZGVyU3R5bGU6IGZ1bmN0aW9uIChjb21wb3NpdGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvZGllcyA9IGNvbXBvc2l0ZS5ib2RpZXM7XHJcbiAgICAgICAgdmFyIGNvbnN0cmFpbnRzID0gY29tcG9zaXRlLmNvbnN0cmFpbnRzO1xyXG4gICAgICAgIHZhciBjb21wb3NpdGVzID0gY29tcG9zaXRlLmNvbXBvc2l0ZXM7XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBvYmo7XHJcbiAgICAgICAgdmFyIHJlbmRlcjtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9iaiA9IGJvZGllc1tpXTtcclxuICAgICAgICAgICAgcmVuZGVyID0gb2JqLnJlbmRlcjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Qm9keVJlbmRlclN0eWxlKG9iaiwgcmVuZGVyLmxpbmVDb2xvciwgcmVuZGVyLmxpbmVPcGFjaXR5LCByZW5kZXIubGluZVRoaWNrbmVzcywgcmVuZGVyLmZpbGxDb2xvciwgcmVuZGVyLmZpbGxPcGFjaXR5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9iaiA9IGNvbnN0cmFpbnRzW2ldO1xyXG4gICAgICAgICAgICByZW5kZXIgPSBvYmoucmVuZGVyO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRDb25zdHJhaW50UmVuZGVyU3R5bGUob2JqLCByZW5kZXIubGluZUNvbG9yLCByZW5kZXIubGluZU9wYWNpdHksIHJlbmRlci5saW5lVGhpY2tuZXNzLCByZW5kZXIucGluU2l6ZSwgcmVuZGVyLmFuY2hvckNvbG9yLCByZW5kZXIuYW5jaG9yU2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9zaXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9iaiA9IGNvbXBvc2l0ZXNbaV07XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldENvbXBvc2l0ZVJlbmRlclN0eWxlKG9iaik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkZWJ1ZyByZW5kZXIgc3R5bGUgZm9yIHRoZSBnaXZlbiBNYXR0ZXIgQm9keS5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGFyZSB1c2luZyB0aGlzIG9uIGEgUGhhc2VyIEdhbWUgT2JqZWN0LCBzdWNoIGFzIGEgTWF0dGVyIFNwcml0ZSwgdGhlbiBwYXNzIGluIHRoZSBib2R5IHByb3BlcnR5XHJcbiAgICAgKiB0byB0aGlzIG1ldGhvZCwgbm90IHRoZSBHYW1lIE9iamVjdCBpdHNlbGYuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHNraXAgYSBwYXJhbWV0ZXIsIHNvIGl0IHJldGFpbnMgaXRzIGN1cnJlbnQgdmFsdWUsIHBhc3MgYGZhbHNlYCBmb3IgaXQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHJlc2V0IHRoZSBCb2R5IHJlbmRlciBjb2xvcnMgdG8gdGhlIGRlZmF1bHRzIGZvdW5kIGluIHRoZSBXb3JsZCBEZWJ1ZyBDb25maWcsIHRoZW4gY2FsbFxyXG4gICAgICogdGhpcyBtZXRob2Qgd2l0aCBqdXN0IHRoZSBgYm9keWAgcGFyYW1ldGVyIHByb3ZpZGVkIGFuZCBubyBvdGhlcnMuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3NldEJvZHlSZW5kZXJTdHlsZVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQm9keVR5cGV9IGJvZHkgLSBUaGUgTWF0dGVyIEJvZHkgdG8gc2V0IHRoZSByZW5kZXIgc3R5bGUgb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbmVDb2xvcl0gLSBUaGUgbGluZSBjb2xvci4gSWYgYG51bGxgIGl0IHdpbGwgdXNlIHRoZSBXb3JsZCBEZWJ1ZyBDb25maWcgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbmVPcGFjaXR5XSAtIFRoZSBsaW5lIG9wYWNpdHksIGJldHdlZW4gMCBhbmQgMS4gSWYgYG51bGxgIGl0IHdpbGwgdXNlIHRoZSBXb3JsZCBEZWJ1ZyBDb25maWcgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbmVUaGlja25lc3NdIC0gVGhlIGxpbmUgdGhpY2tuZXNzLiBJZiBgbnVsbGAgaXQgd2lsbCB1c2UgdGhlIFdvcmxkIERlYnVnIENvbmZpZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBmaWxsIGNvbG9yLiBJZiBgbnVsbGAgaXQgd2lsbCB1c2UgdGhlIFdvcmxkIERlYnVnIENvbmZpZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbE9wYWNpdHldIC0gVGhlIGZpbGwgb3BhY2l0eSwgYmV0d2VlbiAwIGFuZCAxLiBJZiBgbnVsbGAgaXQgd2lsbCB1c2UgdGhlIFdvcmxkIERlYnVnIENvbmZpZyB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0Qm9keVJlbmRlclN0eWxlOiBmdW5jdGlvbiAoYm9keSwgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSwgbGluZVRoaWNrbmVzcywgZmlsbENvbG9yLCBmaWxsT3BhY2l0eSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyID0gYm9keS5yZW5kZXI7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZGVidWdDb25maWc7XHJcblxyXG4gICAgICAgIGlmICghcmVuZGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGluZUNvbG9yID09PSB1bmRlZmluZWQgfHwgbGluZUNvbG9yID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGluZUNvbG9yID0gKGJvZHkuaXNTdGF0aWMpID8gY29uZmlnLnN0YXRpY0xpbmVDb2xvciA6IGNvbmZpZy5saW5lQ29sb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGluZU9wYWNpdHkgPT09IHVuZGVmaW5lZCB8fCBsaW5lT3BhY2l0eSA9PT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpbmVPcGFjaXR5ID0gY29uZmlnLmxpbmVPcGFjaXR5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVUaGlja25lc3MgPT09IHVuZGVmaW5lZCB8fCBsaW5lVGhpY2tuZXNzID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGluZVRoaWNrbmVzcyA9IGNvbmZpZy5saW5lVGhpY2tuZXNzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkIHx8IGZpbGxDb2xvciA9PT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpbGxDb2xvciA9IChib2R5LmlzU3RhdGljKSA/IGNvbmZpZy5zdGF0aWNGaWxsQ29sb3IgOiBjb25maWcuZmlsbENvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGxPcGFjaXR5ID09PSB1bmRlZmluZWQgfHwgZmlsbE9wYWNpdHkgPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmaWxsT3BhY2l0eSA9IGNvbmZpZy5maWxsT3BhY2l0eTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsaW5lQ29sb3IgIT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyLmxpbmVDb2xvciA9IGxpbmVDb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsaW5lT3BhY2l0eSAhPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZW5kZXIubGluZU9wYWNpdHkgPSBsaW5lT3BhY2l0eTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsaW5lVGhpY2tuZXNzICE9PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlci5saW5lVGhpY2tuZXNzID0gbGluZVRoaWNrbmVzcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmaWxsQ29sb3IgIT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyLmZpbGxDb2xvciA9IGZpbGxDb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmaWxsT3BhY2l0eSAhPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZW5kZXIuZmlsbE9wYWNpdHkgPSBmaWxsT3BhY2l0eTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRlYnVnIHJlbmRlciBzdHlsZSBmb3IgdGhlIGdpdmVuIE1hdHRlciBDb25zdHJhaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgb24gYSBQaGFzZXIgR2FtZSBPYmplY3QsIHRoZW4gcGFzcyBpbiB0aGUgYm9keSBwcm9wZXJ0eVxyXG4gICAgICogdG8gdGhpcyBtZXRob2QsIG5vdCB0aGUgR2FtZSBPYmplY3QgaXRzZWxmLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byBza2lwIGEgcGFyYW1ldGVyLCBzbyBpdCByZXRhaW5zIGl0cyBjdXJyZW50IHZhbHVlLCBwYXNzIGBmYWxzZWAgZm9yIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZXNldCB0aGUgQ29uc3RyYWludCByZW5kZXIgY29sb3JzIHRvIHRoZSBkZWZhdWx0cyBmb3VuZCBpbiB0aGUgV29ybGQgRGVidWcgQ29uZmlnLCB0aGVuIGNhbGxcclxuICAgICAqIHRoaXMgbWV0aG9kIHdpdGgganVzdCB0aGUgYGNvbnN0cmFpbnRgIHBhcmFtZXRlciBwcm92aWRlZCBhbmQgbm8gb3RoZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNzZXRDb25zdHJhaW50UmVuZGVyU3R5bGVcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkNvbnN0cmFpbnRUeXBlfSBjb25zdHJhaW50IC0gVGhlIE1hdHRlciBDb25zdHJhaW50IHRvIHNldCB0aGUgcmVuZGVyIHN0eWxlIG9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lQ29sb3JdIC0gVGhlIGxpbmUgY29sb3IuIElmIGBudWxsYCBpdCB3aWxsIHVzZSB0aGUgV29ybGQgRGVidWcgQ29uZmlnIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lT3BhY2l0eV0gLSBUaGUgbGluZSBvcGFjaXR5LCBiZXR3ZWVuIDAgYW5kIDEuIElmIGBudWxsYCBpdCB3aWxsIHVzZSB0aGUgV29ybGQgRGVidWcgQ29uZmlnIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lVGhpY2tuZXNzXSAtIFRoZSBsaW5lIHRoaWNrbmVzcy4gSWYgYG51bGxgIGl0IHdpbGwgdXNlIHRoZSBXb3JsZCBEZWJ1ZyBDb25maWcgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BpblNpemVdIC0gSWYgdGhpcyBjb25zdHJhaW50IGlzIGEgcGluLCB0aGlzIHNldHMgdGhlIHNpemUgb2YgdGhlIHBpbiBjaXJjbGUuIElmIGBudWxsYCBpdCB3aWxsIHVzZSB0aGUgV29ybGQgRGVidWcgQ29uZmlnIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbmNob3JDb2xvcl0gLSBUaGUgY29sb3IgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGlzIGNvbnN0cmFpbnRzIGFuY2hvcnMuICBJZiBgbnVsbGAgaXQgd2lsbCB1c2UgdGhlIFdvcmxkIERlYnVnIENvbmZpZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYW5jaG9yU2l6ZV0gLSBUaGUgc2l6ZSBvZiB0aGUgYW5jaG9yIGNpcmNsZSwgaWYgdGhpcyBjb25zdHJhaW50IGhhcyBhbmNob3JzLiBJZiBgbnVsbGAgaXQgd2lsbCB1c2UgdGhlIFdvcmxkIERlYnVnIENvbmZpZyB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0Q29uc3RyYWludFJlbmRlclN0eWxlOiBmdW5jdGlvbiAoY29uc3RyYWludCwgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSwgbGluZVRoaWNrbmVzcywgcGluU2l6ZSwgYW5jaG9yQ29sb3IsIGFuY2hvclNpemUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlbmRlciA9IGNvbnN0cmFpbnQucmVuZGVyO1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmRlYnVnQ29uZmlnO1xyXG5cclxuICAgICAgICBpZiAoIXJlbmRlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFJlc2V0IHRoZW1cclxuICAgICAgICBpZiAobGluZUNvbG9yID09PSB1bmRlZmluZWQgfHwgbGluZUNvbG9yID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHR5cGUgPSByZW5kZXIudHlwZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbGluZScpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxpbmVDb2xvciA9IGNvbmZpZy5qb2ludENvbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdwaW4nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lQ29sb3IgPSBjb25maWcucGluQ29sb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3NwcmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxpbmVDb2xvciA9IGNvbmZpZy5zcHJpbmdDb2xvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVPcGFjaXR5ID09PSB1bmRlZmluZWQgfHwgbGluZU9wYWNpdHkgPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaW5lT3BhY2l0eSA9IGNvbmZpZy5qb2ludExpbmVPcGFjaXR5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVUaGlja25lc3MgPT09IHVuZGVmaW5lZCB8fCBsaW5lVGhpY2tuZXNzID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGluZVRoaWNrbmVzcyA9IGNvbmZpZy5qb2ludExpbmVUaGlja25lc3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGluU2l6ZSA9PT0gdW5kZWZpbmVkIHx8IHBpblNpemUgPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwaW5TaXplID0gY29uZmlnLnBpblNpemU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYW5jaG9yQ29sb3IgPT09IHVuZGVmaW5lZCB8fCBhbmNob3JDb2xvciA9PT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFuY2hvckNvbG9yID0gY29uZmlnLmFuY2hvckNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFuY2hvclNpemUgPT09IHVuZGVmaW5lZCB8fCBhbmNob3JTaXplID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW5jaG9yU2l6ZSA9IGNvbmZpZy5hbmNob3JTaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVDb2xvciAhPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZW5kZXIubGluZUNvbG9yID0gbGluZUNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVPcGFjaXR5ICE9PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlci5saW5lT3BhY2l0eSA9IGxpbmVPcGFjaXR5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxpbmVUaGlja25lc3MgIT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyLmxpbmVUaGlja25lc3MgPSBsaW5lVGhpY2tuZXNzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBpblNpemUgIT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyLnBpblNpemUgPSBwaW5TaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFuY2hvckNvbG9yICE9PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlci5hbmNob3JDb2xvciA9IGFuY2hvckNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFuY2hvclNpemUgIT09IGZhbHNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyLmFuY2hvclNpemUgPSBhbmNob3JTaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpbnRlcm5hbCBtZXRob2QgYWN0cyBhcyBhIHByb3h5IGJldHdlZW4gYWxsIG9mIHRoZSBNYXR0ZXIgSlMgZXZlbnRzIGFuZCB0aGVuIHJlLWVtaXRzIHRoZW1cclxuICAgICAqIHZpYSB0aGlzIGNsYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3NldEV2ZW50c1Byb3h5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2V0RXZlbnRzUHJveHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB2YXIgZW5naW5lID0gdGhpcy5lbmdpbmU7XHJcbiAgICAgICAgdmFyIHdvcmxkID0gdGhpcy5sb2NhbFdvcmxkO1xyXG5cclxuICAgICAgICAvLyAgSW5qZWN0IGRlYnVnIHN0eWxlc1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kcmF3RGVidWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBNYXR0ZXJFdmVudHMub24od29ybGQsICdjb21wb3NpdGVNb2RpZmllZCcsIGZ1bmN0aW9uIChjb21wb3NpdGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLnNldENvbXBvc2l0ZVJlbmRlclN0eWxlKGNvbXBvc2l0ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgTWF0dGVyRXZlbnRzLm9uKHdvcmxkLCAnYmVmb3JlQWRkJywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0cyA9IFtdLmNvbmNhdChldmVudC5vYmplY3QpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IG9iamVjdHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbmRlciA9IG9iai5yZW5kZXI7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqLnR5cGUgPT09ICdib2R5JylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldEJvZHlSZW5kZXJTdHlsZShvYmosIHJlbmRlci5saW5lQ29sb3IsIHJlbmRlci5saW5lT3BhY2l0eSwgcmVuZGVyLmxpbmVUaGlja25lc3MsIHJlbmRlci5maWxsQ29sb3IsIHJlbmRlci5maWxsT3BhY2l0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iai50eXBlID09PSAnY29tcG9zaXRlJylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldENvbXBvc2l0ZVJlbmRlclN0eWxlKG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iai50eXBlID09PSAnY29uc3RyYWludCcpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRDb25zdHJhaW50UmVuZGVyU3R5bGUob2JqLCByZW5kZXIubGluZUNvbG9yLCByZW5kZXIubGluZU9wYWNpdHksIHJlbmRlci5saW5lVGhpY2tuZXNzLCByZW5kZXIucGluU2l6ZSwgcmVuZGVyLmFuY2hvckNvbG9yLCByZW5kZXIuYW5jaG9yU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIE1hdHRlckV2ZW50cy5vbih3b3JsZCwgJ2JlZm9yZUFkZCcsIGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoRXZlbnRzLkJFRk9SRV9BREQsIGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTWF0dGVyRXZlbnRzLm9uKHdvcmxkLCAnYWZ0ZXJBZGQnLCBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KEV2ZW50cy5BRlRFUl9BREQsIGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTWF0dGVyRXZlbnRzLm9uKHdvcmxkLCAnYmVmb3JlUmVtb3ZlJywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdChFdmVudHMuQkVGT1JFX1JFTU9WRSwgZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBNYXR0ZXJFdmVudHMub24od29ybGQsICdhZnRlclJlbW92ZScsIGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmVtaXQoRXZlbnRzLkFGVEVSX1JFTU9WRSwgZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBNYXR0ZXJFdmVudHMub24oZW5naW5lLCAnYmVmb3JlVXBkYXRlJywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZW1pdChFdmVudHMuQkVGT1JFX1VQREFURSwgZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBNYXR0ZXJFdmVudHMub24oZW5naW5lLCAnYWZ0ZXJVcGRhdGUnLCBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KEV2ZW50cy5BRlRFUl9VUERBVEUsIGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTWF0dGVyRXZlbnRzLm9uKGVuZ2luZSwgJ2NvbGxpc2lvblN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhaXJzID0gZXZlbnQucGFpcnM7XHJcbiAgICAgICAgICAgIHZhciBib2R5QTtcclxuICAgICAgICAgICAgdmFyIGJvZHlCO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhaXJzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHlBID0gcGFpcnNbMF0uYm9keUE7XHJcbiAgICAgICAgICAgICAgICBib2R5QiA9IHBhaXJzWzBdLmJvZHlCO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KEV2ZW50cy5DT0xMSVNJT05fU1RBUlQsIGV2ZW50LCBib2R5QSwgYm9keUIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBNYXR0ZXJFdmVudHMub24oZW5naW5lLCAnY29sbGlzaW9uQWN0aXZlJywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhaXJzID0gZXZlbnQucGFpcnM7XHJcbiAgICAgICAgICAgIHZhciBib2R5QTtcclxuICAgICAgICAgICAgdmFyIGJvZHlCO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhaXJzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGJvZHlBID0gcGFpcnNbMF0uYm9keUE7XHJcbiAgICAgICAgICAgICAgICBib2R5QiA9IHBhaXJzWzBdLmJvZHlCO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5lbWl0KEV2ZW50cy5DT0xMSVNJT05fQUNUSVZFLCBldmVudCwgYm9keUEsIGJvZHlCKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgTWF0dGVyRXZlbnRzLm9uKGVuZ2luZSwgJ2NvbGxpc2lvbkVuZCcsIGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwYWlycyA9IGV2ZW50LnBhaXJzO1xyXG4gICAgICAgICAgICB2YXIgYm9keUE7XHJcbiAgICAgICAgICAgIHZhciBib2R5QjtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYWlycy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBib2R5QSA9IHBhaXJzWzBdLmJvZHlBO1xyXG4gICAgICAgICAgICAgICAgYm9keUIgPSBwYWlyc1swXS5ib2R5QjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMuZW1pdChFdmVudHMuQ09MTElTSU9OX0VORCwgZXZlbnQsIGJvZHlBLCBib2R5Qik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm91bmRzIG9mIHRoZSBQaHlzaWNzIHdvcmxkIHRvIG1hdGNoIHRoZSBnaXZlbiB3b3JsZCBwaXhlbCBkaW1lbnNpb25zLlxyXG4gICAgICogWW91IGNhbiBvcHRpb25hbGx5IHNldCB3aGljaCAnd2FsbHMnIHRvIGNyZWF0ZTogbGVmdCwgcmlnaHQsIHRvcCBvciBib3R0b20uXHJcbiAgICAgKiBJZiBub25lIG9mIHRoZSB3YWxscyBhcmUgZ2l2ZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHVzZSB0aGUgd2FsbHMgc2V0dGluZ3MgaXQgaGFkIHByZXZpb3VzbHkuXHJcbiAgICAgKiBJLmUuIGlmIHlvdSBwcmV2aW91c2x5IHRvbGQgaXQgdG8gbm90IGhhdmUgdGhlIGxlZnQgb3IgcmlnaHQgd2FsbHMsIGFuZCB5b3UgdGhlbiBhZGp1c3QgdGhlIHdvcmxkIHNpemVcclxuICAgICAqIHRoZSBuZXdseSBjcmVhdGVkIGJvdW5kcyB3aWxsIGFsc28gbm90IGhhdmUgdGhlIGxlZnQgYW5kIHJpZ2h0IHdhbGxzLlxyXG4gICAgICogRXhwbGljaXRseSBzdGF0ZSB0aGVtIGluIHRoZSBwYXJhbWV0ZXJzIHRvIG92ZXJyaWRlIHRoaXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjc2V0Qm91bmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGJvdW5kcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGJvdW5kcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGhpY2tuZXNzPTY0XSAtIFRoZSB0aGlja25lc3Mgb2YgZWFjaCB3YWxsLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PXRydWVdIC0gSWYgdHJ1ZSB3aWxsIGNyZWF0ZSB0aGUgbGVmdCBib3VuZHMgd2FsbC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JpZ2h0PXRydWVdIC0gSWYgdHJ1ZSB3aWxsIGNyZWF0ZSB0aGUgcmlnaHQgYm91bmRzIHdhbGwuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b3A9dHJ1ZV0gLSBJZiB0cnVlIHdpbGwgY3JlYXRlIHRoZSB0b3AgYm91bmRzIHdhbGwuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtib3R0b209dHJ1ZV0gLSBJZiB0cnVlIHdpbGwgY3JlYXRlIHRoZSBib3R0b20gYm91bmRzIHdhbGwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkfSBUaGlzIE1hdHRlciBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5kczogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIHRoaWNrbmVzcywgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSB0aGlzLnNjZW5lLnN5cy5zY2FsZS53aWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB0aGlzLnNjZW5lLnN5cy5zY2FsZS5oZWlnaHQ7IH1cclxuICAgICAgICBpZiAodGhpY2tuZXNzID09PSB1bmRlZmluZWQpIHsgdGhpY2tuZXNzID0gNjQ7IH1cclxuICAgICAgICBpZiAobGVmdCA9PT0gdW5kZWZpbmVkKSB7IGxlZnQgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHJpZ2h0ID09PSB1bmRlZmluZWQpIHsgcmlnaHQgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHRvcCA9PT0gdW5kZWZpbmVkKSB7IHRvcCA9IHRydWU7IH1cclxuICAgICAgICBpZiAoYm90dG9tID09PSB1bmRlZmluZWQpIHsgYm90dG9tID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVdhbGwobGVmdCwgJ2xlZnQnLCB4IC0gdGhpY2tuZXNzLCB5IC0gdGhpY2tuZXNzLCB0aGlja25lc3MsIGhlaWdodCArICh0aGlja25lc3MgKiAyKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVXYWxsKHJpZ2h0LCAncmlnaHQnLCB4ICsgd2lkdGgsIHkgLSB0aGlja25lc3MsIHRoaWNrbmVzcywgaGVpZ2h0ICsgKHRoaWNrbmVzcyAqIDIpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVdhbGwodG9wLCAndG9wJywgeCwgeSAtIHRoaWNrbmVzcywgd2lkdGgsIHRoaWNrbmVzcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVXYWxsKGJvdHRvbSwgJ2JvdHRvbScsIHgsIHkgKyBoZWlnaHQsIHdpZHRoLCB0aGlja25lc3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSA0IHJlY3RhbmdsZSBib2RpZXMgdGhhdCB3ZXJlIGNyZWF0ZWQsIGlmIGBzZXRCb3VuZHNgIHdhcyBzZXQgaW4gdGhlIE1hdHRlciBjb25maWcsIHRvIHVzZVxyXG4gICAgICogdGhlIG5ldyBwb3NpdGlvbnMgYW5kIHNpemVzLiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IG9ubHkgY2FsbGVkIGludGVybmFsbHkgdmlhIHRoZSBgc2V0Qm91bmRzYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjdXBkYXRlV2FsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhZGQgLSBgdHJ1ZWAgaWYgdGhlIHdhbGxzIGFyZSBiZWluZyBhZGRlZCBvciB1cGRhdGVkLCBgZmFsc2VgIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIHdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwb3NpdGlvbl0gLSBFaXRoZXIgYGxlZnRgLCBgcmlnaHRgLCBgdG9wYCBvciBgYm90dG9tYC4gT25seSBvcHRpb25hbCBpZiBgYWRkYCBpcyBgZmFsc2VgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4XSAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIHRvIHBsYWNlIHRoZSB3YWxscyBhdC4gT25seSBvcHRpb25hbCBpZiBgYWRkYCBpcyBgZmFsc2VgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB0byBwbGFjZSB0aGUgd2FsbHMgYXQuIE9ubHkgb3B0aW9uYWwgaWYgYGFkZGAgaXMgYGZhbHNlYC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSB3YWxscywgaW4gcGl4ZWxzLiBPbmx5IG9wdGlvbmFsIGlmIGBhZGRgIGlzIGBmYWxzZWAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB3YWxscywgaW4gcGl4ZWxzLiBPbmx5IG9wdGlvbmFsIGlmIGBhZGRgIGlzIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVdhbGw6IGZ1bmN0aW9uIChhZGQsIHBvc2l0aW9uLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3YWxsID0gdGhpcy53YWxsc1twb3NpdGlvbl07XHJcblxyXG4gICAgICAgIGlmIChhZGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAod2FsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTWF0dGVyV29ybGQucmVtb3ZlKHRoaXMubG9jYWxXb3JsZCwgd2FsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICBhZGp1c3QgY2VudGVyXHJcbiAgICAgICAgICAgIHggKz0gKHdpZHRoIC8gMik7XHJcbiAgICAgICAgICAgIHkgKz0gKGhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy53YWxsc1twb3NpdGlvbl0gPSB0aGlzLmNyZWF0ZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB7IGlzU3RhdGljOiB0cnVlLCBmcmljdGlvbjogMCwgZnJpY3Rpb25TdGF0aWM6IDAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh3YWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBNYXR0ZXJXb3JsZC5yZW1vdmUodGhpcy5sb2NhbFdvcmxkLCB3YWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy53YWxsc1twb3NpdGlvbl0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgUGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIGFsbCBvZiB0aGUgZGVidWcgYm9kaWVzIGFuZCBqb2ludHMgdG8uXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjb25zdHJ1Y3RvciwgaWYgZGVidWdnaW5nIGhhcyBiZWVuIGVuYWJsZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjcmVhdGVkIEdyYXBoaWNzIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBTY2VuZSBhdCAweDAgYW5kIGdpdmVuIGEgZGVwdGggb2YgYE51bWJlci5NQVhfVkFMVUVgLFxyXG4gICAgICogc28gaXQgcmVuZGVycyBhYm92ZSBhbGwgZWxzZSBpbiB0aGUgU2NlbmUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBHcmFwaGljcyBvYmplY3QgaXMgYXNzaWduZWQgdG8gdGhlIGBkZWJ1Z0dyYXBoaWNgIHByb3BlcnR5IG9mIHRoaXMgY2xhc3MgYW5kIGBkcmF3RGVidWdgIGlzIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjY3JlYXRlRGVidWdHcmFwaGljXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IFRoZSBuZXdseSBjcmVhdGVkIEdyYXBoaWNzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlRGVidWdHcmFwaGljOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBncmFwaGljID0gdGhpcy5zY2VuZS5zeXMuYWRkLmdyYXBoaWNzKHsgeDogMCwgeTogMCB9KTtcclxuXHJcbiAgICAgICAgZ3JhcGhpYy5zZXREZXB0aChOdW1iZXIuTUFYX1ZBTFVFKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZWJ1Z0dyYXBoaWMgPSBncmFwaGljO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdEZWJ1ZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiBncmFwaGljO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdvcmxkIGdyYXZpdHkgYW5kIGdyYXZpdHkgc2NhbGUgdG8gMC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNkaXNhYmxlR3Jhdml0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBkaXNhYmxlR3Jhdml0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS54ID0gMDtcclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS55ID0gMDtcclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS5zY2FsZSA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdvcmxkcyBncmF2aXR5IHRvIHRoZSB2YWx1ZXMgZ2l2ZW4uXHJcbiAgICAgKiBcclxuICAgICAqIEdyYXZpdHkgZWZmZWN0cyBhbGwgYm9kaWVzIGluIHRoZSB3b3JsZCwgdW5sZXNzIHRoZXkgaGF2ZSB0aGUgYGlnbm9yZUdyYXZpdHlgIGZsYWcgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3NldEdyYXZpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB3b3JsZCBncmF2aXR5IHggY29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTFdIC0gVGhlIHdvcmxkIGdyYXZpdHkgeSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTAuMDAxXSAtIFRoZSBncmF2aXR5IHNjYWxlIGZhY3Rvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEdyYXZpdHk6IGZ1bmN0aW9uICh4LCB5LCBzY2FsZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMTsgfVxyXG5cclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS54ID0geDtcclxuICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS55ID0geTtcclxuXHJcbiAgICAgICAgaWYgKHNjYWxlICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsV29ybGQuZ3Jhdml0eS5zY2FsZSA9IHNjYWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHJlY3RhbmdsZSBNYXR0ZXIgYm9keSBhbmQgYWRkcyBpdCB0byB0aGUgd29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjY3JlYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBib2R5IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBib2R5IGluIHRoZSB3b3JsZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBib2R5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25hbCBNYXR0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQm9keVR5cGV9IFRoZSBNYXR0ZXIuanMgYm9keSB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBib2R5ID0gQm9kaWVzLnJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgTWF0dGVyV29ybGQuYWRkKHRoaXMubG9jYWxXb3JsZCwgYm9keSk7XHJcblxyXG4gICAgICAgIHJldHVybiBib2R5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBNYXR0ZXIgSlMgb2JqZWN0LCBvciBhcnJheSBvZiBvYmplY3RzLCB0byB0aGUgd29ybGQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBvYmplY3RzIHNob3VsZCBiZSB2YWxpZCBNYXR0ZXIgSlMgZW50aXRpZXMsIHN1Y2ggYXMgYSBCb2R5LCBDb21wb3NpdGUgb3IgQ29uc3RyYWludC5cclxuICAgICAqIFxyXG4gICAgICogVHJpZ2dlcnMgYGJlZm9yZUFkZGAgYW5kIGBhZnRlckFkZGAgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fG9iamVjdFtdKX0gb2JqZWN0IC0gQ2FuIGJlIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5LCBhbmQgY2FuIGJlIGEgYm9keSwgY29tcG9zaXRlIG9yIGNvbnN0cmFpbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChvYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgTWF0dGVyV29ybGQuYWRkKHRoaXMubG9jYWxXb3JsZCwgb2JqZWN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIE1hdHRlciBKUyBvYmplY3QsIG9yIGFycmF5IG9mIG9iamVjdHMsIGZyb20gdGhlIHdvcmxkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgb2JqZWN0cyBzaG91bGQgYmUgdmFsaWQgTWF0dGVyIEpTIGVudGl0aWVzLCBzdWNoIGFzIGEgQm9keSwgQ29tcG9zaXRlIG9yIENvbnN0cmFpbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRyaWdnZXJzIGBiZWZvcmVSZW1vdmVgIGFuZCBgYWZ0ZXJSZW1vdmVgIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNyZW1vdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG9iamVjdHxvYmplY3RbXSl9IG9iamVjdCAtIENhbiBiZSBzaW5nbGUgb2JqZWN0LCBvciBhbiBhcnJheSwgYW5kIGNhbiBiZSBhIGJvZHksIGNvbXBvc2l0ZSBvciBjb25zdHJhaW50LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVlcD1mYWxzZV0gLSBPcHRpb25hbGx5IHNlYXJjaCB0aGUgb2JqZWN0cyBjaGlsZHJlbiBhbmQgcmVjdXJzaXZlbHkgcmVtb3ZlIHRob3NlIGFzIHdlbGwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChvYmplY3QsIGRlZXApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9iamVjdCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvYmplY3QgPSBbIG9iamVjdCBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50aXR5ID0gb2JqZWN0W2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJvZHkgPSAoZW50aXR5LmJvZHkpID8gZW50aXR5LmJvZHkgOiBlbnRpdHk7XHJcblxyXG4gICAgICAgICAgICBDb21wb3NpdGUucmVtb3ZlKHRoaXMubG9jYWxXb3JsZCwgYm9keSwgZGVlcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgTWF0dGVyIEpTIGNvbnN0cmFpbnQsIG9yIGFycmF5IG9mIGNvbnN0cmFpbnRzLCBmcm9tIHRoZSB3b3JsZC5cclxuICAgICAqIFxyXG4gICAgICogVHJpZ2dlcnMgYGJlZm9yZVJlbW92ZWAgYW5kIGBhZnRlclJlbW92ZWAgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3JlbW92ZUNvbnN0cmFpbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KE1hdHRlckpTLkNvbnN0cmFpbnRUeXBlfE1hdHRlckpTLkNvbnN0cmFpbnRUeXBlW10pfSBjb25zdHJhaW50IC0gQSBNYXR0ZXIgSlMgQ29uc3RyYWludCwgb3IgYW4gYXJyYXkgb2YgY29uc3RyYWludHMsIHRvIGJlIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXSAtIE9wdGlvbmFsbHkgc2VhcmNoIHRoZSBvYmplY3RzIGNoaWxkcmVuIGFuZCByZWN1cnNpdmVseSByZW1vdmUgdGhvc2UgYXMgd2VsbC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNvbnN0cmFpbnQ6IGZ1bmN0aW9uIChjb25zdHJhaW50LCBkZWVwKVxyXG4gICAge1xyXG4gICAgICAgIENvbXBvc2l0ZS5yZW1vdmUodGhpcy5sb2NhbFdvcmxkLCBjb25zdHJhaW50LCBkZWVwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBgTWF0dGVyVGlsZUJvZHlgIGluc3RhbmNlcyBmb3IgYWxsIHRoZSBjb2xsaWRpbmcgdGlsZXMgd2l0aGluIHRoZSBnaXZlbiB0aWxlbWFwIGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIHRpbGVzIGluIHlvdXIgbGF5ZXIgdG8gY29sbGlkZSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCFcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNjb252ZXJ0VGlsZW1hcExheWVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gdGlsZW1hcExheWVyIC1cclxuICAgICAqIEFuIGFycmF5IG9mIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBNYXR0ZXJUaWxlQm9keSBjb25zdHJ1Y3Rvci4ge0BzZWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLlRpbGVCb2R5fVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFdvcmxkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY29udmVydFRpbGVtYXBMYXllcjogZnVuY3Rpb24gKHRpbGVtYXBMYXllciwgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICB2YXIgbGF5ZXJEYXRhID0gdGlsZW1hcExheWVyLmxheWVyO1xyXG4gICAgICAgIHZhciB0aWxlcyA9IHRpbGVtYXBMYXllci5nZXRUaWxlc1dpdGhpbigwLCAwLCBsYXllckRhdGEud2lkdGgsIGxheWVyRGF0YS5oZWlnaHQsIHsgaXNDb2xsaWRpbmc6IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udmVydFRpbGVzKHRpbGVzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBgTWF0dGVyVGlsZUJvZHlgIGluc3RhbmNlcyBmb3IgdGhlIGdpdmVuIHRpbGVzLiBUaGlzIGFkZHMgYm9kaWVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVcclxuICAgICAqIHRpbGVzIGFyZSBzZXQgdG8gY29sbGlkZSBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjY29udmVydFRpbGVzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IHRpbGVzIC0gQW4gYXJyYXkgb2YgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIE1hdHRlclRpbGVCb2R5IGNvbnN0cnVjdG9yLiB7QHNlZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuVGlsZUJvZHl9XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjb252ZXJ0VGlsZXM6IGZ1bmN0aW9uICh0aWxlcywgb3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3IE1hdHRlclRpbGVCb2R5KHRoaXMsIHRpbGVzW2ldLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5leHQgdW5pcXVlIGdyb3VwIGluZGV4IGZvciB3aGljaCBib2RpZXMgd2lsbCBjb2xsaWRlLlxyXG4gICAgICogSWYgYGlzTm9uQ29sbGlkaW5nYCBpcyBgdHJ1ZWAsIHJldHVybnMgdGhlIG5leHQgdW5pcXVlIGdyb3VwIGluZGV4IGZvciB3aGljaCBib2RpZXMgd2lsbCBub3QgY29sbGlkZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNuZXh0R3JvdXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzTm9uQ29sbGlkaW5nPWZhbHNlXSAtIElmIGB0cnVlYCwgcmV0dXJucyB0aGUgbmV4dCB1bmlxdWUgZ3JvdXAgaW5kZXggZm9yIHdoaWNoIGJvZGllcyB3aWxsIF9ub3RfIGNvbGxpZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBVbmlxdWUgY2F0ZWdvcnkgYml0ZmllbGRcclxuICAgICAqL1xyXG4gICAgbmV4dEdyb3VwOiBmdW5jdGlvbiAoaXNOb25Db2xsaWRpbmcpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE1hdHRlckJvZHkubmV4dEdyb3VwKGlzTm9uQ29sbGlkaW5nKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBjYXRlZ29yeSBiaXRmaWVsZCAoc3RhcnRpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgZGVmYXVsdCBjYXRlZ29yeSAweDAwMDEpLlxyXG4gICAgICogVGhlcmUgYXJlIDMyIGF2YWlsYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNuZXh0Q2F0ZWdvcnlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVW5pcXVlIGNhdGVnb3J5IGJpdGZpZWxkXHJcbiAgICAgKi9cclxuICAgIG5leHRDYXRlZ29yeTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTWF0dGVyQm9keS5uZXh0Q2F0ZWdvcnkoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXVzZXMgdGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgYW5kIHNldHMgYGVuYWJsZWRgIHRvIGBmYWxzZWAuXHJcbiAgICAgKiBcclxuICAgICAqIEEgcGF1c2VkIHdvcmxkIHdpbGwgbm90IHJ1biBhbnkgc2ltdWxhdGlvbnMgZm9yIHRoZSBkdXJhdGlvbiBpdCBpcyBwYXVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcGF1c2VcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzI1BBVVNFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBXb3JsZCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlBBVVNFKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lcyB0aGlzIE1hdHRlciBXb3JsZCBpbnN0YW5jZSBmcm9tIGEgcGF1c2VkIHN0YXRlIGFuZCBzZXRzIGBlbmFibGVkYCB0byBgdHJ1ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVzdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNSRVNVTUVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFdvcmxkIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuUkVTVU1FKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGludGVybmFsIHVwZGF0ZSBtZXRob2QuIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhcmVudCBTY2VuZS5cclxuICAgICAqIFxyXG4gICAgICogTW92ZXMgdGhlIHNpbXVsYXRpb24gZm9yd2FyZCBpbiB0aW1lIGJ5IGRlbHRhIG1zLiBVc2VzIGBXb3JsZC5jb3JyZWN0aW9uYCB2YWx1ZSBhcyBhbiBvcHRpb25hbCBudW1iZXIgdGhhdFxyXG4gICAgICogc3BlY2lmaWVzIHRoZSB0aW1lIGNvcnJlY3Rpb24gZmFjdG9yIHRvIGFwcGx5IHRvIHRoZSB1cGRhdGUuIFRoaXMgY2FuIGhlbHAgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlXHJcbiAgICAgKiBzaW11bGF0aW9uIGluIGNhc2VzIHdoZXJlIGRlbHRhIGlzIGNoYW5naW5nIGJldHdlZW4gdXBkYXRlcy4gVGhlIHZhbHVlIG9mIGNvcnJlY3Rpb24gaXMgZGVmaW5lZCBhcyBgZGVsdGEgLyBsYXN0RGVsdGFgLFxyXG4gICAgICogaS5lLiB0aGUgcGVyY2VudGFnZSBjaGFuZ2Ugb2YgZGVsdGEgb3ZlciB0aGUgbGFzdCBzdGVwLiBUaGVyZWZvcmUgdGhlIHZhbHVlIGlzIGFsd2F5cyAxIChubyBjb3JyZWN0aW9uKSB3aGVuXHJcbiAgICAgKiBkZWx0YSBpcyBjb25zdGFudCAob3Igd2hlbiBubyBjb3JyZWN0aW9uIGlzIGRlc2lyZWQsIHdoaWNoIGlzIHRoZSBkZWZhdWx0KS5cclxuICAgICAqIFNlZSB0aGUgcGFwZXIgb24gVGltZSBDb3JyZWN0ZWQgVmVybGV0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBUcmlnZ2VycyBgYmVmb3JlVXBkYXRlYCBhbmQgYGFmdGVyVXBkYXRlYCBldmVudHMuIFRyaWdnZXJzIGBjb2xsaXNpb25TdGFydGAsIGBjb2xsaXNpb25BY3RpdmVgIGFuZCBgY29sbGlzaW9uRW5kYCBldmVudHMuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBXb3JsZCBpcyBwYXVzZWQsIGB1cGRhdGVgIGlzIHN0aWxsIHJ1biwgYnV0IGV4aXRzIGVhcmx5IGFuZCBkb2VzIG5vdCB1cGRhdGUgdGhlIE1hdHRlciBFbmdpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQgfHwgIXRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbmdpbmUgPSB0aGlzLmVuZ2luZTtcclxuICAgICAgICB2YXIgcnVubmVyID0gdGhpcy5ydW5uZXI7XHJcblxyXG4gICAgICAgIHZhciB0aW1pbmcgPSBlbmdpbmUudGltaW5nO1xyXG4gICAgICAgIHZhciBjb3JyZWN0aW9uID0gdGhpcy5jb3JyZWN0aW9uO1xyXG5cclxuICAgICAgICBpZiAocnVubmVyLmlzRml4ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgZml4ZWQgdGltZXN0ZXBcclxuICAgICAgICAgICAgZGVsdGEgPSB0aGlzLmdldERlbHRhKHRpbWUsIGRlbHRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIGR5bmFtaWMgdGltZXN0ZXAgYmFzZWQgb24gd2FsbCBjbG9jayBiZXR3ZWVuIGNhbGxzXHJcbiAgICAgICAgICAgIGRlbHRhID0gKHRpbWUgLSBydW5uZXIudGltZVByZXYpIHx8IHJ1bm5lci5kZWx0YTtcclxuICAgICAgICAgICAgcnVubmVyLnRpbWVQcmV2ID0gdGltZTtcclxuXHJcbiAgICAgICAgICAgIC8vIG9wdGltaXN0aWNhbGx5IGZpbHRlciBkZWx0YSBvdmVyIGEgZmV3IGZyYW1lcywgdG8gaW1wcm92ZSBzdGFiaWxpdHlcclxuICAgICAgICAgICAgcnVubmVyLmRlbHRhSGlzdG9yeS5wdXNoKGRlbHRhKTtcclxuICAgICAgICAgICAgcnVubmVyLmRlbHRhSGlzdG9yeSA9IHJ1bm5lci5kZWx0YUhpc3Rvcnkuc2xpY2UoLXJ1bm5lci5kZWx0YVNhbXBsZVNpemUpO1xyXG4gICAgICAgICAgICBkZWx0YSA9IE1hdGgubWluLmFwcGx5KG51bGwsIHJ1bm5lci5kZWx0YUhpc3RvcnkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gbGltaXQgZGVsdGFcclxuICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSA8IHJ1bm5lci5kZWx0YU1pbiA/IHJ1bm5lci5kZWx0YU1pbiA6IGRlbHRhO1xyXG4gICAgICAgICAgICBkZWx0YSA9IGRlbHRhID4gcnVubmVyLmRlbHRhTWF4ID8gcnVubmVyLmRlbHRhTWF4IDogZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAvLyBjb3JyZWN0aW9uIGZvciBkZWx0YVxyXG4gICAgICAgICAgICBjb3JyZWN0aW9uID0gZGVsdGEgLyBydW5uZXIuZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgZW5naW5lIHRpbWluZyBvYmplY3RcclxuICAgICAgICAgICAgcnVubmVyLmRlbHRhID0gZGVsdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aW1lIGNvcnJlY3Rpb24gZm9yIHRpbWUgc2NhbGluZ1xyXG4gICAgICAgIGlmIChydW5uZXIudGltZVNjYWxlUHJldiAhPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb24gKj0gdGltaW5nLnRpbWVTY2FsZSAvIHJ1bm5lci50aW1lU2NhbGVQcmV2O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWluZy50aW1lU2NhbGUgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb3JyZWN0aW9uID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJ1bm5lci50aW1lU2NhbGVQcmV2ID0gdGltaW5nLnRpbWVTY2FsZTtcclxuICAgICAgICBydW5uZXIuY29ycmVjdGlvbiA9IGNvcnJlY3Rpb247XHJcblxyXG4gICAgICAgIC8vIGZwcyBjb3VudGVyXHJcbiAgICAgICAgcnVubmVyLmZyYW1lQ291bnRlciArPSAxO1xyXG5cclxuICAgICAgICBpZiAodGltZSAtIHJ1bm5lci5jb3VudGVyVGltZXN0YW1wID49IDEwMDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBydW5uZXIuZnBzID0gcnVubmVyLmZyYW1lQ291bnRlciAqICgodGltZSAtIHJ1bm5lci5jb3VudGVyVGltZXN0YW1wKSAvIDEwMDApO1xyXG4gICAgICAgICAgICBydW5uZXIuY291bnRlclRpbWVzdGFtcCA9IHRpbWU7XHJcbiAgICAgICAgICAgIHJ1bm5lci5mcmFtZUNvdW50ZXIgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRW5naW5lLnVwZGF0ZShlbmdpbmUsIGRlbHRhLCBjb3JyZWN0aW9uKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBhZHZhbmNlcyB0aGUgcGh5c2ljcyBzaW11bGF0aW9uIGJ5IG9uZSBpdGVyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwYXNzIGluIHRoZSBgZGVsdGFgIGFuZCBgY29ycmVjdGlvbmAgdmFsdWVzIHRvIGJlIHVzZWQgYnkgRW5naW5lLnVwZGF0ZS5cclxuICAgICAqIElmIHVuZGVmaW5lZCB0aGV5IHVzZSB0aGUgTWF0dGVyIGRlZmF1bHRzIG9mIDYwSHogYW5kIG5vIGNvcnJlY3Rpb24uXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgYHN0ZXBgIGRpcmVjdGx5IGJ5cGFzc2VzIGFueSBjaGVja3Mgb2YgYGVuYWJsZWRgIG9yIGBhdXRvVXBkYXRlYC5cclxuICAgICAqIFxyXG4gICAgICogSXQgYWxzbyBpZ25vcmVzIGFueSBjdXN0b20gYGdldERlbHRhYCBmdW5jdGlvbnMsIGFzIHlvdSBzaG91bGQgYmUgcGFzc2luZyB0aGUgZGVsdGFcclxuICAgICAqIHZhbHVlIGluIHRvIHRoaXMgY2FsbC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIGFkanVzdCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhhdCBFbmdpbmUudXBkYXRlIHBlcmZvcm1zIGludGVybmFsbHkuXHJcbiAgICAgKiBVc2UgdGhlIFNjZW5lIE1hdHRlciBQaHlzaWNzIGNvbmZpZyBvYmplY3QgdG8gc2V0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICAgICAqXHJcbiAgICAgKiBwb3NpdGlvbkl0ZXJhdGlvbnMgKGRlZmF1bHRzIHRvIDYpXHJcbiAgICAgKiB2ZWxvY2l0eUl0ZXJhdGlvbnMgKGRlZmF1bHRzIHRvIDQpXHJcbiAgICAgKiBjb25zdHJhaW50SXRlcmF0aW9ucyAoZGVmYXVsdHMgdG8gMilcclxuICAgICAqXHJcbiAgICAgKiBBZGp1c3RpbmcgdGhlc2UgdmFsdWVzIGNhbiBoZWxwIHBlcmZvcm1hbmNlIGluIGNlcnRhaW4gc2l0dWF0aW9ucywgZGVwZW5kaW5nIG9uIHRoZSBwaHlzaWNzIHJlcXVpcmVtZW50c1xyXG4gICAgICogb2YgeW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3N0ZXBcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsdGE9MTYuNjY2XSAtIFRoZSBkZWx0YSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29ycmVjdGlvbj0xXSAtIE9wdGlvbmFsIGRlbHRhIGNvcnJlY3Rpb24gdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHN0ZXA6IGZ1bmN0aW9uIChkZWx0YSwgY29ycmVjdGlvbilcclxuICAgIHtcclxuICAgICAgICBFbmdpbmUudXBkYXRlKHRoaXMuZW5naW5lLCBkZWx0YSwgY29ycmVjdGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUnVucyB0aGUgTWF0dGVyIEVuZ2luZS51cGRhdGUgYXQgYSBmaXhlZCB0aW1lc3RlcCBvZiA2MEh6LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3VwZGF0ZTYwSHpcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBFbmdpbmUudXBkYXRlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU2MEh6OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxMDAwIC8gNjA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUnVucyB0aGUgTWF0dGVyIEVuZ2luZS51cGRhdGUgYXQgYSBmaXhlZCB0aW1lc3RlcCBvZiAzMEh6LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3VwZGF0ZTMwSHpcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHZhbHVlIHRvIGJlIHBhc3NlZCB0byBFbmdpbmUudXBkYXRlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGUzMEh6OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAxMDAwIC8gMzA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvZHkgY2FuIGJlIGZvdW5kIHdpdGhpbiB0aGUgV29ybGQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjaGFzXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KE1hdHRlckpTLkJvZHl8UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3QpfSBib2R5IC0gVGhlIE1hdHRlciBCb2R5LCBvciBHYW1lIE9iamVjdCwgdG8gc2VhcmNoIGZvciB3aXRoaW4gdGhlIHdvcmxkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Cb2R5VHlwZVtdfSBBbiBhcnJheSBvZiBhbGwgdGhlIE1hdHRlciBKUyBCb2RpZXMgaW4gdGhpcyBXb3JsZC5cclxuICAgICAqL1xyXG4gICAgaGFzOiBmdW5jdGlvbiAoYm9keSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc3JjID0gKGJvZHkuaGFzT3duUHJvcGVydHkoJ2JvZHknKSkgPyBib2R5LmJvZHkgOiBib2R5O1xyXG5cclxuICAgICAgICByZXR1cm4gKENvbXBvc2l0ZS5nZXQodGhpcy5sb2NhbFdvcmxkLCBzcmMuaWQsIHNyYy50eXBlKSAhPT0gbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgdGhlIGJvZGllcyBpbiB0aGUgTWF0dGVyIFdvcmxkLCBpbmNsdWRpbmcgYWxsIGJvZGllcyBpbiBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZ2V0QWxsQm9kaWVzXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge01hdHRlckpTLkJvZHlUeXBlW119IEFuIGFycmF5IG9mIGFsbCB0aGUgTWF0dGVyIEpTIEJvZGllcyBpbiB0aGlzIFdvcmxkLlxyXG4gICAgICovXHJcbiAgICBnZXRBbGxCb2RpZXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIENvbXBvc2l0ZS5hbGxCb2RpZXModGhpcy5sb2NhbFdvcmxkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgY29uc3RyYWludHMgaW4gdGhlIE1hdHRlciBXb3JsZCwgaW5jbHVkaW5nIGFsbCBjb25zdHJhaW50cyBpbiBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZ2V0QWxsQ29uc3RyYWludHNcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7TWF0dGVySlMuQ29uc3RyYWludFR5cGVbXX0gQW4gYXJyYXkgb2YgYWxsIHRoZSBNYXR0ZXIgSlMgQ29uc3RyYWludHMgaW4gdGhpcyBXb3JsZC5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsQ29uc3RyYWludHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIENvbXBvc2l0ZS5hbGxDb25zdHJhaW50cyh0aGlzLmxvY2FsV29ybGQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYWxsIHRoZSBjb21wb3NpdGVzIGluIHRoZSBNYXR0ZXIgV29ybGQsIGluY2x1ZGluZyBhbGwgY29tcG9zaXRlcyBpbiBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjZ2V0QWxsQ29tcG9zaXRlc1xyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtNYXR0ZXJKUy5Db21wb3NpdGVUeXBlW119IEFuIGFycmF5IG9mIGFsbCB0aGUgTWF0dGVyIEpTIENvbXBvc2l0ZXMgaW4gdGhpcyBXb3JsZC5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsQ29tcG9zaXRlczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQ29tcG9zaXRlLmFsbENvbXBvc2l0ZXModGhpcy5sb2NhbFdvcmxkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSByZW5kZXJpbmcgb2YgYm9kaWVzIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byB0aGUgZGVidWcgR3JhcGhpY3Mgb2JqZWN0LCBpZiBlbmFibGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgYWZ0ZXIgYWxsIHByb2Nlc3NpbmcgaGFzIHRha2VuIHBsYWNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3Bvc3RVcGRhdGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcG9zdFVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZHJhd0RlYnVnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZGVidWdDb25maWc7XHJcbiAgICAgICAgdmFyIGVuZ2luZSA9IHRoaXMuZW5naW5lO1xyXG4gICAgICAgIHZhciBncmFwaGljcyA9IHRoaXMuZGVidWdHcmFwaGljO1xyXG5cclxuICAgICAgICB2YXIgYm9kaWVzID0gQ29tcG9zaXRlLmFsbEJvZGllcyh0aGlzLmxvY2FsV29ybGQpO1xyXG5cclxuICAgICAgICB0aGlzLmRlYnVnR3JhcGhpYy5jbGVhcigpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLnNob3dCcm9hZHBoYXNlICYmIGVuZ2luZS5icm9hZHBoYXNlLmNvbnRyb2xsZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckdyaWQoZW5naW5lLmJyb2FkcGhhc2UsIGdyYXBoaWNzLCBjb25maWcuYnJvYWRwaGFzZUNvbG9yLCAwLjUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZy5zaG93Qm91bmRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJCb2R5Qm91bmRzKGJvZGllcywgZ3JhcGhpY3MsIGNvbmZpZy5ib3VuZHNDb2xvciwgMC41KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuc2hvd0JvZHkgfHwgY29uZmlnLnNob3dTdGF0aWNCb2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJCb2RpZXMoYm9kaWVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuc2hvd0pvaW50KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJKb2ludHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuc2hvd0F4ZXMgfHwgY29uZmlnLnNob3dBbmdsZUluZGljYXRvcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQm9keUF4ZXMoYm9kaWVzLCBncmFwaGljcywgY29uZmlnLnNob3dBeGVzLCBjb25maWcuYW5nbGVDb2xvciwgMC41KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuc2hvd1ZlbG9jaXR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJCb2R5VmVsb2NpdHkoYm9kaWVzLCBncmFwaGljcywgY29uZmlnLnZlbG9jaXR5Q29sb3IsIDEsIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZy5zaG93U2VwYXJhdGlvbnMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlcGFyYXRpb25zKGVuZ2luZS5wYWlycy5saXN0LCBncmFwaGljcywgY29uZmlnLnNlcGFyYXRpb25Db2xvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnLnNob3dDb2xsaXNpb25zKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xsaXNpb25zKGVuZ2luZS5wYWlycy5saXN0LCBncmFwaGljcywgY29uZmlnLmNvbGxpc2lvbkNvbG9yKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgRW5naW5lIEJyb2FkcGhhc2UgQ29udHJvbGxlciBHcmlkIHRvIHRoZSBnaXZlbiBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRlYnVnIHJlbmRlcmVyIGNhbGxzIHRoaXMgbWV0aG9kIGlmIHRoZSBgc2hvd0Jyb2FkcGhhc2VgIGNvbmZpZyB2YWx1ZSBpcyBzZXQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgTWF0dGVyIERlYnVnIFJlbmRlcmVyLCBidXQgaXMgYWxzbyBleHBvc2VkIHB1YmxpY2FsbHkgc2hvdWxkXHJcbiAgICAgKiB5b3Ugd2lzaCB0byByZW5kZXIgdGhlIEdyaWQgdG8geW91ciBvd24gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3JlbmRlckdyaWRcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5HcmlkfSBncmlkIC0gVGhlIE1hdHRlciBHcmlkIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIG9iamVjdCB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZUNvbG9yIC0gVGhlIGxpbmUgY29sb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU9wYWNpdHkgLSBUaGUgbGluZSBvcGFjaXR5LCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckdyaWQ6IGZ1bmN0aW9uIChncmlkLCBncmFwaGljcywgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSlcclxuICAgIHtcclxuICAgICAgICBncmFwaGljcy5saW5lU3R5bGUoMSwgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSk7XHJcblxyXG4gICAgICAgIHZhciBidWNrZXRLZXlzID0gQ29tbW9uLmtleXMoZ3JpZC5idWNrZXRzKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXRLZXlzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJ1Y2tldElkID0gYnVja2V0S2V5c1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChncmlkLmJ1Y2tldHNbYnVja2V0SWRdLmxlbmd0aCA8IDIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVnaW9uID0gYnVja2V0SWQuc3BsaXQoL0N8Ui8pO1xyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3Muc3Ryb2tlUmVjdChcclxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHJlZ2lvblsxXSwgMTApICogZ3JpZC5idWNrZXRXaWR0aCxcclxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHJlZ2lvblsyXSwgMTApICogZ3JpZC5idWNrZXRIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBncmlkLmJ1Y2tldFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZ3JpZC5idWNrZXRIZWlnaHRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGxpc3Qgb2YgUGFpciBzZXBhcmF0aW9ucyB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkZWJ1ZyByZW5kZXJlciBjYWxscyB0aGlzIG1ldGhvZCBpZiB0aGUgYHNob3dTZXBhcmF0aW9uc2AgY29uZmlnIHZhbHVlIGlzIHNldC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBNYXR0ZXIgRGVidWcgUmVuZGVyZXIsIGJ1dCBpcyBhbHNvIGV4cG9zZWQgcHVibGljYWxseSBzaG91bGRcclxuICAgICAqIHlvdSB3aXNoIHRvIHJlbmRlciB0aGUgR3JpZCB0byB5b3VyIG93biBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVuZGVyU2VwYXJhdGlvbnNcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5QYWlyW119IHBhaXJzIC0gQW4gYXJyYXkgb2YgTWF0dGVyIFBhaXJzIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIG9iamVjdCB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZUNvbG9yIC0gVGhlIGxpbmUgY29sb3IuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlclNlcGFyYXRpb25zOiBmdW5jdGlvbiAocGFpcnMsIGdyYXBoaWNzLCBsaW5lQ29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgZ3JhcGhpY3MubGluZVN0eWxlKDEsIGxpbmVDb2xvciwgMSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYWlyLmlzQWN0aXZlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xyXG4gICAgICAgICAgICB2YXIgYm9keUEgPSBjb2xsaXNpb24uYm9keUE7XHJcbiAgICAgICAgICAgIHZhciBib2R5QiA9IGNvbGxpc2lvbi5ib2R5QjtcclxuICAgICAgICAgICAgdmFyIHBvc0EgPSBib2R5QS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgdmFyIHBvc0IgPSBib2R5Qi5wb3NpdGlvbjtcclxuICAgICAgICAgICAgdmFyIHBlbmV0cmF0aW9uID0gY29sbGlzaW9uLnBlbmV0cmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgdmFyIGsgPSAoIWJvZHlBLmlzU3RhdGljICYmICFib2R5Qi5pc1N0YXRpYykgPyA0IDogMTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChib2R5Qi5pc1N0YXRpYylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgayA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgcG9zQi54LFxyXG4gICAgICAgICAgICAgICAgcG9zQi55LFxyXG4gICAgICAgICAgICAgICAgcG9zQi54IC0gKHBlbmV0cmF0aW9uLnggKiBrKSxcclxuICAgICAgICAgICAgICAgIHBvc0IueSAtIChwZW5ldHJhdGlvbi55ICogaylcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGsgPSAoIWJvZHlBLmlzU3RhdGljICYmICFib2R5Qi5pc1N0YXRpYykgPyA0IDogMTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib2R5QS5pc1N0YXRpYylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgayA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgcG9zQS54LFxyXG4gICAgICAgICAgICAgICAgcG9zQS55LFxyXG4gICAgICAgICAgICAgICAgcG9zQS54IC0gKHBlbmV0cmF0aW9uLnggKiBrKSxcclxuICAgICAgICAgICAgICAgIHBvc0EueSAtIChwZW5ldHJhdGlvbi55ICogaylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGxpc3Qgb2YgY29sbGlzaW9uIHBvaW50cyBhbmQgbm9ybWFscyB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkZWJ1ZyByZW5kZXJlciBjYWxscyB0aGlzIG1ldGhvZCBpZiB0aGUgYHNob3dDb2xsaXNpb25zYCBjb25maWcgdmFsdWUgaXMgc2V0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIE1hdHRlciBEZWJ1ZyBSZW5kZXJlciwgYnV0IGlzIGFsc28gZXhwb3NlZCBwdWJsaWNhbGx5IHNob3VsZFxyXG4gICAgICogeW91IHdpc2ggdG8gcmVuZGVyIHRoZSBHcmlkIHRvIHlvdXIgb3duIEdyYXBoaWNzIGluc3RhbmNlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNyZW5kZXJDb2xsaXNpb25zXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuUGFpcltdfSBwYWlycyAtIEFuIGFycmF5IG9mIE1hdHRlciBQYWlycyB0byBiZSByZW5kZXJlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSBHcmFwaGljcyBvYmplY3QgdG8gcmVuZGVyIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVDb2xvciAtIFRoZSBsaW5lIGNvbG9yLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBXb3JsZCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJDb2xsaXNpb25zOiBmdW5jdGlvbiAocGFpcnMsIGdyYXBoaWNzLCBsaW5lQ29sb3IpXHJcbiAgICB7XHJcbiAgICAgICAgZ3JhcGhpY3MubGluZVN0eWxlKDEsIGxpbmVDb2xvciwgMC41KTtcclxuICAgICAgICBncmFwaGljcy5maWxsU3R5bGUobGluZUNvbG9yLCAxKTtcclxuXHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIHBhaXI7XHJcblxyXG4gICAgICAgIC8vICBDb2xsaXNpb24gUG9zaXRpb25zXHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFpci5hY3RpdmVDb250YWN0cy5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhY3QgPSBwYWlyLmFjdGl2ZUNvbnRhY3RzW2pdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZlcnRleCA9IGNvbnRhY3QudmVydGV4O1xyXG5cclxuICAgICAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0KHZlcnRleC54IC0gMiwgdmVydGV4LnkgLSAyLCA1LCA1KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENvbGxpc2lvbiBOb3JtYWxzXHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBjb2xsaXNpb24gPSBwYWlyLmNvbGxpc2lvbjtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gcGFpci5hY3RpdmVDb250YWN0cztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWN0cy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsUG9zWCA9IGNvbnRhY3RzWzBdLnZlcnRleC54O1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbFBvc1kgPSBjb250YWN0c1swXS52ZXJ0ZXgueTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFjdHMubGVuZ3RoID09PSAyKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbFBvc1ggPSAoY29udGFjdHNbMF0udmVydGV4LnggKyBjb250YWN0c1sxXS52ZXJ0ZXgueCkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbFBvc1kgPSAoY29udGFjdHNbMF0udmVydGV4LnkgKyBjb250YWN0c1sxXS52ZXJ0ZXgueSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb24uYm9keUIgPT09IGNvbGxpc2lvbi5zdXBwb3J0c1swXS5ib2R5IHx8IGNvbGxpc2lvbi5ib2R5QS5pc1N0YXRpYylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBncmFwaGljcy5saW5lQmV0d2VlbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsUG9zWCAtIGNvbGxpc2lvbi5ub3JtYWwueCAqIDgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFBvc1kgLSBjb2xsaXNpb24ubm9ybWFsLnkgKiA4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NZXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBncmFwaGljcy5saW5lQmV0d2VlbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsUG9zWCArIGNvbGxpc2lvbi5ub3JtYWwueCAqIDgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFBvc1kgKyBjb2xsaXNpb24ubm9ybWFsLnkgKiA4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxQb3NZXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgYm91bmRzIG9mIGFuIGFycmF5IG9mIEJvZGllcyB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBib2R5IGlzIGEgY29tcG91bmQgYm9keSwgaXQgd2lsbCByZW5kZXIgdGhlIGJvdW5kcyBmb3IgdGhlIHBhcmVudCBjb21wb3VuZC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRlYnVnIHJlbmRlcmVyIGNhbGxzIHRoaXMgbWV0aG9kIGlmIHRoZSBgc2hvd0JvdW5kc2AgY29uZmlnIHZhbHVlIGlzIHNldC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBNYXR0ZXIgRGVidWcgUmVuZGVyZXIsIGJ1dCBpcyBhbHNvIGV4cG9zZWQgcHVibGljYWxseSBzaG91bGRcclxuICAgICAqIHlvdSB3aXNoIHRvIHJlbmRlciBib3VuZHMgdG8geW91ciBvd24gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVuZGVyQm9keUJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBib2RpZXMgLSBBbiBhcnJheSBvZiBib2RpZXMgZnJvbSB0aGUgbG9jYWxXb3JsZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSBHcmFwaGljcyBvYmplY3QgdG8gcmVuZGVyIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVDb2xvciAtIFRoZSBsaW5lIGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVPcGFjaXR5IC0gVGhlIGxpbmUgb3BhY2l0eSwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJCb2R5Qm91bmRzOiBmdW5jdGlvbiAoYm9kaWVzLCBncmFwaGljcywgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSlcclxuICAgIHtcclxuICAgICAgICBncmFwaGljcy5saW5lU3R5bGUoMSwgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgMSkgRG9uJ3Qgc2hvdyBpbnZpc2libGUgYm9kaWVzXHJcbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBib3VuZHMgPSBib2R5LmJvdW5kcztcclxuXHJcbiAgICAgICAgICAgIGlmIChib3VuZHMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyYXBoaWNzLnN0cm9rZVJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzLm1pbi54LFxyXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5taW4ueSxcclxuICAgICAgICAgICAgICAgICAgICBib3VuZHMubWF4LnggLSBib3VuZHMubWluLngsXHJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzLm1heC55IC0gYm91bmRzLm1pbi55XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gYm9keS5wYXJ0cztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gcGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tqXTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLnN0cm9rZVJlY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuYm91bmRzLm1pbi54LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LmJvdW5kcy5taW4ueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5ib3VuZHMubWF4LnggLSBwYXJ0LmJvdW5kcy5taW4ueCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5ib3VuZHMubWF4LnkgLSBwYXJ0LmJvdW5kcy5taW4ueVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgZWl0aGVyIGFsbCBheGVzLCBvciBhIHNpbmdsZSBheGlzIGluZGljYXRvciwgZm9yIGFuIGFycmF5IG9mIEJvZGllcywgdG8gdGhlIGdpdmVuIEdyYXBoaWNzIGluc3RhbmNlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGVidWcgcmVuZGVyZXIgY2FsbHMgdGhpcyBtZXRob2QgaWYgdGhlIGBzaG93QXhlc2Agb3IgYHNob3dBbmdsZUluZGljYXRvcmAgY29uZmlnIHZhbHVlcyBhcmUgc2V0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIE1hdHRlciBEZWJ1ZyBSZW5kZXJlciwgYnV0IGlzIGFsc28gZXhwb3NlZCBwdWJsaWNhbGx5IHNob3VsZFxyXG4gICAgICogeW91IHdpc2ggdG8gcmVuZGVyIGJvdW5kcyB0byB5b3VyIG93biBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNyZW5kZXJCb2R5QXhlc1xyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBib2RpZXMgLSBBbiBhcnJheSBvZiBib2RpZXMgZnJvbSB0aGUgbG9jYWxXb3JsZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSBHcmFwaGljcyBvYmplY3QgdG8gcmVuZGVyIHRvLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzaG93QXhlcyAtIElmIGB0cnVlYCBpdCB3aWxsIHJlbmRlciBhbGwgYm9keSBheGVzLiBJZiBgZmFsc2VgIGl0IHdpbGwgcmVuZGVyIGEgc2luZ2xlIGF4aXMgaW5kaWNhdG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVDb2xvciAtIFRoZSBsaW5lIGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVPcGFjaXR5IC0gVGhlIGxpbmUgb3BhY2l0eSwgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJCb2R5QXhlczogZnVuY3Rpb24gKGJvZGllcywgZ3JhcGhpY3MsIHNob3dBeGVzLCBsaW5lQ29sb3IsIGxpbmVPcGFjaXR5KVxyXG4gICAge1xyXG4gICAgICAgIGdyYXBoaWNzLmxpbmVTdHlsZSgxLCBsaW5lQ29sb3IsIGxpbmVPcGFjaXR5KTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuICAgICAgICAgICAgdmFyIHBhcnRzID0gYm9keS5wYXJ0cztcclxuXHJcbiAgICAgICAgICAgIC8vICAxKSBEb24ndCBzaG93IGludmlzaWJsZSBib2RpZXNcclxuICAgICAgICAgICAgaWYgKCFib2R5LnJlbmRlci52aXNpYmxlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHBhcnQ7XHJcbiAgICAgICAgICAgIHZhciBqO1xyXG4gICAgICAgICAgICB2YXIgaztcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG93QXhlcylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gcGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnRzW2pdO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBhcnQuYXhlcy5sZW5ndGg7IGsrKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBheGlzID0gcGFydC5heGVzW2tdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3MubGluZUJldHdlZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnggKyBheGlzLnggKiAyMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueSArIGF4aXMueSAqIDIwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gcGFydHMubGVuZ3RoID4gMSA/IDEgOiAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnRzW2pdO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBhcnQuYXhlcy5sZW5ndGg7IGsrKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnQudmVydGljZXNbMF0ueCArIHBhcnQudmVydGljZXNbcGFydC52ZXJ0aWNlcy5sZW5ndGggLSAxXS54KSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFydC52ZXJ0aWNlc1swXS55ICsgcGFydC52ZXJ0aWNlc1twYXJ0LnZlcnRpY2VzLmxlbmd0aCAtIDFdLnkpIC8gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyBhIHZlbG9jaXR5IGluZGljYXRvciBmb3IgYW4gYXJyYXkgb2YgQm9kaWVzLCB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkZWJ1ZyByZW5kZXJlciBjYWxscyB0aGlzIG1ldGhvZCBpZiB0aGUgYHNob3dWZWxvY2l0eWAgY29uZmlnIHZhbHVlIGlzIHNldC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBNYXR0ZXIgRGVidWcgUmVuZGVyZXIsIGJ1dCBpcyBhbHNvIGV4cG9zZWQgcHVibGljYWxseSBzaG91bGRcclxuICAgICAqIHlvdSB3aXNoIHRvIHJlbmRlciBib3VuZHMgdG8geW91ciBvd24gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVuZGVyQm9keVZlbG9jaXR5XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGJvZGllcyAtIEFuIGFycmF5IG9mIGJvZGllcyBmcm9tIHRoZSBsb2NhbFdvcmxkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIG9iamVjdCB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZUNvbG9yIC0gVGhlIGxpbmUgY29sb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU9wYWNpdHkgLSBUaGUgbGluZSBvcGFjaXR5LCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZVRoaWNrbmVzcyAtIFRoZSBsaW5lIHRoaWNrbmVzcy5cclxuICAgICAqL1xyXG4gICAgcmVuZGVyQm9keVZlbG9jaXR5OiBmdW5jdGlvbiAoYm9kaWVzLCBncmFwaGljcywgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSwgbGluZVRoaWNrbmVzcylcclxuICAgIHtcclxuICAgICAgICBncmFwaGljcy5saW5lU3R5bGUobGluZVRoaWNrbmVzcywgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgMSkgRG9uJ3Qgc2hvdyBpbnZpc2libGUgYm9kaWVzXHJcbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgYm9keS5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgICAgYm9keS5wb3NpdGlvbi55LFxyXG4gICAgICAgICAgICAgICAgYm9keS5wb3NpdGlvbi54ICsgKGJvZHkucG9zaXRpb24ueCAtIGJvZHkucG9zaXRpb25QcmV2LngpICogMixcclxuICAgICAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueSArIChib2R5LnBvc2l0aW9uLnkgLSBib2R5LnBvc2l0aW9uUHJldi55KSAqIDJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGdpdmVuIGFycmF5IG9mIEJvZGllcyB0byB0aGUgZGVidWcgZ3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBgcG9zdFVwZGF0ZWAgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3JlbmRlckJvZGllc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjE0LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthcnJheX0gYm9kaWVzIC0gQW4gYXJyYXkgb2YgYm9kaWVzIGZyb20gdGhlIGxvY2FsV29ybGQuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckJvZGllczogZnVuY3Rpb24gKGJvZGllcylcclxuICAgIHtcclxuICAgICAgICB2YXIgZ3JhcGhpY3MgPSB0aGlzLmRlYnVnR3JhcGhpYztcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZGVidWdDb25maWc7XHJcblxyXG4gICAgICAgIHZhciBzaG93Qm9keSA9IGNvbmZpZy5zaG93Qm9keTtcclxuICAgICAgICB2YXIgc2hvd1N0YXRpY0JvZHkgPSBjb25maWcuc2hvd1N0YXRpY0JvZHk7XHJcbiAgICAgICAgdmFyIHNob3dTbGVlcGluZyA9IGNvbmZpZy5zaG93U2xlZXBpbmc7XHJcbiAgICAgICAgdmFyIHNob3dJbnRlcm5hbEVkZ2VzID0gY29uZmlnLnNob3dJbnRlcm5hbEVkZ2VzO1xyXG4gICAgICAgIHZhciBzaG93Q29udmV4SHVsbHMgPSBjb25maWcuc2hvd0NvbnZleEh1bGxzO1xyXG5cclxuICAgICAgICB2YXIgcmVuZGVyRmlsbCA9IGNvbmZpZy5yZW5kZXJGaWxsO1xyXG4gICAgICAgIHZhciByZW5kZXJMaW5lID0gY29uZmlnLnJlbmRlckxpbmU7XHJcblxyXG4gICAgICAgIHZhciBzdGF0aWNCb2R5U2xlZXBPcGFjaXR5ID0gY29uZmlnLnN0YXRpY0JvZHlTbGVlcE9wYWNpdHk7XHJcbiAgICAgICAgdmFyIHNsZWVwRmlsbENvbG9yID0gY29uZmlnLnNsZWVwRmlsbENvbG9yO1xyXG4gICAgICAgIHZhciBzbGVlcExpbmVDb2xvciA9IGNvbmZpZy5zbGVlcExpbmVDb2xvcjtcclxuXHJcbiAgICAgICAgdmFyIGh1bGxDb2xvciA9IGNvbmZpZy5odWxsQ29sb3I7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgMSkgRG9uJ3Qgc2hvdyBpbnZpc2libGUgYm9kaWVzXHJcbiAgICAgICAgICAgIGlmICghYm9keS5yZW5kZXIudmlzaWJsZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICAyKSBEb24ndCBzaG93IHN0YXRpYyBib2RpZXMsIE9SXHJcbiAgICAgICAgICAgIC8vICAzKSBEb24ndCBzaG93IGR5bmFtaWMgYm9kaWVzXHJcbiAgICAgICAgICAgIGlmICgoIXNob3dTdGF0aWNCb2R5ICYmIGJvZHkuaXNTdGF0aWMpIHx8ICghc2hvd0JvZHkgJiYgIWJvZHkuaXNTdGF0aWMpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGxpbmVDb2xvciA9IGJvZHkucmVuZGVyLmxpbmVDb2xvcjtcclxuICAgICAgICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gYm9keS5yZW5kZXIubGluZU9wYWNpdHk7XHJcbiAgICAgICAgICAgIHZhciBsaW5lVGhpY2tuZXNzID0gYm9keS5yZW5kZXIubGluZVRoaWNrbmVzcztcclxuICAgICAgICAgICAgdmFyIGZpbGxDb2xvciA9IGJvZHkucmVuZGVyLmZpbGxDb2xvcjtcclxuICAgICAgICAgICAgdmFyIGZpbGxPcGFjaXR5ID0gYm9keS5yZW5kZXIuZmlsbE9wYWNpdHk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvd1NsZWVwaW5nICYmIGJvZHkuaXNTbGVlcGluZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvZHkuaXNTdGF0aWMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluZU9wYWNpdHkgKj0gc3RhdGljQm9keVNsZWVwT3BhY2l0eTtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSAqPSBzdGF0aWNCb2R5U2xlZXBPcGFjaXR5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVDb2xvciA9IHNsZWVwTGluZUNvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IHNsZWVwRmlsbENvbG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlbmRlckZpbGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcmVuZGVyTGluZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGluZUNvbG9yID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJCb2R5KGJvZHksIGdyYXBoaWNzLCBzaG93SW50ZXJuYWxFZGdlcywgbGluZUNvbG9yLCBsaW5lT3BhY2l0eSwgbGluZVRoaWNrbmVzcywgZmlsbENvbG9yLCBmaWxsT3BhY2l0eSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFydHNMZW5ndGggPSBib2R5LnBhcnRzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG93Q29udmV4SHVsbHMgJiYgcGFydHNMZW5ndGggPiAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvbnZleEh1bGwoYm9keSwgZ3JhcGhpY3MsIGh1bGxDb2xvciwgbGluZVRoaWNrbmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyBhIHNpbmdsZSBNYXR0ZXIgQm9keSB0byB0aGUgZ2l2ZW4gUGhhc2VyIEdyYXBoaWNzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIE1hdHRlciBEZWJ1ZyBSZW5kZXJlciwgYnV0IGlzIGFsc28gZXhwb3NlZCBwdWJsaWNhbGx5IHNob3VsZFxyXG4gICAgICogeW91IHdpc2ggdG8gcmVuZGVyIGEgQm9keSB0byB5b3VyIG93biBHcmFwaGljcyBpbnN0YW5jZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGRvbid0IHdpc2ggdG8gcmVuZGVyIGEgbGluZSBhcm91bmQgdGhlIGJvZHksIHNldCB0aGUgYGxpbmVDb2xvcmAgcGFyYW1ldGVyIHRvIGBudWxsYC5cclxuICAgICAqIEVxdWFsbHksIGlmIHlvdSBkb24ndCB3aXNoIHRvIHJlbmRlciBhIGZpbGwsIHNldCB0aGUgYGZpbGxDb2xvcmAgcGFyYW1ldGVyIHRvIGBudWxsYC5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVuZGVyQm9keVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5IC0gVGhlIE1hdHRlciBCb2R5IHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIG9iamVjdCB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dJbnRlcm5hbEVkZ2VzIC0gUmVuZGVyIGludGVybmFsIGVkZ2VzIG9mIHRoZSBwb2x5Z29uP1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lQ29sb3JdIC0gVGhlIGxpbmUgY29sb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbmVPcGFjaXR5XSAtIFRoZSBsaW5lIG9wYWNpdHksIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGluZVRoaWNrbmVzcz0xXSAtIFRoZSBsaW5lIHRoaWNrbmVzcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbENvbG9yXSAtIFRoZSBmaWxsIGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsT3BhY2l0eV0gLSBUaGUgZmlsbCBvcGFjaXR5LCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTWF0dGVyIFdvcmxkIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckJvZHk6IGZ1bmN0aW9uIChib2R5LCBncmFwaGljcywgc2hvd0ludGVybmFsRWRnZXMsIGxpbmVDb2xvciwgbGluZU9wYWNpdHksIGxpbmVUaGlja25lc3MsIGZpbGxDb2xvciwgZmlsbE9wYWNpdHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGxpbmVDb2xvciA9PT0gdW5kZWZpbmVkKSB7IGxpbmVDb2xvciA9IG51bGw7IH1cclxuICAgICAgICBpZiAobGluZU9wYWNpdHkgPT09IHVuZGVmaW5lZCkgeyBsaW5lT3BhY2l0eSA9IG51bGw7IH1cclxuICAgICAgICBpZiAobGluZVRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkKSB7IGxpbmVUaGlja25lc3MgPSAxOyB9XHJcbiAgICAgICAgaWYgKGZpbGxDb2xvciA9PT0gdW5kZWZpbmVkKSB7IGZpbGxDb2xvciA9IG51bGw7IH1cclxuICAgICAgICBpZiAoZmlsbE9wYWNpdHkgPT09IHVuZGVmaW5lZCkgeyBmaWxsT3BhY2l0eSA9IG51bGw7IH1cclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZGVidWdDb25maWc7XHJcblxyXG4gICAgICAgIHZhciBzZW5zb3JGaWxsQ29sb3IgPSBjb25maWcuc2Vuc29yRmlsbENvbG9yO1xyXG4gICAgICAgIHZhciBzZW5zb3JMaW5lQ29sb3IgPSBjb25maWcuc2Vuc29yTGluZUNvbG9yO1xyXG5cclxuICAgICAgICAvLyAgSGFuZGxlIGNvbXBvdW5kIHBhcnRzXHJcbiAgICAgICAgdmFyIHBhcnRzID0gYm9keS5wYXJ0cztcclxuICAgICAgICB2YXIgcGFydHNMZW5ndGggPSBwYXJ0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGsgPSAocGFydHNMZW5ndGggPiAxKSA/IDEgOiAwOyBrIDwgcGFydHNMZW5ndGg7IGsrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNba107XHJcbiAgICAgICAgICAgIHZhciByZW5kZXIgPSBwYXJ0LnJlbmRlcjtcclxuICAgICAgICAgICAgdmFyIG9wYWNpdHkgPSByZW5kZXIub3BhY2l0eTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVuZGVyLnZpc2libGUgfHwgb3BhY2l0eSA9PT0gMCB8fCAocGFydC5pc1NlbnNvciAmJiAhY29uZmlnLnNob3dTZW5zb3JzKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICBQYXJ0IHBvbHlnb25cclxuICAgICAgICAgICAgdmFyIGNpcmNsZVJhZGl1cyA9IHBhcnQuY2lyY2xlUmFkaXVzO1xyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3MuYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGFydC5pc1NlbnNvcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBncmFwaGljcy5maWxsU3R5bGUoc2Vuc29yRmlsbENvbG9yLCBmaWxsT3BhY2l0eSAqIG9wYWNpdHkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAobGluZUNvbG9yICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVTdHlsZShsaW5lVGhpY2tuZXNzLCBzZW5zb3JMaW5lQ29sb3IsIGxpbmVPcGFjaXR5ICogb3BhY2l0eSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsbENvbG9yICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxTdHlsZShmaWxsQ29sb3IsIGZpbGxPcGFjaXR5ICogb3BhY2l0eSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChsaW5lQ29sb3IgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3MubGluZVN0eWxlKGxpbmVUaGlja25lc3MsIGxpbmVDb2xvciwgbGluZU9wYWNpdHkgKiBvcGFjaXR5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNpcmNsZVJhZGl1cylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JhcGhpY3MuYXJjKHBhcnQucG9zaXRpb24ueCwgcGFydC5wb3NpdGlvbi55LCBjaXJjbGVSYWRpdXMsIDAsIDIgKiBNYXRoLlBJKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IHBhcnQudmVydGljZXM7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmVydExlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBncmFwaGljcy5tb3ZlVG8odmVydGljZXNbMF0ueCwgdmVydGljZXNbMF0ueSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCB2ZXJ0TGVuZ3RoOyBqKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnQgPSB2ZXJ0aWNlc1tqXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZXJ0aWNlc1tqIC0gMV0uaXNJbnRlcm5hbCB8fCBzaG93SW50ZXJuYWxFZGdlcylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVUbyh2ZXJ0LngsIHZlcnQueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLm1vdmVUbyh2ZXJ0LngsIHZlcnQueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IHZlcnRMZW5ndGggJiYgdmVydC5pc0ludGVybmFsICYmICFzaG93SW50ZXJuYWxFZGdlcylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0SW5kZXggPSAoaiArIDEpICUgdmVydExlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzLm1vdmVUbyh2ZXJ0aWNlc1tuZXh0SW5kZXhdLngsIHZlcnRpY2VzW25leHRJbmRleF0ueSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBncmFwaGljcy5jbG9zZVBhdGgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpbGxDb2xvciAhPT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFBhdGgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxpbmVDb2xvciAhPT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JhcGhpY3Muc3Ryb2tlUGF0aCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnLnNob3dQb3NpdGlvbnMgJiYgIWJvZHkuaXNTdGF0aWMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcHggPSBib2R5LnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIHZhciBweSA9IGJvZHkucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgdmFyIGhzID0gTWF0aC5jZWlsKGNvbmZpZy5wb3NpdGlvblNpemUgLyAyKTtcclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxTdHlsZShjb25maWcucG9zaXRpb25Db2xvciwgMSk7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0KHB4IC0gaHMsIHB5IC0gaHMsIGNvbmZpZy5wb3NpdGlvblNpemUsIGNvbmZpZy5wb3NpdGlvblNpemUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgQ29udmV4IEh1bGwgZm9yIGEgc2luZ2xlIE1hdHRlciBCb2R5IHRvIHRoZSBnaXZlbiBQaGFzZXIgR3JhcGhpY3MgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgTWF0dGVyIERlYnVnIFJlbmRlcmVyLCBidXQgaXMgYWxzbyBleHBvc2VkIHB1YmxpY2FsbHkgc2hvdWxkXHJcbiAgICAgKiB5b3Ugd2lzaCB0byByZW5kZXIgYSBCb2R5IGh1bGwgdG8geW91ciBvd24gR3JhcGhpY3MgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLldvcmxkI3JlbmRlckNvbnZleEh1bGxcclxuICAgICAqIEBzaW5jZSAzLjIyLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keSAtIFRoZSBNYXR0ZXIgQm9keSB0byBiZSByZW5kZXJlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSBHcmFwaGljcyBvYmplY3QgdG8gcmVuZGVyIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGh1bGxDb2xvciAtIFRoZSBjb2xvciB1c2VkIHRvIHJlbmRlciB0aGUgaHVsbC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGluZVRoaWNrbmVzcz0xXSAtIFRoZSBodWxsIGxpbmUgdGhpY2tuZXNzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1hdHRlciBXb3JsZCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxyXG4gICAgICovXHJcbiAgICByZW5kZXJDb252ZXhIdWxsOiBmdW5jdGlvbiAoYm9keSwgZ3JhcGhpY3MsIGh1bGxDb2xvciwgbGluZVRoaWNrbmVzcylcclxuICAgIHtcclxuICAgICAgICBpZiAobGluZVRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkKSB7IGxpbmVUaGlja25lc3MgPSAxOyB9XHJcblxyXG4gICAgICAgIHZhciBwYXJ0cyA9IGJvZHkucGFydHM7XHJcbiAgICAgICAgdmFyIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAvLyAgUmVuZGVyIENvbnZleCBIdWxsc1xyXG4gICAgICAgIGlmIChwYXJ0c0xlbmd0aCA+IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdmVydHMgPSBib2R5LnZlcnRpY2VzO1xyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3MubGluZVN0eWxlKGxpbmVUaGlja25lc3MsIGh1bGxDb2xvcik7XHJcblxyXG4gICAgICAgICAgICBncmFwaGljcy5iZWdpblBhdGgoKTtcclxuXHJcbiAgICAgICAgICAgIGdyYXBoaWNzLm1vdmVUbyh2ZXJ0c1swXS54LCB2ZXJ0c1swXS55KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIHYgPSAxOyB2IDwgdmVydHMubGVuZ3RoOyB2KyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVUbyh2ZXJ0c1t2XS54LCB2ZXJ0c1t2XS55KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZ3JhcGhpY3MubGluZVRvKHZlcnRzWzBdLngsIHZlcnRzWzBdLnkpO1xyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3Muc3Ryb2tlUGF0aCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyBhbGwgb2YgdGhlIGNvbnN0cmFpbnRzIGluIHRoZSB3b3JsZCAodW5sZXNzIHRoZXkgYXJlIHNwZWNpZmljYWxseSBzZXQgdG8gaW52aXNpYmxlKS5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGBwb3N0VXBkYXRlYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjcmVuZGVySm9pbnRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICovXHJcbiAgICByZW5kZXJKb2ludHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdyYXBoaWNzID0gdGhpcy5kZWJ1Z0dyYXBoaWM7XHJcblxyXG4gICAgICAgIC8vIFJlbmRlciBjb25zdHJhaW50cyBcclxuICAgICAgICB2YXIgY29uc3RyYWludHMgPSBDb21wb3NpdGUuYWxsQ29uc3RyYWludHModGhpcy5sb2NhbFdvcmxkKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBjb25zdHJhaW50c1tpXS5yZW5kZXI7XHJcblxyXG4gICAgICAgICAgICB2YXIgbGluZUNvbG9yID0gY29uZmlnLmxpbmVDb2xvcjtcclxuICAgICAgICAgICAgdmFyIGxpbmVPcGFjaXR5ID0gY29uZmlnLmxpbmVPcGFjaXR5O1xyXG4gICAgICAgICAgICB2YXIgbGluZVRoaWNrbmVzcyA9IGNvbmZpZy5saW5lVGhpY2tuZXNzO1xyXG4gICAgICAgICAgICB2YXIgcGluU2l6ZSA9IGNvbmZpZy5waW5TaXplO1xyXG4gICAgICAgICAgICB2YXIgYW5jaG9yQ29sb3IgPSBjb25maWcuYW5jaG9yQ29sb3I7XHJcbiAgICAgICAgICAgIHZhciBhbmNob3JTaXplID0gY29uZmlnLmFuY2hvclNpemU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnN0cmFpbnQoY29uc3RyYWludHNbaV0sIGdyYXBoaWNzLCBsaW5lQ29sb3IsIGxpbmVPcGFjaXR5LCBsaW5lVGhpY2tuZXNzLCBwaW5TaXplLCBhbmNob3JDb2xvciwgYW5jaG9yU2l6ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgYSBzaW5nbGUgTWF0dGVyIENvbnN0cmFpbnQsIHN1Y2ggYXMgYSBQaW4gb3IgYSBTcHJpbmcsIHRvIHRoZSBnaXZlbiBQaGFzZXIgR3JhcGhpY3MgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgTWF0dGVyIERlYnVnIFJlbmRlcmVyLCBidXQgaXMgYWxzbyBleHBvc2VkIHB1YmxpY2FsbHkgc2hvdWxkXHJcbiAgICAgKiB5b3Ugd2lzaCB0byByZW5kZXIgYSBDb25zdHJhaW50IHRvIHlvdXIgb3duIEdyYXBoaWNzIGluc3RhbmNlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNyZW5kZXJDb25zdHJhaW50XHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7TWF0dGVySlMuQ29uc3RyYWludFR5cGV9IGNvbnN0cmFpbnQgLSBUaGUgTWF0dGVyIENvbnN0cmFpbnQgdG8gcmVuZGVyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIEdyYXBoaWNzIG9iamVjdCB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZUNvbG9yIC0gVGhlIGxpbmUgY29sb3IuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZU9wYWNpdHkgLSBUaGUgbGluZSBvcGFjaXR5LCBiZXR3ZWVuIDAgYW5kIDEuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZVRoaWNrbmVzcyAtIFRoZSBsaW5lIHRoaWNrbmVzcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaW5TaXplIC0gSWYgdGhpcyBjb25zdHJhaW50IGlzIGEgcGluLCB0aGlzIHNldHMgdGhlIHNpemUgb2YgdGhlIHBpbiBjaXJjbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5jaG9yQ29sb3IgLSBUaGUgY29sb3IgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGlzIGNvbnN0cmFpbnRzIGFuY2hvcnMuIFNldCB0byBgbnVsbGAgdG8gbm90IHJlbmRlciBhbmNob3JzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuY2hvclNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgYW5jaG9yIGNpcmNsZSwgaWYgdGhpcyBjb25zdHJhaW50IGhhcyBhbmNob3JzIGFuZCBpcyByZW5kZXJpbmcgdGhlbS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cclxuICAgICAqL1xyXG4gICAgcmVuZGVyQ29uc3RyYWludDogZnVuY3Rpb24gKGNvbnN0cmFpbnQsIGdyYXBoaWNzLCBsaW5lQ29sb3IsIGxpbmVPcGFjaXR5LCBsaW5lVGhpY2tuZXNzLCBwaW5TaXplLCBhbmNob3JDb2xvciwgYW5jaG9yU2l6ZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyID0gY29uc3RyYWludC5yZW5kZXI7XHJcblxyXG4gICAgICAgIGlmICghcmVuZGVyLnZpc2libGUgfHwgIWNvbnN0cmFpbnQucG9pbnRBIHx8ICFjb25zdHJhaW50LnBvaW50QilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ3JhcGhpY3MubGluZVN0eWxlKGxpbmVUaGlja25lc3MsIGxpbmVDb2xvciwgbGluZU9wYWNpdHkpO1xyXG5cclxuICAgICAgICB2YXIgYm9keUEgPSBjb25zdHJhaW50LmJvZHlBO1xyXG4gICAgICAgIHZhciBib2R5QiA9IGNvbnN0cmFpbnQuYm9keUI7XHJcbiAgICAgICAgdmFyIHN0YXJ0O1xyXG4gICAgICAgIHZhciBlbmQ7XHJcblxyXG4gICAgICAgIGlmIChib2R5QSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gVmVjdG9yLmFkZChib2R5QS5wb3NpdGlvbiwgY29uc3RyYWludC5wb2ludEEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdGFydCA9IGNvbnN0cmFpbnQucG9pbnRBO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlci50eXBlID09PSAncGluJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLnN0cm9rZUNpcmNsZShzdGFydC54LCBzdGFydC55LCBwaW5TaXplKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGJvZHlCKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBWZWN0b3IuYWRkKGJvZHlCLnBvc2l0aW9uLCBjb25zdHJhaW50LnBvaW50Qik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBjb25zdHJhaW50LnBvaW50QjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3MuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLm1vdmVUbyhzdGFydC54LCBzdGFydC55KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZW5kZXIudHlwZSA9PT0gJ3NwcmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IFZlY3Rvci5zdWIoZW5kLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsID0gVmVjdG9yLnBlcnAoVmVjdG9yLm5vcm1hbGlzZShkZWx0YSkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvaWxzID0gTWF0aC5jZWlsKENvbW1vbi5jbGFtcChjb25zdHJhaW50Lmxlbmd0aCAvIDUsIDEyLCAyMCkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IGNvaWxzOyBqICs9IDEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGogJSAyID09PSAwKSA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3MubGluZVRvKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydC54ICsgZGVsdGEueCAqIChqIC8gY29pbHMpICsgbm9ybWFsLnggKiBvZmZzZXQgKiA0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydC55ICsgZGVsdGEueSAqIChqIC8gY29pbHMpICsgbm9ybWFsLnkgKiBvZmZzZXQgKiA0XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ3JhcGhpY3MubGluZVRvKGVuZC54LCBlbmQueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncmFwaGljcy5zdHJva2VQYXRoKCk7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXIuYW5jaG9ycyAmJiBhbmNob3JTaXplID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxTdHlsZShhbmNob3JDb2xvcik7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxDaXJjbGUoc3RhcnQueCwgc3RhcnQueSwgYW5jaG9yU2l6ZSk7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxDaXJjbGUoZW5kLngsIGVuZC55LCBhbmNob3JTaXplKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgY29sbGlzaW9uIElEcyB0aGF0IE1hdHRlci5KUyB1c2VzIGZvciBCb2R5IGNvbGxpc2lvbiBncm91cHMuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSBkZXN0cm95aW5nIHlvdXIgZ2FtZSBpZiB5b3UgbmVlZCB0byByZXN0YXJ0IHRoZSBnYW1lXHJcbiAgICAgKiBhZ2FpbiBvbiB0aGUgc2FtZSBwYWdlLCB3aXRob3V0IGZpcnN0IHJlbG9hZGluZyB0aGUgcGFnZS4gT3IsIGlmIHlvdSB3aXNoIHRvXHJcbiAgICAgKiBjb25zaXN0ZW50bHkgZGVzdHJveSBhIFNjZW5lIHRoYXQgY29udGFpbnMgTWF0dGVyLmpzIGFuZCB0aGVuIHJ1biBpdCBhZ2FpblxyXG4gICAgICogbGF0ZXIgaW4gdGhlIHNhbWUgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNyZXNldENvbGxpc2lvbklEc1xyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICovXHJcbiAgICByZXNldENvbGxpc2lvbklEczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBCb2R5Ll9uZXh0Q29sbGlkaW5nR3JvdXBJZCA9IDE7XHJcbiAgICAgICAgQm9keS5fbmV4dE5vbkNvbGxpZGluZ0dyb3VwSWQgPSAtMTtcclxuICAgICAgICBCb2R5Ll9uZXh0Q2F0ZWdvcnkgPSAweDAwMDE7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgcmVtb3ZlIGFsbCBNYXR0ZXIgcGh5c2ljcyBldmVudCBsaXN0ZW5lcnMgYW5kIGNsZWFyIHRoZSBtYXR0ZXIgcGh5c2ljcyB3b3JsZCxcclxuICAgICAqIGVuZ2luZSBhbmQgYW55IGRlYnVnIGdyYXBoaWNzLCBpZiBhbnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuV29ybGQjc2h1dGRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBNYXR0ZXJFdmVudHMub2ZmKHRoaXMuZW5naW5lKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgTWF0dGVyV29ybGQuY2xlYXIodGhpcy5sb2NhbFdvcmxkLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIEVuZ2luZS5jbGVhcih0aGlzLmVuZ2luZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyYXdEZWJ1ZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVidWdHcmFwaGljLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2lsbCByZW1vdmUgYWxsIE1hdHRlciBwaHlzaWNzIGV2ZW50IGxpc3RlbmVycyBhbmQgY2xlYXIgdGhlIG1hdHRlciBwaHlzaWNzIHdvcmxkLFxyXG4gICAgICogZW5naW5lIGFuZCBhbnkgZGVidWcgZ3JhcGhpY3MsIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBBZnRlciBkZXN0cm95aW5nIHRoZSB3b3JsZCBpdCBjYW5ub3QgYmUgcmUtdXNlZCBhZ2Fpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Xb3JsZCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV29ybGQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgY29tcG9uZW50IHRvIHNldCByZXN0aXR1dGlvbiBvbiBvYmplY3RzLlxyXG4gKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkJvdW5jZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBCb3VuY2UgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZXN0aXR1dGlvbiBvbiB0aGUgcGh5c2ljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Cb3VuY2Ujc2V0Qm91bmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBIE51bWJlciB0aGF0IGRlZmluZXMgdGhlIHJlc3RpdHV0aW9uIChlbGFzdGljaXR5KSBvZiB0aGUgYm9keS4gVGhlIHZhbHVlIGlzIGFsd2F5cyBwb3NpdGl2ZSBhbmQgaXMgaW4gdGhlIHJhbmdlICgwLCAxKS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGNvbGxpc2lvbnMgbWF5IGJlIHBlcmZlY3RseSBpbmVsYXN0aWMgYW5kIG5vIGJvdW5jaW5nIG1heSBvY2N1ci4gQSB2YWx1ZSBvZiAwLjggbWVhbnMgdGhlIGJvZHkgbWF5IGJvdW5jZSBiYWNrIHdpdGggYXBwcm94aW1hdGVseSA4MCUgb2YgaXRzIGtpbmV0aWMgZW5lcmd5LiBOb3RlIHRoYXQgY29sbGlzaW9uIHJlc3BvbnNlIGlzIGJhc2VkIG9uIHBhaXJzIG9mIGJvZGllcywgYW5kIHRoYXQgcmVzdGl0dXRpb24gdmFsdWVzIGFyZSBjb21iaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybXVsYTogYE1hdGgubWF4KGJvZHlBLnJlc3RpdHV0aW9uLCBib2R5Qi5yZXN0aXR1dGlvbilgXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvdW5jZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5yZXN0aXR1dGlvbiA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJvdW5jZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ29udGFpbnMgbWV0aG9kcyBmb3IgY2hhbmdpbmcgdGhlIGNvbGxpc2lvbiBmaWx0ZXIgb2YgYSBNYXR0ZXIgQm9keS4gU2hvdWxkIGJlIHVzZWQgYXMgYSBtaXhpbiBhbmQgbm90IGNhbGxlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb25cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG52YXIgQ29sbGlzaW9uID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29sbGlzaW9uIGNhdGVnb3J5IG9mIHRoaXMgR2FtZSBPYmplY3QncyBNYXR0ZXIgQm9keS4gVGhpcyBudW1iZXIgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBiZXR3ZWVuIDJeMCAoPSAxKSBhbmQgMl4zMS5cclxuICAgICAqIFR3byBib2RpZXMgd2l0aCBkaWZmZXJlbnQgY29sbGlzaW9uIGdyb3VwcyAoc2VlIHtAbGluayAjc2V0Q29sbGlzaW9uR3JvdXB9KSB3aWxsIG9ubHkgY29sbGlkZSBpZiB0aGVpciBjb2xsaXNpb25cclxuICAgICAqIGNhdGVnb3JpZXMgYXJlIGluY2x1ZGVkIGluIHRoZWlyIGNvbGxpc2lvbiBtYXNrcyAoc2VlIHtAbGluayAjc2V0Q29sbGlkZXNXaXRofSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb24jc2V0Q29sbGlzaW9uQ2F0ZWdvcnlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFVuaXF1ZSBjYXRlZ29yeSBiaXRmaWVsZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQ2F0ZWdvcnk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuY29sbGlzaW9uRmlsdGVyLmNhdGVnb3J5ID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbGxpc2lvbiBncm91cCBvZiB0aGlzIEdhbWUgT2JqZWN0J3MgTWF0dGVyIEJvZHkuIElmIHRoaXMgaXMgemVybyBvciB0d28gTWF0dGVyIEJvZGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMsXHJcbiAgICAgKiB0aGV5IHdpbGwgY29sbGlkZSBhY2NvcmRpbmcgdG8gdGhlIHVzdWFsIHJ1bGVzIChzZWUge0BsaW5rICNzZXRDb2xsaXNpb25DYXRlZ29yeX0gYW5kIHtAbGluayAjc2V0Q29sbGlzaW9uR3JvdXB9KS5cclxuICAgICAqIElmIHR3byBNYXR0ZXIgQm9kaWVzIGhhdmUgdGhlIHNhbWUgcG9zaXRpdmUgdmFsdWUsIHRoZXkgd2lsbCBhbHdheXMgY29sbGlkZTsgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG5lZ2F0aXZlIHZhbHVlLFxyXG4gICAgICogdGhleSB3aWxsIG5ldmVyIGNvbGxpZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb24jc2V0Q29sbGlzaW9uR3JvdXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFVuaXF1ZSBncm91cCBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uR3JvdXA6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkuY29sbGlzaW9uRmlsdGVyLmdyb3VwID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbGxpc2lvbiBtYXNrIGZvciB0aGlzIEdhbWUgT2JqZWN0J3MgTWF0dGVyIEJvZHkuIFR3byBNYXR0ZXIgQm9kaWVzIHdpdGggZGlmZmVyZW50IGNvbGxpc2lvbiBncm91cHMgd2lsbCBvbmx5XHJcbiAgICAgKiBjb2xsaWRlIGlmIGVhY2ggb25lIGluY2x1ZGVzIHRoZSBvdGhlcidzIGNhdGVnb3J5IGluIGl0cyBtYXNrIGJhc2VkIG9uIGEgYml0d2lzZSBBTkQsIGkuZS4gYChjYXRlZ29yeUEgJiBtYXNrQikgIT09IDBgXHJcbiAgICAgKiBhbmQgYChjYXRlZ29yeUIgJiBtYXNrQSkgIT09IDBgIGFyZSBib3RoIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb24jc2V0Q29sbGlkZXNXaXRoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBjYXRlZ29yaWVzIC0gQSB1bmlxdWUgY2F0ZWdvcnkgYml0ZmllbGQsIG9yIGFuIGFycmF5IG9mIHRoZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENvbGxpZGVzV2l0aDogZnVuY3Rpb24gKGNhdGVnb3JpZXMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGZsYWdzID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNhdGVnb3JpZXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmxhZ3MgPSBjYXRlZ29yaWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZsYWdzIHw9IGNhdGVnb3JpZXNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYm9keS5jb2xsaXNpb25GaWx0ZXIubWFzayA9IGZsYWdzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgc2VudCBhIGBQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29sbGlzaW9uRGF0YWAgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgYm9kaWVzIGNvbGxpc2lvbiBjYXRlZ29yeSwgZ3JvdXAgb3IgZmlsdGVyLiBUaG9zZSBtdXN0IGJlIHNldCBpbiBhZGRpdGlvblxyXG4gICAgICogdG8gdGhlIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuQ29sbGlzaW9uI3NldE9uQ29sbGlkZVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoaXMgYm9keSBzdGFydHMgY29sbGlkaW5nIHdpdGggYW5vdGhlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0T25Db2xsaWRlOiBmdW5jdGlvbiAoY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5Lm9uQ29sbGlkZUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjYWxsYmFjayBpcyBzZW50IGEgYFBoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJDb2xsaXNpb25EYXRhYCBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBib2RpZXMgY29sbGlzaW9uIGNhdGVnb3J5LCBncm91cCBvciBmaWx0ZXIuIFRob3NlIG11c3QgYmUgc2V0IGluIGFkZGl0aW9uXHJcbiAgICAgKiB0byB0aGUgY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Db2xsaXNpb24jc2V0T25Db2xsaWRlRW5kXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhpcyBib2R5IHN0b3BzIGNvbGxpZGluZyB3aXRoIGFub3RoZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldE9uQ29sbGlkZUVuZDogZnVuY3Rpb24gKGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5vbkNvbGxpZGVFbmRDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgc2VudCBhIGBQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29sbGlzaW9uRGF0YWAgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgYm9kaWVzIGNvbGxpc2lvbiBjYXRlZ29yeSwgZ3JvdXAgb3IgZmlsdGVyLiBUaG9zZSBtdXN0IGJlIHNldCBpbiBhZGRpdGlvblxyXG4gICAgICogdG8gdGhlIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuQ29sbGlzaW9uI3NldE9uQ29sbGlkZUFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgYm9keSBjb2xsaWRpbmcgd2l0aCBhbm90aGVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRPbkNvbGxpZGVBY3RpdmU6IGZ1bmN0aW9uIChjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJvZHkub25Db2xsaWRlQWN0aXZlQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIGlzIHNlbnQgYSByZWZlcmVuY2UgdG8gdGhlIG90aGVyIGJvZHksIGFsb25nIHdpdGggYSBgUGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckNvbGxpc2lvbkRhdGFgIG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJvZGllcyBjb2xsaXNpb24gY2F0ZWdvcnksIGdyb3VwIG9yIGZpbHRlci4gVGhvc2UgbXVzdCBiZSBzZXQgaW4gYWRkaXRpb25cclxuICAgICAqIHRvIHRoZSBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkNvbGxpc2lvbiNzZXRPbkNvbGxpZGVXaXRoXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoTWF0dGVySlMuQm9keXxNYXR0ZXJKUy5Cb2R5W10pfSBib2R5IC0gVGhlIGJvZHksIG9yIGFuIGFycmF5IG9mIGJvZGllcywgdG8gdGVzdCBmb3IgY29sbGlzaW9ucyB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhpcyBib2R5IGNvbGxpZGVzIHdpdGggdGhlIGdpdmVuIGJvZHkgb3IgYm9kaWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRPbkNvbGxpZGVXaXRoOiBmdW5jdGlvbiAoYm9keSwgY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJvZHkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm9keSA9IFsgYm9keSBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNyYyA9IChib2R5W2ldLmhhc093blByb3BlcnR5KCdib2R5JykpID8gYm9keVtpXS5ib2R5IDogYm9keVtpXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYm9keS5zZXRPbkNvbGxpZGVXaXRoKHNyYywgY2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJvZHkgPSByZXF1aXJlKCcuLi9saWIvYm9keS9Cb2R5Jyk7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgdG8gYXBwbHkgZm9yY2UgdG8gTWF0dGVyLmpzIGJvZGllcy5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Gb3JjZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBGb3JjZSA9IHtcclxuXHJcbiAgICAvLyAgZm9yY2UgPSB2ZWMyIC8gcG9pbnRcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgYSBmb3JjZSB0byBhIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Gb3JjZSNhcHBseUZvcmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IGZvcmNlIC0gQSBWZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGZvcmNlIHRvIGFwcGx5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhcHBseUZvcmNlOiBmdW5jdGlvbiAoZm9yY2UpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIuc2V0KHRoaXMuYm9keS5wb3NpdGlvbi54LCB0aGlzLmJvZHkucG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIEJvZHkuYXBwbHlGb3JjZSh0aGlzLmJvZHksIHRoaXMuX3RlbXBWZWMyLCBmb3JjZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpZXMgYSBmb3JjZSB0byBhIGJvZHkgZnJvbSBhIGdpdmVuIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuRm9yY2UjYXBwbHlGb3JjZUZyb21cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gaW4gd2hpY2ggdGhlIGZvcmNlIGNvbWVzIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IGZvcmNlIC0gQSBWZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGZvcmNlIHRvIGFwcGx5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhcHBseUZvcmNlRnJvbTogZnVuY3Rpb24gKHBvc2l0aW9uLCBmb3JjZSlcclxuICAgIHtcclxuICAgICAgICBCb2R5LmFwcGx5Rm9yY2UodGhpcy5ib2R5LCBwb3NpdGlvbiwgZm9yY2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aHJ1c3QgdG8gdGhlIGZvcndhcmQgcG9zaXRpb24gb2YgdGhlIGJvZHkuXHJcbiAgICAgKiBcclxuICAgICAqIFVzZSB2ZXJ5IHNtYWxsIHZhbHVlcywgc3VjaCBhcyAwLjEsIGRlcGVuZGluZyBvbiB0aGUgbWFzcyBhbmQgcmVxdWlyZWQgc3BlZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Gb3JjZSN0aHJ1c3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCAtIEEgc3BlZWQgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBhIGRpcmVjdGlvbmFsIGZvcmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0aHJ1c3Q6IGZ1bmN0aW9uIChzcGVlZClcclxuICAgIHtcclxuICAgICAgICB2YXIgYW5nbGUgPSB0aGlzLmJvZHkuYW5nbGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3RlbXBWZWMyLnNldChzcGVlZCAqIE1hdGguY29zKGFuZ2xlKSwgc3BlZWQgKiBNYXRoLnNpbihhbmdsZSkpO1xyXG5cclxuICAgICAgICBCb2R5LmFwcGx5Rm9yY2UodGhpcy5ib2R5LCB7IHg6IHRoaXMuYm9keS5wb3NpdGlvbi54LCB5OiB0aGlzLmJvZHkucG9zaXRpb24ueSB9LCB0aGlzLl90ZW1wVmVjMik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHRocnVzdCB0byB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIFxyXG4gICAgICogVXNlIHZlcnkgc21hbGwgdmFsdWVzLCBzdWNoIGFzIDAuMSwgZGVwZW5kaW5nIG9uIHRoZSBtYXNzIGFuZCByZXF1aXJlZCBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkZvcmNlI3RocnVzdExlZnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCAtIEEgc3BlZWQgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBhIGRpcmVjdGlvbmFsIGZvcmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0aHJ1c3RMZWZ0OiBmdW5jdGlvbiAoc3BlZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFuZ2xlID0gdGhpcy5ib2R5LmFuZ2xlIC0gTWF0aC5QSSAvIDI7XHJcblxyXG4gICAgICAgIHRoaXMuX3RlbXBWZWMyLnNldChzcGVlZCAqIE1hdGguY29zKGFuZ2xlKSwgc3BlZWQgKiBNYXRoLnNpbihhbmdsZSkpO1xyXG5cclxuICAgICAgICBCb2R5LmFwcGx5Rm9yY2UodGhpcy5ib2R5LCB7IHg6IHRoaXMuYm9keS5wb3NpdGlvbi54LCB5OiB0aGlzLmJvZHkucG9zaXRpb24ueSB9LCB0aGlzLl90ZW1wVmVjMik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHRocnVzdCB0byB0aGUgcmlnaHQgcG9zaXRpb24gb2YgdGhlIGJvZHkuXHJcbiAgICAgKiBcclxuICAgICAqIFVzZSB2ZXJ5IHNtYWxsIHZhbHVlcywgc3VjaCBhcyAwLjEsIGRlcGVuZGluZyBvbiB0aGUgbWFzcyBhbmQgcmVxdWlyZWQgc3BlZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5Gb3JjZSN0aHJ1c3RSaWdodFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkIC0gQSBzcGVlZCB2YWx1ZSB0byBiZSBhcHBsaWVkIHRvIGEgZGlyZWN0aW9uYWwgZm9yY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRocnVzdFJpZ2h0OiBmdW5jdGlvbiAoc3BlZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFuZ2xlID0gdGhpcy5ib2R5LmFuZ2xlICsgTWF0aC5QSSAvIDI7XHJcblxyXG4gICAgICAgIHRoaXMuX3RlbXBWZWMyLnNldChzcGVlZCAqIE1hdGguY29zKGFuZ2xlKSwgc3BlZWQgKiBNYXRoLnNpbihhbmdsZSkpO1xyXG5cclxuICAgICAgICBCb2R5LmFwcGx5Rm9yY2UodGhpcy5ib2R5LCB7IHg6IHRoaXMuYm9keS5wb3NpdGlvbi54LCB5OiB0aGlzLmJvZHkucG9zaXRpb24ueSB9LCB0aGlzLl90ZW1wVmVjMik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHRocnVzdCB0byB0aGUgYmFjayBwb3NpdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIFxyXG4gICAgICogVXNlIHZlcnkgc21hbGwgdmFsdWVzLCBzdWNoIGFzIDAuMSwgZGVwZW5kaW5nIG9uIHRoZSBtYXNzIGFuZCByZXF1aXJlZCBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLkZvcmNlI3RocnVzdEJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZCAtIEEgc3BlZWQgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBhIGRpcmVjdGlvbmFsIGZvcmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0aHJ1c3RCYWNrOiBmdW5jdGlvbiAoc3BlZWQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFuZ2xlID0gdGhpcy5ib2R5LmFuZ2xlIC0gTWF0aC5QSTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIuc2V0KHNwZWVkICogTWF0aC5jb3MoYW5nbGUpLCBzcGVlZCAqIE1hdGguc2luKGFuZ2xlKSk7XHJcblxyXG4gICAgICAgIEJvZHkuYXBwbHlGb3JjZSh0aGlzLmJvZHksIHsgeDogdGhpcy5ib2R5LnBvc2l0aW9uLngsIHk6IHRoaXMuYm9keS5wb3NpdGlvbi55IH0sIHRoaXMuX3RlbXBWZWMyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGb3JjZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ29udGFpbnMgbWV0aG9kcyBmb3IgY2hhbmdpbmcgdGhlIGZyaWN0aW9uIG9mIGEgR2FtZSBPYmplY3QncyBNYXR0ZXIgQm9keS4gU2hvdWxkIGJlIHVzZWQgYSBtaXhpbiwgbm90IGNhbGxlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5GcmljdGlvblxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBGcmljdGlvbiA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgbmV3IGZyaWN0aW9uIHZhbHVlcyBmb3IgdGhpcyBHYW1lIE9iamVjdCdzIE1hdHRlciBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuRnJpY3Rpb24jc2V0RnJpY3Rpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgZnJpY3Rpb24gb2YgdGhlIGJvZHksIGJldHdlZW4gMCBhbmQgMSwgd2hlcmUgMCBhbGxvd3MgdGhlIEJvZHkgdG8gc2xpZGUgaW5kZWZpbml0ZWx5LCB3aGlsZSAxIGFsbG93cyBpdCB0byBzdG9wIGFsbW9zdCBpbW1lZGlhdGVseSBhZnRlciBhIGZvcmNlIGlzIGFwcGxpZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Fpcl0gLSBJZiBwcm92aWRlZCwgdGhlIG5ldyBhaXIgcmVzaXN0YW5jZSBvZiB0aGUgQm9keS4gVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBmYXN0ZXIgdGhlIEJvZHkgd2lsbCBzbG93IGFzIGl0IG1vdmVzIHRocm91Z2ggc3BhY2UuIDAgbWVhbnMgdGhlIGJvZHkgaGFzIG5vIGFpciByZXNpc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmc3RhdGljXSAtIElmIHByb3ZpZGVkLCB0aGUgbmV3IHN0YXRpYyBmcmljdGlvbiBvZiB0aGUgQm9keS4gVGhlIGhpZ2hlciB0aGUgdmFsdWUgKGUuZy4gMTApLCB0aGUgbW9yZSBmb3JjZSBpdCB3aWxsIHRha2UgdG8gaW5pdGlhbGx5IGdldCB0aGUgQm9keSBtb3Zpbmcgd2hlbiBpdCBpcyBuZWFybHkgc3RhdGlvbmFyeS4gMCBtZWFucyB0aGUgYm9keSB3aWxsIG5ldmVyIFwic3RpY2tcIiB3aGVuIGl0IGlzIG5lYXJseSBzdGF0aW9uYXJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGcmljdGlvbjogZnVuY3Rpb24gKHZhbHVlLCBhaXIsIGZzdGF0aWMpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmZyaWN0aW9uID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChhaXIgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9keS5mcmljdGlvbkFpciA9IGFpcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmc3RhdGljICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvZHkuZnJpY3Rpb25TdGF0aWMgPSBmc3RhdGljO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIG5ldyBhaXIgcmVzaXN0YW5jZSBmb3IgdGhpcyBHYW1lIE9iamVjdCdzIE1hdHRlciBCb2R5LlxyXG4gICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZSBCb2R5IHdpbGwgbmV2ZXIgc2xvdyBhcyBpdCBtb3ZlcyB0aHJvdWdoIHNwYWNlLlxyXG4gICAgICogVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBmYXN0ZXIgYSBCb2R5IHNsb3dzIHdoZW4gbW92aW5nIHRocm91Z2ggc3BhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5GcmljdGlvbiNzZXRGcmljdGlvbkFpclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyBhaXIgcmVzaXN0YW5jZSBmb3IgdGhlIEJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEZyaWN0aW9uQWlyOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmZyaWN0aW9uQWlyID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBuZXcgc3RhdGljIGZyaWN0aW9uIGZvciB0aGlzIEdhbWUgT2JqZWN0J3MgTWF0dGVyIEJvZHkuXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlIEJvZHkgd2lsbCBuZXZlciBcInN0aWNrXCIgd2hlbiBpdCBpcyBuZWFybHkgc3RhdGlvbmFyeS5cclxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHZhbHVlIChlLmcuIDEwKSwgdGhlIG1vcmUgZm9yY2UgaXQgd2lsbCB0YWtlIHRvIGluaXRpYWxseSBnZXQgdGhlIEJvZHkgbW92aW5nIHdoZW4gaXQgaXMgbmVhcmx5IHN0YXRpb25hcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5GcmljdGlvbiNzZXRGcmljdGlvblN0YXRpY1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyBzdGF0aWMgZnJpY3Rpb24gZm9yIHRoZSBCb2R5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRGcmljdGlvblN0YXRpYzogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9keS5mcmljdGlvblN0YXRpYyA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZyaWN0aW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBIGNvbXBvbmVudCB0byBtYW5pcHVsYXRlIHdvcmxkIGdyYXZpdHkgZm9yIE1hdHRlci5qcyBib2RpZXMuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuR3Jhdml0eVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBHcmF2aXR5ID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB0b2dnbGFibGUgZnVuY3Rpb24gZm9yIGlnbm9yaW5nIHdvcmxkIGdyYXZpdHkgaW4gcmVhbC10aW1lIG9uIHRoZSBjdXJyZW50IGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5HcmF2aXR5I3NldElnbm9yZUdyYXZpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBTZXQgdG8gdHJ1ZSB0byBpZ25vcmUgdGhlIGVmZmVjdCBvZiB3b3JsZCBncmF2aXR5LCBvciBmYWxzZSB0byBub3QgaWdub3JlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRJZ25vcmVHcmF2aXR5OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5Lmlnbm9yZUdyYXZpdHkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHcmF2aXR5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEFsbG93cyBhY2Nlc3NpbmcgdGhlIG1hc3MsIGRlbnNpdHksIGFuZCBjZW50ZXIgb2YgbWFzcyBvZiBhIE1hdHRlci1lbmFibGVkIEdhbWUgT2JqZWN0LiBTaG91bGQgYmUgdXNlZCBhcyBhIG1peGluIGFuZCBub3QgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuTWFzc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBNYXNzID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWFzcyBvZiB0aGUgR2FtZSBPYmplY3QncyBNYXR0ZXIgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLk1hc3Mjc2V0TWFzc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG5ldyBtYXNzIG9mIHRoZSBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXNzOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgQm9keS5zZXRNYXNzKHRoaXMuYm9keSwgdmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGRlbnNpdHkgb2YgdGhlIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5NYXNzI3NldERlbnNpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgZGVuc2l0eSBvZiB0aGUgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RGVuc2l0eTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIEJvZHkuc2V0RGVuc2l0eSh0aGlzLmJvZHksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJvZHkncyBjZW50ZXIgb2YgbWFzcy5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIGNyZWF0ZXMgYSBuZXcgYFZlY3RvcjIgZWFjaCB0aW1lIHRvIGF2b2lkIG11dGF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB5b3Ugb25seSBuZWVkIHRvIHJlYWQgdGhlIHZhbHVlIGFuZCB3b24ndCBjaGFuZ2UgaXQsIHlvdSBjYW4gZ2V0IGl0IGZyb20gYEdhbWVPYmplY3QuYm9keS5jZW50ZXJPZk1hc3NgLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLk1hc3MjY2VudGVyT2ZNYXNzXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBjZW50ZXIgb2YgbWFzcy5cclxuICAgICAqL1xyXG4gICAgY2VudGVyT2ZNYXNzOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmVjdG9yMih0aGlzLmJvZHkuY2VudGVyT2ZNYXNzLngsIHRoaXMuYm9keS5jZW50ZXJPZk1hc3MueSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWFzcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogRW5hYmxlcyBhIE1hdHRlci1lbmFibGVkIEdhbWUgT2JqZWN0IHRvIGJlIGEgc2Vuc29yLiBTaG91bGQgYmUgdXNlZCBhcyBhIG1peGluIGFuZCBub3QgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2Vuc29yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIFNlbnNvciA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYm9keSBiZWxvbmdpbmcgdG8gdGhpcyBHYW1lIE9iamVjdCB0byBiZSBhIHNlbnNvci5cclxuICAgICAqIFNlbnNvcnMgdHJpZ2dlciBjb2xsaXNpb24gZXZlbnRzLCBidXQgZG9uJ3QgcmVhY3Qgd2l0aCBjb2xsaWRpbmcgYm9keSBwaHlzaWNhbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2Vuc29yI3NldFNlbnNvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBzZXQgdGhlIGJvZHkgYXMgYSBzZW5zb3IsIG9yIGBmYWxzZWAgdG8gZGlzYWJsZSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2Vuc29yOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ib2R5LmlzU2Vuc29yID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoZSBib2R5IGJlbG9uZ2luZyB0byB0aGlzIEdhbWUgT2JqZWN0IGEgc2Vuc29yIG9yIG5vdD9cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNlbnNvciNpc1NlbnNvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBib2R5IGlzIGEgc2Vuc29yLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNTZW5zb3I6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9keS5pc1NlbnNvcjtcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNlbnNvcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQm9kaWVzID0gcmVxdWlyZSgnLi4vbGliL2ZhY3RvcnkvQm9kaWVzJyk7XHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgRnV6enlFcXVhbHMgPSByZXF1aXJlKCcuLi8uLi8uLi9tYXRoL2Z1enp5L0VxdWFsJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBQaHlzaWNzRWRpdG9yUGFyc2VyID0gcmVxdWlyZSgnLi4vUGh5c2ljc0VkaXRvclBhcnNlcicpO1xyXG52YXIgUGh5c2ljc0pTT05QYXJzZXIgPSByZXF1aXJlKCcuLi9QaHlzaWNzSlNPTlBhcnNlcicpO1xyXG52YXIgVmVydGljZXMgPSByZXF1aXJlKCcuLi9saWIvZ2VvbWV0cnkvVmVydGljZXMnKTtcclxuXHJcbi8qKlxyXG4gKiBFbmFibGVzIGEgTWF0dGVyLWVuYWJsZWQgR2FtZSBPYmplY3QgdG8gc2V0IGl0cyBCb2R5LiBTaG91bGQgYmUgdXNlZCBhcyBhIG1peGluIGFuZCBub3QgZGlyZWN0bHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2V0Qm9keVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBTZXRCb2R5ID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBib2R5IG9uIGEgR2FtZSBPYmplY3QgdG8gYSByZWN0YW5nbGUuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2RzIHJlc2V0cyBwcmV2aW91cyBwcm9wZXJ0aWVzIHlvdSBtYXkgaGF2ZSBzZXQgb24gdGhlIGJvZHksIGluY2x1ZGluZ1xyXG4gICAgICogcGx1Z2lucywgbWFzcywgZnJpY3Rpb24sIGV0Yy4gU28gYmUgc3VyZSB0byByZS1hcHBseSB0aGVzZSBpbiB0aGUgb3B0aW9ucyBvYmplY3QgaWYgbmVlZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2V0Qm9keSNzZXRSZWN0YW5nbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFJlY3RhbmdsZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Qm9keSh7IHR5cGU6ICdyZWN0YW5nbGUnLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0sIG9wdGlvbnMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgYm9keSBvbiBhIEdhbWUgT2JqZWN0IHRvIGEgY2lyY2xlLlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyByZXNldHMgcHJldmlvdXMgcHJvcGVydGllcyB5b3UgbWF5IGhhdmUgc2V0IG9uIHRoZSBib2R5LCBpbmNsdWRpbmdcclxuICAgICAqIHBsdWdpbnMsIG1hc3MsIGZyaWN0aW9uLCBldGMuIFNvIGJlIHN1cmUgdG8gcmUtYXBwbHkgdGhlc2UgaW4gdGhlIG9wdGlvbnMgb2JqZWN0IGlmIG5lZWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNldEJvZHkjc2V0Q2lyY2xlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQm9keUNvbmZpZ30gW29wdGlvbnNdIC0gQW4gb3B0aW9uYWwgQm9keSBjb25maWd1cmF0aW9uIG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc2V0IGluaXRpYWwgQm9keSBwcm9wZXJ0aWVzIG9uIGNyZWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDaXJjbGU6IGZ1bmN0aW9uIChyYWRpdXMsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Qm9keSh7IHR5cGU6ICdjaXJjbGUnLCByYWRpdXM6IHJhZGl1cyB9LCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJvZHkgb24gdGhlIEdhbWUgT2JqZWN0IHRvIGEgcG9seWdvbiBzaGFwZS5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZHMgcmVzZXRzIHByZXZpb3VzIHByb3BlcnRpZXMgeW91IG1heSBoYXZlIHNldCBvbiB0aGUgYm9keSwgaW5jbHVkaW5nXHJcbiAgICAgKiBwbHVnaW5zLCBtYXNzLCBmcmljdGlvbiwgZXRjLiBTbyBiZSBzdXJlIHRvIHJlLWFwcGx5IHRoZXNlIGluIHRoZSBvcHRpb25zIG9iamVjdCBpZiBuZWVkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TZXRCb2R5I3NldFBvbHlnb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWRlcyAtIFRoZSBudW1iZXIgb2Ygc2lkZXMgdGhlIHBvbHlnb24gd2lsbCBoYXZlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSBcInJhZGl1c1wiIG9mIHRoZSBwb2x5Z29uLCBpLmUuIHRoZSBkaXN0YW5jZSBmcm9tIGl0cyBjZW50ZXIgdG8gYW55IHZlcnRleC4gVGhpcyBpcyBhbHNvIHRoZSByYWRpdXMgb2YgaXRzIGNpcmN1bWNpcmNsZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0UG9seWdvbjogZnVuY3Rpb24gKHJhZGl1cywgc2lkZXMsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Qm9keSh7IHR5cGU6ICdwb2x5Z29uJywgc2lkZXM6IHNpZGVzLCByYWRpdXM6IHJhZGl1cyB9LCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGJvZHkgb24gdGhlIEdhbWUgT2JqZWN0IHRvIGEgdHJhcGV6b2lkIHNoYXBlLlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kcyByZXNldHMgcHJldmlvdXMgcHJvcGVydGllcyB5b3UgbWF5IGhhdmUgc2V0IG9uIHRoZSBib2R5LCBpbmNsdWRpbmdcclxuICAgICAqIHBsdWdpbnMsIG1hc3MsIGZyaWN0aW9uLCBldGMuIFNvIGJlIHN1cmUgdG8gcmUtYXBwbHkgdGhlc2UgaW4gdGhlIG9wdGlvbnMgb2JqZWN0IGlmIG5lZWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNldEJvZHkjc2V0VHJhcGV6b2lkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRyYXBlem9pZCBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRyYXBlem9pZCBCb2R5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3BlIC0gVGhlIHNsb3BlIG9mIHRoZSB0cmFwZXpvaWQuIDAgY3JlYXRlcyBhIHJlY3RhbmdsZSwgd2hpbGUgMSBjcmVhdGVzIGEgdHJpYW5nbGUuIFBvc2l0aXZlIHZhbHVlcyBtYWtlIHRoZSB0b3Agc2lkZSBzaG9ydGVyLCB3aGlsZSBuZWdhdGl2ZSB2YWx1ZXMgbWFrZSB0aGUgYm90dG9tIHNpZGUgc2hvcnRlci5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlBoeXNpY3MuTWF0dGVyLk1hdHRlckJvZHlDb25maWd9IFtvcHRpb25zXSAtIEFuIG9wdGlvbmFsIEJvZHkgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHNldCBpbml0aWFsIEJvZHkgcHJvcGVydGllcyBvbiBjcmVhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VHJhcGV6b2lkOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgc2xvcGUsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Qm9keSh7IHR5cGU6ICd0cmFwZXpvaWQnLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCBzbG9wZTogc2xvcGUgfSwgb3B0aW9ucyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgR2FtZSBPYmplY3QgdG8gdXNlIHRoZSBnaXZlbiBleGlzdGluZyBNYXR0ZXIgQm9keS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGJvZHkgaXMgZmlyc3QgcmVtb3ZlZCBmcm9tIHRoZSB3b3JsZCBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNldEJvZHkjc2V0RXhpc3RpbmdCb2R5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5IC0gVGhlIEJvZHkgdGhpcyBHYW1lIE9iamVjdCBzaG91bGQgdXNlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkVG9Xb3JsZD10cnVlXSAtIFNob3VsZCB0aGUgYm9keSBiZSBpbW1lZGlhdGVseSBhZGRlZCB0byB0aGUgV29ybGQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEV4aXN0aW5nQm9keTogZnVuY3Rpb24gKGJvZHksIGFkZFRvV29ybGQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFkZFRvV29ybGQgPT09IHVuZGVmaW5lZCkgeyBhZGRUb1dvcmxkID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ib2R5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53b3JsZC5yZW1vdmUodGhpcy5ib2R5LCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJvZHkucGFydHNbaV0uZ2FtZU9iamVjdCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBib2R5LmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBfdGhpcy53b3JsZC5yZW1vdmUoX3RoaXMuYm9keSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmJvZHkuZ2FtZU9iamVjdCA9IG51bGw7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRvV29ybGQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy53b3JsZC5oYXMoYm9keSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBCZWNhdXNlIGl0IGNvdWxkIGJlIHBhcnQgb2YgYW5vdGhlciBDb21wb3NpdGVcclxuICAgICAgICAgICAgICAgIHRoaXMud29ybGQucmVtb3ZlKGJvZHksIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLndvcmxkLmFkZChib2R5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcmlnaW5Db21wb25lbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcnggPSBib2R5LnJlbmRlci5zcHJpdGUueE9mZnNldDtcclxuICAgICAgICAgICAgdmFyIHJ5ID0gYm9keS5yZW5kZXIuc3ByaXRlLnlPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgY29teCA9IGJvZHkuY2VudGVyT2ZNYXNzLng7XHJcbiAgICAgICAgICAgIHZhciBjb215ID0gYm9keS5jZW50ZXJPZk1hc3MueTtcclxuXHJcbiAgICAgICAgICAgIGlmIChGdXp6eUVxdWFscyhjb214LCAwLjUpICYmIEZ1enp5RXF1YWxzKGNvbXksIDAuNSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0T3JpZ2luKHJ4ICsgMC41LCByeSArIDAuNSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3ggPSBib2R5LmNlbnRlck9mZnNldC54O1xyXG4gICAgICAgICAgICAgICAgdmFyIGN5ID0gYm9keS5jZW50ZXJPZmZzZXQueTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE9yaWdpbihyeCArIChjeCAvIHRoaXMuZGlzcGxheVdpZHRoKSwgcnkgKyAoY3kgLyB0aGlzLmRpc3BsYXlIZWlnaHQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoaXMgR2FtZSBPYmplY3QgdG8gY3JlYXRlIGFuZCB1c2UgYSBuZXcgQm9keSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgZ2l2ZW4uXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmVzZXRzIHByZXZpb3VzIHByb3BlcnRpZXMgeW91IG1heSBoYXZlIHNldCBvbiB0aGUgYm9keSwgaW5jbHVkaW5nXHJcbiAgICAgKiBwbHVnaW5zLCBtYXNzLCBmcmljdGlvbiwgZXRjLiBTbyBiZSBzdXJlIHRvIHJlLWFwcGx5IHRoZXNlIGluIHRoZSBvcHRpb25zIG9iamVjdCBpZiBuZWVkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TZXRCb2R5I3NldEJvZHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyU2V0Qm9keUNvbmZpZyl9IGNvbmZpZyAtIEVpdGhlciBhIHN0cmluZywgc3VjaCBhcyBgY2lyY2xlYCwgb3IgYSBNYXR0ZXIgU2V0IEJvZHkgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5QaHlzaWNzLk1hdHRlci5NYXR0ZXJCb2R5Q29uZmlnfSBbb3B0aW9uc10gLSBBbiBvcHRpb25hbCBCb2R5IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzZXQgaW5pdGlhbCBCb2R5IHByb3BlcnRpZXMgb24gY3JlYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvZHk6IGZ1bmN0aW9uIChjb25maWcsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFjb25maWcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBib2R5O1xyXG5cclxuICAgICAgICAvLyAgQWxsb3cgdGhlbSB0byBkbzogc2hhcGU6ICdjaXJjbGUnIGluc3RlYWQgb2Ygc2hhcGU6IHsgdHlwZTogJ2NpcmNsZScgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBVc2luZyBkZWZhdWx0c1xyXG4gICAgICAgICAgICBjb25maWcgPSB7IHR5cGU6IGNvbmZpZyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNoYXBlVHlwZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0eXBlJywgJ3JlY3RhbmdsZScpO1xyXG4gICAgICAgIHZhciBib2R5WCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd4JywgdGhpcy5fdGVtcFZlYzIueCk7XHJcbiAgICAgICAgdmFyIGJvZHlZID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3knLCB0aGlzLl90ZW1wVmVjMi55KTtcclxuICAgICAgICB2YXIgYm9keVdpZHRoID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3dpZHRoJywgdGhpcy53aWR0aCk7XHJcbiAgICAgICAgdmFyIGJvZHlIZWlnaHQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHNoYXBlVHlwZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JlY3RhbmdsZSc6XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gQm9kaWVzLnJlY3RhbmdsZShib2R5WCwgYm9keVksIGJvZHlXaWR0aCwgYm9keUhlaWdodCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ2NpcmNsZSc6XHJcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3JhZGl1cycsIE1hdGgubWF4KGJvZHlXaWR0aCwgYm9keUhlaWdodCkgLyAyKTtcclxuICAgICAgICAgICAgICAgIHZhciBtYXhTaWRlcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdtYXhTaWRlcycsIDI1KTtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBCb2RpZXMuY2lyY2xlKGJvZHlYLCBib2R5WSwgcmFkaXVzLCBvcHRpb25zLCBtYXhTaWRlcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ3RyYXBlem9pZCc6XHJcbiAgICAgICAgICAgICAgICB2YXIgc2xvcGUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2xvcGUnLCAwLjUpO1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEJvZGllcy50cmFwZXpvaWQoYm9keVgsIGJvZHlZLCBib2R5V2lkdGgsIGJvZHlIZWlnaHQsIHNsb3BlLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAncG9seWdvbic6XHJcbiAgICAgICAgICAgICAgICB2YXIgc2lkZXMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2lkZXMnLCA1KTtcclxuICAgICAgICAgICAgICAgIHZhciBwUmFkaXVzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3JhZGl1cycsIE1hdGgubWF4KGJvZHlXaWR0aCwgYm9keUhlaWdodCkgLyAyKTtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBCb2RpZXMucG9seWdvbihib2R5WCwgYm9keVksIHNpZGVzLCBwUmFkaXVzLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnZnJvbVZlcnRpY2VzJzpcclxuICAgICAgICAgICAgY2FzZSAnZnJvbVZlcnRzJzpcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdmVydHMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndmVydHMnLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodmVydHMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIEhhcyB0aGUgdmVydHMgYXJyYXkgY29tZSBmcm9tIFZlcnRpY2VzLmZyb21QYXRoLCBvciBpcyBpdCByYXc/XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ZXJ0cyA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0cyA9IFZlcnRpY2VzLmZyb21QYXRoKHZlcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvZHkgJiYgIXRoaXMuYm9keS5oYXNPd25Qcm9wZXJ0eSgndGVtcCcpKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQm9keS5zZXRWZXJ0aWNlcyh0aGlzLmJvZHksIHZlcnRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbGFnSW50ZXJuYWwgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZmxhZ0ludGVybmFsJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlQ29sbGluZWFyID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3JlbW92ZUNvbGxpbmVhcicsIDAuMDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWluaW11bUFyZWEgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnbWluaW11bUFyZWEnLCAxMCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IEJvZGllcy5mcm9tVmVydGljZXMoYm9keVgsIGJvZHlZLCB2ZXJ0cywgb3B0aW9ucywgZmxhZ0ludGVybmFsLCByZW1vdmVDb2xsaW5lYXIsIG1pbmltdW1BcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdmcm9tUGh5c2ljc0VkaXRvcic6XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gUGh5c2ljc0VkaXRvclBhcnNlci5wYXJzZUJvZHkoYm9keVgsIGJvZHlZLCBjb25maWcsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdmcm9tUGh5c2ljc1RyYWNlcic6XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gUGh5c2ljc0pTT05QYXJzZXIucGFyc2VCb2R5KGJvZHlYLCBib2R5WSwgY29uZmlnLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEV4aXN0aW5nQm9keShib2R5LCBjb25maWcuYWRkVG9Xb3JsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldEJvZHk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgU2xlZXBpbmcgPSByZXF1aXJlKCcuLi9saWIvY29yZS9TbGVlcGluZycpO1xyXG52YXIgTWF0dGVyRXZlbnRzID0gcmVxdWlyZSgnLi4vbGliL2NvcmUvRXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogRW5hYmxlcyBhIE1hdHRlci1lbmFibGVkIEdhbWUgT2JqZWN0IHRvIGJlIGFibGUgdG8gZ28gdG8gc2xlZXAuIFNob3VsZCBiZSB1c2VkIGFzIGEgbWl4aW4gYW5kIG5vdCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TbGVlcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBTbGVlcCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhpcyBCb2R5IHRvIHNsZWVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU2xlZXAjc2V0VG9TbGVlcFxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRvU2xlZXA6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgU2xlZXBpbmcuc2V0KHRoaXMuYm9keSwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2FrZXMgdGhpcyBCb2R5IGlmIGFzbGVlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNsZWVwI3NldEF3YWtlXHJcbiAgICAgKiBAc2luY2UgMy4yMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QXdha2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgU2xlZXBpbmcuc2V0KHRoaXMuYm9keSwgZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG51bWJlciBvZiB1cGRhdGVzIGluIHdoaWNoIHRoaXMgYm9keSBtdXN0IGhhdmUgbmVhci16ZXJvIHZlbG9jaXR5IGJlZm9yZSBpdCBpcyBzZXQgYXMgc2xlZXBpbmcgKGlmIHNsZWVwaW5nIGlzIGVuYWJsZWQgYnkgdGhlIGVuZ2luZSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TbGVlcCNzZXRTbGVlcFRocmVzaG9sZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT02MF0gLSBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHVwZGF0ZXMgaW4gd2hpY2ggdGhpcyBib2R5IG11c3QgaGF2ZSBuZWFyLXplcm8gdmVsb2NpdHkgYmVmb3JlIGl0IGlzIHNldCBhcyBzbGVlcGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTbGVlcFRocmVzaG9sZDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gNjA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5ib2R5LnNsZWVwVGhyZXNob2xkID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZSBzbGVlcCBhbmQgd2FrZSBldmVudHMgZm9yIHRoaXMgYm9keS5cclxuICAgICAqIFxyXG4gICAgICogQnkgZGVmYXVsdCB3aGVuIGEgYm9keSBnb2VzIHRvIHNsZWVwLCBvciB3YWtlcyB1cCwgaXQgd2lsbCBub3QgZW1pdCBhbnkgZXZlbnRzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZXZlbnRzIGFyZSBlbWl0dGVkIGJ5IHRoZSBNYXR0ZXIgV29ybGQgaW5zdGFuY2UgYW5kIGNhbiBiZSBsaXN0ZW5lZCB0byB2aWFcclxuICAgICAqIHRoZSBgU0xFRVBfU1RBUlRgIGFuZCBgU0xFRVBfRU5EYCBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TbGVlcCNzZXRTbGVlcEV2ZW50c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdGFydCAtIGB0cnVlYCBpZiB5b3Ugd2FudCB0aGUgc2xlZXAgc3RhcnQgZXZlbnQgdG8gYmUgZW1pdHRlZCBmb3IgdGhpcyBib2R5LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmQgLSBgdHJ1ZWAgaWYgeW91IHdhbnQgdGhlIHNsZWVwIGVuZCBldmVudCB0byBiZSBlbWl0dGVkIGZvciB0aGlzIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2xlZXBFdmVudHM6IGZ1bmN0aW9uIChzdGFydCwgZW5kKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0U2xlZXBTdGFydEV2ZW50KHN0YXJ0KTtcclxuICAgICAgICB0aGlzLnNldFNsZWVwRW5kRXZlbnQoZW5kKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2xlZXAgU3RhcnQgZXZlbnQgZm9yIHRoaXMgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNsZWVwI3NldFNsZWVwU3RhcnRFdmVudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBlbmFibGUgdGhlIHNsZWVwIGV2ZW50LCBvciBgZmFsc2VgIHRvIGRpc2FibGUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2xlZXBTdGFydEV2ZW50OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHdvcmxkID0gdGhpcy53b3JsZDtcclxuXHJcbiAgICAgICAgICAgIE1hdHRlckV2ZW50cy5vbih0aGlzLmJvZHksICdzbGVlcFN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3b3JsZC5lbWl0KEV2ZW50cy5TTEVFUF9TVEFSVCwgZXZlbnQsIHRoaXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTWF0dGVyRXZlbnRzLm9mZih0aGlzLmJvZHksICdzbGVlcFN0YXJ0Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTbGVlcCBFbmQgZXZlbnQgZm9yIHRoaXMgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlNsZWVwI3NldFNsZWVwRW5kRXZlbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBgdHJ1ZWAgdG8gZW5hYmxlIHRoZSBzbGVlcCBldmVudCwgb3IgYGZhbHNlYCB0byBkaXNhYmxlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNsZWVwRW5kRXZlbnQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd29ybGQgPSB0aGlzLndvcmxkO1xyXG5cclxuICAgICAgICAgICAgTWF0dGVyRXZlbnRzLm9uKHRoaXMuYm9keSwgJ3NsZWVwRW5kJywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3b3JsZC5lbWl0KEV2ZW50cy5TTEVFUF9FTkQsIGV2ZW50LCB0aGlzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE1hdHRlckV2ZW50cy5vZmYodGhpcy5ib2R5LCAnc2xlZXBFbmQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2xlZXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJvZHkgPSByZXF1aXJlKCcuLi9saWIvYm9keS9Cb2R5Jyk7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBzdGF0aWMgc3RhdGUgb2YgYSBwaHlzaWNzIGJvZHkuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuU3RhdGljXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIFN0YXRpYyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW5nZXMgdGhlIHBoeXNpY3MgYm9keSB0byBiZSBlaXRoZXIgc3RhdGljIGB0cnVlYCBvciBkeW5hbWljIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TdGF0aWMjc2V0U3RhdGljXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gYHRydWVgIHRvIHNldCB0aGUgYm9keSBhcyBiZWluZyBzdGF0aWMsIG9yIGBmYWxzZWAgdG8gbWFrZSBpdCBkeW5hbWljLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0aWM6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBCb2R5LnNldFN0YXRpYyh0aGlzLmJvZHksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJvZHkgaXMgc3RhdGljLCBvdGhlcndpc2UgYGZhbHNlYCBmb3IgYSBkeW5hbWljIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5TdGF0aWMjaXNTdGF0aWNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYm9keSBpcyBzdGF0aWMsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc1N0YXRpYzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ib2R5LmlzU3RhdGljO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3RhdGljO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi4vbGliL2JvZHkvQm9keScpO1xyXG52YXIgTUFUSF9DT05TVCA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvY29uc3QnKTtcclxudmFyIFdyYXBBbmdsZSA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvYW5nbGUvV3JhcCcpO1xyXG52YXIgV3JhcEFuZ2xlRGVncmVlcyA9IHJlcXVpcmUoJy4uLy4uLy4uL21hdGgvYW5nbGUvV3JhcERlZ3JlZXMnKTtcclxuXHJcbi8vICBnbG9iYWwgYml0bWFzayBmbGFnIGZvciBHYW1lT2JqZWN0LnJlbmRlck1hc2sgKHVzZWQgYnkgU2NhbGUpXHJcbnZhciBfRkxBRyA9IDQ7IC8vIDAxMDBcclxuXHJcbi8vICBUcmFuc2Zvcm0gQ29tcG9uZW50XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyB1c2VkIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIHRoZSBwb3NpdGlvbiwgc2NhbGUgYW5kIHJvdGF0aW9uIG9mIGEgR2FtZSBPYmplY3QuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVHJhbnNmb3JtXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIFRyYW5zZm9ybSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVHJhbnNmb3JtI3hcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgeDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LnBvc2l0aW9uLng7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90ZW1wVmVjMi5zZXQodmFsdWUsIHRoaXMueSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LnNldFBvc2l0aW9uKHRoaXMuYm9keSwgdGhpcy5fdGVtcFZlYzIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHkgcG9zaXRpb24gb2YgdGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5UcmFuc2Zvcm0jeVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB5OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkucG9zaXRpb24ueTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RlbXBWZWMyLnNldCh0aGlzLngsIHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24odGhpcy5ib2R5LCB0aGlzLl90ZW1wVmVjMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybSNzY2FsZVhcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2NhbGVYOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2FsZVg7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZmFjdG9yWCA9IDEgLyB0aGlzLl9zY2FsZVg7XHJcbiAgICAgICAgICAgIHZhciBmYWN0b3JZID0gMSAvIHRoaXMuX3NjYWxlWTtcclxuICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9zY2FsZVggPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zY2FsZVggPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmxhZ3MgJj0gfl9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyB8PSBfRkxBRztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIFJlc2V0IE1hdHRlciBzY2FsZSBiYWNrIHRvIDEgKHNpZ2gpXHJcbiAgICAgICAgICAgIEJvZHkuc2NhbGUodGhpcy5ib2R5LCBmYWN0b3JYLCBmYWN0b3JZKTtcclxuXHJcbiAgICAgICAgICAgIEJvZHkuc2NhbGUodGhpcy5ib2R5LCB2YWx1ZSwgdGhpcy5fc2NhbGVZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJ0aWNhbCBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybSNzY2FsZVlcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2NhbGVZOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2FsZVk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZmFjdG9yWCA9IDEgLyB0aGlzLl9zY2FsZVg7XHJcbiAgICAgICAgICAgIHZhciBmYWN0b3JZID0gMSAvIHRoaXMuX3NjYWxlWTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NjYWxlWSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NjYWxlWSA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGbGFncyAmPSB+X0ZMQUc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZsYWdzIHw9IF9GTEFHO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBCb2R5LnNjYWxlKHRoaXMuYm9keSwgZmFjdG9yWCwgZmFjdG9yWSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LnNjYWxlKHRoaXMuYm9keSwgdGhpcy5fc2NhbGVYLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgYGFuZ2xlYCB0byBzZXQgb3IgZ2V0IHJvdGF0aW9uIG9mIHRoZSBwaHlzaWNzIGJvZHkgYXNzb2NpYXRlZCB0byB0aGlzIEdhbWVPYmplY3QuXHJcbiAgICAgKiBVbmxpa2Ugcm90YXRpb24sIHdoZW4gdXNpbmcgc2V0IHRoZSB2YWx1ZSBjYW4gYmUgaW4gZGVncmVlcywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gcmFkaWFucyBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybSNhbmdsZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBhbmdsZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gV3JhcEFuZ2xlRGVncmVlcyh0aGlzLmJvZHkuYW5nbGUgKiBNQVRIX0NPTlNULlJBRF9UT19ERUcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHZhbHVlIGlzIGluIGRlZ3JlZXNcclxuICAgICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IFdyYXBBbmdsZURlZ3JlZXModmFsdWUpICogTUFUSF9DT05TVC5ERUdfVE9fUkFEO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgYHJvdGF0aW9uYCB0byBzZXQgb3IgZ2V0IHRoZSByb3RhdGlvbiBvZiB0aGUgcGh5c2ljcyBib2R5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdhbWVPYmplY3QuXHJcbiAgICAgKiBUaGUgdmFsdWUgd2hlbiBzZXQgbXVzdCBiZSBpbiByYWRpYW5zLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybSNyb3RhdGlvblxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByb3RhdGlvbjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LmFuZ2xlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHZhbHVlIGlzIGluIHJhZGlhbnNcclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSBXcmFwQW5nbGUodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgQm9keS5zZXRBbmdsZSh0aGlzLmJvZHksIHRoaXMuX3JvdGF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHBoeXNpY3MgYm9keSBhbG9uZyB4IGFuZCB5IGF4ZXMuXHJcbiAgICAgKiBCb3RoIHRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIG9wdGlvbmFsIGFuZCBpZiBub3QgcGFzc2VkIGFueSB0aGV5IGRlZmF1bHQgdG8gMC5cclxuICAgICAqIFZlbG9jaXR5LCBhbmdsZSwgZm9yY2UgZXRjLiBhcmUgdW5jaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVHJhbnNmb3JtI3NldFBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIuc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICBCb2R5LnNldFBvc2l0aW9uKHRoaXMuYm9keSwgdGhpcy5fdGVtcFZlYzIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbW1lZGlhdGVseSBzZXRzIHRoZSBhbmdsZSBvZiB0aGUgQm9keS5cclxuICAgICAqIEFuZ3VsYXIgdmVsb2NpdHksIHBvc2l0aW9uLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2V0Um90YXRpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFucz0wXSAtIFRoZSBhbmdsZSBvZiB0aGUgYm9keSwgaW4gcmFkaWFucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSb3RhdGlvbjogZnVuY3Rpb24gKHJhZGlhbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJhZGlhbnMgPT09IHVuZGVmaW5lZCkgeyByYWRpYW5zID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IFdyYXBBbmdsZShyYWRpYW5zKTtcclxuXHJcbiAgICAgICAgQm9keS5zZXRBbmdsZSh0aGlzLmJvZHksIHJhZGlhbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0aW5nIGZpeGVkIHJvdGF0aW9uIHNldHMgdGhlIEJvZHkgaW5lcnRpYSB0byBJbmZpbml0eSwgd2hpY2ggc3RvcHMgaXRcclxuICAgICAqIGZyb20gYmVpbmcgYWJsZSB0byByb3RhdGUgd2hlbiBmb3JjZXMgYXJlIGFwcGxpZWQgdG8gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5UcmFuc2Zvcm0jc2V0Rml4ZWRSb3RhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBHYW1lIE9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Rml4ZWRSb3RhdGlvbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBCb2R5LnNldEluZXJ0aWEodGhpcy5ib2R5LCBJbmZpbml0eSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltbWVkaWF0ZWx5IHNldHMgdGhlIGFuZ2xlIG9mIHRoZSBCb2R5LlxyXG4gICAgICogQW5ndWxhciB2ZWxvY2l0eSwgcG9zaXRpb24sIGZvcmNlIGV0Yy4gYXJlIHVuY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlRyYW5zZm9ybSNzZXRBbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWdyZWVzPTBdIC0gVGhlIGFuZ2xlIHRvIHNldCwgaW4gZGVncmVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbmdsZTogZnVuY3Rpb24gKGRlZ3JlZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRlZ3JlZXMgPT09IHVuZGVmaW5lZCkgeyBkZWdyZWVzID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLmFuZ2xlID0gZGVncmVlcztcclxuXHJcbiAgICAgICAgQm9keS5zZXRBbmdsZSh0aGlzLmJvZHksIHRoaXMucm90YXRpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVHJhbnNmb3JtI3NldFNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MV0gLSBUaGUgaG9yaXpvbnRhbCBzY2FsZSBvZiB0aGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PXhdIC0gVGhlIHZlcnRpY2FsIHNjYWxlIG9mIHRoaXMgR2FtZSBPYmplY3QuIElmIG5vdCBzZXQgaXQgd2lsbCB1c2UgdGhlIHggdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwb2ludF0gLSBUaGUgcG9pbnQgKFZlY3RvcjIpIGZyb20gd2hpY2ggc2NhbGluZyB3aWxsIG9jY3VyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNjYWxlOiBmdW5jdGlvbiAoeCwgeSwgcG9pbnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMTsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IHg7IH1cclxuXHJcbiAgICAgICAgdmFyIGZhY3RvclggPSAxIC8gdGhpcy5fc2NhbGVYO1xyXG4gICAgICAgIHZhciBmYWN0b3JZID0gMSAvIHRoaXMuX3NjYWxlWTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2NhbGVYID0geDtcclxuICAgICAgICB0aGlzLl9zY2FsZVkgPSB5O1xyXG5cclxuICAgICAgICBCb2R5LnNjYWxlKHRoaXMuYm9keSwgZmFjdG9yWCwgZmFjdG9yWSwgcG9pbnQpO1xyXG5cclxuICAgICAgICBCb2R5LnNjYWxlKHRoaXMuYm9keSwgeCwgeSwgcG9pbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQm9keSA9IHJlcXVpcmUoJy4uL2xpYi9ib2R5L0JvZHknKTtcclxuXHJcbi8qKlxyXG4gKiBDb250YWlucyBtZXRob2RzIGZvciBjaGFuZ2luZyB0aGUgdmVsb2NpdHkgb2YgYSBNYXR0ZXIgQm9keS4gU2hvdWxkIGJlIHVzZWQgYXMgYSBtaXhpbiBhbmQgbm90IGNhbGxlZCBkaXJlY3RseS5cclxuICpcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5WZWxvY2l0eVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBWZWxvY2l0eSA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFuZ3VsYXIgdmVsb2NpdHkgb2YgdGhlIGJvZHkgaW5zdGFudGx5LlxyXG4gICAgICogUG9zaXRpb24sIGFuZ2xlLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuQ29tcG9uZW50cy5WZWxvY2l0eSNzZXRBbmd1bGFyVmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBhbmd1bGFyIHZlbG9jaXR5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbmd1bGFyVmVsb2NpdHk6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBCb2R5LnNldEFuZ3VsYXJWZWxvY2l0eSh0aGlzLmJvZHksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCB2ZWxvY2l0eSBvZiB0aGUgcGh5c2ljcyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVmVsb2NpdHkjc2V0VmVsb2NpdHlYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIHZlbG9jaXR5IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eVg6IGZ1bmN0aW9uICh4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RlbXBWZWMyLnNldCh4LCB0aGlzLmJvZHkudmVsb2NpdHkueSk7XHJcblxyXG4gICAgICAgIEJvZHkuc2V0VmVsb2NpdHkodGhpcy5ib2R5LCB0aGlzLl90ZW1wVmVjMik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdmVydGljYWwgdmVsb2NpdHkgb2YgdGhlIHBoeXNpY3MgYm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzLlZlbG9jaXR5I3NldFZlbG9jaXR5WVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgdmVsb2NpdHkgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoaXMgR2FtZSBPYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlbG9jaXR5WTogZnVuY3Rpb24gKHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIuc2V0KHRoaXMuYm9keS52ZWxvY2l0eS54LCB5KTtcclxuXHJcbiAgICAgICAgQm9keS5zZXRWZWxvY2l0eSh0aGlzLmJvZHksIHRoaXMuX3RlbXBWZWMyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCB2ZWxvY2l0eSBvZiB0aGUgcGh5c2ljcyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkNvbXBvbmVudHMuVmVsb2NpdHkjc2V0VmVsb2NpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgdmVsb2NpdHkgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBUaGUgdmVydGljYWwgdmVsb2NpdHkgdmFsdWUsIGl0IGNhbiBiZSBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuIElmIG5vdCBnaXZlbiwgaXQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgYHhgIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGlzIEdhbWUgT2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWZWxvY2l0eTogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGVtcFZlYzIuc2V0KHgsIHkpO1xyXG5cclxuICAgICAgICBCb2R5LnNldFZlbG9jaXR5KHRoaXMuYm9keSwgdGhpcy5fdGVtcFZlYzIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZlbG9jaXR5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QaHlzaWNzLk1hdHRlci5Db21wb25lbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQm91bmNlOiByZXF1aXJlKCcuL0JvdW5jZScpLFxyXG4gICAgQ29sbGlzaW9uOiByZXF1aXJlKCcuL0NvbGxpc2lvbicpLFxyXG4gICAgRm9yY2U6IHJlcXVpcmUoJy4vRm9yY2UnKSxcclxuICAgIEZyaWN0aW9uOiByZXF1aXJlKCcuL0ZyaWN0aW9uJyksXHJcbiAgICBHcmF2aXR5OiByZXF1aXJlKCcuL0dyYXZpdHknKSxcclxuICAgIE1hc3M6IHJlcXVpcmUoJy4vTWFzcycpLFxyXG4gICAgU3RhdGljOiByZXF1aXJlKCcuL1N0YXRpYycpLFxyXG4gICAgU2Vuc29yOiByZXF1aXJlKCcuL1NlbnNvcicpLFxyXG4gICAgU2V0Qm9keTogcmVxdWlyZSgnLi9TZXRCb2R5JyksXHJcbiAgICBTbGVlcDogcmVxdWlyZSgnLi9TbGVlcCcpLFxyXG4gICAgVHJhbnNmb3JtOiByZXF1aXJlKCcuL1RyYW5zZm9ybScpLFxyXG4gICAgVmVsb2NpdHk6IHJlcXVpcmUoJy4vVmVsb2NpdHknKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5BZnRlckFkZEV2ZW50XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7YW55W119IG9iamVjdCAtIEFuIGFycmF5IG9mIHRoZSBvYmplY3QocykgdGhhdCBoYXZlIGJlZW4gYWRkZWQuIE1heSBiZSBhIHNpbmdsZSBib2R5LCBjb25zdHJhaW50LCBjb21wb3NpdGUgb3IgYSBtaXh0dXJlIG9mIHRoZXNlLlxyXG4gKiBAcHJvcGVydHkge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIEFmdGVyIEFkZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIE1hdHRlciBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHByb2Nlc3Mgd2hlbiBhIG5ldyBCb2R5XHJcbiAqIG9yIENvbnN0cmFpbnQgaGFzIGp1c3QgYmVlbiBhZGRlZCB0byB0aGUgd29ybGQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5tYXR0ZXIud29ybGQub24oJ2FmdGVyYWRkJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjQUZURVJfQUREXHJcbiAqIEBzaW5jZSAzLjIyLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5BZnRlckFkZEV2ZW50fSBldmVudCAtIFRoZSBBZGQgRXZlbnQgb2JqZWN0LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnYWZ0ZXJhZGQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzLkFmdGVyUmVtb3ZlRXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHthbnlbXX0gb2JqZWN0IC0gQW4gYXJyYXkgb2YgdGhlIG9iamVjdChzKSB0aGF0IHdlcmUgcmVtb3ZlZC4gTWF5IGJlIGEgc2luZ2xlIGJvZHksIGNvbnN0cmFpbnQsIGNvbXBvc2l0ZSBvciBhIG1peHR1cmUgb2YgdGhlc2UuXHJcbiAqIEBwcm9wZXJ0eSB7YW55fSBzb3VyY2UgLSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTWF0dGVyIFBoeXNpY3MgQWZ0ZXIgUmVtb3ZlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2UgYXQgdGhlIGVuZCBvZiB0aGUgcHJvY2VzcyB3aGVuIGEgXHJcbiAqIEJvZHkgb3IgQ29uc3RyYWludCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3JsZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignYWZ0ZXJyZW1vdmUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNBRlRFUl9SRU1PVkVcclxuICogQHNpbmNlIDMuMjIuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzLkFmdGVyUmVtb3ZlRXZlbnR9IGV2ZW50IC0gVGhlIFJlbW92ZSBFdmVudCBvYmplY3QuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhZnRlcnJlbW92ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQWZ0ZXJVcGRhdGVFdmVudFxyXG4gKlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZXN0YW1wIC0gVGhlIE1hdHRlciBFbmdpbmUgYHRpbWluZy50aW1lc3RhbXBgIHZhbHVlIGZvciB0aGUgZXZlbnQuXHJcbiAqIEBwcm9wZXJ0eSB7YW55fSBzb3VyY2UgLSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTWF0dGVyIFBoeXNpY3MgQWZ0ZXIgVXBkYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2UgYWZ0ZXIgdGhlIGVuZ2luZSBoYXMgdXBkYXRlZCBhbmQgYWxsIGNvbGxpc2lvbiBldmVudHMgaGF2ZSByZXNvbHZlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignYWZ0ZXJ1cGRhdGUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNBRlRFUl9VUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQWZ0ZXJVcGRhdGVFdmVudH0gZXZlbnQgLSBUaGUgVXBkYXRlIEV2ZW50IG9iamVjdC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FmdGVydXBkYXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5CZWZvcmVBZGRFdmVudFxyXG4gKlxyXG4gKiBAcHJvcGVydHkge2FueVtdfSBvYmplY3QgLSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0KHMpIHRvIGJlIGFkZGVkLiBNYXkgYmUgYSBzaW5nbGUgYm9keSwgY29uc3RyYWludCwgY29tcG9zaXRlIG9yIGEgbWl4dHVyZSBvZiB0aGVzZS5cclxuICogQHByb3BlcnR5IHthbnl9IHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudC5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBNYXR0ZXIgUGh5c2ljcyBCZWZvcmUgQWRkIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwcm9jZXNzIHdoZW4gYSBuZXcgQm9keVxyXG4gKiBvciBDb25zdHJhaW50IGlzIGJlaW5nIGFkZGVkIHRvIHRoZSB3b3JsZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignYmVmb3JlYWRkJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjQkVGT1JFX0FERFxyXG4gKiBAc2luY2UgMy4yMi4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQmVmb3JlQWRkRXZlbnR9IGV2ZW50IC0gVGhlIEFkZCBFdmVudCBvYmplY3QuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdiZWZvcmVhZGQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzLkJlZm9yZVJlbW92ZUV2ZW50XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7YW55W119IG9iamVjdCAtIEFuIGFycmF5IG9mIHRoZSBvYmplY3QocykgdG8gYmUgcmVtb3ZlZC4gTWF5IGJlIGEgc2luZ2xlIGJvZHksIGNvbnN0cmFpbnQsIGNvbXBvc2l0ZSBvciBhIG1peHR1cmUgb2YgdGhlc2UuXHJcbiAqIEBwcm9wZXJ0eSB7YW55fSBzb3VyY2UgLSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTWF0dGVyIFBoeXNpY3MgQmVmb3JlIFJlbW92ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIE1hdHRlciBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvY2VzcyB3aGVuIGEgXHJcbiAqIEJvZHkgb3IgQ29uc3RyYWludCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHdvcmxkLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubWF0dGVyLndvcmxkLm9uKCdiZWZvcmVyZW1vdmUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNCRUZPUkVfUkVNT1ZFXHJcbiAqIEBzaW5jZSAzLjIyLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5CZWZvcmVSZW1vdmVFdmVudH0gZXZlbnQgLSBUaGUgUmVtb3ZlIEV2ZW50IG9iamVjdC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2JlZm9yZXJlbW92ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQmVmb3JlVXBkYXRlRXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBNYXR0ZXIgRW5naW5lIGB0aW1pbmcudGltZXN0YW1wYCB2YWx1ZSBmb3IgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIEJlZm9yZSBVcGRhdGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSByaWdodCBiZWZvcmUgYWxsIHRoZSBjb2xsaXNpb24gcHJvY2Vzc2luZyB0YWtlcyBwbGFjZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignYmVmb3JldXBkYXRlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjQkVGT1JFX1VQREFURVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5CZWZvcmVVcGRhdGVFdmVudH0gZXZlbnQgLSBUaGUgVXBkYXRlIEV2ZW50IG9iamVjdC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2JlZm9yZXVwZGF0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQ29sbGlzaW9uQWN0aXZlRXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29sbGlzaW9uRGF0YVtdfSBwYWlycyAtIEEgbGlzdCBvZiBhbGwgYWZmZWN0ZWQgcGFpcnMgaW4gdGhlIGNvbGxpc2lvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBNYXR0ZXIgRW5naW5lIGB0aW1pbmcudGltZXN0YW1wYCB2YWx1ZSBmb3IgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIENvbGxpc2lvbiBBY3RpdmUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSBhZnRlciB0aGUgZW5naW5lIGhhcyB1cGRhdGVkLlxyXG4gKiBJdCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgYXJlIGNvbGxpZGluZyBpbiB0aGUgY3VycmVudCB0aWNrIChpZiBhbnkpLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubWF0dGVyLndvcmxkLm9uKCdjb2xsaXNpb25hY3RpdmUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNDT0xMSVNJT05fQUNUSVZFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzLkNvbGxpc2lvbkFjdGl2ZUV2ZW50fSBldmVudCAtIFRoZSBDb2xsaXNpb24gRXZlbnQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QSAtIFRoZSBmaXJzdCBib2R5IG9mIHRoZSBmaXJzdCBjb2xsaWRpbmcgcGFpci4gVGhlIGBldmVudC5wYWlyc2AgYXJyYXkgbWF5IGNvbnRhaW4gbW9yZSBjb2xsaWRpbmcgYm9kaWVzLlxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QiAtIFRoZSBzZWNvbmQgYm9keSBvZiB0aGUgZmlyc3QgY29sbGlkaW5nIHBhaXIuIFRoZSBgZXZlbnQucGFpcnNgIGFycmF5IG1heSBjb250YWluIG1vcmUgY29sbGlkaW5nIGJvZGllcy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NvbGxpc2lvbmFjdGl2ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuQ29sbGlzaW9uRW5kRXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29sbGlzaW9uRGF0YVtdfSBwYWlycyAtIEEgbGlzdCBvZiBhbGwgYWZmZWN0ZWQgcGFpcnMgaW4gdGhlIGNvbGxpc2lvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBNYXR0ZXIgRW5naW5lIGB0aW1pbmcudGltZXN0YW1wYCB2YWx1ZSBmb3IgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIENvbGxpc2lvbiBFbmQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSBhZnRlciB0aGUgZW5naW5lIGhhcyB1cGRhdGVkLlxyXG4gKiBJdCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgaGF2ZSBmaW5pc2hlZCBjb2xsaWRpbmcgaW4gdGhlIGN1cnJlbnQgdGljayAoaWYgYW55KS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignY29sbGlzaW9uZW5kJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjQ09MTElTSU9OX0VORFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5Db2xsaXNpb25FbmRFdmVudH0gZXZlbnQgLSBUaGUgQ29sbGlzaW9uIEV2ZW50IG9iamVjdC5cclxuICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keUEgLSBUaGUgZmlyc3QgYm9keSBvZiB0aGUgZmlyc3QgY29sbGlkaW5nIHBhaXIuIFRoZSBgZXZlbnQucGFpcnNgIGFycmF5IG1heSBjb250YWluIG1vcmUgY29sbGlkaW5nIGJvZGllcy5cclxuICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keUIgLSBUaGUgc2Vjb25kIGJvZHkgb2YgdGhlIGZpcnN0IGNvbGxpZGluZyBwYWlyLiBUaGUgYGV2ZW50LnBhaXJzYCBhcnJheSBtYXkgY29udGFpbiBtb3JlIGNvbGxpZGluZyBib2RpZXMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjb2xsaXNpb25lbmQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzLkNvbGxpc2lvblN0YXJ0RXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHtQaGFzZXIuVHlwZXMuUGh5c2ljcy5NYXR0ZXIuTWF0dGVyQ29sbGlzaW9uRGF0YVtdfSBwYWlycyAtIEEgbGlzdCBvZiBhbGwgYWZmZWN0ZWQgcGFpcnMgaW4gdGhlIGNvbGxpc2lvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBNYXR0ZXIgRW5naW5lIGB0aW1pbmcudGltZXN0YW1wYCB2YWx1ZSBmb3IgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIENvbGxpc2lvbiBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIE1hdHRlciBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIGFmdGVyIHRoZSBlbmdpbmUgaGFzIHVwZGF0ZWQuXHJcbiAqIEl0IHByb3ZpZGVzIGEgbGlzdCBvZiBhbGwgcGFpcnMgdGhhdCBoYXZlIHN0YXJ0ZWQgdG8gY29sbGlkZSBpbiB0aGUgY3VycmVudCB0aWNrIChpZiBhbnkpLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubWF0dGVyLndvcmxkLm9uKCdjb2xsaXNpb25zdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzI0NPTExJU0lPTl9TVEFSVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5Db2xsaXNpb25TdGFydEV2ZW50fSBldmVudCAtIFRoZSBDb2xsaXNpb24gRXZlbnQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QSAtIFRoZSBmaXJzdCBib2R5IG9mIHRoZSBmaXJzdCBjb2xsaWRpbmcgcGFpci4gVGhlIGBldmVudC5wYWlyc2AgYXJyYXkgbWF5IGNvbnRhaW4gbW9yZSBjb2xsaWRpbmcgYm9kaWVzLlxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5QiAtIFRoZSBzZWNvbmQgYm9keSBvZiB0aGUgZmlyc3QgY29sbGlkaW5nIHBhaXIuIFRoZSBgZXZlbnQucGFpcnNgIGFycmF5IG1heSBjb250YWluIG1vcmUgY29sbGlkaW5nIGJvZGllcy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NvbGxpc2lvbnN0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIERyYWcgRW5kIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2Ugd2hlbiBhIFBvaW50ZXIgQ29uc3RyYWludFxyXG4gKiBzdG9wcyBkcmFnZ2luZyBhIGJvZHkuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5tYXR0ZXIud29ybGQub24oJ2RyYWdlbmQnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNEUkFHX0VORFxyXG4gKiBAc2luY2UgMy4xNi4yXHJcbiAqIFxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5IC0gVGhlIEJvZHkgdGhhdCBoYXMgc3RvcHBlZCBiZWluZyBkcmFnZ2VkLiBUaGlzIGlzIGEgTWF0dGVyIEJvZHksIG5vdCBhIFBoYXNlciBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnR9IGNvbnN0cmFpbnQgLSBUaGUgUG9pbnRlciBDb25zdHJhaW50IHRoYXQgd2FzIGRyYWdnaW5nIHRoZSBib2R5LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZHJhZ2VuZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBNYXR0ZXIgUGh5c2ljcyBEcmFnIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2Ugd2hlbiBhIFBvaW50ZXIgQ29uc3RyYWludFxyXG4gKiBpcyBhY3RpdmVseSBkcmFnZ2luZyBhIGJvZHkuIEl0IGlzIGVtaXR0ZWQgZWFjaCB0aW1lIHRoZSBwb2ludGVyIG1vdmVzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZzogYHRoaXMubWF0dGVyLndvcmxkLm9uKCdkcmFnJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjRFJBR1xyXG4gKiBAc2luY2UgMy4xNi4yXHJcbiAqIFxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5IC0gVGhlIEJvZHkgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLiBUaGlzIGlzIGEgTWF0dGVyIEJvZHksIG5vdCBhIFBoYXNlciBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuUG9pbnRlckNvbnN0cmFpbnR9IGNvbnN0cmFpbnQgLSBUaGUgUG9pbnRlciBDb25zdHJhaW50IHRoYXQgaXMgZHJhZ2dpbmcgdGhlIGJvZHkuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkcmFnJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIERyYWcgU3RhcnQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSB3aGVuIGEgUG9pbnRlciBDb25zdHJhaW50XHJcbiAqIHN0YXJ0cyBkcmFnZ2luZyBhIGJvZHkuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5tYXR0ZXIud29ybGQub24oJ2RyYWdzdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzI0RSQUdfU1RBUlRcclxuICogQHNpbmNlIDMuMTYuMlxyXG4gKiBcclxuICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keSAtIFRoZSBCb2R5IHRoYXQgaGFzIHN0YXJ0ZWQgYmVpbmcgZHJhZ2dlZC4gVGhpcyBpcyBhIE1hdHRlciBCb2R5LCBub3QgYSBQaGFzZXIgR2FtZSBPYmplY3QuXHJcbiAqIEBwYXJhbSB7TWF0dGVySlMuQm9keVR5cGV9IHBhcnQgLSBUaGUgcGFydCBvZiB0aGUgYm9keSB0aGF0IHdhcyBjbGlja2VkIG9uLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5Qb2ludGVyQ29uc3RyYWludH0gY29uc3RyYWludCAtIFRoZSBQb2ludGVyIENvbnN0cmFpbnQgdGhhdCBpcyBkcmFnZ2luZyB0aGUgYm9keS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RyYWdzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSB3aGVuIGl0IGlzIHBhdXNlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbigncGF1c2UnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNQQVVTRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3BhdXNlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIE1hdHRlciBQaHlzaWNzIFdvcmxkIFJlc3VtZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhbiBNYXR0ZXIgUGh5c2ljcyBXb3JsZCBpbnN0YW5jZSB3aGVuIGl0IHJlc3VtZXMgZnJvbSBhIHBhdXNlZCBzdGF0ZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbigncmVzdW1lJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMjUkVTVU1FXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncmVzdW1lJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5TbGVlcEVuZEV2ZW50XHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7YW55fSBzb3VyY2UgLSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgTWF0dGVyIFBoeXNpY3MgU2xlZXAgRW5kIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgTWF0dGVyIFBoeXNpY3MgV29ybGQgaW5zdGFuY2Ugd2hlbiBhIEJvZHkgc3RvcCBzbGVlcGluZy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLm1hdHRlci53b3JsZC5vbignc2xlZXBlbmQnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNTTEVFUF9FTkRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5QaHlzaWNzLk1hdHRlci5FdmVudHMuU2xlZXBFbmRFdmVudH0gZXZlbnQgLSBUaGUgU2xlZXAgRXZlbnQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge01hdHRlckpTLkJvZHlUeXBlfSBib2R5IC0gVGhlIGJvZHkgdGhhdCBoYXMgc3RvcHBlZCBzbGVlcGluZy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3NsZWVwZW5kJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge29iamVjdH0gUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5TbGVlcFN0YXJ0RXZlbnRcclxuICpcclxuICogQHByb3BlcnR5IHthbnl9IHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudC5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBNYXR0ZXIgUGh5c2ljcyBTbGVlcCBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIE1hdHRlciBQaHlzaWNzIFdvcmxkIGluc3RhbmNlIHdoZW4gYSBCb2R5IGdvZXMgdG8gc2xlZXAuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5tYXR0ZXIud29ybGQub24oJ3NsZWVwc3RhcnQnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cyNTTEVFUF9TVEFSVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLkV2ZW50cy5TbGVlcFN0YXJ0RXZlbnR9IGV2ZW50IC0gVGhlIFNsZWVwIEV2ZW50IG9iamVjdC5cclxuICogQHBhcmFtIHtNYXR0ZXJKUy5Cb2R5VHlwZX0gYm9keSAtIFRoZSBib2R5IHRoYXQgaGFzIGdvbmUgdG8gc2xlZXAuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzbGVlcHN0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGh5c2ljcy5NYXR0ZXIuRXZlbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQUZURVJfQUREOiByZXF1aXJlKCcuL0FGVEVSX0FERF9FVkVOVCcpLFxyXG4gICAgQUZURVJfUkVNT1ZFOiByZXF1aXJlKCcuL0FGVEVSX1JFTU9WRV9FVkVOVCcpLFxyXG4gICAgQUZURVJfVVBEQVRFOiByZXF1aXJlKCcuL0FGVEVSX1VQREFURV9FVkVOVCcpLFxyXG4gICAgQkVGT1JFX0FERDogcmVxdWlyZSgnLi9CRUZPUkVfQUREX0VWRU5UJyksXHJcbiAgICBCRUZPUkVfUkVNT1ZFOiByZXF1aXJlKCcuL0JFRk9SRV9SRU1PVkVfRVZFTlQnKSxcclxuICAgIEJFRk9SRV9VUERBVEU6IHJlcXVpcmUoJy4vQkVGT1JFX1VQREFURV9FVkVOVCcpLFxyXG4gICAgQ09MTElTSU9OX0FDVElWRTogcmVxdWlyZSgnLi9DT0xMSVNJT05fQUNUSVZFX0VWRU5UJyksXHJcbiAgICBDT0xMSVNJT05fRU5EOiByZXF1aXJlKCcuL0NPTExJU0lPTl9FTkRfRVZFTlQnKSxcclxuICAgIENPTExJU0lPTl9TVEFSVDogcmVxdWlyZSgnLi9DT0xMSVNJT05fU1RBUlRfRVZFTlQnKSxcclxuICAgIERSQUdfRU5EOiByZXF1aXJlKCcuL0RSQUdfRU5EX0VWRU5UJyksXHJcbiAgICBEUkFHOiByZXF1aXJlKCcuL0RSQUdfRVZFTlQnKSxcclxuICAgIERSQUdfU1RBUlQ6IHJlcXVpcmUoJy4vRFJBR19TVEFSVF9FVkVOVCcpLFxyXG4gICAgUEFVU0U6IHJlcXVpcmUoJy4vUEFVU0VfRVZFTlQnKSxcclxuICAgIFJFU1VNRTogcmVxdWlyZSgnLi9SRVNVTUVfRVZFTlQnKSxcclxuICAgIFNMRUVQX0VORDogcmVxdWlyZSgnLi9TTEVFUF9FTkRfRVZFTlQnKSxcclxuICAgIFNMRUVQX1NUQVJUOiByZXF1aXJlKCcuL1NMRUVQX1NUQVJUX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlBoeXNpY3MuTWF0dGVyXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQm9keUJvdW5kczogcmVxdWlyZSgnLi9Cb2R5Qm91bmRzJyksXHJcbiAgICBGYWN0b3J5OiByZXF1aXJlKCcuL0ZhY3RvcnknKSxcclxuICAgIEltYWdlOiByZXF1aXJlKCcuL01hdHRlckltYWdlJyksXHJcbiAgICBNYXR0ZXI6IHJlcXVpcmUoJy4vQ3VzdG9tTWFpbicpLFxyXG4gICAgTWF0dGVyUGh5c2ljczogcmVxdWlyZSgnLi9NYXR0ZXJQaHlzaWNzJyksXHJcbiAgICBQb2x5RGVjb21wOiByZXF1aXJlKCcuL3BvbHktZGVjb21wJyksXHJcbiAgICBTcHJpdGU6IHJlcXVpcmUoJy4vTWF0dGVyU3ByaXRlJyksXHJcbiAgICBUaWxlQm9keTogcmVxdWlyZSgnLi9NYXR0ZXJUaWxlQm9keScpLFxyXG4gICAgUGh5c2ljc0VkaXRvclBhcnNlcjogcmVxdWlyZSgnLi9QaHlzaWNzRWRpdG9yUGFyc2VyJyksXHJcbiAgICBQaHlzaWNzSlNPTlBhcnNlcjogcmVxdWlyZSgnLi9QaHlzaWNzSlNPTlBhcnNlcicpLFxyXG4gICAgV29ybGQ6IHJlcXVpcmUoJy4vV29ybGQnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIFRoZSBgTWF0dGVyLkJvZHlgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGJvZHkgbW9kZWxzLlxyXG4gKiBBIGBNYXR0ZXIuQm9keWAgaXMgYSByaWdpZCBib2R5IHRoYXQgY2FuIGJlIHNpbXVsYXRlZCBieSBhIGBNYXR0ZXIuRW5naW5lYC5cclxuICogRmFjdG9yaWVzIGZvciBjb21tb25seSB1c2VkIGJvZHkgY29uZmlndXJhdGlvbnMgKHN1Y2ggYXMgcmVjdGFuZ2xlcywgY2lyY2xlcyBhbmQgb3RoZXIgcG9seWdvbnMpIGNhbiBiZSBmb3VuZCBpbiB0aGUgbW9kdWxlIGBNYXR0ZXIuQm9kaWVzYC5cclxuICpcclxuICogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cclxuICogQGNsYXNzIEJvZHlcclxuICovXHJcblxyXG52YXIgQm9keSA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCb2R5O1xyXG5cclxudmFyIFZlcnRpY2VzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvVmVydGljZXMnKTtcclxudmFyIFZlY3RvciA9IHJlcXVpcmUoJy4uL2dlb21ldHJ5L1ZlY3RvcicpO1xyXG52YXIgU2xlZXBpbmcgPSByZXF1aXJlKCcuLi9jb3JlL1NsZWVwaW5nJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBBeGVzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQXhlcycpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIEJvZHkuX2luZXJ0aWFTY2FsZSA9IDQ7XHJcbiAgICBCb2R5Ll9uZXh0Q29sbGlkaW5nR3JvdXBJZCA9IDE7XHJcbiAgICBCb2R5Ll9uZXh0Tm9uQ29sbGlkaW5nR3JvdXBJZCA9IC0xO1xyXG4gICAgQm9keS5fbmV4dENhdGVnb3J5ID0gMHgwMDAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyByaWdpZCBib2R5IG1vZGVsLiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cclxuICAgICAqIEFsbCBwcm9wZXJ0aWVzIGhhdmUgZGVmYXVsdCB2YWx1ZXMsIGFuZCBtYW55IGFyZSBwcmUtY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIG90aGVyIHByb3BlcnRpZXMuXHJcbiAgICAgKiBWZXJ0aWNlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXHJcbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBiZWxvdyBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBjcmVhdGVcclxuICAgICAqIEBwYXJhbSB7fSBvcHRpb25zXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5fSBib2R5XHJcbiAgICAgKi9cclxuICAgIEJvZHkuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xyXG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcclxuICAgICAgICAgICAgaWQ6IENvbW1vbi5uZXh0SWQoKSxcclxuICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0JvZHknLFxyXG4gICAgICAgICAgICBwYXJ0czogW10sXHJcbiAgICAgICAgICAgIHBsdWdpbjoge30sXHJcbiAgICAgICAgICAgIGFuZ2xlOiAwLFxyXG4gICAgICAgICAgICB2ZXJ0aWNlczogbnVsbCwgLy8gUGhhc2VyIGNoYW5nZTogbm8gcG9pbnQgY2FsbGluZyBmcm9tUGF0aCBpZiB0aGV5IHBhc3MgaW4gdmVydGljZXMgYW55d2F5XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcclxuICAgICAgICAgICAgZm9yY2U6IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICB0b3JxdWU6IDAsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZTogeyB4OiAwLCB5OiAwIH0sXHJcbiAgICAgICAgICAgIHByZXZpb3VzUG9zaXRpb25JbXB1bHNlOiB7IHg6IDAsIHk6IDAgfSxcclxuICAgICAgICAgICAgY29uc3RyYWludEltcHVsc2U6IHsgeDogMCwgeTogMCwgYW5nbGU6IDAgfSxcclxuICAgICAgICAgICAgdG90YWxDb250YWN0czogMCxcclxuICAgICAgICAgICAgc3BlZWQ6IDAsXHJcbiAgICAgICAgICAgIGFuZ3VsYXJTcGVlZDogMCxcclxuICAgICAgICAgICAgdmVsb2NpdHk6IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICBhbmd1bGFyVmVsb2NpdHk6IDAsXHJcbiAgICAgICAgICAgIGlzU2Vuc29yOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNTdGF0aWM6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1NsZWVwaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgbW90aW9uOiAwLFxyXG4gICAgICAgICAgICBzbGVlcFRocmVzaG9sZDogNjAsXHJcbiAgICAgICAgICAgIGRlbnNpdHk6IDAuMDAxLFxyXG4gICAgICAgICAgICByZXN0aXR1dGlvbjogMCxcclxuICAgICAgICAgICAgZnJpY3Rpb246IDAuMSxcclxuICAgICAgICAgICAgZnJpY3Rpb25TdGF0aWM6IDAuNSxcclxuICAgICAgICAgICAgZnJpY3Rpb25BaXI6IDAuMDEsXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbkZpbHRlcjoge1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk6IDB4MDAwMSxcclxuICAgICAgICAgICAgICAgIG1hc2s6IDB4RkZGRkZGRkYsXHJcbiAgICAgICAgICAgICAgICBncm91cDogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzbG9wOiAwLjA1LFxyXG4gICAgICAgICAgICB0aW1lU2NhbGU6IDEsXHJcbiAgICAgICAgICAgIGV2ZW50czogbnVsbCxcclxuICAgICAgICAgICAgYm91bmRzOiBudWxsLFxyXG4gICAgICAgICAgICBjaGFtZmVyOiBudWxsLFxyXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IDAsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uUHJldjogbnVsbCxcclxuICAgICAgICAgICAgYW5nbGVQcmV2OiAwLFxyXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIGF4ZXM6IG51bGwsXHJcbiAgICAgICAgICAgIGFyZWE6IDAsXHJcbiAgICAgICAgICAgIG1hc3M6IDAsXHJcbiAgICAgICAgICAgIGludmVyc2VNYXNzOiAwLFxyXG4gICAgICAgICAgICBpbmVydGlhOiAwLFxyXG4gICAgICAgICAgICBpbnZlcnNlSW5lcnRpYTogMCxcclxuICAgICAgICAgICAgX29yaWdpbmFsOiBudWxsLFxyXG4gICAgICAgICAgICByZW5kZXI6IHtcclxuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgc3ByaXRlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeE9mZnNldDogMCxcclxuICAgICAgICAgICAgICAgICAgICB5T2Zmc2V0OiAwXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmlsbENvbG9yOiBudWxsLCAgICAgICAgICAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiBudWxsLCAgICAgICAgICAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgICAgICBsaW5lQ29sb3I6IG51bGwsICAgICAgICAgICAgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgbGluZU9wYWNpdHk6IG51bGwsICAgICAgICAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgICAgIGxpbmVUaGlja25lc3M6IG51bGwgICAgICAgICAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGdhbWVPYmplY3Q6IG51bGwsICAgICAgICAgICAgICAgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICBzY2FsZTogeyB4OiAxLCB5OiAxIH0sICAgICAgICAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgY2VudGVyT2ZNYXNzOiB7IHg6IDAsIHk6IDAgfSwgICAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5IChmbG9hdCwgMCAtIDEpXHJcbiAgICAgICAgICAgIGNlbnRlck9mZnNldDogeyB4OiAwLCB5OiAwIH0sICAgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eSAocGl4ZWwgdmFsdWVzKVxyXG4gICAgICAgICAgICBncmF2aXR5U2NhbGU6IHsgeDogMSwgeTogMSB9LCAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgaWdub3JlR3Jhdml0eTogZmFsc2UsICAgICAgICAgICAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGlnbm9yZVBvaW50ZXI6IGZhbHNlLCAgICAgICAgICAgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICBvbkNvbGxpZGVDYWxsYmFjazogbnVsbCwgICAgICAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgb25Db2xsaWRlRW5kQ2FsbGJhY2s6IG51bGwsICAgICAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgIG9uQ29sbGlkZUFjdGl2ZUNhbGxiYWNrOiBudWxsLCAgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICBvbkNvbGxpZGVXaXRoOiB7fSAgICAgICAgICAgICAgIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Bvc2l0aW9uJykgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndmVydGljZXMnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb24gPSBWZXJ0aWNlcy5jZW50cmUob3B0aW9ucy52ZXJ0aWNlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmhhc093blByb3BlcnR5KCd2ZXJ0aWNlcycpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVmYXVsdHMudmVydGljZXMgPSBWZXJ0aWNlcy5mcm9tUGF0aCgnTCAwIDAgTCA0MCAwIEwgNDAgNDAgTCAwIDQwJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYm9keSA9IENvbW1vbi5leHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBfaW5pdFByb3BlcnRpZXMoYm9keSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vICBIZWxwZXIgZnVuY3Rpb25cclxuICAgICAgICBib2R5LnNldE9uQ29sbGlkZVdpdGggPSBmdW5jdGlvbiAoYm9keSwgY2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Db2xsaWRlV2l0aFtib2R5LmlkXSA9IGNhbGxiYWNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub25Db2xsaWRlV2l0aFtib2R5LmlkXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYm9keTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBncm91cCBpbmRleCBmb3Igd2hpY2ggYm9kaWVzIHdpbGwgY29sbGlkZS5cclxuICAgICAqIElmIGBpc05vbkNvbGxpZGluZ2AgaXMgYHRydWVgLCByZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBncm91cCBpbmRleCBmb3Igd2hpY2ggYm9kaWVzIHdpbGwgX25vdF8gY29sbGlkZS5cclxuICAgICAqIFNlZSBgYm9keS5jb2xsaXNpb25GaWx0ZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogQG1ldGhvZCBuZXh0R3JvdXBcclxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW2lzTm9uQ29sbGlkaW5nPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBVbmlxdWUgZ3JvdXAgaW5kZXhcclxuICAgICAqL1xyXG4gICAgQm9keS5uZXh0R3JvdXAgPSBmdW5jdGlvbihpc05vbkNvbGxpZGluZykge1xyXG4gICAgICAgIGlmIChpc05vbkNvbGxpZGluZylcclxuICAgICAgICAgICAgcmV0dXJuIEJvZHkuX25leHROb25Db2xsaWRpbmdHcm91cElkLS07XHJcblxyXG4gICAgICAgIHJldHVybiBCb2R5Ll9uZXh0Q29sbGlkaW5nR3JvdXBJZCsrO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG5leHQgdW5pcXVlIGNhdGVnb3J5IGJpdGZpZWxkIChzdGFydGluZyBhZnRlciB0aGUgaW5pdGlhbCBkZWZhdWx0IGNhdGVnb3J5IGAweDAwMDFgKS5cclxuICAgICAqIFRoZXJlIGFyZSAzMiBhdmFpbGFibGUuIFNlZSBgYm9keS5jb2xsaXNpb25GaWx0ZXJgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogQG1ldGhvZCBuZXh0Q2F0ZWdvcnlcclxuICAgICAqIEByZXR1cm4ge051bWJlcn0gVW5pcXVlIGNhdGVnb3J5IGJpdGZpZWxkXHJcbiAgICAgKi9cclxuICAgIEJvZHkubmV4dENhdGVnb3J5ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgQm9keS5fbmV4dENhdGVnb3J5ID0gQm9keS5fbmV4dENhdGVnb3J5IDw8IDE7XHJcbiAgICAgICAgcmV0dXJuIEJvZHkuX25leHRDYXRlZ29yeTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXNlcyBib2R5IHByb3BlcnRpZXMuXHJcbiAgICAgKiBAbWV0aG9kIF9pbml0UHJvcGVydGllc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHt9IFtvcHRpb25zXVxyXG4gICAgICovXHJcbiAgICB2YXIgX2luaXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24oYm9keSwgb3B0aW9ucykge1xyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgICAgICAvLyBpbml0IHJlcXVpcmVkIHByb3BlcnRpZXMgKG9yZGVyIGlzIGltcG9ydGFudClcclxuICAgICAgICBCb2R5LnNldChib2R5LCB7XHJcbiAgICAgICAgICAgIGJvdW5kczogYm9keS5ib3VuZHMgfHwgQm91bmRzLmNyZWF0ZShib2R5LnZlcnRpY2VzKSxcclxuICAgICAgICAgICAgcG9zaXRpb25QcmV2OiBib2R5LnBvc2l0aW9uUHJldiB8fCBWZWN0b3IuY2xvbmUoYm9keS5wb3NpdGlvbiksXHJcbiAgICAgICAgICAgIGFuZ2xlUHJldjogYm9keS5hbmdsZVByZXYgfHwgYm9keS5hbmdsZSxcclxuICAgICAgICAgICAgdmVydGljZXM6IGJvZHkudmVydGljZXMsXHJcbiAgICAgICAgICAgIHBhcnRzOiBib2R5LnBhcnRzIHx8IFtib2R5XSxcclxuICAgICAgICAgICAgaXNTdGF0aWM6IGJvZHkuaXNTdGF0aWMsXHJcbiAgICAgICAgICAgIGlzU2xlZXBpbmc6IGJvZHkuaXNTbGVlcGluZyxcclxuICAgICAgICAgICAgcGFyZW50OiBib2R5LnBhcmVudCB8fCBib2R5XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciBib3VuZHMgPSBib2R5LmJvdW5kcztcclxuXHJcbiAgICAgICAgVmVydGljZXMucm90YXRlKGJvZHkudmVydGljZXMsIGJvZHkuYW5nbGUsIGJvZHkucG9zaXRpb24pO1xyXG4gICAgICAgIEF4ZXMucm90YXRlKGJvZHkuYXhlcywgYm9keS5hbmdsZSk7XHJcbiAgICAgICAgQm91bmRzLnVwZGF0ZShib3VuZHMsIGJvZHkudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xyXG5cclxuICAgICAgICAvLyBhbGxvdyBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgcHJvcGVydGllc1xyXG4gICAgICAgIEJvZHkuc2V0KGJvZHksIHtcclxuICAgICAgICAgICAgYXhlczogb3B0aW9ucy5heGVzIHx8IGJvZHkuYXhlcyxcclxuICAgICAgICAgICAgYXJlYTogb3B0aW9ucy5hcmVhIHx8IGJvZHkuYXJlYSxcclxuICAgICAgICAgICAgbWFzczogb3B0aW9ucy5tYXNzIHx8IGJvZHkubWFzcyxcclxuICAgICAgICAgICAgaW5lcnRpYTogb3B0aW9ucy5pbmVydGlhIHx8IGJvZHkuaW5lcnRpYVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoYm9keS5wYXJ0cy5sZW5ndGggPT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2VudGVyT2ZNYXNzID0gYm9keS5jZW50ZXJPZk1hc3M7XHJcbiAgICAgICAgICAgIHZhciBjZW50ZXJPZmZzZXQgPSBib2R5LmNlbnRlck9mZnNldDtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgYm9keVdpZHRoID0gYm91bmRzLm1heC54IC0gYm91bmRzLm1pbi54O1xyXG4gICAgICAgICAgICB2YXIgYm9keUhlaWdodCA9IGJvdW5kcy5tYXgueSAtIGJvdW5kcy5taW4ueTtcclxuICAgIFxyXG4gICAgICAgICAgICBjZW50ZXJPZk1hc3MueCA9IC0oYm91bmRzLm1pbi54IC0gYm9keS5wb3NpdGlvbi54KSAvIGJvZHlXaWR0aDtcclxuICAgICAgICAgICAgY2VudGVyT2ZNYXNzLnkgPSAtKGJvdW5kcy5taW4ueSAtIGJvZHkucG9zaXRpb24ueSkgLyBib2R5SGVpZ2h0O1xyXG4gICAgXHJcbiAgICAgICAgICAgIGNlbnRlck9mZnNldC54ID0gYm9keVdpZHRoICogY2VudGVyT2ZNYXNzLng7XHJcbiAgICAgICAgICAgIGNlbnRlck9mZnNldC55ID0gYm9keUhlaWdodCAqIGNlbnRlck9mTWFzcy55O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIHByb3BlcnR5IGFuZCBhIHZhbHVlIChvciBtYXAgb2YpLCBzZXRzIHRoZSBwcm9wZXJ0eShzKSBvbiB0aGUgYm9keSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHNldHRlciBmdW5jdGlvbnMgaWYgdGhleSBleGlzdC5cclxuICAgICAqIFByZWZlciB0byB1c2UgdGhlIGFjdHVhbCBzZXR0ZXIgZnVuY3Rpb25zIGluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNpdHVhdGlvbnMuXHJcbiAgICAgKiBAbWV0aG9kIHNldFxyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKiBAcGFyYW0ge30gc2V0dGluZ3MgQSBwcm9wZXJ0eSBuYW1lIChvciBtYXAgb2YgcHJvcGVydGllcyBhbmQgdmFsdWVzKSB0byBzZXQgb24gdGhlIGJvZHkuXHJcbiAgICAgKiBAcGFyYW0ge30gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBpZiBgc2V0dGluZ3NgIGlzIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUuXHJcbiAgICAgKi9cclxuICAgIEJvZHkuc2V0ID0gZnVuY3Rpb24oYm9keSwgc2V0dGluZ3MsIHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHByb3BlcnR5O1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHNldHRpbmdzO1xyXG4gICAgICAgICAgICBzZXR0aW5ncyA9IHt9O1xyXG4gICAgICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAocHJvcGVydHkgaW4gc2V0dGluZ3MpIHtcclxuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIHByb3BlcnR5KSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgdmFsdWUgPSBzZXR0aW5nc1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ2lzU3RhdGljJzpcclxuICAgICAgICAgICAgICAgIEJvZHkuc2V0U3RhdGljKGJvZHksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdpc1NsZWVwaW5nJzpcclxuICAgICAgICAgICAgICAgIFNsZWVwaW5nLnNldChib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbWFzcyc6XHJcbiAgICAgICAgICAgICAgICBCb2R5LnNldE1hc3MoYm9keSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RlbnNpdHknOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXREZW5zaXR5KGJvZHksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdpbmVydGlhJzpcclxuICAgICAgICAgICAgICAgIEJvZHkuc2V0SW5lcnRpYShib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndmVydGljZXMnOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRWZXJ0aWNlcyhib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncG9zaXRpb24nOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRQb3NpdGlvbihib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYW5nbGUnOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRBbmdsZShib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndmVsb2NpdHknOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRWZWxvY2l0eShib2R5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYW5ndWxhclZlbG9jaXR5JzpcclxuICAgICAgICAgICAgICAgIEJvZHkuc2V0QW5ndWxhclZlbG9jaXR5KGJvZHksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdwYXJ0cyc6XHJcbiAgICAgICAgICAgICAgICBCb2R5LnNldFBhcnRzKGJvZHksIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdjZW50cmUnOlxyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRDZW50cmUoYm9keSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBib2R5W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGJvZHkgYXMgc3RhdGljLCBpbmNsdWRpbmcgaXNTdGF0aWMgZmxhZyBhbmQgc2V0dGluZyBtYXNzIGFuZCBpbmVydGlhIHRvIEluZmluaXR5LlxyXG4gICAgICogQG1ldGhvZCBzZXRTdGF0aWNcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHtib29sfSBpc1N0YXRpY1xyXG4gICAgICovXHJcbiAgICBCb2R5LnNldFN0YXRpYyA9IGZ1bmN0aW9uKGJvZHksIGlzU3RhdGljKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5LnBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gYm9keS5wYXJ0c1tpXTtcclxuICAgICAgICAgICAgcGFydC5pc1N0YXRpYyA9IGlzU3RhdGljO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzU3RhdGljKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0Ll9vcmlnaW5hbCA9IHtcclxuICAgICAgICAgICAgICAgICAgICByZXN0aXR1dGlvbjogcGFydC5yZXN0aXR1dGlvbixcclxuICAgICAgICAgICAgICAgICAgICBmcmljdGlvbjogcGFydC5mcmljdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBtYXNzOiBwYXJ0Lm1hc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5lcnRpYTogcGFydC5pbmVydGlhLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbnNpdHk6IHBhcnQuZGVuc2l0eSxcclxuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlTWFzczogcGFydC5pbnZlcnNlTWFzcyxcclxuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSW5lcnRpYTogcGFydC5pbnZlcnNlSW5lcnRpYVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJ0LnJlc3RpdHV0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcnQuZnJpY3Rpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgcGFydC5tYXNzID0gcGFydC5pbmVydGlhID0gcGFydC5kZW5zaXR5ID0gSW5maW5pdHk7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LmludmVyc2VNYXNzID0gcGFydC5pbnZlcnNlSW5lcnRpYSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvblByZXYueCA9IHBhcnQucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgIHBhcnQucG9zaXRpb25QcmV2LnkgPSBwYXJ0LnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LmFuZ2xlUHJldiA9IHBhcnQuYW5nbGU7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LmFuZ3VsYXJWZWxvY2l0eSA9IDA7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LnNwZWVkID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcnQuYW5ndWxhclNwZWVkID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcnQubW90aW9uID0gMDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0Ll9vcmlnaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgcGFydC5yZXN0aXR1dGlvbiA9IHBhcnQuX29yaWdpbmFsLnJlc3RpdHV0aW9uO1xyXG4gICAgICAgICAgICAgICAgcGFydC5mcmljdGlvbiA9IHBhcnQuX29yaWdpbmFsLmZyaWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgcGFydC5tYXNzID0gcGFydC5fb3JpZ2luYWwubWFzcztcclxuICAgICAgICAgICAgICAgIHBhcnQuaW5lcnRpYSA9IHBhcnQuX29yaWdpbmFsLmluZXJ0aWE7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LmRlbnNpdHkgPSBwYXJ0Ll9vcmlnaW5hbC5kZW5zaXR5O1xyXG4gICAgICAgICAgICAgICAgcGFydC5pbnZlcnNlTWFzcyA9IHBhcnQuX29yaWdpbmFsLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgcGFydC5pbnZlcnNlSW5lcnRpYSA9IHBhcnQuX29yaWdpbmFsLmludmVyc2VJbmVydGlhO1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcnQuX29yaWdpbmFsID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtYXNzIG9mIHRoZSBib2R5LiBJbnZlcnNlIG1hc3MsIGRlbnNpdHkgYW5kIGluZXJ0aWEgYXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBjaGFuZ2UuXHJcbiAgICAgKiBAbWV0aG9kIHNldE1hc3NcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1hc3NcclxuICAgICAqL1xyXG4gICAgQm9keS5zZXRNYXNzID0gZnVuY3Rpb24oYm9keSwgbWFzcykge1xyXG4gICAgICAgIHZhciBtb21lbnQgPSBib2R5LmluZXJ0aWEgLyAoYm9keS5tYXNzIC8gNik7XHJcbiAgICAgICAgYm9keS5pbmVydGlhID0gbW9tZW50ICogKG1hc3MgLyA2KTtcclxuICAgICAgICBib2R5LmludmVyc2VJbmVydGlhID0gMSAvIGJvZHkuaW5lcnRpYTtcclxuXHJcbiAgICAgICAgYm9keS5tYXNzID0gbWFzcztcclxuICAgICAgICBib2R5LmludmVyc2VNYXNzID0gMSAvIGJvZHkubWFzcztcclxuICAgICAgICBib2R5LmRlbnNpdHkgPSBib2R5Lm1hc3MgLyBib2R5LmFyZWE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGVuc2l0eSBvZiB0aGUgYm9keS4gTWFzcyBhbmQgaW5lcnRpYSBhcmUgYXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS5cclxuICAgICAqIEBtZXRob2Qgc2V0RGVuc2l0eVxyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVuc2l0eVxyXG4gICAgICovXHJcbiAgICBCb2R5LnNldERlbnNpdHkgPSBmdW5jdGlvbihib2R5LCBkZW5zaXR5KSB7XHJcbiAgICAgICAgQm9keS5zZXRNYXNzKGJvZHksIGRlbnNpdHkgKiBib2R5LmFyZWEpO1xyXG4gICAgICAgIGJvZHkuZGVuc2l0eSA9IGRlbnNpdHk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbW9tZW50IG9mIGluZXJ0aWEgKGkuZS4gc2Vjb25kIG1vbWVudCBvZiBhcmVhKSBvZiB0aGUgYm9keS4gXHJcbiAgICAgKiBJbnZlcnNlIGluZXJ0aWEgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4gTWFzcyBpcyBub3QgY2hhbmdlZC5cclxuICAgICAqIEBtZXRob2Qgc2V0SW5lcnRpYVxyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5lcnRpYVxyXG4gICAgICovXHJcbiAgICBCb2R5LnNldEluZXJ0aWEgPSBmdW5jdGlvbihib2R5LCBpbmVydGlhKSB7XHJcbiAgICAgICAgYm9keS5pbmVydGlhID0gaW5lcnRpYTtcclxuICAgICAgICBib2R5LmludmVyc2VJbmVydGlhID0gMSAvIGJvZHkuaW5lcnRpYTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib2R5J3MgdmVydGljZXMgYW5kIHVwZGF0ZXMgYm9keSBwcm9wZXJ0aWVzIGFjY29yZGluZ2x5LCBpbmNsdWRpbmcgaW5lcnRpYSwgYXJlYSBhbmQgbWFzcyAod2l0aCByZXNwZWN0IHRvIGBib2R5LmRlbnNpdHlgKS5cclxuICAgICAqIFZlcnRpY2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBiZSBvcmllbnRhdGVkIGFyb3VuZCB0aGVpciBjZW50cmUgb2YgbWFzcyBhcyB0aGUgb3JpZ2luLlxyXG4gICAgICogVGhleSBhcmUgdGhlbiBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgdG8gd29ybGQgc3BhY2UgYmFzZWQgb24gYGJvZHkucG9zaXRpb25gLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBgdmVydGljZXNgIGFyZ3VtZW50IHNob3VsZCBiZSBwYXNzZWQgYXMgYW4gYXJyYXkgb2YgYE1hdHRlci5WZWN0b3JgIHBvaW50cyAob3IgYSBgTWF0dGVyLlZlcnRpY2VzYCBhcnJheSkuXHJcbiAgICAgKiBWZXJ0aWNlcyBtdXN0IGZvcm0gYSBjb252ZXggaHVsbCwgY29uY2F2ZSBodWxscyBhcmUgbm90IHN1cHBvcnRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIHNldFZlcnRpY2VzXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yW119IHZlcnRpY2VzXHJcbiAgICAgKi9cclxuICAgIEJvZHkuc2V0VmVydGljZXMgPSBmdW5jdGlvbihib2R5LCB2ZXJ0aWNlcykge1xyXG4gICAgICAgIC8vIGNoYW5nZSB2ZXJ0aWNlc1xyXG4gICAgICAgIGlmICh2ZXJ0aWNlc1swXS5ib2R5ID09PSBib2R5KSB7XHJcbiAgICAgICAgICAgIGJvZHkudmVydGljZXMgPSB2ZXJ0aWNlcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBib2R5LnZlcnRpY2VzID0gVmVydGljZXMuY3JlYXRlKHZlcnRpY2VzLCBib2R5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgYm9keS5heGVzID0gQXhlcy5mcm9tVmVydGljZXMoYm9keS52ZXJ0aWNlcyk7XHJcbiAgICAgICAgYm9keS5hcmVhID0gVmVydGljZXMuYXJlYShib2R5LnZlcnRpY2VzKTtcclxuICAgICAgICBCb2R5LnNldE1hc3MoYm9keSwgYm9keS5kZW5zaXR5ICogYm9keS5hcmVhKTtcclxuXHJcbiAgICAgICAgLy8gb3JpZW50IHZlcnRpY2VzIGFyb3VuZCB0aGUgY2VudHJlIG9mIG1hc3MgYXQgb3JpZ2luICgwLCAwKVxyXG4gICAgICAgIHZhciBjZW50cmUgPSBWZXJ0aWNlcy5jZW50cmUoYm9keS52ZXJ0aWNlcyk7XHJcbiAgICAgICAgVmVydGljZXMudHJhbnNsYXRlKGJvZHkudmVydGljZXMsIGNlbnRyZSwgLTEpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgaW5lcnRpYSB3aGlsZSB2ZXJ0aWNlcyBhcmUgYXQgb3JpZ2luICgwLCAwKVxyXG4gICAgICAgIEJvZHkuc2V0SW5lcnRpYShib2R5LCBCb2R5Ll9pbmVydGlhU2NhbGUgKiBWZXJ0aWNlcy5pbmVydGlhKGJvZHkudmVydGljZXMsIGJvZHkubWFzcykpO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgZ2VvbWV0cnlcclxuICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUoYm9keS52ZXJ0aWNlcywgYm9keS5wb3NpdGlvbik7XHJcblxyXG4gICAgICAgIEJvdW5kcy51cGRhdGUoYm9keS5ib3VuZHMsIGJvZHkudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBhcnRzIG9mIHRoZSBgYm9keWAgYW5kIHVwZGF0ZXMgbWFzcywgaW5lcnRpYSBhbmQgY2VudHJvaWQuXHJcbiAgICAgKiBFYWNoIHBhcnQgd2lsbCBoYXZlIGl0cyBwYXJlbnQgc2V0IHRvIGBib2R5YC5cclxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNvbnZleCBodWxsIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZCBhbmQgc2V0IG9uIGBib2R5YCwgdW5sZXNzIGBhdXRvSHVsbGAgaXMgc2V0IHRvIGBmYWxzZS5gXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgcGFydCBpbiBgYm9keS5wYXJ0c2Agd2lsbCBhbHdheXMgYmUgdGhlIGBib2R5YC5cclxuICAgICAqIEBtZXRob2Qgc2V0UGFydHNcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIFtib2R5XSBwYXJ0c1xyXG4gICAgICogQHBhcmFtIHtib29sfSBbYXV0b0h1bGw9dHJ1ZV1cclxuICAgICAqL1xyXG4gICAgQm9keS5zZXRQYXJ0cyA9IGZ1bmN0aW9uKGJvZHksIHBhcnRzLCBhdXRvSHVsbCkge1xyXG4gICAgICAgIHZhciBpO1xyXG5cclxuICAgICAgICAvLyBhZGQgYWxsIHRoZSBwYXJ0cywgZW5zdXJpbmcgdGhhdCB0aGUgZmlyc3QgcGFydCBpcyBhbHdheXMgdGhlIHBhcmVudCBib2R5XHJcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgwKTtcclxuICAgICAgICBib2R5LnBhcnRzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgYm9keS5wYXJ0cy5wdXNoKGJvZHkpO1xyXG4gICAgICAgIGJvZHkucGFyZW50ID0gYm9keTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSBib2R5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LnBhcmVudCA9IGJvZHk7XHJcbiAgICAgICAgICAgICAgICBib2R5LnBhcnRzLnB1c2gocGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChib2R5LnBhcnRzLmxlbmd0aCA9PT0gMSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBhdXRvSHVsbCA9IHR5cGVvZiBhdXRvSHVsbCAhPT0gJ3VuZGVmaW5lZCcgPyBhdXRvSHVsbCA6IHRydWU7XHJcblxyXG4gICAgICAgIC8vIGZpbmQgdGhlIGNvbnZleCBodWxsIG9mIGFsbCBwYXJ0cyB0byBzZXQgb24gdGhlIHBhcmVudCBib2R5XHJcbiAgICAgICAgaWYgKGF1dG9IdWxsKSB7XHJcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KHBhcnRzW2ldLnZlcnRpY2VzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgVmVydGljZXMuY2xvY2t3aXNlU29ydCh2ZXJ0aWNlcyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgaHVsbCA9IFZlcnRpY2VzLmh1bGwodmVydGljZXMpLFxyXG4gICAgICAgICAgICAgICAgaHVsbENlbnRyZSA9IFZlcnRpY2VzLmNlbnRyZShodWxsKTtcclxuXHJcbiAgICAgICAgICAgIEJvZHkuc2V0VmVydGljZXMoYm9keSwgaHVsbCk7XHJcbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShib2R5LnZlcnRpY2VzLCBodWxsQ2VudHJlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHN1bSB0aGUgcHJvcGVydGllcyBvZiBhbGwgY29tcG91bmQgcGFydHMgb2YgdGhlIHBhcmVudCBib2R5XHJcbiAgICAgICAgdmFyIHRvdGFsID0gQm9keS5fdG90YWxQcm9wZXJ0aWVzKGJvZHkpO1xyXG5cclxuICAgICAgICAvLyAgUGhhc2VyIGFkZGl0aW9uXHJcbiAgICAgICAgdmFyIGN4ID0gdG90YWwuY2VudHJlLng7XHJcbiAgICAgICAgdmFyIGN5ID0gdG90YWwuY2VudHJlLnk7XHJcblxyXG4gICAgICAgIHZhciBib3VuZHMgPSBib2R5LmJvdW5kcztcclxuICAgICAgICB2YXIgY2VudGVyT2ZNYXNzID0gYm9keS5jZW50ZXJPZk1hc3M7XHJcbiAgICAgICAgdmFyIGNlbnRlck9mZnNldCA9IGJvZHkuY2VudGVyT2Zmc2V0O1xyXG5cclxuICAgICAgICBCb3VuZHMudXBkYXRlKGJvdW5kcywgYm9keS52ZXJ0aWNlcywgYm9keS52ZWxvY2l0eSk7XHJcblxyXG4gICAgICAgIGNlbnRlck9mTWFzcy54ID0gLShib3VuZHMubWluLnggLSBjeCkgLyAoYm91bmRzLm1heC54IC0gYm91bmRzLm1pbi54KTtcclxuICAgICAgICBjZW50ZXJPZk1hc3MueSA9IC0oYm91bmRzLm1pbi55IC0gY3kpIC8gKGJvdW5kcy5tYXgueSAtIGJvdW5kcy5taW4ueSk7XHJcblxyXG4gICAgICAgIGNlbnRlck9mZnNldC54ID0gY3g7XHJcbiAgICAgICAgY2VudGVyT2Zmc2V0LnkgPSBjeTtcclxuXHJcbiAgICAgICAgYm9keS5hcmVhID0gdG90YWwuYXJlYTtcclxuICAgICAgICBib2R5LnBhcmVudCA9IGJvZHk7XHJcbiAgICAgICAgYm9keS5wb3NpdGlvbi54ID0gY3g7XHJcbiAgICAgICAgYm9keS5wb3NpdGlvbi55ID0gY3k7XHJcbiAgICAgICAgYm9keS5wb3NpdGlvblByZXYueCA9IGN4O1xyXG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnkgPSBjeTtcclxuXHJcbiAgICAgICAgQm9keS5zZXRNYXNzKGJvZHksIHRvdGFsLm1hc3MpO1xyXG4gICAgICAgIEJvZHkuc2V0SW5lcnRpYShib2R5LCB0b3RhbC5pbmVydGlhKTtcclxuICAgICAgICBCb2R5LnNldFBvc2l0aW9uKGJvZHksIHRvdGFsLmNlbnRyZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjZW50cmUgb2YgbWFzcyBvZiB0aGUgYm9keS4gXHJcbiAgICAgKiBUaGUgYGNlbnRyZWAgaXMgYSB2ZWN0b3IgaW4gd29ybGQtc3BhY2UgdW5sZXNzIGByZWxhdGl2ZWAgaXMgc2V0LCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgdHJhbnNsYXRpb24uXHJcbiAgICAgKiBUaGUgY2VudHJlIG9mIG1hc3MgaXMgdGhlIHBvaW50IHRoZSBib2R5IHJvdGF0ZXMgYWJvdXQgYW5kIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIG5vbi11bmlmb3JtIGRlbnNpdHkuXHJcbiAgICAgKiBUaGlzIGlzIGVxdWFsIHRvIG1vdmluZyBgYm9keS5wb3NpdGlvbmAgYnV0IG5vdCB0aGUgYGJvZHkudmVydGljZXNgLlxyXG4gICAgICogSW52YWxpZCBpZiB0aGUgYGNlbnRyZWAgZmFsbHMgb3V0c2lkZSB0aGUgYm9keSdzIGNvbnZleCBodWxsLlxyXG4gICAgICogQG1ldGhvZCBzZXRDZW50cmVcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IGNlbnRyZVxyXG4gICAgICogQHBhcmFtIHtib29sfSByZWxhdGl2ZVxyXG4gICAgICovXHJcbiAgICBCb2R5LnNldENlbnRyZSA9IGZ1bmN0aW9uKGJvZHksIGNlbnRyZSwgcmVsYXRpdmUpIHtcclxuICAgICAgICBpZiAoIXJlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggPSBjZW50cmUueCAtIChib2R5LnBvc2l0aW9uLnggLSBib2R5LnBvc2l0aW9uUHJldi54KTtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSA9IGNlbnRyZS55IC0gKGJvZHkucG9zaXRpb24ueSAtIGJvZHkucG9zaXRpb25QcmV2LnkpO1xyXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uLnggPSBjZW50cmUueDtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvbi55ID0gY2VudHJlLnk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvblByZXYueCArPSBjZW50cmUueDtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSArPSBjZW50cmUueTtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvbi54ICs9IGNlbnRyZS54O1xyXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uLnkgKz0gY2VudHJlLnk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBib2R5IGluc3RhbnRseS4gVmVsb2NpdHksIGFuZ2xlLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuXHJcbiAgICAgKiBAbWV0aG9kIHNldFBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb3NpdGlvblxyXG4gICAgICovXHJcbiAgICBCb2R5LnNldFBvc2l0aW9uID0gZnVuY3Rpb24oYm9keSwgcG9zaXRpb24pIHtcclxuICAgICAgICB2YXIgZGVsdGEgPSBWZWN0b3Iuc3ViKHBvc2l0aW9uLCBib2R5LnBvc2l0aW9uKTtcclxuICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ICs9IGRlbHRhLng7XHJcbiAgICAgICAgYm9keS5wb3NpdGlvblByZXYueSArPSBkZWx0YS55O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZHkucGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2ldO1xyXG4gICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnggKz0gZGVsdGEueDtcclxuICAgICAgICAgICAgcGFydC5wb3NpdGlvbi55ICs9IGRlbHRhLnk7XHJcbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBkZWx0YSk7XHJcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbmdsZSBvZiB0aGUgYm9keSBpbnN0YW50bHkuIEFuZ3VsYXIgdmVsb2NpdHksIHBvc2l0aW9uLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuXHJcbiAgICAgKiBAbWV0aG9kIHNldEFuZ2xlXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZVxyXG4gICAgICovXHJcbiAgICBCb2R5LnNldEFuZ2xlID0gZnVuY3Rpb24oYm9keSwgYW5nbGUpIHtcclxuICAgICAgICB2YXIgZGVsdGEgPSBhbmdsZSAtIGJvZHkuYW5nbGU7XHJcbiAgICAgICAgYm9keS5hbmdsZVByZXYgKz0gZGVsdGE7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV07XHJcbiAgICAgICAgICAgIHBhcnQuYW5nbGUgKz0gZGVsdGE7XHJcbiAgICAgICAgICAgIFZlcnRpY2VzLnJvdGF0ZShwYXJ0LnZlcnRpY2VzLCBkZWx0YSwgYm9keS5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgIEF4ZXMucm90YXRlKHBhcnQuYXhlcywgZGVsdGEpO1xyXG4gICAgICAgICAgICBCb3VuZHMudXBkYXRlKHBhcnQuYm91bmRzLCBwYXJ0LnZlcnRpY2VzLCBib2R5LnZlbG9jaXR5KTtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBWZWN0b3Iucm90YXRlQWJvdXQocGFydC5wb3NpdGlvbiwgZGVsdGEsIGJvZHkucG9zaXRpb24sIHBhcnQucG9zaXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxpbmVhciB2ZWxvY2l0eSBvZiB0aGUgYm9keSBpbnN0YW50bHkuIFBvc2l0aW9uLCBhbmdsZSwgZm9yY2UgZXRjLiBhcmUgdW5jaGFuZ2VkLiBTZWUgYWxzbyBgQm9keS5hcHBseUZvcmNlYC5cclxuICAgICAqIEBtZXRob2Qgc2V0VmVsb2NpdHlcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlbG9jaXR5XHJcbiAgICAgKi9cclxuICAgIEJvZHkuc2V0VmVsb2NpdHkgPSBmdW5jdGlvbihib2R5LCB2ZWxvY2l0eSkge1xyXG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnggPSBib2R5LnBvc2l0aW9uLnggLSB2ZWxvY2l0eS54O1xyXG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnkgPSBib2R5LnBvc2l0aW9uLnkgLSB2ZWxvY2l0eS55O1xyXG4gICAgICAgIGJvZHkudmVsb2NpdHkueCA9IHZlbG9jaXR5Lng7XHJcbiAgICAgICAgYm9keS52ZWxvY2l0eS55ID0gdmVsb2NpdHkueTtcclxuICAgICAgICBib2R5LnNwZWVkID0gVmVjdG9yLm1hZ25pdHVkZShib2R5LnZlbG9jaXR5KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhbmd1bGFyIHZlbG9jaXR5IG9mIHRoZSBib2R5IGluc3RhbnRseS4gUG9zaXRpb24sIGFuZ2xlLCBmb3JjZSBldGMuIGFyZSB1bmNoYW5nZWQuIFNlZSBhbHNvIGBCb2R5LmFwcGx5Rm9yY2VgLlxyXG4gICAgICogQG1ldGhvZCBzZXRBbmd1bGFyVmVsb2NpdHlcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5XHJcbiAgICAgKi9cclxuICAgIEJvZHkuc2V0QW5ndWxhclZlbG9jaXR5ID0gZnVuY3Rpb24oYm9keSwgdmVsb2NpdHkpIHtcclxuICAgICAgICBib2R5LmFuZ2xlUHJldiA9IGJvZHkuYW5nbGUgLSB2ZWxvY2l0eTtcclxuICAgICAgICBib2R5LmFuZ3VsYXJWZWxvY2l0eSA9IHZlbG9jaXR5O1xyXG4gICAgICAgIGJvZHkuYW5ndWxhclNwZWVkID0gTWF0aC5hYnMoYm9keS5hbmd1bGFyVmVsb2NpdHkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIGEgYm9keSBieSBhIGdpdmVuIHZlY3RvciByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBwb3NpdGlvbiwgd2l0aG91dCBpbXBhcnRpbmcgYW55IHZlbG9jaXR5LlxyXG4gICAgICogQG1ldGhvZCB0cmFuc2xhdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHRyYW5zbGF0aW9uXHJcbiAgICAgKi9cclxuICAgIEJvZHkudHJhbnNsYXRlID0gZnVuY3Rpb24oYm9keSwgdHJhbnNsYXRpb24pIHtcclxuICAgICAgICBCb2R5LnNldFBvc2l0aW9uKGJvZHksIFZlY3Rvci5hZGQoYm9keS5wb3NpdGlvbiwgdHJhbnNsYXRpb24pKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIGEgYm9keSBieSBhIGdpdmVuIGFuZ2xlIHJlbGF0aXZlIHRvIGl0cyBjdXJyZW50IGFuZ2xlLCB3aXRob3V0IGltcGFydGluZyBhbnkgYW5ndWxhciB2ZWxvY2l0eS5cclxuICAgICAqIEBtZXRob2Qgcm90YXRlXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvblxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtwb2ludF1cclxuICAgICAqL1xyXG4gICAgQm9keS5yb3RhdGUgPSBmdW5jdGlvbihib2R5LCByb3RhdGlvbiwgcG9pbnQpIHtcclxuICAgICAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgICAgICAgIEJvZHkuc2V0QW5nbGUoYm9keSwgYm9keS5hbmdsZSArIHJvdGF0aW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgY29zID0gTWF0aC5jb3Mocm90YXRpb24pLFxyXG4gICAgICAgICAgICAgICAgc2luID0gTWF0aC5zaW4ocm90YXRpb24pLFxyXG4gICAgICAgICAgICAgICAgZHggPSBib2R5LnBvc2l0aW9uLnggLSBwb2ludC54LFxyXG4gICAgICAgICAgICAgICAgZHkgPSBib2R5LnBvc2l0aW9uLnkgLSBwb2ludC55O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwge1xyXG4gICAgICAgICAgICAgICAgeDogcG9pbnQueCArIChkeCAqIGNvcyAtIGR5ICogc2luKSxcclxuICAgICAgICAgICAgICAgIHk6IHBvaW50LnkgKyAoZHggKiBzaW4gKyBkeSAqIGNvcylcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LnNldEFuZ2xlKGJvZHksIGJvZHkuYW5nbGUgKyByb3RhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlcyB0aGUgYm9keSwgaW5jbHVkaW5nIHVwZGF0aW5nIHBoeXNpY2FsIHByb3BlcnRpZXMgKG1hc3MsIGFyZWEsIGF4ZXMsIGluZXJ0aWEpLCBmcm9tIGEgd29ybGQtc3BhY2UgcG9pbnQgKGRlZmF1bHQgaXMgYm9keSBjZW50cmUpLlxyXG4gICAgICogQG1ldGhvZCBzY2FsZVxyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVYXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gW3BvaW50XVxyXG4gICAgICovXHJcbiAgICBCb2R5LnNjYWxlID0gZnVuY3Rpb24oYm9keSwgc2NhbGVYLCBzY2FsZVksIHBvaW50KSB7XHJcbiAgICAgICAgdmFyIHRvdGFsQXJlYSA9IDAsXHJcbiAgICAgICAgICAgIHRvdGFsSW5lcnRpYSA9IDA7XHJcblxyXG4gICAgICAgIHBvaW50ID0gcG9pbnQgfHwgYm9keS5wb3NpdGlvbjtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2R5LnBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gYm9keS5wYXJ0c1tpXTtcclxuXHJcbiAgICAgICAgICAgIHBhcnQuc2NhbGUueCA9IHNjYWxlWDtcclxuICAgICAgICAgICAgcGFydC5zY2FsZS55ID0gc2NhbGVZO1xyXG5cclxuICAgICAgICAgICAgLy8gc2NhbGUgdmVydGljZXNcclxuICAgICAgICAgICAgVmVydGljZXMuc2NhbGUocGFydC52ZXJ0aWNlcywgc2NhbGVYLCBzY2FsZVksIHBvaW50KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIHBhcnQuYXhlcyA9IEF4ZXMuZnJvbVZlcnRpY2VzKHBhcnQudmVydGljZXMpO1xyXG4gICAgICAgICAgICBwYXJ0LmFyZWEgPSBWZXJ0aWNlcy5hcmVhKHBhcnQudmVydGljZXMpO1xyXG4gICAgICAgICAgICBCb2R5LnNldE1hc3MocGFydCwgYm9keS5kZW5zaXR5ICogcGFydC5hcmVhKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBpbmVydGlhIChyZXF1aXJlcyB2ZXJ0aWNlcyB0byBiZSBhdCBvcmlnaW4pXHJcbiAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCB7IHg6IC1wYXJ0LnBvc2l0aW9uLngsIHk6IC1wYXJ0LnBvc2l0aW9uLnkgfSk7XHJcbiAgICAgICAgICAgIEJvZHkuc2V0SW5lcnRpYShwYXJ0LCBCb2R5Ll9pbmVydGlhU2NhbGUgKiBWZXJ0aWNlcy5pbmVydGlhKHBhcnQudmVydGljZXMsIHBhcnQubWFzcykpO1xyXG4gICAgICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUocGFydC52ZXJ0aWNlcywgeyB4OiBwYXJ0LnBvc2l0aW9uLngsIHk6IHBhcnQucG9zaXRpb24ueSB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdG90YWxBcmVhICs9IHBhcnQuYXJlYTtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW5lcnRpYSArPSBwYXJ0LmluZXJ0aWE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNjYWxlIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueCA9IHBvaW50LnggKyAocGFydC5wb3NpdGlvbi54IC0gcG9pbnQueCkgKiBzY2FsZVg7XHJcbiAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueSA9IHBvaW50LnkgKyAocGFydC5wb3NpdGlvbi55IC0gcG9pbnQueSkgKiBzY2FsZVk7XHJcblxyXG4gICAgICAgICAgICAvLyB1cGRhdGUgYm91bmRzXHJcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaGFuZGxlIHBhcmVudCBib2R5XHJcbiAgICAgICAgaWYgKGJvZHkucGFydHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBib2R5LmFyZWEgPSB0b3RhbEFyZWE7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWJvZHkuaXNTdGF0aWMpIHtcclxuICAgICAgICAgICAgICAgIEJvZHkuc2V0TWFzcyhib2R5LCBib2R5LmRlbnNpdHkgKiB0b3RhbEFyZWEpO1xyXG4gICAgICAgICAgICAgICAgQm9keS5zZXRJbmVydGlhKGJvZHksIHRvdGFsSW5lcnRpYSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGhhbmRsZSBjaXJjbGVzXHJcbiAgICAgICAgaWYgKGJvZHkuY2lyY2xlUmFkaXVzKSB7IFxyXG4gICAgICAgICAgICBpZiAoc2NhbGVYID09PSBzY2FsZVkpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkuY2lyY2xlUmFkaXVzICo9IHNjYWxlWDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGJvZHkgaXMgbm8gbG9uZ2VyIGEgY2lyY2xlXHJcbiAgICAgICAgICAgICAgICBib2R5LmNpcmNsZVJhZGl1cyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSBzaW11bGF0aW9uIHN0ZXAgZm9yIHRoZSBnaXZlbiBgYm9keWAsIGluY2x1ZGluZyB1cGRhdGluZyBwb3NpdGlvbiBhbmQgYW5nbGUgdXNpbmcgVmVybGV0IGludGVncmF0aW9uLlxyXG4gICAgICogQG1ldGhvZCB1cGRhdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhVGltZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvcnJlY3Rpb25cclxuICAgICAqL1xyXG4gICAgQm9keS51cGRhdGUgPSBmdW5jdGlvbihib2R5LCBkZWx0YVRpbWUsIHRpbWVTY2FsZSwgY29ycmVjdGlvbikge1xyXG4gICAgICAgIHZhciBkZWx0YVRpbWVTcXVhcmVkID0gTWF0aC5wb3coZGVsdGFUaW1lICogdGltZVNjYWxlICogYm9keS50aW1lU2NhbGUsIDIpO1xyXG5cclxuICAgICAgICAvLyBmcm9tIHRoZSBwcmV2aW91cyBzdGVwXHJcbiAgICAgICAgdmFyIGZyaWN0aW9uQWlyID0gMSAtIGJvZHkuZnJpY3Rpb25BaXIgKiB0aW1lU2NhbGUgKiBib2R5LnRpbWVTY2FsZSxcclxuICAgICAgICAgICAgdmVsb2NpdHlQcmV2WCA9IGJvZHkucG9zaXRpb24ueCAtIGJvZHkucG9zaXRpb25QcmV2LngsXHJcbiAgICAgICAgICAgIHZlbG9jaXR5UHJldlkgPSBib2R5LnBvc2l0aW9uLnkgLSBib2R5LnBvc2l0aW9uUHJldi55O1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgdmVsb2NpdHkgd2l0aCBWZXJsZXQgaW50ZWdyYXRpb25cclxuICAgICAgICBib2R5LnZlbG9jaXR5LnggPSAodmVsb2NpdHlQcmV2WCAqIGZyaWN0aW9uQWlyICogY29ycmVjdGlvbikgKyAoYm9keS5mb3JjZS54IC8gYm9keS5tYXNzKSAqIGRlbHRhVGltZVNxdWFyZWQ7XHJcbiAgICAgICAgYm9keS52ZWxvY2l0eS55ID0gKHZlbG9jaXR5UHJldlkgKiBmcmljdGlvbkFpciAqIGNvcnJlY3Rpb24pICsgKGJvZHkuZm9yY2UueSAvIGJvZHkubWFzcykgKiBkZWx0YVRpbWVTcXVhcmVkO1xyXG5cclxuICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ID0gYm9keS5wb3NpdGlvbi54O1xyXG4gICAgICAgIGJvZHkucG9zaXRpb25QcmV2LnkgPSBib2R5LnBvc2l0aW9uLnk7XHJcbiAgICAgICAgYm9keS5wb3NpdGlvbi54ICs9IGJvZHkudmVsb2NpdHkueDtcclxuICAgICAgICBib2R5LnBvc2l0aW9uLnkgKz0gYm9keS52ZWxvY2l0eS55O1xyXG5cclxuICAgICAgICAvLyB1cGRhdGUgYW5ndWxhciB2ZWxvY2l0eSB3aXRoIFZlcmxldCBpbnRlZ3JhdGlvblxyXG4gICAgICAgIGJvZHkuYW5ndWxhclZlbG9jaXR5ID0gKChib2R5LmFuZ2xlIC0gYm9keS5hbmdsZVByZXYpICogZnJpY3Rpb25BaXIgKiBjb3JyZWN0aW9uKSArIChib2R5LnRvcnF1ZSAvIGJvZHkuaW5lcnRpYSkgKiBkZWx0YVRpbWVTcXVhcmVkO1xyXG4gICAgICAgIGJvZHkuYW5nbGVQcmV2ID0gYm9keS5hbmdsZTtcclxuICAgICAgICBib2R5LmFuZ2xlICs9IGJvZHkuYW5ndWxhclZlbG9jaXR5O1xyXG5cclxuICAgICAgICAvLyB0cmFjayBzcGVlZCBhbmQgYWNjZWxlcmF0aW9uXHJcbiAgICAgICAgYm9keS5zcGVlZCA9IFZlY3Rvci5tYWduaXR1ZGUoYm9keS52ZWxvY2l0eSk7XHJcbiAgICAgICAgYm9keS5hbmd1bGFyU3BlZWQgPSBNYXRoLmFicyhib2R5LmFuZ3VsYXJWZWxvY2l0eSk7XHJcblxyXG4gICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgYm9keSBnZW9tZXRyeVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9keS5wYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbaV07XHJcblxyXG4gICAgICAgICAgICBWZXJ0aWNlcy50cmFuc2xhdGUocGFydC52ZXJ0aWNlcywgYm9keS52ZWxvY2l0eSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueCArPSBib2R5LnZlbG9jaXR5Lng7XHJcbiAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnkgKz0gYm9keS52ZWxvY2l0eS55O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keS5hbmd1bGFyVmVsb2NpdHkgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIFZlcnRpY2VzLnJvdGF0ZShwYXJ0LnZlcnRpY2VzLCBib2R5LmFuZ3VsYXJWZWxvY2l0eSwgYm9keS5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBBeGVzLnJvdGF0ZShwYXJ0LmF4ZXMsIGJvZHkuYW5ndWxhclZlbG9jaXR5KTtcclxuICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIFZlY3Rvci5yb3RhdGVBYm91dChwYXJ0LnBvc2l0aW9uLCBib2R5LmFuZ3VsYXJWZWxvY2l0eSwgYm9keS5wb3NpdGlvbiwgcGFydC5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIEJvdW5kcy51cGRhdGUocGFydC5ib3VuZHMsIHBhcnQudmVydGljZXMsIGJvZHkudmVsb2NpdHkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIGEgZm9yY2UgdG8gYSBib2R5IGZyb20gYSBnaXZlbiB3b3JsZC1zcGFjZSBwb3NpdGlvbiwgaW5jbHVkaW5nIHJlc3VsdGluZyB0b3JxdWUuXHJcbiAgICAgKiBAbWV0aG9kIGFwcGx5Rm9yY2VcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gZm9yY2VcclxuICAgICAqL1xyXG4gICAgQm9keS5hcHBseUZvcmNlID0gZnVuY3Rpb24oYm9keSwgcG9zaXRpb24sIGZvcmNlKSB7XHJcbiAgICAgICAgYm9keS5mb3JjZS54ICs9IGZvcmNlLng7XHJcbiAgICAgICAgYm9keS5mb3JjZS55ICs9IGZvcmNlLnk7XHJcbiAgICAgICAgdmFyIG9mZnNldCA9IHsgeDogcG9zaXRpb24ueCAtIGJvZHkucG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSAtIGJvZHkucG9zaXRpb24ueSB9O1xyXG4gICAgICAgIGJvZHkudG9ycXVlICs9IG9mZnNldC54ICogZm9yY2UueSAtIG9mZnNldC55ICogZm9yY2UueDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzdW1zIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIGFsbCBjb21wb3VuZCBwYXJ0cyBvZiB0aGUgcGFyZW50IGJvZHkuXHJcbiAgICAgKiBAbWV0aG9kIF90b3RhbFByb3BlcnRpZXNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEByZXR1cm4ge31cclxuICAgICAqL1xyXG4gICAgQm9keS5fdG90YWxQcm9wZXJ0aWVzID0gZnVuY3Rpb24oYm9keSkge1xyXG4gICAgICAgIC8vIGZyb20gZXF1YXRpb25zIGF0OlxyXG4gICAgICAgIC8vIGh0dHBzOi8vZWNvdXJzZXMub3UuZWR1L2NnaS1iaW4vZWJvb2suY2dpP2RvYz0mdG9waWM9c3QmY2hhcF9zZWM9MDcuMiZwYWdlPXRoZW9yeVxyXG4gICAgICAgIC8vIGh0dHA6Ly9vdXRwdXQudG8vc2lkZXdheS9kZWZhdWx0LmFzcD9xbm89MTIxMTAwMDg3XHJcblxyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICBtYXNzOiAwLFxyXG4gICAgICAgICAgICBhcmVhOiAwLFxyXG4gICAgICAgICAgICBpbmVydGlhOiAwLFxyXG4gICAgICAgICAgICBjZW50cmU6IHsgeDogMCwgeTogMCB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gc3VtIHRoZSBwcm9wZXJ0aWVzIG9mIGFsbCBjb21wb3VuZCBwYXJ0cyBvZiB0aGUgcGFyZW50IGJvZHlcclxuICAgICAgICBmb3IgKHZhciBpID0gYm9keS5wYXJ0cy5sZW5ndGggPT09IDEgPyAwIDogMTsgaSA8IGJvZHkucGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2ldLFxyXG4gICAgICAgICAgICAgICAgbWFzcyA9IHBhcnQubWFzcyAhPT0gSW5maW5pdHkgPyBwYXJ0Lm1hc3MgOiAxO1xyXG5cclxuICAgICAgICAgICAgcHJvcGVydGllcy5tYXNzICs9IG1hc3M7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMuYXJlYSArPSBwYXJ0LmFyZWE7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMuaW5lcnRpYSArPSBwYXJ0LmluZXJ0aWE7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY2VudHJlID0gVmVjdG9yLmFkZChwcm9wZXJ0aWVzLmNlbnRyZSwgVmVjdG9yLm11bHQocGFydC5wb3NpdGlvbiwgbWFzcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvcGVydGllcy5jZW50cmUgPSBWZWN0b3IuZGl2KHByb3BlcnRpZXMuY2VudHJlLCBwcm9wZXJ0aWVzLm1hc3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcclxuICAgIH07XHJcblxyXG4gICAgLypcclxuICAgICpcclxuICAgICogIEV2ZW50cyBEb2N1bWVudGF0aW9uXHJcbiAgICAqXHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCB3aGVuIGEgYm9keSBzdGFydHMgc2xlZXBpbmcgKHdoZXJlIGB0aGlzYCBpcyB0aGUgYm9keSkuXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBzbGVlcFN0YXJ0XHJcbiAgICAqIEB0aGlzIHtib2R5fSBUaGUgYm9keSB0aGF0IGhhcyBzdGFydGVkIHNsZWVwaW5nXHJcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCB3aGVuIGEgYm9keSBlbmRzIHNsZWVwaW5nICh3aGVyZSBgdGhpc2AgaXMgdGhlIGJvZHkpLlxyXG4gICAgKlxyXG4gICAgKiBAZXZlbnQgc2xlZXBFbmRcclxuICAgICogQHRoaXMge2JvZHl9IFRoZSBib2R5IHRoYXQgaGFzIGVuZGVkIHNsZWVwaW5nXHJcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qXHJcbiAgICAqXHJcbiAgICAqICBQcm9wZXJ0aWVzIERvY3VtZW50YXRpb25cclxuICAgICpcclxuICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlZ2VyIGBOdW1iZXJgIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIG51bWJlciBnZW5lcmF0ZWQgaW4gYEJvZHkuY3JlYXRlYCBieSBgQ29tbW9uLm5leHRJZGAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlkXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgU3RyaW5nYCBkZW5vdGluZyB0aGUgdHlwZSBvZiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHR5cGVcclxuICAgICAqIEB0eXBlIHN0cmluZ1xyXG4gICAgICogQGRlZmF1bHQgXCJib2R5XCJcclxuICAgICAqIEByZWFkT25seVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcmJpdHJhcnkgYFN0cmluZ2AgbmFtZSB0byBoZWxwIHRoZSB1c2VyIGlkZW50aWZ5IGFuZCBtYW5hZ2UgYm9kaWVzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBsYWJlbFxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKiBAZGVmYXVsdCBcIkJvZHlcIlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBib2RpZXMgdGhhdCBtYWtlIHVwIHRoaXMgYm9keS4gXHJcbiAgICAgKiBUaGUgZmlyc3QgYm9keSBpbiB0aGUgYXJyYXkgbXVzdCBhbHdheXMgYmUgYSBzZWxmIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBib2R5IGluc3RhbmNlLlxyXG4gICAgICogQWxsIGJvZGllcyBpbiB0aGUgYHBhcnRzYCBhcnJheSB0b2dldGhlciBmb3JtIGEgc2luZ2xlIHJpZ2lkIGNvbXBvdW5kIGJvZHkuXHJcbiAgICAgKiBQYXJ0cyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLCBoYXZlIGdhcHMgb3IgaG9sZXMgb3IgZXZlbiBmb3JtIGNvbmNhdmUgYm9kaWVzLlxyXG4gICAgICogUGFydHMgdGhlbXNlbHZlcyBzaG91bGQgbmV2ZXIgYmUgYWRkZWQgdG8gYSBgV29ybGRgLCBvbmx5IHRoZSBwYXJlbnQgYm9keSBzaG91bGQgYmUuXHJcbiAgICAgKiBVc2UgYEJvZHkuc2V0UGFydHNgIHdoZW4gc2V0dGluZyBwYXJ0cyB0byBlbnN1cmUgY29ycmVjdCB1cGRhdGVzIG9mIGFsbCBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBwYXJ0c1xyXG4gICAgICogQHR5cGUgYm9keVtdXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIG9iamVjdCByZXNlcnZlZCBmb3Igc3RvcmluZyBwbHVnaW4tc3BlY2lmaWMgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcGx1Z2luXHJcbiAgICAgKiBAdHlwZSB7fVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNlbGYgcmVmZXJlbmNlIGlmIHRoZSBib2R5IGlzIF9ub3RfIGEgcGFydCBvZiBhbm90aGVyIGJvZHkuXHJcbiAgICAgKiBPdGhlcndpc2UgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgYm9keSB0aGF0IHRoaXMgaXMgYSBwYXJ0IG9mLlxyXG4gICAgICogU2VlIGBib2R5LnBhcnRzYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcGFyZW50XHJcbiAgICAgKiBAdHlwZSBib2R5XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgc3BlY2lmeWluZyB0aGUgYW5nbGUgb2YgdGhlIGJvZHksIGluIHJhZGlhbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGFuZ2xlXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYFZlY3RvcmAgb2JqZWN0cyB0aGF0IHNwZWNpZnkgdGhlIGNvbnZleCBodWxsIG9mIHRoZSByaWdpZCBib2R5LlxyXG4gICAgICogVGhlc2Ugc2hvdWxkIGJlIHByb3ZpZGVkIGFib3V0IHRoZSBvcmlnaW4gYCgwLCAwKWAuIEUuZy5cclxuICAgICAqXHJcbiAgICAgKiAgICAgW3sgeDogMCwgeTogMCB9LCB7IHg6IDI1LCB5OiA1MCB9LCB7IHg6IDUwLCB5OiAwIH1dXHJcbiAgICAgKlxyXG4gICAgICogV2hlbiBwYXNzZWQgdmlhIGBCb2R5LmNyZWF0ZWAsIHRoZSB2ZXJ0aWNlcyBhcmUgdHJhbnNsYXRlZCByZWxhdGl2ZSB0byBgYm9keS5wb3NpdGlvbmAgKGkuZS4gd29ybGQtc3BhY2UsIGFuZCBjb25zdGFudGx5IHVwZGF0ZWQgYnkgYEJvZHkudXBkYXRlYCBkdXJpbmcgc2ltdWxhdGlvbikuXHJcbiAgICAgKiBUaGUgYFZlY3RvcmAgb2JqZWN0cyBhcmUgYWxzbyBhdWdtZW50ZWQgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIGVmZmljaWVudCBjb2xsaXNpb24gZGV0ZWN0aW9uLiBcclxuICAgICAqXHJcbiAgICAgKiBPdGhlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgYGluZXJ0aWFgIGFuZCBgYm91bmRzYCBhcmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIHBhc3NlZCB2ZXJ0aWNlcyAodW5sZXNzIHByb3ZpZGVkIHZpYSBgb3B0aW9uc2ApLlxyXG4gICAgICogQ29uY2F2ZSBodWxscyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIFRoZSBtb2R1bGUgYE1hdHRlci5WZXJ0aWNlc2AgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB2ZXJ0aWNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgdmVydGljZXNcclxuICAgICAqIEB0eXBlIHZlY3RvcltdXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYFZlY3RvcmAgdGhhdCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgd29ybGQtc3BhY2UgcG9zaXRpb24gb2YgdGhlIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHBvc2l0aW9uXHJcbiAgICAgKiBAdHlwZSB2ZWN0b3JcclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYFZlY3RvcmAgdGhhdCBob2xkcyB0aGUgY3VycmVudCBzY2FsZSB2YWx1ZXMgYXMgc2V0IGJ5IGBCb2R5LnNldFNjYWxlYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgc2NhbGVcclxuICAgICAqIEB0eXBlIHZlY3RvclxyXG4gICAgICogQGRlZmF1bHQgeyB4OiAxLCB5OiAxIH1cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgVmVjdG9yYCB0aGF0IHNwZWNpZmllcyB0aGUgZm9yY2UgdG8gYXBwbHkgaW4gdGhlIGN1cnJlbnQgc3RlcC4gSXQgaXMgemVyb2VkIGFmdGVyIGV2ZXJ5IGBCb2R5LnVwZGF0ZWAuIFNlZSBhbHNvIGBCb2R5LmFwcGx5Rm9yY2VgLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBmb3JjZVxyXG4gICAgICogQHR5cGUgdmVjdG9yXHJcbiAgICAgKiBAZGVmYXVsdCB7IHg6IDAsIHk6IDAgfVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgc3BlY2lmaWVzIHRoZSB0b3JxdWUgKHR1cm5pbmcgZm9yY2UpIHRvIGFwcGx5IGluIHRoZSBjdXJyZW50IHN0ZXAuIEl0IGlzIHplcm9lZCBhZnRlciBldmVyeSBgQm9keS51cGRhdGVgLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSB0b3JxdWVcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgY3VycmVudCBzcGVlZCBvZiB0aGUgYm9keSBhZnRlciB0aGUgbGFzdCBgQm9keS51cGRhdGVgLiBJdCBpcyByZWFkLW9ubHkgYW5kIGFsd2F5cyBwb3NpdGl2ZSAoaXQncyB0aGUgbWFnbml0dWRlIG9mIGBib2R5LnZlbG9jaXR5YCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKiBAcHJvcGVydHkgc3BlZWRcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgX21lYXN1cmVzXyB0aGUgY3VycmVudCBhbmd1bGFyIHNwZWVkIG9mIHRoZSBib2R5IGFmdGVyIHRoZSBsYXN0IGBCb2R5LnVwZGF0ZWAuIEl0IGlzIHJlYWQtb25seSBhbmQgYWx3YXlzIHBvc2l0aXZlIChpdCdzIHRoZSBtYWduaXR1ZGUgb2YgYGJvZHkuYW5ndWxhclZlbG9jaXR5YCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKiBAcHJvcGVydHkgYW5ndWxhclNwZWVkXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgVmVjdG9yYCB0aGF0IF9tZWFzdXJlc18gdGhlIGN1cnJlbnQgdmVsb2NpdHkgb2YgdGhlIGJvZHkgYWZ0ZXIgdGhlIGxhc3QgYEJvZHkudXBkYXRlYC4gSXQgaXMgcmVhZC1vbmx5LiBcclxuICAgICAqIElmIHlvdSBuZWVkIHRvIG1vZGlmeSBhIGJvZHkncyB2ZWxvY2l0eSBkaXJlY3RseSwgeW91IHNob3VsZCBlaXRoZXIgYXBwbHkgYSBmb3JjZSBvciBzaW1wbHkgY2hhbmdlIHRoZSBib2R5J3MgYHBvc2l0aW9uYCAoYXMgdGhlIGVuZ2luZSB1c2VzIHBvc2l0aW9uLVZlcmxldCBpbnRlZ3JhdGlvbikuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKiBAcHJvcGVydHkgdmVsb2NpdHlcclxuICAgICAqIEB0eXBlIHZlY3RvclxyXG4gICAgICogQGRlZmF1bHQgeyB4OiAwLCB5OiAwIH1cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IF9tZWFzdXJlc18gdGhlIGN1cnJlbnQgYW5ndWxhciB2ZWxvY2l0eSBvZiB0aGUgYm9keSBhZnRlciB0aGUgbGFzdCBgQm9keS51cGRhdGVgLiBJdCBpcyByZWFkLW9ubHkuIFxyXG4gICAgICogSWYgeW91IG5lZWQgdG8gbW9kaWZ5IGEgYm9keSdzIGFuZ3VsYXIgdmVsb2NpdHkgZGlyZWN0bHksIHlvdSBzaG91bGQgYXBwbHkgYSB0b3JxdWUgb3Igc2ltcGx5IGNoYW5nZSB0aGUgYm9keSdzIGBhbmdsZWAgKGFzIHRoZSBlbmdpbmUgdXNlcyBwb3NpdGlvbi1WZXJsZXQgaW50ZWdyYXRpb24pLlxyXG4gICAgICpcclxuICAgICAqIEByZWFkT25seVxyXG4gICAgICogQHByb3BlcnR5IGFuZ3VsYXJWZWxvY2l0eVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGEgYm9keSBpcyBjb25zaWRlcmVkIHN0YXRpYy4gQSBzdGF0aWMgYm9keSBjYW4gbmV2ZXIgY2hhbmdlIHBvc2l0aW9uIG9yIGFuZ2xlIGFuZCBpcyBjb21wbGV0ZWx5IGZpeGVkLlxyXG4gICAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgYm9keSBhcyBzdGF0aWMgYWZ0ZXIgaXRzIGNyZWF0aW9uLCB5b3Ugc2hvdWxkIHVzZSBgQm9keS5zZXRTdGF0aWNgIGFzIHRoaXMgcmVxdWlyZXMgbW9yZSB0aGFuIGp1c3Qgc2V0dGluZyB0aGlzIGZsYWcuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlzU3RhdGljXHJcbiAgICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIGJvZHkgaXMgYSBzZW5zb3IuIFNlbnNvciB0cmlnZ2VycyBjb2xsaXNpb24gZXZlbnRzLCBidXQgZG9lc24ndCByZWFjdCB3aXRoIGNvbGxpZGluZyBib2R5IHBoeXNpY2FsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlzU2Vuc29yXHJcbiAgICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9keSBpcyBjb25zaWRlcmVkIHNsZWVwaW5nLiBBIHNsZWVwaW5nIGJvZHkgYWN0cyBzaW1pbGFyIHRvIGEgc3RhdGljIGJvZHksIGV4Y2VwdCBpdCBpcyBvbmx5IHRlbXBvcmFyeSBhbmQgY2FuIGJlIGF3b2tlbi5cclxuICAgICAqIElmIHlvdSBuZWVkIHRvIHNldCBhIGJvZHkgYXMgc2xlZXBpbmcsIHlvdSBzaG91bGQgdXNlIGBTbGVlcGluZy5zZXRgIGFzIHRoaXMgcmVxdWlyZXMgbW9yZSB0aGFuIGp1c3Qgc2V0dGluZyB0aGlzIGZsYWcuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlzU2xlZXBpbmdcclxuICAgICAqIEB0eXBlIGJvb2xlYW5cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBfbWVhc3VyZXNfIHRoZSBhbW91bnQgb2YgbW92ZW1lbnQgYSBib2R5IGN1cnJlbnRseSBoYXMgKGEgY29tYmluYXRpb24gb2YgYHNwZWVkYCBhbmQgYGFuZ3VsYXJTcGVlZGApLiBJdCBpcyByZWFkLW9ubHkgYW5kIGFsd2F5cyBwb3NpdGl2ZS5cclxuICAgICAqIEl0IGlzIHVzZWQgYW5kIHVwZGF0ZWQgYnkgdGhlIGBNYXR0ZXIuU2xlZXBpbmdgIG1vZHVsZSBkdXJpbmcgc2ltdWxhdGlvbiB0byBkZWNpZGUgaWYgYSBib2R5IGhhcyBjb21lIHRvIHJlc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKiBAcHJvcGVydHkgbW90aW9uXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZiB1cGRhdGVzIGluIHdoaWNoIHRoaXMgYm9keSBtdXN0IGhhdmUgbmVhci16ZXJvIHZlbG9jaXR5IGJlZm9yZSBpdCBpcyBzZXQgYXMgc2xlZXBpbmcgYnkgdGhlIGBNYXR0ZXIuU2xlZXBpbmdgIG1vZHVsZSAoaWYgc2xlZXBpbmcgaXMgZW5hYmxlZCBieSB0aGUgZW5naW5lKS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgc2xlZXBUaHJlc2hvbGRcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgNjBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGRlbnNpdHkgb2YgdGhlIGJvZHksIHRoYXQgaXMgaXRzIG1hc3MgcGVyIHVuaXQgYXJlYS5cclxuICAgICAqIElmIHlvdSBwYXNzIHRoZSBkZW5zaXR5IHZpYSBgQm9keS5jcmVhdGVgIHRoZSBgbWFzc2AgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZvciB5b3UgYmFzZWQgb24gdGhlIHNpemUgKGFyZWEpIG9mIHRoZSBvYmplY3QuXHJcbiAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHNpbXBseSBzZXR0aW5nIG1hc3MgYW5kIGFsbG93cyBmb3IgbW9yZSBpbnR1aXRpdmUgZGVmaW5pdGlvbiBvZiBtYXRlcmlhbHMgKGUuZy4gcm9jayBoYXMgYSBoaWdoZXIgZGVuc2l0eSB0aGFuIHdvb2QpLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBkZW5zaXR5XHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDAuMDAxXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBtYXNzIG9mIHRoZSBib2R5LCBhbHRob3VnaCBpdCBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byBzcGVjaWZ5IHRoZSBgZGVuc2l0eWAgcHJvcGVydHkgaW5zdGVhZC5cclxuICAgICAqIElmIHlvdSBtb2RpZnkgdGhpcyB2YWx1ZSwgeW91IG11c3QgYWxzbyBtb2RpZnkgdGhlIGBib2R5LmludmVyc2VNYXNzYCBwcm9wZXJ0eSAoYDEgLyBtYXNzYCkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IG1hc3NcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgaW52ZXJzZSBtYXNzIG9mIHRoZSBib2R5IChgMSAvIG1hc3NgKS5cclxuICAgICAqIElmIHlvdSBtb2RpZnkgdGhpcyB2YWx1ZSwgeW91IG11c3QgYWxzbyBtb2RpZnkgdGhlIGBib2R5Lm1hc3NgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBpbnZlcnNlTWFzc1xyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBtb21lbnQgb2YgaW5lcnRpYSAoaS5lLiBzZWNvbmQgbW9tZW50IG9mIGFyZWEpIG9mIHRoZSBib2R5LlxyXG4gICAgICogSXQgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIGdpdmVuIGNvbnZleCBodWxsIChgdmVydGljZXNgIGFycmF5KSBhbmQgZGVuc2l0eSBpbiBgQm9keS5jcmVhdGVgLlxyXG4gICAgICogSWYgeW91IG1vZGlmeSB0aGlzIHZhbHVlLCB5b3UgbXVzdCBhbHNvIG1vZGlmeSB0aGUgYGJvZHkuaW52ZXJzZUluZXJ0aWFgIHByb3BlcnR5IChgMSAvIGluZXJ0aWFgKS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgaW5lcnRpYVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBpbnZlcnNlIG1vbWVudCBvZiBpbmVydGlhIG9mIHRoZSBib2R5IChgMSAvIGluZXJ0aWFgKS5cclxuICAgICAqIElmIHlvdSBtb2RpZnkgdGhpcyB2YWx1ZSwgeW91IG11c3QgYWxzbyBtb2RpZnkgdGhlIGBib2R5LmluZXJ0aWFgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBpbnZlcnNlSW5lcnRpYVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSByZXN0aXR1dGlvbiAoZWxhc3RpY2l0eSkgb2YgdGhlIGJvZHkuIFRoZSB2YWx1ZSBpcyBhbHdheXMgcG9zaXRpdmUgYW5kIGlzIGluIHRoZSByYW5nZSBgKDAsIDEpYC5cclxuICAgICAqIEEgdmFsdWUgb2YgYDBgIG1lYW5zIGNvbGxpc2lvbnMgbWF5IGJlIHBlcmZlY3RseSBpbmVsYXN0aWMgYW5kIG5vIGJvdW5jaW5nIG1heSBvY2N1ci4gXHJcbiAgICAgKiBBIHZhbHVlIG9mIGAwLjhgIG1lYW5zIHRoZSBib2R5IG1heSBib3VuY2UgYmFjayB3aXRoIGFwcHJveGltYXRlbHkgODAlIG9mIGl0cyBraW5ldGljIGVuZXJneS5cclxuICAgICAqIE5vdGUgdGhhdCBjb2xsaXNpb24gcmVzcG9uc2UgaXMgYmFzZWQgb24gX3BhaXJzXyBvZiBib2RpZXMsIGFuZCB0aGF0IGByZXN0aXR1dGlvbmAgdmFsdWVzIGFyZSBfY29tYmluZWRfIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtdWxhOlxyXG4gICAgICpcclxuICAgICAqICAgICBNYXRoLm1heChib2R5QS5yZXN0aXR1dGlvbiwgYm9keUIucmVzdGl0dXRpb24pXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlc3RpdHV0aW9uXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIGZyaWN0aW9uIG9mIHRoZSBib2R5LiBUaGUgdmFsdWUgaXMgYWx3YXlzIHBvc2l0aXZlIGFuZCBpcyBpbiB0aGUgcmFuZ2UgYCgwLCAxKWAuXHJcbiAgICAgKiBBIHZhbHVlIG9mIGAwYCBtZWFucyB0aGF0IHRoZSBib2R5IG1heSBzbGlkZSBpbmRlZmluaXRlbHkuXHJcbiAgICAgKiBBIHZhbHVlIG9mIGAxYCBtZWFucyB0aGUgYm9keSBtYXkgY29tZSB0byBhIHN0b3AgYWxtb3N0IGluc3RhbnRseSBhZnRlciBhIGZvcmNlIGlzIGFwcGxpZWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGVmZmVjdHMgb2YgdGhlIHZhbHVlIG1heSBiZSBub24tbGluZWFyLiBcclxuICAgICAqIEhpZ2ggdmFsdWVzIG1heSBiZSB1bnN0YWJsZSBkZXBlbmRpbmcgb24gdGhlIGJvZHkuXHJcbiAgICAgKiBUaGUgZW5naW5lIHVzZXMgYSBDb3Vsb21iIGZyaWN0aW9uIG1vZGVsIGluY2x1ZGluZyBzdGF0aWMgYW5kIGtpbmV0aWMgZnJpY3Rpb24uXHJcbiAgICAgKiBOb3RlIHRoYXQgY29sbGlzaW9uIHJlc3BvbnNlIGlzIGJhc2VkIG9uIF9wYWlyc18gb2YgYm9kaWVzLCBhbmQgdGhhdCBgZnJpY3Rpb25gIHZhbHVlcyBhcmUgX2NvbWJpbmVkXyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybXVsYTpcclxuICAgICAqXHJcbiAgICAgKiAgICAgTWF0aC5taW4oYm9keUEuZnJpY3Rpb24sIGJvZHlCLmZyaWN0aW9uKVxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBmcmljdGlvblxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAwLjFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIHN0YXRpYyBmcmljdGlvbiBvZiB0aGUgYm9keSAoaW4gdGhlIENvdWxvbWIgZnJpY3Rpb24gbW9kZWwpLiBcclxuICAgICAqIEEgdmFsdWUgb2YgYDBgIG1lYW5zIHRoZSBib2R5IHdpbGwgbmV2ZXIgJ3N0aWNrJyB3aGVuIGl0IGlzIG5lYXJseSBzdGF0aW9uYXJ5IGFuZCBvbmx5IGR5bmFtaWMgYGZyaWN0aW9uYCBpcyB1c2VkLlxyXG4gICAgICogVGhlIGhpZ2hlciB0aGUgdmFsdWUgKGUuZy4gYDEwYCksIHRoZSBtb3JlIGZvcmNlIGl0IHdpbGwgdGFrZSB0byBpbml0aWFsbHkgZ2V0IHRoZSBib2R5IG1vdmluZyB3aGVuIG5lYXJseSBzdGF0aW9uYXJ5LlxyXG4gICAgICogVGhpcyB2YWx1ZSBpcyBtdWx0aXBsaWVkIHdpdGggdGhlIGBmcmljdGlvbmAgcHJvcGVydHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY2hhbmdlIGBmcmljdGlvbmAgYW5kIG1haW50YWluIGFuIGFwcHJvcHJpYXRlIGFtb3VudCBvZiBzdGF0aWMgZnJpY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGZyaWN0aW9uU3RhdGljXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDAuNVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgYWlyIGZyaWN0aW9uIG9mIHRoZSBib2R5IChhaXIgcmVzaXN0YW5jZSkuIFxyXG4gICAgICogQSB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhlIGJvZHkgd2lsbCBuZXZlciBzbG93IGFzIGl0IG1vdmVzIHRocm91Z2ggc3BhY2UuXHJcbiAgICAgKiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIGZhc3RlciBhIGJvZHkgc2xvd3Mgd2hlbiBtb3ZpbmcgdGhyb3VnaCBzcGFjZS5cclxuICAgICAqIFRoZSBlZmZlY3RzIG9mIHRoZSB2YWx1ZSBhcmUgbm9uLWxpbmVhci4gXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGZyaWN0aW9uQWlyXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDAuMDFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYE9iamVjdGAgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbGxpc2lvbiBmaWx0ZXJpbmcgcHJvcGVydGllcyBvZiB0aGlzIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQ29sbGlzaW9ucyBiZXR3ZWVuIHR3byBib2RpZXMgd2lsbCBvYmV5IHRoZSBmb2xsb3dpbmcgcnVsZXM6XHJcbiAgICAgKiAtIElmIHRoZSB0d28gYm9kaWVzIGhhdmUgdGhlIHNhbWUgbm9uLXplcm8gdmFsdWUgb2YgYGNvbGxpc2lvbkZpbHRlci5ncm91cGAsXHJcbiAgICAgKiAgIHRoZXkgd2lsbCBhbHdheXMgY29sbGlkZSBpZiB0aGUgdmFsdWUgaXMgcG9zaXRpdmUsIGFuZCB0aGV5IHdpbGwgbmV2ZXIgY29sbGlkZVxyXG4gICAgICogICBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuXHJcbiAgICAgKiAtIElmIHRoZSB0d28gYm9kaWVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcyBvZiBgY29sbGlzaW9uRmlsdGVyLmdyb3VwYCBvciBpZiBvbmVcclxuICAgICAqICAgKG9yIGJvdGgpIG9mIHRoZSBib2RpZXMgaGFzIGEgdmFsdWUgb2YgMCwgdGhlbiB0aGUgY2F0ZWdvcnkvbWFzayBydWxlcyBhcHBseSBhcyBmb2xsb3dzOlxyXG4gICAgICpcclxuICAgICAqIEVhY2ggYm9keSBiZWxvbmdzIHRvIGEgY29sbGlzaW9uIGNhdGVnb3J5LCBnaXZlbiBieSBgY29sbGlzaW9uRmlsdGVyLmNhdGVnb3J5YC4gVGhpc1xyXG4gICAgICogdmFsdWUgaXMgdXNlZCBhcyBhIGJpdCBmaWVsZCBhbmQgdGhlIGNhdGVnb3J5IHNob3VsZCBoYXZlIG9ubHkgb25lIGJpdCBzZXQsIG1lYW5pbmcgdGhhdFxyXG4gICAgICogdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgYSBwb3dlciBvZiB0d28gaW4gdGhlIHJhbmdlIFsxLCAyXjMxXS4gVGh1cywgdGhlcmUgYXJlIDMyXHJcbiAgICAgKiBkaWZmZXJlbnQgY29sbGlzaW9uIGNhdGVnb3JpZXMgYXZhaWxhYmxlLlxyXG4gICAgICpcclxuICAgICAqIEVhY2ggYm9keSBhbHNvIGRlZmluZXMgYSBjb2xsaXNpb24gYml0bWFzaywgZ2l2ZW4gYnkgYGNvbGxpc2lvbkZpbHRlci5tYXNrYCB3aGljaCBzcGVjaWZpZXNcclxuICAgICAqIHRoZSBjYXRlZ29yaWVzIGl0IGNvbGxpZGVzIHdpdGggKHRoZSB2YWx1ZSBpcyB0aGUgYml0d2lzZSBBTkQgdmFsdWUgb2YgYWxsIHRoZXNlIGNhdGVnb3JpZXMpLlxyXG4gICAgICpcclxuICAgICAqIFVzaW5nIHRoZSBjYXRlZ29yeS9tYXNrIHJ1bGVzLCB0d28gYm9kaWVzIGBBYCBhbmQgYEJgIGNvbGxpZGUgaWYgZWFjaCBpbmNsdWRlcyB0aGUgb3RoZXInc1xyXG4gICAgICogY2F0ZWdvcnkgaW4gaXRzIG1hc2ssIGkuZS4gYChjYXRlZ29yeUEgJiBtYXNrQikgIT09IDBgIGFuZCBgKGNhdGVnb3J5QiAmIG1hc2tBKSAhPT0gMGBcclxuICAgICAqIGFyZSBib3RoIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGNvbGxpc2lvbkZpbHRlclxyXG4gICAgICogQHR5cGUgb2JqZWN0XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIEludGVnZXIgYE51bWJlcmAsIHRoYXQgc3BlY2lmaWVzIHRoZSBjb2xsaXNpb24gZ3JvdXAgdGhpcyBib2R5IGJlbG9uZ3MgdG8uXHJcbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY29sbGlzaW9uRmlsdGVyLmdyb3VwXHJcbiAgICAgKiBAdHlwZSBvYmplY3RcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBiaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlIGNvbGxpc2lvbiBjYXRlZ29yeSB0aGlzIGJvZHkgYmVsb25ncyB0by5cclxuICAgICAqIFRoZSBjYXRlZ29yeSB2YWx1ZSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBiaXQgc2V0LCBmb3IgZXhhbXBsZSBgMHgwMDAxYC5cclxuICAgICAqIFRoaXMgbWVhbnMgdGhlcmUgYXJlIHVwIHRvIDMyIHVuaXF1ZSBjb2xsaXNpb24gY2F0ZWdvcmllcyBhdmFpbGFibGUuXHJcbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY29sbGlzaW9uRmlsdGVyLmNhdGVnb3J5XHJcbiAgICAgKiBAdHlwZSBvYmplY3RcclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBiaXQgbWFzayB0aGF0IHNwZWNpZmllcyB0aGUgY29sbGlzaW9uIGNhdGVnb3JpZXMgdGhpcyBib2R5IG1heSBjb2xsaWRlIHdpdGguXHJcbiAgICAgKiBTZWUgYGJvZHkuY29sbGlzaW9uRmlsdGVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY29sbGlzaW9uRmlsdGVyLm1hc2tcclxuICAgICAqIEB0eXBlIG9iamVjdFxyXG4gICAgICogQGRlZmF1bHQgLTFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyBhIHRvbGVyYW5jZSBvbiBob3cgZmFyIGEgYm9keSBpcyBhbGxvd2VkIHRvICdzaW5rJyBvciByb3RhdGUgaW50byBvdGhlciBib2RpZXMuXHJcbiAgICAgKiBBdm9pZCBjaGFuZ2luZyB0aGlzIHZhbHVlIHVubGVzcyB5b3UgdW5kZXJzdGFuZCB0aGUgcHVycG9zZSBvZiBgc2xvcGAgaW4gcGh5c2ljcyBlbmdpbmVzLlxyXG4gICAgICogVGhlIGRlZmF1bHQgc2hvdWxkIGdlbmVyYWxseSBzdWZmaWNlLCBhbHRob3VnaCB2ZXJ5IGxhcmdlIGJvZGllcyBtYXkgcmVxdWlyZSBsYXJnZXIgdmFsdWVzIGZvciBzdGFibGUgc3RhY2tpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHNsb3BcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgMC4wNVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgYWxsb3dzIHBlci1ib2R5IHRpbWUgc2NhbGluZywgZS5nLiBhIGZvcmNlLWZpZWxkIHdoZXJlIGJvZGllcyBpbnNpZGUgYXJlIGluIHNsb3ctbW90aW9uLCB3aGlsZSBvdGhlcnMgYXJlIGF0IGZ1bGwgc3BlZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHRpbWVTY2FsZVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBPYmplY3RgIHRoYXQgZGVmaW5lcyB0aGUgcmVuZGVyaW5nIHByb3BlcnRpZXMgdG8gYmUgY29uc3VtZWQgYnkgdGhlIG1vZHVsZSBgTWF0dGVyLlJlbmRlcmAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlclxyXG4gICAgICogQHR5cGUgb2JqZWN0XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGUgYm9keSBzaG91bGQgYmUgcmVuZGVyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlci52aXNpYmxlXHJcbiAgICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG9wYWNpdHkgdG8gdXNlIHdoZW4gcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIub3BhY2l0eVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYE9iamVjdGAgdGhhdCBkZWZpbmVzIHRoZSBzcHJpdGUgcHJvcGVydGllcyB0byB1c2Ugd2hlbiByZW5kZXJpbmcsIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyLnNwcml0ZVxyXG4gICAgICogQHR5cGUgb2JqZWN0XHJcbiAgICAgKi9cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgeC1heGlzIGZvciB0aGUgc3ByaXRlIChub3JtYWxpc2VkIGJ5IHRleHR1cmUgd2lkdGgpLlxyXG4gICAgICAqXHJcbiAgICAgICogQHByb3BlcnR5IHJlbmRlci5zcHJpdGUueE9mZnNldFxyXG4gICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgKi9cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgICogQSBgTnVtYmVyYCB0aGF0IGRlZmluZXMgdGhlIG9mZnNldCBpbiB0aGUgeS1heGlzIGZvciB0aGUgc3ByaXRlIChub3JtYWxpc2VkIGJ5IHRleHR1cmUgaGVpZ2h0KS5cclxuICAgICAgKlxyXG4gICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuc3ByaXRlLnlPZmZzZXRcclxuICAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGhleCBjb2xvciB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoZSBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIuZmlsbENvbG9yXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGZpbGwgb3BhY2l0eSB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhlIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5maWxsT3BhY2l0eVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBBIGhleCBjb2xvciB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGxpbmUgY29sb3IgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoZSBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIubGluZUNvbG9yXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGxpbmUgb3BhY2l0eSB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhlIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5saW5lT3BhY2l0eVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKi9cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgZGVmaW5lcyB0aGUgbGluZSB3aWR0aCB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhlIGJvZHkgb3V0bGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyLmxpbmVUaGlja25lc3NcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiB1bmlxdWUgYXhpcyB2ZWN0b3JzIChlZGdlIG5vcm1hbHMpIHVzZWQgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24uXHJcbiAgICAgKiBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIGdpdmVuIGNvbnZleCBodWxsIChgdmVydGljZXNgIGFycmF5KSBpbiBgQm9keS5jcmVhdGVgLlxyXG4gICAgICogVGhleSBhcmUgY29uc3RhbnRseSB1cGRhdGVkIGJ5IGBCb2R5LnVwZGF0ZWAgZHVyaW5nIHRoZSBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBheGVzXHJcbiAgICAgKiBAdHlwZSB2ZWN0b3JbXVxyXG4gICAgICovXHJcbiAgICAgXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBfbWVhc3VyZXNfIHRoZSBhcmVhIG9mIHRoZSBib2R5J3MgY29udmV4IGh1bGwsIGNhbGN1bGF0ZWQgYXQgY3JlYXRpb24gYnkgYEJvZHkuY3JlYXRlYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgYXJlYVxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKiBAZGVmYXVsdCBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgQm91bmRzYCBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBBQUJCIHJlZ2lvbiBmb3IgdGhlIGJvZHkuXHJcbiAgICAgKiBJdCBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZnJvbSB0aGUgZ2l2ZW4gY29udmV4IGh1bGwgKGB2ZXJ0aWNlc2AgYXJyYXkpIGluIGBCb2R5LmNyZWF0ZWAgYW5kIGNvbnN0YW50bHkgdXBkYXRlZCBieSBgQm9keS51cGRhdGVgIGR1cmluZyBzaW11bGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBib3VuZHNcclxuICAgICAqIEB0eXBlIGJvdW5kc1xyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgUGhhc2VyIEdhbWUgT2JqZWN0IHRoaXMgYm9keSBiZWxvbmdzIHRvLCBpZiBhbnkuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGdhbWVPYmplY3RcclxuICAgICAqIEB0eXBlIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjZW50ZXIgb2YgbWFzcyBvZiB0aGUgQm9keS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY2VudGVyT2ZNYXNzXHJcbiAgICAgKiBAdHlwZSB2ZWN0b3JcclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjZW50ZXIgb2YgdGhlIGJvZHkgaW4gcGl4ZWwgdmFsdWVzLlxyXG4gICAgICogVXNlZCBieSBQaGFzZXIgZm9yIHRleHR1cmUgYWxpZ21lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGNlbnRlck9mZnNldFxyXG4gICAgICogQHR5cGUgdmVjdG9yXHJcbiAgICAgKiBAZGVmYXVsdCB7IHg6IDAsIHk6IDAgfVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIHRoaXMgQm9keSBpZ25vcmUgV29ybGQgZ3Jhdml0eSBkdXJpbmcgdGhlIEVuZ2luZSB1cGRhdGU/XHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlnbm9yZUdyYXZpdHlcclxuICAgICAqIEB0eXBlIGJvb2xlYW5cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlIHRoZSBpbmZsdWVuY2Ugb2YgV29ybGQgZ3Jhdml0eSB3aGVuIGFwcGxpZWQgdG8gdGhpcyBib2R5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBncmF2aXR5U2NhbGVcclxuICAgICAqIEB0eXBlIHZlY3RvclxyXG4gICAgICogQGRlZmF1bHQgeyB4OiAxLCB5OiAxIH1cclxuICAgICAqL1xyXG5cclxuICAgICAvKipcclxuICAgICAqIFdpbGwgdGhpcyBCb2R5IGlnbm9yZSBQaGFzZXIgUG9pbnRlciBpbnB1dCBldmVudHM/XHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlnbm9yZVBvaW50ZXJcclxuICAgICAqIEB0eXBlIGJvb2xlYW5cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhpcyBCb2R5IHN0YXJ0cyBjb2xsaWRpbmcgd2l0aCBhbnkgb3RoZXIgQm9keS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiByZWdpc3RlciBjYWxsYmFja3MgYnkgcHJvdmlkaW5nIGEgZnVuY3Rpb24gb2YgdHlwZSBgKCBwYWlyOiBNYXR0ZXIuUGFpcikgPT4gdm9pZGAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IG9uQ29sbGlkZUNhbGxiYWNrXHJcbiAgICAgKiBAdHlwZSBmdW5jdGlvblxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoaXMgQm9keSBzdG9wcyBjb2xsaWRpbmcgd2l0aCBhbnkgb3RoZXIgQm9keS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiByZWdpc3RlciBjYWxsYmFja3MgYnkgcHJvdmlkaW5nIGEgZnVuY3Rpb24gb2YgdHlwZSBgKCBwYWlyOiBNYXR0ZXIuUGFpcikgPT4gdm9pZGAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IG9uQ29sbGlkZUVuZENhbGxiYWNrXHJcbiAgICAgKiBAdHlwZSBmdW5jdGlvblxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGR1cmF0aW9uIHRoYXQgdGhpcyBCb2R5IGlzIGNvbGxpZGluZyB3aXRoIGFueSBvdGhlciBCb2R5LlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHJlZ2lzdGVyIGNhbGxiYWNrcyBieSBwcm92aWRpbmcgYSBmdW5jdGlvbiBvZiB0eXBlIGAoIHBhaXI6IE1hdHRlci5QYWlyKSA9PiB2b2lkYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgb25Db2xsaWRlQWN0aXZlQ2FsbGJhY2tcclxuICAgICAqIEB0eXBlIGZ1bmN0aW9uXHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY29sbGlzaW9uIGNhbGxiYWNrIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgYEJvZHkuc2V0T25Db2xsaWRlV2l0aGAgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IG9uQ29sbGlkZVdpdGhcclxuICAgICAqIEB0eXBlIG9iamVjdFxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICovXHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5Db21wb3NpdGVgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGNvbXBvc2l0ZSBib2RpZXMuXHJcbiogQSBjb21wb3NpdGUgYm9keSBpcyBhIGNvbGxlY3Rpb24gb2YgYE1hdHRlci5Cb2R5YCwgYE1hdHRlci5Db25zdHJhaW50YCBhbmQgb3RoZXIgYE1hdHRlci5Db21wb3NpdGVgLCB0aGVyZWZvcmUgY29tcG9zaXRlcyBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUuXHJcbiogSXQgaXMgaW1wb3J0YW50IHRvIHVzZSB0aGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHRvIG1vZGlmeSBjb21wb3NpdGVzLCByYXRoZXIgdGhhbiBkaXJlY3RseSBtb2RpZnlpbmcgdGhlaXIgcHJvcGVydGllcy5cclxuKiBOb3RlIHRoYXQgdGhlIGBNYXR0ZXIuV29ybGRgIG9iamVjdCBpcyBhbHNvIGEgdHlwZSBvZiBgTWF0dGVyLkNvbXBvc2l0ZWAgYW5kIGFzIHN1Y2ggYWxsIGNvbXBvc2l0ZSBtZXRob2RzIGhlcmUgY2FuIGFsc28gb3BlcmF0ZSBvbiBhIGBNYXR0ZXIuV29ybGRgLlxyXG4qXHJcbiogU2VlIHRoZSBpbmNsdWRlZCB1c2FnZSBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9saWFicnUvbWF0dGVyLWpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzKS5cclxuKlxyXG4qIEBjbGFzcyBDb21wb3NpdGVcclxuKi9cclxuXHJcbnZhciBDb21wb3NpdGUgPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29tcG9zaXRlO1xyXG5cclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2NvcmUvRXZlbnRzJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi9Cb2R5Jyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBvc2l0ZS4gVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXHJcbiAgICAgKiBTZWUgdGhlIHByb3Blcml0ZXMgc2VjdGlvbiBiZWxvdyBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBjcmVhdGVcclxuICAgICAqIEBwYXJhbSB7fSBbb3B0aW9uc11cclxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gQSBuZXcgY29tcG9zaXRlXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIENvbW1vbi5leHRlbmQoeyBcclxuICAgICAgICAgICAgaWQ6IENvbW1vbi5uZXh0SWQoKSxcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvc2l0ZScsXHJcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcclxuICAgICAgICAgICAgaXNNb2RpZmllZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGJvZGllczogW10sIFxyXG4gICAgICAgICAgICBjb25zdHJhaW50czogW10sIFxyXG4gICAgICAgICAgICBjb21wb3NpdGVzOiBbXSxcclxuICAgICAgICAgICAgbGFiZWw6ICdDb21wb3NpdGUnLFxyXG4gICAgICAgICAgICBwbHVnaW46IHt9XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9zaXRlJ3MgYGlzTW9kaWZpZWRgIGZsYWcuIFxyXG4gICAgICogSWYgYHVwZGF0ZVBhcmVudHNgIGlzIHRydWUsIGFsbCBwYXJlbnRzIHdpbGwgYmUgc2V0IChkZWZhdWx0OiBmYWxzZSkuXHJcbiAgICAgKiBJZiBgdXBkYXRlQ2hpbGRyZW5gIGlzIHRydWUsIGFsbCBjaGlsZHJlbiB3aWxsIGJlIHNldCAoZGVmYXVsdDogZmFsc2UpLlxyXG4gICAgICogQG1ldGhvZCBzZXRNb2RpZmllZFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc01vZGlmaWVkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVQYXJlbnRzPWZhbHNlXVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlQ2hpbGRyZW49ZmFsc2VdXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgaXNNb2RpZmllZCwgdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4pIHtcclxuXHJcbiAgICAgICAgRXZlbnRzLnRyaWdnZXIoY29tcG9zaXRlLCAnY29tcG9zaXRlTW9kaWZpZWQnLCBjb21wb3NpdGUpO1xyXG5cclxuICAgICAgICBjb21wb3NpdGUuaXNNb2RpZmllZCA9IGlzTW9kaWZpZWQ7XHJcblxyXG4gICAgICAgIGlmICh1cGRhdGVQYXJlbnRzICYmIGNvbXBvc2l0ZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZS5wYXJlbnQsIGlzTW9kaWZpZWQsIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh1cGRhdGVDaGlsZHJlbikge1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5jb21wb3NpdGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNoaWxkQ29tcG9zaXRlLCBpc01vZGlmaWVkLCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJpYyBhZGQgZnVuY3Rpb24uIEFkZHMgb25lIG9yIG1hbnkgYm9keShzKSwgY29uc3RyYWludChzKSBvciBhIGNvbXBvc2l0ZShzKSB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxyXG4gICAgICogVHJpZ2dlcnMgYGJlZm9yZUFkZGAgYW5kIGBhZnRlckFkZGAgZXZlbnRzIG9uIHRoZSBgY29tcG9zaXRlYC5cclxuICAgICAqIEBtZXRob2QgYWRkXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgb2JqZWN0cyBhZGRlZFxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUuYWRkID0gZnVuY3Rpb24oY29tcG9zaXRlLCBvYmplY3QpIHtcclxuICAgICAgICB2YXIgb2JqZWN0cyA9IFtdLmNvbmNhdChvYmplY3QpO1xyXG5cclxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdiZWZvcmVBZGQnLCB7IG9iamVjdDogb2JqZWN0IH0pO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9IG9iamVjdHNbaV07XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICAgICAgICAgIC8vIHNraXAgYWRkaW5nIGNvbXBvdW5kIHBhcnRzXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLnBhcmVudCAhPT0gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oJ0NvbXBvc2l0ZS5hZGQ6IHNraXBwZWQgYWRkaW5nIGEgY29tcG91bmQgYm9keSBwYXJ0ICh5b3UgbXVzdCBhZGQgaXRzIHBhcmVudCBpbnN0ZWFkKScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRCb2R5KGNvbXBvc2l0ZSwgb2JqKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdjb25zdHJhaW50JzpcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdjb21wb3NpdGUnOlxyXG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbXBvc2l0ZShjb21wb3NpdGUsIG9iaik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbW91c2VDb25zdHJhaW50JzpcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqLmNvbnN0cmFpbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdhZnRlckFkZCcsIHsgb2JqZWN0OiBvYmplY3QgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJpYyByZW1vdmUgZnVuY3Rpb24uIFJlbW92ZXMgb25lIG9yIG1hbnkgYm9keShzKSwgY29uc3RyYWludChzKSBvciBhIGNvbXBvc2l0ZShzKSB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxyXG4gICAgICogT3B0aW9uYWxseSBzZWFyY2hpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogVHJpZ2dlcnMgYGJlZm9yZVJlbW92ZWAgYW5kIGBhZnRlclJlbW92ZWAgZXZlbnRzIG9uIHRoZSBgY29tcG9zaXRlYC5cclxuICAgICAqIEBtZXRob2QgcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIG9iamVjdHMgcmVtb3ZlZFxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUucmVtb3ZlID0gZnVuY3Rpb24oY29tcG9zaXRlLCBvYmplY3QsIGRlZXApIHtcclxuICAgICAgICB2YXIgb2JqZWN0cyA9IFtdLmNvbmNhdChvYmplY3QpO1xyXG5cclxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdiZWZvcmVSZW1vdmUnLCB7IG9iamVjdDogb2JqZWN0IH0pO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9IG9iamVjdHNbaV07XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVCb2R5KGNvbXBvc2l0ZSwgb2JqLCBkZWVwKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdjb25zdHJhaW50JzpcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqLCBkZWVwKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdjb21wb3NpdGUnOlxyXG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZShjb21wb3NpdGUsIG9iaiwgZGVlcCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbW91c2VDb25zdHJhaW50JzpcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50KGNvbXBvc2l0ZSwgb2JqLmNvbnN0cmFpbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFdmVudHMudHJpZ2dlcihjb21wb3NpdGUsICdhZnRlclJlbW92ZScsIHsgb2JqZWN0OiBvYmplY3QgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGNvbXBvc2l0ZSB0byB0aGUgZ2l2ZW4gY29tcG9zaXRlLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2QgYWRkQ29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlQVxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZUJcclxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZUEgd2l0aCB0aGUgb2JqZWN0cyBmcm9tIGNvbXBvc2l0ZUIgYWRkZWRcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLmFkZENvbXBvc2l0ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZUEsIGNvbXBvc2l0ZUIpIHtcclxuICAgICAgICBjb21wb3NpdGVBLmNvbXBvc2l0ZXMucHVzaChjb21wb3NpdGVCKTtcclxuICAgICAgICBjb21wb3NpdGVCLnBhcmVudCA9IGNvbXBvc2l0ZUE7XHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZUEsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlQTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY29tcG9zaXRlIGZyb20gdGhlIGdpdmVuIGNvbXBvc2l0ZSwgYW5kIG9wdGlvbmFsbHkgc2VhcmNoaW5nIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAbWV0aG9kIHJlbW92ZUNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZUFcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVCXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlQSB3aXRoIHRoZSBjb21wb3NpdGUgcmVtb3ZlZFxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUucmVtb3ZlQ29tcG9zaXRlID0gZnVuY3Rpb24oY29tcG9zaXRlQSwgY29tcG9zaXRlQiwgZGVlcCkge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IGNvbXBvc2l0ZUEuY29tcG9zaXRlcy5pbmRleE9mKGNvbXBvc2l0ZUIpO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZUF0KGNvbXBvc2l0ZUEsIHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZUEsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZWVwKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlQS5jb21wb3NpdGVzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVDb21wb3NpdGUoY29tcG9zaXRlQS5jb21wb3NpdGVzW2ldLCBjb21wb3NpdGVCLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNvbXBvc2l0ZSBmcm9tIHRoZSBnaXZlbiBjb21wb3NpdGUuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQG1ldGhvZCByZW1vdmVDb21wb3NpdGVBdFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgY29tcG9zaXRlIHJlbW92ZWRcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLnJlbW92ZUNvbXBvc2l0ZUF0ID0gZnVuY3Rpb24oY29tcG9zaXRlLCBwb3NpdGlvbikge1xyXG4gICAgICAgIGNvbXBvc2l0ZS5jb21wb3NpdGVzLnNwbGljZShwb3NpdGlvbiwgMSk7XHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGJvZHkgdG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAbWV0aG9kIGFkZEJvZHlcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGJvZHkgYWRkZWRcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLmFkZEJvZHkgPSBmdW5jdGlvbihjb21wb3NpdGUsIGJvZHkpIHtcclxuICAgICAgICBjb21wb3NpdGUuYm9kaWVzLnB1c2goYm9keSk7XHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGJvZHkgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBhbmQgb3B0aW9uYWxseSBzZWFyY2hpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2QgcmVtb3ZlQm9keVxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGJvZHkgcmVtb3ZlZFxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUucmVtb3ZlQm9keSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgYm9keSwgZGVlcCkge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IGNvbXBvc2l0ZS5ib2RpZXMuaW5kZXhPZihib2R5KTtcclxuICAgICAgICBpZiAocG9zaXRpb24gIT09IC0xKSB7XHJcbiAgICAgICAgICAgIENvbXBvc2l0ZS5yZW1vdmVCb2R5QXQoY29tcG9zaXRlLCBwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZWVwKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUJvZHkoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0sIGJvZHksIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBib2R5IGZyb20gdGhlIGdpdmVuIGNvbXBvc2l0ZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAbWV0aG9kIHJlbW92ZUJvZHlBdFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgYm9keSByZW1vdmVkXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5yZW1vdmVCb2R5QXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIHBvc2l0aW9uKSB7XHJcbiAgICAgICAgY29tcG9zaXRlLmJvZGllcy5zcGxpY2UocG9zaXRpb24sIDEpO1xyXG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBnaXZlbiBjb21wb3NpdGUuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQG1ldGhvZCBhZGRDb25zdHJhaW50XHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge2NvbnN0cmFpbnR9IGNvbnN0cmFpbnRcclxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gVGhlIG9yaWdpbmFsIGNvbXBvc2l0ZSB3aXRoIHRoZSBjb25zdHJhaW50IGFkZGVkXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50ID0gZnVuY3Rpb24oY29tcG9zaXRlLCBjb25zdHJhaW50KSB7XHJcbiAgICAgICAgY29tcG9zaXRlLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNvbnN0cmFpbnQgZnJvbSB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBhbmQgb3B0aW9uYWxseSBzZWFyY2hpbmcgaXRzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2QgcmVtb3ZlQ29uc3RyYWludFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtjb25zdHJhaW50fSBjb25zdHJhaW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgY29tcG9zaXRlIHdpdGggdGhlIGNvbnN0cmFpbnQgcmVtb3ZlZFxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUucmVtb3ZlQ29uc3RyYWludCA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgY29uc3RyYWludCwgZGVlcCkge1xyXG4gICAgICAgIHZhciBwb3NpdGlvbiA9IGNvbXBvc2l0ZS5jb25zdHJhaW50cy5pbmRleE9mKGNvbnN0cmFpbnQpO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbnN0cmFpbnRBdChjb21wb3NpdGUsIHBvc2l0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZWVwKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgQ29tcG9zaXRlLnJlbW92ZUNvbnN0cmFpbnQoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0sIGNvbnN0cmFpbnQsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBib2R5IGZyb20gdGhlIGdpdmVuIGNvbXBvc2l0ZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAbWV0aG9kIHJlbW92ZUNvbnN0cmFpbnRBdFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFRoZSBvcmlnaW5hbCBjb21wb3NpdGUgd2l0aCB0aGUgY29uc3RyYWludCByZW1vdmVkXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5yZW1vdmVDb25zdHJhaW50QXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIHBvc2l0aW9uKSB7XHJcbiAgICAgICAgY29tcG9zaXRlLmNvbnN0cmFpbnRzLnNwbGljZShwb3NpdGlvbiwgMSk7XHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgYm9kaWVzLCBjb25zdHJhaW50cyBhbmQgY29tcG9zaXRlcyBmcm9tIHRoZSBnaXZlbiBjb21wb3NpdGUuXHJcbiAgICAgKiBPcHRpb25hbGx5IGNsZWFyaW5nIGl0cyBjaGlsZHJlbiByZWN1cnNpdmVseS5cclxuICAgICAqIEBtZXRob2QgY2xlYXJcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0ga2VlcFN0YXRpY1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVlcD1mYWxzZV1cclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLmNsZWFyID0gZnVuY3Rpb24oY29tcG9zaXRlLCBrZWVwU3RhdGljLCBkZWVwKSB7XHJcbiAgICAgICAgaWYgKGRlZXApIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBDb21wb3NpdGUuY2xlYXIoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0sIGtlZXBTdGF0aWMsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChrZWVwU3RhdGljKSB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5ib2RpZXMgPSBjb21wb3NpdGUuYm9kaWVzLmZpbHRlcihmdW5jdGlvbihib2R5KSB7IHJldHVybiBib2R5LmlzU3RhdGljOyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb3NpdGUuYm9kaWVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb3NpdGUuY29uc3RyYWludHMubGVuZ3RoID0gMDtcclxuICAgICAgICBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCBib2RpZXMgaW4gdGhlIGdpdmVuIGNvbXBvc2l0ZSwgaW5jbHVkaW5nIGFsbCBib2RpZXMgaW4gaXRzIGNoaWxkcmVuLCByZWN1cnNpdmVseS5cclxuICAgICAqIEBtZXRob2QgYWxsQm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5W119IEFsbCB0aGUgYm9kaWVzXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5hbGxCb2RpZXMgPSBmdW5jdGlvbihjb21wb3NpdGUpIHtcclxuICAgICAgICB2YXIgYm9kaWVzID0gW10uY29uY2F0KGNvbXBvc2l0ZS5ib2RpZXMpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvc2l0ZS5jb21wb3NpdGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICBib2RpZXMgPSBib2RpZXMuY29uY2F0KENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlLmNvbXBvc2l0ZXNbaV0pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGJvZGllcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCBjb25zdHJhaW50cyBpbiB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBpbmNsdWRpbmcgYWxsIGNvbnN0cmFpbnRzIGluIGl0cyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkuXHJcbiAgICAgKiBAbWV0aG9kIGFsbENvbnN0cmFpbnRzXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcmV0dXJuIHtjb25zdHJhaW50W119IEFsbCB0aGUgY29uc3RyYWludHNcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzID0gZnVuY3Rpb24oY29tcG9zaXRlKSB7XHJcbiAgICAgICAgdmFyIGNvbnN0cmFpbnRzID0gW10uY29uY2F0KGNvbXBvc2l0ZS5jb25zdHJhaW50cyk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9zaXRlLmNvbXBvc2l0ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gY29uc3RyYWludHMuY29uY2F0KENvbXBvc2l0ZS5hbGxDb25zdHJhaW50cyhjb21wb3NpdGUuY29tcG9zaXRlc1tpXSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29uc3RyYWludHM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgY29tcG9zaXRlcyBpbiB0aGUgZ2l2ZW4gY29tcG9zaXRlLCBpbmNsdWRpbmcgYWxsIGNvbXBvc2l0ZXMgaW4gaXRzIGNoaWxkcmVuLCByZWN1cnNpdmVseS5cclxuICAgICAqIEBtZXRob2QgYWxsQ29tcG9zaXRlc1xyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlW119IEFsbCB0aGUgY29tcG9zaXRlc1xyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUuYWxsQ29tcG9zaXRlcyA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSkge1xyXG4gICAgICAgIHZhciBjb21wb3NpdGVzID0gW10uY29uY2F0KGNvbXBvc2l0ZS5jb21wb3NpdGVzKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb3NpdGUuY29tcG9zaXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgY29tcG9zaXRlcyA9IGNvbXBvc2l0ZXMuY29uY2F0KENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzKGNvbXBvc2l0ZS5jb21wb3NpdGVzW2ldKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGVzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlYXJjaGVzIHRoZSBjb21wb3NpdGUgcmVjdXJzaXZlbHkgZm9yIGFuIG9iamVjdCBtYXRjaGluZyB0aGUgdHlwZSBhbmQgaWQgc3VwcGxpZWQsIG51bGwgaWYgbm90IGZvdW5kLlxyXG4gICAgICogQG1ldGhvZCBnZXRcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHJlcXVlc3RlZCBvYmplY3QsIGlmIGZvdW5kXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5nZXQgPSBmdW5jdGlvbihjb21wb3NpdGUsIGlkLCB0eXBlKSB7XHJcbiAgICAgICAgdmFyIG9iamVjdHMsXHJcbiAgICAgICAgICAgIG9iamVjdDtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnYm9keSc6XHJcbiAgICAgICAgICAgIG9iamVjdHMgPSBDb21wb3NpdGUuYWxsQm9kaWVzKGNvbXBvc2l0ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NvbnN0cmFpbnQnOlxyXG4gICAgICAgICAgICBvYmplY3RzID0gQ29tcG9zaXRlLmFsbENvbnN0cmFpbnRzKGNvbXBvc2l0ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NvbXBvc2l0ZSc6XHJcbiAgICAgICAgICAgIG9iamVjdHMgPSBDb21wb3NpdGUuYWxsQ29tcG9zaXRlcyhjb21wb3NpdGUpLmNvbmNhdChjb21wb3NpdGUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2JqZWN0cylcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIG9iamVjdCA9IG9iamVjdHMuZmlsdGVyKGZ1bmN0aW9uKG9iamVjdCkgeyBcclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5pZC50b1N0cmluZygpID09PSBpZC50b1N0cmluZygpOyBcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9iamVjdC5sZW5ndGggPT09IDAgPyBudWxsIDogb2JqZWN0WzBdO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBnaXZlbiBvYmplY3QocykgZnJvbSBjb21wb3NpdGVBIHRvIGNvbXBvc2l0ZUIgKGVxdWFsIHRvIGEgcmVtb3ZlIGZvbGxvd2VkIGJ5IGFuIGFkZCkuXHJcbiAgICAgKiBAbWV0aG9kIG1vdmVcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlQX0gY29tcG9zaXRlQVxyXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gb2JqZWN0c1xyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGVCfSBjb21wb3NpdGVCXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFJldHVybnMgY29tcG9zaXRlQVxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUubW92ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZUEsIG9iamVjdHMsIGNvbXBvc2l0ZUIpIHtcclxuICAgICAgICBDb21wb3NpdGUucmVtb3ZlKGNvbXBvc2l0ZUEsIG9iamVjdHMpO1xyXG4gICAgICAgIENvbXBvc2l0ZS5hZGQoY29tcG9zaXRlQiwgb2JqZWN0cyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzaWducyBuZXcgaWRzIGZvciBhbGwgb2JqZWN0cyBpbiB0aGUgY29tcG9zaXRlLCByZWN1cnNpdmVseS5cclxuICAgICAqIEBtZXRob2QgcmViYXNlXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IFJldHVybnMgY29tcG9zaXRlXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5yZWJhc2UgPSBmdW5jdGlvbihjb21wb3NpdGUpIHtcclxuICAgICAgICB2YXIgb2JqZWN0cyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKVxyXG4gICAgICAgICAgICAuY29uY2F0KENvbXBvc2l0ZS5hbGxDb25zdHJhaW50cyhjb21wb3NpdGUpKVxyXG4gICAgICAgICAgICAuY29uY2F0KENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzKGNvbXBvc2l0ZSkpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgb2JqZWN0c1tpXS5pZCA9IENvbW1vbi5uZXh0SWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2xhdGVzIGFsbCBjaGlsZHJlbiBpbiB0aGUgY29tcG9zaXRlIGJ5IGEgZ2l2ZW4gdmVjdG9yIHJlbGF0aXZlIHRvIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25zLCBcclxuICAgICAqIHdpdGhvdXQgaW1wYXJ0aW5nIGFueSB2ZWxvY2l0eS5cclxuICAgICAqIEBtZXRob2QgdHJhbnNsYXRlXHJcbiAgICAgKiBAcGFyYW0ge2NvbXBvc2l0ZX0gY29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdHJhbnNsYXRpb25cclxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW3JlY3Vyc2l2ZT10cnVlXVxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUudHJhbnNsYXRlID0gZnVuY3Rpb24oY29tcG9zaXRlLCB0cmFuc2xhdGlvbiwgcmVjdXJzaXZlKSB7XHJcbiAgICAgICAgdmFyIGJvZGllcyA9IHJlY3Vyc2l2ZSA/IENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKSA6IGNvbXBvc2l0ZS5ib2RpZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIEJvZHkudHJhbnNsYXRlKGJvZGllc1tpXSwgdHJhbnNsYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKGNvbXBvc2l0ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZXMgYWxsIGNoaWxkcmVuIGluIHRoZSBjb21wb3NpdGUgYnkgYSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgZ2l2ZW4gcG9pbnQsIHdpdGhvdXQgaW1wYXJ0aW5nIGFueSBhbmd1bGFyIHZlbG9jaXR5LlxyXG4gICAgICogQG1ldGhvZCByb3RhdGVcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvblxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHBvaW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtyZWN1cnNpdmU9dHJ1ZV1cclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlLnJvdGF0ZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgcm90YXRpb24sIHBvaW50LCByZWN1cnNpdmUpIHtcclxuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3Mocm90YXRpb24pLFxyXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihyb3RhdGlvbiksXHJcbiAgICAgICAgICAgIGJvZGllcyA9IHJlY3Vyc2l2ZSA/IENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKSA6IGNvbXBvc2l0ZS5ib2RpZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldLFxyXG4gICAgICAgICAgICAgICAgZHggPSBib2R5LnBvc2l0aW9uLnggLSBwb2ludC54LFxyXG4gICAgICAgICAgICAgICAgZHkgPSBib2R5LnBvc2l0aW9uLnkgLSBwb2ludC55O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIEJvZHkuc2V0UG9zaXRpb24oYm9keSwge1xyXG4gICAgICAgICAgICAgICAgeDogcG9pbnQueCArIChkeCAqIGNvcyAtIGR5ICogc2luKSxcclxuICAgICAgICAgICAgICAgIHk6IHBvaW50LnkgKyAoZHggKiBzaW4gKyBkeSAqIGNvcylcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LnJvdGF0ZShib2R5LCByb3RhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBDb21wb3NpdGUuc2V0TW9kaWZpZWQoY29tcG9zaXRlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIGFsbCBjaGlsZHJlbiBpbiB0aGUgY29tcG9zaXRlLCBpbmNsdWRpbmcgdXBkYXRpbmcgcGh5c2ljYWwgcHJvcGVydGllcyAobWFzcywgYXJlYSwgYXhlcywgaW5lcnRpYSksIGZyb20gYSB3b3JsZC1zcGFjZSBwb2ludC5cclxuICAgICAqIEBtZXRob2Qgc2NhbGVcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVlcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb2ludFxyXG4gICAgICogQHBhcmFtIHtib29sfSBbcmVjdXJzaXZlPXRydWVdXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZS5zY2FsZSA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgc2NhbGVYLCBzY2FsZVksIHBvaW50LCByZWN1cnNpdmUpIHtcclxuICAgICAgICB2YXIgYm9kaWVzID0gcmVjdXJzaXZlID8gQ29tcG9zaXRlLmFsbEJvZGllcyhjb21wb3NpdGUpIDogY29tcG9zaXRlLmJvZGllcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBkeCA9IGJvZHkucG9zaXRpb24ueCAtIHBvaW50LngsXHJcbiAgICAgICAgICAgICAgICBkeSA9IGJvZHkucG9zaXRpb24ueSAtIHBvaW50Lnk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgQm9keS5zZXRQb3NpdGlvbihib2R5LCB7XHJcbiAgICAgICAgICAgICAgICB4OiBwb2ludC54ICsgZHggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgICAgICB5OiBwb2ludC55ICsgZHkgKiBzY2FsZVlcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBCb2R5LnNjYWxlKGJvZHksIHNjYWxlWCwgc2NhbGVZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIENvbXBvc2l0ZS5zZXRNb2RpZmllZChjb21wb3NpdGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGUgYm91bmRzIG9mIGFsbCBvZiB0aGUgY29tcG9zaXRlJ3MgYm9kaWVzLlxyXG4gICAgICogQG1ldGhvZCBib3VuZHNcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGUgVGhlIGNvbXBvc2l0ZS5cclxuICAgICAqIEByZXR1cm5zIHtib3VuZHN9IFRoZSBjb21wb3NpdGUgYm91bmRzLlxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGUuYm91bmRzID0gZnVuY3Rpb24oY29tcG9zaXRlKSB7XHJcbiAgICAgICAgdmFyIGJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKSxcclxuICAgICAgICAgICAgdmVydGljZXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcbiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goYm9keS5ib3VuZHMubWluLCBib2R5LmJvdW5kcy5tYXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEJvdW5kcy5jcmVhdGUodmVydGljZXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKlxyXG4gICAgKlxyXG4gICAgKiAgRXZlbnRzIERvY3VtZW50YXRpb25cclxuICAgICpcclxuICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZpcmVkIHdoZW4gYSBjYWxsIHRvIGBDb21wb3NpdGUuYWRkYCBpcyBtYWRlLCBiZWZvcmUgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBiZWZvcmVBZGRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQub2JqZWN0IFRoZSBvYmplY3QocykgdG8gYmUgYWRkZWQgKG1heSBiZSBhIHNpbmdsZSBib2R5LCBjb25zdHJhaW50LCBjb21wb3NpdGUgb3IgYSBtaXhlZCBhcnJheSBvZiB0aGVzZSlcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCB3aGVuIGEgY2FsbCB0byBgQ29tcG9zaXRlLmFkZGAgaXMgbWFkZSwgYWZ0ZXIgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBhZnRlckFkZFxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5vYmplY3QgVGhlIG9iamVjdChzKSB0aGF0IGhhdmUgYmVlbiBhZGRlZCAobWF5IGJlIGEgc2luZ2xlIGJvZHksIGNvbnN0cmFpbnQsIGNvbXBvc2l0ZSBvciBhIG1peGVkIGFycmF5IG9mIHRoZXNlKVxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQuc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0IG9mIHRoZSBldmVudFxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQubmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZpcmVkIHdoZW4gYSBjYWxsIHRvIGBDb21wb3NpdGUucmVtb3ZlYCBpcyBtYWRlLCBiZWZvcmUgb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZC5cclxuICAgICpcclxuICAgICogQGV2ZW50IGJlZm9yZVJlbW92ZVxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5vYmplY3QgVGhlIG9iamVjdChzKSB0byBiZSByZW1vdmVkIChtYXkgYmUgYSBzaW5nbGUgYm9keSwgY29uc3RyYWludCwgY29tcG9zaXRlIG9yIGEgbWl4ZWQgYXJyYXkgb2YgdGhlc2UpXHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICogRmlyZWQgd2hlbiBhIGNhbGwgdG8gYENvbXBvc2l0ZS5yZW1vdmVgIGlzIG1hZGUsIGFmdGVyIG9iamVjdHMgaGF2ZSBiZWVuIHJlbW92ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBhZnRlclJlbW92ZVxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQgQW4gZXZlbnQgb2JqZWN0XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5vYmplY3QgVGhlIG9iamVjdChzKSB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIChtYXkgYmUgYSBzaW5nbGUgYm9keSwgY29uc3RyYWludCwgY29tcG9zaXRlIG9yIGEgbWl4ZWQgYXJyYXkgb2YgdGhlc2UpXHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgKi9cclxuXHJcbiAgICAvKlxyXG4gICAgKlxyXG4gICAgKiAgUHJvcGVydGllcyBEb2N1bWVudGF0aW9uXHJcbiAgICAqXHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB1bmlxdWVseSBpZGVudGlmeWluZyBudW1iZXIgZ2VuZXJhdGVkIGluIGBDb21wb3NpdGUuY3JlYXRlYCBieSBgQ29tbW9uLm5leHRJZGAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlkXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgU3RyaW5nYCBkZW5vdGluZyB0aGUgdHlwZSBvZiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHR5cGVcclxuICAgICAqIEB0eXBlIHN0cmluZ1xyXG4gICAgICogQGRlZmF1bHQgXCJjb21wb3NpdGVcIlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFyYml0cmFyeSBgU3RyaW5nYCBuYW1lIHRvIGhlbHAgdGhlIHVzZXIgaWRlbnRpZnkgYW5kIG1hbmFnZSBjb21wb3NpdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBsYWJlbFxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKiBAZGVmYXVsdCBcIkNvbXBvc2l0ZVwiXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gbW9kaWZpZWQgZHVyaW5nIHRoZSBjdXJyZW50IHN0ZXAuXHJcbiAgICAgKiBNb3N0IGBNYXR0ZXIuQ29tcG9zaXRlYCBtZXRob2RzIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhpcyBmbGFnIHRvIGB0cnVlYCB0byBpbmZvcm0gdGhlIGVuZ2luZSBvZiBjaGFuZ2VzIHRvIGJlIGhhbmRsZWQuXHJcbiAgICAgKiBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgaXQgbWFudWFsbHksIHlvdSBzaG91bGQgdXNlIHRoZSBgQ29tcG9zaXRlLnNldE1vZGlmaWVkYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGlzTW9kaWZpZWRcclxuICAgICAqIEB0eXBlIGJvb2xlYW5cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBgQ29tcG9zaXRlYCB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBjb21wb3NpdGUuIEl0IGlzIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGUgYE1hdHRlci5Db21wb3NpdGVgIG1ldGhvZHMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHBhcmVudFxyXG4gICAgICogQHR5cGUgY29tcG9zaXRlXHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGBCb2R5YCB0aGF0IGFyZSBfZGlyZWN0XyBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvc2l0ZS5cclxuICAgICAqIFRvIGFkZCBvciByZW1vdmUgYm9kaWVzIHlvdSBzaG91bGQgdXNlIGBDb21wb3NpdGUuYWRkYCBhbmQgYENvbXBvc2l0ZS5yZW1vdmVgIG1ldGhvZHMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZWN1cnNpdmVseSBmaW5kIGFsbCBkZXNjZW5kYW50cywgeW91IHNob3VsZCB1c2UgdGhlIGBDb21wb3NpdGUuYWxsQm9kaWVzYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGJvZGllc1xyXG4gICAgICogQHR5cGUgYm9keVtdXHJcbiAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBgQ29uc3RyYWludGAgdGhhdCBhcmUgX2RpcmVjdF8gY2hpbGRyZW4gb2YgdGhpcyBjb21wb3NpdGUuXHJcbiAgICAgKiBUbyBhZGQgb3IgcmVtb3ZlIGNvbnN0cmFpbnRzIHlvdSBzaG91bGQgdXNlIGBDb21wb3NpdGUuYWRkYCBhbmQgYENvbXBvc2l0ZS5yZW1vdmVgIG1ldGhvZHMgcmF0aGVyIHRoYW4gZGlyZWN0bHkgbW9kaWZ5aW5nIHRoaXMgcHJvcGVydHkuXHJcbiAgICAgKiBJZiB5b3Ugd2lzaCB0byByZWN1cnNpdmVseSBmaW5kIGFsbCBkZXNjZW5kYW50cywgeW91IHNob3VsZCB1c2UgdGhlIGBDb21wb3NpdGUuYWxsQ29uc3RyYWludHNgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY29uc3RyYWludHNcclxuICAgICAqIEB0eXBlIGNvbnN0cmFpbnRbXVxyXG4gICAgICogQGRlZmF1bHQgW11cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgYENvbXBvc2l0ZWAgdGhhdCBhcmUgX2RpcmVjdF8gY2hpbGRyZW4gb2YgdGhpcyBjb21wb3NpdGUuXHJcbiAgICAgKiBUbyBhZGQgb3IgcmVtb3ZlIGNvbXBvc2l0ZXMgeW91IHNob3VsZCB1c2UgYENvbXBvc2l0ZS5hZGRgIGFuZCBgQ29tcG9zaXRlLnJlbW92ZWAgbWV0aG9kcyByYXRoZXIgdGhhbiBkaXJlY3RseSBtb2RpZnlpbmcgdGhpcyBwcm9wZXJ0eS5cclxuICAgICAqIElmIHlvdSB3aXNoIHRvIHJlY3Vyc2l2ZWx5IGZpbmQgYWxsIGRlc2NlbmRhbnRzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgYENvbXBvc2l0ZS5hbGxDb21wb3NpdGVzYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGNvbXBvc2l0ZXNcclxuICAgICAqIEB0eXBlIGNvbXBvc2l0ZVtdXHJcbiAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBvYmplY3QgcmVzZXJ2ZWQgZm9yIHN0b3JpbmcgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHBsdWdpblxyXG4gICAgICogQHR5cGUge31cclxuICAgICAqL1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuV29ybGRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZSB3b3JsZCBjb21wb3NpdGUuXHJcbiogQSBgTWF0dGVyLldvcmxkYCBpcyBhIGBNYXR0ZXIuQ29tcG9zaXRlYCBib2R5LCB3aGljaCBpcyBhIGNvbGxlY3Rpb24gb2YgYE1hdHRlci5Cb2R5YCwgYE1hdHRlci5Db25zdHJhaW50YCBhbmQgb3RoZXIgYE1hdHRlci5Db21wb3NpdGVgLlxyXG4qIEEgYE1hdHRlci5Xb3JsZGAgaGFzIGEgZmV3IGFkZGl0aW9uYWwgcHJvcGVydGllcyBpbmNsdWRpbmcgYGdyYXZpdHlgIGFuZCBgYm91bmRzYC5cclxuKiBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBmdW5jdGlvbnMgaW4gdGhlIGBNYXR0ZXIuQ29tcG9zaXRlYCBtb2R1bGUgdG8gbW9kaWZ5IHRoZSB3b3JsZCBjb21wb3NpdGUsIHJhdGhlciB0aGFuIGRpcmVjdGx5IG1vZGlmeWluZyBpdHMgcHJvcGVydGllcy5cclxuKiBUaGVyZSBhcmUgYWxzbyBhIGZldyBtZXRob2RzIGhlcmUgdGhhdCBhbGlhcyB0aG9zZSBpbiBgTWF0dGVyLkNvbXBvc2l0ZWAgZm9yIGVhc2llciByZWFkYWJpbGl0eS5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgV29ybGRcclxuKiBAZXh0ZW5kcyBDb21wb3NpdGVcclxuKi9cclxuXHJcbnZhciBXb3JsZCA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXb3JsZDtcclxuXHJcbnZhciBDb21wb3NpdGUgPSByZXF1aXJlKCcuL0NvbXBvc2l0ZScpO1xyXG52YXIgQ29uc3RyYWludCA9IHJlcXVpcmUoJy4uL2NvbnN0cmFpbnQvQ29uc3RyYWludCcpO1xyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi4vY29yZS9Db21tb24nKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgd29ybGQgY29tcG9zaXRlLiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cclxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIGJlbG93IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHlvdSBjYW4gcGFzcyB2aWEgdGhlIGBvcHRpb25zYCBvYmplY3QuXHJcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xyXG4gICAgICogQHJldHVybiB7d29ybGR9IEEgbmV3IHdvcmxkXHJcbiAgICAgKi9cclxuICAgIFdvcmxkLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgY29tcG9zaXRlID0gQ29tcG9zaXRlLmNyZWF0ZSgpO1xyXG5cclxuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgICAgIGxhYmVsOiAnV29ybGQnLFxyXG4gICAgICAgICAgICBncmF2aXR5OiB7XHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMSxcclxuICAgICAgICAgICAgICAgIHNjYWxlOiAwLjAwMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBib3VuZHM6IHsgXHJcbiAgICAgICAgICAgICAgICBtaW46IHsgeDogLUluZmluaXR5LCB5OiAtSW5maW5pdHkgfSwgXHJcbiAgICAgICAgICAgICAgICBtYXg6IHsgeDogSW5maW5pdHksIHk6IEluZmluaXR5IH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBDb21tb24uZXh0ZW5kKGNvbXBvc2l0ZSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKlxyXG4gICAgKlxyXG4gICAgKiAgUHJvcGVydGllcyBEb2N1bWVudGF0aW9uXHJcbiAgICAqXHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGdyYXZpdHkgdG8gYXBwbHkgb24gdGhlIHdvcmxkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBncmF2aXR5XHJcbiAgICAgKiBAdHlwZSBvYmplY3RcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGdyYXZpdHkgeCBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGdyYXZpdHkueFxyXG4gICAgICogQHR5cGUgb2JqZWN0XHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBncmF2aXR5IHkgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBncmF2aXR5LnlcclxuICAgICAqIEB0eXBlIG9iamVjdFxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ3Jhdml0eSBzY2FsZSBmYWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGdyYXZpdHkuc2NhbGVcclxuICAgICAqIEB0eXBlIG9iamVjdFxyXG4gICAgICogQGRlZmF1bHQgMC4wMDFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgQm91bmRzYCBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSB3b3JsZCBib3VuZHMgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGJvdW5kc1xyXG4gICAgICogQHR5cGUgYm91bmRzXHJcbiAgICAgKiBAZGVmYXVsdCB7IG1pbjogeyB4OiAtSW5maW5pdHksIHk6IC1JbmZpbml0eSB9LCBtYXg6IHsgeDogSW5maW5pdHksIHk6IEluZmluaXR5IH0gfVxyXG4gICAgICovXHJcblxyXG4gICAgLy8gV29ybGQgaXMgYSBDb21wb3NpdGUgYm9keVxyXG4gICAgLy8gc2VlIHNyYy9tb2R1bGUvT3V0cm8uanMgZm9yIHRoZXNlIGFsaWFzZXM6XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQW4gYWxpYXMgZm9yIENvbXBvc2l0ZS5hZGRcclxuICAgICAqIEBtZXRob2QgYWRkXHJcbiAgICAgKiBAcGFyYW0ge3dvcmxkfSB3b3JsZFxyXG4gICAgICogQHBhcmFtIHt9IG9iamVjdFxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgd29ybGQgd2l0aCB0aGUgb2JqZWN0cyBhZGRlZFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhbGlhcyBmb3IgQ29tcG9zaXRlLnJlbW92ZVxyXG4gICAgICogQG1ldGhvZCByZW1vdmVcclxuICAgICAqIEBwYXJhbSB7d29ybGR9IHdvcmxkXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWVwPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgb3JpZ2luYWwgd29ybGQgd2l0aCB0aGUgb2JqZWN0cyByZW1vdmVkXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFsaWFzIGZvciBDb21wb3NpdGUuY2xlYXJcclxuICAgICAqIEBtZXRob2QgY2xlYXJcclxuICAgICAqIEBwYXJhbSB7d29ybGR9IHdvcmxkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBTdGF0aWNcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYWxpYXMgZm9yIENvbXBvc2l0ZS5hZGRDb21wb3NpdGVcclxuICAgICAqIEBtZXRob2QgYWRkQ29tcG9zaXRlXHJcbiAgICAgKiBAcGFyYW0ge3dvcmxkfSB3b3JsZFxyXG4gICAgICogQHBhcmFtIHtjb21wb3NpdGV9IGNvbXBvc2l0ZVxyXG4gICAgICogQHJldHVybiB7d29ybGR9IFRoZSBvcmlnaW5hbCB3b3JsZCB3aXRoIHRoZSBvYmplY3RzIGZyb20gY29tcG9zaXRlIGFkZGVkXHJcbiAgICAgKi9cclxuICAgIFxyXG4gICAgIC8qKlxyXG4gICAgICAqIEFuIGFsaWFzIGZvciBDb21wb3NpdGUuYWRkQm9keVxyXG4gICAgICAqIEBtZXRob2QgYWRkQm9keVxyXG4gICAgICAqIEBwYXJhbSB7d29ybGR9IHdvcmxkXHJcbiAgICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgICogQHJldHVybiB7d29ybGR9IFRoZSBvcmlnaW5hbCB3b3JsZCB3aXRoIHRoZSBib2R5IGFkZGVkXHJcbiAgICAgICovXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICAqIEFuIGFsaWFzIGZvciBDb21wb3NpdGUuYWRkQ29uc3RyYWludFxyXG4gICAgICAqIEBtZXRob2QgYWRkQ29uc3RyYWludFxyXG4gICAgICAqIEBwYXJhbSB7d29ybGR9IHdvcmxkXHJcbiAgICAgICogQHBhcmFtIHtjb25zdHJhaW50fSBjb25zdHJhaW50XHJcbiAgICAgICogQHJldHVybiB7d29ybGR9IFRoZSBvcmlnaW5hbCB3b3JsZCB3aXRoIHRoZSBjb25zdHJhaW50IGFkZGVkXHJcbiAgICAgICovXHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5EZXRlY3RvcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGRldGVjdGluZyBjb2xsaXNpb25zIGdpdmVuIGEgc2V0IG9mIHBhaXJzLlxyXG4qXHJcbiogQGNsYXNzIERldGVjdG9yXHJcbiovXHJcblxyXG4vLyBUT0RPOiBzcGVjdWxhdGl2ZSBjb250YWN0c1xyXG5cclxudmFyIERldGVjdG9yID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERldGVjdG9yO1xyXG5cclxudmFyIFNBVCA9IHJlcXVpcmUoJy4vU0FUJyk7XHJcbnZhciBQYWlyID0gcmVxdWlyZSgnLi9QYWlyJyk7XHJcbnZhciBCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9Cb3VuZHMnKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGFsbCBjb2xsaXNpb25zIGdpdmVuIGEgbGlzdCBvZiBwYWlycy5cclxuICAgICAqIEBtZXRob2QgY29sbGlzaW9uc1xyXG4gICAgICogQHBhcmFtIHtwYWlyW119IGJyb2FkcGhhc2VQYWlyc1xyXG4gICAgICogQHBhcmFtIHtlbmdpbmV9IGVuZ2luZVxyXG4gICAgICogQHJldHVybiB7YXJyYXl9IGNvbGxpc2lvbnNcclxuICAgICAqL1xyXG4gICAgRGV0ZWN0b3IuY29sbGlzaW9ucyA9IGZ1bmN0aW9uKGJyb2FkcGhhc2VQYWlycywgZW5naW5lKSB7XHJcbiAgICAgICAgdmFyIGNvbGxpc2lvbnMgPSBbXSxcclxuICAgICAgICAgICAgcGFpcnNUYWJsZSA9IGVuZ2luZS5wYWlycy50YWJsZTtcclxuXHJcbiAgICAgICAgLy8gQGlmIERFQlVHXHJcbiAgICAgICAgdmFyIG1ldHJpY3MgPSBlbmdpbmUubWV0cmljcztcclxuICAgICAgICAvLyBAZW5kaWZcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJyb2FkcGhhc2VQYWlycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keUEgPSBicm9hZHBoYXNlUGFpcnNbaV1bMF0sIFxyXG4gICAgICAgICAgICAgICAgYm9keUIgPSBicm9hZHBoYXNlUGFpcnNbaV1bMV07XHJcblxyXG4gICAgICAgICAgICBpZiAoKGJvZHlBLmlzU3RhdGljIHx8IGJvZHlBLmlzU2xlZXBpbmcpICYmIChib2R5Qi5pc1N0YXRpYyB8fCBib2R5Qi5pc1NsZWVwaW5nKSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCFEZXRlY3Rvci5jYW5Db2xsaWRlKGJvZHlBLmNvbGxpc2lvbkZpbHRlciwgYm9keUIuY29sbGlzaW9uRmlsdGVyKSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gQGlmIERFQlVHXHJcbiAgICAgICAgICAgIG1ldHJpY3MubWlkcGhhc2VUZXN0cyArPSAxO1xyXG4gICAgICAgICAgICAvLyBAZW5kaWZcclxuXHJcbiAgICAgICAgICAgIC8vIG1pZCBwaGFzZVxyXG4gICAgICAgICAgICBpZiAoQm91bmRzLm92ZXJsYXBzKGJvZHlBLmJvdW5kcywgYm9keUIuYm91bmRzKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGJvZHlBLnBhcnRzLmxlbmd0aCA+IDEgPyAxIDogMDsgaiA8IGJvZHlBLnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRBID0gYm9keUEucGFydHNbal07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSBib2R5Qi5wYXJ0cy5sZW5ndGggPiAxID8gMSA6IDA7IGsgPCBib2R5Qi5wYXJ0cy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydEIgPSBib2R5Qi5wYXJ0c1trXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFydEEgPT09IGJvZHlBICYmIHBhcnRCID09PSBib2R5QikgfHwgQm91bmRzLm92ZXJsYXBzKHBhcnRBLmJvdW5kcywgcGFydEIuYm91bmRzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBhIHByZXZpb3VzIGNvbGxpc2lvbiB3ZSBjb3VsZCByZXVzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhaXJJZCA9IFBhaXIuaWQocGFydEEsIHBhcnRCKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyID0gcGFpcnNUYWJsZVtwYWlySWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29sbGlzaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIuaXNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbGxpc2lvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFycm93IHBoYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gU0FULmNvbGxpZGVzKHBhcnRBLCBwYXJ0QiwgcHJldmlvdXNDb2xsaXNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBpZiBERUJVR1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dwaGFzZVRlc3RzICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uLnJldXNlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLm5hcnJvd1JldXNlQ291bnQgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBlbmRpZlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb24uY29sbGlkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25zLnB1c2goY29sbGlzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAaWYgREVCVUdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLm5hcnJvd0RldGVjdGlvbnMgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAZW5kaWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxpc2lvbnM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYm90aCBzdXBwbGllZCBjb2xsaXNpb24gZmlsdGVycyB3aWxsIGFsbG93IGEgY29sbGlzaW9uIHRvIG9jY3VyLlxyXG4gICAgICogU2VlIGBib2R5LmNvbGxpc2lvbkZpbHRlcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAbWV0aG9kIGNhbkNvbGxpZGVcclxuICAgICAqIEBwYXJhbSB7fSBmaWx0ZXJBXHJcbiAgICAgKiBAcGFyYW0ge30gZmlsdGVyQlxyXG4gICAgICogQHJldHVybiB7Ym9vbH0gYHRydWVgIGlmIGNvbGxpc2lvbiBjYW4gb2NjdXJcclxuICAgICAqL1xyXG4gICAgRGV0ZWN0b3IuY2FuQ29sbGlkZSA9IGZ1bmN0aW9uKGZpbHRlckEsIGZpbHRlckIpIHtcclxuICAgICAgICBpZiAoZmlsdGVyQS5ncm91cCA9PT0gZmlsdGVyQi5ncm91cCAmJiBmaWx0ZXJBLmdyb3VwICE9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyQS5ncm91cCA+IDA7XHJcblxyXG4gICAgICAgIHJldHVybiAoZmlsdGVyQS5tYXNrICYgZmlsdGVyQi5jYXRlZ29yeSkgIT09IDAgJiYgKGZpbHRlckIubWFzayAmIGZpbHRlckEuY2F0ZWdvcnkpICE9PSAwO1xyXG4gICAgfTtcclxuXHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyLkdyaWRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGNvbGxpc2lvbiBicm9hZHBoYXNlIGdyaWQgc3RydWN0dXJlcy5cclxuKlxyXG4qIEBjbGFzcyBHcmlkXHJcbiovXHJcblxyXG52YXIgR3JpZCA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHcmlkO1xyXG5cclxudmFyIFBhaXIgPSByZXF1aXJlKCcuL1BhaXInKTtcclxudmFyIERldGVjdG9yID0gcmVxdWlyZSgnLi9EZXRlY3RvcicpO1xyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi4vY29yZS9Db21tb24nKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgZ3JpZC5cclxuICAgICAqIEBtZXRob2QgY3JlYXRlXHJcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xyXG4gICAgICogQHJldHVybiB7Z3JpZH0gQSBuZXcgZ3JpZFxyXG4gICAgICovXHJcbiAgICBHcmlkLmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IEdyaWQsXHJcbiAgICAgICAgICAgIGRldGVjdG9yOiBEZXRlY3Rvci5jb2xsaXNpb25zLFxyXG4gICAgICAgICAgICBidWNrZXRzOiB7fSxcclxuICAgICAgICAgICAgcGFpcnM6IHt9LFxyXG4gICAgICAgICAgICBwYWlyc0xpc3Q6IFtdLFxyXG4gICAgICAgICAgICBidWNrZXRXaWR0aDogNDgsXHJcbiAgICAgICAgICAgIGJ1Y2tldEhlaWdodDogNDhcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIGEgc2luZ2xlIGdyaWQgYnVja2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBidWNrZXRXaWR0aFxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCA0OFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGEgc2luZ2xlIGdyaWQgYnVja2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBidWNrZXRIZWlnaHRcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgNDhcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgZ3JpZC5cclxuICAgICAqIEBtZXRob2QgdXBkYXRlXHJcbiAgICAgKiBAcGFyYW0ge2dyaWR9IGdyaWRcclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VVcGRhdGVcclxuICAgICAqL1xyXG4gICAgR3JpZC51cGRhdGUgPSBmdW5jdGlvbihncmlkLCBib2RpZXMsIGVuZ2luZSwgZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICB2YXIgaSwgY29sLCByb3csXHJcbiAgICAgICAgICAgIHdvcmxkID0gZW5naW5lLndvcmxkLFxyXG4gICAgICAgICAgICBidWNrZXRzID0gZ3JpZC5idWNrZXRzLFxyXG4gICAgICAgICAgICBidWNrZXQsXHJcbiAgICAgICAgICAgIGJ1Y2tldElkLFxyXG4gICAgICAgICAgICBncmlkQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBAaWYgREVCVUdcclxuICAgICAgICB2YXIgbWV0cmljcyA9IGVuZ2luZS5tZXRyaWNzO1xyXG4gICAgICAgIG1ldHJpY3MuYnJvYWRwaGFzZVRlc3RzID0gMDtcclxuICAgICAgICAvLyBAZW5kaWZcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib2R5LmlzU2xlZXBpbmcgJiYgIWZvcmNlVXBkYXRlKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAvLyBkb24ndCB1cGRhdGUgb3V0IG9mIHdvcmxkIGJvZGllc1xyXG4gICAgICAgICAgICBpZiAoYm9keS5ib3VuZHMubWF4LnggPCB3b3JsZC5ib3VuZHMubWluLnggfHwgYm9keS5ib3VuZHMubWluLnggPiB3b3JsZC5ib3VuZHMubWF4LnhcclxuICAgICAgICAgICAgICAgIHx8IGJvZHkuYm91bmRzLm1heC55IDwgd29ybGQuYm91bmRzLm1pbi55IHx8IGJvZHkuYm91bmRzLm1pbi55ID4gd29ybGQuYm91bmRzLm1heC55KVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICB2YXIgbmV3UmVnaW9uID0gR3JpZC5fZ2V0UmVnaW9uKGdyaWQsIGJvZHkpO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlIGJvZHkgaGFzIGNoYW5nZWQgZ3JpZCByZWdpb25cclxuICAgICAgICAgICAgaWYgKCFib2R5LnJlZ2lvbiB8fCBuZXdSZWdpb24uaWQgIT09IGJvZHkucmVnaW9uLmlkIHx8IGZvcmNlVXBkYXRlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQGlmIERFQlVHXHJcbiAgICAgICAgICAgICAgICBtZXRyaWNzLmJyb2FkcGhhc2VUZXN0cyArPSAxO1xyXG4gICAgICAgICAgICAgICAgLy8gQGVuZGlmXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFib2R5LnJlZ2lvbiB8fCBmb3JjZVVwZGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICBib2R5LnJlZ2lvbiA9IG5ld1JlZ2lvbjtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdW5pb24gPSBHcmlkLl9yZWdpb25VbmlvbihuZXdSZWdpb24sIGJvZHkucmVnaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZ3JpZCBidWNrZXRzIGFmZmVjdGVkIGJ5IHJlZ2lvbiBjaGFuZ2VcclxuICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgdW5pb24gb2YgYm90aCByZWdpb25zXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IHVuaW9uLnN0YXJ0Q29sOyBjb2wgPD0gdW5pb24uZW5kQ29sOyBjb2wrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAocm93ID0gdW5pb24uc3RhcnRSb3c7IHJvdyA8PSB1bmlvbi5lbmRSb3c7IHJvdysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldElkID0gR3JpZC5fZ2V0QnVja2V0SWQoY29sLCByb3cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgPSBidWNrZXRzW2J1Y2tldElkXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0luc2lkZU5ld1JlZ2lvbiA9IChjb2wgPj0gbmV3UmVnaW9uLnN0YXJ0Q29sICYmIGNvbCA8PSBuZXdSZWdpb24uZW5kQ29sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdyA+PSBuZXdSZWdpb24uc3RhcnRSb3cgJiYgcm93IDw9IG5ld1JlZ2lvbi5lbmRSb3cpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW5zaWRlT2xkUmVnaW9uID0gKGNvbCA+PSBib2R5LnJlZ2lvbi5zdGFydENvbCAmJiBjb2wgPD0gYm9keS5yZWdpb24uZW5kQ29sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdyA+PSBib2R5LnJlZ2lvbi5zdGFydFJvdyAmJiByb3cgPD0gYm9keS5yZWdpb24uZW5kUm93KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG9sZCByZWdpb24gYnVja2V0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5zaWRlTmV3UmVnaW9uICYmIGlzSW5zaWRlT2xkUmVnaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnNpZGVPbGRSZWdpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmlkLl9idWNrZXRSZW1vdmVCb2R5KGdyaWQsIGJ1Y2tldCwgYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byBuZXcgcmVnaW9uIGJ1Y2tldHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkucmVnaW9uID09PSBuZXdSZWdpb24gfHwgKGlzSW5zaWRlTmV3UmVnaW9uICYmICFpc0luc2lkZU9sZFJlZ2lvbikgfHwgZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVja2V0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCA9IEdyaWQuX2NyZWF0ZUJ1Y2tldChidWNrZXRzLCBidWNrZXRJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmlkLl9idWNrZXRBZGRCb2R5KGdyaWQsIGJ1Y2tldCwgYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgcmVnaW9uXHJcbiAgICAgICAgICAgICAgICBib2R5LnJlZ2lvbiA9IG5ld1JlZ2lvbjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBmbGFnIGNoYW5nZXMgc28gd2UgY2FuIHVwZGF0ZSBwYWlyc1xyXG4gICAgICAgICAgICAgICAgZ3JpZENoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB1cGRhdGUgcGFpcnMgbGlzdCBvbmx5IGlmIHBhaXJzIGNoYW5nZWQgKGkuZS4gYSBib2R5IGNoYW5nZWQgcmVnaW9uKVxyXG4gICAgICAgIGlmIChncmlkQ2hhbmdlZClcclxuICAgICAgICAgICAgZ3JpZC5wYWlyc0xpc3QgPSBHcmlkLl9jcmVhdGVBY3RpdmVQYWlyc0xpc3QoZ3JpZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBncmlkLlxyXG4gICAgICogQG1ldGhvZCBjbGVhclxyXG4gICAgICogQHBhcmFtIHtncmlkfSBncmlkXHJcbiAgICAgKi9cclxuICAgIEdyaWQuY2xlYXIgPSBmdW5jdGlvbihncmlkKSB7XHJcbiAgICAgICAgZ3JpZC5idWNrZXRzID0ge307XHJcbiAgICAgICAgZ3JpZC5wYWlycyA9IHt9O1xyXG4gICAgICAgIGdyaWQucGFpcnNMaXN0ID0gW107XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgdGhlIHVuaW9uIG9mIHR3byByZWdpb25zLlxyXG4gICAgICogQG1ldGhvZCBfcmVnaW9uVW5pb25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge30gcmVnaW9uQVxyXG4gICAgICogQHBhcmFtIHt9IHJlZ2lvbkJcclxuICAgICAqIEByZXR1cm4ge30gcmVnaW9uXHJcbiAgICAgKi9cclxuICAgIEdyaWQuX3JlZ2lvblVuaW9uID0gZnVuY3Rpb24ocmVnaW9uQSwgcmVnaW9uQikge1xyXG4gICAgICAgIHZhciBzdGFydENvbCA9IE1hdGgubWluKHJlZ2lvbkEuc3RhcnRDb2wsIHJlZ2lvbkIuc3RhcnRDb2wpLFxyXG4gICAgICAgICAgICBlbmRDb2wgPSBNYXRoLm1heChyZWdpb25BLmVuZENvbCwgcmVnaW9uQi5lbmRDb2wpLFxyXG4gICAgICAgICAgICBzdGFydFJvdyA9IE1hdGgubWluKHJlZ2lvbkEuc3RhcnRSb3csIHJlZ2lvbkIuc3RhcnRSb3cpLFxyXG4gICAgICAgICAgICBlbmRSb3cgPSBNYXRoLm1heChyZWdpb25BLmVuZFJvdywgcmVnaW9uQi5lbmRSb3cpO1xyXG5cclxuICAgICAgICByZXR1cm4gR3JpZC5fY3JlYXRlUmVnaW9uKHN0YXJ0Q29sLCBlbmRDb2wsIHN0YXJ0Um93LCBlbmRSb3cpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJlZ2lvbiBhIGdpdmVuIGJvZHkgZmFsbHMgaW4gZm9yIGEgZ2l2ZW4gZ3JpZC5cclxuICAgICAqIEBtZXRob2QgX2dldFJlZ2lvblxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7fSBncmlkXHJcbiAgICAgKiBAcGFyYW0ge30gYm9keVxyXG4gICAgICogQHJldHVybiB7fSByZWdpb25cclxuICAgICAqL1xyXG4gICAgR3JpZC5fZ2V0UmVnaW9uID0gZnVuY3Rpb24oZ3JpZCwgYm9keSkge1xyXG4gICAgICAgIHZhciBib3VuZHMgPSBib2R5LmJvdW5kcyxcclxuICAgICAgICAgICAgc3RhcnRDb2wgPSBNYXRoLmZsb29yKGJvdW5kcy5taW4ueCAvIGdyaWQuYnVja2V0V2lkdGgpLFxyXG4gICAgICAgICAgICBlbmRDb2wgPSBNYXRoLmZsb29yKGJvdW5kcy5tYXgueCAvIGdyaWQuYnVja2V0V2lkdGgpLFxyXG4gICAgICAgICAgICBzdGFydFJvdyA9IE1hdGguZmxvb3IoYm91bmRzLm1pbi55IC8gZ3JpZC5idWNrZXRIZWlnaHQpLFxyXG4gICAgICAgICAgICBlbmRSb3cgPSBNYXRoLmZsb29yKGJvdW5kcy5tYXgueSAvIGdyaWQuYnVja2V0SGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEdyaWQuX2NyZWF0ZVJlZ2lvbihzdGFydENvbCwgZW5kQ29sLCBzdGFydFJvdywgZW5kUm93KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgcmVnaW9uLlxyXG4gICAgICogQG1ldGhvZCBfY3JlYXRlUmVnaW9uXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHt9IHN0YXJ0Q29sXHJcbiAgICAgKiBAcGFyYW0ge30gZW5kQ29sXHJcbiAgICAgKiBAcGFyYW0ge30gc3RhcnRSb3dcclxuICAgICAqIEBwYXJhbSB7fSBlbmRSb3dcclxuICAgICAqIEByZXR1cm4ge30gcmVnaW9uXHJcbiAgICAgKi9cclxuICAgIEdyaWQuX2NyZWF0ZVJlZ2lvbiA9IGZ1bmN0aW9uKHN0YXJ0Q29sLCBlbmRDb2wsIHN0YXJ0Um93LCBlbmRSb3cpIHtcclxuICAgICAgICByZXR1cm4geyBcclxuICAgICAgICAgICAgaWQ6IHN0YXJ0Q29sICsgJywnICsgZW5kQ29sICsgJywnICsgc3RhcnRSb3cgKyAnLCcgKyBlbmRSb3csXHJcbiAgICAgICAgICAgIHN0YXJ0Q29sOiBzdGFydENvbCwgXHJcbiAgICAgICAgICAgIGVuZENvbDogZW5kQ29sLCBcclxuICAgICAgICAgICAgc3RhcnRSb3c6IHN0YXJ0Um93LCBcclxuICAgICAgICAgICAgZW5kUm93OiBlbmRSb3cgXHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBidWNrZXQgaWQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxyXG4gICAgICogQG1ldGhvZCBfZ2V0QnVja2V0SWRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge30gY29sdW1uXHJcbiAgICAgKiBAcGFyYW0ge30gcm93XHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJ1Y2tldCBpZFxyXG4gICAgICovXHJcbiAgICBHcmlkLl9nZXRCdWNrZXRJZCA9IGZ1bmN0aW9uKGNvbHVtbiwgcm93KSB7XHJcbiAgICAgICAgcmV0dXJuICdDJyArIGNvbHVtbiArICdSJyArIHJvdztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgYnVja2V0LlxyXG4gICAgICogQG1ldGhvZCBfY3JlYXRlQnVja2V0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHt9IGJ1Y2tldHNcclxuICAgICAqIEBwYXJhbSB7fSBidWNrZXRJZFxyXG4gICAgICogQHJldHVybiB7fSBidWNrZXRcclxuICAgICAqL1xyXG4gICAgR3JpZC5fY3JlYXRlQnVja2V0ID0gZnVuY3Rpb24oYnVja2V0cywgYnVja2V0SWQpIHtcclxuICAgICAgICB2YXIgYnVja2V0ID0gYnVja2V0c1tidWNrZXRJZF0gPSBbXTtcclxuICAgICAgICByZXR1cm4gYnVja2V0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBib2R5IHRvIGEgYnVja2V0LlxyXG4gICAgICogQG1ldGhvZCBfYnVja2V0QWRkQm9keVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7fSBncmlkXHJcbiAgICAgKiBAcGFyYW0ge30gYnVja2V0XHJcbiAgICAgKiBAcGFyYW0ge30gYm9keVxyXG4gICAgICovXHJcbiAgICBHcmlkLl9idWNrZXRBZGRCb2R5ID0gZnVuY3Rpb24oZ3JpZCwgYnVja2V0LCBib2R5KSB7XHJcbiAgICAgICAgLy8gYWRkIG5ldyBwYWlyc1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVja2V0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBib2R5QiA9IGJ1Y2tldFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib2R5LmlkID09PSBib2R5Qi5pZCB8fCAoYm9keS5pc1N0YXRpYyAmJiBib2R5Qi5pc1N0YXRpYykpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBidWNrZXRzIHRoZSBwYWlyIGV4aXN0cyBpblxyXG4gICAgICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIEdyaWQudXBkYXRlIHRvIHdvcmtcclxuICAgICAgICAgICAgdmFyIHBhaXJJZCA9IFBhaXIuaWQoYm9keSwgYm9keUIpLFxyXG4gICAgICAgICAgICAgICAgcGFpciA9IGdyaWQucGFpcnNbcGFpcklkXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwYWlyKSB7XHJcbiAgICAgICAgICAgICAgICBwYWlyWzJdICs9IDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBncmlkLnBhaXJzW3BhaXJJZF0gPSBbYm9keSwgYm9keUIsIDFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgdG8gYm9kaWVzIChhZnRlciBwYWlycywgb3RoZXJ3aXNlIHBhaXJzIHdpdGggc2VsZilcclxuICAgICAgICBidWNrZXQucHVzaChib2R5KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgYm9keSBmcm9tIGEgYnVja2V0LlxyXG4gICAgICogQG1ldGhvZCBfYnVja2V0UmVtb3ZlQm9keVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7fSBncmlkXHJcbiAgICAgKiBAcGFyYW0ge30gYnVja2V0XHJcbiAgICAgKiBAcGFyYW0ge30gYm9keVxyXG4gICAgICovXHJcbiAgICBHcmlkLl9idWNrZXRSZW1vdmVCb2R5ID0gZnVuY3Rpb24oZ3JpZCwgYnVja2V0LCBib2R5KSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGZyb20gYnVja2V0XHJcbiAgICAgICAgYnVja2V0LnNwbGljZShidWNrZXQuaW5kZXhPZihib2R5KSwgMSk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBwYWlyIGNvdW50c1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVja2V0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBidWNrZXRzIHRoZSBwYWlyIGV4aXN0cyBpblxyXG4gICAgICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIF9jcmVhdGVBY3RpdmVQYWlyc0xpc3QgdG8gd29ya1xyXG4gICAgICAgICAgICB2YXIgYm9keUIgPSBidWNrZXRbaV0sXHJcbiAgICAgICAgICAgICAgICBwYWlySWQgPSBQYWlyLmlkKGJvZHksIGJvZHlCKSxcclxuICAgICAgICAgICAgICAgIHBhaXIgPSBncmlkLnBhaXJzW3BhaXJJZF07XHJcblxyXG4gICAgICAgICAgICBpZiAocGFpcilcclxuICAgICAgICAgICAgICAgIHBhaXJbMl0gLT0gMTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhdGVzIGEgbGlzdCBvZiB0aGUgYWN0aXZlIHBhaXJzIGluIHRoZSBncmlkLlxyXG4gICAgICogQG1ldGhvZCBfY3JlYXRlQWN0aXZlUGFpcnNMaXN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHt9IGdyaWRcclxuICAgICAqIEByZXR1cm4gW10gcGFpcnNcclxuICAgICAqL1xyXG4gICAgR3JpZC5fY3JlYXRlQWN0aXZlUGFpcnNMaXN0ID0gZnVuY3Rpb24oZ3JpZCkge1xyXG4gICAgICAgIHZhciBwYWlyS2V5cyxcclxuICAgICAgICAgICAgcGFpcixcclxuICAgICAgICAgICAgcGFpcnMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gZ3JpZC5wYWlycyBpcyB1c2VkIGFzIGEgaGFzaG1hcFxyXG4gICAgICAgIHBhaXJLZXlzID0gQ29tbW9uLmtleXMoZ3JpZC5wYWlycyk7XHJcblxyXG4gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBncmlkLnBhaXJzXHJcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwYWlyS2V5cy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICBwYWlyID0gZ3JpZC5wYWlyc1twYWlyS2V5c1trXV07XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBwYWlyIGV4aXN0cyBpbiBhdCBsZWFzdCBvbmUgYnVja2V0XHJcbiAgICAgICAgICAgIC8vIGl0IGlzIGEgcGFpciB0aGF0IG5lZWRzIGZ1cnRoZXIgY29sbGlzaW9uIHRlc3Rpbmcgc28gcHVzaCBpdFxyXG4gICAgICAgICAgICBpZiAocGFpclsyXSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhaXJzLnB1c2gocGFpcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZ3JpZC5wYWlyc1twYWlyS2V5c1trXV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYWlycztcclxuICAgIH07XHJcbiAgICBcclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuUGFpcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXJzLlxyXG4qXHJcbiogQGNsYXNzIFBhaXJcclxuKi9cclxuXHJcbnZhciBQYWlyID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhaXI7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHBhaXIuXHJcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxyXG4gICAgICogQHBhcmFtIHtjb2xsaXNpb259IGNvbGxpc2lvblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcFxyXG4gICAgICogQHJldHVybiB7cGFpcn0gQSBuZXcgcGFpclxyXG4gICAgICovXHJcbiAgICBQYWlyLmNyZWF0ZSA9IGZ1bmN0aW9uKGNvbGxpc2lvbiwgdGltZXN0YW1wKSB7XHJcbiAgICAgICAgdmFyIGJvZHlBID0gY29sbGlzaW9uLmJvZHlBLFxyXG4gICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5ib2R5QjtcclxuXHJcbiAgICAgICAgdmFyIHBhaXIgPSB7XHJcbiAgICAgICAgICAgIGlkOiBQYWlyLmlkKGJvZHlBLCBib2R5QiksXHJcbiAgICAgICAgICAgIGJvZHlBOiBib2R5QSxcclxuICAgICAgICAgICAgYm9keUI6IGJvZHlCLFxyXG4gICAgICAgICAgICBhY3RpdmVDb250YWN0czogW10sXHJcbiAgICAgICAgICAgIHNlcGFyYXRpb246IDAsXHJcbiAgICAgICAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maXJtZWRBY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIGlzU2Vuc29yOiBib2R5QS5pc1NlbnNvciB8fCBib2R5Qi5pc1NlbnNvcixcclxuICAgICAgICAgICAgdGltZUNyZWF0ZWQ6IHRpbWVzdGFtcCxcclxuICAgICAgICAgICAgdGltZVVwZGF0ZWQ6IHRpbWVzdGFtcCxcclxuICAgICAgICAgICAgY29sbGlzaW9uOiBudWxsLFxyXG4gICAgICAgICAgICBpbnZlcnNlTWFzczogMCxcclxuICAgICAgICAgICAgZnJpY3Rpb246IDAsXHJcbiAgICAgICAgICAgIGZyaWN0aW9uU3RhdGljOiAwLFxyXG4gICAgICAgICAgICByZXN0aXR1dGlvbjogMCxcclxuICAgICAgICAgICAgc2xvcDogMFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIFBhaXIudXBkYXRlKHBhaXIsIGNvbGxpc2lvbiwgdGltZXN0YW1wKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhaXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBhIHBhaXIgZ2l2ZW4gYSBjb2xsaXNpb24uXHJcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxyXG4gICAgICogQHBhcmFtIHtwYWlyfSBwYWlyXHJcbiAgICAgKiBAcGFyYW0ge2NvbGxpc2lvbn0gY29sbGlzaW9uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXHJcbiAgICAgKi9cclxuICAgIFBhaXIudXBkYXRlID0gZnVuY3Rpb24ocGFpciwgY29sbGlzaW9uLCB0aW1lc3RhbXApIHtcclxuICAgICAgICBwYWlyLmNvbGxpc2lvbiA9IGNvbGxpc2lvbjtcclxuXHJcbiAgICAgICAgaWYgKGNvbGxpc2lvbi5jb2xsaWRlZCkge1xyXG4gICAgICAgICAgICB2YXIgc3VwcG9ydHMgPSBjb2xsaXNpb24uc3VwcG9ydHMsXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVDb250YWN0cyA9IHBhaXIuYWN0aXZlQ29udGFjdHMsXHJcbiAgICAgICAgICAgICAgICBwYXJlbnRBID0gY29sbGlzaW9uLnBhcmVudEEsXHJcbiAgICAgICAgICAgICAgICBwYXJlbnRCID0gY29sbGlzaW9uLnBhcmVudEI7XHJcblxyXG4gICAgICAgICAgICBwYWlyLmludmVyc2VNYXNzID0gcGFyZW50QS5pbnZlcnNlTWFzcyArIHBhcmVudEIuaW52ZXJzZU1hc3M7XHJcbiAgICAgICAgICAgIHBhaXIuZnJpY3Rpb24gPSBNYXRoLm1pbihwYXJlbnRBLmZyaWN0aW9uLCBwYXJlbnRCLmZyaWN0aW9uKTtcclxuICAgICAgICAgICAgcGFpci5mcmljdGlvblN0YXRpYyA9IE1hdGgubWF4KHBhcmVudEEuZnJpY3Rpb25TdGF0aWMsIHBhcmVudEIuZnJpY3Rpb25TdGF0aWMpO1xyXG4gICAgICAgICAgICBwYWlyLnJlc3RpdHV0aW9uID0gTWF0aC5tYXgocGFyZW50QS5yZXN0aXR1dGlvbiwgcGFyZW50Qi5yZXN0aXR1dGlvbik7XHJcbiAgICAgICAgICAgIHBhaXIuc2xvcCA9IE1hdGgubWF4KHBhcmVudEEuc2xvcCwgcGFyZW50Qi5zbG9wKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VwcG9ydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvbnRhY3RzW2ldID0gc3VwcG9ydHNbaV0uY29udGFjdDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gb3B0aW1pc2UgYXJyYXkgc2l6ZVxyXG4gICAgICAgICAgICB2YXIgc3VwcG9ydENvdW50ID0gc3VwcG9ydHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoc3VwcG9ydENvdW50IDwgYWN0aXZlQ29udGFjdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVDb250YWN0cy5sZW5ndGggPSBzdXBwb3J0Q291bnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBhaXIuc2VwYXJhdGlvbiA9IGNvbGxpc2lvbi5kZXB0aDtcclxuICAgICAgICAgICAgUGFpci5zZXRBY3RpdmUocGFpciwgdHJ1ZSwgdGltZXN0YW1wKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFpci5pc0FjdGl2ZSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgIFBhaXIuc2V0QWN0aXZlKHBhaXIsIGZhbHNlLCB0aW1lc3RhbXApO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgcGFpciBhcyBhY3RpdmUgb3IgaW5hY3RpdmUuXHJcbiAgICAgKiBAbWV0aG9kIHNldEFjdGl2ZVxyXG4gICAgICogQHBhcmFtIHtwYWlyfSBwYWlyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IGlzQWN0aXZlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXHJcbiAgICAgKi9cclxuICAgIFBhaXIuc2V0QWN0aXZlID0gZnVuY3Rpb24ocGFpciwgaXNBY3RpdmUsIHRpbWVzdGFtcCkge1xyXG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICAgICAgICBwYWlyLmlzQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGFpci50aW1lVXBkYXRlZCA9IHRpbWVzdGFtcDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYWlyLmlzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHBhaXIuYWN0aXZlQ29udGFjdHMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBpZCBmb3IgdGhlIGdpdmVuIHBhaXIuXHJcbiAgICAgKiBAbWV0aG9kIGlkXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlBXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlCXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFVuaXF1ZSBwYWlySWRcclxuICAgICAqL1xyXG4gICAgUGFpci5pZCA9IGZ1bmN0aW9uKGJvZHlBLCBib2R5Qikge1xyXG4gICAgICAgIGlmIChib2R5QS5pZCA8IGJvZHlCLmlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQScgKyBib2R5QS5pZCArICdCJyArIGJvZHlCLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQScgKyBib2R5Qi5pZCArICdCJyArIGJvZHlBLmlkO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5QYWlyc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29sbGlzaW9uIHBhaXIgc2V0cy5cclxuKlxyXG4qIEBjbGFzcyBQYWlyc1xyXG4qL1xyXG5cclxudmFyIFBhaXJzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhaXJzO1xyXG5cclxudmFyIFBhaXIgPSByZXF1aXJlKCcuL1BhaXInKTtcclxudmFyIENvbW1vbiA9IHJlcXVpcmUoJy4uL2NvcmUvQ29tbW9uJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcbiAgICBcclxuICAgIFBhaXJzLl9wYWlyTWF4SWRsZUxpZmUgPSAxMDAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYWlycyBzdHJ1Y3R1cmUuXHJcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcclxuICAgICAqIEByZXR1cm4ge3BhaXJzfSBBIG5ldyBwYWlycyBzdHJ1Y3R1cmVcclxuICAgICAqL1xyXG4gICAgUGFpcnMuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiBDb21tb24uZXh0ZW5kKHsgXHJcbiAgICAgICAgICAgIHRhYmxlOiB7fSxcclxuICAgICAgICAgICAgbGlzdDogW10sXHJcbiAgICAgICAgICAgIGNvbGxpc2lvblN0YXJ0OiBbXSxcclxuICAgICAgICAgICAgY29sbGlzaW9uQWN0aXZlOiBbXSxcclxuICAgICAgICAgICAgY29sbGlzaW9uRW5kOiBbXVxyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgcGFpcnMgZ2l2ZW4gYSBsaXN0IG9mIGNvbGxpc2lvbnMuXHJcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHBhaXJzXHJcbiAgICAgKiBAcGFyYW0ge2NvbGxpc2lvbltdfSBjb2xsaXNpb25zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXHJcbiAgICAgKi9cclxuICAgIFBhaXJzLnVwZGF0ZSA9IGZ1bmN0aW9uKHBhaXJzLCBjb2xsaXNpb25zLCB0aW1lc3RhbXApIHtcclxuICAgICAgICB2YXIgcGFpcnNMaXN0ID0gcGFpcnMubGlzdCxcclxuICAgICAgICAgICAgcGFpcnNUYWJsZSA9IHBhaXJzLnRhYmxlLFxyXG4gICAgICAgICAgICBjb2xsaXNpb25TdGFydCA9IHBhaXJzLmNvbGxpc2lvblN0YXJ0LFxyXG4gICAgICAgICAgICBjb2xsaXNpb25FbmQgPSBwYWlycy5jb2xsaXNpb25FbmQsXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbkFjdGl2ZSA9IHBhaXJzLmNvbGxpc2lvbkFjdGl2ZSxcclxuICAgICAgICAgICAgY29sbGlzaW9uLFxyXG4gICAgICAgICAgICBwYWlySWQsXHJcbiAgICAgICAgICAgIHBhaXIsXHJcbiAgICAgICAgICAgIGk7XHJcblxyXG4gICAgICAgIC8vIGNsZWFyIGNvbGxpc2lvbiBzdGF0ZSBhcnJheXMsIGJ1dCBtYWludGFpbiBvbGQgcmVmZXJlbmNlXHJcbiAgICAgICAgY29sbGlzaW9uU3RhcnQubGVuZ3RoID0gMDtcclxuICAgICAgICBjb2xsaXNpb25FbmQubGVuZ3RoID0gMDtcclxuICAgICAgICBjb2xsaXNpb25BY3RpdmUubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwYWlyc0xpc3RbaV0uY29uZmlybWVkQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sbGlzaW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb2xsaXNpb24gPSBjb2xsaXNpb25zW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbi5jb2xsaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgcGFpcklkID0gUGFpci5pZChjb2xsaXNpb24uYm9keUEsIGNvbGxpc2lvbi5ib2R5Qik7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFpciA9IHBhaXJzVGFibGVbcGFpcklkXTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKHBhaXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBwYWlyIGFscmVhZHkgZXhpc3RzIChidXQgbWF5IG9yIG1heSBub3QgYmUgYWN0aXZlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLmlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhaXIgZXhpc3RzIGFuZCBpcyBhY3RpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQWN0aXZlLnB1c2gocGFpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFpciBleGlzdHMgYnV0IHdhcyBpbmFjdGl2ZSwgc28gYSBjb2xsaXNpb24gaGFzIGp1c3Qgc3RhcnRlZCBhZ2FpblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25TdGFydC5wdXNoKHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBwYWlyXHJcbiAgICAgICAgICAgICAgICAgICAgUGFpci51cGRhdGUocGFpciwgY29sbGlzaW9uLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhaXIuY29uZmlybWVkQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpciBkaWQgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgcGFpclxyXG4gICAgICAgICAgICAgICAgICAgIHBhaXIgPSBQYWlyLmNyZWF0ZShjb2xsaXNpb24sIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFpcnNUYWJsZVtwYWlySWRdID0gcGFpcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVzaCB0aGUgbmV3IHBhaXJcclxuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25TdGFydC5wdXNoKHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhaXJzTGlzdC5wdXNoKHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWFjdGl2YXRlIHByZXZpb3VzbHkgYWN0aXZlIHBhaXJzIHRoYXQgYXJlIG5vdyBpbmFjdGl2ZVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcGFpciA9IHBhaXJzTGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKHBhaXIuaXNBY3RpdmUgJiYgIXBhaXIuY29uZmlybWVkQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBQYWlyLnNldEFjdGl2ZShwYWlyLCBmYWxzZSwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkVuZC5wdXNoKHBhaXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhbmQgcmVtb3ZlcyBwYWlycyB0aGF0IGhhdmUgYmVlbiBpbmFjdGl2ZSBmb3IgYSBzZXQgYW1vdW50IG9mIHRpbWUuXHJcbiAgICAgKiBAbWV0aG9kIHJlbW92ZU9sZFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHBhaXJzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZXN0YW1wXHJcbiAgICAgKi9cclxuICAgIFBhaXJzLnJlbW92ZU9sZCA9IGZ1bmN0aW9uKHBhaXJzLCB0aW1lc3RhbXApIHtcclxuICAgICAgICB2YXIgcGFpcnNMaXN0ID0gcGFpcnMubGlzdCxcclxuICAgICAgICAgICAgcGFpcnNUYWJsZSA9IHBhaXJzLnRhYmxlLFxyXG4gICAgICAgICAgICBpbmRleGVzVG9SZW1vdmUgPSBbXSxcclxuICAgICAgICAgICAgcGFpcixcclxuICAgICAgICAgICAgY29sbGlzaW9uLFxyXG4gICAgICAgICAgICBwYWlySW5kZXgsXHJcbiAgICAgICAgICAgIGk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcGFpciA9IHBhaXJzTGlzdFtpXTtcclxuICAgICAgICAgICAgY29sbGlzaW9uID0gcGFpci5jb2xsaXNpb247XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBuZXZlciByZW1vdmUgc2xlZXBpbmcgcGFpcnNcclxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbi5ib2R5QS5pc1NsZWVwaW5nIHx8IGNvbGxpc2lvbi5ib2R5Qi5pc1NsZWVwaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBwYWlyLnRpbWVVcGRhdGVkID0gdGltZXN0YW1wO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHBhaXIgaXMgaW5hY3RpdmUgZm9yIHRvbyBsb25nLCBtYXJrIGl0IHRvIGJlIHJlbW92ZWRcclxuICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCAtIHBhaXIudGltZVVwZGF0ZWQgPiBQYWlycy5fcGFpck1heElkbGVMaWZlKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVzVG9SZW1vdmUucHVzaChpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIG1hcmtlZCBwYWlyc1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRleGVzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcGFpckluZGV4ID0gaW5kZXhlc1RvUmVtb3ZlW2ldIC0gaTtcclxuICAgICAgICAgICAgcGFpciA9IHBhaXJzTGlzdFtwYWlySW5kZXhdO1xyXG4gICAgICAgICAgICBkZWxldGUgcGFpcnNUYWJsZVtwYWlyLmlkXTtcclxuICAgICAgICAgICAgcGFpcnNMaXN0LnNwbGljZShwYWlySW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGdpdmVuIHBhaXJzIHN0cnVjdHVyZS5cclxuICAgICAqIEBtZXRob2QgY2xlYXJcclxuICAgICAqIEBwYXJhbSB7cGFpcnN9IHBhaXJzXHJcbiAgICAgKiBAcmV0dXJuIHtwYWlyc30gcGFpcnNcclxuICAgICAqL1xyXG4gICAgUGFpcnMuY2xlYXIgPSBmdW5jdGlvbihwYWlycykge1xyXG4gICAgICAgIHBhaXJzLnRhYmxlID0ge307XHJcbiAgICAgICAgcGFpcnMubGlzdC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHBhaXJzLmNvbGxpc2lvblN0YXJ0Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgcGFpcnMuY29sbGlzaW9uQWN0aXZlLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgcGFpcnMuY29sbGlzaW9uRW5kLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgcmV0dXJuIHBhaXJzO1xyXG4gICAgfTtcclxuXHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyLlF1ZXJ5YCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyBjb2xsaXNpb24gcXVlcmllcy5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgUXVlcnlcclxuKi9cclxuXHJcbnZhciBRdWVyeSA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWVyeTtcclxuXHJcbnZhciBWZWN0b3IgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZWN0b3InKTtcclxudmFyIFNBVCA9IHJlcXVpcmUoJy4vU0FUJyk7XHJcbnZhciBCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9Cb3VuZHMnKTtcclxudmFyIEJvZGllcyA9IHJlcXVpcmUoJy4uL2ZhY3RvcnkvQm9kaWVzJyk7XHJcbnZhciBWZXJ0aWNlcyA9IHJlcXVpcmUoJy4uL2dlb21ldHJ5L1ZlcnRpY2VzJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjb2xsaXNpb25zIGJldHdlZW4gYGJvZHlgIGFuZCBgYm9kaWVzYC5cclxuICAgICAqIEBtZXRob2QgY29sbGlkZXNcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xyXG4gICAgICogQHJldHVybiB7b2JqZWN0W119IENvbGxpc2lvbnNcclxuICAgICAqL1xyXG4gICAgUXVlcnkuY29sbGlkZXMgPSBmdW5jdGlvbihib2R5LCBib2RpZXMpIHtcclxuICAgICAgICB2YXIgY29sbGlzaW9ucyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keUEgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyAgUGhhc2VyIGFkZGl0aW9uIC0gc2tpcCBzYW1lIGJvZHkgY2hlY2tzXHJcbiAgICAgICAgICAgIGlmIChib2R5ID09PSBib2R5QSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChCb3VuZHMub3ZlcmxhcHMoYm9keUEuYm91bmRzLCBib2R5LmJvdW5kcykpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBib2R5QS5wYXJ0cy5sZW5ndGggPT09IDEgPyAwIDogMTsgaiA8IGJvZHlBLnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5QS5wYXJ0c1tqXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEJvdW5kcy5vdmVybGFwcyhwYXJ0LmJvdW5kcywgYm9keS5ib3VuZHMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xsaXNpb24gPSBTQVQuY29sbGlkZXMocGFydCwgYm9keSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uLmNvbGxpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25zLnB1c2goY29sbGlzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29sbGlzaW9ucztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0cyBhIHJheSBzZWdtZW50IGFnYWluc3QgYSBzZXQgb2YgYm9kaWVzIGFuZCByZXR1cm5zIGFsbCBjb2xsaXNpb25zLCByYXkgd2lkdGggaXMgb3B0aW9uYWwuIEludGVyc2VjdGlvbiBwb2ludHMgYXJlIG5vdCBwcm92aWRlZC5cclxuICAgICAqIEBtZXRob2QgcmF5XHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gc3RhcnRQb2ludFxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IGVuZFBvaW50XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JheVdpZHRoXVxyXG4gICAgICogQHJldHVybiB7b2JqZWN0W119IENvbGxpc2lvbnNcclxuICAgICAqL1xyXG4gICAgUXVlcnkucmF5ID0gZnVuY3Rpb24oYm9kaWVzLCBzdGFydFBvaW50LCBlbmRQb2ludCwgcmF5V2lkdGgpIHtcclxuICAgICAgICByYXlXaWR0aCA9IHJheVdpZHRoIHx8IDFlLTEwMDtcclxuXHJcbiAgICAgICAgdmFyIHJheUFuZ2xlID0gVmVjdG9yLmFuZ2xlKHN0YXJ0UG9pbnQsIGVuZFBvaW50KSxcclxuICAgICAgICAgICAgcmF5TGVuZ3RoID0gVmVjdG9yLm1hZ25pdHVkZShWZWN0b3Iuc3ViKHN0YXJ0UG9pbnQsIGVuZFBvaW50KSksXHJcbiAgICAgICAgICAgIHJheVggPSAoZW5kUG9pbnQueCArIHN0YXJ0UG9pbnQueCkgKiAwLjUsXHJcbiAgICAgICAgICAgIHJheVkgPSAoZW5kUG9pbnQueSArIHN0YXJ0UG9pbnQueSkgKiAwLjUsXHJcbiAgICAgICAgICAgIHJheSA9IEJvZGllcy5yZWN0YW5nbGUocmF5WCwgcmF5WSwgcmF5TGVuZ3RoLCByYXlXaWR0aCwgeyBhbmdsZTogcmF5QW5nbGUgfSksXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbnMgPSBRdWVyeS5jb2xsaWRlcyhyYXksIGJvZGllcyk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9ucy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gY29sbGlzaW9uc1tpXTtcclxuICAgICAgICAgICAgY29sbGlzaW9uLmJvZHkgPSBjb2xsaXNpb24uYm9keUIgPSBjb2xsaXNpb24uYm9keUE7ICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29sbGlzaW9ucztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCBib2RpZXMgd2hvc2UgYm91bmRzIGFyZSBpbnNpZGUgKG9yIG91dHNpZGUgaWYgc2V0KSB0aGUgZ2l2ZW4gc2V0IG9mIGJvdW5kcywgZnJvbSB0aGUgZ2l2ZW4gc2V0IG9mIGJvZGllcy5cclxuICAgICAqIEBtZXRob2QgcmVnaW9uXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge2JvdW5kc30gYm91bmRzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtvdXRzaWRlPWZhbHNlXVxyXG4gICAgICogQHJldHVybiB7Ym9keVtdfSBUaGUgYm9kaWVzIG1hdGNoaW5nIHRoZSBxdWVyeVxyXG4gICAgICovXHJcbiAgICBRdWVyeS5yZWdpb24gPSBmdW5jdGlvbihib2RpZXMsIGJvdW5kcywgb3V0c2lkZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBvdmVybGFwcyA9IEJvdW5kcy5vdmVybGFwcyhib2R5LmJvdW5kcywgYm91bmRzKTtcclxuICAgICAgICAgICAgaWYgKChvdmVybGFwcyAmJiAhb3V0c2lkZSkgfHwgKCFvdmVybGFwcyAmJiBvdXRzaWRlKSlcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJvZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFsbCBib2RpZXMgd2hvc2UgdmVydGljZXMgY29udGFpbiB0aGUgZ2l2ZW4gcG9pbnQsIGZyb20gdGhlIGdpdmVuIHNldCBvZiBib2RpZXMuXHJcbiAgICAgKiBAbWV0aG9kIHBvaW50XHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9pbnRcclxuICAgICAqIEByZXR1cm4ge2JvZHlbXX0gVGhlIGJvZGllcyBtYXRjaGluZyB0aGUgcXVlcnlcclxuICAgICAqL1xyXG4gICAgUXVlcnkucG9pbnQgPSBmdW5jdGlvbihib2RpZXMsIHBvaW50KSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChCb3VuZHMuY29udGFpbnMoYm9keS5ib3VuZHMsIHBvaW50KSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGJvZHkucGFydHMubGVuZ3RoID09PSAxID8gMCA6IDE7IGogPCBib2R5LnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2pdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoQm91bmRzLmNvbnRhaW5zKHBhcnQuYm91bmRzLCBwb2ludClcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgVmVydGljZXMuY29udGFpbnMocGFydC52ZXJ0aWNlcywgcG9pbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuUmVzb2x2ZXJgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciByZXNvbHZpbmcgY29sbGlzaW9uIHBhaXJzLlxyXG4qXHJcbiogQGNsYXNzIFJlc29sdmVyXHJcbiovXHJcblxyXG52YXIgUmVzb2x2ZXIgPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVzb2x2ZXI7XHJcblxyXG52YXIgVmVydGljZXMgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZXJ0aWNlcycpO1xyXG52YXIgVmVjdG9yID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvVmVjdG9yJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgUmVzb2x2ZXIuX3Jlc3RpbmdUaHJlc2ggPSA0O1xyXG4gICAgUmVzb2x2ZXIuX3Jlc3RpbmdUaHJlc2hUYW5nZW50ID0gNjtcclxuICAgIFJlc29sdmVyLl9wb3NpdGlvbkRhbXBlbiA9IDAuOTtcclxuICAgIFJlc29sdmVyLl9wb3NpdGlvbldhcm1pbmcgPSAwLjg7XHJcbiAgICBSZXNvbHZlci5fZnJpY3Rpb25Ob3JtYWxNdWx0aXBsaWVyID0gNTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBhcmUgcGFpcnMgZm9yIHBvc2l0aW9uIHNvbHZpbmcuXHJcbiAgICAgKiBAbWV0aG9kIHByZVNvbHZlUG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xyXG4gICAgICovXHJcbiAgICBSZXNvbHZlci5wcmVTb2x2ZVBvc2l0aW9uID0gZnVuY3Rpb24ocGFpcnMpIHtcclxuICAgICAgICB2YXIgaSxcclxuICAgICAgICAgICAgcGFpcixcclxuICAgICAgICAgICAgYWN0aXZlQ291bnQ7XHJcblxyXG4gICAgICAgIC8vIGZpbmQgdG90YWwgY29udGFjdHMgb24gZWFjaCBib2R5XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBwYWlyLmFjdGl2ZUNvbnRhY3RzLmxlbmd0aDtcclxuICAgICAgICAgICAgcGFpci5jb2xsaXNpb24ucGFyZW50QS50b3RhbENvbnRhY3RzICs9IGFjdGl2ZUNvdW50O1xyXG4gICAgICAgICAgICBwYWlyLmNvbGxpc2lvbi5wYXJlbnRCLnRvdGFsQ29udGFjdHMgKz0gYWN0aXZlQ291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBzb2x1dGlvbiBmb3IgcGFpciBwb3NpdGlvbnMuXHJcbiAgICAgKiBAbWV0aG9kIHNvbHZlUG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7cGFpcltdfSBwYWlyc1xyXG4gICAgICogQHBhcmFtIHtib2R5W119IGJvZGllc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZVxyXG4gICAgICovXHJcbiAgICBSZXNvbHZlci5zb2x2ZVBvc2l0aW9uID0gZnVuY3Rpb24ocGFpcnMsIGJvZGllcywgdGltZVNjYWxlKSB7XHJcbiAgICAgICAgdmFyIGksXHJcbiAgICAgICAgICAgIG5vcm1hbFgsXHJcbiAgICAgICAgICAgIG5vcm1hbFksXHJcbiAgICAgICAgICAgIHBhaXIsXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbixcclxuICAgICAgICAgICAgYm9keUEsXHJcbiAgICAgICAgICAgIGJvZHlCLFxyXG4gICAgICAgICAgICBub3JtYWwsXHJcbiAgICAgICAgICAgIHNlcGFyYXRpb24sXHJcbiAgICAgICAgICAgIHBlbmV0cmF0aW9uLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkltcHVsc2VBLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkltcHVsc2VCLFxyXG4gICAgICAgICAgICBjb250YWN0U2hhcmUsXHJcbiAgICAgICAgICAgIGJvZHlCdG9BWCxcclxuICAgICAgICAgICAgYm9keUJ0b0FZLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkltcHVsc2UsXHJcbiAgICAgICAgICAgIGltcHVsc2VDb2VmZmljaWVudCA9IHRpbWVTY2FsZSAqIFJlc29sdmVyLl9wb3NpdGlvbkRhbXBlbjtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuICAgICAgICAgICAgYm9keS5wcmV2aW91c1Bvc2l0aW9uSW1wdWxzZS54ID0gYm9keS5wb3NpdGlvbkltcHVsc2UueDtcclxuICAgICAgICAgICAgYm9keS5wcmV2aW91c1Bvc2l0aW9uSW1wdWxzZS55ID0gYm9keS5wb3NpdGlvbkltcHVsc2UueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpbmQgaW1wdWxzZXMgcmVxdWlyZWQgdG8gcmVzb2x2ZSBwZW5ldHJhdGlvblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwYWlyID0gcGFpcnNbaV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUgfHwgcGFpci5pc1NlbnNvcilcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgY29sbGlzaW9uID0gcGFpci5jb2xsaXNpb247XHJcbiAgICAgICAgICAgIGJvZHlBID0gY29sbGlzaW9uLnBhcmVudEE7XHJcbiAgICAgICAgICAgIGJvZHlCID0gY29sbGlzaW9uLnBhcmVudEI7XHJcbiAgICAgICAgICAgIG5vcm1hbCA9IGNvbGxpc2lvbi5ub3JtYWw7XHJcblxyXG4gICAgICAgICAgICBwb3NpdGlvbkltcHVsc2VBID0gYm9keUEucHJldmlvdXNQb3NpdGlvbkltcHVsc2U7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW1wdWxzZUIgPSBib2R5Qi5wcmV2aW91c1Bvc2l0aW9uSW1wdWxzZTtcclxuXHJcbiAgICAgICAgICAgIHBlbmV0cmF0aW9uID0gY29sbGlzaW9uLnBlbmV0cmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgYm9keUJ0b0FYID0gcG9zaXRpb25JbXB1bHNlQi54IC0gcG9zaXRpb25JbXB1bHNlQS54ICsgcGVuZXRyYXRpb24ueDtcclxuICAgICAgICAgICAgYm9keUJ0b0FZID0gcG9zaXRpb25JbXB1bHNlQi55IC0gcG9zaXRpb25JbXB1bHNlQS55ICsgcGVuZXRyYXRpb24ueTtcclxuXHJcbiAgICAgICAgICAgIG5vcm1hbFggPSBub3JtYWwueDtcclxuICAgICAgICAgICAgbm9ybWFsWSA9IG5vcm1hbC55O1xyXG5cclxuICAgICAgICAgICAgc2VwYXJhdGlvbiA9IG5vcm1hbFggKiBib2R5QnRvQVggKyBub3JtYWxZICogYm9keUJ0b0FZO1xyXG4gICAgICAgICAgICBwYWlyLnNlcGFyYXRpb24gPSBzZXBhcmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlID0gKHNlcGFyYXRpb24gLSBwYWlyLnNsb3ApICogaW1wdWxzZUNvZWZmaWNpZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHlBLmlzU3RhdGljIHx8IGJvZHlCLmlzU3RhdGljKVxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25JbXB1bHNlICo9IDI7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIShib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFjdFNoYXJlID0gcG9zaXRpb25JbXB1bHNlIC8gYm9keUEudG90YWxDb250YWN0cztcclxuICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uSW1wdWxzZS54ICs9IG5vcm1hbFggKiBjb250YWN0U2hhcmU7XHJcbiAgICAgICAgICAgICAgICBib2R5QS5wb3NpdGlvbkltcHVsc2UueSArPSBub3JtYWxZICogY29udGFjdFNoYXJlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIShib2R5Qi5pc1N0YXRpYyB8fCBib2R5Qi5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFjdFNoYXJlID0gcG9zaXRpb25JbXB1bHNlIC8gYm9keUIudG90YWxDb250YWN0cztcclxuICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uSW1wdWxzZS54IC09IG5vcm1hbFggKiBjb250YWN0U2hhcmU7XHJcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvbkltcHVsc2UueSAtPSBub3JtYWxZICogY29udGFjdFNoYXJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHBvc2l0aW9uIHJlc29sdXRpb24uXHJcbiAgICAgKiBAbWV0aG9kIHBvc3RTb2x2ZVBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKi9cclxuICAgIFJlc29sdmVyLnBvc3RTb2x2ZVBvc2l0aW9uID0gZnVuY3Rpb24oYm9kaWVzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyByZXNldCBjb250YWN0IGNvdW50XHJcbiAgICAgICAgICAgIGJvZHkudG90YWxDb250YWN0cyA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keS5wb3NpdGlvbkltcHVsc2UueCAhPT0gMCB8fCBib2R5LnBvc2l0aW9uSW1wdWxzZS55ICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYm9keSBnZW9tZXRyeVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBib2R5LnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBib2R5LnBhcnRzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBib2R5LnBvc2l0aW9uSW1wdWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgQm91bmRzLnVwZGF0ZShwYXJ0LmJvdW5kcywgcGFydC52ZXJ0aWNlcywgYm9keS52ZWxvY2l0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi54ICs9IGJvZHkucG9zaXRpb25JbXB1bHNlLng7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydC5wb3NpdGlvbi55ICs9IGJvZHkucG9zaXRpb25JbXB1bHNlLnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbW92ZSB0aGUgYm9keSB3aXRob3V0IGNoYW5naW5nIHZlbG9jaXR5XHJcbiAgICAgICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ICs9IGJvZHkucG9zaXRpb25JbXB1bHNlLng7XHJcbiAgICAgICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi55ICs9IGJvZHkucG9zaXRpb25JbXB1bHNlLnk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFZlY3Rvci5kb3QoYm9keS5wb3NpdGlvbkltcHVsc2UsIGJvZHkudmVsb2NpdHkpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNhY2hlZCBpbXB1bHNlIGlmIHRoZSBib2R5IGhhcyB2ZWxvY2l0eSBhbG9uZyBpdFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucG9zaXRpb25JbXB1bHNlLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucG9zaXRpb25JbXB1bHNlLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB3YXJtIHRoZSBuZXh0IGl0ZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucG9zaXRpb25JbXB1bHNlLnggKj0gUmVzb2x2ZXIuX3Bvc2l0aW9uV2FybWluZztcclxuICAgICAgICAgICAgICAgICAgICBib2R5LnBvc2l0aW9uSW1wdWxzZS55ICo9IFJlc29sdmVyLl9wb3NpdGlvbldhcm1pbmc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGFyZSBwYWlycyBmb3IgdmVsb2NpdHkgc29sdmluZy5cclxuICAgICAqIEBtZXRob2QgcHJlU29sdmVWZWxvY2l0eVxyXG4gICAgICogQHBhcmFtIHtwYWlyW119IHBhaXJzXHJcbiAgICAgKi9cclxuICAgIFJlc29sdmVyLnByZVNvbHZlVmVsb2NpdHkgPSBmdW5jdGlvbihwYWlycykge1xyXG4gICAgICAgIHZhciBpLFxyXG4gICAgICAgICAgICBqLFxyXG4gICAgICAgICAgICBwYWlyLFxyXG4gICAgICAgICAgICBjb250YWN0cyxcclxuICAgICAgICAgICAgY29sbGlzaW9uLFxyXG4gICAgICAgICAgICBib2R5QSxcclxuICAgICAgICAgICAgYm9keUIsXHJcbiAgICAgICAgICAgIG5vcm1hbCxcclxuICAgICAgICAgICAgdGFuZ2VudCxcclxuICAgICAgICAgICAgY29udGFjdCxcclxuICAgICAgICAgICAgY29udGFjdFZlcnRleCxcclxuICAgICAgICAgICAgbm9ybWFsSW1wdWxzZSxcclxuICAgICAgICAgICAgdGFuZ2VudEltcHVsc2UsXHJcbiAgICAgICAgICAgIG9mZnNldCxcclxuICAgICAgICAgICAgaW1wdWxzZSA9IFZlY3Rvci5fdGVtcFswXSxcclxuICAgICAgICAgICAgdGVtcEEgPSBWZWN0b3IuX3RlbXBbMV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhaXIgPSBwYWlyc1tpXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSB8fCBwYWlyLmlzU2Vuc29yKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb250YWN0cyA9IHBhaXIuYWN0aXZlQ29udGFjdHM7XHJcbiAgICAgICAgICAgIGNvbGxpc2lvbiA9IHBhaXIuY29sbGlzaW9uO1xyXG4gICAgICAgICAgICBib2R5QSA9IGNvbGxpc2lvbi5wYXJlbnRBO1xyXG4gICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5wYXJlbnRCO1xyXG4gICAgICAgICAgICBub3JtYWwgPSBjb2xsaXNpb24ubm9ybWFsO1xyXG4gICAgICAgICAgICB0YW5nZW50ID0gY29sbGlzaW9uLnRhbmdlbnQ7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNvbHZlIGVhY2ggY29udGFjdFxyXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29udGFjdHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhY3QgPSBjb250YWN0c1tqXTtcclxuICAgICAgICAgICAgICAgIGNvbnRhY3RWZXJ0ZXggPSBjb250YWN0LnZlcnRleDtcclxuICAgICAgICAgICAgICAgIG5vcm1hbEltcHVsc2UgPSBjb250YWN0Lm5vcm1hbEltcHVsc2U7XHJcbiAgICAgICAgICAgICAgICB0YW5nZW50SW1wdWxzZSA9IGNvbnRhY3QudGFuZ2VudEltcHVsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbEltcHVsc2UgIT09IDAgfHwgdGFuZ2VudEltcHVsc2UgIT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0b3RhbCBpbXB1bHNlIGZyb20gY29udGFjdFxyXG4gICAgICAgICAgICAgICAgICAgIGltcHVsc2UueCA9IChub3JtYWwueCAqIG5vcm1hbEltcHVsc2UpICsgKHRhbmdlbnQueCAqIHRhbmdlbnRJbXB1bHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLnkgPSAobm9ybWFsLnkgKiBub3JtYWxJbXB1bHNlKSArICh0YW5nZW50LnkgKiB0YW5nZW50SW1wdWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgaW1wdWxzZSBmcm9tIGNvbnRhY3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIShib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBWZWN0b3Iuc3ViKGNvbnRhY3RWZXJ0ZXgsIGJvZHlBLnBvc2l0aW9uLCB0ZW1wQSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uUHJldi54ICs9IGltcHVsc2UueCAqIGJvZHlBLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QS5wb3NpdGlvblByZXYueSArPSBpbXB1bHNlLnkgKiBib2R5QS5pbnZlcnNlTWFzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUEuYW5nbGVQcmV2ICs9IFZlY3Rvci5jcm9zcyhvZmZzZXQsIGltcHVsc2UpICogYm9keUEuaW52ZXJzZUluZXJ0aWE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIShib2R5Qi5pc1N0YXRpYyB8fCBib2R5Qi5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBWZWN0b3Iuc3ViKGNvbnRhY3RWZXJ0ZXgsIGJvZHlCLnBvc2l0aW9uLCB0ZW1wQSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uUHJldi54IC09IGltcHVsc2UueCAqIGJvZHlCLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvblByZXYueSAtPSBpbXB1bHNlLnkgKiBib2R5Qi5pbnZlcnNlTWFzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUIuYW5nbGVQcmV2IC09IFZlY3Rvci5jcm9zcyhvZmZzZXQsIGltcHVsc2UpICogYm9keUIuaW52ZXJzZUluZXJ0aWE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgYSBzb2x1dGlvbiBmb3IgcGFpciB2ZWxvY2l0aWVzLlxyXG4gICAgICogQG1ldGhvZCBzb2x2ZVZlbG9jaXR5XHJcbiAgICAgKiBAcGFyYW0ge3BhaXJbXX0gcGFpcnNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcclxuICAgICAqL1xyXG4gICAgUmVzb2x2ZXIuc29sdmVWZWxvY2l0eSA9IGZ1bmN0aW9uKHBhaXJzLCB0aW1lU2NhbGUpIHtcclxuICAgICAgICB2YXIgdGltZVNjYWxlU3F1YXJlZCA9IHRpbWVTY2FsZSAqIHRpbWVTY2FsZSxcclxuICAgICAgICAgICAgaW1wdWxzZSA9IFZlY3Rvci5fdGVtcFswXSxcclxuICAgICAgICAgICAgdGVtcEEgPSBWZWN0b3IuX3RlbXBbMV0sXHJcbiAgICAgICAgICAgIHRlbXBCID0gVmVjdG9yLl90ZW1wWzJdLFxyXG4gICAgICAgICAgICB0ZW1wQyA9IFZlY3Rvci5fdGVtcFszXSxcclxuICAgICAgICAgICAgdGVtcEQgPSBWZWN0b3IuX3RlbXBbNF0sXHJcbiAgICAgICAgICAgIHRlbXBFID0gVmVjdG9yLl90ZW1wWzVdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghcGFpci5pc0FjdGl2ZSB8fCBwYWlyLmlzU2Vuc29yKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgY29sbGlzaW9uID0gcGFpci5jb2xsaXNpb24sXHJcbiAgICAgICAgICAgICAgICBib2R5QSA9IGNvbGxpc2lvbi5wYXJlbnRBLFxyXG4gICAgICAgICAgICAgICAgYm9keUIgPSBjb2xsaXNpb24ucGFyZW50QixcclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IGNvbGxpc2lvbi5ub3JtYWwsXHJcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gY29sbGlzaW9uLnRhbmdlbnQsXHJcbiAgICAgICAgICAgICAgICBjb250YWN0cyA9IHBhaXIuYWN0aXZlQ29udGFjdHMsXHJcbiAgICAgICAgICAgICAgICBjb250YWN0U2hhcmUgPSAxIC8gY29udGFjdHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIGJvZHkgdmVsb2NpdGllc1xyXG4gICAgICAgICAgICBib2R5QS52ZWxvY2l0eS54ID0gYm9keUEucG9zaXRpb24ueCAtIGJvZHlBLnBvc2l0aW9uUHJldi54O1xyXG4gICAgICAgICAgICBib2R5QS52ZWxvY2l0eS55ID0gYm9keUEucG9zaXRpb24ueSAtIGJvZHlBLnBvc2l0aW9uUHJldi55O1xyXG4gICAgICAgICAgICBib2R5Qi52ZWxvY2l0eS54ID0gYm9keUIucG9zaXRpb24ueCAtIGJvZHlCLnBvc2l0aW9uUHJldi54O1xyXG4gICAgICAgICAgICBib2R5Qi52ZWxvY2l0eS55ID0gYm9keUIucG9zaXRpb24ueSAtIGJvZHlCLnBvc2l0aW9uUHJldi55O1xyXG4gICAgICAgICAgICBib2R5QS5hbmd1bGFyVmVsb2NpdHkgPSBib2R5QS5hbmdsZSAtIGJvZHlBLmFuZ2xlUHJldjtcclxuICAgICAgICAgICAgYm9keUIuYW5ndWxhclZlbG9jaXR5ID0gYm9keUIuYW5nbGUgLSBib2R5Qi5hbmdsZVByZXY7XHJcblxyXG4gICAgICAgICAgICAvLyByZXNvbHZlIGVhY2ggY29udGFjdFxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRhY3RzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGFjdCA9IGNvbnRhY3RzW2pdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RWZXJ0ZXggPSBjb250YWN0LnZlcnRleCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRBID0gVmVjdG9yLnN1Yihjb250YWN0VmVydGV4LCBib2R5QS5wb3NpdGlvbiwgdGVtcEEpLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEIgPSBWZWN0b3Iuc3ViKGNvbnRhY3RWZXJ0ZXgsIGJvZHlCLnBvc2l0aW9uLCB0ZW1wQiksXHJcbiAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlQb2ludEEgPSBWZWN0b3IuYWRkKGJvZHlBLnZlbG9jaXR5LCBWZWN0b3IubXVsdChWZWN0b3IucGVycChvZmZzZXRBKSwgYm9keUEuYW5ndWxhclZlbG9jaXR5KSwgdGVtcEMpLFxyXG4gICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5UG9pbnRCID0gVmVjdG9yLmFkZChib2R5Qi52ZWxvY2l0eSwgVmVjdG9yLm11bHQoVmVjdG9yLnBlcnAob2Zmc2V0QiksIGJvZHlCLmFuZ3VsYXJWZWxvY2l0eSksIHRlbXBEKSwgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVWZWxvY2l0eSA9IFZlY3Rvci5zdWIodmVsb2NpdHlQb2ludEEsIHZlbG9jaXR5UG9pbnRCLCB0ZW1wRSksXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsVmVsb2NpdHkgPSBWZWN0b3IuZG90KG5vcm1hbCwgcmVsYXRpdmVWZWxvY2l0eSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHRhbmdlbnRWZWxvY2l0eSA9IFZlY3Rvci5kb3QodGFuZ2VudCwgcmVsYXRpdmVWZWxvY2l0eSksXHJcbiAgICAgICAgICAgICAgICAgICAgdGFuZ2VudFNwZWVkID0gTWF0aC5hYnModGFuZ2VudFZlbG9jaXR5KSxcclxuICAgICAgICAgICAgICAgICAgICB0YW5nZW50VmVsb2NpdHlEaXJlY3Rpb24gPSBDb21tb24uc2lnbih0YW5nZW50VmVsb2NpdHkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJhdyBpbXB1bHNlc1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbEltcHVsc2UgPSAoMSArIHBhaXIucmVzdGl0dXRpb24pICogbm9ybWFsVmVsb2NpdHksXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsRm9yY2UgPSBDb21tb24uY2xhbXAocGFpci5zZXBhcmF0aW9uICsgbm9ybWFsVmVsb2NpdHksIDAsIDEpICogUmVzb2x2ZXIuX2ZyaWN0aW9uTm9ybWFsTXVsdGlwbGllcjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjb3Vsb21iIGZyaWN0aW9uXHJcbiAgICAgICAgICAgICAgICB2YXIgdGFuZ2VudEltcHVsc2UgPSB0YW5nZW50VmVsb2NpdHksXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4RnJpY3Rpb24gPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFuZ2VudFNwZWVkID4gcGFpci5mcmljdGlvbiAqIHBhaXIuZnJpY3Rpb25TdGF0aWMgKiBub3JtYWxGb3JjZSAqIHRpbWVTY2FsZVNxdWFyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhGcmljdGlvbiA9IHRhbmdlbnRTcGVlZDtcclxuICAgICAgICAgICAgICAgICAgICB0YW5nZW50SW1wdWxzZSA9IENvbW1vbi5jbGFtcChcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpci5mcmljdGlvbiAqIHRhbmdlbnRWZWxvY2l0eURpcmVjdGlvbiAqIHRpbWVTY2FsZVNxdWFyZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC1tYXhGcmljdGlvbiwgbWF4RnJpY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIG1vZGlmeSBpbXB1bHNlcyBhY2NvdW50aW5nIGZvciBtYXNzLCBpbmVydGlhIGFuZCBvZmZzZXRcclxuICAgICAgICAgICAgICAgIHZhciBvQWNOID0gVmVjdG9yLmNyb3NzKG9mZnNldEEsIG5vcm1hbCksXHJcbiAgICAgICAgICAgICAgICAgICAgb0JjTiA9IFZlY3Rvci5jcm9zcyhvZmZzZXRCLCBub3JtYWwpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlID0gY29udGFjdFNoYXJlIC8gKGJvZHlBLmludmVyc2VNYXNzICsgYm9keUIuaW52ZXJzZU1hc3MgKyBib2R5QS5pbnZlcnNlSW5lcnRpYSAqIG9BY04gKiBvQWNOICArIGJvZHlCLmludmVyc2VJbmVydGlhICogb0JjTiAqIG9CY04pO1xyXG5cclxuICAgICAgICAgICAgICAgIG5vcm1hbEltcHVsc2UgKj0gc2hhcmU7XHJcbiAgICAgICAgICAgICAgICB0YW5nZW50SW1wdWxzZSAqPSBzaGFyZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaGlnaCB2ZWxvY2l0eSBhbmQgcmVzdGluZyBjb2xsaXNpb25zIHNlcGFyYXRlbHlcclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxWZWxvY2l0eSA8IDAgJiYgbm9ybWFsVmVsb2NpdHkgKiBub3JtYWxWZWxvY2l0eSA+IFJlc29sdmVyLl9yZXN0aW5nVGhyZXNoICogdGltZVNjYWxlU3F1YXJlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZ2ggbm9ybWFsIHZlbG9jaXR5IHNvIGNsZWFyIGNhY2hlZCBjb250YWN0IG5vcm1hbCBpbXB1bHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdC5ub3JtYWxJbXB1bHNlID0gMDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc29sdmUgcmVzdGluZyBjb2xsaXNpb24gY29uc3RyYWludHMgdXNpbmcgRXJpbiBDYXR0bydzIG1ldGhvZCAoR0RDMDgpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaW1wdWxzZSBjb25zdHJhaW50IHRlbmRzIHRvIDBcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFjdE5vcm1hbEltcHVsc2UgPSBjb250YWN0Lm5vcm1hbEltcHVsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdC5ub3JtYWxJbXB1bHNlID0gTWF0aC5taW4oY29udGFjdC5ub3JtYWxJbXB1bHNlICsgbm9ybWFsSW1wdWxzZSwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsSW1wdWxzZSA9IGNvbnRhY3Qubm9ybWFsSW1wdWxzZSAtIGNvbnRhY3ROb3JtYWxJbXB1bHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBoaWdoIHZlbG9jaXR5IGFuZCByZXN0aW5nIGNvbGxpc2lvbnMgc2VwYXJhdGVseVxyXG4gICAgICAgICAgICAgICAgaWYgKHRhbmdlbnRWZWxvY2l0eSAqIHRhbmdlbnRWZWxvY2l0eSA+IFJlc29sdmVyLl9yZXN0aW5nVGhyZXNoVGFuZ2VudCAqIHRpbWVTY2FsZVNxdWFyZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBoaWdoIHRhbmdlbnQgdmVsb2NpdHkgc28gY2xlYXIgY2FjaGVkIGNvbnRhY3QgdGFuZ2VudCBpbXB1bHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdC50YW5nZW50SW1wdWxzZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvbHZlIHJlc3RpbmcgY29sbGlzaW9uIGNvbnN0cmFpbnRzIHVzaW5nIEVyaW4gQ2F0dG8ncyBtZXRob2QgKEdEQzA4KVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhbmdlbnQgaW1wdWxzZSB0ZW5kcyB0byAtdGFuZ2VudFNwZWVkIG9yICt0YW5nZW50U3BlZWRcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFjdFRhbmdlbnRJbXB1bHNlID0gY29udGFjdC50YW5nZW50SW1wdWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWN0LnRhbmdlbnRJbXB1bHNlID0gQ29tbW9uLmNsYW1wKGNvbnRhY3QudGFuZ2VudEltcHVsc2UgKyB0YW5nZW50SW1wdWxzZSwgLW1heEZyaWN0aW9uLCBtYXhGcmljdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFuZ2VudEltcHVsc2UgPSBjb250YWN0LnRhbmdlbnRJbXB1bHNlIC0gY29udGFjdFRhbmdlbnRJbXB1bHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIHRvdGFsIGltcHVsc2UgZnJvbSBjb250YWN0XHJcbiAgICAgICAgICAgICAgICBpbXB1bHNlLnggPSAobm9ybWFsLnggKiBub3JtYWxJbXB1bHNlKSArICh0YW5nZW50LnggKiB0YW5nZW50SW1wdWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpbXB1bHNlLnkgPSAobm9ybWFsLnkgKiBub3JtYWxJbXB1bHNlKSArICh0YW5nZW50LnkgKiB0YW5nZW50SW1wdWxzZSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGltcHVsc2UgZnJvbSBjb250YWN0XHJcbiAgICAgICAgICAgICAgICBpZiAoIShib2R5QS5pc1N0YXRpYyB8fCBib2R5QS5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uUHJldi54ICs9IGltcHVsc2UueCAqIGJvZHlBLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uUHJldi55ICs9IGltcHVsc2UueSAqIGJvZHlBLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlBLmFuZ2xlUHJldiArPSBWZWN0b3IuY3Jvc3Mob2Zmc2V0QSwgaW1wdWxzZSkgKiBib2R5QS5pbnZlcnNlSW5lcnRpYTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIShib2R5Qi5pc1N0YXRpYyB8fCBib2R5Qi5pc1NsZWVwaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uUHJldi54IC09IGltcHVsc2UueCAqIGJvZHlCLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uUHJldi55IC09IGltcHVsc2UueSAqIGJvZHlCLmludmVyc2VNYXNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlCLmFuZ2xlUHJldiAtPSBWZWN0b3IuY3Jvc3Mob2Zmc2V0QiwgaW1wdWxzZSkgKiBib2R5Qi5pbnZlcnNlSW5lcnRpYTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5TQVRgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBkZXRlY3RpbmcgY29sbGlzaW9ucyB1c2luZyB0aGUgU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0uXHJcbipcclxuKiBAY2xhc3MgU0FUXHJcbiovXHJcblxyXG4vLyBUT0RPOiB0cnVlIGNpcmNsZXMgYW5kIGN1cnZlc1xyXG5cclxudmFyIFNBVCA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTQVQ7XHJcblxyXG52YXIgVmVydGljZXMgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZXJ0aWNlcycpO1xyXG52YXIgVmVjdG9yID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvVmVjdG9yJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlY3QgY29sbGlzaW9uIGJldHdlZW4gdHdvIGJvZGllcyB1c2luZyB0aGUgU2VwYXJhdGluZyBBeGlzIFRoZW9yZW0uXHJcbiAgICAgKiBAbWV0aG9kIGNvbGxpZGVzXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlBXHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlCXHJcbiAgICAgKiBAcGFyYW0ge2NvbGxpc2lvbn0gcHJldmlvdXNDb2xsaXNpb25cclxuICAgICAqIEByZXR1cm4ge2NvbGxpc2lvbn0gY29sbGlzaW9uXHJcbiAgICAgKi9cclxuICAgIFNBVC5jb2xsaWRlcyA9IGZ1bmN0aW9uKGJvZHlBLCBib2R5QiwgcHJldmlvdXNDb2xsaXNpb24pIHtcclxuICAgICAgICB2YXIgb3ZlcmxhcEFCLFxyXG4gICAgICAgICAgICBvdmVybGFwQkEsIFxyXG4gICAgICAgICAgICBtaW5PdmVybGFwLFxyXG4gICAgICAgICAgICBjb2xsaXNpb24sXHJcbiAgICAgICAgICAgIGNhblJldXNlUHJldkNvbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocHJldmlvdXNDb2xsaXNpb24pIHtcclxuICAgICAgICAgICAgLy8gZXN0aW1hdGUgdG90YWwgbW90aW9uXHJcbiAgICAgICAgICAgIHZhciBwYXJlbnRBID0gYm9keUEucGFyZW50LFxyXG4gICAgICAgICAgICAgICAgcGFyZW50QiA9IGJvZHlCLnBhcmVudCxcclxuICAgICAgICAgICAgICAgIG1vdGlvbiA9IHBhcmVudEEuc3BlZWQgKiBwYXJlbnRBLnNwZWVkICsgcGFyZW50QS5hbmd1bGFyU3BlZWQgKiBwYXJlbnRBLmFuZ3VsYXJTcGVlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50Qi5zcGVlZCAqIHBhcmVudEIuc3BlZWQgKyBwYXJlbnRCLmFuZ3VsYXJTcGVlZCAqIHBhcmVudEIuYW5ndWxhclNwZWVkO1xyXG5cclxuICAgICAgICAgICAgLy8gd2UgbWF5IGJlIGFibGUgdG8gKHBhcnRpYWxseSkgcmV1c2UgY29sbGlzaW9uIHJlc3VsdCBcclxuICAgICAgICAgICAgLy8gYnV0IG9ubHkgc2FmZSBpZiBjb2xsaXNpb24gd2FzIHJlc3RpbmdcclxuICAgICAgICAgICAgY2FuUmV1c2VQcmV2Q29sID0gcHJldmlvdXNDb2xsaXNpb24gJiYgcHJldmlvdXNDb2xsaXNpb24uY29sbGlkZWQgJiYgbW90aW9uIDwgMC4yO1xyXG5cclxuICAgICAgICAgICAgLy8gcmV1c2UgY29sbGlzaW9uIG9iamVjdFxyXG4gICAgICAgICAgICBjb2xsaXNpb24gPSBwcmV2aW91c0NvbGxpc2lvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xsaXNpb24gPSB7IGNvbGxpZGVkOiBmYWxzZSwgYm9keUE6IGJvZHlBLCBib2R5QjogYm9keUIgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmV2aW91c0NvbGxpc2lvbiAmJiBjYW5SZXVzZVByZXZDb2wpIHtcclxuICAgICAgICAgICAgLy8gaWYgd2UgY2FuIHJldXNlIHRoZSBjb2xsaXNpb24gcmVzdWx0XHJcbiAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byB0ZXN0IHRoZSBwcmV2aW91c2x5IGZvdW5kIGF4aXNcclxuICAgICAgICAgICAgdmFyIGF4aXNCb2R5QSA9IGNvbGxpc2lvbi5heGlzQm9keSxcclxuICAgICAgICAgICAgICAgIGF4aXNCb2R5QiA9IGF4aXNCb2R5QSA9PT0gYm9keUEgPyBib2R5QiA6IGJvZHlBLFxyXG4gICAgICAgICAgICAgICAgYXhlcyA9IFtheGlzQm9keUEuYXhlc1twcmV2aW91c0NvbGxpc2lvbi5heGlzTnVtYmVyXV07XHJcblxyXG4gICAgICAgICAgICBtaW5PdmVybGFwID0gU0FULl9vdmVybGFwQXhlcyhheGlzQm9keUEudmVydGljZXMsIGF4aXNCb2R5Qi52ZXJ0aWNlcywgYXhlcyk7XHJcbiAgICAgICAgICAgIGNvbGxpc2lvbi5yZXVzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1pbk92ZXJsYXAub3ZlcmxhcCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24uY29sbGlkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsaXNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCByZXVzZSBhIHJlc3VsdCwgcGVyZm9ybSBhIGZ1bGwgU0FUIHRlc3RcclxuXHJcbiAgICAgICAgICAgIG92ZXJsYXBBQiA9IFNBVC5fb3ZlcmxhcEF4ZXMoYm9keUEudmVydGljZXMsIGJvZHlCLnZlcnRpY2VzLCBib2R5QS5heGVzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwQUIub3ZlcmxhcCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24uY29sbGlkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsaXNpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG92ZXJsYXBCQSA9IFNBVC5fb3ZlcmxhcEF4ZXMoYm9keUIudmVydGljZXMsIGJvZHlBLnZlcnRpY2VzLCBib2R5Qi5heGVzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwQkEub3ZlcmxhcCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb2xsaXNpb24uY29sbGlkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsaXNpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwQUIub3ZlcmxhcCA8IG92ZXJsYXBCQS5vdmVybGFwKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcEFCO1xyXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uLmF4aXNCb2R5ID0gYm9keUE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcEJBO1xyXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uLmF4aXNCb2R5ID0gYm9keUI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGltcG9ydGFudCBmb3IgcmV1c2UgbGF0ZXJcclxuICAgICAgICAgICAgY29sbGlzaW9uLmF4aXNOdW1iZXIgPSBtaW5PdmVybGFwLmF4aXNOdW1iZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb2xsaXNpb24uYm9keUEgPSBib2R5QS5pZCA8IGJvZHlCLmlkID8gYm9keUEgOiBib2R5QjtcclxuICAgICAgICBjb2xsaXNpb24uYm9keUIgPSBib2R5QS5pZCA8IGJvZHlCLmlkID8gYm9keUIgOiBib2R5QTtcclxuICAgICAgICBjb2xsaXNpb24uY29sbGlkZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbGxpc2lvbi5kZXB0aCA9IG1pbk92ZXJsYXAub3ZlcmxhcDtcclxuICAgICAgICBjb2xsaXNpb24ucGFyZW50QSA9IGNvbGxpc2lvbi5ib2R5QS5wYXJlbnQ7XHJcbiAgICAgICAgY29sbGlzaW9uLnBhcmVudEIgPSBjb2xsaXNpb24uYm9keUIucGFyZW50O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGJvZHlBID0gY29sbGlzaW9uLmJvZHlBO1xyXG4gICAgICAgIGJvZHlCID0gY29sbGlzaW9uLmJvZHlCO1xyXG5cclxuICAgICAgICAvLyBlbnN1cmUgbm9ybWFsIGlzIGZhY2luZyBhd2F5IGZyb20gYm9keUFcclxuICAgICAgICBpZiAoVmVjdG9yLmRvdChtaW5PdmVybGFwLmF4aXMsIFZlY3Rvci5zdWIoYm9keUIucG9zaXRpb24sIGJvZHlBLnBvc2l0aW9uKSkgPCAwKSB7XHJcbiAgICAgICAgICAgIGNvbGxpc2lvbi5ub3JtYWwgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBtaW5PdmVybGFwLmF4aXMueCxcclxuICAgICAgICAgICAgICAgIHk6IG1pbk92ZXJsYXAuYXhpcy55XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29sbGlzaW9uLm5vcm1hbCA9IHtcclxuICAgICAgICAgICAgICAgIHg6IC1taW5PdmVybGFwLmF4aXMueCxcclxuICAgICAgICAgICAgICAgIHk6IC1taW5PdmVybGFwLmF4aXMueVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sbGlzaW9uLnRhbmdlbnQgPSBWZWN0b3IucGVycChjb2xsaXNpb24ubm9ybWFsKTtcclxuXHJcbiAgICAgICAgY29sbGlzaW9uLnBlbmV0cmF0aW9uID0gY29sbGlzaW9uLnBlbmV0cmF0aW9uIHx8IHt9O1xyXG4gICAgICAgIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi54ID0gY29sbGlzaW9uLm5vcm1hbC54ICogY29sbGlzaW9uLmRlcHRoO1xyXG4gICAgICAgIGNvbGxpc2lvbi5wZW5ldHJhdGlvbi55ID0gY29sbGlzaW9uLm5vcm1hbC55ICogY29sbGlzaW9uLmRlcHRoOyBcclxuXHJcbiAgICAgICAgLy8gZmluZCBzdXBwb3J0IHBvaW50cywgdGhlcmUgaXMgYWx3YXlzIGVpdGhlciBleGFjdGx5IG9uZSBvciB0d29cclxuICAgICAgICB2YXIgdmVydGljZXNCID0gU0FULl9maW5kU3VwcG9ydHMoYm9keUEsIGJvZHlCLCBjb2xsaXNpb24ubm9ybWFsKSxcclxuICAgICAgICAgICAgc3VwcG9ydHMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gZmluZCB0aGUgc3VwcG9ydHMgZnJvbSBib2R5QiB0aGF0IGFyZSBpbnNpZGUgYm9keUFcclxuICAgICAgICBpZiAoVmVydGljZXMuY29udGFpbnMoYm9keUEudmVydGljZXMsIHZlcnRpY2VzQlswXSkpXHJcbiAgICAgICAgICAgIHN1cHBvcnRzLnB1c2godmVydGljZXNCWzBdKTtcclxuXHJcbiAgICAgICAgaWYgKFZlcnRpY2VzLmNvbnRhaW5zKGJvZHlBLnZlcnRpY2VzLCB2ZXJ0aWNlc0JbMV0pKVxyXG4gICAgICAgICAgICBzdXBwb3J0cy5wdXNoKHZlcnRpY2VzQlsxXSk7XHJcblxyXG4gICAgICAgIC8vIGZpbmQgdGhlIHN1cHBvcnRzIGZyb20gYm9keUEgdGhhdCBhcmUgaW5zaWRlIGJvZHlCXHJcbiAgICAgICAgaWYgKHN1cHBvcnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgICAgdmFyIHZlcnRpY2VzQSA9IFNBVC5fZmluZFN1cHBvcnRzKGJvZHlCLCBib2R5QSwgVmVjdG9yLm5lZyhjb2xsaXNpb24ubm9ybWFsKSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKFZlcnRpY2VzLmNvbnRhaW5zKGJvZHlCLnZlcnRpY2VzLCB2ZXJ0aWNlc0FbMF0pKVxyXG4gICAgICAgICAgICAgICAgc3VwcG9ydHMucHVzaCh2ZXJ0aWNlc0FbMF0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1cHBvcnRzLmxlbmd0aCA8IDIgJiYgVmVydGljZXMuY29udGFpbnMoYm9keUIudmVydGljZXMsIHZlcnRpY2VzQVsxXSkpXHJcbiAgICAgICAgICAgICAgICBzdXBwb3J0cy5wdXNoKHZlcnRpY2VzQVsxXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgZWRnZSBjYXNlIG9mIG92ZXJsYXBwaW5nIGJ1dCBubyB2ZXJ0ZXggY29udGFpbm1lbnRcclxuICAgICAgICBpZiAoc3VwcG9ydHMubGVuZ3RoIDwgMSlcclxuICAgICAgICAgICAgc3VwcG9ydHMgPSBbdmVydGljZXNCWzBdXTtcclxuICAgICAgICBcclxuICAgICAgICBjb2xsaXNpb24uc3VwcG9ydHMgPSBzdXBwb3J0cztcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxpc2lvbjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHRoZSBvdmVybGFwIGJldHdlZW4gdHdvIHNldHMgb2YgdmVydGljZXMuXHJcbiAgICAgKiBAbWV0aG9kIF9vdmVybGFwQXhlc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7fSB2ZXJ0aWNlc0FcclxuICAgICAqIEBwYXJhbSB7fSB2ZXJ0aWNlc0JcclxuICAgICAqIEBwYXJhbSB7fSBheGVzXHJcbiAgICAgKiBAcmV0dXJuIHJlc3VsdFxyXG4gICAgICovXHJcbiAgICBTQVQuX292ZXJsYXBBeGVzID0gZnVuY3Rpb24odmVydGljZXNBLCB2ZXJ0aWNlc0IsIGF4ZXMpIHtcclxuICAgICAgICB2YXIgcHJvamVjdGlvbkEgPSBWZWN0b3IuX3RlbXBbMF0sIFxyXG4gICAgICAgICAgICBwcm9qZWN0aW9uQiA9IFZlY3Rvci5fdGVtcFsxXSxcclxuICAgICAgICAgICAgcmVzdWx0ID0geyBvdmVybGFwOiBOdW1iZXIuTUFYX1ZBTFVFIH0sXHJcbiAgICAgICAgICAgIG92ZXJsYXAsXHJcbiAgICAgICAgICAgIGF4aXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBheGlzID0gYXhlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIFNBVC5fcHJvamVjdFRvQXhpcyhwcm9qZWN0aW9uQSwgdmVydGljZXNBLCBheGlzKTtcclxuICAgICAgICAgICAgU0FULl9wcm9qZWN0VG9BeGlzKHByb2plY3Rpb25CLCB2ZXJ0aWNlc0IsIGF4aXMpO1xyXG5cclxuICAgICAgICAgICAgb3ZlcmxhcCA9IE1hdGgubWluKHByb2plY3Rpb25BLm1heCAtIHByb2plY3Rpb25CLm1pbiwgcHJvamVjdGlvbkIubWF4IC0gcHJvamVjdGlvbkEubWluKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5vdmVybGFwID0gb3ZlcmxhcDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvdmVybGFwIDwgcmVzdWx0Lm92ZXJsYXApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5vdmVybGFwID0gb3ZlcmxhcDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5heGlzID0gYXhpcztcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5heGlzTnVtYmVyID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9qZWN0cyB2ZXJ0aWNlcyBvbiBhbiBheGlzIGFuZCByZXR1cm5zIGFuIGludGVydmFsLlxyXG4gICAgICogQG1ldGhvZCBfcHJvamVjdFRvQXhpc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7fSBwcm9qZWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge30gdmVydGljZXNcclxuICAgICAqIEBwYXJhbSB7fSBheGlzXHJcbiAgICAgKi9cclxuICAgIFNBVC5fcHJvamVjdFRvQXhpcyA9IGZ1bmN0aW9uKHByb2plY3Rpb24sIHZlcnRpY2VzLCBheGlzKSB7XHJcbiAgICAgICAgdmFyIG1pbiA9IFZlY3Rvci5kb3QodmVydGljZXNbMF0sIGF4aXMpLFxyXG4gICAgICAgICAgICBtYXggPSBtaW47XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgdmFyIGRvdCA9IFZlY3Rvci5kb3QodmVydGljZXNbaV0sIGF4aXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRvdCA+IG1heCkgeyBcclxuICAgICAgICAgICAgICAgIG1heCA9IGRvdDsgXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG90IDwgbWluKSB7IFxyXG4gICAgICAgICAgICAgICAgbWluID0gZG90OyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvamVjdGlvbi5taW4gPSBtaW47XHJcbiAgICAgICAgcHJvamVjdGlvbi5tYXggPSBtYXg7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIHN1cHBvcnRpbmcgdmVydGljZXMgZ2l2ZW4gdHdvIGJvZGllcyBhbG9uZyBhIGdpdmVuIGRpcmVjdGlvbiB1c2luZyBoaWxsLWNsaW1iaW5nLlxyXG4gICAgICogQG1ldGhvZCBfZmluZFN1cHBvcnRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHt9IGJvZHlBXHJcbiAgICAgKiBAcGFyYW0ge30gYm9keUJcclxuICAgICAqIEBwYXJhbSB7fSBub3JtYWxcclxuICAgICAqIEByZXR1cm4gW3ZlY3Rvcl1cclxuICAgICAqL1xyXG4gICAgU0FULl9maW5kU3VwcG9ydHMgPSBmdW5jdGlvbihib2R5QSwgYm9keUIsIG5vcm1hbCkge1xyXG4gICAgICAgIHZhciBuZWFyZXN0RGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFLFxyXG4gICAgICAgICAgICB2ZXJ0ZXhUb0JvZHkgPSBWZWN0b3IuX3RlbXBbMF0sXHJcbiAgICAgICAgICAgIHZlcnRpY2VzID0gYm9keUIudmVydGljZXMsXHJcbiAgICAgICAgICAgIGJvZHlBUG9zaXRpb24gPSBib2R5QS5wb3NpdGlvbixcclxuICAgICAgICAgICAgZGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHZlcnRleCxcclxuICAgICAgICAgICAgdmVydGV4QSxcclxuICAgICAgICAgICAgdmVydGV4QjtcclxuXHJcbiAgICAgICAgLy8gZmluZCBjbG9zZXN0IHZlcnRleCBvbiBib2R5QlxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV07XHJcbiAgICAgICAgICAgIHZlcnRleFRvQm9keS54ID0gdmVydGV4LnggLSBib2R5QVBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgIHZlcnRleFRvQm9keS55ID0gdmVydGV4LnkgLSBib2R5QVBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIGRpc3RhbmNlID0gLVZlY3Rvci5kb3Qobm9ybWFsLCB2ZXJ0ZXhUb0JvZHkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbmVhcmVzdERpc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBuZWFyZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgIHZlcnRleEEgPSB2ZXJ0ZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZpbmQgbmV4dCBjbG9zZXN0IHZlcnRleCB1c2luZyB0aGUgdHdvIGNvbm5lY3RlZCB0byBpdFxyXG4gICAgICAgIHZhciBwcmV2SW5kZXggPSB2ZXJ0ZXhBLmluZGV4IC0gMSA+PSAwID8gdmVydGV4QS5pbmRleCAtIDEgOiB2ZXJ0aWNlcy5sZW5ndGggLSAxO1xyXG4gICAgICAgIHZlcnRleCA9IHZlcnRpY2VzW3ByZXZJbmRleF07XHJcbiAgICAgICAgdmVydGV4VG9Cb2R5LnggPSB2ZXJ0ZXgueCAtIGJvZHlBUG9zaXRpb24ueDtcclxuICAgICAgICB2ZXJ0ZXhUb0JvZHkueSA9IHZlcnRleC55IC0gYm9keUFQb3NpdGlvbi55O1xyXG4gICAgICAgIG5lYXJlc3REaXN0YW5jZSA9IC1WZWN0b3IuZG90KG5vcm1hbCwgdmVydGV4VG9Cb2R5KTtcclxuICAgICAgICB2ZXJ0ZXhCID0gdmVydGV4O1xyXG5cclxuICAgICAgICB2YXIgbmV4dEluZGV4ID0gKHZlcnRleEEuaW5kZXggKyAxKSAlIHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICB2ZXJ0ZXggPSB2ZXJ0aWNlc1tuZXh0SW5kZXhdO1xyXG4gICAgICAgIHZlcnRleFRvQm9keS54ID0gdmVydGV4LnggLSBib2R5QVBvc2l0aW9uLng7XHJcbiAgICAgICAgdmVydGV4VG9Cb2R5LnkgPSB2ZXJ0ZXgueSAtIGJvZHlBUG9zaXRpb24ueTtcclxuICAgICAgICBkaXN0YW5jZSA9IC1WZWN0b3IuZG90KG5vcm1hbCwgdmVydGV4VG9Cb2R5KTtcclxuICAgICAgICBpZiAoZGlzdGFuY2UgPCBuZWFyZXN0RGlzdGFuY2UpIHtcclxuICAgICAgICAgICAgdmVydGV4QiA9IHZlcnRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbdmVydGV4QSwgdmVydGV4Ql07XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuQ29uc3RyYWludGAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgY29uc3RyYWludHMuXHJcbiogQ29uc3RyYWludHMgYXJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhhdCBhIGZpeGVkIGRpc3RhbmNlIG11c3QgYmUgbWFpbnRhaW5lZCBiZXR3ZWVuIHR3byBib2RpZXMgKG9yIGEgYm9keSBhbmQgYSBmaXhlZCB3b3JsZC1zcGFjZSBwb3NpdGlvbikuXHJcbiogVGhlIHN0aWZmbmVzcyBvZiBjb25zdHJhaW50cyBjYW4gYmUgbW9kaWZpZWQgdG8gY3JlYXRlIHNwcmluZ3Mgb3IgZWxhc3RpYy5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgQ29uc3RyYWludFxyXG4qL1xyXG5cclxudmFyIENvbnN0cmFpbnQgPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29uc3RyYWludDtcclxuXHJcbnZhciBWZXJ0aWNlcyA9IHJlcXVpcmUoJy4uL2dlb21ldHJ5L1ZlcnRpY2VzJyk7XHJcbnZhciBWZWN0b3IgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZWN0b3InKTtcclxudmFyIFNsZWVwaW5nID0gcmVxdWlyZSgnLi4vY29yZS9TbGVlcGluZycpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBBeGVzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQXhlcycpO1xyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi4vY29yZS9Db21tb24nKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICBDb25zdHJhaW50Ll93YXJtaW5nID0gMC40O1xyXG4gICAgQ29uc3RyYWludC5fdG9ycXVlRGFtcGVuID0gMTtcclxuICAgIENvbnN0cmFpbnQuX21pbkxlbmd0aCA9IDAuMDAwMDAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb25zdHJhaW50LlxyXG4gICAgICogQWxsIHByb3BlcnRpZXMgaGF2ZSBkZWZhdWx0IHZhbHVlcywgYW5kIG1hbnkgYXJlIHByZS1jYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gb3RoZXIgcHJvcGVydGllcy5cclxuICAgICAqIFRvIHNpbXVsYXRlIGEgcmV2b2x1dGUgY29uc3RyYWludCAob3IgcGluIGpvaW50KSBzZXQgYGxlbmd0aDogMGAgYW5kIGEgaGlnaCBgc3RpZmZuZXNzYCB2YWx1ZSAoZS5nLiBgMC43YCBvciBhYm92ZSkuXHJcbiAgICAgKiBJZiB0aGUgY29uc3RyYWludCBpcyB1bnN0YWJsZSwgdHJ5IGxvd2VyaW5nIHRoZSBgc3RpZmZuZXNzYCB2YWx1ZSBhbmQgLyBvciBpbmNyZWFzaW5nIGBlbmdpbmUuY29uc3RyYWludEl0ZXJhdGlvbnNgLlxyXG4gICAgICogRm9yIGNvbXBvdW5kIGJvZGllcywgY29uc3RyYWludHMgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJlbnQgYm9keSAobm90IG9uZSBvZiBpdHMgcGFydHMpLlxyXG4gICAgICogU2VlIHRoZSBwcm9wZXJ0aWVzIHNlY3Rpb24gYmVsb3cgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cclxuICAgICAqIEBtZXRob2QgY3JlYXRlXHJcbiAgICAgKiBAcGFyYW0ge30gb3B0aW9uc1xyXG4gICAgICogQHJldHVybiB7Y29uc3RyYWludH0gY29uc3RyYWludFxyXG4gICAgICovXHJcbiAgICBDb25zdHJhaW50LmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgY29uc3RyYWludCA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIC8vIGlmIGJvZGllcyBkZWZpbmVkIGJ1dCBubyBwb2ludHMsIHVzZSBib2R5IGNlbnRyZVxyXG4gICAgICAgIGlmIChjb25zdHJhaW50LmJvZHlBICYmICFjb25zdHJhaW50LnBvaW50QSlcclxuICAgICAgICAgICAgY29uc3RyYWludC5wb2ludEEgPSB7IHg6IDAsIHk6IDAgfTtcclxuICAgICAgICBpZiAoY29uc3RyYWludC5ib2R5QiAmJiAhY29uc3RyYWludC5wb2ludEIpXHJcbiAgICAgICAgICAgIGNvbnN0cmFpbnQucG9pbnRCID0geyB4OiAwLCB5OiAwIH07XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzdGF0aWMgbGVuZ3RoIHVzaW5nIGluaXRpYWwgd29ybGQgc3BhY2UgcG9pbnRzXHJcbiAgICAgICAgdmFyIGluaXRpYWxQb2ludEEgPSBjb25zdHJhaW50LmJvZHlBID8gVmVjdG9yLmFkZChjb25zdHJhaW50LmJvZHlBLnBvc2l0aW9uLCBjb25zdHJhaW50LnBvaW50QSkgOiBjb25zdHJhaW50LnBvaW50QSxcclxuICAgICAgICAgICAgaW5pdGlhbFBvaW50QiA9IGNvbnN0cmFpbnQuYm9keUIgPyBWZWN0b3IuYWRkKGNvbnN0cmFpbnQuYm9keUIucG9zaXRpb24sIGNvbnN0cmFpbnQucG9pbnRCKSA6IGNvbnN0cmFpbnQucG9pbnRCLFxyXG4gICAgICAgICAgICBsZW5ndGggPSBWZWN0b3IubWFnbml0dWRlKFZlY3Rvci5zdWIoaW5pdGlhbFBvaW50QSwgaW5pdGlhbFBvaW50QikpO1xyXG4gICAgXHJcbiAgICAgICAgY29uc3RyYWludC5sZW5ndGggPSB0eXBlb2YgY29uc3RyYWludC5sZW5ndGggIT09ICd1bmRlZmluZWQnID8gY29uc3RyYWludC5sZW5ndGggOiBsZW5ndGg7XHJcblxyXG4gICAgICAgIC8vIG9wdGlvbiBkZWZhdWx0c1xyXG4gICAgICAgIGNvbnN0cmFpbnQuaWQgPSBjb25zdHJhaW50LmlkIHx8IENvbW1vbi5uZXh0SWQoKTtcclxuICAgICAgICBjb25zdHJhaW50LmxhYmVsID0gY29uc3RyYWludC5sYWJlbCB8fCAnQ29uc3RyYWludCc7XHJcbiAgICAgICAgY29uc3RyYWludC50eXBlID0gJ2NvbnN0cmFpbnQnO1xyXG4gICAgICAgIGNvbnN0cmFpbnQuc3RpZmZuZXNzID0gY29uc3RyYWludC5zdGlmZm5lc3MgfHwgKGNvbnN0cmFpbnQubGVuZ3RoID4gMCA/IDEgOiAwLjcpO1xyXG4gICAgICAgIGNvbnN0cmFpbnQuZGFtcGluZyA9IGNvbnN0cmFpbnQuZGFtcGluZyB8fCAwO1xyXG4gICAgICAgIGNvbnN0cmFpbnQuYW5ndWxhclN0aWZmbmVzcyA9IGNvbnN0cmFpbnQuYW5ndWxhclN0aWZmbmVzcyB8fCAwO1xyXG4gICAgICAgIGNvbnN0cmFpbnQuYW5nbGVBID0gY29uc3RyYWludC5ib2R5QSA/IGNvbnN0cmFpbnQuYm9keUEuYW5nbGUgOiBjb25zdHJhaW50LmFuZ2xlQTtcclxuICAgICAgICBjb25zdHJhaW50LmFuZ2xlQiA9IGNvbnN0cmFpbnQuYm9keUIgPyBjb25zdHJhaW50LmJvZHlCLmFuZ2xlIDogY29uc3RyYWludC5hbmdsZUI7XHJcbiAgICAgICAgY29uc3RyYWludC5wbHVnaW4gPSB7fTtcclxuXHJcbiAgICAgICAgLy8gcmVuZGVyXHJcbiAgICAgICAgdmFyIHJlbmRlciA9IHtcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgdHlwZTogJ2xpbmUnLFxyXG4gICAgICAgICAgICBhbmNob3JzOiB0cnVlLFxyXG4gICAgICAgICAgICBsaW5lQ29sb3I6IG51bGwsIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgbGluZU9wYWNpdHk6IG51bGwsIC8vIGN1c3RvbSBQaGFzZXIgcHJvcGVydHlcclxuICAgICAgICAgICAgbGluZVRoaWNrbmVzczogbnVsbCwgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgICAgICBwaW5TaXplOiBudWxsLCAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGFuY2hvckNvbG9yOiBudWxsLCAvLyBjdXN0b20gUGhhc2VyIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGFuY2hvclNpemU6IG51bGwgLy8gY3VzdG9tIFBoYXNlciBwcm9wZXJ0eVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChjb25zdHJhaW50Lmxlbmd0aCA9PT0gMCAmJiBjb25zdHJhaW50LnN0aWZmbmVzcyA+IDAuMSkge1xyXG4gICAgICAgICAgICByZW5kZXIudHlwZSA9ICdwaW4nO1xyXG4gICAgICAgICAgICByZW5kZXIuYW5jaG9ycyA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29uc3RyYWludC5zdGlmZm5lc3MgPCAwLjkpIHtcclxuICAgICAgICAgICAgcmVuZGVyLnR5cGUgPSAnc3ByaW5nJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0cmFpbnQucmVuZGVyID0gQ29tbW9uLmV4dGVuZChyZW5kZXIsIGNvbnN0cmFpbnQucmVuZGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGFyZXMgZm9yIHNvbHZpbmcgYnkgY29uc3RyYWludCB3YXJtaW5nLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2QgcHJlU29sdmVBbGxcclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcclxuICAgICAqL1xyXG4gICAgQ29uc3RyYWludC5wcmVTb2x2ZUFsbCA9IGZ1bmN0aW9uKGJvZGllcykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldLFxyXG4gICAgICAgICAgICAgICAgaW1wdWxzZSA9IGJvZHkuY29uc3RyYWludEltcHVsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keS5pc1N0YXRpYyB8fCAoaW1wdWxzZS54ID09PSAwICYmIGltcHVsc2UueSA9PT0gMCAmJiBpbXB1bHNlLmFuZ2xlID09PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueCArPSBpbXB1bHNlLng7XHJcbiAgICAgICAgICAgIGJvZHkucG9zaXRpb24ueSArPSBpbXB1bHNlLnk7XHJcbiAgICAgICAgICAgIGJvZHkuYW5nbGUgKz0gaW1wdWxzZS5hbmdsZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU29sdmVzIGFsbCBjb25zdHJhaW50cyBpbiBhIGxpc3Qgb2YgY29sbGlzaW9ucy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAbWV0aG9kIHNvbHZlQWxsXHJcbiAgICAgKiBAcGFyYW0ge2NvbnN0cmFpbnRbXX0gY29uc3RyYWludHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcclxuICAgICAqL1xyXG4gICAgQ29uc3RyYWludC5zb2x2ZUFsbCA9IGZ1bmN0aW9uKGNvbnN0cmFpbnRzLCB0aW1lU2NhbGUpIHtcclxuICAgICAgICAvLyBTb2x2ZSBmaXhlZCBjb25zdHJhaW50cyBmaXJzdC5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25zdHJhaW50ID0gY29uc3RyYWludHNbaV0sXHJcbiAgICAgICAgICAgICAgICBmaXhlZEEgPSAhY29uc3RyYWludC5ib2R5QSB8fCAoY29uc3RyYWludC5ib2R5QSAmJiBjb25zdHJhaW50LmJvZHlBLmlzU3RhdGljKSxcclxuICAgICAgICAgICAgICAgIGZpeGVkQiA9ICFjb25zdHJhaW50LmJvZHlCIHx8IChjb25zdHJhaW50LmJvZHlCICYmIGNvbnN0cmFpbnQuYm9keUIuaXNTdGF0aWMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZpeGVkQSB8fCBmaXhlZEIpIHtcclxuICAgICAgICAgICAgICAgIENvbnN0cmFpbnQuc29sdmUoY29uc3RyYWludHNbaV0sIHRpbWVTY2FsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNvbHZlIGZyZWUgY29uc3RyYWludHMgbGFzdC5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldO1xyXG4gICAgICAgICAgICBmaXhlZEEgPSAhY29uc3RyYWludC5ib2R5QSB8fCAoY29uc3RyYWludC5ib2R5QSAmJiBjb25zdHJhaW50LmJvZHlBLmlzU3RhdGljKTtcclxuICAgICAgICAgICAgZml4ZWRCID0gIWNvbnN0cmFpbnQuYm9keUIgfHwgKGNvbnN0cmFpbnQuYm9keUIgJiYgY29uc3RyYWludC5ib2R5Qi5pc1N0YXRpYyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWZpeGVkQSAmJiAhZml4ZWRCKSB7XHJcbiAgICAgICAgICAgICAgICBDb25zdHJhaW50LnNvbHZlKGNvbnN0cmFpbnRzW2ldLCB0aW1lU2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvbHZlcyBhIGRpc3RhbmNlIGNvbnN0cmFpbnQgd2l0aCBHYXVzcy1TaWVkZWwgbWV0aG9kLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2Qgc29sdmVcclxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZVxyXG4gICAgICovXHJcbiAgICBDb25zdHJhaW50LnNvbHZlID0gZnVuY3Rpb24oY29uc3RyYWludCwgdGltZVNjYWxlKSB7XHJcbiAgICAgICAgdmFyIGJvZHlBID0gY29uc3RyYWludC5ib2R5QSxcclxuICAgICAgICAgICAgYm9keUIgPSBjb25zdHJhaW50LmJvZHlCLFxyXG4gICAgICAgICAgICBwb2ludEEgPSBjb25zdHJhaW50LnBvaW50QSxcclxuICAgICAgICAgICAgcG9pbnRCID0gY29uc3RyYWludC5wb2ludEI7XHJcblxyXG4gICAgICAgIGlmICghYm9keUEgJiYgIWJvZHlCKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSByZWZlcmVuY2UgYW5nbGVcclxuICAgICAgICBpZiAoYm9keUEgJiYgIWJvZHlBLmlzU3RhdGljKSB7XHJcbiAgICAgICAgICAgIFZlY3Rvci5yb3RhdGUocG9pbnRBLCBib2R5QS5hbmdsZSAtIGNvbnN0cmFpbnQuYW5nbGVBLCBwb2ludEEpO1xyXG4gICAgICAgICAgICBjb25zdHJhaW50LmFuZ2xlQSA9IGJvZHlBLmFuZ2xlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyB1cGRhdGUgcmVmZXJlbmNlIGFuZ2xlXHJcbiAgICAgICAgaWYgKGJvZHlCICYmICFib2R5Qi5pc1N0YXRpYykge1xyXG4gICAgICAgICAgICBWZWN0b3Iucm90YXRlKHBvaW50QiwgYm9keUIuYW5nbGUgLSBjb25zdHJhaW50LmFuZ2xlQiwgcG9pbnRCKTtcclxuICAgICAgICAgICAgY29uc3RyYWludC5hbmdsZUIgPSBib2R5Qi5hbmdsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwb2ludEFXb3JsZCA9IHBvaW50QSxcclxuICAgICAgICAgICAgcG9pbnRCV29ybGQgPSBwb2ludEI7XHJcblxyXG4gICAgICAgIGlmIChib2R5QSkgcG9pbnRBV29ybGQgPSBWZWN0b3IuYWRkKGJvZHlBLnBvc2l0aW9uLCBwb2ludEEpO1xyXG4gICAgICAgIGlmIChib2R5QikgcG9pbnRCV29ybGQgPSBWZWN0b3IuYWRkKGJvZHlCLnBvc2l0aW9uLCBwb2ludEIpO1xyXG5cclxuICAgICAgICBpZiAoIXBvaW50QVdvcmxkIHx8ICFwb2ludEJXb3JsZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgZGVsdGEgPSBWZWN0b3Iuc3ViKHBvaW50QVdvcmxkLCBwb2ludEJXb3JsZCksXHJcbiAgICAgICAgICAgIGN1cnJlbnRMZW5ndGggPSBWZWN0b3IubWFnbml0dWRlKGRlbHRhKTtcclxuXHJcbiAgICAgICAgLy8gcHJldmVudCBzaW5ndWxhcml0eVxyXG4gICAgICAgIGlmIChjdXJyZW50TGVuZ3RoIDwgQ29uc3RyYWludC5fbWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRMZW5ndGggPSBDb25zdHJhaW50Ll9taW5MZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzb2x2ZSBkaXN0YW5jZSBjb25zdHJhaW50IHdpdGggR2F1c3MtU2llZGVsIG1ldGhvZFxyXG4gICAgICAgIHZhciBkaWZmZXJlbmNlID0gKGN1cnJlbnRMZW5ndGggLSBjb25zdHJhaW50Lmxlbmd0aCkgLyBjdXJyZW50TGVuZ3RoLFxyXG4gICAgICAgICAgICBzdGlmZm5lc3MgPSBjb25zdHJhaW50LnN0aWZmbmVzcyA8IDEgPyBjb25zdHJhaW50LnN0aWZmbmVzcyAqIHRpbWVTY2FsZSA6IGNvbnN0cmFpbnQuc3RpZmZuZXNzLFxyXG4gICAgICAgICAgICBmb3JjZSA9IFZlY3Rvci5tdWx0KGRlbHRhLCBkaWZmZXJlbmNlICogc3RpZmZuZXNzKSxcclxuICAgICAgICAgICAgbWFzc1RvdGFsID0gKGJvZHlBID8gYm9keUEuaW52ZXJzZU1hc3MgOiAwKSArIChib2R5QiA/IGJvZHlCLmludmVyc2VNYXNzIDogMCksXHJcbiAgICAgICAgICAgIGluZXJ0aWFUb3RhbCA9IChib2R5QSA/IGJvZHlBLmludmVyc2VJbmVydGlhIDogMCkgKyAoYm9keUIgPyBib2R5Qi5pbnZlcnNlSW5lcnRpYSA6IDApLFxyXG4gICAgICAgICAgICByZXNpc3RhbmNlVG90YWwgPSBtYXNzVG90YWwgKyBpbmVydGlhVG90YWwsXHJcbiAgICAgICAgICAgIHRvcnF1ZSxcclxuICAgICAgICAgICAgc2hhcmUsXHJcbiAgICAgICAgICAgIG5vcm1hbCxcclxuICAgICAgICAgICAgbm9ybWFsVmVsb2NpdHksXHJcbiAgICAgICAgICAgIHJlbGF0aXZlVmVsb2NpdHk7XHJcblxyXG4gICAgICAgIGlmIChjb25zdHJhaW50LmRhbXBpbmcpIHtcclxuICAgICAgICAgICAgdmFyIHplcm8gPSBWZWN0b3IuY3JlYXRlKCk7XHJcbiAgICAgICAgICAgIG5vcm1hbCA9IFZlY3Rvci5kaXYoZGVsdGEsIGN1cnJlbnRMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgcmVsYXRpdmVWZWxvY2l0eSA9IFZlY3Rvci5zdWIoXHJcbiAgICAgICAgICAgICAgICBib2R5QiAmJiBWZWN0b3Iuc3ViKGJvZHlCLnBvc2l0aW9uLCBib2R5Qi5wb3NpdGlvblByZXYpIHx8IHplcm8sXHJcbiAgICAgICAgICAgICAgICBib2R5QSAmJiBWZWN0b3Iuc3ViKGJvZHlBLnBvc2l0aW9uLCBib2R5QS5wb3NpdGlvblByZXYpIHx8IHplcm9cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIG5vcm1hbFZlbG9jaXR5ID0gVmVjdG9yLmRvdChub3JtYWwsIHJlbGF0aXZlVmVsb2NpdHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGJvZHlBICYmICFib2R5QS5pc1N0YXRpYykge1xyXG4gICAgICAgICAgICBzaGFyZSA9IGJvZHlBLmludmVyc2VNYXNzIC8gbWFzc1RvdGFsO1xyXG5cclxuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBhcHBsaWVkIGltcHVsc2VzIGZvciBwb3N0IHNvbHZpbmdcclxuICAgICAgICAgICAgYm9keUEuY29uc3RyYWludEltcHVsc2UueCAtPSBmb3JjZS54ICogc2hhcmU7XHJcbiAgICAgICAgICAgIGJvZHlBLmNvbnN0cmFpbnRJbXB1bHNlLnkgLT0gZm9yY2UueSAqIHNoYXJlO1xyXG5cclxuICAgICAgICAgICAgLy8gYXBwbHkgZm9yY2VzXHJcbiAgICAgICAgICAgIGJvZHlBLnBvc2l0aW9uLnggLT0gZm9yY2UueCAqIHNoYXJlO1xyXG4gICAgICAgICAgICBib2R5QS5wb3NpdGlvbi55IC09IGZvcmNlLnkgKiBzaGFyZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFwcGx5IGRhbXBpbmdcclxuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuZGFtcGluZykge1xyXG4gICAgICAgICAgICAgICAgYm9keUEucG9zaXRpb25QcmV2LnggLT0gY29uc3RyYWludC5kYW1waW5nICogbm9ybWFsLnggKiBub3JtYWxWZWxvY2l0eSAqIHNoYXJlO1xyXG4gICAgICAgICAgICAgICAgYm9keUEucG9zaXRpb25QcmV2LnkgLT0gY29uc3RyYWludC5kYW1waW5nICogbm9ybWFsLnkgKiBub3JtYWxWZWxvY2l0eSAqIHNoYXJlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhcHBseSB0b3JxdWVcclxuICAgICAgICAgICAgdG9ycXVlID0gKFZlY3Rvci5jcm9zcyhwb2ludEEsIGZvcmNlKSAvIHJlc2lzdGFuY2VUb3RhbCkgKiBDb25zdHJhaW50Ll90b3JxdWVEYW1wZW4gKiBib2R5QS5pbnZlcnNlSW5lcnRpYSAqICgxIC0gY29uc3RyYWludC5hbmd1bGFyU3RpZmZuZXNzKTtcclxuICAgICAgICAgICAgYm9keUEuY29uc3RyYWludEltcHVsc2UuYW5nbGUgLT0gdG9ycXVlO1xyXG4gICAgICAgICAgICBib2R5QS5hbmdsZSAtPSB0b3JxdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYm9keUIgJiYgIWJvZHlCLmlzU3RhdGljKSB7XHJcbiAgICAgICAgICAgIHNoYXJlID0gYm9keUIuaW52ZXJzZU1hc3MgLyBtYXNzVG90YWw7XHJcblxyXG4gICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIGFwcGxpZWQgaW1wdWxzZXMgZm9yIHBvc3Qgc29sdmluZ1xyXG4gICAgICAgICAgICBib2R5Qi5jb25zdHJhaW50SW1wdWxzZS54ICs9IGZvcmNlLnggKiBzaGFyZTtcclxuICAgICAgICAgICAgYm9keUIuY29uc3RyYWludEltcHVsc2UueSArPSBmb3JjZS55ICogc2hhcmU7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBhcHBseSBmb3JjZXNcclxuICAgICAgICAgICAgYm9keUIucG9zaXRpb24ueCArPSBmb3JjZS54ICogc2hhcmU7XHJcbiAgICAgICAgICAgIGJvZHlCLnBvc2l0aW9uLnkgKz0gZm9yY2UueSAqIHNoYXJlO1xyXG5cclxuICAgICAgICAgICAgLy8gYXBwbHkgZGFtcGluZ1xyXG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5kYW1waW5nKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvblByZXYueCArPSBjb25zdHJhaW50LmRhbXBpbmcgKiBub3JtYWwueCAqIG5vcm1hbFZlbG9jaXR5ICogc2hhcmU7XHJcbiAgICAgICAgICAgICAgICBib2R5Qi5wb3NpdGlvblByZXYueSArPSBjb25zdHJhaW50LmRhbXBpbmcgKiBub3JtYWwueSAqIG5vcm1hbFZlbG9jaXR5ICogc2hhcmU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFwcGx5IHRvcnF1ZVxyXG4gICAgICAgICAgICB0b3JxdWUgPSAoVmVjdG9yLmNyb3NzKHBvaW50QiwgZm9yY2UpIC8gcmVzaXN0YW5jZVRvdGFsKSAqIENvbnN0cmFpbnQuX3RvcnF1ZURhbXBlbiAqIGJvZHlCLmludmVyc2VJbmVydGlhICogKDEgLSBjb25zdHJhaW50LmFuZ3VsYXJTdGlmZm5lc3MpO1xyXG4gICAgICAgICAgICBib2R5Qi5jb25zdHJhaW50SW1wdWxzZS5hbmdsZSArPSB0b3JxdWU7XHJcbiAgICAgICAgICAgIGJvZHlCLmFuZ2xlICs9IHRvcnF1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGJvZHkgdXBkYXRlcyByZXF1aXJlZCBhZnRlciBzb2x2aW5nIGNvbnN0cmFpbnRzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBtZXRob2QgcG9zdFNvbHZlQWxsXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKi9cclxuICAgIENvbnN0cmFpbnQucG9zdFNvbHZlQWxsID0gZnVuY3Rpb24oYm9kaWVzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBpbXB1bHNlID0gYm9keS5jb25zdHJhaW50SW1wdWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChib2R5LmlzU3RhdGljIHx8IChpbXB1bHNlLnggPT09IDAgJiYgaW1wdWxzZS55ID09PSAwICYmIGltcHVsc2UuYW5nbGUgPT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgU2xlZXBpbmcuc2V0KGJvZHksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBnZW9tZXRyeSBhbmQgcmVzZXRcclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBib2R5LnBhcnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGFydCA9IGJvZHkucGFydHNbal07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIFZlcnRpY2VzLnRyYW5zbGF0ZShwYXJ0LnZlcnRpY2VzLCBpbXB1bHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaiA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0LnBvc2l0aW9uLnggKz0gaW1wdWxzZS54O1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcnQucG9zaXRpb24ueSArPSBpbXB1bHNlLnk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVsc2UuYW5nbGUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBWZXJ0aWNlcy5yb3RhdGUocGFydC52ZXJ0aWNlcywgaW1wdWxzZS5hbmdsZSwgYm9keS5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgQXhlcy5yb3RhdGUocGFydC5heGVzLCBpbXB1bHNlLmFuZ2xlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yLnJvdGF0ZUFib3V0KHBhcnQucG9zaXRpb24sIGltcHVsc2UuYW5nbGUsIGJvZHkucG9zaXRpb24sIHBhcnQucG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBCb3VuZHMudXBkYXRlKHBhcnQuYm91bmRzLCBwYXJ0LnZlcnRpY2VzLCBib2R5LnZlbG9jaXR5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZGFtcGVuIHRoZSBjYWNoZWQgaW1wdWxzZSBmb3Igd2FybWluZyBuZXh0IHN0ZXBcclxuICAgICAgICAgICAgaW1wdWxzZS5hbmdsZSAqPSBDb25zdHJhaW50Ll93YXJtaW5nO1xyXG4gICAgICAgICAgICBpbXB1bHNlLnggKj0gQ29uc3RyYWludC5fd2FybWluZztcclxuICAgICAgICAgICAgaW1wdWxzZS55ICo9IENvbnN0cmFpbnQuX3dhcm1pbmc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHdvcmxkLXNwYWNlIHBvc2l0aW9uIG9mIGBjb25zdHJhaW50LnBvaW50QWAsIGFjY291bnRpbmcgZm9yIGBjb25zdHJhaW50LmJvZHlBYC5cclxuICAgICAqIEBtZXRob2QgcG9pbnRBV29ybGRcclxuICAgICAqIEBwYXJhbSB7Y29uc3RyYWludH0gY29uc3RyYWludFxyXG4gICAgICogQHJldHVybnMge3ZlY3Rvcn0gdGhlIHdvcmxkLXNwYWNlIHBvc2l0aW9uXHJcbiAgICAgKi9cclxuICAgIENvbnN0cmFpbnQucG9pbnRBV29ybGQgPSBmdW5jdGlvbihjb25zdHJhaW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDogKGNvbnN0cmFpbnQuYm9keUEgPyBjb25zdHJhaW50LmJvZHlBLnBvc2l0aW9uLnggOiAwKSArIGNvbnN0cmFpbnQucG9pbnRBLngsXHJcbiAgICAgICAgICAgIHk6IChjb25zdHJhaW50LmJvZHlBID8gY29uc3RyYWludC5ib2R5QS5wb3NpdGlvbi55IDogMCkgKyBjb25zdHJhaW50LnBvaW50QS55XHJcbiAgICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvbiBvZiBgY29uc3RyYWludC5wb2ludEJgLCBhY2NvdW50aW5nIGZvciBgY29uc3RyYWludC5ib2R5QmAuXHJcbiAgICAgKiBAbWV0aG9kIHBvaW50QldvcmxkXHJcbiAgICAgKiBAcGFyYW0ge2NvbnN0cmFpbnR9IGNvbnN0cmFpbnRcclxuICAgICAqIEByZXR1cm5zIHt2ZWN0b3J9IHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvblxyXG4gICAgICovXHJcbiAgICBDb25zdHJhaW50LnBvaW50QldvcmxkID0gZnVuY3Rpb24oY29uc3RyYWludCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHg6IChjb25zdHJhaW50LmJvZHlCID8gY29uc3RyYWludC5ib2R5Qi5wb3NpdGlvbi54IDogMCkgKyBjb25zdHJhaW50LnBvaW50Qi54LFxyXG4gICAgICAgICAgICB5OiAoY29uc3RyYWludC5ib2R5QiA/IGNvbnN0cmFpbnQuYm9keUIucG9zaXRpb24ueSA6IDApICsgY29uc3RyYWludC5wb2ludEIueVxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qXHJcbiAgICAqXHJcbiAgICAqICBQcm9wZXJ0aWVzIERvY3VtZW50YXRpb25cclxuICAgICpcclxuICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlZ2VyIGBOdW1iZXJgIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIG51bWJlciBnZW5lcmF0ZWQgaW4gYENvbXBvc2l0ZS5jcmVhdGVgIGJ5IGBDb21tb24ubmV4dElkYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgaWRcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBTdHJpbmdgIGRlbm90aW5nIHRoZSB0eXBlIG9mIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgdHlwZVxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKiBAZGVmYXVsdCBcImNvbnN0cmFpbnRcIlxyXG4gICAgICogQHJlYWRPbmx5XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFyYml0cmFyeSBgU3RyaW5nYCBuYW1lIHRvIGhlbHAgdGhlIHVzZXIgaWRlbnRpZnkgYW5kIG1hbmFnZSBib2RpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGxhYmVsXHJcbiAgICAgKiBAdHlwZSBzdHJpbmdcclxuICAgICAqIEBkZWZhdWx0IFwiQ29uc3RyYWludFwiXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBPYmplY3RgIHRoYXQgZGVmaW5lcyB0aGUgcmVuZGVyaW5nIHByb3BlcnRpZXMgdG8gYmUgY29uc3VtZWQgYnkgdGhlIG1vZHVsZSBgTWF0dGVyLlJlbmRlcmAuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlclxyXG4gICAgICogQHR5cGUgb2JqZWN0XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGUgY29uc3RyYWludCBzaG91bGQgYmUgcmVuZGVyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlci52aXNpYmxlXHJcbiAgICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBkZWZpbmVzIHRoZSBsaW5lIHdpZHRoIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGUgY29uc3RyYWludCBvdXRsaW5lLlxyXG4gICAgICogQSB2YWx1ZSBvZiBgMGAgbWVhbnMgbm8gb3V0bGluZSB3aWxsIGJlIHJlbmRlcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIubGluZVdpZHRoXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgU3RyaW5nYCB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBzdHlsZSB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhlIGNvbnN0cmFpbnQgb3V0bGluZS5cclxuICAgICAqIEl0IGlzIHRoZSBzYW1lIGFzIHdoZW4gdXNpbmcgYSBjYW52YXMsIHNvIGl0IGFjY2VwdHMgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyLnN0cm9rZVN0eWxlXHJcbiAgICAgKiBAdHlwZSBzdHJpbmdcclxuICAgICAqIEBkZWZhdWx0IGEgcmFuZG9tIGNvbG91clxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBTdHJpbmdgIHRoYXQgZGVmaW5lcyB0aGUgY29uc3RyYWludCByZW5kZXJpbmcgdHlwZS4gXHJcbiAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSAnbGluZScsICdwaW4nLCAnc3ByaW5nJy5cclxuICAgICAqIEFuIGFwcHJvcHJpYXRlIHJlbmRlciB0eXBlIHdpbGwgYmUgYXV0b21hdGljYWxseSBjaG9zZW4gdW5sZXNzIG9uZSBpcyBnaXZlbiBpbiBvcHRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSByZW5kZXIudHlwZVxyXG4gICAgICogQHR5cGUgc3RyaW5nXHJcbiAgICAgKiBAZGVmYXVsdCAnbGluZSdcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgQm9vbGVhbmAgdGhhdCBkZWZpbmVzIGlmIHRoZSBjb25zdHJhaW50J3MgYW5jaG9yIHBvaW50cyBzaG91bGQgYmUgcmVuZGVyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHJlbmRlci5hbmNob3JzXHJcbiAgICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBmaXJzdCBwb3NzaWJsZSBgQm9keWAgdGhhdCB0aGlzIGNvbnN0cmFpbnQgaXMgYXR0YWNoZWQgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IGJvZHlBXHJcbiAgICAgKiBAdHlwZSBib2R5XHJcbiAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzZWNvbmQgcG9zc2libGUgYEJvZHlgIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIGF0dGFjaGVkIHRvLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBib2R5QlxyXG4gICAgICogQHR5cGUgYm9keVxyXG4gICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBWZWN0b3JgIHRoYXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnN0cmFpbnQgZnJvbSBjZW50ZXIgb2YgdGhlIGBjb25zdHJhaW50LmJvZHlBYCBpZiBkZWZpbmVkLCBvdGhlcndpc2UgYSB3b3JsZC1zcGFjZSBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcG9pbnRBXHJcbiAgICAgKiBAdHlwZSB2ZWN0b3JcclxuICAgICAqIEBkZWZhdWx0IHsgeDogMCwgeTogMCB9XHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYFZlY3RvcmAgdGhhdCBzcGVjaWZpZXMgdGhlIG9mZnNldCBvZiB0aGUgY29uc3RyYWludCBmcm9tIGNlbnRlciBvZiB0aGUgYGNvbnN0cmFpbnQuYm9keUJgIGlmIGRlZmluZWQsIG90aGVyd2lzZSBhIHdvcmxkLXNwYWNlIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBwb2ludEJcclxuICAgICAqIEB0eXBlIHZlY3RvclxyXG4gICAgICogQGRlZmF1bHQgeyB4OiAwLCB5OiAwIH1cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgc3RpZmZuZXNzIG9mIHRoZSBjb25zdHJhaW50LCBpLmUuIHRoZSByYXRlIGF0IHdoaWNoIGl0IHJldHVybnMgdG8gaXRzIHJlc3RpbmcgYGNvbnN0cmFpbnQubGVuZ3RoYC5cclxuICAgICAqIEEgdmFsdWUgb2YgYDFgIG1lYW5zIHRoZSBjb25zdHJhaW50IHNob3VsZCBiZSB2ZXJ5IHN0aWZmLlxyXG4gICAgICogQSB2YWx1ZSBvZiBgMC4yYCBtZWFucyB0aGUgY29uc3RyYWludCBhY3RzIGxpa2UgYSBzb2Z0IHNwcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgc3RpZmZuZXNzXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgZGFtcGluZyBvZiB0aGUgY29uc3RyYWludCwgXHJcbiAgICAgKiBpLmUuIHRoZSBhbW91bnQgb2YgcmVzaXN0YW5jZSBhcHBsaWVkIHRvIGVhY2ggYm9keSBiYXNlZCBvbiB0aGVpciB2ZWxvY2l0aWVzIHRvIGxpbWl0IHRoZSBhbW91bnQgb2Ygb3NjaWxsYXRpb24uXHJcbiAgICAgKiBEYW1waW5nIHdpbGwgb25seSBiZSBhcHBhcmVudCB3aGVuIHRoZSBjb25zdHJhaW50IGFsc28gaGFzIGEgdmVyeSBsb3cgYHN0aWZmbmVzc2AuXHJcbiAgICAgKiBBIHZhbHVlIG9mIGAwLjFgIG1lYW5zIHRoZSBjb25zdHJhaW50IHdpbGwgYXBwbHkgaGVhdnkgZGFtcGluZywgcmVzdWx0aW5nIGluIGxpdHRsZSB0byBubyBvc2NpbGxhdGlvbi5cclxuICAgICAqIEEgdmFsdWUgb2YgYDBgIG1lYW5zIHRoZSBjb25zdHJhaW50IHdpbGwgYXBwbHkgbm8gZGFtcGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgZGFtcGluZ1xyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIHRhcmdldCByZXN0aW5nIGxlbmd0aCBvZiB0aGUgY29uc3RyYWludC4gXHJcbiAgICAgKiBJdCBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgaW4gYENvbnN0cmFpbnQuY3JlYXRlYCBmcm9tIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBgY29uc3RyYWludC5ib2R5QWAgYW5kIGBjb25zdHJhaW50LmJvZHlCYC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgbGVuZ3RoXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gb2JqZWN0IHJlc2VydmVkIGZvciBzdG9yaW5nIHBsdWdpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBwbHVnaW5cclxuICAgICAqIEB0eXBlIHt9XHJcbiAgICAgKi9cclxuXHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyLkNvbW1vbmAgbW9kdWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgbW9kdWxlcy5cclxuKlxyXG4qIEBjbGFzcyBDb21tb25cclxuKi9cclxuXHJcbnZhciBDb21tb24gPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29tbW9uO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIENvbW1vbi5fbmV4dElkID0gMDtcclxuICAgIENvbW1vbi5fc2VlZCA9IDA7XHJcbiAgICBDb21tb24uX25vd1N0YXJ0VGltZSA9ICsobmV3IERhdGUoKSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRlbmRzIHRoZSBvYmplY3QgaW4gdGhlIGZpcnN0IGFyZ3VtZW50IHVzaW5nIHRoZSBvYmplY3QgaW4gdGhlIHNlY29uZCBhcmd1bWVudC5cclxuICAgICAqIEBtZXRob2QgZXh0ZW5kXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlZXBcclxuICAgICAqIEByZXR1cm4ge30gb2JqIGV4dGVuZGVkXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5leHRlbmQgPSBmdW5jdGlvbihvYmosIGRlZXApIHtcclxuICAgICAgICB2YXIgYXJnc1N0YXJ0LFxyXG4gICAgICAgICAgICBhcmdzLFxyXG4gICAgICAgICAgICBkZWVwQ2xvbmU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGVlcCA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgIGFyZ3NTdGFydCA9IDI7XHJcbiAgICAgICAgICAgIGRlZXBDbG9uZSA9IGRlZXA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJnc1N0YXJ0ID0gMTtcclxuICAgICAgICAgICAgZGVlcENsb25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSBhcmdzU3RhcnQ7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZXBDbG9uZSAmJiBzb3VyY2VbcHJvcF0gJiYgc291cmNlW3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpbcHJvcF0gfHwgb2JqW3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IG9ialtwcm9wXSB8fCB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbi5leHRlbmQob2JqW3Byb3BdLCBkZWVwQ2xvbmUsIHNvdXJjZVtwcm9wXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjbG9uZSBvZiB0aGUgb2JqZWN0LCBpZiBkZWVwIGlzIHRydWUgcmVmZXJlbmNlcyB3aWxsIGFsc28gYmUgY2xvbmVkLlxyXG4gICAgICogQG1ldGhvZCBjbG9uZVxyXG4gICAgICogQHBhcmFtIHt9IG9ialxyXG4gICAgICogQHBhcmFtIHtib29sfSBkZWVwXHJcbiAgICAgKiBAcmV0dXJuIHt9IG9iaiBjbG9uZWRcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmNsb25lID0gZnVuY3Rpb24ob2JqLCBkZWVwKSB7XHJcbiAgICAgICAgcmV0dXJuIENvbW1vbi5leHRlbmQoe30sIGRlZXAsIG9iaik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBrZXlzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBrZXlzXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0ga2V5c1xyXG4gICAgICovXHJcbiAgICBDb21tb24ua2V5cyA9IGZ1bmN0aW9uKG9iaikge1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cylcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7XHJcblxyXG4gICAgICAgIC8vIGF2b2lkIGhhc093blByb3BlcnR5IGZvciBwZXJmb3JtYW5jZVxyXG4gICAgICAgIHZhciBrZXlzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcclxuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgICAgcmV0dXJuIGtleXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QuXHJcbiAgICAgKiBAbWV0aG9kIHZhbHVlc1xyXG4gICAgICogQHBhcmFtIHt9IG9ialxyXG4gICAgICogQHJldHVybiB7YXJyYXl9IEFycmF5IG9mIHRoZSBvYmplY3RzIHByb3BlcnR5IHZhbHVlc1xyXG4gICAgICovXHJcbiAgICBDb21tb24udmFsdWVzID0gZnVuY3Rpb24ob2JqKSB7XHJcbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cykge1xyXG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gob2JqW2tleXNbaV1dKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBhdm9pZCBoYXNPd25Qcm9wZXJ0eSBmb3IgcGVyZm9ybWFuY2VcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKVxyXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChvYmpba2V5XSk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdmFsdWUgZnJvbSBgYmFzZWAgcmVsYXRpdmUgdG8gdGhlIGBwYXRoYCBzdHJpbmcuXHJcbiAgICAgKiBAbWV0aG9kIGdldFxyXG4gICAgICogQHBhcmFtIHt9IG9iaiBUaGUgYmFzZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvIGBiYXNlYCwgZS5nLiAnRm9vLkJhci5iYXonXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2JlZ2luXSBQYXRoIHNsaWNlIGJlZ2luXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZF0gUGF0aCBzbGljZSBlbmRcclxuICAgICAqIEByZXR1cm4ge30gVGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gcGF0aFxyXG4gICAgICovXHJcbiAgICBDb21tb24uZ2V0ID0gZnVuY3Rpb24ob2JqLCBwYXRoLCBiZWdpbiwgZW5kKSB7XHJcbiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJy4nKS5zbGljZShiZWdpbiwgZW5kKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IG9ialtwYXRoW2ldXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIHZhbHVlIG9uIGBiYXNlYCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gYHBhdGhgIHN0cmluZy5cclxuICAgICAqIEBtZXRob2Qgc2V0XHJcbiAgICAgKiBAcGFyYW0ge30gb2JqIFRoZSBiYXNlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggcmVsYXRpdmUgdG8gYGJhc2VgLCBlLmcuICdGb28uQmFyLmJheidcclxuICAgICAqIEBwYXJhbSB7fSB2YWwgVGhlIHZhbHVlIHRvIHNldFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtiZWdpbl0gUGF0aCBzbGljZSBiZWdpblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmRdIFBhdGggc2xpY2UgZW5kXHJcbiAgICAgKiBAcmV0dXJuIHt9IFBhc3MgdGhyb3VnaCBgdmFsYCBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLnNldCA9IGZ1bmN0aW9uKG9iaiwgcGF0aCwgdmFsLCBiZWdpbiwgZW5kKSB7XHJcbiAgICAgICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgnLicpLnNsaWNlKGJlZ2luLCBlbmQpO1xyXG4gICAgICAgIENvbW1vbi5nZXQob2JqLCBwYXRoLCAwLCAtMSlbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIGdpdmVuIGFycmF5IGluLXBsYWNlLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIHVzZXMgYSBzZWVkZWQgcmFuZG9tIGdlbmVyYXRvci5cclxuICAgICAqIEBtZXRob2Qgc2h1ZmZsZVxyXG4gICAgICogQHBhcmFtIHthcnJheX0gYXJyYXlcclxuICAgICAqIEByZXR1cm4ge2FycmF5fSBhcnJheSBzaHVmZmxlZCByYW5kb21seVxyXG4gICAgICovXHJcbiAgICBDb21tb24uc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5KSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKENvbW1vbi5yYW5kb20oKSAqIChpICsgMSkpO1xyXG4gICAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xyXG4gICAgICAgICAgICBhcnJheVtqXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSYW5kb21seSBjaG9vc2VzIGEgdmFsdWUgZnJvbSBhIGxpc3Qgd2l0aCBlcXVhbCBwcm9iYWJpbGl0eS5cclxuICAgICAqIFRoZSBmdW5jdGlvbiB1c2VzIGEgc2VlZGVkIHJhbmRvbSBnZW5lcmF0b3IuXHJcbiAgICAgKiBAbWV0aG9kIGNob29zZVxyXG4gICAgICogQHBhcmFtIHthcnJheX0gY2hvaWNlc1xyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBBIHJhbmRvbSBjaG9pY2Ugb2JqZWN0IGZyb20gdGhlIGFycmF5XHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5jaG9vc2UgPSBmdW5jdGlvbihjaG9pY2VzKSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZXNbTWF0aC5mbG9vcihDb21tb24ucmFuZG9tKCkgKiBjaG9pY2VzLmxlbmd0aCldO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgSFRNTEVsZW1lbnQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqIEBtZXRob2QgaXNFbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBIVE1MRWxlbWVudCwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcclxuICAgICAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSAmJiBvYmoubm9kZU5hbWUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGFycmF5LlxyXG4gICAgICogQG1ldGhvZCBpc0FycmF5XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXksIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBDb21tb24uaXNBcnJheSA9IGZ1bmN0aW9uKG9iaikge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICogQG1ldGhvZCBpc0Z1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBmdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHBsYWluIG9iamVjdC5cclxuICAgICAqIEBtZXRob2QgaXNQbGFpbk9iamVjdFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9ialxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgcGxhaW4gb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbihvYmopIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcuXHJcbiAgICAgKiBAbWV0aG9kIGlzU3RyaW5nXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb2JqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBzdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBDb21tb24uaXNTdHJpbmcgPSBmdW5jdGlvbihvYmopIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZSBjbGFtcGVkIGJldHdlZW4gYSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlLlxyXG4gICAgICogQG1ldGhvZCBjbGFtcFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBjbGFtcGVkIGJldHdlZW4gbWluIGFuZCBtYXggaW5jbHVzaXZlXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4sIG1heCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IG1pbilcclxuICAgICAgICAgICAgcmV0dXJuIG1pbjtcclxuICAgICAgICBpZiAodmFsdWUgPiBtYXgpXHJcbiAgICAgICAgICAgIHJldHVybiBtYXg7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqIEBtZXRob2Qgc2lnblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0xIGlmIG5lZ2F0aXZlLCArMSBpZiAwIG9yIHBvc2l0aXZlXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5zaWduID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPCAwID8gLTEgOiAxO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBzaW5jZSB0aGUgdGltZSBvcmlnaW4gKGUuZy4gZnJvbSBwYWdlIGxvYWQpLlxyXG4gICAgICogVGhlIHJlc3VsdCB3aWxsIGJlIGhpZ2gtcmVzb2x1dGlvbiBpbmNsdWRpbmcgZGVjaW1hbCBwbGFjZXMgaWYgYXZhaWxhYmxlLlxyXG4gICAgICogQG1ldGhvZCBub3dcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGN1cnJlbnQgdGltZXN0YW1wXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5ub3cgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZS53ZWJraXROb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uud2Via2l0Tm93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAobmV3IERhdGUoKSkgLSBDb21tb24uX25vd1N0YXJ0VGltZTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGEgbWluaW11bSBhbmQgYSBtYXhpbXVtIHZhbHVlIGluY2x1c2l2ZS5cclxuICAgICAqIFRoZSBmdW5jdGlvbiB1c2VzIGEgc2VlZGVkIHJhbmRvbSBnZW5lcmF0b3IuXHJcbiAgICAgKiBAbWV0aG9kIHJhbmRvbVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCBpbmNsdXNpdmVcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XHJcbiAgICAgICAgbWluID0gKHR5cGVvZiBtaW4gIT09IFwidW5kZWZpbmVkXCIpID8gbWluIDogMDtcclxuICAgICAgICBtYXggPSAodHlwZW9mIG1heCAhPT0gXCJ1bmRlZmluZWRcIikgPyBtYXggOiAxO1xyXG4gICAgICAgIHJldHVybiBtaW4gKyBfc2VlZGVkUmFuZG9tKCkgKiAobWF4IC0gbWluKTtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIF9zZWVkZWRSYW5kb20gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfY29uZ3J1ZW50aWFsX2dlbmVyYXRvclxyXG4gICAgICAgIENvbW1vbi5fc2VlZCA9IChDb21tb24uX3NlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xyXG4gICAgICAgIHJldHVybiBDb21tb24uX3NlZWQgLyAyMzMyODA7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgYSBDU1MgaGV4IGNvbG91ciBzdHJpbmcgaW50byBhbiBpbnRlZ2VyLlxyXG4gICAgICogQG1ldGhvZCBjb2xvclRvTnVtYmVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTdHJpbmdcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIENTUyBoZXggc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi5jb2xvclRvTnVtYmVyID0gZnVuY3Rpb24oY29sb3JTdHJpbmcpIHtcclxuICAgICAgICBjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnJlcGxhY2UoJyMnLCcnKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgICAgIGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuY2hhckF0KDApICsgY29sb3JTdHJpbmcuY2hhckF0KDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3JTdHJpbmcuY2hhckF0KDEpICsgY29sb3JTdHJpbmcuY2hhckF0KDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsgY29sb3JTdHJpbmcuY2hhckF0KDIpICsgY29sb3JTdHJpbmcuY2hhckF0KDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNvbnNvbGUgbG9nZ2luZyBsZXZlbCB0byB1c2UsIHdoZXJlIGVhY2ggbGV2ZWwgaW5jbHVkZXMgYWxsIGxldmVscyBhYm92ZSBhbmQgZXhjbHVkZXMgdGhlIGxldmVscyBiZWxvdy5cclxuICAgICAqIFRoZSBkZWZhdWx0IGxldmVsIGlzICdkZWJ1Zycgd2hpY2ggc2hvd3MgYWxsIGNvbnNvbGUgbWVzc2FnZXMuICBcclxuICAgICAqXHJcbiAgICAgKiBQb3NzaWJsZSBsZXZlbCB2YWx1ZXMgYXJlOlxyXG4gICAgICogLSAwID0gTm9uZVxyXG4gICAgICogLSAxID0gRGVidWdcclxuICAgICAqIC0gMiA9IEluZm9cclxuICAgICAqIC0gMyA9IFdhcm5cclxuICAgICAqIC0gNCA9IEVycm9yXHJcbiAgICAgKiBAcHJvcGVydHkgQ29tbW9uLmxvZ0xldmVsXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICovXHJcbiAgICBDb21tb24ubG9nTGV2ZWwgPSAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgYSBgY29uc29sZS5sb2dgIG1lc3NhZ2Ugb25seSBpZiB0aGUgY3VycmVudCBgQ29tbW9uLmxvZ0xldmVsYCBhbGxvd3MgaXQuXHJcbiAgICAgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggJ21hdHRlci1qcycgdG8gbWFrZSBpdCBlYXNpbHkgaWRlbnRpZmlhYmxlLlxyXG4gICAgICogQG1ldGhvZCBsb2dcclxuICAgICAqIEBwYXJhbSAuLi5vYmpzIHt9IFRoZSBvYmplY3RzIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmxvZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChjb25zb2xlICYmIENvbW1vbi5sb2dMZXZlbCA+IDAgJiYgQ29tbW9uLmxvZ0xldmVsIDw9IDMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgWydtYXR0ZXItanM6J10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgYSBgY29uc29sZS5pbmZvYCBtZXNzYWdlIG9ubHkgaWYgdGhlIGN1cnJlbnQgYENvbW1vbi5sb2dMZXZlbGAgYWxsb3dzIGl0LlxyXG4gICAgICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoICdtYXR0ZXItanMnIHRvIG1ha2UgaXQgZWFzaWx5IGlkZW50aWZpYWJsZS5cclxuICAgICAqIEBtZXRob2QgaW5mb1xyXG4gICAgICogQHBhcmFtIC4uLm9ianMge30gVGhlIG9iamVjdHMgdG8gbG9nLlxyXG4gICAgICovXHJcbiAgICBDb21tb24uaW5mbyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChjb25zb2xlICYmIENvbW1vbi5sb2dMZXZlbCA+IDAgJiYgQ29tbW9uLmxvZ0xldmVsIDw9IDIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvLmFwcGx5KGNvbnNvbGUsIFsnbWF0dGVyLWpzOiddLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIGEgYGNvbnNvbGUud2FybmAgbWVzc2FnZSBvbmx5IGlmIHRoZSBjdXJyZW50IGBDb21tb24ubG9nTGV2ZWxgIGFsbG93cyBpdC5cclxuICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCAnbWF0dGVyLWpzJyB0byBtYWtlIGl0IGVhc2lseSBpZGVudGlmaWFibGUuXHJcbiAgICAgKiBAbWV0aG9kIHdhcm5cclxuICAgICAqIEBwYXJhbSAuLi5vYmpzIHt9IFRoZSBvYmplY3RzIHRvIGxvZy5cclxuICAgICAqL1xyXG4gICAgQ29tbW9uLndhcm4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoY29uc29sZSAmJiBDb21tb24ubG9nTGV2ZWwgPiAwICYmIENvbW1vbi5sb2dMZXZlbCA8PSAzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLCBbJ21hdHRlci1qczonXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHVuaXF1ZSBzZXF1ZW50aWFsIElELlxyXG4gICAgICogQG1ldGhvZCBuZXh0SWRcclxuICAgICAqIEByZXR1cm4ge051bWJlcn0gVW5pcXVlIHNlcXVlbnRpYWwgSURcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLm5leHRJZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBDb21tb24uX25leHRJZCsrO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGluZGV4T2YgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgKiBAbWV0aG9kIGluZGV4T2ZcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGhheXN0YWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmVlZGxlXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwb3NpdGlvbiBvZiBuZWVkbGUgaW4gaGF5c3RhY2ssIG90aGVyd2lzZSAtMS5cclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmluZGV4T2YgPSBmdW5jdGlvbihoYXlzdGFjaywgbmVlZGxlKSB7XHJcbiAgICAgICAgaWYgKGhheXN0YWNrLmluZGV4T2YpXHJcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGF5c3RhY2subGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGhheXN0YWNrW2ldID09PSBuZWVkbGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNyb3NzIGJyb3dzZXIgY29tcGF0aWJsZSBhcnJheSBtYXAgaW1wbGVtZW50YXRpb24uXHJcbiAgICAgKiBAbWV0aG9kIG1hcFxyXG4gICAgICogQHBhcmFtIHthcnJheX0gbGlzdFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY1xyXG4gICAgICogQHJldHVybiB7YXJyYXl9IFZhbHVlcyBmcm9tIGxpc3QgdHJhbnNmb3JtZWQgYnkgZnVuYy5cclxuICAgICAqL1xyXG4gICAgQ29tbW9uLm1hcCA9IGZ1bmN0aW9uKGxpc3QsIGZ1bmMpIHtcclxuICAgICAgICBpZiAobGlzdC5tYXApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3QubWFwKGZ1bmMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG1hcHBlZCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgbWFwcGVkLnB1c2goZnVuYyhsaXN0W2ldKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWFwcGVkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgZGlyZWN0ZWQgZ3JhcGggYW5kIHJldHVybnMgdGhlIHBhcnRpYWxseSBvcmRlcmVkIHNldCBvZiB2ZXJ0aWNlcyBpbiB0b3BvbG9naWNhbCBvcmRlci5cclxuICAgICAqIENpcmN1bGFyIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cclxuICAgICAqIEBtZXRob2QgdG9wb2xvZ2ljYWxTb3J0XHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZ3JhcGhcclxuICAgICAqIEByZXR1cm4ge2FycmF5fSBQYXJ0aWFsbHkgb3JkZXJlZCBzZXQgb2YgdmVydGljZXMgaW4gdG9wb2xvZ2ljYWwgb3JkZXIuXHJcbiAgICAgKi9cclxuICAgIENvbW1vbi50b3BvbG9naWNhbFNvcnQgPSBmdW5jdGlvbihncmFwaCkge1xyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZ2VjaGV2L2phdmFzY3JpcHQtYWxnb3JpdGhtc1xyXG4gICAgICAgIC8vIENvcHlyaWdodCAoYykgTWlua28gR2VjaGV2IChNSVQgbGljZW5zZSlcclxuICAgICAgICAvLyBNb2RpZmljYXRpb25zOiB0aWR5IGZvcm1hdHRpbmcgYW5kIG5hbWluZ1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXSxcclxuICAgICAgICAgICAgdmlzaXRlZCA9IFtdLFxyXG4gICAgICAgICAgICB0ZW1wID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIG5vZGUgaW4gZ3JhcGgpIHtcclxuICAgICAgICAgICAgaWYgKCF2aXNpdGVkW25vZGVdICYmICF0ZW1wW25vZGVdKSB7XHJcbiAgICAgICAgICAgICAgICBDb21tb24uX3RvcG9sb2dpY2FsU29ydChub2RlLCB2aXNpdGVkLCB0ZW1wLCBncmFwaCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcblxyXG4gICAgQ29tbW9uLl90b3BvbG9naWNhbFNvcnQgPSBmdW5jdGlvbihub2RlLCB2aXNpdGVkLCB0ZW1wLCBncmFwaCwgcmVzdWx0KSB7XHJcbiAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoW25vZGVdIHx8IFtdO1xyXG4gICAgICAgIHRlbXBbbm9kZV0gPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9ycy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBuZWlnaGJvcnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodGVtcFtuZWlnaGJvcl0pIHtcclxuICAgICAgICAgICAgICAgIC8vIHNraXAgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF2aXNpdGVkW25laWdoYm9yXSkge1xyXG4gICAgICAgICAgICAgICAgQ29tbW9uLl90b3BvbG9naWNhbFNvcnQobmVpZ2hib3IsIHZpc2l0ZWQsIHRlbXAsIGdyYXBoLCByZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZW1wW25vZGVdID0gZmFsc2U7XHJcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIF9uXyBmdW5jdGlvbnMgYXMgYXJndW1lbnRzIGFuZCByZXR1cm5zIGEgbmV3IGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlbSBpbiBvcmRlci5cclxuICAgICAqIFRoZSBhcmd1bWVudHMgYXBwbGllZCB3aGVuIGNhbGxpbmcgdGhlIG5ldyBmdW5jdGlvbiB3aWxsIGFsc28gYmUgYXBwbGllZCB0byBldmVyeSBmdW5jdGlvbiBwYXNzZWQuXHJcbiAgICAgKiBUaGUgdmFsdWUgb2YgYHRoaXNgIHJlZmVycyB0byB0aGUgbGFzdCB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgY2hhaW4gdGhhdCB3YXMgbm90IGB1bmRlZmluZWRgLlxyXG4gICAgICogVGhlcmVmb3JlIGlmIGEgcGFzc2VkIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLCB0aGUgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZSBpcyBtYWludGFpbmVkLlxyXG4gICAgICogQWZ0ZXIgYWxsIHBhc3NlZCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGNhbGxlZCB0aGUgbmV3IGZ1bmN0aW9uIHJldHVybnMgdGhlIGxhc3QgcmV0dXJuZWQgdmFsdWUgKGlmIGFueSkuXHJcbiAgICAgKiBJZiBhbnkgb2YgdGhlIHBhc3NlZCBmdW5jdGlvbnMgYXJlIGEgY2hhaW4sIHRoZW4gdGhlIGNoYWluIHdpbGwgYmUgZmxhdHRlbmVkLlxyXG4gICAgICogQG1ldGhvZCBjaGFpblxyXG4gICAgICogQHBhcmFtIC4uLmZ1bmNzIHtmdW5jdGlvbn0gVGhlIGZ1bmN0aW9ucyB0byBjaGFpbi5cclxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBwYXNzZWQgZnVuY3Rpb25zIGluIG9yZGVyLlxyXG4gICAgICovXHJcbiAgICBDb21tb24uY2hhaW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgZnVuY3MgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgdmFyIGZ1bmMgPSBhcmd1bWVudHNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZnVuYy5fY2hhaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmxhdHRlbiBhbHJlYWR5IGNoYWluZWQgZnVuY3Rpb25zXHJcbiAgICAgICAgICAgICAgICBmdW5jcy5wdXNoLmFwcGx5KGZ1bmNzLCBmdW5jLl9jaGFpbmVkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNzLnB1c2goZnVuYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjaGFpbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL2RldnRvb2xzLWRvY3MvaXNzdWVzLzUzI2lzc3VlY29tbWVudC01MTk0MTM1OFxyXG4gICAgICAgICAgICB2YXIgbGFzdFJlc3VsdCxcclxuICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmNzW2ldLmFwcGx5KGxhc3RSZXN1bHQsIGFyZ3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNoYWluLl9jaGFpbmVkID0gZnVuY3M7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGFpbjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFpbnMgYSBmdW5jdGlvbiB0byBleGN1dGUgYmVmb3JlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvbiB0aGUgZ2l2ZW4gYHBhdGhgIHJlbGF0aXZlIHRvIGBiYXNlYC5cclxuICAgICAqIFNlZSBhbHNvIGRvY3MgZm9yIGBDb21tb24uY2hhaW5gLlxyXG4gICAgICogQG1ldGhvZCBjaGFpblBhdGhCZWZvcmVcclxuICAgICAqIEBwYXJhbSB7fSBiYXNlIFRoZSBiYXNlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggcmVsYXRpdmUgdG8gYGJhc2VgXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGFpbiBiZWZvcmUgdGhlIG9yaWdpbmFsXHJcbiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGNoYWluZWQgZnVuY3Rpb24gdGhhdCByZXBsYWNlZCB0aGUgb3JpZ2luYWxcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmNoYWluUGF0aEJlZm9yZSA9IGZ1bmN0aW9uKGJhc2UsIHBhdGgsIGZ1bmMpIHtcclxuICAgICAgICByZXR1cm4gQ29tbW9uLnNldChiYXNlLCBwYXRoLCBDb21tb24uY2hhaW4oXHJcbiAgICAgICAgICAgIGZ1bmMsXHJcbiAgICAgICAgICAgIENvbW1vbi5nZXQoYmFzZSwgcGF0aClcclxuICAgICAgICApKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFpbnMgYSBmdW5jdGlvbiB0byBleGN1dGUgYWZ0ZXIgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9uIHRoZSBnaXZlbiBgcGF0aGAgcmVsYXRpdmUgdG8gYGJhc2VgLlxyXG4gICAgICogU2VlIGFsc28gZG9jcyBmb3IgYENvbW1vbi5jaGFpbmAuXHJcbiAgICAgKiBAbWV0aG9kIGNoYWluUGF0aEFmdGVyXHJcbiAgICAgKiBAcGFyYW0ge30gYmFzZSBUaGUgYmFzZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvIGBiYXNlYFxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hhaW4gYWZ0ZXIgdGhlIG9yaWdpbmFsXHJcbiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGNoYWluZWQgZnVuY3Rpb24gdGhhdCByZXBsYWNlZCB0aGUgb3JpZ2luYWxcclxuICAgICAqL1xyXG4gICAgQ29tbW9uLmNoYWluUGF0aEFmdGVyID0gZnVuY3Rpb24oYmFzZSwgcGF0aCwgZnVuYykge1xyXG4gICAgICAgIHJldHVybiBDb21tb24uc2V0KGJhc2UsIHBhdGgsIENvbW1vbi5jaGFpbihcclxuICAgICAgICAgICAgQ29tbW9uLmdldChiYXNlLCBwYXRoKSxcclxuICAgICAgICAgICAgZnVuY1xyXG4gICAgICAgICkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuRW5naW5lYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBlbmdpbmVzLlxyXG4qIEFuIGVuZ2luZSBpcyBhIGNvbnRyb2xsZXIgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHRoZSBzaW11bGF0aW9uIG9mIHRoZSB3b3JsZC5cclxuKiBTZWUgYE1hdHRlci5SdW5uZXJgIGZvciBhbiBvcHRpb25hbCBnYW1lIGxvb3AgdXRpbGl0eS5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgRW5naW5lXHJcbiovXHJcblxyXG52YXIgRW5naW5lID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVuZ2luZTtcclxuXHJcbnZhciBXb3JsZCA9IHJlcXVpcmUoJy4uL2JvZHkvV29ybGQnKTtcclxudmFyIFNsZWVwaW5nID0gcmVxdWlyZSgnLi9TbGVlcGluZycpO1xyXG52YXIgUmVzb2x2ZXIgPSByZXF1aXJlKCcuLi9jb2xsaXNpb24vUmVzb2x2ZXInKTtcclxudmFyIFBhaXJzID0gcmVxdWlyZSgnLi4vY29sbGlzaW9uL1BhaXJzJyk7XHJcbnZhciBNZXRyaWNzID0gcmVxdWlyZSgnLi9NZXRyaWNzJyk7XHJcbnZhciBHcmlkID0gcmVxdWlyZSgnLi4vY29sbGlzaW9uL0dyaWQnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4vRXZlbnRzJyk7XHJcbnZhciBDb21wb3NpdGUgPSByZXF1aXJlKCcuLi9ib2R5L0NvbXBvc2l0ZScpO1xyXG52YXIgQ29uc3RyYWludCA9IHJlcXVpcmUoJy4uL2NvbnN0cmFpbnQvQ29uc3RyYWludCcpO1xyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi9Db21tb24nKTtcclxudmFyIEJvZHkgPSByZXF1aXJlKCcuLi9ib2R5L0JvZHknKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW5naW5lLiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cclxuICAgICAqIEFsbCBwcm9wZXJ0aWVzIGhhdmUgZGVmYXVsdCB2YWx1ZXMsIGFuZCBtYW55IGFyZSBwcmUtY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIG90aGVyIHByb3BlcnRpZXMuXHJcbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBiZWxvdyBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBjcmVhdGVcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cclxuICAgICAqIEByZXR1cm4ge2VuZ2luZX0gZW5naW5lXHJcbiAgICAgKi9cclxuICAgIEVuZ2luZS5jcmVhdGUgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgICAgLy8gb3B0aW9ucyBtYXkgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCAoYW5kIG9ubHkpIGFyZ3VtZW50XHJcbiAgICAgICAgb3B0aW9ucyA9IENvbW1vbi5pc0VsZW1lbnQoZWxlbWVudCkgPyBvcHRpb25zIDogZWxlbWVudDtcclxuICAgICAgICBlbGVtZW50ID0gQ29tbW9uLmlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBudWxsO1xyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCB8fCBvcHRpb25zLnJlbmRlcikge1xyXG4gICAgICAgICAgICBDb21tb24ud2FybignRW5naW5lLmNyZWF0ZTogZW5naW5lLnJlbmRlciBpcyBkZXByZWNhdGVkIChzZWUgZG9jcyknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkZWZhdWx0cyA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb25JdGVyYXRpb25zOiA2LFxyXG4gICAgICAgICAgICB2ZWxvY2l0eUl0ZXJhdGlvbnM6IDQsXHJcbiAgICAgICAgICAgIGNvbnN0cmFpbnRJdGVyYXRpb25zOiAyLFxyXG4gICAgICAgICAgICBlbmFibGVTbGVlcGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIGV2ZW50czogW10sXHJcbiAgICAgICAgICAgIHBsdWdpbjoge30sXHJcbiAgICAgICAgICAgIHRpbWluZzoge1xyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiAwLFxyXG4gICAgICAgICAgICAgICAgdGltZVNjYWxlOiAxXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJyb2FkcGhhc2U6IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI6IEdyaWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBlbmdpbmUgPSBDb21tb24uZXh0ZW5kKGRlZmF1bHRzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgZW5naW5lLndvcmxkID0gb3B0aW9ucy53b3JsZCB8fCBXb3JsZC5jcmVhdGUoZW5naW5lLndvcmxkKTtcclxuICAgICAgICBlbmdpbmUucGFpcnMgPSBQYWlycy5jcmVhdGUoKTtcclxuICAgICAgICBlbmdpbmUuYnJvYWRwaGFzZSA9IGVuZ2luZS5icm9hZHBoYXNlLmNvbnRyb2xsZXIuY3JlYXRlKGVuZ2luZS5icm9hZHBoYXNlKTtcclxuICAgICAgICBlbmdpbmUubWV0cmljcyA9IGVuZ2luZS5tZXRyaWNzIHx8IHsgZXh0ZW5kZWQ6IGZhbHNlIH07XHJcblxyXG4gICAgICAgIC8vIEBpZiBERUJVR1xyXG4gICAgICAgIGVuZ2luZS5tZXRyaWNzID0gTWV0cmljcy5jcmVhdGUoZW5naW5lLm1ldHJpY3MpO1xyXG4gICAgICAgIC8vIEBlbmRpZlxyXG5cclxuICAgICAgICByZXR1cm4gZW5naW5lO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBzaW11bGF0aW9uIGZvcndhcmQgaW4gdGltZSBieSBgZGVsdGFgIG1zLlxyXG4gICAgICogVGhlIGBjb3JyZWN0aW9uYCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgdGltZSBjb3JyZWN0aW9uIGZhY3RvciB0byBhcHBseSB0byB0aGUgdXBkYXRlLlxyXG4gICAgICogVGhpcyBjYW4gaGVscCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgc2ltdWxhdGlvbiBpbiBjYXNlcyB3aGVyZSBgZGVsdGFgIGlzIGNoYW5naW5nIGJldHdlZW4gdXBkYXRlcy5cclxuICAgICAqIFRoZSB2YWx1ZSBvZiBgY29ycmVjdGlvbmAgaXMgZGVmaW5lZCBhcyBgZGVsdGEgLyBsYXN0RGVsdGFgLCBpLmUuIHRoZSBwZXJjZW50YWdlIGNoYW5nZSBvZiBgZGVsdGFgIG92ZXIgdGhlIGxhc3Qgc3RlcC5cclxuICAgICAqIFRoZXJlZm9yZSB0aGUgdmFsdWUgaXMgYWx3YXlzIGAxYCAobm8gY29ycmVjdGlvbikgd2hlbiBgZGVsdGFgIGNvbnN0YW50IChvciB3aGVuIG5vIGNvcnJlY3Rpb24gaXMgZGVzaXJlZCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQpLlxyXG4gICAgICogU2VlIHRoZSBwYXBlciBvbiA8YSBocmVmPVwiaHR0cDovL2xvbmVzb2NrLm5ldC9hcnRpY2xlL3ZlcmxldC5odG1sXCI+VGltZSBDb3JyZWN0ZWQgVmVybGV0PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUcmlnZ2VycyBgYmVmb3JlVXBkYXRlYCBhbmQgYGFmdGVyVXBkYXRlYCBldmVudHMuXHJcbiAgICAgKiBUcmlnZ2VycyBgY29sbGlzaW9uU3RhcnRgLCBgY29sbGlzaW9uQWN0aXZlYCBhbmQgYGNvbGxpc2lvbkVuZGAgZXZlbnRzLlxyXG4gICAgICogQG1ldGhvZCB1cGRhdGVcclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsdGE9MTYuNjY2XVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3JyZWN0aW9uPTFdXHJcbiAgICAgKi9cclxuICAgIEVuZ2luZS51cGRhdGUgPSBmdW5jdGlvbihlbmdpbmUsIGRlbHRhLCBjb3JyZWN0aW9uKSB7XHJcbiAgICAgICAgZGVsdGEgPSBkZWx0YSB8fCAxMDAwIC8gNjA7XHJcbiAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gfHwgMTtcclxuXHJcbiAgICAgICAgdmFyIHdvcmxkID0gZW5naW5lLndvcmxkLFxyXG4gICAgICAgICAgICB0aW1pbmcgPSBlbmdpbmUudGltaW5nLFxyXG4gICAgICAgICAgICBicm9hZHBoYXNlID0gZW5naW5lLmJyb2FkcGhhc2UsXHJcbiAgICAgICAgICAgIGJyb2FkcGhhc2VQYWlycyA9IFtdLFxyXG4gICAgICAgICAgICBpO1xyXG5cclxuICAgICAgICAvLyBpbmNyZW1lbnQgdGltZXN0YW1wXHJcbiAgICAgICAgdGltaW5nLnRpbWVzdGFtcCArPSBkZWx0YSAqIHRpbWluZy50aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCBvYmplY3RcclxuICAgICAgICB2YXIgZXZlbnQgPSB7XHJcbiAgICAgICAgICAgIHRpbWVzdGFtcDogdGltaW5nLnRpbWVzdGFtcFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKGVuZ2luZSwgJ2JlZm9yZVVwZGF0ZScsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgLy8gZ2V0IGxpc3RzIG9mIGFsbCBib2RpZXMgYW5kIGNvbnN0cmFpbnRzLCBubyBtYXR0ZXIgd2hhdCBjb21wb3NpdGVzIHRoZXkgYXJlIGluXHJcbiAgICAgICAgdmFyIGFsbEJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLFxyXG4gICAgICAgICAgICBhbGxDb25zdHJhaW50cyA9IENvbXBvc2l0ZS5hbGxDb25zdHJhaW50cyh3b3JsZCk7XHJcblxyXG4gICAgICAgIC8vIEBpZiBERUJVR1xyXG4gICAgICAgIC8vIHJlc2V0IG1ldHJpY3MgbG9nZ2luZ1xyXG4gICAgICAgIE1ldHJpY3MucmVzZXQoZW5naW5lLm1ldHJpY3MpO1xyXG4gICAgICAgIC8vIEBlbmRpZlxyXG5cclxuICAgICAgICAvLyBpZiBzbGVlcGluZyBlbmFibGVkLCBjYWxsIHRoZSBzbGVlcGluZyBjb250cm9sbGVyXHJcbiAgICAgICAgaWYgKGVuZ2luZS5lbmFibGVTbGVlcGluZylcclxuICAgICAgICAgICAgU2xlZXBpbmcudXBkYXRlKGFsbEJvZGllcywgdGltaW5nLnRpbWVTY2FsZSk7XHJcblxyXG4gICAgICAgIC8vIGFwcGxpZXMgZ3Jhdml0eSB0byBhbGwgYm9kaWVzXHJcbiAgICAgICAgRW5naW5lLl9ib2RpZXNBcHBseUdyYXZpdHkoYWxsQm9kaWVzLCB3b3JsZC5ncmF2aXR5KTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIGFsbCBib2R5IHBvc2l0aW9uIGFuZCByb3RhdGlvbiBieSBpbnRlZ3JhdGlvblxyXG4gICAgICAgIEVuZ2luZS5fYm9kaWVzVXBkYXRlKGFsbEJvZGllcywgZGVsdGEsIHRpbWluZy50aW1lU2NhbGUsIGNvcnJlY3Rpb24sIHdvcmxkLmJvdW5kcyk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBhbGwgY29uc3RyYWludHMgKGZpcnN0IHBhc3MpXHJcbiAgICAgICAgQ29uc3RyYWludC5wcmVTb2x2ZUFsbChhbGxCb2RpZXMpO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmdpbmUuY29uc3RyYWludEl0ZXJhdGlvbnM7IGkrKykge1xyXG4gICAgICAgICAgICBDb25zdHJhaW50LnNvbHZlQWxsKGFsbENvbnN0cmFpbnRzLCB0aW1pbmcudGltZVNjYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQ29uc3RyYWludC5wb3N0U29sdmVBbGwoYWxsQm9kaWVzKTtcclxuXHJcbiAgICAgICAgLy8gYnJvYWRwaGFzZSBwYXNzOiBmaW5kIHBvdGVudGlhbCBjb2xsaXNpb24gcGFpcnNcclxuICAgICAgICBpZiAoYnJvYWRwaGFzZS5jb250cm9sbGVyKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHdvcmxkIGlzIGRpcnR5LCB3ZSBtdXN0IGZsdXNoIHRoZSB3aG9sZSBncmlkXHJcbiAgICAgICAgICAgIGlmICh3b3JsZC5pc01vZGlmaWVkKVxyXG4gICAgICAgICAgICAgICAgYnJvYWRwaGFzZS5jb250cm9sbGVyLmNsZWFyKGJyb2FkcGhhc2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBncmlkIGJ1Y2tldHMgYmFzZWQgb24gY3VycmVudCBib2RpZXNcclxuICAgICAgICAgICAgYnJvYWRwaGFzZS5jb250cm9sbGVyLnVwZGF0ZShicm9hZHBoYXNlLCBhbGxCb2RpZXMsIGVuZ2luZSwgd29ybGQuaXNNb2RpZmllZCk7XHJcbiAgICAgICAgICAgIGJyb2FkcGhhc2VQYWlycyA9IGJyb2FkcGhhc2UucGFpcnNMaXN0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGlmIG5vIGJyb2FkcGhhc2Ugc2V0LCB3ZSBqdXN0IHBhc3MgYWxsIGJvZGllc1xyXG4gICAgICAgICAgICBicm9hZHBoYXNlUGFpcnMgPSBhbGxCb2RpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjbGVhciBhbGwgY29tcG9zaXRlIG1vZGlmaWVkIGZsYWdzXHJcbiAgICAgICAgaWYgKHdvcmxkLmlzTW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLnNldE1vZGlmaWVkKHdvcmxkLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbmFycm93cGhhc2UgcGFzczogZmluZCBhY3R1YWwgY29sbGlzaW9ucywgdGhlbiBjcmVhdGUgb3IgdXBkYXRlIGNvbGxpc2lvbiBwYWlyc1xyXG4gICAgICAgIHZhciBjb2xsaXNpb25zID0gYnJvYWRwaGFzZS5kZXRlY3Rvcihicm9hZHBoYXNlUGFpcnMsIGVuZ2luZSk7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBjb2xsaXNpb24gcGFpcnNcclxuICAgICAgICB2YXIgcGFpcnMgPSBlbmdpbmUucGFpcnMsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IHRpbWluZy50aW1lc3RhbXA7XHJcbiAgICAgICAgUGFpcnMudXBkYXRlKHBhaXJzLCBjb2xsaXNpb25zLCB0aW1lc3RhbXApO1xyXG4gICAgICAgIFBhaXJzLnJlbW92ZU9sZChwYWlycywgdGltZXN0YW1wKTtcclxuXHJcbiAgICAgICAgLy8gd2FrZSB1cCBib2RpZXMgaW52b2x2ZWQgaW4gY29sbGlzaW9uc1xyXG4gICAgICAgIGlmIChlbmdpbmUuZW5hYmxlU2xlZXBpbmcpXHJcbiAgICAgICAgICAgIFNsZWVwaW5nLmFmdGVyQ29sbGlzaW9ucyhwYWlycy5saXN0LCB0aW1pbmcudGltZVNjYWxlKTtcclxuXHJcbiAgICAgICAgLy8gdHJpZ2dlciBjb2xsaXNpb24gZXZlbnRzXHJcbiAgICAgICAgaWYgKHBhaXJzLmNvbGxpc2lvblN0YXJ0Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKGVuZ2luZSwgJ2NvbGxpc2lvblN0YXJ0JywgeyBwYWlyczogcGFpcnMuY29sbGlzaW9uU3RhcnQgfSk7XHJcblxyXG4gICAgICAgIC8vIGl0ZXJhdGl2ZWx5IHJlc29sdmUgcG9zaXRpb24gYmV0d2VlbiBjb2xsaXNpb25zXHJcbiAgICAgICAgUmVzb2x2ZXIucHJlU29sdmVQb3NpdGlvbihwYWlycy5saXN0KTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5naW5lLnBvc2l0aW9uSXRlcmF0aW9uczsgaSsrKSB7XHJcbiAgICAgICAgICAgIFJlc29sdmVyLnNvbHZlUG9zaXRpb24ocGFpcnMubGlzdCwgYWxsQm9kaWVzLCB0aW1pbmcudGltZVNjYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVzb2x2ZXIucG9zdFNvbHZlUG9zaXRpb24oYWxsQm9kaWVzKTtcclxuXHJcbiAgICAgICAgLy8gdXBkYXRlIGFsbCBjb25zdHJhaW50cyAoc2Vjb25kIHBhc3MpXHJcbiAgICAgICAgQ29uc3RyYWludC5wcmVTb2x2ZUFsbChhbGxCb2RpZXMpO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmdpbmUuY29uc3RyYWludEl0ZXJhdGlvbnM7IGkrKykge1xyXG4gICAgICAgICAgICBDb25zdHJhaW50LnNvbHZlQWxsKGFsbENvbnN0cmFpbnRzLCB0aW1pbmcudGltZVNjYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQ29uc3RyYWludC5wb3N0U29sdmVBbGwoYWxsQm9kaWVzKTtcclxuXHJcbiAgICAgICAgLy8gaXRlcmF0aXZlbHkgcmVzb2x2ZSB2ZWxvY2l0eSBiZXR3ZWVuIGNvbGxpc2lvbnNcclxuICAgICAgICBSZXNvbHZlci5wcmVTb2x2ZVZlbG9jaXR5KHBhaXJzLmxpc3QpO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmdpbmUudmVsb2NpdHlJdGVyYXRpb25zOyBpKyspIHtcclxuICAgICAgICAgICAgUmVzb2x2ZXIuc29sdmVWZWxvY2l0eShwYWlycy5saXN0LCB0aW1pbmcudGltZVNjYWxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRyaWdnZXIgY29sbGlzaW9uIGV2ZW50c1xyXG4gICAgICAgIGlmIChwYWlycy5jb2xsaXNpb25BY3RpdmUubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgRXZlbnRzLnRyaWdnZXIoZW5naW5lLCAnY29sbGlzaW9uQWN0aXZlJywgeyBwYWlyczogcGFpcnMuY29sbGlzaW9uQWN0aXZlIH0pO1xyXG5cclxuICAgICAgICBpZiAocGFpcnMuY29sbGlzaW9uRW5kLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIEV2ZW50cy50cmlnZ2VyKGVuZ2luZSwgJ2NvbGxpc2lvbkVuZCcsIHsgcGFpcnM6IHBhaXJzLmNvbGxpc2lvbkVuZCB9KTtcclxuXHJcbiAgICAgICAgLy8gQGlmIERFQlVHXHJcbiAgICAgICAgLy8gdXBkYXRlIG1ldHJpY3MgbG9nXHJcbiAgICAgICAgTWV0cmljcy51cGRhdGUoZW5naW5lLm1ldHJpY3MsIGVuZ2luZSk7XHJcbiAgICAgICAgLy8gQGVuZGlmXHJcblxyXG4gICAgICAgIC8vIGNsZWFyIGZvcmNlIGJ1ZmZlcnNcclxuICAgICAgICBFbmdpbmUuX2JvZGllc0NsZWFyRm9yY2VzKGFsbEJvZGllcyk7XHJcblxyXG4gICAgICAgIEV2ZW50cy50cmlnZ2VyKGVuZ2luZSwgJ2FmdGVyVXBkYXRlJywgZXZlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gZW5naW5lO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXJnZXMgdHdvIGVuZ2luZXMgYnkga2VlcGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBgZW5naW5lQWAgYnV0IHJlcGxhY2luZyB0aGUgd29ybGQgd2l0aCB0aGUgb25lIGZyb20gYGVuZ2luZUJgLlxyXG4gICAgICogQG1ldGhvZCBtZXJnZVxyXG4gICAgICogQHBhcmFtIHtlbmdpbmV9IGVuZ2luZUFcclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVCXHJcbiAgICAgKi9cclxuICAgIEVuZ2luZS5tZXJnZSA9IGZ1bmN0aW9uKGVuZ2luZUEsIGVuZ2luZUIpIHtcclxuICAgICAgICBDb21tb24uZXh0ZW5kKGVuZ2luZUEsIGVuZ2luZUIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChlbmdpbmVCLndvcmxkKSB7XHJcbiAgICAgICAgICAgIGVuZ2luZUEud29ybGQgPSBlbmdpbmVCLndvcmxkO1xyXG5cclxuICAgICAgICAgICAgRW5naW5lLmNsZWFyKGVuZ2luZUEpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMoZW5naW5lQS53b3JsZCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcbiAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoYm9keSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYm9keS5pZCA9IENvbW1vbi5uZXh0SWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGVuZ2luZSBpbmNsdWRpbmcgdGhlIHdvcmxkLCBwYWlycyBhbmQgYnJvYWRwaGFzZS5cclxuICAgICAqIEBtZXRob2QgY2xlYXJcclxuICAgICAqIEBwYXJhbSB7ZW5naW5lfSBlbmdpbmVcclxuICAgICAqL1xyXG4gICAgRW5naW5lLmNsZWFyID0gZnVuY3Rpb24oZW5naW5lKSB7XHJcbiAgICAgICAgdmFyIHdvcmxkID0gZW5naW5lLndvcmxkO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFBhaXJzLmNsZWFyKGVuZ2luZS5wYWlycyk7XHJcblxyXG4gICAgICAgIHZhciBicm9hZHBoYXNlID0gZW5naW5lLmJyb2FkcGhhc2U7XHJcbiAgICAgICAgaWYgKGJyb2FkcGhhc2UuY29udHJvbGxlcikge1xyXG4gICAgICAgICAgICB2YXIgYm9kaWVzID0gQ29tcG9zaXRlLmFsbEJvZGllcyh3b3JsZCk7XHJcbiAgICAgICAgICAgIGJyb2FkcGhhc2UuY29udHJvbGxlci5jbGVhcihicm9hZHBoYXNlKTtcclxuICAgICAgICAgICAgYnJvYWRwaGFzZS5jb250cm9sbGVyLnVwZGF0ZShicm9hZHBoYXNlLCBib2RpZXMsIGVuZ2luZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFplcm9lcyB0aGUgYGJvZHkuZm9yY2VgIGFuZCBgYm9keS50b3JxdWVgIGZvcmNlIGJ1ZmZlcnMuXHJcbiAgICAgKiBAbWV0aG9kIF9ib2RpZXNDbGVhckZvcmNlc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcclxuICAgICAqL1xyXG4gICAgRW5naW5lLl9ib2RpZXNDbGVhckZvcmNlcyA9IGZ1bmN0aW9uKGJvZGllcykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm9kaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBib2R5ID0gYm9kaWVzW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgZm9yY2UgYnVmZmVyc1xyXG4gICAgICAgICAgICBib2R5LmZvcmNlLnggPSAwO1xyXG4gICAgICAgICAgICBib2R5LmZvcmNlLnkgPSAwO1xyXG4gICAgICAgICAgICBib2R5LnRvcnF1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5cyBhIG1hc3MgZGVwZW5kYW50IGZvcmNlIHRvIGFsbCBnaXZlbiBib2RpZXMuXHJcbiAgICAgKiBAbWV0aG9kIF9ib2RpZXNBcHBseUdyYXZpdHlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gZ3Jhdml0eVxyXG4gICAgICovXHJcbiAgICBFbmdpbmUuX2JvZGllc0FwcGx5R3Jhdml0eSA9IGZ1bmN0aW9uKGJvZGllcywgZ3Jhdml0eSkge1xyXG4gICAgICAgIHZhciBncmF2aXR5U2NhbGUgPSB0eXBlb2YgZ3Jhdml0eS5zY2FsZSAhPT0gJ3VuZGVmaW5lZCcgPyBncmF2aXR5LnNjYWxlIDogMC4wMDE7XHJcblxyXG4gICAgICAgIGlmICgoZ3Jhdml0eS54ID09PSAwICYmIGdyYXZpdHkueSA9PT0gMCkgfHwgZ3Jhdml0eVNjYWxlID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keS5pZ25vcmVHcmF2aXR5IHx8IGJvZHkuaXNTdGF0aWMgfHwgYm9keS5pc1NsZWVwaW5nKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAvLyBhcHBseSBncmF2aXR5XHJcbiAgICAgICAgICAgIGJvZHkuZm9yY2UueCArPSAoYm9keS5tYXNzICogZ3Jhdml0eS54ICogZ3Jhdml0eVNjYWxlKSAqIGJvZHkuZ3Jhdml0eVNjYWxlLng7XHJcbiAgICAgICAgICAgIGJvZHkuZm9yY2UueSArPSAoYm9keS5tYXNzICogZ3Jhdml0eS55ICogZ3Jhdml0eVNjYWxlKSAqIGJvZHkuZ3Jhdml0eVNjYWxlLnk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5cyBgQm9keS51cGRhdGVgIHRvIGFsbCBnaXZlbiBgYm9kaWVzYC5cclxuICAgICAqIEBtZXRob2QgX2JvZGllc1VwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBib2RpZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVRpbWUgXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHVwZGF0ZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb3JyZWN0aW9uIFxyXG4gICAgICogVGhlIFZlcmxldCBjb3JyZWN0aW9uIGZhY3RvciAoZGVsdGFUaW1lIC8gbGFzdERlbHRhVGltZSlcclxuICAgICAqIEBwYXJhbSB7Ym91bmRzfSB3b3JsZEJvdW5kc1xyXG4gICAgICovXHJcbiAgICBFbmdpbmUuX2JvZGllc1VwZGF0ZSA9IGZ1bmN0aW9uKGJvZGllcywgZGVsdGFUaW1lLCB0aW1lU2NhbGUsIGNvcnJlY3Rpb24sIHdvcmxkQm91bmRzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keS5pc1N0YXRpYyB8fCBib2R5LmlzU2xlZXBpbmcpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIEJvZHkudXBkYXRlKGJvZHksIGRlbHRhVGltZSwgdGltZVNjYWxlLCBjb3JyZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYWxpYXMgZm9yIGBSdW5uZXIucnVuYCwgc2VlIGBNYXR0ZXIuUnVubmVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBtZXRob2QgcnVuXHJcbiAgICAgKiBAcGFyYW0ge2VuZ2luZX0gZW5naW5lXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICogRmlyZWQganVzdCBiZWZvcmUgYW4gdXBkYXRlXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBiZWZvcmVVcGRhdGVcclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlIGFuZCBhbGwgY29sbGlzaW9uIGV2ZW50c1xyXG4gICAgKlxyXG4gICAgKiBAZXZlbnQgYWZ0ZXJVcGRhdGVcclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlLCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgaGF2ZSBzdGFydGVkIHRvIGNvbGxpZGUgaW4gdGhlIGN1cnJlbnQgdGljayAoaWYgYW55KVxyXG4gICAgKlxyXG4gICAgKiBAZXZlbnQgY29sbGlzaW9uU3RhcnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQucGFpcnMgTGlzdCBvZiBhZmZlY3RlZCBwYWlyc1xyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlLCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgYXJlIGNvbGxpZGluZyBpbiB0aGUgY3VycmVudCB0aWNrIChpZiBhbnkpXHJcbiAgICAqXHJcbiAgICAqIEBldmVudCBjb2xsaXNpb25BY3RpdmVcclxuICAgICogQHBhcmFtIHt9IGV2ZW50IEFuIGV2ZW50IG9iamVjdFxyXG4gICAgKiBAcGFyYW0ge30gZXZlbnQucGFpcnMgTGlzdCBvZiBhZmZlY3RlZCBwYWlyc1xyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQudGltZXN0YW1wIFRoZSBlbmdpbmUudGltaW5nLnRpbWVzdGFtcCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBvZiB0aGUgZXZlbnRcclxuICAgICogQHBhcmFtIHt9IGV2ZW50Lm5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaXJlZCBhZnRlciBlbmdpbmUgdXBkYXRlLCBwcm92aWRlcyBhIGxpc3Qgb2YgYWxsIHBhaXJzIHRoYXQgaGF2ZSBlbmRlZCBjb2xsaXNpb24gaW4gdGhlIGN1cnJlbnQgdGljayAoaWYgYW55KVxyXG4gICAgKlxyXG4gICAgKiBAZXZlbnQgY29sbGlzaW9uRW5kXHJcbiAgICAqIEBwYXJhbSB7fSBldmVudCBBbiBldmVudCBvYmplY3RcclxuICAgICogQHBhcmFtIHt9IGV2ZW50LnBhaXJzIExpc3Qgb2YgYWZmZWN0ZWQgcGFpcnNcclxuICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnRpbWVzdGFtcCBUaGUgZW5naW5lLnRpbWluZy50aW1lc3RhbXAgb2YgdGhlIGV2ZW50XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5zb3VyY2UgVGhlIHNvdXJjZSBvYmplY3Qgb2YgdGhlIGV2ZW50XHJcbiAgICAqIEBwYXJhbSB7fSBldmVudC5uYW1lIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgKi9cclxuXHJcbiAgICAvKlxyXG4gICAgKlxyXG4gICAgKiAgUHJvcGVydGllcyBEb2N1bWVudGF0aW9uXHJcbiAgICAqXHJcbiAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybSBlYWNoIHVwZGF0ZS5cclxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgaGlnaGVyIHF1YWxpdHkgdGhlIHNpbXVsYXRpb24gd2lsbCBiZSBhdCB0aGUgZXhwZW5zZSBvZiBwZXJmb3JtYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcG9zaXRpb25JdGVyYXRpb25zXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDZcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZlbG9jaXR5IGl0ZXJhdGlvbnMgdG8gcGVyZm9ybSBlYWNoIHVwZGF0ZS5cclxuICAgICAqIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgaGlnaGVyIHF1YWxpdHkgdGhlIHNpbXVsYXRpb24gd2lsbCBiZSBhdCB0aGUgZXhwZW5zZSBvZiBwZXJmb3JtYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgdmVsb2NpdHlJdGVyYXRpb25zXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDRcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZWdlciBgTnVtYmVyYCB0aGF0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnN0cmFpbnQgaXRlcmF0aW9ucyB0byBwZXJmb3JtIGVhY2ggdXBkYXRlLlxyXG4gICAgICogVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBoaWdoZXIgcXVhbGl0eSB0aGUgc2ltdWxhdGlvbiB3aWxsIGJlIGF0IHRoZSBleHBlbnNlIG9mIHBlcmZvcm1hbmNlLlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgYDJgIGlzIHVzdWFsbHkgdmVyeSBhZGVxdWF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgY29uc3RyYWludEl0ZXJhdGlvbnNcclxuICAgICAqIEB0eXBlIG51bWJlclxyXG4gICAgICogQGRlZmF1bHQgMlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGZsYWcgdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW5naW5lIHNob3VsZCBhbGxvdyBzbGVlcGluZyB2aWEgdGhlIGBNYXR0ZXIuU2xlZXBpbmdgIG1vZHVsZS5cclxuICAgICAqIFNsZWVwaW5nIGNhbiBpbXByb3ZlIHN0YWJpbGl0eSBhbmQgcGVyZm9ybWFuY2UsIGJ1dCBvZnRlbiBhdCB0aGUgZXhwZW5zZSBvZiBhY2N1cmFjeS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgZW5hYmxlU2xlZXBpbmdcclxuICAgICAqIEB0eXBlIGJvb2xlYW5cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGBPYmplY3RgIGNvbnRhaW5pbmcgcHJvcGVydGllcyByZWdhcmRpbmcgdGhlIHRpbWluZyBzeXN0ZW1zIG9mIHRoZSBlbmdpbmUuIFxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSB0aW1pbmdcclxuICAgICAqIEB0eXBlIG9iamVjdFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGBOdW1iZXJgIHRoYXQgc3BlY2lmaWVzIHRoZSBnbG9iYWwgc2NhbGluZyBmYWN0b3Igb2YgdGltZSBmb3IgYWxsIGJvZGllcy5cclxuICAgICAqIEEgdmFsdWUgb2YgYDBgIGZyZWV6ZXMgdGhlIHNpbXVsYXRpb24uXHJcbiAgICAgKiBBIHZhbHVlIG9mIGAwLjFgIGdpdmVzIGEgc2xvdy1tb3Rpb24gZWZmZWN0LlxyXG4gICAgICogQSB2YWx1ZSBvZiBgMS4yYCBnaXZlcyBhIHNwZWVkLXVwIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgdGltaW5nLnRpbWVTY2FsZVxyXG4gICAgICogQHR5cGUgbnVtYmVyXHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYE51bWJlcmAgdGhhdCBzcGVjaWZpZXMgdGhlIGN1cnJlbnQgc2ltdWxhdGlvbi10aW1lIGluIG1pbGxpc2Vjb25kcyBzdGFydGluZyBmcm9tIGAwYC4gXHJcbiAgICAgKiBJdCBpcyBpbmNyZW1lbnRlZCBvbiBldmVyeSBgRW5naW5lLnVwZGF0ZWAgYnkgdGhlIGdpdmVuIGBkZWx0YWAgYXJndW1lbnQuIFxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSB0aW1pbmcudGltZXN0YW1wXHJcbiAgICAgKiBAdHlwZSBudW1iZXJcclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgYSBgUmVuZGVyYCBjb250cm9sbGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhIGBNYXR0ZXIuUmVuZGVyYCBpbnN0YW5jZSBjcmVhdGVkIGJ5IGBFbmdpbmUuY3JlYXRlYC5cclxuICAgICAqIE9uZSBtYXkgYWxzbyBkZXZlbG9wIGEgY3VzdG9tIHJlbmRlcmVyIG1vZHVsZSBiYXNlZCBvbiBgTWF0dGVyLlJlbmRlcmAgYW5kIHBhc3MgYW4gaW5zdGFuY2Ugb2YgaXQgdG8gYEVuZ2luZS5jcmVhdGVgIHZpYSBgb3B0aW9ucy5yZW5kZXJgLlxyXG4gICAgICpcclxuICAgICAqIEEgbWluaW1hbCBjdXN0b20gcmVuZGVyZXIgb2JqZWN0IG11c3QgZGVmaW5lIGF0IGxlYXN0IHRocmVlIGZ1bmN0aW9uczogYGNyZWF0ZWAsIGBjbGVhcmAgYW5kIGB3b3JsZGAgKHNlZSBgTWF0dGVyLlJlbmRlcmApLlxyXG4gICAgICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbnN0ZWFkIHBhc3MgdGhlIF9tb2R1bGVfIHJlZmVyZW5jZSB2aWEgYG9wdGlvbnMucmVuZGVyLmNvbnRyb2xsZXJgIGFuZCBgRW5naW5lLmNyZWF0ZWAgd2lsbCBpbnN0YW50aWF0ZSBvbmUgZm9yIHlvdS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgcmVuZGVyXHJcbiAgICAgKiBAdHlwZSByZW5kZXJcclxuICAgICAqIEBkZXByZWNhdGVkIHNlZSBEZW1vLmpzIGZvciBhbiBleGFtcGxlIG9mIGNyZWF0aW5nIGEgcmVuZGVyZXJcclxuICAgICAqIEBkZWZhdWx0IGEgTWF0dGVyLlJlbmRlciBpbnN0YW5jZVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiBhIGJyb2FkcGhhc2UgY29udHJvbGxlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBgTWF0dGVyLkdyaWRgIGluc3RhbmNlIGNyZWF0ZWQgYnkgYEVuZ2luZS5jcmVhdGVgLlxyXG4gICAgICpcclxuICAgICAqIEBwcm9wZXJ0eSBicm9hZHBoYXNlXHJcbiAgICAgKiBAdHlwZSBncmlkXHJcbiAgICAgKiBAZGVmYXVsdCBhIE1hdHRlci5HcmlkIGluc3RhbmNlXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYFdvcmxkYCBjb21wb3NpdGUgb2JqZWN0IHRoYXQgd2lsbCBjb250YWluIGFsbCBzaW11bGF0ZWQgYm9kaWVzIGFuZCBjb25zdHJhaW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvcGVydHkgd29ybGRcclxuICAgICAqIEB0eXBlIHdvcmxkXHJcbiAgICAgKiBAZGVmYXVsdCBhIE1hdHRlci5Xb3JsZCBpbnN0YW5jZVxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBvYmplY3QgcmVzZXJ2ZWQgZm9yIHN0b3JpbmcgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3BlcnR5IHBsdWdpblxyXG4gICAgICogQHR5cGUge31cclxuICAgICAqL1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuRXZlbnRzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyB0byBmaXJlIGFuZCBsaXN0ZW4gdG8gZXZlbnRzIG9uIG90aGVyIG9iamVjdHMuXHJcbipcclxuKiBTZWUgdGhlIGluY2x1ZGVkIHVzYWdlIFtleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL2xpYWJydS9tYXR0ZXItanMvdHJlZS9tYXN0ZXIvZXhhbXBsZXMpLlxyXG4qXHJcbiogQGNsYXNzIEV2ZW50c1xyXG4qL1xyXG5cclxudmFyIEV2ZW50cyA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFdmVudHM7XHJcblxyXG52YXIgQ29tbW9uID0gcmVxdWlyZSgnLi9Db21tb24nKTtcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnNjcmliZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gb2JqZWN0J3MgYGV2ZW50TmFtZWAuXHJcbiAgICAgKiBAbWV0aG9kIG9uXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgRXZlbnRzLm9uID0gZnVuY3Rpb24ob2JqZWN0LCBldmVudE5hbWVzLCBjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBuYW1lcyA9IGV2ZW50TmFtZXMuc3BsaXQoJyAnKSxcclxuICAgICAgICAgICAgbmFtZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuYW1lID0gbmFtZXNbaV07XHJcbiAgICAgICAgICAgIG9iamVjdC5ldmVudHMgPSBvYmplY3QuZXZlbnRzIHx8IHt9O1xyXG4gICAgICAgICAgICBvYmplY3QuZXZlbnRzW25hbWVdID0gb2JqZWN0LmV2ZW50c1tuYW1lXSB8fCBbXTtcclxuICAgICAgICAgICAgb2JqZWN0LmV2ZW50c1tuYW1lXS5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjYWxsYmFjaztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBjYWxsYmFjay4gSWYgbm8gY2FsbGJhY2ssIGNsZWFycyBhbGwgY2FsbGJhY2tzIGluIGBldmVudE5hbWVzYC4gSWYgbm8gYGV2ZW50TmFtZXNgLCBjbGVhcnMgYWxsIGV2ZW50cy5cclxuICAgICAqIEBtZXRob2Qgb2ZmXHJcbiAgICAgKiBAcGFyYW0ge30gb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lc1xyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgRXZlbnRzLm9mZiA9IGZ1bmN0aW9uKG9iamVjdCwgZXZlbnROYW1lcywgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAoIWV2ZW50TmFtZXMpIHtcclxuICAgICAgICAgICAgb2JqZWN0LmV2ZW50cyA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBoYW5kbGUgRXZlbnRzLm9mZihvYmplY3QsIGNhbGxiYWNrKVxyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnROYW1lcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjYWxsYmFjayA9IGV2ZW50TmFtZXM7XHJcbiAgICAgICAgICAgIGV2ZW50TmFtZXMgPSBDb21tb24ua2V5cyhvYmplY3QuZXZlbnRzKS5qb2luKCcgJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbmFtZXMgPSBldmVudE5hbWVzLnNwbGl0KCcgJyk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IG9iamVjdC5ldmVudHNbbmFtZXNbaV1dLFxyXG4gICAgICAgICAgICAgICAgbmV3Q2FsbGJhY2tzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3Nbal0gIT09IGNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDYWxsYmFja3MucHVzaChjYWxsYmFja3Nbal0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvYmplY3QuZXZlbnRzW25hbWVzW2ldXSA9IG5ld0NhbGxiYWNrcztcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmlyZXMgYWxsIHRoZSBjYWxsYmFja3Mgc3Vic2NyaWJlZCB0byB0aGUgZ2l2ZW4gb2JqZWN0J3MgYGV2ZW50TmFtZWAsIGluIHRoZSBvcmRlciB0aGV5IHN1YnNjcmliZWQsIGlmIGFueS5cclxuICAgICAqIEBtZXRob2QgdHJpZ2dlclxyXG4gICAgICogQHBhcmFtIHt9IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZXNcclxuICAgICAqIEBwYXJhbSB7fSBldmVudFxyXG4gICAgICovXHJcbiAgICBFdmVudHMudHJpZ2dlciA9IGZ1bmN0aW9uKG9iamVjdCwgZXZlbnROYW1lcywgZXZlbnQpIHtcclxuICAgICAgICB2YXIgbmFtZXMsXHJcbiAgICAgICAgICAgIG5hbWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrcyxcclxuICAgICAgICAgICAgZXZlbnRDbG9uZTtcclxuXHJcbiAgICAgICAgdmFyIGV2ZW50cyA9IG9iamVjdC5ldmVudHM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGV2ZW50cyAmJiBDb21tb24ua2V5cyhldmVudHMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudClcclxuICAgICAgICAgICAgICAgIGV2ZW50ID0ge307XHJcblxyXG4gICAgICAgICAgICBuYW1lcyA9IGV2ZW50TmFtZXMuc3BsaXQoJyAnKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lc1tpXTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGV2ZW50c1tuYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDbG9uZSA9IENvbW1vbi5jbG9uZShldmVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Q2xvbmUubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDbG9uZS5zb3VyY2UgPSBvYmplY3Q7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tqXS5hcHBseShvYmplY3QsIFtldmVudENsb25lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbn0pKCk7XHJcbiIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyYCBtb2R1bGUgaXMgdGhlIHRvcCBsZXZlbCBuYW1lc3BhY2UuIEl0IGFsc28gaW5jbHVkZXMgYSBmdW5jdGlvbiBmb3IgaW5zdGFsbGluZyBwbHVnaW5zIG9uIHRvcCBvZiB0aGUgbGlicmFyeS5cclxuKlxyXG4qIEBjbGFzcyBNYXR0ZXJcclxuKi9cclxuXHJcbnZhciBNYXR0ZXIgPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyO1xyXG5cclxudmFyIFBsdWdpbiA9IHJlcXVpcmUoJy4vUGx1Z2luJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuL0NvbW1vbicpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxpYnJhcnkgbmFtZS5cclxuICAgICAqIEBwcm9wZXJ0eSBuYW1lXHJcbiAgICAgKiBAcmVhZE9ubHlcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIE1hdHRlci5uYW1lID0gJ21hdHRlci1qcyc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlicmFyeSB2ZXJzaW9uLlxyXG4gICAgICogQHByb3BlcnR5IHZlcnNpb25cclxuICAgICAqIEByZWFkT25seVxyXG4gICAgICogQHR5cGUge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgTWF0dGVyLnZlcnNpb24gPSAnMC4xNC4yJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBwbHVnaW4gZGVwZW5kZW5jaWVzIHRvIGJlIGluc3RhbGxlZC4gVGhlc2UgYXJlIG5vcm1hbGx5IHNldCBhbmQgaW5zdGFsbGVkIHRocm91Z2ggYE1hdHRlci51c2VgLlxyXG4gICAgICogQWx0ZXJuYXRpdmVseSB5b3UgbWF5IHNldCBgTWF0dGVyLnVzZXNgIG1hbnVhbGx5IGFuZCBpbnN0YWxsIHRoZW0gYnkgY2FsbGluZyBgUGx1Z2luLnVzZShNYXR0ZXIpYC5cclxuICAgICAqIEBwcm9wZXJ0eSB1c2VzXHJcbiAgICAgKiBAdHlwZSB7QXJyYXl9XHJcbiAgICAgKi9cclxuICAgIE1hdHRlci51c2VzID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGx1Z2lucyB0aGF0IGhhdmUgYmVlbiBpbnN0YWxsZWQgdGhyb3VnaCBgTWF0dGVyLlBsdWdpbi5pbnN0YWxsYC4gUmVhZCBvbmx5LlxyXG4gICAgICogQHByb3BlcnR5IHVzZWRcclxuICAgICAqIEByZWFkT25seVxyXG4gICAgICogQHR5cGUge0FycmF5fVxyXG4gICAgICovXHJcbiAgICBNYXR0ZXIudXNlZCA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFsbHMgdGhlIGdpdmVuIHBsdWdpbnMgb24gdGhlIGBNYXR0ZXJgIG5hbWVzcGFjZS5cclxuICAgICAqIFRoaXMgaXMgYSBzaG9ydC1oYW5kIGZvciBgUGx1Z2luLnVzZWAsIHNlZSBpdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIGF0IHRoZSBzdGFydCBvZiB5b3VyIGNvZGUsIHdpdGggYWxsIG9mIHRoZSBwbHVnaW5zIHlvdSB3aXNoIHRvIGluc3RhbGwgYXMgYXJndW1lbnRzLlxyXG4gICAgICogQXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIHVubGVzcyB5b3UgaW50ZW5kIHRvIG1hbnVhbGx5IGNvbnRyb2wgaW5zdGFsbGF0aW9uIG9yZGVyLlxyXG4gICAgICogQG1ldGhvZCB1c2VcclxuICAgICAqIEBwYXJhbSAuLi5wbHVnaW4ge0Z1bmN0aW9ufSBUaGUgcGx1Z2luKHMpIHRvIGluc3RhbGwgb24gYGJhc2VgIChtdWx0aS1hcmd1bWVudCkuXHJcbiAgICAgKi9cclxuICAgIE1hdHRlci51c2UgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBQbHVnaW4udXNlKE1hdHRlciwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhaW5zIGEgZnVuY3Rpb24gdG8gZXhjdXRlIGJlZm9yZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIGdpdmVuIGBwYXRoYCByZWxhdGl2ZSB0byBgTWF0dGVyYC5cclxuICAgICAqIFNlZSBhbHNvIGRvY3MgZm9yIGBDb21tb24uY2hhaW5gLlxyXG4gICAgICogQG1ldGhvZCBiZWZvcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvIGBNYXR0ZXJgXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGFpbiBiZWZvcmUgdGhlIG9yaWdpbmFsXHJcbiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGNoYWluZWQgZnVuY3Rpb24gdGhhdCByZXBsYWNlZCB0aGUgb3JpZ2luYWxcclxuICAgICAqL1xyXG4gICAgTWF0dGVyLmJlZm9yZSA9IGZ1bmN0aW9uKHBhdGgsIGZ1bmMpIHtcclxuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eTWF0dGVyLi8sICcnKTtcclxuICAgICAgICByZXR1cm4gQ29tbW9uLmNoYWluUGF0aEJlZm9yZShNYXR0ZXIsIHBhdGgsIGZ1bmMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYWlucyBhIGZ1bmN0aW9uIHRvIGV4Y3V0ZSBhZnRlciB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIGdpdmVuIGBwYXRoYCByZWxhdGl2ZSB0byBgTWF0dGVyYC5cclxuICAgICAqIFNlZSBhbHNvIGRvY3MgZm9yIGBDb21tb24uY2hhaW5gLlxyXG4gICAgICogQG1ldGhvZCBhZnRlclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggcmVsYXRpdmUgdG8gYE1hdHRlcmBcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoYWluIGFmdGVyIHRoZSBvcmlnaW5hbFxyXG4gICAgICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBjaGFpbmVkIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZWQgdGhlIG9yaWdpbmFsXHJcbiAgICAgKi9cclxuICAgIE1hdHRlci5hZnRlciA9IGZ1bmN0aW9uKHBhdGgsIGZ1bmMpIHtcclxuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eTWF0dGVyLi8sICcnKTtcclxuICAgICAgICByZXR1cm4gQ29tbW9uLmNoYWluUGF0aEFmdGVyKE1hdHRlciwgcGF0aCwgZnVuYyk7XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLy8gQGlmIERFQlVHXHJcbi8qKlxyXG4qIF9JbnRlcm5hbCBDbGFzc18sIG5vdCBnZW5lcmFsbHkgdXNlZCBvdXRzaWRlIG9mIHRoZSBlbmdpbmUncyBpbnRlcm5hbHMuXHJcbipcclxuKi9cclxuXHJcbnZhciBNZXRyaWNzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1ldHJpY3M7XHJcblxyXG52YXIgQ29tcG9zaXRlID0gcmVxdWlyZSgnLi4vYm9keS9Db21wb3NpdGUnKTtcclxudmFyIENvbW1vbiA9IHJlcXVpcmUoJy4vQ29tbW9uJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IG1ldHJpY3MuXHJcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEByZXR1cm4ge21ldHJpY3N9IEEgbmV3IG1ldHJpY3NcclxuICAgICAqL1xyXG4gICAgTWV0cmljcy5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICBleHRlbmRlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG5hcnJvd0RldGVjdGlvbnM6IDAsXHJcbiAgICAgICAgICAgIG5hcnJvd3BoYXNlVGVzdHM6IDAsXHJcbiAgICAgICAgICAgIG5hcnJvd1JldXNlOiAwLFxyXG4gICAgICAgICAgICBuYXJyb3dSZXVzZUNvdW50OiAwLFxyXG4gICAgICAgICAgICBtaWRwaGFzZVRlc3RzOiAwLFxyXG4gICAgICAgICAgICBicm9hZHBoYXNlVGVzdHM6IDAsXHJcbiAgICAgICAgICAgIG5hcnJvd0VmZjogMC4wMDAxLFxyXG4gICAgICAgICAgICBtaWRFZmY6IDAuMDAwMSxcclxuICAgICAgICAgICAgYnJvYWRFZmY6IDAuMDAwMSxcclxuICAgICAgICAgICAgY29sbGlzaW9uczogMCxcclxuICAgICAgICAgICAgYnVja2V0czogMCxcclxuICAgICAgICAgICAgYm9kaWVzOiAwLFxyXG4gICAgICAgICAgICBwYWlyczogMFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBDb21tb24uZXh0ZW5kKGRlZmF1bHRzLCBmYWxzZSwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIG1ldHJpY3MuXHJcbiAgICAgKiBAbWV0aG9kIHJlc2V0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHBhcmFtIHttZXRyaWNzfSBtZXRyaWNzXHJcbiAgICAgKi9cclxuICAgIE1ldHJpY3MucmVzZXQgPSBmdW5jdGlvbihtZXRyaWNzKSB7XHJcbiAgICAgICAgaWYgKG1ldHJpY3MuZXh0ZW5kZWQpIHtcclxuICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dEZXRlY3Rpb25zID0gMDtcclxuICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dwaGFzZVRlc3RzID0gMDtcclxuICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dSZXVzZSA9IDA7XHJcbiAgICAgICAgICAgIG1ldHJpY3MubmFycm93UmV1c2VDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIG1ldHJpY3MubWlkcGhhc2VUZXN0cyA9IDA7XHJcbiAgICAgICAgICAgIG1ldHJpY3MuYnJvYWRwaGFzZVRlc3RzID0gMDtcclxuICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dFZmYgPSAwO1xyXG4gICAgICAgICAgICBtZXRyaWNzLm1pZEVmZiA9IDA7XHJcbiAgICAgICAgICAgIG1ldHJpY3MuYnJvYWRFZmYgPSAwO1xyXG4gICAgICAgICAgICBtZXRyaWNzLmNvbGxpc2lvbnMgPSAwO1xyXG4gICAgICAgICAgICBtZXRyaWNzLmJ1Y2tldHMgPSAwO1xyXG4gICAgICAgICAgICBtZXRyaWNzLnBhaXJzID0gMDtcclxuICAgICAgICAgICAgbWV0cmljcy5ib2RpZXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIG1ldHJpY3MuXHJcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7bWV0cmljc30gbWV0cmljc1xyXG4gICAgICogQHBhcmFtIHtlbmdpbmV9IGVuZ2luZVxyXG4gICAgICovXHJcbiAgICBNZXRyaWNzLnVwZGF0ZSA9IGZ1bmN0aW9uKG1ldHJpY3MsIGVuZ2luZSkge1xyXG4gICAgICAgIGlmIChtZXRyaWNzLmV4dGVuZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciB3b3JsZCA9IGVuZ2luZS53b3JsZCxcclxuICAgICAgICAgICAgICAgIGJvZGllcyA9IENvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpO1xyXG5cclxuICAgICAgICAgICAgbWV0cmljcy5jb2xsaXNpb25zID0gbWV0cmljcy5uYXJyb3dEZXRlY3Rpb25zO1xyXG4gICAgICAgICAgICBtZXRyaWNzLnBhaXJzID0gZW5naW5lLnBhaXJzLmxpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICBtZXRyaWNzLmJvZGllcyA9IGJvZGllcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIG1ldHJpY3MubWlkRWZmID0gKG1ldHJpY3MubmFycm93RGV0ZWN0aW9ucyAvIChtZXRyaWNzLm1pZHBoYXNlVGVzdHMgfHwgMSkpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgIG1ldHJpY3MubmFycm93RWZmID0gKG1ldHJpY3MubmFycm93RGV0ZWN0aW9ucyAvIChtZXRyaWNzLm5hcnJvd3BoYXNlVGVzdHMgfHwgMSkpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgIG1ldHJpY3MuYnJvYWRFZmYgPSAoMSAtIChtZXRyaWNzLmJyb2FkcGhhc2VUZXN0cyAvIChib2RpZXMubGVuZ3RoIHx8IDEpKSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgbWV0cmljcy5uYXJyb3dSZXVzZSA9IChtZXRyaWNzLm5hcnJvd1JldXNlQ291bnQgLyAobWV0cmljcy5uYXJyb3dwaGFzZVRlc3RzIHx8IDEpKS50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICAvL3ZhciBicm9hZHBoYXNlID0gZW5naW5lLmJyb2FkcGhhc2VbZW5naW5lLmJyb2FkcGhhc2UuY3VycmVudF07XHJcbiAgICAgICAgICAgIC8vaWYgKGJyb2FkcGhhc2UuaW5zdGFuY2UpXHJcbiAgICAgICAgICAgIC8vICAgIG1ldHJpY3MuYnVja2V0cyA9IENvbW1vbi5rZXlzKGJyb2FkcGhhc2UuaW5zdGFuY2UuYnVja2V0cykubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpO1xyXG4vLyBAZW5kaWZcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuUGx1Z2luYCBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciByZWdpc3RlcmluZyBhbmQgaW5zdGFsbGluZyBwbHVnaW5zIG9uIG1vZHVsZXMuXHJcbipcclxuKiBAY2xhc3MgUGx1Z2luXHJcbiovXHJcblxyXG52YXIgUGx1Z2luID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBsdWdpbjtcclxuXHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuL0NvbW1vbicpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIFBsdWdpbi5fcmVnaXN0cnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIHBsdWdpbiBvYmplY3Qgc28gaXQgY2FuIGJlIHJlc29sdmVkIGxhdGVyIGJ5IG5hbWUuXHJcbiAgICAgKiBAbWV0aG9kIHJlZ2lzdGVyXHJcbiAgICAgKiBAcGFyYW0gcGx1Z2luIHt9IFRoZSBwbHVnaW4gdG8gcmVnaXN0ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBwbHVnaW4uXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi5yZWdpc3RlciA9IGZ1bmN0aW9uKHBsdWdpbikge1xyXG4gICAgICAgIGlmICghUGx1Z2luLmlzUGx1Z2luKHBsdWdpbikpIHtcclxuICAgICAgICAgICAgQ29tbW9uLndhcm4oJ1BsdWdpbi5yZWdpc3RlcjonLCBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSwgJ2RvZXMgbm90IGltcGxlbWVudCBhbGwgcmVxdWlyZWQgZmllbGRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBsdWdpbi5uYW1lIGluIFBsdWdpbi5fcmVnaXN0cnkpIHtcclxuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWQgPSBQbHVnaW4uX3JlZ2lzdHJ5W3BsdWdpbi5uYW1lXSxcclxuICAgICAgICAgICAgICAgIHBsdWdpblZlcnNpb24gPSBQbHVnaW4udmVyc2lvblBhcnNlKHBsdWdpbi52ZXJzaW9uKS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICByZWdpc3RlcmVkVmVyc2lvbiA9IFBsdWdpbi52ZXJzaW9uUGFyc2UocmVnaXN0ZXJlZC52ZXJzaW9uKS5udW1iZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAocGx1Z2luVmVyc2lvbiA+IHJlZ2lzdGVyZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnJlZ2lzdGVyOicsIFBsdWdpbi50b1N0cmluZyhyZWdpc3RlcmVkKSwgJ3dhcyB1cGdyYWRlZCB0bycsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pKTtcclxuICAgICAgICAgICAgICAgIFBsdWdpbi5fcmVnaXN0cnlbcGx1Z2luLm5hbWVdID0gcGx1Z2luO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsdWdpblZlcnNpb24gPCByZWdpc3RlcmVkVmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oJ1BsdWdpbi5yZWdpc3RlcjonLCBQbHVnaW4udG9TdHJpbmcocmVnaXN0ZXJlZCksICdjYW4gbm90IGJlIGRvd25ncmFkZWQgdG8nLCBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luICE9PSByZWdpc3RlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnJlZ2lzdGVyOicsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pLCAnaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIGRpZmZlcmVudCBwbHVnaW4gb2JqZWN0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBQbHVnaW4uX3JlZ2lzdHJ5W3BsdWdpbi5uYW1lXSA9IHBsdWdpbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwbHVnaW47XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb2x2ZXMgYSBkZXBlbmRlbmN5IHRvIGEgcGx1Z2luIG9iamVjdCBmcm9tIHRoZSByZWdpc3RyeSBpZiBpdCBleGlzdHMuIFxyXG4gICAgICogVGhlIGBkZXBlbmRlbmN5YCBtYXkgY29udGFpbiBhIHZlcnNpb24sIGJ1dCBvbmx5IHRoZSBuYW1lIG1hdHRlcnMgd2hlbiByZXNvbHZpbmcuXHJcbiAgICAgKiBAbWV0aG9kIHJlc29sdmVcclxuICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5IHtzdHJpbmd9IFRoZSBkZXBlbmRlbmN5LlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcGx1Z2luIGlmIHJlc29sdmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi5yZXNvbHZlID0gZnVuY3Rpb24oZGVwZW5kZW5jeSkge1xyXG4gICAgICAgIHJldHVybiBQbHVnaW4uX3JlZ2lzdHJ5W1BsdWdpbi5kZXBlbmRlbmN5UGFyc2UoZGVwZW5kZW5jeSkubmFtZV07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXR0eSBwcmludGVkIHBsdWdpbiBuYW1lIGFuZCB2ZXJzaW9uLlxyXG4gICAgICogQG1ldGhvZCB0b1N0cmluZ1xyXG4gICAgICogQHBhcmFtIHBsdWdpbiB7fSBUaGUgcGx1Z2luLlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBQcmV0dHkgcHJpbnRlZCBwbHVnaW4gbmFtZSBhbmQgdmVyc2lvbi5cclxuICAgICAqL1xyXG4gICAgUGx1Z2luLnRvU3RyaW5nID0gZnVuY3Rpb24ocGx1Z2luKSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBwbHVnaW4gPT09ICdzdHJpbmcnID8gcGx1Z2luIDogKHBsdWdpbi5uYW1lIHx8ICdhbm9ueW1vdXMnKSArICdAJyArIChwbHVnaW4udmVyc2lvbiB8fCBwbHVnaW4ucmFuZ2UgfHwgJzAuMC4wJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBtZWV0cyB0aGUgbWluaW11bSBzdGFuZGFyZCB0byBiZSBjb25zaWRlcmVkIGEgcGx1Z2luLlxyXG4gICAgICogVGhpcyBtZWFucyBpdCBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcbiAgICAgKiAtIGBuYW1lYFxyXG4gICAgICogLSBgdmVyc2lvbmBcclxuICAgICAqIC0gYGluc3RhbGxgXHJcbiAgICAgKiBAbWV0aG9kIGlzUGx1Z2luXHJcbiAgICAgKiBAcGFyYW0gb2JqIHt9IFRoZSBvYmogdG8gdGVzdC5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGNhbiBiZSBjb25zaWRlcmVkIGEgcGx1Z2luIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBQbHVnaW4uaXNQbHVnaW4gPSBmdW5jdGlvbihvYmopIHtcclxuICAgICAgICByZXR1cm4gb2JqICYmIG9iai5uYW1lICYmIG9iai52ZXJzaW9uICYmIG9iai5pbnN0YWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGEgcGx1Z2luIHdpdGggdGhlIGdpdmVuIGBuYW1lYCBiZWVuIGluc3RhbGxlZCBvbiBgbW9kdWxlYC5cclxuICAgICAqIEBtZXRob2QgaXNVc2VkXHJcbiAgICAgKiBAcGFyYW0gbW9kdWxlIHt9IFRoZSBtb2R1bGUuXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB7c3RyaW5nfSBUaGUgcGx1Z2luIG5hbWUuXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgYSBwbHVnaW4gd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgIGJlZW4gaW5zdGFsbGVkIG9uIGBtb2R1bGVgLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgUGx1Z2luLmlzVXNlZCA9IGZ1bmN0aW9uKG1vZHVsZSwgbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtb2R1bGUudXNlZC5pbmRleE9mKG5hbWUpID4gLTE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYHBsdWdpbi5mb3JgIGlzIGFwcGxpY2FibGUgdG8gYG1vZHVsZWAgYnkgY29tcGFyaW5nIGFnYWluc3QgYG1vZHVsZS5uYW1lYCBhbmQgYG1vZHVsZS52ZXJzaW9uYC5cclxuICAgICAqIElmIGBwbHVnaW4uZm9yYCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSBhcHBsaWNhYmxlLlxyXG4gICAgICogVGhlIHZhbHVlIG9mIGBwbHVnaW4uZm9yYCBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybWF0IGAnbW9kdWxlLW5hbWUnYCBvciBgJ21vZHVsZS1uYW1lQHZlcnNpb24nYC5cclxuICAgICAqIEBtZXRob2QgaXNGb3JcclxuICAgICAqIEBwYXJhbSBwbHVnaW4ge30gVGhlIHBsdWdpbi5cclxuICAgICAqIEBwYXJhbSBtb2R1bGUge30gVGhlIG1vZHVsZS5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBgcGx1Z2luLmZvcmAgaXMgYXBwbGljYWJsZSB0byBgbW9kdWxlYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi5pc0ZvciA9IGZ1bmN0aW9uKHBsdWdpbiwgbW9kdWxlKSB7XHJcbiAgICAgICAgdmFyIHBhcnNlZCA9IHBsdWdpbi5mb3IgJiYgUGx1Z2luLmRlcGVuZGVuY3lQYXJzZShwbHVnaW4uZm9yKTtcclxuICAgICAgICByZXR1cm4gIXBsdWdpbi5mb3IgfHwgKG1vZHVsZS5uYW1lID09PSBwYXJzZWQubmFtZSAmJiBQbHVnaW4udmVyc2lvblNhdGlzZmllcyhtb2R1bGUudmVyc2lvbiwgcGFyc2VkLnJhbmdlKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFsbHMgdGhlIHBsdWdpbnMgYnkgY2FsbGluZyBgcGx1Z2luLmluc3RhbGxgIG9uIGVhY2ggcGx1Z2luIHNwZWNpZmllZCBpbiBgcGx1Z2luc2AgaWYgcGFzc2VkLCBvdGhlcndpc2UgYG1vZHVsZS51c2VzYC5cclxuICAgICAqIEZvciBpbnN0YWxsaW5nIHBsdWdpbnMgb24gYE1hdHRlcmAgc2VlIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbiBgTWF0dGVyLnVzZWAuXHJcbiAgICAgKiBQbHVnaW5zIG1heSBiZSBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZWlyIG5hbWUgb3IgYSByZWZlcmVuY2UgdG8gdGhlIHBsdWdpbiBvYmplY3QuXHJcbiAgICAgKiBQbHVnaW5zIHRoZW1zZWx2ZXMgbWF5IHNwZWNpZnkgZnVydGhlciBkZXBlbmRlbmNpZXMsIGJ1dCBlYWNoIHBsdWdpbiBpcyBpbnN0YWxsZWQgb25seSBvbmNlLlxyXG4gICAgICogT3JkZXIgaXMgaW1wb3J0YW50LCBhIHRvcG9sb2dpY2FsIHNvcnQgaXMgcGVyZm9ybWVkIHRvIGZpbmQgdGhlIGJlc3QgcmVzdWx0aW5nIG9yZGVyIG9mIGluc3RhbGxhdGlvbi5cclxuICAgICAqIFRoaXMgc29ydGluZyBhdHRlbXB0cyB0byBzYXRpc2Z5IGV2ZXJ5IGRlcGVuZGVuY3kncyByZXF1ZXN0ZWQgb3JkZXJpbmcsIGJ1dCBtYXkgbm90IGJlIGV4YWN0IGluIGFsbCBjYXNlcy5cclxuICAgICAqIFRoaXMgZnVuY3Rpb24gbG9ncyB0aGUgcmVzdWx0aW5nIHN0YXR1cyBvZiBlYWNoIGRlcGVuZGVuY3kgaW4gdGhlIGNvbnNvbGUsIGFsb25nIHdpdGggYW55IHdhcm5pbmdzLlxyXG4gICAgICogLSBBIGdyZWVuIHRpY2sg4pyFIGluZGljYXRlcyBhIGRlcGVuZGVuY3kgd2FzIHJlc29sdmVkIGFuZCBpbnN0YWxsZWQuXHJcbiAgICAgKiAtIEFuIG9yYW5nZSBkaWFtb25kIPCflLYgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSB3YXMgcmVzb2x2ZWQgYnV0IGEgd2FybmluZyB3YXMgdGhyb3duIGZvciBpdCBvciBvbmUgaWYgaXRzIGRlcGVuZGVuY2llcy5cclxuICAgICAqIC0gQSByZWQgY3Jvc3Mg4p2MIGluZGljYXRlcyBhIGRlcGVuZGVuY3kgY291bGQgbm90IGJlIHJlc29sdmVkLlxyXG4gICAgICogQXZvaWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIG1vZHVsZSB1bmxlc3MgeW91IGludGVuZCB0byBtYW51YWxseSBjb250cm9sIGluc3RhbGxhdGlvbiBvcmRlci5cclxuICAgICAqIEBtZXRob2QgdXNlXHJcbiAgICAgKiBAcGFyYW0gbW9kdWxlIHt9IFRoZSBtb2R1bGUgaW5zdGFsbCBwbHVnaW5zIG9uLlxyXG4gICAgICogQHBhcmFtIFtwbHVnaW5zPW1vZHVsZS51c2VzXSB7fSBUaGUgcGx1Z2lucyB0byBpbnN0YWxsIG9uIG1vZHVsZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIGBtb2R1bGUudXNlc2ApLlxyXG4gICAgICovXHJcbiAgICBQbHVnaW4udXNlID0gZnVuY3Rpb24obW9kdWxlLCBwbHVnaW5zKSB7XHJcbiAgICAgICAgbW9kdWxlLnVzZXMgPSAobW9kdWxlLnVzZXMgfHwgW10pLmNvbmNhdChwbHVnaW5zIHx8IFtdKTtcclxuXHJcbiAgICAgICAgaWYgKG1vZHVsZS51c2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnVzZTonLCBQbHVnaW4udG9TdHJpbmcobW9kdWxlKSwgJ2RvZXMgbm90IHNwZWNpZnkgYW55IGRlcGVuZGVuY2llcyB0byBpbnN0YWxsLicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGVwZW5kZW5jaWVzID0gUGx1Z2luLmRlcGVuZGVuY2llcyhtb2R1bGUpLFxyXG4gICAgICAgICAgICBzb3J0ZWREZXBlbmRlbmNpZXMgPSBDb21tb24udG9wb2xvZ2ljYWxTb3J0KGRlcGVuZGVuY2llcyksXHJcbiAgICAgICAgICAgIHN0YXR1cyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICBpZiAoc29ydGVkRGVwZW5kZW5jaWVzW2ldID09PSBtb2R1bGUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBwbHVnaW4gPSBQbHVnaW4ucmVzb2x2ZShzb3J0ZWREZXBlbmRlbmNpZXNbaV0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1cy5wdXNoKCfinYwgJyArIHNvcnRlZERlcGVuZGVuY2llc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFBsdWdpbi5pc1VzZWQobW9kdWxlLCBwbHVnaW4ubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVBsdWdpbi5pc0ZvcihwbHVnaW4sIG1vZHVsZSkpIHtcclxuICAgICAgICAgICAgICAgIENvbW1vbi53YXJuKCdQbHVnaW4udXNlOicsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pLCAnaXMgZm9yJywgcGx1Z2luLmZvciwgJ2J1dCBpbnN0YWxsZWQgb24nLCBQbHVnaW4udG9TdHJpbmcobW9kdWxlKSArICcuJyk7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uX3dhcm5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwbHVnaW4uaW5zdGFsbCkge1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luLmluc3RhbGwobW9kdWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIENvbW1vbi53YXJuKCdQbHVnaW4udXNlOicsIFBsdWdpbi50b1N0cmluZyhwbHVnaW4pLCAnZG9lcyBub3Qgc3BlY2lmeSBhbiBpbnN0YWxsIGZ1bmN0aW9uLicpO1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luLl93YXJuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGx1Z2luLl93YXJuZWQpIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1cy5wdXNoKCfwn5S2ICcgKyBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgcGx1Z2luLl93YXJuZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXMucHVzaCgn4pyFICcgKyBQbHVnaW4udG9TdHJpbmcocGx1Z2luKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG1vZHVsZS51c2VkLnB1c2gocGx1Z2luLm5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cy5sZW5ndGggPiAwICYmICFwbHVnaW4uc2lsZW50KSB7XHJcbiAgICAgICAgICAgIENvbW1vbi5pbmZvKHN0YXR1cy5qb2luKCcgICcpKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgZmluZHMgYWxsIG9mIGEgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzIGFuZCByZXR1cm5zIGEgZmxhdCBkZXBlbmRlbmN5IGdyYXBoLlxyXG4gICAgICogQG1ldGhvZCBkZXBlbmRlbmNpZXNcclxuICAgICAqIEBwYXJhbSBtb2R1bGUge30gVGhlIG1vZHVsZS5cclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gQSBkZXBlbmRlbmN5IGdyYXBoLlxyXG4gICAgICovXHJcbiAgICBQbHVnaW4uZGVwZW5kZW5jaWVzID0gZnVuY3Rpb24obW9kdWxlLCB0cmFja2VkKSB7XHJcbiAgICAgICAgdmFyIHBhcnNlZEJhc2UgPSBQbHVnaW4uZGVwZW5kZW5jeVBhcnNlKG1vZHVsZSksXHJcbiAgICAgICAgICAgIG5hbWUgPSBwYXJzZWRCYXNlLm5hbWU7XHJcblxyXG4gICAgICAgIHRyYWNrZWQgPSB0cmFja2VkIHx8IHt9O1xyXG5cclxuICAgICAgICBpZiAobmFtZSBpbiB0cmFja2VkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1vZHVsZSA9IFBsdWdpbi5yZXNvbHZlKG1vZHVsZSkgfHwgbW9kdWxlO1xyXG5cclxuICAgICAgICB0cmFja2VkW25hbWVdID0gQ29tbW9uLm1hcChtb2R1bGUudXNlcyB8fCBbXSwgZnVuY3Rpb24oZGVwZW5kZW5jeSkge1xyXG4gICAgICAgICAgICBpZiAoUGx1Z2luLmlzUGx1Z2luKGRlcGVuZGVuY3kpKSB7XHJcbiAgICAgICAgICAgICAgICBQbHVnaW4ucmVnaXN0ZXIoZGVwZW5kZW5jeSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSBQbHVnaW4uZGVwZW5kZW5jeVBhcnNlKGRlcGVuZGVuY3kpLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBQbHVnaW4ucmVzb2x2ZShkZXBlbmRlbmN5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCAmJiAhUGx1Z2luLnZlcnNpb25TYXRpc2ZpZXMocmVzb2x2ZWQudmVyc2lvbiwgcGFyc2VkLnJhbmdlKSkge1xyXG4gICAgICAgICAgICAgICAgQ29tbW9uLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgJ1BsdWdpbi5kZXBlbmRlbmNpZXM6JywgUGx1Z2luLnRvU3RyaW5nKHJlc29sdmVkKSwgJ2RvZXMgbm90IHNhdGlzZnknLFxyXG4gICAgICAgICAgICAgICAgICAgIFBsdWdpbi50b1N0cmluZyhwYXJzZWQpLCAndXNlZCBieScsIFBsdWdpbi50b1N0cmluZyhwYXJzZWRCYXNlKSArICcuJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZC5fd2FybmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fd2FybmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzb2x2ZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbW1vbi53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgICdQbHVnaW4uZGVwZW5kZW5jaWVzOicsIFBsdWdpbi50b1N0cmluZyhkZXBlbmRlbmN5KSwgJ3VzZWQgYnknLFxyXG4gICAgICAgICAgICAgICAgICAgIFBsdWdpbi50b1N0cmluZyhwYXJzZWRCYXNlKSwgJ2NvdWxkIG5vdCBiZSByZXNvbHZlZC4nXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fd2FybmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZC5uYW1lO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNrZWRbbmFtZV0ubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgUGx1Z2luLmRlcGVuZGVuY2llcyh0cmFja2VkW25hbWVdW2ldLCB0cmFja2VkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cmFja2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIGRlcGVuZGVuY3kgc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHMuXHJcbiAgICAgKiBUaGUgYGRlcGVuZGVuY3lgIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdtb2R1bGUtbmFtZSdgIG9yIGAnbW9kdWxlLW5hbWVAdmVyc2lvbidgLlxyXG4gICAgICogU2VlIGRvY3VtZW50YXRpb24gZm9yIGBQbHVnaW4udmVyc2lvblBhcnNlYCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0LlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBoYW5kbGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGFscmVhZHkgcmVzb2x2ZWQgKGUuZy4gYSBtb2R1bGUgb2JqZWN0KS5cclxuICAgICAqIEBtZXRob2QgZGVwZW5kZW5jeVBhcnNlXHJcbiAgICAgKiBAcGFyYW0gZGVwZW5kZW5jeSB7c3RyaW5nfSBUaGUgZGVwZW5kZW5jeSBvZiB0aGUgZm9ybWF0IGAnbW9kdWxlLW5hbWUnYCBvciBgJ21vZHVsZS1uYW1lQHZlcnNpb24nYC5cclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIGRlcGVuZGVuY3kgcGFyc2VkIGludG8gaXRzIGNvbXBvbmVudHMuXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi5kZXBlbmRlbmN5UGFyc2UgPSBmdW5jdGlvbihkZXBlbmRlbmN5KSB7XHJcbiAgICAgICAgaWYgKENvbW1vbi5pc1N0cmluZyhkZXBlbmRlbmN5KSkge1xyXG4gICAgICAgICAgICB2YXIgcGF0dGVybiA9IC9eW1xcdy1dKyhAKFxcKnxbXFxefl0/XFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16LV0rKT8pKT8kLztcclxuXHJcbiAgICAgICAgICAgIGlmICghcGF0dGVybi50ZXN0KGRlcGVuZGVuY3kpKSB7XHJcbiAgICAgICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLmRlcGVuZGVuY3lQYXJzZTonLCBkZXBlbmRlbmN5LCAnaXMgbm90IGEgdmFsaWQgZGVwZW5kZW5jeSBzdHJpbmcuJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBkZXBlbmRlbmN5LnNwbGl0KCdAJylbMF0sXHJcbiAgICAgICAgICAgICAgICByYW5nZTogZGVwZW5kZW5jeS5zcGxpdCgnQCcpWzFdIHx8ICcqJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmFtZTogZGVwZW5kZW5jeS5uYW1lLFxyXG4gICAgICAgICAgICByYW5nZTogZGVwZW5kZW5jeS5yYW5nZSB8fCBkZXBlbmRlbmN5LnZlcnNpb25cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIHZlcnNpb24gc3RyaW5nIGludG8gaXRzIGNvbXBvbmVudHMuICBcclxuICAgICAqIFZlcnNpb25zIGFyZSBzdHJpY3RseSBvZiB0aGUgZm9ybWF0IGB4LnkuemAgKGFzIGluIFtzZW12ZXJdKGh0dHA6Ly9zZW12ZXIub3JnLykpLlxyXG4gICAgICogVmVyc2lvbnMgbWF5IG9wdGlvbmFsbHkgaGF2ZSBhIHByZXJlbGVhc2UgdGFnIGluIHRoZSBmb3JtYXQgYHgueS56LWFscGhhYC5cclxuICAgICAqIFJhbmdlcyBhcmUgYSBzdHJpY3Qgc3Vic2V0IG9mIFtucG0gcmFuZ2VzXShodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2VtdmVyI2FkdmFuY2VkLXJhbmdlLXN5bnRheCkuXHJcbiAgICAgKiBPbmx5IHRoZSBmb2xsb3dpbmcgcmFuZ2UgdHlwZXMgYXJlIHN1cHBvcnRlZDpcclxuICAgICAqIC0gVGlsZGUgcmFuZ2VzIGUuZy4gYH4xLjIuM2BcclxuICAgICAqIC0gQ2FyZXQgcmFuZ2VzIGUuZy4gYF4xLjIuM2BcclxuICAgICAqIC0gRXhhY3QgdmVyc2lvbiBlLmcuIGAxLjIuM2BcclxuICAgICAqIC0gQW55IHZlcnNpb24gYCpgXHJcbiAgICAgKiBAbWV0aG9kIHZlcnNpb25QYXJzZVxyXG4gICAgICogQHBhcmFtIHJhbmdlIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZy5cclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHZlcnNpb24gcmFuZ2UgcGFyc2VkIGludG8gaXRzIGNvbXBvbmVudHMuXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi52ZXJzaW9uUGFyc2UgPSBmdW5jdGlvbihyYW5nZSkge1xyXG4gICAgICAgIHZhciBwYXR0ZXJuID0gL15cXCp8W1xcXn5dP1xcZCtcXC5cXGQrXFwuXFxkKygtWzAtOUEtWmEtei1dKyk/JC87XHJcblxyXG4gICAgICAgIGlmICghcGF0dGVybi50ZXN0KHJhbmdlKSkge1xyXG4gICAgICAgICAgICBDb21tb24ud2FybignUGx1Z2luLnZlcnNpb25QYXJzZTonLCByYW5nZSwgJ2lzIG5vdCBhIHZhbGlkIHZlcnNpb24gb3IgcmFuZ2UuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaWRlbnRpZmllcnMgPSByYW5nZS5zcGxpdCgnLScpO1xyXG4gICAgICAgIHJhbmdlID0gaWRlbnRpZmllcnNbMF07XHJcblxyXG4gICAgICAgIHZhciBpc1JhbmdlID0gaXNOYU4oTnVtYmVyKHJhbmdlWzBdKSksXHJcbiAgICAgICAgICAgIHZlcnNpb24gPSBpc1JhbmdlID8gcmFuZ2Uuc3Vic3RyKDEpIDogcmFuZ2UsXHJcbiAgICAgICAgICAgIHBhcnRzID0gQ29tbW9uLm1hcCh2ZXJzaW9uLnNwbGl0KCcuJyksIGZ1bmN0aW9uKHBhcnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIocGFydCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpc1JhbmdlOiBpc1JhbmdlLFxyXG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxyXG4gICAgICAgICAgICByYW5nZTogcmFuZ2UsXHJcbiAgICAgICAgICAgIG9wZXJhdG9yOiBpc1JhbmdlID8gcmFuZ2VbMF0gOiAnJyxcclxuICAgICAgICAgICAgcGFydHM6IHBhcnRzLFxyXG4gICAgICAgICAgICBwcmVyZWxlYXNlOiBpZGVudGlmaWVyc1sxXSxcclxuICAgICAgICAgICAgbnVtYmVyOiBwYXJ0c1swXSAqIDFlOCArIHBhcnRzWzFdICogMWU0ICsgcGFydHNbMl1cclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgdGhlIGdpdmVuIGByYW5nZWAuXHJcbiAgICAgKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYFBsdWdpbi52ZXJzaW9uUGFyc2VgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuXHJcbiAgICAgKiBJZiBhIHZlcnNpb24gb3IgcmFuZ2UgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBhbnkgdmVyc2lvbiAoYCpgKSBpcyBhc3N1bWVkIHRvIHNhdGlzZnkuXHJcbiAgICAgKiBAbWV0aG9kIHZlcnNpb25TYXRpc2ZpZXNcclxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSByYW5nZSB7c3RyaW5nfSBUaGUgcmFuZ2Ugc3RyaW5nLlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgYHJhbmdlYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIFBsdWdpbi52ZXJzaW9uU2F0aXNmaWVzID0gZnVuY3Rpb24odmVyc2lvbiwgcmFuZ2UpIHtcclxuICAgICAgICByYW5nZSA9IHJhbmdlIHx8ICcqJztcclxuXHJcbiAgICAgICAgdmFyIHJhbmdlUGFyc2VkID0gUGx1Z2luLnZlcnNpb25QYXJzZShyYW5nZSksXHJcbiAgICAgICAgICAgIHJhbmdlUGFydHMgPSByYW5nZVBhcnNlZC5wYXJ0cyxcclxuICAgICAgICAgICAgdmVyc2lvblBhcnNlZCA9IFBsdWdpbi52ZXJzaW9uUGFyc2UodmVyc2lvbiksXHJcbiAgICAgICAgICAgIHZlcnNpb25QYXJ0cyA9IHZlcnNpb25QYXJzZWQucGFydHM7XHJcblxyXG4gICAgICAgIGlmIChyYW5nZVBhcnNlZC5pc1JhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmIChyYW5nZVBhcnNlZC5vcGVyYXRvciA9PT0gJyonIHx8IHZlcnNpb24gPT09ICcqJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyYW5nZVBhcnNlZC5vcGVyYXRvciA9PT0gJ34nKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvblBhcnRzWzBdID09PSByYW5nZVBhcnRzWzBdICYmIHZlcnNpb25QYXJ0c1sxXSA9PT0gcmFuZ2VQYXJ0c1sxXSAmJiB2ZXJzaW9uUGFydHNbMl0gPj0gcmFuZ2VQYXJ0c1syXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlUGFyc2VkLm9wZXJhdG9yID09PSAnXicpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZVBhcnRzWzBdID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uUGFydHNbMF0gPT09IHJhbmdlUGFydHNbMF0gJiYgdmVyc2lvblBhcnNlZC5udW1iZXIgPj0gcmFuZ2VQYXJzZWQubnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZVBhcnRzWzFdID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uUGFydHNbMV0gPT09IHJhbmdlUGFydHNbMV0gJiYgdmVyc2lvblBhcnRzWzJdID49IHJhbmdlUGFydHNbMl07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25QYXJ0c1syXSA9PT0gcmFuZ2VQYXJ0c1syXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZlcnNpb24gPT09IHJhbmdlIHx8IHZlcnNpb24gPT09ICcqJztcclxuICAgIH07XHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5TbGVlcGluZ2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgdG8gbWFuYWdlIHRoZSBzbGVlcGluZyBzdGF0ZSBvZiBib2RpZXMuXHJcbipcclxuKiBAY2xhc3MgU2xlZXBpbmdcclxuKi9cclxuXHJcbnZhciBTbGVlcGluZyA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTbGVlcGluZztcclxuXHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL0V2ZW50cycpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIFNsZWVwaW5nLl9tb3Rpb25XYWtlVGhyZXNob2xkID0gMC4xODtcclxuICAgIFNsZWVwaW5nLl9tb3Rpb25TbGVlcFRocmVzaG9sZCA9IDAuMDg7XHJcbiAgICBTbGVlcGluZy5fbWluQmlhcyA9IDAuOTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgYm9kaWVzIHRvIHNsZWVwIG9yIHdha2VzIHRoZW0gdXAgZGVwZW5kaW5nIG9uIHRoZWlyIG1vdGlvbi5cclxuICAgICAqIEBtZXRob2QgdXBkYXRlXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlbXX0gYm9kaWVzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZVNjYWxlXHJcbiAgICAgKi9cclxuICAgIFNsZWVwaW5nLnVwZGF0ZSA9IGZ1bmN0aW9uKGJvZGllcywgdGltZVNjYWxlKSB7XHJcbiAgICAgICAgdmFyIHRpbWVGYWN0b3IgPSB0aW1lU2NhbGUgKiB0aW1lU2NhbGUgKiB0aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIC8vIHVwZGF0ZSBib2RpZXMgc2xlZXBpbmcgc3RhdHVzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJvZHkgPSBib2RpZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBtb3Rpb24gPSBib2R5LnNwZWVkICogYm9keS5zcGVlZCArIGJvZHkuYW5ndWxhclNwZWVkICogYm9keS5hbmd1bGFyU3BlZWQ7XHJcblxyXG4gICAgICAgICAgICAvLyB3YWtlIHVwIGJvZGllcyBpZiB0aGV5IGhhdmUgYSBmb3JjZSBhcHBsaWVkXHJcbiAgICAgICAgICAgIGlmIChib2R5LmZvcmNlLnggIT09IDAgfHwgYm9keS5mb3JjZS55ICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoYm9keSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBtaW5Nb3Rpb24gPSBNYXRoLm1pbihib2R5Lm1vdGlvbiwgbW90aW9uKSxcclxuICAgICAgICAgICAgICAgIG1heE1vdGlvbiA9IE1hdGgubWF4KGJvZHkubW90aW9uLCBtb3Rpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAvLyBiaWFzZWQgYXZlcmFnZSBtb3Rpb24gZXN0aW1hdGlvbiBiZXR3ZWVuIGZyYW1lc1xyXG4gICAgICAgICAgICBib2R5Lm1vdGlvbiA9IFNsZWVwaW5nLl9taW5CaWFzICogbWluTW90aW9uICsgKDEgLSBTbGVlcGluZy5fbWluQmlhcykgKiBtYXhNb3Rpb247XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYm9keS5zbGVlcFRocmVzaG9sZCA+IDAgJiYgYm9keS5tb3Rpb24gPCBTbGVlcGluZy5fbW90aW9uU2xlZXBUaHJlc2hvbGQgKiB0aW1lRmFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5LnNsZWVwQ291bnRlciArPSAxO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keS5zbGVlcENvdW50ZXIgPj0gYm9keS5zbGVlcFRocmVzaG9sZClcclxuICAgICAgICAgICAgICAgICAgICBTbGVlcGluZy5zZXQoYm9keSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keS5zbGVlcENvdW50ZXIgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5LnNsZWVwQ291bnRlciAtPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgc2V0IG9mIGNvbGxpZGluZyBwYWlycywgd2FrZXMgdGhlIHNsZWVwaW5nIGJvZGllcyBpbnZvbHZlZC5cclxuICAgICAqIEBtZXRob2QgYWZ0ZXJDb2xsaXNpb25zXHJcbiAgICAgKiBAcGFyYW0ge3BhaXJbXX0gcGFpcnNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGVcclxuICAgICAqL1xyXG4gICAgU2xlZXBpbmcuYWZ0ZXJDb2xsaXNpb25zID0gZnVuY3Rpb24ocGFpcnMsIHRpbWVTY2FsZSkge1xyXG4gICAgICAgIHZhciB0aW1lRmFjdG9yID0gdGltZVNjYWxlICogdGltZVNjYWxlICogdGltZVNjYWxlO1xyXG5cclxuICAgICAgICAvLyB3YWtlIHVwIGJvZGllcyBpbnZvbHZlZCBpbiBjb2xsaXNpb25zXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gZG9uJ3Qgd2FrZSBpbmFjdGl2ZSBwYWlyc1xyXG4gICAgICAgICAgICBpZiAoIXBhaXIuaXNBY3RpdmUpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIHZhciBjb2xsaXNpb24gPSBwYWlyLmNvbGxpc2lvbixcclxuICAgICAgICAgICAgICAgIGJvZHlBID0gY29sbGlzaW9uLmJvZHlBLnBhcmVudCwgXHJcbiAgICAgICAgICAgICAgICBib2R5QiA9IGNvbGxpc2lvbi5ib2R5Qi5wYXJlbnQ7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIGRvbid0IHdha2UgaWYgYXQgbGVhc3Qgb25lIGJvZHkgaXMgc3RhdGljXHJcbiAgICAgICAgICAgIGlmICgoYm9keUEuaXNTbGVlcGluZyAmJiBib2R5Qi5pc1NsZWVwaW5nKSB8fCBib2R5QS5pc1N0YXRpYyB8fCBib2R5Qi5pc1N0YXRpYylcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYm9keUEuaXNTbGVlcGluZyB8fCBib2R5Qi5pc1NsZWVwaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2xlZXBpbmdCb2R5ID0gKGJvZHlBLmlzU2xlZXBpbmcgJiYgIWJvZHlBLmlzU3RhdGljKSA/IGJvZHlBIDogYm9keUIsXHJcbiAgICAgICAgICAgICAgICAgICAgbW92aW5nQm9keSA9IHNsZWVwaW5nQm9keSA9PT0gYm9keUEgPyBib2R5QiA6IGJvZHlBO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghc2xlZXBpbmdCb2R5LmlzU3RhdGljICYmIG1vdmluZ0JvZHkubW90aW9uID4gU2xlZXBpbmcuX21vdGlvbldha2VUaHJlc2hvbGQgKiB0aW1lRmFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgU2xlZXBpbmcuc2V0KHNsZWVwaW5nQm9keSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICBcclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgYm9keSBhcyBzbGVlcGluZyBvciBhd2FrZS5cclxuICAgICAqIEBtZXRob2Qgc2V0XHJcbiAgICAgKiBAcGFyYW0ge2JvZHl9IGJvZHlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTbGVlcGluZ1xyXG4gICAgICovXHJcbiAgICBTbGVlcGluZy5zZXQgPSBmdW5jdGlvbihib2R5LCBpc1NsZWVwaW5nKSB7XHJcbiAgICAgICAgdmFyIHdhc1NsZWVwaW5nID0gYm9keS5pc1NsZWVwaW5nO1xyXG5cclxuICAgICAgICBpZiAoaXNTbGVlcGluZykge1xyXG4gICAgICAgICAgICBib2R5LmlzU2xlZXBpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBib2R5LnNsZWVwQ291bnRlciA9IGJvZHkuc2xlZXBUaHJlc2hvbGQ7XHJcblxyXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uSW1wdWxzZS54ID0gMDtcclxuICAgICAgICAgICAgYm9keS5wb3NpdGlvbkltcHVsc2UueSA9IDA7XHJcblxyXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi54ID0gYm9keS5wb3NpdGlvbi54O1xyXG4gICAgICAgICAgICBib2R5LnBvc2l0aW9uUHJldi55ID0gYm9keS5wb3NpdGlvbi55O1xyXG5cclxuICAgICAgICAgICAgYm9keS5hbmdsZVByZXYgPSBib2R5LmFuZ2xlO1xyXG4gICAgICAgICAgICBib2R5LnNwZWVkID0gMDtcclxuICAgICAgICAgICAgYm9keS5hbmd1bGFyU3BlZWQgPSAwO1xyXG4gICAgICAgICAgICBib2R5Lm1vdGlvbiA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXdhc1NsZWVwaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBFdmVudHMudHJpZ2dlcihib2R5LCAnc2xlZXBTdGFydCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYm9keS5pc1NsZWVwaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJvZHkuc2xlZXBDb3VudGVyID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh3YXNTbGVlcGluZykge1xyXG4gICAgICAgICAgICAgICAgRXZlbnRzLnRyaWdnZXIoYm9keSwgJ3NsZWVwRW5kJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuQm9kaWVzYCBtb2R1bGUgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZyByaWdpZCBib2R5IG1vZGVscyBcclxuKiB3aXRoIGNvbW1vbmx5IHVzZWQgYm9keSBjb25maWd1cmF0aW9ucyAoc3VjaCBhcyByZWN0YW5nbGVzLCBjaXJjbGVzIGFuZCBvdGhlciBwb2x5Z29ucykuXHJcbipcclxuKiBTZWUgdGhlIGluY2x1ZGVkIHVzYWdlIFtleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL2xpYWJydS9tYXR0ZXItanMvdHJlZS9tYXN0ZXIvZXhhbXBsZXMpLlxyXG4qXHJcbiogQGNsYXNzIEJvZGllc1xyXG4qL1xyXG5cclxuLy8gVE9ETzogdHJ1ZSBjaXJjbGUgYm9kaWVzXHJcblxyXG52YXIgQm9kaWVzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJvZGllcztcclxuXHJcbnZhciBWZXJ0aWNlcyA9IHJlcXVpcmUoJy4uL2dlb21ldHJ5L1ZlcnRpY2VzJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG52YXIgQm9keSA9IHJlcXVpcmUoJy4uL2JvZHkvQm9keScpO1xyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBWZWN0b3IgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZWN0b3InKTtcclxudmFyIGRlY29tcCA9IHJlcXVpcmUoJy4uLy4uL3BvbHktZGVjb21wJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJpZ2lkIGJvZHkgbW9kZWwgd2l0aCBhIHJlY3RhbmdsZSBodWxsLiBcclxuICAgICAqIFRoZSBvcHRpb25zIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgYW55IHByb3BlcnRpZXMgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxyXG4gICAgICogU2VlIHRoZSBwcm9wZXJ0aWVzIHNlY3Rpb24gb2YgdGhlIGBNYXR0ZXIuQm9keWAgbW9kdWxlIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHlvdSBjYW4gcGFzcyB2aWEgdGhlIGBvcHRpb25zYCBvYmplY3QuXHJcbiAgICAgKiBAbWV0aG9kIHJlY3RhbmdsZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cclxuICAgICAqIEByZXR1cm4ge2JvZHl9IEEgbmV3IHJlY3RhbmdsZSBib2R5XHJcbiAgICAgKi9cclxuICAgIEJvZGllcy5yZWN0YW5nbGUgPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgICAgIHZhciByZWN0YW5nbGUgPSB7IFxyXG4gICAgICAgICAgICBsYWJlbDogJ1JlY3RhbmdsZSBCb2R5JyxcclxuICAgICAgICAgICAgcG9zaXRpb246IHsgeDogeCwgeTogeSB9LFxyXG4gICAgICAgICAgICB2ZXJ0aWNlczogVmVydGljZXMuZnJvbVBhdGgoJ0wgMCAwIEwgJyArIHdpZHRoICsgJyAwIEwgJyArIHdpZHRoICsgJyAnICsgaGVpZ2h0ICsgJyBMIDAgJyArIGhlaWdodClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5jaGFtZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFtZmVyID0gb3B0aW9ucy5jaGFtZmVyO1xyXG4gICAgICAgICAgICByZWN0YW5nbGUudmVydGljZXMgPSBWZXJ0aWNlcy5jaGFtZmVyKHJlY3RhbmdsZS52ZXJ0aWNlcywgY2hhbWZlci5yYWRpdXMsIFxyXG4gICAgICAgICAgICAgICAgY2hhbWZlci5xdWFsaXR5LCBjaGFtZmVyLnF1YWxpdHlNaW4sIGNoYW1mZXIucXVhbGl0eU1heCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNoYW1mZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7fSwgcmVjdGFuZ2xlLCBvcHRpb25zKSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmlnaWQgYm9keSBtb2RlbCB3aXRoIGEgdHJhcGV6b2lkIGh1bGwuIFxyXG4gICAgICogVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgcHJvcGVydGllcyB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXHJcbiAgICAgKiBTZWUgdGhlIHByb3BlcnRpZXMgc2VjdGlvbiBvZiB0aGUgYE1hdHRlci5Cb2R5YCBtb2R1bGUgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHdoYXQgeW91IGNhbiBwYXNzIHZpYSB0aGUgYG9wdGlvbnNgIG9iamVjdC5cclxuICAgICAqIEBtZXRob2QgdHJhcGV6b2lkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3BlXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5fSBBIG5ldyB0cmFwZXpvaWQgYm9keVxyXG4gICAgICovXHJcbiAgICBCb2RpZXMudHJhcGV6b2lkID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgc2xvcGUsIG9wdGlvbnMpIHtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHJcbiAgICAgICAgc2xvcGUgKj0gMC41O1xyXG4gICAgICAgIHZhciByb29mID0gKDEgLSAoc2xvcGUgKiAyKSkgKiB3aWR0aDtcclxuICAgICAgICBcclxuICAgICAgICB2YXIgeDEgPSB3aWR0aCAqIHNsb3BlLFxyXG4gICAgICAgICAgICB4MiA9IHgxICsgcm9vZixcclxuICAgICAgICAgICAgeDMgPSB4MiArIHgxLFxyXG4gICAgICAgICAgICB2ZXJ0aWNlc1BhdGg7XHJcblxyXG4gICAgICAgIGlmIChzbG9wZSA8IDAuNSkge1xyXG4gICAgICAgICAgICB2ZXJ0aWNlc1BhdGggPSAnTCAwIDAgTCAnICsgeDEgKyAnICcgKyAoLWhlaWdodCkgKyAnIEwgJyArIHgyICsgJyAnICsgKC1oZWlnaHQpICsgJyBMICcgKyB4MyArICcgMCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmVydGljZXNQYXRoID0gJ0wgMCAwIEwgJyArIHgyICsgJyAnICsgKC1oZWlnaHQpICsgJyBMICcgKyB4MyArICcgMCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdHJhcGV6b2lkID0geyBcclxuICAgICAgICAgICAgbGFiZWw6ICdUcmFwZXpvaWQgQm9keScsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IHgsIHk6IHkgfSxcclxuICAgICAgICAgICAgdmVydGljZXM6IFZlcnRpY2VzLmZyb21QYXRoKHZlcnRpY2VzUGF0aClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5jaGFtZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFtZmVyID0gb3B0aW9ucy5jaGFtZmVyO1xyXG4gICAgICAgICAgICB0cmFwZXpvaWQudmVydGljZXMgPSBWZXJ0aWNlcy5jaGFtZmVyKHRyYXBlem9pZC52ZXJ0aWNlcywgY2hhbWZlci5yYWRpdXMsIFxyXG4gICAgICAgICAgICAgICAgY2hhbWZlci5xdWFsaXR5LCBjaGFtZmVyLnF1YWxpdHlNaW4sIGNoYW1mZXIucXVhbGl0eU1heCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNoYW1mZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7fSwgdHJhcGV6b2lkLCBvcHRpb25zKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyByaWdpZCBib2R5IG1vZGVsIHdpdGggYSBjaXJjbGUgaHVsbC4gXHJcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGFueSBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cclxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIG9mIHRoZSBgTWF0dGVyLkJvZHlgIG1vZHVsZSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBjaXJjbGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1c1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFttYXhTaWRlc11cclxuICAgICAqIEByZXR1cm4ge2JvZHl9IEEgbmV3IGNpcmNsZSBib2R5XHJcbiAgICAgKi9cclxuICAgIEJvZGllcy5jaXJjbGUgPSBmdW5jdGlvbih4LCB5LCByYWRpdXMsIG9wdGlvbnMsIG1heFNpZGVzKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG4gICAgICAgIHZhciBjaXJjbGUgPSB7XHJcbiAgICAgICAgICAgIGxhYmVsOiAnQ2lyY2xlIEJvZHknLFxyXG4gICAgICAgICAgICBjaXJjbGVSYWRpdXM6IHJhZGl1c1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gYXBwcm94aW1hdGUgY2lyY2xlcyB3aXRoIHBvbHlnb25zIHVudGlsIHRydWUgY2lyY2xlcyBpbXBsZW1lbnRlZCBpbiBTQVRcclxuICAgICAgICBtYXhTaWRlcyA9IG1heFNpZGVzIHx8IDI1O1xyXG4gICAgICAgIHZhciBzaWRlcyA9IE1hdGguY2VpbChNYXRoLm1heCgxMCwgTWF0aC5taW4obWF4U2lkZXMsIHJhZGl1cykpKTtcclxuXHJcbiAgICAgICAgLy8gb3B0aW1pc2F0aW9uOiBhbHdheXMgdXNlIGV2ZW4gbnVtYmVyIG9mIHNpZGVzIChoYWxmIHRoZSBudW1iZXIgb2YgdW5pcXVlIGF4ZXMpXHJcbiAgICAgICAgaWYgKHNpZGVzICUgMiA9PT0gMSlcclxuICAgICAgICAgICAgc2lkZXMgKz0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJvZGllcy5wb2x5Z29uKHgsIHksIHNpZGVzLCByYWRpdXMsIENvbW1vbi5leHRlbmQoe30sIGNpcmNsZSwgb3B0aW9ucykpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmlnaWQgYm9keSBtb2RlbCB3aXRoIGEgcmVndWxhciBwb2x5Z29uIGh1bGwgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHNpZGVzLiBcclxuICAgICAqIFRoZSBvcHRpb25zIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgYW55IHByb3BlcnRpZXMgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxyXG4gICAgICogU2VlIHRoZSBwcm9wZXJ0aWVzIHNlY3Rpb24gb2YgdGhlIGBNYXR0ZXIuQm9keWAgbW9kdWxlIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB3aGF0IHlvdSBjYW4gcGFzcyB2aWEgdGhlIGBvcHRpb25zYCBvYmplY3QuXHJcbiAgICAgKiBAbWV0aG9kIHBvbHlnb25cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZGVzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5fSBBIG5ldyByZWd1bGFyIHBvbHlnb24gYm9keVxyXG4gICAgICovXHJcbiAgICBCb2RpZXMucG9seWdvbiA9IGZ1bmN0aW9uKHgsIHksIHNpZGVzLCByYWRpdXMsIG9wdGlvbnMpIHtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuXHJcbiAgICAgICAgaWYgKHNpZGVzIDwgMylcclxuICAgICAgICAgICAgcmV0dXJuIEJvZGllcy5jaXJjbGUoeCwgeSwgcmFkaXVzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdmFyIHRoZXRhID0gMiAqIE1hdGguUEkgLyBzaWRlcyxcclxuICAgICAgICAgICAgcGF0aCA9ICcnLFxyXG4gICAgICAgICAgICBvZmZzZXQgPSB0aGV0YSAqIDAuNTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWRlczsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIHZhciBhbmdsZSA9IG9mZnNldCArIChpICogdGhldGEpLFxyXG4gICAgICAgICAgICAgICAgeHggPSBNYXRoLmNvcyhhbmdsZSkgKiByYWRpdXMsXHJcbiAgICAgICAgICAgICAgICB5eSA9IE1hdGguc2luKGFuZ2xlKSAqIHJhZGl1cztcclxuXHJcbiAgICAgICAgICAgIHBhdGggKz0gJ0wgJyArIHh4LnRvRml4ZWQoMykgKyAnICcgKyB5eS50b0ZpeGVkKDMpICsgJyAnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBvbHlnb24gPSB7IFxyXG4gICAgICAgICAgICBsYWJlbDogJ1BvbHlnb24gQm9keScsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IHgsIHk6IHkgfSxcclxuICAgICAgICAgICAgdmVydGljZXM6IFZlcnRpY2VzLmZyb21QYXRoKHBhdGgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhbWZlcikge1xyXG4gICAgICAgICAgICB2YXIgY2hhbWZlciA9IG9wdGlvbnMuY2hhbWZlcjtcclxuICAgICAgICAgICAgcG9seWdvbi52ZXJ0aWNlcyA9IFZlcnRpY2VzLmNoYW1mZXIocG9seWdvbi52ZXJ0aWNlcywgY2hhbWZlci5yYWRpdXMsIFxyXG4gICAgICAgICAgICAgICAgY2hhbWZlci5xdWFsaXR5LCBjaGFtZmVyLnF1YWxpdHlNaW4sIGNoYW1mZXIucXVhbGl0eU1heCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmNoYW1mZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7fSwgcG9seWdvbiwgb3B0aW9ucykpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBib2R5IHVzaW5nIHRoZSBzdXBwbGllZCB2ZXJ0aWNlcyAob3IgYW4gYXJyYXkgY29udGFpbmluZyBtdWx0aXBsZSBzZXRzIG9mIHZlcnRpY2VzKS5cclxuICAgICAqIElmIHRoZSB2ZXJ0aWNlcyBhcmUgY29udmV4LCB0aGV5IHdpbGwgcGFzcyB0aHJvdWdoIGFzIHN1cHBsaWVkLlxyXG4gICAgICogT3RoZXJ3aXNlIGlmIHRoZSB2ZXJ0aWNlcyBhcmUgY29uY2F2ZSwgdGhleSB3aWxsIGJlIGRlY29tcG9zZWQgaWYgW3BvbHktZGVjb21wLmpzXShodHRwczovL2dpdGh1Yi5jb20vc2NodGVwcGUvcG9seS1kZWNvbXAuanMpIGlzIGF2YWlsYWJsZS5cclxuICAgICAqIE5vdGUgdGhhdCB0aGlzIHByb2Nlc3MgaXMgbm90IGd1YXJhbnRlZWQgdG8gc3VwcG9ydCBjb21wbGV4IHNldHMgb2YgdmVydGljZXMgKGUuZy4gdGhvc2Ugd2l0aCBob2xlcyBtYXkgZmFpbCkuXHJcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBkZWNvbXBvc2l0aW9uIHdpbGwgZGlzY2FyZCBjb2xsaW5lYXIgZWRnZXMgKHRvIGltcHJvdmUgcGVyZm9ybWFuY2UpLlxyXG4gICAgICogSXQgY2FuIGFsc28gb3B0aW9uYWxseSBkaXNjYXJkIGFueSBwYXJ0cyB0aGF0IGhhdmUgYW4gYXJlYSBsZXNzIHRoYW4gYG1pbmltdW1BcmVhYC5cclxuICAgICAqIElmIHRoZSB2ZXJ0aWNlcyBjYW4gbm90IGJlIGRlY29tcG9zZWQsIHRoZSByZXN1bHQgd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGNvbnZleCBodWxsLlxyXG4gICAgICogVGhlIG9wdGlvbnMgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyBhbnkgYE1hdHRlci5Cb2R5YCBwcm9wZXJ0aWVzIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cclxuICAgICAqIFNlZSB0aGUgcHJvcGVydGllcyBzZWN0aW9uIG9mIHRoZSBgTWF0dGVyLkJvZHlgIG1vZHVsZSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gd2hhdCB5b3UgY2FuIHBhc3MgdmlhIHRoZSBgb3B0aW9uc2Agb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBmcm9tVmVydGljZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geVxyXG4gICAgICogQHBhcmFtIFtbdmVjdG9yXV0gdmVydGV4U2V0c1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxyXG4gICAgICogQHBhcmFtIHtib29sfSBbZmxhZ0ludGVybmFsPWZhbHNlXVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyZW1vdmVDb2xsaW5lYXI9MC4wMV1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluaW11bUFyZWE9MTBdXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5fVxyXG4gICAgICovXHJcbiAgICBCb2RpZXMuZnJvbVZlcnRpY2VzID0gZnVuY3Rpb24oeCwgeSwgdmVydGV4U2V0cywgb3B0aW9ucywgZmxhZ0ludGVybmFsLCByZW1vdmVDb2xsaW5lYXIsIG1pbmltdW1BcmVhKSB7XHJcbiAgICAgICAgdmFyIGJvZHksXHJcbiAgICAgICAgICAgIHBhcnRzLFxyXG4gICAgICAgICAgICBpc0NvbnZleCxcclxuICAgICAgICAgICAgdmVydGljZXMsXHJcbiAgICAgICAgICAgIGksXHJcbiAgICAgICAgICAgIGosXHJcbiAgICAgICAgICAgIGssXHJcbiAgICAgICAgICAgIHYsXHJcbiAgICAgICAgICAgIHo7XHJcblxyXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgICAgIHBhcnRzID0gW107XHJcblxyXG4gICAgICAgIGZsYWdJbnRlcm5hbCA9IHR5cGVvZiBmbGFnSW50ZXJuYWwgIT09ICd1bmRlZmluZWQnID8gZmxhZ0ludGVybmFsIDogZmFsc2U7XHJcbiAgICAgICAgcmVtb3ZlQ29sbGluZWFyID0gdHlwZW9mIHJlbW92ZUNvbGxpbmVhciAhPT0gJ3VuZGVmaW5lZCcgPyByZW1vdmVDb2xsaW5lYXIgOiAwLjAxO1xyXG4gICAgICAgIG1pbmltdW1BcmVhID0gdHlwZW9mIG1pbmltdW1BcmVhICE9PSAndW5kZWZpbmVkJyA/IG1pbmltdW1BcmVhIDogMTA7XHJcblxyXG4gICAgICAgIGlmICghZGVjb21wKSB7XHJcbiAgICAgICAgICAgIENvbW1vbi53YXJuKCdCb2RpZXMuZnJvbVZlcnRpY2VzOiBwb2x5LWRlY29tcC5qcyByZXF1aXJlZC4gQ291bGQgbm90IGRlY29tcG9zZSB2ZXJ0aWNlcy4gRmFsbGJhY2sgdG8gY29udmV4IGh1bGwuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBlbnN1cmUgdmVydGV4U2V0cyBpcyBhbiBhcnJheSBvZiBhcnJheXNcclxuICAgICAgICBpZiAoIUNvbW1vbi5pc0FycmF5KHZlcnRleFNldHNbMF0pKSB7XHJcbiAgICAgICAgICAgIHZlcnRleFNldHMgPSBbdmVydGV4U2V0c107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHYgPSAwOyB2IDwgdmVydGV4U2V0cy5sZW5ndGg7IHYgKz0gMSkge1xyXG4gICAgICAgICAgICB2ZXJ0aWNlcyA9IHZlcnRleFNldHNbdl07XHJcbiAgICAgICAgICAgIGlzQ29udmV4ID0gVmVydGljZXMuaXNDb252ZXgodmVydGljZXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzQ29udmV4IHx8ICFkZWNvbXApIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NvbnZleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzID0gVmVydGljZXMuY2xvY2t3aXNlU29ydCh2ZXJ0aWNlcyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGNvbnZleCBodWxsIHdoZW4gZGVjb21wb3NpdGlvbiBpcyBub3QgcG9zc2libGVcclxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IFZlcnRpY2VzLmh1bGwodmVydGljZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7IHg6IHgsIHk6IHkgfSxcclxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlczogdmVydGljZXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGlzZSBhIGRlY29tcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIHZhciBjb25jYXZlID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKHZlcnRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbdmVydGV4LngsIHZlcnRleC55XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZlcnRpY2VzIGFyZSBjb25jYXZlIGFuZCBzaW1wbGUsIHdlIGNhbiBkZWNvbXBvc2UgaW50byBwYXJ0c1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLm1ha2VDQ1coY29uY2F2ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlQ29sbGluZWFyICE9PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgICAgICBkZWNvbXAucmVtb3ZlQ29sbGluZWFyUG9pbnRzKGNvbmNhdmUsIHJlbW92ZUNvbGxpbmVhcik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBxdWljayBkZWNvbXBvc2l0aW9uIGFsZ29yaXRobSAoQmF5YXppdClcclxuICAgICAgICAgICAgICAgIHZhciBkZWNvbXBvc2VkID0gZGVjb21wLnF1aWNrRGVjb21wKGNvbmNhdmUpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIGRlY29tcG9zZWQgY2h1bmtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWNvbXBvc2VkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rID0gZGVjb21wb3NlZFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB2ZXJ0aWNlcyBpbnRvIHRoZSBjb3JyZWN0IHN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjaHVua1ZlcnRpY2VzID0gY2h1bmsubWFwKGZ1bmN0aW9uKHZlcnRpY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB2ZXJ0aWNlc1swXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHZlcnRpY2VzWzFdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgc21hbGwgY2h1bmtzXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1BcmVhID4gMCAmJiBWZXJ0aWNlcy5hcmVhKGNodW5rVmVydGljZXMpIDwgbWluaW11bUFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBjb21wb3VuZCBwYXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBWZXJ0aWNlcy5jZW50cmUoY2h1bmtWZXJ0aWNlcyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzOiBjaHVua1ZlcnRpY2VzXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNyZWF0ZSBib2R5IHBhcnRzXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhcnRzW2ldID0gQm9keS5jcmVhdGUoQ29tbW9uLmV4dGVuZChwYXJ0c1tpXSwgb3B0aW9ucykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZsYWdJbnRlcm5hbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEJvZGllcy5mbGFnQ29pbmNpZGVudFBhcnRzKHBhcnRzLCA1KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcGFyZW50IGJvZHkgdG8gYmUgcmV0dXJuZWQsIHRoYXQgY29udGFpbnMgZ2VuZXJhdGVkIGNvbXBvdW5kIHBhcnRzXHJcbiAgICAgICAgICAgIGJvZHkgPSBCb2R5LmNyZWF0ZShDb21tb24uZXh0ZW5kKHsgcGFydHM6IHBhcnRzLnNsaWNlKDApIH0sIG9wdGlvbnMpKTtcclxuICAgICAgICAgICAgQm9keS5zZXRQb3NpdGlvbihib2R5LCB7IHg6IHgsIHk6IHkgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFydHNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGFuIGFycmF5IG9mIEJvZHkgb2JqZWN0cyBhbmQgZmxhZ3MgYWxsIGludGVybmFsIGVkZ2VzIChjb2luY2lkZW50IHBhcnRzKSBiYXNlZCBvbiB0aGUgbWF4RGlzdGFuY2VcclxuICAgICAqIHZhbHVlLiBUaGUgYXJyYXkgaXMgY2hhbmdlZCBpbi1wbGFjZSBhbmQgcmV0dXJuZWQsIHNvIHlvdSBjYW4gcGFzcyB0aGlzIGZ1bmN0aW9uIGEgYEJvZHkucGFydHNgIHByb3BlcnR5LlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIGZsYWdDb2luY2lkZW50UGFydHNcclxuICAgICAqIEBwYXJhbSB7Ym9keVtdfSBwYXJ0cyAtIFRoZSBCb2R5IHBhcnRzLCBvciBhcnJheSBvZiBib2RpZXMsIHRvIGZsYWcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heERpc3RhbmNlPTVdXHJcbiAgICAgKiBAcmV0dXJuIHtib2R5W119IFRoZSBtb2RpZmllZCBgcGFydHNgIHBhcmFtZXRlci5cclxuICAgICAqL1xyXG4gICAgQm9kaWVzLmZsYWdDb2luY2lkZW50UGFydHMgPSBmdW5jdGlvbiAocGFydHMsIG1heERpc3RhbmNlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChtYXhEaXN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7IG1heERpc3RhbmNlID0gNTsgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhcnRBID0gcGFydHNbaV07XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gaSArIDE7IGogPCBwYXJ0cy5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRCID0gcGFydHNbal07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEJvdW5kcy5vdmVybGFwcyhwYXJ0QS5ib3VuZHMsIHBhcnRCLmJvdW5kcykpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdiA9IHBhcnRBLnZlcnRpY2VzO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYnYgPSBwYXJ0Qi52ZXJ0aWNlcztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSB2ZXJ0aWNlcyBvZiBib3RoIHBhcnRzXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBwYXJ0QS52ZXJ0aWNlcy5sZW5ndGg7IGsrKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgcGFydEIudmVydGljZXMubGVuZ3RoOyB6KyspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGlzdGFuY2VzIGJldHdlZW4gdGhlIHZlcnRpY2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGEgPSBWZWN0b3IubWFnbml0dWRlU3F1YXJlZChWZWN0b3Iuc3ViKHBhdlsoayArIDEpICUgcGF2Lmxlbmd0aF0sIHBidlt6XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gVmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQoVmVjdG9yLnN1YihwYXZba10sIHBidlsoeiArIDEpICUgcGJ2Lmxlbmd0aF0pKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIHZlcnRpY2VzIGFyZSB2ZXJ5IGNsb3NlLCBjb25zaWRlciB0aGUgZWRnZSBjb25jaWRlbnQgKGludGVybmFsKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhIDwgbWF4RGlzdGFuY2UgJiYgZGIgPCBtYXhEaXN0YW5jZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXZba10uaXNJbnRlcm5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ2W3pdLmlzSW50ZXJuYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcGFydHM7XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuQ29tcG9zaXRlc2AgbW9kdWxlIGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgY3JlYXRpbmcgY29tcG9zaXRlIGJvZGllc1xyXG4qIHdpdGggY29tbW9ubHkgdXNlZCBjb25maWd1cmF0aW9ucyAoc3VjaCBhcyBzdGFja3MgYW5kIGNoYWlucykuXHJcbipcclxuKiBTZWUgdGhlIGluY2x1ZGVkIHVzYWdlIFtleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL2xpYWJydS9tYXR0ZXItanMvdHJlZS9tYXN0ZXIvZXhhbXBsZXMpLlxyXG4qXHJcbiogQGNsYXNzIENvbXBvc2l0ZXNcclxuKi9cclxuXHJcbnZhciBDb21wb3NpdGVzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvc2l0ZXM7XHJcblxyXG52YXIgQ29tcG9zaXRlID0gcmVxdWlyZSgnLi4vYm9keS9Db21wb3NpdGUnKTtcclxudmFyIENvbnN0cmFpbnQgPSByZXF1aXJlKCcuLi9jb25zdHJhaW50L0NvbnN0cmFpbnQnKTtcclxudmFyIENvbW1vbiA9IHJlcXVpcmUoJy4uL2NvcmUvQ29tbW9uJyk7XHJcbnZhciBCb2R5ID0gcmVxdWlyZSgnLi4vYm9keS9Cb2R5Jyk7XHJcbnZhciBCb2RpZXMgPSByZXF1aXJlKCcuL0JvZGllcycpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIGJvZGllcyBjcmVhdGVkIGluIHRoZSBjYWxsYmFjayBpbiBhIGdyaWQgYXJyYW5nZW1lbnQuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGJvZHkncyBib3VuZHMgdG8gcHJldmVudCBvdmVybGFwcy5cclxuICAgICAqIEBtZXRob2Qgc3RhY2tcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4eFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHl5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd3NcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5HYXBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dHYXBcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IEEgbmV3IGNvbXBvc2l0ZSBjb250YWluaW5nIG9iamVjdHMgY3JlYXRlZCBpbiB0aGUgY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlcy5zdGFjayA9IGZ1bmN0aW9uKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdmFyIHN0YWNrID0gQ29tcG9zaXRlLmNyZWF0ZSh7IGxhYmVsOiAnU3RhY2snIH0pLFxyXG4gICAgICAgICAgICB4ID0geHgsXHJcbiAgICAgICAgICAgIHkgPSB5eSxcclxuICAgICAgICAgICAgbGFzdEJvZHksXHJcbiAgICAgICAgICAgIGkgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xyXG4gICAgICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAodmFyIGNvbHVtbiA9IDA7IGNvbHVtbiA8IGNvbHVtbnM7IGNvbHVtbisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYm9keSA9IGNhbGxiYWNrKHgsIHksIGNvbHVtbiwgcm93LCBsYXN0Qm9keSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBib2R5SGVpZ2h0ID0gYm9keS5ib3VuZHMubWF4LnkgLSBib2R5LmJvdW5kcy5taW4ueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVdpZHRoID0gYm9keS5ib3VuZHMubWF4LnggLSBib2R5LmJvdW5kcy5taW4ueDsgXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5SGVpZ2h0ID4gbWF4SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBib2R5SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIEJvZHkudHJhbnNsYXRlKGJvZHksIHsgeDogYm9keVdpZHRoICogMC41LCB5OiBib2R5SGVpZ2h0ICogMC41IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB4ID0gYm9keS5ib3VuZHMubWF4LnggKyBjb2x1bW5HYXA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRCb2R5KHN0YWNrLCBib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Qm9keSA9IGJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB4ICs9IGNvbHVtbkdhcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgeSArPSBtYXhIZWlnaHQgKyByb3dHYXA7XHJcbiAgICAgICAgICAgIHggPSB4eDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzdGFjaztcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ2hhaW5zIGFsbCBib2RpZXMgaW4gdGhlIGdpdmVuIGNvbXBvc2l0ZSB0b2dldGhlciB1c2luZyBjb25zdHJhaW50cy5cclxuICAgICAqIEBtZXRob2QgY2hhaW5cclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4T2Zmc2V0QVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHlPZmZzZXRBXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geE9mZnNldEJcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5T2Zmc2V0QlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcclxuICAgICAqIEByZXR1cm4ge2NvbXBvc2l0ZX0gQSBuZXcgY29tcG9zaXRlIGNvbnRhaW5pbmcgb2JqZWN0cyBjaGFpbmVkIHRvZ2V0aGVyIHdpdGggY29uc3RyYWludHNcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlcy5jaGFpbiA9IGZ1bmN0aW9uKGNvbXBvc2l0ZSwgeE9mZnNldEEsIHlPZmZzZXRBLCB4T2Zmc2V0QiwgeU9mZnNldEIsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgYm9kaWVzID0gY29tcG9zaXRlLmJvZGllcztcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGJvZGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYm9keUEgPSBib2RpZXNbaSAtIDFdLFxyXG4gICAgICAgICAgICAgICAgYm9keUIgPSBib2RpZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBib2R5QUhlaWdodCA9IGJvZHlBLmJvdW5kcy5tYXgueSAtIGJvZHlBLmJvdW5kcy5taW4ueSxcclxuICAgICAgICAgICAgICAgIGJvZHlBV2lkdGggPSBib2R5QS5ib3VuZHMubWF4LnggLSBib2R5QS5ib3VuZHMubWluLngsIFxyXG4gICAgICAgICAgICAgICAgYm9keUJIZWlnaHQgPSBib2R5Qi5ib3VuZHMubWF4LnkgLSBib2R5Qi5ib3VuZHMubWluLnksXHJcbiAgICAgICAgICAgICAgICBib2R5QldpZHRoID0gYm9keUIuYm91bmRzLm1heC54IC0gYm9keUIuYm91bmRzLm1pbi54O1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgZGVmYXVsdHMgPSB7XHJcbiAgICAgICAgICAgICAgICBib2R5QTogYm9keUEsXHJcbiAgICAgICAgICAgICAgICBwb2ludEE6IHsgeDogYm9keUFXaWR0aCAqIHhPZmZzZXRBLCB5OiBib2R5QUhlaWdodCAqIHlPZmZzZXRBIH0sXHJcbiAgICAgICAgICAgICAgICBib2R5QjogYm9keUIsXHJcbiAgICAgICAgICAgICAgICBwb2ludEI6IHsgeDogYm9keUJXaWR0aCAqIHhPZmZzZXRCLCB5OiBib2R5QkhlaWdodCAqIHlPZmZzZXRCIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciBjb25zdHJhaW50ID0gQ29tbW9uLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoY29uc3RyYWludCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9zaXRlLmxhYmVsICs9ICcgQ2hhaW4nO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29ubmVjdHMgYm9kaWVzIGluIHRoZSBjb21wb3NpdGUgd2l0aCBjb25zdHJhaW50cyBpbiBhIGdyaWQgcGF0dGVybiwgd2l0aCBvcHRpb25hbCBjcm9zcyBicmFjZXMuXHJcbiAgICAgKiBAbWV0aG9kIG1lc2hcclxuICAgICAqIEBwYXJhbSB7Y29tcG9zaXRlfSBjb21wb3NpdGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93c1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjcm9zc0JyYWNlXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBUaGUgY29tcG9zaXRlIGNvbnRhaW5pbmcgb2JqZWN0cyBtZXNoZWQgdG9nZXRoZXIgd2l0aCBjb25zdHJhaW50c1xyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGVzLm1lc2ggPSBmdW5jdGlvbihjb21wb3NpdGUsIGNvbHVtbnMsIHJvd3MsIGNyb3NzQnJhY2UsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgYm9kaWVzID0gY29tcG9zaXRlLmJvZGllcyxcclxuICAgICAgICAgICAgcm93LFxyXG4gICAgICAgICAgICBjb2wsXHJcbiAgICAgICAgICAgIGJvZHlBLFxyXG4gICAgICAgICAgICBib2R5QixcclxuICAgICAgICAgICAgYm9keUM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbCA9IDE7IGNvbCA8IGNvbHVtbnM7IGNvbCsrKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5QSA9IGJvZGllc1soY29sIC0gMSkgKyAocm93ICogY29sdW1ucyldO1xyXG4gICAgICAgICAgICAgICAgYm9keUIgPSBib2RpZXNbY29sICsgKHJvdyAqIGNvbHVtbnMpXTtcclxuICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QSwgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IGNvbHVtbnM7IGNvbCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keUEgPSBib2RpZXNbY29sICsgKChyb3cgLSAxKSAqIGNvbHVtbnMpXTtcclxuICAgICAgICAgICAgICAgICAgICBib2R5QiA9IGJvZGllc1tjb2wgKyAocm93ICogY29sdW1ucyldO1xyXG4gICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QSwgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjcm9zc0JyYWNlICYmIGNvbCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUMgPSBib2RpZXNbKGNvbCAtIDEpICsgKChyb3cgLSAxKSAqIGNvbHVtbnMpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbnN0cmFpbnQoY29tcG9zaXRlLCBDb25zdHJhaW50LmNyZWF0ZShDb21tb24uZXh0ZW5kKHsgYm9keUE6IGJvZHlDLCBib2R5QjogYm9keUIgfSwgb3B0aW9ucykpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjcm9zc0JyYWNlICYmIGNvbCA8IGNvbHVtbnMgLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDID0gYm9kaWVzWyhjb2wgKyAxKSArICgocm93IC0gMSkgKiBjb2x1bW5zKV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNvbXBvc2l0ZSwgQ29uc3RyYWludC5jcmVhdGUoQ29tbW9uLmV4dGVuZCh7IGJvZHlBOiBib2R5QywgYm9keUI6IGJvZHlCIH0sIG9wdGlvbnMpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb3NpdGUubGFiZWwgKz0gJyBNZXNoJztcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9zaXRlIGNvbnRhaW5pbmcgYm9kaWVzIGNyZWF0ZWQgaW4gdGhlIGNhbGxiYWNrIGluIGEgcHlyYW1pZCBhcnJhbmdlbWVudC5cclxuICAgICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgYm9keSdzIGJvdW5kcyB0byBwcmV2ZW50IG92ZXJsYXBzLlxyXG4gICAgICogQG1ldGhvZCBweXJhbWlkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geHhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5eVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbnNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uR2FwXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93R2FwXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgY29udGFpbmluZyBvYmplY3RzIGNyZWF0ZWQgaW4gdGhlIGNhbGxiYWNrXHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZXMucHlyYW1pZCA9IGZ1bmN0aW9uKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgcmV0dXJuIENvbXBvc2l0ZXMuc3RhY2soeHgsIHl5LCBjb2x1bW5zLCByb3dzLCBjb2x1bW5HYXAsIHJvd0dhcCwgZnVuY3Rpb24oeCwgeSwgY29sdW1uLCByb3csIGxhc3RCb2R5LCBpKSB7XHJcbiAgICAgICAgICAgIHZhciBhY3R1YWxSb3dzID0gTWF0aC5taW4ocm93cywgTWF0aC5jZWlsKGNvbHVtbnMgLyAyKSksXHJcbiAgICAgICAgICAgICAgICBsYXN0Qm9keVdpZHRoID0gbGFzdEJvZHkgPyBsYXN0Qm9keS5ib3VuZHMubWF4LnggLSBsYXN0Qm9keS5ib3VuZHMubWluLnggOiAwO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHJvdyA+IGFjdHVhbFJvd3MpXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyByZXZlcnNlIHJvdyBvcmRlclxyXG4gICAgICAgICAgICByb3cgPSBhY3R1YWxSb3dzIC0gcm93O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcm93LFxyXG4gICAgICAgICAgICAgICAgZW5kID0gY29sdW1ucyAtIDEgLSByb3c7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29sdW1uIDwgc3RhcnQgfHwgY29sdW1uID4gZW5kKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gcmV0cm9hY3RpdmVseSBmaXggdGhlIGZpcnN0IGJvZHkncyBwb3NpdGlvbiwgc2luY2Ugd2lkdGggd2FzIHVua25vd25cclxuICAgICAgICAgICAgaWYgKGkgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIEJvZHkudHJhbnNsYXRlKGxhc3RCb2R5LCB7IHg6IChjb2x1bW4gKyAoY29sdW1ucyAlIDIgPT09IDEgPyAxIDogLTEpKSAqIGxhc3RCb2R5V2lkdGgsIHk6IDAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB4T2Zmc2V0ID0gbGFzdEJvZHkgPyBjb2x1bW4gKiBsYXN0Qm9keVdpZHRoIDogMDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh4eCArIHhPZmZzZXQgKyBjb2x1bW4gKiBjb2x1bW5HYXAsIHksIGNvbHVtbiwgcm93LCBsYXN0Qm9keSwgaSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgTmV3dG9uJ3MgQ3JhZGxlIHNldHVwIG9mIGJvZGllcyBhbmQgY29uc3RyYWludHMuXHJcbiAgICAgKiBAbWV0aG9kIG5ld3RvbnNDcmFkbGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4eFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHl5XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgbmV3dG9uc0NyYWRsZSBib2R5XHJcbiAgICAgKi9cclxuICAgIENvbXBvc2l0ZXMubmV3dG9uc0NyYWRsZSA9IGZ1bmN0aW9uKHh4LCB5eSwgbnVtYmVyLCBzaXplLCBsZW5ndGgpIHtcclxuICAgICAgICB2YXIgbmV3dG9uc0NyYWRsZSA9IENvbXBvc2l0ZS5jcmVhdGUoeyBsYWJlbDogJ05ld3RvbnMgQ3JhZGxlJyB9KTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgc2VwYXJhdGlvbiA9IDEuOSxcclxuICAgICAgICAgICAgICAgIGNpcmNsZSA9IEJvZGllcy5jaXJjbGUoeHggKyBpICogKHNpemUgKiBzZXBhcmF0aW9uKSwgeXkgKyBsZW5ndGgsIHNpemUsIFxyXG4gICAgICAgICAgICAgICAgICAgIHsgaW5lcnRpYTogSW5maW5pdHksIHJlc3RpdHV0aW9uOiAxLCBmcmljdGlvbjogMCwgZnJpY3Rpb25BaXI6IDAuMDAwMSwgc2xvcDogMSB9KSxcclxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgPSBDb25zdHJhaW50LmNyZWF0ZSh7IHBvaW50QTogeyB4OiB4eCArIGkgKiAoc2l6ZSAqIHNlcGFyYXRpb24pLCB5OiB5eSB9LCBib2R5QjogY2lyY2xlIH0pO1xyXG5cclxuICAgICAgICAgICAgQ29tcG9zaXRlLmFkZEJvZHkobmV3dG9uc0NyYWRsZSwgY2lyY2xlKTtcclxuICAgICAgICAgICAgQ29tcG9zaXRlLmFkZENvbnN0cmFpbnQobmV3dG9uc0NyYWRsZSwgY29uc3RyYWludCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3dG9uc0NyYWRsZTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIHNpbXBsZSBjYXIgc2V0dXAgb2YgYm9kaWVzIGFuZCBjb25zdHJhaW50cy5cclxuICAgICAqIEBtZXRob2QgY2FyXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geHhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5eVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2hlZWxTaXplXHJcbiAgICAgKiBAcmV0dXJuIHtjb21wb3NpdGV9IEEgbmV3IGNvbXBvc2l0ZSBjYXIgYm9keVxyXG4gICAgICovXHJcbiAgICBDb21wb3NpdGVzLmNhciA9IGZ1bmN0aW9uKHh4LCB5eSwgd2lkdGgsIGhlaWdodCwgd2hlZWxTaXplKSB7XHJcbiAgICAgICAgdmFyIGdyb3VwID0gQm9keS5uZXh0R3JvdXAodHJ1ZSksXHJcbiAgICAgICAgICAgIHdoZWVsQmFzZSA9IDIwLFxyXG4gICAgICAgICAgICB3aGVlbEFPZmZzZXQgPSAtd2lkdGggKiAwLjUgKyB3aGVlbEJhc2UsXHJcbiAgICAgICAgICAgIHdoZWVsQk9mZnNldCA9IHdpZHRoICogMC41IC0gd2hlZWxCYXNlLFxyXG4gICAgICAgICAgICB3aGVlbFlPZmZzZXQgPSAwO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGNhciA9IENvbXBvc2l0ZS5jcmVhdGUoeyBsYWJlbDogJ0NhcicgfSksXHJcbiAgICAgICAgICAgIGJvZHkgPSBCb2RpZXMucmVjdGFuZ2xlKHh4LCB5eSwgd2lkdGgsIGhlaWdodCwgeyBcclxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZpbHRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwOiBncm91cFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNoYW1mZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICByYWRpdXM6IGhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRlbnNpdHk6IDAuMDAwMlxyXG4gICAgICAgICAgICB9KTtcclxuICAgIFxyXG4gICAgICAgIHZhciB3aGVlbEEgPSBCb2RpZXMuY2lyY2xlKHh4ICsgd2hlZWxBT2Zmc2V0LCB5eSArIHdoZWVsWU9mZnNldCwgd2hlZWxTaXplLCB7IFxyXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIGdyb3VwOiBncm91cFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmcmljdGlvbjogMC44XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgdmFyIHdoZWVsQiA9IEJvZGllcy5jaXJjbGUoeHggKyB3aGVlbEJPZmZzZXQsIHl5ICsgd2hlZWxZT2Zmc2V0LCB3aGVlbFNpemUsIHsgXHJcbiAgICAgICAgICAgIGNvbGxpc2lvbkZpbHRlcjoge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXA6IGdyb3VwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZyaWN0aW9uOiAwLjhcclxuICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICB2YXIgYXhlbEEgPSBDb25zdHJhaW50LmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIGJvZHlCOiBib2R5LFxyXG4gICAgICAgICAgICBwb2ludEI6IHsgeDogd2hlZWxBT2Zmc2V0LCB5OiB3aGVlbFlPZmZzZXQgfSxcclxuICAgICAgICAgICAgYm9keUE6IHdoZWVsQSxcclxuICAgICAgICAgICAgc3RpZmZuZXNzOiAxLFxyXG4gICAgICAgICAgICBsZW5ndGg6IDBcclxuICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgdmFyIGF4ZWxCID0gQ29uc3RyYWludC5jcmVhdGUoe1xyXG4gICAgICAgICAgICBib2R5QjogYm9keSxcclxuICAgICAgICAgICAgcG9pbnRCOiB7IHg6IHdoZWVsQk9mZnNldCwgeTogd2hlZWxZT2Zmc2V0IH0sXHJcbiAgICAgICAgICAgIGJvZHlBOiB3aGVlbEIsXHJcbiAgICAgICAgICAgIHN0aWZmbmVzczogMSxcclxuICAgICAgICAgICAgbGVuZ3RoOiAwXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgQ29tcG9zaXRlLmFkZEJvZHkoY2FyLCBib2R5KTtcclxuICAgICAgICBDb21wb3NpdGUuYWRkQm9keShjYXIsIHdoZWVsQSk7XHJcbiAgICAgICAgQ29tcG9zaXRlLmFkZEJvZHkoY2FyLCB3aGVlbEIpO1xyXG4gICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNhciwgYXhlbEEpO1xyXG4gICAgICAgIENvbXBvc2l0ZS5hZGRDb25zdHJhaW50KGNhciwgYXhlbEIpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2FyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgc29mdCBib2R5IGxpa2Ugb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZCBzb2Z0Qm9keVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHh4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geXlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93c1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbkdhcFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0dhcFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjcm9zc0JyYWNlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFydGljbGVSYWRpdXNcclxuICAgICAqIEBwYXJhbSB7fSBwYXJ0aWNsZU9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7fSBjb25zdHJhaW50T3B0aW9uc1xyXG4gICAgICogQHJldHVybiB7Y29tcG9zaXRlfSBBIG5ldyBjb21wb3NpdGUgc29mdEJvZHlcclxuICAgICAqL1xyXG4gICAgQ29tcG9zaXRlcy5zb2Z0Qm9keSA9IGZ1bmN0aW9uKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGNyb3NzQnJhY2UsIHBhcnRpY2xlUmFkaXVzLCBwYXJ0aWNsZU9wdGlvbnMsIGNvbnN0cmFpbnRPcHRpb25zKSB7XHJcbiAgICAgICAgcGFydGljbGVPcHRpb25zID0gQ29tbW9uLmV4dGVuZCh7IGluZXJ0aWE6IEluZmluaXR5IH0sIHBhcnRpY2xlT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3RyYWludE9wdGlvbnMgPSBDb21tb24uZXh0ZW5kKHsgc3RpZmZuZXNzOiAwLjIsIHJlbmRlcjogeyB0eXBlOiAnbGluZScsIGFuY2hvcnM6IGZhbHNlIH0gfSwgY29uc3RyYWludE9wdGlvbnMpO1xyXG5cclxuICAgICAgICB2YXIgc29mdEJvZHkgPSBDb21wb3NpdGVzLnN0YWNrKHh4LCB5eSwgY29sdW1ucywgcm93cywgY29sdW1uR2FwLCByb3dHYXAsIGZ1bmN0aW9uKHgsIHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEJvZGllcy5jaXJjbGUoeCwgeSwgcGFydGljbGVSYWRpdXMsIHBhcnRpY2xlT3B0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIENvbXBvc2l0ZXMubWVzaChzb2Z0Qm9keSwgY29sdW1ucywgcm93cywgY3Jvc3NCcmFjZSwgY29uc3RyYWludE9wdGlvbnMpO1xyXG5cclxuICAgICAgICBzb2Z0Qm9keS5sYWJlbCA9ICdTb2Z0IEJvZHknO1xyXG5cclxuICAgICAgICByZXR1cm4gc29mdEJvZHk7XHJcbiAgICB9O1xyXG5cclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuQXhlc2AgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgc2V0cyBvZiBheGVzLlxyXG4qXHJcbiogQGNsYXNzIEF4ZXNcclxuKi9cclxuXHJcbnZhciBBeGVzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEF4ZXM7XHJcblxyXG52YXIgVmVjdG9yID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvVmVjdG9yJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzZXQgb2YgYXhlcyBmcm9tIHRoZSBnaXZlbiB2ZXJ0aWNlcy5cclxuICAgICAqIEBtZXRob2QgZnJvbVZlcnRpY2VzXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHJldHVybiB7YXhlc30gQSBuZXcgYXhlcyBmcm9tIHRoZSBnaXZlbiB2ZXJ0aWNlc1xyXG4gICAgICovXHJcbiAgICBBeGVzLmZyb21WZXJ0aWNlcyA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XHJcbiAgICAgICAgdmFyIGF4ZXMgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gZmluZCB0aGUgdW5pcXVlIGF4ZXMsIHVzaW5nIGVkZ2Ugbm9ybWFsIGdyYWRpZW50c1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGogPSAoaSArIDEpICUgdmVydGljZXMubGVuZ3RoLCBcclxuICAgICAgICAgICAgICAgIG5vcm1hbCA9IFZlY3Rvci5ub3JtYWxpc2UoeyBcclxuICAgICAgICAgICAgICAgICAgICB4OiB2ZXJ0aWNlc1tqXS55IC0gdmVydGljZXNbaV0ueSwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogdmVydGljZXNbaV0ueCAtIHZlcnRpY2VzW2pdLnhcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgZ3JhZGllbnQgPSAobm9ybWFsLnkgPT09IDApID8gSW5maW5pdHkgOiAobm9ybWFsLnggLyBub3JtYWwueSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBsaW1pdCBwcmVjaXNpb25cclxuICAgICAgICAgICAgZ3JhZGllbnQgPSBncmFkaWVudC50b0ZpeGVkKDMpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGF4ZXNbZ3JhZGllbnRdID0gbm9ybWFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIENvbW1vbi52YWx1ZXMoYXhlcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyBhIHNldCBvZiBheGVzIGJ5IHRoZSBnaXZlbiBhbmdsZS5cclxuICAgICAqIEBtZXRob2Qgcm90YXRlXHJcbiAgICAgKiBAcGFyYW0ge2F4ZXN9IGF4ZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZVxyXG4gICAgICovXHJcbiAgICBBeGVzLnJvdGF0ZSA9IGZ1bmN0aW9uKGF4ZXMsIGFuZ2xlKSB7XHJcbiAgICAgICAgaWYgKGFuZ2xlID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcclxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF4ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGF4aXMgPSBheGVzW2ldLFxyXG4gICAgICAgICAgICAgICAgeHg7XHJcbiAgICAgICAgICAgIHh4ID0gYXhpcy54ICogY29zIC0gYXhpcy55ICogc2luO1xyXG4gICAgICAgICAgICBheGlzLnkgPSBheGlzLnggKiBzaW4gKyBheGlzLnkgKiBjb3M7XHJcbiAgICAgICAgICAgIGF4aXMueCA9IHh4O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpO1xyXG4iLCIvKipcclxuKiBUaGUgYE1hdHRlci5Cb3VuZHNgIG1vZHVsZSBjb250YWlucyBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hlcyAoQUFCQikuXHJcbipcclxuKiBAY2xhc3MgQm91bmRzXHJcbiovXHJcblxyXG52YXIgQm91bmRzID0ge307XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJvdW5kcztcclxuXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCAoQUFCQikgZm9yIHRoZSBnaXZlbiB2ZXJ0aWNlcy5cclxuICAgICAqIEBtZXRob2QgY3JlYXRlXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHJldHVybiB7Ym91bmRzfSBBIG5ldyBib3VuZHMgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIEJvdW5kcy5jcmVhdGUgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xyXG4gICAgICAgIHZhciBib3VuZHMgPSB7IFxyXG4gICAgICAgICAgICBtaW46IHsgeDogMCwgeTogMCB9LCBcclxuICAgICAgICAgICAgbWF4OiB7IHg6IDAsIHk6IDAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh2ZXJ0aWNlcylcclxuICAgICAgICAgICAgQm91bmRzLnVwZGF0ZShib3VuZHMsIHZlcnRpY2VzKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYm91bmRzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgYm91bmRzIHVzaW5nIHRoZSBnaXZlbiB2ZXJ0aWNlcyBhbmQgZXh0ZW5kcyB0aGUgYm91bmRzIGdpdmVuIGEgdmVsb2NpdHkuXHJcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxyXG4gICAgICogQHBhcmFtIHtib3VuZHN9IGJvdW5kc1xyXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWxvY2l0eVxyXG4gICAgICovXHJcbiAgICBCb3VuZHMudXBkYXRlID0gZnVuY3Rpb24oYm91bmRzLCB2ZXJ0aWNlcywgdmVsb2NpdHkpIHtcclxuICAgICAgICBib3VuZHMubWluLnggPSBJbmZpbml0eTtcclxuICAgICAgICBib3VuZHMubWF4LnggPSAtSW5maW5pdHk7XHJcbiAgICAgICAgYm91bmRzLm1pbi55ID0gSW5maW5pdHk7XHJcbiAgICAgICAgYm91bmRzLm1heC55ID0gLUluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcclxuICAgICAgICAgICAgaWYgKHZlcnRleC54ID4gYm91bmRzLm1heC54KSBib3VuZHMubWF4LnggPSB2ZXJ0ZXgueDtcclxuICAgICAgICAgICAgaWYgKHZlcnRleC54IDwgYm91bmRzLm1pbi54KSBib3VuZHMubWluLnggPSB2ZXJ0ZXgueDtcclxuICAgICAgICAgICAgaWYgKHZlcnRleC55ID4gYm91bmRzLm1heC55KSBib3VuZHMubWF4LnkgPSB2ZXJ0ZXgueTtcclxuICAgICAgICAgICAgaWYgKHZlcnRleC55IDwgYm91bmRzLm1pbi55KSBib3VuZHMubWluLnkgPSB2ZXJ0ZXgueTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHZlbG9jaXR5KSB7XHJcbiAgICAgICAgICAgIGlmICh2ZWxvY2l0eS54ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYm91bmRzLm1heC54ICs9IHZlbG9jaXR5Lng7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBib3VuZHMubWluLnggKz0gdmVsb2NpdHkueDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHZlbG9jaXR5LnkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBib3VuZHMubWF4LnkgKz0gdmVsb2NpdHkueTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJvdW5kcy5taW4ueSArPSB2ZWxvY2l0eS55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYm91bmRzIGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludC5cclxuICAgICAqIEBtZXRob2QgY29udGFpbnNcclxuICAgICAqIEBwYXJhbSB7Ym91bmRzfSBib3VuZHNcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb2ludFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYm91bmRzIGNvbnRhaW4gdGhlIHBvaW50LCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgQm91bmRzLmNvbnRhaW5zID0gZnVuY3Rpb24oYm91bmRzLCBwb2ludCkge1xyXG4gICAgICAgIHJldHVybiBwb2ludC54ID49IGJvdW5kcy5taW4ueCAmJiBwb2ludC54IDw9IGJvdW5kcy5tYXgueCBcclxuICAgICAgICAgICAgICAgJiYgcG9pbnQueSA+PSBib3VuZHMubWluLnkgJiYgcG9pbnQueSA8PSBib3VuZHMubWF4Lnk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gYm91bmRzIGludGVyc2VjdC5cclxuICAgICAqIEBtZXRob2Qgb3ZlcmxhcHNcclxuICAgICAqIEBwYXJhbSB7Ym91bmRzfSBib3VuZHNBXHJcbiAgICAgKiBAcGFyYW0ge2JvdW5kc30gYm91bmRzQlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYm91bmRzIG92ZXJsYXAsIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICovXHJcbiAgICBCb3VuZHMub3ZlcmxhcHMgPSBmdW5jdGlvbihib3VuZHNBLCBib3VuZHNCKSB7XHJcbiAgICAgICAgcmV0dXJuIChib3VuZHNBLm1pbi54IDw9IGJvdW5kc0IubWF4LnggJiYgYm91bmRzQS5tYXgueCA+PSBib3VuZHNCLm1pbi54XHJcbiAgICAgICAgICAgICAgICAmJiBib3VuZHNBLm1heC55ID49IGJvdW5kc0IubWluLnkgJiYgYm91bmRzQS5taW4ueSA8PSBib3VuZHNCLm1heC55KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2xhdGVzIHRoZSBib3VuZHMgYnkgdGhlIGdpdmVuIHZlY3Rvci5cclxuICAgICAqIEBtZXRob2QgdHJhbnNsYXRlXHJcbiAgICAgKiBAcGFyYW0ge2JvdW5kc30gYm91bmRzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIEJvdW5kcy50cmFuc2xhdGUgPSBmdW5jdGlvbihib3VuZHMsIHZlY3Rvcikge1xyXG4gICAgICAgIGJvdW5kcy5taW4ueCArPSB2ZWN0b3IueDtcclxuICAgICAgICBib3VuZHMubWF4LnggKz0gdmVjdG9yLng7XHJcbiAgICAgICAgYm91bmRzLm1pbi55ICs9IHZlY3Rvci55O1xyXG4gICAgICAgIGJvdW5kcy5tYXgueSArPSB2ZWN0b3IueTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaGlmdHMgdGhlIGJvdW5kcyB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uXHJcbiAgICAgKiBAbWV0aG9kIHNoaWZ0XHJcbiAgICAgKiBAcGFyYW0ge2JvdW5kc30gYm91bmRzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9zaXRpb25cclxuICAgICAqL1xyXG4gICAgQm91bmRzLnNoaWZ0ID0gZnVuY3Rpb24oYm91bmRzLCBwb3NpdGlvbikge1xyXG4gICAgICAgIHZhciBkZWx0YVggPSBib3VuZHMubWF4LnggLSBib3VuZHMubWluLngsXHJcbiAgICAgICAgICAgIGRlbHRhWSA9IGJvdW5kcy5tYXgueSAtIGJvdW5kcy5taW4ueTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgYm91bmRzLm1pbi54ID0gcG9zaXRpb24ueDtcclxuICAgICAgICBib3VuZHMubWF4LnggPSBwb3NpdGlvbi54ICsgZGVsdGFYO1xyXG4gICAgICAgIGJvdW5kcy5taW4ueSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgYm91bmRzLm1heC55ID0gcG9zaXRpb24ueSArIGRlbHRhWTtcclxuICAgIH07XHJcbiAgICBcclxufSkoKTtcclxuIiwiLyoqXHJcbiogVGhlIGBNYXR0ZXIuU3ZnYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY29udmVydGluZyBTVkcgaW1hZ2VzIGludG8gYW4gYXJyYXkgb2YgdmVjdG9yIHBvaW50cy5cclxuKlxyXG4qIFRvIHVzZSB0aGlzIG1vZHVsZSB5b3UgYWxzbyBuZWVkIHRoZSBTVkdQYXRoU2VnIHBvbHlmaWxsOiBodHRwczovL2dpdGh1Yi5jb20vcHJvZ2Vycy9wYXRoc2VnXHJcbipcclxuKiBTZWUgdGhlIGluY2x1ZGVkIHVzYWdlIFtleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL2xpYWJydS9tYXR0ZXItanMvdHJlZS9tYXN0ZXIvZXhhbXBsZXMpLlxyXG4qXHJcbiogQGNsYXNzIFN2Z1xyXG4qL1xyXG5cclxudmFyIFN2ZyA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdmc7XHJcblxyXG52YXIgQm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvbWV0cnkvQm91bmRzJyk7XHJcbnZhciBDb21tb24gPSByZXF1aXJlKCcuLi9jb3JlL0NvbW1vbicpO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgYW4gU1ZHIHBhdGggaW50byBhbiBhcnJheSBvZiB2ZWN0b3IgcG9pbnRzLlxyXG4gICAgICogSWYgdGhlIGlucHV0IHBhdGggZm9ybXMgYSBjb25jYXZlIHNoYXBlLCB5b3UgbXVzdCBkZWNvbXBvc2UgdGhlIHJlc3VsdCBpbnRvIGNvbnZleCBwYXJ0cyBiZWZvcmUgdXNlLlxyXG4gICAgICogU2VlIGBCb2RpZXMuZnJvbVZlcnRpY2VzYCB3aGljaCBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGlzLlxyXG4gICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGd1YXJhbnRlZWQgdG8gc3VwcG9ydCBjb21wbGV4IHBhdGhzIChzdWNoIGFzIHRob3NlIHdpdGggaG9sZXMpLlxyXG4gICAgICogWW91IG11c3QgbG9hZCB0aGUgYHBhdGhzZWcuanNgIHBvbHlmaWxsIG9uIG5ld2VyIGJyb3dzZXJzLlxyXG4gICAgICogQG1ldGhvZCBwYXRoVG9WZXJ0aWNlc1xyXG4gICAgICogQHBhcmFtIHtTVkdQYXRoRWxlbWVudH0gcGF0aFxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVMZW5ndGg9MTVdXHJcbiAgICAgKiBAcmV0dXJuIHtWZWN0b3JbXX0gcG9pbnRzXHJcbiAgICAgKi9cclxuICAgIFN2Zy5wYXRoVG9WZXJ0aWNlcyA9IGZ1bmN0aW9uKHBhdGgsIHNhbXBsZUxlbmd0aCkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhKCdTVkdQYXRoU2VnJyBpbiB3aW5kb3cpKSB7XHJcbiAgICAgICAgICAgIENvbW1vbi53YXJuKCdTdmcucGF0aFRvVmVydGljZXM6IFNWR1BhdGhTZWcgbm90IGRlZmluZWQsIGEgcG9seWZpbGwgaXMgcmVxdWlyZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd291dC9zdmcudG9wb2x5LmpzL2Jsb2IvbWFzdGVyL3N2Zy50b3BvbHkuanNcclxuICAgICAgICB2YXIgaSwgaWwsIHRvdGFsLCBwb2ludCwgc2VnbWVudCwgc2VnbWVudHMsIFxyXG4gICAgICAgICAgICBzZWdtZW50c1F1ZXVlLCBsYXN0U2VnbWVudCwgXHJcbiAgICAgICAgICAgIGxhc3RQb2ludCwgc2VnbWVudEluZGV4LCBwb2ludHMgPSBbXSxcclxuICAgICAgICAgICAgbHgsIGx5LCBsZW5ndGggPSAwLCB4ID0gMCwgeSA9IDA7XHJcblxyXG4gICAgICAgIHNhbXBsZUxlbmd0aCA9IHNhbXBsZUxlbmd0aCB8fCAxNTtcclxuXHJcbiAgICAgICAgdmFyIGFkZFBvaW50ID0gZnVuY3Rpb24ocHgsIHB5LCBwYXRoU2VnVHlwZSkge1xyXG4gICAgICAgICAgICAvLyBhbGwgb2RkLW51bWJlcmVkIHBhdGggdHlwZXMgYXJlIHJlbGF0aXZlIGV4Y2VwdCBQQVRIU0VHX0NMT1NFUEFUSCAoMSlcclxuICAgICAgICAgICAgdmFyIGlzUmVsYXRpdmUgPSBwYXRoU2VnVHlwZSAlIDIgPT09IDEgJiYgcGF0aFNlZ1R5cGUgPiAxO1xyXG5cclxuICAgICAgICAgICAgLy8gd2hlbiB0aGUgbGFzdCBwb2ludCBkb2Vzbid0IGVxdWFsIHRoZSBjdXJyZW50IHBvaW50IGFkZCB0aGUgY3VycmVudCBwb2ludFxyXG4gICAgICAgICAgICBpZiAoIWxhc3RQb2ludCB8fCBweCAhPSBsYXN0UG9pbnQueCB8fCBweSAhPSBsYXN0UG9pbnQueSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQb2ludCAmJiBpc1JlbGF0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbHggPSBsYXN0UG9pbnQueDtcclxuICAgICAgICAgICAgICAgICAgICBseSA9IGxhc3RQb2ludC55O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBseCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbHkgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBseCArIHB4LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGx5ICsgcHlcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGxhc3QgcG9pbnRcclxuICAgICAgICAgICAgICAgIGlmIChpc1JlbGF0aXZlIHx8ICFsYXN0UG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnQgPSBwb2ludDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwb2ludHMucHVzaChwb2ludCk7XHJcblxyXG4gICAgICAgICAgICAgICAgeCA9IGx4ICsgcHg7XHJcbiAgICAgICAgICAgICAgICB5ID0gbHkgKyBweTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBhZGRTZWdtZW50UG9pbnQgPSBmdW5jdGlvbihzZWdtZW50KSB7XHJcbiAgICAgICAgICAgIHZhciBzZWdUeXBlID0gc2VnbWVudC5wYXRoU2VnVHlwZUFzTGV0dGVyLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBza2lwIHBhdGggZW5kc1xyXG4gICAgICAgICAgICBpZiAoc2VnVHlwZSA9PT0gJ1onKSBcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIC8vIG1hcCBzZWdtZW50IHRvIHggYW5kIHlcclxuICAgICAgICAgICAgc3dpdGNoIChzZWdUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdNJzpcclxuICAgICAgICAgICAgY2FzZSAnTCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1QnOlxyXG4gICAgICAgICAgICBjYXNlICdDJzpcclxuICAgICAgICAgICAgY2FzZSAnUyc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1EnOlxyXG4gICAgICAgICAgICAgICAgeCA9IHNlZ21lbnQueDtcclxuICAgICAgICAgICAgICAgIHkgPSBzZWdtZW50Lnk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnSCc6XHJcbiAgICAgICAgICAgICAgICB4ID0gc2VnbWVudC54O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1YnOlxyXG4gICAgICAgICAgICAgICAgeSA9IHNlZ21lbnQueTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhZGRQb2ludCh4LCB5LCBzZWdtZW50LnBhdGhTZWdUeXBlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBlbnN1cmUgcGF0aCBpcyBhYnNvbHV0ZVxyXG4gICAgICAgIFN2Zy5fc3ZnUGF0aFRvQWJzb2x1dGUocGF0aCk7XHJcblxyXG4gICAgICAgIC8vIGdldCB0b3RhbCBsZW5ndGhcclxuICAgICAgICB0b3RhbCA9IHBhdGguZ2V0VG90YWxMZW5ndGgoKTtcclxuXHJcbiAgICAgICAgLy8gcXVldWUgc2VnbWVudHNcclxuICAgICAgICBzZWdtZW50cyA9IFtdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXRoLnBhdGhTZWdMaXN0Lm51bWJlck9mSXRlbXM7IGkgKz0gMSlcclxuICAgICAgICAgICAgc2VnbWVudHMucHVzaChwYXRoLnBhdGhTZWdMaXN0LmdldEl0ZW0oaSkpO1xyXG5cclxuICAgICAgICBzZWdtZW50c1F1ZXVlID0gc2VnbWVudHMuY29uY2F0KCk7XHJcblxyXG4gICAgICAgIC8vIHNhbXBsZSB0aHJvdWdoIHBhdGhcclxuICAgICAgICB3aGlsZSAobGVuZ3RoIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgLy8gZ2V0IHNlZ21lbnQgYXQgcG9zaXRpb25cclxuICAgICAgICAgICAgc2VnbWVudEluZGV4ID0gcGF0aC5nZXRQYXRoU2VnQXRMZW5ndGgobGVuZ3RoKTtcclxuICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnRzW3NlZ21lbnRJbmRleF07XHJcblxyXG4gICAgICAgICAgICAvLyBuZXcgc2VnbWVudFxyXG4gICAgICAgICAgICBpZiAoc2VnbWVudCAhPSBsYXN0U2VnbWVudCkge1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHNlZ21lbnRzUXVldWUubGVuZ3RoICYmIHNlZ21lbnRzUXVldWVbMF0gIT0gc2VnbWVudClcclxuICAgICAgICAgICAgICAgICAgICBhZGRTZWdtZW50UG9pbnQoc2VnbWVudHNRdWV1ZS5zaGlmdCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudCA9IHNlZ21lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFkZCBwb2ludHMgaW4gYmV0d2VlbiB3aGVuIGN1cnZpbmdcclxuICAgICAgICAgICAgLy8gVE9ETzogYWRhcHRpdmUgc2FtcGxpbmdcclxuICAgICAgICAgICAgc3dpdGNoIChzZWdtZW50LnBhdGhTZWdUeXBlQXNMZXR0ZXIudG9VcHBlckNhc2UoKSkge1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnQyc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1QnOlxyXG4gICAgICAgICAgICBjYXNlICdTJzpcclxuICAgICAgICAgICAgY2FzZSAnUSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ0EnOlxyXG4gICAgICAgICAgICAgICAgcG9pbnQgPSBwYXRoLmdldFBvaW50QXRMZW5ndGgobGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGFkZFBvaW50KHBvaW50LngsIHBvaW50LnksIDApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgc2FtcGxlIHZhbHVlXHJcbiAgICAgICAgICAgIGxlbmd0aCArPSBzYW1wbGVMZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHNlZ21lbnRzIG5vdCBwYXNzZWQgYnkgc2FtcGxpbmdcclxuICAgICAgICBmb3IgKGkgPSAwLCBpbCA9IHNlZ21lbnRzUXVldWUubGVuZ3RoOyBpIDwgaWw7ICsraSlcclxuICAgICAgICAgICAgYWRkU2VnbWVudFBvaW50KHNlZ21lbnRzUXVldWVbaV0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcG9pbnRzO1xyXG4gICAgfTtcclxuXHJcbiAgICBTdmcuX3N2Z1BhdGhUb0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gICAgICAgIC8vIGh0dHA6Ly9waHJvZ3oubmV0L2NvbnZlcnQtc3ZnLXBhdGgtdG8tYWxsLWFic29sdXRlLWNvbW1hbmRzXHJcbiAgICAgICAgLy8gQ29weXJpZ2h0IChjKSBHYXZpbiBLaXN0bmVyXHJcbiAgICAgICAgLy8gaHR0cDovL3Bocm9nei5uZXQvanMvX1JldXNlTGljZW5zZS50eHRcclxuICAgICAgICAvLyBNb2RpZmljYXRpb25zOiB0aWR5IGZvcm1hdHRpbmcgYW5kIG5hbWluZ1xyXG4gICAgICAgIHZhciB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCBzZWdzID0gcGF0aC5wYXRoU2VnTGlzdCxcclxuICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCBsZW4gPSBzZWdzLm51bWJlck9mSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcclxuICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3MuZ2V0SXRlbShpKSxcclxuICAgICAgICAgICAgICAgIHNlZ1R5cGUgPSBzZWcucGF0aFNlZ1R5cGVBc0xldHRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICgvW01MSFZDU1FUQV0vLnRlc3Qoc2VnVHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICgneCcgaW4gc2VnKSB4ID0gc2VnLng7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ3knIGluIHNlZykgeSA9IHNlZy55O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCd4MScgaW4gc2VnKSB4MSA9IHggKyBzZWcueDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ3gyJyBpbiBzZWcpIHgyID0geCArIHNlZy54MjtcclxuICAgICAgICAgICAgICAgIGlmICgneTEnIGluIHNlZykgeTEgPSB5ICsgc2VnLnkxO1xyXG4gICAgICAgICAgICAgICAgaWYgKCd5MicgaW4gc2VnKSB5MiA9IHkgKyBzZWcueTI7XHJcbiAgICAgICAgICAgICAgICBpZiAoJ3gnIGluIHNlZykgeCArPSBzZWcueDtcclxuICAgICAgICAgICAgICAgIGlmICgneScgaW4gc2VnKSB5ICs9IHNlZy55O1xyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VnVHlwZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzKHgsIHkpLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2wnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnTGluZXRvQWJzKHgsIHkpLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyh4KSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICd2JzpcclxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzKHkpLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2MnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzKHgsIHksIHgxLCB5MSwgeDIsIHkyKSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzJzpcclxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicyh4LCB5LCB4MiwgeTIpLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3EnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0Ficyh4LCB5LCB4MSwgeTEpLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxyXG4gICAgICAgICAgICAgICAgICAgIHNlZ3MucmVwbGFjZUl0ZW0ocGF0aC5jcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyh4LCB5KSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdhJzpcclxuICAgICAgICAgICAgICAgICAgICBzZWdzLnJlcGxhY2VJdGVtKHBhdGguY3JlYXRlU1ZHUGF0aFNlZ0FyY0Ficyh4LCB5LCBzZWcucjEsIHNlZy5yMiwgc2VnLmFuZ2xlLCBzZWcubGFyZ2VBcmNGbGFnLCBzZWcuc3dlZXBGbGFnKSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICd6JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1onOlxyXG4gICAgICAgICAgICAgICAgICAgIHggPSB4MDtcclxuICAgICAgICAgICAgICAgICAgICB5ID0geTA7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VnVHlwZSA9PSAnTScgfHwgc2VnVHlwZSA9PSAnbScpIHtcclxuICAgICAgICAgICAgICAgIHgwID0geDtcclxuICAgICAgICAgICAgICAgIHkwID0geTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG59KSgpOyIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyLlZlY3RvcmAgbW9kdWxlIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgdmVjdG9ycy5cclxuKiBWZWN0b3JzIGFyZSB0aGUgYmFzaXMgb2YgYWxsIHRoZSBnZW9tZXRyeSByZWxhdGVkIG9wZXJhdGlvbnMgaW4gdGhlIGVuZ2luZS5cclxuKiBBIGBNYXR0ZXIuVmVjdG9yYCBvYmplY3QgaXMgb2YgdGhlIGZvcm0gYHsgeDogMCwgeTogMCB9YC5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgVmVjdG9yXHJcbiovXHJcblxyXG4vLyBUT0RPOiBjb25zaWRlciBwYXJhbXMgZm9yIHJldXNpbmcgdmVjdG9yIG9iamVjdHNcclxuXHJcbnZhciBWZWN0b3IgPSB7fTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yO1xyXG5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB2ZWN0b3IuXHJcbiAgICAgKiBAbWV0aG9kIGNyZWF0ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5XHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvclxyXG4gICAgICovXHJcbiAgICBWZWN0b3IuY3JlYXRlID0gZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICAgIHJldHVybiB7IHg6IHggfHwgMCwgeTogeSB8fCAwIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCBgeGAgYW5kIGB5YCBjb3BpZWQgZnJvbSB0aGUgZ2l2ZW4gYHZlY3RvcmAuXHJcbiAgICAgKiBAbWV0aG9kIGNsb25lXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IGNsb25lZCB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLmNsb25lID0gZnVuY3Rpb24odmVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmVjdG9yLngsIHk6IHZlY3Rvci55IH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIGEgdmVjdG9yLlxyXG4gICAgICogQG1ldGhvZCBtYWduaXR1ZGVcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1hZ25pdHVkZSBvZiB0aGUgdmVjdG9yXHJcbiAgICAgKi9cclxuICAgIFZlY3Rvci5tYWduaXR1ZGUgPSBmdW5jdGlvbih2ZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh2ZWN0b3IueCAqIHZlY3Rvci54KSArICh2ZWN0b3IueSAqIHZlY3Rvci55KSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFnbml0dWRlIChsZW5ndGgpIG9mIGEgdmVjdG9yICh0aGVyZWZvcmUgc2F2aW5nIGEgYHNxcnRgIG9wZXJhdGlvbikuXHJcbiAgICAgKiBAbWV0aG9kIG1hZ25pdHVkZVNxdWFyZWRcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgbWFnbml0dWRlIG9mIHRoZSB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQgPSBmdW5jdGlvbih2ZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gKHZlY3Rvci54ICogdmVjdG9yLngpICsgKHZlY3Rvci55ICogdmVjdG9yLnkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZXMgdGhlIHZlY3RvciBhYm91dCAoMCwgMCkgYnkgc3BlY2lmaWVkIGFuZ2xlLlxyXG4gICAgICogQG1ldGhvZCByb3RhdGVcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IFRoZSB2ZWN0b3Igcm90YXRlZCBhYm91dCAoMCwgMClcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLnJvdGF0ZSA9IGZ1bmN0aW9uKHZlY3RvciwgYW5nbGUsIG91dHB1dCkge1xyXG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcclxuICAgICAgICBpZiAoIW91dHB1dCkgb3V0cHV0ID0ge307XHJcbiAgICAgICAgdmFyIHggPSB2ZWN0b3IueCAqIGNvcyAtIHZlY3Rvci55ICogc2luO1xyXG4gICAgICAgIG91dHB1dC55ID0gdmVjdG9yLnggKiBzaW4gKyB2ZWN0b3IueSAqIGNvcztcclxuICAgICAgICBvdXRwdXQueCA9IHg7XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoZSB2ZWN0b3IgYWJvdXQgYSBzcGVjaWZpZWQgcG9pbnQgYnkgc3BlY2lmaWVkIGFuZ2xlLlxyXG4gICAgICogQG1ldGhvZCByb3RhdGVBYm91dFxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9pbnRcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBbb3V0cHV0XVxyXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyB2ZWN0b3Igcm90YXRlZCBhYm91dCB0aGUgcG9pbnRcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLnJvdGF0ZUFib3V0ID0gZnVuY3Rpb24odmVjdG9yLCBhbmdsZSwgcG9pbnQsIG91dHB1dCkge1xyXG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcclxuICAgICAgICBpZiAoIW91dHB1dCkgb3V0cHV0ID0ge307XHJcbiAgICAgICAgdmFyIHggPSBwb2ludC54ICsgKCh2ZWN0b3IueCAtIHBvaW50LngpICogY29zIC0gKHZlY3Rvci55IC0gcG9pbnQueSkgKiBzaW4pO1xyXG4gICAgICAgIG91dHB1dC55ID0gcG9pbnQueSArICgodmVjdG9yLnggLSBwb2ludC54KSAqIHNpbiArICh2ZWN0b3IueSAtIHBvaW50LnkpICogY29zKTtcclxuICAgICAgICBvdXRwdXQueCA9IHg7XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxpc2VzIGEgdmVjdG9yIChzdWNoIHRoYXQgaXRzIG1hZ25pdHVkZSBpcyBgMWApLlxyXG4gICAgICogQG1ldGhvZCBub3JtYWxpc2VcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JcclxuICAgICAqIEByZXR1cm4ge3ZlY3Rvcn0gQSBuZXcgdmVjdG9yIG5vcm1hbGlzZWRcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLm5vcm1hbGlzZSA9IGZ1bmN0aW9uKHZlY3Rvcikge1xyXG4gICAgICAgIHZhciBtYWduaXR1ZGUgPSBWZWN0b3IubWFnbml0dWRlKHZlY3Rvcik7XHJcbiAgICAgICAgaWYgKG1hZ25pdHVkZSA9PT0gMClcclxuICAgICAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xyXG4gICAgICAgIHJldHVybiB7IHg6IHZlY3Rvci54IC8gbWFnbml0dWRlLCB5OiB2ZWN0b3IueSAvIG1hZ25pdHVkZSB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRvdC1wcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlxyXG4gICAgICogQG1ldGhvZCBkb3RcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZG90IHByb2R1Y3Qgb2YgdGhlIHR3byB2ZWN0b3JzXHJcbiAgICAgKi9cclxuICAgIFZlY3Rvci5kb3QgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCKSB7XHJcbiAgICAgICAgcmV0dXJuICh2ZWN0b3JBLnggKiB2ZWN0b3JCLngpICsgKHZlY3RvckEueSAqIHZlY3RvckIueSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0d28gdmVjdG9ycy5cclxuICAgICAqIEBtZXRob2QgY3Jvc3NcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgdHdvIHZlY3RvcnNcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLmNyb3NzID0gZnVuY3Rpb24odmVjdG9yQSwgdmVjdG9yQikge1xyXG4gICAgICAgIHJldHVybiAodmVjdG9yQS54ICogdmVjdG9yQi55KSAtICh2ZWN0b3JBLnkgKiB2ZWN0b3JCLngpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhyZWUgdmVjdG9ycy5cclxuICAgICAqIEBtZXRob2QgY3Jvc3MzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQVxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvckJcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JDXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoZSB0aHJlZSB2ZWN0b3JzXHJcbiAgICAgKi9cclxuICAgIFZlY3Rvci5jcm9zczMgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCLCB2ZWN0b3JDKSB7XHJcbiAgICAgICAgcmV0dXJuICh2ZWN0b3JCLnggLSB2ZWN0b3JBLngpICogKHZlY3RvckMueSAtIHZlY3RvckEueSkgLSAodmVjdG9yQi55IC0gdmVjdG9yQS55KSAqICh2ZWN0b3JDLnggLSB2ZWN0b3JBLngpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIHR3byB2ZWN0b3JzLlxyXG4gICAgICogQG1ldGhvZCBhZGRcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvciBvZiB2ZWN0b3JBIGFuZCB2ZWN0b3JCIGFkZGVkXHJcbiAgICAgKi9cclxuICAgIFZlY3Rvci5hZGQgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCLCBvdXRwdXQpIHtcclxuICAgICAgICBpZiAoIW91dHB1dCkgb3V0cHV0ID0ge307XHJcbiAgICAgICAgb3V0cHV0LnggPSB2ZWN0b3JBLnggKyB2ZWN0b3JCLng7XHJcbiAgICAgICAgb3V0cHV0LnkgPSB2ZWN0b3JBLnkgKyB2ZWN0b3JCLnk7XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdWJ0cmFjdHMgdGhlIHR3byB2ZWN0b3JzLlxyXG4gICAgICogQG1ldGhvZCBzdWJcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IFtvdXRwdXRdXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvciBvZiB2ZWN0b3JBIGFuZCB2ZWN0b3JCIHN1YnRyYWN0ZWRcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLnN1YiA9IGZ1bmN0aW9uKHZlY3RvckEsIHZlY3RvckIsIG91dHB1dCkge1xyXG4gICAgICAgIGlmICghb3V0cHV0KSBvdXRwdXQgPSB7fTtcclxuICAgICAgICBvdXRwdXQueCA9IHZlY3RvckEueCAtIHZlY3RvckIueDtcclxuICAgICAgICBvdXRwdXQueSA9IHZlY3RvckEueSAtIHZlY3RvckIueTtcclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGxpZXMgYSB2ZWN0b3IgYW5kIGEgc2NhbGFyLlxyXG4gICAgICogQG1ldGhvZCBtdWx0XHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IEEgbmV3IHZlY3RvciBtdWx0aXBsaWVkIGJ5IHNjYWxhclxyXG4gICAgICovXHJcbiAgICBWZWN0b3IubXVsdCA9IGZ1bmN0aW9uKHZlY3Rvciwgc2NhbGFyKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmVjdG9yLnggKiBzY2FsYXIsIHk6IHZlY3Rvci55ICogc2NhbGFyIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyBhIHZlY3RvciBhbmQgYSBzY2FsYXIuXHJcbiAgICAgKiBAbWV0aG9kIGRpdlxyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhclxyXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBBIG5ldyB2ZWN0b3IgZGl2aWRlZCBieSBzY2FsYXJcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLmRpdiA9IGZ1bmN0aW9uKHZlY3Rvciwgc2NhbGFyKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogdmVjdG9yLnggLyBzY2FsYXIsIHk6IHZlY3Rvci55IC8gc2NhbGFyIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcGVycGVuZGljdWxhciB2ZWN0b3IuIFNldCBgbmVnYXRlYCB0byB0cnVlIGZvciB0aGUgcGVycGVuZGljdWxhciBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLlxyXG4gICAgICogQG1ldGhvZCBwZXJwXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtuZWdhdGU9ZmFsc2VdXHJcbiAgICAgKiBAcmV0dXJuIHt2ZWN0b3J9IFRoZSBwZXJwZW5kaWN1bGFyIHZlY3RvclxyXG4gICAgICovXHJcbiAgICBWZWN0b3IucGVycCA9IGZ1bmN0aW9uKHZlY3RvciwgbmVnYXRlKSB7XHJcbiAgICAgICAgbmVnYXRlID0gbmVnYXRlID09PSB0cnVlID8gLTEgOiAxO1xyXG4gICAgICAgIHJldHVybiB7IHg6IG5lZ2F0ZSAqIC12ZWN0b3IueSwgeTogbmVnYXRlICogdmVjdG9yLnggfTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGVzIGJvdGggY29tcG9uZW50cyBvZiBhIHZlY3RvciBzdWNoIHRoYXQgaXQgcG9pbnRzIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uXHJcbiAgICAgKiBAbWV0aG9kIG5lZ1xyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxyXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBUaGUgbmVnYXRlZCB2ZWN0b3JcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLm5lZyA9IGZ1bmN0aW9uKHZlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiB7IHg6IC12ZWN0b3IueCwgeTogLXZlY3Rvci55IH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgdmVjdG9yIGB2ZWN0b3JCIC0gdmVjdG9yQWAgYW5kIHRoZSB4LWF4aXMgaW4gcmFkaWFucy5cclxuICAgICAqIEBtZXRob2QgYW5nbGVcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSB2ZWN0b3JBXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gdmVjdG9yQlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gICAgICovXHJcbiAgICBWZWN0b3IuYW5nbGUgPSBmdW5jdGlvbih2ZWN0b3JBLCB2ZWN0b3JCKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodmVjdG9yQi55IC0gdmVjdG9yQS55LCB2ZWN0b3JCLnggLSB2ZWN0b3JBLngpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbXBvcmFyeSB2ZWN0b3IgcG9vbCAobm90IHRocmVhZC1zYWZlKS5cclxuICAgICAqIEBwcm9wZXJ0eSBfdGVtcFxyXG4gICAgICogQHR5cGUge3ZlY3RvcltdfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgVmVjdG9yLl90ZW1wID0gW1xyXG4gICAgICAgIFZlY3Rvci5jcmVhdGUoKSwgVmVjdG9yLmNyZWF0ZSgpLCBcclxuICAgICAgICBWZWN0b3IuY3JlYXRlKCksIFZlY3Rvci5jcmVhdGUoKSwgXHJcbiAgICAgICAgVmVjdG9yLmNyZWF0ZSgpLCBWZWN0b3IuY3JlYXRlKClcclxuICAgIF07XHJcblxyXG59KSgpOyIsIi8qKlxyXG4qIFRoZSBgTWF0dGVyLlZlcnRpY2VzYCBtb2R1bGUgY29udGFpbnMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBzZXRzIG9mIHZlcnRpY2VzLlxyXG4qIEEgc2V0IG9mIHZlcnRpY2VzIGlzIGFuIGFycmF5IG9mIGBNYXR0ZXIuVmVjdG9yYCB3aXRoIGFkZGl0aW9uYWwgaW5kZXhpbmcgcHJvcGVydGllcyBpbnNlcnRlZCBieSBgVmVydGljZXMuY3JlYXRlYC5cclxuKiBBIGBNYXR0ZXIuQm9keWAgbWFpbnRhaW5zIGEgc2V0IG9mIHZlcnRpY2VzIHRvIHJlcHJlc2VudCB0aGUgc2hhcGUgb2YgdGhlIG9iamVjdCAoaXRzIGNvbnZleCBodWxsKS5cclxuKlxyXG4qIFNlZSB0aGUgaW5jbHVkZWQgdXNhZ2UgW2V4YW1wbGVzXShodHRwczovL2dpdGh1Yi5jb20vbGlhYnJ1L21hdHRlci1qcy90cmVlL21hc3Rlci9leGFtcGxlcykuXHJcbipcclxuKiBAY2xhc3MgVmVydGljZXNcclxuKi9cclxuXHJcbnZhciBWZXJ0aWNlcyA9IHt9O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWZXJ0aWNlcztcclxuXHJcbnZhciBWZWN0b3IgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9WZWN0b3InKTtcclxudmFyIENvbW1vbiA9IHJlcXVpcmUoJy4uL2NvcmUvQ29tbW9uJyk7XHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNldCBvZiBgTWF0dGVyLkJvZHlgIGNvbXBhdGlibGUgdmVydGljZXMuXHJcbiAgICAgKiBUaGUgYHBvaW50c2AgYXJndW1lbnQgYWNjZXB0cyBhbiBhcnJheSBvZiBgTWF0dGVyLlZlY3RvcmAgcG9pbnRzIG9yaWVudGF0ZWQgYXJvdW5kIHRoZSBvcmlnaW4gYCgwLCAwKWAsIGZvciBleGFtcGxlOlxyXG4gICAgICpcclxuICAgICAqICAgICBbeyB4OiAwLCB5OiAwIH0sIHsgeDogMjUsIHk6IDUwIH0sIHsgeDogNTAsIHk6IDAgfV1cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYFZlcnRpY2VzLmNyZWF0ZWAgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkgb2YgdmVydGljZXMsIHdoaWNoIGFyZSBzaW1pbGFyIHRvIE1hdHRlci5WZWN0b3Igb2JqZWN0cyxcclxuICAgICAqIGJ1dCB3aXRoIHNvbWUgYWRkaXRpb25hbCByZWZlcmVuY2VzIHJlcXVpcmVkIGZvciBlZmZpY2llbnQgY29sbGlzaW9uIGRldGVjdGlvbiByb3V0aW5lcy5cclxuICAgICAqXHJcbiAgICAgKiBWZXJ0aWNlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGF0IHRoZSBgYm9keWAgYXJndW1lbnQgaXMgbm90IG9wdGlvbmFsLCBhIGBNYXR0ZXIuQm9keWAgcmVmZXJlbmNlIG11c3QgYmUgcHJvdmlkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBjcmVhdGVcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yW119IHBvaW50c1xyXG4gICAgICogQHBhcmFtIHtib2R5fSBib2R5XHJcbiAgICAgKi9cclxuICAgIFZlcnRpY2VzLmNyZWF0ZSA9IGZ1bmN0aW9uKHBvaW50cywgYm9keSkge1xyXG4gICAgICAgIHZhciB2ZXJ0aWNlcyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV0sXHJcbiAgICAgICAgICAgICAgICB2ZXJ0ZXggPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogcG9pbnQueCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBwb2ludC55LFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbnRlcm5hbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG51bGxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2ZXJ0ZXguY29udGFjdCA9IHtcclxuICAgICAgICAgICAgICAgIHZlcnRleDogdmVydGV4LFxyXG4gICAgICAgICAgICAgICAgbm9ybWFsSW1wdWxzZTogMCxcclxuICAgICAgICAgICAgICAgIHRhbmdlbnRJbXB1bHNlOiAwXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHZlcnRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmVydGljZXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb3JkZXJlZCB4IHkgcGFpcnMgc2VwYXJhdGVkIGJ5IHNwYWNlcyAoYW5kIG9wdGlvbmFsbHkgY29tbWFzKSwgXHJcbiAgICAgKiBpbnRvIGEgYE1hdHRlci5WZXJ0aWNlc2Agb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYE1hdHRlci5Cb2R5YC5cclxuICAgICAqIEZvciBwYXJzaW5nIFNWRyBwYXRocywgc2VlIGBTdmcucGF0aFRvVmVydGljZXNgLlxyXG4gICAgICogQG1ldGhvZCBmcm9tUGF0aFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcclxuICAgICAqIEBwYXJhbSB7Ym9keX0gYm9keVxyXG4gICAgICogQHJldHVybiB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKi9cclxuICAgIFZlcnRpY2VzLmZyb21QYXRoID0gZnVuY3Rpb24ocGF0aCwgYm9keSkge1xyXG4gICAgICAgIHZhciBwYXRoUGF0dGVybiA9IC9MP1xccyooWy1cXGQuZV0rKVtcXHMsXSooWy1cXGQuZV0rKSovaWcsXHJcbiAgICAgICAgICAgIHBvaW50cyA9IFtdO1xyXG5cclxuICAgICAgICBwYXRoLnJlcGxhY2UocGF0aFBhdHRlcm4sIGZ1bmN0aW9uKG1hdGNoLCB4LCB5KSB7XHJcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHsgeDogcGFyc2VGbG9hdCh4KSwgeTogcGFyc2VGbG9hdCh5KSB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFZlcnRpY2VzLmNyZWF0ZShwb2ludHMsIGJvZHkpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGNlbnRyZSAoY2VudHJvaWQpIG9mIHRoZSBzZXQgb2YgdmVydGljZXMuXHJcbiAgICAgKiBAbWV0aG9kIGNlbnRyZVxyXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcclxuICAgICAqIEByZXR1cm4ge3ZlY3Rvcn0gVGhlIGNlbnRyZSBwb2ludFxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5jZW50cmUgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xyXG4gICAgICAgIHZhciBhcmVhID0gVmVydGljZXMuYXJlYSh2ZXJ0aWNlcywgdHJ1ZSksXHJcbiAgICAgICAgICAgIGNlbnRyZSA9IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICBjcm9zcyxcclxuICAgICAgICAgICAgdGVtcCxcclxuICAgICAgICAgICAgajtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBqID0gKGkgKyAxKSAlIHZlcnRpY2VzLmxlbmd0aDtcclxuICAgICAgICAgICAgY3Jvc3MgPSBWZWN0b3IuY3Jvc3ModmVydGljZXNbaV0sIHZlcnRpY2VzW2pdKTtcclxuICAgICAgICAgICAgdGVtcCA9IFZlY3Rvci5tdWx0KFZlY3Rvci5hZGQodmVydGljZXNbaV0sIHZlcnRpY2VzW2pdKSwgY3Jvc3MpO1xyXG4gICAgICAgICAgICBjZW50cmUgPSBWZWN0b3IuYWRkKGNlbnRyZSwgdGVtcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gVmVjdG9yLmRpdihjZW50cmUsIDYgKiBhcmVhKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIChtZWFuKSBvZiB0aGUgc2V0IG9mIHZlcnRpY2VzLlxyXG4gICAgICogQG1ldGhvZCBtZWFuXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHJldHVybiB7dmVjdG9yfSBUaGUgYXZlcmFnZSBwb2ludFxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5tZWFuID0gZnVuY3Rpb24odmVydGljZXMpIHtcclxuICAgICAgICB2YXIgYXZlcmFnZSA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGF2ZXJhZ2UueCArPSB2ZXJ0aWNlc1tpXS54O1xyXG4gICAgICAgICAgICBhdmVyYWdlLnkgKz0gdmVydGljZXNbaV0ueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBWZWN0b3IuZGl2KGF2ZXJhZ2UsIHZlcnRpY2VzLmxlbmd0aCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYXJlYSBvZiB0aGUgc2V0IG9mIHZlcnRpY2VzLlxyXG4gICAgICogQG1ldGhvZCBhcmVhXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHBhcmFtIHtib29sfSBzaWduZWRcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWFcclxuICAgICAqL1xyXG4gICAgVmVydGljZXMuYXJlYSA9IGZ1bmN0aW9uKHZlcnRpY2VzLCBzaWduZWQpIHtcclxuICAgICAgICB2YXIgYXJlYSA9IDAsXHJcbiAgICAgICAgICAgIGogPSB2ZXJ0aWNlcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGFyZWEgKz0gKHZlcnRpY2VzW2pdLnggLSB2ZXJ0aWNlc1tpXS54KSAqICh2ZXJ0aWNlc1tqXS55ICsgdmVydGljZXNbaV0ueSk7XHJcbiAgICAgICAgICAgIGogPSBpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNpZ25lZClcclxuICAgICAgICAgICAgcmV0dXJuIGFyZWEgLyAyO1xyXG5cclxuICAgICAgICByZXR1cm4gTWF0aC5hYnMoYXJlYSkgLyAyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1vbWVudCBvZiBpbmVydGlhIChzZWNvbmQgbW9tZW50IG9mIGFyZWEpIG9mIHRoZSBzZXQgb2YgdmVydGljZXMgZ2l2ZW4gdGhlIHRvdGFsIG1hc3MuXHJcbiAgICAgKiBAbWV0aG9kIGluZXJ0aWFcclxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWFzc1xyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgcG9seWdvbidzIG1vbWVudCBvZiBpbmVydGlhXHJcbiAgICAgKi9cclxuICAgIFZlcnRpY2VzLmluZXJ0aWEgPSBmdW5jdGlvbih2ZXJ0aWNlcywgbWFzcykge1xyXG4gICAgICAgIHZhciBudW1lcmF0b3IgPSAwLFxyXG4gICAgICAgICAgICBkZW5vbWluYXRvciA9IDAsXHJcbiAgICAgICAgICAgIHYgPSB2ZXJ0aWNlcyxcclxuICAgICAgICAgICAgY3Jvc3MsXHJcbiAgICAgICAgICAgIGo7XHJcblxyXG4gICAgICAgIC8vIGZpbmQgdGhlIHBvbHlnb24ncyBtb21lbnQgb2YgaW5lcnRpYSwgdXNpbmcgc2Vjb25kIG1vbWVudCBvZiBhcmVhXHJcbiAgICAgICAgLy8gZnJvbSBlcXVhdGlvbnMgYXQgaHR0cDovL3d3dy5waHlzaWNzZm9ydW1zLmNvbS9zaG93dGhyZWFkLnBocD90PTI1MjkzXHJcbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB2Lmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgIGogPSAobiArIDEpICUgdi5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNyb3NzID0gTWF0aC5hYnMoVmVjdG9yLmNyb3NzKHZbal0sIHZbbl0pKTtcclxuICAgICAgICAgICAgbnVtZXJhdG9yICs9IGNyb3NzICogKFZlY3Rvci5kb3QodltqXSwgdltqXSkgKyBWZWN0b3IuZG90KHZbal0sIHZbbl0pICsgVmVjdG9yLmRvdCh2W25dLCB2W25dKSk7XHJcbiAgICAgICAgICAgIGRlbm9taW5hdG9yICs9IGNyb3NzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChtYXNzIC8gNikgKiAobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZXMgdGhlIHNldCBvZiB2ZXJ0aWNlcyBpbi1wbGFjZS5cclxuICAgICAqIEBtZXRob2QgdHJhbnNsYXRlXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHBhcmFtIHt2ZWN0b3J9IHZlY3RvclxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhclxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy50cmFuc2xhdGUgPSBmdW5jdGlvbih2ZXJ0aWNlcywgdmVjdG9yLCBzY2FsYXIpIHtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICBpZiAoc2NhbGFyKSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmVydGljZXNbaV0ueCArPSB2ZWN0b3IueCAqIHNjYWxhcjtcclxuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2ldLnkgKz0gdmVjdG9yLnkgKiBzY2FsYXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2ldLnggKz0gdmVjdG9yLng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXS55ICs9IHZlY3Rvci55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmVydGljZXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB0aGUgc2V0IG9mIHZlcnRpY2VzIGluLXBsYWNlLlxyXG4gICAgICogQG1ldGhvZCByb3RhdGVcclxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGVcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb2ludFxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5yb3RhdGUgPSBmdW5jdGlvbih2ZXJ0aWNlcywgYW5nbGUsIHBvaW50KSB7XHJcbiAgICAgICAgaWYgKGFuZ2xlID09PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXHJcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgdmVydGljZSA9IHZlcnRpY2VzW2ldLFxyXG4gICAgICAgICAgICAgICAgZHggPSB2ZXJ0aWNlLnggLSBwb2ludC54LFxyXG4gICAgICAgICAgICAgICAgZHkgPSB2ZXJ0aWNlLnkgLSBwb2ludC55O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZlcnRpY2UueCA9IHBvaW50LnggKyAoZHggKiBjb3MgLSBkeSAqIHNpbik7XHJcbiAgICAgICAgICAgIHZlcnRpY2UueSA9IHBvaW50LnkgKyAoZHggKiBzaW4gKyBkeSAqIGNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmVydGljZXM7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBwb2ludGAgaXMgaW5zaWRlIHRoZSBzZXQgb2YgYHZlcnRpY2VzYC5cclxuICAgICAqIEBtZXRob2QgY29udGFpbnNcclxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKiBAcGFyYW0ge3ZlY3Rvcn0gcG9pbnRcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZlcnRpY2VzIGNvbnRhaW5zIHBvaW50LCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgVmVydGljZXMuY29udGFpbnMgPSBmdW5jdGlvbih2ZXJ0aWNlcywgcG9pbnQpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB2ZXJ0aWNlID0gdmVydGljZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBuZXh0VmVydGljZSA9IHZlcnRpY2VzWyhpICsgMSkgJSB2ZXJ0aWNlcy5sZW5ndGhdO1xyXG4gICAgICAgICAgICBpZiAoKHBvaW50LnggLSB2ZXJ0aWNlLngpICogKG5leHRWZXJ0aWNlLnkgLSB2ZXJ0aWNlLnkpICsgKHBvaW50LnkgLSB2ZXJ0aWNlLnkpICogKHZlcnRpY2UueCAtIG5leHRWZXJ0aWNlLngpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FsZXMgdGhlIHZlcnRpY2VzIGZyb20gYSBwb2ludCAoZGVmYXVsdCBpcyBjZW50cmUpIGluLXBsYWNlLlxyXG4gICAgICogQG1ldGhvZCBzY2FsZVxyXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVhcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVlcclxuICAgICAqIEBwYXJhbSB7dmVjdG9yfSBwb2ludFxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5zY2FsZSA9IGZ1bmN0aW9uKHZlcnRpY2VzLCBzY2FsZVgsIHNjYWxlWSwgcG9pbnQpIHtcclxuICAgICAgICBpZiAoc2NhbGVYID09PSAxICYmIHNjYWxlWSA9PT0gMSlcclxuICAgICAgICAgICAgcmV0dXJuIHZlcnRpY2VzO1xyXG5cclxuICAgICAgICBwb2ludCA9IHBvaW50IHx8IFZlcnRpY2VzLmNlbnRyZSh2ZXJ0aWNlcyk7XHJcblxyXG4gICAgICAgIHZhciB2ZXJ0ZXgsXHJcbiAgICAgICAgICAgIGRlbHRhO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZlcnRleCA9IHZlcnRpY2VzW2ldO1xyXG4gICAgICAgICAgICBkZWx0YSA9IFZlY3Rvci5zdWIodmVydGV4LCBwb2ludCk7XHJcbiAgICAgICAgICAgIHZlcnRpY2VzW2ldLnggPSBwb2ludC54ICsgZGVsdGEueCAqIHNjYWxlWDtcclxuICAgICAgICAgICAgdmVydGljZXNbaV0ueSA9IHBvaW50LnkgKyBkZWx0YS55ICogc2NhbGVZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZlcnRpY2VzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW1mZXJzIGEgc2V0IG9mIHZlcnRpY2VzIGJ5IGdpdmluZyB0aGVtIHJvdW5kZWQgY29ybmVycywgcmV0dXJucyBhIG5ldyBzZXQgb2YgdmVydGljZXMuXHJcbiAgICAgKiBUaGUgcmFkaXVzIHBhcmFtZXRlciBpcyBhIHNpbmdsZSBudW1iZXIgb3IgYW4gYXJyYXkgdG8gc3BlY2lmeSB0aGUgcmFkaXVzIGZvciBlYWNoIHZlcnRleC5cclxuICAgICAqIEBtZXRob2QgY2hhbWZlclxyXG4gICAgICogQHBhcmFtIHt2ZXJ0aWNlc30gdmVydGljZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJhZGl1c1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHF1YWxpdHlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBxdWFsaXR5TWluXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcXVhbGl0eU1heFxyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5jaGFtZmVyID0gZnVuY3Rpb24odmVydGljZXMsIHJhZGl1cywgcXVhbGl0eSwgcXVhbGl0eU1pbiwgcXVhbGl0eU1heCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcmFkaXVzID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICByYWRpdXMgPSBbcmFkaXVzXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRpdXMgPSByYWRpdXMgfHwgWzhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcXVhbGl0eSBkZWZhdWx0cyB0byAtMSwgd2hpY2ggaXMgYXV0b1xyXG4gICAgICAgIHF1YWxpdHkgPSAodHlwZW9mIHF1YWxpdHkgIT09ICd1bmRlZmluZWQnKSA/IHF1YWxpdHkgOiAtMTtcclxuICAgICAgICBxdWFsaXR5TWluID0gcXVhbGl0eU1pbiB8fCAyO1xyXG4gICAgICAgIHF1YWxpdHlNYXggPSBxdWFsaXR5TWF4IHx8IDE0O1xyXG5cclxuICAgICAgICB2YXIgbmV3VmVydGljZXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcHJldlZlcnRleCA9IHZlcnRpY2VzW2kgLSAxID49IDAgPyBpIC0gMSA6IHZlcnRpY2VzLmxlbmd0aCAtIDFdLFxyXG4gICAgICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV0sXHJcbiAgICAgICAgICAgICAgICBuZXh0VmVydGV4ID0gdmVydGljZXNbKGkgKyAxKSAlIHZlcnRpY2VzLmxlbmd0aF0sXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UmFkaXVzID0gcmFkaXVzW2kgPCByYWRpdXMubGVuZ3RoID8gaSA6IHJhZGl1cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UmFkaXVzID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdWZXJ0aWNlcy5wdXNoKHZlcnRleCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHByZXZOb3JtYWwgPSBWZWN0b3Iubm9ybWFsaXNlKHsgXHJcbiAgICAgICAgICAgICAgICB4OiB2ZXJ0ZXgueSAtIHByZXZWZXJ0ZXgueSwgXHJcbiAgICAgICAgICAgICAgICB5OiBwcmV2VmVydGV4LnggLSB2ZXJ0ZXgueFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBuZXh0Tm9ybWFsID0gVmVjdG9yLm5vcm1hbGlzZSh7IFxyXG4gICAgICAgICAgICAgICAgeDogbmV4dFZlcnRleC55IC0gdmVydGV4LnksIFxyXG4gICAgICAgICAgICAgICAgeTogdmVydGV4LnggLSBuZXh0VmVydGV4LnhcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGlhZ29uYWxSYWRpdXMgPSBNYXRoLnNxcnQoMiAqIE1hdGgucG93KGN1cnJlbnRSYWRpdXMsIDIpKSxcclxuICAgICAgICAgICAgICAgIHJhZGl1c1ZlY3RvciA9IFZlY3Rvci5tdWx0KENvbW1vbi5jbG9uZShwcmV2Tm9ybWFsKSwgY3VycmVudFJhZGl1cyksXHJcbiAgICAgICAgICAgICAgICBtaWROb3JtYWwgPSBWZWN0b3Iubm9ybWFsaXNlKFZlY3Rvci5tdWx0KFZlY3Rvci5hZGQocHJldk5vcm1hbCwgbmV4dE5vcm1hbCksIDAuNSkpLFxyXG4gICAgICAgICAgICAgICAgc2NhbGVkVmVydGV4ID0gVmVjdG9yLnN1Yih2ZXJ0ZXgsIFZlY3Rvci5tdWx0KG1pZE5vcm1hbCwgZGlhZ29uYWxSYWRpdXMpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcmVjaXNpb24gPSBxdWFsaXR5O1xyXG5cclxuICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRlY2lkZSBwcmVjaXNpb25cclxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9IE1hdGgucG93KGN1cnJlbnRSYWRpdXMsIDAuMzIpICogMS43NTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcHJlY2lzaW9uID0gQ29tbW9uLmNsYW1wKHByZWNpc2lvbiwgcXVhbGl0eU1pbiwgcXVhbGl0eU1heCk7XHJcblxyXG4gICAgICAgICAgICAvLyB1c2UgYW4gZXZlbiB2YWx1ZSBmb3IgcHJlY2lzaW9uLCBtb3JlIGxpa2VseSB0byByZWR1Y2UgYXhlcyBieSB1c2luZyBzeW1tZXRyeVxyXG4gICAgICAgICAgICBpZiAocHJlY2lzaW9uICUgMiA9PT0gMSlcclxuICAgICAgICAgICAgICAgIHByZWNpc2lvbiArPSAxO1xyXG5cclxuICAgICAgICAgICAgdmFyIGFscGhhID0gTWF0aC5hY29zKFZlY3Rvci5kb3QocHJldk5vcm1hbCwgbmV4dE5vcm1hbCkpLFxyXG4gICAgICAgICAgICAgICAgdGhldGEgPSBhbHBoYSAvIHByZWNpc2lvbjtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJlY2lzaW9uOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIG5ld1ZlcnRpY2VzLnB1c2goVmVjdG9yLmFkZChWZWN0b3Iucm90YXRlKHJhZGl1c1ZlY3RvciwgdGhldGEgKiBqKSwgc2NhbGVkVmVydGV4KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdWZXJ0aWNlcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3J0cyB0aGUgaW5wdXQgdmVydGljZXMgaW50byBjbG9ja3dpc2Ugb3JkZXIgaW4gcGxhY2UuXHJcbiAgICAgKiBAbWV0aG9kIGNsb2Nrd2lzZVNvcnRcclxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKiBAcmV0dXJuIHt2ZXJ0aWNlc30gdmVydGljZXNcclxuICAgICAqL1xyXG4gICAgVmVydGljZXMuY2xvY2t3aXNlU29ydCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XHJcbiAgICAgICAgdmFyIGNlbnRyZSA9IFZlcnRpY2VzLm1lYW4odmVydGljZXMpO1xyXG5cclxuICAgICAgICB2ZXJ0aWNlcy5zb3J0KGZ1bmN0aW9uKHZlcnRleEEsIHZlcnRleEIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFZlY3Rvci5hbmdsZShjZW50cmUsIHZlcnRleEEpIC0gVmVjdG9yLmFuZ2xlKGNlbnRyZSwgdmVydGV4Qik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2ZXJ0aWNlcztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZlcnRpY2VzIGZvcm0gYSBjb252ZXggc2hhcGUgKHZlcnRpY2VzIG11c3QgYmUgaW4gY2xvY2t3aXNlIG9yZGVyKS5cclxuICAgICAqIEBtZXRob2QgaXNDb252ZXhcclxuICAgICAqIEBwYXJhbSB7dmVydGljZXN9IHZlcnRpY2VzXHJcbiAgICAgKiBAcmV0dXJuIHtib29sfSBgdHJ1ZWAgaWYgdGhlIGB2ZXJ0aWNlc2AgYXJlIGNvbnZleCwgYGZhbHNlYCBpZiBub3QgKG9yIGBudWxsYCBpZiBub3QgY29tcHV0YWJsZSkuXHJcbiAgICAgKi9cclxuICAgIFZlcnRpY2VzLmlzQ29udmV4ID0gZnVuY3Rpb24odmVydGljZXMpIHtcclxuICAgICAgICAvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvZ2VvbWV0cnkvcG9seWdvbm1lc2gvXHJcbiAgICAgICAgLy8gQ29weXJpZ2h0IChjKSBQYXVsIEJvdXJrZSAodXNlIHBlcm1pdHRlZClcclxuXHJcbiAgICAgICAgdmFyIGZsYWcgPSAwLFxyXG4gICAgICAgICAgICBuID0gdmVydGljZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICBpLFxyXG4gICAgICAgICAgICBqLFxyXG4gICAgICAgICAgICBrLFxyXG4gICAgICAgICAgICB6O1xyXG5cclxuICAgICAgICBpZiAobiA8IDMpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGogPSAoaSArIDEpICUgbjtcclxuICAgICAgICAgICAgayA9IChpICsgMikgJSBuO1xyXG4gICAgICAgICAgICB6ID0gKHZlcnRpY2VzW2pdLnggLSB2ZXJ0aWNlc1tpXS54KSAqICh2ZXJ0aWNlc1trXS55IC0gdmVydGljZXNbal0ueSk7XHJcbiAgICAgICAgICAgIHogLT0gKHZlcnRpY2VzW2pdLnkgLSB2ZXJ0aWNlc1tpXS55KSAqICh2ZXJ0aWNlc1trXS54IC0gdmVydGljZXNbal0ueCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoeiA8IDApIHtcclxuICAgICAgICAgICAgICAgIGZsYWcgfD0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh6ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZmxhZyB8PSAyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmxhZyA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxhZyAhPT0gMCl7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjb252ZXggaHVsbCBvZiB0aGUgaW5wdXQgdmVydGljZXMgYXMgYSBuZXcgYXJyYXkgb2YgcG9pbnRzLlxyXG4gICAgICogQG1ldGhvZCBodWxsXHJcbiAgICAgKiBAcGFyYW0ge3ZlcnRpY2VzfSB2ZXJ0aWNlc1xyXG4gICAgICogQHJldHVybiBbdmVydGV4XSB2ZXJ0aWNlc1xyXG4gICAgICovXHJcbiAgICBWZXJ0aWNlcy5odWxsID0gZnVuY3Rpb24odmVydGljZXMpIHtcclxuICAgICAgICAvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2ExMC1faHVsbC0xLmh0bWxcclxuXHJcbiAgICAgICAgdmFyIHVwcGVyID0gW10sXHJcbiAgICAgICAgICAgIGxvd2VyID0gW10sIFxyXG4gICAgICAgICAgICB2ZXJ0ZXgsXHJcbiAgICAgICAgICAgIGk7XHJcblxyXG4gICAgICAgIC8vIHNvcnQgdmVydGljZXMgb24geC1heGlzICh5LWF4aXMgZm9yIHRpZXMpXHJcbiAgICAgICAgdmVydGljZXMgPSB2ZXJ0aWNlcy5zbGljZSgwKTtcclxuICAgICAgICB2ZXJ0aWNlcy5zb3J0KGZ1bmN0aW9uKHZlcnRleEEsIHZlcnRleEIpIHtcclxuICAgICAgICAgICAgdmFyIGR4ID0gdmVydGV4QS54IC0gdmVydGV4Qi54O1xyXG4gICAgICAgICAgICByZXR1cm4gZHggIT09IDAgPyBkeCA6IHZlcnRleEEueSAtIHZlcnRleEIueTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gYnVpbGQgbG93ZXIgaHVsbFxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChsb3dlci5sZW5ndGggPj0gMiBcclxuICAgICAgICAgICAgICAgICAgICYmIFZlY3Rvci5jcm9zczMobG93ZXJbbG93ZXIubGVuZ3RoIC0gMl0sIGxvd2VyW2xvd2VyLmxlbmd0aCAtIDFdLCB2ZXJ0ZXgpIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIGxvd2VyLnBvcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsb3dlci5wdXNoKHZlcnRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBidWlsZCB1cHBlciBodWxsXHJcbiAgICAgICAgZm9yIChpID0gdmVydGljZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcclxuICAgICAgICAgICAgdmVydGV4ID0gdmVydGljZXNbaV07XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAodXBwZXIubGVuZ3RoID49IDIgXHJcbiAgICAgICAgICAgICAgICAgICAmJiBWZWN0b3IuY3Jvc3MzKHVwcGVyW3VwcGVyLmxlbmd0aCAtIDJdLCB1cHBlclt1cHBlci5sZW5ndGggLSAxXSwgdmVydGV4KSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB1cHBlci5wb3AoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdXBwZXIucHVzaCh2ZXJ0ZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29uY2F0ZW5hdGlvbiBvZiB0aGUgbG93ZXIgYW5kIHVwcGVyIGh1bGxzIGdpdmVzIHRoZSBjb252ZXggaHVsbFxyXG4gICAgICAgIC8vIG9taXQgbGFzdCBwb2ludHMgYmVjYXVzZSB0aGV5IGFyZSByZXBlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdGhlciBsaXN0XHJcbiAgICAgICAgdXBwZXIucG9wKCk7XHJcbiAgICAgICAgbG93ZXIucG9wKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB1cHBlci5jb25jYXQobG93ZXIpO1xyXG4gICAgfTtcclxuXHJcbn0pKCk7XHJcbiIsInZhciBNYXR0ZXIgPSByZXF1aXJlKCcuLi8uLi9DdXN0b21NYWluJyk7XHJcblxyXG4vKipcclxuICogQW4gYXR0cmFjdG9ycyBwbHVnaW4gZm9yIG1hdHRlci5qcy5cclxuICogU2VlIHRoZSByZWFkbWUgZm9yIHVzYWdlIGFuZCBleGFtcGxlcy5cclxuICogQG1vZHVsZSBNYXR0ZXJBdHRyYWN0b3JzXHJcbiAqL1xyXG52YXIgTWF0dGVyQXR0cmFjdG9ycyA9IHtcclxuICAvLyBwbHVnaW4gbWV0YVxyXG4gIG5hbWU6ICdtYXR0ZXItYXR0cmFjdG9ycycsIC8vIFBMVUdJTl9OQU1FXHJcbiAgdmVyc2lvbjogJzAuMS43JywgLy8gUExVR0lOX1ZFUlNJT05cclxuICBmb3I6ICdtYXR0ZXItanNAXjAuMTQuMicsXHJcbiAgc2lsZW50OiB0cnVlLCAvLyBubyBjb25zb2xlIGxvZyBwbGVhc2VcclxuXHJcbiAgLy8gaW5zdGFsbHMgdGhlIHBsdWdpbiB3aGVyZSBgYmFzZWAgaXMgYE1hdHRlcmBcclxuICAvLyB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBkaXJlY3RseS5cclxuICBpbnN0YWxsOiBmdW5jdGlvbihiYXNlKSB7XHJcbiAgICBiYXNlLmFmdGVyKCdCb2R5LmNyZWF0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICBNYXR0ZXJBdHRyYWN0b3JzLkJvZHkuaW5pdCh0aGlzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGJhc2UuYmVmb3JlKCdFbmdpbmUudXBkYXRlJywgZnVuY3Rpb24oZW5naW5lKSB7XHJcbiAgICAgIE1hdHRlckF0dHJhY3RvcnMuRW5naW5lLnVwZGF0ZShlbmdpbmUpO1xyXG4gICAgfSk7XHJcbiAgfSxcclxuXHJcbiAgQm9keToge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXNlcyB0aGUgYGJvZHlgIHRvIHN1cHBvcnQgYXR0cmFjdG9ycy5cclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBsdWdpbi5cclxuICAgICAqIEBmdW5jdGlvbiBNYXR0ZXJBdHRyYWN0b3JzLkJvZHkuaW5pdFxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXIuQm9keX0gYm9keSBUaGUgYm9keSB0byBpbml0LlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgaW5pdDogZnVuY3Rpb24oYm9keSkge1xyXG4gICAgICBib2R5LnBsdWdpbi5hdHRyYWN0b3JzID0gYm9keS5wbHVnaW4uYXR0cmFjdG9ycyB8fCBbXTtcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBFbmdpbmU6IHtcclxuICAgIC8qKlxyXG4gICAgICogQXBwbGllcyBhbGwgYXR0cmFjdG9ycyBmb3IgYWxsIGJvZGllcyBpbiB0aGUgYGVuZ2luZWAuXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwbHVnaW4uXHJcbiAgICAgKiBAZnVuY3Rpb24gTWF0dGVyQXR0cmFjdG9ycy5FbmdpbmUudXBkYXRlXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlci5FbmdpbmV9IGVuZ2luZSBUaGUgZW5naW5lIHRvIHVwZGF0ZS5cclxuICAgICAqIEByZXR1cm5zIHt2b2lkfSBObyByZXR1cm4gdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24oZW5naW5lKSB7XHJcbiAgICAgIHZhciB3b3JsZCA9IGVuZ2luZS53b3JsZCxcclxuICAgICAgICBib2RpZXMgPSBNYXR0ZXIuQ29tcG9zaXRlLmFsbEJvZGllcyh3b3JsZCk7XHJcblxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvZGllcy5sZW5ndGg7IGkgKz0gMSkge1xyXG4gICAgICAgIHZhciBib2R5QSA9IGJvZGllc1tpXSxcclxuICAgICAgICAgIGF0dHJhY3RvcnMgPSBib2R5QS5wbHVnaW4uYXR0cmFjdG9ycztcclxuXHJcbiAgICAgICAgaWYgKGF0dHJhY3RvcnMgJiYgYXR0cmFjdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBqID0gaSArIDE7IGogPCBib2RpZXMubGVuZ3RoOyBqICs9IDEpIHtcclxuICAgICAgICAgICAgdmFyIGJvZHlCID0gYm9kaWVzW2pdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhdHRyYWN0b3JzLmxlbmd0aDsgayArPSAxKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGF0dHJhY3RvciA9IGF0dHJhY3RvcnNba10sXHJcbiAgICAgICAgICAgICAgICBmb3JjZVZlY3RvciA9IGF0dHJhY3RvcjtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKE1hdHRlci5Db21tb24uaXNGdW5jdGlvbihhdHRyYWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JjZVZlY3RvciA9IGF0dHJhY3Rvcihib2R5QSwgYm9keUIpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZvcmNlVmVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICBNYXR0ZXIuQm9keS5hcHBseUZvcmNlKGJvZHlCLCBib2R5Qi5wb3NpdGlvbiwgZm9yY2VWZWN0b3IpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgc29tZSB1c2VmdWwgY29tbW9uIGF0dHJhY3RvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZFxyXG4gICAqIGJ5IHB1c2hpbmcgdGhlbSB0byB5b3VyIGJvZHkncyBgYm9keS5wbHVnaW4uYXR0cmFjdG9yc2AgYXJyYXkuXHJcbiAgICogQG5hbWVzcGFjZSBNYXR0ZXJBdHRyYWN0b3JzLkF0dHJhY3RvcnNcclxuICAgKiBAcHJvcGVydHkge251bWJlcn0gZ3Jhdml0eUNvbnN0YW50IFRoZSBncmF2aXRhdGlvbmFsIGNvbnN0YW50IHVzZWQgYnkgdGhlIGdyYXZpdHkgYXR0cmFjdG9yLlxyXG4gICAqL1xyXG4gIEF0dHJhY3RvcnM6IHtcclxuICAgIGdyYXZpdHlDb25zdGFudDogMC4wMDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhdHRyYWN0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIE5ld3RvbidzIGxhdyBvZiBncmF2aXRhdGlvbi5cclxuICAgICAqIFVzZSB0aGlzIGJ5IHB1c2hpbmcgYE1hdHRlckF0dHJhY3RvcnMuQXR0cmFjdG9ycy5ncmF2aXR5YCB0byB5b3VyIGJvZHkncyBgYm9keS5wbHVnaW4uYXR0cmFjdG9yc2AgYXJyYXkuXHJcbiAgICAgKiBUaGUgZ3Jhdml0YXRpb25hbCBjb25zdGFudCBkZWZhdWx0cyB0byBgMC4wMDFgIHdoaWNoIHlvdSBjYW4gY2hhbmdlXHJcbiAgICAgKiBhdCBgTWF0dGVyQXR0cmFjdG9ycy5BdHRyYWN0b3JzLmdyYXZpdHlDb25zdGFudGAuXHJcbiAgICAgKiBAZnVuY3Rpb24gTWF0dGVyQXR0cmFjdG9ycy5BdHRyYWN0b3JzLmdyYXZpdHlcclxuICAgICAqIEBwYXJhbSB7TWF0dGVyLkJvZHl9IGJvZHlBIFRoZSBmaXJzdCBib2R5LlxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXIuQm9keX0gYm9keUIgVGhlIHNlY29uZCBib2R5LlxyXG4gICAgICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZ3Jhdml0eTogZnVuY3Rpb24oYm9keUEsIGJvZHlCKSB7XHJcbiAgICAgIC8vIHVzZSBOZXd0b24ncyBsYXcgb2YgZ3Jhdml0YXRpb25cclxuICAgICAgdmFyIGJUb0EgPSBNYXR0ZXIuVmVjdG9yLnN1Yihib2R5Qi5wb3NpdGlvbiwgYm9keUEucG9zaXRpb24pLFxyXG4gICAgICAgIGRpc3RhbmNlU3EgPSBNYXR0ZXIuVmVjdG9yLm1hZ25pdHVkZVNxdWFyZWQoYlRvQSkgfHwgMC4wMDAxLFxyXG4gICAgICAgIG5vcm1hbCA9IE1hdHRlci5WZWN0b3Iubm9ybWFsaXNlKGJUb0EpLFxyXG4gICAgICAgIG1hZ25pdHVkZSA9IC1NYXR0ZXJBdHRyYWN0b3JzLkF0dHJhY3RvcnMuZ3Jhdml0eUNvbnN0YW50ICogKGJvZHlBLm1hc3MgKiBib2R5Qi5tYXNzIC8gZGlzdGFuY2VTcSksXHJcbiAgICAgICAgZm9yY2UgPSBNYXR0ZXIuVmVjdG9yLm11bHQobm9ybWFsLCBtYWduaXR1ZGUpO1xyXG5cclxuICAgICAgLy8gdG8gYXBwbHkgZm9yY2VzIHRvIGJvdGggYm9kaWVzXHJcbiAgICAgIE1hdHRlci5Cb2R5LmFwcGx5Rm9yY2UoYm9keUEsIGJvZHlBLnBvc2l0aW9uLCBNYXR0ZXIuVmVjdG9yLm5lZyhmb3JjZSkpO1xyXG4gICAgICBNYXR0ZXIuQm9keS5hcHBseUZvcmNlKGJvZHlCLCBib2R5Qi5wb3NpdGlvbiwgZm9yY2UpO1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0dGVyQXR0cmFjdG9ycztcclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIE1hdHRlci5Cb2R5XHJcbiAqIEBzZWUgaHR0cDovL2JybS5pby9tYXR0ZXItanMvZG9jcy9jbGFzc2VzL0JvZHkuaHRtbFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHBsdWdpbiBhZGRzIGEgbmV3IHByb3BlcnR5IGBib2R5LnBsdWdpbi5hdHRyYWN0b3JzYCB0byBpbnN0YW5jZXMgb2YgYE1hdHRlci5Cb2R5YC5cclxuICogVGhpcyBpcyBhbiBhcnJheSBvZiBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5XHJcbiAqIGZvciBldmVyeSBwYWlyIG9mIGJvZGllcywgb24gZXZlcnkgZW5naW5lIHVwZGF0ZS5cclxuICogQHByb3BlcnR5IHtGdW5jdGlvbltdfSBib2R5LnBsdWdpbi5hdHRyYWN0b3JzXHJcbiAqIEBtZW1iZXJvZiBNYXR0ZXIuQm9keVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBBbiBhdHRyYWN0b3IgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZm9yY2UgdG8gYmUgYXBwbGllZFxyXG4gKiB0byBgYm9keUJgLCBpdCBzaG91bGQgZWl0aGVyOlxyXG4gKiAtIHJldHVybiB0aGUgZm9yY2UgdmVjdG9yIHRvIGJlIGFwcGxpZWQgdG8gYGJvZHlCYFxyXG4gKiAtIG9yIGFwcGx5IHRoZSBmb3JjZSB0byB0aGUgYm9keShzKSBpdHNlbGZcclxuICogQGNhbGxiYWNrIEF0dHJhY3RvckZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TWF0dGVyLkJvZHl9IGJvZHlBXHJcbiAqIEBwYXJhbSB7TWF0dGVyLkJvZHl9IGJvZHlCXHJcbiAqIEByZXR1cm5zIHsoVmVjdG9yfHVuZGVmaW5lZCl9IGEgZm9yY2UgdmVjdG9yIChvcHRpb25hbClcclxuICovXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIEBkeHUgaHR0cHM6Ly9naXRodWIuY29tL2R4dS9tYXR0ZXItY29sbGlzaW9uLWV2ZW50c1xyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTWF0dGVyQ29sbGlzaW9uRXZlbnRzID0ge1xyXG5cclxuICAgIG5hbWU6ICdtYXR0ZXItY29sbGlzaW9uLWV2ZW50cycsXHJcbiAgICB2ZXJzaW9uOiAnMC4xLjYnLFxyXG4gICAgZm9yOiAnbWF0dGVyLWpzQF4wLjE0LjInLFxyXG4gICAgc2lsZW50OiB0cnVlLFxyXG5cclxuICAgIGluc3RhbGw6IGZ1bmN0aW9uIChtYXR0ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbWF0dGVyLmFmdGVyKCdFbmdpbmUuY3JlYXRlJywgZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG1hdHRlci5FdmVudHMub24odGhpcywgJ2NvbGxpc2lvblN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wYWlycy5tYXAoZnVuY3Rpb24gKHBhaXIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHlBID0gcGFpci5ib2R5QTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYm9keUIgPSBwYWlyLmJvZHlCO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keUEuZ2FtZU9iamVjdClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlBLmdhbWVPYmplY3QuZW1pdCgnY29sbGlkZScsIGJvZHlBLCBib2R5QiwgcGFpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keUIuZ2FtZU9iamVjdClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlCLmdhbWVPYmplY3QuZW1pdCgnY29sbGlkZScsIGJvZHlCLCBib2R5QSwgcGFpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBtYXR0ZXIuRXZlbnRzLnRyaWdnZXIoYm9keUEsICdvbkNvbGxpZGUnLCB7IHBhaXI6IHBhaXIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0dGVyLkV2ZW50cy50cmlnZ2VyKGJvZHlCLCAnb25Db2xsaWRlJywgeyBwYWlyOiBwYWlyIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keUEub25Db2xsaWRlQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QS5vbkNvbGxpZGVDYWxsYmFjayhwYWlyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5Qi5vbkNvbGxpZGVDYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlCLm9uQ29sbGlkZUNhbGxiYWNrKHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlBLm9uQ29sbGlkZVdpdGhbYm9keUIuaWRdKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUEub25Db2xsaWRlV2l0aFtib2R5Qi5pZF0oYm9keUIsIHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlCLm9uQ29sbGlkZVdpdGhbYm9keUEuaWRdKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUIub25Db2xsaWRlV2l0aFtib2R5QS5pZF0oYm9keUEsIHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG1hdHRlci5FdmVudHMub24odGhpcywgJ2NvbGxpc2lvbkFjdGl2ZScsIGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucGFpcnMubWFwKGZ1bmN0aW9uIChwYWlyKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBib2R5QSA9IHBhaXIuYm9keUE7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHlCID0gcGFpci5ib2R5QjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlBLmdhbWVPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QS5nYW1lT2JqZWN0LmVtaXQoJ2NvbGxpZGVBY3RpdmUnLCBib2R5QSwgYm9keUIsIHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlCLmdhbWVPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5Qi5nYW1lT2JqZWN0LmVtaXQoJ2NvbGxpZGVBY3RpdmUnLCBib2R5QiwgYm9keUEsIHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0dGVyLkV2ZW50cy50cmlnZ2VyKGJvZHlBLCAnb25Db2xsaWRlQWN0aXZlJywgeyBwYWlyOiBwYWlyIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdHRlci5FdmVudHMudHJpZ2dlcihib2R5QiwgJ29uQ29sbGlkZUFjdGl2ZScsIHsgcGFpcjogcGFpciB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlBLm9uQ29sbGlkZUFjdGl2ZUNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUEub25Db2xsaWRlQWN0aXZlQ2FsbGJhY2socGFpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keUIub25Db2xsaWRlQWN0aXZlQ2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5Qi5vbkNvbGxpZGVBY3RpdmVDYWxsYmFjayhwYWlyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBtYXR0ZXIuRXZlbnRzLm9uKHRoaXMsICdjb2xsaXNpb25FbmQnLCBmdW5jdGlvbiAoZXZlbnQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnBhaXJzLm1hcChmdW5jdGlvbiAocGFpcilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYm9keUEgPSBwYWlyLmJvZHlBO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBib2R5QiA9IHBhaXIuYm9keUI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5QS5nYW1lT2JqZWN0KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUEuZ2FtZU9iamVjdC5lbWl0KCdjb2xsaWRlRW5kJywgYm9keUEsIGJvZHlCLCBwYWlyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5Qi5nYW1lT2JqZWN0KVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUIuZ2FtZU9iamVjdC5lbWl0KCdjb2xsaWRlRW5kJywgYm9keUIsIGJvZHlBLCBwYWlyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG1hdHRlci5FdmVudHMudHJpZ2dlcihib2R5QSwgJ29uQ29sbGlkZUVuZCcsIHsgcGFpcjogcGFpciB9KTtcclxuICAgICAgICAgICAgICAgICAgICBtYXR0ZXIuRXZlbnRzLnRyaWdnZXIoYm9keUIsICdvbkNvbGxpZGVFbmQnLCB7IHBhaXI6IHBhaXIgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChib2R5QS5vbkNvbGxpZGVFbmRDYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlBLm9uQ29sbGlkZUVuZENhbGxiYWNrKHBhaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHlCLm9uQ29sbGlkZUVuZENhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUIub25Db2xsaWRlRW5kQ2FsbGJhY2socGFpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXR0ZXJDb2xsaXNpb25FdmVudHM7XHJcbiIsInZhciBNYXR0ZXIgPSByZXF1aXJlKCcuLi8uLi9DdXN0b21NYWluJyk7XHJcblxyXG4vKipcclxuICogQSBjb29yZGluYXRlIHdyYXBwaW5nIHBsdWdpbiBmb3IgbWF0dGVyLmpzLlxyXG4gKiBTZWUgdGhlIHJlYWRtZSBmb3IgdXNhZ2UgYW5kIGV4YW1wbGVzLlxyXG4gKiBAbW9kdWxlIE1hdHRlcldyYXBcclxuICovXHJcbnZhciBNYXR0ZXJXcmFwID0ge1xyXG4gIC8vIHBsdWdpbiBtZXRhXHJcbiAgbmFtZTogJ21hdHRlci13cmFwJywgLy8gUExVR0lOX05BTUVcclxuICB2ZXJzaW9uOiAnMC4xLjQnLCAvLyBQTFVHSU5fVkVSU0lPTlxyXG4gIGZvcjogJ21hdHRlci1qc0BeMC4xNC4yJyxcclxuICBzaWxlbnQ6IHRydWUsIC8vIG5vIGNvbnNvbGUgbG9nIHBsZWFzZVxyXG5cclxuICAvLyBpbnN0YWxscyB0aGUgcGx1Z2luIHdoZXJlIGBiYXNlYCBpcyBgTWF0dGVyYFxyXG4gIC8vIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIGRpcmVjdGx5LlxyXG4gIGluc3RhbGw6IGZ1bmN0aW9uKGJhc2UpIHtcclxuICAgIGJhc2UuYWZ0ZXIoJ0VuZ2luZS51cGRhdGUnLCBmdW5jdGlvbigpIHtcclxuICAgICAgTWF0dGVyV3JhcC5FbmdpbmUudXBkYXRlKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgfSxcclxuXHJcbiAgRW5naW5lOiB7XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGVuZ2luZSBieSB3cmFwcGluZyBib2RpZXMgYW5kIGNvbXBvc2l0ZXMgaW5zaWRlIGBlbmdpbmUud29ybGRgLlxyXG4gICAgICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgcGx1Z2luLlxyXG4gICAgICogQGZ1bmN0aW9uIE1hdHRlcldyYXAuRW5naW5lLnVwZGF0ZVxyXG4gICAgICogQHBhcmFtIHtNYXR0ZXIuRW5naW5lfSBlbmdpbmUgVGhlIGVuZ2luZSB0byB1cGRhdGUuXHJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uKGVuZ2luZSkge1xyXG4gICAgICB2YXIgd29ybGQgPSBlbmdpbmUud29ybGQsXHJcbiAgICAgICAgYm9kaWVzID0gTWF0dGVyLkNvbXBvc2l0ZS5hbGxCb2RpZXMod29ybGQpLFxyXG4gICAgICAgIGNvbXBvc2l0ZXMgPSBNYXR0ZXIuQ29tcG9zaXRlLmFsbENvbXBvc2l0ZXMod29ybGQpO1xyXG5cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGJvZHkucGx1Z2luLndyYXApIHtcclxuICAgICAgICAgIE1hdHRlcldyYXAuQm9keS53cmFwKGJvZHksIGJvZHkucGx1Z2luLndyYXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvc2l0ZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICB2YXIgY29tcG9zaXRlID0gY29tcG9zaXRlc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGNvbXBvc2l0ZS5wbHVnaW4ud3JhcCkge1xyXG4gICAgICAgICAgTWF0dGVyV3JhcC5Db21wb3NpdGUud3JhcChjb21wb3NpdGUsIGNvbXBvc2l0ZS5wbHVnaW4ud3JhcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgQm91bmRzOiB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSB0cmFuc2xhdGlvbiB2ZWN0b3IgdGhhdCB3cmFwcyB0aGUgYG9iamVjdEJvdW5kc2AgaW5zaWRlIHRoZSBgYm91bmRzYC5cclxuICAgICAqIEBmdW5jdGlvbiBNYXR0ZXJXcmFwLkJvdW5kcy53cmFwXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlci5Cb3VuZHN9IG9iamVjdEJvdW5kcyBUaGUgYm91bmRzIG9mIHRoZSBvYmplY3QgdG8gd3JhcCBpbnNpZGUgdGhlIGJvdW5kcy5cclxuICAgICAqIEBwYXJhbSB7TWF0dGVyLkJvdW5kc30gYm91bmRzIFRoZSBib3VuZHMgdG8gd3JhcCB0aGUgYm9keSBpbnNpZGUuXHJcbiAgICAgKiBAcmV0dXJucyB7P01hdHRlci5WZWN0b3J9IEEgdHJhbnNsYXRpb24gdmVjdG9yIChvbmx5IGlmIHdyYXBwaW5nIGlzIHJlcXVpcmVkKS5cclxuICAgICAqL1xyXG4gICAgd3JhcDogZnVuY3Rpb24ob2JqZWN0Qm91bmRzLCBib3VuZHMpIHtcclxuICAgICAgdmFyIHggPSBudWxsLFxyXG4gICAgICAgIHkgPSBudWxsO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBib3VuZHMubWluLnggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBib3VuZHMubWF4LnggIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdEJvdW5kcy5taW4ueCA+IGJvdW5kcy5tYXgueCkge1xyXG4gICAgICAgICAgeCA9IGJvdW5kcy5taW4ueCAtIG9iamVjdEJvdW5kcy5tYXgueDtcclxuICAgICAgICB9IGVsc2UgaWYgKG9iamVjdEJvdW5kcy5tYXgueCA8IGJvdW5kcy5taW4ueCkge1xyXG4gICAgICAgICAgeCA9IGJvdW5kcy5tYXgueCAtIG9iamVjdEJvdW5kcy5taW4ueDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgYm91bmRzLm1pbi55ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgYm91bmRzLm1heC55ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChvYmplY3RCb3VuZHMubWluLnkgPiBib3VuZHMubWF4LnkpIHtcclxuICAgICAgICAgIHkgPSBib3VuZHMubWluLnkgLSBvYmplY3RCb3VuZHMubWF4Lnk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvYmplY3RCb3VuZHMubWF4LnkgPCBib3VuZHMubWluLnkpIHtcclxuICAgICAgICAgIHkgPSBib3VuZHMubWF4LnkgLSBvYmplY3RCb3VuZHMubWluLnk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoeCAhPT0gbnVsbCB8fCB5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHg6IHggfHwgMCxcclxuICAgICAgICAgIHk6IHkgfHwgMFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG5cclxuICBCb2R5OiB7XHJcbiAgICAvKipcclxuICAgICAqIFdyYXBzIHRoZSBgYm9keWAgcG9zaXRpb24gc3VjaCB0aGF0IGl0IGFsd2F5cyBzdGF5cyB3aXRoaW4gdGhlIGdpdmVuIGJvdW5kcy4gXHJcbiAgICAgKiBVcG9uIGNyb3NzaW5nIGEgYm91bmRhcnkgdGhlIGJvZHkgd2lsbCBhcHBlYXIgb24gdGhlIG9wcG9zaXRlIHNpZGUgb2YgdGhlIGJvdW5kcywgXHJcbiAgICAgKiB3aGlsZSBtYWludGFpbmluZyBpdHMgdmVsb2NpdHkuXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwbHVnaW4uXHJcbiAgICAgKiBAZnVuY3Rpb24gTWF0dGVyV3JhcC5Cb2R5LndyYXBcclxuICAgICAqIEBwYXJhbSB7TWF0dGVyLkJvZHl9IGJvZHkgVGhlIGJvZHkgdG8gd3JhcC5cclxuICAgICAqIEBwYXJhbSB7TWF0dGVyLkJvdW5kc30gYm91bmRzIFRoZSBib3VuZHMgdG8gd3JhcCB0aGUgYm9keSBpbnNpZGUuXHJcbiAgICAgKiBAcmV0dXJucyB7P01hdHRlci5WZWN0b3J9IFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgdGhhdCB3YXMgYXBwbGllZCAob25seSBpZiB3cmFwcGluZyB3YXMgcmVxdWlyZWQpLlxyXG4gICAgICovXHJcbiAgICB3cmFwOiBmdW5jdGlvbihib2R5LCBib3VuZHMpIHtcclxuICAgICAgdmFyIHRyYW5zbGF0aW9uID0gTWF0dGVyV3JhcC5Cb3VuZHMud3JhcChib2R5LmJvdW5kcywgYm91bmRzKTtcclxuXHJcbiAgICAgIGlmICh0cmFuc2xhdGlvbikge1xyXG4gICAgICAgIE1hdHRlci5Cb2R5LnRyYW5zbGF0ZShib2R5LCB0cmFuc2xhdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbjtcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBDb21wb3NpdGU6IHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdW5pb24gb2YgdGhlIGJvdW5kcyBvZiBhbGwgb2YgdGhlIGNvbXBvc2l0ZSdzIGJvZGllc1xyXG4gICAgICogKG5vdCBhY2NvdW50aW5nIGZvciBjb25zdHJhaW50cykuXHJcbiAgICAgKiBAZnVuY3Rpb24gTWF0dGVyV3JhcC5Db21wb3NpdGUuYm91bmRzXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlci5Db21wb3NpdGV9IGNvbXBvc2l0ZSBUaGUgY29tcG9zaXRlLlxyXG4gICAgICogQHJldHVybnMge01hdHRlci5Cb3VuZHN9IFRoZSBjb21wb3NpdGUgYm91bmRzLlxyXG4gICAgICovXHJcbiAgICBib3VuZHM6IGZ1bmN0aW9uKGNvbXBvc2l0ZSkge1xyXG4gICAgICB2YXIgYm9kaWVzID0gTWF0dGVyLkNvbXBvc2l0ZS5hbGxCb2RpZXMoY29tcG9zaXRlKSxcclxuICAgICAgICB2ZXJ0aWNlcyA9IFtdO1xyXG4gICAgICBcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICB2YXIgYm9keSA9IGJvZGllc1tpXTtcclxuICAgICAgICB2ZXJ0aWNlcy5wdXNoKGJvZHkuYm91bmRzLm1pbiwgYm9keS5ib3VuZHMubWF4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIE1hdHRlci5Cb3VuZHMuY3JlYXRlKHZlcnRpY2VzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwcyB0aGUgYGNvbXBvc2l0ZWAgcG9zaXRpb24gc3VjaCB0aGF0IGl0IGFsd2F5cyBzdGF5cyB3aXRoaW4gdGhlIGdpdmVuIGJvdW5kcy4gXHJcbiAgICAgKiBVcG9uIGNyb3NzaW5nIGEgYm91bmRhcnkgdGhlIGNvbXBvc2l0ZSB3aWxsIGFwcGVhciBvbiB0aGUgb3Bwb3NpdGUgc2lkZSBvZiB0aGUgYm91bmRzLCBcclxuICAgICAqIHdoaWxlIG1haW50YWluaW5nIGl0cyB2ZWxvY2l0eS5cclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBsdWdpbi5cclxuICAgICAqIEBmdW5jdGlvbiBNYXR0ZXJXcmFwLkNvbXBvc2l0ZS53cmFwXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlci5Db21wb3NpdGV9IGNvbXBvc2l0ZSBUaGUgY29tcG9zaXRlIHRvIHdyYXAuXHJcbiAgICAgKiBAcGFyYW0ge01hdHRlci5Cb3VuZHN9IGJvdW5kcyBUaGUgYm91bmRzIHRvIHdyYXAgdGhlIGNvbXBvc2l0ZSBpbnNpZGUuXHJcbiAgICAgKiBAcmV0dXJucyB7P01hdHRlci5WZWN0b3J9IFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgdGhhdCB3YXMgYXBwbGllZCAob25seSBpZiB3cmFwcGluZyB3YXMgcmVxdWlyZWQpLlxyXG4gICAgICovXHJcbiAgICB3cmFwOiBmdW5jdGlvbihjb21wb3NpdGUsIGJvdW5kcykge1xyXG4gICAgICB2YXIgdHJhbnNsYXRpb24gPSBNYXR0ZXJXcmFwLkJvdW5kcy53cmFwKFxyXG4gICAgICAgIE1hdHRlcldyYXAuQ29tcG9zaXRlLmJvdW5kcyhjb21wb3NpdGUpLCBcclxuICAgICAgICBib3VuZHNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh0cmFuc2xhdGlvbikge1xyXG4gICAgICAgIE1hdHRlci5Db21wb3NpdGUudHJhbnNsYXRlKGNvbXBvc2l0ZSwgdHJhbnNsYXRpb24pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdHJhbnNsYXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNYXR0ZXJXcmFwO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgTWF0dGVyLkJvZHlcclxuICogQHNlZSBodHRwOi8vYnJtLmlvL21hdHRlci1qcy9kb2NzL2NsYXNzZXMvQm9keS5odG1sXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgcGx1Z2luIGFkZHMgYSBuZXcgcHJvcGVydHkgYGJvZHkucGx1Z2luLndyYXBgIHRvIGluc3RhbmNlcyBvZiBgTWF0dGVyLkJvZHlgLiAgXHJcbiAqIFRoaXMgaXMgYSBgTWF0dGVyLkJvdW5kc2AgaW5zdGFuY2UgdGhhdCBzcGVjaWZpZXMgdGhlIHdyYXBwaW5nIHJlZ2lvbi5cclxuICogQHByb3BlcnR5IHtNYXR0ZXIuQm91bmRzfSBib2R5LnBsdWdpbi53cmFwXHJcbiAqIEBtZW1iZXJvZiBNYXR0ZXIuQm9keVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHBsdWdpbiBhZGRzIGEgbmV3IHByb3BlcnR5IGBjb21wb3NpdGUucGx1Z2luLndyYXBgIHRvIGluc3RhbmNlcyBvZiBgTWF0dGVyLkNvbXBvc2l0ZWAuICBcclxuICogVGhpcyBpcyBhIGBNYXR0ZXIuQm91bmRzYCBpbnN0YW5jZSB0aGF0IHNwZWNpZmllcyB0aGUgd3JhcHBpbmcgcmVnaW9uLlxyXG4gKiBAcHJvcGVydHkge01hdHRlci5Cb3VuZHN9IGNvbXBvc2l0ZS5wbHVnaW4ud3JhcFxyXG4gKiBAbWVtYmVyb2YgTWF0dGVyLkNvbXBvc2l0ZVxyXG4gKi8iLCIvKipcclxuICogQGF1dGhvciAgICAgICBTdGVmYW4gSGVkbWFuIDxzY2h0ZXBwZUBnbWFpbC5jb20+IChodHRwOi8vc3RlZmZlLnNlKVxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgdjAuMy4wXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGRlY29tcDogcG9seWdvbkRlY29tcCxcclxuICAgIHF1aWNrRGVjb21wOiBwb2x5Z29uUXVpY2tEZWNvbXAsXHJcbiAgICBpc1NpbXBsZTogcG9seWdvbklzU2ltcGxlLFxyXG4gICAgcmVtb3ZlQ29sbGluZWFyUG9pbnRzOiBwb2x5Z29uUmVtb3ZlQ29sbGluZWFyUG9pbnRzLFxyXG4gICAgcmVtb3ZlRHVwbGljYXRlUG9pbnRzOiBwb2x5Z29uUmVtb3ZlRHVwbGljYXRlUG9pbnRzLFxyXG4gICAgbWFrZUNDVzogcG9seWdvbk1ha2VDQ1dcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gbGluZXMuXHJcbiAqIEBzdGF0aWNcclxuICogQG1ldGhvZCBsaW5lSW50XHJcbiAqIEBwYXJhbSAge0FycmF5fSAgbDEgICAgICAgICAgTGluZSB2ZWN0b3IgMVxyXG4gKiBAcGFyYW0gIHtBcnJheX0gIGwyICAgICAgICAgIExpbmUgdmVjdG9yIDJcclxuICogQHBhcmFtICB7TnVtYmVyfSBwcmVjaXNpb24gICBQcmVjaXNpb24gdG8gdXNlIHdoZW4gY2hlY2tpbmcgaWYgdGhlIGxpbmVzIGFyZSBwYXJhbGxlbFxyXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICAgIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcbiAqL1xyXG5mdW5jdGlvbiBsaW5lSW50KGwxLGwyLHByZWNpc2lvbil7XHJcbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gfHwgMDtcclxuICAgIHZhciBpID0gWzAsMF07IC8vIHBvaW50XHJcbiAgICB2YXIgYTEsIGIxLCBjMSwgYTIsIGIyLCBjMiwgZGV0OyAvLyBzY2FsYXJzXHJcbiAgICBhMSA9IGwxWzFdWzFdIC0gbDFbMF1bMV07XHJcbiAgICBiMSA9IGwxWzBdWzBdIC0gbDFbMV1bMF07XHJcbiAgICBjMSA9IGExICogbDFbMF1bMF0gKyBiMSAqIGwxWzBdWzFdO1xyXG4gICAgYTIgPSBsMlsxXVsxXSAtIGwyWzBdWzFdO1xyXG4gICAgYjIgPSBsMlswXVswXSAtIGwyWzFdWzBdO1xyXG4gICAgYzIgPSBhMiAqIGwyWzBdWzBdICsgYjIgKiBsMlswXVsxXTtcclxuICAgIGRldCA9IGExICogYjIgLSBhMipiMTtcclxuICAgIGlmICghc2NhbGFyX2VxKGRldCwgMCwgcHJlY2lzaW9uKSkgeyAvLyBsaW5lcyBhcmUgbm90IHBhcmFsbGVsXHJcbiAgICAgICAgaVswXSA9IChiMiAqIGMxIC0gYjEgKiBjMikgLyBkZXQ7XHJcbiAgICAgICAgaVsxXSA9IChhMSAqIGMyIC0gYTIgKiBjMSkgLyBkZXQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gbGluZSBzZWdtZW50cyBpbnRlcnNlY3RzLlxyXG4gKiBAbWV0aG9kIHNlZ21lbnRzSW50ZXJzZWN0XHJcbiAqIEBwYXJhbSB7QXJyYXl9IHAxIFRoZSBzdGFydCB2ZXJ0ZXggb2YgdGhlIGZpcnN0IGxpbmUgc2VnbWVudC5cclxuICogQHBhcmFtIHtBcnJheX0gcDIgVGhlIGVuZCB2ZXJ0ZXggb2YgdGhlIGZpcnN0IGxpbmUgc2VnbWVudC5cclxuICogQHBhcmFtIHtBcnJheX0gcTEgVGhlIHN0YXJ0IHZlcnRleCBvZiB0aGUgc2Vjb25kIGxpbmUgc2VnbWVudC5cclxuICogQHBhcmFtIHtBcnJheX0gcTIgVGhlIGVuZCB2ZXJ0ZXggb2YgdGhlIHNlY29uZCBsaW5lIHNlZ21lbnQuXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHR3byBsaW5lIHNlZ21lbnRzIGludGVyc2VjdFxyXG4gKi9cclxuZnVuY3Rpb24gbGluZVNlZ21lbnRzSW50ZXJzZWN0KHAxLCBwMiwgcTEsIHEyKXtcclxuXHR2YXIgZHggPSBwMlswXSAtIHAxWzBdO1xyXG5cdHZhciBkeSA9IHAyWzFdIC0gcDFbMV07XHJcblx0dmFyIGRhID0gcTJbMF0gLSBxMVswXTtcclxuXHR2YXIgZGIgPSBxMlsxXSAtIHExWzFdO1xyXG5cclxuXHQvLyBzZWdtZW50cyBhcmUgcGFyYWxsZWxcclxuXHRpZigoZGEqZHkgLSBkYipkeCkgPT09IDApe1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0dmFyIHMgPSAoZHggKiAocTFbMV0gLSBwMVsxXSkgKyBkeSAqIChwMVswXSAtIHExWzBdKSkgLyAoZGEgKiBkeSAtIGRiICogZHgpO1xyXG5cdHZhciB0ID0gKGRhICogKHAxWzFdIC0gcTFbMV0pICsgZGIgKiAocTFbMF0gLSBwMVswXSkpIC8gKGRiICogZHggLSBkYSAqIGR5KTtcclxuXHJcblx0cmV0dXJuIChzPj0wICYmIHM8PTEgJiYgdD49MCAmJiB0PD0xKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgYXJlYSBvZiBhIHRyaWFuZ2xlIHNwYW5uZWQgYnkgdGhlIHRocmVlIGdpdmVuIHBvaW50cy4gTm90ZSB0aGF0IHRoZSBhcmVhIHdpbGwgYmUgbmVnYXRpdmUgaWYgdGhlIHBvaW50cyBhcmUgbm90IGdpdmVuIGluIGNvdW50ZXItY2xvY2t3aXNlIG9yZGVyLlxyXG4gKiBAc3RhdGljXHJcbiAqIEBtZXRob2QgYXJlYVxyXG4gKiBAcGFyYW0gIHtBcnJheX0gYVxyXG4gKiBAcGFyYW0gIHtBcnJheX0gYlxyXG4gKiBAcGFyYW0gIHtBcnJheX0gY1xyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiB0cmlhbmdsZUFyZWEoYSxiLGMpe1xyXG4gICAgcmV0dXJuICgoKGJbMF0gLSBhWzBdKSooY1sxXSAtIGFbMV0pKS0oKGNbMF0gLSBhWzBdKSooYlsxXSAtIGFbMV0pKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTGVmdChhLGIsYyl7XHJcbiAgICByZXR1cm4gdHJpYW5nbGVBcmVhKGEsYixjKSA+IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTGVmdE9uKGEsYixjKSB7XHJcbiAgICByZXR1cm4gdHJpYW5nbGVBcmVhKGEsIGIsIGMpID49IDA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUmlnaHQoYSxiLGMpIHtcclxuICAgIHJldHVybiB0cmlhbmdsZUFyZWEoYSwgYiwgYykgPCAwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1JpZ2h0T24oYSxiLGMpIHtcclxuICAgIHJldHVybiB0cmlhbmdsZUFyZWEoYSwgYiwgYykgPD0gMDtcclxufVxyXG5cclxudmFyIHRtcFBvaW50MSA9IFtdLFxyXG4gICAgdG1wUG9pbnQyID0gW107XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhyZWUgcG9pbnRzIGFyZSBjb2xsaW5lYXJcclxuICogQG1ldGhvZCBjb2xsaW5lYXJcclxuICogQHBhcmFtICB7QXJyYXl9IGFcclxuICogQHBhcmFtICB7QXJyYXl9IGJcclxuICogQHBhcmFtICB7QXJyYXl9IGNcclxuICogQHBhcmFtICB7TnVtYmVyfSBbdGhyZXNob2xkQW5nbGU9MF0gVGhyZXNob2xkIGFuZ2xlIHRvIHVzZSB3aGVuIGNvbXBhcmluZyB0aGUgdmVjdG9ycy4gVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHJlc3VsdGluZyB2ZWN0b3JzIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBVc2UgemVybyBmb3IgbWF4IHByZWNpc2lvbi5cclxuICogQHJldHVybiB7Qm9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIGNvbGxpbmVhcihhLGIsYyx0aHJlc2hvbGRBbmdsZSkge1xyXG4gICAgaWYoIXRocmVzaG9sZEFuZ2xlKXtcclxuICAgICAgICByZXR1cm4gdHJpYW5nbGVBcmVhKGEsIGIsIGMpID09PSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB2YXIgYWIgPSB0bXBQb2ludDEsXHJcbiAgICAgICAgICAgIGJjID0gdG1wUG9pbnQyO1xyXG5cclxuICAgICAgICBhYlswXSA9IGJbMF0tYVswXTtcclxuICAgICAgICBhYlsxXSA9IGJbMV0tYVsxXTtcclxuICAgICAgICBiY1swXSA9IGNbMF0tYlswXTtcclxuICAgICAgICBiY1sxXSA9IGNbMV0tYlsxXTtcclxuXHJcbiAgICAgICAgdmFyIGRvdCA9IGFiWzBdKmJjWzBdICsgYWJbMV0qYmNbMV0sXHJcbiAgICAgICAgICAgIG1hZ0EgPSBNYXRoLnNxcnQoYWJbMF0qYWJbMF0gKyBhYlsxXSphYlsxXSksXHJcbiAgICAgICAgICAgIG1hZ0IgPSBNYXRoLnNxcnQoYmNbMF0qYmNbMF0gKyBiY1sxXSpiY1sxXSksXHJcbiAgICAgICAgICAgIGFuZ2xlID0gTWF0aC5hY29zKGRvdC8obWFnQSptYWdCKSk7XHJcbiAgICAgICAgcmV0dXJuIGFuZ2xlIDwgdGhyZXNob2xkQW5nbGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNxZGlzdChhLGIpe1xyXG4gICAgdmFyIGR4ID0gYlswXSAtIGFbMF07XHJcbiAgICB2YXIgZHkgPSBiWzFdIC0gYVsxXTtcclxuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBhIHZlcnRleCBhdCBwb3NpdGlvbiBpLiBJdCBkb2VzIG5vdCBtYXR0ZXIgaWYgaSBpcyBvdXQgb2YgYm91bmRzLCB0aGlzIGZ1bmN0aW9uIHdpbGwganVzdCBjeWNsZS5cclxuICogQG1ldGhvZCBhdFxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGlcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uQXQocG9seWdvbiwgaSl7XHJcbiAgICB2YXIgcyA9IHBvbHlnb24ubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHBvbHlnb25baSA8IDAgPyBpICUgcyArIHMgOiBpICUgc107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGVhciB0aGUgcG9seWdvbiBkYXRhXHJcbiAqIEBtZXRob2QgY2xlYXJcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uQ2xlYXIocG9seWdvbil7XHJcbiAgICBwb2x5Z29uLmxlbmd0aCA9IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBlbmQgcG9pbnRzIFwiZnJvbVwiIHRvIFwidG9cIi0xIGZyb20gYW4gb3RoZXIgcG9seWdvbiBcInBvbHlcIiBvbnRvIHRoaXMgb25lLlxyXG4gKiBAbWV0aG9kIGFwcGVuZFxyXG4gKiBAcGFyYW0ge1BvbHlnb259IHBvbHkgVGhlIHBvbHlnb24gdG8gZ2V0IHBvaW50cyBmcm9tLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gIGZyb20gVGhlIHZlcnRleCBpbmRleCBpbiBcInBvbHlcIi5cclxuICogQHBhcmFtIHtOdW1iZXJ9ICB0byBUaGUgZW5kIHZlcnRleCBpbmRleCBpbiBcInBvbHlcIi4gTm90ZSB0aGF0IHRoaXMgdmVydGV4IGlzIE5PVCBpbmNsdWRlZCB3aGVuIGFwcGVuZGluZy5cclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uQXBwZW5kKHBvbHlnb24sIHBvbHksIGZyb20sIHRvKXtcclxuICAgIGZvcih2YXIgaT1mcm9tOyBpPHRvOyBpKyspe1xyXG4gICAgICAgIHBvbHlnb24ucHVzaChwb2x5W2ldKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2x5Z29uIHZlcnRpY2VzIGFyZSBvcmRlcmVkIGNvdW50ZXItY2xvY2t3aXNlLlxyXG4gKiBAbWV0aG9kIG1ha2VDQ1dcclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25NYWtlQ0NXKHBvbHlnb24pe1xyXG4gICAgdmFyIGJyID0gMCxcclxuICAgICAgICB2ID0gcG9seWdvbjtcclxuXHJcbiAgICAvLyBmaW5kIGJvdHRvbSByaWdodCBwb2ludFxyXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgaWYgKHZbaV1bMV0gPCB2W2JyXVsxXSB8fCAodltpXVsxXSA9PT0gdlticl1bMV0gJiYgdltpXVswXSA+IHZbYnJdWzBdKSkge1xyXG4gICAgICAgICAgICBiciA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHJldmVyc2UgcG9seSBpZiBjbG9ja3dpc2VcclxuICAgIGlmICghaXNMZWZ0KHBvbHlnb25BdChwb2x5Z29uLCBiciAtIDEpLCBwb2x5Z29uQXQocG9seWdvbiwgYnIpLCBwb2x5Z29uQXQocG9seWdvbiwgYnIgKyAxKSkpIHtcclxuICAgICAgICBwb2x5Z29uUmV2ZXJzZShwb2x5Z29uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV2ZXJzZSB0aGUgdmVydGljZXMgaW4gdGhlIHBvbHlnb25cclxuICogQG1ldGhvZCByZXZlcnNlXHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uUmV2ZXJzZShwb2x5Z29uKXtcclxuICAgIHZhciB0bXAgPSBbXTtcclxuICAgIHZhciBOID0gcG9seWdvbi5sZW5ndGg7XHJcbiAgICBmb3IodmFyIGk9MDsgaSE9PU47IGkrKyl7XHJcbiAgICAgICAgdG1wLnB1c2gocG9seWdvbi5wb3AoKSk7XHJcbiAgICB9XHJcbiAgICBmb3IodmFyIGk9MDsgaSE9PU47IGkrKyl7XHJcblx0XHRwb2x5Z29uW2ldID0gdG1wW2ldO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYSBwb2ludCBpbiB0aGUgcG9seWdvbiBpcyBhIHJlZmxleCBwb2ludFxyXG4gKiBAbWV0aG9kIGlzUmVmbGV4XHJcbiAqIEBwYXJhbSAge051bWJlcn0gIGlcclxuICogQHJldHVybiB7Qm9vbGVhbn1cclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25Jc1JlZmxleChwb2x5Z29uLCBpKXtcclxuICAgIHJldHVybiBpc1JpZ2h0KHBvbHlnb25BdChwb2x5Z29uLCBpIC0gMSksIHBvbHlnb25BdChwb2x5Z29uLCBpKSwgcG9seWdvbkF0KHBvbHlnb24sIGkgKyAxKSk7XHJcbn1cclxuXHJcbnZhciB0bXBMaW5lMT1bXSxcclxuICAgIHRtcExpbmUyPVtdO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHR3byB2ZXJ0aWNlcyBpbiB0aGUgcG9seWdvbiBjYW4gc2VlIGVhY2ggb3RoZXJcclxuICogQG1ldGhvZCBjYW5TZWVcclxuICogQHBhcmFtICB7TnVtYmVyfSBhIFZlcnRleCBpbmRleCAxXHJcbiAqIEBwYXJhbSAge051bWJlcn0gYiBWZXJ0ZXggaW5kZXggMlxyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gcG9seWdvbkNhblNlZShwb2x5Z29uLCBhLGIpIHtcclxuICAgIHZhciBwLCBkaXN0LCBsMT10bXBMaW5lMSwgbDI9dG1wTGluZTI7XHJcblxyXG4gICAgaWYgKGlzTGVmdE9uKHBvbHlnb25BdChwb2x5Z29uLCBhICsgMSksIHBvbHlnb25BdChwb2x5Z29uLCBhKSwgcG9seWdvbkF0KHBvbHlnb24sIGIpKSAmJiBpc1JpZ2h0T24ocG9seWdvbkF0KHBvbHlnb24sIGEgLSAxKSwgcG9seWdvbkF0KHBvbHlnb24sIGEpLCBwb2x5Z29uQXQocG9seWdvbiwgYikpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZGlzdCA9IHNxZGlzdChwb2x5Z29uQXQocG9seWdvbiwgYSksIHBvbHlnb25BdChwb2x5Z29uLCBiKSk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSAhPT0gcG9seWdvbi5sZW5ndGg7ICsraSkgeyAvLyBmb3IgZWFjaCBlZGdlXHJcbiAgICAgICAgaWYgKChpICsgMSkgJSBwb2x5Z29uLmxlbmd0aCA9PT0gYSB8fCBpID09PSBhKXsgLy8gaWdub3JlIGluY2lkZW50IGVkZ2VzXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNMZWZ0T24ocG9seWdvbkF0KHBvbHlnb24sIGEpLCBwb2x5Z29uQXQocG9seWdvbiwgYiksIHBvbHlnb25BdChwb2x5Z29uLCBpICsgMSkpICYmIGlzUmlnaHRPbihwb2x5Z29uQXQocG9seWdvbiwgYSksIHBvbHlnb25BdChwb2x5Z29uLCBiKSwgcG9seWdvbkF0KHBvbHlnb24sIGkpKSkgeyAvLyBpZiBkaWFnIGludGVyc2VjdHMgYW4gZWRnZVxyXG4gICAgICAgICAgICBsMVswXSA9IHBvbHlnb25BdChwb2x5Z29uLCBhKTtcclxuICAgICAgICAgICAgbDFbMV0gPSBwb2x5Z29uQXQocG9seWdvbiwgYik7XHJcbiAgICAgICAgICAgIGwyWzBdID0gcG9seWdvbkF0KHBvbHlnb24sIGkpO1xyXG4gICAgICAgICAgICBsMlsxXSA9IHBvbHlnb25BdChwb2x5Z29uLCBpICsgMSk7XHJcbiAgICAgICAgICAgIHAgPSBsaW5lSW50KGwxLGwyKTtcclxuICAgICAgICAgICAgaWYgKHNxZGlzdChwb2x5Z29uQXQocG9seWdvbiwgYSksIHApIDwgZGlzdCkgeyAvLyBpZiBlZGdlIGlzIGJsb2NraW5nIHZpc2liaWxpdHkgdG8gYlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdHdvIHZlcnRpY2VzIGluIHRoZSBwb2x5Z29uIGNhbiBzZWUgZWFjaCBvdGhlclxyXG4gKiBAbWV0aG9kIGNhblNlZTJcclxuICogQHBhcmFtICB7TnVtYmVyfSBhIFZlcnRleCBpbmRleCAxXHJcbiAqIEBwYXJhbSAge051bWJlcn0gYiBWZXJ0ZXggaW5kZXggMlxyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gcG9seWdvbkNhblNlZTIocG9seWdvbiwgYSxiKSB7XHJcbiAgICAvLyBmb3IgZWFjaCBlZGdlXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSAhPT0gcG9seWdvbi5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIC8vIGlnbm9yZSBpbmNpZGVudCBlZGdlc1xyXG4gICAgICAgIGlmIChpID09PSBhIHx8IGkgPT09IGIgfHwgKGkgKyAxKSAlIHBvbHlnb24ubGVuZ3RoID09PSBhIHx8IChpICsgMSkgJSBwb2x5Z29uLmxlbmd0aCA9PT0gYil7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggbGluZVNlZ21lbnRzSW50ZXJzZWN0KHBvbHlnb25BdChwb2x5Z29uLCBhKSwgcG9seWdvbkF0KHBvbHlnb24sIGIpLCBwb2x5Z29uQXQocG9seWdvbiwgaSksIHBvbHlnb25BdChwb2x5Z29uLCBpKzEpKSApe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3B5IHRoZSBwb2x5Z29uIGZyb20gdmVydGV4IGkgdG8gdmVydGV4IGouXHJcbiAqIEBtZXRob2QgY29weVxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGlcclxuICogQHBhcmFtICB7TnVtYmVyfSBqXHJcbiAqIEBwYXJhbSAge1BvbHlnb259IFt0YXJnZXRQb2x5XSAgIE9wdGlvbmFsIHRhcmdldCBwb2x5Z29uIHRvIHNhdmUgaW4uXHJcbiAqIEByZXR1cm4ge1BvbHlnb259ICAgICAgICAgICAgICAgIFRoZSByZXN1bHRpbmcgY29weS5cclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25Db3B5KHBvbHlnb24sIGksaix0YXJnZXRQb2x5KXtcclxuICAgIHZhciBwID0gdGFyZ2V0UG9seSB8fCBbXTtcclxuICAgIHBvbHlnb25DbGVhcihwKTtcclxuICAgIGlmIChpIDwgaikge1xyXG4gICAgICAgIC8vIEluc2VydCBhbGwgdmVydGljZXMgZnJvbSBpIHRvIGpcclxuICAgICAgICBmb3IodmFyIGs9aTsgazw9ajsgaysrKXtcclxuICAgICAgICAgICAgcC5wdXNoKHBvbHlnb25ba10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAvLyBJbnNlcnQgdmVydGljZXMgMCB0byBqXHJcbiAgICAgICAgZm9yKHZhciBrPTA7IGs8PWo7IGsrKyl7XHJcbiAgICAgICAgICAgIHAucHVzaChwb2x5Z29uW2tdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluc2VydCB2ZXJ0aWNlcyBpIHRvIGVuZFxyXG4gICAgICAgIGZvcih2YXIgaz1pOyBrPHBvbHlnb24ubGVuZ3RoOyBrKyspe1xyXG4gICAgICAgICAgICBwLnB1c2gocG9seWdvbltrXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwO1xyXG59XHJcblxyXG4vKipcclxuICogRGVjb21wb3NlcyB0aGUgcG9seWdvbiBpbnRvIGNvbnZleCBwaWVjZXMuIFJldHVybnMgYSBsaXN0IG9mIGVkZ2VzIFtbcDEscDJdLFtwMixwM10sLi4uXSB0aGF0IGN1dHMgdGhlIHBvbHlnb24uXHJcbiAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBoYXMgY29tcGxleGl0eSBPKE5eNCkgYW5kIHdpbGwgYmUgdmVyeSBzbG93IGZvciBwb2x5Z29ucyB3aXRoIG1hbnkgdmVydGljZXMuXHJcbiAqIEBtZXRob2QgZ2V0Q3V0RWRnZXNcclxuICogQHJldHVybiB7QXJyYXl9XHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uR2V0Q3V0RWRnZXMocG9seWdvbikge1xyXG4gICAgdmFyIG1pbj1bXSwgdG1wMT1bXSwgdG1wMj1bXSwgdG1wUG9seSA9IFtdO1xyXG4gICAgdmFyIG5EaWFncyA9IE51bWJlci5NQVhfVkFMVUU7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgaWYgKHBvbHlnb25Jc1JlZmxleChwb2x5Z29uLCBpKSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBvbHlnb24ubGVuZ3RoOyArK2opIHtcclxuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ2FuU2VlKHBvbHlnb24sIGksIGopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG1wMSA9IHBvbHlnb25HZXRDdXRFZGdlcyhwb2x5Z29uQ29weShwb2x5Z29uLCBpLCBqLCB0bXBQb2x5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHBvbHlnb25HZXRDdXRFZGdlcyhwb2x5Z29uQ29weShwb2x5Z29uLCBqLCBpLCB0bXBQb2x5KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaz0wOyBrPHRtcDIubGVuZ3RoOyBrKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0bXAxLnB1c2godG1wMltrXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodG1wMS5sZW5ndGggPCBuRGlhZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gdG1wMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbkRpYWdzID0gdG1wMS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wdXNoKFtwb2x5Z29uQXQocG9seWdvbiwgaSksIHBvbHlnb25BdChwb2x5Z29uLCBqKV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWluO1xyXG59XHJcblxyXG4vKipcclxuICogRGVjb21wb3NlcyB0aGUgcG9seWdvbiBpbnRvIG9uZSBvciBtb3JlIGNvbnZleCBzdWItUG9seWdvbnMuXHJcbiAqIEBtZXRob2QgZGVjb21wXHJcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvciBQb2x5Z29uIG9iamVjdHMuXHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uRGVjb21wKHBvbHlnb24pe1xyXG4gICAgdmFyIGVkZ2VzID0gcG9seWdvbkdldEN1dEVkZ2VzKHBvbHlnb24pO1xyXG4gICAgaWYoZWRnZXMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgcmV0dXJuIHBvbHlnb25TbGljZShwb2x5Z29uLCBlZGdlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbcG9seWdvbl07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTbGljZXMgdGhlIHBvbHlnb24gZ2l2ZW4gb25lIG9yIG1vcmUgY3V0IGVkZ2VzLiBJZiBnaXZlbiBvbmUsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHdvIHBvbHlnb25zIChmYWxzZSBvbiBmYWlsdXJlKS4gSWYgbWFueSwgYW4gYXJyYXkgb2YgcG9seWdvbnMuXHJcbiAqIEBtZXRob2Qgc2xpY2VcclxuICogQHBhcmFtIHtBcnJheX0gY3V0RWRnZXMgQSBsaXN0IG9mIGVkZ2VzLCBhcyByZXR1cm5lZCBieSAuZ2V0Q3V0RWRnZXMoKVxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25TbGljZShwb2x5Z29uLCBjdXRFZGdlcyl7XHJcbiAgICBpZihjdXRFZGdlcy5sZW5ndGggPT09IDApe1xyXG5cdFx0cmV0dXJuIFtwb2x5Z29uXTtcclxuICAgIH1cclxuICAgIGlmKGN1dEVkZ2VzIGluc3RhbmNlb2YgQXJyYXkgJiYgY3V0RWRnZXMubGVuZ3RoICYmIGN1dEVkZ2VzWzBdIGluc3RhbmNlb2YgQXJyYXkgJiYgY3V0RWRnZXNbMF0ubGVuZ3RoPT09MiAmJiBjdXRFZGdlc1swXVswXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuXHJcbiAgICAgICAgdmFyIHBvbHlzID0gW3BvbHlnb25dO1xyXG5cclxuICAgICAgICBmb3IodmFyIGk9MDsgaTxjdXRFZGdlcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIHZhciBjdXRFZGdlID0gY3V0RWRnZXNbaV07XHJcbiAgICAgICAgICAgIC8vIEN1dCBhbGwgcG9seXNcclxuICAgICAgICAgICAgZm9yKHZhciBqPTA7IGo8cG9seXMubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvbHkgPSBwb2x5c1tqXTtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBwb2x5Z29uU2xpY2UocG9seSwgY3V0RWRnZSk7XHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIHBvbHkhIEN1dCBhbmQgcXVpdFxyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlzLnNwbGljZShqLDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlzLnB1c2gocmVzdWx0WzBdLHJlc3VsdFsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwb2x5cztcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgIC8vIFdhcyBnaXZlbiBvbmUgZWRnZVxyXG4gICAgICAgIHZhciBjdXRFZGdlID0gY3V0RWRnZXM7XHJcbiAgICAgICAgdmFyIGkgPSBwb2x5Z29uLmluZGV4T2YoY3V0RWRnZVswXSk7XHJcbiAgICAgICAgdmFyIGogPSBwb2x5Z29uLmluZGV4T2YoY3V0RWRnZVsxXSk7XHJcblxyXG4gICAgICAgIGlmKGkgIT09IC0xICYmIGogIT09IC0xKXtcclxuICAgICAgICAgICAgcmV0dXJuIFtwb2x5Z29uQ29weShwb2x5Z29uLCBpLGopLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25Db3B5KHBvbHlnb24sIGosaSldO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgdGhhdCB0aGUgbGluZSBzZWdtZW50cyBvZiB0aGlzIHBvbHlnb24gZG8gbm90IGludGVyc2VjdCBlYWNoIG90aGVyLlxyXG4gKiBAbWV0aG9kIGlzU2ltcGxlXHJcbiAqIEBwYXJhbSAge0FycmF5fSBwYXRoIEFuIGFycmF5IG9mIHZlcnRpY2VzIGUuZy4gW1swLDBdLFswLDFdLC4uLl1cclxuICogQHJldHVybiB7Qm9vbGVhbn1cclxuICogQHRvZG8gU2hvdWxkIGl0IGNoZWNrIGFsbCBzZWdtZW50cyB3aXRoIGFsbCBvdGhlcnM/XHJcbiAqL1xyXG5mdW5jdGlvbiBwb2x5Z29uSXNTaW1wbGUocG9seWdvbil7XHJcbiAgICB2YXIgcGF0aCA9IHBvbHlnb24sIGk7XHJcbiAgICAvLyBDaGVja1xyXG4gICAgZm9yKGk9MDsgaTxwYXRoLmxlbmd0aC0xOyBpKyspe1xyXG4gICAgICAgIGZvcih2YXIgaj0wOyBqPGktMTsgaisrKXtcclxuICAgICAgICAgICAgaWYobGluZVNlZ21lbnRzSW50ZXJzZWN0KHBhdGhbaV0sIHBhdGhbaSsxXSwgcGF0aFtqXSwgcGF0aFtqKzFdICkpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIHRoZSBzZWdtZW50IGJldHdlZW4gdGhlIGxhc3QgYW5kIHRoZSBmaXJzdCBwb2ludCB0byBhbGwgb3RoZXJzXHJcbiAgICBmb3IoaT0xOyBpPHBhdGgubGVuZ3RoLTI7IGkrKyl7XHJcbiAgICAgICAgaWYobGluZVNlZ21lbnRzSW50ZXJzZWN0KHBhdGhbMF0sIHBhdGhbcGF0aC5sZW5ndGgtMV0sIHBhdGhbaV0sIHBhdGhbaSsxXSApKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0SW50ZXJzZWN0aW9uUG9pbnQocDEsIHAyLCBxMSwgcTIsIGRlbHRhKXtcclxuXHRkZWx0YSA9IGRlbHRhIHx8IDA7XHJcblx0dmFyIGExID0gcDJbMV0gLSBwMVsxXTtcclxuXHR2YXIgYjEgPSBwMVswXSAtIHAyWzBdO1xyXG5cdHZhciBjMSA9IChhMSAqIHAxWzBdKSArIChiMSAqIHAxWzFdKTtcclxuXHR2YXIgYTIgPSBxMlsxXSAtIHExWzFdO1xyXG5cdHZhciBiMiA9IHExWzBdIC0gcTJbMF07XHJcblx0dmFyIGMyID0gKGEyICogcTFbMF0pICsgKGIyICogcTFbMV0pO1xyXG5cdHZhciBkZXQgPSAoYTEgKiBiMikgLSAoYTIgKiBiMSk7XHJcblxyXG5cdGlmKCFzY2FsYXJfZXEoZGV0LDAsZGVsdGEpKXtcclxuXHRcdHJldHVybiBbKChiMiAqIGMxKSAtIChiMSAqIGMyKSkgLyBkZXQsICgoYTEgKiBjMikgLSAoYTIgKiBjMSkpIC8gZGV0XTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIFswLDBdO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUXVpY2tseSBkZWNvbXBvc2UgdGhlIFBvbHlnb24gaW50byBjb252ZXggc3ViLXBvbHlnb25zLlxyXG4gKiBAbWV0aG9kIHF1aWNrRGVjb21wXHJcbiAqIEBwYXJhbSAge0FycmF5fSByZXN1bHRcclxuICogQHBhcmFtICB7QXJyYXl9IFtyZWZsZXhWZXJ0aWNlc11cclxuICogQHBhcmFtICB7QXJyYXl9IFtzdGVpbmVyUG9pbnRzXVxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtkZWx0YV1cclxuICogQHBhcmFtICB7TnVtYmVyfSBbbWF4bGV2ZWxdXHJcbiAqIEBwYXJhbSAge051bWJlcn0gW2xldmVsXVxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25RdWlja0RlY29tcChwb2x5Z29uLCByZXN1bHQscmVmbGV4VmVydGljZXMsc3RlaW5lclBvaW50cyxkZWx0YSxtYXhsZXZlbCxsZXZlbCl7XHJcbiAgICBtYXhsZXZlbCA9IG1heGxldmVsIHx8IDEwMDtcclxuICAgIGxldmVsID0gbGV2ZWwgfHwgMDtcclxuICAgIGRlbHRhID0gZGVsdGEgfHwgMjU7XHJcbiAgICByZXN1bHQgPSB0eXBlb2YocmVzdWx0KSE9PVwidW5kZWZpbmVkXCIgPyByZXN1bHQgOiBbXTtcclxuICAgIHJlZmxleFZlcnRpY2VzID0gcmVmbGV4VmVydGljZXMgfHwgW107XHJcbiAgICBzdGVpbmVyUG9pbnRzID0gc3RlaW5lclBvaW50cyB8fCBbXTtcclxuXHJcbiAgICB2YXIgdXBwZXJJbnQ9WzAsMF0sIGxvd2VySW50PVswLDBdLCBwPVswLDBdOyAvLyBQb2ludHNcclxuICAgIHZhciB1cHBlckRpc3Q9MCwgbG93ZXJEaXN0PTAsIGQ9MCwgY2xvc2VzdERpc3Q9MDsgLy8gc2NhbGFyc1xyXG4gICAgdmFyIHVwcGVySW5kZXg9MCwgbG93ZXJJbmRleD0wLCBjbG9zZXN0SW5kZXg9MDsgLy8gSW50ZWdlcnNcclxuICAgIHZhciBsb3dlclBvbHk9W10sIHVwcGVyUG9seT1bXTsgLy8gcG9seWdvbnNcclxuICAgIHZhciBwb2x5ID0gcG9seWdvbixcclxuICAgICAgICB2ID0gcG9seWdvbjtcclxuXHJcbiAgICBpZih2Lmxlbmd0aCA8IDMpe1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBsZXZlbCsrO1xyXG4gICAgaWYobGV2ZWwgPiBtYXhsZXZlbCl7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFwicXVpY2tEZWNvbXA6IG1heCBsZXZlbCAoXCIrbWF4bGV2ZWwrXCIpIHJlYWNoZWQuXCIpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgaWYgKHBvbHlnb25Jc1JlZmxleChwb2x5LCBpKSkge1xyXG4gICAgICAgICAgICByZWZsZXhWZXJ0aWNlcy5wdXNoKHBvbHlbaV0pO1xyXG4gICAgICAgICAgICB1cHBlckRpc3QgPSBsb3dlckRpc3QgPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9seWdvbi5sZW5ndGg7ICsraikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTGVmdChwb2x5Z29uQXQocG9seSwgaSAtIDEpLCBwb2x5Z29uQXQocG9seSwgaSksIHBvbHlnb25BdChwb2x5LCBqKSkgJiYgaXNSaWdodE9uKHBvbHlnb25BdChwb2x5LCBpIC0gMSksIHBvbHlnb25BdChwb2x5LCBpKSwgcG9seWdvbkF0KHBvbHksIGogLSAxKSkpIHsgLy8gaWYgbGluZSBpbnRlcnNlY3RzIHdpdGggYW4gZWRnZVxyXG4gICAgICAgICAgICAgICAgICAgIHAgPSBnZXRJbnRlcnNlY3Rpb25Qb2ludChwb2x5Z29uQXQocG9seSwgaSAtIDEpLCBwb2x5Z29uQXQocG9seSwgaSksIHBvbHlnb25BdChwb2x5LCBqKSwgcG9seWdvbkF0KHBvbHksIGogLSAxKSk7IC8vIGZpbmQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1JpZ2h0KHBvbHlnb25BdChwb2x5LCBpICsgMSksIHBvbHlnb25BdChwb2x5LCBpKSwgcCkpIHsgLy8gbWFrZSBzdXJlIGl0J3MgaW5zaWRlIHRoZSBwb2x5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBzcWRpc3QocG9seVtpXSwgcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgbG93ZXJEaXN0KSB7IC8vIGtlZXAgb25seSB0aGUgY2xvc2VzdCBpbnRlcnNlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyRGlzdCA9IGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckludCA9IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckluZGV4ID0gajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0xlZnQocG9seWdvbkF0KHBvbHksIGkgKyAxKSwgcG9seWdvbkF0KHBvbHksIGkpLCBwb2x5Z29uQXQocG9seSwgaiArIDEpKSAmJiBpc1JpZ2h0T24ocG9seWdvbkF0KHBvbHksIGkgKyAxKSwgcG9seWdvbkF0KHBvbHksIGkpLCBwb2x5Z29uQXQocG9seSwgaikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcCA9IGdldEludGVyc2VjdGlvblBvaW50KHBvbHlnb25BdChwb2x5LCBpICsgMSksIHBvbHlnb25BdChwb2x5LCBpKSwgcG9seWdvbkF0KHBvbHksIGopLCBwb2x5Z29uQXQocG9seSwgaiArIDEpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNMZWZ0KHBvbHlnb25BdChwb2x5LCBpIC0gMSksIHBvbHlnb25BdChwb2x5LCBpKSwgcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHNxZGlzdChwb2x5W2ldLCBwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCB1cHBlckRpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyRGlzdCA9IGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlckludCA9IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlckluZGV4ID0gajtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIHZlcnRpY2VzIHRvIGNvbm5lY3QgdG8sIGNob29zZSBhIHBvaW50IGluIHRoZSBtaWRkbGVcclxuICAgICAgICAgICAgaWYgKGxvd2VySW5kZXggPT09ICh1cHBlckluZGV4ICsgMSkgJSBwb2x5Z29uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkNhc2UgMTogVmVydGV4KFwiK2krXCIpLCBsb3dlckluZGV4KFwiK2xvd2VySW5kZXgrXCIpLCB1cHBlckluZGV4KFwiK3VwcGVySW5kZXgrXCIpLCBwb2x5LnNpemUoXCIrcG9seWdvbi5sZW5ndGgrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgcFswXSA9IChsb3dlckludFswXSArIHVwcGVySW50WzBdKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBwWzFdID0gKGxvd2VySW50WzFdICsgdXBwZXJJbnRbMV0pIC8gMjtcclxuICAgICAgICAgICAgICAgIHN0ZWluZXJQb2ludHMucHVzaChwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHVwcGVySW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2xvd2VyUG9seS5pbnNlcnQobG93ZXJQb2x5LmVuZCgpLCBwb2x5LmJlZ2luKCkgKyBpLCBwb2x5LmJlZ2luKCkgKyB1cHBlckluZGV4ICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZChsb3dlclBvbHksIHBvbHksIGksIHVwcGVySW5kZXgrMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG93ZXJQb2x5LnB1c2gocCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBwZXJQb2x5LnB1c2gocCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvd2VySW5kZXggIT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3VwcGVyUG9seS5pbnNlcnQodXBwZXJQb2x5LmVuZCgpLCBwb2x5LmJlZ2luKCkgKyBsb3dlckluZGV4LCBwb2x5LmVuZCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZCh1cHBlclBvbHksIHBvbHksbG93ZXJJbmRleCxwb2x5Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vdXBwZXJQb2x5Lmluc2VydCh1cHBlclBvbHkuZW5kKCksIHBvbHkuYmVnaW4oKSwgcG9seS5iZWdpbigpICsgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25BcHBlbmQodXBwZXJQb2x5LCBwb2x5LDAsaSsxKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xvd2VyUG9seS5pbnNlcnQobG93ZXJQb2x5LmVuZCgpLCBwb2x5LmJlZ2luKCkgKyBpLCBwb2x5LmVuZCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZChsb3dlclBvbHksIHBvbHksaSxwb2x5Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vbG93ZXJQb2x5Lmluc2VydChsb3dlclBvbHkuZW5kKCksIHBvbHkuYmVnaW4oKSwgcG9seS5iZWdpbigpICsgdXBwZXJJbmRleCArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25BcHBlbmQobG93ZXJQb2x5LCBwb2x5LDAsdXBwZXJJbmRleCsxKTtcclxuICAgICAgICAgICAgICAgICAgICBsb3dlclBvbHkucHVzaChwKTtcclxuICAgICAgICAgICAgICAgICAgICB1cHBlclBvbHkucHVzaChwKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3VwcGVyUG9seS5pbnNlcnQodXBwZXJQb2x5LmVuZCgpLCBwb2x5LmJlZ2luKCkgKyBsb3dlckluZGV4LCBwb2x5LmJlZ2luKCkgKyBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZCh1cHBlclBvbHksIHBvbHksbG93ZXJJbmRleCxpKzEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGUgY2xvc2VzdCBwb2ludCB3aXRoaW4gdGhlIHRyaWFuZ2xlXHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiQ2FzZSAyOiBWZXJ0ZXgoXCIraStcIiksIGNsb3Nlc3RJbmRleChcIitjbG9zZXN0SW5kZXgrXCIpLCBwb2x5LnNpemUoXCIrcG9seWdvbi5sZW5ndGgrXCIpXFxuXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsb3dlckluZGV4ID4gdXBwZXJJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwcGVySW5kZXggKz0gcG9seWdvbi5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdCA9IE51bWJlci5NQVhfVkFMVUU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodXBwZXJJbmRleCA8IGxvd2VySW5kZXgpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGxvd2VySW5kZXg7IGogPD0gdXBwZXJJbmRleDsgKytqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xlZnRPbihwb2x5Z29uQXQocG9seSwgaSAtIDEpLCBwb2x5Z29uQXQocG9seSwgaSksIHBvbHlnb25BdChwb2x5LCBqKSkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNSaWdodE9uKHBvbHlnb25BdChwb2x5LCBpICsgMSksIHBvbHlnb25BdChwb2x5LCBpKSwgcG9seWdvbkF0KHBvbHksIGopKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkID0gc3FkaXN0KHBvbHlnb25BdChwb2x5LCBpKSwgcG9seWdvbkF0KHBvbHksIGopKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBjbG9zZXN0RGlzdCAmJiBwb2x5Z29uQ2FuU2VlMihwb2x5LCBpLCBqKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3QgPSBkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEluZGV4ID0gaiAlIHBvbHlnb24ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgY2xvc2VzdEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZChsb3dlclBvbHksIHBvbHksaSxjbG9zZXN0SW5kZXgrMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RJbmRleCAhPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlnb25BcHBlbmQodXBwZXJQb2x5LCBwb2x5LGNsb3Nlc3RJbmRleCx2Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25BcHBlbmQodXBwZXJQb2x5LCBwb2x5LDAsaSsxKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2x5Z29uQXBwZW5kKGxvd2VyUG9seSwgcG9seSxpLHYubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZChsb3dlclBvbHksIHBvbHksMCxjbG9zZXN0SW5kZXgrMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbkFwcGVuZCh1cHBlclBvbHksIHBvbHksY2xvc2VzdEluZGV4LGkrMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNvbHZlIHNtYWxsZXN0IHBvbHkgZmlyc3RcclxuICAgICAgICAgICAgaWYgKGxvd2VyUG9seS5sZW5ndGggPCB1cHBlclBvbHkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBwb2x5Z29uUXVpY2tEZWNvbXAobG93ZXJQb2x5LHJlc3VsdCxyZWZsZXhWZXJ0aWNlcyxzdGVpbmVyUG9pbnRzLGRlbHRhLG1heGxldmVsLGxldmVsKTtcclxuICAgICAgICAgICAgICAgIHBvbHlnb25RdWlja0RlY29tcCh1cHBlclBvbHkscmVzdWx0LHJlZmxleFZlcnRpY2VzLHN0ZWluZXJQb2ludHMsZGVsdGEsbWF4bGV2ZWwsbGV2ZWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcG9seWdvblF1aWNrRGVjb21wKHVwcGVyUG9seSxyZXN1bHQscmVmbGV4VmVydGljZXMsc3RlaW5lclBvaW50cyxkZWx0YSxtYXhsZXZlbCxsZXZlbCk7XHJcbiAgICAgICAgICAgICAgICBwb2x5Z29uUXVpY2tEZWNvbXAobG93ZXJQb2x5LHJlc3VsdCxyZWZsZXhWZXJ0aWNlcyxzdGVpbmVyUG9pbnRzLGRlbHRhLG1heGxldmVsLGxldmVsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXN1bHQucHVzaChwb2x5Z29uKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIGNvbGxpbmVhciBwb2ludHMgaW4gdGhlIHBvbHlnb24uXHJcbiAqIEBtZXRob2QgcmVtb3ZlQ29sbGluZWFyUG9pbnRzXHJcbiAqIEBwYXJhbSAge051bWJlcn0gW3ByZWNpc2lvbl0gVGhlIHRocmVzaG9sZCBhbmdsZSB0byB1c2Ugd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHR3byBlZGdlcyBhcmUgY29sbGluZWFyLiBVc2UgemVybyBmb3IgZmluZXN0IHByZWNpc2lvbi5cclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgVGhlIG51bWJlciBvZiBwb2ludHMgcmVtb3ZlZFxyXG4gKi9cclxuZnVuY3Rpb24gcG9seWdvblJlbW92ZUNvbGxpbmVhclBvaW50cyhwb2x5Z29uLCBwcmVjaXNpb24pe1xyXG4gICAgdmFyIG51bSA9IDA7XHJcbiAgICBmb3IodmFyIGk9cG9seWdvbi5sZW5ndGgtMTsgcG9seWdvbi5sZW5ndGg+MyAmJiBpPj0wOyAtLWkpe1xyXG4gICAgICAgIGlmKGNvbGxpbmVhcihwb2x5Z29uQXQocG9seWdvbiwgaS0xKSxwb2x5Z29uQXQocG9seWdvbiwgaSkscG9seWdvbkF0KHBvbHlnb24sIGkrMSkscHJlY2lzaW9uKSl7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWlkZGxlIHBvaW50XHJcbiAgICAgICAgICAgIHBvbHlnb24uc3BsaWNlKGklcG9seWdvbi5sZW5ndGgsMSk7XHJcbiAgICAgICAgICAgIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudW07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgZHVwbGljYXRlIHBvaW50cyBpbiB0aGUgcG9seWdvbi5cclxuICogQG1ldGhvZCByZW1vdmVEdXBsaWNhdGVQb2ludHNcclxuICogQHBhcmFtICB7TnVtYmVyfSBbcHJlY2lzaW9uXSBUaGUgdGhyZXNob2xkIHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdHdvIHBvaW50cyBhcmUgdGhlIHNhbWUuIFVzZSB6ZXJvIGZvciBiZXN0IHByZWNpc2lvbi5cclxuICovXHJcbmZ1bmN0aW9uIHBvbHlnb25SZW1vdmVEdXBsaWNhdGVQb2ludHMocG9seWdvbiwgcHJlY2lzaW9uKXtcclxuICAgIGZvcih2YXIgaT1wb2x5Z29uLmxlbmd0aC0xOyBpPj0xOyAtLWkpe1xyXG4gICAgICAgIHZhciBwaSA9IHBvbHlnb25baV07XHJcbiAgICAgICAgZm9yKHZhciBqPWktMTsgaj49MDsgLS1qKXtcclxuICAgICAgICAgICAgaWYocG9pbnRzX2VxKHBpLCBwb2x5Z29uW2pdLCBwcmVjaXNpb24pKXtcclxuICAgICAgICAgICAgICAgIHBvbHlnb24uc3BsaWNlKGksMSk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHR3byBzY2FsYXJzIGFyZSBlcXVhbFxyXG4gKiBAc3RhdGljXHJcbiAqIEBtZXRob2QgZXFcclxuICogQHBhcmFtICB7TnVtYmVyfSBhXHJcbiAqIEBwYXJhbSAge051bWJlcn0gYlxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtwcmVjaXNpb25dXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XHJcbiAqL1xyXG5mdW5jdGlvbiBzY2FsYXJfZXEoYSxiLHByZWNpc2lvbil7XHJcbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gfHwgMDtcclxuICAgIHJldHVybiBNYXRoLmFicyhhLWIpIDw9IHByZWNpc2lvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXHJcbiAqIEBzdGF0aWNcclxuICogQG1ldGhvZCBwb2ludHNfZXFcclxuICogQHBhcmFtICB7QXJyYXl9IGFcclxuICogQHBhcmFtICB7QXJyYXl9IGJcclxuICogQHBhcmFtICB7TnVtYmVyfSBbcHJlY2lzaW9uXVxyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxyXG4gKi9cclxuZnVuY3Rpb24gcG9pbnRzX2VxKGEsYixwcmVjaXNpb24pe1xyXG4gICAgcmV0dXJuIHNjYWxhcl9lcShhWzBdLGJbMF0scHJlY2lzaW9uKSAmJiBzY2FsYXJfZXEoYVsxXSxiWzFdLHByZWNpc2lvbik7XHJcbn1cclxuIiwiLyoqXHJcbiogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGhvdG9uc3Rvcm0vcGhhc2VyMy1wbHVnaW4tdGVtcGxhdGUvYmxvYi9tYXN0ZXIvTElDRU5TRXxNSVQgTGljZW5zZX1cclxuKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIEdsb2JhbCBQbHVnaW4gaXMgaW5zdGFsbGVkIGp1c3Qgb25jZSBpbnRvIHRoZSBHYW1lIG93bmVkIFBsdWdpbiBNYW5hZ2VyLlxyXG4gKiBJdCBjYW4gbGlzdGVuIGZvciBHYW1lIGV2ZW50cyBhbmQgcmVzcG9uZCB0byB0aGVtLlxyXG4gKlxyXG4gKiBAY2xhc3MgQmFzZVBsdWdpblxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlBsdWdpbnNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXJ9IHBsdWdpbk1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgUGx1Z2luIE1hbmFnZXIuXHJcbiAqL1xyXG52YXIgQmFzZVBsdWdpbiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBCYXNlUGx1Z2luIChwbHVnaW5NYW5hZ2VyKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgaGFuZHkgcmVmZXJlbmNlIHRvIHRoZSBQbHVnaW4gTWFuYWdlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHBsdWdpbi5cclxuICAgICAgICAgKiBDYW4gYmUgdXNlZCBhcyBhIHJvdXRlIHRvIGdhaW4gYWNjZXNzIHRvIGdhbWUgc3lzdGVtcyBhbmQgIGV2ZW50cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW4jcGx1Z2luTWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsdWdpbk1hbmFnZXIgPSBwbHVnaW5NYW5hZ2VyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgR2FtZSBpbnN0YW5jZSB0aGlzIHBsdWdpbiBpcyBydW5uaW5nIHVuZGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlBsdWdpbnMuQmFzZVBsdWdpbiNnYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lfVxyXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBwbHVnaW5NYW5hZ2VyLmdhbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFBsdWdpbk1hbmFnZXIgY2FsbHMgdGhpcyBtZXRob2Qgb24gYSBHbG9iYWwgUGx1Z2luIHdoZW4gdGhlIHBsdWdpbiBpcyBmaXJzdCBpbnN0YW50aWF0ZWQuXHJcbiAgICAgKiBJdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGlzIGluc3RhbmNlLlxyXG4gICAgICogSW4gaGVyZSB5b3UgY2FuIHNldC11cCB3aGF0ZXZlciB5b3UgbmVlZCBmb3IgdGhpcyBwbHVnaW4gdG8gcnVuLlxyXG4gICAgICogSWYgYSBwbHVnaW4gaXMgc2V0IHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlbiBgQmFzZVBsdWdpbi5zdGFydGAgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcy5cclxuICAgICAqIE9uIGEgU2NlbmUgUGx1Z2luLCB0aGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQuIFVzZSB7QGxpbmsgUGhhc2VyLlBsdWdpbnMuU2NlbmVQbHVnaW4jYm9vdH0gaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW4jaW5pdFxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHs/YW55fSBbZGF0YV0gLSBBIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdXNlciwgaWYgYW55LCBmcm9tIHRoZSBgZGF0YWAgcHJvcGVydHkgb2YgdGhlIHBsdWdpbidzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChpZiBzdGFydGVkIGF0IGdhbWUgYm9vdCkgb3IgcGFzc2VkIGluIHRoZSBQbHVnaW5NYW5hZ2VyJ3MgYGluc3RhbGxgIG1ldGhvZCAoaWYgc3RhcnRlZCBtYW51YWxseSkuXHJcbiAgICAgKi9cclxuICAgIGluaXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFBsdWdpbk1hbmFnZXIgY2FsbHMgdGhpcyBtZXRob2Qgb24gYSBHbG9iYWwgUGx1Z2luIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkLlxyXG4gICAgICogSWYgYSBwbHVnaW4gaXMgc3RvcHBlZCwgYW5kIHRoZW4gc3RhcnRlZCBhZ2FpbiwgdGhpcyB3aWxsIGdldCBjYWxsZWQgYWdhaW4uXHJcbiAgICAgKiBUeXBpY2FsbHkgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGBCYXNlUGx1Z2luLmluaXRgLlxyXG4gICAgICogT24gYSBTY2VuZSBQbHVnaW4sIHRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW4jc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyAgSGVyZSBhcmUgdGhlIGdhbWUtbGV2ZWwgZXZlbnRzIHlvdSBjYW4gbGlzdGVuIHRvLlxyXG4gICAgICAgIC8vICBBdCB0aGUgdmVyeSBsZWFzdCB5b3Ugc2hvdWxkIG9mZmVyIGEgZGVzdHJveSBoYW5kbGVyIGZvciB3aGVuIHRoZSBnYW1lIGNsb3NlcyBkb3duLlxyXG5cclxuICAgICAgICAvLyB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5nYW1lLmV2ZW50cztcclxuXHJcbiAgICAgICAgLy8gZXZlbnRFbWl0dGVyLm9uY2UoJ2Rlc3Ryb3knLCB0aGlzLmdhbWVEZXN0cm95LCB0aGlzKTtcclxuICAgICAgICAvLyBldmVudEVtaXR0ZXIub24oJ3BhdXNlJywgdGhpcy5nYW1lUGF1c2UsIHRoaXMpO1xyXG4gICAgICAgIC8vIGV2ZW50RW1pdHRlci5vbigncmVzdW1lJywgdGhpcy5nYW1lUmVzdW1lLCB0aGlzKTtcclxuICAgICAgICAvLyBldmVudEVtaXR0ZXIub24oJ3Jlc2l6ZScsIHRoaXMuZ2FtZVJlc2l6ZSwgdGhpcyk7XHJcbiAgICAgICAgLy8gZXZlbnRFbWl0dGVyLm9uKCdwcmVzdGVwJywgdGhpcy5nYW1lUHJlU3RlcCwgdGhpcyk7XHJcbiAgICAgICAgLy8gZXZlbnRFbWl0dGVyLm9uKCdzdGVwJywgdGhpcy5nYW1lU3RlcCwgdGhpcyk7XHJcbiAgICAgICAgLy8gZXZlbnRFbWl0dGVyLm9uKCdwb3N0c3RlcCcsIHRoaXMuZ2FtZVBvc3RTdGVwLCB0aGlzKTtcclxuICAgICAgICAvLyBldmVudEVtaXR0ZXIub24oJ3ByZXJlbmRlcicsIHRoaXMuZ2FtZVByZVJlbmRlciwgdGhpcyk7XHJcbiAgICAgICAgLy8gZXZlbnRFbWl0dGVyLm9uKCdwb3N0cmVuZGVyJywgdGhpcy5nYW1lUG9zdFJlbmRlciwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFBsdWdpbk1hbmFnZXIgY2FsbHMgdGhpcyBtZXRob2Qgb24gYSBHbG9iYWwgUGx1Z2luIHdoZW4gdGhlIHBsdWdpbiBpcyBzdG9wcGVkLlxyXG4gICAgICogVGhlIGdhbWUgY29kZSBoYXMgcmVxdWVzdGVkIHRoYXQgeW91ciBwbHVnaW4gc3RvcCBkb2luZyB3aGF0ZXZlciBpdCBkb2VzLlxyXG4gICAgICogSXQgaXMgbm93IGNvbnNpZGVyZWQgYXMgJ2luYWN0aXZlJyBieSB0aGUgUGx1Z2luTWFuYWdlci5cclxuICAgICAqIEhhbmRsZSB0aGF0IHByb2Nlc3MgaGVyZSAoaS5lLiBzdG9wIGxpc3RlbmluZyBmb3IgZXZlbnRzLCBldGMpXHJcbiAgICAgKiBJZiB0aGUgcGx1Z2luIGlzIHN0YXJ0ZWQgYWdhaW4gdGhlbiBgQmFzZVBsdWdpbi5zdGFydGAgd2lsbCBiZSBjYWxsZWQgYWdhaW4uXHJcbiAgICAgKiBPbiBhIFNjZW5lIFBsdWdpbiwgdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuQmFzZVBsdWdpbiNzdG9wXHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHYW1lIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZC5cclxuICAgICAqIFlvdSBtdXN0IHJlbGVhc2UgZXZlcnl0aGluZyBpbiBoZXJlLCBhbGwgcmVmZXJlbmNlcywgYWxsIG9iamVjdHMsIGZyZWUgaXQgYWxsIHVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuQmFzZVBsdWdpbiNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBsdWdpbk1hbmFnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCYXNlUGx1Z2luO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuUGx1Z2lucy5EZWZhdWx0UGx1Z2luc1xyXG4gKiBcclxuICogQHByb3BlcnR5IHthcnJheX0gR2xvYmFsIC0gVGhlc2UgYXJlIHRoZSBHbG9iYWwgTWFuYWdlcnMgdGhhdCBhcmUgY3JlYXRlZCBieSB0aGUgUGhhc2VyLkdhbWUgaW5zdGFuY2UuXHJcbiAqIEBwcm9wZXJ0eSB7YXJyYXl9IENvcmVTY2VuZSAtIFRoZXNlIGFyZSB0aGUgY29yZSBwbHVnaW5zIHRoYXQgYXJlIGluc3RhbGxlZCBpbnRvIGV2ZXJ5IFNjZW5lLlN5c3RlbXMgaW5zdGFuY2UsIG5vIG1hdHRlciB3aGF0LlxyXG4gKiBAcHJvcGVydHkge2FycmF5fSBEZWZhdWx0U2NlbmUgLSBUaGVzZSBwbHVnaW5zIGFyZSBjcmVhdGVkIGluIFNjZW5lLlN5c3RlbXMgaW4gYWRkaXRpb24gdG8gdGhlIENvcmVTY2VuZVBsdWdpbnMuXHJcbiAqL1xyXG5cclxudmFyIERlZmF1bHRQbHVnaW5zID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlc2UgYXJlIHRoZSBHbG9iYWwgTWFuYWdlcnMgdGhhdCBhcmUgY3JlYXRlZCBieSB0aGUgUGhhc2VyLkdhbWUgaW5zdGFuY2UuXHJcbiAgICAgKiBUaGV5IGFyZSByZWZlcmVuY2VkIGZyb20gU2NlbmUuU3lzdGVtcyBzbyB0aGF0IHBsdWdpbnMgY2FuIHVzZSB0aGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUGx1Z2lucy5HbG9iYWxcclxuICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBHbG9iYWw6IFtcclxuXHJcbiAgICAgICAgJ2dhbWUnLFxyXG4gICAgICAgICdhbmltcycsXHJcbiAgICAgICAgJ2NhY2hlJyxcclxuICAgICAgICAncGx1Z2lucycsXHJcbiAgICAgICAgJ3JlZ2lzdHJ5JyxcclxuICAgICAgICAnc2NhbGUnLFxyXG4gICAgICAgICdzb3VuZCcsXHJcbiAgICAgICAgJ3RleHR1cmVzJ1xyXG5cclxuICAgIF0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGVzZSBhcmUgdGhlIGNvcmUgcGx1Z2lucyB0aGF0IGFyZSBpbnN0YWxsZWQgaW50byBldmVyeSBTY2VuZS5TeXN0ZW1zIGluc3RhbmNlLCBubyBtYXR0ZXIgd2hhdC5cclxuICAgICAqIFRoZXkgYXJlIG9wdGlvbmFsbHkgZXhwb3NlZCBpbiB0aGUgU2NlbmUgYXMgd2VsbCAoc2VlIHRoZSBJbmplY3Rpb25NYXAgZm9yIGRldGFpbHMpXHJcbiAgICAgKiBcclxuICAgICAqIFRoZXkgYXJlIGNyZWF0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoaXMgYXJyYXkgYW5kIEV2ZW50RW1pdHRlciBpcyBhbHdheXMgZmlyc3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLkNvcmVTY2VuZVxyXG4gICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIENvcmVTY2VuZTogW1xyXG5cclxuICAgICAgICAnRXZlbnRFbWl0dGVyJyxcclxuXHJcbiAgICAgICAgJ0NhbWVyYU1hbmFnZXInLFxyXG4gICAgICAgICdHYW1lT2JqZWN0Q3JlYXRvcicsXHJcbiAgICAgICAgJ0dhbWVPYmplY3RGYWN0b3J5JyxcclxuICAgICAgICAnU2NlbmVQbHVnaW4nLFxyXG4gICAgICAgICdEaXNwbGF5TGlzdCcsXHJcbiAgICAgICAgJ1VwZGF0ZUxpc3QnXHJcblxyXG4gICAgXSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZXNlIHBsdWdpbnMgYXJlIGNyZWF0ZWQgaW4gU2NlbmUuU3lzdGVtcyBpbiBhZGRpdGlvbiB0byB0aGUgQ29yZVNjZW5lUGx1Z2lucy5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBlbGVjdCBub3QgdG8gaGF2ZSB0aGVzZSBwbHVnaW5zIGJ5IGVpdGhlciBjcmVhdGluZyBhIERlZmF1bHRQbHVnaW5zIG9iamVjdCBhcyBwYXJ0XHJcbiAgICAgKiBvZiB0aGUgR2FtZSBDb25maWcsIGJ5IGNyZWF0aW5nIGEgUGx1Z2lucyBvYmplY3QgYXMgcGFydCBvZiBhIFNjZW5lIENvbmZpZywgb3IgYnkgbW9kaWZ5aW5nIHRoaXMgYXJyYXlcclxuICAgICAqIGFuZCBidWlsZGluZyB5b3VyIG93biBidW5kbGUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZXkgYXJlIG9wdGlvbmFsbHkgZXhwb3NlZCBpbiB0aGUgU2NlbmUgYXMgd2VsbCAoc2VlIHRoZSBJbmplY3Rpb25NYXAgZm9yIGRldGFpbHMpXHJcbiAgICAgKiBcclxuICAgICAqIFRoZXkgYXJlIGFsd2F5cyBjcmVhdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgYXJyYXkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLkRlZmF1bHRTY2VuZVxyXG4gICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERlZmF1bHRTY2VuZTogW1xyXG5cclxuICAgICAgICAnQ2xvY2snLFxyXG4gICAgICAgICdEYXRhTWFuYWdlclBsdWdpbicsXHJcbiAgICAgICAgJ0lucHV0UGx1Z2luJyxcclxuICAgICAgICAnTG9hZGVyJyxcclxuICAgICAgICAnVHdlZW5NYW5hZ2VyJyxcclxuICAgICAgICAnTGlnaHRzUGx1Z2luJ1xyXG5cclxuICAgIF1cclxuXHJcbn07XHJcblxyXG5pZiAodHlwZW9mIFBMVUdJTl9DQU1FUkEzRClcclxue1xyXG4gICAgRGVmYXVsdFBsdWdpbnMuRGVmYXVsdFNjZW5lLnB1c2goJ0NhbWVyYU1hbmFnZXIzRCcpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIFBMVUdJTl9GQklOU1RBTlQpXHJcbntcclxuICAgIERlZmF1bHRQbHVnaW5zLkdsb2JhbC5wdXNoKCdmYWNlYm9vaycpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IERlZmF1bHRQbHVnaW5zO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBDb250YWlucyB0aGUgcGx1Z2lucyB0aGF0IFBoYXNlciB1c2VzIGdsb2JhbGx5IGFuZCBsb2NhbGx5LlxyXG4vLyAgVGhlc2UgYXJlIHRoZSBzb3VyY2Ugb2JqZWN0cywgbm90IGluc3RhbnRpYXRlZC5cclxudmFyIGNvcmVQbHVnaW5zID0ge307XHJcblxyXG4vLyAgQ29udGFpbnMgdGhlIHBsdWdpbnMgdGhhdCB0aGUgZGV2IGhhcyBsb2FkZWQgaW50byB0aGVpciBnYW1lXHJcbi8vICBUaGVzZSBhcmUgdGhlIHNvdXJjZSBvYmplY3RzLCBub3QgaW5zdGFudGlhdGVkLlxyXG52YXIgY3VzdG9tUGx1Z2lucyA9IHt9O1xyXG5cclxudmFyIFBsdWdpbkNhY2hlID0ge307XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUGx1Z2lucy5QbHVnaW5DYWNoZVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTdGF0aWMgbWV0aG9kIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgQ29yZSBpbnRlcm5hbCBQbHVnaW5zLlxyXG4gKiBLZXkgaXMgYSByZWZlcmVuY2UgdXNlZCB0byBnZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW5zIG9iamVjdCAoaS5lLiBJbnB1dFBsdWdpbilcclxuICogUGx1Z2luIGlzIHRoZSBvYmplY3QgdG8gaW5zdGFudGlhdGUgdG8gY3JlYXRlIHRoZSBwbHVnaW5cclxuICogTWFwcGluZyBpcyB3aGF0IHRoZSBwbHVnaW4gaXMgaW5qZWN0ZWQgaW50byB0aGUgU2NlbmUuU3lzdGVtcyBhcyAoaS5lLiBpbnB1dClcclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5DYWNoZS5yZWdpc3RlclxyXG4gKiBAc2luY2UgMy44LjBcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBIHJlZmVyZW5jZSB1c2VkIHRvIGdldCB0aGlzIHBsdWdpbiBmcm9tIHRoZSBwbHVnaW4gY2FjaGUuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gYmUgc3RvcmVkLiBTaG91bGQgYmUgdGhlIGNvcmUgb2JqZWN0LCBub3QgaW5zdGFudGlhdGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFwcGluZyAtIElmIHRoaXMgcGx1Z2luIGlzIHRvIGJlIGluamVjdGVkIGludG8gdGhlIFNjZW5lIFN5c3RlbXMsIHRoaXMgaXMgdGhlIHByb3BlcnR5IGtleSBtYXAgdXNlZC5cclxuICogQHBhcmFtIHtib29sZWFufSBbY3VzdG9tPWZhbHNlXSAtIENvcmUgU2NlbmUgcGx1Z2luIG9yIGEgQ3VzdG9tIFNjZW5lIHBsdWdpbj9cclxuICovXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyID0gZnVuY3Rpb24gKGtleSwgcGx1Z2luLCBtYXBwaW5nLCBjdXN0b20pXHJcbntcclxuICAgIGlmIChjdXN0b20gPT09IHVuZGVmaW5lZCkgeyBjdXN0b20gPSBmYWxzZTsgfVxyXG5cclxuICAgIGNvcmVQbHVnaW5zW2tleV0gPSB7IHBsdWdpbjogcGx1Z2luLCBtYXBwaW5nOiBtYXBwaW5nLCBjdXN0b206IGN1c3RvbSB9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFN0b3JlcyBhIGN1c3RvbSBwbHVnaW4gaW4gdGhlIGdsb2JhbCBwbHVnaW4gY2FjaGUuXHJcbiAqIFRoZSBrZXkgbXVzdCBiZSB1bmlxdWUsIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGNhY2hlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbkNhY2hlLnJlZ2lzdGVyQ3VzdG9tXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEEgcmVmZXJlbmNlIHVzZWQgdG8gZ2V0IHRoaXMgcGx1Z2luIGZyb20gdGhlIHBsdWdpbiBjYWNoZS5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBiZSBzdG9yZWQuIFNob3VsZCBiZSB0aGUgY29yZSBvYmplY3QsIG5vdCBpbnN0YW50aWF0ZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXBwaW5nIC0gSWYgdGhpcyBwbHVnaW4gaXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgU2NlbmUgU3lzdGVtcywgdGhpcyBpcyB0aGUgcHJvcGVydHkga2V5IG1hcCB1c2VkLlxyXG4gKiBAcGFyYW0gez9hbnl9IGRhdGEgLSBBIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgcGx1Z2luJ3MgYGluaXRgIG1ldGhvZC5cclxuICovXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyQ3VzdG9tID0gZnVuY3Rpb24gKGtleSwgcGx1Z2luLCBtYXBwaW5nLCBkYXRhKVxyXG57XHJcbiAgICBjdXN0b21QbHVnaW5zW2tleV0gPSB7IHBsdWdpbjogcGx1Z2luLCBtYXBwaW5nOiBtYXBwaW5nLCBkYXRhOiBkYXRhIH07XHJcbn07XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBrZXkgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGluIHRoZSBjb3JlIHBsdWdpbiBjYWNoZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5DYWNoZS5oYXNDb3JlXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gY2hlY2sgZm9yLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZSBpbiB0aGUgY29yZSBjYWNoZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG5QbHVnaW5DYWNoZS5oYXNDb3JlID0gZnVuY3Rpb24gKGtleSlcclxue1xyXG4gICAgcmV0dXJuIGNvcmVQbHVnaW5zLmhhc093blByb3BlcnR5KGtleSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBrZXkgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGluIHRoZSBjdXN0b20gcGx1Z2luIGNhY2hlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbkNhY2hlLmhhc0N1c3RvbVxyXG4gKiBAc2luY2UgMy44LjBcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrIGZvci5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB1c2UgaW4gdGhlIGN1c3RvbSBjYWNoZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG5QbHVnaW5DYWNoZS5oYXNDdXN0b20gPSBmdW5jdGlvbiAoa2V5KVxyXG57XHJcbiAgICByZXR1cm4gY3VzdG9tUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrZXkpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGNvcmUgcGx1Z2luIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBiYXNlZCBvbiB0aGUgZ2l2ZW4ga2V5LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbkNhY2hlLmdldENvcmVcclxuICogQHNpbmNlIDMuOC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY29yZSBwbHVnaW4gdG8gZ2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuUGx1Z2lucy5Db3JlUGx1Z2luQ29udGFpbmVyfSBUaGUgY29yZSBwbHVnaW4gb2JqZWN0LlxyXG4gKi9cclxuUGx1Z2luQ2FjaGUuZ2V0Q29yZSA9IGZ1bmN0aW9uIChrZXkpXHJcbntcclxuICAgIHJldHVybiBjb3JlUGx1Z2luc1trZXldO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGN1c3RvbSBwbHVnaW4gb2JqZWN0IGZyb20gdGhlIGNhY2hlIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luQ2FjaGUuZ2V0Q3VzdG9tXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1c3RvbSBwbHVnaW4gdG8gZ2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuUGx1Z2lucy5DdXN0b21QbHVnaW5Db250YWluZXJ9IFRoZSBjdXN0b20gcGx1Z2luIG9iamVjdC5cclxuICovXHJcblBsdWdpbkNhY2hlLmdldEN1c3RvbSA9IGZ1bmN0aW9uIChrZXkpXHJcbntcclxuICAgIHJldHVybiBjdXN0b21QbHVnaW5zW2tleV07XHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBvYmplY3QgZnJvbSB0aGUgY3VzdG9tIGNhY2hlIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbkNhY2hlLmdldEN1c3RvbUNsYXNzXHJcbiAqIEBzaW5jZSAzLjguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1c3RvbSBwbHVnaW4gdG8gZ2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGN1c3RvbSBwbHVnaW4gb2JqZWN0LlxyXG4gKi9cclxuUGx1Z2luQ2FjaGUuZ2V0Q3VzdG9tQ2xhc3MgPSBmdW5jdGlvbiAoa2V5KVxyXG57XHJcbiAgICByZXR1cm4gKGN1c3RvbVBsdWdpbnMuaGFzT3duUHJvcGVydHkoa2V5KSkgPyBjdXN0b21QbHVnaW5zW2tleV0ucGx1Z2luIDogbnVsbDtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIGEgY29yZSBwbHVnaW4gYmFzZWQgb24gdGhlIGdpdmVuIGtleS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5DYWNoZS5yZW1vdmVcclxuICogQHNpbmNlIDMuOC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY29yZSBwbHVnaW4gdG8gcmVtb3ZlLlxyXG4gKi9cclxuUGx1Z2luQ2FjaGUucmVtb3ZlID0gZnVuY3Rpb24gKGtleSlcclxue1xyXG4gICAgaWYgKGNvcmVQbHVnaW5zLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgZGVsZXRlIGNvcmVQbHVnaW5zW2tleV07XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhIGN1c3RvbSBwbHVnaW4gYmFzZWQgb24gdGhlIGdpdmVuIGtleS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5DYWNoZS5yZW1vdmVDdXN0b21cclxuICogQHNpbmNlIDMuOC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY3VzdG9tIHBsdWdpbiB0byByZW1vdmUuXHJcbiAqL1xyXG5QbHVnaW5DYWNoZS5yZW1vdmVDdXN0b20gPSBmdW5jdGlvbiAoa2V5KVxyXG57XHJcbiAgICBpZiAoY3VzdG9tUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIGRlbGV0ZSBjdXN0b21QbHVnaW5zW2tleV07XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhbGwgQ29yZSBQbHVnaW5zLlxyXG4gKiBcclxuICogVGhpcyBpbmNsdWRlcyBhbGwgb2YgdGhlIGludGVybmFsIHN5c3RlbSBwbHVnaW5zIHRoYXQgUGhhc2VyIG5lZWRzLCBsaWtlIHRoZSBJbnB1dCBQbHVnaW4gYW5kIExvYWRlciBQbHVnaW4uXHJcbiAqIFNvIGJlIHN1cmUgeW91IG9ubHkgY2FsbCB0aGlzIGlmIHlvdSBkbyBub3Qgd2lzaCB0byBydW4gUGhhc2VyIGFnYWluLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbkNhY2hlLmRlc3Ryb3lDb3JlUGx1Z2luc1xyXG4gKiBAc2luY2UgMy4xMi4wXHJcbiAqL1xyXG5QbHVnaW5DYWNoZS5kZXN0cm95Q29yZVBsdWdpbnMgPSBmdW5jdGlvbiAoKVxyXG57XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gY29yZVBsdWdpbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvcmVQbHVnaW5zLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxldGUgY29yZVBsdWdpbnNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhbGwgQ3VzdG9tIFBsdWdpbnMuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luQ2FjaGUuZGVzdHJveUN1c3RvbVBsdWdpbnNcclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKi9cclxuUGx1Z2luQ2FjaGUuZGVzdHJveUN1c3RvbVBsdWdpbnMgPSBmdW5jdGlvbiAoKVxyXG57XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gY3VzdG9tUGx1Z2lucylcclxuICAgIHtcclxuICAgICAgICBpZiAoY3VzdG9tUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsZXRlIGN1c3RvbVBsdWdpbnNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBsdWdpbkNhY2hlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHYW1lRXZlbnRzID0gcmVxdWlyZSgnLi4vY29yZS9ldmVudHMnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIEZpbGVUeXBlc01hbmFnZXIgPSByZXF1aXJlKCcuLi9sb2FkZXIvRmlsZVR5cGVzTWFuYWdlcicpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuL1BsdWdpbkNhY2hlJyk7XHJcbnZhciBSZW1vdmUgPSByZXF1aXJlKCcuLi91dGlscy9hcnJheS9SZW1vdmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRoZSBQbHVnaW5NYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIGZvciBpbnN0YWxsaW5nIGFuZCBhZGRpbmcgcGx1Z2lucyB0byBQaGFzZXIuXHJcbiAqXHJcbiAqIEl0IGlzIGEgZ2xvYmFsIHN5c3RlbSBhbmQgdGhlcmVmb3JlIGJlbG9uZ3MgdG8gdGhlIEdhbWUgaW5zdGFuY2UsIG5vdCBhIHNwZWNpZmljIFNjZW5lLlxyXG4gKlxyXG4gKiBJdCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQbHVnaW5DYWNoZS4gQ29yZSBpbnRlcm5hbCBwbHVnaW5zIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXIgdGhlbXNlbHZlcyBcclxuICogd2l0aCB0aGUgQ2FjaGUsIGJ1dCBpdCdzIHRoZSBQbHVnaW4gTWFuYWdlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBpbmplY3RpbmcgdGhlbSBpbnRvIHRoZSBTY2VuZXMuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcGx1Z2luOlxyXG4gKlxyXG4gKiAxLiBBIEdsb2JhbCBQbHVnaW5cclxuICogMi4gQSBTY2VuZSBQbHVnaW5cclxuICpcclxuICogQSBHbG9iYWwgUGx1Z2luIGlzIGEgcGx1Z2luIHRoYXQgbGl2ZXMgd2l0aGluIHRoZSBQbHVnaW4gTWFuYWdlciByYXRoZXIgdGhhbiBhIFNjZW5lLiBZb3UgY2FuIGdldFxyXG4gKiBhY2Nlc3MgdG8gaXQgYnkgY2FsbGluZyBgUGx1Z2luTWFuYWdlci5nZXRgIGFuZCBwcm92aWRpbmcgYSBrZXkuIEFueSBTY2VuZSB0aGF0IHJlcXVlc3RzIGEgcGx1Z2luIGluXHJcbiAqIHRoaXMgd2F5IHdpbGwgYWxsIGdldCBhY2Nlc3MgdG8gdGhlIHNhbWUgcGx1Z2luIGluc3RhbmNlLCBhbGxvd2luZyB5b3UgdG8gdXNlIGEgc2luZ2xlIHBsdWdpbiBhY3Jvc3NcclxuICogbXVsdGlwbGUgU2NlbmVzLlxyXG4gKlxyXG4gKiBBIFNjZW5lIFBsdWdpbiBpcyBhIHBsdWdpbiBkZWRpY2F0ZWQgdG8gcnVubmluZyB3aXRoaW4gYSBTY2VuZS4gVGhlc2UgYXJlIGRpZmZlcmVudCB0byBHbG9iYWwgUGx1Z2luc1xyXG4gKiBpbiB0aGF0IHRoZWlyIGluc3RhbmNlcyBkbyBub3QgbGl2ZSB3aXRoaW4gdGhlIFBsdWdpbiBNYW5hZ2VyLCBidXQgd2l0aGluIHRoZSBTY2VuZSBTeXN0ZW1zIGNsYXNzIGluc3RlYWQuXHJcbiAqIEFuZCB0aGF0IGV2ZXJ5IFNjZW5lIGNyZWF0ZWQgaXMgZ2l2ZW4gaXRzIG93biB1bmlxdWUgaW5zdGFuY2Ugb2YgYSBTY2VuZSBQbHVnaW4uIEV4YW1wbGVzIG9mIGNvcmUgU2NlbmVcclxuICogUGx1Z2lucyBpbmNsdWRlIHRoZSBJbnB1dCBQbHVnaW4sIHRoZSBUd2VlbiBQbHVnaW4gYW5kIHRoZSBwaHlzaWNzIFBsdWdpbnMuXHJcbiAqXHJcbiAqIFlvdSBjYW4gYWRkIGEgcGx1Z2luIHRvIFBoYXNlciBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5czpcclxuICpcclxuICogMS4gUHJlbG9hZCBpdFxyXG4gKiAyLiBJbmNsdWRlIGl0IGluIHlvdXIgc291cmNlIGNvZGUgYW5kIGluc3RhbGwgaXQgdmlhIHRoZSBHYW1lIENvbmZpZ1xyXG4gKiAzLiBJbmNsdWRlIGl0IGluIHlvdXIgc291cmNlIGNvZGUgYW5kIGluc3RhbGwgaXQgd2l0aGluIGEgU2NlbmVcclxuICpcclxuICogRm9yIGV4YW1wbGVzIG9mIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIHBsZWFzZSBzZWUgdGhlIFBoYXNlciAzIEV4YW1wbGVzIFJlcG8gYHBsdWdpbnNgIGZvbGRlci5cclxuICpcclxuICogRm9yIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIHlvdXIgb3duIHBsdWdpbiBwbGVhc2Ugc2VlIHRoZSBQaGFzZXIgMyBQbHVnaW4gVGVtcGxhdGUuXHJcbiAqXHJcbiAqIEBjbGFzcyBQbHVnaW5NYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGx1Z2luc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWV9IGdhbWUgLSBUaGUgZ2FtZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyBQbHVnaW4gTWFuYWdlci5cclxuICovXHJcbnZhciBQbHVnaW5NYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBQbHVnaW5NYW5hZ2VyIChnYW1lKVxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ2FtZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyBQbHVnaW4gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBnYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ2xvYmFsIHBsdWdpbnMgY3VycmVudGx5IHJ1bm5pbmcgYW5kIG1hbmFnZWQgYnkgdGhpcyBQbHVnaW4gTWFuYWdlci5cclxuICAgICAgICAgKiBBIHBsdWdpbiBtdXN0IGhhdmUgYmVlbiBzdGFydGVkIGF0IGxlYXN0IG9uY2UgaW4gb3JkZXIgdG8gYXBwZWFyIGluIHRoaXMgbGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjcGx1Z2luc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUGx1Z2lucy5HbG9iYWxQbHVnaW5bXX1cclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBsaXN0IG9mIHBsdWdpbiBrZXlzIHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZCBpbnRvIFNjZW5lcyBhcyB3ZWxsIGFzIHRoZSBDb3JlIFBsdWdpbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI3NjZW5lUGx1Z2luc1xyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmdbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lUGx1Z2lucyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbCB3aGVuIHRoZSBnYW1lIGhhcyBib290ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI19wZW5kaW5nR2xvYmFsXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0dsb2JhbCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBsaXN0IG9mIHNjZW5lIHBsdWdpbnMgdG8gaW5zdGFsbCB3aGVuIHRoZSBnYW1lIGhhcyBib290ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI19wZW5kaW5nU2NlbmVcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nU2NlbmUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGdhbWUuaXNCb290ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJvb3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkJPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJ1biBvbmNlIHRoZSBnYW1lIGhhcyBib290ZWQgYW5kIGluc3RhbGxzIGFsbCBvZiB0aGUgcGx1Z2lucyBjb25maWd1cmVkIGluIHRoZSBHYW1lIENvbmZpZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjYm9vdFxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGVudHJ5O1xyXG4gICAgICAgIHZhciBrZXk7XHJcbiAgICAgICAgdmFyIHBsdWdpbjtcclxuICAgICAgICB2YXIgc3RhcnQ7XHJcbiAgICAgICAgdmFyIG1hcHBpbmc7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZ2FtZS5jb25maWc7XHJcblxyXG4gICAgICAgIC8vICBBbnkgcGx1Z2lucyB0byBpbnN0YWxsP1xyXG4gICAgICAgIHZhciBsaXN0ID0gY29uZmlnLmluc3RhbGxHbG9iYWxQbHVnaW5zO1xyXG5cclxuICAgICAgICAvLyAgQW55IHBsdWdpbnMgYWRkZWQgb3V0c2lkZSBvZiB0aGUgZ2FtZSBjb25maWcsIGJ1dCBiZWZvcmUgdGhlIGdhbWUgYm9vdGVkP1xyXG4gICAgICAgIGxpc3QgPSBsaXN0LmNvbmNhdCh0aGlzLl9wZW5kaW5nR2xvYmFsKTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbnRyeSA9IGxpc3RbaV07XHJcblxyXG4gICAgICAgICAgICAvLyB7IGtleTogJ1Rlc3RQbHVnaW4nLCBwbHVnaW46IFRlc3RQbHVnaW4sIHN0YXJ0OiB0cnVlLCBtYXBwaW5nOiAndGVzdCcsIGRhdGE6IHsgbXNnOiAnVGhlIHBsdWdpbiBpcyBhbGl2ZScgfSB9XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoZW50cnksICdrZXknLCBudWxsKTtcclxuICAgICAgICAgICAgcGx1Z2luID0gR2V0RmFzdFZhbHVlKGVudHJ5LCAncGx1Z2luJywgbnVsbCk7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gR2V0RmFzdFZhbHVlKGVudHJ5LCAnc3RhcnQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIG1hcHBpbmcgPSBHZXRGYXN0VmFsdWUoZW50cnksICdtYXBwaW5nJywgbnVsbCk7XHJcbiAgICAgICAgICAgIGRhdGEgPSBHZXRGYXN0VmFsdWUoZW50cnksICdkYXRhJywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFsbChrZXksIHBsdWdpbiwgc3RhcnQsIG1hcHBpbmcsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzc2luZyBgcGx1Z2luYCBmb3Iga2V5OiAnICsga2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQW55IHNjZW5lIHBsdWdpbnMgdG8gaW5zdGFsbD9cclxuICAgICAgICBsaXN0ID0gY29uZmlnLmluc3RhbGxTY2VuZVBsdWdpbnM7XHJcblxyXG4gICAgICAgIC8vICBBbnkgcGx1Z2lucyBhZGRlZCBvdXRzaWRlIG9mIHRoZSBnYW1lIGNvbmZpZywgYnV0IGJlZm9yZSB0aGUgZ2FtZSBib290ZWQ/XHJcbiAgICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KHRoaXMuX3BlbmRpbmdTY2VuZSk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZW50cnkgPSBsaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgLy8geyBrZXk6ICdtb3ZlU3ByaXRlUGx1Z2luJywgcGx1Z2luOiBNb3ZlU3ByaXRlUGx1Z2luLCAsIG1hcHBpbmc6ICdtb3ZlJyB9XHJcblxyXG4gICAgICAgICAgICBrZXkgPSBHZXRGYXN0VmFsdWUoZW50cnksICdrZXknLCBudWxsKTtcclxuICAgICAgICAgICAgcGx1Z2luID0gR2V0RmFzdFZhbHVlKGVudHJ5LCAncGx1Z2luJywgbnVsbCk7XHJcbiAgICAgICAgICAgIG1hcHBpbmcgPSBHZXRGYXN0VmFsdWUoZW50cnksICdtYXBwaW5nJywgbnVsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoa2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFsbFNjZW5lUGx1Z2luKGtleSwgcGx1Z2luLCBtYXBwaW5nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01pc3NpbmcgYHBsdWdpbmAgZm9yIGtleTogJyArIGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdHbG9iYWwgPSBbXTtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nU2NlbmUgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lLmV2ZW50cy5vbmNlKEdhbWVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYnkgdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3MuIFRlbGxzIHRoZSBwbHVnaW4gbWFuYWdlciB0byBpbnN0YWxsIGFsbCBTY2VuZSBwbHVnaW5zIGludG8gaXQuXHJcbiAgICAgKlxyXG4gICAgICogRmlyc3QgaXQgd2lsbCBpbnN0YWxsIGdsb2JhbCByZWZlcmVuY2VzLCBpLmUuIHJlZmVyZW5jZXMgZnJvbSB0aGUgR2FtZSBzeXN0ZW1zIGludG8gdGhlIFNjZW5lIFN5c3RlbXMgKGFuZCBTY2VuZSBpZiBtYXBwZWQuKVxyXG4gICAgICogVGhlbiBpdCB3aWxsIGluc3RhbGwgQ29yZSBTY2VuZSBQbHVnaW5zIGZvbGxvd2VkIGJ5IFNjZW5lIFBsdWdpbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBQbHVnaW5NYW5hZ2VyLlxyXG4gICAgICogRmluYWxseSBpdCB3aWxsIGluc3RhbGwgYW55IHJlZmVyZW5jZXMgdG8gR2xvYmFsIFBsdWdpbnMgdGhhdCBoYXZlIGEgU2NlbmUgbWFwcGluZyBwcm9wZXJ0eSBpbnRvIHRoZSBTY2VuZSBpdHNlbGYuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI2FkZFRvU2NlbmVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBUaGUgU2NlbmUgU3lzdGVtcyBjbGFzcyB0byBpbnN0YWxsIGFsbCB0aGUgcGx1Z2lucyBpbiB0by5cclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IGdsb2JhbFBsdWdpbnMgLSBBbiBhcnJheSBvZiBnbG9iYWwgcGx1Z2lucyB0byBpbnN0YWxsLlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gc2NlbmVQbHVnaW5zIC0gQW4gYXJyYXkgb2Ygc2NlbmUgcGx1Z2lucyB0byBpbnN0YWxsLlxyXG4gICAgICovXHJcbiAgICBhZGRUb1NjZW5lOiBmdW5jdGlvbiAoc3lzLCBnbG9iYWxQbHVnaW5zLCBzY2VuZVBsdWdpbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIHBsdWdpbktleTtcclxuICAgICAgICB2YXIgcGx1Z2luTGlzdDtcclxuICAgICAgICB2YXIgZ2FtZSA9IHRoaXMuZ2FtZTtcclxuICAgICAgICB2YXIgc2NlbmUgPSBzeXMuc2NlbmU7XHJcbiAgICAgICAgdmFyIG1hcCA9IHN5cy5zZXR0aW5ncy5tYXA7XHJcbiAgICAgICAgdmFyIGlzQm9vdGVkID0gc3lzLnNldHRpbmdzLmlzQm9vdGVkO1xyXG5cclxuICAgICAgICAvLyAgUmVmZXJlbmNlIHRoZSBHbG9iYWxQbHVnaW5zIGZyb20gR2FtZSBpbnRvIFNjZW5lLlN5c3RlbXNcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsUGx1Z2lucy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBsdWdpbktleSA9IGdsb2JhbFBsdWdpbnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZ2FtZVtwbHVnaW5LZXldKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzeXNbcGx1Z2luS2V5XSA9IGdhbWVbcGx1Z2luS2V5XTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgU2NlbmUgbGV2ZWwgaW5qZWN0aW9uXHJcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KHBsdWdpbktleSkpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NlbmVbbWFwW3BsdWdpbktleV1dID0gc3lzW3BsdWdpbktleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGx1Z2luS2V5ID09PSAnZ2FtZScgJiYgbWFwLmhhc093blByb3BlcnR5KHBsdWdpbktleSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lW21hcFtwbHVnaW5LZXldXSA9IGdhbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc2NlbmVQbHVnaW5zLmxlbmd0aDsgcysrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGx1Z2luTGlzdCA9IHNjZW5lUGx1Z2luc1tzXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbHVnaW5MaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW5LZXkgPSBwbHVnaW5MaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghUGx1Z2luQ2FjaGUuaGFzQ29yZShwbHVnaW5LZXkpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBQbHVnaW5DYWNoZS5nZXRDb3JlKHBsdWdpbktleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHBsdWdpbiA9IG5ldyBzb3VyY2UucGx1Z2luKHNjZW5lLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgc3lzW3NvdXJjZS5tYXBwaW5nXSA9IHBsdWdpbjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgU2NlbmUgbGV2ZWwgaW5qZWN0aW9uXHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmN1c3RvbSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzY2VuZVtzb3VyY2UubWFwcGluZ10gPSBwbHVnaW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXAuaGFzT3duUHJvcGVydHkoc291cmNlLm1hcHBpbmcpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lW21hcFtzb3VyY2UubWFwcGluZ11dID0gcGx1Z2luO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vICBTY2VuZSBpcyBhbHJlYWR5IGJvb3RlZCwgdXN1YWxseSBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBhdCBydW4tdGltZSwgc28gYm9vdCB0aGUgcGx1Z2luXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNCb290ZWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmJvb3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEFuZCBmaW5hbGx5LCBpbmplY3QgYW55ICdnbG9iYWwgc2NlbmUgcGx1Z2lucydcclxuICAgICAgICBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5zO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGx1Z2luTGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHBsdWdpbkxpc3RbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkubWFwcGluZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NlbmVbZW50cnkubWFwcGluZ10gPSBlbnRyeS5wbHVnaW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGJ5IHRoZSBTY2VuZSBTeXN0ZW1zIGNsYXNzLiBSZXR1cm5zIGEgbGlzdCBvZiBwbHVnaW5zIHRvIGJlIGluc3RhbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjZ2V0RGVmYXVsdFNjZW5lUGx1Z2luc1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEEgbGlzdCBrZXlzIG9mIGFsbCB0aGUgU2NlbmUgUGx1Z2lucyB0byBpbnN0YWxsLlxyXG4gICAgICovXHJcbiAgICBnZXREZWZhdWx0U2NlbmVQbHVnaW5zOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5nYW1lLmNvbmZpZy5kZWZhdWx0UGx1Z2lucztcclxuXHJcbiAgICAgICAgLy8gIE1lcmdlIGluIGN1c3RvbSBTY2VuZSBwbHVnaW5zXHJcbiAgICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KHRoaXMuc2NlbmVQbHVnaW5zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zdGFsbHMgYSBuZXcgU2NlbmUgUGx1Z2luIGludG8gdGhlIFBsdWdpbiBNYW5hZ2VyIGFuZCBvcHRpb25hbGx5IGFkZHMgaXRcclxuICAgICAqIHRvIHRoZSBnaXZlbiBTY2VuZSBhcyB3ZWxsLiBBIFNjZW5lIFBsdWdpbiBhZGRlZCB0byB0aGUgbWFuYWdlciBpbiB0aGlzIHdheVxyXG4gICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBpbnRvIGFsbCBuZXcgU2NlbmVzIHVzaW5nIHRoZSBrZXkgYW5kIG1hcHBpbmcgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGBrZXlgIHByb3BlcnR5IGlzIHdoYXQgdGhlIHBsdWdpbiBpcyBpbmplY3RlZCBpbnRvIFNjZW5lLlN5c3RlbXMgYXMuXHJcbiAgICAgKiBUaGUgYG1hcHBpbmdgIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgaWYgc3BlY2lmaWVkIGlzIHdoYXQgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgaW50b1xyXG4gICAgICogdGhlIFNjZW5lIGFzLiBGb3IgZXhhbXBsZTpcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLnBsdWdpbnMuaW5zdGFsbFNjZW5lUGx1Z2luKCdwb3dlcnVwc1BsdWdpbicsIHBsdWdpbkNvZGUsICdwb3dlcnVwcycpO1xyXG4gICAgICogXHJcbiAgICAgKiAvLyBhbmQgZnJvbSB3aXRoaW4gdGhlIHNjZW5lOlxyXG4gICAgICogdGhpcy5zeXMucG93ZXJ1cHNQbHVnaW47IC8vIGtleSB2YWx1ZVxyXG4gICAgICogdGhpcy5wb3dlcnVwczsgLy8gbWFwcGluZyB2YWx1ZVxyXG4gICAgICogYGBgXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgUGhhc2VyIGlmIHlvdSBpbnN0YWxsIHlvdXIgcGx1Z2lucyB1c2luZyBlaXRoZXIgdGhlXHJcbiAgICAgKiBHYW1lIENvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBieSBwcmVsb2FkaW5nIHRoZW0gdmlhIHRoZSBMb2FkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI2luc3RhbGxTY2VuZVBsdWdpblxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWRkIHRoaXMgcGx1Z2luIHRvIFNjZW5lLlN5c3RlbXMuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwbHVnaW4gLSBUaGUgcGx1Z2luIGNvZGUuIFRoaXMgc2hvdWxkIGJlIHRoZSBub24taW5zdGFudGlhdGVkIHZlcnNpb24uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW21hcHBpbmddIC0gSWYgdGhpcyBwbHVnaW4gaXMgaW5qZWN0ZWQgaW50byB0aGUgUGhhc2VyLlNjZW5lIGNsYXNzLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSBrZXkgdG8gdXNlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IFthZGRUb1NjZW5lXSAtIE9wdGlvbmFsbHkgYXV0b21hdGljYWxseSBhZGQgdGhpcyBwbHVnaW4gdG8gdGhlIGdpdmVuIFNjZW5lLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbUxvYWRlcj1mYWxzZV0gLSBJcyB0aGlzIGJlaW5nIGNhbGxlZCBieSB0aGUgTG9hZGVyP1xyXG4gICAgICovXHJcbiAgICBpbnN0YWxsU2NlbmVQbHVnaW46IGZ1bmN0aW9uIChrZXksIHBsdWdpbiwgbWFwcGluZywgYWRkVG9TY2VuZSwgZnJvbUxvYWRlcilcclxuICAgIHtcclxuICAgICAgICBpZiAoZnJvbUxvYWRlciA9PT0gdW5kZWZpbmVkKSB7IGZyb21Mb2FkZXIgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbiAhPT0gJ2Z1bmN0aW9uJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBTY2VuZSBQbHVnaW46ICcgKyBrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIVBsdWdpbkNhY2hlLmhhc0NvcmUoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBQbHVnaW4gaXMgZnJlc2hseSBsb2FkZWRcclxuICAgICAgICAgICAgUGx1Z2luQ2FjaGUucmVnaXN0ZXIoa2V5LCBwbHVnaW4sIG1hcHBpbmcsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zY2VuZVBsdWdpbnMucHVzaChrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghZnJvbUxvYWRlciAmJiBQbHVnaW5DYWNoZS5oYXNDb3JlKGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUGx1Z2luIHdhc24ndCBmcm9tIHRoZSBsb2FkZXIgYnV0IGFscmVhZHkgZXhpc3RzXHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignU2NlbmUgUGx1Z2luIGtleSBpbiB1c2U6ICcgKyBrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWRkVG9TY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBwbHVnaW4oYWRkVG9TY2VuZSwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICBhZGRUb1NjZW5lLnN5c1trZXldID0gaW5zdGFuY2U7XHJcblxyXG4gICAgICAgICAgICBpZiAobWFwcGluZyAmJiBtYXBwaW5nICE9PSAnJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYWRkVG9TY2VuZVttYXBwaW5nXSA9IGluc3RhbmNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnN0YW5jZS5ib290KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbGxzIGEgbmV3IEdsb2JhbCBQbHVnaW4gaW50byB0aGUgUGx1Z2luIE1hbmFnZXIgYW5kIG9wdGlvbmFsbHkgc3RhcnRzIGl0IHJ1bm5pbmcuXHJcbiAgICAgKiBBIGdsb2JhbCBwbHVnaW4gYmVsb25ncyB0byB0aGUgUGx1Z2luIE1hbmFnZXIsIHJhdGhlciB0aGFuIGEgc3BlY2lmaWMgU2NlbmUsIGFuZCBjYW4gYmUgYWNjZXNzZWRcclxuICAgICAqIGFuZCB1c2VkIGJ5IGFsbCBTY2VuZXMgaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBga2V5YCBwcm9wZXJ0eSBpcyB3aGF0IHlvdSB1c2UgdG8gYWNjZXNzIHRoaXMgcGx1Z2luIGZyb20gdGhlIFBsdWdpbiBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMucGx1Z2lucy5pbnN0YWxsKCdwb3dlcnVwc1BsdWdpbicsIHBsdWdpbkNvZGUpO1xyXG4gICAgICogXHJcbiAgICAgKiAvLyBhbmQgZnJvbSB3aXRoaW4gdGhlIHNjZW5lOlxyXG4gICAgICogdGhpcy5wbHVnaW5zLmdldCgncG93ZXJ1cHNQbHVnaW4nKTtcclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IFBoYXNlciBpZiB5b3UgaW5zdGFsbCB5b3VyIHBsdWdpbnMgdXNpbmcgZWl0aGVyIHRoZVxyXG4gICAgICogR2FtZSBDb25maWd1cmF0aW9uIG9iamVjdCwgb3IgYnkgcHJlbG9hZGluZyB0aGVtIHZpYSB0aGUgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBzYW1lIHBsdWdpbiBjYW4gYmUgaW5zdGFsbGVkIG11bHRpcGxlIHRpbWVzIGludG8gdGhlIFBsdWdpbiBNYW5hZ2VyIGJ5IHNpbXBseSBnaXZpbmcgZWFjaFxyXG4gICAgICogaW5zdGFuY2UgaXRzIG93biB1bmlxdWUga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNpbnN0YWxsXHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgaGFuZGxlIGdpdmVuIHRvIHRoaXMgcGx1Z2luIHdpdGhpbiB0aGUgUGx1Z2luIE1hbmFnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwbHVnaW4gLSBUaGUgcGx1Z2luIGNvZGUuIFRoaXMgc2hvdWxkIGJlIHRoZSBub24taW5zdGFudGlhdGVkIHZlcnNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGFydD1mYWxzZV0gLSBBdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBwbHVnaW4gcnVubmluZz8gVGhpcyBpcyBhbHdheXMgYHRydWVgIGlmIHlvdSBwcm92aWRlIGEgbWFwcGluZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbWFwcGluZ10gLSBJZiB0aGlzIHBsdWdpbiBpcyBpbmplY3RlZCBpbnRvIHRoZSBQaGFzZXIuU2NlbmUgY2xhc3MsIHRoaXMgaXMgdGhlIHByb3BlcnR5IGtleSB0byB1c2UuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gQSB2YWx1ZSBwYXNzZWQgdG8gdGhlIHBsdWdpbidzIGBpbml0YCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW59IFRoZSBwbHVnaW4gdGhhdCB3YXMgc3RhcnRlZCwgb3IgYG51bGxgIGlmIGBzdGFydGAgd2FzIGZhbHNlLCBvciBnYW1lIGlzbid0IHlldCBib290ZWQuXHJcbiAgICAgKi9cclxuICAgIGluc3RhbGw6IGZ1bmN0aW9uIChrZXksIHBsdWdpbiwgc3RhcnQsIG1hcHBpbmcsIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHsgc3RhcnQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChtYXBwaW5nID09PSB1bmRlZmluZWQpIHsgbWFwcGluZyA9IG51bGw7IH1cclxuICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7IGRhdGEgPSBudWxsOyB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIFBsdWdpbjogJyArIGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKFBsdWdpbkNhY2hlLmhhc0N1c3RvbShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdQbHVnaW4ga2V5IGluIHVzZTogJyArIGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1hcHBpbmcgIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdGFydCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZ2FtZS5pc0Jvb3RlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdHbG9iYWwucHVzaCh7IGtleToga2V5LCBwbHVnaW46IHBsdWdpbiwgc3RhcnQ6IHN0YXJ0LCBtYXBwaW5nOiBtYXBwaW5nLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQWRkIGl0IHRvIHRoZSBwbHVnaW4gc3RvcmVcclxuICAgICAgICAgICAgUGx1Z2luQ2FjaGUucmVnaXN0ZXJDdXN0b20oa2V5LCBwbHVnaW4sIG1hcHBpbmcsIGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuIGluZGV4IG9mIGEgZ2xvYmFsIHBsdWdpbiBiYXNlZCBvbiB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNnZXRJbmRleFxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgcGx1Z2luIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgaW5kZXggb2YgdGhlIHBsdWdpbiB3aXRoaW4gdGhlIHBsdWdpbnMgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGdldEluZGV4OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5wbHVnaW5zO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSBsaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBnbG9iYWwgcGx1Z2luIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI2dldEVudHJ5XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBwbHVnaW4ga2V5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5QbHVnaW5zLkdsb2JhbFBsdWdpbn0gVGhlIHBsdWdpbiBlbnRyeS5cclxuICAgICAqL1xyXG4gICAgZ2V0RW50cnk6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuZ2V0SW5kZXgoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5zW2lkeF07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZ2xvYmFsIHBsdWdpbiwgYmFzZWQgb24gaXRzIGtleSwgaXMgYWN0aXZlIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjaXNBY3RpdmVcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHBsdWdpbiBrZXkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwbHVnaW4gaXMgYWN0aXZlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNBY3RpdmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5nZXRFbnRyeShrZXkpO1xyXG5cclxuICAgICAgICByZXR1cm4gKGVudHJ5ICYmIGVudHJ5LmFjdGl2ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIGEgZ2xvYmFsIHBsdWdpbiBydW5uaW5nLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBwbHVnaW4gd2FzIHByZXZpb3VzbHkgYWN0aXZlIHRoZW4gY2FsbGluZyBgc3RhcnRgIHdpbGwgcmVzZXQgaXQgdG8gYW4gYWN0aXZlIHN0YXRlIGFuZCB0aGVuXHJcbiAgICAgKiBjYWxsIGl0cyBgc3RhcnRgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgcGx1Z2luIGhhcyBuZXZlciBiZWVuIHJ1biBiZWZvcmUgYSBuZXcgaW5zdGFuY2Ugb2YgaXQgd2lsbCBiZSBjcmVhdGVkIHdpdGhpbiB0aGUgUGx1Z2luIE1hbmFnZXIsXHJcbiAgICAgKiBpdHMgYWN0aXZlIHN0YXRlIHNldCBhbmQgdGhlbiBib3RoIG9mIGl0cyBgaW5pdGAgYW5kIGBzdGFydGAgbWV0aG9kcyBjYWxsZWQsIGluIHRoYXQgb3JkZXIuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IHJ1bm5pbmcgdW5kZXIgdGhlIGdpdmVuIGtleSB0aGVuIG5vdGhpbmcgaGFwcGVucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwbHVnaW4gdG8gc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3J1bkFzXSAtIFJ1biB0aGUgcGx1Z2luIHVuZGVyIGEgbmV3IGtleS4gVGhpcyBhbGxvd3MgeW91IHRvIHJ1biBvbmUgcGx1Z2luIG11bHRpcGxlIHRpbWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuUGx1Z2lucy5CYXNlUGx1Z2lufSBUaGUgcGx1Z2luIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIGBudWxsYCBpZiBpbnZhbGlkIGtleSBnaXZlbiBvciBwbHVnaW4gaXMgYWxyZWFkeSBzdG9wcGVkLlxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKGtleSwgcnVuQXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJ1bkFzID09PSB1bmRlZmluZWQpIHsgcnVuQXMgPSBrZXk7IH1cclxuXHJcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5nZXRFbnRyeShydW5Bcyk7XHJcblxyXG4gICAgICAgIC8vICBQbHVnaW4gYWxyZWFkeSBydW5uaW5nIHVuZGVyIHRoaXMga2V5P1xyXG4gICAgICAgIGlmIChlbnRyeSAmJiAhZW50cnkuYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEl0IGV4aXN0cywgd2UganVzdCBuZWVkIHRvIHN0YXJ0IGl0IHVwIGFnYWluXHJcbiAgICAgICAgICAgIGVudHJ5LmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGVudHJ5LnBsdWdpbi5zdGFydCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghZW50cnkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3JlYXRlRW50cnkoa2V5LCBydW5Bcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGVudHJ5KSA/IGVudHJ5LnBsdWdpbiA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIGdsb2JhbCBwbHVnaW4sIGFkZHMgYW4gZW50cnkgaW50byB0aGUgcGx1Z2lucyBhcnJheSBhbmQgcmV0dXJucyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjY3JlYXRlRW50cnlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy45LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcnVuQXNdIC0gUnVuIHRoZSBwbHVnaW4gdW5kZXIgYSBuZXcga2V5LiBUaGlzIGFsbG93cyB5b3UgdG8gcnVuIG9uZSBwbHVnaW4gbXVsdGlwbGUgdGltZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW59IFRoZSBwbHVnaW4gdGhhdCB3YXMgc3RhcnRlZCwgb3IgYG51bGxgIGlmIGludmFsaWQga2V5IGdpdmVuLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVFbnRyeTogZnVuY3Rpb24gKGtleSwgcnVuQXMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGVudHJ5ID0gUGx1Z2luQ2FjaGUuZ2V0Q3VzdG9tKGtleSk7XHJcblxyXG4gICAgICAgIGlmIChlbnRyeSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBlbnRyeS5wbHVnaW4odGhpcyk7XHJcblxyXG4gICAgICAgICAgICBlbnRyeSA9IHtcclxuICAgICAgICAgICAgICAgIGtleTogcnVuQXMsXHJcbiAgICAgICAgICAgICAgICBwbHVnaW46IGluc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgbWFwcGluZzogZW50cnkubWFwcGluZyxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGVudHJ5LmRhdGFcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5wdXNoKGVudHJ5KTtcclxuXHJcbiAgICAgICAgICAgIGluc3RhbmNlLmluaXQoZW50cnkuZGF0YSk7XHJcbiAgICAgICAgICAgIGluc3RhbmNlLnN0YXJ0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZW50cnk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgYSBnbG9iYWwgcGx1Z2luIGZyb20gcnVubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgcGx1Z2luIGlzIGFjdGl2ZSB0aGVuIGl0cyBhY3RpdmUgc3RhdGUgd2lsbCBiZSBzZXQgdG8gZmFsc2UgYW5kIHRoZSBwbHVnaW5zIGBzdG9wYCBtZXRob2RcclxuICAgICAqIHdpbGwgYmUgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBwbHVnaW4gaXMgbm90IGFscmVhZHkgcnVubmluZywgbm90aGluZyB3aWxsIGhhcHBlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjc3RvcFxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiB0byBzdG9wLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoZSBQbHVnaW4gTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEVudHJ5KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5hY3RpdmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbnRyeS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgZW50cnkucGx1Z2luLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBnbG9iYWwgcGx1Z2luIGZyb20gdGhlIFBsdWdpbiBNYW5hZ2VyIGJhc2VkIG9uIHRoZSBnaXZlbiBrZXkgYW5kIHJldHVybnMgaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgaXQgY2Fubm90IGZpbmQgYW4gYWN0aXZlIHBsdWdpbiBiYXNlZCBvbiB0aGUga2V5LCBidXQgdGhlcmUgaXMgb25lIGluIHRoZSBQbHVnaW4gQ2FjaGUgd2l0aCB0aGUgc2FtZSBrZXksXHJcbiAgICAgKiB0aGVuIGl0IHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjYWNoZWQgcGx1Z2luIGFuZCByZXR1cm4gdGhhdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjZ2V0XHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGx1Z2luIHRvIGdldC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2F1dG9TdGFydD10cnVlXSAtIEF1dG9tYXRpY2FsbHkgc3RhcnQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBpZiBmb3VuZCBpbiB0aGUgY2FjaGUsIGJ1dCBub3QgYWN0aXZlbHkgcnVubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/KFBoYXNlci5QbHVnaW5zLkJhc2VQbHVnaW58ZnVuY3Rpb24pfSBUaGUgcGx1Z2luLCBvciBgbnVsbGAgaWYgbm8gcGx1Z2luIHdhcyBmb3VuZCBtYXRjaGluZyB0aGUga2V5LlxyXG4gICAgICovXHJcbiAgICBnZXQ6IGZ1bmN0aW9uIChrZXksIGF1dG9TdGFydClcclxuICAgIHtcclxuICAgICAgICBpZiAoYXV0b1N0YXJ0ID09PSB1bmRlZmluZWQpIHsgYXV0b1N0YXJ0ID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEVudHJ5KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChlbnRyeSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5wbHVnaW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwbHVnaW4gPSB0aGlzLmdldENsYXNzKGtleSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGx1Z2luICYmIGF1dG9TdGFydClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLmNyZWF0ZUVudHJ5KGtleSwga2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5KSA/IGVudHJ5LnBsdWdpbiA6IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGx1Z2luKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgY2FjaGUuXHJcbiAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIFBsdWdpbiBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNnZXRDbGFzc1xyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiB0byBnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlBsdWdpbnMuQmFzZVBsdWdpbn0gQSBQbHVnaW4gb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIGdldENsYXNzOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBQbHVnaW5DYWNoZS5nZXRDdXN0b21DbGFzcyhrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBnbG9iYWwgcGx1Z2luIGZyb20gdGhlIFBsdWdpbiBNYW5hZ2VyIGFuZCBQbHVnaW4gQ2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogSXQgaXMgdXAgdG8geW91IHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIHBsdWdpbiB0aGF0IHlvdSBtYXkgaG9sZCB3aXRoaW4geW91ciBnYW1lIGNvZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyI3JlbW92ZUdsb2JhbFBsdWdpblxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBsdWdpbiB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUdsb2JhbFBsdWdpbjogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEVudHJ5KGtleSk7XHJcblxyXG4gICAgICAgIGlmIChlbnRyeSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJlbW92ZSh0aGlzLnBsdWdpbnMsIGVudHJ5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFBsdWdpbkNhY2hlLnJlbW92ZUN1c3RvbShrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBzY2VuZSBwbHVnaW4gZnJvbSB0aGUgUGx1Z2luIE1hbmFnZXIgYW5kIFBsdWdpbiBDYWNoZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgbm90IHJlbW92ZSB0aGUgcGx1Z2luIGZyb20gYW55IGFjdGl2ZSBTY2VuZXMgdGhhdCBhcmUgYWxyZWFkeSB1c2luZyBpdC5cclxuICAgICAqXHJcbiAgICAgKiBJdCBpcyB1cCB0byB5b3UgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgcGx1Z2luIHRoYXQgeW91IG1heSBob2xkIHdpdGhpbiB5b3VyIGdhbWUgY29kZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjcmVtb3ZlU2NlbmVQbHVnaW5cclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwbHVnaW4gdG8gcmVtb3ZlLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVTY2VuZVBsdWdpbjogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBSZW1vdmUodGhpcy5zY2VuZVBsdWdpbnMsIGtleSk7XHJcblxyXG4gICAgICAgIFBsdWdpbkNhY2hlLnJlbW92ZShrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIG5ldyB0eXBlIG9mIEdhbWUgT2JqZWN0IHdpdGggdGhlIGdsb2JhbCBHYW1lIE9iamVjdCBGYWN0b3J5IGFuZCAvIG9yIENyZWF0b3IuXHJcbiAgICAgKiBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkIGZyb20gd2l0aGluIHlvdXIgUGx1Z2luIGNvZGUgYW5kIGlzIGEgaGVscGZ1bCBzaG9ydC1jdXQgZm9yIGNyZWF0aW5nXHJcbiAgICAgKiBuZXcgR2FtZSBPYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBrZXkgaXMgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBmYWN0b3JpZXMgYW5kIHVzZWQgdG8gY3JlYXRlIHRoZVxyXG4gICAgICogR2FtZSBPYmplY3QuIEZvciBleGFtcGxlOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMucGx1Z2lucy5yZWdpc3RlckdhbWVPYmplY3QoJ2Nsb3duJywgY2xvd25GYWN0b3J5Q2FsbGJhY2ssIGNsb3duQ3JlYXRvckNhbGxiYWNrKTtcclxuICAgICAqIC8vIGxhdGVyIGluIHlvdXIgZ2FtZSBjb2RlOlxyXG4gICAgICogdGhpcy5hZGQuY2xvd24oKTtcclxuICAgICAqIHRoaXMubWFrZS5jbG93bigpO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBjYWxsYmFja3MgYXJlIHdoYXQgYXJlIGNhbGxlZCB3aGVuIHRoZSBmYWN0b3JpZXMgdHJ5IHRvIGNyZWF0ZSBhIEdhbWUgT2JqZWN0XHJcbiAgICAgKiBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LiBJdCdzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoYXQgdGhlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCB3aXRoaW5cclxuICAgICAqIHRoZSBjb250ZXh0IG9mIHRoZSBHYW1lT2JqZWN0RmFjdG9yeS4gSW4gdGhpcyBjb250ZXh0IHRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlXHJcbiAgICAgKiB0byB1c2U6XHJcbiAgICAgKiBcclxuICAgICAqIHRoaXMuc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeS5cclxuICAgICAqIHRoaXMuZGlzcGxheUxpc3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBMaXN0IHRoZSBTY2VuZSBvd25zLlxyXG4gICAgICogdGhpcy51cGRhdGVMaXN0IC0gQSByZWZlcmVuY2UgdG8gdGhlIFVwZGF0ZSBMaXN0IHRoZSBTY2VuZSBvd25zLlxyXG4gICAgICogXHJcbiAgICAgKiBTZWUgdGhlIEdhbWVPYmplY3RGYWN0b3J5IGFuZCBHYW1lT2JqZWN0Q3JlYXRvciBjbGFzc2VzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgKiBBbnkgcHVibGljIHByb3BlcnR5IG9yIG1ldGhvZCBsaXN0ZWQgaXMgYXZhaWxhYmxlIGZyb20geW91ciBjYWxsYmFja3MgdW5kZXIgYHRoaXNgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNyZWdpc3RlckdhbWVPYmplY3RcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBHYW1lIE9iamVjdCB0aGF0IHRoZSBnaXZlbiBjYWxsYmFja3Mgd2lsbCBjcmVhdGUsIGkuZS4gYGltYWdlYCwgYHNwcml0ZWAuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZmFjdG9yeUNhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgR2FtZSBPYmplY3QgRmFjdG9yeSBpcyBjYWxsZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY3JlYXRvckNhbGxiYWNrXSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgR2FtZSBPYmplY3QgQ3JlYXRvciBpcyBjYWxsZWQuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyR2FtZU9iamVjdDogZnVuY3Rpb24gKGtleSwgZmFjdG9yeUNhbGxiYWNrLCBjcmVhdG9yQ2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZhY3RvcnlDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdhbWVPYmplY3RGYWN0b3J5LnJlZ2lzdGVyKGtleSwgZmFjdG9yeUNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjcmVhdG9yQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHYW1lT2JqZWN0Q3JlYXRvci5yZWdpc3RlcihrZXksIGNyZWF0b3JDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIEdhbWUgT2JqZWN0IGZyb20gdGhlIGdsb2JhbCBHYW1lIE9iamVjdCBGYWN0b3J5IGFuZCAvIG9yIENyZWF0b3IuXHJcbiAgICAgKiBUaGlzIGlzIHVzdWFsbHkgY2FsbGVkIGZyb20gd2l0aGluIHlvdXIgUGx1Z2luIGRlc3RydWN0aW9uIGNvZGUgdG8gaGVscCBjbGVhbi11cCBhZnRlciB5b3VyIHBsdWdpbiBoYXMgYmVlbiByZW1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNyZW1vdmVHYW1lT2JqZWN0XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIEdhbWUgT2JqZWN0IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZmFjdG9yaWVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVtb3ZlRnJvbUZhY3Rvcnk9dHJ1ZV0gLSBTaG91bGQgdGhlIEdhbWUgT2JqZWN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgR2FtZSBPYmplY3QgRmFjdG9yeT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlbW92ZUZyb21DcmVhdG9yPXRydWVdIC0gU2hvdWxkIHRoZSBHYW1lIE9iamVjdCBiZSByZW1vdmVkIGZyb20gdGhlIEdhbWUgT2JqZWN0IENyZWF0b3I/XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUdhbWVPYmplY3Q6IGZ1bmN0aW9uIChrZXksIHJlbW92ZUZyb21GYWN0b3J5LCByZW1vdmVGcm9tQ3JlYXRvcilcclxuICAgIHtcclxuICAgICAgICBpZiAocmVtb3ZlRnJvbUZhY3RvcnkgPT09IHVuZGVmaW5lZCkgeyByZW1vdmVGcm9tRmFjdG9yeSA9IHRydWU7IH1cclxuICAgICAgICBpZiAocmVtb3ZlRnJvbUNyZWF0b3IgPT09IHVuZGVmaW5lZCkgeyByZW1vdmVGcm9tQ3JlYXRvciA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZUZyb21GYWN0b3J5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2FtZU9iamVjdEZhY3RvcnkucmVtb3ZlKGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVtb3ZlRnJvbUNyZWF0b3IpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHYW1lT2JqZWN0Q3JlYXRvci5yZW1vdmUoa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIG5ldyBmaWxlIHR5cGUgd2l0aCB0aGUgZ2xvYmFsIEZpbGUgVHlwZXMgTWFuYWdlciwgbWFraW5nIGl0IGF2YWlsYWJsZSB0byBhbGwgTG9hZGVyXHJcbiAgICAgKiBQbHVnaW5zIGNyZWF0ZWQgYWZ0ZXIgdGhpcy5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyB1c3VhbGx5IGNhbGxlZCBmcm9tIHdpdGhpbiB5b3VyIFBsdWdpbiBjb2RlIGFuZCBpcyBhIGhlbHBmdWwgc2hvcnQtY3V0IGZvciBjcmVhdGluZ1xyXG4gICAgICogbmV3IGxvYWRlciBmaWxlIHR5cGVzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBrZXkgaXMgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBMb2FkZXIgUGx1Z2luIGFuZCB1c2VkIHRvIGxvYWQgdGhlXHJcbiAgICAgKiBmaWxlcy4gRm9yIGV4YW1wbGU6XHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogdGhpcy5wbHVnaW5zLnJlZ2lzdGVyRmlsZVR5cGUoJ3dhZCcsIGRvb21XYWRMb2FkZXJDYWxsYmFjayk7XHJcbiAgICAgKiAvLyBsYXRlciBpbiB5b3VyIHByZWxvYWQgY29kZTpcclxuICAgICAqIHRoaXMubG9hZC53YWQoKTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgaXMgd2hhdCBpcyBjYWxsZWQgd2hlbiB0aGUgbG9hZGVyIHRyaWVzIHRvIGxvYWQgYSBmaWxlICBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogSXQncyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGhpblxyXG4gICAgICogdGhlIGNvbnRleHQgb2YgdGhlIExvYWRlclBsdWdpbi4gSW4gdGhpcyBjb250ZXh0IHRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgLyBtZXRob2RzIGF2YWlsYWJsZVxyXG4gICAgICogdG8gdXNlOlxyXG4gICAgICogXHJcbiAgICAgKiB0aGlzLmFkZEZpbGUgLSBBIG1ldGhvZCB0byBhZGQgdGhlIG5ldyBmaWxlIHRvIHRoZSBsb2FkIHF1ZXVlLlxyXG4gICAgICogdGhpcy5zY2VuZSAtIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhlIExvYWRlciBQbHVnaW4gaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogU2VlIHRoZSBMb2FkZXJQbHVnaW4gY2xhc3MgZm9yIG1vcmUgZGV0YWlscy4gQW55IHB1YmxpYyBwcm9wZXJ0eSBvciBtZXRob2QgbGlzdGVkIGlzIGF2YWlsYWJsZSBmcm9tXHJcbiAgICAgKiB5b3VyIGNhbGxiYWNrIHVuZGVyIGB0aGlzYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXIjcmVnaXN0ZXJGaWxlVHlwZVxyXG4gICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIEdhbWUgT2JqZWN0IHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrcyB3aWxsIGNyZWF0ZSwgaS5lLiBgaW1hZ2VgLCBgc3ByaXRlYC5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBHYW1lIE9iamVjdCBGYWN0b3J5IGlzIGNhbGxlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBbYWRkVG9TY2VuZV0gLSBPcHRpb25hbGx5IGFkZCB0aGlzIGZpbGUgdHlwZSBpbnRvIHRoZSBMb2FkZXIgUGx1Z2luIG93bmVkIGJ5IHRoZSBnaXZlbiBTY2VuZS5cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJGaWxlVHlwZTogZnVuY3Rpb24gKGtleSwgY2FsbGJhY2ssIGFkZFRvU2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgRmlsZVR5cGVzTWFuYWdlci5yZWdpc3RlcihrZXksIGNhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgaWYgKGFkZFRvU2NlbmUgJiYgYWRkVG9TY2VuZS5zeXMubG9hZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFkZFRvU2NlbmUuc3lzLmxvYWRba2V5XSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIFBsdWdpbiBNYW5hZ2VyIGFuZCBhbGwgYXNzb2NpYXRlZCBwbHVnaW5zLlxyXG4gICAgICogSXQgd2lsbCBpdGVyYXRlIGFsbCBwbHVnaW5zIGZvdW5kIGFuZCBjYWxsIHRoZWlyIGBkZXN0cm95YCBtZXRob2RzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgUGx1Z2luQ2FjaGUgd2lsbCByZW1vdmUgYWxsIGN1c3RvbSBwbHVnaW5zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tpXS5wbHVnaW4uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUGx1Z2luQ2FjaGUuZGVzdHJveUN1c3RvbVBsdWdpbnMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2FtZS5ub1JldHVybilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFBsdWdpbkNhY2hlLmRlc3Ryb3lDb3JlUGx1Z2lucygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNjZW5lUGx1Z2lucyA9IFtdO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKlxyXG4gKiBcIlNvbWV0aW1lcywgdGhlIGVsZWdhbnQgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIGZ1bmN0aW9uLlxyXG4gKiBOb3QgYSBtZXRob2QuIE5vdCBhIGNsYXNzLiBOb3QgYSBmcmFtZXdvcmsuIEp1c3QgYSBmdW5jdGlvbi5cIlxyXG4gKiAgLS0gSm9obiBDYXJtYWNrXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQbHVnaW5NYW5hZ2VyO1xyXG4iLCIvKipcclxuKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4qIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4qIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIzLXBsdWdpbi10ZW1wbGF0ZS9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVCBMaWNlbnNlfVxyXG4qL1xyXG5cclxudmFyIEJhc2VQbHVnaW4gPSByZXF1aXJlKCcuL0Jhc2VQbHVnaW4nKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFNjZW5lIExldmVsIFBsdWdpbiBpcyBpbnN0YWxsZWQgaW50byBldmVyeSBTY2VuZSBhbmQgYmVsb25ncyB0byB0aGF0IFNjZW5lLlxyXG4gKiBJdCBjYW4gbGlzdGVuIGZvciBTY2VuZSBldmVudHMgYW5kIHJlc3BvbmQgdG8gdGhlbS5cclxuICogSXQgY2FuIG1hcCBpdHNlbGYgdG8gYSBTY2VuZSBwcm9wZXJ0eSwgb3IgaW50byB0aGUgU2NlbmUgU3lzdGVtcywgb3IgYm90aC5cclxuICpcclxuICogQGNsYXNzIFNjZW5lUGx1Z2luXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUGx1Z2luc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuUGx1Z2lucy5CYXNlUGx1Z2luXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy44LjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgaGFzIGluc3RhbGxlZCB0aGlzIHBsdWdpbi5cclxuICogQHBhcmFtIHtQaGFzZXIuUGx1Z2lucy5QbHVnaW5NYW5hZ2VyfSBwbHVnaW5NYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIFBsdWdpbiBNYW5hZ2VyLlxyXG4gKi9cclxudmFyIFNjZW5lUGx1Z2luID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBCYXNlUGx1Z2luLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2NlbmVQbHVnaW4gKHNjZW5lLCBwbHVnaW5NYW5hZ2VyKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VQbHVnaW4uY2FsbCh0aGlzLCBwbHVnaW5NYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgaGFzIGluc3RhbGxlZCB0aGlzIHBsdWdpbi5cclxuICAgICAgICAgKiBPbmx5IHNldCBpZiBpdCdzIGEgU2NlbmUgUGx1Z2luLCBvdGhlcndpc2UgYG51bGxgLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSBzZXQgd2hlbiB0aGUgcGx1Z2luIGlzIGluc3RhbnRpYXRlZCBhbmQgYWRkZWQgdG8gdGhlIFNjZW5lLCBub3QgYmVmb3JlLlxyXG4gICAgICAgICAqIFlvdSBjYW4gdXNlIGl0IGR1cmluZyB0aGUgYGJvb3RgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLlNjZW5lUGx1Z2luI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUgez9QaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHByb3RlY3RlZFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgb2YgdGhlIFNjZW5lIHRoYXQgaGFzIGluc3RhbGxlZCB0aGlzIHBsdWdpbi5cclxuICAgICAgICAgKiBPbmx5IHNldCBpZiBpdCdzIGEgU2NlbmUgUGx1Z2luLCBvdGhlcndpc2UgYG51bGxgLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgb25seSBzZXQgd2hlbiB0aGUgcGx1Z2luIGlzIGluc3RhbnRpYXRlZCBhbmQgYWRkZWQgdG8gdGhlIFNjZW5lLCBub3QgYmVmb3JlLlxyXG4gICAgICAgICAqIFlvdSBjYW4gdXNlIGl0IGR1cmluZyB0aGUgYGJvb3RgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5QbHVnaW5zLlNjZW5lUGx1Z2luI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7P1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgICAgICogQHNpbmNlIDMuOC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gc2NlbmUuc3lzO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgU2NlbmUgYm9vdHMuIEl0IGlzIG9ubHkgZXZlciBjYWxsZWQgb25jZS5cclxuICAgICAqXHJcbiAgICAgKiBCeSB0aGlzIHBvaW50IHRoZSBwbHVnaW4gcHJvcGVydGllcyBgc2NlbmVgIGFuZCBgc3lzdGVtc2Agd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogSW4gaGVyZSB5b3UgY2FuIGxpc3RlbiBmb3Ige0BsaW5rIFBoYXNlci5TY2VuZXMuRXZlbnRzIFNjZW5lIGV2ZW50c30gYW5kIHNldC11cCB3aGF0ZXZlciB5b3UgbmVlZCBmb3IgdGhpcyBwbHVnaW4gdG8gcnVuLlxyXG4gICAgICogSGVyZSBhcmUgdGhlIFNjZW5lIGV2ZW50cyB5b3UgY2FuIGxpc3RlbiB0bzpcclxuICAgICAqXHJcbiAgICAgKiAtIHN0YXJ0XHJcbiAgICAgKiAtIHJlYWR5XHJcbiAgICAgKiAtIHByZXVwZGF0ZVxyXG4gICAgICogLSB1cGRhdGVcclxuICAgICAqIC0gcG9zdHVwZGF0ZVxyXG4gICAgICogLSByZXNpemVcclxuICAgICAqIC0gcGF1c2VcclxuICAgICAqIC0gcmVzdW1lXHJcbiAgICAgKiAtIHNsZWVwXHJcbiAgICAgKiAtIHdha2VcclxuICAgICAqIC0gdHJhbnNpdGlvbmluaXRcclxuICAgICAqIC0gdHJhbnNpdGlvbnN0YXJ0XHJcbiAgICAgKiAtIHRyYW5zaXRpb25jb21wbGV0ZVxyXG4gICAgICogLSB0cmFuc2l0aW9ub3V0XHJcbiAgICAgKiAtIHNodXRkb3duXHJcbiAgICAgKiAtIGRlc3Ryb3lcclxuICAgICAqXHJcbiAgICAgKiBBdCB0aGUgdmVyeSBsZWFzdCB5b3Ugc2hvdWxkIG9mZmVyIGEgZGVzdHJveSBoYW5kbGVyIGZvciB3aGVuIHRoZSBTY2VuZSBjbG9zZXMgZG93biwgaS5lOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG4gICAgICogZXZlbnRFbWl0dGVyLm9uY2UoJ2Rlc3Ryb3knLCB0aGlzLnNjZW5lRGVzdHJveSwgdGhpcyk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlNjZW5lUGx1Z2luI2Jvb3RcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdhbWUgaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgbXVzdCByZWxlYXNlIGV2ZXJ5dGhpbmcgaW4gaGVyZSwgYWxsIHJlZmVyZW5jZXMsIGFsbCBvYmplY3RzLCBmcmVlIGl0IGFsbCB1cC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5QbHVnaW5zLlNjZW5lUGx1Z2luI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGx1Z2luTWFuYWdlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5nYW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNjZW5lUGx1Z2luO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5QbHVnaW5zXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQmFzZVBsdWdpbjogcmVxdWlyZSgnLi9CYXNlUGx1Z2luJyksXHJcbiAgICBEZWZhdWx0UGx1Z2luczogcmVxdWlyZSgnLi9EZWZhdWx0UGx1Z2lucycpLFxyXG4gICAgUGx1Z2luQ2FjaGU6IHJlcXVpcmUoJy4vUGx1Z2luQ2FjaGUnKSxcclxuICAgIFBsdWdpbk1hbmFnZXI6IHJlcXVpcmUoJy4vUGx1Z2luTWFuYWdlcicpLFxyXG4gICAgU2NlbmVQbHVnaW46IHJlcXVpcmUoJy4vU2NlbmVQbHVnaW4nKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiogQSBwb2x5ZmlsbCBmb3IgQXJyYXkuZm9yRWFjaFxyXG4qIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2hcclxuKi9cclxuaWYgKCFBcnJheS5wcm90b3R5cGUuZm9yRWFjaClcclxue1xyXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoZnVuIC8qLCB0aGlzQXJnICovKVxyXG4gICAge1xyXG4gICAgICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyk7XHJcbiAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGZ1biAhPT0gJ2Z1bmN0aW9uJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0aGlzQXJnID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyID8gYXJndW1lbnRzWzFdIDogdm9pZCAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgaW4gdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnVuLmNhbGwodGhpc0FyZywgdFtpXSwgaSwgdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbiIsIi8qKlxyXG4qIEEgcG9seWZpbGwgZm9yIEFycmF5LmlzQXJyYXlcclxuKi9cclxuaWYgKCFBcnJheS5pc0FycmF5KVxyXG57XHJcbiAgICBBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKGFyZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XHJcbiAgICB9O1xyXG59XHJcbiIsIi8qIENvcHlyaWdodCAyMDEzIENocmlzIFdpbHNvblxyXG5cclxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuXHJcbiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKi9cclxuXHJcbi8qXHJcblxyXG5UaGlzIG1vbmtleXBhdGNoIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgaW4gcHJvamVjdHMgdGhhdCBhcmVcclxud3JpdHRlbiB0byB0aGUgcHJvcGVyIEF1ZGlvQ29udGV4dCBzcGVjIChpbnN0ZWFkIG9mIHdlYmtpdEF1ZGlvQ29udGV4dCksXHJcbmFuZCB0aGF0IHVzZSB0aGUgbmV3IG5hbWluZyBhbmQgcHJvcGVyIGJpdHMgb2YgdGhlIFdlYiBBdWRpbyBBUEkgKGUuZy5cclxudXNpbmcgQnVmZmVyU291cmNlTm9kZS5zdGFydCgpIGluc3RlYWQgb2YgQnVmZmVyU291cmNlTm9kZS5ub3RlT24oKSksIGJ1dCBtYXlcclxuaGF2ZSB0byBydW4gb24gc3lzdGVtcyB0aGF0IG9ubHkgc3VwcG9ydCB0aGUgZGVwcmVjYXRlZCBiaXRzLlxyXG5cclxuVGhpcyBsaWJyYXJ5IHNob3VsZCBiZSBoYXJtbGVzcyB0byBpbmNsdWRlIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzXHJcbnVucHJlZml4ZWQgXCJBdWRpb0NvbnRleHRcIiwgYW5kL29yIGlmIGl0IHN1cHBvcnRzIHRoZSBuZXcgbmFtZXMuXHJcblxyXG5UaGUgcGF0Y2hlcyB0aGlzIGxpYnJhcnkgaGFuZGxlczpcclxuaWYgd2luZG93LkF1ZGlvQ29udGV4dCBpcyB1bnN1cHBvcnRlZCwgaXQgd2lsbCBiZSBhbGlhc2VkIHRvIHdlYmtpdEF1ZGlvQ29udGV4dCgpLlxyXG5pZiBBdWRpb0J1ZmZlclNvdXJjZU5vZGUuc3RhcnQoKSBpcyB1bmltcGxlbWVudGVkLCBpdCB3aWxsIGJlIHJvdXRlZCB0byBub3RlT24oKSBvclxyXG5ub3RlR3JhaW5PbigpLCBkZXBlbmRpbmcgb24gcGFyYW1ldGVycy5cclxuXHJcblRoZSBmb2xsb3dpbmcgYWxpYXNlcyBvbmx5IHRha2UgZWZmZWN0IGlmIHRoZSBuZXcgbmFtZXMgYXJlIG5vdCBhbHJlYWR5IGluIHBsYWNlOlxyXG5cclxuQXVkaW9CdWZmZXJTb3VyY2VOb2RlLnN0b3AoKSBpcyBhbGlhc2VkIHRvIG5vdGVPZmYoKVxyXG5BdWRpb0NvbnRleHQuY3JlYXRlR2FpbigpIGlzIGFsaWFzZWQgdG8gY3JlYXRlR2Fpbk5vZGUoKVxyXG5BdWRpb0NvbnRleHQuY3JlYXRlRGVsYXkoKSBpcyBhbGlhc2VkIHRvIGNyZWF0ZURlbGF5Tm9kZSgpXHJcbkF1ZGlvQ29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IoKSBpcyBhbGlhc2VkIHRvIGNyZWF0ZUphdmFTY3JpcHROb2RlKClcclxuQXVkaW9Db250ZXh0LmNyZWF0ZVBlcmlvZGljV2F2ZSgpIGlzIGFsaWFzZWQgdG8gY3JlYXRlV2F2ZVRhYmxlKClcclxuT3NjaWxsYXRvck5vZGUuc3RhcnQoKSBpcyBhbGlhc2VkIHRvIG5vdGVPbigpXHJcbk9zY2lsbGF0b3JOb2RlLnN0b3AoKSBpcyBhbGlhc2VkIHRvIG5vdGVPZmYoKVxyXG5Pc2NpbGxhdG9yTm9kZS5zZXRQZXJpb2RpY1dhdmUoKSBpcyBhbGlhc2VkIHRvIHNldFdhdmVUYWJsZSgpXHJcbkF1ZGlvUGFyYW0uc2V0VGFyZ2V0QXRUaW1lKCkgaXMgYWxpYXNlZCB0byBzZXRUYXJnZXRWYWx1ZUF0VGltZSgpXHJcblxyXG5UaGlzIGxpYnJhcnkgZG9lcyBOT1QgcGF0Y2ggdGhlIGVudW1lcmF0ZWQgdHlwZSBjaGFuZ2VzLCBhcyBpdCBpc1xyXG5yZWNvbW1lbmRlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiB0aGF0IGltcGxlbWVudGF0aW9ucyBzdXBwb3J0IGJvdGggaW50ZWdlclxyXG5hbmQgc3RyaW5nIHR5cGVzIGZvciBBdWRpb1Bhbm5lck5vZGUucGFubmluZ01vZGVsLCBBdWRpb1Bhbm5lck5vZGUuZGlzdGFuY2VNb2RlbFxyXG5CaXF1YWRGaWx0ZXJOb2RlLnR5cGUgYW5kIE9zY2lsbGF0b3JOb2RlLnR5cGUuXHJcblxyXG4qL1xyXG5cclxuKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgZnVuY3Rpb24gZml4U2V0VGFyZ2V0KHBhcmFtKSB7XHJcbiAgICBpZiAoIXBhcmFtKVx0Ly8gaWYgTllJLCBqdXN0IHJldHVyblxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAoIXBhcmFtLnNldFRhcmdldEF0VGltZSlcclxuICAgICAgcGFyYW0uc2V0VGFyZ2V0QXRUaW1lID0gcGFyYW0uc2V0VGFyZ2V0VmFsdWVBdFRpbWU7XHJcbiAgfVxyXG5cclxuICBpZiAod2luZG93Lmhhc093blByb3BlcnR5KCd3ZWJraXRBdWRpb0NvbnRleHQnKSAmJlxyXG4gICAgICAhd2luZG93Lmhhc093blByb3BlcnR5KCdBdWRpb0NvbnRleHQnKSkge1xyXG4gICAgd2luZG93LkF1ZGlvQ29udGV4dCA9IHdlYmtpdEF1ZGlvQ29udGV4dDtcclxuXHJcbiAgICBpZiAoIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZUdhaW4nKSlcclxuICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluID0gQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluTm9kZTtcclxuICAgIGlmICghQXVkaW9Db250ZXh0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlRGVsYXknKSlcclxuICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheSA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXlOb2RlO1xyXG4gICAgaWYgKCFBdWRpb0NvbnRleHQucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdjcmVhdGVTY3JpcHRQcm9jZXNzb3InKSlcclxuICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTY3JpcHRQcm9jZXNzb3IgPSBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUphdmFTY3JpcHROb2RlO1xyXG4gICAgaWYgKCFBdWRpb0NvbnRleHQucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdjcmVhdGVQZXJpb2RpY1dhdmUnKSlcclxuICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVQZXJpb2RpY1dhdmUgPSBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVdhdmVUYWJsZTtcclxuXHJcblxyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5pbnRlcm5hbF9jcmVhdGVHYWluID0gQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluO1xyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVHYWluID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBub2RlID0gdGhpcy5pbnRlcm5hbF9jcmVhdGVHYWluKCk7XHJcbiAgICAgIGZpeFNldFRhcmdldChub2RlLmdhaW4pO1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH07XHJcblxyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5pbnRlcm5hbF9jcmVhdGVEZWxheSA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXk7XHJcbiAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZURlbGF5ID0gZnVuY3Rpb24obWF4RGVsYXlUaW1lKSB7XHJcbiAgICAgIHZhciBub2RlID0gbWF4RGVsYXlUaW1lID8gdGhpcy5pbnRlcm5hbF9jcmVhdGVEZWxheShtYXhEZWxheVRpbWUpIDogdGhpcy5pbnRlcm5hbF9jcmVhdGVEZWxheSgpO1xyXG4gICAgICBmaXhTZXRUYXJnZXQobm9kZS5kZWxheVRpbWUpO1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH07XHJcblxyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5pbnRlcm5hbF9jcmVhdGVCdWZmZXJTb3VyY2UgPSBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUJ1ZmZlclNvdXJjZTtcclxuICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlQnVmZmVyU291cmNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBub2RlID0gdGhpcy5pbnRlcm5hbF9jcmVhdGVCdWZmZXJTb3VyY2UoKTtcclxuICAgICAgaWYgKCFub2RlLnN0YXJ0KSB7XHJcbiAgICAgICAgbm9kZS5zdGFydCA9IGZ1bmN0aW9uICggd2hlbiwgb2Zmc2V0LCBkdXJhdGlvbiApIHtcclxuICAgICAgICAgIGlmICggb2Zmc2V0IHx8IGR1cmF0aW9uIClcclxuICAgICAgICAgICAgdGhpcy5ub3RlR3JhaW5Pbiggd2hlbiB8fCAwLCBvZmZzZXQsIGR1cmF0aW9uICk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMubm90ZU9uKCB3aGVuIHx8IDAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGUuaW50ZXJuYWxfc3RhcnQgPSBub2RlLnN0YXJ0O1xyXG4gICAgICAgIG5vZGUuc3RhcnQgPSBmdW5jdGlvbiggd2hlbiwgb2Zmc2V0LCBkdXJhdGlvbiApIHtcclxuICAgICAgICAgIGlmKCB0eXBlb2YgZHVyYXRpb24gIT09ICd1bmRlZmluZWQnIClcclxuICAgICAgICAgICAgbm9kZS5pbnRlcm5hbF9zdGFydCggd2hlbiB8fCAwLCBvZmZzZXQsIGR1cmF0aW9uICk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIG5vZGUuaW50ZXJuYWxfc3RhcnQoIHdoZW4gfHwgMCwgb2Zmc2V0IHx8IDAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbm9kZS5zdG9wKSB7XHJcbiAgICAgICAgbm9kZS5zdG9wID0gZnVuY3Rpb24gKCB3aGVuICkge1xyXG4gICAgICAgICAgdGhpcy5ub3RlT2ZmKCB3aGVuIHx8IDAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGUuaW50ZXJuYWxfc3RvcCA9IG5vZGUuc3RvcDtcclxuICAgICAgICBub2RlLnN0b3AgPSBmdW5jdGlvbiggd2hlbiApIHtcclxuICAgICAgICAgIG5vZGUuaW50ZXJuYWxfc3RvcCggd2hlbiB8fCAwICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBmaXhTZXRUYXJnZXQobm9kZS5wbGF5YmFja1JhdGUpO1xyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH07XHJcblxyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5pbnRlcm5hbF9jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IgPSBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUR5bmFtaWNzQ29tcHJlc3NvcjtcclxuICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRHluYW1pY3NDb21wcmVzc29yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHZhciBub2RlID0gdGhpcy5pbnRlcm5hbF9jcmVhdGVEeW5hbWljc0NvbXByZXNzb3IoKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUudGhyZXNob2xkKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUua25lZSk7XHJcbiAgICAgIGZpeFNldFRhcmdldChub2RlLnJhdGlvKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUucmVkdWN0aW9uKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUuYXR0YWNrKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUucmVsZWFzZSk7XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfTtcclxuXHJcbiAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmludGVybmFsX2NyZWF0ZUJpcXVhZEZpbHRlciA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlQmlxdWFkRmlsdGVyO1xyXG4gICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVCaXF1YWRGaWx0ZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgdmFyIG5vZGUgPSB0aGlzLmludGVybmFsX2NyZWF0ZUJpcXVhZEZpbHRlcigpO1xyXG4gICAgICBmaXhTZXRUYXJnZXQobm9kZS5mcmVxdWVuY3kpO1xyXG4gICAgICBmaXhTZXRUYXJnZXQobm9kZS5kZXR1bmUpO1xyXG4gICAgICBmaXhTZXRUYXJnZXQobm9kZS5RKTtcclxuICAgICAgZml4U2V0VGFyZ2V0KG5vZGUuZ2Fpbik7XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoQXVkaW9Db250ZXh0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSggJ2NyZWF0ZU9zY2lsbGF0b3InICkpIHtcclxuICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5pbnRlcm5hbF9jcmVhdGVPc2NpbGxhdG9yID0gQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVPc2NpbGxhdG9yO1xyXG4gICAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZU9zY2lsbGF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuaW50ZXJuYWxfY3JlYXRlT3NjaWxsYXRvcigpO1xyXG4gICAgICAgIGlmICghbm9kZS5zdGFydCkge1xyXG4gICAgICAgICAgbm9kZS5zdGFydCA9IGZ1bmN0aW9uICggd2hlbiApIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RlT24oIHdoZW4gfHwgMCApO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbm9kZS5pbnRlcm5hbF9zdGFydCA9IG5vZGUuc3RhcnQ7XHJcbiAgICAgICAgICBub2RlLnN0YXJ0ID0gZnVuY3Rpb24gKCB3aGVuICkge1xyXG4gICAgICAgICAgICBub2RlLmludGVybmFsX3N0YXJ0KCB3aGVuIHx8IDApO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFub2RlLnN0b3ApIHtcclxuICAgICAgICAgIG5vZGUuc3RvcCA9IGZ1bmN0aW9uICggd2hlbiApIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RlT2ZmKCB3aGVuIHx8IDAgKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vZGUuaW50ZXJuYWxfc3RvcCA9IG5vZGUuc3RvcDtcclxuICAgICAgICAgIG5vZGUuc3RvcCA9IGZ1bmN0aW9uKCB3aGVuICkge1xyXG4gICAgICAgICAgICBub2RlLmludGVybmFsX3N0b3AoIHdoZW4gfHwgMCApO1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFub2RlLnNldFBlcmlvZGljV2F2ZSlcclxuICAgICAgICAgIG5vZGUuc2V0UGVyaW9kaWNXYXZlID0gbm9kZS5zZXRXYXZlVGFibGU7XHJcbiAgICAgICAgZml4U2V0VGFyZ2V0KG5vZGUuZnJlcXVlbmN5KTtcclxuICAgICAgICBmaXhTZXRUYXJnZXQobm9kZS5kZXR1bmUpO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnd2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dCcpICYmXHJcbiAgICAgICF3aW5kb3cuaGFzT3duUHJvcGVydHkoJ09mZmxpbmVBdWRpb0NvbnRleHQnKSkge1xyXG4gICAgd2luZG93Lk9mZmxpbmVBdWRpb0NvbnRleHQgPSB3ZWJraXRPZmZsaW5lQXVkaW9Db250ZXh0O1xyXG4gIH1cclxuXHJcbn0pKCk7XHJcbiIsIi8vIEVTNiBNYXRoLnRydW5jIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC90cnVuY1xyXG5pZiAoIU1hdGgudHJ1bmMpIHtcclxuICAgIE1hdGgudHJ1bmMgPSBmdW5jdGlvbiB0cnVuYyh4KSB7XHJcbiAgICAgICAgcmV0dXJuIHggPCAwID8gTWF0aC5jZWlsKHgpIDogTWF0aC5mbG9vcih4KTtcclxuICAgIH07XHJcbn1cclxuIiwiLyoqXHJcbiogTG93LWJ1ZGdldCBGbG9hdDMyQXJyYXkga25vY2stb2ZmLCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggUDIuanMgaW4gSUU5XHJcbiogU291cmNlOiBodHRwOi8vd3d3Lmh0bWw1Z2FtZWRldnMuY29tL3RvcGljLzU5ODgtcGhhc2VyLTEyLWllOS9cclxuKiBDYW1lcm9uIEZvYWxlIChodHRwOi8vd3d3LmtpYmlidS5jb20pXHJcbiovXHJcbmlmICh0eXBlb2Ygd2luZG93LlVpbnQzMkFycmF5ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB3aW5kb3cuVWludDMyQXJyYXkgIT09ICdvYmplY3QnKVxyXG57XHJcbiAgICB2YXIgQ2hlYXBBcnJheSA9IGZ1bmN0aW9uIChmYWtlVHlwZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJvdG8gPSBuZXcgQXJyYXkoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcblxyXG4gICAgICAgIHdpbmRvd1tmYWtlVHlwZV0gPSBmdW5jdGlvbihhcmcpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YoYXJnKSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEFycmF5LmNhbGwodGhpcywgYXJnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGFyZztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tpXSA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBBcnJheS5jYWxsKHRoaXMsIGFyZy5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gYXJnLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tpXSA9IGFyZ1tpXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHdpbmRvd1tmYWtlVHlwZV0ucHJvdG90eXBlID0gcHJvdG87XHJcbiAgICAgICAgd2luZG93W2Zha2VUeXBlXS5jb25zdHJ1Y3RvciA9IHdpbmRvd1tmYWtlVHlwZV07XHJcbiAgICB9O1xyXG5cclxuICAgIENoZWFwQXJyYXkoJ0Zsb2F0MzJBcnJheScpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcclxuICAgIENoZWFwQXJyYXkoJ1VpbnQzMkFycmF5Jyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG4gICAgQ2hlYXBBcnJheSgnVWludDE2QXJyYXknKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcbiAgICBDaGVhcEFycmF5KCdJbnQxNkFycmF5Jyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxyXG4gICAgQ2hlYXBBcnJheSgnQXJyYXlCdWZmZXInKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXHJcbn1cclxuIiwiLyoqXHJcbiAqIEFsc28gZml4IGZvciB0aGUgYWJzZW50IGNvbnNvbGUgaW4gSUU5XHJcbiAqL1xyXG5pZiAoIXdpbmRvdy5jb25zb2xlKVxyXG57XHJcbiAgICB3aW5kb3cuY29uc29sZSA9IHt9O1xyXG4gICAgd2luZG93LmNvbnNvbGUubG9nID0gd2luZG93LmNvbnNvbGUuYXNzZXJ0ID0gZnVuY3Rpb24oKXt9O1xyXG4gICAgd2luZG93LmNvbnNvbGUud2FybiA9IHdpbmRvdy5jb25zb2xlLmFzc2VydCA9IGZ1bmN0aW9uKCl7fTtcclxufVxyXG4iLCJyZXF1aXJlKCcuL0FycmF5LmZvckVhY2gnKTtcclxucmVxdWlyZSgnLi9BcnJheS5pc0FycmF5Jyk7XHJcbnJlcXVpcmUoJy4vQXVkaW9Db250ZXh0TW9ua2V5UGF0Y2gnKTtcclxucmVxdWlyZSgnLi9jb25zb2xlJyk7XHJcbnJlcXVpcmUoJy4vTWF0aC50cnVuYycpO1xyXG5yZXF1aXJlKCcuL3BlcmZvcm1hbmNlLm5vdycpO1xyXG5yZXF1aXJlKCcuL3JlcXVlc3RBbmltYXRpb25GcmFtZScpO1xyXG5yZXF1aXJlKCcuL1VpbnQzMkFycmF5Jyk7XHJcbiIsIi8qKlxyXG4gKiBwZXJmb3JtYW5jZS5ub3dcclxuICovXHJcbihmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgaWYgKCdwZXJmb3JtYW5jZScgaW4gd2luZG93ID09PSBmYWxzZSlcclxuICAgIHtcclxuICAgICAgICB3aW5kb3cucGVyZm9ybWFuY2UgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgVGhhbmtzIElFOFxyXG4gICAgRGF0ZS5ub3cgPSAoRGF0ZS5ub3cgfHwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICgnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPT09IGZhbHNlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBub3dPZmZzZXQgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICBpZiAocGVyZm9ybWFuY2UudGltaW5nICYmIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub3dPZmZzZXQgPSBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA9IGZ1bmN0aW9uIG5vdyAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBub3dPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSkoKTtcclxuIiwiLy8gUmVmZXJlbmNlczpcclxuLy8gaHR0cDovL3BhdWxpcmlzaC5jb20vMjAxMS9yZXF1ZXN0YW5pbWF0aW9uZnJhbWUtZm9yLXNtYXJ0LWFuaW1hdGluZy9cclxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTU3OTY3MVxyXG4vLyBodHRwOi8vdXBkYXRlcy5odG1sNXJvY2tzLmNvbS8yMDEyLzA1L3JlcXVlc3RBbmltYXRpb25GcmFtZS1BUEktbm93LXdpdGgtc3ViLW1pbGxpc2Vjb25kLXByZWNpc2lvblxyXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90aW1oYWxsLzQwNzg2MTRcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0ZpbmFuY2lhbC1UaW1lcy9wb2x5ZmlsbC1zZXJ2aWNlL3RyZWUvbWFzdGVyL3BvbHlmaWxscy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcclxuXHJcbi8vIHJlcXVlc3RBbmltYXRpb25GcmFtZVxyXG52YXIgbGFzdFRpbWUgPSBEYXRlLm5vdygpO1xyXG5cclxudmFyIHZlbmRvcnMgPSBbICdtcycsICdtb3onLCAnd2Via2l0JywgJ28nIF07XHJcblxyXG5mb3IgKHZhciB4ID0gMDsgeCA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyB4KyspXHJcbntcclxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdmVuZG9yc1t4XSArICdSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcclxuICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW3hdICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbeF0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XHJcbn1cclxuXHJcbmlmICghd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSlcclxue1xyXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihjYWxsYmFjayArICdpcyBub3QgYSBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB2YXIgZGVsYXkgPSAxNiArIGxhc3RUaW1lIC0gY3VycmVudFRpbWU7XHJcblxyXG4gICAgICAgIGlmIChkZWxheSA8IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxheSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0VGltZSA9IGN1cnJlbnRUaW1lO1xyXG5cclxuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxhc3RUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpO1xyXG4gICAgICAgIH0sIGRlbGF5KTtcclxuICAgIH07XHJcbn1cclxuXHJcbmlmICghd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKVxyXG57XHJcbiAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihpZClcclxuICAgIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xyXG4gICAgfTtcclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQaGFzZXIgQmxlbmQgTW9kZXMuXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5CbGVuZE1vZGVzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2tpcHMgdGhlIEJsZW5kIE1vZGUgY2hlY2sgaW4gdGhlIHJlbmRlcmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5TS0lQX0NIRUNLXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFNLSVBfQ0hFQ0s6IC0xLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm9ybWFsIGJsZW5kIG1vZGUuIEZvciBDYW52YXMgYW5kIFdlYkdMLlxyXG4gICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIGFuZCBkcmF3cyBuZXcgc2hhcGVzIG9uIHRvcCBvZiB0aGUgZXhpc3RpbmcgY2FudmFzIGNvbnRlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLk5PUk1BTFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBOT1JNQUw6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBhbmQgV2ViR0wuXHJcbiAgICAgKiBXaGVyZSBib3RoIHNoYXBlcyBvdmVybGFwIHRoZSBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IGFkZGluZyBjb2xvciB2YWx1ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkFERFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBBREQ6IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIGFuZCBXZWJHTC5cclxuICAgICAqIFRoZSBwaXhlbHMgYXJlIG9mIHRoZSB0b3AgbGF5ZXIgYXJlIG11bHRpcGxpZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBvZiB0aGUgYm90dG9tIGxheWVyLiBBIGRhcmtlciBwaWN0dXJlIGlzIHRoZSByZXN1bHQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLk1VTFRJUExZXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIE1VTFRJUExZOiAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NyZWVuIGJsZW5kIG1vZGUuIEZvciBDYW52YXMgYW5kIFdlYkdMLlxyXG4gICAgICogVGhlIHBpeGVscyBhcmUgaW52ZXJ0ZWQsIG11bHRpcGxpZWQsIGFuZCBpbnZlcnRlZCBhZ2Fpbi4gQSBsaWdodGVyIHBpY3R1cmUgaXMgdGhlIHJlc3VsdCAob3Bwb3NpdGUgb2YgbXVsdGlwbHkpXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLlNDUkVFTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBTQ1JFRU46IDMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVybGF5IGJsZW5kIG1vZGUuIEZvciBDYW52YXMgb25seS5cclxuICAgICAqIEEgY29tYmluYXRpb24gb2YgbXVsdGlwbHkgYW5kIHNjcmVlbi4gRGFyayBwYXJ0cyBvbiB0aGUgYmFzZSBsYXllciBiZWNvbWUgZGFya2VyLCBhbmQgbGlnaHQgcGFydHMgYmVjb21lIGxpZ2h0ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLk9WRVJMQVlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgT1ZFUkxBWTogNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERhcmtlbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBSZXRhaW5zIHRoZSBkYXJrZXN0IHBpeGVscyBvZiBib3RoIGxheWVycy5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuREFSS0VOXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERBUktFTjogNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpZ2h0ZW4gYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogUmV0YWlucyB0aGUgbGlnaHRlc3QgcGl4ZWxzIG9mIGJvdGggbGF5ZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5MSUdIVEVOXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIExJR0hURU46IDYsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xvciBEb2RnZSBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBEaXZpZGVzIHRoZSBib3R0b20gbGF5ZXIgYnkgdGhlIGludmVydGVkIHRvcCBsYXllci5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuQ09MT1JfRE9ER0VcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ09MT1JfRE9ER0U6IDcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xvciBCdXJuIGJsZW5kIG1vZGUuIEZvciBDYW52YXMgb25seS5cclxuICAgICAqIERpdmlkZXMgdGhlIGludmVydGVkIGJvdHRvbSBsYXllciBieSB0aGUgdG9wIGxheWVyLCBhbmQgdGhlbiBpbnZlcnRzIHRoZSByZXN1bHQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkNPTE9SX0JVUk5cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ09MT1JfQlVSTjogOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhcmQgTGlnaHQgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogQSBjb21iaW5hdGlvbiBvZiBtdWx0aXBseSBhbmQgc2NyZWVuIGxpa2Ugb3ZlcmxheSwgYnV0IHdpdGggdG9wIGFuZCBib3R0b20gbGF5ZXIgc3dhcHBlZC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuSEFSRF9MSUdIVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBIQVJEX0xJR0hUOiA5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU29mdCBMaWdodCBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBBIHNvZnRlciB2ZXJzaW9uIG9mIGhhcmQtbGlnaHQuIFB1cmUgYmxhY2sgb3Igd2hpdGUgZG9lcyBub3QgcmVzdWx0IGluIHB1cmUgYmxhY2sgb3Igd2hpdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLlNPRlRfTElHSFRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU09GVF9MSUdIVDogMTAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWZmZXJlbmNlIGJsZW5kIG1vZGUuIEZvciBDYW52YXMgb25seS5cclxuICAgICAqIFN1YnRyYWN0cyB0aGUgYm90dG9tIGxheWVyIGZyb20gdGhlIHRvcCBsYXllciBvciB0aGUgb3RoZXIgd2F5IHJvdW5kIHRvIGFsd2F5cyBnZXQgYSBwb3NpdGl2ZSB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuRElGRkVSRU5DRVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBESUZGRVJFTkNFOiAxMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4Y2x1c2lvbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBMaWtlIGRpZmZlcmVuY2UsIGJ1dCB3aXRoIGxvd2VyIGNvbnRyYXN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5FWENMVVNJT05cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgRVhDTFVTSU9OOiAxMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIEh1ZSBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBQcmVzZXJ2ZXMgdGhlIGx1bWEgYW5kIGNocm9tYSBvZiB0aGUgYm90dG9tIGxheWVyLCB3aGlsZSBhZG9wdGluZyB0aGUgaHVlIG9mIHRoZSB0b3AgbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkhVRVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBIVUU6IDEzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F0dXJhdGlvbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBQcmVzZXJ2ZXMgdGhlIGx1bWEgYW5kIGh1ZSBvZiB0aGUgYm90dG9tIGxheWVyLCB3aGlsZSBhZG9wdGluZyB0aGUgY2hyb21hIG9mIHRoZSB0b3AgbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLlNBVFVSQVRJT05cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU0FUVVJBVElPTjogMTQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xvciBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBQcmVzZXJ2ZXMgdGhlIGx1bWEgb2YgdGhlIGJvdHRvbSBsYXllciwgd2hpbGUgYWRvcHRpbmcgdGhlIGh1ZSBhbmQgY2hyb21hIG9mIHRoZSB0b3AgbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkNPTE9SXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIENPTE9SOiAxNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEx1bWlub3NpdHkgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogUHJlc2VydmVzIHRoZSBodWUgYW5kIGNocm9tYSBvZiB0aGUgYm90dG9tIGxheWVyLCB3aGlsZSBhZG9wdGluZyB0aGUgbHVtYSBvZiB0aGUgdG9wIGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5MVU1JTk9TSVRZXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIExVTUlOT1NJVFk6IDE2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxwaGEgZXJhc2UgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBhbmQgV2ViR0wuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkVSQVNFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEVSQVNFOiAxNyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvdXJjZS1pbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBUaGUgbmV3IHNoYXBlIGlzIGRyYXduIG9ubHkgd2hlcmUgYm90aCB0aGUgbmV3IHNoYXBlIGFuZCB0aGUgZGVzdGluYXRpb24gY2FudmFzIG92ZXJsYXAuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBtYWRlIHRyYW5zcGFyZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5TT1VSQ0VfSU5cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU09VUkNFX0lOOiAxOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNvdXJjZS1vdXQgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogVGhlIG5ldyBzaGFwZSBpcyBkcmF3biB3aGVyZSBpdCBkb2Vzbid0IG92ZXJsYXAgdGhlIGV4aXN0aW5nIGNhbnZhcyBjb250ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5TT1VSQ0VfT1VUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFNPVVJDRV9PVVQ6IDE5LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU291cmNlLW91dCBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBUaGUgbmV3IHNoYXBlIGlzIG9ubHkgZHJhd24gd2hlcmUgaXQgb3ZlcmxhcHMgdGhlIGV4aXN0aW5nIGNhbnZhcyBjb250ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5TT1VSQ0VfQVRPUFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBTT1VSQ0VfQVRPUDogMjAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0aW5hdGlvbi1vdmVyIGJsZW5kIG1vZGUuIEZvciBDYW52YXMgb25seS5cclxuICAgICAqIE5ldyBzaGFwZXMgYXJlIGRyYXduIGJlaGluZCB0aGUgZXhpc3RpbmcgY2FudmFzIGNvbnRlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkRFU1RJTkFUSU9OX09WRVJcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgREVTVElOQVRJT05fT1ZFUjogMjEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0aW5hdGlvbi1pbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBUaGUgZXhpc3RpbmcgY2FudmFzIGNvbnRlbnQgaXMga2VwdCB3aGVyZSBib3RoIHRoZSBuZXcgc2hhcGUgYW5kIGV4aXN0aW5nIGNhbnZhcyBjb250ZW50IG92ZXJsYXAuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBtYWRlIHRyYW5zcGFyZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5ERVNUSU5BVElPTl9JTlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBERVNUSU5BVElPTl9JTjogMjIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0aW5hdGlvbi1vdXQgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogVGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMga2VwdCB3aGVyZSBpdCBkb2Vzbid0IG92ZXJsYXAgdGhlIG5ldyBzaGFwZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuREVTVElOQVRJT05fT1VUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERFU1RJTkFUSU9OX09VVDogMjMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0aW5hdGlvbi1vdXQgYmxlbmQgbW9kZS4gRm9yIENhbnZhcyBvbmx5LlxyXG4gICAgICogVGhlIGV4aXN0aW5nIGNhbnZhcyBpcyBvbmx5IGtlcHQgd2hlcmUgaXQgb3ZlcmxhcHMgdGhlIG5ldyBzaGFwZS4gVGhlIG5ldyBzaGFwZSBpcyBkcmF3biBiZWhpbmQgdGhlIGNhbnZhcyBjb250ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5ERVNUSU5BVElPTl9BVE9QXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERFU1RJTkFUSU9OX0FUT1A6IDI0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlnaHRlbiBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBXaGVyZSBib3RoIHNoYXBlcyBvdmVybGFwIHRoZSBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IGFkZGluZyBjb2xvciB2YWx1ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5CbGVuZE1vZGVzLkxJR0hURVJcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTElHSFRFUjogMjUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3B5IGJsZW5kIG1vZGUuIEZvciBDYW52YXMgb25seS5cclxuICAgICAqIE9ubHkgdGhlIG5ldyBzaGFwZSBpcyBzaG93bi5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLkJsZW5kTW9kZXMuQ09QWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBDT1BZOiAyNixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFhvciBibGVuZCBtb2RlLiBGb3IgQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBTaGFwZXMgYXJlIG1hZGUgdHJhbnNwYXJlbnQgd2hlcmUgYm90aCBvdmVybGFwIGFuZCBkcmF3biBub3JtYWwgZXZlcnl3aGVyZSBlbHNlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuQmxlbmRNb2Rlcy5YT1JcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgWE9SOiAyN1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUGhhc2VyIFNjYWxlIE1vZGVzLlxyXG4gKiBcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuU2NhbGVNb2Rlc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG52YXIgU2NhbGVNb2RlcyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgU2NhbGUgTW9kZSAoTGluZWFyKS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlTW9kZXMuREVGQVVMVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBERUZBVUxUOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGluZWFyIFNjYWxlIE1vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZU1vZGVzLkxJTkVBUlxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBMSU5FQVI6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWFyZXN0IFNjYWxlIE1vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZU1vZGVzLk5FQVJFU1RcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTkVBUkVTVDogMVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2NhbGVNb2RlcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmVsaXBlIEFsZm9uc28gPEBiaXRuZW5mZXI+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FudmFzU25hcHNob3QgPSByZXF1aXJlKCcuLi9zbmFwc2hvdC9DYW52YXNTbmFwc2hvdCcpO1xyXG52YXIgQ2FtZXJhRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vY2FtZXJhcy8yZC9ldmVudHMnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vLi4vY29uc3QnKTtcclxudmFyIEdldEJsZW5kTW9kZXMgPSByZXF1aXJlKCcuL3V0aWxzL0dldEJsZW5kTW9kZXMnKTtcclxudmFyIFNjYWxlRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vc2NhbGUvZXZlbnRzJyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIENhbnZhcyBSZW5kZXJlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgMkQgY2FudmFzIHJlbmRlcmluZyBjb250ZXh0cywgaW5jbHVkaW5nIHRoZSBvbmUgdXNlZCBieSB0aGUgR2FtZSdzIGNhbnZhcy4gSXQgdHJhY2tzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhIGdpdmVuIGNvbnRleHQgYW5kIGNhbiByZW5kZXJlciB0ZXh0dXJlZCBHYW1lIE9iamVjdHMgdG8gaXQsIHRha2luZyBpbnRvIGFjY291bnQgYWxwaGEsIGJsZW5kaW5nLCBhbmQgc2NhbGluZy5cclxuICpcclxuICogQGNsYXNzIENhbnZhc1JlbmRlcmVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIFRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyByZW5kZXJlci5cclxuICovXHJcbnZhciBDYW52YXNSZW5kZXJlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDYW52YXNSZW5kZXJlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgUGhhc2VyIEdhbWUgaW5zdGFuY2UgdGhhdCBvd25zIHRoaXMgcmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25zdGFudCB3aGljaCBhbGxvd3MgdGhlIHJlbmRlcmVyIHRvIGJlIGVhc2lseSBpZGVudGlmaWVkIGFzIGEgQ2FudmFzIFJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gQ09OU1QuQ0FOVkFTO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIEdhbWUgT2JqZWN0cyB3aGljaCB3ZXJlIHJlbmRlcmVkIGluIGEgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2RyYXdDb3VudFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHJhd0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBjYW52YXMgYmVpbmcgcmVuZGVyZWQgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3dpZHRoXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGNhbnZhcyBiZWluZyByZW5kZXJlZCB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9jYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBvZiB0aGUgQ2FudmFzUmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2NvbmZpZ1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgICAgICAgIGNsZWFyQmVmb3JlUmVuZGVyOiBnYW1lLmNvbmZpZy5jbGVhckJlZm9yZVJlbmRlcixcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBnYW1lLmNvbmZpZy5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgICAgICAgIHJlc29sdXRpb246IGdhbWUuY29uZmlnLnJlc29sdXRpb24sXHJcbiAgICAgICAgICAgIGFudGlhbGlhczogZ2FtZS5jb25maWcuYW50aWFsaWFzLFxyXG4gICAgICAgICAgICByb3VuZFBpeGVsczogZ2FtZS5jb25maWcucm91bmRQaXhlbHNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FudmFzIGVsZW1lbnQgd2hpY2ggdGhlIEdhbWUgdXNlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjZ2FtZUNhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWVDYW52YXMgPSBnYW1lLmNhbnZhcztcclxuXHJcbiAgICAgICAgdmFyIGNvbnRleHRPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBhbHBoYTogZ2FtZS5jb25maWcudHJhbnNwYXJlbnQsXHJcbiAgICAgICAgICAgIGRlc3luY2hyb25pemVkOiBnYW1lLmNvbmZpZy5kZXN5bmNocm9uaXplZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYW52YXMgY29udGV4dCB1c2VkIHRvIHJlbmRlciBhbGwgQ2FtZXJhcyBpbiBhbGwgU2NlbmVzIGR1cmluZyB0aGUgZ2FtZSBsb29wLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNnYW1lQ29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lQ29udGV4dCA9ICh0aGlzLmdhbWUuY29uZmlnLmNvbnRleHQpID8gdGhpcy5nYW1lLmNvbmZpZy5jb250ZXh0IDogdGhpcy5nYW1lQ2FudmFzLmdldENvbnRleHQoJzJkJywgY29udGV4dE9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FudmFzIGNvbnRleHQgY3VycmVudGx5IHVzZWQgYnkgdGhlIENhbnZhc1JlbmRlcmVyIGZvciBhbGwgcmVuZGVyaW5nIG9wZXJhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2N1cnJlbnRDb250ZXh0XHJcbiAgICAgICAgICogQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gdGhpcy5nYW1lQ29udGV4dDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2hvdWxkIHRoZSBDYW52YXMgdXNlIEltYWdlIFNtb290aGluZyBvciBub3Qgd2hlbiBkcmF3aW5nIFNwcml0ZXM/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2FudGlhbGlhc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFudGlhbGlhcyA9IGdhbWUuY29uZmlnLmFudGlhbGlhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJsZW5kIG1vZGVzIHN1cHBvcnRlZCBieSB0aGUgQ2FudmFzIFJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBvYmplY3QgbWFwcyB0aGUge0BsaW5rIFBoYXNlci5CbGVuZE1vZGVzfSB0byBjYW52YXMgY29tcG9zaXRpbmcgb3BlcmF0aW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjYmxlbmRNb2Rlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJsZW5kTW9kZXMgPSBHZXRCbGVuZE1vZGVzKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIGN1cnJlbnRseSBzY2hlZHVsZWQgc25hcHNob3QuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogSWYgYSBub24tbnVsbCBgY2FsbGJhY2tgIGlzIHNldCBpbiB0aGlzIG9iamVjdCwgYSBzbmFwc2hvdCBvZiB0aGUgY2FudmFzIHdpbGwgYmUgdGFrZW4gYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZnVsbHkgcmVuZGVyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3NuYXBzaG90U3RhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlJlbmRlcmVyLlNuYXBzaG90LlNuYXBzaG90U3RhdGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc25hcHNob3RTdGF0ZSA9IHtcclxuICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgd2lkdGg6IDEsXHJcbiAgICAgICAgICAgIGhlaWdodDogMSxcclxuICAgICAgICAgICAgZ2V0UGl4ZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogbnVsbCxcclxuICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXHJcbiAgICAgICAgICAgIGVuY29kZXI6IDAuOTJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNfdGVtcE1hdHJpeDFcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgxID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNfdGVtcE1hdHJpeDJcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgyID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNfdGVtcE1hdHJpeDNcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgzID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNfdGVtcE1hdHJpeDRcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXg0ID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwYXJlcyB0aGUgZ2FtZSBjYW52YXMgZm9yIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjaW5pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGluaXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5nYW1lLnNjYWxlLm9uKFNjYWxlRXZlbnRzLlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBiYXNlU2l6ZSA9IHRoaXMuZ2FtZS5zY2FsZS5iYXNlU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNpemUoYmFzZVNpemUud2lkdGgsIGJhc2VTaXplLmhlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGV2ZW50IGhhbmRsZXIgdGhhdCBtYW5hZ2VzIHRoZSBgcmVzaXplYCBldmVudCBkaXNwYXRjaGVkIGJ5IHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNvblJlc2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlN0cnVjdHMuU2l6ZX0gZ2FtZVNpemUgLSBUaGUgZGVmYXVsdCBHYW1lIFNpemUgb2JqZWN0LiBUaGlzIGlzIHRoZSB1bi1tb2RpZmllZCBnYW1lIGRpbWVuc2lvbnMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNpemV9IGJhc2VTaXplIC0gVGhlIGJhc2UgU2l6ZSBvYmplY3QuIFRoZSBnYW1lIGRpbWVuc2lvbnMgbXVsdGlwbGllZCBieSB0aGUgcmVzb2x1dGlvbi4gVGhlIGNhbnZhcyB3aWR0aCAvIGhlaWdodCB2YWx1ZXMgbWF0Y2ggdGhpcy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlN0cnVjdHMuU2l6ZX0gZGlzcGxheVNpemUgLSBUaGUgZGlzcGxheSBTaXplIG9iamVjdC4gVGhlIHNpemUgb2YgdGhlIGNhbnZhcyBzdHlsZSB3aWR0aCAvIGhlaWdodCBhdHRyaWJ1dGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyZXNvbHV0aW9uXSAtIFRoZSBTY2FsZSBNYW5hZ2VyIHJlc29sdXRpb24gc2V0dGluZy5cclxuICAgICAqL1xyXG4gICAgb25SZXNpemU6IGZ1bmN0aW9uIChnYW1lU2l6ZSwgYmFzZVNpemUpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEhhcyB0aGUgdW5kZXJseWluZyBjYW52YXMgc2l6ZSBjaGFuZ2VkP1xyXG4gICAgICAgIGlmIChiYXNlU2l6ZS53aWR0aCAhPT0gdGhpcy53aWR0aCB8fCBiYXNlU2l6ZS5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemUoYmFzZVNpemUud2lkdGgsIGJhc2VTaXplLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZSB0aGUgbWFpbiBnYW1lIGNhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjcmVzaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIHJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXgsIHRodXMgcmVzZXR0aW5nIGFueSB0cmFuc2Zvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjcmVzZXRUcmFuc2Zvcm1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZXNldFRyYW5zZm9ybTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBibGVuZCBtb2RlIChjb21wb3NpdGluZyBvcGVyYXRpb24pIG9mIHRoZSBjdXJyZW50IGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3NldEJsZW5kTW9kZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJsZW5kTW9kZSAtIFRoZSBuZXcgYmxlbmQgbW9kZSB3aGljaCBzaG91bGQgYmUgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIENhbnZhc1JlbmRlcmVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QmxlbmRNb2RlOiBmdW5jdGlvbiAoYmxlbmRNb2RlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gYmxlbmRNb2RlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgdGhhdCBhbGwgZHJhdyBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjc2V0Q29udGV4dFxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7P0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gW2N0eF0gLSBUaGUgbmV3IENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dCB0byBkcmF3IGV2ZXJ5dGhpbmcgdG8uIExlYXZlIGVtcHR5IHRvIHJlc2V0IHRvIHRoZSBHYW1lIENhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgQ2FudmFzIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRDb250ZXh0OiBmdW5jdGlvbiAoY3R4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbnRleHQgPSAoY3R4KSA/IGN0eCA6IHRoaXMuZ2FtZUNvbnRleHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGdsb2JhbCBhbHBoYSBvZiB0aGUgY3VycmVudCBjb250ZXh0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlciNzZXRBbHBoYVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIG5ldyBhbHBoYSB0byB1c2UsIHdoZXJlIDAgaXMgZnVsbHkgdHJhbnNwYXJlbnQgYW5kIDEgaXMgZnVsbHkgb3BhcXVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FudmFzUmVuZGVyZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbHBoYTogZnVuY3Rpb24gKGFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY3VycmVudENvbnRleHQuZ2xvYmFsQWxwaGEgPSBhbHBoYTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIGxvb3AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3ByZVJlbmRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHByZVJlbmRlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY3R4ID0gdGhpcy5nYW1lQ29udGV4dDtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWc7XHJcblxyXG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xyXG4gICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xyXG4gICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuY2xlYXJCZWZvcmVSZW5kZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcudHJhbnNwYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29uZmlnLmJhY2tncm91bmRDb2xvci5yZ2JhO1xyXG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRyYXdDb3VudCA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgU2NlbmUgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjcmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gcmVuZGVyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3R9IGNoaWxkcmVuIC0gVGhlIEdhbWUgT2JqZWN0cyB3aXRoaW4gdGhlIFNjZW5lIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gVGhlIGludGVycG9sYXRpb24gcGVyY2VudGFnZSB0byBhcHBseS4gQ3VycmVudGx5IHVudXNlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBTY2VuZSBDYW1lcmEgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKi9cclxuICAgIHJlbmRlcjogZnVuY3Rpb24gKHNjZW5lLCBjaGlsZHJlbiwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbGlzdCA9IGNoaWxkcmVuLmxpc3Q7XHJcbiAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBsaXN0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgdmFyIGN4ID0gY2FtZXJhLl9jeDtcclxuICAgICAgICB2YXIgY3kgPSBjYW1lcmEuX2N5O1xyXG4gICAgICAgIHZhciBjdyA9IGNhbWVyYS5fY3c7XHJcbiAgICAgICAgdmFyIGNoID0gY2FtZXJhLl9jaDtcclxuXHJcbiAgICAgICAgdmFyIGN0eCA9IChjYW1lcmEucmVuZGVyVG9UZXh0dXJlKSA/IGNhbWVyYS5jb250ZXh0IDogc2NlbmUuc3lzLmNvbnRleHQ7XHJcblxyXG4gICAgICAgIC8vICBTYXZlIGNvbnRleHQgcHJlLWNsaXBcclxuICAgICAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nYW1lLnNjZW5lLmN1c3RvbVZpZXdwb3J0cylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgY3R4LnJlY3QoY3gsIGN5LCBjdywgY2gpO1xyXG4gICAgICAgICAgICBjdHguY2xpcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IGN0eDtcclxuXHJcbiAgICAgICAgdmFyIG1hc2sgPSBjYW1lcmEubWFzaztcclxuXHJcbiAgICAgICAgaWYgKG1hc2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBtYXNrLnByZVJlbmRlckNhbnZhcyh0aGlzLCBudWxsLCBjYW1lcmEuX21hc2tDYW1lcmEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjYW1lcmEudHJhbnNwYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY2FtZXJhLmJhY2tncm91bmRDb2xvci5yZ2JhO1xyXG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoY3gsIGN5LCBjdywgY2gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gY2FtZXJhLmFscGhhO1xyXG5cclxuICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcclxuXHJcbiAgICAgICAgdGhpcy5kcmF3Q291bnQgKz0gbGlzdC5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucmVuZGVyVG9UZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FtZXJhLmVtaXQoQ2FtZXJhRXZlbnRzLlBSRV9SRU5ERVIsIGNhbWVyYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYW1lcmEubWF0cml4LmNvcHlUb0NvbnRleHQoY3R4KTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBsaXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjaGlsZC53aWxsUmVuZGVyKGNhbWVyYSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hpbGQubWFzaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQubWFzay5wcmVSZW5kZXJDYW52YXModGhpcywgY2hpbGQsIGNhbWVyYSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkLnJlbmRlckNhbnZhcyh0aGlzLCBjaGlsZCwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hpbGQubWFzaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2hpbGQubWFzay5wb3N0UmVuZGVyQ2FudmFzKHRoaXMsIGNoaWxkLCBjYW1lcmEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xyXG4gICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xyXG4gICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7XHJcblxyXG4gICAgICAgIGNhbWVyYS5mbGFzaEVmZmVjdC5wb3N0UmVuZGVyQ2FudmFzKGN0eCk7XHJcbiAgICAgICAgY2FtZXJhLmZhZGVFZmZlY3QucG9zdFJlbmRlckNhbnZhcyhjdHgpO1xyXG5cclxuICAgICAgICBjYW1lcmEuZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG1hc2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBtYXNrLnBvc3RSZW5kZXJDYW52YXModGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzdG9yZSBwcmUtY2xpcCBjb250ZXh0XHJcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKGNhbWVyYS5yZW5kZXJUb1RleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYW1lcmEuZW1pdChDYW1lcmFFdmVudHMuUE9TVF9SRU5ERVIsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLnJlbmRlclRvR2FtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuc3lzLmNvbnRleHQuZHJhd0ltYWdlKGNhbWVyYS5jYW52YXMsIGN4LCBjeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdG9yZXMgdGhlIGdhbWUgY29udGV4dCdzIGdsb2JhbCBzZXR0aW5ncyBhbmQgdGFrZXMgYSBzbmFwc2hvdCBpZiBvbmUgaXMgc2NoZWR1bGVkLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwb3N0LXJlbmRlciBzdGVwIGhhcHBlbnMgYWZ0ZXIgYWxsIENhbWVyYXMgaW4gYWxsIFNjZW5lcyBoYXZlIGJlZW4gcmVuZGVyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3Bvc3RSZW5kZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjdHggPSB0aGlzLmdhbWVDb250ZXh0O1xyXG5cclxuICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG5cclxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNuYXBzaG90U3RhdGU7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZS5jYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENhbnZhc1NuYXBzaG90KHRoaXMuZ2FtZUNhbnZhcywgc3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgc3RhdGUuY2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBhcmVhIG9mIHRoZSBnaXZlbiBjYW52YXMuXHJcbiAgICAgKiBcclxuICAgICAqIFVubGlrZSB0aGUgb3RoZXIgc25hcHNob3QgbWV0aG9kcywgdGhpcyBvbmUgaXMgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5IGFuZCBkb2Vzbid0IHdhaXQgZm9yIHRoZSBuZXh0IHJlbmRlci5cclxuICAgICAqIFxyXG4gICAgICogU25hcHNob3RzIHdvcmsgYnkgY3JlYXRpbmcgYW4gSW1hZ2Ugb2JqZWN0IGZyb20gdGhlIGNhbnZhcyBkYXRhLCB0aGlzIGlzIGEgYmxvY2tpbmcgcHJvY2Vzcywgd2hpY2ggZ2V0c1xyXG4gICAgICogbW9yZSBleHBlbnNpdmUgdGhlIGxhcmdlciB0aGUgY2FudmFzIHNpemUgZ2V0cywgc28gcGxlYXNlIGJlIGNhcmVmdWwgaG93IHlvdSBlbXBsb3kgdGhpcyBpbiB5b3VyIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3NuYXBzaG90Q2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIC0gVGhlIGNhbnZhcyB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5SZW5kZXJlci5TbmFwc2hvdC5TbmFwc2hvdENhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBGdW5jdGlvbiB0byBpbnZva2UgYWZ0ZXIgdGhlIHNuYXBzaG90IGltYWdlIGlzIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRQaXhlbD1mYWxzZV0gLSBHcmFiIGEgc2luZ2xlIHBpeGVsIGFzIGEgQ29sb3Igb2JqZWN0LCBvciBhbiBhcmVhIGFzIGFuIEltYWdlIG9iamVjdD9cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3g9MF0gLSBUaGUgeCBjb29yZGluYXRlIHRvIGdyYWIgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3k9MF0gLSBUaGUgeSBjb29yZGluYXRlIHRvIGdyYWIgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPWNhbnZhcy53aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1jYW52YXMuaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0naW1hZ2UvcG5nJ10gLSBUaGUgZm9ybWF0IG9mIHRoZSBpbWFnZSB0byBjcmVhdGUsIHVzdWFsbHkgYGltYWdlL3BuZ2Agb3IgYGltYWdlL2pwZWdgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmNvZGVyT3B0aW9ucz0wLjkyXSAtIFRoZSBpbWFnZSBxdWFsaXR5LCBiZXR3ZWVuIDAgYW5kIDEuIFVzZWQgZm9yIGltYWdlIGZvcm1hdHMgd2l0aCBsb3NzeSBjb21wcmVzc2lvbiwgc3VjaCBhcyBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBDYW52YXMgUmVuZGVyZXIuXHJcbiAgICAgKi9cclxuICAgIHNuYXBzaG90Q2FudmFzOiBmdW5jdGlvbiAoY2FudmFzLCBjYWxsYmFjaywgZ2V0UGl4ZWwsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHR5cGUsIGVuY29kZXJPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChnZXRQaXhlbCA9PT0gdW5kZWZpbmVkKSB7IGdldFBpeGVsID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdEFyZWEoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuXHJcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zbmFwc2hvdFN0YXRlO1xyXG5cclxuICAgICAgICBzdGF0ZS5nZXRQaXhlbCA9IGdldFBpeGVsO1xyXG5cclxuICAgICAgICBDYW52YXNTbmFwc2hvdCh0aGlzLmNhbnZhcywgc3RhdGUpO1xyXG5cclxuICAgICAgICBzdGF0ZS5jYWxsYmFjayA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBhIHNuYXBzaG90IG9mIHRoZSBlbnRpcmUgZ2FtZSB2aWV3cG9ydCB0byBiZSB0YWtlbiBhZnRlciB0aGUgY3VycmVudCBmcmFtZSBpcyByZW5kZXJlZC5cclxuICAgICAqIFxyXG4gICAgICogVG8gY2FwdHVyZSBhIHNwZWNpZmljIGFyZWEgc2VlIHRoZSBgc25hcHNob3RBcmVhYCBtZXRob2QuIFRvIGNhcHR1cmUgYSBzcGVjaWZpYyBwaXhlbCwgc2VlIGBzbmFwc2hvdFBpeGVsYC5cclxuICAgICAqIFxyXG4gICAgICogT25seSBvbmUgc25hcHNob3QgY2FuIGJlIGFjdGl2ZSBfcGVyIGZyYW1lXy4gSWYgeW91IGhhdmUgYWxyZWFkeSBjYWxsZWQgYHNuYXBzaG90UGl4ZWxgLCBmb3IgZXhhbXBsZSwgdGhlblxyXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIG92ZXJyaWRlIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBTbmFwc2hvdHMgd29yayBieSBjcmVhdGluZyBhbiBJbWFnZSBvYmplY3QgZnJvbSB0aGUgY2FudmFzIGRhdGEsIHRoaXMgaXMgYSBibG9ja2luZyBwcm9jZXNzLCB3aGljaCBnZXRzXHJcbiAgICAgKiBtb3JlIGV4cGVuc2l2ZSB0aGUgbGFyZ2VyIHRoZSBjYW52YXMgc2l6ZSBnZXRzLCBzbyBwbGVhc2UgYmUgY2FyZWZ1bCBob3cgeW91IGVtcGxveSB0aGlzIGluIHlvdXIgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXIjc25hcHNob3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlJlbmRlcmVyLlNuYXBzaG90LlNuYXBzaG90Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIEZ1bmN0aW9uIHRvIGludm9rZSBhZnRlciB0aGUgc25hcHNob3QgaW1hZ2UgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0naW1hZ2UvcG5nJ10gLSBUaGUgZm9ybWF0IG9mIHRoZSBpbWFnZSB0byBjcmVhdGUsIHVzdWFsbHkgYGltYWdlL3BuZ2Agb3IgYGltYWdlL2pwZWdgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmNvZGVyT3B0aW9ucz0wLjkyXSAtIFRoZSBpbWFnZSBxdWFsaXR5LCBiZXR3ZWVuIDAgYW5kIDEuIFVzZWQgZm9yIGltYWdlIGZvcm1hdHMgd2l0aCBsb3NzeSBjb21wcmVzc2lvbiwgc3VjaCBhcyBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgc25hcHNob3Q6IGZ1bmN0aW9uIChjYWxsYmFjaywgdHlwZSwgZW5jb2Rlck9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3RBcmVhKDAsIDAsIHRoaXMuZ2FtZUNhbnZhcy53aWR0aCwgdGhpcy5nYW1lQ2FudmFzLmhlaWdodCwgY2FsbGJhY2ssIHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2hlZHVsZXMgYSBzbmFwc2hvdCBvZiB0aGUgZ2l2ZW4gYXJlYSBvZiB0aGUgZ2FtZSB2aWV3cG9ydCB0byBiZSB0YWtlbiBhZnRlciB0aGUgY3VycmVudCBmcmFtZSBpcyByZW5kZXJlZC5cclxuICAgICAqIFxyXG4gICAgICogVG8gY2FwdHVyZSB0aGUgd2hvbGUgZ2FtZSB2aWV3cG9ydCBzZWUgdGhlIGBzbmFwc2hvdGAgbWV0aG9kLiBUbyBjYXB0dXJlIGEgc3BlY2lmaWMgcGl4ZWwsIHNlZSBgc25hcHNob3RQaXhlbGAuXHJcbiAgICAgKiBcclxuICAgICAqIE9ubHkgb25lIHNuYXBzaG90IGNhbiBiZSBhY3RpdmUgX3BlciBmcmFtZV8uIElmIHlvdSBoYXZlIGFscmVhZHkgY2FsbGVkIGBzbmFwc2hvdFBpeGVsYCwgZm9yIGV4YW1wbGUsIHRoZW5cclxuICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBvdmVycmlkZSBpdC5cclxuICAgICAqIFxyXG4gICAgICogU25hcHNob3RzIHdvcmsgYnkgY3JlYXRpbmcgYW4gSW1hZ2Ugb2JqZWN0IGZyb20gdGhlIGNhbnZhcyBkYXRhLCB0aGlzIGlzIGEgYmxvY2tpbmcgcHJvY2Vzcywgd2hpY2ggZ2V0c1xyXG4gICAgICogbW9yZSBleHBlbnNpdmUgdGhlIGxhcmdlciB0aGUgY2FudmFzIHNpemUgZ2V0cywgc28gcGxlYXNlIGJlIGNhcmVmdWwgaG93IHlvdSBlbXBsb3kgdGhpcyBpbiB5b3VyIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3NuYXBzaG90QXJlYVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZ3JhYiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBhcmVhIHRvIGdyYWIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlJlbmRlcmVyLlNuYXBzaG90LlNuYXBzaG90Q2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIEZ1bmN0aW9uIHRvIGludm9rZSBhZnRlciB0aGUgc25hcHNob3QgaW1hZ2UgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0naW1hZ2UvcG5nJ10gLSBUaGUgZm9ybWF0IG9mIHRoZSBpbWFnZSB0byBjcmVhdGUsIHVzdWFsbHkgYGltYWdlL3BuZ2Agb3IgYGltYWdlL2pwZWdgLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmNvZGVyT3B0aW9ucz0wLjkyXSAtIFRoZSBpbWFnZSBxdWFsaXR5LCBiZXR3ZWVuIDAgYW5kIDEuIFVzZWQgZm9yIGltYWdlIGZvcm1hdHMgd2l0aCBsb3NzeSBjb21wcmVzc2lvbiwgc3VjaCBhcyBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlci5cclxuICAgICAqL1xyXG4gICAgc25hcHNob3RBcmVhOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIHR5cGUsIGVuY29kZXJPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc25hcHNob3RTdGF0ZTtcclxuXHJcbiAgICAgICAgc3RhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICBzdGF0ZS50eXBlID0gdHlwZTtcclxuICAgICAgICBzdGF0ZS5lbmNvZGVyID0gZW5jb2Rlck9wdGlvbnM7XHJcbiAgICAgICAgc3RhdGUuZ2V0UGl4ZWwgPSBmYWxzZTtcclxuICAgICAgICBzdGF0ZS54ID0geDtcclxuICAgICAgICBzdGF0ZS55ID0geTtcclxuICAgICAgICBzdGF0ZS53aWR0aCA9IE1hdGgubWluKHdpZHRoLCB0aGlzLmdhbWVDYW52YXMud2lkdGgpO1xyXG4gICAgICAgIHN0YXRlLmhlaWdodCA9IE1hdGgubWluKGhlaWdodCwgdGhpcy5nYW1lQ2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBhIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBwaXhlbCBmcm9tIHRoZSBnYW1lIHZpZXdwb3J0IHRvIGJlIHRha2VuIGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lIGlzIHJlbmRlcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBjYXB0dXJlIHRoZSB3aG9sZSBnYW1lIHZpZXdwb3J0IHNlZSB0aGUgYHNuYXBzaG90YCBtZXRob2QuIFRvIGNhcHR1cmUgYSBzcGVjaWZpYyBhcmVhLCBzZWUgYHNuYXBzaG90QXJlYWAuXHJcbiAgICAgKiBcclxuICAgICAqIE9ubHkgb25lIHNuYXBzaG90IGNhbiBiZSBhY3RpdmUgX3BlciBmcmFtZV8uIElmIHlvdSBoYXZlIGFscmVhZHkgY2FsbGVkIGBzbmFwc2hvdEFyZWFgLCBmb3IgZXhhbXBsZSwgdGhlblxyXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIG92ZXJyaWRlIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBVbmxpa2UgdGhlIG90aGVyIHR3byBzbmFwc2hvdCBtZXRob2RzLCB0aGlzIG9uZSB3aWxsIHJldHVybiBhIGBDb2xvcmAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGRhdGEgZm9yXHJcbiAgICAgKiB0aGUgcmVxdWVzdGVkIHBpeGVsLiBJdCBkb2Vzbid0IG5lZWQgdG8gY3JlYXRlIGFuIGludGVybmFsIENhbnZhcyBvciBJbWFnZSBvYmplY3QsIHNvIGlzIGEgbG90IGZhc3RlciB0byBleGVjdXRlLFxyXG4gICAgICogdXNpbmcgbGVzcyBtZW1vcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI3NuYXBzaG90UGl4ZWxcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbCB0byBnZXQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbCB0byBnZXQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5SZW5kZXJlci5TbmFwc2hvdC5TbmFwc2hvdENhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBGdW5jdGlvbiB0byBpbnZva2UgYWZ0ZXIgdGhlIHNuYXBzaG90IHBpeGVsIGRhdGEgaXMgZXh0cmFjdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgKi9cclxuICAgIHNuYXBzaG90UGl4ZWw6IGZ1bmN0aW9uICh4LCB5LCBjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNuYXBzaG90QXJlYSh4LCB5LCAxLCAxLCBjYWxsYmFjayk7XHJcblxyXG4gICAgICAgIHRoaXMuc25hcHNob3RTdGF0ZS5nZXRQaXhlbCA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgU3ByaXRlIEdhbWUgT2JqZWN0LCBvciBhbnkgb2JqZWN0IHRoYXQgZXh0ZW5kcyBpdCwgYW5kIGRyYXdzIGl0IHRvIHRoZSBjdXJyZW50IGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2JhdGNoU3ByaXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gc3ByaXRlIC0gVGhlIHRleHR1cmUgYmFzZWQgR2FtZSBPYmplY3QgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBmcmFtZSAtIFRoZSBmcmFtZSB0byBkcmF3LCBkb2Vzbid0IGhhdmUgdG8gYmUgdGhhdCBvd25lZCBieSB0aGUgR2FtZSBPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIHVzZSBmb3IgdGhlIHJlbmRlcmluZyB0cmFuc2Zvcm0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gW3BhcmVudFRyYW5zZm9ybU1hdHJpeF0gLSBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciwgaWYgc2V0LlxyXG4gICAgICovXHJcbiAgICBiYXRjaFNwcml0ZTogZnVuY3Rpb24gKHNwcml0ZSwgZnJhbWUsIGNhbWVyYSwgcGFyZW50VHJhbnNmb3JtTWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhbHBoYSA9IGNhbWVyYS5hbHBoYSAqIHNwcml0ZS5hbHBoYTtcclxuXHJcbiAgICAgICAgaWYgKGFscGhhID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE5vdGhpbmcgdG8gc2VlLCBzbyBhYm9ydCBlYXJseVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgdmFyIGN0eCA9IHRoaXMuY3VycmVudENvbnRleHQ7XHJcblxyXG4gICAgICAgIHZhciBjYW1NYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MTtcclxuICAgICAgICB2YXIgc3ByaXRlTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDI7XHJcbiAgICAgICAgdmFyIGNhbGNNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICAgICAgdmFyIGNkID0gZnJhbWUuY2FudmFzRGF0YTtcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lWCA9IGNkLng7XHJcbiAgICAgICAgdmFyIGZyYW1lWSA9IGNkLnk7XHJcbiAgICAgICAgdmFyIGZyYW1lV2lkdGggPSBmcmFtZS5jdXRXaWR0aDtcclxuICAgICAgICB2YXIgZnJhbWVIZWlnaHQgPSBmcmFtZS5jdXRIZWlnaHQ7XHJcbiAgICAgICAgdmFyIGN1c3RvbVBpdm90ID0gZnJhbWUuY3VzdG9tUGl2b3Q7XHJcblxyXG4gICAgICAgIHZhciByZXMgPSBmcmFtZS5zb3VyY2UucmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgdmFyIGRpc3BsYXlPcmlnaW5YID0gc3ByaXRlLmRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciBkaXNwbGF5T3JpZ2luWSA9IHNwcml0ZS5kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIHggPSAtZGlzcGxheU9yaWdpblggKyBmcmFtZS54O1xyXG4gICAgICAgIHZhciB5ID0gLWRpc3BsYXlPcmlnaW5ZICsgZnJhbWUueTtcclxuXHJcbiAgICAgICAgaWYgKHNwcml0ZS5pc0Nyb3BwZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3JvcCA9IHNwcml0ZS5fY3JvcDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjcm9wLmZsaXBYICE9PSBzcHJpdGUuZmxpcFggfHwgY3JvcC5mbGlwWSAhPT0gc3ByaXRlLmZsaXBZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcmFtZS51cGRhdGVDcm9wVVZzKGNyb3AsIHNwcml0ZS5mbGlwWCwgc3ByaXRlLmZsaXBZKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnJhbWVXaWR0aCA9IGNyb3AuY3c7XHJcbiAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gY3JvcC5jaDtcclxuICAgIFxyXG4gICAgICAgICAgICBmcmFtZVggPSBjcm9wLmN4O1xyXG4gICAgICAgICAgICBmcmFtZVkgPSBjcm9wLmN5O1xyXG5cclxuICAgICAgICAgICAgeCA9IC1kaXNwbGF5T3JpZ2luWCArIGNyb3AueDtcclxuICAgICAgICAgICAgeSA9IC1kaXNwbGF5T3JpZ2luWSArIGNyb3AueTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzcHJpdGUuZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh4ID49IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgeCA9IC0oeCArIGZyYW1lV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA8IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgeCA9IChNYXRoLmFicyh4KSAtIGZyYW1lV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChzcHJpdGUuZmxpcFkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh5ID49IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgeSA9IC0oeSArIGZyYW1lSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgPCAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHkgPSAoTWF0aC5hYnMoeSkgLSBmcmFtZUhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmbGlwWCA9IDE7XHJcbiAgICAgICAgdmFyIGZsaXBZID0gMTtcclxuXHJcbiAgICAgICAgaWYgKHNwcml0ZS5mbGlwWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghY3VzdG9tUGl2b3QpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHggKz0gKC1mcmFtZS5yZWFsV2lkdGggKyAoZGlzcGxheU9yaWdpblggKiAyKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZsaXBYID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQXV0by1pbnZlcnQgdGhlIGZsaXBZIGlmIHRoaXMgaXMgY29taW5nIGZyb20gYSBHTFRleHR1cmVcclxuICAgICAgICBpZiAoc3ByaXRlLmZsaXBZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFjdXN0b21QaXZvdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeSArPSAoLWZyYW1lLnJlYWxIZWlnaHQgKyAoZGlzcGxheU9yaWdpblkgKiAyKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZsaXBZID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzcHJpdGVNYXRyaXguYXBwbHlJVFJTKHNwcml0ZS54LCBzcHJpdGUueSwgc3ByaXRlLnJvdGF0aW9uLCBzcHJpdGUuc2NhbGVYICogZmxpcFgsIHNwcml0ZS5zY2FsZVkgKiBmbGlwWSk7XHJcblxyXG4gICAgICAgIGNhbU1hdHJpeC5jb3B5RnJvbShjYW1lcmEubWF0cml4KTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmVudFRyYW5zZm9ybU1hdHJpeClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50VHJhbnNmb3JtTWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcHJpdGUuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3ByaXRlLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcHJpdGUueDtcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmYgPSBzcHJpdGUueTtcclxuXHJcbiAgICAgICAgICAgIC8vICBNdWx0aXBseSBieSB0aGUgU3ByaXRlIG1hdHJpeCwgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KHNwcml0ZU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNwcml0ZU1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3ByaXRlLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgICAgIHNwcml0ZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc3ByaXRlLnNjcm9sbEZhY3Rvclk7XHJcbiAgICBcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkoc3ByaXRlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eC5zYXZlKCk7XHJcbiAgICAgICBcclxuICAgICAgICBjYWxjTWF0cml4LnNldFRvQ29udGV4dChjdHgpO1xyXG5cclxuICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdGhpcy5ibGVuZE1vZGVzW3Nwcml0ZS5ibGVuZE1vZGVdO1xyXG5cclxuICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBhbHBoYTtcclxuXHJcbiAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICEoIXRoaXMuYW50aWFsaWFzIHx8IGZyYW1lLnNvdXJjZS5zY2FsZU1vZGUpO1xyXG5cclxuICAgICAgICBjdHguZHJhd0ltYWdlKGZyYW1lLnNvdXJjZS5pbWFnZSwgZnJhbWVYLCBmcmFtZVksIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LCB4LCB5LCBmcmFtZVdpZHRoIC8gcmVzLCBmcmFtZUhlaWdodCAvIHJlcyk7XHJcblxyXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgYWxsIG9iamVjdCByZWZlcmVuY2VzIGluIHRoZSBDYW52YXMgUmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2FtZUNhbnZhcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5nYW1lQ29udGV4dCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlJlbmRlcmVyLkNhbnZhc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIENhbnZhc1JlbmRlcmVyOiByZXF1aXJlKCcuL0NhbnZhc1JlbmRlcmVyJyksXHJcbiAgICBHZXRCbGVuZE1vZGVzOiByZXF1aXJlKCcuL3V0aWxzL0dldEJsZW5kTW9kZXMnKSxcclxuICAgIFNldFRyYW5zZm9ybTogcmVxdWlyZSgnLi91dGlscy9TZXRUcmFuc2Zvcm0nKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgbW9kZXMgPSByZXF1aXJlKCcuLi8uLi9CbGVuZE1vZGVzJyk7XHJcbnZhciBDYW52YXNGZWF0dXJlcyA9IHJlcXVpcmUoJy4uLy4uLy4uL2RldmljZS9DYW52YXNGZWF0dXJlcycpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgd2hpY2ggbWFwcyB0aGUgZGVmYXVsdCBibGVuZCBtb2RlcyB0byBzdXBwb3J0ZWQgQ2FudmFzIGJsZW5kIG1vZGVzLlxyXG4gKlxyXG4gKiBJZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgYSBibGVuZCBtb2RlLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIG5vcm1hbCBgc291cmNlLW92ZXJgIGJsZW5kIG1vZGUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkdldEJsZW5kTW9kZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBXaGljaCBDYW52YXMgYmxlbmQgbW9kZSBjb3JyZXNwb25kcyB0byB3aGljaCBkZWZhdWx0IFBoYXNlciBibGVuZCBtb2RlLlxyXG4gKi9cclxudmFyIEdldEJsZW5kTW9kZXMgPSBmdW5jdGlvbiAoKVxyXG57XHJcbiAgICB2YXIgb3V0cHV0ID0gW107XHJcbiAgICB2YXIgdXNlTmV3ID0gQ2FudmFzRmVhdHVyZXMuc3VwcG9ydE5ld0JsZW5kTW9kZXM7XHJcbiAgICB2YXIgc28gPSAnc291cmNlLW92ZXInO1xyXG5cclxuICAgIG91dHB1dFttb2Rlcy5OT1JNQUxdID0gc287XHJcbiAgICBvdXRwdXRbbW9kZXMuQUREXSA9ICdsaWdodGVyJztcclxuICAgIG91dHB1dFttb2Rlcy5NVUxUSVBMWV0gPSAodXNlTmV3KSA/ICdtdWx0aXBseScgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5TQ1JFRU5dID0gKHVzZU5ldykgPyAnc2NyZWVuJyA6IHNvO1xyXG4gICAgb3V0cHV0W21vZGVzLk9WRVJMQVldID0gKHVzZU5ldykgPyAnb3ZlcmxheScgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5EQVJLRU5dID0gKHVzZU5ldykgPyAnZGFya2VuJyA6IHNvO1xyXG4gICAgb3V0cHV0W21vZGVzLkxJR0hURU5dID0gKHVzZU5ldykgPyAnbGlnaHRlbicgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5DT0xPUl9ET0RHRV0gPSAodXNlTmV3KSA/ICdjb2xvci1kb2RnZScgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5DT0xPUl9CVVJOXSA9ICh1c2VOZXcpID8gJ2NvbG9yLWJ1cm4nIDogc287XHJcbiAgICBvdXRwdXRbbW9kZXMuSEFSRF9MSUdIVF0gPSAodXNlTmV3KSA/ICdoYXJkLWxpZ2h0JyA6IHNvO1xyXG4gICAgb3V0cHV0W21vZGVzLlNPRlRfTElHSFRdID0gKHVzZU5ldykgPyAnc29mdC1saWdodCcgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5ESUZGRVJFTkNFXSA9ICh1c2VOZXcpID8gJ2RpZmZlcmVuY2UnIDogc287XHJcbiAgICBvdXRwdXRbbW9kZXMuRVhDTFVTSU9OXSA9ICh1c2VOZXcpID8gJ2V4Y2x1c2lvbicgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5IVUVdID0gKHVzZU5ldykgPyAnaHVlJyA6IHNvO1xyXG4gICAgb3V0cHV0W21vZGVzLlNBVFVSQVRJT05dID0gKHVzZU5ldykgPyAnc2F0dXJhdGlvbicgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5DT0xPUl0gPSAodXNlTmV3KSA/ICdjb2xvcicgOiBzbztcclxuICAgIG91dHB1dFttb2Rlcy5MVU1JTk9TSVRZXSA9ICh1c2VOZXcpID8gJ2x1bWlub3NpdHknIDogc287XHJcbiAgICBvdXRwdXRbbW9kZXMuRVJBU0VdID0gJ2Rlc3RpbmF0aW9uLW91dCc7XHJcbiAgICBvdXRwdXRbbW9kZXMuU09VUkNFX0lOXSA9ICdzb3VyY2UtaW4nO1xyXG4gICAgb3V0cHV0W21vZGVzLlNPVVJDRV9PVVRdID0gJ3NvdXJjZS1vdXQnO1xyXG4gICAgb3V0cHV0W21vZGVzLlNPVVJDRV9BVE9QXSA9ICdzb3VyY2UtYXRvcCc7XHJcbiAgICBvdXRwdXRbbW9kZXMuREVTVElOQVRJT05fT1ZFUl0gPSAnZGVzdGluYXRpb24tb3Zlcic7XHJcbiAgICBvdXRwdXRbbW9kZXMuREVTVElOQVRJT05fSU5dID0gJ2Rlc3RpbmF0aW9uLWluJztcclxuICAgIG91dHB1dFttb2Rlcy5ERVNUSU5BVElPTl9PVVRdID0gJ2Rlc3RpbmF0aW9uLW91dCc7XHJcbiAgICBvdXRwdXRbbW9kZXMuREVTVElOQVRJT05fQVRPUF0gPSAnZGVzdGluYXRpb24tYXRvcCc7XHJcbiAgICBvdXRwdXRbbW9kZXMuTElHSFRFUl0gPSAnbGlnaHRlcic7XHJcbiAgICBvdXRwdXRbbW9kZXMuQ09QWV0gPSAnY29weSc7XHJcbiAgICBvdXRwdXRbbW9kZXMuWE9SXSA9ICd4b3InO1xyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldEJsZW5kTW9kZXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGEgcmVmZXJlbmNlIHRvIHRoZSBDYW52YXMgUmVuZGVyZXIsIGEgQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0LCBhIEdhbWUgT2JqZWN0LCBhIENhbWVyYSBhbmQgYSBwYXJlbnQgbWF0cml4XHJcbiAqIGFuZCB0aGVuIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XHJcbiAqIFxyXG4gKiAxLiBDaGVja3MgdGhlIGFscGhhIG9mIHRoZSBzb3VyY2UgY29tYmluZWQgd2l0aCB0aGUgQ2FtZXJhIGFscGhhLiBJZiAwIG9yIGxlc3MgaXQgYWJvcnRzLlxyXG4gKiAyLiBUYWtlcyB0aGUgQ2FtZXJhIGFuZCBHYW1lIE9iamVjdCBtYXRyaXggYW5kIG11bHRpcGxpZXMgdGhlbSwgY29tYmluZWQgd2l0aCB0aGUgcGFyZW50IG1hdHJpeCBpZiBnaXZlbi5cclxuICogMy4gU2V0cyB0aGUgYmxlbmQgbW9kZSBvZiB0aGUgY29udGV4dCB0byBiZSB0aGF0IHVzZWQgYnkgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKiA0LiBTZXRzIHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29udGV4dCB0byBiZSB0aGF0IHVzZWQgYnkgdGhlIEdhbWUgT2JqZWN0IGNvbWJpbmVkIHdpdGggdGhlIENhbWVyYS5cclxuICogNS4gU2F2ZXMgdGhlIGNvbnRleHQgc3RhdGUuXHJcbiAqIDYuIFNldHMgdGhlIGZpbmFsIG1hdHJpeCB2YWx1ZXMgaW50byB0aGUgY29udGV4dCB2aWEgc2V0VHJhbnNmb3JtLlxyXG4gKiA3LiBJZiBSZW5kZXJlci5hbnRpYWxpYXMsIG9yIHRoZSBmcmFtZS5zb3VyY2Uuc2NhbGVNb2RlIGlzIHNldCwgdGhlbiBpbWFnZVNtb290aGluZ0VuYWJsZWQgaXMgc2V0LlxyXG4gKiBcclxuICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW50IHRvIGJlIHVzZWQgaW50ZXJuYWxseS4gTW9zdCBvZiB0aGUgQ2FudmFzIFJlbmRlcmVyIGNsYXNzZXMgdXNlIGl0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5TZXRUcmFuc2Zvcm1cclxuICogQHNpbmNlIDMuMTIuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIENhbnZhcyByZW5kZXJlci5cclxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCAtIFRoZSBjYW52YXMgY29udGV4dCB0byBzZXQgdGhlIHRyYW5zZm9ybSBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkLiBDYW4gYmUgYW55IHR5cGUgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGNsYXNzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IFtwYXJlbnRNYXRyaXhdIC0gQSBwYXJlbnQgdHJhbnNmb3JtIG1hdHJpeCB0byBhcHBseSB0byB0aGUgR2FtZSBPYmplY3QgYmVmb3JlIHJlbmRlcmluZy5cclxuICogXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgR2FtZSBPYmplY3QgY29udGV4dCB3YXMgc2V0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbnZhciBTZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAocmVuZGVyZXIsIGN0eCwgc3JjLCBjYW1lcmEsIHBhcmVudE1hdHJpeClcclxue1xyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmIChhbHBoYSA8PSAwKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIHNlZSwgc28gZG9uJ3Qgd2FzdGUgdGltZSBjYWxjdWxhdGluZyBzdHVmZlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgxLmNvcHlGcm9tQXJyYXkoY2FtZXJhLm1hdHJpeC5tYXRyaXgpO1xyXG4gICAgdmFyIGdhbWVPYmplY3RNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDIuYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHlXaXRoT2Zmc2V0KHBhcmVudE1hdHJpeCwgLWNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZKTtcclxuXHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBnYW1lT2JqZWN0TWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBnYW1lT2JqZWN0TWF0cml4LmYgPSBzcmMueTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShnYW1lT2JqZWN0TWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBnYW1lT2JqZWN0TWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICBnYW1lT2JqZWN0TWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShnYW1lT2JqZWN0TWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgQmxlbmQgTW9kZVxyXG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IHJlbmRlcmVyLmJsZW5kTW9kZXNbc3JjLmJsZW5kTW9kZV07XHJcblxyXG4gICAgLy8gIEFscGhhXHJcbiAgICBjdHguZ2xvYmFsQWxwaGEgPSBhbHBoYTtcclxuXHJcbiAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgIGNhbGNNYXRyaXguc2V0VG9Db250ZXh0KGN0eCk7XHJcblxyXG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9ICEoIXJlbmRlcmVyLmFudGlhbGlhcyB8fCAoc3JjLmZyYW1lICYmIHNyYy5mcmFtZS5zb3VyY2Uuc2NhbGVNb2RlKSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFRyYW5zZm9ybTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUmVuZGVyZXJcclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuVHlwZXMuUmVuZGVyZXJcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDYW52YXM6IHJlcXVpcmUoJy4vY2FudmFzJyksXHJcbiAgICBTbmFwc2hvdDogcmVxdWlyZSgnLi9zbmFwc2hvdCcpLFxyXG4gICAgV2ViR0w6IHJlcXVpcmUoJy4vd2ViZ2wnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uLy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxudmFyIENvbG9yID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jb2xvci9Db2xvcicpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGEgc25hcHNob3Qgb2YgYW4gYXJlYSBmcm9tIHRoZSBjdXJyZW50IGZyYW1lIGRpc3BsYXllZCBieSBhIGNhbnZhcy5cclxuICogXHJcbiAqIFRoaXMgaXMgdGhlbiBjb3BpZWQgdG8gYW4gSW1hZ2Ugb2JqZWN0LiBXaGVuIHRoaXMgbG9hZHMsIHRoZSByZXN1bHRzIGFyZSBzZW50XHJcbiAqIHRvIHRoZSBjYWxsYmFjayBwcm92aWRlZCBpbiB0aGUgU25hcHNob3QgQ29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuUmVuZGVyZXIuU25hcHNob3QuQ2FudmFzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBzb3VyY2VDYW52YXMgLSBUaGUgY2FudmFzIHRvIHRha2UgYSBzbmFwc2hvdCBvZi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RTdGF0ZX0gY29uZmlnIC0gVGhlIHNuYXBzaG90IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxudmFyIENhbnZhc1NuYXBzaG90ID0gZnVuY3Rpb24gKGNhbnZhcywgY29uZmlnKVxyXG57XHJcbiAgICB2YXIgY2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY2FsbGJhY2snKTtcclxuICAgIHZhciB0eXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3R5cGUnLCAnaW1hZ2UvcG5nJyk7XHJcbiAgICB2YXIgZW5jb2Rlck9wdGlvbnMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZW5jb2RlcicsIDAuOTIpO1xyXG4gICAgdmFyIHggPSBNYXRoLmFicyhNYXRoLnJvdW5kKEdldEZhc3RWYWx1ZShjb25maWcsICd4JywgMCkpKTtcclxuICAgIHZhciB5ID0gTWF0aC5hYnMoTWF0aC5yb3VuZChHZXRGYXN0VmFsdWUoY29uZmlnLCAneScsIDApKSk7XHJcbiAgICB2YXIgd2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnd2lkdGgnLCBjYW52YXMud2lkdGgpO1xyXG4gICAgdmFyIGhlaWdodCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdoZWlnaHQnLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgIHZhciBnZXRQaXhlbCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdnZXRQaXhlbCcsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoZ2V0UGl4ZWwpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICB2YXIgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoeCwgeSwgMSwgMSk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBpbWFnZURhdGEuZGF0YTtcclxuXHJcbiAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBuZXcgQ29sb3IoZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSAvIDI1NSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoeCAhPT0gMCB8fCB5ICE9PSAwIHx8IHdpZHRoICE9PSBjYW52YXMud2lkdGggfHwgaGVpZ2h0ICE9PSBjYW52YXMuaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBBcmVhIEdyYWJcclxuICAgICAgICB2YXIgY29weUNhbnZhcyA9IENhbnZhc1Bvb2wuY3JlYXRlV2ViR0wodGhpcywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgdmFyIGN0eCA9IGNvcHlDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgY3R4LmRyYXdJbWFnZShjYW52YXMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB2YXIgaW1hZ2UxID0gbmV3IEltYWdlKCk7XHJcbiAgICBcclxuICAgICAgICBpbWFnZTEub25lcnJvciA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUoY29weUNhbnZhcyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW1hZ2UxLm9ubG9hZCA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGltYWdlMSk7XHJcblxyXG4gICAgICAgICAgICBDYW52YXNQb29sLnJlbW92ZShjb3B5Q2FudmFzKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpbWFnZTEuc3JjID0gY29weUNhbnZhcy50b0RhdGFVUkwodHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIC8vICBGdWxsIEdyYWJcclxuICAgICAgICB2YXIgaW1hZ2UyID0gbmV3IEltYWdlKCk7XHJcbiAgICBcclxuICAgICAgICBpbWFnZTIub25lcnJvciA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGltYWdlMi5vbmxvYWQgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChudWxsLCBpbWFnZTIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGltYWdlMi5zcmMgPSBjYW52YXMudG9EYXRhVVJMKHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzU25hcHNob3Q7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENhbnZhc1Bvb2wgPSByZXF1aXJlKCcuLi8uLi9kaXNwbGF5L2NhbnZhcy9DYW52YXNQb29sJyk7XHJcbnZhciBDb2xvciA9IHJlcXVpcmUoJy4uLy4uL2Rpc3BsYXkvY29sb3IvQ29sb3InKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBUYWtlcyBhIHNuYXBzaG90IG9mIGFuIGFyZWEgZnJvbSB0aGUgY3VycmVudCBmcmFtZSBkaXNwbGF5ZWQgYnkgYSBXZWJHTCBjYW52YXMuXHJcbiAqIFxyXG4gKiBUaGlzIGlzIHRoZW4gY29waWVkIHRvIGFuIEltYWdlIG9iamVjdC4gV2hlbiB0aGlzIGxvYWRzLCB0aGUgcmVzdWx0cyBhcmUgc2VudFxyXG4gKiB0byB0aGUgY2FsbGJhY2sgcHJvdmlkZWQgaW4gdGhlIFNuYXBzaG90IENvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlJlbmRlcmVyLlNuYXBzaG90LldlYkdMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBzb3VyY2VDYW52YXMgLSBUaGUgY2FudmFzIHRvIHRha2UgYSBzbmFwc2hvdCBvZi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RTdGF0ZX0gY29uZmlnIC0gVGhlIHNuYXBzaG90IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxudmFyIFdlYkdMU25hcHNob3QgPSBmdW5jdGlvbiAoc291cmNlQ2FudmFzLCBjb25maWcpXHJcbntcclxuICAgIHZhciBnbCA9IHNvdXJjZUNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcclxuXHJcbiAgICB2YXIgY2FsbGJhY2sgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY2FsbGJhY2snKTtcclxuICAgIHZhciB0eXBlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3R5cGUnLCAnaW1hZ2UvcG5nJyk7XHJcbiAgICB2YXIgZW5jb2Rlck9wdGlvbnMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZW5jb2RlcicsIDAuOTIpO1xyXG4gICAgdmFyIHggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneCcsIDApO1xyXG4gICAgdmFyIHkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneScsIDApO1xyXG5cclxuICAgIHZhciBnZXRQaXhlbCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdnZXRQaXhlbCcsIGZhbHNlKTtcclxuXHJcbiAgICB2YXIgaXNGcmFtZWJ1ZmZlciA9IEdldEZhc3RWYWx1ZShjb25maWcsICdpc0ZyYW1lYnVmZmVyJywgZmFsc2UpO1xyXG5cclxuICAgIHZhciBidWZmZXJXaWR0aCA9IChpc0ZyYW1lYnVmZmVyKSA/IEdldEZhc3RWYWx1ZShjb25maWcsICdidWZmZXJXaWR0aCcsIDEpIDogZ2wuZHJhd2luZ0J1ZmZlcldpZHRoO1xyXG4gICAgdmFyIGJ1ZmZlckhlaWdodCA9IChpc0ZyYW1lYnVmZmVyKSA/IEdldEZhc3RWYWx1ZShjb25maWcsICdidWZmZXJIZWlnaHQnLCAxKSA6IGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQ7XHJcblxyXG4gICAgaWYgKGdldFBpeGVsKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwaXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xyXG5cclxuICAgICAgICB2YXIgZGVzdFkgPSAoaXNGcmFtZWJ1ZmZlcikgPyB5IDogYnVmZmVySGVpZ2h0IC0geTtcclxuXHJcbiAgICAgICAgZ2wucmVhZFBpeGVscyh4LCBkZXN0WSwgMSwgMSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgcGl4ZWwpO1xyXG5cclxuICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIG5ldyBDb2xvcihwaXhlbFswXSwgcGl4ZWxbMV0sIHBpeGVsWzJdLCBwaXhlbFszXSAvIDI1NSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3aWR0aCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd3aWR0aCcsIGJ1ZmZlcldpZHRoKTtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2hlaWdodCcsIGJ1ZmZlckhlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogNDtcclxuXHJcbiAgICAgICAgdmFyIHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHRvdGFsKTtcclxuXHJcbiAgICAgICAgZ2wucmVhZFBpeGVscyh4LCBidWZmZXJIZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBwaXhlbHMpO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGNhbnZhcyA9IENhbnZhc1Bvb2wuY3JlYXRlV2ViR0wodGhpcywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICB2YXIgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIFxyXG4gICAgICAgIHZhciBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XHJcblxyXG4gICAgICAgIGZvciAodmFyIHB5ID0gMDsgcHkgPCBoZWlnaHQ7IHB5KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBweCA9IDA7IHB4IDwgd2lkdGg7IHB4KyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBzb3VyY2VJbmRleCA9ICgoaGVpZ2h0IC0gcHkpICogd2lkdGggKyBweCkgKiA0O1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlc3RJbmRleCA9IChpc0ZyYW1lYnVmZmVyKSA/IHRvdGFsIC0gKChweSAqIHdpZHRoICsgKHdpZHRoIC0gcHgpKSAqIDQpIDogKHB5ICogd2lkdGggKyBweCkgKiA0O1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGFbZGVzdEluZGV4ICsgMF0gPSBwaXhlbHNbc291cmNlSW5kZXggKyAwXTtcclxuICAgICAgICAgICAgICAgIGRhdGFbZGVzdEluZGV4ICsgMV0gPSBwaXhlbHNbc291cmNlSW5kZXggKyAxXTtcclxuICAgICAgICAgICAgICAgIGRhdGFbZGVzdEluZGV4ICsgMl0gPSBwaXhlbHNbc291cmNlSW5kZXggKyAyXTtcclxuICAgICAgICAgICAgICAgIGRhdGFbZGVzdEluZGV4ICsgM10gPSBwaXhlbHNbc291cmNlSW5kZXggKyAzXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChudWxsKTtcclxuXHJcbiAgICAgICAgICAgIENhbnZhc1Bvb2wucmVtb3ZlKGNhbnZhcyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwobnVsbCwgaW1hZ2UpO1xyXG5cclxuICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUoY2FudmFzKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpbWFnZS5zcmMgPSBjYW52YXMudG9EYXRhVVJMKHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2ViR0xTbmFwc2hvdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUmVuZGVyZXIuU25hcHNob3RcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDYW52YXM6IHJlcXVpcmUoJy4vQ2FudmFzU25hcHNob3QnKSxcclxuICAgIFdlYkdMOiByZXF1aXJlKCcuL1dlYkdMU25hcHNob3QnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmVsaXBlIEFsZm9uc28gPEBiaXRuZW5mZXI+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuVXRpbHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhY2tzIGZvdXIgZmxvYXRzIG9uIGEgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wIGludG8gYSBzaW5nbGUgVWludDMyXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIFBoYXNlci5SZW5kZXJlci5XZWJHTC5VdGlscy5nZXRUaW50RnJvbUZsb2F0c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByIC0gUmVkIGNvbXBvbmVudCBpbiBhIHJhbmdlIGZyb20gMC4wIHRvIDEuMCBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gR3JlZW4gY29tcG9uZW50IGluIGEgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYiAtIEJsdWUgY29tcG9uZW50IGluIGEgcmFuZ2UgZnJvbSAwLjAgdG8gMS4wXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYSAtIEFscGhhIGNvbXBvbmVudCBpbiBhIHJhbmdlIGZyb20gMC4wIHRvIDEuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYWNrZWQgUkdCQSB2YWx1ZXMgYXMgYSBVaW50MzIuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbnRGcm9tRmxvYXRzOiBmdW5jdGlvbiAociwgZywgYiwgYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdXIgPSAoKHIgKiAyNTUuMCl8MCkgJiAweEZGO1xyXG4gICAgICAgIHZhciB1ZyA9ICgoZyAqIDI1NS4wKXwwKSAmIDB4RkY7XHJcbiAgICAgICAgdmFyIHViID0gKChiICogMjU1LjApfDApICYgMHhGRjtcclxuICAgICAgICB2YXIgdWEgPSAoKGEgKiAyNTUuMCl8MCkgJiAweEZGO1xyXG5cclxuICAgICAgICByZXR1cm4gKCh1YSA8PCAyNCkgfCAodXIgPDwgMTYpIHwgKHVnIDw8IDgpIHwgdWIpID4+PiAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhY2tzIGEgVWludDI0LCByZXByZXNlbnRpbmcgUkdCIGNvbXBvbmVudHMsIHdpdGggYSBGbG9hdDMyLCByZXByZXNlbnRpbmdcclxuICAgICAqIHRoZSBhbHBoYSBjb21wb25lbnQsIHdpdGggYSByYW5nZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIGFuZCByZXR1cm4gYSBVaW50MzJcclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLlJlbmRlcmVyLldlYkdMLlV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJnYiAtIFVpbnQyNCByZXByZXNlbnRpbmcgUkdCIGNvbXBvbmVudHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gRmxvYXQzMiByZXByZXNlbnRpbmcgQWxwaGEgY29tcG9uZW50XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gUGFja2VkIFJHQkEgYXMgVWludDMyXHJcbiAgICAgKi9cclxuICAgIGdldFRpbnRBcHBlbmRGbG9hdEFscGhhOiBmdW5jdGlvbiAocmdiLCBhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB1YSA9ICgoYSAqIDI1NS4wKXwwKSAmIDB4RkY7XHJcbiAgICAgICAgcmV0dXJuICgodWEgPDwgMjQpIHwgcmdiKSA+Pj4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYWNrcyBhIFVpbnQyNCwgcmVwcmVzZW50aW5nIFJHQiBjb21wb25lbnRzLCB3aXRoIGEgRmxvYXQzMiwgcmVwcmVzZW50aW5nXHJcbiAgICAgKiB0aGUgYWxwaGEgY29tcG9uZW50LCB3aXRoIGEgcmFuZ2UgYmV0d2VlbiAwLjAgYW5kIDEuMCBhbmQgcmV0dXJuIGEgXHJcbiAgICAgKiBzd2l6emxlZCBVaW50MzJcclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLlJlbmRlcmVyLldlYkdMLlV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZ2IgLSBVaW50MjQgcmVwcmVzZW50aW5nIFJHQiBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYSAtIEZsb2F0MzIgcmVwcmVzZW50aW5nIEFscGhhIGNvbXBvbmVudFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFBhY2tlZCBSR0JBIGFzIFVpbnQzMlxyXG4gICAgICovXHJcbiAgICBnZXRUaW50QXBwZW5kRmxvYXRBbHBoYUFuZFN3YXA6IGZ1bmN0aW9uIChyZ2IsIGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVyID0gKChyZ2IgPj4gMTYpfDApICYgMHhmZjtcclxuICAgICAgICB2YXIgdWcgPSAoKHJnYiA+PiA4KXwwKSAmIDB4ZmY7XHJcbiAgICAgICAgdmFyIHViID0gKHJnYnwwKSAmIDB4ZmY7XHJcbiAgICAgICAgdmFyIHVhID0gKChhICogMjU1LjApfDApICYgMHhGRjtcclxuXHJcbiAgICAgICAgcmV0dXJuICgodWEgPDwgMjQpIHwgKHViIDw8IDE2KSB8ICh1ZyA8PCA4KSB8IHVyKSA+Pj4gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVbnBhY2tzIGEgVWludDI0IFJHQiBpbnRvIGFuIGFycmF5IG9mIGZsb2F0cyBvZiByYW5nZXMgb2YgMC4wIGFuZCAxLjBcclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gUGhhc2VyLlJlbmRlcmVyLldlYkdMLlV0aWxzLmdldEZsb2F0c0Zyb21VaW50UkdCXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJnYiAtIFJHQiBwYWNrZWQgYXMgYSBVaW50MjRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7YXJyYXl9IEFycmF5IG9mIGZsb2F0cyByZXByZXNlbnRpbmcgZWFjaCBjb21wb25lbnQgYXMgYSBmbG9hdCBcclxuICAgICAqL1xyXG4gICAgZ2V0RmxvYXRzRnJvbVVpbnRSR0I6IGZ1bmN0aW9uIChyZ2IpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVyID0gKChyZ2IgPj4gMTYpfDApICYgMHhmZjtcclxuICAgICAgICB2YXIgdWcgPSAoKHJnYiA+PiA4KXwwKSAmIDB4ZmY7XHJcbiAgICAgICAgdmFyIHViID0gKHJnYnwwKSAmIDB4ZmY7XHJcblxyXG4gICAgICAgIHJldHVybiBbIHVyIC8gMjU1LjAsIHVnIC8gMjU1LjAsIHViIC8gMjU1LjAgXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3VudHMgaG93IG1hbnkgYXR0cmlidXRlcyBvZiAzMiBiaXRzIGEgdmVydGV4IGhhc1xyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuVXRpbHMuZ2V0Q29tcG9uZW50Q291bnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBhdHRyaWJ1dGVzIC0gQXJyYXkgb2YgYXR0cmlidXRlcyBcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbENvbnRleHQgLSBXZWJHTENvbnRleHQgdXNlZCBmb3IgY2hlY2sgdHlwZXNcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBDb3VudCBvZiAzMiBiaXQgYXR0cmlidXRlcyBpbiB2ZXJ0ZXhcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50Q291bnQ6IGZ1bmN0aW9uIChhdHRyaWJ1dGVzLCBnbENvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGF0dHJpYnV0ZXMubGVuZ3RoOyArK2luZGV4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhdHRyaWJ1dGVzW2luZGV4XTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IGdsQ29udGV4dC5GTE9BVClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY291bnQgKz0gZWxlbWVudC5zaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY291bnQgKz0gMTsgLy8gV2UnbGwgZm9yY2UgYW55IG90aGVyIHR5cGUgdG8gYmUgMzIgYml0LiBmb3Igbm93XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi9VdGlscycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogV2ViR0xQaXBlbGluZSBpcyBhIGNsYXNzIHRoYXQgZGVzY3JpYmVzIHRoZSB3YXkgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlcmVkXHJcbiAqIGluIFdlYkdMLCBzcGVjaWFsbHkgZm9jdXNlZCBvbiBiYXRjaGluZyB2ZXJ0aWNlcyAoYmF0Y2hpbmcgaXMgbm90IHByb3ZpZGVkKS5cclxuICogUGlwZWxpbmVzIGFyZSBtb3N0bHkgdXNlZCBmb3IgZGVzY3JpYmluZyAyRCByZW5kZXJpbmcgcGFzc2VzIGJ1dCBpdCdzXHJcbiAqIGZsZXhpYmxlIGVub3VnaCB0byBiZSB1c2VkIGZvciBhbnkgdHlwZSBvZiByZW5kZXJpbmcgaW5jbHVkaW5nIDNELlxyXG4gKiBJbnRlcm5hbGx5IFdlYkdMUGlwZWxpbmUgd2lsbCBoYW5kbGUgdGhpbmdzIGxpa2UgY29tcGlsaW5nIHNoYWRlcnMsXHJcbiAqIGNyZWF0aW5nIHZlcnRleCBidWZmZXJzLCBhc3NpZ25pbmcgcHJpbWl0aXZlIHRvcG9sb2d5IGFuZCBiaW5kaW5nXHJcbiAqIHZlcnRleCBhdHRyaWJ1dGVzLlxyXG4gKlxyXG4gKiBUaGUgY29uZmlnIHByb3BlcnRpZXMgYXJlOlxyXG4gKiAtIGdhbWU6IEN1cnJlbnQgZ2FtZSBpbnN0YW5jZS5cclxuICogLSByZW5kZXJlcjogQ3VycmVudCBXZWJHTCByZW5kZXJlci5cclxuICogLSBnbDogQ3VycmVudCBXZWJHTCBjb250ZXh0LlxyXG4gKiAtIHRvcG9sb2d5OiBUaGlzIGluZGljYXRlcyBob3cgdGhlIHByaW1pdGl2ZXMgYXJlIHJlbmRlcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBHTF9UUklBTkdMRVMuXHJcbiAqICAgICAgICAgICAgICBIZXJlIGlzIHRoZSBmdWxsIGxpc3Qgb2YgcmVuZGVyaW5nIHByaW1pdGl2ZXMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTF9BUEkvQ29uc3RhbnRzKS5cclxuICogLSB2ZXJ0U2hhZGVyOiBTb3VyY2UgZm9yIHZlcnRleCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gZnJhZ1NoYWRlcjogU291cmNlIGZvciBmcmFnbWVudCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gdmVydGV4Q2FwYWNpdHk6IFRoZSBhbW91bnQgb2YgdmVydGljZXMgdGhhdCBzaGFsbCBiZSBhbGxvY2F0ZWRcclxuICogLSB2ZXJ0ZXhTaXplOiBUaGUgc2l6ZSBvZiBhIHNpbmdsZSB2ZXJ0ZXggaW4gYnl0ZXMuXHJcbiAqIC0gdmVydGljZXM6IEFuIG9wdGlvbmFsIGJ1ZmZlciBvZiB2ZXJ0aWNlc1xyXG4gKiAtIGF0dHJpYnV0ZXM6IEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIHZlcnRleCBhdHRyaWJ1dGVzXHJcbiAqXHJcbiAqIFRoZSB2ZXJ0ZXggYXR0cmlidXRlcyBwcm9wZXJ0aWVzIGFyZTpcclxuICogLSBuYW1lIDogU3RyaW5nIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSB2ZXJ0ZXggc2hhZGVyXHJcbiAqIC0gc2l6ZSA6IGludGVnZXIgLSBIb3cgbWFueSBjb21wb25lbnRzIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGUuIEZvciBleDogdmVjMyA9IHNpemUgb2YgMywgZmxvYXQgPSBzaXplIG9mIDFcclxuICogLSB0eXBlIDogR0xlbnVtIC0gV2ViR0wgdHlwZSAoZ2wuQllURSwgZ2wuU0hPUlQsIGdsLlVOU0lHTkVEX0JZVEUsIGdsLlVOU0lHTkVEX1NIT1JULCBnbC5GTE9BVClcclxuICogLSBub3JtYWxpemVkIDogYm9vbGVhbiAtIElzIHRoZSBhdHRyaWJ1dGUgbm9ybWFsaXplZFxyXG4gKiAtIG9mZnNldCA6IGludGVnZXIgLSBUaGUgb2Zmc2V0IGluIGJ5dGVzIHRvIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSBpbiB0aGUgdmVydGV4LiBFcXVpdmFsZW50IHRvIG9mZnNldG9mKHZlcnRleCwgYXR0cmliKSBpbiBDXHJcbiAqIEhlcmUgeW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRvIGRlc2NyaWJlIGFuIGF0dHJpYnV0ZTpcclxuICogLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViR0xSZW5kZXJpbmdDb250ZXh0L3ZlcnRleEF0dHJpYlBvaW50ZXJcclxuICpcclxuICogQGNsYXNzIFdlYkdMUGlwZWxpbmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5SZW5kZXJlci5XZWJHTFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoaXMgV2ViR0wgUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBhYm92ZS5cclxuICovXHJcbnZhciBXZWJHTFBpcGVsaW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFdlYkdMUGlwZWxpbmUgKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBOYW1lIG9mIHRoZSBQaXBlbGluZS4gVXNlZCBmb3IgaWRlbnRpZnlpbmdcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9ICdXZWJHTFBpcGVsaW5lJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEdhbWUgd2hpY2ggb3ducyB0aGlzIFdlYkdMIFBpcGVsaW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBjb25maWcuZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbnZhcyB3aGljaCB0aGlzIFdlYkdMIFBpcGVsaW5lIHJlbmRlcnMgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSN2aWV3XHJcbiAgICAgICAgICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlldyA9IGNvbmZpZy5nYW1lLmNhbnZhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBnYW1lIHJlc29sdXRpb25cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3Jlc29sdXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdpZHRoIG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhlaWdodCBvZiB0aGUgY3VycmVudCB2aWV3cG9ydFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBXZWJHTCBjb250ZXh0IHRoaXMgV2ViR0wgUGlwZWxpbmUgdXNlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI2dsXHJcbiAgICAgICAgICogQHR5cGUge1dlYkdMUmVuZGVyaW5nQ29udGV4dH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsID0gY29uZmlnLmdsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb3cgbWFueSB2ZXJ0aWNlcyBoYXZlIGJlZW4gZmVkIHRvIHRoZSBjdXJyZW50IHBpcGVsaW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjdmVydGV4Q291bnRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnRleENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGxpbWl0IG9mIHZlcnRpY2VzIHRoYXQgdGhlIHBpcGVsaW5lIGNhbiBob2xkXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSN2ZXJ0ZXhDYXBhY2l0eVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4Q2FwYWNpdHkgPSBjb25maWcudmVydGV4Q2FwYWNpdHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBXZWJHTCBSZW5kZXJlciB3aGljaCBvd25zIHRoaXMgV2ViR0wgUGlwZWxpbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNyZW5kZXJlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gY29uZmlnLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSYXcgYnl0ZSBidWZmZXIgb2YgdmVydGljZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSN2ZXJ0ZXhEYXRhXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5QnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4RGF0YSA9IChjb25maWcudmVydGljZXMgPyBjb25maWcudmVydGljZXMgOiBuZXcgQXJyYXlCdWZmZXIoY29uZmlnLnZlcnRleENhcGFjaXR5ICogY29uZmlnLnZlcnRleFNpemUpKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhhbmRsZSB0byBhIFdlYkdMIHZlcnRleCBidWZmZXIgb2JqZWN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjdmVydGV4QnVmZmVyXHJcbiAgICAgICAgICogQHR5cGUge1dlYkdMQnVmZmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4QnVmZmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVWZXJ0ZXhCdWZmZXIoKGNvbmZpZy52ZXJ0aWNlcyA/IGNvbmZpZy52ZXJ0aWNlcyA6IHRoaXMudmVydGV4RGF0YS5ieXRlTGVuZ3RoKSwgdGhpcy5nbC5TVFJFQU1fRFJBVyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoYW5kbGUgdG8gYSBXZWJHTCBwcm9ncmFtXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNwcm9ncmFtXHJcbiAgICAgICAgICogQHR5cGUge1dlYkdMUHJvZ3JhbX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByb2dyYW0gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVByb2dyYW0oY29uZmlnLnZlcnRTaGFkZXIsIGNvbmZpZy5mcmFnU2hhZGVyKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHRoZSB2ZXJ0ZXggYXR0cmlidXRlc1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjYXR0cmlidXRlc1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gY29uZmlnLmF0dHJpYnV0ZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSB2ZXJ0ZXhcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3ZlcnRleFNpemVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnRleFNpemUgPSBjb25maWcudmVydGV4U2l6ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHByaW1pdGl2ZSB0b3BvbG9neSB3aGljaCB0aGUgcGlwZWxpbmUgd2lsbCB1c2UgdG8gc3VibWl0IGRyYXcgY2FsbHNcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3RvcG9sb2d5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3BvbG9neSA9IGNvbmZpZy50b3BvbG9neTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVWludDggdmlldyB0byB0aGUgdmVydGV4IHJhdyBidWZmZXIuIFVzZWQgZm9yIHVwbG9hZGluZyB2ZXJ0ZXggYnVmZmVyIHJlc291cmNlc1xyXG4gICAgICAgICAqIHRvIHRoZSBHUFUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNieXRlc1xyXG4gICAgICAgICAqIEB0eXBlIHtVaW50OEFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLnZlcnRleERhdGEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIHdpbGwgc3RvcmUgdGhlIGFtb3VudCBvZiBjb21wb25lbnRzIG9mIDMyIGJpdCBsZW5ndGhcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3ZlcnRleENvbXBvbmVudENvdW50XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhDb21wb25lbnRDb3VudCA9IFV0aWxzLmdldENvbXBvbmVudENvdW50KGNvbmZpZy5hdHRyaWJ1dGVzLCB0aGlzLmdsKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBjdXJyZW50IHBpcGVsaW5lIGlzIGZsdXNoaW5nIHRoZSBjb250ZW50cyB0byB0aGUgR1BVLlxyXG4gICAgICAgICAqIFdoZW4gdGhlIHZhcmlhYmxlIGlzIHNldCB0aGUgZmx1c2ggZnVuY3Rpb24gd2lsbCBiZSBsb2NrZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNmbHVzaExvY2tlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmx1c2hMb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBjdXJyZW50IHBpcGVsaW5lIGlzIGFjdGl2ZSBvciBub3QgZm9yIHRoaXMgZnJhbWUgb25seS5cclxuICAgICAgICAgKiBSZXNldCBpbiB0aGUgb25SZW5kZXIgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjYWN0aXZlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIEdhbWUgaGFzIGZ1bGx5IGJvb3RlZCBhbmQgdGhlIFJlbmRlcmVyIGhhcyBmaW5pc2hlZCBzZXR0aW5nIHVwLlxyXG4gICAgICpcclxuICAgICAqIEJ5IHRoaXMgc3RhZ2UgYWxsIEdhbWUgbGV2ZWwgc3lzdGVtcyBhcmUgbm93IGluIHBsYWNlIGFuZCB5b3UgY2FuIHBlcmZvcm0gYW55IGZpbmFsXHJcbiAgICAgKiB0YXNrcyB0aGF0IHRoZSBwaXBlbGluZSBtYXkgbmVlZCB0aGF0IHJlbGllZCBvbiBnYW1lIHN5c3RlbXMgc3VjaCBhcyB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjYm9vdFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBkZXNjcmlwdGlvbiBvZiB2ZXJ0ZXggYXR0cmlidXRlIHRvIHRoZSBwaXBlbGluZVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjYWRkQXR0cmlidXRlXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUgb2YgdGhlIHZlcnRleCBhdHRyaWJ1dGVcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gc2l6ZSAtIFZlcnRleCBjb21wb25lbnQgc2l6ZVxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0eXBlIC0gVHlwZSBvZiB0aGUgYXR0cmlidXRlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZWQgLSBJcyB0aGUgdmFsdWUgbm9ybWFsaXplZCB0byBhIHJhbmdlXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG9mZnNldCAtIEJ5dGUgb2Zmc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHZlcnRleFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWRkQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgb2Zmc2V0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXNoKHtcclxuICAgICAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICAgICAgc2l6ZTogc2l6ZSxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy5yZW5kZXJlci5nbEZvcm1hdHNbdHlwZV0sXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWQsXHJcbiAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudmVydGV4Q29tcG9uZW50Q291bnQgPSBVdGlscy5nZXRDb21wb25lbnRDb3VudChcclxuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxyXG4gICAgICAgICAgICB0aGlzLmdsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBiYXRjaCBvZiB2ZXJ0aWNlcyBpcyBmdWxsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2hvdWxkRmx1c2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY3VycmVudCBiYXRjaCBzaG91bGQgYmUgZmx1c2hlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHNob3VsZEZsdXNoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy52ZXJ0ZXhDb3VudCA+PSB0aGlzLnZlcnRleENhcGFjaXR5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNpemVzIHRoZSBwcm9wZXJ0aWVzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHZpZXdwb3J0XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNyZXNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhpcyBXZWJHTCBQaXBlbGluZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGlzIFdlYkdMIFBpcGVsaW5lLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gLSBUaGUgcmVzb2x1dGlvbiB0aGlzIFdlYkdMIFBpcGVsaW5lIHNob3VsZCBiZSByZXNpemVkIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVzaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgcmVzb2x1dGlvbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiByZXNvbHV0aW9uO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogcmVzb2x1dGlvbjtcclxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyB0aGUgcGlwZWxpbmUgcmVzb3VyY2VzLCBpbmNsdWRpbmcgcHJvZ3JhbXMsIHZlcnRleCBidWZmZXJzIGFuZCBiaW5kcyBhdHRyaWJ1dGVzXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNiaW5kXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGJpbmQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgdmVydGV4QnVmZmVyID0gdGhpcy52ZXJ0ZXhCdWZmZXI7XHJcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuICAgICAgICB2YXIgdmVydGV4U2l6ZSA9IHRoaXMudmVydGV4U2l6ZTtcclxuXHJcbiAgICAgICAgcmVuZGVyZXIuc2V0UHJvZ3JhbShwcm9ncmFtKTtcclxuICAgICAgICByZW5kZXJlci5zZXRWZXJ0ZXhCdWZmZXIodmVydGV4QnVmZmVyKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGF0dHJpYnV0ZXMubGVuZ3RoOyArK2luZGV4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhdHRyaWJ1dGVzW2luZGV4XTtcclxuICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgZWxlbWVudC5uYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA+PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XHJcbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvY2F0aW9uLCBlbGVtZW50LnNpemUsIGVsZW1lbnQudHlwZSwgZWxlbWVudC5ub3JtYWxpemVkLCB2ZXJ0ZXhTaXplLCBlbGVtZW50Lm9mZnNldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRpb24gIT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgd2hlbmV2ZXIgdGhpcyBXZWJHTCBQaXBlbGluZSBpcyBib3VuZCB0byBhIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBXZWJHTCBQaXBlbGluZSBpcyBhdHRlbXB0ZWQgdG8gYmUgYm91bmQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBpcyB0aGUgY3VycmVudCBwaXBlbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI29uQmluZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBvbkJpbmQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gVGhpcyBpcyBmb3IgdXBkYXRpbmcgdW5pZm9ybSBkYXRhIGl0J3MgY2FsbGVkIG9uIGVhY2ggYmluZCBhdHRlbXB0LlxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBiZWZvcmUgZWFjaCBmcmFtZSBpcyByZW5kZXJlZCwgYnV0IGFmdGVyIHRoZSBjYW52YXMgaGFzIGJlZW4gY2xlYXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI29uUHJlUmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uUHJlUmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGNhbGxlZCBvbmNlIGV2ZXJ5IGZyYW1lXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGJlZm9yZSBhIFNjZW5lJ3MgQ2FtZXJhIGlzIHJlbmRlcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjb25SZW5kZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSBiZWluZyByZW5kZXJlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBTY2VuZSBDYW1lcmEgYmVpbmcgcmVuZGVyZWQgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uUmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGNhbGxlZCBmb3IgZWFjaCBjYW1lcmFcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYWZ0ZXIgZWFjaCBmcmFtZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbmRlcmVkIGFuZCBzbmFwc2hvdHMgaGF2ZSBiZWVuIHRha2VuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjb25Qb3N0UmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uUG9zdFJlbmRlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICAvLyBjYWxsZWQgb25jZSBldmVyeSBmcmFtZVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwbG9hZHMgdGhlIHZlcnRleCBkYXRhIGFuZCBlbWl0cyBhIGRyYXcgY2FsbFxyXG4gICAgICogZm9yIHRoZSBjdXJyZW50IGJhdGNoIG9mIHZlcnRpY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjZmx1c2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZmx1c2g6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hMb2NrZWQpIHsgcmV0dXJuIHRoaXM7IH1cclxuXHJcbiAgICAgICAgdGhpcy5mbHVzaExvY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIHZlcnRleENvdW50ID0gdGhpcy52ZXJ0ZXhDb3VudDtcclxuICAgICAgICB2YXIgdG9wb2xvZ3kgPSB0aGlzLnRvcG9sb2d5O1xyXG4gICAgICAgIHZhciB2ZXJ0ZXhTaXplID0gdGhpcy52ZXJ0ZXhTaXplO1xyXG5cclxuICAgICAgICBpZiAodmVydGV4Q291bnQgPT09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZsdXNoTG9ja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuQVJSQVlfQlVGRkVSLCAwLCB0aGlzLmJ5dGVzLnN1YmFycmF5KDAsIHZlcnRleENvdW50ICogdmVydGV4U2l6ZSkpO1xyXG4gICAgICAgIGdsLmRyYXdBcnJheXModG9wb2xvZ3ksIDAsIHZlcnRleENvdW50KTtcclxuXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhDb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy5mbHVzaExvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBvYmplY3QgcmVmZXJlbmNlcyBpbiB0aGlzIFdlYkdMIFBpcGVsaW5lIGFuZCByZW1vdmVzIGl0cyBwcm9ncmFtIGZyb20gdGhlIFdlYkdMIGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xyXG4gICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleEJ1ZmZlcik7XHJcblxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb2dyYW07XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudmVydGV4QnVmZmVyO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmdsO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRGbG9hdDFcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBgZmxvYXRgIHVuaWZvcm0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbG9hdDE6IGZ1bmN0aW9uIChuYW1lLCB4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RmxvYXQxKHRoaXMucHJvZ3JhbSwgbmFtZSwgeCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIHVuaWZvcm0gdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGlwZWxpbmUgcHJvZ3JhbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3NldEZsb2F0MlxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBuZXcgWCBjb21wb25lbnQgb2YgdGhlIGB2ZWMyYCB1bmlmb3JtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgbmV3IFkgY29tcG9uZW50IG9mIHRoZSBgdmVjMmAgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsb2F0MjogZnVuY3Rpb24gKG5hbWUsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGbG9hdDIodGhpcy5wcm9ncmFtLCBuYW1lLCB4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgdW5pZm9ybSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwaXBlbGluZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2V0RmxvYXQzXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIG5ldyBYIGNvbXBvbmVudCBvZiB0aGUgYHZlYzNgIHVuaWZvcm0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBuZXcgWSBjb21wb25lbnQgb2YgdGhlIGB2ZWMzYCB1bmlmb3JtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgbmV3IFogY29tcG9uZW50IG9mIHRoZSBgdmVjM2AgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsb2F0MzogZnVuY3Rpb24gKG5hbWUsIHgsIHksIHopXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGbG9hdDModGhpcy5wcm9ncmFtLCBuYW1lLCB4LCB5LCB6KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgdW5pZm9ybSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwaXBlbGluZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2V0RmxvYXQ0XHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gWCBjb21wb25lbnQgb2YgdGhlIHVuaWZvcm1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gWSBjb21wb25lbnQgb2YgdGhlIHVuaWZvcm1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gWiBjb21wb25lbnQgb2YgdGhlIHVuaWZvcm1cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVyBjb21wb25lbnQgb2YgdGhlIHVuaWZvcm1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsb2F0NDogZnVuY3Rpb24gKG5hbWUsIHgsIHksIHosIHcpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGbG9hdDQodGhpcy5wcm9ncmFtLCBuYW1lLCB4LCB5LCB6LCB3KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgdW5pZm9ybSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwaXBlbGluZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2V0RmxvYXQxdlxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGFyciAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHVuaWZvcm0gdmFyaWFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbG9hdDF2OiBmdW5jdGlvbiAobmFtZSwgYXJyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RmxvYXQxdih0aGlzLnByb2dyYW0sIG5hbWUsIGFycik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIHVuaWZvcm0gdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGlwZWxpbmUgcHJvZ3JhbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3NldEZsb2F0MnZcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBhcnIgLSBUaGUgbmV3IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmlmb3JtIHZhcmlhYmxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmxvYXQydjogZnVuY3Rpb24gKG5hbWUsIGFycilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEZsb2F0MnYodGhpcy5wcm9ncmFtLCBuYW1lLCBhcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRGbG9hdDN2XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gYXJyIC0gVGhlIG5ldyB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgdW5pZm9ybSB2YXJpYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsb2F0M3Y6IGZ1bmN0aW9uIChuYW1lLCBhcnIpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRGbG9hdDN2KHRoaXMucHJvZ3JhbSwgbmFtZSwgYXJyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgdW5pZm9ybSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwaXBlbGluZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2V0RmxvYXQ0dlxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGFyciAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHVuaWZvcm0gdmFyaWFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbG9hdDR2OiBmdW5jdGlvbiAobmFtZSwgYXJyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RmxvYXQ0dih0aGlzLnByb2dyYW0sIG5hbWUsIGFycik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIHVuaWZvcm0gdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGlwZWxpbmUgcHJvZ3JhbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3NldEludDFcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgYGludGAgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEludDE6IGZ1bmN0aW9uIChuYW1lLCB4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0SW50MSh0aGlzLnByb2dyYW0sIG5hbWUsIHgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRJbnQyXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSBuZXcgWCBjb21wb25lbnQgb2YgdGhlIGBpdmVjMmAgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSBuZXcgWSBjb21wb25lbnQgb2YgdGhlIGBpdmVjMmAgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEludDI6IGZ1bmN0aW9uIChuYW1lLCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0SW50Mih0aGlzLnByb2dyYW0sIG5hbWUsIHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRJbnQzXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSBuZXcgWCBjb21wb25lbnQgb2YgdGhlIGBpdmVjM2AgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSBuZXcgWSBjb21wb25lbnQgb2YgdGhlIGBpdmVjM2AgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geiAtIFRoZSBuZXcgWiBjb21wb25lbnQgb2YgdGhlIGBpdmVjM2AgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEludDM6IGZ1bmN0aW9uIChuYW1lLCB4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0SW50Myh0aGlzLnByb2dyYW0sIG5hbWUsIHgsIHksIHopO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRJbnQ0XHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFggY29tcG9uZW50IG9mIHRoZSB1bmlmb3JtXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBZIGNvbXBvbmVudCBvZiB0aGUgdW5pZm9ybVxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB6IC0gWiBjb21wb25lbnQgb2YgdGhlIHVuaWZvcm1cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdyAtIFcgY29tcG9uZW50IG9mIHRoZSB1bmlmb3JtXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbnQ0OiBmdW5jdGlvbiAobmFtZSwgeCwgeSwgeiwgdylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEludDQodGhpcy5wcm9ncmFtLCBuYW1lLCB4LCB5LCB6LCB3KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgdW5pZm9ybSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwaXBlbGluZSBwcm9ncmFtLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmUjc2V0TWF0cml4MlxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRyYW5zcG9zZSAtIFdoZXRoZXIgdG8gdHJhbnNwb3NlIHRoZSBtYXRyaXguIFNob3VsZCBiZSBgZmFsc2VgLlxyXG4gICAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IG1hdHJpeCAtIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgYG1hdDJgIHVuaWZvcm0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRNYXRyaXgyOiBmdW5jdGlvbiAobmFtZSwgdHJhbnNwb3NlLCBtYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRNYXRyaXgyKHRoaXMucHJvZ3JhbSwgbmFtZSwgdHJhbnNwb3NlLCBtYXRyaXgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgYSB1bmlmb3JtIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpcGVsaW5lIHByb2dyYW0uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZSNzZXRNYXRyaXgzXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIC0gV2hldGhlciB0byB0cmFuc3Bvc2UgdGhlIG1hdHJpeC4gU2hvdWxkIGJlIGBmYWxzZWAuXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gbWF0cml4IC0gVGhlIG5ldyB2YWx1ZXMgZm9yIHRoZSBgbWF0M2AgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldE1hdHJpeDM6IGZ1bmN0aW9uIChuYW1lLCB0cmFuc3Bvc2UsIG1hdHJpeClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldE1hdHJpeDModGhpcy5wcm9ncmFtLCBuYW1lLCB0cmFuc3Bvc2UsIG1hdHJpeCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBhIHVuaWZvcm0gdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGlwZWxpbmUgcHJvZ3JhbS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lI3NldE1hdHJpeDRcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB0cmFuc3Bvc2UgLSBTaG91bGQgdGhlIG1hdHJpeCBiZSB0cmFuc3Bvc2VcclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBtYXRyaXggLSBNYXRyaXggZGF0YVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWF0cml4NDogZnVuY3Rpb24gKG5hbWUsIHRyYW5zcG9zZSwgbWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0TWF0cml4NCh0aGlzLnByb2dyYW0sIG5hbWUsIHRyYW5zcG9zZSwgbWF0cml4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2ViR0xQaXBlbGluZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmVsaXBlIEFsZm9uc28gPEBiaXRuZW5mZXI+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZUNhbWVyYSA9IHJlcXVpcmUoJy4uLy4uL2NhbWVyYXMvMmQvQmFzZUNhbWVyYScpO1xyXG52YXIgQ2FtZXJhRXZlbnRzID0gcmVxdWlyZSgnLi4vLi4vY2FtZXJhcy8yZC9ldmVudHMnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vLi4vY29uc3QnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgSXNTaXplUG93ZXJPZlR3byA9IHJlcXVpcmUoJy4uLy4uL21hdGgvcG93Mi9Jc1NpemVQb3dlck9mVHdvJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgU2NhbGVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9zY2FsZS9ldmVudHMnKTtcclxudmFyIFNwbGljZU9uZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL2FycmF5L1NwbGljZU9uZScpO1xyXG52YXIgVGV4dHVyZUV2ZW50cyA9IHJlcXVpcmUoJy4uLy4uL3RleHR1cmVzL2V2ZW50cycpO1xyXG52YXIgVHJhbnNmb3JtTWF0cml4ID0gcmVxdWlyZSgnLi4vLi4vZ2FtZW9iamVjdHMvY29tcG9uZW50cy9UcmFuc2Zvcm1NYXRyaXgnKTtcclxudmFyIFV0aWxzID0gcmVxdWlyZSgnLi9VdGlscycpO1xyXG52YXIgV2ViR0xTbmFwc2hvdCA9IHJlcXVpcmUoJy4uL3NuYXBzaG90L1dlYkdMU25hcHNob3QnKTtcclxuXHJcbi8vICBEZWZhdWx0IFBpcGVsaW5lc1xyXG52YXIgQml0bWFwTWFza1BpcGVsaW5lID0gcmVxdWlyZSgnLi9waXBlbGluZXMvQml0bWFwTWFza1BpcGVsaW5lJyk7XHJcbnZhciBGb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUgPSByZXF1aXJlKCcuL3BpcGVsaW5lcy9Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUnKTtcclxudmFyIFRleHR1cmVUaW50UGlwZWxpbmUgPSByZXF1aXJlKCcuL3BpcGVsaW5lcy9UZXh0dXJlVGludFBpcGVsaW5lJyk7XHJcbnZhciBUZXh0dXJlVGludFN0cmlwUGlwZWxpbmUgPSByZXF1aXJlKCcuL3BpcGVsaW5lcy9UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2FsbGJhY2sgV2ViR0xDb250ZXh0Q2FsbGJhY2tcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgV2ViR0wgUmVuZGVyZXIgd2hpY2ggb3ducyB0aGUgY29udGV4dC5cclxuICovXHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBXZWJHTFJlbmRlcmVyIGlzIGEgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgbmVlZGVkIGZ1bmN0aW9uYWxpdHkgdG8ga2VlcCB0aGVcclxuICogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHN0YXRlIGNsZWFuLiBUaGUgbWFpbiBpZGVhIG9mIHRoZSBXZWJHTFJlbmRlcmVyIGlzIHRvIGtlZXAgdHJhY2sgb2ZcclxuICogYW55IGNvbnRleHQgY2hhbmdlIHRoYXQgaGFwcGVucyBmb3IgV2ViR0wgcmVuZGVyaW5nIGluc2lkZSBvZiBQaGFzZXIuIFRoaXMgbWVhbnNcclxuICogaWYgcmF3IHdlYmdsIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIG91dHNpZGUgdGhlIFdlYkdMUmVuZGVyZXIgb2YgdGhlIFBoYXNlciBXZWJHTFxyXG4gKiByZW5kZXJpbmcgZWNvc3lzdGVtIHRoZXkgbWlnaHQgcG9sbHV0ZSB0aGUgY3VycmVudCBXZWJHTFJlbmRlcmluZ0NvbnRleHQgc3RhdGUgcHJvZHVjaW5nXHJcbiAqIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEl0J3MgcmVjb21tZW5kZWQgdGhhdCBXZWJHTCBpbnRlcmFjdGlvbiBpcyBkb25lIHRocm91Z2hcclxuICogV2ViR0xSZW5kZXJlciBhbmQvb3IgV2ViR0xQaXBlbGluZS5cclxuICpcclxuICogQGNsYXNzIFdlYkdMUmVuZGVyZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5SZW5kZXJlci5XZWJHTFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWV9IGdhbWUgLSBUaGUgR2FtZSBpbnN0YW5jZSB3aGljaCBvd25zIHRoaXMgV2ViR0wgUmVuZGVyZXIuXHJcbiAqL1xyXG52YXIgV2ViR0xSZW5kZXJlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBXZWJHTFJlbmRlcmVyIChnYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnYW1lQ29uZmlnID0gZ2FtZS5jb25maWc7XHJcblxyXG4gICAgICAgIHZhciBjb250ZXh0Q3JlYXRpb25Db25maWcgPSB7XHJcbiAgICAgICAgICAgIGFscGhhOiBnYW1lQ29uZmlnLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBkZXN5bmNocm9uaXplZDogZ2FtZUNvbmZpZy5kZXN5bmNocm9uaXplZCxcclxuICAgICAgICAgICAgZGVwdGg6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbnRpYWxpYXM6IGdhbWVDb25maWcuYW50aWFsaWFzR0wsXHJcbiAgICAgICAgICAgIHByZW11bHRpcGxpZWRBbHBoYTogZ2FtZUNvbmZpZy5wcmVtdWx0aXBsaWVkQWxwaGEsXHJcbiAgICAgICAgICAgIHN0ZW5jaWw6IHRydWUsXHJcbiAgICAgICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGdhbWVDb25maWcuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcclxuICAgICAgICAgICAgcG93ZXJQcmVmZXJlbmNlOiBnYW1lQ29uZmlnLnBvd2VyUHJlZmVyZW5jZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBsb2NhbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIG9mIHRoaXMgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICAgICAgICBjbGVhckJlZm9yZVJlbmRlcjogZ2FtZUNvbmZpZy5jbGVhckJlZm9yZVJlbmRlcixcclxuICAgICAgICAgICAgYW50aWFsaWFzOiBnYW1lQ29uZmlnLmFudGlhbGlhcyxcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBnYW1lQ29uZmlnLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgICAgICAgY29udGV4dENyZWF0aW9uOiBjb250ZXh0Q3JlYXRpb25Db25maWcsXHJcbiAgICAgICAgICAgIHJlc29sdXRpb246IGdhbWVDb25maWcucmVzb2x1dGlvbixcclxuICAgICAgICAgICAgcm91bmRQaXhlbHM6IGdhbWVDb25maWcucm91bmRQaXhlbHMsXHJcbiAgICAgICAgICAgIG1heFRleHR1cmVzOiBnYW1lQ29uZmlnLm1heFRleHR1cmVzLFxyXG4gICAgICAgICAgICBtYXhUZXh0dXJlU2l6ZTogZ2FtZUNvbmZpZy5tYXhUZXh0dXJlU2l6ZSxcclxuICAgICAgICAgICAgYmF0Y2hTaXplOiBnYW1lQ29uZmlnLmJhdGNoU2l6ZSxcclxuICAgICAgICAgICAgbWF4TGlnaHRzOiBnYW1lQ29uZmlnLm1heExpZ2h0cyxcclxuICAgICAgICAgICAgbWlwbWFwRmlsdGVyOiBnYW1lQ29uZmlnLm1pcG1hcEZpbHRlclxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHYW1lIGluc3RhbmNlIHdoaWNoIG93bnMgdGhpcyBXZWJHTCBSZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25zdGFudCB3aGljaCBhbGxvd3MgdGhlIHJlbmRlcmVyIHRvIGJlIGVhc2lseSBpZGVudGlmaWVkIGFzIGEgV2ViR0wgUmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciN0eXBlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50eXBlID0gQ09OU1QuV0VCR0w7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgY2FudmFzIGJlaW5nIHJlbmRlcmVkIHRvLlxyXG4gICAgICAgICAqIFRoaXMgaXMgcG9wdWxhdGVkIGluIHRoZSBvblJlc2l6ZSBldmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjd2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndpZHRoID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgY2FudmFzIGJlaW5nIHJlbmRlcmVkIHRvLlxyXG4gICAgICAgICAqIFRoaXMgaXMgcG9wdWxhdGVkIGluIHRoZSBvblJlc2l6ZSBldmVudCBoYW5kbGVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FudmFzIHdoaWNoIHRoaXMgV2ViR0wgUmVuZGVyZXIgZHJhd3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYW52YXMgPSBnYW1lLmNhbnZhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgYmxlbmQgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBXZWJHTCBSZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIGFycmF5IGluY2x1ZGVzIHRoZSBkZWZhdWx0IGJsZW5kIG1vZGVzIGFzIHdlbGwgYXMgYW55IGN1c3RvbSBibGVuZCBtb2RlcyBhZGRlZCB0aHJvdWdoIHtAbGluayAjYWRkQmxlbmRNb2RlfS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2JsZW5kTW9kZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJsZW5kTW9kZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgYW55IFdlYkdMVGV4dHVyZSBjcmVhdGVkIHdpdGggdGhlIGN1cnJlbnQgV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNuYXRpdmVUZXh0dXJlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmF0aXZlVGV4dHVyZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgIGlmIHRoZSBXZWJHTCBjb250ZXh0IG9mIHRoZSByZW5kZXJlciBpcyBsb3N0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY29udGV4dExvc3RcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29udGV4dExvc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBvYmplY3Qgd2lsbCBzdG9yZSBhbGwgcGlwZWxpbmVzIGNyZWF0ZWQgdGhyb3VnaCBhZGRQaXBlbGluZVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcGlwZWxpbmVzXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waXBlbGluZXMgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHNuYXBzaG90LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIElmIGEgbm9uLW51bGwgYGNhbGxiYWNrYCBpcyBzZXQgaW4gdGhpcyBvYmplY3QsIGEgc25hcHNob3Qgb2YgdGhlIGNhbnZhcyB3aWxsIGJlIHRha2VuIGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lIGlzIGZ1bGx5IHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc25hcHNob3RTdGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RTdGF0ZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNuYXBzaG90U3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgIHdpZHRoOiAxLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDEsXHJcbiAgICAgICAgICAgIGdldFBpeGVsOiBmYWxzZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IG51bGwsXHJcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICBlbmNvZGVyOiAwLjkyLFxyXG4gICAgICAgICAgICBpc0ZyYW1lYnVmZmVyOiBmYWxzZSxcclxuICAgICAgICAgICAgYnVmZmVyV2lkdGg6IDAsXHJcbiAgICAgICAgICAgIGJ1ZmZlckhlaWdodDogMFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIEludGVybmFsIFJlbmRlcmVyIFN0YXRlIChUZXh0dXJlcywgRnJhbWVidWZmZXJzLCBQaXBlbGluZXMsIEJ1ZmZlcnMsIGV0YylcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FjaGVkIHZhbHVlIGZvciB0aGUgbGFzdCB0ZXh0dXJlIHVuaXQgdGhhdCB3YXMgdXNlZFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY3VycmVudEFjdGl2ZVRleHR1cmVVbml0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0aXZlVGV4dHVyZVVuaXQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiB0aGUgbGFzdCB0ZXh0dXJlIGhhbmRsZXMgdGhhdCB3ZXJlIGJvdW5kIHRvIHRoZSBXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2N1cnJlbnRUZXh0dXJlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRUZXh0dXJlcyA9IG5ldyBBcnJheSgxNik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEN1cnJlbnQgZnJhbWVidWZmZXIgaW4gdXNlXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50RnJhbWVidWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xGcmFtZWJ1ZmZlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDdXJyZW50IFdlYkdMUGlwZWxpbmUgaW4gdXNlXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50UGlwZWxpbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmV9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBpcGVsaW5lID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3VycmVudCBXZWJHTFByb2dyYW0gaW4gdXNlXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50UHJvZ3JhbVxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFByb2dyYW19XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudFByb2dyYW0gPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDdXJyZW50IFdlYkdMQnVmZmVyIChWZXJ0ZXggYnVmZmVyKSBpbiB1c2VcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2N1cnJlbnRWZXJ0ZXhCdWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xCdWZmZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudFZlcnRleEJ1ZmZlciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEN1cnJlbnQgV2ViR0xCdWZmZXIgKEluZGV4IGJ1ZmZlcikgaW4gdXNlXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50SW5kZXhCdWZmZXJcclxuICAgICAgICAgKiBAdHlwZSB7V2ViR0xCdWZmZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4QnVmZmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3VycmVudCBibGVuZCBtb2RlIGluIHVzZVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY3VycmVudEJsZW5kTW9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEJsZW5kTW9kZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRoZSBzY2lzc29yIHN0YXRlIGlzIGVuYWJsZWQgaW4gV2ViR0xSZW5kZXJpbmdDb250ZXh0XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50U2Npc3NvckVuYWJsZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNjaXNzb3JFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFN0b3JlcyB0aGUgY3VycmVudCBzY2lzc29yIGRhdGFcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2N1cnJlbnRTY2lzc29yXHJcbiAgICAgICAgICogQHR5cGUge1VpbnQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNjaXNzb3IgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdGFjayBvZiBzY2lzc29yIGRhdGFcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NjaXNzb3JTdGFja1xyXG4gICAgICAgICAqIEB0eXBlIHtVaW50MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjaXNzb3JTdGFjayA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGFuZGxlciB0byBpbnZva2Ugd2hlbiB0aGUgY29udGV4dCBpcyBsb3N0LlxyXG4gICAgICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGFuZCBpcyBzZXQgaW4gdGhlIGJvb3QgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY29udGV4dExvc3RIYW5kbGVyXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnRleHRMb3N0SGFuZGxlciA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoYW5kbGVyIHRvIGludm9rZSB3aGVuIHRoZSBjb250ZXh0IGlzIHJlc3RvcmVkLlxyXG4gICAgICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGFuZCBpcyBzZXQgaW4gdGhlIGJvb3QgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY29udGV4dFJlc3RvcmVkSGFuZGxlclxyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0UmVzdG9yZWRIYW5kbGVyID0gTk9PUDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHVuZGVybHlpbmcgV2ViR0wgY29udGV4dCBvZiB0aGUgcmVuZGVyZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNnbFxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2wgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBcnJheSBvZiBzdHJpbmdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggV2ViR0wgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzdXBwb3J0ZWRFeHRlbnNpb25zXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRFeHRlbnNpb25zID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRXh0ZW5zaW9ucyBsb2FkZWQgaW50byB0aGUgY3VycmVudCBjb250ZXh0XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNleHRlbnNpb25zXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAZGVmYXVsdCB7fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdG9yZXMgdGhlIGN1cnJlbnQgV2ViR0wgY29tcG9uZW50IGZvcm1hdHMgZm9yIGZ1cnRoZXIgdXNlXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNnbEZvcm1hdHNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsRm9ybWF0cyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdG9yZXMgdGhlIHN1cHBvcnRlZCBXZWJHTCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjb21wcmVzc2lvblxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0ge1xyXG4gICAgICAgICAgICBFVEMxOiBmYWxzZSxcclxuICAgICAgICAgICAgUFZSVEM6IGZhbHNlLFxyXG4gICAgICAgICAgICBTM1RDOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENhY2hlZCBkcmF3aW5nIGJ1ZmZlciBoZWlnaHQgdG8gcmVkdWNlIGdsIGNhbGxzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZHJhd2luZ0J1ZmZlckhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHJhd2luZ0J1ZmZlckhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgYmxhbmsgMzJ4MzIgdHJhbnNwYXJlbnQgdGV4dHVyZSwgYXMgdXNlZCBieSB0aGUgR3JhcGhpY3Mgc3lzdGVtIHdoZXJlIG5lZWRlZC5cclxuICAgICAgICAgKiBUaGlzIGlzIHNldCBpbiB0aGUgYGJvb3RgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2JsYW5rVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmxhbmtUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBkZWZhdWx0IENhbWVyYSB1c2VkIGluIGNhbGxzIHdoZW4gbm8gb3RoZXIgY2FtZXJhIGhhcyBiZWVuIHByb3ZpZGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZGVmYXVsdENhbWVyYVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkJhc2VDYW1lcmF9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdENhbWVyYSA9IG5ldyBCYXNlQ2FtZXJhKDAsIDAsIDAsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjX3RlbXBNYXRyaXgxXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4MSA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCwgcmUtdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBiYXRjaGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI190ZW1wTWF0cml4MlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDIgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNfdGVtcE1hdHJpeDNcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgzID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjX3RlbXBNYXRyaXg0XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4NCA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBtYXNrcyBjdXJyZW50bHkgc3RhY2tlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI21hc2tDb3VudFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hc2tDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtYXNrIHN0YWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjbWFza1N0YWNrXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5EaXNwbGF5Lk1hc2tzLkdlb21ldHJ5TWFza1tdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hc2tTdGFjayA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwcm9wZXJ0eSB0aGF0IHRyYWNrcyB0aGUgY3VycmVudGx5IHNldCBtYXNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY3VycmVudE1hc2tcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRNYXNrID0geyBtYXNrOiBudWxsLCBjYW1lcmE6IG51bGwgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgcHJvcGVydHkgdGhhdCB0cmFja3MgdGhlIGN1cnJlbnRseSBzZXQgY2FtZXJhIG1hc2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjdXJyZW50Q2FtZXJhTWFza1xyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2sgPSB7IG1hc2s6IG51bGwsIGNhbWVyYTogbnVsbCB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBnbCBmdW5jdGlvbiBtYXBwaW5nIGZvciB1bmlmb3JtIGxvb2stdXAuXHJcbiAgICAgICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMUmVuZGVyaW5nQ29udGV4dC91bmlmb3JtXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZ2xGdW5jTWFwXHJcbiAgICAgICAgICogQHR5cGUge2FueX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nbEZ1bmNNYXAgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYHR5cGVgIG9mIHRoZSBHYW1lIE9iamVjdCBiZWluZyBjdXJyZW50bHkgcmVuZGVyZWQuXHJcbiAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCBieSBhZHZhbmNlZCByZW5kZXIgZnVuY3Rpb25zIGZvciBiYXRjaGluZyBsb29rLWFoZWFkLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2N1cnJlbnRUeXBlXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VHlwZSA9ICcnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGUgYHR5cGVgIG9mIHRoZSBHYW1lIE9iamVjdCBiZWluZyBjdXJyZW50bHkgcmVuZGVyZWQgZGlmZmVyZW50IHRoYW4gdGhlXHJcbiAgICAgICAgICogdHlwZSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBpdCBpbiB0aGUgZGlzcGxheSBsaXN0PyBJLmUuIGl0J3MgYSAnbmV3JyB0eXBlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI25ld1R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uZXdUeXBlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvZXMgdGhlIGB0eXBlYCBvZiB0aGUgbmV4dCBHYW1lIE9iamVjdCBpbiB0aGUgZGlzcGxheSBsaXN0IG1hdGNoIHRoYXRcclxuICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIGN1cnJlbnRseSByZW5kZXJlZD9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNuZXh0VHlwZU1hdGNoXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmV4dFR5cGVNYXRjaCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWlwbWFwIG1hZ0ZpbHRlciB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGV4dHVyZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogWW91IGNhbiBzcGVjaWZ5IHRoaXMgYXMgYSBzdHJpbmcgaW4gdGhlIGdhbWUgY29uZmlnLCBpLmUuOlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGByZW5kZXJlcjogeyBtaXBtYXBGaWx0ZXI6ICdORUFSRVNUX01JUE1BUF9MSU5FQVInIH1gXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIDYgb3B0aW9ucyBmb3IgV2ViR0wxIGFyZSwgaW4gb3JkZXIgZnJvbSBsZWFzdCB0byBtb3N0IGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmU6XHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogTkVBUkVTVCAoZm9yIHBpeGVsIGFydClcclxuICAgICAgICAgKiBMSU5FQVIgKHRoZSBkZWZhdWx0KVxyXG4gICAgICAgICAqIE5FQVJFU1RfTUlQTUFQX05FQVJFU1RcclxuICAgICAgICAgKiBMSU5FQVJfTUlQTUFQX05FQVJFU1RcclxuICAgICAgICAgKiBORUFSRVNUX01JUE1BUF9MSU5FQVJcclxuICAgICAgICAgKiBMSU5FQVJfTUlQTUFQX0xJTkVBUlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIE1pcG1hcHMgb25seSB3b3JrIHdpdGggdGV4dHVyZXMgdGhhdCBhcmUgZnVsbHkgcG93ZXItb2YtdHdvIGluIHNpemUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogRm9yIG1vcmUgZGV0YWlscyBzZWUgaHR0cHM6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC0zZC10ZXh0dXJlcy5odG1sXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjbWlwbWFwRmlsdGVyXHJcbiAgICAgICAgICogQHR5cGUge0dMZW51bX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5taXBtYXBGaWx0ZXIgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmluaXQodGhpcy5jb25maWcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgV2ViR0xSZW5kZXJpbmdDb250ZXh0IGFuZCBpbml0aWFsaXplcyBhbGwgaW50ZXJuYWwgc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNpbml0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgcmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbDtcclxuICAgICAgICB2YXIgZ2FtZSA9IHRoaXMuZ2FtZTtcclxuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jYW52YXM7XHJcbiAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSBjb25maWcuYmFja2dyb3VuZENvbG9yO1xyXG5cclxuICAgICAgICAvLyAgRGlkIHRoZXkgcHJvdmlkZSB0aGVpciBvd24gY29udGV4dD9cclxuICAgICAgICBpZiAoZ2FtZS5jb25maWcuY29udGV4dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsID0gZ2FtZS5jb25maWcuY29udGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBjb25maWcuY29udGV4dENyZWF0aW9uKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgY29uZmlnLmNvbnRleHRDcmVhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWdsIHx8IGdsLmlzQ29udGV4dExvc3QoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dExvc3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJHTCB1bnN1cHBvcnRlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xyXG5cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHRMb3N0SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbnRleHRMb3N0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmdhbWUuZXZlbnRzLmVtaXQoR2FtZUV2ZW50cy5DT05URVhUX0xPU1QsIF90aGlzKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jb250ZXh0UmVzdG9yZWRIYW5kbGVyID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbnRleHRMb3N0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5pbml0KF90aGlzLmNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5nYW1lLmV2ZW50cy5lbWl0KEdhbWVFdmVudHMuQ09OVEVYVF9SRVNUT1JFRCwgX3RoaXMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5jb250ZXh0TG9zdEhhbmRsZXIsIGZhbHNlKTtcclxuICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCB0aGlzLmNvbnRleHRSZXN0b3JlZEhhbmRsZXIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gIFNldCBpdCBiYWNrIGludG8gdGhlIEdhbWUsIHNvIGRldmVsb3BlcnMgY2FuIGFjY2VzcyBpdCBmcm9tIHRoZXJlIHRvb1xyXG4gICAgICAgIGdhbWUuY29udGV4dCA9IGdsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAyNzsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ibGVuZE1vZGVzLnB1c2goeyBmdW5jOiBbIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSBdLCBlcXVhdGlvbjogZ2wuRlVOQ19BREQgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQUREXHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGVzWzFdLmZ1bmMgPSBbIGdsLk9ORSwgZ2wuRFNUX0FMUEhBIF07XHJcblxyXG4gICAgICAgIC8vICBNVUxUSVBMWVxyXG4gICAgICAgIHRoaXMuYmxlbmRNb2Rlc1syXS5mdW5jID0gWyBnbC5EU1RfQ09MT1IsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgXTtcclxuXHJcbiAgICAgICAgLy8gIFNDUkVFTlxyXG4gICAgICAgIHRoaXMuYmxlbmRNb2Rlc1szXS5mdW5jID0gWyBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IgXTtcclxuXHJcbiAgICAgICAgLy8gIEVSQVNFXHJcbiAgICAgICAgdGhpcy5ibGVuZE1vZGVzWzE3XSA9IHsgZnVuYzogWyBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBIF0sIGVxdWF0aW9uOiBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgfTtcclxuXHJcbiAgICAgICAgdGhpcy5nbEZvcm1hdHNbMF0gPSBnbC5CWVRFO1xyXG4gICAgICAgIHRoaXMuZ2xGb3JtYXRzWzFdID0gZ2wuU0hPUlQ7XHJcbiAgICAgICAgdGhpcy5nbEZvcm1hdHNbMl0gPSBnbC5VTlNJR05FRF9CWVRFO1xyXG4gICAgICAgIHRoaXMuZ2xGb3JtYXRzWzNdID0gZ2wuVU5TSUdORURfU0hPUlQ7XHJcbiAgICAgICAgdGhpcy5nbEZvcm1hdHNbNF0gPSBnbC5GTE9BVDtcclxuXHJcbiAgICAgICAgLy8gIFNldCB0aGUgZ2wgZnVuY3Rpb24gbWFwXHJcbiAgICAgICAgdGhpcy5nbEZ1bmNNYXAgPSB7XHJcblxyXG4gICAgICAgICAgICBtYXQyOiB7IGZ1bmM6IGdsLnVuaWZvcm1NYXRyaXgyZnYsIGxlbmd0aDogMSwgbWF0cml4OiB0cnVlIH0sXHJcbiAgICAgICAgICAgIG1hdDM6IHsgZnVuYzogZ2wudW5pZm9ybU1hdHJpeDNmdiwgbGVuZ3RoOiAxLCBtYXRyaXg6IHRydWUgfSxcclxuICAgICAgICAgICAgbWF0NDogeyBmdW5jOiBnbC51bmlmb3JtTWF0cml4NGZ2LCBsZW5ndGg6IDEsIG1hdHJpeDogdHJ1ZSB9LFxyXG5cclxuICAgICAgICAgICAgJzFmJzogeyBmdW5jOiBnbC51bmlmb3JtMWYsIGxlbmd0aDogMSB9LFxyXG4gICAgICAgICAgICAnMWZ2JzogeyBmdW5jOiBnbC51bmlmb3JtMWZ2LCBsZW5ndGg6IDEgfSxcclxuICAgICAgICAgICAgJzFpJzogeyBmdW5jOiBnbC51bmlmb3JtMWksIGxlbmd0aDogMSB9LFxyXG4gICAgICAgICAgICAnMWl2JzogeyBmdW5jOiBnbC51bmlmb3JtMWl2LCBsZW5ndGg6IDEgfSxcclxuXHJcbiAgICAgICAgICAgICcyZic6IHsgZnVuYzogZ2wudW5pZm9ybTJmLCBsZW5ndGg6IDIgfSxcclxuICAgICAgICAgICAgJzJmdic6IHsgZnVuYzogZ2wudW5pZm9ybTJmdiwgbGVuZ3RoOiAxIH0sXHJcbiAgICAgICAgICAgICcyaSc6IHsgZnVuYzogZ2wudW5pZm9ybTJpLCBsZW5ndGg6IDIgfSxcclxuICAgICAgICAgICAgJzJpdic6IHsgZnVuYzogZ2wudW5pZm9ybTJpdiwgbGVuZ3RoOiAxIH0sXHJcblxyXG4gICAgICAgICAgICAnM2YnOiB7IGZ1bmM6IGdsLnVuaWZvcm0zZiwgbGVuZ3RoOiAzIH0sXHJcbiAgICAgICAgICAgICczZnYnOiB7IGZ1bmM6IGdsLnVuaWZvcm0zZnYsIGxlbmd0aDogMSB9LFxyXG4gICAgICAgICAgICAnM2knOiB7IGZ1bmM6IGdsLnVuaWZvcm0zaSwgbGVuZ3RoOiAzIH0sXHJcbiAgICAgICAgICAgICczaXYnOiB7IGZ1bmM6IGdsLnVuaWZvcm0zaXYsIGxlbmd0aDogMSB9LFxyXG5cclxuICAgICAgICAgICAgJzRmJzogeyBmdW5jOiBnbC51bmlmb3JtNGYsIGxlbmd0aDogNCB9LFxyXG4gICAgICAgICAgICAnNGZ2JzogeyBmdW5jOiBnbC51bmlmb3JtNGZ2LCBsZW5ndGg6IDEgfSxcclxuICAgICAgICAgICAgJzRpJzogeyBmdW5jOiBnbC51bmlmb3JtNGksIGxlbmd0aDogNCB9LFxyXG4gICAgICAgICAgICAnNGl2JzogeyBmdW5jOiBnbC51bmlmb3JtNGl2LCBsZW5ndGg6IDEgfVxyXG5cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBMb2FkIHN1cHBvcnRlZCBleHRlbnNpb25zXHJcbiAgICAgICAgdmFyIGV4dHMgPSBnbC5nZXRTdXBwb3J0ZWRFeHRlbnNpb25zKCk7XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLm1heFRleHR1cmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnLm1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLm1heFRleHR1cmVTaXplKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uZmlnLm1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGV4dFN0cmluZyA9ICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfJztcclxuICAgICAgICB2YXIgd2tFeHRTdHJpbmcgPSAnV0VCS0lUXycgKyBleHRTdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMuY29tcHJlc3Npb24uRVRDMSA9IGdsLmdldEV4dGVuc2lvbihleHRTdHJpbmcgKyAnZXRjMScpIHx8IGdsLmdldEV4dGVuc2lvbih3a0V4dFN0cmluZyArICdldGMxJyk7XHJcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbi5QVlJUQyA9IGdsLmdldEV4dGVuc2lvbihleHRTdHJpbmcgKyAncHZydGMnKSB8fCBnbC5nZXRFeHRlbnNpb24od2tFeHRTdHJpbmcgKyAncHZydGMnKTtcclxuICAgICAgICB0aGlzLmNvbXByZXNzaW9uLlMzVEMgPSBnbC5nZXRFeHRlbnNpb24oZXh0U3RyaW5nICsgJ3MzdGMnKSB8fCBnbC5nZXRFeHRlbnNpb24od2tFeHRTdHJpbmcgKyAnczN0YycpO1xyXG5cclxuICAgICAgICB0aGlzLnN1cHBvcnRlZEV4dGVuc2lvbnMgPSBleHRzO1xyXG5cclxuICAgICAgICAvLyAgU2V0dXAgaW5pdGlhbCBXZWJHTCBzdGF0ZVxyXG4gICAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XHJcbiAgICAgICAgZ2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xyXG5cclxuICAgICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xyXG5cclxuICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3IucmVkR0wsIGNsZWFyQ29sb3IuZ3JlZW5HTCwgY2xlYXJDb2xvci5ibHVlR0wsIGNsZWFyQ29sb3IuYWxwaGFHTCk7XHJcblxyXG4gICAgICAgIC8vICBNaXBtYXBzXHJcbiAgICAgICAgdGhpcy5taXBtYXBGaWx0ZXIgPSBnbFtjb25maWcubWlwbWFwRmlsdGVyXTtcclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbGwgdGV4dHVyZXMgdG8gbnVsbFxyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmN1cnJlbnRUZXh0dXJlcy5sZW5ndGg7ICsraW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUZXh0dXJlc1tpbmRleF0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcGlwZWxpbmVzIGFuZCByZWxvYWQgZGVmYXVsdCBvbmVzXHJcbiAgICAgICAgdGhpcy5waXBlbGluZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRQaXBlbGluZSgnVGV4dHVyZVRpbnRQaXBlbGluZScsIG5ldyBUZXh0dXJlVGludFBpcGVsaW5lKHsgZ2FtZTogZ2FtZSwgcmVuZGVyZXI6IHRoaXMgfSkpO1xyXG4gICAgICAgIHRoaXMuYWRkUGlwZWxpbmUoJ1RleHR1cmVUaW50U3RyaXBQaXBlbGluZScsIG5ldyBUZXh0dXJlVGludFN0cmlwUGlwZWxpbmUoeyBnYW1lOiBnYW1lLCByZW5kZXJlcjogdGhpcyB9KSk7XHJcbiAgICAgICAgdGhpcy5hZGRQaXBlbGluZSgnQml0bWFwTWFza1BpcGVsaW5lJywgbmV3IEJpdG1hcE1hc2tQaXBlbGluZSh7IGdhbWU6IGdhbWUsIHJlbmRlcmVyOiB0aGlzIH0pKTtcclxuICAgICAgICB0aGlzLmFkZFBpcGVsaW5lKCdMaWdodDJEJywgbmV3IEZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZSh7IGdhbWU6IGdhbWUsIHJlbmRlcmVyOiB0aGlzLCBtYXhMaWdodHM6IGNvbmZpZy5tYXhMaWdodHMgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEJsZW5kTW9kZShDT05TVC5CbGVuZE1vZGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICAgIGdhbWUudGV4dHVyZXMub25jZShUZXh0dXJlRXZlbnRzLlJFQURZLCB0aGlzLmJvb3QsIHRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBib290IGhhbmRsZXIuIENhbGxzICdib290JyBvbiBlYWNoIHBpcGVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBwaXBlbGluZU5hbWUgaW4gdGhpcy5waXBlbGluZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBpcGVsaW5lc1twaXBlbGluZU5hbWVdLmJvb3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBibGFuayA9IHRoaXMuZ2FtZS50ZXh0dXJlcy5nZXRGcmFtZSgnX19ERUZBVUxUJyk7XHJcblxyXG4gICAgICAgIHRoaXMucGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUuY3VycmVudEZyYW1lID0gYmxhbms7XHJcblxyXG4gICAgICAgIHRoaXMuYmxhbmtUZXh0dXJlID0gYmxhbms7XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XHJcblxyXG4gICAgICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFBpcGVsaW5lKHRoaXMucGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUpO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUuc2NhbGUub24oU2NhbGVFdmVudHMuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIGJhc2VTaXplID0gdGhpcy5nYW1lLnNjYWxlLmJhc2VTaXplO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2l6ZShiYXNlU2l6ZS53aWR0aCwgYmFzZVNpemUuaGVpZ2h0LCB0aGlzLmdhbWUuc2NhbGUucmVzb2x1dGlvbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGV2ZW50IGhhbmRsZXIgdGhhdCBtYW5hZ2VzIHRoZSBgcmVzaXplYCBldmVudCBkaXNwYXRjaGVkIGJ5IHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjb25SZXNpemVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNpemV9IGdhbWVTaXplIC0gVGhlIGRlZmF1bHQgR2FtZSBTaXplIG9iamVjdC4gVGhpcyBpcyB0aGUgdW4tbW9kaWZpZWQgZ2FtZSBkaW1lbnNpb25zLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU3RydWN0cy5TaXplfSBiYXNlU2l6ZSAtIFRoZSBiYXNlIFNpemUgb2JqZWN0LiBUaGUgZ2FtZSBkaW1lbnNpb25zIG11bHRpcGxpZWQgYnkgdGhlIHJlc29sdXRpb24uIFRoZSBjYW52YXMgd2lkdGggLyBoZWlnaHQgdmFsdWVzIG1hdGNoIHRoaXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNpemV9IGRpc3BsYXlTaXplIC0gVGhlIGRpc3BsYXkgU2l6ZSBvYmplY3QuIFRoZSBzaXplIG9mIHRoZSBjYW52YXMgc3R5bGUgd2lkdGggLyBoZWlnaHQgYXR0cmlidXRlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzb2x1dGlvbl0gLSBUaGUgU2NhbGUgTWFuYWdlciByZXNvbHV0aW9uIHNldHRpbmcuXHJcbiAgICAgKi9cclxuICAgIG9uUmVzaXplOiBmdW5jdGlvbiAoZ2FtZVNpemUsIGJhc2VTaXplLCBkaXNwbGF5U2l6ZSwgcmVzb2x1dGlvbilcclxuICAgIHtcclxuICAgICAgICAvLyAgSGFzIHRoZSB1bmRlcmx5aW5nIGNhbnZhcyBzaXplIGNoYW5nZWQ/XHJcbiAgICAgICAgaWYgKGJhc2VTaXplLndpZHRoICE9PSB0aGlzLndpZHRoIHx8IGJhc2VTaXplLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQgfHwgcmVzb2x1dGlvbiAhPT0gdGhpcy5yZXNvbHV0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemUoYmFzZVNpemUud2lkdGgsIGJhc2VTaXplLmhlaWdodCwgcmVzb2x1dGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgdGhlIGRyYXdpbmcgYnVmZmVyIHRvIG1hdGNoIHRoYXQgcmVxdWlyZWQgYnkgdGhlIFNjYWxlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNyZXNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb25dIC0gVGhlIG5ldyByZXNvbHV0aW9uIG9mIHRoZSByZW5kZXJlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgcGlwZWxpbmVzID0gdGhpcy5waXBlbGluZXM7XHJcblxyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xyXG5cclxuICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLy8gIFVwZGF0ZSBhbGwgcmVnaXN0ZXJlZCBwaXBlbGluZXNcclxuICAgICAgICBmb3IgKHZhciBwaXBlbGluZU5hbWUgaW4gcGlwZWxpbmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGlwZWxpbmVzW3BpcGVsaW5lTmFtZV0ucmVzaXplKHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kcmF3aW5nQnVmZmVySGVpZ2h0ID0gZ2wuZHJhd2luZ0J1ZmZlckhlaWdodDtcclxuXHJcbiAgICAgICAgZ2wuc2Npc3NvcigwLCAoZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCAtIGhlaWdodCksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmRlZmF1bHRDYW1lcmEuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGEgV2ViR0wgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjaGFzRXh0ZW5zaW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uTmFtZSAtIE5hbWUgb2YgdGhlIFdlYkdMIGV4dGVuc2lvblxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhhc0V4dGVuc2lvbjogZnVuY3Rpb24gKGV4dGVuc2lvbk5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkRXh0ZW5zaW9ucyA/IHRoaXMuc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDogZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBXZWJHTCBleHRlbnNpb25cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2dldEV4dGVuc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIGxvYWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBXZWJHTCBleHRlbnNpb24gaWYgdGhlIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWRcclxuICAgICAqL1xyXG4gICAgZ2V0RXh0ZW5zaW9uOiBmdW5jdGlvbiAoZXh0ZW5zaW9uTmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzRXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIGlmICghKGV4dGVuc2lvbk5hbWUgaW4gdGhpcy5leHRlbnNpb25zKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXSA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbHVzaGVzIHRoZSBjdXJyZW50IHBpcGVsaW5lIGlmIHRoZSBwaXBlbGluZSBpcyBib3VuZFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZmx1c2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBmbHVzaDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGlwZWxpbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQaXBlbGluZS5mbHVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgYSBwaXBlbGluZSBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IFdlYkdMUmVuZGVyZXJcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2hhc1BpcGVsaW5lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGlwZWxpbmVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBpcGVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcGlwZWxpbmUgaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaGFzUGlwZWxpbmU6IGZ1bmN0aW9uIChwaXBlbGluZU5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIChwaXBlbGluZU5hbWUgaW4gdGhpcy5waXBlbGluZXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBpcGVsaW5lIGJ5IG5hbWUgaWYgdGhlIHBpcGVsaW5lIGV4aXN0c1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZ2V0UGlwZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwaXBlbGluZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGlwZWxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmV9IFRoZSBwaXBlbGluZSBpbnN0YW5jZSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UGlwZWxpbmU6IGZ1bmN0aW9uIChwaXBlbGluZU5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmhhc1BpcGVsaW5lKHBpcGVsaW5lTmFtZSkpID8gdGhpcy5waXBlbGluZXNbcGlwZWxpbmVOYW1lXSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIHBpcGVsaW5lIGJ5IG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNyZW1vdmVQaXBlbGluZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBpcGVsaW5lTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwaXBlbGluZSB0byBiZSByZW1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlUGlwZWxpbmU6IGZ1bmN0aW9uIChwaXBlbGluZU5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGlwZWxpbmVzW3BpcGVsaW5lTmFtZV07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBwaXBlbGluZSBpbnN0YW5jZSBpbnRvIHRoZSBjb2xsZWN0aW9uIG9mIHBpcGVsaW5lc1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjYWRkUGlwZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwaXBlbGluZU5hbWUgLSBBIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IGZvciB0aGUgcGlwZWxpbmUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lfSBwaXBlbGluZUluc3RhbmNlIC0gQSBwaXBlbGluZSBpbnN0YW5jZSB3aGljaCBtdXN0IGV4dGVuZCBXZWJHTFBpcGVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFBpcGVsaW5lfSBUaGUgcGlwZWxpbmUgaW5zdGFuY2UgdGhhdCB3YXMgcGFzc2VkLlxyXG4gICAgICovXHJcbiAgICBhZGRQaXBlbGluZTogZnVuY3Rpb24gKHBpcGVsaW5lTmFtZSwgcGlwZWxpbmVJbnN0YW5jZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzUGlwZWxpbmUocGlwZWxpbmVOYW1lKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGlwZWxpbmVzW3BpcGVsaW5lTmFtZV0gPSBwaXBlbGluZUluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BpcGVsaW5lIGV4aXN0czogJyArIHBpcGVsaW5lTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwaXBlbGluZUluc3RhbmNlLm5hbWUgPSBwaXBlbGluZU5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMucGlwZWxpbmVzW3BpcGVsaW5lTmFtZV0ucmVzaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLmNvbmZpZy5yZXNvbHV0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBpcGVsaW5lSW5zdGFuY2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIGEgbmV3IHNjaXNzb3Igc3RhdGUuIFRoaXMgaXMgdXNlZCB0byBzZXQgbmVzdGVkIHNjaXNzb3Igc3RhdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcHVzaFNjaXNzb3JcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIHNjaXNzb3IuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHJhd2luZ0J1ZmZlckhlaWdodF0gLSBPcHRpb25hbCBkcmF3aW5nQnVmZmVySGVpZ2h0IG92ZXJyaWRlIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJbXX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgc2Npc3NvciB2YWx1ZXMuXHJcbiAgICAgKi9cclxuICAgIHB1c2hTY2lzc29yOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoZHJhd2luZ0J1ZmZlckhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLmRyYXdpbmdCdWZmZXJIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdmFyIHNjaXNzb3JTdGFjayA9IHRoaXMuc2Npc3NvclN0YWNrO1xyXG5cclxuICAgICAgICB2YXIgc2Npc3NvciA9IFsgeCwgeSwgd2lkdGgsIGhlaWdodCBdO1xyXG5cclxuICAgICAgICBzY2lzc29yU3RhY2sucHVzaChzY2lzc29yKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQsIGRyYXdpbmdCdWZmZXJIZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTY2lzc29yID0gc2Npc3NvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjaXNzb3I7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBzY2lzc29yIHN0YXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0U2Npc3NvclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgcG9zaXRpb24gb2YgdGhlIHNjaXNzb3IuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY2lzc29yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZHJhd2luZ0J1ZmZlckhlaWdodF0gLSBPcHRpb25hbCBkcmF3aW5nQnVmZmVySGVpZ2h0IG92ZXJyaWRlIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBzZXRTY2lzc29yOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgZHJhd2luZ0J1ZmZlckhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoZHJhd2luZ0J1ZmZlckhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLmRyYXdpbmdCdWZmZXJIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTY2lzc29yO1xyXG5cclxuICAgICAgICB2YXIgc2V0U2Npc3NvciA9ICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50ICYmIHNldFNjaXNzb3IpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3ggPSBjdXJyZW50WzBdO1xyXG4gICAgICAgICAgICB2YXIgY3kgPSBjdXJyZW50WzFdO1xyXG4gICAgICAgICAgICB2YXIgY3cgPSBjdXJyZW50WzJdO1xyXG4gICAgICAgICAgICB2YXIgY2ggPSBjdXJyZW50WzNdO1xyXG5cclxuICAgICAgICAgICAgc2V0U2Npc3NvciA9IChjeCAhPT0geCB8fCBjeSAhPT0geSB8fCBjdyAhPT0gd2lkdGggfHwgY2ggIT09IGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0U2Npc3NvcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvc2Npc3NvclxyXG4gICAgICAgICAgICBnbC5zY2lzc29yKHgsIChkcmF3aW5nQnVmZmVySGVpZ2h0IC0geSAtIGhlaWdodCksIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3BzIHRoZSBsYXN0IHNjaXNzb3Igc3RhdGUgYW5kIHNldHMgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNwb3BTY2lzc29yXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcG9wU2Npc3NvcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgc2Npc3NvclN0YWNrID0gdGhpcy5zY2lzc29yU3RhY2s7XHJcblxyXG4gICAgICAgIC8vICBSZW1vdmUgdGhlIGN1cnJlbnQgc2Npc3NvclxyXG4gICAgICAgIHNjaXNzb3JTdGFjay5wb3AoKTtcclxuXHJcbiAgICAgICAgLy8gIFJlc2V0IHRoZSBwcmV2aW91cyBzY2lzc29yXHJcbiAgICAgICAgdmFyIHNjaXNzb3IgPSBzY2lzc29yU3RhY2tbc2Npc3NvclN0YWNrLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICBpZiAoc2Npc3NvcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2Npc3NvcihzY2lzc29yWzBdLCBzY2lzc29yWzFdLCBzY2lzc29yWzJdLCBzY2lzc29yWzNdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFNjaXNzb3IgPSBzY2lzc29yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJpbmRzIGEgV2ViR0xQaXBlbGluZSBhbmQgc2V0cyBpdCBhcyB0aGUgY3VycmVudCBwaXBlbGluZSB0byBiZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0UGlwZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmV9IHBpcGVsaW5lSW5zdGFuY2UgLSBUaGUgcGlwZWxpbmUgaW5zdGFuY2UgdG8gYmUgYWN0aXZhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gW2dhbWVPYmplY3RdIC0gVGhlIEdhbWUgT2JqZWN0IHRoYXQgaW52b2tlZCB0aGlzIHBpcGVsaW5lLCBpZiBhbnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmV9IFRoZSBwaXBlbGluZSB0aGF0IHdhcyBhY3RpdmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIHNldFBpcGVsaW5lOiBmdW5jdGlvbiAocGlwZWxpbmVJbnN0YW5jZSwgZ2FtZU9iamVjdClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGlwZWxpbmUgIT09IHBpcGVsaW5lSW5zdGFuY2UgfHxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGlwZWxpbmUudmVydGV4QnVmZmVyICE9PSB0aGlzLmN1cnJlbnRWZXJ0ZXhCdWZmZXIgfHxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGlwZWxpbmUucHJvZ3JhbSAhPT0gdGhpcy5jdXJyZW50UHJvZ3JhbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGlwZWxpbmUgPSBwaXBlbGluZUluc3RhbmNlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQaXBlbGluZS5iaW5kKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRQaXBlbGluZS5vbkJpbmQoZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQaXBlbGluZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGVyZSBhbiBhY3RpdmUgc3RlbmNpbCBtYXNrP1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjaGFzQWN0aXZlU3RlbmNpbE1hc2tcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzdGVuY2lsIG1hc2ssIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBoYXNBY3RpdmVTdGVuY2lsTWFzazogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbWFzayA9IHRoaXMuY3VycmVudE1hc2subWFzaztcclxuICAgICAgICB2YXIgY2FtTWFzayA9IHRoaXMuY3VycmVudENhbWVyYU1hc2subWFzaztcclxuXHJcbiAgICAgICAgcmV0dXJuICgobWFzayAmJiBtYXNrLmlzU3RlbmNpbCkgfHwgKGNhbU1hc2sgJiYgY2FtTWFzay5pc1N0ZW5jaWwpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgdGhpcyB0byByZXNldCB0aGUgZ2wgY29udGV4dCB0byB0aGUgc3RhdGUgdGhhdCBQaGFzZXIgcmVxdWlyZXMgdG8gY29udGludWUgcmVuZGVyaW5nLlxyXG4gICAgICogQ2FsbGluZyB0aGlzIHdpbGw6XHJcbiAgICAgKiBcclxuICAgICAqICogRGlzYWJsZSBgREVQVEhfVEVTVGAsIGBDVUxMX0ZBQ0VgIGFuZCBgU1RFTkNJTF9URVNUYC5cclxuICAgICAqICogQ2xlYXIgdGhlIGRlcHRoIGJ1ZmZlciBhbmQgc3RlbmNpbCBidWZmZXJzLlxyXG4gICAgICogKiBSZXNldCB0aGUgdmlld3BvcnQgc2l6ZS5cclxuICAgICAqICogUmVzZXQgdGhlIGJsZW5kIG1vZGUuXHJcbiAgICAgKiAqIEJpbmQgYSBibGFuayB0ZXh0dXJlIGFzIHRoZSBhY3RpdmUgdGV4dHVyZSBvbiB0ZXh0dXJlIHVuaXQgemVyby5cclxuICAgICAqICogUmViaW5kcyB0aGUgZ2l2ZW4gcGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGhhdmluZyBwcmV2aW91c2x5IGNhbGxlZCBgY2xlYXJQaXBlbGluZWAgYW5kIHRoZW4gd2lzaGluZyB0byByZXR1cm5cclxuICAgICAqIGNvbnRyb2wgdG8gUGhhc2VyIGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcmViaW5kUGlwZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xQaXBlbGluZX0gcGlwZWxpbmVJbnN0YW5jZSAtIFRoZSBwaXBlbGluZSBpbnN0YW5jZSB0byBiZSBhY3RpdmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIHJlYmluZFBpcGVsaW5lOiBmdW5jdGlvbiAocGlwZWxpbmVJbnN0YW5jZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG5cclxuICAgICAgICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xyXG4gICAgICAgIGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQWN0aXZlU3RlbmNpbE1hc2soKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsLmNsZWFyKGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgdGhlcmUgd2Fzbid0IGEgc3RlbmNpbCBtYXNrIHNldCBiZWZvcmUgdGhpcyBjYWxsLCB3ZSBjYW4gZGlzYWJsZSBpdCBzYWZlbHlcclxuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5ERVBUSF9CVUZGRVJfQklUIHwgZ2wuU1RFTkNJTF9CVUZGRVJfQklUKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRCbGVuZE1vZGUoMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xyXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMuYmxhbmtUZXh0dXJlLmdsVGV4dHVyZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudEFjdGl2ZVRleHR1cmVVbml0ID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRUZXh0dXJlc1swXSA9IHRoaXMuYmxhbmtUZXh0dXJlLmdsVGV4dHVyZTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGlwZWxpbmUgPSBwaXBlbGluZUluc3RhbmNlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBpcGVsaW5lLmJpbmQoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQaXBlbGluZS5vbkJpbmQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbHVzaGVzIHRoZSBjdXJyZW50IFdlYkdMUGlwZWxpbmUgYmVpbmcgdXNlZCBhbmQgdGhlbiBjbGVhcnMgaXQsIGFsb25nIHdpdGggdGhlXHJcbiAgICAgKiB0aGUgY3VycmVudCBzaGFkZXIgcHJvZ3JhbSBhbmQgdmVydGV4IGJ1ZmZlci4gVGhlbiByZXNldHMgdGhlIGJsZW5kIG1vZGUgdG8gTk9STUFMLlxyXG4gICAgICogQ2FsbCB0aGlzIGJlZm9yZSBqdW1waW5nIHRvIHlvdXIgb3duIGdsIGNvbnRleHQgaGFuZGxlciwgYW5kIHRoZW4gY2FsbCBgcmViaW5kUGlwZWxpbmVgIHdoZW5cclxuICAgICAqIHlvdSB3aXNoIHRvIHJldHVybiBjb250cm9sIHRvIFBoYXNlciBhZ2Fpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2NsZWFyUGlwZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgY2xlYXJQaXBlbGluZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZsdXNoKCk7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFBpcGVsaW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQcm9ncmFtID0gbnVsbDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRWZXJ0ZXhCdWZmZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4QnVmZmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRCbGVuZE1vZGUoMCwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYmxlbmQgbW9kZSB0byB0aGUgdmFsdWUgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIGN1cnJlbnQgYmxlbmQgbW9kZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGdpdmVuLCB0aGUgcGlwZWxpbmUgaXMgZmx1c2hlZCBhbmQgdGhlIG5ld1xyXG4gICAgICogYmxlbmQgbW9kZSBpcyBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0QmxlbmRNb2RlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGJsZW5kTW9kZUlkIC0gVGhlIGJsZW5kIG1vZGUgdG8gYmUgc2V0LiBDYW4gYmUgYSBgQmxlbmRNb2Rlc2AgY29uc3Qgb3IgYW4gaW50ZWdlciB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIEZvcmNlIHRoZSBibGVuZCBtb2RlIHRvIGJlIHNldCwgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudGx5IHNldCBibGVuZCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYmxlbmQgbW9kZSB3YXMgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIGNhbGwsIGZvcmNpbmcgYSBmbHVzaCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHNldEJsZW5kTW9kZTogZnVuY3Rpb24gKGJsZW5kTW9kZUlkLCBmb3JjZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCkgeyBmb3JjZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIGJsZW5kTW9kZSA9IHRoaXMuYmxlbmRNb2Rlc1tibGVuZE1vZGVJZF07XHJcblxyXG4gICAgICAgIGlmIChmb3JjZSB8fCAoYmxlbmRNb2RlSWQgIT09IENPTlNULkJsZW5kTW9kZXMuU0tJUF9DSEVDSyAmJiB0aGlzLmN1cnJlbnRCbGVuZE1vZGUgIT09IGJsZW5kTW9kZUlkKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XHJcbiAgICAgICAgICAgIGdsLmJsZW5kRXF1YXRpb24oYmxlbmRNb2RlLmVxdWF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChibGVuZE1vZGUuZnVuYy5sZW5ndGggPiAyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShibGVuZE1vZGUuZnVuY1swXSwgYmxlbmRNb2RlLmZ1bmNbMV0sIGJsZW5kTW9kZS5mdW5jWzJdLCBibGVuZE1vZGUuZnVuY1szXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmMoYmxlbmRNb2RlLmZ1bmNbMF0sIGJsZW5kTW9kZS5mdW5jWzFdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50QmxlbmRNb2RlID0gYmxlbmRNb2RlSWQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGN1c3RvbSBibGVuZCBtb2RlIGZvciB0aGUgcmVuZGVyZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViR0xfQVBJL0NvbnN0YW50cyNCbGVuZGluZ19tb2Rlc1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjYWRkQmxlbmRNb2RlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0dMZW51bVtdfSBmdW5jIC0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgV2ViR0wgZnVuY3Rpb25zIHRvIHVzZSBmb3IgdGhlIHNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uIGJsZW5kaW5nIGZhY3RvcnMsIHJlc3BlY3RpdmVseS4gU2VlIHRoZSBwb3NzaWJsZSBjb25zdGFudHMgZm9yIHtAbGluayBXZWJHTFJlbmRlcmluZ0NvbnRleHQjYmxlbmRGdW5jKCl9LlxyXG4gICAgICogQHBhcmFtIHtHTGVudW19IGVxdWF0aW9uIC0gVGhlIGVxdWF0aW9uIHRvIHVzZSBmb3IgY29tYmluaW5nIHRoZSBSR0IgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgYSBuZXcgcGl4ZWwgd2l0aCBhIHJlbmRlcmVkIG9uZS4gU2VlIHRoZSBwb3NzaWJsZSBjb25zdGFudHMgZm9yIHtAbGluayBXZWJHTFJlbmRlcmluZ0NvbnRleHQjYmxlbmRFcXVhdGlvbigpfS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgaW5kZXggb2YgdGhlIG5ldyBibGVuZCBtb2RlLCB1c2VkIGZvciByZWZlcmVuY2luZyBpdCBpbiB0aGUgZnV0dXJlLlxyXG4gICAgICovXHJcbiAgICBhZGRCbGVuZE1vZGU6IGZ1bmN0aW9uIChmdW5jLCBlcXVhdGlvbilcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmJsZW5kTW9kZXMucHVzaCh7IGZ1bmM6IGZ1bmMsIGVxdWF0aW9uOiBlcXVhdGlvbiB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluZGV4IC0gMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBmdW5jdGlvbiBib3VuZCB0byBhIGdpdmVuIGN1c3RvbSBibGVuZCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjdXBkYXRlQmxlbmRNb2RlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjdXN0b20gYmxlbmQgbW9kZS5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gdXNlIGZvciB0aGUgYmxlbmQgbW9kZS5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVxdWF0aW9uIC0gVGhlIGVxdWF0aW9uIHRvIHVzZSBmb3IgdGhlIGJsZW5kIG1vZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVCbGVuZE1vZGU6IGZ1bmN0aW9uIChpbmRleCwgZnVuYywgZXF1YXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRNb2Rlc1tpbmRleF0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJsZW5kTW9kZXNbaW5kZXhdLmZ1bmMgPSBmdW5jO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVxdWF0aW9uKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsZW5kTW9kZXNbaW5kZXhdLmVxdWF0aW9uID0gZXF1YXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjdXN0b20gYmxlbmQgbW9kZSBmcm9tIHRoZSByZW5kZXJlci5cclxuICAgICAqIEFueSBHYW1lIE9iamVjdHMgc3RpbGwgdXNpbmcgdGhpcyBibGVuZCBtb2RlIHdpbGwgZXJyb3IsIHNvIGJlIHN1cmUgdG8gY2xlYXIgdGhlbSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3JlbW92ZUJsZW5kTW9kZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY3VzdG9tIGJsZW5kIG1vZGUgdG8gYmUgcmVtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUJsZW5kTW9kZTogZnVuY3Rpb24gKGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChpbmRleCA+IDE3ICYmIHRoaXMuYmxlbmRNb2Rlc1tpbmRleF0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJsZW5kTW9kZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgZm9yIHRleHR1cmUgdW5pdCB6ZXJvIHRvIGJlIGEgYmxhbmsgdGV4dHVyZS5cclxuICAgICAqIFRoaXMgb25seSBoYXBwZW5zIGlmIHRoZXJlIGlzbid0IGEgdGV4dHVyZSBhbHJlYWR5IGluIHVzZSBieSB0ZXh0dXJlIHVuaXQgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEJsYW5rVGV4dHVyZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBGb3JjZSBhIGJsYW5rIHRleHR1cmUgc2V0LCByZWdhcmRsZXNzIG9mIHdoYXQncyBhbHJlYWR5IGJvdW5kP1xyXG4gICAgICovXHJcbiAgICBzZXRCbGFua1RleHR1cmU6IGZ1bmN0aW9uIChmb3JjZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCkgeyBmb3JjZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIGlmIChmb3JjZSB8fCB0aGlzLmN1cnJlbnRBY3RpdmVUZXh0dXJlVW5pdCAhPT0gMCB8fCAhdGhpcy5jdXJyZW50VGV4dHVyZXNbMF0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRleHR1cmUyRCh0aGlzLmJsYW5rVGV4dHVyZS5nbFRleHR1cmUsIDApO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyBhIHRleHR1cmUgYXQgYSB0ZXh0dXJlIHVuaXQuIElmIGEgdGV4dHVyZSBpcyBhbHJlYWR5XHJcbiAgICAgKiBib3VuZCB0byB0aGF0IHVuaXQgaXQgd2lsbCBmb3JjZSBhIGZsdXNoIG9uIHRoZSBjdXJyZW50IHBpcGVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0VGV4dHVyZTJEXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBXZWJHTCB0ZXh0dXJlIHRoYXQgbmVlZHMgdG8gYmUgYm91bmQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRleHR1cmVVbml0IC0gVGhlIHRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSB3aWxsIGJlIGJvdW5kLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmx1c2g9dHJ1ZV0gLSBXaWxsIHRoZSBjdXJyZW50IHBpcGVsaW5lIGJlIGZsdXNoZWQgaWYgdGhpcyBpcyBhIG5ldyB0ZXh0dXJlLCBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRUZXh0dXJlMkQ6IGZ1bmN0aW9uICh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgZmx1c2gpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZsdXNoID09PSB1bmRlZmluZWQpIHsgZmx1c2ggPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0dXJlICE9PSB0aGlzLmN1cnJlbnRUZXh0dXJlc1t0ZXh0dXJlVW5pdF0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZmx1c2gpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEFjdGl2ZVRleHR1cmVVbml0ICE9PSB0ZXh0dXJlVW5pdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHRleHR1cmVVbml0KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBY3RpdmVUZXh0dXJlVW5pdCA9IHRleHR1cmVVbml0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRleHR1cmVzW3RleHR1cmVVbml0XSA9IHRleHR1cmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyBhIGZyYW1lYnVmZmVyLiBJZiB0aGVyZSB3YXMgYW5vdGhlciBmcmFtZWJ1ZmZlciBhbHJlYWR5IGJvdW5kIGl0IHdpbGwgZm9yY2UgYSBwaXBlbGluZSBmbHVzaC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEZyYW1lYnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIGZyYW1lYnVmZmVyIHRoYXQgbmVlZHMgdG8gYmUgYm91bmQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVTY2lzc29yPWZhbHNlXSAtIElmIGEgZnJhbWVidWZmZXIgaXMgZ2l2ZW4sIHNldCB0aGUgZ2wgc2Npc3NvciB0byBtYXRjaCB0aGUgZnJhbWUgYnVmZmVyIHNpemU/IE9yLCBpZiBgbnVsbGAgZ2l2ZW4sIHBvcCB0aGUgc2Npc3NvciBmcm9tIHRoZSBzdGFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZyYW1lYnVmZmVyOiBmdW5jdGlvbiAoZnJhbWVidWZmZXIsIHVwZGF0ZVNjaXNzb3IpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZVNjaXNzb3IgPT09IHVuZGVmaW5lZCkgeyB1cGRhdGVTY2lzc29yID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChmcmFtZWJ1ZmZlciAhPT0gdGhpcy5jdXJyZW50RnJhbWVidWZmZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZnJhbWVidWZmZXIgJiYgZnJhbWVidWZmZXIucmVuZGVyVGV4dHVyZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBmcmFtZWJ1ZmZlci5yZW5kZXJUZXh0dXJlLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gZnJhbWVidWZmZXIucmVuZGVyVGV4dHVyZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXBkYXRlU2Npc3NvcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lYnVmZmVyKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd2luZ0J1ZmZlckhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoU2Npc3NvcigwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdpbmdCdWZmZXJIZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3BTY2lzc29yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCaW5kcyBhIHByb2dyYW0uIElmIHRoZXJlIHdhcyBhbm90aGVyIHByb2dyYW0gYWxyZWFkeSBib3VuZCBpdCB3aWxsIGZvcmNlIGEgcGlwZWxpbmUgZmx1c2guXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRQcm9ncmFtXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSBwcm9ncmFtIHRoYXQgbmVlZHMgdG8gYmUgYm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRQcm9ncmFtOiBmdW5jdGlvbiAocHJvZ3JhbSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG5cclxuICAgICAgICBpZiAocHJvZ3JhbSAhPT0gdGhpcy5jdXJyZW50UHJvZ3JhbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJvdW5kcyBhIHZlcnRleCBidWZmZXIuIElmIHRoZXJlIGlzIGEgdmVydGV4IGJ1ZmZlciBhbHJlYWR5IGJvdW5kIGl0J2xsIGZvcmNlIGEgcGlwZWxpbmUgZmx1c2guXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRWZXJ0ZXhCdWZmZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IHZlcnRleEJ1ZmZlciAtIFRoZSBidWZmZXIgdGhhdCBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFZlcnRleEJ1ZmZlcjogZnVuY3Rpb24gKHZlcnRleEJ1ZmZlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG5cclxuICAgICAgICBpZiAodmVydGV4QnVmZmVyICE9PSB0aGlzLmN1cnJlbnRWZXJ0ZXhCdWZmZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XHJcblxyXG4gICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZlcnRleEJ1ZmZlciA9IHZlcnRleEJ1ZmZlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJvdW5kcyBhIGluZGV4IGJ1ZmZlci4gSWYgdGhlcmUgaXMgYSBpbmRleCBidWZmZXIgYWxyZWFkeSBib3VuZCBpdCdsbCBmb3JjZSBhIHBpcGVsaW5lIGZsdXNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0SW5kZXhCdWZmZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGluZGV4QnVmZmVyIC0gVGhlIGJ1ZmZlciB0aGUgbmVlZHMgdG8gYmUgYm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbmRleEJ1ZmZlcjogZnVuY3Rpb24gKGluZGV4QnVmZmVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIGlmIChpbmRleEJ1ZmZlciAhPT0gdGhpcy5jdXJyZW50SW5kZXhCdWZmZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XHJcblxyXG4gICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRleEJ1ZmZlcik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHRleHR1cmUgZnJvbSBhbiBpbWFnZSBzb3VyY2UuIElmIHRoZSBzb3VyY2UgaXMgbm90IHZhbGlkIGl0IGNyZWF0ZXMgYW4gZW1wdHkgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2NyZWF0ZVRleHR1cmVGcm9tU291cmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHNjYWxlTW9kZSAtIFRoZSBzY2FsZSBtb2RlIHRvIGJlIHVzZWQgYnkgdGhlIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1dlYkdMVGV4dHVyZX0gVGhlIFdlYkdMIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIGl0IGNvdWxkbid0IGJlIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRleHR1cmVGcm9tU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCB3aWR0aCwgaGVpZ2h0LCBzY2FsZU1vZGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgbWluRmlsdGVyID0gZ2wuTkVBUkVTVDtcclxuICAgICAgICB2YXIgbWFnRmlsdGVyID0gZ2wuTkVBUkVTVDtcclxuICAgICAgICB2YXIgd3JhcCA9IGdsLkNMQU1QX1RPX0VER0U7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICB3aWR0aCA9IHNvdXJjZSA/IHNvdXJjZS53aWR0aCA6IHdpZHRoO1xyXG4gICAgICAgIGhlaWdodCA9IHNvdXJjZSA/IHNvdXJjZS5oZWlnaHQgOiBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBwb3cgPSBJc1NpemVQb3dlck9mVHdvKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAocG93KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3JhcCA9IGdsLlJFUEVBVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzY2FsZU1vZGUgPT09IENPTlNULlNjYWxlTW9kZXMuTElORUFSICYmIHRoaXMuY29uZmlnLmFudGlhbGlhcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG1pbkZpbHRlciA9IChwb3cpID8gdGhpcy5taXBtYXBGaWx0ZXIgOiBnbC5MSU5FQVI7XHJcbiAgICAgICAgICAgIG1hZ0ZpbHRlciA9IGdsLkxJTkVBUjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc291cmNlICYmIHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGhlaWdodCA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGVUZXh0dXJlMkQoMCwgbWluRmlsdGVyLCBtYWdGaWx0ZXIsIHdyYXAsIHdyYXAsIGdsLlJHQkEsIG51bGwsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGVUZXh0dXJlMkQoMCwgbWluRmlsdGVyLCBtYWdGaWx0ZXIsIHdyYXAsIHdyYXAsIGdsLlJHQkEsIHNvdXJjZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHdyYXBwZXIgZm9yIGNyZWF0aW5nIGEgV2ViR0xUZXh0dXJlLiBJZiBubyBwaXhlbCBkYXRhIGlzIHBhc3NlZCBpdCB3aWxsIGNyZWF0ZSBhbiBlbXB0eSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY3JlYXRlVGV4dHVyZTJEXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1pcExldmVsIC0gTWlwIGxldmVsIG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBtaW5GaWx0ZXIgLSBGaWx0ZXJpbmcgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1hZ0ZpbHRlciAtIEZpbHRlcmluZyBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd3JhcFQgLSBXcmFwcGluZyBtb2RlIG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB3cmFwUyAtIFdyYXBwaW5nIG1vZGUgb2YgdGhlIHRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGZvcm1hdCAtIFdoaWNoIGZvcm1hdCBkb2VzIHRoZSB0ZXh0dXJlIHVzZS5cclxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gcGl4ZWxzIC0gcGl4ZWwgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBXaWR0aCBvZiB0aGUgdGV4dHVyZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIEhlaWdodCBvZiB0aGUgdGV4dHVyZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwbWE9dHJ1ZV0gLSBEb2VzIHRoZSB0ZXh0dXJlIGhhdmUgcHJlbXVsdGlwbGllZCBhbHBoYT9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlU2l6ZT1mYWxzZV0gLSBJZiBgdHJ1ZWAgaXQgd2lsbCB1c2UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHRoZSBwaXhlbHMgZGltZW5zaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxpcFk9ZmFsc2VdIC0gU2V0cyB0aGUgYFVOUEFDS19GTElQX1lfV0VCR0xgIGZsYWcgdGhlIFdlYkdMIFRleHR1cmUgdXNlcyBkdXJpbmcgdXBsb2FkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1dlYkdMVGV4dHVyZX0gVGhlIFdlYkdMVGV4dHVyZSB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVUZXh0dXJlMkQ6IGZ1bmN0aW9uIChtaXBMZXZlbCwgbWluRmlsdGVyLCBtYWdGaWx0ZXIsIHdyYXBULCB3cmFwUywgZm9ybWF0LCBwaXhlbHMsIHdpZHRoLCBoZWlnaHQsIHBtYSwgZm9yY2VTaXplLCBmbGlwWSlcclxuICAgIHtcclxuICAgICAgICBwbWEgPSAocG1hID09PSB1bmRlZmluZWQgfHwgcG1hID09PSBudWxsKSA/IHRydWUgOiBwbWE7XHJcbiAgICAgICAgaWYgKGZvcmNlU2l6ZSA9PT0gdW5kZWZpbmVkKSB7IGZvcmNlU2l6ZSA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGZsaXBZID09PSB1bmRlZmluZWQpIHsgZmxpcFkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFRleHR1cmUyRCh0ZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlcik7XHJcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIG1hZ0ZpbHRlcik7XHJcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgd3JhcFMpO1xyXG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXBUKTtcclxuXHJcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBwbWEpO1xyXG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsIGZsaXBZKTtcclxuXHJcbiAgICAgICAgaWYgKHBpeGVscyA9PT0gbnVsbCB8fCBwaXhlbHMgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgbWlwTGV2ZWwsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFmb3JjZVNpemUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gcGl4ZWxzLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gcGl4ZWxzLmhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCBtaXBMZXZlbCwgZm9ybWF0LCBmb3JtYXQsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoSXNTaXplUG93ZXJPZlR3byh3aWR0aCwgaGVpZ2h0KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlMkQobnVsbCwgMCk7XHJcblxyXG4gICAgICAgIHRleHR1cmUuaXNBbHBoYVByZW11bHRpcGxpZWQgPSBwbWE7XHJcbiAgICAgICAgdGV4dHVyZS5pc1JlbmRlclRleHR1cmUgPSBmYWxzZTtcclxuICAgICAgICB0ZXh0dXJlLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGV4dHVyZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHRoaXMubmF0aXZlVGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV3JhcHBlciBmb3IgY3JlYXRpbmcgV2ViR0xGcmFtZWJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2NyZWF0ZUZyYW1lYnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gV2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBmcmFtZWJ1ZmZlclxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBIZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBmcmFtZWJ1ZmZlclxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IHJlbmRlclRleHR1cmUgLSBUaGUgY29sb3IgdGV4dHVyZSB0byB3aGVyZSB0aGUgY29sb3IgcGl4ZWxzIGFyZSB3cml0dGVuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFkZERlcHRoU3RlbmNpbEJ1ZmZlciAtIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCBmcmFtZWJ1ZmZlciBzdXBwb3J0IGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnNcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtXZWJHTEZyYW1lYnVmZmVyfSBSYXcgV2ViR0xGcmFtZWJ1ZmZlclxyXG4gICAgICovXHJcbiAgICBjcmVhdGVGcmFtZWJ1ZmZlcjogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIHJlbmRlclRleHR1cmUsIGFkZERlcHRoU3RlbmNpbEJ1ZmZlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciBmcmFtZWJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcbiAgICAgICAgdmFyIGNvbXBsZXRlID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7XHJcblxyXG4gICAgICAgIGlmIChhZGREZXB0aFN0ZW5jaWxCdWZmZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGVwdGhTdGVuY2lsQnVmZmVyID0gZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XHJcbiAgICAgICAgICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCBkZXB0aFN0ZW5jaWxCdWZmZXIpO1xyXG4gICAgICAgICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIGdsLlJFTkRFUkJVRkZFUiwgZGVwdGhTdGVuY2lsQnVmZmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlclRleHR1cmUuaXNSZW5kZXJUZXh0dXJlID0gdHJ1ZTtcclxuICAgICAgICByZW5kZXJUZXh0dXJlLmlzQWxwaGFQcmVtdWx0aXBsaWVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgcmVuZGVyVGV4dHVyZSwgMCk7XHJcblxyXG4gICAgICAgIGNvbXBsZXRlID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUik7XHJcblxyXG4gICAgICAgIGlmIChjb21wbGV0ZSAhPT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZXJyb3JzID0ge1xyXG4gICAgICAgICAgICAgICAgMzYwNTQ6ICdJbmNvbXBsZXRlIEF0dGFjaG1lbnQnLFxyXG4gICAgICAgICAgICAgICAgMzYwNTU6ICdNaXNzaW5nIEF0dGFjaG1lbnQnLFxyXG4gICAgICAgICAgICAgICAgMzYwNTc6ICdJbmNvbXBsZXRlIERpbWVuc2lvbnMnLFxyXG4gICAgICAgICAgICAgICAgMzYwNjE6ICdGcmFtZWJ1ZmZlciBVbnN1cHBvcnRlZCdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnJhbWVidWZmZXIgaW5jb21wbGV0ZS4gRnJhbWVidWZmZXIgc3RhdHVzOiAnICsgZXJyb3JzW2NvbXBsZXRlXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmcmFtZWJ1ZmZlci5yZW5kZXJUZXh0dXJlID0gcmVuZGVyVGV4dHVyZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlcihudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZyYW1lYnVmZmVyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyYXBwZXIgZm9yIGNyZWF0aW5nIGEgV2ViR0xQcm9ncmFtXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjcmVhdGVQcm9ncmFtXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVydGV4U2hhZGVyIC0gU291cmNlIHRvIHRoZSB2ZXJ0ZXggc2hhZGVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJhZ21lbnRTaGFkZXIgLSBTb3VyY2UgdG8gdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1dlYkdMUHJvZ3JhbX0gUmF3IFdlYkdMUHJvZ3JhbVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVQcm9ncmFtOiBmdW5jdGlvbiAodmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xyXG4gICAgICAgIHZhciB2cyA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcclxuICAgICAgICB2YXIgZnMgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcclxuXHJcbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKHZzLCB2ZXJ0ZXhTaGFkZXIpO1xyXG4gICAgICAgIGdsLnNoYWRlclNvdXJjZShmcywgZnJhZ21lbnRTaGFkZXIpO1xyXG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodnMpO1xyXG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnMpO1xyXG5cclxuICAgICAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcih2cywgZ2wuQ09NUElMRV9TVEFUVVMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY29tcGlsZSBWZXJ0ZXggU2hhZGVyOlxcbicgKyBnbC5nZXRTaGFkZXJJbmZvTG9nKHZzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZzLCBnbC5DT01QSUxFX1NUQVRVUykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb21waWxlIEZyYWdtZW50IFNoYWRlcjpcXG4nICsgZ2wuZ2V0U2hhZGVySW5mb0xvZyhmcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZzKTtcclxuICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnMpO1xyXG4gICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGluayBwcm9ncmFtOlxcbicgKyBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcmFwcGVyIGZvciBjcmVhdGluZyBhIHZlcnRleCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjcmVhdGVWZXJ0ZXhCdWZmZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGluaXRpYWxEYXRhT3JTaXplIC0gSXQncyBlaXRoZXIgQXJyYXlCdWZmZXIgb3IgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSB2Ym9cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYnVmZmVyVXNhZ2UgLSBIb3cgdGhlIGJ1ZmZlciBpcyB1c2VkLiBnbC5EWU5BTUlDX0RSQVcsIGdsLlNUQVRJQ19EUkFXIG9yIGdsLlNUUkVBTV9EUkFXXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7V2ViR0xCdWZmZXJ9IFJhdyB2ZXJ0ZXggYnVmZmVyXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVZlcnRleEJ1ZmZlcjogZnVuY3Rpb24gKGluaXRpYWxEYXRhT3JTaXplLCBidWZmZXJVc2FnZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciB2ZXJ0ZXhCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRWZXJ0ZXhCdWZmZXIodmVydGV4QnVmZmVyKTtcclxuXHJcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGluaXRpYWxEYXRhT3JTaXplLCBidWZmZXJVc2FnZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VmVydGV4QnVmZmVyKG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmVydGV4QnVmZmVyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyYXBwZXIgZm9yIGNyZWF0aW5nIGEgdmVydGV4IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2NyZWF0ZUluZGV4QnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBpbml0aWFsRGF0YU9yU2l6ZSAtIEVpdGhlciBBcnJheUJ1ZmZlciBvciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIHNpemUgb2YgdGhlIHZiby5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYnVmZmVyVXNhZ2UgLSBIb3cgdGhlIGJ1ZmZlciBpcyB1c2VkLiBnbC5EWU5BTUlDX0RSQVcsIGdsLlNUQVRJQ19EUkFXIG9yIGdsLlNUUkVBTV9EUkFXLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1dlYkdMQnVmZmVyfSBSYXcgaW5kZXggYnVmZmVyXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUluZGV4QnVmZmVyOiBmdW5jdGlvbiAoaW5pdGlhbERhdGFPclNpemUsIGJ1ZmZlclVzYWdlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIGluZGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0SW5kZXhCdWZmZXIoaW5kZXhCdWZmZXIpO1xyXG5cclxuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbml0aWFsRGF0YU9yU2l6ZSwgYnVmZmVyVXNhZ2UpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEluZGV4QnVmZmVyKG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXhCdWZmZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdGV4dHVyZSBmcm9tIHRoZSBuYXRpdmVUZXh0dXJlcyBhcnJheSBhbmQgdGhlbiBkZWxldGVzIGl0IGZyb20gdGhlIEdQVS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2RlbGV0ZVRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIFdlYkdMIFRleHR1cmUgdG8gYmUgZGVsZXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVRleHR1cmU6IGZ1bmN0aW9uICh0ZXh0dXJlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMubmF0aXZlVGV4dHVyZXMuaW5kZXhPZih0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNwbGljZU9uZSh0aGlzLm5hdGl2ZVRleHR1cmVzLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRUZXh0dXJlc1swXSA9PT0gdGV4dHVyZSAmJiAhdGhpcy5nYW1lLnBlbmRpbmdEZXN0cm95KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHRleHR1cmUgd2UganVzdCBkZWxldGVkIGlzIGluIHVzZSwgc28gYmluZCBhIGJsYW5rIHRleHR1cmVcclxuICAgICAgICAgICAgdGhpcy5zZXRCbGFua1RleHR1cmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIGEgV2ViR0xGcmFtZWJ1ZmZlciBmcm9tIHRoZSBHTCBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2RlbGV0ZUZyYW1lYnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIEZyYW1lYnVmZmVyIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBkZWxldGVGcmFtZWJ1ZmZlcjogZnVuY3Rpb24gKGZyYW1lYnVmZmVyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGVzIGEgV2ViR0xQcm9ncmFtIGZyb20gdGhlIEdMIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZGVsZXRlUHJvZ3JhbVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFByb2dyYW19IHByb2dyYW0gLSBUaGUgc2hhZGVyIHByb2dyYW0gdG8gYmUgZGVsZXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZVByb2dyYW06IGZ1bmN0aW9uIChwcm9ncmFtKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlcyBhIFdlYkdMQnVmZmVyIGZyb20gdGhlIEdMIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZGVsZXRlQnVmZmVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMQnVmZmVyfSB2ZXJ0ZXhCdWZmZXIgLSBUaGUgV2ViR0xCdWZmZXIgdG8gYmUgZGVsZXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZUJ1ZmZlcjogZnVuY3Rpb24gKGJ1ZmZlcilcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250cm9scyB0aGUgcHJlLXJlbmRlciBvcGVyYXRpb25zIGZvciB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG4gICAgICogSGFuZGxlcyBhbnkgY2xpcHBpbmcgbmVlZGVkIGJ5IHRoZSBjYW1lcmEgYW5kIHJlbmRlcnMgdGhlIGJhY2tncm91bmQgY29sb3IgaWYgYSBjb2xvciBpcyB2aXNpYmxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcHJlUmVuZGVyQ2FtZXJhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIHByZS1yZW5kZXIuXHJcbiAgICAgKi9cclxuICAgIHByZVJlbmRlckNhbWVyYTogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgY3ggPSBjYW1lcmEuX2N4O1xyXG4gICAgICAgIHZhciBjeSA9IGNhbWVyYS5fY3k7XHJcbiAgICAgICAgdmFyIGN3ID0gY2FtZXJhLl9jdztcclxuICAgICAgICB2YXIgY2ggPSBjYW1lcmEuX2NoO1xyXG5cclxuICAgICAgICB2YXIgVGV4dHVyZVRpbnRQaXBlbGluZSA9IHRoaXMucGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmU7XHJcblxyXG4gICAgICAgIHZhciBjb2xvciA9IGNhbWVyYS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucmVuZGVyVG9UZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wdXNoU2Npc3NvcihjeCwgY3ksIGN3LCAtY2gpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlcihjYW1lcmEuZnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XHJcblxyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcclxuXHJcbiAgICAgICAgICAgIFRleHR1cmVUaW50UGlwZWxpbmUucHJvak9ydGhvKGN4LCBjdyArIGN4LCBjeSwgY2ggKyBjeSwgLTEwMDAsIDEwMDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5tYXNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNYXNrLm1hc2sgPSBjYW1lcmEubWFzaztcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2suY2FtZXJhID0gY2FtZXJhLl9tYXNrQ2FtZXJhO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhbWVyYS5tYXNrLnByZVJlbmRlcldlYkdMKHRoaXMsIGNhbWVyYSwgY2FtZXJhLl9tYXNrQ2FtZXJhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbG9yLmFscGhhR0wgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBUZXh0dXJlVGludFBpcGVsaW5lLmRyYXdGaWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICBjeCwgY3ksIGN3ICsgY3gsIGNoICsgY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0VGludEZyb21GbG9hdHMoY29sb3IucmVkR0wsIGNvbG9yLmdyZWVuR0wsIGNvbG9yLmJsdWVHTCwgMSksXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYWxwaGFHTFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY2FtZXJhLmVtaXQoQ2FtZXJhRXZlbnRzLlBSRV9SRU5ERVIsIGNhbWVyYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaFNjaXNzb3IoY3gsIGN5LCBjdywgY2gpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbWVyYS5tYXNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNYXNrLm1hc2sgPSBjYW1lcmEubWFzaztcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2suY2FtZXJhID0gY2FtZXJhLl9tYXNrQ2FtZXJhO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhbWVyYS5tYXNrLnByZVJlbmRlcldlYkdMKHRoaXMsIGNhbWVyYSwgY2FtZXJhLl9tYXNrQ2FtZXJhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbG9yLmFscGhhR0wgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBUZXh0dXJlVGludFBpcGVsaW5lLmRyYXdGaWxsUmVjdChcclxuICAgICAgICAgICAgICAgICAgICBjeCwgY3ksIGN3ICwgY2gsXHJcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0VGludEZyb21GbG9hdHMoY29sb3IucmVkR0wsIGNvbG9yLmdyZWVuR0wsIGNvbG9yLmJsdWVHTCwgMSksXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYWxwaGFHTFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0Q3VycmVudFN0ZW5jaWxNYXNrOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwcmV2ID0gbnVsbDtcclxuICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLm1hc2tTdGFjaztcclxuICAgICAgICB2YXIgY2FtZXJhTWFzayA9IHRoaXMuY3VycmVudENhbWVyYU1hc2s7XHJcblxyXG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJldiA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjYW1lcmFNYXNrLm1hc2sgJiYgY2FtZXJhTWFzay5tYXNrLmlzU3RlbmNpbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByZXYgPSBjYW1lcmFNYXNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXY7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgdGhlIHBvc3QtcmVuZGVyIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBjYW1lcmEuXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBmb3JlZ3JvdW5kIGNhbWVyYSBlZmZlY3RzIGxpa2UgZmxhc2ggYW5kIGZhZGluZy4gSXQgcmVzZXRzIHRoZSBjdXJyZW50IHNjaXNzb3Igc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNwb3N0UmVuZGVyQ2FtZXJhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIHBvc3QtcmVuZGVyLlxyXG4gICAgICovXHJcbiAgICBwb3N0UmVuZGVyQ2FtZXJhOiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0UGlwZWxpbmUodGhpcy5waXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIFRleHR1cmVUaW50UGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lO1xyXG5cclxuICAgICAgICBjYW1lcmEuZmxhc2hFZmZlY3QucG9zdFJlbmRlcldlYkdMKFRleHR1cmVUaW50UGlwZWxpbmUsIFV0aWxzLmdldFRpbnRGcm9tRmxvYXRzKTtcclxuICAgICAgICBjYW1lcmEuZmFkZUVmZmVjdC5wb3N0UmVuZGVyV2ViR0woVGV4dHVyZVRpbnRQaXBlbGluZSwgVXRpbHMuZ2V0VGludEZyb21GbG9hdHMpO1xyXG5cclxuICAgICAgICBjYW1lcmEuZGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3BTY2lzc29yKCk7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucmVuZGVyVG9UZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgVGV4dHVyZVRpbnRQaXBlbGluZS5mbHVzaCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlcihudWxsKTtcclxuXHJcbiAgICAgICAgICAgIGNhbWVyYS5lbWl0KENhbWVyYUV2ZW50cy5QT1NUX1JFTkRFUiwgY2FtZXJhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYW1lcmEucmVuZGVyVG9HYW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBUZXh0dXJlVGludFBpcGVsaW5lLnByb2pPcnRobygwLCBUZXh0dXJlVGludFBpcGVsaW5lLndpZHRoLCBUZXh0dXJlVGludFBpcGVsaW5lLmhlaWdodCwgMCwgLTEwMDAuMCwgMTAwMC4wKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZ2V0VGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICB2YXIgcGlwZWxpbmUgPSAoY2FtZXJhLnBpcGVsaW5lKSA/IGNhbWVyYS5waXBlbGluZSA6IFRleHR1cmVUaW50UGlwZWxpbmU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHBpcGVsaW5lLmJhdGNoVGV4dHVyZShcclxuICAgICAgICAgICAgICAgICAgICBjYW1lcmEsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLmdsVGV4dHVyZSxcclxuICAgICAgICAgICAgICAgICAgICBjYW1lcmEud2lkdGgsIGNhbWVyYS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLngsIGNhbWVyYS55LFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYS53aWR0aCwgY2FtZXJhLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBjYW1lcmEuem9vbSwgY2FtZXJhLnpvb20sXHJcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnJvdGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYS5mbGlwWCwgIWNhbWVyYS5mbGlwWSxcclxuICAgICAgICAgICAgICAgICAgICAxLCAxLFxyXG4gICAgICAgICAgICAgICAgICAgIDAsIDAsXHJcbiAgICAgICAgICAgICAgICAgICAgMCwgMCwgY2FtZXJhLndpZHRoLCBjYW1lcmEuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFRpbnQoY2FtZXJhLl90aW50VEwsIGNhbWVyYS5fYWxwaGFUTCksXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0VGludChjYW1lcmEuX3RpbnRUUiwgY2FtZXJhLl9hbHBoYVRSKSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRUaW50KGNhbWVyYS5fdGludEJMLCBjYW1lcmEuX2FscGhhQkwpLFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFRpbnQoY2FtZXJhLl90aW50QlIsIGNhbWVyYS5fYWxwaGFCUiksXHJcbiAgICAgICAgICAgICAgICAgICAgKGNhbWVyYS5faXNUaW50ZWQgJiYgY2FtZXJhLnRpbnRGaWxsKSxcclxuICAgICAgICAgICAgICAgICAgICAwLCAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENhbWVyYSxcclxuICAgICAgICAgICAgICAgICAgICBudWxsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgRm9yY2UgY2xlYXIgdGhlIGN1cnJlbnQgdGV4dHVyZSBzbyB0aGF0IGl0ZW1zIG5leHQgaW4gdGhlIGJhdGNoIChsaWtlIEdyYXBoaWNzKSBkb24ndCB0cnkgYW5kIHVzZSBpdFxyXG4gICAgICAgICAgICB0aGlzLnNldEJsYW5rVGV4dHVyZSh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEubWFzaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2subWFzayA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBjYW1lcmEubWFzay5wb3N0UmVuZGVyV2ViR0wodGhpcywgY2FtZXJhLl9tYXNrQ2FtZXJhKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHZlcnRleCBidWZmZXIgYW5kIHVwZGF0ZXMgcGlwZWxpbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcHJlUmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcHJlUmVuZGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRMb3N0KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciBwaXBlbGluZXMgPSB0aGlzLnBpcGVsaW5lcztcclxuXHJcbiAgICAgICAgLy8gIE1ha2Ugc3VyZSB3ZSBhcmUgYm91bmQgdG8gdGhlIG1haW4gZnJhbWUgYnVmZmVyXHJcbiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNsZWFyQmVmb3JlUmVuZGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNsZWFyQ29sb3IgPSB0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgICAgICAgICBnbC5jbGVhckNvbG9yKGNsZWFyQ29sb3IucmVkR0wsIGNsZWFyQ29sb3IuZ3JlZW5HTCwgY2xlYXJDb2xvci5ibHVlR0wsIGNsZWFyQ29sb3IuYWxwaGFHTCk7XHJcblxyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCB8IGdsLlNURU5DSUxfQlVGRkVSX0JJVCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHBpcGVsaW5lcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBpcGVsaW5lc1trZXldLm9uUHJlUmVuZGVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVE9ETyAtIEZpbmQgYSB3YXkgdG8gc3RvcCBuZWVkaW5nIHRvIGNyZWF0ZSB0aGVzZSBhcnJheXMgZXZlcnkgZnJhbWVcclxuICAgICAgICAvLyAgYW5kIGVxdWFsbHkgbm90IG5lZWQgYSBodWdlIGFycmF5IGJ1ZmZlciBjcmVhdGVkIHRvIGhvbGQgdGhlbVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTY2lzc29yID0gWyAwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCBdO1xyXG4gICAgICAgIHRoaXMuc2Npc3NvclN0YWNrID0gWyB0aGlzLmN1cnJlbnRTY2lzc29yIF07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdhbWUuc2NlbmUuY3VzdG9tVmlld3BvcnRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2wuc2Npc3NvcigwLCAodGhpcy5kcmF3aW5nQnVmZmVySGVpZ2h0IC0gdGhpcy5oZWlnaHQpLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRNYXNrLm1hc2sgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2subWFzayA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYXNrU3RhY2subGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRQaXBlbGluZSh0aGlzLnBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY29yZSByZW5kZXIgc3RlcCBmb3IgYSBTY2VuZSBDYW1lcmEuXHJcbiAgICAgKiBcclxuICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGdpdmVuIEdhbWUgT2JqZWN0J3MgYXJyYXkgYW5kIHJlbmRlcnMgdGhlbSB3aXRoIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBgQ2FtZXJhTWFuYWdlci5yZW5kZXJgIG1ldGhvZC4gVGhlIENhbWVyYSBNYW5hZ2VyIGluc3RhbmNlIGJlbG9uZ3MgdG8gYSBTY2VuZSwgYW5kIGlzIGludm9rZWRcclxuICAgICAqIGJ5IHRoZSBTY2VuZSBTeXN0ZW1zLnJlbmRlciBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgaWYgYENhbWVyYS52aXNpYmxlYCBpcyBgZmFsc2VgLCBvciBgQ2FtZXJhLmFscGhhYCBpcyB6ZXJvLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gcmVuZGVyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gY2hpbGRyZW4gLSBUaGUgR2FtZSBPYmplY3QncyB3aXRoaW4gdGhlIFNjZW5lIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gVGhlIGludGVycG9sYXRpb24gcGVyY2VudGFnZSB0byBhcHBseS4gQ3VycmVudGx5IHVuLXVzZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgU2NlbmUgQ2FtZXJhIHRvIHJlbmRlciB3aXRoLlxyXG4gICAgICovXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uIChzY2VuZSwgY2hpbGRyZW4sIGludGVycG9sYXRpb25QZXJjZW50YWdlLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dExvc3QpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIHZhciBsaXN0ID0gY2hpbGRyZW4ubGlzdDtcclxuICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGxpc3QubGVuZ3RoO1xyXG4gICAgICAgIHZhciBwaXBlbGluZXMgPSB0aGlzLnBpcGVsaW5lcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHBpcGVsaW5lcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBpcGVsaW5lc1trZXldLm9uUmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICBBcHBseSBzY2lzc29yIGZvciBjYW0gcmVnaW9uICsgcmVuZGVyIGJhY2tncm91bmQgY29sb3IsIGlmIG5vdCB0cmFuc3BhcmVudFxyXG4gICAgICAgIHRoaXMucHJlUmVuZGVyQ2FtZXJhKGNhbWVyYSk7XHJcblxyXG4gICAgICAgIC8vICBOb3RoaW5nIHRvIHJlbmRlciwgc28gYmFpbCBvdXRcclxuICAgICAgICBpZiAoY2hpbGRDb3VudCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QmxlbmRNb2RlKENPTlNULkJsZW5kTW9kZXMuTk9STUFMKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBBcHBsaWVzIGNhbWVyYSBlZmZlY3RzIGFuZCBwb3BzIHRoZSBzY2lzc29yLCBpZiBzZXRcclxuICAgICAgICAgICAgdGhpcy5wb3N0UmVuZGVyQ2FtZXJhKGNhbWVyYSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgUmVzZXQgdGhlIGN1cnJlbnQgdHlwZVxyXG4gICAgICAgIHRoaXMuY3VycmVudFR5cGUgPSAnJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRNYXNrO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGxpc3RbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNoaWxkLndpbGxSZW5kZXIoY2FtZXJhKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5ibGVuZE1vZGUgIT09IHRoaXMuY3VycmVudEJsZW5kTW9kZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCbGVuZE1vZGUoY2hpbGQuYmxlbmRNb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG1hc2sgPSBjaGlsZC5tYXNrO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuY3VycmVudE1hc2s7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudC5tYXNrICYmIGN1cnJlbnQubWFzayAhPT0gbWFzaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFJlbmRlciBvdXQgdGhlIHByZXZpb3VzbHkgc2V0IG1hc2tcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQubWFzay5wb3N0UmVuZGVyV2ViR0wodGhpcywgY3VycmVudC5jYW1lcmEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobWFzayAmJiBjdXJyZW50Lm1hc2sgIT09IG1hc2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hc2sucHJlUmVuZGVyV2ViR0wodGhpcywgY2hpbGQsIGNhbWVyYSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB0eXBlID0gY2hpbGQudHlwZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlICE9PSB0aGlzLmN1cnJlbnRUeXBlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5ld1R5cGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubmV4dFR5cGVNYXRjaCA9IChpIDwgY2hpbGRDb3VudCAtIDEpID8gKGxpc3RbaSArIDFdLnR5cGUgPT09IHRoaXMuY3VycmVudFR5cGUpIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBjaGlsZC5yZW5kZXJXZWJHTCh0aGlzLCBjaGlsZCwgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ld1R5cGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRNYXNrO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudC5tYXNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFJlbmRlciBvdXQgdGhlIHByZXZpb3VzbHkgc2V0IG1hc2ssIGlmIGl0IHdhcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBkaXNwbGF5IGxpc3RcclxuICAgICAgICAgICAgY3VycmVudC5tYXNrLnBvc3RSZW5kZXJXZWJHTCh0aGlzLCBjdXJyZW50LmNhbWVyYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEJsZW5kTW9kZShDT05TVC5CbGVuZE1vZGVzLk5PUk1BTCk7XHJcblxyXG4gICAgICAgIC8vICBBcHBsaWVzIGNhbWVyYSBlZmZlY3RzIGFuZCBwb3BzIHRoZSBzY2lzc29yLCBpZiBzZXRcclxuICAgICAgICB0aGlzLnBvc3RSZW5kZXJDYW1lcmEoY2FtZXJhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcG9zdC1yZW5kZXIgc3RlcCBoYXBwZW5zIGFmdGVyIGFsbCBDYW1lcmFzIGluIGFsbCBTY2VuZXMgaGF2ZSBiZWVuIHJlbmRlcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjcG9zdFJlbmRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHBvc3RSZW5kZXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dExvc3QpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgLy8gVW5iaW5kIGN1c3RvbSBmcmFtZWJ1ZmZlciBoZXJlXHJcblxyXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc25hcHNob3RTdGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKHN0YXRlLmNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV2ViR0xTbmFwc2hvdCh0aGlzLmNhbnZhcywgc3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgc3RhdGUuY2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBpcGVsaW5lcyA9IHRoaXMucGlwZWxpbmVzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGlwZWxpbmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGlwZWxpbmVzW2tleV0ub25Qb3N0UmVuZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBhIHNuYXBzaG90IG9mIHRoZSBlbnRpcmUgZ2FtZSB2aWV3cG9ydCB0byBiZSB0YWtlbiBhZnRlciB0aGUgY3VycmVudCBmcmFtZSBpcyByZW5kZXJlZC5cclxuICAgICAqIFxyXG4gICAgICogVG8gY2FwdHVyZSBhIHNwZWNpZmljIGFyZWEgc2VlIHRoZSBgc25hcHNob3RBcmVhYCBtZXRob2QuIFRvIGNhcHR1cmUgYSBzcGVjaWZpYyBwaXhlbCwgc2VlIGBzbmFwc2hvdFBpeGVsYC5cclxuICAgICAqIFxyXG4gICAgICogT25seSBvbmUgc25hcHNob3QgY2FuIGJlIGFjdGl2ZSBfcGVyIGZyYW1lXy4gSWYgeW91IGhhdmUgYWxyZWFkeSBjYWxsZWQgYHNuYXBzaG90UGl4ZWxgLCBmb3IgZXhhbXBsZSwgdGhlblxyXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIG92ZXJyaWRlIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBTbmFwc2hvdHMgd29yayBieSB1c2luZyB0aGUgV2ViR0wgYHJlYWRQaXhlbHNgIGZlYXR1cmUgdG8gZ3JhYiBldmVyeSBwaXhlbCBmcm9tIHRoZSBmcmFtZSBidWZmZXIgaW50byBhbiBBcnJheUJ1ZmZlclZpZXcuXHJcbiAgICAgKiBJdCB0aGVuIHBhcnNlcyB0aGlzLCBjb3B5aW5nIHRoZSBjb250ZW50cyB0byBhIHRlbXBvcmFyeSBDYW52YXMgYW5kIGZpbmFsbHkgY3JlYXRpbmcgYW4gSW1hZ2Ugb2JqZWN0IGZyb20gaXQsXHJcbiAgICAgKiB3aGljaCBpcyB0aGUgaW1hZ2UgcmV0dXJuZWQgdG8gdGhlIGNhbGxiYWNrIHByb3ZpZGVkLiBBbGwgaW4gYWxsLCB0aGlzIGlzIGEgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBhbmQgYmxvY2tpbmcgcHJvY2VzcyxcclxuICAgICAqIHdoaWNoIGdldHMgbW9yZSBleHBlbnNpdmUgdGhlIGxhcmdlciB0aGUgY2FudmFzIHNpemUgZ2V0cywgc28gcGxlYXNlIGJlIGNhcmVmdWwgaG93IHlvdSBlbXBsb3kgdGhpcyBpbiB5b3VyIGdhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzbmFwc2hvdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgRnVuY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzbmFwc2hvdCBpbWFnZSBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdpbWFnZS9wbmcnXSAtIFRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHRvIGNyZWF0ZSwgdXN1YWxseSBgaW1hZ2UvcG5nYCBvciBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuY29kZXJPcHRpb25zPTAuOTJdIC0gVGhlIGltYWdlIHF1YWxpdHksIGJldHdlZW4gMCBhbmQgMS4gVXNlZCBmb3IgaW1hZ2UgZm9ybWF0cyB3aXRoIGxvc3N5IGNvbXByZXNzaW9uLCBzdWNoIGFzIGBpbWFnZS9qcGVnYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBzbmFwc2hvdDogZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBlbmNvZGVyT3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdEFyZWEoMCwgMCwgdGhpcy5nbC5kcmF3aW5nQnVmZmVyV2lkdGgsIHRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCwgY2FsbGJhY2ssIHR5cGUsIGVuY29kZXJPcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2hlZHVsZXMgYSBzbmFwc2hvdCBvZiB0aGUgZ2l2ZW4gYXJlYSBvZiB0aGUgZ2FtZSB2aWV3cG9ydCB0byBiZSB0YWtlbiBhZnRlciB0aGUgY3VycmVudCBmcmFtZSBpcyByZW5kZXJlZC5cclxuICAgICAqIFxyXG4gICAgICogVG8gY2FwdHVyZSB0aGUgd2hvbGUgZ2FtZSB2aWV3cG9ydCBzZWUgdGhlIGBzbmFwc2hvdGAgbWV0aG9kLiBUbyBjYXB0dXJlIGEgc3BlY2lmaWMgcGl4ZWwsIHNlZSBgc25hcHNob3RQaXhlbGAuXHJcbiAgICAgKiBcclxuICAgICAqIE9ubHkgb25lIHNuYXBzaG90IGNhbiBiZSBhY3RpdmUgX3BlciBmcmFtZV8uIElmIHlvdSBoYXZlIGFscmVhZHkgY2FsbGVkIGBzbmFwc2hvdFBpeGVsYCwgZm9yIGV4YW1wbGUsIHRoZW5cclxuICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBvdmVycmlkZSBpdC5cclxuICAgICAqIFxyXG4gICAgICogU25hcHNob3RzIHdvcmsgYnkgdXNpbmcgdGhlIFdlYkdMIGByZWFkUGl4ZWxzYCBmZWF0dXJlIHRvIGdyYWIgZXZlcnkgcGl4ZWwgZnJvbSB0aGUgZnJhbWUgYnVmZmVyIGludG8gYW4gQXJyYXlCdWZmZXJWaWV3LlxyXG4gICAgICogSXQgdGhlbiBwYXJzZXMgdGhpcywgY29weWluZyB0aGUgY29udGVudHMgdG8gYSB0ZW1wb3JhcnkgQ2FudmFzIGFuZCBmaW5hbGx5IGNyZWF0aW5nIGFuIEltYWdlIG9iamVjdCBmcm9tIGl0LFxyXG4gICAgICogd2hpY2ggaXMgdGhlIGltYWdlIHJldHVybmVkIHRvIHRoZSBjYWxsYmFjayBwcm92aWRlZC4gQWxsIGluIGFsbCwgdGhpcyBpcyBhIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgYW5kIGJsb2NraW5nIHByb2Nlc3MsXHJcbiAgICAgKiB3aGljaCBnZXRzIG1vcmUgZXhwZW5zaXZlIHRoZSBsYXJnZXIgdGhlIGNhbnZhcyBzaXplIGdldHMsIHNvIHBsZWFzZSBiZSBjYXJlZnVsIGhvdyB5b3UgZW1wbG95IHRoaXMgaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc25hcHNob3RBcmVhXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGdyYWIgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgYXJlYSB0byBncmFiLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgRnVuY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzbmFwc2hvdCBpbWFnZSBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdpbWFnZS9wbmcnXSAtIFRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHRvIGNyZWF0ZSwgdXN1YWxseSBgaW1hZ2UvcG5nYCBvciBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuY29kZXJPcHRpb25zPTAuOTJdIC0gVGhlIGltYWdlIHF1YWxpdHksIGJldHdlZW4gMCBhbmQgMS4gVXNlZCBmb3IgaW1hZ2UgZm9ybWF0cyB3aXRoIGxvc3N5IGNvbXByZXNzaW9uLCBzdWNoIGFzIGBpbWFnZS9qcGVnYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBzbmFwc2hvdEFyZWE6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjYWxsYmFjaywgdHlwZSwgZW5jb2Rlck9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zbmFwc2hvdFN0YXRlO1xyXG5cclxuICAgICAgICBzdGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHN0YXRlLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHN0YXRlLmVuY29kZXIgPSBlbmNvZGVyT3B0aW9ucztcclxuICAgICAgICBzdGF0ZS5nZXRQaXhlbCA9IGZhbHNlO1xyXG4gICAgICAgIHN0YXRlLnggPSB4O1xyXG4gICAgICAgIHN0YXRlLnkgPSB5O1xyXG4gICAgICAgIHN0YXRlLndpZHRoID0gTWF0aC5taW4od2lkdGgsIHRoaXMuZ2wuZHJhd2luZ0J1ZmZlcldpZHRoKTtcclxuICAgICAgICBzdGF0ZS5oZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjaGVkdWxlcyBhIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBwaXhlbCBmcm9tIHRoZSBnYW1lIHZpZXdwb3J0IHRvIGJlIHRha2VuIGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lIGlzIHJlbmRlcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBjYXB0dXJlIHRoZSB3aG9sZSBnYW1lIHZpZXdwb3J0IHNlZSB0aGUgYHNuYXBzaG90YCBtZXRob2QuIFRvIGNhcHR1cmUgYSBzcGVjaWZpYyBhcmVhLCBzZWUgYHNuYXBzaG90QXJlYWAuXHJcbiAgICAgKiBcclxuICAgICAqIE9ubHkgb25lIHNuYXBzaG90IGNhbiBiZSBhY3RpdmUgX3BlciBmcmFtZV8uIElmIHlvdSBoYXZlIGFscmVhZHkgY2FsbGVkIGBzbmFwc2hvdEFyZWFgLCBmb3IgZXhhbXBsZSwgdGhlblxyXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIG92ZXJyaWRlIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBVbmxpa2UgdGhlIG90aGVyIHR3byBzbmFwc2hvdCBtZXRob2RzLCB0aGlzIG9uZSB3aWxsIHJldHVybiBhIGBDb2xvcmAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGRhdGEgZm9yXHJcbiAgICAgKiB0aGUgcmVxdWVzdGVkIHBpeGVsLiBJdCBkb2Vzbid0IG5lZWQgdG8gY3JlYXRlIGFuIGludGVybmFsIENhbnZhcyBvciBJbWFnZSBvYmplY3QsIHNvIGlzIGEgbG90IGZhc3RlciB0byBleGVjdXRlLFxyXG4gICAgICogdXNpbmcgbGVzcyBtZW1vcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzbmFwc2hvdFBpeGVsXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgdG8gZ2V0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgdG8gZ2V0LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgRnVuY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzbmFwc2hvdCBwaXhlbCBkYXRhIGlzIGV4dHJhY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBzbmFwc2hvdFBpeGVsOiBmdW5jdGlvbiAoeCwgeSwgY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zbmFwc2hvdEFyZWEoeCwgeSwgMSwgMSwgY2FsbGJhY2spO1xyXG5cclxuICAgICAgICB0aGlzLnNuYXBzaG90U3RhdGUuZ2V0UGl4ZWwgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBhcmVhIG9mIHRoZSBnaXZlbiBmcmFtZSBidWZmZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFVubGlrZSB0aGUgb3RoZXIgc25hcHNob3QgbWV0aG9kcywgdGhpcyBvbmUgaXMgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5IGFuZCBkb2Vzbid0IHdhaXQgZm9yIHRoZSBuZXh0IHJlbmRlci5cclxuICAgICAqIFxyXG4gICAgICogU25hcHNob3RzIHdvcmsgYnkgdXNpbmcgdGhlIFdlYkdMIGByZWFkUGl4ZWxzYCBmZWF0dXJlIHRvIGdyYWIgZXZlcnkgcGl4ZWwgZnJvbSB0aGUgZnJhbWUgYnVmZmVyIGludG8gYW4gQXJyYXlCdWZmZXJWaWV3LlxyXG4gICAgICogSXQgdGhlbiBwYXJzZXMgdGhpcywgY29weWluZyB0aGUgY29udGVudHMgdG8gYSB0ZW1wb3JhcnkgQ2FudmFzIGFuZCBmaW5hbGx5IGNyZWF0aW5nIGFuIEltYWdlIG9iamVjdCBmcm9tIGl0LFxyXG4gICAgICogd2hpY2ggaXMgdGhlIGltYWdlIHJldHVybmVkIHRvIHRoZSBjYWxsYmFjayBwcm92aWRlZC4gQWxsIGluIGFsbCwgdGhpcyBpcyBhIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgYW5kIGJsb2NraW5nIHByb2Nlc3MsXHJcbiAgICAgKiB3aGljaCBnZXRzIG1vcmUgZXhwZW5zaXZlIHRoZSBsYXJnZXIgdGhlIGNhbnZhcyBzaXplIGdldHMsIHNvIHBsZWFzZSBiZSBjYXJlZnVsIGhvdyB5b3UgZW1wbG95IHRoaXMgaW4geW91ciBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc25hcHNob3RGcmFtZWJ1ZmZlclxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xGcmFtZWJ1ZmZlcn0gZnJhbWVidWZmZXIgLSBUaGUgZnJhbWVidWZmZXIgdG8gZ3JhYiBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBidWZmZXJXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZnJhbWVidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGJ1ZmZlckhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZyYW1lYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuUmVuZGVyZXIuU25hcHNob3QuU25hcHNob3RDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgRnVuY3Rpb24gdG8gaW52b2tlIGFmdGVyIHRoZSBzbmFwc2hvdCBpbWFnZSBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0UGl4ZWw9ZmFsc2VdIC0gR3JhYiBhIHNpbmdsZSBwaXhlbCBhcyBhIENvbG9yIG9iamVjdCwgb3IgYW4gYXJlYSBhcyBhbiBJbWFnZSBvYmplY3Q/XHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt5PTBdIC0gVGhlIHkgY29vcmRpbmF0ZSB0byBncmFiIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1idWZmZXJXaWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gZ3JhYi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1idWZmZXJIZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgYXJlYSB0byBncmFiLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdpbWFnZS9wbmcnXSAtIFRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHRvIGNyZWF0ZSwgdXN1YWxseSBgaW1hZ2UvcG5nYCBvciBgaW1hZ2UvanBlZ2AuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuY29kZXJPcHRpb25zPTAuOTJdIC0gVGhlIGltYWdlIHF1YWxpdHksIGJldHdlZW4gMCBhbmQgMS4gVXNlZCBmb3IgaW1hZ2UgZm9ybWF0cyB3aXRoIGxvc3N5IGNvbXByZXNzaW9uLCBzdWNoIGFzIGBpbWFnZS9qcGVnYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyLlxyXG4gICAgICovXHJcbiAgICBzbmFwc2hvdEZyYW1lYnVmZmVyOiBmdW5jdGlvbiAoZnJhbWVidWZmZXIsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQsIGNhbGxiYWNrLCBnZXRQaXhlbCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdHlwZSwgZW5jb2Rlck9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGdldFBpeGVsID09PSB1bmRlZmluZWQpIHsgZ2V0UGl4ZWwgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSBidWZmZXJXaWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSBidWZmZXJIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdmFyIGN1cnJlbnRGcmFtZWJ1ZmZlciA9IHRoaXMuY3VycmVudEZyYW1lYnVmZmVyO1xyXG5cclxuICAgICAgICB0aGlzLnNuYXBzaG90QXJlYSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjYWxsYmFjaywgdHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNuYXBzaG90U3RhdGU7XHJcblxyXG4gICAgICAgIHN0YXRlLmdldFBpeGVsID0gZ2V0UGl4ZWw7XHJcblxyXG4gICAgICAgIHN0YXRlLmlzRnJhbWVidWZmZXIgPSB0cnVlO1xyXG4gICAgICAgIHN0YXRlLmJ1ZmZlcldpZHRoID0gYnVmZmVyV2lkdGg7XHJcbiAgICAgICAgc3RhdGUuYnVmZmVySGVpZ2h0ID0gYnVmZmVySGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnNldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKTtcclxuXHJcbiAgICAgICAgV2ViR0xTbmFwc2hvdCh0aGlzLmNhbnZhcywgc3RhdGUpO1xyXG5cclxuICAgICAgICB0aGlzLnNldEZyYW1lYnVmZmVyKGN1cnJlbnRGcmFtZWJ1ZmZlcik7XHJcblxyXG4gICAgICAgIHN0YXRlLmNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICBzdGF0ZS5pc0ZyYW1lYnVmZmVyID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgV2ViR0wgVGV4dHVyZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gQ2FudmFzIEVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBgZHN0VGV4dHVyZWAgcGFyYW1ldGVyIGlzIGdpdmVuLCB0aGUgV2ViR0wgVGV4dHVyZSBpcyB1cGRhdGVkLCByYXRoZXIgdGhhbiBjcmVhdGVkIGZyZXNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjY2FudmFzVG9UZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gc3JjQ2FudmFzIC0gVGhlIENhbnZhcyB0byBjcmVhdGUgdGhlIFdlYkdMIFRleHR1cmUgZnJvbVxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IFtkc3RUZXh0dXJlXSAtIFRoZSBkZXN0aW5hdGlvbiBXZWJHTCBUZXh0dXJlIHRvIHNldC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vUmVwZWF0PWZhbHNlXSAtIFNob3VsZCB0aGlzIGNhbnZhcyBiZSBhbGxvd2VkIHRvIHNldCBgUkVQRUFUYCAoc3VjaCBhcyBmb3IgVGV4dCBvYmplY3RzPylcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFNob3VsZCB0aGUgV2ViR0wgVGV4dHVyZSBzZXQgYFVOUEFDS19NVUxUSVBMWV9GTElQX1lgP1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtXZWJHTFRleHR1cmV9IFRoZSBuZXdseSBjcmVhdGVkLCBvciB1cGRhdGVkLCBXZWJHTCBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBjYW52YXNUb1RleHR1cmU6IGZ1bmN0aW9uIChzcmNDYW52YXMsIGRzdFRleHR1cmUsIG5vUmVwZWF0LCBmbGlwWSlcclxuICAgIHtcclxuICAgICAgICBpZiAobm9SZXBlYXQgPT09IHVuZGVmaW5lZCkgeyBub1JlcGVhdCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGZsaXBZID09PSB1bmRlZmluZWQpIHsgZmxpcFkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICBpZiAoIWRzdFRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDYW52YXNUZXh0dXJlKHNyY0NhbnZhcywgbm9SZXBlYXQsIGZsaXBZKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FudmFzVGV4dHVyZShzcmNDYW52YXMsIGRzdFRleHR1cmUsIGZsaXBZKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBXZWJHTCBUZXh0dXJlIGJhc2VkIG9uIHRoZSBnaXZlbiBDYW52YXMgRWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2NyZWF0ZUNhbnZhc1RleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gc3JjQ2FudmFzIC0gVGhlIENhbnZhcyB0byBjcmVhdGUgdGhlIFdlYkdMIFRleHR1cmUgZnJvbVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9SZXBlYXQ9ZmFsc2VdIC0gU2hvdWxkIHRoaXMgY2FudmFzIGJlIGFsbG93ZWQgdG8gc2V0IGBSRVBFQVRgIChzdWNoIGFzIGZvciBUZXh0IG9iamVjdHM/KVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxpcFk9ZmFsc2VdIC0gU2hvdWxkIHRoZSBXZWJHTCBUZXh0dXJlIHNldCBgVU5QQUNLX01VTFRJUExZX0ZMSVBfWWA/XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge1dlYkdMVGV4dHVyZX0gVGhlIG5ld2x5IGNyZWF0ZWQgV2ViR0wgVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ2FudmFzVGV4dHVyZTogZnVuY3Rpb24gKHNyY0NhbnZhcywgbm9SZXBlYXQsIGZsaXBZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChub1JlcGVhdCA9PT0gdW5kZWZpbmVkKSB7IG5vUmVwZWF0ID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoZmxpcFkgPT09IHVuZGVmaW5lZCkgeyBmbGlwWSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcbiAgICAgICAgdmFyIG1pbkZpbHRlciA9IGdsLk5FQVJFU1Q7XHJcbiAgICAgICAgdmFyIG1hZ0ZpbHRlciA9IGdsLk5FQVJFU1Q7XHJcblxyXG4gICAgICAgIHZhciB3aWR0aCA9IHNyY0NhbnZhcy53aWR0aDtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gc3JjQ2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHdyYXBwaW5nID0gZ2wuQ0xBTVBfVE9fRURHRTtcclxuXHJcbiAgICAgICAgdmFyIHBvdyA9IElzU2l6ZVBvd2VyT2ZUd28od2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICghbm9SZXBlYXQgJiYgcG93KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3JhcHBpbmcgPSBnbC5SRVBFQVQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuYW50aWFsaWFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWluRmlsdGVyID0gKHBvdykgPyB0aGlzLm1pcG1hcEZpbHRlciA6IGdsLkxJTkVBUjtcclxuICAgICAgICAgICAgbWFnRmlsdGVyID0gZ2wuTElORUFSO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZTJEKDAsIG1pbkZpbHRlciwgbWFnRmlsdGVyLCB3cmFwcGluZywgd3JhcHBpbmcsIGdsLlJHQkEsIHNyY0NhbnZhcywgd2lkdGgsIGhlaWdodCwgdHJ1ZSwgZmFsc2UsIGZsaXBZKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGEgV2ViR0wgVGV4dHVyZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gQ2FudmFzIEVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciN1cGRhdGVDYW52YXNUZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IHNyY0NhbnZhcyAtIFRoZSBDYW52YXMgdG8gdXBkYXRlIHRoZSBXZWJHTCBUZXh0dXJlIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiBXZWJHTCBUZXh0dXJlIHRvIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFNob3VsZCB0aGUgV2ViR0wgVGV4dHVyZSBzZXQgYFVOUEFDS19NVUxUSVBMWV9GTElQX1lgP1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtXZWJHTFRleHR1cmV9IFRoZSB1cGRhdGVkIFdlYkdMIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNhbnZhc1RleHR1cmU6IGZ1bmN0aW9uIChzcmNDYW52YXMsIGRzdFRleHR1cmUsIGZsaXBZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChmbGlwWSA9PT0gdW5kZWZpbmVkKSB7IGZsaXBZID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuXHJcbiAgICAgICAgdmFyIHdpZHRoID0gc3JjQ2FudmFzLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBzcmNDYW52YXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFRleHR1cmUyRChkc3RUZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19GTElQX1lfV0VCR0wsIGZsaXBZKTtcclxuXHJcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgc3JjQ2FudmFzKTtcclxuICAgIFxyXG4gICAgICAgICAgICBkc3RUZXh0dXJlLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIGRzdFRleHR1cmUuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKG51bGwsIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRzdFRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBXZWJHTCBUZXh0dXJlIGJhc2VkIG9uIHRoZSBnaXZlbiBIVE1MIFZpZGVvIEVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNjcmVhdGVWaWRlb1RleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtIVE1MVmlkZW9FbGVtZW50fSBzcmNWaWRlbyAtIFRoZSBWaWRlbyB0byBjcmVhdGUgdGhlIFdlYkdMIFRleHR1cmUgZnJvbVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9SZXBlYXQ9ZmFsc2VdIC0gU2hvdWxkIHRoaXMgY2FudmFzIGJlIGFsbG93ZWQgdG8gc2V0IGBSRVBFQVRgP1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxpcFk9ZmFsc2VdIC0gU2hvdWxkIHRoZSBXZWJHTCBUZXh0dXJlIHNldCBgVU5QQUNLX01VTFRJUExZX0ZMSVBfWWA/XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge1dlYkdMVGV4dHVyZX0gVGhlIG5ld2x5IGNyZWF0ZWQgV2ViR0wgVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVmlkZW9UZXh0dXJlOiBmdW5jdGlvbiAoc3JjVmlkZW8sIG5vUmVwZWF0LCBmbGlwWSlcclxuICAgIHtcclxuICAgICAgICBpZiAobm9SZXBlYXQgPT09IHVuZGVmaW5lZCkgeyBub1JlcGVhdCA9IGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKGZsaXBZID09PSB1bmRlZmluZWQpIHsgZmxpcFkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNUO1xyXG4gICAgICAgIHZhciBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUO1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSBzcmNWaWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBzcmNWaWRlby52aWRlb0hlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHdyYXBwaW5nID0gZ2wuQ0xBTVBfVE9fRURHRTtcclxuXHJcbiAgICAgICAgdmFyIHBvdyA9IElzU2l6ZVBvd2VyT2ZUd28od2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICghbm9SZXBlYXQgJiYgcG93KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3JhcHBpbmcgPSBnbC5SRVBFQVQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuYW50aWFsaWFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWluRmlsdGVyID0gKHBvdykgPyB0aGlzLm1pcG1hcEZpbHRlciA6IGdsLkxJTkVBUjtcclxuICAgICAgICAgICAgbWFnRmlsdGVyID0gZ2wuTElORUFSO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZTJEKDAsIG1pbkZpbHRlciwgbWFnRmlsdGVyLCB3cmFwcGluZywgd3JhcHBpbmcsIGdsLlJHQkEsIHNyY1ZpZGVvLCB3aWR0aCwgaGVpZ2h0LCB0cnVlLCB0cnVlLCBmbGlwWSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyBhIFdlYkdMIFRleHR1cmUgYmFzZWQgb24gdGhlIGdpdmVuIEhUTUwgVmlkZW8gRWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3VwZGF0ZVZpZGVvVGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxWaWRlb0VsZW1lbnR9IHNyY1ZpZGVvIC0gVGhlIFZpZGVvIHRvIHVwZGF0ZSB0aGUgV2ViR0wgVGV4dHVyZSB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IGRzdFRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gV2ViR0wgVGV4dHVyZSB0byB1cGRhdGUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbGlwWT1mYWxzZV0gLSBTaG91bGQgdGhlIFdlYkdMIFRleHR1cmUgc2V0IGBVTlBBQ0tfTVVMVElQTFlfRkxJUF9ZYD9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7V2ViR0xUZXh0dXJlfSBUaGUgdXBkYXRlZCBXZWJHTCBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWaWRlb1RleHR1cmU6IGZ1bmN0aW9uIChzcmNWaWRlbywgZHN0VGV4dHVyZSwgZmxpcFkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZsaXBZID09PSB1bmRlZmluZWQpIHsgZmxpcFkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSBzcmNWaWRlby52aWRlb1dpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBzcmNWaWRlby52aWRlb0hlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUZXh0dXJlMkQoZHN0VGV4dHVyZSwgMCk7XHJcblxyXG4gICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCBmbGlwWSk7XHJcblxyXG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHNyY1ZpZGVvKTtcclxuXHJcbiAgICAgICAgICAgIGRzdFRleHR1cmUud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgZHN0VGV4dHVyZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldFRleHR1cmUyRChudWxsLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkc3RUZXh0dXJlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1pbmlmaWNhdGlvbiBhbmQgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgZm9yIGEgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldFRleHR1cmVGaWx0ZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIHNldCB0aGUgZmlsdGVyIGZvci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZmlsdGVyIC0gVGhlIGZpbHRlciB0byBzZXQuIDAgZm9yIGxpbmVhciBmaWx0ZXJpbmcsIDEgZm9yIG5lYXJlc3QgbmVpZ2hib3IgKGJsb2NreSkgZmlsdGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0wgUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFRleHR1cmVGaWx0ZXI6IGZ1bmN0aW9uICh0ZXh0dXJlLCBmaWx0ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgZ2xGaWx0ZXIgPSBbIGdsLkxJTkVBUiwgZ2wuTkVBUkVTVCBdW2ZpbHRlcl07XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2xGaWx0ZXIpO1xyXG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbEZpbHRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKG51bGwsIDApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgMWYgdW5pZm9ybSB2YWx1ZSBvbiB0aGUgZ2l2ZW4gc2hhZGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2hhZGVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLCBpdCBpcyBtYWRlIGFjdGl2ZSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEZsb2F0MVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFByb2dyYW19IHByb2dyYW0gLSBUaGUgdGFyZ2V0IFdlYkdMUHJvZ3JhbSBmcm9tIHdoaWNoIHRoZSB1bmlmb3JtIGxvY2F0aW9uIHdpbGwgYmUgbG9va2VkLXVwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSAxZiB2YWx1ZSB0byBzZXQgb24gdGhlIG5hbWVkIHVuaWZvcm0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmxvYXQxOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgMmYgdW5pZm9ybSB2YWx1ZXMgb24gdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRGbG9hdDJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBwcm9ncmFtIC0gVGhlIHRhcmdldCBXZWJHTFByb2dyYW0gZnJvbSB3aGljaCB0aGUgdW5pZm9ybSBsb2NhdGlvbiB3aWxsIGJlIGxvb2tlZC11cC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgMmYgeCB2YWx1ZSB0byBzZXQgb24gdGhlIG5hbWVkIHVuaWZvcm0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSAyZiB5IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbG9hdDI6IGZ1bmN0aW9uIChwcm9ncmFtLCBuYW1lLCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcclxuXHJcbiAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYodGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSksIHgsIHkpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSAzZiB1bmlmb3JtIHZhbHVlcyBvbiB0aGUgZ2l2ZW4gc2hhZGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2hhZGVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLCBpdCBpcyBtYWRlIGFjdGl2ZSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEZsb2F0M1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFByb2dyYW19IHByb2dyYW0gLSBUaGUgdGFyZ2V0IFdlYkdMUHJvZ3JhbSBmcm9tIHdoaWNoIHRoZSB1bmlmb3JtIGxvY2F0aW9uIHdpbGwgYmUgbG9va2VkLXVwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSAzZiB4IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIDNmIHkgdmFsdWUgdG8gc2V0IG9uIHRoZSBuYW1lZCB1bmlmb3JtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgM2YgeiB2YWx1ZSB0byBzZXQgb24gdGhlIG5hbWVkIHVuaWZvcm0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmxvYXQzOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeCwgeSwgeilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4LCB5LCB6KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgNGYgdW5pZm9ybSB2YWx1ZXMgb24gdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRGbG9hdDRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBwcm9ncmFtIC0gVGhlIHRhcmdldCBXZWJHTFByb2dyYW0gZnJvbSB3aGljaCB0aGUgdW5pZm9ybSBsb2NhdGlvbiB3aWxsIGJlIGxvb2tlZC11cC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgNGYgeCB2YWx1ZSB0byBzZXQgb24gdGhlIG5hbWVkIHVuaWZvcm0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSA0ZiB5IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIDRmIHogdmFsdWUgdG8gc2V0IG9uIHRoZSBuYW1lZCB1bmlmb3JtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgNGYgdyB2YWx1ZSB0byBzZXQgb24gdGhlIG5hbWVkIHVuaWZvcm0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmxvYXQ0OiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeCwgeSwgeiwgdylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4LCB5LCB6LCB3KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSAxZnYgdW5pZm9ybSB2YXJpYWJsZSBpbiB0aGUgZ2l2ZW4gV2ViR0xQcm9ncmFtLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2hhZGVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLCBpdCBpcyBtYWRlIGFjdGl2ZSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEZsb2F0MXZcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBhcnIgLSBUaGUgbmV3IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmlmb3JtIHZhcmlhYmxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0wgUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEZsb2F0MXY6IGZ1bmN0aW9uIChwcm9ncmFtLCBuYW1lLCBhcnIpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZnYodGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSksIGFycik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgMmZ2IHVuaWZvcm0gdmFyaWFibGUgaW4gdGhlIGdpdmVuIFdlYkdMUHJvZ3JhbS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRGbG9hdDJ2XHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFByb2dyYW19IHByb2dyYW0gLSBUaGUgdGFyZ2V0IFdlYkdMUHJvZ3JhbSBmcm9tIHdoaWNoIHRoZSB1bmlmb3JtIGxvY2F0aW9uIHdpbGwgYmUgbG9va2VkLXVwLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBsb29rLXVwIGFuZCBtb2RpZnkuXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gYXJyIC0gVGhlIG5ldyB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgdW5pZm9ybSB2YXJpYWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRGbG9hdDJ2OiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgYXJyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcclxuXHJcbiAgICAgICAgdGhpcy5nbC51bmlmb3JtMmZ2KHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCBhcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIDNmdiB1bmlmb3JtIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBXZWJHTFByb2dyYW0uXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBzaGFkZXIgaXMgbm90IGN1cnJlbnRseSBhY3RpdmUsIGl0IGlzIG1hZGUgYWN0aXZlIGZpcnN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjc2V0RmxvYXQzdlxyXG4gICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBwcm9ncmFtIC0gVGhlIHRhcmdldCBXZWJHTFByb2dyYW0gZnJvbSB3aGljaCB0aGUgdW5pZm9ybSBsb2NhdGlvbiB3aWxsIGJlIGxvb2tlZC11cC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IGFyciAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHVuaWZvcm0gdmFyaWFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmxvYXQzdjogZnVuY3Rpb24gKHByb2dyYW0sIG5hbWUsIGFycilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmdih0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBuYW1lKSwgYXJyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSA0ZnYgdW5pZm9ybSB2YXJpYWJsZSBpbiB0aGUgZ2l2ZW4gV2ViR0xQcm9ncmFtLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2hhZGVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLCBpdCBpcyBtYWRlIGFjdGl2ZSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEZsb2F0NHZcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBhcnIgLSBUaGUgbmV3IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmlmb3JtIHZhcmlhYmxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0wgUmVuZGVyZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuXHJcbiAgICBzZXRGbG9hdDR2OiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgYXJyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcclxuXHJcbiAgICAgICAgdGhpcy5nbC51bmlmb3JtNGZ2KHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCBhcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgMWkgdW5pZm9ybSB2YWx1ZSBvbiB0aGUgZ2l2ZW4gc2hhZGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2hhZGVyIGlzIG5vdCBjdXJyZW50bHkgYWN0aXZlLCBpdCBpcyBtYWRlIGFjdGl2ZSBmaXJzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI3NldEludDFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xQcm9ncmFtfSBwcm9ncmFtIC0gVGhlIHRhcmdldCBXZWJHTFByb2dyYW0gZnJvbSB3aGljaCB0aGUgdW5pZm9ybSBsb2NhdGlvbiB3aWxsIGJlIGxvb2tlZC11cC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gdG8gbG9vay11cCBhbmQgbW9kaWZ5LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIDFpIHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbnQxOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgMmkgdW5pZm9ybSB2YWx1ZXMgb24gdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRJbnQyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSAyaSB4IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSAyaSB5IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbnQyOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTJpKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgM2kgdW5pZm9ybSB2YWx1ZXMgb24gdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRJbnQzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSAzaSB4IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSAzaSB5IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geiAtIFRoZSAzaSB6IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbnQzOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeCwgeSwgeilcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTNpKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4LCB5LCB6KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgNGkgdW5pZm9ybSB2YWx1ZXMgb24gdGhlIGdpdmVuIHNoYWRlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRJbnQ0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSA0aSB4IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSA0aSB5IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geiAtIFRoZSA0aSB6IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdyAtIFRoZSA0aSB3IHZhbHVlIHRvIHNldCBvbiB0aGUgbmFtZWQgdW5pZm9ybS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRJbnQ0OiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgeCwgeSwgeiwgdylcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldFByb2dyYW0ocHJvZ3JhbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTRpKHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB4LCB5LCB6LCB3KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBtYXRyaXggMmZ2IHVuaWZvcm0gdmFyaWFibGUgaW4gdGhlIGdpdmVuIFdlYkdMUHJvZ3JhbS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRNYXRyaXgyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIC0gVGhlIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byB0cmFuc3Bvc2UgdGhlIG1hdHJpeC4gTXVzdCBiZSBmYWxzZS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBtYXRyaXggLSBBIEZsb2F0MzJBcnJheSBvciBzZXF1ZW5jZSBvZiA0IGZsb2F0IHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRNYXRyaXgyOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgdHJhbnNwb3NlLCBtYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSksIHRyYW5zcG9zZSwgbWF0cml4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBtYXRyaXggM2Z2IHVuaWZvcm0gdmFyaWFibGUgaW4gdGhlIGdpdmVuIFdlYkdMUHJvZ3JhbS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRNYXRyaXgzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIC0gVGhlIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byB0cmFuc3Bvc2UgdGhlIG1hdHJpeC4gTXVzdCBiZSBmYWxzZS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBtYXRyaXggLSBBIEZsb2F0MzJBcnJheSBvciBzZXF1ZW5jZSBvZiA5IGZsb2F0IHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMIFJlbmRlcmVyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRNYXRyaXgzOiBmdW5jdGlvbiAocHJvZ3JhbSwgbmFtZSwgdHJhbnNwb3NlLCBtYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRQcm9ncmFtKHByb2dyYW0pO1xyXG5cclxuICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSksIHRyYW5zcG9zZSwgbWF0cml4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBtYXRyaXggNGZ2IHVuaWZvcm0gdmFyaWFibGUgaW4gdGhlIGdpdmVuIFdlYkdMUHJvZ3JhbS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNoYWRlciBpcyBub3QgY3VycmVudGx5IGFjdGl2ZSwgaXQgaXMgbWFkZSBhY3RpdmUgZmlyc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlciNzZXRNYXRyaXg0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSB0YXJnZXQgV2ViR0xQcm9ncmFtIGZyb20gd2hpY2ggdGhlIHVuaWZvcm0gbG9jYXRpb24gd2lsbCBiZSBsb29rZWQtdXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGxvb2stdXAgYW5kIG1vZGlmeS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIC0gVGhlIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0byB0cmFuc3Bvc2UgdGhlIG1hdHJpeC4gTXVzdCBiZSBmYWxzZS5cclxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBtYXRyaXggLSBBIEZsb2F0MzJBcnJheSBvciBzZXF1ZW5jZSBvZiAxNiBmbG9hdCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTCBSZW5kZXJlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWF0cml4NDogZnVuY3Rpb24gKHByb2dyYW0sIG5hbWUsIHRyYW5zcG9zZSwgbWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcclxuXHJcbiAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpLCB0cmFuc3Bvc2UsIG1hdHJpeCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRleHR1cmUgdW5pdHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIGZyYWdtZW50IHNoYWRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2dldE1heFRleHR1cmVzXHJcbiAgICAgKiBAc2luY2UgMy44LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGV4dHVyZXMgV2ViR0wgc3VwcG9ydHMuXHJcbiAgICAgKi9cclxuICAgIGdldE1heFRleHR1cmVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXhUZXh0dXJlcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHRleHR1cmUgc2l6ZSAoZWl0aGVyIHdpZHRoIG9yIGhlaWdodCkgdGhhdCBjYW4gYmUgY3JlYXRlZC5cclxuICAgICAqIE5vdGUgdGhhdCBWUkFNIG1heSBub3QgYWxsb3cgYSB0ZXh0dXJlIG9mIGFueSBnaXZlbiBzaXplLCBpdCBqdXN0IGV4cHJlc3Nlc1xyXG4gICAgICogaGFyZHdhcmUgLyBkcml2ZXIgc3VwcG9ydCBmb3IgYSBnaXZlbiBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIjZ2V0TWF4VGV4dHVyZVNpemVcclxuICAgICAqIEBzaW5jZSAzLjguMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBtYXhpbXVtIHN1cHBvcnRlZCB0ZXh0dXJlIHNpemUuXHJcbiAgICAgKi9cclxuICAgIGdldE1heFRleHR1cmVTaXplOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXhUZXh0dXJlU2l6ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoaXMgV2ViR0xSZW5kZXJlciwgY2xlYW5pbmcgdXAgYWxsIHJlbGF0ZWQgcmVzb3VyY2VzIHN1Y2ggYXMgcGlwZWxpbmVzLCBuYXRpdmUgdGV4dHVyZXMsIGV0Yy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBDbGVhci11cCBhbnl0aGluZyB0aGF0IHNob3VsZCBiZSBjbGVhcmVkIDopXHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uYXRpdmVUZXh0dXJlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLm5hdGl2ZVRleHR1cmVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubmF0aXZlVGV4dHVyZXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMucGlwZWxpbmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5waXBlbGluZXNba2V5XS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5waXBlbGluZXNba2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENhbWVyYS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudE1hc2sgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudENhbWVyYU1hc2sgPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5jb250ZXh0TG9zdEhhbmRsZXIsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIHRoaXMuY29udGV4dFJlc3RvcmVkSGFuZGxlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZ2wgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5tYXNrU3RhY2sgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5jb250ZXh0TG9zdCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHt9O1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFdlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlJlbmRlcmVyLldlYkdMXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgVXRpbHM6IHJlcXVpcmUoJy4vVXRpbHMnKSxcclxuICAgIFdlYkdMUGlwZWxpbmU6IHJlcXVpcmUoJy4vV2ViR0xQaXBlbGluZScpLFxyXG4gICAgV2ViR0xSZW5kZXJlcjogcmVxdWlyZSgnLi9XZWJHTFJlbmRlcmVyJyksXHJcbiAgICBQaXBlbGluZXM6IHJlcXVpcmUoJy4vcGlwZWxpbmVzJyksXHJcblxyXG4gICAgLy8gQ29uc3RhbnRzXHJcbiAgICBCWVRFOiAwLFxyXG4gICAgU0hPUlQ6IDEsXHJcbiAgICBVTlNJR05FRF9CWVRFOiAyLFxyXG4gICAgVU5TSUdORURfU0hPUlQ6IDMsXHJcbiAgICBGTE9BVDogNFxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgRmVsaXBlIEFsZm9uc28gPEBiaXRuZW5mZXI+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgU2hhZGVyU291cmNlRlMgPSByZXF1aXJlKCcuLi9zaGFkZXJzL0JpdG1hcE1hc2stZnJhZy5qcycpO1xyXG52YXIgU2hhZGVyU291cmNlVlMgPSByZXF1aXJlKCcuLi9zaGFkZXJzL0JpdG1hcE1hc2stdmVydC5qcycpO1xyXG52YXIgV2ViR0xQaXBlbGluZSA9IHJlcXVpcmUoJy4uL1dlYkdMUGlwZWxpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEJpdG1hcE1hc2tQaXBlbGluZSBoYW5kbGVzIGFsbCBiaXRtYXAgbWFza2luZyByZW5kZXJpbmcgaW4gV2ViR0wuIEl0IHdvcmtzIGJ5IHVzaW5nIFxyXG4gKiBzYW1wbGluZyB0d28gdGV4dHVyZSBvbiB0aGUgZnJhZ21lbnQgc2hhZGVyIGFuZCB1c2luZyB0aGUgZnJhZ21lbnQncyBhbHBoYSB0byBjbGlwIHRoZSByZWdpb24uXHJcbiAqIFRoZSBjb25maWcgcHJvcGVydGllcyBhcmU6XHJcbiAqIC0gZ2FtZTogQ3VycmVudCBnYW1lIGluc3RhbmNlLlxyXG4gKiAtIHJlbmRlcmVyOiBDdXJyZW50IFdlYkdMIHJlbmRlcmVyLlxyXG4gKiAtIHRvcG9sb2d5OiBUaGlzIGluZGljYXRlcyBob3cgdGhlIHByaW1pdGl2ZXMgYXJlIHJlbmRlcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBHTF9UUklBTkdMRVMuXHJcbiAqICAgICAgICAgICAgICBIZXJlIGlzIHRoZSBmdWxsIGxpc3Qgb2YgcmVuZGVyaW5nIHByaW1pdGl2ZXMgKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTF9BUEkvQ29uc3RhbnRzKS5cclxuICogLSB2ZXJ0U2hhZGVyOiBTb3VyY2UgZm9yIHZlcnRleCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gZnJhZ1NoYWRlcjogU291cmNlIGZvciBmcmFnbWVudCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gdmVydGV4Q2FwYWNpdHk6IFRoZSBhbW91bnQgb2YgdmVydGljZXMgdGhhdCBzaGFsbCBiZSBhbGxvY2F0ZWRcclxuICogLSB2ZXJ0ZXhTaXplOiBUaGUgc2l6ZSBvZiBhIHNpbmdsZSB2ZXJ0ZXggaW4gYnl0ZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBCaXRtYXBNYXNrUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVXNlZCBmb3Igb3ZlcnJpZGluZyBzaGFkZXIgYW4gcGlwZWxpbmUgcHJvcGVydGllcyBpZiBleHRlbmRpbmcgdGhpcyBwaXBlbGluZS5cclxuICovXHJcbnZhciBCaXRtYXBNYXNrUGlwZWxpbmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFdlYkdMUGlwZWxpbmUsXHJcbiAgICBcclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQml0bWFwTWFza1BpcGVsaW5lIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgV2ViR0xQaXBlbGluZS5jYWxsKHRoaXMsIHtcclxuICAgICAgICAgICAgZ2FtZTogY29uZmlnLmdhbWUsXHJcbiAgICAgICAgICAgIHJlbmRlcmVyOiBjb25maWcucmVuZGVyZXIsXHJcbiAgICAgICAgICAgIGdsOiBjb25maWcucmVuZGVyZXIuZ2wsXHJcbiAgICAgICAgICAgIHRvcG9sb2d5OiAoY29uZmlnLnRvcG9sb2d5ID8gY29uZmlnLnRvcG9sb2d5IDogY29uZmlnLnJlbmRlcmVyLmdsLlRSSUFOR0xFUyksXHJcbiAgICAgICAgICAgIHZlcnRTaGFkZXI6IChjb25maWcudmVydFNoYWRlciA/IGNvbmZpZy52ZXJ0U2hhZGVyIDogU2hhZGVyU291cmNlVlMpLFxyXG4gICAgICAgICAgICBmcmFnU2hhZGVyOiAoY29uZmlnLmZyYWdTaGFkZXIgPyBjb25maWcuZnJhZ1NoYWRlciA6IFNoYWRlclNvdXJjZUZTKSxcclxuICAgICAgICAgICAgdmVydGV4Q2FwYWNpdHk6IChjb25maWcudmVydGV4Q2FwYWNpdHkgPyBjb25maWcudmVydGV4Q2FwYWNpdHkgOiAzKSxcclxuXHJcbiAgICAgICAgICAgIHZlcnRleFNpemU6IChjb25maWcudmVydGV4U2l6ZSA/IGNvbmZpZy52ZXJ0ZXhTaXplIDpcclxuICAgICAgICAgICAgICAgIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDIpLFxyXG5cclxuICAgICAgICAgICAgdmVydGljZXM6IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgICAgICAgLTEsICsxLCAtMSwgLTcsICs3LCArMVxyXG4gICAgICAgICAgICBdKS5idWZmZXIsXHJcblxyXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luUG9zaXRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY29uZmlnLnJlbmRlcmVyLmdsLkZMT0FULFxyXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZsb2F0MzIgdmlldyBvZiB0aGUgYXJyYXkgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBpcGVsaW5lJ3MgdmVydGljZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLkJpdG1hcE1hc2tQaXBlbGluZSN2ZXJ0ZXhWaWV3RjMyXHJcbiAgICAgICAgICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGV4RGF0YSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNpemUgb2YgdGhlIGJhdGNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5CaXRtYXBNYXNrUGlwZWxpbmUjbWF4UXVhZHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heFF1YWRzID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGlydHkgZmxhZyB0byBjaGVjayBpZiByZXNvbHV0aW9uIHByb3BlcnRpZXMgbmVlZCB0byBiZSB1cGRhdGVkIG9uIHRoZSBcclxuICAgICAgICAgKiBtYXNraW5nIHNoYWRlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuQml0bWFwTWFza1BpcGVsaW5lI3Jlc29sdXRpb25EaXJ0eVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb25EaXJ0eSA9IHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHBpcGVsaW5lIG5lZWRzIHRvIGJlIHVzZWQuXHJcbiAgICAgKiBJdCBiaW5kcyBhbGwgbmVjZXNzYXJ5IHJlc291cmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuQml0bWFwTWFza1BpcGVsaW5lI29uQmluZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBvbkJpbmQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgV2ViR0xQaXBlbGluZS5wcm90b3R5cGUub25CaW5kLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMucmVzb2x1dGlvbkRpcnR5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0RmxvYXQyKHByb2dyYW0sICd1UmVzb2x1dGlvbicsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0SW50MShwcm9ncmFtLCAndU1haW5TYW1wbGVyJywgMCk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEludDEocHJvZ3JhbSwgJ3VNYXNrU2FtcGxlcicsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc29sdXRpb25EaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzaXplcyB0aGlzIHBpcGVsaW5lIGFuZCB1cGRhdGVzIHRoZSBwcm9qZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5CaXRtYXBNYXNrUGlwZWxpbmUjcmVzaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gLSBUaGUgcmVzb2x1dGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgV2ViR0xQaXBlbGluZS5wcm90b3R5cGUucmVzaXplLmNhbGwodGhpcywgd2lkdGgsIGhlaWdodCwgcmVzb2x1dGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbkRpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmluZHMgbmVjZXNzYXJ5IHJlc291cmNlcyBhbmQgcmVuZGVycyB0aGUgbWFzayB0byBhIHNlcGFyYXRlZCBmcmFtZWJ1ZmZlci5cclxuICAgICAqIFRoZSBmcmFtZWJ1ZmZlciBmb3IgdGhlIG1hc2tlZCBvYmplY3QgaXMgYWxzbyBib3VuZCBmb3IgZnVydGhlciB1c2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLkJpdG1hcE1hc2tQaXBlbGluZSNiZWdpbk1hc2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG1hc2sgLSBHYW1lT2JqZWN0IHVzZWQgYXMgbWFzay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IG1hc2tlZE9iamVjdCAtIEdhbWVPYmplY3QgbWFza2VkIGJ5IHRoZSBtYXNrIEdhbWVPYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHJlbmRlcmluZyB0aGUgY3VycmVudCBtYXNrLlxyXG4gICAgICovXHJcbiAgICBiZWdpbk1hc2s6IGZ1bmN0aW9uIChtYXNrLCBtYXNrZWRPYmplY3QsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XHJcblxyXG4gICAgICAgIC8vICBUaGUgcmVuZGVyYWJsZSBHYW1lIE9iamVjdCB0aGF0IGlzIGJlaW5nIHVzZWQgZm9yIHRoZSBiaXRtYXAgbWFza1xyXG4gICAgICAgIHZhciBiaXRtYXBNYXNrID0gbWFzay5iaXRtYXBNYXNrO1xyXG5cclxuICAgICAgICBpZiAoYml0bWFwTWFzayAmJiBnbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmZsdXNoKCk7XHJcblxyXG4gICAgICAgICAgICBtYXNrLnByZXZGcmFtZWJ1ZmZlciA9IHJlbmRlcmVyLmN1cnJlbnRGcmFtZWJ1ZmZlcjtcclxuXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKG1hc2subWFpbkZyYW1lYnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmNsZWFyQ29sb3IoMCwgMCwgMCwgMCk7XHJcblxyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZW5kZXJlci5jdXJyZW50Q2FtZXJhTWFzay5tYXNrICE9PSBtYXNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5jdXJyZW50TWFzay5tYXNrID0gbWFzaztcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmN1cnJlbnRNYXNrLmNhbWVyYSA9IGNhbWVyYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFza2VkIGdhbWUgb2JqZWN0cyBmcmFtZWJ1ZmZlciBpcyB1bmJvdW5kIGFuZCBpdHMgdGV4dHVyZSBcclxuICAgICAqIGlzIGJvdW5kIHRvZ2V0aGVyIHdpdGggdGhlIG1hc2sgdGV4dHVyZSBhbmQgdGhlIG1hc2sgc2hhZGVyIGFuZCBcclxuICAgICAqIGEgZHJhdyBjYWxsIHdpdGggYSBzaW5nbGUgcXVhZCBpcyBwcm9jZXNzZWQuIEhlcmUgaXMgd2hlcmUgdGhlXHJcbiAgICAgKiBtYXNraW5nIGVmZmVjdCBpcyBhcHBsaWVkLiAgXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLkJpdG1hcE1hc2tQaXBlbGluZSNlbmRNYXNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBtYXNrIC0gR2FtZU9iamVjdCB1c2VkIGFzIGEgbWFzay5cclxuICAgICAqL1xyXG4gICAgZW5kTWFzazogZnVuY3Rpb24gKG1hc2ssIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG4gICAgICAgIC8vICBUaGUgcmVuZGVyYWJsZSBHYW1lIE9iamVjdCB0aGF0IGlzIGJlaW5nIHVzZWQgZm9yIHRoZSBiaXRtYXAgbWFza1xyXG4gICAgICAgIHZhciBiaXRtYXBNYXNrID0gbWFzay5iaXRtYXBNYXNrO1xyXG5cclxuICAgICAgICBpZiAoYml0bWFwTWFzayAmJiBnbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLmZsdXNoKCk7XHJcblxyXG4gICAgICAgICAgICAvLyAgRmlyc3Qgd2UgZHJhdyB0aGUgbWFzayB0byB0aGUgbWFzayBmYlxyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRGcmFtZWJ1ZmZlcihtYXNrLm1hc2tGcmFtZWJ1ZmZlcik7XHJcblxyXG4gICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTtcclxuXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEJsZW5kTW9kZSgwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGJpdG1hcE1hc2sucmVuZGVyV2ViR0wocmVuZGVyZXIsIGJpdG1hcE1hc2ssIDAsIGNhbWVyYSk7XHJcblxyXG4gICAgICAgICAgICByZW5kZXJlci5mbHVzaCgpO1xyXG5cclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0RnJhbWVidWZmZXIobWFzay5wcmV2RnJhbWVidWZmZXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gIElzIHRoZXJlIGEgc3RlbmNpbCBmdXJ0aGVyIHVwIHRoZSBzdGFjaz9cclxuICAgICAgICAgICAgdmFyIHByZXYgPSByZW5kZXJlci5nZXRDdXJyZW50U3RlbmNpbE1hc2soKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwcmV2KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwcmV2Lm1hc2suYXBwbHlTdGVuY2lsKHJlbmRlcmVyLCBwcmV2LmNhbWVyYSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlci5jdXJyZW50TWFzay5tYXNrID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIEJpbmQgYml0bWFwIG1hc2sgcGlwZWxpbmUgYW5kIGRyYXdcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUxKTtcclxuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbWFzay5tYXNrVGV4dHVyZSk7XHJcblxyXG4gICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcclxuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbWFzay5tYWluVGV4dHVyZSk7XHJcblxyXG4gICAgICAgICAgICBnbC51bmlmb3JtMWkoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ3VJbnZlcnRNYXNrQWxwaGEnKSwgbWFzay5pbnZlcnRBbHBoYSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgRmluYWxseSwgZHJhdyBhIHRyaWFuZ2xlIGZpbGxpbmcgdGhlIHdob2xlIHNjcmVlblxyXG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKHRoaXMudG9wb2xvZ3ksIDAsIDMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCaXRtYXBNYXNrUGlwZWxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIFNoYWRlclNvdXJjZUZTID0gcmVxdWlyZSgnLi4vc2hhZGVycy9Gb3J3YXJkRGlmZnVzZS1mcmFnLmpzJyk7XHJcbnZhciBUZXh0dXJlVGludFBpcGVsaW5lID0gcmVxdWlyZSgnLi9UZXh0dXJlVGludFBpcGVsaW5lJyk7XHJcblxyXG52YXIgTElHSFRfQ09VTlQgPSAxMDtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZSBpbXBsZW1lbnRzIGEgZm9yd2FyZCByZW5kZXJpbmcgYXBwcm9hY2ggZm9yIDJEIGxpZ2h0cy5cclxuICogVGhpcyBwaXBlbGluZSBleHRlbmRzIFRleHR1cmVUaW50UGlwZWxpbmUgc28gaXQgaW1wbGVtZW50cyBhbGwgaXQncyByZW5kZXJpbmcgZnVuY3Rpb25zXHJcbiAqIGFuZCBiYXRjaGluZyBzeXN0ZW0uXHJcbiAqXHJcbiAqIEBjbGFzcyBGb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwaXBlbGluZSwgc2FtZSBhcyB0aGUge0BsaW5rIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZX0uIFRoZSBmcmFnbWVudCBzaGFkZXIgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBsaWdodGluZyBzaGFkZXIuXHJcbiAqL1xyXG52YXIgRm9yd2FyZERpZmZ1c2VMaWdodFBpcGVsaW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBUZXh0dXJlVGludFBpcGVsaW5lLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRm9yd2FyZERpZmZ1c2VMaWdodFBpcGVsaW5lIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgTElHSFRfQ09VTlQgPSBjb25maWcubWF4TGlnaHRzO1xyXG5cclxuICAgICAgICBjb25maWcuZnJhZ1NoYWRlciA9IFNoYWRlclNvdXJjZUZTLnJlcGxhY2UoJyVMSUdIVF9DT1VOVCUnLCBMSUdIVF9DT1VOVC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgVGV4dHVyZVRpbnRQaXBlbGluZS5jYWxsKHRoaXMsIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQgbm9ybWFsIG1hcCB0ZXh0dXJlIHRvIHVzZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuRm9yd2FyZERpZmZ1c2VMaWdodFBpcGVsaW5lI2RlZmF1bHROb3JtYWxNYXBcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmUuRnJhbWV9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Tm9ybWFsTWFwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnZlcnNlIHJvdGF0aW9uIG1hdHJpeCBmb3Igbm9ybWFsIG1hcCByb3RhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLkZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZSNpbnZlcnNlUm90YXRpb25NYXRyaXhcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW52ZXJzZVJvdGF0aW9uTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgICAgIDEsIDAsIDAsXHJcbiAgICAgICAgICAgIDAsIDEsIDAsXHJcbiAgICAgICAgICAgIDAsIDAsIDFcclxuICAgICAgICBdKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgR2FtZSBoYXMgZnVsbHkgYm9vdGVkIGFuZCB0aGUgUmVuZGVyZXIgaGFzIGZpbmlzaGVkIHNldHRpbmcgdXAuXHJcbiAgICAgKiBcclxuICAgICAqIEJ5IHRoaXMgc3RhZ2UgYWxsIEdhbWUgbGV2ZWwgc3lzdGVtcyBhcmUgbm93IGluIHBsYWNlIGFuZCB5b3UgY2FuIHBlcmZvcm0gYW55IGZpbmFsXHJcbiAgICAgKiB0YXNrcyB0aGF0IHRoZSBwaXBlbGluZSBtYXkgbmVlZCB0aGF0IHJlbGllZCBvbiBnYW1lIHN5c3RlbXMgc3VjaCBhcyB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUjYm9vdFxyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKi9cclxuICAgIGJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Tm9ybWFsTWFwID0gdGhpcy5nYW1lLnRleHR1cmVzLmdldEZyYW1lKCdfX0RFRkFVTFQnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJpbmRzIGl0cyBiYXNlIGNsYXNzIHJlc291cmNlcyBhbmQgdGhpcyBsaWdodHMgMkQgcmVzb3VyY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUjb25CaW5kXHJcbiAgICAgKiBAb3ZlcnJpZGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBbZ2FtZU9iamVjdF0gLSBUaGUgR2FtZSBPYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgcGlwZWxpbmUsIGlmIGFueS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uQmluZDogZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgVGV4dHVyZVRpbnRQaXBlbGluZS5wcm90b3R5cGUub25CaW5kLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcblxyXG4gICAgICAgIHRoaXMubXZwVXBkYXRlKCk7XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLnNldEludDEocHJvZ3JhbSwgJ3VOb3JtU2FtcGxlcicsIDEpO1xyXG4gICAgICAgIHJlbmRlcmVyLnNldEZsb2F0Mihwcm9ncmFtLCAndVJlc29sdXRpb24nLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROb3JtYWxNYXAoZ2FtZU9iamVjdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgYWxsIHRoZSBuZWVkZWQgcmVzb3VyY2VzIGZvciBlYWNoIGNhbWVyYSBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUjb25SZW5kZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSBiZWluZyByZW5kZXJlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBTY2VuZSBDYW1lcmEgYmVpbmcgcmVuZGVyZWQgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uUmVuZGVyOiBmdW5jdGlvbiAoc2NlbmUsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgbGlnaHRNYW5hZ2VyID0gc2NlbmUuc3lzLmxpZ2h0cztcclxuXHJcbiAgICAgICAgaWYgKCFsaWdodE1hbmFnZXIgfHwgbGlnaHRNYW5hZ2VyLmxpZ2h0cy5sZW5ndGggPD0gMCB8fCAhbGlnaHRNYW5hZ2VyLmFjdGl2ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBQYXNzdGhydVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsaWdodHMgPSBsaWdodE1hbmFnZXIuY3VsbChjYW1lcmEpO1xyXG4gICAgICAgIHZhciBsaWdodENvdW50ID0gTWF0aC5taW4obGlnaHRzLmxlbmd0aCwgTElHSFRfQ09VTlQpO1xyXG5cclxuICAgICAgICBpZiAobGlnaHRDb3VudCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG4gICAgICAgIHZhciBwcm9ncmFtID0gdGhpcy5wcm9ncmFtO1xyXG4gICAgICAgIHZhciBjYW1lcmFNYXRyaXggPSBjYW1lcmEubWF0cml4O1xyXG4gICAgICAgIHZhciBwb2ludCA9IHt4OiAwLCB5OiAwfTtcclxuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVuZGVyZXIuaGVpZ2h0O1xyXG4gICAgICAgIHZhciBpbmRleDtcclxuXHJcbiAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTElHSFRfQ09VTlQ7ICsraW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUmVzZXQgbGlnaHRzXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEZsb2F0MShwcm9ncmFtLCAndUxpZ2h0c1snICsgaW5kZXggKyAnXS5yYWRpdXMnLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlcmVyLnNldEZsb2F0NChwcm9ncmFtLCAndUNhbWVyYScsIGNhbWVyYS54LCBjYW1lcmEueSwgY2FtZXJhLnJvdGF0aW9uLCBjYW1lcmEuem9vbSk7XHJcbiAgICAgICAgcmVuZGVyZXIuc2V0RmxvYXQzKHByb2dyYW0sICd1QW1iaWVudExpZ2h0Q29sb3InLCBsaWdodE1hbmFnZXIuYW1iaWVudENvbG9yLnIsIGxpZ2h0TWFuYWdlci5hbWJpZW50Q29sb3IuZywgbGlnaHRNYW5hZ2VyLmFtYmllbnRDb2xvci5iKTtcclxuXHJcbiAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGlnaHRDb3VudDsgKytpbmRleClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsaWdodCA9IGxpZ2h0c1tpbmRleF07XHJcbiAgICAgICAgICAgIHZhciBsaWdodE5hbWUgPSAndUxpZ2h0c1snICsgaW5kZXggKyAnXS4nO1xyXG5cclxuICAgICAgICAgICAgY2FtZXJhTWF0cml4LnRyYW5zZm9ybVBvaW50KGxpZ2h0LngsIGxpZ2h0LnksIHBvaW50KTtcclxuXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEZsb2F0Mihwcm9ncmFtLCBsaWdodE5hbWUgKyAncG9zaXRpb24nLCBwb2ludC54IC0gKGNhbWVyYS5zY3JvbGxYICogbGlnaHQuc2Nyb2xsRmFjdG9yWCAqIGNhbWVyYS56b29tKSwgaGVpZ2h0IC0gKHBvaW50LnkgLSAoY2FtZXJhLnNjcm9sbFkgKiBsaWdodC5zY3JvbGxGYWN0b3JZKSAqIGNhbWVyYS56b29tKSk7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEZsb2F0Myhwcm9ncmFtLCBsaWdodE5hbWUgKyAnY29sb3InLCBsaWdodC5yLCBsaWdodC5nLCBsaWdodC5iKTtcclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0RmxvYXQxKHByb2dyYW0sIGxpZ2h0TmFtZSArICdpbnRlbnNpdHknLCBsaWdodC5pbnRlbnNpdHkpO1xyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRGbG9hdDEocHJvZ3JhbSwgbGlnaHROYW1lICsgJ3JhZGl1cycsIGxpZ2h0LnJhZGl1cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnROb3JtYWxNYXBSb3RhdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGJhdGNoaW5nIGEgdGV4dHVyZWQgcXVhZFxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUjYmF0Y2hUZXh0dXJlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBnYW1lT2JqZWN0IC0gU291cmNlIEdhbWVPYmplY3RcclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB0ZXh0dXJlIC0gUmF3IFdlYkdMVGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHF1YWRcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGV4dHVyZVdpZHRoIC0gUmVhbCB0ZXh0dXJlIHdpZHRoXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRleHR1cmVIZWlnaHQgLSBSZWFsIHRleHR1cmUgaGVpZ2h0XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjWCAtIFggY29vcmRpbmF0ZSBvZiB0aGUgcXVhZFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY1kgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNXaWR0aCAtIFdpZHRoIG9mIHRoZSBxdWFkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBxdWFkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVYIC0gWCBjb21wb25lbnQgb2Ygc2NhbGVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZVkgLSBZIGNvbXBvbmVudCBvZiBzY2FsZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0aW9uIC0gUm90YXRpb24gb2YgdGhlIHF1YWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFggLSBJbmRpY2F0ZXMgaWYgdGhlIHF1YWQgaXMgaG9yaXpvbnRhbGx5IGZsaXBwZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFkgLSBJbmRpY2F0ZXMgaWYgdGhlIHF1YWQgaXMgdmVydGljYWxseSBmbGlwcGVkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsRmFjdG9yWCAtIEJ5IHdoaWNoIGZhY3RvciBpcyB0aGUgcXVhZCBhZmZlY3RlZCBieSB0aGUgY2FtZXJhIGhvcml6b250YWwgc2Nyb2xsXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsRmFjdG9yWSAtIEJ5IHdoaWNoIGZhY3RvciBpcyB0aGUgcXVhZCBlZmZlY3RlZCBieSB0aGUgY2FtZXJhIHZlcnRpY2FsIHNjcm9sbFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3BsYXlPcmlnaW5YIC0gSG9yaXpvbnRhbCBvcmlnaW4gaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlzcGxheU9yaWdpblkgLSBWZXJ0aWNhbCBvcmlnaW4gaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVYIC0gWCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlIGZyYW1lXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVZIC0gWSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlIGZyYW1lXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVXaWR0aCAtIFdpZHRoIG9mIHRoZSB0ZXh0dXJlIGZyYW1lXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHRleHR1cmUgZnJhbWVcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGludFRMIC0gVGludCBmb3IgdG9wIGxlZnRcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGludFRSIC0gVGludCBmb3IgdG9wIHJpZ2h0XHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbnRCTCAtIFRpbnQgZm9yIGJvdHRvbSBsZWZ0XHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbnRCUiAtIFRpbnQgZm9yIGJvdHRvbSByaWdodFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbnRFZmZlY3QgLSBUaGUgdGludCBlZmZlY3QgKDAgZm9yIGFkZGl0aXZlLCAxIGZvciByZXBsYWNlbWVudClcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1T2Zmc2V0IC0gSG9yaXpvbnRhbCBvZmZzZXQgb24gdGV4dHVyZSBjb29yZGluYXRlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdk9mZnNldCAtIFZlcnRpY2FsIG9mZnNldCBvbiB0ZXh0dXJlIGNvb3JkaW5hdGVcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIEN1cnJlbnQgdXNlZCBjYW1lcmFcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRUcmFuc2Zvcm1NYXRyaXggLSBQYXJlbnQgY29udGFpbmVyXHJcbiAgICAgKi9cclxuICAgIGJhdGNoVGV4dHVyZTogZnVuY3Rpb24gKFxyXG4gICAgICAgIGdhbWVPYmplY3QsXHJcbiAgICAgICAgdGV4dHVyZSxcclxuICAgICAgICB0ZXh0dXJlV2lkdGgsIHRleHR1cmVIZWlnaHQsXHJcbiAgICAgICAgc3JjWCwgc3JjWSxcclxuICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LFxyXG4gICAgICAgIHNjYWxlWCwgc2NhbGVZLFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIGZsaXBYLCBmbGlwWSxcclxuICAgICAgICBzY3JvbGxGYWN0b3JYLCBzY3JvbGxGYWN0b3JZLFxyXG4gICAgICAgIGRpc3BsYXlPcmlnaW5YLCBkaXNwbGF5T3JpZ2luWSxcclxuICAgICAgICBmcmFtZVgsIGZyYW1lWSwgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQsXHJcbiAgICAgICAgdGludFRMLCB0aW50VFIsIHRpbnRCTCwgdGludEJSLCB0aW50RWZmZWN0LFxyXG4gICAgICAgIHVPZmZzZXQsIHZPZmZzZXQsXHJcbiAgICAgICAgY2FtZXJhLFxyXG4gICAgICAgIHBhcmVudFRyYW5zZm9ybU1hdHJpeClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXBlbGluZSh0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIG5vcm1hbFRleHR1cmU7XHJcblxyXG4gICAgICAgIGlmIChnYW1lT2JqZWN0LmRpc3BsYXlUZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm9ybWFsVGV4dHVyZSA9IGdhbWVPYmplY3QuZGlzcGxheVRleHR1cmUuZGF0YVNvdXJjZVtnYW1lT2JqZWN0LmRpc3BsYXlGcmFtZS5zb3VyY2VJbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGdhbWVPYmplY3QudGV4dHVyZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5vcm1hbFRleHR1cmUgPSBnYW1lT2JqZWN0LnRleHR1cmUuZGF0YVNvdXJjZVtnYW1lT2JqZWN0LmZyYW1lLnNvdXJjZUluZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZ2FtZU9iamVjdC50aWxlc2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZ2FtZU9iamVjdC50aWxlc2V0KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm9ybWFsVGV4dHVyZSA9IGdhbWVPYmplY3QudGlsZXNldFswXS5pbWFnZS5kYXRhU291cmNlWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm9ybWFsVGV4dHVyZSA9IGdhbWVPYmplY3QudGlsZXNldC5pbWFnZS5kYXRhU291cmNlWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW5vcm1hbFRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vcm1hbCBtYXAgbWlzc2luZyBvciBpbnZhbGlkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKG5vcm1hbFRleHR1cmUuZ2xUZXh0dXJlLCAxKTtcclxuICAgICAgICB0aGlzLnNldE5vcm1hbE1hcFJvdGF0aW9uKHJvdGF0aW9uKTtcclxuXHJcbiAgICAgICAgdmFyIGNhbU1hdHJpeCA9IHRoaXMuX3RlbXBNYXRyaXgxO1xyXG4gICAgICAgIHZhciBzcHJpdGVNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MjtcclxuICAgICAgICB2YXIgY2FsY01hdHJpeCA9IHRoaXMuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgICAgICB2YXIgdTAgPSAoZnJhbWVYIC8gdGV4dHVyZVdpZHRoKSArIHVPZmZzZXQ7XHJcbiAgICAgICAgdmFyIHYwID0gKGZyYW1lWSAvIHRleHR1cmVIZWlnaHQpICsgdk9mZnNldDtcclxuICAgICAgICB2YXIgdTEgPSAoZnJhbWVYICsgZnJhbWVXaWR0aCkgLyB0ZXh0dXJlV2lkdGggKyB1T2Zmc2V0O1xyXG4gICAgICAgIHZhciB2MSA9IChmcmFtZVkgKyBmcmFtZUhlaWdodCkgLyB0ZXh0dXJlSGVpZ2h0ICsgdk9mZnNldDtcclxuXHJcbiAgICAgICAgdmFyIHdpZHRoID0gc3JjV2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHNyY0hlaWdodDtcclxuXHJcbiAgICAgICAgLy8gdmFyIHggPSAtZGlzcGxheU9yaWdpblggKyBmcmFtZVg7XHJcbiAgICAgICAgLy8gdmFyIHkgPSAtZGlzcGxheU9yaWdpblkgKyBmcmFtZVk7XHJcblxyXG4gICAgICAgIHZhciB4ID0gLWRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciB5ID0gLWRpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5pc0Nyb3BwZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3JvcCA9IGdhbWVPYmplY3QuX2Nyb3A7XHJcblxyXG4gICAgICAgICAgICB3aWR0aCA9IGNyb3Aud2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3AuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgc3JjV2lkdGggPSBjcm9wLndpZHRoO1xyXG4gICAgICAgICAgICBzcmNIZWlnaHQgPSBjcm9wLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lWCA9IGNyb3AueDtcclxuICAgICAgICAgICAgZnJhbWVZID0gY3JvcC55O1xyXG5cclxuICAgICAgICAgICAgdmFyIG94ID0gZnJhbWVYO1xyXG4gICAgICAgICAgICB2YXIgb3kgPSBmcmFtZVk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG94ID0gKGZyYW1lV2lkdGggLSBjcm9wLnggLSBjcm9wLndpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGlmIChmbGlwWSAmJiAhdGV4dHVyZS5pc1JlbmRlclRleHR1cmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG95ID0gKGZyYW1lSGVpZ2h0IC0gY3JvcC55IC0gY3JvcC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1MCA9IChveCAvIHRleHR1cmVXaWR0aCkgKyB1T2Zmc2V0O1xyXG4gICAgICAgICAgICB2MCA9IChveSAvIHRleHR1cmVIZWlnaHQpICsgdk9mZnNldDtcclxuICAgICAgICAgICAgdTEgPSAob3ggKyBjcm9wLndpZHRoKSAvIHRleHR1cmVXaWR0aCArIHVPZmZzZXQ7XHJcbiAgICAgICAgICAgIHYxID0gKG95ICsgY3JvcC5oZWlnaHQpIC8gdGV4dHVyZUhlaWdodCArIHZPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICB4ID0gLWRpc3BsYXlPcmlnaW5YICsgZnJhbWVYO1xyXG4gICAgICAgICAgICB5ID0gLWRpc3BsYXlPcmlnaW5ZICsgZnJhbWVZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEludmVydCB0aGUgZmxpcFkgaWYgdGhpcyBpcyBhIFJlbmRlclRleHR1cmVcclxuICAgICAgICBmbGlwWSA9IGZsaXBZIF4gKHRleHR1cmUuaXNSZW5kZXJUZXh0dXJlID8gMSA6IDApO1xyXG5cclxuICAgICAgICBpZiAoZmxpcFgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3aWR0aCAqPSAtMTtcclxuICAgICAgICAgICAgeCArPSBzcmNXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmbGlwWSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlaWdodCAqPSAtMTtcclxuICAgICAgICAgICAgeSArPSBzcmNIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgRG8gd2UgbmVlZCB0aGlzPyAoZG91YnQgaXQpXHJcbiAgICAgICAgLy8gaWYgKGNhbWVyYS5yb3VuZFBpeGVscylcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHggfD0gMDtcclxuICAgICAgICAvLyAgICAgeSB8PSAwO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoO1xyXG4gICAgICAgIHZhciB5aCA9IHkgKyBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3JjWCwgc3JjWSwgcm90YXRpb24sIHNjYWxlWCwgc2NhbGVZKTtcclxuXHJcbiAgICAgICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50VHJhbnNmb3JtTWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRUcmFuc2Zvcm1NYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcmNYO1xyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNyY1k7XHJcblxyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgICAgIHNwcml0ZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc2Nyb2xsRmFjdG9yWTtcclxuICAgIFxyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHR4MCA9IGNhbGNNYXRyaXguZ2V0WCh4LCB5KTtcclxuICAgICAgICB2YXIgdHkwID0gY2FsY01hdHJpeC5nZXRZKHgsIHkpO1xyXG5cclxuICAgICAgICB2YXIgdHgxID0gY2FsY01hdHJpeC5nZXRYKHgsIHloKTtcclxuICAgICAgICB2YXIgdHkxID0gY2FsY01hdHJpeC5nZXRZKHgsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MiA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeWgpO1xyXG4gICAgICAgIHZhciB0eTIgPSBjYWxjTWF0cml4LmdldFkoeHcsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MyA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeSk7XHJcbiAgICAgICAgdmFyIHR5MyA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeSk7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucm91bmRQaXhlbHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0eDAgPSBNYXRoLnJvdW5kKHR4MCk7XHJcbiAgICAgICAgICAgIHR5MCA9IE1hdGgucm91bmQodHkwKTtcclxuXHJcbiAgICAgICAgICAgIHR4MSA9IE1hdGgucm91bmQodHgxKTtcclxuICAgICAgICAgICAgdHkxID0gTWF0aC5yb3VuZCh0eTEpO1xyXG5cclxuICAgICAgICAgICAgdHgyID0gTWF0aC5yb3VuZCh0eDIpO1xyXG4gICAgICAgICAgICB0eTIgPSBNYXRoLnJvdW5kKHR5Mik7XHJcblxyXG4gICAgICAgICAgICB0eDMgPSBNYXRoLnJvdW5kKHR4Myk7XHJcbiAgICAgICAgICAgIHR5MyA9IE1hdGgucm91bmQodHkzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgICAgICB0aGlzLmJhdGNoUXVhZCh0eDAsIHR5MCwgdHgxLCB0eTEsIHR4MiwgdHkyLCB0eDMsIHR5MywgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCwgdGV4dHVyZSwgMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgR2FtZSBPYmplY3RzIG5vcm1hbCBtYXAgYXMgdGhlIGFjdGl2ZSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUjc2V0Tm9ybWFsTWFwXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0byB1cGRhdGUuXHJcbiAgICAgKi9cclxuICAgIHNldE5vcm1hbE1hcDogZnVuY3Rpb24gKGdhbWVPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSB8fCAhZ2FtZU9iamVjdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBub3JtYWxUZXh0dXJlO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC50ZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm9ybWFsVGV4dHVyZSA9IGdhbWVPYmplY3QudGV4dHVyZS5kYXRhU291cmNlW2dhbWVPYmplY3QuZnJhbWUuc291cmNlSW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFub3JtYWxUZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm9ybWFsVGV4dHVyZSA9IHRoaXMuZGVmYXVsdE5vcm1hbE1hcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKG5vcm1hbFRleHR1cmUuZ2xUZXh0dXJlLCAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXBlbGluZShnYW1lT2JqZWN0LmRlZmF1bHRQaXBlbGluZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB0aGUgbm9ybWFsIG1hcCB2ZWN0b3JzIGludmVyc2VseSBieSB0aGUgZ2l2ZW4gYW5nbGUuXHJcbiAgICAgKiBPbmx5IHdvcmtzIGluIDJEIHNwYWNlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuRm9yd2FyZERpZmZ1c2VMaWdodFBpcGVsaW5lI3NldE5vcm1hbE1hcFJvdGF0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG4gICAgICovXHJcbiAgICBzZXROb3JtYWxNYXBSb3RhdGlvbjogZnVuY3Rpb24gKHJvdGF0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChyb3RhdGlvbiAhPT0gdGhpcy5jdXJyZW50Tm9ybWFsTWFwUm90YXRpb24gfHwgdGhpcy5iYXRjaGVzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhdGNoZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgaW52ZXJzZVJvdGF0aW9uTWF0cml4ID0gdGhpcy5pbnZlcnNlUm90YXRpb25NYXRyaXg7XHJcblxyXG4gICAgICAgICAgICBpZiAocm90YXRpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciByb3QgPSAtcm90YXRpb247XHJcbiAgICAgICAgICAgICAgICB2YXIgYyA9IE1hdGguY29zKHJvdCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcyA9IE1hdGguc2luKHJvdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaW52ZXJzZVJvdGF0aW9uTWF0cml4WzFdID0gcztcclxuICAgICAgICAgICAgICAgIGludmVyc2VSb3RhdGlvbk1hdHJpeFszXSA9IC1zO1xyXG4gICAgICAgICAgICAgICAgaW52ZXJzZVJvdGF0aW9uTWF0cml4WzBdID0gaW52ZXJzZVJvdGF0aW9uTWF0cml4WzRdID0gYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGludmVyc2VSb3RhdGlvbk1hdHJpeFswXSA9IGludmVyc2VSb3RhdGlvbk1hdHJpeFs0XSA9IDE7XHJcbiAgICAgICAgICAgICAgICBpbnZlcnNlUm90YXRpb25NYXRyaXhbMV0gPSBpbnZlcnNlUm90YXRpb25NYXRyaXhbM10gPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldE1hdHJpeDModGhpcy5wcm9ncmFtLCAndUludmVyc2VSb3RhdGlvbk1hdHJpeCcsIGZhbHNlLCBpbnZlcnNlUm90YXRpb25NYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9ybWFsTWFwUm90YXRpb24gPSByb3RhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBTcHJpdGUgR2FtZSBPYmplY3QsIG9yIGFueSBvYmplY3QgdGhhdCBleHRlbmRzIGl0LCB3aGljaCBoYXMgYSBub3JtYWwgdGV4dHVyZSBhbmQgYWRkcyBpdCB0byB0aGUgYmF0Y2guXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLkZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZSNiYXRjaFNwcml0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlfSBzcHJpdGUgLSBUaGUgdGV4dHVyZS1iYXNlZCBHYW1lIE9iamVjdCB0byBhZGQgdG8gdGhlIGJhdGNoLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIENhbWVyYSB0byB1c2UgZm9yIHRoZSByZW5kZXJpbmcgdHJhbnNmb3JtLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudFRyYW5zZm9ybU1hdHJpeCAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4IG9mIHRoZSBwYXJlbnQgY29udGFpbmVyLCBpZiBzZXQuXHJcbiAgICAgKi9cclxuICAgIGJhdGNoU3ByaXRlOiBmdW5jdGlvbiAoc3ByaXRlLCBjYW1lcmEsIHBhcmVudFRyYW5zZm9ybU1hdHJpeClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG5vcm1hbFRleHR1cmUgPSBzcHJpdGUudGV4dHVyZS5kYXRhU291cmNlW3Nwcml0ZS5mcmFtZS5zb3VyY2VJbmRleF07XHJcblxyXG4gICAgICAgIGlmIChub3JtYWxUZXh0dXJlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXBlbGluZSh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKG5vcm1hbFRleHR1cmUuZ2xUZXh0dXJlLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5zZXROb3JtYWxNYXBSb3RhdGlvbihzcHJpdGUucm90YXRpb24pO1xyXG5cclxuICAgICAgICAgICAgVGV4dHVyZVRpbnRQaXBlbGluZS5wcm90b3R5cGUuYmF0Y2hTcHJpdGUuY2FsbCh0aGlzLCBzcHJpdGUsIGNhbWVyYSwgcGFyZW50VHJhbnNmb3JtTWF0cml4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbkZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZS5MSUdIVF9DT1VOVCA9IExJR0hUX0NPVU5UO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEVhcmN1dCA9IHJlcXVpcmUoJy4uLy4uLy4uL2dlb20vcG9seWdvbi9FYXJjdXQnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIE1vZGVsVmlld1Byb2plY3Rpb24gPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvTW9kZWxWaWV3UHJvamVjdGlvbicpO1xyXG52YXIgU2hhZGVyU291cmNlRlMgPSByZXF1aXJlKCcuLi9zaGFkZXJzL1RleHR1cmVUaW50LWZyYWcuanMnKTtcclxudmFyIFNoYWRlclNvdXJjZVZTID0gcmVxdWlyZSgnLi4vc2hhZGVycy9UZXh0dXJlVGludC12ZXJ0LmpzJyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuLi8uLi8uLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG52YXIgVXRpbHMgPSByZXF1aXJlKCcuLi9VdGlscycpO1xyXG52YXIgV2ViR0xQaXBlbGluZSA9IHJlcXVpcmUoJy4uL1dlYkdMUGlwZWxpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRleHR1cmVUaW50UGlwZWxpbmUgaW1wbGVtZW50cyB0aGUgcmVuZGVyaW5nIGluZnJhc3RydWN0dXJlXHJcbiAqIGZvciBkaXNwbGF5aW5nIHRleHR1cmVkIG9iamVjdHNcclxuICogVGhlIGNvbmZpZyBwcm9wZXJ0aWVzIGFyZTpcclxuICogLSBnYW1lOiBDdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAqIC0gcmVuZGVyZXI6IEN1cnJlbnQgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIC0gdG9wb2xvZ3k6IFRoaXMgaW5kaWNhdGVzIGhvdyB0aGUgcHJpbWl0aXZlcyBhcmUgcmVuZGVyZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEdMX1RSSUFOR0xFUy5cclxuICogICAgICAgICAgICAgIEhlcmUgaXMgdGhlIGZ1bGwgbGlzdCBvZiByZW5kZXJpbmcgcHJpbWl0aXZlcyAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMX0FQSS9Db25zdGFudHMpLlxyXG4gKiAtIHZlcnRTaGFkZXI6IFNvdXJjZSBmb3IgdmVydGV4IHNoYWRlciBhcyBhIHN0cmluZy5cclxuICogLSBmcmFnU2hhZGVyOiBTb3VyY2UgZm9yIGZyYWdtZW50IHNoYWRlciBhcyBhIHN0cmluZy5cclxuICogLSB2ZXJ0ZXhDYXBhY2l0eTogVGhlIGFtb3VudCBvZiB2ZXJ0aWNlcyB0aGF0IHNoYWxsIGJlIGFsbG9jYXRlZFxyXG4gKiAtIHZlcnRleFNpemU6IFRoZSBzaXplIG9mIGEgc2luZ2xlIHZlcnRleCBpbiBieXRlcy5cclxuICpcclxuICogQGNsYXNzIFRleHR1cmVUaW50UGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhpcyBUZXh0dXJlIFRpbnQgUGlwZWxpbmUsIGFzIGRlc2NyaWJlZCBhYm92ZS5cclxuICovXHJcbnZhciBUZXh0dXJlVGludFBpcGVsaW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBXZWJHTFBpcGVsaW5lLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIE1vZGVsVmlld1Byb2plY3Rpb25cclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUZXh0dXJlVGludFBpcGVsaW5lIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVyQ29uZmlnID0gY29uZmlnLnJlbmRlcmVyLmNvbmZpZztcclxuXHJcbiAgICAgICAgLy8gIFZlcnRleCBTaXplID0gYXR0cmlidXRlIHNpemUgYWRkZWQgdG9nZXRoZXIgKDIgKyAyICsgMSArIDQpXHJcblxyXG4gICAgICAgIFdlYkdMUGlwZWxpbmUuY2FsbCh0aGlzLCB7XHJcbiAgICAgICAgICAgIGdhbWU6IGNvbmZpZy5nYW1lLFxyXG4gICAgICAgICAgICByZW5kZXJlcjogY29uZmlnLnJlbmRlcmVyLFxyXG4gICAgICAgICAgICBnbDogY29uZmlnLnJlbmRlcmVyLmdsLFxyXG4gICAgICAgICAgICB0b3BvbG9neTogR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RvcG9sb2d5JywgY29uZmlnLnJlbmRlcmVyLmdsLlRSSUFOR0xFUyksXHJcbiAgICAgICAgICAgIHZlcnRTaGFkZXI6IEdldEZhc3RWYWx1ZShjb25maWcsICd2ZXJ0U2hhZGVyJywgU2hhZGVyU291cmNlVlMpLFxyXG4gICAgICAgICAgICBmcmFnU2hhZGVyOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZnJhZ1NoYWRlcicsIFNoYWRlclNvdXJjZUZTKSxcclxuICAgICAgICAgICAgdmVydGV4Q2FwYWNpdHk6IEdldEZhc3RWYWx1ZShjb25maWcsICd2ZXJ0ZXhDYXBhY2l0eScsIDYgKiByZW5kZXJlckNvbmZpZy5iYXRjaFNpemUpLFxyXG4gICAgICAgICAgICB2ZXJ0ZXhTaXplOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndmVydGV4U2l6ZScsIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDUgKyBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogNCksXHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaW5Qb3NpdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb25maWcucmVuZGVyZXIuZ2wuRkxPQVQsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpblRleENvb3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBzaXplOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGNvbmZpZy5yZW5kZXJlci5nbC5GTE9BVCxcclxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luVGludEVmZmVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb25maWcucmVuZGVyZXIuZ2wuRkxPQVQsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiA0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpblRpbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDQsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY29uZmlnLnJlbmRlcmVyLmdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGbG9hdDMyIHZpZXcgb2YgdGhlIGFycmF5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaXBlbGluZSdzIHZlcnRpY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI3ZlcnRleFZpZXdGMzJcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4Vmlld0YzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy52ZXJ0ZXhEYXRhKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVWludDMyIHZpZXcgb2YgdGhlIGFycmF5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaXBlbGluZSdzIHZlcnRpY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI3ZlcnRleFZpZXdVMzJcclxuICAgICAgICAgKiBAdHlwZSB7VWludDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhWaWV3VTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMudmVydGV4RGF0YSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNpemUgb2YgdGhlIGJhdGNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI21heFF1YWRzXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhRdWFkcyA9IHJlbmRlcmVyQ29uZmlnLmJhdGNoU2l6ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29sbGVjdGlvbiBvZiBiYXRjaCBpbmZvcm1hdGlvblxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2JhdGNoZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYXRjaGVzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjX3RlbXBNYXRyaXgxXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4MSA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCwgcmUtdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBiYXRjaGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNfdGVtcE1hdHJpeDJcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgyID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI190ZW1wTWF0cml4M1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDMgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjX3RlbXBNYXRyaXg0XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4NCA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IHRvIGRyYXcgc3Ryb2tlZCB0cmlhbmdsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjdGVtcFRyaWFuZ2xlXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGVtcFRyaWFuZ2xlID0gW1xyXG4gICAgICAgICAgICB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwIH0sXHJcbiAgICAgICAgICAgIHsgeDogMCwgeTogMCwgd2lkdGg6IDAgfSxcclxuICAgICAgICAgICAgeyB4OiAwLCB5OiAwLCB3aWR0aDogMCB9LFxyXG4gICAgICAgICAgICB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwIH1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGludCBlZmZlY3QgdG8gYmUgYXBwbGllZCBieSB0aGUgc2hhZGVyIGluIHRoZSBuZXh0IGdlb21ldHJ5IGRyYXc6XHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogMCA9IHRleHR1cmUgbXVsdGlwbGllZCBieSBjb2xvclxyXG4gICAgICAgICAqIDEgPSBzb2xpZCBjb2xvciArIHRleHR1cmUgYWxwaGFcclxuICAgICAgICAgKiAyID0gc29saWQgY29sb3IsIG5vIHRleHR1cmVcclxuICAgICAgICAgKiAzID0gc29saWQgdGV4dHVyZSwgbm8gY29sb3JcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSN0aW50RWZmZWN0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbnRFZmZlY3QgPSAyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWNoZWQgc3Ryb2tlIHRpbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjc3Ryb2tlVGludFxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdHJva2VUaW50ID0geyBUTDogMCwgVFI6IDAsIEJMOiAwLCBCUjogMCB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWNoZWQgZmlsbCB0aW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2ZpbGxUaW50XHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpbGxUaW50ID0geyBUTDogMCwgVFI6IDAsIEJMOiAwLCBCUjogMCB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCB0ZXh0dXJlIGZyYW1lIHJlZmVyZW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNjdXJyZW50RnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0geyB1MDogMCwgdjA6IDAsIHUxOiAxLCB2MTogMSB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBwYXRoIHF1YWQgY2FjaGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjZmlyc3RRdWFkXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmlyc3RRdWFkID0gWyAwLCAwLCAwLCAwLCAwIF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHBhdGggcXVhZCBjYWNoZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNwcmV2UXVhZFxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByZXZRdWFkID0gWyAwLCAwLCAwLCAwLCAwIF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3IgdHJpYW5ndWxhdGluZyBhIHBvbHlnb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjcG9seWdvbkNhY2hlXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucG9seWdvbkNhY2hlID0gW107XHJcblxyXG4gICAgICAgIHRoaXMubXZwSW5pdCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSBwaXBlbGluZSBuZWVkcyB0byBiZSB1c2VkLlxyXG4gICAgICogSXQgYmluZHMgYWxsIG5lY2Vzc2FyeSByZXNvdXJjZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjb25CaW5kXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uQmluZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBXZWJHTFBpcGVsaW5lLnByb3RvdHlwZS5vbkJpbmQuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tdnBVcGRhdGUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzaXplcyB0aGlzIHBpcGVsaW5lIGFuZCB1cGRhdGVzIHRoZSBwcm9qZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI3Jlc2l6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG5ldyB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIC0gVGhlIHJlc29sdXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCByZXNvbHV0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIFdlYkdMUGlwZWxpbmUucHJvdG90eXBlLnJlc2l6ZS5jYWxsKHRoaXMsIHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLnByb2pPcnRobygwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgLTEwMDAuMCwgMTAwMC4wKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzaWducyBhIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYmF0Y2guIElmIGEgZGlmZmVyZW50IHRleHR1cmUgaXMgYWxyZWFkeSBzZXQgaXQgY3JlYXRlcyBhIG5ldyBiYXRjaCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjc2V0VGV4dHVyZTJEXHJcbiAgICAgKiBAc2luY2UgMy4xLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gW3RleHR1cmVdIC0gV2ViR0xUZXh0dXJlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBiYXRjaC4gSWYgbm90IGdpdmVuIHVzZXMgYmxhbmtUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdW5pdD0wXSAtIFRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmV9IFRoaXMgcGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFRleHR1cmUyRDogZnVuY3Rpb24gKHRleHR1cmUsIHVuaXQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRleHR1cmUgPT09IHVuZGVmaW5lZCkgeyB0ZXh0dXJlID0gdGhpcy5yZW5kZXJlci5ibGFua1RleHR1cmUuZ2xUZXh0dXJlOyB9XHJcbiAgICAgICAgaWYgKHVuaXQgPT09IHVuZGVmaW5lZCkgeyB1bml0ID0gMDsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlVGV4dHVyZUJhdGNoKHRleHR1cmUsIHVuaXQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoQmF0Y2godGV4dHVyZSwgdW5pdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgYmF0Y2ggaGFzIHRoZSBzYW1lIHRleHR1cmUgYW5kIHRleHR1cmUgdW5pdCwgb3IgaWYgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgYmF0Y2guXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjcmVxdWlyZVRleHR1cmVCYXRjaFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB0ZXh0dXJlIC0gV2ViR0xUZXh0dXJlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBiYXRjaC4gSWYgbm90IGdpdmVuIHVzZXMgYmxhbmtUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB1bml0IC0gVGV4dHVyZSB1bml0IHRvIHdoaWNoIHRoZSB0ZXh0dXJlIG5lZWRzIHRvIGJlIGJvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGlwZWxpbmUgbmVlZHMgdG8gY3JlYXRlIGEgbmV3IGJhdGNoLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgcmVxdWlyZVRleHR1cmVCYXRjaDogZnVuY3Rpb24gKHRleHR1cmUsIHVuaXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJhdGNoZXMgPSB0aGlzLmJhdGNoZXM7XHJcbiAgICAgICAgdmFyIGJhdGNoTGVuZ3RoID0gYmF0Y2hlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChiYXRjaExlbmd0aCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgVGV4dHVyZSBVbml0IHNwZWNpZmllZCwgd2UgZ2V0IHRoZSB0ZXh0dXJlIGZyb20gdGhlIHRleHR1cmVzIGFycmF5LCBvdGhlcndpc2Ugd2UgdXNlIHRoZSB0ZXh0dXJlIHByb3BlcnR5XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50VGV4dHVyZSA9ICh1bml0ID4gMCkgPyBiYXRjaGVzW2JhdGNoTGVuZ3RoIC0gMV0udGV4dHVyZXNbdW5pdCAtIDFdIDogYmF0Y2hlc1tiYXRjaExlbmd0aCAtIDFdLnRleHR1cmU7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gIShjdXJyZW50VGV4dHVyZSA9PT0gdGV4dHVyZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGJhdGNoIG9iamVjdCBhbmQgcHVzaGVzIGl0IHRvIGEgYmF0Y2ggYXJyYXkuXHJcbiAgICAgKiBUaGUgYmF0Y2ggb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IFxyXG4gICAgICogdmVydGV4IGJhdGNoIGxpa2UgdGhlIG9mZnNldCBpbiB0aGUgdmVydGV4IGJ1ZmZlciwgdmVydGV4IGNvdW50IGFuZCBcclxuICAgICAqIHRoZSB0ZXh0dXJlcyB1c2VkIGJ5IHRoYXQgYmF0Y2guXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjcHVzaEJhdGNoXHJcbiAgICAgKiBAc2luY2UgMy4xLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IHRleHR1cmUgLSBPcHRpb25hbCBXZWJHTFRleHR1cmUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIGJhdGNoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB1bml0IC0gVGV4dHVyZSB1bml0IHRvIHdoaWNoIHRoZSB0ZXh0dXJlIG5lZWRzIHRvIGJlIGJvdW5kLlxyXG4gICAgICovXHJcbiAgICBwdXNoQmF0Y2g6IGZ1bmN0aW9uICh0ZXh0dXJlLCB1bml0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh1bml0ID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5iYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZmlyc3Q6IHRoaXMudmVydGV4Q291bnQsXHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiB0ZXh0dXJlLFxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZXM6IFtdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGV4dHVyZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRleHR1cmVzW3VuaXQgLSAxXSA9IHRleHR1cmU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBmaXJzdDogdGhpcy52ZXJ0ZXhDb3VudCxcclxuICAgICAgICAgICAgICAgIHRleHR1cmU6IG51bGwsXHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlczogdGV4dHVyZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwbG9hZHMgdGhlIHZlcnRleCBkYXRhIGFuZCBlbWl0cyBhIGRyYXcgY2FsbCBmb3IgdGhlIGN1cnJlbnQgYmF0Y2ggb2YgdmVydGljZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjZmx1c2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgV2ViR0xQaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZmx1c2g6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hMb2NrZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmx1c2hMb2NrZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xyXG4gICAgICAgIHZhciB2ZXJ0ZXhDb3VudCA9IHRoaXMudmVydGV4Q291bnQ7XHJcbiAgICAgICAgdmFyIHRvcG9sb2d5ID0gdGhpcy50b3BvbG9neTtcclxuICAgICAgICB2YXIgdmVydGV4U2l6ZSA9IHRoaXMudmVydGV4U2l6ZTtcclxuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICB2YXIgYmF0Y2hlcyA9IHRoaXMuYmF0Y2hlcztcclxuICAgICAgICB2YXIgYmF0Y2hDb3VudCA9IGJhdGNoZXMubGVuZ3RoO1xyXG4gICAgICAgIHZhciBiYXRjaFZlcnRleENvdW50ID0gMDtcclxuICAgICAgICB2YXIgYmF0Y2ggPSBudWxsO1xyXG4gICAgICAgIHZhciBiYXRjaE5leHQ7XHJcbiAgICAgICAgdmFyIHRleHR1cmVJbmRleDtcclxuICAgICAgICB2YXIgblRleHR1cmU7XHJcblxyXG4gICAgICAgIGlmIChiYXRjaENvdW50ID09PSAwIHx8IHZlcnRleENvdW50ID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5mbHVzaExvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgdGhpcy5ieXRlcy5zdWJhcnJheSgwLCB2ZXJ0ZXhDb3VudCAqIHZlcnRleFNpemUpKTtcclxuXHJcbiAgICAgICAgLy8gIFByb2Nlc3MgdGhlIFRFWFRVUkUgQkFUQ0hFU1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYmF0Y2hDb3VudCAtIDE7IGluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBiYXRjaCA9IGJhdGNoZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBiYXRjaE5leHQgPSBiYXRjaGVzW2luZGV4ICsgMV07XHJcblxyXG4gICAgICAgICAgICAvLyAgTXVsdGktdGV4dHVyZSBjaGVjayAoZm9yIG5vbi16ZXJvIHRleHR1cmUgdW5pdHMpXHJcbiAgICAgICAgICAgIGlmIChiYXRjaC50ZXh0dXJlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHRleHR1cmVJbmRleCA9IDA7IHRleHR1cmVJbmRleCA8IGJhdGNoLnRleHR1cmVzLmxlbmd0aDsgKyt0ZXh0dXJlSW5kZXgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgblRleHR1cmUgPSBiYXRjaC50ZXh0dXJlc1t0ZXh0dXJlSW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoblRleHR1cmUpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoblRleHR1cmUsIDEgKyB0ZXh0dXJlSW5kZXgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJhdGNoVmVydGV4Q291bnQgPSBiYXRjaE5leHQuZmlyc3QgLSBiYXRjaC5maXJzdDtcclxuXHJcbiAgICAgICAgICAgIC8vICBCYWlsIG91dCBpZiB0ZXh0dXJlIHByb3BlcnR5IGlzIG51bGwgKGkuZS4gaWYgYSB0ZXh0dXJlIHVuaXQgPiAwKVxyXG4gICAgICAgICAgICBpZiAoYmF0Y2gudGV4dHVyZSA9PT0gbnVsbCB8fCBiYXRjaFZlcnRleENvdW50IDw9IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoYmF0Y2gudGV4dHVyZSwgMCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyh0b3BvbG9neSwgYmF0Y2guZmlyc3QsIGJhdGNoVmVydGV4Q291bnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTGVmdCBvdmVyIGRhdGFcclxuICAgICAgICBiYXRjaCA9IGJhdGNoZXNbYmF0Y2hDb3VudCAtIDFdO1xyXG5cclxuICAgICAgICAvLyAgTXVsdGktdGV4dHVyZSBjaGVjayAoZm9yIG5vbi16ZXJvIHRleHR1cmUgdW5pdHMpXHJcblxyXG4gICAgICAgIGlmIChiYXRjaC50ZXh0dXJlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh0ZXh0dXJlSW5kZXggPSAwOyB0ZXh0dXJlSW5kZXggPCBiYXRjaC50ZXh0dXJlcy5sZW5ndGg7ICsrdGV4dHVyZUluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuVGV4dHVyZSA9IGJhdGNoLnRleHR1cmVzW3RleHR1cmVJbmRleF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5UZXh0dXJlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFRleHR1cmUyRChuVGV4dHVyZSwgMSArIHRleHR1cmVJbmRleCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJhdGNoVmVydGV4Q291bnQgPSB2ZXJ0ZXhDb3VudCAtIGJhdGNoLmZpcnN0O1xyXG5cclxuICAgICAgICBpZiAoYmF0Y2gudGV4dHVyZSAmJiBiYXRjaFZlcnRleENvdW50ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFRleHR1cmUyRChiYXRjaC50ZXh0dXJlLCAwLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKHRvcG9sb2d5LCBiYXRjaC5maXJzdCwgYmF0Y2hWZXJ0ZXhDb3VudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZlcnRleENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgYmF0Y2hlcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmZsdXNoTG9ja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgU3ByaXRlIEdhbWUgT2JqZWN0LCBvciBhbnkgb2JqZWN0IHRoYXQgZXh0ZW5kcyBpdCwgYW5kIGFkZHMgaXQgdG8gdGhlIGJhdGNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2JhdGNoU3ByaXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2FtZU9iamVjdHMuSW1hZ2V8UGhhc2VyLkdhbWVPYmplY3RzLlNwcml0ZSl9IHNwcml0ZSAtIFRoZSB0ZXh0dXJlIGJhc2VkIEdhbWUgT2JqZWN0IHRvIGFkZCB0byB0aGUgYmF0Y2guXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRvIHVzZSBmb3IgdGhlIHJlbmRlcmluZyB0cmFuc2Zvcm0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gW3BhcmVudFRyYW5zZm9ybU1hdHJpeF0gLSBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciwgaWYgc2V0LlxyXG4gICAgICovXHJcbiAgICBiYXRjaFNwcml0ZTogZnVuY3Rpb24gKHNwcml0ZSwgY2FtZXJhLCBwYXJlbnRUcmFuc2Zvcm1NYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFdpbGwgY2F1c2UgYSBmbHVzaCBpZiB0aGVyZSBhcmUgYmF0Y2hTaXplIGVudHJpZXMgYWxyZWFkeVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBjYW1NYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MTtcclxuICAgICAgICB2YXIgc3ByaXRlTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDI7XHJcbiAgICAgICAgdmFyIGNhbGNNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lID0gc3ByaXRlLmZyYW1lO1xyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gZnJhbWUuZ2xUZXh0dXJlO1xyXG5cclxuICAgICAgICB2YXIgdTAgPSBmcmFtZS51MDtcclxuICAgICAgICB2YXIgdjAgPSBmcmFtZS52MDtcclxuICAgICAgICB2YXIgdTEgPSBmcmFtZS51MTtcclxuICAgICAgICB2YXIgdjEgPSBmcmFtZS52MTtcclxuICAgICAgICB2YXIgZnJhbWVYID0gZnJhbWUueDtcclxuICAgICAgICB2YXIgZnJhbWVZID0gZnJhbWUueTtcclxuICAgICAgICB2YXIgZnJhbWVXaWR0aCA9IGZyYW1lLmN1dFdpZHRoO1xyXG4gICAgICAgIHZhciBmcmFtZUhlaWdodCA9IGZyYW1lLmN1dEhlaWdodDtcclxuICAgICAgICB2YXIgY3VzdG9tUGl2b3QgPSBmcmFtZS5jdXN0b21QaXZvdDtcclxuXHJcbiAgICAgICAgdmFyIGRpc3BsYXlPcmlnaW5YID0gc3ByaXRlLmRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciBkaXNwbGF5T3JpZ2luWSA9IHNwcml0ZS5kaXNwbGF5T3JpZ2luWTtcclxuXHJcbiAgICAgICAgdmFyIHggPSAtZGlzcGxheU9yaWdpblggKyBmcmFtZVg7XHJcbiAgICAgICAgdmFyIHkgPSAtZGlzcGxheU9yaWdpblkgKyBmcmFtZVk7XHJcblxyXG4gICAgICAgIGlmIChzcHJpdGUuaXNDcm9wcGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNyb3AgPSBzcHJpdGUuX2Nyb3A7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3JvcC5mbGlwWCAhPT0gc3ByaXRlLmZsaXBYIHx8IGNyb3AuZmxpcFkgIT09IHNwcml0ZS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnJhbWUudXBkYXRlQ3JvcFVWcyhjcm9wLCBzcHJpdGUuZmxpcFgsIHNwcml0ZS5mbGlwWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHUwID0gY3JvcC51MDtcclxuICAgICAgICAgICAgdjAgPSBjcm9wLnYwO1xyXG4gICAgICAgICAgICB1MSA9IGNyb3AudTE7XHJcbiAgICAgICAgICAgIHYxID0gY3JvcC52MTtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lV2lkdGggPSBjcm9wLndpZHRoO1xyXG4gICAgICAgICAgICBmcmFtZUhlaWdodCA9IGNyb3AuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgZnJhbWVYID0gY3JvcC54O1xyXG4gICAgICAgICAgICBmcmFtZVkgPSBjcm9wLnk7XHJcblxyXG4gICAgICAgICAgICB4ID0gLWRpc3BsYXlPcmlnaW5YICsgZnJhbWVYO1xyXG4gICAgICAgICAgICB5ID0gLWRpc3BsYXlPcmlnaW5ZICsgZnJhbWVZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZsaXBYID0gMTtcclxuICAgICAgICB2YXIgZmxpcFkgPSAxO1xyXG5cclxuICAgICAgICBpZiAoc3ByaXRlLmZsaXBYKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFjdXN0b21QaXZvdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeCArPSAoLWZyYW1lLnJlYWxXaWR0aCArIChkaXNwbGF5T3JpZ2luWCAqIDIpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZmxpcFggPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBBdXRvLWludmVydCB0aGUgZmxpcFkgaWYgdGhpcyBpcyBjb21pbmcgZnJvbSBhIEdMVGV4dHVyZVxyXG4gICAgICAgIGlmIChzcHJpdGUuZmxpcFkgfHwgKGZyYW1lLnNvdXJjZS5pc0dMVGV4dHVyZSAmJiAhdGV4dHVyZS5mbGlwWSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoIWN1c3RvbVBpdm90KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB5ICs9ICgtZnJhbWUucmVhbEhlaWdodCArIChkaXNwbGF5T3JpZ2luWSAqIDIpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZmxpcFkgPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3ByaXRlLngsIHNwcml0ZS55LCBzcHJpdGUucm90YXRpb24sIHNwcml0ZS5zY2FsZVggKiBmbGlwWCwgc3ByaXRlLnNjYWxlWSAqIGZsaXBZKTtcclxuXHJcbiAgICAgICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50VHJhbnNmb3JtTWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRUcmFuc2Zvcm1NYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNwcml0ZS5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcHJpdGUuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZSA9IHNwcml0ZS54O1xyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNwcml0ZS55O1xyXG5cclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IGJ5IHRoZSBTcHJpdGUgbWF0cml4LCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeFxyXG4gICAgICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkoc3ByaXRlTWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmUgLT0gY2FtZXJhLnNjcm9sbFggKiBzcHJpdGUuc2Nyb2xsRmFjdG9yWDtcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmYgLT0gY2FtZXJhLnNjcm9sbFkgKiBzcHJpdGUuc2Nyb2xsRmFjdG9yWTtcclxuICAgIFxyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHh3ID0geCArIGZyYW1lV2lkdGg7XHJcbiAgICAgICAgdmFyIHloID0geSArIGZyYW1lSGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgdHgwID0gY2FsY01hdHJpeC5nZXRYKHgsIHkpO1xyXG4gICAgICAgIHZhciB0eTAgPSBjYWxjTWF0cml4LmdldFkoeCwgeSk7XHJcblxyXG4gICAgICAgIHZhciB0eDEgPSBjYWxjTWF0cml4LmdldFgoeCwgeWgpO1xyXG4gICAgICAgIHZhciB0eTEgPSBjYWxjTWF0cml4LmdldFkoeCwgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgyID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5aCk7XHJcbiAgICAgICAgdmFyIHR5MiA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgzID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5KTtcclxuICAgICAgICB2YXIgdHkzID0gY2FsY01hdHJpeC5nZXRZKHh3LCB5KTtcclxuXHJcbiAgICAgICAgdmFyIHRpbnRUTCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhKHNwcml0ZS5fdGludFRMLCBjYW1lcmEuYWxwaGEgKiBzcHJpdGUuX2FscGhhVEwpO1xyXG4gICAgICAgIHZhciB0aW50VFIgPSBVdGlscy5nZXRUaW50QXBwZW5kRmxvYXRBbHBoYShzcHJpdGUuX3RpbnRUUiwgY2FtZXJhLmFscGhhICogc3ByaXRlLl9hbHBoYVRSKTtcclxuICAgICAgICB2YXIgdGludEJMID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoc3ByaXRlLl90aW50QkwsIGNhbWVyYS5hbHBoYSAqIHNwcml0ZS5fYWxwaGFCTCk7XHJcbiAgICAgICAgdmFyIHRpbnRCUiA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhKHNwcml0ZS5fdGludEJSLCBjYW1lcmEuYWxwaGEgKiBzcHJpdGUuX2FscGhhQlIpO1xyXG5cclxuICAgICAgICBpZiAoY2FtZXJhLnJvdW5kUGl4ZWxzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHgwID0gTWF0aC5yb3VuZCh0eDApO1xyXG4gICAgICAgICAgICB0eTAgPSBNYXRoLnJvdW5kKHR5MCk7XHJcblxyXG4gICAgICAgICAgICB0eDEgPSBNYXRoLnJvdW5kKHR4MSk7XHJcbiAgICAgICAgICAgIHR5MSA9IE1hdGgucm91bmQodHkxKTtcclxuXHJcbiAgICAgICAgICAgIHR4MiA9IE1hdGgucm91bmQodHgyKTtcclxuICAgICAgICAgICAgdHkyID0gTWF0aC5yb3VuZCh0eTIpO1xyXG5cclxuICAgICAgICAgICAgdHgzID0gTWF0aC5yb3VuZCh0eDMpO1xyXG4gICAgICAgICAgICB0eTMgPSBNYXRoLnJvdW5kKHR5Myk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFRleHR1cmUyRCh0ZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgICAgdmFyIHRpbnRFZmZlY3QgPSAoc3ByaXRlLl9pc1RpbnRlZCAmJiBzcHJpdGUudGludEZpbGwpO1xyXG5cclxuICAgICAgICB0aGlzLmJhdGNoUXVhZCh0eDAsIHR5MCwgdHgxLCB0eTEsIHR4MiwgdHkyLCB0eDMsIHR5MywgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCwgdGV4dHVyZSwgMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgdmVydGljZXMgZGF0YSBpbnRvIHRoZSBiYXRjaCBhbmQgZmx1c2hlcyBpZiBmdWxsLlxyXG4gICAgICogXHJcbiAgICAgKiBBc3N1bWVzIDYgdmVydGljZXMgaW4gdGhlIGZvbGxvd2luZyBhcnJhbmdlbWVudDpcclxuICAgICAqIFxyXG4gICAgICogYGBgXHJcbiAgICAgKiAwLS0tLTNcclxuICAgICAqIHxcXCAgQnxcclxuICAgICAqIHwgXFwgIHxcclxuICAgICAqIHwgIFxcIHxcclxuICAgICAqIHwgQSBcXHxcclxuICAgICAqIHwgICAgXFxcclxuICAgICAqIDEtLS0tMlxyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFdoZXJlIHR4MC90eTAgPSAwLCB0eDEvdHkxID0gMSwgdHgyL3R5MiA9IDIgYW5kIHR4My90eTMgPSAzXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjYmF0Y2hRdWFkXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gVGhlIHRvcC1sZWZ0IHggcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTAgLSBUaGUgdG9wLWxlZnQgeSBwb3NpdGlvbi5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSBib3R0b20tbGVmdCB4IHBvc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIGJvdHRvbS1sZWZ0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgYm90dG9tLXJpZ2h0IHggcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIgLSBUaGUgYm90dG9tLXJpZ2h0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDMgLSBUaGUgdG9wLXJpZ2h0IHggcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTMgLSBUaGUgdG9wLXJpZ2h0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdTAgLSBVViB1MCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2MCAtIFVWIHYwIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHUxIC0gVVYgdTEgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdjEgLSBVViB2MSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW50VEwgLSBUaGUgdG9wLWxlZnQgdGludCBjb2xvciB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW50VFIgLSBUaGUgdG9wLXJpZ2h0IHRpbnQgY29sb3IgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGludEJMIC0gVGhlIGJvdHRvbS1sZWZ0IHRpbnQgY29sb3IgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGludEJSIC0gVGhlIGJvdHRvbS1yaWdodCB0aW50IGNvbG9yIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfGJvb2xlYW4pfSB0aW50RWZmZWN0IC0gVGhlIHRpbnQgZWZmZWN0IGZvciB0aGUgc2hhZGVyIHRvIHVzZS5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSBbdGV4dHVyZV0gLSBXZWJHTFRleHR1cmUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBjdXJyZW50IGJhdGNoIGlmIGEgZmx1c2ggb2NjdXJzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdW5pdD0wXSAtIFRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoaXMgbWV0aG9kIGNhdXNlZCB0aGUgYmF0Y2ggdG8gZmx1c2gsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBiYXRjaFF1YWQ6IGZ1bmN0aW9uICh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHUwLCB2MCwgdTEsIHYxLCB0aW50VEwsIHRpbnRUUiwgdGludEJMLCB0aW50QlIsIHRpbnRFZmZlY3QsIHRleHR1cmUsIHVuaXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGhhc0ZsdXNoZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmVydGV4Q291bnQgKyA2ID4gdGhpcy52ZXJ0ZXhDYXBhY2l0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIGhhc0ZsdXNoZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRUZXh0dXJlMkQodGV4dHVyZSwgdW5pdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmVydGV4Vmlld0YzMiA9IHRoaXMudmVydGV4Vmlld0YzMjtcclxuICAgICAgICB2YXIgdmVydGV4Vmlld1UzMiA9IHRoaXMudmVydGV4Vmlld1UzMjtcclxuXHJcbiAgICAgICAgdmFyIHZlcnRleE9mZnNldCA9ICh0aGlzLnZlcnRleENvdW50ICogdGhpcy52ZXJ0ZXhDb21wb25lbnRDb3VudCkgLSAxO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHgwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB1MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHYwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludEVmZmVjdDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3VTMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRUTDtcclxuXHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB4MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHkxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB2MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRFZmZlY3Q7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50Qkw7XHJcblxyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geDI7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB5MjtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHUxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdjE7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50RWZmZWN0O1xyXG4gICAgICAgIHZlcnRleFZpZXdVMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludEJSO1xyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHgwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB1MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHYwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludEVmZmVjdDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3VTMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRUTDtcclxuXHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB4MjtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHkyO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdTE7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB2MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRFZmZlY3Q7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50QlI7XHJcblxyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geDM7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB5MztcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHUxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdjA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50RWZmZWN0O1xyXG4gICAgICAgIHZlcnRleFZpZXdVMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludFRSO1xyXG5cclxuICAgICAgICB0aGlzLnZlcnRleENvdW50ICs9IDY7XHJcblxyXG4gICAgICAgIHJldHVybiBoYXNGbHVzaGVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIHZlcnRpY2VzIGRhdGEgaW50byB0aGUgYmF0Y2ggYW5kIGZsdXNoZXMgaWYgZnVsbC5cclxuICAgICAqIFxyXG4gICAgICogQXNzdW1lcyAzIHZlcnRpY2VzIGluIHRoZSBmb2xsb3dpbmcgYXJyYW5nZW1lbnQ6XHJcbiAgICAgKiBcclxuICAgICAqIGBgYFxyXG4gICAgICogMFxyXG4gICAgICogfFxcXHJcbiAgICAgKiB8IFxcXHJcbiAgICAgKiB8ICBcXFxyXG4gICAgICogfCAgIFxcXHJcbiAgICAgKiB8ICAgIFxcXHJcbiAgICAgKiAxLS0tLS0yXHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNiYXRjaFRyaVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFRoZSBib3R0b20tbGVmdCB4IHBvc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gVGhlIGJvdHRvbS1sZWZ0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgYm90dG9tLXJpZ2h0IHggcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIgLSBUaGUgYm90dG9tLXJpZ2h0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDMgLSBUaGUgdG9wLXJpZ2h0IHggcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTMgLSBUaGUgdG9wLXJpZ2h0IHkgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdTAgLSBVViB1MCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2MCAtIFVWIHYwIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHUxIC0gVVYgdTEgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdjEgLSBVViB2MSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW50VEwgLSBUaGUgdG9wLWxlZnQgdGludCBjb2xvciB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW50VFIgLSBUaGUgdG9wLXJpZ2h0IHRpbnQgY29sb3IgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGludEJMIC0gVGhlIGJvdHRvbS1sZWZ0IHRpbnQgY29sb3IgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8Ym9vbGVhbil9IHRpbnRFZmZlY3QgLSBUaGUgdGludCBlZmZlY3QgZm9yIHRoZSBzaGFkZXIgdG8gdXNlLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IFt0ZXh0dXJlXSAtIFdlYkdMVGV4dHVyZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgYmF0Y2ggaWYgYSBmbHVzaCBvY2N1cnMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt1bml0PTBdIC0gVGV4dHVyZSB1bml0IHRvIHdoaWNoIHRoZSB0ZXh0dXJlIG5lZWRzIHRvIGJlIGJvdW5kLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBtZXRob2QgY2F1c2VkIHRoZSBiYXRjaCB0byBmbHVzaCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGJhdGNoVHJpOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRFZmZlY3QsIHRleHR1cmUsIHVuaXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGhhc0ZsdXNoZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmVydGV4Q291bnQgKyAzID4gdGhpcy52ZXJ0ZXhDYXBhY2l0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIHVuaXQpO1xyXG5cclxuICAgICAgICAgICAgaGFzRmx1c2hlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmVydGV4Vmlld0YzMiA9IHRoaXMudmVydGV4Vmlld0YzMjtcclxuICAgICAgICB2YXIgdmVydGV4Vmlld1UzMiA9IHRoaXMudmVydGV4Vmlld1UzMjtcclxuXHJcbiAgICAgICAgdmFyIHZlcnRleE9mZnNldCA9ICh0aGlzLnZlcnRleENvdW50ICogdGhpcy52ZXJ0ZXhDb21wb25lbnRDb3VudCkgLSAxO1xyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHgxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geTE7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB1MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHYwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludEVmZmVjdDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3VTMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRUTDtcclxuXHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB4MjtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHkyO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB2MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHRpbnRFZmZlY3Q7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50VFI7XHJcblxyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0geDM7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB5MztcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdmVydGV4T2Zmc2V0XSA9IHUxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdjE7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZlcnRleE9mZnNldF0gPSB0aW50RWZmZWN0O1xyXG4gICAgICAgIHZlcnRleFZpZXdVMzJbKyt2ZXJ0ZXhPZmZzZXRdID0gdGludEJMO1xyXG5cclxuICAgICAgICB0aGlzLnZlcnRleENvdW50ICs9IDM7XHJcblxyXG4gICAgICAgIHJldHVybiBoYXNGbHVzaGVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGJhdGNoaW5nIGEgdGV4dHVyZWQgcXVhZCB1c2luZyBhcmd1bWVudCB2YWx1ZXMgaW5zdGVhZCBvZiBhIEdhbWUgT2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2JhdGNoVGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFNvdXJjZSBHYW1lT2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFRleHR1cmV9IHRleHR1cmUgLSBSYXcgV2ViR0xUZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcXVhZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGV4dHVyZVdpZHRoIC0gUmVhbCB0ZXh0dXJlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0ZXh0dXJlSGVpZ2h0IC0gUmVhbCB0ZXh0dXJlIGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNYIC0gWCBjb29yZGluYXRlIG9mIHRoZSBxdWFkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY1kgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIHF1YWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjV2lkdGggLSBXaWR0aCBvZiB0aGUgcXVhZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHF1YWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVYIC0gWCBjb21wb25lbnQgb2Ygc2NhbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZIC0gWSBjb21wb25lbnQgb2Ygc2NhbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm90YXRpb24gLSBSb3RhdGlvbiBvZiB0aGUgcXVhZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFggLSBJbmRpY2F0ZXMgaWYgdGhlIHF1YWQgaXMgaG9yaXpvbnRhbGx5IGZsaXBwZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZsaXBZIC0gSW5kaWNhdGVzIGlmIHRoZSBxdWFkIGlzIHZlcnRpY2FsbHkgZmxpcHBlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY3JvbGxGYWN0b3JYIC0gQnkgd2hpY2ggZmFjdG9yIGlzIHRoZSBxdWFkIGFmZmVjdGVkIGJ5IHRoZSBjYW1lcmEgaG9yaXpvbnRhbCBzY3JvbGwuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsRmFjdG9yWSAtIEJ5IHdoaWNoIGZhY3RvciBpcyB0aGUgcXVhZCBlZmZlY3RlZCBieSB0aGUgY2FtZXJhIHZlcnRpY2FsIHNjcm9sbC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXNwbGF5T3JpZ2luWCAtIEhvcml6b250YWwgb3JpZ2luIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXNwbGF5T3JpZ2luWSAtIFZlcnRpY2FsIG9yaWdpbiBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVYIC0gWCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlIGZyYW1lLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyYW1lWSAtIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZSBmcmFtZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcmFtZVdpZHRoIC0gV2lkdGggb2YgdGhlIHRleHR1cmUgZnJhbWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJhbWVIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHRleHR1cmUgZnJhbWUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbnRUTCAtIFRpbnQgZm9yIHRvcCBsZWZ0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW50VFIgLSBUaW50IGZvciB0b3AgcmlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbnRCTCAtIFRpbnQgZm9yIGJvdHRvbSBsZWZ0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW50QlIgLSBUaW50IGZvciBib3R0b20gcmlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGludEVmZmVjdCAtIFRoZSB0aW50IGVmZmVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1T2Zmc2V0IC0gSG9yaXpvbnRhbCBvZmZzZXQgb24gdGV4dHVyZSBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZPZmZzZXQgLSBWZXJ0aWNhbCBvZmZzZXQgb24gdGV4dHVyZSBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gQ3VycmVudCB1c2VkIGNhbWVyYS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRUcmFuc2Zvcm1NYXRyaXggLSBQYXJlbnQgY29udGFpbmVyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcEZsaXA9ZmFsc2VdIC0gU2tpcCB0aGUgcmVuZGVyVGV4dHVyZSBjaGVjay5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hUZXh0dXJlOiBmdW5jdGlvbiAoXHJcbiAgICAgICAgZ2FtZU9iamVjdCxcclxuICAgICAgICB0ZXh0dXJlLFxyXG4gICAgICAgIHRleHR1cmVXaWR0aCwgdGV4dHVyZUhlaWdodCxcclxuICAgICAgICBzcmNYLCBzcmNZLFxyXG4gICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsXHJcbiAgICAgICAgc2NhbGVYLCBzY2FsZVksXHJcbiAgICAgICAgcm90YXRpb24sXHJcbiAgICAgICAgZmxpcFgsIGZsaXBZLFxyXG4gICAgICAgIHNjcm9sbEZhY3RvclgsIHNjcm9sbEZhY3RvclksXHJcbiAgICAgICAgZGlzcGxheU9yaWdpblgsIGRpc3BsYXlPcmlnaW5ZLFxyXG4gICAgICAgIGZyYW1lWCwgZnJhbWVZLCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodCxcclxuICAgICAgICB0aW50VEwsIHRpbnRUUiwgdGludEJMLCB0aW50QlIsIHRpbnRFZmZlY3QsXHJcbiAgICAgICAgdU9mZnNldCwgdk9mZnNldCxcclxuICAgICAgICBjYW1lcmEsXHJcbiAgICAgICAgcGFyZW50VHJhbnNmb3JtTWF0cml4LFxyXG4gICAgICAgIHNraXBGbGlwKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcywgZ2FtZU9iamVjdCk7XHJcblxyXG4gICAgICAgIHZhciBjYW1NYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MTtcclxuICAgICAgICB2YXIgc3ByaXRlTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDI7XHJcbiAgICAgICAgdmFyIGNhbGNNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICAgICAgdmFyIHUwID0gKGZyYW1lWCAvIHRleHR1cmVXaWR0aCkgKyB1T2Zmc2V0O1xyXG4gICAgICAgIHZhciB2MCA9IChmcmFtZVkgLyB0ZXh0dXJlSGVpZ2h0KSArIHZPZmZzZXQ7XHJcbiAgICAgICAgdmFyIHUxID0gKGZyYW1lWCArIGZyYW1lV2lkdGgpIC8gdGV4dHVyZVdpZHRoICsgdU9mZnNldDtcclxuICAgICAgICB2YXIgdjEgPSAoZnJhbWVZICsgZnJhbWVIZWlnaHQpIC8gdGV4dHVyZUhlaWdodCArIHZPZmZzZXQ7XHJcblxyXG4gICAgICAgIHZhciB3aWR0aCA9IHNyY1dpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBzcmNIZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciB4ID0gLWRpc3BsYXlPcmlnaW5YO1xyXG4gICAgICAgIHZhciB5ID0gLWRpc3BsYXlPcmlnaW5ZO1xyXG5cclxuICAgICAgICBpZiAoZ2FtZU9iamVjdC5pc0Nyb3BwZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY3JvcCA9IGdhbWVPYmplY3QuX2Nyb3A7XHJcblxyXG4gICAgICAgICAgICB3aWR0aCA9IGNyb3Aud2lkdGg7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3AuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgc3JjV2lkdGggPSBjcm9wLndpZHRoO1xyXG4gICAgICAgICAgICBzcmNIZWlnaHQgPSBjcm9wLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lWCA9IGNyb3AueDtcclxuICAgICAgICAgICAgZnJhbWVZID0gY3JvcC55O1xyXG5cclxuICAgICAgICAgICAgdmFyIG94ID0gZnJhbWVYO1xyXG4gICAgICAgICAgICB2YXIgb3kgPSBmcmFtZVk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG94ID0gKGZyYW1lV2lkdGggLSBjcm9wLnggLSBjcm9wLndpZHRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGlmIChmbGlwWSAmJiAhdGV4dHVyZS5pc1JlbmRlclRleHR1cmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG95ID0gKGZyYW1lSGVpZ2h0IC0gY3JvcC55IC0gY3JvcC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1MCA9IChveCAvIHRleHR1cmVXaWR0aCkgKyB1T2Zmc2V0O1xyXG4gICAgICAgICAgICB2MCA9IChveSAvIHRleHR1cmVIZWlnaHQpICsgdk9mZnNldDtcclxuICAgICAgICAgICAgdTEgPSAob3ggKyBjcm9wLndpZHRoKSAvIHRleHR1cmVXaWR0aCArIHVPZmZzZXQ7XHJcbiAgICAgICAgICAgIHYxID0gKG95ICsgY3JvcC5oZWlnaHQpIC8gdGV4dHVyZUhlaWdodCArIHZPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICB4ID0gLWRpc3BsYXlPcmlnaW5YICsgZnJhbWVYO1xyXG4gICAgICAgICAgICB5ID0gLWRpc3BsYXlPcmlnaW5ZICsgZnJhbWVZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEludmVydCB0aGUgZmxpcFkgaWYgdGhpcyBpcyBhIFJlbmRlclRleHR1cmVcclxuICAgICAgICBmbGlwWSA9IGZsaXBZIF4gKCFza2lwRmxpcCAmJiB0ZXh0dXJlLmlzUmVuZGVyVGV4dHVyZSA/IDEgOiAwKTtcclxuXHJcbiAgICAgICAgaWYgKGZsaXBYKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggKj0gLTE7XHJcbiAgICAgICAgICAgIHggKz0gc3JjV2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxpcFkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBoZWlnaHQgKj0gLTE7XHJcbiAgICAgICAgICAgIHkgKz0gc3JjSGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHh3ID0geCArIHdpZHRoO1xyXG4gICAgICAgIHZhciB5aCA9IHkgKyBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHNwcml0ZU1hdHJpeC5hcHBseUlUUlMoc3JjWCwgc3JjWSwgcm90YXRpb24sIHNjYWxlWCwgc2NhbGVZKTtcclxuXHJcbiAgICAgICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgICAgICBpZiAocGFyZW50VHJhbnNmb3JtTWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIE11bHRpcGx5IHRoZSBjYW1lcmEgYnkgdGhlIHBhcmVudCBtYXRyaXhcclxuICAgICAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRUcmFuc2Zvcm1NYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNjcm9sbEZhY3RvclgsIC1jYW1lcmEuc2Nyb2xsWSAqIHNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4LmUgPSBzcmNYO1xyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZiA9IHNyY1k7XHJcblxyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzcHJpdGVNYXRyaXguZSAtPSBjYW1lcmEuc2Nyb2xsWCAqIHNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgICAgIHNwcml0ZU1hdHJpeC5mIC09IGNhbWVyYS5zY3JvbGxZICogc2Nyb2xsRmFjdG9yWTtcclxuICAgIFxyXG4gICAgICAgICAgICAvLyAgTXVsdGlwbHkgYnkgdGhlIFNwcml0ZSBtYXRyaXgsIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4XHJcbiAgICAgICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseShzcHJpdGVNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHR4MCA9IGNhbGNNYXRyaXguZ2V0WCh4LCB5KTtcclxuICAgICAgICB2YXIgdHkwID0gY2FsY01hdHJpeC5nZXRZKHgsIHkpO1xyXG5cclxuICAgICAgICB2YXIgdHgxID0gY2FsY01hdHJpeC5nZXRYKHgsIHloKTtcclxuICAgICAgICB2YXIgdHkxID0gY2FsY01hdHJpeC5nZXRZKHgsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MiA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeWgpO1xyXG4gICAgICAgIHZhciB0eTIgPSBjYWxjTWF0cml4LmdldFkoeHcsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MyA9IGNhbGNNYXRyaXguZ2V0WCh4dywgeSk7XHJcbiAgICAgICAgdmFyIHR5MyA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeSk7XHJcblxyXG4gICAgICAgIGlmIChjYW1lcmEucm91bmRQaXhlbHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0eDAgPSBNYXRoLnJvdW5kKHR4MCk7XHJcbiAgICAgICAgICAgIHR5MCA9IE1hdGgucm91bmQodHkwKTtcclxuXHJcbiAgICAgICAgICAgIHR4MSA9IE1hdGgucm91bmQodHgxKTtcclxuICAgICAgICAgICAgdHkxID0gTWF0aC5yb3VuZCh0eTEpO1xyXG5cclxuICAgICAgICAgICAgdHgyID0gTWF0aC5yb3VuZCh0eDIpO1xyXG4gICAgICAgICAgICB0eTIgPSBNYXRoLnJvdW5kKHR5Mik7XHJcblxyXG4gICAgICAgICAgICB0eDMgPSBNYXRoLnJvdW5kKHR4Myk7XHJcbiAgICAgICAgICAgIHR5MyA9IE1hdGgucm91bmQodHkzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApO1xyXG5cclxuICAgICAgICB0aGlzLmJhdGNoUXVhZCh0eDAsIHR5MCwgdHgxLCB0eTEsIHR4MiwgdHkyLCB0eDMsIHR5MywgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCwgdGV4dHVyZSwgMCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFRleHR1cmUgRnJhbWUgaW50byB0aGUgYmF0Y2ggZm9yIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNiYXRjaFRleHR1cmVGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBmcmFtZSAtIFRoZSBUZXh0dXJlIEZyYW1lIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiB0byByZW5kZXIgdGhlIHRleHR1cmUgYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB0byByZW5kZXIgdGhlIHRleHR1cmUgYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGludCAtIFRoZSB0aW50IGNvbG9yLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGFscGhhIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHRyYW5zZm9ybU1hdHJpeCAtIFRoZSBUcmFuc2Zvcm0gTWF0cml4IHRvIHVzZSBmb3IgdGhlIHRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gW3BhcmVudFRyYW5zZm9ybU1hdHJpeF0gLSBBIHBhcmVudCBUcmFuc2Zvcm0gTWF0cml4LlxyXG4gICAgICovXHJcbiAgICBiYXRjaFRleHR1cmVGcmFtZTogZnVuY3Rpb24gKFxyXG4gICAgICAgIGZyYW1lLFxyXG4gICAgICAgIHgsIHksXHJcbiAgICAgICAgdGludCwgYWxwaGEsXHJcbiAgICAgICAgdHJhbnNmb3JtTWF0cml4LFxyXG4gICAgICAgIHBhcmVudFRyYW5zZm9ybU1hdHJpeFxyXG4gICAgKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBzcHJpdGVNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MS5jb3B5RnJvbSh0cmFuc2Zvcm1NYXRyaXgpO1xyXG4gICAgICAgIHZhciBjYWxjTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDI7XHJcblxyXG4gICAgICAgIHZhciB4dyA9IHggKyBmcmFtZS53aWR0aDtcclxuICAgICAgICB2YXIgeWggPSB5ICsgZnJhbWUuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAocGFyZW50VHJhbnNmb3JtTWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3ByaXRlTWF0cml4Lm11bHRpcGx5KHBhcmVudFRyYW5zZm9ybU1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGNNYXRyaXggPSBzcHJpdGVNYXRyaXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdHgwID0gY2FsY01hdHJpeC5nZXRYKHgsIHkpO1xyXG4gICAgICAgIHZhciB0eTAgPSBjYWxjTWF0cml4LmdldFkoeCwgeSk7XHJcblxyXG4gICAgICAgIHZhciB0eDEgPSBjYWxjTWF0cml4LmdldFgoeCwgeWgpO1xyXG4gICAgICAgIHZhciB0eTEgPSBjYWxjTWF0cml4LmdldFkoeCwgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgyID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5aCk7XHJcbiAgICAgICAgdmFyIHR5MiA9IGNhbGNNYXRyaXguZ2V0WSh4dywgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgzID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5KTtcclxuICAgICAgICB2YXIgdHkzID0gY2FsY01hdHJpeC5nZXRZKHh3LCB5KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlMkQoZnJhbWUuZ2xUZXh0dXJlLCAwKTtcclxuXHJcbiAgICAgICAgdGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhKHRpbnQsIGFscGhhKTtcclxuXHJcbiAgICAgICAgdGhpcy5iYXRjaFF1YWQodHgwLCB0eTAsIHR4MSwgdHkxLCB0eDIsIHR5MiwgdHgzLCB0eTMsIGZyYW1lLnUwLCBmcmFtZS52MCwgZnJhbWUudTEsIGZyYW1lLnYxLCB0aW50LCB0aW50LCB0aW50LCB0aW50LCAwLCBmcmFtZS5nbFRleHR1cmUsIDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyBhIGZpbGxlZCByZWN0YW5nbGUgaW50byB0aGUgdmVydGV4IGJhdGNoLlxyXG4gICAgICogUmVjdGFuZ2xlIGhhcyBubyB0cmFuc2Zvcm0gdmFsdWVzIGFuZCBpc24ndCB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBsb2NhbCBzcGFjZS5cclxuICAgICAqIFVzZWQgZm9yIGRpcmVjdGx5IGJhdGNoaW5nIHVudHJhbnNmb3JtZWQgcmVjdGFuZ2xlcywgc3VjaCBhcyBDYW1lcmEgYmFja2dyb3VuZCBjb2xvcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjZHJhd0ZpbGxSZWN0XHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBIb3Jpem9udGFsIHRvcCBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVmVydGljYWwgdG9wIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gV2lkdGggb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2xvciAtIENvbG9yIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIEFscGhhIHZhbHVlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdy5cclxuICAgICAqL1xyXG4gICAgZHJhd0ZpbGxSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IsIGFscGhhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB4dyA9IHggKyB3aWR0aDtcclxuICAgICAgICB2YXIgeWggPSB5ICsgaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnNldFRleHR1cmUyRCgpO1xyXG5cclxuICAgICAgICB2YXIgdGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcChjb2xvciwgYWxwaGEpO1xyXG5cclxuICAgICAgICB0aGlzLmJhdGNoUXVhZCh4LCB5LCB4LCB5aCwgeHcsIHloLCB4dywgeSwgMCwgMCwgMSwgMSwgdGludCwgdGludCwgdGludCwgdGludCwgMik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIGEgZmlsbGVkIHJlY3RhbmdsZSBpbnRvIHRoZSB2ZXJ0ZXggYmF0Y2guXHJcbiAgICAgKiBSZWN0YW5nbGUgZmFjdG9ycyBpbiB0aGUgZ2l2ZW4gdHJhbnNmb3JtIG1hdHJpY2VzIGJlZm9yZSBhZGRpbmcgdG8gdGhlIGJhdGNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2JhdGNoRmlsbFJlY3RcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIEhvcml6b250YWwgdG9wIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBWZXJ0aWNhbCB0b3AgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IGN1cnJlbnRNYXRyaXggLSBUaGUgY3VycmVudCB0cmFuc2Zvcm0uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gcGFyZW50TWF0cml4IC0gVGhlIHBhcmVudCB0cmFuc2Zvcm0uXHJcbiAgICAgKi9cclxuICAgIGJhdGNoRmlsbFJlY3Q6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjdXJyZW50TWF0cml4LCBwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXBlbGluZSh0aGlzKTtcclxuXHJcbiAgICAgICAgdmFyIGNhbGNNYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4MztcclxuXHJcbiAgICAgICAgLy8gIE11bHRpcGx5IGFuZCBzdG9yZSByZXN1bHQgaW4gY2FsY01hdHJpeCwgb25seSBpZiB0aGUgcGFyZW50TWF0cml4IGlzIHNldCwgb3RoZXJ3aXNlIHdlJ2xsIHVzZSB3aGF0ZXZlciB2YWx1ZXMgYXJlIGFscmVhZHkgaW4gdGhlIGNhbGNNYXRyaXhcclxuICAgICAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGFyZW50TWF0cml4Lm11bHRpcGx5KGN1cnJlbnRNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB2YXIgeHcgPSB4ICsgd2lkdGg7XHJcbiAgICAgICAgdmFyIHloID0geSArIGhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHgwID0gY2FsY01hdHJpeC5nZXRYKHgsIHkpO1xyXG4gICAgICAgIHZhciB5MCA9IGNhbGNNYXRyaXguZ2V0WSh4LCB5KTtcclxuXHJcbiAgICAgICAgdmFyIHgxID0gY2FsY01hdHJpeC5nZXRYKHgsIHloKTtcclxuICAgICAgICB2YXIgeTEgPSBjYWxjTWF0cml4LmdldFkoeCwgeWgpO1xyXG5cclxuICAgICAgICB2YXIgeDIgPSBjYWxjTWF0cml4LmdldFgoeHcsIHloKTtcclxuICAgICAgICB2YXIgeTIgPSBjYWxjTWF0cml4LmdldFkoeHcsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHgzID0gY2FsY01hdHJpeC5nZXRYKHh3LCB5KTtcclxuICAgICAgICB2YXIgeTMgPSBjYWxjTWF0cml4LmdldFkoeHcsIHkpO1xyXG5cclxuICAgICAgICB2YXIgZnJhbWUgPSB0aGlzLmN1cnJlbnRGcmFtZTtcclxuXHJcbiAgICAgICAgdmFyIHUwID0gZnJhbWUudTA7XHJcbiAgICAgICAgdmFyIHYwID0gZnJhbWUudjA7XHJcbiAgICAgICAgdmFyIHUxID0gZnJhbWUudTE7XHJcbiAgICAgICAgdmFyIHYxID0gZnJhbWUudjE7XHJcblxyXG4gICAgICAgIHRoaXMuYmF0Y2hRdWFkKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdTAsIHYwLCB1MSwgdjEsIHRoaXMuZmlsbFRpbnQuVEwsIHRoaXMuZmlsbFRpbnQuVFIsIHRoaXMuZmlsbFRpbnQuQkwsIHRoaXMuZmlsbFRpbnQuQlIsIHRoaXMudGludEVmZmVjdCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIGEgZmlsbGVkIHRyaWFuZ2xlIGludG8gdGhlIHZlcnRleCBiYXRjaC5cclxuICAgICAqIFRyaWFuZ2xlIGZhY3RvcnMgaW4gdGhlIGdpdmVuIHRyYW5zZm9ybSBtYXRyaWNlcyBiZWZvcmUgYWRkaW5nIHRvIHRoZSBiYXRjaC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNiYXRjaEZpbGxUcmlhbmdsZVxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIFBvaW50IDAgeCBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkwIC0gUG9pbnQgMCB5IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSBQb2ludCAxIHggY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIFBvaW50IDEgeSBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIC0gUG9pbnQgMiB4IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIgLSBQb2ludCAyIHkgY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBjdXJyZW50TWF0cml4IC0gVGhlIGN1cnJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoZSBwYXJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICovXHJcbiAgICBiYXRjaEZpbGxUcmlhbmdsZTogZnVuY3Rpb24gKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIGN1cnJlbnRNYXRyaXgsIHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFBpcGVsaW5lKHRoaXMpO1xyXG5cclxuICAgICAgICB2YXIgY2FsY01hdHJpeCA9IHRoaXMuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgICAgICAvLyAgTXVsdGlwbHkgYW5kIHN0b3JlIHJlc3VsdCBpbiBjYWxjTWF0cml4LCBvbmx5IGlmIHRoZSBwYXJlbnRNYXRyaXggaXMgc2V0LCBvdGhlcndpc2Ugd2UnbGwgdXNlIHdoYXRldmVyIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB0aGUgY2FsY01hdHJpeFxyXG4gICAgICAgIGlmIChwYXJlbnRNYXRyaXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRNYXRyaXgubXVsdGlwbHkoY3VycmVudE1hdHJpeCwgY2FsY01hdHJpeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciB0eDAgPSBjYWxjTWF0cml4LmdldFgoeDAsIHkwKTtcclxuICAgICAgICB2YXIgdHkwID0gY2FsY01hdHJpeC5nZXRZKHgwLCB5MCk7XHJcblxyXG4gICAgICAgIHZhciB0eDEgPSBjYWxjTWF0cml4LmdldFgoeDEsIHkxKTtcclxuICAgICAgICB2YXIgdHkxID0gY2FsY01hdHJpeC5nZXRZKHgxLCB5MSk7XHJcblxyXG4gICAgICAgIHZhciB0eDIgPSBjYWxjTWF0cml4LmdldFgoeDIsIHkyKTtcclxuICAgICAgICB2YXIgdHkyID0gY2FsY01hdHJpeC5nZXRZKHgyLCB5Mik7XHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IHRoaXMuY3VycmVudEZyYW1lO1xyXG5cclxuICAgICAgICB2YXIgdTAgPSBmcmFtZS51MDtcclxuICAgICAgICB2YXIgdjAgPSBmcmFtZS52MDtcclxuICAgICAgICB2YXIgdTEgPSBmcmFtZS51MTtcclxuICAgICAgICB2YXIgdjEgPSBmcmFtZS52MTtcclxuXHJcbiAgICAgICAgdGhpcy5iYXRjaFRyaSh0eDAsIHR5MCwgdHgxLCB0eTEsIHR4MiwgdHkyLCB1MCwgdjAsIHUxLCB2MSwgdGhpcy5maWxsVGludC5UTCwgdGhpcy5maWxsVGludC5UUiwgdGhpcy5maWxsVGludC5CTCwgdGhpcy50aW50RWZmZWN0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQdXNoZXMgYSBzdHJva2VkIHRyaWFuZ2xlIGludG8gdGhlIHZlcnRleCBiYXRjaC5cclxuICAgICAqIFRyaWFuZ2xlIGZhY3RvcnMgaW4gdGhlIGdpdmVuIHRyYW5zZm9ybSBtYXRyaWNlcyBiZWZvcmUgYWRkaW5nIHRvIHRoZSBiYXRjaC5cclxuICAgICAqIFRoZSB0cmlhbmdsZSBpcyBjcmVhdGVkIGZyb20gMyBsaW5lcyBhbmQgZHJhd24gdXNpbmcgdGhlIGBiYXRjaFN0cm9rZVBhdGhgIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRQaXBlbGluZSNiYXRjaFN0cm9rZVRyaWFuZ2xlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgwIC0gUG9pbnQgMCB4IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTAgLSBQb2ludCAwIHkgY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIFBvaW50IDEgeCBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkxIC0gUG9pbnQgMSB5IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSBQb2ludCAyIHggY29vcmRpbmF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFBvaW50IDIgeSBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmVXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgbGluZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH0gY3VycmVudE1hdHJpeCAtIFRoZSBjdXJyZW50IHRyYW5zZm9ybS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBwYXJlbnRNYXRyaXggLSBUaGUgcGFyZW50IHRyYW5zZm9ybS5cclxuICAgICAqL1xyXG4gICAgYmF0Y2hTdHJva2VUcmlhbmdsZTogZnVuY3Rpb24gKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIGxpbmVXaWR0aCwgY3VycmVudE1hdHJpeCwgcGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ZW1wVHJpYW5nbGUgPSB0aGlzLnRlbXBUcmlhbmdsZTtcclxuXHJcbiAgICAgICAgdGVtcFRyaWFuZ2xlWzBdLnggPSB4MDtcclxuICAgICAgICB0ZW1wVHJpYW5nbGVbMF0ueSA9IHkwO1xyXG4gICAgICAgIHRlbXBUcmlhbmdsZVswXS53aWR0aCA9IGxpbmVXaWR0aDtcclxuXHJcbiAgICAgICAgdGVtcFRyaWFuZ2xlWzFdLnggPSB4MTtcclxuICAgICAgICB0ZW1wVHJpYW5nbGVbMV0ueSA9IHkxO1xyXG4gICAgICAgIHRlbXBUcmlhbmdsZVsxXS53aWR0aCA9IGxpbmVXaWR0aDtcclxuXHJcbiAgICAgICAgdGVtcFRyaWFuZ2xlWzJdLnggPSB4MjtcclxuICAgICAgICB0ZW1wVHJpYW5nbGVbMl0ueSA9IHkyO1xyXG4gICAgICAgIHRlbXBUcmlhbmdsZVsyXS53aWR0aCA9IGxpbmVXaWR0aDtcclxuXHJcbiAgICAgICAgdGVtcFRyaWFuZ2xlWzNdLnggPSB4MDtcclxuICAgICAgICB0ZW1wVHJpYW5nbGVbM10ueSA9IHkwO1xyXG4gICAgICAgIHRlbXBUcmlhbmdsZVszXS53aWR0aCA9IGxpbmVXaWR0aDtcclxuXHJcbiAgICAgICAgdGhpcy5iYXRjaFN0cm9rZVBhdGgodGVtcFRyaWFuZ2xlLCBsaW5lV2lkdGgsIGZhbHNlLCBjdXJyZW50TWF0cml4LCBwYXJlbnRNYXRyaXgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgdGhlIGdpdmVuIHBhdGggdG8gdGhlIHZlcnRleCBiYXRjaCBmb3IgcmVuZGVyaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBJdCB3b3JrcyBieSB0YWtpbmcgdGhlIGFycmF5IG9mIHBhdGggZGF0YSBhbmQgdGhlbiBwYXNzaW5nIGl0IHRocm91Z2ggRWFyY3V0LCB3aGljaFxyXG4gICAgICogY3JlYXRlcyBhIGxpc3Qgb2YgcG9seWdvbnMuIEVhY2ggcG9seWdvbiBpcyB0aGVuIGFkZGVkIHRvIHRoZSBiYXRjaC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHBhdGggaXMgYWx3YXlzIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGJlY2F1c2UgaXQncyBmaWxsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjYmF0Y2hGaWxsUGF0aFxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggLSBDb2xsZWN0aW9uIG9mIHBvaW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcGF0aC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBjdXJyZW50TWF0cml4IC0gVGhlIGN1cnJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoZSBwYXJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICovXHJcbiAgICBiYXRjaEZpbGxQYXRoOiBmdW5jdGlvbiAocGF0aCwgY3VycmVudE1hdHJpeCwgcGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBjYWxjTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBhbmQgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXgsIG9ubHkgaWYgdGhlIHBhcmVudE1hdHJpeCBpcyBzZXQsIG90aGVyd2lzZSB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdmFsdWVzIGFyZSBhbHJlYWR5IGluIHRoZSBjYWxjTWF0cml4XHJcbiAgICAgICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhcmVudE1hdHJpeC5tdWx0aXBseShjdXJyZW50TWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsZW5ndGggPSBwYXRoLmxlbmd0aDtcclxuICAgICAgICB2YXIgcG9seWdvbkNhY2hlID0gdGhpcy5wb2x5Z29uQ2FjaGU7XHJcbiAgICAgICAgdmFyIHBvbHlnb25JbmRleEFycmF5O1xyXG4gICAgICAgIHZhciBwb2ludDtcclxuXHJcbiAgICAgICAgdmFyIHRpbnRUTCA9IHRoaXMuZmlsbFRpbnQuVEw7XHJcbiAgICAgICAgdmFyIHRpbnRUUiA9IHRoaXMuZmlsbFRpbnQuVFI7XHJcbiAgICAgICAgdmFyIHRpbnRCTCA9IHRoaXMuZmlsbFRpbnQuQkw7XHJcbiAgICAgICAgdmFyIHRpbnRFZmZlY3QgPSB0aGlzLnRpbnRFZmZlY3Q7XHJcblxyXG4gICAgICAgIGZvciAodmFyIHBhdGhJbmRleCA9IDA7IHBhdGhJbmRleCA8IGxlbmd0aDsgKytwYXRoSW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwb2ludCA9IHBhdGhbcGF0aEluZGV4XTtcclxuICAgICAgICAgICAgcG9seWdvbkNhY2hlLnB1c2gocG9pbnQueCwgcG9pbnQueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwb2x5Z29uSW5kZXhBcnJheSA9IEVhcmN1dChwb2x5Z29uQ2FjaGUpO1xyXG4gICAgICAgIGxlbmd0aCA9IHBvbHlnb25JbmRleEFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5jdXJyZW50RnJhbWU7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcDAgPSBwb2x5Z29uSW5kZXhBcnJheVtpbmRleCArIDBdICogMjtcclxuICAgICAgICAgICAgdmFyIHAxID0gcG9seWdvbkluZGV4QXJyYXlbaW5kZXggKyAxXSAqIDI7XHJcbiAgICAgICAgICAgIHZhciBwMiA9IHBvbHlnb25JbmRleEFycmF5W2luZGV4ICsgMl0gKiAyO1xyXG5cclxuICAgICAgICAgICAgdmFyIHgwID0gcG9seWdvbkNhY2hlW3AwICsgMF07XHJcbiAgICAgICAgICAgIHZhciB5MCA9IHBvbHlnb25DYWNoZVtwMCArIDFdO1xyXG4gICAgICAgICAgICB2YXIgeDEgPSBwb2x5Z29uQ2FjaGVbcDEgKyAwXTtcclxuICAgICAgICAgICAgdmFyIHkxID0gcG9seWdvbkNhY2hlW3AxICsgMV07XHJcbiAgICAgICAgICAgIHZhciB4MiA9IHBvbHlnb25DYWNoZVtwMiArIDBdO1xyXG4gICAgICAgICAgICB2YXIgeTIgPSBwb2x5Z29uQ2FjaGVbcDIgKyAxXTtcclxuXHJcbiAgICAgICAgICAgIHZhciB0eDAgPSBjYWxjTWF0cml4LmdldFgoeDAsIHkwKTtcclxuICAgICAgICAgICAgdmFyIHR5MCA9IGNhbGNNYXRyaXguZ2V0WSh4MCwgeTApO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciB0eDEgPSBjYWxjTWF0cml4LmdldFgoeDEsIHkxKTtcclxuICAgICAgICAgICAgdmFyIHR5MSA9IGNhbGNNYXRyaXguZ2V0WSh4MSwgeTEpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciB0eDIgPSBjYWxjTWF0cml4LmdldFgoeDIsIHkyKTtcclxuICAgICAgICAgICAgdmFyIHR5MiA9IGNhbGNNYXRyaXguZ2V0WSh4MiwgeTIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHUwID0gZnJhbWUudTA7XHJcbiAgICAgICAgICAgIHZhciB2MCA9IGZyYW1lLnYwO1xyXG4gICAgICAgICAgICB2YXIgdTEgPSBmcmFtZS51MTtcclxuICAgICAgICAgICAgdmFyIHYxID0gZnJhbWUudjE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hUcmkodHgwLCB0eTAsIHR4MSwgdHkxLCB0eDIsIHR5MiwgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRFZmZlY3QpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcG9seWdvbkNhY2hlLmxlbmd0aCA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgZ2l2ZW4gcGF0aCB0byB0aGUgdmVydGV4IGJhdGNoIGZvciByZW5kZXJpbmcuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IHdvcmtzIGJ5IHRha2luZyB0aGUgYXJyYXkgb2YgcGF0aCBkYXRhIGFuZCBjYWxsaW5nIGBiYXRjaExpbmVgIGZvciBlYWNoIHNlY3Rpb25cclxuICAgICAqIG9mIHRoZSBwYXRoLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgcGF0aCBpcyBvcHRpb25hbGx5IGNsb3NlZCBhdCB0aGUgZW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lI2JhdGNoU3Ryb2tlUGF0aFxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggLSBDb2xsZWN0aW9uIG9mIHBvaW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcGF0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lV2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGxpbmUgc2VnbWVudHMgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwYXRoT3BlbiAtIEluZGljYXRlcyBpZiB0aGUgcGF0aCBzaG91bGQgYmUgY2xvc2VkIG9yIGxlZnQgb3Blbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fSBjdXJyZW50TWF0cml4IC0gVGhlIGN1cnJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoZSBwYXJlbnQgdHJhbnNmb3JtLlxyXG4gICAgICovXHJcbiAgICBiYXRjaFN0cm9rZVBhdGg6IGZ1bmN0aW9uIChwYXRoLCBsaW5lV2lkdGgsIHBhdGhPcGVuLCBjdXJyZW50TWF0cml4LCBwYXJlbnRNYXRyaXgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXBlbGluZSh0aGlzKTtcclxuXHJcbiAgICAgICAgLy8gIFJlc2V0IHRoZSBjbG9zZVBhdGggYm9vbGVhbnNcclxuICAgICAgICB0aGlzLnByZXZRdWFkWzRdID0gMDtcclxuICAgICAgICB0aGlzLmZpcnN0UXVhZFs0XSA9IDA7XHJcblxyXG4gICAgICAgIHZhciBwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBwYXRoSW5kZXggPSAwOyBwYXRoSW5kZXggPCBwYXRoTGVuZ3RoOyBwYXRoSW5kZXgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwb2ludDAgPSBwYXRoW3BhdGhJbmRleF07XHJcbiAgICAgICAgICAgIHZhciBwb2ludDEgPSBwYXRoW3BhdGhJbmRleCArIDFdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXRjaExpbmUoXHJcbiAgICAgICAgICAgICAgICBwb2ludDAueCxcclxuICAgICAgICAgICAgICAgIHBvaW50MC55LFxyXG4gICAgICAgICAgICAgICAgcG9pbnQxLngsXHJcbiAgICAgICAgICAgICAgICBwb2ludDEueSxcclxuICAgICAgICAgICAgICAgIHBvaW50MC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICBwb2ludDEud2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgbGluZVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgcGF0aEluZGV4LFxyXG4gICAgICAgICAgICAgICAgIXBhdGhPcGVuICYmIChwYXRoSW5kZXggPT09IHBhdGhMZW5ndGggLSAxKSxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRyaXgsXHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNYXRyaXhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHF1YWQgYW5kIGFkZHMgaXQgdG8gdGhlIHZlcnRleCBiYXRjaCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbGluZSB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50UGlwZWxpbmUjYmF0Y2hMaW5lXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF4IC0gWCBjb29yZGluYXRlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF5IC0gWSBjb29yZGluYXRlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJ4IC0gWCBjb29yZGluYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBieSAtIFkgY29vcmRpbmF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYUxpbmVXaWR0aCAtIFdpZHRoIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJMaW5lV2lkdGggLSBXaWR0aCBvZiB0aGUgZW5kIG9mIHRoZSBsaW5lXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gY3VycmVudE1hdHJpeCAtIFBhcmVudCBtYXRyaXgsIGdlbmVyYWxseSB1c2VkIGJ5IGNvbnRhaW5lcnNcclxuICAgICAqL1xyXG4gICAgYmF0Y2hMaW5lOiBmdW5jdGlvbiAoYXgsIGF5LCBieCwgYnksIGFMaW5lV2lkdGgsIGJMaW5lV2lkdGgsIGxpbmVXaWR0aCwgaW5kZXgsIGNsb3NlUGF0aCwgY3VycmVudE1hdHJpeCwgcGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGlwZWxpbmUodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBjYWxjTWF0cml4ID0gdGhpcy5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBhbmQgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXgsIG9ubHkgaWYgdGhlIHBhcmVudE1hdHJpeCBpcyBzZXQsIG90aGVyd2lzZSB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdmFsdWVzIGFyZSBhbHJlYWR5IGluIHRoZSBjYWxjTWF0cml4XHJcbiAgICAgICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhcmVudE1hdHJpeC5tdWx0aXBseShjdXJyZW50TWF0cml4LCBjYWxjTWF0cml4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkeCA9IGJ4IC0gYXg7XHJcbiAgICAgICAgdmFyIGR5ID0gYnkgLSBheTtcclxuXHJcbiAgICAgICAgdmFyIGxlbiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcbiAgICAgICAgdmFyIGFsMCA9IGFMaW5lV2lkdGggKiAoYnkgLSBheSkgLyBsZW47XHJcbiAgICAgICAgdmFyIGFsMSA9IGFMaW5lV2lkdGggKiAoYXggLSBieCkgLyBsZW47XHJcbiAgICAgICAgdmFyIGJsMCA9IGJMaW5lV2lkdGggKiAoYnkgLSBheSkgLyBsZW47XHJcbiAgICAgICAgdmFyIGJsMSA9IGJMaW5lV2lkdGggKiAoYXggLSBieCkgLyBsZW47XHJcblxyXG4gICAgICAgIHZhciBseDAgPSBieCAtIGJsMDtcclxuICAgICAgICB2YXIgbHkwID0gYnkgLSBibDE7XHJcbiAgICAgICAgdmFyIGx4MSA9IGF4IC0gYWwwO1xyXG4gICAgICAgIHZhciBseTEgPSBheSAtIGFsMTtcclxuICAgICAgICB2YXIgbHgyID0gYnggKyBibDA7XHJcbiAgICAgICAgdmFyIGx5MiA9IGJ5ICsgYmwxO1xyXG4gICAgICAgIHZhciBseDMgPSBheCArIGFsMDtcclxuICAgICAgICB2YXIgbHkzID0gYXkgKyBhbDE7XHJcblxyXG4gICAgICAgIC8vICB0eDAgPSBib3R0b20gcmlnaHRcclxuICAgICAgICB2YXIgYnJYID0gY2FsY01hdHJpeC5nZXRYKGx4MCwgbHkwKTtcclxuICAgICAgICB2YXIgYnJZID0gY2FsY01hdHJpeC5nZXRZKGx4MCwgbHkwKTtcclxuXHJcbiAgICAgICAgLy8gIHR4MSA9IGJvdHRvbSBsZWZ0XHJcbiAgICAgICAgdmFyIGJsWCA9IGNhbGNNYXRyaXguZ2V0WChseDEsIGx5MSk7XHJcbiAgICAgICAgdmFyIGJsWSA9IGNhbGNNYXRyaXguZ2V0WShseDEsIGx5MSk7XHJcblxyXG4gICAgICAgIC8vICB0eDIgPSB0b3AgcmlnaHRcclxuICAgICAgICB2YXIgdHJYID0gY2FsY01hdHJpeC5nZXRYKGx4MiwgbHkyKTtcclxuICAgICAgICB2YXIgdHJZID0gY2FsY01hdHJpeC5nZXRZKGx4MiwgbHkyKTtcclxuXHJcbiAgICAgICAgLy8gIHR4MyA9IHRvcCBsZWZ0XHJcbiAgICAgICAgdmFyIHRsWCA9IGNhbGNNYXRyaXguZ2V0WChseDMsIGx5Myk7XHJcbiAgICAgICAgdmFyIHRsWSA9IGNhbGNNYXRyaXguZ2V0WShseDMsIGx5Myk7XHJcblxyXG4gICAgICAgIHZhciB0aW50ID0gdGhpcy5zdHJva2VUaW50O1xyXG4gICAgICAgIHZhciB0aW50RWZmZWN0ID0gdGhpcy50aW50RWZmZWN0O1xyXG5cclxuICAgICAgICB2YXIgdGludFRMID0gdGludC5UTDtcclxuICAgICAgICB2YXIgdGludFRSID0gdGludC5UUjtcclxuICAgICAgICB2YXIgdGludEJMID0gdGludC5CTDtcclxuICAgICAgICB2YXIgdGludEJSID0gdGludC5CUjtcclxuXHJcbiAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5jdXJyZW50RnJhbWU7XHJcblxyXG4gICAgICAgIHZhciB1MCA9IGZyYW1lLnUwO1xyXG4gICAgICAgIHZhciB2MCA9IGZyYW1lLnYwO1xyXG4gICAgICAgIHZhciB1MSA9IGZyYW1lLnUxO1xyXG4gICAgICAgIHZhciB2MSA9IGZyYW1lLnYxO1xyXG5cclxuICAgICAgICAvLyAgVEwsIEJMLCBCUiwgVFJcclxuICAgICAgICB0aGlzLmJhdGNoUXVhZCh0bFgsIHRsWSwgYmxYLCBibFksIGJyWCwgYnJZLCB0clgsIHRyWSwgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCk7XHJcblxyXG4gICAgICAgIGlmIChsaW5lV2lkdGggPD0gMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBObyBwb2ludCBkb2luZyBhIGxpbmVqb2luIGlmIHRoZSBsaW5lIGlzbid0IHRoaWNrIGVub3VnaFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcHJldiA9IHRoaXMucHJldlF1YWQ7XHJcbiAgICAgICAgdmFyIGZpcnN0ID0gdGhpcy5maXJzdFF1YWQ7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IDAgJiYgcHJldls0XSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hRdWFkKHRsWCwgdGxZLCBibFgsIGJsWSwgcHJldlswXSwgcHJldlsxXSwgcHJldlsyXSwgcHJldlszXSwgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpcnN0WzBdID0gdGxYO1xyXG4gICAgICAgICAgICBmaXJzdFsxXSA9IHRsWTtcclxuICAgICAgICAgICAgZmlyc3RbMl0gPSBibFg7XHJcbiAgICAgICAgICAgIGZpcnN0WzNdID0gYmxZO1xyXG4gICAgICAgICAgICBmaXJzdFs0XSA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xvc2VQYXRoICYmIGZpcnN0WzRdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFkZCBhIGpvaW4gZm9yIHRoZSBmaW5hbCBwYXRoIHNlZ21lbnRcclxuICAgICAgICAgICAgdGhpcy5iYXRjaFF1YWQoYnJYLCBiclksIHRyWCwgdHJZLCBmaXJzdFswXSwgZmlyc3RbMV0sIGZpcnN0WzJdLCBmaXJzdFszXSwgdTAsIHYwLCB1MSwgdjEsIHRpbnRUTCwgdGludFRSLCB0aW50QkwsIHRpbnRCUiwgdGludEVmZmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBTdG9yZSBpdFxyXG5cclxuICAgICAgICAgICAgcHJldlswXSA9IGJyWDtcclxuICAgICAgICAgICAgcHJldlsxXSA9IGJyWTtcclxuICAgICAgICAgICAgcHJldlsyXSA9IHRyWDtcclxuICAgICAgICAgICAgcHJldlszXSA9IHRyWTtcclxuICAgICAgICAgICAgcHJldls0XSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRleHR1cmVUaW50UGlwZWxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIEZlbGlwZSBBbGZvbnNvIDxAYml0bmVuZmVyPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxudmFyIE1vZGVsVmlld1Byb2plY3Rpb24gPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvTW9kZWxWaWV3UHJvamVjdGlvbicpO1xyXG52YXIgU2hhZGVyU291cmNlRlMgPSByZXF1aXJlKCcuLi9zaGFkZXJzL1RleHR1cmVUaW50LWZyYWcuanMnKTtcclxudmFyIFNoYWRlclNvdXJjZVZTID0gcmVxdWlyZSgnLi4vc2hhZGVycy9UZXh0dXJlVGludC12ZXJ0LmpzJyk7XHJcbnZhciBUcmFuc2Zvcm1NYXRyaXggPSByZXF1aXJlKCcuLi8uLi8uLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzL1RyYW5zZm9ybU1hdHJpeCcpO1xyXG52YXIgV2ViR0xQaXBlbGluZSA9IHJlcXVpcmUoJy4uL1dlYkdMUGlwZWxpbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFRleHR1cmVUaW50U3RyaXBQaXBlbGluZSBpbXBsZW1lbnRzIHRoZSByZW5kZXJpbmcgaW5mcmFzdHJ1Y3R1cmVcclxuICogZm9yIGRpc3BsYXlpbmcgdGV4dHVyZWQgb2JqZWN0c1xyXG4gKiBUaGUgY29uZmlnIHByb3BlcnRpZXMgYXJlOlxyXG4gKiAtIGdhbWU6IEN1cnJlbnQgZ2FtZSBpbnN0YW5jZS5cclxuICogLSByZW5kZXJlcjogQ3VycmVudCBXZWJHTCByZW5kZXJlci5cclxuICogLSB2ZXJ0U2hhZGVyOiBTb3VyY2UgZm9yIHZlcnRleCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gZnJhZ1NoYWRlcjogU291cmNlIGZvciBmcmFnbWVudCBzaGFkZXIgYXMgYSBzdHJpbmcuXHJcbiAqIC0gdmVydGV4Q2FwYWNpdHk6IFRoZSBhbW91bnQgb2YgdmVydGljZXMgdGhhdCBzaGFsbCBiZSBhbGxvY2F0ZWRcclxuICogLSB2ZXJ0ZXhTaXplOiBUaGUgc2l6ZSBvZiBhIHNpbmdsZSB2ZXJ0ZXggaW4gYnl0ZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBUZXh0dXJlVGludFN0cmlwUGlwZWxpbmVcclxuICogQGV4dGVuZHMgUGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUGlwZWxpbmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjIzLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgVGV4dHVyZSBUaW50IFBpcGVsaW5lLCBhcyBkZXNjcmliZWQgYWJvdmUuXHJcbiAqL1xyXG52YXIgVGV4dHVyZVRpbnRTdHJpcFBpcGVsaW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBXZWJHTFBpcGVsaW5lLFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIE1vZGVsVmlld1Byb2plY3Rpb25cclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUZXh0dXJlVGludFN0cmlwUGlwZWxpbmUgKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVuZGVyZXJDb25maWcgPSBjb25maWcucmVuZGVyZXIuY29uZmlnO1xyXG5cclxuICAgICAgICAvLyAgVmVydGV4IFNpemUgPSBhdHRyaWJ1dGUgc2l6ZSBhZGRlZCB0b2dldGhlciAoMiArIDIgKyAxICsgNClcclxuXHJcbiAgICAgICAgV2ViR0xQaXBlbGluZS5jYWxsKHRoaXMsIHtcclxuICAgICAgICAgICAgZ2FtZTogY29uZmlnLmdhbWUsXHJcbiAgICAgICAgICAgIHJlbmRlcmVyOiBjb25maWcucmVuZGVyZXIsXHJcbiAgICAgICAgICAgIGdsOiBjb25maWcucmVuZGVyZXIuZ2wsXHJcbiAgICAgICAgICAgIHRvcG9sb2d5OiBjb25maWcucmVuZGVyZXIuZ2wuVFJJQU5HTEVfU1RSSVAsXHJcbiAgICAgICAgICAgIHZlcnRTaGFkZXI6IEdldEZhc3RWYWx1ZShjb25maWcsICd2ZXJ0U2hhZGVyJywgU2hhZGVyU291cmNlVlMpLFxyXG4gICAgICAgICAgICBmcmFnU2hhZGVyOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZnJhZ1NoYWRlcicsIFNoYWRlclNvdXJjZUZTKSxcclxuICAgICAgICAgICAgdmVydGV4Q2FwYWNpdHk6IEdldEZhc3RWYWx1ZShjb25maWcsICd2ZXJ0ZXhDYXBhY2l0eScsIDYgKiByZW5kZXJlckNvbmZpZy5iYXRjaFNpemUpLFxyXG4gICAgICAgICAgICB2ZXJ0ZXhTaXplOiBHZXRGYXN0VmFsdWUoY29uZmlnLCAndmVydGV4U2l6ZScsIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDUgKyBVaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogNCksXHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaW5Qb3NpdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb25maWcucmVuZGVyZXIuZ2wuRkxPQVQsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpblRleENvb3JkJyxcclxuICAgICAgICAgICAgICAgICAgICBzaXplOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGNvbmZpZy5yZW5kZXJlci5nbC5GTE9BVCxcclxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luVGludEVmZmVjdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb25maWcucmVuZGVyZXIuZ2wuRkxPQVQsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKiA0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpblRpbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDQsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY29uZmlnLnJlbmRlcmVyLmdsLlVOU0lHTkVEX0JZVEUsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIDVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGbG9hdDMyIHZpZXcgb2YgdGhlIGFycmF5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaXBlbGluZSdzIHZlcnRpY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjdmVydGV4Vmlld0YzMlxyXG4gICAgICAgICAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4Vmlld0YzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy52ZXJ0ZXhEYXRhKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVWludDMyIHZpZXcgb2YgdGhlIGFycmF5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBwaXBlbGluZSdzIHZlcnRpY2VzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjdmVydGV4Vmlld1UzMlxyXG4gICAgICAgICAqIEB0eXBlIHtVaW50MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhWaWV3VTMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMudmVydGV4RGF0YSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNpemUgb2YgdGhlIGJhdGNoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjbWF4UXVhZHNcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXhRdWFkcyA9IHJlbmRlcmVyQ29uZmlnLmJhdGNoU2l6ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ29sbGVjdGlvbiBvZiBiYXRjaCBpbmZvcm1hdGlvblxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjYmF0Y2hlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYXRjaGVzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgdGVtcG9yYXJ5IFRyYW5zZm9ybSBNYXRyaXgsIHJlLXVzZWQgaW50ZXJuYWxseSBkdXJpbmcgYmF0Y2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50U3RyaXBQaXBlbGluZSNfdGVtcE1hdHJpeDFcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXgxID0gbmV3IFRyYW5zZm9ybU1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHRlbXBvcmFyeSBUcmFuc2Zvcm0gTWF0cml4LCByZS11c2VkIGludGVybmFsbHkgZHVyaW5nIGJhdGNoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjX3RlbXBNYXRyaXgyXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVHJhbnNmb3JtTWF0cml4fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wTWF0cml4MiA9IG5ldyBUcmFuc2Zvcm1NYXRyaXgoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCwgcmUtdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBiYXRjaGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRTdHJpcFBpcGVsaW5lI190ZW1wTWF0cml4M1xyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybU1hdHJpeH1cclxuICAgICAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdGVtcE1hdHJpeDMgPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIHRoaXMubXZwSW5pdCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBldmVyeSB0aW1lIHRoZSBwaXBlbGluZSBuZWVkcyB0byBiZSB1c2VkLlxyXG4gICAgICogSXQgYmluZHMgYWxsIG5lY2Vzc2FyeSByZXNvdXJjZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50U3RyaXBQaXBlbGluZSNvbkJpbmRcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIG9uQmluZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBXZWJHTFBpcGVsaW5lLnByb3RvdHlwZS5vbkJpbmQuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5tdnBVcGRhdGUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzaXplcyB0aGlzIHBpcGVsaW5lIGFuZCB1cGRhdGVzIHRoZSBwcm9qZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjcmVzaXplXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG5ldyB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZXNvbHV0aW9uIC0gVGhlIHJlc29sdXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBXZWJHTFBpcGVsaW5lIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCByZXNvbHV0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIFdlYkdMUGlwZWxpbmUucHJvdG90eXBlLnJlc2l6ZS5jYWxsKHRoaXMsIHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLnByb2pPcnRobygwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgLTEwMDAuMCwgMTAwMC4wKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzaWducyBhIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYmF0Y2guIElmIGEgZGlmZmVyZW50IHRleHR1cmUgaXMgYWxyZWFkeSBzZXQgaXQgY3JlYXRlcyBhIG5ldyBiYXRjaCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50U3RyaXBQaXBlbGluZSNzZXRUZXh0dXJlMkRcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gW3RleHR1cmVdIC0gV2ViR0xUZXh0dXJlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBiYXRjaC4gSWYgbm90IGdpdmVuIHVzZXMgYmxhbmtUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdW5pdD0wXSAtIFRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLlRleHR1cmVUaW50U3RyaXBQaXBlbGluZX0gVGhpcyBwaXBlbGluZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGV4dHVyZTJEOiBmdW5jdGlvbiAodGV4dHVyZSwgdW5pdClcclxuICAgIHtcclxuICAgICAgICBpZiAodGV4dHVyZSA9PT0gdW5kZWZpbmVkKSB7IHRleHR1cmUgPSB0aGlzLnJlbmRlcmVyLmJsYW5rVGV4dHVyZS5nbFRleHR1cmU7IH1cclxuICAgICAgICBpZiAodW5pdCA9PT0gdW5kZWZpbmVkKSB7IHVuaXQgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVUZXh0dXJlQmF0Y2godGV4dHVyZSwgdW5pdCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnB1c2hCYXRjaCh0ZXh0dXJlLCB1bml0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBiYXRjaCBoYXMgdGhlIHNhbWUgdGV4dHVyZSBhbmQgdGV4dHVyZSB1bml0LCBvciBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBiYXRjaC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuVGV4dHVyZVRpbnRTdHJpcFBpcGVsaW5lI3JlcXVpcmVUZXh0dXJlQmF0Y2hcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gdGV4dHVyZSAtIFdlYkdMVGV4dHVyZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgYmF0Y2guIElmIG5vdCBnaXZlbiB1c2VzIGJsYW5rVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdW5pdCAtIFRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBpcGVsaW5lIG5lZWRzIHRvIGNyZWF0ZSBhIG5ldyBiYXRjaCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHJlcXVpcmVUZXh0dXJlQmF0Y2g6IGZ1bmN0aW9uICh0ZXh0dXJlLCB1bml0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBiYXRjaGVzID0gdGhpcy5iYXRjaGVzO1xyXG4gICAgICAgIHZhciBiYXRjaExlbmd0aCA9IGJhdGNoZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoYmF0Y2hMZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIFRleHR1cmUgVW5pdCBzcGVjaWZpZWQsIHdlIGdldCB0aGUgdGV4dHVyZSBmcm9tIHRoZSB0ZXh0dXJlcyBhcnJheSwgb3RoZXJ3aXNlIHdlIHVzZSB0aGUgdGV4dHVyZSBwcm9wZXJ0eVxyXG4gICAgICAgICAgICB2YXIgY3VycmVudFRleHR1cmUgPSAodW5pdCA+IDApID8gYmF0Y2hlc1tiYXRjaExlbmd0aCAtIDFdLnRleHR1cmVzW3VuaXQgLSAxXSA6IGJhdGNoZXNbYmF0Y2hMZW5ndGggLSAxXS50ZXh0dXJlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICEoY3VycmVudFRleHR1cmUgPT09IHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBiYXRjaCBvYmplY3QgYW5kIHB1c2hlcyBpdCB0byBhIGJhdGNoIGFycmF5LlxyXG4gICAgICogVGhlIGJhdGNoIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgY3VycmVudCBcclxuICAgICAqIHZlcnRleCBiYXRjaCBsaWtlIHRoZSBvZmZzZXQgaW4gdGhlIHZlcnRleCBidWZmZXIsIHZlcnRleCBjb3VudCBhbmQgXHJcbiAgICAgKiB0aGUgdGV4dHVyZXMgdXNlZCBieSB0aGF0IGJhdGNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjcHVzaEJhdGNoXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB0ZXh0dXJlIC0gT3B0aW9uYWwgV2ViR0xUZXh0dXJlIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBiYXRjaC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdW5pdCAtIFRleHR1cmUgdW5pdCB0byB3aGljaCB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSBib3VuZC5cclxuICAgICAqL1xyXG4gICAgcHVzaEJhdGNoOiBmdW5jdGlvbiAodGV4dHVyZSwgdW5pdClcclxuICAgIHtcclxuICAgICAgICBpZiAodW5pdCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGZpcnN0OiB0aGlzLnZlcnRleENvdW50LFxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZTogdGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIHRleHR1cmVzOiBbXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRleHR1cmVzID0gW107XHJcblxyXG4gICAgICAgICAgICB0ZXh0dXJlc1t1bml0IC0gMV0gPSB0ZXh0dXJlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZmlyc3Q6IHRoaXMudmVydGV4Q291bnQsXHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZXM6IHRleHR1cmVzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGxvYWRzIHRoZSB2ZXJ0ZXggZGF0YSBhbmQgZW1pdHMgYSBkcmF3IGNhbGwgZm9yIHRoZSBjdXJyZW50IGJhdGNoIG9mIHZlcnRpY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5UZXh0dXJlVGludFN0cmlwUGlwZWxpbmUjZmx1c2hcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFdlYkdMUGlwZWxpbmUgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGZsdXNoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmZsdXNoTG9ja2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZsdXNoTG9ja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcclxuICAgICAgICB2YXIgdmVydGV4Q291bnQgPSB0aGlzLnZlcnRleENvdW50O1xyXG4gICAgICAgIHZhciB0b3BvbG9neSA9IHRoaXMudG9wb2xvZ3k7XHJcbiAgICAgICAgdmFyIHZlcnRleFNpemUgPSB0aGlzLnZlcnRleFNpemU7XHJcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgdmFyIGJhdGNoZXMgPSB0aGlzLmJhdGNoZXM7XHJcbiAgICAgICAgdmFyIGJhdGNoQ291bnQgPSBiYXRjaGVzLmxlbmd0aDtcclxuICAgICAgICB2YXIgYmF0Y2hWZXJ0ZXhDb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIGJhdGNoID0gbnVsbDtcclxuICAgICAgICB2YXIgYmF0Y2hOZXh0O1xyXG4gICAgICAgIHZhciB0ZXh0dXJlSW5kZXg7XHJcbiAgICAgICAgdmFyIG5UZXh0dXJlO1xyXG5cclxuICAgICAgICBpZiAoYmF0Y2hDb3VudCA9PT0gMCB8fCB2ZXJ0ZXhDb3VudCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZmx1c2hMb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIDAsIHRoaXMuYnl0ZXMuc3ViYXJyYXkoMCwgdmVydGV4Q291bnQgKiB2ZXJ0ZXhTaXplKSk7XHJcblxyXG4gICAgICAgIC8vICBQcm9jZXNzIHRoZSBURVhUVVJFIEJBVENIRVNcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGJhdGNoQ291bnQgLSAxOyBpbmRleCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYmF0Y2ggPSBiYXRjaGVzW2luZGV4XTtcclxuICAgICAgICAgICAgYmF0Y2hOZXh0ID0gYmF0Y2hlc1tpbmRleCArIDFdO1xyXG5cclxuICAgICAgICAgICAgLy8gIE11bHRpLXRleHR1cmUgY2hlY2sgKGZvciBub24temVybyB0ZXh0dXJlIHVuaXRzKVxyXG4gICAgICAgICAgICBpZiAoYmF0Y2gudGV4dHVyZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yICh0ZXh0dXJlSW5kZXggPSAwOyB0ZXh0dXJlSW5kZXggPCBiYXRjaC50ZXh0dXJlcy5sZW5ndGg7ICsrdGV4dHVyZUluZGV4KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5UZXh0dXJlID0gYmF0Y2gudGV4dHVyZXNbdGV4dHVyZUluZGV4XTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5UZXh0dXJlKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0VGV4dHVyZTJEKG5UZXh0dXJlLCAxICsgdGV4dHVyZUluZGV4LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBiYXRjaFZlcnRleENvdW50ID0gYmF0Y2hOZXh0LmZpcnN0IC0gYmF0Y2guZmlyc3Q7XHJcblxyXG4gICAgICAgICAgICAvLyAgQmFpbCBvdXQgaWYgdGV4dHVyZSBwcm9wZXJ0eSBpcyBudWxsIChpLmUuIGlmIGEgdGV4dHVyZSB1bml0ID4gMClcclxuICAgICAgICAgICAgaWYgKGJhdGNoLnRleHR1cmUgPT09IG51bGwgfHwgYmF0Y2hWZXJ0ZXhDb3VudCA8PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0VGV4dHVyZTJEKGJhdGNoLnRleHR1cmUsIDAsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGdsLmRyYXdBcnJheXModG9wb2xvZ3ksIGJhdGNoLmZpcnN0LCBiYXRjaFZlcnRleENvdW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExlZnQgb3ZlciBkYXRhXHJcbiAgICAgICAgYmF0Y2ggPSBiYXRjaGVzW2JhdGNoQ291bnQgLSAxXTtcclxuXHJcbiAgICAgICAgLy8gIE11bHRpLXRleHR1cmUgY2hlY2sgKGZvciBub24temVybyB0ZXh0dXJlIHVuaXRzKVxyXG5cclxuICAgICAgICBpZiAoYmF0Y2gudGV4dHVyZXMubGVuZ3RoID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodGV4dHVyZUluZGV4ID0gMDsgdGV4dHVyZUluZGV4IDwgYmF0Y2gudGV4dHVyZXMubGVuZ3RoOyArK3RleHR1cmVJbmRleClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgblRleHR1cmUgPSBiYXRjaC50ZXh0dXJlc1t0ZXh0dXJlSW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChuVGV4dHVyZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoblRleHR1cmUsIDEgKyB0ZXh0dXJlSW5kZXgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBiYXRjaFZlcnRleENvdW50ID0gdmVydGV4Q291bnQgLSBiYXRjaC5maXJzdDtcclxuXHJcbiAgICAgICAgaWYgKGJhdGNoLnRleHR1cmUgJiYgYmF0Y2hWZXJ0ZXhDb3VudCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRUZXh0dXJlMkQoYmF0Y2gudGV4dHVyZSwgMCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyh0b3BvbG9neSwgYmF0Y2guZmlyc3QsIGJhdGNoVmVydGV4Q291bnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGJhdGNoZXMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5mbHVzaExvY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUZXh0dXJlVGludFN0cmlwUGlwZWxpbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEltcGxlbWVudHMgYSBtb2RlbCB2aWV3IHByb2plY3Rpb24gbWF0cmljZXMuXHJcbiAqIFBpcGVsaW5lcyBjYW4gaW1wbGVtZW50IHRoaXMgZm9yIGRvaW5nIDJEIGFuZCAzRCByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIE1vZGVsVmlld1Byb2plY3Rpb24gPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXJ0eSBmbGFnIGZvciBjaGVja2luZyBpZiBtb2RlbCBtYXRyaXggbmVlZHMgdG8gYmUgdXBkYXRlZCBvbiBHUFUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNtb2RlbE1hdHJpeERpcnR5XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBtb2RlbE1hdHJpeERpcnR5OiBmYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERpcnR5IGZsYWcgZm9yIGNoZWNraW5nIGlmIHZpZXcgbWF0cml4IG5lZWRzIHRvIGJlIHVwZGF0ZWQgb24gR1BVLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLk1vZGVsVmlld1Byb2plY3Rpb24jdmlld01hdHJpeERpcnR5XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2aWV3TWF0cml4RGlydHk6IGZhbHNlLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlydHkgZmxhZyBmb3IgY2hlY2tpbmcgaWYgcHJvamVjdGlvbiBtYXRyaXggbmVlZHMgdG8gYmUgdXBkYXRlZCBvbiBHUFUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNwcm9qZWN0aW9uTWF0cml4RGlydHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHByb2plY3Rpb25NYXRyaXhEaXJ0eTogZmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RlbCBtYXRyaXhcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI21vZGVsTWF0cml4XHJcbiAgICAgKiBAdHlwZSB7P0Zsb2F0MzJBcnJheX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBtb2RlbE1hdHJpeDogbnVsbCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZpZXcgbWF0cml4XHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiN2aWV3TWF0cml4XHJcbiAgICAgKiBAdHlwZSB7P0Zsb2F0MzJBcnJheX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2aWV3TWF0cml4OiBudWxsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvamVjdGlvbiBtYXRyaXhcclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI3Byb2plY3Rpb25NYXRyaXhcclxuICAgICAqIEB0eXBlIHs/RmxvYXQzMkFycmF5fVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHByb2plY3Rpb25NYXRyaXg6IG51bGwsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBNVlAgbWF0cmljZXMgd2l0aCBhbiBpZGVudGl0eSBtYXRyaXhcclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLk1vZGVsVmlld1Byb2plY3Rpb24jbXZwSW5pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG12cEluaXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tb2RlbE1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXhEaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4RGlydHkgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMubW9kZWxNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KFtcclxuICAgICAgICAgICAgMSwgMCwgMCwgMCxcclxuICAgICAgICAgICAgMCwgMSwgMCwgMCxcclxuICAgICAgICAgICAgMCwgMCwgMSwgMCxcclxuICAgICAgICAgICAgMCwgMCwgMCwgMVxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMudmlld01hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoW1xyXG4gICAgICAgICAgICAxLCAwLCAwLCAwLFxyXG4gICAgICAgICAgICAwLCAxLCAwLCAwLFxyXG4gICAgICAgICAgICAwLCAwLCAxLCAwLFxyXG4gICAgICAgICAgICAwLCAwLCAwLCAxXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheShbXHJcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsXHJcbiAgICAgICAgICAgIDAsIDEsIDAsIDAsXHJcbiAgICAgICAgICAgIDAsIDAsIDEsIDAsXHJcbiAgICAgICAgICAgIDAsIDAsIDAsIDFcclxuICAgICAgICBdKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBkaXJ0eSBmbGFncyBhcmUgc2V0IHRoZW4gdGhlIG1hdHJpY2VzIGFyZSB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNtdnBVcGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBtdnBVcGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHByb2dyYW0gPSB0aGlzLnByb2dyYW07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsTWF0cml4RGlydHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldE1hdHJpeDQocHJvZ3JhbSwgJ3VNb2RlbE1hdHJpeCcsIGZhbHNlLCB0aGlzLm1vZGVsTWF0cml4KTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbE1hdHJpeERpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLnZpZXdNYXRyaXhEaXJ0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0TWF0cml4NChwcm9ncmFtLCAndVZpZXdNYXRyaXgnLCBmYWxzZSwgdGhpcy52aWV3TWF0cml4KTtcclxuICAgICAgICAgICAgdGhpcy52aWV3TWF0cml4RGlydHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb2plY3Rpb25NYXRyaXhEaXJ0eSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0TWF0cml4NChwcm9ncmFtLCAndVByb2plY3Rpb25NYXRyaXgnLCBmYWxzZSwgdGhpcy5wcm9qZWN0aW9uTWF0cml4KTtcclxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4RGlydHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGFuIGlkZW50aXR5IG1hdHJpeCB0byB0aGUgbW9kZWwgbWF0cml4XHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI21vZGVsSWRlbnRpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBtb2RlbElkZW50aXR5OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtb2RlbE1hdHJpeCA9IHRoaXMubW9kZWxNYXRyaXg7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMF0gPSAxO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzFdID0gMDtcclxuICAgICAgICBtb2RlbE1hdHJpeFsyXSA9IDA7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbM10gPSAwO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzRdID0gMDtcclxuICAgICAgICBtb2RlbE1hdHJpeFs1XSA9IDE7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbNl0gPSAwO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzddID0gMDtcclxuICAgICAgICBtb2RlbE1hdHJpeFs4XSA9IDA7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbOV0gPSAwO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzEwXSA9IDE7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTFdID0gMDtcclxuICAgICAgICBtb2RlbE1hdHJpeFsxMl0gPSAwO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzEzXSA9IDA7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTRdID0gMDtcclxuICAgICAgICBtb2RlbE1hdHJpeFsxNV0gPSAxO1xyXG5cclxuICAgICAgICB0aGlzLm1vZGVsTWF0cml4RGlydHkgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjYWxlIG1vZGVsIG1hdHJpeFxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNtb2RlbFNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNb2RlbCBWaWV3IFByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIG1vZGVsU2NhbGU6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtb2RlbE1hdHJpeCA9IHRoaXMubW9kZWxNYXRyaXg7XHJcblxyXG4gICAgICAgIG1vZGVsTWF0cml4WzBdID0gbW9kZWxNYXRyaXhbMF0gKiB4O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzFdID0gbW9kZWxNYXRyaXhbMV0gKiB4O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzJdID0gbW9kZWxNYXRyaXhbMl0gKiB4O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzNdID0gbW9kZWxNYXRyaXhbM10gKiB4O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzRdID0gbW9kZWxNYXRyaXhbNF0gKiB5O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzVdID0gbW9kZWxNYXRyaXhbNV0gKiB5O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzZdID0gbW9kZWxNYXRyaXhbNl0gKiB5O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzddID0gbW9kZWxNYXRyaXhbN10gKiB5O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzhdID0gbW9kZWxNYXRyaXhbOF0gKiB6O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzldID0gbW9kZWxNYXRyaXhbOV0gKiB6O1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzEwXSA9IG1vZGVsTWF0cml4WzEwXSAqIHo7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTFdID0gbW9kZWxNYXRyaXhbMTFdICogejtcclxuICAgIFxyXG4gICAgICAgIHRoaXMubW9kZWxNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZSBtb2RlbCBtYXRyaXhcclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLk1vZGVsVmlld1Byb2plY3Rpb24jbW9kZWxUcmFuc2xhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IGNvbXBvbmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vZGVsIFZpZXcgUHJvamVjdGlvbi5cclxuICAgICAqL1xyXG4gICAgbW9kZWxUcmFuc2xhdGU6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtb2RlbE1hdHJpeCA9IHRoaXMubW9kZWxNYXRyaXg7XHJcblxyXG4gICAgICAgIG1vZGVsTWF0cml4WzEyXSA9IG1vZGVsTWF0cml4WzBdICogeCArIG1vZGVsTWF0cml4WzRdICogeSArIG1vZGVsTWF0cml4WzhdICogeiArIG1vZGVsTWF0cml4WzEyXTtcclxuICAgICAgICBtb2RlbE1hdHJpeFsxM10gPSBtb2RlbE1hdHJpeFsxXSAqIHggKyBtb2RlbE1hdHJpeFs1XSAqIHkgKyBtb2RlbE1hdHJpeFs5XSAqIHogKyBtb2RlbE1hdHJpeFsxM107XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTRdID0gbW9kZWxNYXRyaXhbMl0gKiB4ICsgbW9kZWxNYXRyaXhbNl0gKiB5ICsgbW9kZWxNYXRyaXhbMTBdICogeiArIG1vZGVsTWF0cml4WzE0XTtcclxuICAgICAgICBtb2RlbE1hdHJpeFsxNV0gPSBtb2RlbE1hdHJpeFszXSAqIHggKyBtb2RlbE1hdHJpeFs3XSAqIHkgKyBtb2RlbE1hdHJpeFsxMV0gKiB6ICsgbW9kZWxNYXRyaXhbMTVdO1xyXG5cclxuICAgICAgICB0aGlzLm1vZGVsTWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoZSBtb2RlbCBtYXRyaXggaW4gdGhlIFggYXhpcy5cclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLk1vZGVsVmlld1Byb2plY3Rpb24jbW9kZWxSb3RhdGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIFRoZSBhbW91bnQgdG8gcm90YXRlIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBtb2RlbFJvdGF0ZVg6IGZ1bmN0aW9uIChyYWRpYW5zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBtb2RlbE1hdHJpeCA9IHRoaXMubW9kZWxNYXRyaXg7XHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWRpYW5zKTtcclxuICAgICAgICB2YXIgYyA9IE1hdGguY29zKHJhZGlhbnMpO1xyXG4gICAgICAgIHZhciBhMTAgPSBtb2RlbE1hdHJpeFs0XTtcclxuICAgICAgICB2YXIgYTExID0gbW9kZWxNYXRyaXhbNV07XHJcbiAgICAgICAgdmFyIGExMiA9IG1vZGVsTWF0cml4WzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSBtb2RlbE1hdHJpeFs3XTtcclxuICAgICAgICB2YXIgYTIwID0gbW9kZWxNYXRyaXhbOF07XHJcbiAgICAgICAgdmFyIGEyMSA9IG1vZGVsTWF0cml4WzldO1xyXG4gICAgICAgIHZhciBhMjIgPSBtb2RlbE1hdHJpeFsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IG1vZGVsTWF0cml4WzExXTtcclxuXHJcbiAgICAgICAgbW9kZWxNYXRyaXhbNF0gPSBhMTAgKiBjICsgYTIwICogcztcclxuICAgICAgICBtb2RlbE1hdHJpeFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzZdID0gYTEyICogYyArIGEyMiAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbN10gPSBhMTMgKiBjICsgYTIzICogcztcclxuICAgICAgICBtb2RlbE1hdHJpeFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzldID0gYTIxICogYyAtIGExMSAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWxNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJvdGF0ZXMgdGhlIG1vZGVsIG1hdHJpeCBpbiB0aGUgWSBheGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNtb2RlbFJvdGF0ZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gVGhlIGFtb3VudCB0byByb3RhdGUgYnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNb2RlbCBWaWV3IFByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIG1vZGVsUm90YXRlWTogZnVuY3Rpb24gKHJhZGlhbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1vZGVsTWF0cml4ID0gdGhpcy5tb2RlbE1hdHJpeDtcclxuICAgICAgICB2YXIgcyA9IE1hdGguc2luKHJhZGlhbnMpO1xyXG4gICAgICAgIHZhciBjID0gTWF0aC5jb3MocmFkaWFucyk7XHJcbiAgICAgICAgdmFyIGEwMCA9IG1vZGVsTWF0cml4WzBdO1xyXG4gICAgICAgIHZhciBhMDEgPSBtb2RlbE1hdHJpeFsxXTtcclxuICAgICAgICB2YXIgYTAyID0gbW9kZWxNYXRyaXhbMl07XHJcbiAgICAgICAgdmFyIGEwMyA9IG1vZGVsTWF0cml4WzNdO1xyXG4gICAgICAgIHZhciBhMjAgPSBtb2RlbE1hdHJpeFs4XTtcclxuICAgICAgICB2YXIgYTIxID0gbW9kZWxNYXRyaXhbOV07XHJcbiAgICAgICAgdmFyIGEyMiA9IG1vZGVsTWF0cml4WzEwXTtcclxuICAgICAgICB2YXIgYTIzID0gbW9kZWxNYXRyaXhbMTFdO1xyXG5cclxuICAgICAgICBtb2RlbE1hdHJpeFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcclxuICAgICAgICBtb2RlbE1hdHJpeFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzhdID0gYTAwICogcyArIGEyMCAqIGM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbOV0gPSBhMDEgKiBzICsgYTIxICogYztcclxuICAgICAgICBtb2RlbE1hdHJpeFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcclxuICAgICAgICBtb2RlbE1hdHJpeFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbE1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB0aGUgbW9kZWwgbWF0cml4IGluIHRoZSBaIGF4aXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI21vZGVsUm90YXRlWlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBUaGUgYW1vdW50IHRvIHJvdGF0ZSBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vZGVsIFZpZXcgUHJvamVjdGlvbi5cclxuICAgICAqL1xyXG4gICAgbW9kZWxSb3RhdGVaOiBmdW5jdGlvbiAocmFkaWFucylcclxuICAgIHtcclxuICAgICAgICB2YXIgbW9kZWxNYXRyaXggPSB0aGlzLm1vZGVsTWF0cml4O1xyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkaWFucyk7XHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWRpYW5zKTtcclxuICAgICAgICB2YXIgYTAwID0gbW9kZWxNYXRyaXhbMF07XHJcbiAgICAgICAgdmFyIGEwMSA9IG1vZGVsTWF0cml4WzFdO1xyXG4gICAgICAgIHZhciBhMDIgPSBtb2RlbE1hdHJpeFsyXTtcclxuICAgICAgICB2YXIgYTAzID0gbW9kZWxNYXRyaXhbM107XHJcbiAgICAgICAgdmFyIGExMCA9IG1vZGVsTWF0cml4WzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSBtb2RlbE1hdHJpeFs1XTtcclxuICAgICAgICB2YXIgYTEyID0gbW9kZWxNYXRyaXhbNl07XHJcbiAgICAgICAgdmFyIGExMyA9IG1vZGVsTWF0cml4WzddO1xyXG5cclxuICAgICAgICBtb2RlbE1hdHJpeFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzFdID0gYTAxICogYyArIGExMSAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbMl0gPSBhMDIgKiBjICsgYTEyICogcztcclxuICAgICAgICBtb2RlbE1hdHJpeFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XHJcbiAgICAgICAgbW9kZWxNYXRyaXhbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcclxuICAgICAgICBtb2RlbE1hdHJpeFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xyXG4gICAgICAgIG1vZGVsTWF0cml4WzddID0gYTEzICogYyAtIGEwMyAqIHM7XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWxNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGlkZW50aXR5IG1hdHJpeCBpbnRvIHRoZSB2aWV3IG1hdHJpeFxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiN2aWV3SWRlbnRpdHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB2aWV3SWRlbnRpdHk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZpZXdNYXRyaXggPSB0aGlzLnZpZXdNYXRyaXg7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmlld01hdHJpeFswXSA9IDE7XHJcbiAgICAgICAgdmlld01hdHJpeFsxXSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFsyXSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFszXSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFs0XSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFs1XSA9IDE7XHJcbiAgICAgICAgdmlld01hdHJpeFs2XSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFs3XSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFs4XSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFs5XSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFsxMF0gPSAxO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTFdID0gMDtcclxuICAgICAgICB2aWV3TWF0cml4WzEyXSA9IDA7XHJcbiAgICAgICAgdmlld01hdHJpeFsxM10gPSAwO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTRdID0gMDtcclxuICAgICAgICB2aWV3TWF0cml4WzE1XSA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMudmlld01hdHJpeERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2NhbGVzIHZpZXcgbWF0cml4XHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI3ZpZXdTY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB2aWV3U2NhbGU6IGZ1bmN0aW9uICh4LCB5LCB6KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWV3TWF0cml4ID0gdGhpcy52aWV3TWF0cml4O1xyXG5cclxuICAgICAgICB2aWV3TWF0cml4WzBdID0gdmlld01hdHJpeFswXSAqIHg7XHJcbiAgICAgICAgdmlld01hdHJpeFsxXSA9IHZpZXdNYXRyaXhbMV0gKiB4O1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMl0gPSB2aWV3TWF0cml4WzJdICogeDtcclxuICAgICAgICB2aWV3TWF0cml4WzNdID0gdmlld01hdHJpeFszXSAqIHg7XHJcbiAgICAgICAgdmlld01hdHJpeFs0XSA9IHZpZXdNYXRyaXhbNF0gKiB5O1xyXG4gICAgICAgIHZpZXdNYXRyaXhbNV0gPSB2aWV3TWF0cml4WzVdICogeTtcclxuICAgICAgICB2aWV3TWF0cml4WzZdID0gdmlld01hdHJpeFs2XSAqIHk7XHJcbiAgICAgICAgdmlld01hdHJpeFs3XSA9IHZpZXdNYXRyaXhbN10gKiB5O1xyXG4gICAgICAgIHZpZXdNYXRyaXhbOF0gPSB2aWV3TWF0cml4WzhdICogejtcclxuICAgICAgICB2aWV3TWF0cml4WzldID0gdmlld01hdHJpeFs5XSAqIHo7XHJcbiAgICAgICAgdmlld01hdHJpeFsxMF0gPSB2aWV3TWF0cml4WzEwXSAqIHo7XHJcbiAgICAgICAgdmlld01hdHJpeFsxMV0gPSB2aWV3TWF0cml4WzExXSAqIHo7XHJcbiAgICBcclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zbGF0ZXMgdmlldyBtYXRyaXhcclxuICAgICAqIFxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuUmVuZGVyZXIuV2ViR0wuUGlwZWxpbmVzLk1vZGVsVmlld1Byb2plY3Rpb24jdmlld1RyYW5zbGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB2aWV3VHJhbnNsYXRlOiBmdW5jdGlvbiAoeCwgeSwgeilcclxuICAgIHtcclxuICAgICAgICB2YXIgdmlld01hdHJpeCA9IHRoaXMudmlld01hdHJpeDtcclxuXHJcbiAgICAgICAgdmlld01hdHJpeFsxMl0gPSB2aWV3TWF0cml4WzBdICogeCArIHZpZXdNYXRyaXhbNF0gKiB5ICsgdmlld01hdHJpeFs4XSAqIHogKyB2aWV3TWF0cml4WzEyXTtcclxuICAgICAgICB2aWV3TWF0cml4WzEzXSA9IHZpZXdNYXRyaXhbMV0gKiB4ICsgdmlld01hdHJpeFs1XSAqIHkgKyB2aWV3TWF0cml4WzldICogeiArIHZpZXdNYXRyaXhbMTNdO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTRdID0gdmlld01hdHJpeFsyXSAqIHggKyB2aWV3TWF0cml4WzZdICogeSArIHZpZXdNYXRyaXhbMTBdICogeiArIHZpZXdNYXRyaXhbMTRdO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTVdID0gdmlld01hdHJpeFszXSAqIHggKyB2aWV3TWF0cml4WzddICogeSArIHZpZXdNYXRyaXhbMTFdICogeiArIHZpZXdNYXRyaXhbMTVdO1xyXG5cclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHZpZXcgbWF0cml4IGluIHRoZSBYIGF4aXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI3ZpZXdSb3RhdGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIFRoZSBhbW91bnQgdG8gcm90YXRlIGJ5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB2aWV3Um90YXRlWDogZnVuY3Rpb24gKHJhZGlhbnMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZpZXdNYXRyaXggPSB0aGlzLnZpZXdNYXRyaXg7XHJcbiAgICAgICAgdmFyIHMgPSBNYXRoLnNpbihyYWRpYW5zKTtcclxuICAgICAgICB2YXIgYyA9IE1hdGguY29zKHJhZGlhbnMpO1xyXG4gICAgICAgIHZhciBhMTAgPSB2aWV3TWF0cml4WzRdO1xyXG4gICAgICAgIHZhciBhMTEgPSB2aWV3TWF0cml4WzVdO1xyXG4gICAgICAgIHZhciBhMTIgPSB2aWV3TWF0cml4WzZdO1xyXG4gICAgICAgIHZhciBhMTMgPSB2aWV3TWF0cml4WzddO1xyXG4gICAgICAgIHZhciBhMjAgPSB2aWV3TWF0cml4WzhdO1xyXG4gICAgICAgIHZhciBhMjEgPSB2aWV3TWF0cml4WzldO1xyXG4gICAgICAgIHZhciBhMjIgPSB2aWV3TWF0cml4WzEwXTtcclxuICAgICAgICB2YXIgYTIzID0gdmlld01hdHJpeFsxMV07XHJcblxyXG4gICAgICAgIHZpZXdNYXRyaXhbNF0gPSBhMTAgKiBjICsgYTIwICogcztcclxuICAgICAgICB2aWV3TWF0cml4WzVdID0gYTExICogYyArIGEyMSAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbN10gPSBhMTMgKiBjICsgYTIzICogcztcclxuICAgICAgICB2aWV3TWF0cml4WzhdID0gYTIwICogYyAtIGExMCAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcclxuXHJcbiAgICAgICAgdGhpcy52aWV3TWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB2aWV3IG1hdHJpeCBpbiB0aGUgWSBheGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiN2aWV3Um90YXRlWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBUaGUgYW1vdW50IHRvIHJvdGF0ZSBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vZGVsIFZpZXcgUHJvamVjdGlvbi5cclxuICAgICAqL1xyXG4gICAgdmlld1JvdGF0ZVk6IGZ1bmN0aW9uIChyYWRpYW5zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWV3TWF0cml4ID0gdGhpcy52aWV3TWF0cml4O1xyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkaWFucyk7XHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWRpYW5zKTtcclxuICAgICAgICB2YXIgYTAwID0gdmlld01hdHJpeFswXTtcclxuICAgICAgICB2YXIgYTAxID0gdmlld01hdHJpeFsxXTtcclxuICAgICAgICB2YXIgYTAyID0gdmlld01hdHJpeFsyXTtcclxuICAgICAgICB2YXIgYTAzID0gdmlld01hdHJpeFszXTtcclxuICAgICAgICB2YXIgYTIwID0gdmlld01hdHJpeFs4XTtcclxuICAgICAgICB2YXIgYTIxID0gdmlld01hdHJpeFs5XTtcclxuICAgICAgICB2YXIgYTIyID0gdmlld01hdHJpeFsxMF07XHJcbiAgICAgICAgdmFyIGEyMyA9IHZpZXdNYXRyaXhbMTFdO1xyXG5cclxuICAgICAgICB2aWV3TWF0cml4WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcclxuICAgICAgICB2aWV3TWF0cml4WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbOV0gPSBhMDEgKiBzICsgYTIxICogYztcclxuICAgICAgICB2aWV3TWF0cml4WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XHJcblxyXG4gICAgICAgIHRoaXMudmlld01hdHJpeERpcnR5ID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyB2aWV3IG1hdHJpeCBpbiB0aGUgWiBheGlzLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiN2aWV3Um90YXRlWlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBUaGUgYW1vdW50IHRvIHJvdGF0ZSBieS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vZGVsIFZpZXcgUHJvamVjdGlvbi5cclxuICAgICAqL1xyXG4gICAgdmlld1JvdGF0ZVo6IGZ1bmN0aW9uIChyYWRpYW5zKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB2aWV3TWF0cml4ID0gdGhpcy52aWV3TWF0cml4O1xyXG4gICAgICAgIHZhciBzID0gTWF0aC5zaW4ocmFkaWFucyk7XHJcbiAgICAgICAgdmFyIGMgPSBNYXRoLmNvcyhyYWRpYW5zKTtcclxuICAgICAgICB2YXIgYTAwID0gdmlld01hdHJpeFswXTtcclxuICAgICAgICB2YXIgYTAxID0gdmlld01hdHJpeFsxXTtcclxuICAgICAgICB2YXIgYTAyID0gdmlld01hdHJpeFsyXTtcclxuICAgICAgICB2YXIgYTAzID0gdmlld01hdHJpeFszXTtcclxuICAgICAgICB2YXIgYTEwID0gdmlld01hdHJpeFs0XTtcclxuICAgICAgICB2YXIgYTExID0gdmlld01hdHJpeFs1XTtcclxuICAgICAgICB2YXIgYTEyID0gdmlld01hdHJpeFs2XTtcclxuICAgICAgICB2YXIgYTEzID0gdmlld01hdHJpeFs3XTtcclxuXHJcbiAgICAgICAgdmlld01hdHJpeFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbMV0gPSBhMDEgKiBjICsgYTExICogcztcclxuICAgICAgICB2aWV3TWF0cml4WzJdID0gYTAyICogYyArIGExMiAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbNF0gPSBhMTAgKiBjIC0gYTAwICogcztcclxuICAgICAgICB2aWV3TWF0cml4WzVdID0gYTExICogYyAtIGEwMSAqIHM7XHJcbiAgICAgICAgdmlld01hdHJpeFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xyXG4gICAgICAgIHZpZXdNYXRyaXhbN10gPSBhMTMgKiBjIC0gYTAzICogcztcclxuXHJcbiAgICAgICAgdGhpcy52aWV3TWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIDJEIHZpZXcgbWF0cml4ICgzeDIgbWF0cml4KSBpbnRvIGEgNHg0IHZpZXcgbWF0cml4IFxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiN2aWV3TG9hZDJEXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gbWF0cml4MkQgLSBUaGUgTWF0cml4MkQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNb2RlbCBWaWV3IFByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHZpZXdMb2FkMkQ6IGZ1bmN0aW9uIChtYXRyaXgyRClcclxuICAgIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzLnZpZXdNYXRyaXg7XHJcblxyXG4gICAgICAgIHZtWzBdID0gbWF0cml4MkRbMF07XHJcbiAgICAgICAgdm1bMV0gPSBtYXRyaXgyRFsxXTtcclxuICAgICAgICB2bVsyXSA9IDAuMDtcclxuICAgICAgICB2bVszXSA9IDAuMDtcclxuICAgICAgICB2bVs0XSA9IG1hdHJpeDJEWzJdO1xyXG4gICAgICAgIHZtWzVdID0gbWF0cml4MkRbM107XHJcbiAgICAgICAgdm1bNl0gPSAwLjA7XHJcbiAgICAgICAgdm1bN10gPSAwLjA7XHJcbiAgICAgICAgdm1bOF0gPSBtYXRyaXgyRFs0XTtcclxuICAgICAgICB2bVs5XSA9IG1hdHJpeDJEWzVdO1xyXG4gICAgICAgIHZtWzEwXSA9IDEuMDtcclxuICAgICAgICB2bVsxMV0gPSAwLjA7XHJcbiAgICAgICAgdm1bMTJdID0gMC4wO1xyXG4gICAgICAgIHZtWzEzXSA9IDAuMDtcclxuICAgICAgICB2bVsxNF0gPSAwLjA7XHJcbiAgICAgICAgdm1bMTVdID0gMS4wO1xyXG5cclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgYSA0eDQgbWF0cml4IGludG8gdGhlIHZpZXcgbWF0cml4XHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI3ZpZXdMb2FkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gbWF0cml4IC0gVGhlIE1hdHJpeDJELlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB2aWV3TG9hZDogZnVuY3Rpb24gKG1hdHJpeClcclxuICAgIHtcclxuICAgICAgICB2YXIgdm0gPSB0aGlzLnZpZXdNYXRyaXg7XHJcblxyXG4gICAgICAgIHZtWzBdID0gbWF0cml4WzBdO1xyXG4gICAgICAgIHZtWzFdID0gbWF0cml4WzFdO1xyXG4gICAgICAgIHZtWzJdID0gbWF0cml4WzJdO1xyXG4gICAgICAgIHZtWzNdID0gbWF0cml4WzNdO1xyXG4gICAgICAgIHZtWzRdID0gbWF0cml4WzRdO1xyXG4gICAgICAgIHZtWzVdID0gbWF0cml4WzVdO1xyXG4gICAgICAgIHZtWzZdID0gbWF0cml4WzZdO1xyXG4gICAgICAgIHZtWzddID0gbWF0cml4WzddO1xyXG4gICAgICAgIHZtWzhdID0gbWF0cml4WzhdO1xyXG4gICAgICAgIHZtWzldID0gbWF0cml4WzldO1xyXG4gICAgICAgIHZtWzEwXSA9IG1hdHJpeFsxMF07XHJcbiAgICAgICAgdm1bMTFdID0gbWF0cml4WzExXTtcclxuICAgICAgICB2bVsxMl0gPSBtYXRyaXhbMTJdO1xyXG4gICAgICAgIHZtWzEzXSA9IG1hdHJpeFsxM107XHJcbiAgICAgICAgdm1bMTRdID0gbWF0cml4WzE0XTtcclxuICAgICAgICB2bVsxNV0gPSBtYXRyaXhbMTVdO1xyXG5cclxuICAgICAgICB0aGlzLnZpZXdNYXRyaXhEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBpZGVudGl0eSBtYXRyaXggaW50byB0aGUgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lcy5Nb2RlbFZpZXdQcm9qZWN0aW9uI3Byb2pJZGVudGl0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBNb2RlbCBWaWV3IFByb2plY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHByb2pJZGVudGl0eTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMucHJvamVjdGlvbk1hdHJpeDtcclxuICAgICAgICBcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzBdID0gMTtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzFdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzJdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzNdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzRdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzVdID0gMTtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzZdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzddID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzhdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzldID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzEwXSA9IDE7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxMV0gPSAwO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTJdID0gMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzEzXSA9IDA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxNF0gPSAwO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTVdID0gMTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4RGlydHkgPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIGFuIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeFxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNwcm9qT3J0aG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBUaGUgcmlnaHQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIC0gVGhlIGJvdHRvbSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUaGUgdG9wIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBUaGUgbmVhciB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgLSBUaGUgZmFyIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgTW9kZWwgVmlldyBQcm9qZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcm9qT3J0aG86IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcilcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMucHJvamVjdGlvbk1hdHJpeDtcclxuICAgICAgICB2YXIgbGVmdFJpZ2h0ID0gMS4wIC8gKGxlZnQgLSByaWdodCk7XHJcbiAgICAgICAgdmFyIGJvdHRvbVRvcCA9IDEuMCAvIChib3R0b20gLSB0b3ApO1xyXG4gICAgICAgIHZhciBuZWFyRmFyID0gMS4wIC8gKG5lYXIgLSBmYXIpO1xyXG5cclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzBdID0gLTIuMCAqIGxlZnRSaWdodDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzFdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMl0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFszXSA9IDAuMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzRdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbNV0gPSAtMi4wICogYm90dG9tVG9wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbNl0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFs3XSA9IDAuMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzhdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbOV0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxMF0gPSAyLjAgKiBuZWFyRmFyO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTFdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTJdID0gKGxlZnQgKyByaWdodCkgKiBsZWZ0UmlnaHQ7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJvdHRvbVRvcDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5lYXJGYXI7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxNV0gPSAxLjA7XHJcblxyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdXAgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeFxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5SZW5kZXJlci5XZWJHTC5QaXBlbGluZXMuTW9kZWxWaWV3UHJvamVjdGlvbiNwcm9qUGVyc3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmb3ZZIC0gVGhlIGZvdiB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3RSYXRpbyAtIFRoZSBhc3BlY3RSYXRpbyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIC0gVGhlIG5lYXIgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZmFyIC0gVGhlIGZhciB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIE1vZGVsIFZpZXcgUHJvamVjdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJvalBlcnNwOiBmdW5jdGlvbiAoZm92WSwgYXNwZWN0UmF0aW8sIG5lYXIsIGZhcilcclxuICAgIHtcclxuICAgICAgICB2YXIgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMucHJvamVjdGlvbk1hdHJpeDtcclxuICAgICAgICB2YXIgZm92ID0gMS4wIC8gTWF0aC50YW4oZm92WSAvIDIuMCk7XHJcbiAgICAgICAgdmFyIG5lYXJGYXIgPSAxLjAgLyAobmVhciAtIGZhcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFswXSA9IGZvdiAvIGFzcGVjdFJhdGlvO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMV0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsyXSA9IDAuMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzNdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbNF0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFs1XSA9IGZvdjtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzZdID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbN10gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFs4XSA9IDAuMDtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzldID0gMC4wO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTBdID0gKGZhciArIG5lYXIpICogbmVhckZhcjtcclxuICAgICAgICBwcm9qZWN0aW9uTWF0cml4WzExXSA9IC0xLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxMl0gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxM10gPSAwLjA7XHJcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeFsxNF0gPSAoMi4wICogZmFyICogbmVhcikgKiBuZWFyRmFyO1xyXG4gICAgICAgIHByb2plY3Rpb25NYXRyaXhbMTVdID0gMC4wO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeERpcnR5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsVmlld1Byb2plY3Rpb247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlJlbmRlcmVyLldlYkdMLlBpcGVsaW5lc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEJpdG1hcE1hc2tQaXBlbGluZTogcmVxdWlyZSgnLi9CaXRtYXBNYXNrUGlwZWxpbmUnKSxcclxuICAgIEZvcndhcmREaWZmdXNlTGlnaHRQaXBlbGluZTogcmVxdWlyZSgnLi9Gb3J3YXJkRGlmZnVzZUxpZ2h0UGlwZWxpbmUnKSxcclxuICAgIFRleHR1cmVUaW50UGlwZWxpbmU6IHJlcXVpcmUoJy4vVGV4dHVyZVRpbnRQaXBlbGluZScpLFxyXG4gICAgVGV4dHVyZVRpbnRTdHJpcFBpcGVsaW5lOiByZXF1aXJlKCcuL1RleHR1cmVUaW50U3RyaXBQaXBlbGluZScpLFxyXG4gICAgTW9kZWxWaWV3UHJvamVjdGlvbjogcmVxdWlyZSgnLi9jb21wb25lbnRzL01vZGVsVmlld1Byb2plY3Rpb24nKVxyXG5cclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbXG4gICAgJyNkZWZpbmUgU0hBREVSX05BTUUgUEhBU0VSX0JJVE1BUF9NQVNLX0ZTJyxcbiAgICAnJyxcbiAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyxcbiAgICAnJyxcbiAgICAndW5pZm9ybSB2ZWMyIHVSZXNvbHV0aW9uOycsXG4gICAgJ3VuaWZvcm0gc2FtcGxlcjJEIHVNYWluU2FtcGxlcjsnLFxuICAgICd1bmlmb3JtIHNhbXBsZXIyRCB1TWFza1NhbXBsZXI7JyxcbiAgICAndW5pZm9ybSBib29sIHVJbnZlcnRNYXNrQWxwaGE7JyxcbiAgICAnJyxcbiAgICAndm9pZCBtYWluKCknLFxuICAgICd7JyxcbiAgICAnICAgIHZlYzIgdXYgPSBnbF9GcmFnQ29vcmQueHkgLyB1UmVzb2x1dGlvbjsnLFxuICAgICcgICAgdmVjNCBtYWluQ29sb3IgPSB0ZXh0dXJlMkQodU1haW5TYW1wbGVyLCB1dik7JyxcbiAgICAnICAgIHZlYzQgbWFza0NvbG9yID0gdGV4dHVyZTJEKHVNYXNrU2FtcGxlciwgdXYpOycsXG4gICAgJyAgICBmbG9hdCBhbHBoYSA9IG1haW5Db2xvci5hOycsXG4gICAgJycsXG4gICAgJyAgICBpZiAoIXVJbnZlcnRNYXNrQWxwaGEpJyxcbiAgICAnICAgIHsnLFxuICAgICcgICAgICAgIGFscGhhICo9IChtYXNrQ29sb3IuYSk7JyxcbiAgICAnICAgIH0nLFxuICAgICcgICAgZWxzZScsXG4gICAgJyAgICB7JyxcbiAgICAnICAgICAgICBhbHBoYSAqPSAoMS4wIC0gbWFza0NvbG9yLmEpOycsXG4gICAgJyAgICB9JyxcbiAgICAnJyxcbiAgICAnICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobWFpbkNvbG9yLnJnYiAqIGFscGhhLCBhbHBoYSk7JyxcbiAgICAnfScsXG4gICAgJydcbl0uam9pbignXFxuJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtcbiAgICAnI2RlZmluZSBTSEFERVJfTkFNRSBQSEFTRVJfQklUTUFQX01BU0tfVlMnLFxuICAgICcnLFxuICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLFxuICAgICcnLFxuICAgICdhdHRyaWJ1dGUgdmVjMiBpblBvc2l0aW9uOycsXG4gICAgJycsXG4gICAgJ3ZvaWQgbWFpbigpJyxcbiAgICAneycsXG4gICAgJyAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoaW5Qb3NpdGlvbiwgMC4wLCAxLjApOycsXG4gICAgJ30nLFxuICAgICcnXG5dLmpvaW4oJ1xcbicpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBbXHJcbiAgICAnI2RlZmluZSBTSEFERVJfTkFNRSBQSEFTRVJfRk9SV0FSRF9ESUZGVVNFX0ZTJyxcclxuICAgICcnLFxyXG4gICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycsXHJcbiAgICAnJyxcclxuICAgICdzdHJ1Y3QgTGlnaHQnLFxyXG4gICAgJ3snLFxyXG4gICAgJyAgICB2ZWMyIHBvc2l0aW9uOycsXHJcbiAgICAnICAgIHZlYzMgY29sb3I7JyxcclxuICAgICcgICAgZmxvYXQgaW50ZW5zaXR5OycsXHJcbiAgICAnICAgIGZsb2F0IHJhZGl1czsnLFxyXG4gICAgJ307JyxcclxuICAgICcnLFxyXG4gICAgJ2NvbnN0IGludCBrTWF4TGlnaHRzID0gJUxJR0hUX0NPVU5UJTsnLFxyXG4gICAgJycsXHJcbiAgICAndW5pZm9ybSB2ZWM0IHVDYW1lcmE7IC8qIHgsIHksIHJvdGF0aW9uLCB6b29tICovJyxcclxuICAgICd1bmlmb3JtIHZlYzIgdVJlc29sdXRpb247JyxcclxuICAgICd1bmlmb3JtIHNhbXBsZXIyRCB1TWFpblNhbXBsZXI7JyxcclxuICAgICd1bmlmb3JtIHNhbXBsZXIyRCB1Tm9ybVNhbXBsZXI7JyxcclxuICAgICd1bmlmb3JtIHZlYzMgdUFtYmllbnRMaWdodENvbG9yOycsXHJcbiAgICAndW5pZm9ybSBMaWdodCB1TGlnaHRzW2tNYXhMaWdodHNdOycsXHJcbiAgICAndW5pZm9ybSBtYXQzIHVJbnZlcnNlUm90YXRpb25NYXRyaXg7JyxcclxuICAgICcnLFxyXG4gICAgJ3ZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZDsnLFxyXG4gICAgJ3ZhcnlpbmcgdmVjNCBvdXRUaW50OycsXHJcbiAgICAnJyxcclxuICAgICd2b2lkIG1haW4oKScsXHJcbiAgICAneycsXHJcbiAgICAnICAgIHZlYzMgZmluYWxDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7JyxcclxuICAgICcgICAgdmVjNCBjb2xvciA9IHRleHR1cmUyRCh1TWFpblNhbXBsZXIsIG91dFRleENvb3JkKSAqIHZlYzQob3V0VGludC5yZ2IgKiBvdXRUaW50LmEsIG91dFRpbnQuYSk7JyxcclxuICAgICcgICAgdmVjMyBub3JtYWxNYXAgPSB0ZXh0dXJlMkQodU5vcm1TYW1wbGVyLCBvdXRUZXhDb29yZCkucmdiOycsXHJcbiAgICAnICAgIHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHVJbnZlcnNlUm90YXRpb25NYXRyaXggKiB2ZWMzKG5vcm1hbE1hcCAqIDIuMCAtIDEuMCkpOycsXHJcbiAgICAnICAgIHZlYzIgcmVzID0gdmVjMihtaW4odVJlc29sdXRpb24ueCwgdVJlc29sdXRpb24ueSkpICogdUNhbWVyYS53OycsXHJcbiAgICAnJyxcclxuICAgICcgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGtNYXhMaWdodHM7ICsraW5kZXgpJyxcclxuICAgICcgICAgeycsXHJcbiAgICAnICAgICAgICBMaWdodCBsaWdodCA9IHVMaWdodHNbaW5kZXhdOycsXHJcbiAgICAnICAgICAgICB2ZWMzIGxpZ2h0RGlyID0gdmVjMygobGlnaHQucG9zaXRpb24ueHkgLyByZXMpIC0gKGdsX0ZyYWdDb29yZC54eSAvIHJlcyksIDAuMSk7JyxcclxuICAgICcgICAgICAgIHZlYzMgbGlnaHROb3JtYWwgPSBub3JtYWxpemUobGlnaHREaXIpOycsXHJcbiAgICAnICAgICAgICBmbG9hdCBkaXN0VG9TdXJmID0gbGVuZ3RoKGxpZ2h0RGlyKSAqIHVDYW1lcmEudzsnLFxyXG4gICAgJyAgICAgICAgZmxvYXQgZGlmZnVzZUZhY3RvciA9IG1heChkb3Qobm9ybWFsLCBsaWdodE5vcm1hbCksIDAuMCk7JyxcclxuICAgICcgICAgICAgIGZsb2F0IHJhZGl1cyA9IChsaWdodC5yYWRpdXMgLyByZXMueCAqIHVDYW1lcmEudykgKiB1Q2FtZXJhLnc7JyxcclxuICAgICcgICAgICAgIGZsb2F0IGF0dGVudWF0aW9uID0gY2xhbXAoMS4wIC0gZGlzdFRvU3VyZiAqIGRpc3RUb1N1cmYgLyAocmFkaXVzICogcmFkaXVzKSwgMC4wLCAxLjApOycsXHJcbiAgICAnICAgICAgICB2ZWMzIGRpZmZ1c2UgPSBsaWdodC5jb2xvciAqIGRpZmZ1c2VGYWN0b3I7JyxcclxuICAgICcgICAgICAgIGZpbmFsQ29sb3IgKz0gKGF0dGVudWF0aW9uICogZGlmZnVzZSkgKiBsaWdodC5pbnRlbnNpdHk7JyxcclxuICAgICcgICAgfScsXHJcbiAgICAnJyxcclxuICAgICcgICAgdmVjNCBjb2xvck91dHB1dCA9IHZlYzQodUFtYmllbnRMaWdodENvbG9yICsgZmluYWxDb2xvciwgMS4wKTsnLFxyXG4gICAgJyAgICBnbF9GcmFnQ29sb3IgPSBjb2xvciAqIHZlYzQoY29sb3JPdXRwdXQucmdiICogY29sb3JPdXRwdXQuYSwgY29sb3JPdXRwdXQuYSk7JyxcclxuICAgICcnLFxyXG4gICAgJ30nLFxyXG4gICAgJydcclxuXS5qb2luKCdcXG4nKTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBbXG4gICAgJyNkZWZpbmUgU0hBREVSX05BTUUgUEhBU0VSX1RFWFRVUkVfVElOVF9GUycsXG4gICAgJycsXG4gICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycsXG4gICAgJycsXG4gICAgJ3VuaWZvcm0gc2FtcGxlcjJEIHVNYWluU2FtcGxlcjsnLFxuICAgICcnLFxuICAgICd2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmQ7JyxcbiAgICAndmFyeWluZyBmbG9hdCBvdXRUaW50RWZmZWN0OycsXG4gICAgJ3ZhcnlpbmcgdmVjNCBvdXRUaW50OycsXG4gICAgJycsXG4gICAgJ3ZvaWQgbWFpbigpJyxcbiAgICAneycsXG4gICAgJyAgICB2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQodU1haW5TYW1wbGVyLCBvdXRUZXhDb29yZCk7JyxcbiAgICAnICAgIHZlYzQgdGV4ZWwgPSB2ZWM0KG91dFRpbnQucmdiICogb3V0VGludC5hLCBvdXRUaW50LmEpOycsXG4gICAgJyAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTsnLFxuICAgICcnLFxuICAgICcgICAgaWYgKG91dFRpbnRFZmZlY3QgPT0gMC4wKScsXG4gICAgJyAgICB7JyxcbiAgICAnICAgICAgICAvLyAgTXVsdGlwbHkgdGV4dHVyZSB0aW50JyxcbiAgICAnICAgICAgICBjb2xvciA9IHRleHR1cmUgKiB0ZXhlbDsnLFxuICAgICcgICAgfScsXG4gICAgJyAgICBlbHNlIGlmIChvdXRUaW50RWZmZWN0ID09IDEuMCknLFxuICAgICcgICAgeycsXG4gICAgJyAgICAgICAgLy8gIFNvbGlkIGNvbG9yICsgdGV4dHVyZSBhbHBoYScsXG4gICAgJyAgICAgICAgY29sb3IucmdiID0gbWl4KHRleHR1cmUucmdiLCBvdXRUaW50LnJnYiAqIG91dFRpbnQuYSwgdGV4dHVyZS5hKTsnLFxuICAgICcgICAgICAgIGNvbG9yLmEgPSB0ZXh0dXJlLmEgKiB0ZXhlbC5hOycsXG4gICAgJyAgICB9JyxcbiAgICAnICAgIGVsc2UgaWYgKG91dFRpbnRFZmZlY3QgPT0gMi4wKScsXG4gICAgJyAgICB7JyxcbiAgICAnICAgICAgICAvLyAgU29saWQgY29sb3IsIG5vIHRleHR1cmUnLFxuICAgICcgICAgICAgIGNvbG9yID0gdGV4ZWw7JyxcbiAgICAnICAgIH0nLFxuICAgICcnLFxuICAgICcgICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7JyxcbiAgICAnfScsXG4gICAgJydcbl0uam9pbignXFxuJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFtcbiAgICAnI2RlZmluZSBTSEFERVJfTkFNRSBQSEFTRVJfVEVYVFVSRV9USU5UX1ZTJyxcbiAgICAnJyxcbiAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyxcbiAgICAnJyxcbiAgICAndW5pZm9ybSBtYXQ0IHVQcm9qZWN0aW9uTWF0cml4OycsXG4gICAgJ3VuaWZvcm0gbWF0NCB1Vmlld01hdHJpeDsnLFxuICAgICd1bmlmb3JtIG1hdDQgdU1vZGVsTWF0cml4OycsXG4gICAgJycsXG4gICAgJ2F0dHJpYnV0ZSB2ZWMyIGluUG9zaXRpb247JyxcbiAgICAnYXR0cmlidXRlIHZlYzIgaW5UZXhDb29yZDsnLFxuICAgICdhdHRyaWJ1dGUgZmxvYXQgaW5UaW50RWZmZWN0OycsXG4gICAgJ2F0dHJpYnV0ZSB2ZWM0IGluVGludDsnLFxuICAgICcnLFxuICAgICd2YXJ5aW5nIHZlYzIgb3V0VGV4Q29vcmQ7JyxcbiAgICAndmFyeWluZyBmbG9hdCBvdXRUaW50RWZmZWN0OycsXG4gICAgJ3ZhcnlpbmcgdmVjNCBvdXRUaW50OycsXG4gICAgJycsXG4gICAgJ3ZvaWQgbWFpbiAoKScsXG4gICAgJ3snLFxuICAgICcgICAgZ2xfUG9zaXRpb24gPSB1UHJvamVjdGlvbk1hdHJpeCAqIHVWaWV3TWF0cml4ICogdU1vZGVsTWF0cml4ICogdmVjNChpblBvc2l0aW9uLCAxLjAsIDEuMCk7JyxcbiAgICAnJyxcbiAgICAnICAgIG91dFRleENvb3JkID0gaW5UZXhDb29yZDsnLFxuICAgICcgICAgb3V0VGludCA9IGluVGludDsnLFxuICAgICcgICAgb3V0VGludEVmZmVjdCA9IGluVGludEVmZmVjdDsnLFxuICAgICd9JyxcbiAgICAnJyxcbiAgICAnJ1xuXS5qb2luKCdcXG4nKTtcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgR2V0SW5uZXJIZWlnaHQgPSByZXF1aXJlKCcuLi9kb20vR2V0SW5uZXJIZWlnaHQnKTtcclxudmFyIEdldFRhcmdldCA9IHJlcXVpcmUoJy4uL2RvbS9HZXRUYXJnZXQnKTtcclxudmFyIEdldFNjcmVlbk9yaWVudGF0aW9uID0gcmVxdWlyZSgnLi4vZG9tL0dldFNjcmVlbk9yaWVudGF0aW9uJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgUmVjdGFuZ2xlID0gcmVxdWlyZSgnLi4vZ2VvbS9yZWN0YW5nbGUvUmVjdGFuZ2xlJyk7XHJcbnZhciBTaXplID0gcmVxdWlyZSgnLi4vc3RydWN0cy9TaXplJyk7XHJcbnZhciBTbmFwRmxvb3IgPSByZXF1aXJlKCcuLi9tYXRoL3NuYXAvU25hcEZsb29yJyk7XHJcbnZhciBWZWN0b3IyID0gcmVxdWlyZSgnLi4vbWF0aC9WZWN0b3IyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgU2NhbGUgTWFuYWdlciBoYW5kbGVzIHRoZSBzY2FsaW5nLCByZXNpemluZyBhbmQgYWxpZ25tZW50IG9mIHRoZSBnYW1lIGNhbnZhcy5cclxuICogXHJcbiAqIFRoZSB3YXkgc2NhbGluZyBpcyBoYW5kbGVkIGlzIGJ5IHNldHRpbmcgdGhlIGdhbWUgY2FudmFzIHRvIGEgZml4ZWQgc2l6ZSwgd2hpY2ggaXMgZGVmaW5lZCBpbiB0aGVcclxuICogZ2FtZSBjb25maWd1cmF0aW9uLiBZb3UgYWxzbyBkZWZpbmUgdGhlIHBhcmVudCBjb250YWluZXIgaW4gdGhlIGdhbWUgY29uZmlnLiBJZiBubyBwYXJlbnQgaXMgZ2l2ZW4sXHJcbiAqIGl0IHdpbGwgZGVmYXVsdCB0byB1c2luZyB0aGUgZG9jdW1lbnQgYm9keS4gVGhlIFNjYWxlIE1hbmFnZXIgd2lsbCB0aGVuIGxvb2sgYXQgdGhlIGF2YWlsYWJsZSBzcGFjZVxyXG4gKiB3aXRoaW4gdGhlIF9wYXJlbnRfIGFuZCBzY2FsZSB0aGUgY2FudmFzIGFjY29yZGluZ2x5LiBTY2FsaW5nIGlzIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUgY2FudmFzIENTU1xyXG4gKiB3aWR0aCBhbmQgaGVpZ2h0IHByb3BlcnRpZXMsIGxlYXZpbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGl0c2VsZiB1bnRvdWNoZWQuXHJcbiAqIFNjYWxpbmcgaXMgdGhlcmVmb3JlIGFjaGlldmVkIGJ5IGtlZXBpbmcgdGhlIGNvcmUgY2FudmFzIHRoZSBzYW1lIHNpemUgYW5kICdzdHJldGNoaW5nJ1xyXG4gKiBpdCB2aWEgaXRzIENTUyBwcm9wZXJ0aWVzLiBUaGlzIGdpdmVzIHRoZSBzYW1lIHJlc3VsdCBhbmQgc3BlZWQgYXMgdXNpbmcgdGhlIGB0cmFuc2Zvcm0tc2NhbGVgIENTU1xyXG4gKiBwcm9wZXJ0eSwgd2l0aG91dCB0aGUgbmVlZCBmb3IgYnJvd3NlciBwcmVmaXggaGFuZGxpbmcuXHJcbiAqIFxyXG4gKiBUaGUgY2FsY3VsYXRpb25zIGZvciB0aGUgc2NhbGUgYXJlIGhlYXZpbHkgaW5mbHVlbmNlZCBieSB0aGUgYm91bmRpbmcgcGFyZW50IHNpemUsIHdoaWNoIGlzIHRoZSBjb21wdXRlZFxyXG4gKiBkaW1lbnNpb25zIG9mIHRoZSBjYW52YXMncyBwYXJlbnQuIFRoZSBDU1MgcnVsZXMgb2YgdGhlIHBhcmVudCBlbGVtZW50IHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgaW4gdGhlXHJcbiAqIG9wZXJhdGlvbiBvZiB0aGUgU2NhbGUgTWFuYWdlci4gRm9yIGV4YW1wbGUsIGlmIHRoZSBwYXJlbnQgaGFzIG5vIGRlZmluZWQgd2lkdGggb3IgaGVpZ2h0LCB0aGVuIGFjdGlvbnNcclxuICogbGlrZSBhdXRvLWNlbnRlcmluZyB3aWxsIGZhaWwgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgcmVzdWx0LiBUaGUgU2NhbGUgTWFuYWdlciB3b3JrcyBpbiB0YW5kZW0gd2l0aCB0aGVcclxuICogQ1NTIHlvdSBzZXQtdXAgb24gdGhlIHBhZ2UgaG9zdGluZyB5b3VyIGdhbWUsIHJhdGhlciB0aGFuIHRha2luZyBjb250cm9sIG9mIGl0LlxyXG4gKiBcclxuICogIyMjIyBQYXJlbnQgYW5kIERpc3BsYXkgY2FudmFzIGNvbnRhaW5tZW50IGd1aWRlbGluZXM6XHJcbiAqXHJcbiAqIC0gU3R5bGUgdGhlIFBhcmVudCBlbGVtZW50IChvZiB0aGUgZ2FtZSBjYW52YXMpIHRvIGNvbnRyb2wgdGhlIFBhcmVudCBzaXplIGFuZCB0aHVzIHRoZSBnYW1lcyBzaXplIGFuZCBsYXlvdXQuXHJcbiAqXHJcbiAqIC0gVGhlIFBhcmVudCBlbGVtZW50J3MgQ1NTIHN0eWxlcyBzaG91bGQgX2VmZmVjdGl2ZWx5XyBhcHBseSBtYXhpbXVtIChhbmQgbWluaW11bSkgYm91bmRpbmcgYmVoYXZpb3IuXHJcbiAqXHJcbiAqIC0gVGhlIFBhcmVudCBlbGVtZW50IHNob3VsZCBfbm90XyBhcHBseSBhIHBhZGRpbmcgYXMgdGhpcyBpcyBub3QgYWNjb3VudGVkIGZvci5cclxuICogICBJZiBhIHBhZGRpbmcgaXMgcmVxdWlyZWQgYXBwbHkgaXQgdG8gdGhlIFBhcmVudCdzIHBhcmVudCBvciBhcHBseSBhIG1hcmdpbiB0byB0aGUgUGFyZW50LlxyXG4gKiAgIElmIHlvdSBuZWVkIHRvIGFkZCBhIGJvcmRlciwgbWFyZ2luIG9yIGFueSBvdGhlciBDU1MgYXJvdW5kIHlvdXIgZ2FtZSBjb250YWluZXIsIHRoZW4gdXNlIGEgcGFyZW50IGVsZW1lbnQgYW5kXHJcbiAqICAgYXBwbHkgdGhlIENTUyB0byB0aGlzIGluc3RlYWQsIG90aGVyd2lzZSB5b3UnbGwgYmUgY29uc3RhbnRseSByZXNpemluZyB0aGUgc2hhcGUgb2YgdGhlIGdhbWUgY29udGFpbmVyLlxyXG4gKlxyXG4gKiAtIFRoZSBEaXNwbGF5IGNhbnZhcyBsYXlvdXQgQ1NTIHN0eWxlcyAoaS5lLiBtYXJnaW5zLCBzaXplKSBzaG91bGQgbm90IGJlIGFsdGVyZWQgLyBzcGVjaWZpZWQgYXNcclxuICogICB0aGV5IG1heSBiZSB1cGRhdGVkIGJ5IHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gKlxyXG4gKiAjIyMjIFNjYWxlIE1vZGVzXHJcbiAqIFxyXG4gKiBUaGUgd2F5IHRoZSBzY2FsaW5nIGlzIGhhbmRsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYHNjYWxlTW9kZWAgcHJvcGVydHkuIFRoZSBkZWZhdWx0IGlzIGBOT05FYCxcclxuICogd2hpY2ggcHJldmVudHMgUGhhc2VyIGZyb20gc2NhbGluZyBvciB0b3VjaGluZyB0aGUgY2FudmFzLCBvciBpdHMgcGFyZW50LCBhdCBhbGwuIEluIHRoaXMgbW9kZSwgeW91IGFyZVxyXG4gKiByZXNwb25zaWJsZSBmb3IgYWxsIHNjYWxpbmcuIFRoZSBvdGhlciBzY2FsaW5nIG1vZGVzIGFmZm9yZCB5b3UgYXV0b21hdGljIHNjYWxpbmcuXHJcbiAqIFxyXG4gKiBJZiB5b3Ugd2lzaCB0byBzY2FsZSB5b3VyIGdhbWUgc28gdGhhdCBpdCBhbHdheXMgZml0cyBpbnRvIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2l0aGluIHRoZSBwYXJlbnQsIHlvdVxyXG4gKiBzaG91bGQgdXNlIHRoZSBzY2FsZSBtb2RlIGBGSVRgLiBMb29rIGF0IHRoZSBkb2N1bWVudGF0aW9uIGZvciBvdGhlciBzY2FsZSBtb2RlcyB0byBzZWUgd2hhdCBvcHRpb25zIGFyZVxyXG4gKiBhdmFpbGFibGUuIEhlcmUgaXMgYSBiYXNpYyBjb25maWcgc2hvd2luZyBob3cgdG8gc2V0IHRoaXMgc2NhbGUgbW9kZTpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogc2NhbGU6IHtcclxuICogICAgIHBhcmVudDogJ3lvdXJnYW1lZGl2JyxcclxuICogICAgIG1vZGU6IFBoYXNlci5TY2FsZS5GSVQsXHJcbiAqICAgICB3aWR0aDogODAwLFxyXG4gKiAgICAgaGVpZ2h0OiA2MDBcclxuICogfVxyXG4gKiBgYGBcclxuICogXHJcbiAqIFBsYWNlIHRoZSBgc2NhbGVgIGNvbmZpZyBvYmplY3Qgd2l0aGluIHlvdXIgZ2FtZSBjb25maWcuXHJcbiAqIFxyXG4gKiBJZiB5b3Ugd2lzaCBmb3IgdGhlIGNhbnZhcyB0byBiZSByZXNpemVkIGRpcmVjdGx5LCBzbyB0aGF0IHRoZSBjYW52YXMgaXRzZWxmIGZpbGxzIHRoZSBhdmFpbGFibGUgc3BhY2VcclxuICogKGkuZS4gaXQgaXNuJ3Qgc2NhbGVkLCBpdCdzIHJlc2l6ZWQpIHRoZW4gdXNlIHRoZSBgUkVTSVpFYCBzY2FsZSBtb2RlLiBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSAxOjEgbWFwcGluZ1xyXG4gKiBvZiBjYW52YXMgcGl4ZWxzIHRvIGdhbWUgc2l6ZS4gSW4gdGhpcyBtb2RlIENTUyBpc24ndCB1c2VkIHRvIHNjYWxlIHRoZSBjYW52YXMsIGl0J3MgbGl0ZXJhbGx5IGFkanVzdGVkXHJcbiAqIHRvIGZpbGwgYWxsIGF2YWlsYWJsZSBzcGFjZSB3aXRoaW4gdGhlIHBhcmVudC4gWW91IHNob3VsZCBiZSBleHRyZW1lbHkgY2FyZWZ1bCBhYm91dCB0aGUgc2l6ZSBvZiB0aGVcclxuICogY2FudmFzIHlvdSdyZSBjcmVhdGluZyB3aGVuIGRvaW5nIHRoaXMsIGFzIHRoZSBsYXJnZXIgdGhlIGFyZWEsIHRoZSBtb3JlIHdvcmsgdGhlIEdQVSBoYXMgdG8gZG8gYW5kIGl0J3NcclxuICogdmVyeSBlYXN5IHRvIGhpdCBmaWxsLXJhdGUgbGltaXRzIHF1aWNrbHkuXHJcbiAqIFxyXG4gKiBGb3IgY29tcGxleCwgY3VzdG9tLXNjYWxpbmcgcmVxdWlyZW1lbnRzLCB5b3Ugc2hvdWxkIHByb2JhYmx5IGNvbnNpZGVyIHVzaW5nIHRoZSBgUkVTSVpFYCBzY2FsZSBtb2RlLFxyXG4gKiB3aXRoIHlvdXIgb3duIGxpbWl0YXRpb25zIGluIHBsYWNlIHJlOiBjYW52YXMgZGltZW5zaW9ucyBhbmQgbWFuYWdpbmcgdGhlIHNjYWxpbmcgd2l0aCB0aGUgZ2FtZSBzY2VuZXNcclxuICogeW91cnNlbGYuIEZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBnYW1lcywgaG93ZXZlciwgdGhlIGBGSVRgIG1vZGUgaXMgbGlrZWx5IHRvIGJlIHRoZSBtb3N0IHVzZWQuXHJcbiAqIFxyXG4gKiBQbGVhc2UgYXBwcmVjaWF0ZSB0aGF0IHRoZSBTY2FsZSBNYW5hZ2VyIGNhbm5vdCBwZXJmb3JtIG1pcmFjbGVzLiBBbGwgaXQgZG9lcyBpcyBzY2FsZSB5b3VyIGdhbWUgY2FudmFzXHJcbiAqIGFzIGJlc3QgaXQgY2FuLCBiYXNlZCBvbiB3aGF0IGl0IGNhbiBpbmZlciBmcm9tIGl0cyBzdXJyb3VuZGluZyBhcmVhLiBUaGVyZSBhcmUgYWxsIGtpbmRzIG9mIGVudmlyb25tZW50c1xyXG4gKiB3aGVyZSBpdCdzIHVwIHRvIHlvdSB0byBndWlkZSBhbmQgaGVscCB0aGUgY2FudmFzIHBvc2l0aW9uIGl0c2VsZiwgZXNwZWNpYWxseSB3aGVuIGJ1aWx0IGludG8gcmVuZGVyaW5nXHJcbiAqIGZyYW1ld29ya3MgbGlrZSBSZWFjdCBhbmQgVnVlLiBJZiB5b3VyIHBhZ2UgcmVxdWlyZXMgbWV0YSB0YWdzIHRvIHByZXZlbnQgdXNlciBzY2FsaW5nIGdlc3R1cmVzLCBvciBzdWNoXHJcbiAqIGxpa2UsIHRoZW4gaXQncyB1cCB0byB5b3UgdG8gZW5zdXJlIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIGh0bWwuXHJcbiAqIFxyXG4gKiAjIyMjIENlbnRlcmluZ1xyXG4gKiBcclxuICogWW91IGNhbiBhbHNvIGhhdmUgdGhlIGdhbWUgY2FudmFzIGF1dG9tYXRpY2FsbHkgY2VudGVyZWQuIEFnYWluLCB0aGlzIHJlbGllcyBoZWF2aWx5IG9uIHRoZSBwYXJlbnQgYmVpbmdcclxuICogcHJvcGVybHkgY29uZmlndXJlZCBhbmQgc3R5bGVkLCBhcyB0aGUgY2VudGVyaW5nIG9mZnNldHMgYXJlIGJhc2VkIGVudGlyZWx5IG9uIHRoZSBhdmFpbGFibGUgc3BhY2VcclxuICogd2l0aGluIHRoZSBwYXJlbnQgZWxlbWVudC4gQ2VudGVyaW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIG9yIGNhbiBiZSBhcHBsaWVkIGhvcml6b250YWxseSwgdmVydGljYWxseSxcclxuICogb3IgYm90aC4gSGVyZSdzIGFuIGV4YW1wbGU6XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHNjYWxlOiB7XHJcbiAqICAgICBwYXJlbnQ6ICd5b3VyZ2FtZWRpdicsXHJcbiAqICAgICBhdXRvQ2VudGVyOiBQaGFzZXIuU2NhbGUuQ0VOVEVSX0JPVEgsXHJcbiAqICAgICB3aWR0aDogODAwLFxyXG4gKiAgICAgaGVpZ2h0OiA2MDBcclxuICogfVxyXG4gKiBgYGBcclxuICogXHJcbiAqICMjIyMgRnVsbHNjcmVlbiBBUElcclxuICogXHJcbiAqIElmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LCB5b3UgY2FuIHNlbmQgeW91ciBnYW1lIGludG8gZnVsbHNjcmVlbiBtb2RlLiBJbiB0aGlzIG1vZGUsIHRoZSBnYW1lIHdpbGwgZmlsbFxyXG4gKiB0aGUgZW50aXJlIGRpc3BsYXksIHJlbW92aW5nIGFsbCBicm93c2VyIFVJIGFuZCBhbnl0aGluZyBlbHNlIHByZXNlbnQgb24gdGhlIHNjcmVlbi4gSXQgd2lsbCByZW1haW4gaW4gdGhpc1xyXG4gKiBtb2RlIHVudGlsIHlvdXIgZ2FtZSBlaXRoZXIgZGlzYWJsZXMgaXQsIG9yIHVudGlsIHRoZSB1c2VyIHRhYnMgb3V0IG9yIHByZXNzZXMgRVNDYXBlIGlmIG9uIGRlc2t0b3AuIEl0J3MgYVxyXG4gKiBncmVhdCB3YXkgdG8gYWNoaWV2ZSBhIGRlc2t0b3AtZ2FtZSBsaWtlIGV4cGVyaWVuY2UgZnJvbSB0aGUgYnJvd3NlciwgYnV0IGl0IGRvZXMgcmVxdWlyZSBhIG1vZGVybiBicm93c2VyXHJcbiAqIHRvIGhhbmRsZSBpdC4gU29tZSBtb2JpbGUgYnJvd3NlcnMgYWxzbyBzdXBwb3J0IHRoaXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBTY2FsZU1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2FsZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFBoYXNlci5HYW1lIGluc3RhbmNlLlxyXG4gKi9cclxudmFyIFNjYWxlTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2NhbGVNYW5hZ2VyIChnYW1lKVxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgUGhhc2VyLkdhbWUgaW5zdGFuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGdhbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBIVE1MIENhbnZhcyBFbGVtZW50IHRoYXQgUGhhc2VyIHVzZXMgdG8gcmVuZGVyIHRoZSBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNjYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgRE9NIGJvdW5kcyBvZiB0aGUgY2FudmFzIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2NhbnZhc0JvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2VvbS5SZWN0YW5nbGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzQm91bmRzID0gbmV3IFJlY3RhbmdsZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgQ2FudmFzLiBPZnRlbiBhIGRpdiwgb3IgdGhlIGJyb3dzZXIgd2luZG93LCBvciBub3RoaW5nIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIGlzIHNldCBpbiB0aGUgR2FtZSBDb25maWcgYXMgdGhlIGBwYXJlbnRgIHByb3BlcnR5LiBJZiB1bmRlZmluZWQgKG9yIGp1c3Qgbm90IHByZXNlbnQpLCBpdCB3aWxsIGRlZmF1bHRcclxuICAgICAgICAgKiB0byB1c2UgdGhlIGRvY3VtZW50IGJvZHkuIElmIHNwZWNpZmljYWxseSBzZXQgdG8gYG51bGxgIFBoYXNlciB3aWxsIGlnbm9yZSBhbGwgcGFyZW50IG9wZXJhdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3BhcmVudFxyXG4gICAgICAgICAqIEB0eXBlIHs/YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBwYXJlbnQgZWxlbWVudCB0aGUgYnJvd3NlciB3aW5kb3c/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3BhcmVudElzV2luZG93XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50SXNXaW5kb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFBhcmVudCBTaXplIGNvbXBvbmVudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjcGFyZW50U2l6ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TaXplfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhcmVudFNpemUgPSBuZXcgU2l6ZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgR2FtZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgdW4tbW9kaWZpZWQgZ2FtZSBzaXplLCBhcyByZXF1ZXN0ZWQgaW4gdGhlIGdhbWUgY29uZmlnICh0aGUgcmF3IHdpZHRoIC8gaGVpZ2h0KSxcclxuICAgICAgICAgKiBhcyB1c2VkIGZvciB3b3JsZCBib3VuZHMsIGNhbWVyYXMsIGV0Y1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNnYW1lU2l6ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU3RydWN0cy5TaXplfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWVTaXplID0gbmV3IFNpemUoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEJhc2UgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIG1vZGlmaWVkIGdhbWUgc2l6ZSwgd2hpY2ggaXMgdGhlIGdhbWVTaXplICogcmVzb2x1dGlvbiwgdXNlZCB0byBzZXQgdGhlIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgICogKGJ1dCBub3QgdGhlIENTUyBzdHlsZSlcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjYmFzZVNpemVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlN0cnVjdHMuU2l6ZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5iYXNlU2l6ZSA9IG5ldyBTaXplKCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBEaXNwbGF5IFNpemUgY29tcG9uZW50LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoZSBzaXplIHVzZWQgZm9yIHRoZSBjYW52YXMgc3R5bGUsIGZhY3RvcmluZyBpbiB0aGUgc2NhbGUgbW9kZSwgcGFyZW50IGFuZCBvdGhlciB2YWx1ZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2Rpc3BsYXlTaXplXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TdHJ1Y3RzLlNpemV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVNpemUgPSBuZXcgU2l6ZSgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZ2FtZSBzY2FsZSBtb2RlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNzY2FsZU1vZGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjYWxlLlNjYWxlTW9kZVR5cGV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NhbGVNb2RlID0gQ09OU1QuU0NBTEVfTU9ERS5OT05FO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FudmFzIHJlc29sdXRpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBpcyBoYXJkLWNvZGVkIHRvIGEgdmFsdWUgb2YgMSBpbiB0aGUgMy4xNiByZWxlYXNlIG9mIFBoYXNlciBhbmQgd2lsbCBiZSBlbmFibGVkIGF0IGEgbGF0ZXIgZGF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjcmVzb2x1dGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBnYW1lIHpvb20gZmFjdG9yLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgYWxsb3dzIHlvdSB0byBtdWx0aXBseSB5b3VyIGdhbWVzIGJhc2Ugc2l6ZSBieSB0aGUgZ2l2ZW4gem9vbSBmYWN0b3IuXHJcbiAgICAgICAgICogVGhpcyBpcyB0aGVuIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgZGlzcGxheSBzaXplLCBldmVuIGluIGBOT05FYCBzaXR1YXRpb25zLlxyXG4gICAgICAgICAqIElmIHlvdSBkb24ndCB3YW50IFBoYXNlciB0byB0b3VjaCB0aGUgY2FudmFzIHN0eWxlIGF0IGFsbCwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBDYW4gYWxzbyBiZSBzZXQgdG8gYE1BWF9aT09NYCBpbiB3aGljaCBjYXNlIHRoZSB6b29tIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCBiYXNlZFxyXG4gICAgICAgICAqIG9uIHRoZSBnYW1lIHNpemUgYW5kIGF2YWlsYWJsZSBzcGFjZSB3aXRoaW4gdGhlIHBhcmVudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjem9vbVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuem9vbSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIGZsYWcgc2V0IHdoZW4gdGhlIGdhbWUgem9vbSBmYWN0b3IgaXMgbW9kaWZpZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI19yZXNldFpvb21cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcmVzZXRab29tID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzY2FsZSBmYWN0b3IgYmV0d2VlbiB0aGUgYmFzZVNpemUgYW5kIHRoZSBjYW52YXNCb3VuZHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2Rpc3BsYXlTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRpc3BsYXlTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBzZXQsIHRoZSBjYW52YXMgc2l6ZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0aHJvdWdoIE1hdGguZmxvb3IuXHJcbiAgICAgICAgICogVGhpcyByZXN1bHRzIGluIHJvdW5kZWQgcGl4ZWwgZGlzcGxheSB2YWx1ZXMsIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2Ugb24gbGVnYWN5XHJcbiAgICAgICAgICogYW5kIGxvdyBwb3dlcmVkIGRldmljZXMsIGJ1dCBhdCB0aGUgY29zdCBvZiBub3QgYWNoaWV2aW5nIGEgJ3BlcmZlY3QnIGZpdCBpbiBzb21lIGJyb3dzZXIgd2luZG93cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjYXV0b1JvdW5kXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYXV0b1JvdW5kID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2VudGVyIHRoZSBjYW52YXMgd2l0aGluIHRoZSBwYXJlbnQ/IFRoZSBkaWZmZXJlbnQgY2VudGVyaW5nIG1vZGVzIGFyZTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiAxLiBObyBjZW50ZXJpbmcuXHJcbiAgICAgICAgICogMi4gQ2VudGVyIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LlxyXG4gICAgICAgICAqIDMuIENlbnRlciBob3Jpem9udGFsbHkuXHJcbiAgICAgICAgICogNC4gQ2VudGVyIHZlcnRpY2FsbHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgaW4gb3JkZXIgdG8gY2VudGVyIHRoZSBnYW1lIGNhbnZhcywgeW91IG11c3QgaGF2ZSBzcGVjaWZpZWQgYSBwYXJlbnRcclxuICAgICAgICAgKiB0aGF0IGhhcyBhIHNpemUgc2V0LCBvciB0aGUgY2FudmFzIHBhcmVudCBpcyB0aGUgZG9jdW1lbnQuYm9keS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjYXV0b0NlbnRlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NhbGUuQ2VudGVyVHlwZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hdXRvQ2VudGVyID0gQ09OU1QuQ0VOVEVSLk5PX0NFTlRFUjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgZGV2aWNlIG9yaWVudGF0aW9uLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIE9yaWVudGF0aW9uIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCB2aWEgdGhlIERldmljZSBPcmllbnRhdGlvbiBBUEksIHR5cGljYWxseSBvbmx5IG9uIG1vYmlsZSBicm93c2Vycy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjb3JpZW50YXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjYWxlLk9yaWVudGF0aW9uVHlwZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IENPTlNULk9SSUVOVEFUSU9OLkxBTkRTQ0FQRTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIERldmljZS5GdWxsc2NyZWVuIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjZnVsbHNjcmVlblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuRGV2aWNlLkZ1bGxzY3JlZW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIERPTSBFbGVtZW50IHdoaWNoIGlzIHNlbnQgaW50byBmdWxsc2NyZWVuIG1vZGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2Z1bGxzY3JlZW5UYXJnZXRcclxuICAgICAgICAgKiBAdHlwZSB7P2FueX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuVGFyZ2V0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGlkIFBoYXNlciBjcmVhdGUgdGhlIGZ1bGxzY3JlZW4gdGFyZ2V0IGRpdiwgb3Igd2FzIGl0IHByb3ZpZGVkIGluIHRoZSBnYW1lIGNvbmZpZz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjX2NyZWF0ZWRGdWxsc2NyZWVuVGFyZ2V0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY3JlYXRlZEZ1bGxzY3JlZW5UYXJnZXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqIFNldCBpZiB0aGVyZSBpcyBhIGNoYW5nZSBiZXR3ZWVuIHRoZSBwYXJlbnQgc2l6ZSBhbmQgdGhlIGN1cnJlbnQgc2l6ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjZGlydHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb3cgbWFueSBtaWxsaXNlY29uZHMgc2hvdWxkIGVsYXBzZSBiZWZvcmUgY2hlY2tpbmcgaWYgdGhlIGJyb3dzZXIgc2l6ZSBoYXMgY2hhbmdlZD9cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBNb3N0IG1vZGVybiBicm93c2VycyBkaXNwYXRjaCBhICdyZXNpemUnIGV2ZW50LCB3aGljaCB0aGUgU2NhbGUgTWFuYWdlciB3aWxsIGxpc3RlbiBmb3IuXHJcbiAgICAgICAgICogSG93ZXZlciwgb2xkZXIgYnJvd3NlcnMgZmFpbCB0byBkbyB0aGlzLCBvciBkbyBpdCBjb25zaXN0ZW50bHksIHNvIHdlIGZhbGwgYmFjayB0byBhXHJcbiAgICAgICAgICogbW9yZSB0cmFkaXRpb25hbCAnc2l6ZSBjaGVjaycgYmFzZWQgb24gYSB0aW1lIGludGVydmFsLiBZb3UgY2FuIGNvbnRyb2wgaG93IG9mdGVuIGl0IGlzXHJcbiAgICAgICAgICogY2hlY2tlZCBoZXJlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNyZXNpemVJbnRlcnZhbFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlc2l6ZUludGVydmFsID0gNTAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBzaXplIGludGVydmFsIHRyYWNrZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI19sYXN0Q2hlY2tcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9sYXN0Q2hlY2sgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbnRlcm5hbCBmbGFnIHRvIGNoZWNrIG9yaWVudGF0aW9uIHN0YXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNfY2hlY2tPcmllbnRhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2NoZWNrT3JpZW50YXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgb2JqZWN0IGNvbnRhaW5pbmcgb3VyIGRlZmluZWQgZXZlbnQgbGlzdGVuZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNsaXN0ZW5lcnNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge1xyXG5cclxuICAgICAgICAgICAgb3JpZW50YXRpb25DaGFuZ2U6IE5PT1AsXHJcbiAgICAgICAgICAgIHdpbmRvd1Jlc2l6ZTogTk9PUCxcclxuICAgICAgICAgICAgZnVsbFNjcmVlbkNoYW5nZTogTk9PUCxcclxuICAgICAgICAgICAgZnVsbFNjcmVlbkVycm9yOiBOT09QXHJcblxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIF9iZWZvcmVfIHRoZSBjYW52YXMgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBET00uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3ByZUJvb3RcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBsaXN0ZW5zIFBoYXNlci5Db3JlLkV2ZW50cyNCT09UXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHByZUJvb3Q6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFBhcnNlIHRoZSBjb25maWcgdG8gZ2V0IHRoZSBzY2FsaW5nIHZhbHVlcyB3ZSBuZWVkXHJcbiAgICAgICAgdGhpcy5wYXJzZUNvbmZpZyh0aGlzLmdhbWUuY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lLmV2ZW50cy5vbmNlKCdib290JywgdGhpcy5ib290LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQm9vdCBoYW5kbGVyIGlzIGNhbGxlZCBieSBQaGFzZXIuR2FtZSB3aGVuIGl0IGZpcnN0IHN0YXJ0cyB1cC5cclxuICAgICAqIFRoZSByZW5kZXJlciBpcyBhdmFpbGFibGUgYnkgbm93IGFuZCB0aGUgY2FudmFzIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2Jvb3RcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI1JFU0laRVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnYW1lID0gdGhpcy5nYW1lO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcyA9IGdhbWUuY2FudmFzO1xyXG5cclxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW4gPSBnYW1lLmRldmljZS5mdWxsc2NyZWVuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zY2FsZU1vZGUgIT09IENPTlNULlNDQUxFX01PREUuUkVTSVpFKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5zZXRBc3BlY3RNb2RlKHRoaXMuc2NhbGVNb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNjYWxlTW9kZSA9PT0gQ09OU1QuU0NBTEVfTU9ERS5OT05FKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemUodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmdldFBhcmVudEJvdW5kcygpO1xyXG5cclxuICAgICAgICAgICAgLy8gIE9ubHkgc2V0IHRoZSBwYXJlbnQgYm91bmRzIGlmIHRoZSBwYXJlbnQgaGFzIGFuIGFjdHVhbCBzaXplXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNpemUud2lkdGggPiAwICYmIHRoaXMucGFyZW50U2l6ZS5oZWlnaHQgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlTaXplLnNldFBhcmVudCh0aGlzLnBhcmVudFNpemUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuUFJFX1NURVAsIHRoaXMuc3RlcCwgdGhpcyk7XHJcbiAgICAgICAgZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhcnRMaXN0ZW5lcnMoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiB0byBzZXQtdXAgdGhlIHNjYWxlIGRlZmF1bHRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNwYXJzZUNvbmZpZ1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Db3JlLkdhbWVDb25maWd9IGNvbmZpZyAtIFRoZSBHYW1lIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwYXJzZUNvbmZpZzogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICAvLyAgR2V0IHRoZSBwYXJlbnQgZWxlbWVudCwgaWYgYW55XHJcbiAgICAgICAgdGhpcy5nZXRQYXJlbnQoY29uZmlnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAgR2V0IHRoZSBzaXplIG9mIHRoZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgICAgIC8vICBUaGlzIGNhbiBvZnRlbiBzZXQgYSBoZWlnaHQgb2YgemVybyAoZXNwZWNpYWxseSBmb3IgdW4tc3R5bGVkIGRpdnMpXHJcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRCb3VuZHMoKTtcclxuXHJcbiAgICAgICAgdmFyIHdpZHRoID0gY29uZmlnLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSBjb25maWcuaGVpZ2h0O1xyXG4gICAgICAgIHZhciBzY2FsZU1vZGUgPSBjb25maWcuc2NhbGVNb2RlO1xyXG4gICAgICAgIHZhciByZXNvbHV0aW9uID0gY29uZmlnLnJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIHpvb20gPSBjb25maWcuem9vbTtcclxuICAgICAgICB2YXIgYXV0b1JvdW5kID0gY29uZmlnLmF1dG9Sb3VuZDtcclxuXHJcbiAgICAgICAgLy8gIElmIHdpZHRoID0gJzEwMCUnLCBvciBzaW1pbGFyIHZhbHVlXHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgd2UgaGF2ZSBhIHBhcmVudCB3aXRoIGEgaGVpZ2h0LCB3ZSdsbCB3b3JrIGl0IG91dCBmcm9tIHRoYXRcclxuICAgICAgICAgICAgdmFyIHBhcmVudFdpZHRoID0gdGhpcy5wYXJlbnRTaXplLndpZHRoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudFdpZHRoID09PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFyZW50U2NhbGVYID0gcGFyc2VJbnQod2lkdGgsIDEwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5mbG9vcihwYXJlbnRXaWR0aCAqIHBhcmVudFNjYWxlWCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSWYgaGVpZ2h0ID0gJzEwMCUnLCBvciBzaW1pbGFyIHZhbHVlXHJcbiAgICAgICAgaWYgKHR5cGVvZiBoZWlnaHQgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIHdlIGhhdmUgYSBwYXJlbnQgd2l0aCBhIGhlaWdodCwgd2UnbGwgd29yayBpdCBvdXQgZnJvbSB0aGF0XHJcbiAgICAgICAgICAgIHZhciBwYXJlbnRIZWlnaHQgPSB0aGlzLnBhcmVudFNpemUuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudEhlaWdodCA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgcGFyZW50U2NhbGVZID0gcGFyc2VJbnQoaGVpZ2h0LCAxMCkgLyAxMDA7XHJcblxyXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHBhcmVudEhlaWdodCAqIHBhcmVudFNjYWxlWSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGhpcyBpcyBmaXhlZCBhdCAxIG9uIHB1cnBvc2UuXHJcbiAgICAgICAgLy8gIENoYW5naW5nIGl0IHdpbGwgYnJlYWsgYWxsIHVzZXIgaW5wdXQuXHJcbiAgICAgICAgLy8gIFdhaXQgZm9yIGFub3RoZXIgcmVsZWFzZSB0byBzb2x2ZSB0aGlzIGlzc3VlLlxyXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IDE7XHJcblxyXG4gICAgICAgIHRoaXMuc2NhbGVNb2RlID0gc2NhbGVNb2RlO1xyXG5cclxuICAgICAgICB0aGlzLmF1dG9Sb3VuZCA9IGF1dG9Sb3VuZDtcclxuXHJcbiAgICAgICAgdGhpcy5hdXRvQ2VudGVyID0gY29uZmlnLmF1dG9DZW50ZXI7XHJcblxyXG4gICAgICAgIHRoaXMucmVzaXplSW50ZXJ2YWwgPSBjb25maWcucmVzaXplSW50ZXJ2YWw7XHJcblxyXG4gICAgICAgIGlmIChhdXRvUm91bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3aWR0aCA9IE1hdGguZmxvb3Iod2lkdGgpO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGhlIHVuLW1vZGlmaWVkIGdhbWUgc2l6ZSwgYXMgcmVxdWVzdGVkIGluIHRoZSBnYW1lIGNvbmZpZyAodGhlIHJhdyB3aWR0aCAvIGhlaWdodCkgYXMgdXNlZCBmb3Igd29ybGQgYm91bmRzLCBldGNcclxuICAgICAgICB0aGlzLmdhbWVTaXplLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh6b29tID09PSBDT05TVC5aT09NLk1BWF9aT09NKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgem9vbSA9IHRoaXMuZ2V0TWF4Wm9vbSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcclxuXHJcbiAgICAgICAgaWYgKHpvb20gIT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldFpvb20gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRoZSBtb2RpZmllZCBnYW1lIHNpemUsIHdoaWNoIGlzIHRoZSB3L2ggKiByZXNvbHV0aW9uXHJcbiAgICAgICAgdGhpcy5iYXNlU2l6ZS5zZXRTaXplKHdpZHRoICogcmVzb2x1dGlvbiwgaGVpZ2h0ICogcmVzb2x1dGlvbik7XHJcblxyXG4gICAgICAgIGlmIChhdXRvUm91bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VTaXplLndpZHRoID0gTWF0aC5mbG9vcih0aGlzLmJhc2VTaXplLndpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5iYXNlU2l6ZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMuYmFzZVNpemUuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcubWluV2lkdGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5zZXRNaW4oY29uZmlnLm1pbldpZHRoICogem9vbSwgY29uZmlnLm1pbkhlaWdodCAqIHpvb20pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZy5tYXhXaWR0aCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTaXplLnNldE1heChjb25maWcubWF4V2lkdGggKiB6b29tLCBjb25maWcubWF4SGVpZ2h0ICogem9vbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgVGhlIHNpemUgdXNlZCBmb3IgdGhlIGNhbnZhcyBzdHlsZSwgZmFjdG9yaW5nIGluIHRoZSBzY2FsZSBtb2RlIGFuZCBwYXJlbnQgYW5kIHpvb20gdmFsdWVcclxuICAgICAgICAvLyAgV2UganVzdCB1c2UgdGhlIHcvaCBoZXJlIGFzIHRoaXMgaXMgd2hhdCBzZXRzIHRoZSBhc3BlY3QgcmF0aW8gKHdoaWNoIGRvZXNuJ3QgdGhlbiBjaGFuZ2UpXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gR2V0U2NyZWVuT3JpZW50YXRpb24od2lkdGgsIGhlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGdhbWUgY2FudmFzLCBpZiBhbnksIGJhc2VkIG9uIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2dldFBhcmVudFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Db3JlLkdhbWVDb25maWd9IGNvbmZpZyAtIFRoZSBHYW1lIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IGNvbmZpZy5wYXJlbnQ7XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgVXNlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHBhcmVudFxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhcmVudCA9IEdldFRhcmdldChwYXJlbnQpO1xyXG4gICAgICAgIHRoaXMucGFyZW50SXNXaW5kb3cgPSAodGhpcy5wYXJlbnQgPT09IGRvY3VtZW50LmJvZHkpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLmV4cGFuZFBhcmVudCAmJiBjb25maWcuc2NhbGVNb2RlICE9PSBDT05TVC5TQ0FMRV9NT0RFLk5PTkUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgRE9NUmVjdCA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50SXNXaW5kb3cgfHwgRE9NUmVjdC5oZWlnaHQgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuXHJcbiAgICAgICAgICAgICAgICBET01SZWN0ID0gdGhpcy5wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFRoZSBwYXJlbnQgU1RJTEwgaGFzIG5vIGhlaWdodCwgY2xlYXJseSBubyBDU1NcclxuICAgICAgICAgICAgICAgIC8vICBoYXMgYmVlbiBzZXQgb24gaXQgZXZlbiB0aG91Z2ggd2UgZml4ZWQgdGhlIGJvZHkgOihcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJlbnRJc1dpbmRvdyAmJiBET01SZWN0LmhlaWdodCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEFuZCBub3cgZ2V0IHRoZSBmdWxsc2NyZWVuVGFyZ2V0XHJcbiAgICAgICAgaWYgKGNvbmZpZy5mdWxsc2NyZWVuVGFyZ2V0ICYmICF0aGlzLmZ1bGxzY3JlZW5UYXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5UYXJnZXQgPSBHZXRUYXJnZXQoY29uZmlnLmZ1bGxzY3JlZW5UYXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBwYXJlbnQgYm91bmRzIGFuZCB1cGRhdGVzIHRoZSBgcGFyZW50U2l6ZWAgY29tcG9uZW50LCBpZiB0aGUgY2FudmFzIGhhcyBhIGRvbSBwYXJlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2dldFBhcmVudEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhcmVudCBib3VuZHMgaGF2ZSBjaGFuZ2VkIHNpemUsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBnZXRQYXJlbnRCb3VuZHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwYXJlbnRTaXplID0gdGhpcy5wYXJlbnRTaXplO1xyXG5cclxuICAgICAgICAvLyBSZWYuIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDc4MTUwOSh2PXZzLjg1KS5hc3B4IGZvciBnZXRCb3VuZGluZ0NsaWVudFJlY3RcclxuXHJcbiAgICAgICAgdmFyIERPTVJlY3QgPSB0aGlzLnBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50SXNXaW5kb3cgJiYgdGhpcy5nYW1lLmRldmljZS5vcy5pT1MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBET01SZWN0LmhlaWdodCA9IEdldElubmVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gRE9NUmVjdC53aWR0aCAqIHJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IERPTVJlY3QuaGVpZ2h0ICogcmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgaWYgKHBhcmVudFNpemUud2lkdGggIT09IG5ld1dpZHRoIHx8IHBhcmVudFNpemUuaGVpZ2h0ICE9PSBuZXdIZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRTaXplLnNldFNpemUobmV3V2lkdGgsIG5ld0hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBsb2NrIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgd2ViIGJyb3dzZXIgdXNpbmcgdGhlIFNjcmVlbiBPcmllbnRhdGlvbiBBUEkuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgQVBJIGlzIG9ubHkgYXZhaWxhYmxlIG9uIG1vZGVybiBtb2JpbGUgYnJvd3NlcnMuXHJcbiAgICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NjcmVlbi9sb2NrT3JpZW50YXRpb24gZm9yIGRldGFpbHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2xvY2tPcmllbnRhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3JpZW50YXRpb24gLSBUaGUgb3JpZW50YXRpb24geW91J2QgbGlrZSB0byBsb2NrIHRoZSBicm93c2VyIGluLiBTaG91bGQgYmUgYW4gQVBJIHN0cmluZyBzdWNoIGFzICdsYW5kc2NhcGUnLCAnbGFuZHNjYXBlLXByaW1hcnknLCAncG9ydHJhaXQnLCBldGMuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb3JpZW50YXRpb24gd2FzIHN1Y2Nlc3NmdWxseSBsb2NrZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBsb2NrT3JpZW50YXRpb246IGZ1bmN0aW9uIChvcmllbnRhdGlvbilcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9jayA9IHNjcmVlbi5sb2NrT3JpZW50YXRpb24gfHwgc2NyZWVuLm1vekxvY2tPcmllbnRhdGlvbiB8fCBzY3JlZW4ubXNMb2NrT3JpZW50YXRpb247XHJcblxyXG4gICAgICAgIGlmIChsb2NrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2suY2FsbChzY3JlZW4sIG9yaWVudGF0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgc2l6ZSBvZiB0aGUgUGFyZW50IFNpemUgY29tcG9uZW50LCB3aGljaCBpcyB1c2VkIGluIHNjYWxpbmdcclxuICAgICAqIGFuZCBjZW50ZXJpbmcgY2FsY3VsYXRpb25zLiBZb3Ugb25seSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgeW91IGhhdmUgZXhwbGljaXRseVxyXG4gICAgICogZGlzYWJsZWQgdGhlIHVzZSBvZiBhIHBhcmVudCBpbiB5b3VyIGdhbWUgY29uZmlnLCBidXQgc3RpbGwgd2lzaCB0byB0YWtlIGFkdmFudGFnZSBvZlxyXG4gICAgICogb3RoZXIgU2NhbGUgTWFuYWdlciBmZWF0dXJlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjc2V0UGFyZW50U2l6ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjUkVTSVpFXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIHBhcmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcGFyZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgU2NhbGUgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0UGFyZW50U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRTaXplLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2goKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCBhIG5ldyBzaXplIGZvciB5b3VyIGdhbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91J3JlIGxvb2tpbmcgdG8gY2hhbmdlIHRoZSBiYXNlIHNpemUgb2YgeW91ciBnYW1lIGFuZCBhcmUgdXNpbmdcclxuICAgICAqIG9uZSBvZiB0aGUgU2NhbGUgTWFuYWdlciBzY2FsaW5nIG1vZGVzLCBpLmUuIGBGSVRgLiBJZiB5b3UncmUgdXNpbmcgYE5PTkVgIGFuZCB3aXNoIHRvXHJcbiAgICAgKiBjaGFuZ2UgdGhlIGdhbWUgYW5kIGNhbnZhcyBzaXplIGRpcmVjdGx5LCB0aGVuIHBsZWFzZSB1c2UgdGhlIGByZXNpemVgIG1ldGhvZCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNzZXRHYW1lU2l6ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjUkVTSVpFXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIGdhbWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIGdhbWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoZSBTY2FsZSBNYW5hZ2VyIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRHYW1lU2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGF1dG9Sb3VuZCA9IHRoaXMuYXV0b1JvdW5kO1xyXG4gICAgICAgIHZhciByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xyXG5cclxuICAgICAgICBpZiAoYXV0b1JvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIHZhciBwcmV2aW91c0hlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyAgVGhlIHVuLW1vZGlmaWVkIGdhbWUgc2l6ZSwgYXMgcmVxdWVzdGVkIGluIHRoZSBnYW1lIGNvbmZpZyAodGhlIHJhdyB3aWR0aCAvIGhlaWdodCkgYXMgdXNlZCBmb3Igd29ybGQgYm91bmRzLCBldGNcclxuICAgICAgICB0aGlzLmdhbWVTaXplLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBtb2RpZmllZCBnYW1lIHNpemUsIHdoaWNoIGlzIHRoZSB3L2ggKiByZXNvbHV0aW9uXHJcbiAgICAgICAgdGhpcy5iYXNlU2l6ZS5yZXNpemUod2lkdGggKiByZXNvbHV0aW9uLCBoZWlnaHQgKiByZXNvbHV0aW9uKTtcclxuXHJcbiAgICAgICAgaWYgKGF1dG9Sb3VuZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFzZVNpemUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMuYmFzZVNpemUud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VTaXplLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5iYXNlU2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRoZSBzaXplIHVzZWQgZm9yIHRoZSBjYW52YXMgc3R5bGUsIGZhY3RvcmluZyBpbiB0aGUgc2NhbGUgbW9kZSBhbmQgcGFyZW50IGFuZCB6b29tIHZhbHVlXHJcbiAgICAgICAgLy8gIFVwZGF0ZSB0aGUgYXNwZWN0IHJhdGlvXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5zZXRBc3BlY3RSYXRpbyh3aWR0aCAvIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5iYXNlU2l6ZS53aWR0aDtcclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmJhc2VTaXplLmhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaChwcmV2aW91c1dpZHRoLCBwcmV2aW91c0hlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbCB0aGlzIHRvIG1vZGlmeSB0aGUgc2l6ZSBvZiB0aGUgUGhhc2VyIGNhbnZhcyBlbGVtZW50IGRpcmVjdGx5LlxyXG4gICAgICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGBOT05FYCBzY2FsZSBtb2RlLFxyXG4gICAgICogaXQgd2lsbCB1cGRhdGUgYWxsIGludGVybmFsIGNvbXBvbmVudHMgY29tcGxldGVseS5cclxuICAgICAqIFxyXG4gICAgICogSWYgYWxsIHlvdSB3YW50IHRvIGRvIGlzIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgcGFyZW50LCBzZWUgdGhlIGBzZXRQYXJlbnRTaXplYCBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIElmIGFsbCB5b3Ugd2FudCBpcyB0byBjaGFuZ2UgdGhlIGJhc2Ugc2l6ZSBvZiB0aGUgZ2FtZSwgYnV0IHN0aWxsIGhhdmUgdGhlIFNjYWxlIE1hbmFnZXJcclxuICAgICAqIG1hbmFnZSBhbGwgdGhlIHNjYWxpbmcgKGkuZS4geW91J3JlICoqbm90KiogdXNpbmcgYE5PTkVgKSwgdGhlbiBzZWUgdGhlIGBzZXRHYW1lU2l6ZWAgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgYGdhbWVTaXplYCwgYGJhc2VTaXplYCBhbmQgYGRpc3BsYXlTaXplYCBjb21wb25lbnRzIHRvIHRoZSBnaXZlblxyXG4gICAgICogZGltZW5zaW9ucy4gSXQgd2lsbCB0aGVuIHJlc2l6ZSB0aGUgY2FudmFzIHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIHZhbHVlcyBnaXZlbiwgYnlcclxuICAgICAqIGRpcmVjdGx5IHNldHRpbmcgdGhlIHByb3BlcnRpZXMuIEZpbmFsbHksIGlmIHlvdSBoYXZlIHNldCB0aGUgU2NhbGUgTWFuYWdlciB6b29tIHZhbHVlXHJcbiAgICAgKiB0byBhbnl0aGluZyBvdGhlciB0aGFuIDEgKHRoZSBkZWZhdWx0KSwgaXQgd2lsbCBzZXQgdGhlIGNhbnZhcyBDU1Mgd2lkdGggYW5kIGhlaWdodCB0b1xyXG4gICAgICogYmUgdGhlIGdpdmVuIHNpemUgbXVsdGlwbGllZCBieSB0aGUgem9vbSBmYWN0b3IgKHRoZSBjYW52YXMgcGl4ZWwgc2l6ZSByZW1haW5zIHVudG91Y2hlZCkuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBoYXZlIGVuYWJsZWQgYGF1dG9DZW50ZXJgLCBpdCBpcyB0aGVuIHBhc3NlZCB0byB0aGUgYHVwZGF0ZUNlbnRlcmAgbWV0aG9kIGFuZFxyXG4gICAgICogdGhlIG1hcmdpbnMgYXJlIHNldCwgYWxsb3dpbmcgdGhlIGNhbnZhcyB0byBiZSBjZW50ZXJlZCBiYXNlZCBvbiBpdHMgcGFyZW50IGVsZW1lbnRcclxuICAgICAqIGFsb25lLiBGaW5hbGx5LCB0aGUgYGRpc3BsYXlTY2FsZWAgaXMgYWRqdXN0ZWQgYW5kIHRoZSBSRVNJWkUgZXZlbnQgZGlzcGF0Y2hlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjcmVzaXplXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjYWxlLkV2ZW50cyNSRVNJWkVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgZ2FtZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgZ2FtZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhlIFNjYWxlIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHpvb20gPSB0aGlzLnpvb207XHJcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XHJcbiAgICAgICAgdmFyIGF1dG9Sb3VuZCA9IHRoaXMuYXV0b1JvdW5kO1xyXG5cclxuICAgICAgICBpZiAoYXV0b1JvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggPSBNYXRoLmZsb29yKHdpZHRoKTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIHZhciBwcmV2aW91c0hlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyAgVGhlIHVuLW1vZGlmaWVkIGdhbWUgc2l6ZSwgYXMgcmVxdWVzdGVkIGluIHRoZSBnYW1lIGNvbmZpZyAodGhlIHJhdyB3aWR0aCAvIGhlaWdodCkgYXMgdXNlZCBmb3Igd29ybGQgYm91bmRzLCBldGNcclxuICAgICAgICB0aGlzLmdhbWVTaXplLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBtb2RpZmllZCBnYW1lIHNpemUsIHdoaWNoIGlzIHRoZSB3L2ggKiByZXNvbHV0aW9uXHJcbiAgICAgICAgdGhpcy5iYXNlU2l6ZS5yZXNpemUod2lkdGggKiByZXNvbHV0aW9uLCBoZWlnaHQgKiByZXNvbHV0aW9uKTtcclxuXHJcbiAgICAgICAgaWYgKGF1dG9Sb3VuZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFzZVNpemUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMuYmFzZVNpemUud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VTaXplLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5iYXNlU2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFRoZSBzaXplIHVzZWQgZm9yIHRoZSBjYW52YXMgc3R5bGUsIGZhY3RvcmluZyBpbiB0aGUgc2NhbGUgbW9kZSBhbmQgcGFyZW50IGFuZCB6b29tIHZhbHVlXHJcbiAgICAgICAgLy8gIFdlIGp1c3QgdXNlIHRoZSB3L2ggaGVyZSBhcyB0aGlzIGlzIHdoYXQgc2V0cyB0aGUgYXNwZWN0IHJhdGlvICh3aGljaCBkb2Vzbid0IHRoZW4gY2hhbmdlKVxyXG4gICAgICAgIHRoaXMuZGlzcGxheVNpemUuc2V0U2l6ZSgod2lkdGggKiB6b29tKSAqIHJlc29sdXRpb24sIChoZWlnaHQgKiB6b29tKSAqIHJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuYmFzZVNpemUud2lkdGg7XHJcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5iYXNlU2l6ZS5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuY2FudmFzLnN0eWxlO1xyXG5cclxuICAgICAgICB2YXIgc3R5bGVXaWR0aCA9IHdpZHRoICogem9vbTtcclxuICAgICAgICB2YXIgc3R5bGVIZWlnaHQgPSBoZWlnaHQgKiB6b29tO1xyXG5cclxuICAgICAgICBpZiAoYXV0b1JvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3R5bGVXaWR0aCA9IE1hdGguZmxvb3Ioc3R5bGVXaWR0aCk7XHJcbiAgICAgICAgICAgIHN0eWxlSGVpZ2h0ID0gTWF0aC5mbG9vcihzdHlsZUhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3R5bGVXaWR0aCAhPT0gd2lkdGggfHwgc3R5bGVIZWlnaHQgIT09IGhlaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGVXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2gocHJldmlvdXNXaWR0aCwgcHJldmlvdXNIZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHpvb20gdmFsdWUgb2YgdGhlIFNjYWxlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3NldFpvb21cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI1JFU0laRVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHZhbHVlIC0gVGhlIG5ldyB6b29tIHZhbHVlIG9mIHRoZSBnYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgU2NhbGUgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0Wm9vbTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuem9vbSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0Wm9vbSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2goKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB6b29tIHRvIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGJhc2VkIG9uIHRoZSBfY3VycmVudF8gcGFyZW50IHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3NldE1heFpvb21cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI1JFU0laRVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgU2NhbGUgTWFuYWdlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWF4Wm9vbTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnpvb20gPSB0aGlzLmdldE1heFpvb20oKTtcclxuICAgICAgICB0aGlzLl9yZXNldFpvb20gPSB0cnVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVmcmVzaGVzIHRoZSBpbnRlcm5hbCBzY2FsZSB2YWx1ZXMsIGJvdW5kcyBzaXplcyBhbmQgb3JpZW50YXRpb24gY2hlY2tzLlxyXG4gICAgICogXHJcbiAgICAgKiBPbmNlIGZpbmlzaGVkLCBkaXNwYXRjaGVzIHRoZSByZXNpemUgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjYWxlIE1hbmFnZXIgd2hlbiB0aGUgYnJvd3NlciB3aW5kb3cgc2l6ZSBjaGFuZ2VzLFxyXG4gICAgICogYXMgbG9uZyBhcyBpdCBpcyB1c2luZyBhIFNjYWxlIE1vZGUgb3RoZXIgdGhhbiAnTk9ORScuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3JlZnJlc2hcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI1JFU0laRVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZXZpb3VzV2lkdGhdIC0gVGhlIHByZXZpb3VzIHdpZHRoIG9mIHRoZSBnYW1lLiBPbmx5IHNldCBpZiB0aGUgZ2FtZVNpemUgaGFzIGNoYW5nZWQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZXZpb3VzSGVpZ2h0XSAtIFRoZSBwcmV2aW91cyBoZWlnaHQgb2YgdGhlIGdhbWUuIE9ubHkgc2V0IGlmIHRoZSBnYW1lU2l6ZSBoYXMgY2hhbmdlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhlIFNjYWxlIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uIChwcmV2aW91c1dpZHRoLCBwcmV2aW91c0hlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAocHJldmlvdXNXaWR0aCA9PT0gdW5kZWZpbmVkKSB7IHByZXZpb3VzV2lkdGggPSB0aGlzLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKHByZXZpb3VzSGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgcHJldmlvdXNIZWlnaHQgPSB0aGlzLmhlaWdodDsgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU9yaWVudGF0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheVNjYWxlLnNldCh0aGlzLmJhc2VTaXplLndpZHRoIC8gdGhpcy5jYW52YXNCb3VuZHMud2lkdGgsIHRoaXMuYmFzZVNpemUuaGVpZ2h0IC8gdGhpcy5jYW52YXNCb3VuZHMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdmFyIGRvbUNvbnRhaW5lciA9IHRoaXMuZ2FtZS5kb21Db250YWluZXI7XHJcblxyXG4gICAgICAgIGlmIChkb21Db250YWluZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VTaXplLnNldENTUyhkb21Db250YWluZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGNhbnZhc1N0eWxlID0gdGhpcy5jYW52YXMuc3R5bGU7XHJcbiAgICAgICAgICAgIHZhciBkb21TdHlsZSA9IGRvbUNvbnRhaW5lci5zdHlsZTtcclxuXHJcbiAgICAgICAgICAgIGRvbVN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgnICsgdGhpcy5kaXNwbGF5U2l6ZS53aWR0aCAvIHRoaXMuYmFzZVNpemUud2lkdGggKyAnLCcgKyB0aGlzLmRpc3BsYXlTaXplLmhlaWdodCAvIHRoaXMuYmFzZVNpemUuaGVpZ2h0ICsgJyknO1xyXG5cclxuICAgICAgICAgICAgZG9tU3R5bGUubWFyZ2luTGVmdCA9IGNhbnZhc1N0eWxlLm1hcmdpbkxlZnQ7XHJcbiAgICAgICAgICAgIGRvbVN0eWxlLm1hcmdpblRvcCA9IGNhbnZhc1N0eWxlLm1hcmdpblRvcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuUkVTSVpFLCB0aGlzLmdhbWVTaXplLCB0aGlzLmJhc2VTaXplLCB0aGlzLmRpc3BsYXlTaXplLCB0aGlzLnJlc29sdXRpb24sIHByZXZpb3VzV2lkdGgsIHByZXZpb3VzSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgY2hlY2tzIHRoZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiwgb25seSBpZiB0aGUgaW50ZXJuYWwgY2hlY2sgZmxhZyBpcyBzZXQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBvcmllbnRhdGlvbiBoYXMgY2hhbmdlZCBpdCB1cGRhdGVzIHRoZSBvcmllbnRhdGlvbiBwcm9wZXJ0eSBhbmQgdGhlbiBkaXNwYXRjaGVzIHRoZSBvcmllbnRhdGlvbiBjaGFuZ2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3VwZGF0ZU9yaWVudGF0aW9uXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjYWxlLkV2ZW50cyNPUklFTlRBVElPTl9DSEFOR0VcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlT3JpZW50YXRpb246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoZWNrT3JpZW50YXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGVja09yaWVudGF0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB2YXIgbmV3T3JpZW50YXRpb24gPSBHZXRTY3JlZW5PcmllbnRhdGlvbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobmV3T3JpZW50YXRpb24gIT09IHRoaXMub3JpZW50YXRpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBuZXdPcmllbnRhdGlvbjtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5PUklFTlRBVElPTl9DSEFOR0UsIG5ld09yaWVudGF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHRoZSBzaXplIGNvbXBvbmVudHMgYmFzZWQgb24gdGhlIHNjYWxlIG1vZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3VwZGF0ZVNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVNjYWxlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuY2FudmFzLnN0eWxlO1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdhbWVTaXplLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdhbWVTaXplLmhlaWdodDtcclxuXHJcbiAgICAgICAgdmFyIHN0eWxlV2lkdGg7XHJcbiAgICAgICAgdmFyIHN0eWxlSGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgem9vbSA9IHRoaXMuem9vbTtcclxuICAgICAgICB2YXIgYXV0b1JvdW5kID0gdGhpcy5hdXRvUm91bmQ7XHJcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSAxO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zY2FsZU1vZGUgPT09IENPTlNULlNDQUxFX01PREUuTk9ORSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBObyBzY2FsZVxyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTaXplLnNldFNpemUoKHdpZHRoICogem9vbSkgKiByZXNvbHV0aW9uLCAoaGVpZ2h0ICogem9vbSkgKiByZXNvbHV0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIHN0eWxlV2lkdGggPSB0aGlzLmRpc3BsYXlTaXplLndpZHRoIC8gcmVzb2x1dGlvbjtcclxuICAgICAgICAgICAgc3R5bGVIZWlnaHQgPSB0aGlzLmRpc3BsYXlTaXplLmhlaWdodCAvIHJlc29sdXRpb247XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JvdW5kKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZVdpZHRoID0gTWF0aC5mbG9vcihzdHlsZVdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHN0eWxlSGVpZ2h0ID0gTWF0aC5mbG9vcihzdHlsZUhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNldFpvb20pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGVXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZUhlaWdodCArICdweCc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRab29tID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zY2FsZU1vZGUgPT09IENPTlNULlNDQUxFX01PREUuUkVTSVpFKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFJlc2l6ZSB0byBtYXRjaCBwYXJlbnRcclxuXHJcbiAgICAgICAgICAgIC8vICBUaGlzIHdpbGwgY29uc3RyYWluIHVzaW5nIG1pbi9tYXhcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5zZXRTaXplKHRoaXMucGFyZW50U2l6ZS53aWR0aCwgdGhpcy5wYXJlbnRTaXplLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdhbWVTaXplLnNldFNpemUodGhpcy5kaXNwbGF5U2l6ZS53aWR0aCwgdGhpcy5kaXNwbGF5U2l6ZS5oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXNlU2l6ZS5zZXRTaXplKHRoaXMuZGlzcGxheVNpemUud2lkdGggKiByZXNvbHV0aW9uLCB0aGlzLmRpc3BsYXlTaXplLmhlaWdodCAqIHJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICAgICAgc3R5bGVXaWR0aCA9IHRoaXMuZGlzcGxheVNpemUud2lkdGggLyByZXNvbHV0aW9uO1xyXG4gICAgICAgICAgICBzdHlsZUhlaWdodCA9IHRoaXMuZGlzcGxheVNpemUuaGVpZ2h0IC8gcmVzb2x1dGlvbjtcclxuXHJcbiAgICAgICAgICAgIGlmIChhdXRvUm91bmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlV2lkdGggPSBNYXRoLmZsb29yKHN0eWxlV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc3R5bGVIZWlnaHQgPSBNYXRoLmZsb29yKHN0eWxlSGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSBzdHlsZVdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBzdHlsZUhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFsbCBvdGhlciBzY2FsZSBtb2Rlc1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTaXplLnNldFNpemUodGhpcy5wYXJlbnRTaXplLndpZHRoLCB0aGlzLnBhcmVudFNpemUuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHN0eWxlV2lkdGggPSB0aGlzLmRpc3BsYXlTaXplLndpZHRoIC8gcmVzb2x1dGlvbjtcclxuICAgICAgICAgICAgc3R5bGVIZWlnaHQgPSB0aGlzLmRpc3BsYXlTaXplLmhlaWdodCAvIHJlc29sdXRpb247XHJcblxyXG4gICAgICAgICAgICBpZiAoYXV0b1JvdW5kKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZVdpZHRoID0gTWF0aC5mbG9vcihzdHlsZVdpZHRoKTtcclxuICAgICAgICAgICAgICAgIHN0eWxlSGVpZ2h0ID0gTWF0aC5mbG9vcihzdHlsZUhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGVXaWR0aCArICdweCc7XHJcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBVcGRhdGUgdGhlIHBhcmVudFNpemUgaW4gY2FzZSB0aGUgY2FudmFzIC8gc3R5bGUgY2hhbmdlIG1vZGlmaWVkIGl0XHJcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRCb3VuZHMoKTtcclxuXHJcbiAgICAgICAgLy8gIEZpbmFsbHksIHVwZGF0ZSB0aGUgY2VudGVyaW5nXHJcbiAgICAgICAgdGhpcy51cGRhdGVDZW50ZXIoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHpvb20gZmFjdG9yLCBiYXNlZCBvbiB0aGUgY3VycmVudFxyXG4gICAgICogcGFyZW50IGFuZCBnYW1lIHNpemVzLiBJZiB0aGUgcGFyZW50IGhhcyBubyBkaW1lbnNpb25zIChpLmUuIGFuIHVuc3R5bGVkIGRpdiksXHJcbiAgICAgKiBvciBpcyBzbWFsbGVyIHRoYW4gdGhlIHVuLXpvb21lZCBnYW1lLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYSB2YWx1ZSBvZiAxIChubyB6b29tKVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNnZXRNYXhab29tXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBtYXhpbXVtIHBvc3NpYmxlIHpvb20gZmFjdG9yLiBBdCBhIG1pbmltdW0gdGhpcyB2YWx1ZSBpcyBhbHdheXMgYXQgbGVhc3QgMS5cclxuICAgICAqL1xyXG4gICAgZ2V0TWF4Wm9vbTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgem9vbUggPSBTbmFwRmxvb3IodGhpcy5wYXJlbnRTaXplLndpZHRoLCB0aGlzLmdhbWVTaXplLndpZHRoLCAwLCB0cnVlKTtcclxuICAgICAgICB2YXIgem9vbVYgPSBTbmFwRmxvb3IodGhpcy5wYXJlbnRTaXplLmhlaWdodCwgdGhpcy5nYW1lU2l6ZS5oZWlnaHQsIDAsIHRydWUpO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHpvb21ILCB6b29tViksIDEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgdGhlIGNhbnZhcyBDU1Mgc3R5bGUgaW4gb3JkZXIgdG8gY2VudGVyIGl0IHdpdGhpbiB0aGVcclxuICAgICAqIGJvdW5kcyBvZiBpdHMgcGFyZW50LiBJZiB5b3UgaGF2ZSBleHBsaWNpdGx5IHNldCBwYXJlbnQgdG8gYmUgYG51bGxgIGluIHlvdXJcclxuICAgICAqIGdhbWUgY29uZmlnIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBsaWtlbHkgZ2l2ZSBpbmNvcnJlY3QgcmVzdWx0cyB1bmxlc3MgeW91IGhhdmUgY2FsbGVkIHRoZVxyXG4gICAgICogYHNldFBhcmVudFNpemVgIG1ldGhvZCBmaXJzdC5cclxuICAgICAqIFxyXG4gICAgICogSXQgd29ya3MgYnkgbW9kaWZ5aW5nIHRoZSBjYW52YXMgQ1NTIGBtYXJnaW5MZWZ0YCBhbmQgYG1hcmdpblRvcGAgcHJvcGVydGllcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbiBzZXQgYnkgeW91ciBvd24gc3R5bGUgc2hlZXQsIG9yIGNvZGUsIHRoaXMgd2lsbCBvdmVyd3JpdGUgdGhlbS5cclxuICAgICAqIFxyXG4gICAgICogVG8gcHJldmVudCB0aGUgU2NhbGUgTWFuYWdlciBmcm9tIGNlbnRlcmluZyB0aGUgY2FudmFzLCBlaXRoZXIgZG8gbm90IHNldCB0aGVcclxuICAgICAqIGBhdXRvQ2VudGVyYCBwcm9wZXJ0eSBpbiB5b3VyIGdhbWUgY29uZmlnLCBvciBtYWtlIHN1cmUgaXQgaXMgc2V0IHRvIGBOT19DRU5URVJgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciN1cGRhdGVDZW50ZXJcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlQ2VudGVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhdXRvQ2VudGVyID0gdGhpcy5hdXRvQ2VudGVyO1xyXG5cclxuICAgICAgICBpZiAoYXV0b0NlbnRlciA9PT0gQ09OU1QuQ0VOVEVSLk5PX0NFTlRFUilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcclxuXHJcbiAgICAgICAgdmFyIHN0eWxlID0gY2FudmFzLnN0eWxlO1xyXG5cclxuICAgICAgICB2YXIgYm91bmRzID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyB2YXIgd2lkdGggPSBwYXJzZUludChjYW52YXMuc3R5bGUud2lkdGgsIDEwKSB8fCBjYW52YXMud2lkdGg7XHJcbiAgICAgICAgLy8gdmFyIGhlaWdodCA9IHBhcnNlSW50KGNhbnZhcy5zdHlsZS5oZWlnaHQsIDEwKSB8fCBjYW52YXMuaGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgd2lkdGggPSBib3VuZHMud2lkdGg7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBvZmZzZXRYID0gTWF0aC5mbG9vcigodGhpcy5wYXJlbnRTaXplLndpZHRoIC0gd2lkdGgpIC8gMik7XHJcbiAgICAgICAgdmFyIG9mZnNldFkgPSBNYXRoLmZsb29yKCh0aGlzLnBhcmVudFNpemUuaGVpZ2h0IC0gaGVpZ2h0KSAvIDIpO1xyXG5cclxuICAgICAgICBpZiAoYXV0b0NlbnRlciA9PT0gQ09OU1QuQ0VOVEVSLkNFTlRFUl9IT1JJWk9OVEFMTFkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvZmZzZXRZID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXV0b0NlbnRlciA9PT0gQ09OU1QuQ0VOVEVSLkNFTlRFUl9WRVJUSUNBTExZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2Zmc2V0WCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHlsZS5tYXJnaW5MZWZ0ID0gb2Zmc2V0WCArICdweCc7XHJcbiAgICAgICAgc3R5bGUubWFyZ2luVG9wID0gb2Zmc2V0WSArICdweCc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgYGNhbnZhc0JvdW5kc2AgcmVjdGFuZ2xlIHRvIG1hdGNoIHRoZSBib3VuZGluZyBjbGllbnQgcmVjdGFuZ2xlIG9mIHRoZVxyXG4gICAgICogY2FudmFzIGVsZW1lbnQgYmVpbmcgdXNlZCB0byB0cmFjayBpbnB1dCBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3VwZGF0ZUJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVCb3VuZHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuY2FudmFzQm91bmRzO1xyXG4gICAgICAgIHZhciBjbGllbnRSZWN0ID0gdGhpcy5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIGJvdW5kcy54ID0gY2xpZW50UmVjdC5sZWZ0ICsgKHdpbmRvdy5wYWdlWE9mZnNldCB8fCAwKSAtIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdCB8fCAwKTtcclxuICAgICAgICBib3VuZHMueSA9IGNsaWVudFJlY3QudG9wICsgKHdpbmRvdy5wYWdlWU9mZnNldCB8fCAwKSAtIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50VG9wIHx8IDApO1xyXG4gICAgICAgIGJvdW5kcy53aWR0aCA9IGNsaWVudFJlY3Qud2lkdGg7XHJcbiAgICAgICAgYm91bmRzLmhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYW5zZm9ybXMgdGhlIHBhZ2VYIHZhbHVlIGludG8gdGhlIHNjYWxlZCBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciN0cmFuc2Zvcm1YXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VYIC0gVGhlIERPTSBwYWdlWCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0cmFuc2xhdGVkIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICB0cmFuc2Zvcm1YOiBmdW5jdGlvbiAocGFnZVgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIChwYWdlWCAtIHRoaXMuY2FudmFzQm91bmRzLmxlZnQpICogdGhpcy5kaXNwbGF5U2NhbGUueDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFuc2Zvcm1zIHRoZSBwYWdlWSB2YWx1ZSBpbnRvIHRoZSBzY2FsZWQgY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgU2NhbGUgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjdHJhbnNmb3JtWVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlWSAtIFRoZSBET00gcGFnZVkgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHJhbnNsYXRlZCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgdHJhbnNmb3JtWTogZnVuY3Rpb24gKHBhZ2VZKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAocGFnZVkgLSB0aGlzLmNhbnZhc0JvdW5kcy50b3ApICogdGhpcy5kaXNwbGF5U2NhbGUueTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gdGhlIGJyb3dzZXIgdG8gYXNrIGl0IHRvIGdvIGluIHRvIGZ1bGwgc2NyZWVuIG1vZGUsIHVzaW5nIHRoZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Z1bGxzY3JlZW5fQVBJIEZ1bGxzY3JlZW4gQVBJfS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzLCBhIGBGVUxMU0NSRUVOX1VOU1VQUE9SVEVEYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIF9tdXN0XyBiZSBjYWxsZWQgZnJvbSBhIHVzZXItaW5wdXQgZ2VzdHVyZSwgc3VjaCBhcyBgcG9pbnRlcnVwYC4gWW91IGNhbm5vdCBsYXVuY2hcclxuICAgICAqIGdhbWVzIGZ1bGxzY3JlZW4gd2l0aG91dCB0aGlzLCBhcyBtb3N0IGJyb3dzZXJzIGJsb2NrIGl0LiBHYW1lcyB3aXRoaW4gYW4gaWZyYW1lIHdpbGwgYWxzbyBiZSBibG9ja2VkXHJcbiAgICAgKiBmcm9tIGZ1bGxzY3JlZW4gdW5sZXNzIHRoZSBpZnJhbWUgaGFzIHRoZSBgYWxsb3dmdWxsc2NyZWVuYCBhdHRyaWJ1dGUuXHJcbiAgICAgKiBcclxuICAgICAqIE9uIHRvdWNoIGRldmljZXMsIHN1Y2ggYXMgQW5kcm9pZCBhbmQgaU9TIFNhZmFyaSwgeW91IHNob3VsZCBhbHdheXMgdXNlIGBwb2ludGVydXBgIGFuZCBOT1QgYHBvaW50ZXJkb3duYCxcclxuICAgICAqIG90aGVyd2lzZSB0aGUgcmVxdWVzdCB3aWxsIGZhaWwgdW5sZXNzIHRoZSBkb2N1bWVudCBpbiB3aGljaCB5b3VyIGdhbWUgaXMgZW1iZWRkZWQgaGFzIGFscmVhZHkgcmVjZWl2ZWRcclxuICAgICAqIHNvbWUgZm9ybSBvZiB0b3VjaCBpbnB1dCwgd2hpY2ggeW91IGNhbm5vdCBndWFyYW50ZWUuIEFjdGl2YXRpbmcgZnVsbHNjcmVlbiB2aWEgYHBvaW50ZXJ1cGAgY2lyY3VtdmVudHNcclxuICAgICAqIHRoaXMgaXNzdWUuXHJcbiAgICAgKiBcclxuICAgICAqIFBlcmZvcm1pbmcgYW4gYWN0aW9uIHRoYXQgbmF2aWdhdGVzIHRvIGFub3RoZXIgcGFnZSwgb3Igb3BlbnMgYW5vdGhlciB0YWIsIHdpbGwgYXV0b21hdGljYWxseSBjYW5jZWxcclxuICAgICAqIGZ1bGxzY3JlZW4gbW9kZSwgYXMgd2lsbCB0aGUgdXNlciBwcmVzc2luZyB0aGUgRVNDIGtleS4gVG8gY2FuY2VsIGZ1bGxzY3JlZW4gbW9kZSBkaXJlY3RseSBmcm9tIHlvdXIgZ2FtZSxcclxuICAgICAqIGkuZS4gYnkgY2xpY2tpbmcgYW4gaWNvbiwgY2FsbCB0aGUgYHN0b3BGdWxsc2NyZWVuYCBtZXRob2QuXHJcbiAgICAgKiBcclxuICAgICAqIEEgYnJvd3NlciBjYW4gb25seSBzZW5kIG9uZSBET00gZWxlbWVudCBpbnRvIGZ1bGxzY3JlZW4uIFlvdSBjYW4gY29udHJvbCB3aGljaCBlbGVtZW50IHRoaXMgaXMgYnlcclxuICAgICAqIHNldHRpbmcgdGhlIGBmdWxsc2NyZWVuVGFyZ2V0YCBwcm9wZXJ0eSBpbiB5b3VyIGdhbWUgY29uZmlnLCBvciBjaGFuZ2luZyB0aGUgcHJvcGVydHkgaW4gdGhlIFNjYWxlIE1hbmFnZXIuXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhlIGdhbWUgY2FudmFzIF9tdXN0XyBiZSBhIGNoaWxkIG9mIHRoZSB0YXJnZXQuIElmIHlvdSBkbyBub3QgZ2l2ZSBhIHRhcmdldCwgUGhhc2VyIHdpbGxcclxuICAgICAqIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgYmxhbmsgYDxkaXY+YCBlbGVtZW50IGFuZCBtb3ZlIHRoZSBjYW52YXMgaW50byBpdCwgYmVmb3JlIGdvaW5nIGZ1bGxzY3JlZW4uXHJcbiAgICAgKiBXaGVuIGl0IGxlYXZlcyBmdWxsc2NyZWVuLCB0aGUgZGl2IHdpbGwgYmUgcmVtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjc3RhcnRGdWxsc2NyZWVuXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjYWxlLkV2ZW50cyNFTlRFUl9GVUxMU0NSRUVOXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjYWxlLkV2ZW50cyNGVUxMU0NSRUVOX0ZBSUxFRFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjRlVMTFNDUkVFTl9VTlNVUFBPUlRFRFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjUkVTSVpFXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZnVsbHNjcmVlbk9wdGlvbnNdIC0gVGhlIEZ1bGxzY3JlZW5PcHRpb25zIGRpY3Rpb25hcnkgaXMgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aGVuIGVudGVyaW5nIGZ1bGwgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICBzdGFydEZ1bGxzY3JlZW46IGZ1bmN0aW9uIChmdWxsc2NyZWVuT3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBpZiAoZnVsbHNjcmVlbk9wdGlvbnMgPT09IHVuZGVmaW5lZCkgeyBmdWxsc2NyZWVuT3B0aW9ucyA9IHsgbmF2aWdhdGlvblVJOiAnaGlkZScgfTsgfVxyXG5cclxuICAgICAgICB2YXIgZnVsbHNjcmVlbiA9IHRoaXMuZnVsbHNjcmVlbjtcclxuXHJcbiAgICAgICAgaWYgKCFmdWxsc2NyZWVuLmF2YWlsYWJsZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuRlVMTFNDUkVFTl9VTlNVUFBPUlRFRCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWZ1bGxzY3JlZW4uYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZzVGFyZ2V0ID0gdGhpcy5nZXRGdWxsc2NyZWVuVGFyZ2V0KCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZnNQcm9taXNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGZ1bGxzY3JlZW4ua2V5Ym9hcmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZzUHJvbWlzZSA9IGZzVGFyZ2V0W2Z1bGxzY3JlZW4ucmVxdWVzdF0oRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmc1Byb21pc2UgPSBmc1RhcmdldFtmdWxsc2NyZWVuLnJlcXVlc3RdKGZ1bGxzY3JlZW5PcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZzUHJvbWlzZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnNQcm9taXNlLnRoZW4odGhpcy5mdWxsc2NyZWVuU3VjY2Vzc0hhbmRsZXIuYmluZCh0aGlzKSkuY2F0Y2godGhpcy5mdWxsc2NyZWVuRXJyb3JIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZ1bGxzY3JlZW4uYWN0aXZlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5TdWNjZXNzSGFuZGxlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mdWxsc2NyZWVuRXJyb3JIYW5kbGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJyb3dzZXIgaGFzIHN1Y2Nlc3NmdWxseSBlbnRlcmVkIGZ1bGxzY3JlZW4gbW9kZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjZnVsbHNjcmVlblN1Y2Nlc3NIYW5kbGVyXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjRU5URVJfRlVMTFNDUkVFTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjUkVTSVpFXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKi9cclxuICAgIGZ1bGxzY3JlZW5TdWNjZXNzSGFuZGxlcjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdldFBhcmVudEJvdW5kcygpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5FTlRFUl9GVUxMU0NSRUVOKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYnJvd3NlciBmYWlsZWQgdG8gZW50ZXIgZnVsbHNjcmVlbiBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNmdWxsc2NyZWVuRXJyb3JIYW5kbGVyXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjRlVMTFNDUkVFTl9GQUlMRURcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI1JFU0laRVxyXG4gICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZXJyb3IgLSBUaGUgRE9NIGVycm9yIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBmdWxsc2NyZWVuRXJyb3JIYW5kbGVyOiBmdW5jdGlvbiAoZXJyb3IpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGdWxsc2NyZWVuVGFyZ2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuRlVMTFNDUkVFTl9GQUlMRUQsIGVycm9yKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBnZXRzIHRoZSB0YXJnZXQgZWxlbWVudCB0aGF0IGlzIHVzZWQgd2hlbiBlbnRlcmluZyBmdWxsc2NyZWVuIG1vZGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2dldEZ1bGxzY3JlZW5UYXJnZXRcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgZnVsbHNjcmVlbiB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgZ2V0RnVsbHNjcmVlblRhcmdldDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuZnVsbHNjcmVlblRhcmdldClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmc1RhcmdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAgICAgZnNUYXJnZXQuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICAgICAgICBmc1RhcmdldC5zdHlsZS5wYWRkaW5nID0gJzAnO1xyXG4gICAgICAgICAgICBmc1RhcmdldC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgZnNUYXJnZXQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mdWxsc2NyZWVuVGFyZ2V0ID0gZnNUYXJnZXQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkRnVsbHNjcmVlblRhcmdldCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fY3JlYXRlZEZ1bGxzY3JlZW5UYXJnZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FudmFzUGFyZW50ID0gdGhpcy5jYW52YXMucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIGNhbnZhc1BhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5mdWxsc2NyZWVuVGFyZ2V0LCB0aGlzLmNhbnZhcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5UYXJnZXQuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVsbHNjcmVlblRhcmdldDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBmdWxsc2NyZWVuIHRhcmdldCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgRE9NLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNyZW1vdmVGdWxsc2NyZWVuVGFyZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUZ1bGxzY3JlZW5UYXJnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NyZWF0ZWRGdWxsc2NyZWVuVGFyZ2V0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZzVGFyZ2V0ID0gdGhpcy5mdWxsc2NyZWVuVGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKGZzVGFyZ2V0ICYmIGZzVGFyZ2V0LnBhcmVudE5vZGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBmc1RhcmdldC5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5jYW52YXMsIGZzVGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZnNUYXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjYW5jZWwgZnVsbHNjcmVlbiBtb2RlLCBpZiB0aGUgYnJvd3NlciBoYXMgZW50ZXJlZCBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjc3RvcEZ1bGxzY3JlZW5cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI0xFQVZFX0ZVTExTQ1JFRU5cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NhbGUuRXZlbnRzI0ZVTExTQ1JFRU5fVU5TVVBQT1JURURcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgc3RvcEZ1bGxzY3JlZW46IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGZ1bGxzY3JlZW4gPSB0aGlzLmZ1bGxzY3JlZW47XHJcblxyXG4gICAgICAgIGlmICghZnVsbHNjcmVlbi5hdmFpbGFibGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkZVTExTQ1JFRU5fVU5TVVBQT1JURUQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZ1bGxzY3JlZW4uYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZG9jdW1lbnRbZnVsbHNjcmVlbi5jYW5jZWxdKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlbW92ZUZ1bGxzY3JlZW5UYXJnZXQoKTtcclxuXHJcbiAgICAgICAgLy8gIEdldCB0aGUgcGFyZW50IHNpemUgYWdhaW4gYXMgaXQgd2lsbCBoYXZlIGNoYW5nZWRcclxuICAgICAgICB0aGlzLmdldFBhcmVudEJvdW5kcygpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkxFQVZFX0ZVTExTQ1JFRU4pO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2dnbGVzIHRoZSBmdWxsc2NyZWVuIG1vZGUuIElmIGFscmVhZHkgaW4gZnVsbHNjcmVlbiwgY2FsbGluZyB0aGlzIHdpbGwgY2FuY2VsIGl0LlxyXG4gICAgICogSWYgbm90IGluIGZ1bGxzY3JlZW4sIHRoaXMgd2lsbCByZXF1ZXN0IHRoZSBicm93c2VyIHRvIGVudGVyIGZ1bGxzY3JlZW4gbW9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzLCBhIGBGVUxMU0NSRUVOX1VOU1VQUE9SVEVEYCBldmVudCB3aWxsIGJlIGVtaXR0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIF9tdXN0XyBiZSBjYWxsZWQgZnJvbSBhIHVzZXItaW5wdXQgZ2VzdHVyZSwgc3VjaCBhcyBgcG9pbnRlcmRvd25gLiBZb3UgY2Fubm90IGxhdW5jaFxyXG4gICAgICogZ2FtZXMgZnVsbHNjcmVlbiB3aXRob3V0IHRoaXMsIGFzIG1vc3QgYnJvd3NlcnMgYmxvY2sgaXQuIEdhbWVzIHdpdGhpbiBhbiBpZnJhbWUgd2lsbCBhbHNvIGJlIGJsb2NrZWRcclxuICAgICAqIGZyb20gZnVsbHNjcmVlbiB1bmxlc3MgdGhlIGlmcmFtZSBoYXMgdGhlIGBhbGxvd2Z1bGxzY3JlZW5gIGF0dHJpYnV0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjdG9nZ2xlRnVsbHNjcmVlblxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjRU5URVJfRlVMTFNDUkVFTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjTEVBVkVfRlVMTFNDUkVFTlxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjRlVMTFNDUkVFTl9VTlNVUFBPUlRFRFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2FsZS5FdmVudHMjUkVTSVpFXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZnVsbHNjcmVlbk9wdGlvbnNdIC0gVGhlIEZ1bGxzY3JlZW5PcHRpb25zIGRpY3Rpb25hcnkgaXMgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3aGVuIGVudGVyaW5nIGZ1bGwgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICB0b2dnbGVGdWxsc2NyZWVuOiBmdW5jdGlvbiAoZnVsbHNjcmVlbk9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbHNjcmVlbi5hY3RpdmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRGdWxsc2NyZWVuKGZ1bGxzY3JlZW5PcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gaW50ZXJuYWwgbWV0aG9kIHRoYXQgc3RhcnRzIHRoZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycyBydW5uaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNzdGFydExpc3RlbmVyc1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBzdGFydExpc3RlbmVyczogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuXHJcbiAgICAgICAgbGlzdGVuZXJzLm9yaWVudGF0aW9uQ2hhbmdlID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF90aGlzLl9jaGVja09yaWVudGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxpc3RlbmVycy53aW5kb3dSZXNpemUgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX3RoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vICBPbmx5IGRpc3BhdGNoZWQgb24gbW9iaWxlIGRldmljZXNcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCBsaXN0ZW5lcnMub3JpZW50YXRpb25DaGFuZ2UsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGxpc3RlbmVycy53aW5kb3dSZXNpemUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZnVsbHNjcmVlbi5hdmFpbGFibGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuZnVsbFNjcmVlbkNoYW5nZSA9IGZ1bmN0aW9uIChldmVudClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uRnVsbFNjcmVlbkNoYW5nZShldmVudCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBsaXN0ZW5lcnMuZnVsbFNjcmVlbkVycm9yID0gZnVuY3Rpb24gKGV2ZW50KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMub25GdWxsU2NyZWVuRXJyb3IoZXZlbnQpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIHZlbmRvcnMgPSBbICd3ZWJraXQnLCAnbW96JywgJycgXTtcclxuXHJcbiAgICAgICAgICAgIHZlbmRvcnMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHByZWZpeCArICdmdWxsc2NyZWVuY2hhbmdlJywgbGlzdGVuZXJzLmZ1bGxTY3JlZW5DaGFuZ2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIocHJlZml4ICsgJ2Z1bGxzY3JlZW5lcnJvcicsIGxpc3RlbmVycy5mdWxsU2NyZWVuRXJyb3IsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgTVMgU3BlY2lmaWNcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuQ2hhbmdlJywgbGlzdGVuZXJzLmZ1bGxTY3JlZW5DaGFuZ2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuRXJyb3InLCBsaXN0ZW5lcnMuZnVsbFNjcmVlbkVycm9yLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgZnVsbHNjcmVlbmNoYW5nZSBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBET00uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI29uRnVsbFNjcmVlbkNoYW5nZVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBvbkZ1bGxTY3JlZW5DaGFuZ2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFRoZXkgcHJlc3NlZCBFU0Mgd2hpbGUgaW4gZnVsbHNjcmVlbiBtb2RlXHJcbiAgICAgICAgaWYgKCEoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgZnVsbHNjcmVlbmVycm9yIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIERPTS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjb25GdWxsU2NyZWVuRXJyb3JcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgb25GdWxsU2NyZWVuRXJyb3I6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGdWxsc2NyZWVuVGFyZ2V0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kLCBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2FtZSBzdGVwLlxyXG4gICAgICogTW9uaXRvcnMgdGhlIGVsYXBzZWQgdGltZSBhbmQgcmVzaXplIGludGVydmFsIHRvIHNlZSBpZiBhIHBhcmVudCBib3VuZHMgY2hlY2sgbmVlZHMgdG8gdGFrZSBwbGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjc3RlcFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIHRpbWUgdmFsdWUgZnJvbSB0aGUgbW9zdCByZWNlbnQgR2FtZSBzdGVwLiBUeXBpY2FsbHkgYSBoaWdoLXJlc29sdXRpb24gdGltZXIgdmFsdWUsIG9yIERhdGUubm93KCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdmFsdWUgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgc21vb3RoZWQgdG8gYXZvaWQgZGVsdGEgc3Bpa2VzIGJ5IHRoZSBUaW1lU3RlcCBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgc3RlcDogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9sYXN0Q2hlY2sgKz0gZGVsdGE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpcnR5IHx8IHRoaXMuX2xhc3RDaGVjayA+IHRoaXMucmVzaXplSW50ZXJ2YWwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJlbnQgYm91bmRzIGhhdmUgY2hhbmdlZCBzaXplXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFBhcmVudEJvdW5kcygpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0Q2hlY2sgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbGwgRE9NIGV2ZW50IGxpc3RlbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjc3RvcExpc3RlbmVyc1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBzdG9wTGlzdGVuZXJzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcclxuXHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgbGlzdGVuZXJzLm9yaWVudGF0aW9uQ2hhbmdlLCBmYWxzZSk7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGxpc3RlbmVycy53aW5kb3dSZXNpemUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdmFyIHZlbmRvcnMgPSBbICd3ZWJraXQnLCAnbW96JywgJycgXTtcclxuXHJcbiAgICAgICAgdmVuZG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHByZWZpeCArICdmdWxsc2NyZWVuY2hhbmdlJywgbGlzdGVuZXJzLmZ1bGxTY3JlZW5DaGFuZ2UsIGZhbHNlKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihwcmVmaXggKyAnZnVsbHNjcmVlbmVycm9yJywgbGlzdGVuZXJzLmZ1bGxTY3JlZW5FcnJvciwgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyAgTVMgU3BlY2lmaWNcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCBsaXN0ZW5lcnMuZnVsbFNjcmVlbkNoYW5nZSwgZmFsc2UpO1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkVycm9yJywgbGlzdGVuZXJzLmZ1bGxTY3JlZW5FcnJvciwgZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgU2NhbGUgTWFuYWdlciwgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHJlc291cmNlcy5cclxuICAgICAqIE9uY2UgZGVzdHJveWVkLCB0aGUgU2NhbGUgTWFuYWdlciBjYW5ub3QgYmUgdXNlZCBhZ2Fpbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RvcExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNhbnZhc0JvdW5kcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlblRhcmdldCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50U2l6ZS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5nYW1lU2l6ZS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5iYXNlU2l6ZS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZS5kZXN0cm95KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhlIGJyb3dzZXIgY3VycmVudGx5IGluIGZ1bGxzY3JlZW4gbW9kZSBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNpc0Z1bGxzY3JlZW5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIGlzRnVsbHNjcmVlbjoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mdWxsc2NyZWVuLmFjdGl2ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2FtZSB3aWR0aC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHNpemUgZ2l2ZW4gaW4gdGhlIGdhbWUgY29uZmlndXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI3dpZHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIHdpZHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdhbWVTaXplLndpZHRoO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBnYW1lIGhlaWdodC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHNpemUgZ2l2ZW4gaW4gdGhlIGdhbWUgY29uZmlndXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyI2hlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZVNpemUuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoZSBkZXZpY2UgaW4gYSBwb3J0cmFpdCBvcmllbnRhdGlvbiBhcyByZXBvcnRlZCBieSB0aGUgT3JpZW50YXRpb24gQVBJP1xyXG4gICAgICogVGhpcyB2YWx1ZSBpcyB1c3VhbGx5IG9ubHkgYXZhaWxhYmxlIG9uIG1vYmlsZSBkZXZpY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjaXNQb3J0cmFpdFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgaXNQb3J0cmFpdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMub3JpZW50YXRpb24gPT09IENPTlNULk9SSUVOVEFUSU9OLlBPUlRSQUlUKTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgZGV2aWNlIGluIGEgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGFzIHJlcG9ydGVkIGJ5IHRoZSBPcmllbnRhdGlvbiBBUEk/XHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIHVzdWFsbHkgb25seSBhdmFpbGFibGUgb24gbW9iaWxlIGRldmljZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNpc0xhbmRzY2FwZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgaXNMYW5kc2NhcGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLm9yaWVudGF0aW9uID09PSBDT05TVC5PUklFTlRBVElPTi5MQU5EU0NBUEUpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyZSB0aGUgZ2FtZSBkaW1lbnNpb25zIHBvcnRyYWl0PyAoaS5lLiB0YWxsZXIgdGhhbiB0aGV5IGFyZSB3aWRlKVxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIGRpZmZlcmVudCB0byB0aGUgZGV2aWNlIGl0c2VsZiBiZWluZyBpbiBhIHBvcnRyYWl0IG9yaWVudGF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXIjaXNHYW1lUG9ydHJhaXRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIGlzR2FtZVBvcnRyYWl0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5oZWlnaHQgPiB0aGlzLndpZHRoKTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgdGhlIGdhbWUgZGltZW5zaW9ucyBsYW5kc2NhcGU/IChpLmUuIHdpZGVyIHRoYW4gdGhleSBhcmUgdGFsbClcclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlIGRldmljZSBpdHNlbGYgYmVpbmcgaW4gYSBsYW5kc2NhcGUgb3JpZW50YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTWFuYWdlciNpc0dhbWVMYW5kc2NhcGVcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIGlzR2FtZUxhbmRzY2FwZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMud2lkdGggPiB0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2NhbGVNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQaGFzZXIgU2NhbGUgTWFuYWdlciBjb25zdGFudHMgZm9yIGNlbnRlcmluZyB0aGUgZ2FtZSBjYW52YXMuXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5TY2FsZS5DZW50ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2FsZVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBoYXNlciBTY2FsZSBNYW5hZ2VyIGNvbnN0YW50cyBmb3IgY2VudGVyaW5nIHRoZSBnYW1lIGNhbnZhcy5cclxuICogXHJcbiAqIFRvIGZpbmQgb3V0IHdoYXQgZWFjaCBtb2RlIGRvZXMgcGxlYXNlIHNlZSBbUGhhc2VyLlNjYWxlLkNlbnRlcl17QGxpbmsgUGhhc2VyLlNjYWxlLkNlbnRlcn0uXHJcbiAqIFxyXG4gKiBAdHlwZWRlZiB7UGhhc2VyLlNjYWxlLkNlbnRlcn0gUGhhc2VyLlNjYWxlLkNlbnRlclR5cGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2FsZVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2FtZSBjYW52YXMgaXMgbm90IGNlbnRlcmVkIHdpdGhpbiB0aGUgcGFyZW50IGJ5IFBoYXNlci5cclxuICAgICAqIFlvdSBjYW4gc3RpbGwgY2VudGVyIGl0IHlvdXJzZWxmIHZpYSBDU1MuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5DZW50ZXIuTk9fQ0VOVEVSXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBOT19DRU5URVI6IDAsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2FtZSBjYW52YXMgaXMgY2VudGVyZWQgYm90aCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkgd2l0aGluIHRoZSBwYXJlbnQuXHJcbiAgICAgKiBUbyBkbyB0aGlzLCB0aGUgcGFyZW50IGhhcyB0byBoYXZlIGEgYm91bmRzIHRoYXQgY2FuIGJlIGNhbGN1bGF0ZWQgYW5kIG5vdCBiZSBlbXB0eS5cclxuICAgICAqIFxyXG4gICAgICogQ2VudGVyaW5nIGlzIGFjaGlldmVkIGJ5IHNldHRpbmcgdGhlIG1hcmdpbiBsZWZ0IGFuZCB0b3AgcHJvcGVydGllcyBvZiB0aGVcclxuICAgICAqIGdhbWUgY2FudmFzLCBhbmQgZG9lcyBub3QgZmFjdG9yIGluIGFueSBvdGhlciBDU1Mgc3R5bGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuQ2VudGVyLkNFTlRFUl9CT1RIXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBDRU5URVJfQk9USDogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBnYW1lIGNhbnZhcyBpcyBjZW50ZXJlZCBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBwYXJlbnQuXHJcbiAgICAgKiBUbyBkbyB0aGlzLCB0aGUgcGFyZW50IGhhcyB0byBoYXZlIGEgYm91bmRzIHRoYXQgY2FuIGJlIGNhbGN1bGF0ZWQgYW5kIG5vdCBiZSBlbXB0eS5cclxuICAgICAqIFxyXG4gICAgICogQ2VudGVyaW5nIGlzIGFjaGlldmVkIGJ5IHNldHRpbmcgdGhlIG1hcmdpbiBsZWZ0IGFuZCB0b3AgcHJvcGVydGllcyBvZiB0aGVcclxuICAgICAqIGdhbWUgY2FudmFzLCBhbmQgZG9lcyBub3QgZmFjdG9yIGluIGFueSBvdGhlciBDU1Mgc3R5bGVzIHlvdSBtYXkgaGF2ZSBhcHBsaWVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuQ2VudGVyLkNFTlRFUl9IT1JJWk9OVEFMTFlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIENFTlRFUl9IT1JJWk9OVEFMTFk6IDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2FtZSBjYW52YXMgaXMgY2VudGVyZWQgYm90aCB2ZXJ0aWNhbGx5IHdpdGhpbiB0aGUgcGFyZW50LlxyXG4gICAgICogVG8gZG8gdGhpcywgdGhlIHBhcmVudCBoYXMgdG8gaGF2ZSBhIGJvdW5kcyB0aGF0IGNhbiBiZSBjYWxjdWxhdGVkIGFuZCBub3QgYmUgZW1wdHkuXHJcbiAgICAgKiBcclxuICAgICAqIENlbnRlcmluZyBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIHRoZSBtYXJnaW4gbGVmdCBhbmQgdG9wIHByb3BlcnRpZXMgb2YgdGhlXHJcbiAgICAgKiBnYW1lIGNhbnZhcywgYW5kIGRvZXMgbm90IGZhY3RvciBpbiBhbnkgb3RoZXIgQ1NTIHN0eWxlcyB5b3UgbWF5IGhhdmUgYXBwbGllZC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLkNlbnRlci5DRU5URVJfVkVSVElDQUxMWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgQ0VOVEVSX1ZFUlRJQ0FMTFk6IDNcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBoYXNlciBTY2FsZSBNYW5hZ2VyIGNvbnN0YW50cyBmb3Igb3JpZW50YXRpb24uXHJcbiAqIFxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5TY2FsZS5PcmllbnRhdGlvblxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlNjYWxlXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICovXHJcblxyXG4vKipcclxuICogUGhhc2VyIFNjYWxlIE1hbmFnZXIgY29uc3RhbnRzIGZvciBvcmllbnRhdGlvbi5cclxuICogXHJcbiAqIFRvIGZpbmQgb3V0IHdoYXQgZWFjaCBtb2RlIGRvZXMgcGxlYXNlIHNlZSBbUGhhc2VyLlNjYWxlLk9yaWVudGF0aW9uXXtAbGluayBQaGFzZXIuU2NhbGUuT3JpZW50YXRpb259LlxyXG4gKiBcclxuICogQHR5cGVkZWYge1BoYXNlci5TY2FsZS5PcmllbnRhdGlvbn0gUGhhc2VyLlNjYWxlLk9yaWVudGF0aW9uVHlwZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlNjYWxlXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgbGFuZHNjYXBlIG9yaWVudGF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuT3JpZW50YXRpb24uTEFORFNDQVBFXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIExBTkRTQ0FQRTogJ2xhbmRzY2FwZS1wcmltYXJ5JyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcG9ydHJhaXQgb3JpZW50YXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5PcmllbnRhdGlvbi5QT1JUUkFJVFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBQT1JUUkFJVDogJ3BvcnRyYWl0LXByaW1hcnknXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQaGFzZXIgU2NhbGUgTWFuYWdlciBjb25zdGFudHMgZm9yIHRoZSBkaWZmZXJlbnQgc2NhbGUgbW9kZXMgYXZhaWxhYmxlLlxyXG4gKiBcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuU2NhbGUuU2NhbGVNb2Rlc1xyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlNjYWxlXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICovXHJcblxyXG4vKipcclxuICogUGhhc2VyIFNjYWxlIE1hbmFnZXIgY29uc3RhbnRzIGZvciB0aGUgZGlmZmVyZW50IHNjYWxlIG1vZGVzIGF2YWlsYWJsZS5cclxuICogXHJcbiAqIFRvIGZpbmQgb3V0IHdoYXQgZWFjaCBtb2RlIGRvZXMgcGxlYXNlIHNlZSBbUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXNde0BsaW5rIFBoYXNlci5TY2FsZS5TY2FsZU1vZGVzfS5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtQaGFzZXIuU2NhbGUuU2NhbGVNb2Rlc30gUGhhc2VyLlNjYWxlLlNjYWxlTW9kZVR5cGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2FsZVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBObyBzY2FsaW5nIGhhcHBlbnMgYXQgYWxsLiBUaGUgY2FudmFzIGlzIHNldCB0byB0aGUgc2l6ZSBnaXZlbiBpbiB0aGUgZ2FtZSBjb25maWcgYW5kIFBoYXNlciBkb2Vzbid0IGNoYW5nZSBpdFxyXG4gICAgICogYWdhaW4gZnJvbSB0aGF0IHBvaW50IG9uLiBJZiB5b3UgY2hhbmdlIHRoZSBjYW52YXMgc2l6ZSwgZWl0aGVyIHZpYSBDU1MsIG9yIGRpcmVjdGx5IHZpYSBjb2RlLCB0aGVuIHlvdSBuZWVkXHJcbiAgICAgKiB0byBjYWxsIHRoZSBTY2FsZSBNYW5hZ2VycyBgcmVzaXplYCBtZXRob2QgdG8gZ2l2ZSB0aGUgbmV3IGRpbWVuc2lvbnMsIG9yIGlucHV0IGV2ZW50cyB3aWxsIHN0b3Agd29ya2luZy5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuTk9ORVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgTk9ORTogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgaXMgYXV0b21hdGljYWxseSBhZGp1c3RlZCBiYXNlZCBvbiB0aGUgd2lkdGguXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5TY2FsZU1vZGVzLldJRFRIX0NPTlRST0xTX0hFSUdIVFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgV0lEVEhfQ09OVFJPTFNfSEVJR0hUOiAxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGhlaWdodC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuSEVJR0hUX0NPTlRST0xTX1dJRFRIXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBIRUlHSFRfQ09OVFJPTFNfV0lEVEg6IDIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYXV0b21hdGljYWxseSBhZGp1c3RlZCB0byBmaXQgaW5zaWRlIHRoZSBnaXZlbiB0YXJnZXQgYXJlYSxcclxuICAgICAqIHdoaWxlIGtlZXBpbmcgdGhlIGFzcGVjdCByYXRpby4gRGVwZW5kaW5nIG9uIHRoZSBhc3BlY3QgcmF0aW8gdGhlcmUgbWF5IGJlIHNvbWUgc3BhY2VcclxuICAgICAqIGluc2lkZSB0aGUgYXJlYSB3aGljaCBpcyBub3QgY292ZXJlZC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuRklUXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBGSVQ6IDMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYXV0b21hdGljYWxseSBhZGp1c3RlZCB0byBtYWtlIHRoZSBzaXplIGNvdmVyIHRoZSBlbnRpcmUgdGFyZ2V0XHJcbiAgICAgKiBhcmVhIHdoaWxlIGtlZXBpbmcgdGhlIGFzcGVjdCByYXRpby4gVGhpcyBtYXkgZXh0ZW5kIGZ1cnRoZXIgb3V0IHRoYW4gdGhlIHRhcmdldCBzaXplLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuU2NhbGVNb2Rlcy5FTlZFTE9QXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBFTlZFTE9QOiA0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIENhbnZhcyBpcyByZXNpemVkIHRvIGZpdCBhbGwgYXZhaWxhYmxlIF9wYXJlbnRfIHNwYWNlLCByZWdhcmRsZXNzIG9mIGFzcGVjdCByYXRpby5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuUkVTSVpFXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBSRVNJWkU6IDVcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBoYXNlciBTY2FsZSBNYW5hZ2VyIGNvbnN0YW50cyBmb3Igem9vbSBtb2Rlcy5cclxuICogXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlNjYWxlLlpvb21cclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2FsZVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBoYXNlciBTY2FsZSBNYW5hZ2VyIGNvbnN0YW50cyBmb3Igem9vbSBtb2Rlcy5cclxuICogXHJcbiAqIFRvIGZpbmQgb3V0IHdoYXQgZWFjaCBtb2RlIGRvZXMgcGxlYXNlIHNlZSBbUGhhc2VyLlNjYWxlLlpvb21de0BsaW5rIFBoYXNlci5TY2FsZS5ab29tfS5cclxuICogXHJcbiAqIEB0eXBlZGVmIHtQaGFzZXIuU2NhbGUuWm9vbX0gUGhhc2VyLlNjYWxlLlpvb21UeXBlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU2NhbGVcclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGdhbWUgY2FudmFzIHdpbGwgbm90IGJlIHpvb21lZCBieSBQaGFzZXIuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5ab29tLk5PX1pPT01cclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKi9cclxuICAgIE5PX1pPT006IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ2FtZSBjYW52YXMgd2lsbCBiZSAyeCB6b29tZWQgYnkgUGhhc2VyLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NhbGUuWm9vbS5aT09NXzJYXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBaT09NXzJYOiAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGdhbWUgY2FudmFzIHdpbGwgYmUgNHggem9vbWVkIGJ5IFBoYXNlci5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjYWxlLlpvb20uWk9PTV80WFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAY29uc3RcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgWk9PTV80WDogNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSB0aGUgem9vbSB2YWx1ZSBiYXNlZCBvbiB0aGUgbWF4aW11bSBtdWx0aXBsaWVkIGdhbWUgc2l6ZSB0aGF0IHdpbGxcclxuICAgICAqIGZpdCBpbnRvIHRoZSBwYXJlbnQsIG9yIGJyb3dzZXIgd2luZG93IGlmIG5vIHBhcmVudCBpcyBzZXQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2FsZS5ab29tLk1BWF9aT09NXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBNQVhfWk9PTTogLTFcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0ge1xyXG5cclxuICAgIENFTlRFUjogcmVxdWlyZSgnLi9DRU5URVJfQ09OU1QnKSxcclxuICAgIE9SSUVOVEFUSU9OOiByZXF1aXJlKCcuL09SSUVOVEFUSU9OX0NPTlNUJyksXHJcbiAgICBTQ0FMRV9NT0RFOiByZXF1aXJlKCcuL1NDQUxFX01PREVfQ09OU1QnKSxcclxuICAgIFpPT006IHJlcXVpcmUoJy4vWk9PTV9DT05TVCcpXHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDT05TVDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjYWxlIE1hbmFnZXIgaGFzIHN1Y2Nlc3NmdWxseSBlbnRlcmVkIGZ1bGxzY3JlZW4gbW9kZS5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5TY2FsZS5FdmVudHMjRU5URVJfRlVMTFNDUkVFTlxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdlbnRlcmZ1bGxzY3JlZW4nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NhbGUgTWFuYWdlciB0cmllZCB0byBlbnRlciBmdWxsc2NyZWVuIG1vZGUgYnV0IGZhaWxlZC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5TY2FsZS5FdmVudHMjRlVMTFNDUkVFTl9GQUlMRURcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZnVsbHNjcmVlbmZhaWxlZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2FsZSBNYW5hZ2VyIHRyaWVkIHRvIGVudGVyIGZ1bGxzY3JlZW4gbW9kZSwgYnV0IGl0IGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjYWxlLkV2ZW50cyNGVUxMU0NSRUVOX1VOU1VQUE9SVEVEXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Z1bGxzY3JlZW51bnN1cHBvcnRlZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2FsZSBNYW5hZ2VyIHdhcyBpbiBmdWxsc2NyZWVuIG1vZGUsIGJ1dCBoYXMgc2luY2UgbGVmdCwgZWl0aGVyIGRpcmVjdGx5IHZpYSBnYW1lIGNvZGUsXHJcbiAqIG9yIHZpYSBhIHVzZXIgZ2VzdHVyZWQsIHN1Y2ggYXMgcHJlc3NpbmcgdGhlIEVTQyBrZXkuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU2NhbGUuRXZlbnRzI0xFQVZFX0ZVTExTQ1JFRU5cclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnbGVhdmVmdWxsc2NyZWVuJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjYWxlIE1hbmFnZXIgT3JpZW50YXRpb24gQ2hhbmdlIEV2ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjYWxlLkV2ZW50cyNPUklFTlRBVElPTl9DSEFOR0VcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWVudGF0aW9uIC0gXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdvcmllbnRhdGlvbmNoYW5nZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2FsZSBNYW5hZ2VyIFJlc2l6ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuZXZlciB0aGUgU2NhbGUgTWFuYWdlciBkZXRlY3RzIGEgcmVzaXplIGV2ZW50IGZyb20gdGhlIGJyb3dzZXIuXHJcbiAqIEl0IHNlbmRzIHRocmVlIHBhcmFtZXRlcnMgdG8gdGhlIGNhbGxiYWNrLCBlYWNoIG9mIHRoZW0gYmVpbmcgU2l6ZSBjb21wb25lbnRzLiBZb3UgY2FuIHJlYWRcclxuICogdGhlIGB3aWR0aGAsIGBoZWlnaHRgLCBgYXNwZWN0UmF0aW9gIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZXNlIGNvbXBvbmVudHMgdG8gaGVscCB3aXRoXHJcbiAqIHNjYWxpbmcgeW91ciBvd24gZ2FtZSBjb250ZW50LlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjYWxlLkV2ZW50cyNSRVNJWkVcclxuICogQHNpbmNlIDMuMTYuMVxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU3RydWN0cy5TaXplfSBnYW1lU2l6ZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBHYW1lIFNpemUgY29tcG9uZW50LiBUaGlzIGlzIHRoZSB1bi1zY2FsZWQgc2l6ZSBvZiB5b3VyIGdhbWUgY2FudmFzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNpemV9IGJhc2VTaXplIC0gQSByZWZlcmVuY2UgdG8gdGhlIEJhc2UgU2l6ZSBjb21wb25lbnQuIFRoaXMgaXMgdGhlIGdhbWUgc2l6ZSBtdWx0aXBsaWVkIGJ5IHJlc29sdXRpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlN0cnVjdHMuU2l6ZX0gZGlzcGxheVNpemUgLSBBIHJlZmVyZW5jZSB0byB0aGUgRGlzcGxheSBTaXplIGNvbXBvbmVudC4gVGhpcyBpcyB0aGUgc2NhbGVkIGNhbnZhcyBzaXplLCBhZnRlciBhcHBseWluZyB6b29tIGFuZCBzY2FsZSBtb2RlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFRoZSBjdXJyZW50IHJlc29sdXRpb24uIERlZmF1bHRzIHRvIDEgYXQgdGhlIG1vbWVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHByZXZpb3VzV2lkdGggLSBJZiB0aGUgYGdhbWVTaXplYCBoYXMgY2hhbmdlZCwgdGhpcyB2YWx1ZSBjb250YWlucyBpdHMgcHJldmlvdXMgd2lkdGgsIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgY3VycmVudCB3aWR0aC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHByZXZpb3VzSGVpZ2h0IC0gSWYgdGhlIGBnYW1lU2l6ZWAgaGFzIGNoYW5nZWQsIHRoaXMgdmFsdWUgY29udGFpbnMgaXRzIHByZXZpb3VzIGhlaWdodCwgb3RoZXJ3aXNlIGl0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGhlaWdodC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Jlc2l6ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlNjYWxlLkV2ZW50c1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEVOVEVSX0ZVTExTQ1JFRU46IHJlcXVpcmUoJy4vRU5URVJfRlVMTFNDUkVFTl9FVkVOVCcpLFxyXG4gICAgRlVMTFNDUkVFTl9GQUlMRUQ6IHJlcXVpcmUoJy4vRlVMTFNDUkVFTl9GQUlMRURfRVZFTlQnKSxcclxuICAgIEZVTExTQ1JFRU5fVU5TVVBQT1JURUQ6IHJlcXVpcmUoJy4vRlVMTFNDUkVFTl9VTlNVUFBPUlRFRF9FVkVOVCcpLFxyXG4gICAgTEVBVkVfRlVMTFNDUkVFTjogcmVxdWlyZSgnLi9MRUFWRV9GVUxMU0NSRUVOX0VWRU5UJyksXHJcbiAgICBPUklFTlRBVElPTl9DSEFOR0U6IHJlcXVpcmUoJy4vT1JJRU5UQVRJT05fQ0hBTkdFX0VWRU5UJyksXHJcbiAgICBSRVNJWkU6IHJlcXVpcmUoJy4vUkVTSVpFX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlNjYWxlXHJcbiAqIFxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuQ2VudGVyLk5PX0NFTlRFUiBhcyBOT19DRU5URVJcclxuICogQGJvcnJvd3MgUGhhc2VyLlNjYWxlLkNlbnRlci5DRU5URVJfQk9USCBhcyBDRU5URVJfQk9USFxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuQ2VudGVyLkNFTlRFUl9IT1JJWk9OVEFMTFkgYXMgQ0VOVEVSX0hPUklaT05UQUxMWVxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuQ2VudGVyLkNFTlRFUl9WRVJUSUNBTExZIGFzIENFTlRFUl9WRVJUSUNBTExZXHJcbiAqIFxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuT3JpZW50YXRpb24uTEFORFNDQVBFIGFzIExBTkRTQ0FQRVxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuT3JpZW50YXRpb24uUE9SVFJBSVQgYXMgUE9SVFJBSVRcclxuICogXHJcbiAqIEBib3Jyb3dzIFBoYXNlci5TY2FsZS5TY2FsZU1vZGVzLk5PTkUgYXMgTk9ORVxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuU2NhbGVNb2Rlcy5XSURUSF9DT05UUk9MU19IRUlHSFQgYXMgV0lEVEhfQ09OVFJPTFNfSEVJR0hUXHJcbiAqIEBib3Jyb3dzIFBoYXNlci5TY2FsZS5TY2FsZU1vZGVzLkhFSUdIVF9DT05UUk9MU19XSURUSCBhcyBIRUlHSFRfQ09OVFJPTFNfV0lEVEhcclxuICogQGJvcnJvd3MgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuRklUIGFzIEZJVFxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuU2NhbGVNb2Rlcy5FTlZFTE9QIGFzIEVOVkVMT1BcclxuICogQGJvcnJvd3MgUGhhc2VyLlNjYWxlLlNjYWxlTW9kZXMuUkVTSVpFIGFzIFJFU0laRVxyXG4gKiBcclxuICogQGJvcnJvd3MgUGhhc2VyLlNjYWxlLlpvb20uTk9fWk9PTSBhcyBOT19aT09NXHJcbiAqIEBib3Jyb3dzIFBoYXNlci5TY2FsZS5ab29tLlpPT01fMlggYXMgWk9PTV8yWFxyXG4gKiBAYm9ycm93cyBQaGFzZXIuU2NhbGUuWm9vbS5aT09NXzRYIGFzIFpPT01fNFhcclxuICogQGJvcnJvd3MgUGhhc2VyLlNjYWxlLlpvb20uTUFYX1pPT00gYXMgTUFYX1pPT01cclxuICovXHJcblxyXG52YXIgU2NhbGUgPSB7XHJcblxyXG4gICAgQ2VudGVyOiByZXF1aXJlKCcuL2NvbnN0L0NFTlRFUl9DT05TVCcpLFxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpLFxyXG4gICAgT3JpZW50YXRpb246IHJlcXVpcmUoJy4vY29uc3QvT1JJRU5UQVRJT05fQ09OU1QnKSxcclxuICAgIFNjYWxlTWFuYWdlcjogcmVxdWlyZSgnLi9TY2FsZU1hbmFnZXInKSxcclxuICAgIFNjYWxlTW9kZXM6IHJlcXVpcmUoJy4vY29uc3QvU0NBTEVfTU9ERV9DT05TVCcpLFxyXG4gICAgWm9vbTogcmVxdWlyZSgnLi9jb25zdC9aT09NX0NPTlNUJylcclxuXHJcbn07XHJcblxyXG5TY2FsZSA9IEV4dGVuZChmYWxzZSwgU2NhbGUsIENPTlNULkNFTlRFUik7XHJcblNjYWxlID0gRXh0ZW5kKGZhbHNlLCBTY2FsZSwgQ09OU1QuT1JJRU5UQVRJT04pO1xyXG5TY2FsZSA9IEV4dGVuZChmYWxzZSwgU2NhbGUsIENPTlNULlNDQUxFX01PREUpO1xyXG5TY2FsZSA9IEV4dGVuZChmYWxzZSwgU2NhbGUsIENPTlNULlpPT00pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2FsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgVXBwZXJjYXNlRmlyc3QgPSByZXF1aXJlKCcuLi91dGlscy9zdHJpbmcvVXBwZXJjYXNlRmlyc3QnKTtcclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYW4gYXJyYXkgb2Ygd2hpY2ggcGh5c2ljcyBwbHVnaW5zIHNob3VsZCBiZSBhY3RpdmF0ZWQgZm9yIHRoZSBnaXZlbiBTY2VuZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5TY2VuZXMuR2V0UGh5c2ljc1BsdWdpbnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBUaGUgc2NlbmUgc3lzdGVtIHRvIGdldCB0aGUgcGh5c2ljcyBzeXN0ZW1zIG9mLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgUGh5c2ljcyBzeXN0ZW1zIHRvIHN0YXJ0IGZvciB0aGlzIFNjZW5lLlxyXG4gKi9cclxudmFyIEdldFBoeXNpY3NQbHVnaW5zID0gZnVuY3Rpb24gKHN5cylcclxue1xyXG4gICAgdmFyIGRlZmF1bHRTeXN0ZW0gPSBzeXMuZ2FtZS5jb25maWcuZGVmYXVsdFBoeXNpY3NTeXN0ZW07XHJcbiAgICB2YXIgc2NlbmVTeXN0ZW1zID0gR2V0RmFzdFZhbHVlKHN5cy5zZXR0aW5ncywgJ3BoeXNpY3MnLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKCFkZWZhdWx0U3lzdGVtICYmICFzY2VuZVN5c3RlbXMpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE5vIGRlZmF1bHQgcGh5c2ljcyBzeXN0ZW0gb3Igc3lzdGVtcyBpbiB0aGlzIHNjZW5lXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBMZXQncyBidWlsZCB0aGUgc3lzdGVtcyBhcnJheVxyXG4gICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgIGlmIChkZWZhdWx0U3lzdGVtKVxyXG4gICAge1xyXG4gICAgICAgIG91dHB1dC5wdXNoKFVwcGVyY2FzZUZpcnN0KGRlZmF1bHRTeXN0ZW0gKyAnUGh5c2ljcycpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2NlbmVTeXN0ZW1zKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzY2VuZVN5c3RlbXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSBVcHBlcmNhc2VGaXJzdChrZXkuY29uY2F0KCdQaHlzaWNzJykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG91dHB1dC5pbmRleE9mKGtleSkgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBBbiBhcnJheSBvZiBQaHlzaWNzIHN5c3RlbXMgdG8gc3RhcnQgZm9yIHRoaXMgU2NlbmVcclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFBoeXNpY3NQbHVnaW5zO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQnVpbGRzIGFuIGFycmF5IG9mIHdoaWNoIHBsdWdpbnMgKG5vdCBpbmNsdWRpbmcgcGh5c2ljcyBwbHVnaW5zKSBzaG91bGQgYmUgYWN0aXZhdGVkIGZvciB0aGUgZ2l2ZW4gU2NlbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuU2NlbmVzLkdldFNjZW5lUGx1Z2luc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IHN5cyAtIFRoZSBTY2VuZSBTeXN0ZW1zIG9iamVjdCB0byBjaGVjayBmb3IgcGx1Z2lucy5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IEFuIGFycmF5IG9mIGFsbCBwbHVnaW5zIHdoaWNoIHNob3VsZCBiZSBhY3RpdmF0ZWQsIGVpdGhlciB0aGUgZGVmYXVsdCBvbmVzIG9yIHRoZSBvbmVzIGNvbmZpZ3VyZWQgaW4gdGhlIFNjZW5lIFN5c3RlbXMgb2JqZWN0LlxyXG4gKi9cclxudmFyIEdldFNjZW5lUGx1Z2lucyA9IGZ1bmN0aW9uIChzeXMpXHJcbntcclxuICAgIHZhciBkZWZhdWx0UGx1Z2lucyA9IHN5cy5wbHVnaW5zLmdldERlZmF1bHRTY2VuZVBsdWdpbnMoKTtcclxuXHJcbiAgICB2YXIgc2NlbmVQbHVnaW5zID0gR2V0RmFzdFZhbHVlKHN5cy5zZXR0aW5ncywgJ3BsdWdpbnMnLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gIFNjZW5lIFBsdWdpbnMgYWx3YXlzIG92ZXJyaWRlIERlZmF1bHQgUGx1Z2luc1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NlbmVQbHVnaW5zKSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc2NlbmVQbHVnaW5zO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZGVmYXVsdFBsdWdpbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRQbHVnaW5zO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIC8vICBObyBkZWZhdWx0IHBsdWdpbnMgb3IgcGx1Z2lucyBpbiB0aGlzIHNjZW5lXHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRTY2VuZVBsdWdpbnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLy8gIFRoZXNlIHByb3BlcnRpZXMgZ2V0IGluamVjdGVkIGludG8gdGhlIFNjZW5lIGFuZCBtYXAgdG8gbG9jYWwgc3lzdGVtc1xyXG4vLyAgVGhlIG1hcCB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgdGhhdCBpcyBpbmplY3RlZCBpbnRvIHRoZSBTY2VuZSwgdGhlIGtleSBpcyB0aGUgU2NlbmUuU3lzdGVtcyByZWZlcmVuY2UuXHJcbi8vICBUaGVzZSBkZWZhdWx0cyBjYW4gYmUgbW9kaWZpZWQgdmlhIHRoZSBTY2VuZSBjb25maWcgb2JqZWN0XHJcbi8vICAgICAgICAgIHZhciBjb25maWcgPSB7XHJcbi8vICAgICAgICAgICAgbWFwOiB7XHJcbi8vICAgICAgICAgICAgICAgIGFkZDogJ21ha2VTdHVmZicsXHJcbi8vICAgICAgICAgICAgICAgIGxvYWQ6ICdsb2FkZXInXHJcbi8vICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgfTtcclxuXHJcbnZhciBJbmplY3Rpb25NYXAgPSB7XHJcblxyXG4gICAgZ2FtZTogJ2dhbWUnLFxyXG5cclxuICAgIGFuaW1zOiAnYW5pbXMnLFxyXG4gICAgY2FjaGU6ICdjYWNoZScsXHJcbiAgICBwbHVnaW5zOiAncGx1Z2lucycsXHJcbiAgICByZWdpc3RyeTogJ3JlZ2lzdHJ5JyxcclxuICAgIHNjYWxlOiAnc2NhbGUnLFxyXG4gICAgc291bmQ6ICdzb3VuZCcsXHJcbiAgICB0ZXh0dXJlczogJ3RleHR1cmVzJyxcclxuXHJcbiAgICBldmVudHM6ICdldmVudHMnLFxyXG4gICAgY2FtZXJhczogJ2NhbWVyYXMnLFxyXG4gICAgYWRkOiAnYWRkJyxcclxuICAgIG1ha2U6ICdtYWtlJyxcclxuICAgIHNjZW5lUGx1Z2luOiAnc2NlbmUnLFxyXG4gICAgZGlzcGxheUxpc3Q6ICdjaGlsZHJlbicsXHJcbiAgICBsaWdodHM6ICdsaWdodHMnLFxyXG5cclxuICAgIGRhdGE6ICdkYXRhJyxcclxuICAgIGlucHV0OiAnaW5wdXQnLFxyXG4gICAgbG9hZDogJ2xvYWQnLFxyXG4gICAgdGltZTogJ3RpbWUnLFxyXG4gICAgdHdlZW5zOiAndHdlZW5zJyxcclxuXHJcbiAgICBhcmNhZGVQaHlzaWNzOiAncGh5c2ljcycsXHJcbiAgICBpbXBhY3RQaHlzaWNzOiAnaW1wYWN0JyxcclxuICAgIG1hdHRlclBoeXNpY3M6ICdtYXR0ZXInXHJcblxyXG59O1xyXG5cclxuaWYgKHR5cGVvZiBQTFVHSU5fQ0FNRVJBM0QpXHJcbntcclxuICAgIEluamVjdGlvbk1hcC5jYW1lcmFzM2QgPSAnY2FtZXJhczNkJztcclxufVxyXG5cclxuaWYgKHR5cGVvZiBQTFVHSU5fRkJJTlNUQU5UKVxyXG57XHJcbiAgICBJbmplY3Rpb25NYXAuZmFjZWJvb2sgPSAnZmFjZWJvb2snO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEluamVjdGlvbk1hcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgU3lzdGVtcyA9IHJlcXVpcmUoJy4vU3lzdGVtcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBiYXNlIFBoYXNlci5TY2VuZSBjbGFzcyB3aGljaCBjYW4gYmUgZXh0ZW5kZWQgZm9yIHlvdXIgb3duIHVzZS5cclxuICpcclxuICogWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgb3B0aW9uYWwgbWV0aG9kcyB7QGxpbmsgUGhhc2VyLlR5cGVzLlNjZW5lcy5TY2VuZUluaXRDYWxsYmFjayBpbml0KCl9LCB7QGxpbmsgUGhhc2VyLlR5cGVzLlNjZW5lcy5TY2VuZVByZWxvYWRDYWxsYmFjayBwcmVsb2FkKCl9LCBhbmQge0BsaW5rIFBoYXNlci5UeXBlcy5TY2VuZXMuU2NlbmVDcmVhdGVDYWxsYmFjayBjcmVhdGUoKX0uXHJcbiAqXHJcbiAqIEBjbGFzcyBTY2VuZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NDb25maWcpfSBjb25maWcgLSBTY2VuZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxyXG4gKi9cclxudmFyIFNjZW5lID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFNjZW5lIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFNjZW5lIFN5c3RlbXMuIFlvdSBtdXN0IG5ldmVyIG92ZXJ3cml0ZSB0aGlzIHByb3BlcnR5LCBvciBhbGwgaGVsbCB3aWxsIGJyZWFrIGxvc2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjc3lzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5cyA9IG5ldyBTeXN0ZW1zKHRoaXMsIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZS5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNnYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBbmltYXRpb24gTWFuYWdlci5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNhbmltc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQW5pbWF0aW9ucy5BbmltYXRpb25NYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYW5pbXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgQ2FjaGUuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjY2FjaGVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhY2hlLkNhY2hlTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhY2hlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2FtZSBsZXZlbCBEYXRhIE1hbmFnZXIuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjcmVnaXN0cnlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZWdpc3RyeTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNvdW5kIE1hbmFnZXIuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAgYW5kIHRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lI3NvdW5kXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc291bmQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjdGV4dHVyZXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGV4dHVyZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgRXZlbnQgRW1pdHRlci5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgQ2FtZXJhIFN5c3RlbS5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNjYW1lcmFzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbWVyYXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgR2FtZSBPYmplY3QgRmFjdG9yeS5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNhZGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWRkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHNjZW5lIGxldmVsIEdhbWUgT2JqZWN0IENyZWF0b3IuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjbWFrZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3J9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYWtlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgTWFuYWdlciBQbHVnaW4uXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjc2NlbmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHNjZW5lIGxldmVsIEdhbWUgT2JqZWN0IERpc3BsYXkgTGlzdC5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNjaGlsZHJlblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzY2VuZSBsZXZlbCBMaWdodHMgTWFuYWdlciBQbHVnaW4uXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIGRlZmluZWQgaW4gdGhlIFNjZW5lIEluamVjdGlvbiBNYXAgYW5kIHRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lI2xpZ2h0c1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuTGlnaHRzTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpZ2h0cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzY2VuZSBsZXZlbCBEYXRhIE1hbmFnZXIgUGx1Z2luLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiBkZWZpbmVkIGluIHRoZSBTY2VuZSBJbmplY3Rpb24gTWFwIGFuZCB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNkYXRhXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5EYXRhLkRhdGFNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzY2VuZSBsZXZlbCBJbnB1dCBNYW5hZ2VyIFBsdWdpbi5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcCBhbmQgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjaW5wdXRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLklucHV0LklucHV0UGx1Z2lufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5wdXQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgTG9hZGVyIFBsdWdpbi5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcCBhbmQgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjbG9hZFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuTG9hZGVyLkxvYWRlclBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvYWQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgVGltZSBhbmQgQ2xvY2sgUGx1Z2luLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiBkZWZpbmVkIGluIHRoZSBTY2VuZSBJbmplY3Rpb24gTWFwIGFuZCB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSN0aW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaW1lLkNsb2NrfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBzY2VuZSBsZXZlbCBUd2VlbiBNYW5hZ2VyIFBsdWdpbi5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcCBhbmQgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjdHdlZW5zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHdlZW5zO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHNjZW5lIGxldmVsIEFyY2FkZSBQaHlzaWNzIFBsdWdpbi5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcCwgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmUjcGh5c2ljc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuUGh5c2ljcy5BcmNhZGUuQXJjYWRlUGh5c2ljc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBoeXNpY3M7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgc2NlbmUgbGV2ZWwgTWF0dGVyIFBoeXNpY3MgUGx1Z2luLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiBkZWZpbmVkIGluIHRoZSBTY2VuZSBJbmplY3Rpb24gTWFwLCB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNtYXR0ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBoeXNpY3MuTWF0dGVyLk1hdHRlclBoeXNpY3N9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXR0ZXI7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgUExVR0lOX0ZCSU5TVEFOVClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBIHNjZW5lIGxldmVsIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luLlxyXG4gICAgICAgICAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgZGVmaW5lZCBpbiB0aGUgU2NlbmUgSW5qZWN0aW9uIE1hcCwgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNmYWNlYm9va1xyXG4gICAgICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkZhY2Vib29rSW5zdGFudEdhbWVzUGx1Z2lufVxyXG4gICAgICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLmZhY2Vib29rO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiBkZWZpbmVkIGluIHRoZSBTY2VuZSBJbmplY3Rpb24gTWFwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lI3NjYWxlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2FsZS5TY2FsZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NhbGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBQbHVnaW4gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFRoZSBQbHVnaW4gTWFuYWdlciBpcyBhIGdsb2JhbCBzeXN0ZW0gdGhhdCBhbGxvd3MgcGx1Z2lucyB0byByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggaXQsIGFuZCBjYW4gdGhlbiBpbnN0YWxsXHJcbiAgICAgICAgICogdGhvc2UgcGx1Z2lucyBpbnRvIFNjZW5lcyBhcyByZXF1aXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZSNwbHVnaW5zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5QbHVnaW5zLlBsdWdpbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHlvdXIgb3duIFNjZW5lcy5cclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIHBlciBnYW1lIHN0ZXAgd2hpbGUgdGhlIHNjZW5lIGlzIHJ1bm5pbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmUjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNjZW5lO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vY29uc3QnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4vZXZlbnRzJyk7XHJcbnZhciBHYW1lRXZlbnRzID0gcmVxdWlyZSgnLi4vY29yZS9ldmVudHMnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBMb2FkZXJFdmVudHMgPSByZXF1aXJlKCcuLi9sb2FkZXIvZXZlbnRzJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgU2NlbmUgPSByZXF1aXJlKCcuL1NjZW5lJyk7XHJcbnZhciBTeXN0ZW1zID0gcmVxdWlyZSgnLi9TeXN0ZW1zJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgU2NlbmUgTWFuYWdlci5cclxuICpcclxuICogVGhlIFNjZW5lIE1hbmFnZXIgaXMgYSBHYW1lIGxldmVsIHN5c3RlbSwgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nLCBwcm9jZXNzaW5nIGFuZCB1cGRhdGluZyBhbGwgb2YgdGhlXHJcbiAqIFNjZW5lcyBpbiBhIEdhbWUgaW5zdGFuY2UuXHJcbiAqXHJcbiAqXHJcbiAqIEBjbGFzcyBTY2VuZU1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5TY2VuZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gVGhlIFBoYXNlci5HYW1lIGluc3RhbmNlIHRoaXMgU2NlbmUgTWFuYWdlciBiZWxvbmdzIHRvLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gc2NlbmVDb25maWcgLSBTY2VuZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxyXG4gKi9cclxudmFyIFNjZW5lTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBTY2VuZU1hbmFnZXIgKGdhbWUsIHNjZW5lQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBHYW1lIHRoYXQgdGhpcyBTY2VuZU1hbmFnZXIgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2dhbWVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgbWFwcyB0aGUga2V5cyB0byB0aGUgc2NlbmUgc28gd2UgY2FuIHF1aWNrbHkgZ2V0IGEgc2NlbmUgZnJvbSBhIGtleSB3aXRob3V0IGl0ZXJhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2tleXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMua2V5cyA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYXJyYXkgaW4gd2hpY2ggYWxsIG9mIHRoZSBzY2VuZXMgYXJlIGtlcHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNzY2VuZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2NlbmVzIHBlbmRpbmcgdG8gYmUgYWRkZWQgYXJlIHN0b3JlZCBpbiBoZXJlIHVudGlsIHRoZSBtYW5hZ2VyIGhhcyB0aW1lIHRvIGFkZCBpdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI19wZW5kaW5nXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGVuZGluZyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBzY2VuZXMgd2FpdGluZyB0byBiZSBzdGFydGVkIG9uY2UgdGhlIGdhbWUgaGFzIGJvb3RlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI19zdGFydFxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0ID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIG9wZXJhdGlvbnMgcXVldWUsIGJlY2F1c2Ugd2UgZG9uJ3QgbWFuaXB1bGF0ZSB0aGUgc2NlbmVzIGFycmF5IGR1cmluZyBwcm9jZXNzaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjX3F1ZXVlXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQm9vdCB0aW1lIGRhdGEgdG8gbWVyZ2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNfZGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kYXRhID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBTY2VuZSBNYW5hZ2VyIGFjdGl2ZWx5IHByb2Nlc3NpbmcgdGhlIFNjZW5lcyBsaXN0P1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjaXNQcm9jZXNzaW5nXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIYXMgdGhlIFNjZW5lIE1hbmFnZXIgcHJvcGVybHkgc3RhcnRlZD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2lzQm9vdGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzQm9vdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvIGFueSBvZiB0aGUgQ2FtZXJhcyBpbiBhbnkgb2YgdGhlIFNjZW5lcyByZXF1aXJlIGEgY3VzdG9tIHZpZXdwb3J0P1xyXG4gICAgICAgICAqIElmIG5vdCB3ZSBjYW4gc2tpcCBzY2lzc29yIHRlc3RzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjY3VzdG9tVmlld3BvcnRzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVmlld3BvcnRzID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lQ29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjZW5lQ29uZmlnKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NlbmVDb25maWcgPSBbIHNjZW5lQ29uZmlnIF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NlbmVDb25maWcubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBUaGUgaSA9PT0gMCBwYXJ0IGp1c3QgYXV0b3N0YXJ0cyB0aGUgZmlyc3QgU2NlbmUgZ2l2ZW4gKHVubGVzcyBpdCBzYXlzIG90aGVyd2lzZSBpbiBpdHMgY29uZmlnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBrZXk6ICdkZWZhdWx0JyxcclxuICAgICAgICAgICAgICAgICAgICBzY2VuZTogc2NlbmVDb25maWdbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0b1N0YXJ0OiAoaSA9PT0gMCksXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge31cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnYW1lLmV2ZW50cy5vbmNlKEdhbWVFdmVudHMuUkVBRFksIHRoaXMuYm9vdFF1ZXVlLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBmaXJzdC10aW1lIFNjZW5lIGJvb3QgaGFuZGxlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2Jvb3RRdWV1ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICovXHJcbiAgICBib290UXVldWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNCb290ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgZW50cnk7XHJcbiAgICAgICAgdmFyIGtleTtcclxuICAgICAgICB2YXIgc2NlbmVDb25maWc7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9wZW5kaW5nLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9wZW5kaW5nW2ldO1xyXG5cclxuICAgICAgICAgICAga2V5ID0gZW50cnkua2V5O1xyXG4gICAgICAgICAgICBzY2VuZUNvbmZpZyA9IGVudHJ5LnNjZW5lO1xyXG5cclxuICAgICAgICAgICAgdmFyIG5ld1NjZW5lO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjZW5lQ29uZmlnIGluc3RhbmNlb2YgU2NlbmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5ld1NjZW5lID0gdGhpcy5jcmVhdGVTY2VuZUZyb21JbnN0YW5jZShrZXksIHNjZW5lQ29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2NlbmVDb25maWcgPT09ICdvYmplY3QnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZXdTY2VuZSA9IHRoaXMuY3JlYXRlU2NlbmVGcm9tT2JqZWN0KGtleSwgc2NlbmVDb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzY2VuZUNvbmZpZyA9PT0gJ2Z1bmN0aW9uJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmV3U2NlbmUgPSB0aGlzLmNyZWF0ZVNjZW5lRnJvbUZ1bmN0aW9uKGtleSwgc2NlbmVDb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgUmVwbGFjZSBrZXkgaW4gY2FzZSB0aGUgc2NlbmUgY2hhbmdlZCBpdFxyXG4gICAgICAgICAgICBrZXkgPSBuZXdTY2VuZS5zeXMuc2V0dGluZ3Mua2V5O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5rZXlzW2tleV0gPSBuZXdTY2VuZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmVzLnB1c2gobmV3U2NlbmUpO1xyXG5cclxuICAgICAgICAgICAgLy8gIEFueSBkYXRhIHRvIGluamVjdD9cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFba2V5XSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmV3U2NlbmUuc3lzLnNldHRpbmdzLmRhdGEgPSB0aGlzLl9kYXRhW2tleV0uZGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGF0YVtrZXldLmF1dG9TdGFydClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5hdXRvU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkuYXV0b1N0YXJ0IHx8IG5ld1NjZW5lLnN5cy5zZXR0aW5ncy5hY3RpdmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0LnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENsZWFyIHRoZSBwZW5kaW5nIGxpc3RzXHJcbiAgICAgICAgdGhpcy5fcGVuZGluZy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl9kYXRhID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuaXNCb290ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyAgX3N0YXJ0IG1pZ2h0IGhhdmUgYmVlbiBwb3B1bGF0ZWQgYnkgdGhlIGFib3ZlXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX3N0YXJ0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9zdGFydFtpXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoZW50cnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc3RhcnQubGVuZ3RoID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzIHRoZSBTY2VuZSBvcGVyYXRpb25zIHF1ZXVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjcHJvY2Vzc1F1ZXVlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcHJvY2Vzc1F1ZXVlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwZW5kaW5nTGVuZ3RoID0gdGhpcy5fcGVuZGluZy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHF1ZXVlTGVuZ3RoID0gdGhpcy5fcXVldWUubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAocGVuZGluZ0xlbmd0aCA9PT0gMCAmJiBxdWV1ZUxlbmd0aCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBlbnRyeTtcclxuXHJcbiAgICAgICAgaWYgKHBlbmRpbmdMZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGVuZGluZ0xlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBlbnRyeSA9IHRoaXMuX3BlbmRpbmdbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoZW50cnkua2V5LCBlbnRyeS5zY2VuZSwgZW50cnkuYXV0b1N0YXJ0LCBlbnRyeS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIF9zdGFydCBtaWdodCBoYXZlIGJlZW4gcG9wdWxhdGVkIGJ5IHRoaXMuYWRkXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9zdGFydC5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9zdGFydFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIENsZWFyIHRoZSBwZW5kaW5nIGxpc3RzXHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0Lmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9xdWV1ZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5fcXVldWVbaV07XHJcblxyXG4gICAgICAgICAgICB0aGlzW2VudHJ5Lm9wXShlbnRyeS5rZXlBLCBlbnRyeS5rZXlCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3F1ZXVlLmxlbmd0aCA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBTY2VuZSBpbnRvIHRoZSBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKiBZb3UgbXVzdCBnaXZlIGVhY2ggU2NlbmUgYSB1bmlxdWUga2V5IGJ5IHdoaWNoIHlvdSdsbCBpZGVudGlmeSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYHNjZW5lQ29uZmlnYCBjYW4gYmU6XHJcbiAgICAgKlxyXG4gICAgICogKiBBIGBQaGFzZXIuU2NlbmVgIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgZXh0ZW5kcyBpdC5cclxuICAgICAqICogQSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdFxyXG4gICAgICogKiBBIEphdmFTY3JpcHQgRVM2IENsYXNzIHRoYXQgZXh0ZW5kcyBgUGhhc2VyLlNjZW5lYFxyXG4gICAgICogKiBBIEphdmFTY3JpcHQgRVM1IHByb3RvdHlwZSBiYXNlZCBDbGFzc1xyXG4gICAgICogKiBBIEphdmFTY3JpcHQgZnVuY3Rpb25cclxuICAgICAqXHJcbiAgICAgKiBJZiBhIGZ1bmN0aW9uIGlzIGdpdmVuIHRoZW4gYSBuZXcgU2NlbmUgd2lsbCBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBIHVuaXF1ZSBrZXkgdXNlZCB0byByZWZlcmVuY2UgdGhlIFNjZW5lLCBpLmUuIGBNYWluTWVudWAgb3IgYExldmVsMWAuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuU2NlbmV8UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc0NvbmZpZ3xQaGFzZXIuVHlwZXMuU2NlbmVzLkNyZWF0ZVNjZW5lRnJvbU9iamVjdENvbmZpZ3xmdW5jdGlvbil9IHNjZW5lQ29uZmlnIC0gVGhlIGNvbmZpZyBmb3IgdGhlIFNjZW5lXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthdXRvU3RhcnQ9ZmFsc2VdIC0gSWYgYHRydWVgIHRoZSBTY2VuZSB3aWxsIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYmVpbmcgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSBvYmplY3QuIFRoaXMgd2lsbCBiZSBzZXQgYXMgU2NlbmUuc2V0dGluZ3MuZGF0YSBhbmQgcGFzc2VkIHRvIGBTY2VuZS5pbml0YC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlNjZW5lfSBUaGUgYWRkZWQgU2NlbmUsIGlmIGl0IHdhcyBhZGRlZCBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIGBudWxsYC5cclxuICAgICAqL1xyXG4gICAgYWRkOiBmdW5jdGlvbiAoa2V5LCBzY2VuZUNvbmZpZywgYXV0b1N0YXJ0LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhdXRvU3RhcnQgPT09IHVuZGVmaW5lZCkgeyBhdXRvU3RhcnQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsgZGF0YSA9IHt9OyB9XHJcblxyXG4gICAgICAgIC8vICBJZiBwcm9jZXNzaW5nIG9yIG5vdCBib290ZWQgdGhlbiBwdXQgc2NlbmUgaW50byBhIGhvbGRpbmcgcGF0dGVyblxyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZyB8fCAhdGhpcy5pc0Jvb3RlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHNjZW5lOiBzY2VuZUNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGF1dG9TdGFydDogYXV0b1N0YXJ0LFxyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Jvb3RlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YVtrZXldID0geyBkYXRhOiBkYXRhIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAga2V5ID0gdGhpcy5nZXRLZXkoa2V5LCBzY2VuZUNvbmZpZyk7XHJcblxyXG4gICAgICAgIHZhciBuZXdTY2VuZTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lQ29uZmlnIGluc3RhbmNlb2YgU2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdTY2VuZSA9IHRoaXMuY3JlYXRlU2NlbmVGcm9tSW5zdGFuY2Uoa2V5LCBzY2VuZUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzY2VuZUNvbmZpZyA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZUNvbmZpZy5rZXkgPSBrZXk7XHJcblxyXG4gICAgICAgICAgICBuZXdTY2VuZSA9IHRoaXMuY3JlYXRlU2NlbmVGcm9tT2JqZWN0KGtleSwgc2NlbmVDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2NlbmVDb25maWcgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdTY2VuZSA9IHRoaXMuY3JlYXRlU2NlbmVGcm9tRnVuY3Rpb24oa2V5LCBzY2VuZUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQW55IGRhdGEgdG8gaW5qZWN0P1xyXG4gICAgICAgIG5ld1NjZW5lLnN5cy5zZXR0aW5ncy5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgLy8gIFJlcGxhY2Uga2V5IGluIGNhc2UgdGhlIHNjZW5lIGNoYW5nZWQgaXRcclxuICAgICAgICBrZXkgPSBuZXdTY2VuZS5zeXMuc2V0dGluZ3Mua2V5O1xyXG5cclxuICAgICAgICB0aGlzLmtleXNba2V5XSA9IG5ld1NjZW5lO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lcy5wdXNoKG5ld1NjZW5lKTtcclxuXHJcbiAgICAgICAgaWYgKGF1dG9TdGFydCB8fCBuZXdTY2VuZS5zeXMuc2V0dGluZ3MuYWN0aXZlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmcubGVuZ3RoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydC5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdTY2VuZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgU2NlbmUgZnJvbSB0aGUgU2NlbmVNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBTY2VuZSBpcyByZW1vdmVkIGZyb20gdGhlIGxvY2FsIHNjZW5lcyBhcnJheSwgaXQncyBrZXkgaXMgY2xlYXJlZCBmcm9tIHRoZSBrZXlzXHJcbiAgICAgKiBjYWNoZSBhbmQgU2NlbmUuU3lzdGVtcy5kZXN0cm95IGlzIHRoZW4gY2FsbGVkIG9uIGl0LlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBTY2VuZU1hbmFnZXIgaXMgcHJvY2Vzc2luZyB0aGUgU2NlbmVzIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGl0IHdpbGxcclxuICAgICAqIHF1ZXVlIHRoZSBvcGVyYXRpb24gZm9yIHRoZSBuZXh0IHVwZGF0ZSBzZXF1ZW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEEgdW5pcXVlIGtleSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgU2NlbmUsIGkuZS4gYE1haW5NZW51YCBvciBgTGV2ZWwxYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHsgb3A6ICdyZW1vdmUnLCBrZXlBOiBrZXksIGtleUI6IG51bGwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY2VuZVRvUmVtb3ZlID0gdGhpcy5nZXRTY2VuZShrZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFzY2VuZVRvUmVtb3ZlIHx8IHNjZW5lVG9SZW1vdmUuc3lzLmlzVHJhbnNpdGlvbmluZygpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5zY2VuZXMuaW5kZXhPZihzY2VuZVRvUmVtb3ZlKTtcclxuICAgICAgICAgICAgdmFyIHNjZW5lS2V5ID0gc2NlbmVUb1JlbW92ZS5zeXMuc2V0dGluZ3Mua2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmtleXNbc2NlbmVLZXldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhcnQuaW5kZXhPZihzY2VuZUtleSkgPiAtMSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuX3N0YXJ0LmluZGV4T2Yoc2NlbmVLZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2NlbmVUb1JlbW92ZS5zeXMuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb290IHRoZSBnaXZlbiBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2Jvb3RTY2VuZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNUUkFOU0lUSU9OX0lOSVRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byBib290LlxyXG4gICAgICovXHJcbiAgICBib290U2NlbmU6IGZ1bmN0aW9uIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc3lzID0gc2NlbmUuc3lzO1xyXG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHN5cy5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgc3lzLnNjZW5lVXBkYXRlID0gTk9PUDtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lLmluaXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZS5pbml0LmNhbGwoc2NlbmUsIHNldHRpbmdzLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuSU5JVDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5pc1RyYW5zaXRpb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN5cy5ldmVudHMuZW1pdChFdmVudHMuVFJBTlNJVElPTl9JTklULCBzZXR0aW5ncy50cmFuc2l0aW9uRnJvbSwgc2V0dGluZ3MudHJhbnNpdGlvbkR1cmF0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxvYWRlcjtcclxuXHJcbiAgICAgICAgaWYgKHN5cy5sb2FkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbG9hZGVyID0gc3lzLmxvYWQ7XHJcblxyXG4gICAgICAgICAgICBsb2FkZXIucmVzZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsb2FkZXIgJiYgc2NlbmUucHJlbG9hZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNjZW5lLnByZWxvYWQuY2FsbChzY2VuZSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgSXMgdGhlIGxvYWRlciBlbXB0eT9cclxuICAgICAgICAgICAgaWYgKGxvYWRlci5saXN0LnNpemUgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHNjZW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLnN0YXR1cyA9IENPTlNULkxPQURJTkc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFN0YXJ0IHRoZSBsb2FkZXIgZ29pbmcgYXMgd2UgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHF1ZXVlXHJcbiAgICAgICAgICAgICAgICBsb2FkZXIub25jZShMb2FkZXJFdmVudHMuQ09NUExFVEUsIHRoaXMubG9hZENvbXBsZXRlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2FkZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgTm8gcHJlbG9hZD8gVGhlbiB0aGVyZSB3YXMgbm90aGluZyB0byBsb2FkIGVpdGhlclxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZShzY2VuZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgbG9hZCBjb21wbGV0aW9uIGZvciBhIFNjZW5lJ3MgTG9hZGVyLlxyXG4gICAgICpcclxuICAgICAqIFN0YXJ0cyB0aGUgU2NlbmUgdGhhdCB0aGUgTG9hZGVyIGJlbG9uZ3MgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNsb2FkQ29tcGxldGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Mb2FkZXIuTG9hZGVyUGx1Z2lufSBsb2FkZXIgLSBUaGUgbG9hZGVyIHRoYXQgaGFzIGNvbXBsZXRlZCBsb2FkaW5nLlxyXG4gICAgICovXHJcbiAgICBsb2FkQ29tcGxldGU6IGZ1bmN0aW9uIChsb2FkZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lID0gbG9hZGVyLnNjZW5lO1xyXG5cclxuICAgICAgICAvLyAgVE9ETyAtIFJlbW92ZS4gVGhpcyBzaG91bGQgKm5vdCogYmUgaGFuZGxlZCBoZXJlXHJcbiAgICAgICAgLy8gIFRyeSB0byB1bmxvY2sgSFRNTDUgc291bmRzIGV2ZXJ5IHRpbWUgYW55IGxvYWRlciBjb21wbGV0ZXNcclxuICAgICAgICBpZiAodGhpcy5nYW1lLnNvdW5kICYmIHRoaXMuZ2FtZS5zb3VuZC5vbkJsdXJQYXVzZWRTb3VuZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmdhbWUuc291bmQudW5sb2NrKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZShzY2VuZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIHBheWxvYWQgY29tcGxldGlvbiBmb3IgYSBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI3BheWxvYWRDb21wbGV0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkxvYWRlci5Mb2FkZXJQbHVnaW59IGxvYWRlciAtIFRoZSBsb2FkZXIgdGhhdCBoYXMgY29tcGxldGVkIGxvYWRpbmcgaXRzIFNjZW5lJ3MgcGF5bG9hZC5cclxuICAgICAqL1xyXG4gICAgcGF5bG9hZENvbXBsZXRlOiBmdW5jdGlvbiAobG9hZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYm9vdFNjZW5lKGxvYWRlci5zY2VuZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgU2NlbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRpbWUgZWxhcHNlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIERlbHRhIHRpbWUgZnJvbSB0aGUgbGFzdCB1cGRhdGUuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gIExvb3AgdGhyb3VnaCB0aGUgYWN0aXZlIHNjZW5lcyBpbiByZXZlcnNlIG9yZGVyXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuc2NlbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHN5cyA9IHRoaXMuc2NlbmVzW2ldLnN5cztcclxuXHJcbiAgICAgICAgICAgIGlmIChzeXMuc2V0dGluZ3Muc3RhdHVzID4gQ09OU1QuU1RBUlQgJiYgc3lzLnNldHRpbmdzLnN0YXR1cyA8PSBDT05TVC5SVU5OSU5HKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzeXMuc3RlcCh0aW1lLCBkZWx0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgU2NlbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjcmVuZGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIgdG8gdXNlLlxyXG4gICAgICovXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlcilcclxuICAgIHtcclxuICAgICAgICAvLyAgTG9vcCB0aHJvdWdoIHRoZSBzY2VuZXMgaW4gZm9yd2FyZCBvcmRlclxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zY2VuZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc3lzID0gdGhpcy5zY2VuZXNbaV0uc3lzO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN5cy5zZXR0aW5ncy52aXNpYmxlICYmIHN5cy5zZXR0aW5ncy5zdGF0dXMgPj0gQ09OU1QuTE9BRElORyAmJiBzeXMuc2V0dGluZ3Muc3RhdHVzIDwgQ09OU1QuU0xFRVBJTkcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN5cy5yZW5kZXIocmVuZGVyZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBTY2VuZSdzIHtAbGluayBQaGFzZXIuU2NlbmUjY3JlYXRlfSBtZXRob2QgYW5kIHVwZGF0ZXMgaXRzIHN0YXR1cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2NyZWF0ZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNDUkVBVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNUUkFOU0lUSU9OX0lOSVRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byBjcmVhdGUuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzeXMgPSBzY2VuZS5zeXM7XHJcbiAgICAgICAgdmFyIHNldHRpbmdzID0gc3lzLnNldHRpbmdzO1xyXG5cclxuICAgICAgICBpZiAoc2NlbmUuY3JlYXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuQ1JFQVRJTkc7XHJcblxyXG4gICAgICAgICAgICBzY2VuZS5jcmVhdGUuY2FsbChzY2VuZSwgc2V0dGluZ3MuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHVzID09PSBDT05TVC5ERVNUUk9ZRUQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzVHJhbnNpdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN5cy5ldmVudHMuZW1pdChFdmVudHMuVFJBTlNJVElPTl9TVEFSVCwgc2V0dGluZ3MudHJhbnNpdGlvbkZyb20sIHNldHRpbmdzLnRyYW5zaXRpb25EdXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSWYgdGhlIFNjZW5lIGhhcyBhbiB1cGRhdGUgZnVuY3Rpb24gd2UnbGwgc2V0IGl0IG5vdywgb3RoZXJ3aXNlIGl0J2xsIHJlbWFpbiBhcyBOT09QXHJcbiAgICAgICAgaWYgKHNjZW5lLnVwZGF0ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN5cy5zY2VuZVVwZGF0ZSA9IHNjZW5lLnVwZGF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldHRpbmdzLnN0YXR1cyA9IENPTlNULlJVTk5JTkc7XHJcblxyXG4gICAgICAgIHN5cy5ldmVudHMuZW1pdChFdmVudHMuQ1JFQVRFLCBzY2VuZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBTY2VuZSBmcm9tIGEgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNjcmVhdGVTY2VuZUZyb21GdW5jdGlvblxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBTY2VuZS5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHNjZW5lIC0gVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgU2NlbmUgZnJvbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmV9IFRoZSBjcmVhdGVkIFNjZW5lLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTY2VuZUZyb21GdW5jdGlvbjogZnVuY3Rpb24gKGtleSwgc2NlbmUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5ld1NjZW5lID0gbmV3IHNjZW5lKCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdTY2VuZSBpbnN0YW5jZW9mIFNjZW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZ0tleSA9IG5ld1NjZW5lLnN5cy5zZXR0aW5ncy5rZXk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnS2V5ICE9PSAnJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAga2V5ID0gY29uZmlnS2V5O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5rZXlzLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFNjZW5lIHdpdGggZHVwbGljYXRlIGtleTogJyArIGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNjZW5lRnJvbUluc3RhbmNlKGtleSwgbmV3U2NlbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdTY2VuZS5zeXMgPSBuZXcgU3lzdGVtcyhuZXdTY2VuZSk7XHJcblxyXG4gICAgICAgICAgICBuZXdTY2VuZS5zeXMuc2V0dGluZ3Mua2V5ID0ga2V5O1xyXG5cclxuICAgICAgICAgICAgbmV3U2NlbmUuc3lzLmluaXQodGhpcy5nYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXdTY2VuZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBTY2VuZSBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2NyZWF0ZVNjZW5lRnJvbUluc3RhbmNlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFNjZW5lLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IG5ld1NjZW5lIC0gVGhlIFNjZW5lIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZX0gVGhlIGNyZWF0ZWQgU2NlbmUuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVNjZW5lRnJvbUluc3RhbmNlOiBmdW5jdGlvbiAoa2V5LCBuZXdTY2VuZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgY29uZmlnS2V5ID0gbmV3U2NlbmUuc3lzLnNldHRpbmdzLmtleTtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZ0tleSAhPT0gJycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSBjb25maWdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5ld1NjZW5lLnN5cy5zZXR0aW5ncy5rZXkgPSBrZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXdTY2VuZS5zeXMuaW5pdCh0aGlzLmdhbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3U2NlbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBTY2VuZSBmcm9tIGFuIE9iamVjdCBkZWZpbml0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjY3JlYXRlU2NlbmVGcm9tT2JqZWN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFNjZW5lLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NDb25maWd8UGhhc2VyLlR5cGVzLlNjZW5lcy5DcmVhdGVTY2VuZUZyb21PYmplY3RDb25maWcpfSBzY2VuZUNvbmZpZyAtIFRoZSBTY2VuZSBjb25maWcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lfSBUaGUgY3JlYXRlZCBTY2VuZS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlU2NlbmVGcm9tT2JqZWN0OiBmdW5jdGlvbiAoa2V5LCBzY2VuZUNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgbmV3U2NlbmUgPSBuZXcgU2NlbmUoc2NlbmVDb25maWcpO1xyXG5cclxuICAgICAgICB2YXIgY29uZmlnS2V5ID0gbmV3U2NlbmUuc3lzLnNldHRpbmdzLmtleTtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZ0tleSAhPT0gJycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkgPSBjb25maWdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5ld1NjZW5lLnN5cy5zZXR0aW5ncy5rZXkgPSBrZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXdTY2VuZS5zeXMuaW5pdCh0aGlzLmdhbWUpO1xyXG5cclxuICAgICAgICAvLyAgRXh0cmFjdCBjYWxsYmFja3NcclxuXHJcbiAgICAgICAgdmFyIGRlZmF1bHRzID0gWyAnaW5pdCcsICdwcmVsb2FkJywgJ2NyZWF0ZScsICd1cGRhdGUnLCAncmVuZGVyJyBdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZmF1bHRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNjZW5lQ2FsbGJhY2sgPSBHZXRWYWx1ZShzY2VuZUNvbmZpZywgZGVmYXVsdHNbaV0sIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjZW5lQ2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5ld1NjZW5lW2RlZmF1bHRzW2ldXSA9IHNjZW5lQ2FsbGJhY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBOb3cgbGV0J3MgbW92ZSBhY3Jvc3MgYW55IG90aGVyIGZ1bmN0aW9ucyBvciBwcm9wZXJ0aWVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBleHRlbmQgb2JqZWN0OlxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgIHNjZW5lOiB7XHJcbiAgICAgICAgICAgIHByZWxvYWQ6IHByZWxvYWQsXHJcbiAgICAgICAgICAgIGNyZWF0ZTogY3JlYXRlLFxyXG4gICAgICAgICAgICBleHRlbmQ6IHtcclxuICAgICAgICAgICAgICAgIGhlbGxvOiAxLFxyXG4gICAgICAgICAgICAgICAgdGVzdDogJ2F0YXJpJyxcclxuICAgICAgICAgICAgICAgIGFkZEltYWdlOiBhZGRJbWFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICovXHJcblxyXG4gICAgICAgIGlmIChzY2VuZUNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnZXh0ZW5kJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eUtleSBpbiBzY2VuZUNvbmZpZy5leHRlbmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2NlbmVDb25maWcuZXh0ZW5kLmhhc093blByb3BlcnR5KHByb3BlcnR5S2V5KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzY2VuZUNvbmZpZy5leHRlbmRbcHJvcGVydHlLZXldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ2RhdGEnICYmIG5ld1NjZW5lLmhhc093blByb3BlcnR5KCdkYXRhJykgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgUG9wdWxhdGUgdGhlIERhdGFNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U2NlbmUuZGF0YS5tZXJnZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUtleSAhPT0gJ3N5cycpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U2NlbmVbcHJvcGVydHlLZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdTY2VuZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGtleSBvZiBhIFNjZW5lIGZyb20gYSBTY2VuZSBjb25maWcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNnZXRLZXlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBjaGVjayBpbiB0aGUgU2NlbmUgY29uZmlnLlxyXG4gICAgICogQHBhcmFtIHsoUGhhc2VyLlNjZW5lfFBoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NDb25maWd8ZnVuY3Rpb24pfSBzY2VuZUNvbmZpZyAtIFRoZSBTY2VuZSBjb25maWcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgU2NlbmUga2V5LlxyXG4gICAgICovXHJcbiAgICBnZXRLZXk6IGZ1bmN0aW9uIChrZXksIHNjZW5lQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICgha2V5KSB7IGtleSA9ICdkZWZhdWx0JzsgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHNjZW5lQ29uZmlnID09PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2NlbmVDb25maWcgaW5zdGFuY2VvZiBTY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGtleSA9IHNjZW5lQ29uZmlnLnN5cy5zZXR0aW5ncy5rZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzY2VuZUNvbmZpZyA9PT0gJ29iamVjdCcgJiYgc2NlbmVDb25maWcuaGFzT3duUHJvcGVydHkoJ2tleScpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAga2V5ID0gc2NlbmVDb25maWcua2V5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEJ5IHRoaXMgcG9pbnQgaXQncyBlaXRoZXIgJ2RlZmF1bHQnIG9yIGV4dHJhY3RlZCBmcm9tIHRoZSBTY2VuZVxyXG5cclxuICAgICAgICBpZiAodGhpcy5rZXlzLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgYSBTY2VuZSB3aXRoIGR1cGxpY2F0ZSBrZXk6ICcgKyBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgY3VycmVudCBTY2VuZXMgYmVpbmcgbWFuYWdlZCBieSB0aGlzIFNjZW5lIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBmaWx0ZXIgdGhlIG91dHB1dCBieSB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSBTY2VuZSBhbmQgY2hvb3NlIHRvIGhhdmVcclxuICAgICAqIHRoZSBhcnJheSByZXR1cm5lZCBpbiBub3JtYWwgb3IgcmV2ZXJzZWQgb3JkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNnZXRTY2VuZXNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0FjdGl2ZT10cnVlXSAtIE9ubHkgaW5jbHVkZSBTY2VuZSdzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmU/XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpblJldmVyc2U9ZmFsc2VdIC0gUmV0dXJuIHRoZSBhcnJheSBvZiBTY2VuZXMgaW4gcmV2ZXJzZT9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVbXX0gQW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIFNjZW5lcyBpbiB0aGUgU2NlbmUgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgZ2V0U2NlbmVzOiBmdW5jdGlvbiAoaXNBY3RpdmUsIGluUmV2ZXJzZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHVuZGVmaW5lZCkgeyBpc0FjdGl2ZSA9IHRydWU7IH1cclxuICAgICAgICBpZiAoaW5SZXZlcnNlID09PSB1bmRlZmluZWQpIHsgaW5SZXZlcnNlID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgdmFyIG91dCA9IFtdO1xyXG4gICAgICAgIHZhciBzY2VuZXMgPSB0aGlzLnNjZW5lcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2VuZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2NlbmUgPSBzY2VuZXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoc2NlbmUgJiYgKCFpc0FjdGl2ZSB8fCAoaXNBY3RpdmUgJiYgc2NlbmUuc3lzLmlzQWN0aXZlKCkpKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0LnB1c2goc2NlbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGluUmV2ZXJzZSkgPyBvdXQucmV2ZXJzZSgpIDogb3V0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBhIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjZ2V0U2NlbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFBoYXNlci5TY2VuZX0ga2V5IC0gVGhlIFNjZW5lIHRvIHJldHJpZXZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuU2NlbmV9IFRoZSBTY2VuZS5cclxuICAgICAqL1xyXG4gICAgZ2V0U2NlbmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5c1trZXldKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXlzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNjZW5lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5zY2VuZXNbaV0pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgU2NlbmUgaXMgcnVubmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2lzQWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFNjZW5lIGlzIHJ1bm5pbmcuXHJcbiAgICAgKi9cclxuICAgIGlzQWN0aXZlOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNjZW5lLnN5cy5pc0FjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgU2NlbmUgaXMgcGF1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjaXNQYXVzZWRcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFNjZW5lIGlzIHBhdXNlZC5cclxuICAgICAqL1xyXG4gICAgaXNQYXVzZWQ6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5nZXRTY2VuZShrZXkpO1xyXG5cclxuICAgICAgICBpZiAoc2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gc2NlbmUuc3lzLmlzUGF1c2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBTY2VuZSBpcyB2aXNpYmxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjaXNWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFNjZW5lIGlzIHZpc2libGUuXHJcbiAgICAgKi9cclxuICAgIGlzVmlzaWJsZTogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIGlmIChzY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBzY2VuZS5zeXMuaXNWaXNpYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBTY2VuZSBpcyBzbGVlcGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2lzU2xlZXBpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgU2NlbmUgaXMgc2xlZXBpbmcuXHJcbiAgICAgKi9cclxuICAgIGlzU2xlZXBpbmc6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5nZXRTY2VuZShrZXkpO1xyXG5cclxuICAgICAgICBpZiAoc2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gc2NlbmUuc3lzLmlzU2xlZXBpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyB0aGUgZ2l2ZW4gU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNwYXVzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBTY2VuZSB0byBwYXVzZS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTY2VuZSBhbmQgZW1pdHRlZCBieSBpdHMgcGF1c2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXJ9IFRoaXMgU2NlbmVNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBwYXVzZTogZnVuY3Rpb24gKGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIGlmIChzY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy5wYXVzZShkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhlIGdpdmVuIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjcmVzdW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIHJlc3VtZS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTY2VuZSBhbmQgZW1pdHRlZCBieSBpdHMgcmVzdW1lIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyfSBUaGlzIFNjZW5lTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2NlbmUuc3lzLnJlc3VtZShkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgdGhlIGdpdmVuIFNjZW5lIHRvIHNsZWVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjc2xlZXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gcHV0IHRvIHNsZWVwLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIEFuIG9wdGlvbmFsIGRhdGEgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFNjZW5lIGFuZCBlbWl0dGVkIGJ5IGl0cyBzbGVlcCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHNsZWVwOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lICYmICFzY2VuZS5zeXMuaXNUcmFuc2l0aW9uaW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZS5zeXMuc2xlZXAoZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBd2FrZW5zIHRoZSBnaXZlbiBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI3dha2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gd2FrZSB1cC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTY2VuZSBhbmQgZW1pdHRlZCBieSBpdHMgd2FrZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHdha2U6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5nZXRTY2VuZShrZXkpO1xyXG5cclxuICAgICAgICBpZiAoc2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzY2VuZS5zeXMud2FrZShkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJ1bnMgdGhlIGdpdmVuIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBnaXZlbiBTY2VuZSBpcyBwYXVzZWQsIGl0IHdpbGwgcmVzdW1lIGl0LiBJZiBzbGVlcGluZywgaXQgd2lsbCB3YWtlIGl0LlxyXG4gICAgICogSWYgbm90IHJ1bm5pbmcgYXQgYWxsLCBpdCB3aWxsIGJlIHN0YXJ0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogVXNlIHRoaXMgaWYgeW91IHdpc2ggdG8gb3BlbiBhIG1vZGFsIFNjZW5lIGJ5IGNhbGxpbmcgYHBhdXNlYCBvbiB0aGUgY3VycmVudFxyXG4gICAgICogU2NlbmUsIHRoZW4gYHJ1bmAgb24gdGhlIG1vZGFsIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjcnVuXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBTY2VuZSB0byBydW4uXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTY2VuZSBvbiBzdGFydCwgd2FrZSwgb3IgcmVzdW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyfSBUaGlzIFNjZW5lIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJ1bjogZnVuY3Rpb24gKGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3BlbmRpbmcubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nW2ldLmtleSA9PT0ga2V5KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWVPcCgnc3RhcnQnLCBrZXksIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNjZW5lLnN5cy5pc1NsZWVwaW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2xlZXBpbmc/XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy53YWtlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzY2VuZS5zeXMuaXNQYXVzZWQoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBQYXVzZWQ/XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy5yZXN1bWUoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBOb3QgYWN0dWFsbHkgcnVubmluZz9cclxuICAgICAgICAgICAgdGhpcy5zdGFydChrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIGdpdmVuIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSBvYmplY3QgdG8gcGFzcyB0byBTY2VuZS5TZXR0aW5ncyBhbmQgU2NlbmUuaW5pdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBJZiB0aGUgU2NlbmUgTWFuYWdlciBpcyBub3QgcnVubmluZywgdGhlbiBwdXQgdGhlIFNjZW5lIGludG8gYSBob2xkaW5nIHBhdHRlcm5cclxuICAgICAgICBpZiAoIXRoaXMuaXNCb290ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhW2tleV0gPSB7XHJcbiAgICAgICAgICAgICAgICBhdXRvU3RhcnQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIElmIHRoZSBTY2VuZSBpcyBhbHJlYWR5IHJ1bm5pbmcgKHBlcmhhcHMgdGhleSBjYWxsZWQgc3RhcnQgZnJvbSBhIGxhdW5jaGVkIHN1Yi1TY2VuZT8pXHJcbiAgICAgICAgICAgIC8vICB0aGVuIHdlIGNsb3NlIGl0IGRvd24gYmVmb3JlIHN0YXJ0aW5nIGl0IGFnYWluLlxyXG4gICAgICAgICAgICBpZiAoc2NlbmUuc3lzLmlzQWN0aXZlKCkgfHwgc2NlbmUuc3lzLmlzUGF1c2VkKCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLnN5cy5zaHV0ZG93bigpO1xyXG5cclxuICAgICAgICAgICAgICAgIHNjZW5lLnN5cy5zdGFydChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLnN5cy5zdGFydChkYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgbG9hZGVyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzY2VuZS5zeXMubG9hZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBzY2VuZS5zeXMubG9hZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgRmlsZXMgcGF5bG9hZD9cclxuICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgJiYgc2NlbmUuc3lzLnNldHRpbmdzLmhhc093blByb3BlcnR5KCdwYWNrJykpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnJlc2V0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIuYWRkUGFjayh7IHBheWxvYWQ6IHNjZW5lLnN5cy5zZXR0aW5ncy5wYWNrIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmUuc3lzLnNldHRpbmdzLnN0YXR1cyA9IENPTlNULkxPQURJTkc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIub25jZShMb2FkZXJFdmVudHMuQ09NUExFVEUsIHRoaXMucGF5bG9hZENvbXBsZXRlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5zdGFydCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJvb3RTY2VuZShzY2VuZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGUgZ2l2ZW4gU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNzdG9wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIHN0b3AuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSBvYmplY3QgdG8gcGFzcyB0byBTY2VuZS5zaHV0ZG93bi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHN0b3A6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5nZXRTY2VuZShrZXkpO1xyXG5cclxuICAgICAgICBpZiAoc2NlbmUgJiYgIXNjZW5lLnN5cy5pc1RyYW5zaXRpb25pbmcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy5zaHV0ZG93bihkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNsZWVwcyBvbmUgb25lIFNjZW5lIGFuZCBzdGFydHMgdGhlIG90aGVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjc3dpdGNoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbSAtIFRoZSBTY2VuZSB0byBzbGVlcC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0byAtIFRoZSBTY2VuZSB0byBzdGFydC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHN3aXRjaDogZnVuY3Rpb24gKGZyb20sIHRvKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzY2VuZUEgPSB0aGlzLmdldFNjZW5lKGZyb20pO1xyXG4gICAgICAgIHZhciBzY2VuZUIgPSB0aGlzLmdldFNjZW5lKHRvKTtcclxuXHJcbiAgICAgICAgaWYgKHNjZW5lQSAmJiBzY2VuZUIgJiYgc2NlbmVBICE9PSBzY2VuZUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNsZWVwKGZyb20pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTbGVlcGluZyh0bykpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMud2FrZSh0byk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KHRvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIGEgU2NlbmUgYnkgbnVtZXJpYyBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI2dldEF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBTY2VuZSB0byByZXRyaWV2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoUGhhc2VyLlNjZW5lfHVuZGVmaW5lZCl9IFRoZSBTY2VuZS5cclxuICAgICAqL1xyXG4gICAgZ2V0QXQ6IGZ1bmN0aW9uIChpbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY2VuZXNbaW5kZXhdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjZ2V0SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgaW5kZXggb2YgdGhlIFNjZW5lLlxyXG4gICAgICovXHJcbiAgICBnZXRJbmRleDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc2NlbmUgPSB0aGlzLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNjZW5lcy5pbmRleE9mKHNjZW5lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcmluZ3MgYSBTY2VuZSB0byB0aGUgdG9wIG9mIHRoZSBTY2VuZXMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1lYW5zIGl0IHdpbGwgcmVuZGVyIGFib3ZlIGFsbCBvdGhlciBTY2VuZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNicmluZ1RvVG9wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlNjZW5lKX0ga2V5IC0gVGhlIFNjZW5lIHRvIG1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXJ9IFRoaXMgU2NlbmVNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBicmluZ1RvVG9wOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcDogJ2JyaW5nVG9Ub3AnLCBrZXlBOiBrZXksIGtleUI6IG51bGwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0SW5kZXgoa2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggPCB0aGlzLnNjZW5lcy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXMucHVzaChzY2VuZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlbmRzIGEgU2NlbmUgdG8gdGhlIGJhY2sgb2YgdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWVhbnMgaXQgd2lsbCByZW5kZXIgYmVsb3cgYWxsIG90aGVyIFNjZW5lcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI3NlbmRUb0JhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBrZXkgLSBUaGUgU2NlbmUgdG8gbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHNlbmRUb0JhY2s6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNQcm9jZXNzaW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcXVldWUucHVzaCh7IG9wOiAnc2VuZFRvQmFjaycsIGtleUE6IGtleSwga2V5QjogbnVsbCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRJbmRleChrZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXMudW5zaGlmdChzY2VuZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIGEgU2NlbmUgZG93biBvbmUgcG9zaXRpb24gaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjbW92ZURvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBrZXkgLSBUaGUgU2NlbmUgdG8gbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIG1vdmVEb3duOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcDogJ21vdmVEb3duJywga2V5QToga2V5LCBrZXlCOiBudWxsIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhBID0gdGhpcy5nZXRJbmRleChrZXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4QSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleEIgPSBpbmRleEEgLSAxO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNjZW5lQSA9IHRoaXMuZ2V0U2NlbmUoa2V5KTtcclxuICAgICAgICAgICAgICAgIHZhciBzY2VuZUIgPSB0aGlzLmdldEF0KGluZGV4Qik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXNbaW5kZXhBXSA9IHNjZW5lQjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVzW2luZGV4Ql0gPSBzY2VuZUE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIGEgU2NlbmUgdXAgb25lIHBvc2l0aW9uIGluIHRoZSBTY2VuZXMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI21vdmVVcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5TY2VuZSl9IGtleSAtIFRoZSBTY2VuZSB0byBtb3ZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyfSBUaGlzIFNjZW5lTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgbW92ZVVwOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcDogJ21vdmVVcCcsIGtleUE6IGtleSwga2V5QjogbnVsbCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4QSA9IHRoaXMuZ2V0SW5kZXgoa2V5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleEEgPCB0aGlzLnNjZW5lcy5sZW5ndGggLSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXhCID0gaW5kZXhBICsgMTtcclxuICAgICAgICAgICAgICAgIHZhciBzY2VuZUEgPSB0aGlzLmdldFNjZW5lKGtleSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2NlbmVCID0gdGhpcy5nZXRBdChpbmRleEIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVzW2luZGV4QV0gPSBzY2VuZUI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lc1tpbmRleEJdID0gc2NlbmVBO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyBhIFNjZW5lIHNvIGl0IGlzIGltbWVkaWF0ZWx5IGFib3ZlIGFub3RoZXIgU2NlbmUgaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWVhbnMgaXQgd2lsbCByZW5kZXIgb3ZlciB0aGUgdG9wIG9mIHRoZSBvdGhlciBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI21vdmVBYm92ZVxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5TY2VuZSl9IGtleUEgLSBUaGUgU2NlbmUgdGhhdCBTY2VuZSBCIHdpbGwgYmUgbW92ZWQgYWJvdmUuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlNjZW5lKX0ga2V5QiAtIFRoZSBTY2VuZSB0byBiZSBtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIG1vdmVBYm92ZTogZnVuY3Rpb24gKGtleUEsIGtleUIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleUEgPT09IGtleUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcDogJ21vdmVBYm92ZScsIGtleUE6IGtleUEsIGtleUI6IGtleUIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleEEgPSB0aGlzLmdldEluZGV4KGtleUEpO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhCID0gdGhpcy5nZXRJbmRleChrZXlCKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleEEgIT09IC0xICYmIGluZGV4QiAhPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wU2NlbmUgPSB0aGlzLmdldEF0KGluZGV4Qik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXMuc3BsaWNlKGluZGV4QiwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEFkZCBpbiBuZXcgbG9jYXRpb25cclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVzLnNwbGljZShpbmRleEEgKyAxLCAwLCB0ZW1wU2NlbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyBhIFNjZW5lIHNvIGl0IGlzIGltbWVkaWF0ZWx5IGJlbG93IGFub3RoZXIgU2NlbmUgaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWVhbnMgaXQgd2lsbCByZW5kZXIgYmVoaW5kIHRoZSBvdGhlciBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyI21vdmVCZWxvd1xyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5TY2VuZSl9IGtleUEgLSBUaGUgU2NlbmUgdGhhdCBTY2VuZSBCIHdpbGwgYmUgbW92ZWQgYWJvdmUuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlNjZW5lKX0ga2V5QiAtIFRoZSBTY2VuZSB0byBiZSBtb3ZlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIG1vdmVCZWxvdzogZnVuY3Rpb24gKGtleUEsIGtleUIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleUEgPT09IGtleUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goeyBvcDogJ21vdmVCZWxvdycsIGtleUE6IGtleUEsIGtleUI6IGtleUIgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleEEgPSB0aGlzLmdldEluZGV4KGtleUEpO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhCID0gdGhpcy5nZXRJbmRleChrZXlCKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleEEgIT09IC0xICYmIGluZGV4QiAhPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wU2NlbmUgPSB0aGlzLmdldEF0KGluZGV4Qik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXMuc3BsaWNlKGluZGV4QiwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4QSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lcy51bnNoaWZ0KHRlbXBTY2VuZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIEFkZCBpbiBuZXcgbG9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lcy5zcGxpY2UoaW5kZXhBLCAwLCB0ZW1wU2NlbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBRdWV1ZSBhIFNjZW5lIG9wZXJhdGlvbiBmb3IgdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjcXVldWVPcFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcCAtIFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBrZXlBIC0gU2NlbmUgQS5cclxuICAgICAqIEBwYXJhbSB7KGFueXxzdHJpbmd8UGhhc2VyLlNjZW5lKX0gW2tleUJdIC0gU2NlbmUgQiwgb3IgYSBkYXRhIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn0gVGhpcyBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHF1ZXVlT3A6IGZ1bmN0aW9uIChvcCwga2V5QSwga2V5QilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHsgb3A6IG9wLCBrZXlBOiBrZXlBLCBrZXlCOiBrZXlCIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgcG9zaXRpb25zIG9mIHR3byBTY2VuZXMgaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjc3dhcFBvc2l0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlNjZW5lKX0ga2V5QSAtIFRoZSBmaXJzdCBTY2VuZSB0byBzd2FwLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5TY2VuZSl9IGtleUIgLSBUaGUgc2Vjb25kIFNjZW5lIHRvIHN3YXAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXJ9IFRoaXMgU2NlbmVNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBzd2FwUG9zaXRpb246IGZ1bmN0aW9uIChrZXlBLCBrZXlCKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXlBID09PSBrZXlCKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHsgb3A6ICdzd2FwUG9zaXRpb24nLCBrZXlBOiBrZXlBLCBrZXlCOiBrZXlCIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhBID0gdGhpcy5nZXRJbmRleChrZXlBKTtcclxuICAgICAgICAgICAgdmFyIGluZGV4QiA9IHRoaXMuZ2V0SW5kZXgoa2V5Qik7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXhBICE9PSBpbmRleEIgJiYgaW5kZXhBICE9PSAtMSAmJiBpbmRleEIgIT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGVtcFNjZW5lID0gdGhpcy5nZXRBdChpbmRleEEpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVzW2luZGV4QV0gPSB0aGlzLnNjZW5lc1tpbmRleEJdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZXNbaW5kZXhCXSA9IHRlbXBTY2VuZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHVtcHMgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBTY2VuZSB0byB0aGUgZGV2ZWxvcGVyIGNvbnNvbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlciNkdW1wXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqL1xyXG4gICAgZHVtcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0ID0gW107XHJcbiAgICAgICAgdmFyIG1hcCA9IFsgJ3BlbmRpbmcnLCAnaW5pdCcsICdzdGFydCcsICdsb2FkaW5nJywgJ2NyZWF0aW5nJywgJ3J1bm5pbmcnLCAncGF1c2VkJywgJ3NsZWVwaW5nJywgJ3NodXRkb3duJywgJ2Rlc3Ryb3llZCcgXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNjZW5lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzeXMgPSB0aGlzLnNjZW5lc1tpXS5zeXM7XHJcblxyXG4gICAgICAgICAgICB2YXIga2V5ID0gKHN5cy5zZXR0aW5ncy52aXNpYmxlICYmIChzeXMuc2V0dGluZ3Muc3RhdHVzID09PSBDT05TVC5SVU5OSU5HIHx8IHN5cy5zZXR0aW5ncy5zdGF0dXMgPT09IENPTlNULlBBVVNFRCkpID8gJ1sqXSAnIDogJ1stXSAnO1xyXG4gICAgICAgICAgICBrZXkgKz0gc3lzLnNldHRpbmdzLmtleSArICcgKCcgKyBtYXBbc3lzLnNldHRpbmdzLnN0YXR1c10gKyAnKSc7XHJcblxyXG4gICAgICAgICAgICBvdXQucHVzaChrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2cob3V0LmpvaW4oJ1xcbicpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95IHRoZSBTY2VuZU1hbmFnZXIgYW5kIGFsbCBvZiBpdHMgU2NlbmUncyBzeXN0ZW1zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZU1hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNjZW5lcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzeXMgPSB0aGlzLnNjZW5lc1tpXS5zeXM7XHJcblxyXG4gICAgICAgICAgICBzeXMuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGUgPSBOT09QO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLl9wZW5kaW5nID0gW107XHJcbiAgICAgICAgdGhpcy5fc3RhcnQgPSBbXTtcclxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNjZW5lTWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgUGx1Z2luQ2FjaGUgPSByZXF1aXJlKCcuLi9wbHVnaW5zL1BsdWdpbkNhY2hlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIHByb3h5IGNsYXNzIHRvIHRoZSBHbG9iYWwgU2NlbmUgTWFuYWdlci5cclxuICpcclxuICogQGNsYXNzIFNjZW5lUGx1Z2luXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU2NlbmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHRoYXQgdGhpcyBTY2VuZVBsdWdpbiBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIFNjZW5lUGx1Z2luID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFNjZW5lUGx1Z2luIChzY2VuZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgdGhhdCB0aGlzIFNjZW5lUGx1Z2luIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSBTeXN0ZW1zIGluc3RhbmNlIG9mIHRoZSBTY2VuZSB0aGF0IHRoaXMgU2NlbmVQbHVnaW4gYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc3lzdGVtc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zID0gc2NlbmUuc3lzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc2V0dGluZ3Mgb2YgdGhlIFNjZW5lIHRoaXMgU2NlbmVQbHVnaW4gYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc2V0dGluZ3NcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc09iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2NlbmUuc3lzLnNldHRpbmdzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUga2V5IG9mIHRoZSBTY2VuZSB0aGlzIFNjZW5lUGx1Z2luIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI2tleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5rZXkgPSBzY2VuZS5zeXMuc2V0dGluZ3Mua2V5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgR2FtZSdzIFNjZW5lTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmVzLlNjZW5lTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBzY2VuZS5zeXMuZ2FtZS5zY2VuZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBTY2VuZSBpcyBjdXJyZW50bHkgdHJhbnNpdGlvbmluZyB0byBhbm90aGVyLCB0aGlzIGhvbGRzXHJcbiAgICAgICAgICogdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiN0cmFuc2l0aW9uUHJvZ3Jlc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHJhbnNpdGlvblByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJhbnNpdGlvbiBlbGFwc2VkIHRpbWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNfZWxhcHNlZFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRyYW5zaXRpb24gZWxhcHNlZCB0aW1lci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jX3RhcmdldFxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLlNjZW5lcy5TY2VuZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RhcmdldCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRyYW5zaXRpb24gZHVyYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI19kdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUcmFuc2l0aW9uIGNhbGxiYWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNfb25VcGRhdGVcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9vblVwZGF0ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVHJhbnNpdGlvbiBjYWxsYmFjayBzY29wZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jX29uVXBkYXRlU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fb25VcGRhdGVTY29wZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2lsbCB0aGlzIFNjZW5lIHNsZWVwICh0cnVlKSBhZnRlciB0aGUgdHJhbnNpdGlvbiwgb3Igc3RvcCAoZmFsc2UpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI193aWxsU2xlZXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3dpbGxTbGVlcCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaWxsIHRoaXMgU2NlbmUgYmUgcmVtb3ZlZCBmcm9tIHRoZSBTY2VuZSBNYW5hZ2VyIGFmdGVyIHRoZSB0cmFuc2l0aW9uIGNvbXBsZXRlcz9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jX3dpbGxSZW1vdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3dpbGxSZW1vdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgc2NlbmUuc3lzLmV2ZW50cy5vbmNlKEV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub24oRXZlbnRzLlNUQVJULCB0aGlzLnBsdWdpblN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub25jZShFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3BsdWdpblN0YXJ0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKi9cclxuICAgIHBsdWdpblN0YXJ0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RhcmdldCA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub25jZShFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNodXRkb3duIHRoaXMgU2NlbmUgYW5kIHJ1biB0aGUgZ2l2ZW4gb25lLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBoYXBwZW4gYXQgdGhlIG5leHQgU2NlbmUgTWFuYWdlciB1cGRhdGUsIG5vdCBpbW1lZGlhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBTY2VuZSB0byBzdGFydC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBUaGUgU2NlbmUgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCdzdG9wJywgdGhpcy5rZXkpO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCdzdGFydCcsIGtleSwgZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RhcnRzIHRoaXMgU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGhhcHBlbiBhdCB0aGUgbmV4dCBTY2VuZSBNYW5hZ2VyIHVwZGF0ZSwgbm90IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNyZXN0YXJ0XHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gVGhlIFNjZW5lIGRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc3RhcnQ6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBrZXkgPSB0aGlzLmtleTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnF1ZXVlT3AoJ3N0b3AnLCBrZXkpO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCdzdGFydCcsIGtleSwgZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgd2lsbCBzdGFydCBhIHRyYW5zaXRpb24gZnJvbSB0aGUgY3VycmVudCBTY2VuZSB0byB0aGUgdGFyZ2V0IFNjZW5lIGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIFRoZSB0cmFuc2l0aW9uIHdpbGwgbGFzdCBmb3IgdGhlIGR1cmF0aW9uIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKlxyXG4gICAgICogWW91IGNhbiBoYXZlIHRoZSB0YXJnZXQgU2NlbmUgbW92ZWQgYWJvdmUgb3IgYmVsb3cgdGhpcyBvbmUgaW4gdGhlIGRpc3BsYXkgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHNwZWNpZnkgYW4gdXBkYXRlIGNhbGxiYWNrLiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBfZXZlcnkgZnJhbWVfIGZvciB0aGUgZHVyYXRpb25cclxuICAgICAqIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgU2NlbmUgY2FuIGVpdGhlciBiZSBzZW50IHRvIHNsZWVwIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zaXRpb24sIG9yIHN0b3BwZWQuIFRoZSBkZWZhdWx0IGlzIHRvIHN0b3AuXHJcbiAgICAgKlxyXG4gICAgICogVGhlcmUgYXJlIGFsc28gNSB0cmFuc2l0aW9uIHJlbGF0ZWQgZXZlbnRzOiBUaGlzIHNjZW5lIHdpbGwgZW1pdCB0aGUgZXZlbnQgYHRyYW5zaXRpb25vdXRgIHdoZW5cclxuICAgICAqIHRoZSB0cmFuc2l0aW9uIGJlZ2lucywgd2hpY2ggaXMgdHlwaWNhbGx5IHRoZSBmcmFtZSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLlxyXG4gICAgICpcclxuICAgICAqIFRoZSB0YXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoZSBldmVudCBgdHJhbnNpdGlvbmluaXRgIHdoZW4gdGhhdCBTY2VuZSdzIGBpbml0YCBtZXRob2QgaXMgY2FsbGVkLlxyXG4gICAgICogSXQgd2lsbCB0aGVuIGVtaXQgdGhlIGV2ZW50IGB0cmFuc2l0aW9uc3RhcnRgIHdoZW4gaXRzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQuXHJcbiAgICAgKiBJZiB0aGUgU2NlbmUgd2FzIHNsZWVwaW5nIGFuZCBoYXMgYmVlbiB3b2tlbiB1cCwgaXQgd2lsbCBlbWl0IHRoZSBldmVudCBgdHJhbnNpdGlvbndha2VgIGluc3RlYWQgb2YgdGhlc2UgdHdvLFxyXG4gICAgICogYXMgdGhlIFNjZW5lcyBgaW5pdGAgYW5kIGBjcmVhdGVgIG1ldGhvZHMgYXJlIG5vdCBpbnZva2VkIHdoZW4gYSBTY2VuZSB3YWtlcyB1cC5cclxuICAgICAqXHJcbiAgICAgKiBXaGVuIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBoYXMgZWxhcHNlZCBpdCB3aWxsIGVtaXQgdGhlIGV2ZW50IGB0cmFuc2l0aW9uY29tcGxldGVgLlxyXG4gICAgICogVGhlc2UgZXZlbnRzIGFyZSBjbGVhcmVkIG9mIGFsbCBsaXN0ZW5lcnMgd2hlbiB0aGUgU2NlbmUgc2h1dHMgZG93biwgYnV0IG5vdCBpZiBpdCBpcyBzZW50IHRvIHNsZWVwLlxyXG4gICAgICpcclxuICAgICAqIEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gYmVnaW5zIHRoZSBtb21lbnQgeW91IGNhbGwgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBJZiB0aGUgU2NlbmUgeW91IGFyZSB0cmFuc2l0aW9uaW5nIHRvIGluY2x1ZGVzIGRlbGF5ZWQgcHJvY2Vzc2VzLCBzdWNoIGFzIHdhaXRpbmcgZm9yIGZpbGVzIHRvIGxvYWQsIHRoZVxyXG4gICAgICogdGltZSBzdGlsbCBjb3VudHMgZG93biBldmVuIHdoaWxlIHRoYXQgaXMgaGFwcGVuaW5nLiBJZiB0aGUgZ2FtZSBpdHNlbGYgcGF1c2VzLCBvciBzb21ldGhpbmcgZWxzZSBjYXVzZXNcclxuICAgICAqIHRoaXMgU2NlbmVzIHVwZGF0ZSBsb29wIHRvIHN0b3AsIHRoZW4gdGhlIHRyYW5zaXRpb24gd2lsbCBhbHNvIHBhdXNlIGZvciB0aGF0IGR1cmF0aW9uLiBUaGVyZSBhcmVcclxuICAgICAqIGNoZWNrcyBpbiBwbGFjZSB0byBwcmV2ZW50IHlvdSBhY2NpZGVudGFsbHkgc3RvcHBpbmcgYSB0cmFuc2l0aW9uaW5nIFNjZW5lIGJ1dCBpZiB5b3UndmUgZ290IGNvZGUgdG9cclxuICAgICAqIG92ZXJyaWRlIHRoaXMgdW5kZXJzdGFuZCB0aGF0IHVudGlsIHRoZSB0YXJnZXQgU2NlbmUgY29tcGxldGVzIGl0IG1pZ2h0IG5ldmVyIGJlIHVubG9ja2VkIGZvciBpbnB1dCBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3RyYW5zaXRpb25cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNUUkFOU0lUSU9OX09VVFxyXG4gICAgICogQHNpbmNlIDMuNS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuU2NlbmVzLlNjZW5lVHJhbnNpdGlvbkNvbmZpZ30gY29uZmlnIC0gVGhlIHRyYW5zaXRpb24gY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlzIHRoZSB0cmFuc2l0aW9uIHdhcyBzdGFydGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgdHJhbnNpdGlvbjogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICAgICAgdmFyIGtleSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0YXJnZXQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLm1hbmFnZXIuZ2V0U2NlbmUoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKCFrZXkgfHwgIXRoaXMuY2hlY2tWYWxpZFRyYW5zaXRpb24odGFyZ2V0KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IEdldEZhc3RWYWx1ZShjb25maWcsICdkdXJhdGlvbicsIDEwMDApO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGFwc2VkID0gMDtcclxuICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0aGlzLl93aWxsU2xlZXAgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc2xlZXAnLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fd2lsbFJlbW92ZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdyZW1vdmUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHZhciBjYWxsYmFjayA9IEdldEZhc3RWYWx1ZShjb25maWcsICdvblVwZGF0ZScsIG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoY2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xyXG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ29uVXBkYXRlU2NvcGUnLCB0aGlzLnNjZW5lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBhbGxvd0lucHV0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2FsbG93SW5wdXQnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MudHJhbnNpdGlvbkFsbG93SW5wdXQgPSBhbGxvd0lucHV0O1xyXG5cclxuICAgICAgICB2YXIgdGFyZ2V0U2V0dGluZ3MgPSB0YXJnZXQuc3lzLnNldHRpbmdzO1xyXG5cclxuICAgICAgICB0YXJnZXRTZXR0aW5ncy5pc1RyYW5zaXRpb24gPSB0cnVlO1xyXG4gICAgICAgIHRhcmdldFNldHRpbmdzLnRyYW5zaXRpb25Gcm9tID0gdGhpcy5zY2VuZTtcclxuICAgICAgICB0YXJnZXRTZXR0aW5ncy50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbjtcclxuICAgICAgICB0YXJnZXRTZXR0aW5ncy50cmFuc2l0aW9uQWxsb3dJbnB1dCA9IGFsbG93SW5wdXQ7XHJcblxyXG4gICAgICAgIGlmIChHZXRGYXN0VmFsdWUoY29uZmlnLCAnbW92ZUFib3ZlJywgZmFsc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLm1vdmVBYm92ZSh0aGlzLmtleSwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoR2V0RmFzdFZhbHVlKGNvbmZpZywgJ21vdmVCZWxvdycsIGZhbHNlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5tb3ZlQmVsb3codGhpcy5rZXksIGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFyZ2V0LnN5cy5pc1NsZWVwaW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0YXJnZXQuc3lzLndha2UoR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RhdGEnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5zdGFydChrZXksIEdldEZhc3RWYWx1ZShjb25maWcsICdkYXRhJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5lbWl0KEV2ZW50cy5UUkFOU0lUSU9OX09VVCwgdGFyZ2V0LCBkdXJhdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuc3lzdGVtcy5ldmVudHMub24oRXZlbnRzLlVQREFURSwgdGhpcy5zdGVwLCB0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGlzIFNjZW5lIGNhbiB0cmFuc2l0aW9uIHRvIHRoZSB0YXJnZXQgU2NlbmUgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNjaGVja1ZhbGlkVHJhbnNpdGlvblxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSB0YXJnZXQgLSBUaGUgU2NlbmUgdG8gdGVzdCBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGlzIFNjZW5lIGNhbiB0cmFuc2l0aW9uLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgY2hlY2tWYWxpZFRyYW5zaXRpb246IGZ1bmN0aW9uICh0YXJnZXQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE5vdCBhIHZhbGlkIHRhcmdldCBpZiBpdCBkb2Vzbid0IGV4aXN0LCBpc24ndCBhY3RpdmUgb3IgaXMgYWxyZWFkeSB0cmFuc2l0aW9uaW5nIGluIG9yIG91dFxyXG4gICAgICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldC5zeXMuaXNBY3RpdmUoKSB8fCB0YXJnZXQuc3lzLmlzVHJhbnNpdGlvbmluZygpIHx8IHRhcmdldCA9PT0gdGhpcy5zY2VuZSB8fCB0aGlzLnN5c3RlbXMuaXNUcmFuc2l0aW9uaW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNpbmdsZSBnYW1lIHN0ZXAuIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgdGhlIHBhcmVudCBTY2VuZSBpcyB0cmFuc2l0aW9uaW5nXHJcbiAgICAgKiBvdXQgdG8gYW5vdGhlciBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc3RlcFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZS4gRWl0aGVyIGEgSGlnaCBSZXNvbHV0aW9uIFRpbWVyIHZhbHVlIGlmIGl0IGNvbWVzIGZyb20gUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIERhdGUubm93IGlmIHVzaW5nIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gICAgICovXHJcbiAgICBzdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZWxhcHNlZCArPSBkZWx0YTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uUHJvZ3Jlc3MgPSBDbGFtcCh0aGlzLl9lbGFwc2VkIC8gdGhpcy5fZHVyYXRpb24sIDAsIDEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fb25VcGRhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZS5jYWxsKHRoaXMuX29uVXBkYXRlU2NvcGUsIHRoaXMudHJhbnNpdGlvblByb2dyZXNzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9lbGFwc2VkID49IHRoaXMuX2R1cmF0aW9uKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uQ29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGJ5IGBzdGVwYCB3aGVuIHRoZSB0cmFuc2l0aW9uIG91dCBvZiB0aGlzIHNjZW5lIHRvIGFub3RoZXIgaXMgb3Zlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jdHJhbnNpdGlvbkNvbXBsZXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1RSQU5TSVRJT05fQ09NUExFVEVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICB0cmFuc2l0aW9uQ29tcGxldGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRhcmdldFN5cyA9IHRoaXMuX3RhcmdldC5zeXM7XHJcbiAgICAgICAgdmFyIHRhcmdldFNldHRpbmdzID0gdGhpcy5fdGFyZ2V0LnN5cy5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgLy8gIFN0b3AgdGhlIHN0ZXBcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9mZihFdmVudHMuVVBEQVRFLCB0aGlzLnN0ZXAsIHRoaXMpO1xyXG5cclxuICAgICAgICAvLyAgTm90aWZ5IHRhcmdldCBzY2VuZVxyXG4gICAgICAgIHRhcmdldFN5cy5ldmVudHMuZW1pdChFdmVudHMuVFJBTlNJVElPTl9DT01QTEVURSwgdGhpcy5zY2VuZSk7XHJcblxyXG4gICAgICAgIC8vICBDbGVhciB0YXJnZXQgc2NlbmUgc2V0dGluZ3NcclxuICAgICAgICB0YXJnZXRTZXR0aW5ncy5pc1RyYW5zaXRpb24gPSBmYWxzZTtcclxuICAgICAgICB0YXJnZXRTZXR0aW5ncy50cmFuc2l0aW9uRnJvbSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vICBDbGVhciBsb2NhbCBzZXR0aW5nc1xyXG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gMDtcclxuICAgICAgICB0aGlzLl90YXJnZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vblVwZGF0ZVNjb3BlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gIE5vdyBldmVyeXRoaW5nIGlzIGNsZWFyIHdlIGNhbiBoYW5kbGUgd2hhdCBoYXBwZW5zIHRvIHRoaXMgU2NlbmVcclxuICAgICAgICBpZiAodGhpcy5fd2lsbFJlbW92ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5yZW1vdmUodGhpcy5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl93aWxsU2xlZXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN5c3RlbXMuc2xlZXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnN0b3AodGhpcy5rZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgdGhlIFNjZW5lIGludG8gdGhlIFNjZW5lIE1hbmFnZXIgYW5kIHN0YXJ0IGl0IGlmICdhdXRvU3RhcnQnIGlzIHRydWUgb3IgdGhlIFNjZW5lIGNvbmZpZyAnYWN0aXZlJyBwcm9wZXJ0eSBpcyBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBTY2VuZSBrZXkuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuU2NlbmV8UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc0NvbmZpZ3xQaGFzZXIuVHlwZXMuU2NlbmVzLkNyZWF0ZVNjZW5lRnJvbU9iamVjdENvbmZpZ3xmdW5jdGlvbil9IHNjZW5lQ29uZmlnIC0gVGhlIGNvbmZpZyBmb3IgdGhlIFNjZW5lLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvU3RhcnQgLSBXaGV0aGVyIHRvIHN0YXJ0IHRoZSBTY2VuZSBhZnRlciBpdCdzIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIE9wdGlvbmFsIGRhdGEgb2JqZWN0LiBUaGlzIHdpbGwgYmUgc2V0IGFzIFNjZW5lLnNldHRpbmdzLmRhdGEgYW5kIHBhc3NlZCB0byBgU2NlbmUuaW5pdGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lfSBBbiBpbnN0YW5jZSBvZiB0aGUgU2NlbmUgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIFNjZW5lIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKGtleSwgc2NlbmVDb25maWcsIGF1dG9TdGFydCwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmFkZChrZXksIHNjZW5lQ29uZmlnLCBhdXRvU3RhcnQsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExhdW5jaCB0aGUgZ2l2ZW4gU2NlbmUgYW5kIHJ1biBpdCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgb25lLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBoYXBwZW4gYXQgdGhlIG5leHQgU2NlbmUgTWFuYWdlciB1cGRhdGUsIG5vdCBpbW1lZGlhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jbGF1bmNoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIGxhdW5jaC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBUaGUgU2NlbmUgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbGF1bmNoOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgJiYga2V5ICE9PSB0aGlzLmtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCdzdGFydCcsIGtleSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSdW5zIHRoZSBnaXZlbiBTY2VuZSwgYnV0IGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhpcyBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgaGFwcGVuIGF0IHRoZSBuZXh0IFNjZW5lIE1hbmFnZXIgdXBkYXRlLCBub3QgaW1tZWRpYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIGdpdmVuIFNjZW5lIGlzIHBhdXNlZCwgaXQgd2lsbCByZXN1bWUgaXQuIElmIHNsZWVwaW5nLCBpdCB3aWxsIHdha2UgaXQuXHJcbiAgICAgKiBJZiBub3QgcnVubmluZyBhdCBhbGwsIGl0IHdpbGwgYmUgc3RhcnRlZC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgdGhpcyBpZiB5b3Ugd2lzaCB0byBvcGVuIGEgbW9kYWwgU2NlbmUgYnkgY2FsbGluZyBgcGF1c2VgIG9uIHRoZSBjdXJyZW50XHJcbiAgICAgKiBTY2VuZSwgdGhlbiBgcnVuYCBvbiB0aGUgbW9kYWwgU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3J1blxyXG4gICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gcnVuLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIEEgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2NlbmUgYW5kIGVtaXR0ZWQgaW4gaXRzIHJlYWR5LCB3YWtlLCBvciByZXN1bWUgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW59IFRoaXMgU2NlbmVQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBydW46IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSAmJiBrZXkgIT09IHRoaXMua2V5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLnF1ZXVlT3AoJ3J1bicsIGtleSwgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXVzZSB0aGUgU2NlbmUgLSB0aGlzIHN0b3BzIHRoZSB1cGRhdGUgc3RlcCBmcm9tIGhhcHBlbmluZyBidXQgaXQgc3RpbGwgcmVuZGVycy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHdpbGwgaGFwcGVuIGF0IHRoZSBuZXh0IFNjZW5lIE1hbmFnZXIgdXBkYXRlLCBub3QgaW1tZWRpYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3BhdXNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gcGF1c2UuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2NlbmUgYW5kIGVtaXR0ZWQgaW4gaXRzIHBhdXNlIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW59IFRoaXMgU2NlbmVQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwYXVzZTogZnVuY3Rpb24gKGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHsga2V5ID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnF1ZXVlT3AoJ3BhdXNlJywga2V5LCBkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lIHRoZSBTY2VuZSAtIHN0YXJ0cyB0aGUgdXBkYXRlIGxvb3AgYWdhaW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGhhcHBlbiBhdCB0aGUgbmV4dCBTY2VuZSBNYW5hZ2VyIHVwZGF0ZSwgbm90IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNyZXN1bWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBTY2VuZSB0byByZXN1bWUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2NlbmUgYW5kIGVtaXR0ZWQgaW4gaXRzIHJlc3VtZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucXVldWVPcCgncmVzdW1lJywga2V5LCBkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZXMgdGhlIFNjZW5lIHNsZWVwIChubyB1cGRhdGUsIG5vIHJlbmRlcikgYnV0IGRvZXNuJ3Qgc2h1dGRvd24uXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGhhcHBlbiBhdCB0aGUgbmV4dCBTY2VuZSBNYW5hZ2VyIHVwZGF0ZSwgbm90IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNzbGVlcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIHB1dCB0byBzbGVlcC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBTY2VuZSBhbmQgZW1pdHRlZCBpbiBpdHMgc2xlZXAgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNsZWVwOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucXVldWVPcCgnc2xlZXAnLCBrZXksIGRhdGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYWtlcyB0aGUgU2NlbmUgd2FrZS11cCAoc3RhcnRzIHVwZGF0ZSBhbmQgcmVuZGVyKVxyXG4gICAgICpcclxuICAgICAqIFRoaXMgd2lsbCBoYXBwZW4gYXQgdGhlIG5leHQgU2NlbmUgTWFuYWdlciB1cGRhdGUsIG5vdCBpbW1lZGlhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jd2FrZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIHdha2UgdXAuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgU2NlbmUgYW5kIGVtaXR0ZWQgaW4gaXRzIHdha2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHdha2U6IGZ1bmN0aW9uIChrZXksIGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCd3YWtlJywga2V5LCBkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFrZXMgdGhpcyBTY2VuZSBzbGVlcCB0aGVuIHN0YXJ0cyB0aGUgU2NlbmUgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIGhhcHBlbiBhdCB0aGUgbmV4dCBTY2VuZSBNYW5hZ2VyIHVwZGF0ZSwgbm90IGltbWVkaWF0ZWx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNzd2l0Y2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgU2NlbmUgdG8gc3RhcnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN3aXRjaDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ICE9PSB0aGlzLmtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5xdWV1ZU9wKCdzd2l0Y2gnLCB0aGlzLmtleSwga2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNodXRkb3duIHRoZSBTY2VuZSwgY2xlYXJpbmcgZGlzcGxheSBsaXN0LCB0aW1lcnMsIGV0Yy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGhhcHBlbnMgYXQgdGhlIG5leHQgU2NlbmUgTWFuYWdlciB1cGRhdGUsIG5vdCBpbW1lZGlhdGVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc3RvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIHN0b3AuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSBvYmplY3QgdG8gcGFzcyB0byBTY2VuZS5TeXN0ZW1zLnNodXRkb3duLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW59IFRoaXMgU2NlbmVQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoa2V5LCBkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucXVldWVPcCgnc3RvcCcsIGtleSwgZGF0YSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3NldEFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIElmIGB0cnVlYCB0aGUgU2NlbmUgd2lsbCBiZSByZXN1bWVkLiBJZiBgZmFsc2VgIGl0IHdpbGwgYmUgcGF1c2VkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIHNldCB0aGUgYWN0aXZlIHN0YXRlIG9mLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIEFuIG9wdGlvbmFsIGRhdGEgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFNjZW5lIGFuZCBlbWl0dGVkIHdpdGggaXRzIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWN0aXZlOiBmdW5jdGlvbiAodmFsdWUsIGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHsga2V5ID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5tYW5hZ2VyLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIGlmIChzY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy5zZXRBY3RpdmUodmFsdWUsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmlzaWJsZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI3NldFZpc2libGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdmlzaWJsZSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBTY2VuZSB0byBzZXQgdGhlIHZpc2libGUgc3RhdGUgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW59IFRoaXMgU2NlbmVQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiAodmFsdWUsIGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHsga2V5ID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgdmFyIHNjZW5lID0gdGhpcy5tYW5hZ2VyLmdldFNjZW5lKGtleSk7XHJcblxyXG4gICAgICAgIGlmIChzY2VuZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNjZW5lLnN5cy5zZXRWaXNpYmxlKHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gU2NlbmUgaXMgc2xlZXBpbmcgb3Igbm90P1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNpc1NsZWVwaW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgU2NlbmUgaXMgc2xlZXBpbmcuXHJcbiAgICAgKi9cclxuICAgIGlzU2xlZXBpbmc6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaXNTbGVlcGluZyhrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gU2NlbmUgaXMgcnVubmluZyBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI2lzQWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgU2NlbmUgaXMgcnVubmluZy5cclxuICAgICAqL1xyXG4gICAgaXNBY3RpdmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaXNBY3RpdmUoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIFNjZW5lIGlzIHBhdXNlZCBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2luI2lzUGF1c2VkXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFNjZW5lIGlzIHBhdXNlZC5cclxuICAgICAqL1xyXG4gICAgaXNQYXVzZWQ6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaXNQYXVzZWQoa2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIFNjZW5lIGlzIHZpc2libGUgb3Igbm90P1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNpc1Zpc2libGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBTY2VuZSB0byBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBTY2VuZSBpcyB2aXNpYmxlLlxyXG4gICAgICovXHJcbiAgICBpc1Zpc2libGU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7IGtleSA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaXNWaXNpYmxlKGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHBvc2l0aW9uIG9mIHR3byBzY2VuZXMgaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgY29udHJvbHMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJlbmRlcmVkIGFuZCB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNzd2FwUG9zaXRpb25cclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlBIC0gVGhlIGZpcnN0IFNjZW5lIHRvIHN3YXAuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleUJdIC0gVGhlIHNlY29uZCBTY2VuZSB0byBzd2FwLiBJZiBub25lIGlzIGdpdmVuIGl0IGRlZmF1bHRzIHRvIHRoaXMgU2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN3YXBQb3NpdGlvbjogZnVuY3Rpb24gKGtleUEsIGtleUIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGtleUIgPT09IHVuZGVmaW5lZCkgeyBrZXlCID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgaWYgKGtleUEgIT09IGtleUIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hbmFnZXIuc3dhcFBvc2l0aW9uKGtleUEsIGtleUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHBvc2l0aW9uIG9mIHR3byBzY2VuZXMgaW4gdGhlIFNjZW5lcyBsaXN0LCBzbyB0aGF0IFNjZW5lIEIgaXMgZGlyZWN0bHkgYWJvdmUgU2NlbmUgQS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGNvbnRyb2xzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSByZW5kZXJlZCBhbmQgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jbW92ZUFib3ZlXHJcbiAgICAgKiBAc2luY2UgMy4yLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5QSAtIFRoZSBTY2VuZSB0aGF0IFNjZW5lIEIgd2lsbCBiZSBtb3ZlZCB0byBiZSBhYm92ZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5Ql0gLSBUaGUgU2NlbmUgdG8gYmUgbW92ZWQuIElmIG5vbmUgaXMgZ2l2ZW4gaXQgZGVmYXVsdHMgdG8gdGhpcyBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbW92ZUFib3ZlOiBmdW5jdGlvbiAoa2V5QSwga2V5QilcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5QiA9PT0gdW5kZWZpbmVkKSB7IGtleUIgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICBpZiAoa2V5QSAhPT0ga2V5QilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5tb3ZlQWJvdmUoa2V5QSwga2V5Qik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTd2FwcyB0aGUgcG9zaXRpb24gb2YgdHdvIHNjZW5lcyBpbiB0aGUgU2NlbmVzIGxpc3QsIHNvIHRoYXQgU2NlbmUgQiBpcyBkaXJlY3RseSBiZWxvdyBTY2VuZSBBLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgY29udHJvbHMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJlbmRlcmVkIGFuZCB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNtb3ZlQmVsb3dcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlBIC0gVGhlIFNjZW5lIHRoYXQgU2NlbmUgQiB3aWxsIGJlIG1vdmVkIHRvIGJlIGJlbG93LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXlCXSAtIFRoZSBTY2VuZSB0byBiZSBtb3ZlZC4gSWYgbm9uZSBpcyBnaXZlbiBpdCBkZWZhdWx0cyB0byB0aGlzIFNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW59IFRoaXMgU2NlbmVQbHVnaW4gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBtb3ZlQmVsb3c6IGZ1bmN0aW9uIChrZXlBLCBrZXlCKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXlCID09PSB1bmRlZmluZWQpIHsga2V5QiA9IHRoaXMua2V5OyB9XHJcblxyXG4gICAgICAgIGlmIChrZXlBICE9PSBrZXlCKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYW5hZ2VyLm1vdmVCZWxvdyhrZXlBLCBrZXlCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBTY2VuZSBmcm9tIHRoZSBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIFNjZW5lIGlzIHJlbW92ZWQgZnJvbSB0aGUgbG9jYWwgc2NlbmVzIGFycmF5LCBpdCdzIGtleSBpcyBjbGVhcmVkIGZyb20gdGhlIGtleXNcclxuICAgICAqIGNhY2hlIGFuZCBTY2VuZS5TeXN0ZW1zLmRlc3Ryb3kgaXMgdGhlbiBjYWxsZWQgb24gaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhlIFNjZW5lTWFuYWdlciBpcyBwcm9jZXNzaW5nIHRoZSBTY2VuZXMgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXQgd2lsbFxyXG4gICAgICogcXVldWUgdGhlIG9wZXJhdGlvbiBmb3IgdGhlIG5leHQgdXBkYXRlIHNlcXVlbmNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNyZW1vdmVcclxuICAgICAqIEBzaW5jZSAzLjIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBba2V5XSAtIFRoZSBTY2VuZSB0byBiZSByZW1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU2NlbmVNYW5hZ2VyfSBUaGlzIFNjZW5lTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIucmVtb3ZlKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIGEgU2NlbmUgdXAgb25lIHBvc2l0aW9uIGluIHRoZSBTY2VuZXMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jbW92ZVVwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbW92ZVVwOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIubW92ZVVwKGtleSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIGEgU2NlbmUgZG93biBvbmUgcG9zaXRpb24gaW4gdGhlIFNjZW5lcyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNtb3ZlRG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gVGhlIFNjZW5lIHRvIG1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn0gVGhpcyBTY2VuZVBsdWdpbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG1vdmVEb3duOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIubW92ZURvd24oa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJpbmdzIGEgU2NlbmUgdG8gdGhlIHRvcCBvZiB0aGUgU2NlbmVzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZWFucyBpdCB3aWxsIHJlbmRlciBhYm92ZSBhbGwgb3RoZXIgU2NlbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNicmluZ1RvVG9wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYnJpbmdUb1RvcDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHsga2V5ID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmJyaW5nVG9Ub3Aoa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VuZHMgYSBTY2VuZSB0byB0aGUgYmFjayBvZiB0aGUgU2NlbmVzIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZWFucyBpdCB3aWxsIHJlbmRlciBiZWxvdyBhbGwgb3RoZXIgU2NlbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNzZW5kVG9CYWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUgU2NlbmUgdG8gbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlNjZW5lUGx1Z2lufSBUaGlzIFNjZW5lUGx1Z2luIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2VuZFRvQmFjazogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHsga2V5ID0gdGhpcy5rZXk7IH1cclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnNlbmRUb0JhY2soa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmUgYSBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFNjZW5lIHRvIHJldHJpZXZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZX0gVGhlIFNjZW5lLlxyXG4gICAgICovXHJcbiAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRTY2VuZShrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIFNjZW5lIGluIHRoZSBTY2VuZXMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jZ2V0SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuU2NlbmUpfSBba2V5XSAtIFRoZSBTY2VuZSB0byBnZXQgdGhlIGluZGV4IG9mLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBpbmRleCBvZiB0aGUgU2NlbmUuXHJcbiAgICAgKi9cclxuICAgIGdldEluZGV4OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSB0aGlzLmtleTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldEluZGV4KGtleSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBzaHV0dGluZyBkb3duLlxyXG4gICAgICogV2UgbmVlZCB0byBraWxsIGFuZCByZXNldCBhbGwgaW50ZXJuYWwgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHN0b3AgbGlzdGVuaW5nIHRvIFNjZW5lIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU2NlbmVQbHVnaW4jc2h1dGRvd25cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV2ZW50RW1pdHRlciA9IHRoaXMuc3lzdGVtcy5ldmVudHM7XHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKEV2ZW50cy5QT1NUX1VQREFURSwgdGhpcy5zdGVwLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKEV2ZW50cy5UUkFOU0lUSU9OX09VVCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBiZWluZyBkZXN0cm95ZWQuXHJcbiAgICAgKiBXZSBuZWVkIHRvIHNodXRkb3duIGFuZCB0aGVuIGtpbGwgb2ZmIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbiNkZXN0cm95XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaHV0ZG93bigpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5ldmVudHMub2ZmKEV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuUGx1Z2luQ2FjaGUucmVnaXN0ZXIoJ1NjZW5lUGx1Z2luJywgU2NlbmVQbHVnaW4sICdzY2VuZVBsdWdpbicpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2VuZVBsdWdpbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRWYWx1ZScpO1xyXG52YXIgTWVyZ2UgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvTWVyZ2UnKTtcclxudmFyIEluamVjdGlvbk1hcCA9IHJlcXVpcmUoJy4vSW5qZWN0aW9uTWFwJyk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuU2NlbmVzLlNldHRpbmdzXHJcbiAqL1xyXG5cclxudmFyIFNldHRpbmdzID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBTY2VuZSBjb25maWd1cmF0aW9uIG9iamVjdCBhbmQgcmV0dXJucyBhIGZ1bGx5IGZvcm1lZCBTeXN0ZW0gU2V0dGluZ3Mgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBmdW5jdGlvbiBQaGFzZXIuU2NlbmVzLlNldHRpbmdzLmNyZWF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NDb25maWcpfSBjb25maWcgLSBUaGUgU2NlbmUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBTY2VuZSBTZXR0aW5ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuU2NlbmVzLlNldHRpbmdzT2JqZWN0fSBUaGUgU2NlbmUgU2V0dGluZ3Mgb2JqZWN0IGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNvbmZpZyBhbmQgZGVmYXVsdCBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbmZpZyA9IHsga2V5OiBjb25maWcgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgUGFzcyB0aGUgJ2hhc093blByb3BlcnR5JyBjaGVja3NcclxuICAgICAgICAgICAgY29uZmlnID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG5cclxuICAgICAgICAgICAgc3RhdHVzOiBDT05TVC5QRU5ESU5HLFxyXG5cclxuICAgICAgICAgICAga2V5OiBHZXRWYWx1ZShjb25maWcsICdrZXknLCAnJyksXHJcbiAgICAgICAgICAgIGFjdGl2ZTogR2V0VmFsdWUoY29uZmlnLCAnYWN0aXZlJywgZmFsc2UpLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiBHZXRWYWx1ZShjb25maWcsICd2aXNpYmxlJywgdHJ1ZSksXHJcblxyXG4gICAgICAgICAgICBpc0Jvb3RlZDogZmFsc2UsXHJcblxyXG4gICAgICAgICAgICBpc1RyYW5zaXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uRnJvbTogbnVsbCxcclxuICAgICAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiAwLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uQWxsb3dJbnB1dDogdHJ1ZSxcclxuXHJcbiAgICAgICAgICAgIC8vICBMb2FkZXIgcGF5bG9hZCBhcnJheVxyXG5cclxuICAgICAgICAgICAgZGF0YToge30sXHJcblxyXG4gICAgICAgICAgICBwYWNrOiBHZXRWYWx1ZShjb25maWcsICdwYWNrJywgZmFsc2UpLFxyXG5cclxuICAgICAgICAgICAgLy8gIENhbWVyYXNcclxuXHJcbiAgICAgICAgICAgIGNhbWVyYXM6IEdldFZhbHVlKGNvbmZpZywgJ2NhbWVyYXMnLCBudWxsKSxcclxuXHJcbiAgICAgICAgICAgIC8vICBTY2VuZSBQcm9wZXJ0eSBJbmplY3Rpb24gTWFwXHJcblxyXG4gICAgICAgICAgICBtYXA6IEdldFZhbHVlKGNvbmZpZywgJ21hcCcsIE1lcmdlKEluamVjdGlvbk1hcCwgR2V0VmFsdWUoY29uZmlnLCAnbWFwQWRkJywge30pKSksXHJcblxyXG4gICAgICAgICAgICAvLyAgUGh5c2ljc1xyXG5cclxuICAgICAgICAgICAgcGh5c2ljczogR2V0VmFsdWUoY29uZmlnLCAncGh5c2ljcycsIHt9KSxcclxuXHJcbiAgICAgICAgICAgIC8vICBMb2FkZXJcclxuXHJcbiAgICAgICAgICAgIGxvYWRlcjogR2V0VmFsdWUoY29uZmlnLCAnbG9hZGVyJywge30pLFxyXG5cclxuICAgICAgICAgICAgLy8gIFBsdWdpbnNcclxuXHJcbiAgICAgICAgICAgIHBsdWdpbnM6IEdldFZhbHVlKGNvbmZpZywgJ3BsdWdpbnMnLCBmYWxzZSksXHJcblxyXG4gICAgICAgICAgICAvLyAgSW5wdXRcclxuXHJcbiAgICAgICAgICAgIGlucHV0OiBHZXRWYWx1ZShjb25maWcsICdpbnB1dCcsIHt9KVxyXG5cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0dGluZ3M7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRGVmYXVsdFBsdWdpbnMgPSByZXF1aXJlKCcuLi9wbHVnaW5zL0RlZmF1bHRQbHVnaW5zJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2V0UGh5c2ljc1BsdWdpbnMgPSByZXF1aXJlKCcuL0dldFBoeXNpY3NQbHVnaW5zJyk7XHJcbnZhciBHZXRTY2VuZVBsdWdpbnMgPSByZXF1aXJlKCcuL0dldFNjZW5lUGx1Z2lucycpO1xyXG52YXIgTk9PUCA9IHJlcXVpcmUoJy4uL3V0aWxzL05PT1AnKTtcclxudmFyIFNldHRpbmdzID0gcmVxdWlyZSgnLi9TZXR0aW5ncycpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIFNjZW5lIFN5c3RlbXMgY2xhc3MuXHJcbiAqXHJcbiAqIFRoaXMgY2xhc3MgaXMgYXZhaWxhYmxlIGZyb20gd2l0aGluIGEgU2NlbmUgdW5kZXIgdGhlIHByb3BlcnR5IGBzeXNgLlxyXG4gKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgYWxsIG9mIHRoZSBwbHVnaW5zIGEgU2NlbmUgaGFzIHJ1bm5pbmcsIGluY2x1ZGluZyB0aGUgZGlzcGxheSBsaXN0LCBhbmRcclxuICogaGFuZGxpbmcgdGhlIHVwZGF0ZSBzdGVwIGFuZCByZW5kZXJlci4gSXQgYWxzbyBjb250YWlucyByZWZlcmVuY2VzIHRvIGdsb2JhbCBzeXN0ZW1zIGJlbG9uZ2luZyB0byBHYW1lLlxyXG4gKlxyXG4gKiBAY2xhc3MgU3lzdGVtc1xyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlNjZW5lc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBTeXN0ZW1zIGluc3RhbmNlLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc0NvbmZpZyl9IGNvbmZpZyAtIFNjZW5lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcbiAqL1xyXG52YXIgU3lzdGVtcyA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBTeXN0ZW1zIChzY2VuZSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IHRoZXNlIFN5c3RlbXMgYmVsb25nIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNnYW1lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2FtZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gZWl0aGVyIHRoZSBDYW52YXMgb3IgV2ViR0wgUmVuZGVyZXIgdGhhdCB0aGlzIEdhbWUgaXMgdXNpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjcmVuZGVyZXJcclxuICAgICAgICAgKiBAdHlwZSB7KFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ8UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlcmVyO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIFBMVUdJTl9GQklOU1RBTlQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogVGhlIEZhY2Vib29rIEluc3RhbnQgR2FtZXMgUGx1Z2luLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjZmFjZWJvb2tcclxuICAgICAgICAgICAgICogQHR5cGUge1BoYXNlci5GYWNlYm9va0luc3RhbnRHYW1lc1BsdWdpbn1cclxuICAgICAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5mYWNlYm9vaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSBDb25maWd1cmF0aW9uIG9iamVjdCwgYXMgcGFzc2VkIGluIHdoZW4gY3JlYXRpbmcgdGhlIFNjZW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2NvbmZpZ1xyXG4gICAgICAgICAqIEB0eXBlIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5TY2VuZXMuU2V0dGluZ3NDb25maWcpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgU2V0dGluZ3MuIFRoaXMgaXMgdGhlIHBhcnNlZCBvdXRwdXQgYmFzZWQgb24gdGhlIFNjZW5lIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjc2V0dGluZ3NcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlNjZW5lcy5TZXR0aW5nc09iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNldHRpbmdzID0gU2V0dGluZ3MuY3JlYXRlKGNvbmZpZyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgaGFuZHkgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBjYW52YXMgLyBjb250ZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2NhbnZhc1xyXG4gICAgICAgICAqIEB0eXBlIHtIVE1MQ2FudmFzRWxlbWVudH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbnZhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIENhbnZhcyBSZW5kZXJpbmcgQ29udGV4dCBiZWluZyB1c2VkIGJ5IHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNjb250ZXh0XHJcbiAgICAgICAgICogQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbnRleHQ7XHJcblxyXG4gICAgICAgIC8vICBHbG9iYWwgU3lzdGVtcyAtIHRoZXNlIGFyZSBzaW5nbGUtaW5zdGFuY2UgZ2xvYmFsIG1hbmFnZXJzIHRoYXQgYmVsb25nIHRvIEdhbWVcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBbmltYXRpb25zIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiB0aGUgZGVmYXVsdCBzZXQtdXAgeW91IGNhbiBhY2Nlc3MgdGhpcyBmcm9tIHdpdGhpbiBhIFNjZW5lIHZpYSB0aGUgYHRoaXMuYW5pbXNgIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2FuaW1zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5BbmltYXRpb25zLkFuaW1hdGlvbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5hbmltcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBDYWNoZS4gVGhlIENhY2hlIHN0b3JlcyBhbGwgZmlsZXMgYm91Z2h0IGluIHRvIFBoYXNlciB2aWFcclxuICAgICAgICAgKiB0aGUgTG9hZGVyLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgaW1hZ2VzLiBJbWFnZXMgYXJlIHN0b3JlZCBpbiB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLmNhY2hlYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNjYWNoZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQ2FjaGVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FjaGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgUGx1Z2lucyBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLnBsdWdpbnNgIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI3BsdWdpbnNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlBsdWdpbnMuUGx1Z2luTWFuYWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBsdWdpbnM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuIFRoaXMgaXMgYSBnYW1lLXdpZGUgaW5zdGFuY2Ugb2YgdGhlIERhdGEgTWFuYWdlciwgYWxsb3dpbmdcclxuICAgICAgICAgKiB5b3UgdG8gZXhjaGFuZ2UgZGF0YSBiZXR3ZWVuIFNjZW5lcyB2aWEgYSB1bml2ZXJzYWwgYW5kIHNoYXJlZCBwb2ludC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEluIHRoZSBkZWZhdWx0IHNldC11cCB5b3UgY2FuIGFjY2VzcyB0aGlzIGZyb20gd2l0aGluIGEgU2NlbmUgdmlhIHRoZSBgdGhpcy5yZWdpc3RyeWAgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjcmVnaXN0cnlcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkRhdGEuRGF0YU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZWdpc3RyeTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBTY2FsZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLnNjYWxlYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNzY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NhbGUuU2NhbGVNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE1LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjYWxlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIFNvdW5kIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiB0aGUgZGVmYXVsdCBzZXQtdXAgeW91IGNhbiBhY2Nlc3MgdGhpcyBmcm9tIHdpdGhpbiBhIFNjZW5lIHZpYSB0aGUgYHRoaXMuc291bmRgIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI3NvdW5kXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuU291bmQuTm9BdWRpb1NvdW5kTWFuYWdlcnxQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlcnxQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc291bmQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLnRleHR1cmVzYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyN0ZXh0dXJlc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlcztcclxuXHJcbiAgICAgICAgLy8gIENvcmUgUGx1Z2lucyAtIHRoZXNlIGFyZSBub24tb3B0aW9uYWwgU2NlbmUgcGx1Z2lucywgbmVlZGVkIGJ5IGxvdHMgb2YgdGhlIG90aGVyIHN5c3RlbXNcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lJ3MgR2FtZSBPYmplY3QgRmFjdG9yeS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIHF1aWNrbHkgYW5kIGVhc2lseSBjcmVhdGUgbmV3IEdhbWUgT2JqZWN0J3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiB0aGUgZGVmYXVsdCBzZXQtdXAgeW91IGNhbiBhY2Nlc3MgdGhpcyBmcm9tIHdpdGhpbiBhIFNjZW5lIHZpYSB0aGUgYHRoaXMuYWRkYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNhZGRcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWRkO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUncyBDYW1lcmEgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIG1hbmlwdWxhdGUgYW5kIGNyZWF0ZSBDYW1lcmFzIGZvciB0aGlzIHNwZWNpZmljIFNjZW5lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLmNhbWVyYXNgIHByb3BlcnR5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2NhbWVyYXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmFNYW5hZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FtZXJhcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lJ3MgRGlzcGxheSBMaXN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVXNlIHRoaXMgdG8gb3JnYW5pemUgdGhlIGNoaWxkcmVuIGNvbnRhaW5lZCBpbiB0aGUgZGlzcGxheSBsaXN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHlvdSBjYW4gYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gYSBTY2VuZSB2aWEgdGhlIGB0aGlzLmNoaWxkcmVuYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNkaXNwbGF5TGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuRGlzcGxheUxpc3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGlzdDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lJ3MgRXZlbnQgTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIGxpc3RlbiBmb3IgU2NlbmUgc3BlY2lmaWMgZXZlbnRzLCBzdWNoIGFzIGBwYXVzZWAgYW5kIGBzaHV0ZG93bmAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiB0aGUgZGVmYXVsdCBzZXQtdXAgeW91IGNhbiBhY2Nlc3MgdGhpcyBmcm9tIHdpdGhpbiBhIFNjZW5lIHZpYSB0aGUgYHRoaXMuZXZlbnRzYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNldmVudHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ldmVudHM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSdzIEdhbWUgT2JqZWN0IENyZWF0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBVc2UgdGhpcyB0byBxdWlja2x5IGFuZCBlYXNpbHkgY3JlYXRlIG5ldyBHYW1lIE9iamVjdCdzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZVxyXG4gICAgICAgICAqIEdhbWUgT2JqZWN0IEZhY3RvcnksIGlzIHRoYXQgdGhlIENyZWF0b3IganVzdCBjcmVhdGVzIGFuZCByZXR1cm5zIEdhbWUgT2JqZWN0IGluc3RhbmNlcywgaXRcclxuICAgICAgICAgKiBkb2Vzbid0IHRoZW4gYWRkIHRoZW0gdG8gdGhlIERpc3BsYXkgTGlzdCBvciBVcGRhdGUgTGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEluIHRoZSBkZWZhdWx0IHNldC11cCB5b3UgY2FuIGFjY2VzcyB0aGlzIGZyb20gd2l0aGluIGEgU2NlbmUgdmlhIHRoZSBgdGhpcy5tYWtlYCBwcm9wZXJ0eS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNtYWtlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0Q3JlYXRvcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1ha2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBNYW5hZ2VyIFBsdWdpbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIG1hbmlwdWxhdGUgYm90aCB0aGlzIGFuZCBvdGhlciBTY2VuZSdzIGluIHlvdXIgZ2FtZSwgZm9yIGV4YW1wbGUgdG8gbGF1bmNoIGEgcGFyYWxsZWwgU2NlbmUsXHJcbiAgICAgICAgICogb3IgcGF1c2Ugb3IgcmVzdW1lIGEgU2NlbmUsIG9yIHN3aXRjaCBmcm9tIHRoaXMgU2NlbmUgdG8gYW5vdGhlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEluIHRoZSBkZWZhdWx0IHNldC11cCB5b3UgY2FuIGFjY2VzcyB0aGlzIGZyb20gd2l0aGluIGEgU2NlbmUgdmlhIHRoZSBgdGhpcy5zY2VuZWAgcHJvcGVydHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjc2NlbmVQbHVnaW5cclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TY2VuZVBsdWdpbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lUGx1Z2luO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUncyBVcGRhdGUgTGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFVzZSB0aGlzIHRvIG9yZ2FuaXplIHRoZSBjaGlsZHJlbiBjb250YWluZWQgaW4gdGhlIHVwZGF0ZSBsaXN0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhlIFVwZGF0ZSBMaXN0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBjaGlsZHJlbiB0aGF0IG5lZWQgdGhlaXIgYHByZVVwZGF0ZWAgbWV0aG9kcyBjYWxsZWQsXHJcbiAgICAgICAgICogaW4gb3JkZXIgdG8gcHJvY2VzcyBzbyBpbnRlcm5hbCBjb21wb25lbnRzLCBzdWNoIGFzIFNwcml0ZXMgd2l0aCBBbmltYXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gdGhlIGRlZmF1bHQgc2V0LXVwIHRoZXJlIGlzIG5vIHJlZmVyZW5jZSB0byB0aGlzIGZyb20gd2l0aGluIHRoZSBTY2VuZSBpdHNlbGYuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjdXBkYXRlTGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuVXBkYXRlTGlzdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVwZGF0ZUxpc3Q7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSBVcGRhdGUgZnVuY3Rpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIHN0YXJ0cyBvdXQgYXMgTk9PUCBkdXJpbmcgaW5pdCwgcHJlbG9hZCBhbmQgY3JlYXRlLCBhbmQgYXQgdGhlIGVuZCBvZiBjcmVhdGVcclxuICAgICAgICAgKiBpdCBzd2FwcyB0byBiZSB3aGF0ZXZlciB0aGUgU2NlbmUudXBkYXRlIGZ1bmN0aW9uIGlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI3NjZW5lVXBkYXRlXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2NlbmVVcGRhdGUgPSBOT09QO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IG9uY2UgYnkgdGhlIFNjZW5lIE1hbmFnZXIgd2hlbiB0aGUgU2NlbmUgaXMgaW5zdGFudGlhdGVkLlxyXG4gICAgICogSXQgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdXAgYWxsIG9mIHRoZSBTY2VuZSBwbHVnaW5zIGFuZCByZWZlcmVuY2VzLlxyXG4gICAgICogSXQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNpbml0XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjZW5lcy5FdmVudHMjQk9PVFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgaW5pdDogZnVuY3Rpb24gKGdhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zdGF0dXMgPSBDT05TVC5JTklUO1xyXG5cclxuICAgICAgICAvLyAgVGhpcyB3aWxsIGdldCByZXBsYWNlZCBieSB0aGUgU2NlbmVNYW5hZ2VyIHdpdGggdGhlIGFjdHVhbCB1cGRhdGUgZnVuY3Rpb24sIGlmIGl0IGV4aXN0cywgb25jZSBjcmVhdGUgaXMgb3Zlci5cclxuICAgICAgICB0aGlzLnNjZW5lVXBkYXRlID0gTk9PUDtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMgPSBnYW1lLmNhbnZhcztcclxuICAgICAgICB0aGlzLmNvbnRleHQgPSBnYW1lLmNvbnRleHQ7XHJcblxyXG4gICAgICAgIHZhciBwbHVnaW5NYW5hZ2VyID0gZ2FtZS5wbHVnaW5zO1xyXG5cclxuICAgICAgICB0aGlzLnBsdWdpbnMgPSBwbHVnaW5NYW5hZ2VyO1xyXG5cclxuICAgICAgICBwbHVnaW5NYW5hZ2VyLmFkZFRvU2NlbmUodGhpcywgRGVmYXVsdFBsdWdpbnMuR2xvYmFsLCBbIERlZmF1bHRQbHVnaW5zLkNvcmVTY2VuZSwgR2V0U2NlbmVQbHVnaW5zKHRoaXMpLCBHZXRQaHlzaWNzUGx1Z2lucyh0aGlzKSBdKTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuQk9PVCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuaXNCb290ZWQgPSB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBhIHBsdWdpbiwgaXQgdGVsbHMgdGhlIFN5c3RlbSB0byBpbnN0YWxsIHRoZSBwbHVnaW4gbG9jYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNpbnN0YWxsXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gcGx1Z2luIC0gQW4gYXJyYXkgb2YgcGx1Z2lucyB0byBpbnN0YWxsIGludG8gdGhpcyBTY2VuZS5cclxuICAgICAqL1xyXG4gICAgaW5zdGFsbDogZnVuY3Rpb24gKHBsdWdpbilcclxuICAgIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2luKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBsdWdpbiA9IFsgcGx1Z2luIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBsdWdpbnMuaW5zdGFsbExvY2FsKHRoaXMsIHBsdWdpbik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzaW5nbGUgZ2FtZSBzdGVwLiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgTWFuYWdlciBhcyBhIHJlc3VsdCBvZiBhIFJlcXVlc3QgQW5pbWF0aW9uXHJcbiAgICAgKiBGcmFtZSBvciBTZXQgVGltZW91dCBjYWxsIHRvIHRoZSBtYWluIEdhbWUgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjc3RlcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1BSRV9VUERBVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNVUERBVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNQT1NUX1VQREFURVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgdGltZSB2YWx1ZSBmcm9tIHRoZSBtb3N0IHJlY2VudCBHYW1lIHN0ZXAuIFR5cGljYWxseSBhIGhpZ2gtcmVzb2x1dGlvbiB0aW1lciB2YWx1ZSwgb3IgRGF0ZS5ub3coKS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB2YWx1ZSBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBzbW9vdGhlZCB0byBhdm9pZCBkZWx0YSBzcGlrZXMgYnkgdGhlIFRpbWVTdGVwIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBzdGVwOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuUFJFX1VQREFURSwgdGltZSwgZGVsdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5VUERBVEUsIHRpbWUsIGRlbHRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZVVwZGF0ZS5jYWxsKHRoaXMuc2NlbmUsIHRpbWUsIGRlbHRhKTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuUE9TVF9VUERBVEUsIHRpbWUsIGRlbHRhKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgTWFuYWdlci5cclxuICAgICAqIEluc3RydWN0cyB0aGUgU2NlbmUgdG8gcmVuZGVyIGl0c2VsZiB2aWEgaXRzIENhbWVyYSBNYW5hZ2VyIHRvIHRoZSByZW5kZXJlciBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNyZW5kZXJcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNSRU5ERVJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ8UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIpfSByZW5kZXJlciAtIFRoZSByZW5kZXJlciB0aGF0IGludm9rZWQgdGhlIHJlbmRlciBjYWxsLlxyXG4gICAgICovXHJcbiAgICByZW5kZXI6IGZ1bmN0aW9uIChyZW5kZXJlcilcclxuICAgIHtcclxuICAgICAgICB2YXIgZGlzcGxheUxpc3QgPSB0aGlzLmRpc3BsYXlMaXN0O1xyXG5cclxuICAgICAgICBkaXNwbGF5TGlzdC5kZXB0aFNvcnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW1lcmFzLnJlbmRlcihyZW5kZXJlciwgZGlzcGxheUxpc3QpO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5SRU5ERVIsIHJlbmRlcmVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSBhIHNvcnQgb2YgdGhlIGRpc3BsYXkgbGlzdCBvbiB0aGUgbmV4dCByZW5kZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjcXVldWVEZXB0aFNvcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBxdWV1ZURlcHRoU29ydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlMaXN0LnF1ZXVlRGVwdGhTb3J0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1tZWRpYXRlbHkgc29ydHMgdGhlIGRpc3BsYXkgbGlzdCBpZiB0aGUgZmxhZyBpcyBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjZGVwdGhTb3J0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVwdGhTb3J0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUxpc3QuZGVwdGhTb3J0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2UgdGhpcyBTY2VuZS5cclxuICAgICAqIEEgcGF1c2VkIFNjZW5lIHN0aWxsIHJlbmRlcnMsIGl0IGp1c3QgZG9lc24ndCBydW4gQU5ZIG9mIGl0cyB1cGRhdGUgaGFuZGxlcnMgb3Igc3lzdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNwYXVzZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1BBVVNFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGluIHRoZSAncGF1c2UnIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gVGhpcyBTeXN0ZW1zIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcGF1c2U6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmFjdGl2ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuUEFVU0VEO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlBBVVNFLCB0aGlzLCBkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZSB0aGlzIFNjZW5lIGZyb20gYSBwYXVzZWQgc3RhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjcmVzdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjZW5lcy5FdmVudHMjUkVTVU1FXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGluIHRoZSAncmVzdW1lJyBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IFRoaXMgU3lzdGVtcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogZnVuY3Rpb24gKGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLmFjdGl2ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuUlVOTklORztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlJFU1VNRSwgdGhpcywgZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kIHRoaXMgU2NlbmUgdG8gc2xlZXAuXHJcbiAgICAgKlxyXG4gICAgICogQSBzbGVlcGluZyBTY2VuZSBkb2Vzbid0IHJ1biBpdHMgdXBkYXRlIHN0ZXAgb3IgcmVuZGVyIGFueXRoaW5nLCBidXQgaXQgYWxzbyBpc24ndCBzaHV0IGRvd25cclxuICAgICAqIG9yIGhhcyBhbnkgb2YgaXRzIHN5c3RlbXMgb3IgY2hpbGRyZW4gcmVtb3ZlZCwgbWVhbmluZyBpdCBjYW4gYmUgcmUtYWN0aXZhdGVkIGF0IGFueSBwb2ludCBhbmRcclxuICAgICAqIHdpbGwgY2Fycnkgb24gZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4gSXQgYWxzbyBrZWVwcyBldmVyeXRoaW5nIGluIG1lbW9yeSBhbmQgZXZlbnRzIGFuZCBjYWxsYmFja3NcclxuICAgICAqIGZyb20gb3RoZXIgU2NlbmVzIG1heSBzdGlsbCBpbnZva2UgY2hhbmdlcyB3aXRoaW4gaXQsIHNvIGJlIGNhcmVmdWwgd2hhdCBpcyBsZWZ0IGFjdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNzbGVlcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1NMRUVQXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGluIHRoZSAnc2xlZXAnIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gVGhpcyBTeXN0ZW1zIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2xlZXA6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuU0xFRVBJTkc7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy52aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLlNMRUVQLCB0aGlzLCBkYXRhKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2FrZS11cCB0aGlzIFNjZW5lIGlmIGl0IHdhcyBwcmV2aW91c2x5IGFzbGVlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyN3YWtlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjZW5lcy5FdmVudHMjV0FLRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIEEgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBpbiB0aGUgJ3dha2UnIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gVGhpcyBTeXN0ZW1zIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgd2FrZTogZnVuY3Rpb24gKGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcclxuXHJcbiAgICAgICAgc2V0dGluZ3Muc3RhdHVzID0gQ09OU1QuUlVOTklORztcclxuXHJcbiAgICAgICAgc2V0dGluZ3MuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICBzZXR0aW5ncy52aXNpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuV0FLRSwgdGhpcywgZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1RyYW5zaXRpb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KEV2ZW50cy5UUkFOU0lUSU9OX1dBS0UsIHNldHRpbmdzLnRyYW5zaXRpb25Gcm9tLCBzZXR0aW5ncy50cmFuc2l0aW9uRHVyYXRpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbnkgZGF0YSB0aGF0IHdhcyBzZW50IHRvIHRoaXMgU2NlbmUgYnkgYW5vdGhlciBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZGF0YSBpcyBhbHNvIHBhc3NlZCB0byBgU2NlbmUuaW5pdGAgYW5kIGluIHZhcmlvdXMgU2NlbmUgZXZlbnRzLCBidXRcclxuICAgICAqIHlvdSBjYW4gYWNjZXNzIGl0IGF0IGFueSBwb2ludCB2aWEgdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjZ2V0RGF0YVxyXG4gICAgICogQHNpbmNlIDMuMjIuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2FueX1cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5kYXRhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgU2NlbmUgc2xlZXBpbmc/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjaXNTbGVlcGluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoaXMgU2NlbmUgaXMgYXNsZWVwLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNTbGVlcGluZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2V0dGluZ3Muc3RhdHVzID09PSBDT05TVC5TTEVFUElORyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhpcyBTY2VuZSBydW5uaW5nP1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2lzQWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBTY2VuZSBpcyBydW5uaW5nLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNBY3RpdmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNldHRpbmdzLnN0YXR1cyA9PT0gQ09OU1QuUlVOTklORyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhpcyBTY2VuZSBwYXVzZWQ/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjaXNQYXVzZWRcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBTY2VuZSBpcyBwYXVzZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBpc1BhdXNlZDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2V0dGluZ3Muc3RhdHVzID09PSBDT05TVC5QQVVTRUQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgU2NlbmUgY3VycmVudGx5IHRyYW5zaXRpb25pbmcgb3V0IHRvLCBvciBpbiBmcm9tIGFub3RoZXIgU2NlbmU/XHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjaXNUcmFuc2l0aW9uaW5nXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBTY2VuZSBpcyBjdXJyZW50bHkgdHJhbnNpdGlvbmluZywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGlzVHJhbnNpdGlvbmluZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2V0dGluZ3MuaXNUcmFuc2l0aW9uIHx8IHRoaXMuc2NlbmVQbHVnaW4uX3RhcmdldCAhPT0gbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXMgdGhpcyBTY2VuZSBjdXJyZW50bHkgdHJhbnNpdGlvbmluZyBvdXQgZnJvbSBpdHNlbGYgdG8gYW5vdGhlciBTY2VuZT9cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNpc1RyYW5zaXRpb25PdXRcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGlzIFNjZW5lIGlzIGluIHRyYW5zaXRpb24gdG8gYW5vdGhlciBTY2VuZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGlzVHJhbnNpdGlvbk91dDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NlbmVQbHVnaW4uX3RhcmdldCAhPT0gbnVsbCAmJiB0aGlzLnNjZW5lUGx1Z2luLl9kdXJhdGlvbiA+IDApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgU2NlbmUgY3VycmVudGx5IHRyYW5zaXRpb25pbmcgaW4gZnJvbSBhbm90aGVyIFNjZW5lP1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2lzVHJhbnNpdGlvbkluXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBTY2VuZSBpcyB0cmFuc2l0aW9uaW5nIGluIGZyb20gYW5vdGhlciBTY2VuZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGlzVHJhbnNpdGlvbkluOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zZXR0aW5ncy5pc1RyYW5zaXRpb24pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElzIHRoaXMgU2NlbmUgdmlzaWJsZSBhbmQgcmVuZGVyaW5nP1xyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2lzVmlzaWJsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoaXMgU2NlbmUgaXMgdmlzaWJsZSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGlzVmlzaWJsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy52aXNpYmxlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZpc2libGUgc3RhdGUgb2YgdGhpcyBTY2VuZS5cclxuICAgICAqIEFuIGludmlzaWJsZSBTY2VuZSB3aWxsIG5vdCByZW5kZXIsIGJ1dCB3aWxsIHN0aWxsIHByb2Nlc3MgdXBkYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNzZXRWaXNpYmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gYHRydWVgIHRvIHJlbmRlciB0aGlzIFNjZW5lLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IFRoaXMgU3lzdGVtcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZpc2libGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNldHRpbmdzLnZpc2libGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhpcyBTY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBBbiBhY3RpdmUgU2NlbmUgd2lsbCBydW4gaXRzIGNvcmUgdXBkYXRlIGxvb3AuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjc2V0QWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gSWYgYHRydWVgIHRoZSBTY2VuZSB3aWxsIGJlIHJlc3VtZWQsIGlmIHByZXZpb3VzbHkgcGF1c2VkLiBJZiBgZmFsc2VgIGl0IHdpbGwgYmUgcGF1c2VkLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtkYXRhXSAtIEEgZGF0YSBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBpbiB0aGUgJ3Jlc3VtZScgb3IgJ3BhdXNlJyBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBUaGlzIFN5c3RlbXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmU6IGZ1bmN0aW9uICh2YWx1ZSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXN1bWUoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdXNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydCB0aGlzIFNjZW5lIHJ1bm5pbmcgYW5kIHJlbmRlcmluZy5cclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBTY2VuZU1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU2NlbmVzLlN5c3RlbXMjc3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU2NlbmVzLkV2ZW50cyNTVEFSVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1JFQURZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIE9wdGlvbmFsIGRhdGEgb2JqZWN0IHRoYXQgbWF5IGhhdmUgYmVlbiBwYXNzZWQgdG8gdGhpcyBTY2VuZSBmcm9tIGFub3RoZXIuXHJcbiAgICAgKi9cclxuICAgIHN0YXJ0OiBmdW5jdGlvbiAoZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZGF0YSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmdzLnN0YXR1cyA9IENPTlNULlNUQVJUO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmdzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy52aXNpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gIEZvciBwbHVnaW5zIHRvIGxpc3RlbiBvdXQgZm9yXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuU1RBUlQsIHRoaXMpO1xyXG5cclxuICAgICAgICAvLyAgRm9yIHVzZXItbGFuZCBjb2RlIHRvIGxpc3RlbiBvdXQgZm9yXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuUkVBRFksIHRoaXMsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNodXRkb3duIHRoaXMgU2NlbmUgYW5kIHNlbmQgYSBzaHV0ZG93biBldmVudCB0byBhbGwgb2YgaXRzIHN5c3RlbXMuXHJcbiAgICAgKiBBIFNjZW5lIHRoYXQgaGFzIGJlZW4gc2h1dGRvd24gd2lsbCBub3QgcnVuIGl0cyB1cGRhdGUgbG9vcCBvciByZW5kZXIsIGJ1dCBpdCBkb2VzXHJcbiAgICAgKiBub3QgZGVzdHJveSBhbnkgb2YgaXRzIHBsdWdpbnMgb3IgcmVmZXJlbmNlcy4gSXQgaXMgcHV0IGludG8gaGliZXJuYXRpb24gZm9yIGxhdGVyIHVzZS5cclxuICAgICAqIElmIHlvdSBkb24ndCBldmVyIHBsYW4gdG8gdXNlIHRoaXMgU2NlbmUgYWdhaW4sIHRoZW4gaXQgc2hvdWxkIGJlIGRlc3Ryb3llZCBpbnN0ZWFkXHJcbiAgICAgKiB0byBmcmVlLXVwIHJlc291cmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TY2VuZXMuU3lzdGVtcyNzaHV0ZG93blxyXG4gICAgICogQGZpcmVzIFBoYXNlci5TY2VuZXMuRXZlbnRzI1NIVVRET1dOXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2RhdGFdIC0gQSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGluIHRoZSAnc2h1dGRvd24nIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ldmVudHMub2ZmKEV2ZW50cy5UUkFOU0lUSU9OX0lOSVQpO1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLm9mZihFdmVudHMuVFJBTlNJVElPTl9TVEFSVCk7XHJcbiAgICAgICAgdGhpcy5ldmVudHMub2ZmKEV2ZW50cy5UUkFOU0lUSU9OX0NPTVBMRVRFKTtcclxuICAgICAgICB0aGlzLmV2ZW50cy5vZmYoRXZlbnRzLlRSQU5TSVRJT05fT1VUKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zdGF0dXMgPSBDT05TVC5TSFVURE9XTjtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldHRpbmdzLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdChFdmVudHMuU0hVVERPV04sIHRoaXMsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgdGhpcyBTY2VuZSBhbmQgc2VuZCBhIGRlc3Ryb3kgZXZlbnQgYWxsIG9mIGl0cyBzeXN0ZW1zLlxyXG4gICAgICogQSBkZXN0cm95ZWQgU2NlbmUgY2Fubm90IGJlIHJlc3RhcnRlZC5cclxuICAgICAqIFlvdSBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCB1c2UgYFNjZW5lTWFuYWdlci5yZW1vdmVgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNjZW5lcy5TeXN0ZW1zI2Rlc3Ryb3lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNjZW5lcy5FdmVudHMjREVTVFJPWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zdGF0dXMgPSBDT05TVC5ERVNUUk9ZRUQ7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy52aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoRXZlbnRzLkRFU1RST1ksIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdmFyIHByb3BzID0gWyAnc2NlbmUnLCAnZ2FtZScsICdhbmltcycsICdjYWNoZScsICdwbHVnaW5zJywgJ3JlZ2lzdHJ5JywgJ3NvdW5kJywgJ3RleHR1cmVzJywgJ2FkZCcsICdjYW1lcmEnLCAnZGlzcGxheUxpc3QnLCAnZXZlbnRzJywgJ21ha2UnLCAnc2NlbmVQbHVnaW4nLCAndXBkYXRlTGlzdCcgXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXNbcHJvcHNbaV1dID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3lzdGVtcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2NlbmUgY29uc3RzLlxyXG4gKiBcclxuICogQGlnbm9yZVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjZW5lIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlBFTkRJTkdcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUEVORElORzogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjZW5lIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLklOSVRcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgSU5JVDogMSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjZW5lIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLlNUQVJUXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFNUQVJUOiAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NlbmUgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuTE9BRElOR1xyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBMT0FESU5HOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NlbmUgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuQ1JFQVRJTkdcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ1JFQVRJTkc6IDQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2VuZSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5SVU5OSU5HXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFJVTk5JTkc6IDUsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2VuZSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5QQVVTRURcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUEFVU0VEOiA2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NlbmUgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5TY2VuZXMuU0xFRVBJTkdcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgU0xFRVBJTkc6IDcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2VuZSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNjZW5lcy5TSFVURE9XTlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBTSFVURE9XTjogOCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjZW5lIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU2NlbmVzLkRFU1RST1lFRFxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBERVNUUk9ZRUQ6IDlcclxuXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBCb290IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgZHVyaW5nIHRoZSBTY2VuZSBTeXN0ZW1zIGJvb3QgcHJvY2Vzcy4gUHJpbWFyaWx5IHVzZWQgYnkgU2NlbmUgUGx1Z2lucy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdib290JywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNCT09UXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IHN5cyAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBTeXN0ZW1zIGNsYXNzIG9mIHRoZSBTY2VuZSB0aGF0IGVtaXR0ZWQgdGhpcyBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Jvb3QnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgQ3JlYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgYWZ0ZXIgaXQgaGFzIGJlZW4gY3JlYXRlZCBieSB0aGUgU2NlbmUgTWFuYWdlci5cclxuICogXHJcbiAqIElmIGEgU2NlbmUgaGFzIGEgYGNyZWF0ZWAgbWV0aG9kIHRoZW4gdGhpcyBldmVudCBpcyBlbWl0dGVkIF9hZnRlcl8gdGhhdCBoYXMgcnVuLlxyXG4gKiBcclxuICogSWYgdGhlcmUgaXMgYSB0cmFuc2l0aW9uLCB0aGlzIGV2ZW50IHdpbGwgYmUgZmlyZWQgYWZ0ZXIgdGhlIGBUUkFOU0lUSU9OX1NUQVJUYCBldmVudC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdjcmVhdGUnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI0NSRUFURVxyXG4gKiBAc2luY2UgMy4xNy4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjcmVhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBEZXN0cm95IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgZHVyaW5nIHRoZSBTY2VuZSBTeXN0ZW1zIGRlc3Ryb3kgcHJvY2Vzcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdkZXN0cm95JywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFlvdSBzaG91bGQgZGVzdHJveSBhbnkgcmVzb3VyY2VzIHRoYXQgbWF5IGJlIGluIHVzZSBieSB5b3VyIFNjZW5lIGluIHRoaXMgZXZlbnQgaGFuZGxlci5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNERVNUUk9ZXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmVzLlN5c3RlbXN9IHN5cyAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSBTeXN0ZW1zIGNsYXNzIG9mIHRoZSBTY2VuZSB0aGF0IGVtaXR0ZWQgdGhpcyBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2Rlc3Ryb3knO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNjZW5lIHdoZW4gaXQgaXMgcGF1c2VkLCBlaXRoZXIgZGlyZWN0bHkgdmlhIHRoZSBgcGF1c2VgIG1ldGhvZCwgb3IgYXMgYW5cclxuICogYWN0aW9uIGZyb20gYW5vdGhlciBTY2VuZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdwYXVzZScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjZW5lcy5FdmVudHMjUEFVU0VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gc3lzIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3Mgb2YgdGhlIFNjZW5lIHRoYXQgZW1pdHRlZCB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgU2NlbmUgd2hlbiBpdCB3YXMgcGF1c2VkLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncGF1c2UnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBQb3N0IFVwZGF0ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNjZW5lIGR1cmluZyB0aGUgbWFpbiBnYW1lIGxvb3Agc3RlcC5cclxuICogXHJcbiAqIFRoZSBldmVudCBmbG93IGZvciBhIHNpbmdsZSBzdGVwIG9mIGEgU2NlbmUgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtQUkVfVVBEQVRFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6UFJFX1VQREFURX1cclxuICogMi4gW1VQREFURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlVQREFURX1cclxuICogMy4gVGhlIGBTY2VuZS51cGRhdGVgIG1ldGhvZCBpcyBjYWxsZWQsIGlmIGl0IGV4aXN0c1xyXG4gKiA0LiBbUE9TVF9VUERBVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpQT1NUX1VQREFURX1cclxuICogNS4gW1JFTkRFUl17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlJFTkRFUn1cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdwb3N0dXBkYXRlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEEgU2NlbmUgd2lsbCBvbmx5IHJ1biBpdHMgc3RlcCBpZiBpdCBpcyBhY3RpdmUuXHJcbiAqIFxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjZW5lcy5FdmVudHMjUE9TVF9VUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gc3lzIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3Mgb2YgdGhlIFNjZW5lIHRoYXQgZW1pdHRlZCB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBpbiBtcyBzaW5jZSB0aGUgbGFzdCBmcmFtZS4gVGhpcyBpcyBhIHNtb290aGVkIGFuZCBjYXBwZWQgdmFsdWUgYmFzZWQgb24gdGhlIEZQUyByYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncG9zdHVwZGF0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2VuZSBTeXN0ZW1zIFByZSBVcGRhdGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBTY2VuZSBkdXJpbmcgdGhlIG1haW4gZ2FtZSBsb29wIHN0ZXAuXHJcbiAqIFxyXG4gKiBUaGUgZXZlbnQgZmxvdyBmb3IgYSBzaW5nbGUgc3RlcCBvZiBhIFNjZW5lIGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbUFJFX1VQREFURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlBSRV9VUERBVEV9XHJcbiAqIDIuIFtVUERBVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpVUERBVEV9XHJcbiAqIDMuIFRoZSBgU2NlbmUudXBkYXRlYCBtZXRob2QgaXMgY2FsbGVkLCBpZiBpdCBleGlzdHNcclxuICogNC4gW1BPU1RfVVBEQVRFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6UE9TVF9VUERBVEV9XHJcbiAqIDUuIFtSRU5ERVJde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpSRU5ERVJ9XHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nIGB0aGlzLnNjZW5lLmV2ZW50cy5vbigncHJldXBkYXRlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEEgU2NlbmUgd2lsbCBvbmx5IHJ1biBpdHMgc3RlcCBpZiBpdCBpcyBhY3RpdmUuXHJcbiAqIFxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjZW5lcy5FdmVudHMjUFJFX1VQREFURVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBjbGFzcyBvZiB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZS4gRWl0aGVyIGEgSGlnaCBSZXNvbHV0aW9uIFRpbWVyIHZhbHVlIGlmIGl0IGNvbWVzIGZyb20gUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIERhdGUubm93IGlmIHVzaW5nIFNldFRpbWVvdXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiBUaGlzIGlzIGEgc21vb3RoZWQgYW5kIGNhcHBlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgRlBTIHJhdGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwcmV1cGRhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBSZWFkeSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNjZW5lIGR1cmluZyB0aGUgU2NlbmUgU3lzdGVtcyBzdGFydCBwcm9jZXNzLlxyXG4gKiBCeSB0aGlzIHBvaW50IGluIHRoZSBwcm9jZXNzIHRoZSBTY2VuZSBpcyBub3cgZnVsbHkgYWN0aXZlIGFuZCByZW5kZXJpbmcuXHJcbiAqIFRoaXMgZXZlbnQgaXMgbWVhbnQgZm9yIHlvdXIgZ2FtZSBjb2RlIHRvIHVzZSwgYXMgYWxsIHBsdWdpbnMgaGF2ZSByZXNwb25kZWQgdG8gdGhlIGVhcmxpZXIgJ3N0YXJ0JyBldmVudC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCdyZWFkeScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjZW5lcy5FdmVudHMjUkVBRFlcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gc3lzIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3Mgb2YgdGhlIFNjZW5lIHRoYXQgZW1pdHRlZCB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgU2NlbmUgd2hlbiBpdCB3YXMgc3RhcnRlZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlYWR5JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjZW5lIFN5c3RlbXMgUmVuZGVyIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgZHVyaW5nIHRoZSBtYWluIGdhbWUgbG9vcCBzdGVwLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGZsb3cgZm9yIGEgc2luZ2xlIHN0ZXAgb2YgYSBTY2VuZSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW1BSRV9VUERBVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpQUkVfVVBEQVRFfVxyXG4gKiAyLiBbVVBEQVRFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VVBEQVRFfVxyXG4gKiAzLiBUaGUgYFNjZW5lLnVwZGF0ZWAgbWV0aG9kIGlzIGNhbGxlZCwgaWYgaXQgZXhpc3RzXHJcbiAqIDQuIFtQT1NUX1VQREFURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlBPU1RfVVBEQVRFfVxyXG4gKiA1LiBbUkVOREVSXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6UkVOREVSfVxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3JlbmRlcicsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBBIFNjZW5lIHdpbGwgb25seSByZW5kZXIgaWYgaXQgaXMgdmlzaWJsZSBhbmQgYWN0aXZlLlxyXG4gKiBCeSB0aGUgdGltZSB0aGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQsIHRoZSBTY2VuZSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbmRlcmVkLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI1JFTkRFUlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5SZW5kZXJlci5DYW52YXMuQ2FudmFzUmVuZGVyZXJ8UGhhc2VyLlJlbmRlcmVyLldlYkdMLldlYkdMUmVuZGVyZXIpfSByZW5kZXJlciAtIFRoZSByZW5kZXJlciB0aGF0IHJlbmRlcmVkIHRoZSBTY2VuZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlbmRlcic7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2VuZSBTeXN0ZW1zIFJlc3VtZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNjZW5lIHdoZW4gaXQgaXMgcmVzdW1lZCBmcm9tIGEgcGF1c2VkIHN0YXRlLCBlaXRoZXIgZGlyZWN0bHkgdmlhIHRoZSBgcmVzdW1lYCBtZXRob2QsXHJcbiAqIG9yIGFzIGFuIGFjdGlvbiBmcm9tIGFub3RoZXIgU2NlbmUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nIGB0aGlzLnNjZW5lLmV2ZW50cy5vbigncmVzdW1lJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNSRVNVTUVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gc3lzIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3Mgb2YgdGhlIFNjZW5lIHRoYXQgZW1pdHRlZCB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgU2NlbmUgd2hlbiBpdCB3YXMgcmVzdW1lZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Jlc3VtZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2VuZSBTeXN0ZW1zIFNodXRkb3duIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgZHVyaW5nIHRoZSBTY2VuZSBTeXN0ZW1zIHNodXRkb3duIHByb2Nlc3MuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nIGB0aGlzLnNjZW5lLmV2ZW50cy5vbignc2h1dGRvd24nLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogWW91IHNob3VsZCBmcmVlLXVwIGFueSByZXNvdXJjZXMgdGhhdCBtYXkgYmUgaW4gdXNlIGJ5IHlvdXIgU2NlbmUgaW4gdGhpcyBldmVudCBoYW5kbGVyLCBvbiB0aGUgdW5kZXJzdGFuZGluZ1xyXG4gKiB0aGF0IHRoZSBTY2VuZSBtYXksIGF0IGFueSB0aW1lLCBiZWNvbWUgYWN0aXZlIGFnYWluLiBBIHNodXRkb3duIFNjZW5lIGlzIG5vdCAnZGVzdHJveWVkJywgaXQncyBzaW1wbHkgbm90XHJcbiAqIGN1cnJlbnRseSBhY3RpdmUuIFVzZSB0aGUgW0RFU1RST1lde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpERVNUUk9ZfSBldmVudCB0byBjb21wbGV0ZWx5IGNsZWFyIHJlc291cmNlcy5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNTSFVURE9XTlxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBjbGFzcyBvZiB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7YW55fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBTY2VuZSB3aGVuIGl0IHdhcyBzaHV0ZG93bi5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3NodXRkb3duJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjZW5lIFN5c3RlbXMgU2xlZXAgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBTY2VuZSB3aGVuIGl0IGlzIHNlbnQgdG8gc2xlZXAsIGVpdGhlciBkaXJlY3RseSB2aWEgdGhlIGBzbGVlcGAgbWV0aG9kLFxyXG4gKiBvciBhcyBhbiBhY3Rpb24gZnJvbSBhbm90aGVyIFNjZW5lLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3NsZWVwJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNTTEVFUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBjbGFzcyBvZiB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7YW55fSBbZGF0YV0gLSBBbiBvcHRpb25hbCBkYXRhIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhpcyBTY2VuZSB3aGVuIGl0IHdhcyBzZW50IHRvIHNsZWVwLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnc2xlZXAnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFNjZW5lIGR1cmluZyB0aGUgU2NlbmUgU3lzdGVtcyBzdGFydCBwcm9jZXNzLiBQcmltYXJpbHkgdXNlZCBieSBTY2VuZSBQbHVnaW5zLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3N0YXJ0JywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNTVEFSVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBjbGFzcyBvZiB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2VuZSBUcmFuc2l0aW9uIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBUYXJnZXQgU2NlbmUgb2YgYSB0cmFuc2l0aW9uLlxyXG4gKiBcclxuICogSXQgaGFwcGVucyB3aGVuIHRoZSB0cmFuc2l0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZC4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgZHVyYXRpb24gdGltZXIgZXF1YWxzIG9yIGV4Y2VlZHMgdGhlIGR1cmF0aW9uXHJcbiAqIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3RyYW5zaXRpb25jb21wbGV0ZScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUaGUgU2NlbmUgVHJhbnNpdGlvbiBldmVudCBmbG93IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbVFJBTlNJVElPTl9PVVRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX09VVH0gLSB0aGUgU2NlbmUgdGhhdCBzdGFydGVkIHRoZSB0cmFuc2l0aW9uIHdpbGwgZW1pdCB0aGlzIGV2ZW50LlxyXG4gKiAyLiBbVFJBTlNJVElPTl9JTklUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9JTklUfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgaWYgaXQgaGFzIGFuIGBpbml0YCBtZXRob2QuXHJcbiAqIDMuIFtUUkFOU0lUSU9OX1NUQVJUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9TVEFSVH0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IGFmdGVyIGl0cyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkLCBPUiAuLi5cclxuICogNC4gW1RSQU5TSVRJT05fV0FLRV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fV0FLRX0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IGlmIGl0IHdhcyBhc2xlZXAgYW5kIGhhcyBiZWVuIHdva2VuLXVwIHRvIGJlIHRyYW5zaXRpb25lZCB0by5cclxuICogNS4gW1RSQU5TSVRJT05fQ09NUExFVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX0NPTVBMRVRFfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgd2hlbiB0aGUgdHJhbnNpdGlvbiBmaW5pc2hlcy5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNUUkFOU0lUSU9OX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC1UaGUgU2NlbmUgb24gd2hpY2ggdGhlIHRyYW5zaXRpb25lZCBjb21wbGV0ZWQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd0cmFuc2l0aW9uY29tcGxldGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgVHJhbnNpdGlvbiBJbml0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBUYXJnZXQgU2NlbmUgb2YgYSB0cmFuc2l0aW9uLlxyXG4gKiBcclxuICogSXQgaGFwcGVucyBpbW1lZGlhdGVseSBhZnRlciB0aGUgYFNjZW5lLmluaXRgIG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoZSBTY2VuZSBkb2VzIG5vdCBoYXZlIGFuIGBpbml0YCBtZXRob2QsXHJcbiAqIHRoaXMgZXZlbnQgaXMgbm90IGRpc3BhdGNoZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nIGB0aGlzLnNjZW5lLmV2ZW50cy5vbigndHJhbnNpdGlvbmluaXQnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogVGhlIFNjZW5lIFRyYW5zaXRpb24gZXZlbnQgZmxvdyBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW1RSQU5TSVRJT05fT1VUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9PVVR9IC0gdGhlIFNjZW5lIHRoYXQgc3RhcnRlZCB0aGUgdHJhbnNpdGlvbiB3aWxsIGVtaXQgdGhpcyBldmVudC5cclxuICogMi4gW1RSQU5TSVRJT05fSU5JVF17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fSU5JVH0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IGlmIGl0IGhhcyBhbiBgaW5pdGAgbWV0aG9kLlxyXG4gKiAzLiBbVFJBTlNJVElPTl9TVEFSVF17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fU1RBUlR9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCBhZnRlciBpdHMgYGNyZWF0ZWAgbWV0aG9kIGlzIGNhbGxlZCwgT1IgLi4uXHJcbiAqIDQuIFtUUkFOU0lUSU9OX1dBS0Vde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX1dBS0V9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCBpZiBpdCB3YXMgYXNsZWVwIGFuZCBoYXMgYmVlbiB3b2tlbi11cCB0byBiZSB0cmFuc2l0aW9uZWQgdG8uXHJcbiAqIDUuIFtUUkFOU0lUSU9OX0NPTVBMRVRFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9DT01QTEVURX0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IHdoZW4gdGhlIHRyYW5zaXRpb24gZmluaXNoZXMuXHJcbiAqIFxyXG4gKiBAZXZlbnQgUGhhc2VyLlNjZW5lcy5FdmVudHMjVFJBTlNJVElPTl9JTklUXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IGZyb20gLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgZnJvbS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1zLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndHJhbnNpdGlvbmluaXQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgVHJhbnNpdGlvbiBPdXQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBTY2VuZSB3aGVuIGl0IGluaXRpYXRlcyBhIHRyYW5zaXRpb24gdG8gYW5vdGhlciBTY2VuZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmcgYHRoaXMuc2NlbmUuZXZlbnRzLm9uKCd0cmFuc2l0aW9ub3V0JywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoZSBTY2VuZSBUcmFuc2l0aW9uIGV2ZW50IGZsb3cgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtUUkFOU0lUSU9OX09VVF17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fT1VUfSAtIHRoZSBTY2VuZSB0aGF0IHN0YXJ0ZWQgdGhlIHRyYW5zaXRpb24gd2lsbCBlbWl0IHRoaXMgZXZlbnQuXHJcbiAqIDIuIFtUUkFOU0lUSU9OX0lOSVRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX0lOSVR9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCBpZiBpdCBoYXMgYW4gYGluaXRgIG1ldGhvZC5cclxuICogMy4gW1RSQU5TSVRJT05fU1RBUlRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX1NUQVJUfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgYWZ0ZXIgaXRzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQsIE9SIC4uLlxyXG4gKiA0LiBbVFJBTlNJVElPTl9XQUtFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9XQUtFfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgaWYgaXQgd2FzIGFzbGVlcCBhbmQgaGFzIGJlZW4gd29rZW4tdXAgdG8gYmUgdHJhbnNpdGlvbmVkIHRvLlxyXG4gKiA1LiBbVFJBTlNJVElPTl9DT01QTEVURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fQ09NUExFVEV9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCB3aGVuIHRoZSB0cmFuc2l0aW9uIGZpbmlzaGVzLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI1RSQU5TSVRJT05fT1VUXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHRhcmdldCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTY2VuZSB0aGF0IGlzIGJlaW5nIHRyYW5zaXRpb25lZCB0by5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1zLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndHJhbnNpdGlvbm91dCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTY2VuZSBUcmFuc2l0aW9uIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBUYXJnZXQgU2NlbmUgb2YgYSB0cmFuc2l0aW9uLCBvbmx5IGlmIHRoYXQgU2NlbmUgd2FzIG5vdCBhc2xlZXAuXHJcbiAqIFxyXG4gKiBJdCBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBgU2NlbmUuY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkLiBJZiB0aGUgU2NlbmUgZG9lcyBub3QgaGF2ZSBhIGBjcmVhdGVgIG1ldGhvZCxcclxuICogdGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGFueXdheS5cclxuICogXHJcbiAqIElmIHRoZSBUYXJnZXQgU2NlbmUgd2FzIHNsZWVwaW5nIHRoZW4gdGhlIFtUUkFOU0lUSU9OX1dBS0Vde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX1dBS0V9IGV2ZW50IGlzXHJcbiAqIGRpc3BhdGNoZWQgaW5zdGVhZCBvZiB0aGlzIGV2ZW50LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3RyYW5zaXRpb25zdGFydCcsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBUaGUgU2NlbmUgVHJhbnNpdGlvbiBldmVudCBmbG93IGlzIGFzIGZvbGxvd3M6XHJcbiAqIFxyXG4gKiAxLiBbVFJBTlNJVElPTl9PVVRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX09VVH0gLSB0aGUgU2NlbmUgdGhhdCBzdGFydGVkIHRoZSB0cmFuc2l0aW9uIHdpbGwgZW1pdCB0aGlzIGV2ZW50LlxyXG4gKiAyLiBbVFJBTlNJVElPTl9JTklUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9JTklUfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgaWYgaXQgaGFzIGFuIGBpbml0YCBtZXRob2QuXHJcbiAqIDMuIFtUUkFOU0lUSU9OX1NUQVJUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9TVEFSVH0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IGFmdGVyIGl0cyBgY3JlYXRlYCBtZXRob2QgaXMgY2FsbGVkLCBPUiAuLi5cclxuICogNC4gW1RSQU5TSVRJT05fV0FLRV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fV0FLRX0gLSB0aGUgVGFyZ2V0IFNjZW5lIHdpbGwgZW1pdCB0aGlzIGV2ZW50IGlmIGl0IHdhcyBhc2xlZXAgYW5kIGhhcyBiZWVuIHdva2VuLXVwIHRvIGJlIHRyYW5zaXRpb25lZCB0by5cclxuICogNS4gW1RSQU5TSVRJT05fQ09NUExFVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX0NPTVBMRVRFfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgd2hlbiB0aGUgdHJhbnNpdGlvbiBmaW5pc2hlcy5cclxuICogXHJcbiAqIEBldmVudCBQaGFzZXIuU2NlbmVzLkV2ZW50cyNUUkFOU0lUSU9OX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjUuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IGZyb20gLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgZnJvbS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1zLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndHJhbnNpdGlvbnN0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjZW5lIFRyYW5zaXRpb24gV2FrZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgVGFyZ2V0IFNjZW5lIG9mIGEgdHJhbnNpdGlvbiwgb25seSBpZiB0aGF0IFNjZW5lIHdhcyBhc2xlZXAgYmVmb3JlXHJcbiAqIHRoZSB0cmFuc2l0aW9uIGJlZ2FuLiBJZiB0aGUgU2NlbmUgd2FzIG5vdCBhc2xlZXAgdGhlIFtUUkFOU0lUSU9OX1NUQVJUXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9TVEFSVH0gZXZlbnQgaXMgZGlzcGF0Y2hlZCBpbnN0ZWFkLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3RyYW5zaXRpb253YWtlJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoZSBTY2VuZSBUcmFuc2l0aW9uIGV2ZW50IGZsb3cgaXMgYXMgZm9sbG93czpcclxuICogXHJcbiAqIDEuIFtUUkFOU0lUSU9OX09VVF17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fT1VUfSAtIHRoZSBTY2VuZSB0aGF0IHN0YXJ0ZWQgdGhlIHRyYW5zaXRpb24gd2lsbCBlbWl0IHRoaXMgZXZlbnQuXHJcbiAqIDIuIFtUUkFOU0lUSU9OX0lOSVRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX0lOSVR9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCBpZiBpdCBoYXMgYW4gYGluaXRgIG1ldGhvZC5cclxuICogMy4gW1RSQU5TSVRJT05fU1RBUlRde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpUUkFOU0lUSU9OX1NUQVJUfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgYWZ0ZXIgaXRzIGBjcmVhdGVgIG1ldGhvZCBpcyBjYWxsZWQsIE9SIC4uLlxyXG4gKiA0LiBbVFJBTlNJVElPTl9XQUtFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VFJBTlNJVElPTl9XQUtFfSAtIHRoZSBUYXJnZXQgU2NlbmUgd2lsbCBlbWl0IHRoaXMgZXZlbnQgaWYgaXQgd2FzIGFzbGVlcCBhbmQgaGFzIGJlZW4gd29rZW4tdXAgdG8gYmUgdHJhbnNpdGlvbmVkIHRvLlxyXG4gKiA1LiBbVFJBTlNJVElPTl9DT01QTEVURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlRSQU5TSVRJT05fQ09NUExFVEV9IC0gdGhlIFRhcmdldCBTY2VuZSB3aWxsIGVtaXQgdGhpcyBldmVudCB3aGVuIHRoZSB0cmFuc2l0aW9uIGZpbmlzaGVzLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI1RSQU5TSVRJT05fV0FLRVxyXG4gKiBAc2luY2UgMy41LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBmcm9tIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIHRoYXQgaXMgYmVpbmcgdHJhbnNpdGlvbmVkIGZyb20uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtcy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3RyYW5zaXRpb253YWtlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNjZW5lIFN5c3RlbXMgVXBkYXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgZHVyaW5nIHRoZSBtYWluIGdhbWUgbG9vcCBzdGVwLlxyXG4gKiBcclxuICogVGhlIGV2ZW50IGZsb3cgZm9yIGEgc2luZ2xlIHN0ZXAgb2YgYSBTY2VuZSBpcyBhcyBmb2xsb3dzOlxyXG4gKiBcclxuICogMS4gW1BSRV9VUERBVEVde0BsaW5rY29kZSBQaGFzZXIuU2NlbmVzLkV2ZW50cyNldmVudDpQUkVfVVBEQVRFfVxyXG4gKiAyLiBbVVBEQVRFXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6VVBEQVRFfVxyXG4gKiAzLiBUaGUgYFNjZW5lLnVwZGF0ZWAgbWV0aG9kIGlzIGNhbGxlZCwgaWYgaXQgZXhpc3RzXHJcbiAqIDQuIFtQT1NUX1VQREFURV17QGxpbmtjb2RlIFBoYXNlci5TY2VuZXMuRXZlbnRzI2V2ZW50OlBPU1RfVVBEQVRFfVxyXG4gKiA1LiBbUkVOREVSXXtAbGlua2NvZGUgUGhhc2VyLlNjZW5lcy5FdmVudHMjZXZlbnQ6UkVOREVSfVxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3VwZGF0ZScsIGxpc3RlbmVyKWAuXHJcbiAqIFxyXG4gKiBBIFNjZW5lIHdpbGwgb25seSBydW4gaXRzIHN0ZXAgaWYgaXQgaXMgYWN0aXZlLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI1VQREFURVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfSBzeXMgLSBBIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgU3lzdGVtcyBjbGFzcyBvZiB0aGUgU2NlbmUgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIGN1cnJlbnQgdGltZS4gRWl0aGVyIGEgSGlnaCBSZXNvbHV0aW9uIFRpbWVyIHZhbHVlIGlmIGl0IGNvbWVzIGZyb20gUmVxdWVzdCBBbmltYXRpb24gRnJhbWUsIG9yIERhdGUubm93IGlmIHVzaW5nIFNldFRpbWVvdXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiBUaGlzIGlzIGEgc21vb3RoZWQgYW5kIGNhcHBlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgRlBTIHJhdGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd1cGRhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU2NlbmUgU3lzdGVtcyBXYWtlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgU2NlbmUgd2hlbiBpdCBpcyB3b2tlbiBmcm9tIHNsZWVwLCBlaXRoZXIgZGlyZWN0bHkgdmlhIHRoZSBgd2FrZWAgbWV0aG9kLFxyXG4gKiBvciBhcyBhbiBhY3Rpb24gZnJvbSBhbm90aGVyIFNjZW5lLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTY2VuZSB1c2luZyBgdGhpcy5zY2VuZS5ldmVudHMub24oJ3dha2UnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogQGV2ZW50IFBoYXNlci5TY2VuZXMuRXZlbnRzI1dBS0VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZXMuU3lzdGVtc30gc3lzIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNjZW5lIFN5c3RlbXMgY2xhc3Mgb2YgdGhlIFNjZW5lIHRoYXQgZW1pdHRlZCB0aGlzIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2FueX0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgZGF0YSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHRoaXMgU2NlbmUgd2hlbiBpdCB3YXMgd29rZW4gdXAuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd3YWtlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuU2NlbmVzLkV2ZW50c1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEJPT1Q6IHJlcXVpcmUoJy4vQk9PVF9FVkVOVCcpLFxyXG4gICAgQ1JFQVRFOiByZXF1aXJlKCcuL0NSRUFURV9FVkVOVCcpLFxyXG4gICAgREVTVFJPWTogcmVxdWlyZSgnLi9ERVNUUk9ZX0VWRU5UJyksXHJcbiAgICBQQVVTRTogcmVxdWlyZSgnLi9QQVVTRV9FVkVOVCcpLFxyXG4gICAgUE9TVF9VUERBVEU6IHJlcXVpcmUoJy4vUE9TVF9VUERBVEVfRVZFTlQnKSxcclxuICAgIFBSRV9VUERBVEU6IHJlcXVpcmUoJy4vUFJFX1VQREFURV9FVkVOVCcpLFxyXG4gICAgUkVBRFk6IHJlcXVpcmUoJy4vUkVBRFlfRVZFTlQnKSxcclxuICAgIFJFTkRFUjogcmVxdWlyZSgnLi9SRU5ERVJfRVZFTlQnKSxcclxuICAgIFJFU1VNRTogcmVxdWlyZSgnLi9SRVNVTUVfRVZFTlQnKSxcclxuICAgIFNIVVRET1dOOiByZXF1aXJlKCcuL1NIVVRET1dOX0VWRU5UJyksXHJcbiAgICBTTEVFUDogcmVxdWlyZSgnLi9TTEVFUF9FVkVOVCcpLFxyXG4gICAgU1RBUlQ6IHJlcXVpcmUoJy4vU1RBUlRfRVZFTlQnKSxcclxuICAgIFRSQU5TSVRJT05fQ09NUExFVEU6IHJlcXVpcmUoJy4vVFJBTlNJVElPTl9DT01QTEVURV9FVkVOVCcpLFxyXG4gICAgVFJBTlNJVElPTl9JTklUOiByZXF1aXJlKCcuL1RSQU5TSVRJT05fSU5JVF9FVkVOVCcpLFxyXG4gICAgVFJBTlNJVElPTl9PVVQ6IHJlcXVpcmUoJy4vVFJBTlNJVElPTl9PVVRfRVZFTlQnKSxcclxuICAgIFRSQU5TSVRJT05fU1RBUlQ6IHJlcXVpcmUoJy4vVFJBTlNJVElPTl9TVEFSVF9FVkVOVCcpLFxyXG4gICAgVFJBTlNJVElPTl9XQUtFOiByZXF1aXJlKCcuL1RSQU5TSVRJT05fV0FLRV9FVkVOVCcpLFxyXG4gICAgVVBEQVRFOiByZXF1aXJlKCcuL1VQREFURV9FVkVOVCcpLFxyXG4gICAgV0FLRTogcmVxdWlyZSgnLi9XQUtFX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG52YXIgRXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlNjZW5lc1xyXG4gKi9cclxuXHJcbnZhciBTY2VuZSA9IHtcclxuXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJyksXHJcbiAgICBTY2VuZU1hbmFnZXI6IHJlcXVpcmUoJy4vU2NlbmVNYW5hZ2VyJyksXHJcbiAgICBTY2VuZVBsdWdpbjogcmVxdWlyZSgnLi9TY2VuZVBsdWdpbicpLFxyXG4gICAgU2V0dGluZ3M6IHJlcXVpcmUoJy4vU2V0dGluZ3MnKSxcclxuICAgIFN5c3RlbXM6IHJlcXVpcmUoJy4vU3lzdGVtcycpXHJcblxyXG59O1xyXG5cclxuLy8gICBNZXJnZSBpbiB0aGUgY29uc3RzXHJcblNjZW5lID0gRXh0ZW5kKGZhbHNlLCBTY2VuZSwgQ09OU1QpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTY2VuZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgUGF2bGUgR29sb3Nrb2tvdmljIDxwZ29sb3Nrb2tvdmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9wcnVuZWdhbWVzLmNvbSlcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgRXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG52YXIgTk9PUCA9IHJlcXVpcmUoJy4uL3V0aWxzL05PT1AnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIENsYXNzIGNvbnRhaW5pbmcgYWxsIHRoZSBzaGFyZWQgc3RhdGUgYW5kIGJlaGF2aW9yIG9mIGEgc291bmQgb2JqZWN0LCBpbmRlcGVuZGVudCBvZiB0aGUgaW1wbGVtZW50YXRpb24uXHJcbiAqXHJcbiAqIEBjbGFzcyBCYXNlU291bmRcclxuICogQGV4dGVuZHMgUGhhc2VyLkV2ZW50cy5FdmVudEVtaXR0ZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5Tb3VuZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXJ9IG1hbmFnZXIgLSBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc291bmQgbWFuYWdlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZ10gLSBBbiBvcHRpb25hbCBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncy5cclxuICovXHJcbnZhciBCYXNlU291bmQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEJhc2VTb3VuZCAobWFuYWdlciwga2V5LCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExvY2FsIHJlZmVyZW5jZSB0byB0aGUgc291bmQgbWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCNrZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgaWYgc291bmQgaXMgY3VycmVudGx5IHBsYXlpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI2lzUGxheWluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHNvdW5kIGlzIGN1cnJlbnRseSBwYXVzZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI2lzUGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgdmFsdWUgb2Ygc291bmQncyBhY3R1YWwgcGxheWJhY2sgcmF0ZSxcclxuICAgICAgICAgKiBhZnRlciBpdHMgcmF0ZSBhbmQgZGV0dW5lIHZhbHVlcyBoYXMgYmVlbiBjb21iaW5lZCB3aXRoIGdsb2JhbFxyXG4gICAgICAgICAqIHJhdGUgYW5kIGRldHVuZSB2YWx1ZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3RvdGFsUmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxSYXRlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLlxyXG4gICAgICAgICAqIEl0IGNvdWxkIGJlIHRvdGFsIHNvdW5kIGR1cmF0aW9uIG9yIGEgbWFya2VyIGR1cmF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24gfHwgMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBzb3VuZCBpbiBzZWNvbmRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCN0b3RhbER1cmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSB0aGlzLnRvdGFsRHVyYXRpb24gfHwgMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25maWcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncycgdmFsdWVzLlxyXG4gICAgICAgICAqIERlZmF1bHQgdmFsdWVzIHdpbGwgYmUgc2V0IGJ5IHByb3BlcnRpZXMnIHNldHRlcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI2NvbmZpZ1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWd9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcclxuXHJcbiAgICAgICAgICAgIG11dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB2b2x1bWU6IDEsXHJcbiAgICAgICAgICAgIHJhdGU6IDEsXHJcbiAgICAgICAgICAgIGRldHVuZTogMCxcclxuICAgICAgICAgICAgc2VlazogMCxcclxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgICAgICAgIGRlbGF5OiAwXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IHVzZWQgY29uZmlnLlxyXG4gICAgICAgICAqIEl0IGNvdWxkIGJlIGRlZmF1bHQgY29uZmlnIG9yIG1hcmtlciBjb25maWcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI2N1cnJlbnRDb25maWdcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kQ29uZmlnfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlnID0gRXh0ZW5kKHRoaXMuY29uZmlnLCBjb25maWcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBPYmplY3QgY29udGFpbmluZyBtYXJrZXJzIGRlZmluaXRpb25zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCNtYXJrZXJzXHJcbiAgICAgICAgICogQHR5cGUge09iamVjdC48c3RyaW5nLCBQaGFzZXIuVHlwZXMuU291bmQuU291bmRNYXJrZXI+fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHt9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYXJrZXJzID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEN1cnJlbnRseSBwbGF5aW5nIG1hcmtlci5cclxuICAgICAgICAgKiAnbnVsbCcgaWYgd2hvbGUgc291bmQgaXMgcGxheWluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjY3VycmVudE1hcmtlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuU291bmQuU291bmRNYXJrZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1hcmtlciA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiBkZXN0cm95IG1ldGhvZCB3YXMgY2FsbGVkIG9uIHRoaXMgc291bmQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3BlbmRpbmdSZW1vdmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVtb3ZlID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG1hcmtlciBpbnRvIHRoZSBjdXJyZW50IHNvdW5kLiBBIG1hcmtlciBpcyByZXByZXNlbnRlZCBieSBuYW1lLCBzdGFydCB0aW1lLCBkdXJhdGlvbiwgYW5kIG9wdGlvbmFsbHkgY29uZmlnIG9iamVjdC5cclxuICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byBidW5kbGUgbXVsdGlwbGUgc291bmRzIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgYXVkaW8gZmlsZSBhbmQgdXNlIG1hcmtlcnMgdG8ganVtcCBiZXR3ZWVuIHRoZW0gZm9yIHBsYXliYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCNhZGRNYXJrZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kTWFya2VyfSBtYXJrZXIgLSBNYXJrZXIgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG1hcmtlciB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICBhZGRNYXJrZXI6IGZ1bmN0aW9uIChtYXJrZXIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFtYXJrZXIgfHwgIW1hcmtlci5uYW1lIHx8IHR5cGVvZiBtYXJrZXIubmFtZSAhPT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tYXJrZXJzW21hcmtlci5uYW1lXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FkZE1hcmtlciAnICsgbWFya2VyLm5hbWUgKyAnIGFscmVhZHkgZXhpc3RzIGluIFNvdW5kJyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtYXJrZXIgPSBFeHRlbmQodHJ1ZSwge1xyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLnRvdGFsRHVyYXRpb24gLSAobWFya2VyLnN0YXJ0IHx8IDApLFxyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIG11dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdm9sdW1lOiAxLFxyXG4gICAgICAgICAgICAgICAgcmF0ZTogMSxcclxuICAgICAgICAgICAgICAgIGRldHVuZTogMCxcclxuICAgICAgICAgICAgICAgIHNlZWs6IDAsXHJcbiAgICAgICAgICAgICAgICBsb29wOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRlbGF5OiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBtYXJrZXIpO1xyXG5cclxuICAgICAgICB0aGlzLm1hcmtlcnNbbWFya2VyLm5hbWVdID0gbWFya2VyO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHByZXZpb3VzbHkgYWRkZWQgbWFya2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCN1cGRhdGVNYXJrZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kTWFya2VyfSBtYXJrZXIgLSBNYXJrZXIgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbWFya2VyIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlTWFya2VyOiBmdW5jdGlvbiAobWFya2VyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghbWFya2VyIHx8ICFtYXJrZXIubmFtZSB8fCB0eXBlb2YgbWFya2VyLm5hbWUgIT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm1hcmtlcnNbbWFya2VyLm5hbWVdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBdWRpbyBNYXJrZXI6ICcgKyBtYXJrZXIubmFtZSArICcgbWlzc2luZyBpbiBTb3VuZDogJyArIHRoaXMua2V5KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWFya2Vyc1ttYXJrZXIubmFtZV0gPSBFeHRlbmQodHJ1ZSwgdGhpcy5tYXJrZXJzW21hcmtlci5uYW1lXSwgbWFya2VyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIG1hcmtlciBmcm9tIHRoZSBzb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjcmVtb3ZlTWFya2VyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya2VyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtYXJrZXIgdG8gcmVtb3ZlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVHlwZXMuU291bmQuU291bmRNYXJrZXJ9IFJlbW92ZWQgbWFya2VyIG9iamVjdCBvciAnbnVsbCcgaWYgdGhlcmUgd2FzIG5vIG1hcmtlciB3aXRoIHByb3ZpZGVkIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZU1hcmtlcjogZnVuY3Rpb24gKG1hcmtlck5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMubWFya2Vyc1ttYXJrZXJOYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKCFtYXJrZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWFya2Vyc1ttYXJrZXJOYW1lXSA9IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXJrZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGxheSB0aGlzIHNvdW5kLCBvciBhIG1hcmtlZCBzZWN0aW9uIG9mIGl0LlxyXG4gICAgICogSXQgYWx3YXlzIHBsYXlzIHRoZSBzb3VuZCBmcm9tIHRoZSBzdGFydC4gSWYgeW91IHdhbnQgdG8gc3RhcnQgcGxheWJhY2sgZnJvbSBhIHNwZWNpZmljIHRpbWVcclxuICAgICAqIHlvdSBjYW4gc2V0ICdzZWVrJyBzZXR0aW5nIG9mIHRoZSBjb25maWcgb2JqZWN0LCBwcm92aWRlZCB0byB0aGlzIGNhbGwsIHRvIHRoYXQgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3BsYXlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWcpfSBbbWFya2VyTmFtZT0nJ10gLSBJZiB5b3Ugd2FudCB0byBwbGF5IGEgbWFya2VyIHRoZW4gcHJvdmlkZSB0aGUgbWFya2VyIG5hbWUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgU291bmRDb25maWcgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWd9IFtjb25maWddIC0gT3B0aW9uYWwgc291bmQgY29uZmlnIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvIHRoaXMgbWFya2VyIG9yIGVudGlyZSBzb3VuZCBpZiBubyBtYXJrZXIgbmFtZSBpcyBwcm92aWRlZC4gSXQgZ2V0cyBtZW1vcml6ZWQgZm9yIGZ1dHVyZSBwbGF5cyBvZiBjdXJyZW50IHNlY3Rpb24gb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdW5kIHN0YXJ0ZWQgcGxheWluZyBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHBsYXk6IGZ1bmN0aW9uIChtYXJrZXJOYW1lLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG1hcmtlck5hbWUgPT09IHVuZGVmaW5lZCkgeyBtYXJrZXJOYW1lID0gJyc7IH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtYXJrZXJOYW1lID09PSAnb2JqZWN0JylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbmZpZyA9IG1hcmtlck5hbWU7XHJcbiAgICAgICAgICAgIG1hcmtlck5hbWUgPSAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbWFya2VyTmFtZSAhPT0gJ3N0cmluZycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW1hcmtlck5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXJrZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZztcclxuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IHRoaXMudG90YWxEdXJhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlcnNbbWFya2VyTmFtZV0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ01hcmtlcjogJyArIG1hcmtlck5hbWUgKyAnIG1pc3NpbmcgaW4gU291bmQ6ICcgKyB0aGlzLmtleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXJrZXIgPSB0aGlzLm1hcmtlcnNbbWFya2VyTmFtZV07XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHRoaXMuY3VycmVudE1hcmtlci5jb25maWc7XHJcbiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLmN1cnJlbnRNYXJrZXIuZHVyYXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0Q29uZmlnKCk7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IEV4dGVuZCh0aGlzLmN1cnJlbnRDb25maWcsIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3BhdXNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VuZCB3YXMgcGF1c2VkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgcGF1c2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXVzZWQgfHwgIXRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lcyB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3Jlc3VtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcCBwbGF5aW5nIHRoaXMgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kI3N0b3BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdW5kIHdhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNQYXVzZWQgJiYgIXRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRDb25maWcoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSBmb3IgYXBwbHlpbmcgY29uZmlnIHZhbHVlcyB0byBzb21lIG9mIHRoZSBzb3VuZCBwcm9wZXJ0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCNhcHBseUNvbmZpZ1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGFwcGx5Q29uZmlnOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubXV0ZSA9IHRoaXMuY3VycmVudENvbmZpZy5tdXRlO1xyXG4gICAgICAgIHRoaXMudm9sdW1lID0gdGhpcy5jdXJyZW50Q29uZmlnLnZvbHVtZTtcclxuICAgICAgICB0aGlzLnJhdGUgPSB0aGlzLmN1cnJlbnRDb25maWcucmF0ZTtcclxuICAgICAgICB0aGlzLmRldHVuZSA9IHRoaXMuY3VycmVudENvbmZpZy5kZXR1bmU7XHJcbiAgICAgICAgdGhpcy5sb29wID0gdGhpcy5jdXJyZW50Q29uZmlnLmxvb3A7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSBmb3IgcmVzZXR0aW5nIHZhbHVlcyBvZiBzb21lIG9mIHRoZSBjb25maWcgcHJvcGVydGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjcmVzZXRDb25maWdcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByZXNldENvbmZpZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcuc2VlayA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLmRlbGF5ID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgbWV0aG9kIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHNvdW5kIG1hbmFnZXIgb24gZXZlcnkgZ2FtZSBzdGVwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZCN1cGRhdGVcclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBOT09QLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSB0byBjYWxjdWxhdGUgdG90YWwgcGxheWJhY2sgcmF0ZSBvZiB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kI2NhbGN1bGF0ZVJhdGVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVSYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjZW50ID0gMS4wMDA1Nzc3ODk1MDY1NTQ4OyAvLyBNYXRoLnBvdygyLCAxLzEyMDApO1xyXG4gICAgICAgIHZhciB0b3RhbERldHVuZSA9IHRoaXMuY3VycmVudENvbmZpZy5kZXR1bmUgKyB0aGlzLm1hbmFnZXIuZGV0dW5lO1xyXG4gICAgICAgIHZhciBkZXR1bmVSYXRlID0gTWF0aC5wb3coY2VudCwgdG90YWxEZXR1bmUpO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsUmF0ZSA9IHRoaXMuY3VycmVudENvbmZpZy5yYXRlICogdGhpcy5tYW5hZ2VyLnJhdGUgKiBkZXR1bmVSYXRlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgc291bmQgYW5kIGFsbCBhc3NvY2lhdGVkIGV2ZW50cyBhbmQgbWFya3MgaXQgZm9yIHJlbW92YWwgZnJvbSB0aGUgc291bmQgbWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjZGVzdHJveVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjREVTVFJPWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlbW92ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuREVTVFJPWSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVtb3ZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMua2V5ID0gJyc7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1hcmtlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmFzZVNvdW5kO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBQYXZsZSBHb2xvc2tva292aWMgPHBnb2xvc2tva292aWNAZ21haWwuY29tPiAoaHR0cDovL3BydW5lZ2FtZXMuY29tKVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENsb25lID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0Nsb25lJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgR2FtZUV2ZW50cyA9IHJlcXVpcmUoJy4uL2NvcmUvZXZlbnRzJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgR2V0QWxsID0gcmVxdWlyZSgnLi4vdXRpbHMvYXJyYXkvR2V0QWxsJyk7XHJcbnZhciBHZXRGaXJzdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L0dldEZpcnN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBCYXNlIGNsYXNzIGZvciBvdGhlciBTb3VuZCBNYW5hZ2VyIGNsYXNzZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBCYXNlU291bmRNYW5hZ2VyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU291bmRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBzZWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJcclxuICogQHNlZSBQaGFzZXIuU291bmQuTm9BdWRpb1NvdW5kTWFuYWdlclxyXG4gKiBAc2VlIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlclxyXG4gKi9cclxudmFyIEJhc2VTb3VuZE1hbmFnZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEJhc2VTb3VuZE1hbmFnZXIgKGdhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExvY2FsIHJlZmVyZW5jZSB0byBnYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBnYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBMb2NhbCByZWZlcmVuY2UgdG8gdGhlIEpTT04gQ2FjaGUsIGFzIHVzZWQgYnkgQXVkaW8gU3ByaXRlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI2pzb25DYWNoZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuQ2FjaGUuQmFzZUNhY2hlfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuanNvbkNhY2hlID0gZ2FtZS5jYWNoZS5qc29uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGFsbCBhZGRlZCBzb3VuZHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNzb3VuZHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNvdW5kLkJhc2VTb3VuZFtdfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IFtdXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNvdW5kcyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHbG9iYWwgbXV0ZSBzZXR0aW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjbXV0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tdXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdsb2JhbCB2b2x1bWUgc2V0dGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3ZvbHVtZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudm9sdW1lID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHNvdW5kcyBzaG91bGQgYmUgcGF1c2VkIHdoZW4gZ2FtZSBsb29zZXMgZm9jdXMsXHJcbiAgICAgICAgICogZm9yIGluc3RhbmNlIHdoZW4gdXNlciBzd2l0Y2hlcyB0byBhbm90aGVyIHRhYi9wcm9ncmFtL2FwcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3BhdXNlT25CbHVyXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF1c2VPbkJsdXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQcm9wZXJ0eSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSB2YWx1ZSBvZiBnbG9iYWwgcGxheWJhY2sgcmF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI19yYXRlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yYXRlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJvcGVydHkgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgdmFsdWUgb2YgZ2xvYmFsIGRldHVuZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI19kZXR1bmVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2RldHVuZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1vYmlsZSBkZXZpY2VzIHJlcXVpcmUgc291bmRzIHRvIGJlIHRyaWdnZXJlZCBmcm9tIGFuIGV4cGxpY2l0IHVzZXIgYWN0aW9uLFxyXG4gICAgICAgICAqIHN1Y2ggYXMgYSB0YXAsIGJlZm9yZSBhbnkgc291bmQgY2FuIGJlIGxvYWRlZC9wbGF5ZWQgb24gYSB3ZWIgcGFnZS5cclxuICAgICAgICAgKiBTZXQgdG8gdHJ1ZSBpZiB0aGUgYXVkaW8gc3lzdGVtIGlzIGN1cnJlbnRseSBsb2NrZWQgYXdhaXRpbmcgdXNlciBpbnRlcmFjdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI2xvY2tlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9ja2VkID0gdGhpcy5sb2NrZWQgfHwgZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZsYWcgdXNlZCBpbnRlcm5hbGx5IGZvciBoYW5kbGluZyB3aGVuIHRoZSBhdWRpbyBzeXN0ZW1cclxuICAgICAgICAgKiBoYXMgYmVlbiB1bmxvY2tlZCwgaWYgdGhlcmUgZXZlciB3YXMgYSBuZWVkIGZvciBpdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3VubG9ja2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudW5sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZ2FtZS5ldmVudHMub24oR2FtZUV2ZW50cy5CTFVSLCB0aGlzLm9uR2FtZUJsdXIsIHRoaXMpO1xyXG4gICAgICAgIGdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuRk9DVVMsIHRoaXMub25HYW1lRm9jdXMsIHRoaXMpO1xyXG4gICAgICAgIGdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuUFJFX1NURVAsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBnYW1lLmV2ZW50cy5vbmNlKEdhbWVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IHNvdW5kIGludG8gdGhlIHNvdW5kIG1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNhZGRcclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWd9IFtjb25maWddIC0gQW4gb3B0aW9uYWwgY29uZmlnIG9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgc291bmQgc2V0dGluZ3MuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLkJhc2VTb3VuZH0gVGhlIG5ldyBzb3VuZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgYWRkOiBOT09QLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBhdWRpbyBzcHJpdGUgc291bmQgaW50byB0aGUgc291bmQgbWFuYWdlci5cclxuICAgICAqIEF1ZGlvIFNwcml0ZXMgYXJlIGEgY29tYmluYXRpb24gb2YgYXVkaW8gZmlsZXMgYW5kIGEgSlNPTiBjb25maWd1cmF0aW9uLlxyXG4gICAgICogVGhlIEpTT04gZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoYXQgY3JlYXRlZCBieSBodHRwczovL2dpdGh1Yi5jb20vdG9uaXN0aWlnaS9hdWRpb3Nwcml0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjYWRkQXVkaW9TcHJpdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBc3NldCBrZXkgZm9yIHRoZSBzb3VuZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kQ29uZmlnfSBbY29uZmlnXSAtIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IHNvdW5kIHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyhQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kKX0gVGhlIG5ldyBhdWRpbyBzcHJpdGUgc291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGFkZEF1ZGlvU3ByaXRlOiBmdW5jdGlvbiAoa2V5LCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgICAgIHZhciBzb3VuZCA9IHRoaXMuYWRkKGtleSwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgc291bmQuc3ByaXRlbWFwID0gdGhpcy5qc29uQ2FjaGUuZ2V0KGtleSkuc3ByaXRlbWFwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBtYXJrZXJOYW1lIGluIHNvdW5kLnNwcml0ZW1hcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghc291bmQuc3ByaXRlbWFwLmhhc093blByb3BlcnR5KG1hcmtlck5hbWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG1hcmtlckNvbmZpZyA9IENsb25lKGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgbWFya2VyID0gc291bmQuc3ByaXRlbWFwW21hcmtlck5hbWVdO1xyXG5cclxuICAgICAgICAgICAgbWFya2VyQ29uZmlnLmxvb3AgPSAobWFya2VyLmhhc093blByb3BlcnR5KCdsb29wJykpID8gbWFya2VyLmxvb3AgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHNvdW5kLmFkZE1hcmtlcih7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBtYXJrZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1hcmtlci5zdGFydCxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBtYXJrZXIuZW5kIC0gbWFya2VyLnN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgY29uZmlnOiBtYXJrZXJDb25maWdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc291bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgZmlyc3Qgc291bmQgaW4gdGhlIG1hbmFnZXIgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgaWYgYW55LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFNvdW5kIGFzc2V0IGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlNvdW5kLkJhc2VTb3VuZH0gLSBUaGUgc291bmQsIG9yIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGdldDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0Rmlyc3QodGhpcy5zb3VuZHMsICdrZXknLCBrZXkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW55IHNvdW5kcyBpbiB0aGUgbWFuYWdlciBtYXRjaGluZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZ2V0QWxsXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFNvdW5kIGFzc2V0IGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kW119IC0gVGhlIHNvdW5kcywgb3IgYW4gZW1wdHkgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGdldEFsbDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2V0QWxsKHRoaXMuc291bmRzLCAna2V5Jywga2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IHNvdW5kIHRvIHRoZSBzb3VuZCBtYW5hZ2VyIGFuZCBwbGF5cyBpdC5cclxuICAgICAqIFRoZSBzb3VuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCAoZGVzdHJveWVkKSBvbmNlIHBsYXliYWNrIGVuZHMuXHJcbiAgICAgKiBUaGlzIGxldHMgeW91IHBsYXkgYSBuZXcgc291bmQgb24gdGhlIGZseSB3aXRob3V0IHRoZSBuZWVkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNwbGF5XHJcbiAgICAgKiBAbGlzdGVucyBQaGFzZXIuU291bmQuRXZlbnRzI0NPTVBMRVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gQXNzZXQga2V5IGZvciB0aGUgc291bmQuXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWd8UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kTWFya2VyKX0gW2V4dHJhXSAtIEFuIG9wdGlvbmFsIGFkZGl0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgc2V0dGluZ3MgdG8gYmUgYXBwbGllZCB0byB0aGUgc291bmQuIEl0IGNvdWxkIGJlIGVpdGhlciBjb25maWcgb3IgbWFya2VyIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VuZCBzdGFydGVkIHBsYXlpbmcgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICBwbGF5OiBmdW5jdGlvbiAoa2V5LCBleHRyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc291bmQgPSB0aGlzLmFkZChrZXkpO1xyXG5cclxuICAgICAgICBzb3VuZC5vbmNlKEV2ZW50cy5DT01QTEVURSwgc291bmQuZGVzdHJveSwgc291bmQpO1xyXG5cclxuICAgICAgICBpZiAoZXh0cmEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZXh0cmEubmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291bmQuYWRkTWFya2VyKGV4dHJhKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc291bmQucGxheShleHRyYS5uYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VuZC5wbGF5KGV4dHJhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gc291bmQucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGF1ZGlvIHNwcml0ZSBzb3VuZCB0byB0aGUgc291bmQgbWFuYWdlciBhbmQgcGxheXMgaXQuXHJcbiAgICAgKiBUaGUgc3ByaXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIChkZXN0cm95ZWQpIG9uY2UgcGxheWJhY2sgZW5kcy5cclxuICAgICAqIFRoaXMgbGV0cyB5b3UgcGxheSBhIG5ldyBzb3VuZCBvbiB0aGUgZmx5IHdpdGhvdXQgdGhlIG5lZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3BsYXlBdWRpb1Nwcml0ZVxyXG4gICAgICogQGxpc3RlbnMgUGhhc2VyLlNvdW5kLkV2ZW50cyNDT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNwcml0ZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc291bmQgc3ByaXRlIHRvIHBsYXkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZ10gLSBBbiBvcHRpb25hbCBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBhdWRpbyBzcHJpdGUgc291bmQgc3RhcnRlZCBwbGF5aW5nIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgcGxheUF1ZGlvU3ByaXRlOiBmdW5jdGlvbiAoa2V5LCBzcHJpdGVOYW1lLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNvdW5kID0gdGhpcy5hZGRBdWRpb1Nwcml0ZShrZXkpO1xyXG5cclxuICAgICAgICBzb3VuZC5vbmNlKEV2ZW50cy5DT01QTEVURSwgc291bmQuZGVzdHJveSwgc291bmQpO1xyXG5cclxuICAgICAgICByZXR1cm4gc291bmQucGxheShzcHJpdGVOYW1lLCBjb25maWcpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBzb3VuZCBmcm9tIHRoZSBzb3VuZCBtYW5hZ2VyLlxyXG4gICAgICogVGhlIHJlbW92ZWQgc291bmQgaXMgZGVzdHJveWVkIGJlZm9yZSByZW1vdmFsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Tb3VuZC5CYXNlU291bmR9IHNvdW5kIC0gVGhlIHNvdW5kIG9iamVjdCB0byByZW1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc291bmQgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKHNvdW5kKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuc291bmRzLmluZGV4T2Yoc291bmQpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc291bmQuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zb3VuZHMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBzb3VuZHMgZnJvbSB0aGUgbWFuYWdlciwgZGVzdHJveWluZyB0aGUgc291bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjcmVtb3ZlQWxsXHJcbiAgICAgKiBAc2luY2UgMy4yMy4wXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNvdW5kLmRlc3Ryb3koKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zb3VuZHMubGVuZ3RoID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBzb3VuZHMgZnJvbSB0aGUgc291bmQgbWFuYWdlciB0aGF0IGhhdmUgYW4gYXNzZXQga2V5IG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqIFRoZSByZW1vdmVkIHNvdW5kcyBhcmUgZGVzdHJveWVkIGJlZm9yZSByZW1vdmFsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjcmVtb3ZlQnlLZXlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIG1hdGNoIHdoZW4gcmVtb3Zpbmcgc291bmQgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgc291bmQgb2JqZWN0cyB0aGF0IHdlcmUgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQnlLZXk6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlbW92ZWQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5zb3VuZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc291bmQgPSB0aGlzLnNvdW5kc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzb3VuZC5rZXkgPT09IGtleSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291bmQuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc291bmRzLnNwbGljZShpLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZW1vdmVkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZW1vdmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyBhbGwgdGhlIHNvdW5kcyBpbiB0aGUgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3BhdXNlQWxsXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNQQVVTRV9BTExcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwYXVzZUFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZvckVhY2hBY3RpdmVTb3VuZChmdW5jdGlvbiAoc291bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzb3VuZC5wYXVzZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlBBVVNFX0FMTCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lcyBhbGwgdGhlIHNvdW5kcyBpbiB0aGUgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3Jlc3VtZUFsbFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjUkVTVU1FX0FMTFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZUFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZvckVhY2hBY3RpdmVTb3VuZChmdW5jdGlvbiAoc291bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzb3VuZC5yZXN1bWUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5SRVNVTUVfQUxMLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbGwgdGhlIHNvdW5kcyBpbiB0aGUgZ2FtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3N0b3BBbGxcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1NUT1BfQUxMXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RvcEFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmZvckVhY2hBY3RpdmVTb3VuZChmdW5jdGlvbiAoc291bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzb3VuZC5zdG9wKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuU1RPUF9BTEwsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbnkgc291bmRzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNzdG9wQnlLZXlcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gU291bmQgYXNzZXQga2V5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBIb3cgbWFueSBzb3VuZHMgd2VyZSBzdG9wcGVkLlxyXG4gICAgICovXHJcbiAgICBzdG9wQnlLZXk6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHN0b3BwZWQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmdldEFsbChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHNvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHNvdW5kLnN0b3AoKSkgeyBzdG9wcGVkKys7IH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0b3BwZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSBmb3IgdW5sb2NraW5nIGF1ZGlvIHBsYXliYWNrIG9uIGRldmljZXMgdGhhdFxyXG4gICAgICogcmVxdWlyZSB1c2VyIGludGVyYWN0aW9uIGJlZm9yZSBhbnkgc291bmQgY2FuIGJlIHBsYXllZCBvbiBhIHdlYiBwYWdlLlxyXG4gICAgICpcclxuICAgICAqIFJlYWQgbW9yZSBhYm91dCBob3cgdGhpcyBpc3N1ZSBpcyBoYW5kbGVkIGhlcmUgaW4gW3RoaXMgYXJ0aWNsZV0oaHR0cHM6Ly9tZWRpdW0uY29tL0BwZ29sb3Nrb2tvdmljL3VubG9ja2luZy13ZWItYXVkaW8tdGhlLXNtYXJ0ZXItd2F5LTg4NTgyMThjMGUwOSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciN1bmxvY2tcclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVubG9jazogTk9PUCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgZm9yIHBhdXNpbmcgc291bmQgbWFuYWdlciBpZlxyXG4gICAgICogUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjcGF1c2VPbkJsdXIgaXMgc2V0IHRvIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNvbkJsdXJcclxuICAgICAqIEBvdmVycmlkZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9uQmx1cjogTk9PUCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgZm9yIHJlc3VtaW5nIHNvdW5kIG1hbmFnZXIgaWZcclxuICAgICAqIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3BhdXNlT25CbHVyIGlzIHNldCB0byB0cnVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjb25Gb2N1c1xyXG4gICAgICogQG92ZXJyaWRlXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25Gb2N1czogTk9PUCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIFBoYXNlci5Db3JlLkV2ZW50cyNCTFVSLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjb25HYW1lQmx1clxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjIzLjBcclxuICAgICAqL1xyXG4gICAgb25HYW1lQmx1cjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5wYXVzZU9uQmx1cilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub25CbHVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIGhhbmRsZXIgZm9yIFBoYXNlci5Db3JlLkV2ZW50cyNGT0NVUy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI29uR2FtZUZvY3VzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMjMuMFxyXG4gICAgICovXHJcbiAgICBvbkdhbWVGb2N1czogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5wYXVzZU9uQmx1cilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub25Gb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbiBldmVyeSBnYW1lIHN0ZXAuXHJcbiAgICAgKiBSZW1vdmVzIGRlc3Ryb3llZCBzb3VuZHMgYW5kIHVwZGF0ZXMgZXZlcnkgYWN0aXZlIHNvdW5kIGluIHRoZSBnYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjdXBkYXRlXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNVTkxPQ0tFRFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMudW5sb2NrZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVubG9ja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubG9ja2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlVOTE9DS0VELCB0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnNvdW5kcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdW5kc1tpXS5wZW5kaW5nUmVtb3ZlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdW5kcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc291bmRzLmZvckVhY2goZnVuY3Rpb24gKHNvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc291bmQudXBkYXRlKHRpbWUsIGRlbHRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyBhbGwgdGhlIHNvdW5kcyBpbiB0aGUgZ2FtZSBhbmQgYWxsIGFzc29jaWF0ZWQgZXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5nYW1lLmV2ZW50cy5vZmYoR2FtZUV2ZW50cy5CTFVSLCB0aGlzLm9uR2FtZUJsdXIsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub2ZmKEdhbWVFdmVudHMuRk9DVVMsIHRoaXMub25HYW1lRm9jdXMsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub2ZmKEdhbWVFdmVudHMuUFJFX1NURVAsIHRoaXMudXBkYXRlLCB0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb3VuZHMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLnNvdW5kcyA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSBmb3IgaXRlcmF0aW5nIG9ubHkgb3ZlciBhY3RpdmUgc291bmRzIGFuZCBza2lwcGluZyBzb3VuZHMgdGhhdCBhcmUgbWFya2VkIGZvciByZW1vdmFsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZm9yRWFjaEFjdGl2ZVNvdW5kXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuU291bmQuRWFjaEFjdGl2ZVNvdW5kQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uIChtYW5hZ2VyOiBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciwgc291bmQ6IFBoYXNlci5Tb3VuZC5CYXNlU291bmQsIGluZGV4OiBudW1iZXIsIHNvdW5kczogUGhhc2VyLk1hbmFnZXIuQmFzZVNvdW5kW10pID0+IHZvaWRcclxuICAgICAqIEBwYXJhbSB7Kn0gW3Njb3BlXSAtIENhbGxiYWNrIGNvbnRleHQuXHJcbiAgICAgKi9cclxuICAgIGZvckVhY2hBY3RpdmVTb3VuZDogZnVuY3Rpb24gKGNhbGxiYWNrLCBzY29wZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnNvdW5kcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VuZCwgaW5kZXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoc291bmQgJiYgIXNvdW5kLnBlbmRpbmdSZW1vdmUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoc2NvcGUgfHwgX3RoaXMsIHNvdW5kLCBpbmRleCwgX3RoaXMuc291bmRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGdsb2JhbCBwbGF5YmFjayByYXRlIGF0IHdoaWNoIGFsbCB0aGUgc291bmRzIHdpbGwgYmUgcGxheWVkLlxyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEuMCBwbGF5cyB0aGUgYXVkaW8gYXQgZnVsbCBzcGVlZCwgMC41IHBsYXlzIHRoZSBhdWRpbyBhdCBoYWxmIHNwZWVkXHJcbiAgICAgKiBhbmQgMi4wIGRvdWJsZXMgdGhlIGF1ZGlvcyBwbGF5YmFjayBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3NldFJhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9SQVRFXHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBHbG9iYWwgcGxheWJhY2sgcmF0ZSBhdCB3aGljaCBhbGwgdGhlIHNvdW5kcyB3aWxsIGJlIHBsYXllZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gVGhpcyBTb3VuZCBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBzZXRSYXRlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yYXRlID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdsb2JhbCBwbGF5YmFjayByYXRlIGF0IHdoaWNoIGFsbCB0aGUgc291bmRzIHdpbGwgYmUgcGxheWVkLlxyXG4gICAgICogVmFsdWUgb2YgMS4wIHBsYXlzIHRoZSBhdWRpbyBhdCBmdWxsIHNwZWVkLCAwLjUgcGxheXMgdGhlIGF1ZGlvIGF0IGhhbGYgc3BlZWRcclxuICAgICAqIGFuZCAyLjAgZG91YmxlcyB0aGUgYXVkaW8ncyBwbGF5YmFjayBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNyYXRlXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJhdGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yYXRlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvckVhY2hBY3RpdmVTb3VuZChmdW5jdGlvbiAoc291bmQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNvdW5kLmNhbGN1bGF0ZVJhdGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkdMT0JBTF9SQVRFLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBnbG9iYWwgZGV0dW5pbmcgb2YgYWxsIHNvdW5kcyBpbiBbY2VudHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRfJTI4bXVzaWMlMjkpLlxyXG4gICAgICogVGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBpcyAtMTIwMCB0byAxMjAwLCBidXQgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQgdG8gWzUwXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS81MF9DZW50KS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI3NldERldHVuZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjR0xPQkFMX0RFVFVORVxyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBpcyAtMTIwMCB0byAxMjAwLCBidXQgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQgdG8gWzUwXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS81MF9DZW50KS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gVGhpcyBTb3VuZCBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBzZXREZXR1bmU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRldHVuZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHbG9iYWwgZGV0dW5pbmcgb2YgYWxsIHNvdW5kcyBpbiBbY2VudHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRfJTI4bXVzaWMlMjkpLlxyXG4gICAgICogVGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBpcyAtMTIwMCB0byAxMjAwLCBidXQgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQgdG8gWzUwXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS81MF9DZW50KS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlciNkZXR1bmVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGV0dW5lOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXR1bmU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9kZXR1bmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaEFjdGl2ZVNvdW5kKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291bmQuY2FsY3VsYXRlUmF0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuR0xPQkFMX0RFVFVORSwgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmFzZVNvdW5kTWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgUGF2bGUgR29sb3Nrb2tvdmljIDxwZ29sb3Nrb2tvdmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9wcnVuZWdhbWVzLmNvbSlcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBIVE1MNUF1ZGlvU291bmRNYW5hZ2VyID0gcmVxdWlyZSgnLi9odG1sNS9IVE1MNUF1ZGlvU291bmRNYW5hZ2VyJyk7XHJcbnZhciBOb0F1ZGlvU291bmRNYW5hZ2VyID0gcmVxdWlyZSgnLi9ub2F1ZGlvL05vQXVkaW9Tb3VuZE1hbmFnZXInKTtcclxudmFyIFdlYkF1ZGlvU291bmRNYW5hZ2VyID0gcmVxdWlyZSgnLi93ZWJhdWRpby9XZWJBdWRpb1NvdW5kTWFuYWdlcicpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBXZWIgQXVkaW8sIEhUTUw1IEF1ZGlvIG9yIE5vIEF1ZGlvIFNvdW5kIE1hbmFnZXIgYmFzZWQgb24gY29uZmlnIGFuZCBkZXZpY2Ugc2V0dGluZ3MuXHJcbiAqXHJcbiAqIEJlIGF3YXJlIG9mIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDkvYXV0b3BsYXktcG9saWN5LWNoYW5nZXNcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5Tb3VuZC5Tb3VuZE1hbmFnZXJDcmVhdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAqIFxyXG4gKiBAcmV0dXJuIHsoUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJ8UGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyfFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmRNYW5hZ2VyKX0gVGhlIFNvdW5kIE1hbmFnZXIgaW5zdGFuY2UgdGhhdCB3YXMgY3JlYXRlZC5cclxuICovXHJcbnZhciBTb3VuZE1hbmFnZXJDcmVhdG9yID0ge1xyXG5cclxuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGdhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGF1ZGlvQ29uZmlnID0gZ2FtZS5jb25maWcuYXVkaW87XHJcbiAgICAgICAgdmFyIGRldmljZUF1ZGlvID0gZ2FtZS5kZXZpY2UuYXVkaW87XHJcblxyXG4gICAgICAgIGlmICgoYXVkaW9Db25maWcgJiYgYXVkaW9Db25maWcubm9BdWRpbykgfHwgKCFkZXZpY2VBdWRpby53ZWJBdWRpbyAmJiAhZGV2aWNlQXVkaW8uYXVkaW9EYXRhKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9BdWRpb1NvdW5kTWFuYWdlcihnYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZXZpY2VBdWRpby53ZWJBdWRpbyAmJiAhKGF1ZGlvQ29uZmlnICYmIGF1ZGlvQ29uZmlnLmRpc2FibGVXZWJBdWRpbykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1ZGlvU291bmRNYW5hZ2VyKGdhbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIVE1MNUF1ZGlvU291bmRNYW5hZ2VyKGdhbWUpO1xyXG4gICAgfVxyXG5cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU291bmRNYW5hZ2VyQ3JlYXRvcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNvdW5kIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGJvdGggV2ViIEF1ZGlvIGFuZCBIVE1MNSBBdWRpbyBTb3VuZCBvYmplY3RzIHdoZW4gdGhleSBjb21wbGV0ZSBwbGF5YmFjay5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdjb21wbGV0ZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpO1xyXG4gKiBtdXNpYy5wbGF5KCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNDT01QTEVURVxyXG4gKiBAc2luY2UgMy4xNi4xXHJcbiAqIFxyXG4gKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZHxQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kKX0gc291bmQgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NvbXBsZXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEF1ZGlvIERhdGEgRGVjb2RlZCBBbGwgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIFdlYiBBdWRpbyBTb3VuZCBNYW5hZ2VyIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIGBkZWNvZGVBdWRpb2AgbWV0aG9kLFxyXG4gKiBvbmNlIGFsbCBmaWxlcyBwYXNzZWQgdG8gdGhlIG1ldGhvZCBoYXZlIGJlZW4gZGVjb2RlZCAob3IgZXJyb3JlZCkuXHJcbiAqIFxyXG4gKiBVc2UgYFBoYXNlci5Tb3VuZC5FdmVudHMjREVDT0RFRGAgdG8gbGlzdGVuIGZvciBzaW5nbGUgc291bmRzIGJlaW5nIGRlY29kZWQsIGFuZCBgREVDT0RFRF9BTExgIHRvXHJcbiAqIGxpc3RlbiBmb3IgdGhlbSBhbGwgY29tcGxldGluZy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIHRoZSBTb3VuZCBNYW5hZ2VyIGluIGEgU2NlbmUgdXNpbmcgYHRoaXMuc291bmQub24oJ2RlY29kZWRhbGwnLCBsaXN0ZW5lcilgLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB0aGlzLnNvdW5kLm9uY2UoJ2RlY29kZWRhbGwnLCBoYW5kbGVyKTtcclxuICogdGhpcy5zb3VuZC5kZWNvZGVBdWRpbyhbIGF1ZGlvRmlsZXMgXSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNERUNPREVEX0FMTFxyXG4gKiBAc2luY2UgMy4xOC4wXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdkZWNvZGVkYWxsJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIEF1ZGlvIERhdGEgRGVjb2RlZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgV2ViIEF1ZGlvIFNvdW5kIE1hbmFnZXIgYXMgYSByZXN1bHQgb2YgY2FsbGluZyB0aGUgYGRlY29kZUF1ZGlvYCBtZXRob2QuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSB0aGUgU291bmQgTWFuYWdlciBpbiBhIFNjZW5lIHVzaW5nIGB0aGlzLnNvdW5kLm9uKCdkZWNvZGVkJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5zb3VuZC5vbignZGVjb2RlZCcsIGhhbmRsZXIpO1xyXG4gKiB0aGlzLnNvdW5kLmRlY29kZUF1ZGlvKGtleSwgYXVkaW9EYXRhKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI0RFQ09ERURcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGF1ZGlvIGZpbGUgdGhhdCB3YXMgZGVjb2RlZCBhbmQgYWRkZWQgdG8gdGhlIGF1ZGlvIGNhY2hlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZGVjb2RlZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBEZXN0cm95IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGJvdGggV2ViIEF1ZGlvIGFuZCBIVE1MNSBBdWRpbyBTb3VuZCBvYmplY3RzIHdoZW4gdGhleSBhcmUgZGVzdHJveWVkLCBlaXRoZXJcclxuICogZGlyZWN0bHkgb3IgdmlhIGEgU291bmQgTWFuYWdlci5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdkZXN0cm95JywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbignZGVzdHJveScsIGxpc3RlbmVyKTtcclxuICogbXVzaWMuZGVzdHJveSgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjREVTVFJPWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZGVzdHJveSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBEZXR1bmUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYm90aCBXZWIgQXVkaW8gYW5kIEhUTUw1IEF1ZGlvIFNvdW5kIG9iamVjdHMgd2hlbiB0aGVpciBkZXR1bmUgdmFsdWUgY2hhbmdlcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdkZXR1bmUnLCBsaXN0ZW5lcilgLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgbXVzaWMgPSB0aGlzLnNvdW5kLmFkZCgna2V5Jyk7XHJcbiAqIG11c2ljLm9uKCdkZXR1bmUnLCBsaXN0ZW5lcik7XHJcbiAqIG11c2ljLnBsYXkoKTtcclxuICogbXVzaWMuc2V0RGV0dW5lKDIwMCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNERVRVTkVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZHxQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kKX0gc291bmQgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRldHVuZSAtIFRoZSBuZXcgZGV0dW5lIHZhbHVlIG9mIHRoZSBTb3VuZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2RldHVuZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBNYW5hZ2VyIEdsb2JhbCBEZXR1bmUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEJhc2UgU291bmQgTWFuYWdlciwgb3IgbW9yZSB0eXBpY2FsbHksIGFuIGluc3RhbmNlIG9mIHRoZSBXZWIgQXVkaW8gU291bmQgTWFuYWdlcixcclxuICogb3IgdGhlIEhUTUw1IEF1ZGlvIE1hbmFnZXIuIEl0IGlzIGRpc3BhdGNoZWQgd2hlbiB0aGUgYGRldHVuZWAgcHJvcGVydHkgb2YgdGhlIFNvdW5kIE1hbmFnZXIgaXMgY2hhbmdlZCwgd2hpY2ggZ2xvYmFsbHlcclxuICogYWRqdXN0cyB0aGUgZGV0dW5pbmcgb2YgYWxsIGFjdGl2ZSBzb3VuZHMuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5zb3VuZC5vbigncmF0ZScsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9ERVRVTkVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyfSBzb3VuZE1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgc291bmQgbWFuYWdlciB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGV0dW5lIC0gVGhlIHVwZGF0ZWQgZGV0dW5lIHZhbHVlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnZGV0dW5lJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNvdW5kIE1hbmFnZXIgR2xvYmFsIE11dGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIFNvdW5kIE1hbmFnZXIgd2hlbiBpdHMgYG11dGVgIHByb3BlcnR5IGlzIGNoYW5nZWQsIGVpdGhlciBkaXJlY3RseVxyXG4gKiBvciB2aWEgdGhlIGBzZXRNdXRlYCBtZXRob2QuIFRoaXMgY2hhbmdlcyB0aGUgbXV0ZSBzdGF0ZSBvZiBhbGwgYWN0aXZlIHNvdW5kcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnNvdW5kLm9uKCdtdXRlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjR0xPQkFMX01VVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXJ8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIpfSBzb3VuZE1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgTWFuYWdlciB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG11dGUgLSBUaGUgbXV0ZSB2YWx1ZS4gYHRydWVgIGlmIHRoZSBTb3VuZCBNYW5hZ2VyIGlzIG5vdyBtdXRlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdtdXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNvdW5kIE1hbmFnZXIgR2xvYmFsIFJhdGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEJhc2UgU291bmQgTWFuYWdlciwgb3IgbW9yZSB0eXBpY2FsbHksIGFuIGluc3RhbmNlIG9mIHRoZSBXZWIgQXVkaW8gU291bmQgTWFuYWdlcixcclxuICogb3IgdGhlIEhUTUw1IEF1ZGlvIE1hbmFnZXIuIEl0IGlzIGRpc3BhdGNoZWQgd2hlbiB0aGUgYHJhdGVgIHByb3BlcnR5IG9mIHRoZSBTb3VuZCBNYW5hZ2VyIGlzIGNoYW5nZWQsIHdoaWNoIGdsb2JhbGx5XHJcbiAqIGFkanVzdHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgYWxsIGFjdGl2ZSBzb3VuZHMuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5zb3VuZC5vbigncmF0ZScsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9SQVRFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gc291bmRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNvdW5kIG1hbmFnZXIgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHJhdGUgLSBUaGUgdXBkYXRlZCByYXRlIHZhbHVlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncmF0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBNYW5hZ2VyIEdsb2JhbCBWb2x1bWUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIFNvdW5kIE1hbmFnZXIgd2hlbiBpdHMgYHZvbHVtZWAgcHJvcGVydHkgaXMgY2hhbmdlZCwgZWl0aGVyIGRpcmVjdGx5XHJcbiAqIG9yIHZpYSB0aGUgYHNldFZvbHVtZWAgbWV0aG9kLiBUaGlzIGNoYW5nZXMgdGhlIHZvbHVtZSBvZiBhbGwgYWN0aXZlIHNvdW5kcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnNvdW5kLm9uKCd2b2x1bWUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNHTE9CQUxfVk9MVU1FXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyKX0gc291bmRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNvdW5kIG1hbmFnZXIgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZvbHVtZSAtIFRoZSBuZXcgZ2xvYmFsIHZvbHVtZSBvZiB0aGUgU291bmQgTWFuYWdlci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3ZvbHVtZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBMb29wZWQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYm90aCBXZWIgQXVkaW8gYW5kIEhUTUw1IEF1ZGlvIFNvdW5kIG9iamVjdHMgd2hlbiB0aGV5IGxvb3AgZHVyaW5nIHBsYXliYWNrLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTb3VuZCBpbnN0YW5jZSB1c2luZyBgU291bmQub24oJ2xvb3BlZCcsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ2xvb3BlZCcsIGxpc3RlbmVyKTtcclxuICogbXVzaWMuc2V0TG9vcCh0cnVlKTtcclxuICogbXVzaWMucGxheSgpO1xyXG4gKiBgYGBcclxuICogXHJcbiAqIFRoaXMgaXMgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdGhlIFtMT09QXXtAbGlua2NvZGUgUGhhc2VyLlNvdW5kLkV2ZW50cyNldmVudDpMT09QfSBldmVudCwgd2hpY2ggb25seSBlbWl0cyB3aGVuIHRoZSBsb29wIHN0YXRlIG9mIGEgU291bmQgaXMgY2hhbmdlZC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUEVEXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmR8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCl9IHNvdW5kIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNvdW5kIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdsb29wZWQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU291bmQgTG9vcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZWlyIGxvb3Agc3RhdGUgaXMgY2hhbmdlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdsb29wJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbignbG9vcCcsIGxpc3RlbmVyKTtcclxuICogbXVzaWMuc2V0TG9vcCh0cnVlKTtcclxuICogYGBgXHJcbiAqIFxyXG4gKiBUaGlzIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSBbTE9PUEVEXXtAbGlua2NvZGUgUGhhc2VyLlNvdW5kLkV2ZW50cyNldmVudDpMT09QRUR9IGV2ZW50LCB3aGljaCBlbWl0cyBlYWNoIHRpbWUgYSBTb3VuZCBsb29wcyBkdXJpbmcgcGxheWJhY2suXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI0xPT1BcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZHxQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kKX0gc291bmQgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtib29sZWFufSBsb29wIC0gVGhlIG5ldyBsb29wIHZhbHVlLiBgdHJ1ZWAgaWYgdGhlIFNvdW5kIHdpbGwgbG9vcCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdsb29wJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNvdW5kIE11dGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYm90aCBXZWIgQXVkaW8gYW5kIEhUTUw1IEF1ZGlvIFNvdW5kIG9iamVjdHMgd2hlbiB0aGVpciBtdXRlIHN0YXRlIGNoYW5nZXMuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNvdW5kIGluc3RhbmNlIHVzaW5nIGBTb3VuZC5vbignbXV0ZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ211dGUnLCBsaXN0ZW5lcik7XHJcbiAqIG11c2ljLnBsYXkoKTtcclxuICogbXVzaWMuc2V0TXV0ZSh0cnVlKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI01VVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0geyhQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZHxQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kKX0gc291bmQgLSBBIHJlZmVyZW5jZSB0byB0aGUgU291bmQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtib29sZWFufSBtdXRlIC0gVGhlIG11dGUgdmFsdWUuIGB0cnVlYCBpZiB0aGUgU291bmQgaXMgbm93IG11dGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ211dGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUGF1c2UgQWxsIFNvdW5kcyBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgQmFzZSBTb3VuZCBNYW5hZ2VyLCBvciBtb3JlIHR5cGljYWxseSwgYW4gaW5zdGFuY2Ugb2YgdGhlIFdlYiBBdWRpbyBTb3VuZCBNYW5hZ2VyLFxyXG4gKiBvciB0aGUgSFRNTDUgQXVkaW8gTWFuYWdlci4gSXQgaXMgZGlzcGF0Y2hlZCB3aGVuIHRoZSBgcGF1c2VBbGxgIG1ldGhvZCBpcyBpbnZva2VkIGFuZCBhZnRlciBhbGwgY3VycmVudCBTb3VuZHNcclxuICogaGF2ZSBiZWVuIHBhdXNlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnNvdW5kLm9uKCdwYXVzZWFsbCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI1BBVVNFX0FMTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXJ9IHNvdW5kTWFuYWdlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBzb3VuZCBtYW5hZ2VyIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdwYXVzZWFsbCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHBhdXNlZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdwYXVzZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ3BhdXNlJywgbGlzdGVuZXIpO1xyXG4gKiBtdXNpYy5wbGF5KCk7XHJcbiAqIG11c2ljLnBhdXNlKCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNQQVVTRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncGF1c2UnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU291bmQgUGxheSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHBsYXllZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdwbGF5JywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbigncGxheScsIGxpc3RlbmVyKTtcclxuICogbXVzaWMucGxheSgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjUExBWVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncGxheSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBSYXRlIENoYW5nZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZWlyIHJhdGUgY2hhbmdlcy5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdyYXRlJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbigncmF0ZScsIGxpc3RlbmVyKTtcclxuICogbXVzaWMucGxheSgpO1xyXG4gKiBtdXNpYy5zZXRSYXRlKDAuNSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNSQVRFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmR8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCl9IHNvdW5kIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNvdW5kIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYXRlIC0gVGhlIG5ldyByYXRlIG9mIHRoZSBTb3VuZC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgUmVzdW1lIEFsbCBTb3VuZHMgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEJhc2UgU291bmQgTWFuYWdlciwgb3IgbW9yZSB0eXBpY2FsbHksIGFuIGluc3RhbmNlIG9mIHRoZSBXZWIgQXVkaW8gU291bmQgTWFuYWdlcixcclxuICogb3IgdGhlIEhUTUw1IEF1ZGlvIE1hbmFnZXIuIEl0IGlzIGRpc3BhdGNoZWQgd2hlbiB0aGUgYHJlc3VtZUFsbGAgbWV0aG9kIGlzIGludm9rZWQgYW5kIGFmdGVyIGFsbCBjdXJyZW50IFNvdW5kc1xyXG4gKiBoYXZlIGJlZW4gcmVzdW1lZC5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnNvdW5kLm9uKCdyZXN1bWVhbGwnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlNvdW5kLkV2ZW50cyNSRVNVTUVfQUxMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gc291bmRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNvdW5kIG1hbmFnZXIgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3Jlc3VtZWFsbCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBSZXN1bWUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYm90aCBXZWIgQXVkaW8gYW5kIEhUTUw1IEF1ZGlvIFNvdW5kIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXN1bWVkIGZyb20gYSBwYXVzZWQgc3RhdGUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNvdW5kIGluc3RhbmNlIHVzaW5nIGBTb3VuZC5vbigncmVzdW1lJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbigncmVzdW1lJywgbGlzdGVuZXIpO1xyXG4gKiBtdXNpYy5wbGF5KCk7XHJcbiAqIG11c2ljLnBhdXNlKCk7XHJcbiAqIG11c2ljLnJlc3VtZSgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjUkVTVU1FXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHsoUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmR8UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCl9IHNvdW5kIC0gQSByZWZlcmVuY2UgdG8gdGhlIFNvdW5kIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdyZXN1bWUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU291bmQgU2VlayBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHNlZWtlZCB0byBhIG5ldyBwb3NpdGlvbi5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU291bmQgaW5zdGFuY2UgdXNpbmcgYFNvdW5kLm9uKCdzZWVrJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIG11c2ljID0gdGhpcy5zb3VuZC5hZGQoJ2tleScpO1xyXG4gKiBtdXNpYy5vbignc2VlaycsIGxpc3RlbmVyKTtcclxuICogbXVzaWMucGxheSgpO1xyXG4gKiBtdXNpYy5zZXRTZWVrKDUwMDApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjU0VFS1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGV0dW5lIC0gVGhlIG5ldyBkZXR1bmUgdmFsdWUgb2YgdGhlIFNvdW5kLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnc2Vlayc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTdG9wIEFsbCBTb3VuZHMgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIEJhc2UgU291bmQgTWFuYWdlciwgb3IgbW9yZSB0eXBpY2FsbHksIGFuIGluc3RhbmNlIG9mIHRoZSBXZWIgQXVkaW8gU291bmQgTWFuYWdlcixcclxuICogb3IgdGhlIEhUTUw1IEF1ZGlvIE1hbmFnZXIuIEl0IGlzIGRpc3BhdGNoZWQgd2hlbiB0aGUgYHN0b3BBbGxgIG1ldGhvZCBpcyBpbnZva2VkIGFuZCBhZnRlciBhbGwgY3VycmVudCBTb3VuZHNcclxuICogaGF2ZSBiZWVuIHN0b3BwZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNjZW5lIHVzaW5nOiBgdGhpcy5zb3VuZC5vbignc3RvcGFsbCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI1NUT1BfQUxMXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gc291bmRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNvdW5kIG1hbmFnZXIgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3N0b3BhbGwnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgU291bmQgU3RvcCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHN0b3BwZWQuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFNvdW5kIGluc3RhbmNlIHVzaW5nIGBTb3VuZC5vbignc3RvcCcsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ3N0b3AnLCBsaXN0ZW5lcik7XHJcbiAqIG11c2ljLnBsYXkoKTtcclxuICogbXVzaWMuc3RvcCgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Tb3VuZC5FdmVudHMjU1RPUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnc3RvcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBTb3VuZCBNYW5hZ2VyIFVubG9ja2VkIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBCYXNlIFNvdW5kIE1hbmFnZXIsIG9yIG1vcmUgdHlwaWNhbGx5LCBhbiBpbnN0YW5jZSBvZiB0aGUgV2ViIEF1ZGlvIFNvdW5kIE1hbmFnZXIsXHJcbiAqIG9yIHRoZSBIVE1MNSBBdWRpbyBNYW5hZ2VyLiBJdCBpcyBkaXNwYXRjaGVkIGR1cmluZyB0aGUgdXBkYXRlIGxvb3Agd2hlbiB0aGUgU291bmQgTWFuYWdlciBiZWNvbWVzIHVubG9ja2VkLiBGb3JcclxuICogV2ViIEF1ZGlvIHRoaXMgaXMgb24gdGhlIGZpcnN0IHVzZXIgZ2VzdHVyZSBvbiB0aGUgcGFnZS5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnNvdW5kLm9uKCd1bmxvY2tlZCcsIGxpc3RlbmVyKWAuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI1VOTE9DS0VEXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuU291bmQuQmFzZVNvdW5kTWFuYWdlcn0gc291bmRNYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNvdW5kIG1hbmFnZXIgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3VubG9ja2VkJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFNvdW5kIFZvbHVtZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBib3RoIFdlYiBBdWRpbyBhbmQgSFRNTDUgQXVkaW8gU291bmQgb2JqZWN0cyB3aGVuIHRoZWlyIHZvbHVtZSBjaGFuZ2VzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBTb3VuZCBpbnN0YW5jZSB1c2luZyBgU291bmQub24oJ3ZvbHVtZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtdXNpYyA9IHRoaXMuc291bmQuYWRkKCdrZXknKTtcclxuICogbXVzaWMub24oJ3ZvbHVtZScsIGxpc3RlbmVyKTtcclxuICogbXVzaWMucGxheSgpO1xyXG4gKiBtdXNpYy5zZXRWb2x1bWUoMC41KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuU291bmQuRXZlbnRzI1ZPTFVNRVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQpfSBzb3VuZCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBTb3VuZCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdm9sdW1lIC0gVGhlIG5ldyB2b2x1bWUgb2YgdGhlIFNvdW5kLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndm9sdW1lJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuU291bmQuRXZlbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ09NUExFVEU6IHJlcXVpcmUoJy4vQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIERFQ09ERUQ6IHJlcXVpcmUoJy4vREVDT0RFRF9FVkVOVCcpLFxyXG4gICAgREVDT0RFRF9BTEw6IHJlcXVpcmUoJy4vREVDT0RFRF9BTExfRVZFTlQnKSxcclxuICAgIERFU1RST1k6IHJlcXVpcmUoJy4vREVTVFJPWV9FVkVOVCcpLFxyXG4gICAgREVUVU5FOiByZXF1aXJlKCcuL0RFVFVORV9FVkVOVCcpLFxyXG4gICAgR0xPQkFMX0RFVFVORTogcmVxdWlyZSgnLi9HTE9CQUxfREVUVU5FX0VWRU5UJyksXHJcbiAgICBHTE9CQUxfTVVURTogcmVxdWlyZSgnLi9HTE9CQUxfTVVURV9FVkVOVCcpLFxyXG4gICAgR0xPQkFMX1JBVEU6IHJlcXVpcmUoJy4vR0xPQkFMX1JBVEVfRVZFTlQnKSxcclxuICAgIEdMT0JBTF9WT0xVTUU6IHJlcXVpcmUoJy4vR0xPQkFMX1ZPTFVNRV9FVkVOVCcpLFxyXG4gICAgTE9PUDogcmVxdWlyZSgnLi9MT09QX0VWRU5UJyksXHJcbiAgICBMT09QRUQ6IHJlcXVpcmUoJy4vTE9PUEVEX0VWRU5UJyksXHJcbiAgICBNVVRFOiByZXF1aXJlKCcuL01VVEVfRVZFTlQnKSxcclxuICAgIFBBVVNFX0FMTDogcmVxdWlyZSgnLi9QQVVTRV9BTExfRVZFTlQnKSxcclxuICAgIFBBVVNFOiByZXF1aXJlKCcuL1BBVVNFX0VWRU5UJyksXHJcbiAgICBQTEFZOiByZXF1aXJlKCcuL1BMQVlfRVZFTlQnKSxcclxuICAgIFJBVEU6IHJlcXVpcmUoJy4vUkFURV9FVkVOVCcpLFxyXG4gICAgUkVTVU1FX0FMTDogcmVxdWlyZSgnLi9SRVNVTUVfQUxMX0VWRU5UJyksXHJcbiAgICBSRVNVTUU6IHJlcXVpcmUoJy4vUkVTVU1FX0VWRU5UJyksXHJcbiAgICBTRUVLOiByZXF1aXJlKCcuL1NFRUtfRVZFTlQnKSxcclxuICAgIFNUT1BfQUxMOiByZXF1aXJlKCcuL1NUT1BfQUxMX0VWRU5UJyksXHJcbiAgICBTVE9QOiByZXF1aXJlKCcuL1NUT1BfRVZFTlQnKSxcclxuICAgIFVOTE9DS0VEOiByZXF1aXJlKCcuL1VOTE9DS0VEX0VWRU5UJyksXHJcbiAgICBWT0xVTUU6IHJlcXVpcmUoJy4vVk9MVU1FX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIFBhdmxlIEdvbG9za29rb3ZpYyA8cGdvbG9za29rb3ZpY0BnbWFpbC5jb20+IChodHRwOi8vcHJ1bmVnYW1lcy5jb20pXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZVNvdW5kID0gcmVxdWlyZSgnLi4vQmFzZVNvdW5kJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9DbGFtcCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogSFRNTDUgQXVkaW8gaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvdW5kLlxyXG4gKlxyXG4gKiBAY2xhc3MgSFRNTDVBdWRpb1NvdW5kXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Tb3VuZC5CYXNlU291bmRcclxuICogQG1lbWJlcm9mIFBoYXNlci5Tb3VuZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJ9IG1hbmFnZXIgLSBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc291bmQgbWFuYWdlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZz17fV0gLSBBbiBvcHRpb25hbCBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncy5cclxuICovXHJcbnZhciBIVE1MNUF1ZGlvU291bmQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEJhc2VTb3VuZCxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEhUTUw1QXVkaW9Tb3VuZCAobWFuYWdlciwga2V5LCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIEhUTUw1IEF1ZGlvIHRhZ3MgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciBpbmRpdmlkdWFsXHJcbiAgICAgICAgICogc291bmQncyBwbGF5YmFjay4gTnVtYmVyIG9mIGluc3RhbmNlcyBkZXBlbmRzIG9uIHRoZSBjb25maWcgdmFsdWUgcGFzc2VkXHJcbiAgICAgICAgICogdG8gdGhlIExvYWRlciNhdWRpbyBtZXRob2QgY2FsbCwgZGVmYXVsdCBpcyAxLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCN0YWdzXHJcbiAgICAgICAgICogQHR5cGUge0hUTUxBdWRpb0VsZW1lbnRbXX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGFncyA9IG1hbmFnZXIuZ2FtZS5jYWNoZS5hdWRpby5nZXQoa2V5KTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnRhZ3MpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGF1ZGlvIGFzc2V0IHdpdGgga2V5IFwiJyArIGtleSArICdcIiBpbiB0aGUgYXVkaW8gY2FjaGUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlZmVyZW5jZSB0byBhbiBIVE1MNSBBdWRpbyB0YWcgdXNlZCBmb3IgcGxheWluZyBzb3VuZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjYXVkaW9cclxuICAgICAgICAgKiBAdHlwZSB7SFRNTEF1ZGlvRWxlbWVudH1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1ZGlvID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGltZXN0YW1wIGFzIGdlbmVyYXRlZCBieSB0aGUgUmVxdWVzdCBBbmltYXRpb24gRnJhbWUgb3IgU2V0VGltZW91dFxyXG4gICAgICAgICAqIHJlcHJlc2VudGluZyB0aGUgdGltZSBhdCB3aGljaCB0aGUgZGVsYXllZCBzb3VuZCBwbGF5YmFjayBzaG91bGQgc3RhcnQuXHJcbiAgICAgICAgICogU2V0IHRvIDAgaWYgc291bmQgcGxheWJhY2sgaXMgbm90IGRlbGF5ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3N0YXJ0VGltZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBdWRpbyB0YWcncyBwbGF5YmFjayBwb3NpdGlvbiByZWNvcmRlZCBvbiBwcmV2aW91c1xyXG4gICAgICAgICAqIHVwZGF0ZSBtZXRob2QgY2FsbC4gU2V0IHRvIDAgaWYgc291bmQgaXMgbm90IHBsYXlpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3ByZXZpb3VzVGltZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1RpbWUgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy50YWdzWzBdLmR1cmF0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSB0aGlzLnRhZ3NbMF0uZHVyYXRpb247XHJcblxyXG4gICAgICAgIEJhc2VTb3VuZC5jYWxsKHRoaXMsIG1hbmFnZXIsIGtleSwgY29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGF5IHRoaXMgc291bmQsIG9yIGEgbWFya2VkIHNlY3Rpb24gb2YgaXQuXHJcbiAgICAgKiBJdCBhbHdheXMgcGxheXMgdGhlIHNvdW5kIGZyb20gdGhlIHN0YXJ0LiBJZiB5b3Ugd2FudCB0byBzdGFydCBwbGF5YmFjayBmcm9tIGEgc3BlY2lmaWMgdGltZVxyXG4gICAgICogeW91IGNhbiBzZXQgJ3NlZWsnIHNldHRpbmcgb2YgdGhlIGNvbmZpZyBvYmplY3QsIHByb3ZpZGVkIHRvIHRoaXMgY2FsbCwgdG8gdGhhdCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjcGxheVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjUExBWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZyl9IFttYXJrZXJOYW1lPScnXSAtIElmIHlvdSB3YW50IHRvIHBsYXkgYSBtYXJrZXIgdGhlbiBwcm92aWRlIHRoZSBtYXJrZXIgbmFtZSBoZXJlLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSBTb3VuZENvbmZpZyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZ10gLSBPcHRpb25hbCBzb3VuZCBjb25maWcgb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtYXJrZXIgb3IgZW50aXJlIHNvdW5kIGlmIG5vIG1hcmtlciBuYW1lIGlzIHByb3ZpZGVkLiBJdCBnZXRzIG1lbW9yaXplZCBmb3IgZnV0dXJlIHBsYXlzIG9mIGN1cnJlbnQgc2VjdGlvbiBvZiB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgc3RhcnRlZCBwbGF5aW5nIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgcGxheTogZnVuY3Rpb24gKG1hcmtlck5hbWUsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLmlzTG9ja2VkKHRoaXMsICdwbGF5JywgWyBtYXJrZXJOYW1lLCBjb25maWcgXSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUJhc2VTb3VuZC5wcm90b3R5cGUucGxheS5jYWxsKHRoaXMsIG1hcmtlck5hbWUsIGNvbmZpZykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgXFwvXFwvXFwvIGlzUGxheWluZyA9IHRydWUsIGlzUGF1c2VkID0gZmFsc2UgXFwvXFwvXFwvXHJcbiAgICAgICAgaWYgKCF0aGlzLnBpY2tBbmRQbGF5QXVkaW9UYWcoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuUExBWSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhdXNlcyB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3BhdXNlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNQQVVTRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHBhdXNlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuaXNMb2NrZWQodGhpcywgJ3BhdXNlJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFCYXNlU291bmQucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgXFwvXFwvXFwvIGlzUGxheWluZyA9IGZhbHNlLCBpc1BhdXNlZCA9IHRydWUgXFwvXFwvXFwvXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLnNlZWsgPSB0aGlzLmF1ZGlvLmN1cnJlbnRUaW1lIC0gKHRoaXMuY3VycmVudE1hcmtlciA/IHRoaXMuY3VycmVudE1hcmtlci5zdGFydCA6IDApO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3BBbmRSZWxlYXNlQXVkaW9UYWcoKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QQVVTRSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCNyZXN1bWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1JFU1VNRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCAncmVzdW1lJykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFCYXNlU291bmQucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFxcL1xcL1xcLyBpc1BsYXlpbmcgPSB0cnVlLCBpc1BhdXNlZCA9IGZhbHNlIFxcL1xcL1xcL1xyXG4gICAgICAgIGlmICghdGhpcy5waWNrQW5kUGxheUF1ZGlvVGFnKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlJFU1VNRSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3AgcGxheWluZyB0aGlzIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCNzdG9wXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNTVE9QXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VuZCB3YXMgc3RvcHBlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHN0b3A6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCAnc3RvcCcpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFCYXNlU291bmQucHJvdG90eXBlLnN0b3AuY2FsbCh0aGlzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBcXC9cXC9cXC8gaXNQbGF5aW5nID0gZmFsc2UsIGlzUGF1c2VkID0gZmFsc2UgXFwvXFwvXFwvXHJcbiAgICAgICAgdGhpcy5zdG9wQW5kUmVsZWFzZUF1ZGlvVGFnKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChFdmVudHMuU1RPUCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgaW50ZXJuYWxseSB0byBkbyB3aGF0IHRoZSBuYW1lIHNheXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3BpY2tBbmRQbGF5QXVkaW9UYWdcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VuZCB3YXMgYXNzaWduZWQgYW4gYXVkaW8gdGFnIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqL1xyXG4gICAgcGlja0FuZFBsYXlBdWRpb1RhZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja0F1ZGlvVGFnKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzZWVrID0gdGhpcy5jdXJyZW50Q29uZmlnLnNlZWs7XHJcbiAgICAgICAgdmFyIGRlbGF5ID0gdGhpcy5jdXJyZW50Q29uZmlnLmRlbGF5O1xyXG4gICAgICAgIHZhciBvZmZzZXQgPSAodGhpcy5jdXJyZW50TWFya2VyID8gdGhpcy5jdXJyZW50TWFya2VyLnN0YXJ0IDogMCkgKyBzZWVrO1xyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzVGltZSA9IG9mZnNldDtcclxuICAgICAgICB0aGlzLmF1ZGlvLmN1cnJlbnRUaW1lID0gb2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb25maWcoKTtcclxuXHJcbiAgICAgICAgaWYgKGRlbGF5ID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW8ucGF1c2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlDYXRjaFByb21pc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSArIGRlbGF5ICogMTAwMDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hdWRpby5wYXVzZWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNldENvbmZpZygpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgYXVkaW8gdGFnIHBvb2xpbmcgbG9naWMuIEl0IGZpcnN0IGxvb2tzIGZvclxyXG4gICAgICogdW51c2VkIGF1ZGlvIHRhZyB0byBhc3NpZ24gdG8gdGhpcyBzb3VuZCBvYmplY3QuIElmIHRoZXJlIGFyZSBubyB1bnVzZWRcclxuICAgICAqIGF1ZGlvIHRhZ3MsIGJhc2VkIG9uIEhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjb3ZlcnJpZGUgcHJvcGVydHkgdmFsdWUsIGl0XHJcbiAgICAgKiBsb29rcyBmb3Igc291bmQgd2l0aCBtb3N0IGFkdmFuY2VkIHBsYXliYWNrIGFuZCBoaWphY2tzIGl0cyBhdWRpbyB0YWcgb3JcclxuICAgICAqIGRvZXMgbm90aGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjcGlja0F1ZGlvVGFnXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIGFzc2lnbmVkIGFuIGF1ZGlvIHRhZyBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHBpY2tBdWRpb1RhZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5hdWRpbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhZ3MubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXVkaW8gPSB0aGlzLnRhZ3NbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoYXVkaW8uZGF0YXNldC51c2VkID09PSAnZmFsc2UnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhdWRpby5kYXRhc2V0LnVzZWQgPSAndHJ1ZSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvID0gYXVkaW87XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm1hbmFnZXIub3ZlcnJpZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgb3RoZXJTb3VuZHMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmZvckVhY2hBY3RpdmVTb3VuZChmdW5jdGlvbiAoc291bmQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoc291bmQua2V5ID09PSB0aGlzLmtleSAmJiBzb3VuZC5hdWRpbylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3RoZXJTb3VuZHMucHVzaChzb3VuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0aGlzKTtcclxuXHJcbiAgICAgICAgb3RoZXJTb3VuZHMuc29ydChmdW5jdGlvbiAoYTEsIGEyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGExLmxvb3AgPT09IGEyLmxvb3ApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIHNvcnQgYnkgcHJvZ3Jlc3NcclxuICAgICAgICAgICAgICAgIHJldHVybiAoYTIuc2VlayAvIGEyLmR1cmF0aW9uKSAtIChhMS5zZWVrIC8gYTEuZHVyYXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhMS5sb29wID8gMSA6IC0xO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgc2VsZWN0ZWRTb3VuZCA9IG90aGVyU291bmRzWzBdO1xyXG5cclxuICAgICAgICB0aGlzLmF1ZGlvID0gc2VsZWN0ZWRTb3VuZC5hdWRpbztcclxuXHJcbiAgICAgICAgc2VsZWN0ZWRTb3VuZC5yZXNldCgpO1xyXG4gICAgICAgIHNlbGVjdGVkU291bmQuYXVkaW8gPSBudWxsO1xyXG4gICAgICAgIHNlbGVjdGVkU291bmQuc3RhcnRUaW1lID0gMDtcclxuICAgICAgICBzZWxlY3RlZFNvdW5kLnByZXZpb3VzVGltZSA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGZvciBwbGF5aW5nIGF1ZGlvIHRhZyBhbmQgY2F0Y2hpbmcgcG9zc2libGUgZXhjZXB0aW9uc1xyXG4gICAgICogdGhyb3duIGZyb20gcmVqZWN0ZWQgUHJvbWlzZSByZXR1cm5lZCBmcm9tIHBsYXkgbWV0aG9kIGNhbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3BsYXlDYXRjaFByb21pc2VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcGxheUNhdGNoUHJvbWlzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgcGxheVByb21pc2UgPSB0aGlzLmF1ZGlvLnBsYXkoKTtcclxuXHJcbiAgICAgICAgaWYgKHBsYXlQcm9taXNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICAgICAgICAgIHBsYXlQcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihyZWFzb24pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCBpbnRlcm5hbGx5IHRvIGRvIHdoYXQgdGhlIG5hbWUgc2F5cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc3RvcEFuZFJlbGVhc2VBdWRpb1RhZ1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzdG9wQW5kUmVsZWFzZUF1ZGlvVGFnOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYXVkaW8ucGF1c2UoKTtcclxuICAgICAgICB0aGlzLmF1ZGlvLmRhdGFzZXQudXNlZCA9ICdmYWxzZSc7XHJcbiAgICAgICAgdGhpcy5hdWRpbyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNUaW1lID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IHRvIHJlc2V0IHNvdW5kIHN0YXRlLCB1c3VhbGx5IHdoZW4gc3RvcHBpbmcgc291bmRcclxuICAgICAqIG9yIHdoZW4gaGlqYWNraW5nIGF1ZGlvIHRhZyBmcm9tIGFub3RoZXIgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3Jlc2V0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuc3RvcC5jYWxsKHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgc291bmQgbWFuYWdlciBmb3IgcGF1c2luZyBzb3VuZCBpZlxyXG4gICAgICogUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjcGF1c2VPbkJsdXIgaXMgc2V0IHRvIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNvbkJsdXJcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25CbHVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudENvbmZpZy5zZWVrID0gdGhpcy5hdWRpby5jdXJyZW50VGltZSAtICh0aGlzLmN1cnJlbnRNYXJrZXIgPyB0aGlzLmN1cnJlbnRNYXJrZXIuc3RhcnQgOiAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLmRlbGF5ID0gTWF0aC5tYXgoMCwgKHRoaXMuc3RhcnRUaW1lIC0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpKSAvIDEwMDApO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3BBbmRSZWxlYXNlQXVkaW9UYWcoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGJ5IHNvdW5kIG1hbmFnZXIgZm9yIHJlc3VtaW5nIHNvdW5kIGlmXHJcbiAgICAgKiBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNwYXVzZU9uQmx1ciBpcyBzZXQgdG8gdHJ1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjb25Gb2N1c1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5waWNrQW5kUGxheUF1ZGlvVGFnKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIG1ldGhvZCBjYWxsZWQgYXV0b21hdGljYWxseSBieSBzb3VuZCBtYW5hZ2VyIG9uIGV2ZXJ5IGdhbWUgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjdXBkYXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNDT01QTEVURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUEVEXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBnZW5lcmF0ZWQgYnkgdGhlIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lIG9yIFNldFRpbWVvdXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGEgLSBUaGUgZGVsdGEgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWUsIGRlbHRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1BsYXlpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBoYW5kbGluZyBkZWxheWVkIHBsYXliYWNrXHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRUaW1lID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0VGltZSA8IHRpbWUgLSB0aGlzLm1hbmFnZXIuYXVkaW9QbGF5RGVsYXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW8uY3VycmVudFRpbWUgKz0gTWF0aC5tYXgoMCwgdGltZSAtIHRoaXMuc3RhcnRUaW1lKSAvIDEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzVGltZSA9IHRoaXMuYXVkaW8uY3VycmVudFRpbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlDYXRjaFByb21pc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaGFuZGxlIGxvb3BpbmcgYW5kIGVuZGluZ1xyXG4gICAgICAgIHZhciBzdGFydFRpbWUgPSB0aGlzLmN1cnJlbnRNYXJrZXIgPyB0aGlzLmN1cnJlbnRNYXJrZXIuc3RhcnQgOiAwO1xyXG4gICAgICAgIHZhciBlbmRUaW1lID0gc3RhcnRUaW1lICsgdGhpcy5kdXJhdGlvbjtcclxuICAgICAgICB2YXIgY3VycmVudFRpbWUgPSB0aGlzLmF1ZGlvLmN1cnJlbnRUaW1lO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29uZmlnLmxvb3ApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgPj0gZW5kVGltZSAtIHRoaXMubWFuYWdlci5sb29wRW5kT2Zmc2V0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvLmN1cnJlbnRUaW1lID0gc3RhcnRUaW1lICsgTWF0aC5tYXgoMCwgY3VycmVudFRpbWUgLSBlbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gdGhpcy5hdWRpby5jdXJyZW50VGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50VGltZSA8IHN0YXJ0VGltZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpby5jdXJyZW50VGltZSArPSBzdGFydFRpbWU7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VGltZSA9IHRoaXMuYXVkaW8uY3VycmVudFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSA8IHRoaXMucHJldmlvdXNUaW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkxPT1BFRCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFRpbWUgPj0gZW5kVGltZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcEFuZFJlbGVhc2VBdWRpb1RhZygpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5DT01QTEVURSwgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzVGltZSA9IGN1cnJlbnRUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxzIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjZGVzdHJveSBtZXRob2RcclxuICAgICAqIGFuZCBjbGVhbnMgdXAgYWxsIEhUTUw1IEF1ZGlvIHJlbGF0ZWQgc3R1ZmYuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRhZ3MgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdWRpbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcEFuZFJlbGVhc2VBdWRpb1RhZygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IHRvIGRldGVybWluZSBtdXRlIHNldHRpbmcgb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCN1cGRhdGVNdXRlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZU11dGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvLm11dGVkID0gdGhpcy5jdXJyZW50Q29uZmlnLm11dGUgfHwgdGhpcy5tYW5hZ2VyLm11dGU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgdG8gY2FsY3VsYXRlIHRvdGFsIHZvbHVtZSBvZiB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3VwZGF0ZVZvbHVtZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB1cGRhdGVWb2x1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvLnZvbHVtZSA9IENsYW1wKHRoaXMuY3VycmVudENvbmZpZy52b2x1bWUgKiB0aGlzLm1hbmFnZXIudm9sdW1lLCAwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSB0byBjYWxjdWxhdGUgdG90YWwgcGxheWJhY2sgcmF0ZSBvZiB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI2NhbGN1bGF0ZVJhdGVcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVSYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuY2FsY3VsYXRlUmF0ZS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hdWRpbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW8ucGxheWJhY2tSYXRlID0gdGhpcy50b3RhbFJhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzb3VuZCBpcyBtdXRlZCBvciBub3QuXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIG11dGVkIHN0YXRlIG9mIHRoaXMgc291bmQuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjbXV0ZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTVVURVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG11dGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5tdXRlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLm11dGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbmFnZXIuaXNMb2NrZWQodGhpcywgJ211dGUnLCB2YWx1ZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNdXRlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLk1VVEUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbXV0ZWQgc3RhdGUgb2YgdGhpcyBTb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc2V0TXV0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTVVURVxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBtdXRlIHRoaXMgc291bmQsIGBmYWxzZWAgdG8gdW5tdXRlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmR9IFRoaXMgU291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldE11dGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLm11dGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2b2x1bWUgb2YgdGhpcyBzb3VuZCwgYSB2YWx1ZSBiZXR3ZWVuIDAgKHNpbGVuY2UpIGFuZCAxIChmdWxsIHZvbHVtZSkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjdm9sdW1lXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjVk9MVU1FXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdm9sdW1lOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWcudm9sdW1lO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLnZvbHVtZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCAndm9sdW1lJywgdmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVm9sdW1lKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlZPTFVNRSwgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2b2x1bWUgb2YgdGhpcyBTb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc2V0Vm9sdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNWT0xVTUVcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2b2x1bWUgb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmR9IFRoaXMgU291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFZvbHVtZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudm9sdW1lID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJhdGUgYXQgd2hpY2ggdGhpcyBTb3VuZCB3aWxsIGJlIHBsYXllZC5cclxuICAgICAqIFZhbHVlIG9mIDEuMCBwbGF5cyB0aGUgYXVkaW8gYXQgZnVsbCBzcGVlZCwgMC41IHBsYXlzIHRoZSBhdWRpbyBhdCBoYWxmIHNwZWVkXHJcbiAgICAgKiBhbmQgMi4wIGRvdWJsZXMgdGhlIGF1ZGlvcyBwbGF5YmFjayBzcGVlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3JhdGVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNSQVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmF0ZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnLnJhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcucmF0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCBFdmVudHMuUkFURSwgdmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJhdGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlJBVEUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiB0aGlzIFNvdW5kLlxyXG4gICAgICogXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxLjAgcGxheXMgdGhlIGF1ZGlvIGF0IGZ1bGwgc3BlZWQsIDAuNSBwbGF5cyB0aGUgYXVkaW8gYXQgaGFsZiBzcGVlZFxyXG4gICAgICogYW5kIDIuMCBkb3VibGVzIHRoZSBhdWRpb3MgcGxheWJhY2sgc3BlZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3NldFJhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1JBVEVcclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBwbGF5YmFjayByYXRlIGF0IG9mIHRoaXMgU291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZH0gVGhpcyBTb3VuZC5cclxuICAgICAqL1xyXG4gICAgc2V0UmF0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmF0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGV0dW5lIHZhbHVlIG9mIHRoaXMgU291bmQsIGdpdmVuIGluIFtjZW50c10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2VudF8lMjhtdXNpYyUyOSkuXHJcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgdGhlIHZhbHVlIGlzIC0xMjAwIHRvIDEyMDAsIGJ1dCB3ZSByZWNvbW1lbmQgc2V0dGluZyBpdCB0byBbNTBdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzUwX0NlbnQpLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjZGV0dW5lXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGRlZmF1bHQgMFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjREVUVU5FXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGV0dW5lOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWcuZGV0dW5lO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLmRldHVuZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCBFdmVudHMuREVUVU5FLCB2YWx1ZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuREVUVU5FLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRldHVuZSB2YWx1ZSBvZiB0aGlzIFNvdW5kLCBnaXZlbiBpbiBbY2VudHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRfJTI4bXVzaWMlMjkpLlxyXG4gICAgICogVGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBpcyAtMTIwMCB0byAxMjAwLCBidXQgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQgdG8gWzUwXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS81MF9DZW50KS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc2V0RGV0dW5lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNERVRVTkVcclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSByYW5nZSBvZiB0aGUgdmFsdWUgaXMgLTEyMDAgdG8gMTIwMCwgYnV0IHdlIHJlY29tbWVuZCBzZXR0aW5nIGl0IHRvIFs1MF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvNTBfQ2VudCkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZH0gVGhpcyBTb3VuZC5cclxuICAgICAqL1xyXG4gICAgc2V0RGV0dW5lOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kZXR1bmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGVydHkgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiBwbGF5YmFjayBmb3IgdGhpcyBzb3VuZCwgaW4gc2Vjb25kcy5cclxuICAgICAqIFNldHRpbmcgaXQgdG8gYSBzcGVjaWZpYyB2YWx1ZSBtb3ZlcyBjdXJyZW50IHBsYXliYWNrIHRvIHRoYXQgcG9zaXRpb24uXHJcbiAgICAgKiBUaGUgdmFsdWUgZ2l2ZW4gaXMgY2xhbXBlZCB0byB0aGUgcmFuZ2UgMCB0byBjdXJyZW50IG1hcmtlciBkdXJhdGlvbi5cclxuICAgICAqIFNldHRpbmcgc2VlayBvZiBhIHN0b3BwZWQgc291bmQgaGFzIG5vIGVmZmVjdC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCNzZWVrXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjU0VFS1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNlZWs6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdWRpby5jdXJyZW50VGltZSAtICh0aGlzLmN1cnJlbnRNYXJrZXIgPyB0aGlzLmN1cnJlbnRNYXJrZXIuc3RhcnQgOiAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUGF1c2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnLnNlZWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFuYWdlci5pc0xvY2tlZCh0aGlzLCAnc2VlaycsIHZhbHVlKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZyB8fCB0aGlzLmlzUGF1c2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHZhbHVlKSwgdGhpcy5kdXJhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNUaW1lID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpby5jdXJyZW50VGltZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1BhdXNlZClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcuc2VlayA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuU0VFSywgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZWtzIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhpcyBzb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc2V0U2Vla1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjU0VFS1xyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHBvaW50IGluIHRoZSBzb3VuZCB0byBzZWVrIHRvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmR9IFRoaXMgU291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFNlZWs6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNlZWsgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBzb3VuZCBvciBjdXJyZW50IHNvdW5kIG1hcmtlciB3aWxsIGxvb3AuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjbG9vcFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxvb3A6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5sb29wO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLmxvb3AgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbmFnZXIuaXNMb2NrZWQodGhpcywgJ2xvb3AnLCB2YWx1ZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW8ubG9vcCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkxPT1AsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxvb3Agc3RhdGUgb2YgdGhpcyBTb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQjc2V0TG9vcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBsb29wIHRoaXMgc291bmQsIGBmYWxzZWAgdG8gbm90IGxvb3AgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZH0gVGhpcyBTb3VuZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TG9vcDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubG9vcCA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIVE1MNUF1ZGlvU291bmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIFBhdmxlIEdvbG9za29rb3ZpYyA8cGdvbG9za29rb3ZpY0BnbWFpbC5jb20+IChodHRwOi8vcHJ1bmVnYW1lcy5jb20pXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZVNvdW5kTWFuYWdlciA9IHJlcXVpcmUoJy4uL0Jhc2VTb3VuZE1hbmFnZXInKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgSFRNTDVBdWRpb1NvdW5kID0gcmVxdWlyZSgnLi9IVE1MNUF1ZGlvU291bmQnKTtcclxuXHJcbi8qKlxyXG4gKiBIVE1MNSBBdWRpbyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU291bmQgTWFuYWdlci5cclxuICpcclxuICogVG8gcGxheSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgSFRNTDUgQXVkaW8gc291bmQsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYW4gYGluc3RhbmNlc2AgdmFsdWUgd2hlblxyXG4gKiBsb2FkaW5nIHRoZSBzb3VuZCB3aXRoIHRoZSBMb2FkZXI6XHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy5sb2FkLmF1ZGlvKCdleHBsb3Npb24nLCAnZXhwbG9zaW9uLm1wMycsIHtcclxuICogICAgIGluc3RhbmNlczogMlxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdCBhbGwgYnJvd3NlcnMgY2FuIHBsYXkgYWxsIGF1ZGlvIGZvcm1hdHMuXHJcbiAqXHJcbiAqIFRoZXJlIGlzIGEgZ29vZCBndWlkZSB0byB3aGF0J3Mgc3VwcG9ydGVkOiBbQ3Jvc3MtYnJvd3NlciBhdWRpbyBiYXNpY3M6IEF1ZGlvIGNvZGVjIHN1cHBvcnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL0FwcHMvRnVuZGFtZW50YWxzL0F1ZGlvX2FuZF92aWRlb19kZWxpdmVyeS9Dcm9zcy1icm93c2VyX2F1ZGlvX2Jhc2ljcyNBdWRpb19Db2RlY19TdXBwb3J0KS5cclxuICpcclxuICogQGNsYXNzIEhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJcclxuICogQGV4dGVuZHMgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXJcclxuICogQG1lbWJlcm9mIFBoYXNlci5Tb3VuZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWV9IGdhbWUgLSBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2FtZSBpbnN0YW5jZS5cclxuICovXHJcbnZhciBIVE1MNUF1ZGlvU291bmRNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBCYXNlU291bmRNYW5hZ2VyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gSFRNTDVBdWRpb1NvdW5kTWFuYWdlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBpZiB0aGVyZSBhcmUgbm8gaWRsZSBpbnN0YW5jZXMgb2YgSFRNTDUgQXVkaW8gdGFnLFxyXG4gICAgICAgICAqIGZvciBhbnkgcGFydGljdWxhciBzb3VuZCwgaWYgb25lIG9mIHRoZSB1c2VkIHRhZ3Mgc2hvdWxkIGJlIGhpamFja2VkIGFuZCB1c2VkXHJcbiAgICAgICAgICogZm9yIHN1Y2NlZWRpbmcgcGxheWJhY2sgb3IgaWYgc3VjY2VlZGluZyBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kI3BsYXlcclxuICAgICAgICAgKiBjYWxsIHNob3VsZCBiZSBpZ25vcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjb3ZlcnJpZGVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vdmVycmlkZSA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFZhbHVlIHJlcHJlc2VudGluZyB0aW1lIGRpZmZlcmVuY2UsIGluIHNlY29uZHMsIGJldHdlZW4gY2FsbGluZ1xyXG4gICAgICAgICAqIHBsYXkgbWV0aG9kIG9uIGFuIGF1ZGlvIHRhZyBhbmQgd2hlbiBpdCBhY3R1YWxseSBzdGFydHMgcGxheWluZy5cclxuICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIGFjaGlldmUgbW9yZSBhY2N1cmF0ZSBkZWxheWVkIHNvdW5kIHBsYXliYWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogWW91IG1pZ2h0IG5lZWQgdG8gdHdlYWsgdGhpcyB2YWx1ZSB0byBnZXQgdGhlIGRlc2lyZWQgcmVzdWx0c1xyXG4gICAgICAgICAqIHNpbmNlIGF1ZGlvIHBsYXkgZGVsYXkgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgYnJvd3Nlci9wbGF0Zm9ybS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyI2F1ZGlvUGxheURlbGF5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwLjFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmF1ZGlvUGxheURlbGF5ID0gMC4xO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHZhbHVlIGJ5IHdoaWNoIHdlIHNob3VsZCBvZmZzZXQgdGhlIGxvb3AgZW5kIG1hcmtlciBvZiB0aGVcclxuICAgICAgICAgKiBsb29waW5nIHNvdW5kIHRvIGNvbXBlbnNhdGUgZm9yIGxhZywgY2F1c2VkIGJ5IGNoYW5naW5nIGF1ZGlvXHJcbiAgICAgICAgICogdGFnIHBsYXliYWNrIHBvc2l0aW9uLCBpbiBvcmRlciB0byBhY2hpZXZlIGdhcGxlc3MgbG9vcGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFlvdSBtaWdodCBuZWVkIHRvIHR3ZWFrIHRoaXMgdmFsdWUgdG8gZ2V0IHRoZSBkZXNpcmVkIHJlc3VsdHNcclxuICAgICAgICAgKiBzaW5jZSBsb29wIGxhZyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyL3BsYXRmb3JtLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjbG9vcEVuZE9mZnNldFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMC4wNVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubG9vcEVuZE9mZnNldCA9IDAuMDU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGZvciBrZWVwaW5nIHRyYWNrIG9mIGFsbCB0aGUgc291bmRzXHJcbiAgICAgICAgICogdGhhdCB3ZXJlIHBhdXNlZCB3aGVuIGdhbWUgbG9zdCBmb2N1cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyI29uQmx1clBhdXNlZFNvdW5kc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kW119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub25CbHVyUGF1c2VkU291bmRzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMubG9ja2VkID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHF1ZXVlIG9mIGFsbCBhY3Rpb25zIHBlcmZvcm1lZCBvbiBzb3VuZCBvYmplY3RzIHdoaWxlIGF1ZGlvIHdhcyBsb2NrZWQuXHJcbiAgICAgICAgICogT25jZSB0aGUgYXVkaW8gZ2V0cyB1bmxvY2tlZCwgYWZ0ZXIgYW4gZXhwbGljaXQgdXNlciBpbnRlcmFjdGlvbixcclxuICAgICAgICAgKiBhbGwgYWN0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLlxyXG4gICAgICAgICAqIEFycmF5IG9mIG9iamVjdCB0eXBlczogeyBzb3VuZDogUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZCwgbmFtZTogc3RyaW5nLCB2YWx1ZT86ICogfVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjbG9ja2VkQWN0aW9uc1F1ZXVlXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb2NrZWRBY3Rpb25zUXVldWUgPSB0aGlzLmxvY2tlZCA/IFtdIDogbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJvcGVydHkgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgdmFsdWUgb2YgZ2xvYmFsIG11dGVcclxuICAgICAgICAgKiBmb3IgSFRNTDUgQXVkaW8gc291bmQgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyI19tdXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX211dGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUHJvcGVydHkgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgdmFsdWUgb2YgZ2xvYmFsIHZvbHVtZVxyXG4gICAgICAgICAqIGZvciBIVE1MNSBBdWRpbyBzb3VuZCBtYW5hZ2VyIGltcGxlbWVudGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjX3ZvbHVtZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3ZvbHVtZSA9IDE7XHJcblxyXG4gICAgICAgIEJhc2VTb3VuZE1hbmFnZXIuY2FsbCh0aGlzLCBnYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IHNvdW5kIGludG8gdGhlIHNvdW5kIG1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBc3NldCBrZXkgZm9yIHRoZSBzb3VuZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kQ29uZmlnfSBbY29uZmlnXSAtIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IHNvdW5kIHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmR9IFRoZSBuZXcgc291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKGtleSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBzb3VuZCA9IG5ldyBIVE1MNUF1ZGlvU291bmQodGhpcywga2V5LCBjb25maWcpO1xyXG5cclxuICAgICAgICB0aGlzLnNvdW5kcy5wdXNoKHNvdW5kKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNvdW5kO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVubG9ja3MgSFRNTDUgQXVkaW8gbG9hZGluZyBhbmQgcGxheWJhY2sgb24gbW9iaWxlXHJcbiAgICAgKiBkZXZpY2VzIG9uIHRoZSBpbml0aWFsIGV4cGxpY2l0IHVzZXIgaW50ZXJhY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciN1bmxvY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB1bmxvY2s6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lLmNhY2hlLmF1ZGlvLmVudHJpZXMuZWFjaChmdW5jdGlvbiAoa2V5LCB0YWdzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFnc1tpXS5kYXRhc2V0LmxvY2tlZCA9PT0gJ3RydWUnKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmxvY2tlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5sb2NrZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbW92ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIGRldGVjdE1vdmUgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciB1bmxvY2sgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKG1vdmVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBtb3ZlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGRldGVjdE1vdmUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBsb2NrZWRUYWdzID0gW107XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5nYW1lLmNhY2hlLmF1ZGlvLmVudHJpZXMuZWFjaChmdW5jdGlvbiAoa2V5LCB0YWdzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IHRhZ3NbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcuZGF0YXNldC5sb2NrZWQgPT09ICd0cnVlJylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZFRhZ3MucHVzaCh0YWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9ja2VkVGFncy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGxhc3RUYWcgPSBsb2NrZWRUYWdzW2xvY2tlZFRhZ3MubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICBsYXN0VGFnLm9uY2FucGxheXRocm91Z2ggPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYXN0VGFnLm9uY2FucGxheXRocm91Z2ggPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvY2tlZFRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhZy5kYXRhc2V0LmxvY2tlZCA9ICdmYWxzZSc7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy51bmxvY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBsb2NrZWRUYWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFnLmxvYWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5vbmNlKEV2ZW50cy5VTkxPQ0tFRCwgZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaEFjdGl2ZVNvdW5kKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kLmN1cnJlbnRNYXJrZXIgPT09IG51bGwgJiYgc291bmQuZHVyYXRpb24gPT09IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc291bmQuZHVyYXRpb24gPSBzb3VuZC50YWdzWzBdLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHNvdW5kLnRvdGFsRHVyYXRpb24gPSBzb3VuZC50YWdzWzBdLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmxvY2tlZEFjdGlvbnNRdWV1ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBsb2NrZWRBY3Rpb24gPSB0aGlzLmxvY2tlZEFjdGlvbnNRdWV1ZS5zaGlmdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsb2NrZWRBY3Rpb24uc291bmRbbG9ja2VkQWN0aW9uLnByb3BdLmFwcGx5KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2tlZEFjdGlvbi5zb3VuZFtsb2NrZWRBY3Rpb24ucHJvcF0uYXBwbHkobG9ja2VkQWN0aW9uLnNvdW5kLCBsb2NrZWRBY3Rpb24udmFsdWUgfHwgW10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2tlZEFjdGlvbi5zb3VuZFtsb2NrZWRBY3Rpb24ucHJvcF0gPSBsb2NrZWRBY3Rpb24udmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSwgdGhpcyk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZGV0ZWN0TW92ZSwgZmFsc2UpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGZvciBwYXVzaW5nIHNvdW5kIG1hbmFnZXIgaWZcclxuICAgICAqIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyI3BhdXNlT25CbHVyIGlzIHNldCB0byB0cnVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjb25CbHVyXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25CbHVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZm9yRWFjaEFjdGl2ZVNvdW5kKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChzb3VuZC5pc1BsYXlpbmcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25CbHVyUGF1c2VkU291bmRzLnB1c2goc291bmQpO1xyXG4gICAgICAgICAgICAgICAgc291bmQub25CbHVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGZvciByZXN1bWluZyBzb3VuZCBtYW5hZ2VyIGlmXHJcbiAgICAgKiBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNwYXVzZU9uQmx1ciBpcyBzZXQgdG8gdHJ1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmRNYW5hZ2VyI29uRm9jdXNcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBvbkZvY3VzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub25CbHVyUGF1c2VkU291bmRzLmZvckVhY2goZnVuY3Rpb24gKHNvdW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc291bmQub25Gb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9uQmx1clBhdXNlZFNvdW5kcy5sZW5ndGggPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxzIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyI2Rlc3Ryb3kgbWV0aG9kXHJcbiAgICAgKiBhbmQgY2xlYW5zIHVwIGFsbCBIVE1MNSBBdWRpbyByZWxhdGVkIHN0dWZmLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgQmFzZVNvdW5kTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm9uQmx1clBhdXNlZFNvdW5kcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMub25CbHVyUGF1c2VkU291bmRzID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGJ5IFBoYXNlci5Tb3VuZC5IVE1MNUF1ZGlvU291bmQgY2xhc3MgbWV0aG9kcyBhbmQgcHJvcGVydHkgc2V0dGVyc1xyXG4gICAgICogdG8gY2hlY2sgaWYgc291bmQgbWFuYWdlciBpcyBsb2NrZWQgYW5kIHRoZW4gZWl0aGVyIHBlcmZvcm0gYWN0aW9uIGltbWVkaWF0ZWx5IG9yIHF1ZXVlIGl0XHJcbiAgICAgKiB0byBiZSBwZXJmb3JtZWQgb25jZSB0aGUgc291bmQgbWFuYWdlciBnZXRzIHVubG9ja2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXIjaXNMb2NrZWRcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZH0gc291bmQgLSBTb3VuZCBvYmplY3Qgb24gd2hpY2ggdG8gcGVyZm9ybSBxdWV1ZWQgYWN0aW9uLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgLSBOYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIG9yIHByb3BlcnR5IHRvIGJlIGFzc2lnbmVkIGEgdmFsdWUgdG8uXHJcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZV0gLSBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBlaXRoZXIgaG9sZHMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kIGNhbGwgb3IgdmFsdWUgdG8gYmUgc2V0IHRvIHRoZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VuZCBtYW5hZ2VyIGlzIGxvY2tlZC5cclxuICAgICAqL1xyXG4gICAgaXNMb2NrZWQ6IGZ1bmN0aW9uIChzb3VuZCwgcHJvcCwgdmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNvdW5kLnRhZ3NbMF0uZGF0YXNldC5sb2NrZWQgPT09ICd0cnVlJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9ja2VkQWN0aW9uc1F1ZXVlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgc291bmQ6IHNvdW5kLFxyXG4gICAgICAgICAgICAgICAgcHJvcDogcHJvcCxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG11dGVkIHN0YXRlIG9mIGFsbCB0aGlzIFNvdW5kIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNzZXRNdXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNHTE9CQUxfTVVURVxyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBtdXRlIGFsbCBzb3VuZHMsIGBmYWxzZWAgdG8gdW5tdXRlIHRoZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLkhUTUw1QXVkaW9Tb3VuZE1hbmFnZXJ9IFRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0TXV0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubXV0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNtdXRlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9NVVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgbXV0ZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbXV0ZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX211dGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaEFjdGl2ZVNvdW5kKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291bmQudXBkYXRlTXV0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuR0xPQkFMX01VVEUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZvbHVtZSBvZiB0aGlzIFNvdW5kIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciNzZXRWb2x1bWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9WT0xVTUVcclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBnbG9iYWwgdm9sdW1lIG9mIHRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlcn0gVGhpcyBTb3VuZCBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBzZXRWb2x1bWU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnZvbHVtZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuSFRNTDVBdWRpb1NvdW5kTWFuYWdlciN2b2x1bWVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNHTE9CQUxfVk9MVU1FXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdm9sdW1lOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92b2x1bWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl92b2x1bWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaEFjdGl2ZVNvdW5kKGZ1bmN0aW9uIChzb3VuZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291bmQudXBkYXRlVm9sdW1lKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HTE9CQUxfVk9MVU1FLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIVE1MNUF1ZGlvU291bmRNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBQYXZsZSBHb2xvc2tva292aWMgPHBnb2xvc2tva292aWNAZ21haWwuY29tPiAoaHR0cDovL3BydW5lZ2FtZXMuY29tKVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlNvdW5kXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgU291bmRNYW5hZ2VyQ3JlYXRvcjogcmVxdWlyZSgnLi9Tb3VuZE1hbmFnZXJDcmVhdG9yJyksXHJcblxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpLFxyXG5cclxuICAgIEJhc2VTb3VuZDogcmVxdWlyZSgnLi9CYXNlU291bmQnKSxcclxuICAgIEJhc2VTb3VuZE1hbmFnZXI6IHJlcXVpcmUoJy4vQmFzZVNvdW5kTWFuYWdlcicpLFxyXG5cclxuICAgIFdlYkF1ZGlvU291bmQ6IHJlcXVpcmUoJy4vd2ViYXVkaW8vV2ViQXVkaW9Tb3VuZCcpLFxyXG4gICAgV2ViQXVkaW9Tb3VuZE1hbmFnZXI6IHJlcXVpcmUoJy4vd2ViYXVkaW8vV2ViQXVkaW9Tb3VuZE1hbmFnZXInKSxcclxuXHJcbiAgICBIVE1MNUF1ZGlvU291bmQ6IHJlcXVpcmUoJy4vaHRtbDUvSFRNTDVBdWRpb1NvdW5kJyksXHJcbiAgICBIVE1MNUF1ZGlvU291bmRNYW5hZ2VyOiByZXF1aXJlKCcuL2h0bWw1L0hUTUw1QXVkaW9Tb3VuZE1hbmFnZXInKSxcclxuXHJcbiAgICBOb0F1ZGlvU291bmQ6IHJlcXVpcmUoJy4vbm9hdWRpby9Ob0F1ZGlvU291bmQnKSxcclxuICAgIE5vQXVkaW9Tb3VuZE1hbmFnZXI6IHJlcXVpcmUoJy4vbm9hdWRpby9Ob0F1ZGlvU291bmRNYW5hZ2VyJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIFBhdmxlIEdvbG9za29rb3ZpYyA8cGdvbG9za29rb3ZpY0BnbWFpbC5jb20+IChodHRwOi8vcHJ1bmVnYW1lcy5jb20pXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZVNvdW5kID0gcmVxdWlyZSgnLi4vQmFzZVNvdW5kJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFeHRlbmQgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvRXh0ZW5kJyk7XHJcblxyXG52YXIgcmV0dXJuRmFsc2UgPSBmdW5jdGlvbiAoKVxyXG57XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG52YXIgcmV0dXJuTnVsbCA9IGZ1bmN0aW9uICgpXHJcbntcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKVxyXG57XHJcbiAgICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIE5vIGF1ZGlvIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb3VuZC4gSXQgaXMgdXNlZCBpZiBhdWRpbyBoYXMgYmVlblxyXG4gKiBkaXNhYmxlZCBpbiB0aGUgZ2FtZSBjb25maWcgb3IgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IGF1ZGlvLlxyXG4gKlxyXG4gKiBJdCByZXByZXNlbnRzIGEgZ3JhY2VmdWwgZGVncmFkYXRpb24gb2Ygc291bmQgbG9naWMgdGhhdCBwcm92aWRlc1xyXG4gKiBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgYW5kIHByZXZlbnRzIFBoYXNlciBwcm9qZWN0cyB0aGF0IHVzZSBhdWRpbyBmcm9tXHJcbiAqIGJyZWFraW5nIG9uIGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IGFueSBhdWRpbyBwbGF5YmFjayB0ZWNobm9sb2dpZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBOb0F1ZGlvU291bmRcclxuICogQG1lbWJlcm9mIFBoYXNlci5Tb3VuZFxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNvdW5kLk5vQXVkaW9Tb3VuZE1hbmFnZXJ9IG1hbmFnZXIgLSBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc291bmQgbWFuYWdlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZz17fV0gLSBBbiBvcHRpb25hbCBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncy5cclxuICovXHJcbnZhciBOb0F1ZGlvU291bmQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIE5vQXVkaW9Tb3VuZCAobWFuYWdlciwga2V5LCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG90YWxSYXRlID0gMTtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IEV4dGVuZCh7XHJcbiAgICAgICAgICAgIG11dGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB2b2x1bWU6IDEsXHJcbiAgICAgICAgICAgIHJhdGU6IDEsXHJcbiAgICAgICAgICAgIGRldHVuZTogMCxcclxuICAgICAgICAgICAgc2VlazogMCxcclxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXHJcbiAgICAgICAgICAgIGRlbGF5OiAwXHJcbiAgICAgICAgfSwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgdGhpcy5tdXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy52b2x1bWUgPSAxO1xyXG4gICAgICAgIHRoaXMucmF0ZSA9IDE7XHJcbiAgICAgICAgdGhpcy5kZXR1bmUgPSAwO1xyXG4gICAgICAgIHRoaXMuc2VlayA9IDA7XHJcbiAgICAgICAgdGhpcy5sb29wID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TWFya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBlbmRpbmdSZW1vdmUgPSBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmQjYWRkTWFya2VyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZE1hcmtlcn0gbWFya2VyIC0gTWFya2VyIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBmYWxzZVxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIGFkZE1hcmtlcjogcmV0dXJuRmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmQjdXBkYXRlTWFya2VyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZE1hcmtlcn0gbWFya2VyIC0gTWFya2VyIG9iamVjdCB3aXRoIHVwZGF0ZWQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgdXBkYXRlTWFya2VyOiByZXR1cm5GYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLk5vQXVkaW9Tb3VuZCNyZW1vdmVNYXJrZXJcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG1hcmtlciB0byByZW1vdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVsbH0gbnVsbFxyXG4gICAgICovXHJcbiAgICByZW1vdmVNYXJrZXI6IHJldHVybk51bGwsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmQjcGxheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFBoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZyl9IFttYXJrZXJOYW1lPScnXSAtIElmIHlvdSB3YW50IHRvIHBsYXkgYSBtYXJrZXIgdGhlbiBwcm92aWRlIHRoZSBtYXJrZXIgbmFtZSBoZXJlLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHBhcmFtZXRlciBjYW4gYmUgYSBTb3VuZENvbmZpZyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZ10gLSBPcHRpb25hbCBzb3VuZCBjb25maWcgb2JqZWN0IHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtYXJrZXIgb3IgZW50aXJlIHNvdW5kIGlmIG5vIG1hcmtlciBuYW1lIGlzIHByb3ZpZGVkLiBJdCBnZXRzIG1lbW9yaXplZCBmb3IgZnV0dXJlIHBsYXlzIG9mIGN1cnJlbnQgc2VjdGlvbiBvZiB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2VcclxuICAgICAqL1xyXG4gICAgcGxheTogcmV0dXJuRmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmQjcGF1c2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiByZXR1cm5GYWxzZSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLk5vQXVkaW9Tb3VuZCNyZXN1bWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZTogcmV0dXJuRmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wIHBsYXlpbmcgdGhpcyBzb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5Ob0F1ZGlvU291bmQjc3RvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gZmFsc2VcclxuICAgICAqL1xyXG4gICAgc3RvcDogcmV0dXJuRmFsc2UsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIHNvdW5kIGFuZCBhbGwgYXNzb2NpYXRlZCBldmVudHMgYW5kIG1hcmtzIGl0IGZvciByZW1vdmFsIGZyb20gdGhlIHNvdW5kIG1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuTm9BdWRpb1NvdW5kI2Rlc3Ryb3lcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0RFU1RST1lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRNdXRlOiByZXR1cm5UaGlzLFxyXG5cclxuICAgIHNldFZvbHVtZTogcmV0dXJuVGhpcyxcclxuXHJcbiAgICBzZXRSYXRlOiByZXR1cm5UaGlzLFxyXG5cclxuICAgIHNldERldHVuZTogcmV0dXJuVGhpcyxcclxuXHJcbiAgICBzZXRTZWVrOiByZXR1cm5UaGlzLFxyXG5cclxuICAgIHNldExvb3A6IHJldHVyblRoaXNcclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBOb0F1ZGlvU291bmQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAYXV0aG9yICAgICAgIFBhdmxlIEdvbG9za29rb3ZpYyA8cGdvbG9za29rb3ZpY0BnbWFpbC5jb20+IChodHRwOi8vcHJ1bmVnYW1lcy5jb20pXHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQmFzZVNvdW5kTWFuYWdlciA9IHJlcXVpcmUoJy4uL0Jhc2VTb3VuZE1hbmFnZXInKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIE5vQXVkaW9Tb3VuZCA9IHJlcXVpcmUoJy4vTm9BdWRpb1NvdW5kJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvTk9PUCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogTm8tYXVkaW8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNvdW5kIE1hbmFnZXIuIEl0IGlzIHVzZWQgaWYgYXVkaW8gaGFzIGJlZW5cclxuICogZGlzYWJsZWQgaW4gdGhlIGdhbWUgY29uZmlnIG9yIHRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGFueSBhdWRpby5cclxuICpcclxuICogSXQgcmVwcmVzZW50cyBhIGdyYWNlZnVsIGRlZ3JhZGF0aW9uIG9mIFNvdW5kIE1hbmFnZXIgbG9naWMgdGhhdCBwcm92aWRlc1xyXG4gKiBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgYW5kIHByZXZlbnRzIFBoYXNlciBwcm9qZWN0cyB0aGF0IHVzZSBhdWRpbyBmcm9tXHJcbiAqIGJyZWFraW5nIG9uIGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IGFueSBhdWRpbyBwbGF5YmFjayB0ZWNobm9sb2dpZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBOb0F1ZGlvU291bmRNYW5hZ2VyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU291bmRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAqL1xyXG52YXIgTm9BdWRpb1NvdW5kTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTm9BdWRpb1NvdW5kTWFuYWdlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gZ2FtZTtcclxuICAgICAgICB0aGlzLnNvdW5kcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubXV0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudm9sdW1lID0gMTtcclxuICAgICAgICB0aGlzLnJhdGUgPSAxO1xyXG4gICAgICAgIHRoaXMuZGV0dW5lID0gMDtcclxuICAgICAgICB0aGlzLnBhdXNlT25CbHVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgc291bmQgPSBuZXcgTm9BdWRpb1NvdW5kKHRoaXMsIGtleSwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb3VuZHMucHVzaChzb3VuZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzb3VuZDtcclxuICAgIH0sXHJcblxyXG4gICAgYWRkQXVkaW9TcHJpdGU6IGZ1bmN0aW9uIChrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgc291bmQgPSB0aGlzLmFkZChrZXksIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHNvdW5kLnNwcml0ZW1hcCA9IHt9O1xyXG5cclxuICAgICAgICByZXR1cm4gc291bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcGxheTogZnVuY3Rpb24gKGtleSwgZXh0cmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHBsYXlBdWRpb1Nwcml0ZTogZnVuY3Rpb24gKGtleSwgc3ByaXRlTmFtZSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoc291bmQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEJhc2VTb3VuZE1hbmFnZXIucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMsIHNvdW5kKTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVtb3ZlQnlLZXk6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEJhc2VTb3VuZE1hbmFnZXIucHJvdG90eXBlLnJlbW92ZUJ5S2V5LmNhbGwodGhpcywga2V5KTtcclxuICAgIH0sXHJcblxyXG4gICAgcGF1c2VBbGw6IE5PT1AsXHJcbiAgICByZXN1bWVBbGw6IE5PT1AsXHJcbiAgICBzdG9wQWxsOiBOT09QLFxyXG4gICAgdXBkYXRlOiBOT09QLFxyXG4gICAgc2V0UmF0ZTogTk9PUCxcclxuICAgIHNldERldHVuZTogTk9PUCxcclxuICAgIHNldE11dGU6IE5PT1AsXHJcbiAgICBzZXRWb2x1bWU6IE5PT1AsXHJcblxyXG4gICAgZm9yRWFjaEFjdGl2ZVNvdW5kOiBmdW5jdGlvbiAoY2FsbGJhY2tmbiwgc2NvcGUpXHJcbiAgICB7XHJcbiAgICAgICAgQmFzZVNvdW5kTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaEFjdGl2ZVNvdW5kLmNhbGwodGhpcywgY2FsbGJhY2tmbiwgc2NvcGUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZE1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBOb0F1ZGlvU291bmRNYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGF1dGhvciAgICAgICBQYXZsZSBHb2xvc2tva292aWMgPHBnb2xvc2tva292aWNAZ21haWwuY29tPiAoaHR0cDovL3BydW5lZ2FtZXMuY29tKVxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEJhc2VTb3VuZCA9IHJlcXVpcmUoJy4uL0Jhc2VTb3VuZCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi4vZXZlbnRzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBXZWIgQXVkaW8gQVBJIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb3VuZC5cclxuICpcclxuICogQGNsYXNzIFdlYkF1ZGlvU291bmRcclxuICogQGV4dGVuZHMgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlNvdW5kXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXJ9IG1hbmFnZXIgLSBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc291bmQgbWFuYWdlciBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEFzc2V0IGtleSBmb3IgdGhlIHNvdW5kLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Tb3VuZC5Tb3VuZENvbmZpZ30gW2NvbmZpZz17fV0gLSBBbiBvcHRpb25hbCBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzb3VuZCBzZXR0aW5ncy5cclxuICovXHJcbnZhciBXZWJBdWRpb1NvdW5kID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBCYXNlU291bmQsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBXZWJBdWRpb1NvdW5kIChtYW5hZ2VyLCBrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXVkaW8gYnVmZmVyIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIG9mIHRoZSBhdWRpbyBhc3NldCB0byBiZSBwbGF5ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNhdWRpb0J1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb0J1ZmZlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYXVkaW9CdWZmZXIgPSBtYW5hZ2VyLmdhbWUuY2FjaGUuYXVkaW8uZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hdWRpb0J1ZmZlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gYXVkaW8gYXNzZXQgd2l0aCBrZXkgXCInICsga2V5ICsgJ1wiIGluIHRoZSBhdWRpbyBjYWNoZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gYW4gYXVkaW8gc291cmNlIG5vZGUgdXNlZCBmb3IgcGxheWluZyBiYWNrIGF1ZGlvIGZyb21cclxuICAgICAgICAgKiBhdWRpbyBkYXRhIHN0b3JlZCBpbiBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNhdWRpb0J1ZmZlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3NvdXJjZVxyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb0J1ZmZlclNvdXJjZU5vZGV9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byBhIHNlY29uZCBhdWRpbyBzb3VyY2UgdXNlZCBmb3IgZ2FwbGVzcyBsb29wZWQgcGxheWJhY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNsb29wU291cmNlXHJcbiAgICAgICAgICogQHR5cGUge0F1ZGlvQnVmZmVyU291cmNlTm9kZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3BTb3VyY2UgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHYWluIG5vZGUgcmVzcG9uc2libGUgZm9yIGNvbnRyb2xsaW5nIHRoaXMgc291bmQncyBtdXRpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNtdXRlTm9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtHYWluTm9kZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubXV0ZU5vZGUgPSBtYW5hZ2VyLmNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHYWluIG5vZGUgcmVzcG9uc2libGUgZm9yIGNvbnRyb2xsaW5nIHRoaXMgc291bmQncyB2b2x1bWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCN2b2x1bWVOb2RlXHJcbiAgICAgICAgICogQHR5cGUge0dhaW5Ob2RlfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52b2x1bWVOb2RlID0gbWFuYWdlci5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNvdW5kIHNob3VsZCBoYXZlIHN0YXJ0ZWQgcGxheWJhY2sgZnJvbSB0aGUgYmVnaW5uaW5nLlxyXG4gICAgICAgICAqIEJhc2VkIG9uIEJhc2VBdWRpb0NvbnRleHQuY3VycmVudFRpbWUgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNwbGF5VGltZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wbGF5VGltZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzb3VuZCBzb3VyY2Ugc2hvdWxkIGhhdmUgYWN0dWFsbHkgc3RhcnRlZCBwbGF5YmFjay5cclxuICAgICAgICAgKiBCYXNlZCBvbiBCYXNlQXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc3RhcnRUaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzb3VuZCBsb29wIHNvdXJjZSBzaG91bGQgYWN0dWFsbHkgc3RhcnQgcGxheWJhY2suXHJcbiAgICAgICAgICogQmFzZWQgb24gQmFzZUF1ZGlvQ29udGV4dC5jdXJyZW50VGltZSB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI2xvb3BUaW1lXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3BUaW1lID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgd2hlcmUgd2Uga2VlcCB0cmFjayBvZiBhbGwgcmF0ZSB1cGRhdGVzIGR1cmluZyBwbGF5YmFjay5cclxuICAgICAgICAgKiBBcnJheSBvZiBvYmplY3QgdHlwZXM6IHsgdGltZTogbnVtYmVyLCByYXRlOiBudW1iZXIgfVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjcmF0ZVVwZGF0ZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmF0ZVVwZGF0ZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVXNlZCBmb3Iga2VlcGluZyB0cmFjayB3aGVuIHNvdW5kIHNvdXJjZSBwbGF5YmFjayBoYXMgZW5kZWRcclxuICAgICAgICAgKiBzbyBpdHMgc3RhdGUgY2FuIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNoYXNFbmRlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhhc0VuZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVzZWQgZm9yIGtlZXBpbmcgdHJhY2sgd2hlbiBzb3VuZCBzb3VyY2UgaGFzIGxvb3BlZFxyXG4gICAgICAgICAqIHNvIGl0cyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI2hhc0xvb3BlZFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhhc0xvb3BlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLm11dGVOb2RlLmNvbm5lY3QodGhpcy52b2x1bWVOb2RlKTtcclxuXHJcbiAgICAgICAgdGhpcy52b2x1bWVOb2RlLmNvbm5lY3QobWFuYWdlci5kZXN0aW5hdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLmF1ZGlvQnVmZmVyLmR1cmF0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSB0aGlzLmF1ZGlvQnVmZmVyLmR1cmF0aW9uO1xyXG5cclxuICAgICAgICBCYXNlU291bmQuY2FsbCh0aGlzLCBtYW5hZ2VyLCBrZXksIGNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGxheSB0aGlzIHNvdW5kLCBvciBhIG1hcmtlZCBzZWN0aW9uIG9mIGl0LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCBhbHdheXMgcGxheXMgdGhlIHNvdW5kIGZyb20gdGhlIHN0YXJ0LiBJZiB5b3Ugd2FudCB0byBzdGFydCBwbGF5YmFjayBmcm9tIGEgc3BlY2lmaWMgdGltZVxyXG4gICAgICogeW91IGNhbiBzZXQgJ3NlZWsnIHNldHRpbmcgb2YgdGhlIGNvbmZpZyBvYmplY3QsIHByb3ZpZGVkIHRvIHRoaXMgY2FsbCwgdG8gdGhhdCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3BsYXlcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1BMQVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWcpfSBbbWFya2VyTmFtZT0nJ10gLSBJZiB5b3Ugd2FudCB0byBwbGF5IGEgbWFya2VyIHRoZW4gcHJvdmlkZSB0aGUgbWFya2VyIG5hbWUgaGVyZS4gQWx0ZXJuYXRpdmVseSwgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgU291bmRDb25maWcgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuU291bmQuU291bmRDb25maWd9IFtjb25maWddIC0gT3B0aW9uYWwgc291bmQgY29uZmlnIG9iamVjdCB0byBiZSBhcHBsaWVkIHRvIHRoaXMgbWFya2VyIG9yIGVudGlyZSBzb3VuZCBpZiBubyBtYXJrZXIgbmFtZSBpcyBwcm92aWRlZC4gSXQgZ2V0cyBtZW1vcml6ZWQgZm9yIGZ1dHVyZSBwbGF5cyBvZiBjdXJyZW50IHNlY3Rpb24gb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdW5kIHN0YXJ0ZWQgcGxheWluZyBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHBsYXk6IGZ1bmN0aW9uIChtYXJrZXJOYW1lLCBjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFCYXNlU291bmQucHJvdG90eXBlLnBsYXkuY2FsbCh0aGlzLCBtYXJrZXJOYW1lLCBjb25maWcpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFxcL1xcL1xcLyBpc1BsYXlpbmcgPSB0cnVlLCBpc1BhdXNlZCA9IGZhbHNlIFxcL1xcL1xcL1xyXG4gICAgICAgIHRoaXMuc3RvcEFuZFJlbW92ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQW5kU3RhcnRCdWZmZXJTb3VyY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5QTEFZLCB0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2VzIHRoZSBzb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3BhdXNlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNQQVVTRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHBhdXNlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuY29udGV4dC5jdXJyZW50VGltZSA8IHRoaXMuc3RhcnRUaW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFCYXNlU291bmQucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgXFwvXFwvXFwvIGlzUGxheWluZyA9IGZhbHNlLCBpc1BhdXNlZCA9IHRydWUgXFwvXFwvXFwvXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLnNlZWsgPSB0aGlzLmdldEN1cnJlbnRUaW1lKCk7IC8vIEVxdWl2YWxlbnQgdG8gc2V0dGluZyBwYXVzZWQgdGltZVxyXG4gICAgICAgIHRoaXMuc3RvcEFuZFJlbW92ZUJ1ZmZlclNvdXJjZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlBBVVNFLCB0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdW1lcyB0aGUgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNyZXN1bWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1JFU1VNRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci5jb250ZXh0LmN1cnJlbnRUaW1lIDwgdGhpcy5zdGFydFRpbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIUJhc2VTb3VuZC5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgXFwvXFwvXFwvIGlzUGxheWluZyA9IHRydWUsIGlzUGF1c2VkID0gZmFsc2UgXFwvXFwvXFwvXHJcbiAgICAgICAgdGhpcy5jcmVhdGVBbmRTdGFydEJ1ZmZlclNvdXJjZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlJFU1VNRSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3AgcGxheWluZyB0aGlzIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc3RvcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjU1RPUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291bmQgd2FzIHN0b3BwZWQgc3VjY2Vzc2Z1bGx5LlxyXG4gICAgICovXHJcbiAgICBzdG9wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghQmFzZVNvdW5kLnByb3RvdHlwZS5zdG9wLmNhbGwodGhpcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgXFwvXFwvXFwvIGlzUGxheWluZyA9IGZhbHNlLCBpc1BhdXNlZCA9IGZhbHNlIFxcL1xcL1xcL1xyXG4gICAgICAgIHRoaXMuc3RvcEFuZFJlbW92ZUJ1ZmZlclNvdXJjZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlNUT1AsIHRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIGludGVybmFsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNjcmVhdGVBbmRTdGFydEJ1ZmZlclNvdXJjZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVBbmRTdGFydEJ1ZmZlclNvdXJjZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgc2VlayA9IHRoaXMuY3VycmVudENvbmZpZy5zZWVrO1xyXG4gICAgICAgIHZhciBkZWxheSA9IHRoaXMuY3VycmVudENvbmZpZy5kZWxheTtcclxuICAgICAgICB2YXIgd2hlbiA9IHRoaXMubWFuYWdlci5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXk7XHJcbiAgICAgICAgdmFyIG9mZnNldCA9ICh0aGlzLmN1cnJlbnRNYXJrZXIgPyB0aGlzLmN1cnJlbnRNYXJrZXIuc3RhcnQgOiAwKSArIHNlZWs7XHJcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbiAtIHNlZWs7XHJcblxyXG4gICAgICAgIHRoaXMucGxheVRpbWUgPSB3aGVuIC0gc2VlaztcclxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHdoZW47XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5Q29uZmlnKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc291cmNlLnN0YXJ0KE1hdGgubWF4KDAsIHdoZW4pLCBNYXRoLm1heCgwLCBvZmZzZXQpLCBNYXRoLm1heCgwLCBkdXJhdGlvbikpO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2V0Q29uZmlnKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjY3JlYXRlQW5kU3RhcnRMb29wQnVmZmVyU291cmNlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUFuZFN0YXJ0TG9vcEJ1ZmZlclNvdXJjZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgd2hlbiA9IHRoaXMuZ2V0TG9vcFRpbWUoKTtcclxuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5jdXJyZW50TWFya2VyID8gdGhpcy5jdXJyZW50TWFya2VyLnN0YXJ0IDogMDtcclxuICAgICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLmxvb3BUaW1lID0gd2hlbjtcclxuICAgICAgICB0aGlzLmxvb3BTb3VyY2UgPSB0aGlzLmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMubG9vcFNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUodGhpcy50b3RhbFJhdGUsIDApO1xyXG4gICAgICAgIHRoaXMubG9vcFNvdXJjZS5zdGFydChNYXRoLm1heCgwLCB3aGVuKSwgTWF0aC5tYXgoMCwgb2Zmc2V0KSwgTWF0aC5tYXgoMCwgZHVyYXRpb24pKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2VkIGludGVybmFsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNjcmVhdGVCdWZmZXJTb3VyY2VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtBdWRpb0J1ZmZlclNvdXJjZU5vZGV9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUJ1ZmZlclNvdXJjZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLm1hbmFnZXIuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcclxuXHJcbiAgICAgICAgc291cmNlLmJ1ZmZlciA9IHRoaXMuYXVkaW9CdWZmZXI7XHJcblxyXG4gICAgICAgIHNvdXJjZS5jb25uZWN0KHRoaXMubXV0ZU5vZGUpO1xyXG5cclxuICAgICAgICBzb3VyY2Uub25lbmRlZCA9IGZ1bmN0aW9uIChldilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChldi50YXJnZXQgPT09IF90aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gc291bmQgZW5kZWRcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jdXJyZW50Q29uZmlnLmxvb3ApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaGFzTG9vcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5oYXNFbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGVsc2Ugd2FzIHN0b3BwZWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgaW50ZXJuYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3N0b3BBbmRSZW1vdmVCdWZmZXJTb3VyY2VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RvcEFuZFJlbW92ZUJ1ZmZlclNvdXJjZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wbGF5VGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3BBbmRSZW1vdmVMb29wQnVmZmVyU291cmNlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc3RvcEFuZFJlbW92ZUxvb3BCdWZmZXJTb3VyY2VcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RvcEFuZFJlbW92ZUxvb3BCdWZmZXJTb3VyY2U6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9vcFNvdXJjZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9vcFNvdXJjZS5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9vcFNvdXJjZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9vcFNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvb3BUaW1lID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGZvciBhcHBseWluZyBjb25maWcgdmFsdWVzIHRvIHNvbWUgb2YgdGhlIHNvdW5kIHByb3BlcnRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNhcHBseUNvbmZpZ1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGFwcGx5Q29uZmlnOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmF0ZVVwZGF0ZXMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5yYXRlVXBkYXRlcy5wdXNoKHtcclxuICAgICAgICAgICAgdGltZTogMCxcclxuICAgICAgICAgICAgcmF0ZTogMVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBCYXNlU291bmQucHJvdG90eXBlLmFwcGx5Q29uZmlnLmNhbGwodGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIG1ldGhvZCBjYWxsZWQgYXV0b21hdGljYWxseSBieSBzb3VuZCBtYW5hZ2VyIG9uIGV2ZXJ5IGdhbWUgc3RlcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3VwZGF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjQ09NUExFVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0xPT1BFRFxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lc3RhbXAgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSBvciBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICB1cGRhdGU6IGZ1bmN0aW9uICh0aW1lLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNFbmRlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzRW5kZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuc3RvcC5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9wQW5kUmVtb3ZlQnVmZmVyU291cmNlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkNPTVBMRVRFLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5oYXNMb29wZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmhhc0xvb3BlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMubG9vcFNvdXJjZTtcclxuICAgICAgICAgICAgdGhpcy5sb29wU291cmNlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5wbGF5VGltZSA9IHRoaXMuc3RhcnRUaW1lID0gdGhpcy5sb29wVGltZTtcclxuICAgICAgICAgICAgdGhpcy5yYXRlVXBkYXRlcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yYXRlVXBkYXRlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWU6IDAsXHJcbiAgICAgICAgICAgICAgICByYXRlOiB0aGlzLnRvdGFsUmF0ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQW5kU3RhcnRMb29wQnVmZmVyU291cmNlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkxPT1BFRCwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxzIFBoYXNlci5Tb3VuZC5CYXNlU291bmQjZGVzdHJveSBtZXRob2RcclxuICAgICAqIGFuZCBjbGVhbnMgdXAgYWxsIFdlYiBBdWRpbyBBUEkgcmVsYXRlZCBzdHVmZi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEJhc2VTb3VuZC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmF1ZGlvQnVmZmVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN0b3BBbmRSZW1vdmVCdWZmZXJTb3VyY2UoKTtcclxuICAgICAgICB0aGlzLm11dGVOb2RlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB0aGlzLm11dGVOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZvbHVtZU5vZGUuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMudm9sdW1lTm9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yYXRlVXBkYXRlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMucmF0ZVVwZGF0ZXMgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgdG8gY2FsY3VsYXRlIHRvdGFsIHBsYXliYWNrIHJhdGUgb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjY2FsY3VsYXRlUmF0ZVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVJhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgQmFzZVNvdW5kLnByb3RvdHlwZS5jYWxjdWxhdGVSYXRlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBub3cgPSB0aGlzLm1hbmFnZXIuY29udGV4dC5jdXJyZW50VGltZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlICYmIHR5cGVvZiB0aGlzLnRvdGFsUmF0ZSA9PT0gJ251bWJlcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUodGhpcy50b3RhbFJhdGUsIG5vdyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJhdGVVcGRhdGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGltZTogTWF0aC5tYXgodGhpcy5zdGFydFRpbWUsIG5vdykgLSB0aGlzLnBsYXlUaW1lLFxyXG4gICAgICAgICAgICAgICAgcmF0ZTogdGhpcy50b3RhbFJhdGVcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sb29wU291cmNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BBbmRSZW1vdmVMb29wQnVmZmVyU291cmNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZFN0YXJ0TG9vcEJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgZm9yIGNhbGN1bGF0aW5nIGN1cnJlbnQgcGxheWJhY2sgdGltZSBvZiBhIHBsYXlpbmcgc291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNnZXRDdXJyZW50VGltZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBnZXRDdXJyZW50VGltZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgY3VycmVudFRpbWUgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmF0ZVVwZGF0ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbmV4dFRpbWUgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGkgPCB0aGlzLnJhdGVVcGRhdGVzLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHRUaW1lID0gdGhpcy5yYXRlVXBkYXRlc1tpICsgMV0udGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHRUaW1lID0gdGhpcy5tYW5hZ2VyLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnBsYXlUaW1lO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50VGltZSArPSAobmV4dFRpbWUgLSB0aGlzLnJhdGVVcGRhdGVzW2ldLnRpbWUpICogdGhpcy5yYXRlVXBkYXRlc1tpXS5yYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgZm9yIGNhbGN1bGF0aW5nIHRoZSB0aW1lXHJcbiAgICAgKiBhdCB3aXRjaCB0aGUgbG9vcCBzb3VyY2Ugc2hvdWxkIHN0YXJ0IHBsYXlpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNnZXRMb29wVGltZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBnZXRMb29wVGltZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbGFzdFJhdGVVcGRhdGVDdXJyZW50VGltZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYXRlVXBkYXRlcy5sZW5ndGggLSAxOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsYXN0UmF0ZVVwZGF0ZUN1cnJlbnRUaW1lICs9ICh0aGlzLnJhdGVVcGRhdGVzW2kgKyAxXS50aW1lIC0gdGhpcy5yYXRlVXBkYXRlc1tpXS50aW1lKSAqIHRoaXMucmF0ZVVwZGF0ZXNbaV0ucmF0ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsYXN0UmF0ZVVwZGF0ZSA9IHRoaXMucmF0ZVVwZGF0ZXNbdGhpcy5yYXRlVXBkYXRlcy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheVRpbWUgKyBsYXN0UmF0ZVVwZGF0ZS50aW1lICsgKHRoaXMuZHVyYXRpb24gLSBsYXN0UmF0ZVVwZGF0ZUN1cnJlbnRUaW1lKSAvIGxhc3RSYXRlVXBkYXRlLnJhdGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmF0ZSBhdCB3aGljaCB0aGlzIFNvdW5kIHdpbGwgYmUgcGxheWVkLlxyXG4gICAgICogVmFsdWUgb2YgMS4wIHBsYXlzIHRoZSBhdWRpbyBhdCBmdWxsIHNwZWVkLCAwLjUgcGxheXMgdGhlIGF1ZGlvIGF0IGhhbGYgc3BlZWRcclxuICAgICAqIGFuZCAyLjAgZG91YmxlcyB0aGUgYXVkaW9zIHBsYXliYWNrIHNwZWVkLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3JhdGVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNSQVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmF0ZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnLnJhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcucmF0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSYXRlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlJBVEUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgb2YgdGhpcyBTb3VuZC5cclxuICAgICAqIFxyXG4gICAgICogRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMS4wIHBsYXlzIHRoZSBhdWRpbyBhdCBmdWxsIHNwZWVkLCAwLjUgcGxheXMgdGhlIGF1ZGlvIGF0IGhhbGYgc3BlZWRcclxuICAgICAqIGFuZCAyLjAgZG91YmxlcyB0aGUgYXVkaW9zIHBsYXliYWNrIHNwZWVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc2V0UmF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjUkFURVxyXG4gICAgICogQHNpbmNlIDMuMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHBsYXliYWNrIHJhdGUgYXQgb2YgdGhpcyBTb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZH0gVGhpcyBTb3VuZC5cclxuICAgICAqL1xyXG4gICAgc2V0UmF0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmF0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZGV0dW5lIHZhbHVlIG9mIHRoaXMgU291bmQsIGdpdmVuIGluIFtjZW50c10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2VudF8lMjhtdXNpYyUyOSkuXHJcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgdGhlIHZhbHVlIGlzIC0xMjAwIHRvIDEyMDAsIGJ1dCB3ZSByZWNvbW1lbmQgc2V0dGluZyBpdCB0byBbNTBdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzUwX0NlbnQpLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI2RldHVuZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0RFVFVORVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRldHVuZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnLmRldHVuZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbmZpZy5kZXR1bmUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5ERVRVTkUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGRldHVuZSB2YWx1ZSBvZiB0aGlzIFNvdW5kLCBnaXZlbiBpbiBbY2VudHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRfJTI4bXVzaWMlMjkpLlxyXG4gICAgICogVGhlIHJhbmdlIG9mIHRoZSB2YWx1ZSBpcyAtMTIwMCB0byAxMjAwLCBidXQgd2UgcmVjb21tZW5kIHNldHRpbmcgaXQgdG8gWzUwXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS81MF9DZW50KS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3NldERldHVuZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjREVUVU5FXHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcmFuZ2Ugb2YgdGhlIHZhbHVlIGlzIC0xMjAwIHRvIDEyMDAsIGJ1dCB3ZSByZWNvbW1lbmQgc2V0dGluZyBpdCB0byBbNTBdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzUwX0NlbnQpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfSBUaGlzIFNvdW5kLlxyXG4gICAgICovXHJcbiAgICBzZXREZXR1bmU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRldHVuZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291bmQgaXMgbXV0ZWQgb3Igbm90LlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBtdXRlZCBzdGF0ZSBvZiB0aGlzIHNvdW5kLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNtdXRlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNNVVRFXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgbXV0ZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMubXV0ZU5vZGUuZ2Fpbi52YWx1ZSA9PT0gMCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcubXV0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLm11dGVOb2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodmFsdWUgPyAwIDogMSwgMCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLk1VVEUsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG11dGVkIHN0YXRlIG9mIHRoaXMgU291bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNzZXRNdXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNNVVRFXHJcbiAgICAgKiBAc2luY2UgMy40LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gYHRydWVgIHRvIG11dGUgdGhpcyBzb3VuZCwgYGZhbHNlYCB0byB1bm11dGUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmR9IFRoaXMgU291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldE11dGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLm11dGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2b2x1bWUgb2YgdGhpcyBzb3VuZCwgYSB2YWx1ZSBiZXR3ZWVuIDAgKHNpbGVuY2UpIGFuZCAxIChmdWxsIHZvbHVtZSkuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3ZvbHVtZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1ZPTFVNRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHZvbHVtZToge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy52b2x1bWVOb2RlLmdhaW4udmFsdWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcudm9sdW1lID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMudm9sdW1lTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZhbHVlLCAwKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuVk9MVU1FLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZvbHVtZSBvZiB0aGlzIFNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc2V0Vm9sdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNWT0xVTUVcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2b2x1bWUgb2YgdGhlIHNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfSBUaGlzIFNvdW5kIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRWb2x1bWU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnZvbHVtZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wZXJ0eSByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHBsYXliYWNrIGZvciB0aGlzIHNvdW5kLCBpbiBzZWNvbmRzLlxyXG4gICAgICogU2V0dGluZyBpdCB0byBhIHNwZWNpZmljIHZhbHVlIG1vdmVzIGN1cnJlbnQgcGxheWJhY2sgdG8gdGhhdCBwb3NpdGlvbi5cclxuICAgICAqIFRoZSB2YWx1ZSBnaXZlbiBpcyBjbGFtcGVkIHRvIHRoZSByYW5nZSAwIHRvIGN1cnJlbnQgbWFya2VyIGR1cmF0aW9uLlxyXG4gICAgICogU2V0dGluZyBzZWVrIG9mIGEgc3RvcHBlZCBzb3VuZCBoYXMgbm8gZWZmZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZCNzZWVrXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjU0VFS1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHNlZWs6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLmNvbnRleHQuY3VycmVudFRpbWUgPCB0aGlzLnN0YXJ0VGltZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydFRpbWUgLSB0aGlzLnBsYXlUaW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRUaW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1BhdXNlZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5zZWVrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbmFnZXIuY29udGV4dC5jdXJyZW50VGltZSA8IHRoaXMuc3RhcnRUaW1lKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZyB8fCB0aGlzLmlzUGF1c2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHZhbHVlKSwgdGhpcy5kdXJhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLnNlZWsgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQW5kUmVtb3ZlQnVmZmVyU291cmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRTdGFydEJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuU0VFSywgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlZWtzIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhpcyBzb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kI3NldFNlZWtcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI1NFRUtcclxuICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBwb2ludCBpbiB0aGUgc291bmQgdG8gc2VlayB0by5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZH0gVGhpcyBTb3VuZCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2VlazogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2VlayA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHNvdW5kIG9yIGN1cnJlbnQgc291bmQgbWFya2VyIHdpbGwgbG9vcC5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjbG9vcFxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxvb3A6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5sb29wO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnLmxvb3AgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wQW5kUmVtb3ZlTG9vcEJ1ZmZlclNvdXJjZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZFN0YXJ0TG9vcEJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkxPT1AsIHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbG9vcCBzdGF0ZSBvZiB0aGlzIFNvdW5kLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmQjc2V0TG9vcFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Tb3VuZC5FdmVudHMjTE9PUFxyXG4gICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIGB0cnVlYCB0byBsb29wIHRoaXMgc291bmQsIGBmYWxzZWAgdG8gbm90IGxvb3AgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmR9IFRoaXMgU291bmQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldExvb3A6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvb3AgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2ViQXVkaW9Tb3VuZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBhdXRob3IgICAgICAgUGF2bGUgR29sb3Nrb2tvdmljIDxwZ29sb3Nrb2tvdmljQGdtYWlsLmNvbT4gKGh0dHA6Ly9wcnVuZWdhbWVzLmNvbSlcclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCYXNlNjRUb0FycmF5QnVmZmVyID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvYmFzZTY0L0Jhc2U2NFRvQXJyYXlCdWZmZXInKTtcclxudmFyIEJhc2VTb3VuZE1hbmFnZXIgPSByZXF1aXJlKCcuLi9CYXNlU291bmRNYW5hZ2VyJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuLi9ldmVudHMnKTtcclxudmFyIFdlYkF1ZGlvU291bmQgPSByZXF1aXJlKCcuL1dlYkF1ZGlvU291bmQnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIFdlYiBBdWRpbyBBUEkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNvdW5kIE1hbmFnZXIuXHJcbiAqXHJcbiAqIE5vdCBhbGwgYnJvd3NlcnMgY2FuIHBsYXkgYWxsIGF1ZGlvIGZvcm1hdHMuXHJcbiAqXHJcbiAqIFRoZXJlIGlzIGEgZ29vZCBndWlkZSB0byB3aGF0J3Mgc3VwcG9ydGVkOiBbQ3Jvc3MtYnJvd3NlciBhdWRpbyBiYXNpY3M6IEF1ZGlvIGNvZGVjIHN1cHBvcnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL0FwcHMvRnVuZGFtZW50YWxzL0F1ZGlvX2FuZF92aWRlb19kZWxpdmVyeS9Dcm9zcy1icm93c2VyX2F1ZGlvX2Jhc2ljcyNBdWRpb19Db2RlY19TdXBwb3J0KS5cclxuICpcclxuICogQGNsYXNzIFdlYkF1ZGlvU291bmRNYW5hZ2VyXHJcbiAqIEBleHRlbmRzIFBoYXNlci5Tb3VuZC5CYXNlU291bmRNYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU291bmRcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAqL1xyXG52YXIgV2ViQXVkaW9Tb3VuZE1hbmFnZXIgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEJhc2VTb3VuZE1hbmFnZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBXZWJBdWRpb1NvdW5kTWFuYWdlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgQXVkaW9Db250ZXh0IGJlaW5nIHVzZWQgZm9yIHBsYXliYWNrLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI2NvbnRleHRcclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9Db250ZXh0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jcmVhdGVBdWRpb0NvbnRleHQoZ2FtZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdhaW4gbm9kZSByZXNwb25zaWJsZSBmb3IgY29udHJvbGxpbmcgZ2xvYmFsIG11dGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlciNtYXN0ZXJNdXRlTm9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtHYWluTm9kZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFzdGVyTXV0ZU5vZGUgPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHYWluIG5vZGUgcmVzcG9uc2libGUgZm9yIGNvbnRyb2xsaW5nIGdsb2JhbCB2b2x1bWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjbWFzdGVyVm9sdW1lTm9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtHYWluTm9kZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWFzdGVyVm9sdW1lTm9kZSA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFzdGVyTXV0ZU5vZGUuY29ubmVjdCh0aGlzLm1hc3RlclZvbHVtZU5vZGUpO1xyXG5cclxuICAgICAgICB0aGlzLm1hc3RlclZvbHVtZU5vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZXN0aW5hdGlvbiBub2RlIGZvciBjb25uZWN0aW5nIGluZGl2aWR1YWwgc291bmRzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI2Rlc3RpbmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge0F1ZGlvTm9kZX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSB0aGlzLm1hc3Rlck11dGVOb2RlO1xyXG5cclxuICAgICAgICB0aGlzLmxvY2tlZCA9IHRoaXMuY29udGV4dC5zdGF0ZSA9PT0gJ3N1c3BlbmRlZCcgJiYgKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCAnb25jbGljaycgaW4gd2luZG93KTtcclxuXHJcbiAgICAgICAgQmFzZVNvdW5kTWFuYWdlci5jYWxsKHRoaXMsIGdhbWUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5sb2NrZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVubG9jaygpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgYW5kIHJldHVybmluZyBBdWRpb0NvbnRleHQgaW5zdGFuY2UuXHJcbiAgICAgKiBJZiBhbiBpbnN0YW5jZSBvZiBhbiBBdWRpb0NvbnRleHQgY2xhc3Mgd2FzIHByb3ZpZGVkIHRocm91Z2ggdGhlIGdhbWUgY29uZmlnLFxyXG4gICAgICogdGhhdCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuIFRoaXMgY2FuIGNvbWUgaW4gaGFuZHkgaWYgeW91IGFyZSByZWxvYWRpbmdcclxuICAgICAqIGEgUGhhc2VyIGdhbWUgb24gYSBwYWdlIHRoYXQgbmV2ZXIgcHJvcGVybHkgcmVmcmVzaGVzIChzdWNoIGFzIGluIGFuIFNQQSBwcm9qZWN0KVxyXG4gICAgICogYW5kIHlvdSB3YW50IHRvIHJldXNlIGFscmVhZHkgaW5zdGFudGlhdGVkIEF1ZGlvQ29udGV4dC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlciNjcmVhdGVBdWRpb0NvbnRleHRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lfSBnYW1lIC0gUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdhbWUgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7QXVkaW9Db250ZXh0fSBUaGUgQXVkaW9Db250ZXh0IGluc3RhbmNlIHRvIGJlIHVzZWQgZm9yIHBsYXliYWNrLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVBdWRpb0NvbnRleHQ6IGZ1bmN0aW9uIChnYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhdWRpb0NvbmZpZyA9IGdhbWUuY29uZmlnLmF1ZGlvO1xyXG5cclxuICAgICAgICBpZiAoYXVkaW9Db25maWcgJiYgYXVkaW9Db25maWcuY29udGV4dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGF1ZGlvQ29uZmlnLmNvbnRleHQucmVzdW1lKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYXVkaW9Db25maWcuY29udGV4dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgQXVkaW9Db250ZXh0KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgdGFrZXMgYSBuZXcgQXVkaW9Db250ZXh0IHJlZmVyZW5jZSBhbmQgdGhlbiBzZXRzXHJcbiAgICAgKiB0aGlzIFNvdW5kIE1hbmFnZXIgdG8gdXNlIHRoYXQgY29udGV4dCBmb3IgYWxsIHBsYXliYWNrLlxyXG4gICAgICpcclxuICAgICAqIEFzIHBhcnQgb2YgdGhpcyBjYWxsIGl0IGFsc28gZGlzY29ubmVjdHMgdGhlIG1hc3RlciBtdXRlIGFuZCB2b2x1bWVcclxuICAgICAqIG5vZGVzIGFuZCB0aGVuIHJlLWNyZWF0ZXMgdGhlbSBvbiB0aGUgbmV3IGdpdmVuIGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjc2V0QXVkaW9Db250ZXh0XHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBdWRpb0NvbnRleHR9IGNvbnRleHQgLSBSZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBjcmVhdGVkIEF1ZGlvQ29udGV4dCBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgV2ViQXVkaW9Tb3VuZE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEF1ZGlvQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWFzdGVyTXV0ZU5vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hc3Rlck11dGVOb2RlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1hc3RlclZvbHVtZU5vZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1hc3RlclZvbHVtZU5vZGUuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuXHJcbiAgICAgICAgdGhpcy5tYXN0ZXJNdXRlTm9kZSA9IGNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG4gICAgICAgIHRoaXMubWFzdGVyVm9sdW1lTm9kZSA9IGNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG5cclxuICAgICAgICB0aGlzLm1hc3Rlck11dGVOb2RlLmNvbm5lY3QodGhpcy5tYXN0ZXJWb2x1bWVOb2RlKTtcclxuICAgICAgICB0aGlzLm1hc3RlclZvbHVtZU5vZGUuY29ubmVjdChjb250ZXh0LmRlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IHRoaXMubWFzdGVyTXV0ZU5vZGU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgc291bmQgaW50byB0aGUgc291bmQgbWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlciNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBBc3NldCBrZXkgZm9yIHRoZSBzb3VuZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlNvdW5kLlNvdW5kQ29uZmlnfSBbY29uZmlnXSAtIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IHNvdW5kIHNldHRpbmdzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kfSBUaGUgbmV3IHNvdW5kIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgc291bmQgPSBuZXcgV2ViQXVkaW9Tb3VuZCh0aGlzLCBrZXksIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuc291bmRzLnB1c2goc291bmQpO1xyXG5cclxuICAgICAgICByZXR1cm4gc291bmQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjb2RlIGF1ZGlvIGRhdGEgaW50byBhIGZvcm1hdCByZWFkeSBmb3IgcGxheWJhY2sgdmlhIFdlYiBBdWRpby5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYXVkaW8gZGF0YSBjYW4gYmUgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcsIGFuIGF1ZGlvIG1lZGlhLXR5cGUgZGF0YSB1cmksIG9yIGFuIEFycmF5QnVmZmVyIGluc3RhbmNlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBgYXVkaW9LZXlgIGlzIHRoZSBrZXkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2F2ZSB0aGUgZGVjb2RlZCBhdWRpbyB0byB0aGUgYXVkaW8gY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogSW5zdGVhZCBvZiBwYXNzaW5nIGEgc2luZ2xlIGVudHJ5IHlvdSBjYW4gaW5zdGVhZCBwYXNzIGFuIGFycmF5IG9mIGBQaGFzZXIuVHlwZXMuU291bmQuRGVjb2RlQXVkaW9Db25maWdgXHJcbiAgICAgKiBvYmplY3RzIGFzIHRoZSBmaXJzdCBhbmQgb25seSBhcmd1bWVudC5cclxuICAgICAqXHJcbiAgICAgKiBEZWNvZGluZyBpcyBhbiBhc3luYyBwcm9jZXNzLCBzbyBiZSBzdXJlIHRvIGxpc3RlbiBmb3IgdGhlIGV2ZW50cyB0byBrbm93IHdoZW4gZGVjb2RpbmcgaGFzIGNvbXBsZXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBPbmNlIHRoZSBhdWRpbyBoYXMgZGVjb2RlZCBpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIFNvdW5kIE1hbmFnZXIgb3IgcGxheWVkIHZpYSBpdHMga2V5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI2RlY29kZUF1ZGlvXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNERUNPREVEXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNERUNPREVEX0FMTFxyXG4gICAgICogQHNpbmNlIDMuMTguMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5Tb3VuZC5EZWNvZGVBdWRpb0NvbmZpZ1tdfHN0cmluZyl9IFthdWRpb0tleV0gLSBUaGUgc3RyaW5nLWJhc2VkIGtleSB0byBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGVjb2RlZCBhdWRpbyBpbiB0aGUgYXVkaW8gY2FjaGUsIG9yIGFuIGFycmF5IG9mIGF1ZGlvIGNvbmZpZyBvYmplY3RzLlxyXG4gICAgICogQHBhcmFtIHsoQXJyYXlCdWZmZXJ8c3RyaW5nKX0gW2F1ZGlvRGF0YV0gLSBUaGUgYXVkaW8gZGF0YSwgZWl0aGVyIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nLCBhbiBhdWRpbyBtZWRpYS10eXBlIGRhdGEgdXJpLCBvciBhbiBBcnJheUJ1ZmZlciBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZGVjb2RlQXVkaW86IGZ1bmN0aW9uIChhdWRpb0tleSwgYXVkaW9EYXRhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBhdWRpb0ZpbGVzO1xyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXVkaW9LZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXVkaW9GaWxlcyA9IFsgeyBrZXk6IGF1ZGlvS2V5LCBkYXRhOiBhdWRpb0RhdGEgfSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhdWRpb0ZpbGVzID0gYXVkaW9LZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgY2FjaGUgPSB0aGlzLmdhbWUuY2FjaGUuYXVkaW87XHJcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IGF1ZGlvRmlsZXMubGVuZ3RoO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvRmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSBhdWRpb0ZpbGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGtleSA9IGVudHJ5LmtleTtcclxuICAgICAgICAgICAgdmFyIGRhdGEgPSBlbnRyeS5kYXRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IEJhc2U2NFRvQXJyYXlCdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gZnVuY3Rpb24gKGtleSwgYXVkaW9CdWZmZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhY2hlLmFkZChrZXksIGF1ZGlvQnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRFQ09ERUQsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nLS07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkRFQ09ERURfQUxMKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGtleSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZmFpbHVyZSA9IGZ1bmN0aW9uIChrZXksIGVycm9yKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlY29kaW5nIGF1ZGlvOiAnICsga2V5ICsgJyAtICcsIGVycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZW1haW5pbmctLTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuREVDT0RFRF9BTEwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcywga2V5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVBdWRpb0RhdGEoZGF0YSwgc3VjY2VzcywgZmFpbHVyZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVubG9ja3MgV2ViIEF1ZGlvIEFQSSBvbiB0aGUgaW5pdGlhbCBpbnB1dCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBSZWFkIG1vcmUgYWJvdXQgaG93IHRoaXMgaXNzdWUgaXMgaGFuZGxlZCBoZXJlIGluIFt0aGlzIGFydGljbGVdKGh0dHBzOi8vbWVkaXVtLmNvbS9AcGdvbG9za29rb3ZpYy91bmxvY2tpbmctd2ViLWF1ZGlvLXRoZS1zbWFydGVyLXdheS04ODU4MjE4YzBlMDkpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI3VubG9ja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVubG9jazogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIHZhciB1bmxvY2tIYW5kbGVyID0gZnVuY3Rpb24gdW5sb2NrSGFuZGxlciAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKF90aGlzLmNvbnRleHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQucmVzdW1lKCkudGhlbihmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHVubG9ja0hhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2tIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdW5sb2NrSGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdW5sb2NrSGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVubG9ja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdW5sb2NrSGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHVubG9ja0hhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2tIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgICAgICBib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB1bmxvY2tIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGJvZHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2tIYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2tIYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2tIYW5kbGVyLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHVubG9ja0hhbmRsZXIsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHVzZWQgaW50ZXJuYWxseSBmb3IgcGF1c2luZyBzb3VuZCBtYW5hZ2VyIGlmXHJcbiAgICAgKiBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjcGF1c2VPbkJsdXIgaXMgc2V0IHRvIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjb25CbHVyXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgb25CbHVyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5sb2NrZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3VzcGVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdXNlZCBpbnRlcm5hbGx5IGZvciByZXN1bWluZyBzb3VuZCBtYW5hZ2VyIGlmXHJcbiAgICAgKiBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjcGF1c2VPbkJsdXIgaXMgc2V0IHRvIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjb25Gb2N1c1xyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvY2tlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN1bWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbHMgUGhhc2VyLlNvdW5kLkJhc2VTb3VuZE1hbmFnZXIjZGVzdHJveSBtZXRob2RcclxuICAgICAqIGFuZCBjbGVhbnMgdXAgYWxsIFdlYiBBdWRpbyBBUEkgcmVsYXRlZCBzdHVmZi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLm1hc3RlclZvbHVtZU5vZGUuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMubWFzdGVyVm9sdW1lTm9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYXN0ZXJNdXRlTm9kZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5tYXN0ZXJNdXRlTm9kZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdhbWUuY29uZmlnLmF1ZGlvICYmIHRoaXMuZ2FtZS5jb25maWcuYXVkaW8uY29udGV4dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdXNwZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xvc2UoKS50aGVuKGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEJhc2VTb3VuZE1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtdXRlZCBzdGF0ZSBvZiBhbGwgdGhpcyBTb3VuZCBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI3NldE11dGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9NVVRFXHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gYHRydWVgIHRvIG11dGUgYWxsIHNvdW5kcywgYGZhbHNlYCB0byB1bm11dGUgdGhlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXJ9IFRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0TXV0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubXV0ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXIjbXV0ZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlNvdW5kLkV2ZW50cyNHTE9CQUxfTVVURVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIG11dGU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLm1hc3Rlck11dGVOb2RlLmdhaW4udmFsdWUgPT09IDApO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXN0ZXJNdXRlTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZhbHVlID8gMCA6IDEsIDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HTE9CQUxfTVVURSwgdGhpcywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdm9sdW1lIG9mIHRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Tb3VuZC5XZWJBdWRpb1NvdW5kTWFuYWdlciNzZXRWb2x1bWVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9WT0xVTUVcclxuICAgICAqIEBzaW5jZSAzLjMuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBnbG9iYWwgdm9sdW1lIG9mIHRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU291bmQuV2ViQXVkaW9Tb3VuZE1hbmFnZXJ9IFRoaXMgU291bmQgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0Vm9sdW1lOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy52b2x1bWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlNvdW5kLldlYkF1ZGlvU291bmRNYW5hZ2VyI3ZvbHVtZVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBmaXJlcyBQaGFzZXIuU291bmQuRXZlbnRzI0dMT0JBTF9WT0xVTUVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICB2b2x1bWU6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFzdGVyVm9sdW1lTm9kZS5nYWluLnZhbHVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tYXN0ZXJWb2x1bWVOb2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodmFsdWUsIDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5HTE9CQUxfVk9MVU1FLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXZWJBdWRpb1NvdW5kTWFuYWdlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXJyYXlVdGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5Jyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBOT09QID0gcmVxdWlyZSgnLi4vdXRpbHMvTk9PUCcpO1xyXG52YXIgU3RhYmxlU29ydCA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L1N0YWJsZVNvcnQnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2FsbGJhY2sgRWFjaExpc3RDYWxsYmFjazxJPlxyXG4gKlxyXG4gKiBAcGFyYW0ge0l9IGl0ZW0gLSBUaGUgaXRlbSB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxyXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLCBhZnRlciB0aGUgY2hpbGQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogTGlzdCBpcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gb3JkZXJlZCBsaXN0IHdoaWNoIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgcmV0cmlldmluZywgbWFuaXB1bGF0aW5nLCBhbmQgaXRlcmF0aW5nIGl0ZW1zLlxyXG4gKlxyXG4gKiBAY2xhc3MgTGlzdFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlN0cnVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gcGFyZW50IC0gVGhlIHBhcmVudCBvZiB0aGlzIGxpc3QuXHJcbiAqL1xyXG52YXIgTGlzdCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBMaXN0IChwYXJlbnQpXHJcbiAgICB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHBhcmVudCBvZiB0aGlzIGxpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5MaXN0I3BhcmVudFxyXG4gICAgICAgICAqIEB0eXBlIHsqfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb2JqZWN0cyB0aGF0IGJlbG9uZyB0byB0aGlzIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFskdHlwZV1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLkxpc3QjbGlzdFxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Kj59XHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgbGlzdCB3aXRoIHRoZSB7QGxpbmsgI2ZpcnN0fSwge0BsaW5rICNsYXN0fSwge0BsaW5rICNnZXR9LCBhbmQge0BsaW5rICNwcmV2aW91c30gcHJvcGVydGllcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLkxpc3QjcG9zaXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBjaGlsZCBpcyBhZGRlZCB0byB0aGlzIGxpc3QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5MaXN0I2FkZENhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYWRkQ2FsbGJhY2sgPSBOT09QO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBldmVyeSB0aW1lIGEgY2hpbGQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgbGlzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLkxpc3QjcmVtb3ZlQ2FsbGJhY2tcclxuICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb259XHJcbiAgICAgICAgICogQHNpbmNlIDMuNC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW1vdmVDYWxsYmFjayA9IE5PT1A7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc29ydCBieS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLkxpc3QjX3NvcnRLZXlcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3NvcnRLZXkgPSAnJztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIEVhY2ggaXRlbSBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjYWRkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbY2hpbGQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp8QXJyYXkuPCo+fSBjaGlsZCAtIFRoZSBpdGVtLCBvciBhcnJheSBvZiBpdGVtcywgdG8gYWRkIHRvIHRoZSBsaXN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcENhbGxiYWNrPWZhbHNlXSAtIFNraXAgY2FsbGluZyB0aGUgTGlzdC5hZGRDYWxsYmFjayBpZiB0aGlzIGNoaWxkIGlzIGFkZGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgbGlzdCdzIHVuZGVybHlpbmcgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKGNoaWxkLCBza2lwQ2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNraXBDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheVV0aWxzLkFkZCh0aGlzLmxpc3QsIGNoaWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuQWRkKHRoaXMubGlzdCwgY2hpbGQsIDAsIHRoaXMuYWRkQ2FsbGJhY2ssIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFuIGl0ZW0gdG8gbGlzdCwgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgaW5kZXguIEVhY2ggaXRlbSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I2FkZEF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbY2hpbGQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGNoaWxkIC0gVGhlIGl0ZW0sIG9yIGFycmF5IG9mIGl0ZW1zLCB0byBhZGQgdG8gdGhlIGxpc3QuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtpbmRleD0wXSAtIFRoZSBpbmRleCBpbiB0aGUgbGlzdCBhdCB3aGljaCB0aGUgZWxlbWVudChzKSB3aWxsIGJlIGluc2VydGVkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcENhbGxiYWNrPWZhbHNlXSAtIFNraXAgY2FsbGluZyB0aGUgTGlzdC5hZGRDYWxsYmFjayBpZiB0aGlzIGNoaWxkIGlzIGFkZGVkIHN1Y2Nlc3NmdWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgTGlzdCdzIHVuZGVybHlpbmcgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGFkZEF0OiBmdW5jdGlvbiAoY2hpbGQsIGluZGV4LCBza2lwQ2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHNraXBDYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheVV0aWxzLkFkZEF0KHRoaXMubGlzdCwgY2hpbGQsIGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuQWRkQXQodGhpcy5saXN0LCBjaGlsZCwgaW5kZXgsIDAsIHRoaXMuYWRkQ2FsbGJhY2ssIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgYSBnaXZlbiBwb3NpdGlvbiBpbnNpZGUgdGhlIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I2dldEF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyp9IFRoZSByZXRyaWV2ZWQgaXRlbSwgb3IgYHVuZGVmaW5lZGAgaWYgaXQncyBvdXRzaWRlIHRoZSBMaXN0J3MgYm91bmRzLlxyXG4gICAgICovXHJcbiAgICBnZXRBdDogZnVuY3Rpb24gKGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RbaW5kZXhdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvY2F0ZXMgYW4gaXRlbSB3aXRoaW4gdGhlIExpc3QgYW5kIHJldHVybnMgaXRzIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNnZXRJbmRleFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW2NoaWxkXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gY2hpbGQgLSBUaGUgaXRlbSB0byBsb2NhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHdpdGhpbiB0aGUgTGlzdCwgb3IgLTEgaWYgaXQncyBub3QgaW4gdGhlIExpc3QuXHJcbiAgICAgKi9cclxuICAgIGdldEluZGV4OiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFJldHVybiAtMSBpZiBnaXZlbiBjaGlsZCBpc24ndCBhIGNoaWxkIG9mIHRoaXMgZGlzcGxheSBsaXN0XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5pbmRleE9mKGNoaWxkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb3J0IHRoZSBjb250ZW50cyBvZiB0aGlzIExpc3Qgc28gdGhlIGl0ZW1zIGFyZSBpbiBvcmRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkuXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgYHNvcnQoJ2FscGhhJylgIHdvdWxkIHNvcnQgdGhlIExpc3QgY29udGVudHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZWlyIGBhbHBoYWAgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3NvcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUW119IC0gW2NoaWxkcmVuLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGxleGljYWxseSBzb3J0IGJ5LlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2hhbmRsZXJdIC0gUHJvdmlkZSB5b3VyIG93biBjdXN0b20gaGFuZGxlciBmdW5jdGlvbi4gV2lsbCByZWNlaXZlIDIgY2hpbGRyZW4gd2hpY2ggaXQgc2hvdWxkIGNvbXBhcmUgYW5kIHJldHVybiBhIGJvb2xlYW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuTGlzdH0gVGhpcyBMaXN0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc29ydDogZnVuY3Rpb24gKHByb3BlcnR5LCBoYW5kbGVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghcHJvcGVydHkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBoYW5kbGVyID0gZnVuY3Rpb24gKGNoaWxkQSwgY2hpbGRCKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRBW3Byb3BlcnR5XSAtIGNoaWxkQltwcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBTdGFibGVTb3J0LmlucGxhY2UodGhpcy5saXN0LCBoYW5kbGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIGNoaWxkIHdpdGggaXRzIGBuYW1lYFxyXG4gICAgICogcHJvcGVydHkgbWF0Y2hpbmcgdGhlIGdpdmVuIGFyZ3VtZW50LiBTaG91bGQgbW9yZSB0aGFuIG9uZSBjaGlsZCBoYXZlXHJcbiAgICAgKiB0aGUgc2FtZSBuYW1lIG9ubHkgdGhlIGZpcnN0IGlzIHJldHVybmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNnZXRCeU5hbWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUIHwgbnVsbH0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIHRvIHNlYXJjaCBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Pyp9IFRoZSBmaXJzdCBjaGlsZCB3aXRoIGEgbWF0Y2hpbmcgbmFtZSwgb3IgbnVsbCBpZiBub25lIHdlcmUgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGdldEJ5TmFtZTogZnVuY3Rpb24gKG5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuR2V0Rmlyc3QodGhpcy5saXN0LCAnbmFtZScsIG5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSByYW5kb20gY2hpbGQgZnJvbSB0aGUgZ3JvdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I2dldFJhbmRvbVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1QgfCBudWxsfSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0SW5kZXg9MF0gLSBPZmZzZXQgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGdyb3VwIChsb3dlc3QgY2hpbGQpLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbGVuZ3RoPSh0byB0b3ApXSAtIFJlc3RyaWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgdmFsdWVzIHlvdSB3YW50IHRvIHJhbmRvbWx5IHNlbGVjdCBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez8qfSBBIHJhbmRvbSBjaGlsZCBvZiB0aGlzIEdyb3VwLlxyXG4gICAgICovXHJcbiAgICBnZXRSYW5kb206IGZ1bmN0aW9uIChzdGFydEluZGV4LCBsZW5ndGgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuR2V0UmFuZG9tKHRoaXMubGlzdCwgc3RhcnRJbmRleCwgbGVuZ3RoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgZ2l2ZW4gcGFydCBvZiB0aGUgTGlzdCB3aGljaCBtYXRjaGVzIGEgc3BlY2lmaWMgY3JpdGVyaW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNnZXRGaXJzdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1QgfCBudWxsfSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB0ZXN0IG9yIGEgZmFsc2V5IHZhbHVlIHRvIGhhdmUgbm8gY3JpdGVyaW9uLlxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0IHRoZSBgcHJvcGVydHlgIGFnYWluc3QsIG9yIGB1bmRlZmluZWRgIHRvIGFsbG93IGFueSB2YWx1ZSBhbmQgb25seSBjaGVjayBmb3IgZXhpc3RlbmNlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydEluZGV4PTBdIC0gVGhlIHBvc2l0aW9uIGluIHRoZSBMaXN0IHRvIHN0YXJ0IHRoZSBzZWFyY2ggYXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZEluZGV4XSAtIFRoZSBwb3NpdGlvbiBpbiB0aGUgTGlzdCB0byBvcHRpb25hbGx5IHN0b3AgdGhlIHNlYXJjaCBhdC4gSXQgd29uJ3QgYmUgY2hlY2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/Kn0gVGhlIGZpcnN0IGl0ZW0gd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaW9uLCBvciBgbnVsbGAgaWYgbm8gc3VjaCBpdGVtIGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgZ2V0Rmlyc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBBcnJheVV0aWxzLkdldEZpcnN0KHRoaXMubGlzdCwgcHJvcGVydHksIHZhbHVlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbGwgY2hpbGRyZW4gaW4gdGhpcyBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgbWF0Y2hpbmcgY3JpdGVyaWEgdXNpbmcgdGhlIGBwcm9wZXJ0eWAgYW5kIGB2YWx1ZWAgYXJndW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEZvciBleGFtcGxlOiBgZ2V0QWxsKCdwYXJlbnQnKWAgd291bGQgcmV0dXJuIG9ubHkgY2hpbGRyZW4gdGhhdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGBwYXJlbnRgLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdmFsdWUgdG8gY29tcGFyZSB0aGUgcHJvcGVydHkgdG86XHJcbiAgICAgKiBcclxuICAgICAqIGBnZXRBbGwoJ3Zpc2libGUnLCB0cnVlKWAgd291bGQgcmV0dXJuIG9ubHkgY2hpbGRyZW4gdGhhdCBoYXZlIHRoZWlyIHZpc2libGUgcHJvcGVydHkgc2V0IHRvIGB0cnVlYC5cclxuICAgICAqXHJcbiAgICAgKiBPcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIHN0YXJ0IGFuZCBlbmQgaW5kZXguIEZvciBleGFtcGxlIGlmIHRoaXMgTGlzdCBoYWQgMTAwIGNoaWxkcmVuLFxyXG4gICAgICogYW5kIHlvdSBzZXQgYHN0YXJ0SW5kZXhgIHRvIDAgYW5kIGBlbmRJbmRleGAgdG8gNTAsIGl0IHdvdWxkIHJldHVybiBtYXRjaGVzIGZyb20gb25seVxyXG4gICAgICogdGhlIGZpcnN0IDUwIGNoaWxkcmVuIGluIHRoZSBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNnZXRBbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFt2YWx1ZV1cclxuICAgICAqIEBnZW5lcmljVXNlIHtUW119IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBBbiBvcHRpb25hbCBwcm9wZXJ0eSB0byB0ZXN0IGFnYWluc3QgdGhlIHZhbHVlIGFyZ3VtZW50LlxyXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIC0gSWYgcHJvcGVydHkgaXMgc2V0IHRoZW4gQ2hpbGQucHJvcGVydHkgbXVzdCBzdHJpY3RseSBlcXVhbCB0aGlzIHZhbHVlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnRJbmRleF0gLSBUaGUgZmlyc3QgY2hpbGQgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZW5kSW5kZXhdIC0gVGhlIGxhc3QgY2hpbGQgaW5kZXggdG8gc2VhcmNoIHVwIHVudGlsLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0FycmF5LjwqPn0gQWxsIGl0ZW1zIG9mIHRoZSBMaXN0IHdoaWNoIG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpb24sIGlmIGFueS5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsOiBmdW5jdGlvbiAocHJvcGVydHksIHZhbHVlLCBzdGFydEluZGV4LCBlbmRJbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5HZXRBbGwodGhpcy5saXN0LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIExpc3Qgd2hpY2ggaGF2ZSBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjY291bnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFt2YWx1ZV1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gdGVzdCBvbiBlYWNoIGl0ZW0uXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QgdGhlIHByb3BlcnR5IGFnYWluc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBtYXRjaGluZyBlbGVtZW50cy5cclxuICAgICAqL1xyXG4gICAgY291bnQ6IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuQ291bnRBbGxNYXRjaGluZyh0aGlzLmxpc3QsIHByb3BlcnR5LCB2YWx1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3dhcHMgdGhlIHBvc2l0aW9ucyBvZiB0d28gaXRlbXMgaW4gdGhlIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3N3YXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFtjaGlsZDEsY2hpbGQyXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gY2hpbGQxIC0gVGhlIGZpcnN0IGl0ZW0gdG8gc3dhcC5cclxuICAgICAqIEBwYXJhbSB7Kn0gY2hpbGQyIC0gVGhlIHNlY29uZCBpdGVtIHRvIHN3YXAuXHJcbiAgICAgKi9cclxuICAgIHN3YXA6IGZ1bmN0aW9uIChjaGlsZDEsIGNoaWxkMilcclxuICAgIHtcclxuICAgICAgICBBcnJheVV0aWxzLlN3YXAodGhpcy5saXN0LCBjaGlsZDEsIGNoaWxkMik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgYW4gaXRlbSBpbiB0aGUgTGlzdCB0byBhIG5ldyBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjbW92ZVRvXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbY2hpbGQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGNoaWxkIC0gVGhlIGl0ZW0gdG8gbW92ZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBNb3ZlcyBhbiBpdGVtIGluIHRoZSBMaXN0IHRvIGEgbmV3IHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyp9IFRoZSBpdGVtIHRoYXQgd2FzIG1vdmVkLlxyXG4gICAgICovXHJcbiAgICBtb3ZlVG86IGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuTW92ZVRvKHRoaXMubGlzdCwgY2hpbGQsIGluZGV4KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIG9uZSBvciBtYW55IGl0ZW1zIGZyb20gdGhlIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW2NoaWxkLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBjaGlsZCAtIFRoZSBpdGVtLCBvciBhcnJheSBvZiBpdGVtcywgdG8gcmVtb3ZlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcENhbGxiYWNrPWZhbHNlXSAtIFNraXAgY2FsbGluZyB0aGUgTGlzdC5yZW1vdmVDYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSwgb3IgYXJyYXkgb2YgaXRlbXMsIHdoaWNoIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgTGlzdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoY2hpbGQsIHNraXBDYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoc2tpcENhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuUmVtb3ZlKHRoaXMubGlzdCwgY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmUodGhpcy5saXN0LCBjaGlsZCwgdGhpcy5yZW1vdmVDYWxsYmFjaywgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNyZW1vdmVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBwb3NpdGlvbiB0byByZW1vdmUgdGhlIGl0ZW0gZnJvbS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBDYWxsYmFjaz1mYWxzZV0gLSBTa2lwIGNhbGxpbmcgdGhlIExpc3QucmVtb3ZlQ2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGl0ZW0gdGhhdCB3YXMgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQXQ6IGZ1bmN0aW9uIChpbmRleCwgc2tpcENhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChza2lwQ2FsbGJhY2spXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmVBdCh0aGlzLmxpc3QsIGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuUmVtb3ZlQXQodGhpcy5saXN0LCBpbmRleCwgdGhpcy5yZW1vdmVDYWxsYmFjaywgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGl0ZW1zIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UgaW4gdGhlIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3JlbW92ZUJldHdlZW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUW119IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnRJbmRleD0wXSAtIFRoZSBpbmRleCB0byBzdGFydCByZW1vdmluZyBmcm9tLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZW5kSW5kZXhdIC0gVGhlIHBvc2l0aW9uIHRvIHN0b3AgcmVtb3ZpbmcgYXQuIFRoZSBpdGVtIGF0IHRoaXMgcG9zaXRpb24gd29uJ3QgYmUgcmVtb3ZlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBDYWxsYmFjaz1mYWxzZV0gLSBTa2lwIGNhbGxpbmcgdGhlIExpc3QucmVtb3ZlQ2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7QXJyYXkuPCo+fSBBbiBhcnJheSBvZiB0aGUgaXRlbXMgd2hpY2ggd2VyZSByZW1vdmVkLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVCZXR3ZWVuOiBmdW5jdGlvbiAoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHNraXBDYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoc2tpcENhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuUmVtb3ZlQmV0d2Vlbih0aGlzLmxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuUmVtb3ZlQmV0d2Vlbih0aGlzLmxpc3QsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnJlbW92ZUNhbGxiYWNrLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgdGhlIGl0ZW1zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNyZW1vdmVBbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5MaXN0LjxUPn0gLSBbJHJldHVybl1cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2tpcENhbGxiYWNrPWZhbHNlXSAtIFNraXAgY2FsbGluZyB0aGUgTGlzdC5yZW1vdmVDYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5MaXN0fSBUaGlzIExpc3Qgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmVBbGw6IGZ1bmN0aW9uIChza2lwQ2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGkgPSB0aGlzLmxpc3QubGVuZ3RoO1xyXG5cclxuICAgICAgICB3aGlsZSAoaS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy5saXN0W2ldLCBza2lwQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJpbmdzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGUgdG9wIG9mIHRoaXMgTGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjYnJpbmdUb1RvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW2NoaWxkLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBjaGlsZCAtIFRoZSBpdGVtIHRvIGJyaW5nIHRvIHRoZSB0b3Agb2YgdGhlIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGl0ZW0gd2hpY2ggd2FzIG1vdmVkLlxyXG4gICAgICovXHJcbiAgICBicmluZ1RvVG9wOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuQnJpbmdUb1RvcCh0aGlzLmxpc3QsIGNoaWxkKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gY2hpbGQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3NlbmRUb0JhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFtjaGlsZCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gY2hpbGQgLSBUaGUgaXRlbSB0byBzZW5kIHRvIHRoZSBiYWNrIG9mIHRoZSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4geyp9IFRoZSBpdGVtIHdoaWNoIHdhcyBtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgc2VuZFRvQmFjazogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBBcnJheVV0aWxzLlNlbmRUb0JhY2sodGhpcy5saXN0LCBjaGlsZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGdpdmVuIGNoaWxkIHVwIG9uZSBwbGFjZSBpbiB0aGlzIGdyb3VwIHVubGVzcyBpdCdzIGFscmVhZHkgYXQgdGhlIHRvcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjbW92ZVVwXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbY2hpbGQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGNoaWxkIC0gVGhlIGl0ZW0gdG8gbW92ZSB1cC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB3aGljaCB3YXMgbW92ZWQuXHJcbiAgICAgKi9cclxuICAgIG1vdmVVcDogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIEFycmF5VXRpbHMuTW92ZVVwKHRoaXMubGlzdCwgY2hpbGQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGdpdmVuIGNoaWxkIGRvd24gb25lIHBsYWNlIGluIHRoaXMgZ3JvdXAgdW5sZXNzIGl0J3MgYWxyZWFkeSBhdCB0aGUgYm90dG9tLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNtb3ZlRG93blxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW2NoaWxkLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBjaGlsZCAtIFRoZSBpdGVtIHRvIG1vdmUgZG93bi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB3aGljaCB3YXMgbW92ZWQuXHJcbiAgICAgKi9cclxuICAgIG1vdmVEb3duOiBmdW5jdGlvbiAoY2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5Nb3ZlRG93bih0aGlzLmxpc3QsIGNoaWxkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiBhbGwgY2hpbGRyZW4gaW4gdGhpcyBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTGlzdCNyZXZlcnNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuTGlzdC48VD59IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuTGlzdH0gVGhpcyBMaXN0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxpc3QucmV2ZXJzZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaHVmZmxlcyB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3NodWZmbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5MaXN0LjxUPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5MaXN0fSBUaGlzIExpc3Qgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzaHVmZmxlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIEFycmF5VXRpbHMuU2h1ZmZsZSh0aGlzLmxpc3QpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBhIGNoaWxkIG9mIHRoaXMgTGlzdCB3aXRoIHRoZSBnaXZlbiBuZXdDaGlsZC4gVGhlIG5ld0NoaWxkIGNhbm5vdCBiZSBhIG1lbWJlciBvZiB0aGlzIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3JlcGxhY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFtvbGRDaGlsZCxuZXdDaGlsZCwkcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gb2xkQ2hpbGQgLSBUaGUgY2hpbGQgaW4gdGhpcyBMaXN0IHRoYXQgd2lsbCBiZSByZXBsYWNlZC5cclxuICAgICAqIEBwYXJhbSB7Kn0gbmV3Q2hpbGQgLSBUaGUgY2hpbGQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGlzIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgb2xkQ2hpbGQgdGhhdCB3YXMgcmVwbGFjZWQgd2l0aGluIHRoaXMgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2U6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbmV3Q2hpbGQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuUmVwbGFjZSh0aGlzLmxpc3QsIG9sZENoaWxkLCBuZXdDaGlsZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFuIGl0ZW0gZXhpc3RzIHdpdGhpbiB0aGUgTGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3QjZXhpc3RzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbY2hpbGRdXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBjaGlsZCAtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaXRlbSBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0czogZnVuY3Rpb24gKGNoaWxkKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5saXN0LmluZGV4T2YoY2hpbGQpID4gLTEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHByb3BlcnR5IGBrZXlgIHRvIHRoZSBnaXZlbiB2YWx1ZSBvbiBhbGwgbWVtYmVycyBvZiB0aGlzIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I3NldEFsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW3ZhbHVlXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4XSAtIFRoZSBmaXJzdCBjaGlsZCBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleF0gLSBUaGUgbGFzdCBjaGlsZCBpbmRleCB0byBzZWFyY2ggdXAgdW50aWwuXHJcbiAgICAgKi9cclxuICAgIHNldEFsbDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgQXJyYXlVdGlscy5TZXRBbGwodGhpcy5saXN0LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzc2VzIGFsbCBjaGlsZHJlbiB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I2VhY2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtFYWNoTGlzdENhbGxiYWNrLjxUPn0gLSBbY2FsbGJhY2tdXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFYWNoTGlzdENhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxyXG4gICAgICogQHBhcmFtIHsqfSBbY29udGV4dF0gLSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGNhbGxiYWNrLlxyXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgYWZ0ZXIgdGhlIGNoaWxkLlxyXG4gICAgICovXHJcbiAgICBlYWNoOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbIG51bGwgXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzWzBdID0gdGhpcy5saXN0W2ldO1xyXG5cclxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgTGlzdCBhbmQgcmVjcmVhdGVzIGl0cyBpbnRlcm5hbCBhcnJheS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLkxpc3Qjc2h1dGRvd25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3QgPSBbXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5MaXN0I2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsKCk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFkZENhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlbW92ZUNhbGxiYWNrID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluc2lkZSB0aGUgTGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5MaXN0I2xlbmd0aFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsZW5ndGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgTGlzdCBvciBgbnVsbGAgZm9yIGFuIGVtcHR5IExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuTGlzdCNmaXJzdFxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gWyR0eXBlXVxyXG4gICAgICogQHR5cGUgeyp9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBmaXJzdDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGFzdCBpdGVtIGluIHRoZSBMaXN0LCBvciBgbnVsbGAgZm9yIGFuIGVtcHR5IExpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuTGlzdCNsYXN0XHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbJHR5cGVdXHJcbiAgICAgKiBAdHlwZSB7Kn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGxhc3Q6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5saXN0Lmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFt0aGlzLnBvc2l0aW9uXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmV4dCBpdGVtIGluIHRoZSBMaXN0LCBvciBgbnVsbGAgaWYgdGhlIGVudGlyZSBMaXN0IGhhcyBiZWVuIHRyYXZlcnNlZC5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgcmVhZCBzdWNjZXNzaXZlbHkgYWZ0ZXIgcmVhZGluZyB7QGxpbmsgI2ZpcnN0fSBvciBtYW51YWxseSBzZXR0aW5nIHRoZSB7QGxpbmsgI3Bvc2l0aW9ufSB0byBpdGVyYXRlIHRoZSBMaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLkxpc3QjbmV4dFxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gWyR0eXBlXVxyXG4gICAgICogQHR5cGUgeyp9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBuZXh0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5saXN0Lmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbisrO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RbdGhpcy5wb3NpdGlvbl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHByZXZpb3VzIGl0ZW0gaW4gdGhlIExpc3QsIG9yIGBudWxsYCBpZiB0aGUgZW50aXJlIExpc3QgaGFzIGJlZW4gdHJhdmVyc2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIHByb3BlcnR5IGNhbiBiZSByZWFkIHN1Y2Nlc3NpdmVseSBhZnRlciByZWFkaW5nIHtAbGluayAjbGFzdH0gb3IgbWFudWFsbHkgc2V0dGluZyB0aGUge0BsaW5rICNwb3NpdGlvbn0gdG8gaXRlcmF0ZSB0aGUgTGlzdCBiYWNrd2FyZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuTGlzdCNwcmV2aW91c1xyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gWyR0eXBlXVxyXG4gICAgICogQHR5cGUgeyp9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwcmV2aW91czoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24tLTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0W3RoaXMucG9zaXRpb25dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2FsbGJhY2sgRWFjaE1hcENhbGxiYWNrPEU+XHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBNYXAgZW50cnkuXHJcbiAqIEBwYXJhbSB7RX0gZW50cnkgLSBUaGUgdmFsdWUgb2YgdGhlIE1hcCBlbnRyeS5cclxuICpcclxuICogQHJldHVybiB7P2Jvb2xlYW59IFRoZSBjYWxsYmFjayByZXN1bHQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIGtleXMgb2YgYSBNYXAgY2FuIGJlIGFyYml0cmFyeSB2YWx1ZXMuXHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciBtYXAgPSBuZXcgTWFwKFtcclxuICogICAgWyAxLCAnb25lJyBdLFxyXG4gKiAgICBbIDIsICd0d28nIF0sXHJcbiAqICAgIFsgMywgJ3RocmVlJyBdXHJcbiAqIF0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQGNsYXNzIE1hcFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlN0cnVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBLXHJcbiAqIEBnZW5lcmljIFZcclxuICogQGdlbmVyaWNVc2Uge1ZbXX0gLSBbZWxlbWVudHNdXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXkuPCo+fSBlbGVtZW50cyAtIEFuIG9wdGlvbmFsIGFycmF5IG9mIGtleS12YWx1ZSBwYWlycyB0byBwb3B1bGF0ZSB0aGlzIE1hcCB3aXRoLlxyXG4gKi9cclxudmFyIE1hcCA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBNYXAgKGVsZW1lbnRzKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBlbnRyaWVzIGluIHRoaXMgTWFwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQGdlbmVyaWNVc2Uge09iamVjdC48c3RyaW5nLCBWPn0gLSBbJHR5cGVdXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5NYXAjZW50cmllc1xyXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3QuPHN0cmluZywgKj59XHJcbiAgICAgICAgICogQGRlZmF1bHQge31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVudHJpZXMgPSB7fTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBrZXkgLyB2YWx1ZSBwYWlycyBpbiB0aGlzIE1hcC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLk1hcCNzaXplXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zaXplID0gMDtcclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudHMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZWxlbWVudHNbaV1bMF0sIGVsZW1lbnRzW2ldWzFdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFuIGVsZW1lbnQgd2l0aCBhIHNwZWNpZmllZCBga2V5YCBhbmQgYHZhbHVlYCB0byB0aGlzIE1hcC5cclxuICAgICAqIElmIHRoZSBga2V5YCBhbHJlYWR5IGV4aXN0cywgdGhlIHZhbHVlIHdpbGwgYmUgcmVwbGFjZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5NYXAjc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7S30gLSBba2V5XVxyXG4gICAgICogQGdlbmVyaWNVc2Uge1Z9IC0gW3ZhbHVlXVxyXG4gICAgICogQGdlbmVyaWNVc2Uge1BoYXNlci5TdHJ1Y3RzLk1hcC48SywgVj59IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhpcyBNYXAuXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoaXMgTWFwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TdHJ1Y3RzLk1hcH0gVGhpcyBNYXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXMoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbnRyaWVzW2tleV0gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgYGtleWAsIG9yIGB1bmRlZmluZWRgIGlmIHRoZXJlIGlzIG5vbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5NYXAjZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7S30gLSBba2V5XVxyXG4gICAgICogQGdlbmVyaWNVc2Uge1Z9IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuIGZyb20gdGhlIGBNYXBgIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGtleSBjYW4ndCBiZSBmb3VuZCBpbiB0aGlzIE1hcCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldDogZnVuY3Rpb24gKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBgQXJyYXlgIG9mIGFsbCB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLk1hcCNnZXRBcnJheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1ZbXX0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtBcnJheS48Kj59IEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoaXMgTWFwLlxyXG4gICAgICovXHJcbiAgICBnZXRBcnJheTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0cHV0ID0gW107XHJcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBlbnRyaWVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb3V0cHV0LnB1c2goZW50cmllc1trZXldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBleGlzdHMgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI2hhc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge0t9IC0gW2tleV1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgZWxlbWVudCB0byB0ZXN0IGZvciBwcmVzZW5jZSBvZiBpbiB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZXhpc3RzIGluIHRoaXMgTWFwLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaGFzOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5lbnRyaWVzLmhhc093blByb3BlcnR5KGtleSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLk1hcCNkZWxldGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtLfSAtIFtrZXldXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuTWFwLjxLLCBWPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgZWxlbWVudCB0byBkZWxldGUgZnJvbSB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5NYXB9IFRoaXMgTWFwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZGVsZXRlOiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZW50cmllc1trZXldO1xyXG4gICAgICAgICAgICB0aGlzLnNpemUtLTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlbGV0ZSBhbGwgZW50cmllcyBmcm9tIHRoaXMgTWFwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI2NsZWFyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuTWFwLjxLLCBWPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5NYXB9IFRoaXMgTWFwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5lbnRyaWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZW50cmllc1twcm9wXTtcclxuXHJcbiAgICAgICAgfSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYWxsIGVudHJpZXMga2V5cyBpbiB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLk1hcCNrZXlzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7S1tdfSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBjb250YWluaW5nIGVudHJpZXMnIGtleXMuXHJcbiAgICAgKi9cclxuICAgIGtleXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZW50cmllcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBgQXJyYXlgIG9mIGFsbCBlbnRyaWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI3ZhbHVlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1ZbXX0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtBcnJheS48Kj59IEFuIGBBcnJheWAgb2YgZW50cmllcy5cclxuICAgICAqL1xyXG4gICAgdmFsdWVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcclxuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGVudHJpZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChlbnRyaWVzW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEdW1wcyB0aGUgY29udGVudHMgb2YgdGhpcyBNYXAgdG8gdGhlIGNvbnNvbGUgdmlhIGBjb25zb2xlLmdyb3VwYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLk1hcCNkdW1wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZHVtcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcclxuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICBjb25zb2xlLmdyb3VwKCdNYXAnKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGVudHJpZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhrZXksIGVudHJpZXNba2V5XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgYWxsIGVudHJpZXMgaW4gdGhpcyBNYXAgdG8gdGhlIGdpdmVuIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI2VhY2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtFYWNoTWFwQ2FsbGJhY2suPFY+fSAtIFtjYWxsYmFja11cclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5NYXAuPEssIFY+fSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWFjaE1hcENhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIGtleXMgYW5kIGVudHJpZXMgaGVsZCBpbiB0aGlzIE1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5NYXB9IFRoaXMgTWFwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZW50cmllcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhrZXksIGVudHJpZXNba2V5XSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGV4aXN0cyB3aXRoaW4gdGhpcyBNYXAuIE90aGVyd2lzZSwgcmV0dXJucyBgZmFsc2VgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI2NvbnRhaW5zXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7Vn0gLSBbdmFsdWVdXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gICAgICovXHJcbiAgICBjb250YWluczogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZW50cmllcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyaWVzW2tleV0gPT09IHZhbHVlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1lcmdlcyBhbGwgbmV3IGtleXMgZnJvbSB0aGUgZ2l2ZW4gTWFwIGludG8gdGhpcyBvbmUuXHJcbiAgICAgKiBJZiBpdCBlbmNvdW50ZXJzIGEga2V5IHRoYXQgYWxyZWFkeSBleGlzdHMgaXQgd2lsbCBiZSBza2lwcGVkIHVubGVzcyBvdmVycmlkZSBpcyBzZXQgdG8gYHRydWVgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuTWFwI21lcmdlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuTWFwLjxLLCBWPn0gLSBbbWFwLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU3RydWN0cy5NYXB9IG1hcCAtIFRoZSBNYXAgdG8gbWVyZ2UgaW4gdG8gdGhpcyBNYXAuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVycmlkZT1mYWxzZV0gLSBTZXQgdG8gYHRydWVgIHRvIHJlcGxhY2UgdmFsdWVzIGluIHRoaXMgTWFwIHdpdGggdGhvc2UgZnJvbSB0aGUgc291cmNlIG1hcCwgb3IgYGZhbHNlYCB0byBza2lwIHRoZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuTWFwfSBUaGlzIE1hcCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG1lcmdlOiBmdW5jdGlvbiAobWFwLCBvdmVycmlkZSlcclxuICAgIHtcclxuICAgICAgICBpZiAob3ZlcnJpZGUgPT09IHVuZGVmaW5lZCkgeyBvdmVycmlkZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBsb2NhbCA9IHRoaXMuZW50cmllcztcclxuICAgICAgICB2YXIgc291cmNlID0gbWFwLmVudHJpZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobG9jYWwuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvdmVycmlkZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxba2V5XSA9IHNvdXJjZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBzb3VyY2Vba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgUHJvY2VzcyBRdWV1ZSBtYWludGFpbnMgdGhyZWUgaW50ZXJuYWwgbGlzdHMuXHJcbiAqIFxyXG4gKiBUaGUgYHBlbmRpbmdgIGxpc3QgaXMgYSBzZWxlY3Rpb24gb2YgaXRlbXMgd2hpY2ggYXJlIGR1ZSB0byBiZSBtYWRlICdhY3RpdmUnIGluIHRoZSBuZXh0IHVwZGF0ZS5cclxuICogVGhlIGBhY3RpdmVgIGxpc3QgaXMgYSBzZWxlY3Rpb24gb2YgaXRlbXMgd2hpY2ggYXJlIGNvbnNpZGVyZWQgYWN0aXZlIGFuZCBzaG91bGQgYmUgdXBkYXRlZC5cclxuICogVGhlIGBkZXN0cm95YCBsaXN0IGlzIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgd2VyZSBhY3RpdmUgYW5kIGFyZSBhd2FpdGluZyBiZWluZyBkZXN0cm95ZWQgaW4gdGhlIG5leHQgdXBkYXRlLlxyXG4gKlxyXG4gKiBXaGVuIG5ldyBpdGVtcyBhcmUgYWRkZWQgdG8gYSBQcm9jZXNzIFF1ZXVlIHRoZXkgYXJlIHB1dCBpbiB0aGUgcGVuZGluZyBsaXN0LCByYXRoZXIgdGhhbiBiZWluZyBhZGRlZFxyXG4gKiBpbW1lZGlhdGVseSB0aGUgYWN0aXZlIGxpc3QuIEVxdWFsbHksIGl0ZW1zIHRoYXQgYXJlIHJlbW92ZWQgYXJlIHB1dCBpbnRvIHRoZSBkZXN0cm95IGxpc3QsIHJhdGhlciB0aGFuXHJcbiAqIGJlaW5nIGRlc3Ryb3llZCBpbW1lZGlhdGVseS4gVGhpcyBhbGxvd3MgdGhlIFByb2Nlc3MgUXVldWUgdG8gY2FyZWZ1bGx5IHByb2Nlc3MgZWFjaCBpdGVtIGF0IGEgc3BlY2lmaWMsIGZpeGVkXHJcbiAqIHRpbWUsIHJhdGhlciB0aGFuIGF0IHRoZSB0aW1lIG9mIHRoZSByZXF1ZXN0IGZyb20gdGhlIEFQSS5cclxuICpcclxuICogQGNsYXNzIFByb2Nlc3NRdWV1ZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlN0cnVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqL1xyXG52YXIgUHJvY2Vzc1F1ZXVlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBQcm9jZXNzUXVldWUgKClcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGBwZW5kaW5nYCBsaXN0IGlzIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIHdoaWNoIGFyZSBkdWUgdG8gYmUgbWFkZSAnYWN0aXZlJyBpbiB0aGUgbmV4dCB1cGRhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFskdHlwZV1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlByb2Nlc3NRdWV1ZSNfcGVuZGluZ1xyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48Kj59XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGBhY3RpdmVgIGxpc3QgaXMgYSBzZWxlY3Rpb24gb2YgaXRlbXMgd2hpY2ggYXJlIGNvbnNpZGVyZWQgYWN0aXZlIGFuZCBzaG91bGQgYmUgdXBkYXRlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBnZW5lcmljVXNlIHtUW119IC0gWyR0eXBlXVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuUHJvY2Vzc1F1ZXVlI19hY3RpdmVcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPCo+fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGBkZXN0cm95YCBsaXN0IGlzIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgd2VyZSBhY3RpdmUgYW5kIGFyZSBhd2FpdGluZyBiZWluZyBkZXN0cm95ZWQgaW4gdGhlIG5leHQgdXBkYXRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQGdlbmVyaWNVc2Uge1RbXX0gLSBbJHR5cGVdXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUjX2Rlc3Ryb3lcclxuICAgICAgICAgKiBAdHlwZSB7QXJyYXkuPCo+fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQGRlZmF1bHQgW11cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kZXN0cm95ID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYXdhaXRpbmcgcHJvY2Vzc2luZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlByb2Nlc3NRdWV1ZSNfdG9Qcm9jZXNzXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fdG9Qcm9jZXNzID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGl0ZW0gdG8gdGhlIFByb2Nlc3MgUXVldWUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBpdGVtIGlzIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGxpc3QgYW5kIG1hZGUgYWN0aXZlIGluIHRoZSBuZXh0IHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlByb2Nlc3NRdWV1ZSNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFtpdGVtXVxyXG4gICAgICogQGdlbmVyaWNVc2Uge1BoYXNlci5TdHJ1Y3RzLlByb2Nlc3NRdWV1ZS48VD59IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBxdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB0aGF0IHdhcyBhZGRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkOiBmdW5jdGlvbiAoaXRlbSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nLnB1c2goaXRlbSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcysrO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgUHJvY2VzcyBRdWV1ZS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIHBlbmRpbmcgZGVzdHJveSBhbmQgZnVsbHkgcmVtb3ZlZCBpbiB0aGUgbmV4dCB1cGRhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUjcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbaXRlbV1cclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUuPFQ+fSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gaXRlbSAtIFRoZSBpdGVtIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGl0ZW0gdGhhdCB3YXMgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoaXRlbSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9kZXN0cm95LnB1c2goaXRlbSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcysrO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBhY3RpdmUgaXRlbXMgZnJvbSB0aGlzIFByb2Nlc3MgUXVldWUuXHJcbiAgICAgKiBcclxuICAgICAqIEFsbCB0aGUgaXRlbXMgYXJlIG1hcmtlZCBhcyAncGVuZGluZyBkZXN0cm95JyBhbmQgZnVsbHkgcmVtb3ZlZCBpbiB0aGUgbmV4dCB1cGRhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUjcmVtb3ZlQWxsXHJcbiAgICAgKiBAc2luY2UgMy4yMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBQcm9jZXNzIFF1ZXVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQWxsOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fYWN0aXZlO1xyXG4gICAgICAgIHZhciBkZXN0cm95ID0gdGhpcy5fZGVzdHJveTtcclxuICAgICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoO1xyXG5cclxuICAgICAgICB3aGlsZSAoaS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVzdHJveS5wdXNoKGxpc3RbaV0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdG9Qcm9jZXNzKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhpcyBxdWV1ZS4gRmlyc3QgaXQgd2lsbCBwcm9jZXNzIGFueSBpdGVtcyBhd2FpdGluZyBkZXN0cnVjdGlvbiwgYW5kIHJlbW92ZSB0aGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGVuIGl0IHdpbGwgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgaXRlbXMgcGVuZGluZyBpbnNlcnRpb24sIGFuZCBtb3ZlIHRoZW0gdG8gYW5cclxuICAgICAqIGFjdGl2ZSBzdGF0ZS4gRmluYWxseSwgaXQgd2lsbCByZXR1cm4gYSBsaXN0IG9mIGFjdGl2ZSBpdGVtcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuUHJvY2Vzc1F1ZXVlI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1RbXX0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtBcnJheS48Kj59IEEgbGlzdCBvZiBhY3RpdmUgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5fdG9Qcm9jZXNzID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFF1aWNrIGJhaWxcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fZGVzdHJveTtcclxuICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5fYWN0aXZlO1xyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBpdGVtO1xyXG5cclxuICAgICAgICAvLyAgQ2xlYXIgdGhlICdkZXN0cm95JyBsaXN0XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBSZW1vdmUgZnJvbSB0aGUgJ2FjdGl2ZScgYXJyYXlcclxuICAgICAgICAgICAgdmFyIGlkeCA9IGFjdGl2ZS5pbmRleE9mKGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZS5zcGxpY2UoaWR4LCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLlJFTU9WRSwgaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxpc3QubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgLy8gIFByb2Nlc3MgdGhlIHBlbmRpbmcgYWRkaXRpb24gbGlzdFxyXG4gICAgICAgIC8vICBUaGlzIHN0b3BzIGNhbGxiYWNrcyBhbmQgb3V0IG9mIHN5bmMgZXZlbnRzIGZyb20gcG9wdWxhdGluZyB0aGUgYWN0aXZlIGFycmF5IG1pZC13YXkgZHVyaW5nIGFuIHVwZGF0ZVxyXG5cclxuICAgICAgICBsaXN0ID0gdGhpcy5fcGVuZGluZztcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS5wdXNoKGl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5BREQsIGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGlzdC5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICB0aGlzLl90b1Byb2Nlc3MgPSAwO1xyXG5cclxuICAgICAgICAvLyAgVGhlIG93bmVyIG9mIHRoaXMgcXVldWUgY2FuIG5vdyBzYWZlbHkgZG8gd2hhdGV2ZXIgaXQgbmVlZHMgdG8gd2l0aCB0aGUgYWN0aXZlIGxpc3RcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBhY3RpdmUgaXRlbXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdGl2ZSBsaXN0IGFycmF5LCBub3QgYSBjb3B5IG9mIGl0LlxyXG4gICAgICogVGhlcmVmb3JlLCBiZSBjYXJlZnVsIHRvIG5vdCBtb2RpZnkgdGhpcyBhcnJheSBvdXRzaWRlIG9mIHRoZSBQcm9jZXNzUXVldWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUjZ2V0QWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0FycmF5LjwqPn0gQSBsaXN0IG9mIGFjdGl2ZSBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgZ2V0QWN0aXZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhY3RpdmUgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5Qcm9jZXNzUXVldWUjbGVuZ3RoXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMjAuMFxyXG4gICAgICovXHJcbiAgICBsZW5ndGg6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZS5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbW1lZGlhdGVseSBkZXN0cm95cyB0aGlzIHByb2Nlc3MgcXVldWUsIGNsZWFyaW5nIGFsbCBvZiBpdHMgaW50ZXJuYWwgYXJyYXlzIGFuZCByZXNldHRpbmcgdGhlIHByb2Nlc3MgdG90YWxzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuUHJvY2Vzc1F1ZXVlI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcyA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBbXTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95ID0gW107XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUHJvY2Vzc1F1ZXVlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBWbGFkaW1pciBBZ2Fmb25raW5cclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBxdWlja3NlbGVjdCA9IHJlcXVpcmUoJy4uL3V0aWxzL2FycmF5L1F1aWNrU2VsZWN0Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBSQnVzaCBpcyBhIGhpZ2gtcGVyZm9ybWFuY2UgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciAyRCBzcGF0aWFsIGluZGV4aW5nIG9mIHBvaW50cyBhbmQgcmVjdGFuZ2xlcy5cclxuICogSXQncyBiYXNlZCBvbiBhbiBvcHRpbWl6ZWQgUi10cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggYnVsayBpbnNlcnRpb24gc3VwcG9ydC5cclxuICpcclxuICogU3BhdGlhbCBpbmRleCBpcyBhIHNwZWNpYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIHBvaW50cyBhbmQgcmVjdGFuZ2xlcyB0aGF0IGFsbG93cyB5b3UgdG8gcGVyZm9ybSBxdWVyaWVzIGxpa2VcclxuICogXCJhbGwgaXRlbXMgd2l0aGluIHRoaXMgYm91bmRpbmcgYm94XCIgdmVyeSBlZmZpY2llbnRseSAoZS5nLiBodW5kcmVkcyBvZiB0aW1lcyBmYXN0ZXIgdGhhbiBsb29waW5nIG92ZXIgYWxsIGl0ZW1zKS5cclxuICpcclxuICogVGhpcyB2ZXJzaW9uIG9mIFJCdXNoIHVzZXMgYSBmaXhlZCBtaW4vbWF4IGFjY2Vzc29yIHN0cnVjdHVyZSBvZiBgWyAnLmxlZnQnLCAnLnRvcCcsICcucmlnaHQnLCAnLmJvdHRvbScgXWAuXHJcbiAqIFRoaXMgaXMgdG8gYXZvaWQgdGhlIGV2YWwgbGlrZSBmdW5jdGlvbiBjcmVhdGlvbiB0aGF0IHRoZSBvcmlnaW5hbCBsaWJyYXJ5IHVzZWQsIHdoaWNoIGNhdXNlZCBDU1AgcG9saWN5IHZpb2xhdGlvbnMuXHJcbiAqIFxyXG4gKiByYnVzaCBpcyBmb3JrZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9yYnVzaCBieSBWbGFkaW1pciBBZ2Fmb25raW5cclxuICpcclxuICogQGNsYXNzIFJUcmVlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuU3RydWN0c1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gcmJ1c2ggKG1heEVudHJpZXMpXHJcbntcclxuICAgIHZhciBmb3JtYXQgPSBbICcubGVmdCcsICcudG9wJywgJy5yaWdodCcsICcuYm90dG9tJyBdO1xyXG5cclxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiByYnVzaCkpIHJldHVybiBuZXcgcmJ1c2gobWF4RW50cmllcywgZm9ybWF0KTtcclxuXHJcbiAgICAvLyBtYXggZW50cmllcyBpbiBhIG5vZGUgaXMgOSBieSBkZWZhdWx0OyBtaW4gbm9kZSBmaWxsIGlzIDQwJSBmb3IgYmVzdCBwZXJmb3JtYW5jZVxyXG4gICAgdGhpcy5fbWF4RW50cmllcyA9IE1hdGgubWF4KDQsIG1heEVudHJpZXMgfHwgOSk7XHJcbiAgICB0aGlzLl9taW5FbnRyaWVzID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKHRoaXMuX21heEVudHJpZXMgKiAwLjQpKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbn1cclxuXHJcbnJidXNoLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBhbGw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbCh0aGlzLmRhdGEsIFtdKTtcclxuICAgIH0sXHJcblxyXG4gICAgc2VhcmNoOiBmdW5jdGlvbiAoYmJveClcclxuICAgIHtcclxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSxcclxuICAgICAgICAgICAgcmVzdWx0ID0gW10sXHJcbiAgICAgICAgICAgIHRvQkJveCA9IHRoaXMudG9CQm94O1xyXG5cclxuICAgICAgICBpZiAoIWludGVyc2VjdHMoYmJveCwgbm9kZSkpIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW10sXHJcbiAgICAgICAgICAgIGksIGxlbiwgY2hpbGQsIGNoaWxkQkJveDtcclxuXHJcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgICAgIGNoaWxkQkJveCA9IG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyhiYm94LCBjaGlsZEJCb3gpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVhZikgcmVzdWx0LnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRhaW5zKGJib3gsIGNoaWxkQkJveCkpIHRoaXMuX2FsbChjaGlsZCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIG5vZGVzVG9TZWFyY2gucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZSA9IG5vZGVzVG9TZWFyY2gucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSxcclxuXHJcbiAgICBjb2xsaWRlczogZnVuY3Rpb24gKGJib3gpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmRhdGEsXHJcbiAgICAgICAgICAgIHRvQkJveCA9IHRoaXMudG9CQm94O1xyXG5cclxuICAgICAgICBpZiAoIWludGVyc2VjdHMoYmJveCwgbm9kZSkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIG5vZGVzVG9TZWFyY2ggPSBbXSxcclxuICAgICAgICAgICAgaSwgbGVuLCBjaGlsZCwgY2hpbGRCQm94O1xyXG5cclxuICAgICAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRCQm94ID0gbm9kZS5sZWFmID8gdG9CQm94KGNoaWxkKSA6IGNoaWxkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3RzKGJib3gsIGNoaWxkQkJveCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWFmIHx8IGNvbnRhaW5zKGJib3gsIGNoaWxkQkJveCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzVG9TZWFyY2gucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZSA9IG5vZGVzVG9TZWFyY2gucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIGxvYWQ6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghKGRhdGEgJiYgZGF0YS5sZW5ndGgpKSByZXR1cm4gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgdGhpcy5fbWluRW50cmllcykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoZGF0YVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZWN1cnNpdmVseSBidWlsZCB0aGUgdHJlZSB3aXRoIHRoZSBnaXZlbiBkYXRhIGZyb20gc2NyYXRjaCB1c2luZyBPTVQgYWxnb3JpdGhtXHJcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9idWlsZChkYXRhLnNsaWNlKCksIDAsIGRhdGEubGVuZ3RoIC0gMSwgMCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBzYXZlIGFzIGlzIGlmIHRyZWUgaXMgZW1wdHlcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbm9kZTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuaGVpZ2h0ID09PSBub2RlLmhlaWdodCkge1xyXG4gICAgICAgICAgICAvLyBzcGxpdCByb290IGlmIHRyZWVzIGhhdmUgdGhlIHNhbWUgaGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsIG5vZGUpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmhlaWdodCA8IG5vZGUuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzd2FwIHRyZWVzIGlmIGluc2VydGVkIG9uZSBpcyBiaWdnZXJcclxuICAgICAgICAgICAgICAgIHZhciB0bXBOb2RlID0gdGhpcy5kYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbm9kZTtcclxuICAgICAgICAgICAgICAgIG5vZGUgPSB0bXBOb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpbnNlcnQgdGhlIHNtYWxsIHRyZWUgaW50byB0aGUgbGFyZ2UgdHJlZSBhdCBhcHByb3ByaWF0ZSBsZXZlbFxyXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQobm9kZSwgdGhpcy5kYXRhLmhlaWdodCAtIG5vZGUuaGVpZ2h0IC0gMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgaW5zZXJ0OiBmdW5jdGlvbiAoaXRlbSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaXRlbSkgdGhpcy5faW5zZXJ0KGl0ZW0sIHRoaXMuZGF0YS5oZWlnaHQgLSAxKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gY3JlYXRlTm9kZShbXSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlbW92ZTogZnVuY3Rpb24gKGl0ZW0sIGVxdWFsc0ZuKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5kYXRhLFxyXG4gICAgICAgICAgICBiYm94ID0gdGhpcy50b0JCb3goaXRlbSksXHJcbiAgICAgICAgICAgIHBhdGggPSBbXSxcclxuICAgICAgICAgICAgaW5kZXhlcyA9IFtdLFxyXG4gICAgICAgICAgICBpLCBwYXJlbnQsIGluZGV4LCBnb2luZ1VwO1xyXG5cclxuICAgICAgICAvLyBkZXB0aC1maXJzdCBpdGVyYXRpdmUgdHJlZSB0cmF2ZXJzYWxcclxuICAgICAgICB3aGlsZSAobm9kZSB8fCBwYXRoLmxlbmd0aCkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFub2RlKSB7IC8vIGdvIHVwXHJcbiAgICAgICAgICAgICAgICBub2RlID0gcGF0aC5wb3AoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIGkgPSBpbmRleGVzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgZ29pbmdVcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLmxlYWYpIHsgLy8gY2hlY2sgY3VycmVudCBub2RlXHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZpbmRJdGVtKGl0ZW0sIG5vZGUuY2hpbGRyZW4sIGVxdWFsc0ZuKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBmb3VuZCwgcmVtb3ZlIHRoZSBpdGVtIGFuZCBjb25kZW5zZSB0cmVlIHVwd2FyZHNcclxuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbmRlbnNlKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWdvaW5nVXAgJiYgIW5vZGUubGVhZiAmJiBjb250YWlucyhub2RlLCBiYm94KSkgeyAvLyBnbyBkb3duXHJcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICBpID0gMDtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50KSB7IC8vIGdvIHJpZ2h0XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50LmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgZ29pbmdVcCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIG5vZGUgPSBudWxsOyAvLyBub3RoaW5nIGZvdW5kXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgdG9CQm94OiBmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbTsgfSxcclxuXHJcbiAgICBjb21wYXJlTWluWDogY29tcGFyZU5vZGVNaW5YLFxyXG4gICAgY29tcGFyZU1pblk6IGNvbXBhcmVOb2RlTWluWSxcclxuXHJcbiAgICB0b0pTT046IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZGF0YTsgfSxcclxuXHJcbiAgICBmcm9tSlNPTjogZnVuY3Rpb24gKGRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgX2FsbDogZnVuY3Rpb24gKG5vZGUsIHJlc3VsdClcclxuICAgIHtcclxuICAgICAgICB2YXIgbm9kZXNUb1NlYXJjaCA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLmxlYWYpIHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgbm9kZS5jaGlsZHJlbik7XHJcbiAgICAgICAgICAgIGVsc2Ugbm9kZXNUb1NlYXJjaC5wdXNoLmFwcGx5KG5vZGVzVG9TZWFyY2gsIG5vZGUuY2hpbGRyZW4pO1xyXG5cclxuICAgICAgICAgICAgbm9kZSA9IG5vZGVzVG9TZWFyY2gucG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIF9idWlsZDogZnVuY3Rpb24gKGl0ZW1zLCBsZWZ0LCByaWdodCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBOID0gcmlnaHQgLSBsZWZ0ICsgMSxcclxuICAgICAgICAgICAgTSA9IHRoaXMuX21heEVudHJpZXMsXHJcbiAgICAgICAgICAgIG5vZGU7XHJcblxyXG4gICAgICAgIGlmIChOIDw9IE0pIHtcclxuICAgICAgICAgICAgLy8gcmVhY2hlZCBsZWFmIGxldmVsOyByZXR1cm4gbGVhZlxyXG4gICAgICAgICAgICBub2RlID0gY3JlYXRlTm9kZShpdGVtcy5zbGljZShsZWZ0LCByaWdodCArIDEpKTtcclxuICAgICAgICAgICAgY2FsY0JCb3gobm9kZSwgdGhpcy50b0JCb3gpO1xyXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIC8vIHRhcmdldCBoZWlnaHQgb2YgdGhlIGJ1bGstbG9hZGVkIHRyZWVcclxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubG9nKE4pIC8gTWF0aC5sb2coTSkpO1xyXG5cclxuICAgICAgICAgICAgLy8gdGFyZ2V0IG51bWJlciBvZiByb290IGVudHJpZXMgdG8gbWF4aW1pemUgc3RvcmFnZSB1dGlsaXphdGlvblxyXG4gICAgICAgICAgICBNID0gTWF0aC5jZWlsKE4gLyBNYXRoLnBvdyhNLCBoZWlnaHQgLSAxKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlID0gY3JlYXRlTm9kZShbXSk7XHJcbiAgICAgICAgbm9kZS5sZWFmID0gZmFsc2U7XHJcbiAgICAgICAgbm9kZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIHNwbGl0IHRoZSBpdGVtcyBpbnRvIE0gbW9zdGx5IHNxdWFyZSB0aWxlc1xyXG5cclxuICAgICAgICB2YXIgTjIgPSBNYXRoLmNlaWwoTiAvIE0pLFxyXG4gICAgICAgICAgICBOMSA9IE4yICogTWF0aC5jZWlsKE1hdGguc3FydChNKSksXHJcbiAgICAgICAgICAgIGksIGosIHJpZ2h0MiwgcmlnaHQzO1xyXG5cclxuICAgICAgICBtdWx0aVNlbGVjdChpdGVtcywgbGVmdCwgcmlnaHQsIE4xLCB0aGlzLmNvbXBhcmVNaW5YKTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gbGVmdDsgaSA8PSByaWdodDsgaSArPSBOMSkge1xyXG5cclxuICAgICAgICAgICAgcmlnaHQyID0gTWF0aC5taW4oaSArIE4xIC0gMSwgcmlnaHQpO1xyXG5cclxuICAgICAgICAgICAgbXVsdGlTZWxlY3QoaXRlbXMsIGksIHJpZ2h0MiwgTjIsIHRoaXMuY29tcGFyZU1pblkpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8PSByaWdodDI7IGogKz0gTjIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICByaWdodDMgPSBNYXRoLm1pbihqICsgTjIgLSAxLCByaWdodDIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHBhY2sgZWFjaCBlbnRyeSByZWN1cnNpdmVseVxyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKHRoaXMuX2J1aWxkKGl0ZW1zLCBqLCByaWdodDMsIGhlaWdodCAtIDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FsY0JCb3gobm9kZSwgdGhpcy50b0JCb3gpO1xyXG5cclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH0sXHJcblxyXG4gICAgX2Nob29zZVN1YnRyZWU6IGZ1bmN0aW9uIChiYm94LCBub2RlLCBsZXZlbCwgcGF0aClcclxuICAgIHtcclxuICAgICAgICB2YXIgaSwgbGVuLCBjaGlsZCwgdGFyZ2V0Tm9kZSwgYXJlYSwgZW5sYXJnZW1lbnQsIG1pbkFyZWEsIG1pbkVubGFyZ2VtZW50O1xyXG5cclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBwYXRoLnB1c2gobm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmIHx8IHBhdGgubGVuZ3RoIC0gMSA9PT0gbGV2ZWwpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgbWluQXJlYSA9IG1pbkVubGFyZ2VtZW50ID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICBhcmVhID0gYmJveEFyZWEoY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgZW5sYXJnZW1lbnQgPSBlbmxhcmdlZEFyZWEoYmJveCwgY2hpbGQpIC0gYXJlYTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjaG9vc2UgZW50cnkgd2l0aCB0aGUgbGVhc3QgYXJlYSBlbmxhcmdlbWVudFxyXG4gICAgICAgICAgICAgICAgaWYgKGVubGFyZ2VtZW50IDwgbWluRW5sYXJnZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5FbmxhcmdlbWVudCA9IGVubGFyZ2VtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhIDwgbWluQXJlYSA/IGFyZWEgOiBtaW5BcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBjaGlsZDtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVubGFyZ2VtZW50ID09PSBtaW5FbmxhcmdlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjaG9vc2Ugb25lIHdpdGggdGhlIHNtYWxsZXN0IGFyZWFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluQXJlYSA9IGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG5vZGUgPSB0YXJnZXROb2RlIHx8IG5vZGUuY2hpbGRyZW5bMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH0sXHJcblxyXG4gICAgX2luc2VydDogZnVuY3Rpb24gKGl0ZW0sIGxldmVsLCBpc05vZGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRvQkJveCA9IHRoaXMudG9CQm94LFxyXG4gICAgICAgICAgICBiYm94ID0gaXNOb2RlID8gaXRlbSA6IHRvQkJveChpdGVtKSxcclxuICAgICAgICAgICAgaW5zZXJ0UGF0aCA9IFtdO1xyXG5cclxuICAgICAgICAvLyBmaW5kIHRoZSBiZXN0IG5vZGUgZm9yIGFjY29tbW9kYXRpbmcgdGhlIGl0ZW0sIHNhdmluZyBhbGwgbm9kZXMgYWxvbmcgdGhlIHBhdGggdG9vXHJcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9jaG9vc2VTdWJ0cmVlKGJib3gsIHRoaXMuZGF0YSwgbGV2ZWwsIGluc2VydFBhdGgpO1xyXG5cclxuICAgICAgICAvLyBwdXQgdGhlIGl0ZW0gaW50byB0aGUgbm9kZVxyXG4gICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChpdGVtKTtcclxuICAgICAgICBleHRlbmQobm9kZSwgYmJveCk7XHJcblxyXG4gICAgICAgIC8vIHNwbGl0IG9uIG5vZGUgb3ZlcmZsb3c7IHByb3BhZ2F0ZSB1cHdhcmRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgIHdoaWxlIChsZXZlbCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRQYXRoW2xldmVsXS5jaGlsZHJlbi5sZW5ndGggPiB0aGlzLl9tYXhFbnRyaWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGxpdChpbnNlcnRQYXRoLCBsZXZlbCk7XHJcbiAgICAgICAgICAgICAgICBsZXZlbC0tO1xyXG4gICAgICAgICAgICB9IGVsc2UgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgYmJveGVzIGFsb25nIHRoZSBpbnNlcnRpb24gcGF0aFxyXG4gICAgICAgIHRoaXMuX2FkanVzdFBhcmVudEJCb3hlcyhiYm94LCBpbnNlcnRQYXRoLCBsZXZlbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHNwbGl0IG92ZXJmbG93ZWQgbm9kZSBpbnRvIHR3b1xyXG4gICAgX3NwbGl0OiBmdW5jdGlvbiAoaW5zZXJ0UGF0aCwgbGV2ZWwpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSBpbnNlcnRQYXRoW2xldmVsXSxcclxuICAgICAgICAgICAgTSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoLFxyXG4gICAgICAgICAgICBtID0gdGhpcy5fbWluRW50cmllcztcclxuXHJcbiAgICAgICAgdGhpcy5fY2hvb3NlU3BsaXRBeGlzKG5vZGUsIG0sIE0pO1xyXG5cclxuICAgICAgICB2YXIgc3BsaXRJbmRleCA9IHRoaXMuX2Nob29zZVNwbGl0SW5kZXgobm9kZSwgbSwgTSk7XHJcblxyXG4gICAgICAgIHZhciBuZXdOb2RlID0gY3JlYXRlTm9kZShub2RlLmNoaWxkcmVuLnNwbGljZShzcGxpdEluZGV4LCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIHNwbGl0SW5kZXgpKTtcclxuICAgICAgICBuZXdOb2RlLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xyXG4gICAgICAgIG5ld05vZGUubGVhZiA9IG5vZGUubGVhZjtcclxuXHJcbiAgICAgICAgY2FsY0JCb3gobm9kZSwgdGhpcy50b0JCb3gpO1xyXG4gICAgICAgIGNhbGNCQm94KG5ld05vZGUsIHRoaXMudG9CQm94KTtcclxuXHJcbiAgICAgICAgaWYgKGxldmVsKSBpbnNlcnRQYXRoW2xldmVsIC0gMV0uY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcclxuICAgICAgICBlbHNlIHRoaXMuX3NwbGl0Um9vdChub2RlLCBuZXdOb2RlKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NwbGl0Um9vdDogZnVuY3Rpb24gKG5vZGUsIG5ld05vZGUpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gc3BsaXQgcm9vdCBub2RlXHJcbiAgICAgICAgdGhpcy5kYXRhID0gY3JlYXRlTm9kZShbbm9kZSwgbmV3Tm9kZV0pO1xyXG4gICAgICAgIHRoaXMuZGF0YS5oZWlnaHQgPSBub2RlLmhlaWdodCArIDE7XHJcbiAgICAgICAgdGhpcy5kYXRhLmxlYWYgPSBmYWxzZTtcclxuICAgICAgICBjYWxjQkJveCh0aGlzLmRhdGEsIHRoaXMudG9CQm94KTtcclxuICAgIH0sXHJcblxyXG4gICAgX2Nob29zZVNwbGl0SW5kZXg6IGZ1bmN0aW9uIChub2RlLCBtLCBNKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpLCBiYm94MSwgYmJveDIsIG92ZXJsYXAsIGFyZWEsIG1pbk92ZXJsYXAsIG1pbkFyZWEsIGluZGV4O1xyXG5cclxuICAgICAgICBtaW5PdmVybGFwID0gbWluQXJlYSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGkgPSBtOyBpIDw9IE0gLSBtOyBpKyspIHtcclxuICAgICAgICAgICAgYmJveDEgPSBkaXN0QkJveChub2RlLCAwLCBpLCB0aGlzLnRvQkJveCk7XHJcbiAgICAgICAgICAgIGJib3gyID0gZGlzdEJCb3gobm9kZSwgaSwgTSwgdGhpcy50b0JCb3gpO1xyXG5cclxuICAgICAgICAgICAgb3ZlcmxhcCA9IGludGVyc2VjdGlvbkFyZWEoYmJveDEsIGJib3gyKTtcclxuICAgICAgICAgICAgYXJlYSA9IGJib3hBcmVhKGJib3gxKSArIGJib3hBcmVhKGJib3gyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNob29zZSBkaXN0cmlidXRpb24gd2l0aCBtaW5pbXVtIG92ZXJsYXBcclxuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPCBtaW5PdmVybGFwKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5PdmVybGFwID0gb3ZlcmxhcDtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuXHJcbiAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3ZlcmxhcCA9PT0gbWluT3ZlcmxhcCkge1xyXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBkaXN0cmlidXRpb24gd2l0aCBtaW5pbXVtIGFyZWFcclxuICAgICAgICAgICAgICAgIGlmIChhcmVhIDwgbWluQXJlYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyBzb3J0cyBub2RlIGNoaWxkcmVuIGJ5IHRoZSBiZXN0IGF4aXMgZm9yIHNwbGl0XHJcbiAgICBfY2hvb3NlU3BsaXRBeGlzOiBmdW5jdGlvbiAobm9kZSwgbSwgTSlcclxuICAgIHtcclxuICAgICAgICB2YXIgY29tcGFyZU1pblggPSBub2RlLmxlYWYgPyB0aGlzLmNvbXBhcmVNaW5YIDogY29tcGFyZU5vZGVNaW5YLFxyXG4gICAgICAgICAgICBjb21wYXJlTWluWSA9IG5vZGUubGVhZiA/IHRoaXMuY29tcGFyZU1pblkgOiBjb21wYXJlTm9kZU1pblksXHJcbiAgICAgICAgICAgIHhNYXJnaW4gPSB0aGlzLl9hbGxEaXN0TWFyZ2luKG5vZGUsIG0sIE0sIGNvbXBhcmVNaW5YKSxcclxuICAgICAgICAgICAgeU1hcmdpbiA9IHRoaXMuX2FsbERpc3RNYXJnaW4obm9kZSwgbSwgTSwgY29tcGFyZU1pblkpO1xyXG5cclxuICAgICAgICAvLyBpZiB0b3RhbCBkaXN0cmlidXRpb25zIG1hcmdpbiB2YWx1ZSBpcyBtaW5pbWFsIGZvciB4LCBzb3J0IGJ5IG1pblgsXHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0J3MgYWxyZWFkeSBzb3J0ZWQgYnkgbWluWVxyXG4gICAgICAgIGlmICh4TWFyZ2luIDwgeU1hcmdpbikgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmVNaW5YKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8gdG90YWwgbWFyZ2luIG9mIGFsbCBwb3NzaWJsZSBzcGxpdCBkaXN0cmlidXRpb25zIHdoZXJlIGVhY2ggbm9kZSBpcyBhdCBsZWFzdCBtIGZ1bGxcclxuICAgIF9hbGxEaXN0TWFyZ2luOiBmdW5jdGlvbiAobm9kZSwgbSwgTSwgY29tcGFyZSlcclxuICAgIHtcclxuICAgICAgICBub2RlLmNoaWxkcmVuLnNvcnQoY29tcGFyZSk7XHJcblxyXG4gICAgICAgIHZhciB0b0JCb3ggPSB0aGlzLnRvQkJveCxcclxuICAgICAgICAgICAgbGVmdEJCb3ggPSBkaXN0QkJveChub2RlLCAwLCBtLCB0b0JCb3gpLFxyXG4gICAgICAgICAgICByaWdodEJCb3ggPSBkaXN0QkJveChub2RlLCBNIC0gbSwgTSwgdG9CQm94KSxcclxuICAgICAgICAgICAgbWFyZ2luID0gYmJveE1hcmdpbihsZWZ0QkJveCkgKyBiYm94TWFyZ2luKHJpZ2h0QkJveCksXHJcbiAgICAgICAgICAgIGksIGNoaWxkO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSBtOyBpIDwgTSAtIG07IGkrKykge1xyXG4gICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGV4dGVuZChsZWZ0QkJveCwgbm9kZS5sZWFmID8gdG9CQm94KGNoaWxkKSA6IGNoaWxkKTtcclxuICAgICAgICAgICAgbWFyZ2luICs9IGJib3hNYXJnaW4obGVmdEJCb3gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gTSAtIG0gLSAxOyBpID49IG07IGktLSkge1xyXG4gICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGV4dGVuZChyaWdodEJCb3gsIG5vZGUubGVhZiA/IHRvQkJveChjaGlsZCkgOiBjaGlsZCk7XHJcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKHJpZ2h0QkJveCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWFyZ2luO1xyXG4gICAgfSxcclxuXHJcbiAgICBfYWRqdXN0UGFyZW50QkJveGVzOiBmdW5jdGlvbiAoYmJveCwgcGF0aCwgbGV2ZWwpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gYWRqdXN0IGJib3hlcyBhbG9uZyB0aGUgZ2l2ZW4gdHJlZSBwYXRoXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGxldmVsOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBleHRlbmQocGF0aFtpXSwgYmJveCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBfY29uZGVuc2U6IGZ1bmN0aW9uIChwYXRoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIHBhdGgsIHJlbW92aW5nIGVtcHR5IG5vZGVzIGFuZCB1cGRhdGluZyBiYm94ZXNcclxuICAgICAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxLCBzaWJsaW5nczsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgaWYgKHBhdGhbaV0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncyA9IHBhdGhbaSAtIDFdLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnNwbGljZShzaWJsaW5ncy5pbmRleE9mKHBhdGhbaV0pLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGNhbGNCQm94KHBhdGhbaV0sIHRoaXMudG9CQm94KTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNvbXBhcmVNaW5YOiBmdW5jdGlvbiAoYSwgYilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gYS5sZWZ0IC0gYi5sZWZ0O1xyXG4gICAgfSxcclxuXHJcbiAgICBjb21wYXJlTWluWTogZnVuY3Rpb24gKGEsIGIpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGEudG9wIC0gYi50b3A7XHJcbiAgICB9LFxyXG5cclxuICAgIHRvQkJveDogZnVuY3Rpb24gKGEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbWluWDogYS5sZWZ0LFxyXG4gICAgICAgICAgICBtaW5ZOiBhLnRvcCxcclxuICAgICAgICAgICAgbWF4WDogYS5yaWdodCxcclxuICAgICAgICAgICAgbWF4WTogYS5ib3R0b21cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZmluZEl0ZW0gKGl0ZW0sIGl0ZW1zLCBlcXVhbHNGbilcclxue1xyXG4gICAgaWYgKCFlcXVhbHNGbikgcmV0dXJuIGl0ZW1zLmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChlcXVhbHNGbihpdGVtLCBpdGVtc1tpXSkpIHJldHVybiBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG59XHJcblxyXG4vLyBjYWxjdWxhdGUgbm9kZSdzIGJib3ggZnJvbSBiYm94ZXMgb2YgaXRzIGNoaWxkcmVuXHJcbmZ1bmN0aW9uIGNhbGNCQm94IChub2RlLCB0b0JCb3gpXHJcbntcclxuICAgIGRpc3RCQm94KG5vZGUsIDAsIG5vZGUuY2hpbGRyZW4ubGVuZ3RoLCB0b0JCb3gsIG5vZGUpO1xyXG59XHJcblxyXG4vLyBtaW4gYm91bmRpbmcgcmVjdGFuZ2xlIG9mIG5vZGUgY2hpbGRyZW4gZnJvbSBrIHRvIHAtMVxyXG5mdW5jdGlvbiBkaXN0QkJveCAobm9kZSwgaywgcCwgdG9CQm94LCBkZXN0Tm9kZSlcclxue1xyXG4gICAgaWYgKCFkZXN0Tm9kZSkgZGVzdE5vZGUgPSBjcmVhdGVOb2RlKG51bGwpO1xyXG4gICAgZGVzdE5vZGUubWluWCA9IEluZmluaXR5O1xyXG4gICAgZGVzdE5vZGUubWluWSA9IEluZmluaXR5O1xyXG4gICAgZGVzdE5vZGUubWF4WCA9IC1JbmZpbml0eTtcclxuICAgIGRlc3ROb2RlLm1heFkgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IGssIGNoaWxkOyBpIDwgcDsgaSsrKSB7XHJcbiAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgIGV4dGVuZChkZXN0Tm9kZSwgbm9kZS5sZWFmID8gdG9CQm94KGNoaWxkKSA6IGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVzdE5vZGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dGVuZCAoYSwgYilcclxue1xyXG4gICAgYS5taW5YID0gTWF0aC5taW4oYS5taW5YLCBiLm1pblgpO1xyXG4gICAgYS5taW5ZID0gTWF0aC5taW4oYS5taW5ZLCBiLm1pblkpO1xyXG4gICAgYS5tYXhYID0gTWF0aC5tYXgoYS5tYXhYLCBiLm1heFgpO1xyXG4gICAgYS5tYXhZID0gTWF0aC5tYXgoYS5tYXhZLCBiLm1heFkpO1xyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWCAoYSwgYikgeyByZXR1cm4gYS5taW5YIC0gYi5taW5YOyB9XHJcbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWSAoYSwgYikgeyByZXR1cm4gYS5taW5ZIC0gYi5taW5ZOyB9XHJcblxyXG5mdW5jdGlvbiBiYm94QXJlYSAoYSkgeyByZXR1cm4gKGEubWF4WCAtIGEubWluWCkgKiAoYS5tYXhZIC0gYS5taW5ZKTsgfVxyXG5mdW5jdGlvbiBiYm94TWFyZ2luIChhKSB7IHJldHVybiAoYS5tYXhYIC0gYS5taW5YKSArIChhLm1heFkgLSBhLm1pblkpOyB9XHJcblxyXG5mdW5jdGlvbiBlbmxhcmdlZEFyZWEgKGEsIGIpXHJcbntcclxuICAgIHJldHVybiAoTWF0aC5tYXgoYi5tYXhYLCBhLm1heFgpIC0gTWF0aC5taW4oYi5taW5YLCBhLm1pblgpKSAqXHJcbiAgICAgICAgICAgKE1hdGgubWF4KGIubWF4WSwgYS5tYXhZKSAtIE1hdGgubWluKGIubWluWSwgYS5taW5ZKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGludGVyc2VjdGlvbkFyZWEgKGEsIGIpXHJcbntcclxuICAgIHZhciBtaW5YID0gTWF0aC5tYXgoYS5taW5YLCBiLm1pblgpLFxyXG4gICAgICAgIG1pblkgPSBNYXRoLm1heChhLm1pblksIGIubWluWSksXHJcbiAgICAgICAgbWF4WCA9IE1hdGgubWluKGEubWF4WCwgYi5tYXhYKSxcclxuICAgICAgICBtYXhZID0gTWF0aC5taW4oYS5tYXhZLCBiLm1heFkpO1xyXG5cclxuICAgIHJldHVybiBNYXRoLm1heCgwLCBtYXhYIC0gbWluWCkgKlxyXG4gICAgICAgICAgIE1hdGgubWF4KDAsIG1heFkgLSBtaW5ZKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29udGFpbnMgKGEsIGIpXHJcbntcclxuICAgIHJldHVybiBhLm1pblggPD0gYi5taW5YICYmXHJcbiAgICAgICAgICAgYS5taW5ZIDw9IGIubWluWSAmJlxyXG4gICAgICAgICAgIGIubWF4WCA8PSBhLm1heFggJiZcclxuICAgICAgICAgICBiLm1heFkgPD0gYS5tYXhZO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRlcnNlY3RzIChhLCBiKVxyXG57XHJcbiAgICByZXR1cm4gYi5taW5YIDw9IGEubWF4WCAmJlxyXG4gICAgICAgICAgIGIubWluWSA8PSBhLm1heFkgJiZcclxuICAgICAgICAgICBiLm1heFggPj0gYS5taW5YICYmXHJcbiAgICAgICAgICAgYi5tYXhZID49IGEubWluWTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTm9kZSAoY2hpbGRyZW4pXHJcbntcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgIGhlaWdodDogMSxcclxuICAgICAgICBsZWFmOiB0cnVlLFxyXG4gICAgICAgIG1pblg6IEluZmluaXR5LFxyXG4gICAgICAgIG1pblk6IEluZmluaXR5LFxyXG4gICAgICAgIG1heFg6IC1JbmZpbml0eSxcclxuICAgICAgICBtYXhZOiAtSW5maW5pdHlcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHNvcnQgYW4gYXJyYXkgc28gdGhhdCBpdGVtcyBjb21lIGluIGdyb3VwcyBvZiBuIHVuc29ydGVkIGl0ZW1zLCB3aXRoIGdyb3VwcyBzb3J0ZWQgYmV0d2VlbiBlYWNoIG90aGVyO1xyXG4vLyBjb21iaW5lcyBzZWxlY3Rpb24gYWxnb3JpdGhtIHdpdGggYmluYXJ5IGRpdmlkZSAmIGNvbnF1ZXIgYXBwcm9hY2hcclxuXHJcbmZ1bmN0aW9uIG11bHRpU2VsZWN0IChhcnIsIGxlZnQsIHJpZ2h0LCBuLCBjb21wYXJlKVxyXG57XHJcbiAgICB2YXIgc3RhY2sgPSBbbGVmdCwgcmlnaHRdLFxyXG4gICAgICAgIG1pZDtcclxuXHJcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKVxyXG4gICAge1xyXG4gICAgICAgIHJpZ2h0ID0gc3RhY2sucG9wKCk7XHJcbiAgICAgICAgbGVmdCA9IHN0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG4pIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBtaWQgPSBsZWZ0ICsgTWF0aC5jZWlsKChyaWdodCAtIGxlZnQpIC8gbiAvIDIpICogbjtcclxuICAgICAgICBxdWlja3NlbGVjdChhcnIsIG1pZCwgbGVmdCwgcmlnaHQsIGNvbXBhcmUpO1xyXG5cclxuICAgICAgICBzdGFjay5wdXNoKGxlZnQsIG1pZCwgbWlkLCByaWdodCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gcmJ1c2g7IiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBFYWNoU2V0Q2FsbGJhY2s8RT5cclxuICpcclxuICogQHBhcmFtIHtFfSBlbnRyeSAtIFRoZSBTZXQgZW50cnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZW50cnkgd2l0aGluIHRoZSBTZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4gez9ib29sZWFufSBUaGUgY2FsbGJhY2sgcmVzdWx0LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgU2V0IGlzIGEgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuXHJcbiAqXHJcbiAqIEBjbGFzcyBTZXRcclxuICogQG1lbWJlcm9mIFBoYXNlci5TdHJ1Y3RzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFtlbGVtZW50c11cclxuICpcclxuICogQHBhcmFtIHtBcnJheS48Kj59IFtlbGVtZW50c10gLSBBbiBvcHRpb25hbCBhcnJheSBvZiBlbGVtZW50cyB0byBpbnNlcnQgaW50byB0aGlzIFNldC5cclxuICovXHJcbnZhciBTZXQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU2V0IChlbGVtZW50cylcclxuICAgIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZW50cmllcyBvZiB0aGlzIFNldC4gU3RvcmVkIGludGVybmFsbHkgYXMgYW4gYXJyYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFskdHlwZV1cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNldCNlbnRyaWVzXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5LjwqPn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldChlbGVtZW50c1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0cyB0aGUgcHJvdmlkZWQgdmFsdWUgaW50byB0aGlzIFNldC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoaXMgU2V0IHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TZXQjc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbdmFsdWVdXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuU2V0LjxUPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGluc2VydCBpbnRvIHRoaXMgU2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5TdHJ1Y3RzLlNldH0gVGhpcyBTZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmluZGV4T2YodmFsdWUpID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhbiBlbGVtZW50IG9mIHRoaXMgU2V0IHdoaWNoIGhhcyBhIHByb3BlcnR5IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgdGhhdCBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxyXG4gICAgICogSWYgbm8gZWxlbWVudHMgb2YgdGhpcyBTZXQgc2F0aXNmeSB0aGUgY29uZGl0aW9uIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYG51bGxgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1R9IC0gW3ZhbHVlLCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sgb24gdGhlIGVsZW1lbnRzIG9mIHRoaXMgU2V0LlxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjayBmb3IuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Kn0gVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBTZXQgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZWQgY29uZGl0aW9uLCBvciBgbnVsbGAgaWYgdGhpcyBTZXQgY29udGFpbnMgbm8gZWxlbWVudHMgdGhhdCBtZWV0IHRoZSBjb25kaXRpb24uXHJcbiAgICAgKi9cclxuICAgIGdldDogZnVuY3Rpb24gKHByb3BlcnR5LCB2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZW50cmllcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZW50cmllc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeVtwcm9wZXJ0eV0gPT09IHZhbHVlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzIGluIHRoaXMgU2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2dldEFycmF5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0FycmF5LjwqPn0gQW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcyBpbiB0aGlzIFNldC5cclxuICAgICAqL1xyXG4gICAgZ2V0QXJyYXk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5zbGljZSgwKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIHRoaXMgU2V0IGlmIHRoaXMgU2V0IGNvbnRhaW5zIHRoYXQgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TZXQjZGVsZXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7VH0gLSBbdmFsdWVdXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuU2V0LjxUPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJlbW92ZSBmcm9tIHRoZSBTZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuU2V0fSBUaGlzIFNldCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZW50cmllcy5pbmRleE9mKHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIER1bXBzIHRoZSBjb250ZW50cyBvZiB0aGlzIFNldCB0byB0aGUgY29uc29sZSB2aWEgYGNvbnNvbGUuZ3JvdXBgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2R1bXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkdW1wOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgY29uc29sZS5ncm91cCgnU2V0Jyk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbnRyaWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlbnRyeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgZWFjaCB2YWx1ZSBpbiB0aGlzIFNldCB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSBrbm93IHRoaXMgU2V0IHdpbGwgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIG90aGVyd2lzZSB1c2UgYGl0ZXJhdGVgLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2VhY2hcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtFYWNoU2V0Q2FsbGJhY2suPFQ+fSAtIFtjYWxsYmFja11cclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFQ+fSAtIFskcmV0dXJuXVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RWFjaFNldENhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGFuZCBwYXNzZWQgZWFjaCB2YWx1ZSB0aGlzIFNldCBjb250YWlucy5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2NhbGxiYWNrU2NvcGVdIC0gVGhlIHNjb3BlIG9mIHRoZSBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5TZXR9IFRoaXMgU2V0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsYmFja1Njb3BlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciB0ZW1wID0gdGhpcy5lbnRyaWVzLnNsaWNlKCk7XHJcbiAgICAgICAgdmFyIGxlbiA9IHRlbXAubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoY2FsbGJhY2tTY29wZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwoY2FsbGJhY2tTY29wZSwgdGVtcFtpXSwgaSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRlbXBbaV0sIGkpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzc2VzIGVhY2ggdmFsdWUgaW4gdGhpcyBTZXQgdG8gdGhlIGdpdmVuIGNhbGxiYWNrLlxyXG4gICAgICogRm9yIHdoZW4geW91IGFic29sdXRlbHkga25vdyB0aGlzIFNldCB3b24ndCBiZSBtb2RpZmllZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNldCNpdGVyYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7RWFjaFNldENhbGxiYWNrLjxUPn0gLSBbY2FsbGJhY2tdXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuU2V0LjxUPn0gLSBbJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VhY2hTZXRDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhbmQgcGFzc2VkIGVhY2ggdmFsdWUgdGhpcyBTZXQgY29udGFpbnMuXHJcbiAgICAgKiBAcGFyYW0geyp9IFtjYWxsYmFja1Njb3BlXSAtIFRoZSBzY29wZSBvZiB0aGUgY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuU2V0fSBUaGlzIFNldCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGl0ZXJhdGU6IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGJhY2tTY29wZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgbGVuID0gdGhpcy5lbnRyaWVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrU2NvcGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGNhbGxiYWNrU2NvcGUsIHRoaXMuZW50cmllc1tpXSwgaSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHRoaXMuZW50cmllc1tpXSwgaSkgPT09IGZhbHNlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHb2VzIHRocm91Z2ggZWFjaCBlbnRyeSBpbiB0aGlzIFNldCBhbmQgaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gdGhlbSwgcGFzc2luZyBpbiB0aGUgYXJndW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2l0ZXJhdGVMb2NhbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1BoYXNlci5TdHJ1Y3RzLlNldC48VD59IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrS2V5IC0gVGhlIGtleSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBvbiBlYWNoIFNldCBlbnRyeS5cclxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2ssIGFmdGVyIHRoZSBjaGlsZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5TZXR9IFRoaXMgU2V0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaXRlcmF0ZUxvY2FsOiBmdW5jdGlvbiAoY2FsbGJhY2tLZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMuZW50cmllcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZW50cmllc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGVudHJ5W2NhbGxiYWNrS2V5XS5hcHBseShlbnRyeSwgYXJncyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhpcyBTZXQgc28gdGhhdCBpdCBubyBsb25nZXIgY29udGFpbnMgYW55IHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNldCNjbGVhclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQGdlbmVyaWNVc2Uge1BoYXNlci5TdHJ1Y3RzLlNldC48VD59IC0gWyRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuU2V0fSBUaGlzIFNldCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW50cmllcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFNldCBjb250YWlucyB0aGUgZ2l2ZW4gdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TZXQjY29udGFpbnNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtUfSAtIFt2YWx1ZV1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrIGZvciBpbiB0aGlzIFNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHZhbHVlIHdhcyBmb3VuZCBpbiB0aGlzIFNldCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmVudHJpZXMuaW5kZXhPZih2YWx1ZSkgPiAtMSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyBTZXQgY29udGFpbmluZyBhbGwgdmFsdWVzIHRoYXQgYXJlIGVpdGhlciBpbiB0aGlzIFNldCBvciBpbiB0aGUgU2V0IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I3VuaW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAZ2VuZXJpY1VzZSB7UGhhc2VyLlN0cnVjdHMuU2V0LjxUPn0gLSBbc2V0LCRyZXR1cm5dXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU3RydWN0cy5TZXR9IHNldCAtIFRoZSBTZXQgdG8gcGVyZm9ybSB0aGUgdW5pb24gd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5TZXR9IEEgbmV3IFNldCBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzIGluIHRoaXMgU2V0IGFuZCB0aGUgU2V0IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LlxyXG4gICAgICovXHJcbiAgICB1bmlvbjogZnVuY3Rpb24gKHNldClcclxuICAgIHtcclxuICAgICAgICB2YXIgbmV3U2V0ID0gbmV3IFNldCgpO1xyXG5cclxuICAgICAgICBzZXQuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5ld1NldC5zZXQodmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdTZXQuc2V0KHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld1NldDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgbmV3IFNldCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHZhbHVlcyB3aGljaCBhcmUgaW4gdGhpcyBTZXQgYW5kIHRoYXQgYXJlIGFsc28gaW4gdGhlIGdpdmVuIFNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNldCNpbnRlcnNlY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFQ+fSAtIFtzZXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNldH0gc2V0IC0gVGhlIFNldCB0byBpbnRlcnNlY3QgdGhpcyBzZXQgd2l0aC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuU3RydWN0cy5TZXR9IFRoZSByZXN1bHQgb2YgdGhlIGludGVyc2VjdGlvbiwgYXMgYSBuZXcgU2V0LlxyXG4gICAgICovXHJcbiAgICBpbnRlcnNlY3Q6IGZ1bmN0aW9uIChzZXQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5ld1NldCA9IG5ldyBTZXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyh2YWx1ZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5ld1NldC5zZXQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdTZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIG5ldyBTZXQgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcyBpbiB0aGlzIFNldCB3aGljaCBhcmUgKm5vdCogYWxzbyBpbiB0aGUgZ2l2ZW4gU2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2V0I2RpZmZlcmVuY2VcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBnZW5lcmljVXNlIHtQaGFzZXIuU3RydWN0cy5TZXQuPFQ+fSAtIFtzZXQsJHJldHVybl1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TdHJ1Y3RzLlNldH0gc2V0IC0gVGhlIFNldCB0byBwZXJmb3JtIHRoZSBkaWZmZXJlbmNlIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuU2V0fSBBIG5ldyBTZXQgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcyBpbiB0aGlzIFNldCB0aGF0IGFyZSBub3QgYWxzbyBpbiB0aGUgU2V0IHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kLlxyXG4gICAgICovXHJcbiAgICBkaWZmZXJlbmNlOiBmdW5jdGlvbiAoc2V0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBuZXdTZXQgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKHZhbHVlKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmV3U2V0LnNldCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld1NldDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIFNldC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2l0aGluIGl0LlxyXG4gICAgICogQ2hhbmdpbmcgdGhlIHNpemUgd2lsbCB0cnVuY2F0ZSB0aGUgU2V0IGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZS5cclxuICAgICAqIEluY3JlYXNpbmcgdGhlIHNpemUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgc2l6ZSBoYXMgbm8gZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNldCNzaXplXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaXplOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgdGhpcy5lbnRyaWVzLmxlbmd0aClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGggPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vbWF0aC9DbGFtcCcpO1xyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgU25hcEZsb29yID0gcmVxdWlyZSgnLi4vbWF0aC9zbmFwL1NuYXBGbG9vcicpO1xyXG52YXIgVmVjdG9yMiA9IHJlcXVpcmUoJy4uL21hdGgvVmVjdG9yMicpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGhlIFNpemUgY29tcG9uZW50IGFsbG93cyB5b3UgdG8gc2V0IGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMgYW5kIGRlZmluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlbS5cclxuICogXHJcbiAqIFRoZSBjb21wb25lbnQgY2FuIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW4gdGhlIGFzcGVjdCByYXRpb3MgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcywgYW5kIGNsYW1wIHRoZW1cclxuICogdG8gYSBkZWZpbmVkIG1pbi1tYXggcmFuZ2UuIFlvdSBjYW4gYWxzbyBjb250cm9sIHRoZSBkb21pbmFudCBheGlzLiBXaGVuIGRpbWVuc2lvbnMgYXJlIGdpdmVuIHRvIHRoZSBTaXplIGNvbXBvbmVudFxyXG4gKiB0aGF0IHdvdWxkIGNhdXNlIGl0IHRvIGV4Y2VlZCBpdHMgbWluLW1heCByYW5nZSwgdGhlIGRpbWVuc2lvbnMgYXJlIGFkanVzdGVkIGJhc2VkIG9uIHRoZSBkb21pbmFudCBheGlzLlxyXG4gKlxyXG4gKiBAY2xhc3MgU2l6ZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlN0cnVjdHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0wXSAtIFRoZSB3aWR0aCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PXdpZHRoXSAtIFRoZSBoZWlnaHQgb2YgdGhlIFNpemUgY29tcG9uZW50LiBJZiBub3QgZ2l2ZW4sIGl0IHdpbGwgdXNlIHRoZSBgd2lkdGhgLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFthc3BlY3RNb2RlPTBdIC0gVGhlIGFzcGVjdCBtb2RlIG9mIHRoZSBTaXplIGNvbXBvbmVudC4gRGVmYXVsdHMgdG8gMCwgbm8gbW9kZS5cclxuICogQHBhcmFtIHthbnl9IFtwYXJlbnQ9bnVsbF0gLSBUaGUgcGFyZW50IG9mIHRoaXMgU2l6ZSBjb21wb25lbnQuIENhbiBiZSBhbnkgb2JqZWN0IHdpdGggcHVibGljIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMuIERpbWVuc2lvbnMgYXJlIGNsYW1wZWQgdG8ga2VlcCB0aGVtIHdpdGhpbiB0aGUgcGFyZW50IGJvdW5kcyB3aGVyZSBwb3NzaWJsZS5cclxuICovXHJcbnZhciBTaXplID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFNpemUgKHdpZHRoLCBoZWlnaHQsIGFzcGVjdE1vZGUsIHBhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDA7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuICAgICAgICBpZiAoYXNwZWN0TW9kZSA9PT0gdW5kZWZpbmVkKSB7IGFzcGVjdE1vZGUgPSAwOyB9XHJcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7IHBhcmVudCA9IG51bGw7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgd2lkdGggdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5TaXplI193aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSW50ZXJuYWwgaGVpZ2h0IHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZSNfaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludGVybmFsIHBhcmVudCByZWZlcmVuY2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5TaXplI19wYXJlbnRcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGFzcGVjdCBtb2RlIHRoaXMgU2l6ZSBjb21wb25lbnQgd2lsbCB1c2Ugd2hlbiBjYWxjdWxhdGluZyBpdHMgZGltZW5zaW9ucy5cclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seS4gVG8gY2hhbmdlIGl0IHVzZSB0aGUgYHNldEFzcGVjdE1vZGVgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUjYXNwZWN0TW9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFzcGVjdE1vZGUgPSBhc3BlY3RNb2RlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcHJvcG9ydGlvbmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB3aWR0aCBhbmQgaGVpZ2h0LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgcmVhZC1vbmx5IGFuZCBpcyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBlaXRoZXIgdGhlIGB3aWR0aGAgb3IgYGhlaWdodGAgcHJvcGVydGllcyBhcmUgY2hhbmdlZCxcclxuICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGFzcGVjdCBtb2RlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZSNhc3BlY3RSYXRpb1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYXNwZWN0UmF0aW8gPSAoaGVpZ2h0ID09PSAwKSA/IDEgOiB3aWR0aCAvIGhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gYWxsb3dlZCB3aWR0aC5cclxuICAgICAgICAgKiBDYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8uXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyByZWFkLW9ubHkuIFRvIGNoYW5nZSBpdCBzZWUgdGhlIGBzZXRNaW5gIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUjbWluV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1pbldpZHRoID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gYWxsb3dlZCBoZWlnaHQuXHJcbiAgICAgICAgICogQ2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvLlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgcmVhZC1vbmx5LiBUbyBjaGFuZ2UgaXQgc2VlIHRoZSBgc2V0TWluYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5TaXplI21pbkhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWluSGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1heGltdW0gYWxsb3dlZCB3aWR0aC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHJlYWQtb25seS4gVG8gY2hhbmdlIGl0IHNlZSB0aGUgYHNldE1heGAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZSNtYXhXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubWF4V2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWF4aW11bSBhbGxvd2VkIGhlaWdodC5cclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIHJlYWQtb25seS4gVG8gY2hhbmdlIGl0IHNlZSB0aGUgYHNldE1heGAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZSNtYXhIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm1heEhlaWdodCA9IE51bWJlci5NQVhfVkFMVUU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgVmVjdG9yMiBjb250YWluaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzbmFwIHZhbHVlcywgd2hpY2ggdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNuYXBwZWQgdG8gZHVyaW5nIHJlc2l6aW5nLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBpcyBkaXNhYmxlZC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seS4gVG8gY2hhbmdlIGl0IHNlZSB0aGUgYHNldFNuYXBgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUjc25hcFRvXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc25hcFRvID0gbmV3IFZlY3RvcjIoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBhc3BlY3QgbW9kZSBvZiB0aGlzIFNpemUgY29tcG9uZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgYXNwZWN0IG1vZGUgY29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4geW91IG1vZGlmeSB0aGUgYHdpZHRoYCBvciBgaGVpZ2h0YCBwcm9wZXJ0aWVzLCBvciBjYWxsIGBzZXRTaXplYC5cclxuICAgICAqIFxyXG4gICAgICogSXQgY2FuIGJlIGEgbnVtYmVyIGZyb20gMCB0byA0LCBvciBhIFNpemUgY29uc3RhbnQ6XHJcbiAgICAgKiBcclxuICAgICAqIDAuIE5PTkUgPSBEbyBub3QgbWFrZSB0aGUgc2l6ZSBmaXQgdGhlIGFzcGVjdCByYXRpby4gQ2hhbmdlIHRoZSByYXRpbyB3aGVuIHRoZSBzaXplIGNoYW5nZXMuXHJcbiAgICAgKiAxLiBXSURUSF9DT05UUk9MU19IRUlHSFQgPSBUaGUgaGVpZ2h0IGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIHdpZHRoLlxyXG4gICAgICogMi4gSEVJR0hUX0NPTlRST0xTX1dJRFRIID0gVGhlIHdpZHRoIGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGhlaWdodC5cclxuICAgICAqIDMuIEZJVCA9IFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHRvIGZpdCBpbnNpZGUgdGhlIGdpdmVuIHRhcmdldCBhcmVhLCB3aGlsZSBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW8uIERlcGVuZGluZyBvbiB0aGUgYXNwZWN0IHJhdGlvIHRoZXJlIG1heSBiZSBzb21lIHNwYWNlIGluc2lkZSB0aGUgYXJlYSB3aGljaCBpcyBub3QgY292ZXJlZC5cclxuICAgICAqIDQuIEVOVkVMT1AgPSBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYXV0b21hdGljYWxseSBhZGp1c3RlZCB0byBtYWtlIHRoZSBzaXplIGNvdmVyIHRoZSBlbnRpcmUgdGFyZ2V0IGFyZWEgd2hpbGUga2VlcGluZyB0aGUgYXNwZWN0IHJhdGlvLiBUaGlzIG1heSBleHRlbmQgZnVydGhlciBvdXQgdGhhbiB0aGUgdGFyZ2V0IHNpemUuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZXMgdGhlIGB3aWR0aGAgYW5kIHRoZSBgaGVpZ2h0YCwgaWYgcmVxdWlyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNzZXRBc3BlY3RNb2RlXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdmFsdWU9MF0gLSBUaGUgYXNwZWN0IG1vZGUgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaXplIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0QXNwZWN0TW9kZTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gMDsgfVxyXG5cclxuICAgICAgICB0aGlzLmFzcGVjdE1vZGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0U2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCeSBzZXR0aW5nIGEgU25hcCBUbyB2YWx1ZSB3aGVuIHRoaXMgU2l6ZSBjb21wb25lbnQgaXMgbW9kaWZpZWQgaXRzIGRpbWVuc2lvbnMgd2lsbCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiBieSBzbmFwcGVkIHRvIHRoZSBuZWFyZXN0IGdyaWQgc2xpY2UsIHVzaW5nIGZsb29yLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgc25hcCB2YWx1ZSBvZiAxNixcclxuICAgICAqIGFuZCB0aGUgd2lkdGggY2hhbmdlcyB0byA2OCwgdGhlbiBpdCB3aWxsIHNuYXAgZG93biB0byA2NCAodGhlIGNsb3Nlc3QgbXVsdGlwbGUgb2YgMTYgd2hlbiBmbG9vcmVkKVxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgc25hcHBpbmcgdGFrZXMgcGxhY2UgYmVmb3JlIGFkanVzdG1lbnRzIGJ5IHRoZSBwYXJlbnQsIG9yIHRoZSBtaW4gLyBtYXggc2V0dGluZ3MuIElmIHRoZXNlXHJcbiAgICAgKiB2YWx1ZXMgYXJlIG5vdCBtdWx0aXBsZXMgb2YgdGhlIGdpdmVuIHNuYXAgdmFsdWVzLCB0aGVuIHRoaXMgY2FuIHJlc3VsdCBpbiB1bi1zbmFwcGVkIGRpbWVuc2lvbnMuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMgdG8gcmVzZXQgdGhlIHNuYXAgdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgcmVjYWxjdWxhdGVzIHRoZSBgd2lkdGhgIGFuZCB0aGUgYGhlaWdodGAsIGlmIHJlcXVpcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNpemUjc2V0U25hcFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc25hcFdpZHRoPTBdIC0gVGhlIGFtb3VudCB0byBzbmFwIHRoZSB3aWR0aCB0by4gSWYgeW91IGRvbid0IHdhbnQgdG8gc25hcCB0aGUgd2lkdGgsIHBhc3MgYSB2YWx1ZSBvZiB6ZXJvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzbmFwSGVpZ2h0PXNuYXBXaWR0aF0gLSBUaGUgYW1vdW50IHRvIHNuYXAgdGhlIGhlaWdodCB0by4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgdXNlIHRoZSBgc25hcFdpZHRoYCB2YWx1ZS4gSWYgeW91IGRvbid0IHdhbnQgdG8gc25hcCB0aGUgaGVpZ2h0LCBwYXNzIGEgdmFsdWUgb2YgemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNpemUgY29tcG9uZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRTbmFwOiBmdW5jdGlvbiAoc25hcFdpZHRoLCBzbmFwSGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzbmFwV2lkdGggPT09IHVuZGVmaW5lZCkgeyBzbmFwV2lkdGggPSAwOyB9XHJcbiAgICAgICAgaWYgKHNuYXBIZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBzbmFwSGVpZ2h0ID0gc25hcFdpZHRoOyB9XHJcblxyXG4gICAgICAgIHRoaXMuc25hcFRvLnNldChzbmFwV2lkdGgsIHNuYXBIZWlnaHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMsIG9yIGNsZWFycywgdGhlIHBhcmVudCBvZiB0aGlzIFNpemUgY29tcG9uZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBjbGVhciB0aGUgcGFyZW50IGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBwYXJlbnQgaW5mbHVlbmNlcyB0aGUgbWF4aW11bSBleHRlbnRzIHRvIHdoaWNoIHRoaXMgU2l6ZSBjb21wb25lbnQgY2FuIGV4cGFuZCxcclxuICAgICAqIGJhc2VkIG9uIHRoZSBhc3BlY3QgbW9kZTpcclxuICAgICAqIFxyXG4gICAgICogTk9ORSAtIFRoZSBwYXJlbnQgY2xhbXBzIGJvdGggdGhlIHdpZHRoIGFuZCBoZWlnaHQuXHJcbiAgICAgKiBXSURUSF9DT05UUk9MU19IRUlHSFQgLSBUaGUgcGFyZW50IGNsYW1wcyBqdXN0IHRoZSB3aWR0aC5cclxuICAgICAqIEhFSUdIVF9DT05UUk9MU19XSURUSCAtIFRoZSBwYXJlbnQgY2xhbXBzIGp1c3QgdGhlIGhlaWdodC5cclxuICAgICAqIEZJVCAtIFRoZSBwYXJlbnQgY2xhbXBzIHdoaWNoZXZlciBheGlzIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGUgc2l6ZSBmaXRzIHdpdGhpbiBpdC5cclxuICAgICAqIEVOVkVMT1AgLSBUaGUgcGFyZW50IGlzIHVzZWQgdG8gZW5zdXJlIHRoZSBzaXplIGZ1bGx5IGVudmVsb3BzIHRoZSBwYXJlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseSBjYWxscyBgc2V0U2l6ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI3NldFBhcmVudFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBbcGFyZW50XSAtIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIFNpemUgY29tcG9uZW50LiBEb24ndCBwcm92aWRlIGEgdmFsdWUgdG8gY2xlYXIgYW4gZXhpc3RpbmcgcGFyZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2l6ZSBjb21wb25lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldFBhcmVudDogZnVuY3Rpb24gKHBhcmVudClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBtaW5pbXVtIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHRoaXMgU2l6ZSBjb21wb25lbnQgd2lsbCBhbGxvdy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIG1pbmltdW0gdmFsdWVzIGNhbiBuZXZlciBiZSBiZWxvdyB6ZXJvLCBvciBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBTZXR0aW5nIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFkanVzdCBib3RoIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIHRvIGVuc3VyZSB0aGV5IGFyZSB3aXRoaW4gcmFuZ2UuXHJcbiAgICAgKiBcclxuICAgICAqIE5vdGUgdGhhdCBiYXNlZCBvbiB0aGUgYXNwZWN0IG1vZGUsIGFuZCBpZiB0aGlzIFNpemUgY29tcG9uZW50IGhhcyBhIHBhcmVudCBzZXQgb3Igbm90LCB0aGUgbWluaW11bXMgc2V0IGhlcmVcclxuICAgICAqIF9jYW5fIGJlIGV4Y2VlZCBpbiBzb21lIHNpdHVhdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI3NldE1pblxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MF0gLSBUaGUgbWluaW11bSBhbGxvd2VkIHdpZHRoIG9mIHRoZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PXdpZHRoXSAtIFRoZSBtaW5pbXVtIGFsbG93ZWQgaGVpZ2h0IG9mIHRoZSBTaXplIGNvbXBvbmVudC4gSWYgbm90IGdpdmVuLCBpdCB3aWxsIHVzZSB0aGUgYHdpZHRoYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNpemUgY29tcG9uZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRNaW46IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gMDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB3aWR0aDsgfVxyXG5cclxuICAgICAgICB0aGlzLm1pbldpZHRoID0gQ2xhbXAod2lkdGgsIDAsIHRoaXMubWF4V2lkdGgpO1xyXG4gICAgICAgIHRoaXMubWluSGVpZ2h0ID0gQ2xhbXAoaGVpZ2h0LCAwLCB0aGlzLm1heEhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBtYXhpbXVtIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIHRoaXMgU2l6ZSBjb21wb25lbnQgd2lsbCBhbGxvdy5cclxuICAgICAqIFxyXG4gICAgICogU2V0dGluZyB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBhZGp1c3QgYm90aCB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcyB0byBlbnN1cmUgdGhleSBhcmUgd2l0aGluIHJhbmdlLlxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgYmFzZWQgb24gdGhlIGFzcGVjdCBtb2RlLCBhbmQgaWYgdGhpcyBTaXplIGNvbXBvbmVudCBoYXMgYSBwYXJlbnQgc2V0IG9yIG5vdCwgdGhlIG1heGltdW1zIHNldCBoZXJlXHJcbiAgICAgKiBfY2FuXyBiZSBleGNlZWQgaW4gc29tZSBzaXR1YXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNzZXRNYXhcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPU51bWJlci5NQVhfVkFMVUVdIC0gVGhlIG1heGltdW0gYWxsb3dlZCB3aWR0aCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD13aWR0aF0gLSBUaGUgbWF4aW11bSBhbGxvd2VkIGhlaWdodCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuIElmIG5vdCBnaXZlbiwgaXQgd2lsbCB1c2UgdGhlIGB3aWR0aGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaXplIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0TWF4OiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IE51bWJlci5NQVhfVkFMVUU7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXhXaWR0aCA9IENsYW1wKHdpZHRoLCB0aGlzLm1pbldpZHRoLCBOdW1iZXIuTUFYX1ZBTFVFKTtcclxuICAgICAgICB0aGlzLm1heEhlaWdodCA9IENsYW1wKGhlaWdodCwgdGhpcy5taW5IZWlnaHQsIE51bWJlci5NQVhfVkFMVUUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBTaXplIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgYXNwZWN0IG1vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBhc3BlY3QgbW9kZSBpcyAnbm9uZScgdGhlbiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY2hhbmdlIHRoZSBhc3BlY3QgcmF0aW8sIG90aGVyd2lzZSB0aGUgY3VycmVudFxyXG4gICAgICogYXNwZWN0IHJhdGlvIGlzIGhvbm9yZWQgYWNyb3NzIGFsbCBvdGhlciBtb2Rlcy5cclxuICAgICAqIFxyXG4gICAgICogSWYgc25hcFRvIHZhbHVlcyBoYXZlIGJlZW4gc2V0IHRoZW4gdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNuYXBwZWQgZmlyc3QsIHByaW9yIHRvIGFueSBmdXJ0aGVyXHJcbiAgICAgKiBhZGp1c3RtZW50IHZpYSBtaW4vbWF4IHZhbHVlcywgb3IgYSBwYXJlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIG1pbmltdW0gYW5kL29yIG1heGltdW0gZGltZW5zaW9ucyBoYXZlIGJlZW4gc3BlY2lmaWVkLCB0aGUgdmFsdWVzIGdpdmVuIHRvIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2xhbXBlZCBpbnRvXHJcbiAgICAgKiB0aGF0IHJhbmdlIHByaW9yIHRvIGFkanVzdG1lbnQsIGJ1dCBtYXkgc3RpbGwgZXhjZWVkIHRoZW0gZGVwZW5kaW5nIG9uIHRoZSBhc3BlY3QgbW9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBTaXplIGNvbXBvbmVudCBoYXMgYSBwYXJlbnQgc2V0LCBhbmQgdGhlIGFzcGVjdCBtb2RlIGlzIGBmaXRgIG9yIGBlbnZlbG9wYCwgdGhlbiB0aGUgZ2l2ZW4gc2l6ZXMgd2lsbFxyXG4gICAgICogYmUgY2xhbXBlZCB0byB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBwYXJlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI3NldFNpemVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTBdIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD13aWR0aF0gLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuIElmIG5vdCBnaXZlbiwgaXQgd2lsbCB1c2UgdGhlIGB3aWR0aGAuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaXplIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAwOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHdpZHRoOyB9XHJcbiAgICBcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuYXNwZWN0TW9kZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZS5OT05FOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLmdldE5ld1dpZHRoKFNuYXBGbG9vcih3aWR0aCwgdGhpcy5zbmFwVG8ueCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5nZXROZXdIZWlnaHQoU25hcEZsb29yKGhlaWdodCwgdGhpcy5zbmFwVG8ueSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9ICh0aGlzLl9oZWlnaHQgPT09IDApID8gMSA6IHRoaXMuX3dpZHRoIC8gdGhpcy5faGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFNpemUuV0lEVEhfQ09OVFJPTFNfSEVJR0hUOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLmdldE5ld1dpZHRoKFNuYXBGbG9vcih3aWR0aCwgdGhpcy5zbmFwVG8ueCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gdGhpcy5nZXROZXdIZWlnaHQodGhpcy5fd2lkdGggKiAoMSAvIHRoaXMuYXNwZWN0UmF0aW8pLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZS5IRUlHSFRfQ09OVFJPTFNfV0lEVEg6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLmdldE5ld0hlaWdodChTbmFwRmxvb3IoaGVpZ2h0LCB0aGlzLnNuYXBUby55KSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuZ2V0TmV3V2lkdGgodGhpcy5faGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpbywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFNpemUuRklUOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJhaW4od2lkdGgsIGhlaWdodCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZS5FTlZFTE9QOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJhaW4od2lkdGgsIGhlaWdodCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgbmV3IGFzcGVjdCByYXRpbywgb3ZlcnJpZGluZyB3aGF0IHdhcyB0aGVyZSBwcmV2aW91c2x5LlxyXG4gICAgICogXHJcbiAgICAgKiBJdCB0aGVuIGNhbGxzIGBzZXRTaXplYCBpbW1lZGlhdGVseSB1c2luZyB0aGUgY3VycmVudCBkaW1lbnNpb25zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNzZXRBc3BlY3RSYXRpb1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYXRpbyAtIFRoZSBuZXcgYXNwZWN0IHJhdGlvLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2l6ZSBjb21wb25lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEFzcGVjdFJhdGlvOiBmdW5jdGlvbiAocmF0aW8pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9IHJhdGlvO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBuZXcgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhpcyBTaXplIGNvbXBvbmVudCBhbmQgdXBkYXRlcyB0aGUgYXNwZWN0IHJhdGlvIGJhc2VkIG9uIHRoZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEl0IF9kb2Vzbid0XyBjaGFuZ2UgdGhlIGBhc3BlY3RNb2RlYCBhbmQgc3RpbGwgZmFjdG9ycyBpbiBzaXplIGxpbWl0cyBzdWNoIGFzIHRoZSBtaW4gbWF4IGFuZCBwYXJlbnQgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNyZXNpemVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PXdpZHRoXSAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBTaXplIGNvbXBvbmVudC4gSWYgbm90IGdpdmVuLCBpdCB3aWxsIHVzZSB0aGUgYHdpZHRoYC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNpemUgY29tcG9uZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5nZXROZXdXaWR0aChTbmFwRmxvb3Iod2lkdGgsIHRoaXMuc25hcFRvLngpKTtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLmdldE5ld0hlaWdodChTbmFwRmxvb3IoaGVpZ2h0LCB0aGlzLnNuYXBUby55KSk7XHJcbiAgICAgICAgdGhpcy5hc3BlY3RSYXRpbyA9ICh0aGlzLl9oZWlnaHQgPT09IDApID8gMSA6IHRoaXMuX3dpZHRoIC8gdGhpcy5faGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIG5ldyB3aWR0aCBhbmQgcGFzc2VzIGl0IHRocm91Z2ggdGhlIG1pbi9tYXggY2xhbXAgYW5kIHRoZW4gY2hlY2tzIGl0IGRvZXNuJ3QgZXhjZWVkIHRoZSBwYXJlbnQgd2lkdGguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI2dldE5ld1dpZHRoXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wIGFuZCBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoZWNrUGFyZW50PXRydWVdIC0gQ2hlY2sgdGhlIGdpdmVuIHZhbHVlIGFnYWluc3QgdGhlIHBhcmVudCwgaWYgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1vZGlmaWVkIHdpZHRoIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXROZXdXaWR0aDogZnVuY3Rpb24gKHZhbHVlLCBjaGVja1BhcmVudClcclxuICAgIHtcclxuICAgICAgICBpZiAoY2hlY2tQYXJlbnQgPT09IHVuZGVmaW5lZCkgeyBjaGVja1BhcmVudCA9IHRydWU7IH1cclxuICAgICAgICBcclxuICAgICAgICB2YWx1ZSA9IENsYW1wKHZhbHVlLCB0aGlzLm1pbldpZHRoLCB0aGlzLm1heFdpZHRoKTtcclxuXHJcbiAgICAgICAgaWYgKGNoZWNrUGFyZW50ICYmIHRoaXMuX3BhcmVudCAmJiB2YWx1ZSA+IHRoaXMuX3BhcmVudC53aWR0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5tYXgodGhpcy5taW5XaWR0aCwgdGhpcy5fcGFyZW50LndpZHRoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIG5ldyBoZWlnaHQgYW5kIHBhc3NlcyBpdCB0aHJvdWdoIHRoZSBtaW4vbWF4IGNsYW1wIGFuZCB0aGVuIGNoZWNrcyBpdCBkb2Vzbid0IGV4Y2VlZCB0aGUgcGFyZW50IGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNpemUjZ2V0TmV3SGVpZ2h0XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wIGFuZCBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoZWNrUGFyZW50PXRydWVdIC0gQ2hlY2sgdGhlIGdpdmVuIHZhbHVlIGFnYWluc3QgdGhlIHBhcmVudCwgaWYgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1vZGlmaWVkIGhlaWdodCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TmV3SGVpZ2h0OiBmdW5jdGlvbiAodmFsdWUsIGNoZWNrUGFyZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjaGVja1BhcmVudCA9PT0gdW5kZWZpbmVkKSB7IGNoZWNrUGFyZW50ID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YWx1ZSA9IENsYW1wKHZhbHVlLCB0aGlzLm1pbkhlaWdodCwgdGhpcy5tYXhIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAoY2hlY2tQYXJlbnQgJiYgdGhpcy5fcGFyZW50ICYmIHZhbHVlID4gdGhpcy5fcGFyZW50LmhlaWdodClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5tYXgodGhpcy5taW5IZWlnaHQsIHRoaXMuX3BhcmVudC5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGB3aWR0aGAgYW5kIGBoZWlnaHRgIGFyZSBhZGp1c3RlZCB0byBmaXQgaW5zaWRlIHRoZSBnaXZlbiBkaW1lbnNpb25zLCB3aGlsZSBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW8uXHJcbiAgICAgKiBcclxuICAgICAqIElmIGBmaXRgIGlzIHRydWUgdGhlcmUgbWF5IGJlIHNvbWUgc3BhY2UgaW5zaWRlIHRoZSB0YXJnZXQgYXJlYSB3aGljaCBpcyBub3QgY292ZXJlZCBpZiBpdHMgYXNwZWN0IHJhdGlvIGRpZmZlcnMuXHJcbiAgICAgKiBJZiBgZml0YCBpcyBmYWxzZSB0aGUgc2l6ZSBtYXkgZXh0ZW5kIGZ1cnRoZXIgb3V0IHRoYW4gdGhlIHRhcmdldCBhcmVhIGlmIHRoZSBhc3BlY3QgcmF0aW9zIGRpZmZlci5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBTaXplIGNvbXBvbmVudCBoYXMgYSBwYXJlbnQgc2V0LCB0aGVuIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHBhc3NlZCB0byB0aGlzIG1ldGhvZCB3aWxsIGJlIGNsYW1wZWQgc29cclxuICAgICAqIGl0IGNhbm5vdCBleGNlZWQgdGhhdCBvZiB0aGUgcGFyZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNjb25zdHJhaW5cclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTBdIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgU2l6ZSBjb21wb25lbnQuIElmIG5vdCBnaXZlbiwgaXQgd2lsbCB1c2UgdGhlIHdpZHRoIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZml0PXRydWVdIC0gUGVyZm9ybSBhIGBmaXRgICh0cnVlKSBjb25zdHJhaW50LCBvciBhbiBgZW52ZWxvcGAgKGZhbHNlKSBjb25zdHJhaW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2l6ZSBjb21wb25lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cmFpbjogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIGZpdClcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IDA7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuICAgICAgICBpZiAoZml0ID09PSB1bmRlZmluZWQpIHsgZml0ID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0TmV3V2lkdGgod2lkdGgpO1xyXG4gICAgICAgIGhlaWdodCA9IHRoaXMuZ2V0TmV3SGVpZ2h0KGhlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBzbmFwID0gdGhpcy5zbmFwVG87XHJcbiAgICAgICAgdmFyIG5ld1JhdGlvID0gKGhlaWdodCA9PT0gMCkgPyAxIDogd2lkdGggLyBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICgoZml0ICYmIHRoaXMuYXNwZWN0UmF0aW8gPiBuZXdSYXRpbykgfHwgKCFmaXQgJiYgdGhpcy5hc3BlY3RSYXRpbyA8IG5ld1JhdGlvKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgaGVpZ2h0IHRvIGZpdCB0aGUgd2lkdGhcclxuXHJcbiAgICAgICAgICAgIHdpZHRoID0gU25hcEZsb29yKHdpZHRoLCBzbmFwLngpO1xyXG5cclxuICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXAueSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IFNuYXBGbG9vcihoZWlnaHQsIHNuYXAueSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlZHVjZSB0aGUgd2lkdGggYWNjb3JkaW5nbHlcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgoZml0ICYmIHRoaXMuYXNwZWN0UmF0aW8gPCBuZXdSYXRpbykgfHwgKCFmaXQgJiYgdGhpcy5hc3BlY3RSYXRpbyA+IG5ld1JhdGlvKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgd2lkdGggdG8gZml0IHRoZSBoZWlnaHRcclxuXHJcbiAgICAgICAgICAgIGhlaWdodCA9IFNuYXBGbG9vcihoZWlnaHQsIHNuYXAueSk7XHJcblxyXG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcC54ID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBTbmFwRmxvb3Iod2lkdGgsIHNuYXAueCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIFJlZHVjZSB0aGUgaGVpZ2h0IGFjY29yZGluZ2x5XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqICgxIC8gdGhpcy5hc3BlY3RSYXRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgYWRqdXN0ZWQgdG8gZml0IGluc2lkZSB0aGUgZ2l2ZW4gZGltZW5zaW9ucywgd2hpbGUga2VlcGluZyB0aGUgYXNwZWN0IHJhdGlvLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGVyZSBtYXkgYmUgc29tZSBzcGFjZSBpbnNpZGUgdGhlIHRhcmdldCBhcmVhIHdoaWNoIGlzIG5vdCBjb3ZlcmVkIGlmIGl0cyBhc3BlY3QgcmF0aW8gZGlmZmVycy5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBTaXplIGNvbXBvbmVudCBoYXMgYSBwYXJlbnQgc2V0LCB0aGVuIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHBhc3NlZCB0byB0aGlzIG1ldGhvZCB3aWxsIGJlIGNsYW1wZWQgc29cclxuICAgICAqIGl0IGNhbm5vdCBleGNlZWQgdGhhdCBvZiB0aGUgcGFyZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNmaXRUb1xyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MF0gLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBTaXplIGNvbXBvbmVudC4gSWYgbm90IGdpdmVuLCBpdCB3aWxsIHVzZSB0aGUgd2lkdGggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaXplIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZml0VG86IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbih3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgYWRqdXN0ZWQgc28gdGhhdCB0aGV5IGZ1bGx5IGVudmVsb3BlIHRoZSBnaXZlbiBkaW1lbnNpb25zLCB3aGlsZSBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW8uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBzaXplIG1heSBleHRlbmQgZnVydGhlciBvdXQgdGhhbiB0aGUgdGFyZ2V0IGFyZWEgaWYgdGhlIGFzcGVjdCByYXRpb3MgZGlmZmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGlzIFNpemUgY29tcG9uZW50IGhhcyBhIHBhcmVudCBzZXQsIHRoZW4gdGhlIHZhbHVlcyBhcmUgY2xhbXBlZCBzbyB0aGF0IGl0IG5ldmVyIGV4Y2VlZHMgdGhlIHBhcmVudFxyXG4gICAgICogb24gdGhlIGxvbmdlc3QgYXhpcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNpemUjZW52ZWxvcFxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MF0gLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBTaXplIGNvbXBvbmVudC4gSWYgbm90IGdpdmVuLCBpdCB3aWxsIHVzZSB0aGUgd2lkdGggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBTaXplIGNvbXBvbmVudCBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgZW52ZWxvcDogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RyYWluKHdpZHRoLCBoZWlnaHQsIGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGlzIFNpemUgY29tcG9uZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBEZXBlbmRpbmcgb24gdGhlIGFzcGVjdCBtb2RlLCBjaGFuZ2luZyB0aGUgd2lkdGggbWF5IGFsc28gdXBkYXRlIHRoZSBoZWlnaHQgYW5kIGFzcGVjdCByYXRpby5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNpemUjc2V0V2lkdGhcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBTaXplIGNvbXBvbmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFNpemUgY29tcG9uZW50IGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZXRXaWR0aDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNpemUodmFsdWUsIHRoaXMuX2hlaWdodCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoaXMgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgYXNwZWN0IG1vZGUsIGNoYW5naW5nIHRoZSBoZWlnaHQgbWF5IGFsc28gdXBkYXRlIHRoZSB3aWR0aCBhbmQgYXNwZWN0IHJhdGlvLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNzZXRIZWlnaHRcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIFNpemUgY29tcG9uZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgU2l6ZSBjb21wb25lbnQgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldEhlaWdodDogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldFNpemUodGhpcy5fd2lkdGgsIHZhbHVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI3RvU3RyaW5nXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNpemUgY29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICB0b1N0cmluZzogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gJ1t7IFNpemUgKHdpZHRoPScgKyB0aGlzLl93aWR0aCArICcgaGVpZ2h0PScgKyB0aGlzLl9oZWlnaHQgKyAnIGFzcGVjdFJhdGlvPScgKyB0aGlzLmFzcGVjdFJhdGlvICsgJyBhc3BlY3RNb2RlPScgKyB0aGlzLmFzcGVjdE1vZGUgKyAnKSB9XSc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoaXMgU2l6ZSBjb21wb25lbnQgdG8gdGhlIGBlbGVtZW50LnN0eWxlLndpZHRoYCBhbmQgYGhlaWdodGBcclxuICAgICAqIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIERPTSBFbGVtZW50LiBUaGUgcHJvcGVydGllcyBhcmUgc2V0IGFzIGBweGAgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlN0cnVjdHMuU2l6ZSNzZXRDU1NcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIERPTSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIHN0eWxlIG9uLlxyXG4gICAgICovXHJcbiAgICBzZXRDU1M6IGZ1bmN0aW9uIChlbGVtZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuc3R5bGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5fd2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX2hlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgYXNwZWN0IG1vZGUsIGFzcGVjdCByYXRpbywgd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoaXMgU2l6ZSBjb21wb25lbnRcclxuICAgICAqIHRvIHRoZSBnaXZlbiBTaXplIGNvbXBvbmVudC4gTm90ZSB0aGF0IHRoZSBwYXJlbnQsIGlmIHNldCwgaXMgbm90IGNvcGllZCBhY3Jvc3MuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuU3RydWN0cy5TaXplI2NvcHlcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU3RydWN0cy5TaXplfSBkZXN0aW5hdGlvbiAtIFRoZSBTaXplIGNvbXBvbmVudCB0byBjb3B5IHRoZSB2YWx1ZXMgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlN0cnVjdHMuU2l6ZX0gVGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIGNvcHk6IGZ1bmN0aW9uIChkZXN0aW5hdGlvbilcclxuICAgIHtcclxuICAgICAgICBkZXN0aW5hdGlvbi5zZXRBc3BlY3RNb2RlKHRoaXMuYXNwZWN0TW9kZSk7XHJcblxyXG4gICAgICAgIGRlc3RpbmF0aW9uLmFzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpbztcclxuXHJcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uLnNldFNpemUodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgY2xlYXJzIHRoZSBsb2NhbCBwcm9wZXJ0aWVzIGFuZCBhbnkgcGFyZW50IG9iamVjdCwgaWYgc2V0LlxyXG4gICAgICogXHJcbiAgICAgKiBBIGRlc3Ryb3llZCBTaXplIGNvbXBvbmVudCBjYW5ub3QgYmUgcmUtdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5TdHJ1Y3RzLlNpemUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zbmFwVG8gPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGlzIFNpemUgY29tcG9uZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIHZhbHVlIGlzIGNsYW1wZWQgdG8gdGhlIHJhbmdlIHNwZWNpZmllZCBieSBgbWluV2lkdGhgIGFuZCBgbWF4V2lkdGhgLCBpZiBlbmFibGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBBIHdpZHRoIGNhbiBuZXZlciBiZSBsZXNzIHRoYW4gemVyby5cclxuICAgICAqIFxyXG4gICAgICogQ2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBgaGVpZ2h0YCBpZiB0aGUgYXNwZWN0IHJhdGlvIGxvY2sgaXMgZW5hYmxlZC5cclxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhlIGBzZXRXaWR0aGAgYW5kIGBnZXRXaWR0aGAgbWV0aG9kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5TaXplI3dpZHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICB3aWR0aDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpemUodmFsdWUsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgU2l6ZSBjb21wb25lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIFRoaXMgdmFsdWUgaXMgY2xhbXBlZCB0byB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IGBtaW5IZWlnaHRgIGFuZCBgbWF4SGVpZ2h0YCwgaWYgZW5hYmxlZC5cclxuICAgICAqIFxyXG4gICAgICogQSBoZWlnaHQgY2FuIG5ldmVyIGJlIGxlc3MgdGhhbiB6ZXJvLlxyXG4gICAgICogXHJcbiAgICAgKiBDaGFuZ2luZyB0aGlzIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGB3aWR0aGAgaWYgdGhlIGFzcGVjdCByYXRpbyBsb2NrIGlzIGVuYWJsZWQuXHJcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBgc2V0SGVpZ2h0YCBhbmQgYGdldEhlaWdodGAgbWV0aG9kcy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuU3RydWN0cy5TaXplI2hlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqL1xyXG4gICAgaGVpZ2h0OiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpemUodGhpcy5fd2lkdGgsIHZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vKipcclxuICogRG8gbm90IG1ha2UgdGhlIHNpemUgZml0IHRoZSBhc3BlY3QgcmF0aW8uIENoYW5nZSB0aGUgcmF0aW8gd2hlbiB0aGUgc2l6ZSBjaGFuZ2VzLlxyXG4gKiBcclxuICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZS5OT05FXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAdHlwZSB7aW50ZWdlcn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuU2l6ZS5OT05FID0gMDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgaGVpZ2h0IGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIHdpZHRoLlxyXG4gKiBcclxuICogQG5hbWUgUGhhc2VyLlN0cnVjdHMuU2l6ZS5XSURUSF9DT05UUk9MU19IRUlHSFRcclxuICogQGNvbnN0YW50XHJcbiAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gKiBAc2luY2UgMy4xNi4wXHJcbiAqL1xyXG5TaXplLldJRFRIX0NPTlRST0xTX0hFSUdIVCA9IDE7XHJcblxyXG4vKipcclxuICogVGhlIHdpZHRoIGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGhlaWdodC5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUuSEVJR0hUX0NPTlRST0xTX1dJRFRIXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAdHlwZSB7aW50ZWdlcn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuU2l6ZS5IRUlHSFRfQ09OVFJPTFNfV0lEVEggPSAyO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHRvIGZpdCBpbnNpZGUgdGhlIGdpdmVuIHRhcmdldCBhcmVhLCB3aGlsZSBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW8uIERlcGVuZGluZyBvbiB0aGUgYXNwZWN0IHJhdGlvIHRoZXJlIG1heSBiZSBzb21lIHNwYWNlIGluc2lkZSB0aGUgYXJlYSB3aGljaCBpcyBub3QgY292ZXJlZC5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUuRklUXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAdHlwZSB7aW50ZWdlcn1cclxuICogQHNpbmNlIDMuMTYuMFxyXG4gKi9cclxuU2l6ZS5GSVQgPSAzO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHRvIG1ha2UgdGhlIHNpemUgY292ZXIgdGhlIGVudGlyZSB0YXJnZXQgYXJlYSB3aGlsZSBrZWVwaW5nIHRoZSBhc3BlY3QgcmF0aW8uIFRoaXMgbWF5IGV4dGVuZCBmdXJ0aGVyIG91dCB0aGFuIHRoZSB0YXJnZXQgc2l6ZS5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5TdHJ1Y3RzLlNpemUuRU5WRUxPUFxyXG4gKiBAY29uc3RhbnRcclxuICogQHR5cGUge2ludGVnZXJ9XHJcbiAqIEBzaW5jZSAzLjE2LjBcclxuICovXHJcblNpemUuRU5WRUxPUCA9IDQ7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNpemU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQcm9jZXNzIFF1ZXVlIEFkZCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFByb2Nlc3MgUXVldWUgd2hlbiBhIG5ldyBpdGVtIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byBpdHMgYWN0aXZlIGxpc3QuXHJcbiAqIFxyXG4gKiBZb3Ugd2lsbCBtb3N0IGNvbW1vbmx5IHNlZSB0aGlzIHVzZWQgYnkgYSBTY2VuZSdzIFVwZGF0ZSBMaXN0IHdoZW4gYSBuZXcgR2FtZSBPYmplY3QgaGFzIGJlZW4gYWRkZWQuXHJcbiAqIFxyXG4gKiBJbiB0aGF0IGluc3RhbmNlLCBsaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy5zeXMudXBkYXRlTGlzdC5vbignYWRkJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5TdHJ1Y3RzLkV2ZW50cyNQUk9DRVNTX1FVRVVFX0FERFxyXG4gKiBAc2luY2UgMy4yMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0geyp9IGl0ZW0gLSBUaGUgaXRlbSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgUHJvY2VzcyBRdWV1ZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2FkZCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBQcm9jZXNzIFF1ZXVlIFJlbW92ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFByb2Nlc3MgUXVldWUgd2hlbiBhIG5ldyBpdGVtIGlzIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gaXRzIGFjdGl2ZSBsaXN0LlxyXG4gKiBcclxuICogWW91IHdpbGwgbW9zdCBjb21tb25seSBzZWUgdGhpcyB1c2VkIGJ5IGEgU2NlbmUncyBVcGRhdGUgTGlzdCB3aGVuIGEgR2FtZSBPYmplY3QgaGFzIGJlZW4gcmVtb3ZlZC5cclxuICogXHJcbiAqIEluIHRoYXQgaW5zdGFuY2UsIGxpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnN5cy51cGRhdGVMaXN0Lm9uKCdyZW1vdmUnLCBsaXN0ZW5lcilgLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlN0cnVjdHMuRXZlbnRzI1BST0NFU1NfUVVFVUVfUkVNT1ZFXHJcbiAqIEBzaW5jZSAzLjIwLjBcclxuICogXHJcbiAqIEBwYXJhbSB7Kn0gaXRlbSAtIFRoZSBpdGVtIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgUHJvY2VzcyBRdWV1ZS5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlbW92ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlN0cnVjdHMuRXZlbnRzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgUFJPQ0VTU19RVUVVRV9BREQ6IHJlcXVpcmUoJy4vUFJPQ0VTU19RVUVVRV9BRERfRVZFTlQnKSxcclxuICAgIFBST0NFU1NfUVVFVUVfUkVNT1ZFOiByZXF1aXJlKCcuL1BST0NFU1NfUVVFVUVfUkVNT1ZFX0VWRU5UJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlN0cnVjdHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBMaXN0OiByZXF1aXJlKCcuL0xpc3QnKSxcclxuICAgIE1hcDogcmVxdWlyZSgnLi9NYXAnKSxcclxuICAgIFByb2Nlc3NRdWV1ZTogcmVxdWlyZSgnLi9Qcm9jZXNzUXVldWUnKSxcclxuICAgIFJUcmVlOiByZXF1aXJlKCcuL1JUcmVlJyksXHJcbiAgICBTZXQ6IHJlcXVpcmUoJy4vU2V0JyksXHJcbiAgICBTaXplOiByZXF1aXJlKCcuL1NpemUnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ2xhbXAgPSByZXF1aXJlKCcuLi9tYXRoL0NsYW1wJyk7XHJcbnZhciBDb2xvciA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvY29sb3IvQ29sb3InKTtcclxudmFyIENPTlNUID0gcmVxdWlyZSgnLi4vY29uc3QnKTtcclxudmFyIElzU2l6ZVBvd2VyT2ZUd28gPSByZXF1aXJlKCcuLi9tYXRoL3BvdzIvSXNTaXplUG93ZXJPZlR3bycpO1xyXG52YXIgVGV4dHVyZSA9IHJlcXVpcmUoJy4vVGV4dHVyZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBDYW52YXMgVGV4dHVyZSBpcyBhIHNwZWNpYWwga2luZCBvZiBUZXh0dXJlIHRoYXQgaXMgYmFja2VkIGJ5IGFuIEhUTUwgQ2FudmFzIEVsZW1lbnQgYXMgaXRzIHNvdXJjZS5cclxuICpcclxuICogWW91IGNhbiB1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB0ZXh0dXJlIHRvIGRyYXcgdG8gdGhlIGNhbnZhcyBlbGVtZW50IGRpcmVjdGx5LCB1c2luZyBhbGwgb2YgdGhlIHN0YW5kYXJkXHJcbiAqIGNhbnZhcyBvcGVyYXRpb25zIGF2YWlsYWJsZSBpbiB0aGUgYnJvd3Nlci4gQW55IEdhbWUgT2JqZWN0IGNhbiBiZSBnaXZlbiB0aGlzIHRleHR1cmUgYW5kIHdpbGwgcmVuZGVyIHdpdGggaXQuXHJcbiAqXHJcbiAqIE5vdGU6IFdoZW4gcnVubmluZyB1bmRlciBXZWJHTCB0aGUgQ2FudmFzIFRleHR1cmUgbmVlZHMgdG8gcmUtZ2VuZXJhdGUgaXRzIGJhc2UgV2ViR0xUZXh0dXJlIGFuZCByZXVwbG9hZCBpdCB0b1xyXG4gKiB0aGUgR1BVIGV2ZXJ5IHRpbWUgeW91IG1vZGlmeSBpdCwgb3RoZXJ3aXNlIHRoZSBjaGFuZ2VzIHlvdSBtYWtlIHRvIHRoaXMgdGV4dHVyZSB3aWxsIG5vdCBiZSB2aXNpYmxlLiBUbyBkbyB0aGlzXHJcbiAqIHlvdSBzaG91bGQgY2FsbCBgQ2FudmFzVGV4dHVyZS5yZWZyZXNoKClgIG9uY2UgeW91IGFyZSBmaW5pc2hlZCB3aXRoIHlvdXIgY2hhbmdlcyB0byB0aGUgY2FudmFzLiBUcnkgYW5kIGtlZXBcclxuICogdGhpcyB0byBhIG1pbmltdW0sIGVzcGVjaWFsbHkgb24gbGFyZ2UgY2FudmFzIHNpemVzLCBvciB5b3UgbWF5IGluYWR2ZXJ0ZW50bHkgdGhyYXNoIHRoZSBHUFUgYnkgY29uc3RhbnRseSB1cGxvYWRpbmdcclxuICogdGV4dHVyZSBkYXRhIHRvIGl0LiBUaGlzIHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5IGlmIHVzaW5nIHRoZSBDYW52YXMgUmVuZGVyZXIuXHJcbiAqIFxyXG4gKiBJdCBzdGFydHMgd2l0aCBvbmx5IG9uZSBmcmFtZSB0aGF0IGNvdmVycyB0aGUgd2hvbGUgb2YgdGhlIGNhbnZhcy4gWW91IGNhbiBhZGQgZnVydGhlciBmcmFtZXMsIHRoYXQgc3BlY2lmeVxyXG4gKiBzZWN0aW9ucyBvZiB0aGUgY2FudmFzIHVzaW5nIHRoZSBgYWRkYCBtZXRob2QuXHJcbiAqIFxyXG4gKiBTaG91bGQgeW91IG5lZWQgdG8gcmVzaXplIHRoZSBjYW52YXMgdXNlIHRoZSBgc2V0U2l6ZWAgbWV0aG9kIHNvIHRoYXQgaXQgYWNjdXJhdGVseSB1cGRhdGVzIGFsbCBvZiB0aGUgdW5kZXJseWluZ1xyXG4gKiB0ZXh0dXJlIGRhdGEgYXMgd2VsbC4gRm9yZ2V0dGluZyB0byBkbyB0aGlzIChpLmUuIGJ5IGNoYW5naW5nIHRoZSBjYW52YXMgc2l6ZSBkaXJlY3RseSBmcm9tIHlvdXIgY29kZSkgY291bGQgY2F1c2VcclxuICogZ3JhcGhpY2FsIGVycm9ycy5cclxuICpcclxuICogQGNsYXNzIENhbnZhc1RleHR1cmVcclxuICogQGV4dGVuZHMgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfSBtYW5hZ2VyIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRleHR1cmUgTWFuYWdlciB0aGlzIFRleHR1cmUgYmVsb25ncyB0by5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGlzIFRleHR1cmUuXHJcbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IHNvdXJjZSAtIFRoZSBjYW52YXMgZWxlbWVudCB0aGF0IGlzIHVzZWQgYXMgdGhlIGJhc2Ugb2YgdGhpcyB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjYW52YXMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY2FudmFzLlxyXG4gKi9cclxudmFyIENhbnZhc1RleHR1cmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IFRleHR1cmUsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBDYW52YXNUZXh0dXJlIChtYW5hZ2VyLCBrZXksIHNvdXJjZSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBUZXh0dXJlLmNhbGwodGhpcywgbWFuYWdlciwga2V5LCBzb3VyY2UsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZCgnX19CQVNFJywgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIFNvdXJjZSBvZiB0aGlzIENhbnZhcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI19zb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2V9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSB0aGlzLmZyYW1lc1snX19CQVNFJ10uc291cmNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc291cmNlIENhbnZhcyBFbGVtZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjY2FudmFzXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FudmFzID0gdGhpcy5fc291cmNlLmltYWdlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgMkQgQ2FudmFzIFJlbmRlcmluZyBDb250ZXh0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjY29udGV4dFxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBDYW52YXMuXHJcbiAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyByZWFkLW9ubHksIGlmIHlvdSB3aXNoIHRvIGNoYW5nZSBpdCB1c2UgdGhlIGBzZXRTaXplYCBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSN3aWR0aFxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgQ2FudmFzLlxyXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgcmVhZC1vbmx5LCBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgaXQgdXNlIHRoZSBgc2V0U2l6ZWAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjaGVpZ2h0XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjb250ZXh0IGltYWdlIGRhdGEuXHJcbiAgICAgICAgICogVXNlIHRoZSBgdXBkYXRlYCBtZXRob2QgdG8gcG9wdWxhdGUgdGhpcyB3aGVuIHRoZSBjYW52YXMgY2hhbmdlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2ltYWdlRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtJbWFnZURhdGF9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTMuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBVaW50OENsYW1wZWRBcnJheSB2aWV3IGludG8gdGhlIGBidWZmZXJgLlxyXG4gICAgICAgICAqIFVzZSB0aGUgYHVwZGF0ZWAgbWV0aG9kIHRvIHBvcHVsYXRlIHRoaXMgd2hlbiB0aGUgY2FudmFzIGNoYW5nZXMuXHJcbiAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5hdmFpbGFibGUgaW4gc29tZSBicm93c2Vycywgc3VjaCBhcyBFcGljIEJyb3dzZXIsIGR1ZSB0byB0aGVpciBzZWN1cml0eSByZXN0cmljdGlvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNkYXRhXHJcbiAgICAgICAgICogQHR5cGUge1VpbnQ4Q2xhbXBlZEFycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pbWFnZURhdGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmltYWdlRGF0YS5kYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gVWludDMyQXJyYXkgdmlldyBpbnRvIHRoZSBgYnVmZmVyYC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI3BpeGVsc1xyXG4gICAgICAgICAqIEB0eXBlIHtVaW50MzJBcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waXhlbHMgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBBcnJheUJ1ZmZlciB0aGUgc2FtZSBzaXplIGFzIHRoZSBjb250ZXh0IEltYWdlRGF0YS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2J1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheUJ1ZmZlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5idWZmZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZURhdGEuZGF0YS5idWZmZXIpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5pbWFnZURhdGEuZGF0YS5idWZmZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVscyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAod2luZG93LkFycmF5QnVmZmVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmltYWdlRGF0YS5kYXRhLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVscyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVscyA9IHRoaXMuaW1hZ2VEYXRhLmRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyByZS1jcmVhdGVzIHRoZSBgaW1hZ2VEYXRhYCBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQuXHJcbiAgICAgKiBJdCB0aGVuIHJlLWJ1aWxkcyB0aGUgQXJyYXlCdWZmZXIsIHRoZSBgZGF0YWAgVWludDhDbGFtcGVkQXJyYXkgcmVmZXJlbmNlIGFuZCB0aGUgYHBpeGVsc2AgSW50MzJBcnJheS5cclxuICAgICAqXHJcbiAgICAgKiBXYXJuaW5nOiBUaGlzIGlzIGEgdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uLCBzbyB1c2UgaXQgc3BhcmluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmV9IFRoaXMgQ2FudmFzVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhID0gdGhpcy5jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuaW1hZ2VEYXRhLmRhdGE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmltYWdlRGF0YS5kYXRhLmJ1ZmZlcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5pbWFnZURhdGEuZGF0YS5idWZmZXI7XHJcbiAgICAgICAgICAgIHRoaXMucGl4ZWxzID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYnVmZmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAod2luZG93LkFycmF5QnVmZmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5pbWFnZURhdGEuZGF0YS5sZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLnBpeGVscyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmJ1ZmZlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGl4ZWxzID0gdGhpcy5pbWFnZURhdGEuZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIuZ2FtZS5jb25maWcucmVuZGVyVHlwZSA9PT0gQ09OU1QuV0VCR0wpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIHRoZSBnaXZlbiBJbWFnZSBvciBDYW52YXMgZWxlbWVudCB0byB0aGlzIENhbnZhc1RleHR1cmUsIHRoZW4gdXBkYXRlcyB0aGUgaW50ZXJuYWxcclxuICAgICAqIEltYWdlRGF0YSBidWZmZXIgYW5kIGFycmF5cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2RyYXdcclxuICAgICAqIEBzaW5jZSAzLjEzLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBkcmF3IHRoZSBzb3VyY2UgYXQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGRyYXcgdGhlIHNvdXJjZSBhdC5cclxuICAgICAqIEBwYXJhbSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnQpfSBzb3VyY2UgLSBUaGUgZWxlbWVudCB0byBkcmF3IHRvIHRoaXMgY2FudmFzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhpcyBDYW52YXNUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBkcmF3OiBmdW5jdGlvbiAoeCwgeSwgc291cmNlKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5kcmF3SW1hZ2Uoc291cmNlLCB4LCB5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRHJhd3MgdGhlIGdpdmVuIHRleHR1cmUgZnJhbWUgdG8gdGhpcyBDYW52YXNUZXh0dXJlLCB0aGVuIHVwZGF0ZXMgdGhlIGludGVybmFsXHJcbiAgICAgKiBJbWFnZURhdGEgYnVmZmVyIGFuZCBhcnJheXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNkcmF3RnJhbWVcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBzdHJpbmctYmFzZWQgbmFtZSwgb3IgaW50ZWdlciBiYXNlZCBpbmRleCwgb2YgdGhlIEZyYW1lIHRvIGdldCBmcm9tIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeD0wXSAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gZHJhdyB0aGUgc291cmNlIGF0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeT0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gZHJhdyB0aGUgc291cmNlIGF0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhpcyBDYW52YXNUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBkcmF3RnJhbWU6IGZ1bmN0aW9uIChrZXksIGZyYW1lLCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcblxyXG4gICAgICAgIHZhciB0ZXh0dXJlRnJhbWUgPSB0aGlzLm1hbmFnZXIuZ2V0RnJhbWUoa2V5LCBmcmFtZSk7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0dXJlRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2QgPSB0ZXh0dXJlRnJhbWUuY2FudmFzRGF0YTtcclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRleHR1cmVGcmFtZS5jdXRXaWR0aDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRleHR1cmVGcmFtZS5jdXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIHZhciByZXMgPSB0ZXh0dXJlRnJhbWUuc291cmNlLnJlc29sdXRpb247XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZUZyYW1lLnNvdXJjZS5pbWFnZSxcclxuICAgICAgICAgICAgICAgIGNkLngsIGNkLnksXHJcbiAgICAgICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIHgsIHksXHJcbiAgICAgICAgICAgICAgICB3aWR0aCAvIHJlcyxcclxuICAgICAgICAgICAgICAgIGhlaWdodCAvIHJlc1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgcGl4ZWwgaW4gdGhlIENhbnZhc1RleHR1cmUgdG8gdGhlIGdpdmVuIGNvbG9yIGFuZCBhbHBoYSB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIHRvIHJ1biBpbiBsYXJnZSBxdWFudGl0aWVzLCBzbyB1c2Ugc3BhcmluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjc2V0UGl4ZWxcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgdG8gZ2V0LiBNdXN0IGxheSB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBDYW52YXNUZXh0dXJlIGFuZCBiZSBhbiBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgdG8gZ2V0LiBNdXN0IGxheSB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBDYW52YXNUZXh0dXJlIGFuZCBiZSBhbiBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSByZWQgLSBUaGUgcmVkIGNvbG9yIHZhbHVlLiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZ3JlZW4gLSBUaGUgZ3JlZW4gY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBibHVlIC0gVGhlIGJsdWUgY29sb3IgdmFsdWUuIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbYWxwaGE9MjU1XSAtIFRoZSBhbHBoYSB2YWx1ZS4gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNTUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FudmFzVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgc2V0UGl4ZWw6IGZ1bmN0aW9uICh4LCB5LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSlcclxuICAgIHtcclxuICAgICAgICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkgeyBhbHBoYSA9IDI1NTsgfVxyXG5cclxuICAgICAgICB4ID0gTWF0aC5hYnMoTWF0aC5mbG9vcih4KSk7XHJcbiAgICAgICAgeSA9IE1hdGguYWJzKE1hdGguZmxvb3IoeSkpO1xyXG5cclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHgsIHkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPiAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpbWFnZURhdGEgPSB0aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKHgsIHksIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgaW1hZ2VEYXRhLmRhdGFbMF0gPSByZWQ7XHJcbiAgICAgICAgICAgIGltYWdlRGF0YS5kYXRhWzFdID0gZ3JlZW47XHJcbiAgICAgICAgICAgIGltYWdlRGF0YS5kYXRhWzJdID0gYmx1ZTtcclxuICAgICAgICAgICAgaW1hZ2VEYXRhLmRhdGFbM10gPSBhbHBoYTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCB4LCB5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgdGhlIEltYWdlRGF0YSBpbnRvIHRoZSBjb250ZXh0IG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNwdXREYXRhXHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW1hZ2VEYXRhfSBpbWFnZURhdGEgLSBUaGUgSW1hZ2VEYXRhIHRvIHB1dCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIHB1dCB0aGUgaW1hZ2VEYXRhLiBNdXN0IGxheSB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBDYW52YXNUZXh0dXJlIGFuZCBiZSBhbiBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBwdXQgdGhlIGltYWdlRGF0YS4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcnR5WD0wXSAtIEhvcml6b250YWwgcG9zaXRpb24gKHggY29vcmRpbmF0ZSkgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBmcm9tIHdoaWNoIHRoZSBpbWFnZSBkYXRhIHdpbGwgYmUgZXh0cmFjdGVkLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlydHlZPTBdIC0gVmVydGljYWwgcG9zaXRpb24gKHggY29vcmRpbmF0ZSkgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBmcm9tIHdoaWNoIHRoZSBpbWFnZSBkYXRhIHdpbGwgYmUgZXh0cmFjdGVkLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZGlydHlXaWR0aF0gLSBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIHBhaW50ZWQuIERlZmF1bHRzIHRvIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2RpcnR5SGVpZ2h0XSAtIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIHBhaW50ZWQuIERlZmF1bHRzIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgQ2FudmFzVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgcHV0RGF0YTogZnVuY3Rpb24gKGltYWdlRGF0YSwgeCwgeSwgZGlydHlYLCBkaXJ0eVksIGRpcnR5V2lkdGgsIGRpcnR5SGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkaXJ0eVggPT09IHVuZGVmaW5lZCkgeyBkaXJ0eVggPSAwOyB9XHJcbiAgICAgICAgaWYgKGRpcnR5WSA9PT0gdW5kZWZpbmVkKSB7IGRpcnR5WSA9IDA7IH1cclxuICAgICAgICBpZiAoZGlydHlXaWR0aCA9PT0gdW5kZWZpbmVkKSB7IGRpcnR5V2lkdGggPSBpbWFnZURhdGEud2lkdGg7IH1cclxuICAgICAgICBpZiAoZGlydHlIZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBkaXJ0eUhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHgsIHksIGRpcnR5WCwgZGlydHlZLCBkaXJ0eVdpZHRoLCBkaXJ0eUhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW4gSW1hZ2VEYXRhIHJlZ2lvbiBmcm9tIHRoaXMgQ2FudmFzVGV4dHVyZSBmcm9tIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBzcGVjaWZpZWQuXHJcbiAgICAgKiBZb3UgY2FuIHdyaXRlIHRoaXMgYmFjayB1c2luZyBgQ2FudmFzVGV4dHVyZS5wdXREYXRhYCwgb3IgbWFuaXB1bGF0ZSBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2dldERhdGFcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIGFyZWEgdG8gZ2V0IHRoZSBJbWFnZURhdGEgZnJvbS4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhIHRvIGdldCB0aGUgSW1hZ2VEYXRhIGZyb20uIE11c3QgbGF5IHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIENhbnZhc1RleHR1cmUgYW5kIGJlIGFuIGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgZnJvbSB3aGljaCB0aGUgSW1hZ2VEYXRhIHdpbGwgYmUgZXh0cmFjdGVkLiBQb3NpdGl2ZSB2YWx1ZXMgYXJlIHRvIHRoZSByaWdodCwgYW5kIG5lZ2F0aXZlIHRvIHRoZSBsZWZ0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZnJvbSB3aGljaCB0aGUgSW1hZ2VEYXRhIHdpbGwgYmUgZXh0cmFjdGVkLiBQb3NpdGl2ZSB2YWx1ZXMgYXJlIGRvd24sIGFuZCBuZWdhdGl2ZSBhcmUgdXAuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge0ltYWdlRGF0YX0gVGhlIEltYWdlRGF0YSBleHRyYWN0ZWQgZnJvbSB0aGlzIENhbnZhc1RleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIGdldERhdGE6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHggPSBDbGFtcChNYXRoLmZsb29yKHgpLCAwLCB0aGlzLndpZHRoIC0gMSk7XHJcbiAgICAgICAgeSA9IENsYW1wKE1hdGguZmxvb3IoeSksIDAsIHRoaXMuaGVpZ2h0IC0gMSk7XHJcbiAgICAgICAgd2lkdGggPSBDbGFtcCh3aWR0aCwgMSwgdGhpcy53aWR0aCAtIHgpO1xyXG4gICAgICAgIGhlaWdodCA9IENsYW1wKGhlaWdodCwgMSwgdGhpcy5oZWlnaHQgLSB5KTtcclxuXHJcbiAgICAgICAgdmFyIGltYWdlRGF0YSA9IHRoaXMuY29udGV4dC5nZXRJbWFnZURhdGEoeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbWFnZURhdGE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjb2xvciBvZiBhIHNwZWNpZmljIHBpeGVsIGZyb20gdGhpcyB0ZXh0dXJlIGFuZCBzdG9yZSBpdCBpbiBhIENvbG9yIG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogSWYgeW91IGhhdmUgZHJhd24gYW55dGhpbmcgdG8gdGhpcyBDYW52YXNUZXh0dXJlIHNpbmNlIGl0IHdhcyBjcmVhdGVkIHlvdSBtdXN0IGNhbGwgYENhbnZhc1RleHR1cmUudXBkYXRlYCB0byByZWZyZXNoIHRoZSBhcnJheSBidWZmZXIsXHJcbiAgICAgKiBvdGhlcndpc2UgdGhpcyBtYXkgcmV0dXJuIG91dCBvZiBkYXRlIGNvbG9yIHZhbHVlcywgb3Igd29yc2UgLSB0aHJvdyBhIHJ1bi10aW1lIGVycm9yIGFzIGl0IHRyaWVzIHRvIGFjY2VzcyBhbiBhcnJheSBlbGVtZW50IHRoYXQgZG9lc24ndCBleGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2dldFBpeGVsXHJcbiAgICAgKiBAc2luY2UgMy4xMy4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFtvdXRdIC0gQSBDb2xvciBvYmplY3QgdG8gc3RvcmUgdGhlIHBpeGVsIHZhbHVlcyBpbi4gSWYgbm90IHByb3ZpZGVkIGEgbmV3IENvbG9yIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBbiBvYmplY3Qgd2l0aCB0aGUgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgdmFsdWVzIHNldCBpbiB0aGUgciwgZywgYiBhbmQgYSBwcm9wZXJ0aWVzLlxyXG4gICAgICovXHJcbiAgICBnZXRQaXhlbDogZnVuY3Rpb24gKHgsIHksIG91dClcclxuICAgIHtcclxuICAgICAgICBpZiAoIW91dClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG91dCA9IG5ldyBDb2xvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRJbmRleCh4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgICAgICAgIHZhciByID0gZGF0YVtpbmRleCArIDBdO1xyXG4gICAgICAgICAgICB2YXIgZyA9IGRhdGFbaW5kZXggKyAxXTtcclxuICAgICAgICAgICAgdmFyIGIgPSBkYXRhW2luZGV4ICsgMl07XHJcbiAgICAgICAgICAgIHZhciBhID0gZGF0YVtpbmRleCArIDNdO1xyXG5cclxuICAgICAgICAgICAgb3V0LnNldFRvKHIsIGcsIGIsIGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBwaXhlbHMgaW4gdGhlIGdpdmVuIHJlZ2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBleHRlbmRzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGlzIENhbnZhc1RleHR1cmUsXHJcbiAgICAgKiB0aGUgcmVnaW9uIGlzIHRydW5jYXRlZCB0byBmaXQuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHlvdSBoYXZlIGRyYXduIGFueXRoaW5nIHRvIHRoaXMgQ2FudmFzVGV4dHVyZSBzaW5jZSBpdCB3YXMgY3JlYXRlZCB5b3UgbXVzdCBjYWxsIGBDYW52YXNUZXh0dXJlLnVwZGF0ZWAgdG8gcmVmcmVzaCB0aGUgYXJyYXkgYnVmZmVyLFxyXG4gICAgICogb3RoZXJ3aXNlIHRoaXMgbWF5IHJldHVybiBvdXQgb2YgZGF0ZSBjb2xvciB2YWx1ZXMsIG9yIHdvcnNlIC0gdGhyb3cgYSBydW4tdGltZSBlcnJvciBhcyBpdCB0cmllcyB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudCB0aGF0IGRvZXNuJ3QgZXhpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNnZXRQaXhlbHNcclxuICAgICAqIEBzaW5jZSAzLjE2LjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeD0wXSAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSByZWdpb24uIE11c3QgbGF5IHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIENhbnZhc1RleHR1cmUgYW5kIGJlIGFuIGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt5PTBdIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlZ2lvbi4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIGdldC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBEZWZhdWx0cyB0byB0aGUgY2FudmFzIHdpZHRoIGlmIG5vdCBnaXZlbi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZ2V0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBnaXZlbiB3aWxsIGJlIHNldCB0byB0aGUgYHdpZHRoYC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR5cGVzLlRleHR1cmVzLlBpeGVsQ29uZmlnW11bXX0gQSAyZCBhcnJheSBvZiBQaXhlbCBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBnZXRQaXhlbHM6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IDA7IH1cclxuICAgICAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7IHkgPSAwOyB9XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSB0aGlzLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IHdpZHRoOyB9XHJcblxyXG4gICAgICAgIHggPSBNYXRoLmFicyhNYXRoLnJvdW5kKHgpKTtcclxuICAgICAgICB5ID0gTWF0aC5hYnMoTWF0aC5yb3VuZCh5KSk7XHJcblxyXG4gICAgICAgIHZhciBsZWZ0ID0gQ2xhbXAoeCwgMCwgdGhpcy53aWR0aCk7XHJcbiAgICAgICAgdmFyIHJpZ2h0ID0gQ2xhbXAoeCArIHdpZHRoLCAwLCB0aGlzLndpZHRoKTtcclxuICAgICAgICB2YXIgdG9wID0gQ2xhbXAoeSwgMCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIHZhciBib3R0b20gPSBDbGFtcCh5ICsgaGVpZ2h0LCAwLCB0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBwaXhlbCA9IG5ldyBDb2xvcigpO1xyXG5cclxuICAgICAgICB2YXIgb3V0ID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIHB5ID0gdG9wOyBweSA8IGJvdHRvbTsgcHkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByb3cgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIHB4ID0gbGVmdDsgcHggPCByaWdodDsgcHgrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGl4ZWwgPSB0aGlzLmdldFBpeGVsKHB4LCBweSwgcGl4ZWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJvdy5wdXNoKHsgeDogcHgsIHk6IHB5LCBjb2xvcjogcGl4ZWwuY29sb3IsIGFscGhhOiBwaXhlbC5hbHBoYUdMIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvdXQucHVzaChyb3cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBJbWFnZSBEYXRhIGluZGV4IGZvciB0aGUgZ2l2ZW4gcGl4ZWwgaW4gdGhpcyBDYW52YXNUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBpbmRleCBjYW4gYmUgdXNlZCB0byByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGB0aGlzLmRhdGFgIGFycmF5LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBpbmRleCBwb2ludHMgdG8gdGhlIHJlZCB2YWx1ZSBpbiB0aGUgYXJyYXkuIFRoZSBzdWJzZXF1ZW50IDMgaW5kZXhlc1xyXG4gICAgICogcG9pbnQgdG8gZ3JlZW4sIGJsdWUgYW5kIGFscGhhIHJlc3BlY3RpdmVseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlI2dldEluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4xNi4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsIHRvIGdldC4gTXVzdCBsYXkgd2l0aGluIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgQ2FudmFzVGV4dHVyZSBhbmQgYmUgYW4gaW50ZWdlci5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gXHJcbiAgICAgKi9cclxuICAgIGdldEluZGV4OiBmdW5jdGlvbiAoeCwgeSlcclxuICAgIHtcclxuICAgICAgICB4ID0gTWF0aC5hYnMoTWF0aC5yb3VuZCh4KSk7XHJcbiAgICAgICAgeSA9IE1hdGguYWJzKE1hdGgucm91bmQoeSkpO1xyXG5cclxuICAgICAgICBpZiAoeCA8IHRoaXMud2lkdGggJiYgeSA8IHRoaXMuaGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh4ICsgeSAqIHRoaXMud2lkdGgpICogNDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgbWFudWFsbHkgaWYgeW91IGFyZSBydW5uaW5nIHVuZGVyIFdlYkdMLlxyXG4gICAgICogSXQgd2lsbCByZWZyZXNoIHRoZSBXZWJHTFRleHR1cmUgZnJvbSB0aGUgQ2FudmFzIHNvdXJjZS4gT25seSBjYWxsIHRoaXMgaWYgeW91IGtub3cgdGhhdCB0aGVcclxuICAgICAqIGNhbnZhcyBoYXMgY2hhbmdlZCwgYXMgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBHUFUgdGV4dHVyZSBhbGxvY2F0aW9uIGNvc3QgaW52b2x2ZWQgaW4gZG9pbmcgc28uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNyZWZyZXNoXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhpcyBDYW52YXNUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICByZWZyZXNoOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZS51cGRhdGUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgQ2FudmFzIEVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNnZXRDYW52YXNcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgQ2FudmFzIERPTSBlbGVtZW50IHRoaXMgdGV4dHVyZSBpcyB1c2luZy5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FudmFzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSAyRCBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNnZXRDb250ZXh0XHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IFRoZSBDYW52YXMgUmVuZGVyaW5nIENvbnRleHQgdGhpcyB0ZXh0dXJlIGlzIHVzaW5nLlxyXG4gICAgICovXHJcbiAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBnaXZlbiByZWdpb24gb2YgdGhpcyBDYW52YXMgVGV4dHVyZSwgcmVzZXR0aW5nIGl0IGJhY2sgdG8gdHJhbnNwYXJlbnQuXHJcbiAgICAgKiBJZiBubyByZWdpb24gaXMgZ2l2ZW4sIHRoZSB3aG9sZSBDYW52YXMgVGV4dHVyZSBpcyBjbGVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjY2xlYXJcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt4PTBdIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlZ2lvbiB0byBjbGVhci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3k9MF0gLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmVnaW9uIHRvIGNsZWFyLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5DYW52YXNUZXh0dXJlfSBUaGUgQ2FudmFzIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSB7IHggPSAwOyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgeyB5ID0gMDsgfVxyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7IHdpZHRoID0gdGhpcy53aWR0aDsgfVxyXG4gICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkgeyBoZWlnaHQgPSB0aGlzLmhlaWdodDsgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBzaXplIG9mIHRoaXMgQ2FudmFzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgQ2FudmFzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0XSAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBDYW52YXMuIElmIG5vdCBnaXZlbiBpdCB3aWxsIHVzZSB0aGUgd2lkdGggYXMgdGhlIGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhlIENhbnZhcyBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBzZXRTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gd2lkdGg7IH1cclxuXHJcbiAgICAgICAgaWYgKHdpZHRoICE9PSB0aGlzLndpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5oZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgVXBkYXRlIHRoZSBDYW52YXNcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gIFVwZGF0ZSB0aGUgVGV4dHVyZSBTb3VyY2VcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5pc1Bvd2VyT2YyID0gSXNTaXplUG93ZXJPZlR3byh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vICBVcGRhdGUgdGhlIEZyYW1lXHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVzWydfX0JBU0UnXS5zZXRTaXplKHdpZHRoLCBoZWlnaHQsIDAsIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gIFVwZGF0ZSB0aGlzXHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgVGV4dHVyZSBhbmQgcmVsZWFzZXMgcmVmZXJlbmNlcyB0byBpdHMgc291cmNlcyBhbmQgZnJhbWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkNhbnZhc1RleHR1cmUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMTYuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIFRleHR1cmUucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmltYWdlRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBpeGVscyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENhbnZhc1RleHR1cmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vbWF0aC9DbGFtcCcpO1xyXG52YXIgRXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbHMvb2JqZWN0L0V4dGVuZCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBGcmFtZSBpcyBhIHNlY3Rpb24gb2YgYSBUZXh0dXJlLlxyXG4gKlxyXG4gKiBAY2xhc3MgRnJhbWVcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IHRleHR1cmUgLSBUaGUgVGV4dHVyZSB0aGlzIEZyYW1lIGlzIGEgcGFydCBvZi5cclxuICogQHBhcmFtIHsoaW50ZWdlcnxzdHJpbmcpfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhpcyBGcmFtZS4gVGhlIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgVGV4dHVyZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBzb3VyY2VJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgVGV4dHVyZVNvdXJjZSB0aGF0IHRoaXMgRnJhbWUgaXMgYSBwYXJ0IG9mLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoaXMgRnJhbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgb2YgdGhpcyBGcmFtZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoaXMgRnJhbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgRnJhbWUuXHJcbiAqL1xyXG52YXIgRnJhbWUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gRnJhbWUgKHRleHR1cmUsIG5hbWUsIHNvdXJjZUluZGV4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUZXh0dXJlIHRoaXMgRnJhbWUgaXMgYSBwYXJ0IG9mLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3RleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhpcyBGcmFtZS5cclxuICAgICAgICAgKiBUaGUgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUZXh0dXJlU291cmNlIHRoaXMgRnJhbWUgaXMgcGFydCBvZi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2V9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZVtzb3VyY2VJbmRleF07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgVGV4dHVyZVNvdXJjZSBpbiB0aGUgVGV4dHVyZSBzb3VyY2VzIGFycmF5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3NvdXJjZUluZGV4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zb3VyY2VJbmRleCA9IHNvdXJjZUluZGV4O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVGV4dHVyZSBTb3VyY2UgV2ViR0wgVGV4dHVyZSB0aGF0IHRoaXMgRnJhbWUgaXMgdXNpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjZ2xUZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUgez9XZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IHRoaXMuc291cmNlLmdsVGV4dHVyZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogWCBwb3NpdGlvbiB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZSB0byBjdXQgZnJvbS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNjdXRYXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXRYO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBZIHBvc2l0aW9uIHdpdGhpbiB0aGUgc291cmNlIGltYWdlIHRvIGN1dCBmcm9tLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2N1dFlcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1dFk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgYXJlYSBpbiB0aGUgc291cmNlIGltYWdlIHRvIGN1dC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNjdXRXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3V0V2lkdGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgaW4gdGhlIHNvdXJjZSBpbWFnZSB0byBjdXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjY3V0SGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBYIHJlbmRlcmluZyBvZmZzZXQgb2YgdGhpcyBGcmFtZSwgdGFraW5nIHRyaW0gaW50byBhY2NvdW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3hcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFkgcmVuZGVyaW5nIG9mZnNldCBvZiB0aGlzIEZyYW1lLCB0YWtpbmcgdHJpbSBpbnRvIGFjY291bnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjeVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcmVuZGVyaW5nIHdpZHRoIG9mIHRoaXMgRnJhbWUsIHRha2luZyB0cmltIGludG8gYWNjb3VudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZW5kZXJpbmcgaGVpZ2h0IG9mIHRoaXMgRnJhbWUsIHRha2luZyB0cmltIGludG8gYWNjb3VudC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGFsZiB0aGUgd2lkdGgsIGZsb29yZWQuXHJcbiAgICAgICAgICogUHJlY2FsY3VsYXRlZCBmb3IgdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2hhbGZXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGFsZldpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIYWxmIHRoZSBoZWlnaHQsIGZsb29yZWQuXHJcbiAgICAgICAgICogUHJlY2FsY3VsYXRlZCBmb3IgdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2hhbGZIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmhhbGZIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGNlbnRlciBvZiB0aGlzIGZyYW1lLCBmbG9vcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2NlbnRlclhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNlbnRlclg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB5IGNlbnRlciBvZiB0aGlzIGZyYW1lLCBmbG9vcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2NlbnRlcllcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNlbnRlclk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBob3Jpem9udGFsIHBpdm90IHBvaW50IG9mIHRoaXMgRnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjcGl2b3RYXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waXZvdFggPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdmVydGljYWwgcGl2b3QgcG9pbnQgb2YgdGhpcyBGcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNwaXZvdFlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBpdm90WSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvZXMgdGhpcyBGcmFtZSBoYXZlIGEgY3VzdG9tIHBpdm90IHBvaW50P1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2N1c3RvbVBpdm90XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1c3RvbVBpdm90ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqICoqQ1VSUkVOVExZIFVOU1VQUE9SVEVEKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElzIHRoaXMgZnJhbWUgaXMgcm90YXRlZCBvciBub3QgaW4gdGhlIFRleHR1cmU/XHJcbiAgICAgICAgICogUm90YXRpb24gYWxsb3dzIHlvdSB0byB1c2Ugcm90YXRlZCBmcmFtZXMgaW4gdGV4dHVyZSBhdGxhcyBwYWNraW5nLlxyXG4gICAgICAgICAqIEl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggU3ByaXRlIHJvdGF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3JvdGF0ZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm90YXRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBPdmVyLXJpZGVzIHRoZSBSZW5kZXJlciBzZXR0aW5nLlxyXG4gICAgICAgICAqIC0xID0gdXNlIFJlbmRlcmVyIFNldHRpbmdcclxuICAgICAgICAgKiAwID0gTm8gcm91bmRpbmdcclxuICAgICAgICAgKiAxID0gUm91bmRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNhdXRvUm91bmRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYXV0b1JvdW5kID0gLTE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFueSBGcmFtZSBzcGVjaWZpYyBjdXN0b20gZGF0YSBjYW4gYmUgc3RvcmVkIGhlcmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjY3VzdG9tRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlYkdMIFVWIHUwIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3UwXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudTAgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXZWJHTCBVViB2MCB2YWx1ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSN2MFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnYwID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2ViR0wgVVYgdTEgdmFsdWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjdTFcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51MSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlYkdMIFVWIHYxIHZhbHVlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3YxXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudjEgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdW4tbW9kaWZpZWQgc291cmNlIGZyYW1lLCB0cmltIGFuZCBVViBkYXRhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2RhdGFcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kYXRhID0ge1xyXG4gICAgICAgICAgICBjdXQ6IHtcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgdzogMCxcclxuICAgICAgICAgICAgICAgIGg6IDAsXHJcbiAgICAgICAgICAgICAgICByOiAwLFxyXG4gICAgICAgICAgICAgICAgYjogMFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmltOiBmYWxzZSxcclxuICAgICAgICAgICAgc291cmNlU2l6ZToge1xyXG4gICAgICAgICAgICAgICAgdzogMCxcclxuICAgICAgICAgICAgICAgIGg6IDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3ByaXRlU291cmNlU2l6ZToge1xyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3OiAwLFxyXG4gICAgICAgICAgICAgICAgaDogMCxcclxuICAgICAgICAgICAgICAgIHI6IDAsXHJcbiAgICAgICAgICAgICAgICBiOiAwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJhZGl1czogMCxcclxuICAgICAgICAgICAgZHJhd0ltYWdlOiB7XHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCwgeCwgeSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgd2lkdGgsIGhlaWdodCwgeCBhbmQgeSBvZiB0aGlzIEZyYW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICogYW5kIHNob3VsZCByYXJlbHkgYmUgY2hhbmdlZCBvbi10aGUtZmx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3NldFNpemVcclxuICAgICAqIEBzaW5jZSAzLjcuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGZyYW1lIGJlZm9yZSBiZWluZyB0cmltbWVkLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBmcmFtZSBiZWZvcmUgYmVpbmcgdHJpbW1lZC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3g9MF0gLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGlzIEZyYW1lLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbeT0wXSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoaXMgRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBUaGlzIEZyYW1lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXRYID0geDtcclxuICAgICAgICB0aGlzLmN1dFkgPSB5O1xyXG4gICAgICAgIHRoaXMuY3V0V2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmN1dEhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLmhhbGZXaWR0aCA9IE1hdGguZmxvb3Iod2lkdGggKiAwLjUpO1xyXG4gICAgICAgIHRoaXMuaGFsZkhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0ICogMC41KTtcclxuXHJcbiAgICAgICAgdGhpcy5jZW50ZXJYID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpO1xyXG4gICAgICAgIHRoaXMuY2VudGVyWSA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgICAgIHZhciBjdXQgPSBkYXRhLmN1dDtcclxuXHJcbiAgICAgICAgY3V0LnggPSB4O1xyXG4gICAgICAgIGN1dC55ID0geTtcclxuICAgICAgICBjdXQudyA9IHdpZHRoO1xyXG4gICAgICAgIGN1dC5oID0gaGVpZ2h0O1xyXG4gICAgICAgIGN1dC5yID0geCArIHdpZHRoO1xyXG4gICAgICAgIGN1dC5iID0geSArIGhlaWdodDtcclxuXHJcbiAgICAgICAgZGF0YS5zb3VyY2VTaXplLncgPSB3aWR0aDtcclxuICAgICAgICBkYXRhLnNvdXJjZVNpemUuaCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgZGF0YS5zcHJpdGVTb3VyY2VTaXplLncgPSB3aWR0aDtcclxuICAgICAgICBkYXRhLnNwcml0ZVNvdXJjZVNpemUuaCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgZGF0YS5yYWRpdXMgPSAwLjUgKiBNYXRoLnNxcnQod2lkdGggKiB3aWR0aCArIGhlaWdodCAqIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHZhciBkcmF3SW1hZ2UgPSBkYXRhLmRyYXdJbWFnZTtcclxuXHJcbiAgICAgICAgZHJhd0ltYWdlLnggPSB4O1xyXG4gICAgICAgIGRyYXdJbWFnZS55ID0geTtcclxuICAgICAgICBkcmF3SW1hZ2Uud2lkdGggPSB3aWR0aDtcclxuICAgICAgICBkcmF3SW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVVVnMoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgZnJhbWUgd2FzIHRyaW1tZWQgd2hlbiBhZGRlZCB0byB0aGUgVGV4dHVyZSBBdGxhcywgdGhpcyByZWNvcmRzIHRoZSB0cmltIGFuZCBzb3VyY2UgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNzZXRUcmltXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWN0dWFsV2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGZyYW1lIGJlZm9yZSBiZWluZyB0cmltbWVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFjdHVhbEhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGZyYW1lIGJlZm9yZSBiZWluZyB0cmltbWVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlc3RYIC0gVGhlIGRlc3RpbmF0aW9uIFggcG9zaXRpb24gb2YgdGhlIHRyaW1tZWQgZnJhbWUgZm9yIGRpc3BsYXkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVzdFkgLSBUaGUgZGVzdGluYXRpb24gWSBwb3NpdGlvbiBvZiB0aGUgdHJpbW1lZCBmcmFtZSBmb3IgZGlzcGxheS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXN0V2lkdGggLSBUaGUgZGVzdGluYXRpb24gd2lkdGggb2YgdGhlIHRyaW1tZWQgZnJhbWUgZm9yIGRpc3BsYXkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVzdEhlaWdodCAtIFRoZSBkZXN0aW5hdGlvbiBoZWlnaHQgb2YgdGhlIHRyaW1tZWQgZnJhbWUgZm9yIGRpc3BsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBUaGlzIEZyYW1lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VHJpbTogZnVuY3Rpb24gKGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQsIGRlc3RYLCBkZXN0WSwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xyXG4gICAgICAgIHZhciBzcyA9IGRhdGEuc3ByaXRlU291cmNlU2l6ZTtcclxuXHJcbiAgICAgICAgLy8gIFN0b3JlIGFjdHVhbCB2YWx1ZXNcclxuXHJcbiAgICAgICAgZGF0YS50cmltID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZGF0YS5zb3VyY2VTaXplLncgPSBhY3R1YWxXaWR0aDtcclxuICAgICAgICBkYXRhLnNvdXJjZVNpemUuaCA9IGFjdHVhbEhlaWdodDtcclxuXHJcbiAgICAgICAgc3MueCA9IGRlc3RYO1xyXG4gICAgICAgIHNzLnkgPSBkZXN0WTtcclxuICAgICAgICBzcy53ID0gZGVzdFdpZHRoO1xyXG4gICAgICAgIHNzLmggPSBkZXN0SGVpZ2h0O1xyXG4gICAgICAgIHNzLnIgPSBkZXN0WCArIGRlc3RXaWR0aDtcclxuICAgICAgICBzcy5iID0gZGVzdFkgKyBkZXN0SGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyAgQWRqdXN0IHByb3BlcnRpZXNcclxuICAgICAgICB0aGlzLnggPSBkZXN0WDtcclxuICAgICAgICB0aGlzLnkgPSBkZXN0WTtcclxuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IGRlc3RXaWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGRlc3RIZWlnaHQ7XHJcblxyXG4gICAgICAgIHRoaXMuaGFsZldpZHRoID0gZGVzdFdpZHRoICogMC41O1xyXG4gICAgICAgIHRoaXMuaGFsZkhlaWdodCA9IGRlc3RIZWlnaHQgKiAwLjU7XHJcblxyXG4gICAgICAgIHRoaXMuY2VudGVyWCA9IE1hdGguZmxvb3IoZGVzdFdpZHRoIC8gMik7XHJcbiAgICAgICAgdGhpcy5jZW50ZXJZID0gTWF0aC5mbG9vcihkZXN0SGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVVWcygpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY3JvcCBkYXRhIG9iamVjdCBhbmQsIGJhc2VkIG9uIHRoZSByZWN0YW5ndWxhciByZWdpb24gZ2l2ZW4sIGNhbGN1bGF0ZXMgdGhlXHJcbiAgICAgKiByZXF1aXJlZCBVViBjb29yZGluYXRlcyBpbiBvcmRlciB0byBjcm9wIHRoaXMgRnJhbWUgZm9yIFdlYkdMIGFuZCBDYW52YXMgcmVuZGVyaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgR2FtZSBPYmplY3QgVGV4dHVyZSBDb21wb25lbnRzIGBzZXRDcm9wYCBtZXRob2QuXHJcbiAgICAgKiBQbGVhc2UgdXNlIHRoYXQgbWV0aG9kIHRvIGNyb3AgYSBHYW1lIE9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNzZXRDcm9wVVZzXHJcbiAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjcm9wIC0gVGhlIGNyb3AgZGF0YSBvYmplY3QuIFRoaXMgaXMgdGhlIGBHYW1lT2JqZWN0Ll9jcm9wYCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBzdGFydCB0aGUgY3JvcCBmcm9tLiBDYW5ub3QgYmUgbmVnYXRpdmUgb3IgZXhjZWVkIHRoZSBGcmFtZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBzdGFydCB0aGUgY3JvcCBmcm9tLiBDYW5ub3QgYmUgbmVnYXRpdmUgb3IgZXhjZWVkIHRoZSBGcmFtZSBoZWlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGNyb3AgcmVjdGFuZ2xlLiBDYW5ub3QgZXhjZWVkIHRoZSBGcmFtZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjcm9wIHJlY3RhbmdsZS4gQ2Fubm90IGV4Y2VlZCB0aGUgRnJhbWUgaGVpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmbGlwWCAtIERvZXMgdGhlIHBhcmVudCBHYW1lIE9iamVjdCBoYXZlIGZsaXBYIHNldD9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFkgLSBEb2VzIHRoZSBwYXJlbnQgR2FtZSBPYmplY3QgaGF2ZSBmbGlwWSBzZXQ/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgdXBkYXRlZCBjcm9wIGRhdGEgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDcm9wVVZzOiBmdW5jdGlvbiAoY3JvcCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmxpcFgsIGZsaXBZKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBDbGFtcCB0aGUgaW5wdXQgdmFsdWVzXHJcblxyXG4gICAgICAgIHZhciBjeCA9IHRoaXMuY3V0WDtcclxuICAgICAgICB2YXIgY3kgPSB0aGlzLmN1dFk7XHJcbiAgICAgICAgdmFyIGN3ID0gdGhpcy5jdXRXaWR0aDtcclxuICAgICAgICB2YXIgY2ggPSB0aGlzLmN1dEhlaWdodDtcclxuICAgICAgICB2YXIgcncgPSB0aGlzLnJlYWxXaWR0aDtcclxuICAgICAgICB2YXIgcmggPSB0aGlzLnJlYWxIZWlnaHQ7XHJcblxyXG4gICAgICAgIHggPSBDbGFtcCh4LCAwLCBydyk7XHJcbiAgICAgICAgeSA9IENsYW1wKHksIDAsIHJoKTtcclxuXHJcbiAgICAgICAgd2lkdGggPSBDbGFtcCh3aWR0aCwgMCwgcncgLSB4KTtcclxuICAgICAgICBoZWlnaHQgPSBDbGFtcChoZWlnaHQsIDAsIHJoIC0geSk7XHJcblxyXG4gICAgICAgIHZhciBveCA9IGN4ICsgeDtcclxuICAgICAgICB2YXIgb3kgPSBjeSArIHk7XHJcbiAgICAgICAgdmFyIG93ID0gd2lkdGg7XHJcbiAgICAgICAgdmFyIG9oID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGEudHJpbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzcyA9IGRhdGEuc3ByaXRlU291cmNlU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIC8vICBOZWVkIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgY3V0IGFyZWEgYW5kIHRoZSBjcm9wIGFyZWFcclxuICAgICAgICAgICAgLy8gIElmIHRoZXJlIGlzIG5vbmUsIHdlIHNldCBVViB0byBiZSBlbXB0eSwgb3RoZXJ3aXNlIHNldCBpdCB0byBiZSB0aGUgaW50ZXJzZWN0aW9uIGFyZWFcclxuXHJcbiAgICAgICAgICAgIHdpZHRoID0gQ2xhbXAod2lkdGgsIDAsIGN3IC0geCk7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IENsYW1wKGhlaWdodCwgMCwgY2ggLSB5KTtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgY3JvcFJpZ2h0ID0geCArIHdpZHRoO1xyXG4gICAgICAgICAgICB2YXIgY3JvcEJvdHRvbSA9IHkgKyBoZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgaW50ZXJzZWN0cyA9ICEoc3MuciA8IHggfHwgc3MuYiA8IHkgfHwgc3MueCA+IGNyb3BSaWdodCB8fCBzcy55ID4gY3JvcEJvdHRvbSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0cylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl4ID0gTWF0aC5tYXgoc3MueCwgeCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXkgPSBNYXRoLm1heChzcy55LCB5KTtcclxuICAgICAgICAgICAgICAgIHZhciBpdyA9IE1hdGgubWluKHNzLnIsIGNyb3BSaWdodCkgLSBpeDtcclxuICAgICAgICAgICAgICAgIHZhciBpaCA9IE1hdGgubWluKHNzLmIsIGNyb3BCb3R0b20pIC0gaXk7XHJcblxyXG4gICAgICAgICAgICAgICAgb3cgPSBpdztcclxuICAgICAgICAgICAgICAgIG9oID0gaWg7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChmbGlwWClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBveCA9IGN4ICsgKGN3IC0gKGl4IC0gc3MueCkgLSBpdyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3ggPSBjeCArIChpeCAtIHNzLngpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGZsaXBZKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG95ID0gY3kgKyAoY2ggLSAoaXkgLSBzcy55KSAtIGloKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBveSA9IGN5ICsgKGl5IC0gc3MueSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgeCA9IGl4O1xyXG4gICAgICAgICAgICAgICAgeSA9IGl5O1xyXG5cclxuICAgICAgICAgICAgICAgIHdpZHRoID0gaXc7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBpaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG94ID0gMDtcclxuICAgICAgICAgICAgICAgIG95ID0gMDtcclxuICAgICAgICAgICAgICAgIG93ID0gMDtcclxuICAgICAgICAgICAgICAgIG9oID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG94ID0gY3ggKyAoY3cgLSB4IC0gd2lkdGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKGZsaXBZKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBveSA9IGN5ICsgKGNoIC0geSAtIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0dyA9IHRoaXMuc291cmNlLndpZHRoO1xyXG4gICAgICAgIHZhciB0aCA9IHRoaXMuc291cmNlLmhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gIE1hcCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgaW50byBVViBzcGFjZSwgY2xhbXBpbmcgdG8gdGhlIDAtMSByYW5nZS5cclxuXHJcbiAgICAgICAgY3JvcC51MCA9IE1hdGgubWF4KDAsIG94IC8gdHcpO1xyXG4gICAgICAgIGNyb3AudjAgPSBNYXRoLm1heCgwLCBveSAvIHRoKTtcclxuICAgICAgICBjcm9wLnUxID0gTWF0aC5taW4oMSwgKG94ICsgb3cpIC8gdHcpO1xyXG4gICAgICAgIGNyb3AudjEgPSBNYXRoLm1pbigxLCAob3kgKyBvaCkgLyB0aCk7XHJcblxyXG4gICAgICAgIGNyb3AueCA9IHg7XHJcbiAgICAgICAgY3JvcC55ID0geTtcclxuXHJcbiAgICAgICAgY3JvcC5jeCA9IG94O1xyXG4gICAgICAgIGNyb3AuY3kgPSBveTtcclxuICAgICAgICBjcm9wLmN3ID0gb3c7XHJcbiAgICAgICAgY3JvcC5jaCA9IG9oO1xyXG5cclxuICAgICAgICBjcm9wLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgY3JvcC5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGNyb3AuZmxpcFggPSBmbGlwWDtcclxuICAgICAgICBjcm9wLmZsaXBZID0gZmxpcFk7XHJcblxyXG4gICAgICAgIHJldHVybiBjcm9wO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY3JvcCBkYXRhIG9iamVjdCBhbmQgcmVjYWxjdWxhdGVzIHRoZSBVVnMgYmFzZWQgb24gdGhlIGRpbWVuc2lvbnMgaW5zaWRlIHRoZSBjcm9wIG9iamVjdC5cclxuICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IGBzZXRGcmFtZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjdXBkYXRlQ3JvcFVWc1xyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY3JvcCAtIFRoZSBjcm9wIGRhdGEgb2JqZWN0LiBUaGlzIGlzIHRoZSBgR2FtZU9iamVjdC5fY3JvcGAgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZsaXBYIC0gRG9lcyB0aGUgcGFyZW50IEdhbWUgT2JqZWN0IGhhdmUgZmxpcFggc2V0P1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmbGlwWSAtIERvZXMgdGhlIHBhcmVudCBHYW1lIE9iamVjdCBoYXZlIGZsaXBZIHNldD9cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSB1cGRhdGVkIGNyb3AgZGF0YSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNyb3BVVnM6IGZ1bmN0aW9uIChjcm9wLCBmbGlwWCwgZmxpcFkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q3JvcFVWcyhjcm9wLCBjcm9wLngsIGNyb3AueSwgY3JvcC53aWR0aCwgY3JvcC5oZWlnaHQsIGZsaXBYLCBmbGlwWSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgV2ViR0wgVVYgY2FjaGUgYW5kIHRoZSBkcmF3SW1hZ2UgY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjdXBkYXRlVVZzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuRnJhbWV9IFRoaXMgRnJhbWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVVVnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGN4ID0gdGhpcy5jdXRYO1xyXG4gICAgICAgIHZhciBjeSA9IHRoaXMuY3V0WTtcclxuICAgICAgICB2YXIgY3cgPSB0aGlzLmN1dFdpZHRoO1xyXG4gICAgICAgIHZhciBjaCA9IHRoaXMuY3V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyAgQ2FudmFzIGRhdGFcclxuXHJcbiAgICAgICAgdmFyIGNkID0gdGhpcy5kYXRhLmRyYXdJbWFnZTtcclxuXHJcbiAgICAgICAgY2Qud2lkdGggPSBjdztcclxuICAgICAgICBjZC5oZWlnaHQgPSBjaDtcclxuXHJcbiAgICAgICAgLy8gIFdlYkdMIGRhdGFcclxuXHJcbiAgICAgICAgdmFyIHR3ID0gdGhpcy5zb3VyY2Uud2lkdGg7XHJcbiAgICAgICAgdmFyIHRoID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xyXG5cclxuICAgICAgICB0aGlzLnUwID0gY3ggLyB0dztcclxuICAgICAgICB0aGlzLnYwID0gY3kgLyB0aDtcclxuXHJcbiAgICAgICAgdGhpcy51MSA9IChjeCArIGN3KSAvIHR3O1xyXG4gICAgICAgIHRoaXMudjEgPSAoY3kgKyBjaCkgLyB0aDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgV2ViR0wgVVYgY2FjaGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjdXBkYXRlVVZzSW52ZXJ0ZWRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gVGhpcyBGcmFtZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVVWc0ludmVydGVkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0dyA9IHRoaXMuc291cmNlLndpZHRoO1xyXG4gICAgICAgIHZhciB0aCA9IHRoaXMuc291cmNlLmhlaWdodDtcclxuXHJcbiAgICAgICAgdGhpcy51MCA9ICh0aGlzLmN1dFggKyB0aGlzLmN1dEhlaWdodCkgLyB0dztcclxuICAgICAgICB0aGlzLnYwID0gdGhpcy5jdXRZIC8gdGg7XHJcblxyXG4gICAgICAgIHRoaXMudTEgPSB0aGlzLmN1dFggLyB0dztcclxuICAgICAgICB0aGlzLnYxID0gKHRoaXMuY3V0WSArIHRoaXMuY3V0V2lkdGgpIC8gdGg7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb25lcyB0aGlzIEZyYW1lIGludG8gYSBuZXcgRnJhbWUgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLkZyYW1lI2Nsb25lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuRnJhbWV9IEEgY2xvbmUgb2YgdGhpcyBGcmFtZS5cclxuICAgICAqL1xyXG4gICAgY2xvbmU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNsb25lID0gbmV3IEZyYW1lKHRoaXMudGV4dHVyZSwgdGhpcy5uYW1lLCB0aGlzLnNvdXJjZUluZGV4KTtcclxuXHJcbiAgICAgICAgY2xvbmUuY3V0WCA9IHRoaXMuY3V0WDtcclxuICAgICAgICBjbG9uZS5jdXRZID0gdGhpcy5jdXRZO1xyXG4gICAgICAgIGNsb25lLmN1dFdpZHRoID0gdGhpcy5jdXRXaWR0aDtcclxuICAgICAgICBjbG9uZS5jdXRIZWlnaHQgPSB0aGlzLmN1dEhlaWdodDtcclxuXHJcbiAgICAgICAgY2xvbmUueCA9IHRoaXMueDtcclxuICAgICAgICBjbG9uZS55ID0gdGhpcy55O1xyXG5cclxuICAgICAgICBjbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgY2xvbmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGNsb25lLmhhbGZXaWR0aCA9IHRoaXMuaGFsZldpZHRoO1xyXG4gICAgICAgIGNsb25lLmhhbGZIZWlnaHQgPSB0aGlzLmhhbGZIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNsb25lLmNlbnRlclggPSB0aGlzLmNlbnRlclg7XHJcbiAgICAgICAgY2xvbmUuY2VudGVyWSA9IHRoaXMuY2VudGVyWTtcclxuXHJcbiAgICAgICAgY2xvbmUucm90YXRlZCA9IHRoaXMucm90YXRlZDtcclxuXHJcbiAgICAgICAgY2xvbmUuZGF0YSA9IEV4dGVuZCh0cnVlLCBjbG9uZS5kYXRhLCB0aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICBjbG9uZS51cGRhdGVVVnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb25lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgRnJhbWUgYnkgbnVsbGluZyBpdHMgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgVGV4dHVyZSBhbmQgYW5kIGRhdGEgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgRnJhbWUgaW4gaXRzIHVuLXRyaW1tZWQsIHVuLXBhZGRlZCBzdGF0ZSwgYXMgcHJlcGFyZWQgaW4gdGhlIGFydCBwYWNrYWdlLFxyXG4gICAgICogYmVmb3JlIGJlaW5nIHBhY2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjcmVhbFdpZHRoXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcmVhbFdpZHRoOiB7XHJcblxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc291cmNlU2l6ZS53O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgRnJhbWUgaW4gaXRzIHVuLXRyaW1tZWQsIHVuLXBhZGRlZCBzdGF0ZSwgYXMgcHJlcGFyZWQgaW4gdGhlIGFydCBwYWNrYWdlLFxyXG4gICAgICogYmVmb3JlIGJlaW5nIHBhY2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjcmVhbEhlaWdodFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHJlYWxIZWlnaHQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zb3VyY2VTaXplLmg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFkaXVzIG9mIHRoZSBGcmFtZSAoZGVyaXZlZCBmcm9tIHNxcnQodyAqIHcgKyBoICogaCkgLyAyKVxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GcmFtZSNyYWRpdXNcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICByYWRpdXM6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5yYWRpdXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJcyB0aGUgRnJhbWUgdHJpbW1lZCBvciBub3Q/XHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZyYW1lI3RyaW1tZWRcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgdHJpbW1lZDoge1xyXG5cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnRyaW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgQ2FudmFzIGRyYXdJbWFnZSBkYXRhIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuRnJhbWUjY2FudmFzRGF0YVxyXG4gICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNhbnZhc0RhdGE6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kcmF3SW1hZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi91dGlscy9DbGFzcycpO1xyXG52YXIgRnJhbWUgPSByZXF1aXJlKCcuL0ZyYW1lJyk7XHJcbnZhciBUZXh0dXJlU291cmNlID0gcmVxdWlyZSgnLi9UZXh0dXJlU291cmNlJyk7XHJcblxyXG52YXIgVEVYVFVSRV9NSVNTSU5HX0VSUk9SID0gJ1RleHR1cmUuZnJhbWUgbWlzc2luZzogJztcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgVGV4dHVyZSBjb25zaXN0cyBvZiBhIHNvdXJjZSwgdXN1YWxseSBhbiBJbWFnZSBmcm9tIHRoZSBDYWNoZSwgYW5kIGEgY29sbGVjdGlvbiBvZiBGcmFtZXMuXHJcbiAqIFRoZSBGcmFtZXMgcmVwcmVzZW50IHRoZSBkaWZmZXJlbnQgYXJlYXMgb2YgdGhlIFRleHR1cmUuIEZvciBleGFtcGxlIGEgdGV4dHVyZSBhdGxhc1xyXG4gKiBtYXkgaGF2ZSBtYW55IEZyYW1lcywgb25lIGZvciBlYWNoIGVsZW1lbnQgd2l0aGluIHRoZSBhdGxhcy4gV2hlcmUtYXMgYSBzaW5nbGUgaW1hZ2Ugd291bGQgaGF2ZVxyXG4gKiBqdXN0IG9uZSBmcmFtZSwgdGhhdCBlbmNvbXBhc3NlcyB0aGUgd2hvbGUgaW1hZ2UuXHJcbiAqIFxyXG4gKiBFdmVyeSBUZXh0dXJlLCBubyBtYXR0ZXIgd2hlcmUgaXQgY29tZXMgZnJvbSwgYWx3YXlzIGhhcyBhdCBsZWFzdCAxIGZyYW1lIGNhbGxlZCB0aGUgYF9fQkFTRWAgZnJhbWUuXHJcbiAqIFRoaXMgZnJhbWUgcmVwcmVzZW50cyB0aGUgZW50aXJldHkgb2YgdGhlIHNvdXJjZSBpbWFnZS5cclxuICpcclxuICogVGV4dHVyZXMgYXJlIG1hbmFnZWQgYnkgdGhlIGdsb2JhbCBUZXh0dXJlTWFuYWdlci4gVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcyB0aGF0IGlzXHJcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbmQgZGVsaXZlcmluZyBUZXh0dXJlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBGcmFtZXMgdG8gR2FtZSBPYmplY3RzLlxyXG4gKlxyXG4gKiBTcHJpdGVzIGFuZCBvdGhlciBHYW1lIE9iamVjdHMgZ2V0IHRoZSB0ZXh0dXJlIGRhdGEgdGhleSBuZWVkIGZyb20gdGhlIFRleHR1cmVNYW5hZ2VyLlxyXG4gKlxyXG4gKiBAY2xhc3MgVGV4dHVyZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRleHR1cmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXJ9IG1hbmFnZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyIHRoaXMgVGV4dHVyZSBiZWxvbmdzIHRvLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoaXMgVGV4dHVyZS5cclxuICogQHBhcmFtIHsoSFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MSW1hZ2VFbGVtZW50W118SFRNTENhbnZhc0VsZW1lbnRbXSl9IHNvdXJjZSAtIEFuIGFycmF5IG9mIHNvdXJjZXMgdGhhdCBhcmUgdXNlZCB0byBjcmVhdGUgdGhlIHRleHR1cmUuIFVzdWFsbHkgSW1hZ2VzLCBidXQgY2FuIGFsc28gYmUgYSBDYW52YXMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSBUZXh0dXJlLiBUaGlzIGlzIG9wdGlvbmFsIGFuZCBhdXRvbWF0aWNhbGx5IGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIGltYWdlcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgVGV4dHVyZS4gVGhpcyBpcyBvcHRpb25hbCBhbmQgYXV0b21hdGljYWxseSBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBpbWFnZXMuXHJcbiAqL1xyXG52YXIgVGV4dHVyZSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUZXh0dXJlIChtYW5hZ2VyLCBrZXksIHNvdXJjZSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNvdXJjZSA9IFsgc291cmNlIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyIHRoaXMgVGV4dHVyZSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmUjbWFuYWdlclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoaXMgVGV4dHVyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2tleVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIFRleHR1cmVTb3VyY2UgaW5zdGFuY2VzLlxyXG4gICAgICAgICAqIFRoZXNlIGFyZSB1bmlxdWUgdG8gdGhpcyBUZXh0dXJlIGFuZCBjb250YWluIHRoZSBhY3R1YWwgSW1hZ2UgKG9yIENhbnZhcykgZGF0YS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI3NvdXJjZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZVtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc291cmNlID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIFRleHR1cmVTb3VyY2UgZGF0YSBpbnN0YW5jZXMuXHJcbiAgICAgICAgICogVXNlZCB0byBzdG9yZSBhZGRpdGlvbmFsIGRhdGEgaW1hZ2VzLCBzdWNoIGFzIG5vcm1hbCBtYXBzIG9yIHNwZWN1bGFyIG1hcHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNkYXRhU291cmNlXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIGtleS12YWx1ZSBvYmplY3QgcGFpciBhc3NvY2lhdGluZyB0aGUgdW5pcXVlIEZyYW1lIGtleXMgd2l0aCB0aGUgRnJhbWVzIG9iamVjdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNmcmFtZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVzID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFueSBhZGRpdGlvbmFsIGRhdGEgdGhhdCB3YXMgc2V0IGluIHRoZSBzb3VyY2UgSlNPTiAoaWYgYW55KSxcclxuICAgICAgICAgKiBvciBhbnkgZXh0cmEgZGF0YSB5b3UnZCBsaWtlIHRvIHN0b3JlIHJlbGF0aW5nIHRvIHRoaXMgdGV4dHVyZVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmUjY3VzdG9tRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRhID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2ZpcnN0RnJhbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmlyc3RGcmFtZSA9ICdfX0JBU0UnO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIEZyYW1lcyBpbiB0aGlzIFRleHR1cmUsIGluY2x1ZGluZyB0aGUgYF9fQkFTRWAgZnJhbWUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQSBUZXh0dXJlIHdpbGwgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3QgMSBmcmFtZSBiZWNhdXNlIGV2ZXJ5IFRleHR1cmUgY29udGFpbnMgYSBgX19CQVNFYCBmcmFtZSBieSBkZWZhdWx0LFxyXG4gICAgICAgICAqIGluIGFkZGl0aW9uIHRvIGFueSBleHRyYSBmcmFtZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gaXQsIHN1Y2ggYXMgd2hlbiBwYXJzaW5nIGEgU3ByaXRlIFNoZWV0IG9yIFRleHR1cmUgQXRsYXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNmcmFtZVRvdGFsXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZnJhbWVUb3RhbCA9IDA7XHJcblxyXG4gICAgICAgIC8vICBMb2FkIHRoZSBTb3VyY2VzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZS5wdXNoKG5ldyBUZXh0dXJlU291cmNlKHRoaXMsIHNvdXJjZVtpXSwgd2lkdGgsIGhlaWdodCkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IEZyYW1lIHRvIHRoaXMgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBBIEZyYW1lIGlzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIGEgVGV4dHVyZVNvdXJjZSB3aXRoIGEgdW5pcXVlIGluZGV4IG9yIHN0cmluZy1iYXNlZCBrZXkuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBuYW1lIGdpdmVuIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGlzIFRleHR1cmUuIElmIGl0IGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBgbnVsbGAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8c3RyaW5nKX0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoaXMgRnJhbWUuIFRoZSBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHNvdXJjZUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlIHRoYXQgdGhpcyBGcmFtZSBpcyBhIHBhcnQgb2YuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoaXMgRnJhbWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoaXMgRnJhbWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhpcyBGcmFtZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoaXMgRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gVGhlIEZyYW1lIHRoYXQgd2FzIGFkZGVkIHRvIHRoaXMgVGV4dHVyZSwgb3IgYG51bGxgIGlmIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2VJbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5oYXMobmFtZSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IG5ldyBGcmFtZSh0aGlzLCBuYW1lLCBzb3VyY2VJbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuZnJhbWVzW25hbWVdID0gZnJhbWU7XHJcblxyXG4gICAgICAgIC8vICBTZXQgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBUZXh0dXJlIChvdGhlciB0aGFuIF9fQkFTRSlcclxuICAgICAgICAvLyAgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBzcGFtIHRoZSBkaXNwbGF5IHdpdGggZW50aXJlXHJcbiAgICAgICAgLy8gIGF0bGFzZXMgb2Ygc3ByaXRlIHNoZWV0cywgYnV0IGluc3RlYWQganVzdCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlbVxyXG4gICAgICAgIC8vICBzaG91bGQgdGhlIGRldiBpbmNvcnJlY3RseSBzcGVjaWZ5IHRoZSBmcmFtZSBpbmRleFxyXG4gICAgICAgIGlmICh0aGlzLmZpcnN0RnJhbWUgPT09ICdfX0JBU0UnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdEZyYW1lID0gbmFtZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZnJhbWVUb3RhbCsrO1xyXG5cclxuICAgICAgICByZXR1cm4gZnJhbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gRnJhbWUgZnJvbSB0aGlzIFRleHR1cmUuIFRoZSBGcmFtZSBpcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAgKiBcclxuICAgICAqIEFueSBHYW1lIE9iamVjdHMgdXNpbmcgdGhpcyBGcmFtZSBzaG91bGQgc3RvcCB1c2luZyBpdCBfYmVmb3JlXyB5b3UgcmVtb3ZlIGl0LFxyXG4gICAgICogYXMgaXQgZG9lcyBub3QgaGFwcGVuIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNyZW1vdmVcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXkgb2YgdGhlIEZyYW1lIHRvIHJlbW92ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgRnJhbWUgd2l0aCB0aGUgbWF0Y2hpbmcga2V5IHdhcyByZW1vdmVkIGZyb20gdGhpcyBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmhhcyhuYW1lKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmcmFtZSA9IHRoaXMuZ2V0KG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgZnJhbWUuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZnJhbWVzW25hbWVdO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiBhIEZyYW1lIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgZXhpc3RzIHdpdGhpbiB0aGlzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNoYXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleSBvZiB0aGUgRnJhbWUgdG8gY2hlY2sgZm9yLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSBGcmFtZSB3aXRoIHRoZSBtYXRjaGluZyBrZXkgZXhpc3RzIGluIHRoaXMgVGV4dHVyZS5cclxuICAgICAqL1xyXG4gICAgaGFzOiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZnJhbWVzW25hbWVdKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgRnJhbWUgZnJvbSB0aGlzIFRleHR1cmUgYmFzZWQgb24gZWl0aGVyIHRoZSBrZXkgb3IgdGhlIGluZGV4IG9mIHRoZSBGcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBJbiBhIFRleHR1cmUgQXRsYXMgRnJhbWVzIGFyZSB0eXBpY2FsbHkgcmVmZXJlbmNlZCBieSBhIGtleS5cclxuICAgICAqIEluIGEgU3ByaXRlIFNoZWV0IEZyYW1lcyBhcmUgcmVmZXJlbmNlZCBieSBhbiBpbmRleC5cclxuICAgICAqIFBhc3Npbmcgbm8gdmFsdWUgZm9yIHRoZSBuYW1lIHJldHVybnMgdGhlIGJhc2UgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbbmFtZV0gLSBUaGUgc3RyaW5nLWJhc2VkIG5hbWUsIG9yIGludGVnZXIgYmFzZWQgaW5kZXgsIG9mIHRoZSBGcmFtZSB0byBnZXQgZnJvbSB0aGlzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBUaGUgVGV4dHVyZSBGcmFtZS5cclxuICAgICAqL1xyXG4gICAgZ2V0OiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICAvLyAgbnVsbCwgdW5kZWZpbmVkLCBlbXB0eSBzdHJpbmcsIHplcm9cclxuICAgICAgICBpZiAoIW5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5maXJzdEZyYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5mcmFtZXNbbmFtZV07XHJcblxyXG4gICAgICAgIGlmICghZnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oVEVYVFVSRV9NSVNTSU5HX0VSUk9SICsgbmFtZSk7XHJcblxyXG4gICAgICAgICAgICBmcmFtZSA9IHRoaXMuZnJhbWVzW3RoaXMuZmlyc3RGcmFtZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZnJhbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgdGhlIGdpdmVuIFRleHR1cmVTb3VyY2UgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIGl0IHdpdGhpbiB0aGlzIFRleHR1cmUuXHJcbiAgICAgKiBJZiBpdCdzIG5vdCBpbiB0aGlzIFRleHR1cmUsIGl0IHJldHVybnMgLTEuXHJcbiAgICAgKiBVbmxlc3MgdGhpcyBUZXh0dXJlIGhhcyBtdWx0aXBsZSBUZXh0dXJlU291cmNlcywgc3VjaCBhcyB3aXRoIGEgbXVsdGktYXRsYXMsIHRoaXNcclxuICAgICAqIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gemVybyBvciAtMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldFRleHR1cmVTb3VyY2VJbmRleFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZX0gc291cmNlIC0gVGhlIFRleHR1cmVTb3VyY2UgdG8gY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlIHdpdGhpbiB0aGlzIFRleHR1cmUsIG9yIC0xIGlmIG5vdCBpbiB0aGlzIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIGdldFRleHR1cmVTb3VyY2VJbmRleDogZnVuY3Rpb24gKHNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc291cmNlLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW2ldID09PSBzb3VyY2UpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIEZyYW1lcyBpbiB0aGUgZ2l2ZW4gVGV4dHVyZVNvdXJjZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldEZyYW1lc0Zyb21UZXh0dXJlU291cmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHNvdXJjZUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlIHRvIGdldCB0aGUgRnJhbWVzIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmNsdWRlQmFzZT1mYWxzZV0gLSBJbmNsdWRlIHRoZSBgX19CQVNFYCBGcmFtZSBpbiB0aGUgb3V0cHV0IGFycmF5P1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5GcmFtZVtdfSBBbiBhcnJheSBvZiBUZXh0dXJlIEZyYW1lcy5cclxuICAgICAqL1xyXG4gICAgZ2V0RnJhbWVzRnJvbVRleHR1cmVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2VJbmRleCwgaW5jbHVkZUJhc2UpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGluY2x1ZGVCYXNlID09PSB1bmRlZmluZWQpIHsgaW5jbHVkZUJhc2UgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgb3V0ID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGZyYW1lTmFtZSBpbiB0aGlzLmZyYW1lcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChmcmFtZU5hbWUgPT09ICdfX0JBU0UnICYmICFpbmNsdWRlQmFzZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWVzW2ZyYW1lTmFtZV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZnJhbWUuc291cmNlSW5kZXggPT09IHNvdXJjZUluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXQucHVzaChmcmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBvZiB0aGUgbmFtZXMgb2YgdGhlIEZyYW1lcyBpbiB0aGlzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogVXNlZnVsIGlmIHlvdSB3YW50IHRvIHJhbmRvbWx5IGFzc2lnbiBhIEZyYW1lIHRvIGEgR2FtZSBPYmplY3QsIGFzIHlvdSBjYW5cclxuICAgICAqIHBpY2sgYSByYW5kb20gZWxlbWVudCBmcm9tIHRoZSByZXR1cm5lZCBhcnJheS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldEZyYW1lTmFtZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVCYXNlPWZhbHNlXSAtIEluY2x1ZGUgdGhlIGBfX0JBU0VgIEZyYW1lIGluIHRoZSBvdXRwdXQgYXJyYXk/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGFsbCBGcmFtZSBuYW1lcyBpbiB0aGlzIFRleHR1cmUuXHJcbiAgICAgKi9cclxuICAgIGdldEZyYW1lTmFtZXM6IGZ1bmN0aW9uIChpbmNsdWRlQmFzZSlcclxuICAgIHtcclxuICAgICAgICBpZiAoaW5jbHVkZUJhc2UgPT09IHVuZGVmaW5lZCkgeyBpbmNsdWRlQmFzZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBvdXQgPSBPYmplY3Qua2V5cyh0aGlzLmZyYW1lcyk7XHJcblxyXG4gICAgICAgIGlmICghaW5jbHVkZUJhc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ19fQkFTRScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIEZyYW1lIG5hbWUsIHJldHVybiB0aGUgc291cmNlIGltYWdlIGl0IHVzZXMgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgYWN0dWFsIERPTSBJbWFnZSBvciBDYW52YXMgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldFNvdXJjZUltYWdlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcil9IFtuYW1lXSAtIFRoZSBzdHJpbmctYmFzZWQgbmFtZSwgb3IgaW50ZWdlciBiYXNlZCBpbmRleCwgb2YgdGhlIEZyYW1lIHRvIGdldCBmcm9tIHRoaXMgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHsoSFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZSl9IFRoZSBET00gSW1hZ2UsIENhbnZhcyBFbGVtZW50IG9yIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICovXHJcbiAgICBnZXRTb3VyY2VJbWFnZTogZnVuY3Rpb24gKG5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCBuYW1lID09PSBudWxsIHx8IHRoaXMuZnJhbWVUb3RhbCA9PT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWUgPSAnX19CQVNFJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmcmFtZSA9IHRoaXMuZnJhbWVzW25hbWVdO1xyXG5cclxuICAgICAgICBpZiAoZnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZnJhbWUuc291cmNlLmltYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oVEVYVFVSRV9NSVNTSU5HX0VSUk9SICsgbmFtZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcmFtZXNbJ19fQkFTRSddLnNvdXJjZS5pbWFnZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gYSBGcmFtZSBuYW1lLCByZXR1cm4gdGhlIGRhdGEgc291cmNlIGltYWdlIGl0IHVzZXMgdG8gcmVuZGVyIHdpdGguXHJcbiAgICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGdldCB0aGUgbm9ybWFsIG1hcCBmb3IgYW4gaW1hZ2UgZm9yIGV4YW1wbGUuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyB3aWxsIHJldHVybiB0aGUgYWN0dWFsIERPTSBJbWFnZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI2dldERhdGFTb3VyY2VJbWFnZVxyXG4gICAgICogQHNpbmNlIDMuNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbbmFtZV0gLSBUaGUgc3RyaW5nLWJhc2VkIG5hbWUsIG9yIGludGVnZXIgYmFzZWQgaW5kZXgsIG9mIHRoZSBGcmFtZSB0byBnZXQgZnJvbSB0aGlzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnQpfSBUaGUgRE9NIEltYWdlIG9yIENhbnZhcyBFbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBnZXREYXRhU291cmNlSW1hZ2U6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0aGlzLmZyYW1lVG90YWwgPT09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lID0gJ19fQkFTRSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lc1tuYW1lXTtcclxuICAgICAgICB2YXIgaWR4O1xyXG5cclxuICAgICAgICBpZiAoIWZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFRFWFRVUkVfTUlTU0lOR19FUlJPUiArIG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWR4ID0gdGhpcy5mcmFtZXNbJ19fQkFTRSddLnNvdXJjZUluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZHggPSBmcmFtZS5zb3VyY2VJbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2VbaWR4XS5pbWFnZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgZGF0YSBzb3VyY2UgaW1hZ2UgdG8gdGhpcyBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEFuIGV4YW1wbGUgb2YgYSBkYXRhIHNvdXJjZSBpbWFnZSB3b3VsZCBiZSBhIG5vcm1hbCBtYXAsIHdoZXJlIGFsbCBvZiB0aGUgRnJhbWVzIGZvciB0aGlzIFRleHR1cmVcclxuICAgICAqIGVxdWFsbHkgYXBwbHkgdG8gdGhlIG5vcm1hbCBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZSNzZXREYXRhU291cmNlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnRbXXxIVE1MQ2FudmFzRWxlbWVudFtdKX0gZGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UuXHJcbiAgICAgKi9cclxuICAgIHNldERhdGFTb3VyY2U6IGZ1bmN0aW9uIChkYXRhKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBbIGRhdGEgXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlW2ldO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnB1c2gobmV3IFRleHR1cmVTb3VyY2UodGhpcywgZGF0YVtpXSwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIEZpbHRlciBNb2RlIGZvciB0aGlzIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG1vZGUgY2FuIGJlIGVpdGhlciBMaW5lYXIsIHRoZSBkZWZhdWx0LCBvciBOZWFyZXN0LlxyXG4gICAgICpcclxuICAgICAqIEZvciBwaXhlbC1hcnQgeW91IHNob3VsZCB1c2UgTmVhcmVzdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgbW9kZSBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgVGV4dHVyZSwgbm90IGp1c3QgYSBzcGVjaWZpYyBGcmFtZSBvZiBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlI3NldEZpbHRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuRmlsdGVyTW9kZX0gZmlsdGVyTW9kZSAtIFRoZSBGaWx0ZXIgTW9kZS5cclxuICAgICAqL1xyXG4gICAgc2V0RmlsdGVyOiBmdW5jdGlvbiAoZmlsdGVyTW9kZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc291cmNlLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VbaV0uc2V0RmlsdGVyKGZpbHRlck1vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZVtpXS5zZXRGaWx0ZXIoZmlsdGVyTW9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgVGV4dHVyZSBhbmQgcmVsZWFzZXMgcmVmZXJlbmNlcyB0byBpdHMgc291cmNlcyBhbmQgZnJhbWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmUjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgZnJhbWVOYW1lIGluIHRoaXMuZnJhbWVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGZyYW1lID0gdGhpcy5mcmFtZXNbZnJhbWVOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIGZyYW1lLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5mcmFtZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnJlbW92ZUtleSh0aGlzLmtleSk7XHJcblxyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGV4dHVyZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2FudmFzUG9vbCA9IHJlcXVpcmUoJy4uL2Rpc3BsYXkvY2FudmFzL0NhbnZhc1Bvb2wnKTtcclxudmFyIENhbnZhc1RleHR1cmUgPSByZXF1aXJlKCcuL0NhbnZhc1RleHR1cmUnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbG9yID0gcmVxdWlyZSgnLi4vZGlzcGxheS9jb2xvci9Db2xvcicpO1xyXG52YXIgQ09OU1QgPSByZXF1aXJlKCcuLi9jb25zdCcpO1xyXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpO1xyXG52YXIgRXZlbnRzID0gcmVxdWlyZSgnLi9ldmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgR2VuZXJhdGVUZXh0dXJlID0gcmVxdWlyZSgnLi4vY3JlYXRlL0dlbmVyYXRlVGV4dHVyZScpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIFBhcnNlciA9IHJlcXVpcmUoJy4vcGFyc2VycycpO1xyXG52YXIgVGV4dHVyZSA9IHJlcXVpcmUoJy4vVGV4dHVyZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBFYWNoVGV4dHVyZUNhbGxiYWNrXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IHRleHR1cmUgLSBFYWNoIHRleHR1cmUgaW4gVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLCBhZnRlciB0aGUgY2hpbGQuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogVGV4dHVyZXMgYXJlIG1hbmFnZWQgYnkgdGhlIGdsb2JhbCBUZXh0dXJlTWFuYWdlci4gVGhpcyBpcyBhIHNpbmdsZXRvbiBjbGFzcyB0aGF0IGlzXHJcbiAqIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbmQgZGVsaXZlcmluZyBUZXh0dXJlcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBGcmFtZXMgdG8gR2FtZSBPYmplY3RzLlxyXG4gKlxyXG4gKiBTcHJpdGVzIGFuZCBvdGhlciBHYW1lIE9iamVjdHMgZ2V0IHRoZSB0ZXh0dXJlIGRhdGEgdGhleSBuZWVkIGZyb20gdGhlIFRleHR1cmVNYW5hZ2VyLlxyXG4gKlxyXG4gKiBBY2Nlc3MgaXQgdmlhIGBzY2VuZS50ZXh0dXJlc2AuXHJcbiAqXHJcbiAqIEBjbGFzcyBUZXh0dXJlTWFuYWdlclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRleHR1cmVzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIFRoZSBQaGFzZXIuR2FtZSBpbnN0YW5jZSB0aGlzIFRleHR1cmUgTWFuYWdlciBiZWxvbmdzIHRvLlxyXG4gKi9cclxudmFyIFRleHR1cmVNYW5hZ2VyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBFdmVudEVtaXR0ZXIsXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUZXh0dXJlTWFuYWdlciAoZ2FtZSlcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIEdhbWUgdGhhdCB0aGlzIFRleHR1cmVNYW5hZ2VyIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjZ2FtZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdhbWUgPSBnYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIG1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjbmFtZVxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5uYW1lID0gJ1RleHR1cmVNYW5hZ2VyJztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IHRoYXQgaGFzIGFsbCBvZiB0ZXh0dXJlcyB0aGF0IFRleHR1cmUgTWFuYWdlciBjcmVhdGVzLlxyXG4gICAgICAgICAqIFRleHR1cmVzIGFyZSBhc3NpZ25lZCB0byBrZXlzIHNvIHdlIGNhbiBhY2Nlc3MgdG8gYW55IHRleHR1cmUgdGhhdCB0aGlzIG9iamVjdCBoYXMgZGlyZWN0bHkgYnkga2V5IHZhbHVlIHdpdGhvdXQgaXRlcmF0aW9uLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2xpc3RcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBkZWZhdWx0IHt9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5saXN0ID0ge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0ZW1wb3JhcnkgY2FudmFzIGVsZW1lbnQgdG8gc2F2ZSBhbiBwaXhlbCBkYXRhIG9mIGFuIGFyYml0cmFyeSB0ZXh0dXJlIGluIGdldFBpeGVsKCkgYW5kIGdldFBpeGVsQWxwaGEoKSBtZXRob2QuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjX3RlbXBDYW52YXNcclxuICAgICAgICAgKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wQ2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUyRCh0aGlzLCAxLCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbnRleHQgb2YgdGhlIHRlbXBvcmFyeSBjYW52YXMgZWxlbWVudCBtYWRlIHRvIHNhdmUgYW4gcGl4ZWwgZGF0YSBpbiBnZXRQaXhlbCgpIGFuZCBnZXRQaXhlbEFscGhhKCkgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI190ZW1wQ29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90ZW1wQ29udGV4dCA9IHRoaXMuX3RlbXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gY291bnRpbmcgdmFsdWUgdXNlZCBmb3IgZW1pdHRpbmcgJ3JlYWR5JyBldmVudCBhZnRlciBhbGwgb2YgbWFuYWdlcnMgaW4gZ2FtZSBpcyBsb2FkZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjX3BlbmRpbmdcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nID0gMDtcclxuXHJcbiAgICAgICAgZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkJPT1QsIHRoaXMuYm9vdCwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEJvb3QgSGFuZGxlciBjYWxsZWQgYnkgUGhhc2VyLkdhbWUgd2hlbiBpdCBmaXJzdCBzdGFydHMgdXAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSAyO1xyXG5cclxuICAgICAgICB0aGlzLm9uKEV2ZW50cy5MT0FELCB0aGlzLnVwZGF0ZVBlbmRpbmcsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMub24oRXZlbnRzLkVSUk9SLCB0aGlzLnVwZGF0ZVBlbmRpbmcsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEJhc2U2NCgnX19ERUZBVUxUJywgdGhpcy5nYW1lLmNvbmZpZy5kZWZhdWx0SW1hZ2UpO1xyXG4gICAgICAgIHRoaXMuYWRkQmFzZTY0KCdfX01JU1NJTkcnLCB0aGlzLmdhbWUuY29uZmlnLm1pc3NpbmdJbWFnZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZS5ldmVudHMub25jZShHYW1lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWZ0ZXIgJ29ubG9hZCcgb3IgJ29uZXJyb3InIGludm9rZWQgdHdpY2UsIGVtaXQgJ3JlYWR5JyBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciN1cGRhdGVQZW5kaW5nXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVBlbmRpbmc6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZy0tO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZyA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKEV2ZW50cy5MT0FEKTtcclxuICAgICAgICAgICAgdGhpcy5vZmYoRXZlbnRzLkVSUk9SKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuUkVBRFkpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgdGhlIGdpdmVuIHRleHR1cmUga2V5IGFuZCB0aHJvd3MgYSBjb25zb2xlLndhcm4gaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZSwgdGhlbiByZXR1cm5zIGZhbHNlLlxyXG4gICAgICogSWYgeW91IHdpc2ggdG8gYXZvaWQgdGhlIGNvbnNvbGUud2FybiB0aGVuIHVzZSBgVGV4dHVyZU1hbmFnZXIuZXhpc3RzYCBpbnN0ZWFkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2NoZWNrS2V5XHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHRleHR1cmUga2V5IHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCdzIHNhZmUgdG8gdXNlIHRoZSB0ZXh0dXJlIGtleSwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrS2V5OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmV4aXN0cyhrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGV4dHVyZSBrZXkgYWxyZWFkeSBpbiB1c2U6ICcgKyBrZXkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIFRleHR1cmUgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIGFuZCBkZXN0cm95cyBpdC4gVGhpcyB3aWxsIGltbWVkaWF0ZWx5XHJcbiAgICAgKiBjbGVhciBhbGwgcmVmZXJlbmNlcyB0byBpdCBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIsIGFuZCBpZiBpdCBoYXMgb25lLCBkZXN0cm95IGl0c1xyXG4gICAgICogV2ViR0xUZXh0dXJlLiBUaGlzIHdpbGwgZW1pdCBhIGByZW1vdmV0ZXh0dXJlYCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBJZiB5b3UgaGF2ZSBhbnkgR2FtZSBPYmplY3RzIHN0aWxsIHVzaW5nIHRoaXMgdGV4dHVyZSB0aGV5IHdpbGwgc3RhcnQgdGhyb3dpbmdcclxuICAgICAqIGVycm9ycyB0aGUgbmV4dCB0aW1lIHRoZXkgdHJ5IHRvIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgcmVtb3ZpbmcgdGhlIHRleHR1cmUgaXMgdGhlIGZpbmFsXHJcbiAgICAgKiBzdGVwIHdoZW4gY2xlYXJpbmcgZG93biB0byBhdm9pZCB0aGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI3JlbW92ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjUkVNT1ZFXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlRleHR1cmVzLlRleHR1cmUpfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRvIHJlbW92ZSwgb3IgYSByZWZlcmVuY2UgdG8gaXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyfSBUaGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKGtleSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuZ2V0KGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHRleHR1cmUgZm91bmQgbWF0Y2hpbmcga2V5OiAnICsga2V5KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQnkgdGhpcyBwb2ludCBrZXkgc2hvdWxkIGJlIGEgVGV4dHVyZSwgaWYgbm90LCB0aGUgZm9sbG93aW5nIGZhaWxzIGFueXdheVxyXG4gICAgICAgIGlmICh0aGlzLmxpc3QuaGFzT3duUHJvcGVydHkoa2V5LmtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBrZXkuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5SRU1PVkUsIGtleS5rZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGtleSBmcm9tIHRoZSBUZXh0dXJlIE1hbmFnZXIgYnV0IGRvZXMgbm90IGRlc3Ryb3kgdGhlIFRleHR1cmUgdGhhdCB3YXMgdXNpbmcgdGhlIGtleS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNyZW1vdmVLZXlcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byByZW1vdmUgZnJvbSB0aGUgdGV4dHVyZSBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlcn0gVGhlIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlS2V5OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3QuaGFzT3duUHJvcGVydHkoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3Rba2V5XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgVGV4dHVyZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gQmFzZTY0IGVuY29kZWQgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRCYXNlNjRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVGV4dHVyZXMuRXZlbnRzI0FERFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjRVJST1JcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVGV4dHVyZXMuRXZlbnRzI0xPQURcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgLSBUaGUgQmFzZTY0IGVuY29kZWQgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUZXh0dXJlIE1hbmFnZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIGFkZEJhc2U2NDogZnVuY3Rpb24gKGtleSwgZGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja0tleShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoRXZlbnRzLkVSUk9SLCBrZXkpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBfdGhpcy5jcmVhdGUoa2V5LCBpbWFnZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgUGFyc2VyLkltYWdlKHRleHR1cmUsIDApO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXQoRXZlbnRzLkFERCwga2V5LCB0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KEV2ZW50cy5MT0FELCBrZXksIHRleHR1cmUpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW4gZXhpc3RpbmcgdGV4dHVyZSBmcmFtZSBhbmQgY29udmVydHMgaXQgaW50byBhIGJhc2U2NCBlbmNvZGVkIGltYWdlIGFuZCByZXR1cm5zIHRoZSBiYXNlNjQgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgdGhlIGltYWdlIHR5cGUgYW5kIGVuY29kZXIgb3B0aW9ucy5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyB3aWxsIG9ubHkgd29yayB3aXRoIGJpdG1hcCBiYXNlZCB0ZXh0dXJlIGZyYW1lcywgc3VjaCBhcyB0aG9zZSBjcmVhdGVkIGZyb20gVGV4dHVyZSBBdGxhc2VzLlxyXG4gICAgICogSXQgd2lsbCBub3Qgd29yayB3aXRoIEdMIFRleHR1cmUgb2JqZWN0cywgc3VjaCBhcyBTaGFkZXJzLCBvciBSZW5kZXIgVGV4dHVyZXMuIEZvciB0aG9zZSBwbGVhc2VcclxuICAgICAqIHNlZSB0aGUgV2ViR0wgU25hcHNob3QgZnVuY3Rpb24gaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNnZXRCYXNlNjRcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIHN0cmluZy1iYXNlZCBuYW1lLCBvciBpbnRlZ2VyIGJhc2VkIGluZGV4LCBvZiB0aGUgRnJhbWUgdG8gZ2V0IGZyb20gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGU9J2ltYWdlL3BuZyddIC0gQSBET01TdHJpbmcgaW5kaWNhdGluZyB0aGUgaW1hZ2UgZm9ybWF0LiBUaGUgZGVmYXVsdCBmb3JtYXQgdHlwZSBpcyBpbWFnZS9wbmcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuY29kZXJPcHRpb25zPTAuOTJdIC0gQSBOdW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgdGhlIGltYWdlIHF1YWxpdHkgdG8gdXNlIGZvciBpbWFnZSBmb3JtYXRzIHRoYXQgdXNlIGxvc3N5IGNvbXByZXNzaW9uIHN1Y2ggYXMgaW1hZ2UvanBlZyBhbmQgaW1hZ2Uvd2VicC4gSWYgdGhpcyBhcmd1bWVudCBpcyBhbnl0aGluZyBlbHNlLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgaW1hZ2UgcXVhbGl0eSBpcyB1c2VkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLjkyLiBPdGhlciBhcmd1bWVudHMgYXJlIGlnbm9yZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgdGV4dHVyZSBmcmFtZSBjb3VsZCBub3QgYmUgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGdldEJhc2U2NDogZnVuY3Rpb24gKGtleSwgZnJhbWUsIHR5cGUsIGVuY29kZXJPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHsgdHlwZSA9ICdpbWFnZS9wbmcnOyB9XHJcbiAgICAgICAgaWYgKGVuY29kZXJPcHRpb25zID09PSB1bmRlZmluZWQpIHsgZW5jb2Rlck9wdGlvbnMgPSAwLjkyOyB9XHJcblxyXG4gICAgICAgIHZhciBkYXRhID0gJyc7XHJcblxyXG4gICAgICAgIHZhciB0ZXh0dXJlRnJhbWUgPSB0aGlzLmdldEZyYW1lKGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICBpZiAodGV4dHVyZUZyYW1lICYmICh0ZXh0dXJlRnJhbWUuc291cmNlLmlzUmVuZGVyVGV4dHVyZSB8fCB0ZXh0dXJlRnJhbWUuc291cmNlLmlzR0xUZXh0dXJlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IGdldEJhc2U2NCBmcm9tIFdlYkdMIFRleHR1cmUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGV4dHVyZUZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNkID0gdGV4dHVyZUZyYW1lLmNhbnZhc0RhdGE7XHJcblxyXG4gICAgICAgICAgICB2YXIgY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUyRCh0aGlzLCBjZC53aWR0aCwgY2QuaGVpZ2h0KTtcclxuICAgICAgICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShcclxuICAgICAgICAgICAgICAgIHRleHR1cmVGcmFtZS5zb3VyY2UuaW1hZ2UsXHJcbiAgICAgICAgICAgICAgICBjZC54LFxyXG4gICAgICAgICAgICAgICAgY2QueSxcclxuICAgICAgICAgICAgICAgIGNkLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgY2QuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICBjZC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGNkLmhlaWdodFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgZGF0YSA9IGNhbnZhcy50b0RhdGFVUkwodHlwZSwgZW5jb2Rlck9wdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUoY2FudmFzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgVGV4dHVyZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gSW1hZ2UgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRJbWFnZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBzb3VyY2UgLSBUaGUgc291cmNlIEltYWdlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR9IFtkYXRhU291cmNlXSAtIEFuIG9wdGlvbmFsIGRhdGEgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBhZGRJbWFnZTogZnVuY3Rpb24gKGtleSwgc291cmNlLCBkYXRhU291cmNlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tLZXkoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHR1cmUgPSB0aGlzLmNyZWF0ZShrZXksIHNvdXJjZSk7XHJcblxyXG4gICAgICAgICAgICBQYXJzZXIuSW1hZ2UodGV4dHVyZSwgMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dHVyZS5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkFERCwga2V5LCB0ZXh0dXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBXZWJHTCBUZXh0dXJlIGFuZCBjcmVhdGVzIGEgUGhhc2VyIFRleHR1cmUgZnJvbSBpdCwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIFRleHR1cmUgTWFuYWdlciB1c2luZyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gdGhlbiB1c2UgdGhlIFRleHR1cmUgYXMgYSBub3JtYWwgdGV4dHVyZSBmb3IgdGV4dHVyZSBiYXNlZCBHYW1lIE9iamVjdHMgbGlrZSBTcHJpdGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGlzIGEgV2ViR0wgb25seSBmZWF0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2FkZEdMVGV4dHVyZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSBnbFRleHR1cmUgLSBUaGUgc291cmNlIFJlbmRlciBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBhZGRHTFRleHR1cmU6IGZ1bmN0aW9uIChrZXksIGdsVGV4dHVyZSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGUoa2V5LCBnbFRleHR1cmUsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgdGV4dHVyZS5hZGQoJ19fQkFTRScsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5BREQsIGtleSwgdGV4dHVyZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBSZW5kZXIgVGV4dHVyZSB0byB0aGUgVGV4dHVyZSBNYW5hZ2VyIHVzaW5nIHRoZSBnaXZlbiBrZXkuXHJcbiAgICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gdGhlbiB1c2UgdGhlIFJlbmRlciBUZXh0dXJlIGFzIGEgbm9ybWFsIHRleHR1cmUgZm9yIHRleHR1cmUgYmFzZWQgR2FtZSBPYmplY3RzIGxpa2UgU3ByaXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRSZW5kZXJUZXh0dXJlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNBRERcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZX0gcmVuZGVyVGV4dHVyZSAtIFRoZSBzb3VyY2UgUmVuZGVyIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSB0aGF0IHdhcyBjcmVhdGVkLCBvciBgbnVsbGAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZS5cclxuICAgICAqL1xyXG4gICAgYWRkUmVuZGVyVGV4dHVyZTogZnVuY3Rpb24gKGtleSwgcmVuZGVyVGV4dHVyZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGUoa2V5LCByZW5kZXJUZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIHRleHR1cmUuYWRkKCdfX0JBU0UnLCAwLCAwLCAwLCByZW5kZXJUZXh0dXJlLndpZHRoLCByZW5kZXJUZXh0dXJlLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkFERCwga2V5LCB0ZXh0dXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0dXJlIHVzaW5nIHRoZSBnaXZlbiBjb25maWcgdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBHZW5lcmF0ZWQgdGV4dHVyZXMgY29uc2lzdCBvZiBhIENhbnZhcyBlbGVtZW50IHRvIHdoaWNoIHRoZSB0ZXh0dXJlIGRhdGEgaXMgZHJhd24uXHJcbiAgICAgKiBcclxuICAgICAqIEdlbmVyYXRlcyBhIHRleHR1cmUgYmFzZWQgb24gdGhlIGdpdmVuIENyZWF0ZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHRleHR1cmUgaXMgZHJhd24gdXNpbmcgYSBmaXhlZC1zaXplIGluZGV4ZWQgcGFsZXR0ZSBvZiAxNiBjb2xvcnMsIHdoZXJlIHRoZSBoZXggdmFsdWUgaW4gdGhlXHJcbiAgICAgKiBkYXRhIGNlbGxzIG1hcCB0byBhIHNpbmdsZSBjb2xvci4gRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXh0dXJlIGNvbmZpZyBsb29rZWQgbGlrZSB0aGlzOlxyXG4gICAgICpcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHZhciBzdGFyID0gW1xyXG4gICAgICogICAnLi4uLi44MjguLi4uLicsXHJcbiAgICAgKiAgICcuLi4uNzIyMjcuLi4uJyxcclxuICAgICAqICAgJy4uLi44MjIyOC4uLi4nLFxyXG4gICAgICogICAnLi4uNzIyMjIyNy4uLicsXHJcbiAgICAgKiAgICcyMjIyMjIyMjIyMjIyJyxcclxuICAgICAqICAgJzgyMjIyMjIyMjIyMjgnLFxyXG4gICAgICogICAnLjcyMjIyMjIyMjI3LicsXHJcbiAgICAgKiAgICcuLjc4Nzc3Nzc4Ny4uJyxcclxuICAgICAqICAgJy4uODc3Nzc3Nzc4Li4nLFxyXG4gICAgICogICAnLjc4Nzc4ODg3Nzg3LicsXHJcbiAgICAgKiAgICcuMjc4ODcuNzg4NzIuJyxcclxuICAgICAqICAgJy43ODcuLi4uLjc4Ny4nXHJcbiAgICAgKiBdO1xyXG4gICAgICogXHJcbiAgICAgKiB0aGlzLnRleHR1cmVzLmdlbmVyYXRlKCdzdGFyJywgeyBkYXRhOiBzdGFyLCBwaXhlbFdpZHRoOiA0IH0pO1xyXG4gICAgICogYGBgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZW4gaXQgd291bGQgZ2VuZXJhdGUgYSB0ZXh0dXJlIHRoYXQgaXMgNTIgeCA0OCBwaXhlbHMgaW4gc2l6ZSwgYmVjYXVzZSBlYWNoIGNlbGwgb2YgdGhlIGRhdGEgYXJyYXlcclxuICAgICAqIHJlcHJlc2VudHMgMSBwaXhlbCBtdWx0aXBsaWVkIGJ5IHRoZSBgcGl4ZWxXaWR0aGAgdmFsdWUuIFRoZSBjZWxsIHZhbHVlcywgc3VjaCBhcyBgOGAsIG1hcHMgdG8gY29sb3JcclxuICAgICAqIG51bWJlciA4IGluIHRoZSBwYWxldHRlLiBJZiBhIGNlbGwgY29udGFpbnMgYSBwZXJpb2QgY2hhcmFjdGVyIGAuYCB0aGVuIGl0IGlzIHRyYW5zcGFyZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBwYWxldHRlIGlzIEFybmUxNiwgYnV0IHlvdSBjYW4gc3BlY2lmeSB5b3VyIG93biB1c2luZyB0aGUgYHBhbGV0dGVgIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2dlbmVyYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuQ3JlYXRlLkdlbmVyYXRlVGV4dHVyZUNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG5lZWRlZCB0byBnZW5lcmF0ZSB0aGUgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBnZW5lcmF0ZTogZnVuY3Rpb24gKGtleSwgY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUodGhpcywgMSwgMSk7XHJcblxyXG4gICAgICAgICAgICBjb25maWcuY2FudmFzID0gY2FudmFzO1xyXG5cclxuICAgICAgICAgICAgR2VuZXJhdGVUZXh0dXJlKGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRDYW52YXMoa2V5LCBjYW52YXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0dXJlIHVzaW5nIGEgYmxhbmsgQ2FudmFzIGVsZW1lbnQgb2YgdGhlIHNpemUgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQ2FudmFzIGVsZW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IHBvb2xlZCBhbmQgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsXHJcbiAgICAgKiBleHRyYWN0IGEgZnJlZSBjYW52YXMgZnJvbSB0aGUgQ2FudmFzUG9vbCwgb3IgY3JlYXRlIG9uZSBpZiBub25lIGFyZSBhdmFpbGFibGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjY3JlYXRlQ2FudmFzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9MjU2XSAtIFRoZSB3aWR0aCBvZiB0aGUgQ2FudmFzIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9MjU2XSAtIFRoZSBoZWlnaHQgb2YgdGhlIENhbnZhcyBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhlIENhbnZhcyBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDYW52YXM6IGZ1bmN0aW9uIChrZXksIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAyNTY7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gMjU2OyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2FudmFzID0gQ2FudmFzUG9vbC5jcmVhdGUodGhpcywgd2lkdGgsIGhlaWdodCwgQ09OU1QuQ0FOVkFTLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZENhbnZhcyhrZXksIGNhbnZhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENhbnZhcyBUZXh0dXJlIG9iamVjdCBmcm9tIGFuIGV4aXN0aW5nIENhbnZhcyBlbGVtZW50XHJcbiAgICAgKiBhbmQgYWRkcyBpdCB0byB0aGlzIFRleHR1cmUgTWFuYWdlciwgdW5sZXNzIGBza2lwQ2FjaGVgIGlzIHRydWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjYWRkQ2FudmFzXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNBRERcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBzb3VyY2UgLSBUaGUgQ2FudmFzIGVsZW1lbnQgdG8gZm9ybSB0aGUgYmFzZSBvZiB0aGUgbmV3IFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwQ2FjaGU9ZmFsc2VdIC0gU2tpcCBhZGRpbmcgdGhpcyBUZXh0dXJlIGludG8gdGhlIENhY2hlP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuQ2FudmFzVGV4dHVyZX0gVGhlIENhbnZhcyBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBhZGRDYW52YXM6IGZ1bmN0aW9uIChrZXksIHNvdXJjZSwgc2tpcENhY2hlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChza2lwQ2FjaGUgPT09IHVuZGVmaW5lZCkgeyBza2lwQ2FjaGUgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChza2lwQ2FjaGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUodGhpcywga2V5LCBzb3VyY2UsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY2hlY2tLZXkoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgQ2FudmFzVGV4dHVyZSh0aGlzLCBrZXksIHNvdXJjZSwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubGlzdFtrZXldID0gdGV4dHVyZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQURELCBrZXksIHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBUZXh0dXJlIEF0bGFzIHRvIHRoaXMgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICogSXQgY2FuIGFjY2VwdCBlaXRoZXIgSlNPTiBBcnJheSBvciBKU09OIEhhc2ggZm9ybWF0cywgYXMgZXhwb3J0ZWQgYnkgVGV4dHVyZSBQYWNrZXIgYW5kIHNpbWlsYXIgc29mdHdhcmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjYWRkQXRsYXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gVGhlIFRleHR1cmUgQXRsYXMgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MSW1hZ2VFbGVtZW50W118SFRNTENhbnZhc0VsZW1lbnRbXX0gW2RhdGFTb3VyY2VdIC0gQW4gb3B0aW9uYWwgZGF0YSBJbWFnZSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB1c2UuXHJcbiAgICAgKi9cclxuICAgIGFkZEF0bGFzOiBmdW5jdGlvbiAoa2V5LCBzb3VyY2UsIGRhdGEsIGRhdGFTb3VyY2UpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIE5ldyBUZXh0dXJlIFBhY2tlciBmb3JtYXQ/XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50ZXh0dXJlcykgfHwgQXJyYXkuaXNBcnJheShkYXRhLmZyYW1lcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRBdGxhc0pTT05BcnJheShrZXksIHNvdXJjZSwgZGF0YSwgZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZEF0bGFzSlNPTkhhc2goa2V5LCBzb3VyY2UsIGRhdGEsIGRhdGFTb3VyY2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVGV4dHVyZSBBdGxhcyB0byB0aGlzIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIFRoZSBmcmFtZSBkYXRhIG9mIHRoZSBhdGxhcyBtdXN0IGJlIHN0b3JlZCBpbiBhbiBBcnJheSB3aXRoaW4gdGhlIEpTT04uXHJcbiAgICAgKiBUaGlzIGlzIGtub3duIGFzIGEgSlNPTiBBcnJheSBpbiBzb2Z0d2FyZSBzdWNoIGFzIFRleHR1cmUgUGFja2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2FkZEF0bGFzSlNPTkFycmF5XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNBRERcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0geyhIVE1MSW1hZ2VFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnRbXSl9IHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2UgZWxlbWVudC9zLlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fG9iamVjdFtdKX0gZGF0YSAtIFRoZSBUZXh0dXJlIEF0bGFzIGRhdGEvcy5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MSW1hZ2VFbGVtZW50W118SFRNTENhbnZhc0VsZW1lbnRbXX0gW2RhdGFTb3VyY2VdIC0gQW4gb3B0aW9uYWwgZGF0YSBJbWFnZSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB1c2UuXHJcbiAgICAgKi9cclxuICAgIGFkZEF0bGFzSlNPTkFycmF5OiBmdW5jdGlvbiAoa2V5LCBzb3VyY2UsIGRhdGEsIGRhdGFTb3VyY2UpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGVja0tleShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZSA9IHRoaXMuY3JlYXRlKGtleSwgc291cmNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBNdWx0aS1BdGxhcz9cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBzaW5nbGVBdGxhc0ZpbGUgPSAoZGF0YS5sZW5ndGggPT09IDEpOyAvLyBtdWx0aS1wYWNrIHdpdGggb25lIGF0bGFzIGZpbGUgZm9yIGFsbCBpbWFnZXNcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgISEgQXNzdW1lcyB0aGUgdGV4dHVyZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGluIHRoZSBzb3VyY2UgYXJyYXkgYXMgaW4gdGhlIGpzb24gZGF0YSAhIVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0dXJlLnNvdXJjZS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYXRsYXNEYXRhID0gc2luZ2xlQXRsYXNGaWxlID8gZGF0YVswXSA6IGRhdGFbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIFBhcnNlci5KU09OQXJyYXkodGV4dHVyZSwgaSwgYXRsYXNEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFBhcnNlci5KU09OQXJyYXkodGV4dHVyZSwgMCwgZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQURELCBrZXksIHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFRleHR1cmUgQXRsYXMgdG8gdGhpcyBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKiBUaGUgZnJhbWUgZGF0YSBvZiB0aGUgYXRsYXMgbXVzdCBiZSBzdG9yZWQgaW4gYW4gT2JqZWN0IHdpdGhpbiB0aGUgSlNPTi5cclxuICAgICAqIFRoaXMgaXMga25vd24gYXMgYSBKU09OIEhhc2ggaW4gc29mdHdhcmUgc3VjaCBhcyBUZXh0dXJlIFBhY2tlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRBdGxhc0pTT05IYXNoXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNBRERcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gVGhlIFRleHR1cmUgQXRsYXMgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MSW1hZ2VFbGVtZW50W118SFRNTENhbnZhc0VsZW1lbnRbXX0gW2RhdGFTb3VyY2VdIC0gQW4gb3B0aW9uYWwgZGF0YSBJbWFnZSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB1c2UuXHJcbiAgICAgKi9cclxuICAgIGFkZEF0bGFzSlNPTkhhc2g6IGZ1bmN0aW9uIChrZXksIHNvdXJjZSwgZGF0YSwgZGF0YVNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGUoa2V5LCBzb3VyY2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJzZXIuSlNPTkhhc2godGV4dHVyZSwgaSwgZGF0YVtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQYXJzZXIuSlNPTkhhc2godGV4dHVyZSwgMCwgZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQURELCBrZXksIHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFRleHR1cmUgQXRsYXMgdG8gdGhpcyBUZXh0dXJlIE1hbmFnZXIsIHdoZXJlIHRoZSBhdGxhcyBkYXRhIGlzIGdpdmVuXHJcbiAgICAgKiBpbiB0aGUgWE1MIGZvcm1hdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRBdGxhc1hNTFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBzb3VyY2UgLSBUaGUgc291cmNlIEltYWdlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIFRoZSBUZXh0dXJlIEF0bGFzIFhNTCBkYXRhLlxyXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEhUTUxJbWFnZUVsZW1lbnRbXXxIVE1MQ2FudmFzRWxlbWVudFtdfSBbZGF0YVNvdXJjZV0gLSBBbiBvcHRpb25hbCBkYXRhIEltYWdlIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSB0aGF0IHdhcyBjcmVhdGVkLCBvciBgbnVsbGAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZS5cclxuICAgICAqL1xyXG4gICAgYWRkQXRsYXNYTUw6IGZ1bmN0aW9uIChrZXksIHNvdXJjZSwgZGF0YSwgZGF0YVNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGUoa2V5LCBzb3VyY2UpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgUGFyc2VyLkF0bGFzWE1MKHRleHR1cmUsIDAsIGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHR1cmUuc2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5BREQsIGtleSwgdGV4dHVyZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgVW5pdHkgVGV4dHVyZSBBdGxhcyB0byB0aGlzIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIFRoZSBkYXRhIG11c3QgYmUgaW4gdGhlIGZvcm0gb2YgYSBVbml0eSBZQU1MIGZpbGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjYWRkVW5pdHlBdGxhc1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBzb3VyY2UgLSBUaGUgc291cmNlIEltYWdlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIFRoZSBUZXh0dXJlIEF0bGFzIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8SFRNTEltYWdlRWxlbWVudFtdfEhUTUxDYW52YXNFbGVtZW50W119IFtkYXRhU291cmNlXSAtIEFuIG9wdGlvbmFsIGRhdGEgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIGNyZWF0ZWQsIG9yIGBudWxsYCBpZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdXNlLlxyXG4gICAgICovXHJcbiAgICBhZGRVbml0eUF0bGFzOiBmdW5jdGlvbiAoa2V5LCBzb3VyY2UsIGRhdGEsIGRhdGFTb3VyY2UpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGVja0tleShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZSA9IHRoaXMuY3JlYXRlKGtleSwgc291cmNlKTtcclxuXHJcbiAgICAgICAgICAgIFBhcnNlci5Vbml0eVlBTUwodGV4dHVyZSwgMCwgZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YVNvdXJjZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dHVyZS5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkFERCwga2V5LCB0ZXh0dXJlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBTcHJpdGUgU2hlZXQgdG8gdGhpcyBUZXh0dXJlIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogSW4gUGhhc2VyIHRlcm1pbm9sb2d5IGEgU3ByaXRlIFNoZWV0IGlzIGEgdGV4dHVyZSBjb250YWluaW5nIGRpZmZlcmVudCBmcmFtZXMsIGJ1dCBlYWNoIGZyYW1lIGlzIHRoZSBleGFjdFxyXG4gICAgICogc2FtZSBzaXplIGFuZCBjYW5ub3QgYmUgdHJpbW1lZCBvciByb3RhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2FkZFNwcml0ZVNoZWV0XHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNBRERcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRleHR1cmVzLlNwcml0ZVNoZWV0Q29uZmlnfSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoaXMgU3ByaXRlIFNoZWV0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB1c2UuXHJcbiAgICAgKi9cclxuICAgIGFkZFNwcml0ZVNoZWV0OiBmdW5jdGlvbiAoa2V5LCBzb3VyY2UsIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrS2V5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5jcmVhdGUoa2V5LCBzb3VyY2UpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHdpZHRoID0gdGV4dHVyZS5zb3VyY2VbMF0ud2lkdGg7XHJcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0ZXh0dXJlLnNvdXJjZVswXS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBQYXJzZXIuU3ByaXRlU2hlZXQodGV4dHVyZSwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChFdmVudHMuQURELCBrZXksIHRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFNwcml0ZSBTaGVldCB0byB0aGlzIFRleHR1cmUgTWFuYWdlciwgd2hlcmUgdGhlIFNwcml0ZSBTaGVldCBleGlzdHMgYXMgYSBGcmFtZSB3aXRoaW4gYSBUZXh0dXJlIEF0bGFzLlxyXG4gICAgICpcclxuICAgICAqIEluIFBoYXNlciB0ZXJtaW5vbG9neSBhIFNwcml0ZSBTaGVldCBpcyBhIHRleHR1cmUgY29udGFpbmluZyBkaWZmZXJlbnQgZnJhbWVzLCBidXQgZWFjaCBmcmFtZSBpcyB0aGUgZXhhY3RcclxuICAgICAqIHNhbWUgc2l6ZSBhbmQgY2Fubm90IGJlIHRyaW1tZWQgb3Igcm90YXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNhZGRTcHJpdGVTaGVldEZyb21BdGxhc1xyXG4gICAgICogQGZpcmVzIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGV4dHVyZXMuU3ByaXRlU2hlZXRGcm9tQXRsYXNDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhpcyBTcHJpdGUgU2hlZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSB0aGF0IHdhcyBjcmVhdGVkLCBvciBgbnVsbGAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZS5cclxuICAgICAqL1xyXG4gICAgYWRkU3ByaXRlU2hlZXRGcm9tQXRsYXM6IGZ1bmN0aW9uIChrZXksIGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tLZXkoa2V5KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGF0bGFzS2V5ID0gR2V0VmFsdWUoY29uZmlnLCAnYXRsYXMnLCBudWxsKTtcclxuICAgICAgICB2YXIgYXRsYXNGcmFtZSA9IEdldFZhbHVlKGNvbmZpZywgJ2ZyYW1lJywgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmICghYXRsYXNLZXkgfHwgIWF0bGFzRnJhbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYXRsYXMgPSB0aGlzLmdldChhdGxhc0tleSk7XHJcbiAgICAgICAgdmFyIHNoZWV0ID0gYXRsYXMuZ2V0KGF0bGFzRnJhbWUpO1xyXG5cclxuICAgICAgICBpZiAoc2hlZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuY3JlYXRlKGtleSwgc2hlZXQuc291cmNlLmltYWdlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaGVldC50cmltbWVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSWYgdHJpbW1lZCB3ZSBuZWVkIHRvIGhlbHAgdGhlIHBhcnNlciBhZGp1c3RcclxuICAgICAgICAgICAgICAgIFBhcnNlci5TcHJpdGVTaGVldEZyb21BdGxhcyh0ZXh0dXJlLCBzaGVldCwgY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFBhcnNlci5TcHJpdGVTaGVldCh0ZXh0dXJlLCAwLCBzaGVldC5jdXRYLCBzaGVldC5jdXRZLCBzaGVldC5jdXRXaWR0aCwgc2hlZXQuY3V0SGVpZ2h0LCBjb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoRXZlbnRzLkFERCwga2V5LCB0ZXh0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHR1cmUgdXNpbmcgdGhlIGdpdmVuIHNvdXJjZSBhbmQgZGltZW5zaW9ucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNjcmVhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2UgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSB0aGF0IHdhcyBjcmVhdGVkLCBvciBgbnVsbGAgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHVzZS5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoa2V5LCBzb3VyY2UsIHdpZHRoLCBoZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jaGVja0tleShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKHRoaXMsIGtleSwgc291cmNlLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubGlzdFtrZXldID0gdGV4dHVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB0aGUgZ2l2ZW4ga2V5IHRvIHNlZSBpZiBhIFRleHR1cmUgdXNpbmcgaXQgZXhpc3RzIHdpdGhpbiB0aGlzIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNleGlzdHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBUZXh0dXJlIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgZXhpc3RzIGluIHRoaXMgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBleGlzdHM6IGZ1bmN0aW9uIChrZXkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmxpc3QuaGFzT3duUHJvcGVydHkoa2V5KSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIFRleHR1cmUgZnJvbSB0aGUgVGV4dHVyZSBNYW5hZ2VyIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUga2V5IGlzIGB1bmRlZmluZWRgIGl0IHdpbGwgcmV0dXJuIHRoZSBgX19ERUZBVUxUYCBUZXh0dXJlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUga2V5IGlzIGFuIGluc3RhbmNlIG9mIGEgVGV4dHVyZSwgaXQgd2lsbCByZXR1cm4gdGhlIGtleSBkaXJlY3RseS5cclxuICAgICAqIFxyXG4gICAgICogRmluYWxseS4gaWYgdGhlIGtleSBpcyBnaXZlbiwgYnV0IG5vdCBmb3VuZCBhbmQgbm90IGEgVGV4dHVyZSBpbnN0YW5jZSwgaXQgd2lsbCByZXR1cm4gdGhlIGBfX01JU1NJTkdgIFRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UGhhc2VyLlRleHR1cmVzLlRleHR1cmUpfSBrZXkgLSBUaGUgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUsIG9yIGEgVGV4dHVyZSBpbnN0YW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgdGhhdCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0OiBmdW5jdGlvbiAoa2V5KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkgeyBrZXkgPSAnX19ERUZBVUxUJzsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5saXN0W2tleV0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIFRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0WydfX01JU1NJTkcnXTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBUZXh0dXJlIGtleSBhbmQgRnJhbWUgbmFtZSBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoYXQgRnJhbWUgaWYgZm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjY2xvbmVGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gZnJhbWUgLSBUaGUgc3RyaW5nIG9yIGluZGV4IG9mIHRoZSBGcmFtZSB0byBiZSBjbG9uZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBBIENsb25lIG9mIHRoZSBnaXZlbiBGcmFtZS5cclxuICAgICAqL1xyXG4gICAgY2xvbmVGcmFtZTogZnVuY3Rpb24gKGtleSwgZnJhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdFtrZXldKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFtrZXldLmdldChmcmFtZSkuY2xvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBUZXh0dXJlIGtleSBhbmQgRnJhbWUgbmFtZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGF0IEZyYW1lLCBpZiBmb3VuZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNnZXRGcmFtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBzdHJpbmctYmFzZWQgbmFtZSwgb3IgaW50ZWdlciBiYXNlZCBpbmRleCwgb2YgdGhlIEZyYW1lIHRvIGdldCBmcm9tIHRoZSBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5GcmFtZX0gQSBUZXh0dXJlIEZyYW1lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0RnJhbWU6IGZ1bmN0aW9uIChrZXksIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3Rba2V5XSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3Rba2V5XS5nZXQoZnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIG9mIHRoZSBrZXlzIG9mIGFsbCBUZXh0dXJlcyBpbiB0aGlzIFRleHR1cmUgTWFuYWdlci5cclxuICAgICAqIFRoZSBvdXRwdXQgYXJyYXkgd2lsbCBleGNsdWRlIHRoZSBgX19ERUZBVUxUYCBhbmQgYF9fTUlTU0lOR2Aga2V5cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNnZXRUZXh0dXJlS2V5c1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBUZXh0dXJlIGtleXMgc3RvcmVkIGluIHRoaXMgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBnZXRUZXh0dXJlS2V5czogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgb3V0cHV0ID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxpc3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnX19ERUZBVUxUJyAmJiBrZXkgIT09ICdfX01JU1NJTkcnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgVGV4dHVyZSBhbmQgYW4gYHhgIGFuZCBgeWAgY29vcmRpbmF0ZSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIG5ld1xyXG4gICAgICogQ29sb3Igb2JqZWN0IHRoYXQgaGFzIGJlZW4gcG9wdWxhdGVkIHdpdGggdGhlIGNvbG9yIGFuZCBhbHBoYSB2YWx1ZXMgb2YgdGhlIHBpeGVsXHJcbiAgICAgKiBhdCB0aGF0IGxvY2F0aW9uIGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI2dldFBpeGVsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbCB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbCB3aXRoaW4gdGhlIFRleHR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIHN0cmluZyBvciBpbmRleCBvZiB0aGUgRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5EaXNwbGF5LkNvbG9yfSBBIENvbG9yIG9iamVjdCBwb3B1bGF0ZWQgd2l0aCB0aGUgY29sb3IgdmFsdWVzIG9mIHRoZSByZXF1ZXN0ZWQgcGl4ZWwsXHJcbiAgICAgKiBvciBgbnVsbGAgaWYgdGhlIGNvb3JkaW5hdGVzIHdlcmUgb3V0IG9mIGJvdW5kcy5cclxuICAgICAqL1xyXG4gICAgZ2V0UGl4ZWw6IGZ1bmN0aW9uICh4LCB5LCBrZXksIGZyYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ZXh0dXJlRnJhbWUgPSB0aGlzLmdldEZyYW1lKGtleSwgZnJhbWUpO1xyXG5cclxuICAgICAgICBpZiAodGV4dHVyZUZyYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFkanVzdCBmb3IgdHJpbSAoaWYgbm90IHRyaW1tZWQgeCBhbmQgeSBhcmUganVzdCB6ZXJvKVxyXG4gICAgICAgICAgICB4IC09IHRleHR1cmVGcmFtZS54O1xyXG4gICAgICAgICAgICB5IC09IHRleHR1cmVGcmFtZS55O1xyXG5cclxuICAgICAgICAgICAgdmFyIGRhdGEgPSB0ZXh0dXJlRnJhbWUuZGF0YS5jdXQ7XHJcblxyXG4gICAgICAgICAgICB4ICs9IGRhdGEueDtcclxuICAgICAgICAgICAgeSArPSBkYXRhLnk7XHJcblxyXG4gICAgICAgICAgICBpZiAoeCA+PSBkYXRhLnggJiYgeCA8IGRhdGEuciAmJiB5ID49IGRhdGEueSAmJiB5IDwgZGF0YS5iKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fdGVtcENvbnRleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCAxLCAxKTtcclxuICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodGV4dHVyZUZyYW1lLnNvdXJjZS5pbWFnZSwgeCwgeSwgMSwgMSwgMCwgMCwgMSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJnYiA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihyZ2IuZGF0YVswXSwgcmdiLmRhdGFbMV0sIHJnYi5kYXRhWzJdLCByZ2IuZGF0YVszXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgVGV4dHVyZSBhbmQgYW4gYHhgIGFuZCBgeWAgY29vcmRpbmF0ZSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1XHJcbiAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgcGl4ZWwgYXQgdGhhdCBsb2NhdGlvbiBpbiB0aGUgVGV4dHVyZS4gSWYgdGhlIGNvb3JkaW5hdGVcclxuICAgICAqIGlzIG91dCBvZiBib3VuZHMgaXQgd2lsbCByZXR1cm4gbnVsbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNnZXRQaXhlbEFscGhhXHJcbiAgICAgKiBAc2luY2UgMy4xMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgd2l0aGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwgd2l0aGluIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB1bmlxdWUgc3RyaW5nLWJhc2VkIGtleSBvZiB0aGUgVGV4dHVyZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyKX0gW2ZyYW1lXSAtIFRoZSBzdHJpbmcgb3IgaW5kZXggb2YgdGhlIEZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUsIG9yIGBudWxsYCBpZiB0aGUgY29vcmRpbmF0ZXMgd2VyZSBvdXQgb2YgYm91bmRzLlxyXG4gICAgICovXHJcbiAgICBnZXRQaXhlbEFscGhhOiBmdW5jdGlvbiAoeCwgeSwga2V5LCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGV4dHVyZUZyYW1lID0gdGhpcy5nZXRGcmFtZShrZXksIGZyYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHR1cmVGcmFtZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBBZGp1c3QgZm9yIHRyaW0gKGlmIG5vdCB0cmltbWVkIHggYW5kIHkgYXJlIGp1c3QgemVybylcclxuICAgICAgICAgICAgeCAtPSB0ZXh0dXJlRnJhbWUueDtcclxuICAgICAgICAgICAgeSAtPSB0ZXh0dXJlRnJhbWUueTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gdGV4dHVyZUZyYW1lLmRhdGEuY3V0O1xyXG5cclxuICAgICAgICAgICAgeCArPSBkYXRhLng7XHJcbiAgICAgICAgICAgIHkgKz0gZGF0YS55O1xyXG5cclxuICAgICAgICAgICAgaWYgKHggPj0gZGF0YS54ICYmIHggPCBkYXRhLnIgJiYgeSA+PSBkYXRhLnkgJiYgeSA8IGRhdGEuYilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuX3RlbXBDb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgMSwgMSk7XHJcbiAgICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKHRleHR1cmVGcmFtZS5zb3VyY2UuaW1hZ2UsIHgsIHksIDEsIDEsIDAsIDAsIDEsIDEpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICB2YXIgcmdiID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJnYi5kYXRhWzNdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBnaXZlbiBHYW1lIE9iamVjdHMgYHRleHR1cmVgIGFuZCBgZnJhbWVgIHByb3BlcnRpZXMgc28gdGhhdCBpdCB1c2VzXHJcbiAgICAgKiB0aGUgVGV4dHVyZSBhbmQgRnJhbWUgc3BlY2lmaWVkIGluIHRoZSBga2V5YCBhbmQgYGZyYW1lYCBhcmd1bWVudHMgdG8gdGhpcyBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjc2V0VGV4dHVyZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gZ2FtZU9iamVjdCAtIFRoZSBHYW1lIE9iamVjdCB0aGUgdGV4dHVyZSB3b3VsZCBiZSBzZXQgb24uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHVuaXF1ZSBzdHJpbmctYmFzZWQga2V5IG9mIHRoZSBUZXh0dXJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXIpfSBbZnJhbWVdIC0gVGhlIHN0cmluZyBvciBpbmRleCBvZiB0aGUgRnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3R9IFRoZSBHYW1lIE9iamVjdCB0aGUgdGV4dHVyZSB3YXMgc2V0IG9uLlxyXG4gICAgICovXHJcbiAgICBzZXRUZXh0dXJlOiBmdW5jdGlvbiAoZ2FtZU9iamVjdCwga2V5LCBmcmFtZSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5saXN0W2tleV0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnYW1lT2JqZWN0LnRleHR1cmUgPSB0aGlzLmxpc3Rba2V5XTtcclxuICAgICAgICAgICAgZ2FtZU9iamVjdC5mcmFtZSA9IGdhbWVPYmplY3QudGV4dHVyZS5nZXQoZnJhbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdhbWVPYmplY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyB0aGUga2V5IGJlaW5nIHVzZWQgYnkgYSBUZXh0dXJlIHRvIHRoZSBuZXcga2V5IHByb3ZpZGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgb2xkIGtleSBpcyByZW1vdmVkLCBhbGxvd2luZyBpdCB0byBiZSByZS11c2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBHYW1lIE9iamVjdHMgYXJlIGxpbmtlZCB0byBUZXh0dXJlcyBieSBhIHJlZmVyZW5jZSB0byB0aGUgVGV4dHVyZSBvYmplY3QsIHNvXHJcbiAgICAgKiBhbGwgZXhpc3RpbmcgcmVmZXJlbmNlcyB3aWxsIGJlIHJldGFpbmVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVNYW5hZ2VyI3JlbmFtZVRleHR1cmVcclxuICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudEtleSAtIFRoZSBjdXJyZW50IHN0cmluZy1iYXNlZCBrZXkgb2YgdGhlIFRleHR1cmUgeW91IHdpc2ggdG8gcmVuYW1lLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0tleSAtIFRoZSBuZXcgdW5pcXVlIHN0cmluZy1iYXNlZCBrZXkgdG8gdXNlIGZvciB0aGUgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFRleHR1cmUga2V5IHdhcyBzdWNjZXNzZnVsbHkgcmVuYW1lZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIHJlbmFtZVRleHR1cmU6IGZ1bmN0aW9uIChjdXJyZW50S2V5LCBuZXdLZXkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLmdldChjdXJyZW50S2V5KTtcclxuXHJcbiAgICAgICAgaWYgKHRleHR1cmUgJiYgY3VycmVudEtleSAhPT0gbmV3S2V5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZS5rZXkgPSBuZXdLZXk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxpc3RbbmV3S2V5XSA9IHRleHR1cmU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0W2N1cnJlbnRLZXldO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzc2VzIGFsbCBUZXh0dXJlcyB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZU1hbmFnZXIjZWFjaFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFYWNoVGV4dHVyZUNhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBzZW50IHRoZSBUZXh0dXJlcy5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzY29wZSAtIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIHRoZSBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2ssIGFmdGVyIHRoZSBjaGlsZC5cclxuICAgICAqL1xyXG4gICAgZWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrLCBzY29wZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgYXJncyA9IFsgbnVsbCBdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgdGV4dHVyZSBpbiB0aGlzLmxpc3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzWzBdID0gdGhpcy5saXN0W3RleHR1cmVdO1xyXG5cclxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkoc2NvcGUsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgVGV4dHVyZSBNYW5hZ2VyIGFuZCBhbGwgVGV4dHVyZXMgc3RvcmVkIHdpdGhpbiBpdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlTWFuYWdlciNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0ZXh0dXJlIGluIHRoaXMubGlzdClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdFt0ZXh0dXJlXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpc3QgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gbnVsbDtcclxuXHJcbiAgICAgICAgQ2FudmFzUG9vbC5yZW1vdmUodGhpcy5fdGVtcENhbnZhcyk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGV4dHVyZU1hbmFnZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENhbnZhc1Bvb2wgPSByZXF1aXJlKCcuLi9kaXNwbGF5L2NhbnZhcy9DYW52YXNQb29sJyk7XHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBJc1NpemVQb3dlck9mVHdvID0gcmVxdWlyZSgnLi4vbWF0aC9wb3cyL0lzU2l6ZVBvd2VyT2ZUd28nKTtcclxudmFyIFNjYWxlTW9kZXMgPSByZXF1aXJlKCcuLi9yZW5kZXJlci9TY2FsZU1vZGVzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFRleHR1cmUgU291cmNlIGlzIHRoZSBlbmNhcHN1bGF0aW9uIG9mIHRoZSBhY3R1YWwgc291cmNlIGRhdGEgZm9yIGEgVGV4dHVyZS5cclxuICogXHJcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGFuIEltYWdlIEVsZW1lbnQsIGxvYWRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbSBvciBuZXR3b3JrLCBhIENhbnZhcyBFbGVtZW50IG9yIGEgVmlkZW8gRWxlbWVudC5cclxuICpcclxuICogQSBUZXh0dXJlIGNhbiBjb250YWluIG11bHRpcGxlIFRleHR1cmUgU291cmNlcywgd2hpY2ggb25seSBoYXBwZW5zIHdoZW4gYSBtdWx0aS1hdGxhcyBpcyBsb2FkZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBUZXh0dXJlU291cmNlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGV4dHVyZXNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIFRleHR1cmUgdGhpcyBUZXh0dXJlU291cmNlIGJlbG9uZ3MgdG8uXHJcbiAqIEBwYXJhbSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudHxQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZXxXZWJHTFRleHR1cmUpfSBzb3VyY2UgLSBUaGUgc291cmNlIGltYWdlIGRhdGEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoXSAtIE9wdGlvbmFsIHdpZHRoIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIElmIG5vdCBnaXZlbiBpdCdzIGRlcml2ZWQgZnJvbSB0aGUgc291cmNlIGl0c2VsZi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0XSAtIE9wdGlvbmFsIGhlaWdodCBvZiB0aGUgc291cmNlIGltYWdlLiBJZiBub3QgZ2l2ZW4gaXQncyBkZXJpdmVkIGZyb20gdGhlIHNvdXJjZSBpdHNlbGYuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFNldHMgdGhlIGBVTlBBQ0tfRkxJUF9ZX1dFQkdMYCBmbGFnIHRoZSBXZWJHTCBUZXh0dXJlIHVzZXMgZHVyaW5nIHVwbG9hZC5cclxuICovXHJcbnZhciBUZXh0dXJlU291cmNlID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRleHR1cmVTb3VyY2UgKHRleHR1cmUsIHNvdXJjZSwgd2lkdGgsIGhlaWdodCwgZmxpcFkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGZsaXBZID09PSB1bmRlZmluZWQpIHsgZmxpcFkgPSBmYWxzZTsgfVxyXG5cclxuICAgICAgICB2YXIgZ2FtZSA9IHRleHR1cmUubWFuYWdlci5nYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVGV4dHVyZSB0aGlzIFRleHR1cmVTb3VyY2UgYmVsb25ncyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRleHR1cmUgdGhpcyBUZXh0dXJlU291cmNlIGJlbG9uZ3MgdG8uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSN0ZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhlIGltYWdlIGRhdGEuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBpcyBlaXRoZXIgYW4gSW1hZ2UgRWxlbWVudCwgYSBDYW52YXMgRWxlbWVudCwgYSBWaWRlbyBFbGVtZW50LCBhIFJlbmRlclRleHR1cmUgb3IgYSBXZWJHTFRleHR1cmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSNzb3VyY2VcclxuICAgICAgICAgKiBAdHlwZSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudHxQaGFzZXIuR2FtZU9iamVjdHMuUmVuZGVyVGV4dHVyZXxXZWJHTFRleHR1cmUpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGltYWdlIGRhdGEuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBpcyBlaXRoZXIgYW4gSW1hZ2UgZWxlbWVudCwgQ2FudmFzIGVsZW1lbnQgb3IgYSBWaWRlbyBFbGVtZW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjaW1hZ2VcclxuICAgICAgICAgKiBAdHlwZSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudCl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbWFnZSA9IHNvdXJjZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ3VycmVudGx5IHVuLXVzZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSNjb21wcmVzc2lvbkFsZ29yaXRobVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IG51bGxcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXByZXNzaW9uQWxnb3JpdGhtID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHNvdXJjZSBpbWFnZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI3Jlc29sdXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHNvdXJjZSBpbWFnZS4gSWYgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgaXQgd2lsbCBjaGVja1xyXG4gICAgICAgICAqIHRoZSBgbmF0dXJhbFdpZHRoYCBhbmQgdGhlbiBgd2lkdGhgIHByb3BlcnRpZXMgb2YgdGhlIHNvdXJjZSBpbWFnZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI3dpZHRoXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoIHx8IHNvdXJjZS5uYXR1cmFsV2lkdGggfHwgc291cmNlLnZpZGVvV2lkdGggfHwgc291cmNlLndpZHRoIHx8IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHNvdXJjZSBpbWFnZS4gSWYgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgaXQgd2lsbCBjaGVja1xyXG4gICAgICAgICAqIHRoZSBgbmF0dXJhbEhlaWdodGAgYW5kIHRoZW4gYGhlaWdodGAgcHJvcGVydGllcyBvZiB0aGUgc291cmNlIGltYWdlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjaGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgfHwgc291cmNlLm5hdHVyYWxIZWlnaHQgfHwgc291cmNlLnZpZGVvSGVpZ2h0IHx8IHNvdXJjZS5oZWlnaHQgfHwgMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFNjYWxlIE1vZGUgdGhlIGltYWdlIHdpbGwgdXNlIHdoZW4gcmVuZGVyaW5nLlxyXG4gICAgICAgICAqIEVpdGhlciBMaW5lYXIgb3IgTmVhcmVzdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI3NjYWxlTW9kZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2FsZU1vZGUgPSBTY2FsZU1vZGVzLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBzb3VyY2UgaW1hZ2UgYSBDYW52YXMgRWxlbWVudD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI2lzQ2FudmFzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc0NhbnZhcyA9IChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBzb3VyY2UgaW1hZ2UgYSBWaWRlbyBFbGVtZW50P1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjaXNWaWRlb1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzVmlkZW8gPSAod2luZG93Lmhhc093blByb3BlcnR5KCdIVE1MVmlkZW9FbGVtZW50JykgJiYgc291cmNlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBzb3VyY2UgaW1hZ2UgYSBSZW5kZXIgVGV4dHVyZT9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI2lzUmVuZGVyVGV4dHVyZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzUmVuZGVyVGV4dHVyZSA9IChzb3VyY2UudHlwZSA9PT0gJ1JlbmRlclRleHR1cmUnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXMgdGhlIHNvdXJjZSBpbWFnZSBhIFdlYkdMVGV4dHVyZT9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5UZXh0dXJlU291cmNlI2lzR0xUZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNHTFRleHR1cmUgPSAod2luZG93Lmhhc093blByb3BlcnR5KCdXZWJHTFRleHR1cmUnKSAmJiBzb3VyY2UgaW5zdGFuY2VvZiBXZWJHTFRleHR1cmUpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBcmUgdGhlIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zIGEgcG93ZXIgb2YgdHdvP1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjaXNQb3dlck9mMlxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaXNQb3dlck9mMiA9IElzU2l6ZVBvd2VyT2ZUd28odGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgV2ViR0wgVGV4dHVyZSBvZiB0aGUgc291cmNlIGltYWdlLiBJZiB0aGlzIFRleHR1cmVTb3VyY2UgaXMgZHJpdmVuIGZyb20gYSBXZWJHTFRleHR1cmVcclxuICAgICAgICAgKiBhbHJlYWR5LCB0aGVuIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhhdCBXZWJHTFRleHR1cmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSNnbFRleHR1cmVcclxuICAgICAgICAgKiBAdHlwZSB7P1dlYkdMVGV4dHVyZX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5nbFRleHR1cmUgPSBudWxsO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTZXRzIHRoZSBgVU5QQUNLX0ZMSVBfWV9XRUJHTGAgZmxhZyB0aGUgV2ViR0wgVGV4dHVyZSB1c2VzIGR1cmluZyB1cGxvYWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSNmbGlwWVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZsaXBZID0gZmxpcFk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdChnYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgV2ViR0wgVGV4dHVyZSwgaWYgcmVxdWlyZWQsIGFuZCBzZXRzIHRoZSBUZXh0dXJlIGZpbHRlciBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjaW5pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZX0gZ2FtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBQaGFzZXIgR2FtZSBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgaW5pdDogZnVuY3Rpb24gKGdhbWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlci5nbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYW52YXMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUNhbnZhc1RleHR1cmUodGhpcy5pbWFnZSwgZmFsc2UsIHRoaXMuZmxpcFkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1ZpZGVvKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVWaWRlb1RleHR1cmUodGhpcy5pbWFnZSwgZmFsc2UsIHRoaXMuZmxpcFkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JlbmRlclRleHR1cmUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IHRoaXMuc291cmNlLmNhbnZhcztcclxuICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dHVyZUZyb21Tb3VyY2UobnVsbCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMuc2NhbGVNb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNHTFRleHR1cmUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSB0aGlzLnNvdXJjZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dHVyZUZyb21Tb3VyY2UodGhpcy5pbWFnZSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMuc2NhbGVNb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmVuZGVyVGV4dHVyZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IHRoaXMuc291cmNlLmNhbnZhcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFnYW1lLmNvbmZpZy5hbnRpYWxpYXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcigxKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgRmlsdGVyIE1vZGUgZm9yIHRoaXMgVGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgbW9kZSBjYW4gYmUgZWl0aGVyIExpbmVhciwgdGhlIGRlZmF1bHQsIG9yIE5lYXJlc3QuXHJcbiAgICAgKlxyXG4gICAgICogRm9yIHBpeGVsLWFydCB5b3Ugc2hvdWxkIHVzZSBOZWFyZXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2Ujc2V0RmlsdGVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5GaWx0ZXJNb2RlfSBmaWx0ZXJNb2RlIC0gVGhlIEZpbHRlciBNb2RlLlxyXG4gICAgICovXHJcbiAgICBzZXRGaWx0ZXI6IGZ1bmN0aW9uIChmaWx0ZXJNb2RlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmdsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRUZXh0dXJlRmlsdGVyKHRoaXMuZ2xUZXh0dXJlLCBmaWx0ZXJNb2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2NhbGVNb2RlID0gZmlsdGVyTW9kZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBgVU5QQUNLX0ZMSVBfWV9XRUJHTGAgZmxhZyBmb3IgdGhlIFdlYkdMIFRleHR1cmUgZHVyaW5nIHRleHR1cmUgdXBsb2FkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2Ujc2V0RmxpcFlcclxuICAgICAqIEBzaW5jZSAzLjIwLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt2YWx1ZT10cnVlXSAtIFNob3VsZCB0aGUgV2ViR0wgVGV4dHVyZSBiZSBmbGlwcGVkIG9uIHRoZSBZIGF4aXMgb24gdGV4dHVyZSB1cGxvYWQgb3Igbm90P1xyXG4gICAgICovXHJcbiAgICBzZXRGbGlwWTogZnVuY3Rpb24gKHZhbHVlKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHZhbHVlID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLmZsaXBZID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoaXMgVGV4dHVyZVNvdXJjZSBpcyBiYWNrZWQgYnkgYSBDYW52YXMgYW5kIGlzIHJ1bm5pbmcgdW5kZXIgV2ViR0wsXHJcbiAgICAgKiBpdCB1cGRhdGVzIHRoZSBXZWJHTFRleHR1cmUgdXNpbmcgdGhlIGNhbnZhcyBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRleHR1cmVzLlRleHR1cmVTb3VyY2UjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy43LjBcclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnbCA9IHRoaXMucmVuZGVyZXIuZ2w7XHJcblxyXG4gICAgICAgIGlmIChnbCAmJiB0aGlzLmlzQ2FudmFzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5nbFRleHR1cmUgPSB0aGlzLnJlbmRlcmVyLnVwZGF0ZUNhbnZhc1RleHR1cmUodGhpcy5pbWFnZSwgdGhpcy5nbFRleHR1cmUsIHRoaXMuZmxpcFkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChnbCAmJiB0aGlzLmlzVmlkZW8pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmdsVGV4dHVyZSA9IHRoaXMucmVuZGVyZXIudXBkYXRlVmlkZW9UZXh0dXJlKHRoaXMuaW1hZ2UsIHRoaXMuZ2xUZXh0dXJlLCB0aGlzLmZsaXBZKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBUZXh0dXJlIFNvdXJjZSBhbmQgbnVsbHMgdGhlIHJlZmVyZW5jZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZVNvdXJjZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5nbFRleHR1cmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy5nbFRleHR1cmUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDYW52YXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBDYW52YXNQb29sLnJlbW92ZSh0aGlzLmltYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUZXh0dXJlU291cmNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXIgVHlwZXMuXHJcbiAqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRleHR1cmVzLkZpbHRlck1vZGVcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBDT05TVCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpbmVhciBmaWx0ZXIgdHlwZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlRleHR1cmVzLkZpbHRlck1vZGUuTElORUFSXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBjb25zdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIExJTkVBUjogMCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lYXJlc3QgbmVpZ2hib3IgZmlsdGVyIHR5cGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5GaWx0ZXJNb2RlLk5FQVJFU1RcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQGNvbnN0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTkVBUkVTVDogMVxyXG4gICAgXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENPTlNUO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVGV4dHVyZSBBZGQgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgdGhlIFRleHR1cmUgTWFuYWdlciB3aGVuIGEgdGV4dHVyZSBpcyBhZGRlZCB0byBpdC5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnRleHR1cmVzLm9uKCdhZGR0ZXh0dXJlJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5UZXh0dXJlcy5FdmVudHMjQUREXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIFRleHR1cmUgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gdGV4dHVyZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUZXh0dXJlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhZGR0ZXh0dXJlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRleHR1cmUgTG9hZCBFcnJvciBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGUgVGV4dHVyZSBNYW5hZ2VyIHdoZW4gYSB0ZXh0dXJlIGl0IHJlcXVlc3RlZCB0byBsb2FkIGZhaWxlZC5cclxuICogVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiBiYXNlNjQgZW5jb2RlZCB0ZXh0dXJlcyBmYWlsLiBBbGwgb3RoZXIgdGV4dHVyZSB0eXBlcyBhcmUgbG9hZGVkIHZpYSB0aGUgTG9hZGVyIFBsdWdpbi5cclxuICogXHJcbiAqIExpc3RlbiB0byB0aGlzIGV2ZW50IGZyb20gd2l0aGluIGEgU2NlbmUgdXNpbmc6IGB0aGlzLnRleHR1cmVzLm9uKCdvbmVycm9yJywgbGlzdGVuZXIpYC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5UZXh0dXJlcy5FdmVudHMjRVJST1JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGF0IGZhaWxlZCB0byBsb2FkIGludG8gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ29uZXJyb3InO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVGV4dHVyZSBMb2FkIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBUZXh0dXJlIE1hbmFnZXIgd2hlbiBhIHRleHR1cmUgaGFzIGZpbmlzaGVkIGxvYWRpbmcgb24gaXQuXHJcbiAqIFRoaXMgb25seSBoYXBwZW5zIGZvciBiYXNlNjQgZW5jb2RlZCB0ZXh0dXJlcy4gQWxsIG90aGVyIHRleHR1cmUgdHlwZXMgYXJlIGxvYWRlZCB2aWEgdGhlIExvYWRlciBQbHVnaW4uXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gdGhpcyBldmVudCBmcm9tIHdpdGhpbiBhIFNjZW5lIHVzaW5nOiBgdGhpcy50ZXh0dXJlcy5vbignb25sb2FkJywgbGlzdGVuZXIpYC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBhZnRlciB0aGUgW0FERF17QGxpbmtjb2RlIFBoYXNlci5UZXh0dXJlcy5FdmVudHMjZXZlbnQ6QUREfSBldmVudC5cclxuICpcclxuICogQGV2ZW50IFBoYXNlci5UZXh0dXJlcy5FdmVudHMjTE9BRFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBUZXh0dXJlIHRoYXQgd2FzIGxvYWRlZCBieSB0aGUgVGV4dHVyZSBNYW5hZ2VyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRleHR1cmUgdGhhdCB3YXMgbG9hZGVkIGJ5IHRoZSBUZXh0dXJlIE1hbmFnZXIuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdvbmxvYWQnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGludGVybmFsIGV2ZW50IHNpZ25pZmllcyB0aGF0IHRoZSBUZXh0dXJlIE1hbmFnZXIgaXMgbm93IHJlYWR5IGFuZCB0aGUgR2FtZSBjYW4gY29udGludWUgYm9vdGluZy5cclxuICogXHJcbiAqIFdoZW4gYSBQaGFzZXIgR2FtZSBpbnN0YW5jZSBpcyBib290aW5nIGZvciB0aGUgZmlyc3QgdGltZSwgdGhlIFRleHR1cmUgTWFuYWdlciBoYXMgdG8gd2FpdCBvbiBhIGNvdXBsZSBvZiBub24tYmxvY2tpbmdcclxuICogYXN5bmMgZXZlbnRzIGJlZm9yZSBpdCdzIGZ1bGx5IHJlYWR5IHRvIGNhcnJ5IG9uLiBXaGVuIHRob3NlIGNvbXBsZXRlIHRoZSBUZXh0dXJlIE1hbmFnZXIgZW1pdHMgdGhpcyBldmVudCB2aWEgdGhlIEdhbWVcclxuICogaW5zdGFuY2UsIHdoaWNoIHRlbGxzIHRoZSBHYW1lIHRvIGNhcnJ5IG9uIGJvb3RpbmcuXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuVGV4dHVyZXMuRXZlbnRzI1JFQURZXHJcbiAqIEBzaW5jZSAzLjE2LjFcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlYWR5JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRleHR1cmUgUmVtb3ZlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBUZXh0dXJlIE1hbmFnZXIgd2hlbiBhIHRleHR1cmUgaXMgcmVtb3ZlZCBmcm9tIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIHRoaXMgZXZlbnQgZnJvbSB3aXRoaW4gYSBTY2VuZSB1c2luZzogYHRoaXMudGV4dHVyZXMub24oJ3JlbW92ZXRleHR1cmUnLCBsaXN0ZW5lcilgLlxyXG4gKiBcclxuICogSWYgeW91IGhhdmUgYW55IEdhbWUgT2JqZWN0cyBzdGlsbCB1c2luZyB0aGUgcmVtb3ZlZCB0ZXh0dXJlLCB0aGV5IHdpbGwgc3RhcnQgdGhyb3dpbmdcclxuICogZXJyb3JzIHRoZSBuZXh0IHRpbWUgdGhleSB0cnkgdG8gcmVuZGVyLiBCZSBzdXJlIHRvIGNsZWFyIGFsbCB1c2Ugb2YgdGhlIHRleHR1cmUgaW4gdGhpcyBldmVudCBoYW5kbGVyLlxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlRleHR1cmVzLkV2ZW50cyNSRU1PVkVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgVGV4dHVyZSB0aGF0IHdhcyByZW1vdmVkIGZyb20gdGhlIFRleHR1cmUgTWFuYWdlci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlbW92ZXRleHR1cmUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UZXh0dXJlcy5FdmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBREQ6IHJlcXVpcmUoJy4vQUREX0VWRU5UJyksXHJcbiAgICBFUlJPUjogcmVxdWlyZSgnLi9FUlJPUl9FVkVOVCcpLFxyXG4gICAgTE9BRDogcmVxdWlyZSgnLi9MT0FEX0VWRU5UJyksXHJcbiAgICBSRUFEWTogcmVxdWlyZSgnLi9SRUFEWV9FVkVOVCcpLFxyXG4gICAgUkVNT1ZFOiByZXF1aXJlKCcuL1JFTU9WRV9FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBFeHRlbmQgPSByZXF1aXJlKCcuLi91dGlscy9vYmplY3QvRXh0ZW5kJyk7XHJcbnZhciBGaWx0ZXJNb2RlID0gcmVxdWlyZSgnLi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRleHR1cmVzXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIExpbmVhciBmaWx0ZXIgdHlwZS5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5MSU5FQVJcclxuICogQHR5cGUge2ludGVnZXJ9XHJcbiAqIEBjb25zdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcblxyXG4vKipcclxuICogTmVhcmVzdCBOZWlnaGJvciBmaWx0ZXIgdHlwZS5cclxuICogXHJcbiAqIEBuYW1lIFBoYXNlci5UZXh0dXJlcy5ORUFSRVNUXHJcbiAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gKiBAY29uc3RcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqL1xyXG5cclxudmFyIFRleHR1cmVzID0ge1xyXG5cclxuICAgIENhbnZhc1RleHR1cmU6IHJlcXVpcmUoJy4vQ2FudmFzVGV4dHVyZScpLFxyXG4gICAgRXZlbnRzOiByZXF1aXJlKCcuL2V2ZW50cycpLFxyXG4gICAgRmlsdGVyTW9kZTogRmlsdGVyTW9kZSxcclxuICAgIEZyYW1lOiByZXF1aXJlKCcuL0ZyYW1lJyksXHJcbiAgICBQYXJzZXJzOiByZXF1aXJlKCcuL3BhcnNlcnMnKSxcclxuICAgIFRleHR1cmU6IHJlcXVpcmUoJy4vVGV4dHVyZScpLFxyXG4gICAgVGV4dHVyZU1hbmFnZXI6IHJlcXVpcmUoJy4vVGV4dHVyZU1hbmFnZXInKSxcclxuICAgIFRleHR1cmVTb3VyY2U6IHJlcXVpcmUoJy4vVGV4dHVyZVNvdXJjZScpXHJcblxyXG59O1xyXG5cclxuVGV4dHVyZXMgPSBFeHRlbmQoZmFsc2UsIFRleHR1cmVzLCBGaWx0ZXJNb2RlKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGV4dHVyZXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhbiBYTUwgVGV4dHVyZSBBdGxhcyBvYmplY3QgYW5kIGFkZHMgYWxsIHRoZSBGcmFtZXMgaW50byBhIFRleHR1cmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vycy5BdGxhc1hNTFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRleHR1cmVzLlBhcnNlcnNcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuNy4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IHRleHR1cmUgLSBUaGUgVGV4dHVyZSB0byBhZGQgdGhlIEZyYW1lcyB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBzb3VyY2VJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgVGV4dHVyZVNvdXJjZS5cclxuICogQHBhcmFtIHsqfSB4bWwgLSBUaGUgWE1MIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSBtb2RpZmllZCBieSB0aGlzIHBhcnNlci5cclxuICovXHJcbnZhciBBdGxhc1hNTCA9IGZ1bmN0aW9uICh0ZXh0dXJlLCBzb3VyY2VJbmRleCwgeG1sKVxyXG57XHJcbiAgICAvLyAgTWFsZm9ybWVkP1xyXG4gICAgaWYgKCF4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ1RleHR1cmVBdGxhcycpKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBUZXh0dXJlIEF0bGFzIFhNTCBnaXZlbicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgQWRkIGluIGEgX19CQVNFIGVudHJ5IChmb3IgdGhlIGVudGlyZSBhdGxhcylcclxuICAgIHZhciBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZVtzb3VyY2VJbmRleF07XHJcblxyXG4gICAgdGV4dHVyZS5hZGQoJ19fQkFTRScsIHNvdXJjZUluZGV4LCAwLCAwLCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xyXG5cclxuICAgIC8vICBCeSB0aGlzIHN0YWdlIGZyYW1lcyBpcyBhIGZ1bGx5IHBhcnNlZCBhcnJheVxyXG4gICAgdmFyIGZyYW1lcyA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnU3ViVGV4dHVyZScpO1xyXG5cclxuICAgIHZhciBuZXdGcmFtZTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgZnJhbWUgPSBmcmFtZXNbaV0uYXR0cmlidXRlcztcclxuXHJcbiAgICAgICAgdmFyIG5hbWUgPSBmcmFtZS5uYW1lLnZhbHVlO1xyXG4gICAgICAgIHZhciB4ID0gcGFyc2VJbnQoZnJhbWUueC52YWx1ZSwgMTApO1xyXG4gICAgICAgIHZhciB5ID0gcGFyc2VJbnQoZnJhbWUueS52YWx1ZSwgMTApO1xyXG4gICAgICAgIHZhciB3aWR0aCA9IHBhcnNlSW50KGZyYW1lLndpZHRoLnZhbHVlLCAxMCk7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IHBhcnNlSW50KGZyYW1lLmhlaWdodC52YWx1ZSwgMTApO1xyXG5cclxuICAgICAgICAvLyAgVGhlIGZyYW1lIHZhbHVlcyBhcmUgdGhlIGV4YWN0IGNvb3JkaW5hdGVzIHRvIGN1dCB0aGUgZnJhbWUgb3V0IG9mIHRoZSBhdGxhcyBmcm9tXHJcbiAgICAgICAgbmV3RnJhbWUgPSB0ZXh0dXJlLmFkZChuYW1lLCBzb3VyY2VJbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIC8vICBUaGVzZSBhcmUgdGhlIG9yaWdpbmFsIChub24tdHJpbW1lZCkgc3ByaXRlIHZhbHVlc1xyXG4gICAgICAgIGlmIChmcmFtZS5mcmFtZVgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZnJhbWVYID0gTWF0aC5hYnMocGFyc2VJbnQoZnJhbWUuZnJhbWVYLnZhbHVlLCAxMCkpO1xyXG4gICAgICAgICAgICB2YXIgZnJhbWVZID0gTWF0aC5hYnMocGFyc2VJbnQoZnJhbWUuZnJhbWVZLnZhbHVlLCAxMCkpO1xyXG4gICAgICAgICAgICB2YXIgZnJhbWVXaWR0aCA9IHBhcnNlSW50KGZyYW1lLmZyYW1lV2lkdGgudmFsdWUsIDEwKTtcclxuICAgICAgICAgICAgdmFyIGZyYW1lSGVpZ2h0ID0gcGFyc2VJbnQoZnJhbWUuZnJhbWVIZWlnaHQudmFsdWUsIDEwKTtcclxuXHJcbiAgICAgICAgICAgIG5ld0ZyYW1lLnNldFRyaW0oXHJcbiAgICAgICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGZyYW1lWCxcclxuICAgICAgICAgICAgICAgIGZyYW1lWSxcclxuICAgICAgICAgICAgICAgIGZyYW1lV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBmcmFtZUhlaWdodFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGV4dHVyZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQXRsYXNYTUw7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSBDYW52YXMgRWxlbWVudCB0byBhIFRleHR1cmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vycy5DYW52YXNcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIFRleHR1cmUgdG8gYWRkIHRoZSBGcmFtZXMgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gc291cmNlSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFRleHR1cmVTb3VyY2UuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSBtb2RpZmllZCBieSB0aGlzIHBhcnNlci5cclxuICovXHJcbnZhciBDYW52YXMgPSBmdW5jdGlvbiAodGV4dHVyZSwgc291cmNlSW5kZXgpXHJcbntcclxuICAgIHZhciBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZVtzb3VyY2VJbmRleF07XHJcblxyXG4gICAgdGV4dHVyZS5hZGQoJ19fQkFTRScsIHNvdXJjZUluZGV4LCAwLCAwLCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xyXG5cclxuICAgIHJldHVybiB0ZXh0dXJlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYW52YXM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gSW1hZ2UgRWxlbWVudCB0byBhIFRleHR1cmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vycy5JbWFnZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRleHR1cmVzLlBhcnNlcnNcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IHRleHR1cmUgLSBUaGUgVGV4dHVyZSB0byBhZGQgdGhlIEZyYW1lcyB0by5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBzb3VyY2VJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgVGV4dHVyZVNvdXJjZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIG1vZGlmaWVkIGJ5IHRoaXMgcGFyc2VyLlxyXG4gKi9cclxudmFyIEltYWdlID0gZnVuY3Rpb24gKHRleHR1cmUsIHNvdXJjZUluZGV4KVxyXG57XHJcbiAgICB2YXIgc291cmNlID0gdGV4dHVyZS5zb3VyY2Vbc291cmNlSW5kZXhdO1xyXG5cclxuICAgIHRleHR1cmUuYWRkKCdfX0JBU0UnLCBzb3VyY2VJbmRleCwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICByZXR1cm4gdGV4dHVyZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSW1hZ2U7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsb25lID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0Nsb25lJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIGEgVGV4dHVyZSBBdGxhcyBKU09OIEFycmF5IGFuZCBhZGRzIHRoZSBGcmFtZXMgdG8gdGhlIFRleHR1cmUuXHJcbiAqIEpTT04gZm9ybWF0IGV4cGVjdGVkIHRvIG1hdGNoIHRoYXQgZGVmaW5lZCBieSBUZXh0dXJlIFBhY2tlciwgd2l0aCB0aGUgZnJhbWVzIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgRnJhbWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRleHR1cmVzLlBhcnNlcnMuSlNPTkFycmF5XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vyc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBUZXh0dXJlIHRvIGFkZCB0aGUgRnJhbWVzIHRvLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHNvdXJjZUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlLlxyXG4gKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBKU09OIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSBtb2RpZmllZCBieSB0aGlzIHBhcnNlci5cclxuICovXHJcbnZhciBKU09OQXJyYXkgPSBmdW5jdGlvbiAodGV4dHVyZSwgc291cmNlSW5kZXgsIGpzb24pXHJcbntcclxuICAgIC8vICBNYWxmb3JtZWQ/XHJcbiAgICBpZiAoIWpzb25bJ2ZyYW1lcyddICYmICFqc29uWyd0ZXh0dXJlcyddKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBUZXh0dXJlIEF0bGFzIEpTT04gQXJyYXknKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFkZCBpbiBhIF9fQkFTRSBlbnRyeSAoZm9yIHRoZSBlbnRpcmUgYXRsYXMpXHJcbiAgICB2YXIgc291cmNlID0gdGV4dHVyZS5zb3VyY2Vbc291cmNlSW5kZXhdO1xyXG5cclxuICAgIHRleHR1cmUuYWRkKCdfX0JBU0UnLCBzb3VyY2VJbmRleCwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICAvLyAgQnkgdGhpcyBzdGFnZSBmcmFtZXMgaXMgYSBmdWxseSBwYXJzZWQgYXJyYXlcclxuICAgIHZhciBmcmFtZXMgPSAoQXJyYXkuaXNBcnJheShqc29uLnRleHR1cmVzKSkgPyBqc29uLnRleHR1cmVzW3NvdXJjZUluZGV4XS5mcmFtZXMgOiBqc29uLmZyYW1lcztcclxuXHJcbiAgICB2YXIgbmV3RnJhbWU7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNyYyA9IGZyYW1lc1tpXTtcclxuXHJcbiAgICAgICAgLy8gIFRoZSBmcmFtZSB2YWx1ZXMgYXJlIHRoZSBleGFjdCBjb29yZGluYXRlcyB0byBjdXQgdGhlIGZyYW1lIG91dCBvZiB0aGUgYXRsYXMgZnJvbVxyXG4gICAgICAgIG5ld0ZyYW1lID0gdGV4dHVyZS5hZGQoc3JjLmZpbGVuYW1lLCBzb3VyY2VJbmRleCwgc3JjLmZyYW1lLngsIHNyYy5mcmFtZS55LCBzcmMuZnJhbWUudywgc3JjLmZyYW1lLmgpO1xyXG5cclxuICAgICAgICAvLyAgVGhlc2UgYXJlIHRoZSBvcmlnaW5hbCAobm9uLXRyaW1tZWQpIHNwcml0ZSB2YWx1ZXNcclxuICAgICAgICBpZiAoc3JjLnRyaW1tZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdGcmFtZS5zZXRUcmltKFxyXG4gICAgICAgICAgICAgICAgc3JjLnNvdXJjZVNpemUudyxcclxuICAgICAgICAgICAgICAgIHNyYy5zb3VyY2VTaXplLmgsXHJcbiAgICAgICAgICAgICAgICBzcmMuc3ByaXRlU291cmNlU2l6ZS54LFxyXG4gICAgICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUueSxcclxuICAgICAgICAgICAgICAgIHNyYy5zcHJpdGVTb3VyY2VTaXplLncsXHJcbiAgICAgICAgICAgICAgICBzcmMuc3ByaXRlU291cmNlU2l6ZS5oXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3JjLnJvdGF0ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdGcmFtZS5yb3RhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbmV3RnJhbWUudXBkYXRlVVZzSW52ZXJ0ZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBwaXZvdCA9IHNyYy5hbmNob3IgfHwgc3JjLnBpdm90O1xyXG5cclxuICAgICAgICBpZiAocGl2b3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBuZXdGcmFtZS5jdXN0b21QaXZvdCA9IHRydWU7XHJcbiAgICAgICAgICAgIG5ld0ZyYW1lLnBpdm90WCA9IHBpdm90Lng7XHJcbiAgICAgICAgICAgIG5ld0ZyYW1lLnBpdm90WSA9IHBpdm90Lnk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgQ29weSBvdmVyIGFueSBleHRyYSBkYXRhXHJcbiAgICAgICAgbmV3RnJhbWUuY3VzdG9tRGF0YSA9IENsb25lKHNyYyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIENvcHkgb3ZlciBhbnkgYWRkaXRpb25hbCBkYXRhIHRoYXQgd2FzIGluIHRoZSBKU09OIHRvIFRleHR1cmUuY3VzdG9tRGF0YVxyXG4gICAgZm9yICh2YXIgZGF0YUtleSBpbiBqc29uKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkYXRhS2V5ID09PSAnZnJhbWVzJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbltkYXRhS2V5XSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmN1c3RvbURhdGFbZGF0YUtleV0gPSBqc29uW2RhdGFLZXldLnNsaWNlKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmN1c3RvbURhdGFbZGF0YUtleV0gPSBqc29uW2RhdGFLZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGV4dHVyZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSlNPTkFycmF5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbG9uZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9DbG9uZScpO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhIFRleHR1cmUgQXRsYXMgSlNPTiBIYXNoIGFuZCBhZGRzIHRoZSBGcmFtZXMgdG8gdGhlIFRleHR1cmUuXHJcbiAqIEpTT04gZm9ybWF0IGV4cGVjdGVkIHRvIG1hdGNoIHRoYXQgZGVmaW5lZCBieSBUZXh0dXJlIFBhY2tlciwgd2l0aCB0aGUgZnJhbWVzIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gb2JqZWN0IG9mIEZyYW1lcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzLkpTT05IYXNoXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vyc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBUZXh0dXJlIHRvIGFkZCB0aGUgRnJhbWVzIHRvLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHNvdXJjZUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlLlxyXG4gKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBKU09OIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSBUaGUgVGV4dHVyZSBtb2RpZmllZCBieSB0aGlzIHBhcnNlci5cclxuICovXHJcbnZhciBKU09OSGFzaCA9IGZ1bmN0aW9uICh0ZXh0dXJlLCBzb3VyY2VJbmRleCwganNvbilcclxue1xyXG4gICAgLy8gIE1hbGZvcm1lZD9cclxuICAgIGlmICghanNvblsnZnJhbWVzJ10pXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIFRleHR1cmUgQXRsYXMgSlNPTiBIYXNoIGdpdmVuLCBtaXNzaW5nIFxcJ2ZyYW1lc1xcJyBPYmplY3QnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFkZCBpbiBhIF9fQkFTRSBlbnRyeSAoZm9yIHRoZSBlbnRpcmUgYXRsYXMpXHJcbiAgICB2YXIgc291cmNlID0gdGV4dHVyZS5zb3VyY2Vbc291cmNlSW5kZXhdO1xyXG5cclxuICAgIHRleHR1cmUuYWRkKCdfX0JBU0UnLCBzb3VyY2VJbmRleCwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICAvLyAgQnkgdGhpcyBzdGFnZSBmcmFtZXMgaXMgYSBmdWxseSBwYXJzZWQgT2JqZWN0XHJcbiAgICB2YXIgZnJhbWVzID0ganNvbi5mcmFtZXM7XHJcbiAgICB2YXIgbmV3RnJhbWU7XHJcblxyXG4gICAgZm9yICh2YXIga2V5IGluIGZyYW1lcylcclxuICAgIHtcclxuICAgICAgICB2YXIgc3JjID0gZnJhbWVzW2tleV07XHJcblxyXG4gICAgICAgIC8vICBUaGUgZnJhbWUgdmFsdWVzIGFyZSB0aGUgZXhhY3QgY29vcmRpbmF0ZXMgdG8gY3V0IHRoZSBmcmFtZSBvdXQgb2YgdGhlIGF0bGFzIGZyb21cclxuICAgICAgICBuZXdGcmFtZSA9IHRleHR1cmUuYWRkKGtleSwgc291cmNlSW5kZXgsIHNyYy5mcmFtZS54LCBzcmMuZnJhbWUueSwgc3JjLmZyYW1lLncsIHNyYy5mcmFtZS5oKTtcclxuXHJcbiAgICAgICAgLy8gIFRoZXNlIGFyZSB0aGUgb3JpZ2luYWwgKG5vbi10cmltbWVkKSBzcHJpdGUgdmFsdWVzXHJcbiAgICAgICAgaWYgKHNyYy50cmltbWVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3RnJhbWUuc2V0VHJpbShcclxuICAgICAgICAgICAgICAgIHNyYy5zb3VyY2VTaXplLncsXHJcbiAgICAgICAgICAgICAgICBzcmMuc291cmNlU2l6ZS5oLFxyXG4gICAgICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUueCxcclxuICAgICAgICAgICAgICAgIHNyYy5zcHJpdGVTb3VyY2VTaXplLnksXHJcbiAgICAgICAgICAgICAgICBzcmMuc3ByaXRlU291cmNlU2l6ZS53LFxyXG4gICAgICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUuaFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNyYy5yb3RhdGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3RnJhbWUucm90YXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIG5ld0ZyYW1lLnVwZGF0ZVVWc0ludmVydGVkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcGl2b3QgPSBzcmMuYW5jaG9yIHx8IHNyYy5waXZvdDtcclxuXHJcbiAgICAgICAgaWYgKHBpdm90KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3RnJhbWUuY3VzdG9tUGl2b3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBuZXdGcmFtZS5waXZvdFggPSBwaXZvdC54O1xyXG4gICAgICAgICAgICBuZXdGcmFtZS5waXZvdFkgPSBwaXZvdC55O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENvcHkgb3ZlciBhbnkgZXh0cmEgZGF0YVxyXG4gICAgICAgIG5ld0ZyYW1lLmN1c3RvbURhdGEgPSBDbG9uZShzcmMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBDb3B5IG92ZXIgYW55IGFkZGl0aW9uYWwgZGF0YSB0aGF0IHdhcyBpbiB0aGUgSlNPTiB0byBUZXh0dXJlLmN1c3RvbURhdGFcclxuICAgIGZvciAodmFyIGRhdGFLZXkgaW4ganNvbilcclxuICAgIHtcclxuICAgICAgICBpZiAoZGF0YUtleSA9PT0gJ2ZyYW1lcycpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25bZGF0YUtleV0pKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZS5jdXN0b21EYXRhW2RhdGFLZXldID0ganNvbltkYXRhS2V5XS5zbGljZSgwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGV4dHVyZS5jdXN0b21EYXRhW2RhdGFLZXldID0ganNvbltkYXRhS2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRleHR1cmU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEpTT05IYXNoO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIGEgU3ByaXRlIFNoZWV0IGFuZCBhZGRzIHRoZSBGcmFtZXMgdG8gdGhlIFRleHR1cmUuXHJcbiAqIFxyXG4gKiBJbiBQaGFzZXIgdGVybWlub2xvZ3kgYSBTcHJpdGUgU2hlZXQgaXMgYSB0ZXh0dXJlIGNvbnRhaW5pbmcgZGlmZmVyZW50IGZyYW1lcywgYnV0IGVhY2ggZnJhbWUgaXMgdGhlIGV4YWN0XHJcbiAqIHNhbWUgc2l6ZSBhbmQgY2Fubm90IGJlIHRyaW1tZWQgb3Igcm90YXRlZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzLlNwcml0ZVNoZWV0XHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vyc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBUZXh0dXJlIHRvIGFkZCB0aGUgRnJhbWVzIHRvLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHNvdXJjZUluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBUZXh0dXJlU291cmNlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHggLSBUaGUgdG9wLWxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgU3ByaXRlIFNoZWV0LiBEZWZhdWx0cyB0byB6ZXJvLiBVc2VkIHdoZW4gZXh0cmFjdGluZyBzaGVldHMgZnJvbSBhdGxhc2VzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHkgLSBUaGUgdG9wLWxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgU3ByaXRlIFNoZWV0LiBEZWZhdWx0cyB0byB6ZXJvLiBVc2VkIHdoZW4gZXh0cmFjdGluZyBzaGVldHMgZnJvbSBhdGxhc2VzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzb3VyY2UgaW1hZ2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc291cmNlIGltYWdlLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gQW4gb2JqZWN0IGRlc2NyaWJpbmcgaG93IHRvIHBhcnNlIHRoZSBTcHJpdGUgU2hlZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25maWcuZnJhbWVXaWR0aCAtIFdpZHRoIGluIHBpeGVscyBvZiBhIHNpbmdsZSBmcmFtZSBpbiB0aGUgc3ByaXRlIHNoZWV0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmZpZy5mcmFtZUhlaWdodF0gLSBIZWlnaHQgaW4gcGl4ZWxzIG9mIGEgc2luZ2xlIGZyYW1lIGluIHRoZSBzcHJpdGUgc2hlZXQuIERlZmF1bHRzIHRvIGZyYW1lV2lkdGggaWYgbm90IHByb3ZpZGVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmZpZy5zdGFydEZyYW1lPTBdIC0gVGhlIGZyYW1lIHRvIHN0YXJ0IGV4dHJhY3RpbmcgZnJvbS4gRGVmYXVsdHMgdG8gemVyby5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25maWcuZW5kRnJhbWU9LTFdIC0gVGhlIGZyYW1lIHRvIGZpbmlzaCBleHRyYWN0aW5nIGF0LiBEZWZhdWx0cyB0byAtMSwgd2hpY2ggbWVhbnMgJ2FsbCBmcmFtZXMnLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmZpZy5tYXJnaW49MF0gLSBJZiB0aGUgZnJhbWVzIGhhdmUgYmVlbiBkcmF3biB3aXRoIGEgbWFyZ2luLCBzcGVjaWZ5IHRoZSBhbW91bnQgaGVyZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25maWcuc3BhY2luZz0wXSAtIElmIHRoZSBmcmFtZXMgaGF2ZSBiZWVuIGRyYXduIHdpdGggc3BhY2luZyBiZXR3ZWVuIHRoZW0sIHNwZWNpZnkgdGhlIGFtb3VudCBoZXJlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGV4dHVyZXMuVGV4dHVyZX0gVGhlIFRleHR1cmUgbW9kaWZpZWQgYnkgdGhpcyBwYXJzZXIuXHJcbiAqL1xyXG52YXIgU3ByaXRlU2hlZXQgPSBmdW5jdGlvbiAodGV4dHVyZSwgc291cmNlSW5kZXgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNvbmZpZylcclxue1xyXG4gICAgdmFyIGZyYW1lV2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZnJhbWVXaWR0aCcsIG51bGwpO1xyXG4gICAgdmFyIGZyYW1lSGVpZ2h0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2ZyYW1lSGVpZ2h0JywgZnJhbWVXaWR0aCk7XHJcblxyXG4gICAgLy8gIElmIG1pc3Npbmcgd2UgY2FuJ3QgcHJvY2VlZFxyXG4gICAgaWYgKGZyYW1lV2lkdGggPT09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0dXJlTWFuYWdlci5TcHJpdGVTaGVldDogSW52YWxpZCBmcmFtZVdpZHRoIGdpdmVuLicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBBZGQgaW4gYSBfX0JBU0UgZW50cnkgKGZvciB0aGUgZW50aXJlIGF0bGFzKVxyXG4gICAgdmFyIHNvdXJjZSA9IHRleHR1cmUuc291cmNlW3NvdXJjZUluZGV4XTtcclxuXHJcbiAgICB0ZXh0dXJlLmFkZCgnX19CQVNFJywgc291cmNlSW5kZXgsIDAsIDAsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCk7XHJcblxyXG4gICAgdmFyIHN0YXJ0RnJhbWUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3RhcnRGcmFtZScsIDApO1xyXG4gICAgdmFyIGVuZEZyYW1lID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2VuZEZyYW1lJywgLTEpO1xyXG4gICAgdmFyIG1hcmdpbiA9IEdldEZhc3RWYWx1ZShjb25maWcsICdtYXJnaW4nLCAwKTtcclxuICAgIHZhciBzcGFjaW5nID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3NwYWNpbmcnLCAwKTtcclxuXHJcbiAgICB2YXIgcm93ID0gTWF0aC5mbG9vcigod2lkdGggLSBtYXJnaW4gKyBzcGFjaW5nKSAvIChmcmFtZVdpZHRoICsgc3BhY2luZykpO1xyXG4gICAgdmFyIGNvbHVtbiA9IE1hdGguZmxvb3IoKGhlaWdodCAtIG1hcmdpbiArIHNwYWNpbmcpIC8gKGZyYW1lSGVpZ2h0ICsgc3BhY2luZykpO1xyXG4gICAgdmFyIHRvdGFsID0gcm93ICogY29sdW1uO1xyXG5cclxuICAgIGlmICh0b3RhbCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1Nwcml0ZVNoZWV0IGZyYW1lIGRpbWVuc2lvbnMgd2lsbCByZXN1bHQgaW4gemVybyBmcmFtZXMuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXJ0RnJhbWUgPiB0b3RhbCB8fCBzdGFydEZyYW1lIDwgLXRvdGFsKVxyXG4gICAge1xyXG4gICAgICAgIHN0YXJ0RnJhbWUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydEZyYW1lIDwgMClcclxuICAgIHtcclxuICAgICAgICAvLyAgQWxsb3cgbmVnYXRpdmUgc2tpcGZyYW1lcy5cclxuICAgICAgICBzdGFydEZyYW1lID0gdG90YWwgKyBzdGFydEZyYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmRGcmFtZSAhPT0gLTEpXHJcbiAgICB7XHJcbiAgICAgICAgdG90YWwgPSBzdGFydEZyYW1lICsgKGVuZEZyYW1lICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGZ4ID0gbWFyZ2luO1xyXG4gICAgdmFyIGZ5ID0gbWFyZ2luO1xyXG4gICAgdmFyIGF4ID0gMDtcclxuICAgIHZhciBheSA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGF4ID0gMDtcclxuICAgICAgICBheSA9IDA7XHJcblxyXG4gICAgICAgIHZhciB3ID0gZnggKyBmcmFtZVdpZHRoO1xyXG4gICAgICAgIHZhciBoID0gZnkgKyBmcmFtZUhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHcgPiB3aWR0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGF4ID0gdyAtIHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGggPiBoZWlnaHQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBheSA9IGggLSBoZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZXh0dXJlLmFkZChpLCBzb3VyY2VJbmRleCwgeCArIGZ4LCB5ICsgZnksIGZyYW1lV2lkdGggLSBheCwgZnJhbWVIZWlnaHQgLSBheSk7XHJcblxyXG4gICAgICAgIGZ4ICs9IGZyYW1lV2lkdGggKyBzcGFjaW5nO1xyXG5cclxuICAgICAgICBpZiAoZnggKyBmcmFtZVdpZHRoID4gd2lkdGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmeCA9IG1hcmdpbjtcclxuICAgICAgICAgICAgZnkgKz0gZnJhbWVIZWlnaHQgKyBzcGFjaW5nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGV4dHVyZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3ByaXRlU2hlZXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYSBTcHJpdGUgU2hlZXQgYW5kIGFkZHMgdGhlIEZyYW1lcyB0byB0aGUgVGV4dHVyZSwgd2hlcmUgdGhlIFNwcml0ZSBTaGVldCBpcyBzdG9yZWQgYXMgYSBmcmFtZSB3aXRoaW4gYW4gQXRsYXMuXHJcbiAqXHJcbiAqIEluIFBoYXNlciB0ZXJtaW5vbG9neSBhIFNwcml0ZSBTaGVldCBpcyBhIHRleHR1cmUgY29udGFpbmluZyBkaWZmZXJlbnQgZnJhbWVzLCBidXQgZWFjaCBmcmFtZSBpcyB0aGUgZXhhY3RcclxuICogc2FtZSBzaXplIGFuZCBjYW5ub3QgYmUgdHJpbW1lZCBvciByb3RhdGVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRleHR1cmVzLlBhcnNlcnMuU3ByaXRlU2hlZXRGcm9tQXRsYXNcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIFRleHR1cmUgdG8gYWRkIHRoZSBGcmFtZXMgdG8uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRleHR1cmVzLkZyYW1lfSBmcmFtZSAtIFRoZSBGcmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBTcHJpdGUgU2hlZXQuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBBbiBvYmplY3QgZGVzY3JpYmluZyBob3cgdG8gcGFyc2UgdGhlIFNwcml0ZSBTaGVldC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmZpZy5mcmFtZVdpZHRoIC0gV2lkdGggaW4gcGl4ZWxzIG9mIGEgc2luZ2xlIGZyYW1lIGluIHRoZSBzcHJpdGUgc2hlZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uZmlnLmZyYW1lSGVpZ2h0XSAtIEhlaWdodCBpbiBwaXhlbHMgb2YgYSBzaW5nbGUgZnJhbWUgaW4gdGhlIHNwcml0ZSBzaGVldC4gRGVmYXVsdHMgdG8gZnJhbWVXaWR0aCBpZiBub3QgcHJvdmlkZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uZmlnLnN0YXJ0RnJhbWU9MF0gLSBJbmRleCBvZiB0aGUgc3RhcnQgZnJhbWUgaW4gdGhlIHNwcml0ZSBzaGVldFxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmZpZy5lbmRGcmFtZT0tMV0gLSBJbmRleCBvZiB0aGUgZW5kIGZyYW1lIGluIHRoZSBzcHJpdGUgc2hlZXQuIC0xIG1lYW4gYWxsIHRoZSByZXN0IG9mIHRoZSBmcmFtZXNcclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25maWcubWFyZ2luPTBdIC0gSWYgdGhlIGZyYW1lcyBoYXZlIGJlZW4gZHJhd24gd2l0aCBhIG1hcmdpbiwgc3BlY2lmeSB0aGUgYW1vdW50IGhlcmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uZmlnLnNwYWNpbmc9MF0gLSBJZiB0aGUgZnJhbWVzIGhhdmUgYmVlbiBkcmF3biB3aXRoIHNwYWNpbmcgYmV0d2VlbiB0aGVtLCBzcGVjaWZ5IHRoZSBhbW91bnQgaGVyZS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIG1vZGlmaWVkIGJ5IHRoaXMgcGFyc2VyLlxyXG4gKi9cclxudmFyIFNwcml0ZVNoZWV0RnJvbUF0bGFzID0gZnVuY3Rpb24gKHRleHR1cmUsIGZyYW1lLCBjb25maWcpXHJcbntcclxuICAgIHZhciBmcmFtZVdpZHRoID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2ZyYW1lV2lkdGgnLCBudWxsKTtcclxuICAgIHZhciBmcmFtZUhlaWdodCA9IEdldEZhc3RWYWx1ZShjb25maWcsICdmcmFtZUhlaWdodCcsIGZyYW1lV2lkdGgpO1xyXG5cclxuICAgIC8vICBJZiBtaXNzaW5nIHdlIGNhbid0IHByb2NlZWRcclxuICAgIGlmICghZnJhbWVXaWR0aClcclxuICAgIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHR1cmVNYW5hZ2VyLlNwcml0ZVNoZWV0RnJvbUF0bGFzOiBJbnZhbGlkIGZyYW1lV2lkdGggZ2l2ZW4uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFkZCBpbiBhIF9fQkFTRSBlbnRyeSAoZm9yIHRoZSBlbnRpcmUgYXRsYXMgZnJhbWUpXHJcbiAgICB2YXIgc291cmNlID0gdGV4dHVyZS5zb3VyY2VbMF07XHJcbiAgICB0ZXh0dXJlLmFkZCgnX19CQVNFJywgMCwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICB2YXIgc3RhcnRGcmFtZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdzdGFydEZyYW1lJywgMCk7XHJcbiAgICB2YXIgZW5kRnJhbWUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnZW5kRnJhbWUnLCAtMSk7XHJcbiAgICB2YXIgbWFyZ2luID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ21hcmdpbicsIDApO1xyXG4gICAgdmFyIHNwYWNpbmcgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnc3BhY2luZycsIDApO1xyXG5cclxuICAgIHZhciB4ID0gZnJhbWUuY3V0WDtcclxuICAgIHZhciB5ID0gZnJhbWUuY3V0WTtcclxuXHJcbiAgICB2YXIgY3V0V2lkdGggPSBmcmFtZS5jdXRXaWR0aDtcclxuICAgIHZhciBjdXRIZWlnaHQgPSBmcmFtZS5jdXRIZWlnaHQ7XHJcbiAgICB2YXIgc2hlZXRXaWR0aCA9IGZyYW1lLnJlYWxXaWR0aDtcclxuICAgIHZhciBzaGVldEhlaWdodCA9IGZyYW1lLnJlYWxIZWlnaHQ7XHJcblxyXG4gICAgdmFyIHJvdyA9IE1hdGguZmxvb3IoKHNoZWV0V2lkdGggLSBtYXJnaW4gKyBzcGFjaW5nKSAvIChmcmFtZVdpZHRoICsgc3BhY2luZykpO1xyXG4gICAgdmFyIGNvbHVtbiA9IE1hdGguZmxvb3IoKHNoZWV0SGVpZ2h0IC0gbWFyZ2luICsgc3BhY2luZykgLyAoZnJhbWVIZWlnaHQgKyBzcGFjaW5nKSk7XHJcbiAgICB2YXIgdG90YWwgPSByb3cgKiBjb2x1bW47XHJcblxyXG4gICAgLy8gIHRyaW0gb2Zmc2V0c1xyXG5cclxuICAgIHZhciBsZWZ0UGFkID0gZnJhbWUueDtcclxuICAgIHZhciBsZWZ0V2lkdGggPSBmcmFtZVdpZHRoIC0gbGVmdFBhZDtcclxuXHJcbiAgICB2YXIgcmlnaHRXaWR0aCA9IGZyYW1lV2lkdGggLSAoKHNoZWV0V2lkdGggLSBjdXRXaWR0aCkgLSBsZWZ0UGFkKTtcclxuXHJcbiAgICB2YXIgdG9wUGFkID0gZnJhbWUueTtcclxuICAgIHZhciB0b3BIZWlnaHQgPSBmcmFtZUhlaWdodCAtIHRvcFBhZDtcclxuXHJcbiAgICB2YXIgYm90dG9tSGVpZ2h0ID0gZnJhbWVIZWlnaHQgLSAoKHNoZWV0SGVpZ2h0IC0gY3V0SGVpZ2h0KSAtIHRvcFBhZCk7XHJcblxyXG4gICAgaWYgKHN0YXJ0RnJhbWUgPiB0b3RhbCB8fCBzdGFydEZyYW1lIDwgLXRvdGFsKVxyXG4gICAge1xyXG4gICAgICAgIHN0YXJ0RnJhbWUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGFydEZyYW1lIDwgMClcclxuICAgIHtcclxuICAgICAgICAvLyAgQWxsb3cgbmVnYXRpdmUgc2tpcGZyYW1lcy5cclxuICAgICAgICBzdGFydEZyYW1lID0gdG90YWwgKyBzdGFydEZyYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbmRGcmFtZSAhPT0gLTEpXHJcbiAgICB7XHJcbiAgICAgICAgdG90YWwgPSBzdGFydEZyYW1lICsgKGVuZEZyYW1lICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHNoZWV0RnJhbWU7XHJcbiAgICB2YXIgZnJhbWVYID0gbWFyZ2luO1xyXG4gICAgdmFyIGZyYW1lWSA9IG1hcmdpbjtcclxuICAgIHZhciBmcmFtZUluZGV4ID0gMDtcclxuICAgIHZhciBzb3VyY2VJbmRleCA9IGZyYW1lLnNvdXJjZUluZGV4O1xyXG5cclxuICAgIGZvciAodmFyIHNoZWV0WSA9IDA7IHNoZWV0WSA8IGNvbHVtbjsgc2hlZXRZKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRvcFJvdyA9IChzaGVldFkgPT09IDApO1xyXG4gICAgICAgIHZhciBib3R0b21Sb3cgPSAoc2hlZXRZID09PSBjb2x1bW4gLSAxKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgc2hlZXRYID0gMDsgc2hlZXRYIDwgcm93OyBzaGVldFgrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsZWZ0Um93ID0gKHNoZWV0WCA9PT0gMCk7XHJcbiAgICAgICAgICAgIHZhciByaWdodFJvdyA9IChzaGVldFggPT09IHJvdyAtIDEpO1xyXG5cclxuICAgICAgICAgICAgc2hlZXRGcmFtZSA9IHRleHR1cmUuYWRkKGZyYW1lSW5kZXgsIHNvdXJjZUluZGV4LCB4ICsgZnJhbWVYLCB5ICsgZnJhbWVZLCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobGVmdFJvdyB8fCB0b3BSb3cgfHwgcmlnaHRSb3cgfHwgYm90dG9tUm93KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGVzdFggPSAobGVmdFJvdykgPyBsZWZ0UGFkIDogMDtcclxuICAgICAgICAgICAgICAgIHZhciBkZXN0WSA9ICh0b3BSb3cpID8gdG9wUGFkIDogMDtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdHJpbVdpZHRoID0gMDtcclxuICAgICAgICAgICAgICAgIHZhciB0cmltSGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobGVmdFJvdylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmltV2lkdGggKz0gKGZyYW1lV2lkdGggLSBsZWZ0V2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyaWdodFJvdylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmltV2lkdGggKz0gKGZyYW1lV2lkdGggLSByaWdodFdpZHRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodG9wUm93KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaW1IZWlnaHQgKz0gKGZyYW1lSGVpZ2h0IC0gdG9wSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYm90dG9tUm93KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaW1IZWlnaHQgKz0gKGZyYW1lSGVpZ2h0IC0gYm90dG9tSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZGVzdFdpZHRoID0gZnJhbWVXaWR0aCAtIHRyaW1XaWR0aDtcclxuICAgICAgICAgICAgICAgIHZhciBkZXN0SGVpZ2h0ID0gZnJhbWVIZWlnaHQgLSB0cmltSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIHNoZWV0RnJhbWUuY3V0V2lkdGggPSBkZXN0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICBzaGVldEZyYW1lLmN1dEhlaWdodCA9IGRlc3RIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgc2hlZXRGcmFtZS5zZXRUcmltKGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LCBkZXN0WCwgZGVzdFksIGRlc3RXaWR0aCwgZGVzdEhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZyYW1lWCArPSBzcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxlZnRSb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZyYW1lWCArPSBsZWZ0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmlnaHRSb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZyYW1lWCArPSByaWdodFdpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnJhbWVYICs9IGZyYW1lV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZyYW1lSW5kZXgrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZyYW1lWCA9IG1hcmdpbjtcclxuICAgICAgICBmcmFtZVkgKz0gc3BhY2luZztcclxuXHJcbiAgICAgICAgaWYgKHRvcFJvdylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZyYW1lWSArPSB0b3BIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGJvdHRvbVJvdylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZyYW1lWSArPSBib3R0b21IZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZyYW1lWSArPSBmcmFtZUhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRleHR1cmU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwcml0ZVNoZWV0RnJvbUF0bGFzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBpbWFnZUhlaWdodCA9IDA7XHJcblxyXG4vKipcclxuICogQGZ1bmN0aW9uIGFkZEZyYW1lXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKi9cclxudmFyIGFkZEZyYW1lID0gZnVuY3Rpb24gKHRleHR1cmUsIHNvdXJjZUluZGV4LCBuYW1lLCBmcmFtZSlcclxue1xyXG4gICAgLy8gIFRoZSBmcmFtZSB2YWx1ZXMgYXJlIHRoZSBleGFjdCBjb29yZGluYXRlcyB0byBjdXQgdGhlIGZyYW1lIG91dCBvZiB0aGUgYXRsYXMgZnJvbVxyXG5cclxuICAgIHZhciB5ID0gaW1hZ2VIZWlnaHQgLSBmcmFtZS55IC0gZnJhbWUuaGVpZ2h0O1xyXG5cclxuICAgIHRleHR1cmUuYWRkKG5hbWUsIHNvdXJjZUluZGV4LCBmcmFtZS54LCB5LCBmcmFtZS53aWR0aCwgZnJhbWUuaGVpZ2h0KTtcclxuXHJcbiAgICAvLyAgVGhlc2UgYXJlIHRoZSBvcmlnaW5hbCAobm9uLXRyaW1tZWQpIHNwcml0ZSB2YWx1ZXNcclxuICAgIC8qXHJcbiAgICBpZiAoc3JjLnRyaW1tZWQpXHJcbiAgICB7XHJcbiAgICAgICAgbmV3RnJhbWUuc2V0VHJpbShcclxuICAgICAgICAgICAgc3JjLnNvdXJjZVNpemUudyxcclxuICAgICAgICAgICAgc3JjLnNvdXJjZVNpemUuaCxcclxuICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUueCxcclxuICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUueSxcclxuICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUudyxcclxuICAgICAgICAgICAgc3JjLnNwcml0ZVNvdXJjZVNpemUuaFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICAqL1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhIFVuaXR5IFlBTUwgRmlsZSBhbmQgY3JlYXRlcyBGcmFtZXMgaW4gdGhlIFRleHR1cmUuXHJcbiAqIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgU3ByaXRlIE1ldGEgRGF0YSBzZWUgaHR0cHM6Ly9kb2NzLnVuaXR5M2QuY29tL1NjcmlwdFJlZmVyZW5jZS9TcHJpdGVNZXRhRGF0YS5odG1sXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGV4dHVyZXMuUGFyc2Vycy5Vbml0eVlBTUxcclxuICogQG1lbWJlcm9mIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIFRleHR1cmUgdG8gYWRkIHRoZSBGcmFtZXMgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gc291cmNlSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFRleHR1cmVTb3VyY2UuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSB5YW1sIC0gVGhlIFlBTUwgZGF0YS5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9IFRoZSBUZXh0dXJlIG1vZGlmaWVkIGJ5IHRoaXMgcGFyc2VyLlxyXG4gKi9cclxudmFyIFVuaXR5WUFNTCA9IGZ1bmN0aW9uICh0ZXh0dXJlLCBzb3VyY2VJbmRleCwgeWFtbClcclxue1xyXG4gICAgLy8gIEFkZCBpbiBhIF9fQkFTRSBlbnRyeSAoZm9yIHRoZSBlbnRpcmUgYXRsYXMpXHJcbiAgICB2YXIgc291cmNlID0gdGV4dHVyZS5zb3VyY2Vbc291cmNlSW5kZXhdO1xyXG5cclxuICAgIHRleHR1cmUuYWRkKCdfX0JBU0UnLCBzb3VyY2VJbmRleCwgMCwgMCwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcclxuXHJcbiAgICBpbWFnZUhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XHJcblxyXG4gICAgdmFyIGRhdGEgPSB5YW1sLnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgICB2YXIgbGluZVJlZ0V4cCA9IC9eWyBdKigtICkqKFxcdyspK1s6IF0rKC4qKS87XHJcblxyXG4gICAgdmFyIHByZXZTcHJpdGUgPSAnJztcclxuICAgIHZhciBjdXJyZW50U3ByaXRlID0gJyc7XHJcbiAgICB2YXIgcmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG5cclxuICAgIC8vIHZhciBwaXZvdCA9IHsgeDogMCwgeTogMCB9O1xyXG4gICAgLy8gdmFyIGJvcmRlciA9IHsgeDogMCwgeTogMCwgejogMCwgdzogMCB9O1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzdWx0cyA9IGRhdGFbaV0ubWF0Y2gobGluZVJlZ0V4cCk7XHJcblxyXG4gICAgICAgIGlmICghcmVzdWx0cylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGlzTGlzdCA9IChyZXN1bHRzWzFdID09PSAnLSAnKTtcclxuICAgICAgICB2YXIga2V5ID0gcmVzdWx0c1syXTtcclxuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHRzWzNdO1xyXG5cclxuICAgICAgICBpZiAoaXNMaXN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTcHJpdGUgIT09IHByZXZTcHJpdGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFkZEZyYW1lKHRleHR1cmUsIHNvdXJjZUluZGV4LCBjdXJyZW50U3ByaXRlLCByZWN0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBwcmV2U3ByaXRlID0gY3VycmVudFNwcml0ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGtleSA9PT0gJ25hbWUnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFN0YXJ0IG5ldyBsaXN0XHJcbiAgICAgICAgICAgIGN1cnJlbnRTcHJpdGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKGtleSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxyXG4gICAgICAgICAgICBjYXNlICd5JzpcclxuICAgICAgICAgICAgY2FzZSAnd2lkdGgnOlxyXG4gICAgICAgICAgICBjYXNlICdoZWlnaHQnOlxyXG4gICAgICAgICAgICAgICAgcmVjdFtrZXldID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gY2FzZSAncGl2b3QnOlxyXG4gICAgICAgICAgICAvLyAgICAgcGl2b3QgPSBldmFsKCd2YXIgb2JqID0gJyArIHZhbHVlKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgLy8gY2FzZSAnYm9yZGVyJzpcclxuICAgICAgICAgICAgLy8gICAgIGJvcmRlciA9IGV2YWwoJ3ZhciBvYmogPSAnICsgdmFsdWUpO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyZW50U3ByaXRlICE9PSBwcmV2U3ByaXRlKVxyXG4gICAge1xyXG4gICAgICAgIGFkZEZyYW1lKHRleHR1cmUsIHNvdXJjZUluZGV4LCBjdXJyZW50U3ByaXRlLCByZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGV4dHVyZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVW5pdHlZQU1MO1xyXG5cclxuLypcclxuRXhhbXBsZSBkYXRhOlxyXG5cclxuVGV4dHVyZUltcG9ydGVyOlxyXG4gIHNwcml0ZVBpdm90OiB7eDogLjUsIHk6IC41fVxyXG4gIHNwcml0ZUJvcmRlcjoge3g6IDAsIHk6IDAsIHo6IDAsIHc6IDB9XHJcbiAgc3ByaXRlUGl4ZWxzVG9Vbml0czogMTAwXHJcbiAgc3ByaXRlU2hlZXQ6XHJcbiAgICBzcHJpdGVzOlxyXG4gICAgLSBuYW1lOiBhc3Rlcm9pZHNfMFxyXG4gICAgICByZWN0OlxyXG4gICAgICAgIHNlcmlhbGl6ZWRWZXJzaW9uOiAyXHJcbiAgICAgICAgeDogNVxyXG4gICAgICAgIHk6IDMyOFxyXG4gICAgICAgIHdpZHRoOiA2NVxyXG4gICAgICAgIGhlaWdodDogODJcclxuICAgICAgYWxpZ25tZW50OiAwXHJcbiAgICAgIHBpdm90OiB7eDogMCwgeTogMH1cclxuICAgICAgYm9yZGVyOiB7eDogMCwgeTogMCwgejogMCwgdzogMH1cclxuICAgIC0gbmFtZTogYXN0ZXJvaWRzXzFcclxuICAgICAgcmVjdDpcclxuICAgICAgICBzZXJpYWxpemVkVmVyc2lvbjogMlxyXG4gICAgICAgIHg6IDgwXHJcbiAgICAgICAgeTogMzIyXHJcbiAgICAgICAgd2lkdGg6IDUzXHJcbiAgICAgICAgaGVpZ2h0OiA4OFxyXG4gICAgICBhbGlnbm1lbnQ6IDBcclxuICAgICAgcGl2b3Q6IHt4OiAwLCB5OiAwfVxyXG4gICAgICBib3JkZXI6IHt4OiAwLCB5OiAwLCB6OiAwLCB3OiAwfVxyXG4gIHNwcml0ZVBhY2tpbmdUYWc6IEFzdGVyb2lkc1xyXG4qL1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UZXh0dXJlcy5QYXJzZXJzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQXRsYXNYTUw6IHJlcXVpcmUoJy4vQXRsYXNYTUwnKSxcclxuICAgIENhbnZhczogcmVxdWlyZSgnLi9DYW52YXMnKSxcclxuICAgIEltYWdlOiByZXF1aXJlKCcuL0ltYWdlJyksXHJcbiAgICBKU09OQXJyYXk6IHJlcXVpcmUoJy4vSlNPTkFycmF5JyksXHJcbiAgICBKU09OSGFzaDogcmVxdWlyZSgnLi9KU09OSGFzaCcpLFxyXG4gICAgU3ByaXRlU2hlZXQ6IHJlcXVpcmUoJy4vU3ByaXRlU2hlZXQnKSxcclxuICAgIFNwcml0ZVNoZWV0RnJvbUF0bGFzOiByZXF1aXJlKCcuL1Nwcml0ZVNoZWV0RnJvbUF0bGFzJyksXHJcbiAgICBVbml0eVlBTUw6IHJlcXVpcmUoJy4vVW5pdHlZQU1MJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRpbGVtYXBzLkZvcm1hdHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENTViBNYXAgVHlwZVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuRm9ybWF0cy5DU1ZcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ1NWOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGlsZWQgSlNPTiBNYXAgVHlwZVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuRm9ybWF0cy5USUxFRF9KU09OXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFRJTEVEX0pTT046IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAyRCBBcnJheSBNYXAgVHlwZVxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuRm9ybWF0cy5BUlJBWV8yRFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBBUlJBWV8yRDogMixcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdlbHRtZWlzdGVyIChJbXBhY3QuanMpIE1hcCBUeXBlXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5Gb3JtYXRzLldFTFRNRUlTVEVSXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFdFTFRNRUlTVEVSOiAzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBbiBJbWFnZSBDb2xsZWN0aW9uIGlzIGEgc3BlY2lhbCBUaWxlIFNldCBjb250YWluaW5nIG11bHRpcGxlIGltYWdlcywgd2l0aCBubyBzbGljaW5nIGludG8gZWFjaCBpbWFnZS5cclxuICpcclxuICogSW1hZ2UgQ29sbGVjdGlvbnMgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIFRpbGVkIGRhdGEgaXMgbG9hZGVkLlxyXG4gKlxyXG4gKiBAY2xhc3MgSW1hZ2VDb2xsZWN0aW9uXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGlsZW1hcHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgY29sbGVjdGlvbiBpbiB0aGUgbWFwIGRhdGEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZmlyc3RnaWQgLSBUaGUgZmlyc3QgaW1hZ2UgaW5kZXggdGhpcyBpbWFnZSBjb2xsZWN0aW9uIGNvbnRhaW5zLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD0zMl0gLSBXaWR0aCBvZiB3aWRlc3QgaW1hZ2UgKGluIHBpeGVscykuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0zMl0gLSBIZWlnaHQgb2YgdGFsbGVzdCBpbWFnZSAoaW4gcGl4ZWxzKS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbbWFyZ2luPTBdIC0gVGhlIG1hcmdpbiBhcm91bmQgYWxsIGltYWdlcyBpbiB0aGUgY29sbGVjdGlvbiAoaW4gcGl4ZWxzKS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbc3BhY2luZz0wXSAtIFRoZSBzcGFjaW5nIGJldHdlZW4gZWFjaCBpbWFnZSBpbiB0aGUgY29sbGVjdGlvbiAoaW4gcGl4ZWxzKS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSAtIEN1c3RvbSBJbWFnZSBDb2xsZWN0aW9uIHByb3BlcnRpZXMuXHJcbiAqL1xyXG52YXIgSW1hZ2VDb2xsZWN0aW9uID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIEltYWdlQ29sbGVjdGlvbiAobmFtZSwgZmlyc3RnaWQsIHdpZHRoLCBoZWlnaHQsIG1hcmdpbiwgc3BhY2luZywgcHJvcGVydGllcylcclxuICAgIHtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCB3aWR0aCA8PSAwKSB7IHdpZHRoID0gMzI7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0IDw9IDApIHsgaGVpZ2h0ID0gMzI7IH1cclxuICAgICAgICBpZiAobWFyZ2luID09PSB1bmRlZmluZWQpIHsgbWFyZ2luID0gMDsgfVxyXG4gICAgICAgIGlmIChzcGFjaW5nID09PSB1bmRlZmluZWQpIHsgc3BhY2luZyA9IDA7IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIEltYWdlIENvbGxlY3Rpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNuYW1lXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUaWxlZCBmaXJzdGdpZCB2YWx1ZS5cclxuICAgICAgICAgKiBUaGlzIGlzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgZmlyc3QgaW1hZ2UgaW5kZXggdGhpcyBJbWFnZSBDb2xsZWN0aW9uIGNvbnRhaW5zLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5JbWFnZUNvbGxlY3Rpb24jZmlyc3RnaWRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpcnN0Z2lkID0gZmlyc3RnaWQgfCAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHdpZGVzdCBpbWFnZSAoaW4gcGl4ZWxzKS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuSW1hZ2VDb2xsZWN0aW9uI2ltYWdlV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmltYWdlV2lkdGggPSB3aWR0aCB8IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHRhbGxlc3QgaW1hZ2UgKGluIHBpeGVscykuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNpbWFnZUhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VIZWlnaHQgPSBoZWlnaHQgfCAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWFyZ2luIGFyb3VuZCB0aGUgaW1hZ2VzIGluIHRoZSBjb2xsZWN0aW9uIChpbiBwaXhlbHMpLlxyXG4gICAgICAgICAqIFVzZSBgc2V0U3BhY2luZ2AgdG8gY2hhbmdlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5JbWFnZUNvbGxlY3Rpb24jaW1hZ2VNYXJnZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VNYXJnaW4gPSBtYXJnaW4gfCAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3BhY2luZyBiZXR3ZWVuIGVhY2ggaW1hZ2UgaW4gdGhlIGNvbGxlY3Rpb24gKGluIHBpeGVscykuXHJcbiAgICAgICAgICogVXNlIGBzZXRTcGFjaW5nYCB0byBjaGFuZ2UuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNpbWFnZVNwYWNpbmdcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmltYWdlU3BhY2luZyA9IHNwYWNpbmcgfCAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJbWFnZSBDb2xsZWN0aW9uLXNwZWNpZmljIHByb3BlcnRpZXMgdGhhdCBhcmUgdHlwaWNhbGx5IGRlZmluZWQgaW4gdGhlIFRpbGVkIGVkaXRvci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuSW1hZ2VDb2xsZWN0aW9uI3Byb3BlcnRpZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWNoZWQgaW1hZ2VzIHRoYXQgYXJlIGEgcGFydCBvZiB0aGlzIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNpbWFnZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIGltYWdlIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiN0b3RhbFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGltYWdlIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIGdpdmVuIGltYWdlIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNjb250YWluc0ltYWdlSW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGltYWdlSW5kZXggLSBUaGUgaW1hZ2UgaW5kZXggdG8gc2VhcmNoIGZvci5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIEltYWdlIENvbGxlY3Rpb24gY29udGFpbnMgdGhlIGdpdmVuIGluZGV4LlxyXG4gICAgICovXHJcbiAgICBjb250YWluc0ltYWdlSW5kZXg6IGZ1bmN0aW9uIChpbWFnZUluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAoaW1hZ2VJbmRleCA+PSB0aGlzLmZpcnN0Z2lkICYmIGltYWdlSW5kZXggPCAodGhpcy5maXJzdGdpZCArIHRoaXMudG90YWwpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gaW1hZ2UgdG8gdGhpcyBJbWFnZSBDb2xsZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbiNhZGRJbWFnZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZ2lkIC0gVGhlIGdpZCBvZiB0aGUgaW1hZ2UgaW4gdGhlIEltYWdlIENvbGxlY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2UgLSBUaGUgdGhlIGtleSBvZiB0aGUgaW1hZ2UgaW4gdGhlIEltYWdlIENvbGxlY3Rpb24gYW5kIGluIHRoZSBjYWNoZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuSW1hZ2VDb2xsZWN0aW9ufSBUaGlzIEltYWdlQ29sbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFkZEltYWdlOiBmdW5jdGlvbiAoZ2lkLCBpbWFnZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmltYWdlcy5wdXNoKHsgZ2lkOiBnaWQsIGltYWdlOiBpbWFnZSB9KTtcclxuICAgICAgICB0aGlzLnRvdGFsKys7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlQ29sbGVjdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRm9ybWF0cyA9IHJlcXVpcmUoJy4vRm9ybWF0cycpO1xyXG52YXIgTWFwRGF0YSA9IHJlcXVpcmUoJy4vbWFwZGF0YS9NYXBEYXRhJyk7XHJcbnZhciBQYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2Vycy9QYXJzZScpO1xyXG52YXIgVGlsZW1hcCA9IHJlcXVpcmUoJy4vVGlsZW1hcCcpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIFRpbGVtYXAgZnJvbSB0aGUgZ2l2ZW4ga2V5IG9yIGRhdGEuIElmIG5laXRoZXIgaXMgZ2l2ZW4sIG1ha2UgYSBibGFuayBUaWxlbWFwLiBXaGVuXHJcbiAqIGxvYWRpbmcgZnJvbSBDU1Ygb3IgYSAyRCBhcnJheSwgeW91IHNob3VsZCBzcGVjaWZ5IHRoZSB0aWxlV2lkdGggJiB0aWxlSGVpZ2h0LiBXaGVuIHBhcnNpbmcgZnJvbVxyXG4gKiBhIG1hcCBmcm9tIFRpbGVkLCB0aGUgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCB3aWR0aCAmIGhlaWdodCB3aWxsIGJlIHB1bGxlZCBmcm9tIHRoZSBtYXAgZGF0YS4gRm9yXHJcbiAqIGFuIGVtcHR5IG1hcCwgeW91IHNob3VsZCBzcGVjaWZ5IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgd2lkdGggJiBoZWlnaHQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2VUb1RpbGVtYXBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBUaWxlbWFwIGJlbG9uZ3MuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBrZXkgaW4gdGhlIFBoYXNlciBjYWNoZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2FkZWQgdGlsZW1hcCBkYXRhLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlV2lkdGg9MzJdIC0gVGhlIHdpZHRoIG9mIGEgdGlsZSBpbiBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVIZWlnaHQ9MzJdIC0gVGhlIGhlaWdodCBvZiBhIHRpbGUgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD0xMF0gLSBUaGUgd2lkdGggb2YgdGhlIG1hcCBpbiB0aWxlcy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PTEwXSAtIFRoZSBoZWlnaHQgb2YgdGhlIG1hcCBpbiB0aWxlcy5cclxuICogQHBhcmFtIHtpbnRlZ2VyW11bXX0gW2RhdGFdIC0gSW5zdGVhZCBvZiBsb2FkaW5nIGZyb20gdGhlIGNhY2hlLCB5b3UgY2FuIGFsc28gbG9hZCBkaXJlY3RseSBmcm9tXHJcbiAqIGEgMkQgYXJyYXkgb2YgdGlsZSBpbmRleGVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnNlcnROdWxsPWZhbHNlXSAtIENvbnRyb2xzIGhvdyBlbXB0eSB0aWxlcywgdGlsZXMgd2l0aCBhbiBpbmRleCBvZiAtMSwgaW4gdGhlXHJcbiAqIG1hcCBkYXRhIGFyZSBoYW5kbGVkLiBJZiBgdHJ1ZWAsIGVtcHR5IGxvY2F0aW9ucyB3aWxsIGdldCBhIHZhbHVlIG9mIGBudWxsYC4gSWYgYGZhbHNlYCwgZW1wdHlcclxuICogbG9jYXRpb24gd2lsbCBnZXQgYSBUaWxlIG9iamVjdCB3aXRoIGFuIGluZGV4IG9mIC0xLiBJZiB5b3UndmUgYSBsYXJnZSBzcGFyc2VseSBwb3B1bGF0ZWQgbWFwIGFuZFxyXG4gKiB0aGUgdGlsZSBkYXRhIGRvZXNuJ3QgbmVlZCB0byBjaGFuZ2UgdGhlbiBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gYHRydWVgIHdpbGwgaGVscCB3aXRoIG1lbW9yeVxyXG4gKiBjb25zdW1wdGlvbi4gSG93ZXZlciBpZiB5b3VyIG1hcCBpcyBzbWFsbCBvciB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIHRpbGVzIGR5bmFtaWNhbGx5LCB0aGVuIGxlYXZlXHJcbiAqIHRoZSBkZWZhdWx0IHZhbHVlIHNldC5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfVxyXG4gKi9cclxudmFyIFBhcnNlVG9UaWxlbWFwID0gZnVuY3Rpb24gKHNjZW5lLCBrZXksIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgd2lkdGgsIGhlaWdodCwgZGF0YSwgaW5zZXJ0TnVsbClcclxue1xyXG4gICAgaWYgKHRpbGVXaWR0aCA9PT0gdW5kZWZpbmVkKSB7IHRpbGVXaWR0aCA9IDMyOyB9XHJcbiAgICBpZiAodGlsZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IHRpbGVIZWlnaHQgPSAzMjsgfVxyXG4gICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSAxMDsgfVxyXG4gICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IDEwOyB9XHJcbiAgICBpZiAoaW5zZXJ0TnVsbCA9PT0gdW5kZWZpbmVkKSB7IGluc2VydE51bGwgPSBmYWxzZTsgfVxyXG5cclxuICAgIHZhciBtYXBEYXRhID0gbnVsbDtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgbmFtZSA9IGtleSAhPT0gdW5kZWZpbmVkID8ga2V5IDogJ21hcCc7XHJcbiAgICAgICAgbWFwRGF0YSA9IFBhcnNlKG5hbWUsIEZvcm1hdHMuQVJSQVlfMkQsIGRhdGEsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgaW5zZXJ0TnVsbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChrZXkgIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZW1hcERhdGEgPSBzY2VuZS5jYWNoZS50aWxlbWFwLmdldChrZXkpO1xyXG5cclxuICAgICAgICBpZiAoIXRpbGVtYXBEYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBtYXAgZGF0YSBmb3VuZCBmb3Iga2V5ICcgKyBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBtYXBEYXRhID0gUGFyc2Uoa2V5LCB0aWxlbWFwRGF0YS5mb3JtYXQsIHRpbGVtYXBEYXRhLmRhdGEsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgaW5zZXJ0TnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXBEYXRhID09PSBudWxsKVxyXG4gICAge1xyXG4gICAgICAgIG1hcERhdGEgPSBuZXcgTWFwRGF0YSh7XHJcbiAgICAgICAgICAgIHRpbGVXaWR0aDogdGlsZVdpZHRoLFxyXG4gICAgICAgICAgICB0aWxlSGVpZ2h0OiB0aWxlSGVpZ2h0LFxyXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBUaWxlbWFwKHNjZW5lLCBtYXBEYXRhKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VUb1RpbGVtYXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIENvbXBvbmVudHMgPSByZXF1aXJlKCcuLi9nYW1lb2JqZWN0cy9jb21wb25lbnRzJyk7XHJcbnZhciBSZWN0YW5nbGUgPSByZXF1aXJlKCcuLi9nZW9tL3JlY3RhbmdsZScpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUaWxlIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgdGlsZSB3aXRoaW4gdGhlIFRpbGVtYXAuIFRoaXMgaXMgYSBsaWdodHdlaWdodCBkYXRhXHJcbiAqIHJlcHJlc2VudGF0aW9uLCBzbyBpdHMgcG9zaXRpb24gaW5mb3JtYXRpb24gaXMgc3RvcmVkIHdpdGhvdXQgZmFjdG9yaW5nIGluIHNjcm9sbCwgbGF5ZXJcclxuICogc2NhbGUgb3IgbGF5ZXIgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBjbGFzcyBUaWxlXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGlsZW1hcHNcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5BbHBoYVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5GbGlwXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlZpc2libGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBMYXllckRhdGEgb2JqZWN0IGluIHRoZSBUaWxlbWFwIHRoYXQgdGhpcyB0aWxlIGJlbG9uZ3MgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdW5pcXVlIGluZGV4IG9mIHRoaXMgdGlsZSB3aXRoaW4gdGhlIG1hcC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGlzIHRpbGUgaW4gdGlsZSBjb29yZGluYXRlcy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGlzIHRpbGUgaW4gdGlsZSBjb29yZGluYXRlcy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFdpZHRoIG9mIHRoZSB0aWxlIGluIHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHRpbGUgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGJhc2VXaWR0aCAtIFRoZSBiYXNlIHdpZHRoIGEgdGlsZSBpbiB0aGUgbWFwIChpbiBwaXhlbHMpLiBUaWxlZCBtYXBzIHN1cHBvcnRcclxuICogbXVsdGlwbGUgdGlsZXNldCBzaXplcyB3aXRoaW4gb25lIG1hcCwgYnV0IHRoZXkgYXJlIHN0aWxsIHBsYWNlZCBhdCBpbnRlcnZhbHMgb2YgdGhlIGJhc2VcclxuICogdGlsZSB3aWR0aC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBiYXNlSGVpZ2h0IC0gVGhlIGJhc2UgaGVpZ2h0IG9mIHRoZSB0aWxlIGluIHBpeGVscyAoaW4gcGl4ZWxzKS4gVGlsZWQgbWFwc1xyXG4gKiBzdXBwb3J0IG11bHRpcGxlIHRpbGVzZXQgc2l6ZXMgd2l0aGluIG9uZSBtYXAsIGJ1dCB0aGV5IGFyZSBzdGlsbCBwbGFjZWQgYXQgaW50ZXJ2YWxzIG9mIHRoZVxyXG4gKiBiYXNlIHRpbGUgaGVpZ2h0LlxyXG4gKi9cclxudmFyIFRpbGUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuVmlzaWJsZVxyXG4gICAgXSxcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRpbGUgKGxheWVyLCBpbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYmFzZVdpZHRoLCBiYXNlSGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBMYXllckRhdGEgaW4gdGhlIFRpbGVtYXAgZGF0YSB0aGF0IHRoaXMgdGlsZSBiZWxvbmdzIHRvLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjbGF5ZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIHRpbGUgd2l0aGluIHRoZSBtYXAgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aWxlc2V0LCBvciAtMSBpZiB0aGlzXHJcbiAgICAgICAgICogcmVwcmVzZW50cyBhIGJsYW5rIHRpbGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNpbmRleFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHggbWFwIGNvb3JkaW5hdGUgb2YgdGhpcyB0aWxlIGluIHRpbGUgdW5pdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSN4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgbWFwIGNvb3JkaW5hdGUgb2YgdGhpcyB0aWxlIGluIHRpbGUgdW5pdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSN5XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0geTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSB0aWxlIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI3dpZHRoXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0aWxlIGluIHBpeGVscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2hlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWFwJ3MgYmFzZSB3aWR0aCBvZiBhIHRpbGUgaW4gcGl4ZWxzLiBUaWxlZCBtYXBzIHN1cHBvcnQgbXVsdGlwbGUgdGlsZXNldCBzaXplc1xyXG4gICAgICAgICAqIHdpdGhpbiBvbmUgbWFwLCBidXQgdGhleSBhcmUgc3RpbGwgcGxhY2VkIGF0IGludGVydmFscyBvZiB0aGUgYmFzZSB0aWxlIHNpemUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNiYXNlV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VXaWR0aCA9IChiYXNlV2lkdGggIT09IHVuZGVmaW5lZCkgPyBiYXNlV2lkdGggOiB3aWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1hcCdzIGJhc2UgaGVpZ2h0IG9mIGEgdGlsZSBpbiBwaXhlbHMuIFRpbGVkIG1hcHMgc3VwcG9ydCBtdWx0aXBsZSB0aWxlc2V0IHNpemVzXHJcbiAgICAgICAgICogd2l0aGluIG9uZSBtYXAsIGJ1dCB0aGV5IGFyZSBzdGlsbCBwbGFjZWQgYXQgaW50ZXJ2YWxzIG9mIHRoZSBiYXNlIHRpbGUgc2l6ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2Jhc2VIZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VIZWlnaHQgPSAoYmFzZUhlaWdodCAhPT0gdW5kZWZpbmVkKSA/IGJhc2VIZWlnaHQgOiBoZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IG9mIHRoaXMgdGlsZSBpbiBwaXhlbHMuIFRoaXMgaXMgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZWZ0XHJcbiAgICAgICAgICogb2YgdGhlIGxheWVyIHRoaXMgdGlsZSBpcyBiZWluZyByZW5kZXJlZCB3aXRoaW4uIFRoaXMgcHJvcGVydHkgZG9lcyBOT1QgZmFjdG9yIGluIGNhbWVyYVxyXG4gICAgICAgICAqIHNjcm9sbCwgbGF5ZXIgc2NhbGUgb3IgbGF5ZXIgcG9zaXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNwaXhlbFhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGl4ZWxYID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgb2YgdGhpcyB0aWxlIGluIHBpeGVscy4gVGhpcyBpcyByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnRcclxuICAgICAgICAgKiBvZiB0aGUgbGF5ZXIgdGhpcyB0aWxlIGlzIGJlaW5nIHJlbmRlcmVkIHdpdGhpbi4gVGhpcyBwcm9wZXJ0eSBkb2VzIE5PVCBmYWN0b3IgaW4gY2FtZXJhXHJcbiAgICAgICAgICogc2Nyb2xsLCBsYXllciBzY2FsZSBvciBsYXllciBwb3NpdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI3BpeGVsWVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waXhlbFkgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVBpeGVsWFkoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGlsZSBzcGVjaWZpYyBwcm9wZXJ0aWVzLiBUaGVzZSB1c3VhbGx5IGNvbWUgZnJvbSBUaWxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI3Byb3BlcnRpZXNcclxuICAgICAgICAgKiBAdHlwZSB7YW55fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhpcyB0aWxlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjcm90YXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm90YXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSB0aWxlIHNob3VsZCBjb2xsaWRlIHdpdGggYW55IG9iamVjdCBvbiB0aGUgbGVmdCBzaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjY29sbGlkZUxlZnRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbGxpZGVMZWZ0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHRpbGUgc2hvdWxkIGNvbGxpZGUgd2l0aCBhbnkgb2JqZWN0IG9uIHRoZSByaWdodCBzaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjY29sbGlkZVJpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb2xsaWRlUmlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgdGlsZSBzaG91bGQgY29sbGlkZSB3aXRoIGFueSBvYmplY3Qgb24gdGhlIHRvcCBzaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjY29sbGlkZVVwXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb2xsaWRlVXAgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgdGlsZSBzaG91bGQgY29sbGlkZSB3aXRoIGFueSBvYmplY3Qgb24gdGhlIGJvdHRvbSBzaWRlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjY29sbGlkZURvd25cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbGxpZGVEb3duID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHRpbGUncyBsZWZ0IGVkZ2UgaXMgaW50ZXJlc3RpbmcgZm9yIGNvbGxpc2lvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNmYWNlTGVmdFxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZmFjZUxlZnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgdGlsZSdzIHJpZ2h0IGVkZ2UgaXMgaW50ZXJlc3RpbmcgZm9yIGNvbGxpc2lvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNmYWNlUmlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZhY2VSaWdodCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSB0aWxlJ3MgdG9wIGVkZ2UgaXMgaW50ZXJlc3RpbmcgZm9yIGNvbGxpc2lvbnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNmYWNlVG9wXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5mYWNlVG9wID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIHRpbGUncyBib3R0b20gZWRnZSBpcyBpbnRlcmVzdGluZyBmb3IgY29sbGlzaW9ucy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2ZhY2VCb3R0b21cclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZhY2VCb3R0b20gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGlsZSBjb2xsaXNpb24gY2FsbGJhY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSNjb2xsaXNpb25DYWxsYmFja1xyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbGxpc2lvbkNhbGxiYWNrID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIGNvbGxpc2lvbiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2NvbGxpc2lvbkNhbGxiYWNrQ29udGV4dFxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DYWxsYmFja0NvbnRleHQgPSB0aGlzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGludCB0byBhcHBseSB0byB0aGlzIHRpbGUuIE5vdGU6IHRpbnQgaXMgY3VycmVudGx5IGEgc2luZ2xlIGNvbG9yIHZhbHVlIGluc3RlYWQgb2ZcclxuICAgICAgICAgKiB0aGUgNCBjb3JuZXIgdGludCBjb21wb25lbnQgb24gb3RoZXIgR2FtZU9iamVjdHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSN0aW50XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGludCA9IDB4ZmZmZmZmO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBlbXB0eSBvYmplY3Qgd2hlcmUgcGh5c2ljcy1lbmdpbmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gKGUuZy4gYm9kaWVzKSBtYXkgYmUgc3RvcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjcGh5c2ljc1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5waHlzaWNzID0ge307XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHggYW5kIHkgd29ybGQgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGlzIFRpbGUuIFRoaXMgZG9lcyBub3QgZmFjdG9yIGluXHJcbiAgICAgKiBjYW1lcmEgc2Nyb2xsLCBsYXllciBzY2FsZSBvciBsYXllciBwb3NpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2NvbnRhaW5zUG9pbnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byB0ZXN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIHRvIHRlc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGlzIFRpbGUsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgY29udGFpbnNQb2ludDogZnVuY3Rpb24gKHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICEoeCA8IHRoaXMucGl4ZWxYIHx8IHkgPCB0aGlzLnBpeGVsWSB8fCB4ID4gdGhpcy5yaWdodCB8fCB5ID4gdGhpcy5ib3R0b20pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgdGlsZSBkYXRhICYgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiB0aWxlIHRvIHRoaXMgdGlsZS4gVGhpcyBjb3BpZXMgZXZlcnl0aGluZ1xyXG4gICAgICogZXhjZXB0IGZvciBwb3NpdGlvbiBhbmQgaW50ZXJlc3RpbmcgZmFjZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZSNjb3B5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSB0aWxlIC0gVGhlIHRpbGUgdG8gY29weSBmcm9tLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGlzIFRpbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAodGlsZSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluZGV4ID0gdGlsZS5pbmRleDtcclxuICAgICAgICB0aGlzLmFscGhhID0gdGlsZS5hbHBoYTtcclxuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aWxlLnByb3BlcnRpZXM7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdGlsZS52aXNpYmxlO1xyXG4gICAgICAgIHRoaXMuc2V0RmxpcCh0aWxlLmZsaXBYLCB0aWxlLmZsaXBZKTtcclxuICAgICAgICB0aGlzLnRpbnQgPSB0aWxlLnRpbnQ7XHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IHRpbGUucm90YXRpb247XHJcbiAgICAgICAgdGhpcy5jb2xsaWRlVXAgPSB0aWxlLmNvbGxpZGVVcDtcclxuICAgICAgICB0aGlzLmNvbGxpZGVEb3duID0gdGlsZS5jb2xsaWRlRG93bjtcclxuICAgICAgICB0aGlzLmNvbGxpZGVMZWZ0ID0gdGlsZS5jb2xsaWRlTGVmdDtcclxuICAgICAgICB0aGlzLmNvbGxpZGVSaWdodCA9IHRpbGUuY29sbGlkZVJpZ2h0O1xyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2FsbGJhY2sgPSB0aWxlLmNvbGxpc2lvbkNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2FsbGJhY2tDb250ZXh0ID0gdGlsZS5jb2xsaXNpb25DYWxsYmFja0NvbnRleHQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb2xsaXNpb24gZ3JvdXAgZm9yIHRoaXMgVGlsZSwgZGVmaW5lZCB3aXRoaW4gdGhlIFRpbGVzZXQuIFRoaXMgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xyXG4gICAgICogdGhlIGNvbGxpc2lvbiBncm91cCBzdG9yZWQgd2l0aGluIHRoZSBUaWxlc2V0LCBzbyBhbnkgbW9kaWZpY2F0aW9uIG9mIHRoZSByZXR1cm5lZCBvYmplY3RcclxuICAgICAqIHdpbGwgaW1wYWN0IGFsbCB0aWxlcyB0aGF0IGhhdmUgdGhlIHNhbWUgaW5kZXggYXMgdGhpcyB0aWxlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjZ2V0Q29sbGlzaW9uR3JvdXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9vYmplY3R9IHRpbGVzZXRcclxuICAgICAqL1xyXG4gICAgZ2V0Q29sbGlzaW9uR3JvdXA6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNldCA/IHRoaXMudGlsZXNldC5nZXRUaWxlQ29sbGlzaW9uR3JvdXAodGhpcy5pbmRleCkgOiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aWxlIGRhdGEgZm9yIHRoaXMgVGlsZSwgZGVmaW5lZCB3aXRoaW4gdGhlIFRpbGVzZXQuIFRoaXMgdHlwaWNhbGx5IGNvbnRhaW5zIFRpbGVkXHJcbiAgICAgKiBjb2xsaXNpb24gZGF0YSwgdGlsZSBhbmltYXRpb25zIGFuZCB0ZXJyYWluIGluZm9ybWF0aW9uLiBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHRpbGVcclxuICAgICAqIGRhdGEgc3RvcmVkIHdpdGhpbiB0aGUgVGlsZXNldCwgc28gYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaW1wYWN0IGFsbFxyXG4gICAgICogdGlsZXMgdGhhdCBoYXZlIHRoZSBzYW1lIGluZGV4IGFzIHRoaXMgdGlsZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2dldFRpbGVEYXRhXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/b2JqZWN0fSB0aWxlc2V0XHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVEYXRhOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVzZXQgPyB0aGlzLnRpbGVzZXQuZ2V0VGlsZURhdGEodGhpcy5pbmRleCkgOiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHdvcmxkIFggcG9zaXRpb24gb2YgdGhlIGxlZnQgc2lkZSBvZiB0aGUgdGlsZSwgZmFjdG9yaW5nIGluIHRoZSBsYXllcnMgcG9zaXRpb24sXHJcbiAgICAgKiBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjZ2V0TGVmdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB0byBwZXJmb3JtIHRoZSBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldExlZnQ6IGZ1bmN0aW9uIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGVtYXBMYXllciA9IHRoaXMudGlsZW1hcExheWVyO1xyXG5cclxuICAgICAgICByZXR1cm4gKHRpbGVtYXBMYXllcikgPyB0aWxlbWFwTGF5ZXIudGlsZVRvV29ybGRYKHRoaXMueCwgY2FtZXJhKSA6IHRoaXMueCAqIHRoaXMuYmFzZVdpZHRoO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHdvcmxkIFggcG9zaXRpb24gb2YgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHRpbGUsIGZhY3RvcmluZyBpbiB0aGUgbGF5ZXIncyBwb3NpdGlvbixcclxuICAgICAqIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZSNnZXRSaWdodFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB0byBwZXJmb3JtIHRoZSBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldFJpZ2h0OiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aWxlbWFwTGF5ZXIgPSB0aGlzLnRpbGVtYXBMYXllcjtcclxuXHJcbiAgICAgICAgcmV0dXJuICh0aWxlbWFwTGF5ZXIpID8gdGhpcy5nZXRMZWZ0KGNhbWVyYSkgKyB0aGlzLndpZHRoICogdGlsZW1hcExheWVyLnNjYWxlWCA6IHRoaXMuZ2V0TGVmdChjYW1lcmEpICsgdGhpcy53aWR0aDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB3b3JsZCBZIHBvc2l0aW9uIG9mIHRoZSB0b3Agc2lkZSBvZiB0aGUgdGlsZSwgZmFjdG9yaW5nIGluIHRoZSBsYXllcidzIHBvc2l0aW9uLFxyXG4gICAgICogc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2dldFRvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB0byBwZXJmb3JtIHRoZSBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldFRvcDogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZW1hcExheWVyID0gdGhpcy50aWxlbWFwTGF5ZXI7XHJcblxyXG4gICAgICAgIC8vIFRpbGVkIHBsYWNlcyB0aWxlcyBvbiBhIGdyaWQgb2YgYmFzZVdpZHRoIHggYmFzZUhlaWdodC4gVGhlIG9yaWdpbiBmb3IgYSB0aWxlIGluIGdyaWRcclxuICAgICAgICAvLyB1bml0cyBpcyB0aGUgYm90dG9tIGxlZnQsIHNvIHRoZSB5IGNvb3JkaW5hdGUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgdGhlIGRpZmZlcmVuY2VcclxuICAgICAgICAvLyBiZXR3ZWVuIHRoZSBiYXNlIHNpemUgYW5kIHRoaXMgdGlsZSdzIHNpemUuXHJcbiAgICAgICAgcmV0dXJuIHRpbGVtYXBMYXllclxyXG4gICAgICAgICAgICA/IHRpbGVtYXBMYXllci50aWxlVG9Xb3JsZFkodGhpcy55LCBjYW1lcmEpIC0gKHRoaXMuaGVpZ2h0IC0gdGhpcy5iYXNlSGVpZ2h0KSAqIHRpbGVtYXBMYXllci5zY2FsZVlcclxuICAgICAgICAgICAgOiB0aGlzLnkgKiB0aGlzLmJhc2VIZWlnaHQgLSAodGhpcy5oZWlnaHQgLSB0aGlzLmJhc2VIZWlnaHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHdvcmxkIFkgcG9zaXRpb24gb2YgdGhlIGJvdHRvbSBzaWRlIG9mIHRoZSB0aWxlLCBmYWN0b3JpbmcgaW4gdGhlIGxheWVyJ3MgcG9zaXRpb24sXHJcbiAgICAgKiBzY2FsZSBhbmQgc2Nyb2xsLlxyXG5cclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjZ2V0Qm90dG9tXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHRvIHBlcmZvcm0gdGhlIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgZ2V0Qm90dG9tOiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aWxlbWFwTGF5ZXIgPSB0aGlzLnRpbGVtYXBMYXllcjtcclxuICAgICAgICByZXR1cm4gdGlsZW1hcExheWVyXHJcbiAgICAgICAgICAgID8gdGhpcy5nZXRUb3AoY2FtZXJhKSArIHRoaXMuaGVpZ2h0ICogdGlsZW1hcExheWVyLnNjYWxlWVxyXG4gICAgICAgICAgICA6IHRoaXMuZ2V0VG9wKGNhbWVyYSkgKyB0aGlzLmhlaWdodDtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgd29ybGQgcmVjdGFuZ2xlIGJvdW5kaW5nIGJveCBmb3IgdGhlIHRpbGUsIGZhY3RvcmluZyBpbiB0aGUgbGF5ZXJzIHBvc2l0aW9uLFxyXG4gICAgICogc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2dldEJvdW5kc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB0byBwZXJmb3JtIHRoZSBjaGVjay5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdlb20uUmVjdGFuZ2xlfSBbb3V0cHV0XSAtIE9wdGlvbmFsIFJlY3RhbmdsZSBvYmplY3QgdG8gc3RvcmUgdGhlIHJlc3VsdHMgaW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7KFBoYXNlci5HZW9tLlJlY3RhbmdsZXxvYmplY3QpfVxyXG4gICAgICovXHJcbiAgICBnZXRCb3VuZHM6IGZ1bmN0aW9uIChjYW1lcmEsIG91dHB1dClcclxuICAgIHtcclxuICAgICAgICBpZiAob3V0cHV0ID09PSB1bmRlZmluZWQpIHsgb3V0cHV0ID0gbmV3IFJlY3RhbmdsZSgpOyB9XHJcblxyXG4gICAgICAgIG91dHB1dC54ID0gdGhpcy5nZXRMZWZ0KCk7XHJcbiAgICAgICAgb3V0cHV0LnkgPSB0aGlzLmdldFRvcCgpO1xyXG4gICAgICAgIG91dHB1dC53aWR0aCA9IHRoaXMuZ2V0UmlnaHQoKSAtIG91dHB1dC54O1xyXG4gICAgICAgIG91dHB1dC5oZWlnaHQgPSB0aGlzLmdldEJvdHRvbSgpIC0gb3V0cHV0Lnk7XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgd29ybGQgWCBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSB0aWxlLCBmYWN0b3JpbmcgaW4gdGhlIGxheWVyJ3MgcG9zaXRpb24sXHJcbiAgICAgKiBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjZ2V0Q2VudGVyWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB0byBwZXJmb3JtIHRoZSBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldENlbnRlclg6IGZ1bmN0aW9uIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldExlZnQoY2FtZXJhKSArIHRoaXMuZ2V0UmlnaHQoY2FtZXJhKSkgLyAyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHdvcmxkIFkgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgdGlsZSwgZmFjdG9yaW5nIGluIHRoZSBsYXllcidzIHBvc2l0aW9uLFxyXG4gICAgICogc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2dldENlbnRlcllcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2UgdG8gcGVyZm9ybSB0aGUgY2hlY2suXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRDZW50ZXJZOiBmdW5jdGlvbiAoY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5nZXRUb3AoY2FtZXJhKSArIHRoaXMuZ2V0Qm90dG9tKGNhbWVyYSkpIC8gMjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhbiB1cCBtZW1vcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNvbGxpc2lvbkNhbGxiYWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2FsbGJhY2tDb250ZXh0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBmb3IgaW50ZXJzZWN0aW9uIHdpdGggdGhpcyB0aWxlLiBUaGlzIGRvZXMgbm90IGZhY3RvciBpbiBjYW1lcmEgc2Nyb2xsLCBsYXllciBzY2FsZSBvclxyXG4gICAgICogbGF5ZXIgcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZSNpbnRlcnNlY3RzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGF4aXMgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBheGlzIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCAtIFRoZSByaWdodCBwb2ludC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gLSBUaGUgYm90dG9tIHBvaW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdHM6IGZ1bmN0aW9uICh4LCB5LCByaWdodCwgYm90dG9tKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAhKFxyXG4gICAgICAgICAgICByaWdodCA8PSB0aGlzLnBpeGVsWCB8fCBib3R0b20gPD0gdGhpcy5waXhlbFkgfHxcclxuICAgICAgICAgICAgeCA+PSB0aGlzLnJpZ2h0IHx8IHkgPj0gdGhpcy5ib3R0b21cclxuICAgICAgICApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgdGlsZSBpcyBpbnRlcmVzdGluZy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI2lzSW50ZXJlc3RpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29sbGlkZXMgLSBJZiB0cnVlLCB3aWxsIGNvbnNpZGVyIHRoZSB0aWxlIGludGVyZXN0aW5nIGlmIGl0IGNvbGxpZGVzIG9uIGFueSBzaWRlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmYWNlcyAtIElmIHRydWUsIHdpbGwgY29uc2lkZXIgdGhlIHRpbGUgaW50ZXJlc3RpbmcgaWYgaXQgaGFzIGFuIGludGVyZXN0aW5nIGZhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgVGlsZSBpcyBpbnRlcmVzdGluZywgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICBpc0ludGVyZXN0aW5nOiBmdW5jdGlvbiAoY29sbGlkZXMsIGZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb2xsaWRlcyAmJiBmYWNlcykgeyByZXR1cm4gKHRoaXMuY2FuQ29sbGlkZSB8fCB0aGlzLmhhc0ludGVyZXN0aW5nRmFjZSk7IH1cclxuICAgICAgICBlbHNlIGlmIChjb2xsaWRlcykgeyByZXR1cm4gdGhpcy5jb2xsaWRlczsgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZhY2VzKSB7IHJldHVybiB0aGlzLmhhc0ludGVyZXN0aW5nRmFjZTsgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldCBjb2xsaXNpb24gc3RhdHVzIGZsYWdzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjcmVzZXRDb2xsaXNpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSBpbnRlcmVzdGluZyBmYWNlcyBmb3IgdGhpcyB0aWxlIGFuZCBpdHMgbmVpZ2hib3JzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGlzIFRpbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXNldENvbGxpc2lvbjogZnVuY3Rpb24gKHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbGxpZGVMZWZ0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb2xsaWRlUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbGxpZGVVcCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29sbGlkZURvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5mYWNlVG9wID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mYWNlQm90dG9tID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mYWNlTGVmdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmFjZVJpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGVtYXBMYXllciA9IHRoaXMudGlsZW1hcExheWVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRpbGVtYXBMYXllcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aWxlbWFwTGF5ZXIuY2FsY3VsYXRlRmFjZXNBdCh0aGlzLngsIHRoaXMueSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2V0IGZhY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjcmVzZXRGYWNlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoaXMgVGlsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlc2V0RmFjZXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mYWNlVG9wID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mYWNlQm90dG9tID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mYWNlTGVmdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmFjZVJpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbGxpc2lvbiBmbGFncyBmb3IgZWFjaCBzaWRlIG9mIHRoaXMgdGlsZSBhbmQgdXBkYXRlcyB0aGUgaW50ZXJlc3RpbmcgZmFjZXMgbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlI3NldENvbGxpc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBsZWZ0IC0gSW5kaWNhdGluZyBjb2xsaWRlIHdpdGggYW55IG9iamVjdCBvbiB0aGUgbGVmdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JpZ2h0XSAtIEluZGljYXRpbmcgY29sbGlkZSB3aXRoIGFueSBvYmplY3Qgb24gdGhlIHJpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBdIC0gSW5kaWNhdGluZyBjb2xsaWRlIHdpdGggYW55IG9iamVjdCBvbiB0aGUgdG9wLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZG93bl0gLSBJbmRpY2F0aW5nIGNvbGxpZGUgd2l0aCBhbnkgb2JqZWN0IG9uIHRoZSBib3R0b20uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgaW50ZXJlc3RpbmcgZmFjZXNcclxuICAgICAqIGZvciB0aGlzIHRpbGUgYW5kIGl0cyBuZWlnaGJvcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoaXMgVGlsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENvbGxpc2lvbjogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0LCB1cCwgZG93biwgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBpZiAocmlnaHQgPT09IHVuZGVmaW5lZCkgeyByaWdodCA9IGxlZnQ7IH1cclxuICAgICAgICBpZiAodXAgPT09IHVuZGVmaW5lZCkgeyB1cCA9IGxlZnQ7IH1cclxuICAgICAgICBpZiAoZG93biA9PT0gdW5kZWZpbmVkKSB7IGRvd24gPSBsZWZ0OyB9XHJcbiAgICAgICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbGxpZGVMZWZ0ID0gbGVmdDtcclxuICAgICAgICB0aGlzLmNvbGxpZGVSaWdodCA9IHJpZ2h0O1xyXG4gICAgICAgIHRoaXMuY29sbGlkZVVwID0gdXA7XHJcbiAgICAgICAgdGhpcy5jb2xsaWRlRG93biA9IGRvd247XHJcblxyXG4gICAgICAgIHRoaXMuZmFjZUxlZnQgPSBsZWZ0O1xyXG4gICAgICAgIHRoaXMuZmFjZVJpZ2h0ID0gcmlnaHQ7XHJcbiAgICAgICAgdGhpcy5mYWNlVG9wID0gdXA7XHJcbiAgICAgICAgdGhpcy5mYWNlQm90dG9tID0gZG93bjtcclxuXHJcbiAgICAgICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZW1hcExheWVyID0gdGhpcy50aWxlbWFwTGF5ZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZW1hcExheWVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbGVtYXBMYXllci5jYWxjdWxhdGVGYWNlc0F0KHRoaXMueCwgdGhpcy55KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhpcyB0aWxlIGlzIGhpdCBieSBhbiBvYmplY3QuIFRoZSBjYWxsYmFjayBtdXN0IHRydWUgZm9yXHJcbiAgICAgKiBjb2xsaXNpb24gcHJvY2Vzc2luZyB0byB0YWtlIHBsYWNlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjc2V0Q29sbGlzaW9uQ2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtIENhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGhpbiB0aGlzIGNvbnRleHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoaXMgVGlsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENvbGxpc2lvbkNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25DYWxsYmFjayA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25DYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25DYWxsYmFja0NvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgdGlsZSBhbmQgdXBkYXRlcyBpdHMgcGl4ZWxYIGFuZCBwaXhlbFkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZSNzZXRTaXplXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGlsZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0aWxlIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gYmFzZVdpZHRoIC0gVGhlIGJhc2Ugd2lkdGggYSB0aWxlIGluIHRoZSBtYXAgKGluIHBpeGVscykuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGJhc2VIZWlnaHQgLSBUaGUgYmFzZSBoZWlnaHQgb2YgdGhlIHRpbGUgaW4gcGl4ZWxzIChpbiBwaXhlbHMpLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGlzIFRpbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRTaXplOiBmdW5jdGlvbiAodGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBiYXNlV2lkdGgsIGJhc2VIZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRpbGVXaWR0aCAhPT0gdW5kZWZpbmVkKSB7IHRoaXMud2lkdGggPSB0aWxlV2lkdGg7IH1cclxuICAgICAgICBpZiAodGlsZUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7IHRoaXMuaGVpZ2h0ID0gdGlsZUhlaWdodDsgfVxyXG4gICAgICAgIGlmIChiYXNlV2lkdGggIT09IHVuZGVmaW5lZCkgeyB0aGlzLmJhc2VXaWR0aCA9IGJhc2VXaWR0aDsgfVxyXG4gICAgICAgIGlmIChiYXNlSGVpZ2h0ICE9PSB1bmRlZmluZWQpIHsgdGhpcy5iYXNlSGVpZ2h0ID0gYmFzZUhlaWdodDsgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVBpeGVsWFkoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCBpbnRlcm5hbGx5LiBVcGRhdGVzIHRoZSB0aWxlJ3Mgd29ybGQgWFkgcG9zaXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdGlsZSBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGUjdXBkYXRlUGl4ZWxYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoaXMgVGlsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVBpeGVsWFk6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gVGlsZWQgcGxhY2VzIHRpbGVzIG9uIGEgZ3JpZCBvZiBiYXNlV2lkdGggeCBiYXNlSGVpZ2h0LiBUaGUgb3JpZ2luIGZvciBhIHRpbGUgaXMgdGhlXHJcbiAgICAgICAgLy8gYm90dG9tIGxlZnQsIHdoaWxlIHRoZSBQaGFzZXIgcmVuZGVyZXIgYXNzdW1lcyB0aGUgb3JpZ2luIGlzIHRoZSB0b3AgbGVmdC4gVGhlIHlcclxuICAgICAgICAvLyBjb29yZGluYXRlIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IHRoZSBkaWZmZXJlbmNlLlxyXG4gICAgICAgIHRoaXMucGl4ZWxYID0gdGhpcy54ICogdGhpcy5iYXNlV2lkdGg7XHJcbiAgICAgICAgdGhpcy5waXhlbFkgPSB0aGlzLnkgKiB0aGlzLmJhc2VIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIHRoaXMucGl4ZWxZID0gdGhpcy55ICogdGhpcy5iYXNlSGVpZ2h0IC0gKHRoaXMuaGVpZ2h0IC0gdGhpcy5iYXNlSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJ1ZSBpZiB0aGlzIHRpbGUgY2FuIGNvbGxpZGUgb24gYW55IG9mIGl0cyBmYWNlcyBvciBoYXMgYSBjb2xsaXNpb24gY2FsbGJhY2sgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2NhbkNvbGxpZGVcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgY2FuQ29sbGlkZToge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jb2xsaWRlTGVmdCB8fCB0aGlzLmNvbGxpZGVSaWdodCB8fCB0aGlzLmNvbGxpZGVVcCB8fCB0aGlzLmNvbGxpZGVEb3duIHx8IHRoaXMuY29sbGlzaW9uQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIHRoaXMgdGlsZSBjYW4gY29sbGlkZSBvbiBhbnkgb2YgaXRzIGZhY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2NvbGxpZGVzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNvbGxpZGVzOiB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmNvbGxpZGVMZWZ0IHx8IHRoaXMuY29sbGlkZVJpZ2h0IHx8IHRoaXMuY29sbGlkZVVwIHx8IHRoaXMuY29sbGlkZURvd24pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIHRoaXMgdGlsZSBoYXMgYW55IGludGVyZXN0aW5nIGZhY2VzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlI2hhc0ludGVyZXN0aW5nRmFjZVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBoYXNJbnRlcmVzdGluZ0ZhY2U6IHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZmFjZVRvcCB8fCB0aGlzLmZhY2VCb3R0b20gfHwgdGhpcy5mYWNlTGVmdCB8fCB0aGlzLmZhY2VSaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aWxlc2V0IHRoYXQgY29udGFpbnMgdGhpcyBUaWxlLiBUaGlzIGlzIG51bGwgaWYgYWNjZXNzZWQgZnJvbSBhIExheWVyRGF0YSBpbnN0YW5jZVxyXG4gICAgICogYmVmb3JlIHRoZSB0aWxlIGlzIHBsYWNlZCBpbiBhIFN0YXRpY1RpbGVtYXBMYXllciBvciBEeW5hbWljVGlsZW1hcExheWVyLCBvciBpZiB0aGUgdGlsZSBoYXNcclxuICAgICAqIGFuIGluZGV4IHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFueSBvZiB0aGUgbWFwJ3MgdGlsZXNldHMuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjdGlsZXNldFxyXG4gICAgICogQHR5cGUgez9QaGFzZXIuVGlsZW1hcHMuVGlsZXNldH1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVzZXQ6IHtcclxuXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGVtYXBMYXllciA9IHRoaXMubGF5ZXIudGlsZW1hcExheWVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRpbGVtYXBMYXllcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbGVzZXQgPSB0aWxlbWFwTGF5ZXIuZ2lkTWFwW3RoaXMuaW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aWxlc2V0KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aWxlbWFwIGxheWVyIHRoYXQgY29udGFpbnMgdGhpcyBUaWxlLiBUaGlzIHdpbGwgb25seSByZXR1cm4gbnVsbCBpZiBhY2Nlc3NlZCBmcm9tIGFcclxuICAgICAqIExheWVyRGF0YSBpbnN0YW5jZSBiZWZvcmUgdGhlIHRpbGUgaXMgcGxhY2VkIHdpdGhpbiBhIFN0YXRpY1RpbGVtYXBMYXllciBvclxyXG4gICAgICogRHluYW1pY1RpbGVtYXBMYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZSN0aWxlbWFwTGF5ZXJcclxuICAgICAqIEB0eXBlIHs/UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVtYXBMYXllcjoge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxheWVyLnRpbGVtYXBMYXllcjtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpbGVtYXAgdGhhdCBjb250YWlucyB0aGlzIFRpbGUuIFRoaXMgd2lsbCBvbmx5IHJldHVybiBudWxsIGlmIGFjY2Vzc2VkIGZyb20gYSBMYXllckRhdGFcclxuICAgICAqIGluc3RhbmNlIGJlZm9yZSB0aGUgdGlsZSBpcyBwbGFjZWQgd2l0aGluIGEgU3RhdGljVGlsZW1hcExheWVyIG9yIER5bmFtaWNUaWxlbWFwTGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGUjdGlsZW1hcFxyXG4gICAgICogQHR5cGUgez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH1cclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIHRpbGVtYXA6IHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZW1hcExheWVyID0gdGhpcy50aWxlbWFwTGF5ZXI7XHJcbiAgICAgICAgICAgIHJldHVybiB0aWxlbWFwTGF5ZXIgPyB0aWxlbWFwTGF5ZXIudGlsZW1hcCA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIERlZ1RvUmFkID0gcmVxdWlyZSgnLi4vbWF0aC9EZWdUb1JhZCcpO1xyXG52YXIgRHluYW1pY1RpbGVtYXBMYXllciA9IHJlcXVpcmUoJy4vZHluYW1pY2xheWVyL0R5bmFtaWNUaWxlbWFwTGF5ZXInKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxudmFyIEZvcm1hdHMgPSByZXF1aXJlKCcuL0Zvcm1hdHMnKTtcclxudmFyIExheWVyRGF0YSA9IHJlcXVpcmUoJy4vbWFwZGF0YS9MYXllckRhdGEnKTtcclxudmFyIFJvdGF0ZSA9IHJlcXVpcmUoJy4uL21hdGgvUm90YXRlJyk7XHJcbnZhciBTcGxpY2VPbmUgPSByZXF1aXJlKCcuLi91dGlscy9hcnJheS9TcGxpY2VPbmUnKTtcclxudmFyIFN0YXRpY1RpbGVtYXBMYXllciA9IHJlcXVpcmUoJy4vc3RhdGljbGF5ZXIvU3RhdGljVGlsZW1hcExheWVyJyk7XHJcbnZhciBUaWxlID0gcmVxdWlyZSgnLi9UaWxlJyk7XHJcbnZhciBUaWxlbWFwQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4vY29tcG9uZW50cycpO1xyXG52YXIgVGlsZXNldCA9IHJlcXVpcmUoJy4vVGlsZXNldCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBUaWxlbWFwRmlsdGVyQ2FsbGJhY2tcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdH0gdmFsdWUgLSBBbiBvYmplY3QgZm91bmQgaW4gdGhlIGZpbHRlcmVkIGFyZWEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RbXX0gYXJyYXkgLSBBbiBhcnJheSBvZiBhbGwgdGhlIG9iamVjdHMgZm91bmQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBUaGUgb2JqZWN0LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAY2FsbGJhY2sgVGlsZW1hcEZpbmRDYWxsYmFja1xyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSB2YWx1ZSAtIEFuIG9iamVjdCBmb3VuZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBvYmplY3Qgd2l0aGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdFtdfSBhcnJheSAtIEFuIGFycmF5IG9mIGFsbCB0aGUgb2JqZWN0cyBmb3VuZC5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUaWxlbWFwIGlzIGEgY29udGFpbmVyIGZvciBUaWxlbWFwIGRhdGEuIFRoaXMgaXNuJ3QgYSBkaXNwbGF5IG9iamVjdCwgcmF0aGVyLCBpdCBob2xkcyBkYXRhXHJcbiAqIGFib3V0IHRoZSBtYXAgYW5kIGFsbG93cyB5b3UgdG8gYWRkIHRpbGVzZXRzIGFuZCB0aWxlbWFwIGxheWVycyB0byBpdC4gQSBtYXAgY2FuIGhhdmUgb25lIG9yXHJcbiAqIG1vcmUgdGlsZW1hcCBsYXllcnMgKFN0YXRpY1RpbGVtYXBMYXllciBvciBEeW5hbWljVGlsZW1hcExheWVyKSwgd2hpY2ggYXJlIHRoZSBkaXNwbGF5XHJcbiAqIG9iamVjdHMgdGhhdCBhY3R1YWxseSByZW5kZXIgdGlsZXMuXHJcbiAqXHJcbiAqIFRoZSBUaWxlbWFwIGRhdGEgYmUgcGFyc2VkIGZyb20gYSBUaWxlZCBKU09OIGZpbGUsIGEgQ1NWIGZpbGUgb3IgYSAyRCBhcnJheS4gVGlsZWQgaXMgYSBmcmVlXHJcbiAqIHNvZnR3YXJlIHBhY2thZ2Ugc3BlY2lmaWNhbGx5IGZvciBjcmVhdGluZyB0aWxlIG1hcHMsIGFuZCBpcyBhdmFpbGFibGUgZnJvbTpcclxuICogaHR0cDovL3d3dy5tYXBlZGl0b3Iub3JnXHJcbiAqXHJcbiAqIEEgVGlsZW1hcCBoYXMgaGFuZHkgbWV0aG9kcyBmb3IgZ2V0dGluZyAmIG1hbmlwdWxhdGluZyB0aGUgdGlsZXMgd2l0aGluIGEgbGF5ZXIuIFlvdSBjYW4gb25seVxyXG4gKiB1c2UgdGhlIG1ldGhvZHMgdGhhdCBjaGFuZ2UgdGlsZXMgKGUuZy4gcmVtb3ZlVGlsZUF0KSBvbiBhIER5bmFtaWNUaWxlbWFwTGF5ZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCBhbGwgVGlsZW1hcHMgdXNlIGEgYmFzZSB0aWxlIHNpemUgdG8gY2FsY3VsYXRlIGRpbWVuc2lvbnMgZnJvbSwgYnV0IHRoYXQgYVxyXG4gKiBTdGF0aWNUaWxlbWFwTGF5ZXIgb3IgRHluYW1pY1RpbGVtYXBMYXllciBtYXkgaGF2ZSBpdHMgb3duIHVuaXF1ZSB0aWxlIHNpemUgdGhhdCBvdmVycmlkZXNcclxuICogaXQuXHJcbiAqXHJcbiAqIEFzIG9mIFBoYXNlciAzLjIxLjAsIGlmIHlvdXIgdGlsZW1hcCBpbmNsdWRlcyBsYXllciBncm91cHMgKGEgZmVhdHVyZSBvZiBUaWxlZCAxLjIuMCspIHRoZXNlXHJcbiAqIHdpbGwgYmUgdHJhdmVyc2VkIGFuZCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2lsbCBhZmZlY3QgY2hpbGRyZW46XHJcbiAqIC0gb3BhY2l0eSAoYmxlbmRlZCB3aXRoIHBhcmVudCkgYW5kIHZpc2liaWxpdHkgKHBhcmVudCBvdmVycmlkZXMgY2hpbGQpXHJcbiAqIC0gVmVydGljYWwgYW5kIGhvcml6b250YWwgb2Zmc2V0XHJcbiAqIFRoZSBncm91cGluZyBoaWVyYXJjaHkgaXMgbm90IHByZXNlcnZlZCBhbmQgYWxsIGxheWVycyB3aWxsIGJlIGZsYXR0ZW5lZCBpbnRvIGEgc2luZ2xlIGFycmF5LlxyXG4gKiBHcm91cCBsYXllcnMgYXJlIHBhcnNlZCBkdXJpbmcgVGlsZW1hcCBjb25zdHJ1Y3Rpb24gYnV0IGFyZSBkaXNjYXJkZWQgYWZ0ZXIgcGFyc2luZyBzbyBkeW5hbWljXHJcbiAqIGxheWVycyB3aWxsIE5PVCBjb250aW51ZSB0byBiZSBhZmZlY3RlZCBieSBhIHBhcmVudC5cclxuICpcclxuICogVG8gYXZvaWQgZHVwbGljYXRlIGxheWVyIG5hbWVzLCBhIGxheWVyIHRoYXQgaXMgYSBjaGlsZCBvZiBhIGdyb3VwIGxheWVyIHdpbGwgaGF2ZSBpdHMgcGFyZW50XHJcbiAqIGdyb3VwIG5hbWUgcHJlcGVuZGVkIHdpdGggYSAnLycuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBncm91cCBjYWxsZWQgJ1BhcmVudEdyb3VwJyB3aXRoIGFcclxuICogY2hpbGQgY2FsbGVkICdMYXllciAxJy4gSW4gdGhlIFRpbGVtYXAgb2JqZWN0LCAnTGF5ZXIgMScgd2lsbCBoYXZlIHRoZSBuYW1lXHJcbiAqICdQYXJlbnRHcm91cC9MYXllciAxJy5cclxuICpcclxuICogQGNsYXNzIFRpbGVtYXBcclxuICogQG1lbWJlcm9mIFBoYXNlci5UaWxlbWFwc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB0byB3aGljaCB0aGlzIFRpbGVtYXAgYmVsb25ncy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YX0gbWFwRGF0YSAtIEEgTWFwRGF0YSBpbnN0YW5jZSBjb250YWluaW5nIFRpbGVtYXAgZGF0YS5cclxuICovXHJcbnZhciBUaWxlbWFwID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRpbGVtYXAgKHNjZW5lLCBtYXBEYXRhKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBiYXNlIHdpZHRoIG9mIGEgdGlsZSBpbiBwaXhlbHMuIE5vdGUgdGhhdCBpbmRpdmlkdWFsIGxheWVycyBtYXkgaGF2ZSBhIGRpZmZlcmVudCB0aWxlXHJcbiAgICAgICAgICogd2lkdGguXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCN0aWxlV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVXaWR0aCA9IG1hcERhdGEudGlsZVdpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYmFzZSBoZWlnaHQgb2YgYSB0aWxlIGluIHBpeGVscy4gTm90ZSB0aGF0IGluZGl2aWR1YWwgbGF5ZXJzIG1heSBoYXZlIGEgZGlmZmVyZW50XHJcbiAgICAgICAgICogdGlsZSBoZWlnaHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCN0aWxlSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlSGVpZ2h0ID0gbWFwRGF0YS50aWxlSGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG1hcCAoaW4gdGlsZXMpLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjd2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBtYXBEYXRhLndpZHRoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBtYXAgKGluIHRpbGVzKS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2hlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBtYXBEYXRhLmhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBtYXAgZGF0YSAoYXMgc3BlY2lmaWVkIGluIFRpbGVkKSwgdXN1YWxseSAnb3J0aG9nb25hbCcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNvcmllbnRhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG1hcERhdGEub3JpZW50YXRpb247XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSByZW5kZXIgKGRyYXcpIG9yZGVyIG9mIHRoZSBtYXAgZGF0YSAoYXMgc3BlY2lmaWVkIGluIFRpbGVkKSwgdXN1YWxseSAncmlnaHQtZG93bicuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGUgZHJhdyBvcmRlcnMgYXJlOlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogcmlnaHQtZG93blxyXG4gICAgICAgICAqIGxlZnQtZG93blxyXG4gICAgICAgICAqIHJpZ2h0LXVwXHJcbiAgICAgICAgICogbGVmdC11cFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlIGBzZXRSZW5kZXJPcmRlcmAgbWV0aG9kLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjcmVuZGVyT3JkZXJcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnJlbmRlck9yZGVyID0gbWFwRGF0YS5yZW5kZXJPcmRlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGZvcm1hdCBvZiB0aGUgbWFwIGRhdGEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNmb3JtYXRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gbWFwRGF0YS5mb3JtYXQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBtYXAgZGF0YSAoYXMgc3BlY2lmaWVkIGluIFRpbGVkLCB1c3VhbGx5IDEpLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjdmVyc2lvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gbWFwRGF0YS52ZXJzaW9uO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBNYXAgc3BlY2lmaWMgcHJvcGVydGllcyBhcyBzcGVjaWZpZWQgaW4gVGlsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNwcm9wZXJ0aWVzXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBtYXBEYXRhLnByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbWFwIGluIHBpeGVscyBiYXNlZCBvbiB3aWR0aCAqIHRpbGVXaWR0aC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3dpZHRoSW5QaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGhJblBpeGVscyA9IG1hcERhdGEud2lkdGhJblBpeGVscztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgbWFwIGluIHBpeGVscyBiYXNlZCBvbiBoZWlnaHQgKiB0aWxlSGVpZ2h0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjaGVpZ2h0SW5QaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0SW5QaXhlbHMgPSBtYXBEYXRhLmhlaWdodEluUGl4ZWxzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2ltYWdlQ29sbGVjdGlvbnNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRpbGVtYXBzLkltYWdlQ29sbGVjdGlvbltdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VDb2xsZWN0aW9ucyA9IG1hcERhdGEuaW1hZ2VDb2xsZWN0aW9ucztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVGlsZWQgSW1hZ2UgTGF5ZXJzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjaW1hZ2VzXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VzID0gbWFwRGF0YS5pbWFnZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIFRpbGVtYXAgbGF5ZXIgZGF0YS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2xheWVyc1xyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sYXllcnMgPSBtYXBEYXRhLmxheWVycztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVGlsZXNldHMgdXNlZCBpbiB0aGUgbWFwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjdGlsZXNldHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXRbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVzZXRzID0gbWFwRGF0YS50aWxlc2V0cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgT2JqZWN0TGF5ZXIgaW5zdGFuY2VzIHBhcnNlZCBmcm9tIFRpbGVkIG9iamVjdCBsYXllcnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNvYmplY3RzXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5PYmplY3RMYXllcltdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2JqZWN0cyA9IG1hcERhdGEub2JqZWN0cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgTGF5ZXJEYXRhIG9iamVjdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2N1cnJlbnRMYXllckluZGV4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXJJbmRleCA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcmVuZGVyaW5nIChkcmF3KSBvcmRlciBvZiB0aGUgdGlsZXMgaW4gdGhpcyBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRlZmF1bHQgaXMgJ3JpZ2h0LWRvd24nLCBtZWFuaW5nIGl0IHdpbGwgb3JkZXIgdGhlIHRpbGVzIHN0YXJ0aW5nIGZyb20gdGhlIHRvcC1sZWZ0LFxyXG4gICAgICogZHJhd2luZyB0byB0aGUgcmlnaHQgYW5kIHRoZW4gbW92aW5nIGRvd24gdG8gdGhlIG5leHQgcm93LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBkcmF3IG9yZGVycyBhcmU6XHJcbiAgICAgKlxyXG4gICAgICogMCA9IHJpZ2h0LWRvd25cclxuICAgICAqIDEgPSBsZWZ0LWRvd25cclxuICAgICAqIDIgPSByaWdodC11cFxyXG4gICAgICogMyA9IGxlZnQtdXBcclxuICAgICAqXHJcbiAgICAgKiBTZXR0aW5nIHRoZSByZW5kZXIgb3JkZXIgZG9lcyBub3QgY2hhbmdlIHRoZSB0aWxlcyBvciBob3cgdGhleSBhcmUgc3RvcmVkIGluIHRoZSBsYXllcixcclxuICAgICAqIGl0IHB1cmVseSBpbXBhY3RzIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSByZW5kZXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgY2FuIHByb3ZpZGUgZWl0aGVyIGFuIGludGVnZXIgKDAgdG8gMyksIG9yIHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgb3JkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBfYWZ0ZXJfIGNyZWF0aW5nIFN0YXRpYyBvciBEeW5hbWljIFRpbGVtYXAgTGF5ZXJzIHdpbGwgKipub3QqKiBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiB1cGRhdGUgdGhlbSB0byB1c2UgdGhlIG5ldyByZW5kZXIgb3JkZXIuIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGNyZWF0aW5nIGxheWVycywgdXNlIHRoZWlyXHJcbiAgICAgKiBvd24gYHNldFJlbmRlck9yZGVyYCBtZXRob2RzIHRvIGNoYW5nZSB0aGVtIGFzIG5lZWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3NldFJlbmRlck9yZGVyXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxzdHJpbmcpfSByZW5kZXJPcmRlciAtIFRoZSByZW5kZXIgKGRyYXcpIG9yZGVyIHZhbHVlLiBFaXRoZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDMsIG9yIGEgc3RyaW5nOiAncmlnaHQtZG93bicsICdsZWZ0LWRvd24nLCAncmlnaHQtdXAnIG9yICdsZWZ0LXVwJy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbGVtYXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSZW5kZXJPcmRlcjogZnVuY3Rpb24gKHJlbmRlck9yZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvcmRlcnMgPSBbICdyaWdodC1kb3duJywgJ2xlZnQtZG93bicsICdyaWdodC11cCcsICdsZWZ0LXVwJyBdO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHJlbmRlck9yZGVyID09PSAnbnVtYmVyJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlck9yZGVyID0gb3JkZXJzW3JlbmRlck9yZGVyXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcmRlcnMuaW5kZXhPZihyZW5kZXJPcmRlcikgPiAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyT3JkZXIgPSByZW5kZXJPcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gaW1hZ2UgdG8gdGhlIG1hcCB0byBiZSB1c2VkIGFzIGEgdGlsZXNldC4gQSBzaW5nbGUgbWFwIG1heSB1c2UgbXVsdGlwbGUgdGlsZXNldHMuXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhlIHRpbGVzZXQgbmFtZSBjYW4gYmUgZm91bmQgaW4gdGhlIEpTT04gZmlsZSBleHBvcnRlZCBmcm9tIFRpbGVkLCBvciBpbiB0aGUgVGlsZWRcclxuICAgICAqIGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2FkZFRpbGVzZXRJbWFnZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpbGVzZXROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRpbGVzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBtYXAgZGF0YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIFRoZSBrZXkgb2YgdGhlIFBoYXNlci5DYWNoZSBpbWFnZSB1c2VkIGZvciB0aGlzIHRpbGVzZXQuIElmXHJcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaXQgd2lsbCBsb29rIGZvciBhbiBpbWFnZSB3aXRoIGEga2V5IG1hdGNoaW5nIHRoZSB0aWxlc2V0TmFtZSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlV2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSB0aWxlIChpbiBwaXhlbHMpIGluIHRoZSBUaWxlc2V0IEltYWdlLiBJZiBub3RcclxuICAgICAqIGdpdmVuIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbWFwJ3MgdGlsZVdpZHRoIHZhbHVlLCBvciB0aGUgdGlsZVdpZHRoIHNwZWNpZmllZCBpbiB0aGUgVGlsZWRcclxuICAgICAqIEpTT04gZmlsZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVIZWlnaHRdIC0gVGhlIGhlaWdodCBvZiB0aGUgdGlsZXMgKGluIHBpeGVscykgaW4gdGhlIFRpbGVzZXQgSW1hZ2UuIElmXHJcbiAgICAgKiBub3QgZ2l2ZW4gaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBtYXAncyB0aWxlSGVpZ2h0IHZhbHVlLCBvciB0aGUgdGlsZUhlaWdodCBzcGVjaWZpZWQgaW4gdGhlXHJcbiAgICAgKiBUaWxlZCBKU09OIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlTWFyZ2luXSAtIFRoZSBtYXJnaW4gYXJvdW5kIHRoZSB0aWxlcyBpbiB0aGUgc2hlZXQgKGluIHBpeGVscykuIElmIG5vdFxyXG4gICAgICogc3BlY2lmaWVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gMCBvciB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBUaWxlZCBKU09OIGZpbGUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlU3BhY2luZ10gLSBUaGUgc3BhY2luZyBiZXR3ZWVuIGVhY2ggdGhlIHRpbGUgaW4gdGhlIHNoZWV0IChpbiBwaXhlbHMpLlxyXG4gICAgICogSWYgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvIDAgb3IgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgVGlsZWQgSlNPTiBmaWxlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbZ2lkPTBdIC0gSWYgYWRkaW5nIG11bHRpcGxlIHRpbGVzZXRzIHRvIGEgYmxhbmsgbWFwLCBzcGVjaWZ5IHRoZSBzdGFydGluZ1xyXG4gICAgICogR0lEIHRoaXMgc2V0IHdpbGwgdXNlIGhlcmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlc2V0fSBSZXR1cm5zIHRoZSBUaWxlc2V0IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQsIG9yIG51bGwgaWYgaXRcclxuICAgICAqIGZhaWxlZC5cclxuICAgICAqL1xyXG4gICAgYWRkVGlsZXNldEltYWdlOiBmdW5jdGlvbiAodGlsZXNldE5hbWUsIGtleSwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCB0aWxlTWFyZ2luLCB0aWxlU3BhY2luZywgZ2lkKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aWxlc2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkgeyBrZXkgPSB0aWxlc2V0TmFtZTsgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2NlbmUuc3lzLnRleHR1cmVzLmV4aXN0cyhrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIFRpbGVzZXQgSW1hZ2U6ICcgKyBrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5zY2VuZS5zeXMudGV4dHVyZXMuZ2V0KGtleSk7XHJcblxyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0VGlsZXNldEluZGV4KHRpbGVzZXROYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsICYmIHRoaXMuZm9ybWF0ID09PSBGb3JtYXRzLlRJTEVEX0pTT04pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGRhdGEgZm91bmQgZm9yIFRpbGVzZXQ6ICcgKyB0aWxlc2V0TmFtZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHRpbGVzZXQgPSB0aGlzLnRpbGVzZXRzW2luZGV4XTtcclxuXHJcbiAgICAgICAgaWYgKHRpbGVzZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aWxlc2V0LnNldFRpbGVTaXplKHRpbGVXaWR0aCwgdGlsZUhlaWdodCk7XHJcbiAgICAgICAgICAgIHRpbGVzZXQuc2V0U3BhY2luZyh0aWxlTWFyZ2luLCB0aWxlU3BhY2luZyk7XHJcbiAgICAgICAgICAgIHRpbGVzZXQuc2V0SW1hZ2UodGV4dHVyZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGlsZXNldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aWxlV2lkdGggPT09IHVuZGVmaW5lZCkgeyB0aWxlV2lkdGggPSB0aGlzLnRpbGVXaWR0aDsgfVxyXG4gICAgICAgIGlmICh0aWxlSGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgdGlsZUhlaWdodCA9IHRoaXMudGlsZUhlaWdodDsgfVxyXG4gICAgICAgIGlmICh0aWxlTWFyZ2luID09PSB1bmRlZmluZWQpIHsgdGlsZU1hcmdpbiA9IDA7IH1cclxuICAgICAgICBpZiAodGlsZVNwYWNpbmcgPT09IHVuZGVmaW5lZCkgeyB0aWxlU3BhY2luZyA9IDA7IH1cclxuICAgICAgICBpZiAoZ2lkID09PSB1bmRlZmluZWQpIHsgZ2lkID0gMDsgfVxyXG5cclxuICAgICAgICB0aWxlc2V0ID0gbmV3IFRpbGVzZXQodGlsZXNldE5hbWUsIGdpZCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCB0aWxlTWFyZ2luLCB0aWxlU3BhY2luZyk7XHJcblxyXG4gICAgICAgIHRpbGVzZXQuc2V0SW1hZ2UodGV4dHVyZSk7XHJcblxyXG4gICAgICAgIHRoaXMudGlsZXNldHMucHVzaCh0aWxlc2V0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbGVzZXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHVybnMgdGhlIER5bmFtaWNUaWxlbWFwTGF5ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsYXllciBpbnRvIGEgU3RhdGljVGlsZW1hcExheWVyLiBJZlxyXG4gICAgICogbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBtYW5pcHVsYXRlXHJcbiAgICAgKiBhIG1hcCBhdCB0aGUgc3RhcnQgb2YgYSBzY2VuZSwgYnV0IHRoZW4gbWFrZSBpdCBub24tbWFuaXB1bGFibGUgYW5kIG9wdGltaXplIGl0IGZvciBzcGVlZC5cclxuICAgICAqIE5vdGU6IHRoZSBEeW5hbWljVGlsZW1hcExheWVyIHBhc3NlZCBpbiBpcyBkZXN0cm95ZWQsIHNvIG1ha2Ugc3VyZSB0byBzdG9yZSB0aGUgdmFsdWVcclxuICAgICAqIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gbWFuaXB1bGF0ZSB0aGUgbmV3IFN0YXRpY1RpbGVtYXBMYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2NvbnZlcnRMYXllclRvU3RhdGljXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgbmFtZSBvZiB0aGUgbGF5ZXIgZnJvbSBUaWxlZCwgdGhlXHJcbiAgICAgKiBpbmRleCBvZiB0aGUgbGF5ZXIgaW4gdGhlIG1hcCwgb3IgYSBEeW5hbWljVGlsZW1hcExheWVyLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyfSBSZXR1cm5zIHRoZSBuZXcgbGF5ZXIgdGhhdCB3YXMgY3JlYXRlZCwgb3IgbnVsbCBpZiBpdFxyXG4gICAgICogZmFpbGVkLlxyXG4gICAgICovXHJcbiAgICBjb252ZXJ0TGF5ZXJUb1N0YXRpYzogZnVuY3Rpb24gKGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICB2YXIgZHluYW1pY0xheWVyID0gbGF5ZXIudGlsZW1hcExheWVyO1xyXG5cclxuICAgICAgICBpZiAoIWR5bmFtaWNMYXllciB8fCAhKGR5bmFtaWNMYXllciBpbnN0YW5jZW9mIER5bmFtaWNUaWxlbWFwTGF5ZXIpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgc3RhdGljTGF5ZXIgPSBuZXcgU3RhdGljVGlsZW1hcExheWVyKFxyXG4gICAgICAgICAgICBkeW5hbWljTGF5ZXIuc2NlbmUsXHJcbiAgICAgICAgICAgIGR5bmFtaWNMYXllci50aWxlbWFwLFxyXG4gICAgICAgICAgICBkeW5hbWljTGF5ZXIubGF5ZXJJbmRleCxcclxuICAgICAgICAgICAgZHluYW1pY0xheWVyLnRpbGVzZXQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNMYXllci54LFxyXG4gICAgICAgICAgICBkeW5hbWljTGF5ZXIueVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmFkZChzdGF0aWNMYXllcik7XHJcblxyXG4gICAgICAgIGR5bmFtaWNMYXllci5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzdGF0aWNMYXllcjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3BpZXMgdGhlIHRpbGVzIGluIHRoZSBzb3VyY2UgcmVjdGFuZ3VsYXIgYXJlYSB0byBhIG5ldyBkZXN0aW5hdGlvbiAoYWxsIHNwZWNpZmllZCBpbiB0aWxlXHJcbiAgICAgKiBjb29yZGluYXRlcykgd2l0aGluIHRoZSBsYXllci4gVGhpcyBjb3BpZXMgYWxsIHRpbGUgcHJvcGVydGllcyAmIHJlY2FsY3VsYXRlcyBjb2xsaXNpb25cclxuICAgICAqIGluZm9ybWF0aW9uIGluIHRoZSBkZXN0aW5hdGlvbiByZWdpb24uXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFN0YXRpY1RpbGVtYXBMYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNjb3B5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHNyY1RpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBjb3B5IGZyb20sIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzcmNUaWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gY29weSBmcm9tLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gY29weSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgdG8gY29weSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGRlc3RUaWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gY29weSB0bywgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGRlc3RUaWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gY29weSB0bywgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm5zIHRoaXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBjb3B5OiBmdW5jdGlvbiAoc3JjVGlsZVgsIHNyY1RpbGVZLCB3aWR0aCwgaGVpZ2h0LCBkZXN0VGlsZVgsIGRlc3RUaWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU3RhdGljQ2FsbChsYXllciwgJ2NvcHknKSkgeyByZXR1cm4gdGhpczsgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXIgIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5Db3B5KFxyXG4gICAgICAgICAgICAgICAgc3JjVGlsZVgsIHNyY1RpbGVZLFxyXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlc3RUaWxlWCwgZGVzdFRpbGVZLFxyXG4gICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXJcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBhbmQgZW1wdHkgRHluYW1pY1RpbGVtYXBMYXllci4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsYXllciBpbiB0aGUgbWFwIGlzIHNldCB0byB0aGlzIG5ldyBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2NyZWF0ZUJsYW5rRHluYW1pY0xheWVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoaXMgbGF5ZXIuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgbWFwLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdfFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0fFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0W10pfSB0aWxlc2V0IC0gVGhlIHRpbGVzZXQsIG9yIGFuIGFycmF5IG9mIHRpbGVzZXRzLCB1c2VkIHRvIHJlbmRlciB0aGlzIGxheWVyLiBDYW4gYmUgYSBzdHJpbmcgb3IgYSBUaWxlc2V0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB3b3JsZCB4IHBvc2l0aW9uIHdoZXJlIHRoZSB0b3AgbGVmdCBvZiB0aGlzIGxheWVyIHdpbGwgYmUgcGxhY2VkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHdvcmxkIHkgcG9zaXRpb24gd2hlcmUgdGhlIHRvcCBsZWZ0IG9mIHRoaXMgbGF5ZXIgd2lsbCBiZSBwbGFjZWQuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGxheWVyIGluIHRpbGVzLiBJZiBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIG1hcCdzIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQgb2YgdGhlIGxheWVyIGluIHRpbGVzLiBJZiBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIG1hcCdzIGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVXaWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIHRpbGVzIHRoZSBsYXllciB1c2VzIGZvciBjYWxjdWxhdGlvbnMuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbWFwJ3MgdGlsZVdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZUhlaWdodF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0aWxlcyB0aGUgbGF5ZXIgdXNlcyBmb3IgY2FsY3VsYXRpb25zLiBJZiBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIG1hcCdzIHRpbGVIZWlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBSZXR1cm5zIHRoZSBuZXcgbGF5ZXIgdGhhdCB3YXMgY3JlYXRlZCwgb3IgYG51bGxgIGlmIGl0IGZhaWxlZC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQmxhbmtEeW5hbWljTGF5ZXI6IGZ1bmN0aW9uIChuYW1lLCB0aWxlc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHggPT09IHVuZGVmaW5lZCkgeyB4ID0gMDsgfVxyXG4gICAgICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHsgeSA9IDA7IH1cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkgeyB3aWR0aCA9IHRoaXMud2lkdGg7IH1cclxuICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHsgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7IH1cclxuICAgICAgICBpZiAodGlsZVdpZHRoID09PSB1bmRlZmluZWQpIHsgdGlsZVdpZHRoID0gdGhpcy50aWxlV2lkdGg7IH1cclxuICAgICAgICBpZiAodGlsZUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IHRpbGVIZWlnaHQgPSB0aGlzLnRpbGVIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRMYXllckluZGV4KG5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgVGlsZW1hcCBMYXllciBJRDogJyArIG5hbWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsYXllckRhdGEgPSBuZXcgTGF5ZXJEYXRhKHtcclxuICAgICAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICAgICAgdGlsZVdpZHRoOiB0aWxlV2lkdGgsXHJcbiAgICAgICAgICAgIHRpbGVIZWlnaHQ6IHRpbGVIZWlnaHQsXHJcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHJvdztcclxuXHJcbiAgICAgICAgZm9yICh2YXIgdGlsZVkgPSAwOyB0aWxlWSA8IGhlaWdodDsgdGlsZVkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJvdyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgdGlsZVggPSAwOyB0aWxlWCA8IHdpZHRoOyB0aWxlWCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByb3cucHVzaChuZXcgVGlsZShsYXllckRhdGEsIC0xLCB0aWxlWCwgdGlsZVksIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgdGhpcy50aWxlV2lkdGgsIHRoaXMudGlsZUhlaWdodCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsYXllckRhdGEuZGF0YS5wdXNoKHJvdyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyRGF0YSk7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudExheWVySW5kZXggPSB0aGlzLmxheWVycy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICB2YXIgZHluYW1pY0xheWVyID0gbmV3IER5bmFtaWNUaWxlbWFwTGF5ZXIodGhpcy5zY2VuZSwgdGhpcywgdGhpcy5jdXJyZW50TGF5ZXJJbmRleCwgdGlsZXNldCwgeCwgeSk7XHJcblxyXG4gICAgICAgIGR5bmFtaWNMYXllci5zZXRSZW5kZXJPcmRlcih0aGlzLnJlbmRlck9yZGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZGlzcGxheUxpc3QuYWRkKGR5bmFtaWNMYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiBkeW5hbWljTGF5ZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEeW5hbWljVGlsZW1hcExheWVyIHRoYXQgcmVuZGVycyB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW5cclxuICAgICAqIGBsYXllcklEYC4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsYXllciBpbiB0aGUgbWFwIGlzIHNldCB0byB0aGlzIG5ldyBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYGxheWVySURgIGlzIGltcG9ydGFudC4gSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciBtYXAgaW4gVGlsZWQgdGhlbiB5b3UgY2FuIGdldCB0aGlzIGJ5XHJcbiAgICAgKiBsb29raW5nIGluIFRpbGVkIGFuZCBsb29raW5nIGF0IHRoZSBsYXllciBuYW1lLiBPciB5b3UgY2FuIG9wZW4gdGhlIEpTT04gZmlsZSBpdCBleHBvcnRzIGFuZFxyXG4gICAgICogbG9vayBhdCB0aGUgbGF5ZXJzW10ubmFtZSB2YWx1ZS4gRWl0aGVyIHdheSBpdCBtdXN0IG1hdGNoLlxyXG4gICAgICpcclxuICAgICAqIFVubGlrZSBhIHN0YXRpYyBsYXllciwgYSBkeW5hbWljIGxheWVyIGNhbiBiZSBtb2RpZmllZC4gU2VlIER5bmFtaWNUaWxlbWFwTGF5ZXIgZm9yIG1vcmVcclxuICAgICAqIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjY3JlYXRlRHluYW1pY0xheWVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfHN0cmluZyl9IGxheWVySUQgLSBUaGUgbGF5ZXIgYXJyYXkgaW5kZXggdmFsdWUsIG9yIGlmIGEgc3RyaW5nIGlzIGdpdmVuLCB0aGUgbGF5ZXIgbmFtZSBmcm9tIFRpbGVkLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdfFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0fFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0W10pfSB0aWxlc2V0IC0gVGhlIHRpbGVzZXQsIG9yIGFuIGFycmF5IG9mIHRpbGVzZXRzLCB1c2VkIHRvIHJlbmRlciB0aGlzIGxheWVyLiBDYW4gYmUgYSBzdHJpbmcgb3IgYSBUaWxlc2V0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBsYXllciBpbiB0aGUgd29ybGQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbGF5ZXIgb2Zmc2V0IGZyb20gVGlsZWQgb3IgMC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBsYXllciBpbiB0aGUgd29ybGQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbGF5ZXIgb2Zmc2V0IGZyb20gVGlsZWQgb3IgMC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IFJldHVybnMgdGhlIG5ldyBsYXllciB3YXMgY3JlYXRlZCwgb3IgbnVsbCBpZiBpdCBmYWlsZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUR5bmFtaWNMYXllcjogZnVuY3Rpb24gKGxheWVySUQsIHRpbGVzZXQsIHgsIHkpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRMYXllckluZGV4KGxheWVySUQpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgVGlsZW1hcCBMYXllciBJRDogJyArIGxheWVySUQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXllcklEID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdWYWxpZCB0aWxlbGF5ZXIgbmFtZXM6XFxuXFx0JyArIHRoaXMuZ2V0VGlsZUxheWVyTmFtZXMoKS5qb2luKCcsXFxuXFx0JykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsYXllckRhdGEgPSB0aGlzLmxheWVyc1tpbmRleF07XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGZvciBhbiBhc3NvY2lhdGVkIHN0YXRpYyBvciBkeW5hbWljIHRpbGVtYXAgbGF5ZXJcclxuICAgICAgICBpZiAobGF5ZXJEYXRhLnRpbGVtYXBMYXllcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGlsZW1hcCBMYXllciBJRCBhbHJlYWR5IGV4aXN0czonICsgbGF5ZXJJRCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXJJbmRleCA9IGluZGV4O1xyXG5cclxuICAgICAgICAvLyAgRGVmYXVsdCB0aGUgeC95IHBvc2l0aW9uIHRvIG1hdGNoIFRpbGVkIGxheWVyIG9mZnNldCwgaWYgaXQgZXhpc3RzLlxyXG5cclxuICAgICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeCA9IGxheWVyRGF0YS54O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHkgPSBsYXllckRhdGEueTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsYXllciA9IG5ldyBEeW5hbWljVGlsZW1hcExheWVyKHRoaXMuc2NlbmUsIHRoaXMsIGluZGV4LCB0aWxlc2V0LCB4LCB5KTtcclxuXHJcbiAgICAgICAgbGF5ZXIuc2V0UmVuZGVyT3JkZXIodGhpcy5yZW5kZXJPcmRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmRpc3BsYXlMaXN0LmFkZChsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiBsYXllcjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgU3ByaXRlIGZvciBldmVyeSBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIGdpZCBpbiB0aGUgbWFwIGRhdGEuIEFsbCBwcm9wZXJ0aWVzIGZyb21cclxuICAgICAqIHRoZSBtYXAgZGF0YSBvYmplY3Rncm91cCBhcmUgY29waWVkIGludG8gdGhlIGBzcHJpdGVDb25maWdgLCBzbyB5b3UgY2FuIHVzZSB0aGlzIGFzIGFuIGVhc3lcclxuICAgICAqIHdheSB0byBjb25maWd1cmUgU3ByaXRlIHByb3BlcnRpZXMgZnJvbSB3aXRoaW4gdGhlIG1hcCBlZGl0b3IuIEZvciBleGFtcGxlIGdpdmluZyBhbiBvYmplY3QgYVxyXG4gICAgICogcHJvcGVydHkgb2YgYWxwaGE6IDAuNSBpbiB0aGUgbWFwIGVkaXRvciB3aWxsIGR1cGxpY2F0ZSB0aGF0IHdoZW4gdGhlIFNwcml0ZSBpcyBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEN1c3RvbSBvYmplY3QgcHJvcGVydGllcyBub3Qgc2hhcmluZyBuYW1lcyB3aXRoIHRoZSBTcHJpdGUncyBvd24gcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZVxyXG4gICAgICogU3ByaXRlJ3Mge0BsaW5rIFBoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGUjZGF0YSBkYXRhIHN0b3JlfS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2NyZWF0ZUZyb21PYmplY3RzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgbGF5ZXIgKGZyb20gVGlsZWQpIHRvIGNyZWF0ZSBTcHJpdGVzIGZyb20uXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfHN0cmluZyl9IGlkIC0gRWl0aGVyIHRoZSBpZCAob2JqZWN0KSwgZ2lkICh0aWxlIG9iamVjdCkgb3IgbmFtZSAob2JqZWN0IG9yXHJcbiAgICAgKiB0aWxlIG9iamVjdCkgZnJvbSBUaWxlZC4gSWRzIGFyZSB1bmlxdWUgaW4gVGlsZWQsIGJ1dCBhIGdpZCBpcyBzaGFyZWQgYnkgYWxsIHRpbGUgb2JqZWN0c1xyXG4gICAgICogd2l0aCB0aGUgc2FtZSBncmFwaGljLiBUaGUgc2FtZSBuYW1lIGNhbiBiZSB1c2VkIG9uIG11bHRpcGxlIG9iamVjdHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5TcHJpdGUuU3ByaXRlQ29uZmlnfSBzcHJpdGVDb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBwYXNzIGludG8gdGhlIFNwcml0ZSBjcmVhdG9yIChpLmUuXHJcbiAgICAgKiBzY2VuZS5tYWtlLnNwcml0ZSkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gW3NjZW5lPXRoZSBzY2VuZSB0aGUgbWFwIGlzIHdpdGhpbl0gLSBUaGUgU2NlbmUgdG8gY3JlYXRlIHRoZSBTcHJpdGVzIHdpdGhpbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuR2FtZU9iamVjdHMuU3ByaXRlW119IEFuIGFycmF5IG9mIHRoZSBTcHJpdGVzIHRoYXQgd2VyZSBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVGcm9tT2JqZWN0czogZnVuY3Rpb24gKG5hbWUsIGlkLCBzcHJpdGVDb25maWcsIHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzcHJpdGVDb25maWcgPT09IHVuZGVmaW5lZCkgeyBzcHJpdGVDb25maWcgPSB7fTsgfVxyXG4gICAgICAgIGlmIChzY2VuZSA9PT0gdW5kZWZpbmVkKSB7IHNjZW5lID0gdGhpcy5zY2VuZTsgfVxyXG5cclxuICAgICAgICB2YXIgb2JqZWN0TGF5ZXIgPSB0aGlzLmdldE9iamVjdExheWVyKG5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoIW9iamVjdExheWVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3QgY3JlYXRlIGZyb20gb2JqZWN0LiBJbnZhbGlkIG9iamVjdGdyb3VwIG5hbWUgZ2l2ZW46ICcgKyBuYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGF5ZXJJRCA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVmFsaWQgb2JqZWN0Z3JvdXAgbmFtZXM6XFxuXFx0JyArIHRoaXMuZ2V0T2JqZWN0TGF5ZXJOYW1lcygpLmpvaW4oJyxcXG5cXHQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9iamVjdHMgPSBvYmplY3RMYXllci5vYmplY3RzO1xyXG4gICAgICAgIHZhciBzcHJpdGVzID0gW107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gb2JqZWN0c1tpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvYmouZ2lkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJyAmJiBvYmouZ2lkID09PSBpZCB8fFxyXG4gICAgICAgICAgICAgICAgb2JqLmlkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGlkID09PSAnbnVtYmVyJyAmJiBvYmouaWQgPT09IGlkIHx8XHJcbiAgICAgICAgICAgICAgICBvYmoubmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgb2JqLm5hbWUgPT09IGlkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmb3VuZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IEV4dGVuZCh7fSwgc3ByaXRlQ29uZmlnLCBvYmoucHJvcGVydGllcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uZmlnLnggPSBvYmoueDtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy55ID0gb2JqLnk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHNwcml0ZSA9IHNjZW5lLm1ha2Uuc3ByaXRlKGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICAgICAgc3ByaXRlLm5hbWUgPSBvYmoubmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLndpZHRoKSB7IHNwcml0ZS5kaXNwbGF5V2lkdGggPSBvYmoud2lkdGg7IH1cclxuICAgICAgICAgICAgICAgIGlmIChvYmouaGVpZ2h0KSB7IHNwcml0ZS5kaXNwbGF5SGVpZ2h0ID0gb2JqLmhlaWdodDsgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIE9yaWdpbiBpcyAoMCwgMSkgaW4gVGlsZWQsIHNvIGZpbmQgdGhlIG9mZnNldCB0aGF0IG1hdGNoZXMgdGhlIFNwcml0ZSdzIG9yaWdpbi5cclxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBvZmZzZXQgb2JqZWN0cyB3aXRoIHplcm8gZGltZW5zaW9ucyAoZS5nLiBwb2ludHMpLlxyXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBzcHJpdGUub3JpZ2luWCAqIG9iai53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5OiAoc3ByaXRlLm9yaWdpblkgLSAxKSAqIG9iai5oZWlnaHRcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyByb3RhdGVkLCB0aGVuIHRoZSBvcmlnaW4gb2Zmc2V0IGFsc28gbmVlZHMgdG8gYmUgcm90YXRlZC5cclxuICAgICAgICAgICAgICAgIGlmIChvYmoucm90YXRpb24pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFuZ2xlID0gRGVnVG9SYWQob2JqLnJvdGF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBSb3RhdGUob2Zmc2V0LCBhbmdsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlLnJvdGF0aW9uID0gYW5nbGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3ByaXRlLnggKz0gb2Zmc2V0Lng7XHJcbiAgICAgICAgICAgICAgICBzcHJpdGUueSArPSBvZmZzZXQueTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLmZsaXBwZWRIb3Jpem9udGFsICE9PSB1bmRlZmluZWQgfHwgb2JqLmZsaXBwZWRWZXJ0aWNhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHNwcml0ZS5zZXRGbGlwKG9iai5mbGlwcGVkSG9yaXpvbnRhbCwgb2JqLmZsaXBwZWRWZXJ0aWNhbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFvYmoudmlzaWJsZSkgeyBzcHJpdGUudmlzaWJsZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iai5wcm9wZXJ0aWVzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGUuaGFzT3duUHJvcGVydHkoa2V5KSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlLnNldERhdGEoa2V5LCBvYmoucHJvcGVydGllc1trZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzcHJpdGVzLnB1c2goc3ByaXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNwcml0ZXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFNwcml0ZSBmb3IgZXZlcnkgb2JqZWN0IG1hdGNoaW5nIHRoZSBnaXZlbiB0aWxlIGluZGV4ZXMgaW4gdGhlIGxheWVyLiBZb3UgY2FuXHJcbiAgICAgKiBvcHRpb25hbGx5IHNwZWNpZnkgaWYgZWFjaCB0aWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIG5ldyB0aWxlIGFmdGVyIHRoZSBTcHJpdGUgaGFzIGJlZW5cclxuICAgICAqIGNyZWF0ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxheSBkb3duIHNwZWNpYWwgdGlsZXMgaW4gYSBsZXZlbCB0aGF0IGFyZSBjb252ZXJ0ZWQgdG9cclxuICAgICAqIFNwcml0ZXMsIGJ1dCB3YW50IHRvIHJlcGxhY2UgdGhlIHRpbGUgaXRzZWxmIHdpdGggYSBmbG9vciB0aWxlIG9yIHNpbWlsYXIgb25jZSBjb252ZXJ0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNjcmVhdGVGcm9tVGlsZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8YXJyYXkpfSBpbmRleGVzIC0gVGhlIHRpbGUgaW5kZXgsIG9yIGFycmF5IG9mIGluZGV4ZXMsIHRvIGNyZWF0ZSBTcHJpdGVzIGZyb20uXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gcmVwbGFjZW1lbnRzIC0gVGhlIHRpbGUgaW5kZXgsIG9yIGFycmF5IG9mIGluZGV4ZXMsIHRvIGNoYW5nZSBhIGNvbnZlcnRlZFxyXG4gICAgICogdGlsZSB0by4gU2V0IHRvIGBudWxsYCB0byBsZWF2ZSB0aGUgdGlsZXMgdW5jaGFuZ2VkLiBJZiBhbiBhcnJheSBpcyBnaXZlbiwgaXQgaXMgYXNzdW1lZCB0byBiZSBhXHJcbiAgICAgKiBvbmUtdG8tb25lIG1hcHBpbmcgd2l0aCB0aGUgaW5kZXhlcyBhcnJheS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLkdhbWVPYmplY3RzLlNwcml0ZS5TcHJpdGVDb25maWd9IHNwcml0ZUNvbmZpZyAtIFRoZSBjb25maWcgb2JqZWN0IHRvIHBhc3MgaW50byB0aGUgU3ByaXRlIGNyZWF0b3IgKGkuZS4gc2NlbmUubWFrZS5zcHJpdGUpLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IFtzY2VuZT1zY2VuZSB0aGUgbWFwIGlzIHdpdGhpbl0gLSBUaGUgU2NlbmUgdG8gY3JlYXRlIHRoZSBTcHJpdGVzIHdpdGhpbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGVbXX0gUmV0dXJucyBhbiBhcnJheSBvZiBUaWxlcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUZyb21UaWxlczogZnVuY3Rpb24gKGluZGV4ZXMsIHJlcGxhY2VtZW50cywgc3ByaXRlQ29uZmlnLCBzY2VuZSwgY2FtZXJhLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkNyZWF0ZUZyb21UaWxlcyhpbmRleGVzLCByZXBsYWNlbWVudHMsIHNwcml0ZUNvbmZpZywgc2NlbmUsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgU3RhdGljVGlsZW1hcExheWVyIHRoYXQgcmVuZGVycyB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW5cclxuICAgICAqIGBsYXllcklEYC4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsYXllciBpbiB0aGUgbWFwIGlzIHNldCB0byB0aGlzIG5ldyBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYGxheWVySURgIGlzIGltcG9ydGFudC4gSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciBtYXAgaW4gVGlsZWQgdGhlbiB5b3UgY2FuIGdldCB0aGlzIGJ5XHJcbiAgICAgKiBsb29raW5nIGluIFRpbGVkIGFuZCBsb29raW5nIGF0IHRoZSBsYXllciBuYW1lLiBPciB5b3UgY2FuIG9wZW4gdGhlIEpTT04gZmlsZSBpdCBleHBvcnRzIGFuZFxyXG4gICAgICogbG9vayBhdCB0aGUgbGF5ZXJzW10ubmFtZSB2YWx1ZS4gRWl0aGVyIHdheSBpdCBtdXN0IG1hdGNoLlxyXG4gICAgICpcclxuICAgICAqIEl0J3MgaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRoYXQgYSBzdGF0aWMgbGF5ZXIgY2Fubm90IGJlIG1vZGlmaWVkLiBTZWUgU3RhdGljVGlsZW1hcExheWVyIGZvclxyXG4gICAgICogbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2NyZWF0ZVN0YXRpY0xheWVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfHN0cmluZyl9IGxheWVySUQgLSBUaGUgbGF5ZXIgYXJyYXkgaW5kZXggdmFsdWUsIG9yIGlmIGEgc3RyaW5nIGlzIGdpdmVuLCB0aGUgbGF5ZXIgbmFtZSBmcm9tIFRpbGVkLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdfFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0fFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0W10pfSB0aWxlc2V0IC0gVGhlIHRpbGVzZXQsIG9yIGFuIGFycmF5IG9mIHRpbGVzZXRzLCB1c2VkIHRvIHJlbmRlciB0aGlzIGxheWVyLiBDYW4gYmUgYSBzdHJpbmcgb3IgYSBUaWxlc2V0IG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBsYXllciBpbiB0aGUgd29ybGQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbGF5ZXIgb2Zmc2V0IGZyb20gVGlsZWQgb3IgMC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBsYXllciBpbiB0aGUgd29ybGQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgbGF5ZXIgb2Zmc2V0IGZyb20gVGlsZWQgb3IgMC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcn0gUmV0dXJucyB0aGUgbmV3IGxheWVyIHdhcyBjcmVhdGVkLCBvciBudWxsIGlmIGl0IGZhaWxlZC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlU3RhdGljTGF5ZXI6IGZ1bmN0aW9uIChsYXllcklELCB0aWxlc2V0LCB4LCB5KVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0TGF5ZXJJbmRleChsYXllcklEKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIFRpbGVtYXAgTGF5ZXIgSUQ6ICcgKyBsYXllcklEKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXllcklEID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdWYWxpZCB0aWxlbGF5ZXIgbmFtZXM6XFxuXFx0JyArIHRoaXMuZ2V0VGlsZUxheWVyTmFtZXMoKS5qb2luKCcsXFxuXFx0JykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGxheWVyRGF0YSA9IHRoaXMubGF5ZXJzW2luZGV4XTtcclxuXHJcbiAgICAgICAgLy8gIENoZWNrIGZvciBhbiBhc3NvY2lhdGVkIHN0YXRpYyBvciBkeW5hbWljIHRpbGVtYXAgbGF5ZXJcclxuICAgICAgICBpZiAobGF5ZXJEYXRhLnRpbGVtYXBMYXllcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGlsZW1hcCBMYXllciBJRCBhbHJlYWR5IGV4aXN0czonICsgbGF5ZXJJRCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXJJbmRleCA9IGluZGV4O1xyXG5cclxuICAgICAgICAvLyAgRGVmYXVsdCB0aGUgeC95IHBvc2l0aW9uIHRvIG1hdGNoIFRpbGVkIGxheWVyIG9mZnNldCwgaWYgaXQgZXhpc3RzLlxyXG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQgJiYgdGhpcy5sYXllcnNbaW5kZXhdLngpIHsgeCA9IHRoaXMubGF5ZXJzW2luZGV4XS54OyB9XHJcbiAgICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxheWVyc1tpbmRleF0ueSkgeyB5ID0gdGhpcy5sYXllcnNbaW5kZXhdLnk7IH1cclxuXHJcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFN0YXRpY1RpbGVtYXBMYXllcih0aGlzLnNjZW5lLCB0aGlzLCBpbmRleCwgdGlsZXNldCwgeCwgeSk7XHJcblxyXG4gICAgICAgIGxheWVyLnNldFJlbmRlck9yZGVyKHRoaXMucmVuZGVyT3JkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lLnN5cy5kaXNwbGF5TGlzdC5hZGQobGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbGwgbGF5ZXIgZGF0YSBmcm9tIHRoaXMgVGlsZW1hcCBhbmQgbnVsbHMgdGhlIHNjZW5lIHJlZmVyZW5jZS4gVGhpcyB3aWxsIGRlc3Ryb3kgYW55XHJcbiAgICAgKiBTdGF0aWNUaWxlbWFwTGF5ZXJzIG9yIER5bmFtaWNUaWxlbWFwTGF5ZXJzIHRoYXQgaGF2ZSBiZWVuIGxpbmtlZCB0byBMYXllckRhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUFsbExheWVycygpO1xyXG4gICAgICAgIHRoaXMudGlsZXNldHMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLm9iamVjdHMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLnNjZW5lID0gdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIgd2l0aCB0aGVcclxuICAgICAqIHNwZWNpZmllZCBpbmRleC4gVGlsZXMgd2lsbCBiZSBzZXQgdG8gY29sbGlkZSBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBjb2xsaWRpbmcgaW5kZXguXHJcbiAgICAgKiBDb2xsaXNpb24gaW5mb3JtYXRpb24gaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXAncyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFN0YXRpY1RpbGVtYXBMYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNmaWxsXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIHRpbGUgaW5kZXggdG8gZmlsbCB0aGUgYXJlYSB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybnMgdGhpcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGZpbGw6IGZ1bmN0aW9uIChpbmRleCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU3RhdGljQ2FsbChsYXllciwgJ2ZpbGwnKSkgeyByZXR1cm4gdGhpczsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5GaWxsKGluZGV4LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9yIGVhY2ggb2JqZWN0IGluIHRoZSBnaXZlbiBvYmplY3QgbGF5ZXIsIHJ1biB0aGUgZ2l2ZW4gZmlsdGVyIGNhbGxiYWNrIGZ1bmN0aW9uLiBBbnlcclxuICAgICAqIG9iamVjdHMgdGhhdCBwYXNzIHRoZSBmaWx0ZXIgdGVzdCAoaS5lLiB3aGVyZSB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlKSB3aWxsIHJldHVybmVkIGFzIGFcclxuICAgICAqIG5ldyBhcnJheS4gU2ltaWxhciB0byBBcnJheS5wcm90b3R5cGUuRmlsdGVyIGluIHZhbmlsbGEgSlMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNmaWx0ZXJPYmplY3RzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVGlsZW1hcHMuT2JqZWN0TGF5ZXJ8c3RyaW5nKX0gb2JqZWN0TGF5ZXIgLSBUaGUgbmFtZSBvZiBhbiBvYmplY3QgbGF5ZXIgKGZyb20gVGlsZWQpIG9yIGFuIE9iamVjdExheWVyIGluc3RhbmNlLlxyXG4gICAgICogQHBhcmFtIHtUaWxlbWFwRmlsdGVyQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIG9iamVjdCBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0W119IEFuIGFycmF5IG9mIG9iamVjdCB0aGF0IG1hdGNoIHRoZSBzZWFyY2gsIG9yIG51bGwgaWYgdGhlIG9iamVjdExheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBmaWx0ZXJPYmplY3RzOiBmdW5jdGlvbiAob2JqZWN0TGF5ZXIsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0TGF5ZXIgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5hbWUgPSBvYmplY3RMYXllcjtcclxuXHJcbiAgICAgICAgICAgIG9iamVjdExheWVyID0gdGhpcy5nZXRPYmplY3RMYXllcihvYmplY3RMYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW9iamVjdExheWVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIG9iamVjdCBsYXllciBmb3VuZCB3aXRoIHRoZSBuYW1lOiAnICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iamVjdExheWVyLm9iamVjdHMuZmlsdGVyKGNhbGxiYWNrLCBjb250ZXh0KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIsIHJ1biB0aGUgZ2l2ZW5cclxuICAgICAqIGZpbHRlciBjYWxsYmFjayBmdW5jdGlvbi4gQW55IHRpbGVzIHRoYXQgcGFzcyB0aGUgZmlsdGVyIHRlc3QgKGkuZS4gd2hlcmUgdGhlIGNhbGxiYWNrIHJldHVybnNcclxuICAgICAqIHRydWUpIHdpbGwgcmV0dXJuZWQgYXMgYSBuZXcgYXJyYXkuIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLkZpbHRlciBpbiB2YW5pbGxhIEpTLlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZmlsdGVyVGlsZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIHRpbGUgaW4gdGhlIGdpdmVuIGFyZWEgd2lsbCBiZSBwYXNzZWQgdG8gdGhpc1xyXG4gICAgICogY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlci4gVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdGlsZXMgdGhhdCBwYXNzIHRoZVxyXG4gICAgICogZmlsdGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IHVuZGVyIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSBSZXR1cm5zIGFuIGFycmF5IG9mIFRpbGVzLCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgZmlsdGVyVGlsZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkZpbHRlclRpbGVzKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2hlcyB0aGUgZW50aXJlIG1hcCBsYXllciBmb3IgdGhlIGZpcnN0IHRpbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGluZGV4LCB0aGVuIHJldHVybnMgdGhhdCBUaWxlXHJcbiAgICAgKiBvYmplY3QuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCBpdCByZXR1cm5zIG51bGwuIFRoZSBzZWFyY2ggc3RhcnRzIGZyb20gdGhlIHRvcC1sZWZ0IHRpbGUgYW5kXHJcbiAgICAgKiBjb250aW51ZXMgaG9yaXpvbnRhbGx5IHVudGlsIGl0IGhpdHMgdGhlIGVuZCBvZiB0aGUgcm93LCB0aGVuIGl0IGRyb3BzIGRvd24gdG8gdGhlIG5leHQgY29sdW1uLlxyXG4gICAgICogSWYgdGhlIHJldmVyc2UgYm9vbGVhbiBpcyB0cnVlLCBpdCBzY2FucyBzdGFydGluZyBmcm9tIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIHRyYXZlbGluZyB1cCB0b1xyXG4gICAgICogdGhlIHRvcC1sZWZ0LlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZmluZEJ5SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdGlsZSBpbmRleCB2YWx1ZSB0byBzZWFyY2ggZm9yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc2tpcD0wXSAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2tpcCBhIG1hdGNoaW5nIHRpbGUgYmVmb3JlIHJldHVybmluZy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIC0gSWYgdHJ1ZSBpdCB3aWxsIHNjYW4gdGhlIGxheWVyIGluIHJldmVyc2UsIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20tcmlnaHQuIE90aGVyd2lzZSBpdCBzY2FucyBmcm9tIHRoZSB0b3AtbGVmdC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFJldHVybnMgYSBUaWxlcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGZpbmRCeUluZGV4OiBmdW5jdGlvbiAoZmluZEluZGV4LCBza2lwLCByZXZlcnNlLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkZpbmRCeUluZGV4KGZpbmRJbmRleCwgc2tpcCwgcmV2ZXJzZSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgZ2l2ZW4gb2JqZWN0IGxheWVyIHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCB0ZXN0aW5nIGZ1bmN0aW9uLlxyXG4gICAgICogSS5lLiBmaW5kcyB0aGUgZmlyc3Qgb2JqZWN0IGZvciB3aGljaCBgY2FsbGJhY2tgIHJldHVybnMgdHJ1ZS4gU2ltaWxhciB0b1xyXG4gICAgICogQXJyYXkucHJvdG90eXBlLmZpbmQgaW4gdmFuaWxsYSBKUy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2ZpbmRPYmplY3RcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UaWxlbWFwcy5PYmplY3RMYXllcnxzdHJpbmcpfSBvYmplY3RMYXllciAtIFRoZSBuYW1lIG9mIGFuIG9iamVjdCBsYXllciAoZnJvbSBUaWxlZCkgb3IgYW4gT2JqZWN0TGF5ZXIgaW5zdGFuY2UuXHJcbiAgICAgKiBAcGFyYW0ge1RpbGVtYXBGaW5kQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIG9iamVjdCBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0fSBBbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBzZWFyY2gsIG9yIG51bGwgaWYgbm8gb2JqZWN0IGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBmaW5kT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0TGF5ZXIsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0TGF5ZXIgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5hbWUgPSBvYmplY3RMYXllcjtcclxuXHJcbiAgICAgICAgICAgIG9iamVjdExheWVyID0gdGhpcy5nZXRPYmplY3RMYXllcihvYmplY3RMYXllcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW9iamVjdExheWVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIG9iamVjdCBsYXllciBmb3VuZCB3aXRoIHRoZSBuYW1lOiAnICsgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iamVjdExheWVyLm9iamVjdHMuZmluZChjYWxsYmFjaywgY29udGV4dCkgfHwgbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHRoZSBmaXJzdCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIgdGhhdFxyXG4gICAgICogc2F0aXNmaWVzIHRoZSBwcm92aWRlZCB0ZXN0aW5nIGZ1bmN0aW9uLiBJLmUuIGZpbmRzIHRoZSBmaXJzdCB0aWxlIGZvciB3aGljaCBgY2FsbGJhY2tgIHJldHVybnNcclxuICAgICAqIHRydWUuIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLmZpbmQgaW4gdmFuaWxsYSBKUy5cclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZmluZFRpbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RmluZFRpbGVDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suIEVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gc2VhcmNoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gc2VhcmNoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5GaWx0ZXJpbmdPcHRpb25zfSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSBUaWxlIGxheWVyIHRvIHJ1biB0aGUgc2VhcmNoIG9uLiBJZiBub3QgcHJvdmlkZWQgd2lsbCB1c2UgdGhlIGN1cnJlbnQgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlfSBSZXR1cm5zIGEgVGlsZXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBmaW5kVGlsZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuRmluZFRpbGUoY2FsbGJhY2ssIGNvbnRleHQsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIHRpbGUgaW4gdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZSBsYXllciwgcnVuIHRoZSBnaXZlblxyXG4gICAgICogY2FsbGJhY2suIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggaW4gdmFuaWxsYSBKUy5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXAncyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNmb3JFYWNoVGlsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFYWNoVGlsZUNhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay4gRWFjaCB0aWxlIGluIHRoZSBnaXZlbiBhcmVhIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHJ1bi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLkZpbHRlcmluZ09wdGlvbnN9IFtmaWx0ZXJpbmdPcHRpb25zXSAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgd2hlbiBnZXR0aW5nIHRoZSB0aWxlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIFRpbGUgbGF5ZXIgdG8gcnVuIHRoZSBzZWFyY2ggb24uIElmIG5vdCBwcm92aWRlZCB3aWxsIHVzZSB0aGUgY3VycmVudCBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybnMgdGhpcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGZvckVhY2hUaWxlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLkZvckVhY2hUaWxlKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW1hZ2UgbGF5ZXIgaW5kZXggYmFzZWQgb24gaXRzIG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRJbWFnZUluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpbWFnZSB0byBnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIGluZGV4IG9mIHRoZSBpbWFnZSBpbiB0aGlzIHRpbGVtYXAsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRJbWFnZUluZGV4OiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbmRleCh0aGlzLmltYWdlcywgbmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmFsaWQgaW1hZ2VsYXllciBuYW1lcyBsb2FkZWQgaW4gdGhpcyBUaWxlbWFwLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZ2V0SW1hZ2VMYXllck5hbWVzXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEFycmF5IG9mIHZhbGlkIGltYWdlbGF5ZXIgbmFtZXMgLyBJRHMgbG9hZGVkIGludG8gdGhpcyBUaWxlbWFwLlxyXG4gICAgICovXHJcbiAgICBnZXRJbWFnZUxheWVyTmFtZXM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlcyB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmltYWdlcykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubWFwKGZ1bmN0aW9uIChpbWFnZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbWFnZS5uYW1lO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsbHkgdXNlZC4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiBvbmUgb2YgdGhlIFRpbGVtYXBzIGFycmF5cyB3aG9zZSBuYW1lXHJcbiAgICAgKiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBnaXZlbiBgbmFtZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRJbmRleFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gbG9jYXRpb24gLSBUaGUgVGlsZW1hcCBhcnJheSB0byBzZWFyY2guXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhcnJheSBlbGVtZW50IHRvIGdldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgYXJyYXksIG9yIG51bGwgaWYgbm90IGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBnZXRJbmRleDogZnVuY3Rpb24gKGxvY2F0aW9uLCBuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYXRpb24ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb25baV0ubmFtZSA9PT0gbmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIExheWVyRGF0YSBmcm9tIHRoaXMubGF5ZXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGBsYXllcmAsIG9yIG51bGwgaWYgYW4gaW52YWxpZFxyXG4gICAgICogYGxheWVyYCBpcyBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldExheWVyXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSBuYW1lIG9mIHRoZVxyXG4gICAgICogbGF5ZXIgZnJvbSBUaWxlZCwgdGhlIGluZGV4IG9mIHRoZSBsYXllciBpbiB0aGUgbWFwLCBhIER5bmFtaWNUaWxlbWFwTGF5ZXIgb3IgYVxyXG4gICAgICogU3RhdGljVGlsZW1hcExheWVyLiBJZiBub3QgZ2l2ZW4gd2lsbCBkZWZhdWx0IHRvIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gVGhlIGNvcnJlc3BvbmRpbmcgTGF5ZXJEYXRhIHdpdGhpbiB0aGlzLmxheWVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0TGF5ZXI6IGZ1bmN0aW9uIChsYXllcilcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldExheWVySW5kZXgobGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gKGluZGV4ICE9PSBudWxsKSA/IHRoaXMubGF5ZXJzW2luZGV4XSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgT2JqZWN0TGF5ZXIgZnJvbSB0aGlzLm9iamVjdHMgdGhhdCBoYXMgdGhlIGdpdmVuIGBuYW1lYCwgb3IgbnVsbCBpZiBubyBPYmplY3RMYXllclxyXG4gICAgICogaXMgZm91bmQgd2l0aCB0aGF0IG5hbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRPYmplY3RMYXllclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgbGF5ZXIgZnJvbSBUaWxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyfSBUaGUgY29ycmVzcG9uZGluZyBPYmplY3RMYXllciB3aXRoaW4gdGhpcy5vYmplY3RzIG9yIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGdldE9iamVjdExheWVyOiBmdW5jdGlvbiAobmFtZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldEluZGV4KHRoaXMub2JqZWN0cywgbmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoaW5kZXggIT09IG51bGwpID8gdGhpcy5vYmplY3RzW2luZGV4XSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmFsaWQgb2JqZWN0Z3JvdXAgbmFtZXMgbG9hZGVkIGluIHRoaXMgVGlsZW1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldE9iamVjdExheWVyTmFtZXNcclxuICAgICAqIEBzaW5jZSAzLjIxLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2YgdmFsaWQgb2JqZWN0Z3JvdXAgbmFtZXMgLyBJRHMgbG9hZGVkIGludG8gdGhpcyBUaWxlbWFwLlxyXG4gICAgICovXHJcbiAgICBnZXRPYmplY3RMYXllck5hbWVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5vYmplY3RzIHx8ICFBcnJheS5pc0FycmF5KHRoaXMub2JqZWN0cykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzLm1hcChmdW5jdGlvbiAob2JqZWN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5uYW1lO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIExheWVyRGF0YSBpbmRleCBvZiB0aGUgZ2l2ZW4gYGxheWVyYCB3aXRoaW4gdGhpcy5sYXllcnMsIG9yIG51bGwgaWYgYW4gaW52YWxpZFxyXG4gICAgICogYGxheWVyYCBpcyBnaXZlbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldExheWVySW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIG5hbWUgb2YgdGhlXHJcbiAgICAgKiBsYXllciBmcm9tIFRpbGVkLCB0aGUgaW5kZXggb2YgdGhlIGxheWVyIGluIHRoZSBtYXAsIGEgRHluYW1pY1RpbGVtYXBMYXllciBvciBhXHJcbiAgICAgKiBTdGF0aWNUaWxlbWFwTGF5ZXIuIElmIG5vdCBnaXZlbiB3aWxsIGRlZmF1bHQgdG8gdGhlIG1hcCdzIGN1cnJlbnQgbGF5ZXIgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIExheWVyRGF0YSBpbmRleCB3aXRoaW4gdGhpcy5sYXllcnMuXHJcbiAgICAgKi9cclxuICAgIGdldExheWVySW5kZXg6IGZ1bmN0aW9uIChsYXllcilcclxuICAgIHtcclxuICAgICAgICBpZiAobGF5ZXIgPT09IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYXllckluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGF5ZXIgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF5ZXJJbmRleEJ5TmFtZShsYXllcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsYXllciA9PT0gJ251bWJlcicgJiYgbGF5ZXIgPCB0aGlzLmxheWVycy5sZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxheWVyIGluc3RhbmNlb2YgU3RhdGljVGlsZW1hcExheWVyIHx8IGxheWVyIGluc3RhbmNlb2YgRHluYW1pY1RpbGVtYXBMYXllcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYXllci5sYXllckluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIExheWVyRGF0YSB3aXRoaW4gdGhpcy5sYXllcnMgdGhhdCBoYXMgdGhlIGdpdmVuIGBuYW1lYCwgb3IgbnVsbCBpZiBhblxyXG4gICAgICogaW52YWxpZCBgbmFtZWAgaXMgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRMYXllckluZGV4QnlOYW1lXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBsYXllciB0byBnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7aW50ZWdlcn0gVGhlIExheWVyRGF0YSBpbmRleCB3aXRoaW4gdGhpcy5sYXllcnMuXHJcbiAgICAgKi9cclxuICAgIGdldExheWVySW5kZXhCeU5hbWU6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEluZGV4KHRoaXMubGF5ZXJzLCBuYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBmcm9tIHRoZSBnaXZlbiBsYXllci5cclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcCdzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldFRpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFggcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHRpbGUgdW5pdHMsIG5vdCBwaXhlbHMpLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFkgcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHRpbGUgdW5pdHMsIG5vdCBwaXhlbHMpLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9uTnVsbD1mYWxzZV0gLSBJZiB0cnVlIGdldFRpbGUgd29uJ3QgcmV0dXJuIG51bGwgZm9yIGVtcHR5IHRpbGVzLCBidXQgYSBUaWxlIG9iamVjdCB3aXRoIGFuIGluZGV4IG9mIC0xLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gUmV0dXJucyBhIFRpbGUsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlQXQ6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIG5vbk51bGwsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuR2V0VGlsZUF0KHRpbGVYLCB0aWxlWSwgbm9uTnVsbCwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB0aWxlIGF0IHRoZSBnaXZlbiB3b3JsZCBjb29yZGluYXRlcyBmcm9tIHRoZSBnaXZlbiBsYXllci5cclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcCdzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldFRpbGVBdFdvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBYIHBvc2l0aW9uIHRvIGdldCB0aGUgdGlsZSBmcm9tIChnaXZlbiBpbiBwaXhlbHMpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gWSBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSAoZ2l2ZW4gaW4gcGl4ZWxzKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9uTnVsbD1mYWxzZV0gLSBJZiB0cnVlLCBmdW5jdGlvbiB3b24ndCByZXR1cm4gbnVsbCBmb3IgZW1wdHkgdGlsZXMsIGJ1dCBhIFRpbGUgb2JqZWN0IHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gUmV0dXJucyBhIFRpbGUsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlQXRXb3JsZFhZOiBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIG5vbk51bGwsIGNhbWVyYSwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlQXRXb3JsZFhZKHdvcmxkWCwgd29ybGRZLCBub25OdWxsLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB2YWxpZCB0aWxlbGF5ZXIgbmFtZXMgbG9hZGVkIGluIHRoaXMgVGlsZW1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2dldFRpbGVMYXllck5hbWVzXHJcbiAgICAgKiBAc2luY2UgMy4yMS4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7c3RyaW5nW119IEFycmF5IG9mIHZhbGlkIHRpbGVsYXllciBuYW1lcyAvIElEcyBsb2FkZWQgaW50byB0aGlzIFRpbGVtYXAuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVMYXllck5hbWVzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5sYXllcnMgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5sYXllcnMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXJzLm1hcChmdW5jdGlvbiAobGF5ZXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbGF5ZXIubmFtZTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0aWxlcyBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRUaWxlc1dpdGhpblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLkZpbHRlcmluZ09wdGlvbnN9IFtmaWx0ZXJpbmdPcHRpb25zXSAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgd2hlbiBnZXR0aW5nIHRoZSB0aWxlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gUmV0dXJucyBhbiBhcnJheSBvZiBUaWxlcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVzV2l0aGluOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkdldFRpbGVzV2l0aGluKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpbGVzIHRoYXQgb3ZlcmxhcCB3aXRoIHRoZSBnaXZlbiBzaGFwZSBpbiB0aGUgZ2l2ZW4gbGF5ZXIuIFRoZSBzaGFwZSBtdXN0IGJlIGEgQ2lyY2xlLFxyXG4gICAgICogTGluZSwgUmVjdGFuZ2xlIG9yIFRyaWFuZ2xlLiBUaGUgc2hhcGUgc2hvdWxkIGJlIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRUaWxlc1dpdGhpblNoYXBlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuR2VvbS5DaXJjbGV8UGhhc2VyLkdlb20uTGluZXxQaGFzZXIuR2VvbS5SZWN0YW5nbGV8UGhhc2VyLkdlb20uVHJpYW5nbGUpfSBzaGFwZSAtIEEgc2hhcGUgaW4gd29ybGQgKHBpeGVsKSBjb29yZGluYXRlc1xyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlW119IFJldHVybnMgYW4gYXJyYXkgb2YgVGlsZXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc1dpdGhpblNoYXBlOiBmdW5jdGlvbiAoc2hhcGUsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpblNoYXBlKHNoYXBlLCBmaWx0ZXJpbmdPcHRpb25zLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0aWxlcyBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gd29ybGQgY29vcmRpbmF0ZXMpIG9mIHRoZSBsYXllci5cclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZ2V0VGlsZXNXaXRoaW5Xb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHdvcmxkIHggY29vcmRpbmF0ZSBmb3IgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB3b3JsZCB5IGNvb3JkaW5hdGUgZm9yIHRoZSB0b3AtbGVmdCBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlW119IFJldHVybnMgYW4gYXJyYXkgb2YgVGlsZXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc1dpdGhpbldvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgY2FtZXJhLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkdldFRpbGVzV2l0aGluV29ybGRYWSh3b3JsZFgsIHdvcmxkWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgY2FtZXJhLCBsYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgVGlsZXNldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gYG5hbWVgLCBvciBudWxsIGlmIGFuIGludmFsaWQgYG5hbWVgIGlzIGdpdmVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZ2V0VGlsZXNldFxyXG4gICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIFRpbGVzZXQgdG8gZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZXNldH0gVGhlIFRpbGVzZXQsIG9yIGBudWxsYCBpZiBubyBtYXRjaGluZyBuYW1lZCB0aWxlc2V0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgZ2V0VGlsZXNldDogZnVuY3Rpb24gKG5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5nZXRJbmRleCh0aGlzLnRpbGVzZXRzLCBuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChpbmRleCAhPT0gbnVsbCkgPyB0aGlzLnRpbGVzZXRzW2luZGV4XSA6IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIFRpbGVzZXQgd2l0aGluIHRoaXMudGlsZXNldHMgdGhhdCBoYXMgdGhlIGdpdmVuIGBuYW1lYCwgb3IgbnVsbCBpZiBhblxyXG4gICAgICogaW52YWxpZCBgbmFtZWAgaXMgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNnZXRUaWxlc2V0SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIFRpbGVzZXQgdG8gZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBUaWxlc2V0IGluZGV4IHdpdGhpbiB0aGlzLnRpbGVzZXRzLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc2V0SW5kZXg6IGZ1bmN0aW9uIChuYW1lKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEluZGV4KHRoaXMudGlsZXNldHMsIG5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHRpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBpbiB0aGUgZ2l2ZW4gbGF5ZXIuIFJldHVybnNcclxuICAgICAqIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHRpbGUgb3IgaWYgdGhlIHRpbGUgYXQgdGhhdCBsb2NhdGlvbiBoYXMgYW4gaW5kZXggb2YgLTEuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjaGFzVGlsZUF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P2Jvb2xlYW59IFJldHVybnMgYSBib29sZWFuLCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgaGFzVGlsZUF0OiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkhhc1RpbGVBdCh0aWxlWCwgdGlsZVksIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSB0aWxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiAoaW4gd29ybGQgY29vcmRpbmF0ZXMpIGluIHRoZSBnaXZlbiBsYXllci4gUmV0dXJuc1xyXG4gICAgICogZmFsc2UgaWYgdGhlcmUgaXMgbm8gdGlsZSBvciBpZiB0aGUgdGlsZSBhdCB0aGF0IGxvY2F0aW9uIGhhcyBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2hhc1RpbGVBdFdvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P2Jvb2xlYW59IFJldHVybnMgYSBib29sZWFuLCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgaGFzVGlsZUF0V29ybGRYWTogZnVuY3Rpb24gKHdvcmxkWCwgd29ybGRZLCBjYW1lcmEsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuSGFzVGlsZUF0V29ybGRYWSh3b3JsZFgsIHdvcmxkWSwgY2FtZXJhLCBsYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIExheWVyRGF0YSBvYmplY3QgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIG1hcC4gWW91IGNhbiBzZXQgdGhpcyBwcm9wZXJ0eSB1c2luZ1xyXG4gICAgICogYW55IHR5cGUgc3VwcG9ydGVkIGJ5IHNldExheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2xheWVyXHJcbiAgICAgKiBAdHlwZSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBsYXllcjoge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxheWVyc1t0aGlzLmN1cnJlbnRMYXllckluZGV4XTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChsYXllcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TGF5ZXIobGF5ZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQdXRzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBpbiB0aGUgc3BlY2lmaWVkIGxheWVyLiBZb3UgY2FuIHBhc3MgaW4gZWl0aGVyIGFuIGluZGV4XHJcbiAgICAgKiBvciBhIFRpbGUgb2JqZWN0LiBJZiB5b3UgcGFzcyBpbiBhIFRpbGUsIGFsbCBhdHRyaWJ1dGVzIHdpbGwgYmUgY29waWVkIG92ZXIgdG8gdGhlIHNwZWNpZmllZFxyXG4gICAgICogbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZSBpbmRleCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpbGwgYmUgY2hhbmdlZC5cclxuICAgICAqIENvbGxpc2lvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY2FsY3VsYXRlZCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gU3RhdGljVGlsZW1hcExheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3B1dFRpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuVGlsZSl9IHRpbGUgLSBUaGUgaW5kZXggb2YgdGhpcyB0aWxlIHRvIHNldCBvciBhIFRpbGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIGB0cnVlYCBpZiB0aGUgZmFjZXMgZGF0YSBzaG91bGQgYmUgcmVjYWxjdWxhdGVkLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gUmV0dXJucyBhIFRpbGUsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkIG9yIHRoZSBjb29yZGluYXRlcyB3ZXJlIG91dCBvZiBib3VuZHMuXHJcbiAgICAgKi9cclxuICAgIHB1dFRpbGVBdDogZnVuY3Rpb24gKHRpbGUsIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU3RhdGljQ2FsbChsYXllciwgJ3B1dFRpbGVBdCcpKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuUHV0VGlsZUF0KHRpbGUsIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgYSB0aWxlIGF0IHRoZSBnaXZlbiB3b3JsZCBjb29yZGluYXRlcyAocGl4ZWxzKSBpbiB0aGUgc3BlY2lmaWVkIGxheWVyLiBZb3UgY2FuIHBhc3MgaW4gZWl0aGVyXHJcbiAgICAgKiBhbiBpbmRleCBvciBhIFRpbGUgb2JqZWN0LiBJZiB5b3UgcGFzcyBpbiBhIFRpbGUsIGFsbCBhdHRyaWJ1dGVzIHdpbGwgYmUgY29waWVkIG92ZXIgdG8gdGhlXHJcbiAgICAgKiBzcGVjaWZpZWQgbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZSBpbmRleCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpbGwgYmVcclxuICAgICAqIGNoYW5nZWQuIENvbGxpc2lvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY2FsY3VsYXRlZCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLiBUaGlzXHJcbiAgICAgKiBjYW5ub3QgYmUgYXBwbGllZCB0byBTdGF0aWNUaWxlbWFwTGF5ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjcHV0VGlsZUF0V29ybGRYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuVGlsZSl9IHRpbGUgLSBUaGUgaW5kZXggb2YgdGhpcyB0aWxlIHRvIHNldCBvciBhIFRpbGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gUmV0dXJucyBhIFRpbGUsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBwdXRUaWxlQXRXb3JsZFhZOiBmdW5jdGlvbiAodGlsZSwgd29ybGRYLCB3b3JsZFksIHJlY2FsY3VsYXRlRmFjZXMsIGNhbWVyYSwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU3RhdGljQ2FsbChsYXllciwgJ3B1dFRpbGVBdFdvcmxkWFknKSkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlB1dFRpbGVBdFdvcmxkWFkodGlsZSwgd29ybGRYLCB3b3JsZFksIHJlY2FsY3VsYXRlRmFjZXMsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgYW4gYXJyYXkgb2YgdGlsZXMgb3IgYSAyRCBhcnJheSBvZiB0aWxlcyBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBpbiB0aGUgc3BlY2lmaWVkXHJcbiAgICAgKiBsYXllci4gVGhlIGFycmF5IGNhbiBiZSBjb21wb3NlZCBvZiBlaXRoZXIgdGlsZSBpbmRleGVzIG9yIFRpbGUgb2JqZWN0cy4gSWYgeW91IHBhc3MgaW4gYSBUaWxlLFxyXG4gICAgICogYWxsIGF0dHJpYnV0ZXMgd2lsbCBiZSBjb3BpZWQgb3ZlciB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBJZiB5b3UgcGFzcyBpbiBhbiBpbmRleCwgb25seSB0aGVcclxuICAgICAqIGluZGV4IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2lsbCBiZSBjaGFuZ2VkLiBDb2xsaXNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSByZWNhbGN1bGF0ZWRcclxuICAgICAqIHdpdGhpbiB0aGUgcmVnaW9uIHRpbGVzIHdlcmUgY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqIFRoaXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gU3RhdGljVGlsZW1hcExheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3B1dFRpbGVzQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJbXXxpbnRlZ2VyW11bXXxQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfFBoYXNlci5UaWxlbWFwcy5UaWxlW11bXSl9IHRpbGUgLSBBIHJvdyAoYXJyYXkpIG9yIGdyaWQgKDJEIGFycmF5KSBvZiBUaWxlcyBvciB0aWxlIGluZGV4ZXMgdG8gcGxhY2UuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm5zIHRoaXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBwdXRUaWxlc0F0OiBmdW5jdGlvbiAodGlsZXNBcnJheSwgdGlsZVgsIHRpbGVZLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNTdGF0aWNDYWxsKGxheWVyLCAncHV0VGlsZXNBdCcpKSB7IHJldHVybiB0aGlzOyB9XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5QdXRUaWxlc0F0KHRpbGVzQXJyYXksIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSYW5kb21pemVzIHRoZSBpbmRleGVzIG9mIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRpbGVzIChpbiB0aWxlIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlXHJcbiAgICAgKiBzcGVjaWZpZWQgbGF5ZXIuIEVhY2ggdGlsZSB3aWxsIHJlY2VpdmUgYSBuZXcgaW5kZXguIElmIGFuIGFycmF5IG9mIGluZGV4ZXMgaXMgcGFzc2VkIGluLCB0aGVuXHJcbiAgICAgKiB0aG9zZSB3aWxsIGJlIHVzZWQgZm9yIHJhbmRvbWx5IGFzc2lnbmluZyBuZXcgdGlsZSBpbmRleGVzLiBJZiBhbiBhcnJheSBpcyBub3QgcHJvdmlkZWQsIHRoZVxyXG4gICAgICogaW5kZXhlcyBmb3VuZCB3aXRoaW4gdGhlIHJlZ2lvbiAoZXhjbHVkaW5nIC0xKSB3aWxsIGJlIHVzZWQgZm9yIHJhbmRvbWx5IGFzc2lnbmluZyBuZXcgdGlsZVxyXG4gICAgICogaW5kZXhlcy4gVGhpcyBtZXRob2Qgb25seSBtb2RpZmllcyB0aWxlIGluZGV4ZXMgYW5kIGRvZXMgbm90IGNoYW5nZSBjb2xsaXNpb24gaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFN0YXRpY1RpbGVtYXBMYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNyYW5kb21pemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJbXX0gW2luZGV4ZXNdIC0gQW4gYXJyYXkgb2YgaW5kZXhlcyB0byByYW5kb21seSBkcmF3IGZyb20gZHVyaW5nIHJhbmRvbWl6YXRpb24uXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm5zIHRoaXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICByYW5kb21pemU6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGluZGV4ZXMsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc1N0YXRpY0NhbGwobGF5ZXIsICdyYW5kb21pemUnKSkgeyByZXR1cm4gdGhpczsgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuUmFuZG9taXplKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgaW5kZXhlcywgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGludGVyZXN0aW5nIGZhY2VzIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIuIEludGVyZXN0aW5nXHJcbiAgICAgKiBmYWNlcyBhcmUgdXNlZCBpbnRlcm5hbGx5IGZvciBvcHRpbWl6aW5nIGNvbGxpc2lvbnMgYWdhaW5zdCB0aWxlcy4gVGhpcyBtZXRob2QgaXMgbW9zdGx5IHVzZWRcclxuICAgICAqIGludGVybmFsbHkgdG8gb3B0aW1pemUgcmVjYWxjdWxhdGluZyBmYWNlcyB3aGVuIG9ubHkgb25lIHRpbGUgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI2NhbGN1bGF0ZUZhY2VzQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybnMgdGhpcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZUZhY2VzQXQ6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5DYWxjdWxhdGVGYWNlc0F0KHRpbGVYLCB0aWxlWSwgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGludGVyZXN0aW5nIGZhY2VzIHdpdGhpbiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBzcGVjaWZpZWQgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZVxyXG4gICAgICogbGF5ZXIuIEludGVyZXN0aW5nIGZhY2VzIGFyZSB1c2VkIGludGVybmFsbHkgZm9yIG9wdGltaXppbmcgY29sbGlzaW9ucyBhZ2FpbnN0IHRpbGVzLiBUaGlzIG1ldGhvZFxyXG4gICAgICogaXMgbW9zdGx5IHVzZWQgaW50ZXJuYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXAncyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNjYWxjdWxhdGVGYWNlc1dpdGhpblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybnMgdGhpcywgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZUZhY2VzV2l0aGluOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuQ2FsY3VsYXRlRmFjZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIFRpbGVtYXBMYXllciBmcm9tIHRoaXMgVGlsZW1hcCB3aXRob3V0IGRlc3Ryb3lpbmcgaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjcmVtb3ZlTGF5ZXJcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIGJlIHJlbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm5zIHRoaXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVMYXllcjogZnVuY3Rpb24gKGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0TGF5ZXJJbmRleChsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNwbGljZU9uZSh0aGlzLmxheWVycywgaW5kZXgpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPCB0aGlzLmxheWVycy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGF5ZXJzW2ldLnRpbGVtYXBMYXllcilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVyc1tpXS50aWxlbWFwTGF5ZXIubGF5ZXJJbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TGF5ZXJJbmRleCA9PT0gaW5kZXgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExheWVySW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBnaXZlbiBUaWxlbWFwTGF5ZXIgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGlzIFRpbGVtYXAuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjZGVzdHJveUxheWVyXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byBiZSBkZXN0cm95ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm5zIHRoaXMsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBkZXN0cm95TGF5ZXI6IGZ1bmN0aW9uIChsYXllcilcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldExheWVySW5kZXgobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsYXllciA9IHRoaXMubGF5ZXJzW2luZGV4XTtcclxuXHJcbiAgICAgICAgICAgIGxheWVyLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgIFNwbGljZU9uZSh0aGlzLmxheWVycywgaW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExheWVySW5kZXggPT09IGluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXllckluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFsbCBsYXllcnMgZnJvbSB0aGlzIFRpbGVtYXAgYW5kIGRlc3Ryb3lzIGFueSBhc3NvY2lhdGVkIFN0YXRpY1RpbGVtYXBMYXllcnMgb3JcclxuICAgICAqIER5bmFtaWNUaWxlbWFwTGF5ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjcmVtb3ZlQWxsTGF5ZXJzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gVGhpcyBUaWxlbWFwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQWxsTGF5ZXJzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsYXllcnMgPSB0aGlzLmxheWVycztcclxuXHJcbiAgICAgICAgLy8gRGVzdHJveSBhbnkgU3RhdGljVGlsZW1hcExheWVycyBvciBEeW5hbWljVGlsZW1hcExheWVycyB0aGF0IGFyZSBzdG9yZWQgaW4gTGF5ZXJEYXRhXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobGF5ZXJzW2ldLnRpbGVtYXBMYXllcilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXJzW2ldLnRpbGVtYXBMYXllci5kZXN0cm95KGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGF5ZXJzLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudExheWVySW5kZXggPSAwO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBUaWxlLCBvciBhbiBhcnJheSBvZiBUaWxlcywgZnJvbSB0aGUgbGF5ZXIgdG8gd2hpY2ggdGhleSBiZWxvbmcsXHJcbiAgICAgKiBhbmQgb3B0aW9uYWxseSByZWNhbGN1bGF0ZXMgdGhlIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFRpbGVzIHRoYXQgYmVsb25nIHRvIFN0YXRpYyBUaWxlbWFwIExheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3JlbW92ZVRpbGVcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhQaGFzZXIuVGlsZW1hcHMuVGlsZXxQaGFzZXIuVGlsZW1hcHMuVGlsZVtdKX0gdGlsZXMgLSBUaGUgVGlsZSB0byByZW1vdmUsIG9yIGFuIGFycmF5IG9mIFRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcmVwbGFjZUluZGV4PS0xXSAtIEFmdGVyIHJlbW92aW5nIHRoZSBUaWxlLCBpbnNlcnQgYSBicmFuZCBuZXcgVGlsZSBpbnRvIGl0cyBsb2NhdGlvbiB3aXRoIHRoZSBnaXZlbiBpbmRleC4gTGVhdmUgYXMgLTEgdG8ganVzdCByZW1vdmUgdGhlIHRpbGUuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gUmV0dXJucyBhbiBhcnJheSBvZiBUaWxlcyB0aGF0IHdlcmUgcmVtb3ZlZC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGlsZTogZnVuY3Rpb24gKHRpbGVzLCByZXBsYWNlSW5kZXgsIHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlcGxhY2VJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHJlcGxhY2VJbmRleCA9IC0xOyB9XHJcbiAgICAgICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgICAgICB2YXIgcmVtb3ZlZCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGlsZXMpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGlsZXMgPSBbIHRpbGVzIF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGUgPSB0aWxlc1tpXTtcclxuXHJcbiAgICAgICAgICAgIHJlbW92ZWQucHVzaCh0aGlzLnJlbW92ZVRpbGVBdCh0aWxlLngsIHRpbGUueSwgdHJ1ZSwgcmVjYWxjdWxhdGVGYWNlcywgdGlsZS50aWxlbWFwTGF5ZXIpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXBsYWNlSW5kZXggPiAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wdXRUaWxlQXQocmVwbGFjZUluZGV4LCB0aWxlLngsIHRpbGUueSwgcmVjYWxjdWxhdGVGYWNlcywgdGlsZS50aWxlbWFwTGF5ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVtb3ZlZDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSB0aWxlIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIgYW5kIHVwZGF0ZXMgdGhlIGxheWVyJ3NcclxuICAgICAqIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqIFRoaXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gU3RhdGljVGlsZW1hcExheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3JlbW92ZVRpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVwbGFjZVdpdGhOdWxsPXRydWVdIC0gSWYgdHJ1ZSwgdGhpcyB3aWxsIHJlcGxhY2UgdGhlIHRpbGUgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIG51bGwgaW5zdGVhZCBvZiBhIFRpbGUgd2l0aCBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFJldHVybnMgdGhlIFRpbGUgdGhhdCB3YXMgcmVtb3ZlZCwgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVRpbGVBdDogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgcmVwbGFjZVdpdGhOdWxsLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNTdGF0aWNDYWxsKGxheWVyLCAncmVtb3ZlVGlsZUF0JykpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5SZW1vdmVUaWxlQXQodGlsZVgsIHRpbGVZLCByZXBsYWNlV2l0aE51bGwsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSB0aWxlIGF0IHRoZSBnaXZlbiB3b3JsZCBjb29yZGluYXRlcyBpbiB0aGUgc3BlY2lmaWVkIGxheWVyIGFuZCB1cGRhdGVzIHRoZSBsYXllcidzXHJcbiAgICAgKiBjb2xsaXNpb24gaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFN0YXRpY1RpbGVtYXBMYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNyZW1vdmVUaWxlQXRXb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlcGxhY2VXaXRoTnVsbD10cnVlXSAtIElmIHRydWUsIHRoaXMgd2lsbCByZXBsYWNlIHRoZSB0aWxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCBudWxsIGluc3RlYWQgb2YgYSBUaWxlIHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gUmV0dXJucyBhIFRpbGUsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICByZW1vdmVUaWxlQXRXb3JsZFhZOiBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIHJlcGxhY2VXaXRoTnVsbCwgcmVjYWxjdWxhdGVGYWNlcywgY2FtZXJhLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNTdGF0aWNDYWxsKGxheWVyLCAncmVtb3ZlVGlsZUF0V29ybGRYWScpKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuUmVtb3ZlVGlsZUF0V29ybGRYWSh3b3JsZFgsIHdvcmxkWSwgcmVwbGFjZVdpdGhOdWxsLCByZWNhbGN1bGF0ZUZhY2VzLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3cyBhIGRlYnVnIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsYXllciB0byB0aGUgZ2l2ZW4gR3JhcGhpY3MuIFRoaXMgaXMgaGVscGZ1bCB3aGVuIHlvdSB3YW50IHRvXHJcbiAgICAgKiBnZXQgYSBxdWljayBpZGVhIG9mIHdoaWNoIG9mIHlvdXIgdGlsZXMgYXJlIGNvbGxpZGluZyBhbmQgd2hpY2ggaGF2ZSBpbnRlcmVzdGluZyBmYWNlcy4gVGhlIHRpbGVzXHJcbiAgICAgKiBhcmUgZHJhd24gc3RhcnRpbmcgYXQgKDAsIDApIGluIHRoZSBHcmFwaGljcywgYWxsb3dpbmcgeW91IHRvIHBsYWNlIHRoZSBkZWJ1ZyByZXByZXNlbnRhdGlvblxyXG4gICAgICogd2hlcmV2ZXIgeW91IHdhbnQgb24gdGhlIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3JlbmRlckRlYnVnXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3MgLSBUaGUgdGFyZ2V0IEdyYXBoaWNzIG9iamVjdCB0byBkcmF3IHVwb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5TdHlsZUNvbmZpZ30gc3R5bGVDb25maWcgLSBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgY29sb3JzIHRvIHVzZSBmb3IgdGhlIGRlYnVnIGRyYXdpbmcuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm4gdGhpcyBUaWxlbWFwIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckRlYnVnOiBmdW5jdGlvbiAoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuUmVuZGVyRGVidWcoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnLCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgYWxsIGxheWVycyB3aXRoaW4gdGhpcyBUaWxlbWFwIHRvIHRoZSBnaXZlbiBHcmFwaGljcyBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBoZWxwZnVsIHdoZW4geW91IHdhbnQgdG8gZ2V0IGEgcXVpY2sgaWRlYSBvZiB3aGljaCBvZiB5b3VyIHRpbGVzIGFyZSBjb2xsaWRpbmcgYW5kIHdoaWNoXHJcbiAgICAgKiBoYXZlIGludGVyZXN0aW5nIGZhY2VzLiBUaGUgdGlsZXMgYXJlIGRyYXduIHN0YXJ0aW5nIGF0ICgwLCAwKSBpbiB0aGUgR3JhcGhpY3MsIGFsbG93aW5nIHlvdSB0b1xyXG4gICAgICogcGxhY2UgdGhlIGRlYnVnIHJlcHJlc2VudGF0aW9uIHdoZXJldmVyIHlvdSB3YW50IG9uIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNyZW5kZXJEZWJ1Z0Z1bGxcclxuICAgICAqIEBzaW5jZSAzLjE3LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5HYW1lT2JqZWN0cy5HcmFwaGljc30gZ3JhcGhpY3MgLSBUaGUgdGFyZ2V0IEdyYXBoaWNzIG9iamVjdCB0byBkcmF3IHVwb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5TdHlsZUNvbmZpZ30gc3R5bGVDb25maWcgLSBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgY29sb3JzIHRvIHVzZSBmb3IgdGhlIGRlYnVnIGRyYXdpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm4gdGhpcyBUaWxlbWFwIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckRlYnVnRnVsbDogZnVuY3Rpb24gKGdyYXBoaWNzLCBzdHlsZUNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblxyXG4gICAgICAgIC8vIERlc3Ryb3kgYW55IFN0YXRpY1RpbGVtYXBMYXllcnMgb3IgRHluYW1pY1RpbGVtYXBMYXllcnMgdGhhdCBhcmUgc3RvcmVkIGluIExheWVyRGF0YVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuUmVuZGVyRGVidWcoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnLCBsYXllcnNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGdpdmVuIGluIHRpbGUgY29vcmRpbmF0ZXMpIGZvciB0aWxlcyB3aXRoIGFuIGluZGV4IG1hdGNoaW5nXHJcbiAgICAgKiBgZmluZEluZGV4YCBhbmQgdXBkYXRlcyB0aGVpciBpbmRleCB0byBtYXRjaCBgbmV3SW5kZXhgLiBUaGlzIG9ubHkgbW9kaWZpZXMgdGhlIGluZGV4IGFuZCBkb2VzXHJcbiAgICAgKiBub3QgY2hhbmdlIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqIFRoaXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gU3RhdGljVGlsZW1hcExheWVycy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3JlcGxhY2VCeUluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGZpbmRJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byBzZWFyY2ggZm9yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBuZXdJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byByZXBsYWNlIGl0IHdpdGguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gUmV0dXJuIHRoaXMgVGlsZW1hcCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICByZXBsYWNlQnlJbmRleDogZnVuY3Rpb24gKGZpbmRJbmRleCwgbmV3SW5kZXgsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU3RhdGljQ2FsbChsYXllciwgJ3JlcGxhY2VCeUluZGV4JykpIHsgcmV0dXJuIHRoaXM7IH1cclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlJlcGxhY2VCeUluZGV4KGZpbmRJbmRleCwgbmV3SW5kZXgsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiB0aGUgZ2l2ZW4gdGlsZSBvciB0aWxlcyB3aXRoaW4gYSBsYXllciBieSBpbmRleC4gWW91IGNhbiBwYXNzIGluIGVpdGhlciBhXHJcbiAgICAgKiBzaW5nbGUgbnVtZXJpYyBpbmRleCBvciBhbiBhcnJheSBvZiBpbmRleGVzOiBbMiwgMywgMTUsIDIwXS4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGlmXHJcbiAgICAgKiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvciBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcCdzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3NldENvbGxpc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IGluZGV4ZXMgLSBFaXRoZXIgYSBzaW5nbGUgdGlsZSBpbmRleCwgb3IgYW4gYXJyYXkgb2YgdGlsZSBpbmRleGVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZUxheWVyPXRydWVdIC0gSWYgdHJ1ZSwgdXBkYXRlcyB0aGUgY3VycmVudCB0aWxlcyBvbiB0aGUgbGF5ZXIuIFNldCB0byBmYWxzZSBpZiBubyB0aWxlcyBoYXZlIGJlZW4gcGxhY2VkIGZvciBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uOiBmdW5jdGlvbiAoaW5kZXhlcywgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyLCB1cGRhdGVMYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0Q29sbGlzaW9uKGluZGV4ZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllciwgdXBkYXRlTGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiBhIHJhbmdlIG9mIHRpbGVzIGluIGEgbGF5ZXIgd2hvc2UgaW5kZXggaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGBzdGFydGAgYW5kXHJcbiAgICAgKiBgc3RvcGAgKGluY2x1c2l2ZSkuIENhbGxpbmcgdGhpcyB3aXRoIGEgc3RhcnQgdmFsdWUgb2YgMTAgYW5kIGEgc3RvcCB2YWx1ZSBvZiAxNCB3b3VsZCBzZXRcclxuICAgICAqIGNvbGxpc2lvbiBmb3IgdGlsZXMgMTAsIDExLCAxMiwgMTMgYW5kIDE0LiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXIgY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmVcclxuICAgICAqIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjc2V0Q29sbGlzaW9uQmV0d2VlblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzdGFydCAtIFRoZSBmaXJzdCBpbmRleCBvZiB0aGUgdGlsZSB0byBiZSBzZXQgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gc3RvcCAtIFRoZSBsYXN0IGluZGV4IG9mIHRoZSB0aWxlIHRvIGJlIHNldCBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQmV0d2VlbjogZnVuY3Rpb24gKHN0YXJ0LCBzdG9wLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbkJldHdlZW4oc3RhcnQsIHN0b3AsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSB0aWxlcyB3aXRoaW4gYSBsYXllciBieSBjaGVja2luZyB0aWxlIHByb3BlcnRpZXMuIElmIGEgdGlsZSBoYXMgYSBwcm9wZXJ0eVxyXG4gICAgICogdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwcm9wZXJ0aWVzIG9iamVjdCwgaXRzIGNvbGxpc2lvbiBmbGFnIHdpbGwgYmUgc2V0LiBUaGUgYGNvbGxpZGVzYFxyXG4gICAgICogcGFyYW1ldGVyIGNvbnRyb2xzIGlmIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuIFBhc3NpbmcgaW5cclxuICAgICAqIGB7IGNvbGxpZGVzOiB0cnVlIH1gIHdvdWxkIHVwZGF0ZSB0aGUgY29sbGlzaW9uIGZsYWcgb24gYW55IHRpbGVzIHdpdGggYSBcImNvbGxpZGVzXCIgcHJvcGVydHkgdGhhdFxyXG4gICAgICogaGFzIGEgdmFsdWUgb2YgdHJ1ZS4gQW55IHRpbGUgdGhhdCBkb2Vzbid0IGhhdmUgXCJjb2xsaWRlc1wiIHNldCB0byB0cnVlIHdpbGwgYmUgaWdub3JlZC4gWW91IGNhblxyXG4gICAgICogYWxzbyB1c2UgYW4gYXJyYXkgb2YgdmFsdWVzLCBlLmcuIGB7IHR5cGVzOiBbXCJzdG9uZVwiLCBcImxhdmFcIiwgXCJzYW5kXCIgXSB9YC4gSWYgYSB0aWxlIGhhcyBhXHJcbiAgICAgKiBcInR5cGVzXCIgcHJvcGVydHkgdGhhdCBtYXRjaGVzIGFueSBvZiB0aG9zZSB2YWx1ZXMsIGl0cyBjb2xsaXNpb24gZmxhZyB3aWxsIGJlIHVwZGF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjc2V0Q29sbGlzaW9uQnlQcm9wZXJ0eVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHByb3BlcnRpZXMgLSBBbiBvYmplY3Qgd2l0aCB0aWxlIHByb3BlcnRpZXMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gUmV0dXJuIHRoaXMgVGlsZW1hcCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaXNpb25CeVByb3BlcnR5OiBmdW5jdGlvbiAocHJvcGVydGllcywgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRDb2xsaXNpb25CeVByb3BlcnR5KHByb3BlcnRpZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIGFsbCB0aWxlcyBpbiB0aGUgZ2l2ZW4gbGF5ZXIsIGV4Y2VwdCBmb3IgdGlsZXMgdGhhdCBoYXZlIGFuIGluZGV4IHNwZWNpZmllZCBpblxyXG4gICAgICogdGhlIGdpdmVuIGFycmF5LiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXIgY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmUgZW5hYmxlZCAodHJ1ZSkgb3JcclxuICAgICAqIGRpc2FibGVkIChmYWxzZSkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjc2V0Q29sbGlzaW9uQnlFeGNsdXNpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcltdfSBpbmRleGVzIC0gQW4gYXJyYXkgb2YgdGhlIHRpbGUgaW5kZXhlcyB0byBub3QgYmUgY291bnRlZCBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQnlFeGNsdXNpb246IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbkJ5RXhjbHVzaW9uKGluZGV4ZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSB0aWxlcyB3aXRoaW4gYSBsYXllciBieSBjaGVja2luZyBlYWNoIHRpbGUncyBjb2xsaXNpb24gZ3JvdXAgZGF0YVxyXG4gICAgICogKHR5cGljYWxseSBkZWZpbmVkIGluIFRpbGVkIHdpdGhpbiB0aGUgdGlsZXNldCBjb2xsaXNpb24gZWRpdG9yKS4gSWYgYW55IG9iamVjdHMgYXJlIGZvdW5kIHdpdGhpblxyXG4gICAgICogYSB0aWxlJ3MgY29sbGlzaW9uIGdyb3VwLCB0aGUgdGlsZSdzIGNvbGxpZGluZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNldC4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyXHJcbiAgICAgKiBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvciBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcCdzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3NldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwOiBmdW5jdGlvbiAoY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRDb2xsaXNpb25Gcm9tQ29sbGlzaW9uR3JvdXAoY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIGxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGdsb2JhbCBjb2xsaXNpb24gY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0aWxlIGluZGV4IHdpdGhpbiB0aGUgbGF5ZXIuIFRoaXMgd2lsbCBhZmZlY3QgYWxsXHJcbiAgICAgKiB0aWxlcyBvbiB0aGlzIGxheWVyIHRoYXQgaGF2ZSB0aGUgc2FtZSBpbmRleC4gSWYgYSBjYWxsYmFjayBpcyBhbHJlYWR5IHNldCBmb3IgdGhlIHRpbGUgaW5kZXggaXRcclxuICAgICAqIHdpbGwgYmUgcmVwbGFjZWQuIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byByZW1vdmUgaXQuIElmIHlvdSB3YW50IHRvIHNldCBhIGNhbGxiYWNrIGZvciBhIHRpbGVcclxuICAgICAqIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24gb24gdGhlIG1hcCB0aGVuIHNlZSBzZXRUaWxlTG9jYXRpb25DYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXAncyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNzZXRUaWxlSW5kZXhDYWxsYmFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IGluZGV4ZXMgLSBFaXRoZXIgYSBzaW5nbGUgdGlsZSBpbmRleCwgb3IgYW4gYXJyYXkgb2YgdGlsZSBpbmRleGVzIHRvIGhhdmUgYSBjb2xsaXNpb24gY2FsbGJhY2sgc2V0IGZvci5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHRpbGUgaXMgY29sbGlkZWQgd2l0aC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gUmV0dXJuIHRoaXMgVGlsZW1hcCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlSW5kZXhDYWxsYmFjazogZnVuY3Rpb24gKGluZGV4ZXMsIGNhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRUaWxlSW5kZXhDYWxsYmFjayhpbmRleGVzLCBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCBsYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBjb2xsaXNpb24gY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlIGxheWVyLlxyXG4gICAgICogSWYgYSBjYWxsYmFjayBpcyBhbHJlYWR5IHNldCBmb3IgdGhlIHRpbGUgaW5kZXggaXQgd2lsbCBiZSByZXBsYWNlZC4gU2V0IHRoZSBjYWxsYmFjayB0byBudWxsIHRvXHJcbiAgICAgKiByZW1vdmUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjc2V0VGlsZUxvY2F0aW9uQ2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB0aWxlIGlzIGNvbGxpZGVkIHdpdGguXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gUmV0dXJuIHRoaXMgVGlsZW1hcCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlTG9jYXRpb25DYWxsYmFjazogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldFRpbGVMb2NhdGlvbkNhbGxiYWNrKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGxheWVyIHRvIHRoZSBMYXllckRhdGEgYXNzb2NpYXRlZCB3aXRoIGBsYXllcmAuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNzZXRMYXllclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgbmFtZSBvZiB0aGVcclxuICAgICAqIGxheWVyIGZyb20gVGlsZWQsIHRoZSBpbmRleCBvZiB0aGUgbGF5ZXIgaW4gdGhlIG1hcCwgYSBEeW5hbWljVGlsZW1hcExheWVyIG9yIGFcclxuICAgICAqIFN0YXRpY1RpbGVtYXBMYXllci4gSWYgbm90IGdpdmVuIHdpbGwgZGVmYXVsdCB0byB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gVGhpcyBUaWxlbWFwIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0TGF5ZXI6IGZ1bmN0aW9uIChsYXllcilcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmdldExheWVySW5kZXgobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXllckluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBiYXNlIHRpbGUgc2l6ZSBmb3IgdGhlIG1hcC4gTm90ZTogdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgdGlsZVdpZHRoIGFuZFxyXG4gICAgICogdGlsZUhlaWdodCBmb3IgYWxsIGxheWVycy4gVGhpcyBhbHNvIHVwZGF0ZXMgdGhlIGJhc2Ugc2l6ZSBvbiBhbGwgdGlsZXMgYWNyb3NzIGFsbCBsYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNzZXRCYXNlVGlsZVNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0aWxlcyB0aGUgbWFwIHVzZXMgZm9yIGNhbGN1bGF0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZUhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRpbGVzIHRoZSBtYXAgdXNlcyBmb3IgY2FsY3VsYXRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBUaGlzIFRpbGVtYXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRCYXNlVGlsZVNpemU6IGZ1bmN0aW9uICh0aWxlV2lkdGgsIHRpbGVIZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aWxlV2lkdGggPSB0aWxlV2lkdGg7XHJcbiAgICAgICAgdGhpcy50aWxlSGVpZ2h0ID0gdGlsZUhlaWdodDtcclxuICAgICAgICB0aGlzLndpZHRoSW5QaXhlbHMgPSB0aGlzLndpZHRoICogdGlsZVdpZHRoO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0SW5QaXhlbHMgPSB0aGlzLmhlaWdodCAqIHRpbGVIZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYmFzZSB0aWxlIHNpemUgb24gYWxsIGxheWVycyAmIHRpbGVzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxheWVycy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzW2ldLmJhc2VUaWxlV2lkdGggPSB0aWxlV2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzW2ldLmJhc2VUaWxlSGVpZ2h0ID0gdGlsZUhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIHZhciBtYXBEYXRhID0gdGhpcy5sYXllcnNbaV0uZGF0YTtcclxuICAgICAgICAgICAgdmFyIG1hcFdpZHRoID0gdGhpcy5sYXllcnNbaV0ud2lkdGg7XHJcbiAgICAgICAgICAgIHZhciBtYXBIZWlnaHQgPSB0aGlzLmxheWVyc1tpXS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBtYXBIZWlnaHQ7IHJvdysrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBtYXBXaWR0aDsgY29sKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbGUgPSBtYXBEYXRhW3Jvd11bY29sXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlLnNldFNpemUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aWxlIHNpemUgZm9yIGEgc3BlY2lmaWMgYGxheWVyYC4gTm90ZTogdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgbWFwJ3NcclxuICAgICAqIHRpbGVXaWR0aCBhbmQgdGlsZUhlaWdodCBmb3IgYWxsIGxheWVycy4gVGhpcyB3aWxsIHNldCB0aGUgdGlsZSBzaXplIGZvciB0aGUgbGF5ZXIgYW5kIGFueVxyXG4gICAgICogdGlsZXMgdGhlIGxheWVyIGhhcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3NldExheWVyVGlsZVNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0aWxlcyAoaW4gcGl4ZWxzKSBpbiB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVIZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0aWxlcyAoaW4gcGl4ZWxzKSBpbiB0aGUgbGF5ZXIuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSBuYW1lIG9mIHRoZVxyXG4gICAgICogbGF5ZXIgZnJvbSBUaWxlZCwgdGhlIGluZGV4IG9mIHRoZSBsYXllciBpbiB0aGUgbWFwLCBhIER5bmFtaWNUaWxlbWFwTGF5ZXIgb3IgYVxyXG4gICAgICogU3RhdGljVGlsZW1hcExheWVyLiBJZiBub3QgZ2l2ZW4gd2lsbCBkZWZhdWx0IHRvIHRoZSBtYXAncyBjdXJyZW50IGxheWVyIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBUaGlzIFRpbGVtYXAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRMYXllclRpbGVTaXplOiBmdW5jdGlvbiAodGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIHRoaXM7IH1cclxuXHJcbiAgICAgICAgbGF5ZXIudGlsZVdpZHRoID0gdGlsZVdpZHRoO1xyXG4gICAgICAgIGxheWVyLnRpbGVIZWlnaHQgPSB0aWxlSGVpZ2h0O1xyXG5cclxuICAgICAgICB2YXIgbWFwRGF0YSA9IGxheWVyLmRhdGE7XHJcbiAgICAgICAgdmFyIG1hcFdpZHRoID0gbGF5ZXIud2lkdGg7XHJcbiAgICAgICAgdmFyIG1hcEhlaWdodCA9IGxheWVyLmhlaWdodDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbWFwSGVpZ2h0OyByb3crKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG1hcFdpZHRoOyBjb2wrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbGUgPSBtYXBEYXRhW3Jvd11bY29sXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZSAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlLnNldFNpemUodGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIHRpbGVzIGluIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIChzcGVjaWZpZWQgaW4gdGlsZSBjb29yZGluYXRlcykgd2l0aGluIHRoZSBnaXZlblxyXG4gICAgICogbGF5ZXIuIEl0IHdpbGwgb25seSByYW5kb21pemUgdGhlIHRpbGVzIGluIHRoYXQgYXJlYSwgc28gaWYgdGhleSdyZSBhbGwgdGhlIHNhbWUgbm90aGluZyB3aWxsXHJcbiAgICAgKiBhcHBlYXIgdG8gaGF2ZSBjaGFuZ2VkISBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRpbGUgaW5kZXhlcyBhbmQgZG9lcyBub3QgY2hhbmdlIGNvbGxpc2lvblxyXG4gICAgICogaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIFN0YXRpY1RpbGVtYXBMYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNzaHVmZmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZW1hcH0gUmV0dXJuIHRoaXMgVGlsZW1hcCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBzaHVmZmxlOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNTdGF0aWNDYWxsKGxheWVyLCAnc2h1ZmZsZScpKSB7IHJldHVybiB0aGlzOyB9XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TaHVmZmxlKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoZ2l2ZW4gaW4gdGlsZSBjb29yZGluYXRlcykgZm9yIHRpbGVzIHdpdGggYW4gaW5kZXggbWF0Y2hpbmdcclxuICAgICAqIGBpbmRleEFgIGFuZCBzd2FwcyB0aGVuIHdpdGggYGluZGV4QmAuIFRoaXMgb25seSBtb2RpZmllcyB0aGUgaW5kZXggYW5kIGRvZXMgbm90IGNoYW5nZSBjb2xsaXNpb25cclxuICAgICAqIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICogVGhpcyBjYW5ub3QgYmUgYXBwbGllZCB0byBTdGF0aWNUaWxlbWFwTGF5ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjc3dhcEJ5SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZUEgLSBGaXJzdCB0aWxlIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlQiAtIFNlY29uZCB0aWxlIGluZGV4LlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc3dhcEJ5SW5kZXg6IGZ1bmN0aW9uIChpbmRleEEsIGluZGV4QiwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNTdGF0aWNDYWxsKGxheWVyLCAnc3dhcEJ5SW5kZXgnKSkgeyByZXR1cm4gdGhpczsgfVxyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU3dhcEJ5SW5kZXgoaW5kZXhBLCBpbmRleEIsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHRpbGUgWCBjb29yZGluYXRlcyAodGlsZSB1bml0cykgdG8gd29ybGQgWCBjb29yZGluYXRlcyAocGl4ZWxzKSwgZmFjdG9yaW5nIGluIHRoZVxyXG4gICAgICogbGF5ZXJzIHBvc2l0aW9uLCBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjdGlsZVRvV29ybGRYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9IFtsYXllcl0gLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJldHVybnMgYSBudW1iZXIsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICB0aWxlVG9Xb3JsZFg6IGZ1bmN0aW9uICh0aWxlWCwgY2FtZXJhLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlRpbGVUb1dvcmxkWCh0aWxlWCwgY2FtZXJhLCBsYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgZnJvbSB0aWxlIFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpIHRvIHdvcmxkIFkgY29vcmRpbmF0ZXMgKHBpeGVscyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBsYXllciBzcGVjaWZpZWQsIHRoZSBtYXBzIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlbWFwI3RpbGVUb1dvcmxkWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXJcclxuICAgICAqIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P251bWJlcn0gUmV0dXJucyBhIG51bWJlciwgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIHRpbGVUb1dvcmxkWTogZnVuY3Rpb24gKHRpbGVYLCBjYW1lcmEsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuVGlsZVRvV29ybGRZKHRpbGVYLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHRpbGUgWFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpIHRvIHdvcmxkIFhZIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgVmVjdG9yMiBvYmplY3Qgb3IgdXBkYXRlIHRoZSBnaXZlblxyXG4gICAgICogYHBvaW50YCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCN0aWxlVG9Xb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwb2ludF0gLSBBIFZlY3RvcjIgdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzIGluLiBJZiBub3QgZ2l2ZW4gYSBuZXcgVmVjdG9yMiBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLk1hdGguVmVjdG9yMn0gUmV0dXJucyBhIHBvaW50LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgdGlsZVRvV29ybGRYWTogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgcG9pbnQsIGNhbWVyYSwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5UaWxlVG9Xb3JsZFhZKHRpbGVYLCB0aWxlWSwgcG9pbnQsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJhbmRvbWl6ZXMgdGhlIGluZGV4ZXMgb2YgYSByZWN0YW5ndWxhciByZWdpb24gb2YgdGlsZXMgKGluIHRpbGUgY29vcmRpbmF0ZXMpIHdpdGhpbiB0aGVcclxuICAgICAqIHNwZWNpZmllZCBsYXllci4gRWFjaCB0aWxlIHdpbGwgcmVjZWl2ZSBhIG5ldyBpbmRleC4gTmV3IGluZGV4ZXMgYXJlIGRyYXduIGZyb20gdGhlIGdpdmVuXHJcbiAgICAgKiB3ZWlnaHRlZEluZGV4ZXMgYXJyYXkuIEFuIGV4YW1wbGUgd2VpZ2h0ZWQgYXJyYXk6XHJcbiAgICAgKlxyXG4gICAgICogW1xyXG4gICAgICogIHsgaW5kZXg6IDYsIHdlaWdodDogNCB9LCAgICAvLyBQcm9iYWJpbGl0eSBvZiBpbmRleCA2IGlzIDQgLyA4XHJcbiAgICAgKiAgeyBpbmRleDogNywgd2VpZ2h0OiAyIH0sICAgIC8vIFByb2JhYmlsaXR5IG9mIGluZGV4IDcgd291bGQgYmUgMiAvIDhcclxuICAgICAqICB7IGluZGV4OiA4LCB3ZWlnaHQ6IDEuNSB9LCAgLy8gUHJvYmFiaWxpdHkgb2YgaW5kZXggOCB3b3VsZCBiZSAxLjUgLyA4XHJcbiAgICAgKiAgeyBpbmRleDogMjYsIHdlaWdodDogMC41IH0gIC8vIFByb2JhYmlsaXR5IG9mIGluZGV4IDI3IHdvdWxkIGJlIDAuNSAvIDhcclxuICAgICAqIF1cclxuICAgICAqXHJcbiAgICAgKiBUaGUgcHJvYmFiaWxpdHkgb2YgYW55IGluZGV4IGJlaW5nIGNob29zZSBpcyAodGhlIGluZGV4J3Mgd2VpZ2h0KSAvIChzdW0gb2YgYWxsIHdlaWdodHMpLiBUaGlzXHJcbiAgICAgKiBtZXRob2Qgb25seSBtb2RpZmllcyB0aWxlIGluZGV4ZXMgYW5kIGRvZXMgbm90IGNoYW5nZSBjb2xsaXNpb24gaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLiBUaGlzXHJcbiAgICAgKiBjYW5ub3QgYmUgYXBwbGllZCB0byBTdGF0aWNUaWxlbWFwTGF5ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjd2VpZ2h0ZWRSYW5kb21pemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBbd2VpZ2h0ZWRJbmRleGVzXSAtIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcmFuZG9tbHkgZHJhdyBmcm9tIGR1cmluZ1xyXG4gICAgICogcmFuZG9taXphdGlvbi4gVGhleSBzaG91bGQgYmUgaW4gdGhlIGZvcm06IHsgaW5kZXg6IDAsIHdlaWdodDogNCB9IG9yXHJcbiAgICAgKiB7IGluZGV4OiBbMCwgMV0sIHdlaWdodDogNCB9IGlmIHlvdSB3aXNoIHRvIGRyYXcgZnJvbSBtdWx0aXBsZSB0aWxlIGluZGV4ZXMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZSBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSBSZXR1cm4gdGhpcyBUaWxlbWFwIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGF5ZXIgZ2l2ZW4gd2FzIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIHdlaWdodGVkUmFuZG9taXplOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCB3ZWlnaHRlZEluZGV4ZXMsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc1N0YXRpY0NhbGwobGF5ZXIsICd3ZWlnaHRlZFJhbmRvbWl6ZScpKSB7IHJldHVybiB0aGlzOyB9XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5XZWlnaHRlZFJhbmRvbWl6ZSh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHdlaWdodGVkSW5kZXhlcywgbGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHdvcmxkIFggY29vcmRpbmF0ZXMgKHBpeGVscykgdG8gdGlsZSBYIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSwgZmFjdG9yaW5nIGluIHRoZVxyXG4gICAgICogbGF5ZXJzIHBvc2l0aW9uLCBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIElmIG5vIGxheWVyIHNwZWNpZmllZCwgdGhlIG1hcHMgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVtYXAjd29ybGRUb1RpbGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHggY29vcmRpbmF0ZSB0byBiZSBjb252ZXJ0ZWQsIGluIHBpeGVscywgbm90IHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8aW50ZWdlcnxQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcnxQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyKX0gW2xheWVyXSAtIFRoZSB0aWxlIGxheWVyXHJcbiAgICAgKiB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJldHVybnMgYSBudW1iZXIsIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICB3b3JsZFRvVGlsZVg6IGZ1bmN0aW9uICh3b3JsZFgsIHNuYXBUb0Zsb29yLCBjYW1lcmEsIGxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChsYXllciA9PT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuV29ybGRUb1RpbGVYKHdvcmxkWCwgc25hcFRvRmxvb3IsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gd29ybGQgWSBjb29yZGluYXRlcyAocGl4ZWxzKSB0byB0aWxlIFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCN3b3JsZFRvVGlsZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzbmFwVG9GbG9vcj10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJvdW5kIHRoZSB0aWxlIGNvb3JkaW5hdGUgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBSZXR1cm5zIGEgbnVtYmVyLCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgd29ybGRUb1RpbGVZOiBmdW5jdGlvbiAod29ybGRZLCBzbmFwVG9GbG9vciwgY2FtZXJhLCBsYXllcilcclxuICAgIHtcclxuICAgICAgICBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIpO1xyXG5cclxuICAgICAgICBpZiAobGF5ZXIgPT09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLldvcmxkVG9UaWxlWSh3b3JsZFksIHNuYXBUb0Zsb29yLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHdvcmxkIFhZIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgVmVjdG9yMiBvYmplY3Qgb3IgdXBkYXRlIHRoZSBnaXZlblxyXG4gICAgICogYHBvaW50YCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwcyBjdXJyZW50IGxheWVyIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCN3b3JsZFRvVGlsZVhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHggY29vcmRpbmF0ZSB0byBiZSBjb252ZXJ0ZWQsIGluIHBpeGVscywgbm90IHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gYmUgY29udmVydGVkLCBpbiBwaXhlbHMsIG5vdCB0aWxlcy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NuYXBUb0Zsb29yPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcm91bmQgdGhlIHRpbGUgY29vcmRpbmF0ZSBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwb2ludF0gLSBBIFZlY3RvcjIgdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzIGluLiBJZiBub3QgZ2l2ZW4gYSBuZXcgVmVjdG9yMiBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIpfSBbbGF5ZXJdIC0gVGhlIHRpbGUgbGF5ZXIgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgbGF5ZXIgaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLk1hdGguVmVjdG9yMn0gUmV0dXJucyBhIHBvaW50LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgd29ybGRUb1RpbGVYWTogZnVuY3Rpb24gKHdvcmxkWCwgd29ybGRZLCBzbmFwVG9GbG9vciwgcG9pbnQsIGNhbWVyYSwgbGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVyKTtcclxuXHJcbiAgICAgICAgaWYgKGxheWVyID09PSBudWxsKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5Xb3JsZFRvVGlsZVhZKHdvcmxkWCwgd29ybGRZLCBzbmFwVG9GbG9vciwgcG9pbnQsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgaW50ZXJuYWxseSB0byBjaGVjayBpZiBhIGxheWVyIGlzIHN0YXRpYyBhbmQgcHJpbnRzIG91dCBhIHdhcm5pbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZW1hcCNfaXNTdGF0aWNDYWxsXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgX2lzU3RhdGljQ2FsbDogZnVuY3Rpb24gKGxheWVyLCBmdW5jdGlvbk5hbWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGxheWVyLnRpbGVtYXBMYXllciBpbnN0YW5jZW9mIFN0YXRpY1RpbGVtYXBMYXllcilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihmdW5jdGlvbk5hbWUgKyAnOiBZb3UgY2Fubm90IGNoYW5nZSB0aGUgdGlsZXMgaW4gYSBzdGF0aWMgdGlsZW1hcCBsYXllcicpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaWxlbWFwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHYW1lT2JqZWN0Q3JlYXRvciA9IHJlcXVpcmUoJy4uL2dhbWVvYmplY3RzL0dhbWVPYmplY3RDcmVhdG9yJyk7XHJcbnZhciBQYXJzZVRvVGlsZW1hcCA9IHJlcXVpcmUoJy4vUGFyc2VUb1RpbGVtYXAnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgVGlsZW1hcCBmcm9tIHRoZSBnaXZlbiBrZXkgb3IgZGF0YSwgb3IgY3JlYXRlcyBhIGJsYW5rIFRpbGVtYXAgaWYgbm8ga2V5L2RhdGEgcHJvdmlkZWQuXHJcbiAqIFdoZW4gbG9hZGluZyBmcm9tIENTViBvciBhIDJEIGFycmF5LCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIHRpbGVXaWR0aCAmIHRpbGVIZWlnaHQuIFdoZW4gcGFyc2luZ1xyXG4gKiBmcm9tIGEgbWFwIGZyb20gVGlsZWQsIHRoZSB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHdpZHRoICYgaGVpZ2h0IHdpbGwgYmUgcHVsbGVkIGZyb20gdGhlIG1hcFxyXG4gKiBkYXRhLiBGb3IgYW4gZW1wdHkgbWFwLCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCB3aWR0aCAmIGhlaWdodC5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuR2FtZU9iamVjdHMuR2FtZU9iamVjdENyZWF0b3IjdGlsZW1hcFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLlRpbGVtYXBDb25maWd9IFtjb25maWddIC0gVGhlIGNvbmZpZyBvcHRpb25zIGZvciB0aGUgVGlsZW1hcC5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfVxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ3RpbGVtYXAnLCBmdW5jdGlvbiAoY29uZmlnKVxyXG57XHJcbiAgICAvLyBEZWZhdWx0cyBhcmUgYXBwbGllZCBpbiBQYXJzZVRvVGlsZW1hcFxyXG4gICAgdmFyIGMgPSAoY29uZmlnICE9PSB1bmRlZmluZWQpID8gY29uZmlnIDoge307XHJcblxyXG4gICAgcmV0dXJuIFBhcnNlVG9UaWxlbWFwKFxyXG4gICAgICAgIHRoaXMuc2NlbmUsXHJcbiAgICAgICAgYy5rZXksXHJcbiAgICAgICAgYy50aWxlV2lkdGgsXHJcbiAgICAgICAgYy50aWxlSGVpZ2h0LFxyXG4gICAgICAgIGMud2lkdGgsXHJcbiAgICAgICAgYy5oZWlnaHQsXHJcbiAgICAgICAgYy5kYXRhLFxyXG4gICAgICAgIGMuaW5zZXJ0TnVsbFxyXG4gICAgKTtcclxufSk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdhbWVPYmplY3RGYWN0b3J5ID0gcmVxdWlyZSgnLi4vZ2FtZW9iamVjdHMvR2FtZU9iamVjdEZhY3RvcnknKTtcclxudmFyIFBhcnNlVG9UaWxlbWFwID0gcmVxdWlyZSgnLi9QYXJzZVRvVGlsZW1hcCcpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBUaWxlbWFwIGZyb20gdGhlIGdpdmVuIGtleSBvciBkYXRhLCBvciBjcmVhdGVzIGEgYmxhbmsgVGlsZW1hcCBpZiBubyBrZXkvZGF0YSBwcm92aWRlZC5cclxuICogV2hlbiBsb2FkaW5nIGZyb20gQ1NWIG9yIGEgMkQgYXJyYXksIHlvdSBzaG91bGQgc3BlY2lmeSB0aGUgdGlsZVdpZHRoICYgdGlsZUhlaWdodC4gV2hlbiBwYXJzaW5nXHJcbiAqIGZyb20gYSBtYXAgZnJvbSBUaWxlZCwgdGhlIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgd2lkdGggJiBoZWlnaHQgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgbWFwXHJcbiAqIGRhdGEuIEZvciBhbiBlbXB0eSBtYXAsIHlvdSBzaG91bGQgc3BlY2lmeSB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHdpZHRoICYgaGVpZ2h0LlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5HYW1lT2JqZWN0cy5HYW1lT2JqZWN0RmFjdG9yeSN0aWxlbWFwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gLSBUaGUga2V5IGluIHRoZSBQaGFzZXIgY2FjaGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9hZGVkIHRpbGVtYXAgZGF0YS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVdpZHRoPTMyXSAtIFRoZSB3aWR0aCBvZiBhIHRpbGUgaW4gcGl4ZWxzLiBQYXNzIGluIGBudWxsYCB0byBsZWF2ZSBhcyB0aGVcclxuICogZGVmYXVsdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZUhlaWdodD0zMl0gLSBUaGUgaGVpZ2h0IG9mIGEgdGlsZSBpbiBwaXhlbHMuIFBhc3MgaW4gYG51bGxgIHRvIGxlYXZlIGFzIHRoZVxyXG4gKiBkZWZhdWx0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD0xMF0gLSBUaGUgd2lkdGggb2YgdGhlIG1hcCBpbiB0aWxlcy4gUGFzcyBpbiBgbnVsbGAgdG8gbGVhdmUgYXMgdGhlXHJcbiAqIGRlZmF1bHQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD0xMF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBtYXAgaW4gdGlsZXMuIFBhc3MgaW4gYG51bGxgIHRvIGxlYXZlIGFzIHRoZVxyXG4gKiBkZWZhdWx0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJbXVtdfSBbZGF0YV0gLSBJbnN0ZWFkIG9mIGxvYWRpbmcgZnJvbSB0aGUgY2FjaGUsIHlvdSBjYW4gYWxzbyBsb2FkIGRpcmVjdGx5IGZyb21cclxuICogYSAyRCBhcnJheSBvZiB0aWxlIGluZGV4ZXMuIFBhc3MgaW4gYG51bGxgIGZvciBubyBkYXRhLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnNlcnROdWxsPWZhbHNlXSAtIENvbnRyb2xzIGhvdyBlbXB0eSB0aWxlcywgdGlsZXMgd2l0aCBhbiBpbmRleCBvZiAtMSwgaW4gdGhlXHJcbiAqIG1hcCBkYXRhIGFyZSBoYW5kbGVkLiBJZiBgdHJ1ZWAsIGVtcHR5IGxvY2F0aW9ucyB3aWxsIGdldCBhIHZhbHVlIG9mIGBudWxsYC4gSWYgYGZhbHNlYCwgZW1wdHlcclxuICogbG9jYXRpb24gd2lsbCBnZXQgYSBUaWxlIG9iamVjdCB3aXRoIGFuIGluZGV4IG9mIC0xLiBJZiB5b3UndmUgYSBsYXJnZSBzcGFyc2VseSBwb3B1bGF0ZWQgbWFwIGFuZFxyXG4gKiB0aGUgdGlsZSBkYXRhIGRvZXNuJ3QgbmVlZCB0byBjaGFuZ2UgdGhlbiBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gYHRydWVgIHdpbGwgaGVscCB3aXRoIG1lbW9yeVxyXG4gKiBjb25zdW1wdGlvbi4gSG93ZXZlciBpZiB5b3VyIG1hcCBpcyBzbWFsbCBvciB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIHRpbGVzIGR5bmFtaWNhbGx5LCB0aGVuIGxlYXZlXHJcbiAqIHRoZSBkZWZhdWx0IHZhbHVlIHNldC5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfVxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3RpbGVtYXAnLCBmdW5jdGlvbiAoa2V5LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGRhdGEsIGluc2VydE51bGwpXHJcbntcclxuICAgIC8vIEFsbG93IHVzZXJzIHRvIHNwZWNpZnkgbnVsbCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZSwgc2luY2UgbnVsbCBpc1xyXG4gICAgLy8gc2hvcnRlciAmIG1vcmUgbGVnaWJsZSB0aGFuIHVuZGVmaW5lZC4gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZCB0byBhbGxvdyBQYXJzZVRvVGlsZW1hcFxyXG4gICAgLy8gZGVmYXVsdHMgdG8gdGFrZSBlZmZlY3QuXHJcblxyXG4gICAgaWYgKGtleSA9PT0gbnVsbCkgeyBrZXkgPSB1bmRlZmluZWQ7IH1cclxuICAgIGlmICh0aWxlV2lkdGggPT09IG51bGwpIHsgdGlsZVdpZHRoID0gdW5kZWZpbmVkOyB9XHJcbiAgICBpZiAodGlsZUhlaWdodCA9PT0gbnVsbCkgeyB0aWxlSGVpZ2h0ID0gdW5kZWZpbmVkOyB9XHJcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHsgd2lkdGggPSB1bmRlZmluZWQ7IH1cclxuICAgIGlmIChoZWlnaHQgPT09IG51bGwpIHsgaGVpZ2h0ID0gdW5kZWZpbmVkOyB9XHJcblxyXG4gICAgcmV0dXJuIFBhcnNlVG9UaWxlbWFwKHRoaXMuc2NlbmUsIGtleSwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBkYXRhLCBpbnNlcnROdWxsKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFRpbGVzZXQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBpbWFnZSBjb250YWluaW5nIHRoZSB0aWxlcyBhbmQgYSBjb250YWluZXIgZm9yIGRhdGEgYWJvdXRcclxuICogZWFjaCB0aWxlLlxyXG4gKlxyXG4gKiBAY2xhc3MgVGlsZXNldFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRpbGVtYXBzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGlsZXNldCBpbiB0aGUgbWFwIGRhdGEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZmlyc3RnaWQgLSBUaGUgZmlyc3QgdGlsZSBpbmRleCB0aGlzIHRpbGVzZXQgY29udGFpbnMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVXaWR0aD0zMl0gLSBXaWR0aCBvZiBlYWNoIHRpbGUgKGluIHBpeGVscykuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVIZWlnaHQ9MzJdIC0gSGVpZ2h0IG9mIGVhY2ggdGlsZSAoaW4gcGl4ZWxzKS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZU1hcmdpbj0wXSAtIFRoZSBtYXJnaW4gYXJvdW5kIGFsbCB0aWxlcyBpbiB0aGUgc2hlZXQgKGluIHBpeGVscykuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVTcGFjaW5nPTBdIC0gVGhlIHNwYWNpbmcgYmV0d2VlbiBlYWNoIHRpbGUgaW4gdGhlIHNoZWV0IChpbiBwaXhlbHMpLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW3RpbGVQcm9wZXJ0aWVzPXt9XSAtIEN1c3RvbSBwcm9wZXJ0aWVzIGRlZmluZWQgcGVyIHRpbGUgaW4gdGhlIFRpbGVzZXQuXHJcbiAqIFRoZXNlIHR5cGljYWxseSBhcmUgY3VzdG9tIHByb3BlcnRpZXMgY3JlYXRlZCBpbiBUaWxlZCB3aGVuIGVkaXRpbmcgYSB0aWxlc2V0LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW3RpbGVEYXRhPXt9XSAtIERhdGEgc3RvcmVkIHBlciB0aWxlLiBUaGVzZSB0eXBpY2FsbHkgYXJlIGNyZWF0ZWQgaW4gVGlsZWRcclxuICogd2hlbiBlZGl0aW5nIGEgdGlsZXNldCwgZS5nLiBmcm9tIFRpbGVkJ3MgdGlsZSBjb2xsaXNpb24gZWRpdG9yIG9yIHRlcnJhaW4gZWRpdG9yLlxyXG4gKi9cclxudmFyIFRpbGVzZXQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVGlsZXNldCAobmFtZSwgZmlyc3RnaWQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgdGlsZU1hcmdpbiwgdGlsZVNwYWNpbmcsIHRpbGVQcm9wZXJ0aWVzLCB0aWxlRGF0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZVdpZHRoID09PSB1bmRlZmluZWQgfHwgdGlsZVdpZHRoIDw9IDApIHsgdGlsZVdpZHRoID0gMzI7IH1cclxuICAgICAgICBpZiAodGlsZUhlaWdodCA9PT0gdW5kZWZpbmVkIHx8IHRpbGVIZWlnaHQgPD0gMCkgeyB0aWxlSGVpZ2h0ID0gMzI7IH1cclxuICAgICAgICBpZiAodGlsZU1hcmdpbiA9PT0gdW5kZWZpbmVkKSB7IHRpbGVNYXJnaW4gPSAwOyB9XHJcbiAgICAgICAgaWYgKHRpbGVTcGFjaW5nID09PSB1bmRlZmluZWQpIHsgdGlsZVNwYWNpbmcgPSAwOyB9XHJcbiAgICAgICAgaWYgKHRpbGVQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQpIHsgdGlsZVByb3BlcnRpZXMgPSB7fTsgfVxyXG4gICAgICAgIGlmICh0aWxlRGF0YSA9PT0gdW5kZWZpbmVkKSB7IHRpbGVEYXRhID0ge307IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIFRpbGVzZXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCNuYW1lXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIGZpcnN0IHRpbGUgaW5kZXggdGhpcyBUaWxlc2V0IGNvbnRhaW5zLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjZmlyc3RnaWRcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmZpcnN0Z2lkID0gZmlyc3RnaWQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiBlYWNoIHRpbGUgKGluIHBpeGVscykuIFVzZSBzZXRUaWxlU2l6ZSB0byBjaGFuZ2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlV2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVXaWR0aCA9IHRpbGVXaWR0aDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiBlYWNoIHRpbGUgKGluIHBpeGVscykuIFVzZSBzZXRUaWxlU2l6ZSB0byBjaGFuZ2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlSGVpZ2h0ID0gdGlsZUhlaWdodDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1hcmdpbiBhcm91bmQgdGhlIHRpbGVzIGluIHRoZSBzaGVldCAoaW4gcGl4ZWxzKS4gVXNlIGBzZXRTcGFjaW5nYCB0byBjaGFuZ2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlTWFyZ2luXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlTWFyZ2luID0gdGlsZU1hcmdpbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNwYWNpbmcgYmV0d2VlbiBlYWNoIHRoZSB0aWxlIGluIHRoZSBzaGVldCAoaW4gcGl4ZWxzKS4gVXNlIGBzZXRTcGFjaW5nYCB0byBjaGFuZ2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlU3BhY2luZ1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZVNwYWNpbmcgPSB0aWxlU3BhY2luZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGlsZXNldC1zcGVjaWZpYyBwcm9wZXJ0aWVzIHBlciB0aWxlIHRoYXQgYXJlIHR5cGljYWxseSBkZWZpbmVkIGluIHRoZSBUaWxlZCBlZGl0b3IgaW4gdGhlXHJcbiAgICAgICAgICogVGlsZXNldCBlZGl0b3IuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlUHJvcGVydGllc1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlUHJvcGVydGllcyA9IHRpbGVQcm9wZXJ0aWVzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaWxlc2V0LXNwZWNpZmljIGRhdGEgcGVyIHRpbGUgdGhhdCBhcmUgdHlwaWNhbGx5IGRlZmluZWQgaW4gdGhlIFRpbGVkIGVkaXRvciwgZS5nLiB3aXRoaW5cclxuICAgICAgICAgKiB0aGUgVGlsZXNldCBjb2xsaXNpb24gZWRpdG9yLiBUaGlzIGlzIHdoZXJlIGNvbGxpc2lvbiBvYmplY3RzIGFuZCB0ZXJyYWluIGFyZSBzdG9yZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0aWxlRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlRGF0YSA9IHRpbGVEYXRhO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FjaGVkIGltYWdlIHRoYXQgY29udGFpbnMgdGhlIGluZGl2aWR1YWwgdGlsZXMuIFVzZSBzZXRJbWFnZSB0byBzZXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCNpbWFnZVxyXG4gICAgICAgICAqIEB0eXBlIHs/UGhhc2VyLlRleHR1cmVzLlRleHR1cmV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbWFnZSA9IG51bGw7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBnbCB0ZXh0dXJlIHVzZWQgYnkgdGhlIFdlYkdMIHJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjZ2xUZXh0dXJlXHJcbiAgICAgICAgICogQHR5cGUgez9XZWJHTFRleHR1cmV9XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gbnVsbDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiB0aWxlIHJvd3MgaW4gdGhlIHRoZSB0aWxlc2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjcm93c1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucm93cyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgdGlsZSBjb2x1bW5zIGluIHRoZSB0aWxlc2V0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjY29sdW1uc1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGlsZXMgaW4gdGhlIHRpbGVzZXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0b3RhbFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbG9vay11cCB0YWJsZSB0byBzcGVjaWZpYyB0aWxlIGltYWdlIHRleHR1cmUgY29vcmRpbmF0ZXMgKFVWIGluIHBpeGVscykuIEVhY2ggZWxlbWVudFxyXG4gICAgICAgICAqIGNvbnRhaW5zIHRoZSBjb29yZGluYXRlcyBmb3IgYSB0aWxlIGluIGFuIG9iamVjdCBvZiB0aGUgZm9ybSB7eCwgeX0uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCN0ZXhDb29yZGluYXRlc1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3RbXX1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGV4Q29vcmRpbmF0ZXMgPSBbXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSB0aWxlcyBwcm9wZXJ0aWVzIHRoYXQgYXJlIHN0b3JlZCBpbiB0aGUgVGlsZXNldC4gUmV0dXJucyBudWxsIGlmIHRpbGUgaW5kZXggaXMgbm90XHJcbiAgICAgKiBjb250YWluZWQgaW4gdGhpcyBUaWxlc2V0LiBUaGlzIGlzIHR5cGljYWxseSBkZWZpbmVkIGluIFRpbGVkIHVuZGVyIHRoZSBUaWxlc2V0IGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0I2dldFRpbGVQcm9wZXJ0aWVzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVJbmRleCAtIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHRpbGUgYWNyb3NzIGFsbCB0aWxlc2V0cyBpbiB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez8ob2JqZWN0fHVuZGVmaW5lZCl9XHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVQcm9wZXJ0aWVzOiBmdW5jdGlvbiAodGlsZUluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWluc1RpbGVJbmRleCh0aWxlSW5kZXgpKSB7IHJldHVybiBudWxsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVQcm9wZXJ0aWVzW3RpbGVJbmRleCAtIHRoaXMuZmlyc3RnaWRdO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHRpbGUncyBkYXRhIHRoYXQgaXMgc3RvcmVkIGluIHRoZSBUaWxlc2V0LiBSZXR1cm5zIG51bGwgaWYgdGlsZSBpbmRleCBpcyBub3QgY29udGFpbmVkXHJcbiAgICAgKiBpbiB0aGlzIFRpbGVzZXQuIFRoaXMgaXMgdHlwaWNhbGx5IGRlZmluZWQgaW4gVGlsZWQgYW5kIHdpbGwgY29udGFpbiBib3RoIFRpbGVzZXQgY29sbGlzaW9uXHJcbiAgICAgKiBpbmZvIGFuZCB0ZXJyYWluIG1hcHBpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCNnZXRUaWxlRGF0YVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSW5kZXggLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0aWxlIGFjcm9zcyBhbGwgdGlsZXNldHMgaW4gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/b2JqZWN0fHVuZGVmaW5lZH1cclxuICAgICAqL1xyXG4gICAgZ2V0VGlsZURhdGE6IGZ1bmN0aW9uICh0aWxlSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zVGlsZUluZGV4KHRpbGVJbmRleCkpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZURhdGFbdGlsZUluZGV4IC0gdGhpcy5maXJzdGdpZF07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgdGlsZSdzIGNvbGxpc2lvbiBncm91cCB0aGF0IGlzIHN0b3JlZCBpbiB0aGUgVGlsZXNldC4gUmV0dXJucyBudWxsIGlmIHRpbGUgaW5kZXggaXMgbm90XHJcbiAgICAgKiBjb250YWluZWQgaW4gdGhpcyBUaWxlc2V0LiBUaGlzIGlzIHR5cGljYWxseSBkZWZpbmVkIHdpdGhpbiBUaWxlZCdzIHRpbGVzZXQgY29sbGlzaW9uIGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0I2dldFRpbGVDb2xsaXNpb25Hcm91cFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSW5kZXggLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0aWxlIGFjcm9zcyBhbGwgdGlsZXNldHMgaW4gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/b2JqZWN0fVxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlQ29sbGlzaW9uR3JvdXA6IGZ1bmN0aW9uICh0aWxlSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldFRpbGVEYXRhKHRpbGVJbmRleCk7XHJcblxyXG4gICAgICAgIHJldHVybiAoZGF0YSAmJiBkYXRhLm9iamVjdGdyb3VwKSA/IGRhdGEub2JqZWN0Z3JvdXAgOiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIFRpbGVzZXQgY29udGFpbnMgdGhlIGdpdmVuIHRpbGUgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuVGlsZXNldCNjb250YWluc1RpbGVJbmRleFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSW5kZXggLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0aWxlIGFjcm9zcyBhbGwgdGlsZXNldHMgaW4gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb250YWluc1RpbGVJbmRleDogZnVuY3Rpb24gKHRpbGVJbmRleClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aWxlSW5kZXggPj0gdGhpcy5maXJzdGdpZCAmJlxyXG4gICAgICAgICAgICB0aWxlSW5kZXggPCAodGhpcy5maXJzdGdpZCArIHRoaXMudG90YWwpXHJcbiAgICAgICAgKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIChVViBpbiBwaXhlbHMpIGluIHRoZSBUaWxlc2V0IGltYWdlIGZvciB0aGUgZ2l2ZW4gdGlsZSBpbmRleC5cclxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aWxlIGluZGV4IGlzIG5vdCBjb250YWluZWQgaW4gdGhpcyBUaWxlc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjZ2V0VGlsZVRleHR1cmVDb29yZGluYXRlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSW5kZXggLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0aWxlIGFjcm9zcyBhbGwgdGlsZXNldHMgaW4gdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBPYmplY3QgaW4gdGhlIGZvcm0geyB4LCB5IH0gcmVwcmVzZW50aW5nIHRoZSB0b3AtbGVmdCBVViBjb29yZGluYXRlXHJcbiAgICAgKiB3aXRoaW4gdGhlIFRpbGVzZXQgaW1hZ2UuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVUZXh0dXJlQ29vcmRpbmF0ZXM6IGZ1bmN0aW9uICh0aWxlSW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zVGlsZUluZGV4KHRpbGVJbmRleCkpIHsgcmV0dXJuIG51bGw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4Q29vcmRpbmF0ZXNbdGlsZUluZGV4IC0gdGhpcy5maXJzdGdpZF07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVGlsZXNldCBhbmQgdXBkYXRlcyB0aGUgdGlsZSBkYXRhIChyb3dzLCBjb2x1bW5zLCBldGMuKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5UaWxlc2V0I3NldEltYWdlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UZXh0dXJlcy5UZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIGltYWdlIHRoYXQgY29udGFpbnMgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlc2V0fSBUaGlzIFRpbGVzZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRJbWFnZTogZnVuY3Rpb24gKHRleHR1cmUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pbWFnZSA9IHRleHR1cmU7XHJcblxyXG4gICAgICAgIHRoaXMuZ2xUZXh0dXJlID0gdGV4dHVyZS5nZXQoKS5zb3VyY2UuZ2xUZXh0dXJlO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVEYXRhKHRoaXMuaW1hZ2Uuc291cmNlWzBdLndpZHRoLCB0aGlzLmltYWdlLnNvdXJjZVswXS5oZWlnaHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aWxlIHdpZHRoICYgaGVpZ2h0IGFuZCB1cGRhdGVzIHRoZSB0aWxlIGRhdGEgKHJvd3MsIGNvbHVtbnMsIGV0Yy4pLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjc2V0VGlsZVNpemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVXaWR0aF0gLSBUaGUgd2lkdGggb2YgYSB0aWxlIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVIZWlnaHRdIC0gVGhlIGhlaWdodCBvZiBhIHRpbGUgaW4gcGl4ZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlc2V0fSBUaGlzIFRpbGVzZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlU2l6ZTogZnVuY3Rpb24gKHRpbGVXaWR0aCwgdGlsZUhlaWdodClcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZVdpZHRoICE9PSB1bmRlZmluZWQpIHsgdGhpcy50aWxlV2lkdGggPSB0aWxlV2lkdGg7IH1cclxuICAgICAgICBpZiAodGlsZUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7IHRoaXMudGlsZUhlaWdodCA9IHRpbGVIZWlnaHQ7IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVEYXRhKHRoaXMuaW1hZ2Uuc291cmNlWzBdLndpZHRoLCB0aGlzLmltYWdlLnNvdXJjZVswXS5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGlsZSBtYXJnaW4gJiBzcGFjaW5nIGFuZCB1cGRhdGVzIHRoZSB0aWxlIGRhdGEgKHJvd3MsIGNvbHVtbnMsIGV0Yy4pLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjc2V0U3BhY2luZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbbWFyZ2luXSAtIFRoZSBtYXJnaW4gYXJvdW5kIHRoZSB0aWxlcyBpbiB0aGUgc2hlZXQgKGluIHBpeGVscykuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzcGFjaW5nXSAtIFRoZSBzcGFjaW5nIGJldHdlZW4gdGhlIHRpbGVzIGluIHRoZSBzaGVldCAoaW4gcGl4ZWxzKS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZXNldH0gVGhpcyBUaWxlc2V0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0U3BhY2luZzogZnVuY3Rpb24gKG1hcmdpbiwgc3BhY2luZylcclxuICAgIHtcclxuICAgICAgICBpZiAobWFyZ2luICE9PSB1bmRlZmluZWQpIHsgdGhpcy50aWxlTWFyZ2luID0gbWFyZ2luOyB9XHJcbiAgICAgICAgaWYgKHNwYWNpbmcgIT09IHVuZGVmaW5lZCkgeyB0aGlzLnRpbGVTcGFjaW5nID0gc3BhY2luZzsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbWFnZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZURhdGEodGhpcy5pbWFnZS5zb3VyY2VbMF0ud2lkdGgsIHRoaXMuaW1hZ2Uuc291cmNlWzBdLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRpbGUgdGV4dHVyZSBjb29yZGluYXRlcyBhbmQgdGlsZXNldCBkYXRhLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlRpbGVzZXQjdXBkYXRlVGlsZURhdGFcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW1hZ2VXaWR0aCAtIFRoZSAoZXhwZWN0ZWQpIHdpZHRoIG9mIHRoZSBpbWFnZSB0byBzbGljZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW1hZ2VIZWlnaHQgLSBUaGUgKGV4cGVjdGVkKSBoZWlnaHQgb2YgdGhlIGltYWdlIHRvIHNsaWNlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlc2V0fSBUaGlzIFRpbGVzZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVUaWxlRGF0YTogZnVuY3Rpb24gKGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIHZhciByb3dDb3VudCA9IChpbWFnZUhlaWdodCAtIHRoaXMudGlsZU1hcmdpbiAqIDIgKyB0aGlzLnRpbGVTcGFjaW5nKSAvICh0aGlzLnRpbGVIZWlnaHQgKyB0aGlzLnRpbGVTcGFjaW5nKTtcclxuICAgICAgICB2YXIgY29sQ291bnQgPSAoaW1hZ2VXaWR0aCAtIHRoaXMudGlsZU1hcmdpbiAqIDIgKyB0aGlzLnRpbGVTcGFjaW5nKSAvICh0aGlzLnRpbGVXaWR0aCArIHRoaXMudGlsZVNwYWNpbmcpO1xyXG5cclxuICAgICAgICBpZiAocm93Q291bnQgJSAxICE9PSAwIHx8IGNvbENvdW50ICUgMSAhPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW1hZ2UgdGlsZSBhcmVhIG5vdCB0aWxlIHNpemUgbXVsdGlwbGUgaW46ICcgKyB0aGlzLm5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW4gVGlsZWQgYSB0aWxlc2V0IGltYWdlIHRoYXQgaXMgbm90IGFuIGV2ZW4gbXVsdGlwbGUgb2YgdGhlIHRpbGUgZGltZW5zaW9ucyBpcyB0cnVuY2F0ZWRcclxuICAgICAgICAvLyAtIGhlbmNlIHRoZSBmbG9vciB3aGVuIGNhbGN1bGF0aW5nIHRoZSByb3dzL2NvbHVtbnMuXHJcbiAgICAgICAgcm93Q291bnQgPSBNYXRoLmZsb29yKHJvd0NvdW50KTtcclxuICAgICAgICBjb2xDb3VudCA9IE1hdGguZmxvb3IoY29sQ291bnQpO1xyXG5cclxuICAgICAgICB0aGlzLnJvd3MgPSByb3dDb3VudDtcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2xDb3VudDtcclxuXHJcbiAgICAgICAgLy8gSW4gVGlsZWQsIFwiZW1wdHlcIiBzcGFjZXMgaW4gYSB0aWxlc2V0IGNvdW50IGFzIHRpbGVzIGFuZCBoZW5jZSBjb3VudCB0b3dhcmRzIHRoZSBnaWRcclxuICAgICAgICB0aGlzLnRvdGFsID0gcm93Q291bnQgKiBjb2xDb3VudDtcclxuXHJcbiAgICAgICAgdGhpcy50ZXhDb29yZGluYXRlcy5sZW5ndGggPSAwO1xyXG5cclxuICAgICAgICB2YXIgdHggPSB0aGlzLnRpbGVNYXJnaW47XHJcbiAgICAgICAgdmFyIHR5ID0gdGhpcy50aWxlTWFyZ2luO1xyXG5cclxuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRoaXMucm93czsgeSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmNvbHVtbnM7IHgrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhDb29yZGluYXRlcy5wdXNoKHsgeDogdHgsIHk6IHR5IH0pO1xyXG4gICAgICAgICAgICAgICAgdHggKz0gdGhpcy50aWxlV2lkdGggKyB0aGlzLnRpbGVTcGFjaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0eCA9IHRoaXMudGlsZU1hcmdpbjtcclxuICAgICAgICAgICAgdHkgKz0gdGhpcy50aWxlSGVpZ2h0ICsgdGhpcy50aWxlU3BhY2luZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVzZXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVBdCA9IHJlcXVpcmUoJy4vR2V0VGlsZUF0Jyk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyBpbnRlcmVzdGluZyBmYWNlcyBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLiBJbnRlcmVzdGluZ1xyXG4gKiBmYWNlcyBhcmUgdXNlZCBpbnRlcm5hbGx5IGZvciBvcHRpbWl6aW5nIGNvbGxpc2lvbnMgYWdhaW5zdCB0aWxlcy4gVGhpcyBtZXRob2QgaXMgbW9zdGx5IHVzZWRcclxuICogaW50ZXJuYWxseSB0byBvcHRpbWl6ZSByZWNhbGN1bGF0aW5nIGZhY2VzIHdoZW4gb25seSBvbmUgdGlsZSBoYXMgYmVlbiBjaGFuZ2VkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuQ2FsY3VsYXRlRmFjZXNBdFxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIENhbGN1bGF0ZUZhY2VzQXQgPSBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGUgPSBHZXRUaWxlQXQodGlsZVgsIHRpbGVZLCB0cnVlLCBsYXllcik7XHJcbiAgICB2YXIgYWJvdmUgPSBHZXRUaWxlQXQodGlsZVgsIHRpbGVZIC0gMSwgdHJ1ZSwgbGF5ZXIpO1xyXG4gICAgdmFyIGJlbG93ID0gR2V0VGlsZUF0KHRpbGVYLCB0aWxlWSArIDEsIHRydWUsIGxheWVyKTtcclxuICAgIHZhciBsZWZ0ID0gR2V0VGlsZUF0KHRpbGVYIC0gMSwgdGlsZVksIHRydWUsIGxheWVyKTtcclxuICAgIHZhciByaWdodCA9IEdldFRpbGVBdCh0aWxlWCArIDEsIHRpbGVZLCB0cnVlLCBsYXllcik7XHJcbiAgICB2YXIgdGlsZUNvbGxpZGVzID0gdGlsZSAmJiB0aWxlLmNvbGxpZGVzO1xyXG5cclxuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlZCB0aWxlIGhhcyBhbGwgaW50ZXJlc3RpbmcgZWRnZXNcclxuICAgIGlmICh0aWxlQ29sbGlkZXMpXHJcbiAgICB7XHJcbiAgICAgICAgdGlsZS5mYWNlVG9wID0gdHJ1ZTtcclxuICAgICAgICB0aWxlLmZhY2VCb3R0b20gPSB0cnVlO1xyXG4gICAgICAgIHRpbGUuZmFjZUxlZnQgPSB0cnVlO1xyXG4gICAgICAgIHRpbGUuZmFjZVJpZ2h0ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXNldCBlZGdlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aWxlIGFuZCBpdHMgbmVpZ2hib3JzXHJcbiAgICBpZiAoYWJvdmUgJiYgYWJvdmUuY29sbGlkZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRpbGVDb2xsaWRlcykgeyB0aWxlLmZhY2VUb3AgPSBmYWxzZTsgfVxyXG4gICAgICAgIGFib3ZlLmZhY2VCb3R0b20gPSAhdGlsZUNvbGxpZGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZWxvdyAmJiBiZWxvdy5jb2xsaWRlcylcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZUNvbGxpZGVzKSB7IHRpbGUuZmFjZUJvdHRvbSA9IGZhbHNlOyB9XHJcbiAgICAgICAgYmVsb3cuZmFjZVRvcCA9ICF0aWxlQ29sbGlkZXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxlZnQgJiYgbGVmdC5jb2xsaWRlcylcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZUNvbGxpZGVzKSB7IHRpbGUuZmFjZUxlZnQgPSBmYWxzZTsgfVxyXG4gICAgICAgIGxlZnQuZmFjZVJpZ2h0ID0gIXRpbGVDb2xsaWRlcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmlnaHQgJiYgcmlnaHQuY29sbGlkZXMpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRpbGVDb2xsaWRlcykgeyB0aWxlLmZhY2VSaWdodCA9IGZhbHNlOyB9XHJcbiAgICAgICAgcmlnaHQuZmFjZUxlZnQgPSAhdGlsZUNvbGxpZGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aWxlICYmICF0aWxlLmNvbGxpZGVzKSB7IHRpbGUucmVzZXRGYWNlcygpOyB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENhbGN1bGF0ZUZhY2VzQXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVBdCA9IHJlcXVpcmUoJy4vR2V0VGlsZUF0Jyk7XHJcbnZhciBHZXRUaWxlc1dpdGhpbiA9IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW4nKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGludGVyZXN0aW5nIGZhY2VzIHdpdGhpbiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBzcGVjaWZpZWQgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZVxyXG4gKiBsYXllci4gSW50ZXJlc3RpbmcgZmFjZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3Igb3B0aW1pemluZyBjb2xsaXNpb25zIGFnYWluc3QgdGlsZXMuIFRoaXMgbWV0aG9kXHJcbiAqIGlzIG1vc3RseSB1c2VkIGludGVybmFsbHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5DYWxjdWxhdGVGYWNlc1dpdGhpblxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIENhbGN1bGF0ZUZhY2VzV2l0aGluID0gZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXIpXHJcbntcclxuICAgIHZhciBhYm92ZSA9IG51bGw7XHJcbiAgICB2YXIgYmVsb3cgPSBudWxsO1xyXG4gICAgdmFyIGxlZnQgPSBudWxsO1xyXG4gICAgdmFyIHJpZ2h0ID0gbnVsbDtcclxuXHJcbiAgICB2YXIgdGlsZXMgPSBHZXRUaWxlc1dpdGhpbih0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIG51bGwsIGxheWVyKTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aWxlID0gdGlsZXNbaV07XHJcblxyXG4gICAgICAgIGlmICh0aWxlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRpbGUuY29sbGlkZXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFib3ZlID0gR2V0VGlsZUF0KHRpbGUueCwgdGlsZS55IC0gMSwgdHJ1ZSwgbGF5ZXIpO1xyXG4gICAgICAgICAgICAgICAgYmVsb3cgPSBHZXRUaWxlQXQodGlsZS54LCB0aWxlLnkgKyAxLCB0cnVlLCBsYXllcik7XHJcbiAgICAgICAgICAgICAgICBsZWZ0ID0gR2V0VGlsZUF0KHRpbGUueCAtIDEsIHRpbGUueSwgdHJ1ZSwgbGF5ZXIpO1xyXG4gICAgICAgICAgICAgICAgcmlnaHQgPSBHZXRUaWxlQXQodGlsZS54ICsgMSwgdGlsZS55LCB0cnVlLCBsYXllcik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGlsZS5mYWNlVG9wID0gKGFib3ZlICYmIGFib3ZlLmNvbGxpZGVzKSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRpbGUuZmFjZUJvdHRvbSA9IChiZWxvdyAmJiBiZWxvdy5jb2xsaWRlcykgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aWxlLmZhY2VMZWZ0ID0gKGxlZnQgJiYgbGVmdC5jb2xsaWRlcykgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aWxlLmZhY2VSaWdodCA9IChyaWdodCAmJiByaWdodC5jb2xsaWRlcykgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnJlc2V0RmFjZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2FsY3VsYXRlRmFjZXNXaXRoaW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG52YXIgQ2FsY3VsYXRlRmFjZXNXaXRoaW4gPSByZXF1aXJlKCcuL0NhbGN1bGF0ZUZhY2VzV2l0aGluJyk7XHJcblxyXG4vKipcclxuICogQ29waWVzIHRoZSB0aWxlcyBpbiB0aGUgc291cmNlIHJlY3Rhbmd1bGFyIGFyZWEgdG8gYSBuZXcgZGVzdGluYXRpb24gKGFsbCBzcGVjaWZpZWQgaW4gdGlsZVxyXG4gKiBjb29yZGluYXRlcykgd2l0aGluIHRoZSBsYXllci4gVGhpcyBjb3BpZXMgYWxsIHRpbGUgcHJvcGVydGllcyAmIHJlY2FsY3VsYXRlcyBjb2xsaXNpb25cclxuICogaW5mb3JtYXRpb24gaW4gdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLkNvcHlcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gc3JjVGlsZVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGNvcHkgZnJvbSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gc3JjVGlsZVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGNvcHkgZnJvbSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEgdG8gY29weSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgYXJlYSB0byBjb3B5LCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBkZXN0VGlsZVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGNvcHkgdG8sIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGRlc3RUaWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gY29weSB0bywgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIENvcHkgPSBmdW5jdGlvbiAoc3JjVGlsZVgsIHNyY1RpbGVZLCB3aWR0aCwgaGVpZ2h0LCBkZXN0VGlsZVgsIGRlc3RUaWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmIChzcmNUaWxlWCA8IDApIHsgc3JjVGlsZVggPSAwOyB9XHJcbiAgICBpZiAoc3JjVGlsZVkgPCAwKSB7IHNyY1RpbGVZID0gMDsgfVxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgIHZhciBzcmNUaWxlcyA9IEdldFRpbGVzV2l0aGluKHNyY1RpbGVYLCBzcmNUaWxlWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgbGF5ZXIpO1xyXG5cclxuICAgIHZhciBvZmZzZXRYID0gZGVzdFRpbGVYIC0gc3JjVGlsZVg7XHJcbiAgICB2YXIgb2Zmc2V0WSA9IGRlc3RUaWxlWSAtIHNyY1RpbGVZO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3JjVGlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGVYID0gc3JjVGlsZXNbaV0ueCArIG9mZnNldFg7XHJcbiAgICAgICAgdmFyIHRpbGVZID0gc3JjVGlsZXNbaV0ueSArIG9mZnNldFk7XHJcbiAgICAgICAgaWYgKHRpbGVYID49IDAgJiYgdGlsZVggPCBsYXllci53aWR0aCAmJiB0aWxlWSA+PSAwICYmIHRpbGVZIDwgbGF5ZXIuaGVpZ2h0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGxheWVyLmRhdGFbdGlsZVldW3RpbGVYXSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuZGF0YVt0aWxlWV1bdGlsZVhdLmNvcHkoc3JjVGlsZXNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBmYWNlcyB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIGFyZWEgYW5kIG5laWdoYm9yaW5nIHRpbGVzXHJcbiAgICAgICAgQ2FsY3VsYXRlRmFjZXNXaXRoaW4oZGVzdFRpbGVYIC0gMSwgZGVzdFRpbGVZIC0gMSwgd2lkdGggKyAyLCBoZWlnaHQgKyAyLCBsYXllcik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENvcHk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRpbGVUb1dvcmxkWCA9IHJlcXVpcmUoJy4vVGlsZVRvV29ybGRYJyk7XHJcbnZhciBUaWxlVG9Xb3JsZFkgPSByZXF1aXJlKCcuL1RpbGVUb1dvcmxkWScpO1xyXG52YXIgR2V0VGlsZXNXaXRoaW4gPSByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluJyk7XHJcbnZhciBSZXBsYWNlQnlJbmRleCA9IHJlcXVpcmUoJy4vUmVwbGFjZUJ5SW5kZXgnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgU3ByaXRlIGZvciBldmVyeSBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbGUgaW5kZXhlcyBpbiB0aGUgbGF5ZXIuIFlvdSBjYW5cclxuICogb3B0aW9uYWxseSBzcGVjaWZ5IGlmIGVhY2ggdGlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcgdGlsZSBhZnRlciB0aGUgU3ByaXRlIGhhcyBiZWVuXHJcbiAqIGNyZWF0ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxheSBkb3duIHNwZWNpYWwgdGlsZXMgaW4gYSBsZXZlbCB0aGF0IGFyZSBjb252ZXJ0ZWQgdG9cclxuICogU3ByaXRlcywgYnV0IHdhbnQgdG8gcmVwbGFjZSB0aGUgdGlsZSBpdHNlbGYgd2l0aCBhIGZsb29yIHRpbGUgb3Igc2ltaWxhciBvbmNlIGNvbnZlcnRlZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLkNyZWF0ZUZyb21UaWxlc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IGluZGV4ZXMgLSBUaGUgdGlsZSBpbmRleCwgb3IgYXJyYXkgb2YgaW5kZXhlcywgdG8gY3JlYXRlIFNwcml0ZXMgZnJvbS5cclxuICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IHJlcGxhY2VtZW50cyAtIFRoZSB0aWxlIGluZGV4LCBvciBhcnJheSBvZiBpbmRleGVzLCB0byBjaGFuZ2UgYSBjb252ZXJ0ZWQgdGlsZSB0by4gU2V0IHRvIGBudWxsYCB0byBsZWF2ZSB0aGUgdGlsZXMgdW5jaGFuZ2VkLiBJZiBhbiBhcnJheSBpcyBnaXZlbiwgaXQgaXMgYXNzdW1lZCB0byBiZSBhIG9uZS10by1vbmUgbWFwcGluZyB3aXRoIHRoZSBpbmRleGVzIGFycmF5LlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5TcHJpdGUuU3ByaXRlQ29uZmlnfSBzcHJpdGVDb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBwYXNzIGludG8gdGhlIFNwcml0ZSBjcmVhdG9yIChpLmUuIHNjZW5lLm1ha2Uuc3ByaXRlKS5cclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IFtzY2VuZT1zY2VuZSB0aGUgbWFwIGlzIHdpdGhpbl0gLSBUaGUgU2NlbmUgdG8gY3JlYXRlIHRoZSBTcHJpdGVzIHdpdGhpbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHRoZSB3b3JsZCBYWVxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGVbXX0gQW4gYXJyYXkgb2YgdGhlIFNwcml0ZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuXHJcbiAqL1xyXG52YXIgQ3JlYXRlRnJvbVRpbGVzID0gZnVuY3Rpb24gKGluZGV4ZXMsIHJlcGxhY2VtZW50cywgc3ByaXRlQ29uZmlnLCBzY2VuZSwgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgaWYgKHNwcml0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7IHNwcml0ZUNvbmZpZyA9IHt9OyB9XHJcblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGluZGV4ZXMpKSB7IGluZGV4ZXMgPSBbIGluZGV4ZXMgXTsgfVxyXG5cclxuICAgIHZhciB0aWxlbWFwTGF5ZXIgPSBsYXllci50aWxlbWFwTGF5ZXI7XHJcbiAgICBpZiAoc2NlbmUgPT09IHVuZGVmaW5lZCkgeyBzY2VuZSA9IHRpbGVtYXBMYXllci5zY2VuZTsgfVxyXG4gICAgaWYgKGNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7IGNhbWVyYSA9IHNjZW5lLmNhbWVyYXMubWFpbjsgfVxyXG5cclxuICAgIHZhciB0aWxlcyA9IEdldFRpbGVzV2l0aGluKDAsIDAsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIG51bGwsIGxheWVyKTtcclxuICAgIHZhciBzcHJpdGVzID0gW107XHJcbiAgICB2YXIgaTtcclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGUgPSB0aWxlc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ZXMuaW5kZXhPZih0aWxlLmluZGV4KSAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzcHJpdGVDb25maWcueCA9IFRpbGVUb1dvcmxkWCh0aWxlLngsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgICAgICAgICBzcHJpdGVDb25maWcueSA9IFRpbGVUb1dvcmxkWSh0aWxlLnksIGNhbWVyYSwgbGF5ZXIpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHNwcml0ZSA9IHNjZW5lLm1ha2Uuc3ByaXRlKHNwcml0ZUNvbmZpZyk7XHJcbiAgICAgICAgICAgIHNwcml0ZXMucHVzaChzcHJpdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VtZW50cyA9PT0gJ251bWJlcicpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEFzc3VtZSAxIHJlcGxhY2VtZW50IGZvciBhbGwgdHlwZXMgb2YgdGlsZSBnaXZlblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRleGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUmVwbGFjZUJ5SW5kZXgoaW5kZXhlc1tpXSwgcmVwbGFjZW1lbnRzLCAwLCAwLCBsYXllci53aWR0aCwgbGF5ZXIuaGVpZ2h0LCBsYXllcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlbWVudHMpKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBBc3N1bWUgMSB0byAxIG1hcHBpbmcgd2l0aCBpbmRleGVzIGFycmF5XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBSZXBsYWNlQnlJbmRleChpbmRleGVzW2ldLCByZXBsYWNlbWVudHNbaV0sIDAsIDAsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNwcml0ZXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENyZWF0ZUZyb21UaWxlcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU25hcEZsb29yID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9zbmFwL1NuYXBGbG9vcicpO1xyXG52YXIgU25hcENlaWwgPSByZXF1aXJlKCcuLi8uLi9tYXRoL3NuYXAvU25hcENlaWwnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0aWxlcyBpbiB0aGUgZ2l2ZW4gbGF5ZXIgdGhhdCBhcmUgd2l0aGluIHRoZSBjYW1lcmEncyB2aWV3cG9ydC4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5DdWxsVGlsZXNcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHJ1biB0aGUgY3VsbCBjaGVjayBhZ2FpbnN0LlxyXG4gKiBAcGFyYW0ge2FycmF5fSBbb3V0cHV0QXJyYXldIC0gQW4gb3B0aW9uYWwgYXJyYXkgdG8gc3RvcmUgdGhlIFRpbGUgb2JqZWN0cyB3aXRoaW4uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICovXHJcbnZhciBDdWxsVGlsZXMgPSBmdW5jdGlvbiAobGF5ZXIsIGNhbWVyYSwgb3V0cHV0QXJyYXksIHJlbmRlck9yZGVyKVxyXG57XHJcbiAgICBpZiAob3V0cHV0QXJyYXkgPT09IHVuZGVmaW5lZCkgeyBvdXRwdXRBcnJheSA9IFtdOyB9XHJcbiAgICBpZiAocmVuZGVyT3JkZXIgPT09IHVuZGVmaW5lZCkgeyByZW5kZXJPcmRlciA9IDA7IH1cclxuXHJcbiAgICBvdXRwdXRBcnJheS5sZW5ndGggPSAwO1xyXG5cclxuICAgIHZhciB0aWxlbWFwID0gbGF5ZXIudGlsZW1hcExheWVyLnRpbGVtYXA7XHJcbiAgICB2YXIgdGlsZW1hcExheWVyID0gbGF5ZXIudGlsZW1hcExheWVyO1xyXG5cclxuICAgIHZhciBtYXBEYXRhID0gbGF5ZXIuZGF0YTtcclxuICAgIHZhciBtYXBXaWR0aCA9IGxheWVyLndpZHRoO1xyXG4gICAgdmFyIG1hcEhlaWdodCA9IGxheWVyLmhlaWdodDtcclxuXHJcbiAgICAvLyAgV2UgbmVlZCB0byB1c2UgdGhlIHRpbGUgc2l6ZXMgZGVmaW5lZCBmb3IgdGhlIG1hcCBhcyBhIHdob2xlLCBub3QgdGhlIGxheWVyLFxyXG4gICAgLy8gIGluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgYm91bmRzIGNvcnJlY3RseS4gQXMgZGlmZmVyZW50IHNpemVkIHRpbGVzIG1heSBiZVxyXG4gICAgLy8gIHBsYWNlZCBvbiB0aGUgZ3JpZCBhbmQgd2UgY2Fubm90IHRydXN0IGxheWVyLmJhc2VUaWxlV2lkdGggdG8gZ2l2ZSB1cyB0aGUgdHJ1ZSBzaXplLlxyXG4gICAgdmFyIHRpbGVXID0gTWF0aC5mbG9vcih0aWxlbWFwLnRpbGVXaWR0aCAqIHRpbGVtYXBMYXllci5zY2FsZVgpO1xyXG4gICAgdmFyIHRpbGVIID0gTWF0aC5mbG9vcih0aWxlbWFwLnRpbGVIZWlnaHQgKiB0aWxlbWFwTGF5ZXIuc2NhbGVZKTtcclxuXHJcbiAgICB2YXIgZHJhd0xlZnQgPSAwO1xyXG4gICAgdmFyIGRyYXdSaWdodCA9IG1hcFdpZHRoO1xyXG4gICAgdmFyIGRyYXdUb3AgPSAwO1xyXG4gICAgdmFyIGRyYXdCb3R0b20gPSBtYXBIZWlnaHQ7XHJcblxyXG4gICAgaWYgKCF0aWxlbWFwTGF5ZXIuc2tpcEN1bGwgJiYgdGlsZW1hcExheWVyLnNjcm9sbEZhY3RvclggPT09IDEgJiYgdGlsZW1hcExheWVyLnNjcm9sbEZhY3RvclkgPT09IDEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIENhbWVyYSB3b3JsZCB2aWV3IGJvdW5kcywgc25hcHBlZCBmb3Igc2NhbGVkIHRpbGUgc2l6ZVxyXG4gICAgICAgIC8vICBDdWxsIFBhZGRpbmcgdmFsdWVzIGFyZSBnaXZlbiBpbiB0aWxlcywgbm90IHBpeGVsc1xyXG5cclxuICAgICAgICB2YXIgYm91bmRzTGVmdCA9IFNuYXBGbG9vcihjYW1lcmEud29ybGRWaWV3LnggLSB0aWxlbWFwTGF5ZXIueCwgdGlsZVcsIDAsIHRydWUpIC0gdGlsZW1hcExheWVyLmN1bGxQYWRkaW5nWDtcclxuICAgICAgICB2YXIgYm91bmRzUmlnaHQgPSBTbmFwQ2VpbChjYW1lcmEud29ybGRWaWV3LnJpZ2h0IC0gdGlsZW1hcExheWVyLngsIHRpbGVXLCAwLCB0cnVlKSArIHRpbGVtYXBMYXllci5jdWxsUGFkZGluZ1g7XHJcbiAgICAgICAgdmFyIGJvdW5kc1RvcCA9IFNuYXBGbG9vcihjYW1lcmEud29ybGRWaWV3LnkgLSB0aWxlbWFwTGF5ZXIueSwgdGlsZUgsIDAsIHRydWUpIC0gdGlsZW1hcExheWVyLmN1bGxQYWRkaW5nWTtcclxuICAgICAgICB2YXIgYm91bmRzQm90dG9tID0gU25hcENlaWwoY2FtZXJhLndvcmxkVmlldy5ib3R0b20gLSB0aWxlbWFwTGF5ZXIueSwgdGlsZUgsIDAsIHRydWUpICsgdGlsZW1hcExheWVyLmN1bGxQYWRkaW5nWTtcclxuXHJcbiAgICAgICAgZHJhd0xlZnQgPSBNYXRoLm1heCgwLCBib3VuZHNMZWZ0KTtcclxuICAgICAgICBkcmF3UmlnaHQgPSBNYXRoLm1pbihtYXBXaWR0aCwgYm91bmRzUmlnaHQpO1xyXG4gICAgICAgIGRyYXdUb3AgPSBNYXRoLm1heCgwLCBib3VuZHNUb3ApO1xyXG4gICAgICAgIGRyYXdCb3R0b20gPSBNYXRoLm1pbihtYXBIZWlnaHQsIGJvdW5kc0JvdHRvbSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHg7XHJcbiAgICB2YXIgeTtcclxuICAgIHZhciB0aWxlO1xyXG5cclxuICAgIGlmIChyZW5kZXJPcmRlciA9PT0gMClcclxuICAgIHtcclxuICAgICAgICAvLyAgcmlnaHQtZG93blxyXG5cclxuICAgICAgICBmb3IgKHkgPSBkcmF3VG9wOyB5IDwgZHJhd0JvdHRvbTsgeSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh4ID0gZHJhd0xlZnQ7IG1hcERhdGFbeV0gJiYgeCA8IGRyYXdSaWdodDsgeCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlID0gbWFwRGF0YVt5XVt4XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdGlsZS5pbmRleCA9PT0gLTEgfHwgIXRpbGUudmlzaWJsZSB8fCB0aWxlLmFscGhhID09PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2godGlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChyZW5kZXJPcmRlciA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICAvLyAgbGVmdC1kb3duXHJcblxyXG4gICAgICAgIGZvciAoeSA9IGRyYXdUb3A7IHkgPCBkcmF3Qm90dG9tOyB5KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHggPSBkcmF3UmlnaHQ7IG1hcERhdGFbeV0gJiYgeCA+PSBkcmF3TGVmdDsgeC0tKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlID0gbWFwRGF0YVt5XVt4XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdGlsZS5pbmRleCA9PT0gLTEgfHwgIXRpbGUudmlzaWJsZSB8fCB0aWxlLmFscGhhID09PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG91dHB1dEFycmF5LnB1c2godGlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChyZW5kZXJPcmRlciA9PT0gMilcclxuICAgIHtcclxuICAgICAgICAvLyAgcmlnaHQtdXBcclxuXHJcbiAgICAgICAgZm9yICh5ID0gZHJhd0JvdHRvbTsgeSA+PSBkcmF3VG9wOyB5LS0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHggPSBkcmF3TGVmdDsgbWFwRGF0YVt5XSAmJiB4IDwgZHJhd1JpZ2h0OyB4KyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpbGUgPSBtYXBEYXRhW3ldW3hdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGlsZSB8fCB0aWxlLmluZGV4ID09PSAtMSB8fCAhdGlsZS52aXNpYmxlIHx8IHRpbGUuYWxwaGEgPT09IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb3V0cHV0QXJyYXkucHVzaCh0aWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlbmRlck9yZGVyID09PSAzKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBsZWZ0LXVwXHJcblxyXG4gICAgICAgIGZvciAoeSA9IGRyYXdCb3R0b207IHkgPj0gZHJhd1RvcDsgeS0tKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh4ID0gZHJhd1JpZ2h0OyBtYXBEYXRhW3ldICYmIHggPj0gZHJhd0xlZnQ7IHgtLSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGlsZSA9IG1hcERhdGFbeV1beF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHRpbGUuaW5kZXggPT09IC0xIHx8ICF0aWxlLnZpc2libGUgfHwgdGlsZS5hbHBoYSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvdXRwdXRBcnJheS5wdXNoKHRpbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRpbGVtYXBMYXllci50aWxlc0RyYXduID0gb3V0cHV0QXJyYXkubGVuZ3RoO1xyXG4gICAgdGlsZW1hcExheWVyLnRpbGVzVG90YWwgPSBtYXBXaWR0aCAqIG1hcEhlaWdodDtcclxuXHJcbiAgICByZXR1cm4gb3V0cHV0QXJyYXk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEN1bGxUaWxlcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VGlsZXNXaXRoaW4gPSByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluJyk7XHJcbnZhciBDYWxjdWxhdGVGYWNlc1dpdGhpbiA9IHJlcXVpcmUoJy4vQ2FsY3VsYXRlRmFjZXNXaXRoaW4nKTtcclxudmFyIFNldFRpbGVDb2xsaXNpb24gPSByZXF1aXJlKCcuL1NldFRpbGVDb2xsaXNpb24nKTtcclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSB0aWxlcyBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyIHdpdGggdGhlXHJcbiAqIHNwZWNpZmllZCBpbmRleC4gVGlsZXMgd2lsbCBiZSBzZXQgdG8gY29sbGlkZSBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBjb2xsaWRpbmcgaW5kZXguXHJcbiAqIENvbGxpc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgcmVjYWxjdWxhdGVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuRmlsbFxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSB0aWxlIGluZGV4IHRvIGZpbGwgdGhlIGFyZWEgd2l0aC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtib29sZWFufSByZWNhbGN1bGF0ZUZhY2VzIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgdGlsZSBsYXllciB0byB1c2UuIElmIG5vdCBnaXZlbiB0aGUgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gKi9cclxudmFyIEZpbGwgPSBmdW5jdGlvbiAoaW5kZXgsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIHZhciBkb2VzSW5kZXhDb2xsaWRlID0gKGxheWVyLmNvbGxpZGVJbmRleGVzLmluZGV4T2YoaW5kZXgpICE9PSAtMSk7XHJcblxyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBudWxsLCBsYXllcik7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB0aWxlc1tpXS5pbmRleCA9IGluZGV4O1xyXG5cclxuICAgICAgICBTZXRUaWxlQ29sbGlzaW9uKHRpbGVzW2ldLCBkb2VzSW5kZXhDb2xsaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgZmFjZXMgd2l0aGluIHRoZSBhcmVhIGFuZCBuZWlnaGJvcmluZyB0aWxlc1xyXG4gICAgICAgIENhbGN1bGF0ZUZhY2VzV2l0aGluKHRpbGVYIC0gMSwgdGlsZVkgLSAxLCB3aWR0aCArIDIsIGhlaWdodCArIDIsIGxheWVyKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmlsbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VGlsZXNXaXRoaW4gPSByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluJyk7XHJcblxyXG4vKipcclxuICogRm9yIGVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLCBydW4gdGhlIGdpdmVuXHJcbiAqIGZpbHRlciBjYWxsYmFjayBmdW5jdGlvbi4gQW55IHRpbGVzIHRoYXQgcGFzcyB0aGUgZmlsdGVyIHRlc3QgKGkuZS4gd2hlcmUgdGhlIGNhbGxiYWNrIHJldHVybnNcclxuICogdHJ1ZSkgd2lsbCByZXR1cm5lZCBhcyBhIG5ldyBhcnJheS4gU2ltaWxhciB0byBBcnJheS5wcm90b3R5cGUuRmlsdGVyIGluIHZhbmlsbGEgSlMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5GaWx0ZXJUaWxlc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suIEVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzXHJcbiAqIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIHRydWUgZm9yIHRpbGVzIHRoYXQgcGFzcyB0aGVcclxuICogZmlsdGVyLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBmaWx0ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtmaWx0ZXJpbmdPcHRpb25zXSAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgd2hlbiBnZXR0aW5nIHRoZSB0aWxlcy5cclxuICogQHBhcmFtIHtib29sZWFufSBbZmlsdGVyaW5nT3B0aW9ucy5pc05vdEVtcHR5PWZhbHNlXSAtIElmIHRydWUsIG9ubHkgcmV0dXJuIHRpbGVzIHRoYXQgZG9uJ3QgaGF2ZSAtMSBmb3IgYW4gaW5kZXguXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZpbHRlcmluZ09wdGlvbnMuaXNDb2xsaWRpbmc9ZmFsc2VdIC0gSWYgdHJ1ZSwgb25seSByZXR1cm4gdGlsZXMgdGhhdCBjb2xsaWRlIG9uIGF0IGxlYXN0IG9uZSBzaWRlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmaWx0ZXJpbmdPcHRpb25zLmhhc0ludGVyZXN0aW5nRmFjZT1mYWxzZV0gLSBJZiB0cnVlLCBvbmx5IHJldHVybiB0aWxlcyB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIGludGVyZXN0aW5nIGZhY2UuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IFRoZSBmaWx0ZXJlZCBhcnJheSBvZiBUaWxlcy5cclxuICovXHJcbnZhciBGaWx0ZXJUaWxlcyA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcik7XHJcblxyXG4gICAgcmV0dXJuIHRpbGVzLmZpbHRlcihjYWxsYmFjaywgY29udGV4dCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlclRpbGVzO1xyXG5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2VhcmNoZXMgdGhlIGVudGlyZSBtYXAgbGF5ZXIgZm9yIHRoZSBmaXJzdCB0aWxlIG1hdGNoaW5nIHRoZSBnaXZlbiBpbmRleCwgdGhlbiByZXR1cm5zIHRoYXQgVGlsZVxyXG4gKiBvYmplY3QuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCBpdCByZXR1cm5zIG51bGwuIFRoZSBzZWFyY2ggc3RhcnRzIGZyb20gdGhlIHRvcC1sZWZ0IHRpbGUgYW5kXHJcbiAqIGNvbnRpbnVlcyBob3Jpem9udGFsbHkgdW50aWwgaXQgaGl0cyB0aGUgZW5kIG9mIHRoZSByb3csIHRoZW4gaXQgZHJvcHMgZG93biB0byB0aGUgbmV4dCBjb2x1bW4uXHJcbiAqIElmIHRoZSByZXZlcnNlIGJvb2xlYW4gaXMgdHJ1ZSwgaXQgc2NhbnMgc3RhcnRpbmcgZnJvbSB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciB0cmF2ZWxpbmcgdXAgdG9cclxuICogdGhlIHRvcC1sZWZ0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuRmluZEJ5SW5kZXhcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdGlsZSBpbmRleCB2YWx1ZSB0byBzZWFyY2ggZm9yLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtza2lwPTBdIC0gVGhlIG51bWJlciBvZiB0aW1lcyB0byBza2lwIGEgbWF0Y2hpbmcgdGlsZSBiZWZvcmUgcmV0dXJuaW5nLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXZlcnNlPWZhbHNlXSAtIElmIHRydWUgaXQgd2lsbCBzY2FuIHRoZSBsYXllciBpbiByZXZlcnNlLCBzdGFydGluZyBhdCB0aGVcclxuICogYm90dG9tLXJpZ2h0LiBPdGhlcndpc2UgaXQgc2NhbnMgZnJvbSB0aGUgdG9wLWxlZnQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICpcclxuICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGUgZmlyc3QgKG9yIG4gc2tpcHBlZCkgdGlsZSB3aXRoIHRoZSBtYXRjaGluZyBpbmRleC5cclxuICovXHJcbnZhciBGaW5kQnlJbmRleCA9IGZ1bmN0aW9uIChmaW5kSW5kZXgsIHNraXAsIHJldmVyc2UsIGxheWVyKVxyXG57XHJcbiAgICBpZiAoc2tpcCA9PT0gdW5kZWZpbmVkKSB7IHNraXAgPSAwOyB9XHJcbiAgICBpZiAocmV2ZXJzZSA9PT0gdW5kZWZpbmVkKSB7IHJldmVyc2UgPSBmYWxzZTsgfVxyXG5cclxuICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICB2YXIgdHg7XHJcbiAgICB2YXIgdHk7XHJcbiAgICB2YXIgdGlsZTtcclxuXHJcbiAgICBpZiAocmV2ZXJzZSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHR5ID0gbGF5ZXIuaGVpZ2h0IC0gMTsgdHkgPj0gMDsgdHktLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodHggPSBsYXllci53aWR0aCAtIDE7IHR4ID49IDA7IHR4LS0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpbGUgPSBsYXllci5kYXRhW3R5XVt0eF07XHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmluZGV4ID09PSBmaW5kSW5kZXgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBza2lwKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodHkgPSAwOyB0eSA8IGxheWVyLmhlaWdodDsgdHkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodHggPSAwOyB0eCA8IGxheWVyLndpZHRoOyB0eCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlID0gbGF5ZXIuZGF0YVt0eV1bdHhdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5pbmRleCA9PT0gZmluZEluZGV4KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gc2tpcClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmluZEJ5SW5kZXg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBGaW5kVGlsZUNhbGxiYWNrXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IHZhbHVlIC0gVGhlIFRpbGUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHRpbGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gYXJyYXkgLSBBbiBhcnJheSBvZiBUaWxlIG9iamVjdHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybiBgdHJ1ZWAgaWYgdGhlIGNhbGxiYWNrIHNob3VsZCBydW4sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGaW5kIHRoZSBmaXJzdCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIgdGhhdFxyXG4gKiBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIEkuZS4gZmluZHMgdGhlIGZpcnN0IHRpbGUgZm9yIHdoaWNoIGBjYWxsYmFja2AgcmV0dXJuc1xyXG4gKiB0cnVlLiBTaW1pbGFyIHRvIEFycmF5LnByb3RvdHlwZS5maW5kIGluIHZhbmlsbGEgSlMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5GaW5kVGlsZVxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtGaW5kVGlsZUNhbGxiYWNrfSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay4gRWFjaCB0aWxlIGluIHRoZSBnaXZlbiBhcmVhIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlci5cclxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IHVuZGVyIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gZmlsdGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBmaWx0ZXIuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZpbHRlcmluZ09wdGlvbnMuaXNOb3RFbXB0eT1mYWxzZV0gLSBJZiB0cnVlLCBvbmx5IHJldHVybiB0aWxlcyB0aGF0IGRvbid0IGhhdmUgLTEgZm9yIGFuIGluZGV4LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmaWx0ZXJpbmdPcHRpb25zLmlzQ29sbGlkaW5nPWZhbHNlXSAtIElmIHRydWUsIG9ubHkgcmV0dXJuIHRpbGVzIHRoYXQgY29sbGlkZSBvbiBhdCBsZWFzdCBvbmUgc2lkZS5cclxuICogQHBhcmFtIHtib29sZWFufSBbZmlsdGVyaW5nT3B0aW9ucy5oYXNJbnRlcmVzdGluZ0ZhY2U9ZmFsc2VdIC0gSWYgdHJ1ZSwgb25seSByZXR1cm4gdGlsZXMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSBpbnRlcmVzdGluZyBmYWNlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqXHJcbiAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX0gQSBUaWxlIHRoYXQgbWF0Y2hlcyB0aGUgc2VhcmNoLCBvciBudWxsIGlmIG5vIFRpbGUgZm91bmRcclxuICovXHJcbnZhciBGaW5kVGlsZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcik7XHJcbiAgICByZXR1cm4gdGlsZXMuZmluZChjYWxsYmFjaywgY29udGV4dCkgfHwgbnVsbDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRmluZFRpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG5cclxuLyoqXHJcbiAqIEBjYWxsYmFjayBFYWNoVGlsZUNhbGxiYWNrXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IHZhbHVlIC0gVGhlIFRpbGUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHRpbGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gYXJyYXkgLSBBbiBhcnJheSBvZiBUaWxlIG9iamVjdHMuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEZvciBlYWNoIHRpbGUgaW4gdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZSBsYXllciwgcnVuIHRoZSBnaXZlblxyXG4gKiBjYWxsYmFjay4gU2ltaWxhciB0byBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCBpbiB2YW5pbGxhIEpTLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuRm9yRWFjaFRpbGVcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7RWFjaFRpbGVDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suIEVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHJ1bi5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gZmlsdGVyLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmaWx0ZXJpbmdPcHRpb25zLmlzTm90RW1wdHk9ZmFsc2VdIC0gSWYgdHJ1ZSwgb25seSByZXR1cm4gdGlsZXMgdGhhdCBkb24ndCBoYXZlIC0xIGZvciBhbiBpbmRleC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZmlsdGVyaW5nT3B0aW9ucy5pc0NvbGxpZGluZz1mYWxzZV0gLSBJZiB0cnVlLCBvbmx5IHJldHVybiB0aWxlcyB0aGF0IGNvbGxpZGUgb24gYXQgbGVhc3Qgb25lIHNpZGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZpbHRlcmluZ09wdGlvbnMuaGFzSW50ZXJlc3RpbmdGYWNlPWZhbHNlXSAtIElmIHRydWUsIG9ubHkgcmV0dXJuIHRpbGVzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgaW50ZXJlc3RpbmcgZmFjZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIEZvckVhY2hUaWxlID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKVxyXG57XHJcbiAgICB2YXIgdGlsZXMgPSBHZXRUaWxlc1dpdGhpbih0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKTtcclxuXHJcbiAgICB0aWxlcy5mb3JFYWNoKGNhbGxiYWNrLCBjb250ZXh0KTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRm9yRWFjaFRpbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIElzSW5MYXllckJvdW5kcyA9IHJlcXVpcmUoJy4vSXNJbkxheWVyQm91bmRzJyk7XHJcblxyXG4vKipcclxuICogR2V0cyBhIHRpbGUgYXQgdGhlIGdpdmVuIHRpbGUgY29vcmRpbmF0ZXMgZnJvbSB0aGUgZ2l2ZW4gbGF5ZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5HZXRUaWxlQXRcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBYIHBvc2l0aW9uIHRvIGdldCB0aGUgdGlsZSBmcm9tIChnaXZlbiBpbiB0aWxlIHVuaXRzLCBub3QgcGl4ZWxzKS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFkgcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHRpbGUgdW5pdHMsIG5vdCBwaXhlbHMpLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtub25OdWxsPWZhbHNlXSAtIElmIHRydWUgZ2V0VGlsZSB3b24ndCByZXR1cm4gbnVsbCBmb3IgZW1wdHkgdGlsZXMsIGJ1dCBhIFRpbGUgb2JqZWN0IHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGUgdGlsZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgb3IgbnVsbCBpZiBubyB0aWxlIHdhcyBmb3VuZCBvciB0aGUgY29vcmRpbmF0ZXNcclxuICogd2VyZSBpbnZhbGlkLlxyXG4gKi9cclxudmFyIEdldFRpbGVBdCA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIG5vbk51bGwsIGxheWVyKVxyXG57XHJcbiAgICBpZiAobm9uTnVsbCA9PT0gdW5kZWZpbmVkKSB7IG5vbk51bGwgPSBmYWxzZTsgfVxyXG5cclxuICAgIGlmIChJc0luTGF5ZXJCb3VuZHModGlsZVgsIHRpbGVZLCBsYXllcikpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGUgPSBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF0gfHwgbnVsbDtcclxuICAgICAgICBpZiAodGlsZSA9PT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aWxlLmluZGV4ID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBub25OdWxsID8gdGlsZSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aWxlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0VGlsZUF0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRUaWxlQXQgPSByZXF1aXJlKCcuL0dldFRpbGVBdCcpO1xyXG52YXIgV29ybGRUb1RpbGVYID0gcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVgnKTtcclxudmFyIFdvcmxkVG9UaWxlWSA9IHJlcXVpcmUoJy4vV29ybGRUb1RpbGVZJyk7XHJcblxyXG4vKipcclxuICogR2V0cyBhIHRpbGUgYXQgdGhlIGdpdmVuIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhlIGdpdmVuIGxheWVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuR2V0VGlsZUF0V29ybGRYWVxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFggcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHBpeGVscylcclxuICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFkgcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHBpeGVscylcclxuICogQHBhcmFtIHtib29sZWFufSBbbm9uTnVsbD1mYWxzZV0gLSBJZiB0cnVlLCBmdW5jdGlvbiB3b24ndCByZXR1cm4gbnVsbCBmb3IgZW1wdHkgdGlsZXMsIGJ1dCBhIFRpbGUgb2JqZWN0IHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBUaGUgdGlsZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgb3IgbnVsbCBpZiBubyB0aWxlIHdhcyBmb3VuZCBvciB0aGUgY29vcmRpbmF0ZXNcclxuICogd2VyZSBpbnZhbGlkLlxyXG4gKi9cclxudmFyIEdldFRpbGVBdFdvcmxkWFkgPSBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIG5vbk51bGwsIGNhbWVyYSwgbGF5ZXIpXHJcbntcclxuICAgIHZhciB0aWxlWCA9IFdvcmxkVG9UaWxlWCh3b3JsZFgsIHRydWUsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgdmFyIHRpbGVZID0gV29ybGRUb1RpbGVZKHdvcmxkWSwgdHJ1ZSwgY2FtZXJhLCBsYXllcik7XHJcblxyXG4gICAgcmV0dXJuIEdldFRpbGVBdCh0aWxlWCwgdGlsZVksIG5vbk51bGwsIGxheWVyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0VGlsZUF0V29ybGRYWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpblxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBoZWlnaHQgLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuR2V0VGlsZXNXaXRoaW5GaWx0ZXJpbmdPcHRpb25zfSBHZXRUaWxlc1dpdGhpbkZpbHRlcmluZ09wdGlvbnMgLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICovXHJcbnZhciBHZXRUaWxlc1dpdGhpbiA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGxheWVyKVxyXG57XHJcbiAgICBpZiAodGlsZVggPT09IHVuZGVmaW5lZCkgeyB0aWxlWCA9IDA7IH1cclxuICAgIGlmICh0aWxlWSA9PT0gdW5kZWZpbmVkKSB7IHRpbGVZID0gMDsgfVxyXG4gICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsgd2lkdGggPSBsYXllci53aWR0aDsgfVxyXG4gICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7IGhlaWdodCA9IGxheWVyLmhlaWdodDsgfVxyXG5cclxuICAgIHZhciBpc05vdEVtcHR5ID0gR2V0RmFzdFZhbHVlKGZpbHRlcmluZ09wdGlvbnMsICdpc05vdEVtcHR5JywgZmFsc2UpO1xyXG4gICAgdmFyIGlzQ29sbGlkaW5nID0gR2V0RmFzdFZhbHVlKGZpbHRlcmluZ09wdGlvbnMsICdpc0NvbGxpZGluZycsIGZhbHNlKTtcclxuICAgIHZhciBoYXNJbnRlcmVzdGluZ0ZhY2UgPSBHZXRGYXN0VmFsdWUoZmlsdGVyaW5nT3B0aW9ucywgJ2hhc0ludGVyZXN0aW5nRmFjZScsIGZhbHNlKTtcclxuXHJcbiAgICAvLyBDbGlwIHgsIHkgdG8gdG9wIGxlZnQgb2YgbWFwLCB3aGlsZSBzaHJpbmtpbmcgd2lkdGgvaGVpZ2h0IHRvIG1hdGNoLlxyXG4gICAgaWYgKHRpbGVYIDwgMClcclxuICAgIHtcclxuICAgICAgICB3aWR0aCArPSB0aWxlWDtcclxuICAgICAgICB0aWxlWCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGlsZVkgPCAwKVxyXG4gICAge1xyXG4gICAgICAgIGhlaWdodCArPSB0aWxlWTtcclxuICAgICAgICB0aWxlWSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xpcCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGJvdHRvbSByaWdodCBvZiBtYXAuXHJcbiAgICBpZiAodGlsZVggKyB3aWR0aCA+IGxheWVyLndpZHRoKVxyXG4gICAge1xyXG4gICAgICAgIHdpZHRoID0gTWF0aC5tYXgobGF5ZXIud2lkdGggLSB0aWxlWCwgMCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGlsZVkgKyBoZWlnaHQgPiBsYXllci5oZWlnaHQpXHJcbiAgICB7XHJcbiAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgobGF5ZXIuaGVpZ2h0IC0gdGlsZVksIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXN1bHRzID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgdHkgPSB0aWxlWTsgdHkgPCB0aWxlWSArIGhlaWdodDsgdHkrKylcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0eCA9IHRpbGVYOyB0eCA8IHRpbGVYICsgd2lkdGg7IHR4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdHldW3R4XTtcclxuICAgICAgICAgICAgaWYgKHRpbGUgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5ICYmIHRpbGUuaW5kZXggPT09IC0xKSB7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDb2xsaWRpbmcgJiYgIXRpbGUuY29sbGlkZXMpIHsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmVzdGluZ0ZhY2UgJiYgIXRpbGUuaGFzSW50ZXJlc3RpbmdGYWNlKSB7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFRpbGVzV2l0aGluO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZW9tID0gcmVxdWlyZSgnLi4vLi4vZ2VvbS8nKTtcclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG52YXIgSW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4uLy4uL2dlb20vaW50ZXJzZWN0cy8nKTtcclxudmFyIE5PT1AgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciBUaWxlVG9Xb3JsZFggPSByZXF1aXJlKCcuL1RpbGVUb1dvcmxkWCcpO1xyXG52YXIgVGlsZVRvV29ybGRZID0gcmVxdWlyZSgnLi9UaWxlVG9Xb3JsZFknKTtcclxudmFyIFdvcmxkVG9UaWxlWCA9IHJlcXVpcmUoJy4vV29ybGRUb1RpbGVYJyk7XHJcbnZhciBXb3JsZFRvVGlsZVkgPSByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWScpO1xyXG5cclxudmFyIFRyaWFuZ2xlVG9SZWN0YW5nbGUgPSBmdW5jdGlvbiAodHJpYW5nbGUsIHJlY3QpXHJcbntcclxuICAgIHJldHVybiBJbnRlcnNlY3RzLlJlY3RhbmdsZVRvVHJpYW5nbGUocmVjdCwgdHJpYW5nbGUpO1xyXG59O1xyXG5cclxuLy8gTm90ZTogQ291bGQgcG9zc2libHkgYmUgb3B0aW1pemVkIGJ5IGNvcHlpbmcgdGhlIHNoYXBlIGFuZCBzaGlmdGluZyBpdCBpbnRvIHRpbGVtYXBMYXllclxyXG4vLyBjb29yZGluYXRlcyBpbnN0ZWFkIG9mIHNoaWZ0aW5nIHRoZSB0aWxlcy5cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSB0aWxlcyB0aGF0IG92ZXJsYXAgd2l0aCB0aGUgZ2l2ZW4gc2hhcGUgaW4gdGhlIGdpdmVuIGxheWVyLiBUaGUgc2hhcGUgbXVzdCBiZSBhIENpcmNsZSxcclxuICogTGluZSwgUmVjdGFuZ2xlIG9yIFRyaWFuZ2xlLiBUaGUgc2hhcGUgc2hvdWxkIGJlIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuR2V0VGlsZXNXaXRoaW5TaGFwZVxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLkdlb20uQ2lyY2xlfFBoYXNlci5HZW9tLkxpbmV8UGhhc2VyLkdlb20uUmVjdGFuZ2xlfFBoYXNlci5HZW9tLlRyaWFuZ2xlKX0gc2hhcGUgLSBBIHNoYXBlIGluIHdvcmxkIChwaXhlbCkgY29vcmRpbmF0ZXNcclxuICogQHBhcmFtIHtvYmplY3R9IFtmaWx0ZXJpbmdPcHRpb25zXSAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgd2hlbiBnZXR0aW5nIHRoZSB0aWxlcy5cclxuICogQHBhcmFtIHtib29sZWFufSBbZmlsdGVyaW5nT3B0aW9ucy5pc05vdEVtcHR5PWZhbHNlXSAtIElmIHRydWUsIG9ubHkgcmV0dXJuIHRpbGVzIHRoYXQgZG9uJ3QgaGF2ZSAtMSBmb3IgYW4gaW5kZXguXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZpbHRlcmluZ09wdGlvbnMuaXNDb2xsaWRpbmc9ZmFsc2VdIC0gSWYgdHJ1ZSwgb25seSByZXR1cm4gdGlsZXMgdGhhdCBjb2xsaWRlIG9uIGF0IGxlYXN0IG9uZSBzaWRlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmaWx0ZXJpbmdPcHRpb25zLmhhc0ludGVyZXN0aW5nRmFjZT1mYWxzZV0gLSBJZiB0cnVlLCBvbmx5IHJldHVybiB0aWxlcyB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIGludGVyZXN0aW5nIGZhY2UuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gQXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gKi9cclxudmFyIEdldFRpbGVzV2l0aGluU2hhcGUgPSBmdW5jdGlvbiAoc2hhcGUsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgbGF5ZXIpXHJcbntcclxuICAgIGlmIChzaGFwZSA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxyXG5cclxuICAgIC8vIGludGVyc2VjdFRlc3QgaXMgYSBmdW5jdGlvbiB3aXRoIHBhcmFtZXRlcnM6IHNoYXBlLCByZWN0XHJcbiAgICB2YXIgaW50ZXJzZWN0VGVzdCA9IE5PT1A7XHJcbiAgICBpZiAoc2hhcGUgaW5zdGFuY2VvZiBHZW9tLkNpcmNsZSkgeyBpbnRlcnNlY3RUZXN0ID0gSW50ZXJzZWN0cy5DaXJjbGVUb1JlY3RhbmdsZTsgfVxyXG4gICAgZWxzZSBpZiAoc2hhcGUgaW5zdGFuY2VvZiBHZW9tLlJlY3RhbmdsZSkgeyBpbnRlcnNlY3RUZXN0ID0gSW50ZXJzZWN0cy5SZWN0YW5nbGVUb1JlY3RhbmdsZTsgfVxyXG4gICAgZWxzZSBpZiAoc2hhcGUgaW5zdGFuY2VvZiBHZW9tLlRyaWFuZ2xlKSB7IGludGVyc2VjdFRlc3QgPSBUcmlhbmdsZVRvUmVjdGFuZ2xlOyB9XHJcbiAgICBlbHNlIGlmIChzaGFwZSBpbnN0YW5jZW9mIEdlb20uTGluZSkgeyBpbnRlcnNlY3RUZXN0ID0gSW50ZXJzZWN0cy5MaW5lVG9SZWN0YW5nbGU7IH1cclxuXHJcbiAgICAvLyBUb3AgbGVmdCBjb3JuZXIgb2YgdGhlIHNoYXBlcydzIGJvdW5kaW5nIGJveCwgcm91bmRlZCBkb3duIHRvIGluY2x1ZGUgcGFydGlhbCB0aWxlc1xyXG4gICAgdmFyIHhTdGFydCA9IFdvcmxkVG9UaWxlWChzaGFwZS5sZWZ0LCB0cnVlLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIHZhciB5U3RhcnQgPSBXb3JsZFRvVGlsZVkoc2hhcGUudG9wLCB0cnVlLCBjYW1lcmEsIGxheWVyKTtcclxuXHJcbiAgICAvLyBCb3R0b20gcmlnaHQgY29ybmVyIG9mIHRoZSBzaGFwZXMncyBib3VuZGluZyBib3gsIHJvdW5kZWQgdXAgdG8gaW5jbHVkZSBwYXJ0aWFsIHRpbGVzXHJcbiAgICB2YXIgeEVuZCA9IE1hdGguY2VpbChXb3JsZFRvVGlsZVgoc2hhcGUucmlnaHQsIGZhbHNlLCBjYW1lcmEsIGxheWVyKSk7XHJcbiAgICB2YXIgeUVuZCA9IE1hdGguY2VpbChXb3JsZFRvVGlsZVkoc2hhcGUuYm90dG9tLCBmYWxzZSwgY2FtZXJhLCBsYXllcikpO1xyXG5cclxuICAgIC8vIFRpbGVzIHdpdGhpbiBib3VuZGluZyByZWN0YW5nbGUgb2Ygc2hhcGUuIEJvdW5kcyBhcmUgZm9yY2VkIHRvIGJlIGF0IGxlYXN0IDEgeCAxIHRpbGUgaW4gc2l6ZVxyXG4gICAgLy8gdG8gZ3JhYiB0aWxlcyBmb3Igc2hhcGVzIHRoYXQgZG9uJ3QgaGF2ZSBhIGhlaWdodCBvciB3aWR0aCAoZS5nLiBhIGhvcml6b250YWwgbGluZSkuXHJcbiAgICB2YXIgd2lkdGggPSBNYXRoLm1heCh4RW5kIC0geFN0YXJ0LCAxKTtcclxuICAgIHZhciBoZWlnaHQgPSBNYXRoLm1heCh5RW5kIC0geVN0YXJ0LCAxKTtcclxuICAgIHZhciB0aWxlcyA9IEdldFRpbGVzV2l0aGluKHhTdGFydCwgeVN0YXJ0LCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCBsYXllcik7XHJcblxyXG4gICAgdmFyIHRpbGVXaWR0aCA9IGxheWVyLnRpbGVXaWR0aDtcclxuICAgIHZhciB0aWxlSGVpZ2h0ID0gbGF5ZXIudGlsZUhlaWdodDtcclxuICAgIGlmIChsYXllci50aWxlbWFwTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgdGlsZVdpZHRoICo9IGxheWVyLnRpbGVtYXBMYXllci5zY2FsZVg7XHJcbiAgICAgICAgdGlsZUhlaWdodCAqPSBsYXllci50aWxlbWFwTGF5ZXIuc2NhbGVZO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXN1bHRzID0gW107XHJcbiAgICB2YXIgdGlsZVJlY3QgPSBuZXcgR2VvbS5SZWN0YW5nbGUoMCwgMCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbGUgPSB0aWxlc1tpXTtcclxuICAgICAgICB0aWxlUmVjdC54ID0gVGlsZVRvV29ybGRYKHRpbGUueCwgY2FtZXJhLCBsYXllcik7XHJcbiAgICAgICAgdGlsZVJlY3QueSA9IFRpbGVUb1dvcmxkWSh0aWxlLnksIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgICAgIGlmIChpbnRlcnNlY3RUZXN0KHNoYXBlLCB0aWxlUmVjdCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUaWxlc1dpdGhpblNoYXBlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRUaWxlc1dpdGhpbiA9IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW4nKTtcclxudmFyIFdvcmxkVG9UaWxlWCA9IHJlcXVpcmUoJy4vV29ybGRUb1RpbGVYJyk7XHJcbnZhciBXb3JsZFRvVGlsZVkgPSByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWScpO1xyXG5cclxuLyoqXHJcbiAqIEdldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB3b3JsZCBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuR2V0VGlsZXNXaXRoaW5Xb3JsZFhZXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHdvcmxkIHggY29vcmRpbmF0ZSBmb3IgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIHdvcmxkIHkgY29vcmRpbmF0ZSBmb3IgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmaWx0ZXJpbmdPcHRpb25zLmlzTm90RW1wdHk9ZmFsc2VdIC0gSWYgdHJ1ZSwgb25seSByZXR1cm4gdGlsZXMgdGhhdCBkb24ndCBoYXZlIC0xIGZvciBhbiBpbmRleC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZmlsdGVyaW5nT3B0aW9ucy5pc0NvbGxpZGluZz1mYWxzZV0gLSBJZiB0cnVlLCBvbmx5IHJldHVybiB0aWxlcyB0aGF0IGNvbGxpZGUgb24gYXQgbGVhc3Qgb25lIHNpZGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZpbHRlcmluZ09wdGlvbnMuaGFzSW50ZXJlc3RpbmdGYWNlPWZhbHNlXSAtIElmIHRydWUsIG9ubHkgcmV0dXJuIHRpbGVzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgaW50ZXJlc3RpbmcgZmFjZS5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICovXHJcbnZhciBHZXRUaWxlc1dpdGhpbldvcmxkWFkgPSBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgbGF5ZXIpXHJcbntcclxuICAgIC8vIFRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdCwgcm91bmRlZCBkb3duIHRvIGluY2x1ZGUgcGFydGlhbCB0aWxlc1xyXG4gICAgdmFyIHhTdGFydCA9IFdvcmxkVG9UaWxlWCh3b3JsZFgsIHRydWUsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgdmFyIHlTdGFydCA9IFdvcmxkVG9UaWxlWSh3b3JsZFksIHRydWUsIGNhbWVyYSwgbGF5ZXIpO1xyXG5cclxuICAgIC8vIEJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHJlY3QsIHJvdW5kZWQgdXAgdG8gaW5jbHVkZSBwYXJ0aWFsIHRpbGVzXHJcbiAgICB2YXIgeEVuZCA9IE1hdGguY2VpbChXb3JsZFRvVGlsZVgod29ybGRYICsgd2lkdGgsIGZhbHNlLCBjYW1lcmEsIGxheWVyKSk7XHJcbiAgICB2YXIgeUVuZCA9IE1hdGguY2VpbChXb3JsZFRvVGlsZVkod29ybGRZICsgaGVpZ2h0LCBmYWxzZSwgY2FtZXJhLCBsYXllcikpO1xyXG5cclxuICAgIHJldHVybiBHZXRUaWxlc1dpdGhpbih4U3RhcnQsIHlTdGFydCwgeEVuZCAtIHhTdGFydCwgeUVuZCAtIHlTdGFydCwgZmlsdGVyaW5nT3B0aW9ucywgbGF5ZXIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUaWxlc1dpdGhpbldvcmxkWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIElzSW5MYXllckJvdW5kcyA9IHJlcXVpcmUoJy4vSXNJbkxheWVyQm91bmRzJyk7XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gKGluIHRpbGUgY29vcmRpbmF0ZXMpIGluIHRoZSBnaXZlbiBsYXllci4gUmV0dXJuc1xyXG4gKiBmYWxzZSBpZiB0aGVyZSBpcyBubyB0aWxlIG9yIGlmIHRoZSB0aWxlIGF0IHRoYXQgbG9jYXRpb24gaGFzIGFuIGluZGV4IG9mIC0xLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuSGFzVGlsZUF0XHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gWCBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSAoZ2l2ZW4gaW4gdGlsZSB1bml0cywgbm90IHBpeGVscykuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBZIHBvc2l0aW9uIHRvIGdldCB0aGUgdGlsZSBmcm9tIChnaXZlbiBpbiB0aWxlIHVuaXRzLCBub3QgcGl4ZWxzKS5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKiBcclxuICogQHJldHVybiB7P2Jvb2xlYW59IFJldHVybnMgYSBib29sZWFuLCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICovXHJcbnZhciBIYXNUaWxlQXQgPSBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCBsYXllcilcclxue1xyXG4gICAgaWYgKElzSW5MYXllckJvdW5kcyh0aWxlWCwgdGlsZVksIGxheWVyKSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdGlsZVldW3RpbGVYXTtcclxuICAgICAgICByZXR1cm4gKHRpbGUgIT09IG51bGwgJiYgdGlsZS5pbmRleCA+IC0xKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIYXNUaWxlQXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEhhc1RpbGVBdCA9IHJlcXVpcmUoJy4vSGFzVGlsZUF0Jyk7XHJcbnZhciBXb3JsZFRvVGlsZVggPSByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWCcpO1xyXG52YXIgV29ybGRUb1RpbGVZID0gcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVknKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlcmUgaXMgYSB0aWxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiAoaW4gd29ybGQgY29vcmRpbmF0ZXMpIGluIHRoZSBnaXZlbiBsYXllci4gUmV0dXJuc1xyXG4gKiBmYWxzZSBpZiB0aGVyZSBpcyBubyB0aWxlIG9yIGlmIHRoZSB0aWxlIGF0IHRoYXQgbG9jYXRpb24gaGFzIGFuIGluZGV4IG9mIC0xLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuSGFzVGlsZUF0V29ybGRYWVxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHdvcmxkIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgd29ybGQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBmYWN0b3JpbmcgaW4gd2hpY2ggdGlsZXMgdG8gcmV0dXJuLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqIFxyXG4gKiBAcmV0dXJuIHs/Ym9vbGVhbn0gUmV0dXJucyBhIGJvb2xlYW4sIG9yIG51bGwgaWYgdGhlIGxheWVyIGdpdmVuIHdhcyBpbnZhbGlkLlxyXG4gKi9cclxudmFyIEhhc1RpbGVBdFdvcmxkWFkgPSBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIGNhbWVyYSwgbGF5ZXIpXHJcbntcclxuICAgIHZhciB0aWxlWCA9IFdvcmxkVG9UaWxlWCh3b3JsZFgsIHRydWUsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgdmFyIHRpbGVZID0gV29ybGRUb1RpbGVZKHdvcmxkWSwgdHJ1ZSwgY2FtZXJhLCBsYXllcik7XHJcblxyXG4gICAgcmV0dXJuIEhhc1RpbGVBdCh0aWxlWCwgdGlsZVksIGxheWVyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSGFzVGlsZUF0V29ybGRYWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgbGF5ZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5Jc0luTGF5ZXJCb3VuZHNcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqIFxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHRpbGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBsYXllciwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAqL1xyXG52YXIgSXNJbkxheWVyQm91bmRzID0gZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgbGF5ZXIpXHJcbntcclxuICAgIHJldHVybiAodGlsZVggPj0gMCAmJiB0aWxlWCA8IGxheWVyLndpZHRoICYmIHRpbGVZID49IDAgJiYgdGlsZVkgPCBsYXllci5oZWlnaHQpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBJc0luTGF5ZXJCb3VuZHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFRpbGUgPSByZXF1aXJlKCcuLi9UaWxlJyk7XHJcbnZhciBJc0luTGF5ZXJCb3VuZHMgPSByZXF1aXJlKCcuL0lzSW5MYXllckJvdW5kcycpO1xyXG52YXIgQ2FsY3VsYXRlRmFjZXNBdCA9IHJlcXVpcmUoJy4vQ2FsY3VsYXRlRmFjZXNBdCcpO1xyXG52YXIgU2V0VGlsZUNvbGxpc2lvbiA9IHJlcXVpcmUoJy4vU2V0VGlsZUNvbGxpc2lvbicpO1xyXG5cclxuLyoqXHJcbiAqIFB1dHMgYSB0aWxlIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIuIFlvdSBjYW4gcGFzcyBpbiBlaXRoZXIgYW4gaW5kZXhcclxuICogb3IgYSBUaWxlIG9iamVjdC4gSWYgeW91IHBhc3MgaW4gYSBUaWxlLCBhbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCBvdmVyIHRvIHRoZSBzcGVjaWZpZWRcclxuICogbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZSBpbmRleCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpbGwgYmUgY2hhbmdlZC5cclxuICogQ29sbGlzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5QdXRUaWxlQXRcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLlRpbGUpfSB0aWxlIC0gVGhlIGluZGV4IG9mIHRoaXMgdGlsZSB0byBzZXQgb3IgYSBUaWxlIG9iamVjdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gVGhlIFRpbGUgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQgb3IgYWRkZWQgdG8gdGhpcyBtYXAuXHJcbiAqL1xyXG52YXIgUHV0VGlsZUF0ID0gZnVuY3Rpb24gKHRpbGUsIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmICghSXNJbkxheWVyQm91bmRzKHRpbGVYLCB0aWxlWSwgbGF5ZXIpKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcyA9PT0gdW5kZWZpbmVkKSB7IHJlY2FsY3VsYXRlRmFjZXMgPSB0cnVlOyB9XHJcblxyXG4gICAgdmFyIG9sZFRpbGUgPSBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF07XHJcbiAgICB2YXIgb2xkVGlsZUNvbGxpZGVzID0gb2xkVGlsZSAmJiBvbGRUaWxlLmNvbGxpZGVzO1xyXG5cclxuICAgIGlmICh0aWxlIGluc3RhbmNlb2YgVGlsZSlcclxuICAgIHtcclxuICAgICAgICBpZiAobGF5ZXIuZGF0YVt0aWxlWV1bdGlsZVhdID09PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGF5ZXIuZGF0YVt0aWxlWV1bdGlsZVhdID0gbmV3IFRpbGUobGF5ZXIsIHRpbGUuaW5kZXgsIHRpbGVYLCB0aWxlWSwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF0uY29weSh0aWxlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXggPSB0aWxlO1xyXG4gICAgICAgIGlmIChsYXllci5kYXRhW3RpbGVZXVt0aWxlWF0gPT09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF0gPSBuZXcgVGlsZShsYXllciwgaW5kZXgsIHRpbGVYLCB0aWxlWSwgbGF5ZXIudGlsZVdpZHRoLCBsYXllci50aWxlSGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGF5ZXIuZGF0YVt0aWxlWV1bdGlsZVhdLmluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0aW5nIGNvbGxpZGluZyBmbGFnIG9uIHRoZSBuZXcgdGlsZVxyXG4gICAgdmFyIG5ld1RpbGUgPSBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF07XHJcbiAgICB2YXIgY29sbGlkZXMgPSBsYXllci5jb2xsaWRlSW5kZXhlcy5pbmRleE9mKG5ld1RpbGUuaW5kZXgpICE9PSAtMTtcclxuICAgIFNldFRpbGVDb2xsaXNpb24obmV3VGlsZSwgY29sbGlkZXMpO1xyXG5cclxuICAgIC8vIFJlY2FsY3VsYXRlIGZhY2VzIG9ubHkgaWYgdGhlIGNvbGxpZGluZyBmbGFnIGF0ICh0aWxlWCwgdGlsZVkpIGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcyAmJiAob2xkVGlsZUNvbGxpZGVzICE9PSBuZXdUaWxlLmNvbGxpZGVzKSlcclxuICAgIHtcclxuICAgICAgICBDYWxjdWxhdGVGYWNlc0F0KHRpbGVYLCB0aWxlWSwgbGF5ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdUaWxlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQdXRUaWxlQXQ7XHJcblxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQdXRUaWxlQXQgPSByZXF1aXJlKCcuL1B1dFRpbGVBdCcpO1xyXG52YXIgV29ybGRUb1RpbGVYID0gcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVgnKTtcclxudmFyIFdvcmxkVG9UaWxlWSA9IHJlcXVpcmUoJy4vV29ybGRUb1RpbGVZJyk7XHJcblxyXG4vKipcclxuICogUHV0cyBhIHRpbGUgYXQgdGhlIGdpdmVuIHdvcmxkIGNvb3JkaW5hdGVzIChwaXhlbHMpIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIuIFlvdSBjYW4gcGFzcyBpbiBlaXRoZXJcclxuICogYW4gaW5kZXggb3IgYSBUaWxlIG9iamVjdC4gSWYgeW91IHBhc3MgaW4gYSBUaWxlLCBhbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCBvdmVyIHRvIHRoZVxyXG4gKiBzcGVjaWZpZWQgbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZSBpbmRleCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpbGwgYmVcclxuICogY2hhbmdlZC4gQ29sbGlzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5QdXRUaWxlQXRXb3JsZFhZXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhpbnRlZ2VyfFBoYXNlci5UaWxlbWFwcy5UaWxlKX0gdGlsZSAtIFRoZSBpbmRleCBvZiB0aGlzIHRpbGUgdG8gc2V0IG9yIGEgVGlsZSBvYmplY3QuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gVGhlIFRpbGUgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQgb3IgYWRkZWQgdG8gdGhpcyBtYXAuXHJcbiAqL1xyXG52YXIgUHV0VGlsZUF0V29ybGRYWSA9IGZ1bmN0aW9uICh0aWxlLCB3b3JsZFgsIHdvcmxkWSwgcmVjYWxjdWxhdGVGYWNlcywgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVYID0gV29ybGRUb1RpbGVYKHdvcmxkWCwgdHJ1ZSwgY2FtZXJhLCBsYXllcik7XHJcbiAgICB2YXIgdGlsZVkgPSBXb3JsZFRvVGlsZVkod29ybGRZLCB0cnVlLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIHJldHVybiBQdXRUaWxlQXQodGlsZSwgdGlsZVgsIHRpbGVZLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcik7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFB1dFRpbGVBdFdvcmxkWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENhbGN1bGF0ZUZhY2VzV2l0aGluID0gcmVxdWlyZSgnLi9DYWxjdWxhdGVGYWNlc1dpdGhpbicpO1xyXG52YXIgUHV0VGlsZUF0ID0gcmVxdWlyZSgnLi9QdXRUaWxlQXQnKTtcclxuXHJcbi8qKlxyXG4gKiBQdXRzIGFuIGFycmF5IG9mIHRpbGVzIG9yIGEgMkQgYXJyYXkgb2YgdGlsZXMgYXQgdGhlIGdpdmVuIHRpbGUgY29vcmRpbmF0ZXMgaW4gdGhlIHNwZWNpZmllZFxyXG4gKiBsYXllci4gVGhlIGFycmF5IGNhbiBiZSBjb21wb3NlZCBvZiBlaXRoZXIgdGlsZSBpbmRleGVzIG9yIFRpbGUgb2JqZWN0cy4gSWYgeW91IHBhc3MgaW4gYSBUaWxlLFxyXG4gKiBhbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCBvdmVyIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZVxyXG4gKiBpbmRleCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpbGwgYmUgY2hhbmdlZC4gQ29sbGlzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVjYWxjdWxhdGVkXHJcbiAqIHdpdGhpbiB0aGUgcmVnaW9uIHRpbGVzIHdlcmUgY2hhbmdlZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlB1dFRpbGVzQXRcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGludGVnZXJbXXxpbnRlZ2VyW11bXXxQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfFBoYXNlci5UaWxlbWFwcy5UaWxlW11bXSl9IHRpbGUgLSBBIHJvdyAoYXJyYXkpIG9yIGdyaWQgKDJEIGFycmF5KSBvZiBUaWxlcyBvciB0aWxlIGluZGV4ZXMgdG8gcGxhY2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICovXHJcbnZhciBQdXRUaWxlc0F0ID0gZnVuY3Rpb24gKHRpbGVzQXJyYXksIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aWxlc0FycmF5KSkgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgIC8vIEZvcmNlIHRoZSBpbnB1dCBhcnJheSB0byBiZSBhIDJEIGFycmF5XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGlsZXNBcnJheVswXSkpXHJcbiAgICB7XHJcbiAgICAgICAgdGlsZXNBcnJheSA9IFsgdGlsZXNBcnJheSBdO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBoZWlnaHQgPSB0aWxlc0FycmF5Lmxlbmd0aDtcclxuICAgIHZhciB3aWR0aCA9IHRpbGVzQXJyYXlbMF0ubGVuZ3RoO1xyXG5cclxuICAgIGZvciAodmFyIHR5ID0gMDsgdHkgPCBoZWlnaHQ7IHR5KyspXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgdHggPSAwOyB0eCA8IHdpZHRoOyB0eCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGUgPSB0aWxlc0FycmF5W3R5XVt0eF07XHJcbiAgICAgICAgICAgIFB1dFRpbGVBdCh0aWxlLCB0aWxlWCArIHR4LCB0aWxlWSArIHR5LCBmYWxzZSwgbGF5ZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgZmFjZXMgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBhcmVhIGFuZCBuZWlnaGJvcmluZyB0aWxlc1xyXG4gICAgICAgIENhbGN1bGF0ZUZhY2VzV2l0aGluKHRpbGVYIC0gMSwgdGlsZVkgLSAxLCB3aWR0aCArIDIsIGhlaWdodCArIDIsIGxheWVyKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUHV0VGlsZXNBdDtcclxuXHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG52YXIgR2V0UmFuZG9tID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvYXJyYXkvR2V0UmFuZG9tJyk7XHJcblxyXG4vKipcclxuICogUmFuZG9taXplcyB0aGUgaW5kZXhlcyBvZiBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiB0aWxlcyAoaW4gdGlsZSBjb29yZGluYXRlcykgd2l0aGluIHRoZVxyXG4gKiBzcGVjaWZpZWQgbGF5ZXIuIEVhY2ggdGlsZSB3aWxsIHJlY2VpdmUgYSBuZXcgaW5kZXguIElmIGFuIGFycmF5IG9mIGluZGV4ZXMgaXMgcGFzc2VkIGluLCB0aGVuXHJcbiAqIHRob3NlIHdpbGwgYmUgdXNlZCBmb3IgcmFuZG9tbHkgYXNzaWduaW5nIG5ldyB0aWxlIGluZGV4ZXMuIElmIGFuIGFycmF5IGlzIG5vdCBwcm92aWRlZCwgdGhlXHJcbiAqIGluZGV4ZXMgZm91bmQgd2l0aGluIHRoZSByZWdpb24gKGV4Y2x1ZGluZyAtMSkgd2lsbCBiZSB1c2VkIGZvciByYW5kb21seSBhc3NpZ25pbmcgbmV3IHRpbGVcclxuICogaW5kZXhlcy4gVGhpcyBtZXRob2Qgb25seSBtb2RpZmllcyB0aWxlIGluZGV4ZXMgYW5kIGRvZXMgbm90IGNoYW5nZSBjb2xsaXNpb24gaW5mb3JtYXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5SYW5kb21pemVcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcltdfSBbaW5kZXhlc10gLSBBbiBhcnJheSBvZiBpbmRleGVzIHRvIHJhbmRvbWx5IGRyYXcgZnJvbSBkdXJpbmcgcmFuZG9taXphdGlvbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIFJhbmRvbWl6ZSA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGluZGV4ZXMsIGxheWVyKVxyXG57XHJcbiAgICB2YXIgaTtcclxuICAgIHZhciB0aWxlcyA9IEdldFRpbGVzV2l0aGluKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgbGF5ZXIpO1xyXG5cclxuICAgIC8vIElmIG5vIGluZGljZXMgYXJlIGdpdmVuLCB0aGVuIGZpbmQgYWxsIHRoZSB1bmlxdWUgaW5kZXhlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWdpb25cclxuICAgIGlmIChpbmRleGVzID09PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgaW5kZXhlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChpbmRleGVzLmluZGV4T2YodGlsZXNbaV0uaW5kZXgpID09PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKHRpbGVzW2ldLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdGlsZXNbaV0uaW5kZXggPSBHZXRSYW5kb20oaW5kZXhlcyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmRvbWl6ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVGlsZSA9IHJlcXVpcmUoJy4uL1RpbGUnKTtcclxudmFyIElzSW5MYXllckJvdW5kcyA9IHJlcXVpcmUoJy4vSXNJbkxheWVyQm91bmRzJyk7XHJcbnZhciBDYWxjdWxhdGVGYWNlc0F0ID0gcmVxdWlyZSgnLi9DYWxjdWxhdGVGYWNlc0F0Jyk7XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyB0aGUgdGlsZSBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBpbiB0aGUgc3BlY2lmaWVkIGxheWVyIGFuZCB1cGRhdGVzIHRoZSBsYXllcidzXHJcbiAqIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlJlbW92ZVRpbGVBdFxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYWNlV2l0aE51bGw9dHJ1ZV0gLSBJZiB0cnVlLCB0aGlzIHdpbGwgcmVwbGFjZSB0aGUgdGlsZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggbnVsbCBpbnN0ZWFkIG9mIGEgVGlsZSB3aXRoIGFuIGluZGV4IG9mIC0xLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gYHRydWVgIGlmIHRoZSBmYWNlcyBkYXRhIHNob3VsZCBiZSByZWNhbGN1bGF0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICpcclxuICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoZSBUaWxlIG9iamVjdCB0aGF0IHdhcyByZW1vdmVkLlxyXG4gKi9cclxudmFyIFJlbW92ZVRpbGVBdCA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHJlcGxhY2VXaXRoTnVsbCwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmIChyZXBsYWNlV2l0aE51bGwgPT09IHVuZGVmaW5lZCkgeyByZXBsYWNlV2l0aE51bGwgPSBmYWxzZTsgfVxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgIGlmICghSXNJbkxheWVyQm91bmRzKHRpbGVYLCB0aWxlWSwgbGF5ZXIpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciB0aWxlID0gbGF5ZXIuZGF0YVt0aWxlWV1bdGlsZVhdO1xyXG5cclxuICAgIGlmICghdGlsZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBsYXllci5kYXRhW3RpbGVZXVt0aWxlWF0gPSAocmVwbGFjZVdpdGhOdWxsKSA/IG51bGwgOiBuZXcgVGlsZShsYXllciwgLTEsIHRpbGVYLCB0aWxlWSwgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBSZWNhbGN1bGF0ZSBmYWNlcyBvbmx5IGlmIHRoZSByZW1vdmVkIHRpbGUgd2FzIGEgY29sbGlkaW5nIHRpbGVcclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzICYmIHRpbGUgJiYgdGlsZS5jb2xsaWRlcylcclxuICAgIHtcclxuICAgICAgICBDYWxjdWxhdGVGYWNlc0F0KHRpbGVYLCB0aWxlWSwgbGF5ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aWxlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZW1vdmVUaWxlQXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJlbW92ZVRpbGVBdCA9IHJlcXVpcmUoJy4vUmVtb3ZlVGlsZUF0Jyk7XHJcbnZhciBXb3JsZFRvVGlsZVggPSByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWCcpO1xyXG52YXIgV29ybGRUb1RpbGVZID0gcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVknKTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIHRoZSB0aWxlIGF0IHRoZSBnaXZlbiB3b3JsZCBjb29yZGluYXRlcyBpbiB0aGUgc3BlY2lmaWVkIGxheWVyIGFuZCB1cGRhdGVzIHRoZSBsYXllcidzXHJcbiAqIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlJlbW92ZVRpbGVBdFdvcmxkWFlcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlcGxhY2VXaXRoTnVsbD10cnVlXSAtIElmIHRydWUsIHRoaXMgd2lsbCByZXBsYWNlIHRoZSB0aWxlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCBudWxsIGluc3RlYWQgb2YgYSBUaWxlIHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gVGhlIFRpbGUgb2JqZWN0IHRoYXQgd2FzIHJlbW92ZWQuXHJcbiAqL1xyXG52YXIgUmVtb3ZlVGlsZUF0V29ybGRYWSA9IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgcmVwbGFjZVdpdGhOdWxsLCByZWNhbGN1bGF0ZUZhY2VzLCBjYW1lcmEsIGxheWVyKVxyXG57XHJcbiAgICB2YXIgdGlsZVggPSBXb3JsZFRvVGlsZVgod29ybGRYLCB0cnVlLCBjYW1lcmEsIGxheWVyKTtcclxuICAgIHZhciB0aWxlWSA9IFdvcmxkVG9UaWxlWSh3b3JsZFksIHRydWUsIGNhbWVyYSwgbGF5ZXIpO1xyXG4gICAgcmV0dXJuIFJlbW92ZVRpbGVBdCh0aWxlWCwgdGlsZVksIHJlcGxhY2VXaXRoTnVsbCwgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZW1vdmVUaWxlQXRXb3JsZFhZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRUaWxlc1dpdGhpbiA9IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW4nKTtcclxudmFyIENvbG9yID0gcmVxdWlyZSgnLi4vLi4vZGlzcGxheS9jb2xvcicpO1xyXG5cclxudmFyIGRlZmF1bHRUaWxlQ29sb3IgPSBuZXcgQ29sb3IoMTA1LCAyMTAsIDIzMSwgMTUwKTtcclxudmFyIGRlZmF1bHRDb2xsaWRpbmdUaWxlQ29sb3IgPSBuZXcgQ29sb3IoMjQzLCAxMzQsIDQ4LCAyMDApO1xyXG52YXIgZGVmYXVsdEZhY2VDb2xvciA9IG5ldyBDb2xvcig0MCwgMzksIDM3LCAxNTApO1xyXG5cclxuLyoqXHJcbiAqIERyYXdzIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxheWVyIHRvIHRoZSBnaXZlbiBHcmFwaGljcy4gVGhpcyBpcyBoZWxwZnVsIHdoZW4geW91IHdhbnQgdG9cclxuICogZ2V0IGEgcXVpY2sgaWRlYSBvZiB3aGljaCBvZiB5b3VyIHRpbGVzIGFyZSBjb2xsaWRpbmcgYW5kIHdoaWNoIGhhdmUgaW50ZXJlc3RpbmcgZmFjZXMuIFRoZSB0aWxlc1xyXG4gKiBhcmUgZHJhd24gc3RhcnRpbmcgYXQgKDAsIDApIGluIHRoZSBHcmFwaGljcywgYWxsb3dpbmcgeW91IHRvIHBsYWNlIHRoZSBkZWJ1ZyByZXByZXNlbnRhdGlvblxyXG4gKiB3aGVyZXZlciB5b3Ugd2FudCBvbiB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuUmVuZGVyRGVidWdcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSB0YXJnZXQgR3JhcGhpY3Mgb2JqZWN0IHRvIGRyYXcgdXBvbi5cclxuICogQHBhcmFtIHtvYmplY3R9IHN0eWxlQ29uZmlnIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGNvbG9ycyB0byB1c2UgZm9yIHRoZSBkZWJ1ZyBkcmF3aW5nLlxyXG4gKiBAcGFyYW0gez9QaGFzZXIuRGlzcGxheS5Db2xvcn0gW3N0eWxlQ29uZmlnLnRpbGVDb2xvcj1ibHVlXSAtIENvbG9yIHRvIHVzZSBmb3IgZHJhd2luZyBhIGZpbGxlZCByZWN0YW5nbGUgYXRcclxuICogbm9uLWNvbGxpZGluZyB0aWxlIGxvY2F0aW9ucy4gSWYgc2V0IHRvIG51bGwsIG5vbi1jb2xsaWRpbmcgdGlsZXMgd2lsbCBub3QgYmUgZHJhd24uXHJcbiAqIEBwYXJhbSB7P1BoYXNlci5EaXNwbGF5LkNvbG9yfSBbc3R5bGVDb25maWcuY29sbGlkaW5nVGlsZUNvbG9yPW9yYW5nZV0gLSBDb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBmaWxsZWRcclxuICogcmVjdGFuZ2xlIGF0IGNvbGxpZGluZyB0aWxlIGxvY2F0aW9ucy4gSWYgc2V0IHRvIG51bGwsIGNvbGxpZGluZyB0aWxlcyB3aWxsIG5vdCBiZSBkcmF3bi5cclxuICogQHBhcmFtIHs/UGhhc2VyLkRpc3BsYXkuQ29sb3J9IFtzdHlsZUNvbmZpZy5mYWNlQ29sb3I9Z3JleV0gLSBDb2xvciB0byB1c2UgZm9yIGRyYXdpbmcgYSBsaW5lIGF0IGludGVyZXN0aW5nXHJcbiAqIHRpbGUgZmFjZXMuIElmIHNldCB0byBudWxsLCBpbnRlcmVzdGluZyB0aWxlIGZhY2VzIHdpbGwgbm90IGJlIGRyYXduLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgUmVuZGVyRGVidWcgPSBmdW5jdGlvbiAoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnLCBsYXllcilcclxue1xyXG4gICAgaWYgKHN0eWxlQ29uZmlnID09PSB1bmRlZmluZWQpIHsgc3R5bGVDb25maWcgPSB7fTsgfVxyXG5cclxuICAgIC8vIERlZmF1bHQgY29sb3JzIHdpdGhvdXQgbmVlZGxlc3NseSBjcmVhdGluZyBDb2xvciBvYmplY3RzXHJcbiAgICB2YXIgdGlsZUNvbG9yID0gKHN0eWxlQ29uZmlnLnRpbGVDb2xvciAhPT0gdW5kZWZpbmVkKSA/IHN0eWxlQ29uZmlnLnRpbGVDb2xvciA6IGRlZmF1bHRUaWxlQ29sb3I7XHJcbiAgICB2YXIgY29sbGlkaW5nVGlsZUNvbG9yID0gKHN0eWxlQ29uZmlnLmNvbGxpZGluZ1RpbGVDb2xvciAhPT0gdW5kZWZpbmVkKSA/IHN0eWxlQ29uZmlnLmNvbGxpZGluZ1RpbGVDb2xvciA6IGRlZmF1bHRDb2xsaWRpbmdUaWxlQ29sb3I7XHJcbiAgICB2YXIgZmFjZUNvbG9yID0gKHN0eWxlQ29uZmlnLmZhY2VDb2xvciAhPT0gdW5kZWZpbmVkKSA/IHN0eWxlQ29uZmlnLmZhY2VDb2xvciA6IGRlZmF1bHRGYWNlQ29sb3I7XHJcblxyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4oMCwgMCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbnVsbCwgbGF5ZXIpO1xyXG5cclxuICAgIGdyYXBoaWNzLnRyYW5zbGF0ZUNhbnZhcyhsYXllci50aWxlbWFwTGF5ZXIueCwgbGF5ZXIudGlsZW1hcExheWVyLnkpO1xyXG4gICAgZ3JhcGhpY3Muc2NhbGVDYW52YXMobGF5ZXIudGlsZW1hcExheWVyLnNjYWxlWCwgbGF5ZXIudGlsZW1hcExheWVyLnNjYWxlWSk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgdGlsZSA9IHRpbGVzW2ldO1xyXG5cclxuICAgICAgICB2YXIgdHcgPSB0aWxlLndpZHRoO1xyXG4gICAgICAgIHZhciB0aCA9IHRpbGUuaGVpZ2h0O1xyXG4gICAgICAgIHZhciB4ID0gdGlsZS5waXhlbFg7XHJcbiAgICAgICAgdmFyIHkgPSB0aWxlLnBpeGVsWTtcclxuXHJcbiAgICAgICAgdmFyIGNvbG9yID0gdGlsZS5jb2xsaWRlcyA/IGNvbGxpZGluZ1RpbGVDb2xvciA6IHRpbGVDb2xvcjtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yICE9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFN0eWxlKGNvbG9yLmNvbG9yLCBjb2xvci5hbHBoYSAvIDI1NSk7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0KHgsIHksIHR3LCB0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbnNldCB0aGUgZmFjZSBsaW5lIHRvIHByZXZlbnQgbmVpZ2hib3JpbmcgdGlsZSdzIGxpbmVzIGZyb20gb3ZlcmxhcHBpbmdcclxuICAgICAgICB4ICs9IDE7XHJcbiAgICAgICAgeSArPSAxO1xyXG4gICAgICAgIHR3IC09IDI7XHJcbiAgICAgICAgdGggLT0gMjtcclxuXHJcbiAgICAgICAgaWYgKGZhY2VDb2xvciAhPT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdyYXBoaWNzLmxpbmVTdHlsZSgxLCBmYWNlQ29sb3IuY29sb3IsIGZhY2VDb2xvci5hbHBoYSAvIDI1NSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZS5mYWNlVG9wKSB7IGdyYXBoaWNzLmxpbmVCZXR3ZWVuKHgsIHksIHggKyB0dywgeSk7IH1cclxuICAgICAgICAgICAgaWYgKHRpbGUuZmFjZVJpZ2h0KSB7IGdyYXBoaWNzLmxpbmVCZXR3ZWVuKHggKyB0dywgeSwgeCArIHR3LCB5ICsgdGgpOyB9XHJcbiAgICAgICAgICAgIGlmICh0aWxlLmZhY2VCb3R0b20pIHsgZ3JhcGhpY3MubGluZUJldHdlZW4oeCwgeSArIHRoLCB4ICsgdHcsIHkgKyB0aCk7IH1cclxuICAgICAgICAgICAgaWYgKHRpbGUuZmFjZUxlZnQpIHsgZ3JhcGhpY3MubGluZUJldHdlZW4oeCwgeSwgeCwgeSArIHRoKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVuZGVyRGVidWc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG5cclxuLyoqXHJcbiAqIFNjYW5zIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChnaXZlbiBpbiB0aWxlIGNvb3JkaW5hdGVzKSBmb3IgdGlsZXMgd2l0aCBhbiBpbmRleCBtYXRjaGluZ1xyXG4gKiBgZmluZEluZGV4YCBhbmQgdXBkYXRlcyB0aGVpciBpbmRleCB0byBtYXRjaCBgbmV3SW5kZXhgLiBUaGlzIG9ubHkgbW9kaWZpZXMgdGhlIGluZGV4IGFuZCBkb2VzXHJcbiAqIG5vdCBjaGFuZ2UgY29sbGlzaW9uIGluZm9ybWF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuUmVwbGFjZUJ5SW5kZXhcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZmluZEluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSB0aWxlIHRvIHNlYXJjaCBmb3IuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gbmV3SW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHRpbGUgdG8gcmVwbGFjZSBpdCB3aXRoLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgUmVwbGFjZUJ5SW5kZXggPSBmdW5jdGlvbiAoZmluZEluZGV4LCBuZXdJbmRleCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBudWxsLCBsYXllcik7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpZiAodGlsZXNbaV0gJiYgdGlsZXNbaV0uaW5kZXggPT09IGZpbmRJbmRleClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpbGVzW2ldLmluZGV4ID0gbmV3SW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZXBsYWNlQnlJbmRleDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU2V0VGlsZUNvbGxpc2lvbiA9IHJlcXVpcmUoJy4vU2V0VGlsZUNvbGxpc2lvbicpO1xyXG52YXIgQ2FsY3VsYXRlRmFjZXNXaXRoaW4gPSByZXF1aXJlKCcuL0NhbGN1bGF0ZUZhY2VzV2l0aGluJyk7XHJcbnZhciBTZXRMYXllckNvbGxpc2lvbkluZGV4ID0gcmVxdWlyZSgnLi9TZXRMYXllckNvbGxpc2lvbkluZGV4Jyk7XHJcblxyXG4vKipcclxuICogU2V0cyBjb2xsaXNpb24gb24gdGhlIGdpdmVuIHRpbGUgb3IgdGlsZXMgd2l0aGluIGEgbGF5ZXIgYnkgaW5kZXguIFlvdSBjYW4gcGFzcyBpbiBlaXRoZXIgYVxyXG4gKiBzaW5nbGUgbnVtZXJpYyBpbmRleCBvciBhbiBhcnJheSBvZiBpbmRleGVzOiBbMiwgMywgMTUsIDIwXS4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGlmXHJcbiAqIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5TZXRDb2xsaXNpb25cclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KGludGVnZXJ8YXJyYXkpfSBpbmRleGVzIC0gRWl0aGVyIGEgc2luZ2xlIHRpbGUgaW5kZXgsIG9yIGFuIGFycmF5IG9mIHRpbGUgaW5kZXhlcy5cclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlTGF5ZXIgLSBJZiB0cnVlLCB1cGRhdGVzIHRoZSBjdXJyZW50IHRpbGVzIG9uIHRoZSBsYXllci4gU2V0IHRvXHJcbiAqIGZhbHNlIGlmIG5vIHRpbGVzIGhhdmUgYmVlbiBwbGFjZWQgZm9yIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0LlxyXG4gKi9cclxudmFyIFNldENvbGxpc2lvbiA9IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIsIHVwZGF0ZUxheWVyKVxyXG57XHJcbiAgICBpZiAoY29sbGlkZXMgPT09IHVuZGVmaW5lZCkgeyBjb2xsaWRlcyA9IHRydWU7IH1cclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzID09PSB1bmRlZmluZWQpIHsgcmVjYWxjdWxhdGVGYWNlcyA9IHRydWU7IH1cclxuICAgIGlmICghQXJyYXkuaXNBcnJheShpbmRleGVzKSkgeyBpbmRleGVzID0gWyBpbmRleGVzIF07IH1cclxuICAgIGlmICh1cGRhdGVMYXllciA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZUxheWVyID0gdHJ1ZTsgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgYXJyYXkgb2YgY29sbGlkaW5nIGluZGV4ZXNcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBTZXRMYXllckNvbGxpc2lvbkluZGV4KGluZGV4ZXNbaV0sIGNvbGxpZGVzLCBsYXllcik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIFVwZGF0ZSB0aGUgdGlsZXNcclxuICAgIGlmICh1cGRhdGVMYXllcilcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0eSA9IDA7IHR5IDwgbGF5ZXIuaGVpZ2h0OyB0eSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgdHggPSAwOyB0eCA8IGxheWVyLndpZHRoOyB0eCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdHldW3R4XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZSAmJiBpbmRleGVzLmluZGV4T2YodGlsZS5pbmRleCkgIT09IC0xKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFNldFRpbGVDb2xsaXNpb24odGlsZSwgY29sbGlkZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIENhbGN1bGF0ZUZhY2VzV2l0aGluKDAsIDAsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0Q29sbGlzaW9uO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTZXRUaWxlQ29sbGlzaW9uID0gcmVxdWlyZSgnLi9TZXRUaWxlQ29sbGlzaW9uJyk7XHJcbnZhciBDYWxjdWxhdGVGYWNlc1dpdGhpbiA9IHJlcXVpcmUoJy4vQ2FsY3VsYXRlRmFjZXNXaXRoaW4nKTtcclxudmFyIFNldExheWVyQ29sbGlzaW9uSW5kZXggPSByZXF1aXJlKCcuL1NldExheWVyQ29sbGlzaW9uSW5kZXgnKTtcclxuXHJcbi8qKlxyXG4gKiBTZXRzIGNvbGxpc2lvbiBvbiBhIHJhbmdlIG9mIHRpbGVzIGluIGEgbGF5ZXIgd2hvc2UgaW5kZXggaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGBzdGFydGAgYW5kXHJcbiAqIGBzdG9wYCAoaW5jbHVzaXZlKS4gQ2FsbGluZyB0aGlzIHdpdGggYSBzdGFydCB2YWx1ZSBvZiAxMCBhbmQgYSBzdG9wIHZhbHVlIG9mIDE0IHdvdWxkIHNldFxyXG4gKiBjb2xsaXNpb24gZm9yIHRpbGVzIDEwLCAxMSwgMTIsIDEzIGFuZCAxNC4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGlmIGNvbGxpc2lvbiB3aWxsIGJlXHJcbiAqIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5TZXRDb2xsaXNpb25CZXR3ZWVuXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHN0YXJ0IC0gVGhlIGZpcnN0IGluZGV4IG9mIHRoZSB0aWxlIHRvIGJlIHNldCBmb3IgY29sbGlzaW9uLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHN0b3AgLSBUaGUgbGFzdCBpbmRleCBvZiB0aGUgdGlsZSB0byBiZSBzZXQgZm9yIGNvbGxpc2lvbi5cclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZUxheWVyPXRydWVdIC0gSWYgdHJ1ZSwgdXBkYXRlcyB0aGUgY3VycmVudCB0aWxlcyBvbiB0aGUgbGF5ZXIuIFNldCB0b1xyXG4gKiBmYWxzZSBpZiBubyB0aWxlcyBoYXZlIGJlZW4gcGxhY2VkIGZvciBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdC5cclxuICovXHJcbnZhciBTZXRDb2xsaXNpb25CZXR3ZWVuID0gZnVuY3Rpb24gKHN0YXJ0LCBzdG9wLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIsIHVwZGF0ZUxheWVyKVxyXG57XHJcbiAgICBpZiAoY29sbGlkZXMgPT09IHVuZGVmaW5lZCkgeyBjb2xsaWRlcyA9IHRydWU7IH1cclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzID09PSB1bmRlZmluZWQpIHsgcmVjYWxjdWxhdGVGYWNlcyA9IHRydWU7IH1cclxuICAgIGlmICh1cGRhdGVMYXllciA9PT0gdW5kZWZpbmVkKSB7IHVwZGF0ZUxheWVyID0gdHJ1ZTsgfVxyXG5cclxuICAgIGlmIChzdGFydCA+IHN0b3ApIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBhcnJheSBvZiBjb2xsaWRpbmcgaW5kZXhlc1xyXG4gICAgZm9yICh2YXIgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gc3RvcDsgaW5kZXgrKylcclxuICAgIHtcclxuICAgICAgICBTZXRMYXllckNvbGxpc2lvbkluZGV4KGluZGV4LCBjb2xsaWRlcywgbGF5ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgdGlsZXNcclxuICAgIGlmICh1cGRhdGVMYXllcilcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0eSA9IDA7IHR5IDwgbGF5ZXIuaGVpZ2h0OyB0eSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgdHggPSAwOyB0eCA8IGxheWVyLndpZHRoOyB0eCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdHldW3R4XTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0aWxlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLmluZGV4ID49IHN0YXJ0ICYmIHRpbGUuaW5kZXggPD0gc3RvcClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNldFRpbGVDb2xsaXNpb24odGlsZSwgY29sbGlkZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBDYWxjdWxhdGVGYWNlc1dpdGhpbigwLCAwLCBsYXllci53aWR0aCwgbGF5ZXIuaGVpZ2h0LCBsYXllcik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldENvbGxpc2lvbkJldHdlZW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNldFRpbGVDb2xsaXNpb24gPSByZXF1aXJlKCcuL1NldFRpbGVDb2xsaXNpb24nKTtcclxudmFyIENhbGN1bGF0ZUZhY2VzV2l0aGluID0gcmVxdWlyZSgnLi9DYWxjdWxhdGVGYWNlc1dpdGhpbicpO1xyXG52YXIgU2V0TGF5ZXJDb2xsaXNpb25JbmRleCA9IHJlcXVpcmUoJy4vU2V0TGF5ZXJDb2xsaXNpb25JbmRleCcpO1xyXG5cclxuLyoqXHJcbiAqIFNldHMgY29sbGlzaW9uIG9uIGFsbCB0aWxlcyBpbiB0aGUgZ2l2ZW4gbGF5ZXIsIGV4Y2VwdCBmb3IgdGlsZXMgdGhhdCBoYXZlIGFuIGluZGV4IHNwZWNpZmllZCBpblxyXG4gKiB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBgY29sbGlkZXNgIHBhcmFtZXRlciBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvclxyXG4gKiBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuU2V0Q29sbGlzaW9uQnlFeGNsdXNpb25cclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcltdfSBpbmRleGVzIC0gQW4gYXJyYXkgb2YgdGhlIHRpbGUgaW5kZXhlcyB0byBub3QgYmUgY291bnRlZCBmb3IgY29sbGlzaW9uLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyIGNvbGxpc2lvbi5cclxuICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJlY2FsY3VsYXRlIHRoZSB0aWxlIGZhY2VzIGFmdGVyIHRoZSB1cGRhdGUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICovXHJcbnZhciBTZXRDb2xsaXNpb25CeUV4Y2x1c2lvbiA9IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmIChjb2xsaWRlcyA9PT0gdW5kZWZpbmVkKSB7IGNvbGxpZGVzID0gdHJ1ZTsgfVxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGluZGV4ZXMpKSB7IGluZGV4ZXMgPSBbIGluZGV4ZXMgXTsgfVxyXG5cclxuICAgIC8vIE5vdGU6IHRoaXMgb25seSB1cGRhdGVzIGxheWVyLmNvbGxpZGVJbmRleGVzIGZvciB0aWxlIGluZGV4ZXMgZm91bmQgY3VycmVudGx5IGluIHRoZSBsYXllclxyXG4gICAgZm9yICh2YXIgdHkgPSAwOyB0eSA8IGxheWVyLmhlaWdodDsgdHkrKylcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0eCA9IDA7IHR4IDwgbGF5ZXIud2lkdGg7IHR4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdHldW3R4XTtcclxuICAgICAgICAgICAgaWYgKHRpbGUgJiYgaW5kZXhlcy5pbmRleE9mKHRpbGUuaW5kZXgpID09PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2V0VGlsZUNvbGxpc2lvbih0aWxlLCBjb2xsaWRlcyk7XHJcbiAgICAgICAgICAgICAgICBTZXRMYXllckNvbGxpc2lvbkluZGV4KHRpbGUuaW5kZXgsIGNvbGxpZGVzLCBsYXllcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgQ2FsY3VsYXRlRmFjZXNXaXRoaW4oMCwgMCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRDb2xsaXNpb25CeUV4Y2x1c2lvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU2V0VGlsZUNvbGxpc2lvbiA9IHJlcXVpcmUoJy4vU2V0VGlsZUNvbGxpc2lvbicpO1xyXG52YXIgQ2FsY3VsYXRlRmFjZXNXaXRoaW4gPSByZXF1aXJlKCcuL0NhbGN1bGF0ZUZhY2VzV2l0aGluJyk7XHJcbnZhciBIYXNWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9IYXNWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSB0aWxlcyB3aXRoaW4gYSBsYXllciBieSBjaGVja2luZyB0aWxlIHByb3BlcnRpZXMuIElmIGEgdGlsZSBoYXMgYSBwcm9wZXJ0eVxyXG4gKiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHByb3BlcnRpZXMgb2JqZWN0LCBpdHMgY29sbGlzaW9uIGZsYWcgd2lsbCBiZSBzZXQuIFRoZSBgY29sbGlkZXNgXHJcbiAqIHBhcmFtZXRlciBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvciBkaXNhYmxlZCAoZmFsc2UpLiBQYXNzaW5nIGluXHJcbiAqIGB7IGNvbGxpZGVzOiB0cnVlIH1gIHdvdWxkIHVwZGF0ZSB0aGUgY29sbGlzaW9uIGZsYWcgb24gYW55IHRpbGVzIHdpdGggYSBcImNvbGxpZGVzXCIgcHJvcGVydHkgdGhhdFxyXG4gKiBoYXMgYSB2YWx1ZSBvZiB0cnVlLiBBbnkgdGlsZSB0aGF0IGRvZXNuJ3QgaGF2ZSBcImNvbGxpZGVzXCIgc2V0IHRvIHRydWUgd2lsbCBiZSBpZ25vcmVkLiBZb3UgY2FuXHJcbiAqIGFsc28gdXNlIGFuIGFycmF5IG9mIHZhbHVlcywgZS5nLiBgeyB0eXBlczogW1wic3RvbmVcIiwgXCJsYXZhXCIsIFwic2FuZFwiIF0gfWAuIElmIGEgdGlsZSBoYXMgYVxyXG4gKiBcInR5cGVzXCIgcHJvcGVydHkgdGhhdCBtYXRjaGVzIGFueSBvZiB0aG9zZSB2YWx1ZXMsIGl0cyBjb2xsaXNpb24gZmxhZyB3aWxsIGJlIHVwZGF0ZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5TZXRDb2xsaXNpb25CeVByb3BlcnR5XHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcGVydGllcyAtIEFuIG9iamVjdCB3aXRoIHRpbGUgcHJvcGVydGllcyBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC5cclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgU2V0Q29sbGlzaW9uQnlQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmIChjb2xsaWRlcyA9PT0gdW5kZWZpbmVkKSB7IGNvbGxpZGVzID0gdHJ1ZTsgfVxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMgPT09IHVuZGVmaW5lZCkgeyByZWNhbGN1bGF0ZUZhY2VzID0gdHJ1ZTsgfVxyXG5cclxuICAgIGZvciAodmFyIHR5ID0gMDsgdHkgPCBsYXllci5oZWlnaHQ7IHR5KyspXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgdHggPSAwOyB0eCA8IGxheWVyLndpZHRoOyB0eCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGUgPSBsYXllci5kYXRhW3R5XVt0eF07XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRpbGUpIHsgY29udGludWU7IH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnRpZXMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICghSGFzVmFsdWUodGlsZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSkpIHsgY29udGludWU7IH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gcHJvcGVydGllc1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbIHZhbHVlcyBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnByb3BlcnRpZXNbcHJvcGVydHldID09PSB2YWx1ZXNbaV0pXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZXRUaWxlQ29sbGlzaW9uKHRpbGUsIGNvbGxpZGVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgQ2FsY3VsYXRlRmFjZXNXaXRoaW4oMCwgMCwgbGF5ZXIud2lkdGgsIGxheWVyLmhlaWdodCwgbGF5ZXIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRDb2xsaXNpb25CeVByb3BlcnR5O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTZXRUaWxlQ29sbGlzaW9uID0gcmVxdWlyZSgnLi9TZXRUaWxlQ29sbGlzaW9uJyk7XHJcbnZhciBDYWxjdWxhdGVGYWNlc1dpdGhpbiA9IHJlcXVpcmUoJy4vQ2FsY3VsYXRlRmFjZXNXaXRoaW4nKTtcclxuXHJcbi8qKlxyXG4gKiBTZXRzIGNvbGxpc2lvbiBvbiB0aGUgdGlsZXMgd2l0aGluIGEgbGF5ZXIgYnkgY2hlY2tpbmcgZWFjaCB0aWxlJ3MgY29sbGlzaW9uIGdyb3VwIGRhdGFcclxuICogKHR5cGljYWxseSBkZWZpbmVkIGluIFRpbGVkIHdpdGhpbiB0aGUgdGlsZXNldCBjb2xsaXNpb24gZWRpdG9yKS4gSWYgYW55IG9iamVjdHMgYXJlIGZvdW5kIHdpdGhpblxyXG4gKiBhIHRpbGUncyBjb2xsaXNpb24gZ3JvdXAsIHRoZSB0aWxlJ3MgY29sbGlkaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2V0LiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXJcclxuICogY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmUgZW5hYmxlZCAodHJ1ZSkgb3IgZGlzYWJsZWQgKGZhbHNlKS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlNldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cFxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgU2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwID0gZnVuY3Rpb24gKGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCBsYXllcilcclxue1xyXG4gICAgaWYgKGNvbGxpZGVzID09PSB1bmRlZmluZWQpIHsgY29sbGlkZXMgPSB0cnVlOyB9XHJcbiAgICBpZiAocmVjYWxjdWxhdGVGYWNlcyA9PT0gdW5kZWZpbmVkKSB7IHJlY2FsY3VsYXRlRmFjZXMgPSB0cnVlOyB9XHJcblxyXG4gICAgZm9yICh2YXIgdHkgPSAwOyB0eSA8IGxheWVyLmhlaWdodDsgdHkrKylcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciB0eCA9IDA7IHR4IDwgbGF5ZXIud2lkdGg7IHR4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZSA9IGxheWVyLmRhdGFbdHldW3R4XTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGlsZSkgeyBjb250aW51ZTsgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGNvbGxpc2lvbkdyb3VwID0gdGlsZS5nZXRDb2xsaXNpb25Hcm91cCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSBpbiBUaWxlZCB0byBoYXZlIGEgY29sbGlzaW9uIGdyb3VwIHdpdGhvdXQgYW55IHNoYXBlcywgZS5nLiBjcmVhdGUgYVxyXG4gICAgICAgICAgICAvLyBzaGFwZSBhbmQgdGhlbiBkZWxldGUgdGhlIHNoYXBlLlxyXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uR3JvdXAgJiYgY29sbGlzaW9uR3JvdXAub2JqZWN0cyAmJiBjb2xsaXNpb25Hcm91cC5vYmplY3RzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNldFRpbGVDb2xsaXNpb24odGlsZSwgY29sbGlkZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIENhbGN1bGF0ZUZhY2VzV2l0aGluKDAsIDAsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbGx5IHVzZWQgbWV0aG9kIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHRpbGUgaW5kZXhlcyB0aGF0IGNvbGxpZGUgd2l0aGluIGEgbGF5ZXIuIFRoaXNcclxuICogdXBkYXRlcyBMYXllckRhdGEuY29sbGlkZUluZGV4ZXMgdG8gZWl0aGVyIGNvbnRhaW4gb3Igbm90IGNvbnRhaW4gdGhlIGdpdmVuIGB0aWxlSW5kZXhgLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuU2V0TGF5ZXJDb2xsaXNpb25JbmRleFxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSW5kZXggLSBUaGUgdGlsZSBpbmRleCB0byBzZXQgdGhlIGNvbGxpc2lvbiBib29sZWFuIGZvci5cclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBTaG91bGQgdGhlIHRpbGUgaW5kZXggY29sbGlkZSBvciBub3Q/XHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICovXHJcbnZhciBTZXRMYXllckNvbGxpc2lvbkluZGV4ID0gZnVuY3Rpb24gKHRpbGVJbmRleCwgY29sbGlkZXMsIGxheWVyKVxyXG57XHJcbiAgICB2YXIgbG9jID0gbGF5ZXIuY29sbGlkZUluZGV4ZXMuaW5kZXhPZih0aWxlSW5kZXgpO1xyXG5cclxuICAgIGlmIChjb2xsaWRlcyAmJiBsb2MgPT09IC0xKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyLmNvbGxpZGVJbmRleGVzLnB1c2godGlsZUluZGV4KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCFjb2xsaWRlcyAmJiBsb2MgIT09IC0xKVxyXG4gICAge1xyXG4gICAgICAgIGxheWVyLmNvbGxpZGVJbmRleGVzLnNwbGljZShsb2MsIDEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRMYXllckNvbGxpc2lvbkluZGV4O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbGx5IHVzZWQgbWV0aG9kIHRvIHNldCB0aGUgY29sbGlkaW5nIHN0YXRlIG9mIGEgdGlsZS4gVGhpcyBkb2VzIG5vdCByZWNhbGN1bGF0ZVxyXG4gKiBpbnRlcmVzdGluZyBmYWNlcy5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlNldFRpbGVDb2xsaXNpb25cclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IHRpbGUgLSBUaGUgVGlsZSB0byBzZXQgdGhlIGNvbGxpc2lvbiBvbi5cclxuICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBTaG91bGQgdGhlIHRpbGUgaW5kZXggY29sbGlkZSBvciBub3Q/XHJcbiAqL1xyXG52YXIgU2V0VGlsZUNvbGxpc2lvbiA9IGZ1bmN0aW9uICh0aWxlLCBjb2xsaWRlcylcclxue1xyXG4gICAgaWYgKGNvbGxpZGVzKVxyXG4gICAge1xyXG4gICAgICAgIHRpbGUuc2V0Q29sbGlzaW9uKHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICB0aWxlLnJlc2V0Q29sbGlzaW9uKGZhbHNlKTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0VGlsZUNvbGxpc2lvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyBhIGdsb2JhbCBjb2xsaXNpb24gY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0aWxlIGluZGV4IHdpdGhpbiB0aGUgbGF5ZXIuIFRoaXMgd2lsbCBhZmZlY3QgYWxsXHJcbiAqIHRpbGVzIG9uIHRoaXMgbGF5ZXIgdGhhdCBoYXZlIHRoZSBzYW1lIGluZGV4LiBJZiBhIGNhbGxiYWNrIGlzIGFscmVhZHkgc2V0IGZvciB0aGUgdGlsZSBpbmRleCBpdFxyXG4gKiB3aWxsIGJlIHJlcGxhY2VkLiBTZXQgdGhlIGNhbGxiYWNrIHRvIG51bGwgdG8gcmVtb3ZlIGl0LiBJZiB5b3Ugd2FudCB0byBzZXQgYSBjYWxsYmFjayBmb3IgYSB0aWxlXHJcbiAqIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24gb24gdGhlIG1hcCB0aGVuIHNlZSBzZXRUaWxlTG9jYXRpb25DYWxsYmFjay5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlNldFRpbGVJbmRleENhbGxiYWNrXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gaW5kZXhlcyAtIEVpdGhlciBhIHNpbmdsZSB0aWxlIGluZGV4LCBvciBhbiBhcnJheSBvZiB0aWxlIGluZGV4ZXMgdG8gaGF2ZSBhIGNvbGxpc2lvbiBjYWxsYmFjayBzZXQgZm9yLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB0aWxlIGlzIGNvbGxpZGVkIHdpdGguXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgU2V0VGlsZUluZGV4Q2FsbGJhY2sgPSBmdW5jdGlvbiAoaW5kZXhlcywgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgbGF5ZXIpXHJcbntcclxuICAgIGlmICh0eXBlb2YgaW5kZXhlcyA9PT0gJ251bWJlcicpXHJcbiAgICB7XHJcbiAgICAgICAgbGF5ZXIuY2FsbGJhY2tzW2luZGV4ZXNdID0gKGNhbGxiYWNrICE9PSBudWxsKVxyXG4gICAgICAgICAgICA/IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQ6IGNhbGxiYWNrQ29udGV4dCB9XHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBpbmRleGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGF5ZXIuY2FsbGJhY2tzW2luZGV4ZXNbaV1dID0gKGNhbGxiYWNrICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgPyB7IGNhbGxiYWNrOiBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0OiBjYWxsYmFja0NvbnRleHQgfVxyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRUaWxlSW5kZXhDYWxsYmFjaztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VGlsZXNXaXRoaW4gPSByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluJyk7XHJcblxyXG4vKipcclxuICogU2V0cyBhIGNvbGxpc2lvbiBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGluIHRpbGUgY29vcmRpbmF0ZXMpIHdpdGhpbiB0aGUgbGF5ZXIuXHJcbiAqIElmIGEgY2FsbGJhY2sgaXMgYWxyZWFkeSBzZXQgZm9yIHRoZSB0aWxlIGluZGV4IGl0IHdpbGwgYmUgcmVwbGFjZWQuIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0b1xyXG4gKiByZW1vdmUgaXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5TZXRUaWxlTG9jYXRpb25DYWxsYmFja1xyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgdGlsZSBpcyBjb2xsaWRlZCB3aXRoLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2tDb250ZXh0IC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKi9cclxudmFyIFNldFRpbGVMb2NhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgbGF5ZXIpXHJcbntcclxuICAgIHZhciB0aWxlcyA9IEdldFRpbGVzV2l0aGluKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgbGF5ZXIpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdGlsZXNbaV0uc2V0Q29sbGlzaW9uQ2FsbGJhY2soY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCk7XHJcbiAgICB9XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZXRUaWxlTG9jYXRpb25DYWxsYmFjaztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VGlsZXNXaXRoaW4gPSByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluJyk7XHJcbnZhciBTaHVmZmxlQXJyYXkgPSByZXF1aXJlKCcuLi8uLi91dGlscy9hcnJheS9TaHVmZmxlJyk7XHJcblxyXG4vKipcclxuICogU2h1ZmZsZXMgdGhlIHRpbGVzIGluIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIChzcGVjaWZpZWQgaW4gdGlsZSBjb29yZGluYXRlcykgd2l0aGluIHRoZSBnaXZlblxyXG4gKiBsYXllci4gSXQgd2lsbCBvbmx5IHJhbmRvbWl6ZSB0aGUgdGlsZXMgaW4gdGhhdCBhcmVhLCBzbyBpZiB0aGV5J3JlIGFsbCB0aGUgc2FtZSBub3RoaW5nIHdpbGxcclxuICogYXBwZWFyIHRvIGhhdmUgY2hhbmdlZCEgVGhpcyBtZXRob2Qgb25seSBtb2RpZmllcyB0aWxlIGluZGV4ZXMgYW5kIGRvZXMgbm90IGNoYW5nZSBjb2xsaXNpb25cclxuICogaW5mb3JtYXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5TaHVmZmxlXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqL1xyXG52YXIgU2h1ZmZsZSA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGxheWVyKVxyXG57XHJcbiAgICB2YXIgdGlsZXMgPSBHZXRUaWxlc1dpdGhpbih0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIG51bGwsIGxheWVyKTtcclxuXHJcbiAgICB2YXIgaW5kZXhlcyA9IHRpbGVzLm1hcChmdW5jdGlvbiAodGlsZSkgeyByZXR1cm4gdGlsZS5pbmRleDsgfSk7XHJcbiAgICBTaHVmZmxlQXJyYXkoaW5kZXhlcyk7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB0aWxlc1tpXS5pbmRleCA9IGluZGV4ZXNbaV07XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNodWZmbGU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFRpbGVzV2l0aGluID0gcmVxdWlyZSgnLi9HZXRUaWxlc1dpdGhpbicpO1xyXG5cclxuLyoqXHJcbiAqIFNjYW5zIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChnaXZlbiBpbiB0aWxlIGNvb3JkaW5hdGVzKSBmb3IgdGlsZXMgd2l0aCBhbiBpbmRleCBtYXRjaGluZ1xyXG4gKiBgaW5kZXhBYCBhbmQgc3dhcHMgdGhlbiB3aXRoIGBpbmRleEJgLiBUaGlzIG9ubHkgbW9kaWZpZXMgdGhlIGluZGV4IGFuZCBkb2VzIG5vdCBjaGFuZ2UgY29sbGlzaW9uXHJcbiAqIGluZm9ybWF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuU3dhcEJ5SW5kZXhcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZUEgLSBGaXJzdCB0aWxlIGluZGV4LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVCIC0gU2Vjb25kIHRpbGUgaW5kZXguXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICovXHJcbnZhciBTd2FwQnlJbmRleCA9IGZ1bmN0aW9uIChpbmRleEEsIGluZGV4QiwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVzID0gR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBudWxsLCBsYXllcik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aWxlc1tpXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmICh0aWxlc1tpXS5pbmRleCA9PT0gaW5kZXhBKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlc1tpXS5pbmRleCA9IGluZGV4QjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aWxlc1tpXS5pbmRleCA9PT0gaW5kZXhCKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlc1tpXS5pbmRleCA9IGluZGV4QTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3dhcEJ5SW5kZXg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGZyb20gdGlsZSBYIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSB0byB3b3JsZCBYIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAqIGxheWVyJ3MgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5UaWxlVG9Xb3JsZFhcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKiBcclxuICogQHJldHVybiB7bnVtYmVyfVxyXG4gKi9cclxudmFyIFRpbGVUb1dvcmxkWCA9IGZ1bmN0aW9uICh0aWxlWCwgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVXaWR0aCA9IGxheWVyLmJhc2VUaWxlV2lkdGg7XHJcbiAgICB2YXIgdGlsZW1hcExheWVyID0gbGF5ZXIudGlsZW1hcExheWVyO1xyXG4gICAgdmFyIGxheWVyV29ybGRYID0gMDtcclxuXHJcbiAgICBpZiAodGlsZW1hcExheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjYW1lcmEgPT09IHVuZGVmaW5lZCkgeyBjYW1lcmEgPSB0aWxlbWFwTGF5ZXIuc2NlbmUuY2FtZXJhcy5tYWluOyB9XHJcblxyXG4gICAgICAgIGxheWVyV29ybGRYID0gdGlsZW1hcExheWVyLnggKyBjYW1lcmEuc2Nyb2xsWCAqICgxIC0gdGlsZW1hcExheWVyLnNjcm9sbEZhY3RvclgpO1xyXG5cclxuICAgICAgICB0aWxlV2lkdGggKj0gdGlsZW1hcExheWVyLnNjYWxlWDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGF5ZXJXb3JsZFggKyB0aWxlWCAqIHRpbGVXaWR0aDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZVRvV29ybGRYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBUaWxlVG9Xb3JsZFggPSByZXF1aXJlKCcuL1RpbGVUb1dvcmxkWCcpO1xyXG52YXIgVGlsZVRvV29ybGRZID0gcmVxdWlyZSgnLi9UaWxlVG9Xb3JsZFknKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBmcm9tIHRpbGUgWFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpIHRvIHdvcmxkIFhZIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAqIGxheWVyJ3MgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgVmVjdG9yMiBvYmplY3Qgb3IgdXBkYXRlIHRoZSBnaXZlblxyXG4gKiBgcG9pbnRgIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLlRpbGVUb1dvcmxkWFlcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwb2ludF0gLSBBIFZlY3RvcjIgdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzIGluLiBJZiBub3QgZ2l2ZW4gYSBuZXcgVmVjdG9yMiBpcyBjcmVhdGVkLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9IGxheWVyIC0gVGhlIFRpbGVtYXAgTGF5ZXIgdG8gYWN0IHVwb24uXHJcbiAqIFxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBUaGUgWFkgbG9jYXRpb24gaW4gd29ybGQgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG52YXIgVGlsZVRvV29ybGRYWSA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHBvaW50LCBjYW1lcmEsIGxheWVyKVxyXG57XHJcbiAgICBpZiAocG9pbnQgPT09IHVuZGVmaW5lZCkgeyBwb2ludCA9IG5ldyBWZWN0b3IyKDAsIDApOyB9XHJcblxyXG4gICAgcG9pbnQueCA9IFRpbGVUb1dvcmxkWCh0aWxlWCwgY2FtZXJhLCBsYXllcik7XHJcbiAgICBwb2ludC55ID0gVGlsZVRvV29ybGRZKHRpbGVZLCBjYW1lcmEsIGxheWVyKTtcclxuXHJcbiAgICByZXR1cm4gcG9pbnQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGVUb1dvcmxkWFk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGZyb20gdGlsZSBZIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSB0byB3b3JsZCBZIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAqIGxheWVyJ3MgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5UaWxlVG9Xb3JsZFlcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKiBcclxuICogQHJldHVybiB7bnVtYmVyfVxyXG4gKi9cclxudmFyIFRpbGVUb1dvcmxkWSA9IGZ1bmN0aW9uICh0aWxlWSwgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgdmFyIHRpbGVIZWlnaHQgPSBsYXllci5iYXNlVGlsZUhlaWdodDtcclxuICAgIHZhciB0aWxlbWFwTGF5ZXIgPSBsYXllci50aWxlbWFwTGF5ZXI7XHJcbiAgICB2YXIgbGF5ZXJXb3JsZFkgPSAwO1xyXG5cclxuICAgIGlmICh0aWxlbWFwTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7IGNhbWVyYSA9IHRpbGVtYXBMYXllci5zY2VuZS5jYW1lcmFzLm1haW47IH1cclxuXHJcbiAgICAgICAgbGF5ZXJXb3JsZFkgPSAodGlsZW1hcExheWVyLnkgKyBjYW1lcmEuc2Nyb2xsWSAqICgxIC0gdGlsZW1hcExheWVyLnNjcm9sbEZhY3RvclkpKTtcclxuXHJcbiAgICAgICAgdGlsZUhlaWdodCAqPSB0aWxlbWFwTGF5ZXIuc2NhbGVZO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYXllcldvcmxkWSArIHRpbGVZICogdGlsZUhlaWdodDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVGlsZVRvV29ybGRZO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRUaWxlc1dpdGhpbiA9IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW4nKTtcclxuXHJcbi8qKlxyXG4gKiBSYW5kb21pemVzIHRoZSBpbmRleGVzIG9mIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRpbGVzIChpbiB0aWxlIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlXHJcbiAqIHNwZWNpZmllZCBsYXllci4gRWFjaCB0aWxlIHdpbGwgcmVjZWl2ZSBhIG5ldyBpbmRleC4gTmV3IGluZGV4ZXMgYXJlIGRyYXduIGZyb20gdGhlIGdpdmVuXHJcbiAqIHdlaWdodGVkSW5kZXhlcyBhcnJheS4gQW4gZXhhbXBsZSB3ZWlnaHRlZCBhcnJheTpcclxuICpcclxuICogW1xyXG4gKiAgeyBpbmRleDogNiwgd2VpZ2h0OiA0IH0sICAgIC8vIFByb2JhYmlsaXR5IG9mIGluZGV4IDYgaXMgNCAvIDhcclxuICogIHsgaW5kZXg6IDcsIHdlaWdodDogMiB9LCAgICAvLyBQcm9iYWJpbGl0eSBvZiBpbmRleCA3IHdvdWxkIGJlIDIgLyA4XHJcbiAqICB7IGluZGV4OiA4LCB3ZWlnaHQ6IDEuNSB9LCAgLy8gUHJvYmFiaWxpdHkgb2YgaW5kZXggOCB3b3VsZCBiZSAxLjUgLyA4XHJcbiAqICB7IGluZGV4OiAyNiwgd2VpZ2h0OiAwLjUgfSAgLy8gUHJvYmFiaWxpdHkgb2YgaW5kZXggMjcgd291bGQgYmUgMC41IC8gOFxyXG4gKiBdXHJcbiAqXHJcbiAqIFRoZSBwcm9iYWJpbGl0eSBvZiBhbnkgaW5kZXggYmVpbmcgY2hvb3NlIGlzICh0aGUgaW5kZXgncyB3ZWlnaHQpIC8gKHN1bSBvZiBhbGwgd2VpZ2h0cykuIFRoaXNcclxuICogbWV0aG9kIG9ubHkgbW9kaWZpZXMgdGlsZSBpbmRleGVzIGFuZCBkb2VzIG5vdCBjaGFuZ2UgY29sbGlzaW9uIGluZm9ybWF0aW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHMuV2VpZ2h0ZWRSYW5kb21pemVcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAqIEBwYXJhbSB7b2JqZWN0W119IFt3ZWlnaHRlZEluZGV4ZXNdIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byByYW5kb21seSBkcmF3IGZyb20gZHVyaW5nXHJcbiAqIHJhbmRvbWl6YXRpb24uIFRoZXkgc2hvdWxkIGJlIGluIHRoZSBmb3JtOiB7IGluZGV4OiAwLCB3ZWlnaHQ6IDQgfSBvclxyXG4gKiB7IGluZGV4OiBbMCwgMV0sIHdlaWdodDogNCB9IGlmIHlvdSB3aXNoIHRvIGRyYXcgZnJvbSBtdWx0aXBsZSB0aWxlIGluZGV4ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICovXHJcbnZhciBXZWlnaHRlZFJhbmRvbWl6ZSA9IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHdlaWdodGVkSW5kZXhlcywgbGF5ZXIpXHJcbntcclxuICAgIGlmICh3ZWlnaHRlZEluZGV4ZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICB2YXIgaTtcclxuICAgIHZhciB0aWxlcyA9IEdldFRpbGVzV2l0aGluKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgbGF5ZXIpO1xyXG5cclxuICAgIHZhciB3ZWlnaHRUb3RhbCA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2VpZ2h0ZWRJbmRleGVzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHdlaWdodFRvdGFsICs9IHdlaWdodGVkSW5kZXhlc1tpXS53ZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdlaWdodFRvdGFsIDw9IDApIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKSAqIHdlaWdodFRvdGFsO1xyXG4gICAgICAgIHZhciBzdW0gPSAwO1xyXG4gICAgICAgIHZhciByYW5kb21JbmRleCA9IC0xO1xyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2VpZ2h0ZWRJbmRleGVzLmxlbmd0aDsgaisrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3VtICs9IHdlaWdodGVkSW5kZXhlc1tqXS53ZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmIChyYW5kIDw9IHN1bSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNob3NlbiA9IHdlaWdodGVkSW5kZXhlc1tqXS5pbmRleDtcclxuICAgICAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gQXJyYXkuaXNBcnJheShjaG9zZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgPyBjaG9zZW5bTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hvc2VuLmxlbmd0aCldXHJcbiAgICAgICAgICAgICAgICAgICAgOiBjaG9zZW47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGlsZXNbaV0uaW5kZXggPSByYW5kb21JbmRleDtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV2VpZ2h0ZWRSYW5kb21pemU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGZyb20gd29ybGQgWCBjb29yZGluYXRlcyAocGl4ZWxzKSB0byB0aWxlIFggY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAqIGxheWVyJ3MgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuQ29tcG9uZW50cy5Xb3JsZFRvVGlsZVhcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NuYXBUb0Zsb29yPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcm91bmQgdGhlIHRpbGUgY29vcmRpbmF0ZSBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIFggbG9jYXRpb24gaW4gdGlsZSB1bml0cy5cclxuICovXHJcbnZhciBXb3JsZFRvVGlsZVggPSBmdW5jdGlvbiAod29ybGRYLCBzbmFwVG9GbG9vciwgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgaWYgKHNuYXBUb0Zsb29yID09PSB1bmRlZmluZWQpIHsgc25hcFRvRmxvb3IgPSB0cnVlOyB9XHJcblxyXG4gICAgdmFyIHRpbGVXaWR0aCA9IGxheWVyLmJhc2VUaWxlV2lkdGg7XHJcbiAgICB2YXIgdGlsZW1hcExheWVyID0gbGF5ZXIudGlsZW1hcExheWVyO1xyXG5cclxuICAgIGlmICh0aWxlbWFwTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7IGNhbWVyYSA9IHRpbGVtYXBMYXllci5zY2VuZS5jYW1lcmFzLm1haW47IH1cclxuXHJcbiAgICAgICAgLy8gRmluZCB0aGUgd29ybGQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXRpYyBvciBkeW5hbWljIGxheWVyJ3MgdG9wIGxlZnQgb3JpZ2luLFxyXG4gICAgICAgIC8vIGZhY3RvcmluZyBpbiB0aGUgY2FtZXJhJ3MgaG9yaXpvbnRhbCBzY3JvbGxcclxuICAgICAgICB3b3JsZFggPSB3b3JsZFggLSAodGlsZW1hcExheWVyLnggKyBjYW1lcmEuc2Nyb2xsWCAqICgxIC0gdGlsZW1hcExheWVyLnNjcm9sbEZhY3RvclgpKTtcclxuXHJcbiAgICAgICAgdGlsZVdpZHRoICo9IHRpbGVtYXBMYXllci5zY2FsZVg7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNuYXBUb0Zsb29yXHJcbiAgICAgICAgPyBNYXRoLmZsb29yKHdvcmxkWCAvIHRpbGVXaWR0aClcclxuICAgICAgICA6IHdvcmxkWCAvIHRpbGVXaWR0aDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV29ybGRUb1RpbGVYO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBXb3JsZFRvVGlsZVggPSByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWCcpO1xyXG52YXIgV29ybGRUb1RpbGVZID0gcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVknKTtcclxudmFyIFZlY3RvcjIgPSByZXF1aXJlKCcuLi8uLi9tYXRoL1ZlY3RvcjInKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBmcm9tIHdvcmxkIFhZIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAqIGxheWVyJ3MgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgVmVjdG9yMiBvYmplY3Qgb3IgdXBkYXRlIHRoZSBnaXZlblxyXG4gKiBgcG9pbnRgIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLldvcmxkVG9UaWxlWFlcclxuICogQHByaXZhdGVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NuYXBUb0Zsb29yPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcm91bmQgdGhlIHRpbGUgY29vcmRpbmF0ZSBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW3BvaW50XSAtIEEgVmVjdG9yMiB0byBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgaW4uIElmIG5vdCBnaXZlbiBhIG5ldyBWZWN0b3IyIGlzIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YX0gbGF5ZXIgLSBUaGUgVGlsZW1hcCBMYXllciB0byBhY3QgdXBvbi5cclxuICogXHJcbiAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFRoZSBYWSBsb2NhdGlvbiBpbiB0aWxlIHVuaXRzLlxyXG4gKi9cclxudmFyIFdvcmxkVG9UaWxlWFkgPSBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIHNuYXBUb0Zsb29yLCBwb2ludCwgY2FtZXJhLCBsYXllcilcclxue1xyXG4gICAgaWYgKHBvaW50ID09PSB1bmRlZmluZWQpIHsgcG9pbnQgPSBuZXcgVmVjdG9yMigwLCAwKTsgfVxyXG5cclxuICAgIHBvaW50LnggPSBXb3JsZFRvVGlsZVgod29ybGRYLCBzbmFwVG9GbG9vciwgY2FtZXJhLCBsYXllcik7XHJcbiAgICBwb2ludC55ID0gV29ybGRUb1RpbGVZKHdvcmxkWSwgc25hcFRvRmxvb3IsIGNhbWVyYSwgbGF5ZXIpO1xyXG5cclxuICAgIHJldHVybiBwb2ludDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gV29ybGRUb1RpbGVYWTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQ29udmVydHMgZnJvbSB3b3JsZCBZIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWSBjb29yZGluYXRlcyAodGlsZSB1bml0cyksIGZhY3RvcmluZyBpbiB0aGVcclxuICogbGF5ZXIncyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5Db21wb25lbnRzLldvcmxkVG9UaWxlWVxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gYmUgY29udmVydGVkLCBpbiBwaXhlbHMsIG5vdCB0aWxlcy5cclxuICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cclxuICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfSBsYXllciAtIFRoZSBUaWxlbWFwIExheWVyIHRvIGFjdCB1cG9uLlxyXG4gKiBcclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgWSBsb2NhdGlvbiBpbiB0aWxlIHVuaXRzLlxyXG4gKi9cclxudmFyIFdvcmxkVG9UaWxlWSA9IGZ1bmN0aW9uICh3b3JsZFksIHNuYXBUb0Zsb29yLCBjYW1lcmEsIGxheWVyKVxyXG57XHJcbiAgICBpZiAoc25hcFRvRmxvb3IgPT09IHVuZGVmaW5lZCkgeyBzbmFwVG9GbG9vciA9IHRydWU7IH1cclxuXHJcbiAgICB2YXIgdGlsZUhlaWdodCA9IGxheWVyLmJhc2VUaWxlSGVpZ2h0O1xyXG4gICAgdmFyIHRpbGVtYXBMYXllciA9IGxheWVyLnRpbGVtYXBMYXllcjtcclxuXHJcbiAgICBpZiAodGlsZW1hcExheWVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjYW1lcmEgPT09IHVuZGVmaW5lZCkgeyBjYW1lcmEgPSB0aWxlbWFwTGF5ZXIuc2NlbmUuY2FtZXJhcy5tYWluOyB9XHJcblxyXG4gICAgICAgIC8vIEZpbmQgdGhlIHdvcmxkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGF0aWMgb3IgZHluYW1pYyBsYXllcidzIHRvcCBsZWZ0IG9yaWdpbixcclxuICAgICAgICAvLyBmYWN0b3JpbmcgaW4gdGhlIGNhbWVyYSdzIHZlcnRpY2FsIHNjcm9sbFxyXG4gICAgICAgIHdvcmxkWSA9IHdvcmxkWSAtICh0aWxlbWFwTGF5ZXIueSArIGNhbWVyYS5zY3JvbGxZICogKDEgLSB0aWxlbWFwTGF5ZXIuc2Nyb2xsRmFjdG9yWSkpO1xyXG5cclxuICAgICAgICB0aWxlSGVpZ2h0ICo9IHRpbGVtYXBMYXllci5zY2FsZVk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNuYXBUb0Zsb29yXHJcbiAgICAgICAgPyBNYXRoLmZsb29yKHdvcmxkWSAvIHRpbGVIZWlnaHQpXHJcbiAgICAgICAgOiB3b3JsZFkgLyB0aWxlSGVpZ2h0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXb3JsZFRvVGlsZVk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRpbGVtYXBzLkNvbXBvbmVudHNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBDYWxjdWxhdGVGYWNlc0F0OiByZXF1aXJlKCcuL0NhbGN1bGF0ZUZhY2VzQXQnKSxcclxuICAgIENhbGN1bGF0ZUZhY2VzV2l0aGluOiByZXF1aXJlKCcuL0NhbGN1bGF0ZUZhY2VzV2l0aGluJyksXHJcbiAgICBDb3B5OiByZXF1aXJlKCcuL0NvcHknKSxcclxuICAgIENyZWF0ZUZyb21UaWxlczogcmVxdWlyZSgnLi9DcmVhdGVGcm9tVGlsZXMnKSxcclxuICAgIEN1bGxUaWxlczogcmVxdWlyZSgnLi9DdWxsVGlsZXMnKSxcclxuICAgIEZpbGw6IHJlcXVpcmUoJy4vRmlsbCcpLFxyXG4gICAgRmlsdGVyVGlsZXM6IHJlcXVpcmUoJy4vRmlsdGVyVGlsZXMnKSxcclxuICAgIEZpbmRCeUluZGV4OiByZXF1aXJlKCcuL0ZpbmRCeUluZGV4JyksXHJcbiAgICBGaW5kVGlsZTogcmVxdWlyZSgnLi9GaW5kVGlsZScpLFxyXG4gICAgRm9yRWFjaFRpbGU6IHJlcXVpcmUoJy4vRm9yRWFjaFRpbGUnKSxcclxuICAgIEdldFRpbGVBdDogcmVxdWlyZSgnLi9HZXRUaWxlQXQnKSxcclxuICAgIEdldFRpbGVBdFdvcmxkWFk6IHJlcXVpcmUoJy4vR2V0VGlsZUF0V29ybGRYWScpLFxyXG4gICAgR2V0VGlsZXNXaXRoaW46IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW4nKSxcclxuICAgIEdldFRpbGVzV2l0aGluU2hhcGU6IHJlcXVpcmUoJy4vR2V0VGlsZXNXaXRoaW5TaGFwZScpLFxyXG4gICAgR2V0VGlsZXNXaXRoaW5Xb3JsZFhZOiByZXF1aXJlKCcuL0dldFRpbGVzV2l0aGluV29ybGRYWScpLFxyXG4gICAgSGFzVGlsZUF0OiByZXF1aXJlKCcuL0hhc1RpbGVBdCcpLFxyXG4gICAgSGFzVGlsZUF0V29ybGRYWTogcmVxdWlyZSgnLi9IYXNUaWxlQXRXb3JsZFhZJyksXHJcbiAgICBJc0luTGF5ZXJCb3VuZHM6IHJlcXVpcmUoJy4vSXNJbkxheWVyQm91bmRzJyksXHJcbiAgICBQdXRUaWxlQXQ6IHJlcXVpcmUoJy4vUHV0VGlsZUF0JyksXHJcbiAgICBQdXRUaWxlQXRXb3JsZFhZOiByZXF1aXJlKCcuL1B1dFRpbGVBdFdvcmxkWFknKSxcclxuICAgIFB1dFRpbGVzQXQ6IHJlcXVpcmUoJy4vUHV0VGlsZXNBdCcpLFxyXG4gICAgUmFuZG9taXplOiByZXF1aXJlKCcuL1JhbmRvbWl6ZScpLFxyXG4gICAgUmVtb3ZlVGlsZUF0OiByZXF1aXJlKCcuL1JlbW92ZVRpbGVBdCcpLFxyXG4gICAgUmVtb3ZlVGlsZUF0V29ybGRYWTogcmVxdWlyZSgnLi9SZW1vdmVUaWxlQXRXb3JsZFhZJyksXHJcbiAgICBSZW5kZXJEZWJ1ZzogcmVxdWlyZSgnLi9SZW5kZXJEZWJ1ZycpLFxyXG4gICAgUmVwbGFjZUJ5SW5kZXg6IHJlcXVpcmUoJy4vUmVwbGFjZUJ5SW5kZXgnKSxcclxuICAgIFNldENvbGxpc2lvbjogcmVxdWlyZSgnLi9TZXRDb2xsaXNpb24nKSxcclxuICAgIFNldENvbGxpc2lvbkJldHdlZW46IHJlcXVpcmUoJy4vU2V0Q29sbGlzaW9uQmV0d2VlbicpLFxyXG4gICAgU2V0Q29sbGlzaW9uQnlFeGNsdXNpb246IHJlcXVpcmUoJy4vU2V0Q29sbGlzaW9uQnlFeGNsdXNpb24nKSxcclxuICAgIFNldENvbGxpc2lvbkJ5UHJvcGVydHk6IHJlcXVpcmUoJy4vU2V0Q29sbGlzaW9uQnlQcm9wZXJ0eScpLFxyXG4gICAgU2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwOiByZXF1aXJlKCcuL1NldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cCcpLFxyXG4gICAgU2V0VGlsZUluZGV4Q2FsbGJhY2s6IHJlcXVpcmUoJy4vU2V0VGlsZUluZGV4Q2FsbGJhY2snKSxcclxuICAgIFNldFRpbGVMb2NhdGlvbkNhbGxiYWNrOiByZXF1aXJlKCcuL1NldFRpbGVMb2NhdGlvbkNhbGxiYWNrJyksXHJcbiAgICBTaHVmZmxlOiByZXF1aXJlKCcuL1NodWZmbGUnKSxcclxuICAgIFN3YXBCeUluZGV4OiByZXF1aXJlKCcuL1N3YXBCeUluZGV4JyksXHJcbiAgICBUaWxlVG9Xb3JsZFg6IHJlcXVpcmUoJy4vVGlsZVRvV29ybGRYJyksXHJcbiAgICBUaWxlVG9Xb3JsZFhZOiByZXF1aXJlKCcuL1RpbGVUb1dvcmxkWFknKSxcclxuICAgIFRpbGVUb1dvcmxkWTogcmVxdWlyZSgnLi9UaWxlVG9Xb3JsZFknKSxcclxuICAgIFdlaWdodGVkUmFuZG9taXplOiByZXF1aXJlKCcuL1dlaWdodGVkUmFuZG9taXplJyksXHJcbiAgICBXb3JsZFRvVGlsZVg6IHJlcXVpcmUoJy4vV29ybGRUb1RpbGVYJyksXHJcbiAgICBXb3JsZFRvVGlsZVhZOiByZXF1aXJlKCcuL1dvcmxkVG9UaWxlWFknKSxcclxuICAgIFdvcmxkVG9UaWxlWTogcmVxdWlyZSgnLi9Xb3JsZFRvVGlsZVknKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL2NvbXBvbmVudHMnKTtcclxudmFyIER5bmFtaWNUaWxlbWFwTGF5ZXJSZW5kZXIgPSByZXF1aXJlKCcuL0R5bmFtaWNUaWxlbWFwTGF5ZXJSZW5kZXInKTtcclxudmFyIEdhbWVPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0Jyk7XHJcbnZhciBUaWxlbWFwQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgRHluYW1pYyBUaWxlbWFwIExheWVyIGlzIGEgR2FtZSBPYmplY3QgdGhhdCByZW5kZXJzIExheWVyRGF0YSBmcm9tIGEgVGlsZW1hcCB3aGVuIHVzZWQgaW4gY29tYmluYXRpb25cclxuICogd2l0aCBvbmUsIG9yIG1vcmUsIFRpbGVzZXRzLlxyXG4gKlxyXG4gKiBBIER5bmFtaWMgVGlsZW1hcCBMYXllciB0cmFkZXMgc29tZSBzcGVlZCBmb3IgYmVpbmcgYWJsZSB0byBhcHBseSBwb3dlcmZ1bCBlZmZlY3RzLiBVbmxpa2UgYVxyXG4gKiBTdGF0aWMgVGlsZW1hcCBMYXllciwgeW91IGNhbiBhcHBseSBwZXItdGlsZSBlZmZlY3RzIGxpa2UgdGludCBvciBhbHBoYSwgYW5kIHlvdSBjYW4gY2hhbmdlIHRoZVxyXG4gKiB0aWxlcyBpbiBhIER5bmFtaWNUaWxlbWFwTGF5ZXIuXHJcbiAqIFxyXG4gKiBVc2UgdGhpcyBvdmVyIGEgU3RhdGljIFRpbGVtYXAgTGF5ZXIgd2hlbiB5b3UgbmVlZCB0aG9zZSBmZWF0dXJlcy5cclxuICpcclxuICogQGNsYXNzIER5bmFtaWNUaWxlbWFwTGF5ZXJcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5UaWxlbWFwc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Db21wdXRlZFNpemVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1cclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuVmlzaWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSB0aWxlbWFwIC0gVGhlIFRpbGVtYXAgdGhpcyBsYXllciBpcyBhIHBhcnQgb2YuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gbGF5ZXJJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheWVyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW118UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXR8UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXRbXSl9IHRpbGVzZXQgLSBUaGUgdGlsZXNldCwgb3IgYW4gYXJyYXkgb2YgdGlsZXNldHMsIHVzZWQgdG8gcmVuZGVyIHRoaXMgbGF5ZXIuIENhbiBiZSBhIHN0cmluZyBvciBhIFRpbGVzZXQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgd29ybGQgeCBwb3NpdGlvbiB3aGVyZSB0aGUgdG9wIGxlZnQgb2YgdGhpcyBsYXllciB3aWxsIGJlIHBsYWNlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHdvcmxkIHkgcG9zaXRpb24gd2hlcmUgdGhlIHRvcCBsZWZ0IG9mIHRoaXMgbGF5ZXIgd2lsbCBiZSBwbGFjZWQuXHJcbiAqL1xyXG52YXIgRHluYW1pY1RpbGVtYXBMYXllciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogR2FtZU9iamVjdCxcclxuXHJcbiAgICBNaXhpbnM6IFtcclxuICAgICAgICBDb21wb25lbnRzLkFscGhhLFxyXG4gICAgICAgIENvbXBvbmVudHMuQmxlbmRNb2RlLFxyXG4gICAgICAgIENvbXBvbmVudHMuQ29tcHV0ZWRTaXplLFxyXG4gICAgICAgIENvbXBvbmVudHMuRGVwdGgsXHJcbiAgICAgICAgQ29tcG9uZW50cy5GbGlwLFxyXG4gICAgICAgIENvbXBvbmVudHMuR2V0Qm91bmRzLFxyXG4gICAgICAgIENvbXBvbmVudHMuT3JpZ2luLFxyXG4gICAgICAgIENvbXBvbmVudHMuUGlwZWxpbmUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5UcmFuc2Zvcm0sXHJcbiAgICAgICAgQ29tcG9uZW50cy5WaXNpYmxlLFxyXG4gICAgICAgIENvbXBvbmVudHMuU2Nyb2xsRmFjdG9yLFxyXG4gICAgICAgIER5bmFtaWNUaWxlbWFwTGF5ZXJSZW5kZXJcclxuICAgIF0sXHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBEeW5hbWljVGlsZW1hcExheWVyIChzY2VuZSwgdGlsZW1hcCwgbGF5ZXJJbmRleCwgdGlsZXNldCwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdEeW5hbWljVGlsZW1hcExheWVyJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBwaHlzaWNzIHN5c3RlbSB0byBwZXJmb3JtIGZhc3QgdHlwZSBjaGVja3MuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNpc1RpbGVtYXBcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmlzVGlsZW1hcCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBUaWxlbWFwIHRoYXQgdGhpcyBsYXllciBpcyBhIHBhcnQgb2YuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciN0aWxlbWFwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZW1hcCA9IHRpbGVtYXA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjbGF5ZXJJbmRleFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGF5ZXJJbmRleCA9IGxheWVySW5kZXg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBMYXllckRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5ZXIuIExheWVyRGF0YSBjYW4gb25seSBiZSBhc3NvY2lhdGVkIHdpdGggb25lXHJcbiAgICAgICAgICogdGlsZW1hcCBsYXllci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2xheWVyXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5MYXllckRhdGF9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sYXllciA9IHRpbGVtYXAubGF5ZXJzW2xheWVySW5kZXhdO1xyXG5cclxuICAgICAgICAvLyBMaW5rIHRoZSBMYXllckRhdGEgd2l0aCB0aGlzIHN0YXRpYyB0aWxlbWFwIGxheWVyXHJcbiAgICAgICAgdGhpcy5sYXllci50aWxlbWFwTGF5ZXIgPSB0aGlzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVGlsZXNldC9zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheWVyLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEFzIG9mIFBoYXNlciAzLjE0IHRoaXMgcHJvcGVydHkgaXMgbm93IGFuIGFycmF5IG9mIFRpbGVzZXQgb2JqZWN0cywgcHJldmlvdXNseSBpdCB3YXMgYSBzaW5nbGUgcmVmZXJlbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjdGlsZXNldFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuVGlsZXNldFtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZXNldCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgd2l0aCB0aGUgY2FudmFzIHJlbmRlci4gVGhpcyBob2xkcyB0aGUgdGlsZXMgdGhhdCBhcmUgdmlzaWJsZSB3aXRoaW4gdGhlXHJcbiAgICAgICAgICogY2FtZXJhLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY3VsbGVkVGlsZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdWxsZWRUaWxlcyA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBZb3UgY2FuIGNvbnRyb2wgaWYgdGhlIENhbWVyYXMgc2hvdWxkIGN1bGwgdGlsZXMgYmVmb3JlIHJlbmRlcmluZyB0aGVtIG9yIG5vdC5cclxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSBjYW1lcmEgd2lsbCB0cnkgdG8gY3VsbCB0aGUgdGlsZXMgaW4gdGhpcyBsYXllciwgdG8gYXZvaWQgb3Zlci1kcmF3aW5nIHRvIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGluc3RhbmNlcyB3aGVuIHlvdSBtYXkgd2lzaCB0byBkaXNhYmxlIHRoaXMsIGFuZCB0b2dnbGluZyB0aGlzIGZsYWcgYWxsb3dzXHJcbiAgICAgICAgICogeW91IHRvIGRvIHNvLiBBbHNvIHNlZSBgc2V0U2tpcEN1bGxgIGZvciBhIGNoYWluYWJsZSBtZXRob2QgdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjc2tpcEN1bGxcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5za2lwQ3VsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbGVzIGRyYXduIGJ5IHRoZSByZW5kZXJlciBpbiB0aGUgbGFzdCBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3RpbGVzRHJhd25cclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlc0RyYXduID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aWxlcyBpbiB0aGlzIGxheWVyLiBVcGRhdGVkIGV2ZXJ5IGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjdGlsZXNUb3RhbFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVzVG90YWwgPSB0aGlzLmxheWVyLndpZHRoICogdGhpcy5sYXllci5oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbW91bnQgb2YgZXh0cmEgdGlsZXMgdG8gYWRkIGludG8gdGhlIGN1bGwgcmVjdGFuZ2xlIHdoZW4gY2FsY3VsYXRpbmcgaXRzIGhvcml6b250YWwgc2l6ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNlZSB0aGUgbWV0aG9kIGBzZXRDdWxsUGFkZGluZ2AgZm9yIG1vcmUgZGV0YWlscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2N1bGxQYWRkaW5nWFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4xMS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdWxsUGFkZGluZ1ggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYW1vdW50IG9mIGV4dHJhIHRpbGVzIHRvIGFkZCBpbnRvIHRoZSBjdWxsIHJlY3RhbmdsZSB3aGVuIGNhbGN1bGF0aW5nIGl0cyB2ZXJ0aWNhbCBzaXplLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogU2VlIHRoZSBtZXRob2QgYHNldEN1bGxQYWRkaW5nYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY3VsbFBhZGRpbmdZXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1bGxQYWRkaW5nWSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgdGlsZXMgYXJlIGN1bGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgd2lsbCBjYWxsIGBUaWxlbWFwQ29tcG9uZW50cy5DdWxsVGlsZXNgIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY2FsbCBhbnkgZnVuY3Rpb24geW91IGxpa2UuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJdCB3aWxsIGJlIHNlbnQgMyBhcmd1bWVudHM6XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAxLiBUaGUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSBvYmplY3QgZm9yIHRoaXMgTGF5ZXJcclxuICAgICAgICAgKiAyLiBUaGUgQ2FtZXJhIHRoYXQgaXMgY3VsbGluZyB0aGUgbGF5ZXIuIFlvdSBjYW4gY2hlY2sgaXRzIGBkaXJ0eWAgcHJvcGVydHkgdG8gc2VlIGlmIGl0IGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGN1bGwuXHJcbiAgICAgICAgICogMy4gQSByZWZlcmVuY2UgdG8gdGhlIGBjdWxsZWRUaWxlc2AgYXJyYXksIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHN0b3JlIHRoZSB0aWxlcyB5b3Ugd2FudCByZW5kZXJlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFNlZSB0aGUgYFRpbGVtYXBDb21wb25lbnRzLkN1bGxUaWxlc2Agc291cmNlIGNvZGUgZm9yIGRldGFpbHMgb24gaW1wbGVtZW50aW5nIHlvdXIgb3duIGN1bGxpbmcgc3lzdGVtLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY3VsbENhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjExLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1bGxDYWxsYmFjayA9IFRpbGVtYXBDb21wb25lbnRzLkN1bGxUaWxlcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJlbmRlcmluZyAoZHJhdykgb3JkZXIgb2YgdGhlIHRpbGVzIGluIHRoaXMgbGF5ZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgMCB3aGljaCBpcyAncmlnaHQtZG93bicsIG1lYW5pbmcgaXQgd2lsbCBkcmF3IHRoZSB0aWxlcyBzdGFydGluZyBmcm9tIHRoZSB0b3AtbGVmdCxcclxuICAgICAgICAgKiBkcmF3aW5nIHRvIHRoZSByaWdodCBhbmQgdGhlbiBtb3ZpbmcgZG93biB0byB0aGUgbmV4dCByb3cuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGRyYXcgb3JkZXJzIGFyZTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiAwID0gcmlnaHQtZG93blxyXG4gICAgICAgICAqIDEgPSBsZWZ0LWRvd25cclxuICAgICAgICAgKiAyID0gcmlnaHQtdXBcclxuICAgICAgICAgKiAzID0gbGVmdC11cFxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZSBgc2V0UmVuZGVyT3JkZXJgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI19yZW5kZXJPcmRlclxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9yZW5kZXJPcmRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgdGlsZSBpbmRleGVzIGFuZCB0aGUgdGlsZXNldCB0aGV5IGJlbG9uZyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2dpZE1hcFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuVGlsZXNldFtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjE0LjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmdpZE1hcCA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnNldFRpbGVzZXRzKHRpbGVzZXQpO1xyXG4gICAgICAgIHRoaXMuc2V0QWxwaGEodGhpcy5sYXllci5hbHBoYSk7XHJcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLnNldE9yaWdpbigpO1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh0aWxlbWFwLnRpbGVXaWR0aCAqIHRoaXMubGF5ZXIud2lkdGgsIHRpbGVtYXAudGlsZUhlaWdodCAqIHRoaXMubGF5ZXIuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0UGlwZWxpbmUoJ1RleHR1cmVUaW50UGlwZWxpbmUnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3B1bGF0ZXMgdGhlIGludGVybmFsIGB0aWxlc2V0YCBhcnJheSB3aXRoIHRoZSBUaWxlc2V0IHJlZmVyZW5jZXMgdGhpcyBMYXllciByZXF1aXJlcyBmb3IgcmVuZGVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjc2V0VGlsZXNldHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXXxQaGFzZXIuVGlsZW1hcHMuVGlsZXNldHxQaGFzZXIuVGlsZW1hcHMuVGlsZXNldFtdKX0gdGlsZXNldCAtIFRoZSB0aWxlc2V0LCBvciBhbiBhcnJheSBvZiB0aWxlc2V0cywgdXNlZCB0byByZW5kZXIgdGhpcyBsYXllci4gQ2FuIGJlIGEgc3RyaW5nIG9yIGEgVGlsZXNldCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRpbGVzZXRzOiBmdW5jdGlvbiAodGlsZXNldHMpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdpZE1hcCA9IFtdO1xyXG4gICAgICAgIHZhciBzZXRMaXN0ID0gW107XHJcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMudGlsZW1hcDtcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRpbGVzZXRzKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpbGVzZXRzID0gWyB0aWxlc2V0cyBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlc2V0cy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0aWxlc2V0ID0gdGlsZXNldHNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRpbGVzZXQgPT09ICdzdHJpbmcnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aWxlc2V0ID0gbWFwLmdldFRpbGVzZXQodGlsZXNldCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aWxlc2V0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZXRMaXN0LnB1c2godGlsZXNldCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHMgPSB0aWxlc2V0LmZpcnN0Z2lkO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgdGlsZXNldC50b3RhbDsgdCsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdpZE1hcFtzICsgdF0gPSB0aWxlc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdpZE1hcCA9IGdpZE1hcDtcclxuICAgICAgICB0aGlzLnRpbGVzZXQgPSBzZXRMaXN0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHJlbmRlcmluZyAoZHJhdykgb3JkZXIgb2YgdGhlIHRpbGVzIGluIHRoaXMgbGF5ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkZWZhdWx0IGlzICdyaWdodC1kb3duJywgbWVhbmluZyBpdCB3aWxsIG9yZGVyIHRoZSB0aWxlcyBzdGFydGluZyBmcm9tIHRoZSB0b3AtbGVmdCxcclxuICAgICAqIGRyYXdpbmcgdG8gdGhlIHJpZ2h0IGFuZCB0aGVuIG1vdmluZyBkb3duIHRvIHRoZSBuZXh0IHJvdy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGRyYXcgb3JkZXJzIGFyZTpcclxuICAgICAqIFxyXG4gICAgICogMCA9IHJpZ2h0LWRvd25cclxuICAgICAqIDEgPSBsZWZ0LWRvd25cclxuICAgICAqIDIgPSByaWdodC11cFxyXG4gICAgICogMyA9IGxlZnQtdXBcclxuICAgICAqIFxyXG4gICAgICogU2V0dGluZyB0aGUgcmVuZGVyIG9yZGVyIGRvZXMgbm90IGNoYW5nZSB0aGUgdGlsZXMgb3IgaG93IHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgbGF5ZXIsXHJcbiAgICAgKiBpdCBwdXJlbHkgaW1wYWN0cyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgcmVuZGVyZWQuXHJcbiAgICAgKiBcclxuICAgICAqIFlvdSBjYW4gcHJvdmlkZSBlaXRoZXIgYW4gaW50ZWdlciAoMCB0byAzKSwgb3IgdGhlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBvcmRlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3NldFJlbmRlck9yZGVyXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxzdHJpbmcpfSByZW5kZXJPcmRlciAtIFRoZSByZW5kZXIgKGRyYXcpIG9yZGVyIHZhbHVlLiBFaXRoZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDMsIG9yIGEgc3RyaW5nOiAncmlnaHQtZG93bicsICdsZWZ0LWRvd24nLCAncmlnaHQtdXAnIG9yICdsZWZ0LXVwJy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSZW5kZXJPcmRlcjogZnVuY3Rpb24gKHJlbmRlck9yZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvcmRlcnMgPSBbICdyaWdodC1kb3duJywgJ2xlZnQtZG93bicsICdyaWdodC11cCcsICdsZWZ0LXVwJyBdO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHJlbmRlck9yZGVyID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlck9yZGVyID0gb3JkZXJzLmluZGV4T2YocmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlck9yZGVyID49IDAgJiYgcmVuZGVyT3JkZXIgPCA0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT3JkZXIgPSByZW5kZXJPcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgaW50ZXJlc3RpbmcgZmFjZXMgYXQgdGhlIGdpdmVuIHRpbGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNwZWNpZmllZCBsYXllci4gSW50ZXJlc3RpbmdcclxuICAgICAqIGZhY2VzIGFyZSB1c2VkIGludGVybmFsbHkgZm9yIG9wdGltaXppbmcgY29sbGlzaW9ucyBhZ2FpbnN0IHRpbGVzLiBUaGlzIG1ldGhvZCBpcyBtb3N0bHkgdXNlZFxyXG4gICAgICogaW50ZXJuYWxseSB0byBvcHRpbWl6ZSByZWNhbGN1bGF0aW5nIGZhY2VzIHdoZW4gb25seSBvbmUgdGlsZSBoYXMgYmVlbiBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY2FsY3VsYXRlRmFjZXNBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlRmFjZXNBdDogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSlcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5DYWxjdWxhdGVGYWNlc0F0KHRpbGVYLCB0aWxlWSwgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgaW50ZXJlc3RpbmcgZmFjZXMgd2l0aGluIHRoZSByZWN0YW5ndWxhciBhcmVhIHNwZWNpZmllZCAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlXHJcbiAgICAgKiBsYXllci4gSW50ZXJlc3RpbmcgZmFjZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3Igb3B0aW1pemluZyBjb2xsaXNpb25zIGFnYWluc3QgdGlsZXMuIFRoaXMgbWV0aG9kXHJcbiAgICAgKiBpcyBtb3N0bHkgdXNlZCBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY2FsY3VsYXRlRmFjZXNXaXRoaW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZUZhY2VzV2l0aGluOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLkNhbGN1bGF0ZUZhY2VzV2l0aGluKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBTcHJpdGUgZm9yIGV2ZXJ5IG9iamVjdCBtYXRjaGluZyB0aGUgZ2l2ZW4gdGlsZSBpbmRleGVzIGluIHRoZSBsYXllci4gWW91IGNhblxyXG4gICAgICogb3B0aW9uYWxseSBzcGVjaWZ5IGlmIGVhY2ggdGlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBuZXcgdGlsZSBhZnRlciB0aGUgU3ByaXRlIGhhcyBiZWVuXHJcbiAgICAgKiBjcmVhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBsYXkgZG93biBzcGVjaWFsIHRpbGVzIGluIGEgbGV2ZWwgdGhhdCBhcmUgY29udmVydGVkIHRvXHJcbiAgICAgKiBTcHJpdGVzLCBidXQgd2FudCB0byByZXBsYWNlIHRoZSB0aWxlIGl0c2VsZiB3aXRoIGEgZmxvb3IgdGlsZSBvciBzaW1pbGFyIG9uY2UgY29udmVydGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjY3JlYXRlRnJvbVRpbGVzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gaW5kZXhlcyAtIFRoZSB0aWxlIGluZGV4LCBvciBhcnJheSBvZiBpbmRleGVzLCB0byBjcmVhdGUgU3ByaXRlcyBmcm9tLlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IHJlcGxhY2VtZW50cyAtIFRoZSB0aWxlIGluZGV4LCBvciBhcnJheSBvZiBpbmRleGVzLCB0byBjaGFuZ2UgYSBjb252ZXJ0ZWRcclxuICAgICAqIHRpbGUgdG8uIFNldCB0byBgbnVsbGAgdG8gbGVhdmUgdGhlIHRpbGVzIHVuY2hhbmdlZC4gSWYgYW4gYXJyYXkgaXMgZ2l2ZW4sIGl0IGlzIGFzc3VtZWQgdG8gYmUgYVxyXG4gICAgICogb25lLXRvLW9uZSBtYXBwaW5nIHdpdGggdGhlIGluZGV4ZXMgYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5TcHJpdGUuU3ByaXRlQ29uZmlnfSBzcHJpdGVDb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBwYXNzIGludG8gdGhlIFNwcml0ZSBjcmVhdG9yIChpLmUuXHJcbiAgICAgKiBzY2VuZS5tYWtlLnNwcml0ZSkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gW3NjZW5lPXNjZW5lIHRoZSBtYXAgaXMgd2l0aGluXSAtIFRoZSBTY2VuZSB0byBjcmVhdGUgdGhlIFNwcml0ZXMgd2l0aGluLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHRoZSB3b3JsZCBYWVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGVbXX0gQW4gYXJyYXkgb2YgdGhlIFNwcml0ZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUZyb21UaWxlczogZnVuY3Rpb24gKGluZGV4ZXMsIHJlcGxhY2VtZW50cywgc3ByaXRlQ29uZmlnLCBzY2VuZSwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5DcmVhdGVGcm9tVGlsZXMoaW5kZXhlcywgcmVwbGFjZW1lbnRzLCBzcHJpdGVDb25maWcsIHNjZW5lLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiBsYXllciB0aGF0IGFyZSB3aXRoaW4gdGhlIGNhbWVyYXMgdmlld3BvcnQuXHJcbiAgICAgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2N1bGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmFdIC0gVGhlIENhbWVyYSB0byBydW4gdGhlIGN1bGwgY2hlY2sgYWdhaW5zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSBBbiBhcnJheSBvZiBUaWxlIG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGN1bGw6IGZ1bmN0aW9uIChjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VsbENhbGxiYWNrKHRoaXMubGF5ZXIsIGNhbWVyYSwgdGhpcy5jdWxsZWRUaWxlcywgdGhpcy5fcmVuZGVyT3JkZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcGllcyB0aGUgdGlsZXMgaW4gdGhlIHNvdXJjZSByZWN0YW5ndWxhciBhcmVhIHRvIGEgbmV3IGRlc3RpbmF0aW9uIChhbGwgc3BlY2lmaWVkIGluIHRpbGVcclxuICAgICAqIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlIGxheWVyLiBUaGlzIGNvcGllcyBhbGwgdGlsZSBwcm9wZXJ0aWVzICYgcmVjYWxjdWxhdGVzIGNvbGxpc2lvblxyXG4gICAgICogaW5mb3JtYXRpb24gaW4gdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2NvcHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gc3JjVGlsZVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGNvcHkgZnJvbSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHNyY1RpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBjb3B5IGZyb20sIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYXJlYSB0byBjb3B5LCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgYXJlYSB0byBjb3B5LCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGVzdFRpbGVYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBjb3B5IHRvLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZGVzdFRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBjb3B5IHRvLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY29weTogZnVuY3Rpb24gKHNyY1RpbGVYLCBzcmNUaWxlWSwgd2lkdGgsIGhlaWdodCwgZGVzdFRpbGVYLCBkZXN0VGlsZVksIHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuQ29weShzcmNUaWxlWCwgc3JjVGlsZVksIHdpZHRoLCBoZWlnaHQsIGRlc3RUaWxlWCwgZGVzdFRpbGVZLCByZWNhbGN1bGF0ZUZhY2VzLCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBEeW5hbWljVGlsZW1hcExheWVyIGFuZCByZW1vdmVzIGl0cyBsaW5rIHRvIHRoZSBhc3NvY2lhdGVkIExheWVyRGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZW1vdmVGcm9tVGlsZW1hcD10cnVlXSAtIFJlbW92ZSB0aGlzIGxheWVyIGZyb20gdGhlIHBhcmVudCBUaWxlbWFwP1xyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAocmVtb3ZlRnJvbVRpbGVtYXApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJlbW92ZUZyb21UaWxlbWFwID09PSB1bmRlZmluZWQpIHsgcmVtb3ZlRnJvbVRpbGVtYXAgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy50aWxlbWFwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEFib3J0LCB3ZSd2ZSBhbHJlYWR5IGJlZW4gZGVzdHJveWVkXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBVbmluc3RhbGwgdGhpcyBsYXllciBvbmx5IGlmIGl0IGlzIHN0aWxsIGluc3RhbGxlZCBvbiB0aGUgTGF5ZXJEYXRhIG9iamVjdFxyXG4gICAgICAgIGlmICh0aGlzLmxheWVyLnRpbGVtYXBMYXllciA9PT0gdGhpcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5ZXIudGlsZW1hcExheWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZUZyb21UaWxlbWFwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50aWxlbWFwLnJlbW92ZUxheWVyKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50aWxlbWFwID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMubGF5ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5jdWxsZWRUaWxlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY3VsbENhbGxiYWNrID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5naWRNYXAgPSBbXTtcclxuICAgICAgICB0aGlzLnRpbGVzZXQgPSBbXTtcclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIgd2l0aCB0aGVcclxuICAgICAqIHNwZWNpZmllZCBpbmRleC4gVGlsZXMgd2lsbCBiZSBzZXQgdG8gY29sbGlkZSBpZiB0aGUgZ2l2ZW4gaW5kZXggaXMgYSBjb2xsaWRpbmcgaW5kZXguXHJcbiAgICAgKiBDb2xsaXNpb24gaW5mb3JtYXRpb24gaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2ZpbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdGlsZSBpbmRleCB0byBmaWxsIHRoZSBhcmVhIHdpdGguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIGB0cnVlYCBpZiB0aGUgZmFjZXMgZGF0YSBzaG91bGQgYmUgcmVjYWxjdWxhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaWxsOiBmdW5jdGlvbiAoaW5kZXgsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5GaWxsKGluZGV4LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHJlY2FsY3VsYXRlRmFjZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIsIHJ1biB0aGUgZ2l2ZW5cclxuICAgICAqIGZpbHRlciBjYWxsYmFjayBmdW5jdGlvbi4gQW55IHRpbGVzIHRoYXQgcGFzcyB0aGUgZmlsdGVyIHRlc3QgKGkuZS4gd2hlcmUgdGhlIGNhbGxiYWNrIHJldHVybnNcclxuICAgICAqIHRydWUpIHdpbGwgcmV0dXJuZWQgYXMgYSBuZXcgYXJyYXkuIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLkZpbHRlciBpbiB2YW5pbGxhIEpTLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZmlsdGVyVGlsZXNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIHRpbGUgaW4gdGhlIGdpdmVuIGFyZWEgd2lsbCBiZSBwYXNzZWQgdG8gdGhpc1xyXG4gICAgICogY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlci4gVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdGlsZXMgdGhhdCBwYXNzIHRoZVxyXG4gICAgICogZmlsdGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IHVuZGVyIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgZmlsdGVyVGlsZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5GaWx0ZXJUaWxlcyhjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2hlcyB0aGUgZW50aXJlIG1hcCBsYXllciBmb3IgdGhlIGZpcnN0IHRpbGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGluZGV4LCB0aGVuIHJldHVybnMgdGhhdCBUaWxlXHJcbiAgICAgKiBvYmplY3QuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCBpdCByZXR1cm5zIG51bGwuIFRoZSBzZWFyY2ggc3RhcnRzIGZyb20gdGhlIHRvcC1sZWZ0IHRpbGUgYW5kXHJcbiAgICAgKiBjb250aW51ZXMgaG9yaXpvbnRhbGx5IHVudGlsIGl0IGhpdHMgdGhlIGVuZCBvZiB0aGUgcm93LCB0aGVuIGl0IGRyb3BzIGRvd24gdG8gdGhlIG5leHQgY29sdW1uLlxyXG4gICAgICogSWYgdGhlIHJldmVyc2UgYm9vbGVhbiBpcyB0cnVlLCBpdCBzY2FucyBzdGFydGluZyBmcm9tIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIHRyYXZlbGluZyB1cCB0b1xyXG4gICAgICogdGhlIHRvcC1sZWZ0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZmluZEJ5SW5kZXhcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdGlsZSBpbmRleCB2YWx1ZSB0byBzZWFyY2ggZm9yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbc2tpcD0wXSAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2tpcCBhIG1hdGNoaW5nIHRpbGUgYmVmb3JlIHJldHVybmluZy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIC0gSWYgdHJ1ZSBpdCB3aWxsIHNjYW4gdGhlIGxheWVyIGluIHJldmVyc2UsIHN0YXJ0aW5nIGF0IHRoZVxyXG4gICAgICogYm90dG9tLXJpZ2h0LiBPdGhlcndpc2UgaXQgc2NhbnMgZnJvbSB0aGUgdG9wLWxlZnQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IEEgVGlsZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZpbmRCeUluZGV4OiBmdW5jdGlvbiAoZmluZEluZGV4LCBza2lwLCByZXZlcnNlKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5GaW5kQnlJbmRleChmaW5kSW5kZXgsIHNraXAsIHJldmVyc2UsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgdGhlIGZpcnN0IHRpbGUgaW4gdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZSBsYXllciB0aGF0XHJcbiAgICAgKiBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIEkuZS4gZmluZHMgdGhlIGZpcnN0IHRpbGUgZm9yIHdoaWNoIGBjYWxsYmFja2AgcmV0dXJuc1xyXG4gICAgICogdHJ1ZS4gU2ltaWxhciB0byBBcnJheS5wcm90b3R5cGUuZmluZCBpbiB2YW5pbGxhIEpTLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZmluZFRpbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RmluZFRpbGVDYWxsYmFja30gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suIEVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gc2VhcmNoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gc2VhcmNoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5GaWx0ZXJpbmdPcHRpb25zfSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7P1BoYXNlci5UaWxlbWFwcy5UaWxlfVxyXG4gICAgICovXHJcbiAgICBmaW5kVGlsZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkZpbmRUaWxlKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBlYWNoIHRpbGUgaW4gdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGluIHRpbGUgY29vcmRpbmF0ZXMpIG9mIHRoZSBsYXllciwgcnVuIHRoZSBnaXZlblxyXG4gICAgICogY2FsbGJhY2suIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggaW4gdmFuaWxsYSBKUy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2ZvckVhY2hUaWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VhY2hUaWxlQ2FsbGJhY2t9IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIHRpbGUgaW4gdGhlIGdpdmVuIGFyZWEgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBjYWxsYmFjayBhcyB0aGUgZmlyc3QgYW5kIG9ubHkgcGFyYW1ldGVyLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IHVuZGVyIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgcnVuLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIHNlYXJjaC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIHNlYXJjaC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoVGlsZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuRm9yRWFjaFRpbGUoY2FsbGJhY2ssIGNvbnRleHQsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB0aWxlIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGZyb20gdGhlIGdpdmVuIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZ2V0VGlsZUF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gWCBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSAoZ2l2ZW4gaW4gdGlsZSB1bml0cywgbm90IHBpeGVscykuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gWSBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSAoZ2l2ZW4gaW4gdGlsZSB1bml0cywgbm90IHBpeGVscykuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtub25OdWxsPWZhbHNlXSAtIElmIHRydWUgZ2V0VGlsZSB3b24ndCByZXR1cm4gbnVsbCBmb3IgZW1wdHkgdGlsZXMsIGJ1dCBhIFRpbGUgb2JqZWN0IHdpdGggYW4gaW5kZXggb2YgLTEuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoZSB0aWxlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBvciBudWxsIGlmIG5vIHRpbGUgd2FzIGZvdW5kIG9yIHRoZSBjb29yZGluYXRlcyB3ZXJlIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVBdDogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgbm9uTnVsbClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuR2V0VGlsZUF0KHRpbGVYLCB0aWxlWSwgbm9uTnVsbCwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIHRpbGUgYXQgdGhlIGdpdmVuIHdvcmxkIGNvb3JkaW5hdGVzIGZyb20gdGhlIGdpdmVuIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZ2V0VGlsZUF0V29ybGRYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFggcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHBpeGVscylcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBZIHBvc2l0aW9uIHRvIGdldCB0aGUgdGlsZSBmcm9tIChnaXZlbiBpbiBwaXhlbHMpXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtub25OdWxsPWZhbHNlXSAtIElmIHRydWUsIGZ1bmN0aW9uIHdvbid0IHJldHVybiBudWxsIGZvciBlbXB0eSB0aWxlcywgYnV0IGEgVGlsZSBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGV9IFRoZSB0aWxlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcyBvciBudWxsIGlmIG5vIHRpbGUgd2FzIGZvdW5kIG9yIHRoZSBjb29yZGluYXRlc1xyXG4gICAgICogd2VyZSBpbnZhbGlkLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlQXRXb3JsZFhZOiBmdW5jdGlvbiAod29ybGRYLCB3b3JsZFksIG5vbk51bGwsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuR2V0VGlsZUF0V29ybGRYWSh3b3JsZFgsIHdvcmxkWSwgbm9uTnVsbCwgY2FtZXJhLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0aWxlcyBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZ2V0VGlsZXNXaXRoaW5cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5GaWx0ZXJpbmdPcHRpb25zfSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gQW4gYXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc1dpdGhpbjogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuR2V0VGlsZXNXaXRoaW4odGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0aWxlcyB0aGF0IG92ZXJsYXAgd2l0aCB0aGUgZ2l2ZW4gc2hhcGUgaW4gdGhlIGdpdmVuIGxheWVyLiBUaGUgc2hhcGUgbXVzdCBiZSBhIENpcmNsZSxcclxuICAgICAqIExpbmUsIFJlY3RhbmdsZSBvciBUcmlhbmdsZS4gVGhlIHNoYXBlIHNob3VsZCBiZSBpbiB3b3JsZCBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2dldFRpbGVzV2l0aGluU2hhcGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLkNpcmNsZXxQaGFzZXIuR2VvbS5MaW5lfFBoYXNlci5HZW9tLlJlY3RhbmdsZXxQaGFzZXIuR2VvbS5UcmlhbmdsZSl9IHNoYXBlIC0gQSBzaGFwZSBpbiB3b3JsZCAocGl4ZWwpIGNvb3JkaW5hdGVzXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5GaWx0ZXJpbmdPcHRpb25zfSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gZmFjdG9yaW5nIGluIHdoaWNoIHRpbGVzIHRvIHJldHVybi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSBBbiBhcnJheSBvZiBUaWxlIG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVzV2l0aGluU2hhcGU6IGZ1bmN0aW9uIChzaGFwZSwgZmlsdGVyaW5nT3B0aW9ucywgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpblNoYXBlKHNoYXBlLCBmaWx0ZXJpbmdPcHRpb25zLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB3b3JsZCBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjZ2V0VGlsZXNXaXRoaW5Xb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHdvcmxkIHggY29vcmRpbmF0ZSBmb3IgdGhlIHRvcC1sZWZ0IG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB3b3JsZCB5IGNvb3JkaW5hdGUgZm9yIHRoZSB0b3AtbGVmdCBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gQW4gYXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc1dpdGhpbldvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpbldvcmxkWFkod29ybGRYLCB3b3JsZFksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gKGluIHRpbGUgY29vcmRpbmF0ZXMpIGluIHRoZSBnaXZlbiBsYXllci4gUmV0dXJuc1xyXG4gICAgICogZmFsc2UgaWYgdGhlcmUgaXMgbm8gdGlsZSBvciBpZiB0aGUgdGlsZSBhdCB0aGF0IGxvY2F0aW9uIGhhcyBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI2hhc1RpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBhIHRpbGUgd2FzIGZvdW5kIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhhc1RpbGVBdDogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuSGFzVGlsZUF0KHRpbGVYLCB0aWxlWSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gKGluIHdvcmxkIGNvb3JkaW5hdGVzKSBpbiB0aGUgZ2l2ZW4gbGF5ZXIuIFJldHVybnNcclxuICAgICAqIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHRpbGUgb3IgaWYgdGhlIHRpbGUgYXQgdGhhdCBsb2NhdGlvbiBoYXMgYW4gaW5kZXggb2YgLTEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNoYXNUaWxlQXRXb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHggY29vcmRpbmF0ZSwgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBmYWN0b3JpbmcgaW4gd2hpY2ggdGlsZXMgdG8gcmV0dXJuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiBhIHRpbGUgd2FzIGZvdW5kIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhhc1RpbGVBdFdvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5IYXNUaWxlQXRXb3JsZFhZKHdvcmxkWCwgd29ybGRZLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1dHMgYSB0aWxlIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIuIFlvdSBjYW4gcGFzcyBpbiBlaXRoZXIgYW4gaW5kZXhcclxuICAgICAqIG9yIGEgVGlsZSBvYmplY3QuIElmIHlvdSBwYXNzIGluIGEgVGlsZSwgYWxsIGF0dHJpYnV0ZXMgd2lsbCBiZSBjb3BpZWQgb3ZlciB0byB0aGUgc3BlY2lmaWVkXHJcbiAgICAgKiBsb2NhdGlvbi4gSWYgeW91IHBhc3MgaW4gYW4gaW5kZXgsIG9ubHkgdGhlIGluZGV4IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2lsbCBiZSBjaGFuZ2VkLlxyXG4gICAgICogQ29sbGlzaW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNwdXRUaWxlQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLlRpbGUpfSB0aWxlIC0gVGhlIGluZGV4IG9mIHRoaXMgdGlsZSB0byBzZXQgb3IgYSBUaWxlIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gQSBUaWxlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHV0VGlsZUF0OiBmdW5jdGlvbiAodGlsZSwgdGlsZVgsIHRpbGVZLCByZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5QdXRUaWxlQXQodGlsZSwgdGlsZVgsIHRpbGVZLCByZWNhbGN1bGF0ZUZhY2VzLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQdXRzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gd29ybGQgY29vcmRpbmF0ZXMgKHBpeGVscykgaW4gdGhlIHNwZWNpZmllZCBsYXllci4gWW91IGNhbiBwYXNzIGluIGVpdGhlclxyXG4gICAgICogYW4gaW5kZXggb3IgYSBUaWxlIG9iamVjdC4gSWYgeW91IHBhc3MgaW4gYSBUaWxlLCBhbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCBvdmVyIHRvIHRoZVxyXG4gICAgICogc3BlY2lmaWVkIGxvY2F0aW9uLiBJZiB5b3UgcGFzcyBpbiBhbiBpbmRleCwgb25seSB0aGUgaW5kZXggYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aWxsIGJlXHJcbiAgICAgKiBjaGFuZ2VkLiBDb2xsaXNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSByZWNhbGN1bGF0ZWQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3B1dFRpbGVBdFdvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KGludGVnZXJ8UGhhc2VyLlRpbGVtYXBzLlRpbGUpfSB0aWxlIC0gVGhlIGluZGV4IG9mIHRoaXMgdGlsZSB0byBzZXQgb3IgYSBUaWxlIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgeCBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIGB0cnVlYCBpZiB0aGUgZmFjZXMgZGF0YSBzaG91bGQgYmUgcmVjYWxjdWxhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gQSBUaWxlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHV0VGlsZUF0V29ybGRYWTogZnVuY3Rpb24gKHRpbGUsIHdvcmxkWCwgd29ybGRZLCByZWNhbGN1bGF0ZUZhY2VzLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlB1dFRpbGVBdFdvcmxkWFkodGlsZSwgd29ybGRYLCB3b3JsZFksIHJlY2FsY3VsYXRlRmFjZXMsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHV0cyBhbiBhcnJheSBvZiB0aWxlcyBvciBhIDJEIGFycmF5IG9mIHRpbGVzIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGVjaWZpZWRcclxuICAgICAqIGxheWVyLiBUaGUgYXJyYXkgY2FuIGJlIGNvbXBvc2VkIG9mIGVpdGhlciB0aWxlIGluZGV4ZXMgb3IgVGlsZSBvYmplY3RzLiBJZiB5b3UgcGFzcyBpbiBhIFRpbGUsXHJcbiAgICAgKiBhbGwgYXR0cmlidXRlcyB3aWxsIGJlIGNvcGllZCBvdmVyIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIElmIHlvdSBwYXNzIGluIGFuIGluZGV4LCBvbmx5IHRoZVxyXG4gICAgICogaW5kZXggYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aWxsIGJlIGNoYW5nZWQuIENvbGxpc2lvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlY2FsY3VsYXRlZFxyXG4gICAgICogd2l0aGluIHRoZSByZWdpb24gdGlsZXMgd2VyZSBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjcHV0VGlsZXNBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcltdfGludGVnZXJbXVtdfFBoYXNlci5UaWxlbWFwcy5UaWxlW118UGhhc2VyLlRpbGVtYXBzLlRpbGVbXVtdKX0gdGlsZSAtIEEgcm93IChhcnJheSkgb3IgZ3JpZCAoMkQgYXJyYXkpIG9mIFRpbGVzIG9yIHRpbGUgaW5kZXhlcyB0byBwbGFjZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHV0VGlsZXNBdDogZnVuY3Rpb24gKHRpbGVzQXJyYXksIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5QdXRUaWxlc0F0KHRpbGVzQXJyYXksIHRpbGVYLCB0aWxlWSwgcmVjYWxjdWxhdGVGYWNlcywgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJhbmRvbWl6ZXMgdGhlIGluZGV4ZXMgb2YgYSByZWN0YW5ndWxhciByZWdpb24gb2YgdGlsZXMgKGluIHRpbGUgY29vcmRpbmF0ZXMpIHdpdGhpbiB0aGVcclxuICAgICAqIHNwZWNpZmllZCBsYXllci4gRWFjaCB0aWxlIHdpbGwgcmVjZWl2ZSBhIG5ldyBpbmRleC4gSWYgYW4gYXJyYXkgb2YgaW5kZXhlcyBpcyBwYXNzZWQgaW4sIHRoZW5cclxuICAgICAqIHRob3NlIHdpbGwgYmUgdXNlZCBmb3IgcmFuZG9tbHkgYXNzaWduaW5nIG5ldyB0aWxlIGluZGV4ZXMuIElmIGFuIGFycmF5IGlzIG5vdCBwcm92aWRlZCwgdGhlXHJcbiAgICAgKiBpbmRleGVzIGZvdW5kIHdpdGhpbiB0aGUgcmVnaW9uIChleGNsdWRpbmcgLTEpIHdpbGwgYmUgdXNlZCBmb3IgcmFuZG9tbHkgYXNzaWduaW5nIG5ldyB0aWxlXHJcbiAgICAgKiBpbmRleGVzLiBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRpbGUgaW5kZXhlcyBhbmQgZG9lcyBub3QgY2hhbmdlIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3JhbmRvbWl6ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcltdfSBbaW5kZXhlc10gLSBBbiBhcnJheSBvZiBpbmRleGVzIHRvIHJhbmRvbWx5IGRyYXcgZnJvbSBkdXJpbmcgcmFuZG9taXphdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmFuZG9taXplOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBpbmRleGVzKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlJhbmRvbWl6ZSh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGluZGV4ZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSB0aWxlIGF0IHRoZSBnaXZlbiB0aWxlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIgYW5kIHVwZGF0ZXMgdGhlIGxheWVyJ3NcclxuICAgICAqIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3JlbW92ZVRpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVwbGFjZVdpdGhOdWxsPXRydWVdIC0gSWYgdHJ1ZSwgdGhpcyB3aWxsIHJlcGxhY2UgdGhlIHRpbGUgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIG51bGwgaW5zdGVhZCBvZiBhIFRpbGUgd2l0aCBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBgdHJ1ZWAgaWYgdGhlIGZhY2VzIGRhdGEgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gQSBUaWxlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGlsZUF0OiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCByZXBsYWNlV2l0aE51bGwsIHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlJlbW92ZVRpbGVBdCh0aWxlWCwgdGlsZVksIHJlcGxhY2VXaXRoTnVsbCwgcmVjYWxjdWxhdGVGYWNlcywgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgdGlsZSBhdCB0aGUgZ2l2ZW4gd29ybGQgY29vcmRpbmF0ZXMgaW4gdGhlIHNwZWNpZmllZCBsYXllciBhbmQgdXBkYXRlcyB0aGUgbGF5ZXInc1xyXG4gICAgICogY29sbGlzaW9uIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjcmVtb3ZlVGlsZUF0V29ybGRYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYWNlV2l0aE51bGw9dHJ1ZV0gLSBJZiB0cnVlLCB0aGlzIHdpbGwgcmVwbGFjZSB0aGUgdGlsZSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggbnVsbCBpbnN0ZWFkIG9mIGEgVGlsZSB3aXRoIGFuIGluZGV4IG9mIC0xLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIGB0cnVlYCBpZiB0aGUgZmFjZXMgZGF0YSBzaG91bGQgYmUgcmVjYWxjdWxhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gQSBUaWxlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGlsZUF0V29ybGRYWTogZnVuY3Rpb24gKHdvcmxkWCwgd29ybGRZLCByZXBsYWNlV2l0aE51bGwsIHJlY2FsY3VsYXRlRmFjZXMsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuUmVtb3ZlVGlsZUF0V29ybGRYWSh3b3JsZFgsIHdvcmxkWSwgcmVwbGFjZVdpdGhOdWxsLCByZWNhbGN1bGF0ZUZhY2VzLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxheWVyIHRvIHRoZSBnaXZlbiBHcmFwaGljcy4gVGhpcyBpcyBoZWxwZnVsIHdoZW4geW91IHdhbnQgdG9cclxuICAgICAqIGdldCBhIHF1aWNrIGlkZWEgb2Ygd2hpY2ggb2YgeW91ciB0aWxlcyBhcmUgY29sbGlkaW5nIGFuZCB3aGljaCBoYXZlIGludGVyZXN0aW5nIGZhY2VzLiBUaGUgdGlsZXNcclxuICAgICAqIGFyZSBkcmF3biBzdGFydGluZyBhdCAoMCwgMCkgaW4gdGhlIEdyYXBoaWNzLCBhbGxvd2luZyB5b3UgdG8gcGxhY2UgdGhlIGRlYnVnIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKiB3aGVyZXZlciB5b3Ugd2FudCBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjcmVuZGVyRGVidWdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkdhbWVPYmplY3RzLkdyYXBoaWNzfSBncmFwaGljcyAtIFRoZSB0YXJnZXQgR3JhcGhpY3Mgb2JqZWN0IHRvIGRyYXcgdXBvbi5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLlN0eWxlQ29uZmlnfSBzdHlsZUNvbmZpZyAtIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBjb2xvcnMgdG8gdXNlIGZvciB0aGUgZGVidWcgZHJhd2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVuZGVyRGVidWc6IGZ1bmN0aW9uIChncmFwaGljcywgc3R5bGVDb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuUmVuZGVyRGVidWcoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnLCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGdpdmVuIGluIHRpbGUgY29vcmRpbmF0ZXMpIGZvciB0aWxlcyB3aXRoIGFuIGluZGV4IG1hdGNoaW5nXHJcbiAgICAgKiBgZmluZEluZGV4YCBhbmQgdXBkYXRlcyB0aGVpciBpbmRleCB0byBtYXRjaCBgbmV3SW5kZXhgLiBUaGlzIG9ubHkgbW9kaWZpZXMgdGhlIGluZGV4IGFuZCBkb2VzXHJcbiAgICAgKiBub3QgY2hhbmdlIGNvbGxpc2lvbiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3JlcGxhY2VCeUluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGZpbmRJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byBzZWFyY2ggZm9yLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBuZXdJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byByZXBsYWNlIGl0IHdpdGguXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXBsYWNlQnlJbmRleDogZnVuY3Rpb24gKGZpbmRJbmRleCwgbmV3SW5kZXgsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5SZXBsYWNlQnlJbmRleChmaW5kSW5kZXgsIG5ld0luZGV4LCB0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBZb3UgY2FuIGNvbnRyb2wgaWYgdGhlIENhbWVyYXMgc2hvdWxkIGN1bGwgdGlsZXMgYmVmb3JlIHJlbmRlcmluZyB0aGVtIG9yIG5vdC5cclxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNhbWVyYSB3aWxsIHRyeSB0byBjdWxsIHRoZSB0aWxlcyBpbiB0aGlzIGxheWVyLCB0byBhdm9pZCBvdmVyLWRyYXdpbmcgdG8gdGhlIHJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGluc3RhbmNlcyB3aGVuIHlvdSBtYXkgd2lzaCB0byBkaXNhYmxlIHRoaXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNzZXRTa2lwQ3VsbFxyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gU2V0IHRvIGB0cnVlYCB0byBzdG9wIGN1bGxpbmcgdGlsZXMuIFNldCB0byBgZmFsc2VgIHRvIGVuYWJsZSBjdWxsaW5nIGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNraXBDdWxsOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuc2tpcEN1bGwgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIENhbWVyYSBjdWxscyB0aGUgdGlsZXMgaW4gdGhpcyBsYXllciBpdCBkb2VzIHNvIHVzaW5nIGl0cyB2aWV3IGludG8gdGhlIHdvcmxkLCBidWlsZGluZyB1cCBhXHJcbiAgICAgKiByZWN0YW5nbGUgaW5zaWRlIHdoaWNoIHRoZSB0aWxlcyBtdXN0IGV4aXN0IG9yIHRoZXkgd2lsbCBiZSBjdWxsZWQuIFNvbWV0aW1lcyB5b3UgbWF5IG5lZWQgdG8gZXhwYW5kIHRoZSBzaXplXHJcbiAgICAgKiBvZiB0aGlzICdjdWxsIHJlY3RhbmdsZScsIGVzcGVjaWFsbHkgaWYgeW91IHBsYW4gb24gcm90YXRpbmcgdGhlIENhbWVyYSB2aWV3aW5nIHRoZSBsYXllci4gRG8gc29cclxuICAgICAqIGJ5IHByb3ZpZGluZyB0aGUgcGFkZGluZyB2YWx1ZXMuIFRoZSB2YWx1ZXMgZ2l2ZW4gYXJlIGluIHRpbGVzLCBub3QgcGl4ZWxzLiBTbyBpZiB0aGUgdGlsZSB3aWR0aCB3YXMgMzJweFxyXG4gICAgICogYW5kIHlvdSBzZXQgYHBhZGRpbmdYYCB0byBiZSA0LCBpdCB3b3VsZCBhZGQgMzJweCB4IDQgdG8gdGhlIGN1bGwgcmVjdGFuZ2xlIChhZGp1c3RlZCBmb3Igc2NhbGUpXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNzZXRDdWxsUGFkZGluZ1xyXG4gICAgICogQHNpbmNlIDMuMTEuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3BhZGRpbmdYPTFdIC0gVGhlIGFtb3VudCBvZiBleHRyYSBob3Jpem9udGFsIHRpbGVzIHRvIGFkZCB0byB0aGUgY3VsbCBjaGVjayBwYWRkaW5nLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcGFkZGluZ1k9MV0gLSBUaGUgYW1vdW50IG9mIGV4dHJhIHZlcnRpY2FsIHRpbGVzIHRvIGFkZCB0byB0aGUgY3VsbCBjaGVjayBwYWRkaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEN1bGxQYWRkaW5nOiBmdW5jdGlvbiAocGFkZGluZ1gsIHBhZGRpbmdZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChwYWRkaW5nWCA9PT0gdW5kZWZpbmVkKSB7IHBhZGRpbmdYID0gMTsgfVxyXG4gICAgICAgIGlmIChwYWRkaW5nWSA9PT0gdW5kZWZpbmVkKSB7IHBhZGRpbmdZID0gMTsgfVxyXG5cclxuICAgICAgICB0aGlzLmN1bGxQYWRkaW5nWCA9IHBhZGRpbmdYO1xyXG4gICAgICAgIHRoaXMuY3VsbFBhZGRpbmdZID0gcGFkZGluZ1k7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSBnaXZlbiB0aWxlIG9yIHRpbGVzIHdpdGhpbiBhIGxheWVyIGJ5IGluZGV4LiBZb3UgY2FuIHBhc3MgaW4gZWl0aGVyIGFcclxuICAgICAqIHNpbmdsZSBudW1lcmljIGluZGV4IG9yIGFuIGFycmF5IG9mIGluZGV4ZXM6IFsyLCAzLCAxNSwgMjBdLiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXIgY29udHJvbHMgaWZcclxuICAgICAqIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCB0aGUgbWFwJ3MgY3VycmVudCBsYXllciBpcyB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjc2V0Q29sbGlzaW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gaW5kZXhlcyAtIEVpdGhlciBhIHNpbmdsZSB0aWxlIGluZGV4LCBvciBhbiBhcnJheSBvZiB0aWxlIGluZGV4ZXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlTGF5ZXI9dHJ1ZV0gLSBJZiB0cnVlLCB1cGRhdGVzIHRoZSBjdXJyZW50IHRpbGVzIG9uIHRoZSBsYXllci4gU2V0IHRvXHJcbiAgICAgKiBmYWxzZSBpZiBubyB0aWxlcyBoYXZlIGJlZW4gcGxhY2VkIGZvciBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLlRpbGVtYXB9IFJldHVybiB0aGlzIFRpbGVtYXAgb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsYXllciBnaXZlbiB3YXMgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uOiBmdW5jdGlvbiAoaW5kZXhlcywgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIHVwZGF0ZUxheWVyKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbihpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgdGhpcy5sYXllciwgdXBkYXRlTGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiBhIHJhbmdlIG9mIHRpbGVzIGluIGEgbGF5ZXIgd2hvc2UgaW5kZXggaXMgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGBzdGFydGAgYW5kXHJcbiAgICAgKiBgc3RvcGAgKGluY2x1c2l2ZSkuIENhbGxpbmcgdGhpcyB3aXRoIGEgc3RhcnQgdmFsdWUgb2YgMTAgYW5kIGEgc3RvcCB2YWx1ZSBvZiAxNCB3b3VsZCBzZXRcclxuICAgICAqIGNvbGxpc2lvbiBmb3IgdGlsZXMgMTAsIDExLCAxMiwgMTMgYW5kIDE0LiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXIgY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmVcclxuICAgICAqIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNzZXRDb2xsaXNpb25CZXR3ZWVuXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHN0YXJ0IC0gVGhlIGZpcnN0IGluZGV4IG9mIHRoZSB0aWxlIHRvIGJlIHNldCBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzdG9wIC0gVGhlIGxhc3QgaW5kZXggb2YgdGhlIHRpbGUgdG8gYmUgc2V0IGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGUgdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaXNpb25CZXR3ZWVuOiBmdW5jdGlvbiAoc3RhcnQsIHN0b3AsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbkJldHdlZW4oc3RhcnQsIHN0b3AsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBjb2xsaXNpb24gb24gdGhlIHRpbGVzIHdpdGhpbiBhIGxheWVyIGJ5IGNoZWNraW5nIHRpbGUgcHJvcGVydGllcy4gSWYgYSB0aWxlIGhhcyBhIHByb3BlcnR5XHJcbiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHByb3BlcnRpZXMgb2JqZWN0LCBpdHMgY29sbGlzaW9uIGZsYWcgd2lsbCBiZSBzZXQuIFRoZSBgY29sbGlkZXNgXHJcbiAgICAgKiBwYXJhbWV0ZXIgY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmUgZW5hYmxlZCAodHJ1ZSkgb3IgZGlzYWJsZWQgKGZhbHNlKS4gUGFzc2luZyBpblxyXG4gICAgICogYHsgY29sbGlkZXM6IHRydWUgfWAgd291bGQgdXBkYXRlIHRoZSBjb2xsaXNpb24gZmxhZyBvbiBhbnkgdGlsZXMgd2l0aCBhIFwiY29sbGlkZXNcIiBwcm9wZXJ0eSB0aGF0XHJcbiAgICAgKiBoYXMgYSB2YWx1ZSBvZiB0cnVlLiBBbnkgdGlsZSB0aGF0IGRvZXNuJ3QgaGF2ZSBcImNvbGxpZGVzXCIgc2V0IHRvIHRydWUgd2lsbCBiZSBpZ25vcmVkLiBZb3UgY2FuXHJcbiAgICAgKiBhbHNvIHVzZSBhbiBhcnJheSBvZiB2YWx1ZXMsIGUuZy4gYHsgdHlwZXM6IFtcInN0b25lXCIsIFwibGF2YVwiLCBcInNhbmRcIiBdIH1gLiBJZiBhIHRpbGUgaGFzIGFcclxuICAgICAqIFwidHlwZXNcIiBwcm9wZXJ0eSB0aGF0IG1hdGNoZXMgYW55IG9mIHRob3NlIHZhbHVlcywgaXRzIGNvbGxpc2lvbiBmbGFnIHdpbGwgYmUgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3NldENvbGxpc2lvbkJ5UHJvcGVydHlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wZXJ0aWVzIC0gQW4gb2JqZWN0IHdpdGggdGlsZSBwcm9wZXJ0aWVzIGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBjaGVja2VkLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQnlQcm9wZXJ0eTogZnVuY3Rpb24gKHByb3BlcnRpZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbkJ5UHJvcGVydHkocHJvcGVydGllcywgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiBhbGwgdGlsZXMgaW4gdGhlIGdpdmVuIGxheWVyLCBleGNlcHQgZm9yIHRpbGVzIHRoYXQgaGF2ZSBhbiBpbmRleCBzcGVjaWZpZWQgaW5cclxuICAgICAqIHRoZSBnaXZlbiBhcnJheS4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGlmIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yXHJcbiAgICAgKiBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjc2V0Q29sbGlzaW9uQnlFeGNsdXNpb25cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcltdfSBpbmRleGVzIC0gQW4gYXJyYXkgb2YgdGhlIHRpbGUgaW5kZXhlcyB0byBub3QgYmUgY291bnRlZCBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQnlFeGNsdXNpb246IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRDb2xsaXNpb25CeUV4Y2x1c2lvbihpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSB0aWxlcyB3aXRoaW4gYSBsYXllciBieSBjaGVja2luZyBlYWNoIHRpbGVzIGNvbGxpc2lvbiBncm91cCBkYXRhXHJcbiAgICAgKiAodHlwaWNhbGx5IGRlZmluZWQgaW4gVGlsZWQgd2l0aGluIHRoZSB0aWxlc2V0IGNvbGxpc2lvbiBlZGl0b3IpLiBJZiBhbnkgb2JqZWN0cyBhcmUgZm91bmQgd2l0aGluXHJcbiAgICAgKiBhIHRpbGVzIGNvbGxpc2lvbiBncm91cCwgdGhlIHRpbGUncyBjb2xsaWRpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBzZXQuIFRoZSBgY29sbGlkZXNgIHBhcmFtZXRlclxyXG4gICAgICogY29udHJvbHMgaWYgY29sbGlzaW9uIHdpbGwgYmUgZW5hYmxlZCAodHJ1ZSkgb3IgZGlzYWJsZWQgKGZhbHNlKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3NldENvbGxpc2lvbkZyb21Db2xsaXNpb25Hcm91cFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwOiBmdW5jdGlvbiAoY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0Q29sbGlzaW9uRnJvbUNvbGxpc2lvbkdyb3VwKGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGdsb2JhbCBjb2xsaXNpb24gY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0aWxlIGluZGV4IHdpdGhpbiB0aGUgbGF5ZXIuIFRoaXMgd2lsbCBhZmZlY3QgYWxsXHJcbiAgICAgKiB0aWxlcyBvbiB0aGlzIGxheWVyIHRoYXQgaGF2ZSB0aGUgc2FtZSBpbmRleC4gSWYgYSBjYWxsYmFjayBpcyBhbHJlYWR5IHNldCBmb3IgdGhlIHRpbGUgaW5kZXggaXRcclxuICAgICAqIHdpbGwgYmUgcmVwbGFjZWQuIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byByZW1vdmUgaXQuIElmIHlvdSB3YW50IHRvIHNldCBhIGNhbGxiYWNrIGZvciBhIHRpbGVcclxuICAgICAqIGF0IGEgc3BlY2lmaWMgbG9jYXRpb24gb24gdGhlIG1hcCB0aGVuIHNlZSBzZXRUaWxlTG9jYXRpb25DYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3NldFRpbGVJbmRleENhbGxiYWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGludGVnZXJbXSl9IGluZGV4ZXMgLSBFaXRoZXIgYSBzaW5nbGUgdGlsZSBpbmRleCwgb3IgYW4gYXJyYXkgb2YgdGlsZSBpbmRleGVzIHRvIGhhdmUgYSBjb2xsaXNpb24gY2FsbGJhY2sgc2V0IGZvci5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHRpbGUgaXMgY29sbGlkZWQgd2l0aC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlSW5kZXhDYWxsYmFjazogZnVuY3Rpb24gKGluZGV4ZXMsIGNhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0VGlsZUluZGV4Q2FsbGJhY2soaW5kZXhlcywgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBjb2xsaXNpb24gY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlIGxheWVyLlxyXG4gICAgICogSWYgYSBjYWxsYmFjayBpcyBhbHJlYWR5IHNldCBmb3IgdGhlIHRpbGUgaW5kZXggaXQgd2lsbCBiZSByZXBsYWNlZC4gU2V0IHRoZSBjYWxsYmFjayB0byBudWxsIHRvXHJcbiAgICAgKiByZW1vdmUgaXQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNzZXRUaWxlTG9jYXRpb25DYWxsYmFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgdGlsZSBpcyBjb2xsaWRlZCB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtjYWxsYmFja0NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VGlsZUxvY2F0aW9uQ2FsbGJhY2s6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGNhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0VGlsZUxvY2F0aW9uQ2FsbGJhY2sodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2h1ZmZsZXMgdGhlIHRpbGVzIGluIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIChzcGVjaWZpZWQgaW4gdGlsZSBjb29yZGluYXRlcykgd2l0aGluIHRoZSBnaXZlblxyXG4gICAgICogbGF5ZXIuIEl0IHdpbGwgb25seSByYW5kb21pemUgdGhlIHRpbGVzIGluIHRoYXQgYXJlYSwgc28gaWYgdGhleSdyZSBhbGwgdGhlIHNhbWUgbm90aGluZyB3aWxsXHJcbiAgICAgKiBhcHBlYXIgdG8gaGF2ZSBjaGFuZ2VkISBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRpbGUgaW5kZXhlcyBhbmQgZG9lcyBub3QgY2hhbmdlIGNvbGxpc2lvblxyXG4gICAgICogaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNzaHVmZmxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0IG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3AgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzaHVmZmxlOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0KVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNodWZmbGUodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGdpdmVuIHJlY3Rhbmd1bGFyIGFyZWEgKGdpdmVuIGluIHRpbGUgY29vcmRpbmF0ZXMpIGZvciB0aWxlcyB3aXRoIGFuIGluZGV4IG1hdGNoaW5nXHJcbiAgICAgKiBgaW5kZXhBYCBhbmQgc3dhcHMgdGhlbiB3aXRoIGBpbmRleEJgLiBUaGlzIG9ubHkgbW9kaWZpZXMgdGhlIGluZGV4IGFuZCBkb2VzIG5vdCBjaGFuZ2UgY29sbGlzaW9uXHJcbiAgICAgKiBpbmZvcm1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3N3YXBCeUluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVBIC0gRmlyc3QgdGlsZSBpbmRleC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZUIgLSBTZWNvbmQgdGlsZSBpbmRleC5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHN3YXBCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXhBLCBpbmRleEIsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5Td2FwQnlJbmRleChpbmRleEEsIGluZGV4QiwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgZnJvbSB0aWxlIFggY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpIHRvIHdvcmxkIFggY29vcmRpbmF0ZXMgKHBpeGVscyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3RpbGVUb1dvcmxkWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSB4IGNvb3JkaW5hdGUsIGluIHRpbGVzLCBub3QgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHRpbGVUb1dvcmxkWDogZnVuY3Rpb24gKHRpbGVYLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlRpbGVUb1dvcmxkWCh0aWxlWCwgY2FtZXJhLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHRpbGUgWSBjb29yZGluYXRlcyAodGlsZSB1bml0cykgdG8gd29ybGQgWSBjb29yZGluYXRlcyAocGl4ZWxzKSwgZmFjdG9yaW5nIGluIHRoZVxyXG4gICAgICogbGF5ZXJzIHBvc2l0aW9uLCBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjdGlsZVRvV29ybGRZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIHkgY29vcmRpbmF0ZSwgaW4gdGlsZXMsIG5vdCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGlsZVRvV29ybGRZOiBmdW5jdGlvbiAodGlsZVksIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuVGlsZVRvV29ybGRZKHRpbGVZLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gdGlsZSBYWSBjb29yZGluYXRlcyAodGlsZSB1bml0cykgdG8gd29ybGQgWFkgY29vcmRpbmF0ZXMgKHBpeGVscyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC4gVGhpcyB3aWxsIHJldHVybiBhIG5ldyBWZWN0b3IyIG9iamVjdCBvciB1cGRhdGUgdGhlIGdpdmVuXHJcbiAgICAgKiBgcG9pbnRgIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3RpbGVUb1dvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgeSBjb29yZGluYXRlLCBpbiB0aWxlcywgbm90IHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW3BvaW50XSAtIEEgVmVjdG9yMiB0byBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgaW4uIElmIG5vdCBnaXZlbiBhIG5ldyBWZWN0b3IyIGlzIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5NYXRoLlZlY3RvcjJ9XHJcbiAgICAgKi9cclxuICAgIHRpbGVUb1dvcmxkWFk6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVksIHBvaW50LCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLlRpbGVUb1dvcmxkWFkodGlsZVgsIHRpbGVZLCBwb2ludCwgY2FtZXJhLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSYW5kb21pemVzIHRoZSBpbmRleGVzIG9mIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHRpbGVzIChpbiB0aWxlIGNvb3JkaW5hdGVzKSB3aXRoaW4gdGhlXHJcbiAgICAgKiBzcGVjaWZpZWQgbGF5ZXIuIEVhY2ggdGlsZSB3aWxsIHJlY2VpdmUgYSBuZXcgaW5kZXguIE5ldyBpbmRleGVzIGFyZSBkcmF3biBmcm9tIHRoZSBnaXZlblxyXG4gICAgICogd2VpZ2h0ZWRJbmRleGVzIGFycmF5LiBBbiBleGFtcGxlIHdlaWdodGVkIGFycmF5OlxyXG4gICAgICpcclxuICAgICAqIFtcclxuICAgICAqICB7IGluZGV4OiA2LCB3ZWlnaHQ6IDQgfSwgICAgLy8gUHJvYmFiaWxpdHkgb2YgaW5kZXggNiBpcyA0IC8gOFxyXG4gICAgICogIHsgaW5kZXg6IDcsIHdlaWdodDogMiB9LCAgICAvLyBQcm9iYWJpbGl0eSBvZiBpbmRleCA3IHdvdWxkIGJlIDIgLyA4XHJcbiAgICAgKiAgeyBpbmRleDogOCwgd2VpZ2h0OiAxLjUgfSwgIC8vIFByb2JhYmlsaXR5IG9mIGluZGV4IDggd291bGQgYmUgMS41IC8gOFxyXG4gICAgICogIHsgaW5kZXg6IDI2LCB3ZWlnaHQ6IDAuNSB9ICAvLyBQcm9iYWJpbGl0eSBvZiBpbmRleCAyNyB3b3VsZCBiZSAwLjUgLyA4XHJcbiAgICAgKiBdXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb2JhYmlsaXR5IG9mIGFueSBpbmRleCBiZWluZyBjaG9vc2UgaXMgKHRoZSBpbmRleCdzIHdlaWdodCkgLyAoc3VtIG9mIGFsbCB3ZWlnaHRzKS4gVGhpc1xyXG4gICAgICogbWV0aG9kIG9ubHkgbW9kaWZpZXMgdGlsZSBpbmRleGVzIGFuZCBkb2VzIG5vdCBjaGFuZ2UgY29sbGlzaW9uIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjd2VpZ2h0ZWRSYW5kb21pemVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbd2lkdGg9bWF4IHdpZHRoIGJhc2VkIG9uIHRpbGVYXSAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaGVpZ2h0PW1heCBoZWlnaHQgYmFzZWQgb24gdGlsZVldIC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBbd2VpZ2h0ZWRJbmRleGVzXSAtIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcmFuZG9tbHkgZHJhdyBmcm9tIGR1cmluZ1xyXG4gICAgICogcmFuZG9taXphdGlvbi4gVGhleSBzaG91bGQgYmUgaW4gdGhlIGZvcm06IHsgaW5kZXg6IDAsIHdlaWdodDogNCB9IG9yXHJcbiAgICAgKiB7IGluZGV4OiBbMCwgMV0sIHdlaWdodDogNCB9IGlmIHlvdSB3aXNoIHRvIGRyYXcgZnJvbSBtdWx0aXBsZSB0aWxlIGluZGV4ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHdlaWdodGVkUmFuZG9taXplOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCB3ZWlnaHRlZEluZGV4ZXMpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuV2VpZ2h0ZWRSYW5kb21pemUodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCB3ZWlnaHRlZEluZGV4ZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHdvcmxkIFggY29vcmRpbmF0ZXMgKHBpeGVscykgdG8gdGlsZSBYIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSwgZmFjdG9yaW5nIGluIHRoZVxyXG4gICAgICogbGF5ZXJzIHBvc2l0aW9uLCBzY2FsZSBhbmQgc2Nyb2xsLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjd29ybGRUb1RpbGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIHggY29vcmRpbmF0ZSB0byBiZSBjb252ZXJ0ZWQsIGluIHBpeGVscywgbm90IHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICB3b3JsZFRvVGlsZVg6IGZ1bmN0aW9uICh3b3JsZFgsIHNuYXBUb0Zsb29yLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLldvcmxkVG9UaWxlWCh3b3JsZFgsIHNuYXBUb0Zsb29yLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gd29ybGQgWSBjb29yZGluYXRlcyAocGl4ZWxzKSB0byB0aWxlIFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciN3b3JsZFRvVGlsZVlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzbmFwVG9GbG9vcj10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJvdW5kIHRoZSB0aWxlIGNvb3JkaW5hdGUgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHdvcmxkVG9UaWxlWTogZnVuY3Rpb24gKHdvcmxkWSwgc25hcFRvRmxvb3IsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuV29ybGRUb1RpbGVZKHdvcmxkWSwgc25hcFRvRmxvb3IsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgZnJvbSB3b3JsZCBYWSBjb29yZGluYXRlcyAocGl4ZWxzKSB0byB0aWxlIFhZIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSwgZmFjdG9yaW5nIGluIHRoZVxyXG4gICAgICogbGF5ZXJzIHBvc2l0aW9uLCBzY2FsZSBhbmQgc2Nyb2xsLiBUaGlzIHdpbGwgcmV0dXJuIGEgbmV3IFZlY3RvcjIgb2JqZWN0IG9yIHVwZGF0ZSB0aGUgZ2l2ZW5cclxuICAgICAqIGBwb2ludGAgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXIjd29ybGRUb1RpbGVYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gYmUgY29udmVydGVkLCBpbiBwaXhlbHMsIG5vdCB0aWxlcy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFkgLSBUaGUgeSBjb29yZGluYXRlIHRvIGJlIGNvbnZlcnRlZCwgaW4gcGl4ZWxzLCBub3QgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzbmFwVG9GbG9vcj10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJvdW5kIHRoZSB0aWxlIGNvb3JkaW5hdGUgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuTWF0aC5WZWN0b3IyfSBbcG9pbnRdIC0gQSBWZWN0b3IyIHRvIHN0b3JlIHRoZSBjb29yZGluYXRlcyBpbi4gSWYgbm90IGdpdmVuIGEgbmV3IFZlY3RvcjIgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAqL1xyXG4gICAgd29ybGRUb1RpbGVYWTogZnVuY3Rpb24gKHdvcmxkWCwgd29ybGRZLCBzbmFwVG9GbG9vciwgcG9pbnQsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuV29ybGRUb1RpbGVYWSh3b3JsZFgsIHdvcmxkWSwgc25hcFRvRmxvb3IsIHBvaW50LCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IER5bmFtaWNUaWxlbWFwTGF5ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbmRlcnMgdGhpcyBHYW1lIE9iamVjdCB3aXRoIHRoZSBDYW52YXMgUmVuZGVyZXIgdG8gdGhlIGdpdmVuIENhbWVyYS5cclxuICogVGhlIG9iamVjdCB3aWxsIG5vdCByZW5kZXIgaWYgYW55IG9mIGl0cyByZW5kZXJGbGFncyBhcmUgc2V0IG9yIGl0IGlzIGJlaW5nIGFjdGl2ZWx5IGZpbHRlcmVkIG91dCBieSB0aGUgQ2FtZXJhLlxyXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gSXQgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9mIHRoZSBSZW5kZXIgbW9kdWxlLlxyXG4gKlxyXG4gKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5EeW5hbWljVGlsZW1hcExheWVyI3JlbmRlckNhbnZhc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSBDYW52YXMgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBEeW5hbWljVGlsZW1hcExheWVyQ2FudmFzUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSwgcGFyZW50TWF0cml4KVxyXG57XHJcbiAgICBzcmMuY3VsbChjYW1lcmEpO1xyXG5cclxuICAgIHZhciByZW5kZXJUaWxlcyA9IHNyYy5jdWxsZWRUaWxlcztcclxuICAgIHZhciB0aWxlQ291bnQgPSByZW5kZXJUaWxlcy5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHRpbGVDb3VudCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNhbU1hdHJpeCA9IHJlbmRlcmVyLl90ZW1wTWF0cml4MTtcclxuICAgIHZhciBsYXllck1hdHJpeCA9IHJlbmRlcmVyLl90ZW1wTWF0cml4MjtcclxuICAgIHZhciBjYWxjTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgzO1xyXG5cclxuICAgIGxheWVyTWF0cml4LmFwcGx5SVRSUyhzcmMueCwgc3JjLnksIHNyYy5yb3RhdGlvbiwgc3JjLnNjYWxlWCwgc3JjLnNjYWxlWSk7XHJcblxyXG4gICAgY2FtTWF0cml4LmNvcHlGcm9tKGNhbWVyYS5tYXRyaXgpO1xyXG5cclxuICAgIHZhciBjdHggPSByZW5kZXJlci5jdXJyZW50Q29udGV4dDtcclxuICAgIHZhciBnaWRNYXAgPSBzcmMuZ2lkTWFwO1xyXG5cclxuICAgIGN0eC5zYXZlKCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1hdHJpeClcclxuICAgIHtcclxuICAgICAgICAvLyAgTXVsdGlwbHkgdGhlIGNhbWVyYSBieSB0aGUgcGFyZW50IG1hdHJpeFxyXG4gICAgICAgIGNhbU1hdHJpeC5tdWx0aXBseVdpdGhPZmZzZXQocGFyZW50TWF0cml4LCAtY2FtZXJhLnNjcm9sbFggKiBzcmMuc2Nyb2xsRmFjdG9yWCwgLWNhbWVyYS5zY3JvbGxZICogc3JjLnNjcm9sbEZhY3RvclkpO1xyXG5cclxuICAgICAgICAvLyAgVW5kbyB0aGUgY2FtZXJhIHNjcm9sbFxyXG4gICAgICAgIGxheWVyTWF0cml4LmUgPSBzcmMueDtcclxuICAgICAgICBsYXllck1hdHJpeC5mID0gc3JjLnk7XHJcblxyXG4gICAgICAgIC8vICBNdWx0aXBseSBieSB0aGUgU3ByaXRlIG1hdHJpeCwgc3RvcmUgcmVzdWx0IGluIGNhbGNNYXRyaXhcclxuICAgICAgICBjYW1NYXRyaXgubXVsdGlwbHkobGF5ZXJNYXRyaXgsIGNhbGNNYXRyaXgpO1xyXG5cclxuICAgICAgICBjYWxjTWF0cml4LmNvcHlUb0NvbnRleHQoY3R4KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBsYXllck1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgbGF5ZXJNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICBsYXllck1hdHJpeC5jb3B5VG9Db250ZXh0KGN0eCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmICghcmVuZGVyZXIuYW50aWFsaWFzIHx8IHNyYy5zY2FsZVggPiAxIHx8IHNyYy5zY2FsZVkgPiAxKVxyXG4gICAge1xyXG4gICAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVDb3VudDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aWxlID0gcmVuZGVyVGlsZXNbaV07XHJcblxyXG4gICAgICAgIHZhciB0aWxlc2V0ID0gZ2lkTWFwW3RpbGUuaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoIXRpbGVzZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpbWFnZSA9IHRpbGVzZXQuaW1hZ2UuZ2V0U291cmNlSW1hZ2UoKTtcclxuICAgICAgICB2YXIgdGlsZVRleENvb3JkcyA9IHRpbGVzZXQuZ2V0VGlsZVRleHR1cmVDb29yZGluYXRlcyh0aWxlLmluZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKHRpbGVUZXhDb29yZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaGFsZldpZHRoID0gdGlsZS53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIHZhciBoYWxmSGVpZ2h0ID0gdGlsZS5oZWlnaHQgLyAyO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGN0eC5zYXZlKCk7XHJcblxyXG4gICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRpbGUucGl4ZWxYICsgaGFsZldpZHRoLCB0aWxlLnBpeGVsWSArIGhhbGZIZWlnaHQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGlmICh0aWxlLnJvdGF0aW9uICE9PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHgucm90YXRlKHRpbGUucm90YXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKHRpbGUuZmxpcFggfHwgdGlsZS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY3R4LnNjYWxlKCh0aWxlLmZsaXBYKSA/IC0xIDogMSwgKHRpbGUuZmxpcFkpID8gLTEgOiAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGFscGhhICogdGlsZS5hbHBoYTtcclxuICAgIFxyXG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgaW1hZ2UsXHJcbiAgICAgICAgICAgICAgICB0aWxlVGV4Q29vcmRzLngsIHRpbGVUZXhDb29yZHMueSxcclxuICAgICAgICAgICAgICAgIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgLWhhbGZXaWR0aCwgLWhhbGZIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB0aWxlLndpZHRoLCB0aWxlLmhlaWdodFxyXG4gICAgICAgICAgICApO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGN0eC5yZXN0b3JlKCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IER5bmFtaWNUaWxlbWFwTGF5ZXJDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vRHluYW1pY1RpbGVtYXBMYXllcldlYkdMUmVuZGVyZXInKTtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBDQU5WQVNfUkVOREVSRVIpXHJcbntcclxuICAgIHJlbmRlckNhbnZhcyA9IHJlcXVpcmUoJy4vRHluYW1pY1RpbGVtYXBMYXllckNhbnZhc1JlbmRlcmVyJyk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIHJlbmRlcldlYkdMOiByZW5kZXJXZWJHTCxcclxuICAgIHJlbmRlckNhbnZhczogcmVuZGVyQ2FudmFzXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFRoZSBvYmplY3Qgd2lsbCBub3QgcmVuZGVyIGlmIGFueSBvZiBpdHMgcmVuZGVyRmxhZ3MgYXJlIHNldCBvciBpdCBpcyBiZWluZyBhY3RpdmVseSBmaWx0ZXJlZCBvdXQgYnkgdGhlIENhbWVyYS5cclxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIEl0IGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBvZiB0aGUgUmVuZGVyIG1vZHVsZS5cclxuICpcclxuICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuRHluYW1pY1RpbGVtYXBMYXllciNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICovXHJcbnZhciBEeW5hbWljVGlsZW1hcExheWVyV2ViR0xSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhKVxyXG57XHJcbiAgICBzcmMuY3VsbChjYW1lcmEpO1xyXG5cclxuICAgIHZhciByZW5kZXJUaWxlcyA9IHNyYy5jdWxsZWRUaWxlcztcclxuICAgIHZhciB0aWxlQ291bnQgPSByZW5kZXJUaWxlcy5sZW5ndGg7XHJcbiAgICB2YXIgYWxwaGEgPSBjYW1lcmEuYWxwaGEgKiBzcmMuYWxwaGE7XHJcblxyXG4gICAgaWYgKHRpbGVDb3VudCA9PT0gMCB8fCBhbHBoYSA8PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZ2lkTWFwID0gc3JjLmdpZE1hcDtcclxuICAgIHZhciBwaXBlbGluZSA9IHNyYy5waXBlbGluZTtcclxuXHJcbiAgICB2YXIgZ2V0VGludCA9IFV0aWxzLmdldFRpbnRBcHBlbmRGbG9hdEFscGhhQW5kU3dhcDtcclxuXHJcbiAgICB2YXIgc2Nyb2xsRmFjdG9yWCA9IHNyYy5zY3JvbGxGYWN0b3JYO1xyXG4gICAgdmFyIHNjcm9sbEZhY3RvclkgPSBzcmMuc2Nyb2xsRmFjdG9yWTtcclxuXHJcbiAgICB2YXIgeCA9IHNyYy54O1xyXG4gICAgdmFyIHkgPSBzcmMueTtcclxuXHJcbiAgICB2YXIgc3ggPSBzcmMuc2NhbGVYO1xyXG4gICAgdmFyIHN5ID0gc3JjLnNjYWxlWTtcclxuXHJcbiAgICB2YXIgdGlsZXNldHMgPSBzcmMudGlsZXNldDtcclxuXHJcbiAgICAvLyAgTG9vcCB0aHJvdWdoIGVhY2ggdGlsZXNldCBpbiB0aGlzIGxheWVyLCBkcmF3aW5nIGp1c3QgdGhlIHRpbGVzIHRoYXQgYXJlIGluIHRoYXQgc2V0IGVhY2ggdGltZVxyXG4gICAgLy8gIERvaW5nIGl0IHRoaXMgd2F5IGFyb3VuZCBhbGxvd3MgdXMgdG8gYmF0Y2ggdGlsZXMgdXNpbmcgdGhlIHNhbWUgdGlsZXNldFxyXG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0aWxlc2V0cy5sZW5ndGg7IGMrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgY3VycmVudFNldCA9IHRpbGVzZXRzW2NdO1xyXG4gICAgICAgIHZhciB0ZXh0dXJlID0gY3VycmVudFNldC5nbFRleHR1cmU7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGlsZUNvdW50OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZSA9IHJlbmRlclRpbGVzW2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIHRpbGVzZXQgPSBnaWRNYXBbdGlsZS5pbmRleF07XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZXNldCAhPT0gY3VycmVudFNldClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFNraXAgdGlsZXMgdGhhdCBhcmVuJ3QgaW4gdGhpcyBzZXRcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICAgICAgdmFyIHRpbGVUZXhDb29yZHMgPSB0aWxlc2V0LmdldFRpbGVUZXh0dXJlQ29vcmRpbmF0ZXModGlsZS5pbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZVRleENvb3JkcyA9PT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBmcmFtZVdpZHRoID0gdGlsZS53aWR0aDtcclxuICAgICAgICAgICAgdmFyIGZyYW1lSGVpZ2h0ID0gdGlsZS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgZnJhbWVYID0gdGlsZVRleENvb3Jkcy54O1xyXG4gICAgICAgICAgICB2YXIgZnJhbWVZID0gdGlsZVRleENvb3Jkcy55O1xyXG5cclxuICAgICAgICAgICAgdmFyIHR3ID0gdGlsZS53aWR0aCAqIDAuNTtcclxuICAgICAgICAgICAgdmFyIHRoID0gdGlsZS5oZWlnaHQgKiAwLjU7XHJcblxyXG4gICAgICAgICAgICB2YXIgdGludCA9IGdldFRpbnQodGlsZS50aW50LCBhbHBoYSAqIHRpbGUuYWxwaGEpO1xyXG5cclxuICAgICAgICAgICAgcGlwZWxpbmUuYmF0Y2hUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICAgc3JjLFxyXG4gICAgICAgICAgICAgICAgdGV4dHVyZSxcclxuICAgICAgICAgICAgICAgIHRleHR1cmUud2lkdGgsIHRleHR1cmUuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgeCArICgodHcgKyB0aWxlLnBpeGVsWCkgKiBzeCksIHkgKyAoKHRoICsgdGlsZS5waXhlbFkpICogc3kpLFxyXG4gICAgICAgICAgICAgICAgdGlsZS53aWR0aCwgdGlsZS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBzeCwgc3ksXHJcbiAgICAgICAgICAgICAgICB0aWxlLnJvdGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGlsZS5mbGlwWCwgdGlsZS5mbGlwWSxcclxuICAgICAgICAgICAgICAgIHNjcm9sbEZhY3RvclgsIHNjcm9sbEZhY3RvclksXHJcbiAgICAgICAgICAgICAgICB0dywgdGgsXHJcbiAgICAgICAgICAgICAgICBmcmFtZVgsIGZyYW1lWSwgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB0aW50LCB0aW50LCB0aW50LCB0aW50LCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIDAsIDAsXHJcbiAgICAgICAgICAgICAgICBjYW1lcmEsXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRHluYW1pY1RpbGVtYXBMYXllcldlYkdMUmVuZGVyZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRpbGVtYXBzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ29tcG9uZW50czogcmVxdWlyZSgnLi9jb21wb25lbnRzJyksXHJcbiAgICBQYXJzZXJzOiByZXF1aXJlKCcuL3BhcnNlcnMnKSxcclxuXHJcbiAgICBGb3JtYXRzOiByZXF1aXJlKCcuL0Zvcm1hdHMnKSxcclxuICAgIEltYWdlQ29sbGVjdGlvbjogcmVxdWlyZSgnLi9JbWFnZUNvbGxlY3Rpb24nKSxcclxuICAgIFBhcnNlVG9UaWxlbWFwOiByZXF1aXJlKCcuL1BhcnNlVG9UaWxlbWFwJyksXHJcbiAgICBUaWxlOiByZXF1aXJlKCcuL1RpbGUnKSxcclxuICAgIFRpbGVtYXA6IHJlcXVpcmUoJy4vVGlsZW1hcCcpLFxyXG4gICAgVGlsZW1hcENyZWF0b3I6IHJlcXVpcmUoJy4vVGlsZW1hcENyZWF0b3InKSxcclxuICAgIFRpbGVtYXBGYWN0b3J5OiByZXF1aXJlKCcuL1RpbGVtYXBGYWN0b3J5JyksXHJcbiAgICBUaWxlc2V0OiByZXF1aXJlKCcuL1RpbGVzZXQnKSxcclxuXHJcbiAgICBMYXllckRhdGE6IHJlcXVpcmUoJy4vbWFwZGF0YS9MYXllckRhdGEnKSxcclxuICAgIE1hcERhdGE6IHJlcXVpcmUoJy4vbWFwZGF0YS9NYXBEYXRhJyksXHJcbiAgICBPYmplY3RMYXllcjogcmVxdWlyZSgnLi9tYXBkYXRhL09iamVjdExheWVyJyksXHJcblxyXG4gICAgRHluYW1pY1RpbGVtYXBMYXllcjogcmVxdWlyZSgnLi9keW5hbWljbGF5ZXIvRHluYW1pY1RpbGVtYXBMYXllcicpLFxyXG4gICAgU3RhdGljVGlsZW1hcExheWVyOiByZXF1aXJlKCcuL3N0YXRpY2xheWVyL1N0YXRpY1RpbGVtYXBMYXllcicpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIGNsYXNzIGZvciByZXByZXNlbnRpbmcgZGF0YSBhYm91dCBhYm91dCBhIGxheWVyIGluIGEgbWFwLiBNYXBzIGFyZSBwYXJzZWQgZnJvbSBDU1YsIFRpbGVkLFxyXG4gKiBldGMuIGludG8gdGhpcyBmb3JtYXQuIFRpbGVtYXAsIFN0YXRpY1RpbGVtYXBMYXllciBhbmQgRHluYW1pY1RpbGVtYXBMYXllciBoYXZlIGEgcmVmZXJlbmNlXHJcbiAqIHRvIHRoaXMgZGF0YSBhbmQgdXNlIGl0IHRvIGxvb2sgdXAgYW5kIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aWxlcy5cclxuICpcclxuICogQGNsYXNzIExheWVyRGF0YVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRpbGVtYXBzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuTGF5ZXJEYXRhQ29uZmlnfSBbY29uZmlnXSAtIFRoZSBMYXllciBEYXRhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxudmFyIExheWVyRGF0YSA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBMYXllckRhdGEgKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHsgY29uZmlnID0ge307IH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGxheWVyLCBpZiBzcGVjaWZpZWQgaW4gVGlsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICduYW1lJywgJ2xheWVyJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB4IG9mZnNldCBvZiB3aGVyZSB0byBkcmF3IGZyb20gdGhlIHRvcCBsZWZ0LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSN4XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAneCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgeSBvZmZzZXQgb2Ygd2hlcmUgdG8gZHJhdyBmcm9tIHRoZSB0b3AgbGVmdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5MYXllckRhdGEjeVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy55ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3knLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBsYXllciBpbiB0aWxlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5MYXllckRhdGEjd2lkdGhcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnd2lkdGgnLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgbGF5ZXIgaW4gdGlsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI2hlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaGVpZ2h0JywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwaXhlbCB3aWR0aCBvZiB0aGUgdGlsZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI3RpbGVXaWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlV2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGlsZVdpZHRoJywgMCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBwaXhlbCBoZWlnaHQgb2YgdGhlIHRpbGVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSN0aWxlSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVIZWlnaHQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGlsZUhlaWdodCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgYmFzZSB0aWxlIHdpZHRoLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSNiYXNlVGlsZVdpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VUaWxlV2lkdGggPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnYmFzZVRpbGVXaWR0aCcsIHRoaXMudGlsZVdpZHRoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGJhc2UgdGlsZSBoZWlnaHQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI2Jhc2VUaWxlSGVpZ2h0XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJhc2VUaWxlSGVpZ2h0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2Jhc2VUaWxlSGVpZ2h0JywgdGhpcy50aWxlSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgZW50aXJlIGxheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSN3aWR0aEluUGl4ZWxzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndpZHRoSW5QaXhlbHMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnd2lkdGhJblBpeGVscycsIHRoaXMud2lkdGggKiB0aGlzLmJhc2VUaWxlV2lkdGgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgZW50aXJlIGxheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSNoZWlnaHRJblBpeGVsc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5oZWlnaHRJblBpeGVscyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdoZWlnaHRJblBpeGVscycsIHRoaXMuaGVpZ2h0ICogdGhpcy5iYXNlVGlsZUhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgbGF5ZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI2FscGhhXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFscGhhID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2FscGhhJywgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElzIHRoZSBsYXllciB2aXNpYmxlIG9yIG5vdD9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5MYXllckRhdGEjdmlzaWJsZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd2aXNpYmxlJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExheWVyIHNwZWNpZmljIHByb3BlcnRpZXMgKGNhbiBiZSBzcGVjaWZpZWQgaW4gVGlsZWQpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI3Byb3BlcnRpZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0W119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3Byb3BlcnRpZXMnLCBbXSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRpbGUgSUQgaW5kZXggbWFwLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLkxheWVyRGF0YSNpbmRleGVzXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5kZXhlcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdpbmRleGVzJywgW10pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaWxlIENvbGxpc2lvbiBJRCBpbmRleCBtYXAuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI2NvbGxpZGVJbmRleGVzXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlkZUluZGV4ZXMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnY29sbGlkZUluZGV4ZXMnLCBbXSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGNhbGxiYWNrcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5MYXllckRhdGEjY2FsbGJhY2tzXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2NhbGxiYWNrcycsIFtdKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgcGh5c2ljcyBib2RpZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI2JvZGllc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJvZGllcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdib2RpZXMnLCBbXSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIHRoZSB0aWxlIGRhdGEgaW5kZXhlcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5MYXllckRhdGEjZGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdW119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kYXRhID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RhdGEnLCBbXSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBUaWxlbWFwIGxheWVyIHRoYXQgb3ducyB0aGlzIGRhdGEuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhI3RpbGVtYXBMYXllclxyXG4gICAgICAgICAqIEB0eXBlIHsoUGhhc2VyLlRpbGVtYXBzLkR5bmFtaWNUaWxlbWFwTGF5ZXJ8UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcil9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlbWFwTGF5ZXIgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndGlsZW1hcExheWVyJywgbnVsbCk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTGF5ZXJEYXRhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIGNsYXNzIGZvciByZXByZXNlbnRpbmcgZGF0YSBhYm91dCBhIG1hcC4gTWFwcyBhcmUgcGFyc2VkIGZyb20gQ1NWLCBUaWxlZCwgZXRjLiBpbnRvIHRoaXNcclxuICogZm9ybWF0LiBBIFRpbGVtYXAgb2JqZWN0IGdldCBhIGNvcHkgb2YgdGhpcyBkYXRhIGFuZCB0aGVuIHVucGFja3MgdGhlIG5lZWRlZCBwcm9wZXJ0aWVzIGludG9cclxuICogaXRzZWxmLlxyXG4gKlxyXG4gKiBAY2xhc3MgTWFwRGF0YVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRpbGVtYXBzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuTWFwRGF0YUNvbmZpZ30gW2NvbmZpZ10gLSBUaGUgTWFwIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gKi9cclxudmFyIE1hcERhdGEgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gTWFwRGF0YSAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUga2V5IGluIHRoZSBQaGFzZXIgY2FjaGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9hZGVkIHRpbGVtYXAgZGF0YS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNuYW1lXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm5hbWUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnbmFtZScsICdtYXAnKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBlbnRpcmUgdGlsZW1hcC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSN3aWR0aFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd3aWR0aCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBlbnRpcmUgdGlsZW1hcC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNoZWlnaHRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2hlaWdodCcsIDApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbWFwIGlzIGluZmluaXRlIG9yIG5vdC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5NYXBEYXRhI2luZmluaXRlXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTcuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW5maW5pdGUgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaW5maW5pdGUnLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgdGlsZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjdGlsZVdpZHRoXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVXaWR0aCA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0aWxlV2lkdGgnLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgdGlsZXMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjdGlsZUhlaWdodFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlSGVpZ2h0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RpbGVIZWlnaHQnLCAwKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIGluIHBpeGVscyBvZiB0aGUgZW50aXJlIHRpbGVtYXAuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjd2lkdGhJblBpeGVsc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy53aWR0aEluUGl4ZWxzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3dpZHRoSW5QaXhlbHMnLCB0aGlzLndpZHRoICogdGhpcy50aWxlV2lkdGgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgZW50aXJlIHRpbGVtYXAuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjaGVpZ2h0SW5QaXhlbHNcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0SW5QaXhlbHMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaGVpZ2h0SW5QaXhlbHMnLCB0aGlzLmhlaWdodCAqIHRoaXMudGlsZUhlaWdodCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBmb3JtYXQgb2YgdGhlIG1hcCBkYXRhLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5NYXBEYXRhI2Zvcm1hdFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2Zvcm1hdCcsIG51bGwpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIG1hcCBkYXRhIChpLmUuIG9ydGhvZ29uYWwsIGlzb21ldHJpYywgaGV4YWdvbmFsKSwgZGVmYXVsdCAnb3J0aG9nb25hbCcuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjb3JpZW50YXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnb3JpZW50YXRpb24nLCAnb3J0aG9nb25hbCcpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZXRlcm1pbmVzIHRoZSBkcmF3IG9yZGVyIG9mIHRpbGVtYXAuIERlZmF1bHQgaXMgcmlnaHQtZG93blxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIDAsIG9yICdyaWdodC1kb3duJ1xyXG4gICAgICAgICAqIDEsIG9yICdsZWZ0LWRvd24nXHJcbiAgICAgICAgICogMiwgb3IgJ3JpZ2h0LXVwJ1xyXG4gICAgICAgICAqIDMsIG9yICdsZWZ0LXVwJ1xyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5NYXBEYXRhI3JlbmRlck9yZGVyXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5yZW5kZXJPcmRlciA9IEdldEZhc3RWYWx1ZShjb25maWcsICdyZW5kZXJPcmRlcicsICdyaWdodC1kb3duJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBtYXAgZGF0YSAoYXMgc3BlY2lmaWVkIGluIFRpbGVkKS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSN2ZXJzaW9uXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnNpb24gPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAndmVyc2lvbicsICcxJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1hcCBzcGVjaWZpYyBwcm9wZXJ0aWVzIChjYW4gYmUgc3BlY2lmaWVkIGluIFRpbGVkKVxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5NYXBEYXRhI3Byb3BlcnRpZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdwcm9wZXJ0aWVzJywge30pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSB3aXRoIGFsbCB0aGUgbGF5ZXJzIGNvbmZpZ3VyZWQgdG8gdGhlIE1hcERhdGEuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjbGF5ZXJzXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhW118UGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyKX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxheWVycyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdsYXllcnMnLCBbXSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIFRpbGVkIEltYWdlIExheWVycy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNpbWFnZXNcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnaW1hZ2VzJywgW10pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3Qgb2YgVGlsZWQgT2JqZWN0IExheWVycy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNvYmplY3RzXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9iamVjdHMgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnb2JqZWN0cycsIHt9KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICAqIEFuIG9iamVjdCBvZiBjb2xsaXNpb24gZGF0YS4gTXVzdCBiZSBjcmVhdGVkIGFzIHBoeXNpY3Mgb2JqZWN0IG9yIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNjb2xsaXNpb25cclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2NvbGxpc2lvbicsIHt9KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVGlsZXNldHMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk1hcERhdGEjdGlsZXNldHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXRbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVzZXRzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RpbGVzZXRzJywgW10pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY29sbGVjdGlvbiBvZiBpbWFnZXMgdGhlIG1hcCB1c2VzKHNwZWNpZmllZCBpbiBUaWxlZClcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSNpbWFnZUNvbGxlY3Rpb25zXHJcbiAgICAgICAgICogQHR5cGUge2FycmF5fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaW1hZ2VDb2xsZWN0aW9ucyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdpbWFnZUNvbGxlY3Rpb25zJywgW10pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiB0aWxlIGluc3RhbmNlcy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YSN0aWxlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3RpbGVzJywgW10pO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1hcERhdGE7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIFRpbGVkIG9iamVjdCBsYXllciBpbiBhIG1hcC4gVGhpcyBtaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBUaWxlZFxyXG4gKiBvYmplY3QgbGF5ZXIsIGV4Y2VwdDpcclxuICogIC0gXCJ4XCIgJiBcInlcIiBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkIHNpbmNlIHRoZXNlIGNhbm5vdCBiZSBjaGFuZ2VkIGluIFRpbGVkLlxyXG4gKiAgLSBcIm9mZnNldHhcIiAmIFwib2Zmc2V0eVwiIGFyZSBhcHBsaWVkIHRvIHRoZSBpbmRpdmlkdWFsIG9iamVjdCBjb29yZGluYXRlcyBkaXJlY3RseSwgc28gdGhleVxyXG4gKiAgICBhcmUgaWdub3JlZCBhcyB3ZWxsLlxyXG4gKiAgLSBcImRyYXdvcmRlclwiIGlzIGlnbm9yZWQuXHJcbiAqXHJcbiAqIEBjbGFzcyBPYmplY3RMYXllclxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRpbGVtYXBzXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuT2JqZWN0TGF5ZXJDb25maWd9IFtjb25maWddIC0gVGhlIGRhdGEgZm9yIHRoZSBsYXllciBmcm9tIHRoZSBUaWxlZCBKU09OIG9iamVjdC5cclxuICovXHJcbnZhciBPYmplY3RMYXllciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBPYmplY3RMYXllciAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkgeyBjb25maWcgPSB7fTsgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JqZWN0IExheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyI25hbWVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubmFtZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICduYW1lJywgJ29iamVjdCBsYXllcicpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgb3BhY2l0eSBvZiB0aGUgbGF5ZXIsIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5PYmplY3RMYXllciNvcGFjaXR5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9wYWNpdHkgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnb3BhY2l0eScsIDEpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VzdG9tIHByb3BlcnRpZXMgZGVmaW5lZCBvbiB0aGUgT2JqZWN0IExheWVyLCBrZXllZCBieSB0aGVpciBuYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyI3Byb3BlcnRpZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdwcm9wZXJ0aWVzJywge30pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdHlwZSBvZiBlYWNoIGN1c3RvbSBwcm9wZXJ0eSBkZWZpbmVkIG9uIHRoZSBPYmplY3QgTGF5ZXIsIGtleWVkIGJ5IGl0cyBuYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyI3Byb3BlcnR5VHlwZXNcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvcGVydHlUeXBlcyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdwcm9wZXJ0eXR5cGVzJywge30pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbGF5ZXIsIHdoaWNoIHNob3VsZCBiZSBgb2JqZWN0Z3JvdXBgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyI3R5cGVcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudHlwZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0eXBlJywgJ29iamVjdGdyb3VwJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGxheWVyIGlzIHNob3duIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuT2JqZWN0TGF5ZXIjdmlzaWJsZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd2aXNpYmxlJywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGFsbCBvYmplY3RzIG9uIHRoaXMgT2JqZWN0IExheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRWFjaCBUaWxlZCBvYmplY3QgY29ycmVzcG9uZHMgdG8gYSBKYXZhU2NyaXB0IG9iamVjdCBpbiB0aGlzIGFycmF5LiBJdCBoYXMgYW4gYGlkYCAodW5pcXVlKSxcclxuICAgICAgICAgKiBgbmFtZWAgKGFzIGFzc2lnbmVkIGluIFRpbGVkKSwgYHR5cGVgIChhcyBhc3NpZ25lZCBpbiBUaWxlZCksIGByb3RhdGlvbmAgKGluIGNsb2Nrd2lzZSBkZWdyZWVzKSxcclxuICAgICAgICAgKiBgcHJvcGVydGllc2AgKGlmIGFueSksIGB2aXNpYmxlYCBzdGF0ZSAoYHRydWVgIGlmIHZpc2libGUsIGBmYWxzZWAgb3RoZXJ3aXNlKSxcclxuICAgICAgICAgKiBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyAoaW4gcGl4ZWxzLCByZWxhdGl2ZSB0byB0aGUgdGlsZW1hcCksIGFuZCBhIGB3aWR0aGAgYW5kIGBoZWlnaHRgIChpbiBwaXhlbHMpLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IHRpbGUgaGFzIGEgYGdpZGAgcHJvcGVydHkgKEdJRCBvZiB0aGUgcmVwcmVzZW50ZWQgdGlsZSksIGEgYGZsaXBwZWRIb3Jpem9udGFsYCBwcm9wZXJ0eSxcclxuICAgICAgICAgKiBhIGBmbGlwcGVkVmVydGljYWxgIHByb3BlcnR5LCBhbmQgYGZsaXBwZWRBbnRpRGlhZ29uYWxgIHByb3BlcnR5LlxyXG4gICAgICAgICAqIFRoZSB7QGxpbmsgaHR0cDovL2RvY3MubWFwZWRpdG9yLm9yZy9lbi9sYXRlc3QvcmVmZXJlbmNlL3RteC1tYXAtZm9ybWF0L3xUaWxlZCBkb2N1bWVudGF0aW9ufSBjb250YWluc1xyXG4gICAgICAgICAqIGluZm9ybWF0aW9uIG9uIGZsaXBwaW5nIGFuZCByb3RhdGlvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFBvbHlsaW5lcyBoYXZlIGEgYHBvbHlsaW5lYCBwcm9wZXJ0eSwgd2hpY2ggaXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHBvaW50cyxcclxuICAgICAgICAgKiB3aGVyZSBlYWNoIHBvaW50IGhhcyBhbiBgeGAgcHJvcGVydHkgYW5kIGEgYHlgIHByb3BlcnR5LiBQb2x5Z29ucyBoYXZlIGFuIGlkZW50aWNhbGx5IHN0cnVjdHVyZWRcclxuICAgICAgICAgKiBhcnJheSBpbiB0aGVpciBgcG9seWdvbmAgcHJvcGVydHkuIFRleHQgb2JqZWN0cyBoYXZlIGEgYHRleHRgIHByb3BlcnR5IHdpdGggdGhlIHRleHQncyBwcm9wZXJ0aWVzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogUmVjdGFuZ2xlcyBhbmQgZWxsaXBzZXMgaGF2ZSBhIGByZWN0YW5nbGVgIG9yIGBlbGxpcHNlYCBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLk9iamVjdExheWVyI29iamVjdHNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLlRpbGVkT2JqZWN0W119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vYmplY3RzID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ29iamVjdHMnLCBbXSk7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0TGF5ZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZvcm1hdHMgPSByZXF1aXJlKCcuLi9Gb3JtYXRzJyk7XHJcbnZhciBQYXJzZTJEQXJyYXkgPSByZXF1aXJlKCcuL1BhcnNlMkRBcnJheScpO1xyXG52YXIgUGFyc2VDU1YgPSByZXF1aXJlKCcuL1BhcnNlQ1NWJyk7XHJcbnZhciBQYXJzZUpTT05UaWxlZCA9IHJlcXVpcmUoJy4vdGlsZWQvUGFyc2VKU09OVGlsZWQnKTtcclxudmFyIFBhcnNlV2VsdG1laXN0ZXIgPSByZXF1aXJlKCcuL2ltcGFjdC9QYXJzZVdlbHRtZWlzdGVyJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIHJhdyBkYXRhIG9mIGEgZ2l2ZW4gVGlsZW1hcCBmb3JtYXQgaW50byBhIG5ldyBNYXBEYXRhIG9iamVjdC4gSWYgbm8gcmVjb2duaXplZCBkYXRhIGZvcm1hdFxyXG4gKiBpcyBmb3VuZCwgcmV0dXJucyBgbnVsbGAuIFdoZW4gbG9hZGluZyBmcm9tIENTViBvciBhIDJEIGFycmF5LCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlIHRpbGVXaWR0aCAmXHJcbiAqIHRpbGVIZWlnaHQuIFdoZW4gcGFyc2luZyBmcm9tIGEgbWFwIGZyb20gVGlsZWQsIHRoZSB0aWxlV2lkdGggJiB0aWxlSGVpZ2h0IHdpbGwgYmUgcHVsbGVkIGZyb21cclxuICogdGhlIG1hcCBkYXRhLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuUGFyc2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRpbGVtYXAsIHVzZWQgdG8gc2V0IHRoZSBuYW1lIG9uIHRoZSBNYXBEYXRhLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IG1hcEZvcm1hdCAtIFNlZSAuLi9Gb3JtYXRzLmpzLlxyXG4gKiBAcGFyYW0geyhpbnRlZ2VyW11bXXxzdHJpbmd8b2JqZWN0KX0gZGF0YSAtIDJEIGFycmF5LCBDU1Ygc3RyaW5nIG9yIFRpbGVkIEpTT04gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVXaWR0aCAtIFRoZSB3aWR0aCBvZiBhIHRpbGUgaW4gcGl4ZWxzLiBSZXF1aXJlZCBmb3IgMkQgYXJyYXkgYW5kIENTViwgYnV0XHJcbiAqIGlnbm9yZWQgZm9yIFRpbGVkIEpTT04uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZUhlaWdodCAtIFRoZSBoZWlnaHQgb2YgYSB0aWxlIGluIHBpeGVscy4gUmVxdWlyZWQgZm9yIDJEIGFycmF5IGFuZCBDU1YsIGJ1dFxyXG4gKiBpZ25vcmVkIGZvciBUaWxlZCBKU09OLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZC4gSWYgYHRydWVgLCBlbXB0eSBsb2NhdGlvbnMgd2lsbCBnZXQgYSB2YWx1ZSBvZiBgbnVsbGAuIElmIGBmYWxzZWAsIGVtcHR5XHJcbiAqIGxvY2F0aW9uIHdpbGwgZ2V0IGEgVGlsZSBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS4gSWYgeW91J3ZlIGEgbGFyZ2Ugc3BhcnNlbHkgcG9wdWxhdGVkIG1hcCBhbmRcclxuICogdGhlIHRpbGUgZGF0YSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlIHRoZW4gc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCB3aWxsIGhlbHAgd2l0aCBtZW1vcnlcclxuICogY29uc3VtcHRpb24uIEhvd2V2ZXIgaWYgeW91ciBtYXAgaXMgc21hbGwgb3IgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSB0aWxlcyBkeW5hbWljYWxseSwgdGhlbiBsZWF2ZVxyXG4gKiB0aGUgZGVmYXVsdCB2YWx1ZSBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5NYXBEYXRhfSBUaGUgY3JlYXRlZCBgTWFwRGF0YWAgb2JqZWN0LlxyXG4gKi9cclxudmFyIFBhcnNlID0gZnVuY3Rpb24gKG5hbWUsIG1hcEZvcm1hdCwgZGF0YSwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBpbnNlcnROdWxsKVxyXG57XHJcbiAgICB2YXIgbmV3TWFwO1xyXG5cclxuICAgIHN3aXRjaCAobWFwRm9ybWF0KVxyXG4gICAge1xyXG4gICAgICAgIGNhc2UgKEZvcm1hdHMuQVJSQVlfMkQpOlxyXG4gICAgICAgICAgICBuZXdNYXAgPSBQYXJzZTJEQXJyYXkobmFtZSwgZGF0YSwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBpbnNlcnROdWxsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAoRm9ybWF0cy5DU1YpOlxyXG4gICAgICAgICAgICBuZXdNYXAgPSBQYXJzZUNTVihuYW1lLCBkYXRhLCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGluc2VydE51bGwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIChGb3JtYXRzLlRJTEVEX0pTT04pOlxyXG4gICAgICAgICAgICBuZXdNYXAgPSBQYXJzZUpTT05UaWxlZChuYW1lLCBkYXRhLCBpbnNlcnROdWxsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAoRm9ybWF0cy5XRUxUTUVJU1RFUik6XHJcbiAgICAgICAgICAgIG5ld01hcCA9IFBhcnNlV2VsdG1laXN0ZXIobmFtZSwgZGF0YSwgaW5zZXJ0TnVsbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5yZWNvZ25pemVkIHRpbGVtYXAgZGF0YSBmb3JtYXQ6ICcgKyBtYXBGb3JtYXQpO1xyXG4gICAgICAgICAgICBuZXdNYXAgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdNYXA7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGb3JtYXRzID0gcmVxdWlyZSgnLi4vRm9ybWF0cycpO1xyXG52YXIgTGF5ZXJEYXRhID0gcmVxdWlyZSgnLi4vbWFwZGF0YS9MYXllckRhdGEnKTtcclxudmFyIE1hcERhdGEgPSByZXF1aXJlKCcuLi9tYXBkYXRhL01hcERhdGEnKTtcclxudmFyIFRpbGUgPSByZXF1aXJlKCcuLi9UaWxlJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIGEgMkQgYXJyYXkgb2YgdGlsZSBpbmRleGVzIGludG8gYSBuZXcgTWFwRGF0YSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBsYXllci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5QYXJzZXJzLlBhcnNlMkRBcnJheVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGlsZW1hcCwgdXNlZCB0byBzZXQgdGhlIG5hbWUgb24gdGhlIE1hcERhdGEuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcltdW119IGRhdGEgLSAyRCBhcnJheSwgQ1NWIHN0cmluZyBvciBUaWxlZCBKU09OIG9iamVjdC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlV2lkdGggLSBUaGUgd2lkdGggb2YgYSB0aWxlIGluIHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSGVpZ2h0IC0gVGhlIGhlaWdodCBvZiBhIHRpbGUgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZC4gSWYgYHRydWVgLCBlbXB0eSBsb2NhdGlvbnMgd2lsbCBnZXQgYSB2YWx1ZSBvZiBgbnVsbGAuIElmIGBmYWxzZWAsIGVtcHR5XHJcbiAqIGxvY2F0aW9uIHdpbGwgZ2V0IGEgVGlsZSBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS4gSWYgeW91J3ZlIGEgbGFyZ2Ugc3BhcnNlbHkgcG9wdWxhdGVkIG1hcCBhbmRcclxuICogdGhlIHRpbGUgZGF0YSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlIHRoZW4gc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCB3aWxsIGhlbHAgd2l0aCBtZW1vcnlcclxuICogY29uc3VtcHRpb24uIEhvd2V2ZXIgaWYgeW91ciBtYXAgaXMgc21hbGwgb3IgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSB0aWxlcyBkeW5hbWljYWxseSwgdGhlbiBsZWF2ZVxyXG4gKiB0aGUgZGVmYXVsdCB2YWx1ZSBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5NYXBEYXRhfSBUaGUgTWFwRGF0YSBvYmplY3QuXHJcbiAqL1xyXG52YXIgUGFyc2UyREFycmF5ID0gZnVuY3Rpb24gKG5hbWUsIGRhdGEsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgaW5zZXJ0TnVsbClcclxue1xyXG4gICAgdmFyIGxheWVyRGF0YSA9IG5ldyBMYXllckRhdGEoe1xyXG4gICAgICAgIHRpbGVXaWR0aDogdGlsZVdpZHRoLFxyXG4gICAgICAgIHRpbGVIZWlnaHQ6IHRpbGVIZWlnaHRcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBtYXBEYXRhID0gbmV3IE1hcERhdGEoe1xyXG4gICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgdGlsZVdpZHRoOiB0aWxlV2lkdGgsXHJcbiAgICAgICAgdGlsZUhlaWdodDogdGlsZUhlaWdodCxcclxuICAgICAgICBmb3JtYXQ6IEZvcm1hdHMuQVJSQVlfMkQsXHJcbiAgICAgICAgbGF5ZXJzOiBbIGxheWVyRGF0YSBdXHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgdGlsZXMgPSBbXTtcclxuICAgIHZhciBoZWlnaHQgPSBkYXRhLmxlbmd0aDtcclxuICAgIHZhciB3aWR0aCA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgeSA9IDA7IHkgPCBkYXRhLmxlbmd0aDsgeSsrKVxyXG4gICAge1xyXG4gICAgICAgIHRpbGVzW3ldID0gW107XHJcbiAgICAgICAgdmFyIHJvdyA9IGRhdGFbeV07XHJcblxyXG4gICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcm93Lmxlbmd0aDsgeCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGVJbmRleCA9IHBhcnNlSW50KHJvd1t4XSwgMTApO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTmFOKHRpbGVJbmRleCkgfHwgdGlsZUluZGV4ID09PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGlsZXNbeV1beF0gPSBpbnNlcnROdWxsXHJcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgVGlsZShsYXllckRhdGEsIC0xLCB4LCB5LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGlsZXNbeV1beF0gPSBuZXcgVGlsZShsYXllckRhdGEsIHRpbGVJbmRleCwgeCwgeSwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpZHRoID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd2lkdGggPSByb3cubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYXBEYXRhLndpZHRoID0gbGF5ZXJEYXRhLndpZHRoID0gd2lkdGg7XHJcbiAgICBtYXBEYXRhLmhlaWdodCA9IGxheWVyRGF0YS5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICBtYXBEYXRhLndpZHRoSW5QaXhlbHMgPSBsYXllckRhdGEud2lkdGhJblBpeGVscyA9IHdpZHRoICogdGlsZVdpZHRoO1xyXG4gICAgbWFwRGF0YS5oZWlnaHRJblBpeGVscyA9IGxheWVyRGF0YS5oZWlnaHRJblBpeGVscyA9IGhlaWdodCAqIHRpbGVIZWlnaHQ7XHJcbiAgICBsYXllckRhdGEuZGF0YSA9IHRpbGVzO1xyXG5cclxuICAgIHJldHVybiBtYXBEYXRhO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZTJEQXJyYXk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZvcm1hdHMgPSByZXF1aXJlKCcuLi9Gb3JtYXRzJyk7XHJcbnZhciBQYXJzZTJEQXJyYXkgPSByZXF1aXJlKCcuL1BhcnNlMkRBcnJheScpO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhIENTViBzdHJpbmcgb2YgdGlsZSBpbmRleGVzIGludG8gYSBuZXcgTWFwRGF0YSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBsYXllci5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5QYXJzZXJzLlBhcnNlQ1NWXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0aWxlbWFwLCB1c2VkIHRvIHNldCB0aGUgbmFtZSBvbiB0aGUgTWFwRGF0YS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgLSBDU1Ygc3RyaW5nIG9mIHRpbGUgaW5kZXhlcy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlV2lkdGggLSBUaGUgd2lkdGggb2YgYSB0aWxlIGluIHBpeGVscy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlSGVpZ2h0IC0gVGhlIGhlaWdodCBvZiBhIHRpbGUgaW4gcGl4ZWxzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZC4gSWYgYHRydWVgLCBlbXB0eSBsb2NhdGlvbnMgd2lsbCBnZXQgYSB2YWx1ZSBvZiBgbnVsbGAuIElmIGBmYWxzZWAsIGVtcHR5XHJcbiAqIGxvY2F0aW9uIHdpbGwgZ2V0IGEgVGlsZSBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS4gSWYgeW91J3ZlIGEgbGFyZ2Ugc3BhcnNlbHkgcG9wdWxhdGVkIG1hcCBhbmRcclxuICogdGhlIHRpbGUgZGF0YSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlIHRoZW4gc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCB3aWxsIGhlbHAgd2l0aCBtZW1vcnlcclxuICogY29uc3VtcHRpb24uIEhvd2V2ZXIgaWYgeW91ciBtYXAgaXMgc21hbGwgb3IgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSB0aWxlcyBkeW5hbWljYWxseSwgdGhlbiBsZWF2ZVxyXG4gKiB0aGUgZGVmYXVsdCB2YWx1ZSBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5NYXBEYXRhfSBUaGUgcmVzdWx0aW5nIE1hcERhdGEgb2JqZWN0LlxyXG4gKi9cclxudmFyIFBhcnNlQ1NWID0gZnVuY3Rpb24gKG5hbWUsIGRhdGEsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgaW5zZXJ0TnVsbClcclxue1xyXG4gICAgdmFyIGFycmF5MkQgPSBkYXRhXHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5zcGxpdCgnXFxuJylcclxuICAgICAgICAubWFwKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHJvdy5zcGxpdCgnLCcpOyB9KTtcclxuXHJcbiAgICB2YXIgbWFwID0gUGFyc2UyREFycmF5KG5hbWUsIGFycmF5MkQsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgaW5zZXJ0TnVsbCk7XHJcbiAgICBtYXAuZm9ybWF0ID0gRm9ybWF0cy5DU1Y7XHJcblxyXG4gICAgcmV0dXJuIG1hcDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VDU1Y7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIExheWVyRGF0YSA9IHJlcXVpcmUoJy4uLy4uL21hcGRhdGEvTGF5ZXJEYXRhJyk7XHJcbnZhciBUaWxlID0gcmVxdWlyZSgnLi4vLi4vVGlsZScpO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhbGwgdGlsZW1hcCBsYXllcnMgaW4gYW4gSW1wYWN0IEpTT04gb2JqZWN0IGludG8gbmV3IExheWVyRGF0YSBvYmplY3RzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuSW1wYWN0LlBhcnNlVGlsZUxheWVyc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgSW1wYWN0IEpTT04gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZCAoc2VlIHtAbGluayBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZUpTT05UaWxlZH0pLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhW119IC0gQW4gYXJyYXkgb2YgTGF5ZXJEYXRhIG9iamVjdHMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpblxyXG4gKiBqc29uLmxheWVycyB3aXRoIHRoZSB0eXBlICd0aWxlbGF5ZXInLlxyXG4gKi9cclxudmFyIFBhcnNlVGlsZUxheWVycyA9IGZ1bmN0aW9uIChqc29uLCBpbnNlcnROdWxsKVxyXG57XHJcbiAgICB2YXIgdGlsZUxheWVycyA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbi5sYXllci5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgbGF5ZXIgPSBqc29uLmxheWVyW2ldO1xyXG5cclxuICAgICAgICB2YXIgbGF5ZXJEYXRhID0gbmV3IExheWVyRGF0YSh7XHJcbiAgICAgICAgICAgIG5hbWU6IGxheWVyLm5hbWUsXHJcbiAgICAgICAgICAgIHdpZHRoOiBsYXllci53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBsYXllci5oZWlnaHQsXHJcbiAgICAgICAgICAgIHRpbGVXaWR0aDogbGF5ZXIudGlsZXNpemUsXHJcbiAgICAgICAgICAgIHRpbGVIZWlnaHQ6IGxheWVyLnRpbGVzaXplLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiBsYXllci52aXNpYmxlID09PSAxXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciByb3cgPSBbXTtcclxuICAgICAgICB2YXIgdGlsZUdyaWQgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gIExvb3AgdGhyb3VnaCB0aGUgZGF0YSBmaWVsZCBpbiB0aGUgSlNPTi4gVGhpcyBpcyBhIDJEIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRpbGUgaW5kZXhlcyxcclxuICAgICAgICAvLyAgb25lIGFmdGVyIHRoZSBvdGhlci4gVGhlIGluZGV4ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSB0aWxlc2V0IHRoYXQgY29udGFpbnMgdGhlIHRpbGUuXHJcbiAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBsYXllci5kYXRhLmxlbmd0aDsgeSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBsYXllci5kYXRhW3ldLmxlbmd0aDsgeCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbiBXZWx0bWVpc3RlciwgMCA9IG5vIHRpbGUsIGJ1dCB0aGUgVGlsZW1hcCBBUEkgZXhwZWN0cyAtMSA9IG5vIHRpbGUuXHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBsYXllci5kYXRhW3ldW3hdIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdGlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUobGF5ZXJEYXRhLCBpbmRleCwgeCwgeSwgbGF5ZXIudGlsZXNpemUsIGxheWVyLnRpbGVzaXplKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlID0gaW5zZXJ0TnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVGlsZShsYXllckRhdGEsIC0xLCB4LCB5LCBsYXllci50aWxlc2l6ZSwgbGF5ZXIudGlsZXNpemUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJvdy5wdXNoKHRpbGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aWxlR3JpZC5wdXNoKHJvdyk7XHJcbiAgICAgICAgICAgIHJvdyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGF5ZXJEYXRhLmRhdGEgPSB0aWxlR3JpZDtcclxuXHJcbiAgICAgICAgdGlsZUxheWVycy5wdXNoKGxheWVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVMYXllcnM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlVGlsZUxheWVycztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVGlsZXNldCA9IHJlcXVpcmUoJy4uLy4uL1RpbGVzZXQnKTtcclxuXHJcbi8qKlxyXG4gKiBUaWxlc2V0cyBhbmQgSW1hZ2UgQ29sbGVjdGlvbnNcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5UaWxlbWFwcy5QYXJzZXJzLkltcGFjdC5QYXJzZVRpbGVzZXRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBJbXBhY3QgSlNPTiBkYXRhLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgVGlsZXNldHMuXHJcbiAqL1xyXG52YXIgUGFyc2VUaWxlc2V0cyA9IGZ1bmN0aW9uIChqc29uKVxyXG57XHJcbiAgICB2YXIgdGlsZXNldHMgPSBbXTtcclxuICAgIHZhciB0aWxlc2V0c05hbWVzID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLmxheWVyLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBsYXllciA9IGpzb24ubGF5ZXJbaV07XHJcblxyXG4gICAgICAgIC8vIEEgcmVsYXRpdmUgZmlsZXBhdGggdG8gdGhlIHNvdXJjZSBpbWFnZSAod2l0aGluIFdlbHRtZWlzdGVyKSBpcyB1c2VkIGZvciB0aGUgbmFtZVxyXG4gICAgICAgIHZhciB0aWxlc2V0TmFtZSA9IGxheWVyLnRpbGVzZXROYW1lO1xyXG5cclxuICAgICAgICAvLyBPbmx5IGFkZCB1bmlxdWUgdGlsZXNldHMgdGhhdCBoYXZlIGEgdmFsaWQgbmFtZS4gQ29sbGlzaW9uIGxheWVycyB3aWxsIGhhdmUgYSBibGFuayBuYW1lLlxyXG4gICAgICAgIGlmICh0aWxlc2V0TmFtZSAhPT0gJycgJiYgdGlsZXNldHNOYW1lcy5pbmRleE9mKHRpbGVzZXROYW1lKSA9PT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aWxlc2V0c05hbWVzLnB1c2godGlsZXNldE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gVGlsZXMgYXJlIHN0b3JlZCB3aXRoIGFuIElEIHJlbGF0aXZlIHRvIHRoZSB0aWxlc2V0LCByYXRoZXIgdGhhbiBhIGdsb2JhbGx5IHVuaXF1ZSBJRFxyXG4gICAgICAgICAgICAvLyBhY3Jvc3MgYWxsIHRpbGVzZXRzLiBBbHNvLCB0aWxlc2V0cyBpbiBXZWx0bWVpc3RlciBoYXZlIG5vIG1hcmdpbiBvciBwYWRkaW5nLlxyXG4gICAgICAgICAgICB0aWxlc2V0cy5wdXNoKG5ldyBUaWxlc2V0KHRpbGVzZXROYW1lLCAwLCBsYXllci50aWxlc2l6ZSwgbGF5ZXIudGlsZXNpemUsIDAsIDApKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVzZXRzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZVRpbGVzZXRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGb3JtYXRzID0gcmVxdWlyZSgnLi4vLi4vRm9ybWF0cycpO1xyXG52YXIgTWFwRGF0YSA9IHJlcXVpcmUoJy4uLy4uL21hcGRhdGEvTWFwRGF0YScpO1xyXG52YXIgUGFyc2VUaWxlTGF5ZXJzID0gcmVxdWlyZSgnLi9QYXJzZVRpbGVMYXllcnMnKTtcclxudmFyIFBhcnNlVGlsZXNldHMgPSByZXF1aXJlKCcuL1BhcnNlVGlsZXNldHMnKTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYSBXZWx0bWVpc3RlciBKU09OIG9iamVjdCBpbnRvIGEgbmV3IE1hcERhdGEgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuSW1wYWN0LlBhcnNlV2VsdG1laXN0ZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRpbGVtYXAsIHVzZWQgdG8gc2V0IHRoZSBuYW1lIG9uIHRoZSBNYXBEYXRhLlxyXG4gKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBXZWx0bWVpc3RlciBKU09OIG9iamVjdC5cclxuICogQHBhcmFtIHtib29sZWFufSBpbnNlcnROdWxsIC0gQ29udHJvbHMgaG93IGVtcHR5IHRpbGVzLCB0aWxlcyB3aXRoIGFuIGluZGV4IG9mIC0xLCBpbiB0aGUgbWFwXHJcbiAqIGRhdGEgYXJlIGhhbmRsZWQuIElmIGB0cnVlYCwgZW1wdHkgbG9jYXRpb25zIHdpbGwgZ2V0IGEgdmFsdWUgb2YgYG51bGxgLiBJZiBgZmFsc2VgLCBlbXB0eVxyXG4gKiBsb2NhdGlvbiB3aWxsIGdldCBhIFRpbGUgb2JqZWN0IHdpdGggYW4gaW5kZXggb2YgLTEuIElmIHlvdSd2ZSBhIGxhcmdlIHNwYXJzZWx5IHBvcHVsYXRlZCBtYXAgYW5kXHJcbiAqIHRoZSB0aWxlIGRhdGEgZG9lc24ndCBuZWVkIHRvIGNoYW5nZSB0aGVuIHNldHRpbmcgdGhpcyB2YWx1ZSB0byBgdHJ1ZWAgd2lsbCBoZWxwIHdpdGggbWVtb3J5XHJcbiAqIGNvbnN1bXB0aW9uLiBIb3dldmVyIGlmIHlvdXIgbWFwIGlzIHNtYWxsIG9yIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGlsZXMgZHluYW1pY2FsbHksIHRoZW4gbGVhdmVcclxuICogdGhlIGRlZmF1bHQgdmFsdWUgc2V0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHs/UGhhc2VyLlRpbGVtYXBzLk1hcERhdGF9IFRoZSBjcmVhdGVkIE1hcERhdGEgb2JqZWN0LCBvciBgbnVsbGAgaWYgdGhlIGRhdGEgY2FuJ3QgYmUgcGFyc2VkLlxyXG4gKi9cclxudmFyIFBhcnNlV2VsdG1laXN0ZXIgPSBmdW5jdGlvbiAobmFtZSwganNvbiwgaW5zZXJ0TnVsbClcclxue1xyXG4gICAgaWYgKGpzb24ubGF5ZXIubGVuZ3RoID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignTm8gbGF5ZXJzIGZvdW5kIGluIHRoZSBXZWx0bWVpc3RlciBtYXA6ICcgKyBuYW1lKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgd2lkdGggPSAwO1xyXG4gICAgdmFyIGhlaWdodCA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLmxheWVyLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChqc29uLmxheWVyW2ldLndpZHRoID4gd2lkdGgpIHsgd2lkdGggPSBqc29uLmxheWVyW2ldLndpZHRoOyB9XHJcbiAgICAgICAgaWYgKGpzb24ubGF5ZXJbaV0uaGVpZ2h0ID4gaGVpZ2h0KSB7IGhlaWdodCA9IGpzb24ubGF5ZXJbaV0uaGVpZ2h0OyB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG1hcERhdGEgPSBuZXcgTWFwRGF0YSh7XHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgdGlsZVdpZHRoOiBqc29uLmxheWVyWzBdLnRpbGVzaXplLFxyXG4gICAgICAgIHRpbGVIZWlnaHQ6IGpzb24ubGF5ZXJbMF0udGlsZXNpemUsXHJcbiAgICAgICAgZm9ybWF0OiBGb3JtYXRzLldFTFRNRUlTVEVSXHJcbiAgICB9KTtcclxuXHJcbiAgICBtYXBEYXRhLmxheWVycyA9IFBhcnNlVGlsZUxheWVycyhqc29uLCBpbnNlcnROdWxsKTtcclxuICAgIG1hcERhdGEudGlsZXNldHMgPSBQYXJzZVRpbGVzZXRzKGpzb24pO1xyXG5cclxuICAgIHJldHVybiBtYXBEYXRhO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZVdlbHRtZWlzdGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UaWxlbWFwcy5QYXJzZXJzLkltcGFjdFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFBhcnNlVGlsZUxheWVyczogcmVxdWlyZSgnLi9QYXJzZVRpbGVMYXllcnMnKSxcclxuICAgIFBhcnNlVGlsZXNldHM6IHJlcXVpcmUoJy4vUGFyc2VUaWxlc2V0cycpLFxyXG4gICAgUGFyc2VXZWx0bWVpc3RlcjogcmVxdWlyZSgnLi9QYXJzZVdlbHRtZWlzdGVyJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnNcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBQYXJzZTogcmVxdWlyZSgnLi9QYXJzZScpLFxyXG4gICAgUGFyc2UyREFycmF5OiByZXF1aXJlKCcuL1BhcnNlMkRBcnJheScpLFxyXG4gICAgUGFyc2VDU1Y6IHJlcXVpcmUoJy4vUGFyc2VDU1YnKSxcclxuXHJcbiAgICBJbXBhY3Q6IHJlcXVpcmUoJy4vaW1wYWN0LycpLFxyXG4gICAgVGlsZWQ6IHJlcXVpcmUoJy4vdGlsZWQvJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxuXHJcbi8qKlxyXG4gKiBDb3B5IHByb3BlcnRpZXMgZnJvbSB0aWxlc2V0IHRvIHRpbGVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuVGlsZWQuQXNzaWduVGlsZVByb3BlcnRpZXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLk1hcERhdGF9IG1hcERhdGEgLSBUaGUgTWFwIERhdGEgb2JqZWN0LlxyXG4gKi9cclxudmFyIEFzc2lnblRpbGVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG1hcERhdGEpXHJcbntcclxuICAgIHZhciBsYXllckRhdGE7XHJcbiAgICB2YXIgdGlsZTtcclxuICAgIHZhciBzaWQ7XHJcbiAgICB2YXIgc2V0O1xyXG4gICAgdmFyIHJvdztcclxuXHJcbiAgICAvLyBnbyB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCBkYXRhIGxheWVyc1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBEYXRhLmxheWVycy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBsYXllckRhdGEgPSBtYXBEYXRhLmxheWVyc1tpXTtcclxuXHJcbiAgICAgICAgc2V0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gcm93cyBvZiB0aWxlc1xyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGF5ZXJEYXRhLmRhdGEubGVuZ3RoOyBqKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByb3cgPSBsYXllckRhdGEuZGF0YVtqXTtcclxuXHJcbiAgICAgICAgICAgIC8vIGluZGl2aWR1YWwgdGlsZXNcclxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpbGUgPSByb3dba107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUgPT09IG51bGwgfHwgdGlsZS5pbmRleCA8IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcmVsZXZhbnQgdGlsZXNldFxyXG4gICAgICAgICAgICAgICAgc2lkID0gbWFwRGF0YS50aWxlc1t0aWxlLmluZGV4XVsyXTtcclxuICAgICAgICAgICAgICAgIHNldCA9IG1hcERhdGEudGlsZXNldHNbc2lkXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhIHRpbGUncyBzaXplIG1hdGNoZXMgaXRzIHRpbGVzZXRcclxuICAgICAgICAgICAgICAgIHRpbGUud2lkdGggPSBzZXQudGlsZVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgdGlsZS5oZWlnaHQgPSBzZXQudGlsZUhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGF0IHRpbGUgdHlwZSBoYXMgYW55IHByb3BlcnRpZXMsIGFkZCB0aGVtIHRvIHRoZSB0aWxlIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgaWYgKHNldC50aWxlUHJvcGVydGllcyAmJiBzZXQudGlsZVByb3BlcnRpZXNbdGlsZS5pbmRleCAtIHNldC5maXJzdGdpZF0pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5wcm9wZXJ0aWVzID0gRXh0ZW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlLnByb3BlcnRpZXMsIHNldC50aWxlUHJvcGVydGllc1t0aWxlLmluZGV4IC0gc2V0LmZpcnN0Z2lkXVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEFzc2lnblRpbGVQcm9wZXJ0aWVzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBEZWNvZGUgYmFzZS02NCBlbmNvZGVkIGRhdGEsIGZvciBleGFtcGxlIGFzIGV4cG9ydGVkIGJ5IFRpbGVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuVGlsZWQuQmFzZTY0RGVjb2RlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEJhc2UtNjQgZW5jb2RlZCBkYXRhIHRvIGRlY29kZS5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IEFycmF5IGNvbnRhaW5pbmcgdGhlIGRlY29kZWQgYnl0ZXMuXHJcbiAqL1xyXG52YXIgQmFzZTY0RGVjb2RlID0gZnVuY3Rpb24gKGRhdGEpXHJcbntcclxuICAgIHZhciBiaW5hcnlTdHJpbmcgPSB3aW5kb3cuYXRvYihkYXRhKTtcclxuICAgIHZhciBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xyXG4gICAgdmFyIGJ5dGVzID0gbmV3IEFycmF5KGxlbiAvIDQpO1xyXG5cclxuICAgIC8vIEludGVycHJldCBiaW5hcnlTdHJpbmcgYXMgYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGxpdHRsZS1lbmRpYW4gZW5jb2RlZCB1aW50MzIgdmFsdWVzLlxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNClcclxuICAgIHtcclxuICAgICAgICBieXRlc1tpIC8gNF0gPSAoXHJcbiAgICAgICAgICAgIGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpIHxcclxuICAgICAgICAgICAgYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSArIDEpIDw8IDggfFxyXG4gICAgICAgICAgICBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpICsgMikgPDwgMTYgfFxyXG4gICAgICAgICAgICBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpICsgMykgPDwgMjRcclxuICAgICAgICApID4+PiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBieXRlcztcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQmFzZTY0RGVjb2RlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBUaWxlc2V0ID0gcmVxdWlyZSgnLi4vLi4vVGlsZXNldCcpO1xyXG5cclxuLyoqXHJcbiAqIE1hc3RlciBsaXN0IG9mIHRpbGVzIC0+IHgsIHksIGluZGV4IGluIHRpbGVzZXQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5CdWlsZFRpbGVzZXRJbmRleFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVGlsZW1hcHMuTWFwRGF0YX0gbWFwRGF0YSAtIFRoZSBNYXAgRGF0YSBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSBvZiBUaWxlc2V0IG9iamVjdHMuXHJcbiAqL1xyXG52YXIgQnVpbGRUaWxlc2V0SW5kZXggPSBmdW5jdGlvbiAobWFwRGF0YSlcclxue1xyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgc2V0O1xyXG4gICAgdmFyIHRpbGVzID0gW107XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IG1hcERhdGEuaW1hZ2VDb2xsZWN0aW9ucy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgY29sbGVjdGlvbiA9IG1hcERhdGEuaW1hZ2VDb2xsZWN0aW9uc1tpXTtcclxuICAgICAgICB2YXIgaW1hZ2VzID0gY29sbGVjdGlvbi5pbWFnZXM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW1hZ2VzLmxlbmd0aDsgaisrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGltYWdlID0gaW1hZ2VzW2pdO1xyXG5cclxuICAgICAgICAgICAgc2V0ID0gbmV3IFRpbGVzZXQoaW1hZ2UuaW1hZ2UsIGltYWdlLmdpZCwgY29sbGVjdGlvbi5pbWFnZVdpZHRoLCBjb2xsZWN0aW9uLmltYWdlSGVpZ2h0LCAwLCAwKTtcclxuXHJcbiAgICAgICAgICAgIHNldC51cGRhdGVUaWxlRGF0YShjb2xsZWN0aW9uLmltYWdlV2lkdGgsIGNvbGxlY3Rpb24uaW1hZ2VIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgbWFwRGF0YS50aWxlc2V0cy5wdXNoKHNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBtYXBEYXRhLnRpbGVzZXRzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHNldCA9IG1hcERhdGEudGlsZXNldHNbaV07XHJcblxyXG4gICAgICAgIHZhciB4ID0gc2V0LnRpbGVNYXJnaW47XHJcbiAgICAgICAgdmFyIHkgPSBzZXQudGlsZU1hcmdpbjtcclxuXHJcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgICB2YXIgY291bnRYID0gMDtcclxuICAgICAgICB2YXIgY291bnRZID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgdCA9IHNldC5maXJzdGdpZDsgdCA8IHNldC5maXJzdGdpZCArIHNldC50b3RhbDsgdCsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIENhbiBhZGQgZXh0cmEgcHJvcGVydGllcyBoZXJlIGFzIG5lZWRlZFxyXG4gICAgICAgICAgICB0aWxlc1t0XSA9IFsgeCwgeSwgaSBdO1xyXG5cclxuICAgICAgICAgICAgeCArPSBzZXQudGlsZVdpZHRoICsgc2V0LnRpbGVTcGFjaW5nO1xyXG5cclxuICAgICAgICAgICAgY291bnQrKztcclxuXHJcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gc2V0LnRvdGFsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY291bnRYKys7XHJcblxyXG4gICAgICAgICAgICBpZiAoY291bnRYID09PSBzZXQuY29sdW1ucylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgeCA9IHNldC50aWxlTWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgeSArPSBzZXQudGlsZUhlaWdodCArIHNldC50aWxlU3BhY2luZztcclxuXHJcbiAgICAgICAgICAgICAgICBjb3VudFggPSAwO1xyXG4gICAgICAgICAgICAgICAgY291bnRZKys7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50WSA9PT0gc2V0LnJvd3MpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCdWlsZFRpbGVzZXRJbmRleDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgU2V0aCBCZXJyaWVyIDxiZXJyaWVyc0B1d3N0b3V0LmVkdT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogUGFyc2UgYSBUaWxlZCBncm91cCBsYXllciBhbmQgY3JlYXRlIGEgc3RhdGUgb2JqZWN0IGZvciBpbmhlcml0aW5nLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuVGlsZWQuQ3JlYXRlR3JvdXBMYXllclxyXG4gKiBAc2luY2UgMy4yMS4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIFRpbGVkIEpTT04gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW2N1cnJlbnRsXSAtIFRoZSBjdXJyZW50IGdyb3VwIGxheWVyIGZyb20gdGhlIFRpbGVkIEpTT04gZmlsZS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJlbnRzdGF0ZV0gLSBUaGUgc3RhdGUgb2YgdGhlIHBhcmVudCBncm91cCAoaWYgYW55KS5cclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBBIGdyb3VwIHN0YXRlIG9iamVjdCB3aXRoIHByb3BlciB2YWx1ZXMgZm9yIHVwZGF0aW5nIGNoaWxkcmVuIGxheWVycy5cclxuICovXHJcbnZhciBDcmVhdGVHcm91cExheWVyID0gZnVuY3Rpb24gKGpzb24sIGdyb3VwbCwgcGFyZW50c3RhdGUpXHJcbntcclxuICAgIGlmICghZ3JvdXBsKVxyXG4gICAge1xyXG4gICAgICAgIC8vIFJldHVybiBhIGRlZmF1bHQgZ3JvdXAgc3RhdGUgb2JqZWN0XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaTogMCwgLy8gQ3VycmVudCBsYXllciBhcnJheSBpdGVyYXRvclxyXG4gICAgICAgICAgICBsYXllcnM6IGpzb24ubGF5ZXJzLCAvLyBDdXJyZW50IGFycmF5IG9mIGxheWVyc1xyXG5cclxuICAgICAgICAgICAgLy8gVmFsdWVzIGluaGVyaXRlZCBmcm9tIHBhcmVudCBncm91cFxyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgeTogMFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tcHV0ZSBncm91cCBsYXllciB4LCB5XHJcbiAgICB2YXIgbGF5ZXJYID0gZ3JvdXBsLnggKyBHZXRGYXN0VmFsdWUoZ3JvdXBsLCAnc3RhcnR4JywgMCkgKiBqc29uLnRpbGV3aWR0aCArIEdldEZhc3RWYWx1ZShncm91cGwsICdvZmZzZXR4JywgMCk7XHJcbiAgICB2YXIgbGF5ZXJZID0gZ3JvdXBsLnkgKyBHZXRGYXN0VmFsdWUoZ3JvdXBsLCAnc3RhcnR5JywgMCkgKiBqc29uLnRpbGVoZWlnaHQgKyBHZXRGYXN0VmFsdWUoZ3JvdXBsLCAnb2Zmc2V0eScsIDApO1xyXG5cclxuICAgIC8vIENvbXB1dGUgbmV4dCBzdGF0ZSBpbmhlcml0ZWQgZnJvbSBncm91cFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpOiAwLFxyXG4gICAgICAgIGxheWVyczogZ3JvdXBsLmxheWVycyxcclxuICAgICAgICBuYW1lOiBwYXJlbnRzdGF0ZS5uYW1lICsgZ3JvdXBsLm5hbWUgKyAnLycsXHJcbiAgICAgICAgb3BhY2l0eTogcGFyZW50c3RhdGUub3BhY2l0eSAqIGdyb3VwbC5vcGFjaXR5LFxyXG4gICAgICAgIHZpc2libGU6IHBhcmVudHN0YXRlLnZpc2libGUgJiYgZ3JvdXBsLnZpc2libGUsXHJcbiAgICAgICAgeDogcGFyZW50c3RhdGUueCArIGxheWVyWCxcclxuICAgICAgICB5OiBwYXJlbnRzdGF0ZS55ICsgbGF5ZXJZXHJcbiAgICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDcmVhdGVHcm91cExheWVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBGTElQUEVEX0hPUklaT05UQUwgPSAweDgwMDAwMDAwO1xyXG52YXIgRkxJUFBFRF9WRVJUSUNBTCA9IDB4NDAwMDAwMDA7XHJcbnZhciBGTElQUEVEX0FOVElfRElBR09OQUwgPSAweDIwMDAwMDAwOyAvLyBUb3AtcmlnaHQgaXMgc3dhcHBlZCB3aXRoIGJvdHRvbS1sZWZ0IGNvcm5lcnNcclxuXHJcbi8qKlxyXG4gKiBTZWUgVGlsZWQgZG9jdW1lbnRhdGlvbiBvbiB0aWxlIGZsaXBwaW5nOlxyXG4gKiBodHRwOi8vZG9jcy5tYXBlZGl0b3Iub3JnL2VuL2xhdGVzdC9yZWZlcmVuY2UvdG14LW1hcC1mb3JtYXQvXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZUdJRFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGdpZCAtIEEgVGlsZWQgR0lELlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuR0lERGF0YX0gVGhlIEdJRCBEYXRhLlxyXG4gKi9cclxudmFyIFBhcnNlR0lEID0gZnVuY3Rpb24gKGdpZClcclxue1xyXG4gICAgdmFyIGZsaXBwZWRIb3Jpem9udGFsID0gQm9vbGVhbihnaWQgJiBGTElQUEVEX0hPUklaT05UQUwpO1xyXG4gICAgdmFyIGZsaXBwZWRWZXJ0aWNhbCA9IEJvb2xlYW4oZ2lkICYgRkxJUFBFRF9WRVJUSUNBTCk7XHJcbiAgICB2YXIgZmxpcHBlZEFudGlEaWFnb25hbCA9IEJvb2xlYW4oZ2lkICYgRkxJUFBFRF9BTlRJX0RJQUdPTkFMKTtcclxuICAgIGdpZCA9IGdpZCAmIH4oRkxJUFBFRF9IT1JJWk9OVEFMIHwgRkxJUFBFRF9WRVJUSUNBTCB8IEZMSVBQRURfQU5USV9ESUFHT05BTCk7XHJcblxyXG4gICAgLy8gUGFyc2UgdGhlIGZsaXAgZmxhZ3MgaW50byBzb21ldGhpbmcgUGhhc2VyIGNhbiB1c2VcclxuICAgIHZhciByb3RhdGlvbiA9IDA7XHJcbiAgICB2YXIgZmxpcHBlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmIChmbGlwcGVkSG9yaXpvbnRhbCAmJiBmbGlwcGVkVmVydGljYWwgJiYgZmxpcHBlZEFudGlEaWFnb25hbClcclxuICAgIHtcclxuICAgICAgICByb3RhdGlvbiA9IE1hdGguUEkgLyAyO1xyXG4gICAgICAgIGZsaXBwZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZmxpcHBlZEhvcml6b250YWwgJiYgZmxpcHBlZFZlcnRpY2FsICYmICFmbGlwcGVkQW50aURpYWdvbmFsKVxyXG4gICAge1xyXG4gICAgICAgIHJvdGF0aW9uID0gTWF0aC5QSTtcclxuICAgICAgICBmbGlwcGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmbGlwcGVkSG9yaXpvbnRhbCAmJiAhZmxpcHBlZFZlcnRpY2FsICYmIGZsaXBwZWRBbnRpRGlhZ29uYWwpXHJcbiAgICB7XHJcbiAgICAgICAgcm90YXRpb24gPSBNYXRoLlBJIC8gMjtcclxuICAgICAgICBmbGlwcGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmbGlwcGVkSG9yaXpvbnRhbCAmJiAhZmxpcHBlZFZlcnRpY2FsICYmICFmbGlwcGVkQW50aURpYWdvbmFsKVxyXG4gICAge1xyXG4gICAgICAgIHJvdGF0aW9uID0gMDtcclxuICAgICAgICBmbGlwcGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCFmbGlwcGVkSG9yaXpvbnRhbCAmJiBmbGlwcGVkVmVydGljYWwgJiYgZmxpcHBlZEFudGlEaWFnb25hbClcclxuICAgIHtcclxuICAgICAgICByb3RhdGlvbiA9IDMgKiBNYXRoLlBJIC8gMjtcclxuICAgICAgICBmbGlwcGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZmxpcHBlZEhvcml6b250YWwgJiYgZmxpcHBlZFZlcnRpY2FsICYmICFmbGlwcGVkQW50aURpYWdvbmFsKVxyXG4gICAge1xyXG4gICAgICAgIHJvdGF0aW9uID0gTWF0aC5QSTtcclxuICAgICAgICBmbGlwcGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCFmbGlwcGVkSG9yaXpvbnRhbCAmJiAhZmxpcHBlZFZlcnRpY2FsICYmIGZsaXBwZWRBbnRpRGlhZ29uYWwpXHJcbiAgICB7XHJcbiAgICAgICAgcm90YXRpb24gPSAzICogTWF0aC5QSSAvIDI7XHJcbiAgICAgICAgZmxpcHBlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZmxpcHBlZEhvcml6b250YWwgJiYgIWZsaXBwZWRWZXJ0aWNhbCAmJiAhZmxpcHBlZEFudGlEaWFnb25hbClcclxuICAgIHtcclxuICAgICAgICByb3RhdGlvbiA9IDA7XHJcbiAgICAgICAgZmxpcHBlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZ2lkOiBnaWQsXHJcbiAgICAgICAgZmxpcHBlZEhvcml6b250YWw6IGZsaXBwZWRIb3Jpem9udGFsLFxyXG4gICAgICAgIGZsaXBwZWRWZXJ0aWNhbDogZmxpcHBlZFZlcnRpY2FsLFxyXG4gICAgICAgIGZsaXBwZWRBbnRpRGlhZ29uYWw6IGZsaXBwZWRBbnRpRGlhZ29uYWwsXHJcbiAgICAgICAgcm90YXRpb246IHJvdGF0aW9uLFxyXG4gICAgICAgIGZsaXBwZWQ6IGZsaXBwZWRcclxuICAgIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlR0lEO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRGYXN0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9vYmplY3QvR2V0RmFzdFZhbHVlJyk7XHJcbnZhciBDcmVhdGVHcm91cExheWVyID0gcmVxdWlyZSgnLi9DcmVhdGVHcm91cExheWVyJyk7XHJcblxyXG4vKipcclxuICogUGFyc2VzIGEgVGlsZWQgSlNPTiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggZGV0YWlscyBhYm91dCB0aGUgaW1hZ2UgbGF5ZXJzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlRpbGVtYXBzLlBhcnNlcnMuVGlsZWQuUGFyc2VJbWFnZUxheWVyc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgVGlsZWQgSlNPTiBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBBcnJheSBvZiBvYmplY3RzIHRoYXQgaW5jbHVkZSBjcml0aWNhbCBpbmZvIGFib3V0IHRoZSBtYXAncyBpbWFnZSBsYXllcnNcclxuICovXHJcbnZhciBQYXJzZUltYWdlTGF5ZXJzID0gZnVuY3Rpb24gKGpzb24pXHJcbntcclxuICAgIHZhciBpbWFnZXMgPSBbXTtcclxuXHJcbiAgICAvLyBTdGF0ZSBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBncm91cFxyXG4gICAgdmFyIGdyb3VwU3RhY2sgPSBbXTtcclxuICAgIHZhciBjdXJHcm91cFN0YXRlID0gQ3JlYXRlR3JvdXBMYXllcihqc29uKTtcclxuXHJcbiAgICB3aGlsZSAoY3VyR3JvdXBTdGF0ZS5pIDwgY3VyR3JvdXBTdGF0ZS5sYXllcnMubGVuZ3RoIHx8IGdyb3VwU3RhY2subGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgICBpZiAoY3VyR3JvdXBTdGF0ZS5pID49IGN1ckdyb3VwU3RhdGUubGF5ZXJzLmxlbmd0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEVuc3VyZSByZWN1cnNpb24gc3RhY2sgaXMgbm90IGVtcHR5IGZpcnN0XHJcbiAgICAgICAgICAgIGlmIChncm91cFN0YWNrLmxlbmd0aCA8IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICAnVGlsZW1hcFBhcnNlci5wYXJzZVRpbGVkSlNPTiAtIEludmFsaWQgbGF5ZXIgZ3JvdXAgaGllcmFyY2h5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSZXR1cm4gdG8gcHJldmlvdXMgcmVjdXJzaXZlIHN0YXRlXHJcbiAgICAgICAgICAgIGN1ckdyb3VwU3RhdGUgPSBncm91cFN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBjdXJyZW50IGxheWVyIGFuZCBhZHZhbmNlIGl0ZXJhdG9yXHJcbiAgICAgICAgdmFyIGN1cmkgPSBjdXJHcm91cFN0YXRlLmxheWVyc1tjdXJHcm91cFN0YXRlLmldO1xyXG4gICAgICAgIGN1ckdyb3VwU3RhdGUuaSsrO1xyXG5cclxuICAgICAgICBpZiAoY3VyaS50eXBlICE9PSAnaW1hZ2VsYXllcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY3VyaS50eXBlID09PSAnZ3JvdXAnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgc3RhdGUgaW5oZXJpdGVkIGZyb20gZ3JvdXBcclxuICAgICAgICAgICAgICAgIHZhciBuZXh0R3JvdXBTdGF0ZSA9IENyZWF0ZUdyb3VwTGF5ZXIoanNvbiwgY3VyaSwgY3VyR3JvdXBTdGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgY3VycmVudCBzdGF0ZSBiZWZvcmUgcmVjdXJzaW5nXHJcbiAgICAgICAgICAgICAgICBncm91cFN0YWNrLnB1c2goY3VyR3JvdXBTdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBjdXJHcm91cFN0YXRlID0gbmV4dEdyb3VwU3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyBsYXllciBPUiAncmVjdXJzZScgKGl0ZXJhdGl2ZSBzdHlsZSkgaW50byB0aGUgZ3JvdXBcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbGF5ZXJPZmZzZXRYID0gR2V0RmFzdFZhbHVlKGN1cmksICdvZmZzZXR4JywgMCkgKyBHZXRGYXN0VmFsdWUoY3VyaSwgJ3N0YXJ0eCcsIDApO1xyXG4gICAgICAgIHZhciBsYXllck9mZnNldFkgPSBHZXRGYXN0VmFsdWUoY3VyaSwgJ29mZnNldHknLCAwKSArIEdldEZhc3RWYWx1ZShjdXJpLCAnc3RhcnR5JywgMCk7XHJcbiAgICAgICAgaW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICBuYW1lOiAoY3VyR3JvdXBTdGF0ZS5uYW1lICsgY3VyaS5uYW1lKSxcclxuICAgICAgICAgICAgaW1hZ2U6IGN1cmkuaW1hZ2UsXHJcbiAgICAgICAgICAgIHg6IChjdXJHcm91cFN0YXRlLnggKyBsYXllck9mZnNldFggKyBjdXJpLngpLFxyXG4gICAgICAgICAgICB5OiAoY3VyR3JvdXBTdGF0ZS55ICsgbGF5ZXJPZmZzZXRZICsgY3VyaS55KSxcclxuICAgICAgICAgICAgYWxwaGE6IChjdXJHcm91cFN0YXRlLm9wYWNpdHkgKiBjdXJpLm9wYWNpdHkpLFxyXG4gICAgICAgICAgICB2aXNpYmxlOiAoY3VyR3JvdXBTdGF0ZS52aXNpYmxlICYmIGN1cmkudmlzaWJsZSksXHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IEdldEZhc3RWYWx1ZShjdXJpLCAncHJvcGVydGllcycsIHt9KVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWFnZXM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlSW1hZ2VMYXllcnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEZvcm1hdHMgPSByZXF1aXJlKCcuLi8uLi9Gb3JtYXRzJyk7XHJcbnZhciBNYXBEYXRhID0gcmVxdWlyZSgnLi4vLi4vbWFwZGF0YS9NYXBEYXRhJyk7XHJcbnZhciBQYXJzZVRpbGVMYXllcnMgPSByZXF1aXJlKCcuL1BhcnNlVGlsZUxheWVycycpO1xyXG52YXIgUGFyc2VJbWFnZUxheWVycyA9IHJlcXVpcmUoJy4vUGFyc2VJbWFnZUxheWVycycpO1xyXG52YXIgUGFyc2VUaWxlc2V0cyA9IHJlcXVpcmUoJy4vUGFyc2VUaWxlc2V0cycpO1xyXG52YXIgUGFyc2VPYmplY3RMYXllcnMgPSByZXF1aXJlKCcuL1BhcnNlT2JqZWN0TGF5ZXJzJyk7XHJcbnZhciBCdWlsZFRpbGVzZXRJbmRleCA9IHJlcXVpcmUoJy4vQnVpbGRUaWxlc2V0SW5kZXgnKTtcclxudmFyIEFzc2lnblRpbGVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9Bc3NpZ25UaWxlUHJvcGVydGllcycpO1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlcyBhIFRpbGVkIEpTT04gb2JqZWN0IGludG8gYSBuZXcgTWFwRGF0YSBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZUpTT05UaWxlZFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGlsZW1hcCwgdXNlZCB0byBzZXQgdGhlIG5hbWUgb24gdGhlIE1hcERhdGEuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIFRpbGVkIEpTT04gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZC4gSWYgYHRydWVgLCBlbXB0eSBsb2NhdGlvbnMgd2lsbCBnZXQgYSB2YWx1ZSBvZiBgbnVsbGAuIElmIGBmYWxzZWAsIGVtcHR5XHJcbiAqIGxvY2F0aW9uIHdpbGwgZ2V0IGEgVGlsZSBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS4gSWYgeW91J3ZlIGEgbGFyZ2Ugc3BhcnNlbHkgcG9wdWxhdGVkIG1hcCBhbmRcclxuICogdGhlIHRpbGUgZGF0YSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlIHRoZW4gc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCB3aWxsIGhlbHAgd2l0aCBtZW1vcnlcclxuICogY29uc3VtcHRpb24uIEhvd2V2ZXIgaWYgeW91ciBtYXAgaXMgc21hbGwgb3IgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSB0aWxlcyBkeW5hbWljYWxseSwgdGhlbiBsZWF2ZVxyXG4gKiB0aGUgZGVmYXVsdCB2YWx1ZSBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuTWFwRGF0YX0gVGhlIGNyZWF0ZWQgTWFwRGF0YSBvYmplY3QsIG9yIGBudWxsYCBpZiB0aGUgZGF0YSBjYW4ndCBiZSBwYXJzZWQuXHJcbiAqL1xyXG52YXIgUGFyc2VKU09OVGlsZWQgPSBmdW5jdGlvbiAobmFtZSwganNvbiwgaW5zZXJ0TnVsbClcclxue1xyXG4gICAgaWYgKGpzb24ub3JpZW50YXRpb24gIT09ICdvcnRob2dvbmFsJylcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ09ubHkgb3J0aG9nb25hbCBtYXAgdHlwZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgUGhhc2VyJyk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIE1hcCBkYXRhIHdpbGwgY29uc2lzdCBvZjogbGF5ZXJzLCBvYmplY3RzLCBpbWFnZXMsIHRpbGVzZXRzLCBzaXplc1xyXG4gICAgdmFyIG1hcERhdGEgPSBuZXcgTWFwRGF0YSh7XHJcbiAgICAgICAgd2lkdGg6IGpzb24ud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBqc29uLmhlaWdodCxcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHRpbGVXaWR0aDoganNvbi50aWxld2lkdGgsXHJcbiAgICAgICAgdGlsZUhlaWdodDoganNvbi50aWxlaGVpZ2h0LFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiBqc29uLm9yaWVudGF0aW9uLFxyXG4gICAgICAgIGZvcm1hdDogRm9ybWF0cy5USUxFRF9KU09OLFxyXG4gICAgICAgIHZlcnNpb246IGpzb24udmVyc2lvbixcclxuICAgICAgICBwcm9wZXJ0aWVzOiBqc29uLnByb3BlcnRpZXMsXHJcbiAgICAgICAgcmVuZGVyT3JkZXI6IGpzb24ucmVuZGVyb3JkZXIsXHJcbiAgICAgICAgaW5maW5pdGU6IGpzb24uaW5maW5pdGVcclxuICAgIH0pO1xyXG5cclxuICAgIG1hcERhdGEubGF5ZXJzID0gUGFyc2VUaWxlTGF5ZXJzKGpzb24sIGluc2VydE51bGwpO1xyXG4gICAgbWFwRGF0YS5pbWFnZXMgPSBQYXJzZUltYWdlTGF5ZXJzKGpzb24pO1xyXG5cclxuICAgIHZhciBzZXRzID0gUGFyc2VUaWxlc2V0cyhqc29uKTtcclxuICAgIG1hcERhdGEudGlsZXNldHMgPSBzZXRzLnRpbGVzZXRzO1xyXG4gICAgbWFwRGF0YS5pbWFnZUNvbGxlY3Rpb25zID0gc2V0cy5pbWFnZUNvbGxlY3Rpb25zO1xyXG5cclxuICAgIG1hcERhdGEub2JqZWN0cyA9IFBhcnNlT2JqZWN0TGF5ZXJzKGpzb24pO1xyXG5cclxuICAgIG1hcERhdGEudGlsZXMgPSBCdWlsZFRpbGVzZXRJbmRleChtYXBEYXRhKTtcclxuXHJcbiAgICBBc3NpZ25UaWxlUHJvcGVydGllcyhtYXBEYXRhKTtcclxuXHJcbiAgICByZXR1cm4gbWFwRGF0YTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VKU09OVGlsZWQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFBpY2sgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlscy9vYmplY3QvUGljaycpO1xyXG52YXIgUGFyc2VHSUQgPSByZXF1aXJlKCcuL1BhcnNlR0lEJyk7XHJcblxyXG52YXIgY29weVBvaW50cyA9IGZ1bmN0aW9uIChwKSB7IHJldHVybiB7IHg6IHAueCwgeTogcC55IH07IH07XHJcblxyXG52YXIgY29tbW9uT2JqZWN0UHJvcHMgPSBbICdpZCcsICduYW1lJywgJ3R5cGUnLCAncm90YXRpb24nLCAncHJvcGVydGllcycsICd2aXNpYmxlJywgJ3gnLCAneScsICd3aWR0aCcsICdoZWlnaHQnIF07XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIFRpbGVkIG9iamVjdCB0byBhbiBpbnRlcm5hbCBwYXJzZWQgb2JqZWN0IG5vcm1hbGlzaW5nIGFuZCBjb3B5aW5nIHByb3BlcnRpZXMgb3Zlciwgd2hpbGUgYXBwbHlpbmcgb3B0aW9uYWwgeCBhbmQgeSBvZmZzZXRzLiBUaGUgcGFyc2VkIG9iamVjdCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBwcm9wZXJ0aWVzIGBpZGAsIGBuYW1lYCwgYHR5cGVgLCBgcm90YXRpb25gLCBgcHJvcGVydGllc2AsIGB2aXNpYmxlYCwgYHhgLCBgeWAsIGB3aWR0aGAgYW5kIGBoZWlnaHRgLiBPdGhlciBwcm9wZXJ0aWVzIHdpbGwgYmUgYWRkZWQgYWNjb3JkaW5nIHRvIHRoZSBvYmplY3QgdHlwZSAoc3VjaCBhcyB0ZXh0LCBwb2x5bGluZSwgZ2lkIGV0Yy4pXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZU9iamVjdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IHRpbGVkT2JqZWN0IC0gVGlsZWQgb2JqZWN0IHRvIGNvbnZlcnQgdG8gYW4gaW50ZXJuYWwgcGFyc2VkIG9iamVjdCBub3JtYWxpc2luZyBhbmQgY29weWluZyBwcm9wZXJ0aWVzIG92ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0WD0wXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGFwcGx5IHRvIHRoZSBvYmplY3QncyB4IHByb3BlcnR5LiBEZWZhdWx0cyB0byAwLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldFk9MF0gLSBPcHRpb25hbCBhZGRpdGlvbmFsIG9mZnNldCB0byBhcHBseSB0byB0aGUgb2JqZWN0J3MgeSBwcm9wZXJ0eS4gRGVmYXVsdHMgdG8gMC5cclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBUaGUgcGFyc2VkIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgcmVhZCBmcm9tIHRoZSBUaWxlZCBvYmplY3QgYWNjb3JkaW5nIHRvIGl0J3MgdHlwZSB3aXRoIHggYW5kIHkgdmFsdWVzIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvZmZzZXRzLlxyXG4gKi9cclxudmFyIFBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKHRpbGVkT2JqZWN0LCBvZmZzZXRYLCBvZmZzZXRZKVxyXG57XHJcbiAgICBpZiAob2Zmc2V0WCA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFggPSAwOyB9XHJcbiAgICBpZiAob2Zmc2V0WSA9PT0gdW5kZWZpbmVkKSB7IG9mZnNldFkgPSAwOyB9XHJcblxyXG4gICAgdmFyIHBhcnNlZE9iamVjdCA9IFBpY2sodGlsZWRPYmplY3QsIGNvbW1vbk9iamVjdFByb3BzKTtcclxuXHJcbiAgICBwYXJzZWRPYmplY3QueCArPSBvZmZzZXRYO1xyXG4gICAgcGFyc2VkT2JqZWN0LnkgKz0gb2Zmc2V0WTtcclxuXHJcbiAgICBpZiAodGlsZWRPYmplY3QuZ2lkKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBPYmplY3QgdGlsZXNcclxuICAgICAgICB2YXIgZ2lkSW5mbyA9IFBhcnNlR0lEKHRpbGVkT2JqZWN0LmdpZCk7XHJcbiAgICAgICAgcGFyc2VkT2JqZWN0LmdpZCA9IGdpZEluZm8uZ2lkO1xyXG4gICAgICAgIHBhcnNlZE9iamVjdC5mbGlwcGVkSG9yaXpvbnRhbCA9IGdpZEluZm8uZmxpcHBlZEhvcml6b250YWw7XHJcbiAgICAgICAgcGFyc2VkT2JqZWN0LmZsaXBwZWRWZXJ0aWNhbCA9IGdpZEluZm8uZmxpcHBlZFZlcnRpY2FsO1xyXG4gICAgICAgIHBhcnNlZE9iamVjdC5mbGlwcGVkQW50aURpYWdvbmFsID0gZ2lkSW5mby5mbGlwcGVkQW50aURpYWdvbmFsO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGlsZWRPYmplY3QucG9seWxpbmUpXHJcbiAgICB7XHJcbiAgICAgICAgcGFyc2VkT2JqZWN0LnBvbHlsaW5lID0gdGlsZWRPYmplY3QucG9seWxpbmUubWFwKGNvcHlQb2ludHMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGlsZWRPYmplY3QucG9seWdvbilcclxuICAgIHtcclxuICAgICAgICBwYXJzZWRPYmplY3QucG9seWdvbiA9IHRpbGVkT2JqZWN0LnBvbHlnb24ubWFwKGNvcHlQb2ludHMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGlsZWRPYmplY3QuZWxsaXBzZSlcclxuICAgIHtcclxuICAgICAgICBwYXJzZWRPYmplY3QuZWxsaXBzZSA9IHRpbGVkT2JqZWN0LmVsbGlwc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aWxlZE9iamVjdC50ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIHBhcnNlZE9iamVjdC50ZXh0ID0gdGlsZWRPYmplY3QudGV4dDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRpbGVkT2JqZWN0LnBvaW50KVxyXG4gICAge1xyXG4gICAgICAgIHBhcnNlZE9iamVjdC5wb2ludCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXQgaXMgYSByZWN0YW5nbGVcclxuICAgICAgICBwYXJzZWRPYmplY3QucmVjdGFuZ2xlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZU9iamVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgUGFyc2VPYmplY3QgPSByZXF1aXJlKCcuL1BhcnNlT2JqZWN0Jyk7XHJcbnZhciBPYmplY3RMYXllciA9IHJlcXVpcmUoJy4uLy4uL21hcGRhdGEvT2JqZWN0TGF5ZXInKTtcclxudmFyIENyZWF0ZUdyb3VwTGF5ZXIgPSByZXF1aXJlKCcuL0NyZWF0ZUdyb3VwTGF5ZXInKTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYSBUaWxlZCBKU09OIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIE9iamVjdExheWVyIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZU9iamVjdExheWVyc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IGpzb24gLSBUaGUgVGlsZWQgSlNPTiBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSBvZiBhbGwgb2JqZWN0IGxheWVycyBpbiB0aGUgdGlsZW1hcCBhcyBgT2JqZWN0TGF5ZXJgcy5cclxuICovXHJcbnZhciBQYXJzZU9iamVjdExheWVycyA9IGZ1bmN0aW9uIChqc29uKVxyXG57XHJcbiAgICB2YXIgb2JqZWN0TGF5ZXJzID0gW107XHJcblxyXG4gICAgLy8gU3RhdGUgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgZ3JvdXBcclxuICAgIHZhciBncm91cFN0YWNrID0gW107XHJcbiAgICB2YXIgY3VyR3JvdXBTdGF0ZSA9IENyZWF0ZUdyb3VwTGF5ZXIoanNvbik7XHJcblxyXG4gICAgd2hpbGUgKGN1ckdyb3VwU3RhdGUuaSA8IGN1ckdyb3VwU3RhdGUubGF5ZXJzLmxlbmd0aCB8fCBncm91cFN0YWNrLmxlbmd0aCA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGN1ckdyb3VwU3RhdGUuaSA+PSBjdXJHcm91cFN0YXRlLmxheWVycy5sZW5ndGgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBFbnN1cmUgcmVjdXJzaW9uIHN0YWNrIGlzIG5vdCBlbXB0eSBmaXJzdFxyXG4gICAgICAgICAgICBpZiAoZ3JvdXBTdGFjay5sZW5ndGggPCAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgJ1RpbGVtYXBQYXJzZXIucGFyc2VUaWxlZEpTT04gLSBJbnZhbGlkIGxheWVyIGdyb3VwIGhpZXJhcmNoeSdcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmV0dXJuIHRvIHByZXZpb3VzIHJlY3Vyc2l2ZSBzdGF0ZVxyXG4gICAgICAgICAgICBjdXJHcm91cFN0YXRlID0gZ3JvdXBTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgY3VycmVudCBsYXllciBhbmQgYWR2YW5jZSBpdGVyYXRvclxyXG4gICAgICAgIHZhciBjdXJvID0gY3VyR3JvdXBTdGF0ZS5sYXllcnNbY3VyR3JvdXBTdGF0ZS5pXTtcclxuICAgICAgICBjdXJHcm91cFN0YXRlLmkrKztcclxuXHJcbiAgICAgICAgLy8gTW9kaWZ5IGluaGVyaXRlZCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgY3Vyby5vcGFjaXR5ICo9IGN1ckdyb3VwU3RhdGUub3BhY2l0eTtcclxuICAgICAgICBjdXJvLnZpc2libGUgPSBjdXJHcm91cFN0YXRlLnZpc2libGUgJiYgY3Vyby52aXNpYmxlO1xyXG5cclxuICAgICAgICBpZiAoY3Vyby50eXBlICE9PSAnb2JqZWN0Z3JvdXAnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGN1cm8udHlwZSA9PT0gJ2dyb3VwJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IHN0YXRlIGluaGVyaXRlZCBmcm9tIGdyb3VwXHJcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEdyb3VwU3RhdGUgPSBDcmVhdGVHcm91cExheWVyKGpzb24sIGN1cm8sIGN1ckdyb3VwU3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIGN1cnJlbnQgc3RhdGUgYmVmb3JlIHJlY3Vyc2luZ1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBTdGFjay5wdXNoKGN1ckdyb3VwU3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgY3VyR3JvdXBTdGF0ZSA9IG5leHRHcm91cFN0YXRlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBTa2lwIHRoaXMgbGF5ZXIgT1IgJ3JlY3Vyc2UnIChpdGVyYXRpdmUgc3R5bGUpIGludG8gdGhlIGdyb3VwXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3Vyby5uYW1lID0gY3VyR3JvdXBTdGF0ZS5uYW1lICsgY3Vyby5uYW1lO1xyXG4gICAgICAgIHZhciBvZmZzZXRYID0gY3VyR3JvdXBTdGF0ZS54ICsgR2V0RmFzdFZhbHVlKGN1cm8sICdzdGFydHgnLCAwKSArIEdldEZhc3RWYWx1ZShjdXJvLCAnb2Zmc2V0eCcsIDApO1xyXG4gICAgICAgIHZhciBvZmZzZXRZID0gY3VyR3JvdXBTdGF0ZS55ICsgR2V0RmFzdFZhbHVlKGN1cm8sICdzdGFydHknLCAwKSArIEdldEZhc3RWYWx1ZShjdXJvLCAnb2Zmc2V0eScsIDApO1xyXG5cclxuICAgICAgICB2YXIgb2JqZWN0cyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3Vyby5vYmplY3RzLmxlbmd0aDsgaisrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBhcnNlZE9iamVjdCA9IFBhcnNlT2JqZWN0KGN1cm8ub2JqZWN0c1tqXSwgb2Zmc2V0WCwgb2Zmc2V0WSk7XHJcblxyXG4gICAgICAgICAgICBvYmplY3RzLnB1c2gocGFyc2VkT2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvYmplY3RMYXllciA9IG5ldyBPYmplY3RMYXllcihjdXJvKTtcclxuICAgICAgICBvYmplY3RMYXllci5vYmplY3RzID0gb2JqZWN0cztcclxuXHJcbiAgICAgICAgb2JqZWN0TGF5ZXJzLnB1c2gob2JqZWN0TGF5ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3RMYXllcnM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlT2JqZWN0TGF5ZXJzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBCYXNlNjREZWNvZGUgPSByZXF1aXJlKCcuL0Jhc2U2NERlY29kZScpO1xyXG52YXIgR2V0RmFzdFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vLi4vdXRpbHMvb2JqZWN0L0dldEZhc3RWYWx1ZScpO1xyXG52YXIgTGF5ZXJEYXRhID0gcmVxdWlyZSgnLi4vLi4vbWFwZGF0YS9MYXllckRhdGEnKTtcclxudmFyIFBhcnNlR0lEID0gcmVxdWlyZSgnLi9QYXJzZUdJRCcpO1xyXG52YXIgVGlsZSA9IHJlcXVpcmUoJy4uLy4uL1RpbGUnKTtcclxudmFyIENyZWF0ZUdyb3VwTGF5ZXIgPSByZXF1aXJlKCcuL0NyZWF0ZUdyb3VwTGF5ZXInKTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXMgYWxsIHRpbGVtYXAgbGF5ZXJzIGluIGEgVGlsZWQgSlNPTiBvYmplY3QgaW50byBuZXcgTGF5ZXJEYXRhIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZVRpbGVMYXllcnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBqc29uIC0gVGhlIFRpbGVkIEpTT04gb2JqZWN0LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluc2VydE51bGwgLSBDb250cm9scyBob3cgZW1wdHkgdGlsZXMsIHRpbGVzIHdpdGggYW4gaW5kZXggb2YgLTEsIGluIHRoZSBtYXBcclxuICogZGF0YSBhcmUgaGFuZGxlZCAoc2VlIHtAbGluayBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZUpTT05UaWxlZH0pLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhW119IC0gQW4gYXJyYXkgb2YgTGF5ZXJEYXRhIG9iamVjdHMsIG9uZSBmb3IgZWFjaCBlbnRyeSBpblxyXG4gKiBqc29uLmxheWVycyB3aXRoIHRoZSB0eXBlICd0aWxlbGF5ZXInLlxyXG4gKi9cclxudmFyIFBhcnNlVGlsZUxheWVycyA9IGZ1bmN0aW9uIChqc29uLCBpbnNlcnROdWxsKVxyXG57XHJcbiAgICB2YXIgaW5maW5pdGVNYXAgPSBHZXRGYXN0VmFsdWUoanNvbiwgJ2luZmluaXRlJywgZmFsc2UpO1xyXG4gICAgdmFyIHRpbGVMYXllcnMgPSBbXTtcclxuXHJcbiAgICAvLyBTdGF0ZSBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBncm91cFxyXG4gICAgdmFyIGdyb3VwU3RhY2sgPSBbXTtcclxuICAgIHZhciBjdXJHcm91cFN0YXRlID0gQ3JlYXRlR3JvdXBMYXllcihqc29uKTtcclxuXHJcbiAgICB3aGlsZSAoY3VyR3JvdXBTdGF0ZS5pIDwgY3VyR3JvdXBTdGF0ZS5sYXllcnMubGVuZ3RoIHx8IGdyb3VwU3RhY2subGVuZ3RoID4gMClcclxuICAgIHtcclxuICAgICAgICBpZiAoY3VyR3JvdXBTdGF0ZS5pID49IGN1ckdyb3VwU3RhdGUubGF5ZXJzLmxlbmd0aClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEVuc3VyZSByZWN1cnNpb24gc3RhY2sgaXMgbm90IGVtcHR5IGZpcnN0XHJcbiAgICAgICAgICAgIGlmIChncm91cFN0YWNrLmxlbmd0aCA8IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICAnVGlsZW1hcFBhcnNlci5wYXJzZVRpbGVkSlNPTiAtIEludmFsaWQgbGF5ZXIgZ3JvdXAgaGllcmFyY2h5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBSZXR1cm4gdG8gcHJldmlvdXMgcmVjdXJzaXZlIHN0YXRlXHJcbiAgICAgICAgICAgIGN1ckdyb3VwU3RhdGUgPSBncm91cFN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjdXJsID0gY3VyR3JvdXBTdGF0ZS5sYXllcnNbY3VyR3JvdXBTdGF0ZS5pXTtcclxuICAgICAgICBjdXJHcm91cFN0YXRlLmkrKztcclxuXHJcbiAgICAgICAgaWYgKGN1cmwudHlwZSAhPT0gJ3RpbGVsYXllcicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAoY3VybC50eXBlID09PSAnZ3JvdXAnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIG5leHQgc3RhdGUgaW5oZXJpdGVkIGZyb20gZ3JvdXBcclxuICAgICAgICAgICAgICAgIHZhciBuZXh0R3JvdXBTdGF0ZSA9IENyZWF0ZUdyb3VwTGF5ZXIoanNvbiwgY3VybCwgY3VyR3JvdXBTdGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUHJlc2VydmUgY3VycmVudCBzdGF0ZSBiZWZvcmUgcmVjdXJzaW5nXHJcbiAgICAgICAgICAgICAgICBncm91cFN0YWNrLnB1c2goY3VyR3JvdXBTdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBjdXJHcm91cFN0YXRlID0gbmV4dEdyb3VwU3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNraXAgdGhpcyBsYXllciBPUiAncmVjdXJzZScgKGl0ZXJhdGl2ZSBzdHlsZSkgaW50byB0aGUgZ3JvdXBcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBCYXNlNjQgZGVjb2RlIGRhdGEgaWYgbmVjZXNzYXJ5LiBOT1RFOiB1bmNvbXByZXNzZWQgYmFzZTY0IG9ubHkuXHJcbiAgICAgICAgaWYgKGN1cmwuY29tcHJlc3Npb24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAnVGlsZW1hcFBhcnNlci5wYXJzZVRpbGVkSlNPTiAtIExheWVyIGNvbXByZXNzaW9uIGlzIHVuc3VwcG9ydGVkLCBza2lwcGluZyBsYXllciBcXCcnXHJcbiAgICAgICAgICAgICAgICArIGN1cmwubmFtZSArICdcXCcnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjdXJsLmVuY29kaW5nICYmIGN1cmwuZW5jb2RpbmcgPT09ICdiYXNlNjQnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gQ2h1bmtzIGZvciBhbiBpbmZpbml0ZSBtYXBcclxuICAgICAgICAgICAgaWYgKGN1cmwuY2h1bmtzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1cmwuY2h1bmtzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cmwuY2h1bmtzW2ldLmRhdGEgPSBCYXNlNjREZWNvZGUoY3VybC5jaHVua3NbaV0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE5vbi1pbmZpbml0ZSBtYXAgZGF0YVxyXG4gICAgICAgICAgICBpZiAoY3VybC5kYXRhKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdXJsLmRhdGEgPSBCYXNlNjREZWNvZGUoY3VybC5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGVsZXRlIGN1cmwuZW5jb2Rpbmc7IC8vIEFsbG93IHRoZSBzYW1lIG1hcCB0byBiZSBwYXJzZWQgbXVsdGlwbGUgdGltZXNcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBUaGlzIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRpbGUgaW5kZXhlcywgb25lIGFmdGVyIHRoZSBvdGhlci4gLTEgPSBubyB0aWxlLFxyXG4gICAgICAgIC8vICBldmVyeXRoaW5nIGVsc2UgPSB0aGUgdGlsZSBpbmRleCAoc3RhcnRpbmcgYXQgMSBmb3IgVGlsZWQsIDAgZm9yIENTVikgSWYgdGhlIG1hcFxyXG4gICAgICAgIC8vICBjb250YWlucyBtdWx0aXBsZSB0aWxlc2V0cyB0aGVuIHRoZSBpbmRleGVzIGFyZSByZWxhdGl2ZSB0byB0aGF0IHdoaWNoIHRoZSBzZXQgc3RhcnRzXHJcbiAgICAgICAgLy8gIGZyb20uIE5lZWQgdG8gc2V0IHdoaWNoIHRpbGVzZXQgaW4gdGhlIGNhY2hlID0gd2hpY2ggdGlsZXNldCBpbiB0aGUgSlNPTiwgaWYgeW91IGRvIHRoaXNcclxuICAgICAgICAvLyAgbWFudWFsbHkgaXQgbWVhbnMgeW91IGNhbiB1c2UgdGhlIHNhbWUgbWFwIGRhdGEgYnV0IGEgbmV3IHRpbGVzZXQuXHJcblxyXG4gICAgICAgIHZhciBsYXllckRhdGE7XHJcbiAgICAgICAgdmFyIGdpZEluZm87XHJcbiAgICAgICAgdmFyIHRpbGU7XHJcbiAgICAgICAgdmFyIGJsYW5rVGlsZTtcclxuXHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG4gICAgICAgIHZhciB4ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGluZmluaXRlTWFwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGxheWVyT2Zmc2V0WCA9IChHZXRGYXN0VmFsdWUoY3VybCwgJ3N0YXJ0eCcsIDApICsgY3VybC54KTtcclxuICAgICAgICAgICAgdmFyIGxheWVyT2Zmc2V0WSA9IChHZXRGYXN0VmFsdWUoY3VybCwgJ3N0YXJ0eScsIDApICsgY3VybC55KTtcclxuICAgICAgICAgICAgbGF5ZXJEYXRhID0gbmV3IExheWVyRGF0YSh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAoY3VyR3JvdXBTdGF0ZS5uYW1lICsgY3VybC5uYW1lKSxcclxuICAgICAgICAgICAgICAgIHg6IChjdXJHcm91cFN0YXRlLnggKyBHZXRGYXN0VmFsdWUoY3VybCwgJ29mZnNldHgnLCAwKSArIGxheWVyT2Zmc2V0WCAqIGpzb24udGlsZXdpZHRoKSxcclxuICAgICAgICAgICAgICAgIHk6IChjdXJHcm91cFN0YXRlLnkgKyBHZXRGYXN0VmFsdWUoY3VybCwgJ29mZnNldHknLCAwKSArIGxheWVyT2Zmc2V0WSAqIGpzb24udGlsZWhlaWdodCksXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogY3VybC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogY3VybC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB0aWxlV2lkdGg6IGpzb24udGlsZXdpZHRoLFxyXG4gICAgICAgICAgICAgICAgdGlsZUhlaWdodDoganNvbi50aWxlaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgYWxwaGE6IChjdXJHcm91cFN0YXRlLm9wYWNpdHkgKiBjdXJsLm9wYWNpdHkpLFxyXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKGN1ckdyb3VwU3RhdGUudmlzaWJsZSAmJiBjdXJsLnZpc2libGUpLFxyXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogR2V0RmFzdFZhbHVlKGN1cmwsICdwcm9wZXJ0aWVzJywgW10pXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjdXJsLmhlaWdodDsgYysrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChbIG51bGwgXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjdXJsLndpZHRoOyBqKyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2NdW2pdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChjID0gMCwgbGVuID0gY3VybC5jaHVua3MubGVuZ3RoOyBjIDwgbGVuOyBjKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IGN1cmwuY2h1bmtzW2NdO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRYID0gKGNodW5rLnggLSBsYXllck9mZnNldFgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFkgPSAoY2h1bmsueSAtIGxheWVyT2Zmc2V0WSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHkgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCBsZW4yID0gY2h1bmsuZGF0YS5sZW5ndGg7IHQgPCBsZW4yOyB0KyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09mZnNldFggPSB4ICsgb2Zmc2V0WDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3T2Zmc2V0WSA9IHkgKyBvZmZzZXRZO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBnaWRJbmZvID0gUGFyc2VHSUQoY2h1bmsuZGF0YVt0XSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vICBpbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChnaWRJbmZvLmdpZCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUobGF5ZXJEYXRhLCBnaWRJbmZvLmdpZCwgbmV3T2Zmc2V0WCwgbmV3T2Zmc2V0WSwganNvbi50aWxld2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uLnRpbGVoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVybmluZyBUaWxlZCdzIEZsaXBwZWRIb3Jpem9udGFsLCBGbGlwcGVkVmVydGljYWwgYW5kIEZsaXBwZWRBbnRpRGlhZ29uYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGV0aWVzIGludG8gZmxpcFgsIGZsaXBZIGFuZCByb3RhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlLnJvdGF0aW9uID0gZ2lkSW5mby5yb3RhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS5mbGlwWCA9IGdpZEluZm8uZmxpcHBlZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXdPZmZzZXRZXVtuZXdPZmZzZXRYXSA9IHRpbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rVGlsZSA9IGluc2VydE51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVGlsZShsYXllckRhdGEsIC0xLCBuZXdPZmZzZXRYLCBuZXdPZmZzZXRZLCBqc29uLnRpbGV3aWR0aCwganNvbi50aWxlaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXdPZmZzZXRZXVtuZXdPZmZzZXRYXSA9IGJsYW5rVGlsZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHgrKztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGNodW5rLndpZHRoKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGF5ZXJEYXRhID0gbmV3IExheWVyRGF0YSh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAoY3VyR3JvdXBTdGF0ZS5uYW1lICsgY3VybC5uYW1lKSxcclxuICAgICAgICAgICAgICAgIHg6IChjdXJHcm91cFN0YXRlLnggKyBHZXRGYXN0VmFsdWUoY3VybCwgJ29mZnNldHgnLCAwKSArIGN1cmwueCksXHJcbiAgICAgICAgICAgICAgICB5OiAoY3VyR3JvdXBTdGF0ZS55ICsgR2V0RmFzdFZhbHVlKGN1cmwsICdvZmZzZXR5JywgMCkgKyBjdXJsLnkpLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGN1cmwud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGN1cmwuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgdGlsZVdpZHRoOiBqc29uLnRpbGV3aWR0aCxcclxuICAgICAgICAgICAgICAgIHRpbGVIZWlnaHQ6IGpzb24udGlsZWhlaWdodCxcclxuICAgICAgICAgICAgICAgIGFscGhhOiAoY3VyR3JvdXBTdGF0ZS5vcGFjaXR5ICogY3VybC5vcGFjaXR5KSxcclxuICAgICAgICAgICAgICAgIHZpc2libGU6IChjdXJHcm91cFN0YXRlLnZpc2libGUgJiYgY3VybC52aXNpYmxlKSxcclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IEdldEZhc3RWYWx1ZShjdXJsLCAncHJvcGVydGllcycsIFtdKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciByb3cgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBMb29wIHRocm91Z2ggdGhlIGRhdGEgZmllbGQgaW4gdGhlIEpTT04uXHJcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwLCBsZW4gPSBjdXJsLmRhdGEubGVuZ3RoOyBrIDwgbGVuOyBrKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdpZEluZm8gPSBQYXJzZUdJRChjdXJsLmRhdGFba10pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICBpbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKGdpZEluZm8uZ2lkID4gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUobGF5ZXJEYXRhLCBnaWRJbmZvLmdpZCwgeCwgb3V0cHV0Lmxlbmd0aCwganNvbi50aWxld2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb24udGlsZWhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFR1cm5pbmcgVGlsZWQncyBGbGlwcGVkSG9yaXpvbnRhbCwgRmxpcHBlZFZlcnRpY2FsIGFuZCBGbGlwcGVkQW50aURpYWdvbmFsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGV0aWVzIGludG8gZmxpcFgsIGZsaXBZIGFuZCByb3RhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIHRpbGUucm90YXRpb24gPSBnaWRJbmZvLnJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZmxpcFggPSBnaWRJbmZvLmZsaXBwZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKHRpbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsYW5rVGlsZSA9IGluc2VydE51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRpbGUobGF5ZXJEYXRhLCAtMSwgeCwgb3V0cHV0Lmxlbmd0aCwganNvbi50aWxld2lkdGgsIGpzb24udGlsZWhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnB1c2goYmxhbmtUaWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB4Kys7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGN1cmwud2lkdGgpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocm93KTtcclxuICAgICAgICAgICAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICByb3cgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGF5ZXJEYXRhLmRhdGEgPSBvdXRwdXQ7XHJcbiAgICAgICAgdGlsZUxheWVycy5wdXNoKGxheWVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRpbGVMYXllcnM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlVGlsZUxheWVycztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgVGlsZXNldCA9IHJlcXVpcmUoJy4uLy4uL1RpbGVzZXQnKTtcclxudmFyIEltYWdlQ29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uLy4uL0ltYWdlQ29sbGVjdGlvbicpO1xyXG52YXIgUGFyc2VPYmplY3QgPSByZXF1aXJlKCcuL1BhcnNlT2JqZWN0Jyk7XHJcblxyXG4vKipcclxuICogVGlsZXNldHMgYW5kIEltYWdlIENvbGxlY3Rpb25zXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVGlsZW1hcHMuUGFyc2Vycy5UaWxlZC5QYXJzZVRpbGVzZXRzXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0ganNvbiAtIFRoZSBUaWxlZCBKU09OIGRhdGEuXHJcbiAqXHJcbiAqIEByZXR1cm4ge29iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRpbGVzZXQgYW5kIGltYWdlIGNvbGxlY3Rpb24gZGF0YS5cclxuICovXHJcbnZhciBQYXJzZVRpbGVzZXRzID0gZnVuY3Rpb24gKGpzb24pXHJcbntcclxuICAgIHZhciB0aWxlc2V0cyA9IFtdO1xyXG4gICAgdmFyIGltYWdlQ29sbGVjdGlvbnMgPSBbXTtcclxuICAgIHZhciBsYXN0U2V0ID0gbnVsbDtcclxuICAgIHZhciBzdHJpbmdJRDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24udGlsZXNldHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIG5hbWUsIGZpcnN0Z2lkLCB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIHNwYWNpbmcsIHByb3BlcnRpZXNcclxuICAgICAgICB2YXIgc2V0ID0ganNvbi50aWxlc2V0c1tpXTtcclxuXHJcbiAgICAgICAgaWYgKHNldC5zb3VyY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BoYXNlciBjYW5cXCd0IGxvYWQgZXh0ZXJuYWwgdGlsZXNldHMuIFVzZSB0aGUgRW1iZWQgVGlsZXNldCBidXR0b24gYW5kIHRoZW4gZXhwb3J0IHRoZSBtYXAgYWdhaW4uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNldC5pbWFnZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBuZXdTZXQgPSBuZXcgVGlsZXNldChzZXQubmFtZSwgc2V0LmZpcnN0Z2lkLCBzZXQudGlsZXdpZHRoLCBzZXQudGlsZWhlaWdodCwgc2V0Lm1hcmdpbiwgc2V0LnNwYWNpbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGpzb24udmVyc2lvbiA+IDEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vIFRpbGVkIDEuMitcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZXQudGlsZXMpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0aWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHNldC50aWxlcy5sZW5ndGg7IHQrKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aWxlID0gc2V0LnRpbGVzW3RdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIENvbnZlcnQgdGlsZXByb3BlcnRpZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUucHJvcGVydGllcylcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Byb3BEYXRhID0ge307XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BEYXRhW3Byb3BEYXRhWyduYW1lJ11dID0gcHJvcERhdGFbJ3ZhbHVlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1t0aWxlLmlkXSA9IG5ld1Byb3BEYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgQ29udmVydCBvYmplY3Rncm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5vYmplY3Rncm91cClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZXNbdGlsZS5pZF0gPSB7IG9iamVjdGdyb3VwOiB0aWxlLm9iamVjdGdyb3VwIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUub2JqZWN0Z3JvdXAub2JqZWN0cylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2VkT2JqZWN0czIgPSB0aWxlLm9iamVjdGdyb3VwLm9iamVjdHMubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBQYXJzZU9iamVjdChvYmopOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZXNbdGlsZS5pZF0ub2JqZWN0Z3JvdXAub2JqZWN0cyA9IHBhcnNlZE9iamVjdHMyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IGFuaW1hdGlvbiBkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLmFuaW1hdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGVzLmhhc093blByb3BlcnR5KHRpbGUuaWQpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVzW3RpbGUuaWRdLmFuaW1hdGlvbiA9IHRpbGUuYW5pbWF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVzW3RpbGUuaWRdID0geyBhbmltYXRpb246IHRpbGUuYW5pbWF0aW9uIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG5ld1NldC50aWxlRGF0YSA9IHRpbGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1NldC50aWxlUHJvcGVydGllcyA9IHByb3BzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gVGlsZWQgMVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFByb3BlcnRpZXMgc3RvcmVkIHBlci10aWxlIGluIG9iamVjdCB3aXRoIHN0cmluZyBpbmRleGVzIHN0YXJ0aW5nIGF0IFwiMFwiXHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0LnRpbGVwcm9wZXJ0aWVzKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1NldC50aWxlUHJvcGVydGllcyA9IHNldC50aWxlcHJvcGVydGllcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPYmplY3QgJiB0ZXJyYWluIHNoYXBlcyBzdG9yZWQgcGVyLXRpbGUgaW4gb2JqZWN0IHdpdGggc3RyaW5nIGluZGV4ZXMgc3RhcnRpbmcgYXQgXCIwXCJcclxuICAgICAgICAgICAgICAgIGlmIChzZXQudGlsZXMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3U2V0LnRpbGVEYXRhID0gc2V0LnRpbGVzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgb2JqZWN0cyBpbnRvIFBoYXNlciBmb3JtYXQgdG8gbWF0Y2ggaGFuZGxpbmcgb2Ygb3RoZXIgVGlsZWQgb2JqZWN0c1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoc3RyaW5nSUQgaW4gbmV3U2V0LnRpbGVEYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iamVjdEdyb3VwID0gbmV3U2V0LnRpbGVEYXRhW3N0cmluZ0lEXS5vYmplY3Rncm91cDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdEdyb3VwICYmIG9iamVjdEdyb3VwLm9iamVjdHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRPYmplY3RzMSA9IG9iamVjdEdyb3VwLm9iamVjdHMubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIFBhcnNlT2JqZWN0KG9iaik7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXQudGlsZURhdGFbc3RyaW5nSURdLm9iamVjdGdyb3VwLm9iamVjdHMgPSBwYXJzZWRPYmplY3RzMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRm9yIGEgbm9ybWFsIHNsaWNlZCB0aWxlc2V0IHRoZSByb3cvY291bnQvc2l6ZSBpbmZvcm1hdGlvbiBpcyBjb21wdXRlZCB3aGVuIHVwZGF0ZWQuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSAoYWdhaW4pIGFmdGVyIHRoZSBpbWFnZSBpcyBzZXQuXHJcbiAgICAgICAgICAgIG5ld1NldC51cGRhdGVUaWxlRGF0YShzZXQuaW1hZ2V3aWR0aCwgc2V0LmltYWdlaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRpbGVzZXRzLnB1c2gobmV3U2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5ld0NvbGxlY3Rpb24gPSBuZXcgSW1hZ2VDb2xsZWN0aW9uKHNldC5uYW1lLCBzZXQuZmlyc3RnaWQsIHNldC50aWxld2lkdGgsXHJcbiAgICAgICAgICAgICAgICBzZXQudGlsZWhlaWdodCwgc2V0Lm1hcmdpbiwgc2V0LnNwYWNpbmcsIHNldC5wcm9wZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoc3RyaW5nSUQgaW4gc2V0LnRpbGVzKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBzZXQudGlsZXNbc3RyaW5nSURdLmltYWdlO1xyXG4gICAgICAgICAgICAgICAgdmFyIGdpZCA9IHNldC5maXJzdGdpZCArIHBhcnNlSW50KHN0cmluZ0lELCAxMCk7XHJcbiAgICAgICAgICAgICAgICBuZXdDb2xsZWN0aW9uLmFkZEltYWdlKGdpZCwgaW1hZ2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbWFnZUNvbGxlY3Rpb25zLnB1c2gobmV3Q29sbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgV2UndmUgZ290IGEgbmV3IFRpbGVzZXQsIHNvIHNldCB0aGUgbGFzdGdpZCBpbnRvIHRoZSBwcmV2aW91cyBvbmVcclxuICAgICAgICBpZiAobGFzdFNldClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxhc3RTZXQubGFzdGdpZCA9IHNldC5maXJzdGdpZCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0U2V0ID0gc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHRpbGVzZXRzOiB0aWxlc2V0cywgaW1hZ2VDb2xsZWN0aW9uczogaW1hZ2VDb2xsZWN0aW9ucyB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZVRpbGVzZXRzO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UaWxlbWFwcy5QYXJzZXJzLlRpbGVkXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQXNzaWduVGlsZVByb3BlcnRpZXM6IHJlcXVpcmUoJy4vQXNzaWduVGlsZVByb3BlcnRpZXMnKSxcclxuICAgIEJhc2U2NERlY29kZTogcmVxdWlyZSgnLi9CYXNlNjREZWNvZGUnKSxcclxuICAgIEJ1aWxkVGlsZXNldEluZGV4OiByZXF1aXJlKCcuL0J1aWxkVGlsZXNldEluZGV4JyksXHJcbiAgICBQYXJzZUdJRDogcmVxdWlyZSgnLi9QYXJzZUdJRCcpLFxyXG4gICAgUGFyc2VJbWFnZUxheWVyczogcmVxdWlyZSgnLi9QYXJzZUltYWdlTGF5ZXJzJyksXHJcbiAgICBQYXJzZUpTT05UaWxlZDogcmVxdWlyZSgnLi9QYXJzZUpTT05UaWxlZCcpLFxyXG4gICAgUGFyc2VPYmplY3Q6IHJlcXVpcmUoJy4vUGFyc2VPYmplY3QnKSxcclxuICAgIFBhcnNlT2JqZWN0TGF5ZXJzOiByZXF1aXJlKCcuL1BhcnNlT2JqZWN0TGF5ZXJzJyksXHJcbiAgICBQYXJzZVRpbGVMYXllcnM6IHJlcXVpcmUoJy4vUGFyc2VUaWxlTGF5ZXJzJyksXHJcbiAgICBQYXJzZVRpbGVzZXRzOiByZXF1aXJlKCcuL1BhcnNlVGlsZXNldHMnKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xhc3MgPSByZXF1aXJlKCcuLi8uLi91dGlscy9DbGFzcycpO1xyXG52YXIgQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL2NvbXBvbmVudHMnKTtcclxudmFyIEdhbWVFdmVudHMgPSByZXF1aXJlKCcuLi8uLi9jb3JlL2V2ZW50cycpO1xyXG52YXIgR2FtZU9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL0dhbWVPYmplY3QnKTtcclxudmFyIFN0YXRpY1RpbGVtYXBMYXllclJlbmRlciA9IHJlcXVpcmUoJy4vU3RhdGljVGlsZW1hcExheWVyUmVuZGVyJyk7XHJcbnZhciBUaWxlbWFwQ29tcG9uZW50cyA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMnKTtcclxudmFyIFRyYW5zZm9ybU1hdHJpeCA9IHJlcXVpcmUoJy4uLy4uL2dhbWVvYmplY3RzL2NvbXBvbmVudHMvVHJhbnNmb3JtTWF0cml4Jyk7XHJcbnZhciBVdGlscyA9IHJlcXVpcmUoJy4uLy4uL3JlbmRlcmVyL3dlYmdsL1V0aWxzJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBBIFN0YXRpYyBUaWxlbWFwIExheWVyIGlzIGEgR2FtZSBPYmplY3QgdGhhdCByZW5kZXJzIExheWVyRGF0YSBmcm9tIGEgVGlsZW1hcCB3aGVuIHVzZWQgaW4gY29tYmluYXRpb25cclxuICogd2l0aCBvbmUsIG9yIG1vcmUsIFRpbGVzZXRzLlxyXG4gKlxyXG4gKiBBIFN0YXRpYyBUaWxlbWFwIExheWVyIGlzIG9wdGltaXplZCBmb3IgcmVuZGVyaW5nIHNwZWVkIG92ZXIgZmxleGliaWxpdHkuIFlvdSBjYW5ub3QgYXBwbHkgcGVyLXRpbGVcclxuICogZWZmZWN0cyBsaWtlIHRpbnQgb3IgYWxwaGEsIG9yIGNoYW5nZSB0aGUgdGlsZXMgb3IgdGlsZXNldHMgdGhlIGxheWVyIHVzZXMuXHJcbiAqIFxyXG4gKiBVc2UgYSBTdGF0aWMgVGlsZW1hcCBMYXllciBpbnN0ZWFkIG9mIGEgRHluYW1pYyBUaWxlbWFwIExheWVyIHdoZW4geW91IGRvbid0IG5lZWQgdGlsZSBtYW5pcHVsYXRpb24gZmVhdHVyZXMuXHJcbiAqXHJcbiAqIEBjbGFzcyBTdGF0aWNUaWxlbWFwTGF5ZXJcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RcclxuICogQG1lbWJlcm9mIFBoYXNlci5UaWxlbWFwc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkFscGhhXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLkJsZW5kTW9kZVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5Db21wdXRlZFNpemVcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRGVwdGhcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuRmxpcFxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5HZXRCb3VuZHNcclxuICogQGV4dGVuZHMgUGhhc2VyLkdhbWVPYmplY3RzLkNvbXBvbmVudHMuT3JpZ2luXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlBpcGVsaW5lXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlRyYW5zZm9ybVxyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5WaXNpYmxlXHJcbiAqIEBleHRlbmRzIFBoYXNlci5HYW1lT2JqZWN0cy5Db21wb25lbnRzLlNjcm9sbEZhY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gc2NlbmUgLSBUaGUgU2NlbmUgdG8gd2hpY2ggdGhpcyBHYW1lIE9iamVjdCBiZWxvbmdzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfSB0aWxlbWFwIC0gVGhlIFRpbGVtYXAgdGhpcyBsYXllciBpcyBhIHBhcnQgb2YuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gbGF5ZXJJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheWVyLlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW118UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXR8UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXRbXSl9IHRpbGVzZXQgLSBUaGUgdGlsZXNldCwgb3IgYW4gYXJyYXkgb2YgdGlsZXNldHMsIHVzZWQgdG8gcmVuZGVyIHRoaXMgbGF5ZXIuIENhbiBiZSBhIHN0cmluZyBvciBhIFRpbGVzZXQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgd29ybGQgeCBwb3NpdGlvbiB3aGVyZSB0aGUgdG9wIGxlZnQgb2YgdGhpcyBsYXllciB3aWxsIGJlIHBsYWNlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHdvcmxkIHkgcG9zaXRpb24gd2hlcmUgdGhlIHRvcCBsZWZ0IG9mIHRoaXMgbGF5ZXIgd2lsbCBiZSBwbGFjZWQuXHJcbiAqL1xyXG52YXIgU3RhdGljVGlsZW1hcExheWVyID0gbmV3IENsYXNzKHtcclxuXHJcbiAgICBFeHRlbmRzOiBHYW1lT2JqZWN0LFxyXG5cclxuICAgIE1peGluczogW1xyXG4gICAgICAgIENvbXBvbmVudHMuQWxwaGEsXHJcbiAgICAgICAgQ29tcG9uZW50cy5CbGVuZE1vZGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5Db21wdXRlZFNpemUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5EZXB0aCxcclxuICAgICAgICBDb21wb25lbnRzLkZsaXAsXHJcbiAgICAgICAgQ29tcG9uZW50cy5HZXRCb3VuZHMsXHJcbiAgICAgICAgQ29tcG9uZW50cy5PcmlnaW4sXHJcbiAgICAgICAgQ29tcG9uZW50cy5QaXBlbGluZSxcclxuICAgICAgICBDb21wb25lbnRzLlRyYW5zZm9ybSxcclxuICAgICAgICBDb21wb25lbnRzLlZpc2libGUsXHJcbiAgICAgICAgQ29tcG9uZW50cy5TY3JvbGxGYWN0b3IsXHJcbiAgICAgICAgU3RhdGljVGlsZW1hcExheWVyUmVuZGVyXHJcbiAgICBdLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gU3RhdGljVGlsZW1hcExheWVyIChzY2VuZSwgdGlsZW1hcCwgbGF5ZXJJbmRleCwgdGlsZXNldCwgeCwgeSlcclxuICAgIHtcclxuICAgICAgICBHYW1lT2JqZWN0LmNhbGwodGhpcywgc2NlbmUsICdTdGF0aWNUaWxlbWFwTGF5ZXInKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IHBoeXNpY3Mgc3lzdGVtIHRvIHBlcmZvcm0gZmFzdCB0eXBlIGNoZWNrcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjaXNUaWxlbWFwXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1RpbGVtYXAgPSB0cnVlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVGlsZW1hcCB0aGF0IHRoaXMgbGF5ZXIgaXMgYSBwYXJ0IG9mLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciN0aWxlbWFwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5UaWxlbWFwfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZW1hcCA9IHRpbGVtYXA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGUgTGF5ZXJEYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNsYXllckluZGV4XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sYXllckluZGV4ID0gbGF5ZXJJbmRleDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIExheWVyRGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXllci4gTGF5ZXJEYXRhIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBvbmVcclxuICAgICAgICAgKiB0aWxlbWFwIGxheWVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNsYXllclxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMubGF5ZXIgPSB0aWxlbWFwLmxheWVyc1tsYXllckluZGV4XTtcclxuXHJcbiAgICAgICAgLy8gTGluayB0aGUgTGF5ZXJEYXRhIHdpdGggdGhpcyBzdGF0aWMgdGlsZW1hcCBsYXllclxyXG4gICAgICAgIHRoaXMubGF5ZXIudGlsZW1hcExheWVyID0gdGhpcztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFRpbGVzZXQvcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXllci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBcyBvZiBQaGFzZXIgMy4xNCB0aGlzIHByb3BlcnR5IGlzIG5vdyBhbiBhcnJheSBvZiBUaWxlc2V0IG9iamVjdHMsIHByZXZpb3VzbHkgaXQgd2FzIGEgc2luZ2xlIHJlZmVyZW5jZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjdGlsZXNldFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGlsZW1hcHMuVGlsZXNldFtdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGlsZXNldCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIENhbnZhcyByZW5kZXJlci5cclxuICAgICAgICAgKiBUaGlzIGhvbGRzIHRoZSB0aWxlcyB0aGF0IGFyZSB2aXNpYmxlIHdpdGhpbiB0aGUgY2FtZXJhIGluIHRoZSBsYXN0IGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNjdWxsZWRUaWxlc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmN1bGxlZFRpbGVzID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIENhbnZhcyBvbmx5LlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFlvdSBjYW4gY29udHJvbCBpZiB0aGUgQ2FtZXJhcyBzaG91bGQgY3VsbCB0aWxlcyBiZWZvcmUgcmVuZGVyaW5nIHRoZW0gb3Igbm90LlxyXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgdGhlIGNhbWVyYSB3aWxsIHRyeSB0byBjdWxsIHRoZSB0aWxlcyBpbiB0aGlzIGxheWVyLCB0byBhdm9pZCBvdmVyLWRyYXdpbmcgdG8gdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgaW5zdGFuY2VzIHdoZW4geW91IG1heSB3aXNoIHRvIGRpc2FibGUgdGhpcywgYW5kIHRvZ2dsaW5nIHRoaXMgZmxhZyBhbGxvd3NcclxuICAgICAgICAgKiB5b3UgdG8gZG8gc28uIEFsc28gc2VlIGBzZXRTa2lwQ3VsbGAgZm9yIGEgY2hhaW5hYmxlIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHNhbWUgdGhpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3NraXBDdWxsXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc2tpcEN1bGwgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FudmFzIG9ubHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aWxlcyBkcmF3biBieSB0aGUgcmVuZGVyZXIgaW4gdGhlIGxhc3QgZnJhbWUuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhpcyBvbmx5IHdvcmtzIHdoZW4gcmVuZGluZyB3aXRoIENhbnZhcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjdGlsZXNEcmF3blxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjEyLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbGVzRHJhd24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYW52YXMgb25seS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbGVzIGluIHRoaXMgbGF5ZXIuIFVwZGF0ZWQgZXZlcnkgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3RpbGVzVG90YWxcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aWxlc1RvdGFsID0gdGhpcy5sYXllci53aWR0aCAqIHRoaXMubGF5ZXIuaGVpZ2h0O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYW52YXMgb25seS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYW1vdW50IG9mIGV4dHJhIHRpbGVzIHRvIGFkZCBpbnRvIHRoZSBjdWxsIHJlY3RhbmdsZSB3aGVuIGNhbGN1bGF0aW5nIGl0cyBob3Jpem9udGFsIHNpemUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBTZWUgdGhlIG1ldGhvZCBgc2V0Q3VsbFBhZGRpbmdgIGZvciBtb3JlIGRldGFpbHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2N1bGxQYWRkaW5nWFxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdWxsUGFkZGluZ1ggPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYW52YXMgb25seS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBUaGUgYW1vdW50IG9mIGV4dHJhIHRpbGVzIHRvIGFkZCBpbnRvIHRoZSBjdWxsIHJlY3RhbmdsZSB3aGVuIGNhbGN1bGF0aW5nIGl0cyB2ZXJ0aWNhbCBzaXplLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogU2VlIHRoZSBtZXRob2QgYHNldEN1bGxQYWRkaW5nYCBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNjdWxsUGFkZGluZ1lcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY3VsbFBhZGRpbmdZID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2FudmFzIG9ubHkuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSB0aWxlcyBhcmUgY3VsbGVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQnkgZGVmYXVsdCBpdCB3aWxsIGNhbGwgYFRpbGVtYXBDb21wb25lbnRzLkN1bGxUaWxlc2AgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjYWxsIGFueSBmdW5jdGlvbiB5b3UgbGlrZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEl0IHdpbGwgYmUgc2VudCAzIGFyZ3VtZW50czpcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIDEuIFRoZSBQaGFzZXIuVGlsZW1hcHMuTGF5ZXJEYXRhIG9iamVjdCBmb3IgdGhpcyBMYXllclxyXG4gICAgICAgICAqIDIuIFRoZSBDYW1lcmEgdGhhdCBpcyBjdWxsaW5nIHRoZSBsYXllci4gWW91IGNhbiBjaGVjayBpdHMgYGRpcnR5YCBwcm9wZXJ0eSB0byBzZWUgaWYgaXQgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY3VsbC5cclxuICAgICAgICAgKiAzLiBBIHJlZmVyZW5jZSB0byB0aGUgYGN1bGxlZFRpbGVzYCBhcnJheSwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHRpbGVzIHlvdSB3YW50IHJlbmRlcmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogU2VlIHRoZSBgVGlsZW1hcENvbXBvbmVudHMuQ3VsbFRpbGVzYCBzb3VyY2UgY29kZSBmb3IgZGV0YWlscyBvbiBpbXBsZW1lbnRpbmcgeW91ciBvd24gY3VsbGluZyBzeXN0ZW0uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2N1bGxDYWxsYmFja1xyXG4gICAgICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jdWxsQ2FsbGJhY2sgPSBUaWxlbWFwQ29tcG9uZW50cy5DdWxsVGlsZXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3JlbmRlcmVyXHJcbiAgICAgICAgICogQHR5cGUgeyhQaGFzZXIuUmVuZGVyZXIuQ2FudmFzLkNhbnZhc1JlbmRlcmVyfFBoYXNlci5SZW5kZXJlci5XZWJHTC5XZWJHTFJlbmRlcmVyKX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSBzY2VuZS5zeXMuZ2FtZS5yZW5kZXJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgdmVydGV4IGJ1ZmZlciBvYmplY3RzLCB1c2VkIGJ5IHRoZSBXZWJHTCByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBcyBvZiBQaGFzZXIgMy4xNCB0aGlzIHByb3BlcnR5IGlzIG5vdyBhbiBhcnJheSwgd2hlcmUgZWFjaCBlbGVtZW50IG1hcHMgdG8gYSBUaWxlc2V0IGluc3RhbmNlLiBQcmV2aW91c2x5IGl0IHdhcyBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3ZlcnRleEJ1ZmZlclxyXG4gICAgICAgICAqIEB0eXBlIHtXZWJHTEJ1ZmZlcltdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgQXJyYXlCdWZmZXIgb2JqZWN0cywgdXNlZCBieSB0aGUgV2ViR0wgcmVuZGVyZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQXMgb2YgUGhhc2VyIDMuMTQgdGhpcyBwcm9wZXJ0eSBpcyBub3cgYW4gYXJyYXksIHdoZXJlIGVhY2ggZWxlbWVudCBtYXBzIHRvIGEgVGlsZXNldCBpbnN0YW5jZS4gUHJldmlvdXNseSBpdCB3YXMgYSBzaW5nbGUgaW5zdGFuY2UuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNidWZmZXJEYXRhXHJcbiAgICAgICAgICogQHR5cGUge0FycmF5QnVmZmVyW119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmJ1ZmZlckRhdGEgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgRmxvYXQzMiBBcnJheSBvYmplY3RzLCB1c2VkIGJ5IHRoZSBXZWJHTCByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBcyBvZiBQaGFzZXIgMy4xNCB0aGlzIHByb3BlcnR5IGlzIG5vdyBhbiBhcnJheSwgd2hlcmUgZWFjaCBlbGVtZW50IG1hcHMgdG8gYSBUaWxlc2V0IGluc3RhbmNlLiBQcmV2aW91c2x5IGl0IHdhcyBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3ZlcnRleFZpZXdGMzJcclxuICAgICAgICAgKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzIgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVWludDMyIEFycmF5IG9iamVjdHMsIHVzZWQgYnkgdGhlIFdlYkdMIHJlbmRlcmVyLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEFzIG9mIFBoYXNlciAzLjE0IHRoaXMgcHJvcGVydHkgaXMgbm93IGFuIGFycmF5LCB3aGVyZSBlYWNoIGVsZW1lbnQgbWFwcyB0byBhIFRpbGVzZXQgaW5zdGFuY2UuIFByZXZpb3VzbHkgaXQgd2FzIGEgc2luZ2xlIGluc3RhbmNlLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjdmVydGV4Vmlld1UzMlxyXG4gICAgICAgICAqIEB0eXBlIHtVaW50MzJBcnJheVtdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy52ZXJ0ZXhWaWV3VTMyID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGJvb2xlYW5zLCB1c2VkIGJ5IHRoZSBXZWJHTCByZW5kZXJlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBBcyBvZiBQaGFzZXIgMy4xNCB0aGlzIHByb3BlcnR5IGlzIG5vdyBhbiBhcnJheSwgd2hlcmUgZWFjaCBlbGVtZW50IG1hcHMgdG8gYSBUaWxlc2V0IGluc3RhbmNlLiBQcmV2aW91c2x5IGl0IHdhcyBhIHNpbmdsZSBib29sZWFuLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjZGlydHlcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbltdfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBpbnRlZ2VycywgdXNlZCBieSB0aGUgV2ViR0wgcmVuZGVyZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQXMgb2YgUGhhc2VyIDMuMTQgdGhpcyBwcm9wZXJ0eSBpcyBub3cgYW4gYXJyYXksIHdoZXJlIGVhY2ggZWxlbWVudCBtYXBzIHRvIGEgVGlsZXNldCBpbnN0YW5jZS4gUHJldmlvdXNseSBpdCB3YXMgYSBzaW5nbGUgaW50ZWdlci5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3ZlcnRleENvdW50XHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJbXX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudmVydGV4Q291bnQgPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHJlbmRlcmluZyAoZHJhdykgb3JkZXIgb2YgdGhlIHRpbGVzIGluIHRoaXMgbGF5ZXIuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgMCB3aGljaCBpcyAncmlnaHQtZG93bicsIG1lYW5pbmcgaXQgd2lsbCBkcmF3IHRoZSB0aWxlcyBzdGFydGluZyBmcm9tIHRoZSB0b3AtbGVmdCxcclxuICAgICAgICAgKiBkcmF3aW5nIHRvIHRoZSByaWdodCBhbmQgdGhlbiBtb3ZpbmcgZG93biB0byB0aGUgbmV4dCByb3cuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIGRyYXcgb3JkZXJzIGFyZTpcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiAwID0gcmlnaHQtZG93blxyXG4gICAgICAgICAqIDEgPSBsZWZ0LWRvd25cclxuICAgICAgICAgKiAyID0gcmlnaHQtdXBcclxuICAgICAgICAgKiAzID0gbGVmdC11cFxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZSBgc2V0UmVuZGVyT3JkZXJgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjX3JlbmRlck9yZGVyXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3JlbmRlck9yZGVyID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSB0ZW1wb3JhcnkgVHJhbnNmb3JtIE1hdHJpeCwgcmUtdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBiYXRjaGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjX3RlbXBNYXRyaXhcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3RlbXBNYXRyaXggPSBuZXcgVHJhbnNmb3JtTWF0cml4KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgdGlsZSBpbmRleGVzIGFuZCB0aGUgdGlsZXNldCB0aGV5IGJlbG9uZyB0by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjZ2lkTWFwXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5UaWxlbWFwcy5UaWxlc2V0W119XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZ2lkTWFwID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGlsZXNldHModGlsZXNldCk7XHJcbiAgICAgICAgdGhpcy5zZXRBbHBoYSh0aGlzLmxheWVyLmFscGhhKTtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgIHRoaXMuc2V0T3JpZ2luKCk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHRpbGVtYXAudGlsZVdpZHRoICogdGhpcy5sYXllci53aWR0aCwgdGlsZW1hcC50aWxlSGVpZ2h0ICogdGhpcy5sYXllci5oZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVZCT0RhdGEoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0UGlwZWxpbmUoJ1RleHR1cmVUaW50UGlwZWxpbmUnKTtcclxuXHJcbiAgICAgICAgc2NlbmUuc3lzLmdhbWUuZXZlbnRzLm9uKEdhbWVFdmVudHMuQ09OVEVYVF9SRVNUT1JFRCwgZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVkJPRGF0YSgpO1xyXG4gICAgICAgIH0sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFBvcHVsYXRlcyB0aGUgaW50ZXJuYWwgYHRpbGVzZXRgIGFycmF5IHdpdGggdGhlIFRpbGVzZXQgcmVmZXJlbmNlcyB0aGlzIExheWVyIHJlcXVpcmVzIGZvciByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3NldFRpbGVzZXRzXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHNpbmNlIDMuMTQuMFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW118UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXR8UGhhc2VyLlRpbGVtYXBzLlRpbGVzZXRbXSl9IHRpbGVzZXQgLSBUaGUgdGlsZXNldCwgb3IgYW4gYXJyYXkgb2YgdGlsZXNldHMsIHVzZWQgdG8gcmVuZGVyIHRoaXMgbGF5ZXIuIENhbiBiZSBhIHN0cmluZyBvciBhIFRpbGVzZXQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaWxlc2V0czogZnVuY3Rpb24gKHRpbGVzZXRzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBnaWRNYXAgPSBbXTtcclxuICAgICAgICB2YXIgc2V0TGlzdCA9IFtdO1xyXG4gICAgICAgIHZhciBtYXAgPSB0aGlzLnRpbGVtYXA7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aWxlc2V0cykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aWxlc2V0cyA9IFsgdGlsZXNldHMgXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGlsZXNldHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZXNldCA9IHRpbGVzZXRzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWxlc2V0ID09PSAnc3RyaW5nJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGlsZXNldCA9IG1hcC5nZXRUaWxlc2V0KHRpbGVzZXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZXNldClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2V0TGlzdC5wdXNoKHRpbGVzZXQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBzID0gdGlsZXNldC5maXJzdGdpZDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRpbGVzZXQudG90YWw7IHQrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBnaWRNYXBbcyArIHRdID0gdGlsZXNldDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5naWRNYXAgPSBnaWRNYXA7XHJcbiAgICAgICAgdGhpcy50aWxlc2V0ID0gc2V0TGlzdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwYXJlcyB0aGUgVkJPIGRhdGEgYXJyYXlzIGZvciBwb3B1bGF0aW9uIGJ5IHRoZSBgdXBsb2FkYCBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3VwZGF0ZVZCT0RhdGFcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xNC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVkJPRGF0YTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGlsZXNldC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHlbaV0gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleENvdW50W2ldID0gMDtcclxuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckRhdGFbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdVMzJbaV0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBsb2FkIHRoZSB0aWxlIGRhdGEgdG8gYSBWQk8uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3VwbG9hZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byByZW5kZXIgdG8uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVzZXRJbmRleCAtIFRoZSB0aWxlc2V0IGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHVwbG9hZDogZnVuY3Rpb24gKGNhbWVyYSwgdGlsZXNldEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcbiAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuZ2w7XHJcblxyXG4gICAgICAgIHZhciBwaXBlbGluZSA9IHJlbmRlcmVyLnBpcGVsaW5lcy5UZXh0dXJlVGludFBpcGVsaW5lO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kaXJ0eVt0aWxlc2V0SW5kZXhdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbGVzZXQgPSB0aGlzLnRpbGVzZXRbdGlsZXNldEluZGV4XTtcclxuICAgICAgICAgICAgdmFyIG1hcFdpZHRoID0gdGhpcy5sYXllci53aWR0aDtcclxuICAgICAgICAgICAgdmFyIG1hcEhlaWdodCA9IHRoaXMubGF5ZXIuaGVpZ2h0O1xyXG4gICAgICAgICAgICB2YXIgd2lkdGggPSB0aWxlc2V0LmltYWdlLnNvdXJjZVswXS53aWR0aDtcclxuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRpbGVzZXQuaW1hZ2Uuc291cmNlWzBdLmhlaWdodDtcclxuICAgICAgICAgICAgdmFyIG1hcERhdGEgPSB0aGlzLmxheWVyLmRhdGE7XHJcbiAgICAgICAgICAgIHZhciB0aWxlO1xyXG4gICAgICAgICAgICB2YXIgcm93O1xyXG4gICAgICAgICAgICB2YXIgY29sO1xyXG4gICAgICAgICAgICB2YXIgcmVuZGVyT3JkZXIgPSB0aGlzLl9yZW5kZXJPcmRlcjtcclxuICAgICAgICAgICAgdmFyIG1pblRpbGVJbmRleCA9IHRpbGVzZXQuZmlyc3RnaWQ7XHJcbiAgICAgICAgICAgIHZhciBtYXhUaWxlSW5kZXggPSB0aWxlc2V0LmZpcnN0Z2lkICsgdGlsZXNldC50b3RhbDtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgdmVydGV4QnVmZmVyID0gdGhpcy52ZXJ0ZXhCdWZmZXJbdGlsZXNldEluZGV4XTtcclxuICAgICAgICAgICAgdmFyIGJ1ZmZlckRhdGEgPSB0aGlzLmJ1ZmZlckRhdGFbdGlsZXNldEluZGV4XTtcclxuICAgICAgICAgICAgdmFyIHZPZmZzZXQgPSAtMTtcclxuICAgICAgICAgICAgdmFyIGJ1ZmZlclNpemUgPSAobWFwV2lkdGggKiBtYXBIZWlnaHQpICogcGlwZWxpbmUudmVydGV4U2l6ZSAqIDY7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnZlcnRleENvdW50W3RpbGVzZXRJbmRleF0gPSAwO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGlmIChidWZmZXJEYXRhID09PSBudWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBidWZmZXJEYXRhID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlclNpemUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyRGF0YVt0aWxlc2V0SW5kZXhdID0gYnVmZmVyRGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzJbdGlsZXNldEluZGV4XSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdVMzJbdGlsZXNldEluZGV4XSA9IG5ldyBVaW50MzJBcnJheShidWZmZXJEYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGlmIChyZW5kZXJPcmRlciA9PT0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIHJpZ2h0LWRvd25cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgbWFwSGVpZ2h0OyByb3crKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG1hcFdpZHRoOyBjb2wrKylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUgPSBtYXBEYXRhW3Jvd11bY29sXTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHRpbGUuaW5kZXggPCBtaW5UaWxlSW5kZXggfHwgdGlsZS5pbmRleCA+IG1heFRpbGVJbmRleCB8fCAhdGlsZS52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZPZmZzZXQgPSB0aGlzLmJhdGNoVGlsZSh2T2Zmc2V0LCB0aWxlLCB0aWxlc2V0LCB3aWR0aCwgaGVpZ2h0LCBjYW1lcmEsIHRpbGVzZXRJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlbmRlck9yZGVyID09PSAxKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgbGVmdC1kb3duXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG1hcEhlaWdodDsgcm93KyspXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb2wgPSBtYXBXaWR0aCAtIDE7IGNvbCA+PSAwOyBjb2wtLSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUgPSBtYXBEYXRhW3Jvd11bY29sXTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHRpbGUuaW5kZXggPCBtaW5UaWxlSW5kZXggfHwgdGlsZS5pbmRleCA+IG1heFRpbGVJbmRleCB8fCAhdGlsZS52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZPZmZzZXQgPSB0aGlzLmJhdGNoVGlsZSh2T2Zmc2V0LCB0aWxlLCB0aWxlc2V0LCB3aWR0aCwgaGVpZ2h0LCBjYW1lcmEsIHRpbGVzZXRJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJlbmRlck9yZGVyID09PSAyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgcmlnaHQtdXBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGZvciAocm93ID0gbWFwSGVpZ2h0IC0gMTsgcm93ID49IDA7IHJvdy0tKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbWFwV2lkdGg7IGNvbCsrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZSA9IG1hcERhdGFbcm93XVtjb2xdO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdGlsZS5pbmRleCA8IG1pblRpbGVJbmRleCB8fCB0aWxlLmluZGV4ID4gbWF4VGlsZUluZGV4IHx8ICF0aWxlLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdk9mZnNldCA9IHRoaXMuYmF0Y2hUaWxlKHZPZmZzZXQsIHRpbGUsIHRpbGVzZXQsIHdpZHRoLCBoZWlnaHQsIGNhbWVyYSwgdGlsZXNldEluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmVuZGVyT3JkZXIgPT09IDMpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBsZWZ0LXVwXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBmb3IgKHJvdyA9IG1hcEhlaWdodCAtIDE7IHJvdyA+PSAwOyByb3ctLSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IG1hcFdpZHRoIC0gMTsgY29sID49IDA7IGNvbC0tKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZSA9IG1hcERhdGFbcm93XVtjb2xdO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdGlsZS5pbmRleCA8IG1pblRpbGVJbmRleCB8fCB0aWxlLmluZGV4ID4gbWF4VGlsZUluZGV4IHx8ICF0aWxlLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdk9mZnNldCA9IHRoaXMuYmF0Y2hUaWxlKHZPZmZzZXQsIHRpbGUsIHRpbGVzZXQsIHdpZHRoLCBoZWlnaHQsIGNhbWVyYSwgdGlsZXNldEluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5kaXJ0eVt0aWxlc2V0SW5kZXhdID0gZmFsc2U7XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKHZlcnRleEJ1ZmZlciA9PT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmVydGV4QnVmZmVyID0gcmVuZGVyZXIuY3JlYXRlVmVydGV4QnVmZmVyKGJ1ZmZlckRhdGEsIGdsLlNUQVRJQ19EUkFXKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXJbdGlsZXNldEluZGV4XSA9IHZlcnRleEJ1ZmZlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFZlcnRleEJ1ZmZlcih2ZXJ0ZXhCdWZmZXIpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgYnVmZmVyRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIHNpbmdsZSB0aWxlIGludG8gdGhlIGJhdGNoLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNiYXRjaFRpbGVcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB2T2Zmc2V0IC0gVGhlIHZlcnRleCBvZmZzZXQuXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdGlsZSAtIFRoZSB0aWxlIGJlaW5nIHJlbmRlcmVkLlxyXG4gICAgICogQHBhcmFtIHthbnl9IHRpbGVzZXQgLSBUaGUgdGlsZXNldCBiZWluZyB1c2VkIGZvciByZW5kZXJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0aWxlc2V0IGltYWdlIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGlsZXNldCBpbWFnZSBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBsYXllciBpcyBiZWluZyByZW5kZXJlZCB3aXRoLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlc2V0SW5kZXggLSBUaGUgdGlsZXNldCBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtpbnRlZ2VyfSBUaGUgbmV3IHZPZmZzZXQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGJhdGNoVGlsZTogZnVuY3Rpb24gKHZPZmZzZXQsIHRpbGUsIHRpbGVzZXQsIHdpZHRoLCBoZWlnaHQsIGNhbWVyYSwgdGlsZXNldEluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ZXhDb29yZHMgPSB0aWxlc2V0LmdldFRpbGVUZXh0dXJlQ29vcmRpbmF0ZXModGlsZS5pbmRleCk7XHJcblxyXG4gICAgICAgIGlmICghdGV4Q29vcmRzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdGlsZVdpZHRoID0gdGlsZXNldC50aWxlV2lkdGg7XHJcbiAgICAgICAgdmFyIHRpbGVIZWlnaHQgPSB0aWxlc2V0LnRpbGVIZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBoYWxmVGlsZVdpZHRoID0gdGlsZVdpZHRoIC8gMjtcclxuICAgICAgICB2YXIgaGFsZlRpbGVIZWlnaHQgPSB0aWxlSGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgdmFyIHUwID0gdGV4Q29vcmRzLnggLyB3aWR0aDtcclxuICAgICAgICB2YXIgdjAgPSB0ZXhDb29yZHMueSAvIGhlaWdodDtcclxuICAgICAgICB2YXIgdTEgPSAodGV4Q29vcmRzLnggKyB0aWxlV2lkdGgpIC8gd2lkdGg7XHJcbiAgICAgICAgdmFyIHYxID0gKHRleENvb3Jkcy55ICsgdGlsZUhlaWdodCkgLyBoZWlnaHQ7XHJcblxyXG4gICAgICAgIHZhciBtYXRyaXggPSB0aGlzLl90ZW1wTWF0cml4O1xyXG5cclxuICAgICAgICB2YXIgeCA9IC1oYWxmVGlsZVdpZHRoO1xyXG4gICAgICAgIHZhciB5ID0gLWhhbGZUaWxlSGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAodGlsZS5mbGlwWClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpbGVXaWR0aCAqPSAtMTtcclxuICAgICAgICAgICAgeCArPSB0aWxlc2V0LnRpbGVXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aWxlLmZsaXBZKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGlsZUhlaWdodCAqPSAtMTtcclxuICAgICAgICAgICAgeSArPSB0aWxlc2V0LnRpbGVIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgeHcgPSB4ICsgdGlsZVdpZHRoO1xyXG4gICAgICAgIHZhciB5aCA9IHkgKyB0aWxlSGVpZ2h0O1xyXG5cclxuICAgICAgICBtYXRyaXguYXBwbHlJVFJTKGhhbGZUaWxlV2lkdGggKyB0aWxlLnBpeGVsWCwgaGFsZlRpbGVIZWlnaHQgKyB0aWxlLnBpeGVsWSwgdGlsZS5yb3RhdGlvbiwgMSwgMSk7XHJcblxyXG4gICAgICAgIHZhciB0aW50ID0gVXRpbHMuZ2V0VGludEFwcGVuZEZsb2F0QWxwaGEoMHhmZmZmZmYsIGNhbWVyYS5hbHBoYSAqIHRoaXMuYWxwaGEgKiB0aWxlLmFscGhhKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MCA9IG1hdHJpeC5nZXRYKHgsIHkpO1xyXG4gICAgICAgIHZhciB0eTAgPSBtYXRyaXguZ2V0WSh4LCB5KTtcclxuXHJcbiAgICAgICAgdmFyIHR4MSA9IG1hdHJpeC5nZXRYKHgsIHloKTtcclxuICAgICAgICB2YXIgdHkxID0gbWF0cml4LmdldFkoeCwgeWgpO1xyXG5cclxuICAgICAgICB2YXIgdHgyID0gbWF0cml4LmdldFgoeHcsIHloKTtcclxuICAgICAgICB2YXIgdHkyID0gbWF0cml4LmdldFkoeHcsIHloKTtcclxuXHJcbiAgICAgICAgdmFyIHR4MyA9IG1hdHJpeC5nZXRYKHh3LCB5KTtcclxuICAgICAgICB2YXIgdHkzID0gbWF0cml4LmdldFkoeHcsIHkpO1xyXG5cclxuICAgICAgICBpZiAoY2FtZXJhLnJvdW5kUGl4ZWxzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHgwID0gTWF0aC5yb3VuZCh0eDApO1xyXG4gICAgICAgICAgICB0eTAgPSBNYXRoLnJvdW5kKHR5MCk7XHJcblxyXG4gICAgICAgICAgICB0eDEgPSBNYXRoLnJvdW5kKHR4MSk7XHJcbiAgICAgICAgICAgIHR5MSA9IE1hdGgucm91bmQodHkxKTtcclxuXHJcbiAgICAgICAgICAgIHR4MiA9IE1hdGgucm91bmQodHgyKTtcclxuICAgICAgICAgICAgdHkyID0gTWF0aC5yb3VuZCh0eTIpO1xyXG5cclxuICAgICAgICAgICAgdHgzID0gTWF0aC5yb3VuZCh0eDMpO1xyXG4gICAgICAgICAgICB0eTMgPSBNYXRoLnJvdW5kKHR5Myk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmVydGV4Vmlld0YzMiA9IHRoaXMudmVydGV4Vmlld0YzMlt0aWxlc2V0SW5kZXhdO1xyXG4gICAgICAgIHZhciB2ZXJ0ZXhWaWV3VTMyID0gdGhpcy52ZXJ0ZXhWaWV3VTMyW3RpbGVzZXRJbmRleF07XHJcblxyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHR4MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB0eTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdjA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gMDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3VTMyWysrdk9mZnNldF0gPSB0aW50O1xyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB0eDE7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdHkxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHUwO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHYxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IDA7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZPZmZzZXRdID0gdGludDtcclxuXHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdHgyO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHR5MjtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB1MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB2MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSAwO1xyXG4gICAgICAgIHZlcnRleFZpZXdVMzJbKyt2T2Zmc2V0XSA9IHRpbnQ7XHJcblxyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHR4MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB0eTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdTA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdjA7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gMDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3VTMyWysrdk9mZnNldF0gPSB0aW50O1xyXG5cclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB0eDI7XHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdHkyO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHUxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHYxO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IDA7XHJcbiAgICAgICAgdmVydGV4Vmlld1UzMlsrK3ZPZmZzZXRdID0gdGludDtcclxuXHJcbiAgICAgICAgdmVydGV4Vmlld0YzMlsrK3ZPZmZzZXRdID0gdHgzO1xyXG4gICAgICAgIHZlcnRleFZpZXdGMzJbKyt2T2Zmc2V0XSA9IHR5MztcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB1MTtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSB2MDtcclxuICAgICAgICB2ZXJ0ZXhWaWV3RjMyWysrdk9mZnNldF0gPSAwO1xyXG4gICAgICAgIHZlcnRleFZpZXdVMzJbKyt2T2Zmc2V0XSA9IHRpbnQ7XHJcblxyXG4gICAgICAgIHRoaXMudmVydGV4Q291bnRbdGlsZXNldEluZGV4XSArPSA2O1xyXG5cclxuICAgICAgICByZXR1cm4gdk9mZnNldDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZW5kZXJpbmcgKGRyYXcpIG9yZGVyIG9mIHRoZSB0aWxlcyBpbiB0aGlzIGxheWVyLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAncmlnaHQtZG93bicsIG1lYW5pbmcgaXQgd2lsbCBvcmRlciB0aGUgdGlsZXMgc3RhcnRpbmcgZnJvbSB0aGUgdG9wLWxlZnQsXHJcbiAgICAgKiBkcmF3aW5nIHRvIHRoZSByaWdodCBhbmQgdGhlbiBtb3ZpbmcgZG93biB0byB0aGUgbmV4dCByb3cuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBkcmF3IG9yZGVycyBhcmU6XHJcbiAgICAgKiBcclxuICAgICAqIDAgPSByaWdodC1kb3duXHJcbiAgICAgKiAxID0gbGVmdC1kb3duXHJcbiAgICAgKiAyID0gcmlnaHQtdXBcclxuICAgICAqIDMgPSBsZWZ0LXVwXHJcbiAgICAgKiBcclxuICAgICAqIFNldHRpbmcgdGhlIHJlbmRlciBvcmRlciBkb2VzIG5vdCBjaGFuZ2UgdGhlIHRpbGVzIG9yIGhvdyB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIGxheWVyLFxyXG4gICAgICogaXQgcHVyZWx5IGltcGFjdHMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJlbmRlcmVkLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIHByb3ZpZGUgZWl0aGVyIGFuIGludGVnZXIgKDAgdG8gMyksIG9yIHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgb3JkZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3NldFJlbmRlck9yZGVyXHJcbiAgICAgKiBAc2luY2UgMy4xMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxzdHJpbmcpfSByZW5kZXJPcmRlciAtIFRoZSByZW5kZXIgKGRyYXcpIG9yZGVyIHZhbHVlLiBFaXRoZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDMsIG9yIGEgc3RyaW5nOiAncmlnaHQtZG93bicsICdsZWZ0LWRvd24nLCAncmlnaHQtdXAnIG9yICdsZWZ0LXVwJy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRSZW5kZXJPcmRlcjogZnVuY3Rpb24gKHJlbmRlck9yZGVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvcmRlcnMgPSBbICdyaWdodC1kb3duJywgJ2xlZnQtZG93bicsICdyaWdodC11cCcsICdsZWZ0LXVwJyBdO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHJlbmRlck9yZGVyID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlbmRlck9yZGVyID0gb3JkZXJzLmluZGV4T2YocmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbmRlck9yZGVyID49IDAgJiYgcmVuZGVyT3JkZXIgPCA0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT3JkZXIgPSByZW5kZXJPcmRlcjtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aWxlc2V0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5W2ldID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBpbnRlcmVzdGluZyBmYWNlcyBhdCB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlcyBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLiBJbnRlcmVzdGluZ1xyXG4gICAgICogZmFjZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3Igb3B0aW1pemluZyBjb2xsaXNpb25zIGFnYWluc3QgdGlsZXMuIFRoaXMgbWV0aG9kIGlzIG1vc3RseSB1c2VkXHJcbiAgICAgKiBpbnRlcm5hbGx5IHRvIG9wdGltaXplIHJlY2FsY3VsYXRpbmcgZmFjZXMgd2hlbiBvbmx5IG9uZSB0aWxlIGhhcyBiZWVuIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2NhbGN1bGF0ZUZhY2VzQXRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVggLSBUaGUgeCBjb29yZGluYXRlLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSB5IGNvb3JkaW5hdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlRmFjZXNBdDogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSlcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5DYWxjdWxhdGVGYWNlc0F0KHRpbGVYLCB0aWxlWSwgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgaW50ZXJlc3RpbmcgZmFjZXMgd2l0aGluIHRoZSByZWN0YW5ndWxhciBhcmVhIHNwZWNpZmllZCAoaW4gdGlsZSBjb29yZGluYXRlcykgb2YgdGhlXHJcbiAgICAgKiBsYXllci4gSW50ZXJlc3RpbmcgZmFjZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3Igb3B0aW1pemluZyBjb2xsaXNpb25zIGFnYWluc3QgdGlsZXMuIFRoaXMgbWV0aG9kXHJcbiAgICAgKiBpcyBtb3N0bHkgdXNlZCBpbnRlcm5hbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNjYWxjdWxhdGVGYWNlc1dpdGhpblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVg9MF0gLSBUaGUgbGVmdCBtb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbdGlsZVk9MF0gLSBUaGUgdG9wIG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVGYWNlc1dpdGhpbjogZnVuY3Rpb24gKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodClcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5DYWxjdWxhdGVGYWNlc1dpdGhpbih0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgU3ByaXRlIGZvciBldmVyeSBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIHRpbGUgaW5kZXhlcyBpbiB0aGUgbGF5ZXIuIFlvdSBjYW5cclxuICAgICAqIG9wdGlvbmFsbHkgc3BlY2lmeSBpZiBlYWNoIHRpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgbmV3IHRpbGUgYWZ0ZXIgdGhlIFNwcml0ZSBoYXMgYmVlblxyXG4gICAgICogY3JlYXRlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gbGF5IGRvd24gc3BlY2lhbCB0aWxlcyBpbiBhIGxldmVsIHRoYXQgYXJlIGNvbnZlcnRlZCB0b1xyXG4gICAgICogU3ByaXRlcywgYnV0IHdhbnQgdG8gcmVwbGFjZSB0aGUgdGlsZSBpdHNlbGYgd2l0aCBhIGZsb29yIHRpbGUgb3Igc2ltaWxhciBvbmNlIGNvbnZlcnRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjY3JlYXRlRnJvbVRpbGVzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gaW5kZXhlcyAtIFRoZSB0aWxlIGluZGV4LCBvciBhcnJheSBvZiBpbmRleGVzLCB0byBjcmVhdGUgU3ByaXRlcyBmcm9tLlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IHJlcGxhY2VtZW50cyAtIFRoZSB0aWxlIGluZGV4LCBvciBhcnJheSBvZiBpbmRleGVzLCB0byBjaGFuZ2UgYSBjb252ZXJ0ZWRcclxuICAgICAqIHRpbGUgdG8uIFNldCB0byBgbnVsbGAgdG8gbGVhdmUgdGhlIHRpbGVzIHVuY2hhbmdlZC4gSWYgYW4gYXJyYXkgaXMgZ2l2ZW4sIGl0IGlzIGFzc3VtZWQgdG8gYmUgYVxyXG4gICAgICogb25lLXRvLW9uZSBtYXBwaW5nIHdpdGggdGhlIGluZGV4ZXMgYXJyYXkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5HYW1lT2JqZWN0cy5TcHJpdGUuU3ByaXRlQ29uZmlnfSBzcHJpdGVDb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBwYXNzIGludG8gdGhlIFNwcml0ZSBjcmVhdG9yIChpLmUuXHJcbiAgICAgKiBzY2VuZS5tYWtlLnNwcml0ZSkuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5TY2VuZX0gW3NjZW5lPXNjZW5lIHRoZSBtYXAgaXMgd2l0aGluXSAtIFRoZSBTY2VuZSB0byBjcmVhdGUgdGhlIFNwcml0ZXMgd2l0aGluLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHRoZSB3b3JsZCBYWVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5HYW1lT2JqZWN0cy5TcHJpdGVbXX0gQW4gYXJyYXkgb2YgdGhlIFNwcml0ZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUZyb21UaWxlczogZnVuY3Rpb24gKGluZGV4ZXMsIHJlcGxhY2VtZW50cywgc3ByaXRlQ29uZmlnLCBzY2VuZSwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5DcmVhdGVGcm9tVGlsZXMoaW5kZXhlcywgcmVwbGFjZW1lbnRzLCBzcHJpdGVDb25maWcsIHNjZW5lLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiBsYXllciB0aGF0IGFyZSB3aXRoaW4gdGhlIGNhbWVyYXMgdmlld3BvcnQuXHJcbiAgICAgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjY3VsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHJ1biB0aGUgY3VsbCBjaGVjayBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgY3VsbDogZnVuY3Rpb24gKGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdWxsQ2FsbGJhY2sodGhpcy5sYXllciwgY2FtZXJhLCB0aGlzLmN1bGxlZFRpbGVzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYW52YXMgb25seS5cclxuICAgICAqIFxyXG4gICAgICogWW91IGNhbiBjb250cm9sIGlmIHRoZSBDYW1lcmFzIHNob3VsZCBjdWxsIHRpbGVzIGJlZm9yZSByZW5kZXJpbmcgdGhlbSBvciBub3QuXHJcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBjYW1lcmEgd2lsbCB0cnkgdG8gY3VsbCB0aGUgdGlsZXMgaW4gdGhpcyBsYXllciwgdG8gYXZvaWQgb3Zlci1kcmF3aW5nIHRvIHRoZSByZW5kZXJlci5cclxuICAgICAqXHJcbiAgICAgKiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBpbnN0YW5jZXMgd2hlbiB5b3UgbWF5IHdpc2ggdG8gZGlzYWJsZSB0aGlzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRTa2lwQ3VsbFxyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlPXRydWVdIC0gU2V0IHRvIGB0cnVlYCB0byBzdG9wIGN1bGxpbmcgdGlsZXMuIFNldCB0byBgZmFsc2VgIHRvIGVuYWJsZSBjdWxsaW5nIGFnYWluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNraXBDdWxsOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSB0cnVlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuc2tpcEN1bGwgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FudmFzIG9ubHkuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gYSBDYW1lcmEgY3VsbHMgdGhlIHRpbGVzIGluIHRoaXMgbGF5ZXIgaXQgZG9lcyBzbyB1c2luZyBpdHMgdmlldyBpbnRvIHRoZSB3b3JsZCwgYnVpbGRpbmcgdXAgYVxyXG4gICAgICogcmVjdGFuZ2xlIGluc2lkZSB3aGljaCB0aGUgdGlsZXMgbXVzdCBleGlzdCBvciB0aGV5IHdpbGwgYmUgY3VsbGVkLiBTb21ldGltZXMgeW91IG1heSBuZWVkIHRvIGV4cGFuZCB0aGUgc2l6ZVxyXG4gICAgICogb2YgdGhpcyAnY3VsbCByZWN0YW5nbGUnLCBlc3BlY2lhbGx5IGlmIHlvdSBwbGFuIG9uIHJvdGF0aW5nIHRoZSBDYW1lcmEgdmlld2luZyB0aGUgbGF5ZXIuIERvIHNvXHJcbiAgICAgKiBieSBwcm92aWRpbmcgdGhlIHBhZGRpbmcgdmFsdWVzLiBUaGUgdmFsdWVzIGdpdmVuIGFyZSBpbiB0aWxlcywgbm90IHBpeGVscy4gU28gaWYgdGhlIHRpbGUgd2lkdGggd2FzIDMycHhcclxuICAgICAqIGFuZCB5b3Ugc2V0IGBwYWRkaW5nWGAgdG8gYmUgNCwgaXQgd291bGQgYWRkIDMycHggeCA0IHRvIHRoZSBjdWxsIHJlY3RhbmdsZSAoYWRqdXN0ZWQgZm9yIHNjYWxlKVxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRDdWxsUGFkZGluZ1xyXG4gICAgICogQHNpbmNlIDMuMTIuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3BhZGRpbmdYPTFdIC0gVGhlIGFtb3VudCBvZiBleHRyYSBob3Jpem9udGFsIHRpbGVzIHRvIGFkZCB0byB0aGUgY3VsbCBjaGVjayBwYWRkaW5nLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbcGFkZGluZ1k9MV0gLSBUaGUgYW1vdW50IG9mIGV4dHJhIHZlcnRpY2FsIHRpbGVzIHRvIGFkZCB0byB0aGUgY3VsbCBjaGVjayBwYWRkaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEN1bGxQYWRkaW5nOiBmdW5jdGlvbiAocGFkZGluZ1gsIHBhZGRpbmdZKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChwYWRkaW5nWCA9PT0gdW5kZWZpbmVkKSB7IHBhZGRpbmdYID0gMTsgfVxyXG4gICAgICAgIGlmIChwYWRkaW5nWSA9PT0gdW5kZWZpbmVkKSB7IHBhZGRpbmdZID0gMTsgfVxyXG5cclxuICAgICAgICB0aGlzLmN1bGxQYWRkaW5nWCA9IHBhZGRpbmdYO1xyXG4gICAgICAgIHRoaXMuY3VsbFBhZGRpbmdZID0gcGFkZGluZ1k7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlYXJjaGVzIHRoZSBlbnRpcmUgbWFwIGxheWVyIGZvciB0aGUgZmlyc3QgdGlsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gaW5kZXgsIHRoZW4gcmV0dXJucyB0aGF0IFRpbGVcclxuICAgICAqIG9iamVjdC4gSWYgbm8gbWF0Y2ggaXMgZm91bmQsIGl0IHJldHVybnMgbnVsbC4gVGhlIHNlYXJjaCBzdGFydHMgZnJvbSB0aGUgdG9wLWxlZnQgdGlsZSBhbmRcclxuICAgICAqIGNvbnRpbnVlcyBob3Jpem9udGFsbHkgdW50aWwgaXQgaGl0cyB0aGUgZW5kIG9mIHRoZSByb3csIHRoZW4gaXQgZHJvcHMgZG93biB0byB0aGUgbmV4dCBjb2x1bW4uXHJcbiAgICAgKiBJZiB0aGUgcmV2ZXJzZSBib29sZWFuIGlzIHRydWUsIGl0IHNjYW5zIHN0YXJ0aW5nIGZyb20gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgdHJhdmVsaW5nIHVwIHRvXHJcbiAgICAgKiB0aGUgdG9wLWxlZnQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2ZpbmRCeUluZGV4XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIHRpbGUgaW5kZXggdmFsdWUgdG8gc2VhcmNoIGZvci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3NraXA9MF0gLSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNraXAgYSBtYXRjaGluZyB0aWxlIGJlZm9yZSByZXR1cm5pbmcuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXZlcnNlPWZhbHNlXSAtIElmIHRydWUgaXQgd2lsbCBzY2FuIHRoZSBsYXllciBpbiByZXZlcnNlLCBzdGFydGluZyBhdCB0aGVcclxuICAgICAqIGJvdHRvbS1yaWdodC4gT3RoZXJ3aXNlIGl0IHNjYW5zIGZyb20gdGhlIHRvcC1sZWZ0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlfSBBIFRpbGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmaW5kQnlJbmRleDogZnVuY3Rpb24gKGZpbmRJbmRleCwgc2tpcCwgcmV2ZXJzZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuRmluZEJ5SW5kZXgoZmluZEluZGV4LCBza2lwLCByZXZlcnNlLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHRoZSBmaXJzdCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIgdGhhdFxyXG4gICAgICogc2F0aXNmaWVzIHRoZSBwcm92aWRlZCB0ZXN0aW5nIGZ1bmN0aW9uLiBJLmUuIGZpbmRzIHRoZSBmaXJzdCB0aWxlIGZvciB3aGljaCBgY2FsbGJhY2tgIHJldHVybnNcclxuICAgICAqIHRydWUuIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLmZpbmQgaW4gdmFuaWxsYSBKUy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjZmluZFRpbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLiBFYWNoIHRpbGUgaW4gdGhlIGdpdmVuIGFyZWEgd2lsbCBiZSBwYXNzZWQgdG8gdGhpc1xyXG4gICAgICogY2FsbGJhY2sgYXMgdGhlIGZpcnN0IGFuZCBvbmx5IHBhcmFtZXRlci5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIHJ1bi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVYPTBdIC0gVGhlIGxlZnQgbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBmaWx0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3Btb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gez9QaGFzZXIuVGlsZW1hcHMuVGlsZX1cclxuICAgICAqL1xyXG4gICAgZmluZFRpbGU6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5GaW5kVGlsZShjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIsIHJ1biB0aGUgZ2l2ZW5cclxuICAgICAqIGZpbHRlciBjYWxsYmFjayBmdW5jdGlvbi4gQW55IHRpbGVzIHRoYXQgcGFzcyB0aGUgZmlsdGVyIHRlc3QgKGkuZS4gd2hlcmUgdGhlIGNhbGxiYWNrIHJldHVybnNcclxuICAgICAqIHRydWUpIHdpbGwgcmV0dXJuZWQgYXMgYSBuZXcgYXJyYXkuIFNpbWlsYXIgdG8gQXJyYXkucHJvdG90eXBlLkZpbHRlciBpbiB2YW5pbGxhIEpTLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNmaWx0ZXJUaWxlc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suIEVhY2ggdGlsZSBpbiB0aGUgZ2l2ZW4gYXJlYSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzXHJcbiAgICAgKiBjYWxsYmFjayBhcyB0aGUgZmlyc3QgYW5kIG9ubHkgcGFyYW1ldGVyLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiB0cnVlIGZvciB0aWxlcyB0aGF0IHBhc3MgdGhlXHJcbiAgICAgKiBmaWx0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0bW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBmaWx0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3Btb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgZmlsdGVyVGlsZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5GaWx0ZXJUaWxlcyhjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgZWFjaCB0aWxlIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIsIHJ1biB0aGUgZ2l2ZW5cclxuICAgICAqIGNhbGxiYWNrLiBTaW1pbGFyIHRvIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIGluIHZhbmlsbGEgSlMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2ZvckVhY2hUaWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay4gRWFjaCB0aWxlIGluIHRoZSBnaXZlbiBhcmVhIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXNcclxuICAgICAqIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBhbmQgb25seSBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gVGhlIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBydW4uXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0bW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYSB0byBmaWx0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWT0wXSAtIFRoZSB0b3Btb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3dpZHRoPW1heCB3aWR0aCBiYXNlZCBvbiB0aWxlWF0gLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW2hlaWdodD1tYXggaGVpZ2h0IGJhc2VkIG9uIHRpbGVZXSAtIEhvdyBtYW55IHRpbGVzIHRhbGwgZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGZvckVhY2hUaWxlOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGNvbnRleHQsIHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5Gb3JFYWNoVGlsZShjYWxsYmFjaywgY29udGV4dCwgdGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zLCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIHRpbGUgYXQgdGhlIGdpdmVuIHRpbGUgY29vcmRpbmF0ZXMgZnJvbSB0aGUgZ2l2ZW4gbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2dldFRpbGVBdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFggcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHRpbGUgdW5pdHMsIG5vdCBwaXhlbHMpLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFkgcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gKGdpdmVuIGluIHRpbGUgdW5pdHMsIG5vdCBwaXhlbHMpLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9uTnVsbD1mYWxzZV0gLSBJZiB0cnVlIGdldFRpbGUgd29uJ3QgcmV0dXJuIG51bGwgZm9yIGVtcHR5IHRpbGVzLCBidXQgYSBUaWxlXHJcbiAgICAgKiBvYmplY3Qgd2l0aCBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gVGhlIHRpbGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIG9yIG51bGwgaWYgbm8gdGlsZSB3YXMgZm91bmQgb3IgdGhlIGNvb3JkaW5hdGVzIHdlcmUgaW52YWxpZC5cclxuICAgICAqL1xyXG4gICAgZ2V0VGlsZUF0OiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCBub25OdWxsKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlQXQodGlsZVgsIHRpbGVZLCBub25OdWxsLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gd29ybGQgY29vcmRpbmF0ZXMgZnJvbSB0aGUgZ2l2ZW4gbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2dldFRpbGVBdFdvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBYIHBvc2l0aW9uIHRvIGdldCB0aGUgdGlsZSBmcm9tIChnaXZlbiBpbiBwaXhlbHMpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gWSBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSAoZ2l2ZW4gaW4gcGl4ZWxzKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbm9uTnVsbD1mYWxzZV0gLSBJZiB0cnVlLCBmdW5jdGlvbiB3b24ndCByZXR1cm4gbnVsbCBmb3IgZW1wdHkgdGlsZXMsIGJ1dCBhIFRpbGVcclxuICAgICAqIG9iamVjdCB3aXRoIGFuIGluZGV4IG9mIC0xLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB0aWxlIGluZGV4IGZyb20gdGhlIHdvcmxkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZX0gVGhlIHRpbGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIG9yIG51bGwgaWYgbm8gdGlsZSB3YXMgZm91bmQgb3IgdGhlIGNvb3JkaW5hdGVzXHJcbiAgICAgKiB3ZXJlIGludmFsaWQuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVBdFdvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgbm9uTnVsbCwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlQXRXb3JsZFhZKHdvcmxkWCwgd29ybGRZLCBub25OdWxsLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB0aWxlIGNvb3JkaW5hdGVzKSBvZiB0aGUgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2dldFRpbGVzV2l0aGluXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt0aWxlWD0wXSAtIFRoZSBsZWZ0bW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gW3RpbGVZPTBdIC0gVGhlIHRvcG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFt3aWR0aD1tYXggd2lkdGggYmFzZWQgb24gdGlsZVhdIC0gSG93IG1hbnkgdGlsZXMgd2lkZSBmcm9tIHRoZSBgdGlsZVhgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtoZWlnaHQ9bWF4IGhlaWdodCBiYXNlZCBvbiB0aWxlWV0gLSBIb3cgbWFueSB0aWxlcyB0YWxsIGZyb20gdGhlIGB0aWxlWWAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlRpbGVtYXBzLkZpbHRlcmluZ09wdGlvbnN9IFtmaWx0ZXJpbmdPcHRpb25zXSAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgd2hlbiBnZXR0aW5nIHRoZSB0aWxlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuVGlsZVtdfSBBbiBhcnJheSBvZiBUaWxlIG9iamVjdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbGVzV2l0aGluOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBmaWx0ZXJpbmdPcHRpb25zKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpbih0aWxlWCwgdGlsZVksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpbGVzIGluIHRoZSBnaXZlbiByZWN0YW5ndWxhciBhcmVhIChpbiB3b3JsZCBjb29yZGluYXRlcykgb2YgdGhlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNnZXRUaWxlc1dpdGhpbldvcmxkWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgbGVmdG1vc3QgdGlsZSBpbmRleCAoaW4gdGlsZSBjb29yZGluYXRlcykgdG8gdXNlIGFzIHRoZSBvcmlnaW4gb2YgdGhlIGFyZWEgdG8gZmlsdGVyLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdvcmxkWSAtIFRoZSB0b3Btb3N0IHRpbGUgaW5kZXggKGluIHRpbGUgY29vcmRpbmF0ZXMpIHRvIHVzZSBhcyB0aGUgb3JpZ2luIG9mIHRoZSBhcmVhIHRvIGZpbHRlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIEhvdyBtYW55IHRpbGVzIHdpZGUgZnJvbSB0aGUgYHRpbGVYYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIEhvdyBtYW55IHRpbGVzIGhpZ2ggZnJvbSB0aGUgYHRpbGVZYCBpbmRleCB0aGUgYXJlYSB3aWxsIGJlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuRmlsdGVyaW5nT3B0aW9uc30gW2ZpbHRlcmluZ09wdGlvbnNdIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSB3aGVuIGdldHRpbmcgdGhlIHRpbGVzLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGZhY3RvcmluZyBpbiB3aGljaCB0aWxlcyB0byByZXR1cm4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlRpbGVbXX0gQW4gYXJyYXkgb2YgVGlsZSBvYmplY3RzLlxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlc1dpdGhpbldvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyaW5nT3B0aW9ucywgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5HZXRUaWxlc1dpdGhpbldvcmxkWFkod29ybGRYLCB3b3JsZFksIHdpZHRoLCBoZWlnaHQsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdGlsZXMgdGhhdCBvdmVybGFwIHdpdGggdGhlIGdpdmVuIHNoYXBlIGluIHRoZSBnaXZlbiBsYXllci4gVGhlIHNoYXBlIG11c3QgYmUgYSBDaXJjbGUsXHJcbiAgICAgKiBMaW5lLCBSZWN0YW5nbGUgb3IgVHJpYW5nbGUuIFRoZSBzaGFwZSBzaG91bGQgYmUgaW4gd29ybGQgY29vcmRpbmF0ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI2dldFRpbGVzV2l0aGluU2hhcGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5HZW9tLkNpcmNsZXxQaGFzZXIuR2VvbS5MaW5lfFBoYXNlci5HZW9tLlJlY3RhbmdsZXxQaGFzZXIuR2VvbS5UcmlhbmdsZSl9IHNoYXBlIC0gQSBzaGFwZSBpbiB3b3JsZCAocGl4ZWwpIGNvb3JkaW5hdGVzXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaWxlbWFwcy5GaWx0ZXJpbmdPcHRpb25zfSBbZmlsdGVyaW5nT3B0aW9uc10gLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IHdoZW4gZ2V0dGluZyB0aGUgdGlsZXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5UaWxlW119IEFuIGFycmF5IG9mIFRpbGUgb2JqZWN0cy5cclxuICAgICAqL1xyXG4gICAgZ2V0VGlsZXNXaXRoaW5TaGFwZTogZnVuY3Rpb24gKHNoYXBlLCBmaWx0ZXJpbmdPcHRpb25zLCBjYW1lcmEpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkdldFRpbGVzV2l0aGluU2hhcGUoc2hhcGUsIGZpbHRlcmluZ09wdGlvbnMsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgdGlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gKGluIHRpbGUgY29vcmRpbmF0ZXMpIGluIHRoZSBnaXZlbiBsYXllci4gUmV0dXJuc1xyXG4gICAgICogZmFsc2UgaWYgdGhlcmUgaXMgbm8gdGlsZSBvciBpZiB0aGUgdGlsZSBhdCB0aGF0IGxvY2F0aW9uIGhhcyBhbiBpbmRleCBvZiAtMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjaGFzVGlsZUF0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVYIC0gWCBwb3NpdGlvbiB0byBnZXQgdGhlIHRpbGUgZnJvbSBpbiB0aWxlIGNvb3JkaW5hdGVzLlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFkgcG9zaXRpb24gdG8gZ2V0IHRoZSB0aWxlIGZyb20gaW4gdGlsZSBjb29yZGluYXRlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBoYXNUaWxlQXQ6IGZ1bmN0aW9uICh0aWxlWCwgdGlsZVkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFRpbGVtYXBDb21wb25lbnRzLkhhc1RpbGVBdCh0aWxlWCwgdGlsZVksIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHRpbGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIChpbiB3b3JsZCBjb29yZGluYXRlcykgaW4gdGhlIGdpdmVuIGxheWVyLiBSZXR1cm5zXHJcbiAgICAgKiBmYWxzZSBpZiB0aGVyZSBpcyBubyB0aWxlIG9yIGlmIHRoZSB0aWxlIGF0IHRoYXQgbG9jYXRpb24gaGFzIGFuIGluZGV4IG9mIC0xLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNoYXNUaWxlQXRXb3JsZFhZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgd29ybGQgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgd29ybGQgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGhhc1RpbGVBdFdvcmxkWFk6IGZ1bmN0aW9uICh3b3JsZFgsIHdvcmxkWSwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5IYXNUaWxlQXRXb3JsZFhZKHdvcmxkWCwgd29ybGRZLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERyYXdzIGEgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxheWVyIHRvIHRoZSBnaXZlbiBHcmFwaGljcy4gVGhpcyBpcyBoZWxwZnVsIHdoZW4geW91IHdhbnQgdG9cclxuICAgICAqIGdldCBhIHF1aWNrIGlkZWEgb2Ygd2hpY2ggb2YgeW91ciB0aWxlcyBhcmUgY29sbGlkaW5nIGFuZCB3aGljaCBoYXZlIGludGVyZXN0aW5nIGZhY2VzLiBUaGUgdGlsZXNcclxuICAgICAqIGFyZSBkcmF3biBzdGFydGluZyBhdCAoMCwgMCkgaW4gdGhlIEdyYXBoaWNzLCBhbGxvd2luZyB5b3UgdG8gcGxhY2UgdGhlIGRlYnVnIHJlcHJlc2VudGF0aW9uXHJcbiAgICAgKiB3aGVyZXZlciB5b3Ugd2FudCBvbiB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNyZW5kZXJEZWJ1Z1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuR3JhcGhpY3N9IGdyYXBoaWNzIC0gVGhlIHRhcmdldCBHcmFwaGljcyBvYmplY3QgdG8gZHJhdyB1cG9uLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGlsZW1hcHMuU3R5bGVDb25maWd9IHN0eWxlQ29uZmlnIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGNvbG9ycyB0byB1c2UgZm9yIHRoZSBkZWJ1ZyBkcmF3aW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbmRlckRlYnVnOiBmdW5jdGlvbiAoZ3JhcGhpY3MsIHN0eWxlQ29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlJlbmRlckRlYnVnKGdyYXBoaWNzLCBzdHlsZUNvbmZpZywgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIHRoZSBnaXZlbiB0aWxlIG9yIHRpbGVzIHdpdGhpbiBhIGxheWVyIGJ5IGluZGV4LiBZb3UgY2FuIHBhc3MgaW4gZWl0aGVyIGFcclxuICAgICAqIHNpbmdsZSBudW1lcmljIGluZGV4IG9yIGFuIGFycmF5IG9mIGluZGV4ZXM6IFsyLCAzLCAxNSwgMjBdLiBUaGUgYGNvbGxpZGVzYCBwYXJhbWV0ZXIgY29udHJvbHMgaWZcclxuICAgICAqIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3NldENvbGxpc2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoaW50ZWdlcnxhcnJheSl9IGluZGV4ZXMgLSBFaXRoZXIgYSBzaW5nbGUgdGlsZSBpbmRleCwgb3IgYW4gYXJyYXkgb2YgdGlsZSBpbmRleGVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhclxyXG4gICAgICogY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJlY2FsY3VsYXRlIHRoZSB0aWxlIGZhY2VzIGFmdGVyIHRoZVxyXG4gICAgICogdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlTGF5ZXI9dHJ1ZV0gLSBJZiB0cnVlLCB1cGRhdGVzIHRoZSBjdXJyZW50IHRpbGVzIG9uIHRoZSBsYXllci4gU2V0IHRvXHJcbiAgICAgKiBmYWxzZSBpZiBubyB0aWxlcyBoYXZlIGJlZW4gcGxhY2VkIGZvciBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBib29zdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaXNpb246IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgdXBkYXRlTGF5ZXIpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0Q29sbGlzaW9uKGluZGV4ZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzLCB0aGlzLmxheWVyLCB1cGRhdGVMYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgY29sbGlzaW9uIG9uIGEgcmFuZ2Ugb2YgdGlsZXMgaW4gYSBsYXllciB3aG9zZSBpbmRleCBpcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgYHN0YXJ0YCBhbmRcclxuICAgICAqIGBzdG9wYCAoaW5jbHVzaXZlKS4gQ2FsbGluZyB0aGlzIHdpdGggYSBzdGFydCB2YWx1ZSBvZiAxMCBhbmQgYSBzdG9wIHZhbHVlIG9mIDE0IHdvdWxkIHNldFxyXG4gICAgICogY29sbGlzaW9uIGZvciB0aWxlcyAxMCwgMTEsIDEyLCAxMyBhbmQgMTQuIFRoZSBgY29sbGlkZXNgIHBhcmFtZXRlciBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZVxyXG4gICAgICogZW5hYmxlZCAodHJ1ZSkgb3IgZGlzYWJsZWQgKGZhbHNlKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjc2V0Q29sbGlzaW9uQmV0d2VlblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBzdGFydCAtIFRoZSBmaXJzdCBpbmRleCBvZiB0aGUgdGlsZSB0byBiZSBzZXQgZm9yIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gc3RvcCAtIFRoZSBsYXN0IGluZGV4IG9mIHRoZSB0aWxlIHRvIGJlIHNldCBmb3IgY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29sbGlkZXM9dHJ1ZV0gLSBJZiB0cnVlIGl0IHdpbGwgZW5hYmxlIGNvbGxpc2lvbi4gSWYgZmFsc2UgaXQgd2lsbCBjbGVhclxyXG4gICAgICogY29sbGlzaW9uLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVjYWxjdWxhdGVGYWNlcz10cnVlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHJlY2FsY3VsYXRlIHRoZSB0aWxlIGZhY2VzIGFmdGVyIHRoZVxyXG4gICAgICogdXBkYXRlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldENvbGxpc2lvbkJldHdlZW46IGZ1bmN0aW9uIChzdGFydCwgc3RvcCwgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMpXHJcbiAgICB7XHJcbiAgICAgICAgVGlsZW1hcENvbXBvbmVudHMuU2V0Q29sbGlzaW9uQmV0d2VlbihzdGFydCwgc3RvcCwgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiB0aGUgdGlsZXMgd2l0aGluIGEgbGF5ZXIgYnkgY2hlY2tpbmcgdGlsZSBwcm9wZXJ0aWVzLiBJZiBhIHRpbGUgaGFzIGEgcHJvcGVydHlcclxuICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJvcGVydGllcyBvYmplY3QsIGl0cyBjb2xsaXNpb24gZmxhZyB3aWxsIGJlIHNldC4gVGhlIGBjb2xsaWRlc2BcclxuICAgICAqIHBhcmFtZXRlciBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvciBkaXNhYmxlZCAoZmFsc2UpLiBQYXNzaW5nIGluXHJcbiAgICAgKiBgeyBjb2xsaWRlczogdHJ1ZSB9YCB3b3VsZCB1cGRhdGUgdGhlIGNvbGxpc2lvbiBmbGFnIG9uIGFueSB0aWxlcyB3aXRoIGEgXCJjb2xsaWRlc1wiIHByb3BlcnR5IHRoYXRcclxuICAgICAqIGhhcyBhIHZhbHVlIG9mIHRydWUuIEFueSB0aWxlIHRoYXQgZG9lc24ndCBoYXZlIFwiY29sbGlkZXNcIiBzZXQgdG8gdHJ1ZSB3aWxsIGJlIGlnbm9yZWQuIFlvdSBjYW5cclxuICAgICAqIGFsc28gdXNlIGFuIGFycmF5IG9mIHZhbHVlcywgZS5nLiBgeyB0eXBlczogW1wic3RvbmVcIiwgXCJsYXZhXCIsIFwic2FuZFwiIF0gfWAuIElmIGEgdGlsZSBoYXMgYVxyXG4gICAgICogXCJ0eXBlc1wiIHByb3BlcnR5IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhvc2UgdmFsdWVzLCBpdHMgY29sbGlzaW9uIGZsYWcgd2lsbCBiZSB1cGRhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRDb2xsaXNpb25CeVByb3BlcnR5XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcGVydGllcyAtIEFuIG9iamVjdCB3aXRoIHRpbGUgcHJvcGVydGllcyBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZXMgdGhhdCBzaG91bGRcclxuICAgICAqIGJlIGNoZWNrZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyXHJcbiAgICAgKiBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlXHJcbiAgICAgKiB1cGRhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQnlQcm9wZXJ0eTogZnVuY3Rpb24gKHByb3BlcnRpZXMsIGNvbGxpZGVzLCByZWNhbGN1bGF0ZUZhY2VzKVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldENvbGxpc2lvbkJ5UHJvcGVydHkocHJvcGVydGllcywgY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGNvbGxpc2lvbiBvbiBhbGwgdGlsZXMgaW4gdGhlIGdpdmVuIGxheWVyLCBleGNlcHQgZm9yIHRpbGVzIHRoYXQgaGF2ZSBhbiBpbmRleCBzcGVjaWZpZWQgaW5cclxuICAgICAqIHRoZSBnaXZlbiBhcnJheS4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGlmIGNvbGxpc2lvbiB3aWxsIGJlIGVuYWJsZWQgKHRydWUpIG9yXHJcbiAgICAgKiBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRDb2xsaXNpb25CeUV4Y2x1c2lvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyW119IGluZGV4ZXMgLSBBbiBhcnJheSBvZiB0aGUgdGlsZSBpbmRleGVzIHRvIG5vdCBiZSBjb3VudGVkIGZvciBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xsaWRlcz10cnVlXSAtIElmIHRydWUgaXQgd2lsbCBlbmFibGUgY29sbGlzaW9uLiBJZiBmYWxzZSBpdCB3aWxsIGNsZWFyXHJcbiAgICAgKiBjb2xsaXNpb24uXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWNhbGN1bGF0ZUZhY2VzPXRydWVdIC0gV2hldGhlciBvciBub3QgdG8gcmVjYWxjdWxhdGUgdGhlIHRpbGUgZmFjZXMgYWZ0ZXIgdGhlXHJcbiAgICAgKiB1cGRhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcn0gVGhpcyBUaWxlbWFwIExheWVyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q29sbGlzaW9uQnlFeGNsdXNpb246IGZ1bmN0aW9uIChpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRDb2xsaXNpb25CeUV4Y2x1c2lvbihpbmRleGVzLCBjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcywgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBnbG9iYWwgY29sbGlzaW9uIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdGlsZSBpbmRleCB3aXRoaW4gdGhlIGxheWVyLiBUaGlzIHdpbGwgYWZmZWN0IGFsbFxyXG4gICAgICogdGlsZXMgb24gdGhpcyBsYXllciB0aGF0IGhhdmUgdGhlIHNhbWUgaW5kZXguIElmIGEgY2FsbGJhY2sgaXMgYWxyZWFkeSBzZXQgZm9yIHRoZSB0aWxlIGluZGV4IGl0XHJcbiAgICAgKiB3aWxsIGJlIHJlcGxhY2VkLiBTZXQgdGhlIGNhbGxiYWNrIHRvIG51bGwgdG8gcmVtb3ZlIGl0LiBJZiB5b3Ugd2FudCB0byBzZXQgYSBjYWxsYmFjayBmb3IgYSB0aWxlXHJcbiAgICAgKiBhdCBhIHNwZWNpZmljIGxvY2F0aW9uIG9uIHRoZSBtYXAgdGhlbiBzZWUgc2V0VGlsZUxvY2F0aW9uQ2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3NldFRpbGVJbmRleENhbGxiYWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhpbnRlZ2VyfGFycmF5KX0gaW5kZXhlcyAtIEVpdGhlciBhIHNpbmdsZSB0aWxlIGluZGV4LCBvciBhbiBhcnJheSBvZiB0aWxlIGluZGV4ZXMgdG8gaGF2ZSBhXHJcbiAgICAgKiBjb2xsaXNpb24gY2FsbGJhY2sgc2V0IGZvci5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHRpbGUgaXMgY29sbGlkZWQgd2l0aC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFja0NvbnRleHQgLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRpbGVJbmRleENhbGxiYWNrOiBmdW5jdGlvbiAoaW5kZXhlcywgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dClcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRUaWxlSW5kZXhDYWxsYmFjayhpbmRleGVzLCBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0LCB0aGlzLmxheWVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBjb2xsaXNpb24gb24gdGhlIHRpbGVzIHdpdGhpbiBhIGxheWVyIGJ5IGNoZWNraW5nIGVhY2ggdGlsZXMgY29sbGlzaW9uIGdyb3VwIGRhdGFcclxuICAgICAqICh0eXBpY2FsbHkgZGVmaW5lZCBpbiBUaWxlZCB3aXRoaW4gdGhlIHRpbGVzZXQgY29sbGlzaW9uIGVkaXRvcikuIElmIGFueSBvYmplY3RzIGFyZSBmb3VuZCB3aXRoaW5cclxuICAgICAqIGEgdGlsZXMgY29sbGlzaW9uIGdyb3VwLCB0aGUgdGlsZSdzIGNvbGxpZGluZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNldC4gVGhlIGBjb2xsaWRlc2AgcGFyYW1ldGVyXHJcbiAgICAgKiBjb250cm9scyBpZiBjb2xsaXNpb24gd2lsbCBiZSBlbmFibGVkICh0cnVlKSBvciBkaXNhYmxlZCAoZmFsc2UpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRDb2xsaXNpb25Gcm9tQ29sbGlzaW9uR3JvdXBcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbGxpZGVzPXRydWVdIC0gSWYgdHJ1ZSBpdCB3aWxsIGVuYWJsZSBjb2xsaXNpb24uIElmIGZhbHNlIGl0IHdpbGwgY2xlYXJcclxuICAgICAqIGNvbGxpc2lvbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY2FsY3VsYXRlRmFjZXM9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByZWNhbGN1bGF0ZSB0aGUgdGlsZSBmYWNlcyBhZnRlciB0aGVcclxuICAgICAqIHVwZGF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyfSBUaGlzIFRpbGVtYXAgTGF5ZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDb2xsaXNpb25Gcm9tQ29sbGlzaW9uR3JvdXA6IGZ1bmN0aW9uIChjb2xsaWRlcywgcmVjYWxjdWxhdGVGYWNlcylcclxuICAgIHtcclxuICAgICAgICBUaWxlbWFwQ29tcG9uZW50cy5TZXRDb2xsaXNpb25Gcm9tQ29sbGlzaW9uR3JvdXAoY29sbGlkZXMsIHJlY2FsY3VsYXRlRmFjZXMsIHRoaXMubGF5ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgY29sbGlzaW9uIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gcmVjdGFuZ3VsYXIgYXJlYSAoaW4gdGlsZSBjb29yZGluYXRlcykgd2l0aGluIHRoZSBsYXllci5cclxuICAgICAqIElmIGEgY2FsbGJhY2sgaXMgYWxyZWFkeSBzZXQgZm9yIHRoZSB0aWxlIGluZGV4IGl0IHdpbGwgYmUgcmVwbGFjZWQuIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0b1xyXG4gICAgICogcmVtb3ZlIGl0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNzZXRUaWxlTG9jYXRpb25DYWxsYmFja1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBsZWZ0bW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gdGlsZVkgLSBUaGUgdG9wbW9zdCB0aWxlIGluZGV4IChpbiB0aWxlIGNvb3JkaW5hdGVzKSB0byB1c2UgYXMgdGhlIG9yaWdpbiBvZiB0aGUgYXJlYS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gd2lkdGggLSBIb3cgbWFueSB0aWxlcyB3aWRlIGZyb20gdGhlIGB0aWxlWGAgaW5kZXggdGhlIGFyZWEgd2lsbCBiZS5cclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaGVpZ2h0IC0gSG93IG1hbnkgdGlsZXMgdGFsbCBmcm9tIHRoZSBgdGlsZVlgIGluZGV4IHRoZSBhcmVhIHdpbGwgYmUuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB0aWxlIGlzIGNvbGxpZGVkIHdpdGguXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2NhbGxiYWNrQ29udGV4dF0gLSBUaGUgY29udGV4dCB1bmRlciB3aGljaCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IFRoaXMgVGlsZW1hcCBMYXllciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFRpbGVMb2NhdGlvbkNhbGxiYWNrOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCB3aWR0aCwgaGVpZ2h0LCBjYWxsYmFjaywgY2FsbGJhY2tDb250ZXh0KVxyXG4gICAge1xyXG4gICAgICAgIFRpbGVtYXBDb21wb25lbnRzLlNldFRpbGVMb2NhdGlvbkNhbGxiYWNrKHRpbGVYLCB0aWxlWSwgd2lkdGgsIGhlaWdodCwgY2FsbGJhY2ssIGNhbGxiYWNrQ29udGV4dCwgdGhpcy5sYXllcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gdGlsZSBYIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSB0byB3b3JsZCBYIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3RpbGVUb1dvcmxkWFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBYIGNvb3JkaW5hdGUsIGluIHRpbGUgY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHdvcmxkIHZhbHVlcyBmcm9tIHRoZSB0aWxlIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGlsZVRvV29ybGRYOiBmdW5jdGlvbiAodGlsZVgsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuVGlsZVRvV29ybGRYKHRpbGVYLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gdGlsZSBZIGNvb3JkaW5hdGVzICh0aWxlIHVuaXRzKSB0byB3b3JsZCBZIGNvb3JkaW5hdGVzIChwaXhlbHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3RpbGVUb1dvcmxkWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWSAtIFRoZSBZIGNvb3JkaW5hdGUsIGluIHRpbGUgY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHdvcmxkIHZhbHVlcyBmcm9tIHRoZSB0aWxlIGluZGV4LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgdGlsZVRvV29ybGRZOiBmdW5jdGlvbiAodGlsZVksIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuVGlsZVRvV29ybGRZKHRpbGVZLCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIGZyb20gdGlsZSBYWSBjb29yZGluYXRlcyAodGlsZSB1bml0cykgdG8gd29ybGQgWFkgY29vcmRpbmF0ZXMgKHBpeGVscyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC4gVGhpcyB3aWxsIHJldHVybiBhIG5ldyBWZWN0b3IyIG9iamVjdCBvciB1cGRhdGUgdGhlIGdpdmVuXHJcbiAgICAgKiBgcG9pbnRgIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjdGlsZVRvV29ybGRYWVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aWxlWCAtIFRoZSBYIGNvb3JkaW5hdGUsIGluIHRpbGUgY29vcmRpbmF0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IHRpbGVZIC0gVGhlIFkgY29vcmRpbmF0ZSwgaW4gdGlsZSBjb29yZGluYXRlcy5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLk1hdGguVmVjdG9yMn0gW3BvaW50XSAtIEEgVmVjdG9yMiB0byBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgaW4uIElmIG5vdCBnaXZlbiwgYSBuZXcgVmVjdG9yMiBpcyBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuQ2FtZXJhcy5TY2VuZTJELkNhbWVyYX0gW2NhbWVyYT1tYWluIGNhbWVyYV0gLSBUaGUgQ2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSB3b3JsZCB2YWx1ZXMgZnJvbSB0aGUgdGlsZSBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuTWF0aC5WZWN0b3IyfVxyXG4gICAgICovXHJcbiAgICB0aWxlVG9Xb3JsZFhZOiBmdW5jdGlvbiAodGlsZVgsIHRpbGVZLCBwb2ludCwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5UaWxlVG9Xb3JsZFhZKHRpbGVYLCB0aWxlWSwgcG9pbnQsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgZnJvbSB3b3JsZCBYIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWCBjb29yZGluYXRlcyAodGlsZSB1bml0cyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjd29ybGRUb1RpbGVYXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRYIC0gVGhlIFggY29vcmRpbmF0ZSwgaW4gd29ybGQgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlXHJcbiAgICAgKiBuZWFyZXN0IGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLl1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHdvcmxkVG9UaWxlWDogZnVuY3Rpb24gKHdvcmxkWCwgc25hcFRvRmxvb3IsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuV29ybGRUb1RpbGVYKHdvcmxkWCwgc25hcFRvRmxvb3IsIGNhbWVyYSwgdGhpcy5sYXllcik7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgZnJvbSB3b3JsZCBZIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWSBjb29yZGluYXRlcyAodGlsZSB1bml0cyksIGZhY3RvcmluZyBpbiB0aGVcclxuICAgICAqIGxheWVycyBwb3NpdGlvbiwgc2NhbGUgYW5kIHNjcm9sbC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjd29ybGRUb1RpbGVZXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIFkgY29vcmRpbmF0ZSwgaW4gd29ybGQgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlXHJcbiAgICAgKiBuZWFyZXN0IGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBbY2FtZXJhPW1haW4gY2FtZXJhXSAtIFRoZSBDYW1lcmEgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHRpbGUgaW5kZXggZnJvbSB0aGUgd29ybGQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgd29ybGRUb1RpbGVZOiBmdW5jdGlvbiAod29ybGRZLCBzbmFwVG9GbG9vciwgY2FtZXJhKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUaWxlbWFwQ29tcG9uZW50cy5Xb3JsZFRvVGlsZVkod29ybGRZLCBzbmFwVG9GbG9vciwgY2FtZXJhLCB0aGlzLmxheWVyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHdvcmxkIFhZIGNvb3JkaW5hdGVzIChwaXhlbHMpIHRvIHRpbGUgWFkgY29vcmRpbmF0ZXMgKHRpbGUgdW5pdHMpLCBmYWN0b3JpbmcgaW4gdGhlXHJcbiAgICAgKiBsYXllcnMgcG9zaXRpb24sIHNjYWxlIGFuZCBzY3JvbGwuIFRoaXMgd2lsbCByZXR1cm4gYSBuZXcgVmVjdG9yMiBvYmplY3Qgb3IgdXBkYXRlIHRoZSBnaXZlblxyXG4gICAgICogYHBvaW50YCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGlsZW1hcHMuU3RhdGljVGlsZW1hcExheWVyI3dvcmxkVG9UaWxlWFlcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3b3JsZFggLSBUaGUgWCBjb29yZGluYXRlLCBpbiB3b3JsZCBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd29ybGRZIC0gVGhlIFkgY29vcmRpbmF0ZSwgaW4gd29ybGQgcGl4ZWxzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc25hcFRvRmxvb3I9dHJ1ZV0gLSBXaGV0aGVyIG9yIG5vdCB0byByb3VuZCB0aGUgdGlsZSBjb29yZGluYXRlIGRvd24gdG8gdGhlXHJcbiAgICAgKiBuZWFyZXN0IGludGVnZXIuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5NYXRoLlZlY3RvcjJ9IFtwb2ludF0gLSBBIFZlY3RvcjIgdG8gc3RvcmUgdGhlIGNvb3JkaW5hdGVzIGluLiBJZiBub3QgZ2l2ZW4sIGEgbmV3IFZlY3RvcjIgaXMgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IFtjYW1lcmE9bWFpbiBjYW1lcmFdIC0gVGhlIENhbWVyYSB0byB1c2Ugd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlsZSBpbmRleCBmcm9tIHRoZSB3b3JsZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLk1hdGguVmVjdG9yMn1cclxuICAgICAqL1xyXG4gICAgd29ybGRUb1RpbGVYWTogZnVuY3Rpb24gKHdvcmxkWCwgd29ybGRZLCBzbmFwVG9GbG9vciwgcG9pbnQsIGNhbWVyYSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGlsZW1hcENvbXBvbmVudHMuV29ybGRUb1RpbGVYWSh3b3JsZFgsIHdvcmxkWSwgc25hcFRvRmxvb3IsIHBvaW50LCBjYW1lcmEsIHRoaXMubGF5ZXIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgU3RhdGljVGlsZW1hcExheWVyIGFuZCByZW1vdmVzIGl0cyBsaW5rIHRvIHRoZSBhc3NvY2lhdGVkIExheWVyRGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXIjZGVzdHJveVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlbW92ZUZyb21UaWxlbWFwPXRydWVdIC0gUmVtb3ZlIHRoaXMgbGF5ZXIgZnJvbSB0aGUgcGFyZW50IFRpbGVtYXA/XHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIChyZW1vdmVGcm9tVGlsZW1hcClcclxuICAgIHtcclxuICAgICAgICBpZiAocmVtb3ZlRnJvbVRpbGVtYXAgPT09IHVuZGVmaW5lZCkgeyByZW1vdmVGcm9tVGlsZW1hcCA9IHRydWU7IH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVtYXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQWJvcnQsIHdlJ3ZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWRcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFVuaW5zdGFsbCB0aGlzIGxheWVyIG9ubHkgaWYgaXQgaXMgc3RpbGwgaW5zdGFsbGVkIG9uIHRoZSBMYXllckRhdGEgb2JqZWN0XHJcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudGlsZW1hcExheWVyID09PSB0aGlzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5sYXllci50aWxlbWFwTGF5ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVtb3ZlRnJvbVRpbGVtYXApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRpbGVtYXAucmVtb3ZlTGF5ZXIodGhpcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRpbGVtYXAgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5sYXllciA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmN1bGxlZFRpbGVzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5jdWxsQ2FsbGJhY2sgPSBudWxsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGlsZXNldC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHlbaV0gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleENvdW50W2ldID0gMDtcclxuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckRhdGFbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdGMzJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnZlcnRleFZpZXdVMzJbaV0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5naWRNYXAgPSBbXTtcclxuICAgICAgICB0aGlzLnRpbGVzZXQgPSBbXTtcclxuXHJcbiAgICAgICAgR2FtZU9iamVjdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0YXRpY1RpbGVtYXBMYXllcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIENhbnZhcyBSZW5kZXJlciB0byB0aGUgZ2l2ZW4gQ2FtZXJhLlxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNyZW5kZXJDYW52YXNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIEBwcml2YXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlJlbmRlcmVyLkNhbnZhcy5DYW52YXNSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgQ2FudmFzIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UaWxlbWFwcy5TdGF0aWNUaWxlbWFwTGF5ZXJ9IHNyYyAtIFRoZSBHYW1lIE9iamVjdCBiZWluZyByZW5kZXJlZCBpbiB0aGlzIGNhbGwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSAtIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGFuZCBjdXN0b20gcGlwZWxpbmVzLlxyXG4gKiBAcGFyYW0ge1BoYXNlci5DYW1lcmFzLlNjZW5lMkQuQ2FtZXJhfSBjYW1lcmEgLSBUaGUgQ2FtZXJhIHRoYXQgaXMgcmVuZGVyaW5nIHRoZSBHYW1lIE9iamVjdC5cclxuICogQHBhcmFtIHtQaGFzZXIuR2FtZU9iamVjdHMuQ29tcG9uZW50cy5UcmFuc2Zvcm1NYXRyaXh9IHBhcmVudE1hdHJpeCAtIFRoaXMgdHJhbnNmb3JtIG1hdHJpeCBpcyBkZWZpbmVkIGlmIHRoZSBnYW1lIG9iamVjdCBpcyBuZXN0ZWRcclxuICovXHJcbnZhciBTdGF0aWNUaWxlbWFwTGF5ZXJDYW52YXNSZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlciwgc3JjLCBpbnRlcnBvbGF0aW9uUGVyY2VudGFnZSwgY2FtZXJhLCBwYXJlbnRNYXRyaXgpXHJcbntcclxuICAgIHNyYy5jdWxsKGNhbWVyYSk7XHJcblxyXG4gICAgdmFyIHJlbmRlclRpbGVzID0gc3JjLmN1bGxlZFRpbGVzO1xyXG4gICAgdmFyIHRpbGVDb3VudCA9IHJlbmRlclRpbGVzLmxlbmd0aDtcclxuXHJcbiAgICBpZiAodGlsZUNvdW50ID09PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgY2FtTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgxO1xyXG4gICAgdmFyIGxheWVyTWF0cml4ID0gcmVuZGVyZXIuX3RlbXBNYXRyaXgyO1xyXG4gICAgdmFyIGNhbGNNYXRyaXggPSByZW5kZXJlci5fdGVtcE1hdHJpeDM7XHJcblxyXG4gICAgbGF5ZXJNYXRyaXguYXBwbHlJVFJTKHNyYy54LCBzcmMueSwgc3JjLnJvdGF0aW9uLCBzcmMuc2NhbGVYLCBzcmMuc2NhbGVZKTtcclxuXHJcbiAgICBjYW1NYXRyaXguY29weUZyb20oY2FtZXJhLm1hdHJpeCk7XHJcblxyXG4gICAgdmFyIGN0eCA9IHJlbmRlcmVyLmN1cnJlbnRDb250ZXh0O1xyXG4gICAgdmFyIGdpZE1hcCA9IHNyYy5naWRNYXA7XHJcblxyXG4gICAgY3R4LnNhdmUoKTtcclxuXHJcbiAgICBpZiAocGFyZW50TWF0cml4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBNdWx0aXBseSB0aGUgY2FtZXJhIGJ5IHRoZSBwYXJlbnQgbWF0cml4XHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5V2l0aE9mZnNldChwYXJlbnRNYXRyaXgsIC1jYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYLCAtY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSk7XHJcblxyXG4gICAgICAgIC8vICBVbmRvIHRoZSBjYW1lcmEgc2Nyb2xsXHJcbiAgICAgICAgbGF5ZXJNYXRyaXguZSA9IHNyYy54O1xyXG4gICAgICAgIGxheWVyTWF0cml4LmYgPSBzcmMueTtcclxuXHJcbiAgICAgICAgY2FtTWF0cml4Lm11bHRpcGx5KGxheWVyTWF0cml4LCBjYWxjTWF0cml4KTtcclxuXHJcbiAgICAgICAgY2FsY01hdHJpeC5jb3B5VG9Db250ZXh0KGN0eCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFVuZG8gdGhlIGNhbWVyYSBzY3JvbGxcclxuICAgICAgICBsYXllck1hdHJpeC5lIC09IGNhbWVyYS5zY3JvbGxYICogc3JjLnNjcm9sbEZhY3Rvclg7XHJcbiAgICAgICAgbGF5ZXJNYXRyaXguZiAtPSBjYW1lcmEuc2Nyb2xsWSAqIHNyYy5zY3JvbGxGYWN0b3JZO1xyXG5cclxuICAgICAgICBsYXllck1hdHJpeC5jb3B5VG9Db250ZXh0KGN0eCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGFscGhhID0gY2FtZXJhLmFscGhhICogc3JjLmFscGhhO1xyXG5cclxuICAgIGlmICghcmVuZGVyZXIuYW50aWFsaWFzIHx8IHNyYy5zY2FsZVggPiAxIHx8IHNyYy5zY2FsZVkgPiAxKVxyXG4gICAge1xyXG4gICAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVDb3VudDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aWxlID0gcmVuZGVyVGlsZXNbaV07XHJcblxyXG4gICAgICAgIHZhciB0aWxlc2V0ID0gZ2lkTWFwW3RpbGUuaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoIXRpbGVzZXQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpbWFnZSA9IHRpbGVzZXQuaW1hZ2UuZ2V0U291cmNlSW1hZ2UoKTtcclxuICAgICAgICB2YXIgdGlsZVRleENvb3JkcyA9IHRpbGVzZXQuZ2V0VGlsZVRleHR1cmVDb29yZGluYXRlcyh0aWxlLmluZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKHRpbGVUZXhDb29yZHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGlsZVdpZHRoID0gdGlsZXNldC50aWxlV2lkdGg7XHJcbiAgICAgICAgICAgIHZhciB0aWxlSGVpZ2h0ID0gdGlsZXNldC50aWxlSGVpZ2h0O1xyXG4gICAgICAgICAgICB2YXIgaGFsZldpZHRoID0gdGlsZVdpZHRoIC8gMjtcclxuICAgICAgICAgICAgdmFyIGhhbGZIZWlnaHQgPSB0aWxlSGVpZ2h0IC8gMjtcclxuICAgIFxyXG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xyXG5cclxuICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aWxlLnBpeGVsWCArIGhhbGZXaWR0aCwgdGlsZS5waXhlbFkgKyBoYWxmSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aWxlLnJvdGF0aW9uICE9PSAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjdHgucm90YXRlKHRpbGUucm90YXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKHRpbGUuZmxpcFggfHwgdGlsZS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY3R4LnNjYWxlKCh0aWxlLmZsaXBYKSA/IC0xIDogMSwgKHRpbGUuZmxpcFkpID8gLTEgOiAxKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgKiB0aWxlLmFscGhhO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgICAgICAgIHRpbGVUZXhDb29yZHMueCwgdGlsZVRleENvb3Jkcy55LFxyXG4gICAgICAgICAgICAgICAgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgLWhhbGZXaWR0aCwgLWhhbGZIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHRcclxuICAgICAgICAgICAgKTtcclxuICAgIFxyXG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjdHgucmVzdG9yZSgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGF0aWNUaWxlbWFwTGF5ZXJDYW52YXNSZW5kZXJlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgcmVuZGVyV2ViR0wgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcbnZhciByZW5kZXJDYW52YXMgPSByZXF1aXJlKCcuLi8uLi91dGlscy9OT09QJyk7XHJcblxyXG5pZiAodHlwZW9mIFdFQkdMX1JFTkRFUkVSKVxyXG57XHJcbiAgICByZW5kZXJXZWJHTCA9IHJlcXVpcmUoJy4vU3RhdGljVGlsZW1hcExheWVyV2ViR0xSZW5kZXJlcicpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIENBTlZBU19SRU5ERVJFUilcclxue1xyXG4gICAgcmVuZGVyQ2FudmFzID0gcmVxdWlyZSgnLi9TdGF0aWNUaWxlbWFwTGF5ZXJDYW52YXNSZW5kZXJlcicpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICByZW5kZXJXZWJHTDogcmVuZGVyV2ViR0wsXHJcbiAgICByZW5kZXJDYW52YXM6IHJlbmRlckNhbnZhc1xyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVuZGVycyB0aGlzIEdhbWUgT2JqZWN0IHdpdGggdGhlIFdlYkdMIFJlbmRlcmVyIHRvIHRoZSBnaXZlbiBDYW1lcmEuXHJcbiAqIFxyXG4gKiBUaGUgb2JqZWN0IHdpbGwgbm90IHJlbmRlciBpZiBhbnkgb2YgaXRzIHJlbmRlckZsYWdzIGFyZSBzZXQgb3IgaXQgaXMgYmVpbmcgYWN0aXZlbHkgZmlsdGVyZWQgb3V0IGJ5IHRoZSBDYW1lcmEuXHJcbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiBJdCBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb2YgdGhlIFJlbmRlciBtb2R1bGUuXHJcbiAqIFxyXG4gKiBBIFN0YXRpYyBUaWxlbWFwIExheWVyIHJlbmRlcnMgaW1tZWRpYXRlbHkgYW5kIGRvZXMgbm90IHVzZSBhbnkgYmF0Y2hpbmcuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllciNyZW5kZXJXZWJHTFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogQHByaXZhdGVcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuUmVuZGVyZXIuV2ViR0wuV2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhY3RpdmUgV2ViR0wgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlRpbGVtYXBzLlN0YXRpY1RpbGVtYXBMYXllcn0gc3JjIC0gVGhlIEdhbWUgT2JqZWN0IGJlaW5nIHJlbmRlcmVkIGluIHRoaXMgY2FsbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGludGVycG9sYXRpb25QZXJjZW50YWdlIC0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGN1c3RvbSBwaXBlbGluZXMuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLkNhbWVyYXMuU2NlbmUyRC5DYW1lcmF9IGNhbWVyYSAtIFRoZSBDYW1lcmEgdGhhdCBpcyByZW5kZXJpbmcgdGhlIEdhbWUgT2JqZWN0LlxyXG4gKi9cclxudmFyIFN0YXRpY1RpbGVtYXBMYXllcldlYkdMUmVuZGVyZXIgPSBmdW5jdGlvbiAocmVuZGVyZXIsIHNyYywgaW50ZXJwb2xhdGlvblBlcmNlbnRhZ2UsIGNhbWVyYSlcclxue1xyXG4gICAgdmFyIHRpbGVzZXRzID0gc3JjLnRpbGVzZXQ7XHJcblxyXG4gICAgdmFyIHBpcGVsaW5lID0gc3JjLnBpcGVsaW5lO1xyXG4gICAgdmFyIHBpcGVsaW5lVmVydGV4QnVmZmVyID0gcGlwZWxpbmUudmVydGV4QnVmZmVyO1xyXG5cclxuICAgIHJlbmRlcmVyLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcclxuXHJcbiAgICBwaXBlbGluZS5tb2RlbElkZW50aXR5KCk7XHJcbiAgICBwaXBlbGluZS5tb2RlbFRyYW5zbGF0ZShzcmMueCAtIChjYW1lcmEuc2Nyb2xsWCAqIHNyYy5zY3JvbGxGYWN0b3JYKSwgc3JjLnkgLSAoY2FtZXJhLnNjcm9sbFkgKiBzcmMuc2Nyb2xsRmFjdG9yWSksIDApO1xyXG4gICAgcGlwZWxpbmUubW9kZWxTY2FsZShzcmMuc2NhbGVYLCBzcmMuc2NhbGVZLCAxKTtcclxuICAgIHBpcGVsaW5lLnZpZXdMb2FkMkQoY2FtZXJhLm1hdHJpeC5tYXRyaXgpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGlsZXNldHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgc3JjLnVwbG9hZChjYW1lcmEsIGkpO1xyXG5cclxuICAgICAgICBpZiAoc3JjLnZlcnRleENvdW50W2ldID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChyZW5kZXJlci5jdXJyZW50UGlwZWxpbmUgJiYgcmVuZGVyZXIuY3VycmVudFBpcGVsaW5lLnZlcnRleENvdW50ID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZmx1c2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBwaXBlbGluZS52ZXJ0ZXhCdWZmZXIgPSBzcmMudmVydGV4QnVmZmVyW2ldO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICByZW5kZXJlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFRleHR1cmUyRCh0aWxlc2V0c1tpXS5nbFRleHR1cmUsIDApO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICByZW5kZXJlci5nbC5kcmF3QXJyYXlzKHBpcGVsaW5lLnRvcG9sb2d5LCAwLCBzcmMudmVydGV4Q291bnRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAgUmVzdG9yZSB0aGUgcGlwZWxpbmVcclxuICAgIHBpcGVsaW5lLnZlcnRleEJ1ZmZlciA9IHBpcGVsaW5lVmVydGV4QnVmZmVyO1xyXG5cclxuICAgIHBpcGVsaW5lLnZpZXdJZGVudGl0eSgpO1xyXG4gICAgcGlwZWxpbmUubW9kZWxJZGVudGl0eSgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTdGF0aWNUaWxlbWFwTGF5ZXJXZWJHTFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcbnZhciBUaW1lckV2ZW50ID0gcmVxdWlyZSgnLi9UaW1lckV2ZW50Jyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgQ2xvY2sgaXMgYSBTY2VuZSBwbHVnaW4gd2hpY2ggY3JlYXRlcyBhbmQgdXBkYXRlcyBUaW1lciBFdmVudHMgZm9yIGl0cyBTY2VuZS5cclxuICpcclxuICogQGNsYXNzIENsb2NrXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVGltZVxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlNjZW5lfSBzY2VuZSAtIFRoZSBTY2VuZSB3aGljaCBvd25zIHRoaXMgQ2xvY2suXHJcbiAqL1xyXG52YXIgQ2xvY2sgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gQ2xvY2sgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSB3aGljaCBvd25zIHRoaXMgQ2xvY2suXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5DbG9jayNzY2VuZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuU2NlbmV9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgU2NlbmUgU3lzdGVtcyBvYmplY3Qgb2YgdGhlIFNjZW5lIHdoaWNoIG93bnMgdGhpcyBDbG9jay5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLkNsb2NrI3N5c3RlbXNcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlNjZW5lcy5TeXN0ZW1zfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IHNjZW5lLnN5cztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgQ2xvY2ssIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIElmIGFjY2Vzc2VkIGV4dGVybmFsbHksIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgYHRpbWVgIHBhcmFtZXRlciBub3JtYWxseSBwYXNzZWQgdG8gYSBTY2VuZSdzIGB1cGRhdGVgIG1ldGhvZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLkNsb2NrI25vd1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5ub3cgPSAwO1xyXG5cclxuICAgICAgICAvLyAgU2NhbGUgdGhlIGRlbHRhIHRpbWUgY29taW5nIGludG8gdGhlIENsb2NrIGJ5IHRoaXMgZmFjdG9yXHJcbiAgICAgICAgLy8gIHdoaWNoIHRoZW4gaW5mbHVlbmNlcyBhbnl0aGluZyB1c2luZyB0aGlzIENsb2NrIGZvciBjYWxjdWxhdGlvbnMsIGxpa2UgVGltZXJFdmVudHNcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHNjYWxlIG9mIHRoZSBDbG9jaydzIHRpbWUgZGVsdGEuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogVGhlIHRpbWUgZGVsdGEgaXMgdGhlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMgYW5kIGluZmx1ZW5jZXMgdGhlIHNwZWVkIG9mIHRpbWUgZm9yIHRoaXMgQ2xvY2sgYW5kIGFueXRoaW5nIHdoaWNoIHVzZXMgaXQsIHN1Y2ggYXMgaXRzIFRpbWVyIEV2ZW50cy4gVmFsdWVzIGhpZ2hlciB0aGFuIDEgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIHRpbWUsIHdoaWxlIHZhbHVlcyBzbWFsbGVyIHRoYW4gMSBkZWNyZWFzZSBpdC4gQSB2YWx1ZSBvZiAwIGZyZWV6ZXMgdGltZSBhbmQgaXMgZWZmZWN0aXZlbHkgZXF1aXZhbGVudCB0byBwYXVzaW5nIHRoZSBDbG9jay5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLkNsb2NrI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogV2hldGhlciB0aGUgQ2xvY2sgaXMgcGF1c2VkIChgdHJ1ZWApIG9yIGFjdGl2ZSAoYGZhbHNlYCkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBXaGVuIHBhdXNlZCwgdGhlIENsb2NrIHdpbGwgbm90IHVwZGF0ZSBhbnkgb2YgaXRzIFRpbWVyIEV2ZW50cywgdGh1cyBmcmVlemluZyB0aW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbWUuQ2xvY2sjcGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBhbGwgVGltZXIgRXZlbnRzIHdob3NlIGRlbGF5cyBoYXZlbid0IGV4cGlyZWQgLSB0aGVzZSBhcmUgYWN0aXZlbHkgdXBkYXRpbmcgVGltZXIgRXZlbnRzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbWUuQ2xvY2sjX2FjdGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGltZS5UaW1lckV2ZW50W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBhbGwgVGltZXIgRXZlbnRzIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIENsb2NrIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhbWUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5DbG9jayNfcGVuZGluZ0luc2VydGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGltZS5UaW1lckV2ZW50W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdJbnNlcnRpb24gPSBbXTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgYWxsIFRpbWVyIEV2ZW50cyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgQ2xvY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLkNsb2NrI19wZW5kaW5nUmVtb3ZhbFxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVGltZS5UaW1lckV2ZW50W119XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZW1vdmFsID0gW107XHJcblxyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub25jZShTY2VuZUV2ZW50cy5CT09ULCB0aGlzLmJvb3QsIHRoaXMpO1xyXG4gICAgICAgIHNjZW5lLnN5cy5ldmVudHMub24oU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5LCBvbmx5IG9uY2UsIHdoZW4gdGhlIFNjZW5lIGlzIGZpcnN0IGNyZWF0ZWQuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbWUuQ2xvY2sjYm9vdFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMVxyXG4gICAgICovXHJcbiAgICBib290OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBTeW5jIHdpdGggdGhlIFRpbWVTdGVwXHJcbiAgICAgICAgdGhpcy5ub3cgPSB0aGlzLnN5c3RlbXMuZ2FtZS5sb29wLnRpbWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5zeXN0ZW1zLmV2ZW50cy5vbmNlKFNjZW5lRXZlbnRzLkRFU1RST1ksIHRoaXMuZGVzdHJveSwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFNjZW5lIHdoZW4gaXQgaXMgc3RhcnRpbmcgdXAuXHJcbiAgICAgKiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgbG9jYWwgc3lzdGVtcywgcHJvcGVydGllcyBhbmQgbGlzdGVuaW5nIGZvciBTY2VuZSBldmVudHMuXHJcbiAgICAgKiBEbyBub3QgaW52b2tlIGl0IGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbWUuQ2xvY2sjc3RhcnRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjBcclxuICAgICAqL1xyXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV2ZW50RW1pdHRlciA9IHRoaXMuc3lzdGVtcy5ldmVudHM7XHJcblxyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vbihTY2VuZUV2ZW50cy5QUkVfVVBEQVRFLCB0aGlzLnByZVVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vbmNlKFNjZW5lRXZlbnRzLlNIVVRET1dOLCB0aGlzLnNodXRkb3duLCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgVGltZXIgRXZlbnQgYW5kIGFkZHMgaXQgdG8gdGhlIENsb2NrIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5DbG9jayNhZGRFdmVudFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVGltZS5UaW1lckV2ZW50Q29uZmlnfSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFRpbWVyIEV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaW1lLlRpbWVyRXZlbnR9IFRoZSBUaW1lciBFdmVudCB3aGljaCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkRXZlbnQ6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV2ZW50ID0gbmV3IFRpbWVyRXZlbnQoY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0luc2VydGlvbi5wdXNoKGV2ZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBUaW1lciBFdmVudCBhbmQgYWRkcyBpdCB0byB0aGUgQ2xvY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIHtAbGluayAjYWRkRXZlbnR9IHdoaWNoIGNhbiBiZSBzaG9ydGVyIGFuZCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHN5bnRheCBvZiB0aGUgR3JlZW5Tb2NrIEFuaW1hdGlvbiBQbGF0Zm9ybSAoR1NBUCkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5DbG9jayNkZWxheWVkQ2FsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gVGhlIGRlbGF5IG9mIHRoZSBmdW5jdGlvbiBjYWxsLCBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSBkZWxheSBleHBpcmVzLlxyXG4gICAgICogQHBhcmFtIHtBcnJheS48Kj59IFthcmdzXSAtIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aC5cclxuICAgICAqIEBwYXJhbSB7Kn0gW2NhbGxiYWNrU2NvcGVdIC0gVGhlIHNjb3BlIChgdGhpc2Agb2JqZWN0KSB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaW1lLlRpbWVyRXZlbnR9IFRoZSBUaW1lciBFdmVudCB3aGljaCB3YXMgY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgZGVsYXllZENhbGw6IGZ1bmN0aW9uIChkZWxheSwgY2FsbGJhY2ssIGFyZ3MsIGNhbGxiYWNrU2NvcGUpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnQoeyBkZWxheTogZGVsYXksIGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncywgY2FsbGJhY2tTY29wZTogY2FsbGJhY2tTY29wZSB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgYW5kIHJlY3JlYXRlcyB0aGUgYXJyYXkgb2YgcGVuZGluZyBUaW1lciBFdmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5DbG9jayNjbGVhclBlbmRpbmdFdmVudHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaW1lLkNsb2NrfSBUaGlzIENsb2NrIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2xlYXJQZW5kaW5nRXZlbnRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdJbnNlcnRpb24gPSBbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NoZWR1bGVzIGFsbCBhY3RpdmUgVGltZXIgRXZlbnRzIGZvciByZW1vdmFsIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5DbG9jayNyZW1vdmVBbGxFdmVudHNcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5UaW1lLkNsb2NrfSBUaGlzIENsb2NrIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQWxsRXZlbnRzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZW1vdmFsID0gdGhpcy5fcGVuZGluZ1JlbW92YWwuY29uY2F0KHRoaXMuX2FjdGl2ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGFycmF5cyBvZiBhY3RpdmUgYW5kIHBlbmRpbmcgVGltZXIgRXZlbnRzLiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaW1lLkNsb2NrI3ByZVVwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgY3VycmVudCB0aW1lLiBFaXRoZXIgYSBIaWdoIFJlc29sdXRpb24gVGltZXIgdmFsdWUgaWYgaXQgY29tZXMgZnJvbSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgRGF0ZS5ub3cgaWYgdXNpbmcgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiBUaGlzIGlzIGEgc21vb3RoZWQgYW5kIGNhcHBlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgRlBTIHJhdGUuXHJcbiAgICAgKi9cclxuICAgIHByZVVwZGF0ZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0aGlzLl9wZW5kaW5nUmVtb3ZhbC5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHRvSW5zZXJ0ID0gdGhpcy5fcGVuZGluZ0luc2VydGlvbi5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0b1JlbW92ZSA9PT0gMCAmJiB0b0luc2VydCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayBiYWlsXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBldmVudDtcclxuXHJcbiAgICAgICAgLy8gIERlbGV0ZSBvbGQgZXZlbnRzXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvUmVtb3ZlOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBldmVudCA9IHRoaXMuX3BlbmRpbmdSZW1vdmFsW2ldO1xyXG5cclxuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fYWN0aXZlLmluZGV4T2YoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgUG9vbCB0aGVtP1xyXG4gICAgICAgICAgICBldmVudC5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9JbnNlcnQ7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGV2ZW50ID0gdGhpcy5fcGVuZGluZ0luc2VydGlvbltpXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICBDbGVhciB0aGUgbGlzdHNcclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVtb3ZhbC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdJbnNlcnRpb24ubGVuZ3RoID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBDbG9jaydzIGludGVybmFsIHRpbWUgYW5kIGFsbCBvZiBpdHMgVGltZXIgRXZlbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbWUuQ2xvY2sjdXBkYXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3cgPSB0aW1lO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXVzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWx0YSAqPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9hY3RpdmUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLl9hY3RpdmVbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQucGF1c2VkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gIFVzZSBkZWx0YSB0aW1lIHRvIGluY3JlYXNlIGVsYXBzZWQuXHJcbiAgICAgICAgICAgIC8vICBBdm9pZHMgbmVlZGluZyB0byBhZGp1c3QgZm9yIHBhdXNlIC8gcmVzdW1lLlxyXG4gICAgICAgICAgICAvLyAgQXV0b21hdGljYWxseSBzbW9vdGhlZCBieSBUaW1lU3RlcCBjbGFzcy5cclxuICAgICAgICAgICAgLy8gIEluIHRlc3RpbmcgYWNjdXJhdGUgdG8gKy0gMW1zIVxyXG4gICAgICAgICAgICBldmVudC5lbGFwc2VkICs9IGRlbHRhICogZXZlbnQudGltZVNjYWxlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmVsYXBzZWQgPj0gZXZlbnQuZGVsYXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSBldmVudC5lbGFwc2VkIC0gZXZlbnQuZGVsYXk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIExpbWl0IGl0LCBpbiBjYXNlIGl0J3MgY2hlY2tlZCBpbiB0aGUgY2FsbGJhY2tcclxuICAgICAgICAgICAgICAgIGV2ZW50LmVsYXBzZWQgPSBldmVudC5kZWxheTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgUHJvY2VzcyB0aGUgZXZlbnRcclxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuaGFzRGlzcGF0Y2hlZCAmJiBldmVudC5jYWxsYmFjaylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5oYXNEaXNwYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5jYWxsYmFjay5hcHBseShldmVudC5jYWxsYmFja1Njb3BlLCBldmVudC5hcmdzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQucmVwZWF0Q291bnQgPiAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlcGVhdENvdW50LS07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmVsYXBzZWQgPSByZW1haW5kZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuaGFzRGlzcGF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZW1vdmFsLnB1c2goZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgc2h1dHRpbmcgZG93bi5cclxuICAgICAqIFdlIG5lZWQgdG8ga2lsbCBhbmQgcmVzZXQgYWxsIGludGVybmFsIHByb3BlcnRpZXMgYXMgd2VsbCBhcyBzdG9wIGxpc3RlbmluZyB0byBTY2VuZSBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5DbG9jayNzaHV0ZG93blxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBzaHV0ZG93bjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX3BlbmRpbmdJbnNlcnRpb24ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nSW5zZXJ0aW9uW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9hY3RpdmUubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX3BlbmRpbmdSZW1vdmFsLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92YWxbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fYWN0aXZlLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92YWwubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nSW5zZXJ0aW9uLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMucHJlVXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAgICogV2UgbmVlZCB0byBzaHV0ZG93biBhbmQgdGhlbiBraWxsIG9mZiBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaW1lLkNsb2NrI2Rlc3Ryb3lcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNodXRkb3duKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUuc3lzLmV2ZW50cy5vZmYoU2NlbmVFdmVudHMuU1RBUlQsIHRoaXMuc3RhcnQsIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5QbHVnaW5DYWNoZS5yZWdpc3RlcignQ2xvY2snLCBDbG9jaywgJ3RpbWUnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2xvY2s7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEdldEZhc3RWYWx1ZSA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9HZXRGYXN0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NkZXNjXHJcbiAqIEEgVGltZXIgRXZlbnQgcmVwcmVzZW50cyBhIGRlbGF5ZWQgZnVuY3Rpb24gY2FsbC4gSXQncyBtYW5hZ2VkIGJ5IGEgU2NlbmUncyB7QGxpbmsgQ2xvY2t9IGFuZCB3aWxsIGNhbGwgaXRzIGZ1bmN0aW9uIGFmdGVyIGEgc2V0IGFtb3VudCBvZiB0aW1lIGhhcyBwYXNzZWQuIFRoZSBUaW1lciBFdmVudCBjYW4gb3B0aW9uYWxseSByZXBlYXQgLSBpLmUuIGNhbGwgaXRzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGJlZm9yZSBmaW5pc2hpbmcsIG9yIGxvb3AgaW5kZWZpbml0ZWx5LlxyXG4gKlxyXG4gKiBCZWNhdXNlIGl0J3MgbWFuYWdlZCBieSBhIENsb2NrLCBhIFRpbWVyIEV2ZW50IGlzIGJhc2VkIG9uIGdhbWUgdGltZSwgd2lsbCBiZSBhZmZlY3RlZCBieSBpdHMgQ2xvY2sncyB0aW1lIHNjYWxlLCBhbmQgd2lsbCBwYXVzZSBpZiBpdHMgQ2xvY2sgcGF1c2VzLlxyXG4gKlxyXG4gKiBAY2xhc3MgVGltZXJFdmVudFxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlRpbWVcclxuICogQGNvbnN0cnVjdG9yXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaW1lLlRpbWVyRXZlbnRDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVGltZXIgRXZlbnQsIGluY2x1ZGluZyBpdHMgZGVsYXkgYW5kIGNhbGxiYWNrLlxyXG4gKi9cclxudmFyIFRpbWVyRXZlbnQgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVGltZXJFdmVudCAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWxheSBpbiBtcyBhdCB3aGljaCB0aGlzIFRpbWVyRXZlbnQgZmlyZXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2RlbGF5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5kZWxheSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhpcyBUaW1lckV2ZW50IHdpbGwgcmVwZWF0IGJlZm9yZSBmaW5pc2hpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I3JlcGVhdFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVwZWF0ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgcmVwZWF0aW5nIHRoaXMgY29udGFpbnMgdGhlIGN1cnJlbnQgcmVwZWF0IGNvdW50LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbWUuVGltZXJFdmVudCNyZXBlYXRDb3VudFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucmVwZWF0Q291bnQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUcnVlIGlmIHRoaXMgVGltZXJFdmVudCBsb29wcywgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlRpbWUuVGltZXJFdmVudCNsb29wXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3AgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgVGltZXJFdmVudCBvY2N1cnMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2NhbGxiYWNrXHJcbiAgICAgICAgICogQHR5cGUge2Z1bmN0aW9ufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2s7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzY29wZSBpbiB3aGljaCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2NhbGxiYWNrU2NvcGVcclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tTY29wZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLlRpbWVyRXZlbnQjYXJnc1xyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmFyZ3M7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNjYWxlIHRoZSB0aW1lIGNhdXNpbmcgdGhpcyBUaW1lckV2ZW50IHRvIHVwZGF0ZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLlRpbWVyRXZlbnQjdGltZVNjYWxlXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAxXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50aW1lU2NhbGUgPSAxO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTdGFydCB0aGlzIG1hbnkgTVMgaW50byB0aGUgZWxhcHNlZCAodXNlZnVsIGlmIHlvdSB3YW50IGEgbG9uZyBkdXJhdGlvbiB3aXRoIHJlcGVhdCwgYnV0IGZvciB0aGUgZmlyc3QgbG9vcCB0byBmaXJlIHF1aWNrbHkpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I3N0YXJ0QXRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXJ0QXQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgd2hpY2ggaGFzIGVsYXBzZWQgc2luY2UgdGhlIFRpbWVyIEV2ZW50J3MgY3JlYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGxvY2FsIGZvciB0aGUgVGltZXIgRXZlbnQgYW5kIGlzIHJlbGF0aXZlIHRvIGl0cyBDbG9jay4gQXMgc3VjaCwgaXQncyBpbmZsdWVuY2VkIGJ5IHRoZSBDbG9jaydzIHRpbWUgc2NhbGUgYW5kIHBhdXNlZCBzdGF0ZSwgdGhlIFRpbWVyIEV2ZW50J3MgaW5pdGlhbCB7QGxpbmsgI3N0YXJ0QXR9IHByb3BlcnR5LCBhbmQgdGhlIFRpbWVyIEV2ZW50J3Mge0BsaW5rICN0aW1lU2NhbGV9IGFuZCB7QGxpbmsgI3BhdXNlZH0gc3RhdGUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2VsYXBzZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHRpbWVyIGlzIHBhdXNlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5UaW1lLlRpbWVyRXZlbnQjcGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBUaW1lciBFdmVudCdzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIFdoZW4gdGhlIFRpbWVyIEV2ZW50IGZpcmVzLCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIGB0cnVlYCBiZWZvcmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGludm9rZWQgYW5kIHdpbGwgYmUgcmVzZXQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkIGlmIHRoZSBUaW1lciBFdmVudCBzaG91bGQgcmVwZWF0LiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdCBkaXJlY3RseSBpbmZsdWVuY2Ugd2hldGhlciB0aGUgVGltZXIgRXZlbnQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXRzIENsb2NrLCBidXQgY2FuIHByZXZlbnQgaXQgZnJvbSBmaXJpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2hhc0Rpc3BhdGNoZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2V0KGNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGxldGVseSByZWluaXRpYWxpemVzIHRoZSBUaW1lciBFdmVudCwgcmVnYXJkbGVzcyBvZiBpdHMgY3VycmVudCBzdGF0ZSwgYWNjb3JkaW5nIHRvIGEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5UaW1lckV2ZW50I3Jlc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5UaW1lLlRpbWVyRXZlbnRDb25maWd9IGNvbmZpZyAtIFRoZSBuZXcgc3RhdGUgZm9yIHRoZSBUaW1lciBFdmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVGltZS5UaW1lckV2ZW50fSBUaGlzIFRpbWVyRXZlbnQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZXNldDogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB0aGlzLmRlbGF5ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ2RlbGF5JywgMCk7XHJcblxyXG4gICAgICAgIC8vICBDYW4gYWxzbyBiZSBzZXQgdG8gLTEgZm9yIGFuIGluZmluaXRlIGxvb3AgKHNhbWUgYXMgc2V0dGluZyBsb29wOiB0cnVlKVxyXG4gICAgICAgIHRoaXMucmVwZWF0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3JlcGVhdCcsIDApO1xyXG5cclxuICAgICAgICB0aGlzLmxvb3AgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAnbG9vcCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IEdldEZhc3RWYWx1ZShjb25maWcsICdjYWxsYmFjaycsIHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tTY29wZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICdjYWxsYmFja1Njb3BlJywgdGhpcy5jYWxsYmFjayk7XHJcblxyXG4gICAgICAgIHRoaXMuYXJncyA9IEdldEZhc3RWYWx1ZShjb25maWcsICdhcmdzJywgW10pO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IEdldEZhc3RWYWx1ZShjb25maWcsICd0aW1lU2NhbGUnLCAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydEF0ID0gR2V0RmFzdFZhbHVlKGNvbmZpZywgJ3N0YXJ0QXQnLCAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXVzZWQgPSBHZXRGYXN0VmFsdWUoY29uZmlnLCAncGF1c2VkJywgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLmVsYXBzZWQgPSB0aGlzLnN0YXJ0QXQ7XHJcbiAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXBlYXRDb3VudCA9ICh0aGlzLnJlcGVhdCA9PT0gLTEgfHwgdGhpcy5sb29wKSA/IDk5OTk5OTk5OTk5OSA6IHRoaXMucmVwZWF0O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcm9ncmVzcyBvZiB0aGUgY3VycmVudCBpdGVyYXRpb24sIG5vdCBmYWN0b3JpbmcgaW4gcmVwZWF0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5UaW1lLlRpbWVyRXZlbnQjZ2V0UHJvZ3Jlc3NcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBwcm9ncmVzcy5cclxuICAgICAqL1xyXG4gICAgZ2V0UHJvZ3Jlc3M6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmVsYXBzZWQgLyB0aGlzLmRlbGF5KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcm9ncmVzcyBvZiB0aGUgdGltZXIgb3ZlcmFsbCwgZmFjdG9yaW5nIGluIHJlcGVhdHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2dldE92ZXJhbGxQcm9ncmVzc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgb3ZlcmFsbCBwcm9ncmVzcyBvZiB0aGUgVGltZXIgRXZlbnQsIGJldHdlZW4gMCBhbmQgMS5cclxuICAgICAqL1xyXG4gICAgZ2V0T3ZlcmFsbFByb2dyZXNzOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnJlcGVhdCA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdG90YWxEdXJhdGlvbiA9IHRoaXMuZGVsYXkgKyAodGhpcy5kZWxheSAqIHRoaXMucmVwZWF0KTtcclxuICAgICAgICAgICAgdmFyIHRvdGFsRWxhcHNlZCA9IHRoaXMuZWxhcHNlZCArICh0aGlzLmRlbGF5ICogKHRoaXMucmVwZWF0IC0gdGhpcy5yZXBlYXRDb3VudCkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICh0b3RhbEVsYXBzZWQgLyB0b3RhbER1cmF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvZ3Jlc3MoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgVGltZXIgRXZlbnQgd2lsbCByZXBlYXQgYmVmb3JlIGZpbmlzaGluZy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBUaW1lciBFdmVudCB3aWxsIGZpcmUgYmVmb3JlIGZpbmlzaGluZy4gQSByZXR1cm4gdmFsdWUgb2YgMCBkb2Vzbid0IGluZGljYXRlIHRoYXQgdGhlIFRpbWVyIEV2ZW50IGhhcyBmaW5pc2hlZCBydW5uaW5nIC0gaXQgaW5kaWNhdGVzIHRoYXQgaXQgd2lsbCBub3QgcmVwZWF0IGFmdGVyIHRoZSBuZXh0IHRpbWUgaXQgZmlyZXMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2dldFJlcGVhdENvdW50XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhvdyBtYW55IHRpbWVzIHRoZSBUaW1lciBFdmVudCB3aWxsIHJlcGVhdC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVwZWF0Q291bnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwZWF0Q291bnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbG9jYWwgZWxhcHNlZCB0aW1lIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gb2YgdGhlIFRpbWVyIEV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbWUuVGltZXJFdmVudCNnZXRFbGFwc2VkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsb2NhbCBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBnZXRFbGFwc2VkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsYXBzZWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbG9jYWwgZWxhcHNlZCB0aW1lIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gb2YgdGhlIFRpbWVyIEV2ZW50IGluIHNlY29uZHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5UaW1lckV2ZW50I2dldEVsYXBzZWRTZWNvbmRzXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsb2NhbCBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcy5cclxuICAgICAqL1xyXG4gICAgZ2V0RWxhcHNlZFNlY29uZHM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxhcHNlZCAqIDAuMDAxO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvcmNlcyB0aGUgVGltZXIgRXZlbnQgdG8gaW1tZWRpYXRlbHkgZXhwaXJlLCB0aHVzIHNjaGVkdWxpbmcgaXRzIHJlbW92YWwgaW4gdGhlIG5leHQgZnJhbWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVGltZS5UaW1lckV2ZW50I3JlbW92ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGlzcGF0Y2hDYWxsYmFjaz1mYWxzZV0gLSBJZiBgdHJ1ZWAsIHRoZSBmdW5jdGlvbiBvZiB0aGUgVGltZXIgRXZlbnQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGl0cyByZW1vdmFsLlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uIChkaXNwYXRjaENhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChkaXNwYXRjaENhbGxiYWNrID09PSB1bmRlZmluZWQpIHsgZGlzcGF0Y2hDYWxsYmFjayA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxhcHNlZCA9IHRoaXMuZGVsYXk7XHJcblxyXG4gICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZCA9ICFkaXNwYXRjaENhbGxiYWNrO1xyXG5cclxuICAgICAgICB0aGlzLnJlcGVhdENvdW50ID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyBhbGwgb2JqZWN0IHJlZmVyZW5jZXMgaW4gdGhlIFRpbWVyIEV2ZW50LCBpLmUuIGl0cyBjYWxsYmFjaywgc2NvcGUsIGFuZCBhcmd1bWVudHMuXHJcbiAgICAgKlxyXG4gICAgICogTm9ybWFsbHksIHRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBDbG9jayB3aGVuIGl0IHNodXRzIGRvd24uIEFzIHN1Y2gsIGl0IGRvZXNuJ3Qgc3RvcCB0aGUgVGltZXIgRXZlbnQuIElmIGNhbGxlZCBtYW51YWxseSwgdGhlIFRpbWVyIEV2ZW50IHdpbGwgc3RpbGwgYmUgdXBkYXRlZCBieSB0aGUgQ2xvY2ssIGJ1dCBpdCB3b24ndCBkbyBhbnl0aGluZyB3aGVuIGl0IGZpcmVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlRpbWUuVGltZXJFdmVudCNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tTY29wZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmFyZ3MgPSBbXTtcclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaW1lckV2ZW50O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5UaW1lXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ2xvY2s6IHJlcXVpcmUoJy4vQ2xvY2snKSxcclxuICAgIFRpbWVyRXZlbnQ6IHJlcXVpcmUoJy4vVGltZXJFdmVudCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbGFzcyA9IHJlcXVpcmUoJy4uL3V0aWxzL0NsYXNzJyk7XHJcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJyk7XHJcbnZhciBFdmVudHMgPSByZXF1aXJlKCcuL2V2ZW50cycpO1xyXG52YXIgVHdlZW5CdWlsZGVyID0gcmVxdWlyZSgnLi9idWlsZGVycy9Ud2VlbkJ1aWxkZXInKTtcclxudmFyIFRXRUVOX0NPTlNUID0gcmVxdWlyZSgnLi90d2Vlbi9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUaW1lbGluZSBjb21iaW5lcyBtdWx0aXBsZSBUd2VlbnMgaW50byBvbmUuIEl0cyBvdmVyYWxsIGJlaGF2aW9yIGlzIG90aGVyd2lzZSBzaW1pbGFyIHRvIGEgc2luZ2xlIFR3ZWVuLlxyXG4gKlxyXG4gKiBUaGUgVGltZWxpbmUgdXBkYXRlcyBhbGwgb2YgaXRzIFR3ZWVucyBzaW11bHRhbmVvdXNseS4gSXRzIG1ldGhvZHMgYWxsb3cgeW91IHRvIGVhc2lseSBidWlsZCBhIHNlcXVlbmNlXHJcbiAqIG9mIFR3ZWVucyAoZWFjaCBvbmUgc3RhcnRpbmcgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZSkgb3IgcnVuIG11bHRpcGxlIFR3ZWVucyBhdCBvbmNlIGR1cmluZyBnaXZlbiBwYXJ0cyBvZiB0aGUgVGltZWxpbmUuXHJcbiAqXHJcbiAqIEBjbGFzcyBUaW1lbGluZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlR3ZWVuc1xyXG4gKiBAZXh0ZW5kcyBQaGFzZXIuRXZlbnRzLkV2ZW50RW1pdHRlclxyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ9IG1hbmFnZXIgLSBUaGUgVHdlZW4gTWFuYWdlciB3aGljaCBvd25zIHRoaXMgVGltZWxpbmUuXHJcbiAqL1xyXG52YXIgVGltZWxpbmUgPSBuZXcgQ2xhc3Moe1xyXG5cclxuICAgIEV4dGVuZHM6IEV2ZW50RW1pdHRlcixcclxuXHJcbiAgICBpbml0aWFsaXplOlxyXG5cclxuICAgIGZ1bmN0aW9uIFRpbWVsaW5lIChtYW5hZ2VyKVxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgVHdlZW4gTWFuYWdlciB3aGljaCBvd25zIHRoaXMgVGltZWxpbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI21hbmFnZXJcclxuICAgICAgICAgKiBAdHlwZSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSBjb25zdGFudCB2YWx1ZSB3aGljaCBhbGxvd3MgdGhpcyBUaW1lbGluZSB0byBiZSBlYXNpbHkgaWRlbnRpZmllZCBhcyBvbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2lzVGltZWxpbmVcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1RpbWVsaW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVHdlZW4gb2JqZWN0cywgZWFjaCBjb250YWluaW5nIGEgdW5pcXVlIHByb3BlcnR5IGFuZCB0YXJnZXQgYmVpbmcgdHdlZW5lZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjZGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAZGVmYXVsdCBbXVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY2FjaGVkIHNpemUgb2YgdGhlIGRhdGEgYXJyYXkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI3RvdGFsRGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxEYXRhID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSB0aGVuIGR1cmF0aW9uLCBkZWxheSwgZXRjIHZhbHVlcyBhcmUgYWxsIGZyYW1lIHRvdGFscywgcmF0aGVyIHRoYW4gbXMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI3VzZUZyYW1lc1xyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51c2VGcmFtZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2NhbGVzIHRoZSB0aW1lIGFwcGxpZWQgdG8gdGhpcyBUaW1lbGluZS4gQSB2YWx1ZSBvZiAxIHJ1bnMgaW4gcmVhbC10aW1lLiBBIHZhbHVlIG9mIDAuNSBydW5zIDUwJSBzbG93ZXIsIGFuZCBzbyBvbi5cclxuICAgICAgICAgKiBWYWx1ZSBpc24ndCB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdG90YWwgZHVyYXRpb24gb2YgdGhlIFRpbWVsaW5lLCBpdCdzIGEgcnVuLXRpbWUgZGVsdGEgYWRqdXN0bWVudCBvbmx5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSN0aW1lU2NhbGVcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDFcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IDE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIExvb3AgdGhpcyBUaW1lbGluZT8gQ2FuIGJlIC0xIGZvciBhbiBpbmZpbml0ZSBsb29wLCBvciBhbiBpbnRlZ2VyLlxyXG4gICAgICAgICAqIFdoZW4gZW5hYmxlZCBpdCB3aWxsIHBsYXkgdGhyb3VnaCBBTEwgVHdlZW5zIGFnYWluICh1c2UgVHdlZW4ucmVwZWF0IHRvIGxvb3AgYSBzaW5nbGUgdHdlZW4pXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2xvb3BcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3AgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaW1lIGluIG1zL2ZyYW1lcyBiZWZvcmUgdGhpcyBUaW1lbGluZSBsb29wcy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjbG9vcERlbGF5XHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb29wRGVsYXkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIb3cgbWFueSBsb29wcyBhcmUgbGVmdCB0byBydW4/XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2xvb3BDb3VudGVyXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5sb29wQ291bnRlciA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRpbWUgaW4gbXMvZnJhbWVzIGJlZm9yZSB0aGUgJ29uQ29tcGxldGUnIGV2ZW50IGZpcmVzLiBUaGlzIG5ldmVyIGZpcmVzIGlmIGxvb3AgPSB0cnVlIChhcyBpdCBuZXZlciBjb21wbGV0ZXMpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2NvbXBsZXRlRGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXBsZXRlRGVsYXkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb3VudGRvd24gdGltZXIgdmFsdWUsIGFzIHVzZWQgYnkgYGxvb3BEZWxheWAgYW5kIGBjb21wbGV0ZURlbGF5YC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjY291bnRkb3duXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jb3VudGRvd24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgVGltZWxpbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI3N0YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBFTkRJTkdfQUREO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgc3RhdGUgb2YgdGhlIFRpbWVsaW5lIHdoZW4gaXQgd2FzIHBhdXNlZCAodXNlZCBieSBSZXN1bWUpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI19wYXVzZWRTdGF0ZVxyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fcGF1c2VkU3RhdGUgPSBUV0VFTl9DT05TVC5QRU5ESU5HX0FERDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRG9lcyB0aGUgVGltZWxpbmUgc3RhcnQgb2ZmIHBhdXNlZD8gKGlmIHNvIGl0IG5lZWRzIHRvIGJlIHN0YXJ0ZWQgd2l0aCBUaW1lbGluZS5wbGF5KVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNwYXVzZWRcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEVsYXBzZWQgdGltZSBpbiBtcy9mcmFtZXMgb2YgdGhpcyBydW4gdGhyb3VnaCBvZiB0aGUgVGltZWxpbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2VsYXBzZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmVsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUb3RhbCBlbGFwc2VkIHRpbWUgaW4gbXMvZnJhbWVzIG9mIHRoZSBlbnRpcmUgVGltZWxpbmUsIGluY2x1ZGluZyBsb29waW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSN0b3RhbEVsYXBzZWRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdGFsRWxhcHNlZCA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRpbWUgaW4gbXMvZnJhbWVzIGZvciB0aGUgd2hvbGUgVGltZWxpbmUgdG8gcGxheSB0aHJvdWdoIG9uY2UsIGV4Y2x1ZGluZyBsb29wIGFtb3VudHMgYW5kIGxvb3AgZGVsYXlzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNkdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDEuIFRoZSBhbW91bnQgb2YgcHJvZ3Jlc3MgdGhyb3VnaCB0aGUgVGltZWxpbmUsIF9leGNsdWRpbmcgbG9vcHNfLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNwcm9ncmVzc1xyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaW1lIGluIG1zL2ZyYW1lcyBmb3IgYWxsIFR3ZWVucyBpbiB0aGlzIFRpbWVsaW5lIHRvIGNvbXBsZXRlIChpbmNsdWRpbmcgbG9vcGluZylcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjdG90YWxEdXJhdGlvblxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxEdXJhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFZhbHVlIGJldHdlZW4gMCBhbmQgMS4gVGhlIGFtb3VudCB0aHJvdWdoIHRoZSBlbnRpcmUgVGltZWxpbmUsIGluY2x1ZGluZyBsb29waW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSN0b3RhbFByb2dyZXNzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbFByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRpZmZlcmVudCBUd2VlbiBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogWW91IGNhbiBlaXRoZXIgc2V0IHRoZXNlIGluIHRoZSBUd2VlbiBjb25maWcsIG9yIGJ5IGNhbGxpbmcgdGhlIGBUd2Vlbi5zZXRDYWxsYmFja2AgbWV0aG9kLlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIGBvbkNvbXBsZXRlYCBXaGVuIHRoZSBUaW1lbGluZSBmaW5pc2hlcyBwbGF5YmFjayBmdWxseSBvciBgVGltZWxpbmUuc3RvcGAgaXMgY2FsbGVkLiBOZXZlciBpbnZva2VkIGlmIHRpbWVsaW5lIGlzIHNldCB0byByZXBlYXQgaW5maW5pdGVseS5cclxuICAgICAgICAgKiBgb25Mb29wYCBXaGVuIGEgVGltZWxpbmUgbG9vcHMuXHJcbiAgICAgICAgICogYG9uU3RhcnRgIFdoZW4gdGhlIFRpbWVsaW5lIHN0YXJ0cyBwbGF5aW5nLlxyXG4gICAgICAgICAqIGBvblVwZGF0ZWAgV2hlbiBhIFRpbWVsaW5lIHVwZGF0ZXMgYSBjaGlsZCBUd2Vlbi5cclxuICAgICAgICAgKiBgb25Zb3lvYCBXaGVuIGEgVGltZWxpbmUgc3RhcnRzIGEgeW95by5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjY2FsbGJhY2tzXHJcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IHtcclxuICAgICAgICAgICAgb25Db21wbGV0ZTogbnVsbCxcclxuICAgICAgICAgICAgb25Mb29wOiBudWxsLFxyXG4gICAgICAgICAgICBvblN0YXJ0OiBudWxsLFxyXG4gICAgICAgICAgICBvblVwZGF0ZTogbnVsbCxcclxuICAgICAgICAgICAgb25Zb3lvOiBudWxsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbnRleHQgaW4gd2hpY2ggYWxsIGNhbGxiYWNrcyBhcmUgaW52b2tlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjY2FsbGJhY2tTY29wZVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWxsYmFja1Njb3BlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHdpbGwgZW1pdCBhIFRpbWVsaW5lIGJhc2VkIEV2ZW50IGFuZCBpbnZva2UgdGhlIGdpdmVuIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNkaXNwYXRjaFRpbWVsaW5lRXZlbnRcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Ud2VlbnMuRXZlbnR9IGV2ZW50IC0gVGhlIEV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkLiBDYW4gYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgaW52b2NhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZGlzcGF0Y2hUaW1lbGluZUV2ZW50OiBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW1pdChldmVudCwgdGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChjYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmZ1bmMuYXBwbHkoY2FsbGJhY2suc2NvcGUsIGNhbGxiYWNrLnBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aW1lIHNjYWxlIGFwcGxpZWQgdG8gdGhpcyBUaW1lbGluZS4gQSB2YWx1ZSBvZiAxIHJ1bnMgaW4gcmVhbC10aW1lLlxyXG4gICAgICogQSB2YWx1ZSBvZiAwLjUgcnVucyA1MCUgc2xvd2VyLCBhbmQgc28gb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB2YWx1ZSBpc24ndCB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdG90YWwgZHVyYXRpb24gb2YgdGhlIHR3ZWVuLCBpdCdzIGEgcnVuLXRpbWUgZGVsdGEgYWRqdXN0bWVudCBvbmx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNzZXRUaW1lU2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW1lIHNjYWxlIHZhbHVlIHRvIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbWVsaW5lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VGltZVNjYWxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aW1lU2NhbGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRpbWUgc2NhbGUgYXBwbGllZCB0byB0aGlzIFRpbWVsaW5lLiBBIHZhbHVlIG9mIDEgcnVucyBpbiByZWFsLXRpbWUuXHJcbiAgICAgKiBBIHZhbHVlIG9mIDAuNSBydW5zIDUwJSBzbG93ZXIsIGFuZCBzbyBvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjZ2V0VGltZVNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgdGltZSBzY2FsZSBhcHBsaWVkIHRvIHRoaXMgVGltZWxpbmUuXHJcbiAgICAgKi9cclxuICAgIGdldFRpbWVTY2FsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aW1lU2NhbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIFRpbWVsaW5lIGlzIHBsYXlpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2lzUGxheWluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoaXMgVGltZWxpbmUgaXMgYWN0aXZlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNQbGF5aW5nOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuQUNUSVZFKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFR3ZWVuLCBiYXNlZCBvbiB0aGUgZ2l2ZW4gVHdlZW4gQ29uZmlnLCBhbmQgYWRkcyBpdCB0byB0aGlzIFRpbWVsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNhZGRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KFBoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5CdWlsZGVyQ29uZmlnfG9iamVjdCl9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFR3ZWVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGltZWxpbmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUoVHdlZW5CdWlsZGVyKHRoaXMsIGNvbmZpZykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXhpc3RpbmcgVHdlZW4gdG8gdGhpcyBUaW1lbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjcXVldWVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBUaGUgVHdlZW4gdG8gYmUgYWRkZWQgdG8gdGhpcyBUaW1lbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbWVsaW5lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcXVldWU6IGZ1bmN0aW9uICh0d2VlbilcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNQbGF5aW5nKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0d2Vlbi5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB0d2Vlbi5wYXJlbnRJc1RpbWVsaW5lID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudG90YWxEYXRhID0gdGhpcy5kYXRhLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyB3aGV0aGVyIGEgVHdlZW4gaGFzIGFuIG9mZnNldCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjaGFzT2Zmc2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Ud2VlbnMuVHdlZW59IHR3ZWVuIC0gVGhlIFR3ZWVuIHRvIGNoZWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdHdlZW4gaGFzIGEgbm9uLW51bGwgb2Zmc2V0LlxyXG4gICAgICovXHJcbiAgICBoYXNPZmZzZXQ6IGZ1bmN0aW9uICh0d2VlbilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHR3ZWVuLm9mZnNldCAhPT0gbnVsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG9mZnNldCB2YWx1ZSBpcyBhIG51bWJlciBvciBhIGRpcmVjdGl2ZSB0aGF0IGlzIHJlbGF0aXZlIHRvIHByZXZpb3VzIHR3ZWVucy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjaXNPZmZzZXRBYnNvbHV0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG9mZnNldCB2YWx1ZSB0byBiZSBldmFsdWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZXN1bHQgaXMgYSBudW1iZXIsIGBmYWxzZWAgaWYgaXQgaXMgYSBkaXJlY3RpdmUgbGlrZSBcIiAtPSAxMDAwXCIuXHJcbiAgICAgKi9cclxuICAgIGlzT2Zmc2V0QWJzb2x1dGU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHR5cGVvZih2YWx1ZSkgPT09ICdudW1iZXInKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIG9mZnNldCBpcyBhIHJlbGF0aXZlIHZhbHVlIHJhdGhlciB0aGFuIGFuIGFic29sdXRlIG9uZS5cclxuICAgICAqIElmIHRoZSB2YWx1ZSBpcyBqdXN0IGEgbnVtYmVyLCB0aGlzIHJldHVybnMgZmFsc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2lzT2Zmc2V0UmVsYXRpdmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBvZmZzZXQgdmFsdWUgdG8gYmUgZXZhbHVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgcmVsYXRpdmUsIGkuZSBcIiAtPSAxMDAwXCIuIElmIGBmYWxzZWAsIHRoZSBvZmZzZXQgaXMgYWJzb2x1dGUuXHJcbiAgICAgKi9cclxuICAgIGlzT2Zmc2V0UmVsYXRpdmU6IGZ1bmN0aW9uICh2YWx1ZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgdCA9IHR5cGVvZih2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICh0ID09PSAnc3RyaW5nJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBvcCA9IHZhbHVlWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wID09PSAnLScgfHwgb3AgPT09ICcrJylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgdGhlIHJlbGF0aXZlIG9mZnNldCB2YWx1ZSwgcmV0dXJuaW5nIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgbnVtYmVyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNnZXRSZWxhdGl2ZU9mZnNldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIHJlbGF0aXZlIG9mZnNldCwgaW4gdGhlIGZvcm1hdCBvZiAnLT01MDAnLCBmb3IgZXhhbXBsZS4gVGhlIGZpcnN0IGNoYXJhY3RlciBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgd2lsbCBiZSBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIG51bWJlci4gU3BhY2luZyBtYXR0ZXJzIGhlcmUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZSAtIFRoZSB2YWx1ZSB0byB1c2UgYXMgdGhlIG9mZnNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYXJzZWQgb2Zmc2V0IHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRSZWxhdGl2ZU9mZnNldDogZnVuY3Rpb24gKHZhbHVlLCBiYXNlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvcCA9IHZhbHVlWzBdO1xyXG4gICAgICAgIHZhciBudW0gPSBwYXJzZUZsb2F0KHZhbHVlLnN1YnN0cigyKSk7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2U7XHJcblxyXG4gICAgICAgIHN3aXRjaCAob3ApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlICcrJzpcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBudW07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJy0nOlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0IC09IG51bTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIENhbm5vdCBldmVyIGJlIDwgMFxyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCByZXN1bHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSB0aW1lbGluZS5cclxuICAgICAqIFxyXG4gICAgICogQ29tcHV0ZXMgYWxsIHR3ZWVuIGR1cmF0aW9ucyBhbmQgcmV0dXJucyB0aGUgZnVsbCBkdXJhdGlvbiBvZiB0aGUgdGltZWxpbmUuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSByZXN1bHRpbmcgbnVtYmVyIGlzIHN0b3JlZCBpbiB0aGUgdGltZWxpbmUsIG5vdCBhcyBhIHJldHVybiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjY2FsY0R1cmF0aW9uXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgY2FsY0R1cmF0aW9uOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBwcmV2RW5kID0gMDtcclxuICAgICAgICB2YXIgdG90YWxEdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgdmFyIG9mZnNldER1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvdGFsRGF0YTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHR3ZWVuID0gdGhpcy5kYXRhW2ldO1xyXG5cclxuICAgICAgICAgICAgdHdlZW4uaW5pdCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT2Zmc2V0KHR3ZWVuKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPZmZzZXRBYnNvbHV0ZSh0d2Vlbi5vZmZzZXQpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICBBbiBhY3R1YWwgbnVtYmVyLCBzbyBpdCBkZWZpbmVzIHRoZSBzdGFydCBwb2ludCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRpbWVsaW5lXHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW4uY2FsY3VsYXRlZE9mZnNldCA9IHR3ZWVuLm9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR3ZWVuLm9mZnNldCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldER1cmF0aW9uID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzT2Zmc2V0UmVsYXRpdmUodHdlZW4ub2Zmc2V0KSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgQSByZWxhdGl2ZSBvZmZzZXQgKGkuZS4gJy09MTAwMCcsIHNvIHN0YXJ0cyBhdCAnb2Zmc2V0JyBtcyByZWxhdGl2ZSB0byB0aGUgUFJFVklPVVMgVHdlZW5zIGVuZGluZyB0aW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuLmNhbGN1bGF0ZWRPZmZzZXQgPSB0aGlzLmdldFJlbGF0aXZlT2Zmc2V0KHR3ZWVuLm9mZnNldCwgcHJldkVuZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgU2VxdWVudGlhbFxyXG4gICAgICAgICAgICAgICAgdHdlZW4uY2FsY3VsYXRlZE9mZnNldCA9IG9mZnNldER1cmF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwcmV2RW5kID0gdHdlZW4udG90YWxEdXJhdGlvbiArIHR3ZWVuLmNhbGN1bGF0ZWRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IHR3ZWVuLnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgICAgIG9mZnNldER1cmF0aW9uICs9IHR3ZWVuLnRvdGFsRHVyYXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgRXhjbHVkZXMgbG9vcCB2YWx1ZXNcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gdG90YWxEdXJhdGlvbjtcclxuXHJcbiAgICAgICAgdGhpcy5sb29wQ291bnRlciA9ICh0aGlzLmxvb3AgPT09IC0xKSA/IDk5OTk5OTk5OTk5OSA6IHRoaXMubG9vcDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubG9vcENvdW50ZXIgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy50b3RhbER1cmF0aW9uID0gdGhpcy5kdXJhdGlvbiArIHRoaXMuY29tcGxldGVEZWxheSArICgodGhpcy5kdXJhdGlvbiArIHRoaXMubG9vcERlbGF5KSAqIHRoaXMubG9vcENvdW50ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uICsgdGhpcy5jb21wbGV0ZURlbGF5O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgdGltZWxpbmUsIHdoaWNoIG1lYW5zIGFsbCBUd2VlbnMgZ2V0IHRoZWlyIGluaXQoKSBjYWxsZWQsIGFuZCB0aGUgdG90YWwgZHVyYXRpb24gd2lsbCBiZSBjb21wdXRlZC5cclxuICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGltZWxpbmUgaXMgYXV0by1zdGFydGVkIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjaW5pdFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBUaW1lbGluZSBpcyBzdGFydGVkLiBgZmFsc2VgIGlmIGl0IGlzIHBhdXNlZC5cclxuICAgICAqL1xyXG4gICAgaW5pdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNhbGNEdXJhdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsUHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXVzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEFVU0VEO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIGFsbCBvZiB0aGUgdGltZWxpbmUncyB0d2VlbnMgYmFjayB0byB0aGVpciBpbml0aWFsIHN0YXRlcy5cclxuICAgICAqIFRoZSBib29sZWFuIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0d2VlbnMgdGhhdCBhcmUgbG9vcGluZyBzaG91bGQgcmVzZXQgYXMgd2VsbCwgb3Igbm90LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNyZXNldFR3ZWVuc1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXNldEZyb21Mb29wIC0gSWYgYHRydWVgLCByZXNldHMgYWxsIGxvb3BpbmcgdHdlZW5zIHRvIHRoZWlyIGluaXRpYWwgdmFsdWVzLlxyXG4gICAgICovXHJcbiAgICByZXNldFR3ZWVuczogZnVuY3Rpb24gKHJlc2V0RnJvbUxvb3ApXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvdGFsRGF0YTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHR3ZWVuID0gdGhpcy5kYXRhW2ldO1xyXG5cclxuICAgICAgICAgICAgdHdlZW4ucGxheShyZXNldEZyb21Mb29wKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIGNhbGxiYWNrIGZvciB0aGUgVGltZWxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI3NldENhbGxiYWNrXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBpbnRlcm5hbCB0eXBlIG9mIGNhbGxiYWNrIHRvIHNldC5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gVGltZWxpbmUgYWxsb3dzIG11bHRpcGxlIHR3ZWVucyB0byBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gY3JlYXRlIGEgc3RyZWFtaW5nIHNlcXVlbmNlLlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBjYWxsYmFjay5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc2NvcGVdIC0gVGhlIGNvbnRleHQgc2NvcGUgb2YgdGhlIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVGltZWxpbmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRDYWxsYmFjazogZnVuY3Rpb24gKHR5cGUsIGNhbGxiYWNrLCBwYXJhbXMsIHNjb3BlKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChUaW1lbGluZS5UWVBFUy5pbmRleE9mKHR5cGUpICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW3R5cGVdID0geyBmdW5jOiBjYWxsYmFjaywgc2NvcGU6IHNjb3BlLCBwYXJhbXM6IHBhcmFtcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFzc2VkIGEgVHdlZW4gdG8gdGhlIFR3ZWVuIE1hbmFnZXIgYW5kIHJlcXVlc3RzIGl0IGJlIG1hZGUgYWN0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNtYWtlQWN0aXZlXHJcbiAgICAgKiBAc2luY2UgMy4zLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5Ud2VlbnMuVHdlZW59IHR3ZWVuIC0gVGhlIHR3ZWVuIG9iamVjdCB0byBtYWtlIGFjdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlcn0gVGhlIFRpbWVsaW5lJ3MgVHdlZW4gTWFuYWdlciByZWZlcmVuY2UuXHJcbiAgICAgKi9cclxuICAgIG1ha2VBY3RpdmU6IGZ1bmN0aW9uICh0d2VlbilcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLm1ha2VBY3RpdmUodHdlZW4pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0cyBwbGF5aW5nIHRoZSBUaW1lbGluZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjcGxheVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RJTUVMSU5FX1NUQVJUXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgcGxheTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuQUNUSVZFKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFuYWdlci5tYWtlQWN0aXZlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHdlZW5zKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRpc3BhdGNoVGltZWxpbmVFdmVudChFdmVudHMuVElNRUxJTkVfU1RBUlQsIHRoaXMuY2FsbGJhY2tzLm9uU3RhcnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIFRpbWVsaW5lJ3MgYHN0YXRlYCBhbmQgZmlyZXMgY2FsbGJhY2tzIGFuZCBldmVudHMuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI25leHRTdGF0ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RJTUVMSU5FX0NPTVBMRVRFXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlR3ZWVucy5FdmVudHMjVElNRUxJTkVfTE9PUFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI3VwZGF0ZVxyXG4gICAgICovXHJcbiAgICBuZXh0U3RhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9vcENvdW50ZXIgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFJlc2V0IHRoZSBlbGFwc2VkIHRpbWVcclxuICAgICAgICAgICAgdGhpcy5lbGFwc2VkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvb3BDb3VudGVyLS07XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHdlZW5zKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubG9vcERlbGF5ID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGRvd24gPSB0aGlzLmxvb3BEZWxheTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuTE9PUF9ERUxBWTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFRpbWVsaW5lRXZlbnQoRXZlbnRzLlRJTUVMSU5FX0xPT1AsIHRoaXMuY2FsbGJhY2tzLm9uTG9vcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb21wbGV0ZURlbGF5ID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5DT01QTEVURV9ERUxBWTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY291bnRkb3duID0gdGhpcy5jb21wbGV0ZURlbGF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19SRU1PVkU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoVGltZWxpbmVFdmVudChFdmVudHMuVElNRUxJTkVfQ09NUExFVEUsIHRoaXMuY2FsbGJhY2tzLm9uQ29tcGxldGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zICd0cnVlJyBpZiB0aGlzIFRpbWVsaW5lIGhhcyBmaW5pc2hlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgVHdlZW4gTWFuYWdlci5cclxuICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjdXBkYXRlXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlR3ZWVucy5FdmVudHMjVElNRUxJTkVfQ09NUExFVEVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9VUERBVEVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lc3RhbXAgLSBUaGUgY3VycmVudCB0aW1lLiBFaXRoZXIgYSBIaWdoIFJlc29sdXRpb24gVGltZXIgdmFsdWUgaWYgaXQgY29tZXMgZnJvbSBSZXF1ZXN0IEFuaW1hdGlvbiBGcmFtZSwgb3IgRGF0ZS5ub3cgaWYgdXNpbmcgU2V0VGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIFRoZSBkZWx0YSB0aW1lIGluIG1zIHNpbmNlIHRoZSBsYXN0IGZyYW1lLiBUaGlzIGlzIGEgc21vb3RoZWQgYW5kIGNhcHBlZCB2YWx1ZSBiYXNlZCBvbiB0aGUgRlBTIHJhdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBUaW1lbGluZSBoYXMgZmluaXNoZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZTogZnVuY3Rpb24gKHRpbWVzdGFtcCwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBBVVNFRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVzZUZyYW1lcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbHRhID0gMSAqIHRoaXMubWFuYWdlci50aW1lU2NhbGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWx0YSAqPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcbiAgICAgICAgdGhpcy5lbGFwc2VkICs9IGRlbHRhO1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbih0aGlzLmVsYXBzZWQgLyB0aGlzLmR1cmF0aW9uLCAxKTtcclxuXHJcbiAgICAgICAgdGhpcy50b3RhbEVsYXBzZWQgKz0gZGVsdGE7XHJcbiAgICAgICAgdGhpcy50b3RhbFByb2dyZXNzID0gTWF0aC5taW4odGhpcy50b3RhbEVsYXBzZWQgLyB0aGlzLnRvdGFsRHVyYXRpb24sIDEpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFRXRUVOX0NPTlNULkFDVElWRTpcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc3RpbGxSdW5uaW5nID0gdGhpcy50b3RhbERhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvdGFsRGF0YTsgaSsrKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IHRoaXMuZGF0YVtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR3ZWVuLnVwZGF0ZSh0aW1lc3RhbXAsIGRlbHRhKSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsUnVubmluZy0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoVGltZWxpbmVFdmVudChFdmVudHMuVElNRUxJTkVfVVBEQVRFLCB0aGlzLmNhbGxiYWNrcy5vblVwZGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIEFueXRoaW5nIHN0aWxsIHJ1bm5pbmc/IElmIG5vdCwgd2UncmUgZG9uZVxyXG4gICAgICAgICAgICAgICAgaWYgKHN0aWxsUnVubmluZyA9PT0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5MT09QX0RFTEFZOlxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnRkb3duIC09IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvdW50ZG93biA8PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUaW1lbGluZUV2ZW50KEV2ZW50cy5USU1FTElORV9MT09QLCB0aGlzLmNhbGxiYWNrcy5vbkxvb3ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5DT01QTEVURV9ERUxBWTpcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZG93biAtPSBkZWx0YTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb3VudGRvd24gPD0gMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19SRU1PVkU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUaW1lbGluZUV2ZW50KEV2ZW50cy5USU1FTElORV9DT01QTEVURSwgdGhpcy5jYWxsYmFja3Mub25Db21wbGV0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKHRoaXMuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBFTkRJTkdfUkVNT1ZFKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyB0aGUgVGltZWxpbmUgaW1tZWRpYXRlbHksIHdoYXRldmVyIHN0YWdlIG9mIHByb2dyZXNzIGl0IGlzIGF0IGFuZCBmbGFncyBpdCBmb3IgcmVtb3ZhbCBieSB0aGUgVHdlZW5NYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNzdG9wXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc3RvcDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19SRU1PVkU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2VzIHRoZSBUaW1lbGluZSwgcmV0YWluaW5nIGl0cyBpbnRlcm5hbCBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG9uIGEgVGltZWxpbmUgdGhhdCBpcyBhbHJlYWR5IHBhdXNlZCBoYXMgbm8gZWZmZWN0IGFuZCBmaXJlcyBubyBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjcGF1c2VcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9QQVVTRVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUaW1lbGluZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5QQVVTRUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3BhdXNlZFN0YXRlID0gdGhpcy5zdGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBBVVNFRDtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5USU1FTElORV9QQVVTRSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgYSBwYXVzZWQgVGltZWxpbmUgZnJvbSB3aGVyZSBpdCB3YXMgd2hlbiBpdCB3YXMgcGF1c2VkLlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgb24gYSBUaW1lbGluZSB0aGF0IGlzbid0IHBhdXNlZCBoYXMgbm8gZWZmZWN0IGFuZCBmaXJlcyBubyBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVGltZWxpbmUjcmVzdW1lXHJcbiAgICAgKiBAZmlyZXMgUGhhc2VyLlR3ZWVucy5FdmVudHMjVElNRUxJTkVfUkVTVU1FXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFRpbWVsaW5lIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5QQVVTRUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuX3BhdXNlZFN0YXRlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KEV2ZW50cy5USU1FTElORV9SRVNVTUUsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFueSBvZiB0aGUgVHdlZW5zIGluIHRoaXMgVGltZWxpbmUgYXMgb3BlcmF0aW5nIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgbm8gVHdlZW5zIG9wZXJhdGUgb24gdGhlIHRhcmdldCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlRpbWVsaW5lI2hhc1RhcmdldFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gY2hlY2sgYWxsIFR3ZWVucyBhZ2FpbnN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBhIHNpbmdsZSBUd2VlbiB0aGF0IG9wZXJhdGVzIG9uIHRoZSB0YXJnZXQgb2JqZWN0LCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaGFzVGFyZ2V0OiBmdW5jdGlvbiAodGFyZ2V0KVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpXS5oYXNUYXJnZXQodGFyZ2V0KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbGwgdGhlIFR3ZWVucyBpbiB0aGUgVGltZWxpbmUgaW1tZWRpYXRlbHksIHdoYXRldmVyIHN0YWdlIG9mIHByb2dyZXNzIHRoZXkgYXJlIGF0IGFuZCBmbGFnc1xyXG4gICAgICogdGhlbSBmb3IgcmVtb3ZhbCBieSB0aGUgVHdlZW5NYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5UaW1lbGluZSNkZXN0cm95XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXS5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5UaW1lbGluZS5UWVBFUyA9IFsgJ29uU3RhcnQnLCAnb25VcGRhdGUnLCAnb25Mb29wJywgJ29uQ29tcGxldGUnLCAnb25Zb3lvJyBdO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUaW1lbGluZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQXJyYXlSZW1vdmUgPSByZXF1aXJlKCcuLi91dGlscy9hcnJheS9SZW1vdmUnKTtcclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIE51bWJlclR3ZWVuQnVpbGRlciA9IHJlcXVpcmUoJy4vYnVpbGRlcnMvTnVtYmVyVHdlZW5CdWlsZGVyJyk7XHJcbnZhciBQbHVnaW5DYWNoZSA9IHJlcXVpcmUoJy4uL3BsdWdpbnMvUGx1Z2luQ2FjaGUnKTtcclxudmFyIFNjZW5lRXZlbnRzID0gcmVxdWlyZSgnLi4vc2NlbmUvZXZlbnRzJyk7XHJcbnZhciBTdGFnZ2VyQnVpbGRlciA9IHJlcXVpcmUoJy4vYnVpbGRlcnMvU3RhZ2dlckJ1aWxkZXInKTtcclxudmFyIFRpbWVsaW5lQnVpbGRlciA9IHJlcXVpcmUoJy4vYnVpbGRlcnMvVGltZWxpbmVCdWlsZGVyJyk7XHJcbnZhciBUV0VFTl9DT05TVCA9IHJlcXVpcmUoJy4vdHdlZW4vY29uc3QnKTtcclxudmFyIFR3ZWVuQnVpbGRlciA9IHJlcXVpcmUoJy4vYnVpbGRlcnMvVHdlZW5CdWlsZGVyJyk7XHJcblxyXG4vKipcclxuICogQGNsYXNzZGVzY1xyXG4gKiBUaGUgVHdlZW4gTWFuYWdlciBpcyBhIGRlZmF1bHQgU2NlbmUgUGx1Z2luIHdoaWNoIGNvbnRyb2xzIGFuZCB1cGRhdGVzIFR3ZWVucyBhbmQgVGltZWxpbmVzLlxyXG4gKlxyXG4gKiBAY2xhc3MgVHdlZW5NYW5hZ2VyXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVHdlZW5zXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuU2NlbmV9IHNjZW5lIC0gVGhlIFNjZW5lIHdoaWNoIG93bnMgdGhpcyBUd2VlbiBNYW5hZ2VyLlxyXG4gKi9cclxudmFyIFR3ZWVuTWFuYWdlciA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgaW5pdGlhbGl6ZTpcclxuXHJcbiAgICBmdW5jdGlvbiBUd2Vlbk1hbmFnZXIgKHNjZW5lKVxyXG4gICAge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTY2VuZSB3aGljaCBvd25zIHRoaXMgVHdlZW4gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI3NjZW5lXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBTeXN0ZW1zIG9iamVjdCBvZiB0aGUgU2NlbmUgd2hpY2ggb3ducyB0aGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNzeXN0ZW1zXHJcbiAgICAgICAgICogQHR5cGUge1BoYXNlci5TY2VuZXMuU3lzdGVtc31cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN5c3RlbXMgPSBzY2VuZS5zeXM7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0aW1lIHNjYWxlIG9mIHRoZSBUd2VlbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogVGhpcyB2YWx1ZSBzY2FsZXMgdGhlIHRpbWUgZGVsdGEgYmV0d2VlbiB0d28gZnJhbWVzLCB0aHVzIGluZmx1ZW5jaW5nIHRoZSBzcGVlZCBvZiB0aW1lIGZvciBhbGwgVHdlZW5zIG93bmVkIGJ5IHRoaXMgVHdlZW4gTWFuYWdlci5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gYXJyYXkgb2YgVHdlZW5zIGFuZCBUaW1lbGluZXMgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byB0aGUgVHdlZW4gTWFuYWdlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjX2FkZFxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2FkZCA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBUd2VlbnMgYW5kIFRpbWVsaW5lcyBwZW5kaW5nIHRvIGJlIGxhdGVyIGFkZGVkIHRvIHRoZSBUd2VlbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjX3BlbmRpbmdcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wZW5kaW5nID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGFycmF5IG9mIFR3ZWVucyBhbmQgVGltZWxpbmVzIHdoaWNoIGFyZSBzdGlsbCBpbmNvbXBsZXRlIGFuZCBhcmUgYWN0aXZlbHkgcHJvY2Vzc2VkIGJ5IHRoZSBUd2VlbiBNYW5hZ2VyLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjX2FjdGl2ZVxyXG4gICAgICAgICAqIEB0eXBlIHthcnJheX1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IFtdO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBUd2VlbnMgYW5kIFRpbWVsaW5lcyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgVHdlZW4gTWFuYWdlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjX2Rlc3Ryb3lcclxuICAgICAgICAgKiBAdHlwZSB7YXJyYXl9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9kZXN0cm95ID0gW107XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBudW1iZXIgb2YgVHdlZW5zIGFuZCBUaW1lbGluZXMgd2hpY2ggbmVlZCB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIFR3ZWVuIE1hbmFnZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI190b1Byb2Nlc3NcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90b1Byb2Nlc3MgPSAwO1xyXG5cclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuQk9PVCwgdGhpcy5ib290LCB0aGlzKTtcclxuICAgICAgICBzY2VuZS5zeXMuZXZlbnRzLm9uKFNjZW5lRXZlbnRzLlNUQVJULCB0aGlzLnN0YXJ0LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSwgb25seSBvbmNlLCB3aGVuIHRoZSBTY2VuZSBpcyBmaXJzdCBjcmVhdGVkLlxyXG4gICAgICogRG8gbm90IGludm9rZSBpdCBkaXJlY3RseS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2Jvb3RcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAc2luY2UgMy41LjFcclxuICAgICAqL1xyXG4gICAgYm9vdDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN5c3RlbXMuZXZlbnRzLm9uY2UoU2NlbmVFdmVudHMuREVTVFJPWSwgdGhpcy5kZXN0cm95LCB0aGlzKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgU2NlbmUgd2hlbiBpdCBpcyBzdGFydGluZyB1cC5cclxuICAgICAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBsb2NhbCBzeXN0ZW1zLCBwcm9wZXJ0aWVzIGFuZCBsaXN0ZW5pbmcgZm9yIFNjZW5lIGV2ZW50cy5cclxuICAgICAqIERvIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNzdGFydFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBzaW5jZSAzLjUuMFxyXG4gICAgICovXHJcbiAgICBzdGFydDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyID0gdGhpcy5zeXN0ZW1zLmV2ZW50cztcclxuXHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMucHJlVXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub24oU2NlbmVFdmVudHMuVVBEQVRFLCB0aGlzLnVwZGF0ZSwgdGhpcyk7XHJcbiAgICAgICAgZXZlbnRFbWl0dGVyLm9uY2UoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWVTY2FsZSA9IDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgVHdlZW4gVGltZWxpbmUgYW5kIHJldHVybiBpdCwgYnV0IGRvIE5PVCBhZGQgaXQgdG8gdGhlIGFjdGl2ZSBvciBwZW5kaW5nIFR3ZWVuIGxpc3RzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjY3JlYXRlVGltZWxpbmVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5UaW1lbGluZUJ1aWxkZXJDb25maWd9IFtjb25maWddIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgVGltZWxpbmUgYW5kIGl0cyBUd2VlbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR3ZWVucy5UaW1lbGluZX0gVGhlIGNyZWF0ZWQgVGltZWxpbmUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVUaW1lbGluZTogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gVGltZWxpbmVCdWlsZGVyKHRoaXMsIGNvbmZpZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgVHdlZW4gVGltZWxpbmUgYW5kIGFkZCBpdCB0byB0aGUgYWN0aXZlIFR3ZWVuIGxpc3QvXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciN0aW1lbGluZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlRpbWVsaW5lQnVpbGRlckNvbmZpZ30gW2NvbmZpZ10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoZSBUaW1lbGluZSBhbmQgaXRzIFR3ZWVucy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlRpbWVsaW5lfSBUaGUgY3JlYXRlZCBUaW1lbGluZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHRpbWVsaW5lOiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aW1lbGluZSA9IFRpbWVsaW5lQnVpbGRlcih0aGlzLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoIXRpbWVsaW5lLnBhdXNlZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FkZC5wdXNoKHRpbWVsaW5lKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3RvUHJvY2VzcysrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbWVsaW5lO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIFR3ZWVuIGFuZCByZXR1cm4gaXQsIGJ1dCBkbyBOT1QgYWRkIGl0IHRvIHRoZSBhY3RpdmUgb3IgcGVuZGluZyBUd2VlbiBsaXN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2NyZWF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuQnVpbGRlckNvbmZpZ3xvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFR3ZWVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBjcmVhdGVkIFR3ZWVuIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiBmdW5jdGlvbiAoY29uZmlnKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBUd2VlbkJ1aWxkZXIodGhpcywgY29uZmlnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBUd2VlbiBhbmQgYWRkIGl0IHRvIHRoZSBhY3RpdmUgVHdlZW4gbGlzdC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2FkZFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuQnVpbGRlckNvbmZpZ3xvYmplY3R9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFR3ZWVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBjcmVhdGVkIFR3ZWVuLlxyXG4gICAgICovXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb25maWcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHR3ZWVuID0gVHdlZW5CdWlsZGVyKHRoaXMsIGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2FkZC5wdXNoKHR3ZWVuKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdG9Qcm9jZXNzKys7XHJcblxyXG4gICAgICAgIHJldHVybiB0d2VlbjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYW4gZXhpc3RpbmcgdHdlZW4gaW50byB0aGUgYWN0aXZlIFR3ZWVuIGxpc3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNleGlzdGluZ1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIFRoZSBUd2VlbiB0byBhZGQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ9IFRoaXMgVHdlZW4gTWFuYWdlciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGV4aXN0aW5nOiBmdW5jdGlvbiAodHdlZW4pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYWRkLnB1c2godHdlZW4pO1xyXG5cclxuICAgICAgICB0aGlzLl90b1Byb2Nlc3MrKztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgTnVtYmVyIFR3ZWVuIGFuZCBhZGQgaXQgdG8gdGhlIGFjdGl2ZSBUd2VlbiBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjYWRkQ291bnRlclxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLk51bWJlclR3ZWVuQnVpbGRlckNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgTnVtYmVyIFR3ZWVuLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBjcmVhdGVkIE51bWJlciBUd2Vlbi5cclxuICAgICAqL1xyXG4gICAgYWRkQ291bnRlcjogZnVuY3Rpb24gKGNvbmZpZylcclxuICAgIHtcclxuICAgICAgICB2YXIgdHdlZW4gPSBOdW1iZXJUd2VlbkJ1aWxkZXIodGhpcywgY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5fYWRkLnB1c2godHdlZW4pO1xyXG5cclxuICAgICAgICB0aGlzLl90b1Byb2Nlc3MrKztcclxuXHJcbiAgICAgICAgcmV0dXJuIHR3ZWVuO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBTdGFnZ2VyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgYSBUd2VlbiBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIHN0YWdnZXIgZnVuY3Rpb24gd2lsbCBhbGxvdyB5b3UgdG8gc3RhZ2dlciBjaGFuZ2VzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYWNyb3NzIGFsbCB0YXJnZXRzIG9mIHRoZSB0d2Vlbi5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyBvbmx5IHdvcnRoIHVzaW5nIGlmIHRoZSB0d2VlbiBoYXMgbXVsdGlwbGUgdGFyZ2V0cy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHN0YWdnZXIgdGhlIGRlbGF5IGJ5IDEwMG1zIGFjcm9zcyBhbGwgdGFyZ2V0cyBvZiB0aGUgdHdlZW4sIGNhdXNpbmcgdGhlbSB0byBzY2FsZSBkb3duIHRvIDAuMlxyXG4gICAgICogb3ZlciB0aGUgZHVyYXRpb24gc3BlY2lmaWVkOlxyXG4gICAgICogXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiB0aGlzLnR3ZWVucy5hZGQoe1xyXG4gICAgICogICAgIHRhcmdldHM6IFsgLi4uIF0sXHJcbiAgICAgKiAgICAgc2NhbGU6IDAuMixcclxuICAgICAqICAgICBlYXNlOiAnbGluZWFyJyxcclxuICAgICAqICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAqICAgICBkZWxheTogdGhpcy50d2VlbnMuc3RhZ2dlcigxMDApXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGBgYFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgc3RhZ2dlciB0aGUgZGVsYXkgYnkgNTAwbXMgYWNyb3NzIGFsbCB0YXJnZXRzIG9mIHRoZSB0d2VlbiB1c2luZyBhIDEwIHggNiBncmlkLCBzdGFnZ2VyaW5nXHJcbiAgICAgKiBmcm9tIHRoZSBjZW50ZXIgb3V0LCB1c2luZyBhIGN1YmljIGVhc2UuXHJcbiAgICAgKiBcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHRoaXMudHdlZW5zLmFkZCh7XHJcbiAgICAgKiAgICAgdGFyZ2V0czogWyAuLi4gXSxcclxuICAgICAqICAgICBzY2FsZTogMC4yLFxyXG4gICAgICogICAgIGVhc2U6ICdsaW5lYXInLFxyXG4gICAgICogICAgIGR1cmF0aW9uOiAxMDAwLFxyXG4gICAgICogICAgIGRlbGF5OiB0aGlzLnR3ZWVucy5zdGFnZ2VyKDUwMCwgeyBncmlkOiBbIDEwLCA2IF0sIGZyb206ICdjZW50ZXInLCBlYXNlOiAnY3ViaWMub3V0JyB9KVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI3N0YWdnZXJcclxuICAgICAqIEBzaW5jZSAzLjE5LjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSB2YWx1ZSAtIFRoZSBhbW91bnQgdG8gc3RhZ2dlciBieSwgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0d28gZWxlbWVudHMgcmVwcmVzZW50aW5nIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgdG8gc3RhZ2dlciBiZXR3ZWVuLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlN0YWdnZXJDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFN0YWdnZXIgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBzdGFnZ2VyIGZ1bmN0aW9uLlxyXG4gICAgICovXHJcbiAgICBzdGFnZ2VyOiBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFN0YWdnZXJCdWlsZGVyKHZhbHVlLCBvcHRpb25zKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBUd2VlbiBNYW5hZ2VyJ3MgaW50ZXJuYWwgbGlzdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBjaGFuZ2VzIGhhdmUgYmVlbiBpbmRpY2F0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNwcmVVcGRhdGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBwcmVVcGRhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvUHJvY2VzcyA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBRdWljayBiYWlsXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5fZGVzdHJveTtcclxuICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5fYWN0aXZlO1xyXG4gICAgICAgIHZhciBwZW5kaW5nID0gdGhpcy5fcGVuZGluZztcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgdHdlZW47XHJcblxyXG4gICAgICAgIC8vICBDbGVhciB0aGUgJ2Rlc3Ryb3knIGxpc3RcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBSZW1vdmUgZnJvbSB0aGUgJ2FjdGl2ZScgYXJyYXlcclxuICAgICAgICAgICAgdmFyIGlkeCA9IGFjdGl2ZS5pbmRleE9mKHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpZHggPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgTm90IGluIHRoZSBhY3RpdmUgYXJyYXksIGlzIGl0IGluIHBlbmRpbmcgaW5zdGVhZD9cclxuICAgICAgICAgICAgICAgIGlkeCA9IHBlbmRpbmcuaW5kZXhPZih0d2Vlbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+IC0xKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuLnN0YXRlID0gVFdFRU5fQ09OU1QuUkVNT1ZFRDtcclxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHdlZW4uc3RhdGUgPSBUV0VFTl9DT05TVC5SRU1PVkVEO1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsaXN0Lmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIC8vICBQcm9jZXNzIHRoZSBhZGRpdGlvbiBsaXN0XHJcbiAgICAgICAgLy8gIFRoaXMgc3RvcHMgY2FsbGJhY2tzIGFuZCBvdXQgb2Ygc3luYyBldmVudHMgZnJvbSBwb3B1bGF0aW5nIHRoZSBhY3RpdmUgYXJyYXkgbWlkLXdheSBkdXJpbmcgdGhlIHVwZGF0ZVxyXG5cclxuICAgICAgICBsaXN0ID0gdGhpcy5fYWRkO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2Vlbi5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUEVORElOR19BREQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBSZXR1cm4gdHJ1ZSBpZiB0aGUgVHdlZW4gc2hvdWxkIGJlIHN0YXJ0ZWQgcmlnaHQgYXdheSwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgICAgICAgICAgICBpZiAodHdlZW4uaW5pdCgpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuLnBsYXkoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlLnB1c2godHdlZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcucHVzaCh0d2Vlbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxpc3QubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5fdG9Qcm9jZXNzID0gMDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIGFsbCBUd2VlbnMgYW5kIFRpbWVsaW5lcyBvZiB0aGUgVHdlZW4gTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI3VwZGF0ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZXN0YW1wLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICAvLyAgUHJvY2VzcyBhY3RpdmUgdHdlZW5zXHJcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLl9hY3RpdmU7XHJcbiAgICAgICAgdmFyIHR3ZWVuO1xyXG5cclxuICAgICAgICAvLyAgU2NhbGUgdGhlIGRlbHRhXHJcbiAgICAgICAgZGVsdGEgKj0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vICBJZiBUd2Vlbi51cGRhdGUgcmV0dXJucyAndHJ1ZScgdGhlbiBpdCBtZWFucyBpdCBoYXMgY29tcGxldGVkLFxyXG4gICAgICAgICAgICAvLyAgc28gbW92ZSBpdCB0byB0aGUgZGVzdHJveSBsaXN0XHJcbiAgICAgICAgICAgIGlmICh0d2Vlbi51cGRhdGUodGltZXN0YW1wLCBkZWx0YSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3kucHVzaCh0d2Vlbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90b1Byb2Nlc3MrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiB0d2VlbiBmcm9tIHRoZSBUd2VlbiBNYW5hZ2VyLCByZWdhcmRsZXNzIG9mIGl0cyBzdGF0ZSAocGVuZGluZyBvciBhY3RpdmUpLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIFRoZSBUd2VlbiB0byBiZSByZW1vdmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfSBUaGlzIFR3ZWVuIE1hbmFnZXIgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uICh0d2VlbilcclxuICAgIHtcclxuICAgICAgICBBcnJheVJlbW92ZSh0aGlzLl9hZGQsIHR3ZWVuKTtcclxuICAgICAgICBBcnJheVJlbW92ZSh0aGlzLl9wZW5kaW5nLCB0d2Vlbik7XHJcbiAgICAgICAgQXJyYXlSZW1vdmUodGhpcy5fYWN0aXZlLCB0d2Vlbik7XHJcbiAgICAgICAgQXJyYXlSZW1vdmUodGhpcy5fZGVzdHJveSwgdHdlZW4pO1xyXG5cclxuICAgICAgICB0d2Vlbi5zdGF0ZSA9IFRXRUVOX0NPTlNULlJFTU9WRUQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhIFR3ZWVuIG9yIFRpbWVsaW5lIGlzIGFjdGl2ZSBhbmQgYWRkcyBpdCB0byB0aGUgVHdlZW4gTWFuYWdlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lIGlmIGl0IGlzbid0LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjbWFrZUFjdGl2ZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIFRoZSBUd2VlbiB0byBjaGVjay5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlcn0gVGhpcyBUd2VlbiBNYW5hZ2VyIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbWFrZUFjdGl2ZTogZnVuY3Rpb24gKHR3ZWVuKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLl9hZGQuaW5kZXhPZih0d2VlbikgIT09IC0xIHx8IHRoaXMuX2FjdGl2ZS5pbmRleE9mKHR3ZWVuKSAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpZHggPSB0aGlzLl9wZW5kaW5nLmluZGV4T2YodHdlZW4pO1xyXG5cclxuICAgICAgICBpZiAoaWR4ICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9hZGQucHVzaCh0d2Vlbik7XHJcblxyXG4gICAgICAgIHR3ZWVuLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19BREQ7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcysrO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXNzZXMgYWxsIFR3ZWVucyB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNlYWNoXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtzY29wZV0gLSBUaGUgc2NvcGUgKGB0aGlzYCBvYmplY3QpIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGguXHJcbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyBpbnRvIHRoZSBmdW5jdGlvbi4gSXRzIGZpcnN0IGFyZ3VtZW50IHdpbGwgYWx3YXlzIGJlIHRoZSBUd2VlbiBjdXJyZW50bHkgYmVpbmcgaXRlcmF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjaywgc2NvcGUpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbIG51bGwgXTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIHRleHR1cmUgaW4gdGhpcy5saXN0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJnc1swXSA9IHRoaXMubGlzdFt0ZXh0dXJlXTtcclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHNjb3BlLCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYWN0aXZlIFR3ZWVucyBhbmQgVGltZWxpbmVzIGluIHRoZSBUd2VlbiBNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjZ2V0QWxsVHdlZW5zXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlR3ZWVuW119IEEgbmV3IGFycmF5IGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBhbGwgYWN0aXZlIFR3ZWVucyBhbmQgVGltZWxpbmVzLlxyXG4gICAgICovXHJcbiAgICBnZXRBbGxUd2VlbnM6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLl9hY3RpdmU7XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvdXRwdXQucHVzaChsaXN0W2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2NhbGUgb2YgdGhlIHRpbWUgZGVsdGEgZm9yIGFsbCBUd2VlbnMgYW5kIFRpbWVsaW5lcyBvd25lZCBieSB0aGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNnZXRHbG9iYWxUaW1lU2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNjYWxlIG9mIHRoZSB0aW1lIGRlbHRhLCB1c3VhbGx5IDEuXHJcbiAgICAgKi9cclxuICAgIGdldEdsb2JhbFRpbWVTY2FsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aW1lU2NhbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgVHdlZW5zIG9yIFRpbWVsaW5lcyBpbiB0aGUgVHdlZW4gTWFuYWdlciB3aGljaCBhZmZlY3QgdGhlIGdpdmVuIHRhcmdldCBvciBhcnJheSBvZiB0YXJnZXRzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjZ2V0VHdlZW5zT2ZcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7KG9iamVjdHxhcnJheSl9IHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gbG9vayBmb3IuIFByb3ZpZGUgYW4gYXJyYXkgdG8gbG9vayBmb3IgbXVsdGlwbGUgdGFyZ2V0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlR3ZWVuW119IEEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIFR3ZWVucyBhbmQgVGltZWxpbmVzIHdoaWNoIGFmZmVjdCB0aGUgZ2l2ZW4gdGFyZ2V0KHMpLlxyXG4gICAgICovXHJcbiAgICBnZXRUd2VlbnNPZjogZnVuY3Rpb24gKHRhcmdldClcclxuICAgIHtcclxuICAgICAgICB2YXIgbGlzdCA9IHRoaXMuX2FjdGl2ZTtcclxuICAgICAgICB2YXIgdHdlZW47XHJcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdO1xyXG4gICAgICAgIHZhciBpO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRhcmdldC5sZW5ndGg7IHQrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHdlZW4uaGFzVGFyZ2V0KHRhcmdldFt0XSkpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0d2Vlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0d2VlbiA9IGxpc3RbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR3ZWVuLmhhc1RhcmdldCh0YXJnZXQpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHR3ZWVuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBiZWluZyBhZmZlY3RlZCBieSBhIHBsYXlpbmcgVHdlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNpc1R3ZWVuaW5nXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gdGFyZ2V0IFBoYXNlci5Ud2VlbnMuVHdlZW4gb2JqZWN0XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gcmV0dXJucyBpZiB0YXJnZXQgdHdlZW4gb2JqZWN0IGlzIGFjdGl2ZSBvciBub3RcclxuICAgICAqL1xyXG4gICAgaXNUd2VlbmluZzogZnVuY3Rpb24gKHRhcmdldClcclxuICAgIHtcclxuICAgICAgICB2YXIgbGlzdCA9IHRoaXMuX2FjdGl2ZTtcclxuICAgICAgICB2YXIgdHdlZW47XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuID0gbGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2Vlbi5oYXNUYXJnZXQodGFyZ2V0KSAmJiB0d2Vlbi5pc1BsYXlpbmcoKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbGwgVHdlZW5zIGluIHRoaXMgVHdlZW4gTWFuYWdlci4gVGhleSB3aWxsIGJlIHJlbW92ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2tpbGxBbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfSBUaGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIGtpbGxBbGw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHR3ZWVucyA9IHRoaXMuZ2V0QWxsVHdlZW5zKCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHdlZW5zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHdlZW5zW2ldLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0b3BzIGFsbCBUd2VlbnMgd2hpY2ggYWZmZWN0IHRoZSBnaXZlbiB0YXJnZXQgb3IgYXJyYXkgb2YgdGFyZ2V0cy4gVGhlIFR3ZWVucyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgVHdlZW4gTWFuYWdlciBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLlxyXG4gICAgICpcclxuICAgICAqIEBzZWUge0BsaW5rICNnZXRUd2VlbnNPZn1cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2tpbGxUd2VlbnNPZlxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsob2JqZWN0fGFycmF5KX0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBsb29rIGZvci4gUHJvdmlkZSBhbiBhcnJheSB0byBsb29rIGZvciBtdWx0aXBsZSB0YXJnZXRzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfSBUaGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIGtpbGxUd2VlbnNPZjogZnVuY3Rpb24gKHRhcmdldClcclxuICAgIHtcclxuICAgICAgICB2YXIgdHdlZW5zID0gdGhpcy5nZXRUd2VlbnNPZih0YXJnZXQpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR3ZWVucy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuc1tpXS5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXVzZXMgYWxsIFR3ZWVucyBpbiB0aGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNwYXVzZUFsbFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ9IFRoaXMgVHdlZW4gTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgcGF1c2VBbGw6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLl9hY3RpdmU7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpc3RbaV0ucGF1c2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgYWxsIFR3ZWVucyBpbiB0aGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlciNyZXN1bWVBbGxcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfSBUaGlzIFR3ZWVuIE1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlc3VtZUFsbDogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbGlzdCA9IHRoaXMuX2FjdGl2ZTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGlzdFtpXS5yZXN1bWUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgYSBuZXcgc2NhbGUgb2YgdGhlIHRpbWUgZGVsdGEgZm9yIHRoaXMgVHdlZW4gTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgdGltZSBkZWx0YSBpcyB0aGUgdGltZSBlbGFwc2VkIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGZyYW1lcyBhbmQgaW5mbHVlbmNlcyB0aGUgc3BlZWQgb2YgdGltZSBmb3IgdGhpcyBUd2VlbiBNYW5hZ2VyIGFuZCBhbGwgVHdlZW5zIGl0IG93bnMuIFZhbHVlcyBoaWdoZXIgdGhhbiAxIGluY3JlYXNlIHRoZSBzcGVlZCBvZiB0aW1lLCB3aGlsZSB2YWx1ZXMgc21hbGxlciB0aGFuIDEgZGVjcmVhc2UgaXQuIEEgdmFsdWUgb2YgMCBmcmVlemVzIHRpbWUgYW5kIGlzIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQgdG8gcGF1c2luZyBhbGwgVHdlZW5zLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXIjc2V0R2xvYmFsVGltZVNjYWxlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbmV3IHNjYWxlIG9mIHRoZSB0aW1lIGRlbHRhLCB3aGVyZSAxIGlzIHRoZSBub3JtYWwgc3BlZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7UGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ9IFRoaXMgVHdlZW4gTWFuYWdlci5cclxuICAgICAqL1xyXG4gICAgc2V0R2xvYmFsVGltZVNjYWxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aW1lU2NhbGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIFNjZW5lIHRoYXQgb3ducyB0aGlzIHBsdWdpbiBpcyBzaHV0dGluZyBkb3duLlxyXG4gICAgICogV2UgbmVlZCB0byBraWxsIGFuZCByZXNldCBhbGwgaW50ZXJuYWwgcHJvcGVydGllcyBhcyB3ZWxsIGFzIHN0b3AgbGlzdGVuaW5nIHRvIFNjZW5lIGV2ZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI3NodXRkb3duXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgc2h1dGRvd246IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5raWxsQWxsKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2FkZCA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBbXTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95ID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuX3RvUHJvY2VzcyA9IDA7XHJcblxyXG4gICAgICAgIHZhciBldmVudEVtaXR0ZXIgPSB0aGlzLnN5c3RlbXMuZXZlbnRzO1xyXG5cclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlBSRV9VUERBVEUsIHRoaXMucHJlVXBkYXRlLCB0aGlzKTtcclxuICAgICAgICBldmVudEVtaXR0ZXIub2ZmKFNjZW5lRXZlbnRzLlVQREFURSwgdGhpcy51cGRhdGUsIHRoaXMpO1xyXG4gICAgICAgIGV2ZW50RW1pdHRlci5vZmYoU2NlbmVFdmVudHMuU0hVVERPV04sIHRoaXMuc2h1dGRvd24sIHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBTY2VuZSB0aGF0IG93bnMgdGhpcyBwbHVnaW4gaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAgICogV2UgbmVlZCB0byBzaHV0ZG93biBhbmQgdGhlbiBraWxsIG9mZiBhbGwgZXh0ZXJuYWwgcmVmZXJlbmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyI2Rlc3Ryb3lcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2h1dGRvd24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5zY2VuZS5zeXMuZXZlbnRzLm9mZihTY2VuZUV2ZW50cy5TVEFSVCwgdGhpcy5zdGFydCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc3lzdGVtcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG59KTtcclxuXHJcblBsdWdpbkNhY2hlLnJlZ2lzdGVyKCdUd2Vlbk1hbmFnZXInLCBUd2Vlbk1hbmFnZXIsICd0d2VlbnMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHdlZW5NYW5hZ2VyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgZnJvbSBhbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLkJ1aWxkZXJzLkdldEJvb2xlYW5cclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBsb29rIGZvciBpbiB0aGUgYHNvdXJjZWAgb2JqZWN0LlxyXG4gKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSAtIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgYGtleWAgZG9lc24ndCBleGlzdCBvciBpZiBubyBgc291cmNlYCBvYmplY3QgaXMgcHJvdmlkZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyp9IFRoZSByZXRyaWV2ZWQgdmFsdWUuXHJcbiAqL1xyXG52YXIgR2V0Qm9vbGVhbiA9IGZ1bmN0aW9uIChzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKVxyXG57XHJcbiAgICBpZiAoIXNvdXJjZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZVtrZXldO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldEJvb2xlYW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEVhc2VNYXAgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2Vhc2luZy9FYXNlTWFwJyk7XHJcbnZhciBVcHBlcmNhc2VGaXJzdCA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL3N0cmluZy9VcHBlcmNhc2VGaXJzdCcpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIGNvcnJlY3QgZWFzZSBmdW5jdGlvbiBmb3IgYSBUd2Vlbi5cclxuICogXHJcbiAqIEl0IGNhbiB0YWtlIGEgdmFyaWV0eSBvZiBpbnB1dCwgaW5jbHVkaW5nIGFuIEVhc2VNYXAgYmFzZWQgc3RyaW5nLCBvciBhIGN1c3RvbSBmdW5jdGlvbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5Ud2VlbnMuQnVpbGRlcnMuR2V0RWFzZUZ1bmN0aW9uXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24pfSBlYXNlIC0gVGhlIGVhc2UgdG8gZmluZC4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIGZyb20gdGhlIEVhc2VNYXAsIG9yIGEgY3VzdG9tIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcltdfSBbZWFzZVBhcmFtc10gLSBBbiBvcHRpb25hbCBhcnJheSBvZiBlYXNlIHBhcmFtZXRlcnMgdG8gZ28gd2l0aCB0aGUgZWFzZS5cclxuICpcclxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBlYXNlIGZ1bmN0aW9uLlxyXG4gKi9cclxudmFyIEdldEVhc2VGdW5jdGlvbiA9IGZ1bmN0aW9uIChlYXNlLCBlYXNlUGFyYW1zKVxyXG57XHJcbiAgICAvLyAgRGVmYXVsdCBlYXNlIGZ1bmN0aW9uXHJcbiAgICB2YXIgZWFzZUZ1bmN0aW9uID0gRWFzZU1hcC5Qb3dlcjA7XHJcblxyXG4gICAgLy8gIFByZXBhcmUgZWFzZSBmdW5jdGlvblxyXG4gICAgaWYgKHR5cGVvZiBlYXNlID09PSAnc3RyaW5nJylcclxuICAgIHtcclxuICAgICAgICAvLyAgU3RyaW5nIGJhc2VkIGxvb2stdXBcclxuXHJcbiAgICAgICAgLy8gIDEpIFRoZXkgc3BlY2lmaWVkIGl0IGNvcnJlY3RseVxyXG4gICAgICAgIGlmIChFYXNlTWFwLmhhc093blByb3BlcnR5KGVhc2UpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZWFzZUZ1bmN0aW9uID0gRWFzZU1hcFtlYXNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIERvIHNvbWUgc3RyaW5nIG1hbmlwdWxhdGlvbiB0byB0cnkgYW5kIGZpbmQgaXRcclxuICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9ICcnO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVhc2UuaW5kZXhPZignLicpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgcXVhZC5pbiA9IFF1YWQuZWFzZUluXHJcbiAgICAgICAgICAgICAgICAvLyAgcXVhZC5vdXQgPSBRdWFkLmVhc2VPdXRcclxuICAgICAgICAgICAgICAgIC8vICBxdWFkLmlub3V0ID0gUXVhZC5lYXNlSW5PdXRcclxuXHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBlYXNlLnN1YnN0cihlYXNlLmluZGV4T2YoJy4nKSArIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2luJylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAnZWFzZUluJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnb3V0JylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAnZWFzZU91dCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2lub3V0JylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAnZWFzZUluT3V0JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWFzZSA9IFVwcGVyY2FzZUZpcnN0KGVhc2Uuc3Vic3RyKDAsIGVhc2UuaW5kZXhPZignLicpICsgMSkgKyBkaXJlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKEVhc2VNYXAuaGFzT3duUHJvcGVydHkoZWFzZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGVhc2VGdW5jdGlvbiA9IEVhc2VNYXBbZWFzZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgZWFzZSA9PT0gJ2Z1bmN0aW9uJylcclxuICAgIHtcclxuICAgICAgICAvLyAgQ3VzdG9tIGZ1bmN0aW9uXHJcbiAgICAgICAgZWFzZUZ1bmN0aW9uID0gZWFzZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZWFzZSkgJiYgZWFzZS5sZW5ndGggPT09IDQpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIEJlemllciBmdW5jdGlvbiAoVE9ETylcclxuICAgIH1cclxuXHJcbiAgICAvLyAgTm8gY3VzdG9tIGVhc2UgcGFyYW1ldGVycz9cclxuICAgIGlmICghZWFzZVBhcmFtcylcclxuICAgIHtcclxuICAgICAgICAvLyAgUmV0dXJuIGVhc2UgZnVuY3Rpb25cclxuICAgICAgICByZXR1cm4gZWFzZUZ1bmN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjbG9uZVBhcmFtcyA9IGVhc2VQYXJhbXMuc2xpY2UoMCk7XHJcblxyXG4gICAgY2xvbmVQYXJhbXMudW5zaGlmdCgwKTtcclxuXHJcbiAgICAvLyAgUmV0dXJuIGVhc2UgZnVuY3Rpb24gd2l0aCBjdXN0b20gZWFzZSBwYXJhbWV0ZXJzXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHYpXHJcbiAgICB7XHJcbiAgICAgICAgY2xvbmVQYXJhbXNbMF0gPSB2O1xyXG5cclxuICAgICAgICByZXR1cm4gZWFzZUZ1bmN0aW9uLmFwcGx5KHRoaXMsIGNsb25lUGFyYW1zKTtcclxuICAgIH07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldEVhc2VGdW5jdGlvbjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgVHdlZW4gQnVpbGRlciB0byBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmV0dXJuXHJcbiAqIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLkJ1aWxkZXJzLkdldE5ld1ZhbHVlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FueX0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3QgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IHRvIGdldCBmcm9tIHRoZSBzb3VyY2UuXHJcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgLSBBIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIHNob3VsZCB0aGUgc291cmNlIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBzZXQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHdoaWNoIHdoZW4gY2FsbGVkIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UuXHJcbiAqL1xyXG52YXIgR2V0TmV3VmFsdWUgPSBmdW5jdGlvbiAoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSlcclxue1xyXG4gICAgdmFyIHZhbHVlQ2FsbGJhY2s7XHJcblxyXG4gICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0ID0gdHlwZW9mKHNvdXJjZVtrZXldKTtcclxuXHJcbiAgICAgICAgaWYgKHQgPT09ICdmdW5jdGlvbicpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YWx1ZUNhbGxiYWNrID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCB2YWx1ZSwgdGFyZ2V0SW5kZXgsIHRvdGFsVGFyZ2V0cywgdHdlZW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2Vba2V5XSh0YXJnZXQsIHRhcmdldEtleSwgdmFsdWUsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHR3ZWVuKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWVDYWxsYmFjayA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2Vba2V5XTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnZnVuY3Rpb24nKVxyXG4gICAge1xyXG4gICAgICAgIHZhbHVlQ2FsbGJhY2sgPSBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgdmFsdWVDYWxsYmFjayA9IGZ1bmN0aW9uICgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlQ2FsbGJhY2s7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldE5ld1ZhbHVlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSRVNFUlZFRCA9IHJlcXVpcmUoJy4uL3R3ZWVuL1Jlc2VydmVkUHJvcHMnKTtcclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBUd2VlbiBCdWlsZGVyIHRvIHJldHVybiBhbiBhcnJheSBvZiBwcm9wZXJ0aWVzXHJcbiAqIHRoYXQgdGhlIFR3ZWVuIHdpbGwgYmUgb3BlcmF0aW5nIG9uLiBJdCB0YWtlcyBhIHR3ZWVuIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAqIGFuZCB0aGVuIGNoZWNrcyB0aGF0IG5vbmUgb2YgdGhlIGBwcm9wc2AgZW50cmllcyBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUsIG9yIHRoYXRcclxuICogbm9uZSBvZiB0aGUgZGlyZWN0IHByb3BlcnRpZXMgYXJlIG9uIHRoZSBSZXNlcnZlZCBsaXN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlR3ZWVucy5CdWlsZGVycy5HZXRQcm9wc1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuQnVpbGRlckNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9mIHRoZSBUd2VlbiB0byBnZXQgdGhlIHByb3BlcnRpZXMgZnJvbS5cclxuICpcclxuICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGFsbCB0aGUgcHJvcGVydGllcyB0aGUgdHdlZW4gd2lsbCBvcGVyYXRlIG9uLlxyXG4gKi9cclxudmFyIEdldFByb3BzID0gZnVuY3Rpb24gKGNvbmZpZylcclxue1xyXG4gICAgdmFyIGtleTtcclxuICAgIHZhciBrZXlzID0gW107XHJcblxyXG4gICAgLy8gIEZpcnN0IHNlZSBpZiB3ZSBoYXZlIGEgcHJvcHMgb2JqZWN0XHJcblxyXG4gICAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncHJvcHMnKSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKGtleSBpbiBjb25maWcucHJvcHMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgU2tpcCBhbnkgcHJvcGVydHkgdGhhdCBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlXHJcbiAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDEpICE9PSAnXycpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaCh7IGtleToga2V5LCB2YWx1ZTogY29uZmlnLnByb3BzW2tleV0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZm9yIChrZXkgaW4gY29uZmlnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFNraXAgYW55IHByb3BlcnR5IHRoYXQgaXMgaW4gdGhlIFJlc2VydmVkUHJvcHMgbGlzdCBvciB0aGF0IHN0YXJ0cyB3aXRoIGFuIHVuZGVyc2NvcmVcclxuICAgICAgICAgICAgaWYgKFJFU0VSVkVELmluZGV4T2Yoa2V5KSA9PT0gLTEgJiYga2V5LnN1YnN0cigwLCAxKSAhPT0gJ18nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGNvbmZpZ1trZXldIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBrZXlzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRQcm9wcztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBFeHRyYWN0cyBhbiBhcnJheSBvZiB0YXJnZXRzIGZyb20gYSBUd2VlbiBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICpcclxuICogVGhlIHRhcmdldHMgd2lsbCBiZSBsb29rZWQgZm9yIGluIGEgYHRhcmdldHNgIHByb3BlcnR5LiBJZiBpdCdzIGEgZnVuY3Rpb24sIGl0cyByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSByZXN1bHQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLkJ1aWxkZXJzLkdldFRhcmdldHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gdXNlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgdGFyZ2V0cyAobWF5IGNvbnRhaW4gb25seSBvbmUgZWxlbWVudCksIG9yIGBudWxsYCBpZiBubyB0YXJnZXRzIHdlcmUgc3BlY2lmaWVkLlxyXG4gKi9cclxudmFyIEdldFRhcmdldHMgPSBmdW5jdGlvbiAoY29uZmlnKVxyXG57XHJcbiAgICB2YXIgdGFyZ2V0cyA9IEdldFZhbHVlKGNvbmZpZywgJ3RhcmdldHMnLCBudWxsKTtcclxuXHJcbiAgICBpZiAodGFyZ2V0cyA9PT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRhcmdldHMgPT09ICdmdW5jdGlvbicpXHJcbiAgICB7XHJcbiAgICAgICAgdGFyZ2V0cyA9IHRhcmdldHMuY2FsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRzKSlcclxuICAgIHtcclxuICAgICAgICB0YXJnZXRzID0gWyB0YXJnZXRzIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRhcmdldHM7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFRhcmdldHM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcblxyXG4vKipcclxuICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB0aGUgVGltZWxpbmUgQnVpbGRlci5cclxuICogXHJcbiAqIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHR3ZWVucyBpbiB0aGUgZ2l2ZW4gdGltZWxpbmUgY29uZmlnLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlR3ZWVucy5CdWlsZGVycy5HZXRUd2VlbnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5UaW1lbGluZUJ1aWxkZXJDb25maWd9IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIFRpbWVsaW5lLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtQaGFzZXIuVHdlZW5zLlR3ZWVuW119IEFuIGFycmF5IG9mIFR3ZWVuIGluc3RhbmNlcyB0aGF0IHRoZSBUaW1lbGluZSB3aWxsIG1hbmFnZS5cclxuICovXHJcbnZhciBHZXRUd2VlbnMgPSBmdW5jdGlvbiAoY29uZmlnKVxyXG57XHJcbiAgICB2YXIgdHdlZW5zID0gR2V0VmFsdWUoY29uZmlnLCAndHdlZW5zJywgbnVsbCk7XHJcblxyXG4gICAgaWYgKHR3ZWVucyA9PT0gbnVsbClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgdHdlZW5zID09PSAnZnVuY3Rpb24nKVxyXG4gICAge1xyXG4gICAgICAgIHR3ZWVucyA9IHR3ZWVucy5jYWxsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR3ZWVucykpXHJcbiAgICB7XHJcbiAgICAgICAgdHdlZW5zID0gWyB0d2VlbnMgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHdlZW5zO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRUd2VlbnM7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmZ1bmN0aW9uIGhhc0dldEFjdGl2ZSAoZGVmKVxyXG57XHJcbiAgICByZXR1cm4gKCEhZGVmLmdldEFjdGl2ZSAmJiB0eXBlb2YgZGVmLmdldEFjdGl2ZSA9PT0gJ2Z1bmN0aW9uJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBoYXNHZXRTdGFydCAoZGVmKVxyXG57XHJcbiAgICByZXR1cm4gKCEhZGVmLmdldFN0YXJ0ICYmIHR5cGVvZiBkZWYuZ2V0U3RhcnQgPT09ICdmdW5jdGlvbicpO1xyXG59XHJcblxyXG4vKipcclxuICogQGlnbm9yZVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzR2V0RW5kIChkZWYpXHJcbntcclxuICAgIHJldHVybiAoISFkZWYuZ2V0RW5kICYmIHR5cGVvZiBkZWYuZ2V0RW5kID09PSAnZnVuY3Rpb24nKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmZ1bmN0aW9uIGhhc0dldHRlcnMgKGRlZilcclxue1xyXG4gICAgcmV0dXJuIGhhc0dldFN0YXJ0KGRlZikgfHwgaGFzR2V0RW5kKGRlZikgfHwgaGFzR2V0QWN0aXZlKGRlZik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGBnZXRBY3RpdmVgLCBgZ2V0U3RhcnRgIGFuZCBgZ2V0RW5kYCBmdW5jdGlvbnMgZm9yIGEgVHdlZW5EYXRhIGJhc2VkIG9uIGEgdGFyZ2V0IHByb3BlcnR5IGFuZCBlbmQgdmFsdWUuXHJcbiAqIFxyXG4gKiBgZ2V0QWN0aXZlYCBpZiBub3QgbnVsbCwgaXMgaW52b2tlZCBfaW1tZWRpYXRlbHlfIGFzIHNvb24gYXMgdGhlIFR3ZWVuRGF0YSBpcyBydW5uaW5nLCBhbmQgaXMgc2V0IG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXHJcbiAqIGBnZXRFbmRgIGlzIGludm9rZWQgb25jZSBhbnkgc3RhcnQgZGVsYXlzIGhhdmUgZXhwaXJlZCBhbmQgcmV0dXJucyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgdHdlZW4gdG8uXHJcbiAqIGBnZXRTdGFydGAgaXMgaW52b2tlZCB3aGVuIHRoZSB0d2VlbiByZWFjaGVzIHRoZSBlbmQgYW5kIG5lZWRzIHRvIGVpdGhlciByZXBlYXQgb3IgeW95bywgaXQgcmV0dXJucyB0aGUgdmFsdWUgdG8gZ28gYmFjayB0by5cclxuICpcclxuICogSWYgdGhlIGVuZCB2YWx1ZSBpcyBhIG51bWJlciwgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFic29sdXRlIHZhbHVlIGFuZCB0aGUgcHJvcGVydHkgd2lsbCBiZSB0d2VlbmVkIHRvIGl0LlxyXG4gKiBBIHN0cmluZyBjYW4gYmUgcHJvdmlkZWQgdG8gc3BlY2lmeSBhIHJlbGF0aXZlIGVuZCB2YWx1ZSB3aGljaCBjb25zaXN0cyBvZiBhbiBvcGVyYXRpb25cclxuICogKGArPWAgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZhbHVlLCBgLT1gIHRvIHN1YnRyYWN0IGZyb20gdGhlIGN1cnJlbnQgdmFsdWUsIGAqPWAgdG8gbXVsdGlwbHkgdGhlIGN1cnJlbnRcclxuICogdmFsdWUsIG9yIGAvPWAgdG8gZGl2aWRlIHRoZSBjdXJyZW50IHZhbHVlKSBmb2xsb3dlZCBieSBpdHMgb3BlcmFuZC5cclxuICogXHJcbiAqIEEgZnVuY3Rpb24gY2FuIGJlIHByb3ZpZGVkIHRvIGFsbG93IGdyZWF0ZXIgY29udHJvbCBvdmVyIHRoZSBlbmQgdmFsdWU7IGl0IHdpbGwgcmVjZWl2ZSB0aGUgdGFyZ2V0XHJcbiAqIG9iamVjdCBiZWluZyB0d2VlbmVkLCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgdHdlZW5lZCwgYW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxyXG4gKiBhcyBpdHMgYXJndW1lbnRzLlxyXG4gKiBcclxuICogSWYgYm90aCB0aGUgc3RhcnRpbmcgYW5kIHRoZSBlbmRpbmcgdmFsdWVzIG5lZWQgdG8gYmUgY29udHJvbGxlZCwgYW4gb2JqZWN0IHdpdGggYGdldFN0YXJ0YCBhbmQgYGdldEVuZGBcclxuICogY2FsbGJhY2tzLCB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIHNhbWUgYXJndW1lbnRzLCBjYW4gYmUgcHJvdmlkZWQgaW5zdGVhZC4gSWYgYW4gb2JqZWN0IHdpdGggYSBgdmFsdWVgXHJcbiAqIHByb3BlcnR5IGlzIHByb3ZpZGVkLCB0aGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkIGFzIHRoZSBlZmZlY3RpdmUgdmFsdWUgdW5kZXIgdGhlIHNhbWUgcnVsZXMgZGVzY3JpYmVkIGhlcmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLkJ1aWxkZXJzLkdldFZhbHVlT3BcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gbW9kaWZ5LlxyXG4gKiBAcGFyYW0geyp9IHByb3BlcnR5VmFsdWUgLSBUaGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgYXMgZGVzY3JpYmVkIGFib3ZlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gQW4gYXJyYXkgb2YgZnVuY3Rpb25zLCBgZ2V0QWN0aXZlYCwgYGdldFN0YXJ0YCBhbmQgYGdldEVuZGAsIHdoaWNoIHJldHVybiB0aGUgc3RhcnRpbmcgYW5kIHRoZSBlbmRpbmcgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZS5cclxuICovXHJcbnZhciBHZXRWYWx1ZU9wID0gZnVuY3Rpb24gKGtleSwgcHJvcGVydHlWYWx1ZSlcclxue1xyXG4gICAgdmFyIGNhbGxiYWNrcztcclxuXHJcbiAgICAvLyAgVGhlIHJldHVybmVkIHZhbHVlIHNldHMgd2hhdCB0aGUgcHJvcGVydHkgd2lsbCBiZSBhdCB0aGUgRU5EIG9mIHRoZSBUd2VlbiAodXN1YWxseSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBUd2VlbilcclxuICAgIHZhciBnZXRFbmQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcclxuXHJcbiAgICAvLyAgVGhlIHJldHVybmVkIHZhbHVlIHNldHMgd2hhdCB0aGUgcHJvcGVydHkgd2lsbCBiZSBhdCB0aGUgU1RBUlQgb2YgdGhlIFR3ZWVuICh1c3VhbGx5IGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBUd2VlbilcclxuICAgIHZhciBnZXRTdGFydCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xyXG5cclxuICAgIC8vICBXaGF0IHRvIHNldCB0aGUgcHJvcGVydHkgdG8gdGhlIG1vbWVudCB0aGUgVHdlZW5EYXRhIGlzIGludm9rZWRcclxuICAgIHZhciBnZXRBY3RpdmUgPSBudWxsO1xyXG5cclxuICAgIHZhciB0ID0gdHlwZW9mKHByb3BlcnR5VmFsdWUpO1xyXG5cclxuICAgIGlmICh0ID09PSAnbnVtYmVyJylcclxuICAgIHtcclxuICAgICAgICAvLyBwcm9wczoge1xyXG4gICAgICAgIC8vICAgICB4OiA0MDAsXHJcbiAgICAgICAgLy8gICAgIHk6IDMwMFxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgZ2V0RW5kID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0ID09PSAnc3RyaW5nJylcclxuICAgIHtcclxuICAgICAgICAvLyBwcm9wczoge1xyXG4gICAgICAgIC8vICAgICB4OiAnKz00MDAnLFxyXG4gICAgICAgIC8vICAgICB5OiAnLT0zMDAnLFxyXG4gICAgICAgIC8vICAgICB6OiAnKj0yJyxcclxuICAgICAgICAvLyAgICAgdzogJy89MidcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHZhciBvcCA9IHByb3BlcnR5VmFsdWVbMF07XHJcbiAgICAgICAgdmFyIG51bSA9IHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZS5zdWJzdHIoMikpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKG9wKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSAnKyc6XHJcbiAgICAgICAgICAgICAgICBnZXRFbmQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSArIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJy0nOlxyXG4gICAgICAgICAgICAgICAgZ2V0RW5kID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgLSBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICcqJzpcclxuICAgICAgICAgICAgICAgIGdldEVuZCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnLyc6XHJcbiAgICAgICAgICAgICAgICBnZXRFbmQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAvIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBnZXRFbmQgPSBmdW5jdGlvbiAoKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0ID09PSAnZnVuY3Rpb24nKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBUaGUgc2FtZSBhcyBzZXR0aW5nIGp1c3QgdGhlIGdldEVuZCBmdW5jdGlvbiBhbmQgbm8gZ2V0U3RhcnRcclxuXHJcbiAgICAgICAgLy8gcHJvcHM6IHtcclxuICAgICAgICAvLyAgICAgeDogZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgdGFyZ2V0SW5kZXgsIHRvdGFsVGFyZ2V0cywgdHdlZW4pIHsgcmV0dXJuIHZhbHVlICsgNTApOyB9LFxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgZ2V0RW5kID0gcHJvcGVydHlWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChoYXNHZXR0ZXJzKHByb3BlcnR5VmFsdWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgeDoge1xyXG4gICAgICAgICAgICAgICAgLy8gIENhbGxlZCB0aGUgbW9tZW50IFR3ZWVuIGlzIGFjdGl2ZS4gVGhlIHJldHVybmVkIHZhbHVlIHNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSB0YXJnZXQgaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgICAgICAgICBnZXRBY3RpdmU6IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgdmFsdWUsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHR3ZWVuKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIFR3ZWVuLiBUaGUgcmV0dXJuZWQgdmFsdWUgc2V0cyB3aGF0IHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGF0IHRoZSBFTkQgb2YgdGhlIFR3ZWVuLlxyXG4gICAgICAgICAgICAgICAgZ2V0RW5kOiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0d2VlbilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAgIC8vICBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgVHdlZW4uIFRoZSByZXR1cm5lZCB2YWx1ZSBzZXRzIHdoYXQgdGhlIHByb3BlcnR5IHdpbGwgYmUgYXQgdGhlIFNUQVJUIG9mIHRoZSBUd2Vlbi5cclxuICAgICAgICAgICAgICAgIGdldFN0YXJ0OiBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0d2VlbilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgICAgIGlmIChoYXNHZXRBY3RpdmUocHJvcGVydHlWYWx1ZSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdldEFjdGl2ZSA9IHByb3BlcnR5VmFsdWUuZ2V0QWN0aXZlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFzR2V0RW5kKHByb3BlcnR5VmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnZXRFbmQgPSBwcm9wZXJ0eVZhbHVlLmdldEVuZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGhhc0dldFN0YXJ0KHByb3BlcnR5VmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBnZXRTdGFydCA9IHByb3BlcnR5VmFsdWUuZ2V0U3RhcnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocHJvcGVydHlWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICAndmFsdWUnIG1heSBzdGlsbCBiZSBhIHN0cmluZywgZnVuY3Rpb24gb3IgYSBudW1iZXJcclxuICAgICAgICAgICAgLy8gcHJvcHM6IHtcclxuICAgICAgICAgICAgLy8gICAgIHg6IHsgdmFsdWU6IDQwMCwgLi4uIH0sXHJcbiAgICAgICAgICAgIC8vICAgICB5OiB7IHZhbHVlOiAzMDAsIC4uLiB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IEdldFZhbHVlT3Aoa2V5LCBwcm9wZXJ0eVZhbHVlLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gICdmcm9tJyBhbmQgJ3RvJyBtYXkgc3RpbGwgYmUgYSBzdHJpbmcsIGZ1bmN0aW9uIG9yIGEgbnVtYmVyXHJcbiAgICAgICAgICAgIC8vIHByb3BzOiB7XHJcbiAgICAgICAgICAgIC8vICAgICB4OiB7IGZyb206IDQwMCwgdG86IDYwMCB9LFxyXG4gICAgICAgICAgICAvLyAgICAgeTogeyBmcm9tOiAzMDAsIHRvOiA1MDAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvLyAgU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSAnc3RhcnQnIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseSBvbiB0aGUgdGFyZ2V0XHJcbiAgICAgICAgICAgIC8vIHByb3BzOiB7XHJcbiAgICAgICAgICAgIC8vICAgICB4OiB7IHN0YXJ0OiA0MDAsIHRvOiA2MDAgfSxcclxuICAgICAgICAgICAgLy8gICAgIHk6IHsgc3RhcnQ6IDMwMCwgdG86IDUwMCB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIC8vICAnc3RhcnQnIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseSwgdGhlbiBpdCBnb2VzICdmcm9tJyB0byAndG8nIGR1cmluZyB0aGUgdHdlZW5cclxuICAgICAgICAgICAgLy8gcHJvcHM6IHtcclxuICAgICAgICAgICAgLy8gICAgIHg6IHsgc3RhcnQ6IDIwMCwgZnJvbTogNDAwLCB0bzogNjAwIH0sXHJcbiAgICAgICAgICAgIC8vICAgICB5OiB7IHN0YXJ0OiAzMDAsIGZyb206IDMwMCwgdG86IDUwMCB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBoYXNUbyA9IHByb3BlcnR5VmFsdWUuaGFzT3duUHJvcGVydHkoJ3RvJyk7XHJcbiAgICAgICAgICAgIHZhciBoYXNGcm9tID0gcHJvcGVydHlWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnZnJvbScpO1xyXG4gICAgICAgICAgICB2YXIgaGFzU3RhcnQgPSBwcm9wZXJ0eVZhbHVlLmhhc093blByb3BlcnR5KCdzdGFydCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhc1RvICYmIChoYXNGcm9tIHx8IGhhc1N0YXJ0KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gR2V0VmFsdWVPcChrZXksIHByb3BlcnR5VmFsdWUudG8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChoYXNTdGFydClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRDYWxsYmFja3MgPSBHZXRWYWx1ZU9wKGtleSwgcHJvcGVydHlWYWx1ZS5zdGFydCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldEFjdGl2ZSA9IHN0YXJ0Q2FsbGJhY2tzLmdldEVuZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChoYXNGcm9tKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmcm9tQ2FsbGJhY2tzID0gR2V0VmFsdWVPcChrZXksIHByb3BlcnR5VmFsdWUuZnJvbSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldFN0YXJ0ID0gZnJvbUNhbGxiYWNrcy5nZXRFbmQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIElmIGNhbGxiYWNrIG5vdCBzZXQgYnkgdGhlIGVsc2UgaWYgYmxvY2sgYWJvdmUgdGhlbiBzZXQgaXQgaGVyZSBhbmQgcmV0dXJuIGl0XHJcbiAgICBpZiAoIWNhbGxiYWNrcylcclxuICAgIHtcclxuICAgICAgICBjYWxsYmFja3MgPSB7XHJcbiAgICAgICAgICAgIGdldEFjdGl2ZTogZ2V0QWN0aXZlLFxyXG4gICAgICAgICAgICBnZXRFbmQ6IGdldEVuZCxcclxuICAgICAgICAgICAgZ2V0U3RhcnQ6IGdldFN0YXJ0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FsbGJhY2tzO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRWYWx1ZU9wO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBEZWZhdWx0cyA9IHJlcXVpcmUoJy4uL3R3ZWVuL0RlZmF1bHRzJyk7XHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldEFkdmFuY2VkVmFsdWUnKTtcclxudmFyIEdldEJvb2xlYW4gPSByZXF1aXJlKCcuL0dldEJvb2xlYW4nKTtcclxudmFyIEdldEVhc2VGdW5jdGlvbiA9IHJlcXVpcmUoJy4vR2V0RWFzZUZ1bmN0aW9uJyk7XHJcbnZhciBHZXROZXdWYWx1ZSA9IHJlcXVpcmUoJy4vR2V0TmV3VmFsdWUnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZU9wID0gcmVxdWlyZSgnLi9HZXRWYWx1ZU9wJyk7XHJcbnZhciBUd2VlbiA9IHJlcXVpcmUoJy4uL3R3ZWVuL1R3ZWVuJyk7XHJcbnZhciBUd2VlbkRhdGEgPSByZXF1aXJlKCcuLi90d2Vlbi9Ud2VlbkRhdGEnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IE51bWJlciBUd2Vlbi5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5Ud2VlbnMuQnVpbGRlcnMuTnVtYmVyVHdlZW5CdWlsZGVyXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0geyhQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlcnxQaGFzZXIuVHdlZW5zLlRpbWVsaW5lKX0gcGFyZW50IC0gVGhlIG93bmVyIG9mIHRoZSBuZXcgVHdlZW4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5OdW1iZXJUd2VlbkJ1aWxkZXJDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBuZXcgVHdlZW4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5Ud2VlbkNvbmZpZ0RlZmF1bHRzfSBkZWZhdWx0cyAtIFR3ZWVuIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBuZXcgdHdlZW4uXHJcbiAqL1xyXG52YXIgTnVtYmVyVHdlZW5CdWlsZGVyID0gZnVuY3Rpb24gKHBhcmVudCwgY29uZmlnLCBkZWZhdWx0cylcclxue1xyXG4gICAgaWYgKGRlZmF1bHRzID09PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgZGVmYXVsdHMgPSBEZWZhdWx0cztcclxuICAgIH1cclxuXHJcbiAgICAvLyAgdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkQ291bnRlcih7XHJcbiAgICAvLyAgICAgIGZyb206IDEwMCxcclxuICAgIC8vICAgICAgdG86IDIwMCxcclxuICAgIC8vICAgICAgLi4uIChub3JtYWwgdHdlZW4gcHJvcGVydGllcylcclxuICAgIC8vICB9KVxyXG4gICAgLy9cclxuICAgIC8vICBUaGVuIHVzZSBpdCBpbiB5b3VyIGdhbWUgdmlhOlxyXG4gICAgLy9cclxuICAgIC8vICB0d2Vlbi5nZXRWYWx1ZSgpXHJcblxyXG4gICAgdmFyIGZyb20gPSBHZXRWYWx1ZShjb25maWcsICdmcm9tJywgMCk7XHJcbiAgICB2YXIgdG8gPSBHZXRWYWx1ZShjb25maWcsICd0bycsIDEpO1xyXG5cclxuICAgIHZhciB0YXJnZXRzID0gWyB7IHZhbHVlOiBmcm9tIH0gXTtcclxuXHJcbiAgICB2YXIgZGVsYXkgPSBHZXROZXdWYWx1ZShjb25maWcsICdkZWxheScsIGRlZmF1bHRzLmRlbGF5KTtcclxuICAgIHZhciBkdXJhdGlvbiA9IEdldE5ld1ZhbHVlKGNvbmZpZywgJ2R1cmF0aW9uJywgZGVmYXVsdHMuZHVyYXRpb24pO1xyXG4gICAgdmFyIGVhc2VQYXJhbXMgPSBHZXRWYWx1ZShjb25maWcsICdlYXNlUGFyYW1zJywgZGVmYXVsdHMuZWFzZVBhcmFtcyk7XHJcbiAgICB2YXIgZWFzZSA9IEdldEVhc2VGdW5jdGlvbihHZXRWYWx1ZShjb25maWcsICdlYXNlJywgZGVmYXVsdHMuZWFzZSksIGVhc2VQYXJhbXMpO1xyXG4gICAgdmFyIGhvbGQgPSBHZXROZXdWYWx1ZShjb25maWcsICdob2xkJywgZGVmYXVsdHMuaG9sZCk7XHJcbiAgICB2YXIgcmVwZWF0ID0gR2V0TmV3VmFsdWUoY29uZmlnLCAncmVwZWF0JywgZGVmYXVsdHMucmVwZWF0KTtcclxuICAgIHZhciByZXBlYXREZWxheSA9IEdldE5ld1ZhbHVlKGNvbmZpZywgJ3JlcGVhdERlbGF5JywgZGVmYXVsdHMucmVwZWF0RGVsYXkpO1xyXG4gICAgdmFyIHlveW8gPSBHZXRCb29sZWFuKGNvbmZpZywgJ3lveW8nLCBkZWZhdWx0cy55b3lvKTtcclxuXHJcbiAgICB2YXIgZGF0YSA9IFtdO1xyXG5cclxuICAgIHZhciBvcHMgPSBHZXRWYWx1ZU9wKCd2YWx1ZScsIHRvKTtcclxuXHJcbiAgICB2YXIgdHdlZW5EYXRhID0gVHdlZW5EYXRhKFxyXG4gICAgICAgIHRhcmdldHNbMF0sXHJcbiAgICAgICAgMCxcclxuICAgICAgICAndmFsdWUnLFxyXG4gICAgICAgIG9wcy5nZXRFbmQsXHJcbiAgICAgICAgb3BzLmdldFN0YXJ0LFxyXG4gICAgICAgIG9wcy5nZXRBY3RpdmUsXHJcbiAgICAgICAgZWFzZSxcclxuICAgICAgICBkZWxheSxcclxuICAgICAgICBkdXJhdGlvbixcclxuICAgICAgICB5b3lvLFxyXG4gICAgICAgIGhvbGQsXHJcbiAgICAgICAgcmVwZWF0LFxyXG4gICAgICAgIHJlcGVhdERlbGF5LFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIGZhbHNlXHJcbiAgICApO1xyXG5cclxuICAgIHR3ZWVuRGF0YS5zdGFydCA9IGZyb207XHJcbiAgICB0d2VlbkRhdGEuY3VycmVudCA9IGZyb207XHJcbiAgICB0d2VlbkRhdGEudG8gPSB0bztcclxuXHJcbiAgICBkYXRhLnB1c2godHdlZW5EYXRhKTtcclxuXHJcbiAgICB2YXIgdHdlZW4gPSBuZXcgVHdlZW4ocGFyZW50LCBkYXRhLCB0YXJnZXRzKTtcclxuXHJcbiAgICB0d2Vlbi5vZmZzZXQgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ29mZnNldCcsIG51bGwpO1xyXG4gICAgdHdlZW4uY29tcGxldGVEZWxheSA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnY29tcGxldGVEZWxheScsIDApO1xyXG4gICAgdHdlZW4ubG9vcCA9IE1hdGgucm91bmQoR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdsb29wJywgMCkpO1xyXG4gICAgdHdlZW4ubG9vcERlbGF5ID0gTWF0aC5yb3VuZChHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2xvb3BEZWxheScsIDApKTtcclxuICAgIHR3ZWVuLnBhdXNlZCA9IEdldEJvb2xlYW4oY29uZmlnLCAncGF1c2VkJywgZmFsc2UpO1xyXG4gICAgdHdlZW4udXNlRnJhbWVzID0gR2V0Qm9vbGVhbihjb25maWcsICd1c2VGcmFtZXMnLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gIFNldCB0aGUgQ2FsbGJhY2tzXHJcbiAgICB2YXIgc2NvcGUgPSBHZXRWYWx1ZShjb25maWcsICdjYWxsYmFja1Njb3BlJywgdHdlZW4pO1xyXG5cclxuICAgIC8vICBDYWxsYmFjayBwYXJhbWV0ZXJzOiAwID0gYSByZWZlcmVuY2UgdG8gdGhlIFR3ZWVuIGl0c2VsZiwgMSA9IHRoZSB0YXJnZXQvcyBvZiB0aGUgVHdlZW4sIC4uLiB5b3VyIG93biBwYXJhbXNcclxuICAgIHZhciB0d2VlbkFycmF5ID0gWyB0d2VlbiwgbnVsbCBdO1xyXG5cclxuICAgIHZhciBjYWxsYmFja3MgPSBUd2Vlbi5UWVBFUztcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgdHlwZSA9IGNhbGxiYWNrc1tpXTtcclxuXHJcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gR2V0VmFsdWUoY29uZmlnLCB0eXBlLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIGlmIChjYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFja1Njb3BlID0gR2V0VmFsdWUoY29uZmlnLCB0eXBlICsgJ1Njb3BlJywgc2NvcGUpO1xyXG4gICAgICAgICAgICB2YXIgY2FsbGJhY2tQYXJhbXMgPSBHZXRWYWx1ZShjb25maWcsIHR5cGUgKyAnUGFyYW1zJywgW10pO1xyXG5cclxuICAgICAgICAgICAgLy8gIFRoZSBudWxsIGlzIHJlc2V0IHRvIGJlIHRoZSBUd2VlbiB0YXJnZXRcclxuICAgICAgICAgICAgdHdlZW4uc2V0Q2FsbGJhY2sodHlwZSwgY2FsbGJhY2ssIHR3ZWVuQXJyYXkuY29uY2F0KGNhbGxiYWNrUGFyYW1zKSwgY2FsbGJhY2tTY29wZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0d2VlbjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyVHdlZW5CdWlsZGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRFYXNlRnVuY3Rpb24gPSByZXF1aXJlKCcuL0dldEVhc2VGdW5jdGlvbicpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIE1BVEhfQ09OU1QgPSByZXF1aXJlKCcuLi8uLi9tYXRoL2NvbnN0Jyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIFN0YWdnZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSBhIFR3ZWVuIHByb3BlcnR5LlxyXG4gKiBcclxuICogVGhlIHN0YWdnZXIgZnVuY3Rpb24gd2lsbCBhbGxvdyB5b3UgdG8gc3RhZ2dlciBjaGFuZ2VzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYWNyb3NzIGFsbCB0YXJnZXRzIG9mIHRoZSB0d2Vlbi5cclxuICogXHJcbiAqIFRoaXMgaXMgb25seSB3b3J0aCB1c2luZyBpZiB0aGUgdHdlZW4gaGFzIG11bHRpcGxlIHRhcmdldHMuXHJcbiAqIFxyXG4gKiBUaGUgZm9sbG93aW5nIHdpbGwgc3RhZ2dlciB0aGUgZGVsYXkgYnkgMTAwbXMgYWNyb3NzIGFsbCB0YXJnZXRzIG9mIHRoZSB0d2VlbiwgY2F1c2luZyB0aGVtIHRvIHNjYWxlIGRvd24gdG8gMC4yXHJcbiAqIG92ZXIgdGhlIGR1cmF0aW9uIHNwZWNpZmllZDpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IFsgLi4uIF0sXHJcbiAqICAgICBzY2FsZTogMC4yLFxyXG4gKiAgICAgZWFzZTogJ2xpbmVhcicsXHJcbiAqICAgICBkdXJhdGlvbjogMTAwMCxcclxuICogICAgIGRlbGF5OiB0aGlzLnR3ZWVucy5zdGFnZ2VyKDEwMClcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKiBcclxuICogVGhlIGZvbGxvd2luZyB3aWxsIHN0YWdnZXIgdGhlIGRlbGF5IGJ5IDUwMG1zIGFjcm9zcyBhbGwgdGFyZ2V0cyBvZiB0aGUgdHdlZW4gdXNpbmcgYSAxMCB4IDYgZ3JpZCwgc3RhZ2dlcmluZ1xyXG4gKiBmcm9tIHRoZSBjZW50ZXIgb3V0LCB1c2luZyBhIGN1YmljIGVhc2UuXHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHRoaXMudHdlZW5zLmFkZCh7XHJcbiAqICAgICB0YXJnZXRzOiBbIC4uLiBdLFxyXG4gKiAgICAgc2NhbGU6IDAuMixcclxuICogICAgIGVhc2U6ICdsaW5lYXInLFxyXG4gKiAgICAgZHVyYXRpb246IDEwMDAsXHJcbiAqICAgICBkZWxheTogdGhpcy50d2VlbnMuc3RhZ2dlcig1MDAsIHsgZ3JpZDogWyAxMCwgNiBdLCBmcm9tOiAnY2VudGVyJywgZWFzZTogJ2N1YmljLm91dCcgfSlcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlR3ZWVucy5CdWlsZGVycy5TdGFnZ2VyQnVpbGRlclxyXG4gKiBAc2luY2UgMy4xOS4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IHZhbHVlIC0gVGhlIGFtb3VudCB0byBzdGFnZ2VyIGJ5LCBvciBhbiBhcnJheSBjb250YWluaW5nIHR3byBlbGVtZW50cyByZXByZXNlbnRpbmcgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyB0byBzdGFnZ2VyIGJldHdlZW4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5TdGFnZ2VyQ29uZmlnfSBbY29uZmlnXSAtIEEgU3RhZ2dlciBDb25maWd1cmF0aW9uIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBzdGFnZ2VyIGZ1bmN0aW9uLlxyXG4gKi9cclxudmFyIFN0YWdnZXJCdWlsZGVyID0gZnVuY3Rpb24gKHZhbHVlLCBvcHRpb25zKVxyXG57XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG5cclxuICAgIHZhciByZXN1bHQ7XHJcblxyXG4gICAgdmFyIHN0YXJ0ID0gR2V0VmFsdWUob3B0aW9ucywgJ3N0YXJ0JywgMCk7XHJcbiAgICB2YXIgZWFzZSA9IEdldFZhbHVlKG9wdGlvbnMsICdlYXNlJywgbnVsbCk7XHJcbiAgICB2YXIgZ3JpZCA9IEdldFZhbHVlKG9wdGlvbnMsICdncmlkJywgbnVsbCk7XHJcblxyXG4gICAgdmFyIGZyb20gPSBHZXRWYWx1ZShvcHRpb25zLCAnZnJvbScsIDApO1xyXG5cclxuICAgIHZhciBmcm9tRmlyc3QgPSAoZnJvbSA9PT0gJ2ZpcnN0Jyk7XHJcbiAgICB2YXIgZnJvbUNlbnRlciA9IChmcm9tID09PSAnY2VudGVyJyk7XHJcbiAgICB2YXIgZnJvbUxhc3QgPSAoZnJvbSA9PT0gJ2xhc3QnKTtcclxuICAgIHZhciBmcm9tVmFsdWUgPSAodHlwZW9mKGZyb20pID09PSAnbnVtYmVyJyk7XHJcblxyXG4gICAgdmFyIGlzUmFuZ2UgPSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpO1xyXG4gICAgdmFyIHZhbHVlMSA9IChpc1JhbmdlKSA/IHBhcnNlRmxvYXQodmFsdWVbMF0pIDogcGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICB2YXIgdmFsdWUyID0gKGlzUmFuZ2UpID8gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgOiAwO1xyXG4gICAgdmFyIG1heFZhbHVlID0gTWF0aC5tYXgodmFsdWUxLCB2YWx1ZTIpO1xyXG5cclxuICAgIGlmIChpc1JhbmdlKVxyXG4gICAge1xyXG4gICAgICAgIHN0YXJ0ICs9IHZhbHVlMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JpZClcclxuICAgIHtcclxuICAgICAgICAvLyAgUHJlLWNhbGMgdGhlIGdyaWQgdG8gc2F2ZSBkb2luZyBpdCBmb3IgZXZlciB0d2VlbmRhdGEgdXBkYXRlXHJcbiAgICAgICAgdmFyIGdyaWRXaWR0aCA9IGdyaWRbMF07XHJcbiAgICAgICAgdmFyIGdyaWRIZWlnaHQgPSBncmlkWzFdO1xyXG5cclxuICAgICAgICB2YXIgZnJvbVggPSAwO1xyXG4gICAgICAgIHZhciBmcm9tWSA9IDA7XHJcblxyXG4gICAgICAgIHZhciBkaXN0YW5jZVggPSAwO1xyXG4gICAgICAgIHZhciBkaXN0YW5jZVkgPSAwO1xyXG5cclxuICAgICAgICB2YXIgZ3JpZFZhbHVlcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoZnJvbUxhc3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmcm9tWCA9IGdyaWRXaWR0aCAtIDE7XHJcbiAgICAgICAgICAgIGZyb21ZID0gZ3JpZEhlaWdodCAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGZyb21WYWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZyb21YID0gZnJvbSAlIGdyaWRXaWR0aDtcclxuICAgICAgICAgICAgZnJvbVkgPSBNYXRoLmZsb29yKGZyb20gLyBncmlkV2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmcm9tQ2VudGVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZnJvbVggPSAoZ3JpZFdpZHRoIC0gMSkgLyAyO1xyXG4gICAgICAgICAgICBmcm9tWSA9IChncmlkSGVpZ2h0IC0gMSkgLyAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGdyaWRNYXggPSBNQVRIX0NPTlNULk1JTl9TQUZFX0lOVEVHRVI7XHJcblxyXG4gICAgICAgIGZvciAodmFyIHRvWSA9IDA7IHRvWSA8IGdyaWRIZWlnaHQ7IHRvWSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ3JpZFZhbHVlc1t0b1ldID0gW107XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciB0b1ggPSAwOyB0b1ggPCBncmlkV2lkdGg7IHRvWCsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZVggPSBmcm9tWCAtIHRvWDtcclxuICAgICAgICAgICAgICAgIGRpc3RhbmNlWSA9IGZyb21ZIC0gdG9ZO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBkaXN0ID0gTWF0aC5zcXJ0KGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBncmlkTWF4KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRNYXggPSBkaXN0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGdyaWRWYWx1ZXNbdG9ZXVt0b1hdID0gZGlzdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgZWFzZUZ1bmN0aW9uID0gKGVhc2UpID8gR2V0RWFzZUZ1bmN0aW9uKGVhc2UpIDogbnVsbDtcclxuXHJcbiAgICBpZiAoZ3JpZClcclxuICAgIHtcclxuICAgICAgICByZXN1bHQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBpbmRleClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBncmlkU3BhY2UgPSAwO1xyXG4gICAgICAgICAgICB2YXIgdG9YID0gaW5kZXggJSBncmlkV2lkdGg7XHJcbiAgICAgICAgICAgIHZhciB0b1kgPSBNYXRoLmZsb29yKGluZGV4IC8gZ3JpZFdpZHRoKTtcclxuICAgIFxyXG4gICAgICAgICAgICBpZiAodG9YID49IDAgJiYgdG9YIDwgZ3JpZFdpZHRoICYmIHRvWSA+PSAwICYmIHRvWSA8IGdyaWRIZWlnaHQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGdyaWRTcGFjZSA9IGdyaWRWYWx1ZXNbdG9ZXVt0b1hdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgb3V0cHV0O1xyXG4gICBcclxuICAgICAgICAgICAgaWYgKGlzUmFuZ2UpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBkaWZmID0gKHZhbHVlMiAtIHZhbHVlMSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChlYXNlRnVuY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gKChncmlkU3BhY2UgLyBncmlkTWF4KSAqIGRpZmYpICogZWFzZUZ1bmN0aW9uKGdyaWRTcGFjZSAvIGdyaWRNYXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IChncmlkU3BhY2UgLyBncmlkTWF4KSAqIGRpZmY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZWFzZUZ1bmN0aW9uKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAoZ3JpZFNwYWNlICogdmFsdWUxKSAqIGVhc2VGdW5jdGlvbihncmlkU3BhY2UgLyBncmlkTWF4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dCA9IGdyaWRTcGFjZSAqIHZhbHVlMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dCArIHN0YXJ0O1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmVzdWx0ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgaW5kZXgsIHRvdGFsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIHplcm8gb2Zmc2V0XHJcbiAgICAgICAgICAgIHRvdGFsLS07XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIGZyb21JbmRleDtcclxuICAgIFxyXG4gICAgICAgICAgICBpZiAoZnJvbUZpcnN0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcm9tSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tQ2VudGVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmcm9tSW5kZXggPSBNYXRoLmFicygodG90YWwgLyAyKSAtIGluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tTGFzdClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnJvbUluZGV4ID0gdG90YWwgLSBpbmRleDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tVmFsdWUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZyb21JbmRleCA9IE1hdGguYWJzKGZyb20gLSBpbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgb3V0cHV0O1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoaXNSYW5nZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNwYWNpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZyb21DZW50ZXIpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BhY2luZyA9ICgodmFsdWUyIC0gdmFsdWUxKSAvIHRvdGFsKSAqIChmcm9tSW5kZXggKiAyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nID0gKCh2YWx1ZTIgLSB2YWx1ZTEpIC8gdG90YWwpICogZnJvbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGVhc2VGdW5jdGlvbilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzcGFjaW5nICogZWFzZUZ1bmN0aW9uKGZyb21JbmRleCAvIHRvdGFsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzcGFjaW5nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVhc2VGdW5jdGlvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRvdGFsICogbWF4VmFsdWUpICogZWFzZUZ1bmN0aW9uKGZyb21JbmRleCAvIHRvdGFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG91dHB1dCA9IGZyb21JbmRleCAqIHZhbHVlMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzdGFydDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWdnZXJCdWlsZGVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbG9uZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9DbG9uZScpO1xyXG52YXIgRGVmYXVsdHMgPSByZXF1aXJlKCcuLi90d2Vlbi9EZWZhdWx0cycpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBHZXRCb29sZWFuID0gcmVxdWlyZSgnLi9HZXRCb29sZWFuJyk7XHJcbnZhciBHZXRFYXNlRnVuY3Rpb24gPSByZXF1aXJlKCcuL0dldEVhc2VGdW5jdGlvbicpO1xyXG52YXIgR2V0TmV3VmFsdWUgPSByZXF1aXJlKCcuL0dldE5ld1ZhbHVlJyk7XHJcbnZhciBHZXRUYXJnZXRzID0gcmVxdWlyZSgnLi9HZXRUYXJnZXRzJyk7XHJcbnZhciBHZXRUd2VlbnMgPSByZXF1aXJlKCcuL0dldFR3ZWVucycpO1xyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi8uLi91dGlscy9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIFRpbWVsaW5lID0gcmVxdWlyZSgnLi4vVGltZWxpbmUnKTtcclxudmFyIFR3ZWVuQnVpbGRlciA9IHJlcXVpcmUoJy4vVHdlZW5CdWlsZGVyJyk7XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgVGltZWxpbmUgb2YgVHdlZW5zIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLkJ1aWxkZXJzLlRpbWVsaW5lQnVpbGRlclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVuTWFuYWdlcn0gbWFuYWdlciAtIFRoZSBUd2VlbiBNYW5hZ2VyIHRvIHdoaWNoIHRoZSBUaW1lbGluZSB3aWxsIGJlbG9uZy5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlRpbWVsaW5lQnVpbGRlckNvbmZpZ30gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgVGltZWxpbmUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVGltZWxpbmV9IFRoZSBjcmVhdGVkIFRpbWVsaW5lLlxyXG4gKi9cclxudmFyIFRpbWVsaW5lQnVpbGRlciA9IGZ1bmN0aW9uIChtYW5hZ2VyLCBjb25maWcpXHJcbntcclxuICAgIHZhciB0aW1lbGluZSA9IG5ldyBUaW1lbGluZShtYW5hZ2VyKTtcclxuXHJcbiAgICB2YXIgdHdlZW5zID0gR2V0VHdlZW5zKGNvbmZpZyk7XHJcblxyXG4gICAgaWYgKHR3ZWVucy5sZW5ndGggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgdGltZWxpbmUucGF1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbWVsaW5lO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBkZWZhdWx0cyA9IENsb25lKERlZmF1bHRzKTtcclxuXHJcbiAgICBkZWZhdWx0cy50YXJnZXRzID0gR2V0VGFyZ2V0cyhjb25maWcpO1xyXG5cclxuICAgIC8vICB0b3RhbER1cmF0aW9uOiBJZiBzcGVjaWZpZWQgZWFjaCB0d2VlbiBpbiB0aGUgVGltZWxpbmUgaXMgZ2l2ZW4gYW4gZXF1YWwgcG9ydGlvbiBvZiB0aGUgdG90YWxEdXJhdGlvblxyXG5cclxuICAgIHZhciB0b3RhbER1cmF0aW9uID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICd0b3RhbER1cmF0aW9uJywgMCk7XHJcblxyXG4gICAgaWYgKHRvdGFsRHVyYXRpb24gPiAwKVxyXG4gICAge1xyXG4gICAgICAgIGRlZmF1bHRzLmR1cmF0aW9uID0gTWF0aC5mbG9vcih0b3RhbER1cmF0aW9uIC8gdHdlZW5zLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgZGVmYXVsdHMuZHVyYXRpb24gPSBHZXROZXdWYWx1ZShjb25maWcsICdkdXJhdGlvbicsIGRlZmF1bHRzLmR1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWZhdWx0cy5kZWxheSA9IEdldE5ld1ZhbHVlKGNvbmZpZywgJ2RlbGF5JywgZGVmYXVsdHMuZGVsYXkpO1xyXG4gICAgZGVmYXVsdHMuZWFzZVBhcmFtcyA9IEdldFZhbHVlKGNvbmZpZywgJ2Vhc2VQYXJhbXMnLCBkZWZhdWx0cy5lYXNlUGFyYW1zKTtcclxuICAgIGRlZmF1bHRzLmVhc2UgPSBHZXRFYXNlRnVuY3Rpb24oR2V0VmFsdWUoY29uZmlnLCAnZWFzZScsIGRlZmF1bHRzLmVhc2UpLCBkZWZhdWx0cy5lYXNlUGFyYW1zKTtcclxuICAgIGRlZmF1bHRzLmhvbGQgPSBHZXROZXdWYWx1ZShjb25maWcsICdob2xkJywgZGVmYXVsdHMuaG9sZCk7XHJcbiAgICBkZWZhdWx0cy5yZXBlYXQgPSBHZXROZXdWYWx1ZShjb25maWcsICdyZXBlYXQnLCBkZWZhdWx0cy5yZXBlYXQpO1xyXG4gICAgZGVmYXVsdHMucmVwZWF0RGVsYXkgPSBHZXROZXdWYWx1ZShjb25maWcsICdyZXBlYXREZWxheScsIGRlZmF1bHRzLnJlcGVhdERlbGF5KTtcclxuICAgIGRlZmF1bHRzLnlveW8gPSBHZXRCb29sZWFuKGNvbmZpZywgJ3lveW8nLCBkZWZhdWx0cy55b3lvKTtcclxuICAgIGRlZmF1bHRzLmZsaXBYID0gR2V0Qm9vbGVhbihjb25maWcsICdmbGlwWCcsIGRlZmF1bHRzLmZsaXBYKTtcclxuICAgIGRlZmF1bHRzLmZsaXBZID0gR2V0Qm9vbGVhbihjb25maWcsICdmbGlwWScsIGRlZmF1bHRzLmZsaXBZKTtcclxuXHJcbiAgICAvLyAgQ3JlYXRlIHRoZSBUd2VlbnNcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHdlZW5zLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHRpbWVsaW5lLnF1ZXVlKFR3ZWVuQnVpbGRlcih0aW1lbGluZSwgdHdlZW5zW2ldLCBkZWZhdWx0cykpO1xyXG4gICAgfVxyXG5cclxuICAgIHRpbWVsaW5lLmNvbXBsZXRlRGVsYXkgPSBHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2NvbXBsZXRlRGVsYXknLCAwKTtcclxuICAgIHRpbWVsaW5lLmxvb3AgPSBNYXRoLnJvdW5kKEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnbG9vcCcsIDApKTtcclxuICAgIHRpbWVsaW5lLmxvb3BEZWxheSA9IE1hdGgucm91bmQoR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdsb29wRGVsYXknLCAwKSk7XHJcbiAgICB0aW1lbGluZS5wYXVzZWQgPSBHZXRCb29sZWFuKGNvbmZpZywgJ3BhdXNlZCcsIGZhbHNlKTtcclxuICAgIHRpbWVsaW5lLnVzZUZyYW1lcyA9IEdldEJvb2xlYW4oY29uZmlnLCAndXNlRnJhbWVzJywgZmFsc2UpO1xyXG5cclxuICAgIC8vICBDYWxsYmFja3NcclxuXHJcbiAgICB2YXIgc2NvcGUgPSBHZXRWYWx1ZShjb25maWcsICdjYWxsYmFja1Njb3BlJywgdGltZWxpbmUpO1xyXG5cclxuICAgIHZhciB0aW1lbGluZUFycmF5ID0gWyB0aW1lbGluZSBdO1xyXG5cclxuICAgIHZhciBvblN0YXJ0ID0gR2V0VmFsdWUoY29uZmlnLCAnb25TdGFydCcsIGZhbHNlKTtcclxuXHJcbiAgICAvLyAgVGhlIFN0YXJ0IG9mIHRoZSBUaW1lbGluZVxyXG4gICAgaWYgKG9uU3RhcnQpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9uU3RhcnRTY29wZSA9IEdldFZhbHVlKGNvbmZpZywgJ29uU3RhcnRTY29wZScsIHNjb3BlKTtcclxuICAgICAgICB2YXIgb25TdGFydFBhcmFtcyA9IEdldFZhbHVlKGNvbmZpZywgJ29uU3RhcnRQYXJhbXMnLCBbXSk7XHJcblxyXG4gICAgICAgIHRpbWVsaW5lLnNldENhbGxiYWNrKCdvblN0YXJ0Jywgb25TdGFydCwgdGltZWxpbmVBcnJheS5jb25jYXQob25TdGFydFBhcmFtcyksIG9uU3RhcnRTY29wZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG9uVXBkYXRlID0gR2V0VmFsdWUoY29uZmlnLCAnb25VcGRhdGUnLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gIEV2ZXJ5IHRpbWUgdGhlIFRpbWVsaW5lIHVwZGF0ZXMgKHJlZ2FyZGxlc3Mgd2hpY2ggVHdlZW5zIGFyZSBydW5uaW5nKVxyXG4gICAgaWYgKG9uVXBkYXRlKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvblVwZGF0ZVNjb3BlID0gR2V0VmFsdWUoY29uZmlnLCAnb25VcGRhdGVTY29wZScsIHNjb3BlKTtcclxuICAgICAgICB2YXIgb25VcGRhdGVQYXJhbXMgPSBHZXRWYWx1ZShjb25maWcsICdvblVwZGF0ZVBhcmFtcycsIFtdKTtcclxuXHJcbiAgICAgICAgdGltZWxpbmUuc2V0Q2FsbGJhY2soJ29uVXBkYXRlJywgb25VcGRhdGUsIHRpbWVsaW5lQXJyYXkuY29uY2F0KG9uVXBkYXRlUGFyYW1zKSwgb25VcGRhdGVTY29wZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG9uTG9vcCA9IEdldFZhbHVlKGNvbmZpZywgJ29uTG9vcCcsIGZhbHNlKTtcclxuXHJcbiAgICAvLyAgQ2FsbGVkIHdoZW4gdGhlIHdob2xlIFRpbWVsaW5lIGxvb3BzXHJcbiAgICBpZiAob25Mb29wKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvbkxvb3BTY29wZSA9IEdldFZhbHVlKGNvbmZpZywgJ29uTG9vcFNjb3BlJywgc2NvcGUpO1xyXG4gICAgICAgIHZhciBvbkxvb3BQYXJhbXMgPSBHZXRWYWx1ZShjb25maWcsICdvbkxvb3BQYXJhbXMnLCBbXSk7XHJcblxyXG4gICAgICAgIHRpbWVsaW5lLnNldENhbGxiYWNrKCdvbkxvb3AnLCBvbkxvb3AsIHRpbWVsaW5lQXJyYXkuY29uY2F0KG9uTG9vcFBhcmFtcyksIG9uTG9vcFNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgb25Zb3lvID0gR2V0VmFsdWUoY29uZmlnLCAnb25Zb3lvJywgZmFsc2UpO1xyXG5cclxuICAgIC8vICBDYWxsZWQgd2hlbiBhIFRpbWVsaW5lIHlveW9zXHJcbiAgICBpZiAob25Zb3lvKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBvbllveW9TY29wZSA9IEdldFZhbHVlKGNvbmZpZywgJ29uWW95b1Njb3BlJywgc2NvcGUpO1xyXG4gICAgICAgIHZhciBvbllveW9QYXJhbXMgPSBHZXRWYWx1ZShjb25maWcsICdvbllveW9QYXJhbXMnLCBbXSk7XHJcblxyXG4gICAgICAgIHRpbWVsaW5lLnNldENhbGxiYWNrKCdvbllveW8nLCBvbllveW8sIHRpbWVsaW5lQXJyYXkuY29uY2F0KG51bGwsIG9uWW95b1BhcmFtcyksIG9uWW95b1Njb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgb25Db21wbGV0ZSA9IEdldFZhbHVlKGNvbmZpZywgJ29uQ29tcGxldGUnLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gIENhbGxlZCB3aGVuIHRoZSBUaW1lbGluZSBjb21wbGV0ZXMsIGFmdGVyIHRoZSBjb21wbGV0ZURlbGF5LCBldGMuXHJcbiAgICBpZiAob25Db21wbGV0ZSlcclxuICAgIHtcclxuICAgICAgICB2YXIgb25Db21wbGV0ZVNjb3BlID0gR2V0VmFsdWUoY29uZmlnLCAnb25Db21wbGV0ZVNjb3BlJywgc2NvcGUpO1xyXG4gICAgICAgIHZhciBvbkNvbXBsZXRlUGFyYW1zID0gR2V0VmFsdWUoY29uZmlnLCAnb25Db21wbGV0ZVBhcmFtcycsIFtdKTtcclxuXHJcbiAgICAgICAgdGltZWxpbmUuc2V0Q2FsbGJhY2soJ29uQ29tcGxldGUnLCBvbkNvbXBsZXRlLCB0aW1lbGluZUFycmF5LmNvbmNhdChvbkNvbXBsZXRlUGFyYW1zKSwgb25Db21wbGV0ZVNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGltZWxpbmU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRpbWVsaW5lQnVpbGRlcjtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgRGVmYXVsdHMgPSByZXF1aXJlKCcuLi90d2Vlbi9EZWZhdWx0cycpO1xyXG52YXIgR2V0QWR2YW5jZWRWYWx1ZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL29iamVjdC9HZXRBZHZhbmNlZFZhbHVlJyk7XHJcbnZhciBHZXRCb29sZWFuID0gcmVxdWlyZSgnLi9HZXRCb29sZWFuJyk7XHJcbnZhciBHZXRFYXNlRnVuY3Rpb24gPSByZXF1aXJlKCcuL0dldEVhc2VGdW5jdGlvbicpO1xyXG52YXIgR2V0TmV3VmFsdWUgPSByZXF1aXJlKCcuL0dldE5ld1ZhbHVlJyk7XHJcbnZhciBHZXRQcm9wcyA9IHJlcXVpcmUoJy4vR2V0UHJvcHMnKTtcclxudmFyIEdldFRhcmdldHMgPSByZXF1aXJlKCcuL0dldFRhcmdldHMnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvb2JqZWN0L0dldFZhbHVlJyk7XHJcbnZhciBHZXRWYWx1ZU9wID0gcmVxdWlyZSgnLi9HZXRWYWx1ZU9wJyk7XHJcbnZhciBUd2VlbiA9IHJlcXVpcmUoJy4uL3R3ZWVuL1R3ZWVuJyk7XHJcbnZhciBUd2VlbkRhdGEgPSByZXF1aXJlKCcuLi90d2Vlbi9Ud2VlbkRhdGEnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFR3ZWVuLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlR3ZWVucy5CdWlsZGVycy5Ud2VlbkJ1aWxkZXJcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7KFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfFBoYXNlci5Ud2VlbnMuVGltZWxpbmUpfSBwYXJlbnQgLSBUaGUgb3duZXIgb2YgdGhlIG5ldyBUd2Vlbi5cclxuICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuQnVpbGRlckNvbmZpZ3xvYmplY3R9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBuZXcgVHdlZW4uXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5Ud2VlbkNvbmZpZ0RlZmF1bHRzfSBkZWZhdWx0cyAtIFR3ZWVuIGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBuZXcgdHdlZW4uXHJcbiAqL1xyXG52YXIgVHdlZW5CdWlsZGVyID0gZnVuY3Rpb24gKHBhcmVudCwgY29uZmlnLCBkZWZhdWx0cylcclxue1xyXG4gICAgaWYgKGRlZmF1bHRzID09PSB1bmRlZmluZWQpXHJcbiAgICB7XHJcbiAgICAgICAgZGVmYXVsdHMgPSBEZWZhdWx0cztcclxuICAgIH1cclxuXHJcbiAgICAvLyAgQ3JlYXRlIGFycmF5cyBvZiB0aGUgVGFyZ2V0cyBhbmQgdGhlIFByb3BlcnRpZXNcclxuICAgIHZhciB0YXJnZXRzID0gKGRlZmF1bHRzLnRhcmdldHMpID8gZGVmYXVsdHMudGFyZ2V0cyA6IEdldFRhcmdldHMoY29uZmlnKTtcclxuXHJcbiAgICAvLyB2YXIgcHJvcHMgPSAoZGVmYXVsdHMucHJvcHMpID8gZGVmYXVsdHMucHJvcHMgOiBHZXRQcm9wcyhjb25maWcpO1xyXG4gICAgdmFyIHByb3BzID0gR2V0UHJvcHMoY29uZmlnKTtcclxuXHJcbiAgICAvLyAgRGVmYXVsdCBUd2VlbiB2YWx1ZXNcclxuICAgIHZhciBkZWxheSA9IEdldE5ld1ZhbHVlKGNvbmZpZywgJ2RlbGF5JywgZGVmYXVsdHMuZGVsYXkpO1xyXG4gICAgdmFyIGR1cmF0aW9uID0gR2V0TmV3VmFsdWUoY29uZmlnLCAnZHVyYXRpb24nLCBkZWZhdWx0cy5kdXJhdGlvbik7XHJcbiAgICB2YXIgZWFzZVBhcmFtcyA9IEdldFZhbHVlKGNvbmZpZywgJ2Vhc2VQYXJhbXMnLCBkZWZhdWx0cy5lYXNlUGFyYW1zKTtcclxuICAgIHZhciBlYXNlID0gR2V0RWFzZUZ1bmN0aW9uKEdldFZhbHVlKGNvbmZpZywgJ2Vhc2UnLCBkZWZhdWx0cy5lYXNlKSwgZWFzZVBhcmFtcyk7XHJcbiAgICB2YXIgaG9sZCA9IEdldE5ld1ZhbHVlKGNvbmZpZywgJ2hvbGQnLCBkZWZhdWx0cy5ob2xkKTtcclxuICAgIHZhciByZXBlYXQgPSBHZXROZXdWYWx1ZShjb25maWcsICdyZXBlYXQnLCBkZWZhdWx0cy5yZXBlYXQpO1xyXG4gICAgdmFyIHJlcGVhdERlbGF5ID0gR2V0TmV3VmFsdWUoY29uZmlnLCAncmVwZWF0RGVsYXknLCBkZWZhdWx0cy5yZXBlYXREZWxheSk7XHJcbiAgICB2YXIgeW95byA9IEdldEJvb2xlYW4oY29uZmlnLCAneW95bycsIGRlZmF1bHRzLnlveW8pO1xyXG4gICAgdmFyIGZsaXBYID0gR2V0Qm9vbGVhbihjb25maWcsICdmbGlwWCcsIGRlZmF1bHRzLmZsaXBYKTtcclxuICAgIHZhciBmbGlwWSA9IEdldEJvb2xlYW4oY29uZmlnLCAnZmxpcFknLCBkZWZhdWx0cy5mbGlwWSk7XHJcblxyXG4gICAgdmFyIGRhdGEgPSBbXTtcclxuXHJcbiAgICAvLyAgTG9vcCB0aHJvdWdoIGV2ZXJ5IHByb3BlcnR5IGRlZmluZWQgaW4gdGhlIFR3ZWVuLCBpLmUuOiBwcm9wcyB7IHgsIHksIGFscGhhIH1cclxuICAgIGZvciAodmFyIHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW3BdLmtleTtcclxuICAgICAgICB2YXIgdmFsdWUgPSBwcm9wc1twXS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8gIENyZWF0ZSAxIFR3ZWVuRGF0YSBwZXIgdGFyZ2V0LCBwZXIgcHJvcGVydHlcclxuICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IHRhcmdldHMubGVuZ3RoOyB0KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb3BzID0gR2V0VmFsdWVPcChrZXksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIHZhciB0d2VlbkRhdGEgPSBUd2VlbkRhdGEoXHJcbiAgICAgICAgICAgICAgICB0YXJnZXRzW3RdLFxyXG4gICAgICAgICAgICAgICAgdCxcclxuICAgICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICAgIG9wcy5nZXRFbmQsXHJcbiAgICAgICAgICAgICAgICBvcHMuZ2V0U3RhcnQsXHJcbiAgICAgICAgICAgICAgICBvcHMuZ2V0QWN0aXZlLFxyXG4gICAgICAgICAgICAgICAgR2V0RWFzZUZ1bmN0aW9uKEdldFZhbHVlKHZhbHVlLCAnZWFzZScsIGVhc2UpLCBlYXNlUGFyYW1zKSxcclxuICAgICAgICAgICAgICAgIEdldE5ld1ZhbHVlKHZhbHVlLCAnZGVsYXknLCBkZWxheSksXHJcbiAgICAgICAgICAgICAgICBHZXROZXdWYWx1ZSh2YWx1ZSwgJ2R1cmF0aW9uJywgZHVyYXRpb24pLFxyXG4gICAgICAgICAgICAgICAgR2V0Qm9vbGVhbih2YWx1ZSwgJ3lveW8nLCB5b3lvKSxcclxuICAgICAgICAgICAgICAgIEdldE5ld1ZhbHVlKHZhbHVlLCAnaG9sZCcsIGhvbGQpLFxyXG4gICAgICAgICAgICAgICAgR2V0TmV3VmFsdWUodmFsdWUsICdyZXBlYXQnLCByZXBlYXQpLFxyXG4gICAgICAgICAgICAgICAgR2V0TmV3VmFsdWUodmFsdWUsICdyZXBlYXREZWxheScsIHJlcGVhdERlbGF5KSxcclxuICAgICAgICAgICAgICAgIEdldEJvb2xlYW4odmFsdWUsICdmbGlwWCcsIGZsaXBYKSxcclxuICAgICAgICAgICAgICAgIEdldEJvb2xlYW4odmFsdWUsICdmbGlwWScsIGZsaXBZKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgZGF0YS5wdXNoKHR3ZWVuRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciB0d2VlbiA9IG5ldyBUd2VlbihwYXJlbnQsIGRhdGEsIHRhcmdldHMpO1xyXG5cclxuICAgIHR3ZWVuLm9mZnNldCA9IEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnb2Zmc2V0JywgbnVsbCk7XHJcbiAgICB0d2Vlbi5jb21wbGV0ZURlbGF5ID0gR2V0QWR2YW5jZWRWYWx1ZShjb25maWcsICdjb21wbGV0ZURlbGF5JywgMCk7XHJcbiAgICB0d2Vlbi5sb29wID0gTWF0aC5yb3VuZChHZXRBZHZhbmNlZFZhbHVlKGNvbmZpZywgJ2xvb3AnLCAwKSk7XHJcbiAgICB0d2Vlbi5sb29wRGVsYXkgPSBNYXRoLnJvdW5kKEdldEFkdmFuY2VkVmFsdWUoY29uZmlnLCAnbG9vcERlbGF5JywgMCkpO1xyXG4gICAgdHdlZW4ucGF1c2VkID0gR2V0Qm9vbGVhbihjb25maWcsICdwYXVzZWQnLCBmYWxzZSk7XHJcbiAgICB0d2Vlbi51c2VGcmFtZXMgPSBHZXRCb29sZWFuKGNvbmZpZywgJ3VzZUZyYW1lcycsIGZhbHNlKTtcclxuXHJcbiAgICAvLyAgU2V0IHRoZSBDYWxsYmFja3NcclxuICAgIHZhciBzY29wZSA9IEdldFZhbHVlKGNvbmZpZywgJ2NhbGxiYWNrU2NvcGUnLCB0d2Vlbik7XHJcblxyXG4gICAgLy8gIENhbGxiYWNrIHBhcmFtZXRlcnM6IDAgPSBhIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaXRzZWxmLCAxID0gdGhlIHRhcmdldC9zIG9mIHRoZSBUd2VlbiwgLi4uIHlvdXIgb3duIHBhcmFtc1xyXG4gICAgdmFyIHR3ZWVuQXJyYXkgPSBbIHR3ZWVuLCBudWxsIF07XHJcblxyXG4gICAgdmFyIGNhbGxiYWNrcyA9IFR3ZWVuLlRZUEVTO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB0eXBlID0gY2FsbGJhY2tzW2ldO1xyXG5cclxuICAgICAgICB2YXIgY2FsbGJhY2sgPSBHZXRWYWx1ZShjb25maWcsIHR5cGUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrU2NvcGUgPSBHZXRWYWx1ZShjb25maWcsIHR5cGUgKyAnU2NvcGUnLCBzY29wZSk7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFja1BhcmFtcyA9IEdldFZhbHVlKGNvbmZpZywgdHlwZSArICdQYXJhbXMnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAvLyAgVGhlIG51bGwgaXMgcmVzZXQgdG8gYmUgdGhlIFR3ZWVuIHRhcmdldFxyXG4gICAgICAgICAgICB0d2Vlbi5zZXRDYWxsYmFjayh0eXBlLCBjYWxsYmFjaywgdHdlZW5BcnJheS5jb25jYXQoY2FsbGJhY2tQYXJhbXMpLCBjYWxsYmFja1Njb3BlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHR3ZWVuO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUd2VlbkJ1aWxkZXI7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlR3ZWVucy5CdWlsZGVyc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEdldEJvb2xlYW46IHJlcXVpcmUoJy4vR2V0Qm9vbGVhbicpLFxyXG4gICAgR2V0RWFzZUZ1bmN0aW9uOiByZXF1aXJlKCcuL0dldEVhc2VGdW5jdGlvbicpLFxyXG4gICAgR2V0TmV3VmFsdWU6IHJlcXVpcmUoJy4vR2V0TmV3VmFsdWUnKSxcclxuICAgIEdldFByb3BzOiByZXF1aXJlKCcuL0dldFByb3BzJyksXHJcbiAgICBHZXRUYXJnZXRzOiByZXF1aXJlKCcuL0dldFRhcmdldHMnKSxcclxuICAgIEdldFR3ZWVuczogcmVxdWlyZSgnLi9HZXRUd2VlbnMnKSxcclxuICAgIEdldFZhbHVlT3A6IHJlcXVpcmUoJy4vR2V0VmFsdWVPcCcpLFxyXG4gICAgTnVtYmVyVHdlZW5CdWlsZGVyOiByZXF1aXJlKCcuL051bWJlclR3ZWVuQnVpbGRlcicpLFxyXG4gICAgU3RhZ2dlckJ1aWxkZXI6IHJlcXVpcmUoJy4vU3RhZ2dlckJ1aWxkZXInKSxcclxuICAgIFRpbWVsaW5lQnVpbGRlcjogcmVxdWlyZSgnLi9UaW1lbGluZUJ1aWxkZXInKSxcclxuICAgIFR3ZWVuQnVpbGRlcjogcmVxdWlyZSgnLi9Ud2VlbkJ1aWxkZXInKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRpbWVsaW5lIENvbXBsZXRlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gVGltZWxpbmUgd2hlbiBpdCBjb21wbGV0ZXMgcGxheWJhY2suXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFRpbWVsaW5lIGluc3RhbmNlIHVzaW5nIGBUaW1lbGluZS5vbignY29tcGxldGUnLCBsaXN0ZW5lcilgLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgdGltZWxpbmUgPSB0aGlzLnR3ZWVucy50aW1lbGluZSh7XHJcbiAqICAgICB0YXJnZXRzOiBpbWFnZSxcclxuICogICAgIGVhc2U6ICdQb3dlcjEnLFxyXG4gKiAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAqICAgICB0d2VlbnM6IFsgeyB4OiA2MDAgfSwgeyB5OiA1MDAgfSwgeyB4OiAxMDAgfSwgeyB5OiAxMDAgfSBdXHJcbiAqIH0pO1xyXG4gKiB0aW1lbGluZS5vbignY29tcGxldGUnLCBsaXN0ZW5lcik7XHJcbiAqIHRpbWVsaW5lLnBsYXkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9DT01QTEVURVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5UaW1lbGluZX0gdGltZWxpbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgVGltZWxpbmUgaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2NvbXBsZXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRpbWVsaW5lIExvb3AgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBUd2VlbiBUaW1lbGluZSBldmVyeSB0aW1lIGl0IGxvb3BzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUaW1lbGluZSBpbnN0YW5jZSB1c2luZyBgVGltZWxpbmUub24oJ2xvb3AnLCBsaXN0ZW5lcilgLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgdGltZWxpbmUgPSB0aGlzLnR3ZWVucy50aW1lbGluZSh7XHJcbiAqICAgICB0YXJnZXRzOiBpbWFnZSxcclxuICogICAgIGVhc2U6ICdQb3dlcjEnLFxyXG4gKiAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAqICAgICBsb29wOiA0LFxyXG4gKiAgICAgdHdlZW5zOiBbIHsgeDogNjAwIH0sIHsgeTogNTAwIH0sIHsgeDogMTAwIH0sIHsgeTogMTAwIH0gXVxyXG4gKiB9KTtcclxuICogdGltZWxpbmUub24oJ2xvb3AnLCBsaXN0ZW5lcik7XHJcbiAqIHRpbWVsaW5lLnBsYXkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9MT09QXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlRpbWVsaW5lfSB0aW1lbGluZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUaW1lbGluZSBpbnN0YW5jZSB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAnbG9vcCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBUaW1lbGluZSBQYXVzZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFR3ZWVuIFRpbWVsaW5lIHdoZW4gaXQgaXMgcGF1c2VkLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUaW1lbGluZSBpbnN0YW5jZSB1c2luZyBgVGltZWxpbmUub24oJ3BhdXNlJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHRpbWVsaW5lID0gdGhpcy50d2VlbnMudGltZWxpbmUoe1xyXG4gKiAgICAgdGFyZ2V0czogaW1hZ2UsXHJcbiAqICAgICBlYXNlOiAnUG93ZXIxJyxcclxuICogICAgIGR1cmF0aW9uOiAzMDAwLFxyXG4gKiAgICAgdHdlZW5zOiBbIHsgeDogNjAwIH0sIHsgeTogNTAwIH0sIHsgeDogMTAwIH0sIHsgeTogMTAwIH0gXVxyXG4gKiB9KTtcclxuICogdGltZWxpbmUub24oJ3BhdXNlJywgbGlzdGVuZXIpO1xyXG4gKiAvLyBBdCBzb21lIHBvaW50IGxhdGVyIC4uLlxyXG4gKiB0aW1lbGluZS5wYXVzZSgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RJTUVMSU5FX1BBVVNFXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlRpbWVsaW5lfSB0aW1lbGluZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUaW1lbGluZSBpbnN0YW5jZSB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncGF1c2UnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVGltZWxpbmUgUmVzdW1lIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gVGltZWxpbmUgd2hlbiBpdCBpcyByZXN1bWVkIGZyb20gYSBwYXVzZWQgc3RhdGUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFRpbWVsaW5lIGluc3RhbmNlIHVzaW5nIGBUaW1lbGluZS5vbigncmVzdW1lJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHRpbWVsaW5lID0gdGhpcy50d2VlbnMudGltZWxpbmUoe1xyXG4gKiAgICAgdGFyZ2V0czogaW1hZ2UsXHJcbiAqICAgICBlYXNlOiAnUG93ZXIxJyxcclxuICogICAgIGR1cmF0aW9uOiAzMDAwLFxyXG4gKiAgICAgdHdlZW5zOiBbIHsgeDogNjAwIH0sIHsgeTogNTAwIH0sIHsgeDogMTAwIH0sIHsgeTogMTAwIH0gXVxyXG4gKiB9KTtcclxuICogdGltZWxpbmUub24oJ3Jlc3VtZScsIGxpc3RlbmVyKTtcclxuICogLy8gQXQgc29tZSBwb2ludCBsYXRlciAuLi5cclxuICogdGltZWxpbmUucmVzdW1lKCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlR3ZWVucy5FdmVudHMjVElNRUxJTkVfUkVTVU1FXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlRpbWVsaW5lfSB0aW1lbGluZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUaW1lbGluZSBpbnN0YW5jZSB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAncmVzdW1lJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRpbWVsaW5lIFN0YXJ0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gVGltZWxpbmUgd2hlbiBpdCBzdGFydHMuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFRpbWVsaW5lIGluc3RhbmNlIHVzaW5nIGBUaW1lbGluZS5vbignc3RhcnQnLCBsaXN0ZW5lcilgLCBpLmUuOlxyXG4gKiBcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiB2YXIgdGltZWxpbmUgPSB0aGlzLnR3ZWVucy50aW1lbGluZSh7XHJcbiAqICAgICB0YXJnZXRzOiBpbWFnZSxcclxuICogICAgIGVhc2U6ICdQb3dlcjEnLFxyXG4gKiAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAqICAgICB0d2VlbnM6IFsgeyB4OiA2MDAgfSwgeyB5OiA1MDAgfSwgeyB4OiAxMDAgfSwgeyB5OiAxMDAgfSBdXHJcbiAqIH0pO1xyXG4gKiB0aW1lbGluZS5vbignc3RhcnQnLCBsaXN0ZW5lcik7XHJcbiAqIHRpbWVsaW5lLnBsYXkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9TVEFSVFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5UaW1lbGluZX0gdGltZWxpbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgVGltZWxpbmUgaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3N0YXJ0JztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFRpbWVsaW5lIFVwZGF0ZSBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFR3ZWVuIFRpbWVsaW5lIGV2ZXJ5IHRpbWUgaXQgdXBkYXRlcywgd2hpY2ggY2FuIGhhcHBlbiBhIGxvdCBvZiB0aW1lcyBwZXIgc2Vjb25kLFxyXG4gKiBzbyBiZSBjYXJlZnVsIGFib3V0IGxpc3RlbmluZyB0byB0aGlzIGV2ZW50IHVubGVzcyB5b3UgYWJzb2x1dGVseSByZXF1aXJlIGl0LlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUaW1lbGluZSBpbnN0YW5jZSB1c2luZyBgVGltZWxpbmUub24oJ3VwZGF0ZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciB0aW1lbGluZSA9IHRoaXMudHdlZW5zLnRpbWVsaW5lKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMCxcclxuICogICAgIHR3ZWVuczogWyB7IHg6IDYwMCB9LCB7IHk6IDUwMCB9LCB7IHg6IDEwMCB9LCB7IHk6IDEwMCB9IF1cclxuICogfSk7XHJcbiAqIHRpbWVsaW5lLm9uKCd1cGRhdGUnLCBsaXN0ZW5lcik7XHJcbiAqIHRpbWVsaW5lLnBsYXkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBldmVudCBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUSU1FTElORV9VUERBVEVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1BoYXNlci5Ud2VlbnMuVGltZWxpbmV9IHRpbWVsaW5lIC0gQSByZWZlcmVuY2UgdG8gdGhlIFRpbWVsaW5lIGluc3RhbmNlIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd1cGRhdGUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVHdlZW4gQWN0aXZlIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gd2hlbiBpdCBiZWNvbWVzIGFjdGl2ZSB3aXRoaW4gdGhlIFR3ZWVuIE1hbmFnZXIuXHJcbiAqIFxyXG4gKiBBbiAnYWN0aXZlJyBUd2VlbiBpcyBvbmUgdGhhdCBpcyBub3cgcHJvZ3Jlc3NpbmcsIGFsdGhvdWdoIGl0IG1heSBub3QgeWV0IGJlIHVwZGF0aW5nXHJcbiAqIGFueSB0YXJnZXQgcHJvcGVydGllcywgZHVlIHRvIHNldHRpbmdzIHN1Y2ggYXMgYGRlbGF5YC4gSWYgeW91IG5lZWQgYW4gZXZlbnQgZm9yIHdoZW5cclxuICogdGhlIFR3ZWVuIHN0YXJ0cyBhY3R1YWxseSB1cGRhdGluZyBpdHMgZmlyc3QgcHJvcGVydHksIHNlZSBgVFdFRU5fU1RBUlRgLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUd2VlbiBpbnN0YW5jZSB1c2luZyBgVHdlZW4ub24oJ2FjdGl2ZScsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciB0d2VlbiA9IHRoaXMudHdlZW5zLmFkZCh7XHJcbiAqICAgICB0YXJnZXRzOiBpbWFnZSxcclxuICogICAgIHg6IDUwMCxcclxuICogICAgIGVhc2U6ICdQb3dlcjEnLFxyXG4gKiAgICAgZHVyYXRpb246IDMwMDBcclxuICogfSk7XHJcbiAqIHR3ZWVuLm9uKCdhY3RpdmUnLCBsaXN0ZW5lcik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlR3ZWVucy5FdmVudHMjVFdFRU5fQUNUSVZFXHJcbiAqIEBzaW5jZSAzLjE5LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHthbnlbXX0gdGFyZ2V0cyAtIEFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldC9zIHRoZSBUd2VlbiBpcyBvcGVyYXRpbmcgb24uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdhY3RpdmUnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVHdlZW4gQ29tcGxldGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBUd2VlbiB3aGVuIGl0IGNvbXBsZXRlcyBwbGF5YmFjayBlbnRpcmVseSwgZmFjdG9yaW5nIGluIHJlcGVhdHMgYW5kIGxvb3BzLlxyXG4gKiBcclxuICogSWYgdGhlIFR3ZWVuIGhhcyBiZWVuIHNldCB0byBsb29wIG9yIHJlcGVhdCBpbmZpbml0ZWx5LCB0aGlzIGV2ZW50IHdpbGwgbm90IGJlIGRpc3BhdGNoZWRcclxuICogdW5sZXNzIHRoZSBgVHdlZW4uc3RvcGAgbWV0aG9kIGlzIGNhbGxlZC5cclxuICogXHJcbiAqIElmIGEgVHdlZW4gaGFzIGEgYGNvbXBsZXRlRGVsYXlgIHNldCwgdGhpcyBldmVudCB3aWxsIGZpcmUgYWZ0ZXIgdGhhdCBkZWxheSBleHBpcmVzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUd2VlbiBpbnN0YW5jZSB1c2luZyBgVHdlZW4ub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgeDogNTAwLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMFxyXG4gKiB9KTtcclxuICogdHdlZW4ub24oJ2NvbXBsZXRlJywgbGlzdGVuZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX0NPTVBMRVRFXHJcbiAqIEBzaW5jZSAzLjE5LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHthbnlbXX0gdGFyZ2V0cyAtIEFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldC9zIHRoZSBUd2VlbiBpcyBvcGVyYXRpbmcgb24uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdjb21wbGV0ZSc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBUd2VlbiBMb29wIEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gd2hlbiBpdCBsb29wcy5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgd2lsbCBvbmx5IGJlIGRpc3BhdGNoZWQgaWYgdGhlIFR3ZWVuIGhhcyBhIGxvb3AgY291bnQgc2V0LlxyXG4gKiBcclxuICogSWYgYSBUd2VlbiBoYXMgYSBgbG9vcERlbGF5YCBzZXQsIHRoaXMgZXZlbnQgd2lsbCBmaXJlIGFmdGVyIHRoYXQgZGVsYXkgZXhwaXJlcy5cclxuICogXHJcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYGxvb3BgIGFuZCBgcmVwZWF0YCBpcyB0aGF0IGByZXBlYXRgIGlzIGEgcHJvcGVydHkgc2V0dGluZyxcclxuICogd2hlcmUtYXMgYGxvb3BgIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBUd2Vlbi5cclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgVHdlZW4gaW5zdGFuY2UgdXNpbmcgYFR3ZWVuLm9uKCdsb29wJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgeDogNTAwLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMCxcclxuICogICAgIGxvb3A6IDZcclxuICogfSk7XHJcbiAqIHR3ZWVuLm9uKCdsb29wJywgbGlzdGVuZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX0xPT1BcclxuICogQHNpbmNlIDMuMTkuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUd2VlbiBpbnN0YW5jZSB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge2FueVtdfSB0YXJnZXRzIC0gQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0L3MgdGhlIFR3ZWVuIGlzIG9wZXJhdGluZyBvbi5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ2xvb3AnO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgVHdlZW4gUmVwZWF0IEV2ZW50LlxyXG4gKiBcclxuICogVGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IGEgVHdlZW4gd2hlbiBvbmUgb2YgdGhlIHByb3BlcnRpZXMgaXQgaXMgdHdlZW5pbmcgcmVwZWF0cy5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgd2lsbCBvbmx5IGJlIGRpc3BhdGNoZWQgaWYgdGhlIFR3ZWVuIGhhcyBhIHByb3BlcnR5IHdpdGggYSByZXBlYXQgY291bnQgc2V0LlxyXG4gKiBcclxuICogSWYgYSBUd2VlbiBoYXMgYSBgcmVwZWF0RGVsYXlgIHNldCwgdGhpcyBldmVudCB3aWxsIGZpcmUgYWZ0ZXIgdGhhdCBkZWxheSBleHBpcmVzLlxyXG4gKiBcclxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBgbG9vcGAgYW5kIGByZXBlYXRgIGlzIHRoYXQgYHJlcGVhdGAgaXMgYSBwcm9wZXJ0eSBzZXR0aW5nLFxyXG4gKiB3aGVyZS1hcyBgbG9vcGAgYXBwbGllcyB0byB0aGUgZW50aXJlIFR3ZWVuLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUd2VlbiBpbnN0YW5jZSB1c2luZyBgVHdlZW4ub24oJ3JlcGVhdCcsIGxpc3RlbmVyKWAsIGkuZS46XHJcbiAqIFxyXG4gKiBgYGBqYXZhc2NyaXB0XHJcbiAqIHZhciB0d2VlbiA9IHRoaXMudHdlZW5zLmFkZCh7XHJcbiAqICAgICB0YXJnZXRzOiBpbWFnZSxcclxuICogICAgIHg6IDUwMCxcclxuICogICAgIGVhc2U6ICdQb3dlcjEnLFxyXG4gKiAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAqICAgICByZXBlYXQ6IDRcclxuICogfSk7XHJcbiAqIHR3ZWVuLm9uKCdyZXBlYXQnLCBsaXN0ZW5lcik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlR3ZWVucy5FdmVudHMjVFdFRU5fUkVQRUFUXHJcbiAqIEBzaW5jZSAzLjE5LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRoYXQganVzdCByZXBlYXRlZC5cclxuICogQHBhcmFtIHthbnl9IHRhcmdldCAtIFRoZSB0YXJnZXQgdGhhdCB0aGUgcHJvcGVydHkganVzdCByZXBlYXRlZCBvbi5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gJ3JlcGVhdCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBUd2VlbiBTdGFydCBFdmVudC5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBhIFR3ZWVuIHdoZW4gaXQgc3RhcnRzIHR3ZWVuaW5nIGl0cyBmaXJzdCBwcm9wZXJ0eS5cclxuICogXHJcbiAqIEEgVHdlZW4gd2lsbCBvbmx5IGVtaXQgdGhpcyBldmVudCBvbmNlLCBhcyBpdCBjYW4gb25seSBzdGFydCBvbmNlLlxyXG4gKiBcclxuICogSWYgYSBUd2VlbiBoYXMgYSBgZGVsYXlgIHNldCwgdGhpcyBldmVudCB3aWxsIGZpcmUgYWZ0ZXIgdGhhdCBkZWxheSBleHBpcmVzLlxyXG4gKiBcclxuICogTGlzdGVuIHRvIGl0IGZyb20gYSBUd2VlbiBpbnN0YW5jZSB1c2luZyBgVHdlZW4ub24oJ3N0YXJ0JywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgeDogNTAwLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMFxyXG4gKiB9KTtcclxuICogdHdlZW4ub24oJ3N0YXJ0JywgbGlzdGVuZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1NUQVJUXHJcbiAqIEBzaW5jZSAzLjE5LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHthbnlbXX0gdGFyZ2V0cyAtIEFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldC9zIHRoZSBUd2VlbiBpcyBvcGVyYXRpbmcgb24uXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICdzdGFydCc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBUd2VlbiBVcGRhdGUgRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBUd2VlbiBldmVyeSB0aW1lIGl0IHVwZGF0ZXMgX2FueV8gb2YgdGhlIHByb3BlcnRpZXMgaXQgaXMgdHdlZW5pbmcuXHJcbiAqIFxyXG4gKiBBIFR3ZWVuIHRoYXQgaXMgY2hhbmdpbmcgMyBwcm9wZXJ0aWVzIG9mIGEgdGFyZ2V0IHdpbGwgZW1pdCB0aGlzIGV2ZW50IDMgdGltZXMgcGVyIGNoYW5nZSwgb25jZSBwZXIgcHJvcGVydHkuXHJcbiAqIFxyXG4gKiAqKk5vdGU6KiogVGhpcyBpcyBhIHZlcnkgaGlnaCBmcmVxdWVuY3kgZXZlbnQgYW5kIG1heSBiZSBkaXNwYXRjaGVkIG11bHRpcGxlIHRpbWVzLCBldmVyeSBzaW5nbGUgZnJhbWUuXHJcbiAqIFxyXG4gKiBMaXN0ZW4gdG8gaXQgZnJvbSBhIFR3ZWVuIGluc3RhbmNlIHVzaW5nIGBUd2Vlbi5vbigndXBkYXRlJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgeDogNTAwLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMCxcclxuICogfSk7XHJcbiAqIHR3ZWVuLm9uKCd1cGRhdGUnLCBsaXN0ZW5lcik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZXZlbnQgUGhhc2VyLlR3ZWVucy5FdmVudHMjVFdFRU5fVVBEQVRFXHJcbiAqIEBzaW5jZSAzLjE5LjBcclxuICogXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBBIHJlZmVyZW5jZSB0byB0aGUgVHdlZW4gaW5zdGFuY2UgdGhhdCBlbWl0dGVkIHRoZSBldmVudC5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyB1cGRhdGVkLCBpLmUuIGB4YCBvciBgc2NhbGVgLlxyXG4gKiBAcGFyYW0ge2FueX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCB3YXMgdXBkYXRlZC4gVXN1YWxseSBhIEdhbWUgT2JqZWN0LCBidXQgY2FuIGJlIG9mIGFueSB0eXBlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY3VycmVudCAtIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyB0d2VlbmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcHJldmlvdXMgLSBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIHR3ZWVuZWQsIHByaW9yIHRvIHRoaXMgdXBkYXRlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSAndXBkYXRlJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIFR3ZWVuIFlveW8gRXZlbnQuXHJcbiAqIFxyXG4gKiBUaGlzIGV2ZW50IGlzIGRpc3BhdGNoZWQgYnkgYSBUd2VlbiB3aGVuZXZlciBhIHByb3BlcnR5IGl0IGlzIHR3ZWVuaW5nIHlveW9zLlxyXG4gKiBcclxuICogVGhpcyBldmVudCB3aWxsIG9ubHkgYmUgZGlzcGF0Y2hlZCBpZiB0aGUgVHdlZW4gaGFzIGEgcHJvcGVydHkgd2l0aCBgeW95b2Agc2V0LlxyXG4gKiBcclxuICogSWYgdGhlIFR3ZWVuIGhhcyBhIGBob2xkYCB2YWx1ZSwgdGhpcyBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIGhvbGQgZXhwaXJlcy5cclxuICogXHJcbiAqIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBmb3IgZXZlcnkgcHJvcGVydHksIGFuZCBmb3IgZXZlcnkgdGFyZ2V0LCB0aGF0IHlveW9zLlxyXG4gKiBGb3IgZXhhbXBsZSwgaWYgYSBUd2VlbiB3YXMgdXBkYXRpbmcgMiBwcm9wZXJ0aWVzIGFuZCBoYWQgMTAgdGFyZ2V0cywgdGhpcyBldmVudFxyXG4gKiB3b3VsZCBiZSBkaXNwYXRjaGVkIDIwIHRpbWVzICh0d2ljZSBwZXIgdGFyZ2V0KS4gU28gYmUgY2FyZWZ1bCBob3cgeW91IHVzZSBpdCFcclxuICogXHJcbiAqIExpc3RlbiB0byBpdCBmcm9tIGEgVHdlZW4gaW5zdGFuY2UgdXNpbmcgYFR3ZWVuLm9uKCd5b3lvJywgbGlzdGVuZXIpYCwgaS5lLjpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIHR3ZWVuID0gdGhpcy50d2VlbnMuYWRkKHtcclxuICogICAgIHRhcmdldHM6IGltYWdlLFxyXG4gKiAgICAgeDogNTAwLFxyXG4gKiAgICAgZWFzZTogJ1Bvd2VyMScsXHJcbiAqICAgICBkdXJhdGlvbjogMzAwMCxcclxuICogICAgIHlveW86IHRydWVcclxuICogfSk7XHJcbiAqIHR3ZWVuLm9uKCd5b3lvJywgbGlzdGVuZXIpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGV2ZW50IFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1lPWU9cclxuICogQHNpbmNlIDMuMTkuMFxyXG4gKiBcclxuICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBUd2VlbiBpbnN0YW5jZSB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IHRoYXQgeW95bydkLCBpLmUuIGB4YCBvciBgc2NhbGVgLlxyXG4gKiBAcGFyYW0ge2FueX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCB3YXMgeW95bydkLiBVc3VhbGx5IGEgR2FtZSBPYmplY3QsIGJ1dCBjYW4gYmUgb2YgYW55IHR5cGUuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9ICd5b3lvJztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuVHdlZW5zLkV2ZW50c1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIFRJTUVMSU5FX0NPTVBMRVRFOiByZXF1aXJlKCcuL1RJTUVMSU5FX0NPTVBMRVRFX0VWRU5UJyksXHJcbiAgICBUSU1FTElORV9MT09QOiByZXF1aXJlKCcuL1RJTUVMSU5FX0xPT1BfRVZFTlQnKSxcclxuICAgIFRJTUVMSU5FX1BBVVNFOiByZXF1aXJlKCcuL1RJTUVMSU5FX1BBVVNFX0VWRU5UJyksXHJcbiAgICBUSU1FTElORV9SRVNVTUU6IHJlcXVpcmUoJy4vVElNRUxJTkVfUkVTVU1FX0VWRU5UJyksXHJcbiAgICBUSU1FTElORV9TVEFSVDogcmVxdWlyZSgnLi9USU1FTElORV9TVEFSVF9FVkVOVCcpLFxyXG4gICAgVElNRUxJTkVfVVBEQVRFOiByZXF1aXJlKCcuL1RJTUVMSU5FX1VQREFURV9FVkVOVCcpLFxyXG4gICAgVFdFRU5fQUNUSVZFOiByZXF1aXJlKCcuL1RXRUVOX0FDVElWRV9FVkVOVCcpLFxyXG4gICAgVFdFRU5fQ09NUExFVEU6IHJlcXVpcmUoJy4vVFdFRU5fQ09NUExFVEVfRVZFTlQnKSxcclxuICAgIFRXRUVOX0xPT1A6IHJlcXVpcmUoJy4vVFdFRU5fTE9PUF9FVkVOVCcpLFxyXG4gICAgVFdFRU5fUkVQRUFUOiByZXF1aXJlKCcuL1RXRUVOX1JFUEVBVF9FVkVOVCcpLFxyXG4gICAgVFdFRU5fU1RBUlQ6IHJlcXVpcmUoJy4vVFdFRU5fU1RBUlRfRVZFTlQnKSxcclxuICAgIFRXRUVOX1VQREFURTogcmVxdWlyZSgnLi9UV0VFTl9VUERBVEVfRVZFTlQnKSxcclxuICAgIFRXRUVOX1lPWU86IHJlcXVpcmUoJy4vVFdFRU5fWU9ZT19FVkVOVCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDT05TVCA9IHJlcXVpcmUoJy4vdHdlZW4vY29uc3QnKTtcclxudmFyIEV4dGVuZCA9IHJlcXVpcmUoJy4uL3V0aWxzL29iamVjdC9FeHRlbmQnKTtcclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5Ud2VlbnNcclxuICovXHJcblxyXG52YXIgVHdlZW5zID0ge1xyXG5cclxuICAgIEJ1aWxkZXJzOiByZXF1aXJlKCcuL2J1aWxkZXJzJyksXHJcbiAgICBFdmVudHM6IHJlcXVpcmUoJy4vZXZlbnRzJyksXHJcblxyXG4gICAgVHdlZW5NYW5hZ2VyOiByZXF1aXJlKCcuL1R3ZWVuTWFuYWdlcicpLFxyXG4gICAgVHdlZW46IHJlcXVpcmUoJy4vdHdlZW4vVHdlZW4nKSxcclxuICAgIFR3ZWVuRGF0YTogcmVxdWlyZSgnLi90d2Vlbi9Ud2VlbkRhdGEnKSxcclxuICAgIFRpbWVsaW5lOiByZXF1aXJlKCcuL1RpbWVsaW5lJylcclxuXHJcbn07XHJcblxyXG4vLyAgIE1lcmdlIGluIHRoZSBjb25zdHNcclxuVHdlZW5zID0gRXh0ZW5kKGZhbHNlLCBUd2VlbnMsIENPTlNUKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHdlZW5zO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuQ29uZmlnRGVmYXVsdHNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAcHJvcGVydHkgeyhvYmplY3R8b2JqZWN0W10pfSB0YXJnZXRzIC0gVGhlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cywgdG8gcnVuIHRoZSB0d2VlbiBvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheT0wXSAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSB0aGUgdHdlZW4gd2lsbCBzdGFydC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkdXJhdGlvbj0xMDAwXSAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHdlZW4gaW4gbWlsbGlzZWNvbmRzLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vhc2U9J1Bvd2VyMCddIC0gVGhlIGVhc2luZyBlcXVhdGlvbiB0byB1c2UgZm9yIHRoZSB0d2Vlbi5cclxuICogQHByb3BlcnR5IHthcnJheX0gW2Vhc2VQYXJhbXNdIC0gT3B0aW9uYWwgZWFzaW5nIHBhcmFtZXRlcnMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaG9sZD0wXSAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGhvbGQgdGhlIHR3ZWVuIGZvciBiZWZvcmUgeW95bydpbmcuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVwZWF0PTBdIC0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHR3ZWVuLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3JlcGVhdERlbGF5PTBdIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcGF1c2UgYmVmb3JlIGEgdHdlZW4gd2lsbCByZXBlYXQuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3lveW89ZmFsc2VdIC0gU2hvdWxkIHRoZSB0d2VlbiBjb21wbGV0ZSwgdGhlbiByZXZlcnNlIHRoZSB2YWx1ZXMgaW5jcmVtZW50YWxseSB0byBnZXQgYmFjayB0byB0aGUgc3RhcnRpbmcgdHdlZW4gdmFsdWVzPyBUaGUgcmV2ZXJzZSB0d2VlbmluZyB3aWxsIGFsc28gdGFrZSBgZHVyYXRpb25gIG1pbGxpc2Vjb25kcyB0byBjb21wbGV0ZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmxpcFg9ZmFsc2VdIC0gSG9yaXpvbnRhbGx5IGZsaXAgdGhlIHRhcmdldCBvZiB0aGUgVHdlZW4gd2hlbiBpdCBjb21wbGV0ZXMgKGJlZm9yZSBpdCB5b3lvcywgaWYgc2V0IHRvIGRvIHNvKS4gT25seSB3b3JrcyBmb3IgdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlIGBmbGlwWGAgcHJvcGVydHkuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFZlcnRpY2FsbHkgZmxpcCB0aGUgdGFyZ2V0IG9mIHRoZSBUd2VlbiB3aGVuIGl0IGNvbXBsZXRlcyAoYmVmb3JlIGl0IHlveW9zLCBpZiBzZXQgdG8gZG8gc28pLiBPbmx5IHdvcmtzIGZvciB0YXJnZXRzIHRoYXQgc3VwcG9ydCB0aGUgYGZsaXBZYCBwcm9wZXJ0eS5cclxuICovXHJcblxyXG52YXIgVFdFRU5fREVGQVVMVFMgPSB7XHJcbiAgICB0YXJnZXRzOiBudWxsLFxyXG4gICAgZGVsYXk6IDAsXHJcbiAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgIGVhc2U6ICdQb3dlcjAnLFxyXG4gICAgZWFzZVBhcmFtczogbnVsbCxcclxuICAgIGhvbGQ6IDAsXHJcbiAgICByZXBlYXQ6IDAsXHJcbiAgICByZXBlYXREZWxheTogMCxcclxuICAgIHlveW86IGZhbHNlLFxyXG4gICAgZmxpcFg6IGZhbHNlLFxyXG4gICAgZmxpcFk6IGZhbHNlXHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFRXRUVOX0RFRkFVTFRTO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8vICBSRVNFUlZFRCBwcm9wZXJ0aWVzIHRoYXQgYSBUd2VlbiBjb25maWcgb2JqZWN0IHVzZXNcclxuXHJcbi8vICBjb21wbGV0ZURlbGF5OiBUaGUgdGltZSB0aGUgdHdlZW4gd2lsbCB3YWl0IGJlZm9yZSB0aGUgb25Db21wbGV0ZSBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2UgaXQgaGFzIGNvbXBsZXRlZFxyXG4vLyAgZGVsYXk6IFRoZSB0aW1lIHRoZSB0d2VlbiB3aWxsIHdhaXQgYmVmb3JlIGl0IGZpcnN0IHN0YXJ0c1xyXG4vLyAgZHVyYXRpb246IFRoZSBkdXJhdGlvbiBvZiB0aGUgdHdlZW5cclxuLy8gIGVhc2U6IFRoZSBlYXNlIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHR3ZWVuXHJcbi8vICBlYXNlUGFyYW1zOiBUaGUgcGFyYW1ldGVycyB0byBnbyB3aXRoIHRoZSBlYXNlIGZ1bmN0aW9uIChpZiBhbnkpXHJcbi8vICBmbGlwWDogZmxpcCBYIHRoZSBHYW1lT2JqZWN0IG9uIHR3ZWVuIGVuZFxyXG4vLyAgZmxpcFk6IGZsaXAgWSB0aGUgR2FtZU9iamVjdCBvbiB0d2VlbiBlbmQvLyAgaG9sZDogVGhlIHRpbWUgdGhlIHR3ZWVuIHdpbGwgcGF1c2UgYmVmb3JlIHJ1bm5pbmcgYSB5b3lvXHJcbi8vICBob2xkOiBUaGUgdGltZSB0aGUgdHdlZW4gd2lsbCBwYXVzZSBiZWZvcmUgcnVubmluZyBhIHlveW9cclxuLy8gIGxvb3A6IFRoZSB0aW1lIHRoZSB0d2VlbiB3aWxsIHBhdXNlIGJlZm9yZSBzdGFydGluZyBlaXRoZXIgYSB5b3lvIG9yIHJldHVybmluZyB0byB0aGUgc3RhcnQgZm9yIGEgcmVwZWF0XHJcbi8vICBsb29wRGVsYXk6IFxyXG4vLyAgb2Zmc2V0OiBVc2VkIHdoZW4gdGhlIFR3ZWVuIGlzIHBhcnQgb2YgYSBUaW1lbGluZVxyXG4vLyAgcGF1c2VkOiBEb2VzIHRoZSB0d2VlbiBzdGFydCBpbiBhIHBhdXNlZCBzdGF0ZSwgb3IgcGxheWluZz9cclxuLy8gIHByb3BzOiBUaGUgcHJvcGVydGllcyBiZWluZyB0d2VlbmVkIGJ5IHRoZSB0d2VlblxyXG4vLyAgcmVwZWF0OiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB0d2VlbiB3aWxsIHJlcGVhdCBpdHNlbGYgKGEgdmFsdWUgb2YgMSBtZWFucyB0aGUgdHdlZW4gd2lsbCBwbGF5IHR3aWNlLCBhcyBpdCByZXBlYXRlZCBvbmNlKVxyXG4vLyAgcmVwZWF0RGVsYXk6IFRoZSB0aW1lIHRoZSB0d2VlbiB3aWxsIHBhdXNlIGZvciBiZWZvcmUgc3RhcnRpbmcgYSByZXBlYXQuIFRoZSB0d2VlbiBob2xkcyBpbiB0aGUgc3RhcnQgc3RhdGUuXHJcbi8vICB0YXJnZXRzOiBUaGUgdGFyZ2V0cyB0aGUgdHdlZW4gaXMgdXBkYXRpbmcuXHJcbi8vICB1c2VGcmFtZXM6IFVzZSBmcmFtZXMgb3IgbWlsbGlzZWNvbmRzP1xyXG4vLyAgeW95bzogYm9vbGVhbiAtIERvZXMgdGhlIHR3ZWVuIHJldmVyc2UgaXRzZWxmICh5b3lvKSB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZD9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gW1xyXG4gICAgJ2NhbGxiYWNrU2NvcGUnLFxyXG4gICAgJ2NvbXBsZXRlRGVsYXknLFxyXG4gICAgJ2RlbGF5JyxcclxuICAgICdkdXJhdGlvbicsXHJcbiAgICAnZWFzZScsXHJcbiAgICAnZWFzZVBhcmFtcycsXHJcbiAgICAnZmxpcFgnLFxyXG4gICAgJ2ZsaXBZJyxcclxuICAgICdob2xkJyxcclxuICAgICdsb29wJyxcclxuICAgICdsb29wRGVsYXknLFxyXG4gICAgJ29mZnNldCcsXHJcbiAgICAnb25BY3RpdmUnLFxyXG4gICAgJ29uQWN0aXZlUGFyYW1zJyxcclxuICAgICdvbkFjdGl2ZVNjb3BlJyxcclxuICAgICdvbkNvbXBsZXRlJyxcclxuICAgICdvbkNvbXBsZXRlUGFyYW1zJyxcclxuICAgICdvbkNvbXBsZXRlU2NvcGUnLFxyXG4gICAgJ29uTG9vcCcsXHJcbiAgICAnb25Mb29wUGFyYW1zJyxcclxuICAgICdvbkxvb3BTY29wZScsXHJcbiAgICAnb25SZXBlYXQnLFxyXG4gICAgJ29uUmVwZWF0UGFyYW1zJyxcclxuICAgICdvblJlcGVhdFNjb3BlJyxcclxuICAgICdvblN0YXJ0JyxcclxuICAgICdvblN0YXJ0UGFyYW1zJyxcclxuICAgICdvblN0YXJ0U2NvcGUnLFxyXG4gICAgJ29uVXBkYXRlJyxcclxuICAgICdvblVwZGF0ZVBhcmFtcycsXHJcbiAgICAnb25VcGRhdGVTY29wZScsXHJcbiAgICAnb25Zb3lvJyxcclxuICAgICdvbllveW9QYXJhbXMnLFxyXG4gICAgJ29uWW95b1Njb3BlJyxcclxuICAgICdwYXVzZWQnLFxyXG4gICAgJ3Byb3BzJyxcclxuICAgICdyZXBlYXQnLFxyXG4gICAgJ3JlcGVhdERlbGF5JyxcclxuICAgICd0YXJnZXRzJyxcclxuICAgICd1c2VGcmFtZXMnLFxyXG4gICAgJ3lveW8nXHJcbl07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIENsYXNzID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvQ2xhc3MnKTtcclxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50ZW1pdHRlcjMnKTtcclxudmFyIEV2ZW50cyA9IHJlcXVpcmUoJy4uL2V2ZW50cycpO1xyXG52YXIgR2FtZU9iamVjdENyZWF0b3IgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0Q3JlYXRvcicpO1xyXG52YXIgR2FtZU9iamVjdEZhY3RvcnkgPSByZXF1aXJlKCcuLi8uLi9nYW1lb2JqZWN0cy9HYW1lT2JqZWN0RmFjdG9yeScpO1xyXG52YXIgVFdFRU5fQ09OU1QgPSByZXF1aXJlKCcuL2NvbnN0Jyk7XHJcbnZhciBNQVRIX0NPTlNUID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9jb25zdCcpO1xyXG5cclxuLyoqXHJcbiAqIEBjbGFzc2Rlc2NcclxuICogQSBUd2VlbiBpcyBhYmxlIHRvIG1hbmlwdWxhdGUgdGhlIHByb3BlcnRpZXMgb2Ygb25lIG9yIG1vcmUgb2JqZWN0cyB0byBhbnkgZ2l2ZW4gdmFsdWUsIGJhc2VkXHJcbiAqIG9uIGEgZHVyYXRpb24gYW5kIHR5cGUgb2YgZWFzZS4gVGhleSBhcmUgcmFyZWx5IGluc3RhbnRpYXRlZCBkaXJlY3RseSBhbmQgaW5zdGVhZCBzaG91bGQgYmVcclxuICogY3JlYXRlZCB2aWEgdGhlIFR3ZWVuTWFuYWdlci5cclxuICpcclxuICogQGNsYXNzIFR3ZWVuXHJcbiAqIEBtZW1iZXJvZiBQaGFzZXIuVHdlZW5zXHJcbiAqIEBleHRlbmRzIFBoYXNlci5FdmVudHMuRXZlbnRFbWl0dGVyXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHsoUGhhc2VyLlR3ZWVucy5Ud2Vlbk1hbmFnZXJ8UGhhc2VyLlR3ZWVucy5UaW1lbGluZSl9IHBhcmVudCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2YgdGhpcyBUd2Vlbi4gRWl0aGVyIHRoZSBUd2VlbiBNYW5hZ2VyIG9yIGEgVHdlZW4gVGltZWxpbmUgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7UGhhc2VyLlR5cGVzLlR3ZWVucy5Ud2VlbkRhdGFDb25maWdbXX0gZGF0YSAtIEFuIGFycmF5IG9mIFR3ZWVuRGF0YSBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYSB1bmlxdWUgcHJvcGVydHkgdG8gYmUgdHdlZW5lZC5cclxuICogQHBhcmFtIHthcnJheX0gdGFyZ2V0cyAtIEFuIGFycmF5IG9mIHRhcmdldHMgdG8gYmUgdHdlZW5lZC5cclxuICovXHJcbnZhciBUd2VlbiA9IG5ldyBDbGFzcyh7XHJcblxyXG4gICAgRXh0ZW5kczogRXZlbnRFbWl0dGVyLFxyXG5cclxuICAgIGluaXRpYWxpemU6XHJcblxyXG4gICAgZnVuY3Rpb24gVHdlZW4gKHBhcmVudCwgZGF0YSwgdGFyZ2V0cylcclxuICAgIHtcclxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvZiB0aGlzIFR3ZWVuLlxyXG4gICAgICAgICAqIEVpdGhlciB0aGUgVHdlZW4gTWFuYWdlciBvciBhIFR3ZWVuIFRpbWVsaW5lIGluc3RhbmNlLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiNwYXJlbnRcclxuICAgICAgICAgKiBAdHlwZSB7KFBoYXNlci5Ud2VlbnMuVHdlZW5NYW5hZ2VyfFBoYXNlci5Ud2VlbnMuVGltZWxpbmUpfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGUgcGFyZW50IG9mIHRoaXMgVHdlZW4gYSBUaW1lbGluZT9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jcGFyZW50SXNUaW1lbGluZVxyXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMucGFyZW50SXNUaW1lbGluZSA9IHBhcmVudC5oYXNPd25Qcm9wZXJ0eSgnaXNUaW1lbGluZScpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiBUd2VlbkRhdGEgb2JqZWN0cywgZWFjaCBjb250YWluaW5nIGEgdW5pcXVlIHByb3BlcnR5IGFuZCB0YXJnZXQgYmVpbmcgdHdlZW5lZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jZGF0YVxyXG4gICAgICAgICAqIEB0eXBlIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuRGF0YUNvbmZpZ1tdfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjYWNoZWQgbGVuZ3RoIG9mIHRoZSBkYXRhIGFycmF5LlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiN0b3RhbERhdGFcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdGFsRGF0YSA9IGRhdGEubGVuZ3RoO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBhcnJheSBvZiByZWZlcmVuY2VzIHRvIHRoZSB0YXJnZXQvcyB0aGlzIFR3ZWVuIGlzIG9wZXJhdGluZyBvbi5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jdGFyZ2V0c1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3RbXX1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYWNoZWQgdGFyZ2V0IHRvdGFsIChub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIGRhdGEgdG90YWwpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI3RvdGFsVGFyZ2V0c1xyXG4gICAgICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudG90YWxUYXJnZXRzID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGB0cnVlYCB0aGVuIGR1cmF0aW9uLCBkZWxheSwgZXRjIHZhbHVlcyBhcmUgYWxsIGZyYW1lIHRvdGFscy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jdXNlRnJhbWVzXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnVzZUZyYW1lcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTY2FsZXMgdGhlIHRpbWUgYXBwbGllZCB0byB0aGlzIFR3ZWVuLiBBIHZhbHVlIG9mIDEgcnVucyBpbiByZWFsLXRpbWUuIEEgdmFsdWUgb2YgMC41IHJ1bnMgNTAlIHNsb3dlciwgYW5kIHNvIG9uLlxyXG4gICAgICAgICAqIFZhbHVlIGlzbid0IHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgdHdlZW4sIGl0J3MgYSBydW4tdGltZSBkZWx0YSBhZGp1c3RtZW50IG9ubHkuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI3RpbWVTY2FsZVxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMVxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMudGltZVNjYWxlID0gMTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTG9vcCB0aGlzIHR3ZWVuPyBDYW4gYmUgLTEgZm9yIGFuIGluZmluaXRlIGxvb3AsIG9yIGFuIGludGVnZXIuXHJcbiAgICAgICAgICogV2hlbiBlbmFibGVkIGl0IHdpbGwgcGxheSB0aHJvdWdoIEFMTCBUd2VlbkRhdGFzIGFnYWluLiBVc2UgVHdlZW5EYXRhLnJlcGVhdCB0byBsb29wIGEgc2luZ2xlIGVsZW1lbnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI2xvb3BcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3AgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaW1lIGluIG1zL2ZyYW1lcyBiZWZvcmUgdGhlIHR3ZWVuIGxvb3BzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiNsb29wRGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3BEZWxheSA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEhvdyBtYW55IGxvb3BzIGFyZSBsZWZ0IHRvIHJ1bj9cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jbG9vcENvdW50ZXJcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmxvb3BDb3VudGVyID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGltZSBpbiBtcy9mcmFtZXMgYmVmb3JlIHRoZSAnb25TdGFydCcgZXZlbnQgZmlyZXMuXHJcbiAgICAgICAgICogVGhpcyBpcyB0aGUgc2hvcnRlc3QgYGRlbGF5YCB2YWx1ZSBhY3Jvc3MgYWxsIG9mIHRoZSBUd2VlbkRhdGFzIG9mIHRoaXMgVHdlZW4uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI3N0YXJ0RGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGFydERlbGF5ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGFzIHRoaXMgVHdlZW4gc3RhcnRlZCBwbGF5YmFjayB5ZXQ/XHJcbiAgICAgICAgICogVGhpcyBib29sZWFuIGlzIHRvZ2dsZWQgd2hlbiB0aGUgVHdlZW4gbGVhdmVzIHRoZSAnZGVsYXllZCcgc3RhdGUgYW5kIHN0YXJ0cyBydW5uaW5nLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiNoYXNTdGFydGVkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQHJlYWRvbmx5XHJcbiAgICAgICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuaGFzU3RhcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJcyB0aGlzIFR3ZWVuIGN1cnJlbnRseSBzZWVraW5nP1xyXG4gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyB0b2dnbGVkIGluIHRoZSBgVHdlZW4uc2Vla2AgbWV0aG9kLlxyXG4gICAgICAgICAqIFdoZW4gYSB0d2VlbiBpcyBzZWVraW5nIGl0IHdpbGwgbm90IGRpc3BhdGNoIGFueSBldmVudHMgb3IgY2FsbGJhY2tzLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiNpc1NlZWtpbmdcclxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5pc1NlZWtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGltZSBpbiBtcy9mcmFtZXMgYmVmb3JlIHRoZSAnb25Db21wbGV0ZScgZXZlbnQgZmlyZXMuIFRoaXMgbmV2ZXIgZmlyZXMgaWYgbG9vcCA9IC0xIChhcyBpdCBuZXZlciBjb21wbGV0ZXMpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI2NvbXBsZXRlRGVsYXlcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNvbXBsZXRlRGVsYXkgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDb3VudGRvd24gdGltZXIgKHVzZWQgYnkgdGltZWxpbmUgb2Zmc2V0LCBsb29wRGVsYXkgYW5kIGNvbXBsZXRlRGVsYXkpXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI2NvdW50ZG93blxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuY291bnRkb3duID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IG9ubHkgaWYgdGhpcyBUd2VlbiBpcyBwYXJ0IG9mIGEgVGltZWxpbmUuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI29mZnNldFxyXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgICAgICogQGRlZmF1bHQgMFxyXG4gICAgICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU2V0IG9ubHkgaWYgdGhpcyBUd2VlbiBpcyBwYXJ0IG9mIGEgVGltZWxpbmUuIFRoZSBjYWxjdWxhdGVkIG9mZnNldCBhbW91bnQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI2NhbGN1bGF0ZWRPZmZzZXRcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRPZmZzZXQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdHdlZW5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jc3RhdGVcclxuICAgICAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19BREQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgdHdlZW4gd2hlbiBpdCB3YXMgcGF1c2VkICh1c2VkIGJ5IFJlc3VtZSlcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jX3BhdXNlZFN0YXRlXHJcbiAgICAgICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9wYXVzZWRTdGF0ZSA9IFRXRUVOX0NPTlNULklOSVQ7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERvZXMgdGhlIFR3ZWVuIHN0YXJ0IG9mZiBwYXVzZWQ/IChpZiBzbyBpdCBuZWVkcyB0byBiZSBzdGFydGVkIHdpdGggVHdlZW4ucGxheSlcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jcGF1c2VkXHJcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBFbGFwc2VkIHRpbWUgaW4gbXMvZnJhbWVzIG9mIHRoaXMgcnVuIHRocm91Z2ggdGhlIFR3ZWVuLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiNlbGFwc2VkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5lbGFwc2VkID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVG90YWwgZWxhcHNlZCB0aW1lIGluIG1zL2ZyYW1lcyBvZiB0aGUgZW50aXJlIFR3ZWVuLCBpbmNsdWRpbmcgbG9vcGluZy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jdG90YWxFbGFwc2VkXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbEVsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaW1lIGluIG1zL2ZyYW1lcyBmb3IgdGhlIHdob2xlIFR3ZWVuIHRvIHBsYXkgdGhyb3VnaCBvbmNlLCBleGNsdWRpbmcgbG9vcCBhbW91bnRzIGFuZCBsb29wIGRlbGF5cy5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jZHVyYXRpb25cclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVmFsdWUgYmV0d2VlbiAwIGFuZCAxLiBUaGUgYW1vdW50IHRocm91Z2ggdGhlIFR3ZWVuLCBleGNsdWRpbmcgbG9vcHMuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI3Byb2dyZXNzXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRpbWUgaW4gbXMvZnJhbWVzIGZvciB0aGUgVHdlZW4gdG8gY29tcGxldGUgKGluY2x1ZGluZyBsb29waW5nKVxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5Ud2VlbiN0b3RhbER1cmF0aW9uXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKiBAZGVmYXVsdCAwXHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy50b3RhbER1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVmFsdWUgYmV0d2VlbiAwIGFuZCAxLiBUaGUgYW1vdW50IHRocm91Z2ggdGhlIGVudGlyZSBUd2VlbiwgaW5jbHVkaW5nIGxvb3BpbmcuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI3RvdGFsUHJvZ3Jlc3NcclxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICAgICAqIEBkZWZhdWx0IDBcclxuICAgICAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnRvdGFsUHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGlmZmVyZW50IFR3ZWVuIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBZb3UgY2FuIGVpdGhlciBzZXQgdGhlc2UgaW4gdGhlIFR3ZWVuIGNvbmZpZywgb3IgYnkgY2FsbGluZyB0aGUgYFR3ZWVuLnNldENhbGxiYWNrYCBtZXRob2QuXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogYG9uQWN0aXZlYCBXaGVuIHRoZSBUd2VlbiBpcyBtb3ZlZCBmcm9tIHRoZSBwZW5kaW5nIHRvIHRoZSBhY3RpdmUgbGlzdCBpbiB0aGUgVHdlZW4gTWFuYWdlciwgZXZlbiBpZiBwbGF5YmFjayBwYXVzZWQuXHJcbiAgICAgICAgICogYG9uU3RhcnRgIFdoZW4gdGhlIFR3ZWVuIHN0YXJ0cyBwbGF5aW5nIGFmdGVyIGEgZGVsYXllZCBzdGF0ZS4gV2lsbCBoYXBwZW4gYXQgdGhlIHNhbWUgdGltZSBhcyBgb25BY3RpdmVgIGlmIGl0IGhhcyBubyBkZWxheS5cclxuICAgICAgICAgKiBgb25Zb3lvYCBXaGVuIGEgVHdlZW5EYXRhIHN0YXJ0cyBhIHlveW8uIFRoaXMgaGFwcGVucyBfYWZ0ZXJfIHRoZSBgaG9sZGAgZGVsYXkgZXhwaXJlcywgaWYgc2V0LlxyXG4gICAgICAgICAqIGBvblJlcGVhdGAgV2hlbiBhIFR3ZWVuRGF0YSByZXBlYXRzIHBsYXliYWNrLiBUaGlzIGhhcHBlbnMgX2FmdGVyXyB0aGUgYHJlcGVhdERlbGF5YCBleHBpcmVzLCBpZiBzZXQuXHJcbiAgICAgICAgICogYG9uQ29tcGxldGVgIFdoZW4gdGhlIFR3ZWVuIGZpbmlzaGVzIHBsYXliYWNrIGZ1bGx5IG9yIGBUd2Vlbi5zdG9wYCBpcyBjYWxsZWQuIE5ldmVyIGludm9rZWQgaWYgdHdlZW4gaXMgc2V0IHRvIHJlcGVhdCBpbmZpbml0ZWx5LlxyXG4gICAgICAgICAqIGBvblVwZGF0ZWAgV2hlbiBhIFR3ZWVuRGF0YSB1cGRhdGVzIGEgcHJvcGVydHkgb24gYSBzb3VyY2UgdGFyZ2V0IGR1cmluZyBwbGF5YmFjay5cclxuICAgICAgICAgKiBgb25Mb29wYCBXaGVuIGEgVHdlZW4gbG9vcHMuIFRoaXMgaGFwcGVucyBfYWZ0ZXJfIHRoZSBgbG9vcERlbGF5YCBleHBpcmVzLCBpZiBzZXQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlR3ZWVuI2NhbGxiYWNrc1xyXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7XHJcbiAgICAgICAgICAgIG9uQWN0aXZlOiBudWxsLFxyXG4gICAgICAgICAgICBvbkNvbXBsZXRlOiBudWxsLFxyXG4gICAgICAgICAgICBvbkxvb3A6IG51bGwsXHJcbiAgICAgICAgICAgIG9uUmVwZWF0OiBudWxsLFxyXG4gICAgICAgICAgICBvblN0YXJ0OiBudWxsLFxyXG4gICAgICAgICAgICBvblVwZGF0ZTogbnVsbCxcclxuICAgICAgICAgICAgb25Zb3lvOiBudWxsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGNvbnRleHQgaW4gd2hpY2ggYWxsIGNhbGxiYWNrcyBhcmUgaW52b2tlZC5cclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuVHdlZW4jY2FsbGJhY2tTY29wZVxyXG4gICAgICAgICAqIEB0eXBlIHthbnl9XHJcbiAgICAgICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5jYWxsYmFja1Njb3BlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcdFxyXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFR3ZWVuIERhdGEuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI2dldFZhbHVlXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBUaGUgVHdlZW4gRGF0YSB0byByZXR1cm4gdGhlIHZhbHVlIGZyb20uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIHJlcXVlc3RlZCBUd2VlbiBEYXRhLlxyXG4gICAgICovXHRcclxuICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoaW5kZXgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHsgaW5kZXggPSAwOyB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbaW5kZXhdLmN1cnJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzY2FsZSB0aGUgdGltZSBhcHBsaWVkIHRvIHRoaXMgVHdlZW4uIEEgdmFsdWUgb2YgMSBydW5zIGluIHJlYWwtdGltZS4gQSB2YWx1ZSBvZiAwLjUgcnVucyA1MCUgc2xvd2VyLCBhbmQgc28gb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI3NldFRpbWVTY2FsZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHNjYWxlIGZhY3RvciBmb3IgdGltZXNjYWxlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhpcyBUd2VlbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgc2V0VGltZVNjYWxlOiBmdW5jdGlvbiAodmFsdWUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aW1lU2NhbGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2NhbGUgb2YgdGhlIHRpbWUgYXBwbGllZCB0byB0aGlzIFR3ZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNnZXRUaW1lU2NhbGVcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRpbWVzY2FsZSBvZiB0aGlzIHR3ZWVuIChiZXR3ZWVuIDAgYW5kIDEpXHJcbiAgICAgKi9cclxuICAgIGdldFRpbWVTY2FsZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aW1lU2NhbGU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBUd2VlbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNpc1BsYXlpbmdcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgVHdlZW4gaXMgYWN0aXZlLCBvdGhlcndpc2UgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgaXNQbGF5aW5nOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuQUNUSVZFKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIFR3ZWVuIGlzIGN1cnJlbnRseSBwYXVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI2lzUGF1c2VkXHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFR3ZWVuIGlzIHBhdXNlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGlzUGF1c2VkOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUEFVU0VEKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWUgaWYgdGhpcyBUd2VlbiBpcyBjdXJyZW50bHkgYWN0aW5nIHVwb24gdGhlIGdpdmVuIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jaGFzVGFyZ2V0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBjaGVjayBhZ2FpbnN0IHRoaXMgVHdlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBnaXZlbiB0YXJnZXQgaXMgYSB0YXJnZXQgb2YgdGhpcyBUd2Vlbiwgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKi9cclxuICAgIGhhc1RhcmdldDogZnVuY3Rpb24gKHRhcmdldClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMudGFyZ2V0cy5pbmRleE9mKHRhcmdldCkgIT09IC0xKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSAnZW5kJyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgYWNyb3NzIGFsbCBtYXRjaGluZyB0YXJnZXRzLlxyXG4gICAgICogXHJcbiAgICAgKiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgYWRqdXN0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdHdlZW4sIG9yIHRoZSBjdXJyZW50IHByb2dyZXNzLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgdGVsbCBpdCB0byBzZXQgdGhlICdzdGFydCcgdmFsdWUgdG8gYmUgdGhlIGN1cnJlbnQgdmFsdWUgKGJlZm9yZSB0aGUgY2hhbmdlKS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jdXBkYXRlVG9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkgdG8gc2V0IHRoZSBuZXcgdmFsdWUgZm9yLlxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc3RhcnRUb0N1cnJlbnQ9ZmFsc2VdIC0gU2hvdWxkIHRoaXMgY2hhbmdlIHNldCB0aGUgc3RhcnQgdmFsdWUgdG8gYmUgdGhlIGN1cnJlbnQgdmFsdWU/XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGlzIFR3ZWVuIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVUbzogZnVuY3Rpb24gKGtleSwgdmFsdWUsIHN0YXJ0VG9DdXJyZW50KVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzdGFydFRvQ3VycmVudCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0VG9DdXJyZW50ID0gZmFsc2U7IH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRvdGFsRGF0YTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHR3ZWVuRGF0YSA9IHRoaXMuZGF0YVtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2VlbkRhdGEua2V5ID09PSBrZXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbmQgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRUb0N1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLnN0YXJ0ID0gdHdlZW5EYXRhLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RhcnRzIHRoZSB0d2VlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI3Jlc3RhcnRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHdlZW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHJlc3RhcnQ6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFJlc2V0IHRoZXNlIHNvIHRoZXkncmUgcmVhZHkgZm9yIHRoZSBuZXh0IHVwZGF0ZVxyXG4gICAgICAgIHRoaXMuZWxhcHNlZCA9IDA7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdGhpcy50b3RhbEVsYXBzZWQgPSAwO1xyXG4gICAgICAgIHRoaXMudG90YWxQcm9ncmVzcyA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5BQ1RJVkUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWVrKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5SRU1PVkVEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZWVrKDApO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5tYWtlQWN0aXZlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBFTkRJTkdfQUREKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgY2FsY3VsYXRlcyB0aGUgb3ZlcmFsbCBkdXJhdGlvbiBvZiB0aGUgVHdlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI2NhbGNEdXJhdGlvblxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIGNhbGNEdXJhdGlvbjogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICB2YXIgbWF4RHVyYXRpb24gPSAwO1xyXG4gICAgICAgIHZhciBtaW5EZWxheSA9IE1BVEhfQ09OU1QuTUFYX1NBRkVfSU5URUdFUjtcclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50b3RhbERhdGE7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0d2VlbkRhdGEgPSBkYXRhW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gIFNldCB0MSAoZHVyYXRpb24gKyBob2xkICsgeW95bylcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnQxID0gdHdlZW5EYXRhLmR1cmF0aW9uICsgdHdlZW5EYXRhLmhvbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodHdlZW5EYXRhLnlveW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS50MSArPSB0d2VlbkRhdGEuZHVyYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vICBTZXQgdDIgKHJlcGVhdERlbGF5ICsgZHVyYXRpb24gKyBob2xkICsgeW95bylcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnQyID0gdHdlZW5EYXRhLnQxICsgdHdlZW5EYXRhLnJlcGVhdERlbGF5O1xyXG5cclxuICAgICAgICAgICAgLy8gIFRvdGFsIER1cmF0aW9uXHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS50b3RhbER1cmF0aW9uID0gdHdlZW5EYXRhLmRlbGF5ICsgdHdlZW5EYXRhLnQxO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5yZXBlYXQgPT09IC0xKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEudG90YWxEdXJhdGlvbiArPSAodHdlZW5EYXRhLnQyICogOTk5OTk5OTk5OTk5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0d2VlbkRhdGEucmVwZWF0ID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnRvdGFsRHVyYXRpb24gKz0gKHR3ZWVuRGF0YS50MiAqIHR3ZWVuRGF0YS5yZXBlYXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHdlZW5EYXRhLnRvdGFsRHVyYXRpb24gPiBtYXhEdXJhdGlvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIEdldCB0aGUgbG9uZ2VzdCBUd2VlbkRhdGEgZnJvbSB0aGUgVHdlZW4sIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBUd2VlbiBURFxyXG4gICAgICAgICAgICAgICAgbWF4RHVyYXRpb24gPSB0d2VlbkRhdGEudG90YWxEdXJhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5kZWxheSA8IG1pbkRlbGF5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBtaW5EZWxheSA9IHR3ZWVuRGF0YS5kZWxheTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIEV4Y2x1ZGVzIGxvb3AgdmFsdWVzXHJcblxyXG4gICAgICAgIC8vICBJZiBkdXJhdGlvbiBoYXMgYmVlbiBzZXQgdG8gMCB0aGVuIHdlIGdpdmUgaXQgYSBzdXBlci1sb3cgdmFsdWUgc28gdGhhdCBpdCBhbHdheXNcclxuICAgICAgICAvLyAgcmVuZGVycyBhdCBsZWFzdCAxIGZyYW1lLCBidXQgbm8gbW9yZSwgd2l0aG91dCBjYXVzaW5nIGRpdmlkZWQgYnkgemVybyBlcnJvcnMgZWxzZXdoZXJlLlxyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBNYXRoLm1heChtYXhEdXJhdGlvbiwgMC4wMDEpO1xyXG5cclxuICAgICAgICB0aGlzLmxvb3BDb3VudGVyID0gKHRoaXMubG9vcCA9PT0gLTEpID8gOTk5OTk5OTk5OTk5IDogdGhpcy5sb29wO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5sb29wQ291bnRlciA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnRvdGFsRHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uICsgdGhpcy5jb21wbGV0ZURlbGF5ICsgKCh0aGlzLmR1cmF0aW9uICsgdGhpcy5sb29wRGVsYXkpICogdGhpcy5sb29wQ291bnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxEdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24gKyB0aGlzLmNvbXBsZXRlRGVsYXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgSG93IGxvbmcgYmVmb3JlIHRoaXMgVHdlZW4gc3RhcnRzIHBsYXliYWNrP1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWxheSA9IG1pbkRlbGF5O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBieSBUd2Vlbk1hbmFnZXIucHJlVXBkYXRlIGFzIHBhcnQgb2YgaXRzIGxvb3AgdG8gY2hlY2sgcGVuZGluZyBhbmQgYWN0aXZlIHR3ZWVucy5cclxuICAgICAqIFNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNpbml0XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFR3ZWVuIHNob3VsZCBiZSBtb3ZlZCBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgdG8gdGhlIGFjdGl2ZSBsaXN0IGJ5IHRoZSBUd2VlbiBNYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIC8vICBZb3UgY2FuJ3QgaGF2ZSBhIHBhdXNlZCBUd2VlbiBpZiBpdCdzIHBhcnQgb2YgYSBUaW1lbGluZVxyXG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCAmJiAhdGhpcy5wYXJlbnRJc1RpbWVsaW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBFTkRJTkdfQUREO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXVzZWRTdGF0ZSA9IFRXRUVOX0NPTlNULklOSVQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgICB2YXIgdG90YWxUYXJnZXRzID0gdGhpcy50b3RhbFRhcmdldHM7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50b3RhbERhdGE7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB0d2VlbkRhdGEgPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdHdlZW5EYXRhLnRhcmdldDtcclxuICAgICAgICAgICAgdmFyIGdlbiA9IHR3ZWVuRGF0YS5nZW47XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSB0d2VlbkRhdGEua2V5O1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0SW5kZXggPSB0d2VlbkRhdGEuaW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvLyAgT2xkIGZ1bmN0aW9uIHNpZ25hdHVyZTogaSwgdG90YWxUYXJnZXRzLCB0YXJnZXRcclxuICAgICAgICAgICAgLy8gIE5ldyBmdW5jdGlvbiBzaWduYXR1cmU6IHRhcmdldCwga2V5LCB2YWx1ZSwgaW5kZXgsIHRvdGFsLCB0d2VlblxyXG5cclxuICAgICAgICAgICAgdHdlZW5EYXRhLmRlbGF5ID0gZ2VuLmRlbGF5KHRhcmdldCwga2V5LCAwLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0aGlzKTtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLmR1cmF0aW9uID0gTWF0aC5tYXgoZ2VuLmR1cmF0aW9uKHRhcmdldCwga2V5LCAwLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0aGlzKSwgMC4wMDEpO1xyXG4gICAgICAgICAgICB0d2VlbkRhdGEuaG9sZCA9IGdlbi5ob2xkKHRhcmdldCwga2V5LCAwLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0aGlzKTtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnJlcGVhdCA9IGdlbi5yZXBlYXQodGFyZ2V0LCBrZXksIDAsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHRoaXMpO1xyXG4gICAgICAgICAgICB0d2VlbkRhdGEucmVwZWF0RGVsYXkgPSBnZW4ucmVwZWF0RGVsYXkodGFyZ2V0LCBrZXksIDAsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYWxjRHVyYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdGhpcy50b3RhbFByb2dyZXNzID0gMDtcclxuICAgICAgICB0aGlzLmVsYXBzZWQgPSAwO1xyXG4gICAgICAgIHRoaXMudG90YWxFbGFwc2VkID0gMDtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULklOSVQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IG1ha2VzIHRoaXMgVHdlZW4gYWN0aXZlIHdpdGhpbiB0aGUgVHdlZW5NYW5hZ2VyXHJcbiAgICAgKiBhbmQgZW1pdHMgdGhlIG9uQWN0aXZlIGV2ZW50IGFuZCBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jbWFrZUFjdGl2ZVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX0FDVElWRVxyXG4gICAgICogQHNpbmNlIDMuMTkuMFxyXG4gICAgICovXHJcbiAgICBtYWtlQWN0aXZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGFyZW50Lm1ha2VBY3RpdmUodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkV2ZW50KEV2ZW50cy5UV0VFTl9BQ1RJVkUsIHRoaXMuY2FsbGJhY2tzLm9uQWN0aXZlKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBhZHZhbmNlcyB0byB0aGUgbmV4dCBzdGF0ZSBvZiB0aGUgVHdlZW4gZHVyaW5nIHBsYXliYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNuZXh0U3RhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUV0VFTl9DT01QTEVURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX0xPT1BcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBuZXh0U3RhdGU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9vcENvdW50ZXIgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbGFwc2VkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubG9vcENvdW50ZXItLTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRUd2VlbkRhdGEodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sb29wRGVsYXkgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZG93biA9IHRoaXMubG9vcERlbGF5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULkxPT1BfREVMQVk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuQUNUSVZFO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkV2ZW50KEV2ZW50cy5UV0VFTl9MT09QLCB0aGlzLmNhbGxiYWNrcy5vbkxvb3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29tcGxldGVEZWxheSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuQ09NUExFVEVfREVMQVk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvdW50ZG93biA9IHRoaXMuY29tcGxldGVEZWxheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBFTkRJTkdfUkVNT1ZFO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFR3ZWVuRXZlbnQoRXZlbnRzLlRXRUVOX0NPTVBMRVRFLCB0aGlzLmNhbGxiYWNrcy5vbkNvbXBsZXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGF1c2VzIHRoZSBUd2VlbiBpbW1lZGlhdGVseS4gVXNlIGByZXN1bWVgIHRvIGNvbnRpbnVlIHBsYXliYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNwYXVzZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGlzIFR3ZWVuIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBwYXVzZTogZnVuY3Rpb24gKClcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUEFVU0VEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3BhdXNlZFN0YXRlID0gdGhpcy5zdGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBBVVNFRDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RhcnRzIGEgVHdlZW4gcGxheWluZy5cclxuICAgICAqIFxyXG4gICAgICogWW91IG9ubHkgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgdGhlIHR3ZWVuIHRvIGJlIHBhdXNlZCBvbiBjcmVhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIFR3ZWVuIGlzIGFscmVhZHkgcGxheWluZywgY2FsbGluZyB0aGlzIG1ldGhvZCBhZ2FpbiB3aWxsIGhhdmUgbm8gZWZmZWN0LiBJZiB5b3Ugd2lzaCB0b1xyXG4gICAgICogcmVzdGFydCB0aGUgVHdlZW4sIHVzZSBgVHdlZW4ucmVzdGFydGAgaW5zdGVhZC5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciB0aGUgVHdlZW4gaGFzIGNvbXBsZXRlZCB3aWxsIHN0YXJ0IHRoZSBUd2VlbiBwbGF5aW5nIGFnYWluIGZyb20gdGhlIHN0YXJ0LlxyXG4gICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGBUd2Vlbi5zZWVrKDApYCBhbmQgdGhlbiBgVHdlZW4ucGxheSgpYC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jcGxheVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVzZXRGcm9tVGltZWxpbmU9ZmFsc2VdIC0gSXMgdGhpcyBUd2VlbiBiZWluZyBwbGF5ZWQgYXMgcGFydCBvZiBhIFRpbWVsaW5lP1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHdlZW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHBsYXk6IGZ1bmN0aW9uIChyZXNldEZyb21UaW1lbGluZSlcclxuICAgIHtcclxuICAgICAgICBpZiAocmVzZXRGcm9tVGltZWxpbmUgPT09IHVuZGVmaW5lZCkgeyByZXNldEZyb21UaW1lbGluZSA9IGZhbHNlOyB9XHJcblxyXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gVFdFRU5fQ09OU1QuSU5JVCAmJiAhdGhpcy5wYXJlbnRJc1RpbWVsaW5lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFR3ZWVuRGF0YShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuQUNUSVZFO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSBUV0VFTl9DT05TVC5BQ1RJVkUgfHwgKHN0YXRlID09PSBUV0VFTl9DT05TVC5QRU5ESU5HX0FERCAmJiB0aGlzLl9wYXVzZWRTdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUEVORElOR19BREQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLnBhcmVudElzVGltZWxpbmUgJiYgKHN0YXRlID09PSBUV0VFTl9DT05TVC5QRU5ESU5HX1JFTU9WRSB8fCBzdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUkVNT1ZFRCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNlZWsoMCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Lm1ha2VBY3RpdmUodGhpcyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudElzVGltZWxpbmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHdlZW5EYXRhKHJlc2V0RnJvbVRpbWVsaW5lKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZWRPZmZzZXQgPT09IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50ZG93biA9IHRoaXMuY2FsY3VsYXRlZE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuT0ZGU0VUX0RFTEFZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGF1c2VkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFrZUFjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHdlZW5EYXRhKHJlc2V0RnJvbVRpbWVsaW5lKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1ha2VBY3RpdmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHJlc2V0cyBhbGwgb2YgdGhlIFR3ZWVuIERhdGEsIGluY2x1ZGluZyB0aGUgcHJvZ3Jlc3MgYW5kIGVsYXBzZWQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNyZXNldFR3ZWVuRGF0YVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXNldEZyb21Mb29wIC0gSGFzIHRoaXMgbWV0aG9kIGJlZW4gY2FsbGVkIGFzIHBhcnQgb2YgYSBsb29wP1xyXG4gICAgICovXHJcbiAgICByZXNldFR3ZWVuRGF0YTogZnVuY3Rpb24gKHJlc2V0RnJvbUxvb3ApXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgdmFyIHRvdGFsID0gdGhpcy50b3RhbERhdGE7XHJcbiAgICAgICAgdmFyIHRvdGFsVGFyZ2V0cyA9IHRoaXMudG90YWxUYXJnZXRzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdHdlZW5EYXRhID0gZGF0YVtpXTtcclxuXHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0d2VlbkRhdGEudGFyZ2V0O1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gdHdlZW5EYXRhLmtleTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gdHdlZW5EYXRhLmluZGV4O1xyXG5cclxuICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gMDtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLmVsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAgICAgdHdlZW5EYXRhLnJlcGVhdENvdW50ZXIgPSAodHdlZW5EYXRhLnJlcGVhdCA9PT0gLTEpID8gOTk5OTk5OTk5OTk5IDogdHdlZW5EYXRhLnJlcGVhdDtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNldEZyb21Mb29wKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhcnQgPSB0d2VlbkRhdGEuZ2V0U3RhcnRWYWx1ZSh0YXJnZXQsIGtleSwgdHdlZW5EYXRhLnN0YXJ0LCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuZW5kID0gdHdlZW5EYXRhLmdldEVuZFZhbHVlKHRhcmdldCwga2V5LCB0d2VlbkRhdGEuZW5kLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzLCB0aGlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuY3VycmVudCA9IHR3ZWVuRGF0YS5zdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5QTEFZSU5HX0ZPUldBUkQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5QRU5ESU5HX1JFTkRFUjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5kZWxheSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gdHdlZW5EYXRhLmRlbGF5O1xyXG5cclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5zdGF0ZSA9IFRXRUVOX0NPTlNULkRFTEFZO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHdlZW5EYXRhLmdldEFjdGl2ZVZhbHVlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHR3ZWVuRGF0YS5nZXRBY3RpdmVWYWx1ZSh0d2VlbkRhdGEudGFyZ2V0LCB0d2VlbkRhdGEua2V5LCB0d2VlbkRhdGEuc3RhcnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3VtZXMgdGhlIHBsYXliYWNrIG9mIGEgcHJldmlvdXNseSBwYXVzZWQgVHdlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI3Jlc3VtZVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGlzIFR3ZWVuIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBBVVNFRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5fcGF1c2VkU3RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGxheSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Vla3MgdG8gYSBzcGVjaWZpYyBwb2ludCBpbiB0aGUgVHdlZW4uXHJcbiAgICAgKiBcclxuICAgICAqICoqTm90ZToqKiBZb3UgY2Fubm90IHNlZWsgYSBUd2VlbiB0aGF0IHJlcGVhdHMgb3IgbG9vcHMgZm9yZXZlciwgb3IgdGhhdCBoYXMgYW4gdW51c3VhbGx5IGxvbmcgdG90YWwgZHVyYXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBnaXZlbiBwb3NpdGlvbiBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB3aGljaCByZXByZXNlbnRzIGhvdyBmYXIgdGhyb3VnaCB0aGUgVHdlZW4gdG8gc2VlayB0by5cclxuICAgICAqIEEgdmFsdWUgb2YgMC41IHdvdWxkIHNlZWsgdG8gaGFsZi13YXkgdGhyb3VnaCB0aGUgVHdlZW4sIHdoZXJlLWFzIGEgdmFsdWUgb2YgemVybyB3b3VsZCBzZWVrIHRvIHRoZSBzdGFydC5cclxuICAgICAqIFxyXG4gICAgICogTm90ZSB0aGF0IHRoZSBzZWVrIHRha2VzIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIFR3ZWVuIGludG8gYWNjb3VudCwgaW5jbHVkaW5nIGRlbGF5cywgbG9vcHMgYW5kIHJlcGVhdHMuXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBUd2VlbiB0aGF0IGxhc3RzIGZvciAyIHNlY29uZHMsIGJ1dCB0aGF0IGxvb3BzIDMgdGltZXMsIHdvdWxkIGhhdmUgYSB0b3RhbCBkdXJhdGlvbiBvZiA2IHNlY29uZHMsXHJcbiAgICAgKiBzbyBzZWVraW5nIHRvIDAuNSB3b3VsZCBzZWVrIHRvIDMgc2Vjb25kcyBpbnRvIHRoZSBUd2VlbiwgYXMgdGhhdCdzIGhhbGYtd2F5IHRocm91Z2ggaXRzIF9lbnRpcmVfIGR1cmF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBTZWVraW5nIHdvcmtzIGJ5IHJlc2V0dGluZyB0aGUgVHdlZW4gdG8gaXRzIGluaXRpYWwgdmFsdWVzIGFuZCB0aGVuIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBUd2VlbiBhdCBgZGVsdGFgXHJcbiAgICAgKiBqdW1wcyBwZXIgc3RlcC4gVGhlIGxvbmdlciB0aGUgVHdlZW4sIHRoZSBsb25nZXIgdGhpcyBjYW4gdGFrZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jc2Vla1xyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvUG9zaXRpb24gLSBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB3aGljaCByZXByZXNlbnRzIHRoZSBwcm9ncmVzcyBwb2ludCB0byBzZWVrIHRvLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWx0YT0xNi42XSAtIFRoZSBzaXplIG9mIGVhY2ggc3RlcCB3aGVuIHNlZWtpbmcgdGhyb3VnaCB0aGUgVHdlZW4uIEEgaGlnaGVyIHZhbHVlIGNvbXBsZXRlcyBmYXN0ZXIgYnV0IGF0IGEgY29zdCBvZiBsZXNzIHByZWNpc2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBUaGlzIFR3ZWVuIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzZWVrOiBmdW5jdGlvbiAodG9Qb3NpdGlvbiwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGRlbHRhID09PSB1bmRlZmluZWQpIHsgZGVsdGEgPSAxNi42OyB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvdGFsRHVyYXRpb24gPj0gMzYwMDAwMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVHdlZW4uc2VlayBkdXJhdGlvbiB0b28gbG9uZycpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUkVNT1ZFRClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZUFjdGl2ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbGFwc2VkID0gMDtcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuICAgICAgICB0aGlzLnRvdGFsRWxhcHNlZCA9IDA7XHJcbiAgICAgICAgdGhpcy50b3RhbFByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgdmFyIHRvdGFsVGFyZ2V0cyA9IHRoaXMudG90YWxUYXJnZXRzO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudG90YWxEYXRhOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdHdlZW5EYXRhID0gZGF0YVtpXTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHR3ZWVuRGF0YS50YXJnZXQ7XHJcbiAgICAgICAgICAgIHZhciBnZW4gPSB0d2VlbkRhdGEuZ2VuO1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gdHdlZW5EYXRhLmtleTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldEluZGV4ID0gdHdlZW5EYXRhLmluZGV4O1xyXG5cclxuICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gMDtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLmVsYXBzZWQgPSAwO1xyXG5cclxuICAgICAgICAgICAgdHdlZW5EYXRhLnJlcGVhdENvdW50ZXIgPSAodHdlZW5EYXRhLnJlcGVhdCA9PT0gLTEpID8gOTk5OTk5OTk5OTk5IDogdHdlZW5EYXRhLnJlcGVhdDtcclxuXHJcbiAgICAgICAgICAgIC8vICBPbGQgZnVuY3Rpb24gc2lnbmF0dXJlOiBpLCB0b3RhbFRhcmdldHMsIHRhcmdldFxyXG4gICAgICAgICAgICAvLyAgTmV3IGZ1bmN0aW9uIHNpZ25hdHVyZTogdGFyZ2V0LCBrZXksIHZhbHVlLCBpbmRleCwgdG90YWwsIHR3ZWVuXHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuZGVsYXkgPSBnZW4uZGVsYXkodGFyZ2V0LCBrZXksIDAsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHRoaXMpO1xyXG4gICAgICAgICAgICB0d2VlbkRhdGEuZHVyYXRpb24gPSBNYXRoLm1heChnZW4uZHVyYXRpb24odGFyZ2V0LCBrZXksIDAsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHRoaXMpLCAwLjAwMSk7XHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5ob2xkID0gZ2VuLmhvbGQodGFyZ2V0LCBrZXksIDAsIHRhcmdldEluZGV4LCB0b3RhbFRhcmdldHMsIHRoaXMpO1xyXG4gICAgICAgICAgICB0d2VlbkRhdGEucmVwZWF0ID0gZ2VuLnJlcGVhdCh0YXJnZXQsIGtleSwgMCwgdGFyZ2V0SW5kZXgsIHRvdGFsVGFyZ2V0cywgdGhpcyk7XHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5yZXBlYXREZWxheSA9IGdlbi5yZXBlYXREZWxheSh0YXJnZXQsIGtleSwgMCwgdGFyZ2V0SW5kZXgsIHRvdGFsVGFyZ2V0cywgdGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuY3VycmVudCA9IHR3ZWVuRGF0YS5zdGFydDtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnN0YXRlID0gVFdFRU5fQ09OU1QuUExBWUlOR19GT1JXQVJEO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUd2VlbkRhdGEodGhpcywgdHdlZW5EYXRhLCAwLCB0YXJnZXRJbmRleCwgdG90YWxUYXJnZXRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZGVsYXkgPiAwKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuZWxhcHNlZCA9IHR3ZWVuRGF0YS5kZWxheTtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5zdGF0ZSA9IFRXRUVOX0NPTlNULkRFTEFZO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGNEdXJhdGlvbigpO1xyXG5cclxuICAgICAgICB2YXIgd2FzUGF1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5QQVVTRUQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3YXNQYXVzZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULkFDVElWRTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZWVraW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZG9cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKDAsIGRlbHRhKTtcclxuXHJcbiAgICAgICAgfSB3aGlsZSAodGhpcy50b3RhbFByb2dyZXNzIDwgdG9Qb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZWVraW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh3YXNQYXVzZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEFVU0VEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhbiBldmVudCBiYXNlZCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGR1cmluZyBwbGF5YmFjay5cclxuICAgICAqIFxyXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgYSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUsIGlmIGFueSBleGlzdHMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSB0eXBlcyBhdmFpbGFibGUgYXJlOlxyXG4gICAgICogXHJcbiAgICAgKiBgb25BY3RpdmVgIFdoZW4gdGhlIFR3ZWVuIGlzIG1vdmVkIGZyb20gdGhlIHBlbmRpbmcgdG8gdGhlIGFjdGl2ZSBsaXN0IGluIHRoZSBUd2VlbiBNYW5hZ2VyLCBldmVuIGlmIHBsYXliYWNrIHBhdXNlZC5cclxuICAgICAqIGBvblN0YXJ0YCBXaGVuIHRoZSBUd2VlbiBzdGFydHMgcGxheWluZyBhZnRlciBhIGRlbGF5ZWQgc3RhdGUuIFdpbGwgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgYG9uQWN0aXZlYCBpZiBpdCBoYXMgbm8gZGVsYXkuXHJcbiAgICAgKiBgb25Zb3lvYCBXaGVuIGEgVHdlZW5EYXRhIHN0YXJ0cyBhIHlveW8uIFRoaXMgaGFwcGVucyBfYWZ0ZXJfIHRoZSBgaG9sZGAgZGVsYXkgZXhwaXJlcywgaWYgc2V0LlxyXG4gICAgICogYG9uUmVwZWF0YCBXaGVuIGEgVHdlZW5EYXRhIHJlcGVhdHMgcGxheWJhY2suIFRoaXMgaGFwcGVucyBfYWZ0ZXJfIHRoZSBgcmVwZWF0RGVsYXlgIGV4cGlyZXMsIGlmIHNldC5cclxuICAgICAqIGBvbkNvbXBsZXRlYCBXaGVuIHRoZSBUd2VlbiBmaW5pc2hlcyBwbGF5YmFjayBmdWxseSBvciBgVHdlZW4uc3RvcGAgaXMgY2FsbGVkLiBOZXZlciBpbnZva2VkIGlmIHR3ZWVuIGlzIHNldCB0byByZXBlYXQgaW5maW5pdGVseS5cclxuICAgICAqIGBvblVwZGF0ZWAgV2hlbiBhIFR3ZWVuRGF0YSB1cGRhdGVzIGEgcHJvcGVydHkgb24gYSBzb3VyY2UgdGFyZ2V0IGR1cmluZyBwbGF5YmFjay5cclxuICAgICAqIGBvbkxvb3BgIFdoZW4gYSBUd2VlbiBsb29wcy4gVGhpcyBoYXBwZW5zIF9hZnRlcl8gdGhlIGBsb29wRGVsYXlgIGV4cGlyZXMsIGlmIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jc2V0Q2FsbGJhY2tcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVHlwZSBvZiB0aGUgY2FsbGJhY2sgdG8gc2V0LlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhpcyBjYWxsYmFjayBoYXBwZW5zLlxyXG4gICAgICogQHBhcmFtIHthcnJheX0gW3BhcmFtc10gLSBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciBzcGVjaWZpZWQgY2FsbGJhY2tzIHR5cGVzLlxyXG4gICAgICogQHBhcmFtIHthbnl9IFtzY29wZV0gLSBUaGUgY29udGV4dCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGluLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHdlZW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldENhbGxiYWNrOiBmdW5jdGlvbiAodHlwZSwgY2FsbGJhY2ssIHBhcmFtcywgc2NvcGUpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3NbdHlwZV0gPSB7IGZ1bmM6IGNhbGxiYWNrLCBzY29wZTogc2NvcGUsIHBhcmFtczogcGFyYW1zIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZsYWdzIHRoZSBUd2VlbiBhcyBiZWluZyBjb21wbGV0ZSwgd2hhdGV2ZXIgc3RhZ2Ugb2YgcHJvZ3Jlc3MgaXQgaXMgYXQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgYW4gb25Db21wbGV0ZSBjYWxsYmFjayBoYXMgYmVlbiBkZWZpbmVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBpbnZva2UgaXQsIHVubGVzcyBhIGBkZWxheWBcclxuICAgICAqIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBUd2VlbiB3aWxsIGRlbGF5IGZvciB0aGF0IHBlcmlvZCBvZiB0aW1lIGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBJZiB5b3UgZG9uJ3QgbmVlZCBhIGRlbGF5LCBvciBoYXZlIGFuIG9uQ29tcGxldGUgY2FsbGJhY2ssIHRoZW4gY2FsbCBgVHdlZW4uc3RvcGAgaW5zdGVhZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jY29tcGxldGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUV0VFTl9DT01QTEVURVxyXG4gICAgICogQHNpbmNlIDMuMi4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheT0wXSAtIFRoZSB0aW1lIHRvIHdhaXQgYmVmb3JlIGludm9raW5nIHRoZSBjb21wbGV0ZSBjYWxsYmFjay4gSWYgemVybyBpdCB3aWxsIGZpcmUgaW1tZWRpYXRlbHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUd2VlbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uIChkZWxheSlcclxuICAgIHtcclxuICAgICAgICBpZiAoZGVsYXkgPT09IHVuZGVmaW5lZCkgeyBkZWxheSA9IDA7IH1cclxuXHJcbiAgICAgICAgaWYgKGRlbGF5KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULkNPTVBMRVRFX0RFTEFZO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb3VudGRvd24gPSBkZWxheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBFTkRJTkdfUkVNT1ZFO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFR3ZWVuRXZlbnQoRXZlbnRzLlRXRUVOX0NPTVBMRVRFLCB0aGlzLmNhbGxiYWNrcy5vbkNvbXBsZXRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltbWVkaWF0ZWx5IHJlbW92ZXMgdGhpcyBUd2VlbiBmcm9tIHRoZSBUd2Vlbk1hbmFnZXIgYW5kIGFsbCBvZiBpdHMgaW50ZXJuYWwgYXJyYXlzLFxyXG4gICAgICogbm8gbWF0dGVyIHdoYXQgc3RhZ2UgaXQgYXMgaXQuIFRoZW4gc2V0cyB0aGUgdHdlZW4gc3RhdGUgdG8gYFJFTU9WRURgLlxyXG4gICAgICogXHJcbiAgICAgKiBZb3Ugc2hvdWxkIGRpc3Bvc2Ugb2YgeW91ciByZWZlcmVuY2UgdG8gdGhpcyB0d2VlbiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0b1xyXG4gICAgICogZnJlZSBpdCBmcm9tIG1lbW9yeS5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jcmVtb3ZlXHJcbiAgICAgKiBAc2luY2UgMy4xNy4wXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiB7dGhpc30gVGhpcyBUd2VlbiBpbnN0YW5jZS5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIFR3ZWVuIGltbWVkaWF0ZWx5LCB3aGF0ZXZlciBzdGFnZSBvZiBwcm9ncmVzcyBpdCBpcyBhdCBhbmQgZmxhZ3MgaXQgZm9yIHJlbW92YWwgYnkgdGhlIFR3ZWVuTWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jc3RvcFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyZXNldFRvXSAtIElmIHlvdSB3YW50IHRvIHNlZWsgdGhlIHR3ZWVuLCBwcm92aWRlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge3RoaXN9IFRoaXMgVHdlZW4gaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0b3A6IGZ1bmN0aW9uIChyZXNldFRvKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5BQ1RJVkUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocmVzZXRUbyAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlZWsocmVzZXRUbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBUV0VFTl9DT05TVC5SRU1PVkVEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBBVVNFRCB8fCB0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5QRU5ESU5HX0FERClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50SXNUaW1lbGluZSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5tYW5hZ2VyLl9kZXN0cm95LnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQubWFuYWdlci5fdG9Qcm9jZXNzKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2Rlc3Ryb3kucHVzaCh0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fdG9Qcm9jZXNzKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVFdFRU5fQ09OU1QuUEVORElOR19SRU1PVkU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCBhZHZhbmNlcyB0aGUgVHdlZW4gYmFzZWQgb24gdGhlIHRpbWUgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiN1cGRhdGVcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUV0VFTl9DT01QTEVURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX0xPT1BcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUV0VFTl9TVEFSVFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBhIEhpZ2ggUmVzb2x1dGlvbiBUaW1lciB2YWx1ZSBpZiBpdCBjb21lcyBmcm9tIFJlcXVlc3QgQW5pbWF0aW9uIEZyYW1lLCBvciBEYXRlLm5vdyBpZiB1c2luZyBTZXRUaW1lb3V0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIC0gVGhlIGRlbHRhIHRpbWUgaW4gbXMgc2luY2UgdGhlIGxhc3QgZnJhbWUuIFRoaXMgaXMgYSBzbW9vdGhlZCBhbmQgY2FwcGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBGUFMgcmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIFR3ZWVuIGhhcyBmaW5pc2hlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgVHdlZW4gTWFuYWdlciwgb3RoZXJ3aXNlIHJldHVybnMgYGZhbHNlYC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAodGltZXN0YW1wLCBkZWx0YSlcclxuICAgIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVFdFRU5fQ09OU1QuUEFVU0VEKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlRnJhbWVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsdGEgPSAxICogdGhpcy5wYXJlbnQudGltZVNjYWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVsdGEgKj0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIHRoaXMuZWxhcHNlZCArPSBkZWx0YTtcclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4odGhpcy5lbGFwc2VkIC8gdGhpcy5kdXJhdGlvbiwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMudG90YWxFbGFwc2VkICs9IGRlbHRhO1xyXG4gICAgICAgIHRoaXMudG90YWxQcm9ncmVzcyA9IE1hdGgubWluKHRoaXMudG90YWxFbGFwc2VkIC8gdGhpcy50b3RhbER1cmF0aW9uLCAxKTtcclxuXHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5BQ1RJVkU6XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWQgJiYgIXRoaXMuaXNTZWVraW5nKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREZWxheSAtPSBkZWx0YTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydERlbGF5IDw9IDApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaFR3ZWVuRXZlbnQoRXZlbnRzLlRXRUVOX1NUQVJULCB0aGlzLmNhbGxiYWNrcy5vblN0YXJ0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHN0aWxsUnVubmluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50b3RhbERhdGE7IGkrKylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdHdlZW5EYXRhID0gdGhpcy5kYXRhW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGRhdGVUd2VlbkRhdGEodGhpcywgdHdlZW5EYXRhLCBkZWx0YSkpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlsbFJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgQW55dGhpbmcgc3RpbGwgcnVubmluZz8gSWYgbm90LCB3ZSdyZSBkb25lXHJcbiAgICAgICAgICAgICAgICBpZiAoIXN0aWxsUnVubmluZylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5MT09QX0RFTEFZOlxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnRkb3duIC09IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvdW50ZG93biA8PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUV0VFTl9DT05TVC5BQ1RJVkU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkV2ZW50KEV2ZW50cy5UV0VFTl9MT09QLCB0aGlzLmNhbGxiYWNrcy5vbkxvb3ApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5PRkZTRVRfREVMQVk6XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGRvd24gLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnRkb3duIDw9IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULkFDVElWRTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgVFdFRU5fQ09OU1QuQ09NUExFVEVfREVMQVk6XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGRvd24gLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnRkb3duIDw9IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFRXRUVOX0NPTlNULlBFTkRJTkdfUkVNT1ZFO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoVHdlZW5FdmVudChFdmVudHMuVFdFRU5fQ09NUExFVEUsIHRoaXMuY2FsbGJhY2tzLm9uQ29tcGxldGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXRlID09PSBUV0VFTl9DT05TVC5QRU5ESU5HX1JFTU9WRSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHRoYXQgd2lsbCBlbWl0IGEgVHdlZW5EYXRhIGJhc2VkIEV2ZW50IGFuZCBpbnZva2UgdGhlIGdpdmVuIGNhbGxiYWNrLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2QgUGhhc2VyLlR3ZWVucy5Ud2VlbiNkaXNwYXRjaFR3ZWVuRGF0YUV2ZW50XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLkV2ZW50fSBldmVudCAtIFRoZSBFdmVudCB0byBiZSBkaXNwYXRjaGVkLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZC4gQ2FuIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGludm9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5EYXRhQ29uZmlnfSB0d2VlbkRhdGEgLSBUaGUgVHdlZW5EYXRhIG9iamVjdCB0aGF0IGNhdXNlZCB0aGlzIGV2ZW50LlxyXG4gICAgICovXHJcbiAgICBkaXNwYXRjaFR3ZWVuRGF0YUV2ZW50OiBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrLCB0d2VlbkRhdGEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU2Vla2luZylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChldmVudCwgdGhpcywgdHdlZW5EYXRhLmtleSwgdHdlZW5EYXRhLnRhcmdldCwgdHdlZW5EYXRhLmN1cnJlbnQsIHR3ZWVuRGF0YS5wcmV2aW91cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLnBhcmFtc1sxXSA9IHR3ZWVuRGF0YS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suZnVuYy5hcHBseShjYWxsYmFjay5zY29wZSwgY2FsbGJhY2sucGFyYW1zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdGhhdCB3aWxsIGVtaXQgYSBUd2VlbiBiYXNlZCBFdmVudCBhbmQgaW52b2tlIHRoZSBnaXZlbiBjYWxsYmFjay5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jZGlzcGF0Y2hUd2VlbkV2ZW50XHJcbiAgICAgKiBAc2luY2UgMy4xOS4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLkV2ZW50fSBldmVudCAtIFRoZSBFdmVudCB0byBiZSBkaXNwYXRjaGVkLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZC4gQ2FuIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGludm9jYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGRpc3BhdGNoVHdlZW5FdmVudDogZnVuY3Rpb24gKGV2ZW50LCBjYWxsYmFjaylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNTZWVraW5nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KGV2ZW50LCB0aGlzLCB0aGlzLnRhcmdldHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5wYXJhbXNbMV0gPSB0aGlzLnRhcmdldHM7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmZ1bmMuYXBwbHkoY2FsbGJhY2suc2NvcGUsIGNhbGxiYWNrLnBhcmFtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgYXMgcGFydCBvZiB0aGUgcGxheWJhY2sgcHJvY2VzcyB0aGF0IHNldHMgYSB0d2VlbiB0byBwbGF5IGluIHJldmVyc2UuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI3NldFN0YXRlRnJvbUVuZFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1JFUEVBVFxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1lPWU9cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBUaGUgVHdlZW4gdG8gdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuRGF0YUNvbmZpZ30gdHdlZW5EYXRhIC0gVGhlIFR3ZWVuRGF0YSBwcm9wZXJ0eSB0byB1cGRhdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlmZiAtIEFueSBleHRyYSB0aW1lIHRoYXQgbmVlZHMgdG8gYmUgYWNjb3VudGVkIGZvciBpbiB0aGUgZWxhcHNlZCBhbmQgcHJvZ3Jlc3MgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBzdGF0ZSBvZiB0aGlzIFR3ZWVuLlxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0ZUZyb21FbmQ6IGZ1bmN0aW9uICh0d2VlbiwgdHdlZW5EYXRhLCBkaWZmKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0d2VlbkRhdGEueW95bylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXZSd2ZSBoaXQgdGhlIGVuZCBvZiBhIFBsYXlpbmcgRm9yd2FyZCBUd2VlbkRhdGEgYW5kIHdlIGhhdmUgYSB5b3lvXHJcblxyXG4gICAgICAgICAgICAvLyAgQWNjb3VudCBmb3IgYW55IGV4dHJhIHRpbWUgd2UgZ290IGZyb20gdGhlIHByZXZpb3VzIGZyYW1lXHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gZGlmZjtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gZGlmZiAvIHR3ZWVuRGF0YS5kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS50YXJnZXQudG9nZ2xlRmxpcFgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnRhcmdldC50b2dnbGVGbGlwWSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoVHdlZW5EYXRhRXZlbnQoRXZlbnRzLlRXRUVOX1lPWU8sIHR3ZWVuLmNhbGxiYWNrcy5vbllveW8sIHR3ZWVuRGF0YSk7XHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuc3RhcnQgPSB0d2VlbkRhdGEuZ2V0U3RhcnRWYWx1ZSh0d2VlbkRhdGEudGFyZ2V0LCB0d2VlbkRhdGEua2V5LCB0d2VlbkRhdGEuc3RhcnQsIHR3ZWVuRGF0YS5pbmRleCwgdHdlZW4udG90YWxUYXJnZXRzLCB0d2Vlbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gVFdFRU5fQ09OU1QuUExBWUlOR19CQUNLV0FSRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHdlZW5EYXRhLnJlcGVhdENvdW50ZXIgPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIFdlJ3ZlIGhpdCB0aGUgZW5kIG9mIGEgUGxheWluZyBGb3J3YXJkIFR3ZWVuRGF0YSBhbmQgd2UgaGF2ZSBhIFJlcGVhdC5cclxuICAgICAgICAgICAgLy8gIFNvIHdlJ3JlIGdvaW5nIHRvIGdvIHJpZ2h0IGJhY2sgdG8gdGhlIHN0YXJ0IHRvIHJlcGVhdCBpdCBhZ2Fpbi5cclxuXHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5yZXBlYXRDb3VudGVyLS07XHJcblxyXG4gICAgICAgICAgICAvLyAgQWNjb3VudCBmb3IgYW55IGV4dHJhIHRpbWUgd2UgZ290IGZyb20gdGhlIHByZXZpb3VzIGZyYW1lXHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gZGlmZjtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gZGlmZiAvIHR3ZWVuRGF0YS5kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS50YXJnZXQudG9nZ2xlRmxpcFgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnRhcmdldC50b2dnbGVGbGlwWSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuc3RhcnQgPSB0d2VlbkRhdGEuZ2V0U3RhcnRWYWx1ZSh0d2VlbkRhdGEudGFyZ2V0LCB0d2VlbkRhdGEua2V5LCB0d2VlbkRhdGEuc3RhcnQsIHR3ZWVuRGF0YS5pbmRleCwgdHdlZW4udG90YWxUYXJnZXRzLCB0d2Vlbik7XHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuZW5kID0gdHdlZW5EYXRhLmdldEVuZFZhbHVlKHR3ZWVuRGF0YS50YXJnZXQsIHR3ZWVuRGF0YS5rZXksIHR3ZWVuRGF0YS5zdGFydCwgdHdlZW5EYXRhLmluZGV4LCB0d2Vlbi50b3RhbFRhcmdldHMsIHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBEZWxheT9cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5yZXBlYXREZWxheSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gdHdlZW5EYXRhLnJlcGVhdERlbGF5IC0gZGlmZjtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuY3VycmVudCA9IHR3ZWVuRGF0YS5zdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEudGFyZ2V0W3R3ZWVuRGF0YS5rZXldID0gdHdlZW5EYXRhLmN1cnJlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULlJFUEVBVF9ERUxBWTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkRhdGFFdmVudChFdmVudHMuVFdFRU5fUkVQRUFULCB0d2Vlbi5jYWxsYmFja3Mub25SZXBlYXQsIHR3ZWVuRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULlBMQVlJTkdfRk9SV0FSRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULkNPTVBMRVRFO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGFzIHBhcnQgb2YgdGhlIHBsYXliYWNrIHByb2Nlc3MgdGhhdCBzZXRzIGEgdHdlZW4gdG8gcGxheSBmcm9tIHRoZSBzdGFydC5cclxuICAgICAqXHJcbiAgICAgKiBAbWV0aG9kIFBoYXNlci5Ud2VlbnMuVHdlZW4jc2V0U3RhdGVGcm9tU3RhcnRcclxuICAgICAqIEBmaXJlcyBQaGFzZXIuVHdlZW5zLkV2ZW50cyNUV0VFTl9SRVBFQVRcclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGhhc2VyLlR3ZWVucy5Ud2Vlbn0gdHdlZW4gLSBUaGUgVHdlZW4gdG8gdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHlwZXMuVHdlZW5zLlR3ZWVuRGF0YUNvbmZpZ30gdHdlZW5EYXRhIC0gVGhlIFR3ZWVuRGF0YSBwcm9wZXJ0eSB0byB1cGRhdGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGlmZiAtIEFueSBleHRyYSB0aW1lIHRoYXQgbmVlZHMgdG8gYmUgYWNjb3VudGVkIGZvciBpbiB0aGUgZWxhcHNlZCBhbmQgcHJvZ3Jlc3MgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSBzdGF0ZSBvZiB0aGlzIFR3ZWVuLlxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0ZUZyb21TdGFydDogZnVuY3Rpb24gKHR3ZWVuLCB0d2VlbkRhdGEsIGRpZmYpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHR3ZWVuRGF0YS5yZXBlYXRDb3VudGVyID4gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5yZXBlYXRDb3VudGVyLS07XHJcblxyXG4gICAgICAgICAgICAvLyAgQWNjb3VudCBmb3IgYW55IGV4dHJhIHRpbWUgd2UgZ290IGZyb20gdGhlIHByZXZpb3VzIGZyYW1lXHJcbiAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gZGlmZjtcclxuICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gZGlmZiAvIHR3ZWVuRGF0YS5kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZmxpcFgpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS50YXJnZXQudG9nZ2xlRmxpcFgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5mbGlwWSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnRhcmdldC50b2dnbGVGbGlwWSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0d2VlbkRhdGEuZW5kID0gdHdlZW5EYXRhLmdldEVuZFZhbHVlKHR3ZWVuRGF0YS50YXJnZXQsIHR3ZWVuRGF0YS5rZXksIHR3ZWVuRGF0YS5zdGFydCwgdHdlZW5EYXRhLmluZGV4LCB0d2Vlbi50b3RhbFRhcmdldHMsIHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgIC8vICBEZWxheT9cclxuICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5yZXBlYXREZWxheSA+IDApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gdHdlZW5EYXRhLnJlcGVhdERlbGF5IC0gZGlmZjtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEuY3VycmVudCA9IHR3ZWVuRGF0YS5zdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEudGFyZ2V0W3R3ZWVuRGF0YS5rZXldID0gdHdlZW5EYXRhLmN1cnJlbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULlJFUEVBVF9ERUxBWTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkRhdGFFdmVudChFdmVudHMuVFdFRU5fUkVQRUFULCB0d2Vlbi5jYWxsYmFja3Mub25SZXBlYXQsIHR3ZWVuRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULlBMQVlJTkdfRk9SV0FSRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRXRUVOX0NPTlNULkNPTVBMRVRFO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IGFkdmFuY2VzIHRoZSBUd2VlbkRhdGEgYmFzZWQgb24gdGhlIHRpbWUgdmFsdWUgZ2l2ZW4uXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZCBQaGFzZXIuVHdlZW5zLlR3ZWVuI3VwZGF0ZVR3ZWVuRGF0YVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1VQREFURVxyXG4gICAgICogQGZpcmVzIFBoYXNlci5Ud2VlbnMuRXZlbnRzI1RXRUVOX1JFUEVBVFxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQaGFzZXIuVHdlZW5zLlR3ZWVufSB0d2VlbiAtIFRoZSBUd2VlbiB0byB1cGRhdGUuXHJcbiAgICAgKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5EYXRhQ29uZmlnfSB0d2VlbkRhdGEgLSBUaGUgVHdlZW5EYXRhIHByb3BlcnR5IHRvIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YSAtIEVpdGhlciBhIHZhbHVlIGluIG1zLCBvciAxIGlmIFR3ZWVuLnVzZUZyYW1lcyBpcyB0cnVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR3ZWVuIGlzIG5vdCBjb21wbGV0ZSAoZS5nLiwgcGxheWluZyksIG9yIGZhbHNlIGlmIHRoZSB0d2VlbiBpcyBjb21wbGV0ZS5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlVHdlZW5EYXRhOiBmdW5jdGlvbiAodHdlZW4sIHR3ZWVuRGF0YSwgZGVsdGEpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRhcmdldCA9IHR3ZWVuRGF0YS50YXJnZXQ7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodHdlZW5EYXRhLnN0YXRlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBUV0VFTl9DT05TVC5QTEFZSU5HX0ZPUldBUkQ6XHJcbiAgICAgICAgICAgIGNhc2UgVFdFRU5fQ09OU1QuUExBWUlOR19CQUNLV0FSRDpcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5DT01QTEVURTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZWxhcHNlZCA9IHR3ZWVuRGF0YS5lbGFwc2VkO1xyXG4gICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gdHdlZW5EYXRhLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpZmYgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGVsYXBzZWQgKz0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsYXBzZWQgPiBkdXJhdGlvbilcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaWZmID0gZWxhcHNlZCAtIGR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSBkdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZm9yd2FyZCA9ICh0d2VlbkRhdGEuc3RhdGUgPT09IFRXRUVOX0NPTlNULlBMQVlJTkdfRk9SV0FSRCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBlbGFwc2VkIC8gZHVyYXRpb247XHJcblxyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLmVsYXBzZWQgPSBlbGFwc2VkO1xyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLnByb2dyZXNzID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICB0d2VlbkRhdGEucHJldmlvdXMgPSB0d2VlbkRhdGEuY3VycmVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT09IDEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcndhcmQpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuY3VycmVudCA9IHR3ZWVuRGF0YS5lbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0d2VlbkRhdGEua2V5XSA9IHR3ZWVuRGF0YS5lbmQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHdlZW5EYXRhLmhvbGQgPiAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuZWxhcHNlZCA9IHR3ZWVuRGF0YS5ob2xkIC0gZGlmZjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5IT0xEX0RFTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLnN0YXRlID0gdGhpcy5zZXRTdGF0ZUZyb21FbmQodHdlZW4sIHR3ZWVuRGF0YSwgZGlmZik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLmN1cnJlbnQgPSB0d2VlbkRhdGEuc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFt0d2VlbkRhdGEua2V5XSA9IHR3ZWVuRGF0YS5zdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5zdGF0ZSA9IHRoaXMuc2V0U3RhdGVGcm9tU3RhcnQodHdlZW4sIHR3ZWVuRGF0YSwgZGlmZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gKGZvcndhcmQpID8gdHdlZW5EYXRhLmVhc2UocHJvZ3Jlc3MpIDogdHdlZW5EYXRhLmVhc2UoMSAtIHByb2dyZXNzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLmN1cnJlbnQgPSB0d2VlbkRhdGEuc3RhcnQgKyAoKHR3ZWVuRGF0YS5lbmQgLSB0d2VlbkRhdGEuc3RhcnQpICogdik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFt0d2VlbkRhdGEua2V5XSA9IHR3ZWVuRGF0YS5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkRhdGFFdmVudChFdmVudHMuVFdFRU5fVVBEQVRFLCB0d2Vlbi5jYWxsYmFja3Mub25VcGRhdGUsIHR3ZWVuRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFRXRUVOX0NPTlNULkRFTEFZOlxyXG5cclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkIC09IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZWxhcHNlZCA8PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gTWF0aC5hYnModHdlZW5EYXRhLmVsYXBzZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5QRU5ESU5HX1JFTkRFUjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgVFdFRU5fQ09OU1QuUkVQRUFUX0RFTEFZOlxyXG5cclxuICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkIC09IGRlbHRhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0d2VlbkRhdGEuZWxhcHNlZCA8PSAwKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5lbGFwc2VkID0gTWF0aC5hYnModHdlZW5EYXRhLmVsYXBzZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhdGUgPSBUV0VFTl9DT05TVC5QTEFZSU5HX0ZPUldBUkQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hUd2VlbkRhdGFFdmVudChFdmVudHMuVFdFRU5fUkVQRUFULCB0d2Vlbi5jYWxsYmFja3Mub25SZXBlYXQsIHR3ZWVuRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFRXRUVOX0NPTlNULkhPTERfREVMQVk6XHJcblxyXG4gICAgICAgICAgICAgICAgdHdlZW5EYXRhLmVsYXBzZWQgLT0gZGVsdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR3ZWVuRGF0YS5lbGFwc2VkIDw9IDApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLnN0YXRlID0gdGhpcy5zZXRTdGF0ZUZyb21FbmQodHdlZW4sIHR3ZWVuRGF0YSwgTWF0aC5hYnModHdlZW5EYXRhLmVsYXBzZWQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgVFdFRU5fQ09OU1QuUEVORElOR19SRU5ERVI6XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0d2VlbkRhdGEuc3RhcnQgPSB0d2VlbkRhdGEuZ2V0U3RhcnRWYWx1ZSh0YXJnZXQsIHR3ZWVuRGF0YS5rZXksIHRhcmdldFt0d2VlbkRhdGEua2V5XSwgdHdlZW5EYXRhLmluZGV4LCB0d2Vlbi50b3RhbFRhcmdldHMsIHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLmVuZCA9IHR3ZWVuRGF0YS5nZXRFbmRWYWx1ZSh0YXJnZXQsIHR3ZWVuRGF0YS5rZXksIHR3ZWVuRGF0YS5zdGFydCwgdHdlZW5EYXRhLmluZGV4LCB0d2Vlbi50b3RhbFRhcmdldHMsIHR3ZWVuKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLmN1cnJlbnQgPSB0d2VlbkRhdGEuc3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFt0d2VlbkRhdGEua2V5XSA9IHR3ZWVuRGF0YS5zdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdHdlZW5EYXRhLnN0YXRlID0gVFdFRU5fQ09OU1QuUExBWUlOR19GT1JXQVJEO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR3ZWVuRGF0YS5zdGF0ZSA9IFRXRUVOX0NPTlNULkNPTVBMRVRFO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gIFJldHVybiBUUlVFIGlmIHRoaXMgVHdlZW5EYXRhIHN0aWxsIHBsYXlpbmcsIG90aGVyd2lzZSByZXR1cm4gRkFMU0VcclxuICAgICAgICByZXR1cm4gKHR3ZWVuRGF0YS5zdGF0ZSAhPT0gVFdFRU5fQ09OU1QuQ09NUExFVEUpO1xyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG4vLyAgb25BY3RpdmUgPSAnYWN0aXZlJyBldmVudCA9IFdoZW4gdGhlIFR3ZWVuIGlzIG1vdmVkIGZyb20gdGhlIHBlbmRpbmcgdG8gdGhlIGFjdGl2ZSBsaXN0IGluIHRoZSBtYW5hZ2VyLCBldmVuIGlmIHBsYXliYWNrIGRlbGF5ZWRcclxuLy8gIG9uU3RhcnQgPSAnc3RhcnQnIGV2ZW50ID0gV2hlbiB0aGUgVHdlZW4gc3RhcnRzIHBsYXlpbmcgZnJvbSBhIGRlbGF5ZWQgc3RhdGUgKHdpbGwgaGFwcGVuIHNhbWUgdGltZSBhcyBvbkFjdGl2ZSBpZiBubyBkZWxheSlcclxuLy8gIG9uWW95byA9ICd5b3lvJyBldmVudCA9IFdoZW4gdGhlIFR3ZWVuIHN0YXJ0cyBhIHlveW9cclxuLy8gIG9uUmVwZWF0ID0gJ3JlcGVhdCcgZXZlbnQgPSBXaGVuIGEgVHdlZW5EYXRhIHJlcGVhdHMgcGxheWJhY2sgKGlmIGFueSlcclxuLy8gIG9uQ29tcGxldGUgPSAnY29tcGxldGUnIGV2ZW50ID0gV2hlbiB0aGUgVHdlZW4gZmluaXNoZXMgYWxsIHBsYXliYWNrIChjYW4gc29tZXRpbWVzIG5ldmVyIGhhcHBlbiBpZiByZXBlYXQgLTEpLCBhbHNvIHdoZW4gJ3N0b3AnIGNhbGxlZFxyXG4vLyAgb25VcGRhdGUgPSAndXBkYXRlJyBldmVudCA9IFdoZW4gdGhlIFR3ZWVuIHVwZGF0ZXMgYSBUd2VlbkRhdGEgZHVyaW5nIHBsYXliYWNrIChleHBlbnNpdmUhKVxyXG4vLyAgb25Mb29wID0gJ2xvb3AnIGV2ZW50ID0gVXNlZCB0byBsb29wIEFMTCBUd2VlbkRhdGFzIGluIGEgVHdlZW5cclxuXHJcblR3ZWVuLlRZUEVTID0gW1xyXG4gICAgJ29uQWN0aXZlJyxcclxuICAgICdvbkNvbXBsZXRlJyxcclxuICAgICdvbkxvb3AnLFxyXG4gICAgJ29uUmVwZWF0JyxcclxuICAgICdvblN0YXJ0JyxcclxuICAgICdvblVwZGF0ZScsXHJcbiAgICAnb25Zb3lvJ1xyXG5dO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgVHdlZW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIFR3ZWVucyBoYXZlIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RGYWN0b3J5I3R3ZWVuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5CdWlsZGVyQ29uZmlnfG9iamVjdH0gY29uZmlnIC0gVGhlIFR3ZWVuIGNvbmZpZ3VyYXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBUd2VlbiB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdEZhY3RvcnkucmVnaXN0ZXIoJ3R3ZWVuJywgZnVuY3Rpb24gKGNvbmZpZylcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuc3lzLnR3ZWVucy5hZGQoY29uZmlnKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdEZhY3RvcnkgY29udGV4dC5cclxuLy9cclxuLy8gIFRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIHVzZTpcclxuLy9cclxuLy8gIHRoaXMuc2NlbmUgLSBhIHJlZmVyZW5jZSB0byB0aGUgU2NlbmUgdGhhdCBvd25zIHRoZSBHYW1lT2JqZWN0RmFjdG9yeVxyXG4vLyAgdGhpcy5kaXNwbGF5TGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBEaXNwbGF5IExpc3QgdGhlIFNjZW5lIG93bnNcclxuLy8gIHRoaXMudXBkYXRlTGlzdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSBVcGRhdGUgTGlzdCB0aGUgU2NlbmUgb3duc1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgVHdlZW4gb2JqZWN0IGFuZCByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgYXZhaWxhYmxlIGlmIFR3ZWVucyBoYXZlIGJlZW4gYnVpbHQgaW50byBQaGFzZXIuXHJcbiAqXHJcbiAqIEBtZXRob2QgUGhhc2VyLkdhbWVPYmplY3RzLkdhbWVPYmplY3RDcmVhdG9yI3R3ZWVuXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge1BoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5CdWlsZGVyQ29uZmlnfG9iamVjdH0gY29uZmlnIC0gVGhlIFR3ZWVuIGNvbmZpZ3VyYXRpb24uXHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5Ud2VlbnMuVHdlZW59IFRoZSBUd2VlbiB0aGF0IHdhcyBjcmVhdGVkLlxyXG4gKi9cclxuR2FtZU9iamVjdENyZWF0b3IucmVnaXN0ZXIoJ3R3ZWVuJywgZnVuY3Rpb24gKGNvbmZpZylcclxue1xyXG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuc3lzLnR3ZWVucy5jcmVhdGUoY29uZmlnKTtcclxufSk7XHJcblxyXG4vLyAgV2hlbiByZWdpc3RlcmluZyBhIGZhY3RvcnkgZnVuY3Rpb24gJ3RoaXMnIHJlZmVycyB0byB0aGUgR2FtZU9iamVjdENyZWF0b3IgY29udGV4dC5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHdlZW47XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBUd2VlbkRhdGFDb25maWcgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSB0d2VlbiBkYXRhIGZvciBhIHVuaXF1ZSBwcm9wZXJ0eSBvZiBhIHVuaXF1ZSB0YXJnZXQuXHJcbiAqIEEgc2luZ2xlIFR3ZWVuIGNvbnNpc3RzIG9mIG11bHRpcGxlIFR3ZWVuRGF0YXMsIGRlcGVuZGluZyBvbiBob3cgbWFueSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBjaGFuZ2VkIGJ5IHRoZSBUd2Vlbi5cclxuICpcclxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBUd2VlbkJ1aWxkZXIgYW5kIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHksIGluc3RlYWQsXHJcbiAqIFR3ZWVucyBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyB0aGUgR2FtZU9iamVjdEZhY3Rvcnkgb3IgR2FtZU9iamVjdENyZWF0b3IuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVHdlZW5zLlR3ZWVuRGF0YVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHthbnl9IHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gdHdlZW4uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgdGFyZ2V0IGluZGV4IHdpdGhpbiB0aGUgVHdlZW4gdGFyZ2V0cyBhcnJheS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgdGFyZ2V0IHRvIHR3ZWVuLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRFbmQgLSBXaGF0IHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGF0IHRoZSBFTkQgb2YgdGhlIFR3ZWVuLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRTdGFydCAtIFdoYXQgdGhlIHByb3BlcnR5IHdpbGwgYmUgYXQgdGhlIFNUQVJUIG9mIHRoZSBUd2Vlbi5cclxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGdldEFjdGl2ZSAtIElmIG5vdCBudWxsLCBpcyBpbnZva2VkIF9pbW1lZGlhdGVseV8gYXMgc29vbiBhcyB0aGUgVHdlZW5EYXRhIGlzIHJ1bm5pbmcsIGFuZCBpcyBzZXQgb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gZWFzZSAtIFRoZSBlYXNlIGZ1bmN0aW9uIHRoaXMgdHdlZW4gdXNlcy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5IC0gVGltZSBpbiBtcy9mcmFtZXMgYmVmb3JlIHR3ZWVuIHdpbGwgc3RhcnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIER1cmF0aW9uIG9mIHRoZSB0d2VlbiBpbiBtcy9mcmFtZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0geW95byAtIERldGVybWluZXMgd2hldGhlciB0aGUgdHdlZW4gc2hvdWxkIHJldHVybiBiYWNrIHRvIGl0cyBzdGFydCB2YWx1ZSBhZnRlciBob2xkIGhhcyBleHBpcmVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaG9sZCAtIFRpbWUgaW4gbXMvZnJhbWVzIHRoZSB0d2VlbiB3aWxsIHBhdXNlIGJlZm9yZSByZXBlYXRpbmcgb3IgcmV0dXJuaW5nIHRvIGl0cyBzdGFydGluZyB2YWx1ZSBpZiB5b3lvIGlzIHNldCB0byB0cnVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmVwZWF0IC0gTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgdHdlZW4uIFRoZSB0d2VlbiB3aWxsIGFsd2F5cyBydW4gb25jZSByZWdhcmRsZXNzLCBzbyBhIHJlcGVhdCB2YWx1ZSBvZiAnMScgd2lsbCBwbGF5IHRoZSB0d2VlbiB0d2ljZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IHJlcGVhdERlbGF5IC0gVGltZSBpbiBtcy9mcmFtZXMgYmVmb3JlIHRoZSByZXBlYXQgd2lsbCBzdGFydC5cclxuICogQHBhcmFtIHtib29sZWFufSBmbGlwWCAtIFNob3VsZCB0b2dnbGVGbGlwWCBiZSBjYWxsZWQgd2hlbiB5b3lvIG9yIHJlcGVhdCBoYXBwZW5zP1xyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZsaXBZIC0gU2hvdWxkIHRvZ2dsZUZsaXBZIGJlIGNhbGxlZCB3aGVuIHlveW8gb3IgcmVwZWF0IGhhcHBlbnM/XHJcbiAqXHJcbiAqIEByZXR1cm4ge1BoYXNlci5UeXBlcy5Ud2VlbnMuVHdlZW5EYXRhQ29uZmlnfSBUaGUgY29uZmlnIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgVHdlZW5EYXRhLlxyXG4gKi9cclxudmFyIFR3ZWVuRGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQsIGluZGV4LCBrZXksIGdldEVuZCwgZ2V0U3RhcnQsIGdldEFjdGl2ZSwgZWFzZSwgZGVsYXksIGR1cmF0aW9uLCB5b3lvLCBob2xkLCByZXBlYXQsIHJlcGVhdERlbGF5LCBmbGlwWCwgZmxpcFkpXHJcbntcclxuICAgIHJldHVybiB7XHJcblxyXG4gICAgICAgIC8vICBUaGUgdGFyZ2V0IHRvIHR3ZWVuXHJcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXHJcblxyXG4gICAgICAgIC8vICBUaGUgaW5kZXggb2YgdGhlIHRhcmdldCB3aXRoaW4gdGhlIHR3ZWVuIHRhcmdldHMgYXJyYXlcclxuICAgICAgICBpbmRleDogaW5kZXgsXHJcblxyXG4gICAgICAgIC8vICBUaGUgcHJvcGVydHkgb2YgdGhlIHRhcmdldCB0byB0d2VlblxyXG4gICAgICAgIGtleToga2V5LFxyXG5cclxuICAgICAgICAvLyAgV2hhdCB0byBzZXQgdGhlIHByb3BlcnR5IHRvIHRoZSBtb21lbnQgdGhlIFR3ZWVuRGF0YSBpcyBpbnZva2VkLlxyXG4gICAgICAgIGdldEFjdGl2ZVZhbHVlOiBnZXRBY3RpdmUsXHJcblxyXG4gICAgICAgIC8vICBUaGUgcmV0dXJuZWQgdmFsdWUgc2V0cyB3aGF0IHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGF0IHRoZSBFTkQgb2YgdGhlIFR3ZWVuLlxyXG4gICAgICAgIGdldEVuZFZhbHVlOiBnZXRFbmQsXHJcblxyXG4gICAgICAgIC8vICBUaGUgcmV0dXJuZWQgdmFsdWUgc2V0cyB3aGF0IHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGF0IHRoZSBTVEFSVCBvZiB0aGUgVHdlZW4uXHJcbiAgICAgICAgZ2V0U3RhcnRWYWx1ZTogZ2V0U3RhcnQsXHJcblxyXG4gICAgICAgIC8vICBUaGUgZWFzZSBmdW5jdGlvbiB0aGlzIHR3ZWVuIHVzZXMuXHJcbiAgICAgICAgZWFzZTogZWFzZSxcclxuXHJcbiAgICAgICAgLy8gIER1cmF0aW9uIG9mIHRoZSB0d2VlbiBpbiBtcy9mcmFtZXMsIGV4Y2x1ZGVzIHRpbWUgZm9yIHlveW8gb3IgcmVwZWF0cy5cclxuICAgICAgICBkdXJhdGlvbjogMCxcclxuXHJcbiAgICAgICAgLy8gIFRoZSB0b3RhbCBjYWxjdWxhdGVkIGR1cmF0aW9uIG9mIHRoaXMgVHdlZW5EYXRhIChiYXNlZCBvbiBkdXJhdGlvbiwgcmVwZWF0LCBkZWxheSBhbmQgeW95bylcclxuICAgICAgICB0b3RhbER1cmF0aW9uOiAwLFxyXG5cclxuICAgICAgICAvLyAgVGltZSBpbiBtcy9mcmFtZXMgYmVmb3JlIHR3ZWVuIHdpbGwgc3RhcnQuXHJcbiAgICAgICAgZGVsYXk6IDAsXHJcblxyXG4gICAgICAgIC8vICBDYXVzZSB0aGUgdHdlZW4gdG8gcmV0dXJuIGJhY2sgdG8gaXRzIHN0YXJ0IHZhbHVlIGFmdGVyIGhvbGQgaGFzIGV4cGlyZWQuXHJcbiAgICAgICAgeW95bzogeW95byxcclxuXHJcbiAgICAgICAgLy8gIFRpbWUgaW4gbXMvZnJhbWVzIHRoZSB0d2VlbiB3aWxsIHBhdXNlIGJlZm9yZSBydW5uaW5nIHRoZSB5b3lvIG9yIHN0YXJ0aW5nIGEgcmVwZWF0LlxyXG4gICAgICAgIGhvbGQ6IDAsXHJcblxyXG4gICAgICAgIC8vICBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSB0d2Vlbi4gVGhlIHR3ZWVuIHdpbGwgYWx3YXlzIHJ1biBvbmNlIHJlZ2FyZGxlc3MsIHNvIGEgcmVwZWF0IHZhbHVlIG9mICcxJyB3aWxsIHBsYXkgdGhlIHR3ZWVuIHR3aWNlLlxyXG4gICAgICAgIHJlcGVhdDogMCxcclxuXHJcbiAgICAgICAgLy8gIFRpbWUgaW4gbXMvZnJhbWVzIGJlZm9yZSB0aGUgcmVwZWF0IHdpbGwgc3RhcnQuXHJcbiAgICAgICAgcmVwZWF0RGVsYXk6IDAsXHJcblxyXG4gICAgICAgIC8vICBBdXRvbWF0aWNhbGx5IGNhbGwgdG9nZ2xlRmxpcFggd2hlbiB0aGUgVHdlZW5EYXRhIHlveW9zIG9yIHJlcGVhdHNcclxuICAgICAgICBmbGlwWDogZmxpcFgsXHJcblxyXG4gICAgICAgIC8vICBBdXRvbWF0aWNhbGx5IGNhbGwgdG9nZ2xlRmxpcFkgd2hlbiB0aGUgVHdlZW5EYXRhIHlveW9zIG9yIHJlcGVhdHNcclxuICAgICAgICBmbGlwWTogZmxpcFksXHJcblxyXG4gICAgICAgIC8vICBCZXR3ZWVuIDAgYW5kIDEgc2hvd2luZyBjb21wbGV0aW9uIG9mIHRoaXMgVHdlZW5EYXRhLlxyXG4gICAgICAgIHByb2dyZXNzOiAwLFxyXG5cclxuICAgICAgICAvLyAgRGVsdGEgY291bnRlci5cclxuICAgICAgICBlbGFwc2VkOiAwLFxyXG5cclxuICAgICAgICAvLyAgSG93IG1hbnkgcmVwZWF0cyBhcmUgbGVmdCB0byBydW4/XHJcbiAgICAgICAgcmVwZWF0Q291bnRlcjogMCxcclxuXHJcbiAgICAgICAgLy8gIEVhc2UgVmFsdWUgRGF0YTpcclxuXHJcbiAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgcHJldmlvdXM6IDAsXHJcbiAgICAgICAgY3VycmVudDogMCxcclxuICAgICAgICBlbmQ6IDAsXHJcblxyXG4gICAgICAgIC8vICBUaW1lIER1cmF0aW9uc1xyXG4gICAgICAgIHQxOiAwLFxyXG4gICAgICAgIHQyOiAwLFxyXG5cclxuICAgICAgICAvLyAgTG9hZFZhbHVlIGdlbmVyYXRpb24gZnVuY3Rpb25zXHJcbiAgICAgICAgZ2VuOiB7XHJcbiAgICAgICAgICAgIGRlbGF5OiBkZWxheSxcclxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxyXG4gICAgICAgICAgICBob2xkOiBob2xkLFxyXG4gICAgICAgICAgICByZXBlYXQ6IHJlcGVhdCxcclxuICAgICAgICAgICAgcmVwZWF0RGVsYXk6IHJlcGVhdERlbGF5XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gIFRXRUVOX0NPTlNULkNSRUFURURcclxuICAgICAgICBzdGF0ZTogMFxyXG4gICAgfTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVHdlZW5EYXRhO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBUV0VFTl9DT05TVCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR3ZWVuRGF0YSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5DUkVBVEVEXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBDUkVBVEVEOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW5EYXRhIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLklOSVRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIElOSVQ6IDEsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbkRhdGEgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuREVMQVlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIERFTEFZOiAyLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW5EYXRhIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLk9GRlNFVF9ERUxBWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgT0ZGU0VUX0RFTEFZOiAzLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW5EYXRhIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlBFTkRJTkdfUkVOREVSXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBQRU5ESU5HX1JFTkRFUjogNCxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR3ZWVuRGF0YSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5QTEFZSU5HX0ZPUldBUkRcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBMQVlJTkdfRk9SV0FSRDogNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR3ZWVuRGF0YSBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5QTEFZSU5HX0JBQ0tXQVJEXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBQTEFZSU5HX0JBQ0tXQVJEOiA2LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW5EYXRhIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLkhPTERfREVMQVlcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEhPTERfREVMQVk6IDcsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbkRhdGEgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuUkVQRUFUX0RFTEFZXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBSRVBFQVRfREVMQVk6IDgsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbkRhdGEgc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuQ09NUExFVEVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIENPTVBMRVRFOiA5LFxyXG5cclxuICAgIC8vICBUd2VlbiBzcGVjaWZpYyAoc3RhcnRzIGZyb20gMjAgdG8gY2xlYW5seSBhbGxvdyBleHRyYSBUd2VlbkRhdGEgY29uc3RzIGluIHRoZSBmdXR1cmUpXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbiBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5QRU5ESU5HX0FERFxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgUEVORElOR19BREQ6IDIwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW4gc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuUEFVU0VEXHJcbiAgICAgKiBAdHlwZSB7aW50ZWdlcn1cclxuICAgICAqIEBzaW5jZSAzLjAuMFxyXG4gICAgICovXHJcbiAgICBQQVVTRUQ6IDIxLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW4gc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuTE9PUF9ERUxBWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgTE9PUF9ERUxBWTogMjIsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbiBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5BQ1RJVkVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIEFDVElWRTogMjMsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUd2VlbiBzdGF0ZS5cclxuICAgICAqIFxyXG4gICAgICogQG5hbWUgUGhhc2VyLlR3ZWVucy5DT01QTEVURV9ERUxBWVxyXG4gICAgICogQHR5cGUge2ludGVnZXJ9XHJcbiAgICAgKiBAc2luY2UgMy4wLjBcclxuICAgICAqL1xyXG4gICAgQ09NUExFVEVfREVMQVk6IDI0LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHdlZW4gc3RhdGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBuYW1lIFBoYXNlci5Ud2VlbnMuUEVORElOR19SRU1PVkVcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFBFTkRJTkdfUkVNT1ZFOiAyNSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFR3ZWVuIHN0YXRlLlxyXG4gICAgICogXHJcbiAgICAgKiBAbmFtZSBQaGFzZXIuVHdlZW5zLlJFTU9WRURcclxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxyXG4gICAgICogQHNpbmNlIDMuMC4wXHJcbiAgICAgKi9cclxuICAgIFJFTU9WRUQ6IDI2XHJcblxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUV0VFTl9DT05TVDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgVGFrZW4gZnJvbSBrbGFzc2UgYnkgbWF0dGRlc2wgaHR0cHM6Ly9naXRodWIuY29tL21hdHRkZXNsL2tsYXNzZVxyXG5cclxuZnVuY3Rpb24gaGFzR2V0dGVyT3JTZXR0ZXIgKGRlZilcclxue1xyXG4gICAgcmV0dXJuICghIWRlZi5nZXQgJiYgdHlwZW9mIGRlZi5nZXQgPT09ICdmdW5jdGlvbicpIHx8ICghIWRlZi5zZXQgJiYgdHlwZW9mIGRlZi5zZXQgPT09ICdmdW5jdGlvbicpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eSAoZGVmaW5pdGlvbiwgaywgaXNDbGFzc0Rlc2NyaXB0b3IpXHJcbntcclxuICAgIC8vICBUaGlzIG1heSBiZSBhIGxpZ2h0d2VpZ2h0IG9iamVjdCwgT1IgaXQgbWlnaHQgYmUgYSBwcm9wZXJ0eSB0aGF0IHdhcyBkZWZpbmVkIHByZXZpb3VzbHkuXHJcblxyXG4gICAgLy8gIEZvciBzaW1wbGUgY2xhc3MgZGVzY3JpcHRvcnMgd2UgY2FuIGp1c3QgYXNzdW1lIGl0cyBOT1QgcHJldmlvdXNseSBkZWZpbmVkLlxyXG4gICAgdmFyIGRlZiA9IChpc0NsYXNzRGVzY3JpcHRvcikgPyBkZWZpbml0aW9uW2tdIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZpbml0aW9uLCBrKTtcclxuXHJcbiAgICBpZiAoIWlzQ2xhc3NEZXNjcmlwdG9yICYmIGRlZi52YWx1ZSAmJiB0eXBlb2YgZGVmLnZhbHVlID09PSAnb2JqZWN0JylcclxuICAgIHtcclxuICAgICAgICBkZWYgPSBkZWYudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFRoaXMgbWlnaHQgYmUgYSByZWd1bGFyIHByb3BlcnR5LCBvciBpdCBtYXkgYmUgYSBnZXR0ZXIvc2V0dGVyIHRoZSB1c2VyIGRlZmluZWQgaW4gYSBjbGFzcy5cclxuICAgIGlmIChkZWYgJiYgaGFzR2V0dGVyT3JTZXR0ZXIoZGVmKSlcclxuICAgIHtcclxuICAgICAgICBpZiAodHlwZW9mIGRlZi5lbnVtZXJhYmxlID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlZi5lbnVtZXJhYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGVmLmNvbmZpZ3VyYWJsZSA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWYuY29uZmlndXJhYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZWY7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNOb25Db25maWd1cmFibGUgKG9iaiwgaylcclxue1xyXG4gICAgdmFyIHByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgayk7XHJcblxyXG4gICAgaWYgKCFwcm9wKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJvcC52YWx1ZSAmJiB0eXBlb2YgcHJvcC52YWx1ZSA9PT0gJ29iamVjdCcpXHJcbiAgICB7XHJcbiAgICAgICAgcHJvcCA9IHByb3AudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByb3AuY29uZmlndXJhYmxlID09PSBmYWxzZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRzIHRoZSBnaXZlbiBgbXlDbGFzc2Agb2JqZWN0J3MgcHJvdG90eXBlIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgYGRlZmluaXRpb25gLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gZXh0ZW5kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdG9yIFRoZSBjb25zdHJ1Y3RvciBvYmplY3QgdG8gbWl4IGludG8uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIEEgZGljdGlvbmFyeSBvZiBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcy5cclxuICogQHBhcmFtIHtib29sZWFufSBpc0NsYXNzRGVzY3JpcHRvciBJcyB0aGUgZGVmaW5pdGlvbiBhIGNsYXNzIGRlc2NyaXB0b3I/XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZXh0ZW5kXSBUaGUgcGFyZW50IGNvbnN0cnVjdG9yIG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGV4dGVuZCAoY3RvciwgZGVmaW5pdGlvbiwgaXNDbGFzc0Rlc2NyaXB0b3IsIGV4dGVuZClcclxue1xyXG4gICAgZm9yICh2YXIgayBpbiBkZWZpbml0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmICghZGVmaW5pdGlvbi5oYXNPd25Qcm9wZXJ0eShrKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRlZiA9IGdldFByb3BlcnR5KGRlZmluaXRpb24sIGssIGlzQ2xhc3NEZXNjcmlwdG9yKTtcclxuXHJcbiAgICAgICAgaWYgKGRlZiAhPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgSWYgRXh0ZW5kcyBpcyB1c2VkLCB3ZSB3aWxsIGNoZWNrIGl0cyBwcm90b3R5cGUgdG8gc2VlIGlmIHRoZSBmaW5hbCB2YXJpYWJsZSBleGlzdHMuXHJcblxyXG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gZXh0ZW5kIHx8IGN0b3I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFzTm9uQ29uZmlndXJhYmxlKHBhcmVudC5wcm90b3R5cGUsIGspKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgSnVzdCBza2lwIHRoZSBmaW5hbCBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgaWYgKENsYXNzLmlnbm9yZUZpbmFscylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyAgV2UgY2Fubm90IHJlLWRlZmluZSBhIHByb3BlcnR5IHRoYXQgaXMgY29uZmlndXJhYmxlPWZhbHNlLlxyXG4gICAgICAgICAgICAgICAgLy8gIFNvIHdlIHdpbGwgY29uc2lkZXIgdGhlbSBmaW5hbCBhbmQgdGhyb3cgYW4gZXJyb3IuIFRoaXMgaXMgYnlcclxuICAgICAgICAgICAgICAgIC8vICBkZWZhdWx0IHNvIGl0IGlzIGNsZWFyIHRvIHRoZSBkZXZlbG9wZXIgd2hhdCBpcyBoYXBwZW5pbmcuXHJcbiAgICAgICAgICAgICAgICAvLyAgWW91IGNhbiBzZXQgaWdub3JlRmluYWxzIHRvIHRydWUgaWYgeW91IG5lZWQgdG8gZXh0ZW5kIGEgY2xhc3NcclxuICAgICAgICAgICAgICAgIC8vICB3aGljaCBoYXMgY29uZmlndXJhYmxlPWZhbHNlOyBpdCB3aWxsIHNpbXBseSBub3QgcmUtZGVmaW5lIGZpbmFsIHByb3BlcnRpZXMuXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBvdmVycmlkZSBmaW5hbCBwcm9wZXJ0eSBcXCcnICsgayArICdcXCcsIHNldCBDbGFzcy5pZ25vcmVGaW5hbHMgPSB0cnVlIHRvIHNraXAnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrLCBkZWYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjdG9yLnByb3RvdHlwZVtrXSA9IGRlZmluaXRpb25ba107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyB0aGUgZ2l2ZW4gYG1peGluc2AgdG8gdGhlIHByb3RvdHlwZSBvZiBgbXlDbGFzc2AuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBtaXhpblxyXG4gKiBAcGFyYW0ge09iamVjdH0gbXlDbGFzcyBUaGUgY29uc3RydWN0b3Igb2JqZWN0IHRvIG1peCBpbnRvLlxyXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheTxPYmplY3Q+fSBtaXhpbnMgVGhlIG1peGlucyB0byBhcHBseSB0byB0aGUgY29uc3RydWN0b3IuXHJcbiAqL1xyXG5mdW5jdGlvbiBtaXhpbiAobXlDbGFzcywgbWl4aW5zKVxyXG57XHJcbiAgICBpZiAoIW1peGlucylcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1peGlucykpXHJcbiAgICB7XHJcbiAgICAgICAgbWl4aW5zID0gWyBtaXhpbnMgXTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1peGlucy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBleHRlbmQobXlDbGFzcywgbWl4aW5zW2ldLnByb3RvdHlwZSB8fCBtaXhpbnNbaV0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBjbGFzcyB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdG9yLlxyXG4gKiBUaGUgY29uc3RydWN0b3IsIGRlZmluZWQgYnkgdGhlIG5hbWUgYGluaXRpYWxpemVgLFxyXG4gKiBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbi4gSWYgdW5zcGVjaWZpZWQsIGFuIGFub255bW91c1xyXG4gKiBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgd2hpY2ggY2FsbHMgdGhlIHBhcmVudCBjbGFzcyAoaWZcclxuICogb25lIGV4aXN0cykuXHJcbiAqXHJcbiAqIFlvdSBjYW4gYWxzbyB1c2UgYEV4dGVuZHNgIGFuZCBgTWl4aW5zYCB0byBwcm92aWRlIHN1YmNsYXNzaW5nXHJcbiAqIGFuZCBpbmhlcml0YW5jZS5cclxuICpcclxuICogQGNsYXNzIFBoYXNlci5DbGFzc1xyXG4gKiBAY29uc3RydWN0b3JcclxuICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24gYSBkaWN0aW9uYXJ5IG9mIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqICAgICAgdmFyIE15Q2xhc3MgPSBuZXcgUGhhc2VyLkNsYXNzKHtcclxuICpcclxuICogICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XHJcbiAqICAgICAgICAgICAgICB0aGlzLmZvbyA9IDIuMDtcclxuICogICAgICAgICAgfSxcclxuICpcclxuICogICAgICAgICAgYmFyOiBmdW5jdGlvbigpIHtcclxuICogICAgICAgICAgICAgIHJldHVybiB0aGlzLmZvbyArIDU7XHJcbiAqICAgICAgICAgIH1cclxuICogICAgICB9KTtcclxuICovXHJcbmZ1bmN0aW9uIENsYXNzIChkZWZpbml0aW9uKVxyXG57XHJcbiAgICBpZiAoIWRlZmluaXRpb24pXHJcbiAgICB7XHJcbiAgICAgICAgZGVmaW5pdGlvbiA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBUaGUgdmFyaWFibGUgbmFtZSBoZXJlIGRpY3RhdGVzIHdoYXQgd2Ugc2VlIGluIENocm9tZSBkZWJ1Z2dlclxyXG4gICAgdmFyIGluaXRpYWxpemU7XHJcbiAgICB2YXIgRXh0ZW5kcztcclxuXHJcbiAgICBpZiAoZGVmaW5pdGlvbi5pbml0aWFsaXplKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGVmaW5pdGlvbi5pbml0aWFsaXplICE9PSAnZnVuY3Rpb24nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbml0aWFsaXplIG11c3QgYmUgYSBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5pdGlhbGl6ZSA9IGRlZmluaXRpb24uaW5pdGlhbGl6ZTtcclxuXHJcbiAgICAgICAgLy8gIFVzdWFsbHkgd2Ugc2hvdWxkIGF2b2lkICdkZWxldGUnIGluIFY4IGF0IGFsbCBjb3N0cy5cclxuICAgICAgICAvLyAgSG93ZXZlciwgaXRzIHVubGlrZWx5IHRvIG1ha2UgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VcclxuICAgICAgICAvLyAgaGVyZSBzaW5jZSB3ZSBvbmx5IGNhbGwgdGhpcyBvbiBjbGFzcyBjcmVhdGlvbiAoaS5lLiBub3Qgb2JqZWN0IGNyZWF0aW9uKS5cclxuICAgICAgICBkZWxldGUgZGVmaW5pdGlvbi5pbml0aWFsaXplO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZGVmaW5pdGlvbi5FeHRlbmRzKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBiYXNlID0gZGVmaW5pdGlvbi5FeHRlbmRzO1xyXG5cclxuICAgICAgICBpbml0aWFsaXplID0gZnVuY3Rpb24gKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGVmaW5pdGlvbi5FeHRlbmRzKVxyXG4gICAge1xyXG4gICAgICAgIGluaXRpYWxpemUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShkZWZpbml0aW9uLkV4dGVuZHMucHJvdG90eXBlKTtcclxuICAgICAgICBpbml0aWFsaXplLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGluaXRpYWxpemU7XHJcblxyXG4gICAgICAgIC8vICBGb3IgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIHRvIHdvcmssIHdlIG5lZWQgdG8gYWN0IGRpcmVjdGx5IG9uIHRoZSBFeHRlbmRzIChvciBNaXhpbilcclxuXHJcbiAgICAgICAgRXh0ZW5kcyA9IGRlZmluaXRpb24uRXh0ZW5kcztcclxuXHJcbiAgICAgICAgZGVsZXRlIGRlZmluaXRpb24uRXh0ZW5kcztcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgICBpbml0aWFsaXplLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGluaXRpYWxpemU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEdyYWIgdGhlIG1peGlucywgaWYgdGhleSBhcmUgc3BlY2lmaWVkLi4uXHJcbiAgICB2YXIgbWl4aW5zID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZGVmaW5pdGlvbi5NaXhpbnMpXHJcbiAgICB7XHJcbiAgICAgICAgbWl4aW5zID0gZGVmaW5pdGlvbi5NaXhpbnM7XHJcbiAgICAgICAgZGVsZXRlIGRlZmluaXRpb24uTWl4aW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBGaXJzdCwgbWl4aW4gaWYgd2UgY2FuLlxyXG4gICAgbWl4aW4oaW5pdGlhbGl6ZSwgbWl4aW5zKTtcclxuXHJcbiAgICAvLyAgTm93IHdlIGdyYWIgdGhlIGFjdHVhbCBkZWZpbml0aW9uIHdoaWNoIGRlZmluZXMgdGhlIG92ZXJyaWRlcy5cclxuICAgIGV4dGVuZChpbml0aWFsaXplLCBkZWZpbml0aW9uLCB0cnVlLCBFeHRlbmRzKTtcclxuXHJcbiAgICByZXR1cm4gaW5pdGlhbGl6ZTtcclxufVxyXG5cclxuQ2xhc3MuZXh0ZW5kID0gZXh0ZW5kO1xyXG5DbGFzcy5taXhpbiA9IG1peGluO1xyXG5DbGFzcy5pZ25vcmVGaW5hbHMgPSBmYWxzZTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2xhc3M7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgTk9PUCAoTm8gT3BlcmF0aW9uKSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICpcclxuICogVXNlZCBpbnRlcm5hbGx5IGJ5IFBoYXNlciB3aGVuIGl0J3MgbW9yZSBleHBlbnNpdmUgdG8gZGV0ZXJtaW5lIGlmIGEgY2FsbGJhY2sgZXhpc3RzXHJcbiAqIHRoYW4gaXQgaXMgdG8ganVzdCBpbnZva2UgYW4gZW1wdHkgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuTk9PUFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICovXHJcbnZhciBOT09QID0gZnVuY3Rpb24gKClcclxue1xyXG4gICAgLy8gIE5PT1BcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTk9PUDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQWRkcyB0aGUgZ2l2ZW4gaXRlbSwgb3IgYXJyYXkgb2YgaXRlbXMsIHRvIHRoZSBhcnJheS5cclxuICpcclxuICogRWFjaCBpdGVtIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZSBhbmQgcmV0dXJuZWQuXHJcbiAqXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgbGltaXQgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgYXJyYXkuIElmIHRoZSBxdWFudGl0eSBvZiBpdGVtcyBiZWluZ1xyXG4gKiBhZGRlZCB3aWxsIHRha2UgdGhlIGFycmF5IGxlbmd0aCBvdmVyIHRoaXMgbGltaXQsIGl0IHdpbGwgc3RvcCBhZGRpbmcgb25jZSB0aGUgbGltaXQgaXMgcmVhY2hlZC5cclxuICpcclxuICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBlYWNoIGl0ZW0gc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBhcnJheS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5BZGRcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGJlIGFkZGVkIHRvLlxyXG4gKiBAcGFyYW0ge2FueXxhbnlbXX0gaXRlbSAtIFRoZSBpdGVtLCBvciBhcnJheSBvZiBpdGVtcywgdG8gYWRkIHRvIHRoZSBhcnJheS4gRWFjaCBpdGVtIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2xpbWl0XSAtIE9wdGlvbmFsIGxpbWl0IHdoaWNoIGNhcHMgdGhlIHNpemUgb2YgdGhlIGFycmF5LlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBlYWNoIGl0ZW0gc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gVGhlIGlucHV0IGFycmF5LlxyXG4gKi9cclxudmFyIEFkZCA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSwgbGltaXQsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG57XHJcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNvbnRleHQgPSBhcnJheTsgfVxyXG5cclxuICAgIGlmIChsaW1pdCA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IGxpbWl0IC0gYXJyYXkubGVuZ3RoO1xyXG5cclxuICAgICAgICAvLyAgVGhlcmUncyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvIGhlcmUsIHRoZSBhcnJheSBpcyBmdWxsXHJcbiAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICBGYXN0IHBhdGggdG8gYXZvaWQgYXJyYXkgbXV0YXRpb24gYW5kIGl0ZXJhdGlvblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW0pKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhcnJheS5pbmRleE9mKGl0ZW0pID09PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2goaXRlbSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgaGF2ZSBhbiBhcnJheSBvZiBpdGVtcyB0byBpbnNlcnRcclxuXHJcbiAgICAvLyAgRW5zdXJlIGFsbCB0aGUgaXRlbXMgYXJlIHVuaXF1ZVxyXG4gICAgdmFyIGl0ZW1MZW5ndGggPSBpdGVtLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgd2hpbGUgKGl0ZW1MZW5ndGggPj0gMClcclxuICAgIHtcclxuICAgICAgICBpZiAoYXJyYXkuaW5kZXhPZihpdGVtW2l0ZW1MZW5ndGhdKSAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyAgQWxyZWFkeSBleGlzdHMgaW4gYXJyYXksIHNvIHJlbW92ZSBpdFxyXG4gICAgICAgICAgICBpdGVtLnNwbGljZShpdGVtTGVuZ3RoLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1MZW5ndGgtLTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgQW55dGhpbmcgbGVmdD9cclxuICAgIGl0ZW1MZW5ndGggPSBpdGVtLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoaXRlbUxlbmd0aCA9PT0gMClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGltaXQgPiAwICYmIGl0ZW1MZW5ndGggPiByZW1haW5pbmcpXHJcbiAgICB7XHJcbiAgICAgICAgaXRlbS5zcGxpY2UocmVtYWluaW5nKTtcclxuXHJcbiAgICAgICAgaXRlbUxlbmd0aCA9IHJlbWFpbmluZztcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1MZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICB2YXIgZW50cnkgPSBpdGVtW2ldO1xyXG5cclxuICAgICAgICBhcnJheS5wdXNoKGVudHJ5KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlbnRyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBZGQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgdGhlIGdpdmVuIGl0ZW0sIG9yIGFycmF5IG9mIGl0ZW1zLCB0byB0aGUgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZC5cclxuICogXHJcbiAqIEVhY2ggaXRlbSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGFycmF5LlxyXG4gKiBcclxuICogRXhpc3RpbmcgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFyZSBzaGlmdGVkIHVwLlxyXG4gKiBcclxuICogVGhlIGFycmF5IGlzIG1vZGlmaWVkIGluLXBsYWNlIGFuZCByZXR1cm5lZC5cclxuICogXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgbGltaXQgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgYXJyYXkuIElmIHRoZSBxdWFudGl0eSBvZiBpdGVtcyBiZWluZ1xyXG4gKiBhZGRlZCB3aWxsIHRha2UgdGhlIGFycmF5IGxlbmd0aCBvdmVyIHRoaXMgbGltaXQsIGl0IHdpbGwgc3RvcCBhZGRpbmcgb25jZSB0aGUgbGltaXQgaXMgcmVhY2hlZC5cclxuICogXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBpdGVtIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuQWRkQXRcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGJlIGFkZGVkIHRvLlxyXG4gKiBAcGFyYW0ge2FueXxhbnlbXX0gaXRlbSAtIFRoZSBpdGVtLCBvciBhcnJheSBvZiBpdGVtcywgdG8gYWRkIHRvIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbaW5kZXg9MF0gLSBUaGUgaW5kZXggaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2xpbWl0XSAtIE9wdGlvbmFsIGxpbWl0IHdoaWNoIGNhcHMgdGhlIHNpemUgb2YgdGhlIGFycmF5LlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciBlYWNoIGl0ZW0gc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gVGhlIGlucHV0IGFycmF5LlxyXG4gKi9cclxudmFyIEFkZEF0ID0gZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBpbmRleCwgbGltaXQsIGNhbGxiYWNrLCBjb250ZXh0KVxyXG57XHJcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgeyBpbmRleCA9IDA7IH1cclxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY29udGV4dCA9IGFycmF5OyB9XHJcblxyXG4gICAgaWYgKGxpbWl0ID4gMClcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVtYWluaW5nID0gbGltaXQgLSBhcnJheS5sZW5ndGg7XHJcblxyXG4gICAgICAgIC8vICBUaGVyZSdzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8gaGVyZSwgdGhlIGFycmF5IGlzIGZ1bGxcclxuICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEZhc3QgcGF0aCB0byBhdm9pZCBhcnJheSBtdXRhdGlvbiBhbmQgaXRlcmF0aW9uXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbSkpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGFycmF5LmluZGV4T2YoaXRlbSkgPT09IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyAgSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSBoYXZlIGFuIGFycmF5IG9mIGl0ZW1zIHRvIGluc2VydFxyXG5cclxuICAgIC8vICBFbnN1cmUgYWxsIHRoZSBpdGVtcyBhcmUgdW5pcXVlXHJcbiAgICB2YXIgaXRlbUxlbmd0aCA9IGl0ZW0ubGVuZ3RoIC0gMTtcclxuXHJcbiAgICB3aGlsZSAoaXRlbUxlbmd0aCA+PSAwKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChhcnJheS5pbmRleE9mKGl0ZW1baXRlbUxlbmd0aF0pICE9PSAtMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBBbHJlYWR5IGV4aXN0cyBpbiBhcnJheSwgc28gcmVtb3ZlIGl0XHJcbiAgICAgICAgICAgIGl0ZW0ucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtTGVuZ3RoLS07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIEFueXRoaW5nIGxlZnQ/XHJcbiAgICBpdGVtTGVuZ3RoID0gaXRlbS5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGl0ZW1MZW5ndGggPT09IDApXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIFRydW5jYXRlIHRvIHRoZSBsaW1pdFxyXG4gICAgaWYgKGxpbWl0ID4gMCAmJiBpdGVtTGVuZ3RoID4gcmVtYWluaW5nKVxyXG4gICAge1xyXG4gICAgICAgIGl0ZW0uc3BsaWNlKHJlbWFpbmluZyk7XHJcblxyXG4gICAgICAgIGl0ZW1MZW5ndGggPSByZW1haW5pbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IGl0ZW1MZW5ndGggLSAxOyBpID49IDA7IGktLSlcclxuICAgIHtcclxuICAgICAgICB2YXIgZW50cnkgPSBpdGVtW2ldO1xyXG5cclxuICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDAsIGVudHJ5KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlbnRyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBZGRBdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhlIHRvcCBvZiB0aGUgYXJyYXkuXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5CcmluZ1RvVG9wXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheS5cclxuICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGVsZW1lbnQgdG8gbW92ZS5cclxuICpcclxuICogQHJldHVybiB7Kn0gVGhlIGVsZW1lbnQgdGhhdCB3YXMgbW92ZWQuXHJcbiAqL1xyXG52YXIgQnJpbmdUb1RvcCA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSlcclxue1xyXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEgJiYgY3VycmVudEluZGV4IDwgYXJyYXkubGVuZ3RoKVxyXG4gICAge1xyXG4gICAgICAgIGFycmF5LnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xyXG4gICAgICAgIGFycmF5LnB1c2goaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEJyaW5nVG9Ub3A7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNhZmVSYW5nZSA9IHJlcXVpcmUoJy4vU2FmZVJhbmdlJyk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSB3aGljaCBoYXZlIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LkNvdW50QWxsTWF0Y2hpbmdcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIHNlYXJjaC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIHRlc3Qgb24gZWFjaCBhcnJheSBlbGVtZW50LlxyXG4gKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QgdGhlIHByb3BlcnR5IGFnYWluc3QuIE11c3QgcGFzcyBhIHN0cmljdCAoYD09PWApIGNvbXBhcmlzb24gY2hlY2suXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0SW5kZXhdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2VuZEluZGV4XSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2ludGVnZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZS5cclxuICovXHJcbnZhciBDb3VudEFsbE1hdGNoaW5nID0gZnVuY3Rpb24gKGFycmF5LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG57XHJcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0SW5kZXggPSAwOyB9XHJcbiAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkgeyBlbmRJbmRleCA9IGFycmF5Lmxlbmd0aDsgfVxyXG5cclxuICAgIHZhciB0b3RhbCA9IDA7XHJcblxyXG4gICAgaWYgKFNhZmVSYW5nZShhcnJheSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGFycmF5W2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkW3Byb3BlcnR5XSA9PT0gdmFsdWUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRvdGFsO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDb3VudEFsbE1hdGNoaW5nO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBQYXNzZXMgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSB0byB0aGUgZ2l2ZW4gY2FsbGJhY2suXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuRWFjaFxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC5cclxuICogQHBhcmFtIHsuLi4qfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaywgYWZ0ZXIgdGhlIGN1cnJlbnQgYXJyYXkgaXRlbS5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IFRoZSBpbnB1dCBhcnJheS5cclxuICovXHJcbnZhciBFYWNoID0gZnVuY3Rpb24gKGFycmF5LCBjYWxsYmFjaywgY29udGV4dClcclxue1xyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgYXJncyA9IFsgbnVsbCBdO1xyXG5cclxuICAgIGZvciAoaSA9IDM7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGFyZ3NbMF0gPSBhcnJheVtpXTtcclxuXHJcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoY29udGV4dCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFYWNoO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTYWZlUmFuZ2UgPSByZXF1aXJlKCcuL1NhZmVSYW5nZScpO1xyXG5cclxuLyoqXHJcbiAqIFBhc3NlcyBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5LCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4ZXMsIHRvIHRoZSBnaXZlbiBjYWxsYmFjay5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5FYWNoSW5SYW5nZVxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBzdGFydEluZGV4IC0gVGhlIHN0YXJ0IGluZGV4IHRvIHNlYXJjaCBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGVuZEluZGV4IC0gVGhlIGVuZCBpbmRleCB0byBzZWFyY2ggdG8uXHJcbiAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2ssIGFmdGVyIHRoZSBjaGlsZC5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IFRoZSBpbnB1dCBhcnJheS5cclxuICovXHJcbnZhciBFYWNoSW5SYW5nZSA9IGZ1bmN0aW9uIChhcnJheSwgY2FsbGJhY2ssIGNvbnRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG57XHJcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0SW5kZXggPSAwOyB9XHJcbiAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkgeyBlbmRJbmRleCA9IGFycmF5Lmxlbmd0aDsgfVxyXG5cclxuICAgIGlmIChTYWZlUmFuZ2UoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgaTtcclxuICAgICAgICB2YXIgYXJncyA9IFsgbnVsbCBdO1xyXG5cclxuICAgICAgICBmb3IgKGkgPSA1OyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3NbMF0gPSBhcnJheVtpXTtcclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXJyYXk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVhY2hJblJhbmdlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTZWFyY2hlcyBhIHByZS1zb3J0ZWQgYXJyYXkgZm9yIHRoZSBjbG9zZXQgdmFsdWUgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuICpcclxuICogSWYgdGhlIGBrZXlgIGFyZ3VtZW50IGlzIGdpdmVuIGl0IHdpbGwgYXNzdW1lIHRoZSBhcnJheSBjb250YWlucyBvYmplY3RzIHRoYXQgYWxsIGhhdmUgdGhlIHJlcXVpcmVkIGBrZXlgIHByb3BlcnR5IG5hbWUsXHJcbiAqIGFuZCB3aWxsIGNoZWNrIGZvciB0aGUgY2xvc2VzdCB2YWx1ZSBvZiB0aG9zZSB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LkZpbmRDbG9zZXN0SW5Tb3J0ZWRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yIGluIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2VhcmNoLCB3aGljaCBtdXN0IGJlIHNvcnRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIC0gQW4gb3B0aW9uYWwgcHJvcGVydHkga2V5LiBJZiBzcGVjaWZpZWQgdGhlIGFycmF5IGVsZW1lbnRzIHByb3BlcnR5IHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHZhbHVlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsobnVtYmVyfGFueSl9IFRoZSBuZWFyZXN0IHZhbHVlIGZvdW5kIGluIHRoZSBhcnJheSwgb3IgaWYgYSBga2V5YCB3YXMgZ2l2ZW4sIHRoZSBuZWFyZXN0IG9iamVjdCB3aXRoIHRoZSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZS5cclxuICovXHJcbnZhciBGaW5kQ2xvc2VzdEluU29ydGVkID0gZnVuY3Rpb24gKHZhbHVlLCBhcnJheSwga2V5KVxyXG57XHJcbiAgICBpZiAoIWFycmF5Lmxlbmd0aClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTmFOO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBhcnJheVswXTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaSA9IDE7XHJcbiAgICB2YXIgbG93O1xyXG4gICAgdmFyIGhpZ2g7XHJcblxyXG4gICAgaWYgKGtleSlcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPCBhcnJheVswXVtrZXldKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5WzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGFycmF5W2ldW2tleV0gPCB2YWx1ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgd2hpbGUgKGFycmF5W2ldIDwgdmFsdWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpID4gYXJyYXkubGVuZ3RoKVxyXG4gICAge1xyXG4gICAgICAgIGkgPSBhcnJheS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtleSlcclxuICAgIHtcclxuICAgICAgICBsb3cgPSBhcnJheVtpIC0gMV1ba2V5XTtcclxuICAgICAgICBoaWdoID0gYXJyYXlbaV1ba2V5XTtcclxuXHJcbiAgICAgICAgcmV0dXJuICgoaGlnaCAtIHZhbHVlKSA8PSAodmFsdWUgLSBsb3cpKSA/IGFycmF5W2ldIDogYXJyYXlbaSAtIDFdO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIGxvdyA9IGFycmF5W2kgLSAxXTtcclxuICAgICAgICBoaWdoID0gYXJyYXlbaV07XHJcblxyXG4gICAgICAgIHJldHVybiAoKGhpZ2ggLSB2YWx1ZSkgPD0gKHZhbHVlIC0gbG93KSkgPyBoaWdoIDogbG93O1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGaW5kQ2xvc2VzdEluU29ydGVkO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTYWZlUmFuZ2UgPSByZXF1aXJlKCcuL1NhZmVSYW5nZScpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYWxsIGVsZW1lbnRzIGluIHRoZSBhcnJheS5cclxuICpcclxuICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBtYXRjaGluZyBjcml0ZXJpYSB1c2luZyB0aGUgYHByb3BlcnR5YCBhbmQgYHZhbHVlYCBhcmd1bWVudHMuXHJcbiAqXHJcbiAqIEZvciBleGFtcGxlOiBgZ2V0QWxsKCd2aXNpYmxlJywgdHJ1ZSlgIHdvdWxkIHJldHVybiBvbmx5IGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGVpciB2aXNpYmxlIHByb3BlcnR5IHNldC5cclxuICpcclxuICogT3B0aW9uYWxseSB5b3UgY2FuIHNwZWNpZnkgYSBzdGFydCBhbmQgZW5kIGluZGV4LiBGb3IgZXhhbXBsZSBpZiB0aGUgYXJyYXkgaGFkIDEwMCBlbGVtZW50cyxcclxuICogYW5kIHlvdSBzZXQgYHN0YXJ0SW5kZXhgIHRvIDAgYW5kIGBlbmRJbmRleGAgdG8gNTAsIGl0IHdvdWxkIHJldHVybiBtYXRjaGVzIGZyb20gb25seVxyXG4gKiB0aGUgZmlyc3QgNTAgZWxlbWVudHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuR2V0QWxsXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBzZWFyY2guXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gVGhlIHByb3BlcnR5IHRvIHRlc3Qgb24gZWFjaCBhcnJheSBlbGVtZW50LlxyXG4gKiBAcGFyYW0geyp9IFt2YWx1ZV0gLSBUaGUgdmFsdWUgdG8gdGVzdCB0aGUgcHJvcGVydHkgYWdhaW5zdC4gTXVzdCBwYXNzIGEgc3RyaWN0IChgPT09YCkgY29tcGFyaXNvbiBjaGVjay5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnRJbmRleF0gLSBBbiBvcHRpb25hbCBzdGFydCBpbmRleCB0byBzZWFyY2ggZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbZW5kSW5kZXhdIC0gQW4gb3B0aW9uYWwgZW5kIGluZGV4IHRvIHNlYXJjaCB0by5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IEFsbCBtYXRjaGluZyBlbGVtZW50cyBmcm9tIHRoZSBhcnJheS5cclxuICovXHJcbnZhciBHZXRBbGwgPSBmdW5jdGlvbiAoYXJyYXksIHByb3BlcnR5LCB2YWx1ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpXHJcbntcclxuICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHsgc3RhcnRJbmRleCA9IDA7IH1cclxuICAgIGlmIChlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IGVuZEluZGV4ID0gYXJyYXkubGVuZ3RoOyB9XHJcblxyXG4gICAgdmFyIG91dHB1dCA9IFtdO1xyXG5cclxuICAgIGlmIChTYWZlUmFuZ2UoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBhcnJheVtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkgfHxcclxuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgfHxcclxuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNoaWxkW3Byb3BlcnR5XSA9PT0gdmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0QWxsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTYWZlUmFuZ2UgPSByZXF1aXJlKCcuL1NhZmVSYW5nZScpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIG1hdGNoaW5nIGNyaXRlcmlhIHVzaW5nIHRoZSBgcHJvcGVydHlgIGFuZCBgdmFsdWVgIGFyZ3VtZW50cy5cclxuICpcclxuICogRm9yIGV4YW1wbGU6IGBnZXRBbGwoJ3Zpc2libGUnLCB0cnVlKWAgd291bGQgcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFkIGl0cyBgdmlzaWJsZWAgcHJvcGVydHkgc2V0LlxyXG4gKlxyXG4gKiBPcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIHN0YXJ0IGFuZCBlbmQgaW5kZXguIEZvciBleGFtcGxlIGlmIHRoZSBhcnJheSBoYWQgMTAwIGVsZW1lbnRzLFxyXG4gKiBhbmQgeW91IHNldCBgc3RhcnRJbmRleGAgdG8gMCBhbmQgYGVuZEluZGV4YCB0byA1MCwgaXQgd291bGQgc2VhcmNoIG9ubHkgdGhlIGZpcnN0IDUwIGVsZW1lbnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LkdldEZpcnN0XHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBzZWFyY2guXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gVGhlIHByb3BlcnR5IHRvIHRlc3Qgb24gZWFjaCBhcnJheSBlbGVtZW50LlxyXG4gKiBAcGFyYW0geyp9IFt2YWx1ZV0gLSBUaGUgdmFsdWUgdG8gdGVzdCB0aGUgcHJvcGVydHkgYWdhaW5zdC4gTXVzdCBwYXNzIGEgc3RyaWN0IChgPT09YCkgY29tcGFyaXNvbiBjaGVjay5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnRJbmRleD0wXSAtIEFuIG9wdGlvbmFsIHN0YXJ0IGluZGV4IHRvIHNlYXJjaCBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtlbmRJbmRleD1hcnJheS5sZW5ndGhdIC0gQW4gb3B0aW9uYWwgZW5kIGluZGV4IHRvIHNlYXJjaCB1cCB0byAoYnV0IG5vdCBpbmNsdWRlZClcclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBUaGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBmcm9tIHRoZSBhcnJheSwgb3IgYG51bGxgIGlmIG5vIGVsZW1lbnQgY291bGQgYmUgZm91bmQgaW4gdGhlIHJhbmdlIGdpdmVuLlxyXG4gKi9cclxudmFyIEdldEZpcnN0ID0gZnVuY3Rpb24gKGFycmF5LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG57XHJcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0SW5kZXggPSAwOyB9XHJcbiAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkgeyBlbmRJbmRleCA9IGFycmF5Lmxlbmd0aDsgfVxyXG5cclxuICAgIGlmIChTYWZlUmFuZ2UoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBhcnJheVtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkgfHxcclxuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkgfHxcclxuICAgICAgICAgICAgICAgIChwcm9wZXJ0eSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNoaWxkW3Byb3BlcnR5XSA9PT0gdmFsdWUpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldEZpcnN0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgUmFuZG9tIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuR2V0UmFuZG9tXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBzZWxlY3QgdGhlIHJhbmRvbSBlbnRyeSBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtzdGFydEluZGV4PTBdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXguXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2xlbmd0aD1hcnJheS5sZW5ndGhdIC0gQW4gb3B0aW9uYWwgbGVuZ3RoLCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIChmcm9tIHRoZSBzdGFydEluZGV4KSB0byBjaG9vc2UgZnJvbS5cclxuICpcclxuICogQHJldHVybiB7Kn0gQSByYW5kb20gZWxlbWVudCBmcm9tIHRoZSBhcnJheSwgb3IgYG51bGxgIGlmIG5vIGVsZW1lbnQgY291bGQgYmUgZm91bmQgaW4gdGhlIHJhbmdlIGdpdmVuLlxyXG4gKi9cclxudmFyIEdldFJhbmRvbSA9IGZ1bmN0aW9uIChhcnJheSwgc3RhcnRJbmRleCwgbGVuZ3RoKVxyXG57XHJcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0SW5kZXggPSAwOyB9XHJcbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyB9XHJcblxyXG4gICAgdmFyIHJhbmRvbUluZGV4ID0gc3RhcnRJbmRleCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGxlbmd0aCk7XHJcblxyXG4gICAgcmV0dXJuIChhcnJheVtyYW5kb21JbmRleF0gPT09IHVuZGVmaW5lZCkgPyBudWxsIDogYXJyYXlbcmFuZG9tSW5kZXhdO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRSYW5kb207XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE1vdmVzIHRoZSBnaXZlbiBhcnJheSBlbGVtZW50IGRvd24gb25lIHBsYWNlIGluIHRoZSBhcnJheS5cclxuICogVGhlIGFycmF5IGlzIG1vZGlmaWVkIGluLXBsYWNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5Lk1vdmVEb3duXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBpbnB1dCBhcnJheS5cclxuICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGVsZW1lbnQgdG8gbW92ZSBkb3duIHRoZSBhcnJheS5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IFRoZSBpbnB1dCBhcnJheS5cclxuICovXHJcbnZhciBNb3ZlRG93biA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSlcclxue1xyXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IDApXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW0yID0gYXJyYXlbY3VycmVudEluZGV4IC0gMV07XHJcblxyXG4gICAgICAgIHZhciBpbmRleDIgPSBhcnJheS5pbmRleE9mKGl0ZW0yKTtcclxuXHJcbiAgICAgICAgYXJyYXlbY3VycmVudEluZGV4XSA9IGl0ZW0yO1xyXG4gICAgICAgIGFycmF5W2luZGV4Ml0gPSBpdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTW92ZURvd247XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE1vdmVzIGFuIGVsZW1lbnQgaW4gYW4gYXJyYXkgdG8gYSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBzYW1lIGFycmF5LlxyXG4gKiBUaGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4tcGxhY2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuTW92ZVRvXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheS5cclxuICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGVsZW1lbnQgdG8gbW92ZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBpbmRleCAtIFRoZSBuZXcgaW5kZXggdGhhdCB0aGUgZWxlbWVudCB3aWxsIGJlIG1vdmVkIHRvLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsqfSBUaGUgZWxlbWVudCB0aGF0IHdhcyBtb3ZlZC5cclxuICovXHJcbnZhciBNb3ZlVG8gPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGluZGV4KVxyXG57XHJcbiAgICB2YXIgY3VycmVudEluZGV4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcclxuXHJcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoKVxyXG4gICAge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU3VwcGxpZWQgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjdXJyZW50SW5kZXggIT09IGluZGV4KVxyXG4gICAge1xyXG4gICAgICAgIC8vICBSZW1vdmVcclxuICAgICAgICBhcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgLy8gIEFkZCBpbiBuZXcgbG9jYXRpb25cclxuICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDAsIGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNb3ZlVG87XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE1vdmVzIHRoZSBnaXZlbiBhcnJheSBlbGVtZW50IHVwIG9uZSBwbGFjZSBpbiB0aGUgYXJyYXkuXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5Nb3ZlVXBcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGlucHV0IGFycmF5LlxyXG4gKiBAcGFyYW0geyp9IGl0ZW0gLSBUaGUgZWxlbWVudCB0byBtb3ZlIHVwIHRoZSBhcnJheS5cclxuICpcclxuICogQHJldHVybiB7YXJyYXl9IFRoZSBpbnB1dCBhcnJheS5cclxuICovXHJcbnZhciBNb3ZlVXAgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pXHJcbntcclxuICAgIHZhciBjdXJyZW50SW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xyXG5cclxuICAgIGlmIChjdXJyZW50SW5kZXggIT09IC0xICYmIGN1cnJlbnRJbmRleCA8IGFycmF5Lmxlbmd0aCAtIDEpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gIFRoZSBlbGVtZW50IG9uZSBhYm92ZSBgaXRlbWAgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgdmFyIGl0ZW0yID0gYXJyYXlbY3VycmVudEluZGV4ICsgMV07XHJcbiAgICAgICAgdmFyIGluZGV4MiA9IGFycmF5LmluZGV4T2YoaXRlbTIpO1xyXG5cclxuICAgICAgICBhcnJheVtjdXJyZW50SW5kZXhdID0gaXRlbTI7XHJcbiAgICAgICAgYXJyYXlbaW5kZXgyXSA9IGl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNb3ZlVXA7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBhcnJheSByZXByZXNlbnRpbmcgdGhlIHJhbmdlIG9mIG51bWJlcnMgKHVzdWFsbHkgaW50ZWdlcnMpLCBiZXR3ZWVuLCBhbmQgaW5jbHVzaXZlIG9mLFxyXG4gKiB0aGUgZ2l2ZW4gYHN0YXJ0YCBhbmQgYGVuZGAgYXJndW1lbnRzLiBGb3IgZXhhbXBsZTpcclxuICpcclxuICogYHZhciBhcnJheSA9IG51bWJlckFycmF5KDIsIDQpOyAvLyBhcnJheSA9IFsyLCAzLCA0XWBcclxuICogYHZhciBhcnJheSA9IG51bWJlckFycmF5KDAsIDkpOyAvLyBhcnJheSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XWBcclxuICpcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBudW1iZXJBcnJheVN0ZXAoc3RhcnQsIGVuZCwgMSlgLlxyXG4gKlxyXG4gKiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIHByZWZpeCBhbmQgLyBvciBzdWZmaXggc3RyaW5nLiBJZiBnaXZlbiB0aGUgYXJyYXkgd2lsbCBjb250YWluXHJcbiAqIHN0cmluZ3MsIG5vdCBpbnRlZ2Vycy4gRm9yIGV4YW1wbGU6XHJcbiAqXHJcbiAqIGB2YXIgYXJyYXkgPSBudW1iZXJBcnJheSgxLCA0LCAnTGV2ZWwgJyk7IC8vIGFycmF5ID0gW1wiTGV2ZWwgMVwiLCBcIkxldmVsIDJcIiwgXCJMZXZlbCAzXCIsIFwiTGV2ZWwgNFwiXWBcclxuICogYHZhciBhcnJheSA9IG51bWJlckFycmF5KDUsIDcsICdIRC0nLCAnLnBuZycpOyAvLyBhcnJheSA9IFtcIkhELTUucG5nXCIsIFwiSEQtNi5wbmdcIiwgXCJIRC03LnBuZ1wiXWBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5OdW1iZXJBcnJheVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIGFycmF5IHN0YXJ0cyB3aXRoLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIGFycmF5IGNvbnRhaW5zLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeF0gLSBPcHRpb25hbCBwcmVmaXggdG8gcGxhY2UgYmVmb3JlIHRoZSBudW1iZXIuIElmIHByb3ZpZGVkIHRoZSBhcnJheSB3aWxsIGNvbnRhaW4gc3RyaW5ncywgbm90IGludGVnZXJzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeF0gLSBPcHRpb25hbCBzdWZmaXggdG8gcGxhY2UgYWZ0ZXIgdGhlIG51bWJlci4gSWYgcHJvdmlkZWQgdGhlIGFycmF5IHdpbGwgY29udGFpbiBzdHJpbmdzLCBub3QgaW50ZWdlcnMuXHJcbiAqXHJcbiAqIEByZXR1cm4geyhudW1iZXJbXXxzdHJpbmdbXSl9IFRoZSBhcnJheSBvZiBudW1iZXIgdmFsdWVzLCBvciBzdHJpbmdzIGlmIGEgcHJlZml4IG9yIHN1ZmZpeCB3YXMgcHJvdmlkZWQuXHJcbiAqL1xyXG52YXIgTnVtYmVyQXJyYXkgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgcHJlZml4LCBzdWZmaXgpXHJcbntcclxuICAgIHZhciByZXN1bHQgPSBbXTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHByZWZpeCB8fCBzdWZmaXgpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gKHByZWZpeCkgPyBwcmVmaXggKyBpLnRvU3RyaW5nKCkgOiBpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3VmZml4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkuY29uY2F0KHN1ZmZpeCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXJBcnJheTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgUm91bmRBd2F5RnJvbVplcm8gPSByZXF1aXJlKCcuLi8uLi9tYXRoL1JvdW5kQXdheUZyb21aZXJvJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbSBgc3RhcnRgXHJcbiAqIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIGBlbmRgIGJ5IGFkdmFuY2luZyBieSBgc3RlcGAuXHJcbiAqXHJcbiAqIElmIGBzdGFydGAgaXMgbGVzcyB0aGFuIGBlbmRgIGEgemVyby1sZW5ndGggcmFuZ2UgaXMgY3JlYXRlZCB1bmxlc3MgYSBuZWdhdGl2ZSBgc3RlcGAgaXMgc3BlY2lmaWVkLlxyXG4gKlxyXG4gKiBDZXJ0YWluIHZhbHVlcyBmb3IgYHN0YXJ0YCBhbmQgYGVuZGAgKGVnLiBOYU4vdW5kZWZpbmVkL251bGwpIGFyZSBjdXJyZW50bHkgY29lcmNlZCB0byAwO1xyXG4gKiBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5IG1ha2Ugc3VyZSB0byBwYXNzIGluIGFjdHVhbCBudW1iZXJzLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogTnVtYmVyQXJyYXlTdGVwKDQpO1xyXG4gKiAvLyA9PiBbMCwgMSwgMiwgM11cclxuICpcclxuICogTnVtYmVyQXJyYXlTdGVwKDEsIDUpO1xyXG4gKiAvLyA9PiBbMSwgMiwgMywgNF1cclxuICpcclxuICogTnVtYmVyQXJyYXlTdGVwKDAsIDIwLCA1KTtcclxuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cclxuICpcclxuICogTnVtYmVyQXJyYXlTdGVwKDAsIC00LCAtMSk7XHJcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxyXG4gKlxyXG4gKiBOdW1iZXJBcnJheVN0ZXAoMSwgNCwgMCk7XHJcbiAqIC8vID0+IFsxLCAxLCAxXVxyXG4gKlxyXG4gKiBOdW1iZXJBcnJheVN0ZXAoMCk7XHJcbiAqIC8vID0+IFtdXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuTnVtYmVyQXJyYXlTdGVwXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIC0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9bnVsbF0gLSBUaGUgZW5kIG9mIHRoZSByYW5nZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIC0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge251bWJlcltdfSBUaGUgYXJyYXkgb2YgbnVtYmVyIHZhbHVlcy5cclxuICovXHJcbnZhciBOdW1iZXJBcnJheVN0ZXAgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgc3RlcClcclxue1xyXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHsgc3RhcnQgPSAwOyB9XHJcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHsgZW5kID0gbnVsbDsgfVxyXG4gICAgaWYgKHN0ZXAgPT09IHVuZGVmaW5lZCkgeyBzdGVwID0gMTsgfVxyXG5cclxuICAgIGlmIChlbmQgPT09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgZW5kID0gc3RhcnQ7XHJcbiAgICAgICAgc3RhcnQgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXN1bHQgPSBbXTtcclxuXHJcbiAgICB2YXIgdG90YWwgPSBNYXRoLm1heChSb3VuZEF3YXlGcm9tWmVybygoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goc3RhcnQpO1xyXG4gICAgICAgIHN0YXJ0ICs9IHN0ZXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyQXJyYXlTdGVwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBzd2FwIChhcnIsIGksIGopXHJcbntcclxuICAgIHZhciB0bXAgPSBhcnJbaV07XHJcbiAgICBhcnJbaV0gPSBhcnJbal07XHJcbiAgICBhcnJbal0gPSB0bXA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaWdub3JlXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZSAoYSwgYilcclxue1xyXG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xyXG59XHJcblxyXG4vKipcclxuICogQSBbRmxveWQtUml2ZXN0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GbG95ZCVFMiU4MCU5M1JpdmVzdF9hbGdvcml0aG0pIHF1aWNrIHNlbGVjdGlvbiBhbGdvcml0aG0uXHJcbiAqXHJcbiAqIFJlYXJyYW5nZXMgdGhlIGFycmF5IGl0ZW1zIHNvIHRoYXQgYWxsIGl0ZW1zIGluIHRoZSBbbGVmdCwga10gcmFuZ2UgYXJlIHNtYWxsZXIgdGhhbiBhbGwgaXRlbXMgaW4gW2ssIHJpZ2h0XTtcclxuICogVGhlIGstdGggZWxlbWVudCB3aWxsIGhhdmUgdGhlIChrIC0gbGVmdCArIDEpdGggc21hbGxlc3QgdmFsdWUgaW4gW2xlZnQsIHJpZ2h0XS5cclxuICpcclxuICogVGhlIGFycmF5IGlzIG1vZGlmaWVkIGluLXBsYWNlLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiBjb2RlIGJ5IFtWbGFkaW1pciBBZ2Fmb25raW5dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9+bW91cm5lcilcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5RdWlja1NlbGVjdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyIC0gVGhlIGFycmF5IHRvIHNvcnQuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gayAtIFRoZSBrLXRoIGVsZW1lbnQgaW5kZXguXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2xlZnQ9MF0gLSBUaGUgaW5kZXggb2YgdGhlIGxlZnQgcGFydCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3JpZ2h0XSAtIFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgcGFydCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb21wYXJlXSAtIEFuIG9wdGlvbmFsIGNvbXBhcmlzb24gZnVuY3Rpb24uIElzIHBhc3NlZCB0d28gZWxlbWVudHMgYW5kIHNob3VsZCByZXR1cm4gMCwgMSBvciAtMS5cclxuICovXHJcbnZhciBRdWlja1NlbGVjdCA9IGZ1bmN0aW9uIChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKVxyXG57XHJcbiAgICBpZiAobGVmdCA9PT0gdW5kZWZpbmVkKSB7IGxlZnQgPSAwOyB9XHJcbiAgICBpZiAocmlnaHQgPT09IHVuZGVmaW5lZCkgeyByaWdodCA9IGFyci5sZW5ndGggLSAxOyB9XHJcbiAgICBpZiAoY29tcGFyZSA9PT0gdW5kZWZpbmVkKSB7IGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZTsgfVxyXG5cclxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcclxuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XHJcbiAgICAgICAgICAgIHZhciB6ID0gTWF0aC5sb2cobik7XHJcbiAgICAgICAgICAgIHZhciBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcclxuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xyXG4gICAgICAgICAgICB2YXIgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7XHJcbiAgICAgICAgICAgIHZhciBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xyXG5cclxuICAgICAgICAgICAgUXVpY2tTZWxlY3QoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdCA9IGFycltrXTtcclxuICAgICAgICB2YXIgaSA9IGxlZnQ7XHJcbiAgICAgICAgdmFyIGogPSByaWdodDtcclxuXHJcbiAgICAgICAgc3dhcChhcnIsIGxlZnQsIGspO1xyXG5cclxuICAgICAgICBpZiAoY29tcGFyZShhcnJbcmlnaHRdLCB0KSA+IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGkgPCBqKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xyXG5cclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBqLS07XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbaV0sIHQpIDwgMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbal0sIHQpID4gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dhcChhcnIsIGxlZnQsIGopO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBqKys7XHJcbiAgICAgICAgICAgIHN3YXAoYXJyLCBqLCByaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaiA8PSBrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGVmdCA9IGogKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGsgPD0gailcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJpZ2h0ID0gaiAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBRdWlja1NlbGVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgR2V0VmFsdWUgPSByZXF1aXJlKCcuLi9vYmplY3QvR2V0VmFsdWUnKTtcclxudmFyIFNodWZmbGUgPSByZXF1aXJlKCcuL1NodWZmbGUnKTtcclxuXHJcbnZhciBCdWlsZENodW5rID0gZnVuY3Rpb24gKGEsIGIsIHF0eSlcclxue1xyXG4gICAgdmFyIG91dCA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGFJbmRleCA9IDA7IGFJbmRleCA8IGEubGVuZ3RoOyBhSW5kZXgrKylcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBiSW5kZXggPSAwOyBiSW5kZXggPCBiLmxlbmd0aDsgYkluZGV4KyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF0eTsgaSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvdXQucHVzaCh7IGE6IGFbYUluZGV4XSwgYjogYltiSW5kZXhdIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhbiBhcnJheSBwb3B1bGF0ZWQgd2l0aCBhIHJhbmdlIG9mIHZhbHVlcywgYmFzZWQgb24gdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqXHJcbiAqIFJhbmdlIChbYSxiLGNdLCBbMSwyLDNdKSA9XHJcbiAqIGExLCBhMiwgYTMsIGIxLCBiMiwgYjMsIGMxLCBjMiwgYzNcclxuICogXHJcbiAqIFJhbmdlIChbYSxiXSwgWzEsMiwzXSwgcXR5ID0gMykgPVxyXG4gKiBhMSwgYTEsIGExLCBhMiwgYTIsIGEyLCBhMywgYTMsIGEzLCBiMSwgYjEsIGIxLCBiMiwgYjIsIGIyLCBiMywgYjMsIGIzXHJcbiAqIFxyXG4gKiBSYW5nZSAoW2EsYixjXSwgWzEsMiwzXSwgcmVwZWF0IHgxKSA9XHJcbiAqIGExLCBhMiwgYTMsIGIxLCBiMiwgYjMsIGMxLCBjMiwgYzMsIGExLCBhMiwgYTMsIGIxLCBiMiwgYjMsIGMxLCBjMiwgYzNcclxuICogXHJcbiAqIFJhbmdlIChbYSxiXSwgWzEsMl0sIHJlcGVhdCAtMSA9IGVuZGxlc3MsIG1heCA9IDE0KSA9XHJcbiAqIE1heWJlIGlmIG1heCBpcyBzZXQgdGhlbiByZXBlYXQgZ29lcyB0byAtMSBhdXRvbWF0aWNhbGx5P1xyXG4gKiBhMSwgYTIsIGIxLCBiMiwgYTEsIGEyLCBiMSwgYjIsIGExLCBhMiwgYjEsIGIyLCBhMSwgYTIgKGNhcHBlZCBhdCAxNCBlbGVtZW50cylcclxuICogXHJcbiAqIFJhbmdlIChbYV0sIFsxLDIsMyw0LDVdLCByYW5kb20gPSB0cnVlKSA9XHJcbiAqIGE0LCBhMSwgYTUsIGEyLCBhM1xyXG4gKiBcclxuICogUmFuZ2UgKFthLCBiXSwgWzEsMiwzXSwgcmFuZG9tID0gdHJ1ZSkgPVxyXG4gKiBiMywgYTIsIGExLCBiMSwgYTMsIGIyXHJcbiAqIFxyXG4gKiBSYW5nZSAoW2EsIGIsIGNdLCBbMSwyLDNdLCByYW5kb21CID0gdHJ1ZSkgPVxyXG4gKiBhMywgYTEsIGEyLCBiMiwgYjMsIGIxLCBjMSwgYzMsIGMyXHJcbiAqIFxyXG4gKiBSYW5nZSAoW2FdLCBbMSwyLDMsNCw1XSwgeW95byA9IHRydWUpID1cclxuICogYTEsIGEyLCBhMywgYTQsIGE1LCBhNSwgYTQsIGEzLCBhMiwgYTFcclxuICogXHJcbiAqIFJhbmdlIChbYSwgYl0sIFsxLDIsM10sIHlveW8gPSB0cnVlKSA9XHJcbiAqIGExLCBhMiwgYTMsIGIxLCBiMiwgYjMsIGIzLCBiMiwgYjEsIGEzLCBhMiwgYTFcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5SYW5nZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYSAtIFRoZSBmaXJzdCBhcnJheSBvZiByYW5nZSBlbGVtZW50cy5cclxuICogQHBhcmFtIHthcnJheX0gYiAtIFRoZSBzZWNvbmQgYXJyYXkgb2YgcmFuZ2UgZWxlbWVudHMuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBBIHJhbmdlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBDYW4gY29udGFpbjogcmVwZWF0LCByYW5kb20sIHJhbmRvbUIsIHlveW8sIG1heCwgcXR5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgYXJyYW5nZWQgZWxlbWVudHMuXHJcbiAqL1xyXG52YXIgUmFuZ2UgPSBmdW5jdGlvbiAoYSwgYiwgb3B0aW9ucylcclxue1xyXG4gICAgdmFyIG1heCA9IEdldFZhbHVlKG9wdGlvbnMsICdtYXgnLCAwKTtcclxuICAgIHZhciBxdHkgPSBHZXRWYWx1ZShvcHRpb25zLCAncXR5JywgMSk7XHJcbiAgICB2YXIgcmFuZG9tID0gR2V0VmFsdWUob3B0aW9ucywgJ3JhbmRvbScsIGZhbHNlKTtcclxuICAgIHZhciByYW5kb21CID0gR2V0VmFsdWUob3B0aW9ucywgJ3JhbmRvbUInLCBmYWxzZSk7XHJcbiAgICB2YXIgcmVwZWF0ID0gR2V0VmFsdWUob3B0aW9ucywgJ3JlcGVhdCcsIDApO1xyXG4gICAgdmFyIHlveW8gPSBHZXRWYWx1ZShvcHRpb25zLCAneW95bycsIGZhbHNlKTtcclxuXHJcbiAgICB2YXIgb3V0ID0gW107XHJcblxyXG4gICAgaWYgKHJhbmRvbUIpXHJcbiAgICB7XHJcbiAgICAgICAgU2h1ZmZsZShiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgRW5kbGVzcyByZXBlYXQsIHNvIGxpbWl0IGJ5IG1heFxyXG4gICAgaWYgKHJlcGVhdCA9PT0gLTEpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKG1heCA9PT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlcGVhdCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICBXb3JrIG91dCBob3cgbWFueSByZXBlYXRzIHdlIG5lZWRcclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gKGEubGVuZ3RoICogYi5sZW5ndGgpICogcXR5O1xyXG5cclxuICAgICAgICAgICAgaWYgKHlveW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsICo9IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlcGVhdCA9IE1hdGguY2VpbChtYXggLyB0b3RhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHJlcGVhdDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBjaHVuayA9IEJ1aWxkQ2h1bmsoYSwgYiwgcXR5KTtcclxuXHJcbiAgICAgICAgaWYgKHJhbmRvbSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNodWZmbGUoY2h1bmspO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChjaHVuayk7XHJcblxyXG4gICAgICAgIGlmICh5b3lvKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2h1bmsucmV2ZXJzZSgpO1xyXG5cclxuICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChjaHVuayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXgpXHJcbiAgICB7XHJcbiAgICAgICAgb3V0LnNwbGljZShtYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTcGxpY2VPbmUgPSByZXF1aXJlKCcuL1NwbGljZU9uZScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgdGhlIGdpdmVuIGl0ZW0sIG9yIGFycmF5IG9mIGl0ZW1zLCBmcm9tIHRoZSBhcnJheS5cclxuICogXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICogXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBpdGVtIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGZyb20gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlJlbW92ZVxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgbW9kaWZpZWQuXHJcbiAqIEBwYXJhbSB7KnxBcnJheS48Kj59IGl0ZW0gLSBUaGUgaXRlbSwgb3IgYXJyYXkgb2YgaXRlbXMsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgZm9yIGVhY2ggaXRlbSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsqfEFycmF5LjwqPn0gVGhlIGl0ZW0sIG9yIGFycmF5IG9mIGl0ZW1zLCB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuXHJcbiAqL1xyXG52YXIgUmVtb3ZlID0gZnVuY3Rpb24gKGFycmF5LCBpdGVtLCBjYWxsYmFjaywgY29udGV4dClcclxue1xyXG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkgeyBjb250ZXh0ID0gYXJyYXk7IH1cclxuXHJcbiAgICB2YXIgaW5kZXg7XHJcblxyXG4gICAgLy8gIEZhc3QgcGF0aCB0byBhdm9pZCBhcnJheSBtdXRhdGlvbiBhbmQgaXRlcmF0aW9uXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbSkpXHJcbiAgICB7XHJcbiAgICAgICAgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgU3BsaWNlT25lKGFycmF5LCBpbmRleCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIElmIHdlIGdvdCB0aGlzIGZhciwgd2UgaGF2ZSBhbiBhcnJheSBvZiBpdGVtcyB0byByZW1vdmVcclxuXHJcbiAgICB2YXIgaXRlbUxlbmd0aCA9IGl0ZW0ubGVuZ3RoIC0gMTtcclxuXHJcbiAgICB3aGlsZSAoaXRlbUxlbmd0aCA+PSAwKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBlbnRyeSA9IGl0ZW1baXRlbUxlbmd0aF07XHJcblxyXG4gICAgICAgIGluZGV4ID0gYXJyYXkuaW5kZXhPZihlbnRyeSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBTcGxpY2VPbmUoYXJyYXksIGluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBlbnRyeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gIEl0ZW0gd2Fzbid0IGZvdW5kIGluIHRoZSBhcnJheSwgc28gcmVtb3ZlIGl0IGZyb20gb3VyIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgIGl0ZW0ucG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtTGVuZ3RoLS07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGl0ZW07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlbW92ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgU3BsaWNlT25lID0gcmVxdWlyZSgnLi9TcGxpY2VPbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBhcnJheS5cclxuICogXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICogXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgdGhlIGl0ZW0gaWYgaXQgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuUmVtb3ZlQXRcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGJlIG1vZGlmaWVkLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGluZGV4IC0gVGhlIGFycmF5IGluZGV4IHRvIHJlbW92ZSB0aGUgaXRlbSBmcm9tLiBUaGUgaW5kZXggbXVzdCBiZSBpbiBib3VuZHMgb3IgaXQgd2lsbCB0aHJvdyBhbiBlcnJvci5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgdGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIFRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsqfSBUaGUgaXRlbSB0aGF0IHdhcyByZW1vdmVkLlxyXG4gKi9cclxudmFyIFJlbW92ZUF0ID0gZnVuY3Rpb24gKGFycmF5LCBpbmRleCwgY2FsbGJhY2ssIGNvbnRleHQpXHJcbntcclxuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHsgY29udGV4dCA9IGFycmF5OyB9XHJcblxyXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGFycmF5Lmxlbmd0aCAtIDEpXHJcbiAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmRleCBvdXQgb2YgYm91bmRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGl0ZW0gPSBTcGxpY2VPbmUoYXJyYXksIGluZGV4KTtcclxuXHJcbiAgICBpZiAoY2FsbGJhY2spXHJcbiAgICB7XHJcbiAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaXRlbTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmVtb3ZlQXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFNhZmVSYW5nZSA9IHJlcXVpcmUoJy4vU2FmZVJhbmdlJyk7XHJcblxyXG4vKipcclxuICogUmVtb3ZlcyB0aGUgaXRlbSB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlIGluIHRoZSBhcnJheS5cclxuICogXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICogXHJcbiAqIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgdGhlIGl0ZW0vcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5SZW1vdmVCZXR3ZWVuXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBiZSBtb2RpZmllZC5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBzdGFydEluZGV4IC0gVGhlIHN0YXJ0IGluZGV4IHRvIHJlbW92ZSBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IGVuZEluZGV4IC0gVGhlIGVuZCBpbmRleCB0byByZW1vdmUgdG8uXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgZm9yIHRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gLSBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC5cclxuICpcclxuICogQHJldHVybiB7QXJyYXkuPCo+fSBBbiBhcnJheSBvZiBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZC5cclxuICovXHJcbnZhciBSZW1vdmVCZXR3ZWVuID0gZnVuY3Rpb24gKGFycmF5LCBzdGFydEluZGV4LCBlbmRJbmRleCwgY2FsbGJhY2ssIGNvbnRleHQpXHJcbntcclxuICAgIGlmIChzdGFydEluZGV4ID09PSB1bmRlZmluZWQpIHsgc3RhcnRJbmRleCA9IDA7IH1cclxuICAgIGlmIChlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IGVuZEluZGV4ID0gYXJyYXkubGVuZ3RoOyB9XHJcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7IGNvbnRleHQgPSBhcnJheTsgfVxyXG5cclxuICAgIGlmIChTYWZlUmFuZ2UoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSlcclxuICAgIHtcclxuICAgICAgICB2YXIgc2l6ZSA9IGVuZEluZGV4IC0gc3RhcnRJbmRleDtcclxuXHJcbiAgICAgICAgdmFyIHJlbW92ZWQgPSBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgc2l6ZSk7XHJcblxyXG4gICAgICAgIGlmIChjYWxsYmFjaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gcmVtb3ZlZFtpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGVudHJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZW1vdmVCZXR3ZWVuO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTcGxpY2VPbmUgPSByZXF1aXJlKCcuL1NwbGljZU9uZScpO1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgYSByYW5kb20gb2JqZWN0IGZyb20gdGhlIGdpdmVuIGFycmF5IGFuZCByZXR1cm5zIGl0LlxyXG4gKiBXaWxsIHJldHVybiBudWxsIGlmIHRoZXJlIGFyZSBubyBhcnJheSBpdGVtcyB0aGF0IGZhbGwgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb3IgaWYgdGhlcmUgaXMgbm8gaXRlbSBmb3IgdGhlIHJhbmRvbWx5IGNob3NlbiBpbmRleC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5SZW1vdmVSYW5kb21FbGVtZW50XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byByZW1vdmVkIGEgcmFuZG9tIGVsZW1lbnQgZnJvbS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbc3RhcnQ9MF0gLSBUaGUgYXJyYXkgaW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtsZW5ndGg9YXJyYXkubGVuZ3RoXSAtIE9wdGlvbmFsIHJlc3RyaWN0aW9uIG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmFuZG9tbHkgc2VsZWN0IGZyb20uXHJcbiAqXHJcbiAqIEByZXR1cm4ge29iamVjdH0gVGhlIHJhbmRvbSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQsIG9yIGBudWxsYCBpZiB0aGVyZSB3ZXJlIG5vIGFycmF5IGVsZW1lbnRzIHRoYXQgZmVsbCB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLlxyXG4gKi9cclxudmFyIFJlbW92ZVJhbmRvbUVsZW1lbnQgPSBmdW5jdGlvbiAoYXJyYXksIHN0YXJ0LCBsZW5ndGgpXHJcbntcclxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0ID0gMDsgfVxyXG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgfVxyXG5cclxuICAgIHZhciByYW5kb21JbmRleCA9IHN0YXJ0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGVuZ3RoKTtcclxuXHJcbiAgICByZXR1cm4gU3BsaWNlT25lKGFycmF5LCByYW5kb21JbmRleCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlbW92ZVJhbmRvbUVsZW1lbnQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VzIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5IHdpdGggdGhlIG5ldyBlbGVtZW50LlxyXG4gKiBUaGUgbmV3IGVsZW1lbnQgY2Fubm90IGFscmVhZHkgYmUgYSBtZW1iZXIgb2YgdGhlIGFycmF5LlxyXG4gKiBUaGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4tcGxhY2UuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuUmVwbGFjZVxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2VhcmNoIHdpdGhpbi5cclxuICogQHBhcmFtIHsqfSBvbGRDaGlsZCAtIFRoZSBlbGVtZW50IGluIHRoZSBhcnJheSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQuXHJcbiAqIEBwYXJhbSB7Kn0gbmV3Q2hpbGQgLSBUaGUgZWxlbWVudCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBhcnJheSBhdCB0aGUgcG9zaXRpb24gb2YgYG9sZENoaWxkYC5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBvbGRDaGlsZCB3YXMgc3VjY2Vzc2Z1bGx5IHJlcGxhY2VkLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cclxuICovXHJcbnZhciBSZXBsYWNlID0gZnVuY3Rpb24gKGFycmF5LCBvbGRDaGlsZCwgbmV3Q2hpbGQpXHJcbntcclxuICAgIHZhciBpbmRleDEgPSBhcnJheS5pbmRleE9mKG9sZENoaWxkKTtcclxuICAgIHZhciBpbmRleDIgPSBhcnJheS5pbmRleE9mKG5ld0NoaWxkKTtcclxuXHJcbiAgICBpZiAoaW5kZXgxICE9PSAtMSAmJiBpbmRleDIgPT09IC0xKVxyXG4gICAge1xyXG4gICAgICAgIGFycmF5W2luZGV4MV0gPSBuZXdDaGlsZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZXBsYWNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBNb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFycmF5IHRvIHRoZSBlbmQsIHNoaWZ0aW5nIGFsbCBpdGVtcyBpbiB0aGUgcHJvY2Vzcy5cclxuICogVGhlIFwicm90YXRpb25cIiBoYXBwZW5zIHRvIHRoZSBsZWZ0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlJvdGF0ZUxlZnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIHNoaWZ0IHRvIHRoZSBsZWZ0LiBUaGlzIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFt0b3RhbD0xXSAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gc2hpZnQgdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHsqfSBUaGUgbW9zdCByZWNlbnRseSBzaGlmdGVkIGVsZW1lbnQuXHJcbiAqL1xyXG52YXIgUm90YXRlTGVmdCA9IGZ1bmN0aW9uIChhcnJheSwgdG90YWwpXHJcbntcclxuICAgIGlmICh0b3RhbCA9PT0gdW5kZWZpbmVkKSB7IHRvdGFsID0gMTsgfVxyXG5cclxuICAgIHZhciBlbGVtZW50ID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgZWxlbWVudCA9IGFycmF5LnNoaWZ0KCk7XHJcbiAgICAgICAgYXJyYXkucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlTGVmdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgdG8gdGhlIHN0YXJ0LCBzaGlmdGluZyBhbGwgaXRlbXMgaW4gdGhlIHByb2Nlc3MuXHJcbiAqIFRoZSBcInJvdGF0aW9uXCIgaGFwcGVucyB0byB0aGUgcmlnaHQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuUm90YXRlUmlnaHRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIHNoaWZ0IHRvIHRoZSByaWdodC4gVGhpcyBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZS5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbdG90YWw9MV0gLSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNoaWZ0IHRoZSBhcnJheS5cclxuICpcclxuICogQHJldHVybiB7Kn0gVGhlIG1vc3QgcmVjZW50bHkgc2hpZnRlZCBlbGVtZW50LlxyXG4gKi9cclxudmFyIFJvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gKGFycmF5LCB0b3RhbClcclxue1xyXG4gICAgaWYgKHRvdGFsID09PSB1bmRlZmluZWQpIHsgdG90YWwgPSAxOyB9XHJcblxyXG4gICAgdmFyIGVsZW1lbnQgPSBudWxsO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWw7IGkrKylcclxuICAgIHtcclxuICAgICAgICBlbGVtZW50ID0gYXJyYXkucG9wKCk7XHJcbiAgICAgICAgYXJyYXkudW5zaGlmdChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlUmlnaHQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoZSBzdGFydCBhbmQgZW5kIGluZGV4ZXMgYXJlIGEgc2FmZSByYW5nZSBmb3IgdGhlIGdpdmVuIGFycmF5LlxyXG4gKiBcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5TYWZlUmFuZ2VcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGNoZWNrLlxyXG4gKiBAcGFyYW0ge2ludGVnZXJ9IHN0YXJ0SW5kZXggLSBUaGUgc3RhcnQgaW5kZXguXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZW5kSW5kZXggLSBUaGUgZW5kIGluZGV4LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aHJvd0Vycm9yPXRydWVdIC0gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJhbmdlIGlzIG91dCBvZiBib3VuZHMuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHJhbmdlIGlzIHNhZmUsIG90aGVyd2lzZSBmYWxzZS5cclxuICovXHJcbnZhciBTYWZlUmFuZ2UgPSBmdW5jdGlvbiAoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aHJvd0Vycm9yKVxyXG57XHJcbiAgICB2YXIgbGVuID0gYXJyYXkubGVuZ3RoO1xyXG5cclxuICAgIGlmIChzdGFydEluZGV4IDwgMCB8fFxyXG4gICAgICAgIHN0YXJ0SW5kZXggPiBsZW4gfHxcclxuICAgICAgICBzdGFydEluZGV4ID49IGVuZEluZGV4IHx8XHJcbiAgICAgICAgZW5kSW5kZXggPiBsZW4gfHxcclxuICAgICAgICBzdGFydEluZGV4ICsgZW5kSW5kZXggPiBsZW4pXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRocm93RXJyb3IpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhbmdlIEVycm9yOiBWYWx1ZXMgb3V0c2lkZSBhY2NlcHRhYmxlIHJhbmdlJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNhZmVSYW5nZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogTW92ZXMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJyYXkuXHJcbiAqIFRoZSBhcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5TZW5kVG9CYWNrXHJcbiAqIEBzaW5jZSAzLjQuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJheSAtIFRoZSBhcnJheS5cclxuICogQHBhcmFtIHsqfSBpdGVtIC0gVGhlIGVsZW1lbnQgdG8gbW92ZS5cclxuICpcclxuICogQHJldHVybiB7Kn0gVGhlIGVsZW1lbnQgdGhhdCB3YXMgbW92ZWQuXHJcbiAqL1xyXG52YXIgU2VuZFRvQmFjayA9IGZ1bmN0aW9uIChhcnJheSwgaXRlbSlcclxue1xyXG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEgJiYgY3VycmVudEluZGV4ID4gMClcclxuICAgIHtcclxuICAgICAgICBhcnJheS5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcclxuICAgICAgICBhcnJheS51bnNoaWZ0KGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpdGVtO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBTZW5kVG9CYWNrO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBTYWZlUmFuZ2UgPSByZXF1aXJlKCcuL1NhZmVSYW5nZScpO1xyXG5cclxuLyoqXHJcbiAqIFNjYW5zIHRoZSBhcnJheSBmb3IgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuIElmIGZvdW5kLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIHRoZSBgdmFsdWVgLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZTogYFNldEFsbCgndmlzaWJsZScsIHRydWUpYCB3b3VsZCBzZXQgYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGB2aXNpYmxlYCBwcm9wZXJ0eSB0byBgZmFsc2VgLlxyXG4gKlxyXG4gKiBPcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIHN0YXJ0IGFuZCBlbmQgaW5kZXguIEZvciBleGFtcGxlIGlmIHRoZSBhcnJheSBoYWQgMTAwIGVsZW1lbnRzLFxyXG4gKiBhbmQgeW91IHNldCBgc3RhcnRJbmRleGAgdG8gMCBhbmQgYGVuZEluZGV4YCB0byA1MCwgaXQgd291bGQgdXBkYXRlIG9ubHkgdGhlIGZpcnN0IDUwIGVsZW1lbnRzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlNldEFsbFxyXG4gKiBAc2luY2UgMy40LjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gdGVzdCBmb3Igb24gZWFjaCBhcnJheSBlbGVtZW50LlxyXG4gKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW3N0YXJ0SW5kZXhdIC0gQW4gb3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc2VhcmNoIGZyb20uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2VuZEluZGV4XSAtIEFuIG9wdGlvbmFsIGVuZCBpbmRleCB0byBzZWFyY2ggdG8uXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBUaGUgaW5wdXQgYXJyYXkuXHJcbiAqL1xyXG52YXIgU2V0QWxsID0gZnVuY3Rpb24gKGFycmF5LCBwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxyXG57XHJcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7IHN0YXJ0SW5kZXggPSAwOyB9XHJcbiAgICBpZiAoZW5kSW5kZXggPT09IHVuZGVmaW5lZCkgeyBlbmRJbmRleCA9IGFycmF5Lmxlbmd0aDsgfVxyXG5cclxuICAgIGlmIChTYWZlUmFuZ2UoYXJyYXksIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSlcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZW50cnkgPSBhcnJheVtpXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2V0QWxsO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTaHVmZmxlcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5IHVzaW5nIHRoZSBGaXNoZXItWWF0ZXMgaW1wbGVtZW50YXRpb24uXHJcbiAqXHJcbiAqIFRoZSBvcmlnaW5hbCBhcnJheSBpcyBtb2RpZmllZCBkaXJlY3RseSBhbmQgcmV0dXJuZWQuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuU2h1ZmZsZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdfSAtIFthcnJheSwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1RbXX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS4gVGhpcyBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZS5cclxuICpcclxuICogQHJldHVybiB7VFtdfSBUaGUgc2h1ZmZsZWQgYXJyYXkuXHJcbiAqL1xyXG52YXIgU2h1ZmZsZSA9IGZ1bmN0aW9uIChhcnJheSlcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcclxuICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xyXG4gICAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XHJcbiAgICAgICAgYXJyYXlbal0gPSB0ZW1wO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU2h1ZmZsZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlcyBhIHNpbmdsZSBpdGVtIGZyb20gYW4gYXJyYXkgYW5kIHJldHVybnMgaXQgd2l0aG91dCBjcmVhdGluZyBnYywgbGlrZSB0aGUgbmF0aXZlIHNwbGljZSBkb2VzLlxyXG4gKiBCYXNlZCBvbiBjb2RlIGJ5IE1pa2UgUmVpbnN0ZWluLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlNwbGljZU9uZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHthcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gc3BsaWNlIGZyb20uXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHNwbGljZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4geyp9IFRoZSBpdGVtIHdoaWNoIHdhcyBzcGxpY2VkIChyZW1vdmVkKS5cclxuICovXHJcbnZhciBTcGxpY2VPbmUgPSBmdW5jdGlvbiAoYXJyYXksIGluZGV4KVxyXG57XHJcbiAgICBpZiAoaW5kZXggPj0gYXJyYXkubGVuZ3RoKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGVuID0gYXJyYXkubGVuZ3RoIC0gMTtcclxuXHJcbiAgICB2YXIgaXRlbSA9IGFycmF5W2luZGV4XTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPCBsZW47IGkrKylcclxuICAgIHtcclxuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2kgKyAxXTtcclxuICAgIH1cclxuXHJcbiAgICBhcnJheS5sZW5ndGggPSBsZW47XHJcblxyXG4gICAgcmV0dXJuIGl0ZW07XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNwbGljZU9uZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyEgc3RhYmxlLmpzIDAuMS42LCBodHRwczovL2dpdGh1Yi5jb20vVHdvLVNjcmVlbi9zdGFibGVcclxuLy8hIMKpIDIwMTcgQW5ncnkgQnl0ZXMgYW5kIGNvbnRyaWJ1dG9ycy4gTUlUIGxpY2Vuc2VkLlxyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlV0aWxzLkFycmF5LlN0YWJsZVNvcnRGdW5jdGlvbnNcclxuICovXHJcblxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gLyoqXHJcbiAqIEEgc3RhYmxlIGFycmF5IHNvcnQsIGJlY2F1c2UgYEFycmF5I3NvcnQoKWAgaXMgbm90IGd1YXJhbnRlZWQgc3RhYmxlLlxyXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIG1lcmdlIHNvcnQsIHdpdGhvdXQgcmVjdXJzaW9uLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlN0YWJsZVNvcnRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciAtIFRoZSBpbnB1dCBhcnJheSB0byBiZSBzb3J0ZWQuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXAgLSBUaGUgY29tcGFyaXNvbiBoYW5kbGVyLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gVGhlIHNvcnRlZCByZXN1bHQuXHJcbiAqL1xyXG52YXIgc3RhYmxlID0gZnVuY3Rpb24oYXJyLCBjb21wKSB7XHJcbiAgICByZXR1cm4gZXhlYyhhcnIuc2xpY2UoKSwgY29tcCk7XHJcbn07XHJcblxyXG4gLyoqXHJcbiAqIFNvcnQgdGhlIGlucHV0IGFycmF5IGFuZCBzaW1wbHkgY29weSBpdCBiYWNrIGlmIHRoZSByZXN1bHQgaXNuJ3QgaW4gdGhlIG9yaWdpbmFsIGFycmF5LCB3aGljaCBoYXBwZW5zIG9uIGFuIG9kZCBudW1iZXIgb2YgcGFzc2VzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlN0YWJsZVNvcnRGdW5jdGlvbnMuaW5wbGFjZVxyXG4gKiBAbWVtYmVyb2YgUGhhc2VyLlV0aWxzLkFycmF5LlN0YWJsZVNvcnRGdW5jdGlvbnNcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciAtIFRoZSBpbnB1dCBhcnJheS5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcCAtIFRoZSBjb21wYXJpc29uIGhhbmRsZXIuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2FycmF5fSBUaGUgc29ydGVkIGFycmF5LlxyXG4gKi9cclxuc3RhYmxlLmlucGxhY2UgPSBmdW5jdGlvbihhcnIsIGNvbXApIHtcclxuICAgIHZhciByZXN1bHQgPSBleGVjKGFyciwgY29tcCk7XHJcblxyXG4gICAgLy8gVGhpcyBzaW1wbHkgY29waWVzIGJhY2sgaWYgdGhlIHJlc3VsdCBpc24ndCBpbiB0aGUgb3JpZ2luYWwgYXJyYXksXHJcbiAgICAvLyB3aGljaCBoYXBwZW5zIG9uIGFuIG9kZCBudW1iZXIgb2YgcGFzc2VzLlxyXG4gICAgaWYgKHJlc3VsdCAhPT0gYXJyKSB7XHJcbiAgICAgICAgcGFzcyhyZXN1bHQsIG51bGwsIGFyci5sZW5ndGgsIGFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycjtcclxufTtcclxuXHJcbi8vIEV4ZWN1dGUgdGhlIHNvcnQgdXNpbmcgdGhlIGlucHV0IGFycmF5IGFuZCBhIHNlY29uZCBidWZmZXIgYXMgd29yayBzcGFjZS5cclxuLy8gUmV0dXJucyBvbmUgb2YgdGhvc2UgdHdvLCBjb250YWluaW5nIHRoZSBmaW5hbCByZXN1bHQuXHJcbmZ1bmN0aW9uIGV4ZWMoYXJyLCBjb21wKSB7XHJcbiAgICBpZiAodHlwZW9mKGNvbXApICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29tcCA9IGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKGIpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2hvcnQtY2lyY3VpdCB3aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBzb3J0LlxyXG4gICAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XHJcbiAgICBpZiAobGVuIDw9IDEpIHtcclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhdGhlciB0aGFuIGRpdmlkaW5nIGlucHV0LCBzaW1wbHkgaXRlcmF0ZSBjaHVua3Mgb2YgMSwgMiwgNCwgOCwgZXRjLlxyXG4gICAgLy8gQ2h1bmtzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgbGVmdCBvciByaWdodCBoYW5kIGluIG1lcmdlIHNvcnQuXHJcbiAgICAvLyBTdG9wIHdoZW4gdGhlIGxlZnQtaGFuZCBjb3ZlcnMgYWxsIG9mIHRoZSBhcnJheS5cclxuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobGVuKTtcclxuICAgIGZvciAodmFyIGNoayA9IDE7IGNoayA8IGxlbjsgY2hrICo9IDIpIHtcclxuICAgICAgICBwYXNzKGFyciwgY29tcCwgY2hrLCBidWZmZXIpO1xyXG5cclxuICAgICAgICB2YXIgdG1wID0gYXJyO1xyXG4gICAgICAgIGFyciA9IGJ1ZmZlcjtcclxuICAgICAgICBidWZmZXIgPSB0bXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycjtcclxufVxyXG5cclxuLy8gUnVuIGEgc2luZ2xlIHBhc3Mgd2l0aCB0aGUgZ2l2ZW4gY2h1bmsgc2l6ZS5cclxudmFyIHBhc3MgPSBmdW5jdGlvbihhcnIsIGNvbXAsIGNoaywgcmVzdWx0KSB7XHJcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcclxuICAgIHZhciBpID0gMDtcclxuICAgIC8vIFN0ZXAgc2l6ZSAvIGRvdWJsZSBjaHVuayBzaXplLlxyXG4gICAgdmFyIGRibCA9IGNoayAqIDI7XHJcbiAgICAvLyBCb3VuZHMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IGNodW5rcy5cclxuICAgIHZhciBsLCByLCBlO1xyXG4gICAgLy8gSXRlcmF0b3JzIG92ZXIgdGhlIGxlZnQgYW5kIHJpZ2h0IGNodW5rLlxyXG4gICAgdmFyIGxpLCByaTtcclxuXHJcbiAgICAvLyBJdGVyYXRlIG92ZXIgcGFpcnMgb2YgY2h1bmtzLlxyXG4gICAgZm9yIChsID0gMDsgbCA8IGxlbjsgbCArPSBkYmwpIHtcclxuICAgICAgICByID0gbCArIGNoaztcclxuICAgICAgICBlID0gciArIGNoaztcclxuICAgICAgICBpZiAociA+IGxlbikgciA9IGxlbjtcclxuICAgICAgICBpZiAoZSA+IGxlbikgZSA9IGxlbjtcclxuXHJcbiAgICAgICAgLy8gSXRlcmF0ZSBib3RoIGNodW5rcyBpbiBwYXJhbGxlbC5cclxuICAgICAgICBsaSA9IGw7XHJcbiAgICAgICAgcmkgPSByO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIGNodW5rcy5cclxuICAgICAgICAgICAgaWYgKGxpIDwgciAmJiByaSA8IGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGEgcmVndWxhciBgc29ydCgpYCBjb21wYXRpYmxlIGNvbXBhcmF0b3IsXHJcbiAgICAgICAgICAgICAgICAvLyBidXQgYWxzbyBmb3IgYSBzaW1wbGUgY29tcGFyYXRvciBsaWtlOiBgYSA+IGJgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcChhcnJbbGldLCBhcnJbcmldKSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbbGkrK107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaSsrXSA9IGFycltyaSsrXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGNvbXBhcmUsIGp1c3QgZmx1c2ggd2hhdCdzIGxlZnQuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxpIDwgcikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2krK10gPSBhcnJbbGkrK107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocmkgPCBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaSsrXSA9IGFycltyaSsrXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBCb3RoIGl0ZXJhdG9ycyBhcmUgYXQgdGhlIGNodW5rIGVuZHMuXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBFeHBvcnQgdXNpbmcgQ29tbW9uSlMgb3IgdG8gdGhlIHdpbmRvdy5cclxuaWYgKHR5cGVvZihtb2R1bGUpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzdGFibGU7XHJcbn1cclxuZWxzZSB7XHJcbiAgICB3aW5kb3cuc3RhYmxlID0gc3RhYmxlO1xyXG59XHJcblxyXG59KSgpOyIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFN3YXBzIHRoZSBwb3NpdGlvbiBvZiB0d28gZWxlbWVudHMgaW4gdGhlIGdpdmVuIGFycmF5LlxyXG4gKiBUaGUgZWxlbWVudHMgbXVzdCBleGlzdCBpbiB0aGUgc2FtZSBhcnJheS5cclxuICogVGhlIGFycmF5IGlzIG1vZGlmaWVkIGluLXBsYWNlLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5LlN3YXBcclxuICogQHNpbmNlIDMuNC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7YXJyYXl9IGFycmF5IC0gVGhlIGlucHV0IGFycmF5LlxyXG4gKiBAcGFyYW0geyp9IGl0ZW0xIC0gVGhlIGZpcnN0IGVsZW1lbnQgdG8gc3dhcC5cclxuICogQHBhcmFtIHsqfSBpdGVtMiAtIFRoZSBzZWNvbmQgZWxlbWVudCB0byBzd2FwLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHthcnJheX0gVGhlIGlucHV0IGFycmF5LlxyXG4gKi9cclxudmFyIFN3YXAgPSBmdW5jdGlvbiAoYXJyYXksIGl0ZW0xLCBpdGVtMilcclxue1xyXG4gICAgaWYgKGl0ZW0xID09PSBpdGVtMilcclxuICAgIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGluZGV4MSA9IGFycmF5LmluZGV4T2YoaXRlbTEpO1xyXG4gICAgdmFyIGluZGV4MiA9IGFycmF5LmluZGV4T2YoaXRlbTIpO1xyXG5cclxuICAgIGlmIChpbmRleDEgPCAwIHx8IGluZGV4MiA8IDApXHJcbiAgICB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwbGllZCBpdGVtcyBtdXN0IGJlIGVsZW1lbnRzIG9mIHRoZSBzYW1lIGFycmF5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXJyYXlbaW5kZXgxXSA9IGl0ZW0yO1xyXG4gICAgYXJyYXlbaW5kZXgyXSA9IGl0ZW0xO1xyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gU3dhcDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuVXRpbHMuQXJyYXlcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBNYXRyaXg6IHJlcXVpcmUoJy4vbWF0cml4JyksXHJcblxyXG4gICAgQWRkOiByZXF1aXJlKCcuL0FkZCcpLFxyXG4gICAgQWRkQXQ6IHJlcXVpcmUoJy4vQWRkQXQnKSxcclxuICAgIEJyaW5nVG9Ub3A6IHJlcXVpcmUoJy4vQnJpbmdUb1RvcCcpLFxyXG4gICAgQ291bnRBbGxNYXRjaGluZzogcmVxdWlyZSgnLi9Db3VudEFsbE1hdGNoaW5nJyksXHJcbiAgICBFYWNoOiByZXF1aXJlKCcuL0VhY2gnKSxcclxuICAgIEVhY2hJblJhbmdlOiByZXF1aXJlKCcuL0VhY2hJblJhbmdlJyksXHJcbiAgICBGaW5kQ2xvc2VzdEluU29ydGVkOiByZXF1aXJlKCcuL0ZpbmRDbG9zZXN0SW5Tb3J0ZWQnKSxcclxuICAgIEdldEFsbDogcmVxdWlyZSgnLi9HZXRBbGwnKSxcclxuICAgIEdldEZpcnN0OiByZXF1aXJlKCcuL0dldEZpcnN0JyksXHJcbiAgICBHZXRSYW5kb206IHJlcXVpcmUoJy4vR2V0UmFuZG9tJyksXHJcbiAgICBNb3ZlRG93bjogcmVxdWlyZSgnLi9Nb3ZlRG93bicpLFxyXG4gICAgTW92ZVRvOiByZXF1aXJlKCcuL01vdmVUbycpLFxyXG4gICAgTW92ZVVwOiByZXF1aXJlKCcuL01vdmVVcCcpLFxyXG4gICAgTnVtYmVyQXJyYXk6IHJlcXVpcmUoJy4vTnVtYmVyQXJyYXknKSxcclxuICAgIE51bWJlckFycmF5U3RlcDogcmVxdWlyZSgnLi9OdW1iZXJBcnJheVN0ZXAnKSxcclxuICAgIFF1aWNrU2VsZWN0OiByZXF1aXJlKCcuL1F1aWNrU2VsZWN0JyksXHJcbiAgICBSYW5nZTogcmVxdWlyZSgnLi9SYW5nZScpLFxyXG4gICAgUmVtb3ZlOiByZXF1aXJlKCcuL1JlbW92ZScpLFxyXG4gICAgUmVtb3ZlQXQ6IHJlcXVpcmUoJy4vUmVtb3ZlQXQnKSxcclxuICAgIFJlbW92ZUJldHdlZW46IHJlcXVpcmUoJy4vUmVtb3ZlQmV0d2VlbicpLFxyXG4gICAgUmVtb3ZlUmFuZG9tRWxlbWVudDogcmVxdWlyZSgnLi9SZW1vdmVSYW5kb21FbGVtZW50JyksXHJcbiAgICBSZXBsYWNlOiByZXF1aXJlKCcuL1JlcGxhY2UnKSxcclxuICAgIFJvdGF0ZUxlZnQ6IHJlcXVpcmUoJy4vUm90YXRlTGVmdCcpLFxyXG4gICAgUm90YXRlUmlnaHQ6IHJlcXVpcmUoJy4vUm90YXRlUmlnaHQnKSxcclxuICAgIFNhZmVSYW5nZTogcmVxdWlyZSgnLi9TYWZlUmFuZ2UnKSxcclxuICAgIFNlbmRUb0JhY2s6IHJlcXVpcmUoJy4vU2VuZFRvQmFjaycpLFxyXG4gICAgU2V0QWxsOiByZXF1aXJlKCcuL1NldEFsbCcpLFxyXG4gICAgU2h1ZmZsZTogcmVxdWlyZSgnLi9TaHVmZmxlJyksXHJcbiAgICBTcGxpY2VPbmU6IHJlcXVpcmUoJy4vU3BsaWNlT25lJyksXHJcbiAgICBTdGFibGVTb3J0OiByZXF1aXJlKCcuL1N0YWJsZVNvcnQnKSxcclxuICAgIFN3YXA6IHJlcXVpcmUoJy4vU3dhcCcpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gYXJyYXkgY2FuIGJlIHVzZWQgYXMgYSBtYXRyaXguXHJcbiAqXHJcbiAqIEEgbWF0cml4IGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IChhcnJheSBvZiBhcnJheXMpLCB3aGVyZSBhbGwgc3ViLWFycmF5cyAocm93cykgaGF2ZSB0aGUgc2FtZSBsZW5ndGguIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgdHdvIHJvd3M6XHJcbiAqXHJcbiAqIGBgYFxyXG4gKiAgICBbXHJcbiAqICAgICAgICBbIDEsIDEsIDEsIDEsIDEsIDEgXSxcclxuICogICAgICAgIFsgMiwgMCwgMCwgMCwgMCwgNCBdLFxyXG4gKiAgICAgICAgWyAyLCAwLCAxLCAyLCAwLCA0IF0sXHJcbiAqICAgICAgICBbIDIsIDAsIDMsIDQsIDAsIDQgXSxcclxuICogICAgICAgIFsgMiwgMCwgMCwgMCwgMCwgNCBdLFxyXG4gKiAgICAgICAgWyAzLCAzLCAzLCAzLCAzLCAzIF1cclxuICogICAgXVxyXG4gKiBgYGBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5NYXRyaXguQ2hlY2tNYXRyaXhcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqIFxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqIEBnZW5lcmljVXNlIHtUW11bXX0gLSBbbWF0cml4XVxyXG4gKlxyXG4gKiBAcGFyYW0ge1RbXVtdfSBbbWF0cml4XSAtIFRoZSBhcnJheSB0byBjaGVjay5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBnaXZlbiBgbWF0cml4YCBhcnJheSBpcyBhIHZhbGlkIG1hdHJpeC5cclxuICovXHJcbnZhciBDaGVja01hdHJpeCA9IGZ1bmN0aW9uIChtYXRyaXgpXHJcbntcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShtYXRyaXgpIHx8IG1hdHJpeC5sZW5ndGggPCAyIHx8ICFBcnJheS5pc0FycmF5KG1hdHJpeFswXSkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICBIb3cgbG9uZyBpcyB0aGUgZmlyc3Qgcm93P1xyXG4gICAgdmFyIHNpemUgPSBtYXRyaXhbMF0ubGVuZ3RoO1xyXG5cclxuICAgIC8vICBWYWxpZGF0ZSB0aGUgcmVzdCBvZiB0aGUgcm93cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXHJcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IG1hdHJpeC5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpZiAobWF0cml4W2ldLmxlbmd0aCAhPT0gc2l6ZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENoZWNrTWF0cml4O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBQYWQgPSByZXF1aXJlKCcuLi8uLi9zdHJpbmcvUGFkJyk7XHJcbnZhciBDaGVja01hdHJpeCA9IHJlcXVpcmUoJy4vQ2hlY2tNYXRyaXgnKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgKHdoaWNoIHlvdSBjYW4gcGFzcyB0byBjb25zb2xlLmxvZykgZnJvbSB0aGUgZ2l2ZW4gQXJyYXkgTWF0cml4LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5Lk1hdHJpeC5NYXRyaXhUb1N0cmluZ1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdW119IC0gW21hdHJpeF1cclxuICpcclxuICogQHBhcmFtIHtUW11bXX0gW21hdHJpeF0gLSBBIDItZGltZW5zaW9uYWwgYXJyYXkuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBtYXRyaXguXHJcbiAqL1xyXG52YXIgTWF0cml4VG9TdHJpbmcgPSBmdW5jdGlvbiAobWF0cml4KVxyXG57XHJcbiAgICB2YXIgc3RyID0gJyc7XHJcblxyXG4gICAgaWYgKCFDaGVja01hdHJpeChtYXRyaXgpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgciA9IDA7IHIgPCBtYXRyaXgubGVuZ3RoOyByKyspXHJcbiAgICB7XHJcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBtYXRyaXhbcl0ubGVuZ3RoOyBjKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2VsbCA9IG1hdHJpeFtyXVtjXS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGwgIT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gUGFkKGNlbGwsIDIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICc/JztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGMgPCBtYXRyaXhbcl0ubGVuZ3RoIC0gMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgfCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyIDwgbWF0cml4Lmxlbmd0aCAtIDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gJ1xcbic7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdHJpeFtyXS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICctLS0nO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgbWF0cml4W3JdLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcrJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0cjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gTWF0cml4VG9TdHJpbmc7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJldmVyc2VzIHRoZSBjb2x1bW5zIGluIHRoZSBnaXZlbiBBcnJheSBNYXRyaXguXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuTWF0cml4LlJldmVyc2VDb2x1bW5zXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqIEBnZW5lcmljVXNlIHtUW11bXX0gLSBbbWF0cml4LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7VFtdW119IFttYXRyaXhdIC0gVGhlIGFycmF5IG1hdHJpeCB0byByZXZlcnNlIHRoZSBjb2x1bW5zIGZvci5cclxuICpcclxuICogQHJldHVybiB7VFtdW119IFRoZSBjb2x1bW4gcmV2ZXJzZWQgbWF0cml4LlxyXG4gKi9cclxudmFyIFJldmVyc2VDb2x1bW5zID0gZnVuY3Rpb24gKG1hdHJpeClcclxue1xyXG4gICAgcmV0dXJuIG1hdHJpeC5yZXZlcnNlKCk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJldmVyc2VDb2x1bW5zO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBSZXZlcnNlcyB0aGUgcm93cyBpbiB0aGUgZ2l2ZW4gQXJyYXkgTWF0cml4LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5Lk1hdHJpeC5SZXZlcnNlUm93c1xyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdW119IC0gW21hdHJpeCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1RbXVtdfSBbbWF0cml4XSAtIFRoZSBhcnJheSBtYXRyaXggdG8gcmV2ZXJzZSB0aGUgcm93cyBmb3IuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1RbXVtdfSBUaGUgY29sdW1uIHJldmVyc2VkIG1hdHJpeC5cclxuICovXHJcbnZhciBSZXZlcnNlUm93cyA9IGZ1bmN0aW9uIChtYXRyaXgpXHJcbntcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0cml4Lmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIG1hdHJpeFtpXS5yZXZlcnNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1hdHJpeDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUmV2ZXJzZVJvd3M7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIFJvdGF0ZU1hdHJpeCA9IHJlcXVpcmUoJy4vUm90YXRlTWF0cml4Jyk7XHJcblxyXG4vKipcclxuICogUm90YXRlcyB0aGUgYXJyYXkgbWF0cml4IDE4MCBkZWdyZWVzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLkFycmF5Lk1hdHJpeC5Sb3RhdGUxODBcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBnZW5lcmljIFRcclxuICogQGdlbmVyaWNVc2Uge1RbXVtdfSAtIFttYXRyaXgsJHJldHVybl1cclxuICpcclxuICogQHBhcmFtIHtUW11bXX0gW21hdHJpeF0gLSBUaGUgYXJyYXkgdG8gcm90YXRlLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtUW11bXX0gVGhlIHJvdGF0ZWQgbWF0cml4IGFycmF5LiBUaGUgc291cmNlIG1hdHJpeCBzaG91bGQgYmUgZGlzY2FyZCBmb3IgdGhlIHJldHVybmVkIG1hdHJpeC5cclxuICovXHJcbnZhciBSb3RhdGUxODAgPSBmdW5jdGlvbiAobWF0cml4KVxyXG57XHJcbiAgICByZXR1cm4gUm90YXRlTWF0cml4KG1hdHJpeCwgMTgwKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlMTgwO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSb3RhdGVNYXRyaXggPSByZXF1aXJlKCcuL1JvdGF0ZU1hdHJpeCcpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgdGhlIGFycmF5IG1hdHJpeCB0byB0aGUgbGVmdCAob3IgOTAgZGVncmVlcylcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5NYXRyaXguUm90YXRlTGVmdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdW119IC0gW21hdHJpeCwkcmV0dXJuXVxyXG4gKlxyXG4gKiBAcGFyYW0ge1RbXVtdfSBbbWF0cml4XSAtIFRoZSBhcnJheSB0byByb3RhdGUuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1RbXVtdfSBUaGUgcm90YXRlZCBtYXRyaXggYXJyYXkuIFRoZSBzb3VyY2UgbWF0cml4IHNob3VsZCBiZSBkaXNjYXJkIGZvciB0aGUgcmV0dXJuZWQgbWF0cml4LlxyXG4gKi9cclxudmFyIFJvdGF0ZUxlZnQgPSBmdW5jdGlvbiAobWF0cml4KVxyXG57XHJcbiAgICByZXR1cm4gUm90YXRlTWF0cml4KG1hdHJpeCwgOTApO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSb3RhdGVMZWZ0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDaGVja01hdHJpeCA9IHJlcXVpcmUoJy4vQ2hlY2tNYXRyaXgnKTtcclxudmFyIFRyYW5zcG9zZU1hdHJpeCA9IHJlcXVpcmUoJy4vVHJhbnNwb3NlTWF0cml4Jyk7XHJcblxyXG4vKipcclxuICogUm90YXRlcyB0aGUgYXJyYXkgbWF0cml4IGJhc2VkIG9uIHRoZSBnaXZlbiByb3RhdGlvbiB2YWx1ZS5cclxuICpcclxuICogVGhlIHZhbHVlIGNhbiBiZSBnaXZlbiBpbiBkZWdyZWVzOiA5MCwgLTkwLCAyNzAsIC0yNzAgb3IgMTgwLFxyXG4gKiBvciBhIHN0cmluZyBjb21tYW5kOiBgcm90YXRlTGVmdGAsIGByb3RhdGVSaWdodGAgb3IgYHJvdGF0ZTE4MGAuXHJcbiAqXHJcbiAqIEJhc2VkIG9uIHRoZSByb3V0aW5lIGZyb20ge0BsaW5rIGh0dHA6Ly9qc2ZpZGRsZS5uZXQvTXJQb2x5d2hpcmwvTkg0MnovfS5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5NYXRyaXguUm90YXRlTWF0cml4XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqIEBnZW5lcmljVXNlIHtUW11bXX0gLSBbbWF0cml4LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7VFtdW119IFttYXRyaXhdIC0gVGhlIGFycmF5IHRvIHJvdGF0ZS5cclxuICogQHBhcmFtIHsobnVtYmVyfHN0cmluZyl9IFtkaXJlY3Rpb249OTBdIC0gVGhlIGFtb3VudCB0byByb3RhdGUgdGhlIG1hdHJpeCBieS5cclxuICpcclxuICogQHJldHVybiB7VFtdW119IFRoZSByb3RhdGVkIG1hdHJpeCBhcnJheS4gVGhlIHNvdXJjZSBtYXRyaXggc2hvdWxkIGJlIGRpc2NhcmQgZm9yIHRoZSByZXR1cm5lZCBtYXRyaXguXHJcbiAqL1xyXG52YXIgUm90YXRlTWF0cml4ID0gZnVuY3Rpb24gKG1hdHJpeCwgZGlyZWN0aW9uKVxyXG57XHJcbiAgICBpZiAoZGlyZWN0aW9uID09PSB1bmRlZmluZWQpIHsgZGlyZWN0aW9uID0gOTA7IH1cclxuXHJcbiAgICBpZiAoIUNoZWNrTWF0cml4KG1hdHJpeCkpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gIT09ICdzdHJpbmcnKVxyXG4gICAge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9ICgoZGlyZWN0aW9uICUgMzYwKSArIDM2MCkgJSAzNjA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gOTAgfHwgZGlyZWN0aW9uID09PSAtMjcwIHx8IGRpcmVjdGlvbiA9PT0gJ3JvdGF0ZUxlZnQnKVxyXG4gICAge1xyXG4gICAgICAgIG1hdHJpeCA9IFRyYW5zcG9zZU1hdHJpeChtYXRyaXgpO1xyXG4gICAgICAgIG1hdHJpeC5yZXZlcnNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09IC05MCB8fCBkaXJlY3Rpb24gPT09IDI3MCB8fCBkaXJlY3Rpb24gPT09ICdyb3RhdGVSaWdodCcpXHJcbiAgICB7XHJcbiAgICAgICAgbWF0cml4LnJldmVyc2UoKTtcclxuICAgICAgICBtYXRyaXggPSBUcmFuc3Bvc2VNYXRyaXgobWF0cml4KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKE1hdGguYWJzKGRpcmVjdGlvbikgPT09IDE4MCB8fCBkaXJlY3Rpb24gPT09ICdyb3RhdGUxODAnKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0cml4Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWF0cml4W2ldLnJldmVyc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1hdHJpeC5yZXZlcnNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1hdHJpeDtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlTWF0cml4O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBSb3RhdGVNYXRyaXggPSByZXF1aXJlKCcuL1JvdGF0ZU1hdHJpeCcpO1xyXG5cclxuLyoqXHJcbiAqIFJvdGF0ZXMgdGhlIGFycmF5IG1hdHJpeCB0byB0aGUgbGVmdCAob3IgLTkwIGRlZ3JlZXMpXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQXJyYXkuTWF0cml4LlJvdGF0ZVJpZ2h0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAZ2VuZXJpYyBUXHJcbiAqIEBnZW5lcmljVXNlIHtUW11bXX0gLSBbbWF0cml4LCRyZXR1cm5dXHJcbiAqXHJcbiAqIEBwYXJhbSB7VFtdW119IFttYXRyaXhdIC0gVGhlIGFycmF5IHRvIHJvdGF0ZS5cclxuICpcclxuICogQHJldHVybiB7VFtdW119IFRoZSByb3RhdGVkIG1hdHJpeCBhcnJheS4gVGhlIHNvdXJjZSBtYXRyaXggc2hvdWxkIGJlIGRpc2NhcmQgZm9yIHRoZSByZXR1cm5lZCBtYXRyaXguXHJcbiAqL1xyXG52YXIgUm90YXRlUmlnaHQgPSBmdW5jdGlvbiAobWF0cml4KVxyXG57XHJcbiAgICByZXR1cm4gUm90YXRlTWF0cml4KG1hdHJpeCwgLTkwKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUm90YXRlUmlnaHQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRyYW5zcG9zZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBtYXRyaXggKGFycmF5IG9mIGFycmF5cykuXHJcbiAqXHJcbiAqIFRoZSB0cmFuc3Bvc2Ugb2YgYSBtYXRyaXggaXMgYSBuZXcgbWF0cml4IHdob3NlIHJvd3MgYXJlIHRoZSBjb2x1bW5zIG9mIHRoZSBvcmlnaW5hbC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5BcnJheS5NYXRyaXguVHJhbnNwb3NlTWF0cml4XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKiBcclxuICogQGdlbmVyaWMgVFxyXG4gKiBAZ2VuZXJpY1VzZSB7VFtdW119IC0gW2FycmF5LCRyZXR1cm5dXHJcbiAqIFxyXG4gKiBAcGFyYW0ge1RbXVtdfSBbYXJyYXldIC0gVGhlIGFycmF5IG1hdHJpeCB0byB0cmFuc3Bvc2UuXHJcbiAqXHJcbiAqIEByZXR1cm4ge1RbXVtdfSBBIG5ldyBhcnJheSBtYXRyaXggd2hpY2ggaXMgYSB0cmFuc3Bvc2VkIHZlcnNpb24gb2YgdGhlIGdpdmVuIGFycmF5LlxyXG4gKi9cclxudmFyIFRyYW5zcG9zZU1hdHJpeCA9IGZ1bmN0aW9uIChhcnJheSlcclxue1xyXG4gICAgdmFyIHNvdXJjZVJvd0NvdW50ID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgdmFyIHNvdXJjZUNvbENvdW50ID0gYXJyYXlbMF0ubGVuZ3RoO1xyXG5cclxuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoc291cmNlQ29sQ291bnQpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlQ29sQ291bnQ7IGkrKylcclxuICAgIHtcclxuICAgICAgICByZXN1bHRbaV0gPSBuZXcgQXJyYXkoc291cmNlUm93Q291bnQpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBqID0gc291cmNlUm93Q291bnQgLSAxOyBqID4gLTE7IGotLSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXVtqXSA9IGFycmF5W2pdW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc3Bvc2VNYXRyaXg7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lc3BhY2UgUGhhc2VyLlV0aWxzLkFycmF5Lk1hdHJpeFxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIENoZWNrTWF0cml4OiByZXF1aXJlKCcuL0NoZWNrTWF0cml4JyksXHJcbiAgICBNYXRyaXhUb1N0cmluZzogcmVxdWlyZSgnLi9NYXRyaXhUb1N0cmluZycpLFxyXG4gICAgUmV2ZXJzZUNvbHVtbnM6IHJlcXVpcmUoJy4vUmV2ZXJzZUNvbHVtbnMnKSxcclxuICAgIFJldmVyc2VSb3dzOiByZXF1aXJlKCcuL1JldmVyc2VSb3dzJyksXHJcbiAgICBSb3RhdGUxODA6IHJlcXVpcmUoJy4vUm90YXRlMTgwJyksXHJcbiAgICBSb3RhdGVMZWZ0OiByZXF1aXJlKCcuL1JvdGF0ZUxlZnQnKSxcclxuICAgIFJvdGF0ZU1hdHJpeDogcmVxdWlyZSgnLi9Sb3RhdGVNYXRyaXgnKSxcclxuICAgIFJvdGF0ZVJpZ2h0OiByZXF1aXJlKCcuL1JvdGF0ZVJpZ2h0JyksXHJcbiAgICBUcmFuc3Bvc2VNYXRyaXg6IHJlcXVpcmUoJy4vVHJhbnNwb3NlTWF0cml4JylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIE5pa2xhcyB2b24gSGVydHplbiAoaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlcilcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhbiBBcnJheUJ1ZmZlciBpbnRvIGEgYmFzZTY0IHN0cmluZy5cclxuICogXHJcbiAqIFRoZSByZXN1bHRpbmcgc3RyaW5nIGNhbiBvcHRpb25hbGx5IGJlIGEgZGF0YSB1cmkgaWYgdGhlIGBtZWRpYVR5cGVgIGFyZ3VtZW50IGlzIHByb3ZpZGVkLlxyXG4gKiBcclxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvRGF0YV9VUklzIGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQmFzZTY0LkFycmF5QnVmZmVyVG9CYXNlNjRcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKiBcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgLSBUaGUgQXJyYXkgQnVmZmVyIHRvIGVuY29kZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFttZWRpYVR5cGVdIC0gQW4gb3B0aW9uYWwgbWVkaWEgdHlwZSwgaS5lLiBgYXVkaW8vb2dnYCBvciBgaW1hZ2UvanBlZ2AuIElmIGluY2x1ZGVkIHRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYmUgYSBkYXRhIFVSSS5cclxuICogXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJhc2U2NCBlbmNvZGVkIEFycmF5IEJ1ZmZlci5cclxuICovXHJcbnZhciBBcnJheUJ1ZmZlclRvQmFzZTY0ID0gZnVuY3Rpb24gKGFycmF5QnVmZmVyLCBtZWRpYVR5cGUpXHJcbntcclxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcclxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGg7XHJcblxyXG4gICAgdmFyIGJhc2U2NCA9IChtZWRpYVR5cGUpID8gJ2RhdGE6JyArIG1lZGlhVHlwZSArICc7YmFzZTY0LCcgOiAnJztcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAzKVxyXG4gICAge1xyXG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpXSA+PiAyXTtcclxuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKChieXRlc1tpXSAmIDMpIDw8IDQpIHwgKGJ5dGVzW2kgKyAxXSA+PiA0KV07XHJcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XHJcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kgKyAyXSAmIDYzXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKGxlbiAlIDMpID09PSAyKVxyXG4gICAge1xyXG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobGVuICUgMyA9PT0gMSlcclxuICAgIHtcclxuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAyKSArICc9PSc7XHJcbiAgICB9XHJcbiAgXHJcbiAgICByZXR1cm4gYmFzZTY0O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBBcnJheUJ1ZmZlclRvQmFzZTY0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBOaWtsYXMgdm9uIEhlcnR6ZW4gKGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXN2aC9iYXNlNjQtYXJyYXlidWZmZXIpXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XHJcblxyXG4vLyAgVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxyXG52YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcclxuXHJcbmZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspXHJcbntcclxuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIGJhc2U2NCBzdHJpbmcsIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgYSBkYXRhIHVyaSwgaW50byBhbiBBcnJheSBCdWZmZXIuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuQmFzZTY0LkJhc2U2NFRvQXJyYXlCdWZmZXJcclxuICogQHNpbmNlIDMuMTguMFxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NCAtIFRoZSBiYXNlNjQgc3RyaW5nIHRvIGJlIGRlY29kZWQuIENhbiBvcHRpb25hbGx5IGNvbnRhaW4gYSBkYXRhIFVSSSBoZWFkZXIsIHdoaWNoIHdpbGwgYmUgc3RyaXBwZWQgb3V0IHByaW9yIHRvIGRlY29kaW5nLlxyXG4gKiBcclxuICogQHJldHVybiB7QXJyYXlCdWZmZXJ9IEFuIEFycmF5QnVmZmVyIGRlY29kZWQgZnJvbSB0aGUgYmFzZTY0IGRhdGEuXHJcbiAqL1xyXG52YXIgQmFzZTY0VG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIChiYXNlNjQpXHJcbntcclxuICAgIC8vICBJcyBpdCBhIGRhdGEgdXJpPyBpZiBzbywgc3RyaXAgdGhlIGhlYWRlciBhd2F5XHJcbiAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyKGJhc2U2NC5pbmRleE9mKCcsJykgKyAxKTtcclxuXHJcbiAgICB2YXIgbGVuID0gYmFzZTY0Lmxlbmd0aDtcclxuICAgIHZhciBidWZmZXJMZW5ndGggPSBsZW4gKiAwLjc1O1xyXG4gICAgdmFyIHAgPSAwO1xyXG4gICAgdmFyIGVuY29kZWQxO1xyXG4gICAgdmFyIGVuY29kZWQyO1xyXG4gICAgdmFyIGVuY29kZWQzO1xyXG4gICAgdmFyIGVuY29kZWQ0O1xyXG5cclxuICAgIGlmIChiYXNlNjRbbGVuIC0gMV0gPT09ICc9JylcclxuICAgIHtcclxuICAgICAgICBidWZmZXJMZW5ndGgtLTtcclxuXHJcbiAgICAgICAgaWYgKGJhc2U2NFtsZW4gLSAyXSA9PT0gJz0nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpO1xyXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpXHJcbiAgICB7XHJcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xyXG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XHJcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcclxuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xyXG5cclxuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xyXG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xyXG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFycmF5QnVmZmVyO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBCYXNlNjRUb0FycmF5QnVmZmVyO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5VdGlscy5CYXNlNjRcclxuICovXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbiAgICBBcnJheUJ1ZmZlclRvQmFzZTY0OiByZXF1aXJlKCcuL0FycmF5QnVmZmVyVG9CYXNlNjQnKSxcclxuICAgIEJhc2U2NFRvQXJyYXlCdWZmZXI6IHJlcXVpcmUoJy4vQmFzZTY0VG9BcnJheUJ1ZmZlcicpXHJcblxyXG59O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5VdGlsc1xyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuICAgIEFycmF5OiByZXF1aXJlKCcuL2FycmF5LycpLFxyXG4gICAgQmFzZTY0OiByZXF1aXJlKCcuL2Jhc2U2NC8nKSxcclxuICAgIE9iamVjdHM6IHJlcXVpcmUoJy4vb2JqZWN0LycpLFxyXG4gICAgU3RyaW5nOiByZXF1aXJlKCcuL3N0cmluZy8nKVxyXG5cclxufTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2hhbGxvdyBPYmplY3QgQ2xvbmUuIFdpbGwgbm90IGNsb25lIG5lc3RlZCBvYmplY3RzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuQ2xvbmVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gY2xvbmVcclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBpbnB1dCBvYmpcclxuICovXHJcbnZhciBDbG9uZSA9IGZ1bmN0aW9uIChvYmopXHJcbntcclxuICAgIHZhciBjbG9uZSA9IHt9O1xyXG5cclxuICAgIGZvciAodmFyIGtleSBpbiBvYmopXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqW2tleV0pKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2xvbmVba2V5XSA9IG9ialtrZXldLnNsaWNlKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjbG9uZVtrZXldID0gb2JqW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbG9uZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ2xvbmU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxudmFyIElzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL0lzUGxhaW5PYmplY3QnKTtcclxuXHJcbi8vIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCAtIFBlcmZvcm0gYSBkZWVwIGNvcHk/XHJcbi8vIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxyXG4vLyBAcmV0dXJuIHtvYmplY3R9IFRoZSBleHRlbmRlZCBvYmplY3QuXHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgaHR0cDovL2FwaS5qcXVlcnkuY29tL2pRdWVyeS5leHRlbmQvXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuT2JqZWN0cy5FeHRlbmRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gVGhlIG9iamVjdHMgdGhhdCB3aWxsIGJlIG1peGVkLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBleHRlbmRlZCBvYmplY3QuXHJcbiAqL1xyXG52YXIgRXh0ZW5kID0gZnVuY3Rpb24gKClcclxue1xyXG4gICAgdmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxyXG4gICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSxcclxuICAgICAgICBpID0gMSxcclxuICAgICAgICBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxyXG4gICAgICAgIGRlZXAgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uXHJcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Jvb2xlYW4nKVxyXG4gICAge1xyXG4gICAgICAgIGRlZXAgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xyXG5cclxuICAgICAgICAvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XHJcbiAgICAgICAgaSA9IDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXh0ZW5kIFBoYXNlciBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcclxuICAgIGlmIChsZW5ndGggPT09IGkpXHJcbiAgICB7XHJcbiAgICAgICAgdGFyZ2V0ID0gdGhpcztcclxuICAgICAgICAtLWk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICAvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXHJcbiAgICAgICAgaWYgKChvcHRpb25zID0gYXJndW1lbnRzW2ldKSAhPSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxyXG4gICAgICAgICAgICBmb3IgKG5hbWUgaW4gb3B0aW9ucylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3JjID0gdGFyZ2V0W25hbWVdO1xyXG4gICAgICAgICAgICAgICAgY29weSA9IG9wdGlvbnNbbmFtZV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gY29weSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcclxuICAgICAgICAgICAgICAgIGlmIChkZWVwICYmIGNvcHkgJiYgKElzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheShjb3B5KSkpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5SXNBcnJheSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlJc0FycmF5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gc3JjICYmIEFycmF5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IHNyYyAmJiBJc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IEV4dGVuZChkZWVwLCBjbG9uZSwgY29weSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29weSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IGNvcHk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3RcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEV4dGVuZDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgTUFUSCA9IHJlcXVpcmUoJy4uLy4uL21hdGgnKTtcclxudmFyIEdldFZhbHVlID0gcmVxdWlyZSgnLi9HZXRWYWx1ZScpO1xyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0LiBBbGxvd3MgZm9yIG1vcmUgYWR2YW5jZWQgc2VsZWN0aW9uIG9wdGlvbnMsIGluY2x1ZGluZzpcclxuICpcclxuICogQWxsb3dlZCB0eXBlczpcclxuICogXHJcbiAqIEltcGxpY2l0XHJcbiAqIHtcclxuICogICAgIHg6IDRcclxuICogfVxyXG4gKlxyXG4gKiBGcm9tIGZ1bmN0aW9uXHJcbiAqIHtcclxuICogICAgIHg6IGZ1bmN0aW9uICgpXHJcbiAqIH1cclxuICpcclxuICogUmFuZG9tbHkgcGljayBvbmUgZWxlbWVudCBmcm9tIHRoZSBhcnJheVxyXG4gKiB7XHJcbiAqICAgICB4OiBbYSwgYiwgYywgZCwgZSwgZl1cclxuICogfVxyXG4gKlxyXG4gKiBSYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4OlxyXG4gKiB7XHJcbiAqICAgICB4OiB7IHJhbmRJbnQ6IFttaW4sIG1heF0gfVxyXG4gKiB9XHJcbiAqXHJcbiAqIFJhbmRvbSBmbG9hdCBiZXR3ZWVuIG1pbiBhbmQgbWF4OlxyXG4gKiB7XHJcbiAqICAgICB4OiB7IHJhbmRGbG9hdDogW21pbiwgbWF4XSB9XHJcbiAqIH1cclxuICogXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuT2JqZWN0cy5HZXRBZHZhbmNlZFZhbHVlXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gc291cmNlIC0gVGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHRoZSBvYmplY3QuIElmIGEgcHJvcGVydHkgaXMgbmVzdGVkLCB0aGUgbmFtZXMgb2YgaXRzIHByZWNlZGluZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgYSBkb3QgKGAuYCkgLSBgYmFubmVyLmhpZGVCYW5uZXJgIHdvdWxkIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGBoaWRlQmFubmVyYCBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBgYmFubmVyYCBwcm9wZXJ0eSBvZiB0aGUgYHNvdXJjZWAgb2JqZWN0LlxyXG4gKiBAcGFyYW0geyp9IGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGBrZXlgIGlzbid0IGZvdW5kIGluIHRoZSBgc291cmNlYCBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGtleS5cclxuICovXHJcbnZhciBHZXRBZHZhbmNlZFZhbHVlID0gZnVuY3Rpb24gKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpXHJcbntcclxuICAgIHZhciB2YWx1ZSA9IEdldFZhbHVlKHNvdXJjZSwga2V5LCBudWxsKTtcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBNQVRILlJORC5waWNrKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdyYW5kSW50JykpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTUFUSC5STkQuaW50ZWdlckluUmFuZ2UodmFsdWUucmFuZEludFswXSwgdmFsdWUucmFuZEludFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdyYW5kRmxvYXQnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBNQVRILlJORC5yZWFsSW5SYW5nZSh2YWx1ZS5yYW5kRmxvYXRbMF0sIHZhbHVlLnJhbmRGbG9hdFsxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZShrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0QWR2YW5jZWRWYWx1ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGtleSB3aXRoaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUge0BsaW5rIHNvdXJjZX0gb2JqZWN0LCBvciByZXR1cm5zIHtAbGluayBkZWZhdWx0VmFsdWV9XHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuT2JqZWN0cy5HZXRGYXN0VmFsdWVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBUaGUgb2JqZWN0IHRvIHNlYXJjaFxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBmb3IgdGhlIHByb3BlcnR5IG9uIHNvdXJjZS4gTXVzdCBleGlzdCBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBzb3VyY2Ugb2JqZWN0IChubyBwZXJpb2RzKVxyXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIC0gVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QuXHJcbiAqXHJcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBkZWZhdWx0VmFsdWUgKG51bGwgaWYgbm9uZSBwcm92aWRlZClcclxuICovXHJcbnZhciBHZXRGYXN0VmFsdWUgPSBmdW5jdGlvbiAoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSlcclxue1xyXG4gICAgdmFyIHQgPSB0eXBlb2Yoc291cmNlKTtcclxuXHJcbiAgICBpZiAoIXNvdXJjZSB8fCB0ID09PSAnbnVtYmVyJyB8fCB0ID09PSAnc3RyaW5nJylcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgc291cmNlW2tleV0gIT09IHVuZGVmaW5lZClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc291cmNlW2tleV07XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gR2V0RmFzdFZhbHVlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBHZXRWYWx1ZSA9IHJlcXVpcmUoJy4vR2V0VmFsdWUnKTtcclxudmFyIENsYW1wID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9DbGFtcCcpO1xyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbmQgY2xhbXBzIGEgbnVtZXJpY2FsIHZhbHVlIGZyb20gYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuR2V0TWluTWF4VmFsdWVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gdGhlIG9iamVjdC4gSWYgYSBwcm9wZXJ0eSBpcyBuZXN0ZWQsIHRoZSBuYW1lcyBvZiBpdHMgcHJlY2VkaW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBhIGRvdCAoYC5gKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIHdoaWNoIGNhbiBiZSByZXR1cm5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlIHdoaWNoIGNhbiBiZSByZXR1cm5lZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QuIEl0J3MgYWxzbyBjb25zdHJhaW5lZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlIGZyb20gdGhlIGBzb3VyY2VgIG9iamVjdC5cclxuICovXHJcbnZhciBHZXRNaW5NYXhWYWx1ZSA9IGZ1bmN0aW9uIChzb3VyY2UsIGtleSwgbWluLCBtYXgsIGRlZmF1bHRWYWx1ZSlcclxue1xyXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7IGRlZmF1bHRWYWx1ZSA9IG1pbjsgfVxyXG5cclxuICAgIHZhciB2YWx1ZSA9IEdldFZhbHVlKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xyXG5cclxuICAgIHJldHVybiBDbGFtcCh2YWx1ZSwgbWluLCBtYXgpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBHZXRNaW5NYXhWYWx1ZTtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vLyAgU291cmNlIG9iamVjdFxyXG4vLyAgVGhlIGtleSBhcyBhIHN0cmluZywgb3IgYW4gYXJyYXkgb2Yga2V5cywgaS5lLiAnYmFubmVyJywgb3IgJ2Jhbm5lci5oaWRlQmFubmVyJ1xyXG4vLyAgVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdFxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuR2V0VmFsdWVcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gdGhlIG9iamVjdC4gSWYgYSBwcm9wZXJ0eSBpcyBuZXN0ZWQsIHRoZSBuYW1lcyBvZiBpdHMgcHJlY2VkaW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBhIGRvdCAoYC5gKSAtIGBiYW5uZXIuaGlkZUJhbm5lcmAgd291bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYGhpZGVCYW5uZXJgIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIGBiYW5uZXJgIHByb3BlcnR5IG9mIHRoZSBgc291cmNlYCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgYGtleWAgaXNuJ3QgZm91bmQgaW4gdGhlIGBzb3VyY2VgIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQga2V5LlxyXG4gKi9cclxudmFyIEdldFZhbHVlID0gZnVuY3Rpb24gKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpXHJcbntcclxuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UgPT09ICdudW1iZXInKVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc291cmNlW2tleV07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChrZXkuaW5kZXhPZignLicpICE9PSAtMSlcclxuICAgIHtcclxuICAgICAgICB2YXIga2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSBzb3VyY2U7XHJcbiAgICAgICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAvLyAgVXNlIGZvciBsb29wIGhlcmUgc28gd2UgY2FuIGJyZWFrIGVhcmx5XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudC5oYXNPd25Qcm9wZXJ0eShrZXlzW2ldKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gIFllcyBpdCBoYXMgYSBrZXkgcHJvcGVydHksIGxldCdzIGNhcnJ5IG9uIGRvd25cclxuICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyZW50W2tleXNbaV1dO1xyXG5cclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFtrZXlzW2ldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIC8vICBDYW4ndCBnbyBhbnkgZnVydGhlciwgc28gcmVzZXQgdG8gZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEdldFZhbHVlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBWZXJpZmllcyB0aGF0IGFuIG9iamVjdCBjb250YWlucyBhbGwgcmVxdWVzdGVkIGtleXNcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5PYmplY3RzLkhhc0FsbFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IHNvdXJjZSAtIGFuIG9iamVjdCBvbiB3aGljaCB0byBjaGVjayBmb3Iga2V5IGV4aXN0ZW5jZVxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBrZXlzIC0gYW4gYXJyYXkgb2Yga2V5cyB0byBlbnN1cmUgdGhlIHNvdXJjZSBvYmplY3QgY29udGFpbnNcclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc291cmNlIG9iamVjdCBjb250YWlucyBhbGwga2V5cywgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxudmFyIEhhc0FsbCA9IGZ1bmN0aW9uIChzb3VyY2UsIGtleXMpXHJcbntcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKylcclxuICAgIHtcclxuICAgICAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXlzW2ldKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEhhc0FsbDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogVmVyaWZpZXMgdGhhdCBhbiBvYmplY3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSByZXF1ZXN0ZWQga2V5c1xyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuSGFzQW55XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gc291cmNlIC0gYW4gb2JqZWN0IG9uIHdoaWNoIHRvIGNoZWNrIGZvciBrZXkgZXhpc3RlbmNlXHJcbiAqIEBwYXJhbSB7c3RyaW5nW119IGtleXMgLSBhbiBhcnJheSBvZiBrZXlzIHRvIHNlYXJjaCB0aGUgb2JqZWN0IGZvclxyXG4gKlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzb3VyY2Ugb2JqZWN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUga2V5cywgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAqL1xyXG52YXIgSGFzQW55ID0gZnVuY3Rpb24gKHNvdXJjZSwga2V5cylcclxue1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5c1tpXSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBIYXNBbnk7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzb3VyY2Ugb2JqZWN0IGhhcyBhIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuT2JqZWN0cy5IYXNWYWx1ZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGJlIGNoZWNrZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIHdpdGhpbiB0aGUgb2JqZWN0XHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcHJvdmlkZWQgYGtleWAgZXhpc3RzIG9uIHRoZSBgc291cmNlYCBvYmplY3QsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIEhhc1ZhbHVlID0gZnVuY3Rpb24gKHNvdXJjZSwga2V5KVxyXG57XHJcbiAgICByZXR1cm4gKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSGFzVmFsdWU7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIGpRdWVyeS5pc1BsYWluT2JqZWN0LlxyXG4gKiBBIHBsYWluIG9iamVjdCBpcyBhbiBvYmplY3Qgd2hvc2UgaW50ZXJuYWwgY2xhc3MgcHJvcGVydHkgaXMgW29iamVjdCBPYmplY3RdLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuSXNQbGFpbk9iamVjdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cclxuICpcclxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBvYmplY3QgaXMgcGxhaW4sIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIElzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiAob2JqKVxyXG57XHJcbiAgICAvLyBOb3QgcGxhaW4gb2JqZWN0czpcclxuICAgIC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcclxuICAgIC8vIC0gRE9NIG5vZGVzXHJcbiAgICAvLyAtIHdpbmRvd1xyXG4gICAgaWYgKHR5cGVvZihvYmopICE9PSAnb2JqZWN0JyB8fCBvYmoubm9kZVR5cGUgfHwgb2JqID09PSBvYmoud2luZG93KVxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdXBwb3J0OiBGaXJlZm94IDwyMFxyXG4gICAgLy8gVGhlIHRyeS9jYXRjaCBzdXBwcmVzc2VzIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBhY2Nlc3NcclxuICAgIC8vIHRoZSBcImNvbnN0cnVjdG9yXCIgcHJvcGVydHkgb2YgY2VydGFpbiBob3N0IG9iamVjdHMsIGllLiB8d2luZG93LmxvY2F0aW9ufFxyXG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODE0NjIyXHJcbiAgICB0cnlcclxuICAgIHtcclxuICAgICAgICBpZiAob2JqLmNvbnN0cnVjdG9yICYmICEoe30pLmhhc093blByb3BlcnR5LmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSlcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhc24ndCByZXR1cm5lZCBhbHJlYWR5LCB3ZSdyZSBjb25maWRlbnQgdGhhdFxyXG4gICAgLy8gfG9ianwgaXMgYSBwbGFpbiBvYmplY3QsIGNyZWF0ZWQgYnkge30gb3IgY29uc3RydWN0ZWQgd2l0aCBuZXcgT2JqZWN0XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gSXNQbGFpbk9iamVjdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG52YXIgQ2xvbmUgPSByZXF1aXJlKCcuL0Nsb25lJyk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBPYmplY3QgdXNpbmcgYWxsIHZhbHVlcyBmcm9tIG9iajEgYW5kIG9iajIuXHJcbiAqIElmIGEgdmFsdWUgZXhpc3RzIGluIGJvdGggb2JqMSBhbmQgb2JqMiwgdGhlIHZhbHVlIGluIG9iajEgaXMgdXNlZC5cclxuICogXHJcbiAqIFRoaXMgaXMgb25seSBhIHNoYWxsb3cgY29weS4gRGVlcGx5IG5lc3RlZCBvYmplY3RzIGFyZSBub3QgY2xvbmVkLCBzbyBiZSBzdXJlIHRvIG9ubHkgdXNlIHRoaXNcclxuICogZnVuY3Rpb24gb24gc2hhbGxvdyBvYmplY3RzLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuTWVyZ2VcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmoxIC0gVGhlIGZpcnN0IG9iamVjdC5cclxuICogQHBhcmFtIHtvYmplY3R9IG9iajIgLSBUaGUgc2Vjb25kIG9iamVjdC5cclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBBIG5ldyBvYmplY3QgY29udGFpbmluZyB0aGUgdW5pb24gb2Ygb2JqMSdzIGFuZCBvYmoyJ3MgcHJvcGVydGllcy5cclxuICovXHJcbnZhciBNZXJnZSA9IGZ1bmN0aW9uIChvYmoxLCBvYmoyKVxyXG57XHJcbiAgICB2YXIgY2xvbmUgPSBDbG9uZShvYmoxKTtcclxuXHJcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqMilcclxuICAgIHtcclxuICAgICAgICBpZiAoIWNsb25lLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjbG9uZVtrZXldID0gb2JqMltrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IE1lcmdlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBDbG9uZSA9IHJlcXVpcmUoJy4vQ2xvbmUnKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IE9iamVjdCB1c2luZyBhbGwgdmFsdWVzIGZyb20gb2JqMS5cclxuICogXHJcbiAqIFRoZW4gc2NhbnMgb2JqMi4gSWYgYSBwcm9wZXJ0eSBpcyBmb3VuZCBpbiBvYmoyIHRoYXQgKmFsc28qIGV4aXN0cyBpbiBvYmoxLCB0aGUgdmFsdWUgZnJvbSBvYmoyIGlzIHVzZWQsIG90aGVyd2lzZSB0aGUgcHJvcGVydHkgaXMgc2tpcHBlZC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5PYmplY3RzLk1lcmdlUmlnaHRcclxuICogQHNpbmNlIDMuMC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmoxIC0gVGhlIGZpcnN0IG9iamVjdCB0byBtZXJnZS5cclxuICogQHBhcmFtIHtvYmplY3R9IG9iajIgLSBUaGUgc2Vjb25kIG9iamVjdCB0byBtZXJnZS4gS2V5cyBmcm9tIHRoaXMgb2JqZWN0IHdoaWNoIGFsc28gZXhpc3QgaW4gYG9iajFgIHdpbGwgYmUgY29waWVkIHRvIGBvYmoxYC5cclxuICpcclxuICogQHJldHVybiB7b2JqZWN0fSBUaGUgbWVyZ2VkIG9iamVjdC4gYG9iajFgIGFuZCBgb2JqMmAgYXJlIG5vdCBtb2RpZmllZC5cclxuICovXHJcbnZhciBNZXJnZVJpZ2h0ID0gZnVuY3Rpb24gKG9iajEsIG9iajIpXHJcbntcclxuICAgIHZhciBjbG9uZSA9IENsb25lKG9iajEpO1xyXG5cclxuICAgIGZvciAodmFyIGtleSBpbiBvYmoyKVxyXG4gICAge1xyXG4gICAgICAgIGlmIChjbG9uZS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2xvbmVba2V5XSA9IG9iajJba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsb25lO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNZXJnZVJpZ2h0O1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbnZhciBIYXNWYWx1ZSA9IHJlcXVpcmUoJy4vSGFzVmFsdWUnKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGBrZXlzYCB0aGF0IHdlcmUgZm91bmQgb24gdGhlIG9iamVjdCBwcm92aWRlZC5cclxuICogSWYgbm8gYGtleXNgIGFyZSBmb3VuZCwgYW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuUGlja1xyXG4gKiBAc2luY2UgMy4xOC4wXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBpY2sgdGhlIHByb3ZpZGVkIGtleXMgZnJvbS5cclxuICogQHBhcmFtIHthcnJheX0ga2V5cyAtIEFuIGFycmF5IG9mIHByb3BlcnRpZXMgdG8gcmV0cmlldmUgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtvYmplY3R9IEEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGBrZXlzYCB0aGF0IHdlcmUgZm91bmQgb24gdGhlIHByb3ZpZGVkIG9iamVjdC4gSWYgbm8gYGtleXNgIHdlcmUgZm91bmQsIGFuIGVtcHR5IG9iamVjdCB3aWxsIGJlIHJldHVybmVkLlxyXG4gKi9cclxudmFyIFBpY2sgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXlzKVxyXG57XHJcbiAgICB2YXIgb2JqID0ge307XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xyXG5cclxuICAgICAgICBpZiAoSGFzVmFsdWUob2JqZWN0LCBrZXkpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2JqW2tleV0gPSBvYmplY3Rba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGljaztcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyBhIHZhbHVlIGluIGFuIG9iamVjdCwgYWxsb3dpbmcgZm9yIGRvdCBub3RhdGlvbiB0byBjb250cm9sIHRoZSBkZXB0aCBvZiB0aGUgcHJvcGVydHkuXHJcbiAqIFxyXG4gKiBGb3IgZXhhbXBsZTpcclxuICogXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogdmFyIGRhdGEgPSB7XHJcbiAqICAgd29ybGQ6IHtcclxuICogICAgIHBvc2l0aW9uOiB7XHJcbiAqICAgICAgIHg6IDIwMCxcclxuICogICAgICAgeTogMTAwXHJcbiAqICAgICB9XHJcbiAqICAgfVxyXG4gKiB9O1xyXG4gKiBcclxuICogU2V0VmFsdWUoZGF0YSwgJ3dvcmxkLnBvc2l0aW9uLnknLCAzMDApO1xyXG4gKiBcclxuICogY29uc29sZS5sb2coZGF0YS53b3JsZC5wb3NpdGlvbi55KTsgLy8gMzAwXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLk9iamVjdHMuU2V0VmFsdWVcclxuICogQHNpbmNlIDMuMTcuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge29iamVjdH0gc291cmNlIC0gVGhlIG9iamVjdCB0byBzZXQgdGhlIHZhbHVlIGluLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvYmplY3QuIElmIGEgcHJvcGVydHkgaXMgbmVzdGVkLCB0aGUgbmFtZXMgb2YgaXRzIHByZWNlZGluZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgYSBkb3QgKGAuYClcclxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBpbnRvIHRoZSBwcm9wZXJ0eSwgaWYgZm91bmQgaW4gdGhlIHNvdXJjZSBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcHJvcGVydHkga2V5IHdhcyB2YWxpZCBhbmQgdGhlIHZhbHVlIHdhcyBzZXQsIG90aGVyd2lzZSBgZmFsc2VgLlxyXG4gKi9cclxudmFyIFNldFZhbHVlID0gZnVuY3Rpb24gKHNvdXJjZSwga2V5LCB2YWx1ZSlcclxue1xyXG4gICAgaWYgKCFzb3VyY2UgfHwgdHlwZW9mIHNvdXJjZSA9PT0gJ251bWJlcicpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkpXHJcbiAgICB7XHJcbiAgICAgICAgc291cmNlW2tleV0gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChrZXkuaW5kZXhPZignLicpICE9PSAtMSlcclxuICAgIHtcclxuICAgICAgICB2YXIga2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSBzb3VyY2U7XHJcbiAgICAgICAgdmFyIHByZXYgPSBzb3VyY2U7XHJcblxyXG4gICAgICAgIC8vICBVc2UgZm9yIGxvb3AgaGVyZSBzbyB3ZSBjYW4gYnJlYWsgZWFybHlcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50Lmhhc093blByb3BlcnR5KGtleXNbaV0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgWWVzIGl0IGhhcyBhIGtleSBwcm9wZXJ0eSwgbGV0J3MgY2Fycnkgb24gZG93blxyXG4gICAgICAgICAgICAgICAgcHJldiA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFtrZXlzW2ldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJldltrZXlzW2tleXMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNldFZhbHVlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIFBoYXNlci5VdGlscy5PYmplY3RzXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgQ2xvbmU6IHJlcXVpcmUoJy4vQ2xvbmUnKSxcclxuICAgIEV4dGVuZDogcmVxdWlyZSgnLi9FeHRlbmQnKSxcclxuICAgIEdldEFkdmFuY2VkVmFsdWU6IHJlcXVpcmUoJy4vR2V0QWR2YW5jZWRWYWx1ZScpLFxyXG4gICAgR2V0RmFzdFZhbHVlOiByZXF1aXJlKCcuL0dldEZhc3RWYWx1ZScpLFxyXG4gICAgR2V0TWluTWF4VmFsdWU6IHJlcXVpcmUoJy4vR2V0TWluTWF4VmFsdWUnKSxcclxuICAgIEdldFZhbHVlOiByZXF1aXJlKCcuL0dldFZhbHVlJyksXHJcbiAgICBIYXNBbGw6IHJlcXVpcmUoJy4vSGFzQWxsJyksXHJcbiAgICBIYXNBbnk6IHJlcXVpcmUoJy4vSGFzQW55JyksXHJcbiAgICBIYXNWYWx1ZTogcmVxdWlyZSgnLi9IYXNWYWx1ZScpLFxyXG4gICAgSXNQbGFpbk9iamVjdDogcmVxdWlyZSgnLi9Jc1BsYWluT2JqZWN0JyksXHJcbiAgICBNZXJnZTogcmVxdWlyZSgnLi9NZXJnZScpLFxyXG4gICAgTWVyZ2VSaWdodDogcmVxdWlyZSgnLi9NZXJnZVJpZ2h0JyksXHJcbiAgICBQaWNrOiByZXF1aXJlKCcuL1BpY2snKSxcclxuICAgIFNldFZhbHVlOiByZXF1aXJlKCcuL1NldFZhbHVlJylcclxuXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIGEgc3RyaW5nIGFuZCByZXBsYWNlcyBpbnN0YW5jZXMgb2YgbWFya2VycyB3aXRoIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXHJcbiAqIFRoZSBtYXJrZXJzIHRha2UgdGhlIGZvcm0gb2YgYCUxYCwgYCUyYCwgZXRjLiBJLmUuOlxyXG4gKlxyXG4gKiBgRm9ybWF0KFwiVGhlICUxIGlzIHdvcnRoICUyIGdvbGRcIiwgWyAnU3dvcmQnLCA1MDAgXSlgXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuU3RyaW5nLkZvcm1hdFxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVwbGFjZW1lbnQgbWFya2Vycy5cclxuICogQHBhcmFtIHthcnJheX0gdmFsdWVzIC0gQW4gYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIG1hcmtlcnMuIElmIG5vIHZhbHVlIGV4aXN0cyBhbiBlbXB0eSBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW5zdGVhZC5cclxuICpcclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgcmVwbGFjZWQgdmFsdWVzLlxyXG4gKi9cclxudmFyIEZvcm1hdCA9IGZ1bmN0aW9uIChzdHJpbmcsIHZhbHVlcylcclxue1xyXG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8lKFswLTldKykvZywgZnVuY3Rpb24gKHMsIG4pXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlc1tOdW1iZXIobikgLSAxXTtcclxuICAgIH0pO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBGb3JtYXQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRha2VzIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHBhZHMgaXQgb3V0LCB0byB0aGUgbGVuZ3RoIHJlcXVpcmVkLCB1c2luZyB0aGUgY2hhcmFjdGVyXHJcbiAqIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgaWYgeW91IG5lZWQgYSBzdHJpbmcgdG8gYmUgNiBjaGFyYWN0ZXJzIGxvbmcsIHlvdSBjYW4gY2FsbDpcclxuICpcclxuICogYHBhZCgnYm9iJywgNiwgJy0nLCAyKWBcclxuICpcclxuICogVGhpcyB3b3VsZCByZXR1cm46IGBib2ItLS1gIGFzIGl0IGhhcyBwYWRkZWQgaXQgb3V0IHRvIDYgY2hhcmFjdGVycywgdXNpbmcgdGhlIGAtYCBvbiB0aGUgcmlnaHQuXHJcbiAqXHJcbiAqIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gcGFkIG51bWJlcnMgKHRoZXkgYXJlIGFsd2F5cyByZXR1cm5lZCBhcyBzdHJpbmdzKTpcclxuICogXHJcbiAqIGBwYWQoNTEyLCA2LCAnMCcsIDEpYFxyXG4gKlxyXG4gKiBXb3VsZCByZXR1cm46IGAwMDA1MTJgIHdpdGggdGhlIHN0cmluZyBwYWRkZWQgdG8gdGhlIGxlZnQuXHJcbiAqXHJcbiAqIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgZGlyZWN0aW9uIGl0J2xsIHBhZCB0byBib3RoIHNpZGVzOlxyXG4gKiBcclxuICogYHBhZCgnYzY0JywgNywgJyonKWBcclxuICpcclxuICogV291bGQgcmV0dXJuOiBgKipjNjQqKmBcclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5TdHJpbmcuUGFkXHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8b2JqZWN0fSBzdHIgLSBUaGUgdGFyZ2V0IHN0cmluZy4gYHRvU3RyaW5nKClgIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBzdHJpbmcsIHdoaWNoIG1lYW5zIHlvdSBjYW4gYWxzbyBwYXNzIGluIGNvbW1vbiBkYXRhIHR5cGVzIGxpa2UgbnVtYmVycy5cclxuICogQHBhcmFtIHtpbnRlZ2VyfSBbbGVuPTBdIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGFkZGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhZD1cIiBcIl0gLSBUaGUgc3RyaW5nIHRvIHBhZCBpdCBvdXQgd2l0aCAoZGVmYXVsdHMgdG8gYSBzcGFjZSkuXHJcbiAqIEBwYXJhbSB7aW50ZWdlcn0gW2Rpcj0zXSAtIFRoZSBkaXJlY3Rpb24gZGlyID0gMSAobGVmdCksIDIgKHJpZ2h0KSwgMyAoYm90aCkuXHJcbiAqIFxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYWRkZWQgc3RyaW5nLlxyXG4gKi9cclxudmFyIFBhZCA9IGZ1bmN0aW9uIChzdHIsIGxlbiwgcGFkLCBkaXIpXHJcbntcclxuICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkgeyBsZW4gPSAwOyB9XHJcbiAgICBpZiAocGFkID09PSB1bmRlZmluZWQpIHsgcGFkID0gJyAnOyB9XHJcbiAgICBpZiAoZGlyID09PSB1bmRlZmluZWQpIHsgZGlyID0gMzsgfVxyXG5cclxuICAgIHN0ciA9IHN0ci50b1N0cmluZygpO1xyXG5cclxuICAgIHZhciBwYWRsZW4gPSAwO1xyXG5cclxuICAgIGlmIChsZW4gKyAxID49IHN0ci5sZW5ndGgpXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoIChkaXIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBuZXcgQXJyYXkobGVuICsgMSAtIHN0ci5sZW5ndGgpLmpvaW4ocGFkKSArIHN0cjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gTWF0aC5jZWlsKChwYWRsZW4gPSBsZW4gLSBzdHIubGVuZ3RoKSAvIDIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBwYWRsZW4gLSByaWdodDtcclxuICAgICAgICAgICAgICAgIHN0ciA9IG5ldyBBcnJheShsZWZ0ICsgMSkuam9pbihwYWQpICsgc3RyICsgbmV3IEFycmF5KHJpZ2h0ICsgMSkuam9pbihwYWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgc3RyID0gc3RyICsgbmV3IEFycmF5KGxlbiArIDEgLSBzdHIubGVuZ3RoKS5qb2luKHBhZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0cjtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gUGFkO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUYWtlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXZlcnNlcyBpdCwgcmV0dXJuaW5nIHRoZSByZXZlcnNlZCBzdHJpbmcuXHJcbiAqIEZvciBleGFtcGxlIGlmIGdpdmVuIHRoZSBzdHJpbmcgYEF0YXJpIDUyMFNUYCBpdCB3b3VsZCByZXR1cm4gYFRTMDI1IGlyYXRBYC5cclxuICpcclxuICogQGZ1bmN0aW9uIFBoYXNlci5VdGlscy5TdHJpbmcuUmV2ZXJzZVxyXG4gKiBAc2luY2UgMy4wLjBcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gYmUgcmV2ZXJzZWQuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJldmVyc2VkIHN0cmluZy5cclxuICovXHJcbnZhciBSZXZlcnNlID0gZnVuY3Rpb24gKHN0cmluZylcclxue1xyXG4gICAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBSZXZlcnNlO1xyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgICBSaWNoYXJkIERhdmV5IDxyaWNoQHBob3RvbnN0b3JtLmNvbT5cclxuICogQGNvcHlyaWdodCAgICAyMDIwIFBob3RvbiBTdG9ybSBMdGQuXHJcbiAqIEBsaWNlbnNlICAgICAge0BsaW5rIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUfE1JVCBMaWNlbnNlfVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIFJGQzQxMjIgdmVyc2lvbiA0IGNvbXBsaWFudCBVVUlELlxyXG4gKiBcclxuICogVGhlIHN0cmluZyBpcyBpbiB0aGUgZm9ybTogYHh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eGAgd2hlcmUgZWFjaCBgeGAgaXMgcmVwbGFjZWQgd2l0aCBhIHJhbmRvbVxyXG4gKiBoZXhhZGVjaW1hbCBkaWdpdCBmcm9tIDAgdG8gZiwgYW5kIGB5YCBpcyByZXBsYWNlZCB3aXRoIGEgcmFuZG9tIGhleGFkZWNpbWFsIGRpZ2l0IGZyb20gOCB0byBiLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gUGhhc2VyLlV0aWxzLlN0cmluZy5VVUlEXHJcbiAqIEBzaW5jZSAzLjEyLjBcclxuICpcclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVVJRCBzdHJpbmcuXHJcbiAqL1xyXG52YXIgVVVJRCA9IGZ1bmN0aW9uICgpXHJcbntcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcclxuICAgICAgICB2YXIgdiA9IChjID09PSAneCcpID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFVVSUQ7XHJcbiIsIi8qKlxyXG4gKiBAYXV0aG9yICAgICAgIFJpY2hhcmQgRGF2ZXkgPHJpY2hAcGhvdG9uc3Rvcm0uY29tPlxyXG4gKiBAY29weXJpZ2h0ICAgIDIwMjAgUGhvdG9uIFN0b3JtIEx0ZC5cclxuICogQGxpY2Vuc2UgICAgICB7QGxpbmsgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVR8TUlUIExpY2Vuc2V9XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgYSBzdHJpbmcgaWYgdGhlcmUgaXMgb25lLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBVcHBlcmNhc2VGaXJzdCgnYWJjJyk7XHJcbiAqIC8vIHJldHVybnMgJ0FiYydcclxuICogQGV4YW1wbGVcclxuICogVXBwZXJjYXNlRmlyc3QoJ3RoZSBoYXBweSBmYW1pbHknKTtcclxuICogLy8gcmV0dXJucyAnVGhlIGhhcHB5IGZhbWlseSdcclxuICogQGV4YW1wbGVcclxuICogVXBwZXJjYXNlRmlyc3QoJycpO1xyXG4gKiAvLyByZXR1cm5zICcnXHJcbiAqXHJcbiAqIEBmdW5jdGlvbiBQaGFzZXIuVXRpbHMuU3RyaW5nLlVwcGVyY2FzZUZpcnN0XHJcbiAqIEBzaW5jZSAzLjAuMFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgbmV3IHN0cmluZywgc2FtZSBhcyB0aGUgZmlyc3QsIGJ1dCB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuXHJcbiAqL1xyXG52YXIgVXBwZXJjYXNlRmlyc3QgPSBmdW5jdGlvbiAoc3RyKVxyXG57XHJcbiAgICByZXR1cm4gc3RyICYmIHN0clswXS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBVcHBlcmNhc2VGaXJzdDtcclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgICAgUmljaGFyZCBEYXZleSA8cmljaEBwaG90b25zdG9ybS5jb20+XHJcbiAqIEBjb3B5cmlnaHQgICAgMjAyMCBQaG90b24gU3Rvcm0gTHRkLlxyXG4gKiBAbGljZW5zZSAgICAgIHtAbGluayBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVHxNSVQgTGljZW5zZX1cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBQaGFzZXIuVXRpbHMuU3RyaW5nXHJcbiAqL1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblxyXG4gICAgRm9ybWF0OiByZXF1aXJlKCcuL0Zvcm1hdCcpLFxyXG4gICAgUGFkOiByZXF1aXJlKCcuL1BhZCcpLFxyXG4gICAgUmV2ZXJzZTogcmVxdWlyZSgnLi9SZXZlcnNlJyksXHJcbiAgICBVcHBlcmNhc2VGaXJzdDogcmVxdWlyZSgnLi9VcHBlcmNhc2VGaXJzdCcpLFxyXG4gICAgVVVJRDogcmVxdWlyZSgnLi9VVUlEJylcclxuXHJcbn07XHJcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdGlmKF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0pIHtcblx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiBtb2R1bGVbJ2RlZmF1bHQnXSA6XG5cdFx0KCkgPT4gbW9kdWxlO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5obWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZSA9IE9iamVjdC5jcmVhdGUobW9kdWxlKTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdHNldDogKCkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdFUyBNb2R1bGVzIG1heSBub3QgYXNzaWduIG1vZHVsZS5leHBvcnRzIG9yIGV4cG9ydHMuKiwgVXNlIEVTTSBleHBvcnQgc3ludGF4LCBpbnN0ZWFkOiAnICsgbW9kdWxlLmlkKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gIH1cbiAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTbGljZTtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlcTtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuZXhwb3J0IGRlZmF1bHQgU3ltYm9sO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBvYmplY3RUb1N0cmluZztcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBnZXRSYXdUYWcgZnJvbSAnLi9fZ2V0UmF3VGFnLmpzJztcbmltcG9ydCBvYmplY3RUb1N0cmluZyBmcm9tICcuL19vYmplY3RUb1N0cmluZy5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzT2JqZWN0O1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTGVuZ3RoO1xuIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc0xlbmd0aCBmcm9tICcuL2lzTGVuZ3RoLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXlMaWtlO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0luZGV4O1xuIiwiaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNJdGVyYXRlZUNhbGw7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNPYmplY3RMaWtlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N5bWJvbDtcbiIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b051bWJlcjtcbiIsImltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRmluaXRlO1xuIiwiaW1wb3J0IHRvRmluaXRlIGZyb20gJy4vdG9GaW5pdGUuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0ludGVnZXI7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gKiBJZiBgYXJyYXlgIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICogZWxlbWVudHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gKlxuICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAqL1xuZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHNpemUgPSAxO1xuICB9IGVsc2Uge1xuICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBpbmRleCA9IDAsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBiYXNlU2xpY2UoYXJyYXksIGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNodW5rO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IHdpdGggYWxsIGZhbHNleSB2YWx1ZXMgcmVtb3ZlZC4gVGhlIHZhbHVlcyBgZmFsc2VgLCBgbnVsbGAsXG4gKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcGFjdDtcbiIsIi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlQdXNoO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzQXJndW1lbnRzO1xuIiwiaW1wb3J0IGJhc2VJc0FyZ3VtZW50cyBmcm9tICcuL19iYXNlSXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpc0FyZ3VtZW50cztcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5leHBvcnQgZGVmYXVsdCBpc0FycmF5O1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IGlzQXJndW1lbnRzIGZyb20gJy4vaXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRmxhdHRlbmFibGU7XG4iLCJpbXBvcnQgYXJyYXlQdXNoIGZyb20gJy4vX2FycmF5UHVzaC5qcyc7XG5pbXBvcnQgaXNGbGF0dGVuYWJsZSBmcm9tICcuL19pc0ZsYXR0ZW5hYmxlLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGbGF0dGVuO1xuIiwiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvcHlBcnJheTtcbiIsImltcG9ydCBhcnJheVB1c2ggZnJvbSAnLi9fYXJyYXlQdXNoLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gKiBhbmQvb3IgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbMV07XG4gKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7XG4gKlxuICogY29uc29sZS5sb2cob3RoZXIpO1xuICogLy8gPT4gWzEsIDIsIDMsIFs0XV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gKiAvLyA9PiBbMV1cbiAqL1xuZnVuY3Rpb24gY29uY2F0KCkge1xuICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25jYXQ7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuZXhwb3J0IGRlZmF1bHQgY29yZUpzRGF0YTtcbiIsImltcG9ydCBjb3JlSnNEYXRhIGZyb20gJy4vX2NvcmVKc0RhdGEuanMnO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9Tb3VyY2U7XG4iLCJpbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzRnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzTWFza2VkIGZyb20gJy4vX2lzTWFza2VkLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCB0b1NvdXJjZSBmcm9tICcuL190b1NvdXJjZS5qcyc7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc05hdGl2ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRWYWx1ZTtcbiIsImltcG9ydCBiYXNlSXNOYXRpdmUgZnJvbSAnLi9fYmFzZUlzTmF0aXZlLmpzJztcbmltcG9ydCBnZXRWYWx1ZSBmcm9tICcuL19nZXRWYWx1ZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldE5hdGl2ZTtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuZXhwb3J0IGRlZmF1bHQgbmF0aXZlQ3JlYXRlO1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaERlbGV0ZTtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoR2V0O1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hIYXM7XG4iLCJpbXBvcnQgbmF0aXZlQ3JlYXRlIGZyb20gJy4vX25hdGl2ZUNyZWF0ZS5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoU2V0O1xuIiwiaW1wb3J0IGhhc2hDbGVhciBmcm9tICcuL19oYXNoQ2xlYXIuanMnO1xuaW1wb3J0IGhhc2hEZWxldGUgZnJvbSAnLi9faGFzaERlbGV0ZS5qcyc7XG5pbXBvcnQgaGFzaEdldCBmcm9tICcuL19oYXNoR2V0LmpzJztcbmltcG9ydCBoYXNoSGFzIGZyb20gJy4vX2hhc2hIYXMuanMnO1xuaW1wb3J0IGhhc2hTZXQgZnJvbSAnLi9faGFzaFNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBIYXNoO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVDbGVhcjtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNzb2NJbmRleE9mO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZURlbGV0ZTtcbiIsImltcG9ydCBhc3NvY0luZGV4T2YgZnJvbSAnLi9fYXNzb2NJbmRleE9mLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlR2V0O1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlSGFzO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxpc3RDYWNoZVNldDtcbiIsImltcG9ydCBsaXN0Q2FjaGVDbGVhciBmcm9tICcuL19saXN0Q2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbGlzdENhY2hlRGVsZXRlIGZyb20gJy4vX2xpc3RDYWNoZURlbGV0ZS5qcyc7XG5pbXBvcnQgbGlzdENhY2hlR2V0IGZyb20gJy4vX2xpc3RDYWNoZUdldC5qcyc7XG5pbXBvcnQgbGlzdENhY2hlSGFzIGZyb20gJy4vX2xpc3RDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbGlzdENhY2hlU2V0IGZyb20gJy4vX2xpc3RDYWNoZVNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdENhY2hlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG4iLCJpbXBvcnQgSGFzaCBmcm9tICcuL19IYXNoLmpzJztcbmltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcbmltcG9ydCBNYXAgZnJvbSAnLi9fTWFwLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUNsZWFyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleWFibGU7XG4iLCJpbXBvcnQgaXNLZXlhYmxlIGZyb20gJy4vX2lzS2V5YWJsZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWFwRGF0YTtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVEZWxldGU7XG4iLCJpbXBvcnQgZ2V0TWFwRGF0YSBmcm9tICcuL19nZXRNYXBEYXRhLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUdldDtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUhhcztcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcENhY2hlU2V0O1xuIiwiaW1wb3J0IG1hcENhY2hlQ2xlYXIgZnJvbSAnLi9fbWFwQ2FjaGVDbGVhci5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVEZWxldGUgZnJvbSAnLi9fbWFwQ2FjaGVEZWxldGUuanMnO1xuaW1wb3J0IG1hcENhY2hlR2V0IGZyb20gJy4vX21hcENhY2hlR2V0LmpzJztcbmltcG9ydCBtYXBDYWNoZUhhcyBmcm9tICcuL19tYXBDYWNoZUhhcy5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVTZXQgZnJvbSAnLi9fbWFwQ2FjaGVTZXQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuZXhwb3J0IGRlZmF1bHQgTWFwQ2FjaGU7XG4iLCIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldENhY2hlSGFzO1xuIiwiaW1wb3J0IE1hcENhY2hlIGZyb20gJy4vX01hcENhY2hlLmpzJztcbmltcG9ydCBzZXRDYWNoZUFkZCBmcm9tICcuL19zZXRDYWNoZUFkZC5qcyc7XG5pbXBvcnQgc2V0Q2FjaGVIYXMgZnJvbSAnLi9fc2V0Q2FjaGVIYXMuanMnO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbmV4cG9ydCBkZWZhdWx0IFNldENhY2hlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGaW5kSW5kZXg7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNOYU47XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmljdEluZGV4T2Y7XG4iLCJpbXBvcnQgYmFzZUZpbmRJbmRleCBmcm9tICcuL19iYXNlRmluZEluZGV4LmpzJztcbmltcG9ydCBiYXNlSXNOYU4gZnJvbSAnLi9fYmFzZUlzTmFOLmpzJztcbmltcG9ydCBzdHJpY3RJbmRleE9mIGZyb20gJy4vX3N0cmljdEluZGV4T2YuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW5kZXhPZjtcbiIsImltcG9ydCBiYXNlSW5kZXhPZiBmcm9tICcuL19iYXNlSW5kZXhPZi5qcyc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5SW5jbHVkZXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUluY2x1ZGVzV2l0aDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5TWFwO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVW5hcnk7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FjaGVIYXM7XG4iLCJpbXBvcnQgU2V0Q2FjaGUgZnJvbSAnLi9fU2V0Q2FjaGUuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlc1dpdGggZnJvbSAnLi9fYXJyYXlJbmNsdWRlc1dpdGguanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgfVxuICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRGlmZmVyZW5jZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlkZW50aXR5O1xuIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcHBseTtcbiIsImltcG9ydCBhcHBseSBmcm9tICcuL19hcHBseS5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG92ZXJSZXN0O1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnN0YW50O1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lUHJvcGVydHk7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSAnLi9jb25zdGFudC5qcyc7XG5pbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSAnLi9fZGVmaW5lUHJvcGVydHkuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNldFRvU3RyaW5nO1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaG9ydE91dDtcbiIsImltcG9ydCBiYXNlU2V0VG9TdHJpbmcgZnJvbSAnLi9fYmFzZVNldFRvU3RyaW5nLmpzJztcbmltcG9ydCBzaG9ydE91dCBmcm9tICcuL19zaG9ydE91dC5qcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbmV4cG9ydCBkZWZhdWx0IHNldFRvU3RyaW5nO1xuIiwiaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IG92ZXJSZXN0IGZyb20gJy4vX292ZXJSZXN0LmpzJztcbmltcG9ydCBzZXRUb1N0cmluZyBmcm9tICcuL19zZXRUb1N0cmluZy5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUmVzdDtcbiIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwiaW1wb3J0IGJhc2VEaWZmZXJlbmNlIGZyb20gJy4vX2Jhc2VEaWZmZXJlbmNlLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICA6IFtdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7XG4iLCJpbXBvcnQgTGlzdENhY2hlIGZyb20gJy4vX0xpc3RDYWNoZS5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YWNrQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YWNrSGFzO1xuIiwiaW1wb3J0IExpc3RDYWNoZSBmcm9tICcuL19MaXN0Q2FjaGUuanMnO1xuaW1wb3J0IE1hcCBmcm9tICcuL19NYXAuanMnO1xuaW1wb3J0IE1hcENhY2hlIGZyb20gJy4vX01hcENhY2hlLmpzJztcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gIH1cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YWNrU2V0O1xuIiwiaW1wb3J0IExpc3RDYWNoZSBmcm9tICcuL19MaXN0Q2FjaGUuanMnO1xuaW1wb3J0IHN0YWNrQ2xlYXIgZnJvbSAnLi9fc3RhY2tDbGVhci5qcyc7XG5pbXBvcnQgc3RhY2tEZWxldGUgZnJvbSAnLi9fc3RhY2tEZWxldGUuanMnO1xuaW1wb3J0IHN0YWNrR2V0IGZyb20gJy4vX3N0YWNrR2V0LmpzJztcbmltcG9ydCBzdGFja0hhcyBmcm9tICcuL19zdGFja0hhcy5qcyc7XG5pbXBvcnQgc3RhY2tTZXQgZnJvbSAnLi9fc3RhY2tTZXQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YWNrO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlTb21lO1xuIiwiaW1wb3J0IFNldENhY2hlIGZyb20gJy4vX1NldENhY2hlLmpzJztcbmltcG9ydCBhcnJheVNvbWUgZnJvbSAnLi9fYXJyYXlTb21lLmpzJztcbmltcG9ydCBjYWNoZUhhcyBmcm9tICcuL19jYWNoZUhhcy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxdWFsQXJyYXlzO1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbmV4cG9ydCBkZWZhdWx0IFVpbnQ4QXJyYXk7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0VG9BcnJheTtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBVaW50OEFycmF5IGZyb20gJy4vX1VpbnQ4QXJyYXkuanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuaW1wb3J0IGVxdWFsQXJyYXlzIGZyb20gJy4vX2VxdWFsQXJyYXlzLmpzJztcbmltcG9ydCBtYXBUb0FycmF5IGZyb20gJy4vX21hcFRvQXJyYXkuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxdWFsQnlUYWc7XG4iLCJpbXBvcnQgYXJyYXlQdXNoIGZyb20gJy4vX2FycmF5UHVzaC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRBbGxLZXlzO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUZpbHRlcjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0dWJBcnJheTtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgc3R1YkFycmF5IGZyb20gJy4vc3R1YkFycmF5LmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRTeW1ib2xzO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVRpbWVzO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNMZW5ndGggZnJvbSAnLi9pc0xlbmd0aC5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNUeXBlZEFycmF5O1xuIiwiaW1wb3J0IGJhc2VJc1R5cGVkQXJyYXkgZnJvbSAnLi9fYmFzZUlzVHlwZWRBcnJheS5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgbm9kZVV0aWwgZnJvbSAnLi9fbm9kZVV0aWwuanMnO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgaXNUeXBlZEFycmF5O1xuIiwiaW1wb3J0IGJhc2VUaW1lcyBmcm9tICcuL19iYXNlVGltZXMuanMnO1xuaW1wb3J0IGlzQXJndW1lbnRzIGZyb20gJy4vaXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0J1ZmZlciBmcm9tICcuL2lzQnVmZmVyLmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuaW1wb3J0IGlzVHlwZWRBcnJheSBmcm9tICcuL2lzVHlwZWRBcnJheS5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICApKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlMaWtlS2V5cztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQcm90b3R5cGU7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlckFyZztcbiIsImltcG9ydCBvdmVyQXJnIGZyb20gJy4vX292ZXJBcmcuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IG5hdGl2ZUtleXM7XG4iLCJpbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuaW1wb3J0IG5hdGl2ZUtleXMgZnJvbSAnLi9fbmF0aXZlS2V5cy5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUtleXM7XG4iLCJpbXBvcnQgYXJyYXlMaWtlS2V5cyBmcm9tICcuL19hcnJheUxpa2VLZXlzLmpzJztcbmltcG9ydCBiYXNlS2V5cyBmcm9tICcuL19iYXNlS2V5cy5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBrZXlzO1xuIiwiaW1wb3J0IGJhc2VHZXRBbGxLZXlzIGZyb20gJy4vX2Jhc2VHZXRBbGxLZXlzLmpzJztcbmltcG9ydCBnZXRTeW1ib2xzIGZyb20gJy4vX2dldFN5bWJvbHMuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0QWxsS2V5cztcbiIsImltcG9ydCBnZXRBbGxLZXlzIGZyb20gJy4vX2dldEFsbEtleXMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxPYmplY3RzO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0YVZpZXc7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvbWlzZTtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxuZXhwb3J0IGRlZmF1bHQgU2V0O1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XG4iLCJpbXBvcnQgRGF0YVZpZXcgZnJvbSAnLi9fRGF0YVZpZXcuanMnO1xuaW1wb3J0IE1hcCBmcm9tICcuL19NYXAuanMnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnLi9fUHJvbWlzZS5qcyc7XG5pbXBvcnQgU2V0IGZyb20gJy4vX1NldC5qcyc7XG5pbXBvcnQgV2Vha01hcCBmcm9tICcuL19XZWFrTWFwLmpzJztcbmltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IHRvU291cmNlIGZyb20gJy4vX3RvU291cmNlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VGFnO1xuIiwiaW1wb3J0IFN0YWNrIGZyb20gJy4vX1N0YWNrLmpzJztcbmltcG9ydCBlcXVhbEFycmF5cyBmcm9tICcuL19lcXVhbEFycmF5cy5qcyc7XG5pbXBvcnQgZXF1YWxCeVRhZyBmcm9tICcuL19lcXVhbEJ5VGFnLmpzJztcbmltcG9ydCBlcXVhbE9iamVjdHMgZnJvbSAnLi9fZXF1YWxPYmplY3RzLmpzJztcbmltcG9ydCBnZXRUYWcgZnJvbSAnLi9fZ2V0VGFnLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNUeXBlZEFycmF5IGZyb20gJy4vaXNUeXBlZEFycmF5LmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICBvYmpJc09iaiA9IGZhbHNlO1xuICB9XG4gIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gIH1cbiAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICB9XG4gIGlmICghaXNTYW1lVGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc0VxdWFsRGVlcDtcbiIsImltcG9ydCBiYXNlSXNFcXVhbERlZXAgZnJvbSAnLi9fYmFzZUlzRXF1YWxEZWVwLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzRXF1YWw7XG4iLCJpbXBvcnQgU3RhY2sgZnJvbSAnLi9fU3RhY2suanMnO1xuaW1wb3J0IGJhc2VJc0VxdWFsIGZyb20gJy4vX2Jhc2VJc0VxdWFsLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc01hdGNoO1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsImltcG9ydCBpc1N0cmljdENvbXBhcmFibGUgZnJvbSAnLi9faXNTdHJpY3RDb21wYXJhYmxlLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRNYXRjaERhdGE7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlO1xuIiwiaW1wb3J0IGJhc2VJc01hdGNoIGZyb20gJy4vX2Jhc2VJc01hdGNoLmpzJztcbmltcG9ydCBnZXRNYXRjaERhdGEgZnJvbSAnLi9fZ2V0TWF0Y2hEYXRhLmpzJztcbmltcG9ydCBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSBmcm9tICcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlTWF0Y2hlcztcbiIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNLZXk7XG4iLCJpbXBvcnQgTWFwQ2FjaGUgZnJvbSAnLi9fTWFwQ2FjaGUuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemU7XG4iLCJpbXBvcnQgbWVtb2l6ZUNhcHBlZCBmcm9tICcuL19tZW1vaXplQ2FwcGVkLmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdUb1BhdGg7XG4iLCJpbXBvcnQgbWVtb2l6ZSBmcm9tICcuL21lbW9pemUuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemVDYXBwZWQ7XG4iLCJpbXBvcnQgU3ltYm9sIGZyb20gJy4vX1N5bWJvbC5qcyc7XG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVRvU3RyaW5nO1xuIiwiaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvU3RyaW5nO1xuIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0tleSBmcm9tICcuL19pc0tleS5qcyc7XG5pbXBvcnQgc3RyaW5nVG9QYXRoIGZyb20gJy4vX3N0cmluZ1RvUGF0aC5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RQYXRoO1xuIiwiaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9LZXk7XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUdldDtcbiIsImltcG9ydCBiYXNlR2V0IGZyb20gJy4vX2Jhc2VHZXQuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSGFzSW47XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IGlzQXJndW1lbnRzIGZyb20gJy4vaXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuaW1wb3J0IGlzTGVuZ3RoIGZyb20gJy4vaXNMZW5ndGguanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc1BhdGg7XG4iLCJpbXBvcnQgYmFzZUhhc0luIGZyb20gJy4vX2Jhc2VIYXNJbi5qcyc7XG5pbXBvcnQgaGFzUGF0aCBmcm9tICcuL19oYXNQYXRoLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNJbjtcbiIsImltcG9ydCBiYXNlSXNFcXVhbCBmcm9tICcuL19iYXNlSXNFcXVhbC5qcyc7XG5pbXBvcnQgZ2V0IGZyb20gJy4vZ2V0LmpzJztcbmltcG9ydCBoYXNJbiBmcm9tICcuL2hhc0luLmpzJztcbmltcG9ydCBpc0tleSBmcm9tICcuL19pc0tleS5qcyc7XG5pbXBvcnQgaXNTdHJpY3RDb21wYXJhYmxlIGZyb20gJy4vX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyc7XG5pbXBvcnQgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgZnJvbSAnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVByb3BlcnR5O1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUHJvcGVydHlEZWVwO1xuIiwiaW1wb3J0IGJhc2VQcm9wZXJ0eSBmcm9tICcuL19iYXNlUHJvcGVydHkuanMnO1xuaW1wb3J0IGJhc2VQcm9wZXJ0eURlZXAgZnJvbSAnLi9fYmFzZVByb3BlcnR5RGVlcC5qcyc7XG5pbXBvcnQgaXNLZXkgZnJvbSAnLi9faXNLZXkuanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwcm9wZXJ0eTtcbiIsImltcG9ydCBiYXNlTWF0Y2hlcyBmcm9tICcuL19iYXNlTWF0Y2hlcy5qcyc7XG5pbXBvcnQgYmFzZU1hdGNoZXNQcm9wZXJ0eSBmcm9tICcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5LmpzJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgcHJvcGVydHkgZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICB9XG4gIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJdGVyYXRlZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsYXN0O1xuIiwiaW1wb3J0IGJhc2VEaWZmZXJlbmNlIGZyb20gJy4vX2Jhc2VEaWZmZXJlbmNlLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuaW1wb3J0IGxhc3QgZnJvbSAnLi9sYXN0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICogKHZhbHVlKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gKiAvLyA9PiBbMS4yXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAqL1xudmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGl0ZXJhdGVlID0gbGFzdCh2YWx1ZXMpO1xuICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgIDogW107XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUJ5O1xuIiwiaW1wb3J0IGJhc2VEaWZmZXJlbmNlIGZyb20gJy4vX2Jhc2VEaWZmZXJlbmNlLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuaW1wb3J0IGxhc3QgZnJvbSAnLi9sYXN0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIG9yZGVyIGFuZFxuICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICpcbiAqIF8uZGlmZmVyZW5jZVdpdGgob2JqZWN0cywgW3sgJ3gnOiAxLCAneSc6IDIgfV0sIF8uaXNFcXVhbCk7XG4gKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICovXG52YXIgZGlmZmVyZW5jZVdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICBjb21wYXJhdG9yID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgIDogW107XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZVdpdGg7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAqIC8vID0+IFsyLCAzXVxuICpcbiAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICogLy8gPT4gWzNdXG4gKlxuICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gKiAvLyA9PiBbXVxuICpcbiAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKi9cbmZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZHJvcDtcbiIsImltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gZHJvcC5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICogLy8gPT4gWzFdXG4gKlxuICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAqIC8vID0+IFtdXG4gKlxuICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICovXG5mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgbiA9IGxlbmd0aCAtIG47XG4gIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkcm9wUmlnaHQ7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICBwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7fVxuXG4gIHJldHVybiBpc0Ryb3BcbiAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgIDogYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogMCksIChmcm9tUmlnaHQgPyBsZW5ndGggOiBpbmRleCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlV2hpbGU7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVdoaWxlIGZyb20gJy4vX2Jhc2VXaGlsZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAqL1xuZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VXaGlsZShhcnJheSwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUsIHRydWUpXG4gICAgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZHJvcFJpZ2h0V2hpbGU7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVdoaWxlIGZyb20gJy4vX2Jhc2VXaGlsZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5kcm9wV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAqL1xuZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlV2hpbGUoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3BXaGlsZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgIH1cbiAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDbGFtcDtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xudmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAqIGFycmF5LWxpa2Ugb2JqZWN0LlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTGVuZ3RoKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IDQyOTQ5NjcyOTVcbiAqXG4gKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9MZW5ndGg7XG4iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcbmltcG9ydCB0b0xlbmd0aCBmcm9tICcuL3RvTGVuZ3RoLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICB9XG4gIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlbmd0aDtcbiAgfVxuICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBhcnJheVtzdGFydCsrXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZpbGw7XG4iLCJpbXBvcnQgYmFzZUZpbGwgZnJvbSAnLi9fYmFzZUZpbGwuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcblxuLyoqXG4gKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAqIGluY2x1ZGluZywgYGVuZGAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMi4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gKlxuICogXy5maWxsKGFycmF5LCAnYScpO1xuICogY29uc29sZS5sb2coYXJyYXkpO1xuICogLy8gPT4gWydhJywgJ2EnLCAnYSddXG4gKlxuICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAqIC8vID0+IFsyLCAyLCAyXVxuICpcbiAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICogLy8gPT4gWzQsICcqJywgJyonLCAxMF1cbiAqL1xuZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgc3RhcnQgPSAwO1xuICAgIGVuZCA9IGxlbmd0aDtcbiAgfVxuICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmlsbDtcbiIsImltcG9ydCBiYXNlRmluZEluZGV4IGZyb20gJy4vX2Jhc2VGaW5kSW5kZXguanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gMlxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDtcbiIsImltcG9ydCBiYXNlRmluZEluZGV4IGZyb20gJy4vX2Jhc2VGaW5kSW5kZXguanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gKiAvLyA9PiAyXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IDJcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gMFxuICovXG5mdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgaW5kZXggPSBmcm9tSW5kZXggPCAwXG4gICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4LCB0cnVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZExhc3RJbmRleDtcbiIsIi8qKlxuICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBmaXJzdFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmhlYWQoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDFcbiAqXG4gKiBfLmhlYWQoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGhlYWQoYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhlYWQ7XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbjtcbiIsImltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIElORklOSVRZKSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmbGF0dGVuRGVlcDtcbiIsImltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAqXG4gKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKlxuICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDIpO1xuICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkRlcHRoKGFycmF5LCBkZXB0aCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICByZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbkRlcHRoO1xuIiwiLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiBgXy50b1BhaXJzYDsgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgY29tcG9zZWRcbiAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbmZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZyb21QYWlycztcbiIsImltcG9ydCBiYXNlSW5kZXhPZiBmcm9tICcuL19iYXNlSW5kZXhPZi5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAqIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbmRleE9mO1xuIiwiaW1wb3J0IGJhc2VTbGljZSBmcm9tICcuL19iYXNlU2xpY2UuanMnO1xuXG4vKipcbiAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdGlhbDtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlcyBmcm9tICcuL19hcnJheUluY2x1ZGVzLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzV2l0aCBmcm9tICcuL19hcnJheUluY2x1ZGVzV2l0aC5qcyc7XG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VVbmFyeSBmcm9tICcuL19iYXNlVW5hcnkuanMnO1xuaW1wb3J0IGNhY2hlSGFzIGZyb20gJy4vX2NhY2hlSGFzLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gLCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgbWF4TGVuZ3RoID0gSW5maW5pdHksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07XG4gICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICB9XG4gICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuICBhcnJheSA9IGFycmF5c1swXTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmICghKHNlZW5cbiAgICAgICAgICA/IGNhY2hlSGFzKHNlZW4sIGNvbXB1dGVkKVxuICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgKSkge1xuICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGg7XG4gICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAoIShjYWNoZVxuICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUludGVyc2VjdGlvbjtcbiIsImltcG9ydCBpc0FycmF5TGlrZU9iamVjdCBmcm9tICcuL2lzQXJyYXlMaWtlT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IGFuIGFycmF5IGxpa2Ugb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FzdEFycmF5TGlrZU9iamVjdDtcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZUludGVyc2VjdGlvbiBmcm9tICcuL19iYXNlSW50ZXJzZWN0aW9uLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgY2FzdEFycmF5TGlrZU9iamVjdCBmcm9tICcuL19jYXN0QXJyYXlMaWtlT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAqIC8vID0+IFsyXVxuICovXG52YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHZhciBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICA6IFtdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGludGVyc2VjdGlvbjtcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZUludGVyc2VjdGlvbiBmcm9tICcuL19iYXNlSW50ZXJzZWN0aW9uLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgY2FzdEFycmF5TGlrZU9iamVjdCBmcm9tICcuL19jYXN0QXJyYXlMaWtlT2JqZWN0LmpzJztcbmltcG9ydCBsYXN0IGZyb20gJy4vbGFzdC5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gKiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pbnRlcnNlY3Rpb25CeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAqIC8vID0+IFsyLjFdXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gKi9cbnZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgbWFwcGVkLnBvcCgpO1xuICB9XG4gIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgIDogW107XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJzZWN0aW9uQnk7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJbnRlcnNlY3Rpb24gZnJvbSAnLi9fYmFzZUludGVyc2VjdGlvbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNhc3RBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9fY2FzdEFycmF5TGlrZU9iamVjdC5qcyc7XG5pbXBvcnQgbGFzdCBmcm9tICcuL2xhc3QuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXNcbiAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICpcbiAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICovXG52YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICBpZiAoY29tcGFyYXRvcikge1xuICAgIG1hcHBlZC5wb3AoKTtcbiAgfVxuICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgIDogW107XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJzZWN0aW9uV2l0aDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSm9pbiA9IGFycmF5UHJvdG8uam9pbjtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpO1xuICogLy8gPT4gJ2F+Yn5jJ1xuICovXG5mdW5jdGlvbiBqb2luKGFycmF5LCBzZXBhcmF0b3IpIHtcbiAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgam9pbjtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmxhc3RJbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaWN0TGFzdEluZGV4T2Y7XG4iLCJpbXBvcnQgYmFzZUZpbmRJbmRleCBmcm9tICcuL19iYXNlRmluZEluZGV4LmpzJztcbmltcG9ydCBiYXNlSXNOYU4gZnJvbSAnLi9fYmFzZUlzTmFOLmpzJztcbmltcG9ydCBzdHJpY3RMYXN0SW5kZXhPZiBmcm9tICcuL19zdHJpY3RMYXN0SW5kZXhPZi5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICogLy8gPT4gM1xuICpcbiAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAqIC8vID0+IDFcbiAqL1xuZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxhc3RJbmRleE9mO1xuIiwiaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlTnRoO1xuIiwiaW1wb3J0IGJhc2VOdGggZnJvbSAnLi9fYmFzZU50aC5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBlbGVtZW50IGF0IGluZGV4IGBuYCBvZiBgYXJyYXlgLiBJZiBgbmAgaXMgbmVnYXRpdmUsIHRoZSBudGhcbiAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICpcbiAqIF8ubnRoKGFycmF5LCAxKTtcbiAqIC8vID0+ICdiJ1xuICpcbiAqIF8ubnRoKGFycmF5LCAtMik7XG4gKiAvLyA9PiAnYyc7XG4gKi9cbmZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlTnRoKGFycmF5LCB0b0ludGVnZXIobikpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBudGg7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW5kZXhPZldpdGg7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcbmltcG9ydCBiYXNlSW5kZXhPZldpdGggZnJvbSAnLi9fYmFzZUluZGV4T2ZXaXRoLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBjb3B5QXJyYXkgZnJvbSAnLi9fY29weUFycmF5LmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgc2VlbiA9IGFycmF5O1xuXG4gIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgdmFsdWVzID0gY29weUFycmF5KHZhbHVlcyk7XG4gIH1cbiAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgc2VlbiA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBmcm9tSW5kZXggPSAwLFxuICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIHdoaWxlICgoZnJvbUluZGV4ID0gaW5kZXhPZihzZWVuLCBjb21wdXRlZCwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSkgPiAtMSkge1xuICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUHVsbEFsbDtcbiIsImltcG9ydCBiYXNlUHVsbEFsbCBmcm9tICcuL19iYXNlUHVsbEFsbC5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gKlxuICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFsnYicsICdiJ11cbiAqL1xuZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICA6IGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBwdWxsQWxsO1xuIiwiaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBwdWxsQWxsIGZyb20gJy4vcHVsbEFsbC5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gKiB0byByZW1vdmUgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSBwcmVkaWNhdGUuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gKlxuICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gKiAvLyA9PiBbJ2InLCAnYiddXG4gKi9cbnZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbmV4cG9ydCBkZWZhdWx0IHB1bGw7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVB1bGxBbGwgZnJvbSAnLi9fYmFzZVB1bGxBbGwuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlQnlgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTtcbiAqXG4gKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICogY29uc29sZS5sb2coYXJyYXkpO1xuICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gKi9cbmZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgOiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcHVsbEFsbEJ5O1xuIiwiaW1wb3J0IGJhc2VQdWxsQWxsIGZyb20gJy4vX2Jhc2VQdWxsQWxsLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5YCB0byBgdmFsdWVzYC4gVGhlIGNvbXBhcmF0b3IgaXNcbiAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZVdpdGhgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjYuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDMsICd5JzogNCB9LCB7ICd4JzogNSwgJ3knOiA2IH1dO1xuICpcbiAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICogY29uc29sZS5sb2coYXJyYXkpO1xuICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICovXG5mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSwgdmFsdWVzLCBjb21wYXJhdG9yKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgIDogYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHB1bGxBbGxXaXRoO1xuIiwiaW1wb3J0IGdldCBmcm9tICcuL2dldC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgIHNraXAgPSBvYmplY3QgPT0gbnVsbDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlQXQ7XG4iLCJpbXBvcnQgYmFzZUdldCBmcm9tICcuL19iYXNlR2V0LmpzJztcbmltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJlbnQ7XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IGxhc3QgZnJvbSAnLi9sYXN0LmpzJztcbmltcG9ydCBwYXJlbnQgZnJvbSAnLi9fcGFyZW50LmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVVuc2V0O1xuIiwiaW1wb3J0IGJhc2VVbnNldCBmcm9tICcuL19iYXNlVW5zZXQuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA/IGluZGV4ZXMubGVuZ3RoIDogMCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICBpZiAoaXNJbmRleChpbmRleCkpIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VVbnNldChhcnJheSwgaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VQdWxsQXQ7XG4iLCJpbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKlxuICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gIGlmICh2YWx1ZSAhPT0gb3RoZXIpIHtcbiAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLFxuICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCxcbiAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHxcbiAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcGFyZUFzY2VuZGluZztcbiIsImltcG9ydCBmbGF0dGVuIGZyb20gJy4vZmxhdHRlbi5qcyc7XG5pbXBvcnQgb3ZlclJlc3QgZnJvbSAnLi9fb3ZlclJlc3QuanMnO1xuaW1wb3J0IHNldFRvU3RyaW5nIGZyb20gJy4vX3NldFRvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmbGF0UmVzdDtcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZUF0IGZyb20gJy4vX2Jhc2VBdC5qcyc7XG5pbXBvcnQgYmFzZVB1bGxBdCBmcm9tICcuL19iYXNlUHVsbEF0LmpzJztcbmltcG9ydCBjb21wYXJlQXNjZW5kaW5nIGZyb20gJy4vX2NvbXBhcmVBc2NlbmRpbmcuanMnO1xuaW1wb3J0IGZsYXRSZXN0IGZyb20gJy4vX2ZsYXRSZXN0LmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gKiBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFsnYScsICdjJ11cbiAqXG4gKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICogLy8gPT4gWydiJywgJ2QnXVxuICovXG52YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYmFzZUF0KGFycmF5LCBpbmRleGVzKTtcblxuICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gIH0pLnNvcnQoY29tcGFyZUFzY2VuZGluZykpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcHVsbEF0O1xuIiwiaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VQdWxsQXQgZnJvbSAnLi9fYmFzZVB1bGxBdC5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBgYXJyYXlgIHRoYXQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yXG4gKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFsxLCAzXVxuICpcbiAqIGNvbnNvbGUubG9nKGV2ZW5zKTtcbiAqIC8vID0+IFsyLCA0XVxuICovXG5mdW5jdGlvbiByZW1vdmUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSA9IGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgfVxuICBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVtb3ZlO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4vKipcbiAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gKiBlbGVtZW50IGJlY29tZXMgdGhlIHNlY29uZCB0byBsYXN0LCBhbmQgc28gb24uXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAqIFtgQXJyYXkjcmV2ZXJzZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3JldmVyc2UpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gKlxuICogXy5yZXZlcnNlKGFycmF5KTtcbiAqIC8vID0+IFszLCAyLCAxXVxuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFszLCAyLCAxXVxuICovXG5mdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXZlcnNlO1xuIiwiaW1wb3J0IGJhc2VTbGljZSBmcm9tICcuL19iYXNlU2xpY2UuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluc3RlYWQgb2ZcbiAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAqIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgICBlbmQgPSBsZW5ndGg7XG4gIH1cbiAgZWxzZSB7XG4gICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgfVxuICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2xpY2U7XG4iLCJpbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG52YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDE7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gKiB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAqICBpbnRvIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgdmFsdWUgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgdmFyIGxvdyA9IDAsXG4gICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSksXG4gICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICB2YXIgbWlkID0gbmF0aXZlRmxvb3IoKGxvdyArIGhpZ2gpIC8gMiksXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgIG90aElzTnVsbCA9IGNvbXB1dGVkID09PSBudWxsLFxuICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICBpZiAodmFsSXNOYU4pIHtcbiAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIChyZXRIaWdoZXN0IHx8IG90aElzRGVmaW5lZCk7XG4gICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICB9IGVsc2UgaWYgKHZhbElzU3ltYm9sKSB7XG4gICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICBzZXRMb3cgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChzZXRMb3cpIHtcbiAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNvcnRlZEluZGV4Qnk7XG4iLCJpbXBvcnQgYmFzZVNvcnRlZEluZGV4QnkgZnJvbSAnLi9fYmFzZVNvcnRlZEluZGV4QnkuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xudmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAqICBpbnRvIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHJldEhpZ2hlc3QpIHtcbiAgdmFyIGxvdyA9IDAsXG4gICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09PSB2YWx1ZSAmJiBoaWdoIDw9IEhBTEZfTUFYX0FSUkFZX0xFTkdUSCkge1xuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgIGNvbXB1dGVkID0gYXJyYXlbbWlkXTtcblxuICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGlnaDtcbiAgfVxuICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTb3J0ZWRJbmRleDtcbiIsImltcG9ydCBiYXNlU29ydGVkSW5kZXggZnJvbSAnLi9fYmFzZVNvcnRlZEluZGV4LmpzJztcblxuLyoqXG4gKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICogIGludG8gYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICogLy8gPT4gMVxuICovXG5mdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0ZWRJbmRleDtcbiIsImltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlU29ydGVkSW5kZXhCeSBmcm9tICcuL19iYXNlU29ydGVkSW5kZXhCeS5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICogIGludG8gYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gKlxuICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAqIC8vID0+IDBcbiAqL1xuZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0ZWRJbmRleEJ5O1xuIiwiaW1wb3J0IGJhc2VTb3J0ZWRJbmRleCBmcm9tICcuL19iYXNlU29ydGVkSW5kZXguanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gKiAvLyA9PiAxXG4gKi9cbmZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKGxlbmd0aCkge1xuICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIGlmIChpbmRleCA8IGxlbmd0aCAmJiBlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRlZEluZGV4T2Y7XG4iLCJpbXBvcnQgYmFzZVNvcnRlZEluZGV4IGZyb20gJy4vX2Jhc2VTb3J0ZWRJbmRleC5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gKiBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAqICBpbnRvIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gKiAvLyA9PiA0XG4gKi9cbmZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSwgdmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0ZWRMYXN0SW5kZXg7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVNvcnRlZEluZGV4QnkgZnJvbSAnLi9fYmFzZVNvcnRlZEluZGV4QnkuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gKiAgaW50byBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAqXG4gKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gKiAvLyA9PiAxXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gKiAvLyA9PiAxXG4gKi9cbmZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRlZExhc3RJbmRleEJ5O1xuIiwiaW1wb3J0IGJhc2VTb3J0ZWRJbmRleCBmcm9tICcuL19iYXNlU29ydGVkSW5kZXguanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubGFzdEluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc29ydGVkTGFzdEluZGV4T2YoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKGxlbmd0aCkge1xuICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpIC0gMTtcbiAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0ZWRMYXN0SW5kZXhPZjtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgdmFyIHNlZW4gPSBjb21wdXRlZDtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU29ydGVkVW5pcTtcbiIsImltcG9ydCBiYXNlU29ydGVkVW5pcSBmcm9tICcuL19iYXNlU29ydGVkVW5pcS5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqL1xuZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRlZFVuaXE7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVNvcnRlZFVuaXEgZnJvbSAnLi9fYmFzZVNvcnRlZFVuaXEuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAqIC8vID0+IFsxLjEsIDIuM11cbiAqL1xuZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRlZFVuaXFCeTtcbiIsImltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcblxuLyoqXG4gKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50YWlsKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBbMiwgM11cbiAqL1xuZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGFpbDtcbiIsImltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IFsxXVxuICpcbiAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAqIC8vID0+IFtdXG4gKi9cbmZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRha2U7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAqIC8vID0+IFszXVxuICpcbiAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gKiAvLyA9PiBbMiwgM11cbiAqXG4gKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAqIC8vID0+IFtdXG4gKi9cbmZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICBuID0gbGVuZ3RoIC0gbjtcbiAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGFrZVJpZ2h0O1xuIiwiaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VXaGlsZSBmcm9tICcuL19iYXNlV2hpbGUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gW11cbiAqL1xuZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VXaGlsZShhcnJheSwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGZhbHNlLCB0cnVlKVxuICAgIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRha2VSaWdodFdoaWxlO1xuIiwiaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VXaGlsZSBmcm9tICcuL19iYXNlV2hpbGUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgYmVnaW5uaW5nLiBFbGVtZW50c1xuICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnRha2VXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gW11cbiAqL1xuZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlV2hpbGUoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRha2VXaGlsZTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gKi9cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5vb3A7XG4iLCJpbXBvcnQgU2V0IGZyb20gJy4vX1NldC5qcyc7XG5pbXBvcnQgbm9vcCBmcm9tICcuL25vb3AuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNldDtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlcyBmcm9tICcuL19hcnJheUluY2x1ZGVzLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzV2l0aCBmcm9tICcuL19hcnJheUluY2x1ZGVzV2l0aC5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuaW1wb3J0IGNyZWF0ZVNldCBmcm9tICcuL19jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmlxO1xuIiwiaW1wb3J0IGJhc2VGbGF0dGVuIGZyb20gJy4vX2Jhc2VGbGF0dGVuLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgYmFzZVVuaXEgZnJvbSAnLi9fYmFzZVVuaXEuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqL1xudmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW5pb247XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBiYXNlVW5pcSBmcm9tICcuL19iYXNlVW5pcS5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5pbXBvcnQgbGFzdCBmcm9tICcuL2xhc3QuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICogd2hpY2ggdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20gdGhlIGZpcnN0XG4gKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAqICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gKiAvLyA9PiBbMi4xLCAxLjJdXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV1cbiAqL1xudmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1bmlvbkJ5O1xuIiwiaW1wb3J0IGJhc2VGbGF0dGVuIGZyb20gJy4vX2Jhc2VGbGF0dGVuLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgYmFzZVVuaXEgZnJvbSAnLi9fYmFzZVVuaXEuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuaW1wb3J0IGxhc3QgZnJvbSAnLi9sYXN0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbVxuICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAqXG4gKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAqL1xudmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdW5pb25XaXRoO1xuIiwiaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gKiBpbiB0aGUgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG5mdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmlxO1xuIiwiaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAqICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpO1xuICogLy8gPT4gWzIuMSwgMS4yXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gKi9cbmZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuaXFCeTtcbiIsImltcG9ydCBiYXNlVW5pcSBmcm9tICcuL19iYXNlVW5pcS5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS5UaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICpcbiAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAqIC8vID0+IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV1cbiAqL1xuZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmlxV2l0aDtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VQcm9wZXJ0eSBmcm9tICcuL19iYXNlUHJvcGVydHkuanMnO1xuaW1wb3J0IGJhc2VUaW1lcyBmcm9tICcuL19iYXNlVGltZXMuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICogZWxlbWVudHMgYW5kIGNyZWF0ZXMgYW4gYXJyYXkgcmVncm91cGluZyB0aGUgZWxlbWVudHMgdG8gdGhlaXIgcHJlLXppcFxuICogY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMi4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gKlxuICogXy51bnppcCh6aXBwZWQpO1xuICogLy8gPT4gW1snYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXV1cbiAqL1xuZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gMDtcbiAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICBsZW5ndGggPSBuYXRpdmVNYXgoZ3JvdXAubGVuZ3RoLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuemlwO1xuIiwiaW1wb3J0IGFwcGx5IGZyb20gJy4vX2FwcGx5LmpzJztcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgdW56aXAgZnJvbSAnLi91bnppcC5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjguMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gKiAgcmVncm91cGVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICogLy8gPT4gW1sxLCAxMCwgMTAwXSwgWzIsIDIwLCAyMDBdXVxuICpcbiAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICogLy8gPT4gWzMsIDMwLCAzMDBdXG4gKi9cbmZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdW56aXAoYXJyYXkpO1xuICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW56aXBXaXRoO1xuIiwiaW1wb3J0IGJhc2VEaWZmZXJlbmNlIGZyb20gJy4vX2Jhc2VEaWZmZXJlbmNlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLnhvclxuICogQGV4YW1wbGVcbiAqXG4gKiBfLndpdGhvdXQoWzIsIDEsIDIsIDNdLCAxLCAyKTtcbiAqIC8vID0+IFszXVxuICovXG52YXIgd2l0aG91dCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICA6IFtdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhvdXQ7XG4iLCJpbXBvcnQgYmFzZURpZmZlcmVuY2UgZnJvbSAnLi9fYmFzZURpZmZlcmVuY2UuanMnO1xuaW1wb3J0IGJhc2VGbGF0dGVuIGZyb20gJy4vX2Jhc2VGbGF0dGVuLmpzJztcbmltcG9ydCBiYXNlVW5pcSBmcm9tICcuL19iYXNlVW5pcS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGFycmF5ID0gYXJyYXlzW2luZGV4XSxcbiAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAob3RoSW5kZXggIT0gaW5kZXgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVhvcjtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGJhc2VYb3IgZnJvbSAnLi9fYmFzZVhvci5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgaXMgdGhlXG4gKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAqIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICogLy8gPT4gWzEsIDNdXG4gKi9cbnZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHhvcjtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGJhc2VYb3IgZnJvbSAnLi9fYmFzZVhvci5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5pbXBvcnQgbGFzdCBmcm9tICcuL2xhc3QuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gKiBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAqIC8vID0+IFsxLjIsIDMuNF1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAqL1xudmFyIHhvckJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB4b3JCeTtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGJhc2VYb3IgZnJvbSAnLi9fYmFzZVhvci5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5pbXBvcnQgbGFzdCBmcm9tICcuL2xhc3QuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgY29tcGFyYXRvciBpcyBpbnZva2VkXG4gKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gKlxuICogXy54b3JXaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAqL1xudmFyIHhvcldpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgeG9yV2l0aDtcbiIsImltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgdW56aXAgZnJvbSAnLi91bnppcC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gKiBmaXJzdCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXlzLCB0aGUgc2Vjb25kIG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAqL1xudmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuZXhwb3J0IGRlZmF1bHQgemlwO1xuIiwiaW1wb3J0IGRlZmluZVByb3BlcnR5IGZyb20gJy4vX2RlZmluZVByb3BlcnR5LmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUFzc2lnblZhbHVlO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ25WYWx1ZTtcbiIsIi8qKlxuICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gaW5kZXggPCB2YWxzTGVuZ3RoID8gdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVppcE9iamVjdDtcbiIsImltcG9ydCBhc3NpZ25WYWx1ZSBmcm9tICcuL19hc3NpZ25WYWx1ZS5qcyc7XG5pbXBvcnQgYmFzZVppcE9iamVjdCBmcm9tICcuL19iYXNlWmlwT2JqZWN0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjQuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbmZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgemlwT2JqZWN0O1xuIiwiaW1wb3J0IGFzc2lnblZhbHVlIGZyb20gJy4vX2Fzc2lnblZhbHVlLmpzJztcbmltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5pbXBvcnQgaXNJbmRleCBmcm9tICcuL19pc0luZGV4LmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2V0O1xuIiwiaW1wb3J0IGJhc2VTZXQgZnJvbSAnLi9fYmFzZVNldC5qcyc7XG5pbXBvcnQgYmFzZVppcE9iamVjdCBmcm9tICcuL19iYXNlWmlwT2JqZWN0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gKi9cbmZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgemlwT2JqZWN0RGVlcDtcbiIsImltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgdW56aXBXaXRoIGZyb20gJy4vdW56aXBXaXRoLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAqIGhvdyBncm91cGVkIHZhbHVlcyBzaG91bGQgYmUgY29tYmluZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhlXG4gKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy44LjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gKiAgZ3JvdXBlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICogICByZXR1cm4gYSArIGIgKyBjO1xuICogfSk7XG4gKiAvLyA9PiBbMTExLCAyMjJdXG4gKi9cbnZhciB6aXBXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gIGl0ZXJhdGVlID0gdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgPyAoYXJyYXlzLnBvcCgpLCBpdGVyYXRlZSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgemlwV2l0aDtcbiIsImltcG9ydCBjaHVuayBmcm9tICcuL2NodW5rLmpzJztcbmltcG9ydCBjb21wYWN0IGZyb20gJy4vY29tcGFjdC5qcyc7XG5pbXBvcnQgY29uY2F0IGZyb20gJy4vY29uY2F0LmpzJztcbmltcG9ydCBkaWZmZXJlbmNlIGZyb20gJy4vZGlmZmVyZW5jZS5qcyc7XG5pbXBvcnQgZGlmZmVyZW5jZUJ5IGZyb20gJy4vZGlmZmVyZW5jZUJ5LmpzJztcbmltcG9ydCBkaWZmZXJlbmNlV2l0aCBmcm9tICcuL2RpZmZlcmVuY2VXaXRoLmpzJztcbmltcG9ydCBkcm9wIGZyb20gJy4vZHJvcC5qcyc7XG5pbXBvcnQgZHJvcFJpZ2h0IGZyb20gJy4vZHJvcFJpZ2h0LmpzJztcbmltcG9ydCBkcm9wUmlnaHRXaGlsZSBmcm9tICcuL2Ryb3BSaWdodFdoaWxlLmpzJztcbmltcG9ydCBkcm9wV2hpbGUgZnJvbSAnLi9kcm9wV2hpbGUuanMnO1xuaW1wb3J0IGZpbGwgZnJvbSAnLi9maWxsLmpzJztcbmltcG9ydCBmaW5kSW5kZXggZnJvbSAnLi9maW5kSW5kZXguanMnO1xuaW1wb3J0IGZpbmRMYXN0SW5kZXggZnJvbSAnLi9maW5kTGFzdEluZGV4LmpzJztcbmltcG9ydCBmaXJzdCBmcm9tICcuL2ZpcnN0LmpzJztcbmltcG9ydCBmbGF0dGVuIGZyb20gJy4vZmxhdHRlbi5qcyc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnLi9mbGF0dGVuRGVlcC5qcyc7XG5pbXBvcnQgZmxhdHRlbkRlcHRoIGZyb20gJy4vZmxhdHRlbkRlcHRoLmpzJztcbmltcG9ydCBmcm9tUGFpcnMgZnJvbSAnLi9mcm9tUGFpcnMuanMnO1xuaW1wb3J0IGhlYWQgZnJvbSAnLi9oZWFkLmpzJztcbmltcG9ydCBpbmRleE9mIGZyb20gJy4vaW5kZXhPZi5qcyc7XG5pbXBvcnQgaW5pdGlhbCBmcm9tICcuL2luaXRpYWwuanMnO1xuaW1wb3J0IGludGVyc2VjdGlvbiBmcm9tICcuL2ludGVyc2VjdGlvbi5qcyc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uQnkgZnJvbSAnLi9pbnRlcnNlY3Rpb25CeS5qcyc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uV2l0aCBmcm9tICcuL2ludGVyc2VjdGlvbldpdGguanMnO1xuaW1wb3J0IGpvaW4gZnJvbSAnLi9qb2luLmpzJztcbmltcG9ydCBsYXN0IGZyb20gJy4vbGFzdC5qcyc7XG5pbXBvcnQgbGFzdEluZGV4T2YgZnJvbSAnLi9sYXN0SW5kZXhPZi5qcyc7XG5pbXBvcnQgbnRoIGZyb20gJy4vbnRoLmpzJztcbmltcG9ydCBwdWxsIGZyb20gJy4vcHVsbC5qcyc7XG5pbXBvcnQgcHVsbEFsbCBmcm9tICcuL3B1bGxBbGwuanMnO1xuaW1wb3J0IHB1bGxBbGxCeSBmcm9tICcuL3B1bGxBbGxCeS5qcyc7XG5pbXBvcnQgcHVsbEFsbFdpdGggZnJvbSAnLi9wdWxsQWxsV2l0aC5qcyc7XG5pbXBvcnQgcHVsbEF0IGZyb20gJy4vcHVsbEF0LmpzJztcbmltcG9ydCByZW1vdmUgZnJvbSAnLi9yZW1vdmUuanMnO1xuaW1wb3J0IHJldmVyc2UgZnJvbSAnLi9yZXZlcnNlLmpzJztcbmltcG9ydCBzbGljZSBmcm9tICcuL3NsaWNlLmpzJztcbmltcG9ydCBzb3J0ZWRJbmRleCBmcm9tICcuL3NvcnRlZEluZGV4LmpzJztcbmltcG9ydCBzb3J0ZWRJbmRleEJ5IGZyb20gJy4vc29ydGVkSW5kZXhCeS5qcyc7XG5pbXBvcnQgc29ydGVkSW5kZXhPZiBmcm9tICcuL3NvcnRlZEluZGV4T2YuanMnO1xuaW1wb3J0IHNvcnRlZExhc3RJbmRleCBmcm9tICcuL3NvcnRlZExhc3RJbmRleC5qcyc7XG5pbXBvcnQgc29ydGVkTGFzdEluZGV4QnkgZnJvbSAnLi9zb3J0ZWRMYXN0SW5kZXhCeS5qcyc7XG5pbXBvcnQgc29ydGVkTGFzdEluZGV4T2YgZnJvbSAnLi9zb3J0ZWRMYXN0SW5kZXhPZi5qcyc7XG5pbXBvcnQgc29ydGVkVW5pcSBmcm9tICcuL3NvcnRlZFVuaXEuanMnO1xuaW1wb3J0IHNvcnRlZFVuaXFCeSBmcm9tICcuL3NvcnRlZFVuaXFCeS5qcyc7XG5pbXBvcnQgdGFpbCBmcm9tICcuL3RhaWwuanMnO1xuaW1wb3J0IHRha2UgZnJvbSAnLi90YWtlLmpzJztcbmltcG9ydCB0YWtlUmlnaHQgZnJvbSAnLi90YWtlUmlnaHQuanMnO1xuaW1wb3J0IHRha2VSaWdodFdoaWxlIGZyb20gJy4vdGFrZVJpZ2h0V2hpbGUuanMnO1xuaW1wb3J0IHRha2VXaGlsZSBmcm9tICcuL3Rha2VXaGlsZS5qcyc7XG5pbXBvcnQgdW5pb24gZnJvbSAnLi91bmlvbi5qcyc7XG5pbXBvcnQgdW5pb25CeSBmcm9tICcuL3VuaW9uQnkuanMnO1xuaW1wb3J0IHVuaW9uV2l0aCBmcm9tICcuL3VuaW9uV2l0aC5qcyc7XG5pbXBvcnQgdW5pcSBmcm9tICcuL3VuaXEuanMnO1xuaW1wb3J0IHVuaXFCeSBmcm9tICcuL3VuaXFCeS5qcyc7XG5pbXBvcnQgdW5pcVdpdGggZnJvbSAnLi91bmlxV2l0aC5qcyc7XG5pbXBvcnQgdW56aXAgZnJvbSAnLi91bnppcC5qcyc7XG5pbXBvcnQgdW56aXBXaXRoIGZyb20gJy4vdW56aXBXaXRoLmpzJztcbmltcG9ydCB3aXRob3V0IGZyb20gJy4vd2l0aG91dC5qcyc7XG5pbXBvcnQgeG9yIGZyb20gJy4veG9yLmpzJztcbmltcG9ydCB4b3JCeSBmcm9tICcuL3hvckJ5LmpzJztcbmltcG9ydCB4b3JXaXRoIGZyb20gJy4veG9yV2l0aC5qcyc7XG5pbXBvcnQgemlwIGZyb20gJy4vemlwLmpzJztcbmltcG9ydCB6aXBPYmplY3QgZnJvbSAnLi96aXBPYmplY3QuanMnO1xuaW1wb3J0IHppcE9iamVjdERlZXAgZnJvbSAnLi96aXBPYmplY3REZWVwLmpzJztcbmltcG9ydCB6aXBXaXRoIGZyb20gJy4vemlwV2l0aC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY2h1bmssIGNvbXBhY3QsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZGlmZmVyZW5jZUJ5LFxuICBkaWZmZXJlbmNlV2l0aCwgZHJvcCwgZHJvcFJpZ2h0LCBkcm9wUmlnaHRXaGlsZSwgZHJvcFdoaWxlLFxuICBmaWxsLCBmaW5kSW5kZXgsIGZpbmRMYXN0SW5kZXgsIGZpcnN0LCBmbGF0dGVuLFxuICBmbGF0dGVuRGVlcCwgZmxhdHRlbkRlcHRoLCBmcm9tUGFpcnMsIGhlYWQsIGluZGV4T2YsXG4gIGluaXRpYWwsIGludGVyc2VjdGlvbiwgaW50ZXJzZWN0aW9uQnksIGludGVyc2VjdGlvbldpdGgsIGpvaW4sXG4gIGxhc3QsIGxhc3RJbmRleE9mLCBudGgsIHB1bGwsIHB1bGxBbGwsXG4gIHB1bGxBbGxCeSwgcHVsbEFsbFdpdGgsIHB1bGxBdCwgcmVtb3ZlLCByZXZlcnNlLFxuICBzbGljZSwgc29ydGVkSW5kZXgsIHNvcnRlZEluZGV4QnksIHNvcnRlZEluZGV4T2YsIHNvcnRlZExhc3RJbmRleCxcbiAgc29ydGVkTGFzdEluZGV4QnksIHNvcnRlZExhc3RJbmRleE9mLCBzb3J0ZWRVbmlxLCBzb3J0ZWRVbmlxQnksIHRhaWwsXG4gIHRha2UsIHRha2VSaWdodCwgdGFrZVJpZ2h0V2hpbGUsIHRha2VXaGlsZSwgdW5pb24sXG4gIHVuaW9uQnksIHVuaW9uV2l0aCwgdW5pcSwgdW5pcUJ5LCB1bmlxV2l0aCxcbiAgdW56aXAsIHVuemlwV2l0aCwgd2l0aG91dCwgeG9yLCB4b3JCeSxcbiAgeG9yV2l0aCwgemlwLCB6aXBPYmplY3QsIHppcE9iamVjdERlZXAsIHppcFdpdGhcbn07XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGFycmF5KTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5QWdncmVnYXRvcjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCYXNlRm9yO1xuIiwiaW1wb3J0IGNyZWF0ZUJhc2VGb3IgZnJvbSAnLi9fY3JlYXRlQmFzZUZvci5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZvcjtcbiIsImltcG9ydCBiYXNlRm9yIGZyb20gJy4vX2Jhc2VGb3IuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRm9yT3duO1xuIiwiaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVCYXNlRWFjaDtcbiIsImltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuaW1wb3J0IGNyZWF0ZUJhc2VFYWNoIGZyb20gJy4vX2NyZWF0ZUJhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VFYWNoO1xuIiwiaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VBZ2dyZWdhdG9yO1xuIiwiaW1wb3J0IGFycmF5QWdncmVnYXRvciBmcm9tICcuL19hcnJheUFnZ3JlZ2F0b3IuanMnO1xuaW1wb3J0IGJhc2VBZ2dyZWdhdG9yIGZyb20gJy4vX2Jhc2VBZ2dyZWdhdG9yLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFnZ3JlZ2F0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIHNldHRlciwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVBZ2dyZWdhdG9yO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGNyZWF0ZUFnZ3JlZ2F0b3IgZnJvbSAnLi9fY3JlYXRlQWdncmVnYXRvci5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gKi9cbnZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgKytyZXN1bHRba2V5XTtcbiAgfSBlbHNlIHtcbiAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgY291bnRCeTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlFYWNoO1xuIiwiaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjYXN0RnVuY3Rpb247XG4iLCJpbXBvcnQgYXJyYXlFYWNoIGZyb20gJy4vX2FycmF5RWFjaC5qcyc7XG5pbXBvcnQgYmFzZUVhY2ggZnJvbSAnLi9fYmFzZUVhY2guanMnO1xuaW1wb3J0IGNhc3RGdW5jdGlvbiBmcm9tICcuL19jYXN0RnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvckVhY2g7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5RWFjaFJpZ2h0O1xuIiwiaW1wb3J0IGNyZWF0ZUJhc2VGb3IgZnJvbSAnLi9fY3JlYXRlQmFzZUZvci5qcyc7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlRm9yYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXNcbiAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3JSaWdodCA9IGNyZWF0ZUJhc2VGb3IodHJ1ZSk7XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGb3JSaWdodDtcbiIsImltcG9ydCBiYXNlRm9yUmlnaHQgZnJvbSAnLi9fYmFzZUZvclJpZ2h0LmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZvck93blJpZ2h0O1xuIiwiaW1wb3J0IGJhc2VGb3JPd25SaWdodCBmcm9tICcuL19iYXNlRm9yT3duUmlnaHQuanMnO1xuaW1wb3J0IGNyZWF0ZUJhc2VFYWNoIGZyb20gJy4vX2NyZWF0ZUJhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VFYWNoUmlnaHQ7XG4iLCJpbXBvcnQgYXJyYXlFYWNoUmlnaHQgZnJvbSAnLi9fYXJyYXlFYWNoUmlnaHQuanMnO1xuaW1wb3J0IGJhc2VFYWNoUmlnaHQgZnJvbSAnLi9fYmFzZUVhY2hSaWdodC5qcyc7XG5pbXBvcnQgY2FzdEZ1bmN0aW9uIGZyb20gJy4vX2Nhc3RGdW5jdGlvbi5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuMC4wXG4gKiBAYWxpYXMgZWFjaFJpZ2h0XG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqIEBzZWUgXy5mb3JFYWNoXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvckVhY2hSaWdodDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmICghcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlFdmVyeTtcbiIsImltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWBcbiAqL1xuZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUV2ZXJ5O1xuIiwiaW1wb3J0IGFycmF5RXZlcnkgZnJvbSAnLi9fYXJyYXlFdmVyeS5qcyc7XG5pbXBvcnQgYmFzZUV2ZXJ5IGZyb20gJy4vX2Jhc2VFdmVyeS5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3JcbiAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGV2ZXJ5O1xuIiwiaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmlsdGVyO1xuIiwiaW1wb3J0IGFycmF5RmlsdGVyIGZyb20gJy4vX2FycmF5RmlsdGVyLmpzJztcbmltcG9ydCBiYXNlRmlsdGVyIGZyb20gJy4vX2Jhc2VGaWx0ZXIuanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqIEBzZWUgXy5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbHRlcjtcbiIsImltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLmZpbmRgIG9yIGBfLmZpbmRMYXN0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmluZEluZGV4RnVuYyBUaGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29sbGVjdGlvbiBpbmRleC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgfVxuICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRmluZDtcbiIsImltcG9ydCBjcmVhdGVGaW5kIGZyb20gJy4vX2NyZWF0ZUZpbmQuanMnO1xuaW1wb3J0IGZpbmRJbmRleCBmcm9tICcuL2ZpbmRJbmRleC5qcyc7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICovXG52YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZDtcbiIsImltcG9ydCBjcmVhdGVGaW5kIGZyb20gJy4vX2NyZWF0ZUZpbmQuanMnO1xuaW1wb3J0IGZpbmRMYXN0SW5kZXggZnJvbSAnLi9maW5kTGFzdEluZGV4LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1jb2xsZWN0aW9uLmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAqIH0pO1xuICogLy8gPT4gM1xuICovXG52YXIgZmluZExhc3QgPSBjcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpO1xuXG5leHBvcnQgZGVmYXVsdCBmaW5kTGFzdDtcbiIsImltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VNYXA7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VNYXAgZnJvbSAnLi9fYmFzZU1hcC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwO1xuIiwiaW1wb3J0IGJhc2VGbGF0dGVuIGZyb20gJy4vX2Jhc2VGbGF0dGVuLmpzJztcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICogdGhydSBgaXRlcmF0ZWVgIGFuZCBmbGF0dGVuaW5nIHRoZSBtYXBwZWQgcmVzdWx0cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICogICByZXR1cm4gW24sIG5dO1xuICogfVxuICpcbiAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAqL1xuZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZsYXRNYXA7XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAqIG1hcHBlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC43LjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gKiB9XG4gKlxuICogXy5mbGF0TWFwRGVlcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAqL1xuZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmxhdE1hcERlZXA7XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IG1hcCBmcm9tICcuL21hcC5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuNy4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gKiB9XG4gKlxuICogXy5mbGF0TWFwRGVwdGgoWzEsIDJdLCBkdXBsaWNhdGUsIDIpO1xuICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICovXG5mdW5jdGlvbiBmbGF0TWFwRGVwdGgoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGRlcHRoKSB7XG4gIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmbGF0TWFwRGVwdGg7XG4iLCJpbXBvcnQgYmFzZUFzc2lnblZhbHVlIGZyb20gJy4vX2Jhc2VBc3NpZ25WYWx1ZS5qcyc7XG5pbXBvcnQgY3JlYXRlQWdncmVnYXRvciBmcm9tICcuL19jcmVhdGVBZ2dyZWdhdG9yLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICogdmFsdWUgb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlXG4gKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5ncm91cEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICovXG52YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBncm91cEJ5O1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1N0cmluZztcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VWYWx1ZXMgZnJvbSAnLi9fYmFzZVZhbHVlcy5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsdWVzO1xuIiwiaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCBsYXN0IGZyb20gJy4vbGFzdC5qcyc7XG5pbXBvcnQgcGFyZW50IGZyb20gJy4vX3BhcmVudC5qcyc7XG5pbXBvcnQgdG9LZXkgZnJvbSAnLi9fdG9LZXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBtZXRob2QgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW52b2tlO1xuIiwiaW1wb3J0IGFwcGx5IGZyb20gJy4vX2FwcGx5LmpzJztcbmltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5pbXBvcnQgYmFzZUludm9rZSBmcm9tICcuL19iYXNlSW52b2tlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5cbi8qKlxuICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLCByZXR1cm5pbmdcbiAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAqIGZvciwgYW5kIGB0aGlzYCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgZWFjaCBtZXRob2Qgd2l0aC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAqXG4gKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gKi9cbnZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaXNGdW5jID0gdHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJyxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBpc0Z1bmMgPyBhcHBseShwYXRoLCB2YWx1ZSwgYXJncykgOiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgaW52b2tlTWFwO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGNyZWF0ZUFnZ3JlZ2F0b3IgZnJvbSAnLi9fY3JlYXRlQWdncmVnYXRvci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAqIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5ID0gW1xuICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICogXTtcbiAqXG4gKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gKiAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG8uY29kZSk7XG4gKiB9KTtcbiAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAqXG4gKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICovXG52YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBrZXlCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTb3J0Qnk7XG4iLCJpbXBvcnQgY29tcGFyZUFzY2VuZGluZyBmcm9tICcuL19jb21wYXJlQXNjZW5kaW5nLmpzJztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLm9yZGVyQnlgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICpcbiAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsXG4gKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICB9XG4gIH1cbiAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcGFyZU11bHRpcGxlO1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlTWFwIGZyb20gJy4vX2Jhc2VNYXAuanMnO1xuaW1wb3J0IGJhc2VTb3J0QnkgZnJvbSAnLi9fYmFzZVNvcnRCeS5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgY29tcGFyZU11bHRpcGxlIGZyb20gJy4vX2NvbXBhcmVNdWx0aXBsZS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XSwgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlT3JkZXJCeTtcbiIsImltcG9ydCBiYXNlT3JkZXJCeSBmcm9tICcuL19iYXNlT3JkZXJCeS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydEJ5YCBleGNlcHQgdGhhdCBpdCBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgc29ydFxuICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gKiBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW29yZGVyc10gVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gKiBdO1xuICpcbiAqIC8vIFNvcnQgYnkgYHVzZXJgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgYnkgYGFnZWAgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gKi9cbmZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICBpdGVyYXRlZXMgPSBpdGVyYXRlZXMgPT0gbnVsbCA/IFtdIDogW2l0ZXJhdGVlc107XG4gIH1cbiAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gIGlmICghaXNBcnJheShvcmRlcnMpKSB7XG4gICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICB9XG4gIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9yZGVyQnk7XG4iLCJpbXBvcnQgY3JlYXRlQWdncmVnYXRvciBmcm9tICcuL19jcmVhdGVBZ2dyZWdhdG9yLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5IGZvci4gVGhlIHByZWRpY2F0ZSBpc1xuICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogZmFsc2UgfVxuICogXTtcbiAqXG4gKiBfLnBhcnRpdGlvbih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hY3RpdmU7IH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgJ3BlYmJsZXMnXSwgWydmcmVkJ11dXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnBhcnRpdGlvbih1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gKi9cbnZhciBwYXJ0aXRpb24gPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xufSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnRpdGlvbjtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlSZWR1Y2U7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VSZWR1Y2U7XG4iLCJpbXBvcnQgYXJyYXlSZWR1Y2UgZnJvbSAnLi9fYXJyYXlSZWR1Y2UuanMnO1xuaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUmVkdWNlIGZyb20gJy4vX2Jhc2VSZWR1Y2UuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICB9XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlSZWR1Y2VSaWdodDtcbiIsImltcG9ydCBhcnJheVJlZHVjZVJpZ2h0IGZyb20gJy4vX2FycmF5UmVkdWNlUmlnaHQuanMnO1xuaW1wb3J0IGJhc2VFYWNoUmlnaHQgZnJvbSAnLi9fYmFzZUVhY2hSaWdodC5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVJlZHVjZSBmcm9tICcuL19iYXNlUmVkdWNlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gKlxuICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gKiB9LCBbXSk7XG4gKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAqL1xuZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlZHVjZVJpZ2h0O1xuIiwiLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlXG4gKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gKiB9XG4gKlxuICogXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBfLm5lZ2F0ZShpc0V2ZW4pKTtcbiAqIC8vID0+IFsxLCAzLCA1XVxuICovXG5mdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKSB7XG4gIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5lZ2F0ZTtcbiIsImltcG9ydCBhcnJheUZpbHRlciBmcm9tICcuL19hcnJheUZpbHRlci5qcyc7XG5pbXBvcnQgYmFzZUZpbHRlciBmcm9tICcuL19iYXNlRmlsdGVyLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgbmVnYXRlIGZyb20gJy4vbmVnYXRlLmpzJztcblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYDsgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gXG4gKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKiBAc2VlIF8uZmlsdGVyXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLnJlamVjdCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnJlamVjdCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICovXG5mdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlamVjdDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb207XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcikge1xuICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUmFuZG9tO1xuIiwiaW1wb3J0IGJhc2VSYW5kb20gZnJvbSAnLi9fYmFzZVJhbmRvbS5qcyc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZWAgZm9yIGFycmF5cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTYW1wbGUoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheVNhbXBsZTtcbiIsImltcG9ydCBhcnJheVNhbXBsZSBmcm9tICcuL19hcnJheVNhbXBsZS5qcyc7XG5pbXBvcnQgdmFsdWVzIGZyb20gJy4vdmFsdWVzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTYW1wbGUoY29sbGVjdGlvbikge1xuICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNhbXBsZTtcbiIsImltcG9ydCBhcnJheVNhbXBsZSBmcm9tICcuL19hcnJheVNhbXBsZS5qcyc7XG5pbXBvcnQgYmFzZVNhbXBsZSBmcm9tICcuL19iYXNlU2FtcGxlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKlxuICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4wLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gKiAvLyA9PiAyXG4gKi9cbmZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlIDogYmFzZVNhbXBsZTtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNhbXBsZTtcbiIsImltcG9ydCBiYXNlUmFuZG9tIGZyb20gJy4vX2Jhc2VSYW5kb20uanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCB3aGljaCBtdXRhdGVzIGFuZCBzZXRzIHRoZSBzaXplIG9mIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gIHdoaWxlICgrK2luZGV4IDwgc2l6ZSkge1xuICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgIGFycmF5W3JhbmRdID0gYXJyYXlbaW5kZXhdO1xuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICB9XG4gIGFycmF5Lmxlbmd0aCA9IHNpemU7XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2h1ZmZsZVNlbGY7XG4iLCJpbXBvcnQgYmFzZUNsYW1wIGZyb20gJy4vX2Jhc2VDbGFtcC5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5pbXBvcnQgc2h1ZmZsZVNlbGYgZnJvbSAnLi9fc2h1ZmZsZVNlbGYuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7XG4gIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5U2FtcGxlU2l6ZTtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCBzaHVmZmxlU2VsZiBmcm9tICcuL19zaHVmZmxlU2VsZi5qcyc7XG5pbXBvcnQgdmFsdWVzIGZyb20gJy4vdmFsdWVzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2FtcGxlU2l6ZTtcbiIsImltcG9ydCBhcnJheVNhbXBsZVNpemUgZnJvbSAnLi9fYXJyYXlTYW1wbGVTaXplLmpzJztcbmltcG9ydCBiYXNlU2FtcGxlU2l6ZSBmcm9tICcuL19iYXNlU2FtcGxlU2l6ZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIEdldHMgYG5gIHJhbmRvbSBlbGVtZW50cyBhdCB1bmlxdWUga2V5cyBmcm9tIGBjb2xsZWN0aW9uYCB1cCB0byB0aGVcbiAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICogLy8gPT4gWzMsIDFdXG4gKlxuICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gKiAvLyA9PiBbMiwgMywgMV1cbiAqL1xuZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgIG4gPSAxO1xuICB9IGVsc2Uge1xuICAgIG4gPSB0b0ludGVnZXIobik7XG4gIH1cbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzYW1wbGVTaXplO1xuIiwiaW1wb3J0IGNvcHlBcnJheSBmcm9tICcuL19jb3B5QXJyYXkuanMnO1xuaW1wb3J0IHNodWZmbGVTZWxmIGZyb20gJy4vX3NodWZmbGVTZWxmLmpzJztcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlTaHVmZmxlO1xuIiwiaW1wb3J0IHNodWZmbGVTZWxmIGZyb20gJy4vX3NodWZmbGVTZWxmLmpzJztcbmltcG9ydCB2YWx1ZXMgZnJvbSAnLi92YWx1ZXMuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTaHVmZmxlO1xuIiwiaW1wb3J0IGFycmF5U2h1ZmZsZSBmcm9tICcuL19hcnJheVNodWZmbGUuanMnO1xuaW1wb3J0IGJhc2VTaHVmZmxlIGZyb20gJy4vX2Jhc2VTaHVmZmxlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBzaHVmZmxlZCB2YWx1ZXMsIHVzaW5nIGEgdmVyc2lvbiBvZiB0aGVcbiAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICogLy8gPT4gWzQsIDEsIDMsIDJdXG4gKi9cbmZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNodWZmbGUgOiBiYXNlU2h1ZmZsZTtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNodWZmbGU7XG4iLCJpbXBvcnQgYmFzZVByb3BlcnR5IGZyb20gJy4vX2Jhc2VQcm9wZXJ0eS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzY2lpU2l6ZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbnZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNVbmljb2RlO1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlU2l6ZTtcbiIsImltcG9ydCBhc2NpaVNpemUgZnJvbSAnLi9fYXNjaWlTaXplLmpzJztcbmltcG9ydCBoYXNVbmljb2RlIGZyb20gJy4vX2hhc1VuaWNvZGUuanMnO1xuaW1wb3J0IHVuaWNvZGVTaXplIGZyb20gJy4vX3VuaWNvZGVTaXplLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ1NpemU7XG4iLCJpbXBvcnQgYmFzZUtleXMgZnJvbSAnLi9fYmFzZUtleXMuanMnO1xuaW1wb3J0IGdldFRhZyBmcm9tICcuL19nZXRUYWcuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vaXNTdHJpbmcuanMnO1xuaW1wb3J0IHN0cmluZ1NpemUgZnJvbSAnLi9fc3RyaW5nU2l6ZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2l6ZTtcbiIsImltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0O1xuXG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuICEhcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU29tZTtcbiIsImltcG9ydCBhcnJheVNvbWUgZnJvbSAnLi9fYXJyYXlTb21lLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlU29tZSBmcm9tICcuL19iYXNlU29tZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuXG4gKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvbWU7XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IGJhc2VPcmRlckJ5IGZyb20gJy4vX2Jhc2VPcmRlckJ5LmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kXG4gKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH1cbiAqIF07XG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdLCBbJ2ZyZWQnLCA0OF1dXG4gKi9cbnZhciBzb3J0QnkgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW107XG4gIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICB9XG4gIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc29ydEJ5O1xuIiwiaW1wb3J0IGNvdW50QnkgZnJvbSAnLi9jb3VudEJ5LmpzJztcbmltcG9ydCBlYWNoIGZyb20gJy4vZWFjaC5qcyc7XG5pbXBvcnQgZWFjaFJpZ2h0IGZyb20gJy4vZWFjaFJpZ2h0LmpzJztcbmltcG9ydCBldmVyeSBmcm9tICcuL2V2ZXJ5LmpzJztcbmltcG9ydCBmaWx0ZXIgZnJvbSAnLi9maWx0ZXIuanMnO1xuaW1wb3J0IGZpbmQgZnJvbSAnLi9maW5kLmpzJztcbmltcG9ydCBmaW5kTGFzdCBmcm9tICcuL2ZpbmRMYXN0LmpzJztcbmltcG9ydCBmbGF0TWFwIGZyb20gJy4vZmxhdE1hcC5qcyc7XG5pbXBvcnQgZmxhdE1hcERlZXAgZnJvbSAnLi9mbGF0TWFwRGVlcC5qcyc7XG5pbXBvcnQgZmxhdE1hcERlcHRoIGZyb20gJy4vZmxhdE1hcERlcHRoLmpzJztcbmltcG9ydCBmb3JFYWNoIGZyb20gJy4vZm9yRWFjaC5qcyc7XG5pbXBvcnQgZm9yRWFjaFJpZ2h0IGZyb20gJy4vZm9yRWFjaFJpZ2h0LmpzJztcbmltcG9ydCBncm91cEJ5IGZyb20gJy4vZ3JvdXBCeS5qcyc7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnLi9pbmNsdWRlcy5qcyc7XG5pbXBvcnQgaW52b2tlTWFwIGZyb20gJy4vaW52b2tlTWFwLmpzJztcbmltcG9ydCBrZXlCeSBmcm9tICcuL2tleUJ5LmpzJztcbmltcG9ydCBtYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnLi9vcmRlckJ5LmpzJztcbmltcG9ydCBwYXJ0aXRpb24gZnJvbSAnLi9wYXJ0aXRpb24uanMnO1xuaW1wb3J0IHJlZHVjZSBmcm9tICcuL3JlZHVjZS5qcyc7XG5pbXBvcnQgcmVkdWNlUmlnaHQgZnJvbSAnLi9yZWR1Y2VSaWdodC5qcyc7XG5pbXBvcnQgcmVqZWN0IGZyb20gJy4vcmVqZWN0LmpzJztcbmltcG9ydCBzYW1wbGUgZnJvbSAnLi9zYW1wbGUuanMnO1xuaW1wb3J0IHNhbXBsZVNpemUgZnJvbSAnLi9zYW1wbGVTaXplLmpzJztcbmltcG9ydCBzaHVmZmxlIGZyb20gJy4vc2h1ZmZsZS5qcyc7XG5pbXBvcnQgc2l6ZSBmcm9tICcuL3NpemUuanMnO1xuaW1wb3J0IHNvbWUgZnJvbSAnLi9zb21lLmpzJztcbmltcG9ydCBzb3J0QnkgZnJvbSAnLi9zb3J0QnkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvdW50QnksIGVhY2gsIGVhY2hSaWdodCwgZXZlcnksIGZpbHRlcixcbiAgZmluZCwgZmluZExhc3QsIGZsYXRNYXAsIGZsYXRNYXBEZWVwLCBmbGF0TWFwRGVwdGgsXG4gIGZvckVhY2gsIGZvckVhY2hSaWdodCwgZ3JvdXBCeSwgaW5jbHVkZXMsIGludm9rZU1hcCxcbiAga2V5QnksIG1hcCwgb3JkZXJCeSwgcGFydGl0aW9uLCByZWR1Y2UsXG4gIHJlZHVjZVJpZ2h0LCByZWplY3QsIHNhbXBsZSwgc2FtcGxlU2l6ZSwgc2h1ZmZsZSxcbiAgc2l6ZSwgc29tZSwgc29ydEJ5XG59O1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5vdztcbiIsImltcG9ydCBub3cgZnJvbSAnLi9ub3cuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5vd1xufTtcbiIsImltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAqXG4gKiB2YXIgZG9uZSA9IF8uYWZ0ZXIoc2F2ZXMubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICogfSk7XG4gKlxuICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICovXG5mdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoLS1uIDwgMSkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFmdGVyO1xuIiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi9fV2Vha01hcC5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwO1xuXG5leHBvcnQgZGVmYXVsdCBtZXRhTWFwO1xuIiwiaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IG1ldGFNYXAgZnJvbSAnLi9fbWV0YU1hcC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICByZXR1cm4gZnVuYztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTZXREYXRhO1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlQ3JlYXRlO1xuIiwiaW1wb3J0IGJhc2VDcmVhdGUgZnJvbSAnLi9fYmFzZUNyZWF0ZS5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAvLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWZ1bmN0aW9uLW9iamVjdHMtY2FsbC10aGlzYXJndW1lbnQtYXJndW1lbnRzbGlzdFxuICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICB9XG4gICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuXG4gICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUN0b3I7XG4iLCJpbXBvcnQgY3JlYXRlQ3RvciBmcm9tICcuL19jcmVhdGVDdG9yLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUJpbmQ7XG4iLCIvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VBcmdzO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgd2hpbGUgKCsrYXJnc0luZGV4IDwgcmFuZ2VMZW5ndGgpIHtcbiAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgfVxuICB2YXIgb2Zmc2V0ID0gYXJnc0luZGV4O1xuICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgfVxuICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtvZmZzZXQgKyBob2xkZXJzW2hvbGRlcnNJbmRleF1dID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VBcmdzUmlnaHQ7XG4iLCIvKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LlxuICovXG5mdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSAwO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChhcnJheVtsZW5ndGhdID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgKytyZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvdW50SG9sZGVycztcbiIsIi8qKlxuICogVGhlIGZ1bmN0aW9uIHdob3NlIHByb3RvdHlwZSBjaGFpbiBzZXF1ZW5jZSB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUxvZGFzaDtcbiIsImltcG9ydCBiYXNlQ3JlYXRlIGZyb20gJy4vX2Jhc2VDcmVhdGUuanMnO1xuaW1wb3J0IGJhc2VMb2Rhc2ggZnJvbSAnLi9fYmFzZUxvZGFzaC5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG52YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTU7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICB0aGlzLl9fZGlyX18gPSAxO1xuICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlO1xuICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgdGhpcy5fX3ZpZXdzX18gPSBbXTtcbn1cblxuLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG5MYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuZXhwb3J0IGRlZmF1bHQgTGF6eVdyYXBwZXI7XG4iLCJpbXBvcnQgbWV0YU1hcCBmcm9tICcuL19tZXRhTWFwLmpzJztcbmltcG9ydCBub29wIGZyb20gJy4vbm9vcC5qcyc7XG5cbi8qKlxuICogR2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICovXG52YXIgZ2V0RGF0YSA9ICFtZXRhTWFwID8gbm9vcCA6IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0RGF0YTtcbiIsIi8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xudmFyIHJlYWxOYW1lcyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCByZWFsTmFtZXM7XG4iLCJpbXBvcnQgcmVhbE5hbWVzIGZyb20gJy4vX3JlYWxOYW1lcy5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmFtZSBvZiBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY05hbWUoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICBsZW5ndGggPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywgcmVzdWx0KSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICBvdGhlckZ1bmMgPSBkYXRhLmZ1bmM7XG4gICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRGdW5jTmFtZTtcbiIsImltcG9ydCBiYXNlQ3JlYXRlIGZyb20gJy4vX2Jhc2VDcmVhdGUuanMnO1xuaW1wb3J0IGJhc2VMb2Rhc2ggZnJvbSAnLi9fYmFzZUxvZGFzaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAqL1xuZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgdGhpcy5fX2luZGV4X18gPSAwO1xuICB0aGlzLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG59XG5cbkxvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG5Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExvZGFzaFdyYXBwZXI7XG5cbmV4cG9ydCBkZWZhdWx0IExvZGFzaFdyYXBwZXI7XG4iLCJpbXBvcnQgTGF6eVdyYXBwZXIgZnJvbSAnLi9fTGF6eVdyYXBwZXIuanMnO1xuaW1wb3J0IExvZGFzaFdyYXBwZXIgZnJvbSAnLi9fTG9kYXNoV3JhcHBlci5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci5cbiAqL1xuZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fKTtcbiAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICByZXN1bHQuX192YWx1ZXNfXyA9IHdyYXBwZXIuX192YWx1ZXNfXztcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlckNsb25lO1xuIiwiaW1wb3J0IExhenlXcmFwcGVyIGZyb20gJy4vX0xhenlXcmFwcGVyLmpzJztcbmltcG9ydCBMb2Rhc2hXcmFwcGVyIGZyb20gJy4vX0xvZGFzaFdyYXBwZXIuanMnO1xuaW1wb3J0IGJhc2VMb2Rhc2ggZnJvbSAnLi9fYmFzZUxvZGFzaC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5pbXBvcnQgd3JhcHBlckNsb25lIGZyb20gJy4vX3dyYXBwZXJDbG9uZS5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAqIGNoYWluIHNlcXVlbmNlcy4gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLFxuICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gKiBhbmQgcmV0dXJuIHRoZSB1bndyYXBwZWQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG11c3QgYmUgdW53cmFwcGVkXG4gKiB3aXRoIGBfI3ZhbHVlYC5cbiAqXG4gKiBFeHBsaWNpdCBjaGFpbiBzZXF1ZW5jZXMsIHdoaWNoIG11c3QgYmUgdW53cmFwcGVkIHdpdGggYF8jdmFsdWVgLCBtYXkgYmVcbiAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICpcbiAqIFRoZSBleGVjdXRpb24gb2YgY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGl0J3MgZGVmZXJyZWQgdW50aWxcbiAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICpcbiAqIExhenkgZXZhbHVhdGlvbiBhbGxvd3Mgc2V2ZXJhbCBtZXRob2RzIHRvIHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uLlxuICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICogaXRlcmF0ZWUgZXhlY3V0aW9ucy4gU2VjdGlvbnMgb2YgYSBjaGFpbiBzZXF1ZW5jZSBxdWFsaWZ5IGZvciBzaG9ydGN1dFxuICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gKiBmdXNpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UuXG4gKlxuICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAqXG4gKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICpcbiAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gKlxuICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gKiBgZmluZExhc3RgLCBgaGVhZGAsIGBpbml0aWFsYCwgYGxhc3RgLCBgbWFwYCwgYHJlamVjdGAsIGByZXZlcnNlYCwgYHNsaWNlYCxcbiAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAqXG4gKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgbWV0aG9kcyBhcmU6XG4gKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gKiBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbmZvcm1zYCwgYGNvbnN0YW50YCwgYGNvdW50QnlgLCBgY3JlYXRlYCxcbiAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAqIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZXh0ZW5kYCwgYGV4dGVuZFdpdGhgLCBgZmlsbGAsIGBmaWx0ZXJgLFxuICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICogYGZ1bmN0aW9uc0luYCwgYGdyb3VwQnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25gLCBgaW50ZXJzZWN0aW9uQnlgLFxuICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAqIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1lcmdlV2l0aGAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLCBgbmVnYXRlYCxcbiAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gKiBgcGlja0J5YCwgYHBsYW50YCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsIGBwdWxsQWxsYCwgYHB1bGxBbGxCeWAsXG4gKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAqIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICogYHVuaW9uYCwgYHVuaW9uQnlgLCBgdW5pb25XaXRoYCwgYHVuaXFgLCBgdW5pcUJ5YCwgYHVuaXFXaXRoYCwgYHVuc2V0YCxcbiAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICogYHppcE9iamVjdGAsIGB6aXBPYmplY3REZWVwYCwgYW5kIGB6aXBXaXRoYFxuICpcbiAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbGFtcGAsIGBjbG9uZWAsXG4gKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gKiBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLCBgZmluZExhc3RgLFxuICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAqIGBoYXNJbmAsIGBoZWFkYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLCBgaW5SYW5nZWAsIGBpbnZva2VgLFxuICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAqIGBpc0VxdWFsV2l0aGAsIGBpc0Vycm9yYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNJbnRlZ2VyYCwgYGlzTGVuZ3RoYCxcbiAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICogYGlzU2FmZUludGVnZXJgLCBgaXNTZXRgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgaXNUeXBlZEFycmF5YCxcbiAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICogYG1pbmAsIGBtaW5CeWAsIGBtdWx0aXBseWAsIGBub0NvbmZsaWN0YCwgYG5vb3BgLCBgbm93YCwgYG50aGAsIGBwYWRgLFxuICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZEluZGV4QnlgLCBgc29ydGVkTGFzdEluZGV4YCxcbiAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0aW1lc2AsIGB0b0Zpbml0ZWAsIGB0b0ludGVnZXJgLCBgdG9KU09OYCwgYHRvTGVuZ3RoYCxcbiAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICogYHVwcGVyRmlyc3RgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBuYW1lIF9cbiAqIEBjb25zdHJ1Y3RvclxuICogQGNhdGVnb3J5IFNlcVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAqXG4gKiAvLyBSZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZS5cbiAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAqIC8vID0+IDZcbiAqXG4gKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAqXG4gKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkge1xuICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG59XG5cbi8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbmxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTtcbmxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZGFzaDtcbiIsImltcG9ydCBMYXp5V3JhcHBlciBmcm9tICcuL19MYXp5V3JhcHBlci5qcyc7XG5pbXBvcnQgZ2V0RGF0YSBmcm9tICcuL19nZXREYXRhLmpzJztcbmltcG9ydCBnZXRGdW5jTmFtZSBmcm9tICcuL19nZXRGdW5jTmFtZS5qcyc7XG5pbXBvcnQgbG9kYXNoIGZyb20gJy4vd3JhcHBlckxvZGFzaC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgIG90aGVyID0gbG9kYXNoW2Z1bmNOYW1lXTtcblxuICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNMYXppYWJsZTtcbiIsImltcG9ydCBiYXNlU2V0RGF0YSBmcm9tICcuL19iYXNlU2V0RGF0YS5qcyc7XG5pbXBvcnQgc2hvcnRPdXQgZnJvbSAnLi9fc2hvcnRPdXQuanMnO1xuXG4vKipcbiAqIFNldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAqXG4gKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAqIHBlcmlvZCBvZiB0aW1lLCBpdCB3aWxsIHRyaXAgaXRzIGJyZWFrZXIgYW5kIHRyYW5zaXRpb24gdG8gYW4gaWRlbnRpdHlcbiAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuZXhwb3J0IGRlZmF1bHQgc2V0RGF0YTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xudmFyIHJlV3JhcERldGFpbHMgPSAvXFx7XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAoLispXFxdIFxcKi8sXG4gICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRXcmFwRGV0YWlscztcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xudmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vO1xuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgZGV0YWlscyA9IGRldGFpbHMuam9pbihsZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbnNlcnRXcmFwRGV0YWlscztcbiIsImltcG9ydCBhcnJheUVhY2ggZnJvbSAnLi9fYXJyYXlFYWNoLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzIGZyb20gJy4vX2FycmF5SW5jbHVkZXMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbl07XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXBkYXRlV3JhcERldGFpbHM7XG4iLCJpbXBvcnQgZ2V0V3JhcERldGFpbHMgZnJvbSAnLi9fZ2V0V3JhcERldGFpbHMuanMnO1xuaW1wb3J0IGluc2VydFdyYXBEZXRhaWxzIGZyb20gJy4vX2luc2VydFdyYXBEZXRhaWxzLmpzJztcbmltcG9ydCBzZXRUb1N0cmluZyBmcm9tICcuL19zZXRUb1N0cmluZy5qcyc7XG5pbXBvcnQgdXBkYXRlV3JhcERldGFpbHMgZnJvbSAnLi9fdXBkYXRlV3JhcERldGFpbHMuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gKiB3aXRoIHdyYXBwZXIgZGV0YWlscyBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc291cmNlIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBwZXIgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgd3JhcHBlcmAuXG4gKi9cbmZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldFdyYXBUb1N0cmluZztcbiIsImltcG9ydCBpc0xhemlhYmxlIGZyb20gJy4vX2lzTGF6aWFibGUuanMnO1xuaW1wb3J0IHNldERhdGEgZnJvbSAnLi9fc2V0RGF0YS5qcyc7XG5pbXBvcnQgc2V0V3JhcFRvU3RyaW5nIGZyb20gJy4vX3NldFdyYXBUb1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmVjdXJyeShmdW5jLCBiaXRtYXNrLCB3cmFwRnVuYywgcGxhY2Vob2xkZXIsIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3SG9sZGVyc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IGhvbGRlcnMsXG4gICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9GTEFHIDogV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgYml0bWFzayAmPSB+KFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHKTtcbiAgfVxuICB2YXIgbmV3RGF0YSA9IFtcbiAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCxcbiAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICBdO1xuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYy5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgfVxuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSZWN1cnJ5O1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICB2YXIgb2JqZWN0ID0gZnVuYztcbiAgcmV0dXJuIG9iamVjdC5wbGFjZWhvbGRlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0SG9sZGVyO1xuIiwiaW1wb3J0IGNvcHlBcnJheSBmcm9tICcuL19jb3B5QXJyYXkuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICogdGhlIHNlY29uZCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgc2Vjb25kIGVsZW1lbnQsIGFuZCBzbyBvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlb3JkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCwgYXJyTGVuZ3RoKSxcbiAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCByZW9yZGVyO1xuIiwiLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xudmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4vKipcbiAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICovXG5mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZUhvbGRlcnM7XG4iLCJpbXBvcnQgY29tcG9zZUFyZ3MgZnJvbSAnLi9fY29tcG9zZUFyZ3MuanMnO1xuaW1wb3J0IGNvbXBvc2VBcmdzUmlnaHQgZnJvbSAnLi9fY29tcG9zZUFyZ3NSaWdodC5qcyc7XG5pbXBvcnQgY291bnRIb2xkZXJzIGZyb20gJy4vX2NvdW50SG9sZGVycy5qcyc7XG5pbXBvcnQgY3JlYXRlQ3RvciBmcm9tICcuL19jcmVhdGVDdG9yLmpzJztcbmltcG9ydCBjcmVhdGVSZWN1cnJ5IGZyb20gJy4vX2NyZWF0ZVJlY3VycnkuanMnO1xuaW1wb3J0IGdldEhvbGRlciBmcm9tICcuL19nZXRIb2xkZXIuanMnO1xuaW1wb3J0IHJlb3JkZXIgZnJvbSAnLi9fcmVvcmRlci5qcyc7XG5pbXBvcnQgcmVwbGFjZUhvbGRlcnMgZnJvbSAnLi9fcmVwbGFjZUhvbGRlcnMuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCwgcGFydGlhbCBhcHBsaWNhdGlvbiwgYW5kIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWRcbiAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIFdSQVBfQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgaXNDdXJyaWVkID0gYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpLFxuICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgIGhvbGRlcnNDb3VudCA9IGNvdW50SG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgIGlmIChpc0N1cnJpZWQgJiYgbGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdGhpc0FyZyxcbiAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgICBpZiAoYXJnUG9zKSB7XG4gICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHtcbiAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7XG4gICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICB9XG4gICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikge1xuICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVIeWJyaWQ7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGNyZWF0ZUN0b3IgZnJvbSAnLi9fY3JlYXRlQ3Rvci5qcyc7XG5pbXBvcnQgY3JlYXRlSHlicmlkIGZyb20gJy4vX2NyZWF0ZUh5YnJpZC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVjdXJyeSBmcm9tICcuL19jcmVhdGVSZWN1cnJ5LmpzJztcbmltcG9ydCBnZXRIb2xkZXIgZnJvbSAnLi9fZ2V0SG9sZGVyLmpzJztcbmltcG9ydCByZXBsYWNlSG9sZGVycyBmcm9tICcuL19yZXBsYWNlSG9sZGVycy5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcml0eSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpIHtcbiAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlcik7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgPyBbXVxuICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG5cbiAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgfVxuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ3Vycnk7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGNyZWF0ZUN0b3IgZnJvbSAnLi9fY3JlYXRlQ3Rvci5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9CSU5EX0ZMQUcgPSAxO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmdcbiAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQYXJ0aWFsO1xuIiwiaW1wb3J0IGNvbXBvc2VBcmdzIGZyb20gJy4vX2NvbXBvc2VBcmdzLmpzJztcbmltcG9ydCBjb21wb3NlQXJnc1JpZ2h0IGZyb20gJy4vX2NvbXBvc2VBcmdzUmlnaHQuanMnO1xuaW1wb3J0IHJlcGxhY2VIb2xkZXJzIGZyb20gJy4vX3JlcGxhY2VIb2xkZXJzLmpzJztcblxuLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xudmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTY7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBNZXJnZXMgdGhlIGZ1bmN0aW9uIG1ldGFkYXRhIG9mIGBzb3VyY2VgIGludG8gYGRhdGFgLlxuICpcbiAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgbWV0aG9kcyBsaWtlIGBfLmJpbmRgLCBgXy5jdXJyeWAsIGFuZCBgXy5wYXJ0aWFsYFxuICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAqIGV4ZWN1dGVkIGltcG9ydGFudCwgcHJldmVudGluZyB0aGUgbWVyZ2luZyBvZiBtZXRhZGF0YS4gSG93ZXZlciwgd2UgbWFrZVxuICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIHNvdXJjZSBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBzb3VyY2UpIHtcbiAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgIG5ld0JpdG1hc2sgPSBiaXRtYXNrIHwgc3JjQml0bWFzayxcbiAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gIHZhciBpc0NvbWJvID1cbiAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSkgfHxcbiAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gIC8vIEV4aXQgZWFybHkgaWYgbWV0YWRhdGEgY2FuJ3QgYmUgbWVyZ2VkLlxuICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgIGRhdGFbMl0gPSBzb3VyY2VbMl07XG4gICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gIH1cbiAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICBpZiAodmFsdWUpIHtcbiAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgIGRhdGFbNF0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbM10sIFBMQUNFSE9MREVSKSA6IHNvdXJjZVs0XTtcbiAgfVxuICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICB2YWx1ZSA9IHNvdXJjZVs1XTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgIGRhdGFbNV0gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNl0pIDogdmFsdWU7XG4gICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYGFyZ1Bvc2AgaWYgYXZhaWxhYmxlLlxuICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgZGF0YVs3XSA9IHZhbHVlO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQVJZX0ZMQUcpIHtcbiAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gIH1cbiAgLy8gVXNlIHNvdXJjZSBgYXJpdHlgIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICBkYXRhWzldID0gc291cmNlWzldO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgZGF0YVsxXSA9IG5ld0JpdG1hc2s7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlRGF0YTtcbiIsImltcG9ydCBiYXNlU2V0RGF0YSBmcm9tICcuL19iYXNlU2V0RGF0YS5qcyc7XG5pbXBvcnQgY3JlYXRlQmluZCBmcm9tICcuL19jcmVhdGVCaW5kLmpzJztcbmltcG9ydCBjcmVhdGVDdXJyeSBmcm9tICcuL19jcmVhdGVDdXJyeS5qcyc7XG5pbXBvcnQgY3JlYXRlSHlicmlkIGZyb20gJy4vX2NyZWF0ZUh5YnJpZC5qcyc7XG5pbXBvcnQgY3JlYXRlUGFydGlhbCBmcm9tICcuL19jcmVhdGVQYXJ0aWFsLmpzJztcbmltcG9ydCBnZXREYXRhIGZyb20gJy4vX2dldERhdGEuanMnO1xuaW1wb3J0IG1lcmdlRGF0YSBmcm9tICcuL19tZXJnZURhdGEuanMnO1xuaW1wb3J0IHNldERhdGEgZnJvbSAnLi9fc2V0RGF0YS5qcyc7XG5pbXBvcnQgc2V0V3JhcFRvU3RyaW5nIGZyb20gJy4vX3NldFdyYXBUb1N0cmluZy5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogICAgMSAtIGBfLmJpbmRgXG4gKiAgICAyIC0gYF8uYmluZEtleWBcbiAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICogICAgOCAtIGBfLmN1cnJ5YFxuICogICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgMTI4IC0gYF8ucmVhcmdgXG4gKiAgMjU2IC0gYF8uYXJ5YFxuICogIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgYml0bWFzayAmPSB+KFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRykge1xuICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gIHZhciBuZXdEYXRhID0gW1xuICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gIF07XG5cbiAgaWYgKGRhdGEpIHtcbiAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gIH1cbiAgZnVuYyA9IG5ld0RhdGFbMF07XG4gIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICB0aGlzQXJnID0gbmV3RGF0YVsyXTtcbiAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PT0gdW5kZWZpbmVkXG4gICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gIGlmICghYXJpdHkgJiYgYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKSB7XG4gICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7XG4gIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXcmFwO1xuIiwiaW1wb3J0IGNyZWF0ZVdyYXAgZnJvbSAnLi9fY3JlYXRlV3JhcC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQVJZX0ZMQUcgPSAxMjg7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdXAgdG8gYG5gIGFyZ3VtZW50cyxcbiAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAqIC8vID0+IFs2LCA4LCAxMF1cbiAqL1xuZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gIG4gPSAoZnVuYyAmJiBuID09IG51bGwpID8gZnVuYy5sZW5ndGggOiBuO1xuICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnk7XG4iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoLS1uID4gMCkge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBpZiAobiA8PSAxKSB7XG4gICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiZWZvcmU7XG4iLCJpbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNyZWF0ZVdyYXAgZnJvbSAnLi9fY3JlYXRlV3JhcC5qcyc7XG5pbXBvcnQgZ2V0SG9sZGVyIGZyb20gJy4vX2dldEhvbGRlci5qcyc7XG5pbXBvcnQgcmVwbGFjZUhvbGRlcnMgZnJvbSAnLi9fcmVwbGFjZUhvbGRlcnMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAqIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAqIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAqIH1cbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICpcbiAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCAnaGknKTtcbiAqIGJvdW5kKCchJyk7XG4gKiAvLyA9PiAnaGkgZnJlZCEnXG4gKlxuICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAqIGJvdW5kKCdoaScpO1xuICogLy8gPT4gJ2hpIGZyZWQhJ1xuICovXG52YXIgYmluZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZCkpO1xuICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMpO1xufSk7XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmJpbmQucGxhY2Vob2xkZXIgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgYmluZDtcbiIsImltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcbmltcG9ydCBnZXRIb2xkZXIgZnJvbSAnLi9fZ2V0SG9sZGVyLmpzJztcbmltcG9ydCByZXBsYWNlSG9sZGVycyBmcm9tICcuL19yZXBsYWNlSG9sZGVycy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWAgd2l0aCBgcGFydGlhbHNgXG4gKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvIHJlZmVyZW5jZVxuICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ3VzZXInOiAnZnJlZCcsXG4gKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICogICAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICogICB9XG4gKiB9O1xuICpcbiAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICogYm91bmQoJyEnKTtcbiAqIC8vID0+ICdoaSBmcmVkISdcbiAqXG4gKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAqICAgcmV0dXJuIGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAqIH07XG4gKlxuICogYm91bmQoJyEnKTtcbiAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICpcbiAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLlxuICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAqIGJvdW5kKCdoaScpO1xuICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gKi9cbnZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbn0pO1xuXG4vLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG5iaW5kS2V5LnBsYWNlaG9sZGVyID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGJpbmRLZXk7XG4iLCJpbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9DVVJSWV9GTEFHID0gODtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLlxuY3VycnkucGxhY2Vob2xkZXIgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgY3Vycnk7XG4iLCJpbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTY7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICogaW4gdGhlIG1hbm5lciBvZiBgXy5wYXJ0aWFsUmlnaHRgIGluc3RlYWQgb2YgYF8ucGFydGlhbGAuXG4gKlxuICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gKiAgIHJldHVybiBbYSwgYiwgY107XG4gKiB9O1xuICpcbiAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7XG4gKlxuICogY3VycmllZCgzKSgyKSgxKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMiwgMykoMSk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMykoMSwgXykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnlSaWdodChmdW5jLCBhcml0eSwgZ3VhcmQpIHtcbiAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5UmlnaHQucGxhY2Vob2xkZXIgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgY3VycnlSaWdodDtcbiIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBub3cgZnJvbSAnLi9ub3cuanMnO1xuaW1wb3J0IHRvTnVtYmVyIGZyb20gJy4vdG9OdW1iZXIuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVib3VuY2U7XG4iLCIvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gKiB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZURlbGF5O1xuIiwiaW1wb3J0IGJhc2VEZWxheSBmcm9tICcuL19iYXNlRGVsYXkuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcblxuLyoqXG4gKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAqIH0sICdkZWZlcnJlZCcpO1xuICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAqL1xudmFyIGRlZmVyID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmVyO1xuIiwiaW1wb3J0IGJhc2VEZWxheSBmcm9tICcuL19iYXNlRGVsYXkuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqXG4gKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHtcbiAqICAgY29uc29sZS5sb2codGV4dCk7XG4gKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAqIC8vID0+IExvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kLlxuICovXG52YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gIHJldHVybiBiYXNlRGVsYXkoZnVuYywgdG9OdW1iZXIod2FpdCkgfHwgMCwgYXJncyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVsYXk7XG4iLCJpbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbGlwcGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgZmxpcHBlZCA9IF8uZmxpcChmdW5jdGlvbigpIHtcbiAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICogfSk7XG4gKlxuICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAqL1xuZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmxpcDtcbiIsImltcG9ydCBiZWZvcmUgZnJvbSAnLi9iZWZvcmUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICogaW5pdGlhbGl6ZSgpO1xuICogaW5pdGlhbGl6ZSgpO1xuICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAqL1xuZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9uY2U7XG4iLCJpbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuXG4vKipcbiAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICogcmVwbGFjZW1lbnQgcGx1Z2lucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHR5cGUge0Z1bmN0aW9ufVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG52YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuZXhwb3J0IGRlZmF1bHQgY2FzdFJlc3Q7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGJhc2VVbmFyeSBmcm9tICcuL19iYXNlVW5hcnkuanMnO1xuaW1wb3J0IGNhc3RSZXN0IGZyb20gJy4vX2Nhc3RSZXN0LmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDQuMC4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgYXJndW1lbnQgdHJhbnNmb3Jtcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAqICAgcmV0dXJuIG4gKiAyO1xuICogfVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiB2YXIgZnVuYyA9IF8ub3ZlckFyZ3MoZnVuY3Rpb24oeCwgeSkge1xuICogICByZXR1cm4gW3gsIHldO1xuICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICpcbiAqIGZ1bmMoOSwgMyk7XG4gKiAvLyA9PiBbODEsIDZdXG4gKlxuICogZnVuYygxMCwgNSk7XG4gKiAvLyA9PiBbMTAwLCAxMF1cbiAqL1xudmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICA/IGFycmF5TWFwKHRyYW5zZm9ybXNbMF0sIGJhc2VVbmFyeShiYXNlSXRlcmF0ZWUpKVxuICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShiYXNlSXRlcmF0ZWUpKTtcblxuICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsIGFyZ3NbaW5kZXhdKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBvdmVyQXJncztcbiIsImltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcbmltcG9ydCBnZXRIb2xkZXIgZnJvbSAnLi9fZ2V0SG9sZGVyLmpzJztcbmltcG9ydCByZXBsYWNlSG9sZGVycyBmcm9tICcuL19yZXBsYWNlSG9sZGVycy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfUEFSVElBTF9GTEFHID0gMzI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuXG4gKlxuICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICogYXBwbGllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjIuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAqIH1cbiAqXG4gKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbChncmVldCwgJ2hlbGxvJyk7XG4gKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAqXG4gKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gKiBncmVldEZyZWQoJ2hpJyk7XG4gKiAvLyA9PiAnaGkgZnJlZCdcbiAqL1xudmFyIHBhcnRpYWwgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG59KTtcblxuLy8gQXNzaWduIGRlZmF1bHQgcGxhY2Vob2xkZXJzLlxucGFydGlhbC5wbGFjZWhvbGRlciA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBwYXJ0aWFsO1xuIiwiaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBjcmVhdGVXcmFwIGZyb20gJy4vX2NyZWF0ZVdyYXAuanMnO1xuaW1wb3J0IGdldEhvbGRlciBmcm9tICcuL19nZXRIb2xkZXIuanMnO1xuaW1wb3J0IHJlcGxhY2VIb2xkZXJzIGZyb20gJy4vX3JlcGxhY2VIb2xkZXJzLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICogfVxuICpcbiAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2ZyZWQnKTtcbiAqIGdyZWV0RnJlZCgnaGknKTtcbiAqIC8vID0+ICdoaSBmcmVkJ1xuICpcbiAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAqL1xudmFyIHBhcnRpYWxSaWdodCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xufSk7XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlciA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBwYXJ0aWFsUmlnaHQ7XG4iLCJpbXBvcnQgY3JlYXRlV3JhcCBmcm9tICcuL19jcmVhdGVXcmFwLmpzJztcbmltcG9ydCBmbGF0UmVzdCBmcm9tICcuL19mbGF0UmVzdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfUkVBUkdfRkxBRyA9IDI1NjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmdcbiAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAqIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGFuZCBzbyBvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBhcmd1bWVudHMgZm9yLlxuICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICogICByZXR1cm4gW2EsIGIsIGNdO1xuICogfSwgWzIsIDAsIDFdKTtcbiAqXG4gKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAqL1xudmFyIHJlYXJnID0gZmxhdFJlc3QoZnVuY3Rpb24oZnVuYywgaW5kZXhlcykge1xuICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHJlYXJnO1xuIiwiaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gKiBhbiBhcnJheS5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICogICAgIChfLnNpemUobmFtZXMpID4gMSA/ICcsICYgJyA6ICcnKSArIF8ubGFzdChuYW1lcyk7XG4gKiB9KTtcbiAqXG4gKiBzYXkoJ2hlbGxvJywgJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnKTtcbiAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAqL1xuZnVuY3Rpb24gcmVzdChmdW5jLCBzdGFydCkge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlc3Q7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gKi9cbmZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZDtcbiAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RTbGljZTtcbiIsImltcG9ydCBhcHBseSBmcm9tICcuL19hcHBseS5qcyc7XG5pbXBvcnQgYXJyYXlQdXNoIGZyb20gJy4vX2FycmF5UHVzaC5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNhc3RTbGljZSBmcm9tICcuL19jYXN0U2xpY2UuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjIuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAqIH0pO1xuICpcbiAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gKiAvLyA9PiAnZnJlZCBzYXlzIGhlbGxvJ1xuICpcbiAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICogICBQcm9taXNlLnJlc29sdmUoNDApLFxuICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gKiBdKTtcbiAqXG4gKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICogICByZXR1cm4geCArIHk7XG4gKiB9KSk7XG4gKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGZ1bmMsIHN0YXJ0KSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgdmFyIGFycmF5ID0gYXJnc1tzdGFydF0sXG4gICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICBpZiAoYXJyYXkpIHtcbiAgICAgIGFycmF5UHVzaChvdGhlckFyZ3MsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzcHJlYWQ7XG4iLCJpbXBvcnQgZGVib3VuY2UgZnJvbSAnLi9kZWJvdW5jZS5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICpcbiAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRocm90dGxlO1xuIiwiaW1wb3J0IGFyeSBmcm9tICcuL2FyeS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy51bmFyeShwYXJzZUludCkpO1xuICogLy8gPT4gWzYsIDgsIDEwXVxuICovXG5mdW5jdGlvbiB1bmFyeShmdW5jKSB7XG4gIHJldHVybiBhcnkoZnVuYywgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuYXJ5O1xuIiwiaW1wb3J0IGNhc3RGdW5jdGlvbiBmcm9tICcuL19jYXN0RnVuY3Rpb24uanMnO1xuaW1wb3J0IHBhcnRpYWwgZnJvbSAnLi9wYXJ0aWFsLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAqIGFyZ3VtZW50LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZFxuICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3dyYXBwZXI9aWRlbnRpdHldIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gKiB9KTtcbiAqXG4gKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nXG4gKi9cbmZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgcmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXA7XG4iLCJpbXBvcnQgYWZ0ZXIgZnJvbSAnLi9hZnRlci5qcyc7XG5pbXBvcnQgYXJ5IGZyb20gJy4vYXJ5LmpzJztcbmltcG9ydCBiZWZvcmUgZnJvbSAnLi9iZWZvcmUuanMnO1xuaW1wb3J0IGJpbmQgZnJvbSAnLi9iaW5kLmpzJztcbmltcG9ydCBiaW5kS2V5IGZyb20gJy4vYmluZEtleS5qcyc7XG5pbXBvcnQgY3VycnkgZnJvbSAnLi9jdXJyeS5qcyc7XG5pbXBvcnQgY3VycnlSaWdodCBmcm9tICcuL2N1cnJ5UmlnaHQuanMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4vZGVib3VuY2UuanMnO1xuaW1wb3J0IGRlZmVyIGZyb20gJy4vZGVmZXIuanMnO1xuaW1wb3J0IGRlbGF5IGZyb20gJy4vZGVsYXkuanMnO1xuaW1wb3J0IGZsaXAgZnJvbSAnLi9mbGlwLmpzJztcbmltcG9ydCBtZW1vaXplIGZyb20gJy4vbWVtb2l6ZS5qcyc7XG5pbXBvcnQgbmVnYXRlIGZyb20gJy4vbmVnYXRlLmpzJztcbmltcG9ydCBvbmNlIGZyb20gJy4vb25jZS5qcyc7XG5pbXBvcnQgb3ZlckFyZ3MgZnJvbSAnLi9vdmVyQXJncy5qcyc7XG5pbXBvcnQgcGFydGlhbCBmcm9tICcuL3BhcnRpYWwuanMnO1xuaW1wb3J0IHBhcnRpYWxSaWdodCBmcm9tICcuL3BhcnRpYWxSaWdodC5qcyc7XG5pbXBvcnQgcmVhcmcgZnJvbSAnLi9yZWFyZy5qcyc7XG5pbXBvcnQgcmVzdCBmcm9tICcuL3Jlc3QuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL3NwcmVhZC5qcyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnLi90aHJvdHRsZS5qcyc7XG5pbXBvcnQgdW5hcnkgZnJvbSAnLi91bmFyeS5qcyc7XG5pbXBvcnQgd3JhcCBmcm9tICcuL3dyYXAuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFmdGVyLCBhcnksIGJlZm9yZSwgYmluZCwgYmluZEtleSxcbiAgY3VycnksIGN1cnJ5UmlnaHQsIGRlYm91bmNlLCBkZWZlciwgZGVsYXksXG4gIGZsaXAsIG1lbW9pemUsIG5lZ2F0ZSwgb25jZSwgb3ZlckFyZ3MsXG4gIHBhcnRpYWwsIHBhcnRpYWxSaWdodCwgcmVhcmcsIHJlc3QsIHNwcmVhZCxcbiAgdGhyb3R0bGUsIHVuYXJ5LCB3cmFwXG59O1xuIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuNC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5jYXN0QXJyYXkoMSk7XG4gKiAvLyA9PiBbMV1cbiAqXG4gKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IFt7ICdhJzogMSB9XVxuICpcbiAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAqIC8vID0+IFsnYWJjJ11cbiAqXG4gKiBfLmNhc3RBcnJheShudWxsKTtcbiAqIC8vID0+IFtudWxsXVxuICpcbiAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gKiAvLyA9PiBbdW5kZWZpbmVkXVxuICpcbiAqIF8uY2FzdEFycmF5KCk7XG4gKiAvLyA9PiBbXVxuICpcbiAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAqIGNvbnNvbGUubG9nKF8uY2FzdEFycmF5KGFycmF5KSA9PT0gYXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjYXN0QXJyYXkoKSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FzdEFycmF5O1xuIiwiaW1wb3J0IGFzc2lnblZhbHVlIGZyb20gJy4vX2Fzc2lnblZhbHVlLmpzJztcbmltcG9ydCBiYXNlQXNzaWduVmFsdWUgZnJvbSAnLi9fYmFzZUFzc2lnblZhbHVlLmpzJztcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvcHlPYmplY3Q7XG4iLCJpbXBvcnQgY29weU9iamVjdCBmcm9tICcuL19jb3B5T2JqZWN0LmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUFzc2lnbjtcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBuYXRpdmVLZXlzSW47XG4iLCJpbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuaW1wb3J0IG5hdGl2ZUtleXNJbiBmcm9tICcuL19uYXRpdmVLZXlzSW4uanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlS2V5c0luO1xuIiwiaW1wb3J0IGFycmF5TGlrZUtleXMgZnJvbSAnLi9fYXJyYXlMaWtlS2V5cy5qcyc7XG5pbXBvcnQgYmFzZUtleXNJbiBmcm9tICcuL19iYXNlS2V5c0luLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5c0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGtleXNJbjtcbiIsImltcG9ydCBjb3B5T2JqZWN0IGZyb20gJy4vX2NvcHlPYmplY3QuanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUFzc2lnbkluO1xuIiwiaW1wb3J0IGNvcHlPYmplY3QgZnJvbSAnLi9fY29weU9iamVjdC5qcyc7XG5pbXBvcnQgZ2V0U3ltYm9scyBmcm9tICcuL19nZXRTeW1ib2xzLmpzJztcblxuLyoqXG4gKiBDb3BpZXMgb3duIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb3B5U3ltYm9scztcbiIsImltcG9ydCBvdmVyQXJnIGZyb20gJy4vX292ZXJBcmcuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0UHJvdG90eXBlO1xuIiwiaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGdldFN5bWJvbHMgZnJvbSAnLi9fZ2V0U3ltYm9scy5qcyc7XG5pbXBvcnQgc3R1YkFycmF5IGZyb20gJy4vc3R1YkFycmF5LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAob2JqZWN0KSB7XG4gICAgYXJyYXlQdXNoKHJlc3VsdCwgZ2V0U3ltYm9scyhvYmplY3QpKTtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0U3ltYm9sc0luO1xuIiwiaW1wb3J0IGNvcHlPYmplY3QgZnJvbSAnLi9fY29weU9iamVjdC5qcyc7XG5pbXBvcnQgZ2V0U3ltYm9sc0luIGZyb20gJy4vX2dldFN5bWJvbHNJbi5qcyc7XG5cbi8qKlxuICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29weVN5bWJvbHNJbjtcbiIsImltcG9ydCBiYXNlR2V0QWxsS2V5cyBmcm9tICcuL19iYXNlR2V0QWxsS2V5cy5qcyc7XG5pbXBvcnQgZ2V0U3ltYm9sc0luIGZyb20gJy4vX2dldFN5bWJvbHNJbi5qcyc7XG5pbXBvcnQga2V5c0luIGZyb20gJy4va2V5c0luLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0QWxsS2V5c0luO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdENsb25lQXJyYXk7XG4iLCJpbXBvcnQgVWludDhBcnJheSBmcm9tICcuL19VaW50OEFycmF5LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZUFycmF5QnVmZmVyO1xuIiwiaW1wb3J0IGNsb25lQXJyYXlCdWZmZXIgZnJvbSAnLi9fY2xvbmVBcnJheUJ1ZmZlci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lRGF0YVZpZXc7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZVJlZ0V4cDtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZVN5bWJvbDtcbiIsImltcG9ydCBjbG9uZUFycmF5QnVmZmVyIGZyb20gJy4vX2Nsb25lQXJyYXlCdWZmZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZVR5cGVkQXJyYXk7XG4iLCJpbXBvcnQgY2xvbmVBcnJheUJ1ZmZlciBmcm9tICcuL19jbG9uZUFycmF5QnVmZmVyLmpzJztcbmltcG9ydCBjbG9uZURhdGFWaWV3IGZyb20gJy4vX2Nsb25lRGF0YVZpZXcuanMnO1xuaW1wb3J0IGNsb25lUmVnRXhwIGZyb20gJy4vX2Nsb25lUmVnRXhwLmpzJztcbmltcG9ydCBjbG9uZVN5bWJvbCBmcm9tICcuL19jbG9uZVN5bWJvbC5qcyc7XG5pbXBvcnQgY2xvbmVUeXBlZEFycmF5IGZyb20gJy4vX2Nsb25lVHlwZWRBcnJheS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0Q2xvbmVCeVRhZztcbiIsImltcG9ydCBiYXNlQ3JlYXRlIGZyb20gJy4vX2Jhc2VDcmVhdGUuanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGlzUHJvdG90eXBlIGZyb20gJy4vX2lzUHJvdG90eXBlLmpzJztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICA6IHt9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0Q2xvbmVPYmplY3Q7XG4iLCJpbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc01hcDtcbiIsImltcG9ydCBiYXNlSXNNYXAgZnJvbSAnLi9fYmFzZUlzTWFwLmpzJztcbmltcG9ydCBiYXNlVW5hcnkgZnJvbSAnLi9fYmFzZVVuYXJ5LmpzJztcbmltcG9ydCBub2RlVXRpbCBmcm9tICcuL19ub2RlVXRpbC5qcyc7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTWFwKG5ldyBNYXApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbmV4cG9ydCBkZWZhdWx0IGlzTWFwO1xuIiwiaW1wb3J0IGdldFRhZyBmcm9tICcuL19nZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNTZXQ7XG4iLCJpbXBvcnQgYmFzZUlzU2V0IGZyb20gJy4vX2Jhc2VJc1NldC5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgbm9kZVV0aWwgZnJvbSAnLi9fbm9kZVV0aWwuanMnO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NldChuZXcgU2V0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBpc1NldDtcbiIsImltcG9ydCBTdGFjayBmcm9tICcuL19TdGFjay5qcyc7XG5pbXBvcnQgYXJyYXlFYWNoIGZyb20gJy4vX2FycmF5RWFjaC5qcyc7XG5pbXBvcnQgYXNzaWduVmFsdWUgZnJvbSAnLi9fYXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGJhc2VBc3NpZ24gZnJvbSAnLi9fYmFzZUFzc2lnbi5qcyc7XG5pbXBvcnQgYmFzZUFzc2lnbkluIGZyb20gJy4vX2Jhc2VBc3NpZ25Jbi5qcyc7XG5pbXBvcnQgY2xvbmVCdWZmZXIgZnJvbSAnLi9fY2xvbmVCdWZmZXIuanMnO1xuaW1wb3J0IGNvcHlBcnJheSBmcm9tICcuL19jb3B5QXJyYXkuanMnO1xuaW1wb3J0IGNvcHlTeW1ib2xzIGZyb20gJy4vX2NvcHlTeW1ib2xzLmpzJztcbmltcG9ydCBjb3B5U3ltYm9sc0luIGZyb20gJy4vX2NvcHlTeW1ib2xzSW4uanMnO1xuaW1wb3J0IGdldEFsbEtleXMgZnJvbSAnLi9fZ2V0QWxsS2V5cy5qcyc7XG5pbXBvcnQgZ2V0QWxsS2V5c0luIGZyb20gJy4vX2dldEFsbEtleXNJbi5qcyc7XG5pbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaW5pdENsb25lQXJyYXkgZnJvbSAnLi9faW5pdENsb25lQXJyYXkuanMnO1xuaW1wb3J0IGluaXRDbG9uZUJ5VGFnIGZyb20gJy4vX2luaXRDbG9uZUJ5VGFnLmpzJztcbmltcG9ydCBpbml0Q2xvbmVPYmplY3QgZnJvbSAnLi9faW5pdENsb25lT2JqZWN0LmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNNYXAgZnJvbSAnLi9pc01hcC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgaXNTZXQgZnJvbSAnLi9pc1NldC5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG52YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbmNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG5jbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gRGVlcCBjbG9uZVxuICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gKiAgNCAtIENsb25lIHN5bWJvbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzQXJyKSB7XG4gICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgIGlmICghaXNEZWVwKSB7XG4gICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUNsb25lO1xuIiwiaW1wb3J0IGJhc2VDbG9uZSBmcm9tICcuL19iYXNlQ2xvbmUuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZTtcbiIsImltcG9ydCBiYXNlQ2xvbmUgZnJvbSAnLi9fYmFzZUNsb25lLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZURlZXA7XG4iLCJpbXBvcnQgYmFzZUNsb25lIGZyb20gJy4vX2Jhc2VDbG9uZS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVXaXRoYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIGVsID0gXy5jbG9uZURlZXBXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICpcbiAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAqIC8vID0+IGZhbHNlXG4gKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gKiAvLyA9PiAnQk9EWSdcbiAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAqIC8vID0+IDIwXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbG9uZURlZXBXaXRoO1xuIiwiaW1wb3J0IGJhc2VDbG9uZSBmcm9tICcuL19iYXNlQ2xvbmUuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAqIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoXG4gKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZShmYWxzZSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gKiAvLyA9PiBmYWxzZVxuICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICogLy8gPT4gJ0JPRFknXG4gKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gKiAvLyA9PiAwXG4gKi9cbmZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsb25lV2l0aDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiAhbGVuZ3RoO1xuICB9XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDb25mb3Jtc1RvO1xuIiwiaW1wb3J0IGJhc2VDb25mb3Jtc1RvIGZyb20gJy4vX2Jhc2VDb25mb3Jtc1RvLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBvYmplY3RgIGNvbmZvcm1zIHRvIGBzb3VyY2VgIGJ5IGludm9raW5nIHRoZSBwcmVkaWNhdGVcbiAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xNC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKlxuICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBrZXlzKHNvdXJjZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25mb3Jtc1RvO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUd0O1xuIiwiaW1wb3J0IHRvTnVtYmVyIGZyb20gJy4vdG9OdW1iZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICBpZiAoISh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdHlwZW9mIG90aGVyID09ICdzdHJpbmcnKSkge1xuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb247XG4iLCJpbXBvcnQgYmFzZUd0IGZyb20gJy4vX2Jhc2VHdC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbiBmcm9tICcuL19jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuOS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAc2VlIF8ubHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5ndCgzLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmd0KDMsIDMpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmd0KDEsIDMpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGd0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO1xuXG5leHBvcnQgZGVmYXVsdCBndDtcbiIsImltcG9ydCBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uIGZyb20gJy4vX2NyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24uanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy45LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAqIEBzZWUgXy5sdGVcbiAqIEBleGFtcGxlXG4gKlxuICogXy5ndGUoMywgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5ndGUoMywgMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5ndGUoMSwgMyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgZ3RlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGd0ZTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNBcnJheUJ1ZmZlcjtcbiIsImltcG9ydCBiYXNlSXNBcnJheUJ1ZmZlciBmcm9tICcuL19iYXNlSXNBcnJheUJ1ZmZlci5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgbm9kZVV0aWwgZnJvbSAnLi9fbm9kZVV0aWwuanMnO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc0FycmF5QnVmZmVyID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcjtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5QnVmZmVyID0gbm9kZUlzQXJyYXlCdWZmZXIgPyBiYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpIDogYmFzZUlzQXJyYXlCdWZmZXI7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXlCdWZmZXI7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Jvb2xlYW47XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBkYXRlVGFnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNEYXRlO1xuIiwiaW1wb3J0IGJhc2VJc0RhdGUgZnJvbSAnLi9fYmFzZUlzRGF0ZS5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgbm9kZVV0aWwgZnJvbSAnLi9fbm9kZVV0aWwuanMnO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc0RhdGUgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0RhdGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRGF0ZShuZXcgRGF0ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0RhdGUoJ01vbiBBcHJpbCAyMyAyMDEyJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNEYXRlID0gbm9kZUlzRGF0ZSA/IGJhc2VVbmFyeShub2RlSXNEYXRlKSA6IGJhc2VJc0RhdGU7XG5cbmV4cG9ydCBkZWZhdWx0IGlzRGF0ZTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQbGFpbk9iamVjdDtcbiIsImltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pc1BsYWluT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRWxlbWVudDtcbiIsImltcG9ydCBiYXNlS2V5cyBmcm9tICcuL19iYXNlS2V5cy5qcyc7XG5pbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaXNBcmd1bWVudHMgZnJvbSAnLi9pc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzUHJvdG90eXBlIGZyb20gJy4vX2lzUHJvdG90eXBlLmpzJztcbmltcG9ydCBpc1R5cGVkQXJyYXkgZnJvbSAnLi9pc1R5cGVkQXJyYXkuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAqXG4gKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAqIHByb3BlcnRpZXMuXG4gKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRW1wdHkobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KHRydWUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSgxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgfVxuICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0VtcHR5O1xuIiwiaW1wb3J0IGJhc2VJc0VxdWFsIGZyb20gJy4vX2Jhc2VJc0VxdWFsLmpzJztcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gKiBlcXVpdmFsZW50LlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucyxcbiAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gKiBieSB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET01cbiAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBvYmplY3QgPT09IG90aGVyO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRXF1YWw7XG4iLCJpbXBvcnQgYmFzZUlzRXF1YWwgZnJvbSAnLi9fYmFzZUlzRXF1YWwuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICogc2l4IGFyZ3VtZW50czogKG9ialZhbHVlLCBvdGhWYWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrXSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gKiAgICAgcmV0dXJuIHRydWU7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICpcbiAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKHZhbHVlLCBvdGhlcikgOiB1bmRlZmluZWQ7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsV2l0aDtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFcnJvcihFcnJvcik7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICh0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PSAnc3RyaW5nJyAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0Vycm9yO1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0Zpbml0ZSA9IHJvb3QuaXNGaW5pdGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Zpbml0ZSgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRmluaXRlKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIG5hdGl2ZUlzRmluaXRlKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNGaW5pdGU7XG4iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BOdW1iZXIuaXNJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzSW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzSW50ZWdlcigzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzSW50ZWdlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNJbnRlZ2VyO1xuIiwiaW1wb3J0IGJhc2VJc01hdGNoIGZyb20gJy4vX2Jhc2VJc01hdGNoLmpzJztcbmltcG9ydCBnZXRNYXRjaERhdGEgZnJvbSAnLi9fZ2V0TWF0Y2hEYXRhLmpzJztcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICogcGFydGlhbGx5IGFwcGxpZWQuXG4gKlxuICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqXG4gKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTWF0Y2g7XG4iLCJpbXBvcnQgYmFzZUlzTWF0Y2ggZnJvbSAnLi9fYmFzZUlzTWF0Y2guanMnO1xuaW1wb3J0IGdldE1hdGNoRGF0YSBmcm9tICcuL19nZXRNYXRjaERhdGEuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBmaXZlXG4gKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhzcmNWYWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdHJ1ZTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAqIHZhciBzb3VyY2UgPSB7ICdncmVldGluZyc6ICdoaScgfTtcbiAqXG4gKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNNYXRjaFdpdGg7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTnVtYmVyO1xuIiwiaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXNOdW1iZXIuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAqIGdsb2JhbCBbYGlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vaXNOYU4pIHdoaWNoIHJldHVybnMgYHRydWVgIGZvclxuICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOYU4oTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogaXNOYU4odW5kZWZpbmVkKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAvLyBBbiBgTmFOYCBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLlxuICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNOYU47XG4iLCJpbXBvcnQgY29yZUpzRGF0YSBmcm9tICcuL19jb3JlSnNEYXRhLmpzJztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXNGdW5jdGlvbi5qcyc7XG5pbXBvcnQgc3R1YkZhbHNlIGZyb20gJy4vc3R1YkZhbHNlLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xudmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgaXNNYXNrYWJsZTtcbiIsImltcG9ydCBiYXNlSXNOYXRpdmUgZnJvbSAnLi9fYmFzZUlzTmF0aXZlLmpzJztcbmltcG9ydCBpc01hc2thYmxlIGZyb20gJy4vX2lzTWFza2FibGUuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLic7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAqIERlc3BpdGUgbXVsdGlwbGUgcmVxdWVzdHMsIHRoZSBjb3JlLWpzIG1haW50YWluZXIgaGFzIG1hZGUgaXQgY2xlYXI6IGFueVxuICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICogcGFja2FnZXMsIGxpa2UgW2JhYmVsLXBvbHlmaWxsXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iYWJlbC1wb2x5ZmlsbCksXG4gKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmF0aXZlKF8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTmF0aXZlO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmlsKG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOaWwodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmlsKE5hTik7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNOaWw7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc051bGwobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bGwodm9pZCAwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTnVsbDtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHJlZ2V4cFRhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzUmVnRXhwO1xuIiwiaW1wb3J0IGJhc2VJc1JlZ0V4cCBmcm9tICcuL19iYXNlSXNSZWdFeHAuanMnO1xuaW1wb3J0IGJhc2VVbmFyeSBmcm9tICcuL19iYXNlVW5hcnkuanMnO1xuaW1wb3J0IG5vZGVVdGlsIGZyb20gJy4vX25vZGVVdGlsLmpzJztcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuZXhwb3J0IGRlZmF1bHQgaXNSZWdFeHA7XG4iLCJpbXBvcnQgaXNJbnRlZ2VyIGZyb20gJy4vaXNJbnRlZ2VyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gKiBkb3VibGUgcHJlY2lzaW9uIG51bWJlciB3aGljaCBpc24ndCB0aGUgcmVzdWx0IG9mIGEgcm91bmRlZCB1bnNhZmUgaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzU2FmZUludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNTYWZlSW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzU2FmZUludGVnZXI7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzVW5kZWZpbmVkO1xuIiwiaW1wb3J0IGdldFRhZyBmcm9tICcuL19nZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha01hcGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNXZWFrTWFwO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gd2Vha1NldFRhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNXZWFrU2V0O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUx0O1xuIiwiaW1wb3J0IGJhc2VMdCBmcm9tICcuL19iYXNlTHQuanMnO1xuaW1wb3J0IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24gZnJvbSAnLi9fY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbi5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjkuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQHNlZSBfLmd0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubHQoMSwgMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5sdCgzLCAzKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5sdCgzLCAxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBsdCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTtcblxuZXhwb3J0IGRlZmF1bHQgbHQ7XG4iLCJpbXBvcnQgY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbiBmcm9tICcuL19jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuOS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gKiBAc2VlIF8uZ3RlXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubHRlKDEsIDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8ubHRlKDMsIDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8ubHRlKDMsIDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGx0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsdGU7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgdmFyIGRhdGEsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXRlcmF0b3JUb0FycmF5O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNjaWlUb0FycmF5O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuaWNvZGVUb0FycmF5O1xuIiwiaW1wb3J0IGFzY2lpVG9BcnJheSBmcm9tICcuL19hc2NpaVRvQXJyYXkuanMnO1xuaW1wb3J0IGhhc1VuaWNvZGUgZnJvbSAnLi9faGFzVW5pY29kZS5qcyc7XG5pbXBvcnQgdW5pY29kZVRvQXJyYXkgZnJvbSAnLi9fdW5pY29kZVRvQXJyYXkuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5nVG9BcnJheTtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBjb3B5QXJyYXkgZnJvbSAnLi9fY29weUFycmF5LmpzJztcbmltcG9ydCBnZXRUYWcgZnJvbSAnLi9fZ2V0VGFnLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCBpdGVyYXRvclRvQXJyYXkgZnJvbSAnLi9faXRlcmF0b3JUb0FycmF5LmpzJztcbmltcG9ydCBtYXBUb0FycmF5IGZyb20gJy4vX21hcFRvQXJyYXkuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5pbXBvcnQgc3RyaW5nVG9BcnJheSBmcm9tICcuL19zdHJpbmdUb0FycmF5LmpzJztcbmltcG9ydCB2YWx1ZXMgZnJvbSAnLi92YWx1ZXMuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bUl0ZXJhdG9yID0gU3ltYm9sID8gU3ltYm9sLml0ZXJhdG9yIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiBfLnRvQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKlxuICogXy50b0FycmF5KDEpO1xuICogLy8gPT4gW11cbiAqXG4gKiBfLnRvQXJyYXkobnVsbCk7XG4gKiAvLyA9PiBbXVxuICovXG5mdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gIH1cbiAgaWYgKHN5bUl0ZXJhdG9yICYmIHZhbHVlW3N5bUl0ZXJhdG9yXSkge1xuICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICByZXR1cm4gZnVuYyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvQXJyYXk7XG4iLCJpbXBvcnQgY29weU9iamVjdCBmcm9tICcuL19jb3B5T2JqZWN0LmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAqL1xuZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvUGxhaW5PYmplY3Q7XG4iLCJpbXBvcnQgYmFzZUNsYW1wIGZyb20gJy4vX2Jhc2VDbGFtcC5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICogcmVwcmVzZW50ZWQgY29ycmVjdGx5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICpcbiAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgLU1BWF9TQUZFX0lOVEVHRVIsIE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1NhZmVJbnRlZ2VyO1xuIiwiaW1wb3J0IGNhc3RBcnJheSBmcm9tICcuL2Nhc3RBcnJheS5qcyc7XG5pbXBvcnQgY2xvbmUgZnJvbSAnLi9jbG9uZS5qcyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJy4vY2xvbmVEZWVwLmpzJztcbmltcG9ydCBjbG9uZURlZXBXaXRoIGZyb20gJy4vY2xvbmVEZWVwV2l0aC5qcyc7XG5pbXBvcnQgY2xvbmVXaXRoIGZyb20gJy4vY2xvbmVXaXRoLmpzJztcbmltcG9ydCBjb25mb3Jtc1RvIGZyb20gJy4vY29uZm9ybXNUby5qcyc7XG5pbXBvcnQgZXEgZnJvbSAnLi9lcS5qcyc7XG5pbXBvcnQgZ3QgZnJvbSAnLi9ndC5qcyc7XG5pbXBvcnQgZ3RlIGZyb20gJy4vZ3RlLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNBcnJheUJ1ZmZlciBmcm9tICcuL2lzQXJyYXlCdWZmZXIuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuaW1wb3J0IGlzQm9vbGVhbiBmcm9tICcuL2lzQm9vbGVhbi5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNEYXRlIGZyb20gJy4vaXNEYXRlLmpzJztcbmltcG9ydCBpc0VsZW1lbnQgZnJvbSAnLi9pc0VsZW1lbnQuanMnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnLi9pc0VtcHR5LmpzJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJy4vaXNFcXVhbC5qcyc7XG5pbXBvcnQgaXNFcXVhbFdpdGggZnJvbSAnLi9pc0VxdWFsV2l0aC5qcyc7XG5pbXBvcnQgaXNFcnJvciBmcm9tICcuL2lzRXJyb3IuanMnO1xuaW1wb3J0IGlzRmluaXRlIGZyb20gJy4vaXNGaW5pdGUuanMnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc0ludGVnZXIgZnJvbSAnLi9pc0ludGVnZXIuanMnO1xuaW1wb3J0IGlzTGVuZ3RoIGZyb20gJy4vaXNMZW5ndGguanMnO1xuaW1wb3J0IGlzTWFwIGZyb20gJy4vaXNNYXAuanMnO1xuaW1wb3J0IGlzTWF0Y2ggZnJvbSAnLi9pc01hdGNoLmpzJztcbmltcG9ydCBpc01hdGNoV2l0aCBmcm9tICcuL2lzTWF0Y2hXaXRoLmpzJztcbmltcG9ydCBpc05hTiBmcm9tICcuL2lzTmFOLmpzJztcbmltcG9ydCBpc05hdGl2ZSBmcm9tICcuL2lzTmF0aXZlLmpzJztcbmltcG9ydCBpc05pbCBmcm9tICcuL2lzTmlsLmpzJztcbmltcG9ydCBpc051bGwgZnJvbSAnLi9pc051bGwuanMnO1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXNOdW1iZXIuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QuanMnO1xuaW1wb3J0IGlzUmVnRXhwIGZyb20gJy4vaXNSZWdFeHAuanMnO1xuaW1wb3J0IGlzU2FmZUludGVnZXIgZnJvbSAnLi9pc1NhZmVJbnRlZ2VyLmpzJztcbmltcG9ydCBpc1NldCBmcm9tICcuL2lzU2V0LmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcbmltcG9ydCBpc1R5cGVkQXJyYXkgZnJvbSAnLi9pc1R5cGVkQXJyYXkuanMnO1xuaW1wb3J0IGlzVW5kZWZpbmVkIGZyb20gJy4vaXNVbmRlZmluZWQuanMnO1xuaW1wb3J0IGlzV2Vha01hcCBmcm9tICcuL2lzV2Vha01hcC5qcyc7XG5pbXBvcnQgaXNXZWFrU2V0IGZyb20gJy4vaXNXZWFrU2V0LmpzJztcbmltcG9ydCBsdCBmcm9tICcuL2x0LmpzJztcbmltcG9ydCBsdGUgZnJvbSAnLi9sdGUuanMnO1xuaW1wb3J0IHRvQXJyYXkgZnJvbSAnLi90b0FycmF5LmpzJztcbmltcG9ydCB0b0Zpbml0ZSBmcm9tICcuL3RvRmluaXRlLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHRvTGVuZ3RoIGZyb20gJy4vdG9MZW5ndGguanMnO1xuaW1wb3J0IHRvTnVtYmVyIGZyb20gJy4vdG9OdW1iZXIuanMnO1xuaW1wb3J0IHRvUGxhaW5PYmplY3QgZnJvbSAnLi90b1BsYWluT2JqZWN0LmpzJztcbmltcG9ydCB0b1NhZmVJbnRlZ2VyIGZyb20gJy4vdG9TYWZlSW50ZWdlci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY2FzdEFycmF5LCBjbG9uZSwgY2xvbmVEZWVwLCBjbG9uZURlZXBXaXRoLCBjbG9uZVdpdGgsXG4gIGNvbmZvcm1zVG8sIGVxLCBndCwgZ3RlLCBpc0FyZ3VtZW50cyxcbiAgaXNBcnJheSwgaXNBcnJheUJ1ZmZlciwgaXNBcnJheUxpa2UsIGlzQXJyYXlMaWtlT2JqZWN0LCBpc0Jvb2xlYW4sXG4gIGlzQnVmZmVyLCBpc0RhdGUsIGlzRWxlbWVudCwgaXNFbXB0eSwgaXNFcXVhbCxcbiAgaXNFcXVhbFdpdGgsIGlzRXJyb3IsIGlzRmluaXRlLCBpc0Z1bmN0aW9uLCBpc0ludGVnZXIsXG4gIGlzTGVuZ3RoLCBpc01hcCwgaXNNYXRjaCwgaXNNYXRjaFdpdGgsIGlzTmFOLFxuICBpc05hdGl2ZSwgaXNOaWwsIGlzTnVsbCwgaXNOdW1iZXIsIGlzT2JqZWN0LFxuICBpc09iamVjdExpa2UsIGlzUGxhaW5PYmplY3QsIGlzUmVnRXhwLCBpc1NhZmVJbnRlZ2VyLCBpc1NldCxcbiAgaXNTdHJpbmcsIGlzU3ltYm9sLCBpc1R5cGVkQXJyYXksIGlzVW5kZWZpbmVkLCBpc1dlYWtNYXAsXG4gIGlzV2Vha1NldCwgbHQsIGx0ZSwgdG9BcnJheSwgdG9GaW5pdGUsXG4gIHRvSW50ZWdlciwgdG9MZW5ndGgsIHRvTnVtYmVyLCB0b1BsYWluT2JqZWN0LCB0b1NhZmVJbnRlZ2VyLFxuICB0b1N0cmluZ1xufTtcbiIsImltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAqIGNvbnZlcnNpb25zIG9mIGJpbmFyeSwgaGV4YWRlY2ltYWwsIG9yIG9jdGFsIHN0cmluZyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIHJldHVybiArdmFsdWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VUb051bWJlcjtcbiIsImltcG9ydCBiYXNlVG9OdW1iZXIgZnJvbSAnLi9fYmFzZVRvTnVtYmVyLmpzJztcbmltcG9ydCBiYXNlVG9TdHJpbmcgZnJvbSAnLi9fYmFzZVRvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZSA9IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gYmFzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTWF0aE9wZXJhdGlvbjtcbiIsImltcG9ydCBjcmVhdGVNYXRoT3BlcmF0aW9uIGZyb20gJy4vX2NyZWF0ZU1hdGhPcGVyYXRpb24uanMnO1xuXG4vKipcbiAqIEFkZHMgdHdvIG51bWJlcnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjQuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5hZGQoNiwgNCk7XG4gKiAvLyA9PiAxMFxuICovXG52YXIgYWRkID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsIGFkZGVuZCkge1xuICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xufSwgMCk7XG5cbmV4cG9ydCBkZWZhdWx0IGFkZDtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0Zpbml0ZSA9IHJvb3QuaXNGaW5pdGUsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ucm91bmRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgYE1hdGhgIG1ldGhvZCB0byB1c2Ugd2hlbiByb3VuZGluZy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKSB7XG4gIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAvLyBTaGlmdCB3aXRoIGV4cG9uZW50aWFsIG5vdGF0aW9uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGlzc3Vlcy5cbiAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgdmFsdWUgPSBmdW5jKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcblxuICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJvdW5kO1xuIiwiaW1wb3J0IGNyZWF0ZVJvdW5kIGZyb20gJy4vX2NyZWF0ZVJvdW5kLmpzJztcblxuLyoqXG4gKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4xMC4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNlaWwoNC4wMDYpO1xuICogLy8gPT4gNVxuICpcbiAqIF8uY2VpbCg2LjAwNCwgMik7XG4gKiAvLyA9PiA2LjAxXG4gKlxuICogXy5jZWlsKDYwNDAsIC0yKTtcbiAqIC8vID0+IDYxMDBcbiAqL1xudmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjZWlsO1xuIiwiaW1wb3J0IGNyZWF0ZU1hdGhPcGVyYXRpb24gZnJvbSAnLi9fY3JlYXRlTWF0aE9wZXJhdGlvbi5qcyc7XG5cbi8qKlxuICogRGl2aWRlIHR3byBudW1iZXJzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC43LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHF1b3RpZW50LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRpdmlkZSg2LCA0KTtcbiAqIC8vID0+IDEuNVxuICovXG52YXIgZGl2aWRlID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCwgZGl2aXNvcikge1xuICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xufSwgMSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpdmlkZTtcbiIsImltcG9ydCBjcmVhdGVSb3VuZCBmcm9tICcuL19jcmVhdGVSb3VuZC5qcyc7XG5cbi8qKlxuICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4xMC4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIGRvd24gbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsb29yKDQuMDA2KTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLmZsb29yKDAuMDQ2LCAyKTtcbiAqIC8vID0+IDAuMDRcbiAqXG4gKiBfLmZsb29yKDQwNjAsIC0yKTtcbiAqIC8vID0+IDQwMDBcbiAqL1xudmFyIGZsb29yID0gY3JlYXRlUm91bmQoJ2Zsb29yJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGZsb29yO1xuIiwiaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgKSkge1xuICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUV4dHJlbXVtO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zdW1gIGFuZCBgXy5zdW1CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gKi9cbmZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gY3VycmVudCA6IChyZXN1bHQgKyBjdXJyZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVN1bTtcbiIsImltcG9ydCBiYXNlU3VtIGZyb20gJy4vX2Jhc2VTdW0uanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1lYW47XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZVN1bSBmcm9tICcuL19iYXNlU3VtLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgc3VtbWVkLlxuICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICpcbiAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IDIwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnN1bUJ5KG9iamVjdHMsICduJyk7XG4gKiAvLyA9PiAyMFxuICovXG5mdW5jdGlvbiBzdW1CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlU3VtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgIDogMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3VtQnk7XG4iLCJpbXBvcnQgYWRkIGZyb20gJy4vYWRkLmpzJztcbmltcG9ydCBjZWlsIGZyb20gJy4vY2VpbC5qcyc7XG5pbXBvcnQgZGl2aWRlIGZyb20gJy4vZGl2aWRlLmpzJztcbmltcG9ydCBmbG9vciBmcm9tICcuL2Zsb29yLmpzJztcbmltcG9ydCBtYXggZnJvbSAnLi9tYXguanMnO1xuaW1wb3J0IG1heEJ5IGZyb20gJy4vbWF4QnkuanMnO1xuaW1wb3J0IG1lYW4gZnJvbSAnLi9tZWFuLmpzJztcbmltcG9ydCBtZWFuQnkgZnJvbSAnLi9tZWFuQnkuanMnO1xuaW1wb3J0IG1pbiBmcm9tICcuL21pbi5qcyc7XG5pbXBvcnQgbWluQnkgZnJvbSAnLi9taW5CeS5qcyc7XG5pbXBvcnQgbXVsdGlwbHkgZnJvbSAnLi9tdWx0aXBseS5qcyc7XG5pbXBvcnQgcm91bmQgZnJvbSAnLi9yb3VuZC5qcyc7XG5pbXBvcnQgc3VidHJhY3QgZnJvbSAnLi9zdWJ0cmFjdC5qcyc7XG5pbXBvcnQgc3VtIGZyb20gJy4vc3VtLmpzJztcbmltcG9ydCBzdW1CeSBmcm9tICcuL3N1bUJ5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhZGQsIGNlaWwsIGRpdmlkZSwgZmxvb3IsIG1heCxcbiAgbWF4QnksIG1lYW4sIG1lYW5CeSwgbWluLCBtaW5CeSxcbiAgbXVsdGlwbHksIHJvdW5kLCBzdWJ0cmFjdCwgc3VtLCBzdW1CeVxufTtcbiIsImltcG9ydCBiYXNlRXh0cmVtdW0gZnJvbSAnLi9fYmFzZUV4dHJlbXVtLmpzJztcbmltcG9ydCBiYXNlR3QgZnJvbSAnLi9fYmFzZUd0LmpzJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiA4XG4gKlxuICogXy5tYXgoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1heChhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWF4O1xuIiwiaW1wb3J0IGJhc2VFeHRyZW11bSBmcm9tICcuL19iYXNlRXh0cmVtdW0uanMnO1xuaW1wb3J0IGJhc2VHdCBmcm9tICcuL19iYXNlR3QuanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWF4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWF4Qnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAyIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAyIH1cbiAqL1xuZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1heEJ5O1xuIiwiaW1wb3J0IGJhc2VNZWFuIGZyb20gJy4vX2Jhc2VNZWFuLmpzJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDVcbiAqL1xuZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGlkZW50aXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVhbjtcbiIsImltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlTWVhbiBmcm9tICcuL19iYXNlTWVhbi5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBhdmVyYWdlZC5cbiAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC43LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gKlxuICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IDVcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWVhbkJ5KG9iamVjdHMsICduJyk7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIG1lYW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVhbkJ5O1xuIiwiaW1wb3J0IGJhc2VFeHRyZW11bSBmcm9tICcuL19iYXNlRXh0cmVtdW0uanMnO1xuaW1wb3J0IGJhc2VMdCBmcm9tICcuL19iYXNlTHQuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLm1pbihbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtaW47XG4iLCJpbXBvcnQgYmFzZUV4dHJlbXVtIGZyb20gJy4vX2Jhc2VFeHRyZW11bS5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgYmFzZUx0IGZyb20gJy4vX2Jhc2VMdC5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gKlxuICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICogLy8gPT4geyAnbic6IDEgfVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICogLy8gPT4geyAnbic6IDEgfVxuICovXG5mdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWluQnk7XG4iLCJpbXBvcnQgY3JlYXRlTWF0aE9wZXJhdGlvbiBmcm9tICcuL19jcmVhdGVNYXRoT3BlcmF0aW9uLmpzJztcblxuLyoqXG4gKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuNy4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcHJvZHVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tdWx0aXBseSg2LCA0KTtcbiAqIC8vID0+IDI0XG4gKi9cbnZhciBtdWx0aXBseSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllciwgbXVsdGlwbGljYW5kKSB7XG4gIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xufSwgMSk7XG5cbmV4cG9ydCBkZWZhdWx0IG11bHRpcGx5O1xuIiwiaW1wb3J0IGNyZWF0ZVJvdW5kIGZyb20gJy4vX2NyZWF0ZVJvdW5kLmpzJztcblxuLyoqXG4gKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4xMC4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB0by5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJvdW5kKDQuMDA2KTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAqIC8vID0+IDQuMDFcbiAqXG4gKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAqIC8vID0+IDQxMDBcbiAqL1xudmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHJvdW5kO1xuIiwiaW1wb3J0IGNyZWF0ZU1hdGhPcGVyYXRpb24gZnJvbSAnLi9fY3JlYXRlTWF0aE9wZXJhdGlvbi5qcyc7XG5cbi8qKlxuICogU3VidHJhY3QgdHdvIG51bWJlcnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW51ZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnN1YnRyYWN0KDYsIDQpO1xuICogLy8gPT4gMlxuICovXG52YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kO1xufSwgMCk7XG5cbmV4cG9ydCBkZWZhdWx0IHN1YnRyYWN0O1xuIiwiaW1wb3J0IGJhc2VTdW0gZnJvbSAnLi9fYmFzZVN1bS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjQuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiAyMFxuICovXG5mdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlU3VtKGFycmF5LCBpZGVudGl0eSlcbiAgICA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN1bTtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCB0b051bWJlciBmcm9tICcuL3RvTnVtYmVyLmpzJztcblxuLyoqXG4gKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICogLy8gPT4gLTVcbiAqXG4gKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXBwZXIgPSBsb3dlcjtcbiAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICB9XG4gIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gIH1cbiAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFtcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUluUmFuZ2U7XG4iLCJpbXBvcnQgYmFzZUluUmFuZ2UgZnJvbSAnLi9fYmFzZUluUmFuZ2UuanMnO1xuaW1wb3J0IHRvRmluaXRlIGZyb20gJy4vdG9GaW5pdGUuanMnO1xuaW1wb3J0IHRvTnVtYmVyIGZyb20gJy4vdG9OdW1iZXIuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gKiBuZWdhdGl2ZSByYW5nZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjMuMFxuICogQGNhdGVnb3J5IE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluUmFuZ2UoNCwgOCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pblJhbmdlKDQsIDIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluUmFuZ2UoMiwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgfVxuICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5SYW5nZTtcbiIsImltcG9ydCBiYXNlUmFuZG9tIGZyb20gJy4vX2Jhc2VSYW5kb20uanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcbmltcG9ydCB0b0Zpbml0ZSBmcm9tICcuL3RvRmluaXRlLmpzJztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbixcbiAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjcuMFxuICogQGNhdGVnb3J5IE51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmFuZG9tKDAsIDUpO1xuICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAqXG4gKiBfLnJhbmRvbSg1KTtcbiAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAqXG4gKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICpcbiAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAqL1xuZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG93ZXIgPSAwO1xuICAgIHVwcGVyID0gMTtcbiAgfVxuICBlbHNlIHtcbiAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgIGxvd2VyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgfVxuICB9XG4gIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICBsb3dlciA9IHVwcGVyO1xuICAgIHVwcGVyID0gdGVtcDtcbiAgfVxuICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICB9XG4gIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJhbmRvbTtcbiIsImltcG9ydCBjbGFtcCBmcm9tICcuL2NsYW1wLmpzJztcbmltcG9ydCBpblJhbmdlIGZyb20gJy4vaW5SYW5nZS5qcyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJy4vcmFuZG9tLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjbGFtcCwgaW5SYW5nZSwgcmFuZG9tXG59O1xuIiwiaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBpc0l0ZXJhdGVlQ2FsbCBmcm9tICcuL19pc0l0ZXJhdGVlQ2FsbC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUFzc2lnbmVyO1xuIiwiaW1wb3J0IGFzc2lnblZhbHVlIGZyb20gJy4vX2Fzc2lnblZhbHVlLmpzJztcbmltcG9ydCBjb3B5T2JqZWN0IGZyb20gJy4vX2NvcHlPYmplY3QuanMnO1xuaW1wb3J0IGNyZWF0ZUFzc2lnbmVyIGZyb20gJy4vX2NyZWF0ZUFzc2lnbmVyLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1Byb3RvdHlwZSBmcm9tICcuL19pc1Byb3RvdHlwZS5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEwLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5hc3NpZ25JblxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gQmFyKCkge1xuICogICB0aGlzLmMgPSAzO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbnZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ247XG4iLCJpbXBvcnQgY29weU9iamVjdCBmcm9tICcuL19jb3B5T2JqZWN0LmpzJztcbmltcG9ydCBjcmVhdGVBc3NpZ25lciBmcm9tICcuL19jcmVhdGVBc3NpZ25lci5qcyc7XG5pbXBvcnQga2V5c0luIGZyb20gJy4va2V5c0luLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBvd24gYW5kXG4gKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGFsaWFzIGV4dGVuZFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmFzc2lnblxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogZnVuY3Rpb24gQmFyKCkge1xuICogICB0aGlzLmMgPSAzO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICpcbiAqIF8uYXNzaWduSW4oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gKi9cbnZhciBhc3NpZ25JbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ25JbjtcbiIsImltcG9ydCBjb3B5T2JqZWN0IGZyb20gJy4vX2NvcHlPYmplY3QuanMnO1xuaW1wb3J0IGNyZWF0ZUFzc2lnbmVyIGZyb20gJy4vX2NyZWF0ZUFzc2lnbmVyLmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBhbGlhcyBleHRlbmRXaXRoXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmFzc2lnbldpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAqIH1cbiAqXG4gKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gKlxuICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXNzaWduSW5XaXRoO1xuIiwiaW1wb3J0IGNvcHlPYmplY3QgZnJvbSAnLi9fY29weU9iamVjdC5qcyc7XG5pbXBvcnQgY3JlYXRlQXNzaWduZXIgZnJvbSAnLi9fY3JlYXRlQXNzaWduZXIuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5hc3NpZ25JbldpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAqIH1cbiAqXG4gKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICpcbiAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBhc3NpZ25XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgYXNzaWduV2l0aDtcbiIsImltcG9ydCBiYXNlQXQgZnJvbSAnLi9fYmFzZUF0LmpzJztcbmltcG9ydCBmbGF0UmVzdCBmcm9tICcuL19mbGF0UmVzdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBgcGF0aHNgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICpcbiAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gKiAvLyA9PiBbMywgNF1cbiAqL1xudmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuZXhwb3J0IGRlZmF1bHQgYXQ7XG4iLCJpbXBvcnQgYmFzZUFzc2lnbiBmcm9tICcuL19iYXNlQXNzaWduLmpzJztcbmltcG9ydCBiYXNlQ3JlYXRlIGZyb20gJy4vX2Jhc2VDcmVhdGUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAqICAgdGhpcy54ID0gMDtcbiAqICAgdGhpcy55ID0gMDtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gKiB9XG4gKlxuICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAqIH0pO1xuICpcbiAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZTtcbiIsImltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgZXEgZnJvbSAnLi9lcS5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICBsZW5ndGggPSAxO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCJpbXBvcnQgYmFzZUFzc2lnblZhbHVlIGZyb20gJy4vX2Jhc2VBc3NpZ25WYWx1ZS5qcyc7XG5pbXBvcnQgZXEgZnJvbSAnLi9lcS5qcyc7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2FmZUdldDtcbiIsImltcG9ydCBhc3NpZ25NZXJnZVZhbHVlIGZyb20gJy4vX2Fzc2lnbk1lcmdlVmFsdWUuanMnO1xuaW1wb3J0IGNsb25lQnVmZmVyIGZyb20gJy4vX2Nsb25lQnVmZmVyLmpzJztcbmltcG9ydCBjbG9uZVR5cGVkQXJyYXkgZnJvbSAnLi9fY2xvbmVUeXBlZEFycmF5LmpzJztcbmltcG9ydCBjb3B5QXJyYXkgZnJvbSAnLi9fY29weUFycmF5LmpzJztcbmltcG9ydCBpbml0Q2xvbmVPYmplY3QgZnJvbSAnLi9faW5pdENsb25lT2JqZWN0LmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzRnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pc1BsYWluT2JqZWN0LmpzJztcbmltcG9ydCBpc1R5cGVkQXJyYXkgZnJvbSAnLi9pc1R5cGVkQXJyYXkuanMnO1xuaW1wb3J0IHNhZmVHZXQgZnJvbSAnLi9fc2FmZUdldC5qcyc7XG5pbXBvcnQgdG9QbGFpbk9iamVjdCBmcm9tICcuL3RvUGxhaW5PYmplY3QuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgaWYgKHN0YWNrZWQpIHtcbiAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICA6IHVuZGVmaW5lZDtcblxuICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gIGlmIChpc0NvbW1vbikge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNDb21tb24pIHtcbiAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gIH1cbiAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlTWVyZ2VEZWVwO1xuIiwiaW1wb3J0IFN0YWNrIGZyb20gJy4vX1N0YWNrLmpzJztcbmltcG9ydCBhc3NpZ25NZXJnZVZhbHVlIGZyb20gJy4vX2Fzc2lnbk1lcmdlVmFsdWUuanMnO1xuaW1wb3J0IGJhc2VGb3IgZnJvbSAnLi9fYmFzZUZvci5qcyc7XG5pbXBvcnQgYmFzZU1lcmdlRGVlcCBmcm9tICcuL19iYXNlTWVyZ2VEZWVwLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuaW1wb3J0IHNhZmVHZXQgZnJvbSAnLi9fc2FmZUdldC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1lcmdlO1xuIiwiaW1wb3J0IGJhc2VNZXJnZSBmcm9tICcuL19iYXNlTWVyZ2UuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlXG4gKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBvYmpWYWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tRGVmYXVsdHNNZXJnZTtcbiIsImltcG9ydCBiYXNlTWVyZ2UgZnJvbSAnLi9fYmFzZU1lcmdlLmpzJztcbmltcG9ydCBjcmVhdGVBc3NpZ25lciBmcm9tICcuL19jcmVhdGVBc3NpZ25lci5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICpcbiAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICovXG52YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1lcmdlV2l0aDtcbiIsImltcG9ydCBhcHBseSBmcm9tICcuL19hcHBseS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGN1c3RvbURlZmF1bHRzTWVyZ2UgZnJvbSAnLi9fY3VzdG9tRGVmYXVsdHNNZXJnZS5qcyc7XG5pbXBvcnQgbWVyZ2VXaXRoIGZyb20gJy4vbWVyZ2VXaXRoLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjEwLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5kZWZhdWx0c1xuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gKi9cbnZhciBkZWZhdWx0c0RlZXAgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRzRGVlcDtcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9QYWlyc2AgYW5kIGBfLnRvUGFpcnNJbmAgd2hpY2ggY3JlYXRlcyBhbiBhcnJheVxuICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVRvUGFpcnM7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlLXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IFt2YWx1ZSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0VG9QYWlycztcbiIsImltcG9ydCBiYXNlVG9QYWlycyBmcm9tICcuL19iYXNlVG9QYWlycy5qcyc7XG5pbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgbWFwVG9BcnJheSBmcm9tICcuL19tYXBUb0FycmF5LmpzJztcbmltcG9ydCBzZXRUb1BhaXJzIGZyb20gJy4vX3NldFRvUGFpcnMuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLnRvUGFpcnNgIG9yIGBfLnRvUGFpcnNJbmAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYSBnaXZlbiBvYmplY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgIGlmICh0YWcgPT0gbWFwVGFnKSB7XG4gICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgIH1cbiAgICBpZiAodGFnID09IHNldFRhZykge1xuICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VUb1BhaXJzKG9iamVjdCwga2V5c0Z1bmMob2JqZWN0KSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVRvUGFpcnM7XG4iLCJpbXBvcnQgY3JlYXRlVG9QYWlycyBmcm9tICcuL19jcmVhdGVUb1BhaXJzLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBhbGlhcyBlbnRyaWVzXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy50b1BhaXJzKG5ldyBGb28pO1xuICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xudmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG5leHBvcnQgZGVmYXVsdCB0b1BhaXJzO1xuIiwiaW1wb3J0IGNyZWF0ZVRvUGFpcnMgZnJvbSAnLi9fY3JlYXRlVG9QYWlycy5qcyc7XG5pbXBvcnQga2V5c0luIGZyb20gJy4va2V5c0luLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAYWxpYXMgZW50cmllc0luXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xudmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuZXhwb3J0IGRlZmF1bHQgdG9QYWlyc0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZmluZEtleWAgYW5kIGBfLmZpbmRMYXN0S2V5YCxcbiAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICB2YXIgcmVzdWx0O1xuICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGaW5kS2V5O1xuIiwiaW1wb3J0IGJhc2VGaW5kS2V5IGZyb20gJy4vX2Jhc2VGaW5kS2V5LmpzJztcbmltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0ge1xuICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogfTtcbiAqXG4gKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kS2V5KHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+ICdwZWJibGVzJ1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gJ2ZyZWQnXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+ICdiYXJuZXknXG4gKi9cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmaW5kS2V5O1xuIiwiaW1wb3J0IGJhc2VGaW5kS2V5IGZyb20gJy4vX2Jhc2VGaW5kS2V5LmpzJztcbmltcG9ydCBiYXNlRm9yT3duUmlnaHQgZnJvbSAnLi9fYmFzZUZvck93blJpZ2h0LmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0ge1xuICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogfTtcbiAqXG4gKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiAnZnJlZCdcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+ICdwZWJibGVzJ1xuICovXG5mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZExhc3RLZXk7XG4iLCJpbXBvcnQgYmFzZUZvciBmcm9tICcuL19iYXNlRm9yLmpzJztcbmltcG9ydCBjYXN0RnVuY3Rpb24gZnJvbSAnLi9fY2FzdEZ1bmN0aW9uLmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICA/IG9iamVjdFxuICAgIDogYmFzZUZvcihvYmplY3QsIGNhc3RGdW5jdGlvbihpdGVyYXRlZSksIGtleXNJbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvckluO1xuIiwiaW1wb3J0IGJhc2VGb3JSaWdodCBmcm9tICcuL19iYXNlRm9yUmlnaHQuanMnO1xuaW1wb3J0IGNhc3RGdW5jdGlvbiBmcm9tICcuL19jYXN0RnVuY3Rpb24uanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5mb3JJblxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gKi9cbmZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICA/IG9iamVjdFxuICAgIDogYmFzZUZvclJpZ2h0KG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ySW5SaWdodDtcbiIsImltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuaW1wb3J0IGNhc3RGdW5jdGlvbiBmcm9tICcuL19jYXN0RnVuY3Rpb24uanMnO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvck93bjtcbiIsImltcG9ydCBiYXNlRm9yT3duUmlnaHQgZnJvbSAnLi9fYmFzZUZvck93blJpZ2h0LmpzJztcbmltcG9ydCBjYXN0RnVuY3Rpb24gZnJvbSAnLi9fY2FzdEZ1bmN0aW9uLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5mb3JPd25cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuXG4gKi9cbmZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9yT3duUmlnaHQ7XG4iLCJpbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9fYXJyYXlGaWx0ZXIuanMnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAqIGBvYmplY3RgIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZpbHRlcmVkIGZyb20gYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZ1bmN0aW9ucztcbiIsImltcG9ydCBiYXNlRnVuY3Rpb25zIGZyb20gJy4vX2Jhc2VGdW5jdGlvbnMuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICogb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICpcbiAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXVxuICovXG5mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9ucztcbiIsImltcG9ydCBiYXNlRnVuY3Rpb25zIGZyb20gJy4vX2Jhc2VGdW5jdGlvbnMuanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICogQHNlZSBfLmZ1bmN0aW9uc1xuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAqXG4gKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uc0luO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSGFzO1xuIiwiaW1wb3J0IGJhc2VIYXMgZnJvbSAnLi9fYmFzZUhhcy5qcyc7XG5pbXBvcnQgaGFzUGF0aCBmcm9tICcuL19oYXNQYXRoLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhcztcbiIsImltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gKiBgb2JqZWN0YCB3aXRoIHZhbHVlcyB0cmFuc2Zvcm1lZCBieSBgaXRlcmF0ZWVgIGFuZCBzZXQgYnkgYHNldHRlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGludmVydGVkIG9iamVjdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICovXG5mdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUludmVydGVyO1xuIiwiaW1wb3J0IGJhc2VJbnZlcnRlciBmcm9tICcuL19iYXNlSW52ZXJ0ZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdG9JdGVyYXRlZSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSBpdGVyYXRlZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW52ZXJ0ZXIoc2V0dGVyLCB0b0l0ZXJhdGVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlSW52ZXJ0ZXI7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSAnLi9jb25zdGFudC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52ZXJ0ZXIgZnJvbSAnLi9fY3JlYXRlSW52ZXJ0ZXIuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAqXG4gKiBfLmludmVydChvYmplY3QpO1xuICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICovXG52YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICByZXN1bHRbdmFsdWVdID0ga2V5O1xufSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuZXhwb3J0IGRlZmF1bHQgaW52ZXJ0O1xuIiwiaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGNyZWF0ZUludmVydGVyIGZyb20gJy4vX2NyZWF0ZUludmVydGVyLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gKiBjb3JyZXNwb25kaW5nIGludmVydGVkIHZhbHVlIG9mIGVhY2ggaW52ZXJ0ZWQga2V5IGlzIGFuIGFycmF5IG9mIGtleXNcbiAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gKlxuICogXy5pbnZlcnRCeShvYmplY3QpO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICpcbiAqIF8uaW52ZXJ0Qnkob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSkge1xuICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICogfSk7XG4gKiAvLyA9PiB7ICdncm91cDEnOiBbJ2EnLCAnYyddLCAnZ3JvdXAyJzogWydiJ10gfVxuICovXG52YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICB9XG59LCBiYXNlSXRlcmF0ZWUpO1xuXG5leHBvcnQgZGVmYXVsdCBpbnZlcnRCeTtcbiIsImltcG9ydCBiYXNlSW52b2tlIGZyb20gJy4vX2Jhc2VJbnZva2UuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcblxuLyoqXG4gKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAqXG4gKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICogLy8gPT4gWzIsIDNdXG4gKi9cbnZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuZXhwb3J0IGRlZmF1bHQgaW52b2tlO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGJhc2VGb3JPd24gZnJvbSAnLi9fYmFzZUZvck93bi5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5cbi8qKlxuICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICogQHNlZSBfLm1hcFZhbHVlc1xuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAqIH0pO1xuICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAqL1xuZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBLZXlzO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGJhc2VGb3JPd24gZnJvbSAnLi9fYmFzZUZvck93bi5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gKiBAc2VlIF8ubWFwS2V5c1xuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSB7XG4gKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICogfTtcbiAqXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBWYWx1ZXM7XG4iLCJpbXBvcnQgYmFzZU1lcmdlIGZyb20gJy4vX2Jhc2VNZXJnZS5qcyc7XG5pbXBvcnQgY3JlYXRlQXNzaWduZXIgZnJvbSAnLi9fY3JlYXRlQXNzaWduZXIuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAqIH07XG4gKlxuICogdmFyIG90aGVyID0ge1xuICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICogfTtcbiAqXG4gKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICovXG52YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2U7XG4iLCJpbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzUGxhaW5PYmplY3QuanMnO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAqL1xuZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21PbWl0Q2xvbmU7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VDbG9uZSBmcm9tICcuL19iYXNlQ2xvbmUuanMnO1xuaW1wb3J0IGJhc2VVbnNldCBmcm9tICcuL19iYXNlVW5zZXQuanMnO1xuaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCBjb3B5T2JqZWN0IGZyb20gJy4vX2NvcHlPYmplY3QuanMnO1xuaW1wb3J0IGN1c3RvbU9taXRDbG9uZSBmcm9tICcuL19jdXN0b21PbWl0Q2xvbmUuanMnO1xuaW1wb3J0IGZsYXRSZXN0IGZyb20gJy4vX2ZsYXRSZXN0LmpzJztcbmltcG9ydCBnZXRBbGxLZXlzSW4gZnJvbSAnLi9fZ2V0QWxsS2V5c0luLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdiJzogJzInIH1cbiAqL1xudmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0pO1xuICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBvbWl0O1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5pbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcbmltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUGlja0J5O1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUGlja0J5IGZyb20gJy4vX2Jhc2VQaWNrQnkuanMnO1xuaW1wb3J0IGdldEFsbEtleXNJbiBmcm9tICcuL19nZXRBbGxLZXlzSW4uanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbmZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gW3Byb3BdO1xuICB9KTtcbiAgcHJlZGljYXRlID0gYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgbmVnYXRlIGZyb20gJy4vbmVnYXRlLmpzJztcbmltcG9ydCBwaWNrQnkgZnJvbSAnLi9waWNrQnkuanMnO1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICogLy8gPT4geyAnYic6ICcyJyB9XG4gKi9cbmZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGJhc2VJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9taXRCeTtcbiIsImltcG9ydCBiYXNlUGlja0J5IGZyb20gJy4vX2Jhc2VQaWNrQnkuanMnO1xuaW1wb3J0IGhhc0luIGZyb20gJy4vaGFzSW4uanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VQaWNrO1xuIiwiaW1wb3J0IGJhc2VQaWNrIGZyb20gJy4vX2Jhc2VQaWNrLmpzJztcbmltcG9ydCBmbGF0UmVzdCBmcm9tICcuL19mbGF0UmVzdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAqL1xudmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcGljaztcbiIsImltcG9ydCBiYXNlR2V0IGZyb20gJy4vX2Jhc2VHZXQuanMnO1xuaW1wb3J0IGJhc2VTZXQgZnJvbSAnLi9fYmFzZVNldC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVVwZGF0ZTtcbiIsImltcG9ydCBiYXNlVmFsdWVzIGZyb20gJy4vX2Jhc2VWYWx1ZXMuanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWx1ZXNJbjtcbiIsImltcG9ydCBhc3NpZ24gZnJvbSAnLi9hc3NpZ24uanMnO1xuaW1wb3J0IGFzc2lnbkluIGZyb20gJy4vYXNzaWduSW4uanMnO1xuaW1wb3J0IGFzc2lnbkluV2l0aCBmcm9tICcuL2Fzc2lnbkluV2l0aC5qcyc7XG5pbXBvcnQgYXNzaWduV2l0aCBmcm9tICcuL2Fzc2lnbldpdGguanMnO1xuaW1wb3J0IGF0IGZyb20gJy4vYXQuanMnO1xuaW1wb3J0IGNyZWF0ZSBmcm9tICcuL2NyZWF0ZS5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy5qcyc7XG5pbXBvcnQgZGVmYXVsdHNEZWVwIGZyb20gJy4vZGVmYXVsdHNEZWVwLmpzJztcbmltcG9ydCBlbnRyaWVzIGZyb20gJy4vZW50cmllcy5qcyc7XG5pbXBvcnQgZW50cmllc0luIGZyb20gJy4vZW50cmllc0luLmpzJztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi9leHRlbmQuanMnO1xuaW1wb3J0IGV4dGVuZFdpdGggZnJvbSAnLi9leHRlbmRXaXRoLmpzJztcbmltcG9ydCBmaW5kS2V5IGZyb20gJy4vZmluZEtleS5qcyc7XG5pbXBvcnQgZmluZExhc3RLZXkgZnJvbSAnLi9maW5kTGFzdEtleS5qcyc7XG5pbXBvcnQgZm9ySW4gZnJvbSAnLi9mb3JJbi5qcyc7XG5pbXBvcnQgZm9ySW5SaWdodCBmcm9tICcuL2ZvckluUmlnaHQuanMnO1xuaW1wb3J0IGZvck93biBmcm9tICcuL2Zvck93bi5qcyc7XG5pbXBvcnQgZm9yT3duUmlnaHQgZnJvbSAnLi9mb3JPd25SaWdodC5qcyc7XG5pbXBvcnQgZnVuY3Rpb25zIGZyb20gJy4vZnVuY3Rpb25zLmpzJztcbmltcG9ydCBmdW5jdGlvbnNJbiBmcm9tICcuL2Z1bmN0aW9uc0luLmpzJztcbmltcG9ydCBnZXQgZnJvbSAnLi9nZXQuanMnO1xuaW1wb3J0IGhhcyBmcm9tICcuL2hhcy5qcyc7XG5pbXBvcnQgaGFzSW4gZnJvbSAnLi9oYXNJbi5qcyc7XG5pbXBvcnQgaW52ZXJ0IGZyb20gJy4vaW52ZXJ0LmpzJztcbmltcG9ydCBpbnZlcnRCeSBmcm9tICcuL2ludmVydEJ5LmpzJztcbmltcG9ydCBpbnZva2UgZnJvbSAnLi9pbnZva2UuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcbmltcG9ydCBrZXlzSW4gZnJvbSAnLi9rZXlzSW4uanMnO1xuaW1wb3J0IG1hcEtleXMgZnJvbSAnLi9tYXBLZXlzLmpzJztcbmltcG9ydCBtYXBWYWx1ZXMgZnJvbSAnLi9tYXBWYWx1ZXMuanMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJy4vbWVyZ2UuanMnO1xuaW1wb3J0IG1lcmdlV2l0aCBmcm9tICcuL21lcmdlV2l0aC5qcyc7XG5pbXBvcnQgb21pdCBmcm9tICcuL29taXQuanMnO1xuaW1wb3J0IG9taXRCeSBmcm9tICcuL29taXRCeS5qcyc7XG5pbXBvcnQgcGljayBmcm9tICcuL3BpY2suanMnO1xuaW1wb3J0IHBpY2tCeSBmcm9tICcuL3BpY2tCeS5qcyc7XG5pbXBvcnQgcmVzdWx0IGZyb20gJy4vcmVzdWx0LmpzJztcbmltcG9ydCBzZXQgZnJvbSAnLi9zZXQuanMnO1xuaW1wb3J0IHNldFdpdGggZnJvbSAnLi9zZXRXaXRoLmpzJztcbmltcG9ydCB0b1BhaXJzIGZyb20gJy4vdG9QYWlycy5qcyc7XG5pbXBvcnQgdG9QYWlyc0luIGZyb20gJy4vdG9QYWlyc0luLmpzJztcbmltcG9ydCB0cmFuc2Zvcm0gZnJvbSAnLi90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHVuc2V0IGZyb20gJy4vdW5zZXQuanMnO1xuaW1wb3J0IHVwZGF0ZSBmcm9tICcuL3VwZGF0ZS5qcyc7XG5pbXBvcnQgdXBkYXRlV2l0aCBmcm9tICcuL3VwZGF0ZVdpdGguanMnO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcy5qcyc7XG5pbXBvcnQgdmFsdWVzSW4gZnJvbSAnLi92YWx1ZXNJbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXNzaWduLCBhc3NpZ25JbiwgYXNzaWduSW5XaXRoLCBhc3NpZ25XaXRoLCBhdCxcbiAgY3JlYXRlLCBkZWZhdWx0cywgZGVmYXVsdHNEZWVwLCBlbnRyaWVzLCBlbnRyaWVzSW4sXG4gIGV4dGVuZCwgZXh0ZW5kV2l0aCwgZmluZEtleSwgZmluZExhc3RLZXksIGZvckluLFxuICBmb3JJblJpZ2h0LCBmb3JPd24sIGZvck93blJpZ2h0LCBmdW5jdGlvbnMsIGZ1bmN0aW9uc0luLFxuICBnZXQsIGhhcywgaGFzSW4sIGludmVydCwgaW52ZXJ0QnksXG4gIGludm9rZSwga2V5cywga2V5c0luLCBtYXBLZXlzLCBtYXBWYWx1ZXMsXG4gIG1lcmdlLCBtZXJnZVdpdGgsIG9taXQsIG9taXRCeSwgcGljayxcbiAgcGlja0J5LCByZXN1bHQsIHNldCwgc2V0V2l0aCwgdG9QYWlycyxcbiAgdG9QYWlyc0luLCB0cmFuc2Zvcm0sIHVuc2V0LCB1cGRhdGUsIHVwZGF0ZVdpdGgsXG4gIHZhbHVlcywgdmFsdWVzSW5cbn07XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gKlxuICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gKiAvLyA9PiA0XG4gKlxuICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICpcbiAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IDE7XG4gICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXN1bHQ7XG4iLCJpbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAqIGBwYXRoYCBjcmVhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gKiAvLyA9PiA0XG4gKlxuICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICogLy8gPT4gNVxuICovXG5mdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXQ7XG4iLCJpbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHt9O1xuICpcbiAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAqL1xuZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0V2l0aDtcbiIsImltcG9ydCBhcnJheUVhY2ggZnJvbSAnLi9fYXJyYXlFYWNoLmpzJztcbmltcG9ydCBiYXNlQ3JlYXRlIGZyb20gJy4vX2Jhc2VDcmVhdGUuanMnO1xuaW1wb3J0IGJhc2VGb3JPd24gZnJvbSAnLi9fYmFzZUZvck93bi5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgZ2V0UHJvdG90eXBlIGZyb20gJy4vX2dldFByb3RvdHlwZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBpc1R5cGVkQXJyYXkgZnJvbSAnLi9pc1R5cGVkQXJyYXkuanMnO1xuXG4vKipcbiAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICogfSwgW10pO1xuICogLy8gPT4gWzQsIDldXG4gKlxuICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgfVxuICB9XG4gIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zZm9ybTtcbiIsImltcG9ydCBiYXNlVW5zZXQgZnJvbSAnLi9fYmFzZVVuc2V0LmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICpcbiAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gKi9cbmZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuc2V0O1xuIiwiaW1wb3J0IGJhc2VVcGRhdGUgZnJvbSAnLi9fYmFzZVVwZGF0ZS5qcyc7XG5pbXBvcnQgY2FzdEZ1bmN0aW9uIGZyb20gJy4vX2Nhc3RGdW5jdGlvbi5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC42LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICogLy8gPT4gOVxuICpcbiAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICogLy8gPT4gMFxuICovXG5mdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1cGRhdGU7XG4iLCJpbXBvcnQgYmFzZVVwZGF0ZSBmcm9tICcuL19iYXNlVXBkYXRlLmpzJztcbmltcG9ydCBjYXN0RnVuY3Rpb24gZnJvbSAnLi9fY2FzdEZ1bmN0aW9uLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC42LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7fTtcbiAqXG4gKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVwZGF0ZVdpdGg7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAqIHJlc3VsdHMgaW4gYSBtZXRob2QgY2hhaW4gc2VxdWVuY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFNlcVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXygnICBhYmMgICcpXG4gKiAgLmNoYWluKClcbiAqICAudHJpbSgpXG4gKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgIHJldHVybiBbdmFsdWVdO1xuICogIH0pXG4gKiAgLnZhbHVlKCk7XG4gKiAvLyA9PiBbJ2FiYyddXG4gKi9cbmZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gIHJldHVybiBpbnRlcmNlcHRvcih2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRocnU7XG4iLCJpbXBvcnQgTGF6eVdyYXBwZXIgZnJvbSAnLi9fTGF6eVdyYXBwZXIuanMnO1xuaW1wb3J0IExvZGFzaFdyYXBwZXIgZnJvbSAnLi9fTG9kYXNoV3JhcHBlci5qcyc7XG5pbXBvcnQgYmFzZUF0IGZyb20gJy4vX2Jhc2VBdC5qcyc7XG5pbXBvcnQgZmxhdFJlc3QgZnJvbSAnLi9fZmxhdFJlc3QuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgdGhydSBmcm9tICcuL3RocnUuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICpcbiAqIEBuYW1lIGF0XG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgU2VxXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gKlxuICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICogLy8gPT4gWzMsIDRdXG4gKi9cbnZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKG9iamVjdCkgeyByZXR1cm4gYmFzZUF0KG9iamVjdCwgcGF0aHMpOyB9O1xuXG4gIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgIHJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICB9XG4gIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAnZnVuYyc6IHRocnUsXG4gICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICd0aGlzQXJnJzogdW5kZWZpbmVkXG4gIH0pO1xuICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgaWYgKGxlbmd0aCAmJiAhYXJyYXkubGVuZ3RoKSB7XG4gICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlckF0O1xuIiwiaW1wb3J0IGxvZGFzaCBmcm9tICcuL3dyYXBwZXJMb2Rhc2guanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICogY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuIFRoZSByZXN1bHQgb2Ygc3VjaCBzZXF1ZW5jZXMgbXVzdCBiZSB1bndyYXBwZWRcbiAqIHdpdGggYF8jdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBTZXFcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAqIF07XG4gKlxuICogdmFyIHlvdW5nZXN0ID0gX1xuICogICAuY2hhaW4odXNlcnMpXG4gKiAgIC5zb3J0QnkoJ2FnZScpXG4gKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICogICAgIHJldHVybiBvLnVzZXIgKyAnIGlzICcgKyBvLmFnZTtcbiAqICAgfSlcbiAqICAgLmhlYWQoKVxuICogICAudmFsdWUoKTtcbiAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gKi9cbmZ1bmN0aW9uIGNoYWluKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2hhaW47XG4iLCJpbXBvcnQgTGF6eVdyYXBwZXIgZnJvbSAnLi9fTGF6eVdyYXBwZXIuanMnO1xuaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGFycmF5UmVkdWNlIGZyb20gJy4vX2FycmF5UmVkdWNlLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAqIHBlcmZvcm1pbmcgYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIG9uIHRoZSB1bndyYXBwZWQgYHZhbHVlYCwgd2hlcmUgZWFjaFxuICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICB2YXIgcmVzdWx0ID0gdmFsdWU7XG4gIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICB9XG4gIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICB9LCByZXN1bHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlV3JhcHBlclZhbHVlO1xuIiwiaW1wb3J0IGJhc2VXcmFwcGVyVmFsdWUgZnJvbSAnLi9fYmFzZVdyYXBwZXJWYWx1ZS5qcyc7XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSB2YWx1ZVxuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICogQGNhdGVnb3J5IFNlcVxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXyhbMSwgMiwgM10pLnZhbHVlKCk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkge1xuICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlclZhbHVlO1xuIiwiaW1wb3J0IGNoYWluIGZyb20gJy4vY2hhaW4uanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICpcbiAqIEBuYW1lIGNoYWluXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgU2VxXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gKiBdO1xuICpcbiAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAqIF8odXNlcnMpLmhlYWQoKTtcbiAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAqXG4gKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gKiBfKHVzZXJzKVxuICogICAuY2hhaW4oKVxuICogICAuaGVhZCgpXG4gKiAgIC5waWNrKCd1c2VyJylcbiAqICAgLnZhbHVlKCk7XG4gKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICovXG5mdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gIHJldHVybiBjaGFpbih0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlckNoYWluO1xuIiwiaW1wb3J0IGF0IGZyb20gJy4vd3JhcHBlckF0LmpzJztcbmltcG9ydCBjaGFpbiBmcm9tICcuL2NoYWluLmpzJztcbmltcG9ydCBjb21taXQgZnJvbSAnLi9jb21taXQuanMnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICcuL3dyYXBwZXJMb2Rhc2guanMnO1xuaW1wb3J0IG5leHQgZnJvbSAnLi9uZXh0LmpzJztcbmltcG9ydCBwbGFudCBmcm9tICcuL3BsYW50LmpzJztcbmltcG9ydCByZXZlcnNlIGZyb20gJy4vd3JhcHBlclJldmVyc2UuanMnO1xuaW1wb3J0IHRhcCBmcm9tICcuL3RhcC5qcyc7XG5pbXBvcnQgdGhydSBmcm9tICcuL3RocnUuanMnO1xuaW1wb3J0IHRvSXRlcmF0b3IgZnJvbSAnLi90b0l0ZXJhdG9yLmpzJztcbmltcG9ydCB0b0pTT04gZnJvbSAnLi90b0pTT04uanMnO1xuaW1wb3J0IHZhbHVlIGZyb20gJy4vd3JhcHBlclZhbHVlLmpzJztcbmltcG9ydCB2YWx1ZU9mIGZyb20gJy4vdmFsdWVPZi5qcyc7XG5pbXBvcnQgd3JhcHBlckNoYWluIGZyb20gJy4vd3JhcHBlckNoYWluLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhdCwgY2hhaW4sIGNvbW1pdCwgbG9kYXNoLCBuZXh0LFxuICBwbGFudCwgcmV2ZXJzZSwgdGFwLCB0aHJ1LCB0b0l0ZXJhdG9yLFxuICB0b0pTT04sIHZhbHVlLCB2YWx1ZU9mLCB3cmFwcGVyQ2hhaW5cbn07XG4iLCJpbXBvcnQgTG9kYXNoV3JhcHBlciBmcm9tICcuL19Mb2Rhc2hXcmFwcGVyLmpzJztcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICpcbiAqIEBuYW1lIGNvbW1pdFxuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjIuMFxuICogQGNhdGVnb3J5IFNlcVxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkucHVzaCgzKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIHdyYXBwZWQubGFzdCgpO1xuICogLy8gPT4gM1xuICpcbiAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICovXG5mdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCkge1xuICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJDb21taXQ7XG4iLCJpbXBvcnQgdG9BcnJheSBmcm9tICcuL3RvQXJyYXkuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgdmFsdWUgb24gYSB3cmFwcGVkIG9iamVjdCBmb2xsb3dpbmcgdGhlXG4gKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICpcbiAqIEBuYW1lIG5leHRcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBTZXFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICpcbiAqIHdyYXBwZWQubmV4dCgpO1xuICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAqXG4gKiB3cmFwcGVkLm5leHQoKTtcbiAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gKlxuICogd3JhcHBlZC5uZXh0KCk7XG4gKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAqL1xuZnVuY3Rpb24gd3JhcHBlck5leHQoKSB7XG4gIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgfVxuICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgcmV0dXJuIHsgJ2RvbmUnOiBkb25lLCAndmFsdWUnOiB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyTmV4dDtcbiIsImltcG9ydCBiYXNlTG9kYXNoIGZyb20gJy4vX2Jhc2VMb2Rhc2guanMnO1xuaW1wb3J0IHdyYXBwZXJDbG9uZSBmcm9tICcuL193cmFwcGVyQ2xvbmUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAqXG4gKiBAbmFtZSBwbGFudFxuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjIuMFxuICogQGNhdGVnb3J5IFNlcVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICpcbiAqIG90aGVyLnZhbHVlKCk7XG4gKiAvLyA9PiBbOSwgMTZdXG4gKlxuICogd3JhcHBlZC52YWx1ZSgpO1xuICogLy8gPT4gWzEsIDRdXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICB2YXIgcmVzdWx0LFxuICAgICAgcGFyZW50ID0gdGhpcztcblxuICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgIGNsb25lLl9faW5kZXhfXyA9IDA7XG4gICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICB9XG4gICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICB9XG4gIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJQbGFudDtcbiIsImltcG9ydCBMYXp5V3JhcHBlciBmcm9tICcuL19MYXp5V3JhcHBlci5qcyc7XG5pbXBvcnQgTG9kYXNoV3JhcHBlciBmcm9tICcuL19Mb2Rhc2hXcmFwcGVyLmpzJztcbmltcG9ydCByZXZlcnNlIGZyb20gJy4vcmV2ZXJzZS5qcyc7XG5pbXBvcnQgdGhydSBmcm9tICcuL3RocnUuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gKlxuICogQG5hbWUgcmV2ZXJzZVxuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IFNlcVxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAqXG4gKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICogLy8gPT4gWzMsIDIsIDFdXG4gKlxuICogY29uc29sZS5sb2coYXJyYXkpO1xuICogLy8gPT4gWzMsIDIsIDFdXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSB7XG4gICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgIH1cbiAgICB3cmFwcGVkID0gd3JhcHBlZC5yZXZlcnNlKCk7XG4gICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICdhcmdzJzogW3JldmVyc2VdLFxuICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCwgdGhpcy5fX2NoYWluX18pO1xuICB9XG4gIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJSZXZlcnNlO1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCBpbnZva2VzIGBpbnRlcmNlcHRvcmAgYW5kIHJldHVybnMgYHZhbHVlYC4gVGhlIGludGVyY2VwdG9yXG4gKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgU2VxXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXyhbMSwgMiwgM10pXG4gKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICogICAgLy8gTXV0YXRlIGlucHV0IGFycmF5LlxuICogICAgYXJyYXkucG9wKCk7XG4gKiAgfSlcbiAqICAucmV2ZXJzZSgpXG4gKiAgLnZhbHVlKCk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqL1xuZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGFwO1xuIiwiLyoqXG4gKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICpcbiAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFNlcVxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICpcbiAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqL1xuZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyVG9JdGVyYXRvcjtcbiIsImltcG9ydCBjYXN0U2xpY2UgZnJvbSAnLi9fY2FzdFNsaWNlLmpzJztcbmltcG9ydCBoYXNVbmljb2RlIGZyb20gJy4vX2hhc1VuaWNvZGUuanMnO1xuaW1wb3J0IHN0cmluZ1RvQXJyYXkgZnJvbSAnLi9fc3RyaW5nVG9BcnJheS5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ2FzZUZpcnN0O1xuIiwiaW1wb3J0IGNyZWF0ZUNhc2VGaXJzdCBmcm9tICcuL19jcmVhdGVDYXNlRmlyc3QuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gKiAvLyA9PiAnRnJlZCdcbiAqXG4gKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGUkVEJ1xuICovXG52YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuZXhwb3J0IGRlZmF1bHQgdXBwZXJGaXJzdDtcbiIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcbmltcG9ydCB1cHBlckZpcnN0IGZyb20gJy4vdXBwZXJGaXJzdC5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gKiB0byBsb3dlciBjYXNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICogLy8gPT4gJ0ZyZWQnXG4gKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhcGl0YWxpemU7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VQcm9wZXJ0eU9mO1xuIiwiaW1wb3J0IGJhc2VQcm9wZXJ0eU9mIGZyb20gJy4vX2Jhc2VQcm9wZXJ0eU9mLmpzJztcblxuLyoqIFVzZWQgdG8gbWFwIExhdGluIFVuaWNvZGUgbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLiAqL1xudmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAnXFx4YzAnOiAnQScsICAnXFx4YzEnOiAnQScsICdcXHhjMic6ICdBJywgJ1xceGMzJzogJ0EnLCAnXFx4YzQnOiAnQScsICdcXHhjNSc6ICdBJyxcbiAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgJ1xceGQwJzogJ0QnLCAgJ1xceGYwJzogJ2QnLFxuICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAnXFx4Y2MnOiAnSScsICAnXFx4Y2QnOiAnSScsICdcXHhjZSc6ICdJJywgJ1xceGNmJzogJ0knLFxuICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICdcXHhkMic6ICdPJywgICdcXHhkMyc6ICdPJywgJ1xceGQ0JzogJ08nLCAnXFx4ZDUnOiAnTycsICdcXHhkNic6ICdPJywgJ1xceGQ4JzogJ08nLFxuICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgJ1xceGY5JzogJ3UnLCAgJ1xceGZhJzogJ3UnLCAnXFx4ZmInOiAndScsICdcXHhmYyc6ICd1JyxcbiAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICdcXHhkZSc6ICdUaCcsICdcXHhmZSc6ICd0aCcsXG4gICdcXHhkZic6ICdzcycsXG4gIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICdcXHUwMTAwJzogJ0EnLCAgJ1xcdTAxMDInOiAnQScsICdcXHUwMTA0JzogJ0EnLFxuICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAnXFx1MDEwNyc6ICdjJywgICdcXHUwMTA5JzogJ2MnLCAnXFx1MDEwYic6ICdjJywgJ1xcdTAxMGQnOiAnYycsXG4gICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgJ1xcdTAxMTMnOiAnZScsICAnXFx1MDExNSc6ICdlJywgJ1xcdTAxMTcnOiAnZScsICdcXHUwMTE5JzogJ2UnLCAnXFx1MDExYic6ICdlJyxcbiAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICdcXHUwMTI0JzogJ0gnLCAgJ1xcdTAxMjYnOiAnSCcsICdcXHUwMTI1JzogJ2gnLCAnXFx1MDEyNyc6ICdoJyxcbiAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgJ1xcdTAxMzQnOiAnSicsICAnXFx1MDEzNSc6ICdqJyxcbiAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICdcXHUwMTNhJzogJ2wnLCAgJ1xcdTAxM2MnOiAnbCcsICdcXHUwMTNlJzogJ2wnLCAnXFx1MDE0MCc6ICdsJywgJ1xcdTAxNDInOiAnbCcsXG4gICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAnXFx1MDE0Yyc6ICdPJywgICdcXHUwMTRlJzogJ08nLCAnXFx1MDE1MCc6ICdPJyxcbiAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAnXFx1MDE1NSc6ICdyJywgICdcXHUwMTU3JzogJ3InLCAnXFx1MDE1OSc6ICdyJyxcbiAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICdcXHUwMTYyJzogJ1QnLCAgJ1xcdTAxNjQnOiAnVCcsICdcXHUwMTY2JzogJ1QnLFxuICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICdcXHUwMTY5JzogJ3UnLCAgJ1xcdTAxNmInOiAndScsICdcXHUwMTZkJzogJ3UnLCAnXFx1MDE2Zic6ICd1JywgJ1xcdTAxNzEnOiAndScsICdcXHUwMTczJzogJ3UnLFxuICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgJ1xcdTAxNzknOiAnWicsICAnXFx1MDE3Yic6ICdaJywgJ1xcdTAxN2QnOiAnWicsXG4gICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgJ1xcdTAxNTInOiAnT2UnLCAnXFx1MDE1Myc6ICdvZScsXG4gICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xufTtcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLmRlYnVycmAgdG8gY29udmVydCBMYXRpbi0xIFN1cHBsZW1lbnQgYW5kIExhdGluIEV4dGVuZGVkLUFcbiAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICovXG52YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgZGVidXJyTGV0dGVyO1xuIiwiaW1wb3J0IGRlYnVyckxldHRlciBmcm9tICcuL19kZWJ1cnJMZXR0ZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBMYXRpbiBVbmljb2RlIGxldHRlcnMgKGV4Y2x1ZGluZyBtYXRoZW1hdGljYWwgb3BlcmF0b3JzKS4gKi9cbnZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKSBhbmRcbiAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gKi9cbnZhciByZUNvbWJvTWFyayA9IFJlZ0V4cChyc0NvbWJvLCAnZycpO1xuXG4vKipcbiAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICogLy8gPT4gJ2RlamEgdnUnXG4gKi9cbmZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluLCBkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssICcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVidXJyO1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovXG52YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbi8qKlxuICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqL1xuZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzY2lpV29yZHM7XG4iLCIvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG52YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzVW5pY29kZVdvcmQ7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxO1xuXG4vKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xudmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgcnNPcmRVcHBlcixcbiAgcnNPcmRMb3dlcixcbiAgcnNEaWdpdHMsXG4gIHJzRW1vamlcbl0uam9pbignfCcpLCAnZycpO1xuXG4vKipcbiAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICovXG5mdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuaWNvZGVXb3JkcztcbiIsImltcG9ydCBhc2NpaVdvcmRzIGZyb20gJy4vX2FzY2lpV29yZHMuanMnO1xuaW1wb3J0IGhhc1VuaWNvZGVXb3JkIGZyb20gJy4vX2hhc1VuaWNvZGVXb3JkLmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcbmltcG9ydCB1bmljb2RlV29yZHMgZnJvbSAnLi9fdW5pY29kZVdvcmRzLmpzJztcblxuLyoqXG4gKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICpcbiAqIF8ud29yZHMoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJywgL1teLCBdKy9nKTtcbiAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAqL1xuZnVuY3Rpb24gd29yZHMoc3RyaW5nLCBwYXR0ZXJuLCBndWFyZCkge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICB9XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybikgfHwgW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdvcmRzO1xuIiwiaW1wb3J0IGFycmF5UmVkdWNlIGZyb20gJy4vX2FycmF5UmVkdWNlLmpzJztcbmltcG9ydCBkZWJ1cnIgZnJvbSAnLi9kZWJ1cnIuanMnO1xuaW1wb3J0IHdvcmRzIGZyb20gJy4vd29yZHMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCI7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xudmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb3VuZGVyO1xuIiwiaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi9jYXBpdGFsaXplLmpzJztcbmltcG9ydCBjcmVhdGVDb21wb3VuZGVyIGZyb20gJy4vX2NyZWF0ZUNvbXBvdW5kZXIuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gKiAvLyA9PiAnZm9vQmFyJ1xuICpcbiAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICogLy8gPT4gJ2Zvb0JhcidcbiAqXG4gKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdmb29CYXInXG4gKi9cbnZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBjYW1lbENhc2U7XG4iLCJpbXBvcnQgYmFzZUNsYW1wIGZyb20gJy4vX2Jhc2VDbGFtcC5qcyc7XG5pbXBvcnQgYmFzZVRvU3RyaW5nIGZyb20gJy4vX2Jhc2VUb1N0cmluZy5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuXG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICA/IGxlbmd0aFxuICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoO1xuICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBlbmRzV2l0aDtcbiIsImltcG9ydCBiYXNlUHJvcGVydHlPZiBmcm9tICcuL19iYXNlUHJvcGVydHlPZi5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG52YXIgaHRtbEVzY2FwZXMgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5Oydcbn07XG5cbi8qKlxuICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAqL1xudmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG5leHBvcnQgZGVmYXVsdCBlc2NhcGVIdG1sQ2hhcjtcbiIsImltcG9ydCBlc2NhcGVIdG1sQ2hhciBmcm9tICcuL19lc2NhcGVIdG1sQ2hhci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbnZhciByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gKiBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMuXG4gKlxuICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gKiBjaGFyYWN0ZXJzIHVzZSBhIHRoaXJkLXBhcnR5IGxpYnJhcnkgbGlrZSBbX2hlX10oaHR0cHM6Ly9tdGhzLmJlL2hlKS5cbiAqXG4gKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gKiBcIj5cIiBhbmQgXCIvXCIgZG9uJ3QgbmVlZCBlc2NhcGluZyBpbiBIVE1MIGFuZCBoYXZlIG5vIHNwZWNpYWwgbWVhbmluZ1xuICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICogKHVuZGVyIFwic2VtaS1yZWxhdGVkIGZ1biBmYWN0XCIpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2VcbiAqIFhTUyB2ZWN0b3JzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVzY2FwZTtcbiIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgIDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlc2NhcGVSZWdFeHA7XG4iLCJpbXBvcnQgY3JlYXRlQ29tcG91bmRlciBmcm9tICcuL19jcmVhdGVDb21wb3VuZGVyLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICogW2tlYmFiIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1NwZWNpYWxfY2FzZV9zdHlsZXMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gKiAvLyA9PiAnZm9vLWJhcidcbiAqXG4gKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnZm9vLWJhcidcbiAqXG4gKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdmb28tYmFyJ1xuICovXG52YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQga2ViYWJDYXNlO1xuIiwiaW1wb3J0IGNyZWF0ZUNvbXBvdW5kZXIgZnJvbSAnLi9fY3JlYXRlQ29tcG91bmRlci5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAqIC8vID0+ICdmb28gYmFyJ1xuICpcbiAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAqIC8vID0+ICdmb28gYmFyJ1xuICpcbiAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICogLy8gPT4gJ2ZvbyBiYXInXG4gKi9cbnZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBsb3dlckNhc2U7XG4iLCJpbXBvcnQgY3JlYXRlQ2FzZUZpcnN0IGZyb20gJy4vX2NyZWF0ZUNhc2VGaXJzdC5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAqIC8vID0+ICdmcmVkJ1xuICpcbiAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICogLy8gPT4gJ2ZSRUQnXG4gKi9cbnZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG5leHBvcnQgZGVmYXVsdCBsb3dlckZpcnN0O1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3I7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICBkbyB7XG4gICAgaWYgKG4gJSAyKSB7XG4gICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgIH1cbiAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgIGlmIChuKSB7XG4gICAgICBzdHJpbmcgKz0gc3RyaW5nO1xuICAgIH1cbiAgfSB3aGlsZSAobik7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVJlcGVhdDtcbiIsImltcG9ydCBiYXNlUmVwZWF0IGZyb20gJy4vX2Jhc2VSZXBlYXQuanMnO1xuaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuaW1wb3J0IGNhc3RTbGljZSBmcm9tICcuL19jYXN0U2xpY2UuanMnO1xuaW1wb3J0IGhhc1VuaWNvZGUgZnJvbSAnLi9faGFzVW5pY29kZS5qcyc7XG5pbXBvcnQgc3RyaW5nU2l6ZSBmcm9tICcuL19zdHJpbmdTaXplLmpzJztcbmltcG9ydCBzdHJpbmdUb0FycmF5IGZyb20gJy4vX3N0cmluZ1RvQXJyYXkuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbDtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLCBjaGFycykge1xuICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgaWYgKGNoYXJzTGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgfVxuICB2YXIgcmVzdWx0ID0gYmFzZVJlcGVhdChjaGFycywgbmF0aXZlQ2VpbChsZW5ndGggLyBzdHJpbmdTaXplKGNoYXJzKSkpO1xuICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICA6IHJlc3VsdC5zbGljZSgwLCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQYWRkaW5nO1xuIiwiaW1wb3J0IGNyZWF0ZVBhZGRpbmcgZnJvbSAnLi9fY3JlYXRlUGFkZGluZy5qcyc7XG5pbXBvcnQgc3RyaW5nU2l6ZSBmcm9tICcuL19zdHJpbmdTaXplLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCxcbiAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3I7XG5cbi8qKlxuICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gKiBQYWRkaW5nIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGNhbid0IGJlIGV2ZW5seSBkaXZpZGVkIGJ5IGBsZW5ndGhgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucGFkKCdhYmMnLCA4KTtcbiAqIC8vID0+ICcgIGFiYyAgICdcbiAqXG4gKiBfLnBhZCgnYWJjJywgOCwgJ18tJyk7XG4gKiAvLyA9PiAnXy1hYmNfLV8nXG4gKlxuICogXy5wYWQoJ2FiYycsIDMpO1xuICogLy8gPT4gJ2FiYydcbiAqL1xuZnVuY3Rpb24gcGFkKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgcmV0dXJuIChcbiAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksIGNoYXJzKSArXG4gICAgc3RyaW5nICtcbiAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhZDtcbiIsImltcG9ydCBjcmVhdGVQYWRkaW5nIGZyb20gJy4vX2NyZWF0ZVBhZGRpbmcuanMnO1xuaW1wb3J0IHN0cmluZ1NpemUgZnJvbSAnLi9fc3RyaW5nU2l6ZS5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICogLy8gPT4gJ2FiYyAgICdcbiAqXG4gKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gKiAvLyA9PiAnYWJjXy1fJ1xuICpcbiAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAqIC8vID0+ICdhYmMnXG4gKi9cbmZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgIDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYWRFbmQ7XG4iLCJpbXBvcnQgY3JlYXRlUGFkZGluZyBmcm9tICcuL19jcmVhdGVQYWRkaW5nLmpzJztcbmltcG9ydCBzdHJpbmdTaXplIGZyb20gJy4vX3N0cmluZ1NpemUuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gKiAvLyA9PiAnICAgYWJjJ1xuICpcbiAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICogLy8gPT4gJ18tX2FiYydcbiAqXG4gKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAqIC8vID0+ICdhYmMnXG4gKi9cbmZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgID8gKGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykgKyBzdHJpbmcpXG4gICAgOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhZFN0YXJ0O1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlUGFyc2VJbnQgPSByb290LnBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gSWYgYHJhZGl4YCBpc1xuICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3JhZGl4PTEwXSBUaGUgcmFkaXggdG8gaW50ZXJwcmV0IGB2YWx1ZWAgYnkuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gKiAvLyA9PiA4XG4gKlxuICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICogLy8gPT4gWzYsIDgsIDEwXVxuICovXG5mdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICBpZiAoZ3VhcmQgfHwgcmFkaXggPT0gbnVsbCkge1xuICAgIHJhZGl4ID0gMDtcbiAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgIHJhZGl4ID0gK3JhZGl4O1xuICB9XG4gIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlSW50O1xuIiwiaW1wb3J0IGJhc2VSZXBlYXQgZnJvbSAnLi9fYmFzZVJlcGVhdC5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVwZWF0KCcqJywgMyk7XG4gKiAvLyA9PiAnKioqJ1xuICpcbiAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAqIC8vID0+ICdhYmNhYmMnXG4gKlxuICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICogLy8gPT4gJydcbiAqL1xuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgIG4gPSAxO1xuICB9IGVsc2Uge1xuICAgIG4gPSB0b0ludGVnZXIobik7XG4gIH1cbiAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlcGVhdDtcbiIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBSZXBsYWNlcyBtYXRjaGVzIGZvciBgcGF0dGVybmAgaW4gYHN0cmluZ2Agd2l0aCBgcmVwbGFjZW1lbnRgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BTdHJpbmcjcmVwbGFjZWBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9yZXBsYWNlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVwbGFjZSgnSGkgRnJlZCcsICdGcmVkJywgJ0Jhcm5leScpO1xuICogLy8gPT4gJ0hpIEJhcm5leSdcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZSgpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICByZXR1cm4gYXJncy5sZW5ndGggPCAzID8gc3RyaW5nIDogc3RyaW5nLnJlcGxhY2UoYXJnc1sxXSwgYXJnc1syXSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlcGxhY2U7XG4iLCJpbXBvcnQgY3JlYXRlQ29tcG91bmRlciBmcm9tICcuL19jcmVhdGVDb21wb3VuZGVyLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzbmFrZSBjYXNlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc25ha2VDYXNlKCdGb28gQmFyJyk7XG4gKiAvLyA9PiAnZm9vX2JhcidcbiAqXG4gKiBfLnNuYWtlQ2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnZm9vX2JhcidcbiAqXG4gKiBfLnNuYWtlQ2FzZSgnLS1GT08tQkFSLS0nKTtcbiAqIC8vID0+ICdmb29fYmFyJ1xuICovXG52YXIgc25ha2VDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc25ha2VDYXNlO1xuIiwiaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuaW1wb3J0IGNhc3RTbGljZSBmcm9tICcuL19jYXN0U2xpY2UuanMnO1xuaW1wb3J0IGhhc1VuaWNvZGUgZnJvbSAnLi9faGFzVW5pY29kZS5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuaW1wb3J0IGlzUmVnRXhwIGZyb20gJy4vaXNSZWdFeHAuanMnO1xuaW1wb3J0IHN0cmluZ1RvQXJyYXkgZnJvbSAnLi9fc3RyaW5nVG9BcnJheS5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG52YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTU7XG5cbi8qKlxuICogU3BsaXRzIGBzdHJpbmdgIGJ5IGBzZXBhcmF0b3JgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICogW2BTdHJpbmcjc3BsaXRgXShodHRwczovL21kbi5pby9TdHJpbmcvc3BsaXQpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHNwbGl0LlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzdHJpbmcgc2VnbWVudHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc3BsaXQoJ2EtYi1jJywgJy0nLCAyKTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqL1xuZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSB7XG4gIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICB9XG4gIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBpZiAoc3RyaW5nICYmIChcbiAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICApKSB7XG4gICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwgMCwgbGltaXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzcGxpdDtcbiIsImltcG9ydCBjcmVhdGVDb21wb3VuZGVyIGZyb20gJy4vX2NyZWF0ZUNvbXBvdW5kZXIuanMnO1xuaW1wb3J0IHVwcGVyRmlyc3QgZnJvbSAnLi91cHBlckZpcnN0LmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICogW3N0YXJ0IGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1N0eWxpc3RpY19vcl9zcGVjaWFsaXNlZF91c2FnZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnRm9vIEJhcidcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdGT08gQkFSJ1xuICovXG52YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXJ0Q2FzZTtcbiIsImltcG9ydCBiYXNlQ2xhbXAgZnJvbSAnLi9fYmFzZUNsYW1wLmpzJztcbmltcG9ydCBiYXNlVG9TdHJpbmcgZnJvbSAnLi9fYmFzZVRvU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICA/IDBcbiAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBzdHJpbmcubGVuZ3RoKTtcblxuICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBpc0Vycm9yIGZyb20gJy4vaXNFcnJvci5qcyc7XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy5cbiAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gKiB9LCAnPl8+Jyk7XG4gKlxuICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAqICAgZWxlbWVudHMgPSBbXTtcbiAqIH1cbiAqL1xudmFyIGF0dGVtcHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBhdHRlbXB0O1xuIiwiaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAqIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCkge1xuICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgcmV0dXJuIHNyY1ZhbHVlO1xuICB9XG4gIHJldHVybiBvYmpWYWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbjtcbiIsIi8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xudmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICdcXFxcJzogJ1xcXFwnLFxuICBcIidcIjogXCInXCIsXG4gICdcXG4nOiAnbicsXG4gICdcXHInOiAncicsXG4gICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgJ1xcdTIwMjknOiAndTIwMjknXG59O1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udGVtcGxhdGVgIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihjaHIpIHtcbiAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXNjYXBlU3RyaW5nQ2hhcjtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG52YXIgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG5leHBvcnQgZGVmYXVsdCByZUludGVycG9sYXRlO1xuIiwiaW1wb3J0IGVzY2FwZSBmcm9tICcuL2VzY2FwZS5qcyc7XG5pbXBvcnQgcmVFc2NhcGUgZnJvbSAnLi9fcmVFc2NhcGUuanMnO1xuaW1wb3J0IHJlRXZhbHVhdGUgZnJvbSAnLi9fcmVFdmFsdWF0ZS5qcyc7XG5pbXBvcnQgcmVJbnRlcnBvbGF0ZSBmcm9tICcuL19yZUludGVycG9sYXRlLmpzJztcblxuLyoqXG4gKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gKiBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciB0ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICpcbiAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgKi9cbiAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC5cbiAgICpcbiAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgKi9cbiAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAvKipcbiAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICogQHR5cGUge1JlZ0V4cH1cbiAgICovXG4gICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICpcbiAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gaW1wb3J0IHZhcmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgJ2ltcG9ydHMnOiB7XG5cbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICovXG4gICAgJ18nOiB7ICdlc2NhcGUnOiBlc2NhcGUgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB0ZW1wbGF0ZVNldHRpbmdzO1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbnZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nO1xuXG5leHBvcnQgZGVmYXVsdCByZUVzY2FwZTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG52YXIgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2c7XG5cbmV4cG9ydCBkZWZhdWx0IHJlRXZhbHVhdGU7XG4iLCJpbXBvcnQgYXNzaWduSW5XaXRoIGZyb20gJy4vYXNzaWduSW5XaXRoLmpzJztcbmltcG9ydCBhdHRlbXB0IGZyb20gJy4vYXR0ZW1wdC5qcyc7XG5pbXBvcnQgYmFzZVZhbHVlcyBmcm9tICcuL19iYXNlVmFsdWVzLmpzJztcbmltcG9ydCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluIGZyb20gJy4vX2N1c3RvbURlZmF1bHRzQXNzaWduSW4uanMnO1xuaW1wb3J0IGVzY2FwZVN0cmluZ0NoYXIgZnJvbSAnLi9fZXNjYXBlU3RyaW5nQ2hhci5qcyc7XG5pbXBvcnQgaXNFcnJvciBmcm9tICcuL2lzRXJyb3IuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5pbXBvcnQgcmVJbnRlcnBvbGF0ZSBmcm9tICcuL19yZUludGVycG9sYXRlLmpzJztcbmltcG9ydCB0ZW1wbGF0ZVNldHRpbmdzIGZyb20gJy4vdGVtcGxhdGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG52YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaFxuICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAqL1xudmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xudmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xudmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gKiBcImVzY2FwZVwiIGRlbGltaXRlcnMsIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuIERhdGFcbiAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gKlxuICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICogZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAqIFtsb2Rhc2gncyBjdXN0b20gYnVpbGRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbG9kYXNoLmNvbS9jdXN0b20tYnVpbGRzKS5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAqIFtDaHJvbWUncyBleHRlbnNpb25zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbCkuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAqICBUaGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlci5cbiAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0cz1fLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c11cbiAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAqICBUaGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J3RlbXBsYXRlU291cmNlc1tuXSddXG4gKiAgVGhlIHNvdXJjZVVSTCBvZiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gKiBjb21waWxlZCh7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICpcbiAqIC8vIFVzZSB0aGUgSFRNTCBcImVzY2FwZVwiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICpcbiAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBfLmZvckVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPicpO1xuICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAqXG4gKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pO1xuICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gKlxuICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAqIGNvbXBpbGVkKHsgJ3VzZXInOiAncGViYmxlcycgfSk7XG4gKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gKlxuICogLy8gVXNlIGJhY2tzbGFzaGVzIHRvIHRyZWF0IGRlbGltaXRlcnMgYXMgcGxhaW4gdGV4dC5cbiAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICogLy8gPT4gJzwlLSB2YWx1ZSAlPidcbiAqXG4gKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gKiB2YXIgdGV4dCA9ICc8JSBqcS5lYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nO1xuICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gKlxuICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAqIGNvbXBpbGVkKGRhdGEpO1xuICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAqXG4gKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAqIGNvbXBpbGVkLnNvdXJjZTtcbiAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAqIC8vICAgcmV0dXJuIF9fcDtcbiAqIC8vIH1cbiAqXG4gKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAqXG4gKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICogZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2pzdC5qcycpLCAnXFxcbiAqICAgdmFyIEpTVCA9IHtcXFxuICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gKiAgIH07XFxcbiAqICcpO1xuICovXG5mdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSB7XG4gIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAvLyBhbmQgTGF1cmEgRG9rdG9yb3ZhJ3MgZG9ULmpzIChodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UKS5cbiAgdmFyIHNldHRpbmdzID0gdGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzLl8udGVtcGxhdGVTZXR0aW5ncyB8fCB0ZW1wbGF0ZVNldHRpbmdzO1xuXG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gIHZhciBpbXBvcnRzID0gYXNzaWduSW5XaXRoKHt9LCBvcHRpb25zLmltcG9ydHMsIHNldHRpbmdzLmltcG9ydHMsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLFxuICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gIHZhciBpc0VzY2FwaW5nLFxuICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoXG4gICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgLCAnZycpO1xuXG4gIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAvLyB3aXRoIGxvb2t1cCAoaW4gY2FzZSBvZiBlLmcuIHByb3RvdHlwZSBwb2xsdXRpb24pLCBhbmQgc3RyaXAgbmV3bGluZXMgaWYgYW55LlxuICAvLyBBIG5ld2xpbmUgd291bGRuJ3QgYmUgYSB2YWxpZCBzb3VyY2VVUkwgYW55d2F5LCBhbmQgaXQnZCBlbmFibGUgY29kZSBpbmplY3Rpb24uXG4gIHZhciBzb3VyY2VVUkwgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdzb3VyY2VVUkwnKVxuICAgID8gKCcvLyMgc291cmNlVVJMPScgK1xuICAgICAgIChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnICcpICtcbiAgICAgICAnXFxuJylcbiAgICA6ICcnO1xuXG4gIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgIH1cbiAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICB9XG4gICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgIH1cbiAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9KTtcblxuICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAvLyBMaWtlIHdpdGggc291cmNlVVJMLCB3ZSB0YWtlIGNhcmUgdG8gbm90IGNoZWNrIHRoZSBvcHRpb24ncyBwcm90b3R5cGUsXG4gIC8vIGFzIHRoaXMgY29uZmlndXJhdGlvbiBpcyBhIGNvZGUgaW5qZWN0aW9uIHZlY3Rvci5cbiAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gIH1cbiAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAodmFyaWFibGVcbiAgICAgID8gJydcbiAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICApICtcbiAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgIChpc0VzY2FwaW5nXG4gICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICA6ICcnXG4gICAgKSArXG4gICAgKGlzRXZhbHVhdGluZ1xuICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgOiAnO1xcbidcbiAgICApICtcbiAgICBzb3VyY2UgK1xuICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgfSk7XG5cbiAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICB0aHJvdyByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGVtcGxhdGU7XG4iLCJpbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICpcbiAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gKiAvLyA9PiAnZm9vYmFyJ1xuICpcbiAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAqL1xuZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvTG93ZXI7XG4iLCJpbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICpcbiAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gKiAvLyA9PiAnRk9PQkFSJ1xuICpcbiAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAqL1xuZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvVXBwZXI7XG4iLCJpbXBvcnQgYmFzZUluZGV4T2YgZnJvbSAnLi9fYmFzZUluZGV4T2YuanMnO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RyaW5nIHN5bWJvbFxuICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICovXG5mdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgdmFyIGluZGV4ID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2hhcnNFbmRJbmRleDtcbiIsImltcG9ydCBiYXNlSW5kZXhPZiBmcm9tICcuL19iYXNlSW5kZXhPZi5qcyc7XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICovXG5mdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNoYXJzU3RhcnRJbmRleDtcbiIsImltcG9ydCBiYXNlVG9TdHJpbmcgZnJvbSAnLi9fYmFzZVRvU3RyaW5nLmpzJztcbmltcG9ydCBjYXN0U2xpY2UgZnJvbSAnLi9fY2FzdFNsaWNlLmpzJztcbmltcG9ydCBjaGFyc0VuZEluZGV4IGZyb20gJy4vX2NoYXJzRW5kSW5kZXguanMnO1xuaW1wb3J0IGNoYXJzU3RhcnRJbmRleCBmcm9tICcuL19jaGFyc1N0YXJ0SW5kZXguanMnO1xuaW1wb3J0IHN0cmluZ1RvQXJyYXkgZnJvbSAnLi9fc3RyaW5nVG9BcnJheS5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmltKCcgIGFiYyAgJyk7XG4gKiAvLyA9PiAnYWJjJ1xuICpcbiAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gKiAvLyA9PiAnYWJjJ1xuICpcbiAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICovXG5mdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB9XG4gIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSxcbiAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW07XG4iLCJpbXBvcnQgYmFzZVRvU3RyaW5nIGZyb20gJy4vX2Jhc2VUb1N0cmluZy5qcyc7XG5pbXBvcnQgY2FzdFNsaWNlIGZyb20gJy4vX2Nhc3RTbGljZS5qcyc7XG5pbXBvcnQgY2hhcnNFbmRJbmRleCBmcm9tICcuL19jaGFyc0VuZEluZGV4LmpzJztcbmltcG9ydCBzdHJpbmdUb0FycmF5IGZyb20gJy4vX3N0cmluZ1RvQXJyYXkuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbUVuZCA9IC9cXHMrJC87XG5cbi8qKlxuICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gKiAvLyA9PiAnICBhYmMnXG4gKlxuICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAqIC8vID0+ICctXy1hYmMnXG4gKi9cbmZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCAnJyk7XG4gIH1cbiAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxuICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1FbmQ7XG4iLCJpbXBvcnQgYmFzZVRvU3RyaW5nIGZyb20gJy4vX2Jhc2VUb1N0cmluZy5qcyc7XG5pbXBvcnQgY2FzdFNsaWNlIGZyb20gJy4vX2Nhc3RTbGljZS5qcyc7XG5pbXBvcnQgY2hhcnNTdGFydEluZGV4IGZyb20gJy4vX2NoYXJzU3RhcnRJbmRleC5qcyc7XG5pbXBvcnQgc3RyaW5nVG9BcnJheSBmcm9tICcuL19zdHJpbmdUb0FycmF5LmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyaW1TdGFydCgnICBhYmMgICcpO1xuICogLy8gPT4gJ2FiYyAgJ1xuICpcbiAqIF8udHJpbVN0YXJ0KCctXy1hYmMtXy0nLCAnXy0nKTtcbiAqIC8vID0+ICdhYmMtXy0nXG4gKi9cbmZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwgJycpO1xuICB9XG4gIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICBzdGFydCA9IGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBzdHJpbmdUb0FycmF5KGNoYXJzKSk7XG5cbiAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1TdGFydDtcbiIsImltcG9ydCBiYXNlVG9TdHJpbmcgZnJvbSAnLi9fYmFzZVRvU3RyaW5nLmpzJztcbmltcG9ydCBjYXN0U2xpY2UgZnJvbSAnLi9fY2FzdFNsaWNlLmpzJztcbmltcG9ydCBoYXNVbmljb2RlIGZyb20gJy4vX2hhc1VuaWNvZGUuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGlzUmVnRXhwIGZyb20gJy4vaXNSZWdFeHAuanMnO1xuaW1wb3J0IHN0cmluZ1NpemUgZnJvbSAnLi9fc3RyaW5nU2l6ZS5qcyc7XG5pbXBvcnQgc3RyaW5nVG9BcnJheSBmcm9tICcuL19zdHJpbmdUb0FycmF5LmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbnZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gKiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gXCIuLi5cIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vbWlzc2lvbj0nLi4uJ10gVGhlIHN0cmluZyB0byBpbmRpY2F0ZSB0ZXh0IGlzIG9taXR0ZWQuXG4gKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hiby4uLidcbiAqXG4gKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICogICAnbGVuZ3RoJzogMjQsXG4gKiAgICdzZXBhcmF0b3InOiAnICdcbiAqIH0pO1xuICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwuLi4nXG4gKlxuICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAqICAgJ2xlbmd0aCc6IDI0LFxuICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gKiB9KTtcbiAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUuLi4nXG4gKlxuICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAqICAgJ29taXNzaW9uJzogJyBbLi4uXSdcbiAqIH0pO1xuICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgIG9taXNzaW9uID0gREVGQVVMVF9UUlVOQ19PTUlTU0lPTjtcblxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgIGxlbmd0aCA9ICdsZW5ndGgnIGluIG9wdGlvbnMgPyB0b0ludGVnZXIob3B0aW9ucy5sZW5ndGgpIDogbGVuZ3RoO1xuICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gIH1cbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpO1xuICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICB9XG4gIGlmIChsZW5ndGggPj0gc3RyTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxuICB2YXIgZW5kID0gbGVuZ3RoIC0gc3RyaW5nU2l6ZShvbWlzc2lvbik7XG4gIGlmIChlbmQgPCAxKSB7XG4gICAgcmV0dXJuIG9taXNzaW9uO1xuICB9XG4gIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgIDogc3RyaW5nLnNsaWNlKDAsIGVuZCk7XG5cbiAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICB9XG4gIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgfVxuICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgdmFyIG1hdGNoLFxuICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCB0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkgKyAnZycpO1xuICAgICAgfVxuICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICB3aGlsZSAoKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSkpIHtcbiAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG5ld0VuZCA9PT0gdW5kZWZpbmVkID8gZW5kIDogbmV3RW5kKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgdmFyIGluZGV4ID0gcmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJ1bmNhdGU7XG4iLCJpbXBvcnQgYmFzZVByb3BlcnR5T2YgZnJvbSAnLi9fYmFzZVByb3BlcnR5T2YuanMnO1xuXG4vKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xudmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICcmYW1wOyc6ICcmJyxcbiAgJyZsdDsnOiAnPCcsXG4gICcmZ3Q7JzogJz4nLFxuICAnJnF1b3Q7JzogJ1wiJyxcbiAgJyYjMzk7JzogXCInXCJcbn07XG5cbi8qKlxuICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAqL1xudmFyIHVuZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtcblxuZXhwb3J0IGRlZmF1bHQgdW5lc2NhcGVIdG1sQ2hhcjtcbiIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcbmltcG9ydCB1bmVzY2FwZUh0bWxDaGFyIGZyb20gJy4vX3VuZXNjYXBlSHRtbENoYXIuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG52YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKTtcblxuLyoqXG4gKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICogYCZhbXA7YCwgYCZsdDtgLCBgJmd0O2AsIGAmcXVvdDtgLCBhbmQgYCYjMzk7YCBpbiBgc3RyaW5nYCB0b1xuICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICpcbiAqICoqTm90ZToqKiBObyBvdGhlciBIVE1MIGVudGl0aWVzIGFyZSB1bmVzY2FwZWQuIFRvIHVuZXNjYXBlIGFkZGl0aW9uYWxcbiAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC42LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVuZXNjYXBlO1xuIiwiaW1wb3J0IGNyZWF0ZUNvbXBvdW5kZXIgZnJvbSAnLi9fY3JlYXRlQ29tcG91bmRlci5qcyc7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gKiAvLyA9PiAnRk9PIEJBUidcbiAqXG4gKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gKiAvLyA9PiAnRk9PIEJBUidcbiAqXG4gKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAqIC8vID0+ICdGT08gQkFSJ1xuICovXG52YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdXBwZXJDYXNlO1xuIiwiaW1wb3J0IGNhbWVsQ2FzZSBmcm9tICcuL2NhbWVsQ2FzZS5qcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuL2NhcGl0YWxpemUuanMnO1xuaW1wb3J0IGRlYnVyciBmcm9tICcuL2RlYnVyci5qcyc7XG5pbXBvcnQgZW5kc1dpdGggZnJvbSAnLi9lbmRzV2l0aC5qcyc7XG5pbXBvcnQgZXNjYXBlIGZyb20gJy4vZXNjYXBlLmpzJztcbmltcG9ydCBlc2NhcGVSZWdFeHAgZnJvbSAnLi9lc2NhcGVSZWdFeHAuanMnO1xuaW1wb3J0IGtlYmFiQ2FzZSBmcm9tICcuL2tlYmFiQ2FzZS5qcyc7XG5pbXBvcnQgbG93ZXJDYXNlIGZyb20gJy4vbG93ZXJDYXNlLmpzJztcbmltcG9ydCBsb3dlckZpcnN0IGZyb20gJy4vbG93ZXJGaXJzdC5qcyc7XG5pbXBvcnQgcGFkIGZyb20gJy4vcGFkLmpzJztcbmltcG9ydCBwYWRFbmQgZnJvbSAnLi9wYWRFbmQuanMnO1xuaW1wb3J0IHBhZFN0YXJ0IGZyb20gJy4vcGFkU3RhcnQuanMnO1xuaW1wb3J0IHBhcnNlSW50IGZyb20gJy4vcGFyc2VJbnQuanMnO1xuaW1wb3J0IHJlcGVhdCBmcm9tICcuL3JlcGVhdC5qcyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UuanMnO1xuaW1wb3J0IHNuYWtlQ2FzZSBmcm9tICcuL3NuYWtlQ2FzZS5qcyc7XG5pbXBvcnQgc3BsaXQgZnJvbSAnLi9zcGxpdC5qcyc7XG5pbXBvcnQgc3RhcnRDYXNlIGZyb20gJy4vc3RhcnRDYXNlLmpzJztcbmltcG9ydCBzdGFydHNXaXRoIGZyb20gJy4vc3RhcnRzV2l0aC5qcyc7XG5pbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgdGVtcGxhdGVTZXR0aW5ncyBmcm9tICcuL3RlbXBsYXRlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHRvTG93ZXIgZnJvbSAnLi90b0xvd2VyLmpzJztcbmltcG9ydCB0b1VwcGVyIGZyb20gJy4vdG9VcHBlci5qcyc7XG5pbXBvcnQgdHJpbSBmcm9tICcuL3RyaW0uanMnO1xuaW1wb3J0IHRyaW1FbmQgZnJvbSAnLi90cmltRW5kLmpzJztcbmltcG9ydCB0cmltU3RhcnQgZnJvbSAnLi90cmltU3RhcnQuanMnO1xuaW1wb3J0IHRydW5jYXRlIGZyb20gJy4vdHJ1bmNhdGUuanMnO1xuaW1wb3J0IHVuZXNjYXBlIGZyb20gJy4vdW5lc2NhcGUuanMnO1xuaW1wb3J0IHVwcGVyQ2FzZSBmcm9tICcuL3VwcGVyQ2FzZS5qcyc7XG5pbXBvcnQgdXBwZXJGaXJzdCBmcm9tICcuL3VwcGVyRmlyc3QuanMnO1xuaW1wb3J0IHdvcmRzIGZyb20gJy4vd29yZHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNhbWVsQ2FzZSwgY2FwaXRhbGl6ZSwgZGVidXJyLCBlbmRzV2l0aCwgZXNjYXBlLFxuICBlc2NhcGVSZWdFeHAsIGtlYmFiQ2FzZSwgbG93ZXJDYXNlLCBsb3dlckZpcnN0LCBwYWQsXG4gIHBhZEVuZCwgcGFkU3RhcnQsIHBhcnNlSW50LCByZXBlYXQsIHJlcGxhY2UsXG4gIHNuYWtlQ2FzZSwgc3BsaXQsIHN0YXJ0Q2FzZSwgc3RhcnRzV2l0aCwgdGVtcGxhdGUsXG4gIHRlbXBsYXRlU2V0dGluZ3MsIHRvTG93ZXIsIHRvVXBwZXIsIHRyaW0sIHRyaW1FbmQsXG4gIHRyaW1TdGFydCwgdHJ1bmNhdGUsIHVuZXNjYXBlLCB1cHBlckNhc2UsIHVwcGVyRmlyc3QsXG4gIHdvcmRzXG59O1xuIiwiaW1wb3J0IGFycmF5RWFjaCBmcm9tICcuL19hcnJheUVhY2guanMnO1xuaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGJpbmQgZnJvbSAnLi9iaW5kLmpzJztcbmltcG9ydCBmbGF0UmVzdCBmcm9tICcuL19mbGF0UmVzdC5qcyc7XG5pbXBvcnQgdG9LZXkgZnJvbSAnLi9fdG9LZXkuanMnO1xuXG4vKipcbiAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAqIG1ldGhvZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gbWV0aG9kTmFtZXMgVGhlIG9iamVjdCBtZXRob2QgbmFtZXMgdG8gYmluZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB2aWV3ID0ge1xuICogICAnbGFiZWwnOiAnZG9jcycsXG4gKiAgICdjbGljayc6IGZ1bmN0aW9uKCkge1xuICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB2aWV3LmNsaWNrKTtcbiAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICovXG52YXIgYmluZEFsbCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgbWV0aG9kTmFtZXMpIHtcbiAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgYmluZChvYmplY3Rba2V5XSwgb2JqZWN0KSk7XG4gIH0pO1xuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGJpbmRBbGw7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBmdW5jdGlvbiBvZiB0aGUgZmlyc3QgcHJlZGljYXRlIHRvIHJldHVybiB0cnV0aHkuIFRoZSBwcmVkaWNhdGUtZnVuY3Rpb25cbiAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAqIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgZnVuYyA9IF8uY29uZChbXG4gKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gKiAgIFtfLnN0dWJUcnVlLCAgICAgICAgICAgICAgICAgICAgICBfLmNvbnN0YW50KCdubyBtYXRjaCcpXVxuICogXSk7XG4gKlxuICogZnVuYyh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICogLy8gPT4gJ21hdGNoZXMgQSdcbiAqXG4gKiBmdW5jKHsgJ2EnOiAwLCAnYic6IDEgfSk7XG4gKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICpcbiAqIGZ1bmMoeyAnYSc6ICcxJywgJ2InOiAnMicgfSk7XG4gKiAvLyA9PiAnbm8gbWF0Y2gnXG4gKi9cbmZ1bmN0aW9uIGNvbmQocGFpcnMpIHtcbiAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgdG9JdGVyYXRlZSA9IGJhc2VJdGVyYXRlZTtcblxuICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICB9XG4gICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KHBhaXJbMV0sIHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmQ7XG4iLCJpbXBvcnQgYmFzZUNvbmZvcm1zVG8gZnJvbSAnLi9fYmFzZUNvbmZvcm1zVG8uanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpO1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VDb25mb3JtcztcbiIsImltcG9ydCBiYXNlQ2xvbmUgZnJvbSAnLi9fYmFzZUNsb25lLmpzJztcbmltcG9ydCBiYXNlQ29uZm9ybXMgZnJvbSAnLi9fYmFzZUNvbmZvcm1zLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBhIGdpdmVuIG9iamVjdCwgcmV0dXJuaW5nIGB0cnVlYCBpZlxuICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zVG9gIHdpdGhcbiAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiAyLCAnYic6IDEgfSxcbiAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gKiBdO1xuICpcbiAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gKi9cbmZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25mb3JtcztcbiIsIi8qKlxuICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICogb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjE0LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gKiAvLyA9PiAxXG4gKlxuICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gKiAvLyA9PiAxMFxuICovXG5mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gKHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0VG87XG4iLCJpbXBvcnQgTG9kYXNoV3JhcHBlciBmcm9tICcuL19Mb2Rhc2hXcmFwcGVyLmpzJztcbmltcG9ydCBmbGF0UmVzdCBmcm9tICcuL19mbGF0UmVzdC5qcyc7XG5pbXBvcnQgZ2V0RGF0YSBmcm9tICcuL19nZXREYXRhLmpzJztcbmltcG9ydCBnZXRGdW5jTmFtZSBmcm9tICcuL19nZXRGdW5jTmFtZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzTGF6aWFibGUgZnJvbSAnLi9faXNMYXppYWJsZS5qcyc7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmxvd2Agb3IgYF8uZmxvd1JpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCkge1xuICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgIGZ1bmNzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIHZhciBmdW5jID0gZnVuY3NbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBkYXRhID0gZnVuY05hbWUgPT0gJ3dyYXBwZXInID8gZ2V0RGF0YShmdW5jKSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgIWRhdGFbNF0ubGVuZ3RoICYmIGRhdGFbOV0gPT0gMVxuICAgICAgICAgICkge1xuICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICA6IHdyYXBwZXIudGhydShmdW5jKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICBpZiAod3JhcHBlciAmJiBhcmdzLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gZnVuY3NbaW5kZXhdLmNhbGwodGhpcywgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZsb3c7XG4iLCJpbXBvcnQgY3JlYXRlRmxvdyBmcm9tICcuL19jcmVhdGVGbG93LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKiBAc2VlIF8uZmxvd1JpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gKiBhZGRTcXVhcmUoMSwgMik7XG4gKiAvLyA9PiA5XG4gKi9cbnZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG5leHBvcnQgZGVmYXVsdCBmbG93O1xuIiwiaW1wb3J0IGNyZWF0ZUZsb3cgZnJvbSAnLi9fY3JlYXRlRmxvdy5qcyc7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICogaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKiBAc2VlIF8uZmxvd1xuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICogICByZXR1cm4gbiAqIG47XG4gKiB9XG4gKlxuICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvd1JpZ2h0KFtzcXVhcmUsIF8uYWRkXSk7XG4gKiBhZGRTcXVhcmUoMSwgMik7XG4gKiAvLyA9PiA5XG4gKi9cbnZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG5leHBvcnQgZGVmYXVsdCBmbG93UmlnaHQ7XG4iLCJpbXBvcnQgYmFzZUNsb25lIGZyb20gJy4vX2Jhc2VDbG9uZS5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gKiBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gdGhlIGVxdWl2YWxlbnRcbiAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSA0LjAuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICogLy8gPT4gW3sgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9XVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKFsndXNlcicsICdmcmVkJ10pKTtcbiAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gKlxuICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICogICByZXR1cm4gIV8uaXNSZWdFeHAoZnVuYykgPyBpdGVyYXRlZShmdW5jKSA6IGZ1bmN0aW9uKHN0cmluZykge1xuICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAqICAgfTtcbiAqIH0pO1xuICpcbiAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAqIC8vID0+IFsnZGVmJ11cbiAqL1xuZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICByZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jID09ICdmdW5jdGlvbicgPyBmdW5jIDogYmFzZUNsb25lKGZ1bmMsIENMT05FX0RFRVBfRkxBRykpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpdGVyYXRlZTtcbiIsImltcG9ydCBiYXNlQ2xvbmUgZnJvbSAnLi9fYmFzZUNsb25lLmpzJztcbmltcG9ydCBiYXNlTWF0Y2hlcyBmcm9tICcuL19iYXNlTWF0Y2hlcy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50XG4gKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgXG4gKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAqXG4gKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICogXTtcbiAqXG4gKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWF0Y2hlcztcbiIsImltcG9ydCBiYXNlQ2xvbmUgZnJvbSAnLi9fYmFzZUNsb25lLmpzJztcbmltcG9ydCBiYXNlTWF0Y2hlc1Byb3BlcnR5IGZyb20gJy4vX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gKiBvYmplY3QgdmFsdWUgaXMgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICogYHNyY1ZhbHVlYCB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZVxuICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjIuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW1xuICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAqIF07XG4gKlxuICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICogLy8gPT4geyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hdGNoZXNQcm9wZXJ0eTtcbiIsImltcG9ydCBiYXNlSW52b2tlIGZyb20gJy4vX2Jhc2VJbnZva2UuanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgxKSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoJ2EuYicpKTtcbiAqIC8vID0+IFsyLCAxXVxuICpcbiAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJ10pKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG52YXIgbWV0aG9kID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgfTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBtZXRob2Q7XG4iLCJpbXBvcnQgYmFzZUludm9rZSBmcm9tICcuL19iYXNlSW52b2tlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5cbi8qKlxuICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gKiBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gKlxuICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAqIC8vID0+IFsyLCAwXVxuICpcbiAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAqIC8vID0+IFsyLCAwXVxuICovXG52YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICB9O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZE9mO1xuIiwiaW1wb3J0IGFycmF5RWFjaCBmcm9tICcuL19hcnJheUVhY2guanMnO1xuaW1wb3J0IGFycmF5UHVzaCBmcm9tICcuL19hcnJheVB1c2guanMnO1xuaW1wb3J0IGJhc2VGdW5jdGlvbnMgZnJvbSAnLi9fYmFzZUZ1bmN0aW9ucy5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzRnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAqXG4gKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAqICAgfSk7XG4gKiB9XG4gKlxuICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gKiBfLnZvd2VscygnZnJlZCcpO1xuICogLy8gPT4gWydlJ11cbiAqXG4gKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAqIC8vID0+IFsnZSddXG4gKlxuICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAqIC8vID0+IFsnZSddXG4gKi9cbmZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSxcbiAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgaWYgKGlzRnVuYykge1xuICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBtaXhpbjtcbiIsImltcG9ydCBiYXNlTnRoIGZyb20gJy4vX2Jhc2VOdGguanMnO1xuaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhc3MtdGhydSBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGZ1bmMgPSBfLm50aEFyZygxKTtcbiAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAqIC8vID0+ICdiJ1xuICpcbiAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICogLy8gPT4gJ2MnXG4gKi9cbmZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBudGhBcmc7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgZmxhdFJlc3QgZnJvbSAnLi9fZmxhdFJlc3QuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoYmFzZUl0ZXJhdGVlKSk7XG4gICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIHZhciB0aGlzQXJnID0gdGhpcztcbiAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVPdmVyO1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBjcmVhdGVPdmVyIGZyb20gJy4vX2NyZWF0ZU92ZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGl0ZXJhdGVlc2Agd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzXG4gKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGZ1bmMgPSBfLm92ZXIoW01hdGgubWF4LCBNYXRoLm1pbl0pO1xuICpcbiAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gKiAvLyA9PiBbNCwgMV1cbiAqL1xudmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuZXhwb3J0IGRlZmF1bHQgb3ZlcjtcbiIsImltcG9ydCBhcnJheUV2ZXJ5IGZyb20gJy4vX2FycmF5RXZlcnkuanMnO1xuaW1wb3J0IGNyZWF0ZU92ZXIgZnJvbSAnLi9fY3JlYXRlT3Zlci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBmdW5jID0gXy5vdmVyRXZlcnkoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gKlxuICogZnVuYygnMScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGZ1bmMobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIGZ1bmMoTmFOKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpO1xuXG5leHBvcnQgZGVmYXVsdCBvdmVyRXZlcnk7XG4iLCJpbXBvcnQgYXJyYXlTb21lIGZyb20gJy4vX2FycmF5U29tZS5qcyc7XG5pbXBvcnQgY3JlYXRlT3ZlciBmcm9tICcuL19jcmVhdGVPdmVyLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbnkqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICpcbiAqIGZ1bmMoJzEnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBmdW5jKG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIGZ1bmMoTmFOKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBvdmVyU29tZSA9IGNyZWF0ZU92ZXIoYXJyYXlTb21lKTtcblxuZXhwb3J0IGRlZmF1bHQgb3ZlclNvbWU7XG4iLCJpbXBvcnQgYmFzZUdldCBmcm9tICcuL19iYXNlR2V0LmpzJztcblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gKiB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICpcbiAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAqIC8vID0+IFsyLCAwXVxuICpcbiAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICogLy8gPT4gWzIsIDBdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBwcm9wZXJ0eU9mO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gKiBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHN0ZXA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVJhbmdlO1xuIiwiaW1wb3J0IGJhc2VSYW5nZSBmcm9tICcuL19iYXNlUmFuZ2UuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcbmltcG9ydCB0b0Zpbml0ZSBmcm9tICcuL3RvRmluaXRlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdGFydCwgZW5kLCBzdGVwKSkge1xuICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gRW5zdXJlIHRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgfVxuICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgcmV0dXJuIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSYW5nZTtcbiIsImltcG9ydCBjcmVhdGVSYW5nZSBmcm9tICcuL19jcmVhdGVSYW5nZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAqXG4gKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlKDQpO1xuICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gKlxuICogXy5yYW5nZSgtNCk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDUpO1xuICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICpcbiAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlKDApO1xuICogLy8gPT4gW11cbiAqL1xudmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgcmFuZ2U7XG4iLCJpbXBvcnQgY3JlYXRlUmFuZ2UgZnJvbSAnLi9fY3JlYXRlUmFuZ2UuanMnO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmFuZ2VgIGV4Y2VwdCB0aGF0IGl0IHBvcHVsYXRlcyB2YWx1ZXMgaW5cbiAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlUmlnaHQoNCk7XG4gKiAvLyA9PiBbMywgMiwgMSwgMF1cbiAqXG4gKiBfLnJhbmdlUmlnaHQoLTQpO1xuICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gKlxuICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICogLy8gPT4gWzQsIDMsIDIsIDFdXG4gKlxuICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAqIC8vID0+IFsxNSwgMTAsIDUsIDBdXG4gKlxuICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAqXG4gKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlUmlnaHQoMCk7XG4gKiAvLyA9PiBbXVxuICovXG52YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG5leHBvcnQgZGVmYXVsdCByYW5nZVJpZ2h0O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLnN0dWJPYmplY3QpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3t9LCB7fV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R1Yk9iamVjdDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAqIC8vID0+IFsnJywgJyddXG4gKi9cbmZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R1YlN0cmluZztcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gKiAvLyA9PiBbdHJ1ZSwgdHJ1ZV1cbiAqL1xuZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHViVHJ1ZTtcbiIsImltcG9ydCBiYXNlVGltZXMgZnJvbSAnLi9fYmFzZVRpbWVzLmpzJztcbmltcG9ydCBjYXN0RnVuY3Rpb24gZnJvbSAnLi9fY2FzdEZ1bmN0aW9uLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbnZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mXG4gKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMywgU3RyaW5nKTtcbiAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICpcbiAqICBfLnRpbWVzKDQsIF8uY29uc3RhbnQoMCkpO1xuICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gKi9cbmZ1bmN0aW9uIHRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpO1xuXG4gIGl0ZXJhdGVlID0gY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKTtcbiAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB0aW1lcztcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgY29weUFycmF5IGZyb20gJy4vX2NvcHlBcnJheS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuaW1wb3J0IHN0cmluZ1RvUGF0aCBmcm9tICcuL19zdHJpbmdUb1BhdGguanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcbmltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9QYXRoKCdhLmIuYycpO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKlxuICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICovXG5mdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gIH1cbiAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1BhdGg7XG4iLCJpbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW5pcXVlSWQ7XG4iLCJpbXBvcnQgYXR0ZW1wdCBmcm9tICcuL2F0dGVtcHQuanMnO1xuaW1wb3J0IGJpbmRBbGwgZnJvbSAnLi9iaW5kQWxsLmpzJztcbmltcG9ydCBjb25kIGZyb20gJy4vY29uZC5qcyc7XG5pbXBvcnQgY29uZm9ybXMgZnJvbSAnLi9jb25mb3Jtcy5qcyc7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSAnLi9jb25zdGFudC5qcyc7XG5pbXBvcnQgZGVmYXVsdFRvIGZyb20gJy4vZGVmYXVsdFRvLmpzJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmxvdy5qcyc7XG5pbXBvcnQgZmxvd1JpZ2h0IGZyb20gJy4vZmxvd1JpZ2h0LmpzJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCBpdGVyYXRlZSBmcm9tICcuL2l0ZXJhdGVlLmpzJztcbmltcG9ydCBtYXRjaGVzIGZyb20gJy4vbWF0Y2hlcy5qcyc7XG5pbXBvcnQgbWF0Y2hlc1Byb3BlcnR5IGZyb20gJy4vbWF0Y2hlc1Byb3BlcnR5LmpzJztcbmltcG9ydCBtZXRob2QgZnJvbSAnLi9tZXRob2QuanMnO1xuaW1wb3J0IG1ldGhvZE9mIGZyb20gJy4vbWV0aG9kT2YuanMnO1xuaW1wb3J0IG1peGluIGZyb20gJy4vbWl4aW4uanMnO1xuaW1wb3J0IG5vb3AgZnJvbSAnLi9ub29wLmpzJztcbmltcG9ydCBudGhBcmcgZnJvbSAnLi9udGhBcmcuanMnO1xuaW1wb3J0IG92ZXIgZnJvbSAnLi9vdmVyLmpzJztcbmltcG9ydCBvdmVyRXZlcnkgZnJvbSAnLi9vdmVyRXZlcnkuanMnO1xuaW1wb3J0IG92ZXJTb21lIGZyb20gJy4vb3ZlclNvbWUuanMnO1xuaW1wb3J0IHByb3BlcnR5IGZyb20gJy4vcHJvcGVydHkuanMnO1xuaW1wb3J0IHByb3BlcnR5T2YgZnJvbSAnLi9wcm9wZXJ0eU9mLmpzJztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlLmpzJztcbmltcG9ydCByYW5nZVJpZ2h0IGZyb20gJy4vcmFuZ2VSaWdodC5qcyc7XG5pbXBvcnQgc3R1YkFycmF5IGZyb20gJy4vc3R1YkFycmF5LmpzJztcbmltcG9ydCBzdHViRmFsc2UgZnJvbSAnLi9zdHViRmFsc2UuanMnO1xuaW1wb3J0IHN0dWJPYmplY3QgZnJvbSAnLi9zdHViT2JqZWN0LmpzJztcbmltcG9ydCBzdHViU3RyaW5nIGZyb20gJy4vc3R1YlN0cmluZy5qcyc7XG5pbXBvcnQgc3R1YlRydWUgZnJvbSAnLi9zdHViVHJ1ZS5qcyc7XG5pbXBvcnQgdGltZXMgZnJvbSAnLi90aW1lcy5qcyc7XG5pbXBvcnQgdG9QYXRoIGZyb20gJy4vdG9QYXRoLmpzJztcbmltcG9ydCB1bmlxdWVJZCBmcm9tICcuL3VuaXF1ZUlkLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBhdHRlbXB0LCBiaW5kQWxsLCBjb25kLCBjb25mb3JtcywgY29uc3RhbnQsXG4gIGRlZmF1bHRUbywgZmxvdywgZmxvd1JpZ2h0LCBpZGVudGl0eSwgaXRlcmF0ZWUsXG4gIG1hdGNoZXMsIG1hdGNoZXNQcm9wZXJ0eSwgbWV0aG9kLCBtZXRob2RPZiwgbWl4aW4sXG4gIG5vb3AsIG50aEFyZywgb3Zlciwgb3ZlckV2ZXJ5LCBvdmVyU29tZSxcbiAgcHJvcGVydHksIHByb3BlcnR5T2YsIHJhbmdlLCByYW5nZVJpZ2h0LCBzdHViQXJyYXksXG4gIHN0dWJGYWxzZSwgc3R1Yk9iamVjdCwgc3R1YlN0cmluZywgc3R1YlRydWUsIHRpbWVzLFxuICB0b1BhdGgsIHVuaXF1ZUlkXG59O1xuIiwiaW1wb3J0IExhenlXcmFwcGVyIGZyb20gJy4vX0xhenlXcmFwcGVyLmpzJztcbmltcG9ydCBjb3B5QXJyYXkgZnJvbSAnLi9fY29weUFycmF5LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGxhenkgd3JhcHBlciBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsb25lXG4gKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG4gIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gIHJlc3VsdC5fX2l0ZXJhdGVlc19fID0gY29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7XG4gIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGF6eUNsb25lO1xuIiwiaW1wb3J0IExhenlXcmFwcGVyIGZyb20gJy4vX0xhenlXcmFwcGVyLmpzJztcblxuLyoqXG4gKiBSZXZlcnNlcyB0aGUgZGlyZWN0aW9uIG9mIGxhenkgaXRlcmF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSByZXZlcnNlXG4gKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGF6eVJldmVyc2U7XG4iLCIvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdmlldywgYXBwbHlpbmcgYW55IGB0cmFuc2Zvcm1zYCB0byB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSB2aWV3LlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYHN0YXJ0YCBhbmQgYGVuZGBcbiAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGdldFZpZXcoc3RhcnQsIGVuZCwgdHJhbnNmb3Jtcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgIGNhc2UgJ3Rha2UnOiAgICAgIGVuZCA9IG5hdGl2ZU1pbihlbmQsIHN0YXJ0ICsgc2l6ZSk7IGJyZWFrO1xuICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VmlldztcbiIsImltcG9ydCBiYXNlV3JhcHBlclZhbHVlIGZyb20gJy4vX2Jhc2VXcmFwcGVyVmFsdWUuanMnO1xuaW1wb3J0IGdldFZpZXcgZnJvbSAnLi9fZ2V0Vmlldy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbnZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICBMQVpZX01BUF9GTEFHID0gMjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSB2YWx1ZVxuICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBsYXp5VmFsdWUoKSB7XG4gIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgIGlzQXJyID0gaXNBcnJheShhcnJheSksXG4gICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgIHZpZXcgPSBnZXRWaWV3KDAsIGFyckxlbmd0aCwgdGhpcy5fX3ZpZXdzX18pLFxuICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCxcbiAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgaXRlckxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gIGlmICghaXNBcnIgfHwgKCFpc1JpZ2h0ICYmIGFyckxlbmd0aCA9PSBsZW5ndGggJiYgdGFrZUNvdW50ID09IGxlbmd0aCkpIHtcbiAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIG91dGVyOlxuICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICBpbmRleCArPSBkaXI7XG5cbiAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgd2hpbGUgKCsraXRlckluZGV4IDwgaXRlckxlbmd0aCkge1xuICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgdHlwZSA9IGRhdGEudHlwZSxcbiAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkO1xuICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxhenlWYWx1ZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cImVzXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbmltcG9ydCBhcnJheSBmcm9tICcuL2FycmF5LmpzJztcbmltcG9ydCBjb2xsZWN0aW9uIGZyb20gJy4vY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgZGF0ZSBmcm9tICcuL2RhdGUuanMnO1xuaW1wb3J0IGZ1bmMgZnJvbSAnLi9mdW5jdGlvbi5qcyc7XG5pbXBvcnQgbGFuZyBmcm9tICcuL2xhbmcuanMnO1xuaW1wb3J0IG1hdGggZnJvbSAnLi9tYXRoLmpzJztcbmltcG9ydCBudW1iZXIgZnJvbSAnLi9udW1iZXIuanMnO1xuaW1wb3J0IG9iamVjdCBmcm9tICcuL29iamVjdC5qcyc7XG5pbXBvcnQgc2VxIGZyb20gJy4vc2VxLmpzJztcbmltcG9ydCBzdHJpbmcgZnJvbSAnLi9zdHJpbmcuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCBMYXp5V3JhcHBlciBmcm9tICcuL19MYXp5V3JhcHBlci5qcyc7XG5pbXBvcnQgTG9kYXNoV3JhcHBlciBmcm9tICcuL19Mb2Rhc2hXcmFwcGVyLmpzJztcbmltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBhcnJheUVhY2ggZnJvbSAnLi9fYXJyYXlFYWNoLmpzJztcbmltcG9ydCBhcnJheVB1c2ggZnJvbSAnLi9fYXJyYXlQdXNoLmpzJztcbmltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuaW1wb3J0IGJhc2VGdW5jdGlvbnMgZnJvbSAnLi9fYmFzZUZ1bmN0aW9ucy5qcyc7XG5pbXBvcnQgYmFzZUludm9rZSBmcm9tICcuL19iYXNlSW52b2tlLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgY3JlYXRlSHlicmlkIGZyb20gJy4vX2NyZWF0ZUh5YnJpZC5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcbmltcG9ydCBsYXN0IGZyb20gJy4vbGFzdC5qcyc7XG5pbXBvcnQgbGF6eUNsb25lIGZyb20gJy4vX2xhenlDbG9uZS5qcyc7XG5pbXBvcnQgbGF6eVJldmVyc2UgZnJvbSAnLi9fbGF6eVJldmVyc2UuanMnO1xuaW1wb3J0IGxhenlWYWx1ZSBmcm9tICcuL19sYXp5VmFsdWUuanMnO1xuaW1wb3J0IF9taXhpbiBmcm9tICcuL21peGluLmpzJztcbmltcG9ydCBuZWdhdGUgZnJvbSAnLi9uZWdhdGUuanMnO1xuaW1wb3J0IHJlYWxOYW1lcyBmcm9tICcuL19yZWFsTmFtZXMuanMnO1xuaW1wb3J0IHRocnUgZnJvbSAnLi90aHJ1LmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICcuL3dyYXBwZXJMb2Rhc2guanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG52YXIgVkVSU0lPTiA9ICc0LjE3LjE1JztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9CSU5EX0tFWV9GTEFHID0gMjtcblxuLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG52YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbnZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vLyB3cmFwIGBfLm1peGluYCBzbyBpdCB3b3JrcyB3aGVuIHByb3ZpZGVkIG9ubHkgb25lIGFyZ3VtZW50XG52YXIgbWl4aW4gPSAoZnVuY3Rpb24oZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICB2YXIgaXNPYmogPSBpc09iamVjdChzb3VyY2UpLFxuICAgICAgICAgIHByb3BzID0gaXNPYmogJiYga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gcHJvcHMgJiYgcHJvcHMubGVuZ3RoICYmIGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7XG5cbiAgICAgIGlmICghKG1ldGhvZE5hbWVzID8gbWV0aG9kTmFtZXMubGVuZ3RoIDogaXNPYmopKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpO1xuICB9O1xufShfbWl4aW4pKTtcblxuLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxubG9kYXNoLmFmdGVyID0gZnVuYy5hZnRlcjtcbmxvZGFzaC5hcnkgPSBmdW5jLmFyeTtcbmxvZGFzaC5hc3NpZ24gPSBvYmplY3QuYXNzaWduO1xubG9kYXNoLmFzc2lnbkluID0gb2JqZWN0LmFzc2lnbkluO1xubG9kYXNoLmFzc2lnbkluV2l0aCA9IG9iamVjdC5hc3NpZ25JbldpdGg7XG5sb2Rhc2guYXNzaWduV2l0aCA9IG9iamVjdC5hc3NpZ25XaXRoO1xubG9kYXNoLmF0ID0gb2JqZWN0LmF0O1xubG9kYXNoLmJlZm9yZSA9IGZ1bmMuYmVmb3JlO1xubG9kYXNoLmJpbmQgPSBmdW5jLmJpbmQ7XG5sb2Rhc2guYmluZEFsbCA9IHV0aWwuYmluZEFsbDtcbmxvZGFzaC5iaW5kS2V5ID0gZnVuYy5iaW5kS2V5O1xubG9kYXNoLmNhc3RBcnJheSA9IGxhbmcuY2FzdEFycmF5O1xubG9kYXNoLmNoYWluID0gc2VxLmNoYWluO1xubG9kYXNoLmNodW5rID0gYXJyYXkuY2h1bms7XG5sb2Rhc2guY29tcGFjdCA9IGFycmF5LmNvbXBhY3Q7XG5sb2Rhc2guY29uY2F0ID0gYXJyYXkuY29uY2F0O1xubG9kYXNoLmNvbmQgPSB1dGlsLmNvbmQ7XG5sb2Rhc2guY29uZm9ybXMgPSB1dGlsLmNvbmZvcm1zO1xubG9kYXNoLmNvbnN0YW50ID0gdXRpbC5jb25zdGFudDtcbmxvZGFzaC5jb3VudEJ5ID0gY29sbGVjdGlvbi5jb3VudEJ5O1xubG9kYXNoLmNyZWF0ZSA9IG9iamVjdC5jcmVhdGU7XG5sb2Rhc2guY3VycnkgPSBmdW5jLmN1cnJ5O1xubG9kYXNoLmN1cnJ5UmlnaHQgPSBmdW5jLmN1cnJ5UmlnaHQ7XG5sb2Rhc2guZGVib3VuY2UgPSBmdW5jLmRlYm91bmNlO1xubG9kYXNoLmRlZmF1bHRzID0gb2JqZWN0LmRlZmF1bHRzO1xubG9kYXNoLmRlZmF1bHRzRGVlcCA9IG9iamVjdC5kZWZhdWx0c0RlZXA7XG5sb2Rhc2guZGVmZXIgPSBmdW5jLmRlZmVyO1xubG9kYXNoLmRlbGF5ID0gZnVuYy5kZWxheTtcbmxvZGFzaC5kaWZmZXJlbmNlID0gYXJyYXkuZGlmZmVyZW5jZTtcbmxvZGFzaC5kaWZmZXJlbmNlQnkgPSBhcnJheS5kaWZmZXJlbmNlQnk7XG5sb2Rhc2guZGlmZmVyZW5jZVdpdGggPSBhcnJheS5kaWZmZXJlbmNlV2l0aDtcbmxvZGFzaC5kcm9wID0gYXJyYXkuZHJvcDtcbmxvZGFzaC5kcm9wUmlnaHQgPSBhcnJheS5kcm9wUmlnaHQ7XG5sb2Rhc2guZHJvcFJpZ2h0V2hpbGUgPSBhcnJheS5kcm9wUmlnaHRXaGlsZTtcbmxvZGFzaC5kcm9wV2hpbGUgPSBhcnJheS5kcm9wV2hpbGU7XG5sb2Rhc2guZmlsbCA9IGFycmF5LmZpbGw7XG5sb2Rhc2guZmlsdGVyID0gY29sbGVjdGlvbi5maWx0ZXI7XG5sb2Rhc2guZmxhdE1hcCA9IGNvbGxlY3Rpb24uZmxhdE1hcDtcbmxvZGFzaC5mbGF0TWFwRGVlcCA9IGNvbGxlY3Rpb24uZmxhdE1hcERlZXA7XG5sb2Rhc2guZmxhdE1hcERlcHRoID0gY29sbGVjdGlvbi5mbGF0TWFwRGVwdGg7XG5sb2Rhc2guZmxhdHRlbiA9IGFycmF5LmZsYXR0ZW47XG5sb2Rhc2guZmxhdHRlbkRlZXAgPSBhcnJheS5mbGF0dGVuRGVlcDtcbmxvZGFzaC5mbGF0dGVuRGVwdGggPSBhcnJheS5mbGF0dGVuRGVwdGg7XG5sb2Rhc2guZmxpcCA9IGZ1bmMuZmxpcDtcbmxvZGFzaC5mbG93ID0gdXRpbC5mbG93O1xubG9kYXNoLmZsb3dSaWdodCA9IHV0aWwuZmxvd1JpZ2h0O1xubG9kYXNoLmZyb21QYWlycyA9IGFycmF5LmZyb21QYWlycztcbmxvZGFzaC5mdW5jdGlvbnMgPSBvYmplY3QuZnVuY3Rpb25zO1xubG9kYXNoLmZ1bmN0aW9uc0luID0gb2JqZWN0LmZ1bmN0aW9uc0luO1xubG9kYXNoLmdyb3VwQnkgPSBjb2xsZWN0aW9uLmdyb3VwQnk7XG5sb2Rhc2guaW5pdGlhbCA9IGFycmF5LmluaXRpYWw7XG5sb2Rhc2guaW50ZXJzZWN0aW9uID0gYXJyYXkuaW50ZXJzZWN0aW9uO1xubG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gYXJyYXkuaW50ZXJzZWN0aW9uQnk7XG5sb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGFycmF5LmludGVyc2VjdGlvbldpdGg7XG5sb2Rhc2guaW52ZXJ0ID0gb2JqZWN0LmludmVydDtcbmxvZGFzaC5pbnZlcnRCeSA9IG9iamVjdC5pbnZlcnRCeTtcbmxvZGFzaC5pbnZva2VNYXAgPSBjb2xsZWN0aW9uLmludm9rZU1hcDtcbmxvZGFzaC5pdGVyYXRlZSA9IHV0aWwuaXRlcmF0ZWU7XG5sb2Rhc2gua2V5QnkgPSBjb2xsZWN0aW9uLmtleUJ5O1xubG9kYXNoLmtleXMgPSBrZXlzO1xubG9kYXNoLmtleXNJbiA9IG9iamVjdC5rZXlzSW47XG5sb2Rhc2gubWFwID0gY29sbGVjdGlvbi5tYXA7XG5sb2Rhc2gubWFwS2V5cyA9IG9iamVjdC5tYXBLZXlzO1xubG9kYXNoLm1hcFZhbHVlcyA9IG9iamVjdC5tYXBWYWx1ZXM7XG5sb2Rhc2gubWF0Y2hlcyA9IHV0aWwubWF0Y2hlcztcbmxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSB1dGlsLm1hdGNoZXNQcm9wZXJ0eTtcbmxvZGFzaC5tZW1vaXplID0gZnVuYy5tZW1vaXplO1xubG9kYXNoLm1lcmdlID0gb2JqZWN0Lm1lcmdlO1xubG9kYXNoLm1lcmdlV2l0aCA9IG9iamVjdC5tZXJnZVdpdGg7XG5sb2Rhc2gubWV0aG9kID0gdXRpbC5tZXRob2Q7XG5sb2Rhc2gubWV0aG9kT2YgPSB1dGlsLm1ldGhvZE9mO1xubG9kYXNoLm1peGluID0gbWl4aW47XG5sb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xubG9kYXNoLm50aEFyZyA9IHV0aWwubnRoQXJnO1xubG9kYXNoLm9taXQgPSBvYmplY3Qub21pdDtcbmxvZGFzaC5vbWl0QnkgPSBvYmplY3Qub21pdEJ5O1xubG9kYXNoLm9uY2UgPSBmdW5jLm9uY2U7XG5sb2Rhc2gub3JkZXJCeSA9IGNvbGxlY3Rpb24ub3JkZXJCeTtcbmxvZGFzaC5vdmVyID0gdXRpbC5vdmVyO1xubG9kYXNoLm92ZXJBcmdzID0gZnVuYy5vdmVyQXJncztcbmxvZGFzaC5vdmVyRXZlcnkgPSB1dGlsLm92ZXJFdmVyeTtcbmxvZGFzaC5vdmVyU29tZSA9IHV0aWwub3ZlclNvbWU7XG5sb2Rhc2gucGFydGlhbCA9IGZ1bmMucGFydGlhbDtcbmxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBmdW5jLnBhcnRpYWxSaWdodDtcbmxvZGFzaC5wYXJ0aXRpb24gPSBjb2xsZWN0aW9uLnBhcnRpdGlvbjtcbmxvZGFzaC5waWNrID0gb2JqZWN0LnBpY2s7XG5sb2Rhc2gucGlja0J5ID0gb2JqZWN0LnBpY2tCeTtcbmxvZGFzaC5wcm9wZXJ0eSA9IHV0aWwucHJvcGVydHk7XG5sb2Rhc2gucHJvcGVydHlPZiA9IHV0aWwucHJvcGVydHlPZjtcbmxvZGFzaC5wdWxsID0gYXJyYXkucHVsbDtcbmxvZGFzaC5wdWxsQWxsID0gYXJyYXkucHVsbEFsbDtcbmxvZGFzaC5wdWxsQWxsQnkgPSBhcnJheS5wdWxsQWxsQnk7XG5sb2Rhc2gucHVsbEFsbFdpdGggPSBhcnJheS5wdWxsQWxsV2l0aDtcbmxvZGFzaC5wdWxsQXQgPSBhcnJheS5wdWxsQXQ7XG5sb2Rhc2gucmFuZ2UgPSB1dGlsLnJhbmdlO1xubG9kYXNoLnJhbmdlUmlnaHQgPSB1dGlsLnJhbmdlUmlnaHQ7XG5sb2Rhc2gucmVhcmcgPSBmdW5jLnJlYXJnO1xubG9kYXNoLnJlamVjdCA9IGNvbGxlY3Rpb24ucmVqZWN0O1xubG9kYXNoLnJlbW92ZSA9IGFycmF5LnJlbW92ZTtcbmxvZGFzaC5yZXN0ID0gZnVuYy5yZXN0O1xubG9kYXNoLnJldmVyc2UgPSBhcnJheS5yZXZlcnNlO1xubG9kYXNoLnNhbXBsZVNpemUgPSBjb2xsZWN0aW9uLnNhbXBsZVNpemU7XG5sb2Rhc2guc2V0ID0gb2JqZWN0LnNldDtcbmxvZGFzaC5zZXRXaXRoID0gb2JqZWN0LnNldFdpdGg7XG5sb2Rhc2guc2h1ZmZsZSA9IGNvbGxlY3Rpb24uc2h1ZmZsZTtcbmxvZGFzaC5zbGljZSA9IGFycmF5LnNsaWNlO1xubG9kYXNoLnNvcnRCeSA9IGNvbGxlY3Rpb24uc29ydEJ5O1xubG9kYXNoLnNvcnRlZFVuaXEgPSBhcnJheS5zb3J0ZWRVbmlxO1xubG9kYXNoLnNvcnRlZFVuaXFCeSA9IGFycmF5LnNvcnRlZFVuaXFCeTtcbmxvZGFzaC5zcGxpdCA9IHN0cmluZy5zcGxpdDtcbmxvZGFzaC5zcHJlYWQgPSBmdW5jLnNwcmVhZDtcbmxvZGFzaC50YWlsID0gYXJyYXkudGFpbDtcbmxvZGFzaC50YWtlID0gYXJyYXkudGFrZTtcbmxvZGFzaC50YWtlUmlnaHQgPSBhcnJheS50YWtlUmlnaHQ7XG5sb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSBhcnJheS50YWtlUmlnaHRXaGlsZTtcbmxvZGFzaC50YWtlV2hpbGUgPSBhcnJheS50YWtlV2hpbGU7XG5sb2Rhc2gudGFwID0gc2VxLnRhcDtcbmxvZGFzaC50aHJvdHRsZSA9IGZ1bmMudGhyb3R0bGU7XG5sb2Rhc2gudGhydSA9IHRocnU7XG5sb2Rhc2gudG9BcnJheSA9IGxhbmcudG9BcnJheTtcbmxvZGFzaC50b1BhaXJzID0gb2JqZWN0LnRvUGFpcnM7XG5sb2Rhc2gudG9QYWlyc0luID0gb2JqZWN0LnRvUGFpcnNJbjtcbmxvZGFzaC50b1BhdGggPSB1dGlsLnRvUGF0aDtcbmxvZGFzaC50b1BsYWluT2JqZWN0ID0gbGFuZy50b1BsYWluT2JqZWN0O1xubG9kYXNoLnRyYW5zZm9ybSA9IG9iamVjdC50cmFuc2Zvcm07XG5sb2Rhc2gudW5hcnkgPSBmdW5jLnVuYXJ5O1xubG9kYXNoLnVuaW9uID0gYXJyYXkudW5pb247XG5sb2Rhc2gudW5pb25CeSA9IGFycmF5LnVuaW9uQnk7XG5sb2Rhc2gudW5pb25XaXRoID0gYXJyYXkudW5pb25XaXRoO1xubG9kYXNoLnVuaXEgPSBhcnJheS51bmlxO1xubG9kYXNoLnVuaXFCeSA9IGFycmF5LnVuaXFCeTtcbmxvZGFzaC51bmlxV2l0aCA9IGFycmF5LnVuaXFXaXRoO1xubG9kYXNoLnVuc2V0ID0gb2JqZWN0LnVuc2V0O1xubG9kYXNoLnVuemlwID0gYXJyYXkudW56aXA7XG5sb2Rhc2gudW56aXBXaXRoID0gYXJyYXkudW56aXBXaXRoO1xubG9kYXNoLnVwZGF0ZSA9IG9iamVjdC51cGRhdGU7XG5sb2Rhc2gudXBkYXRlV2l0aCA9IG9iamVjdC51cGRhdGVXaXRoO1xubG9kYXNoLnZhbHVlcyA9IG9iamVjdC52YWx1ZXM7XG5sb2Rhc2gudmFsdWVzSW4gPSBvYmplY3QudmFsdWVzSW47XG5sb2Rhc2gud2l0aG91dCA9IGFycmF5LndpdGhvdXQ7XG5sb2Rhc2gud29yZHMgPSBzdHJpbmcud29yZHM7XG5sb2Rhc2gud3JhcCA9IGZ1bmMud3JhcDtcbmxvZGFzaC54b3IgPSBhcnJheS54b3I7XG5sb2Rhc2gueG9yQnkgPSBhcnJheS54b3JCeTtcbmxvZGFzaC54b3JXaXRoID0gYXJyYXkueG9yV2l0aDtcbmxvZGFzaC56aXAgPSBhcnJheS56aXA7XG5sb2Rhc2guemlwT2JqZWN0ID0gYXJyYXkuemlwT2JqZWN0O1xubG9kYXNoLnppcE9iamVjdERlZXAgPSBhcnJheS56aXBPYmplY3REZWVwO1xubG9kYXNoLnppcFdpdGggPSBhcnJheS56aXBXaXRoO1xuXG4vLyBBZGQgYWxpYXNlcy5cbmxvZGFzaC5lbnRyaWVzID0gb2JqZWN0LnRvUGFpcnM7XG5sb2Rhc2guZW50cmllc0luID0gb2JqZWN0LnRvUGFpcnNJbjtcbmxvZGFzaC5leHRlbmQgPSBvYmplY3QuYXNzaWduSW47XG5sb2Rhc2guZXh0ZW5kV2l0aCA9IG9iamVjdC5hc3NpZ25JbldpdGg7XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbm1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG5sb2Rhc2guYWRkID0gbWF0aC5hZGQ7XG5sb2Rhc2guYXR0ZW1wdCA9IHV0aWwuYXR0ZW1wdDtcbmxvZGFzaC5jYW1lbENhc2UgPSBzdHJpbmcuY2FtZWxDYXNlO1xubG9kYXNoLmNhcGl0YWxpemUgPSBzdHJpbmcuY2FwaXRhbGl6ZTtcbmxvZGFzaC5jZWlsID0gbWF0aC5jZWlsO1xubG9kYXNoLmNsYW1wID0gbnVtYmVyLmNsYW1wO1xubG9kYXNoLmNsb25lID0gbGFuZy5jbG9uZTtcbmxvZGFzaC5jbG9uZURlZXAgPSBsYW5nLmNsb25lRGVlcDtcbmxvZGFzaC5jbG9uZURlZXBXaXRoID0gbGFuZy5jbG9uZURlZXBXaXRoO1xubG9kYXNoLmNsb25lV2l0aCA9IGxhbmcuY2xvbmVXaXRoO1xubG9kYXNoLmNvbmZvcm1zVG8gPSBsYW5nLmNvbmZvcm1zVG87XG5sb2Rhc2guZGVidXJyID0gc3RyaW5nLmRlYnVycjtcbmxvZGFzaC5kZWZhdWx0VG8gPSB1dGlsLmRlZmF1bHRUbztcbmxvZGFzaC5kaXZpZGUgPSBtYXRoLmRpdmlkZTtcbmxvZGFzaC5lbmRzV2l0aCA9IHN0cmluZy5lbmRzV2l0aDtcbmxvZGFzaC5lcSA9IGxhbmcuZXE7XG5sb2Rhc2guZXNjYXBlID0gc3RyaW5nLmVzY2FwZTtcbmxvZGFzaC5lc2NhcGVSZWdFeHAgPSBzdHJpbmcuZXNjYXBlUmVnRXhwO1xubG9kYXNoLmV2ZXJ5ID0gY29sbGVjdGlvbi5ldmVyeTtcbmxvZGFzaC5maW5kID0gY29sbGVjdGlvbi5maW5kO1xubG9kYXNoLmZpbmRJbmRleCA9IGFycmF5LmZpbmRJbmRleDtcbmxvZGFzaC5maW5kS2V5ID0gb2JqZWN0LmZpbmRLZXk7XG5sb2Rhc2guZmluZExhc3QgPSBjb2xsZWN0aW9uLmZpbmRMYXN0O1xubG9kYXNoLmZpbmRMYXN0SW5kZXggPSBhcnJheS5maW5kTGFzdEluZGV4O1xubG9kYXNoLmZpbmRMYXN0S2V5ID0gb2JqZWN0LmZpbmRMYXN0S2V5O1xubG9kYXNoLmZsb29yID0gbWF0aC5mbG9vcjtcbmxvZGFzaC5mb3JFYWNoID0gY29sbGVjdGlvbi5mb3JFYWNoO1xubG9kYXNoLmZvckVhY2hSaWdodCA9IGNvbGxlY3Rpb24uZm9yRWFjaFJpZ2h0O1xubG9kYXNoLmZvckluID0gb2JqZWN0LmZvckluO1xubG9kYXNoLmZvckluUmlnaHQgPSBvYmplY3QuZm9ySW5SaWdodDtcbmxvZGFzaC5mb3JPd24gPSBvYmplY3QuZm9yT3duO1xubG9kYXNoLmZvck93blJpZ2h0ID0gb2JqZWN0LmZvck93blJpZ2h0O1xubG9kYXNoLmdldCA9IG9iamVjdC5nZXQ7XG5sb2Rhc2guZ3QgPSBsYW5nLmd0O1xubG9kYXNoLmd0ZSA9IGxhbmcuZ3RlO1xubG9kYXNoLmhhcyA9IG9iamVjdC5oYXM7XG5sb2Rhc2guaGFzSW4gPSBvYmplY3QuaGFzSW47XG5sb2Rhc2guaGVhZCA9IGFycmF5LmhlYWQ7XG5sb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbmxvZGFzaC5pbmNsdWRlcyA9IGNvbGxlY3Rpb24uaW5jbHVkZXM7XG5sb2Rhc2guaW5kZXhPZiA9IGFycmF5LmluZGV4T2Y7XG5sb2Rhc2guaW5SYW5nZSA9IG51bWJlci5pblJhbmdlO1xubG9kYXNoLmludm9rZSA9IG9iamVjdC5pbnZva2U7XG5sb2Rhc2guaXNBcmd1bWVudHMgPSBsYW5nLmlzQXJndW1lbnRzO1xubG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xubG9kYXNoLmlzQXJyYXlCdWZmZXIgPSBsYW5nLmlzQXJyYXlCdWZmZXI7XG5sb2Rhc2guaXNBcnJheUxpa2UgPSBsYW5nLmlzQXJyYXlMaWtlO1xubG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gbGFuZy5pc0FycmF5TGlrZU9iamVjdDtcbmxvZGFzaC5pc0Jvb2xlYW4gPSBsYW5nLmlzQm9vbGVhbjtcbmxvZGFzaC5pc0J1ZmZlciA9IGxhbmcuaXNCdWZmZXI7XG5sb2Rhc2guaXNEYXRlID0gbGFuZy5pc0RhdGU7XG5sb2Rhc2guaXNFbGVtZW50ID0gbGFuZy5pc0VsZW1lbnQ7XG5sb2Rhc2guaXNFbXB0eSA9IGxhbmcuaXNFbXB0eTtcbmxvZGFzaC5pc0VxdWFsID0gbGFuZy5pc0VxdWFsO1xubG9kYXNoLmlzRXF1YWxXaXRoID0gbGFuZy5pc0VxdWFsV2l0aDtcbmxvZGFzaC5pc0Vycm9yID0gbGFuZy5pc0Vycm9yO1xubG9kYXNoLmlzRmluaXRlID0gbGFuZy5pc0Zpbml0ZTtcbmxvZGFzaC5pc0Z1bmN0aW9uID0gbGFuZy5pc0Z1bmN0aW9uO1xubG9kYXNoLmlzSW50ZWdlciA9IGxhbmcuaXNJbnRlZ2VyO1xubG9kYXNoLmlzTGVuZ3RoID0gbGFuZy5pc0xlbmd0aDtcbmxvZGFzaC5pc01hcCA9IGxhbmcuaXNNYXA7XG5sb2Rhc2guaXNNYXRjaCA9IGxhbmcuaXNNYXRjaDtcbmxvZGFzaC5pc01hdGNoV2l0aCA9IGxhbmcuaXNNYXRjaFdpdGg7XG5sb2Rhc2guaXNOYU4gPSBsYW5nLmlzTmFOO1xubG9kYXNoLmlzTmF0aXZlID0gbGFuZy5pc05hdGl2ZTtcbmxvZGFzaC5pc05pbCA9IGxhbmcuaXNOaWw7XG5sb2Rhc2guaXNOdWxsID0gbGFuZy5pc051bGw7XG5sb2Rhc2guaXNOdW1iZXIgPSBsYW5nLmlzTnVtYmVyO1xubG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5sb2Rhc2guaXNPYmplY3RMaWtlID0gbGFuZy5pc09iamVjdExpa2U7XG5sb2Rhc2guaXNQbGFpbk9iamVjdCA9IGxhbmcuaXNQbGFpbk9iamVjdDtcbmxvZGFzaC5pc1JlZ0V4cCA9IGxhbmcuaXNSZWdFeHA7XG5sb2Rhc2guaXNTYWZlSW50ZWdlciA9IGxhbmcuaXNTYWZlSW50ZWdlcjtcbmxvZGFzaC5pc1NldCA9IGxhbmcuaXNTZXQ7XG5sb2Rhc2guaXNTdHJpbmcgPSBsYW5nLmlzU3RyaW5nO1xubG9kYXNoLmlzU3ltYm9sID0gbGFuZy5pc1N5bWJvbDtcbmxvZGFzaC5pc1R5cGVkQXJyYXkgPSBsYW5nLmlzVHlwZWRBcnJheTtcbmxvZGFzaC5pc1VuZGVmaW5lZCA9IGxhbmcuaXNVbmRlZmluZWQ7XG5sb2Rhc2guaXNXZWFrTWFwID0gbGFuZy5pc1dlYWtNYXA7XG5sb2Rhc2guaXNXZWFrU2V0ID0gbGFuZy5pc1dlYWtTZXQ7XG5sb2Rhc2guam9pbiA9IGFycmF5LmpvaW47XG5sb2Rhc2gua2ViYWJDYXNlID0gc3RyaW5nLmtlYmFiQ2FzZTtcbmxvZGFzaC5sYXN0ID0gbGFzdDtcbmxvZGFzaC5sYXN0SW5kZXhPZiA9IGFycmF5Lmxhc3RJbmRleE9mO1xubG9kYXNoLmxvd2VyQ2FzZSA9IHN0cmluZy5sb3dlckNhc2U7XG5sb2Rhc2gubG93ZXJGaXJzdCA9IHN0cmluZy5sb3dlckZpcnN0O1xubG9kYXNoLmx0ID0gbGFuZy5sdDtcbmxvZGFzaC5sdGUgPSBsYW5nLmx0ZTtcbmxvZGFzaC5tYXggPSBtYXRoLm1heDtcbmxvZGFzaC5tYXhCeSA9IG1hdGgubWF4Qnk7XG5sb2Rhc2gubWVhbiA9IG1hdGgubWVhbjtcbmxvZGFzaC5tZWFuQnkgPSBtYXRoLm1lYW5CeTtcbmxvZGFzaC5taW4gPSBtYXRoLm1pbjtcbmxvZGFzaC5taW5CeSA9IG1hdGgubWluQnk7XG5sb2Rhc2guc3R1YkFycmF5ID0gdXRpbC5zdHViQXJyYXk7XG5sb2Rhc2guc3R1YkZhbHNlID0gdXRpbC5zdHViRmFsc2U7XG5sb2Rhc2guc3R1Yk9iamVjdCA9IHV0aWwuc3R1Yk9iamVjdDtcbmxvZGFzaC5zdHViU3RyaW5nID0gdXRpbC5zdHViU3RyaW5nO1xubG9kYXNoLnN0dWJUcnVlID0gdXRpbC5zdHViVHJ1ZTtcbmxvZGFzaC5tdWx0aXBseSA9IG1hdGgubXVsdGlwbHk7XG5sb2Rhc2gubnRoID0gYXJyYXkubnRoO1xubG9kYXNoLm5vb3AgPSB1dGlsLm5vb3A7XG5sb2Rhc2gubm93ID0gZGF0ZS5ub3c7XG5sb2Rhc2gucGFkID0gc3RyaW5nLnBhZDtcbmxvZGFzaC5wYWRFbmQgPSBzdHJpbmcucGFkRW5kO1xubG9kYXNoLnBhZFN0YXJ0ID0gc3RyaW5nLnBhZFN0YXJ0O1xubG9kYXNoLnBhcnNlSW50ID0gc3RyaW5nLnBhcnNlSW50O1xubG9kYXNoLnJhbmRvbSA9IG51bWJlci5yYW5kb207XG5sb2Rhc2gucmVkdWNlID0gY29sbGVjdGlvbi5yZWR1Y2U7XG5sb2Rhc2gucmVkdWNlUmlnaHQgPSBjb2xsZWN0aW9uLnJlZHVjZVJpZ2h0O1xubG9kYXNoLnJlcGVhdCA9IHN0cmluZy5yZXBlYXQ7XG5sb2Rhc2gucmVwbGFjZSA9IHN0cmluZy5yZXBsYWNlO1xubG9kYXNoLnJlc3VsdCA9IG9iamVjdC5yZXN1bHQ7XG5sb2Rhc2gucm91bmQgPSBtYXRoLnJvdW5kO1xubG9kYXNoLnNhbXBsZSA9IGNvbGxlY3Rpb24uc2FtcGxlO1xubG9kYXNoLnNpemUgPSBjb2xsZWN0aW9uLnNpemU7XG5sb2Rhc2guc25ha2VDYXNlID0gc3RyaW5nLnNuYWtlQ2FzZTtcbmxvZGFzaC5zb21lID0gY29sbGVjdGlvbi5zb21lO1xubG9kYXNoLnNvcnRlZEluZGV4ID0gYXJyYXkuc29ydGVkSW5kZXg7XG5sb2Rhc2guc29ydGVkSW5kZXhCeSA9IGFycmF5LnNvcnRlZEluZGV4Qnk7XG5sb2Rhc2guc29ydGVkSW5kZXhPZiA9IGFycmF5LnNvcnRlZEluZGV4T2Y7XG5sb2Rhc2guc29ydGVkTGFzdEluZGV4ID0gYXJyYXkuc29ydGVkTGFzdEluZGV4O1xubG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gYXJyYXkuc29ydGVkTGFzdEluZGV4Qnk7XG5sb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBhcnJheS5zb3J0ZWRMYXN0SW5kZXhPZjtcbmxvZGFzaC5zdGFydENhc2UgPSBzdHJpbmcuc3RhcnRDYXNlO1xubG9kYXNoLnN0YXJ0c1dpdGggPSBzdHJpbmcuc3RhcnRzV2l0aDtcbmxvZGFzaC5zdWJ0cmFjdCA9IG1hdGguc3VidHJhY3Q7XG5sb2Rhc2guc3VtID0gbWF0aC5zdW07XG5sb2Rhc2guc3VtQnkgPSBtYXRoLnN1bUJ5O1xubG9kYXNoLnRlbXBsYXRlID0gc3RyaW5nLnRlbXBsYXRlO1xubG9kYXNoLnRpbWVzID0gdXRpbC50aW1lcztcbmxvZGFzaC50b0Zpbml0ZSA9IGxhbmcudG9GaW5pdGU7XG5sb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xubG9kYXNoLnRvTGVuZ3RoID0gbGFuZy50b0xlbmd0aDtcbmxvZGFzaC50b0xvd2VyID0gc3RyaW5nLnRvTG93ZXI7XG5sb2Rhc2gudG9OdW1iZXIgPSBsYW5nLnRvTnVtYmVyO1xubG9kYXNoLnRvU2FmZUludGVnZXIgPSBsYW5nLnRvU2FmZUludGVnZXI7XG5sb2Rhc2gudG9TdHJpbmcgPSBsYW5nLnRvU3RyaW5nO1xubG9kYXNoLnRvVXBwZXIgPSBzdHJpbmcudG9VcHBlcjtcbmxvZGFzaC50cmltID0gc3RyaW5nLnRyaW07XG5sb2Rhc2gudHJpbUVuZCA9IHN0cmluZy50cmltRW5kO1xubG9kYXNoLnRyaW1TdGFydCA9IHN0cmluZy50cmltU3RhcnQ7XG5sb2Rhc2gudHJ1bmNhdGUgPSBzdHJpbmcudHJ1bmNhdGU7XG5sb2Rhc2gudW5lc2NhcGUgPSBzdHJpbmcudW5lc2NhcGU7XG5sb2Rhc2gudW5pcXVlSWQgPSB1dGlsLnVuaXF1ZUlkO1xubG9kYXNoLnVwcGVyQ2FzZSA9IHN0cmluZy51cHBlckNhc2U7XG5sb2Rhc2gudXBwZXJGaXJzdCA9IHN0cmluZy51cHBlckZpcnN0O1xuXG4vLyBBZGQgYWxpYXNlcy5cbmxvZGFzaC5lYWNoID0gY29sbGVjdGlvbi5mb3JFYWNoO1xubG9kYXNoLmVhY2hSaWdodCA9IGNvbGxlY3Rpb24uZm9yRWFjaFJpZ2h0O1xubG9kYXNoLmZpcnN0ID0gYXJyYXkuaGVhZDtcblxubWl4aW4obG9kYXNoLCAoZnVuY3Rpb24oKSB7XG4gIHZhciBzb3VyY2UgPSB7fTtcbiAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLnByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNvdXJjZTtcbn0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5sb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG4obG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSBzdHJpbmcudGVtcGxhdGVTZXR0aW5ncykuaW1wb3J0cy5fID0gbG9kYXNoO1xuXG4vLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG5hcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gIGxvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlciA9IGxvZGFzaDtcbn0pO1xuXG4vLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG5hcnJheUVhY2goWydkcm9wJywgJ3Rha2UnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICB2YXIgcmVzdWx0ID0gKHRoaXMuX19maWx0ZXJlZF9fICYmICFpbmRleClcbiAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fKSB7XG4gICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7XG4gICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICB9O1xufSk7XG5cbi8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbmFycmF5RWFjaChbJ2ZpbHRlcicsICdtYXAnLCAndGFrZVdoaWxlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgJ2l0ZXJhdGVlJzogYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICd0eXBlJzogdHlwZVxuICAgIH0pO1xuICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KTtcblxuLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaGVhZGAgYW5kIGBfLmxhc3RgLlxuYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gIH07XG59KTtcblxuLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gIHZhciBkcm9wTmFtZSA9ICdkcm9wJyArIChpbmRleCA/ICcnIDogJ1JpZ2h0Jyk7XG5cbiAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gIH07XG59KTtcblxuTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KTtcbn07XG5cbkxhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gIHJldHVybiB0aGlzLmZpbHRlcihwcmVkaWNhdGUpLmhlYWQoKTtcbn07XG5cbkxhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpO1xufTtcblxuTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgfSk7XG59KTtcblxuTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGJhc2VJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG59O1xuXG5MYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18gJiYgKHN0YXJ0ID4gMCB8fCBlbmQgPCAwKSkge1xuICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgfVxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmRyb3Aoc3RhcnQpO1xuICB9XG4gIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRvSW50ZWdlcihlbmQpO1xuICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5MYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTtcbn07XG5cbkxhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCk7XG59O1xuXG4vLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbmJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbaXNUYWtlciA/ICgndGFrZScgKyAobWV0aG9kTmFtZSA9PSAnbGFzdCcgPyAnUmlnaHQnIDogJycpKSA6IG1ldGhvZE5hbWVdLFxuICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLFxuICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2hGdW5jLmFwcGx5KGxvZGFzaCwgYXJyYXlQdXNoKFt2YWx1ZV0sIGFyZ3MpKTtcbiAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGlmICh1c2VMYXp5ICYmIGNoZWNrSXRlcmF0ZWUgJiYgdHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgJiYgaXRlcmF0ZWUubGVuZ3RoICE9IDEpIHtcbiAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgIH1cbiAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICBpc1Vud3JhcHBlZCA9IHJldFVud3JhcHBlZCAmJiAhY2hhaW5BbGwsXG4gICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgIHZhbHVlID0gb25seUxhenkgPyB2YWx1ZSA6IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpO1xuICAgIH1cbiAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgIHJldHVybiBpc1Vud3JhcHBlZCA/IChpc1Rha2VyID8gcmVzdWx0LnZhbHVlKClbMF0gOiByZXN1bHQudmFsdWUoKSkgOiByZXN1bHQ7XG4gIH07XG59KTtcblxuLy8gQWRkIGBBcnJheWAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG5hcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgY2hhaW5OYW1lID0gL14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpID8gJ3RhcCcgOiAndGhydScsXG4gICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdLCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcbn0pO1xuXG4vLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG5iYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTtcbiAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywga2V5KSkge1xuICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICB9XG4gICAgcmVhbE5hbWVzW2tleV0ucHVzaCh7ICduYW1lJzogbWV0aG9kTmFtZSwgJ2Z1bmMnOiBsb2Rhc2hGdW5jIH0pO1xuICB9XG59KTtcblxucmVhbE5hbWVzW2NyZWF0ZUh5YnJpZCh1bmRlZmluZWQsIFdSQVBfQklORF9LRVlfRkxBRykubmFtZV0gPSBbe1xuICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgJ2Z1bmMnOiB1bmRlZmluZWRcbn1dO1xuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2UgPSBsYXp5UmV2ZXJzZTtcbkxhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG5sb2Rhc2gucHJvdG90eXBlLmF0ID0gc2VxLmF0O1xubG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHNlcS53cmFwcGVyQ2hhaW47XG5sb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHNlcS5jb21taXQ7XG5sb2Rhc2gucHJvdG90eXBlLm5leHQgPSBzZXEubmV4dDtcbmxvZGFzaC5wcm90b3R5cGUucGxhbnQgPSBzZXEucGxhbnQ7XG5sb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSBzZXEucmV2ZXJzZTtcbmxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHNlcS52YWx1ZTtcblxuLy8gQWRkIGxhenkgYWxpYXNlcy5cbmxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbmlmIChzeW1JdGVyYXRvcikge1xuICBsb2Rhc2gucHJvdG90eXBlW3N5bUl0ZXJhdG9yXSA9IHNlcS50b0l0ZXJhdG9yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsb2Rhc2g7XG4iLCIvLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggJ25hbWUnIGluIEZ1bmN0aW9uLnByb3RvdHlwZSA9PT0gZmFsc2UgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHRPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdH1cblxuXHRcdHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuXG5cdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0dmFyIHNvdXJjZSA9IGFyZ3VtZW50c1sgaW5kZXggXTtcblxuXHRcdFx0aWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwgbmV4dEtleSApICkge1xuXG5cdFx0XHRcdFx0XHRvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9O1xuXG59XG5cbnZhciBSRVZJU0lPTiA9ICcxMTUnO1xudmFyIE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyLCBST1RBVEU6IDAsIERPTExZOiAxLCBQQU46IDIgfTtcbnZhciBUT1VDSCA9IHsgUk9UQVRFOiAwLCBQQU46IDEsIERPTExZX1BBTjogMiwgRE9MTFlfUk9UQVRFOiAzIH07XG52YXIgQ3VsbEZhY2VOb25lID0gMDtcbnZhciBDdWxsRmFjZUJhY2sgPSAxO1xudmFyIEN1bGxGYWNlRnJvbnQgPSAyO1xudmFyIEN1bGxGYWNlRnJvbnRCYWNrID0gMztcbnZhciBGcm9udEZhY2VEaXJlY3Rpb25DVyA9IDA7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXID0gMTtcbnZhciBCYXNpY1NoYWRvd01hcCA9IDA7XG52YXIgUENGU2hhZG93TWFwID0gMTtcbnZhciBQQ0ZTb2Z0U2hhZG93TWFwID0gMjtcbnZhciBWU01TaGFkb3dNYXAgPSAzO1xudmFyIEZyb250U2lkZSA9IDA7XG52YXIgQmFja1NpZGUgPSAxO1xudmFyIERvdWJsZVNpZGUgPSAyO1xudmFyIEZsYXRTaGFkaW5nID0gMTtcbnZhciBTbW9vdGhTaGFkaW5nID0gMjtcbnZhciBOb0JsZW5kaW5nID0gMDtcbnZhciBOb3JtYWxCbGVuZGluZyA9IDE7XG52YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7XG52YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG52YXIgTXVsdGlwbHlCbGVuZGluZyA9IDQ7XG52YXIgQ3VzdG9tQmxlbmRpbmcgPSA1O1xudmFyIEFkZEVxdWF0aW9uID0gMTAwO1xudmFyIFN1YnRyYWN0RXF1YXRpb24gPSAxMDE7XG52YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7XG52YXIgTWluRXF1YXRpb24gPSAxMDM7XG52YXIgTWF4RXF1YXRpb24gPSAxMDQ7XG52YXIgWmVyb0ZhY3RvciA9IDIwMDtcbnZhciBPbmVGYWN0b3IgPSAyMDE7XG52YXIgU3JjQ29sb3JGYWN0b3IgPSAyMDI7XG52YXIgT25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMztcbnZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbnZhciBPbmVNaW51c1NyY0FscGhhRmFjdG9yID0gMjA1O1xudmFyIERzdEFscGhhRmFjdG9yID0gMjA2O1xudmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG52YXIgRHN0Q29sb3JGYWN0b3IgPSAyMDg7XG52YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTtcbnZhciBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xudmFyIE5ldmVyRGVwdGggPSAwO1xudmFyIEFsd2F5c0RlcHRoID0gMTtcbnZhciBMZXNzRGVwdGggPSAyO1xudmFyIExlc3NFcXVhbERlcHRoID0gMztcbnZhciBFcXVhbERlcHRoID0gNDtcbnZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG52YXIgR3JlYXRlckRlcHRoID0gNjtcbnZhciBOb3RFcXVhbERlcHRoID0gNztcbnZhciBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG52YXIgTWl4T3BlcmF0aW9uID0gMTtcbnZhciBBZGRPcGVyYXRpb24gPSAyO1xudmFyIE5vVG9uZU1hcHBpbmcgPSAwO1xudmFyIExpbmVhclRvbmVNYXBwaW5nID0gMTtcbnZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjtcbnZhciBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcgPSAzO1xudmFyIENpbmVvblRvbmVNYXBwaW5nID0gNDtcbnZhciBBQ0VTRmlsbWljVG9uZU1hcHBpbmcgPSA1O1xuXG52YXIgVVZNYXBwaW5nID0gMzAwO1xudmFyIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTtcbnZhciBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDM7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDQ7XG52YXIgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDU7XG52YXIgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XG52YXIgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDc7XG52YXIgUmVwZWF0V3JhcHBpbmcgPSAxMDAwO1xudmFyIENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xudmFyIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSAxMDAyO1xudmFyIE5lYXJlc3RGaWx0ZXIgPSAxMDAzO1xudmFyIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIExpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IDEwMDg7XG52YXIgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG52YXIgQnl0ZVR5cGUgPSAxMDEwO1xudmFyIFNob3J0VHlwZSA9IDEwMTE7XG52YXIgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xudmFyIEludFR5cGUgPSAxMDEzO1xudmFyIFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7XG52YXIgRmxvYXRUeXBlID0gMTAxNTtcbnZhciBIYWxmRmxvYXRUeXBlID0gMTAxNjtcbnZhciBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSAxMDE3O1xudmFyIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG52YXIgVW5zaWduZWRTaG9ydDU2NVR5cGUgPSAxMDE5O1xudmFyIFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjA7XG52YXIgQWxwaGFGb3JtYXQgPSAxMDIxO1xudmFyIFJHQkZvcm1hdCA9IDEwMjI7XG52YXIgUkdCQUZvcm1hdCA9IDEwMjM7XG52YXIgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbnZhciBMdW1pbmFuY2VBbHBoYUZvcm1hdCA9IDEwMjU7XG52YXIgUkdCRUZvcm1hdCA9IFJHQkFGb3JtYXQ7XG52YXIgRGVwdGhGb3JtYXQgPSAxMDI2O1xudmFyIERlcHRoU3RlbmNpbEZvcm1hdCA9IDEwMjc7XG52YXIgUmVkRm9ybWF0ID0gMTAyODtcbnZhciBSZWRJbnRlZ2VyRm9ybWF0ID0gMTAyOTtcbnZhciBSR0Zvcm1hdCA9IDEwMzA7XG52YXIgUkdJbnRlZ2VyRm9ybWF0ID0gMTAzMTtcbnZhciBSR0JJbnRlZ2VyRm9ybWF0ID0gMTAzMjtcbnZhciBSR0JBSW50ZWdlckZvcm1hdCA9IDEwMzM7XG5cbnZhciBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc2O1xudmFyIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3O1xudmFyIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCA9IDMzNzc4O1xudmFyIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDMzNzc5O1xudmFyIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDA7XG52YXIgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MTtcbnZhciBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MjtcbnZhciBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MztcbnZhciBSR0JfRVRDMV9Gb3JtYXQgPSAzNjE5NjtcbnZhciBSR0JfRVRDMl9Gb3JtYXQgPSAzNzQ5MjtcbnZhciBSR0JBX0VUQzJfRUFDX0Zvcm1hdCA9IDM3NDk2O1xudmFyIFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XG52YXIgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcbnZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xudmFyIFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XG52YXIgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcbnZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xudmFyIFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XG52YXIgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcbnZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbnZhciBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcbnZhciBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcbnZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG52YXIgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xudmFyIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcbnZhciBSR0JBX0JQVENfRm9ybWF0ID0gMzY0OTI7XG52YXIgU1JHQjhfQUxQSEE4X0FTVENfNHg0X0Zvcm1hdCA9IDM3ODQwO1xudmFyIFNSR0I4X0FMUEhBOF9BU1RDXzV4NF9Gb3JtYXQgPSAzNzg0MTtcbnZhciBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0ID0gMzc4NDI7XG52YXIgU1JHQjhfQUxQSEE4X0FTVENfNng1X0Zvcm1hdCA9IDM3ODQzO1xudmFyIFNSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzg0NDtcbnZhciBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0ID0gMzc4NDU7XG52YXIgU1JHQjhfQUxQSEE4X0FTVENfOHg2X0Zvcm1hdCA9IDM3ODQ2O1xudmFyIFNSR0I4X0FMUEhBOF9BU1RDXzh4OF9Gb3JtYXQgPSAzNzg0NztcbnZhciBTUkdCOF9BTFBIQThfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODQ4O1xudmFyIFNSR0I4X0FMUEhBOF9BU1RDXzEweDZfRm9ybWF0ID0gMzc4NDk7XG52YXIgU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9Gb3JtYXQgPSAzNzg1MDtcbnZhciBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzg1MTtcbnZhciBTUkdCOF9BTFBIQThfQVNUQ18xMngxMF9Gb3JtYXQgPSAzNzg1MjtcbnZhciBTUkdCOF9BTFBIQThfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzg1MztcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xudmFyIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCA9IDA7XG52YXIgT2JqZWN0U3BhY2VOb3JtYWxNYXAgPSAxO1xuXG52YXIgWmVyb1N0ZW5jaWxPcCA9IDA7XG52YXIgS2VlcFN0ZW5jaWxPcCA9IDc2ODA7XG52YXIgUmVwbGFjZVN0ZW5jaWxPcCA9IDc2ODE7XG52YXIgSW5jcmVtZW50U3RlbmNpbE9wID0gNzY4MjtcbnZhciBEZWNyZW1lbnRTdGVuY2lsT3AgPSA3NjgzO1xudmFyIEluY3JlbWVudFdyYXBTdGVuY2lsT3AgPSAzNDA1NTtcbnZhciBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wID0gMzQwNTY7XG52YXIgSW52ZXJ0U3RlbmNpbE9wID0gNTM4NjtcblxudmFyIE5ldmVyU3RlbmNpbEZ1bmMgPSA1MTI7XG52YXIgTGVzc1N0ZW5jaWxGdW5jID0gNTEzO1xudmFyIEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTQ7XG52YXIgTGVzc0VxdWFsU3RlbmNpbEZ1bmMgPSA1MTU7XG52YXIgR3JlYXRlclN0ZW5jaWxGdW5jID0gNTE2O1xudmFyIE5vdEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTc7XG52YXIgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMgPSA1MTg7XG52YXIgQWx3YXlzU3RlbmNpbEZ1bmMgPSA1MTk7XG5cbnZhciBTdGF0aWNEcmF3VXNhZ2UgPSAzNTA0NDtcbnZhciBEeW5hbWljRHJhd1VzYWdlID0gMzUwNDg7XG52YXIgU3RyZWFtRHJhd1VzYWdlID0gMzUwNDA7XG52YXIgU3RhdGljUmVhZFVzYWdlID0gMzUwNDU7XG52YXIgRHluYW1pY1JlYWRVc2FnZSA9IDM1MDQ5O1xudmFyIFN0cmVhbVJlYWRVc2FnZSA9IDM1MDQxO1xudmFyIFN0YXRpY0NvcHlVc2FnZSA9IDM1MDQ2O1xudmFyIER5bmFtaWNDb3B5VXNhZ2UgPSAzNTA1MDtcbnZhciBTdHJlYW1Db3B5VXNhZ2UgPSAzNTA0MjtcblxuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy9cbiAqL1xuXG5mdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fVxuXG5PYmplY3QuYXNzaWduKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdID0gW107XG5cblx0XHR9XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGhhc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRldmVudC50YXJnZXQgPSB0aGlzO1xuXG5cdFx0XHQvLyBNYWtlIGEgY29weSwgaW4gY2FzZSBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgd2hpbGUgaXRlcmF0aW5nLlxuXHRcdFx0dmFyIGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHRoZXp3YXBcbiAqL1xuXG52YXIgX2x1dCA9IFtdO1xuXG5mb3IgKCB2YXIgaSA9IDA7IGkgPCAyNTY7IGkgKysgKSB7XG5cblx0X2x1dFsgaSBdID0gKCBpIDwgMTYgPyAnMCcgOiAnJyApICsgKCBpICkudG9TdHJpbmcoIDE2ICk7XG5cbn1cblxudmFyIE1hdGhVdGlscyA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0LzIxOTYzMTM2IzIxOTYzMTM2XG5cblx0XHR2YXIgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0dmFyIGQxID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xuXHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHR2YXIgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0dmFyIHV1aWQgPSBfbHV0WyBkMCAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDggJiAweGZmIF0gKyBfbHV0WyBkMCA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdF9sdXRbIGQxICYgMHhmZiBdICsgX2x1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIF9sdXRbIGQxID4+IDE2ICYgMHgwZiB8IDB4NDAgXSArIF9sdXRbIGQxID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdF9sdXRbIGQyICYgMHgzZiB8IDB4ODAgXSArIF9sdXRbIGQyID4+IDggJiAweGZmIF0gKyAnLScgKyBfbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQyID4+IDI0ICYgMHhmZiBdICtcblx0XHRcdF9sdXRbIGQzICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gOCAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHQvLyAudG9VcHBlckNhc2UoKSBoZXJlIGZsYXR0ZW5zIGNvbmNhdGVuYXRlZCBzdHJpbmdzIHRvIHNhdmUgaGVhcCBtZW1vcnkgc3BhY2UuXG5cdFx0cmV0dXJuIHV1aWQudG9VcHBlckNhc2UoKTtcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIE1hdGhVdGlscy5ERUcyUkFEO1xuXG5cdH0sXG5cblx0cmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHtcblxuXHRcdHJldHVybiByYWRpYW5zICogTWF0aFV0aWxzLlJBRDJERUc7XG5cblx0fSxcblxuXHRpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcblxuXHR9LFxuXG5cdGNlaWxQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3JQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXI6IGZ1bmN0aW9uICggcSwgYSwgYiwgYywgb3JkZXIgKSB7XG5cblx0XHQvLyBJbnRyaW5zaWMgUHJvcGVyIEV1bGVyIEFuZ2xlcyAtIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXNcblxuXHRcdC8vIHJvdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgYXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5ICdvcmRlcidcblx0XHQvLyByb3RhdGlvbiBieSBhbmdsZSAnYScgaXMgYXBwbGllZCBmaXJzdCwgdGhlbiBieSBhbmdsZSAnYicsIHRoZW4gYnkgYW5nbGUgJ2MnXG5cdFx0Ly8gYW5nbGVzIGFyZSBpbiByYWRpYW5zXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMyID0gY29zKCBiIC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggYiAvIDIgKTtcblxuXHRcdHZhciBjMTMgPSBjb3MoICggYSArIGMgKSAvIDIgKTtcblx0XHR2YXIgczEzID0gc2luKCAoIGEgKyBjICkgLyAyICk7XG5cblx0XHR2YXIgYzFfMyA9IGNvcyggKCBhIC0gYyApIC8gMiApO1xuXHRcdHZhciBzMV8zID0gc2luKCAoIGEgLSBjICkgLyAyICk7XG5cblx0XHR2YXIgYzNfMSA9IGNvcyggKCBjIC0gYSApIC8gMiApO1xuXHRcdHZhciBzM18xID0gc2luKCAoIGMgLSBhICkgLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlYJyApIHtcblxuXHRcdFx0cS5zZXQoIGMyICogczEzLCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpZJyApIHtcblxuXHRcdFx0cS5zZXQoIHMyICogczFfMywgYzIgKiBzMTMsIHMyICogYzFfMywgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhaJyApIHtcblxuXHRcdFx0cS5zZXQoIHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIHMxMywgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpYJyApIHtcblxuXHRcdFx0cS5zZXQoIGMyICogczEzLCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhZJyApIHtcblxuXHRcdFx0cS5zZXQoIHMyICogYzNfMSwgYzIgKiBzMTMsIHMyICogczNfMSwgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllaJyApIHtcblxuXHRcdFx0cS5zZXQoIHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIHMxMywgYzIgKiBjMTMgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjIoIHgsIHkgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0XCJ3aWR0aFwiOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMueDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueCA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0XCJoZWlnaHRcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnk7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnkgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF07XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdGFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0dmFyIGFuZ2xlID0gTWF0aC5hdGFuMiggLSB0aGlzLnksIC0gdGhpcy54ICkgKyBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXgzKCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLFxuXHRcdDAsIDEsIDAsXG5cdFx0MCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdO1xuXHRcdHRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdEJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XG5cblx0XHR4QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdHZhciBiZSA9IGIuZWxlbWVudHM7XG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgMyBdLCBhMTMgPSBhZVsgNiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xuXG5cdFx0dmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyAzIF0sIGIxMyA9IGJlWyA2IF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDcgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOCBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XG5cblx0fSxcblxuXHRnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG1hdHJpeCwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbiBubyBsb25nZXIgYmUgY29uZmlndXJlZCB0byB0aHJvdyBvbiBkZWdlbmVyYXRlLlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCApO1xuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4zMSAqIG4yMyAtIG4zMyAqIG4yMSApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52O1xuXG5cdFx0dGVbIDMgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNCBdID0gKCBuMzMgKiBuMTEgLSBuMzEgKiBuMTMgKSAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjtcblxuXHRcdHRlWyA2IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDcgXSA9ICggbjIxICogbjEzIC0gbjIzICogbjExICkgKiBkZXRJbnY7XG5cdFx0dGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkgKiBkZXRJbnY7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRtcCwgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmdldEludmVyc2UoIHRoaXMgKS50cmFuc3Bvc2UoKTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZUludG9BcnJheTogZnVuY3Rpb24gKCByICkge1xuXG5cdFx0dmFyIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0clsgMCBdID0gbVsgMCBdO1xuXHRcdHJbIDEgXSA9IG1bIDMgXTtcblx0XHRyWyAyIF0gPSBtWyA2IF07XG5cdFx0clsgMyBdID0gbVsgMSBdO1xuXHRcdHJbIDQgXSA9IG1bIDQgXTtcblx0XHRyWyA1IF0gPSBtWyA3IF07XG5cdFx0clsgNiBdID0gbVsgMiBdO1xuXHRcdHJbIDcgXSA9IG1bIDUgXTtcblx0XHRyWyA4IF0gPSBtWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFV2VHJhbnNmb3JtOiBmdW5jdGlvbiAoIHR4LCB0eSwgc3gsIHN5LCByb3RhdGlvbiwgY3gsIGN5ICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCByb3RhdGlvbiApO1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHRzeCAqIGMsIHN4ICogcywgLSBzeCAqICggYyAqIGN4ICsgcyAqIGN5ICkgKyBjeCArIHR4LFxuXHRcdFx0LSBzeSAqIHMsIHN5ICogYywgLSBzeSAqICggLSBzICogY3ggKyBjICogY3kgKSArIGN5ICsgdHksXG5cdFx0XHQwLCAwLCAxXG5cdFx0KTtcblxuXHR9LFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHN4LCBzeSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHN4OyB0ZVsgMyBdICo9IHN4OyB0ZVsgNiBdICo9IHN4O1xuXHRcdHRlWyAxIF0gKj0gc3k7IHRlWyA0IF0gKj0gc3k7IHRlWyA3IF0gKj0gc3k7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZTogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gdGVbIDAgXSwgYTEyID0gdGVbIDMgXSwgYTEzID0gdGVbIDYgXTtcblx0XHR2YXIgYTIxID0gdGVbIDEgXSwgYTIyID0gdGVbIDQgXSwgYTIzID0gdGVbIDcgXTtcblxuXHRcdHRlWyAwIF0gPSBjICogYTExICsgcyAqIGEyMTtcblx0XHR0ZVsgMyBdID0gYyAqIGExMiArIHMgKiBhMjI7XG5cdFx0dGVbIDYgXSA9IGMgKiBhMTMgKyBzICogYTIzO1xuXG5cdFx0dGVbIDEgXSA9IC0gcyAqIGExMSArIGMgKiBhMjE7XG5cdFx0dGVbIDQgXSA9IC0gcyAqIGExMiArIGMgKiBhMjI7XG5cdFx0dGVbIDcgXSA9IC0gcyAqIGExMyArIGMgKiBhMjM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCB0eCwgdHkgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSArPSB0eCAqIHRlWyAyIF07IHRlWyAzIF0gKz0gdHggKiB0ZVsgNSBdOyB0ZVsgNiBdICs9IHR4ICogdGVbIDggXTtcblx0XHR0ZVsgMSBdICs9IHR5ICogdGVbIDIgXTsgdGVbIDQgXSArPSB0eSAqIHRlWyA1IF07IHRlWyA3IF0gKz0gdHkgKiB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICovXG5cbnZhciBfY2FudmFzO1xuXG52YXIgSW1hZ2VVdGlscyA9IHtcblxuXHRnZXREYXRhVVJMOiBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0dmFyIGNhbnZhcztcblxuXHRcdGlmICggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ID09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRyZXR1cm4gaW1hZ2Uuc3JjO1xuXG5cdFx0fSBlbHNlIGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHtcblxuXHRcdFx0Y2FudmFzID0gaW1hZ2U7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblxuXHRcdFx0X2NhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuXHRcdFx0X2NhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEgKSB7XG5cblx0XHRcdFx0Y29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlLCAwLCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FudmFzID0gX2NhbnZhcztcblxuXHRcdH1cblxuXHRcdGlmICggY2FudmFzLndpZHRoID4gMjA0OCB8fCBjYW52YXMuaGVpZ2h0ID4gMjA0OCApIHtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9qcGVnJywgMC42ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL3BuZycgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTtcblx0dGhpcy5taXBtYXBzID0gW107XG5cblx0dGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HO1xuXG5cdHRoaXMud3JhcFMgPSB3cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHR0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCA/IGFuaXNvdHJvcHkgOiAxO1xuXG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHR0aGlzLmludGVybmFsRm9ybWF0ID0gbnVsbDtcblx0dGhpcy50eXBlID0gdHlwZSAhPT0gdW5kZWZpbmVkID8gdHlwZSA6IFVuc2lnbmVkQnl0ZVR5cGU7XG5cblx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHR0aGlzLnJlcGVhdCA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcblx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2U7XG5cdHRoaXMuZmxpcFkgPSB0cnVlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcblxuXHQvLyBWYWx1ZXMgb2YgZW5jb2RpbmcgIT09IFRIUkVFLkxpbmVhckVuY29kaW5nIG9ubHkgc3VwcG9ydGVkIG9uIG1hcCwgZW52TWFwIGFuZCBlbWlzc2l2ZU1hcC5cblx0Ly9cblx0Ly8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbFxuXHQvLyB1cGRhdGUuIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS5cblx0dGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGluZyA6IExpbmVhckVuY29kaW5nO1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cdHRoaXMub25VcGRhdGUgPSBudWxsO1xuXG59XG5cblRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDtcblRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nO1xuXG5UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBUZXh0dXJlLFxuXG5cdGlzVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBzb3VyY2UuaW50ZXJuYWxGb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXG5cblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuXHRcdFx0dHlwZTogdGhpcy50eXBlLFxuXHRcdFx0ZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmcsXG5cblx0XHRcdG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLFxuXHRcdFx0YW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LFxuXG5cdFx0XHRmbGlwWTogdGhpcy5mbGlwWSxcblxuXHRcdFx0cHJlbXVsdGlwbHlBbHBoYTogdGhpcy5wcmVtdWx0aXBseUFscGhhLFxuXHRcdFx0dW5wYWNrQWxpZ25tZW50OiB0aGlzLnVucGFja0FsaWdubWVudFxuXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5pbWFnZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBUT0RPOiBNb3ZlIHRvIFRIUkVFLkltYWdlXG5cblx0XHRcdHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSFxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciB1cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbWFnZSApICkge1xuXG5cdFx0XHRcdFx0Ly8gcHJvY2VzcyBhcnJheSBvZiBpbWFnZXMgZS5nLiBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0dXJsID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbWFnZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR1cmwucHVzaCggSW1hZ2VVdGlscy5nZXREYXRhVVJMKCBpbWFnZVsgaSBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcHJvY2VzcyBzaW5nbGUgaW1hZ2VcblxuXHRcdFx0XHRcdHVybCA9IEltYWdlVXRpbHMuZ2V0RGF0YVVSTCggaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9IHtcblx0XHRcdFx0XHR1dWlkOiBpbWFnZS51dWlkLFxuXHRcdFx0XHRcdHVybDogdXJsXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuIHV2O1xuXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1djtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0XCJ3aWR0aFwiOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueiA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0XCJoZWlnaHRcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnc7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLncgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0dGhpcy54ID0gMTtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy53ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSAoIHRoaXMudyA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy53ICkgOiBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblx0XHR0aGlzLncgPSAtIHRoaXMudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblx0XHR0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE1hcml1cyBLaW50ZWwgLyBodHRwczovL2dpdGh1Yi5jb20va2ludGVsXG4gKi9cblxuLypcbiBJbiBvcHRpb25zLCB3ZSBjYW4gc3BlY2lmeTpcbiAqIFRleHR1cmUgcGFyYW1ldGVycyBmb3IgYW4gYXV0by1nZW5lcmF0ZWQgdGFyZ2V0IHRleHR1cmVcbiAqIGRlcHRoQnVmZmVyL3N0ZW5jaWxCdWZmZXI6IEJvb2xlYW5zIHRvIGluZGljYXRlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0aGVzZSBidWZmZXJzXG4qL1xuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLnNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cblx0dGhpcy52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0dGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgb3B0aW9ucy5tYXBwaW5nLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGluZyApO1xuXG5cdHRoaXMudGV4dHVyZS5pbWFnZSA9IHt9O1xuXHR0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGggPSB3aWR0aDtcblx0dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzIDogZmFsc2U7XG5cdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsXG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7XG5cblx0XHR0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjtcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2xcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLnNhbXBsZXMgPSA0O1xuXG59XG5cbldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCxcblxuXHRpc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuc2FtcGxlcyA9IHNvdXJjZS5zYW1wbGVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHRpc1F1YXRlcm5pb246IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl93ID0gdztcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyO1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdHZhciBjMSA9IGNvcyggeCAvIDIgKTtcblx0XHR2YXIgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0dmFyIGMzID0gY29zKCB6IC8gMiApO1xuXG5cdFx0dmFyIHMxID0gc2luKCB4IC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHR2YXIgczMgPSBzaW4oIHogLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR2YXIgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHZhciByID0gdkZyb20uZG90KCB2VG8gKSArIDE7XG5cblx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdHIgPSAwO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAtIHZGcm9tLnk7XG5cdFx0XHRcdHRoaXMuX3kgPSB2RnJvbS54O1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3kgPSAtIHZGcm9tLno7XG5cdFx0XHRcdHRoaXMuX3ogPSB2RnJvbS55O1xuXHRcdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7IC8vIGlubGluZWQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY3kgb24gVmVjdG9yM1xuXG5cdFx0XHR0aGlzLl94ID0gdkZyb20ueSAqIHZUby56IC0gdkZyb20ueiAqIHZUby55O1xuXHRcdFx0dGhpcy5feSA9IHZGcm9tLnogKiB2VG8ueCAtIHZGcm9tLnggKiB2VG8uejtcblx0XHRcdHRoaXMuX3ogPSB2RnJvbS54ICogdlRvLnkgLSB2RnJvbS55ICogdlRvLng7XG5cdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIDIgKiBNYXRoLmFjb3MoIE1hdGguYWJzKCBNYXRoVXRpbHMuY2xhbXAoIHRoaXMuZG90KCBxICksIC0gMSwgMSApICkgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVRvd2FyZHM6IGZ1bmN0aW9uICggcSwgc3RlcCApIHtcblxuXHRcdHZhciBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApO1xuXG5cdFx0aWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzO1xuXG5cdFx0dmFyIHQgPSBNYXRoLm1pbiggMSwgc3RlcCAvIGFuZ2xlICk7XG5cblx0XHR0aGlzLnNsZXJwKCBxLCB0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkge1xuXG5cdFx0aWYgKCBwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG1cblxuXHRcdHZhciBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdHZhciBxYnggPSBiLl94LCBxYnkgPSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93O1xuXG5cdFx0dGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTtcblx0XHR0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6O1xuXHRcdHRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7XG5cdFx0dGhpcy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTtcblxuXHRcdGlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0O1xuXHRcdFx0dGhpcy5fdyA9IHMgKiB3ICsgdCAqIHRoaXMuX3c7XG5cdFx0XHR0aGlzLl94ID0gcyAqIHggKyB0ICogdGhpcy5feDtcblx0XHRcdHRoaXMuX3kgPSBzICogeSArIHQgKiB0aGlzLl95O1xuXHRcdFx0dGhpcy5feiA9IHMgKiB6ICsgdCAqIHRoaXMuX3o7XG5cblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggc3FyU2luSGFsZlRoZXRhICk7XG5cdFx0dmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0dmFyIHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcblx0XHRcdHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7XG5cblx0XHR0aGlzLl93ID0gKCB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTtcblx0XHR0aGlzLl96ID0gKCB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQiApO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCApIHtcblxuXHRcdHRoaXMuX3ggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLl95ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy5feiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMuX3cgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0X29uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRfb25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG52YXIgX3ZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3F1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdH0sXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDMoIG0gKS5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHcgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApO1xuXG5cdFx0dGhpcy54ID0gKCBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICkgKiB3O1xuXHRcdHRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdztcblx0XHR0aGlzLnogPSAoIGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICkgKiB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHR2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG5cdFx0dmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xuXHRcdHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHR2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuXHRcdC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcblxuXHRcdHRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC0gcXggKyBpeSAqIC0gcXogLSBpeiAqIC0gcXk7XG5cdFx0dGhpcy55ID0gaXkgKiBxdyArIGl3ICogLSBxeSArIGl6ICogLSBxeCAtIGl4ICogLSBxejtcblx0XHR0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0OiBmdW5jdGlvbiAoIGNhbWVyYSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHR9LFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXhcblx0XHQvLyB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb25cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYuejtcblxuXHR9LFxuXG5cdC8vIFRPRE8gbGVuZ3RoU3F1YXJlZD9cblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMuejtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0Y3Jvc3M6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB0aGlzLCB2ICk7XG5cblx0fSxcblxuXHRjcm9zc1ZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56O1xuXHRcdHZhciBieCA9IGIueCwgYnkgPSBiLnksIGJ6ID0gYi56O1xuXG5cdFx0dGhpcy54ID0gYXkgKiBieiAtIGF6ICogYnk7XG5cdFx0dGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7XG5cdFx0dGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3RPblZlY3RvcjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gdi5sZW5ndGhTcSgpO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCApO1xuXG5cdFx0dmFyIHNjYWxhciA9IHYuZG90KCB0aGlzICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHYgKS5tdWx0aXBseVNjYWxhciggc2NhbGFyICk7XG5cblx0fSxcblxuXHRwcm9qZWN0T25QbGFuZTogZnVuY3Rpb24gKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdF92ZWN0b3IuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzLnN1YiggX3ZlY3RvciApO1xuXG5cdH0sXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCBub3JtYWwgKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdH0sXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSByZXR1cm4gTWF0aC5QSSAvIDI7XG5cblx0XHR2YXIgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gZGVub21pbmF0b3I7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggTWF0aFV0aWxzLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCBzLnJhZGl1cywgcy5waGksIHMudGhldGEgKTtcblxuXHR9LFxuXG5cdHNldEZyb21TcGhlcmljYWxDb29yZHM6IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdFx0dmFyIHNpblBoaVJhZGl1cyA9IE1hdGguc2luKCBwaGkgKSAqIHJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCB0aGV0YSApO1xuXHRcdHRoaXMueSA9IE1hdGguY29zKCBwaGkgKSAqIHJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggdGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoIGMucmFkaXVzLCBjLnRoZXRhLCBjLnkgKTtcblxuXHR9LFxuXG5cdHNldEZyb21DeWxpbmRyaWNhbENvb3JkczogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy54ID0gcmFkaXVzICogTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAxMiBdO1xuXHRcdHRoaXMueSA9IGVbIDEzIF07XG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFNjYWxlOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgc3ggPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRoaXMueCA9IHN4O1xuXHRcdHRoaXMueSA9IHN5O1xuXHRcdHRoaXMueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4Q29sdW1uOiBmdW5jdGlvbiAoIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXgzQ29sdW1uOiBmdW5jdGlvbiAoIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDMgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbnZhciBfdjEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9tMSA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3plcm8gPSBuZXcgVmVjdG9yMyggMCwgMCwgMCApO1xudmFyIF9vbmUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xudmFyIF94ID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfeSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ogPSBuZXcgVmVjdG9yMygpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gdGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCByZWZsZWN0aW9uIG1hdHJpY2VzXG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYID0gMSAvIF92MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0dmFyIHNjYWxlWSA9IDEgLyBfdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzY2FsZVogPSAxIC8gX3YxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xuXHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xuXHRcdHRlWyAzIF0gPSAwO1xuXG5cdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDcgXSA9IDA7XG5cblx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHggPSBldWxlci54LCB5ID0gZXVsZXIueSwgeiA9IGV1bGVyLno7XG5cdFx0dmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcblx0XHR2YXIgYyA9IE1hdGguY29zKCB5ICksIGQgPSBNYXRoLnNpbiggeSApO1xuXHRcdHZhciBlID0gTWF0aC5jb3MoIHogKSwgZiA9IE1hdGguc2luKCB6ICk7XG5cblx0XHRpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlICsgZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IGRlICogYiAtIGNmO1xuXHRcdFx0dGVbIDggXSA9IGEgKiBkO1xuXG5cdFx0XHR0ZVsgMSBdID0gYSAqIGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gY2YgKiBiIC0gZGU7XG5cdFx0XHR0ZVsgNiBdID0gZGYgKyBjZSAqIGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlIC0gZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IC0gYSAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZGUgKyBjZiAqIGI7XG5cblx0XHRcdHRlWyAxIF0gPSBjZiArIGRlICogYjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBkZiAtIGNlICogYjtcblxuXHRcdFx0dGVbIDIgXSA9IC0gYSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XG5cblx0XHRcdHRlWyAxIF0gPSBjICogZjtcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcblx0XHRcdHRlWyA2IF0gPSBiICogYztcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmQgLSBhYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gYmMgKiBmICsgYWQ7XG5cblx0XHRcdHRlWyAxIF0gPSBmO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGU7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGQgKiBlO1xuXHRcdFx0dGVbIDYgXSA9IGFkICogZiArIGJjO1xuXHRcdFx0dGVbIDEwIF0gPSBhYyAtIGJkICogZjtcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGY7XG5cdFx0XHR0ZVsgOCBdID0gZCAqIGU7XG5cblx0XHRcdHRlWyAxIF0gPSBhYyAqIGYgKyBiZDtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBhZCAqIGYgLSBiYztcblxuXHRcdFx0dGVbIDIgXSA9IGJjICogZiAtIGFkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBlO1xuXHRcdFx0dGVbIDEwIF0gPSBiZCAqIGYgKyBhYztcblxuXHRcdH1cblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiB0aGlzLmNvbXBvc2UoIF96ZXJvLCBxLCBfb25lICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggZXllLCB0YXJnZXQsIHVwICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdF96LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XG5cblx0XHRpZiAoIF96Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxuXG5cdFx0XHRfei56ID0gMTtcblxuXHRcdH1cblxuXHRcdF96Lm5vcm1hbGl6ZSgpO1xuXHRcdF94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7XG5cblx0XHRpZiAoIF94Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7XG5cblx0XHRcdFx0X3oueCArPSAwLjAwMDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X3oueiArPSAwLjAwMDE7XG5cblx0XHRcdH1cblxuXHRcdFx0X3oubm9ybWFsaXplKCk7XG5cdFx0XHRfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApO1xuXG5cdFx0fVxuXG5cdFx0X3gubm9ybWFsaXplKCk7XG5cdFx0X3kuY3Jvc3NWZWN0b3JzKCBfeiwgX3ggKTtcblxuXHRcdHRlWyAwIF0gPSBfeC54OyB0ZVsgNCBdID0gX3kueDsgdGVbIDggXSA9IF96Lng7XG5cdFx0dGVbIDEgXSA9IF94Lnk7IHRlWyA1IF0gPSBfeS55OyB0ZVsgOSBdID0gX3oueTtcblx0XHR0ZVsgMiBdID0gX3guejsgdGVbIDYgXSA9IF95Lno7IHRlWyAxMCBdID0gX3ouejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSwgbiApIHtcblxuXHRcdGlmICggbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCBuICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDQgXSwgYTEzID0gYWVbIDggXSwgYTE0ID0gYWVbIDEyIF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0sIGEyMyA9IGFlWyA5IF0sIGEyNCA9IGFlWyAxMyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XG5cdFx0dmFyIGE0MSA9IGFlWyAzIF0sIGE0MiA9IGFlWyA3IF0sIGE0MyA9IGFlWyAxMSBdLCBhNDQgPSBhZVsgMTUgXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTtcblx0XHR2YXIgYjQxID0gYmVbIDMgXSwgYjQyID0gYmVbIDcgXSwgYjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMSArIGExNCAqIGI0MTtcblx0XHR0ZVsgNCBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyICsgYTE0ICogYjQyO1xuXHRcdHRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7XG5cdFx0dGVbIDEyIF0gPSBhMTEgKiBiMTQgKyBhMTIgKiBiMjQgKyBhMTMgKiBiMzQgKyBhMTQgKiBiNDQ7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxICsgYTI0ICogYjQxO1xuXHRcdHRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzIgKyBhMjQgKiBiNDI7XG5cdFx0dGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0Mztcblx0XHR0ZVsgMTMgXSA9IGEyMSAqIGIxNCArIGEyMiAqIGIyNCArIGEyMyAqIGIzNCArIGEyNCAqIGI0NDtcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBiNDE7XG5cdFx0dGVbIDYgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMiArIGEzNCAqIGI0Mjtcblx0XHR0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0Mztcblx0XHR0ZVsgMTQgXSA9IGEzMSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDtcblxuXHRcdHRlWyAzIF0gPSBhNDEgKiBiMTEgKyBhNDIgKiBiMjEgKyBhNDMgKiBiMzEgKyBhNDQgKiBiNDE7XG5cdFx0dGVbIDcgXSA9IGE0MSAqIGIxMiArIGE0MiAqIGIyMiArIGE0MyAqIGIzMiArIGE0NCAqIGI0Mjtcblx0XHR0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0Mztcblx0XHR0ZVsgMTUgXSA9IGE0MSAqIGIxNCArIGE0MiAqIGIyNCArIGE0MyAqIGIzNCArIGE0NCAqIGI0NDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdO1xuXHRcdHZhciBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcblx0XHR2YXIgbjMxID0gdGVbIDIgXSwgbjMyID0gdGVbIDYgXSwgbjMzID0gdGVbIDEwIF0sIG4zNCA9IHRlWyAxNCBdO1xuXHRcdHZhciBuNDEgPSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07XG5cblx0XHQvL1RPRE86IG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudFxuXHRcdC8vKCBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG0gKVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdG40MSAqIChcblx0XHRcdFx0KyBuMTQgKiBuMjMgKiBuMzJcblx0XHRcdFx0IC0gbjEzICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xMiAqIG4yMyAqIG4zNFxuXHRcdFx0KSArXG5cdFx0XHRuNDIgKiAoXG5cdFx0XHRcdCsgbjExICogbjIzICogbjM0XG5cdFx0XHRcdCAtIG4xMSAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTQgKiBuMjEgKiBuMzNcblx0XHRcdFx0IC0gbjEzICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xMyAqIG4yNCAqIG4zMVxuXHRcdFx0XHQgLSBuMTQgKiBuMjMgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQzICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTEgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjE0ICogbjIxICogbjMyXG5cdFx0XHRcdCArIG4xMiAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTQgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjEyICogbjI0ICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40NCAqIChcblx0XHRcdFx0LSBuMTMgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjExICogbjIzICogbjMyXG5cdFx0XHRcdCArIG4xMSAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjEgKiBuMzJcblx0XHRcdFx0IC0gbjEyICogbjIxICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yMyAqIG4zMVxuXHRcdFx0KVxuXG5cdFx0KTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdG1wO1xuXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQb3NpdGlvbjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGlmICggeC5pc1ZlY3RvcjMgKSB7XG5cblx0XHRcdHRlWyAxMiBdID0geC54O1xuXHRcdFx0dGVbIDEzIF0gPSB4Lnk7XG5cdFx0XHR0ZVsgMTQgXSA9IHguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRlWyAxMiBdID0geDtcblx0XHRcdHRlWyAxMyBdID0geTtcblx0XHRcdHRlWyAxNCBdID0gejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtLCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuIG5vIGxvbmdlciBiZSBjb25maWd1cmVkIHRvIHRocm93IG9uIGRlZ2VuZXJhdGUuXCIgKTtcblxuXHRcdH1cblxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsXG5cdFx0XHRtZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sIG40MSA9IG1lWyAzIF0sXG5cdFx0XHRuMTIgPSBtZVsgNCBdLCBuMjIgPSBtZVsgNSBdLCBuMzIgPSBtZVsgNiBdLCBuNDIgPSBtZVsgNyBdLFxuXHRcdFx0bjEzID0gbWVbIDggXSwgbjIzID0gbWVbIDkgXSwgbjMzID0gbWVbIDEwIF0sIG40MyA9IG1lWyAxMSBdLFxuXHRcdFx0bjE0ID0gbWVbIDEyIF0sIG4yNCA9IG1lWyAxMyBdLCBuMzQgPSBtZVsgMTQgXSwgbjQ0ID0gbWVbIDE1IF0sXG5cblx0XHRcdHQxMSA9IG4yMyAqIG4zNCAqIG40MiAtIG4yNCAqIG4zMyAqIG40MiArIG4yNCAqIG4zMiAqIG40MyAtIG4yMiAqIG4zNCAqIG40MyAtIG4yMyAqIG4zMiAqIG40NCArIG4yMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMyA9IG4xMyAqIG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4yNCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCxcblx0XHRcdHQxNCA9IG4xNCAqIG4yMyAqIG4zMiAtIG4xMyAqIG4yNCAqIG4zMiAtIG4xNCAqIG4yMiAqIG4zMyArIG4xMiAqIG4yNCAqIG4zMyArIG4xMyAqIG4yMiAqIG4zNCAtIG4xMiAqIG4yMyAqIG4zNDtcblxuXHRcdHZhciBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCApO1xuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcXVhdGVybmlvbi5feCwgeSA9IHF1YXRlcm5pb24uX3ksIHogPSBxdWF0ZXJuaW9uLl96LCB3ID0gcXVhdGVybmlvbi5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCxcdHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0dmFyIHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4ICogejI7XG5cdFx0dmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7XG5cdFx0dmFyIHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHR2YXIgc3ggPSBzY2FsZS54LCBzeSA9IHNjYWxlLnksIHN6ID0gc2NhbGUuejtcblxuXHRcdHRlWyAwIF0gPSAoIDEgLSAoIHl5ICsgenogKSApICogc3g7XG5cdFx0dGVbIDEgXSA9ICggeHkgKyB3eiApICogc3g7XG5cdFx0dGVbIDIgXSA9ICggeHogLSB3eSApICogc3g7XG5cdFx0dGVbIDMgXSA9IDA7XG5cblx0XHR0ZVsgNCBdID0gKCB4eSAtIHd6ICkgKiBzeTtcblx0XHR0ZVsgNSBdID0gKCAxIC0gKCB4eCArIHp6ICkgKSAqIHN5O1xuXHRcdHRlWyA2IF0gPSAoIHl6ICsgd3ggKSAqIHN5O1xuXHRcdHRlWyA3IF0gPSAwO1xuXG5cdFx0dGVbIDggXSA9ICggeHogKyB3eSApICogc3o7XG5cdFx0dGVbIDkgXSA9ICggeXogLSB3eCApICogc3o7XG5cdFx0dGVbIDEwIF0gPSAoIDEgLSAoIHh4ICsgeXkgKSApICogc3o7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0dGVbIDEyIF0gPSBwb3NpdGlvbi54O1xuXHRcdHRlWyAxMyBdID0gcG9zaXRpb24ueTtcblx0XHR0ZVsgMTQgXSA9IHBvc2l0aW9uLno7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBzeCA9IF92MS5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcblx0XHR2YXIgc3kgPSBfdjEuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN6ID0gX3YxLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdC8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxlXG5cdFx0dmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcblx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRwb3NpdGlvbi54ID0gdGVbIDEyIF07XG5cdFx0cG9zaXRpb24ueSA9IHRlWyAxMyBdO1xuXHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdC8vIHNjYWxlIHRoZSByb3RhdGlvbiBwYXJ0XG5cdFx0X20xLmNvcHkoIHRoaXMgKTtcblxuXHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHR2YXIgaW52U1kgPSAxIC8gc3k7XG5cdFx0dmFyIGludlNaID0gMSAvIHN6O1xuXG5cdFx0X20xLmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0X20xLmVsZW1lbnRzWyAxIF0gKj0gaW52U1g7XG5cdFx0X20xLmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRfbTEuZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRfbTEuZWxlbWVudHNbIDUgXSAqPSBpbnZTWTtcblx0XHRfbTEuZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdF9tMS5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdF9tMS5lbGVtZW50c1sgOSBdICo9IGludlNaO1xuXHRcdF9tMS5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEgKTtcblxuXHRcdHNjYWxlLnggPSBzeDtcblx0XHRzY2FsZS55ID0gc3k7XG5cdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUGVyc3BlY3RpdmU6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRpZiAoIGZhciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgeSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTtcblxuXHRcdHZhciBhID0gKCByaWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgYyA9IC0gKCBmYXIgKyBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcblx0XHR2YXIgZCA9IC0gMiAqIGZhciAqIG5lYXIgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHRlWyAwIF0gPSB4O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gYTtcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSB5O1x0dGVbIDkgXSA9IGI7XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gYztcdHRlWyAxNCBdID0gZDtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAtIDE7XHR0ZVsgMTUgXSA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VPcnRob2dyYXBoaWM6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB3ID0gMS4wIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgaCA9IDEuMCAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHZhciB4ID0gKCByaWdodCArIGxlZnQgKSAqIHc7XG5cdFx0dmFyIHkgPSAoIHRvcCArIGJvdHRvbSApICogaDtcblx0XHR2YXIgeiA9ICggZmFyICsgbmVhciApICogcDtcblxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IDA7XHR0ZVsgMTIgXSA9IC0geDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwO1x0dGVbIDEzIF0gPSAtIHk7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gLSAyICogcDtcdHRlWyAxNCBdID0gLSB6O1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IDA7XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOSBdID0gdGVbIDkgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMyBdID0gdGVbIDEzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgX21hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3F1YXRlcm5pb24kMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6LCBvcmRlciApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IEV1bGVyLkRlZmF1bHRPcmRlcjtcblxufVxuXG5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5FdWxlci5EZWZhdWx0T3JkZXIgPSAnWFlaJztcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9yZGVyOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX29yZGVyO1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5fb3JkZXIgPSB2YWx1ZTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0aXNFdWxlcjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdHZhciBjbGFtcCA9IE1hdGhVdGlscy5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdO1xuXHRcdHZhciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdHZhciBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdG9yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggY2xhbXAoIG0xMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggLSBjbGFtcCggbTMxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICcgKyBvcmRlciApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdF9tYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX21hdHJpeCwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRyZW9yZGVyOiBmdW5jdGlvbiAoIG5ld09yZGVyICkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0X3F1YXRlcm5pb24kMS5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiQxLCBuZXdPcmRlciApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X29uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRfb25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZW5hYmxlQWxsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hc2sgPSAweGZmZmZmZmZmIHwgMDtcblxuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTtcblxuXHR9LFxuXG5cdGRpc2FibGVBbGw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWFzayA9IDA7XG5cblx0fSxcblxuXHR0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59ICk7XG5cbnZhciBfb2JqZWN0M0RJZCA9IDA7XG5cbnZhciBfdjEkMSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ExID0gbmV3IFF1YXRlcm5pb24oKTtcbnZhciBfbTEkMSA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3RhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cbnZhciBfcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xudmFyIF9zY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3F1YXRlcm5pb24kMiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbnZhciBfeEF4aXMgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xudmFyIF95QXhpcyA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG52YXIgX3pBeGlzID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxudmFyIF9hZGRlZEV2ZW50ID0geyB0eXBlOiAnYWRkZWQnIH07XG52YXIgX3JlbW92ZWRFdmVudCA9IHsgdHlwZTogJ3JlbW92ZWQnIH07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoXG4gKi9cblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfb2JqZWN0M0RJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnT2JqZWN0M0QnO1xuXG5cdHRoaXMucGFyZW50ID0gbnVsbDtcblx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXG5cdHRoaXMudXAgPSBPYmplY3QzRC5EZWZhdWx0VXAuY2xvbmUoKTtcblxuXHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xuXG5cdGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7XG5cblx0XHRxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHtcblxuXHRcdHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB1bmRlZmluZWQsIGZhbHNlICk7XG5cblx0fVxuXG5cdHJvdGF0aW9uLl9vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLl9vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRwb3NpdGlvbjoge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBwb3NpdGlvblxuXHRcdH0sXG5cdFx0cm90YXRpb246IHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcm90YXRpb25cblx0XHR9LFxuXHRcdHF1YXRlcm5pb246IHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcXVhdGVybmlvblxuXHRcdH0sXG5cdFx0c2NhbGU6IHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogc2NhbGVcblx0XHR9LFxuXHRcdG1vZGVsVmlld01hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXg0KClcblx0XHR9LFxuXHRcdG5vcm1hbE1hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXgzKClcblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMubWF0cml4V29ybGQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IE9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlO1xuXHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTtcblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSBmYWxzZTtcblx0dGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG5cblx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcblx0dGhpcy5yZW5kZXJPcmRlciA9IDA7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG59XG5cbk9iamVjdDNELkRlZmF1bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5PYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cbk9iamVjdDNELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBPYmplY3QzRCxcblxuXHRpc09iamVjdDNEOiB0cnVlLFxuXG5cdG9uQmVmb3JlUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblx0b25BZnRlclJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMubWF0cml4LnByZW11bHRpcGx5KCBtYXRyaXggKTtcblxuXHRcdHRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHEgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZU9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0X3ExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIF9xMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVPbldvcmxkQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcblxuXHRcdF9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCBhbmdsZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3hBeGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCBhbmdsZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3lBeGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCBhbmdsZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3pBeGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoIGF4aXMsIGRpc3RhbmNlICkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHRfdjEkMS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5pb24gKTtcblxuXHRcdHRoaXMucG9zaXRpb24uYWRkKCBfdjEkMS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGVYOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfeEF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfeUF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblxuXHR0cmFuc2xhdGVaOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfekF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblxuXHRsb2NhbFRvV29ybGQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdHdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggX20xJDEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyBoYXZpbmcgbm9uLXVuaWZvcm1seS1zY2FsZWQgcGFyZW50KHMpXG5cblx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xuXG5cdFx0XHRfdGFyZ2V0LmNvcHkoIHggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90YXJnZXQuc2V0KCB4LCB5LCB6ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0X3Bvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0aWYgKCB0aGlzLmlzQ2FtZXJhIHx8IHRoaXMuaXNMaWdodCApIHtcblxuXHRcdFx0X20xJDEubG9va0F0KCBfcG9zaXRpb24sIF90YXJnZXQsIHRoaXMudXAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9tMSQxLmxvb2tBdCggX3RhcmdldCwgX3Bvc2l0aW9uLCB0aGlzLnVwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXG5cdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdF9tMSQxLmV4dHJhY3RSb3RhdGlvbiggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRfcTEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEuaW52ZXJzZSgpICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9hZGRlZEV2ZW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9yZW1vdmVkRXZlbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGFkZHMgb2JqZWN0IGFzIGEgY2hpbGQgb2YgdGhpcywgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9iamVjdCdzIHdvcmxkIHRyYW5zZm9ybVxuXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdF9tMSQxLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdGlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0X20xJDEubXVsdGlwbHkoIG9iamVjdC5wYXJlbnQubWF0cml4V29ybGQgKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC5hcHBseU1hdHJpeDQoIF9tMSQxICk7XG5cblx0XHRvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCBmYWxzZSApO1xuXG5cdFx0dGhpcy5hZGQoIG9iamVjdCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgdGFyZ2V0LCBfc2NhbGUgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFNjYWxlOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgX3F1YXRlcm5pb24kMiwgdGFyZ2V0ICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0dmFyIGUgPSB0aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIGVbIDggXSwgZVsgOSBdLCBlWyAxMCBdICkubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZVdvcmxkTWF0cml4OiBmdW5jdGlvbiAoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICkge1xuXG5cdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCB1cGRhdGVQYXJlbnRzID09PSB0cnVlICYmIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0cGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjaGlsZHJlblxuXG5cdFx0aWYgKCB1cGRhdGVDaGlsZHJlbiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjaGlsZHJlblsgaSBdLnVwZGF0ZVdvcmxkTWF0cml4KCBmYWxzZSwgdHJ1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdC8vIG1ldGEgaXMgYSBzdHJpbmcgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeVxuXHRcdHZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdHZhciBvdXRwdXQgPSB7fTtcblxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3Rcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9LFxuXHRcdFx0XHRzaGFwZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0XHRvdXRwdXQubWV0YWRhdGEgPSB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ09iamVjdCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTidcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHQvLyBzdGFuZGFyZCBPYmplY3QzRCBzZXJpYWxpemF0aW9uXG5cblx0XHR2YXIgb2JqZWN0ID0ge307XG5cblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgKSBvYmplY3QucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHRvYmplY3QubGF5ZXJzID0gdGhpcy5sYXllcnMubWFzaztcblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdC8vIG9iamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzXG5cblx0XHRpZiAoIHRoaXMuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRvYmplY3QudHlwZSA9ICdJbnN0YW5jZWRNZXNoJztcblx0XHRcdG9iamVjdC5jb3VudCA9IHRoaXMuY291bnQ7XG5cdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSB0aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzTWVzaCB8fCB0aGlzLmlzTGluZSB8fCB0aGlzLmlzUG9pbnRzICkge1xuXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSApO1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2YXIgc2hhcGVzID0gcGFyYW1ldGVycy5zaGFwZXM7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGVzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLm1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0dmFyIHV1aWRzID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dXVpZHMucHVzaCggc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFsgaSBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG9iamVjdC5jaGlsZHJlbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0YSApLm9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJpZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmdlb21ldHJpZXMgKTtcblx0XHRcdHZhciBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cdFx0XHR2YXIgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5zaGFwZXMgKTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG5cdFx0XHRpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzO1xuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIG91dHB1dC5pbWFnZXMgPSBpbWFnZXM7XG5cdFx0XHRpZiAoIHNoYXBlcy5sZW5ndGggPiAwICkgb3V0cHV0LnNoYXBlcyA9IHNoYXBlcztcblxuXHRcdH1cblxuXHRcdG91dHB1dC5vYmplY3QgPSBvYmplY3Q7XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0Ly8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIGNhY2hlIGhhc2hcblx0XHQvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVtXG5cdFx0Ly8gYW5kIHJldHVybiBhcyBhcnJheVxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0gY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcblxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHJlY3Vyc2l2ZSApIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB1bmRlZmluZWQgKSByZWN1cnNpdmUgPSB0cnVlO1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggc291cmNlLnF1YXRlcm5pb24gKTtcblx0XHR0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2FsZSApO1xuXG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXHRcdHRoaXMubWF0cml4V29ybGQuY29weSggc291cmNlLm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTtcblxuXHRcdHRoaXMubGF5ZXJzLm1hc2sgPSBzb3VyY2UubGF5ZXJzLm1hc2s7XG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cblx0XHR0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdztcblx0XHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBzb3VyY2UucmVjZWl2ZVNoYWRvdztcblxuXHRcdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3VsbGVkO1xuXHRcdHRoaXMucmVuZGVyT3JkZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7XG5cblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2hpbGQgPSBzb3VyY2UuY2hpbGRyZW5bIGkgXTtcblx0XHRcdFx0dGhpcy5hZGQoIGNoaWxkLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTY2VuZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHR0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXHR0aGlzLmVudmlyb25tZW50ID0gbnVsbDtcblx0dGhpcy5mb2cgPSBudWxsO1xuXG5cdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXJcblxuXHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0X19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ29ic2VydmUnLCB7IGRldGFpbDogdGhpcyB9ICkgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cdH1cblxufVxuXG5TY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTY2VuZSxcblxuXHRpc1NjZW5lOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZW52aXJvbm1lbnQgIT09IG51bGwgKSB0aGlzLmVudmlyb25tZW50ID0gc291cmNlLmVudmlyb25tZW50LmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cblx0XHRpZiAoIHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkgdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKTtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICk7XG5cdFx0aWYgKCB0aGlzLmVudmlyb25tZW50ICE9PSBudWxsICkgZGF0YS5vYmplY3QuZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50LnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBfcG9pbnRzID0gW1xuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpLFxuXHRuZXcgVmVjdG9yMygpXG5dO1xuXG52YXIgX3ZlY3RvciQxID0gbmV3IFZlY3RvcjMoKTtcblxudmFyIF9ib3ggPSBuZXcgQm94MygpO1xuXG4vLyB0cmlhbmdsZSBjZW50ZXJlZCB2ZXJ0aWNlc1xuXG52YXIgX3YwID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfdjEkMiA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3YyID0gbmV3IFZlY3RvcjMoKTtcblxuLy8gdHJpYW5nbGUgZWRnZSB2ZWN0b3JzXG5cbnZhciBfZjAgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9mMSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX2YyID0gbmV3IFZlY3RvcjMoKTtcblxudmFyIF9jZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9leHRlbnRzID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfdHJpYW5nbGVOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xudmFyIF90ZXN0QXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGlzQm94MzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0dmFyIHggPSBhcnJheVsgaSBdO1xuXHRcdFx0dmFyIHkgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdHZhciB6ID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdHZhciB5ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdHZhciB6ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHR2YXIgaGFsZlNpemUgPSBfdmVjdG9yJDEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcblxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIGZhbHNlICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2JveC5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApO1xuXHRcdFx0X2JveC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR0aGlzLnVuaW9uKCBfYm94ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5T2JqZWN0KCBjaGlsZHJlblsgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiZcblx0XHRcdHRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSxcblx0XHRcdCggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLlxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0Ym94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHQvLyBGaW5kIHRoZSBwb2ludCBvbiB0aGUgQUFCQiBjbG9zZXN0IHRvIHRoZSBzcGhlcmUgY2VudGVyLlxuXHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgX3ZlY3RvciQxICk7XG5cblx0XHQvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC5cblx0XHRyZXR1cm4gX3ZlY3RvciQxLmRpc3RhbmNlVG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gLSBwbGFuZS5jb25zdGFudCAmJiBtYXggPj0gLSBwbGFuZS5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1RyaWFuZ2xlOiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkge1xuXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXG5cdFx0dGhpcy5nZXRDZW50ZXIoIF9jZW50ZXIgKTtcblx0XHRfZXh0ZW50cy5zdWJWZWN0b3JzKCB0aGlzLm1heCwgX2NlbnRlciApO1xuXG5cdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXG5cdFx0X3YwLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmEsIF9jZW50ZXIgKTtcblx0XHRfdjEkMi5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBfY2VudGVyICk7XG5cdFx0X3YyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmMsIF9jZW50ZXIgKTtcblxuXHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxuXHRcdF9mMC5zdWJWZWN0b3JzKCBfdjEkMiwgX3YwICk7XG5cdFx0X2YxLnN1YlZlY3RvcnMoIF92MiwgX3YxJDIgKTtcblx0XHRfZjIuc3ViVmVjdG9ycyggX3YwLCBfdjIgKTtcblxuXHRcdC8vIHRlc3QgYWdhaW5zdCBheGVzIHRoYXQgYXJlIGdpdmVuIGJ5IGNyb3NzIHByb2R1Y3QgY29tYmluYXRpb25zIG9mIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUgYW5kIHRoZSBlZGdlcyBvZiB0aGUgYWFiYlxuXHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXG5cdFx0Ly8gYXhpc19paiA9IHVfaSB4IGZfaiAodTAsIHUxLCB1MiA9IGZhY2Ugbm9ybWFscyBvZiBhYWJiID0geCx5LHogYXhlcyB2ZWN0b3JzIHNpbmNlIGFhYmIgaXMgYXhpcyBhbGlnbmVkKVxuXHRcdHZhciBheGVzID0gW1xuXHRcdFx0MCwgLSBfZjAueiwgX2YwLnksIDAsIC0gX2YxLnosIF9mMS55LCAwLCAtIF9mMi56LCBfZjIueSxcblx0XHRcdF9mMC56LCAwLCAtIF9mMC54LCBfZjEueiwgMCwgLSBfZjEueCwgX2YyLnosIDAsIC0gX2YyLngsXG5cdFx0XHQtIF9mMC55LCBfZjAueCwgMCwgLSBfZjEueSwgX2YxLngsIDAsIC0gX2YyLnksIF9mMi54LCAwXG5cdFx0XTtcblx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwLCBfdjEkMiwgX3YyLCBfZXh0ZW50cyApICkge1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHQvLyB0ZXN0IDMgZmFjZSBub3JtYWxzIGZyb20gdGhlIGFhYmJcblx0XHRheGVzID0gWyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxIF07XG5cdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxJDIsIF92MiwgX2V4dGVudHMgKSApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxuXHRcdF90cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIF9mMCwgX2YxICk7XG5cdFx0YXhlcyA9IFsgX3RyaWFuZ2xlTm9ybWFsLngsIF90cmlhbmdsZU5vcm1hbC55LCBfdHJpYW5nbGVOb3JtYWwueiBdO1xuXG5cdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxJDIsIF92MiwgX2V4dGVudHMgKTtcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dmFyIGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkMS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHQvL3RhcmdldCA9IG5ldyBTcGhlcmUoKTsgLy8gcmVtb3ZlZCB0byBhdm9pZCBjeWNsaWMgZGVwZW5kZW5jeVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcblxuXHRcdHRhcmdldC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIF92ZWN0b3IkMSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XG5cblx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xuXHRcdF9wb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcblx0XHRfcG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0X3BvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxuXHRcdF9wb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcblx0XHRfcG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0X3BvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxuXHRcdF9wb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcblx0XHRfcG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTExXG5cblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIF9wb2ludHMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcywgdjAsIHYxLCB2MiwgZXh0ZW50cyApIHtcblxuXHR2YXIgaSwgajtcblxuXHRmb3IgKCBpID0gMCwgaiA9IGF4ZXMubGVuZ3RoIC0gMzsgaSA8PSBqOyBpICs9IDMgKSB7XG5cblx0XHRfdGVzdEF4aXMuZnJvbUFycmF5KCBheGVzLCBpICk7XG5cdFx0Ly8gcHJvamVjdCB0aGUgYWFiYiBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHR2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCBfdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIF90ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggX3Rlc3RBeGlzLnogKTtcblx0XHQvLyBwcm9qZWN0IGFsbCAzIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHR2YXIgcDAgPSB2MC5kb3QoIF90ZXN0QXhpcyApO1xuXHRcdHZhciBwMSA9IHYxLmRvdCggX3Rlc3RBeGlzICk7XG5cdFx0dmFyIHAyID0gdjIuZG90KCBfdGVzdEF4aXMgKTtcblx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxuXHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0Ly8gcG9pbnRzIG9mIHRoZSBwcm9qZWN0ZWQgdHJpYW5nbGUgYXJlIG91dHNpZGUgdGhlIHByb2plY3RlZCBoYWxmLWxlbmd0aCBvZiB0aGUgYWFiYlxuXHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwZXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxudmFyIF9ib3gkMSA9IG5ldyBCb3gzKCk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkge1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9ib3gkMS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1NwaGVyZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMuY2VudGVyICkgKSA8PSB0aGlzLnJhZGl1cztcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHZhciBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuY29weSggcG9pbnQgKTtcblxuXHRcdGlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHR0YXJnZXQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0dGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LnNldCggdGhpcy5jZW50ZXIsIHRoaXMuY2VudGVyICk7XG5cdFx0dGFyZ2V0LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApO1xuXG5cdH1cblxufSApO1xuXG52YXIgX3ZlY3RvciQyID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cbnZhciBfZWRnZTEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9lZGdlMiA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX25vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0dGhpcy5vcmlnaW4gPSAoIG9yaWdpbiAhPT0gdW5kZWZpbmVkICkgPyBvcmlnaW4gOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmRpcmVjdGlvbiA9ICggZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgKSA/IGRpcmVjdGlvbiA6IG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgX3ZlY3RvciQyICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdGFyZ2V0LmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMub3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSBfdmVjdG9yJDIuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9XG5cblx0XHRfdmVjdG9yJDIuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRyZXR1cm4gX3ZlY3RvciQyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcVRvU2VnbWVudDogZnVuY3Rpb24gKCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcblx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0X3NlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0X3NlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRfZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1YiggX3NlZ0NlbnRlciApO1xuXG5cdFx0dmFyIHNlZ0V4dGVudCA9IHYwLmRpc3RhbmNlVG8oIHYxICkgKiAwLjU7XG5cdFx0dmFyIGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBfc2VnRGlyICk7XG5cdFx0dmFyIGIwID0gX2RpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdHZhciBiMSA9IC0gX2RpZmYuZG90KCBfc2VnRGlyICk7XG5cdFx0dmFyIGMgPSBfZGlmZi5sZW5ndGhTcSgpO1xuXHRcdHZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdGlmICggZGV0ID4gMCApIHtcblxuXHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XG5cdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXG5cblx0XHRcdFx0XHRcdHZhciBpbnZEZXQgPSAxIC8gZGV0O1xuXHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0czEgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAxXG5cblx0XHRcdFx0XHRcdHMxID0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDVcblxuXHRcdFx0XHRcdHMxID0gLSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggczEgPD0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHQvLyByZWdpb24gNFxuXG5cdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdC8vIHJlZ2lvbiAzXG5cblx0XHRcdFx0XHRzMCA9IDA7XG5cdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdHNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuXG5cblx0XHRcdHMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNlZ0V4dGVudDtcblx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0b3B0aW9uYWxQb2ludE9uUmF5LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHMwICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoIF9zZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIF9zZWdDZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzcXJEaXN0O1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0U3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSwgdGFyZ2V0ICkge1xuXG5cdFx0X3ZlY3RvciQyLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7XG5cdFx0dmFyIHRjYSA9IF92ZWN0b3IkMi5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cdFx0dmFyIGQyID0gX3ZlY3RvciQyLmRvdCggX3ZlY3RvciQyICkgLSB0Y2EgKiB0Y2E7XG5cdFx0dmFyIHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cztcblxuXHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHR2YXIgdGhjID0gTWF0aC5zcXJ0KCByYWRpdXMyIC0gZDIgKTtcblxuXHRcdC8vIHQwID0gZmlyc3QgaW50ZXJzZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlXG5cdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxuXHRcdHZhciB0MSA9IHRjYSArIHRoYztcblxuXHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdGlmICggdDAgPCAwICYmIHQxIDwgMCApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6XG5cdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdC8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4gYW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS5cblx0XHRpZiAoIHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgdGFyZ2V0ICk7XG5cblx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdHJldHVybiB0aGlzLmF0KCB0MCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQgc2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWRcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcblxuXHR9LFxuXG5cdGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApO1xuXG5cdFx0aWYgKCB0ID09PSBudWxsICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmF0KCB0LCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3RcblxuXHRcdHZhciBkaXN0VG9Qb2ludCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdGlmICggZGlzdFRvUG9pbnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0Qm94OiBmdW5jdGlvbiAoIGJveCwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0dmFyIGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCxcblx0XHRcdGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSxcblx0XHRcdGludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejtcblxuXHRcdHZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcblxuXHRcdGlmICggaW52ZGlyeCA+PSAwICkge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH1cblxuXHRcdGlmICggaW52ZGlyeSA+PSAwICkge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gVGhlc2UgbGluZXMgYWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdG1pbiBvciB0bWF4IGlzIE5hTlxuXHRcdC8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYgeCBpcyBOYU5cblxuXHRcdGlmICggdHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHltaW47XG5cblx0XHRpZiAoIHR5bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR5bWF4O1xuXG5cdFx0aWYgKCBpbnZkaXJ6ID49IDAgKSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHptYXggKSB8fCAoIHR6bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHRpZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluO1xuXG5cdFx0aWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDtcblxuXHRcdC8vcmV0dXJuIHBvaW50IGNsb3Nlc3QgdG8gdGhlIHJheSAocG9zaXRpdmUgc2lkZSlcblxuXHRcdGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLmF0KCB0bWluID49IDAgPyB0bWluIDogdG1heCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdEJveCggYm94LCBfdmVjdG9yJDIgKSAhPT0gbnVsbDtcblxuXHR9LFxuXG5cdGludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaFxuXG5cdFx0X2VkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRfZWRnZTIuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF9ub3JtYWwuY3Jvc3NWZWN0b3JzKCBfZWRnZTEsIF9lZGdlMiApO1xuXG5cdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXG5cdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxuXHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggX25vcm1hbCApO1xuXHRcdHZhciBzaWduO1xuXG5cdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRpZiAoIGJhY2tmYWNlQ3VsbGluZyApIHJldHVybiBudWxsO1xuXHRcdFx0c2lnbiA9IDE7XG5cblx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRzaWduID0gLSAxO1xuXHRcdFx0RGROID0gLSBEZE47XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdF9kaWZmLnN1YlZlY3RvcnMoIHRoaXMub3JpZ2luLCBhICk7XG5cdFx0dmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMi5jcm9zc1ZlY3RvcnMoIF9kaWZmLCBfZWRnZTIgKSApO1xuXG5cdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkUXhFMiA8IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMS5jcm9zcyggX2RpZmYgKSApO1xuXG5cdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdHZhciBRZE4gPSAtIHNpZ24gKiBfZGlmZi5kb3QoIF9ub3JtYWwgKTtcblxuXHRcdC8vIHQgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIFFkTiA8IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gUmF5IGludGVyc2VjdHMgdHJpYW5nbGUuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgX3ZlY3RvcjEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF92ZWN0b3IyID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdGlzUGxhbmU6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudHM6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMubm9ybWFsLnNldCggeCwgeSwgeiApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBvaW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IC0gcG9pbnQuZG90KCB0aGlzLm5vcm1hbCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHM6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHZhciBub3JtYWwgPSBfdmVjdG9yMS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIF92ZWN0b3IyLnN1YlZlY3RvcnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMgaW52YWxpZC5cblxuXHRcdHZhciBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0fSxcblxuXHRwcm9qZWN0UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgKS5hZGQoIHBvaW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAoIGxpbmUsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaW50ZXJzZWN0TGluZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRpcmVjdGlvbiA9IGxpbmUuZGVsdGEoIF92ZWN0b3IxICk7XG5cblx0XHR2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxuXHRcdFx0aWYgKCB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFVuc3VyZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhpcyBjYXNlLlxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH1cblxuXHRcdHZhciB0ID0gLSAoIGxpbmUuc3RhcnQuZG90KCB0aGlzLm5vcm1hbCApICsgdGhpcy5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XG5cblx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgX25vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCBfdmVjdG9yMSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfdjAkMSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3YxJDMgPSBuZXcgVmVjdG9yMygpO1xudmFyIF92MiQxID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfdjMgPSBuZXcgVmVjdG9yMygpO1xuXG52YXIgX3ZhYiA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZhYyA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZiYyA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZhcCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZicCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZjcCA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCBhLCBiLCBjICkge1xuXG5cdHRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRnZXROb3JtYWw6IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zdWJWZWN0b3JzKCBjLCBiICk7XG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdHRhcmdldC5jcm9zcyggX3YwJDEgKTtcblxuXHRcdHZhciB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xuXHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCB0YXJnZXRMZW5ndGhTcSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdH0sXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRfdjAkMS5zdWJWZWN0b3JzKCBjLCBhICk7XG5cdFx0X3YxJDMuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdF92MiQxLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHR2YXIgZG90MDAgPSBfdjAkMS5kb3QoIF92MCQxICk7XG5cdFx0dmFyIGRvdDAxID0gX3YwJDEuZG90KCBfdjEkMyApO1xuXHRcdHZhciBkb3QwMiA9IF92MCQxLmRvdCggX3YyJDEgKTtcblx0XHR2YXIgZG90MTEgPSBfdjEkMy5kb3QoIF92MSQzICk7XG5cdFx0dmFyIGRvdDEyID0gX3YxJDMuZG90KCBfdjIkMSApO1xuXG5cdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZVxuXHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdC8vIGFyYml0cmFyeSBsb2NhdGlvbiBvdXRzaWRlIG9mIHRyaWFuZ2xlP1xuXHRcdFx0Ly8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZFxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdHZhciBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdHZhciB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiApICogaW52RGVub207XG5cblx0XHQvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5cyBzdW0gdG8gMVxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCBfdjMgKTtcblxuXHRcdHJldHVybiAoIF92My54ID49IDAgKSAmJiAoIF92My55ID49IDAgKSAmJiAoICggX3YzLnggKyBfdjMueSApIDw9IDEgKTtcblxuXHR9LFxuXG5cdGdldFVWOiBmdW5jdGlvbiAoIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzLCB0YXJnZXQgKSB7XG5cblx0XHR0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHAxLCBwMiwgcDMsIF92MyApO1xuXG5cdFx0dGFyZ2V0LnNldCggMCwgMCApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHV2MSwgX3YzLnggKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCB1djIsIF92My55ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYzLCBfdjMueiApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGlzRnJvbnRGYWNpbmc6IGZ1bmN0aW9uICggYSwgYiwgYywgZGlyZWN0aW9uICkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIGEsIGIgKTtcblxuXHRcdC8vIHN0cmljdGx5IGZyb250IGZhY2luZ1xuXHRcdHJldHVybiAoIF92MCQxLmNyb3NzKCBfdjEkMyApLmRvdCggZGlyZWN0aW9uICkgPCAwICkgPyB0cnVlIDogZmFsc2U7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIGEgKTtcblx0XHR0aGlzLmIuY29weSggYiApO1xuXHRcdHRoaXMuYy5jb3B5KCBjICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzOiBmdW5jdGlvbiAoIHBvaW50cywgaTAsIGkxLCBpMiApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTtcblx0XHR0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7XG5cdFx0dGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7XG5cdFx0dGhpcy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTtcblx0XHR0aGlzLmMuY29weSggdHJpYW5nbGUuYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRBcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRfdjAkMS5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7XG5cblx0XHRyZXR1cm4gX3YwJDEuY3Jvc3MoIF92MSQzICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0fSxcblxuXHRnZXRNaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGdldFBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFBsYW5lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRnZXRVVjogZnVuY3Rpb24gKCBwb2ludCwgdXYxLCB1djIsIHV2MywgdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldFVWKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdXYxLCB1djIsIHV2MywgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRpc0Zyb250RmFjaW5nOiBmdW5jdGlvbiAoIGRpcmVjdGlvbiApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5pc0Zyb250RmFjaW5nKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYSA9IHRoaXMuYSwgYiA9IHRoaXMuYiwgYyA9IHRoaXMuYztcblx0XHR2YXIgdiwgdztcblxuXHRcdC8vIGFsZ29yaXRobSB0aGFua3MgdG8gUmVhbC1UaW1lIENvbGxpc2lvbiBEZXRlY3Rpb24gYnkgQ2hyaXN0ZXIgRXJpY3Nvbixcblx0XHQvLyBwdWJsaXNoZWQgYnkgTW9yZ2FuIEthdWZtYW5uIFB1Ymxpc2hlcnMsIChjKSAyMDA1IEVsc2V2aWVyIEluYy4sXG5cdFx0Ly8gdW5kZXIgdGhlIGFjY29tcGFueWluZyBsaWNlbnNlOyBzZWUgY2hhcHRlciA1LjEuNSBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uXG5cdFx0Ly8gYmFzaWNhbGx5LCB3ZSdyZSBkaXN0aW5ndWlzaGluZyB3aGljaCBvZiB0aGUgdm9yb25vaSByZWdpb25zIG9mIHRoZSB0cmlhbmdsZVxuXHRcdC8vIHRoZSBwb2ludCBsaWVzIGluIHdpdGggdGhlIG1pbmltdW0gYW1vdW50IG9mIHJlZHVuZGFudCBjb21wdXRhdGlvbi5cblxuXHRcdF92YWIuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdF92YWMuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF92YXAuc3ViVmVjdG9ycyggcCwgYSApO1xuXHRcdHZhciBkMSA9IF92YWIuZG90KCBfdmFwICk7XG5cdFx0dmFyIGQyID0gX3ZhYy5kb3QoIF92YXAgKTtcblx0XHRpZiAoIGQxIDw9IDAgJiYgZDIgPD0gMCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBBOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEsIDAsIDApXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKTtcblxuXHRcdH1cblxuXHRcdF92YnAuc3ViVmVjdG9ycyggcCwgYiApO1xuXHRcdHZhciBkMyA9IF92YWIuZG90KCBfdmJwICk7XG5cdFx0dmFyIGQ0ID0gX3ZhYy5kb3QoIF92YnAgKTtcblx0XHRpZiAoIGQzID49IDAgJiYgZDQgPD0gZDMgKSB7XG5cblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQjsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAxLCAwKVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdmMgPSBkMSAqIGQ0IC0gZDMgKiBkMjtcblx0XHRpZiAoIHZjIDw9IDAgJiYgZDEgPj0gMCAmJiBkMyA8PSAwICkge1xuXG5cdFx0XHR2ID0gZDEgLyAoIGQxIC0gZDMgKTtcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdiwgdiwgMClcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApO1xuXG5cdFx0fVxuXG5cdFx0X3ZjcC5zdWJWZWN0b3JzKCBwLCBjICk7XG5cdFx0dmFyIGQ1ID0gX3ZhYi5kb3QoIF92Y3AgKTtcblx0XHR2YXIgZDYgPSBfdmFjLmRvdCggX3ZjcCApO1xuXHRcdGlmICggZDYgPj0gMCAmJiBkNSA8PSBkNiApIHtcblxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDAsIDEpXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGMgKTtcblxuXHRcdH1cblxuXHRcdHZhciB2YiA9IGQ1ICogZDIgLSBkMSAqIGQ2O1xuXHRcdGlmICggdmIgPD0gMCAmJiBkMiA+PSAwICYmIGQ2IDw9IDAgKSB7XG5cblx0XHRcdHcgPSBkMiAvICggZDIgLSBkNiApO1xuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQUM7IGJhcnljZW50cmljIGNvb3JkcyAoMS13LCAwLCB3KVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICkuYWRkU2NhbGVkVmVjdG9yKCBfdmFjLCB3ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdmEgPSBkMyAqIGQ2IC0gZDUgKiBkNDtcblx0XHRpZiAoIHZhIDw9IDAgJiYgKCBkNCAtIGQzICkgPj0gMCAmJiAoIGQ1IC0gZDYgKSA+PSAwICkge1xuXG5cdFx0XHRfdmJjLnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdHcgPSAoIGQ0IC0gZDMgKSAvICggKCBkNCAtIGQzICkgKyAoIGQ1IC0gZDYgKSApO1xuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQkM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMS13LCB3KVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICkuYWRkU2NhbGVkVmVjdG9yKCBfdmJjLCB3ICk7IC8vIGVkZ2UgcmVnaW9uIG9mIEJDXG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHJlZ2lvblxuXHRcdHZhciBkZW5vbSA9IDEgLyAoIHZhICsgdmIgKyB2YyApO1xuXHRcdC8vIHUgPSB2YSAqIGRlbm9tXG5cdFx0diA9IHZiICogZGVub207XG5cdFx0dyA9IHZjICogZGVub207XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWMsIHcgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfY29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLFxuXHQnYmVpZ2UnOiAweEY1RjVEQywgJ2Jpc3F1ZSc6IDB4RkZFNEM0LCAnYmxhY2snOiAweDAwMDAwMCwgJ2JsYW5jaGVkYWxtb25kJzogMHhGRkVCQ0QsICdibHVlJzogMHgwMDAwRkYsICdibHVldmlvbGV0JzogMHg4QTJCRTIsXG5cdCdicm93bic6IDB4QTUyQTJBLCAnYnVybHl3b29kJzogMHhERUI4ODcsICdjYWRldGJsdWUnOiAweDVGOUVBMCwgJ2NoYXJ0cmV1c2UnOiAweDdGRkYwMCwgJ2Nob2NvbGF0ZSc6IDB4RDI2OTFFLCAnY29yYWwnOiAweEZGN0Y1MCxcblx0J2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsXG5cdCdkYXJrZ29sZGVucm9kJzogMHhCODg2MEIsICdkYXJrZ3JheSc6IDB4QTlBOUE5LCAnZGFya2dyZWVuJzogMHgwMDY0MDAsICdkYXJrZ3JleSc6IDB4QTlBOUE5LCAnZGFya2toYWtpJzogMHhCREI3NkIsICdkYXJrbWFnZW50YSc6IDB4OEIwMDhCLFxuXHQnZGFya29saXZlZ3JlZW4nOiAweDU1NkIyRiwgJ2RhcmtvcmFuZ2UnOiAweEZGOEMwMCwgJ2RhcmtvcmNoaWQnOiAweDk5MzJDQywgJ2RhcmtyZWQnOiAweDhCMDAwMCwgJ2RhcmtzYWxtb24nOiAweEU5OTY3QSwgJ2RhcmtzZWFncmVlbic6IDB4OEZCQzhGLFxuXHQnZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLFxuXHQnZGVlcHBpbmsnOiAweEZGMTQ5MywgJ2RlZXBza3libHVlJzogMHgwMEJGRkYsICdkaW1ncmF5JzogMHg2OTY5NjksICdkaW1ncmV5JzogMHg2OTY5NjksICdkb2RnZXJibHVlJzogMHgxRTkwRkYsICdmaXJlYnJpY2snOiAweEIyMjIyMixcblx0J2Zsb3JhbHdoaXRlJzogMHhGRkZBRjAsICdmb3Jlc3RncmVlbic6IDB4MjI4QjIyLCAnZnVjaHNpYSc6IDB4RkYwMEZGLCAnZ2FpbnNib3JvJzogMHhEQ0RDREMsICdnaG9zdHdoaXRlJzogMHhGOEY4RkYsICdnb2xkJzogMHhGRkQ3MDAsXG5cdCdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCxcblx0J2luZGlhbnJlZCc6IDB4Q0Q1QzVDLCAnaW5kaWdvJzogMHg0QjAwODIsICdpdm9yeSc6IDB4RkZGRkYwLCAna2hha2knOiAweEYwRTY4QywgJ2xhdmVuZGVyJzogMHhFNkU2RkEsICdsYXZlbmRlcmJsdXNoJzogMHhGRkYwRjUsICdsYXduZ3JlZW4nOiAweDdDRkMwMCxcblx0J2xlbW9uY2hpZmZvbic6IDB4RkZGQUNELCAnbGlnaHRibHVlJzogMHhBREQ4RTYsICdsaWdodGNvcmFsJzogMHhGMDgwODAsICdsaWdodGN5YW4nOiAweEUwRkZGRiwgJ2xpZ2h0Z29sZGVucm9keWVsbG93JzogMHhGQUZBRDIsICdsaWdodGdyYXknOiAweEQzRDNEMyxcblx0J2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsXG5cdCdsaWdodHNsYXRlZ3JheSc6IDB4Nzc4ODk5LCAnbGlnaHRzbGF0ZWdyZXknOiAweDc3ODg5OSwgJ2xpZ2h0c3RlZWxibHVlJzogMHhCMEM0REUsICdsaWdodHllbGxvdyc6IDB4RkZGRkUwLCAnbGltZSc6IDB4MDBGRjAwLCAnbGltZWdyZWVuJzogMHgzMkNEMzIsXG5cdCdsaW5lbic6IDB4RkFGMEU2LCAnbWFnZW50YSc6IDB4RkYwMEZGLCAnbWFyb29uJzogMHg4MDAwMDAsICdtZWRpdW1hcXVhbWFyaW5lJzogMHg2NkNEQUEsICdtZWRpdW1ibHVlJzogMHgwMDAwQ0QsICdtZWRpdW1vcmNoaWQnOiAweEJBNTVEMyxcblx0J21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLFxuXHQnbWVkaXVtdmlvbGV0cmVkJzogMHhDNzE1ODUsICdtaWRuaWdodGJsdWUnOiAweDE5MTk3MCwgJ21pbnRjcmVhbSc6IDB4RjVGRkZBLCAnbWlzdHlyb3NlJzogMHhGRkU0RTEsICdtb2NjYXNpbic6IDB4RkZFNEI1LCAnbmF2YWpvd2hpdGUnOiAweEZGREVBRCxcblx0J25hdnknOiAweDAwMDA4MCwgJ29sZGxhY2UnOiAweEZERjVFNiwgJ29saXZlJzogMHg4MDgwMDAsICdvbGl2ZWRyYWInOiAweDZCOEUyMywgJ29yYW5nZSc6IDB4RkZBNTAwLCAnb3JhbmdlcmVkJzogMHhGRjQ1MDAsICdvcmNoaWQnOiAweERBNzBENixcblx0J3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksXG5cdCdwZXJ1JzogMHhDRDg1M0YsICdwaW5rJzogMHhGRkMwQ0IsICdwbHVtJzogMHhEREEwREQsICdwb3dkZXJibHVlJzogMHhCMEUwRTYsICdwdXJwbGUnOiAweDgwMDA4MCwgJ3JlYmVjY2FwdXJwbGUnOiAweDY2MzM5OSwgJ3JlZCc6IDB4RkYwMDAwLCAncm9zeWJyb3duJzogMHhCQzhGOEYsXG5cdCdyb3lhbGJsdWUnOiAweDQxNjlFMSwgJ3NhZGRsZWJyb3duJzogMHg4QjQ1MTMsICdzYWxtb24nOiAweEZBODA3MiwgJ3NhbmR5YnJvd24nOiAweEY0QTQ2MCwgJ3NlYWdyZWVuJzogMHgyRThCNTcsICdzZWFzaGVsbCc6IDB4RkZGNUVFLFxuXHQnc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSxcblx0J3NwcmluZ2dyZWVuJzogMHgwMEZGN0YsICdzdGVlbGJsdWUnOiAweDQ2ODJCNCwgJ3Rhbic6IDB4RDJCNDhDLCAndGVhbCc6IDB4MDA4MDgwLCAndGhpc3RsZSc6IDB4RDhCRkQ4LCAndG9tYXRvJzogMHhGRjYzNDcsICd0dXJxdW9pc2UnOiAweDQwRTBEMCxcblx0J3Zpb2xldCc6IDB4RUU4MkVFLCAnd2hlYXQnOiAweEY1REVCMywgJ3doaXRlJzogMHhGRkZGRkYsICd3aGl0ZXNtb2tlJzogMHhGNUY1RjUsICd5ZWxsb3cnOiAweEZGRkYwMCwgJ3llbGxvd2dyZWVuJzogMHg5QUNEMzIgfTtcblxudmFyIF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XG52YXIgX2hzbEIgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTtcblxuZnVuY3Rpb24gQ29sb3IoIHIsIGcsIGIgKSB7XG5cblx0aWYgKCBnID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Ly8gciBpcyBUSFJFRS5Db2xvciwgaGV4IG9yIHN0cmluZ1xuXHRcdHJldHVybiB0aGlzLnNldCggciApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcy5zZXRSR0IoIHIsIGcsIGIgKTtcblxufVxuXG5mdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xuXG5cdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdGlmICggdCA+IDEgKSB0IC09IDE7XG5cdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcblx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xuXHRyZXR1cm4gcDtcblxufVxuXG5mdW5jdGlvbiBTUkdCVG9MaW5lYXIoIGMgKSB7XG5cblx0cmV0dXJuICggYyA8IDAuMDQwNDUgKSA/IGMgKiAwLjA3NzM5OTM4MDggOiBNYXRoLnBvdyggYyAqIDAuOTQ3ODY3Mjk4NiArIDAuMDUyMTMyNzAxNCwgMi40ICk7XG5cbn1cblxuZnVuY3Rpb24gTGluZWFyVG9TUkdCKCBjICkge1xuXG5cdHJldHVybiAoIGMgPCAwLjAwMzEzMDggKSA/IGMgKiAxMi45MiA6IDEuMDU1ICogKCBNYXRoLnBvdyggYywgMC40MTY2NiApICkgLSAwLjA1NTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb2xvci5wcm90b3R5cGUsIHtcblxuXHRpc0NvbG9yOiB0cnVlLFxuXG5cdHI6IDEsIGc6IDEsIGI6IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHZhbHVlICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHR0aGlzLnNldEhleCggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRcdHRoaXMuc2V0U3R5bGUoIHZhbHVlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnIgPSBzY2FsYXI7XG5cdFx0dGhpcy5nID0gc2NhbGFyO1xuXHRcdHRoaXMuYiA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SGV4OiBmdW5jdGlvbiAoIGhleCApIHtcblxuXHRcdGhleCA9IE1hdGguZmxvb3IoIGhleCApO1xuXG5cdFx0dGhpcy5yID0gKCBoZXggPj4gMTYgJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAyNTU7XG5cdFx0dGhpcy5iID0gKCBoZXggJiAyNTUgKSAvIDI1NTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UkdCOiBmdW5jdGlvbiAoIHIsIGcsIGIgKSB7XG5cblx0XHR0aGlzLnIgPSByO1xuXHRcdHRoaXMuZyA9IGc7XG5cdFx0dGhpcy5iID0gYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SFNMOiBmdW5jdGlvbiAoIGgsIHMsIGwgKSB7XG5cblx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxuXHRcdGggPSBNYXRoVXRpbHMuZXVjbGlkZWFuTW9kdWxvKCBoLCAxICk7XG5cdFx0cyA9IE1hdGhVdGlscy5jbGFtcCggcywgMCwgMSApO1xuXHRcdGwgPSBNYXRoVXRpbHMuY2xhbXAoIGwsIDAsIDEgKTtcblxuXHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy5yID0gdGhpcy5nID0gdGhpcy5iID0gbDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHR2YXIgcSA9ICggMiAqIGwgKSAtIHA7XG5cblx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xuXHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKCBzdHlsZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb2xvck5hbWU6IGZ1bmN0aW9uICggc3R5bGUgKSB7XG5cblx0XHQvLyBjb2xvciBrZXl3b3Jkc1xuXHRcdHZhciBoZXggPSBfY29sb3JLZXl3b3Jkc1sgc3R5bGUgXTtcblxuXHRcdGlmICggaGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIHJlZFxuXHRcdFx0dGhpcy5zZXRIZXgoIGhleCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBjb2xvci5yO1xuXHRcdHRoaXMuZyA9IGNvbG9yLmc7XG5cdFx0dGhpcy5iID0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUxpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR2YXIgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAxLjAgLyBnYW1tYUZhY3RvciApIDogMS4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0dGhpcy5jb3B5R2FtbWFUb0xpbmVhciggdGhpcywgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICggZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHR0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKCB0aGlzLCBnYW1tYUZhY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5U1JHQlRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gU1JHQlRvTGluZWFyKCBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb1NSR0I6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcblx0XHR0aGlzLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydFNSR0JUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRMaW5lYXJUb1NSR0I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29weUxpbmVhclRvU1JHQiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoIGgsIHMsIGwgKSB7XG5cblx0XHR0aGlzLmdldEhTTCggX2hzbEEgKTtcblxuXHRcdF9oc2xBLmggKz0gaDsgX2hzbEEucyArPSBzOyBfaHNsQS5sICs9IGw7XG5cblx0XHR0aGlzLnNldEhTTCggX2hzbEEuaCwgX2hzbEEucywgX2hzbEEubCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKz0gY29sb3Iucjtcblx0XHR0aGlzLmcgKz0gY29sb3IuZztcblx0XHR0aGlzLmIgKz0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkQ29sb3JzOiBmdW5jdGlvbiAoIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3IxLnIgKyBjb2xvcjIucjtcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICs9IHM7XG5cdFx0dGhpcy5nICs9IHM7XG5cdFx0dGhpcy5iICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IE1hdGgubWF4KCAwLCB0aGlzLnIgLSBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5tYXgoIDAsIHRoaXMuZyAtIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciAqPSBjb2xvci5yO1xuXHRcdHRoaXMuZyAqPSBjb2xvci5nO1xuXHRcdHRoaXMuYiAqPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICo9IHM7XG5cdFx0dGhpcy5nICo9IHM7XG5cdFx0dGhpcy5iICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0dGhpcy5yICs9ICggY29sb3IuciAtIHRoaXMuciApICogYWxwaGE7XG5cdFx0dGhpcy5nICs9ICggY29sb3IuZyAtIHRoaXMuZyApICogYWxwaGE7XG5cdFx0dGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBIU0w6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0dGhpcy5nZXRIU0woIF9oc2xBICk7XG5cdFx0Y29sb3IuZ2V0SFNMKCBfaHNsQiApO1xuXG5cdFx0dmFyIGggPSBNYXRoVXRpbHMubGVycCggX2hzbEEuaCwgX2hzbEIuaCwgYWxwaGEgKTtcblx0XHR2YXIgcyA9IE1hdGhVdGlscy5sZXJwKCBfaHNsQS5zLCBfaHNsQi5zLCBhbHBoYSApO1xuXHRcdHZhciBsID0gTWF0aFV0aWxzLmxlcnAoIF9oc2xBLmwsIF9oc2xCLmwsIGFscGhhICk7XG5cblx0XHR0aGlzLnNldEhTTCggaCwgcywgbCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbkNvbG9yLk5BTUVTID0gX2NvbG9yS2V5d29yZHM7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0dGhpcy5hID0gYTtcblx0dGhpcy5iID0gYjtcblx0dGhpcy5jID0gYztcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICYmIG5vcm1hbC5pc1ZlY3RvcjMgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudmVydGV4Tm9ybWFscyA9IEFycmF5LmlzQXJyYXkoIG5vcm1hbCApID8gbm9ybWFsIDogW107XG5cblx0dGhpcy5jb2xvciA9ICggY29sb3IgJiYgY29sb3IuaXNDb2xvciApID8gY29sb3IgOiBuZXcgQ29sb3IoKTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBBcnJheS5pc0FycmF5KCBjb2xvciApID8gY29sb3IgOiBbXTtcblxuXHR0aGlzLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHtcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmEgPSBzb3VyY2UuYTtcblx0XHR0aGlzLmIgPSBzb3VyY2UuYjtcblx0XHR0aGlzLmMgPSBzb3VyY2UuYztcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHNvdXJjZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Q29sb3JzWyBpIF0gPSBzb3VyY2UudmVydGV4Q29sb3JzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdNYXRlcmlhbCc7XG5cblx0dGhpcy5mb2cgPSB0cnVlO1xuXG5cdHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcblx0dGhpcy5zaWRlID0gRnJvbnRTaWRlO1xuXHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gZmFsc2U7XG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IDB4ZmY7XG5cdHRoaXMuc3RlbmNpbEZ1bmMgPSBBbHdheXNTdGVuY2lsRnVuYztcblx0dGhpcy5zdGVuY2lsUmVmID0gMDtcblx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSAweGZmO1xuXHR0aGlzLnN0ZW5jaWxGYWlsID0gS2VlcFN0ZW5jaWxPcDtcblx0dGhpcy5zdGVuY2lsWkZhaWwgPSBLZWVwU3RlbmNpbE9wO1xuXHR0aGlzLnN0ZW5jaWxaUGFzcyA9IEtlZXBTdGVuY2lsT3A7XG5cdHRoaXMuc3RlbmNpbFdyaXRlID0gZmFsc2U7XG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7XG5cdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xuXHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XG5cblx0dGhpcy5zaGFkb3dTaWRlID0gbnVsbDtcblxuXHR0aGlzLmNvbG9yV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWxcblxuXHR0aGlzLnBvbHlnb25PZmZzZXQgPSBmYWxzZTtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwO1xuXG5cdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XG5cblx0dGhpcy5hbHBoYVRlc3QgPSAwO1xuXHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy50b25lTWFwcGVkID0gdHJ1ZTtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWF0ZXJpYWwsXG5cblx0aXNNYXRlcmlhbDogdHJ1ZSxcblxuXHRvbkJlZm9yZUNvbXBpbGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7XG5cblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiB2YWx1ZXMgKSB7XG5cblx0XHRcdHZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07XG5cblx0XHRcdGlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0ZXJpYWw6ICdcIiArIGtleSArIFwiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IGlmIHNoYWRpbmcgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvclxuXHRcdFx0aWYgKCBrZXkgPT09ICdzaGFkaW5nJyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdFx0dGhpcy5mbGF0U2hhZGluZyA9ICggbmV3VmFsdWUgPT09IEZsYXRTaGFkaW5nICkgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuXCIgKyB0aGlzLnR5cGUgKyBcIjogJ1wiICsga2V5ICsgXCInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLnNldCggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLmNvcHkoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuc2hlZW4gJiYgdGhpcy5zaGVlbi5pc0NvbG9yICkgZGF0YS5zaGVlbiA9IHRoaXMuc2hlZW4uZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciApIGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpO1xuXHRcdGlmICggdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAmJiB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyY29hdCA9IHRoaXMuY2xlYXJjb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJjb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0TWFwICYmIHRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5jbGVhcmNvYXRNYXAgPSB0aGlzLmNsZWFyY29hdE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCAmJiB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgJiYgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmNsZWFyY29hdE5vcm1hbE1hcCA9IHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubWF0Y2FwICYmIHRoaXMubWF0Y2FwLmlzVGV4dHVyZSApIGRhdGEubWF0Y2FwID0gdGhpcy5tYXRjYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMuYW9NYXAgJiYgdGhpcy5hb01hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuYW9NYXAgPSB0aGlzLmFvTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmFvTWFwSW50ZW5zaXR5ID0gdGhpcy5hb01hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbE1hcFR5cGUgPSB0aGlzLm5vcm1hbE1hcFR5cGU7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZGlzcGxhY2VtZW50TWFwICYmIHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRNYXAgPSB0aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzTWFwICYmIHRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEubWV0YWxuZXNzTWFwID0gdGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSApIGRhdGEuZW1pc3NpdmVNYXAgPSB0aGlzLmVtaXNzaXZlTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLnJlZmxlY3Rpdml0eSA9IHRoaXMucmVmbGVjdGl2aXR5OyAvLyBTY2FsZSBiZWhpbmQgZW52TWFwXG5cdFx0XHRkYXRhLnJlZnJhY3Rpb25SYXRpbyA9IHRoaXMucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0XHRpZiAoIHRoaXMuY29tYmluZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5jb21iaW5lID0gdGhpcy5jb21iaW5lO1xuXHRcdFx0aWYgKCB0aGlzLmVudk1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgZGF0YS5lbnZNYXBJbnRlbnNpdHkgPSB0aGlzLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgKSBkYXRhLnZlcnRleENvbG9ycyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICkgZGF0YS50cmFuc3BhcmVudCA9IHRoaXMudHJhbnNwYXJlbnQ7XG5cblx0XHRkYXRhLmRlcHRoRnVuYyA9IHRoaXMuZGVwdGhGdW5jO1xuXHRcdGRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7XG5cdFx0ZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlO1xuXG5cdFx0ZGF0YS5zdGVuY2lsV3JpdGUgPSB0aGlzLnN0ZW5jaWxXcml0ZTtcblx0XHRkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgPSB0aGlzLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRnVuYyA9IHRoaXMuc3RlbmNpbEZ1bmM7XG5cdFx0ZGF0YS5zdGVuY2lsUmVmID0gdGhpcy5zdGVuY2lsUmVmO1xuXHRcdGRhdGEuc3RlbmNpbEZ1bmNNYXNrID0gdGhpcy5zdGVuY2lsRnVuY01hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRmFpbCA9IHRoaXMuc3RlbmNpbEZhaWw7XG5cdFx0ZGF0YS5zdGVuY2lsWkZhaWwgPSB0aGlzLnN0ZW5jaWxaRmFpbDtcblx0XHRkYXRhLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzO1xuXG5cdFx0Ly8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKVxuXHRcdGlmICggdGhpcy5yb3RhdGlvbiAmJiB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIGRhdGEucG9seWdvbk9mZnNldCA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IDAgKSBkYXRhLnBvbHlnb25PZmZzZXRGYWN0b3IgPSB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICYmIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5tb3JwaE5vcm1hbHMgPT09IHRydWUgKSBkYXRhLm1vcnBoTm9ybWFscyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBkYXRhLnZpc2libGUgPSBmYWxzZTtcblxuXHRcdGlmICggdGhpcy50b25lTWFwcGVkID09PSBmYWxzZSApIGRhdGEudG9uZU1hcHBlZCA9IGZhbHNlO1xuXG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XG5cdFx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0dGhpcy5vcGFjaXR5ID0gc291cmNlLm9wYWNpdHk7XG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDtcblxuXHRcdHRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7XG5cdFx0dGhpcy5ibGVuZERzdCA9IHNvdXJjZS5ibGVuZERzdDtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb24gPSBzb3VyY2UuYmxlbmRFcXVhdGlvbjtcblx0XHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTtcblx0XHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBzb3VyY2UuYmxlbmREc3RBbHBoYTtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHR0aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7XG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0O1xuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IHNvdXJjZS5kZXB0aFdyaXRlO1xuXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gc291cmNlLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0dGhpcy5zdGVuY2lsRnVuYyA9IHNvdXJjZS5zdGVuY2lsRnVuYztcblx0XHR0aGlzLnN0ZW5jaWxSZWYgPSBzb3VyY2Uuc3RlbmNpbFJlZjtcblx0XHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IHNvdXJjZS5zdGVuY2lsRnVuY01hc2s7XG5cdFx0dGhpcy5zdGVuY2lsRmFpbCA9IHNvdXJjZS5zdGVuY2lsRmFpbDtcblx0XHR0aGlzLnN0ZW5jaWxaRmFpbCA9IHNvdXJjZS5zdGVuY2lsWkZhaWw7XG5cdFx0dGhpcy5zdGVuY2lsWlBhc3MgPSBzb3VyY2Uuc3RlbmNpbFpQYXNzO1xuXHRcdHRoaXMuc3RlbmNpbFdyaXRlID0gc291cmNlLnN0ZW5jaWxXcml0ZTtcblxuXHRcdHZhciBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXMsXG5cdFx0XHRkc3RQbGFuZXMgPSBudWxsO1xuXG5cdFx0aWYgKCBzcmNQbGFuZXMgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBuID0gc3JjUGxhbmVzLmxlbmd0aDtcblx0XHRcdGRzdFBsYW5lcyA9IG5ldyBBcnJheSggbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdFx0XHRkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5lc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gZHN0UGxhbmVzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xuXG5cdFx0dGhpcy50b25lTWFwcGVkID0gc291cmNlLnRvbmVNYXBwZWQ7XG5cblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIE1hdGVyaWFsLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIF92ZWN0b3IkMyA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMudXNhZ2UgPSBTdGF0aWNEcmF3VXNhZ2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldFVzYWdlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7XG5cblx0XHR0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLml0ZW1TaXplO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCBhcnJheSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY29sb3IgPSBjb2xvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHRjb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjNzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yNHNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQzLnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkMy55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDMueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDMuYXBwbHlNYXRyaXgzKCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDMueCwgX3ZlY3RvciQzLnksIF92ZWN0b3IkMy56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdF92ZWN0b3IkMy54ID0gdGhpcy5nZXRYKCBpICk7XG5cdFx0XHRfdmVjdG9yJDMueSA9IHRoaXMuZ2V0WSggaSApO1xuXHRcdFx0X3ZlY3RvciQzLnogPSB0aGlzLmdldFooIGkgKTtcblxuXHRcdFx0X3ZlY3RvciQzLmFwcGx5TWF0cml4NCggbSApO1xuXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3RvciQzLngsIF92ZWN0b3IkMy55LCBfdmVjdG9yJDMueiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU5vcm1hbE1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdF92ZWN0b3IkMy54ID0gdGhpcy5nZXRYKCBpICk7XG5cdFx0XHRfdmVjdG9yJDMueSA9IHRoaXMuZ2V0WSggaSApO1xuXHRcdFx0X3ZlY3RvciQzLnogPSB0aGlzLmdldFooIGkgKTtcblxuXHRcdFx0X3ZlY3RvciQzLmFwcGx5Tm9ybWFsTWF0cml4KCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDMueCwgX3ZlY3RvciQzLnksIF92ZWN0b3IkMy56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zZm9ybURpcmVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdF92ZWN0b3IkMy54ID0gdGhpcy5nZXRYKCBpICk7XG5cdFx0XHRfdmVjdG9yJDMueSA9IHRoaXMuZ2V0WSggaSApO1xuXHRcdFx0X3ZlY3RvciQzLnogPSB0aGlzLmdldFooIGkgKTtcblxuXHRcdFx0X3ZlY3RvciQzLnRyYW5zZm9ybURpcmVjdGlvbiggbSApO1xuXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3RvciQzLngsIF92ZWN0b3IkMy55LCBfdmVjdG9yJDMueiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcblx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcy5hcnJheSApLFxuXHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXG5cdFx0fTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3RHZW9tZXRyeSgpIHtcblxuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMubm9ybWFscyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLnV2cyA9IFtdO1xuXHR0aGlzLnV2czIgPSBbXTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0ge307XG5cblx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cblx0Ly8gdGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBEaXJlY3RHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRjb21wdXRlR3JvdXBzOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGdyb3VwO1xuXHRcdHZhciBncm91cHMgPSBbXTtcblx0XHR2YXIgbWF0ZXJpYWxJbmRleCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdC8vIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0Z3JvdXBzLnB1c2goIGdyb3VwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyb3VwID0ge1xuXHRcdFx0XHRcdHN0YXJ0OiBpICogMyxcblx0XHRcdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4XG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Z3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDtcblx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ncm91cHMgPSBncm91cHM7XG5cblx0fSxcblxuXHRmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnM7XG5cblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VWZXJ0ZXhVdnNbIDAgXS5sZW5ndGggPiAwO1xuXHRcdHZhciBoYXNGYWNlVmVydGV4VXYyID0gZmFjZVZlcnRleFV2c1sgMSBdICYmIGZhY2VWZXJ0ZXhVdnNbIDEgXS5sZW5ndGggPiAwO1xuXG5cdFx0Ly8gbW9ycGhzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXHRcdHZhciBtb3JwaFRhcmdldHNMZW5ndGggPSBtb3JwaFRhcmdldHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldHNMZW5ndGggPiAwICkge1xuXG5cdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaFRhcmdldHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGkgXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBtb3JwaFRhcmdldHNbIGkgXS5uYW1lLFxuXHRcdFx0XHQgXHRkYXRhOiBbXVxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uID0gbW9ycGhUYXJnZXRzUG9zaXRpb247XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhOb3JtYWxzO1xuXHRcdHZhciBtb3JwaE5vcm1hbHNMZW5ndGggPSBtb3JwaE5vcm1hbHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdGlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGkgXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBtb3JwaE5vcm1hbHNbIGkgXS5uYW1lLFxuXHRcdFx0XHQgXHRkYXRhOiBbXVxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5zXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5za2luSW5kaWNlcztcblx0XHR2YXIgc2tpbldlaWdodHMgPSBnZW9tZXRyeS5za2luV2VpZ2h0cztcblxuXHRcdHZhciBoYXNTa2luSW5kaWNlcyA9IHNraW5JbmRpY2VzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXHRcdHZhciBoYXNTa2luV2VpZ2h0cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdmVydGljZXMubGVuZ3RoID4gMCAmJiBmYWNlcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLmRhdGEucHVzaCggbW9ycGhUYXJnZXRbIGZhY2UuYSBdLCBtb3JwaFRhcmdldFsgZmFjZS5iIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGogXS52ZXJ0ZXhOb3JtYWxzWyBpIF07XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBqIF0uZGF0YS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3JwaE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2tpbnNcblxuXHRcdFx0aWYgKCBoYXNTa2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGZhY2UuYSBdLCBza2luV2VpZ2h0c1sgZmFjZS5iIF0sIHNraW5XZWlnaHRzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7XG5cblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTtcblxuXHR2YXIgbWF4ID0gYXJyYXlbIDAgXTtcblxuXHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xuXG5cdFx0aWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIG1heDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWRcblxudmFyIF9tMSQyID0gbmV3IE1hdHJpeDQoKTtcbnZhciBfb2JqID0gbmV3IE9iamVjdDNEKCk7XG52YXIgX29mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX2JveCQyID0gbmV3IEJveDMoKTtcbnZhciBfYm94TW9ycGhUYXJnZXRzID0gbmV3IEJveDMoKTtcbnZhciBfdmVjdG9yJDQgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9idWZmZXJHZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLmluZGV4ID0gbnVsbDtcblx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGZhbHNlO1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG59XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCdWZmZXJHZW9tZXRyeSxcblxuXHRpc0J1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGdldEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbmRleDtcblxuXHR9LFxuXG5cdHNldEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbmRleCApICkge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IGluZGV4O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0fSxcblxuXHRzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRlbGV0ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRHcm91cDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwXG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRjbGVhckdyb3VwczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR9LFxuXG5cdHNldERyYXdSYW5nZTogZnVuY3Rpb24gKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwb3NpdGlvbi5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbC5hcHBseU5vcm1hbE1hdHJpeCggbm9ybWFsTWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgdGFuZ2VudCA9IHRoaXMuYXR0cmlidXRlcy50YW5nZW50O1xuXG5cdFx0aWYgKCB0YW5nZW50ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRhbmdlbnQudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKTtcblxuXHRcdFx0dGFuZ2VudC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0X20xJDIubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEkMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdF9tMSQyLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xJDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCBhbmdsZSApIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHRfbTEkMi5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSQyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHRfbTEkMi5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEkMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdF9tMSQyLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSQyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRfb2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRfb2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9vYmoubWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBfb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHR0aGlzLnRyYW5zbGF0ZSggX29mZnNldC54LCBfb2Zmc2V0LnksIF9vZmZzZXQueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQuZGF0YS5sZW5ndGggKiAzLCAzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uYW1lID0gbW9ycGhUYXJnZXQubmFtZTtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIG1vcnBoVGFyZ2V0LmRhdGEgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxuXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XG5cdFx0XHRcdFx0X2JveCQyLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XG5cblx0XHRcdFx0XHRcdF92ZWN0b3IkNC5hZGRWZWN0b3JzKCB0aGlzLmJvdW5kaW5nQm94Lm1pbiwgX2JveCQyLm1pbiApO1xuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yJDQgKTtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ0LmFkZFZlY3RvcnMoIHRoaXMuYm91bmRpbmdCb3gubWF4LCBfYm94JDIubWF4ICk7XG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IkNCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfYm94JDIubWluICk7XG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gkMi5tYXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi54ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnkgKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueiApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdC8vIGZpcnN0LCBmaW5kIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cblx0XHRcdF9ib3gkMi5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxuXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XG5cdFx0XHRcdFx0X2JveE1vcnBoVGFyZ2V0cy5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDQuYWRkVmVjdG9ycyggX2JveCQyLm1pbiwgX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMi5leHBhbmRCeVBvaW50KCBfdmVjdG9yJDQgKTtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ0LmFkZFZlY3RvcnMoIF9ib3gkMi5tYXgsIF9ib3hNb3JwaFRhcmdldHMubWF4ICk7XG5cdFx0XHRcdFx0XHRfYm94JDIuZXhwYW5kQnlQb2ludCggX3ZlY3RvciQ0ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRfYm94JDIuZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMi5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1heCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRfYm94JDIuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kLCB0cnkgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxuXG5cdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRfdmVjdG9yJDQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGkgKTtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yJDQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XG5cblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcblx0XHRcdFx0XHR2YXIgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG1vcnBoQXR0cmlidXRlLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdF92ZWN0b3IkNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgaiApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xuXG5cdFx0XHRcdFx0XHRcdF9vZmZzZXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGogKTtcblx0XHRcdFx0XHRcdFx0X3ZlY3RvciQ0LmFkZCggX29mZnNldCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IkNCApICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXHR9LFxuXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGV4LmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdHZBID0gaW5kaWNlc1sgaSArIDAgXSAqIDM7XG5cdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHR2QyA9IGluZGljZXNbIGkgKyAyIF0gKiAzO1xuXG5cdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZBICk7XG5cdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0cEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZDICk7XG5cblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIHZBIF0gKz0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIHZBICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyB2QiBdICs9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyB2QiArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgdkMgXSArPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgdkMgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKTtcblx0XHRcdFx0XHRwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTtcblx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDYgKTtcblxuXHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xuXHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xuXHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMSBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMiBdID0gY2IuejtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAzIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA0IF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA1IF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDYgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDcgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDggXSA9IGNiLno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpO1xuXG5cdFx0XHRhdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuICdcblx0XHRcdFx0KyAnVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLidcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUxID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkxID0gYXR0cmlidXRlMS5hcnJheTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTIgPSBhdHRyaWJ1dGUyLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlT2Zmc2V0ID0gYXR0cmlidXRlMi5pdGVtU2l6ZSAqIG9mZnNldDtcblx0XHRcdHZhciBsZW5ndGggPSBNYXRoLm1pbiggYXR0cmlidXRlQXJyYXkyLmxlbmd0aCwgYXR0cmlidXRlQXJyYXkxLmxlbmd0aCAtIGF0dHJpYnV0ZU9mZnNldCApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSBhdHRyaWJ1dGVPZmZzZXQ7IGkgPCBsZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDQueCA9IG5vcm1hbHMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ0LnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkNC56ID0gbm9ybWFscy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkNC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5zZXRYWVooIGksIF92ZWN0b3IkNC54LCBfdmVjdG9yJDQueSwgX3ZlY3RvciQ0LnogKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvTm9uSW5kZXhlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0XHR2YXIgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRcdHZhciBhcnJheTIgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGluZGljZXMubGVuZ3RoICogaXRlbVNpemUgKTtcblxuXHRcdFx0dmFyIGluZGV4ID0gMCwgaW5kZXgyID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgaXRlbVNpemU7IGogKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheTJbIGluZGV4MiArKyBdID0gYXJyYXlbIGluZGV4ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBpbmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTtcblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdC8vIGF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdHZhciBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKTtcblxuXHRcdFx0Z2VvbWV0cnkyLnNldEF0dHJpYnV0ZSggbmFtZSwgbmV3QXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIG1vcnBoQXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZVsgaSBdO1xuXG5cdFx0XHRcdHZhciBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKTtcblxuXHRcdFx0XHRtb3JwaEFycmF5LnB1c2goIG5ld0F0dHJpYnV0ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Mi5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IG1vcnBoQXJyYXk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeTIubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xuXG5cdFx0Ly8gZ3JvdXBzXG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdCdWZmZXJHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0J1ZmZlckdlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgQnVmZmVyR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuaW5kZXggPSB7XG5cdFx0XHRcdHR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVEYXRhID0gYXR0cmlidXRlLnRvSlNPTigpO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSAnJyApIGF0dHJpYnV0ZURhdGEubmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSBhdHRyaWJ1dGVEYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdHZhciBoYXNNb3JwaEF0dHJpYnV0ZXMgPSBmYWxzZTtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheSA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBrZXkgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbIGkgXTtcblxuXHRcdFx0XHR2YXIgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZS50b0pTT04oKTtcblxuXHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSAnJyApIGF0dHJpYnV0ZURhdGEubmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZURhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGFycmF5Lmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0bW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5O1xuXG5cdFx0XHRcdGhhc01vcnBoQXR0cmlidXRlcyA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaGFzTW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRkYXRhLmRhdGEubW9ycGhBdHRyaWJ1dGVzID0gbW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0ZGF0YS5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7XG5cdFx0XHRcdGNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcblx0XHRcdFx0cmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXNcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgbmFtZSwgaSwgbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIGluZGV4XG5cblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBzb3VyY2UubW9ycGhUYXJnZXRzUmVsYXRpdmU7XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdC8vIHVzZXIgZGF0YVxuXG5cdFx0dGhpcy51c2VyRGF0YSA9IHNvdXJjZS51c2VyRGF0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tL1xuICovXG5cbnZhciBfaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3JheSA9IG5ldyBSYXkoKTtcbnZhciBfc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG52YXIgX3ZBID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfdkIgPSBuZXcgVmVjdG9yMygpO1xudmFyIF92QyA9IG5ldyBWZWN0b3IzKCk7XG5cbnZhciBfdGVtcEEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF90ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3RlbXBDID0gbmV3IFZlY3RvcjMoKTtcblxudmFyIF9tb3JwaEEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9tb3JwaEIgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9tb3JwaEMgPSBuZXcgVmVjdG9yMygpO1xuXG52YXIgX3V2QSA9IG5ldyBWZWN0b3IyKCk7XG52YXIgX3V2QiA9IG5ldyBWZWN0b3IyKCk7XG52YXIgX3V2QyA9IG5ldyBWZWN0b3IyKCk7XG5cbnZhciBfaW50ZXJzZWN0aW9uUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCk7XG5cblx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcblxufVxuXG5NZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1lc2gsXG5cblx0aXNNZXNoOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIG0sIG1sLCBuYW1lO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvL1xuXG5cdFx0X2ludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4ICk7XG5cblx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGludGVyc2VjdGlvbjtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIGEsIGIsIGM7XG5cdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHR2YXIgbW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdHZhciBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xuXHRcdFx0dmFyIHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcblx0XHRcdHZhciB1djIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2Mjtcblx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cdFx0XHR2YXIgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xuXHRcdFx0dmFyIGksIGosIGlsLCBqbDtcblx0XHRcdHZhciBncm91cCwgZ3JvdXBNYXRlcmlhbDtcblx0XHRcdHZhciBzdGFydCwgZW5kO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0Z3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0XHRcdGVuZCA9IE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBqID0gc3RhcnQsIGpsID0gZW5kOyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0XHRhID0gaW5kZXguZ2V0WCggaiApO1xuXHRcdFx0XHRcdFx0XHRiID0gaW5kZXguZ2V0WCggaiArIDEgKTtcblx0XHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGogKyAyICk7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgZ3JvdXBNYXRlcmlhbCwgcmF5Y2FzdGVyLCBfcmF5LCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UubWF0ZXJpYWxJbmRleCA9IGdyb3VwLm1hdGVyaWFsSW5kZXg7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdFx0ZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIG1hdGVyaWFsLCByYXljYXN0ZXIsIF9yYXksIHBvc2l0aW9uLCBtb3JwaFBvc2l0aW9uLCBtb3JwaFRhcmdldHNSZWxhdGl2ZSwgdXYsIHV2MiwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIG5vbi1pbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0Z3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdFx0XHRlbmQgPSBNYXRoLm1pbiggKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICksICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdFx0YSA9IGo7XG5cdFx0XHRcdFx0XHRcdGIgPSBqICsgMTtcblx0XHRcdFx0XHRcdFx0YyA9IGogKyAyO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIG5vbi1pbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZS5tYXRlcmlhbEluZGV4ID0gZ3JvdXAubWF0ZXJpYWxJbmRleDtcblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0XHRlbmQgPSBNYXRoLm1pbiggcG9zaXRpb24uY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRhID0gaTtcblx0XHRcdFx0XHRcdGIgPSBpICsgMTtcblx0XHRcdFx0XHRcdGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgZnZBLCBmdkIsIGZ2Qztcblx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdFx0dmFyIHV2cztcblxuXHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0XHRpZiAoIGZhY2VWZXJ0ZXhVdnMubGVuZ3RoID4gMCApIHV2cyA9IGZhY2VWZXJ0ZXhVdnM7XG5cblx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBmIF07XG5cdFx0XHRcdHZhciBmYWNlTWF0ZXJpYWwgPSBpc011bHRpTWF0ZXJpYWwgPyBtYXRlcmlhbFsgZmFjZS5tYXRlcmlhbEluZGV4IF0gOiBtYXRlcmlhbDtcblxuXHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0ZnZBID0gdmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHRmdkIgPSB2ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgZmFjZU1hdGVyaWFsLCByYXljYXN0ZXIsIF9yYXksIGZ2QSwgZnZCLCBmdkMsIF9pbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0aWYgKCB1dnMgJiYgdXZzWyBmIF0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0X3V2QS5jb3B5KCB1dnNfZlsgMCBdICk7XG5cdFx0XHRcdFx0XHRfdXZCLmNvcHkoIHV2c19mWyAxIF0gKTtcblx0XHRcdFx0XHRcdF91dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24udXYgPSBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdGlvblBvaW50LCBmdkEsIGZ2QiwgZnZDLCBfdXZBLCBfdXZCLCBfdXZDLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGY7XG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcEEsIHBCLCBwQywgcG9pbnQgKSB7XG5cblx0dmFyIGludGVyc2VjdDtcblxuXHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0fVxuXG5cdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0X2ludGVyc2VjdGlvblBvaW50V29ybGQuY29weSggcG9pbnQgKTtcblx0X2ludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApO1xuXG5cdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRyZXR1cm4ge1xuXHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRwb2ludDogX2ludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSxcblx0XHRvYmplY3Q6IG9iamVjdFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKSB7XG5cblx0X3ZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7XG5cdF92Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYiApO1xuXHRfdkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGMgKTtcblxuXHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcyApIHtcblxuXHRcdF9tb3JwaEEuc2V0KCAwLCAwLCAwICk7XG5cdFx0X21vcnBoQi5zZXQoIDAsIDAsIDAgKTtcblx0XHRfbW9ycGhDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIGkgXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoUG9zaXRpb25bIGkgXTtcblxuXHRcdFx0aWYgKCBpbmZsdWVuY2UgPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0X3RlbXBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBhICk7XG5cdFx0XHRfdGVtcEIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGIgKTtcblx0XHRcdF90ZW1wQy5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgYyApO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xuXG5cdFx0XHRcdF9tb3JwaEEuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEEsIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRfbW9ycGhCLmFkZFNjYWxlZFZlY3RvciggX3RlbXBCLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQy5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQywgaW5mbHVlbmNlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQS5zdWIoIF92QSApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQi5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQi5zdWIoIF92QiApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQy5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQy5zdWIoIF92QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X3ZBLmFkZCggX21vcnBoQSApO1xuXHRcdF92Qi5hZGQoIF9tb3JwaEIgKTtcblx0XHRfdkMuYWRkKCBfbW9ycGhDICk7XG5cblx0fVxuXG5cdHZhciBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIF92QSwgX3ZCLCBfdkMsIF9pbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0aWYgKCB1diApIHtcblxuXHRcdFx0X3V2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0X3V2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0X3V2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRpbnRlcnNlY3Rpb24udXYgPSBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdGlvblBvaW50LCBfdkEsIF92QiwgX3ZDLCBfdXZBLCBfdXZCLCBfdXZDLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2MiApIHtcblxuXHRcdFx0X3V2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1djIsIGEgKTtcblx0XHRcdF91dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBiICk7XG5cdFx0XHRfdXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2MiwgYyApO1xuXG5cdFx0XHRpbnRlcnNlY3Rpb24udXYyID0gVHJpYW5nbGUuZ2V0VVYoIF9pbnRlcnNlY3Rpb25Qb2ludCwgX3ZBLCBfdkIsIF92QywgX3V2QSwgX3V2QiwgX3V2QywgbmV3IFZlY3RvcjIoKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMgKTtcblx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIF92QSwgX3ZCLCBfdkMsIGZhY2Uubm9ybWFsICk7XG5cblx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cblx0fVxuXG5cdHJldHVybiBpbnRlcnNlY3Rpb247XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIF9nZW9tZXRyeUlkID0gMDsgLy8gR2VvbWV0cnkgdXNlcyBldmVuIG51bWJlcnMgYXMgSWRcbnZhciBfbTEkMyA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX29iaiQxID0gbmV3IE9iamVjdDNEKCk7XG52YXIgX29mZnNldCQxID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfZ2VvbWV0cnlJZCArPSAyIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdlb21ldHJ5LFxuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRleC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXHRcdFx0ZmFjZS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHNbIGogXS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0X20xJDMubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEkMyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdF9tMSQzLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xJDMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCBhbmdsZSApIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHRfbTEkMy5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSQzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHRfbTEkMy5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEkMyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdF9tMSQzLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSQzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRfb2JqJDEubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdF9vYmokMS51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfb2JqJDEubWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5mcm9tQnVmZmVyR2VvbWV0cnkoKTogUG9zaXRpb24gYXR0cmlidXRlIHJlcXVpcmVkIGZvciBjb252ZXJzaW9uLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2czIgPSBhdHRyaWJ1dGVzLnV2MiAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51djIuYXJyYXkgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHNjb3BlLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKSApO1xuXG5cdFx0XHRpZiAoIGNvbG9ycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmNvbG9ycy5wdXNoKCBuZXcgQ29sb3IoKS5mcm9tQXJyYXkoIGNvbG9ycywgaSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZEZhY2UoIGEsIGIsIGMsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSAoIGNvbG9ycyA9PT0gdW5kZWZpbmVkICkgPyBbXSA6IFtcblx0XHRcdFx0c2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSxcblx0XHRcdFx0c2NvcGUuY29sb3JzWyBiIF0uY2xvbmUoKSxcblx0XHRcdFx0c2NvcGUuY29sb3JzWyBjIF0uY2xvbmUoKSBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9ICggbm9ybWFscyA9PT0gdW5kZWZpbmVkICkgPyBbXSA6IFtcblx0XHRcdFx0bmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIG5vcm1hbHMsIGEgKiAzICksXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBub3JtYWxzLCBiICogMyApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMygpLmZyb21BcnJheSggbm9ybWFscywgYyAqIDMgKVxuXHRcdFx0XTtcblxuXHRcdFx0dmFyIGZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMsIHZlcnRleE5vcm1hbHMsIHZlcnRleENvbG9ycywgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRzY29wZS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFtcblx0XHRcdFx0XHRuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdXZzLCBhICogMiApLFxuXHRcdFx0XHRcdG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1dnMsIGIgKiAyICksXG5cdFx0XHRcdFx0bmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHV2cywgYyAqIDIgKVxuXHRcdFx0XHRdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMSBdLnB1c2goIFtcblx0XHRcdFx0XHRuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdXZzMiwgYSAqIDIgKSxcblx0XHRcdFx0XHRuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdXZzMiwgYiAqIDIgKSxcblx0XHRcdFx0XHRuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdXZzMiwgYyAqIDIgKVxuXHRcdFx0XHRdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHR2YXIgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGogXSwgaW5kaWNlc1sgaiArIDEgXSwgaW5kaWNlc1sgaiArIDIgXSwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaiwgaiArIDEsIGogKyAyLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggX29mZnNldCQxICkubmVnYXRlKCk7XG5cblx0XHR0aGlzLnRyYW5zbGF0ZSggX29mZnNldCQxLngsIF9vZmZzZXQkMS55LCBfb2Zmc2V0JDEueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIHJhZGl1cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO1xuXG5cdFx0dmFyIHMgPSByYWRpdXMgPT09IDAgPyAxIDogMS4wIC8gcmFkaXVzO1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0bWF0cml4LnNldChcblx0XHRcdHMsIDAsIDAsIC0gcyAqIGNlbnRlci54LFxuXHRcdFx0MCwgcywgMCwgLSBzICogY2VudGVyLnksXG5cdFx0XHQwLCAwLCBzLCAtIHMgKiBjZW50ZXIueixcblx0XHRcdDAsIDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdGNvbG9yczEgPSB0aGlzLmNvbG9ycyxcblx0XHRcdGNvbG9yczIgPSBnZW9tZXRyeS5jb2xvcnM7XG5cblx0XHRpZiAoIG1hdGVyaWFsSW5kZXhPZmZzZXQgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwO1xuXG5cdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlczJbIGkgXTtcblxuXHRcdFx0dmFyIHZlcnRleENvcHkgPSB2ZXJ0ZXguY2xvbmUoKTtcblxuXHRcdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0dmVydGljZXMxLnB1c2goIHZlcnRleENvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbG9yczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbG9yczEucHVzaCggY29sb3JzMlsgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLFxuXHRcdFx0XHRmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscyxcblx0XHRcdFx0ZmFjZVZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRmYWNlQ29weSA9IG5ldyBGYWNlMyggZmFjZS5hICsgdmVydGV4T2Zmc2V0LCBmYWNlLmIgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYyArIHZlcnRleE9mZnNldCApO1xuXHRcdFx0ZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdG5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0uY2xvbmUoKTtcblxuXHRcdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleENvbG9ycy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRjb2xvciA9IGZhY2VWZXJ0ZXhDb2xvcnNbIGogXTtcblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Q29sb3JzLnB1c2goIGNvbG9yLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDtcblxuXHRcdFx0ZmFjZXMxLnB1c2goIGZhY2VDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1dnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4VXZzMi5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgdXZzMiA9IGZhY2VWZXJ0ZXhVdnMyWyBqIF0sIHV2c0NvcHkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgayA9IDAsIGtsID0gdXZzMi5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHV2c0NvcHkucHVzaCggdXZzMlsgayBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0ucHVzaCggdXZzQ29weSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdGlmICggISAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLicsIG1lc2ggKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbWVzaC5tYXRyaXhBdXRvVXBkYXRlICkgbWVzaC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMubWVyZ2UoIG1lc2guZ2VvbWV0cnksIG1lc2gubWF0cml4ICk7XG5cblx0fSxcblxuXHQvKlxuXHQgKiBDaGVja3MgZm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuXG5cdCAqIER1cGxpY2F0ZWQgdmVydGljZXMgYXJlIHJlbW92ZWRcblx0ICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC5cblx0ICovXG5cblx0bWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpXG5cdFx0dmFyIHVuaXF1ZSA9IFtdLCBjaGFuZ2VzID0gW107XG5cblx0XHR2YXIgdiwga2V5O1xuXHRcdHZhciBwcmVjaXNpb25Qb2ludHMgPSA0OyAvLyBudW1iZXIgb2YgZGVjaW1hbCBwb2ludHMsIGUuZy4gNCBmb3IgZXBzaWxvbiBvZiAwLjAwMDFcblx0XHR2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTtcblx0XHR2YXIgaSwgaWwsIGZhY2U7XG5cdFx0dmFyIGluZGljZXMsIGosIGpsO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0diA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdGtleSA9IE1hdGgucm91bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi55ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc01hcFsga2V5IF0gPSBpO1xuXHRcdFx0XHR1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IHVuaXF1ZS5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ0R1cGxpY2F0ZSB2ZXJ0ZXggZm91bmQuICcsIGksICcgY291bGQgYmUgdXNpbmcgJywgdmVydGljZXNNYXBba2V5XSk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IGNoYW5nZXNbIHZlcnRpY2VzTWFwWyBrZXkgXSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIGlmIGZhY2VzIGFyZSBjb21wbGV0ZWx5IGRlZ2VuZXJhdGUgYWZ0ZXIgbWVyZ2luZyB2ZXJ0aWNlcywgd2Vcblx0XHQvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LlxuXHRcdHZhciBmYWNlSW5kaWNlc1RvUmVtb3ZlID0gW107XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHRmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTtcblx0XHRcdGZhY2UuYiA9IGNoYW5nZXNbIGZhY2UuYiBdO1xuXHRcdFx0ZmFjZS5jID0gY2hhbmdlc1sgZmFjZS5jIF07XG5cblx0XHRcdGluZGljZXMgPSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTtcblxuXHRcdFx0Ly8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlM1xuXHRcdFx0Ly8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWRcblx0XHRcdGZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiArIDEgKSAlIDMgXSApIHtcblxuXHRcdFx0XHRcdGZhY2VJbmRpY2VzVG9SZW1vdmUucHVzaCggaSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IGZhY2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC0tICkge1xuXG5cdFx0XHR2YXIgaWR4ID0gZmFjZUluZGljZXNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHR0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBVc2UgdW5pcXVlIHNldCBvZiB2ZXJ0aWNlc1xuXG5cdFx0dmFyIGRpZmYgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIHVuaXF1ZS5sZW5ndGg7XG5cdFx0dGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTtcblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZmFjZXMgPSB0aGlzLmZhY2VzO1xuXHRcdHZhciBsZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHQvLyB0YWcgZmFjZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZXNbIGkgXS5faWQgPSBpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc29ydCBmYWNlc1xuXG5cdFx0ZnVuY3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7XG5cblx0XHRcdHJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7XG5cblx0XHR9XG5cblx0XHRmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApO1xuXG5cdFx0Ly8gc29ydCB1dnNcblxuXHRcdHZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0dmFyIHV2czIgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXTtcblxuXHRcdHZhciBuZXdVdnMxLCBuZXdVdnMyO1xuXG5cdFx0aWYgKCB1dnMxICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107XG5cdFx0aWYgKCB1dnMyICYmIHV2czIubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpZCA9IGZhY2VzWyBpIF0uX2lkO1xuXG5cdFx0XHRpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTtcblx0XHRcdGlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxO1xuXHRcdGlmICggbmV3VXZzMiApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gbmV3VXZzMjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgbm9ybWFsc0hhc2ggPSB7fTtcblx0XHR2YXIgY29sb3JzID0gW107XG5cdFx0dmFyIGNvbG9yc0hhc2ggPSB7fTtcblx0XHR2YXIgdXZzID0gW107XG5cdFx0dmFyIHV2c0hhc2ggPSB7fTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGhhc01hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZFxuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDtcblx0XHRcdHZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDtcblx0XHRcdHZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwO1xuXG5cdFx0XHR2YXIgZmFjZVR5cGUgPSAwO1xuXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDAsIDAgKTsgLy8gaXNRdWFkXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDEsIGhhc01hdGVyaWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDIsIGhhc0ZhY2VVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAzLCBoYXNGYWNlVmVydGV4VXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNCwgaGFzRmFjZU5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA1LCBoYXNGYWNlVmVydGV4Tm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYsIGhhc0ZhY2VDb2xvciApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA3LCBoYXNGYWNlVmVydGV4Q29sb3IgKTtcblxuXHRcdFx0ZmFjZXMucHVzaCggZmFjZVR5cGUgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXROb3JtYWxJbmRleCggZmFjZS5ub3JtYWwgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7XG5cblx0XHRcdHJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50b1N0cmluZygpICsgbm9ybWFsLnoudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMztcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldENvbG9ySW5kZXgoIGNvbG9yICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IGNvbG9yLnIudG9TdHJpbmcoKSArIGNvbG9yLmcudG9TdHJpbmcoKSArIGNvbG9yLmIudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9yc0hhc2hbIGhhc2ggXSA9IGNvbG9ycy5sZW5ndGg7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuZ2V0SGV4KCkgKTtcblxuXHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFV2SW5kZXgoIHV2ICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCB1dnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2c0hhc2hbIGhhc2ggXSA9IHV2cy5sZW5ndGggLyAyO1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHt9O1xuXG5cdFx0ZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7XG5cdFx0ZGF0YS5kYXRhLm5vcm1hbHMgPSBub3JtYWxzO1xuXHRcdGlmICggY29sb3JzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEuY29sb3JzID0gY29sb3JzO1xuXHRcdGlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdGRhdGEuZGF0YS5mYWNlcyA9IGZhY2VzO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIGksIGlsLCBqLCBqbCwgaywga2w7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHRcdHRoaXMuY29sb3JzID0gW107XG5cdFx0dGhpcy5mYWNlcyA9IFtdO1xuXHRcdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXHRcdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0XHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHR2YXIgdmVydGljZXMgPSBzb3VyY2UudmVydGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0dmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHR2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5mYWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2UgdmVydGV4IHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTtcblxuXHRcdFx0aWYgKCB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgdXZzID0gZmFjZVZlcnRleFV2c1sgaiBdLCB1dnNDb3B5ID0gW107XG5cblx0XHRcdFx0Zm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV2ID0gdXZzWyBrIF07XG5cblx0XHRcdFx0XHR1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0ucHVzaCggdXZzQ29weSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0ge307XG5cdFx0XHRtb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblxuXHRcdFx0Ly8gdmVydGljZXNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIG5vcm1hbHNcblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSB7fTtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc3JjVmVydGV4Tm9ybWFsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFsc1sgaiBdO1xuXHRcdFx0XHRcdHZhciBkZXN0VmVydGV4Tm9ybWFsID0ge307XG5cblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmEgPSBzcmNWZXJ0ZXhOb3JtYWwuYS5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVydGV4Tm9ybWFsLmMuY2xvbmUoKTtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMucHVzaCggZGVzdFZlcnRleE5vcm1hbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmYWNlIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gd2VpZ2h0c1xuXG5cdFx0dmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIGluZGljZXNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGluZSBkaXN0YW5jZXNcblxuXHRcdHZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0YW5jZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBsaW5lRGlzdGFuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdFx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gc291cmNlLnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNlLm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IHNvdXJjZS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gc291cmNlLmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEJveEdlb21ldHJ5XG5cbmNsYXNzIEJveEdlb21ldHJ5IGV4dGVuZHMgR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHdpZHRoOiB3aWR0aCxcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdFx0ZGVwdGg6IGRlcHRoLFxuXHRcdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcblx0XHR9O1xuXG5cdFx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0XHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxuXHR9XG5cbn1cblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuY2xhc3MgQm94QnVmZmVyR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQm94QnVmZmVyR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRkZXB0aDogZGVwdGgsXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHRcdH07XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0d2lkdGggPSB3aWR0aCB8fCAxO1xuXHRcdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRcdGRlcHRoID0gZGVwdGggfHwgMTtcblxuXHRcdC8vIHNlZ21lbnRzXG5cblx0XHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdFx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cdFx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKSB8fCAxO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0dmFyIGluZGljZXMgPSBbXTtcblx0XHR2YXIgdmVydGljZXMgPSBbXTtcblx0XHR2YXIgbm9ybWFscyA9IFtdO1xuXHRcdHZhciB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0XHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0XHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxuXG5cdFx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRcdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcblx0XHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdFx0dmFyIHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHRcdFx0dmFyIHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcblx0XHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHRcdHZhciBkZXB0aEhhbGYgPSBkZXB0aCAvIDI7XG5cblx0XHRcdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0XHR2YXIgdmVydGV4Q291bnRlciA9IDA7XG5cdFx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHRcdHZhciBpeCwgaXk7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHRcdHZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjtcblxuXHRcdFx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdFx0dmVjdG9yWyB1IF0gPSB4ICogdWRpcjtcblx0XHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGhIYWxmO1xuXG5cdFx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byB2ZXJ0ZXggYnVmZmVyXG5cblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdFx0dmVjdG9yWyB1IF0gPSAwO1xuXHRcdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoID4gMCA/IDEgOiAtIDE7XG5cblx0XHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIG5vcm1hbCBidWZmZXJcblxuXHRcdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdFx0Ly8gdXZzXG5cblx0XHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHRcdC8vIGNvdW50ZXJzXG5cblx0XHRcdFx0XHR2ZXJ0ZXhDb3VudGVyICs9IDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHRcdC8vIDIuIGEgc2luZ2xlIHNlZ21lbnQgY29uc2lzdHMgb2YgdHdvIGZhY2VzXG5cdFx0XHQvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50XG5cblx0XHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7XG5cdFx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRcdHZhciBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRcdHZhciBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcblxuXHRcdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHRcdFx0Ly8gdXBkYXRlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlc1xuXG5cdFx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZVVuaWZvcm1zKCBzcmMgKSB7XG5cblx0dmFyIGRzdCA9IHt9O1xuXG5cdGZvciAoIHZhciB1IGluIHNyYyApIHtcblxuXHRcdGRzdFsgdSBdID0ge307XG5cblx0XHRmb3IgKCB2YXIgcCBpbiBzcmNbIHUgXSApIHtcblxuXHRcdFx0dmFyIHByb3BlcnR5ID0gc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0aWYgKCBwcm9wZXJ0eSAmJiAoIHByb3BlcnR5LmlzQ29sb3IgfHxcblx0XHRcdFx0cHJvcGVydHkuaXNNYXRyaXgzIHx8IHByb3BlcnR5LmlzTWF0cml4NCB8fFxuXHRcdFx0XHRwcm9wZXJ0eS5pc1ZlY3RvcjIgfHwgcHJvcGVydHkuaXNWZWN0b3IzIHx8IHByb3BlcnR5LmlzVmVjdG9yNCB8fFxuXHRcdFx0XHRwcm9wZXJ0eS5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHkuY2xvbmUoKTtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcHJvcGVydHkgKSApIHtcblxuXHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHkuc2xpY2UoKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIGRzdDtcblxufVxuXG5mdW5jdGlvbiBtZXJnZVVuaWZvcm1zKCB1bmlmb3JtcyApIHtcblxuXHR2YXIgbWVyZ2VkID0ge307XG5cblx0Zm9yICggdmFyIHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkge1xuXG5cdFx0dmFyIHRtcCA9IGNsb25lVW5pZm9ybXMoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdGZvciAoIHZhciBwIGluIHRtcCApIHtcblxuXHRcdFx0bWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIG1lcmdlZDtcblxufVxuXG4vLyBMZWdhY3lcblxudmFyIFVuaWZvcm1zVXRpbHMgPSB7IGNsb25lOiBjbG9uZVVuaWZvcm1zLCBtZXJnZTogbWVyZ2VVbmlmb3JtcyB9O1xuXG52YXIgZGVmYXVsdF92ZXJ0ZXggPSBcInZvaWQgbWFpbigpIHtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufVwiO1xuXG52YXIgZGVmYXVsdF9mcmFnbWVudCA9IFwidm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xcbn1cIjtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZGVmaW5lczogeyBcImxhYmVsXCIgOiBcInZhbHVlXCIgfSxcbiAqICB1bmlmb3JtczogeyBcInBhcmFtZXRlcjFcIjogeyB2YWx1ZTogMS4wIH0sIFwicGFyYW1ldGVyMlwiOiB7IHZhbHVlMjogMiB9IH0sXG4gKlxuICogIGZyYWdtZW50U2hhZGVyOiA8c3RyaW5nPixcbiAqICB2ZXJ0ZXhTaGFkZXI6IDxzdHJpbmc+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIGxpZ2h0czogPGJvb2w+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFkZXJNYXRlcmlhbCc7XG5cblx0dGhpcy5kZWZpbmVzID0ge307XG5cdHRoaXMudW5pZm9ybXMgPSB7fTtcblxuXHR0aGlzLnZlcnRleFNoYWRlciA9IGRlZmF1bHRfdmVydGV4O1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZGVmYXVsdF9mcmFnbWVudDtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgZm9nXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgbGlnaHRzXG5cdHRoaXMuY2xpcHBpbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzXG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNraW5uaW5nIGF0dHJpYnV0ZSBzdHJlYW1zXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggdGFyZ2V0c1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIG5vcm1hbHNcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSB7XG5cdFx0ZGVyaXZhdGl2ZXM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRlcml2YXRpdmVzXG5cdFx0ZnJhZ0RlcHRoOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBmcmFnbWVudCBkZXB0aCB2YWx1ZXNcblx0XHRkcmF3QnVmZmVyczogZmFsc2UsIC8vIHNldCB0byB1c2UgZHJhdyBidWZmZXJzXG5cdFx0c2hhZGVyVGV4dHVyZUxPRDogZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0Rcblx0fTtcblxuXHQvLyBXaGVuIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0aGUgbWF0ZXJpYWwgZG9lcyxcblx0Ly8gdXNlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGluIFdlYkdMLiBUaGlzIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIgZGF0YSBpcyBtaXNzaW5nLlxuXHR0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7XG5cdFx0J2NvbG9yJzogWyAxLCAxLCAxIF0sXG5cdFx0J3V2JzogWyAwLCAwIF0sXG5cdFx0J3V2Mic6IFsgMCwgMCBdXG5cdH07XG5cblx0dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkO1xuXHR0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG59XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZGVyTWF0ZXJpYWw7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7XG5cblx0dGhpcy51bmlmb3JtcyA9IGNsb25lVW5pZm9ybXMoIHNvdXJjZS51bmlmb3JtcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UuZGVmaW5lcyApO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcblx0dGhpcy5jbGlwcGluZyA9IHNvdXJjZS5jbGlwcGluZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHNvdXJjZS5leHRlbnNpb25zO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdHZhciBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0ZGF0YS51bmlmb3JtcyA9IHt9O1xuXG5cdGZvciAoIHZhciBuYW1lIGluIHRoaXMudW5pZm9ybXMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbIG5hbWUgXTtcblx0XHR2YXIgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ3QnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUudG9KU09OKCBtZXRhICkudXVpZFxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ2MnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUuZ2V0SGV4KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjIgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ3YyJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yMyApIHtcblxuXHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xuXHRcdFx0XHR0eXBlOiAndjMnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3I0ICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICd2NCcsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDMgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ20zJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzTWF0cml4NCApIHtcblxuXHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xuXHRcdFx0XHR0eXBlOiAnbTQnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cblx0XHRcdC8vIG5vdGU6IHRoZSBhcnJheSB2YXJpYW50cyB2MnYsIHYzdiwgdjR2LCBtNHYgYW5kIHR2IGFyZSBub3Qgc3VwcG9ydGVkIHNvIGZhclxuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLmRlZmluZXMgKS5sZW5ndGggPiAwICkgZGF0YS5kZWZpbmVzID0gdGhpcy5kZWZpbmVzO1xuXG5cdGRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7XG5cdGRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyO1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmV4dGVuc2lvbnMgKSB7XG5cblx0XHRpZiAoIHRoaXMuZXh0ZW5zaW9uc1sga2V5IF0gPT09IHRydWUgKSBleHRlbnNpb25zWyBrZXkgXSA9IHRydWU7XG5cblx0fVxuXG5cdGlmICggT2JqZWN0LmtleXMoIGV4dGVuc2lvbnMgKS5sZW5ndGggPiAwICkgZGF0YS5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHR2YXIgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggLSBlWyA4IF0sIC0gZVsgOSBdLCAtIGVbIDEwIF0gKS5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR1cGRhdGVXb3JsZE1hdHJpeDogZnVuY3Rpb24gKCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVXb3JsZE1hdHJpeC5jYWxsKCB0aGlzLCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92ICE9PSB1bmRlZmluZWQgPyBmb3YgOiA1MDtcblx0dGhpcy56b29tID0gMTtcblxuXHR0aGlzLm5lYXIgPSBuZWFyICE9PSB1bmRlZmluZWQgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9IGZhciAhPT0gdW5kZWZpbmVkID8gZmFyIDogMjAwMDtcblx0dGhpcy5mb2N1cyA9IDEwO1xuXG5cdHRoaXMuYXNwZWN0ID0gYXNwZWN0ICE9PSB1bmRlZmluZWQgPyBhc3BlY3QgOiAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMuZmlsbUdhdWdlID0gMzU7XHQvLyB3aWR0aCBvZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxsaW1ldGVycylcblx0dGhpcy5maWxtT2Zmc2V0ID0gMDtcdC8vIGhvcml6b250YWwgZmlsbSBvZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSlcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsXG5cblx0aXNQZXJzcGVjdGl2ZUNhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmZvdiA9IHNvdXJjZS5mb3Y7XG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTtcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5ndGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCAuZmlsbUdhdWdlLlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3Jcblx0ICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuXG5cdCAqXG5cdCAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LlxuXHQgKi9cblx0c2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5ndGggKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWxcblx0XHR2YXIgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDtcblxuXHRcdHRoaXMuZm92ID0gTWF0aFV0aWxzLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggTWF0aFV0aWxzLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xuXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xuXG5cdH0sXG5cblx0Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aFV0aWxzLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0TWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUItLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQy0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUUtLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRi0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSxcblx0XHRcdGhlaWdodCA9IDIgKiB0b3AsXG5cdFx0XHR3aWR0aCA9IHRoaXMuYXNwZWN0ICogaGVpZ2h0LFxuXHRcdFx0bGVmdCA9IC0gMC41ICogd2lkdGgsXG5cdFx0XHR2aWV3ID0gdGhpcy52aWV3O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcblxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR2YXIgc2tldyA9IHRoaXMuZmlsbU9mZnNldDtcblx0XHRpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyICk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZm92ID0gdGhpcy5mb3Y7XG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cdFx0ZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzO1xuXG5cdFx0ZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTtcblx0XHRkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQ2FtZXJhIGZvciByZW5kZXJpbmcgY3ViZSBtYXBzXG4gKlx0LSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmVcbiAqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBmb3YgPSA5MCwgYXNwZWN0ID0gMTtcblxuZnVuY3Rpb24gQ3ViZUNhbWVyYSggbmVhciwgZmFyLCBjdWJlUmVzb2x1dGlvbiwgb3B0aW9ucyApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7IGZvcm1hdDogUkdCRm9ybWF0LCBtYWdGaWx0ZXI6IExpbmVhckZpbHRlciwgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIgfTtcblxuXHR0aGlzLnJlbmRlclRhcmdldCA9IG5ldyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblx0XHR2YXIgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMiApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMyApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIGkgKTtcblxuXHRcdFx0cmVuZGVyZXIuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdFx0fVxuXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XG5cblx0fTtcblxufVxuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQ3ViZUNhbWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlQ2FtZXJhO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb21cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFdlYkdMQ3ViZVJlbmRlclRhcmdldCggc2l6ZSwgb3B0aW9ucywgZHVtbXkgKSB7XG5cblx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBvcHRpb25zICkgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEN1YmVSZW5kZXJUYXJnZXQ6IGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBpcyBub3cgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCBzaXplLCBvcHRpb25zICknICk7XG5cblx0XHRvcHRpb25zID0gZHVtbXk7XG5cblx0fVxuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHNpemUsIHNpemUsIG9wdGlvbnMgKTtcblxufVxuXG5XZWJHTEN1YmVSZW5kZXJUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTEN1YmVSZW5kZXJUYXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xDdWJlUmVuZGVyVGFyZ2V0O1xuXG5XZWJHTEN1YmVSZW5kZXJUYXJnZXQucHJvdG90eXBlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcblxuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHRleHR1cmUgKSB7XG5cblx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcblx0dGhpcy50ZXh0dXJlLmVuY29kaW5nID0gdGV4dHVyZS5lbmNvZGluZztcblxuXHR2YXIgc2NlbmUgPSBuZXcgU2NlbmUoKTtcblxuXHR2YXIgc2hhZGVyID0ge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFtcblxuXHRcdFx0XCJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1wiLFxuXG5cdFx0XHRcInZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XCIsXG5cblx0XHRcdFwiXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcIixcblxuXHRcdFx0XCJ9XCIsXG5cblx0XHRcdFwidm9pZCBtYWluKCkge1wiLFxuXG5cdFx0XHRcIlx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcIixcblxuXHRcdFx0XCJcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XCIsXG5cdFx0XHRcIlx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlwiLFxuXG5cdFx0XHRcIn1cIlxuXG5cdFx0XS5qb2luKCAnXFxuJyApLFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFtcblxuXHRcdFx0XCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XCIsXG5cblx0XHRcdFwidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcIixcblxuXHRcdFx0XCIjZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFwiLFxuXHRcdFx0XCIjZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcIixcblxuXHRcdFx0XCJ2b2lkIG1haW4oKSB7XCIsXG5cblx0XHRcdFwiXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XCIsXG5cblx0XHRcdFwiXHR2ZWMyIHNhbXBsZVVWO1wiLFxuXG5cdFx0XHRcIlx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1wiLFxuXG5cdFx0XHRcIlx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XCIsXG5cblx0XHRcdFwiXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcIixcblxuXHRcdFx0XCJ9XCJcblxuXHRcdF0uam9pbiggJ1xcbicgKSxcblx0fTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblxuXHRcdHR5cGU6ICdDdWJlbWFwRnJvbUVxdWlyZWN0JyxcblxuXHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBzaGFkZXIudW5pZm9ybXMgKSxcblx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlcixcblx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRibGVuZGluZzogTm9CbGVuZGluZ1xuXG5cdH0gKTtcblxuXHRtYXRlcmlhbC51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSB0ZXh0dXJlO1xuXG5cdHZhciBtZXNoID0gbmV3IE1lc2goIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggNSwgNSwgNSApLCBtYXRlcmlhbCApO1xuXG5cdHNjZW5lLmFkZCggbWVzaCApO1xuXG5cdHZhciBjYW1lcmEgPSBuZXcgQ3ViZUNhbWVyYSggMSwgMTAsIDEgKTtcblxuXHRjYW1lcmEucmVuZGVyVGFyZ2V0ID0gdGhpcztcblx0Y2FtZXJhLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSAnQ3ViZUNhbWVyYVRleHR1cmUnO1xuXG5cdGNhbWVyYS51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xuXG5cdG1lc2guZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHRtZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEgfHwgbnVsbCwgd2lkdGg6IHdpZHRoIHx8IDEsIGhlaWdodDogaGVpZ2h0IHx8IDEgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIF9zcGhlcmUkMSA9IG5ldyBTcGhlcmUoKTtcbnZhciBfdmVjdG9yJDUgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xuXHRcdHZhciBtZTQgPSBtZVsgNCBdLCBtZTUgPSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdO1xuXHRcdHZhciBtZTggPSBtZVsgOCBdLCBtZTkgPSBtZVsgOSBdLCBtZTEwID0gbWVbIDEwIF0sIG1lMTEgPSBtZVsgMTEgXTtcblx0XHR2YXIgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xuXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c09iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlJDEuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQxICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3ByaXRlOiBmdW5jdGlvbiAoIHNwcml0ZSApIHtcblxuXHRcdF9zcGhlcmUkMS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0X3NwaGVyZSQxLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlJDEuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBuZWdSYWRpdXMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0dmFyIHBsYW5lID0gcGxhbmVzWyBpIF07XG5cblx0XHRcdC8vIGNvcm5lciBhdCBtYXggZGlzdGFuY2VcblxuXHRcdFx0X3ZlY3RvciQ1LnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRfdmVjdG9yJDUueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTtcblx0XHRcdF92ZWN0b3IkNS56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1heC56IDogYm94Lm1pbi56O1xuXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggX3ZlY3RvciQ1ICkgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0dXYyVHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGxpZ2h0UHJvYmU6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9XG5cdFx0fSB9LFxuXG5cdFx0c3BvdExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0c3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRzcG90U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0cG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkZWNheToge30sXG5cdFx0XHRkaXN0YW5jZToge31cblx0XHR9IH0sXG5cblx0XHRwb2ludExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH0sXG5cblx0c3ByaXRlOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRjZW50ZXI6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApIH0sXG5cdFx0cm90YXRpb246IHsgdmFsdWU6IDAuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQW5pbWF0aW9uKCkge1xuXG5cdHZhciBjb250ZXh0ID0gbnVsbDtcblx0dmFyIGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdHZhciBhbmltYXRpb25Mb29wID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0YW5pbWF0aW9uTG9vcCggdGltZSwgZnJhbWUgKTtcblxuXHRcdGNvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBvbkFuaW1hdGlvbkZyYW1lICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRzdGFydDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIGlzQW5pbWF0aW5nID09PSB0cnVlICkgcmV0dXJuO1xuXHRcdFx0aWYgKCBhbmltYXRpb25Mb29wID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdFx0XHRpc0FuaW1hdGluZyA9IHRydWU7XG5cblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpc0FuaW1hdGluZyA9IGZhbHNlO1xuXG5cdFx0fSxcblxuXHRcdHNldEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRcdGFuaW1hdGlvbkxvb3AgPSBjYWxsYmFjaztcblxuXHRcdH0sXG5cblx0XHRzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCwgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHR2YXIgYnVmZmVycyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVzYWdlID0gYXR0cmlidXRlLnVzYWdlO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIHVzYWdlICk7XG5cblx0XHRhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpO1xuXG5cdFx0dmFyIHR5cGUgPSA1MTI2O1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjY7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4nICk7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyMztcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjI7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyNTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjA7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSA1MTIxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJ1ZmZlcjogYnVmZmVyLFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRcdGFycmF5LCB1cGRhdGVSYW5nZS5vZmZzZXQsIHVwZGF0ZVJhbmdlLmNvdW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHRcdGlmICggZGF0YSApIHtcblxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApO1xuXG5cdFx0XHRidWZmZXJzLmRlbGV0ZSggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwgY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xuXG5cdFx0XHRkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBsYW5lR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBsYW5lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2VvbWV0cnk7XG5cbi8vIFBsYW5lQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0d2lkdGggPSB3aWR0aCB8fCAxO1xuXHRoZWlnaHQgPSBoZWlnaHQgfHwgMTtcblxuXHR2YXIgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcblx0dmFyIGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjtcblxuXHR2YXIgZ3JpZFggPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTtcblx0dmFyIGdyaWRZID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdHZhciBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0dmFyIHNlZ21lbnRfd2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHR2YXIgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcblxuXHRcdHZhciB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XG5cblx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdHZhciBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdHZhciBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVCdWZmZXJHZW9tZXRyeTtcblxudmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhdGVzdF9mcmFnbWVudCA9IFwiI2lmZGVmIEFMUEhBVEVTVFxcblxcdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xcbiNlbmRpZlwiO1xuXG52YXIgYW9tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgYmVnaW5fdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcIjtcblxudmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9IFwidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcXG4jaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xcbiNlbmRpZlwiO1xuXG52YXIgYnNkZnMgPSBcInZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xcblxcdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xcblxcdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XFxuXFx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XFxuXFx0cmV0dXJuIHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcXG59XFxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XFxuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcXG5cXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xcblxcdFxcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xcblxcdH1cXG5cXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xcbiNlbHNlXFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICYmIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XFxuXFx0XFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xcblxcdH1cXG5cXHRyZXR1cm4gMS4wO1xcbiNlbmRpZlxcbn1cXG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcXG59XFxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XFxuXFx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XFxuXFx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XFxufVxcbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdE5WIC0gNi45ODMxNiApICogZG90TlYgKTtcXG5cXHR2ZWMzIEZyID0gbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xcblxcdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XFxuXFx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XFxuXFx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XFxuXFx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBicmRmLnggKyBicmRmLnk7XFxufVxcbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2tfUm91Z2huZXNzRGVwZW5kZW50KCBzcGVjdWxhckNvbG9yLCBkb3ROViwgcm91Z2huZXNzICk7XFxuXFx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XFxuXFx0dmVjMyBGc3NFc3MgPSBGICogYnJkZi54ICsgYnJkZi55O1xcblxcdGZsb2F0IEVzcyA9IGJyZGYueCArIGJyZGYueTtcXG5cXHRmbG9hdCBFbXMgPSAxLjAgLSBFc3M7XFxuXFx0dmVjMyBGYXZnID0gc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XFx0dmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XFxuXFx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XFxuXFx0bXVsdGlTY2F0dGVyICs9IEZtcyAqIEVtcztcXG59XFxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcXG5cXHRyZXR1cm4gMC4yNTtcXG59XFxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcXG5cXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xcblxcdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XFxufVxcbmZsb2F0IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcXG5cXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcXG59XFxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXFxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XFxuXFx0ZmxvYXQgaW52QWxwaGEgID0gMS4wIC8gcm91Z2huZXNzO1xcblxcdGZsb2F0IGNvczJoID0gTm9IICogTm9IO1xcblxcdGZsb2F0IHNpbjJoID0gbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1xcdHJldHVybiAoMi4wICsgaW52QWxwaGEpICogcG93KHNpbjJoLCBpbnZBbHBoYSAqIDAuNSkgLyAoMi4wICogUEkpO1xcbn1cXG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9TaGVlbiggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIEwsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIHZlYzMgc3BlY3VsYXJDb2xvciApIHtcXG5cXHR2ZWMzIE4gPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHR2ZWMzIEggPSBub3JtYWxpemUoIFYgKyBMICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcXG5cXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xcbn1cXG4jZW5kaWZcIjtcblxudmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9CVU1QTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcXG5cXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcXG5cXHRcXHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XFxuXFx0XFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xcblxcdFxcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcXG5cXHRcXHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcXG5cXHRcXHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcXG5cXHRcXHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcXG5cXHR9XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcXG5cXHRcXHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgdk4gPSBzdXJmX25vcm07XFxuXFx0XFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xcblxcdFxcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcXG5cXHRcXHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApO1xcblxcdFxcdGZEZXQgKj0gKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xcblxcdFxcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xcblxcdFxcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcXG5cXHR9XFxuI2VuZGlmXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdHZlYzQgcGxhbmU7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcXG5cXHRcXHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XFxuXFx0XFx0aWYgKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG5cXHRcXHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcXG4jZW5kaWZcIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXggPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdHZDbGlwUG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHRkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dkNvbG9yLnh5eiA9IGNvbG9yLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIGNvbW1vbiA9IFwiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XFxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxOFxcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxcbiNkZWZpbmUgRVBTSUxPTiAxZS02XFxuI2lmbmRlZiBzYXR1cmF0ZVxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG4jaWZkZWYgSElHSF9QUkVDSVNJT05cXG5cXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxcbiNlbHNlXFxuXFx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XFxuXFx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xcblxcdFxcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heDMoIGFicyggdiApICk7XFxuXFx0XFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xcblxcdH1cXG4jZW5kaWZcXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG4jaWZkZWYgQ0xFQVJDT0FUXFxuXFx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XFxuI2VuZGlmXFxufTtcXG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xcbn1cXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcXG59XFxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XFxuXFx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xcbn1cXG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcXG59XFxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xcbn1cXG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcXG5cXHRtYXQzIHRtcDtcXG5cXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcXG5cXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcXG5cXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcXG5cXHRyZXR1cm4gdG1wO1xcbn1cXG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xcblxcdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcXG5cXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcXG59XFxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XFxuICByZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7XFxufVwiO1xuXG52YXIgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50ID0gXCIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxcbiNkZWZpbmUgY3ViZVVWX21heE1pcExldmVsIDguMFxcbiNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMFxcbiNkZWZpbmUgY3ViZVVWX21heFRpbGVTaXplIDI1Ni4wXFxuI2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMFxcbmZsb2F0IGdldEZhY2UodmVjMyBkaXJlY3Rpb24pIHtcXG4gICAgdmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoZGlyZWN0aW9uKTtcXG4gICAgZmxvYXQgZmFjZSA9IC0xLjA7XFxuICAgIGlmIChhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56KSB7XFxuICAgICAgaWYgKGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkpXFxuICAgICAgICBmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwLjAgOiAzLjA7XFxuICAgICAgZWxzZVxcbiAgICAgICAgZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIGlmIChhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55KVxcbiAgICAgICAgZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMi4wIDogNS4wO1xcbiAgICAgIGVsc2VcXG4gICAgICAgIGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcXG4gICAgfVxcbiAgICByZXR1cm4gZmFjZTtcXG59XFxudmVjMiBnZXRVVih2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgZmFjZSkge1xcbiAgICB2ZWMyIHV2O1xcbiAgICBpZiAoZmFjZSA9PSAwLjApIHtcXG4gICAgICB1diA9IHZlYzIoLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSkgLyBhYnMoZGlyZWN0aW9uLngpO1xcbiAgICB9IGVsc2UgaWYgKGZhY2UgPT0gMS4wKSB7XFxuICAgICAgdXYgPSB2ZWMyKGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopIC8gYWJzKGRpcmVjdGlvbi55KTtcXG4gICAgfSBlbHNlIGlmIChmYWNlID09IDIuMCkge1xcbiAgICAgIHV2ID0gZGlyZWN0aW9uLnh5IC8gYWJzKGRpcmVjdGlvbi56KTtcXG4gICAgfSBlbHNlIGlmIChmYWNlID09IDMuMCkge1xcbiAgICAgIHV2ID0gdmVjMihkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpIC8gYWJzKGRpcmVjdGlvbi54KTtcXG4gICAgfSBlbHNlIGlmIChmYWNlID09IDQuMCkge1xcbiAgICAgIHV2ID0gZGlyZWN0aW9uLnh6IC8gYWJzKGRpcmVjdGlvbi55KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICB1diA9IHZlYzIoLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSkgLyBhYnMoZGlyZWN0aW9uLnopO1xcbiAgICB9XFxuICAgIHJldHVybiAwLjUgKiAodXYgKyAxLjApO1xcbn1cXG52ZWMzIGJpbGluZWFyQ3ViZVVWKHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQpIHtcXG4gIGZsb2F0IGZhY2UgPSBnZXRGYWNlKGRpcmVjdGlvbik7XFxuICBmbG9hdCBmaWx0ZXJJbnQgPSBtYXgoY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjApO1xcbiAgbWlwSW50ID0gbWF4KG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsKTtcXG4gIGZsb2F0IGZhY2VTaXplID0gZXhwMihtaXBJbnQpO1xcbiAgZmxvYXQgdGV4ZWxTaXplID0gMS4wIC8gKDMuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZSk7XFxuICB2ZWMyIHV2ID0gZ2V0VVYoZGlyZWN0aW9uLCBmYWNlKSAqIChmYWNlU2l6ZSAtIDEuMCk7XFxuICB2ZWMyIGYgPSBmcmFjdCh1dik7XFxuICB1diArPSAwLjUgLSBmO1xcbiAgaWYgKGZhY2UgPiAyLjApIHtcXG4gICAgdXYueSArPSBmYWNlU2l6ZTtcXG4gICAgZmFjZSAtPSAzLjA7XFxuICB9XFxuICB1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTtcXG4gIGlmKG1pcEludCA8IGN1YmVVVl9tYXhNaXBMZXZlbCl7XFxuICAgIHV2LnkgKz0gMi4wICogY3ViZVVWX21heFRpbGVTaXplO1xcbiAgfVxcbiAgdXYueSArPSBmaWx0ZXJJbnQgKiAyLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XFxuICB1di54ICs9IDMuMCAqIG1heCgwLjAsIGN1YmVVVl9tYXhUaWxlU2l6ZSAtIDIuMCAqIGZhY2VTaXplKTtcXG4gIHV2ICo9IHRleGVsU2l6ZTtcXG4gIHZlYzMgdGwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2KSkucmdiO1xcbiAgdXYueCArPSB0ZXhlbFNpemU7XFxuICB2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dikpLnJnYjtcXG4gIHV2LnkgKz0gdGV4ZWxTaXplO1xcbiAgdmVjMyBiciA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXYpKS5yZ2I7XFxuICB1di54IC09IHRleGVsU2l6ZTtcXG4gIHZlYzMgYmwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2KSkucmdiO1xcbiAgdmVjMyB0bSA9IG1peCh0bCwgdHIsIGYueCk7XFxuICB2ZWMzIGJtID0gbWl4KGJsLCBiciwgZi54KTtcXG4gIHJldHVybiBtaXgodG0sIGJtLCBmLnkpO1xcbn1cXG4jZGVmaW5lIHIwIDEuMFxcbiNkZWZpbmUgdjAgMC4zMzlcXG4jZGVmaW5lIG0wIC0yLjBcXG4jZGVmaW5lIHIxIDAuOFxcbiNkZWZpbmUgdjEgMC4yNzZcXG4jZGVmaW5lIG0xIC0xLjBcXG4jZGVmaW5lIHI0IDAuNFxcbiNkZWZpbmUgdjQgMC4wNDZcXG4jZGVmaW5lIG00IDIuMFxcbiNkZWZpbmUgcjUgMC4zMDVcXG4jZGVmaW5lIHY1IDAuMDE2XFxuI2RlZmluZSBtNSAzLjBcXG4jZGVmaW5lIHI2IDAuMjFcXG4jZGVmaW5lIHY2IDAuMDAzOFxcbiNkZWZpbmUgbTYgNC4wXFxuZmxvYXQgcm91Z2huZXNzVG9NaXAoZmxvYXQgcm91Z2huZXNzKSB7XFxuICBmbG9hdCBtaXAgPSAwLjA7XFxuICBpZiAocm91Z2huZXNzID49IHIxKSB7XFxuICAgIG1pcCA9IChyMCAtIHJvdWdobmVzcykgKiAobTEgLSBtMCkgLyAocjAgLSByMSkgKyBtMDtcXG4gIH0gZWxzZSBpZiAocm91Z2huZXNzID49IHI0KSB7XFxuICAgIG1pcCA9IChyMSAtIHJvdWdobmVzcykgKiAobTQgLSBtMSkgLyAocjEgLSByNCkgKyBtMTtcXG4gIH0gZWxzZSBpZiAocm91Z2huZXNzID49IHI1KSB7XFxuICAgIG1pcCA9IChyNCAtIHJvdWdobmVzcykgKiAobTUgLSBtNCkgLyAocjQgLSByNSkgKyBtNDtcXG4gIH0gZWxzZSBpZiAocm91Z2huZXNzID49IHI2KSB7XFxuICAgIG1pcCA9IChyNSAtIHJvdWdobmVzcykgKiAobTYgLSBtNSkgLyAocjUgLSByNikgKyBtNTtcXG4gIH0gZWxzZSB7XFxuICAgIG1pcCA9IC0yLjAgKiBsb2cyKDEuMTYgKiByb3VnaG5lc3MpOyAgfVxcbiAgcmV0dXJuIG1pcDtcXG59XFxudmVjNCB0ZXh0dXJlQ3ViZVVWKHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgc2FtcGxlRGlyLCBmbG9hdCByb3VnaG5lc3MpIHtcXG4gIGZsb2F0IG1pcCA9IGNsYW1wKHJvdWdobmVzc1RvTWlwKHJvdWdobmVzcyksIG0wLCBjdWJlVVZfbWF4TWlwTGV2ZWwpO1xcbiAgZmxvYXQgbWlwRiA9IGZyYWN0KG1pcCk7XFxuICBmbG9hdCBtaXBJbnQgPSBmbG9vcihtaXApO1xcbiAgdmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVVihlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50KTtcXG4gIGlmIChtaXBGID09IDAuMCkge1xcbiAgICByZXR1cm4gdmVjNChjb2xvcjAsIDEuMCk7XFxuICB9IGVsc2Uge1xcbiAgICB2ZWMzIGNvbG9yMSA9IGJpbGluZWFyQ3ViZVVWKGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjApO1xcbiAgICByZXR1cm4gdmVjNChtaXgoY29sb3IwLCBjb2xvcjEsIG1pcEYpLCAxLjApO1xcbiAgfVxcbn1cXG4jZW5kaWZcIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsO1xcbiNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xcblxcdG1hdDMgbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7XFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBtWyAwIF0sIG1bIDAgXSApLCBkb3QoIG1bIDEgXSwgbVsgMSBdICksIGRvdCggbVsgMiBdLCBtWyAyIF0gKSApO1xcblxcdHRyYW5zZm9ybWVkTm9ybWFsID0gbSAqIHRyYW5zZm9ybWVkTm9ybWFsO1xcbiNlbmRpZlxcbnRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7XFxuI2lmZGVmIEZMSVBfU0lERURcXG5cXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0dmVjMyB0cmFuc2Zvcm1lZFRhbmdlbnQgPSAoIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xcblxcdCNpZmRlZiBGTElQX1NJREVEXFxuXFx0XFx0dHJhbnNmb3JtZWRUYW5nZW50ID0gLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xcbiNlbmRpZlwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdlV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcImdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1wiO1xuXG52YXIgZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQgPSBcIlxcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZhbHVlO1xcbn1cXG52ZWM0IEdhbW1hVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xcblxcdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XFxufVxcbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAxLjAgLyBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcXG59XFxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xcbn1cXG52ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XFxufVxcbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBleHAyKCB2YWx1ZS5hICogMjU1LjAgLSAxMjguMCApLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xcblxcdGZsb2F0IGZFeHAgPSBjbGFtcCggY2VpbCggbG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLTEyOC4wLCAxMjcuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xcbn1cXG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIHZhbHVlLmEgKiBtYXhSYW5nZSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgTSA9IGNsYW1wKCBtYXhSR0IgLyBtYXhSYW5nZSwgMC4wLCAxLjAgKTtcXG5cXHRNID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcXG5cXHREID0gY2xhbXAoIGZsb29yKCBEICkgLyAyNTUuMCwgMC4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gY0xvZ0x1dk0gKiB2YWx1ZS5yZ2I7XFxuXFx0WHBfWV9YWVpwID0gbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xcblxcdHZlYzQgdlJlc3VsdDtcXG5cXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XFxuXFx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xcblxcdHZSZXN1bHQudyA9IGZyYWN0KCBMZSApO1xcblxcdHZSZXN1bHQueiA9ICggTGUgLSAoIGZsb29yKCB2UmVzdWx0LncgKiAyNTUuMCApICkgLyAyNTUuMCApIC8gMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xcblxcdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xcblxcdFhwX1lfWFlacC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xcblxcdHZlYzMgdlJHQiA9IGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XFxuXFx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xcbn1cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWZkZWYgRU5WX1dPUkxEUE9TXFxuXFx0XFx0dmVjMyBjYW1lcmFUb0ZyYWc7XFxuXFx0XFx0XFxuXFx0XFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcXG5cXHRcXHRcXHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xcblxcdFxcdH0gIGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdH1cXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIDAuMCApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XFxuXFx0XFx0c2FtcGxlVVYueCA9IGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCByZWZsZWN0VmVjICk7XFxuXFx0XFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsIDAuMCwgMS4wICkgKTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXFxuXFx0XFx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5O1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xcblxcdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcXG5cXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xcblxcdCNlbmRpZlxcblxcdFxcbiNlbmRpZlwiO1xuXG52YXIgZW52bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZfV09STERQT1NcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBlbnZtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8ZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVl9XT1JMRFBPU1xcblxcdFxcdFxcblxcdFxcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmZGVmIEVOVl9XT1JMRFBPU1xcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4O1xcblxcdFxcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7IFxcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0fVxcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGZvZ192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0Zm9nRGVwdGggPSAtbXZQb3NpdGlvbi56O1xcbiNlbmRpZlwiO1xuXG52YXIgZm9nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0I2lmZGVmIEZPR19FWFAyXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xcblxcdCNlbmRpZlxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcXG4jZW5kaWZcIjtcblxudmFyIGZvZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcXG5cXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0ZhcjtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfR1JBRElFTlRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcXG4jZW5kaWZcXG52ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcXG5cXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xcblxcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcXG5cXHRcXHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAwLjcgKSA6IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcbn1cIjtcblxudmFyIGxpZ2h0bWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogbGlnaHRNYXBUZXhlbFRvTGluZWFyKCBsaWdodE1hcFRleGVsICkucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG52SW5kaXJlY3RGcm9udCA9IHZlYzMoIDAuMCApO1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XFxuXFx0dkluZGlyZWN0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2SW5kaXJlY3RGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZJbmRpcmVjdEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19wYXJzX2JlZ2luID0gXCJ1bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdztcXG51bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XFxudW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTtcXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xcblxcdGZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XFxuXFx0dmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xcblxcdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xcblxcdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcXG5cXHRyZXR1cm4gcmVzdWx0O1xcbn1cXG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XFxuXFx0cmV0dXJuIGlycmFkaWFuY2U7XFxufVxcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHR9O1xcblxcdFxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0I2VuZGlmXFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFxcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XFxuXFx0XFx0fTtcXG5cXHRcXHR1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0I2VuZGlmXFxuXFx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0ZmxvYXQgY29uZUNvcztcXG5cXHRcXHRmbG9hdCBwZW51bWJyYUNvcztcXG5cXHR9O1xcblxcdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHRzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0fTtcXG5cXHRcXHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0I2VuZGlmXFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQIClcXG5cXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdFxcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHdvcmxkTm9ybWFsLCAxLjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcblxcdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0gZmxvYXQoIG1heE1JUExldmVsICk7XFxuXFx0XFx0ZmxvYXQgc2lnbWEgPSBQSSAqIHJvdWdobmVzcyAqIHJvdWdobmVzcyAvICggMS4wICsgcm91Z2huZXNzICk7XFxuXFx0XFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQTGV2ZWxTY2FsYXIgKyBsb2cyKCBzaWdtYSApO1xcblxcdFxcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XFxuXFx0fVxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0ICB2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XFxuXFx0XFx0ICByZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0ICB2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0XFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCByZWZsZWN0VmVjLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRcXHRcXHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3Rvb25fZnJhZ21lbnQgPSBcIlRvb25NYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcIjtcblxudmFyIGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgVG9vbk1hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdHZlYzNcXHRzcGVjdWxhckNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTaGluaW5lc3M7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclN0cmVuZ3RoO1xcbn07XFxudm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X1Rvb25cXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSBcIlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XFxudmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggZ2VvbWV0cnlOb3JtYWwgKSApLCBhYnMoIGRGZHkoIGdlb21ldHJ5Tm9ybWFsICkgKSApO1xcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgMS4wICk7XFxuI2lmZGVmIFJFRkxFQ1RJVklUWVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuI2VuZGlmXFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IGNsZWFyY29hdDtcXG5cXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcXG5cXHRcXHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZVdiApLng7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXFxuXFx0XFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xcblxcdCNlbmRpZlxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IHNhdHVyYXRlKCBtYXRlcmlhbC5jbGVhcmNvYXQgKTtcXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XFxuXFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcblxcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1NIRUVOXFxuXFx0bWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0dmVjM1xcdHNwZWN1bGFyQ29sb3I7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGZsb2F0IGNsZWFyY29hdDtcXG5cXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9TSEVFTlxcblxcdHZlYzMgc2hlZW5Db2xvcjtcXG4jZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIENMRUFSQ09BVFxcblxcdFxcdGZsb2F0IGNjRG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0XFx0dmVjMyBjY0lycmFkaWFuY2UgPSBjY0RvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0Y2NJcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9TSEVFTlxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcXG5cXHRcXHRcXHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24sXFxuXFx0XFx0XFx0Z2VvbWV0cnksXFxuXFx0XFx0XFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxcblxcdFxcdCk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcXG5cXHRcXHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcXG5cXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIG11bHRpU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XFxuXFx0QlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XFxuXFx0dmVjMyBkaWZmdXNlID0gbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XFxufVwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X2JlZ2luID0gXCJcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcXG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7XFxuXFx0I2VuZGlmXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG4jZW5kaWZcXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcXG5cXHRcXHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcXG5cXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0XFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdH1cXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0aWJsSXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdFxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdFxcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xcblxcdCNlbHNlXFxuXFx0XFx0aWYgKCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKSB7XFxuXFx0XFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xcblxcdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFydGljbGVfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgbWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nO1xcbiNlbmRpZlwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDEgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcXG5cXHQjZWxzZVxcblxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaHRhcmdldF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCIjaWZkZWYgRkxBVF9TSEFERURcXG5cXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcXG4jZWxzZVxcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoIHZUYW5nZW50ICk7XFxuXFx0XFx0dmVjMyBiaXRhbmdlbnQgPSBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dGFuZ2VudCA9IHRhbmdlbnQgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0XFx0XFx0Yml0YW5nZW50ID0gYml0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxcblxcdFxcdFxcdG1hdDMgdlRCTiA9IG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDtcIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9tYXBzID0gXCIjaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXFxuXFx0bm9ybWFsID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHQjaWZkZWYgRkxJUF9TSURFRFxcblxcdFxcdG5vcm1hbCA9IC0gbm9ybWFsO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0bm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcXG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcXG5cXHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xcblxcdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0bm9ybWFsID0gbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xcblxcdCNlbHNlXFxuXFx0XFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIG1hcE4gKTtcXG5cXHQjZW5kaWZcXG4jZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApXFxuXFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcXG4jZW5kaWZcIjtcblxudmFyIG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX05PUk1BTE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcXG5cXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XFxuI2VuZGlmXFxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxcblxcdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XFxuI2VuZGlmXFxuI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIClcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMzIG1hcE4gKSB7XFxuXFx0XFx0dmVjMyBxMCA9IHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHExID0gdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xcblxcdFxcdHZlYzIgc3QwID0gZEZkeCggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMiBzdDEgPSBkRmR5KCB2VXYuc3QgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZSA9IHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XFxuXFx0XFx0dmVjMyBTID0gbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xcblxcdFxcdHZlYzMgVCA9IG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xcblxcdFxcdHZlYzMgTiA9IG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XFxuXFx0XFx0bWF0MyB0c24gPSBtYXQzKCBTLCBULCBOICk7XFxuXFx0XFx0bWFwTi54eSAqPSAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xcblxcdH1cXG4jZW5kaWZcIjtcblxudmFyIGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4gPSBcIiNpZmRlZiBDTEVBUkNPQVRcXG5cXHR2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IGdlb21ldHJ5Tm9ybWFsO1xcbiNlbmRpZlwiO1xuXG52YXIgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzID0gXCIjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcXG5cXHR2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xcblxcdGNsZWFyY29hdE1hcE4ueHkgKj0gY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0Y2xlYXJjb2F0Tm9ybWFsID0gbm9ybWFsaXplKCB2VEJOICogY2xlYXJjb2F0TWFwTiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Y2xlYXJjb2F0Tm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC0gdlZpZXdQb3NpdGlvbiwgY2xlYXJjb2F0Tm9ybWFsLCBjbGVhcmNvYXRNYXBOICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcXG5cXHR1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XFxuI2VuZGlmXCI7XG5cbnZhciBwYWNraW5nID0gXCJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XFxufVxcbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xcblxcdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xcbn1cXG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xcblxcdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xcblxcdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XFx0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcXG59XFxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcXG5cXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XFxufVxcbnZlYzQgcGFjazJIYWxmVG9SR0JBKCB2ZWMyIHYgKSB7XFxuXFx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSk7XFxuXFx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncpO1xcbn1cXG52ZWMyIHVucGFja1JHQkFUbzJIYWxmKCB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XFxufVxcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xcbn1cXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xcbn1cXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XFxufVxcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xcbn1cIjtcblxudmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSBcIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcIjtcblxudmFyIHByb2plY3RfdmVydGV4ID0gXCJ2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0bXZQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogbXZQb3NpdGlvbjtcXG4jZW5kaWZcXG5tdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjtcXG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1wiO1xuXG52YXIgZGl0aGVyaW5nX2ZyYWdtZW50ID0gXCIjaWZkZWYgRElUSEVSSU5HXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBESVRIRVJJTkdcXG5cXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcXG5cXHRcXHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XFxuXFx0XFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcXG5cXHRcXHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xcblxcdFxcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xcblxcdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XFxuXFx0fVxcblxcdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xcblxcdFxcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XFxuXFx0XFx0ZmxvYXQgb2NjbHVzaW9uID0gMS4wO1xcblxcdFxcdHZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XFxuXFx0XFx0ZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcXG5cXHRcXHRpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkge1xcblxcdFxcdFxcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcXG5cXHRcXHRcXHRmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xcblxcdFxcdFxcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XFx0XFx0XFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XFx0XFx0XFx0b2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBvY2NsdXNpb247XFxuXFx0fVxcblxcdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdFxcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xcblxcdFxcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcXG5cXHRcXHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xcblxcdFxcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xcblxcdFxcdGlmICggZnJ1c3R1bVRlc3QgKSB7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XFxuXFx0XFx0XFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xcblxcdFxcdFxcdGZsb2F0IGR4MyA9IGR4MSAvIDIuMDtcXG5cXHRcXHRcXHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XFxuXFx0XFx0XFx0c2hhZG93ID0gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDE3LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSB0ZXhlbFNpemUueDtcXG5cXHRcXHRcXHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xcblxcdFxcdFxcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcXG5cXHRcXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7XFxuXFx0XFx0XFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksXFxuXFx0XFx0XFx0XFx0XFx0IGYueCApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnggKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHQgZi55ICkgK1xcblxcdFxcdFxcdFxcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0XFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXFxuXFx0XFx0XFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xcblxcdFxcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIHNoYWRvdztcXG59XCI7XG5cbnZhciBza2luYmFzZV92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcXG5cXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcXG5cXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcXG5cXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xcblxcdCNpZmRlZiBCT05FX1RFWFRVUkVcXG5cXHRcXHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcXG5cXHRcXHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdGZsb2F0IGogPSBpICogNC4wO1xcblxcdFxcdFxcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdHkgPSBkeSAqICggeSArIDAuNSApO1xcblxcdFxcdFxcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBib25lTWF0cmljZXNbIGludChpKSBdO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XFxuXFx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5ub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcXG5cXHRza2luTWF0cml4ICA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XFxuXFx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0b2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZm5kZWYgc2F0dXJhdGVcXG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXFxuI2VuZGlmXFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ0V4cG9zdXJlO1xcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcXG59XFxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XFxufVxcbiNkZWZpbmUgVW5jaGFydGVkMkhlbHBlciggeCApIG1heCggKCAoIHggKiAoIDAuMTUgKiB4ICsgMC4xMCAqIDAuNTAgKSArIDAuMjAgKiAwLjAyICkgLyAoIHggKiAoIDAuMTUgKiB4ICsgMC41MCApICsgMC4yMCAqIDAuMzAgKSApIC0gMC4wMiAvIDAuMzAsIHZlYzMoIDAuMCApIClcXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcXG59XFxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xcblxcdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XFxufVxcbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCAoIGNvbG9yICogKCAyLjUxICogY29sb3IgKyAwLjAzICkgKSAvICggY29sb3IgKiAoIDIuNDMgKiBjb2xvciArIDAuNTkgKSArIDAuMTQgKSApO1xcbn1cIjtcblxudmFyIHV2X3BhcnNfZnJhZ21lbnQgPSBcIiNpZiAoIGRlZmluZWQoIFVTRV9VViApICYmICEgZGVmaW5lZCggVVZTX1ZFUlRFWF9PTkxZICkgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuI2VuZGlmXCI7XG5cbnZhciB1dl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9VVlxcblxcdCNpZmRlZiBVVlNfVkVSVEVYX09OTFlcXG5cXHRcXHR2ZWMyIHZVdjtcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1VWXFxuXFx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0YXR0cmlidXRlIHZlYzIgdXYyO1xcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcblxcdHVuaWZvcm0gbWF0MyB1djJUcmFuc2Zvcm07XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gKCB1djJUcmFuc2Zvcm0gKiB2ZWMzKCB1djIsIDEgKSApLnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHQjaWZkZWYgVVNFX0lOU1RBTkNJTkdcXG5cXHRcXHR3b3JsZFBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247XFxuI2VuZGlmXCI7XG5cbnZhciBiYWNrZ3JvdW5kX2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcXG52YXJ5aW5nIHZlYzIgdlV2O1xcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xcblxcdGdsX0ZyYWdDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgYmFja2dyb3VuZF92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG52b2lkIG1haW4oKSB7XFxuXFx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcXG5cXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLnh5LCAxLjAsIDEuMCApO1xcbn1cIjtcblxudmFyIGN1YmVfZnJhZyA9IFwiI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWMzIHZSZWZsZWN0ID0gdldvcmxkRGlyZWN0aW9uO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gZW52Q29sb3I7XFxuXFx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBjdWJlX3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcXG59XCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVztcXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41O1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGZyYWdDb29yZFogKTtcXG5cXHQjZW5kaWZcXG59XCI7XG5cbnZhciBkZXB0aF92ZXJ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dkhpZ2hQcmVjaXNpb25aVyA9IGdsX1Bvc2l0aW9uLnp3O1xcbn1cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcXG5cXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XFxuXFx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XFxufVwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG59XCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XFxuXFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XFxuXFx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcblxcdGdsX0ZyYWdDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgZXF1aXJlY3RfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4Plxcbn1cIjtcblxudmFyIGxpbmVkYXNoZWRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XFxudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XFxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcXG5cXHRcXHRkaXNjYXJkO1xcblxcdH1cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG59XCI7XG5cbnZhciBsaW5lZGFzaGVkX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNoYmFzaWNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFxuXFx0XFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgbWVzaGJhc2ljX3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVwiO1xuXG52YXIgbWVzaGxhbWJlcnRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG5cXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gKCBnbF9Gcm9udEZhY2luZyApID8gdkluZGlyZWN0RnJvbnQgOiB2SW5kaXJlY3RCYWNrO1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZJbmRpcmVjdEZyb250O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG5cXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX2ZyYWcgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0dmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuXFx0dmVjMyB4ID0gbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xcblxcdHZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7XFxuXFx0dmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xcblxcdCNpZmRlZiBVU0VfTUFUQ0FQXFxuXFx0XFx0dmVjNCBtYXRjYXBDb2xvciA9IHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xcblxcdFxcdG1hdGNhcENvbG9yID0gbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX3ZlcnQgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdFxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxufVwiO1xuXG52YXIgbWVzaHRvb25fZnJhZyA9IFwiI2RlZmluZSBUT09OXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgbWVzaHRvb25fdmVydCA9IFwiI2RlZmluZSBUT09OXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVwiO1xuXG52YXIgbWVzaHBob25nX2ZyYWcgPSBcIiNkZWZpbmUgUEhPTkdcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgU1RBTkRBUkRcXG4jaWZkZWYgUEhZU0lDQUxcXG5cXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxcblxcdCNkZWZpbmUgQ0xFQVJDT0FUXFxuXFx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcXG4jZW5kaWZcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZmRlZiBUUkFOU1BBUkVOQ1lcXG5cXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcXG4jZW5kaWZcXG4jaWZkZWYgUkVGTEVDVElWSVRZXFxuXFx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XFxuI2VuZGlmXFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfU0hFRU5cXG5cXHR1bmlmb3JtIHZlYzMgc2hlZW47XFxuI2VuZGlmXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHQjaWZkZWYgVFJBTlNQQVJFTkNZXFxuXFx0XFx0ZGlmZnVzZUNvbG9yLmEgKj0gc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNocGh5c2ljYWxfdmVydCA9IFwiI2RlZmluZSBTVEFOREFSRFxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xcblxcdFxcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBub3JtYWxfZnJhZyA9IFwiI2RlZmluZSBOT1JNQUxcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xcblxcdFxcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XFxuXFx0XFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcbn1cIjtcblxudmFyIHBvaW50c19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgcG9pbnRzX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcXG5cXHRcXHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIHNoYWRvd19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgY29sb3I7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgc2hhZG93X3ZlcnQgPSBcIiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBzcHJpdGVfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIHNwcml0ZV92ZXJ0ID0gXCJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xcbnVuaWZvcm0gdmVjMiBjZW50ZXI7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcXG5cXHR2ZWMyIHNjYWxlO1xcblxcdHNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xcblxcdHNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xcblxcdCNpZm5kZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcXG5cXHRcXHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBzY2FsZSAqPSAtIG12UG9zaXRpb24uejtcXG5cXHQjZW5kaWZcXG5cXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xcblxcdHZlYzIgcm90YXRlZFBvc2l0aW9uO1xcblxcdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcXG5cXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XFxuXFx0bXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcblx0ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfdG9vbl9mcmFnbWVudDogbGlnaHRzX3Rvb25fZnJhZ21lbnQsXG5cdGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLFxuXHRsaWdodHNfZnJhZ21lbnRfbWFwczogbGlnaHRzX2ZyYWdtZW50X21hcHMsXG5cdGxpZ2h0c19mcmFnbWVudF9lbmQ6IGxpZ2h0c19mcmFnbWVudF9lbmQsXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcblx0bWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsXG5cdG5vcm1hbF9mcmFnbWVudF9iZWdpbjogbm9ybWFsX2ZyYWdtZW50X2JlZ2luLFxuXHRub3JtYWxfZnJhZ21lbnRfbWFwczogbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjogY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OiBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCxcblx0cGFja2luZzogcGFja2luZyxcblx0cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCxcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcblx0ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxuXHRzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCxcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcblx0c2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxuXHRzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCxcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXG5cdHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCxcblx0dXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsXG5cdHV2Ml92ZXJ0ZXg6IHV2Ml92ZXJ0ZXgsXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxuXG5cdGJhY2tncm91bmRfZnJhZzogYmFja2dyb3VuZF9mcmFnLFxuXHRiYWNrZ3JvdW5kX3ZlcnQ6IGJhY2tncm91bmRfdmVydCxcblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaG1hdGNhcF9mcmFnOiBtZXNobWF0Y2FwX2ZyYWcsXG5cdG1lc2htYXRjYXBfdmVydDogbWVzaG1hdGNhcF92ZXJ0LFxuXHRtZXNodG9vbl9mcmFnOiBtZXNodG9vbl9mcmFnLFxuXHRtZXNodG9vbl92ZXJ0OiBtZXNodG9vbl92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnQsXG5cdHNwcml0ZV9mcmFnOiBzcHJpdGVfZnJhZyxcblx0c3ByaXRlX3ZlcnQ6IHNwcml0ZV92ZXJ0XG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqL1xuXG52YXIgU2hhZGVyTGliID0ge1xuXG5cdGJhc2ljOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWdcblxuXHR9LFxuXG5cdGxhbWJlcnQ6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXG5cblx0fSxcblxuXHRwaG9uZzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ19mcmFnXG5cblx0fSxcblxuXHRzdGFuZGFyZDoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0bWV0YWxuZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxuXHR9LFxuXG5cdHRvb246IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fZnJhZ1xuXG5cdH0sXG5cblx0bWF0Y2FwOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0bWF0Y2FwOiB7IHZhbHVlOiBudWxsIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaG1hdGNhcF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHRzcHJpdGU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcHJpdGUsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNwcml0ZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZ1xuXG5cdH0sXG5cblx0YmFja2dyb3VuZDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0XHR0MkQ6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfZnJhZ1xuXG5cdH0sXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGN1YmU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xuXG5cdH0sXG5cblx0ZXF1aXJlY3Q6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnXG5cblx0fSxcblxuXHRkaXN0YW5jZVJHQkE6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdHJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH0sXG5cdFx0XHRcdG5lYXJEaXN0YW5jZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcblxuXHR9LFxuXG5cdHNoYWRvdzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0Y29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMCApIH0sXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9LFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnXG5cblx0fVxuXG59O1xuXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XG5cblx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXG5cdFx0e1xuXHRcdFx0Y2xlYXJjb2F0OiB7IHZhbHVlOiAwIH0sXG5cdFx0XHRjbGVhcmNvYXRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9LFxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRzaGVlbjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHR0cmFuc3BhcmVuY3k6IHsgdmFsdWU6IDAgfSxcblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIHN0YXRlLCBvYmplY3RzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0dmFyIGNsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHZhciBjbGVhckFscGhhID0gMDtcblxuXHR2YXIgcGxhbmVNZXNoO1xuXHR2YXIgYm94TWVzaDtcblxuXHR2YXIgY3VycmVudEJhY2tncm91bmQgPSBudWxsO1xuXHR2YXIgY3VycmVudEJhY2tncm91bmRWZXJzaW9uID0gMDtcblx0dmFyIGN1cnJlbnRUb25lbWFwcGluZyA9IG51bGw7XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkge1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0Ly8gSWdub3JlIGJhY2tncm91bmQgaW4gQVJcblx0XHQvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuXG5cblx0XHR2YXIgeHIgPSByZW5kZXJlci54cjtcblx0XHR2YXIgc2Vzc2lvbiA9IHhyLmdldFNlc3Npb24gJiYgeHIuZ2V0U2Vzc2lvbigpO1xuXG5cdFx0aWYgKCBzZXNzaW9uICYmIHNlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICdhZGRpdGl2ZScgKSB7XG5cblx0XHRcdGJhY2tncm91bmQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiAoIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSB8fCBiYWNrZ3JvdW5kLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSApIHtcblxuXHRcdFx0aWYgKCBib3hNZXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ym94TWVzaCA9IG5ldyBNZXNoKFxuXHRcdFx0XHRcdG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggMSwgMSwgMSApLFxuXHRcdFx0XHRcdG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ0JhY2tncm91bmRDdWJlTWF0ZXJpYWwnLFxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5jdWJlLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5jdWJlLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEJhY2tTaWRlLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRcdFx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZVxuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ3V2JyApO1xuXG5cdFx0XHRcdGJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gZW5hYmxlIGNvZGUgaW5qZWN0aW9uIGZvciBub24tYnVpbHQtaW4gbWF0ZXJpYWxcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBib3hNZXNoLm1hdGVyaWFsLCAnZW52TWFwJywge1xuXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLmVudk1hcC52YWx1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0b2JqZWN0cy51cGRhdGUoIGJveE1lc2ggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdGV4dHVyZSA9IGJhY2tncm91bmQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPyBiYWNrZ3JvdW5kLnRleHR1cmUgOiBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IHRleHR1cmU7XG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgPyAtIDEgOiAxO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0Ym94TWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0XG5cdFx0XHRyZW5kZXJMaXN0LnVuc2hpZnQoIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggcGxhbmVNZXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdCYWNrZ3JvdW5kTWF0ZXJpYWwnLFxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5iYWNrZ3JvdW5kLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEZyb250U2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRwbGFuZU1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXG5cdFx0XHRcdC8vIGVuYWJsZSBjb2RlIGluamVjdGlvbiBmb3Igbm9uLWJ1aWx0LWluIG1hdGVyaWFsXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggcGxhbmVNZXNoLm1hdGVyaWFsLCAnbWFwJywge1xuXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0b2JqZWN0cy51cGRhdGUoIHBsYW5lTWVzaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRpZiAoIGJhY2tncm91bmQubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBiYWNrZ3JvdW5kLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IGJhY2tncm91bmQudmVyc2lvbjtcblx0XHRcdFx0Y3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XG5cblx0XHRcdH1cblxuXG5cdFx0XHQvLyBwdXNoIHRvIHRoZSBwcmUtc29ydGVkIG9wYXF1ZSByZW5kZXIgbGlzdFxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBwbGFuZU1lc2gsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckNvbG9yO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGEgIT09IHVuZGVmaW5lZCA/IGFscGhhIDogMTtcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHR9LFxuXHRcdGdldENsZWFyQWxwaGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIGNsZWFyQWxwaGE7XG5cblx0XHR9LFxuXHRcdHNldENsZWFyQWxwaGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQWxwaGEgPSBhbHBoYTtcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHR9LFxuXHRcdHJlbmRlcjogcmVuZGVyXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50LCBwcmltY291bnQgKSB7XG5cblx0XHRpZiAoIHByaW1jb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdHZhciBleHRlbnNpb24sIG1ldGhvZE5hbWU7XG5cblx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBnbDtcblx0XHRcdG1ldGhvZE5hbWUgPSAnZHJhd0FycmF5c0luc3RhbmNlZCc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cdFx0XHRtZXRob2ROYW1lID0gJ2RyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSc7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uWyBtZXRob2ROYW1lIF0oIG1vZGUsIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIHByaW1jb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xDYXBhYmlsaXRpZXMoIGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBtYXhBbmlzb3Ryb3B5O1xuXG5cdGZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7XG5cblx0XHRpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICkge1xuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XG5cblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCAzNTYzMywgMzYzMzggKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHRcdGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggMzU2MzIsIDM2MzM4ICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggMzU2MzMsIDM2MzM3ICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0XHRnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMyLCAzNjMzNyApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdtZWRpdW1wJztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICdsb3dwJztcblxuXHR9XG5cblx0LyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cblx0dmFyIGlzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICkgfHxcblx0XHQoIHR5cGVvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCApO1xuXHQvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG5cblx0dmFyIHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XG5cdHZhciBtYXhQcmVjaXNpb24gPSBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApO1xuXG5cdGlmICggbWF4UHJlY2lzaW9uICE9PSBwcmVjaXNpb24gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOicsIHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cdFx0cHJlY2lzaW9uID0gbWF4UHJlY2lzaW9uO1xuXG5cdH1cblxuXHR2YXIgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZTtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM0OTMwICk7XG5cdHZhciBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggMzU2NjAgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCAzMzc5ICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzQwNzYgKTtcblxuXHR2YXIgbWF4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggMzQ5MjEgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNjM0NyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIDM2MzQ4ICk7XG5cdHZhciBtYXhGcmFnbWVudFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNjM0OSApO1xuXG5cdHZhciB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDtcblx0dmFyIGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9IGlzV2ViR0wyIHx8ICEhIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdHZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzO1xuXG5cdHZhciBtYXhTYW1wbGVzID0gaXNXZWJHTDIgPyBnbC5nZXRQYXJhbWV0ZXIoIDM2MTgzICkgOiAwO1xuXG5cdHJldHVybiB7XG5cblx0XHRpc1dlYkdMMjogaXNXZWJHTDIsXG5cblx0XHRnZXRNYXhBbmlzb3Ryb3B5OiBnZXRNYXhBbmlzb3Ryb3B5LFxuXHRcdGdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLFxuXG5cdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdG1heFRleHR1cmVzOiBtYXhUZXh0dXJlcyxcblx0XHRtYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsXG5cdFx0bWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLFxuXHRcdG1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSxcblxuXHRcdG1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsXG5cdFx0bWF4VmVydGV4VW5pZm9ybXM6IG1heFZlcnRleFVuaWZvcm1zLFxuXHRcdG1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncyxcblx0XHRtYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLFxuXG5cdFx0dmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLFxuXHRcdGZsb2F0RnJhZ21lbnRUZXh0dXJlczogZmxvYXRGcmFnbWVudFRleHR1cmVzLFxuXHRcdGZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRtYXhTYW1wbGVzOiBtYXhTYW1wbGVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblxuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cdFx0c2NvcGUubnVtSW50ZXJzZWN0aW9uID0gMDtcblxuXHRcdHJldHVybiBkc3RBcnJheTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7XG5cblx0dmFyIGV4dGVuc2lvbnMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uc1sgbmFtZSBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjtcblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvICkge1xuXG5cdHZhciBnZW9tZXRyaWVzID0gbmV3IFdlYWtNYXAoKTtcblx0dmFyIHdpcmVmcmFtZUF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggZ2VvbWV0cnkgKTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5pbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXNbIG5hbWUgXSApO1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0Z2VvbWV0cmllcy5kZWxldGUoIGdlb21ldHJ5ICk7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0d2lyZWZyYW1lQXR0cmlidXRlcy5kZWxldGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIGdlb21ldHJ5ICk7XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5ICkgcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0Z2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5O1xuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJpZXMuc2V0KCBnZW9tZXRyeSwgYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgKys7XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgMzQ5NjMgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5QXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdLCAzNDk2MiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIDM0OTYyICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeVBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgdmVyc2lvbiA9IDA7XG5cblx0XHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IGdlb21ldHJ5SW5kZXguYXJyYXk7XG5cdFx0XHR2ZXJzaW9uID0gZ2VvbWV0cnlJbmRleC52ZXJzaW9uO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlQb3NpdGlvbi5hcnJheTtcblx0XHRcdHZlcnNpb24gPSBnZW9tZXRyeVBvc2l0aW9uLnZlcnNpb247XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IGkgKyAwO1xuXHRcdFx0XHR2YXIgYiA9IGkgKyAxO1xuXHRcdFx0XHR2YXIgYyA9IGkgKyAyO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblx0XHRhdHRyaWJ1dGUudmVyc2lvbiA9IHZlcnNpb247XG5cblx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCAzNDk2MyApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBwcmV2aW91c0F0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBwcmV2aW91c0F0dHJpYnV0ZSApIGF0dHJpYnV0ZXMucmVtb3ZlKCBwcmV2aW91c0F0dHJpYnV0ZSApO1xuXG5cdFx0Ly9cblxuXHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXMuc2V0KCBnZW9tZXRyeSwgYXR0cmlidXRlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgY3VycmVudEF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBvYnNvbGV0ZSwgY3JlYXRlIGEgbmV3IG9uZVxuXG5cdFx0XHRcdGlmICggY3VycmVudEF0dHJpYnV0ZS52ZXJzaW9uIDwgZ2VvbWV0cnlJbmRleC52ZXJzaW9uICkge1xuXG5cdFx0XHRcdFx0dXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBnZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cblx0XHRnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6IGdldFdpcmVmcmFtZUF0dHJpYnV0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mbywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0dmFyIHR5cGUsIGJ5dGVzUGVyRWxlbWVudDtcblxuXHRmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7XG5cblx0XHR0eXBlID0gdmFsdWUudHlwZTtcblx0XHRieXRlc1BlckVsZW1lbnQgPSB2YWx1ZS5ieXRlc1BlckVsZW1lbnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcblxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0dmFyIGV4dGVuc2lvbiwgbWV0aG9kTmFtZTtcblxuXHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGdsO1xuXHRcdFx0bWV0aG9kTmFtZSA9ICdkcmF3RWxlbWVudHNJbnN0YW5jZWQnO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXHRcdFx0bWV0aG9kTmFtZSA9ICdkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSc7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvblsgbWV0aG9kTmFtZSBdKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQsIHByaW1jb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBwcmltY291bnQgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmZvKCBnbCApIHtcblxuXHR2YXIgbWVtb3J5ID0ge1xuXHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0dGV4dHVyZXM6IDBcblx0fTtcblxuXHR2YXIgcmVuZGVyID0ge1xuXHRcdGZyYW1lOiAwLFxuXHRcdGNhbGxzOiAwLFxuXHRcdHRyaWFuZ2xlczogMCxcblx0XHRwb2ludHM6IDAsXG5cdFx0bGluZXM6IDBcblx0fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIGNvdW50LCBtb2RlLCBpbnN0YW5jZUNvdW50ICkge1xuXG5cdFx0aW5zdGFuY2VDb3VudCA9IGluc3RhbmNlQ291bnQgfHwgMTtcblxuXHRcdHJlbmRlci5jYWxscyArKztcblxuXHRcdHN3aXRjaCAoIG1vZGUgKSB7XG5cblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0cmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAxICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDA6XG5cdFx0XHRcdHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRyZW5kZXIuZnJhbWUgKys7XG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcblx0XHRyZW5kZXIudHJpYW5nbGVzID0gMDtcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcblx0XHRyZW5kZXIubGluZXMgPSAwO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1lbW9yeTogbWVtb3J5LFxuXHRcdHJlbmRlcjogcmVuZGVyLFxuXHRcdHByb2dyYW1zOiBudWxsLFxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcblx0XHRyZXNldDogcmVzZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTW9ycGh0YXJnZXRzKCBnbCApIHtcblxuXHR2YXIgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0dmFyIG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0Ly8gV2hlbiBvYmplY3QgZG9lc24ndCBoYXZlIG1vcnBoIHRhcmdldCBpbmZsdWVuY2VzIGRlZmluZWQsIHdlIHRyZWF0IGl0IGFzIGEgMC1sZW5ndGggYXJyYXlcblx0XHQvLyBUaGlzIGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgd2Ugc2V0IHVwIG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSAvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1xuXG5cdFx0dmFyIGxlbmd0aCA9IG9iamVjdEluZmx1ZW5jZXMgPT09IHVuZGVmaW5lZCA/IDAgOiBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDtcblxuXHRcdHZhciBpbmZsdWVuY2VzID0gaW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGluZmx1ZW5jZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gaW5pdGlhbGlzZSBsaXN0XG5cblx0XHRcdGluZmx1ZW5jZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGluZmx1ZW5jZXNbIGkgXSA9IFsgaSwgMCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdID0gaW5mbHVlbmNlcztcblxuXHRcdH1cblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdC8vIFJlbW92ZSBjdXJyZW50IG1vcnBoQXR0cmlidXRlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGluZmx1ZW5jZVsgMSBdICE9PSAwICkge1xuXG5cdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzICkgZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApO1xuXHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQ29sbGVjdCBpbmZsdWVuY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGluZmx1ZW5jZVsgMCBdID0gaTtcblx0XHRcdGluZmx1ZW5jZVsgMSBdID0gb2JqZWN0SW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0fVxuXG5cdFx0aW5mbHVlbmNlcy5zb3J0KCBhYnNOdW1lcmljYWxTb3J0ICk7XG5cblx0XHQvLyBBZGQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhJbmZsdWVuY2VzU3VtID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApO1xuXG5cdFx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNTdW0gKz0gdmFsdWU7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG1vcnBoSW5mbHVlbmNlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHRcdC8vIEdMU0wgc2hhZGVyIHVzZXMgZm9ybXVsYSBiYXNlaW5mbHVlbmNlICogYmFzZSArIHN1bSh0YXJnZXQgKiBpbmZsdWVuY2UpXG5cdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgbW9ycGhzIGFuZCByZWxhdGl2ZSBtb3JwaHMgd2l0aG91dCBjaGFuZ2luZyBzaGFkZXIgY29kZVxuXHRcdC8vIFdoZW4gYmFzZWluZmx1ZW5jZSA9IDEgLSBzdW0oaW5mbHVlbmNlKSwgdGhlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG8gc3VtKCh0YXJnZXQgLSBiYXNlKSAqIGluZmx1ZW5jZSlcblx0XHR2YXIgbW9ycGhCYXNlSW5mbHVlbmNlID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAxIDogMSAtIG1vcnBoSW5mbHVlbmNlc1N1bTtcblxuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UnLCBtb3JwaEJhc2VJbmZsdWVuY2UgKTtcblx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgbW9ycGhJbmZsdWVuY2VzICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMT2JqZWN0cyggZ2wsIGdlb21ldHJpZXMsIGF0dHJpYnV0ZXMsIGluZm8gKSB7XG5cblx0dmFyIHVwZGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggb2JqZWN0LCBnZW9tZXRyeSApO1xuXG5cdFx0Ly8gVXBkYXRlIG9uY2UgcGVyIGZyYW1lXG5cblx0XHRpZiAoIHVwZGF0ZU1hcC5nZXQoIGJ1ZmZlcmdlb21ldHJ5ICkgIT09IGZyYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0YnVmZmVyZ2VvbWV0cnkudXBkYXRlRnJvbU9iamVjdCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRcdHVwZGF0ZU1hcC5zZXQoIGJ1ZmZlcmdlb21ldHJ5LCBmcmFtZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggb2JqZWN0Lmluc3RhbmNlTWF0cml4LCAzNDk2MiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0dXBkYXRlTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZSggaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdGltYWdlcyA9IGltYWdlcyAhPT0gdW5kZWZpbmVkID8gaW1hZ2VzIDogW107XG5cdG1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkZvcm1hdDtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxufVxuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ3ViZVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZVRleHR1cmU7XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbWFnZTtcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIFRha2FoaXJvIGh0dHBzOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZTJEQXJyYXkoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEgfHwgbnVsbCwgd2lkdGg6IHdpZHRoIHx8IDEsIGhlaWdodDogaGVpZ2h0IHx8IDEsIGRlcHRoOiBkZXB0aCB8fCAxIH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkRhdGFUZXh0dXJlMkRBcnJheS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGF0YVRleHR1cmUyREFycmF5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlMkRBcnJheTtcbkRhdGFUZXh0dXJlMkRBcnJheS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXkgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgQXJ0dXIgVHJ6ZXNpb2tcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZTNEKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApIHtcblxuXHQvLyBXZSdyZSBnb2luZyB0byBhZGQgLnNldFhYWCgpIG1ldGhvZHMgZm9yIHNldHRpbmcgcHJvcGVydGllcyBsYXRlci5cblx0Ly8gVXNlcnMgY2FuIHN0aWxsIHNldCBpbiBEYXRhVGV4dHVyZTNEIGRpcmVjdGx5LlxuXHQvL1xuXHQvL1x0dmFyIHRleHR1cmUgPSBuZXcgVEhSRUUuRGF0YVRleHR1cmUzRCggZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcblx0Ly8gXHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSAxNjtcblx0Ly9cblx0Ly8gU2VlICMxNDgzOVxuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEgfHwgbnVsbCwgd2lkdGg6IHdpZHRoIHx8IDEsIGhlaWdodDogaGVpZ2h0IHx8IDEsIGRlcHRoOiBkZXB0aCB8fCAxIH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cbn1cblxuRGF0YVRleHR1cmUzRC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGF0YVRleHR1cmUzRC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEYXRhVGV4dHVyZTNEO1xuRGF0YVRleHR1cmUzRC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uXG4gKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNwZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsXG4gKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3RleHR1cmVzXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3RleHR1cmVzJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyICh0ZXh0dXJlcyBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCB0ZXh0dXJlcyApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJ1xuICpcbiAqIC5zZXRPcHRpb25hbCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdGxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICpcbiAqL1xuXG52YXIgZW1wdHlUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbnZhciBlbXB0eVRleHR1cmUyZEFycmF5ID0gbmV3IERhdGFUZXh0dXJlMkRBcnJheSgpO1xudmFyIGVtcHR5VGV4dHVyZTNkID0gbmV3IERhdGFUZXh0dXJlM0QoKTtcbnZhciBlbXB0eUN1YmVUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cbi8vIC0tLSBVdGlsaXRpZXMgLS0tXG5cbi8vIEFycmF5IENhY2hlcyAocHJvdmlkZSB0eXBlZCBhcnJheXMgZm9yIHRlbXBvcmFyeSBieSBzaXplKVxuXG52YXIgYXJyYXlDYWNoZUYzMiA9IFtdO1xudmFyIGFycmF5Q2FjaGVJMzIgPSBbXTtcblxuLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zXG5cbnZhciBtYXQ0YXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCAxNiApO1xudmFyIG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDkgKTtcbnZhciBtYXQyYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA0ICk7XG5cbi8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuXG5mdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgbkJsb2NrcywgYmxvY2tTaXplICkge1xuXG5cdHZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdO1xuXG5cdGlmICggZmlyc3RFbGVtIDw9IDAgfHwgZmlyc3RFbGVtID4gMCApIHJldHVybiBhcnJheTtcblx0Ly8gdW5vcHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApXG5cdC8vIHNlZSBodHRwOi8vamFja3NvbmR1bnN0YW4uY29tL2FydGljbGVzLzk4M1xuXG5cdHZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSxcblx0XHRyID0gYXJyYXlDYWNoZUYzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBGbG9hdDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlRjMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRpZiAoIG5CbG9ja3MgIT09IDAgKSB7XG5cblx0XHRmaXJzdEVsZW0udG9BcnJheSggciwgMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBvZmZzZXQgPSAwOyBpICE9PSBuQmxvY2tzOyArKyBpICkge1xuXG5cdFx0XHRvZmZzZXQgKz0gYmxvY2tTaXplO1xuXHRcdFx0YXJyYXlbIGkgXS50b0FycmF5KCByLCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuZnVuY3Rpb24gYXJyYXlzRXF1YWwoIGEsIGIgKSB7XG5cblx0aWYgKCBhLmxlbmd0aCAhPT0gYi5sZW5ndGggKSByZXR1cm4gZmFsc2U7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0aWYgKCBhWyBpIF0gIT09IGJbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gY29weUFycmF5KCBhLCBiICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGIubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdGFbIGkgXSA9IGJbIGkgXTtcblxuXHR9XG5cbn1cblxuLy8gVGV4dHVyZSB1bml0IGFsbG9jYXRpb25cblxuZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKSB7XG5cblx0dmFyIHIgPSBhcnJheUNhY2hlSTMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEludDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlSTMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdHJbIGkgXSA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRyZXR1cm4gcjtcblxufVxuXG4vLyAtLS0gU2V0dGVycyAtLS1cblxuLy8gTm90ZTogRGVmaW5pbmcgdGhlc2UgbWV0aG9kcyBleHRlcm5hbGx5LCBiZWNhdXNlIHRoZXkgY29tZSBpbiBhIGJ1bmNoXG4vLyBhbmQgdGhpcyB3YXkgdGhlaXIgbmFtZXMgbWluaWZ5LlxuXG4vLyBTaW5nbGUgc2NhbGFyXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjFmKCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggY2FjaGVbIDAgXSA9PT0gdiApIHJldHVybjtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNhY2hlWyAwIF0gPSB2O1xuXG59XG5cbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyZiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55ICkge1xuXG5cdFx0XHRnbC51bmlmb3JtMmYoIHRoaXMuYWRkciwgdi54LCB2LnkgKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2YoIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSB8fCBjYWNoZVsgMiBdICE9PSB2LnogKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuejtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCB2LnIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi5yIHx8IGNhY2hlWyAxIF0gIT09IHYuZyB8fCBjYWNoZVsgMiBdICE9PSB2LmIgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7XG5cblx0XHRcdGNhY2hlWyAwIF0gPSB2LnI7XG5cdFx0XHRjYWNoZVsgMSBdID0gdi5nO1xuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuYjtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0ZiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xuXHRcdFx0Y2FjaGVbIDMgXSA9IHYudztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0cml4TilcblxuZnVuY3Rpb24gc2V0VmFsdWVNMiggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblx0dmFyIGVsZW1lbnRzID0gdi5lbGVtZW50cztcblxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcblxuXHRcdG1hdDJhcnJheS5zZXQoIGVsZW1lbnRzICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQyYXJyYXkgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTMoIGdsLCB2ICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciBlbGVtZW50cyA9IHYuZWxlbWVudHM7XG5cblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XG5cblx0XHRtYXQzYXJyYXkuc2V0KCBlbGVtZW50cyApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0M2FycmF5ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00KCBnbCwgdiApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xuXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xuXG5cdFx0bWF0NGFycmF5LnNldCggZWxlbWVudHMgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDRhcnJheSApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMSggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xuXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcblxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XG5cblx0fVxuXG5cdHRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQoIHYgfHwgZW1wdHlUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUMkRBcnJheTEoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHR2YXIgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHR2YXIgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggdiB8fCBlbXB0eVRleHR1cmUyZEFycmF5LCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUM0QxKCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblx0dmFyIHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XG5cblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xuXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcblxuXHR9XG5cblx0dGV4dHVyZXMuc2V0VGV4dHVyZTNEKCB2IHx8IGVtcHR5VGV4dHVyZTNkLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNiggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdHZhciB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xuXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcblxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XG5cblx0fVxuXG5cdHRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxaSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjYWNoZVsgMCBdID0gdjtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzaSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0aSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG4vLyB1aW50XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjF1aSggZ2wsIHYgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTF1aSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyZjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlVjNmOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGY7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTI7IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNDsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlVjFpOyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZVYyaTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZVY0aTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHgxNDA1OiByZXR1cm4gc2V0VmFsdWVWMXVpOyAvLyBVSU5UXG5cblx0XHRjYXNlIDB4OGI1ZTogLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZGQyOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDE7XG5cblx0XHRjYXNlIDB4OGI1ZjogLy8gU0FNUExFUl8zRFxuXHRcdGNhc2UgMHg4ZGNiOiAvLyBJTlRfU0FNUExFUl8zRFxuXHRcdGNhc2UgMHg4ZGQzOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8zRFxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDNEMTtcblxuXHRcdGNhc2UgMHg4YjYwOiAvLyBTQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkYzU6IC8vIFNBTVBMRVJfQ1VCRV9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2O1xuXG5cdFx0Y2FzZSAweDhkYzE6IC8vIFNBTVBMRVJfMkRfQVJSQVlcblx0XHRjYXNlIDB4OGRjZjogLy8gSU5UX1NBTVBMRVJfMkRfQVJSQVlcblx0XHRjYXNlIDB4OGRkNzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVlcblx0XHRjYXNlIDB4OGRjNDogLy8gU0FNUExFUl8yRF9BUlJBWV9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQyREFycmF5MTtcblxuXHR9XG5cbn1cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuZnVuY3Rpb24gc2V0VmFsdWVWMWZBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFmdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKVxuZnVuY3Rpb24gc2V0VmFsdWVWMWlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWMmlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2lBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc3NlcylcblxuZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheSggZ2wsIHYgKSB7XG5cblx0dmFyIGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDIgKTtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGRhdGEgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzZkFycmF5KCBnbCwgdiApIHtcblxuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApO1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjRmQXJyYXkoIGdsLCB2ICkge1xuXG5cdHZhciBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICk7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlTTJBcnJheSggZ2wsIHYgKSB7XG5cblx0dmFyIGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKTtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM0FycmF5KCBnbCwgdiApIHtcblxuXHR2YXIgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgOSApO1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00QXJyYXkoIGdsLCB2ICkge1xuXG5cdHZhciBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApO1xuXG5cdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcblxufVxuXG4vLyBBcnJheSBvZiB0ZXh0dXJlcyAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxQXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoO1xuXG5cdHZhciB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQoIHZbIGkgXSB8fCBlbXB0eVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNkFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aDtcblxuXHR2YXIgdW5pdHMgPSBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR0ZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWZBcnJheTsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJmQXJyYXk7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZkFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGZBcnJheTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMkFycmF5OyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM0FycmF5OyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNEFycmF5OyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWlBcnJheTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmlBcnJheTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaUFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpQXJyYXk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1ZTogLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZGQyOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDFBcnJheTtcblxuXHRcdGNhc2UgMHg4YjYwOiAvLyBTQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkYzU6IC8vIFNBTVBMRVJfQ1VCRV9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2QXJyYXk7XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5jYWNoZSA9IFtdO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuY2FjaGUgPSBbXTtcblx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuUHVyZUFycmF5VW5pZm9ybS5wcm90b3R5cGUudXBkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0dmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGRhdGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgJiYgY2FjaGUubGVuZ3RoICE9PSBkYXRhLmxlbmd0aCApIHtcblxuXHRcdHRoaXMuY2FjaGUgPSBuZXcgRmxvYXQzMkFycmF5KCBkYXRhLmxlbmd0aCApO1xuXG5cdH1cblxuXHRjb3B5QXJyYXkoIGNhY2hlLCBkYXRhICk7XG5cbn07XG5cbmZ1bmN0aW9uIFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cblx0dGhpcy5zZXEgPSBbXTtcblx0dGhpcy5tYXAgPSB7fTtcblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKSB7XG5cblx0dmFyIHNlcSA9IHRoaXMuc2VxO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdO1xuXHRcdHUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdLCB0ZXh0dXJlcyApO1xuXG5cdH1cblxufTtcblxuLy8gLS0tIFRvcC1sZXZlbCAtLS1cblxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xuXG52YXIgUmVQYXRoUGFydCA9IC8oW1xcd1xcZF9dKykoXFxdKT8oXFxbfFxcLik/L2c7XG5cbi8vIGV4dHJhY3RzXG4vLyBcdC0gdGhlIGlkZW50aWZpZXIgKG1lbWJlciBuYW1lIG9yIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgcmlnaHQgYnJhY2tldCAoZm91bmQgd2hlbiBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGxlZnQgYnJhY2tldCBvciBkb3QgKHR5cGUgb2Ygc3Vic2NyaXB0KVxuLy9cbi8vIE5vdGU6IFRoZXNlIHBvcnRpb25zIGNhbiBiZSByZWFkIGluIGEgbm9uLW92ZXJsYXBwaW5nIGZhc2hpb24gYW5kXG4vLyBhbGxvdyBzdHJhaWdodGZvcndhcmQgcGFyc2luZyBvZiB0aGUgaGllcmFyY2h5IHRoYXQgV2ViR0wgZW5jb2Rlc1xuLy8gaW4gdGhlIHVuaWZvcm0gbmFtZXMuXG5cbmZ1bmN0aW9uIGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHtcblxuXHRjb250YWluZXIuc2VxLnB1c2goIHVuaWZvcm1PYmplY3QgKTtcblx0Y29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5pZm9ybU9iamVjdDtcblxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaWZvcm0oIGFjdGl2ZUluZm8sIGFkZHIsIGNvbnRhaW5lciApIHtcblxuXHR2YXIgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSxcblx0XHRwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cblx0Ly8gcmVzZXQgUmVnRXhwIG9iamVjdCwgYmVjYXVzZSBvZiB0aGUgZWFybHkgZXhpdCBvZiBhIHByZXZpb3VzIHJ1blxuXHRSZVBhdGhQYXJ0Lmxhc3RJbmRleCA9IDA7XG5cblx0d2hpbGUgKCB0cnVlICkge1xuXG5cdFx0dmFyIG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXG5cdFx0XHRtYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4LFxuXG5cdFx0XHRpZCA9IG1hdGNoWyAxIF0sXG5cdFx0XHRpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xuXG5cdFx0aWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyXG5cblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcblxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxuXG5cdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxuXHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xuXG5cdFx0XHRicmVhaztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxuXG5cdFx0XHR2YXIgbWFwID0gY29udGFpbmVyLm1hcCwgbmV4dCA9IG1hcFsgaWQgXTtcblxuXHRcdFx0aWYgKCBuZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bmV4dCA9IG5ldyBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKTtcblx0XHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBuZXh0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29udGFpbmVyID0gbmV4dDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gUm9vdCBDb250YWluZXJcblxuZnVuY3Rpb24gV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0gKSB7XG5cblx0dGhpcy5zZXEgPSBbXTtcblx0dGhpcy5tYXAgPSB7fTtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIDM1NzE4ICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgKysgaSApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybSggcHJvZ3JhbSwgaSApLFxuXHRcdFx0YWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgaW5mby5uYW1lICk7XG5cblx0XHRwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMgKSB7XG5cblx0dmFyIHUgPSB0aGlzLm1hcFsgbmFtZSBdO1xuXG5cdGlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0ZXh0dXJlcyApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTaGFkZXIoIGdsLCB0eXBlLCBzdHJpbmcgKSB7XG5cblx0dmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggdHlwZSApO1xuXG5cdGdsLnNoYWRlclNvdXJjZSggc2hhZGVyLCBzdHJpbmcgKTtcblx0Z2wuY29tcGlsZVNoYWRlciggc2hhZGVyICk7XG5cblx0cmV0dXJuIHNoYWRlcjtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIHByb2dyYW1JZENvdW50ID0gMDtcblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRjYXNlIExvZ0x1dkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0xvZ0x1dicsICcoIHZhbHVlICknIF07XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgc2hhZGVyLCB0eXBlICkge1xuXG5cdHZhciBzdGF0dXMgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgMzU3MTMgKTtcblx0dmFyIGxvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLnRyaW0oKTtcblxuXHRpZiAoIHN0YXR1cyAmJiBsb2cgPT09ICcnICkgcmV0dXJuICcnO1xuXG5cdC8vIC0tZW5hYmxlLXByaXZpbGVnZWQtd2ViZ2wtZXh0ZW5zaW9uXG5cdC8vIGNvbnNvbGUubG9nKCAnKionICsgdHlwZSArICcqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHR2YXIgc291cmNlID0gZ2wuZ2V0U2hhZGVyU291cmNlKCBzaGFkZXIgKTtcblxuXHRyZXR1cm4gJ1RIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCkgJyArIHR5cGUgKyAnXFxuJyArIGxvZyArIGFkZExpbmVOdW1iZXJzKCBzb3VyY2UgKTtcblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0FDRVNGaWxtaWMnO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6ICcgKyB0b25lTWFwcGluZyApO1xuXG5cdH1cblxuXHRyZXR1cm4gJ3ZlYzMgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzMgY29sb3IgKSB7IHJldHVybiAnICsgdG9uZU1hcHBpbmdOYW1lICsgJ1RvbmVNYXBwaW5nKCBjb2xvciApOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uRGVyaXZhdGl2ZXMgfHwgcGFyYW1ldGVycy5lbnZNYXBDdWJlVVYgfHwgcGFyYW1ldGVycy5idW1wTWFwIHx8IHBhcmFtZXRlcnMudGFuZ2VudFNwYWNlTm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgfHwgcGFyYW1ldGVycy5zaGFkZXJJRCA9PT0gJ3BoeXNpY2FsJyApID8gJyNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggcGFyYW1ldGVycy5leHRlbnNpb25GcmFnRGVwdGggfHwgcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aCA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggcGFyYW1ldGVycy5leHRlbnNpb25EcmF3QnVmZmVycyAmJiBwYXJhbWV0ZXJzLnJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnMgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLFxuXHRcdCggcGFyYW1ldGVycy5leHRlbnNpb25TaGFkZXJUZXh0dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2QgPyAnI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogZW5hYmxlJyA6ICcnXG5cdF07XG5cblx0cmV0dXJuIGNodW5rcy5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkge1xuXG5cdHZhciBjaHVua3MgPSBbXTtcblxuXHRmb3IgKCB2YXIgbmFtZSBpbiBkZWZpbmVzICkge1xuXG5cdFx0dmFyIHZhbHVlID0gZGVmaW5lc1sgbmFtZSBdO1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdGNodW5rcy5wdXNoKCAnI2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7XG5cblx0fVxuXG5cdHJldHVybiBjaHVua3Muam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKSB7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIDM1NzIxICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgaSArKyApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlQXR0cmliKCBwcm9ncmFtLCBpICk7XG5cdFx0dmFyIG5hbWUgPSBpbmZvLm5hbWU7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApO1xuXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGF0dHJpYnV0ZXM7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX0hFTUlfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfU0hBRE9XUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyApO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyApXG5cdFx0LnJlcGxhY2UoIC9VTklPTl9DTElQUElOR19QTEFORVMvZywgKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uICkgKTtcblxufVxuXG4vLyBSZXNvbHZlIEluY2x1ZGVzXG5cbnZhciBpbmNsdWRlUGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuL10rKT4vZ207XG5cbmZ1bmN0aW9uIHJlc29sdmVJbmNsdWRlcyggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggaW5jbHVkZVBhdHRlcm4sIGluY2x1ZGVSZXBsYWNlciApO1xuXG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVSZXBsYWNlciggbWF0Y2gsIGluY2x1ZGUgKSB7XG5cblx0dmFyIHN0cmluZyA9IFNoYWRlckNodW5rWyBpbmNsdWRlIF07XG5cblx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0NhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8JyArIGluY2x1ZGUgKyAnPicgKTtcblxuXHR9XG5cblx0cmV0dXJuIHJlc29sdmVJbmNsdWRlcyggc3RyaW5nICk7XG5cbn1cblxuLy8gVW5yb2xsIExvb3BzXG5cbnZhciBkZXByZWNhdGVkVW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcFtcXHNdKz9mb3IgXFwoIGludCBpIFxcPSAoXFxkKylcXDsgaSA8IChcXGQrKVxcOyBpIFxcK1xcKyBcXCkgXFx7KFtcXHNcXFNdKz8pKD89XFx9KVxcfS9nO1xudmFyIHVucm9sbExvb3BQYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH1bXFxzXSs/I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztcblxuZnVuY3Rpb24gdW5yb2xsTG9vcHMoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIHVucm9sbExvb3BQYXR0ZXJuLCBsb29wUmVwbGFjZXIgKVxuXHRcdC5yZXBsYWNlKCBkZXByZWNhdGVkVW5yb2xsTG9vcFBhdHRlcm4sIGRlcHJlY2F0ZWRMb29wUmVwbGFjZXIgKTtcblxufVxuXG5mdW5jdGlvbiBkZXByZWNhdGVkTG9vcFJlcGxhY2VyKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdXZWJHTFByb2dyYW06ICNwcmFnbWEgdW5yb2xsX2xvb3Agc2hhZGVyIHN5bnRheCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQgc3ludGF4IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbG9vcFJlcGxhY2VyKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApO1xuXG59XG5cbmZ1bmN0aW9uIGxvb3BSZXBsYWNlciggbWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQgKSB7XG5cblx0dmFyIHN0cmluZyA9ICcnO1xuXG5cdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRzdHJpbmcgKz0gc25pcHBldFxuXHRcdFx0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nIClcblx0XHRcdC5yZXBsYWNlKCAvVU5ST0xMRURfTE9PUF9JTkRFWC9nLCBpICk7XG5cblx0fVxuXG5cdHJldHVybiBzdHJpbmc7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gZ2VuZXJhdGVQcmVjaXNpb24oIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIHByZWNpc2lvbnN0cmluZyA9IFwicHJlY2lzaW9uIFwiICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyBcIiBmbG9hdDtcXG5wcmVjaXNpb24gXCIgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArIFwiIGludDtcIjtcblxuXHRpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSBcImhpZ2hwXCIgKSB7XG5cblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gXCJcXG4jZGVmaW5lIEhJR0hfUFJFQ0lTSU9OXCI7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09IFwibWVkaXVtcFwiICkge1xuXG5cdFx0cHJlY2lzaW9uc3RyaW5nICs9IFwiXFxuI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OXCI7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09IFwibG93cFwiICkge1xuXG5cdFx0cHJlY2lzaW9uc3RyaW5nICs9IFwiXFxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OXCI7XG5cblx0fVxuXG5cdHJldHVybiBwcmVjaXNpb25zdHJpbmc7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTaGFkb3dNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0YnO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQnO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9WU00nO1xuXG5cdH1cblxuXHRyZXR1cm4gc2hhZG93TWFwVHlwZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkVfVVYnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfRVFVSVJFQyc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX1NQSEVSRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwVHlwZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIGVudk1hcE1vZGVEZWZpbmU7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFbnZNYXBCbGVuZGluZ0RlZmluZSggcGFyYW1ldGVycyApIHtcblxuXHR2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX05PTkUnO1xuXG5cdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7XG5cblx0XHRzd2l0Y2ggKCBwYXJhbWV0ZXJzLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwQmxlbmRpbmdEZWZpbmU7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY2FjaGVLZXksIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuZ2V0Q29udGV4dCgpO1xuXG5cdHZhciBkZWZpbmVzID0gcGFyYW1ldGVycy5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBwYXJhbWV0ZXJzLnZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50U2hhZGVyID0gcGFyYW1ldGVycy5mcmFnbWVudFNoYWRlcjtcblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZVNoYWRvd01hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblx0dmFyIGVudk1hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblx0dmFyIGVudk1hcE1vZGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gZ2VuZXJhdGVFbnZNYXBCbGVuZGluZ0RlZmluZSggcGFyYW1ldGVycyApO1xuXG5cblx0dmFyIGdhbW1hRmFjdG9yRGVmaW5lID0gKCByZW5kZXJlci5nYW1tYUZhY3RvciA+IDAgKSA/IHJlbmRlcmVyLmdhbW1hRmFjdG9yIDogMS4wO1xuXG5cdHZhciBjdXN0b21FeHRlbnNpb25zID0gcGFyYW1ldGVycy5pc1dlYkdMMiA/ICcnIDogZ2VuZXJhdGVFeHRlbnNpb25zKCBwYXJhbWV0ZXJzICk7XG5cblx0dmFyIGN1c3RvbURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTtcblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeFZlcnRleC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhWZXJ0ZXggKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhGcmFnbWVudCArPSAnXFxuJztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmcgPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VXZzID8gJyNkZWZpbmUgVVNFX1VWJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy51dnNWZXJ0ZXhPbmx5ID8gJyNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2tpbm5pbmcgPyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1cmUgPyAnI2RlZmluZSBCT05FX1RFWFRVUkUnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID8gJyNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICcjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04nIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGggKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7JyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfSU5TVEFOQ0lORycsXG5cblx0XHRcdCcgYXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1RBTkdFTlQnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9DT0xPUicsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7JyxcblxuXHRcdFx0J1x0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLFxuXG5cdFx0XHQnXHQjZWxzZScsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsXG5cblx0XHRcdCdcdCNlbmRpZicsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cblx0XHRcdGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICksXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCArICggcGFyYW1ldGVycy5hbHBoYVRlc3QgJSAxID8gJycgOiAnLjAnICkgOiAnJywgLy8gYWRkICcuMCcgaWYgaW50ZWdlclxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cDIgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1hdGNhcCA/ICcjZGVmaW5lIFVTRV9NQVRDQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuID8gJyNkZWZpbmUgVVNFX1NIRUVOJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VXZzID8gJyNkZWZpbmUgVVNFX1VWJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy51dnNWZXJ0ZXhPbmx5ID8gJyNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmdyYWRpZW50TWFwID8gJyNkZWZpbmUgVVNFX0dSQURJRU5UTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA/ICcjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPyAnI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiBwYXJhbWV0ZXJzLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQoICggcGFyYW1ldGVycy5leHRlbnNpb25TaGFkZXJUZXh0dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2QgKSA/ICcjZGVmaW5lIFRFWFRVUkVfTE9EX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cdFx0XHQndW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOycsXG5cblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggJ3RvbmVNYXBwaW5nJywgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLm1hdGNhcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubGlnaHRNYXBFbmNvZGluZyApID9cblx0XHRcdFx0U2hhZGVyQ2h1bmtbICdlbmNvZGluZ3NfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0cGFyYW1ldGVycy5tYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWF0Y2FwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXRjYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXRjYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2xpZ2h0TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubGlnaHRNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nID8gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCAnbGluZWFyVG9PdXRwdXRUZXhlbCcsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA/ICcjZGVmaW5lIERFUFRIX1BBQ0tJTkcgJyArIHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcmVzb2x2ZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0ZnJhZ21lbnRTaGFkZXIgPSByZXNvbHZlSW5jbHVkZXMoIGZyYWdtZW50U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0dmVydGV4U2hhZGVyID0gdW5yb2xsTG9vcHMoIHZlcnRleFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHVucm9sbExvb3BzKCBmcmFnbWVudFNoYWRlciApO1xuXG5cdGlmICggcGFyYW1ldGVycy5pc1dlYkdMMiAmJiAhIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHZhciBpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPSBmYWxzZTtcblxuXHRcdHZhciB2ZXJzaW9uUmVnZXggPSAvXlxccyojdmVyc2lvblxccyszMDBcXHMrZXNcXHMqXFxuLztcblxuXHRcdGlmICggcGFyYW1ldGVycy5pc1NoYWRlck1hdGVyaWFsICYmXG5cdFx0XHR2ZXJ0ZXhTaGFkZXIubWF0Y2goIHZlcnNpb25SZWdleCApICE9PSBudWxsICYmXG5cdFx0XHRmcmFnbWVudFNoYWRlci5tYXRjaCggdmVyc2lvblJlZ2V4ICkgIT09IG51bGwgKSB7XG5cblx0XHRcdGlzR0xTTDNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblx0XHRcdHZlcnRleFNoYWRlciA9IHZlcnRleFNoYWRlci5yZXBsYWNlKCB2ZXJzaW9uUmVnZXgsICcnICk7XG5cdFx0XHRmcmFnbWVudFNoYWRlciA9IGZyYWdtZW50U2hhZGVyLnJlcGxhY2UoIHZlcnNpb25SZWdleCwgJycgKTtcblxuXHRcdH1cblxuXHRcdC8vIEdMU0wgMy4wIGNvbnZlcnNpb25cblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblx0XHRcdCcjdmVyc2lvbiAzMDAgZXNcXG4nLFxuXHRcdFx0JyNkZWZpbmUgYXR0cmlidXRlIGluJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgb3V0Jyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlJ1xuXHRcdF0uam9pbiggJ1xcbicgKSArICdcXG4nICsgcHJlZml4VmVydGV4O1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cdFx0XHQnI3ZlcnNpb24gMzAwIGVzXFxuJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgaW4nLFxuXHRcdFx0aXNHTFNMM1NoYWRlck1hdGVyaWFsID8gJycgOiAnb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOycsXG5cdFx0XHRpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPyAnJyA6ICcjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3InLFxuXHRcdFx0JyNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZScsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2onLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCdcblx0XHRdLmpvaW4oICdcXG4nICkgKyAnXFxuJyArIHByZWZpeEZyYWdtZW50O1xuXG5cdH1cblxuXHR2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50R2xzbCA9IHByZWZpeEZyYWdtZW50ICsgZnJhZ21lbnRTaGFkZXI7XG5cblx0Ly8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTtcblx0Ly8gY29uc29sZS5sb2coICcqRlJBR01FTlQqJywgZnJhZ21lbnRHbHNsICk7XG5cblx0dmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMywgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgMzU2MzIsIGZyYWdtZW50R2xzbCApO1xuXG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLlxuXG5cdGlmICggcGFyYW1ldGVycy5pbmRleDBBdHRyaWJ1dGVOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsIHBhcmFtZXRlcnMuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0Ly8gY2hlY2sgZm9yIGxpbmsgZXJyb3JzXG5cdGlmICggcmVuZGVyZXIuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICkudHJpbSgpO1xuXHRcdHZhciB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApLnRyaW0oKTtcblx0XHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xuXG5cdFx0dmFyIHJ1bm5hYmxlID0gdHJ1ZTtcblx0XHR2YXIgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTtcblxuXHRcdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgMzU3MTQgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRcdHZhciB2ZXJ0ZXhFcnJvcnMgPSBnZXRTaGFkZXJFcnJvcnMoIGdsLCBnbFZlcnRleFNoYWRlciwgJ3ZlcnRleCcgKTtcblx0XHRcdHZhciBmcmFnbWVudEVycm9ycyA9IGdldFNoYWRlckVycm9ycyggZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICdmcmFnbWVudCcgKTtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnMzU3MTUnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxNSApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhFcnJvcnMsIGZyYWdtZW50RXJyb3JzICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdFx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRcdGhhdmVEaWFnbm9zdGljcyA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHRcdHRoaXMuZGlhZ25vc3RpY3MgPSB7XG5cblx0XHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXG5cdFx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdFx0dmVydGV4U2hhZGVyOiB7XG5cblx0XHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gY2xlYW4gdXBcblxuXHRnbC5kZXRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRldGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuZGVsZXRlU2hhZGVyKCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIHVuaWZvcm0gbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZFVuaWZvcm1zO1xuXG5cdHRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZFVuaWZvcm1zID0gbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLnNoYWRlck5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jYWNoZUtleSA9IGNhY2hlS2V5O1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW1zKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBwcm9ncmFtcyA9IFtdO1xuXG5cdHZhciBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblx0dmFyIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjtcblx0dmFyIGZsb2F0VmVydGV4VGV4dHVyZXMgPSBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcztcblx0dmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cdHZhciBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGNhcGFiaWxpdGllcy5tYXhWZXJ0ZXhVbmlmb3Jtcztcblx0dmFyIHZlcnRleFRleHR1cmVzID0gY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdHZhciBzaGFkZXJJRHMgPSB7XG5cdFx0TWVzaERlcHRoTWF0ZXJpYWw6ICdkZXB0aCcsXG5cdFx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6ICdkaXN0YW5jZVJHQkEnLFxuXHRcdE1lc2hOb3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsXG5cdFx0TWVzaEJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TWVzaExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLFxuXHRcdE1lc2hQaG9uZ01hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hUb29uTWF0ZXJpYWw6ICd0b29uJyxcblx0XHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRNZXNoTWF0Y2FwTWF0ZXJpYWw6ICdtYXRjYXAnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxuXHRcdFNoYWRvd01hdGVyaWFsOiAnc2hhZG93Jyxcblx0XHRTcHJpdGVNYXRlcmlhbDogJ3Nwcml0ZSdcblx0fTtcblxuXHR2YXIgcGFyYW1ldGVyTmFtZXMgPSBbXG5cdFx0XCJwcmVjaXNpb25cIiwgXCJpc1dlYkdMMlwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJvdXRwdXRFbmNvZGluZ1wiLCBcImluc3RhbmNpbmdcIixcblx0XHRcIm1hcFwiLCBcIm1hcEVuY29kaW5nXCIsIFwibWF0Y2FwXCIsIFwibWF0Y2FwRW5jb2RpbmdcIiwgXCJlbnZNYXBcIiwgXCJlbnZNYXBNb2RlXCIsIFwiZW52TWFwRW5jb2RpbmdcIiwgXCJlbnZNYXBDdWJlVVZcIixcblx0XHRcImxpZ2h0TWFwXCIsIFwibGlnaHRNYXBFbmNvZGluZ1wiLCBcImFvTWFwXCIsIFwiZW1pc3NpdmVNYXBcIiwgXCJlbWlzc2l2ZU1hcEVuY29kaW5nXCIsIFwiYnVtcE1hcFwiLCBcIm5vcm1hbE1hcFwiLCBcIm9iamVjdFNwYWNlTm9ybWFsTWFwXCIsIFwidGFuZ2VudFNwYWNlTm9ybWFsTWFwXCIsIFwiY2xlYXJjb2F0TWFwXCIsIFwiY2xlYXJjb2F0Um91Z2huZXNzTWFwXCIsIFwiY2xlYXJjb2F0Tm9ybWFsTWFwXCIsIFwiZGlzcGxhY2VtZW50TWFwXCIsIFwic3BlY3VsYXJNYXBcIixcblx0XHRcInJvdWdobmVzc01hcFwiLCBcIm1ldGFsbmVzc01hcFwiLCBcImdyYWRpZW50TWFwXCIsXG5cdFx0XCJhbHBoYU1hcFwiLCBcImNvbWJpbmVcIiwgXCJ2ZXJ0ZXhDb2xvcnNcIiwgXCJ2ZXJ0ZXhUYW5nZW50c1wiLCBcInZlcnRleFV2c1wiLCBcInV2c1ZlcnRleE9ubHlcIiwgXCJmb2dcIiwgXCJ1c2VGb2dcIiwgXCJmb2dFeHAyXCIsXG5cdFx0XCJmbGF0U2hhZGluZ1wiLCBcInNpemVBdHRlbnVhdGlvblwiLCBcImxvZ2FyaXRobWljRGVwdGhCdWZmZXJcIiwgXCJza2lubmluZ1wiLFxuXHRcdFwibWF4Qm9uZXNcIiwgXCJ1c2VWZXJ0ZXhUZXh0dXJlXCIsIFwibW9ycGhUYXJnZXRzXCIsIFwibW9ycGhOb3JtYWxzXCIsXG5cdFx0XCJtYXhNb3JwaFRhcmdldHNcIiwgXCJtYXhNb3JwaE5vcm1hbHNcIiwgXCJwcmVtdWx0aXBsaWVkQWxwaGFcIixcblx0XHRcIm51bURpckxpZ2h0c1wiLCBcIm51bVBvaW50TGlnaHRzXCIsIFwibnVtU3BvdExpZ2h0c1wiLCBcIm51bUhlbWlMaWdodHNcIiwgXCJudW1SZWN0QXJlYUxpZ2h0c1wiLFxuXHRcdFwibnVtRGlyTGlnaHRTaGFkb3dzXCIsIFwibnVtUG9pbnRMaWdodFNoYWRvd3NcIiwgXCJudW1TcG90TGlnaHRTaGFkb3dzXCIsXG5cdFx0XCJzaGFkb3dNYXBFbmFibGVkXCIsIFwic2hhZG93TWFwVHlwZVwiLCBcInRvbmVNYXBwaW5nXCIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0XCJhbHBoYVRlc3RcIiwgXCJkb3VibGVTaWRlZFwiLCBcImZsaXBTaWRlZFwiLCBcIm51bUNsaXBwaW5nUGxhbmVzXCIsIFwibnVtQ2xpcEludGVyc2VjdGlvblwiLCBcImRlcHRoUGFja2luZ1wiLCBcImRpdGhlcmluZ1wiLFxuXHRcdFwic2hlZW5cIlxuXHRdO1xuXG5cdGZ1bmN0aW9uIGdldFNoYWRlck9iamVjdCggbWF0ZXJpYWwsIHNoYWRlcklEICkge1xuXG5cdFx0dmFyIHNoYWRlcm9iamVjdDtcblxuXHRcdGlmICggc2hhZGVySUQgKSB7XG5cblx0XHRcdHZhciBzaGFkZXIgPSBTaGFkZXJMaWJbIHNoYWRlcklEIF07XG5cblx0XHRcdHNoYWRlcm9iamVjdCA9IHtcblx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNoYWRlci51bmlmb3JtcyApLFxuXHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdH07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzaGFkZXJvYmplY3QgPSB7XG5cdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdHVuaWZvcm1zOiBtYXRlcmlhbC51bmlmb3Jtcyxcblx0XHRcdFx0dmVydGV4U2hhZGVyOiBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFkZXJvYmplY3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0cmV0dXJuIDEwMjQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBkZWZhdWx0IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkXG5cdFx0XHQvLyAoIGZvciBleGFtcGxlIHdoZW4gcHJlYnVpbGRpbmcgc2hhZGVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvYmplY3RzIClcblx0XHRcdC8vXG5cdFx0XHQvLyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlmb3Jtc1xuXHRcdFx0Ly8gIC0gbGltaXQgaGVyZSBpcyBBTkdMRSdzIDI1NCBtYXggdW5pZm9ybSB2ZWN0b3JzXG5cdFx0XHQvLyAgICAodXAgdG8gNTQgc2hvdWxkIGJlIHNhZmUpXG5cblx0XHRcdHZhciBuVmVydGV4VW5pZm9ybXMgPSBtYXhWZXJ0ZXhVbmlmb3Jtcztcblx0XHRcdHZhciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdHZhciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVzLmxlbmd0aCApO1xuXG5cdFx0XHRpZiAoIG1heEJvbmVzIDwgYm9uZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAnICsgYm9uZXMubGVuZ3RoICsgJyBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgJyArIG1heEJvbmVzICsgJy4nICk7XG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXhCb25lcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWFwICkge1xuXG5cdFx0dmFyIGVuY29kaW5nO1xuXG5cdFx0aWYgKCAhIG1hcCApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gbWFwLmVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdGVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgc2NlbmUsIG5DbGlwUGxhbmVzLCBuQ2xpcEludGVyc2VjdGlvbiwgb2JqZWN0ICkge1xuXG5cdFx0dmFyIGZvZyA9IHNjZW5lLmZvZztcblx0XHR2YXIgZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXG5cdFx0dmFyIGVudk1hcCA9IG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudDtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHNoYWRlcm9iamVjdCA9IGdldFNoYWRlck9iamVjdCggbWF0ZXJpYWwsIHNoYWRlcklEICk7XG5cdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBzaGFkZXJvYmplY3QsIHJlbmRlcmVyICk7XG5cblx0XHR2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSB7XG5cblx0XHRcdGlzV2ViR0wyOiBpc1dlYkdMMixcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXHRcdFx0c2hhZGVyTmFtZTogc2hhZGVyb2JqZWN0Lm5hbWUsXG5cblx0XHRcdHVuaWZvcm1zOiBzaGFkZXJvYmplY3QudW5pZm9ybXMsXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlcm9iamVjdC52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogc2hhZGVyb2JqZWN0LmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0ZGVmaW5lczogbWF0ZXJpYWwuZGVmaW5lcyxcblxuXHRcdFx0aXNSYXdTaGFkZXJNYXRlcmlhbDogbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCxcblx0XHRcdGlzU2hhZGVyTWF0ZXJpYWw6IG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXG5cdFx0XHRpbnN0YW5jaW5nOiBvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlLFxuXG5cdFx0XHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRcdG91dHB1dEVuY29kaW5nOiAoIGN1cnJlbnRSZW5kZXJUYXJnZXQgIT09IG51bGwgKSA/IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIGN1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZSApIDogcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcsXG5cdFx0XHRtYXA6ICEhIG1hdGVyaWFsLm1hcCxcblx0XHRcdG1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXAgKSxcblx0XHRcdG1hdGNhcDogISEgbWF0ZXJpYWwubWF0Y2FwLFxuXHRcdFx0bWF0Y2FwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hdGNhcCApLFxuXHRcdFx0ZW52TWFwOiAhISBlbnZNYXAsXG5cdFx0XHRlbnZNYXBNb2RlOiBlbnZNYXAgJiYgZW52TWFwLm1hcHBpbmcsXG5cdFx0XHRlbnZNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggZW52TWFwICksXG5cdFx0XHRlbnZNYXBDdWJlVVY6ICggISEgZW52TWFwICkgJiYgKCAoIGVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApIHx8ICggZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nICkgKSxcblx0XHRcdGxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCxcblx0XHRcdGxpZ2h0TWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmxpZ2h0TWFwICksXG5cdFx0XHRhb01hcDogISEgbWF0ZXJpYWwuYW9NYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcDogISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApLFxuXHRcdFx0YnVtcE1hcDogISEgbWF0ZXJpYWwuYnVtcE1hcCxcblx0XHRcdG5vcm1hbE1hcDogISEgbWF0ZXJpYWwubm9ybWFsTWFwLFxuXHRcdFx0b2JqZWN0U3BhY2VOb3JtYWxNYXA6IG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPT09IE9iamVjdFNwYWNlTm9ybWFsTWFwLFxuXHRcdFx0dGFuZ2VudFNwYWNlTm9ybWFsTWFwOiBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID09PSBUYW5nZW50U3BhY2VOb3JtYWxNYXAsXG5cdFx0XHRjbGVhcmNvYXRNYXA6ICEhIG1hdGVyaWFsLmNsZWFyY29hdE1hcCxcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLFxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwOiAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAsXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXA6ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCxcblx0XHRcdHJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLFxuXHRcdFx0bWV0YWxuZXNzTWFwOiAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAsXG5cdFx0XHRzcGVjdWxhck1hcDogISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAsXG5cdFx0XHRhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsXG5cblx0XHRcdGdyYWRpZW50TWFwOiAhISBtYXRlcmlhbC5ncmFkaWVudE1hcCxcblxuXHRcdFx0c2hlZW46ICEhIG1hdGVyaWFsLnNoZWVuLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhUYW5nZW50czogKCBtYXRlcmlhbC5ub3JtYWxNYXAgJiYgbWF0ZXJpYWwudmVydGV4VGFuZ2VudHMgKSxcblx0XHRcdHZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLFxuXHRcdFx0dmVydGV4VXZzOiAhISBtYXRlcmlhbC5tYXAgfHwgISEgbWF0ZXJpYWwuYnVtcE1hcCB8fCAhISBtYXRlcmlhbC5ub3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgfHwgISEgbWF0ZXJpYWwuYWxwaGFNYXAgfHwgISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgfHwgISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwIHx8ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXRNYXAgfHwgISEgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwIHx8ICEhIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCB8fCAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsXG5cdFx0XHR1dnNWZXJ0ZXhPbmx5OiAhICggISEgbWF0ZXJpYWwubWFwIHx8ICEhIG1hdGVyaWFsLmJ1bXBNYXAgfHwgISEgbWF0ZXJpYWwubm9ybWFsTWFwIHx8ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwIHx8ICEhIG1hdGVyaWFsLmFscGhhTWFwIHx8ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwIHx8ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCB8fCAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgfHwgISEgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwICkgJiYgISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXG5cdFx0XHRmb2c6ICEhIGZvZyxcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nLFxuXHRcdFx0Zm9nRXhwMjogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdFx0c2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCxcblx0XHRcdG1heEJvbmVzOiBtYXhCb25lcyxcblx0XHRcdHVzZVZlcnRleFRleHR1cmU6IGZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cdFx0XHRtYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFyZ2V0cyxcblx0XHRcdG1heE1vcnBoTm9ybWFsczogcmVuZGVyZXIubWF4TW9ycGhOb3JtYWxzLFxuXG5cdFx0XHRudW1EaXJMaWdodHM6IGxpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGgsXG5cdFx0XHRudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCxcblx0XHRcdG51bVNwb3RMaWdodHM6IGxpZ2h0cy5zcG90Lmxlbmd0aCxcblx0XHRcdG51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVjdEFyZWEubGVuZ3RoLFxuXHRcdFx0bnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3RoLFxuXG5cdFx0XHRudW1EaXJMaWdodFNoYWRvd3M6IGxpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsXG5cdFx0XHRudW1Qb2ludExpZ2h0U2hhZG93czogbGlnaHRzLnBvaW50U2hhZG93TWFwLmxlbmd0aCxcblx0XHRcdG51bVNwb3RMaWdodFNoYWRvd3M6IGxpZ2h0cy5zcG90U2hhZG93TWFwLmxlbmd0aCxcblxuXHRcdFx0bnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLFxuXHRcdFx0bnVtQ2xpcEludGVyc2VjdGlvbjogbkNsaXBJbnRlcnNlY3Rpb24sXG5cblx0XHRcdGRpdGhlcmluZzogbWF0ZXJpYWwuZGl0aGVyaW5nLFxuXG5cdFx0XHRzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBzaGFkb3dzLmxlbmd0aCA+IDAsXG5cdFx0XHRzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSxcblxuXHRcdFx0dG9uZU1hcHBpbmc6IG1hdGVyaWFsLnRvbmVNYXBwZWQgPyByZW5kZXJlci50b25lTWFwcGluZyA6IE5vVG9uZU1hcHBpbmcsXG5cdFx0XHRwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czogcmVuZGVyZXIucGh5c2ljYWxseUNvcnJlY3RMaWdodHMsXG5cblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxuXG5cdFx0XHRhbHBoYVRlc3Q6IG1hdGVyaWFsLmFscGhhVGVzdCxcblx0XHRcdGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLFxuXHRcdFx0ZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSxcblxuXHRcdFx0ZGVwdGhQYWNraW5nOiAoIG1hdGVyaWFsLmRlcHRoUGFja2luZyAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiBmYWxzZSxcblxuXHRcdFx0aW5kZXgwQXR0cmlidXRlTmFtZTogbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSxcblxuXHRcdFx0ZXh0ZW5zaW9uRGVyaXZhdGl2ZXM6IG1hdGVyaWFsLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWwuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyxcblx0XHRcdGV4dGVuc2lvbkZyYWdEZXB0aDogbWF0ZXJpYWwuZXh0ZW5zaW9ucyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLmZyYWdEZXB0aCxcblx0XHRcdGV4dGVuc2lvbkRyYXdCdWZmZXJzOiBtYXRlcmlhbC5leHRlbnNpb25zICYmIG1hdGVyaWFsLmV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMsXG5cdFx0XHRleHRlbnNpb25TaGFkZXJUZXh0dXJlTE9EOiBtYXRlcmlhbC5leHRlbnNpb25zICYmIG1hdGVyaWFsLmV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCxcblxuXHRcdFx0cmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg6IGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgIT09IG51bGwsXG5cdFx0XHRyZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzOiBpc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSAhPT0gbnVsbCxcblx0XHRcdHJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZDogaXNXZWJHTDIgfHwgZXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApICE9PSBudWxsLFxuXG5cdFx0XHRvbkJlZm9yZUNvbXBpbGU6IG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQcm9ncmFtQ2FjaGVLZXkgPSBmdW5jdGlvbiAoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkZXJJRCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy52ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcGFyYW1ldGVycy5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIHBhcmFtZXRlcnMuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZGVmaW5lc1sgbmFtZSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5vdXRwdXRFbmNvZGluZyApO1xuXHRcdFx0YXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgKTtcblxuXHRcdH1cblxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTtcblxuXHRcdHJldHVybiBhcnJheS5qb2luKCk7XG5cblx0fTtcblxuXHR0aGlzLmFjcXVpcmVQcm9ncmFtID0gZnVuY3Rpb24gKCBwYXJhbWV0ZXJzLCBjYWNoZUtleSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJlZXhpc3RpbmdQcm9ncmFtID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcmVleGlzdGluZ1Byb2dyYW0uY2FjaGVLZXkgPT09IGNhY2hlS2V5ICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcmVleGlzdGluZ1Byb2dyYW07XG5cdFx0XHRcdCsrIHByb2dyYW0udXNlZFRpbWVzO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkge1xuXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEuZ3JvdXBPcmRlciAhPT0gYi5ncm91cE9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEuZ3JvdXBPcmRlciAtIGIuZ3JvdXBPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdH0gZWxzZSBpZiAoIGEucHJvZ3JhbSAhPT0gYi5wcm9ncmFtICkge1xuXG5cdFx0cmV0dXJuIGEucHJvZ3JhbS5pZCAtIGIucHJvZ3JhbS5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkICkge1xuXG5cdFx0cmV0dXJuIGEubWF0ZXJpYWwuaWQgLSBiLm1hdGVyaWFsLmlkO1xuXG5cdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0cmV0dXJuIGEueiAtIGIuejtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcblxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3QoKSB7XG5cblx0dmFyIHJlbmRlckl0ZW1zID0gW107XG5cdHZhciByZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHR2YXIgb3BhcXVlID0gW107XG5cdHZhciB0cmFuc3BhcmVudCA9IFtdO1xuXG5cdHZhciBkZWZhdWx0UHJvZ3JhbSA9IHsgaWQ6IC0gMSB9O1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRcdG9wYXF1ZS5sZW5ndGggPSAwO1xuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtIHx8IGRlZmF1bHRQcm9ncmFtLFxuXHRcdFx0XHRncm91cE9yZGVyOiBncm91cE9yZGVyLFxuXHRcdFx0XHRyZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLFxuXHRcdFx0XHR6OiB6LFxuXHRcdFx0XHRncm91cDogZ3JvdXBcblx0XHRcdH07XG5cblx0XHRcdHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF0gPSByZW5kZXJJdGVtO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gb2JqZWN0O1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHRcdFx0cmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbSB8fCBkZWZhdWx0UHJvZ3JhbTtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXBPcmRlciA9IGdyb3VwT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH1cblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XG5cblx0XHRyZXR1cm4gcmVuZGVySXRlbTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICk7XG5cblx0XHQoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlID8gdHJhbnNwYXJlbnQgOiBvcGFxdWUgKS5wdXNoKCByZW5kZXJJdGVtICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVuc2hpZnQoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApIHtcblxuXHRcdHZhciByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkudW5zaGlmdCggcmVuZGVySXRlbSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCBjdXN0b21PcGFxdWVTb3J0LCBjdXN0b21UcmFuc3BhcmVudFNvcnQgKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEgKSB0cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZpbmlzaCgpIHtcblxuXHRcdC8vIENsZWFyIHJlZmVyZW5jZXMgZnJvbSBpbmFjdGl2ZSByZW5kZXJJdGVtcyBpbiB0aGUgbGlzdFxuXG5cdFx0Zm9yICggdmFyIGkgPSByZW5kZXJJdGVtc0luZGV4LCBpbCA9IHJlbmRlckl0ZW1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyBpIF07XG5cblx0XHRcdGlmICggcmVuZGVySXRlbS5pZCA9PT0gbnVsbCApIGJyZWFrO1xuXG5cdFx0XHRyZW5kZXJJdGVtLmlkID0gbnVsbDtcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gbnVsbDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG51bGw7XG5cdFx0XHRyZW5kZXJJdGVtLnByb2dyYW0gPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IG51bGw7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXHRcdHVuc2hpZnQ6IHVuc2hpZnQsXG5cdFx0ZmluaXNoOiBmaW5pc2gsXG5cblx0XHRzb3J0OiBzb3J0XG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHtcblxuXHR2YXIgbGlzdHMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIG9uU2NlbmVEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBzY2VuZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHNjZW5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25TY2VuZURpc3Bvc2UgKTtcblxuXHRcdGxpc3RzLmRlbGV0ZSggc2NlbmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGNhbWVyYXMgPSBsaXN0cy5nZXQoIHNjZW5lICk7XG5cdFx0dmFyIGxpc3Q7XG5cdFx0aWYgKCBjYW1lcmFzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XG5cdFx0XHRsaXN0cy5zZXQoIHNjZW5lLCBuZXcgV2Vha01hcCgpICk7XG5cdFx0XHRsaXN0cy5nZXQoIHNjZW5lICkuc2V0KCBjYW1lcmEsIGxpc3QgKTtcblxuXHRcdFx0c2NlbmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblNjZW5lRGlzcG9zZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bGlzdCA9IGNhbWVyYXMuZ2V0KCBjYW1lcmEgKTtcblx0XHRcdGlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XG5cdFx0XHRcdGNhbWVyYXMuc2V0KCBjYW1lcmEsIGxpc3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3Jtc0NhY2hlKCkge1xuXG5cdHZhciBsaWdodHMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0XHRpZiAoIGxpZ2h0c1sgbGlnaHQuaWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVuaWZvcm1zO1xuXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xuXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQb2ludExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXG5cdFx0XHRcdFx0XHRkZWNheTogMFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdHNreUNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGdyb3VuZENvbG9yOiBuZXcgQ29sb3IoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZXaWR0aDogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZIZWlnaHQ6IG5ldyBWZWN0b3IzKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxpZ2h0c1sgbGlnaHQuaWQgXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRyZXR1cm4gdW5pZm9ybXM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG5mdW5jdGlvbiBTaGFkb3dVbmlmb3Jtc0NhY2hlKCkge1xuXG5cdHZhciBsaWdodHMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0XHRpZiAoIGxpZ2h0c1sgbGlnaHQuaWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVuaWZvcm1zO1xuXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xuXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKSxcblx0XHRcdFx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFGYXI6IDEwMDBcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBzZXQgUmVjdEFyZWFMaWdodCBzaGFkb3cgdW5pZm9ybXNcblxuXHRcdFx0fVxuXG5cdFx0XHRsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0cmV0dXJuIHVuaWZvcm1zO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuXG5cbnZhciBuZXh0VmVyc2lvbiA9IDA7XG5cbmZ1bmN0aW9uIHNoYWRvd0Nhc3RpbmdMaWdodHNGaXJzdCggbGlnaHRBLCBsaWdodEIgKSB7XG5cblx0cmV0dXJuICggbGlnaHRCLmNhc3RTaGFkb3cgPyAxIDogMCApIC0gKCBsaWdodEEuY2FzdFNoYWRvdyA/IDEgOiAwICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xMaWdodHMoKSB7XG5cblx0dmFyIGNhY2hlID0gbmV3IFVuaWZvcm1zQ2FjaGUoKTtcblxuXHR2YXIgc2hhZG93Q2FjaGUgPSBTaGFkb3dVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0dmVyc2lvbjogMCxcblxuXHRcdGhhc2g6IHtcblx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoOiAtIDEsXG5cdFx0XHRwb2ludExlbmd0aDogLSAxLFxuXHRcdFx0c3BvdExlbmd0aDogLSAxLFxuXHRcdFx0cmVjdEFyZWFMZW5ndGg6IC0gMSxcblx0XHRcdGhlbWlMZW5ndGg6IC0gMSxcblxuXHRcdFx0bnVtRGlyZWN0aW9uYWxTaGFkb3dzOiAtIDEsXG5cdFx0XHRudW1Qb2ludFNoYWRvd3M6IC0gMSxcblx0XHRcdG51bVNwb3RTaGFkb3dzOiAtIDFcblx0XHR9LFxuXG5cdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXG5cdFx0cHJvYmU6IFtdLFxuXHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvdzogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cG9pbnQ6IFtdLFxuXHRcdHBvaW50U2hhZG93OiBbXSxcblx0XHRwb2ludFNoYWRvd01hcDogW10sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdGhlbWk6IFtdXG5cblx0fTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkgc3RhdGUucHJvYmUucHVzaCggbmV3IFZlY3RvcjMoKSApO1xuXG5cdHZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHtcblxuXHRcdHZhciByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHN0YXRlLnByb2JlWyBpIF0uc2V0KCAwLCAwLCAwICk7XG5cblx0XHR2YXIgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xuXHRcdHZhciBwb2ludExlbmd0aCA9IDA7XG5cdFx0dmFyIHNwb3RMZW5ndGggPSAwO1xuXHRcdHZhciByZWN0QXJlYUxlbmd0aCA9IDA7XG5cdFx0dmFyIGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0dmFyIG51bURpcmVjdGlvbmFsU2hhZG93cyA9IDA7XG5cdFx0dmFyIG51bVBvaW50U2hhZG93cyA9IDA7XG5cdFx0dmFyIG51bVNwb3RTaGFkb3dzID0gMDtcblxuXHRcdHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdGxpZ2h0cy5zb3J0KCBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0dmFyIGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHR2YXIgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzTGlnaHRQcm9iZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCA5OyBqICsrICkge1xuXG5cdFx0XHRcdFx0c3RhdGUucHJvYmVbIGogXS5hZGRTY2FsZWRWZWN0b3IoIGxpZ2h0LnNoLmNvZWZmaWNpZW50c1sgaiBdLCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHZhciBzaGFkb3dVbmlmb3JtcyA9IHNoYWRvd0NhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gc2hhZG93VW5pZm9ybXM7XG5cdFx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXG5cdFx0XHRcdFx0bnVtRGlyZWN0aW9uYWxTaGFkb3dzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHZhciBzaGFkb3dVbmlmb3JtcyA9IHNoYWRvd0NhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dbIHNwb3RMZW5ndGggXSA9IHNoYWRvd1VuaWZvcm1zO1xuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4WyBzcG90TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXG5cdFx0XHRcdFx0bnVtU3BvdFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkXG5cdFx0XHRcdC8vdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCAqIE1hdGguUEkgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93VW5pZm9ybXMgPSBzaGFkb3dDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Q2FtZXJhTmVhciA9IHNoYWRvdy5jYW1lcmEubmVhcjtcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dDYW1lcmFGYXIgPSBzaGFkb3cuY2FtZXJhLmZhcjtcblxuXHRcdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93WyBwb2ludExlbmd0aCBdID0gc2hhZG93VW5pZm9ybXM7XG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXBbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXG5cdFx0XHRcdFx0bnVtUG9pbnRTaGFkb3dzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0dmFyIGhhc2ggPSBzdGF0ZS5oYXNoO1xuXG5cdFx0aWYgKCBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoICE9PSBkaXJlY3Rpb25hbExlbmd0aCB8fFxuXHRcdFx0aGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHxcblx0XHRcdGhhc2guc3BvdExlbmd0aCAhPT0gc3BvdExlbmd0aCB8fFxuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCAhPT0gcmVjdEFyZWFMZW5ndGggfHxcblx0XHRcdGhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fFxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgIT09IG51bURpcmVjdGlvbmFsU2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1Qb2ludFNoYWRvd3MgIT09IG51bVBvaW50U2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgKSB7XG5cblx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0c3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0XHRzdGF0ZS5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3cubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUuc3BvdFNoYWRvdy5sZW5ndGggPSBudW1TcG90U2hhZG93cztcblx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXAubGVuZ3RoID0gbnVtU3BvdFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzO1xuXG5cdFx0XHRoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0XHRoYXNoLnBvaW50TGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0XHRoYXNoLnNwb3RMZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdFx0aGFzaC5oZW1pTGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRoYXNoLm51bVBvaW50U2hhZG93cyA9IG51bVBvaW50U2hhZG93cztcblx0XHRcdGhhc2gubnVtU3BvdFNoYWRvd3MgPSBudW1TcG90U2hhZG93cztcblxuXHRcdFx0c3RhdGUudmVyc2lvbiA9IG5leHRWZXJzaW9uICsrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHNldHVwOiBzZXR1cCxcblx0XHRzdGF0ZTogc3RhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSgpIHtcblxuXHR2YXIgbGlnaHRzID0gbmV3IFdlYkdMTGlnaHRzKCk7XG5cblx0dmFyIGxpZ2h0c0FycmF5ID0gW107XG5cdHZhciBzaGFkb3dzQXJyYXkgPSBbXTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0bGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcblx0XHRzaGFkb3dzQXJyYXkubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaExpZ2h0KCBsaWdodCApIHtcblxuXHRcdGxpZ2h0c0FycmF5LnB1c2goIGxpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hTaGFkb3coIHNoYWRvd0xpZ2h0ICkge1xuXG5cdFx0c2hhZG93c0FycmF5LnB1c2goIHNoYWRvd0xpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldHVwTGlnaHRzKCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApO1xuXG5cdH1cblxuXHR2YXIgc3RhdGUgPSB7XG5cdFx0bGlnaHRzQXJyYXk6IGxpZ2h0c0FycmF5LFxuXHRcdHNoYWRvd3NBcnJheTogc2hhZG93c0FycmF5LFxuXG5cdFx0bGlnaHRzOiBsaWdodHNcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGluaXQ6IGluaXQsXG5cdFx0c3RhdGU6IHN0YXRlLFxuXHRcdHNldHVwTGlnaHRzOiBzZXR1cExpZ2h0cyxcblxuXHRcdHB1c2hMaWdodDogcHVzaExpZ2h0LFxuXHRcdHB1c2hTaGFkb3c6IHB1c2hTaGFkb3dcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBvblNjZW5lRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgc2NlbmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHRzY2VuZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uU2NlbmVEaXNwb3NlICk7XG5cblx0XHRyZW5kZXJTdGF0ZXMuZGVsZXRlKCBzY2VuZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgcmVuZGVyU3RhdGU7XG5cblx0XHRpZiAoIHJlbmRlclN0YXRlcy5oYXMoIHNjZW5lICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRyZW5kZXJTdGF0ZXMuc2V0KCBzY2VuZSwgbmV3IFdlYWtNYXAoKSApO1xuXHRcdFx0cmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKS5zZXQoIGNhbWVyYSwgcmVuZGVyU3RhdGUgKTtcblxuXHRcdFx0c2NlbmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblNjZW5lRGlzcG9zZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApLmhhcyggY2FtZXJhICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoKTtcblx0XHRcdFx0cmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKS5zZXQoIGNhbWVyYSwgcmVuZGVyU3RhdGUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lICkuZ2V0KCBjYW1lcmEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlclN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwczovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaERlcHRoTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBCYXNpY0RlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hEZXB0aE1hdGVyaWFsO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBzb3VyY2UuZGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIHJlZmVyZW5jZVBvc2l0aW9uOiA8ZmxvYXQ+LFxuICogIG5lYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqICBmYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD5cbiAqXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaERpc3RhbmNlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoRGlzdGFuY2VNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZlcmVuY2VQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gMTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IDEwMDA7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hEaXN0YW5jZU1hdGVyaWFsO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBzb3VyY2UucmVmZXJlbmNlUG9zaXRpb24gKTtcblx0dGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlO1xuXHR0aGlzLmZhckRpc3RhbmNlID0gc291cmNlLmZhckRpc3RhbmNlO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG52YXIgdnNtX2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHNoYWRvd19wYXNzO1xcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xcbiNpbmNsdWRlIDxwYWNraW5nPlxcbnZvaWQgbWFpbigpIHtcXG4gIGZsb2F0IG1lYW4gPSAwLjA7XFxuICBmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7XFxuXFx0ZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcXG4gIGZvciAoIGZsb2F0IGkgPSAtMS4wOyBpIDwgMS4wIDsgaSArPSBTQU1QTEVfUkFURSkge1xcbiAgICAjaWZkZWYgSE9SSVpPTkFMX1BBU1NcXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiA9IHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIGksIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcXG4gICAgICBtZWFuICs9IGRpc3RyaWJ1dGlvbi54O1xcbiAgICAgIHNxdWFyZWRfbWVhbiArPSBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDtcXG4gICAgI2Vsc2VcXG4gICAgICBmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xcbiAgICAgIG1lYW4gKz0gZGVwdGg7XFxuICAgICAgc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7XFxuICAgICNlbmRpZlxcbiAgfVxcbiAgbWVhbiA9IG1lYW4gKiBIQUxGX1NBTVBMRV9SQVRFO1xcbiAgc3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcXG4gIGZsb2F0IHN0ZF9kZXYgPSBzcXJ0KCBzcXVhcmVkX21lYW4gLSBtZWFuICogbWVhbiApO1xcbiAgZ2xfRnJhZ0NvbG9yID0gcGFjazJIYWxmVG9SR0JBKCB2ZWMyKCBtZWFuLCBzdGRfZGV2ICkgKTtcXG59XCI7XG5cbnZhciB2c21fdmVydCA9IFwidm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xcbn1cIjtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblxuXHRcdF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoKSxcblx0XHRfdmlld3BvcnRTaXplID0gbmV3IFZlY3RvcjIoKSxcblxuXHRcdF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cblx0XHRfZGVwdGhNYXRlcmlhbHMgPSBbXSxcblx0XHRfZGlzdGFuY2VNYXRlcmlhbHMgPSBbXSxcblxuXHRcdF9tYXRlcmlhbENhY2hlID0ge307XG5cblx0dmFyIHNoYWRvd1NpZGUgPSB7IDA6IEJhY2tTaWRlLCAxOiBGcm9udFNpZGUsIDI6IERvdWJsZVNpZGUgfTtcblxuXHR2YXIgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXG5cdFx0ZGVmaW5lczoge1xuXHRcdFx0U0FNUExFX1JBVEU6IDIuMCAvIDguMCxcblx0XHRcdEhBTEZfU0FNUExFX1JBVEU6IDEuMCAvIDguMFxuXHRcdH0sXG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0c2hhZG93X3Bhc3M6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHJlc29sdXRpb246IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCkgfSxcblx0XHRcdHJhZGl1czogeyB2YWx1ZTogNC4wIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiB2c21fdmVydCxcblxuXHRcdGZyYWdtZW50U2hhZGVyOiB2c21fZnJhZ1xuXG5cdH0gKTtcblxuXHR2YXIgc2hhZG93TWF0ZXJpYWxIb3Jpem9uYWwgPSBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLmNsb25lKCk7XG5cdHNoYWRvd01hdGVyaWFsSG9yaXpvbmFsLmRlZmluZXMuSE9SSVpPTkFMX1BBU1MgPSAxO1xuXG5cdHZhciBmdWxsU2NyZWVuVHJpID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGZ1bGxTY3JlZW5Ucmkuc2V0QXR0cmlidXRlKFxuXHRcdFwicG9zaXRpb25cIixcblx0XHRuZXcgQnVmZmVyQXR0cmlidXRlKFxuXHRcdFx0bmV3IEZsb2F0MzJBcnJheSggWyAtIDEsIC0gMSwgMC41LCAzLCAtIDEsIDAuNSwgLSAxLCAzLCAwLjUgXSApLFxuXHRcdFx0M1xuXHRcdClcblx0KTtcblxuXHR2YXIgZnVsbFNjcmVlbk1lc2ggPSBuZXcgTWVzaCggZnVsbFNjcmVlblRyaSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCApO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDtcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggbGlnaHRzLCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0aWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblx0XHRpZiAoIHNjb3BlLmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNjb3BlLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGlmICggbGlnaHRzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdHZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdHZhciBhY3RpdmVDdWJlRmFjZSA9IF9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xuXHRcdHZhciBhY3RpdmVNaXBtYXBMZXZlbCA9IF9yZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xuXG5cdFx0dmFyIF9zdGF0ZSA9IF9yZW5kZXJlci5zdGF0ZTtcblxuXHRcdC8vIFNldCBHTCBzdGF0ZSBmb3IgZGVwdGggbWFwLlxuXHRcdF9zdGF0ZS5zZXRCbGVuZGluZyggTm9CbGVuZGluZyApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAxLCAxLCAxLCAxICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdF9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcblxuXHRcdC8vIHJlbmRlciBkZXB0aCBtYXBcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0aWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDonLCBsaWdodCwgJ2hhcyBubyBzaGFkb3cuJyApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApO1xuXG5cdFx0XHR2YXIgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XG5cblx0XHRcdF92aWV3cG9ydFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblxuXHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gbWF4VGV4dHVyZVNpemUgfHwgX3NoYWRvd01hcFNpemUueSA+IG1heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmcnICk7XG5cblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnggPSBNYXRoLmZsb29yKCBtYXhUZXh0dXJlU2l6ZSAvIHNoYWRvd0ZyYW1lRXh0ZW50cy54ICk7XG5cdFx0XHRcdFx0X3NoYWRvd01hcFNpemUueCA9IF92aWV3cG9ydFNpemUueCAqIHNoYWRvd0ZyYW1lRXh0ZW50cy54O1xuXHRcdFx0XHRcdHNoYWRvdy5tYXBTaXplLnggPSBfdmlld3BvcnRTaXplLng7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggX3NoYWRvd01hcFNpemUueSA+IG1heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ID0gTWF0aC5mbG9vciggbWF4VGV4dHVyZVNpemUgLyBzaGFkb3dGcmFtZUV4dGVudHMueSApO1xuXHRcdFx0XHRcdF9zaGFkb3dNYXBTaXplLnkgPSBfdmlld3BvcnRTaXplLnkgKiBzaGFkb3dGcmFtZUV4dGVudHMueTtcblx0XHRcdFx0XHRzaGFkb3cubWFwU2l6ZS55ID0gX3ZpZXdwb3J0U2l6ZS55O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgJiYgISBzaGFkb3cuaXNQb2ludExpZ2h0U2hhZG93ICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xuXG5cdFx0XHRcdHZhciBwYXJzID0geyBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9O1xuXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgXCIuc2hhZG93TWFwXCI7XG5cblx0XHRcdFx0c2hhZG93Lm1hcFBhc3MgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblxuXHRcdFx0XHRzaGFkb3cuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXAgKTtcblx0XHRcdF9yZW5kZXJlci5jbGVhcigpO1xuXG5cdFx0XHR2YXIgdmlld3BvcnRDb3VudCA9IHNoYWRvdy5nZXRWaWV3cG9ydENvdW50KCk7XG5cblx0XHRcdGZvciAoIHZhciB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XG5cblx0XHRcdFx0dmFyIHZpZXdwb3J0ID0gc2hhZG93LmdldFZpZXdwb3J0KCB2cCApO1xuXG5cdFx0XHRcdF92aWV3cG9ydC5zZXQoXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueCxcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC55LFxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueCAqIHZpZXdwb3J0LnosXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ICogdmlld3BvcnQud1xuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdF9zdGF0ZS52aWV3cG9ydCggX3ZpZXdwb3J0ICk7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZU1hdHJpY2VzKCBsaWdodCwgdnAgKTtcblxuXHRcdFx0XHRfZnJ1c3R1bSA9IHNoYWRvdy5nZXRGcnVzdHVtKCk7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3cuY2FtZXJhLCBsaWdodCwgdGhpcy50eXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZG8gYmx1ciBwYXNzIGZvciBWU01cblxuXHRcdFx0aWYgKCAhIHNoYWRvdy5pc1BvaW50TGlnaHRTaGFkb3cgJiYgdGhpcy50eXBlID09PSBWU01TaGFkb3dNYXAgKSB7XG5cblx0XHRcdFx0VlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gVlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIGZ1bGxTY3JlZW5NZXNoICk7XG5cblx0XHQvLyB2ZXJ0aWNhbCBwYXNzXG5cblx0XHRzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcC50ZXh0dXJlO1xuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZSA9IHNoYWRvdy5tYXBTaXplO1xuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gc2hhZG93LnJhZGl1cztcblx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwUGFzcyApO1xuXHRcdF9yZW5kZXJlci5jbGVhcigpO1xuXHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIHNoYWRvd01hdGVyaWFsVmVydGljYWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7XG5cblx0XHQvLyBob3Jpem9uYWwgcGFzc1xuXG5cdFx0c2hhZG93TWF0ZXJpYWxIb3Jpem9uYWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwUGFzcy50ZXh0dXJlO1xuXHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbmFsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b25hbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXAgKTtcblx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbEhvcml6b25hbCwgZnVsbFNjcmVlbk1lc2gsIG51bGwgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbFZhcmlhbnQoIHVzZU1vcnBoaW5nLCB1c2VTa2lubmluZywgdXNlSW5zdGFuY2luZyApIHtcblxuXHRcdHZhciBpbmRleCA9IHVzZU1vcnBoaW5nIDw8IDAgfCB1c2VTa2lubmluZyA8PCAxIHwgdXNlSW5zdGFuY2luZyA8PCAyO1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gX2RlcHRoTWF0ZXJpYWxzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcblxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRfZGVwdGhNYXRlcmlhbHNbIGluZGV4IF0gPSBtYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQoIHVzZU1vcnBoaW5nLCB1c2VTa2lubmluZywgdXNlSW5zdGFuY2luZyApIHtcblxuXHRcdHZhciBpbmRleCA9IHVzZU1vcnBoaW5nIDw8IDAgfCB1c2VTa2lubmluZyA8PCAxIHwgdXNlSW5zdGFuY2luZyA8PCAyO1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gX2Rpc3RhbmNlTWF0ZXJpYWxzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRcdHNraW5uaW5nOiB1c2VTa2lubmluZ1xuXG5cdFx0XHR9ICk7XG5cblx0XHRcdF9kaXN0YW5jZU1hdGVyaWFsc1sgaW5kZXggXSA9IG1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhTmVhciwgc2hhZG93Q2FtZXJhRmFyLCB0eXBlICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHJlc3VsdCA9IG51bGw7XG5cblx0XHR2YXIgZ2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGVwdGhNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0XHRjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjdXN0b21NYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdXNlTW9ycGhpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoID4gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gZmFsc2U7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggPT09IHRydWUgKSB7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5za2lubmluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHVzZVNraW5uaW5nID0gdHJ1ZTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6IFRIUkVFLlNraW5uZWRNZXNoIHdpdGggbWF0ZXJpYWwuc2tpbm5pbmcgc2V0IHRvIGZhbHNlOicsIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdXNlSW5zdGFuY2luZyA9IG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWU7XG5cblx0XHRcdHJlc3VsdCA9IGdldE1hdGVyaWFsVmFyaWFudCggdXNlTW9ycGhpbmcsIHVzZVNraW5uaW5nLCB1c2VJbnN0YW5jaW5nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggX3JlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcblx0XHRcdC8vIGFwcHJvcHJpYXRlIHN0YXRlXG5cblx0XHRcdHZhciBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkO1xuXG5cdFx0XHR2YXIgbWF0ZXJpYWxzRm9yVmFyaWFudCA9IF9tYXRlcmlhbENhY2hlWyBrZXlBIF07XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzRm9yVmFyaWFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnQgPSB7fTtcblx0XHRcdFx0X21hdGVyaWFsQ2FjaGVbIGtleUEgXSA9IG1hdGVyaWFsc0ZvclZhcmlhbnQ7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGNhY2hlZE1hdGVyaWFsID0gbWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdO1xuXG5cdFx0XHRpZiAoIGNhY2hlZE1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2FjaGVkTWF0ZXJpYWwgPSByZXN1bHQuY2xvbmUoKTtcblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0ID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRyZXN1bHQudmlzaWJsZSA9IG1hdGVyaWFsLnZpc2libGU7XG5cdFx0cmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTtcblxuXHRcdGlmICggdHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xuXG5cdFx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPT0gbnVsbCApID8gbWF0ZXJpYWwuc2hhZG93U2lkZSA6IG1hdGVyaWFsLnNpZGU7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPT0gbnVsbCApID8gbWF0ZXJpYWwuc2hhZG93U2lkZSA6IHNoYWRvd1NpZGVbIG1hdGVyaWFsLnNpZGUgXTtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC5jbGlwU2hhZG93cyA9IG1hdGVyaWFsLmNsaXBTaGFkb3dzO1xuXHRcdHJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzO1xuXHRcdHJlc3VsdC5jbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbjtcblxuXHRcdHJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0cmVzdWx0LmxpbmV3aWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdGlmICggbGlnaHQuaXNQb2ludExpZ2h0ID09PSB0cnVlICYmIHJlc3VsdC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsID09PSB0cnVlICkge1xuXG5cdFx0XHRyZXN1bHQucmVmZXJlbmNlUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmVzdWx0Lm5lYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRyZXN1bHQuZmFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFGYXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICYmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApICkge1xuXG5cdFx0XHRpZiAoICggb2JqZWN0LmNhc3RTaGFkb3cgfHwgKCBvYmplY3QucmVjZWl2ZVNoYWRvdyAmJiB0eXBlID09PSBWU01TaGFkb3dNYXAgKSApICYmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApICkge1xuXG5cdFx0XHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgayA9IDAsIGtsID0gZ3JvdXBzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGsgXTtcblx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ3JvdXBNYXRlcmlhbCwgbGlnaHQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgbGlnaHQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyLCB0eXBlICk7XG5cblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHRmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0dmFyIGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yLnNldCggciwgZywgYiwgYSApO1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggMjkyOSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCAyOTI5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxMiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTMgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTYgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRcdFx0ZW5hYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRkaXNhYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggMzQ5MjEgKTtcblx0dmFyIG5ld0F0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgYXR0cmlidXRlRGl2aXNvcnMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXG5cdHZhciBlbmFibGVkQ2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0dmFyIGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IG51bGw7XG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM1NjYxICk7XG5cblx0dmFyIGxpbmVXaWR0aEF2YWlsYWJsZSA9IGZhbHNlO1xuXHR2YXIgdmVyc2lvbiA9IDA7XG5cdHZhciBnbFZlcnNpb24gPSBnbC5nZXRQYXJhbWV0ZXIoIDc5MzggKTtcblxuXHRpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnV2ViR0wnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXldlYkdMXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAxLjAgKTtcblxuXHR9IGVsc2UgaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ09wZW5HTCBFUycgKSAhPT0gLSAxICkge1xuXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMXFwgRVNcXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDIuMCApO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0dmFyIGN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTtcblx0dmFyIGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCApIHtcblxuXHRcdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC5cblx0XHR2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0ZXh0dXJlICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgMTAyNDEsIDk3MjggKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCAxMDI0MCwgOTcyOCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIDY0MDgsIDEsIDEsIDAsIDY0MDgsIDUxMjEsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyAzNTUzIF0gPSBjcmVhdGVUZXh0dXJlKCAzNTUzLCAzNTUzLCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIDM0MDY3IF0gPSBjcmVhdGVUZXh0dXJlKCAzNDA2NywgMzQwNjksIDYgKTtcblxuXHQvLyBpbml0XG5cblx0Y29sb3JCdWZmZXIuc2V0Q2xlYXIoIDAsIDAsIDAsIDEgKTtcblx0ZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTtcblx0c3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApO1xuXG5cdGVuYWJsZSggMjkyOSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNzRXF1YWxEZXB0aCApO1xuXG5cdHNldEZsaXBTaWRlZCggZmFsc2UgKTtcblx0c2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApO1xuXHRlbmFibGUoIDI4ODQgKTtcblxuXHRzZXRCbGVuZGluZyggTm9CbGVuZGluZyApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdG5ld0F0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCAwICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBpc1dlYkdMMiA/IGdsIDogZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRleHRlbnNpb25bIGlzV2ViR0wyID8gJ3ZlcnRleEF0dHJpYkRpdmlzb3InIDogJ3ZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRScgXSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7XG5cblx0XHRcdGdsLmVuYWJsZSggaWQgKTtcblx0XHRcdGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHtcblxuXHRcdGlmICggZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdID0gZmFsc2U7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xuXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdGN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdHZhciBlcXVhdGlvblRvR0wgPSB7XG5cdFx0WyBBZGRFcXVhdGlvbiBdOiAzMjc3NCxcblx0XHRbIFN1YnRyYWN0RXF1YXRpb24gXTogMzI3NzgsXG5cdFx0WyBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiBdOiAzMjc3OVxuXHR9O1xuXG5cdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRlcXVhdGlvblRvR0xbIE1pbkVxdWF0aW9uIF0gPSAzMjc3NTtcblx0XHRlcXVhdGlvblRvR0xbIE1heEVxdWF0aW9uIF0gPSAzMjc3NjtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRlcXVhdGlvblRvR0xbIE1pbkVxdWF0aW9uIF0gPSBleHRlbnNpb24uTUlOX0VYVDtcblx0XHRcdGVxdWF0aW9uVG9HTFsgTWF4RXF1YXRpb24gXSA9IGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZmFjdG9yVG9HTCA9IHtcblx0XHRbIFplcm9GYWN0b3IgXTogMCxcblx0XHRbIE9uZUZhY3RvciBdOiAxLFxuXHRcdFsgU3JjQ29sb3JGYWN0b3IgXTogNzY4LFxuXHRcdFsgU3JjQWxwaGFGYWN0b3IgXTogNzcwLFxuXHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiA3NzYsXG5cdFx0WyBEc3RDb2xvckZhY3RvciBdOiA3NzQsXG5cdFx0WyBEc3RBbHBoYUZhY3RvciBdOiA3NzIsXG5cdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IDc2OSxcblx0XHRbIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgXTogNzcxLFxuXHRcdFsgT25lTWludXNEc3RDb2xvckZhY3RvciBdOiA3NzUsXG5cdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IDc3M1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggY3VycmVudEJsZW5kaW5nRW5hYmxlZCApIHtcblxuXHRcdFx0XHRkaXNhYmxlKCAzMDQyICk7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VycmVudEJsZW5kaW5nRW5hYmxlZCApIHtcblxuXHRcdFx0ZW5hYmxlKCAzMDQyICk7XG5cdFx0XHRjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50QmxlbmRFcXVhdGlvbiAhPT0gQWRkRXF1YXRpb24gfHwgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSAhPT0gQWRkRXF1YXRpb24gKSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCAzMjc3NCApO1xuXG5cdFx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcblx0XHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gQWRkRXF1YXRpb247XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCAxLCA3NzEsIDEsIDc3MSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDEsIDEgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDAsIDAsIDc2OSwgNzcxICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCAwLCA3NjgsIDAsIDc3MCApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcblxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDc3MCwgNzcxLCAxLCA3NzEgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCA3NzAsIDEgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCAwLCA3NjkgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCAwLCA3NjggKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0XHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBjdXN0b20gYmxlbmRpbmdcblxuXHRcdGJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uO1xuXHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xuXHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgKSB7XG5cblx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uIF0sIGVxdWF0aW9uVG9HTFsgYmxlbmRFcXVhdGlvbkFscGhhIF0gKTtcblxuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBibGVuZEVxdWF0aW9uO1xuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRTcmMgIT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09IGN1cnJlbnRCbGVuZERzdEFscGhhICkge1xuXG5cdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZmFjdG9yVG9HTFsgYmxlbmRTcmMgXSwgZmFjdG9yVG9HTFsgYmxlbmREc3QgXSwgZmFjdG9yVG9HTFsgYmxlbmRTcmNBbHBoYSBdLCBmYWN0b3JUb0dMWyBibGVuZERzdEFscGhhIF0gKTtcblxuXHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRjdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcblx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYTtcblx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdH1cblxuXHRcdGN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IG51bGw7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKSB7XG5cblx0XHRtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlXG5cdFx0XHQ/IGRpc2FibGUoIDI4ODQgKVxuXHRcdFx0OiBlbmFibGUoIDI4ODQgKTtcblxuXHRcdHZhciBmbGlwU2lkZWQgPSAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7XG5cdFx0aWYgKCBmcm9udEZhY2VDVyApIGZsaXBTaWRlZCA9ICEgZmxpcFNpZGVkO1xuXG5cdFx0c2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKTtcblxuXHRcdCggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApXG5cdFx0XHQ/IHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0XHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0aEZ1bmMgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0Y29sb3JCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApO1xuXG5cdFx0dmFyIHN0ZW5jaWxXcml0ZSA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZTtcblx0XHRzdGVuY2lsQnVmZmVyLnNldFRlc3QoIHN0ZW5jaWxXcml0ZSApO1xuXHRcdGlmICggc3RlbmNpbFdyaXRlICkge1xuXG5cdFx0XHRzdGVuY2lsQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgKTtcblx0XHRcdHN0ZW5jaWxCdWZmZXIuc2V0RnVuYyggbWF0ZXJpYWwuc3RlbmNpbEZ1bmMsIG1hdGVyaWFsLnN0ZW5jaWxSZWYsIG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayApO1xuXHRcdFx0c3RlbmNpbEJ1ZmZlci5zZXRPcCggbWF0ZXJpYWwuc3RlbmNpbEZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCwgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzICk7XG5cblx0XHR9XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIDIzMDQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIDIzMDUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggMjg4NCApO1xuXG5cdFx0XHRpZiAoIGN1bGxGYWNlICE9PSBjdXJyZW50Q3VsbEZhY2UgKSB7XG5cblx0XHRcdFx0aWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIDEwMjkgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCAxMDI4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCAxMDMyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCAyODg0ICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggMzI4MjMgKTtcblxuXHRcdFx0aWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkge1xuXG5cdFx0XHRcdGdsLnBvbHlnb25PZmZzZXQoIGZhY3RvciwgdW5pdHMgKTtcblxuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3Rvcjtcblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCAzMjgyMyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7XG5cblx0XHRpZiAoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0XHRlbmFibGUoIDMwODkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIDMwODkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gdGV4dHVyZVxuXG5cdGZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHtcblxuXHRcdGlmICggd2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB3ZWJnbFNsb3QgPSAzMzk4NCArIG1heFRleHR1cmVzIC0gMTtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7XG5cblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xuXHRcdFx0Y3VycmVudFRleHR1cmVTbG90ID0gd2ViZ2xTbG90O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0YWN0aXZlVGV4dHVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTtcblxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQgfTtcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcblxuXHRcdH1cblxuXHRcdGlmICggYm91bmRUZXh0dXJlLnR5cGUgIT09IHdlYmdsVHlwZSB8fCBib3VuZFRleHR1cmUudGV4dHVyZSAhPT0gd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0XHRnbC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sgd2ViZ2xUeXBlIF0gKTtcblxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XG5cdFx0XHRib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdW5iaW5kVGV4dHVyZSgpIHtcblxuXHRcdHZhciBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVGV4dHVyZS50eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCBib3VuZFRleHR1cmUudHlwZSwgbnVsbCApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gdW5kZWZpbmVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlM0QoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTNELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRlbmFibGVkQ2FwYWJpbGl0aWVzID0ge307XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0dW5iaW5kVGV4dHVyZTogdW5iaW5kVGV4dHVyZSxcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsXG5cdFx0dGV4SW1hZ2UyRDogdGV4SW1hZ2UyRCxcblx0XHR0ZXhJbWFnZTNEOiB0ZXhJbWFnZTNELFxuXG5cdFx0c2Npc3Nvcjogc2Npc3Nvcixcblx0XHR2aWV3cG9ydDogdmlld3BvcnQsXG5cblx0XHRyZXNldDogcmVzZXRcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvICkge1xuXG5cdHZhciBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblx0dmFyIG1heFRleHR1cmVzID0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzO1xuXHR2YXIgbWF4Q3ViZW1hcFNpemUgPSBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemU7XG5cdHZhciBtYXhUZXh0dXJlU2l6ZSA9IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZTtcblx0dmFyIG1heFNhbXBsZXMgPSBjYXBhYmlsaXRpZXMubWF4U2FtcGxlcztcblxuXHR2YXIgX3ZpZGVvVGV4dHVyZXMgPSBuZXcgV2Vha01hcCgpO1xuXHR2YXIgX2NhbnZhcztcblxuXHQvLyBjb3Jkb3ZhIGlPUyAoYXMgb2YgNS4wKSBzdGlsbCB1c2VzIFVJV2ViVmlldywgd2hpY2ggcHJvdmlkZXMgT2Zmc2NyZWVuQ2FudmFzLFxuXHQvLyBhbHNvIE9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2xcIiksIGJ1dCBub3QgT2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKSFcblx0Ly8gU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IG9ubHkgaW1wbGVtZW50IE9mZnNjcmVlbkNhbnZhcyBwYXJ0aWFsbHkgKGUuZy4gbGFja2luZyAyZCkuXG5cblx0dmFyIHVzZU9mZnNjcmVlbkNhbnZhcyA9IGZhbHNlO1xuXG5cdHRyeSB7XG5cblx0XHR1c2VPZmZzY3JlZW5DYW52YXMgPSB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJ1xuXHRcdFx0JiYgKCBuZXcgT2Zmc2NyZWVuQ2FudmFzKCAxLCAxICkuZ2V0Q29udGV4dCggXCIyZFwiICkgKSAhPT0gbnVsbDtcblxuXHR9IGNhdGNoICggZXJyICkge1xuXG5cdFx0Ly8gSWdub3JlIGFueSBlcnJvcnNcblxuXHR9XG5cblx0ZnVuY3Rpb24gY3JlYXRlQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0Ly8gVXNlIE9mZnNjcmVlbkNhbnZhcyB3aGVuIGF2YWlsYWJsZS4gU3BlY2lhbGx5IG5lZWRlZCBpbiB3ZWIgd29ya2Vyc1xuXG5cdFx0cmV0dXJuIHVzZU9mZnNjcmVlbkNhbnZhcyA/XG5cdFx0XHRuZXcgT2Zmc2NyZWVuQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkgOlxuXHRcdFx0ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2l6ZUltYWdlKCBpbWFnZSwgbmVlZHNQb3dlck9mVHdvLCBuZWVkc05ld0NhbnZhcywgbWF4U2l6ZSApIHtcblxuXHRcdHZhciBzY2FsZSA9IDE7XG5cblx0XHQvLyBoYW5kbGUgY2FzZSBpZiB0ZXh0dXJlIGV4Y2VlZHMgbWF4IHNpemVcblxuXHRcdGlmICggaW1hZ2Uud2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUgKSB7XG5cblx0XHRcdHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBvbmx5IHBlcmZvcm0gcmVzaXplIGlmIG5lY2Vzc2FyeVxuXG5cdFx0aWYgKCBzY2FsZSA8IDEgfHwgbmVlZHNQb3dlck9mVHdvID09PSB0cnVlICkge1xuXG5cdFx0XHQvLyBvbmx5IHBlcmZvcm0gcmVzaXplIGZvciBjZXJ0YWluIGltYWdlIHR5cGVzXG5cblx0XHRcdGlmICggKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkgfHxcblx0XHRcdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxuXHRcdFx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApICkge1xuXG5cdFx0XHRcdHZhciBmbG9vciA9IG5lZWRzUG93ZXJPZlR3byA/IE1hdGhVdGlscy5mbG9vclBvd2VyT2ZUd28gOiBNYXRoLmZsb29yO1xuXG5cdFx0XHRcdHZhciB3aWR0aCA9IGZsb29yKCBzY2FsZSAqIGltYWdlLndpZHRoICk7XG5cdFx0XHRcdHZhciBoZWlnaHQgPSBmbG9vciggc2NhbGUgKiBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRcdFx0XHQvLyBjdWJlIHRleHR1cmVzIGNhbid0IHJldXNlIHRoZSBzYW1lIGNhbnZhc1xuXG5cdFx0XHRcdHZhciBjYW52YXMgPSBuZWVkc05ld0NhbnZhcyA/IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApIDogX2NhbnZhcztcblxuXHRcdFx0XHRjYW52YXMud2lkdGggPSB3aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuXHRcdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKSB0byAoJyArIHdpZHRoICsgJ3gnICsgaGVpZ2h0ICsgJykuJyApO1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBJbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpbWFnZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0cmV0dXJuIE1hdGhVdGlscy5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgTWF0aFV0aWxzLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGlzV2ViR0wyICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBzdXBwb3J0c01pcHMgJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0KCBpbnRlcm5hbEZvcm1hdE5hbWUsIGdsRm9ybWF0LCBnbFR5cGUgKSB7XG5cblx0XHRpZiAoIGlzV2ViR0wyID09PSBmYWxzZSApIHJldHVybiBnbEZvcm1hdDtcblxuXHRcdGlmICggaW50ZXJuYWxGb3JtYXROYW1lICE9PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9nbFsgaW50ZXJuYWxGb3JtYXROYW1lIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBfZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIHVzZSBub24tZXhpc3RpbmcgV2ViR0wgaW50ZXJuYWwgZm9ybWF0IFxcJycgKyBpbnRlcm5hbEZvcm1hdE5hbWUgKyAnXFwnJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGludGVybmFsRm9ybWF0ID0gZ2xGb3JtYXQ7XG5cblx0XHRpZiAoIGdsRm9ybWF0ID09PSA2NDAzICkge1xuXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyNiApIGludGVybmFsRm9ybWF0ID0gMzMzMjY7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEzMSApIGludGVybmFsRm9ybWF0ID0gMzMzMjU7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyMSApIGludGVybmFsRm9ybWF0ID0gMzMzMjE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdsRm9ybWF0ID09PSA2NDA3ICkge1xuXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyNiApIGludGVybmFsRm9ybWF0ID0gMzQ4Mzc7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEzMSApIGludGVybmFsRm9ybWF0ID0gMzQ4NDM7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyMSApIGludGVybmFsRm9ybWF0ID0gMzI4NDk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdsRm9ybWF0ID09PSA2NDA4ICkge1xuXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyNiApIGludGVybmFsRm9ybWF0ID0gMzQ4MzY7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEzMSApIGludGVybmFsRm9ybWF0ID0gMzQ4NDI7XG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gNTEyMSApIGludGVybmFsRm9ybWF0ID0gMzI4NTY7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludGVybmFsRm9ybWF0ID09PSAzMzMyNSB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gMzMzMjYgfHxcblx0XHRcdGludGVybmFsRm9ybWF0ID09PSAzNDg0MiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gMzQ4MzYgKSB7XG5cblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbnRlcm5hbEZvcm1hdDtcblxuXHR9XG5cblx0Ly8gRmFsbGJhY2sgZmlsdGVycyBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcblxuXHRmdW5jdGlvbiBmaWx0ZXJGYWxsYmFjayggZiApIHtcblxuXHRcdGlmICggZiA9PT0gTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRyZXR1cm4gOTcyODtcblxuXHRcdH1cblxuXHRcdHJldHVybiA5NzI5O1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcblxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuZGVsZXRlKCB0ZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XG5cblx0XHRyZW5kZXJUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgLS07XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKSBfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgKTtcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fVxuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciB0ZXh0dXJlVW5pdHMgPSAwO1xuXG5cdGZ1bmN0aW9uIHJlc2V0VGV4dHVyZVVuaXRzKCkge1xuXG5cdFx0dGV4dHVyZVVuaXRzID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWxsb2NhdGVUZXh0dXJlVW5pdCgpIHtcblxuXHRcdHZhciB0ZXh0dXJlVW5pdCA9IHRleHR1cmVVbml0cztcblxuXHRcdGlmICggdGV4dHVyZVVuaXQgPj0gbWF4VGV4dHVyZXMgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMVGV4dHVyZXM6IFRyeWluZyB0byB1c2UgJyArIHRleHR1cmVVbml0ICsgJyB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgJyArIG1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHR0ZXh0dXJlVW5pdHMgKz0gMTtcblxuXHRcdHJldHVybiB0ZXh0dXJlVW5pdDtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkgdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdHZhciBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyREFycmF5KCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNTg2NiwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTNEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzMjg3OSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2ICkgcmV0dXJuO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0aW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICk7XG5cblx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQwLCB0ZXh0dXJlLmZsaXBZICk7XG5cblx0XHRcdHZhciBpc0NvbXByZXNzZWQgPSAoIHRleHR1cmUgJiYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgfHwgdGV4dHVyZS5pbWFnZVsgMCBdLmlzQ29tcHJlc3NlZFRleHR1cmUgKSApO1xuXHRcdFx0dmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApO1xuXG5cdFx0XHR2YXIgY3ViZUltYWdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlWyBpIF0sIGZhbHNlLCB0cnVlLCBtYXhDdWJlbWFwU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0XHRzdXBwb3J0c01pcHMgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICkgfHwgaXNXZWJHTDIsXG5cdFx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICksXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggMzQwNjcsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApO1xuXG5cdFx0XHR2YXIgbWlwbWFwcztcblxuXHRcdFx0aWYgKCBpc0NvbXByZXNzZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtaXBtYXAgPSBtaXBtYXBzWyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIDM0MDY5ICsgaSwgaiwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKScgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtaXBtYXBzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgbWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXHRcdFx0XHRcdFx0XHR2YXIgbWlwbWFwSW1hZ2UgPSBtaXBtYXAuaW1hZ2VbIGkgXS5pbWFnZTtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNDA2OSArIGksIGogKyAxLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBJbWFnZS53aWR0aCwgbWlwbWFwSW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXBJbWFnZS5kYXRhICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNDA2OSArIGksIGogKyAxLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuaW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7XG5cblx0XHRcdFx0Ly8gV2UgYXNzdW1lIGltYWdlcyBmb3IgY3ViZSBtYXAgaGF2ZSB0aGUgc2FtZSBzaXplLlxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggMzQwNjcsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cblx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0dmFyIHdyYXBwaW5nVG9HTCA9IHtcblx0XHRbIFJlcGVhdFdyYXBwaW5nIF06IDEwNDk3LFxuXHRcdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiAzMzA3MSxcblx0XHRbIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgXTogMzM2NDhcblx0fTtcblxuXHR2YXIgZmlsdGVyVG9HTCA9IHtcblx0XHRbIE5lYXJlc3RGaWx0ZXIgXTogOTcyOCxcblx0XHRbIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyIF06IDk5ODQsXG5cdFx0WyBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIF06IDk5ODYsXG5cblx0XHRbIExpbmVhckZpbHRlciBdOiA5NzI5LFxuXHRcdFsgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciBdOiA5OTg1LFxuXHRcdFsgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIF06IDk5ODdcblx0fTtcblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdGlmICggc3VwcG9ydHNNaXBzICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQyLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFMgXSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0Mywgd3JhcHBpbmdUb0dMWyB0ZXh0dXJlLndyYXBUIF0gKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlVHlwZSA9PT0gMzI4NzkgfHwgdGV4dHVyZVR5cGUgPT09IDM1ODY2ICkge1xuXG5cdFx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMzI4ODIsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwUiBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MCwgZmlsdGVyVG9HTFsgdGV4dHVyZS5tYWdGaWx0ZXIgXSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MSwgZmlsdGVyVG9HTFsgdGV4dHVyZS5taW5GaWx0ZXIgXSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MiwgMzMwNzEgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDMsIDMzMDcxICk7XG5cblx0XHRcdGlmICggdGV4dHVyZVR5cGUgPT09IDMyODc5IHx8IHRleHR1cmVUeXBlID09PSAzNTg2NiApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDMyODgyLCAzMzA3MSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS53cmFwUyBhbmQgVGV4dHVyZS53cmFwVCBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLkNsYW1wVG9FZGdlV3JhcHBpbmcuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDAsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQxLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47XG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiAoIGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICkgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBpbml0VGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUgKSB7XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTtcblxuXHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVR5cGUgPSAzNTUzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUyREFycmF5ICkgdGV4dHVyZVR5cGUgPSAzNTg2Njtcblx0XHRpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZTNEICkgdGV4dHVyZVR5cGUgPSAzMjg3OTtcblxuXHRcdGluaXRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSApO1xuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIHRleHR1cmVUeXBlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MCwgdGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDEsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNywgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdHZhciBuZWVkc1Bvd2VyT2ZUd28gPSB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgJiYgaXNQb3dlck9mVHdvKCB0ZXh0dXJlLmltYWdlICkgPT09IGZhbHNlO1xuXHRcdHZhciBpbWFnZSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIGZhbHNlLCBtYXhUZXh0dXJlU2l6ZSApO1xuXG5cdFx0dmFyIHN1cHBvcnRzTWlwcyA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSB8fCBpc1dlYkdMMixcblx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApLFxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApO1xuXG5cdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gcG9wdWxhdGUgZGVwdGggdGV4dHVyZSB3aXRoIGR1bW15IGRhdGFcblxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDY0MDI7XG5cblx0XHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHtcblxuXHRcdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSAzNjAxMjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSAzMzE5MDtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSAzNTA1NjtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDMzMTg5OyAvLyBXZWJHTDIgcmVxdWlyZXMgc2l6ZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRFxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdMUmVuZGVyZXI6IEZsb2F0aW5nIHBvaW50IGRlcHRoIHRleHR1cmUgcmVxdWlyZXMgV2ViR0wyLicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gdmFsaWRhdGlvbiBjaGVja3MgZm9yIFdlYkdMIDFcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgZ2xJbnRlcm5hbEZvcm1hdCA9PT0gNjQwMiApIHtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlRcblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZFNob3J0VHlwZSAmJiB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICYmIGdsSW50ZXJuYWxGb3JtYXQgPT09IDY0MDIgKSB7XG5cblx0XHRcdFx0Ly8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVOQ0lMIGludGVybmFsIGZvcm1hdFxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM0MDQxO1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC5cblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzU1MywgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgc3VwcG9ydHNNaXBzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggMzU1MywgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKScgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzU1MywgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHtcblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UzRCggMzU4NjYsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZTNEICkge1xuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCAzMjg3OSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcylcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGV4dHVyZVR5cGUsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggMzYxNjAsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgaW50ZXJuYWwgZGVwdGgvc3RlbmNpbCBidWZmZXJzIGFuZCBiaW5kIHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCwgaXNNdWx0aXNhbXBsZSApIHtcblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiAhIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHR2YXIgZ2xJbnRlcm5hbEZvcm1hdCA9IDMzMTg5O1xuXG5cdFx0XHRpZiAoIGlzTXVsdGlzYW1wbGUgKSB7XG5cblx0XHRcdFx0dmFyIGRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRleHR1cmUgJiYgZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aFRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzYwMTI7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkZXB0aFRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzMxOTA7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzYwOTYsIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdHZhciBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIDM1MDU2LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggMzYxNjEsIDM0MDQxLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggMzYxNjAsIDMzMzA2LCAzNjE2MSwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgKTtcblx0XHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlICk7XG5cdFx0XHR2YXIgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXG5cdFx0XHRpZiAoIGlzTXVsdGlzYW1wbGUgKSB7XG5cblx0XHRcdFx0dmFyIHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIDM2MTYxLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBsb2FkIGFuIGVtcHR5IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBzaXplXG5cdFx0aWYgKCAhIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmUgfHxcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCAhPT0gcmVuZGVyVGFyZ2V0LndpZHRoIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0ICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoO1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzZXRUZXh0dXJlMkQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdHZhciB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzYwOTYsIDM1NTMsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCAzMzMwNiwgMzU1Mywgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gdHJ1ZSApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzJyApO1xuXG5cdFx0XHRzZXR1cERlcHRoVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIsIHJlbmRlclRhcmdldCwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXRcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XG5cblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gdHJ1ZSApO1xuXHRcdHZhciBpc011bHRpc2FtcGxlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID09PSB0cnVlICk7XG5cdFx0dmFyIHN1cHBvcnRzTWlwcyA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICkgfHwgaXNXZWJHTDI7XG5cblx0XHQvLyBIYW5kbGVzIFdlYkdMMiBSR0JGb3JtYXQgZmFsbGJhY2sgLSAjMTg4NThcblxuXHRcdGlmICggaXNXZWJHTDIgJiYgcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID09PSBSR0JGb3JtYXQgJiYgKCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgfHwgcmVuZGVyVGFyZ2V0LnRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSApICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JBRm9ybWF0O1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXJpbmcgdG8gdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFVzaW5nIFJHQkEgZm9ybWF0IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgZnJhbWVidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0XHRcdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRcdFx0XHR2YXIgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXHRcdFx0XHRcdHZhciBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzYwNjQsIDM2MTYxLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciApO1xuXHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgbnVsbCApO1xuXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCB0cnVlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgbnVsbCApO1xuXG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBjb2xvciBidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggMzQwNjcsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgMzQwNjkgKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSApIHtcblxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggMzQwNjcsIHJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIG51bGwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNTUzLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIDM1NTMsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgMzU1MyApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCAzNTUzLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnNcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdHZhciBzdXBwb3J0c01pcHMgPSBpc1Bvd2VyT2ZUd28oIHJlbmRlclRhcmdldCApIHx8IGlzV2ViR0wyO1xuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHR2YXIgdGFyZ2V0ID0gcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID8gMzQwNjcgOiAzNTUzO1xuXHRcdFx0dmFyIHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIHdlYmdsVGV4dHVyZSApO1xuXHRcdFx0Z2VuZXJhdGVNaXBtYXAoIHRhcmdldCwgdGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYwMDgsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MDA5LCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdHZhciB3aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdFx0dmFyIGhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XG5cdFx0XHRcdHZhciBtYXNrID0gMTYzODQ7XG5cblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSBtYXNrIHw9IDI1Njtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIG1hc2sgfD0gMTAyNDtcblxuXHRcdFx0XHRfZ2wuYmxpdEZyYW1lYnVmZmVyKCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCA5NzI4ICk7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7IC8vIHNlZSAjMTg5MDVcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHJldHVybiAoIGlzV2ViR0wyICYmIHJlbmRlclRhcmdldC5pc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgKSA/XG5cdFx0XHRNYXRoLm1pbiggbWF4U2FtcGxlcywgcmVuZGVyVGFyZ2V0LnNhbXBsZXMgKSA6IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0Ly8gQ2hlY2sgdGhlIGxhc3QgZnJhbWUgd2UgdXBkYXRlZCB0aGUgVmlkZW9UZXh0dXJlXG5cblx0XHRpZiAoIF92aWRlb1RleHR1cmVzLmdldCggdGV4dHVyZSApICE9PSBmcmFtZSApIHtcblxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuc2V0KCB0ZXh0dXJlLCBmcmFtZSApO1xuXHRcdFx0dGV4dHVyZS51cGRhdGUoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXHR2YXIgd2FybmVkVGV4dHVyZTJEID0gZmFsc2U7XG5cdHZhciB3YXJuZWRUZXh0dXJlQ3ViZSA9IGZhbHNlO1xuXG5cdGZ1bmN0aW9uIHNhZmVTZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHdhcm5lZFRleHR1cmUyRCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHR3YXJuZWRUZXh0dXJlMkQgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHR9XG5cblx0XHRzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2FmZVNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGlmICggd2FybmVkVGV4dHVyZUN1YmUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZFRleHR1cmVDdWJlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTEN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0Ly8gVE9ETzogdW5pZnkgdGhlc2UgY29kZSBwYXRoc1xuXHRcdGlmICggKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHx8XG5cdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHQvLyBDb21wcmVzc2VkVGV4dHVyZSBjYW4gaGF2ZSBBcnJheSBpbiBpbWFnZSA6L1xuXG5cdFx0XHQvLyB0aGlzIGZ1bmN0aW9uIGFsb25lIHNob3VsZCB0YWtlIGNhcmUgb2YgY3ViZSB0ZXh0dXJlc1xuXHRcdFx0c2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0XG5cdFx0XHRzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0O1xuXHR0aGlzLnJlc2V0VGV4dHVyZVVuaXRzID0gcmVzZXRUZXh0dXJlVW5pdHM7XG5cblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEQXJyYXkgPSBzZXRUZXh0dXJlMkRBcnJheTtcblx0dGhpcy5zZXRUZXh0dXJlM0QgPSBzZXRUZXh0dXJlM0Q7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMgPSBzZXRUZXh0dXJlQ3ViZUR5bmFtaWM7XG5cdHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQgPSBzZXR1cFJlbmRlclRhcmdldDtcblx0dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7XG5cdHRoaXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgPSB1cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldDtcblxuXHR0aGlzLnNhZmVTZXRUZXh0dXJlMkQgPSBzYWZlU2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNhZmVTZXRUZXh0dXJlQ3ViZSA9IHNhZmVTZXRUZXh0dXJlQ3ViZTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gNTEyMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiAzMjgxOTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiAzMjgyMDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIDMzNjM1O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiA1MTIwO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIDUxMjI7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiA1MTIzO1xuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiA1MTI0O1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIDUxMjU7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gNTEyNjtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiA1MTMxO1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gNjQwNjtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiA2NDA3O1xuXHRcdGlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiA2NDA4O1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIDY0MDk7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiA2NDEwO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gNjQwMjtcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiAzNDA0MTtcblx0XHRpZiAoIHAgPT09IFJlZEZvcm1hdCApIHJldHVybiA2NDAzO1xuXG5cdFx0Ly8gV2ViR0wyIGZvcm1hdHMuXG5cblx0XHRpZiAoIHAgPT09IFJlZEludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDQ7XG5cdFx0aWYgKCBwID09PSBSR0Zvcm1hdCApIHJldHVybiAzMzMxOTtcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiAzMzMyMDtcblx0XHRpZiAoIHAgPT09IFJHQkludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDg7XG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiAzNjI0OTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQjhfRVRDMjtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0VUQzJfRUFDX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNHg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIFRPRE8gQ29tcGxldGU/XG5cblx0XHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyBUT0RPIENvbXBsZXRlP1xuXG5cdFx0XHRcdHJldHVybiBwO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiAzNDA0MjtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEdyb3VwKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xuXG59XG5cbkdyb3VwLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdyb3VwLFxuXG5cdGlzR3JvdXA6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViWFJNYW5hZ2VyKCByZW5kZXJlciwgZ2wgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgc2Vzc2lvbiA9IG51bGw7XG5cblx0dmFyIGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxLjA7XG5cblx0dmFyIHJlZmVyZW5jZVNwYWNlID0gbnVsbDtcblx0dmFyIHJlZmVyZW5jZVNwYWNlVHlwZSA9ICdsb2NhbC1mbG9vcic7XG5cblx0dmFyIHBvc2UgPSBudWxsO1xuXG5cdHZhciBjb250cm9sbGVycyA9IFtdO1xuXHR2YXIgaW5wdXRTb3VyY2VzTWFwID0gbmV3IE1hcCgpO1xuXG5cdC8vXG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYUwudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHRjYW1lcmFSLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdHZhciBfY3VycmVudERlcHRoTmVhciA9IG51bGw7XG5cdHZhciBfY3VycmVudERlcHRoRmFyID0gbnVsbDtcblxuXHQvL1xuXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdHRoaXMuaXNQcmVzZW50aW5nID0gZmFsc2U7XG5cblx0dGhpcy5nZXRDb250cm9sbGVyID0gZnVuY3Rpb24gKCBpZCApIHtcblxuXHRcdHZhciBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGlkIF07XG5cblx0XHRpZiAoIGNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udHJvbGxlciA9IHt9O1xuXHRcdFx0Y29udHJvbGxlcnNbIGlkIF0gPSBjb250cm9sbGVyO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjb250cm9sbGVyLnRhcmdldFJheSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb250cm9sbGVyLnRhcmdldFJheSA9IG5ldyBHcm91cCgpO1xuXHRcdFx0Y29udHJvbGxlci50YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Y29udHJvbGxlci50YXJnZXRSYXkudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIudGFyZ2V0UmF5O1xuXG5cdH07XG5cblx0dGhpcy5nZXRDb250cm9sbGVyR3JpcCA9IGZ1bmN0aW9uICggaWQgKSB7XG5cblx0XHR2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpZCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSB7fTtcblx0XHRcdGNvbnRyb2xsZXJzWyBpZCBdID0gY29udHJvbGxlcjtcblxuXHRcdH1cblxuXHRcdGlmICggY29udHJvbGxlci5ncmlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIuZ3JpcCA9IG5ldyBHcm91cCgpO1xuXHRcdFx0Y29udHJvbGxlci5ncmlwLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdGNvbnRyb2xsZXIuZ3JpcC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5ncmlwO1xuXG5cdH07XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBvblNlc3Npb25FdmVudCggZXZlbnQgKSB7XG5cblx0XHR2YXIgY29udHJvbGxlciA9IGlucHV0U291cmNlc01hcC5nZXQoIGV2ZW50LmlucHV0U291cmNlICk7XG5cblx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdGlmICggY29udHJvbGxlci50YXJnZXRSYXkgKSB7XG5cblx0XHRcdFx0Y29udHJvbGxlci50YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiBldmVudC50eXBlIH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIuZ3JpcCApIHtcblxuXHRcdFx0XHRjb250cm9sbGVyLmdyaXAuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiBldmVudC50eXBlIH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBvblNlc3Npb25FbmQoKSB7XG5cblx0XHRpbnB1dFNvdXJjZXNNYXAuZm9yRWFjaCggZnVuY3Rpb24gKCBjb250cm9sbGVyLCBpbnB1dFNvdXJjZSApIHtcblxuXHRcdFx0aWYgKCBjb250cm9sbGVyLnRhcmdldFJheSApIHtcblxuXHRcdFx0XHRjb250cm9sbGVyLnRhcmdldFJheS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cdFx0XHRcdGNvbnRyb2xsZXIudGFyZ2V0UmF5LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIuZ3JpcCApIHtcblxuXHRcdFx0XHRjb250cm9sbGVyLmdyaXAuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xuXHRcdFx0XHRjb250cm9sbGVyLmdyaXAudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRpbnB1dFNvdXJjZXNNYXAuY2xlYXIoKTtcblxuXHRcdC8vXG5cblx0XHRyZW5kZXJlci5zZXRGcmFtZWJ1ZmZlciggbnVsbCApO1xuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCkgKTsgLy8gSGFjayAjMTU4MzBcblx0XHRhbmltYXRpb24uc3RvcCgpO1xuXG5cdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gZmFsc2U7XG5cblx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uZW5kJyB9ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUmVxdWVzdFJlZmVyZW5jZVNwYWNlKCB2YWx1ZSApIHtcblxuXHRcdHJlZmVyZW5jZVNwYWNlID0gdmFsdWU7XG5cblx0XHRhbmltYXRpb24uc2V0Q29udGV4dCggc2Vzc2lvbiApO1xuXHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gdHJ1ZTtcblxuXHRcdHNjb3BlLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3Nlc3Npb25zdGFydCcgfSApO1xuXG5cdH1cblxuXHR0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0ZnJhbWVidWZmZXJTY2FsZUZhY3RvciA9IHZhbHVlO1xuXG5cdFx0Ly8gV2FybiBpZiBmdW5jdGlvbiBpcyB1c2VkIHdoaWxlIHByZXNlbnRpbmdcblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oIFwiV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNjYWxlIHdoaWxlIHByZXNlbnRpbmcgVlIgY29udGVudFwiICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZSA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZWZlcmVuY2VTcGFjZVR5cGUgPSB2YWx1ZTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UmVmZXJlbmNlU3BhY2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gcmVmZXJlbmNlU3BhY2U7XG5cblx0fTtcblxuXHR0aGlzLmdldFNlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gc2Vzc2lvbjtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Vzc2lvbiA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRzZXNzaW9uID0gdmFsdWU7XG5cblx0XHRpZiAoIHNlc3Npb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RlbmQnLCBvblNlc3Npb25FdmVudCApO1xuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZScsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplc3RhcnQnLCBvblNlc3Npb25FdmVudCApO1xuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZWVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmQgKTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR2YXIgbGF5ZXJJbml0ID0ge1xuXHRcdFx0XHRhbnRpYWxpYXM6IGF0dHJpYnV0ZXMuYW50aWFsaWFzLFxuXHRcdFx0XHRhbHBoYTogYXR0cmlidXRlcy5hbHBoYSxcblx0XHRcdFx0ZGVwdGg6IGF0dHJpYnV0ZXMuZGVwdGgsXG5cdFx0XHRcdHN0ZW5jaWw6IGF0dHJpYnV0ZXMuc3RlbmNpbCxcblx0XHRcdFx0ZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogZnJhbWVidWZmZXJTY2FsZUZhY3RvclxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5cdFx0XHR2YXIgYmFzZUxheWVyID0gbmV3IFhSV2ViR0xMYXllciggc2Vzc2lvbiwgZ2wsIGxheWVySW5pdCApO1xuXG5cdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGJhc2VMYXllcjogYmFzZUxheWVyIH0gKTtcblxuXHRcdFx0c2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoIHJlZmVyZW5jZVNwYWNlVHlwZSApLnRoZW4oIG9uUmVxdWVzdFJlZmVyZW5jZVNwYWNlICk7XG5cblx0XHRcdC8vXG5cblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIHVwZGF0ZUlucHV0U291cmNlcyApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gdXBkYXRlSW5wdXRTb3VyY2VzKCBldmVudCApIHtcblxuXHRcdHZhciBpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlcztcblxuXHRcdC8vIEFzc2lnbiBpbnB1dFNvdXJjZXMgdG8gYXZhaWxhYmxlIGNvbnRyb2xsZXJzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlucHV0U291cmNlc01hcC5zZXQoIGlucHV0U291cmNlc1sgaSBdLCBjb250cm9sbGVyc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBldmVudC5yZW1vdmVkLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGlucHV0U291cmNlID0gZXZlbnQucmVtb3ZlZFsgaSBdO1xuXHRcdFx0dmFyIGNvbnRyb2xsZXIgPSBpbnB1dFNvdXJjZXNNYXAuZ2V0KCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdFx0aWYgKCBjb250cm9sbGVyLnRhcmdldFJheSApIHtcblxuXHRcdFx0XHRcdGNvbnRyb2xsZXIudGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIGRhdGE6IGlucHV0U291cmNlIH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBjb250cm9sbGVyLmdyaXAgKSB7XG5cblx0XHRcdFx0XHRjb250cm9sbGVyLmdyaXAuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnB1dFNvdXJjZXNNYXAuZGVsZXRlKCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgY29ubmVjdGVkXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBldmVudC5hZGRlZC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbnB1dFNvdXJjZSA9IGV2ZW50LmFkZGVkWyBpIF07XG5cdFx0XHR2YXIgY29udHJvbGxlciA9IGlucHV0U291cmNlc01hcC5nZXQoIGlucHV0U291cmNlICk7XG5cblx0XHRcdGlmICggY29udHJvbGxlciApIHtcblxuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXIudGFyZ2V0UmF5ICkge1xuXG5cdFx0XHRcdFx0Y29udHJvbGxlci50YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXIuZ3JpcCApIHtcblxuXHRcdFx0XHRcdGNvbnRyb2xsZXIuZ3JpcC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGNhbWVyYUxQb3MgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhUlBvcyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0LyoqXG5cdCAqIEBhdXRob3IganNhbnRlbGwgLyBodHRwczovL3d3dy5qc2FudGVsbC5jb20vXG5cdCAqXG5cdCAqIEFzc3VtZXMgMiBjYW1lcmFzIHRoYXQgYXJlIHBhcmFsbGVsIGFuZCBzaGFyZSBhbiBYLWF4aXMsIGFuZCB0aGF0XG5cdCAqIHRoZSBjYW1lcmFzJyBwcm9qZWN0aW9uIGFuZCB3b3JsZCBtYXRyaWNlcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuXG5cdCAqIEFuZCB0aGF0IG5lYXIgYW5kIGZhciBwbGFuZXMgYXJlIGlkZW50aWNhbCBmb3IgYm90aCBjYW1lcmFzLlxuXHQgKiBWaXN1YWxpemF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlOiBodHRwczovL2NvbXB1dGVyZ3JhcGhpY3Muc3RhY2tleGNoYW5nZS5jb20vYS80NzY1XG5cdCAqL1xuXHRmdW5jdGlvbiBzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmEsIGNhbWVyYUwsIGNhbWVyYVIgKSB7XG5cblx0XHRjYW1lcmFMUG9zLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhTC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYVJQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFSLm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgaXBkID0gY2FtZXJhTFBvcy5kaXN0YW5jZVRvKCBjYW1lcmFSUG9zICk7XG5cblx0XHR2YXIgcHJvakwgPSBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XG5cdFx0dmFyIHByb2pSID0gY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Ly8gVlIgc3lzdGVtcyB3aWxsIGhhdmUgaWRlbnRpY2FsIGZhciBhbmQgbmVhciBwbGFuZXMsIGFuZFxuXHRcdC8vIG1vc3QgbGlrZWx5IGlkZW50aWNhbCB0b3AgYW5kIGJvdHRvbSBmcnVzdHVtIGV4dGVudHMuXG5cdFx0Ly8gVXNlIHRoZSBsZWZ0IGNhbWVyYSBmb3IgdGhlc2UgdmFsdWVzLlxuXHRcdHZhciBuZWFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdIC0gMSApO1xuXHRcdHZhciBmYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gKyAxICk7XG5cdFx0dmFyIHRvcEZvdiA9ICggcHJvakxbIDkgXSArIDEgKSAvIHByb2pMWyA1IF07XG5cdFx0dmFyIGJvdHRvbUZvdiA9ICggcHJvakxbIDkgXSAtIDEgKSAvIHByb2pMWyA1IF07XG5cblx0XHR2YXIgbGVmdEZvdiA9ICggcHJvakxbIDggXSAtIDEgKSAvIHByb2pMWyAwIF07XG5cdFx0dmFyIHJpZ2h0Rm92ID0gKCBwcm9qUlsgOCBdICsgMSApIC8gcHJvalJbIDAgXTtcblx0XHR2YXIgbGVmdCA9IG5lYXIgKiBsZWZ0Rm92O1xuXHRcdHZhciByaWdodCA9IG5lYXIgKiByaWdodEZvdjtcblxuXHRcdC8vIENhbGN1bGF0ZSB0aGUgbmV3IGNhbWVyYSdzIHBvc2l0aW9uIG9mZnNldCBmcm9tIHRoZVxuXHRcdC8vIGxlZnQgY2FtZXJhLiB4T2Zmc2V0IHNob3VsZCBiZSByb3VnaGx5IGhhbGYgYGlwZGAuXG5cdFx0dmFyIHpPZmZzZXQgPSBpcGQgLyAoIC0gbGVmdEZvdiArIHJpZ2h0Rm92ICk7XG5cdFx0dmFyIHhPZmZzZXQgPSB6T2Zmc2V0ICogLSBsZWZ0Rm92O1xuXG5cdFx0Ly8gVE9ETzogQmV0dGVyIHdheSB0byBhcHBseSB0aGlzIG9mZnNldD9cblx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XG5cdFx0Y2FtZXJhLnRyYW5zbGF0ZVgoIHhPZmZzZXQgKTtcblx0XHRjYW1lcmEudHJhbnNsYXRlWiggek9mZnNldCApO1xuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5jb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcblx0XHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Ly8gRmluZCB0aGUgdW5pb24gb2YgdGhlIGZydXN0dW0gdmFsdWVzIG9mIHRoZSBjYW1lcmFzIGFuZCBzY2FsZVxuXHRcdC8vIHRoZSB2YWx1ZXMgc28gdGhhdCB0aGUgbmVhciBwbGFuZSdzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZSBpbiB3b3JsZCBzcGFjZSxcblx0XHQvLyBhbHRob3VnaCBtdXN0IG5vdyBiZSByZWxhdGl2ZSB0byB0aGUgbmV3IHVuaW9uIGNhbWVyYS5cblx0XHR2YXIgbmVhcjIgPSBuZWFyICsgek9mZnNldDtcblx0XHR2YXIgZmFyMiA9IGZhciArIHpPZmZzZXQ7XG5cdFx0dmFyIGxlZnQyID0gbGVmdCAtIHhPZmZzZXQ7XG5cdFx0dmFyIHJpZ2h0MiA9IHJpZ2h0ICsgKCBpcGQgLSB4T2Zmc2V0ICk7XG5cdFx0dmFyIHRvcDIgPSB0b3BGb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XG5cdFx0dmFyIGJvdHRvbTIgPSBib3R0b21Gb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XG5cblx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQyLCByaWdodDIsIHRvcDIsIGJvdHRvbTIsIG5lYXIyLCBmYXIyICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUNhbWVyYSggY2FtZXJhLCBwYXJlbnQgKSB7XG5cblx0XHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCBwYXJlbnQubWF0cml4V29ybGQsIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0fVxuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRjYW1lcmFWUi5uZWFyID0gY2FtZXJhUi5uZWFyID0gY2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhVlIuZmFyID0gY2FtZXJhUi5mYXIgPSBjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIF9jdXJyZW50RGVwdGhOZWFyICE9PSBjYW1lcmFWUi5uZWFyIHx8IF9jdXJyZW50RGVwdGhGYXIgIT09IGNhbWVyYVZSLmZhciApIHtcblxuXHRcdFx0Ly8gTm90ZSB0aGF0IHRoZSBuZXcgcmVuZGVyU3RhdGUgd29uJ3QgYXBwbHkgdW50aWwgdGhlIG5leHQgZnJhbWUuIFNlZSAjMTgzMjBcblxuXHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSgge1xuXHRcdFx0XHRkZXB0aE5lYXI6IGNhbWVyYVZSLm5lYXIsXG5cdFx0XHRcdGRlcHRoRmFyOiBjYW1lcmFWUi5mYXJcblx0XHRcdH0gKTtcblxuXHRcdFx0X2N1cnJlbnREZXB0aE5lYXIgPSBjYW1lcmFWUi5uZWFyO1xuXHRcdFx0X2N1cnJlbnREZXB0aEZhciA9IGNhbWVyYVZSLmZhcjtcblxuXHRcdH1cblxuXHRcdHZhciBwYXJlbnQgPSBjYW1lcmEucGFyZW50O1xuXHRcdHZhciBjYW1lcmFzID0gY2FtZXJhVlIuY2FtZXJhcztcblxuXHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhVlIsIHBhcmVudCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2FtZXJhcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhc1sgaSBdLCBwYXJlbnQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYVZSLm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBjYW1lcmEuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHR9XG5cblx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFWUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xuXG5cdFx0cmV0dXJuIGNhbWVyYVZSO1xuXG5cdH07XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHR2YXIgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0aWYgKCBwb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgdmlld3MgPSBwb3NlLnZpZXdzO1xuXHRcdFx0dmFyIGJhc2VMYXllciA9IHNlc3Npb24ucmVuZGVyU3RhdGUuYmFzZUxheWVyO1xuXG5cdFx0XHRyZW5kZXJlci5zZXRGcmFtZWJ1ZmZlciggYmFzZUxheWVyLmZyYW1lYnVmZmVyICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgdmlldyA9IHZpZXdzWyBpIF07XG5cdFx0XHRcdHZhciB2aWV3cG9ydCA9IGJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xuXG5cdFx0XHRcdHZhciBjYW1lcmEgPSBjYW1lcmFWUi5jYW1lcmFzWyBpIF07XG5cdFx0XHRcdGNhbWVyYS5tYXRyaXguZnJvbUFycmF5KCB2aWV3LnRyYW5zZm9ybS5tYXRyaXggKTtcblx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCB2aWV3LnByb2plY3Rpb25NYXRyaXggKTtcblx0XHRcdFx0Y2FtZXJhLnZpZXdwb3J0LnNldCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCApO1xuXG5cdFx0XHRcdGlmICggaSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGNhbWVyYVZSLm1hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGlucHV0U291cmNlcyA9IHNlc3Npb24uaW5wdXRTb3VyY2VzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07XG5cblx0XHRcdHZhciBpbnB1dFNvdXJjZSA9IGlucHV0U291cmNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgaW5wdXRQb3NlID0gbnVsbDtcblx0XHRcdHZhciBncmlwUG9zZSA9IG51bGw7XG5cblx0XHRcdGlmICggaW5wdXRTb3VyY2UgKSB7XG5cblx0XHRcdFx0aWYgKCBjb250cm9sbGVyLnRhcmdldFJheSApIHtcblxuXHRcdFx0XHRcdGlucHV0UG9zZSA9IGZyYW1lLmdldFBvc2UoIGlucHV0U291cmNlLnRhcmdldFJheVNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnB1dFBvc2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIudGFyZ2V0UmF5Lm1hdHJpeC5mcm9tQXJyYXkoIGlucHV0UG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XG5cdFx0XHRcdFx0XHRjb250cm9sbGVyLnRhcmdldFJheS5tYXRyaXguZGVjb21wb3NlKCBjb250cm9sbGVyLnRhcmdldFJheS5wb3NpdGlvbiwgY29udHJvbGxlci50YXJnZXRSYXkucm90YXRpb24sIGNvbnRyb2xsZXIudGFyZ2V0UmF5LnNjYWxlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggY29udHJvbGxlci5ncmlwICYmIGlucHV0U291cmNlLmdyaXBTcGFjZSApIHtcblxuXHRcdFx0XHRcdGdyaXBQb3NlID0gZnJhbWUuZ2V0UG9zZSggaW5wdXRTb3VyY2UuZ3JpcFNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0XHRcdFx0aWYgKCBncmlwUG9zZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0Y29udHJvbGxlci5ncmlwLm1hdHJpeC5mcm9tQXJyYXkoIGdyaXBQb3NlLnRyYW5zZm9ybS5tYXRyaXggKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuZ3JpcC5tYXRyaXguZGVjb21wb3NlKCBjb250cm9sbGVyLmdyaXAucG9zaXRpb24sIGNvbnRyb2xsZXIuZ3JpcC5yb3RhdGlvbiwgY29udHJvbGxlci5ncmlwLnNjYWxlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29udHJvbGxlci50YXJnZXRSYXkgKSB7XG5cblx0XHRcdFx0Y29udHJvbGxlci50YXJnZXRSYXkudmlzaWJsZSA9IGlucHV0UG9zZSAhPT0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIuZ3JpcCApIHtcblxuXHRcdFx0XHRjb250cm9sbGVyLmdyaXAudmlzaWJsZSA9IGdyaXBQb3NlICE9PSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayApIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayggdGltZSwgZnJhbWUgKTtcblxuXHR9XG5cblx0dmFyIGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpO1xuXHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFdlYlhSTWFuYWdlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1ldGVycyApIHtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApLFxuXHRcdF9jb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiBudWxsLFxuXG5cdFx0X2FscGhhID0gcGFyYW1ldGVycy5hbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbHBoYSA6IGZhbHNlLFxuXHRcdF9kZXB0aCA9IHBhcmFtZXRlcnMuZGVwdGggIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuZGVwdGggOiB0cnVlLFxuXHRcdF9zdGVuY2lsID0gcGFyYW1ldGVycy5zdGVuY2lsICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnN0ZW5jaWwgOiB0cnVlLFxuXHRcdF9hbnRpYWxpYXMgPSBwYXJhbWV0ZXJzLmFudGlhbGlhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbnRpYWxpYXMgOiBmYWxzZSxcblx0XHRfcHJlbXVsdGlwbGllZEFscGhhID0gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhIDogdHJ1ZSxcblx0XHRfcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyIDogZmFsc2UsXG5cdFx0X3Bvd2VyUHJlZmVyZW5jZSA9IHBhcmFtZXRlcnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSA6ICdkZWZhdWx0Jyxcblx0XHRfZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IHBhcmFtZXRlcnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IDogZmFsc2U7XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXG5cdC8vIERlYnVnIGNvbmZpZ3VyYXRpb24gY29udGFpbmVyXG5cdHRoaXMuZGVidWcgPSB7XG5cblx0XHQvKipcblx0XHQgKiBFbmFibGVzIGVycm9yIGNoZWNraW5nIGFuZCByZXBvcnRpbmcgd2hlbiBzaGFkZXIgcHJvZ3JhbXMgYXJlIGJlaW5nIGNvbXBpbGVkXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICovXG5cdFx0Y2hlY2tTaGFkZXJFcnJvcnM6IHRydWVcblx0fTtcblxuXHQvLyBjbGVhcmluZ1xuXG5cdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlO1xuXG5cdC8vIHNjZW5lIGdyYXBoXG5cblx0dGhpcy5zb3J0T2JqZWN0cyA9IHRydWU7XG5cblx0Ly8gdXNlci1kZWZpbmVkIGNsaXBwaW5nXG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xuXHR0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nXG5cblx0dGhpcy5nYW1tYUZhY3RvciA9IDIuMDtcdC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHR0aGlzLm91dHB1dEVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2UsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2ZyYW1lYnVmZmVyID0gbnVsbCxcblxuXHRcdF9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSAwLFxuXHRcdF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSAwLFxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbCxcblx0XHRfY3VycmVudEZyYW1lYnVmZmVyID0gbnVsbCxcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDEsXG5cblx0XHQvLyBnZW9tZXRyeSBhbmQgcHJvZ3JhbSBjYWNoaW5nXG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IHtcblx0XHRcdGdlb21ldHJ5OiBudWxsLFxuXHRcdFx0cHJvZ3JhbTogbnVsbCxcblx0XHRcdHdpcmVmcmFtZTogZmFsc2Vcblx0XHR9LFxuXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdC8vXG5cblx0XHRfd2lkdGggPSBfY2FudmFzLndpZHRoLFxuXHRcdF9oZWlnaHQgPSBfY2FudmFzLmhlaWdodCxcblxuXHRcdF9waXhlbFJhdGlvID0gMSxcblx0XHRfb3BhcXVlU29ydCA9IG51bGwsXG5cdFx0X3RyYW5zcGFyZW50U29ydCA9IG51bGwsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogX3Bvd2VyUHJlZmVyZW5jZSxcblx0XHRcdGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IF9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LFxuXHRcdFx0eHJDb21wYXRpYmxlOiB0cnVlXG5cdFx0fTtcblxuXHRcdC8vIGV2ZW50IGxpc3RlbmVycyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFdlYkdMIGNvbnRleHQgaXMgY3JlYXRlZCwgc2VlICMxMjc1M1xuXG5cdFx0X2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XG5cdFx0X2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApO1xuXG5cdFx0X2dsID0gX2NvbnRleHQgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApIHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICk7XG5cblx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcgKSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLicgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBleHBlcmltZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdFxuXG5cdFx0aWYgKCBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNpc2lvbic6IDEgfTtcblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIGVycm9yLm1lc3NhZ2UgKTtcblx0XHR0aHJvdyBlcnJvcjtcblxuXHR9XG5cblx0dmFyIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87XG5cdHZhciBwcm9wZXJ0aWVzLCB0ZXh0dXJlcywgYXR0cmlidXRlcywgZ2VvbWV0cmllcywgb2JqZWN0cztcblx0dmFyIHByb2dyYW1DYWNoZSwgcmVuZGVyTGlzdHMsIHJlbmRlclN0YXRlcztcblxuXHR2YXIgYmFja2dyb3VuZCwgbW9ycGh0YXJnZXRzLCBidWZmZXJSZW5kZXJlciwgaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXG5cdHZhciB1dGlscztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXG5cdFx0Y2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyID09PSBmYWxzZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICk7XG5cdFx0XHRleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXG5cdFx0dXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKSApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCkgKTtcblxuXHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHRcdHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKTtcblx0XHRhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsLCBjYXBhYmlsaXRpZXMgKTtcblx0XHRnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIF9nbCwgZ2VvbWV0cmllcywgYXR0cmlidXRlcywgaW5mbyApO1xuXHRcdG1vcnBodGFyZ2V0cyA9IG5ldyBXZWJHTE1vcnBodGFyZ2V0cyggX2dsICk7XG5cdFx0cHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblx0XHRyZW5kZXJMaXN0cyA9IG5ldyBXZWJHTFJlbmRlckxpc3RzKCk7XG5cdFx0cmVuZGVyU3RhdGVzID0gbmV3IFdlYkdMUmVuZGVyU3RhdGVzKCk7XG5cblx0XHRiYWNrZ3JvdW5kID0gbmV3IFdlYkdMQmFja2dyb3VuZCggX3RoaXMsIHN0YXRlLCBvYmplY3RzLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0XHRidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApO1xuXHRcdGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XG5cblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXHRcdF90aGlzLmluZm8gPSBpbmZvO1xuXG5cdH1cblxuXHRpbml0R0xDb250ZXh0KCk7XG5cblx0Ly8geHJcblxuXHR2YXIgeHIgPSBuZXcgV2ViWFJNYW5hZ2VyKCBfdGhpcywgX2dsICk7XG5cblx0dGhpcy54ciA9IHhyO1xuXG5cdC8vIHNoYWRvdyBtYXBcblxuXHR2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cblx0Ly8gQVBJXG5cblx0dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcblx0XHRpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9waXhlbFJhdGlvO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9waXhlbFJhdGlvID0gdmFsdWU7XG5cblx0XHR0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50JyApO1xuXG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCwgX2hlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHtcblxuXHRcdGlmICggeHIuaXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW5cXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfY2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggd2lkdGggKiBfcGl4ZWxSYXRpbyApO1xuXHRcdF9jYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaGVpZ2h0ICogX3BpeGVsUmF0aW8gKTtcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldGRyYXdpbmdCdWZmZXJTaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCcgKTtcblxuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCBfd2lkdGggKiBfcGl4ZWxSYXRpbywgX2hlaWdodCAqIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHBpeGVsUmF0aW8gKSB7XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogcGl4ZWxSYXRpbyApO1xuXHRcdF9jYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaGVpZ2h0ICogcGl4ZWxSYXRpbyApO1xuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1dlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50Vmlld3BvcnQoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3I0IGFzIGFuIGFyZ3VtZW50JyApO1xuXG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF92aWV3cG9ydCApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XG5cblx0XHRcdF92aWV3cG9ydC5zZXQoIHgueCwgeC55LCB4LnosIHgudyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3ZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTY2lzc29yID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF9zY2lzc29yICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHguaXNWZWN0b3I0ICkge1xuXG5cdFx0XHRfc2Npc3Nvci5zZXQoIHgueCwgeC55LCB4LnosIHgudyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3NjaXNzb3Iuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNjaXNzb3JUZXN0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9zY2lzc29yVGVzdDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRPcGFxdWVTb3J0ID0gZnVuY3Rpb24gKCBtZXRob2QgKSB7XG5cblx0XHRfb3BhcXVlU29ydCA9IG1ldGhvZDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0ID0gZnVuY3Rpb24gKCBtZXRob2QgKSB7XG5cblx0XHRfdHJhbnNwYXJlbnRTb3J0ID0gbWV0aG9kO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gMTYzODQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSAyNTY7XG5cdFx0aWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gMTAyNDtcblxuXHRcdF9nbC5jbGVhciggYml0cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblx0XHRyZW5kZXJTdGF0ZXMuZGlzcG9zZSgpO1xuXHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xuXHRcdG9iamVjdHMuZGlzcG9zZSgpO1xuXG5cdFx0eHIuZGlzcG9zZSgpO1xuXG5cdFx0YW5pbWF0aW9uLnN0b3AoKTtcblxuXHRcdHRoaXMuZm9yY2VDb250ZXh0TG9zcygpO1xuXG5cdH07XG5cblx0Ly8gRXZlbnRzXG5cblx0ZnVuY3Rpb24gb25Db250ZXh0TG9zdCggZXZlbnQgKSB7XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbkNvbnRleHRSZXN0b3JlKCAvKiBldmVudCAqLyApIHtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4nICk7XG5cblx0XHRfaXNDb250ZXh0TG9zdCA9IGZhbHNlO1xuXG5cdFx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XG5cblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTtcblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICkge1xuXG5cdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkucHJvZ3JhbTtcblxuXHRcdG1hdGVyaWFsLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHByb2dyYW1JbmZvICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW1DYWNoZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbUluZm8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQnVmZmVyIHJlbmRlcmluZ1xuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICkge1xuXG5cdFx0b2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0gKSB7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIGJ1ZmZlcnMgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgJiYgISBidWZmZXJzLnBvc2l0aW9uICkgYnVmZmVycy5wb3NpdGlvbiA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNOb3JtYWxzICYmICEgYnVmZmVycy5ub3JtYWwgKSBidWZmZXJzLm5vcm1hbCA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgJiYgISBidWZmZXJzLnV2ICkgYnVmZmVycy51diA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgISBidWZmZXJzLmNvbG9yICkgYnVmZmVycy5jb2xvciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIDM1MDQ4ICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24gKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiwgMywgNTEyNiwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy5ub3JtYWwgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0Lm5vcm1hbEFycmF5LCAzNTA0OCApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgNTEyNiwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc1V2cyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXJzLnV2ICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggMzQ5NjIsIG9iamVjdC51dkFycmF5LCAzNTA0OCApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMudXYsIDIsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QuY29sb3JBcnJheSwgMzUwNDggKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yLCAzLCA1MTI2LCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdF9nbC5kcmF3QXJyYXlzKCA0LCAwLCBvYmplY3QuY291bnQgKTtcblxuXHRcdG9iamVjdC5jb3VudCA9IDA7XG5cblx0fTtcblxuXHR2YXIgdGVtcFNjZW5lID0gbmV3IFNjZW5lKCk7XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdGlmICggc2NlbmUgPT09IG51bGwgKSBzY2VuZSA9IHRlbXBTY2VuZTsgLy8gcmVuZGVyQnVmZmVyRGlyZWN0IHNlY29uZCBwYXJhbWV0ZXIgdXNlZCB0byBiZSBmb2cgKGNvdWxkIGJlIG51bGwpXG5cblx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdHZhciB1cGRhdGVCdWZmZXJzID0gZmFsc2U7XG5cblx0XHRpZiAoIF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLmdlb21ldHJ5ICE9PSBnZW9tZXRyeS5pZCB8fFxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ucHJvZ3JhbSAhPT0gcHJvZ3JhbS5pZCB8fFxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ud2lyZWZyYW1lICE9PSAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IGdlb21ldHJ5LmlkO1xuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ucHJvZ3JhbSA9IHByb2dyYW0uaWQ7XG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWU7XG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzIHx8IG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHtcblxuXHRcdFx0bW9ycGh0YXJnZXRzLnVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKTtcblxuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIGluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24uY291bnQgPT09IDAgKSByZXR1cm47XG5cblx0XHR9IGVsc2UgaWYgKCBpbmRleC5jb3VudCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggMzQ5NjMsIGF0dHJpYnV0ZS5idWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBkYXRhQ291bnQgPSAoIGluZGV4ICE9PSBudWxsICkgPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50O1xuXG5cdFx0dmFyIHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHR2YXIgcmFuZ2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yO1xuXG5cdFx0dmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IgOiAwO1xuXHRcdHZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHR2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTtcblx0XHR2YXIgZHJhd0VuZCA9IE1hdGgubWluKCBkYXRhQ291bnQsIHJhbmdlU3RhcnQgKyByYW5nZUNvdW50LCBncm91cFN0YXJ0ICsgZ3JvdXBDb3VudCApIC0gMTtcblxuXHRcdHZhciBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0dmFyIGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsXG5cblx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDEgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCApIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQsIG9iamVjdC5jb3VudCApO1xuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgPT09IGZhbHNlICYmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCB8fCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIHByb2dyYW1BdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZSA+PSAwICkge1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHZhciBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUubm9ybWFsaXplZDtcblx0XHRcdFx0XHR2YXIgc2l6ZSA9IGdlb21ldHJ5QXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcblx0XHRcdFx0XHR2YXIgdHlwZSA9IGF0dHJpYnV0ZS50eXBlO1xuXHRcdFx0XHRcdHZhciBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7XG5cdFx0XHRcdFx0XHR2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGU7XG5cdFx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG5hbWUgPT09ICdpbnN0YW5jZU1hdHJpeCcgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIG9iamVjdC5pbnN0YW5jZU1hdHJpeCApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcblx0XHRcdFx0XHR2YXIgdHlwZSA9IGF0dHJpYnV0ZS50eXBlO1xuXG5cdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSArIDAsIDEgKTtcblx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlICsgMSwgMSApO1xuXHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUgKyAyLCAxICk7XG5cdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSArIDMsIDEgKTtcblxuXHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSArIDAsIDQsIHR5cGUsIGZhbHNlLCA2NCwgMCApO1xuXHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlICsgMSwgNCwgdHlwZSwgZmFsc2UsIDY0LCAxNiApO1xuXHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlICsgMiwgNCwgdHlwZSwgZmFsc2UsIDY0LCAzMiApO1xuXHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlICsgMywgNCwgdHlwZSwgZmFsc2UsIDY0LCA0OCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzWyBuYW1lIF07XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjJmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjRmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIxZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0fVxuXG5cdC8vIENvbXBpbGVcblxuXHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaWdodCApIHtcblxuXHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KCBvYmplY3QgKTtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3coIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCBjYW1lcmEgKTtcblxuXHRcdHZhciBjb21waWxlZCA9IHt9O1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBvYmplY3QubWF0ZXJpYWxbIGkgXS51dWlkIGluIGNvbXBpbGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbFsgaSBdLCBzY2VuZSwgb2JqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdGNvbXBpbGVkWyBvYmplY3QubWF0ZXJpYWxbIGkgXS51dWlkIF0gPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0Lm1hdGVyaWFsLnV1aWQgaW4gY29tcGlsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblx0XHRcdFx0XHRjb21waWxlZFsgb2JqZWN0Lm1hdGVyaWFsLnV1aWQgXSA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUgKSB7XG5cblx0XHRpZiAoIHhyLmlzUHJlc2VudGluZyApIHJldHVybjtcblx0XHRpZiAoIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayApIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayggdGltZSApO1xuXG5cdH1cblxuXHR2YXIgYW5pbWF0aW9uID0gbmV3IFdlYkdMQW5pbWF0aW9uKCk7XG5cdGFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKCBvbkFuaW1hdGlvbkZyYW1lICk7XG5cblx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIGFuaW1hdGlvbi5zZXRDb250ZXh0KCB3aW5kb3cgKTtcblxuXHR0aGlzLnNldEFuaW1hdGlvbkxvb3AgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0b25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cdFx0eHIuc2V0QW5pbWF0aW9uTG9vcCggY2FsbGJhY2sgKTtcblxuXHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyO1xuXG5cdFx0aWYgKCBhcmd1bWVudHNbIDIgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBhcmd1bWVudHNbIDIgXTtcblxuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzWyAzIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuJyApO1xuXHRcdFx0Zm9yY2VDbGVhciA9IGFyZ3VtZW50c1sgMyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAhICggY2FtZXJhICYmIGNhbWVyYS5pc0NhbWVyYSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggX2lzQ29udGV4dExvc3QgKSByZXR1cm47XG5cblx0XHQvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lXG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IG51bGw7XG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ucHJvZ3JhbSA9IG51bGw7XG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0aWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCB4ci5lbmFibGVkICYmIHhyLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0Y2FtZXJhID0geHIuZ2V0Q2FtZXJhKCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoKTtcblxuXHRcdHNjZW5lLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0IHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdF9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIDAsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdC5maW5pc2goKTtcblxuXHRcdGlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoIF9vcGFxdWVTb3J0LCBfdHJhbnNwYXJlbnRTb3J0ICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzaGFkb3dzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCApIHRoaXMuaW5mby5yZXNldCgpO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGJhY2tncm91bmQucmVuZGVyKCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApO1xuXG5cdFx0Ly8gcmVuZGVyIHNjZW5lXG5cblx0XHR2YXIgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTtcblx0XHR2YXIgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XG5cblx0XHRpZiAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3BhcXVlIHBhc3MgKGZyb250LXRvLWJhY2sgb3JkZXIpXG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRcdC8vIHRyYW5zcGFyZW50IHBhc3MgKGJhY2stdG8tZnJvbnQgb3JkZXIpXG5cblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHNjZW5lLm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmdcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0XHQvLyByZXNvbHZlIG11bHRpc2FtcGxlIHJlbmRlcmJ1ZmZlcnMgdG8gYSBzaW5nbGUtc2FtcGxlIHRleHR1cmUgaWYgbmVjZXNzYXJ5XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNsZWFyZWQgb24gbmV4dCByZW5kZXJcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggdHJ1ZSApO1xuXG5cdFx0c3RhdGUuc2V0UG9seWdvbk9mZnNldCggZmFsc2UgKTtcblxuXHRcdC8vIF9nbC5maW5pc2goKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIGdyb3VwT3JkZXIsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0dyb3VwICkge1xuXG5cdFx0XHRcdGdyb3VwT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xPRCApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5hdXRvVXBkYXRlID09PSB0cnVlICkgb2JqZWN0LnVwZGF0ZSggY2FtZXJhICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmplY3QubWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xuXG5cdFx0XHRcdFx0Ly8gdXBkYXRlIHNrZWxldG9uIG9ubHkgb25jZSBpbiBhIGZyYW1lXG5cblx0XHRcdFx0XHRpZiAoIG9iamVjdC5za2VsZXRvbi5mcmFtZSAhPT0gaW5mby5yZW5kZXIuZnJhbWUgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi5mcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XG5cdFx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yMy56LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgZ3JvdXBPcmRlciwgc29ydE9iamVjdHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07XG5cblx0XHRcdHZhciBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDtcblx0XHRcdHZhciBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSB1bmRlZmluZWQgPyByZW5kZXJJdGVtLm1hdGVyaWFsIDogb3ZlcnJpZGVNYXRlcmlhbDtcblx0XHRcdHZhciBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XG5cblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IGNhbWVyYTtcblxuXHRcdFx0XHR2YXIgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbWVyYTIgPSBjYW1lcmFzWyBqIF07XG5cblx0XHRcdFx0XHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhMi5sYXllcnMgKSApIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggY2FtZXJhMi52aWV3cG9ydCApICk7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhMiApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdFx0c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLmdlb21ldHJ5ID0gbnVsbDtcblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLnByb2dyYW0gPSBudWxsO1xuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ud2lyZWZyYW1lID0gZmFsc2U7XG5cblx0XHRcdHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHR2YXIgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblx0XHR2YXIgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHZhciBsaWdodHNTdGF0ZVZlcnNpb24gPSBsaWdodHMuc3RhdGUudmVyc2lvbjtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgc2NlbmUsIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXHRcdHZhciBwcm9ncmFtQ2FjaGVLZXkgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNhY2hlS2V5KCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY2FjaGVLZXkgIT09IHByb2dyYW1DYWNoZUtleSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uICE9PSBsaWdodHNTdGF0ZVZlcnNpb24gKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNTdGF0ZVZlcnNpb24gPSBsaWdodHNTdGF0ZVZlcnNpb247XG5cblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHJldHVybjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9ubHkgcmVidWlsZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbUNoYW5nZSApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggcGFyYW1ldGVycywgcHJvZ3JhbUNhY2hlS2V5ICk7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcyA9IHBhcmFtZXRlcnMudW5pZm9ybXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dEVuY29kaW5nID0gX3RoaXMub3V0cHV0RW5jb2Rpbmc7XG5cdFx0XHRtYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdH1cblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaE5vcm1hbCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcblxuXHRcdGlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmXG5cdFx0XHQhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzO1xuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb247XG5cdFx0XHR1bmlmb3Jtcy5jbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy51bmlmb3JtO1xuXG5cdFx0fVxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyA9IHNjZW5lLmZvZztcblxuXHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyA9IG1hdGVyaWFsTmVlZHNMaWdodHMoIG1hdGVyaWFsICk7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUudmFsdWUgPSBsaWdodHMuc3RhdGUucHJvYmU7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pO1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDtcblx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcblxuXHRcdH1cblxuXHRcdHZhciBwcm9nVW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0dW5pZm9ybXNMaXN0ID1cblx0XHRcdFx0V2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUoIHByb2dVbmlmb3Jtcy5zZXEsIHVuaWZvcm1zICk7XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gdW5pZm9ybXNMaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLCBtYXRlcmlhbCwgb2JqZWN0ICkge1xuXG5cdFx0dGV4dHVyZXMucmVzZXRUZXh0dXJlVW5pdHMoKTtcblxuXHRcdHZhciBmb2cgPSBzY2VuZS5mb2c7XG5cdFx0dmFyIGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcblxuXHRcdHZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblx0XHR2YXIgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIHtcblxuXHRcdFx0aWYgKCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0XHR2YXIgdXNlQ2FjaGUgPVxuXHRcdFx0XHRcdGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiZcblx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xuXG5cdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXG5cdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXG5cdFx0XHRcdC8vICgjODQ2NSwgIzgzNzkpXG5cdFx0XHRcdF9jbGlwcGluZy5zZXRTdGF0ZShcblx0XHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcywgbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbiwgbWF0ZXJpYWwuY2xpcFNoYWRvd3MsXG5cdFx0XHRcdFx0Y2FtZXJhLCBtYXRlcmlhbFByb3BlcnRpZXMsIHVzZUNhY2hlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwudmVyc2lvbiA9PT0gbWF0ZXJpYWxQcm9wZXJ0aWVzLl9fdmVyc2lvbiApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCAhPT0gZW52aXJvbm1lbnQgKSB7XG5cblx0XHRcdFx0aW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgJiYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uICE9PSBsaWdodHMuc3RhdGUudmVyc2lvbiApICkge1xuXG5cdFx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IF9jbGlwcGluZy5udW1QbGFuZXMgfHxcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkge1xuXG5cdFx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dEVuY29kaW5nICE9PSBfdGhpcy5vdXRwdXRFbmNvZGluZyApIHtcblxuXHRcdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3ZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLFxuXHRcdFx0cF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdG1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXM7XG5cblx0XHRpZiAoIHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0ucHJvZ3JhbSApICkge1xuXG5cdFx0XHRyZWZyZXNoUHJvZ3JhbSA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7XG5cblx0XHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IG1hdGVyaWFsLmlkO1xuXG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoUHJvZ3JhbSB8fCBfY3VycmVudENhbWVyYSAhPT0gY2FtZXJhICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJyxcblx0XHRcdFx0XHQyLjAgLyAoIE1hdGgubG9nKCBjYW1lcmEuZmFyICsgMS4wICkgLyBNYXRoLkxOMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBfY3VycmVudENhbWVyYSAhPT0gY2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50Q2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0XHRcdC8vIGxpZ2h0aW5nIHVuaWZvcm1zIGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlXG5cdFx0XHRcdC8vIG5vdywgaW4gY2FzZSB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGxpZ2h0cyAtIG9yIGxhdGVyLCB3aGVuXG5cdFx0XHRcdC8vIHRoZSBuZXh0IG1hdGVyaWFsIHRoYXQgZG9lcyBnZXRzIGFjdGl2YXRlZDpcblxuXHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1x0XHQvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2Vcblx0XHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XHRcdC8vIHJlbWFpbnMgc2V0IHVudGlsIHVwZGF0ZSBkb25lXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbG9hZCBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3Jtc1xuXHRcdFx0Ly8gKHNoYWRlciBtYXRlcmlhbCBhbHNvIGdldHMgdGhlbSBmb3IgdGhlIHNha2Ugb2YgZ2VuZXJpY2l0eSlcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHRcdHZhciB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247XG5cblx0XHRcdFx0aWYgKCB1Q2FtUG9zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR1Q2FtUG9zLnNldFZhbHVlKCBfZ2wsXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2lzT3J0aG9ncmFwaGljJywgY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhID09PSB0cnVlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gb3RoZXJ3aXNlIHRleHR1cmVzIHVzZWQgZm9yIHNraW5uaW5nIGNhbiB0YWtlIG92ZXIgdGV4dHVyZSB1bml0cyByZXNlcnZlZCBmb3Igb3RoZXIgbWF0ZXJpYWwgdGV4dHVyZXNcblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblxuXHRcdFx0aWYgKCBza2VsZXRvbiApIHtcblxuXHRcdFx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXG5cdFx0XHRcdFx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXG5cdFx0XHRcdFx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IGJvbmVzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcblx0XHRcdFx0XHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxuXG5cblx0XHRcdFx0XHRcdHZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoVXRpbHMuY2VpbFBvd2VyT2ZUd28oIHNpemUgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSwgdGV4dHVyZXMgKTtcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaE1hdGVyaWFsIHx8IG1hdGVyaWFsUHJvcGVydGllcy5yZWNlaXZlU2hhZG93ICE9PSBvYmplY3QucmVjZWl2ZVNoYWRvdyApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgPSBvYmplY3QucmVjZWl2ZVNoYWRvdztcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3JlY2VpdmVTaGFkb3cnLCBvYmplY3QucmVjZWl2ZVNoYWRvdyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zVG9vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwsIGVudmlyb25tZW50ICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaHlzaWNhbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsLCBlbnZpcm9ubWVudCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwsIGVudmlyb25tZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hNYXRjYXBNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc01hdGNhcCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTm9ybWFsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xuXG5cdFx0XHRcdG1fdW5pZm9ybXMuY29sb3IudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcblx0XHRcdFx0bV91bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWN0QXJlYUxpZ2h0IFRleHR1cmVcblx0XHRcdC8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvblxuXG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjXzEgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjXzEudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfMTtcblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMiAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18yO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7IC8vICMxNTU4MVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU3ByaXRlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2NlbnRlcicsIG9iamVjdC5jZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbW1vbiBtYXRyaWNlc1xuXG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxWaWV3TWF0cml4Jywgb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbE1hdHJpeCcsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdC8vIFVuaWZvcm1zIChyZWZyZXNoIHVuaWZvcm1zIG9iamVjdHMpXG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwsIGVudmlyb25tZW50ICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGVudk1hcCA9IG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudDtcblxuXHRcdGlmICggZW52TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBlbnZNYXA7XG5cblx0XHRcdHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSBlbnZNYXAuaXNDdWJlVGV4dHVyZSA/IC0gMSA6IDE7XG5cblx0XHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcblx0XHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcblxuXHRcdFx0dW5pZm9ybXMubWF4TWlwTGV2ZWwudmFsdWUgPSBwcm9wZXJ0aWVzLmdldCggZW52TWFwICkuX19tYXhNaXBMZXZlbDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcblx0XHRcdHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBzcGVjdWxhciBtYXBcblx0XHQvLyAzLiBub3JtYWwgbWFwXG5cdFx0Ly8gNC4gYnVtcCBtYXBcblx0XHQvLyA1LiBhbHBoYSBtYXBcblx0XHQvLyA2LiBlbWlzc2l2ZSBtYXBcblxuXHRcdHZhciB1dlNjYWxlTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcCA9IHV2U2NhbGVNYXAudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIHV2U2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXMgZm9yIHV2MlxuXHRcdC8vIDEuIGFvIG1hcFxuXHRcdC8vIDIuIGxpZ2h0IG1hcFxuXG5cdFx0dmFyIHV2MlNjYWxlTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dXYyU2NhbGVNYXAgPSBtYXRlcmlhbC5hb01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1djJTY2FsZU1hcCA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1djJTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0aWYgKCB1djJTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2MlNjYWxlTWFwID0gdXYyU2NhbGVNYXAudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2MlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXYyU2NhbGVNYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXYyVHJhbnNmb3JtLnZhbHVlLmNvcHkoIHV2MlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBhbHBoYSBtYXBcblxuXHRcdHZhciB1dlNjYWxlTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdXZTY2FsZU1hcC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggdXZTY2FsZU1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3ByaXRlcyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnJvdGF0aW9uLnZhbHVlID0gbWF0ZXJpYWwucm90YXRpb247XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllc1xuXHRcdC8vIDEuIGNvbG9yIG1hcFxuXHRcdC8vIDIuIGFscGhhIG1hcFxuXG5cdFx0dmFyIHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNGb2coIHVuaWZvcm1zLCBmb2cgKSB7XG5cblx0XHR1bmlmb3Jtcy5mb2dDb2xvci52YWx1ZS5jb3B5KCBmb2cuY29sb3IgKTtcblxuXHRcdGlmICggZm9nLmlzRm9nICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7XG5cdFx0XHR1bmlmb3Jtcy5mb2dGYXIudmFsdWUgPSBmb2cuZmFyO1xuXG5cdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nRGVuc2l0eS52YWx1ZSA9IGZvZy5kZW5zaXR5O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuc3BlY3VsYXIudmFsdWUuY29weSggbWF0ZXJpYWwuc3BlY3VsYXIgKTtcblx0XHR1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heCggbWF0ZXJpYWwuc2hpbmluZXNzLCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApXG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5zcGVjdWxhciApO1xuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsLCBlbnZpcm9ubWVudCApIHtcblxuXHRcdHVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzcztcblx0XHR1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1ldGFsbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudCApIHtcblxuXHRcdFx0Ly91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwsIGVudmlyb25tZW50ICkge1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCwgZW52aXJvbm1lbnQgKTtcblxuXHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTsgLy8gYWxzbyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxuXG5cdFx0dW5pZm9ybXMuY2xlYXJjb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0O1xuXHRcdHVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcztcblx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuICkgdW5pZm9ybXMuc2hlZW4udmFsdWUuY29weSggbWF0ZXJpYWwuc2hlZW4gKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXRNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnRyYW5zcGFyZW5jeS52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zcGFyZW5jeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTWF0Y2FwKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hdGNhcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWF0Y2FwLnZhbHVlID0gbWF0ZXJpYWwubWF0Y2FwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEZXB0aCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHR1bmlmb3Jtcy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KCBtYXRlcmlhbC5yZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRcdHVuaWZvcm1zLm5lYXJEaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLm5lYXJEaXN0YW5jZTtcblx0XHR1bmlmb3Jtcy5mYXJEaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLmZhckRpc3RhbmNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNOb3JtYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gbWF0ZXJpYWxOZWVkc0xpZ2h0cyggbWF0ZXJpYWwgKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCB8fCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgfHxcblx0XHRcdCggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJiBtYXRlcmlhbC5saWdodHMgPT09IHRydWUgKTtcblxuXHR9XG5cblx0Ly9cblx0dGhpcy5zZXRGcmFtZWJ1ZmZlciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIF9mcmFtZWJ1ZmZlciAhPT0gdmFsdWUgJiYgX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgKSBfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgdmFsdWUgKTtcblxuXHRcdF9mcmFtZWJ1ZmZlciA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5nZXRBY3RpdmVDdWJlRmFjZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudEFjdGl2ZUN1YmVGYWNlO1xuXG5cdH07XG5cblx0dGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsO1xuXG5cdH07XG5cblx0dGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7XG5cblx0fTtcblxuXHR0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBhY3RpdmVDdWJlRmFjZSwgYWN0aXZlTWlwbWFwTGV2ZWwgKSB7XG5cblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcblx0XHRfY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gYWN0aXZlQ3ViZUZhY2U7XG5cdFx0X2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBfZnJhbWVidWZmZXI7XG5cdFx0dmFyIGlzQ3ViZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHZhciBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2UgfHwgMCBdO1xuXHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3cG9ydCApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIHJlbmRlclRhcmdldC5zY2lzc29yICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9jdXJyZW50RnJhbWVidWZmZXIgIT09IGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblx0XHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggMzYxNjAsIDM2MDY0LCAzNDA2OSArICggYWN0aXZlQ3ViZUZhY2UgfHwgMCApLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwgfHwgMCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciwgYWN0aXZlQ3ViZUZhY2VJbmRleCApIHtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCAmJiBhY3RpdmVDdWJlRmFjZUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXJbIGFjdGl2ZUN1YmVGYWNlSW5kZXggXTtcblxuXHRcdH1cblxuXHRcdGlmICggZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdHZhciByZXN0b3JlID0gZmFsc2U7XG5cblx0XHRcdGlmICggZnJhbWVidWZmZXIgIT09IF9jdXJyZW50RnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0cmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdFx0XHR2YXIgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHR2YXIgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggMzU3MzkgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIDM1NzM4ICkgJiYgLy8gSUUxMSwgRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBIYWxmRmxvYXRUeXBlICYmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApIDogZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCAzNjE2MCApID09PSAzNjA1MyApIHtcblxuXHRcdFx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVuc3VyZXMgdmFsaWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAjODYwNClcblxuXHRcdFx0XHRcdGlmICggKCB4ID49IDAgJiYgeCA8PSAoIHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICkgKSAmJiAoIHkgPj0gMCAmJiB5IDw9ICggcmVuZGVyVGFyZ2V0LmhlaWdodCAtIGhlaWdodCApICkgKSB7XG5cblx0XHRcdFx0XHRcdF9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlRm9ybWF0ICksIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICksIGJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZmluYWxseSB7XG5cblx0XHRcdFx0aWYgKCByZXN0b3JlICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHRpZiAoIGxldmVsID09PSB1bmRlZmluZWQgKSBsZXZlbCA9IDA7XG5cblx0XHR2YXIgbGV2ZWxTY2FsZSA9IE1hdGgucG93KCAyLCAtIGxldmVsICk7XG5cdFx0dmFyIHdpZHRoID0gTWF0aC5mbG9vciggdGV4dHVyZS5pbWFnZS53aWR0aCAqIGxldmVsU2NhbGUgKTtcblx0XHR2YXIgaGVpZ2h0ID0gTWF0aC5mbG9vciggdGV4dHVyZS5pbWFnZS5oZWlnaHQgKiBsZXZlbFNjYWxlICk7XG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKTtcblxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xuXG5cdFx0X2dsLmNvcHlUZXhJbWFnZTJEKCAzNTUzLCBsZXZlbCwgZ2xGb3JtYXQsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIDAgKTtcblxuXHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcblxuXHR9O1xuXG5cdHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBsZXZlbCApIHtcblxuXHRcdHZhciB3aWR0aCA9IHNyY1RleHR1cmUuaW1hZ2Uud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHNyY1RleHR1cmUuaW1hZ2UuaGVpZ2h0O1xuXHRcdHZhciBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUudHlwZSApO1xuXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHNyY1RleHR1cmUuaW1hZ2UuZGF0YSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIGdsRm9ybWF0LCBnbFR5cGUsIHNyY1RleHR1cmUuaW1hZ2UgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcblxuXHR9O1xuXG5cdHRoaXMuaW5pdFRleHR1cmUgPSBmdW5jdGlvbiAoIHRleHR1cmUgKSB7XG5cblx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcblxuXHR9O1xuXG5cdGlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nRXhwMiggY29sb3IsIGRlbnNpdHkgKSB7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0dGhpcy5kZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkgOiAwLjAwMDI1O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvZ0V4cDIucHJvdG90eXBlLCB7XG5cblx0aXNGb2dFeHAyOiB0cnVlLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IsIHRoaXMuZGVuc2l0eSApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0XHRkZW5zaXR5OiB0aGlzLmRlbnNpdHlcblx0XHR9O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvZy5wcm90b3R5cGUsIHtcblxuXHRpc0ZvZzogdHJ1ZSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IsIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6ICdGb2cnLFxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0XHRuZWFyOiB0aGlzLm5lYXIsXG5cdFx0XHRmYXI6IHRoaXMuZmFyXG5cdFx0fTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcblx0dGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0b25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VXNhZ2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxudmFyIF92ZWN0b3IkNiA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgaXRlbVNpemUsIG9mZnNldCwgbm9ybWFsaXplZCApIHtcblxuXHR0aGlzLmRhdGEgPSBpbnRlcmxlYXZlZEJ1ZmZlcjtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLm9mZnNldCA9IG9mZnNldDtcblxuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRjb3VudDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuY291bnQ7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhcnJheToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmRhdGEuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDYueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ2LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkNi5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkNi54LCBfdmVjdG9yJDYueSwgX3ZlY3RvciQ2LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIHJvdGF0aW9uOiA8ZmxvYXQ+LFxuICogIHNpemVBdHRlbnVhdGlvbjogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGVNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlO1xuXG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcHJpdGVNYXRlcmlhbDtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBfZ2VvbWV0cnk7XG5cbnZhciBfaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xudmFyIF93b3JsZFNjYWxlID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfbXZQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cbnZhciBfYWxpZ25lZFBvc2l0aW9uID0gbmV3IFZlY3RvcjIoKTtcbnZhciBfcm90YXRlZFBvc2l0aW9uID0gbmV3IFZlY3RvcjIoKTtcbnZhciBfdmlld1dvcmxkTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxudmFyIF92QSQxID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfdkIkMSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3ZDJDEgPSBuZXcgVmVjdG9yMygpO1xuXG52YXIgX3V2QSQxID0gbmV3IFZlY3RvcjIoKTtcbnZhciBfdXZCJDEgPSBuZXcgVmVjdG9yMigpO1xudmFyIF91dkMkMSA9IG5ldyBWZWN0b3IyKCk7XG5cbmZ1bmN0aW9uIFNwcml0ZSggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGUnO1xuXG5cdGlmICggX2dlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRfZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsIDAsXG5cdFx0XHQwLjUsIC0gMC41LCAwLCAxLCAwLFxuXHRcdFx0MC41LCAwLjUsIDAsIDEsIDEsXG5cdFx0XHQtIDAuNSwgMC41LCAwLCAwLCAxXG5cdFx0XSApO1xuXG5cdFx0dmFyIGludGVybGVhdmVkQnVmZmVyID0gbmV3IEludGVybGVhdmVkQnVmZmVyKCBmbG9hdDMyQXJyYXksIDUgKTtcblxuXHRcdF9nZW9tZXRyeS5zZXRJbmRleCggWyAwLCAxLCAyLFx0MCwgMiwgMyBdICk7XG5cdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMywgMCwgZmFsc2UgKSApO1xuXHRcdF9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIDIsIDMsIGZhbHNlICkgKTtcblxuXHR9XG5cblx0dGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTtcblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRpZiAoIHJheWNhc3Rlci5jYW1lcmEgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcHJpdGU6IFwiUmF5Y2FzdGVyLmNhbWVyYVwiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nICk7XG5cblx0XHR9XG5cblx0XHRfd29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdF92aWV3V29ybGRNYXRyaXguY29weSggcmF5Y2FzdGVyLmNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRfbXZQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubW9kZWxWaWV3TWF0cml4ICk7XG5cblx0XHRpZiAoIHJheWNhc3Rlci5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSAmJiB0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdF93b3JsZFNjYWxlLm11bHRpcGx5U2NhbGFyKCAtIF9tdlBvc2l0aW9uLnogKTtcblxuXHRcdH1cblxuXHRcdHZhciByb3RhdGlvbiA9IHRoaXMubWF0ZXJpYWwucm90YXRpb247XG5cdFx0dmFyIHNpbiwgY29zO1xuXHRcdGlmICggcm90YXRpb24gIT09IDAgKSB7XG5cblx0XHRcdGNvcyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xuXHRcdFx0c2luID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR2YXIgY2VudGVyID0gdGhpcy5jZW50ZXI7XG5cblx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIF92QSQxLnNldCggLSAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZCJDEuc2V0KCAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZDJDEuc2V0KCAwLjUsIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcblxuXHRcdF91dkEkMS5zZXQoIDAsIDAgKTtcblx0XHRfdXZCJDEuc2V0KCAxLCAwICk7XG5cdFx0X3V2QyQxLnNldCggMSwgMSApO1xuXG5cdFx0Ly8gY2hlY2sgZmlyc3QgdHJpYW5nbGVcblx0XHR2YXIgaW50ZXJzZWN0ID0gcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RUcmlhbmdsZSggX3ZBJDEsIF92QiQxLCBfdkMkMSwgZmFsc2UsIF9pbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGNoZWNrIHNlY29uZCB0cmlhbmdsZVxuXHRcdFx0dHJhbnNmb3JtVmVydGV4KCBfdkIkMS5zZXQoIC0gMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cdFx0XHRfdXZCJDEuc2V0KCAwLCAxICk7XG5cblx0XHRcdGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSQxLCBfdkMkMSwgX3ZCJDEsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdFBvaW50ICk7XG5cblx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xuXG5cdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdHBvaW50OiBfaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdHV2OiBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdFBvaW50LCBfdkEkMSwgX3ZCJDEsIF92QyQxLCBfdXZBJDEsIF91dkIkMSwgX3V2QyQxLCBuZXcgVmVjdG9yMigpICksXG5cdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdGlmICggc291cmNlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cbn0gKTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVmVydGV4KCB2ZXJ0ZXhQb3NpdGlvbiwgbXZQb3NpdGlvbiwgY2VudGVyLCBzY2FsZSwgc2luLCBjb3MgKSB7XG5cblx0Ly8gY29tcHV0ZSBwb3NpdGlvbiBpbiBjYW1lcmEgc3BhY2Vcblx0X2FsaWduZWRQb3NpdGlvbi5zdWJWZWN0b3JzKCB2ZXJ0ZXhQb3NpdGlvbiwgY2VudGVyICkuYWRkU2NhbGFyKCAwLjUgKS5tdWx0aXBseSggc2NhbGUgKTtcblxuXHQvLyB0byBjaGVjayBpZiByb3RhdGlvbiBpcyBub3QgemVyb1xuXHRpZiAoIHNpbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0X3JvdGF0ZWRQb3NpdGlvbi54ID0gKCBjb3MgKiBfYWxpZ25lZFBvc2l0aW9uLnggKSAtICggc2luICogX2FsaWduZWRQb3NpdGlvbi55ICk7XG5cdFx0X3JvdGF0ZWRQb3NpdGlvbi55ID0gKCBzaW4gKiBfYWxpZ25lZFBvc2l0aW9uLnggKSArICggY29zICogX2FsaWduZWRQb3NpdGlvbi55ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdF9yb3RhdGVkUG9zaXRpb24uY29weSggX2FsaWduZWRQb3NpdGlvbiApO1xuXG5cdH1cblxuXG5cdHZlcnRleFBvc2l0aW9uLmNvcHkoIG12UG9zaXRpb24gKTtcblx0dmVydGV4UG9zaXRpb24ueCArPSBfcm90YXRlZFBvc2l0aW9uLng7XG5cdHZlcnRleFBvc2l0aW9uLnkgKz0gX3JvdGF0ZWRQb3NpdGlvbi55O1xuXG5cdC8vIHRyYW5zZm9ybSB0byB3b3JsZCBzcGFjZVxuXHR2ZXJ0ZXhQb3NpdGlvbi5hcHBseU1hdHJpeDQoIF92aWV3V29ybGRNYXRyaXggKTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX3YxJDQgPSBuZXcgVmVjdG9yMygpO1xudmFyIF92MiQyID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTE9EKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLl9jdXJyZW50TGV2ZWwgPSAwO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5MT0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTE9ELFxuXG5cdGlzTE9EOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCBmYWxzZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHNvdXJjZS5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdHRoaXMuYWRkTGV2ZWwoIGxldmVsLm9iamVjdC5jbG9uZSgpLCBsZXZlbC5kaXN0YW5jZSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZExldmVsOiBmdW5jdGlvbiAoIG9iamVjdCwgZGlzdGFuY2UgKSB7XG5cblx0XHRpZiAoIGRpc3RhbmNlID09PSB1bmRlZmluZWQgKSBkaXN0YW5jZSA9IDA7XG5cblx0XHRkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXZlbHMuc3BsaWNlKCBsLCAwLCB7IGRpc3RhbmNlOiBkaXN0YW5jZSwgb2JqZWN0OiBvYmplY3QgfSApO1xuXG5cdFx0dGhpcy5hZGQoIG9iamVjdCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDdXJyZW50TGV2ZWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jdXJyZW50TGV2ZWw7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbGV2ZWxzWyBpIC0gMSBdLm9iamVjdDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRfdjEkNC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX3YxJDQgKTtcblxuXHRcdFx0dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRfdjEkNC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0X3YyJDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IF92MSQ0LmRpc3RhbmNlVG8oIF92MiQyICkgLyBjYW1lcmEuem9vbTtcblxuXHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY3VycmVudExldmVsID0gaSAtIDE7XG5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9VcGRhdGUgPT09IGZhbHNlICkgZGF0YS5vYmplY3QuYXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0ZGF0YS5vYmplY3QubGV2ZWxzID0gW107XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Ta2lubmVkTWVzaCBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnO1xuXG5cdHRoaXMuYmluZE1vZGUgPSAnYXR0YWNoZWQnO1xuXHR0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5Ta2lubmVkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNraW5uZWRNZXNoLFxuXG5cdGlzU2tpbm5lZE1lc2g6IHRydWUsXG5cblx0YmluZDogZnVuY3Rpb24gKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjtcblxuXHRcdGlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHRcdFx0YmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApO1xuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggYmluZE1hdHJpeCApO1xuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5za2VsZXRvbi5wb3NlKCk7XG5cblx0fSxcblxuXHRub3JtYWxpemVTa2luV2VpZ2h0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2tpbldlaWdodC5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZlY3Rvci54ID0gc2tpbldlaWdodC5nZXRYKCBpICk7XG5cdFx0XHR2ZWN0b3IueSA9IHNraW5XZWlnaHQuZ2V0WSggaSApO1xuXHRcdFx0dmVjdG9yLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdHZlY3Rvci53ID0gc2tpbldlaWdodC5nZXRXKCBpICk7XG5cblx0XHRcdHZhciBzY2FsZSA9IDEuMCAvIHZlY3Rvci5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XG5cblx0XHRcdFx0dmVjdG9yLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlY3Rvci5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcblxuXHRcdFx0fVxuXG5cdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIHZlY3Rvci53ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE1lc2gucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdhdHRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2RldGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJpbmRNYXRyaXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbnZhciBfb2Zmc2V0TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbnZhciBfaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBTa2VsZXRvbiggYm9uZXMsIGJvbmVJbnZlcnNlcyApIHtcblxuXHQvLyBjb3B5IHRoZSBib25lIGFycmF5XG5cblx0Ym9uZXMgPSBib25lcyB8fCBbXTtcblxuXHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcblx0dGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmJvbmVzLmxlbmd0aCAqIDE2ICk7XG5cblx0dGhpcy5mcmFtZSA9IC0gMTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdHZhciBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcblx0XHR2YXIgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdC8vIGZsYXR0ZW4gYm9uZSBtYXRyaWNlcyB0byBhcnJheVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHR2YXIgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBfaWRlbnRpdHlNYXRyaXg7XG5cblx0XHRcdF9vZmZzZXRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCBib25lSW52ZXJzZXNbIGkgXSApO1xuXHRcdFx0X29mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTtcblxuXHR9LFxuXG5cdGdldEJvbmVCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoICkge1xuXG5cdFx0aWYgKCB0aGlzLmJvbmVUZXh0dXJlICkge1xuXG5cdFx0XHR0aGlzLmJvbmVUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdFx0dGhpcy5ib25lVGV4dHVyZSA9IHVuZGVmaW5lZDtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIEJvbmUoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb25lJztcblxufVxuXG5Cb25lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvbmUsXG5cblx0aXNCb25lOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfaW5zdGFuY2VMb2NhbE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX2luc3RhbmNlV29ybGRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG52YXIgX2luc3RhbmNlSW50ZXJzZWN0cyA9IFtdO1xuXG52YXIgX21lc2ggPSBuZXcgTWVzaCgpO1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGNvdW50ICkge1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5pbnN0YW5jZU1hdHJpeCA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGNvdW50ICogMTYgKSwgMTYgKTtcblxuXHR0aGlzLmNvdW50ID0gY291bnQ7XG5cblx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7XG5cbn1cblxuSW5zdGFuY2VkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZE1lc2gsXG5cblx0aXNJbnN0YW5jZWRNZXNoOiB0cnVlLFxuXG5cdGdldE1hdHJpeEF0OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRtYXRyaXguZnJvbUFycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0dmFyIHJheWNhc3RUaW1lcyA9IHRoaXMuY291bnQ7XG5cblx0XHRfbWVzaC5nZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0X21lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuXG5cdFx0aWYgKCBfbWVzaC5tYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggdmFyIGluc3RhbmNlSWQgPSAwOyBpbnN0YW5jZUlkIDwgcmF5Y2FzdFRpbWVzOyBpbnN0YW5jZUlkICsrICkge1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHdvcmxkIG1hdHJpeCBmb3IgZWFjaCBpbnN0YW5jZVxuXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpbnN0YW5jZUlkLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xuXG5cdFx0XHRfaW5zdGFuY2VXb3JsZE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZCwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcblxuXHRcdFx0Ly8gdGhlIG1lc2ggcmVwcmVzZW50cyB0aGlzIHNpbmdsZSBpbnN0YW5jZVxuXG5cdFx0XHRfbWVzaC5tYXRyaXhXb3JsZCA9IF9pbnN0YW5jZVdvcmxkTWF0cml4O1xuXG5cdFx0XHRfbWVzaC5yYXljYXN0KCByYXljYXN0ZXIsIF9pbnN0YW5jZUludGVyc2VjdHMgKTtcblxuXHRcdFx0Ly8gcHJvY2VzcyB0aGUgcmVzdWx0IG9mIHJheWNhc3RcblxuXHRcdFx0aWYgKCBfaW5zdGFuY2VJbnRlcnNlY3RzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0X2luc3RhbmNlSW50ZXJzZWN0c1sgMCBdLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuXHRcdFx0XHRfaW5zdGFuY2VJbnRlcnNlY3RzWyAwIF0ub2JqZWN0ID0gdGhpcztcblxuXHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIF9pbnN0YW5jZUludGVyc2VjdHNbIDAgXSApO1xuXG5cdFx0XHRcdF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0c2V0TWF0cml4QXQ6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdG1hdHJpeC50b0FycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKiAgbGluZWNhcDogXCJyb3VuZFwiLFxuICogIGxpbmVqb2luOiBcInJvdW5kXCJcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBMaW5lQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVCYXNpY01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblx0dGhpcy5saW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy5saW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIF9zdGFydCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX2VuZCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX2ludmVyc2VNYXRyaXgkMSA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3JheSQxID0gbmV3IFJheSgpO1xudmFyIF9zcGhlcmUkMiA9IG5ldyBTcGhlcmUoKTtcblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXG5cdH1cblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmUnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCgpO1xuXG59XG5cbkxpbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZSxcblxuXHRpc0xpbmU6IHRydWUsXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gWyAwIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0X3N0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpIC0gMSApO1xuXHRcdFx0XHRcdF9lbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IF9zdGFydC5kaXN0YW5jZVRvKCBfZW5kICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRsaW5lRGlzdGFuY2VzWyAwIF0gPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSB2ZXJ0aWNlc1sgaSAtIDEgXS5kaXN0YW5jZVRvKCB2ZXJ0aWNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0dmFyIHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuTGluZS50aHJlc2hvbGQ7XG5cblx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUkMi5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdF9zcGhlcmUkMi5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cdFx0X3NwaGVyZSQyLnJhZGl1cyArPSB0aHJlc2hvbGQ7XG5cblx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQyICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdF9pbnZlcnNlTWF0cml4JDEuZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRfcmF5JDEuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXgkMSApO1xuXG5cdFx0dmFyIGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xuXHRcdHZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcblxuXHRcdHZhciB2U3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2RW5kID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgaW50ZXJSYXkgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGVwID0gKCB0aGlzICYmIHRoaXMuaXNMaW5lU2VnbWVudHMgKSA/IDIgOiAxO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBpbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0dmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdO1xuXG5cdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gX3JheSQxLmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBsb2NhbFRocmVzaG9sZFNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSApO1xuXHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICsgMyApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gbG9jYWxUaHJlc2hvbGRTcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuYlZlcnRpY2VzIC0gMTsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdHZhciBkaXN0U3EgPSBfcmF5JDEuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkgXSwgdmVydGljZXNbIGkgKyAxIF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRpZiAoIGRpc3RTcSA+IGxvY2FsVGhyZXNob2xkU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfc3RhcnQkMSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX2VuZCQxID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJztcblxufVxuXG5MaW5lU2VnbWVudHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lU2VnbWVudHMsXG5cblx0aXNMaW5lU2VnbWVudHM6IHRydWUsXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRfc3RhcnQkMS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXHRcdFx0XHRcdF9lbmQkMS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIF9zdGFydCQxLmRpc3RhbmNlVG8oIF9lbmQkMSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0X3N0YXJ0JDEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRfZW5kJDEuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgX3N0YXJ0JDEuZGlzdGFuY2VUbyggX2VuZCQxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICpcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5zaXplID0gc291cmNlLnNpemU7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG52YXIgX2ludmVyc2VNYXRyaXgkMiA9IG5ldyBNYXRyaXg0KCk7XG52YXIgX3JheSQyID0gbmV3IFJheSgpO1xudmFyIF9zcGhlcmUkMyA9IG5ldyBTcGhlcmUoKTtcbnZhciBfcG9zaXRpb24kMSA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoKTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0dmFyIHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtcblxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZSQzLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0X3NwaGVyZSQzLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRfc3BoZXJlJDMucmFkaXVzICs9IHRocmVzaG9sZDtcblxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlJDMgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvL1xuXG5cdFx0X2ludmVyc2VNYXRyaXgkMi5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdF9yYXkkMi5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCQyICk7XG5cblx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0dmFyIGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdF9wb3NpdGlvbiQxLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24kMSwgYSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRfcG9zaXRpb24kMS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdHRlc3RQb2ludCggX3Bvc2l0aW9uJDEsIGksIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRoaXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIG0sIG1sLCBuYW1lO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUG9pbnRzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXgsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIG9iamVjdCApIHtcblxuXHR2YXIgcmF5UG9pbnREaXN0YW5jZVNxID0gX3JheSQyLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRfcmF5JDIuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludCxcblx0XHRcdGluZGV4OiBpbmRleCxcblx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRvYmplY3Q6IG9iamVjdFxuXG5cdFx0fSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JGb3JtYXQ7XG5cblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IExpbmVhckZpbHRlcjtcblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZpZGVvVGV4dHVyZSxcblxuXHRpc1ZpZGVvVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDYW52YXNUZXh0dXJlKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW52YXNUZXh0dXJlO1xuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2xcbiAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5kZVxuICovXG5cbmZ1bmN0aW9uIERlcHRoVGV4dHVyZSggd2lkdGgsIGhlaWdodCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ICkge1xuXG5cdGZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogRGVwdGhGb3JtYXQ7XG5cblx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQnICk7XG5cblx0fVxuXG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLmdlbmVyYXRlTWlwbWFwc1x0PSBmYWxzZTtcblxufVxuXG5EZXB0aFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEZXB0aFRleHR1cmU7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdXaXJlZnJhbWVHZW9tZXRyeSc7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqLCBsLCBvLCBvbDtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cdHZhciB2ZXJ0ZXg7XG5cblx0Ly8gZGlmZmVyZW50IGxvZ2ljIGZvciBHZW9tZXRyeSBhbmQgQnVmZmVyR2VvbWV0cnlcblxuXHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZGdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlc1xuXHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0ZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdFx0dmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24sIGluZGljZXMsIGdyb3Vwcztcblx0XHR2YXIgZ3JvdXAsIHN0YXJ0LCBjb3VudDtcblx0XHR2YXIgaW5kZXgxLCBpbmRleDI7XG5cblx0XHR2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRncm91cHMgPSBbIHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xuXG5cdFx0XHRmb3IgKCBvID0gMCwgb2wgPSBncm91cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7XG5cblx0XHRcdFx0Z3JvdXAgPSBncm91cHNbIG8gXTtcblxuXHRcdFx0XHRzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlMSA9IGluZGljZXMuZ2V0WCggaSArIGogKTtcblx0XHRcdFx0XHRcdGVkZ2UyID0gaW5kaWNlcy5nZXRYKCBpICsgKCBqICsgMSApICUgMyApO1xuXHRcdFx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdFx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MSApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MiApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5XG5cblx0XHRcdHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSAoIHBvc2l0aW9uLmNvdW50IC8gMyApOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxuXHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxuXG5cdFx0XHRcdFx0aW5kZXgxID0gMyAqIGkgKyBqO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0aW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbldpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdpcmVmcmFtZUdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFBhcmFtZXRyaWMgU3VyZmFjZXMgR2VvbWV0cnlcbiAqIGJhc2VkIG9uIHRoZSBicmlsbGlhbnQgYXJ0aWNsZSBieSBAcHJpZGVvdXQgaHR0cHM6Ly9wcmlkZW91dC5uZXQvYmxvZy9vbGQvYmxvZy9pbmRleC5odG1sQHA9NDQuaHRtbFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdGlmICggZnVuYy5sZW5ndGggPCAzICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlBhcmFtZXRyaWNHZW9tZXRyeTogRnVuY3Rpb24gbXVzdCBub3cgbW9kaWZ5IGEgVmVjdG9yMyBhcyB0aGlyZCBwYXJhbWV0ZXIuJyApO1xuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0dmFyIHNsaWNlQ291bnQgPSBzbGljZXMgKyAxO1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHN0YWNrczsgaSArKyApIHtcblxuXHRcdHZhciB2ID0gaSAvIHN0YWNrcztcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBqIC8gc2xpY2VzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0ZnVuYyggdSwgdiwgcDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdC8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzXG5cblx0XHRcdGlmICggdSAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUgKyBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdiAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgKyBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVybnMgc3VyZmFjZSBub3JtYWxcblxuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIHYgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc3RhY2tzOyBpICsrICkge1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciBhID0gaSAqIHNsaWNlQ291bnQgKyBqO1xuXHRcdFx0dmFyIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGMgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgZCA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqO1xuXG5cdFx0XHQvLyBmYWNlcyBvbmUgYW5kIHR3b1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGNsb2Nrd29ya2dlZWsgLyBodHRwczovL2dpdGh1Yi5jb20vY2xvY2t3b3JrZ2Vla1xuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBvbHloZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uR2VvbWV0cnk7XG5cbi8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdGRldGFpbCA9IGRldGFpbCB8fCAwO1xuXG5cdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcblxuXHR2YXIgdmVydGV4QnVmZmVyID0gW107XG5cdHZhciB1dkJ1ZmZlciA9IFtdO1xuXG5cdC8vIHRoZSBzdWJkaXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGFcblxuXHRzdWJkaXZpZGUoIGRldGFpbCApO1xuXG5cdC8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1c1xuXG5cdGFwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXG5cdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0fVxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7XG5cblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMSBdID0gdmVydGV4Lnk7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2YXIgdSA9IGF6aW11dGgoIHZlcnRleCApIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR2YXIgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0fVxuXG5cdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0Y29ycmVjdFNlYW0oKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHQvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkge1xuXG5cdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0dmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2YXIgeDEgPSB1dkJ1ZmZlclsgaSArIDIgXTtcblx0XHRcdHZhciB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTtcblx0XHRcdHZhciBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApO1xuXG5cdFx0XHQvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5XG5cblx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7XG5cdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHtcblxuXHRcdHZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdO1xuXHRcdHZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTtcblx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHtcblxuXHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdGIuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAzIF0sIHZlcnRleEJ1ZmZlclsgaSArIDQgXSwgdmVydGV4QnVmZmVyWyBpICsgNSBdICk7XG5cdFx0XHRjLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApO1xuXG5cdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdHV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApO1xuXHRcdFx0dXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7XG5cblx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0dmFyIGF6aSA9IGF6aW11dGgoIGNlbnRyb2lkICk7XG5cblx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7XG5cblx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLlxuXG5cdGZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdH1cblxuXG5cdC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS5cblxuXHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7XG5cblx0fVxuXG59XG5cblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUZXRyYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDEsIDEsIFx0LSAxLCAtIDEsIDEsIFx0LSAxLCAxLCAtIDEsIFx0MSwgLSAxLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQyLCAxLCAwLCBcdDAsIDMsIDIsXHQxLCAzLCAwLFx0MiwgMywgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBPY3RhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25HZW9tZXRyeTtcblxuLy8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDAsIDAsIFx0LSAxLCAwLCAwLFx0MCwgMSwgMCxcblx0XHQwLCAtIDEsIDAsIFx0MCwgMCwgMSxcdDAsIDAsIC0gMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDAsIDIsIDQsXHQwLCA0LCAzLFx0MCwgMywgNSxcblx0XHQwLCA1LCAyLFx0MSwgMiwgNSxcdDEsIDUsIDMsXG5cdFx0MSwgMywgNCxcdDEsIDQsIDJcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBJY29zYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0LSAxLCB0LCAwLCBcdDEsIHQsIDAsIFx0LSAxLCAtIHQsIDAsIFx0MSwgLSB0LCAwLFxuXHRcdCAwLCAtIDEsIHQsIFx0MCwgMSwgdCxcdDAsIC0gMSwgLSB0LCBcdDAsIDEsIC0gdCxcblx0XHQgdCwgMCwgLSAxLCBcdHQsIDAsIDEsIFx0LSB0LCAwLCAtIDEsIFx0LSB0LCAwLCAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0IDAsIDExLCA1LCBcdDAsIDUsIDEsIFx0MCwgMSwgNywgXHQwLCA3LCAxMCwgXHQwLCAxMCwgMTEsXG5cdFx0IDEsIDUsIDksIFx0NSwgMTEsIDQsXHQxMSwgMTAsIDIsXHQxMCwgNywgNixcdDcsIDEsIDgsXG5cdFx0IDMsIDksIDQsIFx0MywgNCwgMixcdDMsIDIsIDYsXHQzLCA2LCA4LFx0MywgOCwgOSxcblx0XHQgNCwgOSwgNSwgXHQyLCA0LCAxMSxcdDYsIDIsIDEwLFx0OCwgNiwgNyxcdDksIDgsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgQWJlIFBhem9zIC8gaHR0cHM6Ly9oYW1vaWQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIERvZGVjYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXHR2YXIgciA9IDEgLyB0O1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblxuXHRcdC8vICjCsTEsIMKxMSwgwrExKVxuXHRcdC0gMSwgLSAxLCAtIDEsXHQtIDEsIC0gMSwgMSxcblx0XHQtIDEsIDEsIC0gMSwgLSAxLCAxLCAxLFxuXHRcdDEsIC0gMSwgLSAxLCAxLCAtIDEsIDEsXG5cdFx0MSwgMSwgLSAxLCAxLCAxLCAxLFxuXG5cdFx0Ly8gKDAsIMKxMS/PhiwgwrHPhilcblx0XHQgMCwgLSByLCAtIHQsIDAsIC0gciwgdCxcblx0XHQgMCwgciwgLSB0LCAwLCByLCB0LFxuXG5cdFx0Ly8gKMKxMS/PhiwgwrHPhiwgMClcblx0XHQtIHIsIC0gdCwgMCwgLSByLCB0LCAwLFxuXHRcdCByLCAtIHQsIDAsIHIsIHQsIDAsXG5cblx0XHQvLyAowrHPhiwgMCwgwrExL8+GKVxuXHRcdC0gdCwgMCwgLSByLCB0LCAwLCAtIHIsXG5cdFx0LSB0LCAwLCByLCB0LCAwLCByXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MywgMTEsIDcsIFx0MywgNywgMTUsIFx0MywgMTUsIDEzLFxuXHRcdDcsIDE5LCAxNywgXHQ3LCAxNywgNiwgXHQ3LCA2LCAxNSxcblx0XHQxNywgNCwgOCwgXHQxNywgOCwgMTAsIFx0MTcsIDEwLCA2LFxuXHRcdDgsIDAsIDE2LCBcdDgsIDE2LCAyLCBcdDgsIDIsIDEwLFxuXHRcdDAsIDEyLCAxLCBcdDAsIDEsIDE4LCBcdDAsIDE4LCAxNixcblx0XHQ2LCAxMCwgMiwgXHQ2LCAyLCAxMywgXHQ2LCAxMywgMTUsXG5cdFx0MiwgMTYsIDE4LCBcdDIsIDE4LCAzLCBcdDIsIDMsIDEzLFxuXHRcdDE4LCAxLCA5LCBcdDE4LCA5LCAxMSwgXHQxOCwgMTEsIDMsXG5cdFx0NCwgMTQsIDEyLCBcdDQsIDEyLCAwLCBcdDQsIDAsIDgsXG5cdFx0MTEsIDksIDUsIFx0MTEsIDUsIDE5LCBcdDExLCAxOSwgNyxcblx0XHQxOSwgNSwgMTQsIFx0MTksIDE0LCA0LCBcdDE5LCA0LCAxNyxcblx0XHQxLCAxMiwgMTQsIFx0MSwgMTQsIDUsIFx0MSwgNSwgOVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlIC8gaHR0cHM6Ly9naXRodWIuY29tL29vc21veGllY29kZVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgbWluaW5nb2xkIC8gaHR0cHM6Ly9naXRodWIuY29tL21pbmluZ29sZFxuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cHM6Ly9naXRodWIuY29tL2pvbm9icjFcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICovXG5cbi8vIFR1YmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkLCB0YXBlciApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0aWYgKCB0YXBlciAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR2YXIgYnVmZmVyR2VvbWV0cnkgPSBuZXcgVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gYnVmZmVyR2VvbWV0cnkudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5Lm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkuYmlub3JtYWxzO1xuXG5cdC8vIGNyZWF0ZSBnZW9tZXRyeVxuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBidWZmZXJHZW9tZXRyeSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UdWJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUdlb21ldHJ5O1xuXG4vLyBUdWJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0dHVidWxhclNlZ21lbnRzID0gdHVidWxhclNlZ21lbnRzIHx8IDY0O1xuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0cmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cyB8fCA4O1xuXHRjbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7XG5cblx0dmFyIGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGZyYW1lcy50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gZnJhbWVzLm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgUCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGksIGo7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblx0dmFyIGluZGljZXMgPSBbXTtcblxuXHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcblxuXHRnZW5lcmF0ZUJ1ZmZlckRhdGEoKTtcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVCdWZmZXJEYXRhKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBsYXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFsc1xuXHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXG5cdFx0Ly9cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKVxuXG5cdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcblxuXHRcdC8vIHV2cyBhcmUgZ2VuZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uXG5cdFx0Ly8gdGhpcyBtYWtlcyBpdCBlYXN5IGNvbXB1dGUgY29ycmVjdCB2YWx1ZXMgZm9yIGNsb3NlZCBnZW9tZXRyaWVzXG5cblx0XHRnZW5lcmF0ZVVWcygpO1xuXG5cdFx0Ly8gZmluYWxseSBjcmVhdGUgZmFjZXNcblxuXHRcdGdlbmVyYXRlSW5kaWNlcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNlZ21lbnQoIGkgKSB7XG5cblx0XHQvLyB3ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9tIHRoZSBnaXZlbiBwYXRoXG5cblx0XHRQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7XG5cblx0XHQvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBhbmQgYmlub3JtYWxcblxuXHRcdHZhciBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcblx0XHR2YXIgQiA9IGZyYW1lcy5iaW5vcm1hbHNbIGkgXTtcblxuXHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0dmFyIHNpbiA9IE1hdGguc2luKCB2ICk7XG5cdFx0XHR2YXIgY29zID0gLSBNYXRoLmNvcyggdiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnggPSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApO1xuXHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xuXHRcdFx0bm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIueiApO1xuXHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xuXHRcdFx0dmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUluZGljZXMoKSB7XG5cblx0XHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHRcdHZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xuXHRcdFx0XHR1di55ID0gaiAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn1cblxuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVCdWZmZXJHZW9tZXRyeTtcblxuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBhdGggPSB0aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBiYXNlZCBvbiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcHF0b3J1cy9cbiAqL1xuXG4vLyBUb3J1c0tub3RHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0aWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4vLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0dHViZSA9IHR1YmUgfHwgMC40O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHAgPSBwIHx8IDI7XG5cdHEgPSBxIHx8IDM7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgUDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBCID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFQgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgTiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50XG5cblx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHQvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC5cblx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXG5cblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcblxuXHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Ti5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHRCLmNyb3NzVmVjdG9ycyggVCwgTiApO1xuXHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHQvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0XG5cblx0XHRCLm5vcm1hbGl6ZSgpO1xuXHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXG5cdFx0XHQvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS5cblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblx0XHRcdHZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHR2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0Ly8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRydXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9zLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcblxuXHRcdFx0dmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdHZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHtcblxuXHRcdHZhciBjdSA9IE1hdGguY29zKCB1ICk7XG5cdFx0dmFyIHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHR2YXIgcXVPdmVyUCA9IHEgLyBwICogdTtcblx0XHR2YXIgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApO1xuXG5cdFx0cG9zaXRpb24ueCA9IHJhZGl1cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTtcblx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41O1xuXG5cdH1cblxufVxuXG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUb3J1c0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRvcnVzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzR2VvbWV0cnk7XG5cbi8vIFRvcnVzQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0dHViZSA9IHR1YmUgfHwgMC40O1xuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjtcblx0YXJjID0gYXJjIHx8IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjO1xuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdHZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdGNlbnRlci54ID0gcmFkaXVzICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdGNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdHZhciBhID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7XG5cdFx0XHR2YXIgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XG5cdFx0XHR2YXIgYyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblx0XHRcdHZhciBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIFBvcnQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dCAodjIuMS41KVxuICovXG5cbnZhciBFYXJjdXQgPSB7XG5cblx0dHJpYW5ndWxhdGU6IGZ1bmN0aW9uICggZGF0YSwgaG9sZUluZGljZXMsIGRpbSApIHtcblxuXHRcdGRpbSA9IGRpbSB8fCAyO1xuXG5cdFx0dmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuXHRcdFx0b3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWyAwIF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcblx0XHRcdG91dGVyTm9kZSA9IGxpbmtlZExpc3QoIGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUgKSxcblx0XHRcdHRyaWFuZ2xlcyA9IFtdO1xuXG5cdFx0aWYgKCAhIG91dGVyTm9kZSB8fCBvdXRlck5vZGUubmV4dCA9PT0gb3V0ZXJOb2RlLnByZXYgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cdFx0aWYgKCBkYXRhLmxlbmd0aCA+IDgwICogZGltICkge1xuXG5cdFx0XHRtaW5YID0gbWF4WCA9IGRhdGFbIDAgXTtcblx0XHRcdG1pblkgPSBtYXhZID0gZGF0YVsgMSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSApIHtcblxuXHRcdFx0XHR4ID0gZGF0YVsgaSBdO1xuXHRcdFx0XHR5ID0gZGF0YVsgaSArIDEgXTtcblx0XHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG1pblgsIG1pblkgYW5kIGludlNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uXG5cdFx0XHRpbnZTaXplID0gTWF0aC5tYXgoIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSApO1xuXHRcdFx0aW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7XG5cblx0XHR9XG5cblx0XHRlYXJjdXRMaW5rZWQoIG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHRcdHJldHVybiB0cmlhbmdsZXM7XG5cblx0fVxuXG59O1xuXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoIHN0YXJ0LCBlbmQgKSB7XG5cblx0aWYgKCAhIHN0YXJ0ICkgcmV0dXJuIHN0YXJ0O1xuXHRpZiAoICEgZW5kICkgZW5kID0gc3RhcnQ7XG5cblx0dmFyIHAgPSBzdGFydCxcblx0XHRhZ2Fpbjtcblx0ZG8ge1xuXG5cdFx0YWdhaW4gPSBmYWxzZTtcblxuXHRcdGlmICggISBwLnN0ZWluZXIgJiYgKCBlcXVhbHMoIHAsIHAubmV4dCApIHx8IGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPT09IDAgKSApIHtcblxuXHRcdFx0cmVtb3ZlTm9kZSggcCApO1xuXHRcdFx0cCA9IGVuZCA9IHAucHJldjtcblx0XHRcdGlmICggcCA9PT0gcC5uZXh0ICkgYnJlYWs7XG5cdFx0XHRhZ2FpbiA9IHRydWU7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwID0gcC5uZXh0O1xuXG5cdFx0fVxuXG5cdH0gd2hpbGUgKCBhZ2FpbiB8fCBwICE9PSBlbmQgKTtcblxuXHRyZXR1cm4gZW5kO1xuXG59XG5cbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzICkge1xuXG5cdGlmICggISBlYXIgKSByZXR1cm47XG5cblx0Ly8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsXG5cdFx0cHJldiwgbmV4dDtcblxuXHQvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0ZXggbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG5cdFx0XHRlYXIgPSBuZXh0Lm5leHQ7XG5cdFx0XHRzdG9wID0gbmV4dC5uZXh0O1xuXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdH1cblxuXHRcdGVhciA9IG5leHQ7XG5cblx0XHQvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXHRcdFx0aWYgKCAhIHBhc3MgKSB7XG5cblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBmaWx0ZXJQb2ludHMoIGVhciApLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMSApO1xuXG5cdFx0XHRcdC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XG5cblx0XHRcdH0gZWxzZSBpZiAoIHBhc3MgPT09IDEgKSB7XG5cblx0XHRcdFx0ZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyggZWFyLCB0cmlhbmdsZXMsIGRpbSApO1xuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDIgKTtcblxuXHRcdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoIGVhciApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcblx0dmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG5cdHdoaWxlICggcCAhPT0gZWFyLnByZXYgKSB7XG5cblx0XHRpZiAoIHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG5cdHZhciBtaW5UWCA9IGEueCA8IGIueCA/ICggYS54IDwgYy54ID8gYS54IDogYy54ICkgOiAoIGIueCA8IGMueCA/IGIueCA6IGMueCApLFxuXHRcdG1pblRZID0gYS55IDwgYi55ID8gKCBhLnkgPCBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55IDwgYy55ID8gYi55IDogYy55ICksXG5cdFx0bWF4VFggPSBhLnggPiBiLnggPyAoIGEueCA+IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPiBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtYXhUWSA9IGEueSA+IGIueSA/ICggYS55ID4gYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA+IGMueSA/IGIueSA6IGMueSApO1xuXG5cdC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHR2YXIgcCA9IGVhci5wcmV2Wixcblx0XHRuID0gZWFyLm5leHRaO1xuXG5cdC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuXHR3aGlsZSAoIHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4WiApIHtcblxuXHRcdGlmICggcCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcblx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdHAgPSBwLnByZXZaO1xuXG5cdFx0aWYgKCBuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSApICYmXG5cdFx0XHRhcmVhKCBuLnByZXYsIG4sIG4ubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0biA9IG4ubmV4dFo7XG5cblx0fVxuXG5cdC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG5cdHdoaWxlICggcCAmJiBwLnogPj0gbWluWiApIHtcblxuXHRcdGlmICggcCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcblx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdHAgPSBwLnByZXZaO1xuXG5cdH1cblxuXHQvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuXHR3aGlsZSAoIG4gJiYgbi56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG5cdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55ICkgJiZcblx0XHRcdGFyZWEoIG4ucHJldiwgbiwgbi5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRuID0gbi5uZXh0WjtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXHRkbyB7XG5cblx0XHR2YXIgYSA9IHAucHJldixcblx0XHRcdGIgPSBwLm5leHQubmV4dDtcblxuXHRcdGlmICggISBlcXVhbHMoIGEsIGIgKSAmJiBpbnRlcnNlY3RzKCBhLCBwLCBwLm5leHQsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICkge1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7XG5cblx0XHRcdC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuXHR2YXIgYSA9IHN0YXJ0O1xuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXHRcdHdoaWxlICggYiAhPT0gYS5wcmV2ICkge1xuXG5cdFx0XHRpZiAoIGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbCggYSwgYiApICkge1xuXG5cdFx0XHRcdC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcblx0XHRcdFx0dmFyIGMgPSBzcGxpdFBvbHlnb24oIGEsIGIgKTtcblxuXHRcdFx0XHQvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRiID0gYi5uZXh0O1xuXG5cdFx0fVxuXG5cdFx0YSA9IGEubmV4dDtcblxuXHR9IHdoaWxlICggYSAhPT0gc3RhcnQgKTtcblxufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyggZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltICkge1xuXG5cdHZhciBxdWV1ZSA9IFtdLFxuXHRcdGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuXHRmb3IgKCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpICsrICkge1xuXG5cdFx0c3RhcnQgPSBob2xlSW5kaWNlc1sgaSBdICogZGltO1xuXHRcdGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbIGkgKyAxIF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblx0XHRsaXN0ID0gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSApO1xuXHRcdGlmICggbGlzdCA9PT0gbGlzdC5uZXh0ICkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcblx0XHRxdWV1ZS5wdXNoKCBnZXRMZWZ0bW9zdCggbGlzdCApICk7XG5cblx0fVxuXG5cdHF1ZXVlLnNvcnQoIGNvbXBhcmVYICk7XG5cblx0Ly8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcblx0Zm9yICggaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRlbGltaW5hdGVIb2xlKCBxdWV1ZVsgaSBdLCBvdXRlck5vZGUgKTtcblx0XHRvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMoIG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQgKTtcblxuXHR9XG5cblx0cmV0dXJuIG91dGVyTm9kZTtcblxufVxuXG5mdW5jdGlvbiBjb21wYXJlWCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS54IC0gYi54O1xuXG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblx0aWYgKCBvdXRlck5vZGUgKSB7XG5cblx0XHR2YXIgYiA9IHNwbGl0UG9seWdvbiggb3V0ZXJOb2RlLCBob2xlICk7XG5cdFx0ZmlsdGVyUG9pbnRzKCBiLCBiLm5leHQgKTtcblxuXHR9XG5cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblx0ZG8ge1xuXG5cdFx0aWYgKCBoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSApIHtcblxuXHRcdFx0dmFyIHggPSBwLnggKyAoIGh5IC0gcC55ICkgKiAoIHAubmV4dC54IC0gcC54ICkgLyAoIHAubmV4dC55IC0gcC55ICk7XG5cdFx0XHRpZiAoIHggPD0gaHggJiYgeCA+IHF4ICkge1xuXG5cdFx0XHRcdHF4ID0geDtcblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSApICkge1xuXG5cdFx0XHR0YW4gPSBNYXRoLmFicyggaHkgLSBwLnkgKSAvICggaHggLSBwLnggKTsgLy8gdGFuZ2VudGlhbFxuXG5cdFx0XHRpZiAoICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54ICkgKSAmJiBsb2NhbGx5SW5zaWRlKCBwLCBob2xlICkgKSB7XG5cblx0XHRcdFx0bSA9IHA7XG5cdFx0XHRcdHRhbk1pbiA9IHRhbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIG07XG5cbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblx0ZG8ge1xuXG5cdFx0aWYgKCBwLnogPT09IG51bGwgKSBwLnogPSB6T3JkZXIoIHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0cC5wcmV2WiA9IHAucHJldjtcblx0XHRwLm5leHRaID0gcC5uZXh0O1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cC5wcmV2Wi5uZXh0WiA9IG51bGw7XG5cdHAucHJldlogPSBudWxsO1xuXG5cdHNvcnRMaW5rZWQoIHAgKTtcblxufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQoIGxpc3QgKSB7XG5cblx0dmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLFxuXHRcdGluU2l6ZSA9IDE7XG5cblx0ZG8ge1xuXG5cdFx0cCA9IGxpc3Q7XG5cdFx0bGlzdCA9IG51bGw7XG5cdFx0dGFpbCA9IG51bGw7XG5cdFx0bnVtTWVyZ2VzID0gMDtcblxuXHRcdHdoaWxlICggcCApIHtcblxuXHRcdFx0bnVtTWVyZ2VzICsrO1xuXHRcdFx0cSA9IHA7XG5cdFx0XHRwU2l6ZSA9IDA7XG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGluU2l6ZTsgaSArKyApIHtcblxuXHRcdFx0XHRwU2l6ZSArKztcblx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdGlmICggISBxICkgYnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cVNpemUgPSBpblNpemU7XG5cblx0XHRcdHdoaWxlICggcFNpemUgPiAwIHx8ICggcVNpemUgPiAwICYmIHEgKSApIHtcblxuXHRcdFx0XHRpZiAoIHBTaXplICE9PSAwICYmICggcVNpemUgPT09IDAgfHwgISBxIHx8IHAueiA8PSBxLnogKSApIHtcblxuXHRcdFx0XHRcdGUgPSBwO1xuXHRcdFx0XHRcdHAgPSBwLm5leHRaO1xuXHRcdFx0XHRcdHBTaXplIC0tO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRlID0gcTtcblx0XHRcdFx0XHRxID0gcS5uZXh0Wjtcblx0XHRcdFx0XHRxU2l6ZSAtLTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YWlsICkgdGFpbC5uZXh0WiA9IGU7XG5cdFx0XHRcdGVsc2UgbGlzdCA9IGU7XG5cblx0XHRcdFx0ZS5wcmV2WiA9IHRhaWw7XG5cdFx0XHRcdHRhaWwgPSBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHAgPSBxO1xuXG5cdFx0fVxuXG5cdFx0dGFpbC5uZXh0WiA9IG51bGw7XG5cdFx0aW5TaXplICo9IDI7XG5cblx0fSB3aGlsZSAoIG51bU1lcmdlcyA+IDEgKTtcblxuXHRyZXR1cm4gbGlzdDtcblxufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cdHggPSAzMjc2NyAqICggeCAtIG1pblggKSAqIGludlNpemU7XG5cdHkgPSAzMjc2NyAqICggeSAtIG1pblkgKSAqIGludlNpemU7XG5cblx0eCA9ICggeCB8ICggeCA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7XG5cdHggPSAoIHggfCAoIHggPDwgNCApICkgJiAweDBGMEYwRjBGO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDIgKSApICYgMHgzMzMzMzMzMztcblx0eCA9ICggeCB8ICggeCA8PCAxICkgKSAmIDB4NTU1NTU1NTU7XG5cblx0eSA9ICggeSB8ICggeSA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgNCApICkgJiAweDBGMEYwRjBGO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDIgKSApICYgMHgzMzMzMzMzMztcblx0eSA9ICggeSB8ICggeSA8PCAxICkgKSAmIDB4NTU1NTU1NTU7XG5cblx0cmV0dXJuIHggfCAoIHkgPDwgMSApO1xuXG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KCBzdGFydCApIHtcblxuXHR2YXIgcCA9IHN0YXJ0LFxuXHRcdGxlZnRtb3N0ID0gc3RhcnQ7XG5cdGRvIHtcblxuXHRcdGlmICggcC54IDwgbGVmdG1vc3QueCB8fCAoIHAueCA9PT0gbGVmdG1vc3QueCAmJiBwLnkgPCBsZWZ0bW9zdC55ICkgKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKCBheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkgKSB7XG5cblx0cmV0dXJuICggY3ggLSBweCApICogKCBheSAtIHB5ICkgLSAoIGF4IC0gcHggKSAqICggY3kgLSBweSApID49IDAgJiZcblx0XHQgICAoIGF4IC0gcHggKSAqICggYnkgLSBweSApIC0gKCBieCAtIHB4ICkgKiAoIGF5IC0gcHkgKSA+PSAwICYmXG5cdFx0ICAgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICEgaW50ZXJzZWN0c1BvbHlnb24oIGEsIGIgKSAmJlxuXHRcdCAgIGxvY2FsbHlJbnNpZGUoIGEsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBiLCBhICkgJiYgbWlkZGxlSW5zaWRlKCBhLCBiICk7XG5cbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYSggcCwgcSwgciApIHtcblxuXHRyZXR1cm4gKCBxLnkgLSBwLnkgKSAqICggci54IC0gcS54ICkgLSAoIHEueCAtIHAueCApICogKCByLnkgLSBxLnkgKTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKCBwMSwgcTEsIHAyLCBxMiApIHtcblxuXHRpZiAoICggZXF1YWxzKCBwMSwgcDIgKSAmJiBlcXVhbHMoIHExLCBxMiApICkgfHxcblx0XHQoIGVxdWFscyggcDEsIHEyICkgJiYgZXF1YWxzKCBwMiwgcTEgKSApICkgcmV0dXJuIHRydWU7XG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0ICAgYXJlYSggcDIsIHEyLCBwMSApID4gMCAhPT0gYXJlYSggcDIsIHEyLCBxMSApID4gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oIGEsIGIgKSB7XG5cblx0dmFyIHAgPSBhO1xuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRpbnRlcnNlY3RzKCBwLCBwLm5leHQsIGEsIGIgKSApIHJldHVybiB0cnVlO1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IGEgKTtcblxuXHRyZXR1cm4gZmFsc2U7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKCBhLCBiICkge1xuXG5cdHJldHVybiBhcmVhKCBhLnByZXYsIGEsIGEubmV4dCApIDwgMCA/XG5cdFx0YXJlYSggYSwgYiwgYS5uZXh0ICkgPj0gMCAmJiBhcmVhKCBhLCBhLnByZXYsIGIgKSA+PSAwIDpcblx0XHRhcmVhKCBhLCBiLCBhLnByZXYgKSA8IDAgfHwgYXJlYSggYSwgYS5uZXh0LCBiICkgPCAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cdGRvIHtcblxuXHRcdGlmICggKCAoIHAueSA+IHB5ICkgIT09ICggcC5uZXh0LnkgPiBweSApICkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuXHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKVxuXHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oIGEsIGIgKSB7XG5cblx0dmFyIGEyID0gbmV3IE5vZGUoIGEuaSwgYS54LCBhLnkgKSxcblx0XHRiMiA9IG5ldyBOb2RlKCBiLmksIGIueCwgYi55ICksXG5cdFx0YW4gPSBhLm5leHQsXG5cdFx0YnAgPSBiLnByZXY7XG5cblx0YS5uZXh0ID0gYjtcblx0Yi5wcmV2ID0gYTtcblxuXHRhMi5uZXh0ID0gYW47XG5cdGFuLnByZXYgPSBhMjtcblxuXHRiMi5uZXh0ID0gYTI7XG5cdGEyLnByZXYgPSBiMjtcblxuXHRicC5uZXh0ID0gYjI7XG5cdGIyLnByZXYgPSBicDtcblxuXHRyZXR1cm4gYjI7XG5cbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoIGksIHgsIHksIGxhc3QgKSB7XG5cblx0dmFyIHAgPSBuZXcgTm9kZSggaSwgeCwgeSApO1xuXG5cdGlmICggISBsYXN0ICkge1xuXG5cdFx0cC5wcmV2ID0gcDtcblx0XHRwLm5leHQgPSBwO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwLm5leHQgPSBsYXN0Lm5leHQ7XG5cdFx0cC5wcmV2ID0gbGFzdDtcblx0XHRsYXN0Lm5leHQucHJldiA9IHA7XG5cdFx0bGFzdC5uZXh0ID0gcDtcblxuXHR9XG5cblx0cmV0dXJuIHA7XG5cbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZSggcCApIHtcblxuXHRwLm5leHQucHJldiA9IHAucHJldjtcblx0cC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cblx0aWYgKCBwLnByZXZaICkgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG5cdGlmICggcC5uZXh0WiApIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xuXG59XG5cbmZ1bmN0aW9uIE5vZGUoIGksIHgsIHkgKSB7XG5cblx0Ly8gdmVydGV4IGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG5cdHRoaXMuaSA9IGk7XG5cblx0Ly8gdmVydGV4IGNvb3JkaW5hdGVzXG5cdHRoaXMueCA9IHg7XG5cdHRoaXMueSA9IHk7XG5cblx0Ly8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblx0Zm9yICggdmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0gKSB7XG5cblx0XHRzdW0gKz0gKCBkYXRhWyBqIF0gLSBkYXRhWyBpIF0gKSAqICggZGF0YVsgaSArIDEgXSArIGRhdGFbIGogKyAxIF0gKTtcblx0XHRqID0gaTtcblxuXHR9XG5cblx0cmV0dXJuIHN1bTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG52YXIgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0dmFyIG4gPSBjb250b3VyLmxlbmd0aDtcblx0XHR2YXIgYSA9IDAuMDtcblxuXHRcdGZvciAoIHZhciBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdGEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYSAqIDAuNTtcblxuXHR9LFxuXG5cdGlzQ2xvY2tXaXNlOiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0cyApIDwgMDtcblxuXHR9LFxuXG5cdHRyaWFuZ3VsYXRlU2hhcGU6IGZ1bmN0aW9uICggY29udG91ciwgaG9sZXMgKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTsgLy8gZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBsaWtlIFsgeDAseTAsIHgxLHkxLCB4Mix5MiwgLi4uIF1cblx0XHR2YXIgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXG5cdFx0dmFyIGZhY2VzID0gW107IC8vIGZpbmFsIGFycmF5IG9mIHZlcnRleCBpbmRpY2VzIGxpa2UgWyBbIGEsYixkIF0sIFsgYixjLGQgXSBdXG5cblx0XHRyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTtcblx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBob2xlSW5kZXggPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdGhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaG9sZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTtcblx0XHRcdGhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDtcblx0XHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7XG5cblx0XHQvL1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRmYWNlcy5wdXNoKCB0cmlhbmdsZXMuc2xpY2UoIGksIGkgKyAzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWNlcztcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyggcG9pbnRzICkge1xuXG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRwb2ludHMucG9wKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLlxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vXG4gKiAgZGVwdGg6IDxmbG9hdD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIChpbmNsdWRpbmcgYmV2ZWxPZmZzZXQpIGlzIGJldmVsXG4gKiAgYmV2ZWxPZmZzZXQ6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIGRvZXMgYmV2ZWwgc3RhcnRcbiAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIGJldmVsIGxheWVyc1xuICpcbiAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nXG4gKlxuICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zXG4gKlxuICogfVxuICovXG5cbi8vIEV4dHJ1ZGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBFeHRydWRlR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTtcblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHR2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcblx0dmFyIG9wdGlvbnMgPSB0aGlzLnBhcmFtZXRlcnMub3B0aW9ucztcblxuXHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIG9wdGlvbnMsIGRhdGEgKTtcblxufTtcblxuLy8gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciB2ZXJ0aWNlc0FycmF5ID0gW107XG5cdHZhciB1dkFycmF5ID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblx0XHRhZGRTaGFwZSggc2hhcGUgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QXJyYXksIDIgKSApO1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHR2YXIgcGxhY2Vob2xkZXIgPSBbXTtcblxuXHRcdC8vIG9wdGlvbnNcblxuXHRcdHZhciBjdXJ2ZVNlZ21lbnRzID0gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmN1cnZlU2VnbWVudHMgOiAxMjtcblx0XHR2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTtcblx0XHR2YXIgZGVwdGggPSBvcHRpb25zLmRlcHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoIDogMTAwO1xuXG5cdFx0dmFyIGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7XG5cdFx0dmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7XG5cdFx0dmFyIGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjtcblx0XHR2YXIgYmV2ZWxPZmZzZXQgPSBvcHRpb25zLmJldmVsT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsT2Zmc2V0IDogMDtcblx0XHR2YXIgYmV2ZWxTZWdtZW50cyA9IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21lbnRzIDogMztcblxuXHRcdHZhciBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cblx0XHR2YXIgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogV29ybGRVVkdlbmVyYXRvcjtcblxuXHRcdC8vIGRlcHJlY2F0ZWQgb3B0aW9uc1xuXG5cdFx0aWYgKCBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLicgKTtcblx0XHRcdGRlcHRoID0gb3B0aW9ucy5hbW91bnQ7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcblx0XHR2YXIgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1hbCwgcG9zaXRpb24yO1xuXG5cdFx0aWYgKCBleHRydWRlUGF0aCApIHtcblxuXHRcdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcblxuXHRcdFx0ZXh0cnVkZUJ5UGF0aCA9IHRydWU7XG5cdFx0XHRiZXZlbEVuYWJsZWQgPSBmYWxzZTsgLy8gYmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uXG5cblx0XHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcblxuXHRcdFx0Ly8gVE9ETzEgLSBoYXZlIGEgLmlzQ2xvc2VkIGluIHNwbGluZT9cblxuXHRcdFx0c3BsaW5lVHViZSA9IGV4dHJ1ZGVQYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHN0ZXBzLCBmYWxzZSApO1xuXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcblxuXHRcdFx0Ymlub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHQvLyBTYWZlZ3VhcmRzIGlmIGJldmVscyBhcmUgbm90IGVuYWJsZWRcblxuXHRcdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdGJldmVsU2VnbWVudHMgPSAwO1xuXHRcdFx0YmV2ZWxUaGlja25lc3MgPSAwO1xuXHRcdFx0YmV2ZWxTaXplID0gMDtcblx0XHRcdGJldmVsT2Zmc2V0ID0gMDtcblxuXHRcdH1cblxuXHRcdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxuXG5cdFx0dmFyIGFob2xlLCBoLCBobDsgLy8gbG9vcGluZyBvZiBob2xlc1xuXG5cdFx0dmFyIHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XG5cdFx0dmFyIGhvbGVzID0gc2hhcGVQb2ludHMuaG9sZXM7XG5cblx0XHR2YXIgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggdmVydGljZXMgKTtcblxuXHRcdGlmICggcmV2ZXJzZSApIHtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uXG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XG5cblx0XHRcdFx0XHRob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHZlcnRpY2VzLCBob2xlcyApO1xuXG5cdFx0LyogVmVydGljZXMgKi9cblxuXHRcdHZhciBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7XG5cblx0XHRcdGlmICggISB2ZWMgKSBjb25zb2xlLmVycm9yKCBcIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0XCIgKTtcblxuXHRcdFx0cmV0dXJuIHZlYy5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKCBzaXplICkuYWRkKCBwdCApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGIsIGJzLCB0LCB6LFxuXHRcdFx0dmVydCwgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdGZhY2UsIGZsZW4gPSBmYWNlcy5sZW5ndGg7XG5cblxuXHRcdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcblxuXG5cdFx0ZnVuY3Rpb24gZ2V0QmV2ZWxWZWMoIGluUHQsIGluUHJldiwgaW5OZXh0ICkge1xuXG5cdFx0XHQvLyBjb21wdXRlcyBmb3IgaW5QdCB0aGUgY29ycmVzcG9uZGluZyBwb2ludCBpblB0JyBvbiBhIG5ldyBjb250b3VyXG5cdFx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XG5cdFx0XHQvLyBpZiB3ZSB3YWxrIGFsb25nIGNvbnRvdXIgY2xvY2t3aXNlLCB0aGlzIG5ldyBjb250b3VyIGlzIG91dHNpZGUgdGhlIG9sZCBvbmVcblx0XHRcdC8vXG5cdFx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xuXHRcdFx0Ly8gIGFkamFjZW50IGVkZ2VzIG9mIGluUHQgYXQgYSBkaXN0YW5jZSBvZiAxIHVuaXQgb24gdGhlIGxlZnQgc2lkZS5cblxuXHRcdFx0dmFyIHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnk7IC8vIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB2ZWN0b3IgZm9yIGluUHRcblxuXHRcdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxuXHRcdFx0Ly8gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMDUtX2ludGVyc2VjdC0xLmh0bWxcblxuXHRcdFx0dmFyIHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXG5cdFx0XHRcdHZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7XG5cdFx0XHR2YXIgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcblx0XHRcdFx0dl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTtcblxuXHRcdFx0dmFyIHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlc1xuXHRcdFx0dmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIGNvbGxpbmVhcjAgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdC8vIG5vdCBjb2xsaW5lYXJcblxuXHRcdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcblxuXHRcdFx0XHR2YXIgdl9wcmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cdFx0XHRcdHZhciB2X25leHRfbGVuID0gTWF0aC5zcXJ0KCB2X25leHRfeCAqIHZfbmV4dF94ICsgdl9uZXh0X3kgKiB2X25leHRfeSApO1xuXG5cdFx0XHRcdC8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnRcblxuXHRcdFx0XHR2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTtcblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XG5cblx0XHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9uZXh0X3kgLyB2X25leHRfbGVuICk7XG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF95ID0gKCBpbk5leHQueSArIHZfbmV4dF94IC8gdl9uZXh0X2xlbiApO1xuXG5cdFx0XHRcdC8vIHNjYWxpbmcgZmFjdG9yIGZvciB2X3ByZXYgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dmFyIHNmID0gKCAoIHB0TmV4dFNoaWZ0X3ggLSBwdFByZXZTaGlmdF94ICkgKiB2X25leHRfeSAtXG5cdFx0XHRcdFx0XHQoIHB0TmV4dFNoaWZ0X3kgLSBwdFByZXZTaGlmdF95ICkgKiB2X25leHRfeCApIC9cblx0XHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0Ly8gdmVjdG9yIGZyb20gaW5QdCB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0XHR2X3RyYW5zX3ggPSAoIHB0UHJldlNoaWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7XG5cdFx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBub3JtYWxpemUhLCBvdGhlcndpc2Ugc2hhcnAgY29ybmVycyBiZWNvbWUgdWdseVxuXHRcdFx0XHQvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzXG5cdFx0XHRcdHZhciB2X3RyYW5zX2xlbnNxID0gKCB2X3RyYW5zX3ggKiB2X3RyYW5zX3ggKyB2X3RyYW5zX3kgKiB2X3RyYW5zX3kgKTtcblx0XHRcdFx0aWYgKCB2X3RyYW5zX2xlbnNxIDw9IDIgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl90cmFuc19sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXNcblxuXHRcdFx0XHR2YXIgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXG5cdFx0XHRcdGlmICggdl9wcmV2X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRpcmVjdGlvbl9lcSApIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XG5cdFx0XHRcdFx0dl90cmFuc194ID0gLSB2X3ByZXZfeTtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeDtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNwaWtlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl95O1xuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8gc2hyaW5rX2J5ICk7XG5cblx0XHR9XG5cblxuXHRcdHZhciBjb250b3VyTW92ZW1lbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKVxuXG5cdFx0XHRjb250b3VyTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNvbnRvdXJbIGsgXSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhvbGVzTW92ZW1lbnRzID0gW10sXG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzLCB2ZXJ0aWNlc01vdmVtZW50cyA9IGNvbnRvdXJNb3ZlbWVudHMuY29uY2F0KCk7XG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggYWhvbGVbIGkgXSwgYWhvbGVbIGogXSwgYWhvbGVbIGsgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcblx0XHRcdHZlcnRpY2VzTW92ZW1lbnRzID0gdmVydGljZXNNb3ZlbWVudHMuY29uY2F0KCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cblx0XHR9XG5cblxuXHRcdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xuXG5cdFx0Zm9yICggYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXG5cdFx0XHQvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICkgKyBiZXZlbE9mZnNldDtcblxuXHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0YnMgPSBiZXZlbFNpemUgKyBiZXZlbE9mZnNldDtcblxuXHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHR2YXIgcztcblxuXHRcdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCAvIHN0ZXBzICogcyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7XG5cblx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0Ly8gQWRkIGJldmVsIHNlZ21lbnRzIHBsYW5lc1xuXG5cdFx0Ly9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXHRcdGZvciAoIGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkge1xuXG5cdFx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0O1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueCArIHogKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8qIEZhY2VzICovXG5cblx0XHQvLyBUb3AgYW5kIGJvdHRvbSBmYWNlc1xuXG5cdFx0YnVpbGRMaWRGYWNlcygpO1xuXG5cdFx0Ly8gU2lkZXMgZmFjZXNcblxuXHRcdGJ1aWxkU2lkZUZhY2VzKCk7XG5cblxuXHRcdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkTGlkRmFjZXMoKSB7XG5cblx0XHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblxuXHRcdFx0aWYgKCBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdFx0dmFyIGxheWVyID0gMDsgLy8gc3RlcHMgKyAxXG5cdFx0XHRcdHZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGF5ZXIgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXHRcdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSwgZmFjZVsgMSBdLCBmYWNlWyAwIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGZhY2VzIGZvciB0aGUgei1zaWRlcyBvZiB0aGUgc2hhcGVcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgbGF5ZXJvZmZzZXQgPSAwO1xuXHRcdFx0c2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApO1xuXHRcdFx0bGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5ndGg7XG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0c2lkZXdhbGxzKCBhaG9sZSwgbGF5ZXJvZmZzZXQgKTtcblxuXHRcdFx0XHQvLywgdHJ1ZVxuXHRcdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XG5cblx0XHRcdH1cblxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAxICk7XG5cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBqLCBrO1xuXHRcdFx0aSA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIC0tIGkgPj0gMCApIHtcblxuXHRcdFx0XHRqID0gaTtcblx0XHRcdFx0ayA9IGkgLSAxO1xuXHRcdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVydGljZXMubGVuZ3RoKTtcblxuXHRcdFx0XHR2YXIgcyA9IDAsXG5cdFx0XHRcdFx0c2wgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXG5cdFx0XHRcdGZvciAoIHMgPSAwOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2xlbjEgPSB2bGVuICogcztcblx0XHRcdFx0XHR2YXIgc2xlbjIgPSB2bGVuICogKCBzICsgMSApO1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcblx0XHRcdFx0XHRcdGIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSxcblx0XHRcdFx0XHRcdGMgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMixcblx0XHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcblxuXHRcdFx0XHRcdGY0KCBhLCBiLCBjLCBkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB2KCB4LCB5LCB6ICkge1xuXG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB5ICk7XG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB6ICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGYzKCBhLCBiLCBjICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cblx0XHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVUb3BVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQgKSB7XG5cblx0XHRcdGFkZFZlcnRleCggYSApO1xuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cblx0XHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7XG5cblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XG5cblx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi54ICk7XG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5O1xuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXHR2YXIgb3B0aW9ucyA9IHRoaXMucGFyYW1ldGVycy5vcHRpb25zO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApO1xuXG59O1xuXG4vL1xuXG52YXIgV29ybGRVVkdlbmVyYXRvciA9IHtcblxuXHRnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QyApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIGFfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgYl95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggY194LCBjX3kgKVxuXHRcdF07XG5cblx0fSxcblxuXHRnZW5lcmF0ZVNpZGVXYWxsVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgYl96ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDIgXTtcblx0XHR2YXIgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcblx0XHR2YXIgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07XG5cdFx0dmFyIGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggYV95IC0gYl95ICkgPCAwLjAxICkge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV94LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF94LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV95LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3ksIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF95LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9XG5cblx0fVxufTtcblxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIG9wdGlvbnMsIGRhdGEgKSB7XG5cblx0Ly9cblxuXHRkYXRhLnNoYXBlcyA9IFtdO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRpZiAoIG9wdGlvbnMuZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIGRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGgudG9KU09OKCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIFRleHQgPSAzRCBUZXh0XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZvbnRcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dFxuICogIGhlaWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dFxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0ZXh0IGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgKGluY2x1ZGluZyBiZXZlbE9mZnNldCkgaXMgYmV2ZWxcbiAqICBiZXZlbE9mZnNldDogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGRvZXMgYmV2ZWwgc3RhcnRcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUgKTtcblxuXHQvLyB0cmFuc2xhdGUgcGFyYW1ldGVycyB0byBFeHRydWRlR2VvbWV0cnkgQVBJXG5cblx0cGFyYW1ldGVycy5kZXB0aCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSBNYXRoLm1pbiggdGhldGFTdGFydCArIHRoZXRhTGVuZ3RoLCBNYXRoLlBJICk7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIHBvbGVzXG5cblx0XHR2YXIgdU9mZnNldCA9IDA7XG5cblx0XHRpZiAoIGl5ID09IDAgJiYgdGhldGFTdGFydCA9PSAwICkge1xuXG5cdFx0XHR1T2Zmc2V0ID0gMC41IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdH0gZWxzZSBpZiAoIGl5ID09IGhlaWdodFNlZ21lbnRzICYmIHRoZXRhRW5kID09IE1hdGguUEkgKSB7XG5cblx0XHRcdHVPZmZzZXQgPSAtIDAuNSAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRoLmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBNYXRoLnNpbiggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY29weSggdmVydGV4ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUgKyB1T2Zmc2V0LCAxIC0gdiApO1xuXG5cdFx0XHR2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0fVxuXG5cdFx0Z3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTtcblx0XHRcdHZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTtcblx0XHRcdHZhciBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHR2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTtcblxuXHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aWYgKCBpeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxIHx8IHRoZXRhRW5kIDwgTWF0aC5QSSApIGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEthbGViIE11cnBoeVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBSaW5nR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0dlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5SaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0dlb21ldHJ5O1xuXG4vLyBSaW5nQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IDAuNTtcblx0b3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyB8fCAxO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVNlZ21lbnRzID0gdGhldGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKSA6IDg7XG5cdHBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBzb21lIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgc2VnbWVudDtcblx0dmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzO1xuXHR2YXIgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGVcblxuXHRcdFx0c2VnbWVudCA9IHRoZXRhU3RhcnQgKyBpIC8gdGhldGFTZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cdFx0XHR1di55ID0gKCB2ZXJ0ZXgueSAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzXG5cblx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGogPSAwOyBqIDwgcGhpU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHR2YXIgdGhldGFTZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRzZWdtZW50ID0gaSArIHRoZXRhU2VnbWVudExldmVsO1xuXG5cdFx0XHR2YXIgYSA9IHNlZ21lbnQ7XG5cdFx0XHR2YXIgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcblx0XHRcdHZhciBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAyO1xuXHRcdFx0dmFyIGQgPSBzZWdtZW50ICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gTGF0aGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBMYXRoZUdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGF0aGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBvaW50czogcG9pbnRzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUdlb21ldHJ5O1xuXG4vLyBMYXRoZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjtcblx0cGhpU3RhcnQgPSBwaGlTdGFydCB8fCAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gY2xhbXAgcGhpTGVuZ3RoIHNvIGl0J3MgaW4gcmFuZ2Ugb2YgWyAwLCAyUEkgXVxuXG5cdHBoaUxlbmd0aCA9IE1hdGhVdGlscy5jbGFtcCggcGhpTGVuZ3RoLCAwLCBNYXRoLlBJICogMiApO1xuXG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBiYXNlO1xuXHR2YXIgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgaSwgajtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHR2YXIgcGhpID0gcGhpU3RhcnQgKyBpICogaW52ZXJzZVNlZ21lbnRzICogcGhpTGVuZ3RoO1xuXG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCBwaGkgKTtcblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHBoaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luO1xuXHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xuXHRcdFx0dmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSBpIC8gc2VnbWVudHM7XG5cdFx0XHR1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRiYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoO1xuXG5cdFx0XHR2YXIgYSA9IGJhc2U7XG5cdFx0XHR2YXIgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoO1xuXHRcdFx0dmFyIGMgPSBiYXNlICsgcG9pbnRzLmxlbmd0aCArIDE7XG5cdFx0XHR2YXIgZCA9IGJhc2UgKyAxO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBnZW5lcmF0ZSBub3JtYWxzXG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2VhbS5cblx0Ly8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2FsIChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS5cblxuXHRpZiAoIHBoaUxlbmd0aCA9PT0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cdFx0dmFyIG4xID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbjIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBuID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRoaXMgaXMgdGhlIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBsYXN0IGxpbmUgb2YgdmVydGljZXNcblxuXHRcdGJhc2UgPSBzZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGogPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkge1xuXG5cdFx0XHQvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lXG5cblx0XHRcdG4xLnggPSBub3JtYWxzWyBqICsgMCBdO1xuXHRcdFx0bjEueSA9IG5vcm1hbHNbIGogKyAxIF07XG5cdFx0XHRuMS56ID0gbm9ybWFsc1sgaiArIDIgXTtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgbGFzdCBsaW5lXG5cblx0XHRcdG4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTtcblx0XHRcdG4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTtcblx0XHRcdG4yLnogPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXTtcblxuXHRcdFx0Ly8gYXZlcmFnZSBub3JtYWxzXG5cblx0XHRcdG4uYWRkVmVjdG9ycyggbjEsIG4yICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlcyB0byBib3RoIG5vcm1hbHNcblxuXHRcdFx0bm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54O1xuXHRcdFx0bm9ybWFsc1sgaiArIDEgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdID0gbi55O1xuXHRcdFx0bm9ybWFsc1sgaiArIDIgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdID0gbi56O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5MYXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTaGFwZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknO1xuXG5cdGlmICggdHlwZW9mIGN1cnZlU2VnbWVudHMgPT09ICdvYmplY3QnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cy5jdXJ2ZVNlZ21lbnRzO1xuXG5cdH1cblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVHZW9tZXRyeTtcblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiQxKCBzaGFwZXMsIGRhdGEgKTtcblxufTtcblxuLy8gU2hhcGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cdHZhciBncm91cENvdW50ID0gMDtcblxuXHQvLyBhbGxvdyBzaW5nbGUgYW5kIGFycmF5IHZhbHVlcyBmb3IgXCJzaGFwZXNcIiBwYXJhbWV0ZXJcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcblxuXHRcdGFkZFNoYXBlKCBzaGFwZXMgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7XG5cblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXHRcdFx0Z3JvdXBDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHR2YXIgaSwgbCwgc2hhcGVIb2xlO1xuXG5cdFx0dmFyIGluZGV4T2Zmc2V0ID0gdmVydGljZXMubGVuZ3RoIC8gMztcblx0XHR2YXIgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0dmFyIHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7XG5cdFx0dmFyIHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XG5cblx0XHQvLyBjaGVjayBkaXJlY3Rpb24gb2YgdmVydGljZXNcblxuXHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVWZXJ0aWNlcyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTtcblxuXHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTtcblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdH1cblxuXHRcdC8vIGluY2lkZXNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGIgPSBmYWNlWyAxIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBjID0gZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7XG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYyApO1xuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5O1xuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHR2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRyZXR1cm4gdG9KU09OJDEoIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiB0b0pTT04kMSggc2hhcGVzLCBkYXRhICkge1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBNYXRoVXRpbHMuREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXG5cdC8vIHByZXBhcmUgc291cmNlIGdlb21ldHJ5XG5cblx0dmFyIGdlb21ldHJ5MjtcblxuXHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRnZW9tZXRyeTIgPSBuZXcgR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeTIuZnJvbUJ1ZmZlckdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnZW9tZXRyeTIgPSBnZW9tZXRyeS5jbG9uZSgpO1xuXG5cdH1cblxuXHRnZW9tZXRyeTIubWVyZ2VWZXJ0aWNlcygpO1xuXHRnZW9tZXRyeTIuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0dmFyIHNvdXJjZVZlcnRpY2VzID0gZ2VvbWV0cnkyLnZlcnRpY2VzO1xuXHR2YXIgZmFjZXMgPSBnZW9tZXRyeTIuZmFjZXM7XG5cblx0Ly8gbm93IGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhbiBlZGdlIHdpdGggaXRzIGFkam9pbmluZyBmYWNlc1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTtcblx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdLCBmYWNlMTogaSwgZmFjZTI6IHVuZGVmaW5lZCB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXS5mYWNlMiA9IGk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHR2YXIgZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdC8vIGFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGJldHdlZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2YWx1ZS4gZGVmYXVsdCA9IDEgZGVncmVlLlxuXG5cdFx0aWYgKCBlLmZhY2UyID09PSB1bmRlZmluZWQgfHwgZmFjZXNbIGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFZGdlc0dlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEN5bGluZGVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyR2VvbWV0cnk7XG5cbi8vIEN5bGluZGVyQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHJhZGl1c1RvcCA9IHJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkID8gcmFkaXVzVG9wIDogMTtcblx0cmFkaXVzQm90dG9tID0gcmFkaXVzQm90dG9tICE9PSB1bmRlZmluZWQgPyByYWRpdXNCb3R0b20gOiAxO1xuXHRoZWlnaHQgPSBoZWlnaHQgfHwgMTtcblxuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0b3BlbkVuZGVkID0gb3BlbkVuZGVkICE9PSB1bmRlZmluZWQgPyBvcGVuRW5kZWQgOiBmYWxzZTtcblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwLjA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBpbmRleEFycmF5ID0gW107XG5cdHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGdlbmVyYXRlIGdlb21ldHJ5XG5cblx0Z2VuZXJhdGVUb3JzbygpO1xuXG5cdGlmICggb3BlbkVuZGVkID09PSBmYWxzZSApIHtcblxuXHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XG5cdFx0aWYgKCByYWRpdXNCb3R0b20gPiAwICkgZ2VuZXJhdGVDYXAoIGZhbHNlICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkge1xuXG5cdFx0dmFyIHgsIHk7XG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHQvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbFxuXHRcdHZhciBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0dmFyIGluZGV4Um93ID0gW107XG5cblx0XHRcdHZhciB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3VycmVudCByb3dcblxuXHRcdFx0dmFyIHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xuXG5cdFx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRcdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7XG5cdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdFx0Ly8gc2F2ZSBpbmRleCBvZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3dcblxuXHRcdFx0XHRpbmRleFJvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vdyBzYXZlIHZlcnRpY2VzIG9mIHRoZSByb3cgaW4gb3VyIGluZGV4IGFycmF5XG5cblx0XHRcdGluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdGZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdFx0Ly8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgaW5kaWNlc1xuXG5cdFx0XHRcdHZhciBhID0gaW5kZXhBcnJheVsgeSBdWyB4IF07XG5cdFx0XHRcdHZhciBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYyA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggKyAxIF07XG5cdFx0XHRcdHZhciBkID0gaW5kZXhBcnJheVsgeSBdWyB4ICsgMSBdO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIHVwZGF0ZSBncm91cCBjb3VudGVyXG5cblx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDAgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkge1xuXG5cdFx0dmFyIHgsIGNlbnRlckluZGV4U3RhcnQsIGNlbnRlckluZGV4RW5kO1xuXG5cdFx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xuXHRcdHZhciBzaWduID0gKCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2VudGVyIHZlcnRleFxuXHRcdGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcblxuXHRcdC8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC5cblx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcblx0XHQvLyB3ZSBtdXN0IGdlbmVyYXRlIGEgY2VudGVyIHZlcnRleCBwZXIgZmFjZS9zZWdtZW50XG5cblx0XHRmb3IgKCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleFxuXG5cdFx0Y2VudGVySW5kZXhFbmQgPSBpbmRleDtcblxuXHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHR2ZXJ0ZXgueSA9IGhhbGZIZWlnaHQgKiBzaWduO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41O1xuXHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7XG5cdFx0XHR2YXIgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcblxuXHRcdFx0aWYgKCB0b3AgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gZmFjZSB0b3BcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gZmFjZSBib3R0b21cblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCB0b3AgPT09IHRydWUgPyAxIDogMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG59XG5cbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbi8vIENvbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7XG5cbi8vIENvbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBodWdoZXNcbiAqL1xuXG4vLyBDaXJjbGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVHZW9tZXRyeTtcblxuLy8gQ2lyY2xlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0c2VnbWVudHMgPSBzZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICkgOiA4O1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdC8vIGNlbnRlciBwb2ludFxuXG5cdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdGZvciAoIHMgPSAwLCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkge1xuXG5cdFx0dmFyIHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHQvLyB2ZXJ0ZXhcblxuXHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHQvLyBub3JtYWxcblxuXHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0Ly8gdXZzXG5cblx0XHR1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUJ1ZmZlckdlb21ldHJ5O1xuXG5cblxudmFyIEdlb21ldHJpZXMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0V2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5LFxuXHRQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSxcblx0UGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0SWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSxcblx0SWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTogSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdFBvbHloZWRyb25HZW9tZXRyeTogUG9seWhlZHJvbkdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk6IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0VHViZUdlb21ldHJ5OiBUdWJlR2VvbWV0cnksXG5cdFR1YmVCdWZmZXJHZW9tZXRyeTogVHViZUJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0tub3RHZW9tZXRyeTogVG9ydXNLbm90R2VvbWV0cnksXG5cdFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSxcblx0VG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNCdWZmZXJHZW9tZXRyeTogVG9ydXNCdWZmZXJHZW9tZXRyeSxcblx0VGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksXG5cdFRleHRCdWZmZXJHZW9tZXRyeTogVGV4dEJ1ZmZlckdlb21ldHJ5LFxuXHRTcGhlcmVHZW9tZXRyeTogU3BoZXJlR2VvbWV0cnksXG5cdFNwaGVyZUJ1ZmZlckdlb21ldHJ5OiBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcblx0UmluZ0dlb21ldHJ5OiBSaW5nR2VvbWV0cnksXG5cdFJpbmdCdWZmZXJHZW9tZXRyeTogUmluZ0J1ZmZlckdlb21ldHJ5LFxuXHRQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQbGFuZUJ1ZmZlckdlb21ldHJ5OiBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuXHRMYXRoZUdlb21ldHJ5OiBMYXRoZUdlb21ldHJ5LFxuXHRMYXRoZUJ1ZmZlckdlb21ldHJ5OiBMYXRoZUJ1ZmZlckdlb21ldHJ5LFxuXHRTaGFwZUdlb21ldHJ5OiBTaGFwZUdlb21ldHJ5LFxuXHRTaGFwZUJ1ZmZlckdlb21ldHJ5OiBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuXHRFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSxcblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBFeHRydWRlQnVmZmVyR2VvbWV0cnksXG5cdEVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksXG5cdENvbmVHZW9tZXRyeTogQ29uZUdlb21ldHJ5LFxuXHRDb25lQnVmZmVyR2VvbWV0cnk6IENvbmVCdWZmZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJHZW9tZXRyeTogQ3lsaW5kZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSxcblx0Q2lyY2xlR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LFxuXHRDaXJjbGVCdWZmZXJHZW9tZXRyeTogQ2lyY2xlQnVmZmVyR2VvbWV0cnksXG5cdEJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSxcblx0Qm94QnVmZmVyR2VvbWV0cnk6IEJveEJ1ZmZlckdlb21ldHJ5XG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxUSFJFRS5Db2xvcj5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkb3dNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRvd01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsID0gdHJ1ZTtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF3U2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0U2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7XG5cbn1cblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7XG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYXdTaGFkZXJNYXRlcmlhbDtcblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHJvdWdobmVzczogPGZsb2F0PixcbiAqICBtZXRhbG5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHJvdWdobmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbWV0YWxuZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGVudk1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hTdGFuZGFyZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMucm91Z2huZXNzID0gMS4wO1xuXHR0aGlzLm1ldGFsbmVzcyA9IDAuMDtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmVudk1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy52ZXJ0ZXhUYW5nZW50cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XG5cdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy52ZXJ0ZXhUYW5nZW50cyA9IHNvdXJjZS52ZXJ0ZXhUYW5nZW50cztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNsZWFyY29hdDogPGZsb2F0PixcbiAqICBjbGVhcmNvYXRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgY2xlYXJjb2F0Um91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIGNsZWFyY29hdFJvdWdobmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBjbGVhcmNvYXROb3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICogIGNsZWFyY29hdE5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBzaGVlbjogPENvbG9yPixcbiAqXG4gKiAgdHJhbnNwYXJlbmN5OiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHtcblxuXHRcdCdTVEFOREFSRCc6ICcnLFxuXHRcdCdQSFlTSUNBTCc6ICcnXG5cblx0fTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY2xlYXJjb2F0ID0gMC4wO1xuXHR0aGlzLmNsZWFyY29hdE1hcCA9IG51bGw7XG5cdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzID0gMC4wO1xuXHR0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IG51bGw7XG5cdHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCA9IG51bGw7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5zaGVlbiA9IG51bGw7IC8vIG51bGwgd2lsbCBkaXNhYmxlIHNoZWVuIGJzZGZcblxuXHR0aGlzLnRyYW5zcGFyZW5jeSA9IDAuMDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7XG5cblx0XHQnU1RBTkRBUkQnOiAnJyxcblx0XHQnUEhZU0lDQUwnOiAnJ1xuXG5cdH07XG5cblx0dGhpcy5jbGVhcmNvYXQgPSBzb3VyY2UuY2xlYXJjb2F0O1xuXHR0aGlzLmNsZWFyY29hdE1hcCA9IHNvdXJjZS5jbGVhcmNvYXRNYXA7XG5cdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzcztcblx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBzb3VyY2UuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXHR0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCA9IHNvdXJjZS5jbGVhcmNvYXROb3JtYWxNYXA7XG5cdHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weSggc291cmNlLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXG5cdGlmICggc291cmNlLnNoZWVuICkge1xuXG5cdFx0dGhpcy5zaGVlbiA9ICggdGhpcy5zaGVlbiB8fCBuZXcgQ29sb3IoKSApLmNvcHkoIHNvdXJjZS5zaGVlbiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLnNoZWVuID0gbnVsbDtcblxuXHR9XG5cblx0dGhpcy50cmFuc3BhcmVuY3kgPSBzb3VyY2UudHJhbnNwYXJlbmN5O1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHNwZWN1bGFyOiA8aGV4PixcbiAqICBzaGluaW5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5T3BlcmF0aW9uLFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaG9uZ01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5zcGVjdWxhciA9IG5ldyBDb2xvciggMHgxMTExMTEgKTtcblx0dGhpcy5zaGluaW5lc3MgPSAzMDtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDtcblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMuc3BlY3VsYXIuY29weSggc291cmNlLnNwZWN1bGFyICk7XG5cdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRha2FoaXJveCAvIGh0dHA6Ly9naXRodWIuY29tL3Rha2FoaXJveFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHNwZWN1bGFyOiA8aGV4PixcbiAqICBzaGluaW5lc3M6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBncmFkaWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsTWFwVHlwZTogVEhSRUUuVGFuZ2VudFNwYWNlTm9ybWFsTWFwLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hUb29uTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoVG9vbk1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IDMwO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5ncmFkaWVudE1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMuc3BlY3VsYXIuY29weSggc291cmNlLnNwZWN1bGFyICk7XG5cdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsO1xuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXRjYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaE1hdGNhcE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdNQVRDQVAnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTWF0Y2FwTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hdGNhcCA9IG51bGw7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTWF0Y2FwTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTWF0Y2FwTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaE1hdGNhcE1hdGVyaWFsO1xuXG5NZXNoTWF0Y2FwTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE1hdGNhcE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaE1hdGNhcE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWF0Y2FwID0gc291cmNlLm1hdGNhcDtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdE1lc2hNYXRjYXBNYXRlcmlhbDogTWVzaE1hdGNhcE1hdGVyaWFsLFxuXHRMaW5lRGFzaGVkTWF0ZXJpYWw6IExpbmVEYXNoZWRNYXRlcmlhbCxcblx0TGluZUJhc2ljTWF0ZXJpYWw6IExpbmVCYXNpY01hdGVyaWFsLFxuXHRNYXRlcmlhbDogTWF0ZXJpYWxcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG52YXIgQW5pbWF0aW9uVXRpbHMgPSB7XG5cblx0Ly8gc2FtZSBhcyBBcnJheS5wcm90b3R5cGUuc2xpY2UsIGJ1dCBhbHNvIHdvcmtzIG9uIHR5cGVkIGFycmF5c1xuXHRhcnJheVNsaWNlOiBmdW5jdGlvbiAoIGFycmF5LCBmcm9tLCB0byApIHtcblxuXHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHQvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVuZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXlcblx0XHRcdC8vIGJ1dCBhcnJheS5zdWJhcnJheShmcm9tKSBvciBhcnJheS5zdWJhcnJheShmcm9tLCBsZW4pIGlzIGNvcnJlY3Rcblx0XHRcdHJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5LnNsaWNlKCBmcm9tLCB0byApO1xuXG5cdH0sXG5cblx0Ly8gY29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlXG5cdGNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSApIHtcblxuXHRcdGlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcgYW5kICdudWxsJyBwYXNzXG5cdFx0XHQhIGZvcmNlQ2xvbmUgJiYgYXJyYXkuY29uc3RydWN0b3IgPT09IHR5cGUgKSByZXR1cm4gYXJyYXk7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlLkJZVEVTX1BFUl9FTEVNRU5UID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXlcblxuXHRcdH1cblxuXHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5XG5cblx0fSxcblxuXHRpc1R5cGVkQXJyYXk6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggb2JqZWN0ICkgJiZcblx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHN1YmNsaXA6IGZ1bmN0aW9uICggc291cmNlQ2xpcCwgbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyApIHtcblxuXHRcdGZwcyA9IGZwcyB8fCAzMDtcblxuXHRcdHZhciBjbGlwID0gc291cmNlQ2xpcC5jbG9uZSgpO1xuXG5cdFx0Y2xpcC5uYW1lID0gbmFtZTtcblxuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gY2xpcC50cmFja3NbIGkgXTtcblx0XHRcdHZhciB2YWx1ZVNpemUgPSB0cmFjay5nZXRWYWx1ZVNpemUoKTtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHRyYWNrLnRpbWVzLmxlbmd0aDsgKysgaiApIHtcblxuXHRcdFx0XHR2YXIgZnJhbWUgPSB0cmFjay50aW1lc1sgaiBdICogZnBzO1xuXG5cdFx0XHRcdGlmICggZnJhbWUgPCBzdGFydEZyYW1lIHx8IGZyYW1lID49IGVuZEZyYW1lICkgY29udGludWU7XG5cblx0XHRcdFx0dGltZXMucHVzaCggdHJhY2sudGltZXNbIGogXSApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IHZhbHVlU2l6ZTsgKysgayApIHtcblxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB0cmFjay52YWx1ZXNbIGogKiB2YWx1ZVNpemUgKyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0dHJhY2sudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0cmFjay50aW1lcy5jb25zdHJ1Y3RvciApO1xuXHRcdFx0dHJhY2sudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRyYWNrLnZhbHVlcy5jb25zdHJ1Y3RvciApO1xuXG5cdFx0XHR0cmFja3MucHVzaCggdHJhY2sgKTtcblxuXHRcdH1cblxuXHRcdGNsaXAudHJhY2tzID0gdHJhY2tzO1xuXG5cdFx0Ly8gZmluZCBtaW5pbXVtIC50aW1lcyB2YWx1ZSBhY3Jvc3MgYWxsIHRyYWNrcyBpbiB0aGUgdHJpbW1lZCBjbGlwXG5cblx0XHR2YXIgbWluU3RhcnRUaW1lID0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggbWluU3RhcnRUaW1lID4gY2xpcC50cmFja3NbIGkgXS50aW1lc1sgMCBdICkge1xuXG5cdFx0XHRcdG1pblN0YXJ0VGltZSA9IGNsaXAudHJhY2tzWyBpIF0udGltZXNbIDAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2hpZnQgYWxsIHRyYWNrcyBzdWNoIHRoYXQgY2xpcCBiZWdpbnMgYXQgdD0wXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGNsaXAudHJhY2tzWyBpIF0uc2hpZnQoIC0gMSAqIG1pblN0YXJ0VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0Y2xpcC5yZXNldER1cmF0aW9uKCk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMgb3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuXG4gKlxuICogVGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoXG4gKiBhbG9uZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuXG4gKlxuICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5XG4gKiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmdcbiAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNzZXMuXG4gKlxuICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzXG4gKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBhY2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqXG4gKiBcdFx0aHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbFxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHR0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9ucztcblx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXG5cdHRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgP1xuXHRcdHJlc3VsdEJ1ZmZlciA6IG5ldyBzYW1wbGVWYWx1ZXMuY29uc3RydWN0b3IoIHNhbXBsZVNpemUgKTtcblx0dGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7XG5cdHRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHRldmFsdWF0ZTogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpMSA9IHRoaXMuX2NhY2hlZEluZGV4LFxuXG5cdFx0XHR0MSA9IHBwWyBpMSBdLFxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xuXG5cdFx0XHRzZWVrOiB7XG5cblx0XHRcdFx0dmFyIHJpZ2h0O1xuXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XG5cblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXG5cblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cblxuXHRcdFx0XHRcdFx0dmFyIHQxZ2xvYmFsID0gcHBbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB0IDwgdDFnbG9iYWwgKSB7XG5cblx0XHRcdFx0XHRcdFx0aTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlsc1xuXHRcdFx0XHRcdFx0XHR0MCA9IHQxZ2xvYmFsO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGxpbmVhciByZXZlcnNlIHNjYW5cblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgLSAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGJlZm9yZSBzdGFydFxuXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDEgPSB0MDtcblx0XHRcdFx0XHRcdFx0dDAgPSBwcFsgLS0gaTEgLSAxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0ID49IHQwICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gaTE7XG5cdFx0XHRcdFx0XHRpMSA9IDA7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZFxuXG5cdFx0XHRcdFx0YnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7XG5cblx0XHRcdFx0fSAvLyBsaW5lYXIgc2NhblxuXG5cdFx0XHRcdC8vIGJpbmFyeSBzZWFyY2hcblxuXHRcdFx0XHR3aGlsZSAoIGkxIDwgcmlnaHQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7XG5cblx0XHRcdFx0XHRpZiAoIHQgPCBwcFsgbWlkIF0gKSB7XG5cblx0XHRcdFx0XHRcdHJpZ2h0ID0gbWlkO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aTEgPSBtaWQgKyAxO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0MSA9IHBwWyBpMSBdO1xuXHRcdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdFx0XHQvLyBjaGVjayBib3VuZGFyeSBjYXNlcywgYWdhaW5cblxuXHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0MCwgdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSAvLyBzZWVrXG5cblx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cblx0XHRcdHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApO1xuXG5cdFx0fSAvLyB2YWxpZGF0ZV9pbnRlcnZhbFxuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7XG5cblx0fSxcblxuXHRzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNzLXNwZWNpZmljIHNldHRpbmdzIHN0cnVjdHVyZVxuXHQvLyBOb3RlOiBUaGUgaW5kaXJlY3Rpb24gYWxsb3dzIGNlbnRyYWwgY29udHJvbCBvZiBtYW55IGludGVycG9sYW50cy5cblxuXHQvLyAtLS0gUHJvdGVjdGVkIGludGVyZmFjZVxuXG5cdERlZmF1bHRTZXR0aW5nc186IHt9LFxuXG5cdGdldFNldHRpbmdzXzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0dGluZ3NfO1xuXG5cdH0sXG5cblx0Y29weVNhbXBsZVZhbHVlXzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdC8vIGNvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlclxuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gVGVtcGxhdGUgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzOlxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7XG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQxICovICkge1xuXG5cdFx0Ly8gZW1wdHlcblxuXHR9XG5cbn0gKTtcblxuLy8gREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cbi8qKlxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cbiAqXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ3ViaWNJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cblx0dGhpcy5fd2VpZ2h0UHJldiA9IC0gMDtcblx0dGhpcy5fb2Zmc2V0UHJldiA9IC0gMDtcblx0dGhpcy5fd2VpZ2h0TmV4dCA9IC0gMDtcblx0dGhpcy5fb2Zmc2V0TmV4dCA9IC0gMDtcblxufVxuXG5DdWJpY0ludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge1xuXG5cdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdDEgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGlQcmV2ID0gaTEgLSAyLFxuXHRcdFx0aU5leHQgPSBpMSArIDEsXG5cblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xuXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZTtcblxuXHRcdHRoaXMuX3dlaWdodFByZXYgPSBoYWxmRHQgLyAoIHQwIC0gdFByZXYgKTtcblx0XHR0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7XG5cdFx0dGhpcy5fb2Zmc2V0UHJldiA9IGlQcmV2ICogc3RyaWRlO1xuXHRcdHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTtcblxuXHR9LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0bzEgPSBpMSAqIHN0cmlkZSxcdFx0bzAgPSBvMSAtIHN0cmlkZSxcblx0XHRcdG9QID0gdGhpcy5fb2Zmc2V0UHJldiwgXHRvTiA9IHRoaXMuX29mZnNldE5leHQsXG5cdFx0XHR3UCA9IHRoaXMuX3dlaWdodFByZXYsXHR3TiA9IHRoaXMuX3dlaWdodE5leHQsXG5cblx0XHRcdHAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHRwcCA9IHAgKiBwLFxuXHRcdFx0cHBwID0gcHAgKiBwO1xuXG5cdFx0Ly8gZXZhbHVhdGUgcG9seW5vbWlhbHNcblxuXHRcdHZhciBzUCA9IC0gd1AgKiBwcHAgKyAyICogd1AgKiBwcCAtIHdQICogcDtcblx0XHR2YXIgczAgPSAoIDEgKyB3UCApICogcHBwICsgKCAtIDEuNSAtIDIgKiB3UCApICogcHAgKyAoIC0gMC41ICsgd1AgKSAqIHAgKyAxO1xuXHRcdHZhciBzMSA9ICggLSAxIC0gd04gKSAqIHBwcCArICggMS41ICsgd04gKSAqIHBwICsgMC41ICogcDtcblx0XHR2YXIgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7XG5cblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b2Zmc2V0MSA9IGkxICogc3RyaWRlLFxuXHRcdFx0b2Zmc2V0MCA9IG9mZnNldDEgLSBzdHJpZGUsXG5cblx0XHRcdHdlaWdodDEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHR3ZWlnaHQwID0gMSAtIHdlaWdodDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MCArIGkgXSAqIHdlaWdodDAgK1xuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MSArIGkgXSAqIHdlaWdodDE7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBJbnRlcnBvbGFudCB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBwb3NpdGlvbiBwcmVjZWVkaW5nXG4gKiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBEaXNjcmV0ZUludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5EaXNjcmV0ZUludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxIC8qLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQnICk7XG5cdGlmICggdGltZXMgPT09IHVuZGVmaW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgJyArIG5hbWUgKTtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXG5cdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0aGlzLlRpbWVCdWZmZXJUeXBlICk7XG5cdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7XG5cblx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxufVxuXG4vLyBTdGF0aWMgbWV0aG9kc1xuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLCB7XG5cblx0Ly8gU2VyaWFsaXphdGlvbiAoaW4gc3RhdGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvblxuXHQvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6XG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIHRyYWNrICkge1xuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IHRyYWNrLmNvbnN0cnVjdG9yO1xuXG5cdFx0dmFyIGpzb247XG5cblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyB0b0pTT04gbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUudG9KU09OICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXG5cdFx0XHRqc29uID0ge1xuXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBpbnRlcnBvbGF0aW9uID0gdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpO1xuXG5cdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7IC8vIG1hbmRhdG9yeVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2sucHJvdG90eXBlLCB7XG5cblx0Y29uc3RydWN0b3I6IEtleWZyYW1lVHJhY2ssXG5cblx0VGltZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBEaXNjcmV0ZUludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgQ3ViaWNJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0c2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0dmFyIGZhY3RvcnlNZXRob2Q7XG5cblx0XHRzd2l0Y2ggKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlRGlzY3JldGU6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlU21vb3RoOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdGlmICggZmFjdG9yeU1ldGhvZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IFwidW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgXCIgK1xuXHRcdFx0XHR0aGlzLlZhbHVlVHlwZU5hbWUgKyBcIiBrZXlmcmFtZSB0cmFjayBuYW1lZCBcIiArIHRoaXMubmFtZTtcblxuXHRcdFx0aWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gZmFsbCBiYWNrIHRvIGRlZmF1bHQsIHVubGVzcyB0aGUgZGVmYXVsdCBpdHNlbGYgaXMgbWVzc2VkIHVwXG5cdFx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1lc3NhZ2UgKTsgLy8gZmF0YWwsIGluIHRoaXMgY2FzZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrOicsIG1lc3NhZ2UgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHtcblxuXHRcdFx0XHR0byA9IE1hdGgubWF4KCB0bywgMSApO1xuXHRcdFx0XHRmcm9tID0gdG8gLSAxO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGltZXMgb3IgdmFsdWVzIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciB0cmFja3MsIHNvIG92ZXJ3cml0aW5nIGlzIHVuc2FmZVxuXHRcdHZhciB0aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudGltZXMgKSxcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzICksXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHR3cml0ZUluZGV4ID0gMSxcblx0XHRcdGxhc3RJbmRleCA9IHRpbWVzLmxlbmd0aCAtIDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBrZWVwID0gZmFsc2U7XG5cblx0XHRcdHZhciB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdHZhciB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdO1xuXG5cdFx0XHQvLyByZW1vdmUgYWRqYWNlbnQga2V5ZnJhbWVzIHNjaGVkdWxlZCBhdCB0aGUgc2FtZSB0aW1lXG5cblx0XHRcdGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXRQID0gb2Zmc2V0IC0gc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8XG5cdFx0XHRcdFx0XHRcdHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldE4gKyBqIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0a2VlcCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbi1wbGFjZSBjb21wYWN0aW9uXG5cblx0XHRcdGlmICgga2VlcCApIHtcblxuXHRcdFx0XHRpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7XG5cblx0XHRcdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTtcblxuXHRcdFx0XHRcdHZhciByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXM7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudGltZXMsIDAgKTtcblx0XHR2YXIgdmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGhpcy52YWx1ZXMsIDAgKTtcblxuXHRcdHZhciBUeXBlZEtleWZyYW1lVHJhY2sgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXHRcdHZhciB0cmFjayA9IG5ldyBUeXBlZEtleWZyYW1lVHJhY2soIHRoaXMubmFtZSwgdGltZXMsIHZhbHVlcyApO1xuXG5cdFx0Ly8gSW50ZXJwb2xhbnQgYXJndW1lbnQgdG8gY29uc3RydWN0b3IgaXMgbm90IHNhdmVkLCBzbyBjb3B5IHRoZSBmYWN0b3J5IG1ldGhvZCBkaXJlY3RseS5cblx0XHR0cmFjay5jcmVhdGVJbnRlcnBvbGFudCA9IHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7XG5cblx0XHRyZXR1cm4gdHJhY2s7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayB0aGF0IGludGVycG9sYXRlcyBTdHJpbmdzXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBTdHJpbmdLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTdHJpbmdLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdzdHJpbmcnLFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICd2ZWN0b3InXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFJldXNhYmxlIHNldCBvZiBUcmFja3MgdGhhdCByZXByZXNlbnQgYW4gYW5pbWF0aW9uLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25DbGlwKCBuYW1lLCBkdXJhdGlvbiwgdHJhY2tzICkge1xuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cdHRoaXMudHJhY2tzID0gdHJhY2tzO1xuXHR0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIHR5cGVOYW1lICkge1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cblx0XHRjYXNlICdzY2FsYXInOlxuXHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0Y2FzZSAnZmxvYXQnOlxuXHRcdGNhc2UgJ251bWJlcic6XG5cdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRjYXNlICd2ZWN0b3IzJzpcblx0XHRjYXNlICd2ZWN0b3I0JzpcblxuXHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdjb2xvcic6XG5cblx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cblx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uICkge1xuXG5cdGlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTtcblxuXHR9XG5cblx0dmFyIHRyYWNrVHlwZSA9IGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApO1xuXG5cdGlmICgganNvbi50aW1lcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVlJyApO1xuXG5cdFx0anNvbi50aW1lcyA9IHRpbWVzO1xuXHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdH1cblxuXHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2Rcblx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0cmV0dXJuIG5ldyB0cmFja1R5cGUoIGpzb24ubmFtZSwganNvbi50aW1lcywganNvbi52YWx1ZXMsIGpzb24uaW50ZXJwb2xhdGlvbiApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIHBhcnNlS2V5ZnJhbWVUcmFjaygganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcblxuXHRcdHZhciBqc29uID0ge1xuXG5cdFx0XHQnbmFtZSc6IGNsaXAubmFtZSxcblx0XHRcdCdkdXJhdGlvbic6IGNsaXAuZHVyYXRpb24sXG5cdFx0XHQndHJhY2tzJzogdHJhY2tzLFxuXHRcdFx0J3V1aWQnOiBjbGlwLnV1aWRcblxuXHRcdH07XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBjbGlwVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sudG9KU09OKCBjbGlwVHJhY2tzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fSxcblxuXHRDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBudW1Nb3JwaFRhcmdldHMgPSBtb3JwaFRhcmdldFNlcXVlbmNlLmxlbmd0aDtcblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1Nb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHR0aW1lcy5wdXNoKFxuXHRcdFx0XHQoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkgJSBudW1Nb3JwaFRhcmdldHMsXG5cdFx0XHRcdGksXG5cdFx0XHRcdCggaSArIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyApO1xuXG5cdFx0XHR2YWx1ZXMucHVzaCggMCwgMSwgMCApO1xuXG5cdFx0XHR2YXIgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xuXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cmFja3MucHVzaChcblx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXG5cdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxuXHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcblx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCggbmFtZSwgLSAxLCB0cmFja3MgKTtcblxuXHR9LFxuXG5cdGZpbmRCeU5hbWU6IGZ1bmN0aW9uICggb2JqZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7XG5cblx0XHR2YXIgY2xpcEFycmF5ID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cblx0XHRpZiAoICEgQXJyYXkuaXNBcnJheSggb2JqZWN0T3JDbGlwQXJyYXkgKSApIHtcblxuXHRcdFx0dmFyIG8gPSBvYmplY3RPckNsaXBBcnJheTtcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Q3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6IGZ1bmN0aW9uICggbW9ycGhUYXJnZXRzLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxuXHRcdHZhciBwYXR0ZXJuID0gL14oW1xcdy1dKj8pKFtcXGRdKykkLztcblxuXHRcdC8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9uIGdyb3VwcyBiYXNlZFxuXHRcdC8vIHBhdHRlcm5zIGxpa2UgV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XG5cdFx0XHR2YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XG5cblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHR2YXIgbmFtZSA9IHBhcnRzWyAxIF07XG5cblx0XHRcdFx0dmFyIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cdFx0XHRcdGlmICggISBhbmltYXRpb25Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFuaW1hdGlvbk1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRjbGlwcy5wdXNoKCBBbmltYXRpb25DbGlwLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdLCBmcHMsIG5vTG9vcCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xpcHM7XG5cblx0fSxcblxuXHQvLyBwYXJzZSB0aGUgYW5pbWF0aW9uLmhpZXJhcmNoeSBmb3JtYXRcblx0cGFyc2VBbmltYXRpb246IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHtcblxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTtcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGFkZE5vbmVtcHR5VHJhY2sgPSBmdW5jdGlvbiAoIHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MgKSB7XG5cblx0XHRcdC8vIG9ubHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLlxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcblxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdHZhciBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1lIHx8ICdkZWZhdWx0Jztcblx0XHQvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC5cblx0XHR2YXIgZHVyYXRpb24gPSBhbmltYXRpb24ubGVuZ3RoIHx8IC0gMTtcblx0XHR2YXIgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcblxuXHRcdHZhciBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xuXG5cdFx0Zm9yICggdmFyIGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0dmFyIGFuaW1hdGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzO1xuXG5cdFx0XHQvLyBza2lwIGVtcHR5IHRyYWNrc1xuXHRcdFx0aWYgKCAhIGFuaW1hdGlvbktleXMgfHwgYW5pbWF0aW9uS2V5cy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gZmlndXJlIG91dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2tcblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0TmFtZXMgPSB7fTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcblxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxuXHRcdFx0XHRmb3IgKCB2YXIgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFyZ2V0TmFtZXMgKSB7XG5cblx0XHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYW5pbWF0aW9uS2V5ID0gYW5pbWF0aW9uS2V5c1sgayBdO1xuXG5cdFx0XHRcdFx0XHR0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApO1xuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cmFja3MucHVzaCggbmV3IE51bWJlcktleWZyYW1lVHJhY2soICcubW9ycGhUYXJnZXRJbmZsdWVuY2VbJyArIG1vcnBoVGFyZ2V0TmFtZSArICddJywgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGR1cmF0aW9uID0gbW9ycGhUYXJnZXROYW1lcy5sZW5ndGggKiAoIGZwcyB8fCAxLjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uXG5cblx0XHRcdFx0dmFyIGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNrcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRyYWNrcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXAgPSBuZXcgQW5pbWF0aW9uQ2xpcCggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKTtcblxuXHRcdHJldHVybiBjbGlwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLnByb3RvdHlwZSwge1xuXG5cdHJlc2V0RHVyYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0cmFja3MgPSB0aGlzLnRyYWNrcywgZHVyYXRpb24gPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gdGhpcy50cmFja3NbIGkgXTtcblxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heCggZHVyYXRpb24sIHRyYWNrLnRpbWVzWyB0cmFjay50aW1lcy5sZW5ndGggLSAxIF0gKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWxpZCA9IHRydWU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhbGlkID0gdmFsaWQgJiYgdGhpcy50cmFja3NbIGkgXS52YWxpZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggdGhpcy50cmFja3NbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIHRoaXMubmFtZSwgdGhpcy5kdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXHR2YXIgaXRlbXNMb2FkZWQgPSAwO1xuXHR2YXIgaXRlbXNUb3RhbCA9IDA7XG5cdHZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcblx0dmFyIGhhbmRsZXJzID0gW107XG5cblx0Ly8gUmVmZXIgdG8gIzU2ODkgZm9yIHRoZSByZWFzb24gd2h5IHdlIGRvbid0IHNldCAub25TdGFydFxuXHQvLyBpbiB0aGUgY29uc3RydWN0b3JcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fTtcblxuXHR0aGlzLmFkZEhhbmRsZXIgPSBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XG5cblx0XHRoYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdHRoaXMucmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uICggcmVnZXggKSB7XG5cblx0XHR2YXIgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKCByZWdleCApO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRoYW5kbGVycy5zcGxpY2UoIGluZGV4LCAyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdHRoaXMuZ2V0SGFuZGxlciA9IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0dmFyIHJlZ2V4ID0gaGFuZGxlcnNbIGkgXTtcblx0XHRcdHZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcblxuXHRcdFx0aWYgKCByZWdleC5nbG9iYWwgKSByZWdleC5sYXN0SW5kZXggPSAwOyAvLyBzZWUgIzE3OTIwXG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdHRoaXMuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcblx0dGhpcy5wYXRoID0gJyc7XG5cdHRoaXMucmVzb3VyY2VQYXRoID0gJyc7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggLyogdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKi8gKSB7fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCAvKiBkYXRhICovICkge30sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHBhdGggKSB7XG5cblx0XHR0aGlzLnBhdGggPSBwYXRoO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVzb3VyY2VQYXRoOiBmdW5jdGlvbiAoIHJlc291cmNlUGF0aCApIHtcblxuXHRcdHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGxvYWRpbmcgPSB7fTtcblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkZpbGVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEZpbGVMb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgcmVxdWVzdCBpcyBkdXBsaWNhdGVcblxuXHRcdGlmICggbG9hZGluZ1sgdXJsIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xuXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIGRhdGE6IFVSSVxuXHRcdHZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLztcblx0XHR2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdHZhciBtaW1lVHlwZSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMSBdO1xuXHRcdFx0dmFyIGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07XG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXG5cdFx0XHRkYXRhID0gZGVjb2RlVVJJQ29tcG9uZW50KCBkYXRhICk7XG5cblx0XHRcdGlmICggaXNCYXNlNjQgKSBkYXRhID0gYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gdmlldy5idWZmZXI7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lc1xuXHRcdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJbml0aWFsaXNlIGFycmF5IGZvciBkdXBsaWNhdGUgcmVxdWVzdHNcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0gPSBbXTtcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xuXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0dmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuXHRcdFx0cmVxdWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7XG5cblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRpZiAoIHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2xcblx0XHRcdFx0XHQvLyBlLmcuICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLlxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMCApIGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIHRvIGNhY2hlIG9ubHkgb24gSFRUUCBzdWNjZXNzLCBzbyB0aGF0IHdlIGRvIG5vdCBjYWNoZVxuXHRcdFx0XHRcdC8vIGVycm9yIHJlc3BvbnNlIGJvZGllcyBhcyBwcm9wZXIgcmVzcG9uc2VzIHRvIHJlcXVlc3RzLlxuXHRcdFx0XHRcdENhY2hlLmFkZCggdXJsLCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Fib3J0JywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuQW5pbWF0aW9uTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbmltYXRpb25Mb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggc2NvcGUucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7XG5cblx0XHRcdGFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuaW1hdGlvbnM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLilcbiAqXG4gKiBTdWIgY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCB0aGUgcGFyc2UoKSBtZXRob2Qgd2hpY2ggd2lsbCBiZSB1c2VkIGluIGxvYWQoKS5cbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLnBhcnNlKCBidWZmZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpbWFnZXNbIGkgXSA9IHtcblx0XHRcdFx0XHR3aWR0aDogdGV4RGF0YXMud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiB0ZXhEYXRhcy5oZWlnaHQsXG5cdFx0XHRcdFx0Zm9ybWF0OiB0ZXhEYXRhcy5mb3JtYXQsXG5cdFx0XHRcdFx0bWlwbWFwczogdGV4RGF0YXMubWlwbWFwc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxvYWRlZCArPSAxO1xuXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdXJsLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xuXG5cdFx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBERFMgZmlsZVxuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0XHR2YXIgdGV4RGF0YXMgPSBzY29wZS5wYXJzZSggYnVmZmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzOiBbXSB9O1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YXMubWlwbWFwcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8vZ2l0aHViLmNvbS9mb28xMjMvXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICpcbiAqIFN1YiBjbGFzc2VzIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBwYXJzZSgpIG1ldGhvZCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gbG9hZCgpLlxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERhdGFUZXh0dXJlTG9hZGVyLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHRleERhdGEgPSBzY29wZS5wYXJzZSggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleERhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdGV4RGF0YS5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdGV4RGF0YS53cmFwUyAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdGV4RGF0YS53cmFwVCAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdGV4RGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHRleERhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdGV4RGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4RGF0YS5taXBtYXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlcjsgLy8gcHJlc3VtYWJseS4uLlxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4RGF0YS5taXBtYXBDb3VudCA9PT0gMSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkltYWdlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbWFnZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHR2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycgKTtcblxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VMb2FkKCkge1xuXG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgb25JbWFnZUVycm9yLCBmYWxzZSApO1xuXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgdGhpcyApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGhpcyApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gb25JbWFnZUVycm9yKCBldmVudCApIHtcblxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgb25JbWFnZUVycm9yLCBmYWxzZSApO1xuXG5cdFx0aWYgKCB1cmwuc3Vic3RyKCAwLCA1ICkgIT09ICdkYXRhOicgKSB7XG5cblx0XHRcdGlmICggdGhpcy5jcm9zc09yaWdpbiAhPT0gdW5kZWZpbmVkICkgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0aW1hZ2Uuc3JjID0gdXJsO1xuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkN1YmVUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJlVGV4dHVyZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybHMsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHR2YXIgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcblxuXHRcdFx0XHRsb2FkZWQgKys7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuVGV4dHVyZUxvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVGV4dHVyZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuanBlP2coJHxcXD8pL2kgKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXFw6aW1hZ2VcXC9qcGVnLyApID09PSAwO1xuXG5cdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IGlzSlBFRyA/IFJHQkZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlJztcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIE1hdGhVdGlscy5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggTWF0aFV0aWxzLmNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSApICk7XG5cdFx0XHR0aGV0YSAvPSBzZWdtZW50cztcblxuXHRcdFx0aWYgKCB0YW5nZW50c1sgMCBdLmRvdCggdmVjLmNyb3NzVmVjdG9ycyggbm9ybWFsc1sgMCBdLCBub3JtYWxzWyBzZWdtZW50cyBdICkgKSA+IDAgKSB7XG5cblx0XHRcdFx0dGhldGEgPSAtIHRoZXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIHR3aXN0IGEgbGl0dGxlLi4uXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5nZW50c1sgaSBdLCB0aGV0YSAqIGkgKSApO1xuXHRcdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFuZ2VudHM6IHRhbmdlbnRzLFxuXHRcdFx0bm9ybWFsczogbm9ybWFscyxcblx0XHRcdGJpbm9ybWFsczogYmlub3JtYWxzXG5cdFx0fTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gc291cmNlLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0N1cnZlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQ3VydmUudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRkYXRhLmFyY0xlbmd0aERpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0ganNvbi5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0VsbGlwc2VDdXJ2ZSc7XG5cblx0dGhpcy5hWCA9IGFYIHx8IDA7XG5cdHRoaXMuYVkgPSBhWSB8fCAwO1xuXG5cdHRoaXMueFJhZGl1cyA9IHhSYWRpdXMgfHwgMTtcblx0dGhpcy55UmFkaXVzID0geVJhZGl1cyB8fCAxO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZSB8fCAwO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZSB8fCAyICogTWF0aC5QSTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlIHx8IGZhbHNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uIHx8IDA7XG5cbn1cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VDdXJ2ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cdHZhciBkZWx0YUFuZ2xlID0gdGhpcy5hRW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlO1xuXHR2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjtcblxuXHQvLyBlbnN1cmVzIHRoYXQgZGVsdGFBbmdsZSBpcyAwIC4uIDIgUElcblx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdHdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTtcblxuXHRpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdGlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAtIHR3b1BpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgLSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlO1xuXHR2YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0dmFyIHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0aWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTtcblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHR2YXIgdHggPSB4IC0gdGhpcy5hWDtcblx0XHR2YXIgdHkgPSB5IC0gdGhpcy5hWTtcblxuXHRcdC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cblx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0eSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYVggPSBzb3VyY2UuYVg7XG5cdHRoaXMuYVkgPSBzb3VyY2UuYVk7XG5cblx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XG5cdHRoaXMueVJhZGl1cyA9IHNvdXJjZS55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBzb3VyY2UuYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IHNvdXJjZS5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLmFYID0gdGhpcy5hWDtcblx0ZGF0YS5hWSA9IHRoaXMuYVk7XG5cblx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xuXHRkYXRhLnlSYWRpdXMgPSB0aGlzLnlSYWRpdXM7XG5cblx0ZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7XG5cdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XG5cblx0ZGF0YS5hQ2xvY2t3aXNlID0gdGhpcy5hQ2xvY2t3aXNlO1xuXG5cdGRhdGEuYVJvdGF0aW9uID0gdGhpcy5hUm90YXRpb247XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLmFYID0ganNvbi5hWDtcblx0dGhpcy5hWSA9IGpzb24uYVk7XG5cblx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBqc29uLnlSYWRpdXM7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IGpzb24uYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0ganNvbi5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIEFyY0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0RWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdHRoaXMudHlwZSA9ICdBcmNDdXJ2ZSc7XG5cbn1cblxuQXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZlLnByb3RvdHlwZSApO1xuQXJjQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjQ3VydmU7XG5cbkFyY0N1cnZlLnByb3RvdHlwZS5pc0FyY0N1cnZlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqXG4gKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xuICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXG4gKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxuICpcbiAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxuICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxuICovXG5cblxuLypcbkJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cbiAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXG4gLSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cblxuVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxuYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXG53aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXG4qL1xuXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XG5cblx0dmFyIGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuXHQvKlxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xuXHQgKiBzdWNoIHRoYXRcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxuXHQgKiAgYW5kXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xuXG5cdFx0YzAgPSB4MDtcblx0XHRjMSA9IHQwO1xuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xuXG5cdFx0fSxcblxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxuXHRcdFx0dmFyIHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcblx0XHRcdHZhciB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XG5cblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxuXHRcdFx0dDEgKj0gZHQxO1xuXHRcdFx0dDIgKj0gZHQxO1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xuXG5cdFx0fSxcblxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdFx0dmFyIHQyID0gdCAqIHQ7XG5cdFx0XHR2YXIgdDMgPSB0MiAqIHQ7XG5cdFx0XHRyZXR1cm4gYzAgKyBjMSAqIHQgKyBjMiAqIHQyICsgYzMgKiB0MztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8vXG5cbnZhciB0bXAgPSBuZXcgVmVjdG9yMygpO1xudmFyIHB4ID0gbmV3IEN1YmljUG9seSgpLCBweSA9IG5ldyBDdWJpY1BvbHkoKSwgcHogPSBuZXcgQ3ViaWNQb2x5KCk7XG5cbmZ1bmN0aW9uIENhdG11bGxSb21DdXJ2ZTMoIHBvaW50cywgY2xvc2VkLCBjdXJ2ZVR5cGUsIHRlbnNpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJztcblxuXHR0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTtcblx0dGhpcy5jbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7XG5cdHRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlIHx8ICdjZW50cmlwZXRhbCc7XG5cdHRoaXMudGVuc2lvbiA9IHRlbnNpb24gfHwgMC41O1xuXG59XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhdG11bGxSb21DdXJ2ZTM7XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMyA9IHRydWU7XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdHZhciBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHRpZiAoIHRoaXMuY2xvc2VkICkge1xuXG5cdFx0aW50UG9pbnQgKz0gaW50UG9pbnQgPiAwID8gMCA6ICggTWF0aC5mbG9vciggTWF0aC5hYnMoIGludFBvaW50ICkgLyBsICkgKyAxICkgKiBsO1xuXG5cdH0gZWxzZSBpZiAoIHdlaWdodCA9PT0gMCAmJiBpbnRQb2ludCA9PT0gbCAtIDEgKSB7XG5cblx0XHRpbnRQb2ludCA9IGwgLSAyO1xuXHRcdHdlaWdodCA9IDE7XG5cblx0fVxuXG5cdHZhciBwMCwgcDEsIHAyLCBwMzsgLy8gNCBwb2ludHNcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcblxuXHRcdHAwID0gcG9pbnRzWyAoIGludFBvaW50IC0gMSApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9pbnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7XG5cdFx0cDAgPSB0bXA7XG5cblx0fVxuXG5cdHAxID0gcG9pbnRzWyBpbnRQb2ludCAlIGwgXTtcblx0cDIgPSBwb2ludHNbICggaW50UG9pbnQgKyAxICkgJSBsIF07XG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xuXG5cdFx0cDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyBsIC0gMSBdLCBwb2ludHNbIGwgLSAyIF0gKS5hZGQoIHBvaW50c1sgbCAtIDEgXSApO1xuXHRcdHAzID0gdG1wO1xuXG5cdH1cblxuXHRpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2VudHJpcGV0YWwnIHx8IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgKSB7XG5cblx0XHQvLyBpbml0IENlbnRyaXBldGFsIC8gQ2hvcmRhbCBDYXRtdWxsLVJvbVxuXHRcdHZhciBwb3cgPSB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnID8gMC41IDogMC4yNTtcblx0XHR2YXIgZHQwID0gTWF0aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTtcblx0XHR2YXIgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcblx0XHR2YXIgZHQyID0gTWF0aC5wb3coIHAyLmRpc3RhbmNlVG9TcXVhcmVkKCBwMyApLCBwb3cgKTtcblxuXHRcdC8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzXG5cdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xuXHRcdGlmICggZHQwIDwgMWUtNCApIGR0MCA9IGR0MTtcblx0XHRpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7XG5cblx0XHRweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRwei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwgZHQxLCBkdDIgKTtcblxuXHR9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xuXG5cdFx0cHguaW5pdENhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIHRoaXMudGVuc2lvbiApO1xuXHRcdHB5LmluaXRDYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCB0aGlzLnRlbnNpb24gKTtcblx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uICk7XG5cblx0fVxuXG5cdHBvaW50LnNldChcblx0XHRweC5jYWxjKCB3ZWlnaHQgKSxcblx0XHRweS5jYWxjKCB3ZWlnaHQgKSxcblx0XHRwei5jYWxjKCB3ZWlnaHQgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xuXG5cdH1cblxuXHR0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7XG5cdHRoaXMuY3VydmVUeXBlID0gc291cmNlLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0gc291cmNlLnRlbnNpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XG5cblx0fVxuXG5cdGRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7XG5cdGRhdGEuY3VydmVUeXBlID0gdGhpcy5jdXJ2ZVR5cGU7XG5cdGRhdGEudGVuc2lvbiA9IHRoaXMudGVuc2lvbjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xuXHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0ganNvbi5jbG9zZWQ7XG5cdHRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7XG5cdHRoaXMudGVuc2lvbiA9IGpzb24udGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmVcbiAqL1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHR2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0dmFyIHYxID0gKCBwMyAtIHAxICkgKiAwLjU7XG5cdHZhciB0MiA9IHQgKiB0O1xuXHR2YXIgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDIgKiAoIDEgLSB0ICkgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciggdCwgcDAsIHAxLCBwMiApIHtcblxuXHRyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAwICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArXG5cdFx0UXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYzID0gdjMgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlO1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdHBvaW50LnNldChcblx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZTMnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIExpbmVDdXJ2ZSggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cbn1cblxuTGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuTGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZSA9IHRydWU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRUYW5nZW50ID0gZnVuY3Rpb24gKCAvKiB0ICovICkge1xuXG5cdHZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApO1xuXG5cdHJldHVybiB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlMyggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XG5cblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmlzTGluZUN1cnZlMyA9IHRydWU7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xuXHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZSc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRwb2ludC5zZXQoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRwb2ludC5zZXQoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVjdG9yMiAqLyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwbGluZUN1cnZlJztcblxuXHR0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTtcblxufVxuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblNwbGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwbGluZUN1cnZlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcblxuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XG5cdHZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0dmFyIHAwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XG5cdHZhciBwMSA9IHBvaW50c1sgaW50UG9pbnQgXTtcblx0dmFyIHAyID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAyID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDEgXTtcblx0dmFyIHAzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcblxuXHRwb2ludC5zZXQoXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC54LCBwMS54LCBwMi54LCBwMy54ICksXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC55LCBwMS55LCBwMi55LCBwMy55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuXG52YXIgQ3VydmVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdEFyY0N1cnZlOiBBcmNDdXJ2ZSxcblx0Q2F0bXVsbFJvbUN1cnZlMzogQ2F0bXVsbFJvbUN1cnZlMyxcblx0Q3ViaWNCZXppZXJDdXJ2ZTogQ3ViaWNCZXppZXJDdXJ2ZSxcblx0Q3ViaWNCZXppZXJDdXJ2ZTM6IEN1YmljQmV6aWVyQ3VydmUzLFxuXHRFbGxpcHNlQ3VydmU6IEVsbGlwc2VDdXJ2ZSxcblx0TGluZUN1cnZlOiBMaW5lQ3VydmUsXG5cdExpbmVDdXJ2ZTM6IExpbmVDdXJ2ZTMsXG5cdFF1YWRyYXRpY0JlemllckN1cnZlOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmUzOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsXG5cdFNwbGluZUN1cnZlOiBTcGxpbmVDdXJ2ZVxufSk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqKi9cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlx0Q3VydmVkIFBhdGggLSBhIGN1cnZlIHBhdGggaXMgc2ltcGx5IGEgYXJyYXkgb2YgY29ubmVjdGVkXG4gKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBpIG9mIGEgY3VydmVcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmVQYXRoKCkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3VydmVQYXRoJztcblxuXHR0aGlzLmN1cnZlcyA9IFtdO1xuXHR0aGlzLmF1dG9DbG9zZSA9IGZhbHNlOyAvLyBBdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgcGF0aFxuXG59XG5cbkN1cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdXJ2ZVBhdGgsXG5cblx0YWRkOiBmdW5jdGlvbiAoIGN1cnZlICkge1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHR9LFxuXG5cdGNsb3NlUGF0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBzdGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xuXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgTGluZUN1cnZlKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG9cblx0Ly8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LFxuXHQvLyBmb2xsb3dpbmcgaGFzIHRvIGJlIGRvbmU6XG5cblx0Ly8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBiZSBrbm93blxuXHQvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmVcblx0Ly8gMy4gR2V0IHQgZm9yIHRoZSBjdXJ2ZVxuXHQvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0JylcblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTtcblx0XHR2YXIgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHQvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy5cblxuXHRcdHdoaWxlICggaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGggKSB7XG5cblx0XHRcdGlmICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHtcblxuXHRcdFx0XHR2YXIgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcblx0XHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpO1xuXHRcdFx0XHR2YXIgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aSArKztcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXG5cblx0fSxcblxuXHQvLyBXZSBjYW5ub3QgdXNlIHRoZSBkZWZhdWx0IFRIUkVFLkN1cnZlIGdldFBvaW50KCkgd2l0aCBnZXRMZW5ndGgoKSBiZWNhdXNlIGluXG5cdC8vIFRIUkVFLkN1cnZlLCBnZXRMZW5ndGgoKSBkZXBlbmRzIG9uIGdldFBvaW50KCkgYnV0IGluIFRIUkVFLkN1cnZlUGF0aFxuXHQvLyBnZXRQb2ludCgpIGRlcGVuZHMgb24gZ2V0TGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVucyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLlxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IG51bGw7XG5cdFx0dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbVxuXHQvLyBXZSBjYW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LlxuXG5cdGdldEN1cnZlTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV2UgdXNlIGNhY2hlIHZhbHVlcyBpZiBjdXJ2ZXMgYW5kIGNhY2hlIGFycmF5IGFyZSBzYW1lIGxlbmd0aFxuXG5cdFx0aWYgKCB0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmVcblx0XHQvLyBQdXNoIHN1bXMgaW50byBjYWNoZWQgYXJyYXlcblxuXHRcdHZhciBsZW5ndGhzID0gW10sIHN1bXMgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c3VtcyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpO1xuXHRcdFx0bGVuZ3Rocy5wdXNoKCBzdW1zICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7XG5cblx0XHRyZXR1cm4gbGVuZ3RocztcblxuXHR9LFxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDA7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPD0gZGl2aXNpb25zOyBpICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggaSAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHRnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEyO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdLCBsYXN0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IGN1cnZlc1sgaSBdO1xuXHRcdFx0dmFyIHJlc29sdXRpb24gPSAoIGN1cnZlICYmIGN1cnZlLmlzRWxsaXBzZUN1cnZlICkgPyBkaXZpc2lvbnMgKiAyXG5cdFx0XHRcdDogKCBjdXJ2ZSAmJiAoIGN1cnZlLmlzTGluZUN1cnZlIHx8IGN1cnZlLmlzTGluZUN1cnZlMyApICkgPyAxXG5cdFx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhdGgnO1xuXG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBhdGgsXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IExpbmVDdXJ2ZSggdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoIHgsIHkgKSApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyAvKkFycmF5IG9mIFZlY3RvciovICkge1xuXG5cdFx0dmFyIG5wdHMgPSBbIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCkgXS5jb25jYXQoIHB0cyApO1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IFNwbGluZUN1cnZlKCBucHRzICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHNvdXJjZS5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0Q3VydmVQYXRoLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoIGpzb24uY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuXG4gKiovXG5cbi8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLlxuLy8gU1RFUCAyIFR1cm4gcGF0aCBpbnRvIHNoYXBlLlxuLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0YWtlcyBpbiBTaGFwZS9TaGFwZXNcbi8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2ggc2hhcGUsIHR1cm4gdG8gdmVydGljZXNcbi8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBlYWNoIHNoYXBlLCBhZGQgZmFjZXMuXG5cbmZ1bmN0aW9uIFNoYXBlKCBwb2ludHMgKSB7XG5cblx0UGF0aC5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlJztcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXBQYXNzID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdHRoaXMuX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xuXHR0aGlzLl9mcmFtZUV4dGVudHMgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuX3ZpZXdwb3J0Q291bnQgPSAxO1xuXG5cdHRoaXMuX3ZpZXdwb3J0cyA9IFtcblxuXHRcdG5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxIClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdF9wcm9qU2NyZWVuTWF0cml4OiBuZXcgTWF0cml4NCgpLFxuXG5cdF9saWdodFBvc2l0aW9uV29ybGQ6IG5ldyBWZWN0b3IzKCksXG5cblx0X2xvb2tUYXJnZXQ6IG5ldyBWZWN0b3IzKCksXG5cblx0Z2V0Vmlld3BvcnRDb3VudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7XG5cblx0fSxcblxuXHRnZXRGcnVzdHVtOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJ1c3R1bTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpY2VzOiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHRoaXMuY2FtZXJhLFxuXHRcdFx0c2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXgsXG5cdFx0XHRwcm9qU2NyZWVuTWF0cml4ID0gdGhpcy5fcHJvalNjcmVlbk1hdHJpeCxcblx0XHRcdGxvb2tUYXJnZXQgPSB0aGlzLl9sb29rVGFyZ2V0LFxuXHRcdFx0bGlnaHRQb3NpdGlvbldvcmxkID0gdGhpcy5fbGlnaHRQb3NpdGlvbldvcmxkO1xuXG5cdFx0bGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRzaGFkb3dDYW1lcmEucG9zaXRpb24uY29weSggbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRsb29rVGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggbG9va1RhcmdldCApO1xuXHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0cHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIHByb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdHNoYWRvd01hdHJpeC5zZXQoXG5cdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHQwLjAsIDAuNSwgMC4wLCAwLjUsXG5cdFx0XHQwLjAsIDAuMCwgMC41LCAwLjUsXG5cdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHQpO1xuXG5cdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdH0sXG5cblx0Z2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICggdmlld3BvcnRJbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLl92aWV3cG9ydHNbIHZpZXdwb3J0SW5kZXggXTtcblxuXHR9LFxuXG5cdGdldEZyYW1lRXh0ZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaWNlczogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuXHRcdHZhciBmb3YgPSBNYXRoVXRpbHMuUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0XHRMaWdodFNoYWRvdy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCggdGhpcywgbGlnaHQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGFuZ2xlLCBwZW51bWJyYSwgZGVjYXkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gTWF0aC5QSTtcblxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDtcblx0dGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8gYW5nbGUgOiBNYXRoLlBJIC8gMztcblx0dGhpcy5wZW51bWJyYSA9ICggcGVudW1icmEgIT09IHVuZGVmaW5lZCApID8gcGVudW1icmEgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XG5cbn1cblxuU3BvdExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodCxcblxuXHRpc1Nwb3RMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gUG9pbnRMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxLCAwLjUsIDUwMCApICk7XG5cblx0dGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDQsIDIgKTtcblxuXHR0aGlzLl92aWV3cG9ydENvdW50ID0gNjtcblxuXHR0aGlzLl92aWV3cG9ydHMgPSBbXG5cdFx0Ly8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGggdGhlXG5cdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdC8vXG5cdFx0Ly8gIHh6WFpcblx0XHQvLyAgIHkgWVxuXHRcdC8vXG5cdFx0Ly8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uXG5cdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0Ly8gWSAtIFBvc2l0aXZlIHkgZGlyZWN0aW9uXG5cdFx0Ly8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXG5cdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0Ly8geiAtIE5lZ2F0aXZlIHogZGlyZWN0aW9uXG5cblx0XHQvLyBwb3NpdGl2ZSBYXG5cdFx0bmV3IFZlY3RvcjQoIDIsIDEsIDEsIDEgKSxcblx0XHQvLyBuZWdhdGl2ZSBYXG5cdFx0bmV3IFZlY3RvcjQoIDAsIDEsIDEsIDEgKSxcblx0XHQvLyBwb3NpdGl2ZSBaXG5cdFx0bmV3IFZlY3RvcjQoIDMsIDEsIDEsIDEgKSxcblx0XHQvLyBuZWdhdGl2ZSBaXG5cdFx0bmV3IFZlY3RvcjQoIDEsIDEsIDEsIDEgKSxcblx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0bmV3IFZlY3RvcjQoIDMsIDAsIDEsIDEgKSxcblx0XHQvLyBuZWdhdGl2ZSBZXG5cdFx0bmV3IFZlY3RvcjQoIDEsIDAsIDEsIDEgKVxuXHRdO1xuXG5cdHRoaXMuX2N1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHRoaXMuX2N1YmVVcHMgPSBbXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXG5cdF07XG5cbn1cblxuUG9pbnRMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludExpZ2h0U2hhZG93LFxuXG5cdGlzUG9pbnRMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaWNlczogZnVuY3Rpb24gKCBsaWdodCwgdmlld3BvcnRJbmRleCApIHtcblxuXHRcdGlmICggdmlld3BvcnRJbmRleCA9PT0gdW5kZWZpbmVkICkgdmlld3BvcnRJbmRleCA9IDA7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmEsXG5cdFx0XHRzaGFkb3dNYXRyaXggPSB0aGlzLm1hdHJpeCxcblx0XHRcdGxpZ2h0UG9zaXRpb25Xb3JsZCA9IHRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCxcblx0XHRcdGxvb2tUYXJnZXQgPSB0aGlzLl9sb29rVGFyZ2V0LFxuXHRcdFx0cHJvalNjcmVlbk1hdHJpeCA9IHRoaXMuX3Byb2pTY3JlZW5NYXRyaXg7XG5cblx0XHRsaWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYS5wb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblxuXHRcdGxvb2tUYXJnZXQuY29weSggY2FtZXJhLnBvc2l0aW9uICk7XG5cdFx0bG9va1RhcmdldC5hZGQoIHRoaXMuX2N1YmVEaXJlY3Rpb25zWyB2aWV3cG9ydEluZGV4IF0gKTtcblx0XHRjYW1lcmEudXAuY29weSggdGhpcy5fY3ViZVVwc1sgdmlld3BvcnRJbmRleCBdICk7XG5cdFx0Y2FtZXJhLmxvb2tBdCggbG9va1RhcmdldCApO1xuXHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBsaWdodFBvc2l0aW9uV29ybGQueCwgLSBsaWdodFBvc2l0aW9uV29ybGQueSwgLSBsaWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0cHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIHByb2pTY3JlZW5NYXRyaXggKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cblxuZnVuY3Rpb24gUG9pbnRMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRMaWdodCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIDQgKiBNYXRoLlBJICk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTtcdC8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi5cblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBQb2ludExpZ2h0U2hhZG93KCk7XG5cbn1cblxuUG9pbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LFxuXG5cdGlzUG9pbnRMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gKCBsZWZ0ICE9PSB1bmRlZmluZWQgKSA/IGxlZnQgOiAtIDE7XG5cdHRoaXMucmlnaHQgPSAoIHJpZ2h0ICE9PSB1bmRlZmluZWQgKSA/IHJpZ2h0IDogMTtcblx0dGhpcy50b3AgPSAoIHRvcCAhPT0gdW5kZWZpbmVkICkgPyB0b3AgOiAxO1xuXHR0aGlzLmJvdHRvbSA9ICggYm90dG9tICE9PSB1bmRlZmluZWQgKSA/IGJvdHRvbSA6IC0gMTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAyMDAwO1xuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cbk9ydGhvZ3JhcGhpY0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJhLFxuXG5cdGlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdHZhciBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjtcblxuXHRcdHZhciBsZWZ0ID0gY3ggLSBkeDtcblx0XHR2YXIgcmlnaHQgPSBjeCArIGR4O1xuXHRcdHZhciB0b3AgPSBjeSArIGR5O1xuXHRcdHZhciBib3R0b20gPSBjeSAtIGR5O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy5mdWxsV2lkdGggLyB0aGlzLnpvb207XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAvIHRoaXMuem9vbTtcblxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiB0aGlzLnZpZXcub2Zmc2V0WDtcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHRvcCAtPSBzY2FsZUggKiB0aGlzLnZpZXcub2Zmc2V0WTtcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblx0XHRkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0O1xuXHRcdGRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDtcblx0XHRkYXRhLm9iamVjdC50b3AgPSB0aGlzLnRvcDtcblx0XHRkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCkge1xuXG5cdExpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUwMCApICk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93LFxuXG5cdGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaWNlczogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdExpZ2h0U2hhZG93LnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKCB0aGlzLCBsaWdodCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxufVxuXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG5cdHRoaXMudGV4dHVyZXMgPSB7fTtcblxufVxuXG5NYXRlcmlhbExvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWF0ZXJpYWxMb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggc2NvcGUucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1hdGVyaWFsID0gbmV3IE1hdGVyaWFsc1sganNvbi50eXBlIF0oKTtcblxuXHRcdGlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkO1xuXHRcdGlmICgganNvbi5uYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lO1xuXHRcdGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7XG5cdFx0aWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7XG5cdFx0aWYgKCBqc29uLnNoZWVuICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlbiA9IG5ldyBDb2xvcigpLnNldEhleCgganNvbi5zaGVlbiApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXQgPSBqc29uLmNsZWFyY29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyY29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uY29tYmluZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29tYmluZSA9IGpzb24uY29tYmluZTtcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblxuXHRcdGlmICgganNvbi5zdGVuY2lsV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSA9IGpzb24uc3RlbmNpbFdyaXRlO1xuXHRcdGlmICgganNvbi5zdGVuY2lsV3JpdGVNYXNrICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrID0ganNvbi5zdGVuY2lsV3JpdGVNYXNrO1xuXHRcdGlmICgganNvbi5zdGVuY2lsRnVuYyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZ1bmMgPSBqc29uLnN0ZW5jaWxGdW5jO1xuXHRcdGlmICgganNvbi5zdGVuY2lsUmVmICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsUmVmID0ganNvbi5zdGVuY2lsUmVmO1xuXHRcdGlmICgganNvbi5zdGVuY2lsRnVuY01hc2sgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayA9IGpzb24uc3RlbmNpbEZ1bmNNYXNrO1xuXHRcdGlmICgganNvbi5zdGVuY2lsRmFpbCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZhaWwgPSBqc29uLnN0ZW5jaWxGYWlsO1xuXHRcdGlmICgganNvbi5zdGVuY2lsWkZhaWwgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCA9IGpzb24uc3RlbmNpbFpGYWlsO1xuXHRcdGlmICgganNvbi5zdGVuY2lsWlBhc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyA9IGpzb24uc3RlbmNpbFpQYXNzO1xuXG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53aXJlZnJhbWU7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoID0ganNvbi53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIGpzb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdGF0aW9uID0ganNvbi5yb3RhdGlvbjtcblxuXHRcdGlmICgganNvbi5saW5ld2lkdGggIT09IDEgKSBtYXRlcmlhbC5saW5ld2lkdGggPSBqc29uLmxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24uZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRhc2hTaXplID0ganNvbi5kYXNoU2l6ZTtcblx0XHRpZiAoIGpzb24uZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ2FwU2l6ZSA9IGpzb24uZ2FwU2l6ZTtcblx0XHRpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNjYWxlID0ganNvbi5zY2FsZTtcblxuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0ganNvbi5wb2x5Z29uT2Zmc2V0O1xuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yID0ganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyA9IGpzb24ucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0aWYgKCBqc29uLnNraW5uaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5za2lubmluZyA9IGpzb24uc2tpbm5pbmc7XG5cdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhUYXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7XG5cdFx0aWYgKCBqc29uLm1vcnBoTm9ybWFscyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhOb3JtYWxzID0ganNvbi5tb3JwaE5vcm1hbHM7XG5cdFx0aWYgKCBqc29uLmRpdGhlcmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGl0aGVyaW5nID0ganNvbi5kaXRoZXJpbmc7XG5cblx0XHRpZiAoIGpzb24udmVydGV4VGFuZ2VudHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFRhbmdlbnRzID0ganNvbi52ZXJ0ZXhUYW5nZW50cztcblxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xuXG5cdFx0aWYgKCBqc29uLnRvbmVNYXBwZWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRvbmVNYXBwZWQgPSBqc29uLnRvbmVNYXBwZWQ7XG5cblx0XHRpZiAoIGpzb24udXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTtcblxuXHRcdGlmICgganNvbi52ZXJ0ZXhDb2xvcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YganNvbi52ZXJ0ZXhDb2xvcnMgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLnZlcnRleENvbG9ycyA9ICgganNvbi52ZXJ0ZXhDb2xvcnMgPiAwICkgPyB0cnVlIDogZmFsc2U7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNoYWRlciBNYXRlcmlhbFxuXG5cdFx0aWYgKCBqc29uLnVuaWZvcm1zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIGpzb24udW5pZm9ybXMgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm0gPSBqc29uLnVuaWZvcm1zWyBuYW1lIF07XG5cblx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXSA9IHt9O1xuXG5cdFx0XHRcdHN3aXRjaCAoIHVuaWZvcm0udHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ3QnOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IGdldFRleHR1cmUoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnYyc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IENvbG9yKCkuc2V0SGV4KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3YyJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICd2Myc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAndjQnOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3I0KCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ20zJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4MygpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXG5cdFx0XHRcdFx0Y2FzZSAnbTQnOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZWZpbmVzID0ganNvbi5kZWZpbmVzO1xuXHRcdGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyO1xuXHRcdGlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyO1xuXG5cdFx0aWYgKCBqc29uLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBqc29uLmV4dGVuc2lvbnMgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwuZXh0ZW5zaW9uc1sga2V5IF0gPSBqc29uLmV4dGVuc2lvbnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLnNoYWRpbmcgPT09IDE7IC8vIFRIUkVFLkZsYXRTaGFkaW5nXG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblx0XHRpZiAoIGpzb24ubWF0Y2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXRjYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hdGNhcCApO1xuXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxNYXBUeXBlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblx0XHRpZiAoIGpzb24uZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPSBqc29uLmVudk1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXHRcdGlmICgganNvbi5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXRNYXAgKTtcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdFJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXROb3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICk7XG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIERvbiBNY0N1cmR5IC8gaHR0cHM6Ly93d3cuZG9ubWNjdXJkeS5jb21cbiAqL1xuXG52YXIgTG9hZGVyVXRpbHMgPSB7XG5cblx0ZGVjb2RlVGV4dDogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdC8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2hcblx0XHQvLyB0aHJvd3MgYSBcIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy5cblxuXHRcdHZhciBzID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIEltcGxpY2l0bHkgYXNzdW1lcyBsaXR0bGUtZW5kaWFuLlxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJheVsgaSBdICk7XG5cblx0XHR9XG5cblx0XHR0cnkge1xuXG5cdFx0XHQvLyBtZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLlxuXG5cdFx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KCBlc2NhcGUoIHMgKSApO1xuXG5cdFx0fSBjYXRjaCAoIGUgKSB7IC8vIHNlZSAjMTYzNThcblxuXHRcdFx0cmV0dXJuIHM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknO1xuXHR0aGlzLm1heEluc3RhbmNlZENvdW50ID0gdW5kZWZpbmVkO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSBzb3VyY2UubWF4SW5zdGFuY2VkQ291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLm1heEluc3RhbmNlZENvdW50ID0gdGhpcy5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdGRhdGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IHRydWU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRpZiAoIHR5cGVvZiAoIG5vcm1hbGl6ZWQgKSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRtZXNoUGVyQXR0cmlidXRlID0gbm9ybWFsaXplZDtcblxuXHRcdG5vcm1hbGl6ZWQgPSBmYWxzZTtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IFRoZSBjb25zdHJ1Y3RvciBub3cgZXhwZWN0cyBub3JtYWxpemVkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4nICk7XG5cblx0fVxuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKVx0e1xuXG5cdFx0dmFyIGRhdGEgPSBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRkYXRhLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnlMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxufVxuXG5CdWZmZXJHZW9tZXRyeUxvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQnVmZmVyR2VvbWV0cnlMb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggc2NvcGUucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBqc29uLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPyBuZXcgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cdFx0XHR2YXIgYnVmZmVyQXR0cmlidXRlQ29uc3RyID0gYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID8gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIDogQnVmZmVyQXR0cmlidXRlO1xuXHRcdFx0dmFyIGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBidWZmZXJBdHRyaWJ1dGVDb25zdHIoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKTtcblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoIGtleSwgYnVmZmVyQXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0ganNvbi5kYXRhLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xuXHRcdFx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdFx0XHR2YXIgYnVmZmVyQXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XG5cdFx0XHRcdFx0YXJyYXkucHVzaCggYnVmZmVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0ganNvbi5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0Z2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5uYW1lICkgZ2VvbWV0cnkubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24udXNlckRhdGEgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHQvLyBXb3JrYXJvdW5kIGZvciBJRTExIHByZSBLQjI5Mjk0MzcuIFNlZSAjMTE0NDBcblx0VWludDhDbGFtcGVkQXJyYXk6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OENsYW1wZWRBcnJheSA6IFVpbnQ4QXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxufVxuXG5PYmplY3RMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9iamVjdExvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBwYXRoID0gKCB0aGlzLnBhdGggPT09ICcnICkgPyBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICkgOiB0aGlzLnBhdGg7XG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSB0aGlzLnJlc291cmNlUGF0aCB8fCBwYXRoO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBudWxsO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApO1xuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgc2hhcGVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnk7XG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCb3hHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQm94QnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N1YmVHZW9tZXRyeSc6IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlXG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1R1YmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVHViZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBvbmx5IHdvcmtzIGZvciBidWlsdC1pbiBjdXJ2ZXMgKGUuZy4gQ2F0bXVsbFJvbUN1cnZlMykuXG5cdFx0XHRcdFx0XHQvLyBVc2VyIGRlZmluZWQgY3VydmVzIG9yIGluc3RhbmNlcyBvZiBDdXJ2ZVBhdGggd2lsbCBub3QgYmUgZGVzZXJpYWxpemVkLlxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdG5ldyBDdXJ2ZXNbIGRhdGEucGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZGF0YS5wYXRoICksXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jbG9zZWRcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBvaW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS52ZXJ0aWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbmRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHR2YXIgZ2VvbWV0cnlTaGFwZXMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGogXSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmN1cnZlU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cblx0XHRcdFx0XHRjYXNlICdFeHRydWRlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0V4dHJ1ZGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdHZhciBnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgZXh0cnVkZVBhdGggPSBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cblx0XHRcdFx0XHRcdGlmICggZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGggPSBuZXcgQ3VydmVzWyBleHRydWRlUGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZXh0cnVkZVBhdGggKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3B0aW9uc1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBMb2FkaW5nIFwiR2VvbWV0cnlcIiBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuJyApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBcIicgKyBkYXRhLnR5cGUgKyAnXCInICk7XG5cblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS5uYW1lID0gZGF0YS5uYW1lO1xuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgPT09IHRydWUgJiYgZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xuXG5cdFx0XHRcdGdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyaWVzO1xuXG5cdH0sXG5cblx0cGFyc2VNYXRlcmlhbHM6IGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZXMgKSB7XG5cblx0XHR2YXIgY2FjaGUgPSB7fTsgLy8gTXVsdGlNYXRlcmlhbFxuXHRcdHZhciBtYXRlcmlhbHMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhLm1hdGVyaWFscy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IGRhdGEubWF0ZXJpYWxzWyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggY2FjaGVbIG1hdGVyaWFsLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gPSBsb2FkZXIucGFyc2UoIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggY2FjaGVbIG1hdGVyaWFsLnV1aWQgXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIGNhY2hlWyBkYXRhLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjYWNoZVsgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBjYWNoZVsgZGF0YS51dWlkIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG5cdH0sXG5cblx0cGFyc2VBbmltYXRpb25zOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBkYXRhLnV1aWQgIT09IHVuZGVmaW5lZCApIGNsaXAudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblxuXHR9LFxuXG5cdHBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cdFx0dmFyIGltYWdlcyA9IHt9O1xuXG5cdFx0ZnVuY3Rpb24gbG9hZEltYWdlKCB1cmwgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0cmV0dXJuIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIG1hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApO1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCBtYW5hZ2VyICk7XG5cdFx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGpzb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgdXJsID0gaW1hZ2UudXJsO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdFx0XHQvLyBsb2FkIGFycmF5IG9mIGltYWdlcyBlLmcgQ3ViZVRleHR1cmVcblxuXHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdXJsLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgY3VycmVudFVybCA9IHVybFsgaiBdO1xuXG5cdFx0XHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggY3VycmVudFVybCApID8gY3VycmVudFVybCA6IHNjb3BlLnJlc291cmNlUGF0aCArIGN1cnJlbnRVcmw7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdLnB1c2goIGxvYWRJbWFnZSggcGF0aCApICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGxvYWQgc2luZ2xlIGltYWdlXG5cblx0XHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS5yZXNvdXJjZVBhdGggKyBpbWFnZS51cmw7XG5cblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlcztcblxuXHR9LFxuXG5cdHBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4nLCB2YWx1ZSApO1xuXG5cdFx0XHRyZXR1cm4gdHlwZVsgdmFsdWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0ZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cdFx0XHRcdGlmICggZGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnR5cGUgPSBkYXRhLnR5cGU7XG5cdFx0XHRcdGlmICggZGF0YS5lbmNvZGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5lbmNvZGluZyA9IGRhdGEuZW5jb2Rpbmc7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdGlmICggZGF0YS5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgPSBkYXRhLnByZW11bHRpcGx5QWxwaGE7XG5cdFx0XHRcdGlmICggZGF0YS51bnBhY2tBbGlnbm1lbnQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ID0gZGF0YS51bnBhY2tBbGlnbm1lbnQ7XG5cblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xuXG5cdH0sXG5cblx0cGFyc2VPYmplY3Q6IGZ1bmN0aW9uICggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkge1xuXG5cdFx0dmFyIG9iamVjdDtcblxuXHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdXVpZCA9IG5hbWVbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCB1dWlkICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gYXJyYXk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRlcmlhbHNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0Y2FzZSAnU2NlbmUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTY2VuZSgpO1xuXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0ludGVnZXIoIGRhdGEuYmFja2dyb3VuZCApICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IG5ldyBDb2xvciggZGF0YS5iYWNrZ3JvdW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cubmVhciwgZGF0YS5mb2cuZmFyICk7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nRXhwMicgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nRXhwMiggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLmRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1BlcnNwZWN0aXZlQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5mb2N1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZvY3VzID0gZGF0YS5mb2N1cztcblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7XG5cdFx0XHRcdGlmICggZGF0YS5maWxtT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdPcnRob2dyYXBoaWNDYW1lcmEnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0FtYmllbnRMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEFtYmllbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUmVjdEFyZWFMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwb3RMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuYW5nbGUsIGRhdGEucGVudW1icmEsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTa2lubmVkTWVzaCc6XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuJyApO1xuXG5cdFx0XHRjYXNlICdNZXNoJzpcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnSW5zdGFuY2VkTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblx0XHRcdFx0dmFyIGNvdW50ID0gZGF0YS5jb3VudDtcblx0XHRcdFx0dmFyIGluc3RhbmNlTWF0cml4ID0gZGF0YS5pbnN0YW5jZU1hdHJpeDtcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgSW5zdGFuY2VkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCApO1xuXHRcdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBpbnN0YW5jZU1hdHJpeC5hcnJheSApLCAxNiApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblx0XHRpZiAoIGRhdGEubGF5ZXJzICE9PSB1bmRlZmluZWQgKSBvYmplY3QubGF5ZXJzLm1hc2sgPSBkYXRhLmxheWVycztcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHRpZiAoIGRhdGEuYXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmF1dG9VcGRhdGUgPSBkYXRhLmF1dG9VcGRhdGU7XG5cblx0XHRcdHZhciBsZXZlbHMgPSBkYXRhLmxldmVscztcblxuXHRcdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGwgXTtcblx0XHRcdFx0dmFyIGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG59ICk7XG5cbnZhciBURVhUVVJFX01BUFBJTkcgPSB7XG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzogU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9XUkFQUElORyA9IHtcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXG59O1xuXG52YXIgVEVYVFVSRV9GSUxURVIgPSB7XG5cdE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcixcblx0TGluZWFyRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXG59O1xuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vY2xpY2t0b3JlbGVhc2UuY29tL1xuICovXG5cblxuZnVuY3Rpb24gSW1hZ2VCaXRtYXBMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0fVxuXG5cdGlmICggdHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdH1cblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG5cdHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcblxufVxuXG5JbWFnZUJpdG1hcExvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW1hZ2VCaXRtYXBMb2FkZXIsXG5cblx0c2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyggb3B0aW9ucyApIHtcblxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdGZldGNoKCB1cmwgKS50aGVuKCBmdW5jdGlvbiAoIHJlcyApIHtcblxuXHRcdFx0cmV0dXJuIHJlcy5ibG9iKCk7XG5cblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCBibG9iICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBXb3JrYXJvdW5kIGZvciBGaXJlRm94LiBJdCBjYXVzZXMgYW4gZXJyb3IgaWYgeW91IHBhc3Mgb3B0aW9ucy5cblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iLCBzY29wZS5vcHRpb25zICk7XG5cblx0XHRcdH1cblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGltYWdlQml0bWFwICkge1xuXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGltYWdlQml0bWFwICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9ICkuY2F0Y2goIGZ1bmN0aW9uICggZSApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZSApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0fSApO1xuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIG1pbmltYWwgY2xhc3MgZm9yIHByb3hpbmcgZnVuY3Rpb25zIHRvIFBhdGguIFJlcGxhY2VzIG9sZCBcImV4dHJhY3RTdWJwYXRocygpXCJcbiAqKi9cblxuZnVuY3Rpb24gU2hhcGVQYXRoKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZVBhdGgnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHR0aGlzLnN1YlBhdGhzID0gW107XG5cdHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgpO1xuXHRcdHRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApO1xuXHRcdHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuXG5mdW5jdGlvbiBGb250KCBkYXRhICkge1xuXG5cdHRoaXMudHlwZSA9ICdGb250JztcblxuXHR0aGlzLmRhdGEgPSBkYXRhO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvbnQucHJvdG90eXBlLCB7XG5cblx0aXNGb250OiB0cnVlLFxuXG5cdGdlbmVyYXRlU2hhcGVzOiBmdW5jdGlvbiAoIHRleHQsIHNpemUgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cblx0XHR2YXIgc2hhcGVzID0gW107XG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIHRoaXMuZGF0YSApO1xuXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCBkYXRhICkge1xuXG5cdHZhciBjaGFycyA9IEFycmF5LmZyb20gPyBBcnJheS5mcm9tKCB0ZXh0ICkgOiBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTsgLy8gd29ya2Fyb3VuZCBmb3IgSUUxMSwgc2VlICMxMzk4OFxuXHR2YXIgc2NhbGUgPSBzaXplIC8gZGF0YS5yZXNvbHV0aW9uO1xuXHR2YXIgbGluZV9oZWlnaHQgPSAoIGRhdGEuYm91bmRpbmdCb3gueU1heCAtIGRhdGEuYm91bmRpbmdCb3gueU1pbiArIGRhdGEudW5kZXJsaW5lVGhpY2tuZXNzICkgKiBzY2FsZTtcblxuXHR2YXIgcGF0aHMgPSBbXTtcblxuXHR2YXIgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBjaGFyID0gY2hhcnNbIGkgXTtcblxuXHRcdGlmICggY2hhciA9PT0gJ1xcbicgKSB7XG5cblx0XHRcdG9mZnNldFggPSAwO1xuXHRcdFx0b2Zmc2V0WSAtPSBsaW5lX2hlaWdodDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciByZXQgPSBjcmVhdGVQYXRoKCBjaGFyLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApO1xuXHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBwYXRocztcblxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRoKCBjaGFyLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApIHtcblxuXHR2YXIgZ2x5cGggPSBkYXRhLmdseXBoc1sgY2hhciBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTtcblxuXHRpZiAoICEgZ2x5cGggKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRm9udDogY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgZG9lcyBub3QgZXhpc3RzIGluIGZvbnQgZmFtaWx5ICcgKyBkYXRhLmZhbWlseU5hbWUgKyAnLicgKTtcblxuXHRcdHJldHVybjtcblxuXHR9XG5cblx0dmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7XG5cblx0dmFyIHgsIHksIGNweCwgY3B5LCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyO1xuXG5cdGlmICggZ2x5cGgubyApIHtcblxuXHRcdHZhciBvdXRsaW5lID0gZ2x5cGguX2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3BsaXQoICcgJyApICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGw7ICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBhY3Rpb24gKSB7XG5cblx0XHRcdFx0Y2FzZSAnbSc6IC8vIG1vdmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2wnOiAvLyBsaW5lVG9cblxuXHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGNweDEsIGNweTEsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5iZXppZXJDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuRm9udExvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRm9udExvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX2NvbnRleHQ7XG5cbnZhciBBdWRpb0NvbnRleHQgPSB7XG5cblx0Z2V0Q29udGV4dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBfY29udGV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfY29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gX2NvbnRleHQ7XG5cblx0fSxcblxuXHRzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0X2NvbnRleHQgPSB2YWx1ZTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxufVxuXG5BdWRpb0xvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9Mb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnVmZmVyLiBUaGUgYGRlY29kZUF1ZGlvRGF0YWAgbWV0aG9kXG5cdFx0XHQvLyBkZXRhY2hlcyB0aGUgYnVmZmVyIHdoZW4gY29tcGxldGUsIHByZXZlbnRpbmcgcmV1c2UuXG5cdFx0XHR2YXIgYnVmZmVyQ29weSA9IGJ1ZmZlci5zbGljZSggMCApO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyQ29weSwgZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcblxuXHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBQcmltYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG4gKlxuICogU2Vjb25kYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly93d3cucHBzbG9hbi5vcmcvcHVibGljYXRpb25zL1N0dXBpZFNIMzYucGRmXG4gKi9cblxuLy8gMy1iYW5kIFNIIGRlZmluZWQgYnkgOSBjb2VmZmljaWVudHNcblxuZnVuY3Rpb24gU3BoZXJpY2FsSGFybW9uaWNzMygpIHtcblxuXHR0aGlzLmNvZWZmaWNpZW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHR0aGlzLmNvZWZmaWNpZW50cy5wdXNoKCBuZXcgVmVjdG9yMygpICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbEhhcm1vbmljczMucHJvdG90eXBlLCB7XG5cblx0aXNTcGhlcmljYWxIYXJtb25pY3MzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBjb2VmZmljaWVudHMgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmNvcHkoIGNvZWZmaWNpZW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHplcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uc2V0KCAwLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGdldCB0aGUgcmFkaWFuY2UgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbm9ybWFsXG5cdC8vIHRhcmdldCBpcyBhIFZlY3RvcjNcblx0Z2V0QXQ6IGZ1bmN0aW9uICggbm9ybWFsLCB0YXJnZXQgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XG5cblx0XHR2YXIgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuMjgyMDk1ICk7XG5cblx0XHQvLyBiYW5kIDFcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMSBdLCAwLjQ4ODYwMyAqIHkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMiBdLCAwLjQ4ODYwMyAqIHogKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMyBdLCAwLjQ4ODYwMyAqIHggKTtcblxuXHRcdC8vIGJhbmQgMlxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA0IF0sIDEuMDkyNTQ4ICogKCB4ICogeSApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDUgXSwgMS4wOTI1NDggKiAoIHkgKiB6ICkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjMxNTM5MiAqICggMy4wICogeiAqIHogLSAxLjAgKSApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDEuMDkyNTQ4ICogKCB4ICogeiApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDggXSwgMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdC8vIGdldCB0aGUgaXJyYWRpYW5jZSAocmFkaWFuY2UgY29udm9sdmVkIHdpdGggY29zaW5lIGxvYmUpIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG5vcm1hbFxuXHQvLyB0YXJnZXQgaXMgYSBWZWN0b3IzXG5cdC8vIGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZlxuXHRnZXRJcnJhZGlhbmNlQXQ6IGZ1bmN0aW9uICggbm9ybWFsLCB0YXJnZXQgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XG5cblx0XHR2YXIgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuODg2MjI3ICk7IC8vIM+AICogMC4yODIwOTVcblxuXHRcdC8vIGJhbmQgMVxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAxIF0sIDIuMCAqIDAuNTExNjY0ICogeSApOyAvLyAoIDIgKiDPgCAvIDMgKSAqIDAuNDg4NjAzXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDIgXSwgMi4wICogMC41MTE2NjQgKiB6ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDMgXSwgMi4wICogMC41MTE2NjQgKiB4ICk7XG5cblx0XHQvLyBiYW5kIDJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNCBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB5ICk7IC8vICggz4AgLyA0ICkgKiAxLjA5MjU0OFxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA1IF0sIDIuMCAqIDAuNDI5MDQzICogeSAqIHogKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTsgLy8gKCDPgCAvIDQgKSAqIDAuMzE1MzkyICogM1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDIuMCAqIDAuNDI5MDQzICogeCAqIHogKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgOCBdLCAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApICk7IC8vICggz4AgLyA0ICkgKiAwLjU0NjI3NFxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBzaCApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkKCBzaC5jb2VmZmljaWVudHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRTSDogZnVuY3Rpb24gKCBzaCwgcyApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkU2NhbGVkVmVjdG9yKCBzaC5jb2VmZmljaWVudHNbIGkgXSwgcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5tdWx0aXBseVNjYWxhciggcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHNoLCBhbHBoYSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0ubGVycCggc2guY29lZmZpY2llbnRzWyBpIF0sIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBzaCApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggISB0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmVxdWFscyggc2guY29lZmZpY2llbnRzWyBpIF0gKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzaCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggc2guY29lZmZpY2llbnRzICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGNvZWZmaWNpZW50c1sgaSBdLmZyb21BcnJheSggYXJyYXksIG9mZnNldCArICggaSAqIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIGNvZWZmaWNpZW50cyA9IHRoaXMuY29lZmZpY2llbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0Y29lZmZpY2llbnRzWyBpIF0udG9BcnJheSggYXJyYXksIG9mZnNldCArICggaSAqIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWxIYXJtb25pY3MzLCB7XG5cblx0Ly8gZXZhbHVhdGUgdGhlIGJhc2lzIGZ1bmN0aW9uc1xuXHQvLyBzaEJhc2lzIGlzIGFuIEFycmF5WyA5IF1cblx0Z2V0QmFzaXNBdDogZnVuY3Rpb24gKCBub3JtYWwsIHNoQmFzaXMgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XG5cblx0XHQvLyBiYW5kIDBcblx0XHRzaEJhc2lzWyAwIF0gPSAwLjI4MjA5NTtcblxuXHRcdC8vIGJhbmQgMVxuXHRcdHNoQmFzaXNbIDEgXSA9IDAuNDg4NjAzICogeTtcblx0XHRzaEJhc2lzWyAyIF0gPSAwLjQ4ODYwMyAqIHo7XG5cdFx0c2hCYXNpc1sgMyBdID0gMC40ODg2MDMgKiB4O1xuXG5cdFx0Ly8gYmFuZCAyXG5cdFx0c2hCYXNpc1sgNCBdID0gMS4wOTI1NDggKiB4ICogeTtcblx0XHRzaEJhc2lzWyA1IF0gPSAxLjA5MjU0OCAqIHkgKiB6O1xuXHRcdHNoQmFzaXNbIDYgXSA9IDAuMzE1MzkyICogKCAzICogeiAqIHogLSAxICk7XG5cdFx0c2hCYXNpc1sgNyBdID0gMS4wOTI1NDggKiB4ICogejtcblx0XHRzaEJhc2lzWyA4IF0gPSAwLjU0NjI3NCAqICggeCAqIHggLSB5ICogeSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIEEgTGlnaHRQcm9iZSBpcyBhIHNvdXJjZSBvZiBpbmRpcmVjdC1kaWZmdXNlIGxpZ2h0XG4gKi9cblxuZnVuY3Rpb24gTGlnaHRQcm9iZSggc2gsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdHRoaXMuc2ggPSAoIHNoICE9PSB1bmRlZmluZWQgKSA/IHNoIDogbmV3IFNwaGVyaWNhbEhhcm1vbmljczMoKTtcblxufVxuXG5MaWdodFByb2JlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpZ2h0UHJvYmUsXG5cblx0aXNMaWdodFByb2JlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLnNoLmNvcHkoIHNvdXJjZS5zaCApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0Ly8gZGF0YS5zaCA9IHRoaXMuc2gudG9BcnJheSgpOyAvLyB0b2RvXG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRQcm9iZSggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHRQcm9iZS5jYWxsKCB0aGlzLCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKS5zZXQoIHNreUNvbG9yICk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoKS5zZXQoIGdyb3VuZENvbG9yICk7XG5cblx0dmFyIHNreSA9IG5ldyBWZWN0b3IzKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdHZhciBncm91bmQgPSBuZXcgVmVjdG9yMyggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApO1xuXG5cdC8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHNob3VsZCA9IDEgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTtcblx0dmFyIGMwID0gTWF0aC5zcXJ0KCBNYXRoLlBJICk7XG5cdHZhciBjMSA9IGMwICogTWF0aC5zcXJ0KCAwLjc1ICk7XG5cblx0dGhpcy5zaC5jb2VmZmljaWVudHNbIDAgXS5jb3B5KCBza3kgKS5hZGQoIGdyb3VuZCApLm11bHRpcGx5U2NhbGFyKCBjMCApO1xuXHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMSBdLmNvcHkoIHNreSApLnN1YiggZ3JvdW5kICkubXVsdGlwbHlTY2FsYXIoIGMxICk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0UHJvYmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRQcm9iZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHRQcm9iZSxcblxuXHRpc0hlbWlzcGhlcmVMaWdodFByb2JlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeyAvLyBtb2RpZnlpbmcgY29sb3JzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkXG5cblx0XHRMaWdodFByb2JlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gTGlnaHRQcm9iZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdC8vIGRhdGEuc2ggPSB0aGlzLnNoLnRvQXJyYXkoKTsgLy8gdG9kb1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQW1iaWVudExpZ2h0UHJvYmUoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHRQcm9iZS5jYWxsKCB0aGlzLCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKS5zZXQoIGNvbG9yICk7XG5cblx0Ly8gd2l0aG91dCBleHRyYSBmYWN0b3Igb2YgUEkgaW4gdGhlIHNoYWRlciwgd291bGQgYmUgMiAvIE1hdGguc3FydCggTWF0aC5QSSApO1xuXHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMCBdLnNldCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApLm11bHRpcGx5U2NhbGFyKCAyICogTWF0aC5zcXJ0KCBNYXRoLlBJICkgKTtcblxufVxuXG5BbWJpZW50TGlnaHRQcm9iZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFByb2JlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFtYmllbnRMaWdodFByb2JlLFxuXG5cdGlzQW1iaWVudExpZ2h0UHJvYmU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7IC8vIG1vZGlmeWluZyBjb2xvciBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuXG5cdFx0TGlnaHRQcm9iZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0UHJvYmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHQvLyBkYXRhLnNoID0gdGhpcy5zaC50b0FycmF5KCk7IC8vIHRvZG9cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG52YXIgX2V5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcbnZhciBfZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTdGVyZW9DYW1lcmEoKSB7XG5cblx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0dGhpcy5hc3BlY3QgPSAxO1xuXG5cdHRoaXMuZXllU2VwID0gMC4wNjQ7XG5cblx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5fY2FjaGUgPSB7XG5cdFx0Zm9jdXM6IG51bGwsXG5cdFx0Zm92OiBudWxsLFxuXHRcdGFzcGVjdDogbnVsbCxcblx0XHRuZWFyOiBudWxsLFxuXHRcdGZhcjogbnVsbCxcblx0XHR6b29tOiBudWxsLFxuXHRcdGV5ZVNlcDogbnVsbFxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggY2FtZXJhICkge1xuXG5cdFx0dmFyIGNhY2hlID0gdGhpcy5fY2FjaGU7XG5cblx0XHR2YXIgbmVlZHNVcGRhdGUgPSBjYWNoZS5mb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGNhY2hlLmZvdiAhPT0gY2FtZXJhLmZvdiB8fFxuXHRcdFx0Y2FjaGUuYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgY2FjaGUubmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcblx0XHRcdGNhY2hlLmZhciAhPT0gY2FtZXJhLmZhciB8fCBjYWNoZS56b29tICE9PSBjYW1lcmEuem9vbSB8fCBjYWNoZS5leWVTZXAgIT09IHRoaXMuZXllU2VwO1xuXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0Y2FjaGUuZm9jdXMgPSBjYW1lcmEuZm9jdXM7XG5cdFx0XHRjYWNoZS5mb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0Y2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0Y2FjaGUubmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdFx0Y2FjaGUuZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdGNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTtcblx0XHRcdGNhY2hlLmV5ZVNlcCA9IHRoaXMuZXllU2VwO1xuXG5cdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xuXG5cdFx0XHR2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7XG5cdFx0XHR2YXIgZXllU2VwSGFsZiA9IGNhY2hlLmV5ZVNlcCAvIDI7XG5cdFx0XHR2YXIgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwSGFsZiAqIGNhY2hlLm5lYXIgLyBjYWNoZS5mb2N1cztcblx0XHRcdHZhciB5bWF4ID0gKCBjYWNoZS5uZWFyICogTWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogY2FjaGUuZm92ICogMC41ICkgKSAvIGNhY2hlLnpvb207XG5cdFx0XHR2YXIgeG1pbiwgeG1heDtcblxuXHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0X2V5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcEhhbGY7XG5cdFx0XHRfZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXBIYWxmO1xuXG5cdFx0XHQvLyBmb3IgbGVmdCBleWVcblxuXHRcdFx0eG1pbiA9IC0geW1heCAqIGNhY2hlLmFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdHhtYXggPSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogY2FjaGUubmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHQvLyBmb3IgcmlnaHQgZXllXG5cblx0XHRcdHhtaW4gPSAtIHltYXggKiBjYWNoZS5hc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHR4bWF4ID0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIGNhY2hlLm5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggX2V5ZUxlZnQgKTtcblx0XHR0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIF9leWVSaWdodCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2xvY2soIGF1dG9TdGFydCApIHtcblxuXHR0aGlzLmF1dG9TdGFydCA9ICggYXV0b1N0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IGF1dG9TdGFydCA6IHRydWU7XG5cblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9sZFRpbWUgPSAwO1xuXHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblxuXHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHtcblxuXHRzdGFydDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsgLy8gc2VlICMxMDczMlxuXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLmF1dG9TdGFydCA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0RWxhcHNlZFRpbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcblxuXHR9LFxuXG5cdGdldERlbHRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGlmZiA9IDA7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0XHRyZXR1cm4gMDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR2YXIgbmV3VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpO1xuXG5cdFx0XHRkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwO1xuXHRcdFx0dGhpcy5vbGRUaW1lID0gbmV3VGltZTtcblxuXHRcdFx0dGhpcy5lbGFwc2VkVGltZSArPSBkaWZmO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX3Bvc2l0aW9uJDIgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9xdWF0ZXJuaW9uJDMgPSBuZXcgUXVhdGVybmlvbigpO1xudmFyIF9zY2FsZSQxID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdHRoaXMudGltZURlbHRhID0gMDtcblxuXHQvLyBwcml2YXRlXG5cblx0dGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTtcblxufVxuXG5BdWRpb0xpc3RlbmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvTGlzdGVuZXIsXG5cblx0Z2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW47XG5cblx0fSxcblxuXHRyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uICggKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dmFyIGxpc3RlbmVyID0gdGhpcy5jb250ZXh0Lmxpc3RlbmVyO1xuXHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHR0aGlzLnRpbWVEZWx0YSA9IHRoaXMuX2Nsb2NrLmdldERlbHRhKCk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uJDIsIF9xdWF0ZXJuaW9uJDMsIF9zY2FsZSQxICk7XG5cblx0XHRfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDMgKTtcblxuXHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSAoc2VlICMxNDM5MylcblxuXHRcdFx0dmFyIGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLnRpbWVEZWx0YTtcblxuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMi54LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbiQyLnksIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDIueiwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnksIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueiwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC54LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLnksIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueiwgZW5kVGltZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bGlzdGVuZXIuc2V0UG9zaXRpb24oIF9wb3NpdGlvbiQyLngsIF9wb3NpdGlvbiQyLnksIF9wb3NpdGlvbiQyLnogKTtcblx0XHRcdGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24ueCwgX29yaWVudGF0aW9uLnksIF9vcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0F1ZGlvJztcblxuXHR0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmRldHVuZSA9IDA7XG5cdHRoaXMubG9vcCA9IGZhbHNlO1xuXHR0aGlzLmxvb3BTdGFydCA9IDA7XG5cdHRoaXMubG9vcEVuZCA9IDA7XG5cdHRoaXMub2Zmc2V0ID0gMDtcblx0dGhpcy5kdXJhdGlvbiA9IHVuZGVmaW5lZDtcblx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHRydWU7XG5cdHRoaXMuc291cmNlVHlwZSA9ICdlbXB0eSc7XG5cblx0dGhpcy5fc3RhcnRlZEF0ID0gMDtcblx0dGhpcy5fcGF1c2VkQXQgPSAwO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TWVkaWFFbGVtZW50U291cmNlOiBmdW5jdGlvbiAoIG1lZGlhRWxlbWVudCApIHtcblxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhTm9kZSc7XG5cdFx0dGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKCBtZWRpYUVsZW1lbnQgKTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TWVkaWFTdHJlYW1Tb3VyY2U6IGZ1bmN0aW9uICggbWVkaWFTdHJlYW0gKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdtZWRpYVN0cmVhbU5vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBtZWRpYVN0cmVhbSApO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBsYXk6IGZ1bmN0aW9uICggZGVsYXkgKSB7XG5cblx0XHRpZiAoIGRlbGF5ID09PSB1bmRlZmluZWQgKSBkZWxheSA9IDA7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLl9zdGFydGVkQXQgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyBkZWxheTtcblxuXHRcdHZhciBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5sb29wU3RhcnQgPSB0aGlzLmxvb3BTdGFydDtcblx0XHRzb3VyY2UubG9vcEVuZCA9IHRoaXMubG9vcEVuZDtcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XG5cdFx0c291cmNlLnN0YXJ0KCB0aGlzLl9zdGFydGVkQXQsIHRoaXMuX3BhdXNlZEF0ICsgdGhpcy5vZmZzZXQsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXG5cdFx0dGhpcy5zZXREZXR1bmUoIHRoaXMuZGV0dW5lICk7XG5cdFx0dGhpcy5zZXRQbGF5YmFja1JhdGUoIHRoaXMucGxheWJhY2tSYXRlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuX3BhdXNlZEF0ICs9IE1hdGgubWF4KCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLl9zdGFydGVkQXQsIDAgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0XHR0aGlzLnNvdXJjZS5vbmVuZGVkID0gbnVsbDtcblxuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuX3BhdXNlZEF0ID0gMDtcblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLnNvdXJjZS5vbmVuZGVkID0gbnVsbDtcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXJzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXJzO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggISB2YWx1ZSApIHZhbHVlID0gW107XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXHRcdFx0dGhpcy5jb25uZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RGV0dW5lOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kZXR1bmUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5zb3VyY2UuZGV0dW5lID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG9ubHkgc2V0IGRldHVuZSB3aGVuIGF2YWlsYWJsZVxuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSggdGhpcy5kZXR1bmUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXREZXR1bmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRldHVuZTtcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fSxcblxuXHRvbkVuZGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0TG9vcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TG9vcFN0YXJ0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5sb29wU3RhcnQgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TG9vcEVuZDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubG9vcEVuZCA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX3Bvc2l0aW9uJDMgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9xdWF0ZXJuaW9uJDQgPSBuZXcgUXVhdGVybmlvbigpO1xudmFyIF9zY2FsZSQyID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfb3JpZW50YXRpb24kMSA9IG5ldyBWZWN0b3IzKCk7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uYWxBdWRpbyggbGlzdGVuZXIgKSB7XG5cblx0QXVkaW8uY2FsbCggdGhpcywgbGlzdGVuZXIgKTtcblxuXHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0dGhpcy5wYW5uZXIucGFubmluZ01vZGVsID0gJ0hSVEYnO1xuXHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcblxufVxuXG5Qb3NpdGlvbmFsQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQXVkaW8ucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyO1xuXG5cdH0sXG5cblx0Z2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDtcblxuXHR9LFxuXG5cdHNldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldERpcmVjdGlvbmFsQ29uZTogZnVuY3Rpb24gKCBjb25lSW5uZXJBbmdsZSwgY29uZU91dGVyQW5nbGUsIGNvbmVPdXRlckdhaW4gKSB7XG5cblx0XHR0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZSA9IGNvbmVJbm5lckFuZ2xlO1xuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlID0gY29uZU91dGVyQW5nbGU7XG5cdFx0dGhpcy5wYW5uZXIuY29uZU91dGVyR2FpbiA9IGNvbmVPdXRlckdhaW47XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSB0cnVlICYmIHRoaXMuaXNQbGF5aW5nID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24kMywgX3F1YXRlcm5pb24kNCwgX3NjYWxlJDIgKTtcblxuXHRcdF9vcmllbnRhdGlvbiQxLnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24kNCApO1xuXG5cdFx0dmFyIHBhbm5lciA9IHRoaXMucGFubmVyO1xuXG5cdFx0aWYgKCBwYW5uZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSBhbmQgRmlyZWZveCAoc2VlICMxNDM5MylcblxuXHRcdFx0dmFyIGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTtcblxuXHRcdFx0cGFubmVyLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDMueCwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDMueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDMueiwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uJDEueCwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uJDEueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uJDEueiwgZW5kVGltZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cGFubmVyLnNldFBvc2l0aW9uKCBfcG9zaXRpb24kMy54LCBfcG9zaXRpb24kMy55LCBfcG9zaXRpb24kMy56ICk7XG5cdFx0XHRwYW5uZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbiQxLngsIF9vcmllbnRhdGlvbiQxLnksIF9vcmllbnRhdGlvbiQxLnogKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvQW5hbHlzZXIoIGF1ZGlvLCBmZnRTaXplICkge1xuXG5cdHRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG5cdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemUgIT09IHVuZGVmaW5lZCA/IGZmdFNpemUgOiAyMDQ4O1xuXG5cdHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7XG5cblx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLCB7XG5cblx0Z2V0RnJlcXVlbmN5RGF0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSggdGhpcy5kYXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhO1xuXG5cdH0sXG5cblx0Z2V0QXZlcmFnZUZyZXF1ZW5jeTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbHVlID0gMCwgZGF0YSA9IHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhbHVlICs9IGRhdGFbIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZSAvIGRhdGEubGVuZ3RoO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb24uXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBQcm9wZXJ0eU1peGVyKCBiaW5kaW5nLCB0eXBlTmFtZSwgdmFsdWVTaXplICkge1xuXG5cdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XG5cdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xuXG5cdHZhciBidWZmZXJUeXBlID0gRmxvYXQ2NEFycmF5LFxuXHRcdG1peEZ1bmN0aW9uO1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lICkge1xuXG5cdFx0Y2FzZSAncXVhdGVybmlvbic6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0YnVmZmVyVHlwZSA9IEFycmF5O1xuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7XG5cblx0fVxuXG5cdHRoaXMuYnVmZmVyID0gbmV3IGJ1ZmZlclR5cGUoIHZhbHVlU2l6ZSAqIDQgKTtcblx0Ly8gbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcgXVxuXHQvL1xuXHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XG5cdC8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21pbmcnXG5cdC8vXG5cdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXG5cdC8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBhbmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdFxuXHQvLyBjaGFuZ2VzXG5cdC8vXG5cdC8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eVxuXG5cdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xuXG5cdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0dGhpcy51c2VDb3VudCA9IDA7XG5cdHRoaXMucmVmZXJlbmNlQ291bnQgPSAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5TWl4ZXIucHJvdG90eXBlLCB7XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhY2N1PGk+J1xuXHRhY2N1bXVsYXRlOiBmdW5jdGlvbiAoIGFjY3VJbmRleCwgd2VpZ2h0ICkge1xuXG5cdFx0Ly8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3Ncblx0XHQvLyB0aGUgd2VpZ2h0IGFuZCBzaG91bGRuJ3QgaGF2ZSBtYWRlIHRoZSBjYWxsIGluIHRoZSBmaXJzdCBwbGFjZVxuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7XG5cblx0XHRpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHdlaWdodDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Y3VycmVudFdlaWdodCArPSB3ZWlnaHQ7XG5cdFx0XHR2YXIgbWl4ID0gd2VpZ2h0IC8gY3VycmVudFdlaWdodDtcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiggYnVmZmVyLCBvZmZzZXQsIDAsIG1peCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0O1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlclxuXHRhcHBseTogZnVuY3Rpb24gKCBhY2N1SW5kZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxuXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHRcdGlmICggd2VpZ2h0IDwgMSApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAqICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKVxuXG5cdFx0XHR2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggYnVmZmVyWyBpIF0gIT09IGJ1ZmZlclsgaSArIHN0cmlkZSBdICkge1xuXG5cdFx0XHRcdC8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0XHRcdGJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyByZW1lbWJlciB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXNcblx0c2F2ZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzO1xuXG5cdFx0YmluZGluZy5nZXRWYWx1ZSggYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0XHQvLyBhY2N1WzAuLjFdIDo9IG9yaWcgLS0gaW5pdGlhbGx5IGRldGVjdCBjaGFuZ2VzIGFnYWluc3QgdGhlIG9yaWdpbmFsXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5hbFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkge1xuXG5cdFx0XHRidWZmZXJbIGkgXSA9IGJ1ZmZlclsgb3JpZ2luYWxWYWx1ZU9mZnNldCArICggaSAlIHN0cmlkZSApIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIHByZXZpb3VzbHkgdGFrZW4gdmlhICdzYXZlT3JpZ2luYWxTdGF0ZScgdG8gdGhlIGJpbmRpbmdcblx0cmVzdG9yZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzO1xuXHRcdHRoaXMuYmluZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHR9LFxuXG5cblx0Ly8gbWl4IGZ1bmN0aW9uc1xuXG5cdF9zZWxlY3Q6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0aWYgKCB0ID49IDAuNSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NsZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7XG5cblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApO1xuXG5cdH0sXG5cblx0X2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0dmFyIHMgPSAxIC0gdDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHR2YXIgaiA9IGRzdE9mZnNldCArIGk7XG5cblx0XHRcdGJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHJlYWwgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuLy8gQ2hhcmFjdGVycyBbXS46LyBhcmUgcmVzZXJ2ZWQgZm9yIHRyYWNrIGJpbmRpbmcgc3ludGF4LlxudmFyIF9SRVNFUlZFRF9DSEFSU19SRSA9ICdcXFxcW1xcXFxdXFxcXC46XFxcXC8nO1xudmFyIF9yZXNlcnZlZFJlID0gbmV3IFJlZ0V4cCggJ1snICsgX1JFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcblxuLy8gQXR0ZW1wdHMgdG8gYWxsb3cgbm9kZSBuYW1lcyBmcm9tIGFueSBsYW5ndWFnZS4gRVM1J3MgYFxcd2AgcmVnZXhwIG1hdGNoZXNcbi8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cbi8vIGluc3RlYWQsIHdlIGV4Y2x1ZGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgbWF0Y2ggZXZlcnl0aGluZyBlbHNlLlxudmFyIF93b3JkQ2hhciA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG52YXIgX3dvcmRDaGFyT3JEb3QgPSAnW14nICsgX1JFU0VSVkVEX0NIQVJTX1JFLnJlcGxhY2UoICdcXFxcLicsICcnICkgKyAnXSc7XG5cbi8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG4vLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLlxudmFyIF9kaXJlY3RvcnlSZSA9IC8oKD86V0MrW1xcLzpdKSopLy5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XG5cbi8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLlxudmFyIF9ub2RlUmUgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIF93b3JkQ2hhck9yRG90ICk7XG5cbi8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcbi8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cbnZhciBfb2JqZWN0UmUgPSAvKD86XFwuKFdDKykoPzpcXFsoLispXFxdKT8pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xuXG4vLyBQcm9wZXJ0eSBhbmQgYWNjZXNzb3IuIE1heSBub3QgY29udGFpbiByZXNlcnZlZCBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXlcbi8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG52YXIgX3Byb3BlcnR5UmUgPSAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCBfd29yZENoYXIgKTtcblxudmFyIF90cmFja1JlID0gbmV3IFJlZ0V4cCggJydcblx0KyAnXidcblx0KyBfZGlyZWN0b3J5UmVcblx0KyBfbm9kZVJlXG5cdCsgX29iamVjdFJlXG5cdCsgX3Byb3BlcnR5UmVcblx0KyAnJCdcbik7XG5cbnZhciBfc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07XG5cbmZ1bmN0aW9uIENvbXBvc2l0ZSggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHtcblxuXHR2YXIgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3VwO1xuXHR0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wb3NpdGUucHJvdG90eXBlLCB7XG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nXG5cblx0XHR2YXIgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcblxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0dGhpcy5wYXRoID0gcGF0aDtcblx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTtcblxuXHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLCB7XG5cblx0Q29tcG9zaXRlOiBDb21wb3NpdGUsXG5cblx0Y3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvKipcblx0ICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tXG5cdCAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VUcmFja05hbWUoKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSggL1xccy9nLCAnXycgKS5yZXBsYWNlKCBfcmVzZXJ2ZWRSZSwgJycgKTtcblxuXHR9LFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBtYXRjaGVzID0gX3RyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRpZiAoICEgbWF0Y2hlcyApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHR9XG5cblx0XHR2YXIgcmVzdWx0cyA9IHtcblx0XHRcdC8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBjdXJyZW50bHkgdW51c2VkXG5cdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0b2JqZWN0TmFtZTogbWF0Y2hlc1sgMyBdLFxuXHRcdFx0b2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSxcblx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxuXHRcdFx0cHJvcGVydHlJbmRleDogbWF0Y2hlc1sgNiBdXG5cdFx0fTtcblxuXHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHtcblxuXHRcdFx0dmFyIG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggbGFzdERvdCArIDEgKTtcblxuXHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcblx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRpZiAoIF9zdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcblxuXHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHRzO1xuXG5cdH0sXG5cblx0ZmluZE5vZGU6IGZ1bmN0aW9uICggcm9vdCwgbm9kZU5hbWUgKSB7XG5cblx0XHRpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09IFwiXCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XG5cblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHRpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbFxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlO1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGV0ZXJtaW5lIGhvdyB0aGUgcHJvcGVydHkgZ2V0cyBib3VuZFxuXHRcdHZhciBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O1xuXG5cdFx0aWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGFjY2VzcyBhIHN1YiBlbGVtZW50IG9mIHRoZSBwcm9wZXJ0eSBhcnJheSAob25seSBwcmltaXRpdmVzIGFyZSBzdXBwb3J0ZWQgcmlnaHQgbm93KVxuXG5cdFx0XHRpZiAoIHByb3BlcnR5TmFtZSA9PT0gXCJtb3JwaFRhcmdldEluZmx1ZW5jZXNcIiApIHtcblxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cdFx0XHR0aGlzLnByb3BlcnR5SW5kZXggPSBwcm9wZXJ0eUluZGV4O1xuXG5cdFx0fSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJheSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG11c3QgdXNlIGNvcHkgZm9yIE9iamVjdDNELkV1bGVyL1F1YXRlcm5pb25cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHtcblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0ZXJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlWyBiaW5kaW5nVHlwZSBdO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubm9kZSA9IG51bGw7XG5cblx0XHQvLyBiYWNrIHRvIHRoZSBwcm90b3R5cGUgdmVyc2lvbiBvZiBnZXRWYWx1ZSAvIHNldFZhbHVlXG5cdFx0Ly8gbm90ZTogYXZvaWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7XG5cblx0fVxuXG59ICk7XG5cbi8vIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZVxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwge1xuXG5cdC8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJ1xuXHRfZ2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5nZXRWYWx1ZSxcblx0X3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBncm91cCBvZiBvYmplY3RzIHRoYXQgcmVjZWl2ZXMgYSBzaGFyZWQgYW5pbWF0aW9uIHN0YXRlLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAtIEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiAgICBjb25zdHJ1Y3RvciBvciB0aGUgLmNsaXBBY3Rpb24gbWV0aG9kIG9mIEFuaW1hdGlvbk1peGVyLlxuICpcbiAqICAtIEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogIC0gWW91IGNhbiBhbHNvIGFkZCBhbmQgcmVtb3ZlIG9iamVjdHMgbGF0ZXIgd2hlbiB0aGUgbWl4ZXJcbiAqICAgIGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgICBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogICAgc28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogICAgb24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogIC0gVGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogICAgYWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLlxuICpcbiAqICAtIEEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0aHJvdWdoIGFcbiAqICAgIHRhcmdldCBncm91cCBvciBkaXJlY3RseSwgYnV0IG5vdCBib3RoLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25PYmplY3RHcm91cCgpIHtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gY2FjaGVkIG9iamVjdHMgZm9sbG93ZWQgYnkgdGhlIGFjdGl2ZSBvbmVzXG5cdHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cblx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwOyAvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7IC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdOyAvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdOyAvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XG5cdHRoaXMuX2JpbmRpbmdzID0gW107IC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyAvLyBpbnNpZGU6IGluZGljZXMgaW4gdGhlc2UgYXJyYXlzXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0b2JqZWN0czoge1xuXHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdHJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7XG5cblx0XHRcdH0sXG5cdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5uQ2FjaGVkT2JqZWN0c187XG5cblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldCBiaW5kaW5nc1Blck9iamVjdCgpIHtcblxuXHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUsIHtcblxuXHRpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiB0cnVlLFxuXG5cdGFkZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aCxcblx0XHRcdGtub3duT2JqZWN0ID0gdW5kZWZpbmVkO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBvYmplY3QgLT4gYWRkIGl0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0aW5kZXggPSBuT2JqZWN0cyArKztcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmdzWyBqIF0ucHVzaCggbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0a25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBdO1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblxuXHRcdFx0XHRcdGlmICggYmluZGluZyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBkbyBub3QgYm90aGVyIHRvIGNyZWF0ZSBuZXcgYmluZGluZ3Ncblx0XHRcdFx0XHRcdC8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5XG5cdFx0XHRcdFx0XHQvLyBvciBtYXkgbm90IGV4aXN0XG5cblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdHNbIGluZGV4IF0gIT09IGtub3duT2JqZWN0ICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEICcgK1xuXHRcdFx0XHRcdCdkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4nICk7XG5cblx0XHRcdH0gLy8gZWxzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgd2hlcmUgd2Ugd2FudCBpdCB0byBiZVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdHZhciBsYXN0Q2FjaGVkSW5kZXggPSBuQ2FjaGVkT2JqZWN0cyArKyxcblx0XHRcdFx0XHRmaXJzdEFjdGl2ZU9iamVjdCA9IG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gZmlyc3RBY3RpdmVPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRmaXJzdEFjdGl2ZSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gZmlyc3RBY3RpdmU7XG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyByZW1vdmUgJiBmb3JnZXRcblx0dW5jYWNoZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdC8vIGxhc3QgY2FjaGVkIG9iamVjdCB0YWtlcyB0aGlzIG9iamVjdCdzIHBsYWNlXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRcdC8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3Bcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0XHRsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcFxuXG5cdFx0XHRcdFx0dmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcblxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdC8vIEludGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZTpcblxuXHRzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXSxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYmluZGluZ3NbIGluZGV4IF07XG5cblx0XHR2YXIgcGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZ3NGb3JQYXRoID0gbmV3IEFycmF5KCBuT2JqZWN0cyApO1xuXG5cdFx0aW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRpbmRpY2VzQnlQYXRoWyBwYXRoIF0gPSBpbmRleDtcblxuXHRcdHBhdGhzLnB1c2goIHBhdGggKTtcblx0XHRwYXJzZWRQYXRocy5wdXNoKCBwYXJzZWRQYXRoICk7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBvYmplY3RzWyBpIF07XG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcblxuXHR9LFxuXG5cdHVuc3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoICkge1xuXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRcdGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSxcblx0XHRcdFx0bGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sXG5cdFx0XHRcdGxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXG5cdFx0XHRpbmRpY2VzQnlQYXRoWyBsYXN0QmluZGluZ3NQYXRoIF0gPSBpbmRleDtcblxuXHRcdFx0YmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7XG5cdFx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdFx0cGFyc2VkUGF0aHNbIGluZGV4IF0gPSBwYXJzZWRQYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhcnNlZFBhdGhzLnBvcCgpO1xuXG5cdFx0XHRwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXHRcdFx0cGF0aHMucG9wKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Igc2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljXG4gKiBvYmplY3RzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQWN0aW9uKCBtaXhlciwgY2xpcCwgbG9jYWxSb290ICkge1xuXG5cdHRoaXMuX21peGVyID0gbWl4ZXI7XG5cdHRoaXMuX2NsaXAgPSBjbGlwO1xuXHR0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgbnVsbDtcblxuXHR2YXIgdHJhY2tzID0gY2xpcC50cmFja3MsXG5cdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0aW50ZXJwb2xhbnRzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dmFyIGludGVycG9sYW50U2V0dGluZ3MgPSB7XG5cdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXG5cdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cdH07XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50ID0gdHJhY2tzWyBpIF0uY3JlYXRlSW50ZXJwb2xhbnQoIG51bGwgKTtcblx0XHRpbnRlcnBvbGFudHNbIGkgXSA9IGludGVycG9sYW50O1xuXHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHR9XG5cblx0dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAvLyBib3VuZCBieSB0aGUgbWl4ZXJcblxuXHQvLyBpbnNpZGU6IFByb3BlcnR5TWl4ZXIgKG1hbmFnZWQgYnkgdGhlIG1peGVyKVxuXHR0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblx0dGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblxuXHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XG5cdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblxuXHR0aGlzLmxvb3AgPSBMb29wUmVwZWF0O1xuXHR0aGlzLl9sb29wQ291bnQgPSAtIDE7XG5cblx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcblx0Ly8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uXG5cdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XG5cblx0Ly8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvblxuXHQvLyBnZXRzIGNsYW1wZWQgb3Igd3JhcHBlZCB0byAwLi5jbGlwLmR1cmF0aW9uIGFjY29yZGluZyB0byBsb29wXG5cdHRoaXMudGltZSA9IDA7XG5cblx0dGhpcy50aW1lU2NhbGUgPSAxO1xuXHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSAxO1xuXG5cdHRoaXMud2VpZ2h0ID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcblxuXHR0aGlzLnJlcGV0aXRpb25zID0gSW5maW5pdHk7IC8vIG5vLiBvZiByZXBldGl0aW9ucyB3aGVuIGxvb3BpbmdcblxuXHR0aGlzLnBhdXNlZCA9IGZhbHNlOyAvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTsgLy8gZmFsc2UgLT4gemVybyBlZmZlY3RpdmUgd2VpZ2h0XG5cblx0dGhpcy5jbGFtcFdoZW5GaW5pc2hlZCA9IGZhbHNlOy8vIGtlZXAgZmVlZGluZyB0aGUgbGFzdCBmcmFtZT9cblxuXHR0aGlzLnplcm9TbG9wZUF0U3RhcnQgPSB0cnVlOy8vIGZvciBzbW9vdGggaW50ZXJwb2xhdGlvbiB3L28gc2VwYXJhdGVcblx0dGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7IC8vIHJlc3RhcnQgY2xpcFxuXHRcdHRoaXMuX2xvb3BDb3VudCA9IC0gMTsvLyBmb3JnZXQgcHJldmlvdXMgbG9vcHNcblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsOy8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHR0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkXG5cdGlzU2NoZWR1bGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHRzdGFydEF0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIG1vZGUsIHJlcGV0aXRpb25zICkge1xuXG5cdFx0dGhpcy5sb29wID0gbW9kZTtcblx0XHR0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFdlaWdodFxuXG5cdC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nXG5cdC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCB3ZWlnaHQgKSB7XG5cblx0XHR0aGlzLndlaWdodCA9IHdlaWdodDtcblxuXHRcdC8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWVcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB0aGlzLmVuYWJsZWQgPyB3ZWlnaHQgOiAwO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZFxuXHRnZXRFZmZlY3RpdmVXZWlnaHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7XG5cblx0fSxcblxuXHRmYWRlSW46IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAwLCAxICk7XG5cblx0fSxcblxuXHRmYWRlT3V0OiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlRnJvbTogZnVuY3Rpb24gKCBmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdGZhZGVPdXRBY3Rpb24uZmFkZU91dCggZHVyYXRpb24gKTtcblx0XHR0aGlzLmZhZGVJbiggZHVyYXRpb24gKTtcblxuXHRcdGlmICggd2FycCApIHtcblxuXHRcdFx0dmFyIGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcblxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlVG86IGZ1bmN0aW9uICggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcblxuXHR9LFxuXG5cdHN0b3BGYWRpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3ZWlnaHRJbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCB3ZWlnaHRJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBUaW1lIFNjYWxlIENvbnRyb2xcblxuXHQvLyBzZXQgdGhlIHRpbWUgc2NhbGUgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCB3YXJwaW5nXG5cdC8vIGFsdGhvdWdoIC5wYXVzZWQgPSB0cnVlIHlpZWxkcyBhbiBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAucGF1c2VkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZ1xuXHRzZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDogdGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkXG5cdGdldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdHNldER1cmF0aW9uOiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aGlzLl9jbGlwLmR1cmF0aW9uIC8gZHVyYXRpb247XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0c3luY1dpdGg6IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lID0gYWN0aW9uLnRpbWU7XG5cdFx0dGhpcy50aW1lU2NhbGUgPSBhY3Rpb24udGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGhhbHQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7XG5cblx0fSxcblxuXHR3YXJwOiBmdW5jdGlvbiAoIHN0YXJ0VGltZVNjYWxlLCBlbmRUaW1lU2NhbGUsIGR1cmF0aW9uICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50LFxuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcblxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3BXYXJwaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlSW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcblxuXHRcdGlmICggdGltZVNjYWxlSW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gT2JqZWN0IEFjY2Vzc29yc1xuXG5cdGdldE1peGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXI7XG5cblx0fSxcblxuXHRnZXRDbGlwOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fY2xpcDtcblxuXHR9LFxuXG5cdGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9sb2NhbFJvb3QgfHwgdGhpcy5fbWl4ZXIuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hXG5cblx0X3VwZGF0ZTogZnVuY3Rpb24gKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApIHtcblxuXHRcdC8vIGNhbGxlZCBieSB0aGUgbWl4ZXJcblxuXHRcdGlmICggISB0aGlzLmVuYWJsZWQgKSB7XG5cblx0XHRcdC8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHRcblxuXHRcdFx0dGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lO1xuXG5cdFx0aWYgKCBzdGFydFRpbWUgIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBzY2hlZHVsZWQgc3RhcnQgb2YgYWN0aW9uXG5cblx0XHRcdHZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuOyAvLyB5ZXQgdG8gY29tZSAvIGRvbid0IGRlY2lkZSB3aGVuIGRlbHRhID0gMFxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHN0YXJ0XG5cblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcblx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcblxuXHRcdH1cblxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xuXHRcdHZhciBjbGlwVGltZSA9IHRoaXMuX3VwZGF0ZVRpbWUoIGRlbHRhVGltZSApO1xuXG5cdFx0Ly8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2FibGUgdGhlIGFjdGlvbiByZXN1bHRpbmcgaW5cblx0XHQvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDBcblxuXHRcdHZhciB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblxuXHRcdGlmICggd2VpZ2h0ID4gMCApIHtcblxuXHRcdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcblx0XHRcdHZhciBwcm9wZXJ0eU1peGVycyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0aW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7XG5cdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3VwZGF0ZVdlaWdodDogZnVuY3Rpb24gKCB0aW1lICkge1xuXG5cdFx0dmFyIHdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XG5cdFx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcblxuXHRcdFx0XHR3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcblxuXHRcdFx0XHRcdHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHQvLyBmYWRlZCBvdXQsIGRpc2FibGVcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdHJldHVybiB3ZWlnaHQ7XG5cblx0fSxcblxuXHRfdXBkYXRlVGltZVNjYWxlOiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlID0gMDtcblxuXHRcdGlmICggISB0aGlzLnBhdXNlZCApIHtcblxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wV2FycGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCB0aW1lU2NhbGUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIG1vdGlvbiBoYXMgaGFsdGVkLCBwYXVzZVxuXHRcdFx0XHRcdFx0dGhpcy5wYXVzZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZVxuXHRcdFx0XHRcdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0cmV0dXJuIHRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHtcblxuXHRcdHZhciB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lO1xuXHRcdHZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb247XG5cdFx0dmFyIGxvb3AgPSB0aGlzLmxvb3A7XG5cdFx0dmFyIGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdHZhciBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHJldHVybiB0aW1lO1xuXG5cdFx0XHRyZXR1cm4gKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApID8gZHVyYXRpb24gLSB0aW1lIDogdGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdFx0YnJlYWsgaGFuZGxlX3N0b3A7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLSAxIDogMVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7IC8vIHJlcGV0aXRpdmUgUmVwZWF0IG9yIFBpbmdQb25nXG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0aWYgKCBkZWx0YVRpbWUgPj0gMCApIHtcblxuXHRcdFx0XHRcdGxvb3BDb3VudCA9IDA7XG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB3aGVuIGxvb3BpbmcgaW4gcmV2ZXJzZSBkaXJlY3Rpb24sIHRoZSBpbml0aWFsXG5cdFx0XHRcdFx0Ly8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbixcblx0XHRcdFx0XHQvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTFcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHRydWUsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHQvLyB3cmFwIGFyb3VuZFxuXG5cdFx0XHRcdHZhciBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XG5cblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcblxuXHRcdFx0XHR2YXIgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7XG5cblx0XHRcdFx0aWYgKCBwZW5kaW5nIDw9IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudClcblxuXHRcdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0dGltZSA9IGRlbHRhVGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7XG5cblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0gMVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8ga2VlcCBydW5uaW5nXG5cblx0XHRcdFx0XHRpZiAoIHBlbmRpbmcgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGVudGVyaW5nIHRoZSBsYXN0IHJvdW5kXG5cblx0XHRcdFx0XHRcdHZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDtcblxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBpbnZlcnQgdGltZSBmb3IgdGhlIFwicG9uZyByb3VuZFwiXG5cblx0XHRcdFx0cmV0dXJuIGR1cmF0aW9uIC0gdGltZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24gKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXG5cblx0XHRcdGlmICggYXRTdGFydCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXRFbmQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NjaGVkdWxlRmFkaW5nOiBmdW5jdGlvbiAoIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcblx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XG5cdFx0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25NaXhlciggcm9vdCApIHtcblxuXHR0aGlzLl9yb290ID0gcm9vdDtcblx0dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTtcblx0dGhpcy5fYWNjdUluZGV4ID0gMDtcblxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMS4wO1xuXG59XG5cbkFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbmltYXRpb25NaXhlcixcblxuXHRfYmluZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHtcblxuXHRcdHZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLFxuXHRcdFx0aW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRyYWNrc1sgaSBdLFxuXHRcdFx0XHR0cmFja05hbWUgPSB0cmFjay5uYW1lLFxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3NcblxuXHRcdFx0XHRcdGlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi5cblx0XHRcdFx0XHRfcHJvcGVydHlCaW5kaW5nc1sgaSBdLmJpbmRpbmcucGFyc2VkUGF0aDtcblxuXHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoXG5cdFx0XHRcdFx0UHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksXG5cdFx0XHRcdFx0dHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2suZ2V0VmFsdWVTaXplKCkgKTtcblxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9hY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHRpZiAoIGFjdGlvbi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXJcblx0XHRcdFx0Ly8gYXBwZWFycyB0byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmRcblxuXHRcdFx0XHR2YXIgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApO1xuXHRcdFx0XHRcdGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfZGVhY3RpdmF0ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHRpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZXJcblxuXHRfaW5pdE1lbW9yeU1hbmFnZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXG5cdFx0dGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9O1xuXHRcdC8vIGluc2lkZTpcblx0XHQvLyB7XG5cdFx0Ly8gXHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPiAtIHVzZWQgYXMgcHJvdG90eXBlc1xuXHRcdC8vIFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb24gLSBsb29rdXBcblx0XHQvLyB9XG5cblxuXHRcdHRoaXMuX2JpbmRpbmdzID0gW107IC8vICduQWN0aXZlQmluZGluZ3MnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lID0ge307IC8vIGluc2lkZTogTWFwPCBuYW1lLCBQcm9wZXJ0eU1peGVyID5cblxuXG5cdFx0dGhpcy5fY29udHJvbEludGVycG9sYW50cyA9IFtdOyAvLyBzYW1lIGdhbWUgYXMgYWJvdmVcblx0XHR0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGJpbmRpbmdzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sSW50ZXJwb2xhbnRzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cztcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXG5cblx0X2lzQWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHR9LFxuXG5cdF9hZGRJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcblxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cblxuXHRcdFx0fTtcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcblxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGtub3duQWN0aW9ucyA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDtcblx0XHRcdGtub3duQWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGFjdGlvbnMubGVuZ3RoO1xuXHRcdGFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XG5cdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxuXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcblxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcblxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XG5cblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LFxuXHRcdFx0cm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkO1xuXG5cdFx0ZGVsZXRlIGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdGlmICggLS0gYmluZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8ICBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHMgICAgICAgIGFcblx0XHQvLyAgICAgICAgICAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgICAgICAgICAgIGEgICAgICAgIHNcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vICAgICAgICBhICAgICAgICBzXG5cdFx0Ly8gICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICBzICAgICAgICBhXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHNcblxuXHRfYWRkSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0YmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF0gPSBiaW5kaW5nO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XG5cdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRpZiAoIE9iamVjdC5rZXlzKCBiaW5kaW5nQnlOYW1lICkubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsXG5cblx0XHRcdGxhc3RBY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0bGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKyssXG5cdFx0XHRpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHRuZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSxcblx0XHRcdFx0MSwgdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApO1xuXG5cdFx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0XHRpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6IG5ldyBGbG9hdDMyQXJyYXkoIDEgKSxcblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBudWxsO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZXhpc3RpbmdBY3Rpb24gPVxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0FjdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbFxuXHRcdFx0Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5XG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTtcblxuXHRcdFx0Ly8gYWxzbywgdGFrZSB0aGUgY2xpcCBmcm9tIHRoZSBwcm90b3R5cGUgYWN0aW9uXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKVxuXHRcdFx0XHRjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmdcblx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIGFsbG9jYXRlIGFsbCByZXNvdXJjZXMgcmVxdWlyZWQgdG8gcnVuIGl0XG5cdFx0dmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvblxuXHRleGlzdGluZ0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBkZWFjdGl2YXRlcyBhbGwgcHJldmlvdXNseSBzY2hlZHVsZWQgYWN0aW9uc1xuXHRzdG9wQWxsQWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0YWN0aW9uc1sgaSBdLnJlc2V0KCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGFkdmFuY2UgdGhlIHRpbWUgYW5kIHVwZGF0ZSBhcHBseSB0aGUgYW5pbWF0aW9uXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHR0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSxcblx0XHRcdHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLFxuXG5cdFx0XHRhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTtcblxuXHRcdC8vIHJ1biBhY3RpdmUgYWN0aW9uc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNbIGkgXTtcblxuXHRcdFx0YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBBbGxvd3MgeW91IHRvIHNlZWsgdG8gYSBzcGVjaWZpYyB0aW1lIGluIGFuIGFuaW1hdGlvbi5cblx0c2V0VGltZTogZnVuY3Rpb24gKCB0aW1lSW5TZWNvbmRzICkge1xuXG5cdFx0dGhpcy50aW1lID0gMDsgLy8gWmVybyBvdXQgdGltZSBhdHRyaWJ1dGUgZm9yIEFuaW1hdGlvbk1peGVyIG9iamVjdDtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLl9hY3Rpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5fYWN0aW9uc1sgaSBdLnRpbWUgPSAwOyAvLyBaZXJvIG91dCB0aW1lIGF0dHJpYnV0ZSBmb3IgYWxsIGFzc29jaWF0ZWQgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHMuXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy51cGRhdGUoIHRpbWVJblNlY29uZHMgKTsgLy8gVXBkYXRlIHVzZWQgdG8gc2V0IGV4YWN0IHRpbWUuIFJldHVybnMgXCJ0aGlzXCIgQW5pbWF0aW9uTWl4ZXIgb2JqZWN0LlxuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXHR0aGlzLmNhbWVyYSA9IG51bGw7XG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0TE9EOiB7fSxcblx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0U3ByaXRlOiB7fVxuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywge1xuXHRcdFBvaW50Q2xvdWQ6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuUG9pbnRzO1xuXG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCByYXljYXN0ZXIubGF5ZXJzICkgKSB7XG5cblx0XHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0fVxuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHRcdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0XHR0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoIGNvb3JkcywgY2FtZXJhICkge1xuXG5cdFx0aWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgMC41ICkudW5wcm9qZWN0KCBjYW1lcmEgKS5zdWIoIHRoaXMucmF5Lm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0XHR9IGVsc2UgaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKiBUaGUgcG9sYXIgYW5nbGUgKHBoaSkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgcG9zaXRpdmUgeS1heGlzLiBUaGUgcG9zaXRpdmUgeS1heGlzIGlzIHVwLlxuICogVGhlIGF6aW11dGhhbCBhbmdsZSAodGhldGEpIGlzIG1lYXN1cmVkIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpcy5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyBwb2xhciBhbmdsZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGF6aW11dGhhbCBhbmdsZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCBwaGksIHRoZXRhICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBwaGk7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBvdGhlciApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xuXHRcdHRoaXMucGhpID0gb3RoZXIucGhpO1xuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTtcblxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSAwO1xuXHRcdFx0dGhpcy5waGkgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBNYXRoVXRpbHMuY2xhbXAoIHkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWxpbmRyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqL1xuXG5mdW5jdGlvbiBDeWxpbmRyaWNhbCggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsgLy8gZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHR0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3lsaW5kcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHogKiB6ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbnZhciBfdmVjdG9yJDcgPSBuZXcgVmVjdG9yMigpO1xuXG5mdW5jdGlvbiBCb3gyKCBtaW4sIG1heCApIHtcblxuXHR0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICk7XG5cdHRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjIoIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdHZhciBoYWxmU2l6ZSA9IF92ZWN0b3IkNy5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXG5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBjbGFtcGVkUG9pbnQgPSBfdmVjdG9yJDcuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgX3N0YXJ0UCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3N0YXJ0RW5kID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTGluZTMoIHN0YXJ0LCBlbmQgKSB7XG5cblx0dGhpcy5zdGFydCA9ICggc3RhcnQgIT09IHVuZGVmaW5lZCApID8gc3RhcnQgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmVuZCA9ICggZW5kICE9PSB1bmRlZmluZWQgKSA/IGVuZCA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGluZTMucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHN0YXJ0LCBlbmQgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5zdGFydCwgdGhpcy5lbmQgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRkZWx0YTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmRlbHRhKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5lbmQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSApIHtcblxuXHRcdF9zdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRfc3RhcnRFbmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHRcdHZhciBzdGFydEVuZDIgPSBfc3RhcnRFbmQuZG90KCBfc3RhcnRFbmQgKTtcblx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0UCApO1xuXG5cdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHR0ID0gTWF0aFV0aWxzLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGNsYW1wVG9MaW5lLCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLmVuZC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEltbWVkaWF0ZVJlbmRlck9iamVjdCggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIC8qIHJlbmRlckNhbGxiYWNrICovICkge307XG5cbn1cblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDtcblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG52YXIgX3ZlY3RvciQ4ID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gU3BvdExpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gW1xuXHRcdDAsIDAsIDAsIFx0MCwgMCwgMSxcblx0XHQwLCAwLCAwLCBcdDEsIDAsIDEsXG5cdFx0MCwgMCwgMCxcdC0gMSwgMCwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIDEsIDEsXG5cdFx0MCwgMCwgMCwgXHQwLCAtIDEsIDFcblx0XTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkge1xuXG5cdFx0dmFyIHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XG5cdFx0dmFyIHAyID0gKCBqIC8gbCApICogTWF0aC5QSSAqIDI7XG5cblx0XHRwb3NpdGlvbnMucHVzaChcblx0XHRcdE1hdGguY29zKCBwMSApLCBNYXRoLnNpbiggcDEgKSwgMSxcblx0XHRcdE1hdGguY29zKCBwMiApLCBNYXRoLnNpbiggcDIgKSwgMVxuXHRcdCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0dmFyIGNvbmVXaWR0aCA9IGNvbmVMZW5ndGggKiBNYXRoLnRhbiggdGhpcy5saWdodC5hbmdsZSApO1xuXG5cdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0X3ZlY3RvciQ4LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblxuXHR0aGlzLmNvbmUubG9va0F0KCBfdmVjdG9yJDggKTtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbnZhciBfdmVjdG9yJDkgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9ib25lTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbnZhciBfbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkge1xuXG5cdHZhciBib25lTGlzdCA9IFtdO1xuXG5cdGlmICggb2JqZWN0ICYmIG9iamVjdC5pc0JvbmUgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoKCBvYmplY3QgKTtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2guYXBwbHkoIGJvbmVMaXN0LCBnZXRCb25lTGlzdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0gKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYm9uZUxpc3Q7XG5cbn1cblxuZnVuY3Rpb24gU2tlbGV0b25IZWxwZXIoIG9iamVjdCApIHtcblxuXHR2YXIgYm9uZXMgPSBnZXRCb25lTGlzdCggb2JqZWN0ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoIDAsIDEsIDAgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgYm9uZSA9IGJvbmVzWyBpIF07XG5cblx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHR0aGlzLmJvbmVzID0gYm9uZXM7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUuaXNTa2VsZXRvbkhlbHBlciA9IHRydWU7XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIGJvbmVzID0gdGhpcy5ib25lcztcblxuXHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRfbWF0cml4V29ybGRJbnYuZ2V0SW52ZXJzZSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICk7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRfYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdF92ZWN0b3IkOS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIF9ib25lTWF0cml4ICk7XG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIGosIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdFx0X2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX21hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0X3ZlY3RvciQ5LnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTtcblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiArIDEsIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdFx0aiArPSAyO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cblx0Lypcblx0dmFyIGRpc3RhbmNlR2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggMSwgMiApO1xuXHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3IsIGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XG5cblx0dGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2VvbWV0cnksIGJ1bGJNYXRlcmlhbCApO1xuXHR0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUuTWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApO1xuXG5cdHZhciBkID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcblx0Ki9cblxufVxuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7XG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50TGlnaHRIZWxwZXI7XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9XG5cblx0Lypcblx0dmFyIGQgPSB0aGlzLmxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cdCovXG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbnZhciBfdmVjdG9yJGEgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9jb2xvcjEgPSBuZXcgQ29sb3IoKTtcbnZhciBfY29sb3IyID0gbmV3IENvbG9yKCk7XG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggc2l6ZSApO1xuXHRnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblx0aWYgKCB0aGlzLmNvbG9yID09PSB1bmRlZmluZWQgKSB0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9IHRydWU7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cblx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdF9jb2xvcjEuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdF9jb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBfY29sb3IxIDogX2NvbG9yMjtcblxuXHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0fVxuXG5cdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cblx0bWVzaC5sb29rQXQoIF92ZWN0b3IkYS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdyaWRIZWxwZXIsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaW5lU2VnbWVudHMucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvcHkoIHNvdXJjZS5nZW9tZXRyeSApO1xuXHRcdHRoaXMubWF0ZXJpYWwuY29weSggc291cmNlLm1hdGVyaWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9IZWN0YXRlXG4gKi9cblxuZnVuY3Rpb24gUG9sYXJHcmlkSGVscGVyKCByYWRpdXMsIHJhZGlhbHMsIGNpcmNsZXMsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDEwO1xuXHRyYWRpYWxzID0gcmFkaWFscyB8fCAxNjtcblx0Y2lyY2xlcyA9IGNpcmNsZXMgfHwgODtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDY0O1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgeCwgejtcblx0dmFyIHYsIGksIGosIHIsIGNvbG9yO1xuXG5cdC8vIGNyZWF0ZSB0aGUgcmFkaWFsc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHJhZGlhbHM7IGkgKysgKSB7XG5cblx0XHR2ID0gKCBpIC8gcmFkaWFscyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0eCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XG5cdFx0eiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0fVxuXG5cdC8vIGNyZWF0ZSB0aGUgY2lyY2xlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IGNpcmNsZXM7IGkgKysgKSB7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdHIgPSByYWRpdXMgLSAoIHJhZGl1cyAvIGNpcmNsZXMgKiBpICk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IGRpdmlzaW9uczsgaiArKyApIHtcblxuXHRcdFx0Ly8gZmlyc3QgdmVydGV4XG5cblx0XHRcdHYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHQvLyBzZWNvbmQgdmVydGV4XG5cblx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbnZhciBfdjEkNSA9IG5ldyBWZWN0b3IzKCk7XG52YXIgX3YyJDMgPSBuZXcgVmVjdG9yMygpO1xudmFyIF92MyQxID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodEhlbHBlciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggW1xuXHRcdC0gc2l6ZSwgc2l6ZSwgMCxcblx0XHRzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsIHNpemUsIDBcblx0XSwgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHR0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0UGxhbmUgKTtcblxuXHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDAsIDEgXSwgMyApICk7XG5cblx0dGhpcy50YXJnZXRMaW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEaXJlY3Rpb25hbExpZ2h0SGVscGVyO1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMubGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cdHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRfdjEkNS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcblx0X3YyJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRfdjMkMS5zdWJWZWN0b3JzKCBfdjIkMywgX3YxJDUgKTtcblxuXHR0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCBfdjIkMyApO1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxuXHR0aGlzLnRhcmdldExpbmUubG9va0F0KCBfdjIkMyApO1xuXHR0aGlzLnRhcmdldExpbmUuc2NhbGUueiA9IF92MyQxLmxlbmd0aCgpO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqXHQtIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQgYW5kIHVwIG9mIHRoZSBjYW1lcmFcbiAqXHQtIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXNcbiAqIFx0LSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZVxuICpcdFx0aHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90ZXN0cy9zaGFkb3dtYXAuaHRtbFxuICovXG5cbnZhciBfdmVjdG9yJGIgPSBuZXcgVmVjdG9yMygpO1xudmFyIF9jYW1lcmEgPSBuZXcgQ2FtZXJhKCk7XG5cbmZ1bmN0aW9uIENhbWVyYUhlbHBlciggY2FtZXJhICkge1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBwb2ludE1hcCA9IHt9O1xuXG5cdC8vIGNvbG9yc1xuXG5cdHZhciBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdHZhciBjb2xvckNvbmUgPSBuZXcgQ29sb3IoIDB4ZmYwMDAwICk7XG5cdHZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApO1xuXHR2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHZhciBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApO1xuXG5cdC8vIG5lYXJcblxuXHRhZGRMaW5lKCAnbjEnLCAnbjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ240JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICduMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjMnLCAnbjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBmYXJcblxuXHRhZGRMaW5lKCAnZjEnLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YyJywgJ2Y0JywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmNCcsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjMnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBzaWRlc1xuXG5cdGFkZExpbmUoICduMScsICdmMScsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ2YzJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduNCcsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGNvbmVcblxuXHRhZGRMaW5lKCAncCcsICduMScsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMicsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduMycsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCAncCcsICduNCcsIGNvbG9yQ29uZSApO1xuXG5cdC8vIHVwXG5cblx0YWRkTGluZSggJ3UxJywgJ3UyJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTInLCAndTMnLCBjb2xvclVwICk7XG5cdGFkZExpbmUoICd1MycsICd1MScsIGNvbG9yVXAgKTtcblxuXHQvLyB0YXJnZXRcblxuXHRhZGRMaW5lKCAnYycsICd0JywgY29sb3JUYXJnZXQgKTtcblx0YWRkTGluZSggJ3AnLCAnYycsIGNvbG9yQ3Jvc3MgKTtcblxuXHQvLyBjcm9zc1xuXG5cdGFkZExpbmUoICdjbjEnLCAnY24yJywgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCAnY24zJywgJ2NuNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NmMycsICdjZjQnLCBjb2xvckNyb3NzICk7XG5cblx0ZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7XG5cblx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRhZGRQb2ludCggYiwgY29sb3IgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwb2ludE1hcFsgaWQgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdGlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5wb2ludE1hcCA9IHBvaW50TWFwO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkNhbWVyYUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW1lcmFIZWxwZXI7XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdHZhciBwb2ludE1hcCA9IHRoaXMucG9pbnRNYXA7XG5cblx0dmFyIHcgPSAxLCBoID0gMTtcblxuXHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4IGludmVyc2Vcblx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRfY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XG5cblx0Ly8gY2VudGVyIC8gdGFyZ2V0XG5cblx0c2V0UG9pbnQoICdjJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCAtIDEgKTtcblx0c2V0UG9pbnQoICd0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCAxICk7XG5cblx0Ly8gbmVhclxuXG5cdHNldFBvaW50KCAnbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAtIDEgKTtcblx0c2V0UG9pbnQoICduMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCAtIDEgKTtcblx0c2V0UG9pbnQoICduMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCBoLCAtIDEgKTtcblx0c2V0UG9pbnQoICduNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgLSAxICk7XG5cblx0Ly8gZmFyXG5cblx0c2V0UG9pbnQoICdmMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAtIGgsIDEgKTtcblx0c2V0UG9pbnQoICdmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCAxICk7XG5cdHNldFBvaW50KCAnZjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgMSApO1xuXHRzZXRQb2ludCggJ2Y0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCBoLCAxICk7XG5cblx0Ly8gdXBcblxuXHRzZXRQb2ludCggJ3UxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0c2V0UG9pbnQoICd1MicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0c2V0UG9pbnQoICd1MycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCAqIDIsIC0gMSApO1xuXG5cdC8vIGNyb3NzXG5cblx0c2V0UG9pbnQoICdjZjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgMSApO1xuXHRzZXRQb2ludCggJ2NmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSApO1xuXHRzZXRQb2ludCggJ2NmMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgLSBoLCAxICk7XG5cdHNldFBvaW50KCAnY2Y0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCAxICk7XG5cblx0c2V0UG9pbnQoICdjbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgLSAxICk7XG5cdHNldFBvaW50KCAnY24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAwLCAtIDEgKTtcblx0c2V0UG9pbnQoICdjbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIC0gaCwgLSAxICk7XG5cdHNldFBvaW50KCAnY240JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCAtIDEgKTtcblxuXHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn07XG5cbmZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgcG9pbnRNYXAsIGdlb21ldHJ5LCBjYW1lcmEsIHgsIHksIHogKSB7XG5cblx0X3ZlY3RvciRiLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdGlmICggcG9pbnRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCBfdmVjdG9yJGIueCwgX3ZlY3RvciRiLnksIF92ZWN0b3IkYi56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgX2JveCQzID0gbmV3IEJveDMoKTtcblxuZnVuY3Rpb24gQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XG5cdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQm94SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkJveEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hIZWxwZXI7XG5cbkJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHR9XG5cblx0aWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0X2JveCQzLnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0fVxuXG5cdGlmICggX2JveCQzLmlzRW1wdHkoKSApIHJldHVybjtcblxuXHR2YXIgbWluID0gX2JveCQzLm1pbjtcblx0dmFyIG1heCA9IF9ib3gkMy5tYXg7XG5cblx0Lypcblx0ICA1X19fXzRcblx0MS9fX18wL3xcblx0fCA2X198Xzdcblx0Mi9fX18zL1xuXG5cdDA6IG1heC54LCBtYXgueSwgbWF4Lnpcblx0MTogbWluLngsIG1heC55LCBtYXguelxuXHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdDM6IG1heC54LCBtaW4ueSwgbWF4Lnpcblx0NDogbWF4LngsIG1heC55LCBtaW4uelxuXHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdDY6IG1pbi54LCBtaW4ueSwgbWluLnpcblx0NzogbWF4LngsIG1pbi55LCBtaW4uelxuXHQqL1xuXG5cdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcblx0YXJyYXlbIDMgXSA9IG1pbi54OyBhcnJheVsgNCBdID0gbWF4Lnk7IGFycmF5WyA1IF0gPSBtYXguejtcblx0YXJyYXlbIDYgXSA9IG1pbi54OyBhcnJheVsgNyBdID0gbWluLnk7IGFycmF5WyA4IF0gPSBtYXguejtcblx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xuXHRhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56O1xuXHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xuXG5cdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cbn07XG5cbkJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRMaW5lU2VnbWVudHMucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5vYmplY3QgPSBzb3VyY2Uub2JqZWN0O1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGNvbG9yICkge1xuXG5cdHRoaXMudHlwZSA9ICdCb3gzSGVscGVyJztcblxuXHR0aGlzLmJveCA9IGJveDtcblxuXHRjb2xvciA9IGNvbG9yIHx8IDB4ZmZmZjAwO1xuXG5cdHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XG5cblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cbn1cblxuQm94M0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3gzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveDNIZWxwZXI7XG5cbkJveDNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHR2YXIgYm94ID0gdGhpcy5ib3g7XG5cblx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xuXG5cdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcblxuXHRib3guZ2V0U2l6ZSggdGhpcy5zY2FsZSApO1xuXG5cdHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFBsYW5lSGVscGVyKCBwbGFuZSwgc2l6ZSwgaGV4ICkge1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUhlbHBlcic7XG5cblx0dGhpcy5wbGFuZSA9IHBsYW5lO1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgPyAxIDogc2l6ZTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgcG9zaXRpb25zID0gWyAxLCAtIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMCBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcblxuXHQvL1xuXG5cdHZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApICk7XG5cbn1cblxuUGxhbmVIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKTtcblBsYW5lSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lSGVscGVyO1xuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdHZhciBzY2FsZSA9IC0gdGhpcy5wbGFuZS5jb25zdGFudDtcblxuXHRpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXJcblxuXHR0aGlzLnNjYWxlLnNldCggMC41ICogdGhpcy5zaXplLCAwLjUgKiB0aGlzLnNpemUsIHNjYWxlICk7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLnNpZGUgPSAoIHNjYWxlIDwgMCApID8gQmFja1NpZGUgOiBGcm9udFNpZGU7IC8vIHJlbmRlcmVyIGZsaXBzIHNpZGUgd2hlbiBkZXRlcm1pbmFudCA8IDA7IGZsaXBwaW5nIG5vdCB3YW50ZWQgaGVyZVxuXG5cdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xuXG5cdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICpcbiAqIENyZWF0ZXMgYW4gYXJyb3cgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnNcbiAqXG4gKiBQYXJhbWV0ZXJzOlxuICogIGRpciAtIFZlY3RvcjNcbiAqICBvcmlnaW4gLSBWZWN0b3IzXG4gKiAgbGVuZ3RoIC0gTnVtYmVyXG4gKiAgY29sb3IgLSBjb2xvciBpbiBoZXggdmFsdWVcbiAqICBoZWFkTGVuZ3RoIC0gTnVtYmVyXG4gKiAgaGVhZFdpZHRoIC0gTnVtYmVyXG4gKi9cblxudmFyIF9heGlzID0gbmV3IFZlY3RvcjMoKTtcbnZhciBfbGluZUdlb21ldHJ5LCBfY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggZGlyID09PSB1bmRlZmluZWQgKSBkaXIgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXHRpZiAoIG9yaWdpbiA9PT0gdW5kZWZpbmVkICkgb3JpZ2luID0gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKTtcblx0aWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7XG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0aWYgKCBfbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRfbGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0X2xpbmVHZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7XG5cblx0XHRfY29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdF9jb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApO1xuXG5cdH1cblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xuXG5cdHRoaXMubGluZSA9IG5ldyBMaW5lKCBfbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBfY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcblx0dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdHRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTtcblx0dGhpcy5zZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cbn1cblxuQXJyb3dIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5BcnJvd0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcnJvd0hlbHBlcjtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldERpcmVjdGlvbiA9IGZ1bmN0aW9uICggZGlyICkge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRpZiAoIGRpci55ID4gMC45OTk5OSApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTtcblxuXHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0X2F4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0dmFyIHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggX2F4aXMsIHJhZGlhbnMgKTtcblxuXHR9XG5cbn07XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAuMDAwMSwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7IC8vIHNlZSAjMTc0NThcblx0dGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cdHRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoO1xuXHR0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7XG5cbn07XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggY29sb3IgKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIGZhbHNlICk7XG5cblx0dGhpcy5saW5lLmNvcHkoIHNvdXJjZS5saW5lICk7XG5cdHRoaXMuY29uZS5jb3B5KCBzb3VyY2UuY29uZSApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igc3JvdWNoZXJheSAvIGh0dHA6Ly9zcm91Y2hlcmF5Lm9yZy9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXhlc0hlbHBlciggc2l6ZSApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQwLCAwLCAwLFx0c2l6ZSwgMCwgMCxcblx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcblx0XHQwLCAwLCAwLFx0MCwgMCwgc2l6ZVxuXHRdO1xuXG5cdHZhciBjb2xvcnMgPSBbXG5cdFx0MSwgMCwgMCxcdDEsIDAuNiwgMCxcblx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxuXHRcdDAsIDAsIDEsXHQwLCAwLjYsIDFcblx0XTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBFbW1ldHQgTGFsaXNoIC8gZWxhbGlzaFxuICpcbiAqIFRoaXMgY2xhc3MgZ2VuZXJhdGVzIGEgUHJlZmlsdGVyZWQsIE1pcG1hcHBlZCBSYWRpYW5jZSBFbnZpcm9ubWVudCBNYXBcbiAqIChQTVJFTSkgZnJvbSBhIGN1YmVNYXAgZW52aXJvbm1lbnQgdGV4dHVyZS4gVGhpcyBhbGxvd3MgZGlmZmVyZW50IGxldmVscyBvZlxuICogYmx1ciB0byBiZSBxdWlja2x5IGFjY2Vzc2VkIGJhc2VkIG9uIG1hdGVyaWFsIHJvdWdobmVzcy4gSXQgaXMgcGFja2VkIGludG8gYVxuICogc3BlY2lhbCBDdWJlVVYgZm9ybWF0IHRoYXQgYWxsb3dzIHVzIHRvIHBlcmZvcm0gY3VzdG9tIGludGVycG9sYXRpb24gc28gdGhhdFxuICogd2UgY2FuIHN1cHBvcnQgbm9ubGluZWFyIGZvcm1hdHMgc3VjaCBhcyBSR0JFLiBVbmxpa2UgYSB0cmFkaXRpb25hbCBtaXBtYXBcbiAqIGNoYWluLCBpdCBvbmx5IGdvZXMgZG93biB0byB0aGUgTE9EX01JTiBsZXZlbCAoYWJvdmUpLCBhbmQgdGhlbiBjcmVhdGVzIGV4dHJhXG4gKiBldmVuIG1vcmUgZmlsdGVyZWQgJ21pcHMnIGF0IHRoZSBzYW1lIExPRF9NSU4gcmVzb2x1dGlvbiwgYXNzb2NpYXRlZCB3aXRoXG4gKiBoaWdoZXIgcm91Z2huZXNzIGxldmVscy4gSW4gdGhpcyB3YXkgd2UgbWFpbnRhaW4gcmVzb2x1dGlvbiB0byBzbW9vdGhseVxuICogaW50ZXJwb2xhdGUgZGlmZnVzZSBsaWdodGluZyB3aGlsZSBsaW1pdGluZyBzYW1wbGluZyBjb21wdXRhdGlvbi5cbiAqL1xuXG52YXIgTE9EX01JTiA9IDQ7XG52YXIgTE9EX01BWCA9IDg7XG52YXIgU0laRV9NQVggPSBNYXRoLnBvdyggMiwgTE9EX01BWCApO1xuLy8gVGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgKHJhZGlhbnMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0cmEgbWlwcy4gVGhlc2UgYXJlXG4vLyBjaG9zZW4gdG8gYXBwcm94aW1hdGUgYSBUcm93YnJpZGdlLVJlaXR6IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiB0aW1lcyB0aGVcbi8vIGdlb21ldHJpYyBzaGFkb3dpbmcgZnVuY3Rpb24uIFRoZXNlIHNpZ21hIHZhbHVlcyBzcXVhcmVkIG11c3QgbWF0Y2ggdGhlXG4vLyB2YXJpYW5jZSAjZGVmaW5lcyBpbiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQuZ2xzbC5qcy5cbnZhciBFWFRSQV9MT0RfU0lHTUEgPSBbIDAuMTI1LCAwLjIxNSwgMC4zNSwgMC40NDYsIDAuNTI2LCAwLjU4MiBdO1xudmFyIFRPVEFMX0xPRFMgPSBMT0RfTUFYIC0gTE9EX01JTiArIDEgKyBFWFRSQV9MT0RfU0lHTUEubGVuZ3RoO1xuLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBibHVyIGZvciBsb29wLiBTbWFsbGVyIHNpZ21hcyB3aWxsIHVzZSBmZXdlclxuLy8gc2FtcGxlcyBhbmQgZXhpdCBlYXJseSwgYnV0IG5vdCByZWNvbXBpbGUgdGhlIHNoYWRlci5cbnZhciBNQVhfU0FNUExFUyA9IDIwO1xudmFyIEVOQ09ESU5HUyA9IHtcblx0WyBMaW5lYXJFbmNvZGluZyBdOiAwLFxuXHRbIHNSR0JFbmNvZGluZyBdOiAxLFxuXHRbIFJHQkVFbmNvZGluZyBdOiAyLFxuXHRbIFJHQk03RW5jb2RpbmcgXTogMyxcblx0WyBSR0JNMTZFbmNvZGluZyBdOiA0LFxuXHRbIFJHQkRFbmNvZGluZyBdOiA1LFxuXHRbIEdhbW1hRW5jb2RpbmcgXTogNlxufTtcblxudmFyIF9mbGF0Q2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgpO1xudmFyIF9ibHVyTWF0ZXJpYWwgPSBfZ2V0Qmx1clNoYWRlciggTUFYX1NBTVBMRVMgKTtcbnZhciBfZXF1aXJlY3RTaGFkZXIgPSBudWxsO1xudmFyIF9jdWJlbWFwU2hhZGVyID0gbnVsbDtcblxudmFyIHsgX2xvZFBsYW5lcywgX3NpemVMb2RzLCBfc2lnbWFzIH0gPSBfY3JlYXRlUGxhbmVzKCk7XG52YXIgX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbDtcbnZhciBfcmVuZGVyZXIgPSBudWxsO1xuXG52YXIgX29sZFRhcmdldCA9IG51bGw7XG5cbi8vIEdvbGRlbiBSYXRpb1xudmFyIFBISSA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xudmFyIElOVl9QSEkgPSAxIC8gUEhJO1xuLy8gVmVydGljZXMgb2YgYSBkb2RlY2FoZWRyb24gKGV4Y2VwdCB0aGUgb3Bwb3NpdGVzLCB3aGljaCByZXByZXNlbnQgdGhlXG4vLyBzYW1lIGF4aXMpLCB1c2VkIGFzIGF4aXMgZGlyZWN0aW9ucyBldmVubHkgc3ByZWFkIG9uIGEgc3BoZXJlLlxudmFyIF9heGlzRGlyZWN0aW9ucyA9IFtcblx0bmV3IFZlY3RvcjMoIDEsIDEsIDEgKSxcblx0bmV3IFZlY3RvcjMoIC0gMSwgMSwgMSApLFxuXHRuZXcgVmVjdG9yMyggMSwgMSwgLSAxICksXG5cdG5ldyBWZWN0b3IzKCAtIDEsIDEsIC0gMSApLFxuXHRuZXcgVmVjdG9yMyggMCwgUEhJLCBJTlZfUEhJICksXG5cdG5ldyBWZWN0b3IzKCAwLCBQSEksIC0gSU5WX1BISSApLFxuXHRuZXcgVmVjdG9yMyggSU5WX1BISSwgMCwgUEhJICksXG5cdG5ldyBWZWN0b3IzKCAtIElOVl9QSEksIDAsIFBISSApLFxuXHRuZXcgVmVjdG9yMyggUEhJLCBJTlZfUEhJLCAwICksXG5cdG5ldyBWZWN0b3IzKCAtIFBISSwgSU5WX1BISSwgMCApIF07XG5cbmZ1bmN0aW9uIFBNUkVNR2VuZXJhdG9yKCByZW5kZXJlciApIHtcblxuXHRfcmVuZGVyZXIgPSByZW5kZXJlcjtcblx0X2NvbXBpbGVNYXRlcmlhbCggX2JsdXJNYXRlcmlhbCApO1xuXG59XG5cblBNUkVNR2VuZXJhdG9yLnByb3RvdHlwZSA9IHtcblxuXHRjb25zdHJ1Y3RvcjogUE1SRU1HZW5lcmF0b3IsXG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYSBzdXBwbGllZCBTY2VuZSwgd2hpY2ggY2FuIGJlIGZhc3RlciB0aGFuIHVzaW5nIGFuXG5cdCAqIGltYWdlIGlmIG5ldHdvcmtpbmcgYmFuZHdpZHRoIGlzIGxvdy4gT3B0aW9uYWwgc2lnbWEgc3BlY2lmaWVzIGEgYmx1ciByYWRpdXNcblx0ICogaW4gcmFkaWFucyB0byBiZSBhcHBsaWVkIHRvIHRoZSBzY2VuZSBiZWZvcmUgUE1SRU0gZ2VuZXJhdGlvbi4gT3B0aW9uYWwgbmVhclxuXHQgKiBhbmQgZmFyIHBsYW5lcyBlbnN1cmUgdGhlIHNjZW5lIGlzIHJlbmRlcmVkIGluIGl0cyBlbnRpcmV0eSAodGhlIGN1YmVDYW1lcmFcblx0ICogaXMgcGxhY2VkIGF0IHRoZSBvcmlnaW4pLlxuXHQgKi9cblx0ZnJvbVNjZW5lOiBmdW5jdGlvbiAoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCApIHtcblxuXHRcdF9vbGRUYXJnZXQgPSBfcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cdFx0dmFyIGN1YmVVVlJlbmRlclRhcmdldCA9IF9hbGxvY2F0ZVRhcmdldHMoKTtcblx0XHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0aWYgKCBzaWdtYSA+IDAgKSB7XG5cblx0XHRcdF9ibHVyKCBjdWJlVVZSZW5kZXJUYXJnZXQsIDAsIDAsIHNpZ21hICk7XG5cblx0XHR9XG5cdFx0X2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXHRcdF9jbGVhbnVwKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XG5cblx0fSxcblxuXHQvKipcblx0ICogR2VuZXJhdGVzIGEgUE1SRU0gZnJvbSBhbiBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBMRFJcblx0ICogKFJHQkZvcm1hdCkgb3IgSERSIChSR0JFRm9ybWF0KS4gVGhlIGlkZWFsIGlucHV0IGltYWdlIHNpemUgaXMgMWsgKDEwMjQgeCA1MTIpLFxuXHQgKiBhcyB0aGlzIG1hdGNoZXMgYmVzdCB3aXRoIHRoZSAyNTYgeCAyNTYgY3ViZW1hcCBvdXRwdXQuXG5cdCAqL1xuXHRmcm9tRXF1aXJlY3Rhbmd1bGFyOiBmdW5jdGlvbiAoIGVxdWlyZWN0YW5ndWxhciApIHtcblxuXHRcdGVxdWlyZWN0YW5ndWxhci5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHRcdGVxdWlyZWN0YW5ndWxhci5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHRcdGVxdWlyZWN0YW5ndWxhci5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21DdWJlbWFwKCBlcXVpcmVjdGFuZ3VsYXIgKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGFuIGN1YmVtYXAgdGV4dHVyZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBMRFJcblx0ICogKFJHQkZvcm1hdCkgb3IgSERSIChSR0JFRm9ybWF0KS4gVGhlIGlkZWFsIGlucHV0IGN1YmUgc2l6ZSBpcyAyNTYgeCAyNTYsXG5cdCAqIGFzIHRoaXMgbWF0Y2hlcyBiZXN0IHdpdGggdGhlIDI1NiB4IDI1NiBjdWJlbWFwIG91dHB1dC5cblx0ICovXG5cdGZyb21DdWJlbWFwOiBmdW5jdGlvbiAoIGN1YmVtYXAgKSB7XG5cblx0XHRfb2xkVGFyZ2V0ID0gX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdHZhciBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfYWxsb2NhdGVUYXJnZXRzKCBjdWJlbWFwICk7XG5cdFx0X3RleHR1cmVUb0N1YmVVViggY3ViZW1hcCwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0X2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXHRcdF9jbGVhbnVwKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XG5cblx0fSxcblxuXHQvKipcblx0ICogUHJlLWNvbXBpbGVzIHRoZSBjdWJlbWFwIHNoYWRlci4gWW91IGNhbiBnZXQgZmFzdGVyIHN0YXJ0LXVwIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGR1cmluZ1xuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXG5cdCAqL1xuXHRjb21waWxlQ3ViZW1hcFNoYWRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBfY3ViZW1hcFNoYWRlciA9PSBudWxsICkge1xuXG5cdFx0XHRfY3ViZW1hcFNoYWRlciA9IF9nZXRDdWJlbWFwU2hhZGVyKCk7XG5cdFx0XHRfY29tcGlsZU1hdGVyaWFsKCBfY3ViZW1hcFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFByZS1jb21waWxlcyB0aGUgZXF1aXJlY3Rhbmd1bGFyIHNoYWRlci4gWW91IGNhbiBnZXQgZmFzdGVyIHN0YXJ0LXVwIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGR1cmluZ1xuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXG5cdCAqL1xuXHRjb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIF9lcXVpcmVjdFNoYWRlciA9PSBudWxsICkge1xuXG5cdFx0XHRfZXF1aXJlY3RTaGFkZXIgPSBfZ2V0RXF1aXJlY3RTaGFkZXIoKTtcblx0XHRcdF9jb21waWxlTWF0ZXJpYWwoIF9lcXVpcmVjdFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0LyoqXG5cdCAqIERpc3Bvc2VzIG9mIHRoZSBQTVJFTUdlbmVyYXRvcidzIGludGVybmFsIG1lbW9yeS4gTm90ZSB0aGF0IFBNUkVNR2VuZXJhdG9yIGlzIGEgc3RhdGljIGNsYXNzLFxuXHQgKiBzbyB5b3Ugc2hvdWxkIG5vdCBuZWVkIG1vcmUgdGhhbiBvbmUgUE1SRU1HZW5lcmF0b3Igb2JqZWN0LiBJZiB5b3UgZG8sIGNhbGxpbmcgZGlzcG9zZSgpIG9uXG5cdCAqIG9uZSBvZiB0aGVtIHdpbGwgY2F1c2UgYW55IG90aGVycyB0byBhbHNvIGJlY29tZSB1bnVzYWJsZS5cblx0ICovXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG5cdFx0aWYgKCBfY3ViZW1hcFNoYWRlciAhPSBudWxsICkgX2N1YmVtYXBTaGFkZXIuZGlzcG9zZSgpO1xuXHRcdGlmICggX2VxdWlyZWN0U2hhZGVyICE9IG51bGwgKSBfZXF1aXJlY3RTaGFkZXIuZGlzcG9zZSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX2xvZFBsYW5lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdF9sb2RQbGFuZXNbIGkgXS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0fSxcblxufTtcblxuZnVuY3Rpb24gX2NyZWF0ZVBsYW5lcygpIHtcblxuXHR2YXIgX2xvZFBsYW5lcyA9IFtdO1xuXHR2YXIgX3NpemVMb2RzID0gW107XG5cdHZhciBfc2lnbWFzID0gW107XG5cblx0dmFyIGxvZCA9IExPRF9NQVg7XG5cdGZvciAoIHZhciBpID0gMDsgaSA8IFRPVEFMX0xPRFM7IGkgKysgKSB7XG5cblx0XHR2YXIgc2l6ZUxvZCA9IE1hdGgucG93KCAyLCBsb2QgKTtcblx0XHRfc2l6ZUxvZHMucHVzaCggc2l6ZUxvZCApO1xuXHRcdHZhciBzaWdtYSA9IDEuMCAvIHNpemVMb2Q7XG5cdFx0aWYgKCBpID4gTE9EX01BWCAtIExPRF9NSU4gKSB7XG5cblx0XHRcdHNpZ21hID0gRVhUUkFfTE9EX1NJR01BWyBpIC0gTE9EX01BWCArIExPRF9NSU4gLSAxIF07XG5cblx0XHR9IGVsc2UgaWYgKCBpID09IDAgKSB7XG5cblx0XHRcdHNpZ21hID0gMDtcblxuXHRcdH1cblx0XHRfc2lnbWFzLnB1c2goIHNpZ21hICk7XG5cblx0XHR2YXIgdGV4ZWxTaXplID0gMS4wIC8gKCBzaXplTG9kIC0gMSApO1xuXHRcdHZhciBtaW4gPSAtIHRleGVsU2l6ZSAvIDI7XG5cdFx0dmFyIG1heCA9IDEgKyB0ZXhlbFNpemUgLyAyO1xuXHRcdHZhciB1djEgPSBbIG1pbiwgbWluLCBtYXgsIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWluLCBtYXgsIG1heCwgbWluLCBtYXggXTtcblxuXHRcdHZhciBjdWJlRmFjZXMgPSA2O1xuXHRcdHZhciB2ZXJ0aWNlcyA9IDY7XG5cdFx0dmFyIHBvc2l0aW9uU2l6ZSA9IDM7XG5cdFx0dmFyIHV2U2l6ZSA9IDI7XG5cdFx0dmFyIGZhY2VJbmRleFNpemUgPSAxO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25TaXplICogdmVydGljZXMgKiBjdWJlRmFjZXMgKTtcblx0XHR2YXIgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xuXHRcdHZhciBmYWNlSW5kZXggPSBuZXcgRmxvYXQzMkFycmF5KCBmYWNlSW5kZXhTaXplICogdmVydGljZXMgKiBjdWJlRmFjZXMgKTtcblxuXHRcdGZvciAoIHZhciBmYWNlID0gMDsgZmFjZSA8IGN1YmVGYWNlczsgZmFjZSArKyApIHtcblxuXHRcdFx0dmFyIHggPSAoIGZhY2UgJSAzICkgKiAyIC8gMyAtIDE7XG5cdFx0XHR2YXIgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcblx0XHRcdHZhciBjb29yZGluYXRlcyA9IFtcblx0XHRcdFx0eCwgeSwgMCxcblx0XHRcdFx0eCArIDIgLyAzLCB5LCAwLFxuXHRcdFx0XHR4ICsgMiAvIDMsIHkgKyAxLCAwLFxuXHRcdFx0XHR4LCB5LCAwLFxuXHRcdFx0XHR4ICsgMiAvIDMsIHkgKyAxLCAwLFxuXHRcdFx0XHR4LCB5ICsgMSwgMFxuXHRcdFx0XTtcblx0XHRcdHBvc2l0aW9uLnNldCggY29vcmRpbmF0ZXMsIHBvc2l0aW9uU2l6ZSAqIHZlcnRpY2VzICogZmFjZSApO1xuXHRcdFx0dXYuc2V0KCB1djEsIHV2U2l6ZSAqIHZlcnRpY2VzICogZmFjZSApO1xuXHRcdFx0dmFyIGZpbGwgPSBbIGZhY2UsIGZhY2UsIGZhY2UsIGZhY2UsIGZhY2UsIGZhY2UgXTtcblx0XHRcdGZhY2VJbmRleC5zZXQoIGZpbGwsIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGZhY2UgKTtcblxuXHRcdH1cblx0XHR2YXIgcGxhbmVzID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIHBvc2l0aW9uU2l6ZSApICk7XG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXYsIHV2U2l6ZSApICk7XG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGZhY2VJbmRleCwgZmFjZUluZGV4U2l6ZSApICk7XG5cdFx0X2xvZFBsYW5lcy5wdXNoKCBwbGFuZXMgKTtcblxuXHRcdGlmICggbG9kID4gTE9EX01JTiApIHtcblxuXHRcdFx0bG9kIC0tO1xuXG5cdFx0fVxuXG5cdH1cblx0cmV0dXJuIHsgX2xvZFBsYW5lcywgX3NpemVMb2RzLCBfc2lnbWFzIH07XG5cbn1cblxuZnVuY3Rpb24gX2FsbG9jYXRlVGFyZ2V0cyggZXF1aXJlY3Rhbmd1bGFyICkge1xuXG5cdHZhciBwYXJhbXMgPSB7XG5cdFx0bWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHRcdG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0XHRnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLFxuXHRcdHR5cGU6IGVxdWlyZWN0YW5ndWxhciA/IGVxdWlyZWN0YW5ndWxhci50eXBlIDogVW5zaWduZWRCeXRlVHlwZSxcblx0XHRmb3JtYXQ6IGVxdWlyZWN0YW5ndWxhciA/IGVxdWlyZWN0YW5ndWxhci5mb3JtYXQgOiBSR0JFRm9ybWF0LFxuXHRcdGVuY29kaW5nOiBlcXVpcmVjdGFuZ3VsYXIgPyBlcXVpcmVjdGFuZ3VsYXIuZW5jb2RpbmcgOiBSR0JFRW5jb2RpbmcsXG5cdFx0ZGVwdGhCdWZmZXI6IGZhbHNlLFxuXHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlXG5cdH07XG5cdHZhciBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCBwYXJhbXMgKTtcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyID0gZXF1aXJlY3Rhbmd1bGFyID8gZmFsc2UgOiB0cnVlO1xuXHRfcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCBwYXJhbXMgKTtcblx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcblxufVxuXG5mdW5jdGlvbiBfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xuXG5cdF9waW5nUG9uZ1JlbmRlclRhcmdldC5kaXNwb3NlKCk7XG5cdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIF9vbGRUYXJnZXQgKTtcblx0b3V0cHV0VGFyZ2V0LnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cdC8vIHJlc2V0IHZpZXdwb3J0IGFuZCBzY2lzc29yXG5cdG91dHB1dFRhcmdldC5zZXRTaXplKCBvdXRwdXRUYXJnZXQud2lkdGgsIG91dHB1dFRhcmdldC5oZWlnaHQgKTtcblxufVxuXG5mdW5jdGlvbiBfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdHZhciBmb3YgPSA5MDtcblx0dmFyIGFzcGVjdCA9IDE7XG5cdHZhciBjdWJlQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdHZhciB1cFNpZ24gPSBbIDEsIDEsIDEsIDEsIC0gMSwgMSBdO1xuXHR2YXIgZm9yd2FyZFNpZ24gPSBbIDEsIDEsIC0gMSwgLSAxLCAtIDEsIDEgXTtcblxuXHR2YXIgb3V0cHV0RW5jb2RpbmcgPSBfcmVuZGVyZXIub3V0cHV0RW5jb2Rpbmc7XG5cdHZhciB0b25lTWFwcGluZyA9IF9yZW5kZXJlci50b25lTWFwcGluZztcblx0dmFyIHRvbmVNYXBwaW5nRXhwb3N1cmUgPSBfcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0dmFyIGNsZWFyQ29sb3IgPSBfcmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcigpO1xuXHR2YXIgY2xlYXJBbHBoYSA9IF9yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG5cblx0X3JlbmRlcmVyLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7XG5cdF9yZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHRfcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZztcblx0c2NlbmUuc2NhbGUueiAqPSAtIDE7XG5cblx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXHRpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0YmFja2dyb3VuZC5jb252ZXJ0U1JHQlRvTGluZWFyKCk7XG5cdFx0Ly8gQ29udmVydCBsaW5lYXIgdG8gUkdCRVxuXHRcdHZhciBtYXhDb21wb25lbnQgPSBNYXRoLm1heCggYmFja2dyb3VuZC5yLCBiYWNrZ3JvdW5kLmcsIGJhY2tncm91bmQuYiApO1xuXHRcdHZhciBmRXhwID0gTWF0aC5taW4oIE1hdGgubWF4KCBNYXRoLmNlaWwoIE1hdGgubG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLSAxMjguMCApLCAxMjcuMCApO1xuXHRcdGJhY2tncm91bmQgPSBiYWNrZ3JvdW5kLm11bHRpcGx5U2NhbGFyKCBNYXRoLnBvdyggMi4wLCAtIGZFeHAgKSApO1xuXHRcdHZhciBhbHBoYSA9ICggZkV4cCArIDEyOC4wICkgLyAyNTUuMDtcblx0XHRfcmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggYmFja2dyb3VuZCwgYWxwaGEgKTtcblx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdHZhciBjb2wgPSBpICUgMztcblx0XHRpZiAoIGNvbCA9PSAwICkge1xuXG5cdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgdXBTaWduWyBpIF0sIDAgKTtcblx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBmb3J3YXJkU2lnblsgaSBdLCAwLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCBjb2wgPT0gMSApIHtcblxuXHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIDAsIHVwU2lnblsgaSBdICk7XG5cdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgZm9yd2FyZFNpZ25bIGkgXSwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XG5cdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgMCwgZm9yd2FyZFNpZ25bIGkgXSApO1xuXG5cdFx0fVxuXHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LFxuXHRcdFx0Y29sICogU0laRV9NQVgsIGkgPiAyID8gU0laRV9NQVggOiAwLCBTSVpFX01BWCwgU0laRV9NQVggKTtcblx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcblx0XHRfcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY3ViZUNhbWVyYSApO1xuXG5cdH1cblxuXHRfcmVuZGVyZXIudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcblx0X3JlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRfcmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBvdXRwdXRFbmNvZGluZztcblx0X3JlbmRlcmVyLnNldENsZWFyQ29sb3IoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblx0c2NlbmUuc2NhbGUueiAqPSAtIDE7XG5cbn1cblxuZnVuY3Rpb24gX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdHZhciBzY2VuZSA9IG5ldyBTY2VuZSgpO1xuXHRpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcblxuXHRcdGlmICggX2N1YmVtYXBTaGFkZXIgPT0gbnVsbCApIHtcblxuXHRcdFx0X2N1YmVtYXBTaGFkZXIgPSBfZ2V0Q3ViZW1hcFNoYWRlcigpO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIF9lcXVpcmVjdFNoYWRlciA9PSBudWxsICkge1xuXG5cdFx0XHRfZXF1aXJlY3RTaGFkZXIgPSBfZ2V0RXF1aXJlY3RTaGFkZXIoKTtcblxuXHRcdH1cblxuXHR9XG5cdHZhciBtYXRlcmlhbCA9IHRleHR1cmUuaXNDdWJlVGV4dHVyZSA/IF9jdWJlbWFwU2hhZGVyIDogX2VxdWlyZWN0U2hhZGVyO1xuXHRzY2VuZS5hZGQoIG5ldyBNZXNoKCBfbG9kUGxhbmVzWyAwIF0sIG1hdGVyaWFsICkgKTtcblx0dmFyIHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XG5cblx0dW5pZm9ybXNbICdlbnZNYXAnIF0udmFsdWUgPSB0ZXh0dXJlO1xuXHRpZiAoICEgdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0dW5pZm9ybXNbICd0ZXhlbFNpemUnIF0udmFsdWUuc2V0KCAxLjAgLyB0ZXh0dXJlLmltYWdlLndpZHRoLCAxLjAgLyB0ZXh0dXJlLmltYWdlLmhlaWdodCApO1xuXG5cdH1cblx0dW5pZm9ybXNbICdpbnB1dEVuY29kaW5nJyBdLnZhbHVlID0gRU5DT0RJTkdTWyB0ZXh0dXJlLmVuY29kaW5nIF07XG5cdHVuaWZvcm1zWyAnb3V0cHV0RW5jb2RpbmcnIF0udmFsdWUgPSBFTkNPRElOR1NbIHRleHR1cmUuZW5jb2RpbmcgXTtcblxuXHRfc2V0Vmlld3BvcnQoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgMyAqIFNJWkVfTUFYLCAyICogU0laRV9NQVggKTtcblx0X3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdF9yZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBfZmxhdENhbWVyYSApO1xuXG59XG5cbmZ1bmN0aW9uIF9jb21waWxlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdHZhciB0bXBTY2VuZSA9IG5ldyBTY2VuZSgpO1xuXHR0bXBTY2VuZS5hZGQoIG5ldyBNZXNoKCBfbG9kUGxhbmVzWyAwIF0sIG1hdGVyaWFsICkgKTtcblx0X3JlbmRlcmVyLmNvbXBpbGUoIHRtcFNjZW5lLCBfZmxhdENhbWVyYSApO1xuXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVSZW5kZXJUYXJnZXQoIHBhcmFtcyApIHtcblxuXHR2YXIgY3ViZVVWUmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCAzICogU0laRV9NQVgsIDMgKiBTSVpFX01BWCwgcGFyYW1zICk7XG5cdGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLm1hcHBpbmcgPSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZztcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICdQTVJFTS5jdWJlVXYnO1xuXHRjdWJlVVZSZW5kZXJUYXJnZXQuc2Npc3NvclRlc3QgPSB0cnVlO1xuXHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xuXG59XG5cbmZ1bmN0aW9uIF9zZXRWaWV3cG9ydCggdGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdHRhcmdldC52aWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcblx0dGFyZ2V0LnNjaXNzb3Iuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG5cbn1cblxuZnVuY3Rpb24gX2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApIHtcblxuXHR2YXIgYXV0b0NsZWFyID0gX3JlbmRlcmVyLmF1dG9DbGVhcjtcblx0X3JlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xuXG5cdGZvciAoIHZhciBpID0gMTsgaSA8IFRPVEFMX0xPRFM7IGkgKysgKSB7XG5cblx0XHR2YXIgc2lnbWEgPSBNYXRoLnNxcnQoXG5cdFx0XHRfc2lnbWFzWyBpIF0gKiBfc2lnbWFzWyBpIF0gLVxuXHRcdF9zaWdtYXNbIGkgLSAxIF0gKiBfc2lnbWFzWyBpIC0gMSBdICk7XG5cdFx0dmFyIHBvbGVBeGlzID1cblx0XHRfYXhpc0RpcmVjdGlvbnNbICggaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcblx0XHRfYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBpIC0gMSwgaSwgc2lnbWEsIHBvbGVBeGlzICk7XG5cblx0fVxuXG5cdF9yZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XG5cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGEgdHdvLXBhc3MgR2F1c3NpYW4gYmx1ciBmb3IgYSBjdWJlbWFwLiBOb3JtYWxseSB0aGlzIGlzIGRvbmVcbiAqIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSwgYnV0IHRoaXMgYnJlYWtzIGRvd24gb24gYSBjdWJlLiBIZXJlIHdlIGFwcGx5XG4gKiB0aGUgYmx1ciBsYXRpdHVkaW5hbGx5IChhcm91bmQgdGhlIHBvbGVzKSwgYW5kIHRoZW4gbG9uZ2l0dWRpbmFsbHkgKHRvd2FyZHNcbiAqIHRoZSBwb2xlcykgdG8gYXBwcm94aW1hdGUgdGhlIG9ydGhvZ29uYWxseS1zZXBhcmFibGUgYmx1ci4gSXQgaXMgbGVhc3RcbiAqIGFjY3VyYXRlIGF0IHRoZSBwb2xlcywgYnV0IHN0aWxsIGRvZXMgYSBkZWNlbnQgam9iLlxuICovXG5mdW5jdGlvbiBfYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYSwgcG9sZUF4aXMgKSB7XG5cblx0X2hhbGZCbHVyKFxuXHRcdGN1YmVVVlJlbmRlclRhcmdldCxcblx0XHRfcGluZ1BvbmdSZW5kZXJUYXJnZXQsXG5cdFx0bG9kSW4sXG5cdFx0bG9kT3V0LFxuXHRcdHNpZ21hLFxuXHRcdCdsYXRpdHVkaW5hbCcsXG5cdFx0cG9sZUF4aXMgKTtcblxuXHRfaGFsZkJsdXIoXG5cdFx0X3BpbmdQb25nUmVuZGVyVGFyZ2V0LFxuXHRcdGN1YmVVVlJlbmRlclRhcmdldCxcblx0XHRsb2RPdXQsXG5cdFx0bG9kT3V0LFxuXHRcdHNpZ21hLFxuXHRcdCdsb25naXR1ZGluYWwnLFxuXHRcdHBvbGVBeGlzICk7XG5cbn1cblxuZnVuY3Rpb24gX2hhbGZCbHVyKCB0YXJnZXRJbiwgdGFyZ2V0T3V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYVJhZGlhbnMsIGRpcmVjdGlvbiwgcG9sZUF4aXMgKSB7XG5cblx0aWYgKCBkaXJlY3Rpb24gIT09ICdsYXRpdHVkaW5hbCcgJiYgZGlyZWN0aW9uICE9PSAnbG9uZ2l0dWRpbmFsJyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHQnYmx1ciBkaXJlY3Rpb24gbXVzdCBiZSBlaXRoZXIgbGF0aXR1ZGluYWwgb3IgbG9uZ2l0dWRpbmFsIScgKTtcblxuXHR9XG5cblx0Ly8gTnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYXQgd2hpY2ggdG8gY3V0IG9mZiB0aGUgZGlzY3JldGUgYXBwcm94aW1hdGlvbi5cblx0dmFyIFNUQU5EQVJEX0RFVklBVElPTlMgPSAzO1xuXG5cdHZhciBibHVyU2NlbmUgPSBuZXcgU2NlbmUoKTtcblx0Ymx1clNjZW5lLmFkZCggbmV3IE1lc2goIF9sb2RQbGFuZXNbIGxvZE91dCBdLCBfYmx1ck1hdGVyaWFsICkgKTtcblx0dmFyIGJsdXJVbmlmb3JtcyA9IF9ibHVyTWF0ZXJpYWwudW5pZm9ybXM7XG5cblx0dmFyIHBpeGVscyA9IF9zaXplTG9kc1sgbG9kSW4gXSAtIDE7XG5cdHZhciByYWRpYW5zUGVyUGl4ZWwgPSBpc0Zpbml0ZSggc2lnbWFSYWRpYW5zICkgPyBNYXRoLlBJIC8gKCAyICogcGl4ZWxzICkgOiAyICogTWF0aC5QSSAvICggMiAqIE1BWF9TQU1QTEVTIC0gMSApO1xuXHR2YXIgc2lnbWFQaXhlbHMgPSBzaWdtYVJhZGlhbnMgLyByYWRpYW5zUGVyUGl4ZWw7XG5cdHZhciBzYW1wbGVzID0gaXNGaW5pdGUoIHNpZ21hUmFkaWFucyApID8gMSArIE1hdGguZmxvb3IoIFNUQU5EQVJEX0RFVklBVElPTlMgKiBzaWdtYVBpeGVscyApIDogTUFYX1NBTVBMRVM7XG5cblx0aWYgKCBzYW1wbGVzID4gTUFYX1NBTVBMRVMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oIGBzaWdtYVJhZGlhbnMsICR7XG5cdFx0XHRzaWdtYVJhZGlhbnN9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7XG5cdFx0XHRzYW1wbGVzfSBzYW1wbGVzIHdoZW4gdGhlIG1heGltdW0gaXMgc2V0IHRvICR7TUFYX1NBTVBMRVN9YCApO1xuXG5cdH1cblxuXHR2YXIgd2VpZ2h0cyA9IFtdO1xuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBNQVhfU0FNUExFUzsgKysgaSApIHtcblxuXHRcdHZhciB4ID0gaSAvIHNpZ21hUGl4ZWxzO1xuXHRcdHZhciB3ZWlnaHQgPSBNYXRoLmV4cCggLSB4ICogeCAvIDIgKTtcblx0XHR3ZWlnaHRzLnB1c2goIHdlaWdodCApO1xuXG5cdFx0aWYgKCBpID09IDAgKSB7XG5cblx0XHRcdHN1bSArPSB3ZWlnaHQ7XG5cblx0XHR9IGVsc2UgaWYgKCBpIDwgc2FtcGxlcyApIHtcblxuXHRcdFx0c3VtICs9IDIgKiB3ZWlnaHQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0d2VpZ2h0c1sgaSBdID0gd2VpZ2h0c1sgaSBdIC8gc3VtO1xuXG5cdH1cblxuXHRibHVyVW5pZm9ybXNbICdlbnZNYXAnIF0udmFsdWUgPSB0YXJnZXRJbi50ZXh0dXJlO1xuXHRibHVyVW5pZm9ybXNbICdzYW1wbGVzJyBdLnZhbHVlID0gc2FtcGxlcztcblx0Ymx1clVuaWZvcm1zWyAnd2VpZ2h0cycgXS52YWx1ZSA9IHdlaWdodHM7XG5cdGJsdXJVbmlmb3Jtc1sgJ2xhdGl0dWRpbmFsJyBdLnZhbHVlID0gZGlyZWN0aW9uID09PSAnbGF0aXR1ZGluYWwnO1xuXHRpZiAoIHBvbGVBeGlzICkge1xuXG5cdFx0Ymx1clVuaWZvcm1zWyAncG9sZUF4aXMnIF0udmFsdWUgPSBwb2xlQXhpcztcblxuXHR9XG5cdGJsdXJVbmlmb3Jtc1sgJ2RUaGV0YScgXS52YWx1ZSA9IHJhZGlhbnNQZXJQaXhlbDtcblx0Ymx1clVuaWZvcm1zWyAnbWlwSW50JyBdLnZhbHVlID0gTE9EX01BWCAtIGxvZEluO1xuXHRibHVyVW5pZm9ybXNbICdpbnB1dEVuY29kaW5nJyBdLnZhbHVlID0gRU5DT0RJTkdTWyB0YXJnZXRJbi50ZXh0dXJlLmVuY29kaW5nIF07XG5cdGJsdXJVbmlmb3Jtc1sgJ291dHB1dEVuY29kaW5nJyBdLnZhbHVlID0gRU5DT0RJTkdTWyB0YXJnZXRJbi50ZXh0dXJlLmVuY29kaW5nIF07XG5cblx0dmFyIG91dHB1dFNpemUgPSBfc2l6ZUxvZHNbIGxvZE91dCBdO1xuXHR2YXIgeCA9IDMgKiBNYXRoLm1heCggMCwgU0laRV9NQVggLSAyICogb3V0cHV0U2l6ZSApO1xuXHR2YXIgeSA9ICggbG9kT3V0ID09PSAwID8gMCA6IDIgKiBTSVpFX01BWCApICtcblx0MiAqIG91dHB1dFNpemUgKlxuXHRcdCggbG9kT3V0ID4gTE9EX01BWCAtIExPRF9NSU4gPyBsb2RPdXQgLSBMT0RfTUFYICsgTE9EX01JTiA6IDAgKTtcblxuXHRfc2V0Vmlld3BvcnQoIHRhcmdldE91dCwgeCwgeSwgMyAqIG91dHB1dFNpemUsIDIgKiBvdXRwdXRTaXplICk7XG5cdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHRhcmdldE91dCApO1xuXHRfcmVuZGVyZXIucmVuZGVyKCBibHVyU2NlbmUsIF9mbGF0Q2FtZXJhICk7XG5cbn1cblxuZnVuY3Rpb24gX2dldEJsdXJTaGFkZXIoIG1heFNhbXBsZXMgKSB7XG5cblx0dmFyIHdlaWdodHMgPSBuZXcgRmxvYXQzMkFycmF5KCBtYXhTYW1wbGVzICk7XG5cdHZhciBwb2xlQXhpcyA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cdHZhciBzaGFkZXJNYXRlcmlhbCA9IG5ldyBSYXdTaGFkZXJNYXRlcmlhbCgge1xuXG5cdFx0ZGVmaW5lczogeyAnbic6IG1heFNhbXBsZXMgfSxcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHQnZW52TWFwJzogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0J3NhbXBsZXMnOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHQnd2VpZ2h0cyc6IHsgdmFsdWU6IHdlaWdodHMgfSxcblx0XHRcdCdsYXRpdHVkaW5hbCc6IHsgdmFsdWU6IGZhbHNlIH0sXG5cdFx0XHQnZFRoZXRhJzogeyB2YWx1ZTogMCB9LFxuXHRcdFx0J21pcEludCc6IHsgdmFsdWU6IDAgfSxcblx0XHRcdCdwb2xlQXhpcyc6IHsgdmFsdWU6IHBvbGVBeGlzIH0sXG5cdFx0XHQnaW5wdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9LFxuXHRcdFx0J291dHB1dEVuY29kaW5nJzogeyB2YWx1ZTogRU5DT0RJTkdTWyBMaW5lYXJFbmNvZGluZyBdIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXG5cblx0XHRmcmFnbWVudFNoYWRlcjogYFxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5wcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG52YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcbnVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcbnVuaWZvcm0gaW50IHNhbXBsZXM7XG51bmlmb3JtIGZsb2F0IHdlaWdodHNbbl07XG51bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7XG51bmlmb3JtIGZsb2F0IGRUaGV0YTtcbnVuaWZvcm0gZmxvYXQgbWlwSW50O1xudW5pZm9ybSB2ZWMzIHBvbGVBeGlzO1xuXG4ke19nZXRFbmNvZGluZ3MoKX1cblxuI2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuXG52ZWMzIGdldFNhbXBsZShmbG9hdCB0aGV0YSwgdmVjMyBheGlzKSB7XG5cdGZsb2F0IGNvc1RoZXRhID0gY29zKHRoZXRhKTtcblx0Ly8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uXG5cdHZlYzMgc2FtcGxlRGlyZWN0aW9uID0gdk91dHB1dERpcmVjdGlvbiAqIGNvc1RoZXRhXG5cdFx0KyBjcm9zcyhheGlzLCB2T3V0cHV0RGlyZWN0aW9uKSAqIHNpbih0aGV0YSlcblx0XHQrIGF4aXMgKiBkb3QoYXhpcywgdk91dHB1dERpcmVjdGlvbikgKiAoMS4wIC0gY29zVGhldGEpO1xuXHRyZXR1cm4gYmlsaW5lYXJDdWJlVVYoZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCk7XG59XG5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyBheGlzID0gbGF0aXR1ZGluYWwgPyBwb2xlQXhpcyA6IGNyb3NzKHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uKTtcblx0aWYgKGFsbChlcXVhbChheGlzLCB2ZWMzKDAuMCkpKSlcblx0XHRheGlzID0gdmVjMyh2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLngpO1xuXHRheGlzID0gbm9ybWFsaXplKGF4aXMpO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7XG5cdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1swXSAqIGdldFNhbXBsZSgwLjAsIGF4aXMpO1xuXHRmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykge1xuXHRcdGlmIChpID49IHNhbXBsZXMpXG5cdFx0XHRicmVhaztcblx0XHRmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KGkpO1xuXHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1tpXSAqIGdldFNhbXBsZSgtMS4wICogdGhldGEsIGF4aXMpO1xuXHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1tpXSAqIGdldFNhbXBsZSh0aGV0YSwgYXhpcyk7XG5cdH1cblx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbChnbF9GcmFnQ29sb3IpO1xufVxuXHRcdGAsXG5cblx0XHRibGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXG5cblx0fSApO1xuXG5cdHNoYWRlck1hdGVyaWFsLnR5cGUgPSAnU3BoZXJpY2FsR2F1c3NpYW5CbHVyJztcblxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XG5cbn1cblxuZnVuY3Rpb24gX2dldEVxdWlyZWN0U2hhZGVyKCkge1xuXG5cdHZhciB0ZXhlbFNpemUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR2YXIgc2hhZGVyTWF0ZXJpYWwgPSBuZXcgUmF3U2hhZGVyTWF0ZXJpYWwoIHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHQnZW52TWFwJzogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0J3RleGVsU2l6ZSc6IHsgdmFsdWU6IHRleGVsU2l6ZSB9LFxuXHRcdFx0J2lucHV0RW5jb2RpbmcnOiB7IHZhbHVlOiBFTkNPRElOR1NbIExpbmVhckVuY29kaW5nIF0gfSxcblx0XHRcdCdvdXRwdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogX2dldENvbW1vblZlcnRleFNoYWRlcigpLFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IGBcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xucHJlY2lzaW9uIG1lZGl1bXAgaW50O1xudmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG51bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xuXG4ke19nZXRFbmNvZGluZ3MoKX1cblxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxuXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wKTtcblx0dmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUodk91dHB1dERpcmVjdGlvbik7XG5cdHZlYzIgdXY7XG5cdHV2LnkgPSBhc2luKGNsYW1wKG91dHB1dERpcmVjdGlvbi55LCAtMS4wLCAxLjApKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHV2LnggPSBhdGFuKG91dHB1dERpcmVjdGlvbi56LCBvdXRwdXREaXJlY3Rpb24ueCkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjMiBmID0gZnJhY3QodXYgLyB0ZXhlbFNpemUgLSAwLjUpO1xuXHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHR2ZWMzIHRsID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dikpLnJnYjtcblx0dXYueCArPSB0ZXhlbFNpemUueDtcblx0dmVjMyB0ciA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXYpKS5yZ2I7XG5cdHV2LnkgKz0gdGV4ZWxTaXplLnk7XG5cdHZlYzMgYnIgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2KSkucmdiO1xuXHR1di54IC09IHRleGVsU2l6ZS54O1xuXHR2ZWMzIGJsID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dikpLnJnYjtcblx0dmVjMyB0bSA9IG1peCh0bCwgdHIsIGYueCk7XG5cdHZlYzMgYm0gPSBtaXgoYmwsIGJyLCBmLngpO1xuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KHRtLCBibSwgZi55KTtcblx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbChnbF9GcmFnQ29sb3IpO1xufVxuXHRcdGAsXG5cblx0XHRibGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXG5cblx0fSApO1xuXG5cdHNoYWRlck1hdGVyaWFsLnR5cGUgPSAnRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYnO1xuXG5cdHJldHVybiBzaGFkZXJNYXRlcmlhbDtcblxufVxuXG5mdW5jdGlvbiBfZ2V0Q3ViZW1hcFNoYWRlcigpIHtcblxuXHR2YXIgc2hhZGVyTWF0ZXJpYWwgPSBuZXcgUmF3U2hhZGVyTWF0ZXJpYWwoIHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHQnZW52TWFwJzogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0J2lucHV0RW5jb2RpbmcnOiB7IHZhbHVlOiBFTkNPRElOR1NbIExpbmVhckVuY29kaW5nIF0gfSxcblx0XHRcdCdvdXRwdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogX2dldENvbW1vblZlcnRleFNoYWRlcigpLFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IGBcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xucHJlY2lzaW9uIG1lZGl1bXAgaW50O1xudmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG51bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuJHtfZ2V0RW5jb2RpbmdzKCl9XG5cbnZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCgwLjApO1xuXHRnbF9GcmFnQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlQ3ViZShlbnZNYXAsIHZlYzMoIC0gdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkpKS5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoZ2xfRnJhZ0NvbG9yKTtcbn1cblx0XHRgLFxuXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxuXG5cdH0gKTtcblxuXHRzaGFkZXJNYXRlcmlhbC50eXBlID0gJ0N1YmVtYXBUb0N1YmVVVic7XG5cblx0cmV0dXJuIHNoYWRlck1hdGVyaWFsO1xuXG59XG5cbmZ1bmN0aW9uIF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSB7XG5cblx0cmV0dXJuIGBcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xucHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiB1djtcbmF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG52YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcbnZlYzMgZ2V0RGlyZWN0aW9uKHZlYzIgdXYsIGZsb2F0IGZhY2UpIHtcblx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKHV2LCAxLjApO1xuXHRpZiAoZmFjZSA9PSAwLjApIHtcblx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7XG5cdH0gZWxzZSBpZiAoZmFjZSA9PSAxLjApIHtcblx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7XG5cdH0gZWxzZSBpZiAoZmFjZSA9PSAzLjApIHtcblx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7XG5cdH0gZWxzZSBpZiAoZmFjZSA9PSA0LjApIHtcblx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdGRpcmVjdGlvbi55ICo9IC0xLjA7XG5cdH0gZWxzZSBpZiAoZmFjZSA9PSA1LjApIHtcblx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDtcblx0fVxuXHRyZXR1cm4gZGlyZWN0aW9uO1xufVxudm9pZCBtYWluKCkge1xuXHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKHV2LCBmYWNlSW5kZXgpO1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn1cblx0YDtcblxufVxuXG5mdW5jdGlvbiBfZ2V0RW5jb2RpbmdzKCkge1xuXG5cdHJldHVybiBgXG51bmlmb3JtIGludCBpbnB1dEVuY29kaW5nO1xudW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cbiNpbmNsdWRlIDxlbmNvZGluZ3NfcGFyc19mcmFnbWVudD5cblxudmVjNCBpbnB1dFRleGVsVG9MaW5lYXIodmVjNCB2YWx1ZSl7XG5cdGlmKGlucHV0RW5jb2RpbmcgPT0gMCl7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9ZWxzZSBpZihpbnB1dEVuY29kaW5nID09IDEpe1xuXHRcdHJldHVybiBzUkdCVG9MaW5lYXIodmFsdWUpO1xuXHR9ZWxzZSBpZihpbnB1dEVuY29kaW5nID09IDIpe1xuXHRcdHJldHVybiBSR0JFVG9MaW5lYXIodmFsdWUpO1xuXHR9ZWxzZSBpZihpbnB1dEVuY29kaW5nID09IDMpe1xuXHRcdHJldHVybiBSR0JNVG9MaW5lYXIodmFsdWUsIDcuMCk7XG5cdH1lbHNlIGlmKGlucHV0RW5jb2RpbmcgPT0gNCl7XG5cdFx0cmV0dXJuIFJHQk1Ub0xpbmVhcih2YWx1ZSwgMTYuMCk7XG5cdH1lbHNlIGlmKGlucHV0RW5jb2RpbmcgPT0gNSl7XG5cdFx0cmV0dXJuIFJHQkRUb0xpbmVhcih2YWx1ZSwgMjU2LjApO1xuXHR9ZWxzZXtcblx0XHRyZXR1cm4gR2FtbWFUb0xpbmVhcih2YWx1ZSwgMi4yKTtcblx0fVxufVxuXG52ZWM0IGxpbmVhclRvT3V0cHV0VGV4ZWwodmVjNCB2YWx1ZSl7XG5cdGlmKG91dHB1dEVuY29kaW5nID09IDApe1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fWVsc2UgaWYob3V0cHV0RW5jb2RpbmcgPT0gMSl7XG5cdFx0cmV0dXJuIExpbmVhclRvc1JHQih2YWx1ZSk7XG5cdH1lbHNlIGlmKG91dHB1dEVuY29kaW5nID09IDIpe1xuXHRcdHJldHVybiBMaW5lYXJUb1JHQkUodmFsdWUpO1xuXHR9ZWxzZSBpZihvdXRwdXRFbmNvZGluZyA9PSAzKXtcblx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKHZhbHVlLCA3LjApO1xuXHR9ZWxzZSBpZihvdXRwdXRFbmNvZGluZyA9PSA0KXtcblx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKHZhbHVlLCAxNi4wKTtcblx0fWVsc2UgaWYob3V0cHV0RW5jb2RpbmcgPT0gNSl7XG5cdFx0cmV0dXJuIExpbmVhclRvUkdCRCh2YWx1ZSwgMjU2LjApO1xuXHR9ZWxzZXtcblx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSh2YWx1ZSwgMi4yKTtcblx0fVxufVxuXG52ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIodmVjNCBjb2xvcikge1xuXHRyZXR1cm4gaW5wdXRUZXhlbFRvTGluZWFyKGNvbG9yKTtcbn1cblx0YDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTQoIGEsIGIsIGMsIGQsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4gQSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKTtcblxufVxuXG52YXIgTGluZVN0cmlwID0gMDtcbnZhciBMaW5lUGllY2VzID0gMTtcbnZhciBOb0NvbG9ycyA9IDA7XG52YXIgRmFjZUNvbG9ycyA9IDE7XG52YXIgVmVydGV4Q29sb3JzID0gMjtcblxuZnVuY3Rpb24gTWVzaEZhY2VNYXRlcmlhbCggbWF0ZXJpYWxzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG59XG5cbmZ1bmN0aW9uIE11bHRpTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRpZiAoIG1hdGVyaWFscyA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxzID0gW107XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdG1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlO1xuXHRtYXRlcmlhbHMubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRtYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7XG5cblx0fTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZSggbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuJyApO1xuXHRyZXR1cm4gbmV3IFNwcml0ZSggbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBvaW50Q2xvdWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVCYXNpY01hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gVmVydGV4KCB4LCB5LCB6ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBWZWN0b3IzKCB4LCB5LCB6ICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXRVc2FnZSggVEhSRUUuRHluYW1pY0RyYXdVc2FnZSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0VXNhZ2UoIER5bmFtaWNEcmF3VXNhZ2UgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBGbG9hdDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBGbG9hdDY0QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG4vL1xuXG5DdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApO1xuXG5cdGNvbnN0cnVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9IGdldFBvaW50O1xuXG5cdHJldHVybiBjb25zdHJ1Y3Q7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRjcmVhdGVQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gcGF0aCBwb2ludHMgKGZvciBMaW5lIG9yIFBvaW50cyBvYmplY3RzKVxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gZXF1aWRpc3RhbnQgc2FtcGxpbmcgYWxvbmcgdGhlIHBhdGhcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Y3JlYXRlR2VvbWV0cnk6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBQYXRoLnByb3RvdHlwZSwge1xuXG5cdGZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5mdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXHR0aGlzLmNsb3NlZCA9IHRydWU7XG5cbn1cblxuQ2xvc2VkU3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbi8vXG5cbmZ1bmN0aW9uIFNwbGluZUN1cnZlMyggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cbn1cblxuU3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbi8vXG5cbmZ1bmN0aW9uIFNwbGluZSggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cbn1cblxuU3BsaW5lLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbk9iamVjdC5hc3NpZ24oIFNwbGluZS5wcm90b3R5cGUsIHtcblxuXHRpbml0RnJvbUFycmF5OiBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuaW5pdEZyb21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGdldENvbnRyb2xQb2ludHNBcnJheTogZnVuY3Rpb24gKCAvKiBvcHRpb25hbFRhcmdldCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6IGZ1bmN0aW9uICggLyogc2FtcGxpbmdDb2VmICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLnJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5mdW5jdGlvbiBBeGlzSGVscGVyKCBzaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLicgKTtcblx0cmV0dXJuIG5ldyBBeGVzSGVscGVyKCBzaXplICk7XG5cbn1cblxuZnVuY3Rpb24gQm91bmRpbmdCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICk7XG5cbn1cblxuZnVuY3Rpb24gRWRnZXNIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IEVkZ2VzR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuR3JpZEhlbHBlci5wcm90b3R5cGUuc2V0Q29sb3JzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApO1xuXG59O1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Ta2VsZXRvbkhlbHBlcjogdXBkYXRlKCkgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4nICk7XG5cbn07XG5cbmZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyOiAuZXh0cmFjdFVybEJhc2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdH1cblxufSApO1xuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0YWRkOiBmdW5jdGlvbiAoIC8qIHJlZ2V4LCBsb2FkZXIgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5hZGQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuYWRkSGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIC8qIGZpbGUgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5nZXQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuZ2V0SGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBPYmplY3RMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IC5zZXRUZXh0dXJlUGF0aCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldFJlc291cmNlUGF0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoIHZhbHVlICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbkZydXN0dW0ucHJvdG90eXBlLnNldEZyb21NYXRyaXggPSBmdW5jdGlvbiAoIG0gKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRnJ1c3R1bTogLnNldEZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpLicgKTtcblx0cmV0dXJuIHRoaXMuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIG0gKTtcblxufTtcblxuTGluZTMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggTWF0aFV0aWxzLCB7XG5cblx0cmFuZG9tMTY6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBNYXRoLnJhbmRvbSgpO1xuXG5cdH0sXG5cblx0bmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4nICk7XG5cdFx0cmV0dXJuIE1hdGhVdGlscy5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBNYXRoVXRpbHMuY2VpbFBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBhdHRyaWJ1dGUuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgVmVjdG9yMygpLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDMgKTtcblxuXHR9LFxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0fSxcblx0bXVsdGlwbHlUb0FycmF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlQXhpczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHYudHJhbnNmb3JtRGlyZWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblx0Y3Jvc3NWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBhdHRyaWJ1dGUuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtYWtlRnJ1c3R1bTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKTtcblxuXHR9XG5cbn0gKTtcblxuUGxhbmUucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZSA9IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmlzSW50ZXJzZWN0aW9uTGluZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNMaW5lKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZSggbGluZSApO1xuXG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjMgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzICk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7XG5cblx0YXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcmVhKCk7XG5cblx0fSxcblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKTtcblxuXHR9LFxuXHRtaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXROb3JtYWwoIHRhcmdldCApO1xuXG5cdH0sXG5cdHBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQbGFuZSggdGFyZ2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICk7XG5cblx0fSxcblx0bm9ybWFsOiBmdW5jdGlvbiAoIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRcdHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBTaGFwZS5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0QWxsUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdH0sXG5cdGV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IEV4dHJ1ZGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH0sXG5cdG1ha2VHZW9tZXRyeTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdHNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHNldEV1bGVyRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7XG5cblx0fSxcblx0Z2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTtcblxuXHR9LFxuXHRhcHBseVByb2plY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbSApO1xuXG5cdH0sXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5OiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGV1bGVyT3JkZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0dGhpcy5yb3RhdGlvbi5vcmRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR1c2VRdWF0ZXJuaW9uOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1lc2gucHJvdG90eXBlLCB7XG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoOiAuc2V0RHJhd01vZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBUaGUgcmVuZGVyZXIgbm93IGFsd2F5cyBhc3N1bWVzIFRIUkVFLlRyaWFuZ2xlc0RyYXdNb2RlLiBUcmFuc2Zvcm0geW91ciBnZW9tZXRyeSB2aWEgQnVmZmVyR2VvbWV0cnlVdGlscy50b1RyaWFuZ2xlc0RyYXdNb2RlKCkgaWYgbmVjZXNzYXJ5LicgKTtcblxuXHR9LFxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoLnByb3RvdHlwZSwge1xuXG5cdGRyYXdNb2RlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4nICk7XG5cdFx0XHRyZXR1cm4gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZS5pbml0Qm9uZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHJldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHZhbHVlO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUuc2V0TGVucyA9IGZ1bmN0aW9uICggZm9jYWxMZW5ndGgsIGZpbG1HYXVnZSApIHtcblxuXHRjb25zb2xlLndhcm4oIFwiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBcIiArXG5cdFx0XHRcIlVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9yIGEgcGhvdG9ncmFwaGljIHNldHVwLlwiICk7XG5cblx0aWYgKCBmaWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIHRoaXMuZmlsbUdhdWdlID0gZmlsbUdhdWdlO1xuXHR0aGlzLnNldEZvY2FsTGVuZ3RoKCBmb2NhbExlbmd0aCApO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTGlnaHQucHJvdG90eXBlLCB7XG5cdG9ubHlTaGFkb3c6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGb3Y6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZvdiA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFMZWZ0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhUmlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFUb3A6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnRvcCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFCb3R0b206IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhQm90dG9tIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5ib3R0b20uJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFOZWFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRmFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVmlzaWJsZToge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVZpc2libGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGxpZ2h0LnNoYWRvdy5jYW1lcmEgKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Qmlhczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuYmlhcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dEYXJrbmVzczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBXaWR0aDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGggPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwSGVpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLmhlaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0bGVuZ3RoOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuXG5cdFx0fVxuXHR9LFxuXHRkeW5hbWljOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmR5bmFtaWMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmR5bmFtaWMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuc2V0VXNhZ2UoIER5bmFtaWNEcmF3VXNhZ2UgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLnNldER5bmFtaWMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFVzYWdlKCkgaW5zdGVhZC4nICk7XG5cdFx0dGhpcy5zZXRVc2FnZSggdmFsdWUgPT09IHRydWUgPyBEeW5hbWljRHJhd1VzYWdlIDogU3RhdGljRHJhd1VzYWdlICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXRBcnJheSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgQnVmZmVyR2VvbWV0cnkgLnNldEF0dHJpYnV0ZSB0byByZXBsYWNlL3Jlc2l6ZSBhdHRyaWJ1dGUgYnVmZmVycycgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGFkZEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApO1xuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cblx0fSxcblx0YWRkQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0QXR0cmlidXRlKCkuJyApO1xuXG5cdFx0aWYgKCAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApICYmICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcmd1bWVudHNbIDEgXSwgYXJndW1lbnRzWyAyIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuYW1lID09PSAnaW5kZXgnICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLicgKTtcblx0XHRcdHRoaXMuc2V0SW5kZXgoIGF0dHJpYnV0ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlICk7XG5cblx0fSxcblx0YWRkRHJhd0NhbGw6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBpbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4nICk7XG5cblx0XHR9XG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7XG5cdFx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cblx0fSxcblx0Y2xlYXJEcmF3Q2FsbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuJyApO1xuXHRcdHRoaXMuY2xlYXJHcm91cHMoKTtcblxuXHR9LFxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZU9mZnNldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAucmVtb3ZlQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZGVsZXRlQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVsZXRlQXR0cmlidXRlKCBuYW1lICk7XG5cblx0fSxcblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmFwcGx5TWF0cml4NCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFJheWNhc3Rlci5wcm90b3R5cGUsIHtcblxuXHRsaW5lUHJlY2lzaW9uOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogLmxpbmVQcmVjaXNpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5wYXJhbXMuTGluZS50aHJlc2hvbGQgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJhbXMuTGluZS50aHJlc2hvbGQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyOiAubGluZVByZWNpc2lvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnBhcmFtcy5MaW5lLnRocmVzaG9sZCBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMucGFyYW1zLkxpbmUudGhyZXNob2xkID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCB7XG5cblx0ZHluYW1pYzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnVzYWdlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudXNhZ2UgPT09IER5bmFtaWNEcmF3VXNhZ2U7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXI6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuc2V0VXNhZ2UoIHZhbHVlICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLicgKTtcblx0XHR0aGlzLnNldFVzYWdlKCB2YWx1ZSA9PT0gdHJ1ZSA/IER5bmFtaWNEcmF3VXNhZ2UgOiBTdGF0aWNEcmF3VXNhZ2UgKTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLnNldEFycmF5IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBCdWZmZXJHZW9tZXRyeSAuc2V0QXR0cmlidXRlIHRvIHJlcGxhY2UvcmVzaXplIGF0dHJpYnV0ZSBidWZmZXJzJyApO1xuXG5cdH1cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGdldEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmdldEFycmF5cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGVMaXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXG5cdG92ZXJkcmF3OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXG5cdHdyYXBSR0I6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcigpO1xuXG5cdFx0fVxuXHR9LFxuXG5cdHNoYWRpbmc6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0dGhpcy5mbGF0U2hhZGluZyA9ICggdmFsdWUgPT09IEZsYXRTaGFkaW5nICk7XG5cblx0XHR9XG5cdH0sXG5cblx0c3RlbmNpbE1hc2s6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zdGVuY2lsTWFzayBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnN0ZW5jaWxGdW5jTWFzayBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN0ZW5jaWxGdW5jTWFzaztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnN0ZW5jaWxNYXNrIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc3RlbmNpbEZ1bmNNYXNrIGluc3RlYWQuJyApO1xuXHRcdFx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRtZXRhbDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQnICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0ZGVyaXZhdGl2ZXM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRjbGVhclRhcmdldDogZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5jbGVhclRhcmdldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgYW5kIC5jbGVhcigpIGluc3RlYWQuJyApO1xuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4nICk7XG5cdFx0dGhpcy5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdH0sXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblx0Z2V0TWF4QW5pc290cm9weTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG5cblx0fSxcblx0Z2V0UHJlY2lzaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdH0sXG5cdHJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTtcblxuXHR9LFxuXHRzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0VYVF9ibGVuZF9taW5tYXhcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcztcblxuXHR9LFxuXHRzdXBwb3J0c0luc3RhbmNlZEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0fSxcblx0ZW5hYmxlU2Npc3NvclRlc3Q6IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRlc3QoKS4nICk7XG5cdFx0dGhpcy5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApO1xuXG5cdH0sXG5cdGluaXRNYXRlcmlhbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFByZVBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFBvc3RQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0dXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0c2V0RmFjZUN1bGxpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFsbG9jVGV4dHVyZVVuaXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0c2V0VGV4dHVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRUZXh0dXJlMkQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlMkQoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Z2V0QWN0aXZlTWlwTWFwTGV2ZWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRBY3RpdmVNaXBNYXBMZXZlbCgpIGlzIG5vdyAuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGNvbnRleHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCk7XG5cblx0XHR9XG5cdH0sXG5cdHZyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC52ciBoYXMgYmVlbiByZW5hbWVkIHRvIC54cicgKTtcblx0XHRcdHJldHVybiB0aGlzLnhyO1xuXG5cdFx0fVxuXHR9LFxuXHRnYW1tYUlucHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYUlucHV0IGhhcyBiZWVuIHJlbW92ZWQuIFNldCB0aGUgZW5jb2RpbmcgZm9yIHRleHR1cmVzIHZpYSBUZXh0dXJlLmVuY29kaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGdhbW1hT3V0cHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLm91dHB1dEVuY29kaW5nID0gKCB2YWx1ZSA9PT0gdHJ1ZSApID8gc1JHQkVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xTaGFkb3dNYXAucHJvdG90eXBlLCB7XG5cblx0Y3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiBjdWxsRmFjZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyUmV2ZXJzZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJTaW5nbGVTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkgaXMgbm93IFdlYkdMQ3ViZVJlbmRlclRhcmdldCggc2l6ZSwgb3B0aW9ucyApLicgKTtcblx0cmV0dXJuIG5ldyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHdpZHRoLCBvcHRpb25zICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwge1xuXG5cdHdyYXBTOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBTID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBUOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUud3JhcFQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLndyYXBUID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1hZ0ZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtaW5GaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0YW5pc290cm9weToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuYW5pc290cm9weSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5vZmZzZXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0cmVwZWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUucmVwZWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGZvcm1hdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR0eXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGdlbmVyYXRlTWlwbWFwczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEF1ZGlvLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IHtcblx0XHR2YWx1ZTogZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHRcdHZhciBhdWRpb0xvYWRlciA9IG5ldyBBdWRpb0xvYWRlcigpO1xuXHRcdFx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cdH0sXG5cdHN0YXJ0VGltZToge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogLnN0YXJ0VGltZSBpcyBub3cgLnBsYXkoIGRlbGF5ICkuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuQXVkaW9BbmFseXNlci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG59O1xuXG4vL1xuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTtcblxufTtcblxuLy9cblxudmFyIEdlb21ldHJ5VXRpbHMgPSB7XG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnkxLCBnZW9tZXRyeTIsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HZW9tZXRyeVV0aWxzOiAubWVyZ2UoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5Lm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIGluc3RlYWQuJyApO1xuXHRcdHZhciBtYXRyaXg7XG5cblx0XHRpZiAoIGdlb21ldHJ5Mi5pc01lc2ggKSB7XG5cblx0XHRcdGdlb21ldHJ5Mi5tYXRyaXhBdXRvVXBkYXRlICYmIGdlb21ldHJ5Mi51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0bWF0cml4ID0gZ2VvbWV0cnkyLm1hdHJpeDtcblx0XHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5Mi5nZW9tZXRyeTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5MS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKTtcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5jZW50ZXIoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5LmNlbnRlcigpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBnZW9tZXRyeS5jZW50ZXIoKTtcblxuXHR9XG5cbn07XG5cbkltYWdlVXRpbHMuY3Jvc3NPcmlnaW4gPSB1bmRlZmluZWQ7XG5cbkltYWdlVXRpbHMubG9hZFRleHR1cmUgPSBmdW5jdGlvbiAoIHVybCwgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHR2YXIgbG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0cmV0dXJuIHRleHR1cmU7XG5cbn07XG5cbkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlID0gZnVuY3Rpb24gKCB1cmxzLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0dmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpO1xuXHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHR2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmxzLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0cmV0dXJuIHRleHR1cmU7XG5cbn07XG5cbkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCcgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59XG5cbi8vXG5cbnZhciBTY2VuZVV0aWxzID0ge1xuXG5cdGNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1bmN0aW9uICggLyogZ2VvbWV0cnksIG1hdGVyaWFscyAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qc20vdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24gKCAvKiBjaGlsZCwgcGFyZW50LCBzY2VuZSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qc20vdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9LFxuXG5cdGF0dGFjaDogZnVuY3Rpb24gKCAvKiBjaGlsZCwgc2NlbmUsIHBhcmVudCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qc20vdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIExlbnNGbGFyZSgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qc20vb2JqZWN0cy9MZW5zZmxhcmUuanMnICk7XG5cbn1cblxuaWYgKCB0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuXHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAncmVnaXN0ZXInLCB7IGRldGFpbDoge1xuXHRcdHJldmlzaW9uOiBSRVZJU0lPTixcblx0fSB9ICkgKTtcblx0LyogZXNsaW50LWVuYWJsZSBuby11bmRlZiAqL1xuXG59XG5cbmV4cG9ydCB7IEFDRVNGaWxtaWNUb25lTWFwcGluZywgQWRkRXF1YXRpb24sIEFkZE9wZXJhdGlvbiwgQWRkaXRpdmVCbGVuZGluZywgQWxwaGFGb3JtYXQsIEFsd2F5c0RlcHRoLCBBbHdheXNTdGVuY2lsRnVuYywgQW1iaWVudExpZ2h0LCBBbWJpZW50TGlnaHRQcm9iZSwgQW5pbWF0aW9uQ2xpcCwgQW5pbWF0aW9uTG9hZGVyLCBBbmltYXRpb25NaXhlciwgQW5pbWF0aW9uT2JqZWN0R3JvdXAsIEFuaW1hdGlvblV0aWxzLCBBcmNDdXJ2ZSwgQXJyYXlDYW1lcmEsIEFycm93SGVscGVyLCBBdWRpbywgQXVkaW9BbmFseXNlciwgQXVkaW9Db250ZXh0LCBBdWRpb0xpc3RlbmVyLCBBdWRpb0xvYWRlciwgQXhlc0hlbHBlciwgQXhpc0hlbHBlciwgQmFja1NpZGUsIEJhc2ljRGVwdGhQYWNraW5nLCBCYXNpY1NoYWRvd01hcCwgQmluYXJ5VGV4dHVyZUxvYWRlciwgQm9uZSwgQm9vbGVhbktleWZyYW1lVHJhY2ssIEJvdW5kaW5nQm94SGVscGVyLCBCb3gyLCBCb3gzLCBCb3gzSGVscGVyLCBCb3hCdWZmZXJHZW9tZXRyeSwgQm94R2VvbWV0cnksIEJveEhlbHBlciwgQnVmZmVyQXR0cmlidXRlLCBCdWZmZXJHZW9tZXRyeSwgQnVmZmVyR2VvbWV0cnlMb2FkZXIsIEJ5dGVUeXBlLCBDYWNoZSwgQ2FtZXJhLCBDYW1lcmFIZWxwZXIsIENhbnZhc1JlbmRlcmVyLCBDYW52YXNUZXh0dXJlLCBDYXRtdWxsUm9tQ3VydmUzLCBDaW5lb25Ub25lTWFwcGluZywgQ2lyY2xlQnVmZmVyR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDbGFtcFRvRWRnZVdyYXBwaW5nLCBDbG9jaywgQ2xvc2VkU3BsaW5lQ3VydmUzLCBDb2xvciwgQ29sb3JLZXlmcmFtZVRyYWNrLCBDb21wcmVzc2VkVGV4dHVyZSwgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIsIENvbmVCdWZmZXJHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDdWJlQ2FtZXJhLCBCb3hHZW9tZXRyeSBhcyBDdWJlR2VvbWV0cnksIEN1YmVSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBDdWJlVGV4dHVyZSwgQ3ViZVRleHR1cmVMb2FkZXIsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgQ3ViaWNCZXppZXJDdXJ2ZSwgQ3ViaWNCZXppZXJDdXJ2ZTMsIEN1YmljSW50ZXJwb2xhbnQsIEN1bGxGYWNlQmFjaywgQ3VsbEZhY2VGcm9udCwgQ3VsbEZhY2VGcm9udEJhY2ssIEN1bGxGYWNlTm9uZSwgQ3VydmUsIEN1cnZlUGF0aCwgQ3VzdG9tQmxlbmRpbmcsIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIEN5bGluZHJpY2FsLCBEYXRhVGV4dHVyZSwgRGF0YVRleHR1cmUyREFycmF5LCBEYXRhVGV4dHVyZTNELCBEYXRhVGV4dHVyZUxvYWRlciwgRGVjcmVtZW50U3RlbmNpbE9wLCBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wLCBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIERlcHRoVGV4dHVyZSwgRGlyZWN0aW9uYWxMaWdodCwgRGlyZWN0aW9uYWxMaWdodEhlbHBlciwgRGlyZWN0aW9uYWxMaWdodFNoYWRvdywgRGlzY3JldGVJbnRlcnBvbGFudCwgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb3VibGVTaWRlLCBEc3RBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUsIER5bmFtaWNDb3B5VXNhZ2UsIER5bmFtaWNEcmF3VXNhZ2UsIER5bmFtaWNSZWFkVXNhZ2UsIEVkZ2VzR2VvbWV0cnksIEVkZ2VzSGVscGVyLCBFbGxpcHNlQ3VydmUsIEVxdWFsRGVwdGgsIEVxdWFsU3RlbmNpbEZ1bmMsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgRXVsZXIsIEV2ZW50RGlzcGF0Y2hlciwgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LCBFeHRydWRlR2VvbWV0cnksIEZhY2UzLCBGYWNlNCwgRmFjZUNvbG9ycywgRmlsZUxvYWRlciwgRmxhdFNoYWRpbmcsIEZsb2F0MzJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0NjRBdHRyaWJ1dGUsIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0VHlwZSwgRm9nLCBGb2dFeHAyLCBGb250LCBGb250TG9hZGVyLCBGcm9udEZhY2VEaXJlY3Rpb25DQ1csIEZyb250RmFjZURpcmVjdGlvbkNXLCBGcm9udFNpZGUsIEZydXN0dW0sIEdhbW1hRW5jb2RpbmcsIEdlb21ldHJ5LCBHZW9tZXRyeVV0aWxzLCBHcmVhdGVyRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxTdGVuY2lsRnVuYywgR3JlYXRlclN0ZW5jaWxGdW5jLCBHcmlkSGVscGVyLCBHcm91cCwgSGFsZkZsb2F0VHlwZSwgSGVtaXNwaGVyZUxpZ2h0LCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEhlbWlzcGhlcmVMaWdodFByb2JlLCBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBJY29zYWhlZHJvbkdlb21ldHJ5LCBJbWFnZUJpdG1hcExvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlVXRpbHMsIEltbWVkaWF0ZVJlbmRlck9iamVjdCwgSW5jcmVtZW50U3RlbmNpbE9wLCBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wLCBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LCBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkTWVzaCwgSW50MTZBdHRyaWJ1dGUsIEludDE2QnVmZmVyQXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIEludDhBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEludFR5cGUsIEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSwgSW50ZXJwb2xhbnQsIEludGVycG9sYXRlRGlzY3JldGUsIEludGVycG9sYXRlTGluZWFyLCBJbnRlcnBvbGF0ZVNtb290aCwgSW52ZXJ0U3RlbmNpbE9wLCBKU09OTG9hZGVyLCBLZWVwU3RlbmNpbE9wLCBLZXlmcmFtZVRyYWNrLCBMT0QsIExhdGhlQnVmZmVyR2VvbWV0cnksIExhdGhlR2VvbWV0cnksIExheWVycywgTGVuc0ZsYXJlLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBMZXNzRXF1YWxTdGVuY2lsRnVuYywgTGVzc1N0ZW5jaWxGdW5jLCBMaWdodCwgTGlnaHRQcm9iZSwgTGlnaHRTaGFkb3csIExpbmUsIExpbmUzLCBMaW5lQmFzaWNNYXRlcmlhbCwgTGluZUN1cnZlLCBMaW5lQ3VydmUzLCBMaW5lRGFzaGVkTWF0ZXJpYWwsIExpbmVMb29wLCBMaW5lUGllY2VzLCBMaW5lU2VnbWVudHMsIExpbmVTdHJpcCwgTGluZWFyRW5jb2RpbmcsIExpbmVhckZpbHRlciwgTGluZWFySW50ZXJwb2xhbnQsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciwgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyLCBMaW5lYXJUb25lTWFwcGluZywgTG9hZGVyLCBMb2FkZXJVdGlscywgTG9hZGluZ01hbmFnZXIsIExvZ0x1dkVuY29kaW5nLCBMb29wT25jZSwgTG9vcFBpbmdQb25nLCBMb29wUmVwZWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBNT1VTRSwgTWF0ZXJpYWwsIE1hdGVyaWFsTG9hZGVyLCBNYXRoVXRpbHMgYXMgTWF0aCwgTWF0aFV0aWxzLCBNYXRyaXgzLCBNYXRyaXg0LCBNYXhFcXVhdGlvbiwgTWVzaCwgTWVzaEJhc2ljTWF0ZXJpYWwsIE1lc2hEZXB0aE1hdGVyaWFsLCBNZXNoRGlzdGFuY2VNYXRlcmlhbCwgTWVzaEZhY2VNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaE1hdGNhcE1hdGVyaWFsLCBNZXNoTm9ybWFsTWF0ZXJpYWwsIE1lc2hQaG9uZ01hdGVyaWFsLCBNZXNoUGh5c2ljYWxNYXRlcmlhbCwgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1pbkVxdWF0aW9uLCBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLCBNaXhPcGVyYXRpb24sIE11bHRpTWF0ZXJpYWwsIE11bHRpcGx5QmxlbmRpbmcsIE11bHRpcGx5T3BlcmF0aW9uLCBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5ldmVyRGVwdGgsIE5ldmVyU3RlbmNpbEZ1bmMsIE5vQmxlbmRpbmcsIE5vQ29sb3JzLCBOb1RvbmVNYXBwaW5nLCBOb3JtYWxCbGVuZGluZywgTm90RXF1YWxEZXB0aCwgTm90RXF1YWxTdGVuY2lsRnVuYywgTnVtYmVyS2V5ZnJhbWVUcmFjaywgT2JqZWN0M0QsIE9iamVjdExvYWRlciwgT2JqZWN0U3BhY2VOb3JtYWxNYXAsIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSwgT2N0YWhlZHJvbkdlb21ldHJ5LCBPbmVGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgUENGU2hhZG93TWFwLCBQQ0ZTb2Z0U2hhZG93TWFwLCBQTVJFTUdlbmVyYXRvciwgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LCBQYXJhbWV0cmljR2VvbWV0cnksIFBhcnRpY2xlLCBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwsIFBhcnRpY2xlU3lzdGVtLCBQYXJ0aWNsZVN5c3RlbU1hdGVyaWFsLCBQYXRoLCBQZXJzcGVjdGl2ZUNhbWVyYSwgUGxhbmUsIFBsYW5lQnVmZmVyR2VvbWV0cnksIFBsYW5lR2VvbWV0cnksIFBsYW5lSGVscGVyLCBQb2ludENsb3VkLCBQb2ludENsb3VkTWF0ZXJpYWwsIFBvaW50TGlnaHQsIFBvaW50TGlnaHRIZWxwZXIsIFBvaW50cywgUG9pbnRzTWF0ZXJpYWwsIFBvbGFyR3JpZEhlbHBlciwgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBQb2x5aGVkcm9uR2VvbWV0cnksIFBvc2l0aW9uYWxBdWRpbywgUHJvcGVydHlCaW5kaW5nLCBQcm9wZXJ0eU1peGVyLCBRdWFkcmF0aWNCZXppZXJDdXJ2ZSwgUXVhZHJhdGljQmV6aWVyQ3VydmUzLCBRdWF0ZXJuaW9uLCBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LCBSRVZJU0lPTiwgUkdCQURlcHRoUGFja2luZywgUkdCQUZvcm1hdCwgUkdCQUludGVnZXJGb3JtYXQsIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDZfRm9ybWF0LCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQsIFJHQkFfQVNUQ180eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg0X0Zvcm1hdCwgUkdCQV9BU1RDXzV4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDVfRm9ybWF0LCBSR0JBX0FTVENfNng2X0Zvcm1hdCwgUkdCQV9BU1RDXzh4NV9Gb3JtYXQsIFJHQkFfQVNUQ184eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg4X0Zvcm1hdCwgUkdCQV9CUFRDX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0LCBSR0JERW5jb2RpbmcsIFJHQkVFbmNvZGluZywgUkdCRUZvcm1hdCwgUkdCRm9ybWF0LCBSR0JJbnRlZ2VyRm9ybWF0LCBSR0JNMTZFbmNvZGluZywgUkdCTTdFbmNvZGluZywgUkdCX0VUQzFfRm9ybWF0LCBSR0JfRVRDMl9Gb3JtYXQsIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHRm9ybWF0LCBSR0ludGVnZXJGb3JtYXQsIFJhd1NoYWRlck1hdGVyaWFsLCBSYXksIFJheWNhc3RlciwgUmVjdEFyZWFMaWdodCwgUmVkRm9ybWF0LCBSZWRJbnRlZ2VyRm9ybWF0LCBSZWluaGFyZFRvbmVNYXBwaW5nLCBSZXBlYXRXcmFwcGluZywgUmVwbGFjZVN0ZW5jaWxPcCwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIFJpbmdCdWZmZXJHZW9tZXRyeSwgUmluZ0dlb21ldHJ5LCBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ180eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0LCBTY2VuZSwgU2NlbmVVdGlscywgU2hhZGVyQ2h1bmssIFNoYWRlckxpYiwgU2hhZGVyTWF0ZXJpYWwsIFNoYWRvd01hdGVyaWFsLCBTaGFwZSwgU2hhcGVCdWZmZXJHZW9tZXRyeSwgU2hhcGVHZW9tZXRyeSwgU2hhcGVQYXRoLCBTaGFwZVV0aWxzLCBTaG9ydFR5cGUsIFNrZWxldG9uLCBTa2VsZXRvbkhlbHBlciwgU2tpbm5lZE1lc2gsIFNtb290aFNoYWRpbmcsIFNwaGVyZSwgU3BoZXJlQnVmZmVyR2VvbWV0cnksIFNwaGVyZUdlb21ldHJ5LCBTcGhlcmljYWwsIFNwaGVyaWNhbEhhcm1vbmljczMsIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLCBTcGxpbmUsIFNwbGluZUN1cnZlLCBTcGxpbmVDdXJ2ZTMsIFNwb3RMaWdodCwgU3BvdExpZ2h0SGVscGVyLCBTcG90TGlnaHRTaGFkb3csIFNwcml0ZSwgU3ByaXRlTWF0ZXJpYWwsIFNyY0FscGhhRmFjdG9yLCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgU3RhdGljQ29weVVzYWdlLCBTdGF0aWNEcmF3VXNhZ2UsIFN0YXRpY1JlYWRVc2FnZSwgU3RlcmVvQ2FtZXJhLCBTdHJlYW1Db3B5VXNhZ2UsIFN0cmVhbURyYXdVc2FnZSwgU3RyZWFtUmVhZFVzYWdlLCBTdHJpbmdLZXlmcmFtZVRyYWNrLCBTdWJ0cmFjdEVxdWF0aW9uLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBUT1VDSCwgVGFuZ2VudFNwYWNlTm9ybWFsTWFwLCBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBUZXRyYWhlZHJvbkdlb21ldHJ5LCBUZXh0QnVmZmVyR2VvbWV0cnksIFRleHRHZW9tZXRyeSwgVGV4dHVyZSwgVGV4dHVyZUxvYWRlciwgVG9ydXNCdWZmZXJHZW9tZXRyeSwgVG9ydXNHZW9tZXRyeSwgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzS25vdEdlb21ldHJ5LCBUcmlhbmdsZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgVHJpYW5nbGVTdHJpcERyYXdNb2RlLCBUcmlhbmdsZXNEcmF3TW9kZSwgVHViZUJ1ZmZlckdlb21ldHJ5LCBUdWJlR2VvbWV0cnksIFVWTWFwcGluZywgVWludDE2QXR0cmlidXRlLCBVaW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlLCBVaW50OEF0dHJpYnV0ZSwgVWludDhCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLCBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcsIFVuaWZvcm0sIFVuaWZvcm1zTGliLCBVbmlmb3Jtc1V0aWxzLCBVbnNpZ25lZEJ5dGVUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgVW5zaWduZWRTaG9ydDQ0NDRUeXBlLCBVbnNpZ25lZFNob3J0NTU1MVR5cGUsIFVuc2lnbmVkU2hvcnQ1NjVUeXBlLCBVbnNpZ25lZFNob3J0VHlwZSwgVlNNU2hhZG93TWFwLCBWZWN0b3IyLCBWZWN0b3IzLCBWZWN0b3I0LCBWZWN0b3JLZXlmcmFtZVRyYWNrLCBWZXJ0ZXgsIFZlcnRleENvbG9ycywgVmlkZW9UZXh0dXJlLCBXZWJHTEN1YmVSZW5kZXJUYXJnZXQsIFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlclRhcmdldEN1YmUsIFdlYkdMUmVuZGVyZXIsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBXaXJlZnJhbWVIZWxwZXIsIFdyYXBBcm91bmRFbmRpbmcsIFhIUkxvYWRlciwgWmVyb0N1cnZhdHVyZUVuZGluZywgWmVyb0ZhY3RvciwgWmVyb1Nsb3BlRW5kaW5nLCBaZXJvU3RlbmNpbE9wLCBzUkdCRW5jb2RpbmcgfTtcbiIsIi8qIVxuICogQHBpeGkvcG9seWZpbGwgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvcG9seWZpbGwgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBQb2x5ZmlsbCB9IGZyb20gJ2VzNi1wcm9taXNlLXBvbHlmaWxsJztcbmltcG9ydCBvYmplY3RBc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbic7XG5cbi8vIFN1cHBvcnQgZm9yIElFIDkgLSAxMSB3aGljaCBkb2VzIG5vdCBpbmNsdWRlIFByb21pc2VzXG5pZiAoIXdpbmRvdy5Qcm9taXNlKVxue1xuICAgIHdpbmRvdy5Qcm9taXNlID0gUG9seWZpbGw7XG59XG5cbi8vIFJlZmVyZW5jZXM6XG5cbmlmICghT2JqZWN0LmFzc2lnbilcbntcbiAgICBPYmplY3QuYXNzaWduID0gb2JqZWN0QXNzaWduO1xufVxuXG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuLy8gUmVmZXJlbmNlczpcbi8vIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xNTc5NjcxXG4vLyBodHRwOi8vdXBkYXRlcy5odG1sNXJvY2tzLmNvbS8yMDEyLzA1L3JlcXVlc3RBbmltYXRpb25GcmFtZS1BUEktbm93LXdpdGgtc3ViLW1pbGxpc2Vjb25kLXByZWNpc2lvblxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdGltaGFsbC80MDc4NjE0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vRmluYW5jaWFsLVRpbWVzL3BvbHlmaWxsLXNlcnZpY2UvdHJlZS9tYXN0ZXIvcG9seWZpbGxzL3JlcXVlc3RBbmltYXRpb25GcmFtZVxuXG4vLyBFeHBlY3RlZCB0byBiZSB1c2VkIHdpdGggQnJvd3NlcmZpeVxuLy8gQnJvd3NlcmlmeSBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIHVzZSBvZiBgZ2xvYmFsYCBhbmQgcGFzc2VzIHRoZVxuLy8gY29ycmVjdCByZWZlcmVuY2Ugb2YgYGdsb2JhbGAsIGBzZWxmYCwgYW5kIGZpbmFsbHkgYHdpbmRvd2BcblxudmFyIE9ORV9GUkFNRV9USU1FID0gMTY7XG5cbi8vIERhdGUubm93XG5pZiAoIShEYXRlLm5vdyAmJiBEYXRlLnByb3RvdHlwZS5nZXRUaW1lKSlcbntcbiAgICBEYXRlLm5vdyA9IGZ1bmN0aW9uIG5vdygpXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfTtcbn1cblxuLy8gcGVyZm9ybWFuY2Uubm93XG5pZiAoIShjb21tb25qc0dsb2JhbC5wZXJmb3JtYW5jZSAmJiBjb21tb25qc0dsb2JhbC5wZXJmb3JtYW5jZS5ub3cpKVxue1xuICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKCFjb21tb25qc0dsb2JhbC5wZXJmb3JtYW5jZSlcbiAgICB7XG4gICAgICAgIGNvbW1vbmpzR2xvYmFsLnBlcmZvcm1hbmNlID0ge307XG4gICAgfVxuXG4gICAgY29tbW9uanNHbG9iYWwucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTsgfTtcbn1cblxuLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG52YXIgbGFzdFRpbWUgPSBEYXRlLm5vdygpO1xudmFyIHZlbmRvcnMgPSBbJ21zJywgJ21veicsICd3ZWJraXQnLCAnbyddO1xuXG5mb3IgKHZhciB4ID0gMDsgeCA8IHZlbmRvcnMubGVuZ3RoICYmICFjb21tb25qc0dsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsreClcbntcbiAgICB2YXIgcCA9IHZlbmRvcnNbeF07XG5cbiAgICBjb21tb25qc0dsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBjb21tb25qc0dsb2JhbFsocCArIFwiUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIpXTtcbiAgICBjb21tb25qc0dsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGNvbW1vbmpzR2xvYmFsWyhwICsgXCJDYW5jZWxBbmltYXRpb25GcmFtZVwiKV0gfHwgY29tbW9uanNHbG9iYWxbKHAgKyBcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiKV07XG59XG5cbmlmICghY29tbW9uanNHbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lKVxue1xuICAgIGNvbW1vbmpzR2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKChjYWxsYmFjayArIFwiaXMgbm90IGEgZnVuY3Rpb25cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmFyIGRlbGF5ID0gT05FX0ZSQU1FX1RJTUUgKyBsYXN0VGltZSAtIGN1cnJlbnRUaW1lO1xuXG4gICAgICAgIGlmIChkZWxheSA8IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlbGF5ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RUaW1lID0gY3VycmVudFRpbWU7XG5cbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGFzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgfTtcbn1cblxuaWYgKCFjb21tb25qc0dsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSlcbntcbiAgICBjb21tb25qc0dsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTsgfTtcbn1cblxuLy8gUmVmZXJlbmNlczpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvc2lnblxuXG5pZiAoIU1hdGguc2lnbilcbntcbiAgICBNYXRoLnNpZ24gPSBmdW5jdGlvbiBtYXRoU2lnbih4KVxuICAgIHtcbiAgICAgICAgeCA9IE51bWJlcih4KTtcblxuICAgICAgICBpZiAoeCA9PT0gMCB8fCBpc05hTih4KSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geCA+IDAgPyAxIDogLTE7XG4gICAgfTtcbn1cblxuLy8gUmVmZXJlbmNlczpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKVxue1xuICAgIE51bWJlci5pc0ludGVnZXIgPSBmdW5jdGlvbiBudW1iZXJJc0ludGVnZXIodmFsdWUpXG4gICAge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xuICAgIH07XG59XG5cbmlmICghd2luZG93LkFycmF5QnVmZmVyKVxue1xuICAgIHdpbmRvdy5BcnJheUJ1ZmZlciA9IEFycmF5O1xufVxuXG5pZiAoIXdpbmRvdy5GbG9hdDMyQXJyYXkpXG57XG4gICAgd2luZG93LkZsb2F0MzJBcnJheSA9IEFycmF5O1xufVxuXG5pZiAoIXdpbmRvdy5VaW50MzJBcnJheSlcbntcbiAgICB3aW5kb3cuVWludDMyQXJyYXkgPSBBcnJheTtcbn1cblxuaWYgKCF3aW5kb3cuVWludDE2QXJyYXkpXG57XG4gICAgd2luZG93LlVpbnQxNkFycmF5ID0gQXJyYXk7XG59XG5cbmlmICghd2luZG93LlVpbnQ4QXJyYXkpXG57XG4gICAgd2luZG93LlVpbnQ4QXJyYXkgPSBBcnJheTtcbn1cblxuaWYgKCF3aW5kb3cuSW50MzJBcnJheSlcbntcbiAgICB3aW5kb3cuSW50MzJBcnJheSA9IEFycmF5O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9seWZpbGwuZXMuanMubWFwXG4iLCJ2YXIgYXBwbGVJcGhvbmUgPSAvaVBob25lL2k7XG52YXIgYXBwbGVJcG9kID0gL2lQb2QvaTtcbnZhciBhcHBsZVRhYmxldCA9IC9pUGFkL2k7XG52YXIgYXBwbGVVbml2ZXJzYWwgPSAvXFxiaU9TLXVuaXZlcnNhbCg/Oi4rKU1hY1xcYi9pO1xudmFyIGFuZHJvaWRQaG9uZSA9IC9cXGJBbmRyb2lkKD86LispTW9iaWxlXFxiL2k7XG52YXIgYW5kcm9pZFRhYmxldCA9IC9BbmRyb2lkL2k7XG52YXIgYW1hem9uUGhvbmUgPSAvKD86U0Q0OTMwVVJ8XFxiU2lsayg/Oi4rKU1vYmlsZVxcYikvaTtcbnZhciBhbWF6b25UYWJsZXQgPSAvU2lsay9pO1xudmFyIHdpbmRvd3NQaG9uZSA9IC9XaW5kb3dzIFBob25lL2k7XG52YXIgd2luZG93c1RhYmxldCA9IC9cXGJXaW5kb3dzKD86LispQVJNXFxiL2k7XG52YXIgb3RoZXJCbGFja0JlcnJ5ID0gL0JsYWNrQmVycnkvaTtcbnZhciBvdGhlckJsYWNrQmVycnkxMCA9IC9CQjEwL2k7XG52YXIgb3RoZXJPcGVyYSA9IC9PcGVyYSBNaW5pL2k7XG52YXIgb3RoZXJDaHJvbWUgPSAvXFxiKENyaU9TfENocm9tZSkoPzouKylNb2JpbGUvaTtcbnZhciBvdGhlckZpcmVmb3ggPSAvTW9iaWxlKD86LispRmlyZWZveFxcYi9pO1xudmFyIGlzQXBwbGVUYWJsZXRPbklvczEzID0gZnVuY3Rpb24gKG5hdmlnYXRvcikge1xuICAgIHJldHVybiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgbmF2aWdhdG9yLnBsYXRmb3JtID09PSAnTWFjSW50ZWwnICYmXG4gICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPT09ICdudW1iZXInICYmXG4gICAgICAgIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDEgJiZcbiAgICAgICAgdHlwZW9mIE1TU3RyZWFtID09PSAndW5kZWZpbmVkJyk7XG59O1xuZnVuY3Rpb24gY3JlYXRlTWF0Y2godXNlckFnZW50KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZWdleCkgeyByZXR1cm4gcmVnZXgudGVzdCh1c2VyQWdlbnQpOyB9O1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNNb2JpbGUocGFyYW0pIHtcbiAgICB2YXIgbmF2ID0ge1xuICAgICAgICB1c2VyQWdlbnQ6ICcnLFxuICAgICAgICBwbGF0Zm9ybTogJycsXG4gICAgICAgIG1heFRvdWNoUG9pbnRzOiAwXG4gICAgfTtcbiAgICBpZiAoIXBhcmFtICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5hdiA9IHtcbiAgICAgICAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBuYXZpZ2F0b3IucGxhdGZvcm0sXG4gICAgICAgICAgICBtYXhUb3VjaFBvaW50czogbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYXYudXNlckFnZW50ID0gcGFyYW07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhcmFtICYmIHBhcmFtLnVzZXJBZ2VudCkge1xuICAgICAgICBuYXYgPSB7XG4gICAgICAgICAgICB1c2VyQWdlbnQ6IHBhcmFtLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwYXJhbS5wbGF0Zm9ybSxcbiAgICAgICAgICAgIG1heFRvdWNoUG9pbnRzOiBwYXJhbS5tYXhUb3VjaFBvaW50cyB8fCAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciB1c2VyQWdlbnQgPSBuYXYudXNlckFnZW50O1xuICAgIHZhciB0bXAgPSB1c2VyQWdlbnQuc3BsaXQoJ1tGQkFOJyk7XG4gICAgaWYgKHR5cGVvZiB0bXBbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHVzZXJBZ2VudCA9IHRtcFswXTtcbiAgICB9XG4gICAgdG1wID0gdXNlckFnZW50LnNwbGl0KCdUd2l0dGVyJyk7XG4gICAgaWYgKHR5cGVvZiB0bXBbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHVzZXJBZ2VudCA9IHRtcFswXTtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gY3JlYXRlTWF0Y2godXNlckFnZW50KTtcbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICBhcHBsZToge1xuICAgICAgICAgICAgcGhvbmU6IG1hdGNoKGFwcGxlSXBob25lKSAmJiAhbWF0Y2god2luZG93c1Bob25lKSxcbiAgICAgICAgICAgIGlwb2Q6IG1hdGNoKGFwcGxlSXBvZCksXG4gICAgICAgICAgICB0YWJsZXQ6ICFtYXRjaChhcHBsZUlwaG9uZSkgJiZcbiAgICAgICAgICAgICAgICAobWF0Y2goYXBwbGVUYWJsZXQpIHx8IGlzQXBwbGVUYWJsZXRPbklvczEzKG5hdikpICYmXG4gICAgICAgICAgICAgICAgIW1hdGNoKHdpbmRvd3NQaG9uZSksXG4gICAgICAgICAgICB1bml2ZXJzYWw6IG1hdGNoKGFwcGxlVW5pdmVyc2FsKSxcbiAgICAgICAgICAgIGRldmljZTogKG1hdGNoKGFwcGxlSXBob25lKSB8fFxuICAgICAgICAgICAgICAgIG1hdGNoKGFwcGxlSXBvZCkgfHxcbiAgICAgICAgICAgICAgICBtYXRjaChhcHBsZVRhYmxldCkgfHxcbiAgICAgICAgICAgICAgICBtYXRjaChhcHBsZVVuaXZlcnNhbCkgfHxcbiAgICAgICAgICAgICAgICBpc0FwcGxlVGFibGV0T25Jb3MxMyhuYXYpKSAmJlxuICAgICAgICAgICAgICAgICFtYXRjaCh3aW5kb3dzUGhvbmUpXG4gICAgICAgIH0sXG4gICAgICAgIGFtYXpvbjoge1xuICAgICAgICAgICAgcGhvbmU6IG1hdGNoKGFtYXpvblBob25lKSxcbiAgICAgICAgICAgIHRhYmxldDogIW1hdGNoKGFtYXpvblBob25lKSAmJiBtYXRjaChhbWF6b25UYWJsZXQpLFxuICAgICAgICAgICAgZGV2aWNlOiBtYXRjaChhbWF6b25QaG9uZSkgfHwgbWF0Y2goYW1hem9uVGFibGV0KVxuICAgICAgICB9LFxuICAgICAgICBhbmRyb2lkOiB7XG4gICAgICAgICAgICBwaG9uZTogKCFtYXRjaCh3aW5kb3dzUGhvbmUpICYmIG1hdGNoKGFtYXpvblBob25lKSkgfHxcbiAgICAgICAgICAgICAgICAoIW1hdGNoKHdpbmRvd3NQaG9uZSkgJiYgbWF0Y2goYW5kcm9pZFBob25lKSksXG4gICAgICAgICAgICB0YWJsZXQ6ICFtYXRjaCh3aW5kb3dzUGhvbmUpICYmXG4gICAgICAgICAgICAgICAgIW1hdGNoKGFtYXpvblBob25lKSAmJlxuICAgICAgICAgICAgICAgICFtYXRjaChhbmRyb2lkUGhvbmUpICYmXG4gICAgICAgICAgICAgICAgKG1hdGNoKGFtYXpvblRhYmxldCkgfHwgbWF0Y2goYW5kcm9pZFRhYmxldCkpLFxuICAgICAgICAgICAgZGV2aWNlOiAoIW1hdGNoKHdpbmRvd3NQaG9uZSkgJiZcbiAgICAgICAgICAgICAgICAobWF0Y2goYW1hem9uUGhvbmUpIHx8XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoKGFtYXpvblRhYmxldCkgfHxcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2goYW5kcm9pZFBob25lKSB8fFxuICAgICAgICAgICAgICAgICAgICBtYXRjaChhbmRyb2lkVGFibGV0KSkpIHx8XG4gICAgICAgICAgICAgICAgbWF0Y2goL1xcYm9raHR0cFxcYi9pKVxuICAgICAgICB9LFxuICAgICAgICB3aW5kb3dzOiB7XG4gICAgICAgICAgICBwaG9uZTogbWF0Y2god2luZG93c1Bob25lKSxcbiAgICAgICAgICAgIHRhYmxldDogbWF0Y2god2luZG93c1RhYmxldCksXG4gICAgICAgICAgICBkZXZpY2U6IG1hdGNoKHdpbmRvd3NQaG9uZSkgfHwgbWF0Y2god2luZG93c1RhYmxldClcbiAgICAgICAgfSxcbiAgICAgICAgb3RoZXI6IHtcbiAgICAgICAgICAgIGJsYWNrYmVycnk6IG1hdGNoKG90aGVyQmxhY2tCZXJyeSksXG4gICAgICAgICAgICBibGFja2JlcnJ5MTA6IG1hdGNoKG90aGVyQmxhY2tCZXJyeTEwKSxcbiAgICAgICAgICAgIG9wZXJhOiBtYXRjaChvdGhlck9wZXJhKSxcbiAgICAgICAgICAgIGZpcmVmb3g6IG1hdGNoKG90aGVyRmlyZWZveCksXG4gICAgICAgICAgICBjaHJvbWU6IG1hdGNoKG90aGVyQ2hyb21lKSxcbiAgICAgICAgICAgIGRldmljZTogbWF0Y2gob3RoZXJCbGFja0JlcnJ5KSB8fFxuICAgICAgICAgICAgICAgIG1hdGNoKG90aGVyQmxhY2tCZXJyeTEwKSB8fFxuICAgICAgICAgICAgICAgIG1hdGNoKG90aGVyT3BlcmEpIHx8XG4gICAgICAgICAgICAgICAgbWF0Y2gob3RoZXJGaXJlZm94KSB8fFxuICAgICAgICAgICAgICAgIG1hdGNoKG90aGVyQ2hyb21lKVxuICAgICAgICB9LFxuICAgICAgICBhbnk6IGZhbHNlLFxuICAgICAgICBwaG9uZTogZmFsc2UsXG4gICAgICAgIHRhYmxldDogZmFsc2VcbiAgICB9O1xuICAgIHJlc3VsdC5hbnkgPVxuICAgICAgICByZXN1bHQuYXBwbGUuZGV2aWNlIHx8XG4gICAgICAgICAgICByZXN1bHQuYW5kcm9pZC5kZXZpY2UgfHxcbiAgICAgICAgICAgIHJlc3VsdC53aW5kb3dzLmRldmljZSB8fFxuICAgICAgICAgICAgcmVzdWx0Lm90aGVyLmRldmljZTtcbiAgICByZXN1bHQucGhvbmUgPVxuICAgICAgICByZXN1bHQuYXBwbGUucGhvbmUgfHwgcmVzdWx0LmFuZHJvaWQucGhvbmUgfHwgcmVzdWx0LndpbmRvd3MucGhvbmU7XG4gICAgcmVzdWx0LnRhYmxldCA9XG4gICAgICAgIHJlc3VsdC5hcHBsZS50YWJsZXQgfHwgcmVzdWx0LmFuZHJvaWQudGFibGV0IHx8IHJlc3VsdC53aW5kb3dzLnRhYmxldDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNNb2JpbGUuanMubWFwIiwiLyohXG4gKiBAcGl4aS9zZXR0aW5ncyAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9zZXR0aW5ncyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCBpc01vYmlsZUNhbGwgZnJvbSAnaXNtb2JpbGVqcyc7XG5cbi8vIFRoZSBFU00vQ0pTIHZlcnNpb25zIG9mIGlzbW9iaWxlanMgb25seVxuXG52YXIgaXNNb2JpbGUgPSBpc01vYmlsZUNhbGwod2luZG93Lm5hdmlnYXRvcik7XG5cbi8qKlxuICogVGhlIG1heGltdW0gcmVjb21tZW5kZWQgdGV4dHVyZSB1bml0cyB0byB1c2UuXG4gKiBJbiB0aGVvcnkgdGhlIGJpZ2dlciB0aGUgYmV0dGVyLCBhbmQgZm9yIGRlc2t0b3Agd2UnbGwgdXNlIGFzIG1hbnkgYXMgd2UgY2FuLlxuICogQnV0IHNvbWUgbW9iaWxlIGRldmljZXMgc2xvdyBkb3duIGlmIHRoZXJlIGlzIHRvIG1hbnkgYnJhbmNoZXMgaW4gdGhlIHNoYWRlci5cbiAqIFNvIGluIHByYWN0aWNlIHRoZXJlIHNlZW1zIHRvIGJlIGEgc3dlZXQgc3BvdCBzaXplIHRoYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlLlxuICpcbiAqIEluIHY0LCBhbGwgbW9iaWxlIGRldmljZXMgd2VyZSBsaW1pdGVkIHRvIDQgdGV4dHVyZSB1bml0cyBiZWNhdXNlIGZvciB0aGlzLlxuICogSW4gdjUsIHdlIGFsbG93IGFsbCB0ZXh0dXJlIHVuaXRzIHRvIGJlIHVzZWQgb24gbW9kZXJuIEFwcGxlIG9yIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG1heFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gbWF4UmVjb21tZW5kZWRUZXh0dXJlcyhtYXgpXG57XG4gICAgdmFyIGFsbG93TWF4ID0gdHJ1ZTtcblxuICAgIGlmIChpc01vYmlsZS50YWJsZXQgfHwgaXNNb2JpbGUucGhvbmUpXG4gICAge1xuICAgICAgICBhbGxvd01heCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpc01vYmlsZS5hcHBsZS5kZXZpY2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBtYXRjaCA9IChuYXZpZ2F0b3IudXNlckFnZW50KS5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKT8vKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBtYWpvclZlcnNpb24gPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuXG4gICAgICAgICAgICAgICAgLy8gQWxsIHRleHR1cmUgdW5pdHMgY2FuIGJlIHVzZWQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgaW9zIDExIG9yIGFib3ZlXG4gICAgICAgICAgICAgICAgaWYgKG1ham9yVmVyc2lvbiA+PSAxMSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93TWF4ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTW9iaWxlLmFuZHJvaWQuZGV2aWNlKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbWF0Y2gkMSA9IChuYXZpZ2F0b3IudXNlckFnZW50KS5tYXRjaCgvQW5kcm9pZFxccyhbMC05Ll0qKS8pO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2gkMSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgbWFqb3JWZXJzaW9uJDEgPSBwYXJzZUludChtYXRjaCQxWzFdLCAxMCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBbGwgdGV4dHVyZSB1bml0cyBjYW4gYmUgdXNlZCBvbiBkZXZpY2VzIHRoYXQgc3VwcG9ydCBBbmRyb2lkIDcgKE5vdWdhdCkgb3IgYWJvdmVcbiAgICAgICAgICAgICAgICBpZiAobWFqb3JWZXJzaW9uJDEgPj0gNylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93TWF4ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsb3dNYXggPyBtYXggOiA0O1xufVxuXG4vKipcbiAqIFVwbG9hZGluZyB0aGUgc2FtZSBidWZmZXIgbXVsdGlwbGUgdGltZXMgaW4gYSBzaW5nbGUgZnJhbWUgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3Vlcy5cbiAqIEFwcGFyZW50IG9uIGlPUyBzbyBvbmx5IGNoZWNrIGZvciB0aGF0IGF0IHRoZSBtb21lbnRcbiAqIFRoaXMgY2hlY2sgbWF5IGJlY29tZSBtb3JlIGNvbXBsZXggaWYgdGhpcyBpc3N1ZSBwb3BzIHVwIGVsc2V3aGVyZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNhblVwbG9hZFNhbWVCdWZmZXIoKVxue1xuICAgIHJldHVybiAhaXNNb2JpbGUuYXBwbGUuZGV2aWNlO1xufVxuXG4vKipcbiAqIFVzZXIncyBjdXN0b21pemFibGUgZ2xvYmFscyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBQSVhJIHNldHRpbmdzLCBzdWNoXG4gKiBhcyBhIHJlbmRlcmVyJ3MgZGVmYXVsdCByZXNvbHV0aW9uLCBmcmFtZXJhdGUsIGZsb2F0IHByZWNpc2lvbiwgZXRjLlxuICogQGV4YW1wbGVcbiAqIC8vIFVzZSB0aGUgbmF0aXZlIHdpbmRvdyByZXNvbHV0aW9uIGFzIHRoZSBkZWZhdWx0IHJlc29sdXRpb25cbiAqIC8vIHdpbGwgc3VwcG9ydCBoaWdoLWRlbnNpdHkgZGlzcGxheXMgd2hlbiByZW5kZXJpbmdcbiAqIFBJWEkuc2V0dGluZ3MuUkVTT0xVVElPTiA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICpcbiAqIC8vIERpc2FibGUgaW50ZXJwb2xhdGlvbiB3aGVuIHNjYWxpbmcsIHdpbGwgbWFrZSB0ZXh0dXJlIGJlIHBpeGVsYXRlZFxuICogUElYSS5zZXR0aW5ncy5TQ0FMRV9NT0RFID0gUElYSS5TQ0FMRV9NT0RFUy5ORUFSRVNUO1xuICogQG5hbWVzcGFjZSBQSVhJLnNldHRpbmdzXG4gKi9cbnZhciBzZXR0aW5ncyA9IHtcblxuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlIFdlYkdMIHdpbGwgYXR0ZW1wdCBtYWtlIHRleHR1cmVzIG1pbXBhcGVkIGJ5IGRlZmF1bHQuXG4gICAgICogTWlwbWFwcGluZyB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgYmFzZSB0ZXh0dXJlIHVwbG9hZGVkIGhhcyBwb3dlciBvZiB0d28gZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBNSVBNQVBfVEVYVFVSRVNcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtQSVhJLk1JUE1BUF9NT0RFU31cbiAgICAgKiBAZGVmYXVsdCBQSVhJLk1JUE1BUF9NT0RFUy5QT1cyXG4gICAgICovXG4gICAgTUlQTUFQX1RFWFRVUkVTOiAxLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgbGV2ZWwgb2YgdGV4dHVyZXMuXG4gICAgICogVXN1YWxseSBmcm9tIDAgdG8gMTZcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBBTklTT1RST1BJQ19MRVZFTFxuICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgQU5JU09UUk9QSUNfTEVWRUw6IDAsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHJlc29sdXRpb24gLyBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgdGhlIHJlbmRlcmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBuYW1lIFJFU09MVVRJT05cbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuICAgIFJFU09MVVRJT046IDEsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IGZpbHRlciByZXNvbHV0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBuYW1lIEZJTFRFUl9SRVNPTFVUSU9OXG4gICAgICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICBGSUxURVJfUkVTT0xVVElPTjogMSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHRleHR1cmVzIHRoYXQgdGhpcyBkZXZpY2Ugc3VwcG9ydHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG5hbWUgU1BSSVRFX01BWF9URVhUVVJFU1xuICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAzMlxuICAgICAqL1xuICAgIFNQUklURV9NQVhfVEVYVFVSRVM6IG1heFJlY29tbWVuZGVkVGV4dHVyZXMoMzIpLFxuXG4gICAgLy8gVE9ETzogbWF5YmUgY2hhbmdlIHRvIFNQUklURS5CQVRDSF9TSVpFOiAyMDAwXG4gICAgLy8gVE9ETzogbWF5YmUgYWRkIFBBUlRJQ0xFLkJBVENIX1NJWkU6IDE1MDAwXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBzcHJpdGUgYmF0Y2ggc2l6ZS5cbiAgICAgKlxuICAgICAqIFRoZSBkZWZhdWx0IGFpbXMgdG8gYmFsYW5jZSBkZXNrdG9wIGFuZCBtb2JpbGUgZGV2aWNlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBTUFJJVEVfQkFUQ0hfU0laRVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCA0MDk2XG4gICAgICovXG4gICAgU1BSSVRFX0JBVENIX1NJWkU6IDQwOTYsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCByZW5kZXIgb3B0aW9ucyBpZiBub25lIGFyZSBzdXBwbGllZCB0byB7QGxpbmsgUElYSS5SZW5kZXJlcn1cbiAgICAgKiBvciB7QGxpbmsgUElYSS5DYW52YXNSZW5kZXJlcn0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG5hbWUgUkVOREVSX09QVElPTlNcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtIVE1MQ2FudmFzRWxlbWVudH0gdmlldz1udWxsXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHJlc29sdXRpb249MVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYW50aWFsaWFzPWZhbHNlXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBmb3JjZUZYQUE9ZmFsc2VcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGF1dG9EZW5zaXR5PWZhbHNlXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSB0cmFuc3BhcmVudD1mYWxzZVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBiYWNrZ3JvdW5kQ29sb3I9MHgwMDAwMDBcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGNsZWFyQmVmb3JlUmVuZGVyPXRydWVcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHByZXNlcnZlRHJhd2luZ0J1ZmZlcj1mYWxzZVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aD04MDBcbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0PTYwMFxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbGVnYWN5PWZhbHNlXG4gICAgICovXG4gICAgUkVOREVSX09QVElPTlM6IHtcbiAgICAgICAgdmlldzogbnVsbCxcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgICAgZm9yY2VGWEFBOiBmYWxzZSxcbiAgICAgICAgYXV0b0RlbnNpdHk6IGZhbHNlLFxuICAgICAgICB0cmFuc3BhcmVudDogZmFsc2UsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogMHgwMDAwMDAsXG4gICAgICAgIGNsZWFyQmVmb3JlUmVuZGVyOiB0cnVlLFxuICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGZhbHNlLFxuICAgICAgICB3aWR0aDogODAwLFxuICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgbGVnYWN5OiBmYWxzZSxcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBHYXJiYWdlIENvbGxlY3Rpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBHQ19NT0RFXG4gICAgICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAgICAgKiBAdHlwZSB7UElYSS5HQ19NT0RFU31cbiAgICAgKiBAZGVmYXVsdCBQSVhJLkdDX01PREVTLkFVVE9cbiAgICAgKi9cbiAgICBHQ19NT0RFOiAwLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBHYXJiYWdlIENvbGxlY3Rpb24gbWF4IGlkbGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG5hbWUgR0NfTUFYX0lETEVcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMzYwMFxuICAgICAqL1xuICAgIEdDX01BWF9JRExFOiA2MCAqIDYwLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBHYXJiYWdlIENvbGxlY3Rpb24gbWF4aW11bSBjaGVjayBjb3VudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBHQ19NQVhfQ0hFQ0tfQ09VTlRcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgNjAwXG4gICAgICovXG4gICAgR0NfTUFYX0NIRUNLX0NPVU5UOiA2MCAqIDEwLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB3cmFwIG1vZGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBwaXhpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBuYW1lIFdSQVBfTU9ERVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICogQHR5cGUge1BJWEkuV1JBUF9NT0RFU31cbiAgICAgKiBAZGVmYXVsdCBQSVhJLldSQVBfTU9ERVMuQ0xBTVBcbiAgICAgKi9cbiAgICBXUkFQX01PREU6IDMzMDcxLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBzY2FsZSBtb2RlIGZvciB0ZXh0dXJlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBTQ0FMRV9NT0RFXG4gICAgICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAgICAgKiBAdHlwZSB7UElYSS5TQ0FMRV9NT0RFU31cbiAgICAgKiBAZGVmYXVsdCBQSVhJLlNDQUxFX01PREVTLkxJTkVBUlxuICAgICAqL1xuICAgIFNDQUxFX01PREU6IDEsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHNwZWNpZnkgZmxvYXQgcHJlY2lzaW9uIGluIHZlcnRleCBzaGFkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG5hbWUgUFJFQ0lTSU9OX1ZFUlRFWFxuICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICogQHR5cGUge1BJWEkuUFJFQ0lTSU9OfVxuICAgICAqIEBkZWZhdWx0IFBJWEkuUFJFQ0lTSU9OLkhJR0hcbiAgICAgKi9cbiAgICBQUkVDSVNJT05fVkVSVEVYOiAnaGlnaHAnLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBzcGVjaWZ5IGZsb2F0IHByZWNpc2lvbiBpbiBmcmFnbWVudCBzaGFkZXIuXG4gICAgICogaU9TIGlzIGJlc3Qgc2V0IGF0IGhpZ2hwIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vcGl4aWpzL3BpeGkuanMvaXNzdWVzLzM3NDJcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBQUkVDSVNJT05fRlJBR01FTlRcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtQSVhJLlBSRUNJU0lPTn1cbiAgICAgKiBAZGVmYXVsdCBQSVhJLlBSRUNJU0lPTi5NRURJVU1cbiAgICAgKi9cbiAgICBQUkVDSVNJT05fRlJBR01FTlQ6IGlzTW9iaWxlLmFwcGxlLmRldmljZSA/ICdoaWdocCcgOiAnbWVkaXVtcCcsXG5cbiAgICAvKipcbiAgICAgKiBDYW4gd2UgdXBsb2FkIHRoZSBzYW1lIGJ1ZmZlciBpbiBhIHNpbmdsZSBmcmFtZT9cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBDQU5fVVBMT0FEX1NBTUVfQlVGRkVSXG4gICAgICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBDQU5fVVBMT0FEX1NBTUVfQlVGRkVSOiBjYW5VcGxvYWRTYW1lQnVmZmVyKCksXG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGJpdG1hcCBjcmVhdGlvbiBiZWZvcmUgaW1hZ2UgbG9hZC4gVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBDUkVBVEVfSU1BR0VfQklUTUFQXG4gICAgICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIENSRUFURV9JTUFHRV9CSVRNQVA6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSBQaXhpSlMgd2lsbCBNYXRoLmZsb29yKCkgeC95IHZhbHVlcyB3aGVuIHJlbmRlcmluZywgc3RvcHBpbmcgcGl4ZWwgaW50ZXJwb2xhdGlvbi5cbiAgICAgKiBBZHZhbnRhZ2VzIGNhbiBpbmNsdWRlIHNoYXJwZXIgaW1hZ2UgcXVhbGl0eSAobGlrZSB0ZXh0KSBhbmQgZmFzdGVyIHJlbmRlcmluZyBvbiBjYW52YXMuXG4gICAgICogVGhlIG1haW4gZGlzYWR2YW50YWdlIGlzIG1vdmVtZW50IG9mIG9iamVjdHMgbWF5IGFwcGVhciBsZXNzIHNtb290aC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAY29uc3RhbnRcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgUk9VTkRfUElYRUxTOiBmYWxzZSxcbn07XG5cbmV4cG9ydCB7IGlzTW9iaWxlLCBzZXR0aW5ncyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0dGluZ3MuZXMuanMubWFwXG4iLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcInVybFwiKTs7IiwiLyohXG4gKiBAcGl4aS9jb25zdGFudHMgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvY29uc3RhbnRzIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuLyoqXG4gKiBEaWZmZXJlbnQgdHlwZXMgb2YgZW52aXJvbm1lbnRzIGZvciBXZWJHTC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQG5hbWUgRU5WXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFdFQkdMX0xFR0FDWSAtIFVzZWQgZm9yIG9sZGVyIHYxIFdlYkdMIGRldmljZXMuIFBpeGlKUyB3aWxsIGFpbSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eVxuICogIHdpdGggb2xkZXIgLyBsZXNzIGFkdmFuY2VkIGRldmljZXMuIElmIHlvdSBleHBlcmllbmNlIHVuZXhwbGFpbmVkIGZsaWNrZXJpbmcgcHJlZmVyIHRoaXMgZW52aXJvbm1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gV0VCR0wgLSBWZXJzaW9uIDEgb2YgV2ViR0xcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBXRUJHTDIgLSBWZXJzaW9uIDIgb2YgV2ViR0xcbiAqL1xudmFyIEVOVjtcbihmdW5jdGlvbiAoRU5WKSB7XG4gICAgRU5WW0VOVltcIldFQkdMX0xFR0FDWVwiXSA9IDBdID0gXCJXRUJHTF9MRUdBQ1lcIjtcbiAgICBFTlZbRU5WW1wiV0VCR0xcIl0gPSAxXSA9IFwiV0VCR0xcIjtcbiAgICBFTlZbRU5WW1wiV0VCR0wyXCJdID0gMl0gPSBcIldFQkdMMlwiO1xufSkoRU5WIHx8IChFTlYgPSB7fSkpO1xuLyoqXG4gKiBDb25zdGFudCB0byBpZGVudGlmeSB0aGUgUmVuZGVyZXIgVHlwZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQG5hbWUgUkVOREVSRVJfVFlQRVxuICogQGVudW0ge251bWJlcn1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTktOT1dOIC0gVW5rbm93biByZW5kZXIgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBXRUJHTCAtIFdlYkdMIHJlbmRlciB0eXBlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENBTlZBUyAtIENhbnZhcyByZW5kZXIgdHlwZS5cbiAqL1xudmFyIFJFTkRFUkVSX1RZUEU7XG4oZnVuY3Rpb24gKFJFTkRFUkVSX1RZUEUpIHtcbiAgICBSRU5ERVJFUl9UWVBFW1JFTkRFUkVSX1RZUEVbXCJVTktOT1dOXCJdID0gMF0gPSBcIlVOS05PV05cIjtcbiAgICBSRU5ERVJFUl9UWVBFW1JFTkRFUkVSX1RZUEVbXCJXRUJHTFwiXSA9IDFdID0gXCJXRUJHTFwiO1xuICAgIFJFTkRFUkVSX1RZUEVbUkVOREVSRVJfVFlQRVtcIkNBTlZBU1wiXSA9IDJdID0gXCJDQU5WQVNcIjtcbn0pKFJFTkRFUkVSX1RZUEUgfHwgKFJFTkRFUkVSX1RZUEUgPSB7fSkpO1xuLyoqXG4gKiBWYXJpb3VzIGJsZW5kIG1vZGVzIHN1cHBvcnRlZCBieSBQSVhJLlxuICpcbiAqIElNUE9SVEFOVCAtIFRoZSBXZWJHTCByZW5kZXJlciBvbmx5IHN1cHBvcnRzIHRoZSBOT1JNQUwsIEFERCwgTVVMVElQTFkgYW5kIFNDUkVFTiBibGVuZCBtb2Rlcy5cbiAqIEFueXRoaW5nIGVsc2Ugd2lsbCBzaWxlbnRseSBhY3QgbGlrZSBOT1JNQUwuXG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBuYW1lIEJMRU5EX01PREVTXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHByb3BlcnR5IHtudW1iZXJ9IE5PUk1BTFxuICogQHByb3BlcnR5IHtudW1iZXJ9IEFERFxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1VTFRJUExZXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0NSRUVOXG4gKiBAcHJvcGVydHkge251bWJlcn0gT1ZFUkxBWVxuICogQHByb3BlcnR5IHtudW1iZXJ9IERBUktFTlxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJR0hURU5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBDT0xPUl9ET0RHRVxuICogQHByb3BlcnR5IHtudW1iZXJ9IENPTE9SX0JVUk5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBIQVJEX0xJR0hUXG4gKiBAcHJvcGVydHkge251bWJlcn0gU09GVF9MSUdIVFxuICogQHByb3BlcnR5IHtudW1iZXJ9IERJRkZFUkVOQ0VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFWENMVVNJT05cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBIVUVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTQVRVUkFUSU9OXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ09MT1JcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBMVU1JTk9TSVRZXG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9STUFMX05QTVxuICogQHByb3BlcnR5IHtudW1iZXJ9IEFERF9OUE1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTQ1JFRU5fTlBNXG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9ORVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNSQ19JTlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNSQ19PVVRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTUkNfQVRPUFxuICogQHByb3BlcnR5IHtudW1iZXJ9IERTVF9PVkVSXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFNUX0lOXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFNUX09VVFxuICogQHByb3BlcnR5IHtudW1iZXJ9IERTVF9BVE9QXG4gKiBAcHJvcGVydHkge251bWJlcn0gU1VCVFJBQ1RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTUkNfT1ZFUlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVSQVNFXG4gKiBAcHJvcGVydHkge251bWJlcn0gWE9SXG4gKi9cbnZhciBCTEVORF9NT0RFUztcbihmdW5jdGlvbiAoQkxFTkRfTU9ERVMpIHtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIk5PUk1BTFwiXSA9IDBdID0gXCJOT1JNQUxcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkFERFwiXSA9IDFdID0gXCJBRERcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIk1VTFRJUExZXCJdID0gMl0gPSBcIk1VTFRJUExZXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJTQ1JFRU5cIl0gPSAzXSA9IFwiU0NSRUVOXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJPVkVSTEFZXCJdID0gNF0gPSBcIk9WRVJMQVlcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkRBUktFTlwiXSA9IDVdID0gXCJEQVJLRU5cIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkxJR0hURU5cIl0gPSA2XSA9IFwiTElHSFRFTlwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiQ09MT1JfRE9ER0VcIl0gPSA3XSA9IFwiQ09MT1JfRE9ER0VcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkNPTE9SX0JVUk5cIl0gPSA4XSA9IFwiQ09MT1JfQlVSTlwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiSEFSRF9MSUdIVFwiXSA9IDldID0gXCJIQVJEX0xJR0hUXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJTT0ZUX0xJR0hUXCJdID0gMTBdID0gXCJTT0ZUX0xJR0hUXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJESUZGRVJFTkNFXCJdID0gMTFdID0gXCJESUZGRVJFTkNFXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJFWENMVVNJT05cIl0gPSAxMl0gPSBcIkVYQ0xVU0lPTlwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiSFVFXCJdID0gMTNdID0gXCJIVUVcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIlNBVFVSQVRJT05cIl0gPSAxNF0gPSBcIlNBVFVSQVRJT05cIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkNPTE9SXCJdID0gMTVdID0gXCJDT0xPUlwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiTFVNSU5PU0lUWVwiXSA9IDE2XSA9IFwiTFVNSU5PU0lUWVwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiTk9STUFMX05QTVwiXSA9IDE3XSA9IFwiTk9STUFMX05QTVwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiQUREX05QTVwiXSA9IDE4XSA9IFwiQUREX05QTVwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiU0NSRUVOX05QTVwiXSA9IDE5XSA9IFwiU0NSRUVOX05QTVwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiTk9ORVwiXSA9IDIwXSA9IFwiTk9ORVwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiU1JDX09WRVJcIl0gPSAwXSA9IFwiU1JDX09WRVJcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIlNSQ19JTlwiXSA9IDIxXSA9IFwiU1JDX0lOXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJTUkNfT1VUXCJdID0gMjJdID0gXCJTUkNfT1VUXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJTUkNfQVRPUFwiXSA9IDIzXSA9IFwiU1JDX0FUT1BcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkRTVF9PVkVSXCJdID0gMjRdID0gXCJEU1RfT1ZFUlwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiRFNUX0lOXCJdID0gMjVdID0gXCJEU1RfSU5cIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkRTVF9PVVRcIl0gPSAyNl0gPSBcIkRTVF9PVVRcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIkRTVF9BVE9QXCJdID0gMjddID0gXCJEU1RfQVRPUFwiO1xuICAgIEJMRU5EX01PREVTW0JMRU5EX01PREVTW1wiRVJBU0VcIl0gPSAyNl0gPSBcIkVSQVNFXCI7XG4gICAgQkxFTkRfTU9ERVNbQkxFTkRfTU9ERVNbXCJTVUJUUkFDVFwiXSA9IDI4XSA9IFwiU1VCVFJBQ1RcIjtcbiAgICBCTEVORF9NT0RFU1tCTEVORF9NT0RFU1tcIlhPUlwiXSA9IDI5XSA9IFwiWE9SXCI7XG59KShCTEVORF9NT0RFUyB8fCAoQkxFTkRfTU9ERVMgPSB7fSkpO1xuLyoqXG4gKiBWYXJpb3VzIHdlYmdsIGRyYXcgbW9kZXMuIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggR0wgZHJhd01vZGUgdG8gdXNlXG4gKiB1bmRlciBjZXJ0YWluIHNpdHVhdGlvbnMgYW5kIHJlbmRlcmVycy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQHN0YXRpY1xuICogQG5hbWUgRFJBV19NT0RFU1xuICogQGVudW0ge251bWJlcn1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQT0lOVFNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBMSU5FU1xuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTkVfTE9PUFxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTkVfU1RSSVBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBUUklBTkdMRVNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBUUklBTkdMRV9TVFJJUFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFRSSUFOR0xFX0ZBTlxuICovXG52YXIgRFJBV19NT0RFUztcbihmdW5jdGlvbiAoRFJBV19NT0RFUykge1xuICAgIERSQVdfTU9ERVNbRFJBV19NT0RFU1tcIlBPSU5UU1wiXSA9IDBdID0gXCJQT0lOVFNcIjtcbiAgICBEUkFXX01PREVTW0RSQVdfTU9ERVNbXCJMSU5FU1wiXSA9IDFdID0gXCJMSU5FU1wiO1xuICAgIERSQVdfTU9ERVNbRFJBV19NT0RFU1tcIkxJTkVfTE9PUFwiXSA9IDJdID0gXCJMSU5FX0xPT1BcIjtcbiAgICBEUkFXX01PREVTW0RSQVdfTU9ERVNbXCJMSU5FX1NUUklQXCJdID0gM10gPSBcIkxJTkVfU1RSSVBcIjtcbiAgICBEUkFXX01PREVTW0RSQVdfTU9ERVNbXCJUUklBTkdMRVNcIl0gPSA0XSA9IFwiVFJJQU5HTEVTXCI7XG4gICAgRFJBV19NT0RFU1tEUkFXX01PREVTW1wiVFJJQU5HTEVfU1RSSVBcIl0gPSA1XSA9IFwiVFJJQU5HTEVfU1RSSVBcIjtcbiAgICBEUkFXX01PREVTW0RSQVdfTU9ERVNbXCJUUklBTkdMRV9GQU5cIl0gPSA2XSA9IFwiVFJJQU5HTEVfRkFOXCI7XG59KShEUkFXX01PREVTIHx8IChEUkFXX01PREVTID0ge30pKTtcbi8qKlxuICogVmFyaW91cyBHTCB0ZXh0dXJlL3Jlc291cmNlcyBmb3JtYXRzLlxuICpcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBGT1JNQVRTXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJHQkE9NjQwOFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJHQj02NDA3XG4gKiBAcHJvcGVydHkge251bWJlcn0gQUxQSEE9NjQwNlxuICogQHByb3BlcnR5IHtudW1iZXJ9IExVTUlOQU5DRT02NDA5XG4gKiBAcHJvcGVydHkge251bWJlcn0gTFVNSU5BTkNFX0FMUEhBPTY0MTBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBERVBUSF9DT01QT05FTlQ9NjQwMlxuICogQHByb3BlcnR5IHtudW1iZXJ9IERFUFRIX1NURU5DSUw9MzQwNDFcbiAqL1xudmFyIEZPUk1BVFM7XG4oZnVuY3Rpb24gKEZPUk1BVFMpIHtcbiAgICBGT1JNQVRTW0ZPUk1BVFNbXCJSR0JBXCJdID0gNjQwOF0gPSBcIlJHQkFcIjtcbiAgICBGT1JNQVRTW0ZPUk1BVFNbXCJSR0JcIl0gPSA2NDA3XSA9IFwiUkdCXCI7XG4gICAgRk9STUFUU1tGT1JNQVRTW1wiQUxQSEFcIl0gPSA2NDA2XSA9IFwiQUxQSEFcIjtcbiAgICBGT1JNQVRTW0ZPUk1BVFNbXCJMVU1JTkFOQ0VcIl0gPSA2NDA5XSA9IFwiTFVNSU5BTkNFXCI7XG4gICAgRk9STUFUU1tGT1JNQVRTW1wiTFVNSU5BTkNFX0FMUEhBXCJdID0gNjQxMF0gPSBcIkxVTUlOQU5DRV9BTFBIQVwiO1xuICAgIEZPUk1BVFNbRk9STUFUU1tcIkRFUFRIX0NPTVBPTkVOVFwiXSA9IDY0MDJdID0gXCJERVBUSF9DT01QT05FTlRcIjtcbiAgICBGT1JNQVRTW0ZPUk1BVFNbXCJERVBUSF9TVEVOQ0lMXCJdID0gMzQwNDFdID0gXCJERVBUSF9TVEVOQ0lMXCI7XG59KShGT1JNQVRTIHx8IChGT1JNQVRTID0ge30pKTtcbi8qKlxuICogVmFyaW91cyBHTCB0YXJnZXQgdHlwZXMuXG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFRBUkdFVFNcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKiBAcHJvcGVydHkge251bWJlcn0gVEVYVFVSRV8yRD0zNTUzXG4gKiBAcHJvcGVydHkge251bWJlcn0gVEVYVFVSRV9DVUJFX01BUD0zNDA2N1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFRFWFRVUkVfMkRfQVJSQVk9MzU4NjZcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g9MzQwNjlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1g9MzQwNzBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k9MzQwNzFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k9MzQwNzJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o9MzQwNzNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o9MzQwNzRcbiAqL1xudmFyIFRBUkdFVFM7XG4oZnVuY3Rpb24gKFRBUkdFVFMpIHtcbiAgICBUQVJHRVRTW1RBUkdFVFNbXCJURVhUVVJFXzJEXCJdID0gMzU1M10gPSBcIlRFWFRVUkVfMkRcIjtcbiAgICBUQVJHRVRTW1RBUkdFVFNbXCJURVhUVVJFX0NVQkVfTUFQXCJdID0gMzQwNjddID0gXCJURVhUVVJFX0NVQkVfTUFQXCI7XG4gICAgVEFSR0VUU1tUQVJHRVRTW1wiVEVYVFVSRV8yRF9BUlJBWVwiXSA9IDM1ODY2XSA9IFwiVEVYVFVSRV8yRF9BUlJBWVwiO1xuICAgIFRBUkdFVFNbVEFSR0VUU1tcIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWFwiXSA9IDM0MDY5XSA9IFwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YXCI7XG4gICAgVEFSR0VUU1tUQVJHRVRTW1wiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YXCJdID0gMzQwNzBdID0gXCJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hcIjtcbiAgICBUQVJHRVRTW1RBUkdFVFNbXCJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lcIl0gPSAzNDA3MV0gPSBcIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWVwiO1xuICAgIFRBUkdFVFNbVEFSR0VUU1tcIlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWVwiXSA9IDM0MDcyXSA9IFwiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZXCI7XG4gICAgVEFSR0VUU1tUQVJHRVRTW1wiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aXCJdID0gMzQwNzNdID0gXCJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pcIjtcbiAgICBUQVJHRVRTW1RBUkdFVFNbXCJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pcIl0gPSAzNDA3NF0gPSBcIlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWlwiO1xufSkoVEFSR0VUUyB8fCAoVEFSR0VUUyA9IHt9KSk7XG4vKipcbiAqIFZhcmlvdXMgR0wgZGF0YSBmb3JtYXQgdHlwZXMuXG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFRZUEVTXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU0lHTkVEX0JZVEU9NTEyMVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU0lHTkVEX1NIT1JUPTUxMjNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNJR05FRF9TSE9SVF81XzZfNT0zMzYzNVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU0lHTkVEX1NIT1JUXzRfNF80XzQ9MzI4MTlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNJR05FRF9TSE9SVF81XzVfNV8xPTMyODIwXG4gKiBAcHJvcGVydHkge251bWJlcn0gRkxPQVQ9NTEyNlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEhBTEZfRkxPQVQ9MzYxOTNcbiAqL1xudmFyIFRZUEVTO1xuKGZ1bmN0aW9uIChUWVBFUykge1xuICAgIFRZUEVTW1RZUEVTW1wiVU5TSUdORURfQllURVwiXSA9IDUxMjFdID0gXCJVTlNJR05FRF9CWVRFXCI7XG4gICAgVFlQRVNbVFlQRVNbXCJVTlNJR05FRF9TSE9SVFwiXSA9IDUxMjNdID0gXCJVTlNJR05FRF9TSE9SVFwiO1xuICAgIFRZUEVTW1RZUEVTW1wiVU5TSUdORURfU0hPUlRfNV82XzVcIl0gPSAzMzYzNV0gPSBcIlVOU0lHTkVEX1NIT1JUXzVfNl81XCI7XG4gICAgVFlQRVNbVFlQRVNbXCJVTlNJR05FRF9TSE9SVF80XzRfNF80XCJdID0gMzI4MTldID0gXCJVTlNJR05FRF9TSE9SVF80XzRfNF80XCI7XG4gICAgVFlQRVNbVFlQRVNbXCJVTlNJR05FRF9TSE9SVF81XzVfNV8xXCJdID0gMzI4MjBdID0gXCJVTlNJR05FRF9TSE9SVF81XzVfNV8xXCI7XG4gICAgVFlQRVNbVFlQRVNbXCJGTE9BVFwiXSA9IDUxMjZdID0gXCJGTE9BVFwiO1xuICAgIFRZUEVTW1RZUEVTW1wiSEFMRl9GTE9BVFwiXSA9IDM2MTkzXSA9IFwiSEFMRl9GTE9BVFwiO1xufSkoVFlQRVMgfHwgKFRZUEVTID0ge30pKTtcbi8qKlxuICogVGhlIHNjYWxlIG1vZGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBwaXhpLlxuICpcbiAqIFRoZSB7QGxpbmsgUElYSS5zZXR0aW5ncy5TQ0FMRV9NT0RFfSBzY2FsZSBtb2RlIGFmZmVjdHMgdGhlIGRlZmF1bHQgc2NhbGluZyBtb2RlIG9mIGZ1dHVyZSBvcGVyYXRpb25zLlxuICogSXQgY2FuIGJlIHJlLWFzc2lnbmVkIHRvIGVpdGhlciBMSU5FQVIgb3IgTkVBUkVTVCwgZGVwZW5kaW5nIHVwb24gc3VpdGFiaWxpdHkuXG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFNDQUxFX01PREVTXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTkVBUiBTbW9vdGggc2NhbGluZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IE5FQVJFU1QgUGl4ZWxhdGluZyBzY2FsaW5nXG4gKi9cbnZhciBTQ0FMRV9NT0RFUztcbihmdW5jdGlvbiAoU0NBTEVfTU9ERVMpIHtcbiAgICBTQ0FMRV9NT0RFU1tTQ0FMRV9NT0RFU1tcIk5FQVJFU1RcIl0gPSAwXSA9IFwiTkVBUkVTVFwiO1xuICAgIFNDQUxFX01PREVTW1NDQUxFX01PREVTW1wiTElORUFSXCJdID0gMV0gPSBcIkxJTkVBUlwiO1xufSkoU0NBTEVfTU9ERVMgfHwgKFNDQUxFX01PREVTID0ge30pKTtcbi8qKlxuICogVGhlIHdyYXAgbW9kZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHBpeGkuXG4gKlxuICogVGhlIHtAbGluayBQSVhJLnNldHRpbmdzLldSQVBfTU9ERX0gd3JhcCBtb2RlIGFmZmVjdHMgdGhlIGRlZmF1bHQgd3JhcHBpbmcgbW9kZSBvZiBmdXR1cmUgb3BlcmF0aW9ucy5cbiAqIEl0IGNhbiBiZSByZS1hc3NpZ25lZCB0byBlaXRoZXIgQ0xBTVAgb3IgUkVQRUFULCBkZXBlbmRpbmcgdXBvbiBzdWl0YWJpbGl0eS5cbiAqIElmIHRoZSB0ZXh0dXJlIGlzIG5vbiBwb3dlciBvZiB0d28gdGhlbiBjbGFtcCB3aWxsIGJlIHVzZWQgcmVnYXJkbGVzcyBhcyBXZWJHTCBjYW5cbiAqIG9ubHkgdXNlIFJFUEVBVCBpZiB0aGUgdGV4dHVyZSBpcyBwbzIuXG4gKlxuICogVGhpcyBwcm9wZXJ0eSBvbmx5IGFmZmVjdHMgV2ViR0wuXG4gKlxuICogQG5hbWUgV1JBUF9NT0RFU1xuICogQG1lbWJlcm9mIFBJWElcbiAqIEBzdGF0aWNcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKiBAcHJvcGVydHkge251bWJlcn0gQ0xBTVAgLSBUaGUgdGV4dHVyZXMgdXZzIGFyZSBjbGFtcGVkXG4gKiBAcHJvcGVydHkge251bWJlcn0gUkVQRUFUIC0gVGhlIHRleHR1cmUgdXZzIHRpbGUgYW5kIHJlcGVhdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JUlJPUkVEX1JFUEVBVCAtIFRoZSB0ZXh0dXJlIHV2cyB0aWxlIGFuZCByZXBlYXQgd2l0aCBtaXJyb3JpbmdcbiAqL1xudmFyIFdSQVBfTU9ERVM7XG4oZnVuY3Rpb24gKFdSQVBfTU9ERVMpIHtcbiAgICBXUkFQX01PREVTW1dSQVBfTU9ERVNbXCJDTEFNUFwiXSA9IDMzMDcxXSA9IFwiQ0xBTVBcIjtcbiAgICBXUkFQX01PREVTW1dSQVBfTU9ERVNbXCJSRVBFQVRcIl0gPSAxMDQ5N10gPSBcIlJFUEVBVFwiO1xuICAgIFdSQVBfTU9ERVNbV1JBUF9NT0RFU1tcIk1JUlJPUkVEX1JFUEVBVFwiXSA9IDMzNjQ4XSA9IFwiTUlSUk9SRURfUkVQRUFUXCI7XG59KShXUkFQX01PREVTIHx8IChXUkFQX01PREVTID0ge30pKTtcbi8qKlxuICogTWlwbWFwIGZpbHRlcmluZyBtb2RlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgcGl4aS5cbiAqXG4gKiBUaGUge0BsaW5rIFBJWEkuc2V0dGluZ3MuTUlQTUFQX1RFWFRVUkVTfSBhZmZlY3RzIGRlZmF1bHQgdGV4dHVyZSBmaWx0ZXJpbmcuXG4gKiBNaXBtYXBzIGFyZSBnZW5lcmF0ZWQgZm9yIGEgYmFzZVRleHR1cmUgaWYgaXRzIGBtaXBtYXBgIGZpZWxkIGlzIGBPTmAsXG4gKiBvciBpdHMgYFBPVzJgIGFuZCB0ZXh0dXJlIGRpbWVuc2lvbnMgYXJlIHBvd2VycyBvZiAyLlxuICogRHVlIHRvIHBsYXRmb3JtIHJlc3RyaWN0aW9uLCBgT05gIG9wdGlvbiB3aWxsIHdvcmsgbGlrZSBgUE9XMmAgZm9yIHdlYmdsLTEuXG4gKlxuICogVGhpcyBwcm9wZXJ0eSBvbmx5IGFmZmVjdHMgV2ViR0wuXG4gKlxuICogQG5hbWUgTUlQTUFQX01PREVTXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQHN0YXRpY1xuICogQGVudW0ge251bWJlcn1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPRkYgLSBObyBtaXBtYXBzXG4gKiBAcHJvcGVydHkge251bWJlcn0gUE9XMiAtIEdlbmVyYXRlIG1pcG1hcHMgaWYgdGV4dHVyZSBkaW1lbnNpb25zIGFyZSBwb3cyXG4gKiBAcHJvcGVydHkge251bWJlcn0gT04gLSBBbHdheXMgZ2VuZXJhdGUgbWlwbWFwc1xuICovXG52YXIgTUlQTUFQX01PREVTO1xuKGZ1bmN0aW9uIChNSVBNQVBfTU9ERVMpIHtcbiAgICBNSVBNQVBfTU9ERVNbTUlQTUFQX01PREVTW1wiT0ZGXCJdID0gMF0gPSBcIk9GRlwiO1xuICAgIE1JUE1BUF9NT0RFU1tNSVBNQVBfTU9ERVNbXCJQT1cyXCJdID0gMV0gPSBcIlBPVzJcIjtcbiAgICBNSVBNQVBfTU9ERVNbTUlQTUFQX01PREVTW1wiT05cIl0gPSAyXSA9IFwiT05cIjtcbn0pKE1JUE1BUF9NT0RFUyB8fCAoTUlQTUFQX01PREVTID0ge30pKTtcbi8qKlxuICogSG93IHRvIHRyZWF0IHRleHR1cmVzIHdpdGggcHJlbXVsdGlwbGllZCBhbHBoYVxuICpcbiAqIEBuYW1lIEFMUEhBX01PREVTXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQHN0YXRpY1xuICogQGVudW0ge251bWJlcn1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBOT19QUkVNVUxUSVBMSUVEX0FMUEhBIC0gU291cmNlIGlzIG5vdCBwcmVtdWx0aXBsaWVkLCBsZWF2ZSBpdCBsaWtlIHRoYXQuXG4gKiAgT3B0aW9uIGZvciBjb21wcmVzc2VkIGFuZCBkYXRhIHRleHR1cmVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSB0eXBlZCBhcnJheXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gUFJFTVVMVElQTFlfT05fVVBMT0FEIC0gU291cmNlIGlzIG5vdCBwcmVtdWx0aXBsaWVkLCBwcmVtdWx0aXBseSBvbiB1cGxvYWQuXG4gKiAgRGVmYXVsdCBvcHRpb24sIHVzZWQgZm9yIGFsbCBsb2FkZWQgaW1hZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBSRU1VTFRJUExJRURfQUxQSEEgLSBTb3VyY2UgaXMgYWxyZWFkeSBwcmVtdWx0aXBsaWVkXG4gKiAgRXhhbXBsZTogc3BpbmUgYXRsYXNlcyB3aXRoIGBfcG1hYCBzdWZmaXguXG4gKiBAcHJvcGVydHkge251bWJlcn0gTlBNIC0gQWxpYXMgZm9yIE5PX1BSRU1VTFRJUExJRURfQUxQSEEuXG4gKiBAcHJvcGVydHkge251bWJlcn0gVU5QQUNLIC0gRGVmYXVsdCBvcHRpb24sIGFsaWFzIGZvciBQUkVNVUxUSVBMWV9PTl9VUExPQUQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gUE1BIC0gQWxpYXMgZm9yIFBSRU1VTFRJUExJRURfQUxQSEEuXG4gKi9cbnZhciBBTFBIQV9NT0RFUztcbihmdW5jdGlvbiAoQUxQSEFfTU9ERVMpIHtcbiAgICBBTFBIQV9NT0RFU1tBTFBIQV9NT0RFU1tcIk5QTVwiXSA9IDBdID0gXCJOUE1cIjtcbiAgICBBTFBIQV9NT0RFU1tBTFBIQV9NT0RFU1tcIlVOUEFDS1wiXSA9IDFdID0gXCJVTlBBQ0tcIjtcbiAgICBBTFBIQV9NT0RFU1tBTFBIQV9NT0RFU1tcIlBNQVwiXSA9IDJdID0gXCJQTUFcIjtcbiAgICBBTFBIQV9NT0RFU1tBTFBIQV9NT0RFU1tcIk5PX1BSRU1VTFRJUExJRURfQUxQSEFcIl0gPSAwXSA9IFwiTk9fUFJFTVVMVElQTElFRF9BTFBIQVwiO1xuICAgIEFMUEhBX01PREVTW0FMUEhBX01PREVTW1wiUFJFTVVMVElQTFlfT05fVVBMT0FEXCJdID0gMV0gPSBcIlBSRU1VTFRJUExZX09OX1VQTE9BRFwiO1xuICAgIEFMUEhBX01PREVTW0FMUEhBX01PREVTW1wiUFJFTVVMVElQTFlfQUxQSEFcIl0gPSAyXSA9IFwiUFJFTVVMVElQTFlfQUxQSEFcIjtcbn0pKEFMUEhBX01PREVTIHx8IChBTFBIQV9NT0RFUyA9IHt9KSk7XG4vKipcbiAqIFRoZSBnYyBtb2RlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgcGl4aS5cbiAqXG4gKiBUaGUge0BsaW5rIFBJWEkuc2V0dGluZ3MuR0NfTU9ERX0gR2FyYmFnZSBDb2xsZWN0aW9uIG1vZGUgZm9yIFBpeGlKUyB0ZXh0dXJlcyBpcyBBVVRPXG4gKiBJZiBzZXQgdG8gR0NfTU9ERSwgdGhlIHJlbmRlcmVyIHdpbGwgb2NjYXNpb25hbGx5IGNoZWNrIHRleHR1cmVzIHVzYWdlLiBJZiB0aGV5IGFyZSBub3RcbiAqIHVzZWQgZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIHRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEdQVS4gVGhleSB3aWxsIG9mIGNvdXJzZVxuICogYmUgdXBsb2FkZWQgYWdhaW4gd2hlbiB0aGV5IGFyZSByZXF1aXJlZC4gVGhpcyBpcyBhIHNpbGVudCBiZWhpbmQgdGhlIHNjZW5lcyBwcm9jZXNzIHRoYXRcbiAqIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgR1BVIGRvZXMgbm90ICBnZXQgZmlsbGVkIHVwLlxuICpcbiAqIEhhbmR5IGZvciBtb2JpbGUgZGV2aWNlcyFcbiAqIFRoaXMgcHJvcGVydHkgb25seSBhZmZlY3RzIFdlYkdMLlxuICpcbiAqIEBuYW1lIEdDX01PREVTXG4gKiBAZW51bSB7bnVtYmVyfVxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIFBJWElcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBBVVRPIC0gR2FyYmFnZSBjb2xsZWN0aW9uIHdpbGwgaGFwcGVuIHBlcmlvZGljYWxseSBhdXRvbWF0aWNhbGx5XG4gKiBAcHJvcGVydHkge251bWJlcn0gTUFOVUFMIC0gR2FyYmFnZSBjb2xsZWN0aW9uIHdpbGwgbmVlZCB0byBiZSBjYWxsZWQgbWFudWFsbHlcbiAqL1xudmFyIEdDX01PREVTO1xuKGZ1bmN0aW9uIChHQ19NT0RFUykge1xuICAgIEdDX01PREVTW0dDX01PREVTW1wiQVVUT1wiXSA9IDBdID0gXCJBVVRPXCI7XG4gICAgR0NfTU9ERVNbR0NfTU9ERVNbXCJNQU5VQUxcIl0gPSAxXSA9IFwiTUFOVUFMXCI7XG59KShHQ19NT0RFUyB8fCAoR0NfTU9ERVMgPSB7fSkpO1xuLyoqXG4gKiBDb25zdGFudHMgdGhhdCBzcGVjaWZ5IGZsb2F0IHByZWNpc2lvbiBpbiBzaGFkZXJzLlxuICpcbiAqIEBuYW1lIFBSRUNJU0lPTlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBjb25zdGFudFxuICogQHN0YXRpY1xuICogQGVudW0ge3N0cmluZ31cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBMT1c9J2xvd3AnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUVESVVNPSdtZWRpdW1wJ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJR0g9J2hpZ2hwJ1xuICovXG52YXIgUFJFQ0lTSU9OO1xuKGZ1bmN0aW9uIChQUkVDSVNJT04pIHtcbiAgICBQUkVDSVNJT05bXCJMT1dcIl0gPSBcImxvd3BcIjtcbiAgICBQUkVDSVNJT05bXCJNRURJVU1cIl0gPSBcIm1lZGl1bXBcIjtcbiAgICBQUkVDSVNJT05bXCJISUdIXCJdID0gXCJoaWdocFwiO1xufSkoUFJFQ0lTSU9OIHx8IChQUkVDSVNJT04gPSB7fSkpO1xuLyoqXG4gKiBDb25zdGFudHMgZm9yIG1hc2sgaW1wbGVtZW50YXRpb25zLlxuICogV2UgdXNlIGB0eXBlYCBzdWZmaXggYmVjYXVzZSBpdCBsZWFkcyB0byB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXJzXG4gKlxuICogQG5hbWUgTUFTS19UWVBFU1xuICogQG1lbWJlcm9mIFBJWElcbiAqIEBzdGF0aWNcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9ORSAtIE1hc2sgaXMgaWdub3JlZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNDSVNTT1IgLSBTY2lzc29yIG1hc2ssIHJlY3RhbmdsZSBvbiBzY3JlZW4sIGNoZWFwXG4gKiBAcHJvcGVydHkge251bWJlcn0gU1RFTkNJTCAtIFN0ZW5jaWwgbWFzaywgMS1iaXQsIG1lZGl1bSwgd29ya3Mgb25seSBpZiByZW5kZXJlciBzdXBwb3J0cyBzdGVuY2lsXG4gKiBAcHJvcGVydHkge251bWJlcn0gU1BSSVRFIC0gTWFzayB0aGF0IHVzZXMgU3ByaXRlTWFza0ZpbHRlciwgdXNlcyB0ZW1wb3JhcnkgUmVuZGVyVGV4dHVyZVxuICovXG52YXIgTUFTS19UWVBFUztcbihmdW5jdGlvbiAoTUFTS19UWVBFUykge1xuICAgIE1BU0tfVFlQRVNbTUFTS19UWVBFU1tcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIE1BU0tfVFlQRVNbTUFTS19UWVBFU1tcIlNDSVNTT1JcIl0gPSAxXSA9IFwiU0NJU1NPUlwiO1xuICAgIE1BU0tfVFlQRVNbTUFTS19UWVBFU1tcIlNURU5DSUxcIl0gPSAyXSA9IFwiU1RFTkNJTFwiO1xuICAgIE1BU0tfVFlQRVNbTUFTS19UWVBFU1tcIlNQUklURVwiXSA9IDNdID0gXCJTUFJJVEVcIjtcbn0pKE1BU0tfVFlQRVMgfHwgKE1BU0tfVFlQRVMgPSB7fSkpO1xuXG5leHBvcnQgeyBBTFBIQV9NT0RFUywgQkxFTkRfTU9ERVMsIERSQVdfTU9ERVMsIEVOViwgRk9STUFUUywgR0NfTU9ERVMsIE1BU0tfVFlQRVMsIE1JUE1BUF9NT0RFUywgUFJFQ0lTSU9OLCBSRU5ERVJFUl9UWVBFLCBTQ0FMRV9NT0RFUywgVEFSR0VUUywgVFlQRVMsIFdSQVBfTU9ERVMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvdXRpbHMgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvdXRpbHMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gJ0BwaXhpL3NldHRpbmdzJztcbmV4cG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnQHBpeGkvc2V0dGluZ3MnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudGVtaXR0ZXIzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZWFyY3V0IH0gZnJvbSAnZWFyY3V0JztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAndXJsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXJsIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEJMRU5EX01PREVTIH0gZnJvbSAnQHBpeGkvY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaGUgcHJlZml4IHRoYXQgZGVub3RlcyBhIFVSTCBpcyBmb3IgYSByZXRpbmEgYXNzZXQuXG4gKlxuICogQHN0YXRpY1xuICogQG5hbWUgUkVUSU5BX1BSRUZJWFxuICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKiBAZGVmYXVsdCAvQChbMC05XFwuXSspeC9cbiAqIEBleGFtcGxlIGBAMnhgXG4gKi9cbnNldHRpbmdzLlJFVElOQV9QUkVGSVggPSAvQChbMC05XFwuXSspeC87XG4vKipcbiAqIFNob3VsZCB0aGUgYGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRgIGZsYWcgYmUgZW5hYmxlZCBhcyBhIGNvbnRleHQgb3B0aW9uIHVzZWQgaW4gdGhlIGBpc1dlYkdMU3VwcG9ydGVkYCBmdW5jdGlvbi5cbiAqIEZvciBtb3N0IHNjZW5hcmlvcyB0aGlzIHNob3VsZCBiZSBsZWZ0IGFzIHRydWUsIGFzIG90aGVyd2lzZSB0aGUgdXNlciBtYXkgaGF2ZSBhIHBvb3IgZXhwZXJpZW5jZS5cbiAqIEhvd2V2ZXIsIGl0IGNhbiBiZSB1c2VmdWwgdG8gZGlzYWJsZSB1bmRlciBjZXJ0YWluIHNjZW5hcmlvcywgc3VjaCBhcyBoZWFkbGVzcyB1bml0IHRlc3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIEZBSUxfSUZfTUFKT1JfUEVSRk9STUFOQ0VfQ0FWRUFUXG4gKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCB0cnVlXG4gKi9cbnNldHRpbmdzLkZBSUxfSUZfTUFKT1JfUEVSRk9STUFOQ0VfQ0FWRUFUID0gdHJ1ZTtcblxudmFyIHNhaWRIZWxsbyA9IGZhbHNlO1xudmFyIFZFUlNJT04gPSAnNS4yLjMnO1xuLyoqXG4gKiBTa2lwcyB0aGUgaGVsbG8gbWVzc2FnZSBvZiByZW5kZXJlcnMgdGhhdCBhcmUgY3JlYXRlZCBhZnRlciB0aGlzIGlzIHJ1bi5cbiAqXG4gKiBAZnVuY3Rpb24gc2tpcEhlbGxvXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICovXG5mdW5jdGlvbiBza2lwSGVsbG8oKSB7XG4gICAgc2FpZEhlbGxvID0gdHJ1ZTtcbn1cbi8qKlxuICogTG9ncyBvdXQgdGhlIHZlcnNpb24gYW5kIHJlbmRlcmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgUElYSS5cbiAqIElmIHlvdSBkb24ndCB3YW50IHRvIHNlZSB0aGlzIG1lc3NhZ2UgeW91IGNhbiBydW4gYFBJWEkudXRpbHMuc2tpcEhlbGxvKClgIGJlZm9yZVxuICogY3JlYXRpbmcgeW91ciByZW5kZXJlci4gS2VlcCBpbiBtaW5kIHRoYXQgZG9pbmcgdGhhdCB3aWxsIGZvcmV2ZXIgbWFrZSB5b3UgYSBqZXJrIGZhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQGZ1bmN0aW9uIHNheUhlbGxvXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgc3RyaW5nIHJlbmRlcmVyIHR5cGUgdG8gbG9nLlxuICovXG5mdW5jdGlvbiBzYXlIZWxsbyh0eXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChzYWlkSGVsbG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZScpID4gLTEpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXG4gICAgICAgICAgICBcIlxcbiAlYyAlYyAlYyBQaXhpSlMgXCIgKyBWRVJTSU9OICsgXCIgLSBcXHUyNzMwIFwiICsgdHlwZSArIFwiIFxcdTI3MzAgICVjICAlYyAgaHR0cDovL3d3dy5waXhpanMuY29tLyAgJWMgJWMgXFx1MjY2NSVjXFx1MjY2NSVjXFx1MjY2NSBcXG5cXG5cIixcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kOiAjZmY2NmE1OyBwYWRkaW5nOjVweCAwOycsXG4gICAgICAgICAgICAnYmFja2dyb3VuZDogI2ZmNjZhNTsgcGFkZGluZzo1cHggMDsnLFxuICAgICAgICAgICAgJ2NvbG9yOiAjZmY2NmE1OyBiYWNrZ3JvdW5kOiAjMDMwMzA3OyBwYWRkaW5nOjVweCAwOycsXG4gICAgICAgICAgICAnYmFja2dyb3VuZDogI2ZmNjZhNTsgcGFkZGluZzo1cHggMDsnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQ6ICNmZmMzZGM7IHBhZGRpbmc6NXB4IDA7JyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kOiAjZmY2NmE1OyBwYWRkaW5nOjVweCAwOycsXG4gICAgICAgICAgICAnY29sb3I6ICNmZjI0MjQ7IGJhY2tncm91bmQ6ICNmZmY7IHBhZGRpbmc6NXB4IDA7JyxcbiAgICAgICAgICAgICdjb2xvcjogI2ZmMjQyNDsgYmFja2dyb3VuZDogI2ZmZjsgcGFkZGluZzo1cHggMDsnLFxuICAgICAgICAgICAgJ2NvbG9yOiAjZmYyNDI0OyBiYWNrZ3JvdW5kOiAjZmZmOyBwYWRkaW5nOjVweCAwOycgXTtcbiAgICAgICAgKF9hID0gd2luZG93LmNvbnNvbGUpLmxvZy5hcHBseShfYSwgYXJncyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhcIlBpeGlKUyBcIiArIFZFUlNJT04gKyBcIiAtIFwiICsgdHlwZSArIFwiIC0gaHR0cDovL3d3dy5waXhpanMuY29tL1wiKTtcbiAgICB9XG4gICAgc2FpZEhlbGxvID0gdHJ1ZTtcbn1cblxudmFyIHN1cHBvcnRlZDtcbi8qKlxuICogSGVscGVyIGZvciBjaGVja2luZyBmb3IgV2ViR0wgc3VwcG9ydC5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IElzIFdlYkdMIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZCgpIHtcbiAgICBpZiAodHlwZW9mIHN1cHBvcnRlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc3VwcG9ydGVkID0gKGZ1bmN0aW9uIHN1cHBvcnRlZCgpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBzdGVuY2lsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IHNldHRpbmdzLkZBSUxfSUZfTUFKT1JfUEVSRk9STUFOQ0VfQ0FWRUFULFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIHZhciBnbCA9IChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBjb250ZXh0T3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRleHRPcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSAhIShnbCAmJiBnbC5nZXRDb250ZXh0QXR0cmlidXRlcygpLnN0ZW5jaWwpO1xuICAgICAgICAgICAgICAgIGlmIChnbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9zZUNvbnRleHQgPSBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9zZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvc2VDb250ZXh0Lmxvc2VDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBoZXhhZGVjaW1hbCBjb2xvciBudW1iZXIgdG8gYW4gW1IsIEcsIEJdIGFycmF5IG9mIG5vcm1hbGl6ZWQgZmxvYXRzIChudW1iZXJzIGZyb20gMC4wIHRvIDEuMCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBJWEkudXRpbHMuaGV4MnJnYigweGZmZmZmZik7IC8vIHJldHVybnMgWzEsIDEsIDFdXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGhleDJyZ2JcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZXggLSBUaGUgaGV4YWRlY2ltYWwgbnVtYmVyIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSAge251bWJlcltdfSBbb3V0PVtdXSBJZiBzdXBwbGllZCwgdGhpcyBhcnJheSB3aWxsIGJlIHVzZWQgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgbmV3IG9uZVxuICogQHJldHVybiB7bnVtYmVyW119IEFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgW1IsIEcsIEJdIG9mIHRoZSBjb2xvciB3aGVyZSBhbGwgdmFsdWVzIGFyZSBmbG9hdHMuXG4gKi9cbmZ1bmN0aW9uIGhleDJyZ2IoaGV4LCBvdXQpIHtcbiAgICBvdXQgPSBvdXQgfHwgW107XG4gICAgb3V0WzBdID0gKChoZXggPj4gMTYpICYgMHhGRikgLyAyNTU7XG4gICAgb3V0WzFdID0gKChoZXggPj4gOCkgJiAweEZGKSAvIDI1NTtcbiAgICBvdXRbMl0gPSAoaGV4ICYgMHhGRikgLyAyNTU7XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29udmVydHMgYSBoZXhhZGVjaW1hbCBjb2xvciBudW1iZXIgdG8gYSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBJWEkudXRpbHMuaGV4MnN0cmluZygweGZmZmZmZik7IC8vIHJldHVybnMgXCIjZmZmZmZmXCJcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gaGV4MnN0cmluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGhleCAtIE51bWJlciBpbiBoZXggKGUuZy4sIGAweGZmZmZmZmApXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgY29sb3IgKGUuZy4sIGBcIiNmZmZmZmZcImApLlxuICovXG5mdW5jdGlvbiBoZXgyc3RyaW5nKGhleCkge1xuICAgIHZhciBoZXhTdHJpbmcgPSBoZXgudG9TdHJpbmcoMTYpO1xuICAgIGhleFN0cmluZyA9ICcwMDAwMDAnLnN1YnN0cigwLCA2IC0gaGV4U3RyaW5nLmxlbmd0aCkgKyBoZXhTdHJpbmc7XG4gICAgcmV0dXJuIFwiI1wiICsgaGV4U3RyaW5nO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGhleGFkZWNpbWFsIHN0cmluZyB0byBhIGhleGFkZWNpbWFsIGNvbG9yIG51bWJlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogUElYSS51dGlscy5zdHJpbmcyaGV4KFwiI2ZmZmZmZlwiKTsgLy8gcmV0dXJucyAweGZmZmZmZlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBmdW5jdGlvbiBzdHJpbmcyaGV4XG4gKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyBjb2xvciAoZS5nLiwgYFwiI2ZmZmZmZlwiYClcbiAqIEByZXR1cm4ge251bWJlcn0gTnVtYmVyIGluIGhleGFkZWNpbWFsLlxuICovXG5mdW5jdGlvbiBzdHJpbmcyaGV4KHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBzdHJpbmdbMF0gPT09ICcjJykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyKDEpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VJbnQoc3RyaW5nLCAxNik7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgY29sb3IgYXMgYW4gW1IsIEcsIEJdIGFycmF5IG9mIG5vcm1hbGl6ZWQgZmxvYXRzIHRvIGEgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBQSVhJLnV0aWxzLnJnYjJoZXgoWzEsIDEsIDFdKTsgLy8gcmV0dXJucyAweGZmZmZmZlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBmdW5jdGlvbiByZ2IyaGV4XG4gKiBAcGFyYW0ge251bWJlcltdfSByZ2IgLSBBcnJheSBvZiBudW1iZXJzIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgZmxvYXRzIGZyb20gMC4wIHRvIDEuMC5cbiAqIEByZXR1cm4ge251bWJlcn0gTnVtYmVyIGluIGhleGFkZWNpbWFsLlxuICovXG5mdW5jdGlvbiByZ2IyaGV4KHJnYikge1xuICAgIHJldHVybiAoKChyZ2JbMF0gKiAyNTUpIDw8IDE2KSArICgocmdiWzFdICogMjU1KSA8PCA4KSArIChyZ2JbMl0gKiAyNTUgfCAwKSk7XG59XG5cbi8qKlxuICogQ29ycmVjdHMgUGl4aUpTIGJsZW5kLCB0YWtlcyBwcmVtdWx0aXBsaWVkIGFscGhhIGludG8gYWNjb3VudFxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gbWFwUHJlbXVsdGlwbGllZEJsZW5kTW9kZXNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtBcnJheTxudW1iZXJbXT59IE1hcHBlZCBtb2Rlcy5cbiAqL1xuZnVuY3Rpb24gbWFwUHJlbXVsdGlwbGllZEJsZW5kTW9kZXMoKSB7XG4gICAgdmFyIHBtID0gW107XG4gICAgdmFyIG5wbSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgICAgICBwbVtpXSA9IGk7XG4gICAgICAgIG5wbVtpXSA9IGk7XG4gICAgfVxuICAgIHBtW0JMRU5EX01PREVTLk5PUk1BTF9OUE1dID0gQkxFTkRfTU9ERVMuTk9STUFMO1xuICAgIHBtW0JMRU5EX01PREVTLkFERF9OUE1dID0gQkxFTkRfTU9ERVMuQUREO1xuICAgIHBtW0JMRU5EX01PREVTLlNDUkVFTl9OUE1dID0gQkxFTkRfTU9ERVMuU0NSRUVOO1xuICAgIG5wbVtCTEVORF9NT0RFUy5OT1JNQUxdID0gQkxFTkRfTU9ERVMuTk9STUFMX05QTTtcbiAgICBucG1bQkxFTkRfTU9ERVMuQUREXSA9IEJMRU5EX01PREVTLkFERF9OUE07XG4gICAgbnBtW0JMRU5EX01PREVTLlNDUkVFTl0gPSBCTEVORF9NT0RFUy5TQ1JFRU5fTlBNO1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGFycmF5LnB1c2gobnBtKTtcbiAgICBhcnJheS5wdXNoKHBtKTtcbiAgICByZXR1cm4gYXJyYXk7XG59XG4vKipcbiAqIG1hcHMgcHJlbXVsdGlwbHkgZmxhZyBhbmQgYmxlbmRNb2RlIHRvIGFkanVzdGVkIGJsZW5kTW9kZVxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBjb25zdCBwcmVtdWx0aXBseUJsZW5kTW9kZVxuICogQHR5cGUge0FycmF5PG51bWJlcltdPn1cbiAqL1xudmFyIHByZW11bHRpcGx5QmxlbmRNb2RlID0gbWFwUHJlbXVsdGlwbGllZEJsZW5kTW9kZXMoKTtcbi8qKlxuICogY2hhbmdlcyBibGVuZE1vZGUgYWNjb3JkaW5nIHRvIHRleHR1cmUgZm9ybWF0XG4gKlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBmdW5jdGlvbiBjb3JyZWN0QmxlbmRNb2RlXG4gKiBAcGFyYW0ge251bWJlcn0gYmxlbmRNb2RlIHN1cHBvc2VkIGJsZW5kIG1vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJlbXVsdGlwbGllZCAgd2hldGhlciBzb3VyY2UgaXMgcHJlbXVsdGlwbGllZFxuICogQHJldHVybnMge251bWJlcn0gdHJ1ZSBibGVuZCBtb2RlIGZvciB0aGlzIHRleHR1cmVcbiAqL1xuZnVuY3Rpb24gY29ycmVjdEJsZW5kTW9kZShibGVuZE1vZGUsIHByZW11bHRpcGxpZWQpIHtcbiAgICByZXR1cm4gcHJlbXVsdGlwbHlCbGVuZE1vZGVbcHJlbXVsdGlwbGllZCA/IDEgOiAwXVtibGVuZE1vZGVdO1xufVxuLyoqXG4gKiBjb21iaW5lcyByZ2IgYW5kIGFscGhhIHRvIG91dCBhcnJheVxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gcHJlbXVsdGlwbHlSZ2JhXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheXxudW1iZXJbXX0gcmdiIGlucHV0IHJnYlxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIGFscGhhIHBhcmFtXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gW291dF0gb3V0cHV0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVtdWx0aXBseT10cnVlXSBkbyBwcmVtdWx0aXBseSBpdFxuICogQHJldHVybnMge0Zsb2F0MzJBcnJheX0gdmVjNCByZ2JhXG4gKi9cbmZ1bmN0aW9uIHByZW11bHRpcGx5UmdiYShyZ2IsIGFscGhhLCBvdXQsIHByZW11bHRpcGx5KSB7XG4gICAgb3V0ID0gb3V0IHx8IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgaWYgKHByZW11bHRpcGx5IHx8IHByZW11bHRpcGx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3V0WzBdID0gcmdiWzBdICogYWxwaGE7XG4gICAgICAgIG91dFsxXSA9IHJnYlsxXSAqIGFscGhhO1xuICAgICAgICBvdXRbMl0gPSByZ2JbMl0gKiBhbHBoYTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG91dFswXSA9IHJnYlswXTtcbiAgICAgICAgb3V0WzFdID0gcmdiWzFdO1xuICAgICAgICBvdXRbMl0gPSByZ2JbMl07XG4gICAgfVxuICAgIG91dFszXSA9IGFscGhhO1xuICAgIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIHByZW11bHRpcGxpZXMgdGludFxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gcHJlbXVsdGlwbHlUaW50XG4gKiBAcGFyYW0ge251bWJlcn0gdGludCBpbnRlZ2VyIFJHQlxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIGZsb2F0aW5nIHBvaW50IGFscGhhICgwLjAtMS4wKVxuICogQHJldHVybnMge251bWJlcn0gdGludCBtdWx0aXBsaWVkIGJ5IGFscGhhXG4gKi9cbmZ1bmN0aW9uIHByZW11bHRpcGx5VGludCh0aW50LCBhbHBoYSkge1xuICAgIGlmIChhbHBoYSA9PT0gMS4wKSB7XG4gICAgICAgIHJldHVybiAoYWxwaGEgKiAyNTUgPDwgMjQpICsgdGludDtcbiAgICB9XG4gICAgaWYgKGFscGhhID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZhciBSID0gKCh0aW50ID4+IDE2KSAmIDB4RkYpO1xuICAgIHZhciBHID0gKCh0aW50ID4+IDgpICYgMHhGRik7XG4gICAgdmFyIEIgPSAodGludCAmIDB4RkYpO1xuICAgIFIgPSAoKFIgKiBhbHBoYSkgKyAwLjUpIHwgMDtcbiAgICBHID0gKChHICogYWxwaGEpICsgMC41KSB8IDA7XG4gICAgQiA9ICgoQiAqIGFscGhhKSArIDAuNSkgfCAwO1xuICAgIHJldHVybiAoYWxwaGEgKiAyNTUgPDwgMjQpICsgKFIgPDwgMTYpICsgKEcgPDwgOCkgKyBCO1xufVxuLyoqXG4gKiBjb252ZXJ0cyBpbnRlZ2VyIHRpbnQgYW5kIGZsb2F0IGFscGhhIHRvIHZlYzQgZm9ybSwgcHJlbXVsdGlwbGllcyBieSBkZWZhdWx0XG4gKlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBmdW5jdGlvbiBwcmVtdWx0aXBseVRpbnRUb1JnYmFcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW50IGlucHV0IHRpbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSBhbHBoYSBwYXJhbVxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXl9IFtvdXRdIG91dHB1dFxuICogQHBhcmFtIHtib29sZWFufSBbcHJlbXVsdGlwbHk9dHJ1ZV0gZG8gcHJlbXVsdGlwbHkgaXRcbiAqIEByZXR1cm5zIHtGbG9hdDMyQXJyYXl9IHZlYzQgcmdiYVxuICovXG5mdW5jdGlvbiBwcmVtdWx0aXBseVRpbnRUb1JnYmEodGludCwgYWxwaGEsIG91dCwgcHJlbXVsdGlwbHkpIHtcbiAgICBvdXQgPSBvdXQgfHwgbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICBvdXRbMF0gPSAoKHRpbnQgPj4gMTYpICYgMHhGRikgLyAyNTUuMDtcbiAgICBvdXRbMV0gPSAoKHRpbnQgPj4gOCkgJiAweEZGKSAvIDI1NS4wO1xuICAgIG91dFsyXSA9ICh0aW50ICYgMHhGRikgLyAyNTUuMDtcbiAgICBpZiAocHJlbXVsdGlwbHkgfHwgcHJlbXVsdGlwbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvdXRbMF0gKj0gYWxwaGE7XG4gICAgICAgIG91dFsxXSAqPSBhbHBoYTtcbiAgICAgICAgb3V0WzJdICo9IGFscGhhO1xuICAgIH1cbiAgICBvdXRbM10gPSBhbHBoYTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEdlbmVyaWMgTWFzayBTdGFjayBkYXRhIHN0cnVjdHVyZVxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gY3JlYXRlSW5kaWNlc0ZvclF1YWRzXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIE51bWJlciBvZiBxdWFkc1xuICogQHBhcmFtIHtVaW50MTZBcnJheXxVaW50MzJBcnJheX0gW291dEJ1ZmZlcl0gLSBCdWZmZXIgZm9yIG91dHB1dCwgbGVuZ3RoIGhhcyB0byBiZSBgNiAqIHNpemVgXG4gKiBAcmV0dXJuIHtVaW50MTZBcnJheXxVaW50MzJBcnJheX0gLSBSZXN1bHRpbmcgaW5kZXggYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluZGljZXNGb3JRdWFkcyhzaXplLCBvdXRCdWZmZXIpIHtcbiAgICBpZiAob3V0QnVmZmVyID09PSB2b2lkIDApIHsgb3V0QnVmZmVyID0gbnVsbDsgfVxuICAgIC8vIHRoZSB0b3RhbCBudW1iZXIgb2YgaW5kaWNlcyBpbiBvdXIgYXJyYXksIHRoZXJlIGFyZSA2IHBvaW50cyBwZXIgcXVhZC5cbiAgICB2YXIgdG90YWxJbmRpY2VzID0gc2l6ZSAqIDY7XG4gICAgb3V0QnVmZmVyID0gb3V0QnVmZmVyIHx8IG5ldyBVaW50MTZBcnJheSh0b3RhbEluZGljZXMpO1xuICAgIGlmIChvdXRCdWZmZXIubGVuZ3RoICE9PSB0b3RhbEluZGljZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3V0IGJ1ZmZlciBsZW5ndGggaXMgaW5jb3JyZWN0LCBnb3QgXCIgKyBvdXRCdWZmZXIubGVuZ3RoICsgXCIgYW5kIGV4cGVjdGVkIFwiICsgdG90YWxJbmRpY2VzKTtcbiAgICB9XG4gICAgLy8gZmlsbCB0aGUgaW5kaWNlcyB3aXRoIHRoZSBxdWFkcyB0byBkcmF3XG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdG90YWxJbmRpY2VzOyBpICs9IDYsIGogKz0gNCkge1xuICAgICAgICBvdXRCdWZmZXJbaSArIDBdID0gaiArIDA7XG4gICAgICAgIG91dEJ1ZmZlcltpICsgMV0gPSBqICsgMTtcbiAgICAgICAgb3V0QnVmZmVyW2kgKyAyXSA9IGogKyAyO1xuICAgICAgICBvdXRCdWZmZXJbaSArIDNdID0gaiArIDA7XG4gICAgICAgIG91dEJ1ZmZlcltpICsgNF0gPSBqICsgMjtcbiAgICAgICAgb3V0QnVmZmVyW2kgKyA1XSA9IGogKyAzO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmZmVyO1xufVxuXG5mdW5jdGlvbiBnZXRCdWZmZXJUeXBlKGFycmF5KSB7XG4gICAgaWYgKGFycmF5LkJZVEVTX1BFUl9FTEVNRU5UID09PSA0KSB7XG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuICdGbG9hdDMyQXJyYXknO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybiAnVWludDMyQXJyYXknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnSW50MzJBcnJheSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFycmF5LkJZVEVTX1BFUl9FTEVNRU5UID09PSAyKSB7XG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gJ1VpbnQxNkFycmF5JztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhcnJheS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gMSkge1xuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gJ1VpbnQ4QXJyYXknO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE8gbWFwIG91dCB0aGUgcmVzdCBvZiB0aGUgYXJyYXkgZWxlbWVudHMhXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG9iamVjdC1zaG9ydGhhbmQgKi9cbnZhciBtYXAgPSB7IEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LCBVaW50MzJBcnJheTogVWludDMyQXJyYXksIEludDMyQXJyYXk6IEludDMyQXJyYXksIFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkgfTtcbmZ1bmN0aW9uIGludGVybGVhdmVUeXBlZEFycmF5cyhhcnJheXMsIHNpemVzKSB7XG4gICAgdmFyIG91dFNpemUgPSAwO1xuICAgIHZhciBzdHJpZGUgPSAwO1xuICAgIHZhciB2aWV3cyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0cmlkZSArPSBzaXplc1tpXTtcbiAgICAgICAgb3V0U2l6ZSArPSBhcnJheXNbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG91dFNpemUgKiA0KTtcbiAgICB2YXIgb3V0ID0gbnVsbDtcbiAgICB2YXIgbGl0dGxlT2Zmc2V0ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2l6ZSA9IHNpemVzW2ldO1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaV07XG4gICAgICAgIC8qXG4gICAgICAgIEB0b2RvIFRoaXMgaXMgdW5zYWZlIGNhc3RpbmcgYnV0IGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIGNvZGUgd29ya2VkIHByZXZpb3VzbHkuIFNob3VsZCBpdCBzdGF5IHRoaXMgd2F5XG4gICAgICAgICAgICAgIG9yIHNob3VsZCBhbmQgYGdldEJ1ZmZlclR5cGVVbnNhZmVgIGZ1bmN0aW9uIGJlIGV4cG9zZWQgdGhhdCB0aHJvd3MgYW4gRXJyb3IgaWYgdW5zdXBwb3J0ZWQgdHlwZSBpcyBwYXNzZWQ/XG4gICAgICAgICAqL1xuICAgICAgICB2YXIgdHlwZSA9IGdldEJ1ZmZlclR5cGUoYXJyYXkpO1xuICAgICAgICBpZiAoIXZpZXdzW3R5cGVdKSB7XG4gICAgICAgICAgICB2aWV3c1t0eXBlXSA9IG5ldyBtYXBbdHlwZV0oYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBvdXQgPSB2aWV3c1t0eXBlXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGluZGV4U3RhcnQgPSAoKGogLyBzaXplIHwgMCkgKiBzdHJpZGUpICsgbGl0dGxlT2Zmc2V0O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaiAlIHNpemU7XG4gICAgICAgICAgICBvdXRbaW5kZXhTdGFydCArIGluZGV4XSA9IGFycmF5W2pdO1xuICAgICAgICB9XG4gICAgICAgIGxpdHRsZU9mZnNldCArPSBzaXplO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xufVxuXG4vLyBUYWtlbiBmcm9tIHRoZSBiaXQtdHdpZGRsZSBwYWNrYWdlXG4vKipcbiAqIFJvdW5kcyB0byBuZXh0IHBvd2VyIG9mIHR3by5cbiAqXG4gKiBAZnVuY3Rpb24gbmV4dFBvdzJcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAcGFyYW0ge251bWJlcn0gdiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBuZXh0UG93Mih2KSB7XG4gICAgdiArPSB2ID09PSAwID8gMSA6IDA7XG4gICAgLS12O1xuICAgIHYgfD0gdiA+Pj4gMTtcbiAgICB2IHw9IHYgPj4+IDI7XG4gICAgdiB8PSB2ID4+PiA0O1xuICAgIHYgfD0gdiA+Pj4gODtcbiAgICB2IHw9IHYgPj4+IDE2O1xuICAgIHJldHVybiB2ICsgMTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvLlxuICpcbiAqIEBmdW5jdGlvbiBpc1BvdzJcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAcGFyYW0ge251bWJlcn0gdiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHZhbHVlIGlzIHBvd2VyIG9mIHR3b1xuICovXG5mdW5jdGlvbiBpc1BvdzIodikge1xuICAgIHJldHVybiAhKHYgJiAodiAtIDEpKSAmJiAoISF2KTtcbn1cbi8qKlxuICogQ29tcHV0ZXMgY2VpbCBvZiBsb2cgYmFzZSAyXG4gKlxuICogQGZ1bmN0aW9uIGxvZzJcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAcGFyYW0ge251bWJlcn0gdiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7bnVtYmVyfSBsb2dhcml0aG0gYmFzZSAyXG4gKi9cbmZ1bmN0aW9uIGxvZzIodikge1xuICAgIHZhciByID0gKHYgPiAweEZGRkYgPyAxIDogMCkgPDwgNDtcbiAgICB2ID4+Pj0gcjtcbiAgICB2YXIgc2hpZnQgPSAodiA+IDB4RkYgPyAxIDogMCkgPDwgMztcbiAgICB2ID4+Pj0gc2hpZnQ7XG4gICAgciB8PSBzaGlmdDtcbiAgICBzaGlmdCA9ICh2ID4gMHhGID8gMSA6IDApIDw8IDI7XG4gICAgdiA+Pj49IHNoaWZ0O1xuICAgIHIgfD0gc2hpZnQ7XG4gICAgc2hpZnQgPSAodiA+IDB4MyA/IDEgOiAwKSA8PCAxO1xuICAgIHYgPj4+PSBzaGlmdDtcbiAgICByIHw9IHNoaWZ0O1xuICAgIHJldHVybiByIHwgKHYgPj4gMSk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGl0ZW1zIGZyb20gYSBqYXZhc2NyaXB0IGFycmF5IHdpdGhvdXQgZ2VuZXJhdGluZyBnYXJiYWdlXG4gKlxuICogQGZ1bmN0aW9uIHJlbW92ZUl0ZW1zXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgQXJyYXkgdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydElkeCBzdGFydGluZyBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IHJlbW92ZUNvdW50IGhvdyBtYW55IHRvIHJlbW92ZVxuICovXG5mdW5jdGlvbiByZW1vdmVJdGVtcyhhcnIsIHN0YXJ0SWR4LCByZW1vdmVDb3VudCkge1xuICAgIHZhciBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIGlmIChzdGFydElkeCA+PSBsZW5ndGggfHwgcmVtb3ZlQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZW1vdmVDb3VudCA9IChzdGFydElkeCArIHJlbW92ZUNvdW50ID4gbGVuZ3RoID8gbGVuZ3RoIC0gc3RhcnRJZHggOiByZW1vdmVDb3VudCk7XG4gICAgdmFyIGxlbiA9IGxlbmd0aCAtIHJlbW92ZUNvdW50O1xuICAgIGZvciAoaSA9IHN0YXJ0SWR4OyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW2kgKyByZW1vdmVDb3VudF07XG4gICAgfVxuICAgIGFyci5sZW5ndGggPSBsZW47XG59XG5cbi8qKlxuICogUmV0dXJucyBzaWduIG9mIG51bWJlclxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAZnVuY3Rpb24gc2lnblxuICogQHBhcmFtIHtudW1iZXJ9IG4gLSB0aGUgbnVtYmVyIHRvIGNoZWNrIHRoZSBzaWduIG9mXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIGBuYCBpcyAwLCAtMSBpZiBgbmAgaXMgbmVnYXRpdmUsIDEgaWYgYG5gIGlzIHBvc2l0aXZlXG4gKi9cbmZ1bmN0aW9uIHNpZ24obikge1xuICAgIGlmIChuID09PSAwKVxuICAgICAgICB7IHJldHVybiAwOyB9XG4gICAgcmV0dXJuIG4gPCAwID8gLTEgOiAxO1xufVxuXG52YXIgbmV4dFVpZCA9IDA7XG4vKipcbiAqIEdldHMgdGhlIG5leHQgdW5pcXVlIGlkZW50aWZpZXJcbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIHVpZFxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbmV4dCB1bmlxdWUgaWRlbnRpZmllciB0byB1c2UuXG4gKi9cbmZ1bmN0aW9uIHVpZCgpIHtcbiAgICByZXR1cm4gKytuZXh0VWlkO1xufVxuXG4vLyBBIG1hcCBvZiB3YXJuaW5nIG1lc3NhZ2VzIGFscmVhZHkgZmlyZWRcbnZhciB3YXJuaW5ncyA9IHt9O1xuLyoqXG4gKiBIZWxwZXIgZm9yIHdhcm5pbmcgZGV2ZWxvcGVycyBhYm91dCBkZXByZWNhdGVkIGZlYXR1cmVzICYgc2V0dGluZ3MuXG4gKiBBIHN0YWNrIHRyYWNrIGZvciB3YXJuaW5ncyBpcyBnaXZlbjsgdXNlZnVsIGZvciB0cmFja2luZy1kb3duIHdoZXJlXG4gKiBkZXByZWNhdGVkIG1ldGhvZHMvcHJvcGVydGllcy9jbGFzc2VzIGFyZSBiZWluZyB1c2VkIHdpdGhpbiB0aGUgY29kZS5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGRlcHJlY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdoZXJlIHRoZSBmZWF0dXJlIGJlY2FtZSBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIE1lc3NhZ2Ugc2hvdWxkIGluY2x1ZGUgd2hhdCBpcyBkZXByZWNhdGVkLCB3aGVyZSwgYW5kIHRoZSBuZXcgc29sdXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaWdub3JlRGVwdGg9M10gLSBUaGUgbnVtYmVyIG9mIHN0ZXBzIHRvIGlnbm9yZSBhdCB0aGUgdG9wIG9mIHRoZSBlcnJvciBzdGFja1xuICogICAgICAgIHRoaXMgaXMgbW9zdGx5IHRvIGlnbm9yZSBpbnRlcm5hbCBkZXByZWNhdGlvbiBjYWxscy5cbiAqL1xuZnVuY3Rpb24gZGVwcmVjYXRpb24odmVyc2lvbiwgbWVzc2FnZSwgaWdub3JlRGVwdGgpIHtcbiAgICBpZiAoaWdub3JlRGVwdGggPT09IHZvaWQgMCkgeyBpZ25vcmVEZXB0aCA9IDM7IH1cbiAgICAvLyBJZ25vcmUgZHVwbGljYXRcbiAgICBpZiAod2FybmluZ3NbbWVzc2FnZV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgdmFyIHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgLy8gSGFuZGxlIElFIDwgMTAgYW5kIFNhZmFyaSA8IDZcbiAgICBpZiAodHlwZW9mIHN0YWNrID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1BpeGlKUyBEZXByZWNhdGlvbiBXYXJuaW5nOiAnLCBtZXNzYWdlICsgXCJcXG5EZXByZWNhdGVkIHNpbmNlIHZcIiArIHZlcnNpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY2hvcCBvZmYgdGhlIHN0YWNrIHRyYWNlIHdoaWNoIGluY2x1ZGVzIFBpeGlKUyBpbnRlcm5hbCBjYWxsc1xuICAgICAgICBzdGFjayA9IHN0YWNrLnNwbGl0KCdcXG4nKS5zcGxpY2UoaWdub3JlRGVwdGgpLmpvaW4oJ1xcbicpO1xuICAgICAgICBpZiAoY29uc29sZS5ncm91cENvbGxhcHNlZCkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZCgnJWNQaXhpSlMgRGVwcmVjYXRpb24gV2FybmluZzogJWMlcycsICdjb2xvcjojNjE0MTA4O2JhY2tncm91bmQ6I2ZmZmJlNicsICdmb250LXdlaWdodDpub3JtYWw7Y29sb3I6IzYxNDEwODtiYWNrZ3JvdW5kOiNmZmZiZTYnLCBtZXNzYWdlICsgXCJcXG5EZXByZWNhdGVkIHNpbmNlIHZcIiArIHZlcnNpb24pO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHN0YWNrKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGl4aUpTIERlcHJlY2F0aW9uIFdhcm5pbmc6ICcsIG1lc3NhZ2UgKyBcIlxcbkRlcHJlY2F0ZWQgc2luY2UgdlwiICsgdmVyc2lvbik7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oc3RhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgIHdhcm5pbmdzW21lc3NhZ2VdID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdG9kbyBEZXNjcmliZSBwcm9wZXJ0eSB1c2FnZVxuICpcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFByb2dyYW1DYWNoZVxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBQcm9ncmFtQ2FjaGUgPSB7fTtcbi8qKlxuICogQHRvZG8gRGVzY3JpYmUgcHJvcGVydHkgdXNhZ2VcbiAqXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBUZXh0dXJlQ2FjaGVcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG52YXIgVGV4dHVyZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuICogQHRvZG8gRGVzY3JpYmUgcHJvcGVydHkgdXNhZ2VcbiAqXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBCYXNlVGV4dHVyZUNhY2hlXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIEJhc2VUZXh0dXJlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG4gKiBEZXN0cm95cyBhbGwgdGV4dHVyZSBpbiB0aGUgY2FjaGVcbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGRlc3Ryb3lUZXh0dXJlQ2FjaGVcbiAqL1xuZnVuY3Rpb24gZGVzdHJveVRleHR1cmVDYWNoZSgpIHtcbiAgICB2YXIga2V5O1xuICAgIGZvciAoa2V5IGluIFRleHR1cmVDYWNoZSkge1xuICAgICAgICBUZXh0dXJlQ2FjaGVba2V5XS5kZXN0cm95KCk7XG4gICAgfVxuICAgIGZvciAoa2V5IGluIEJhc2VUZXh0dXJlQ2FjaGUpIHtcbiAgICAgICAgQmFzZVRleHR1cmVDYWNoZVtrZXldLmRlc3Ryb3koKTtcbiAgICB9XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIHRleHR1cmVzIGZyb20gY2FjaGUsIGJ1dCBkb2VzIG5vdCBkZXN0cm95IHRoZW1cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGNsZWFyVGV4dHVyZUNhY2hlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyVGV4dHVyZUNhY2hlKCkge1xuICAgIHZhciBrZXk7XG4gICAgZm9yIChrZXkgaW4gVGV4dHVyZUNhY2hlKSB7XG4gICAgICAgIGRlbGV0ZSBUZXh0dXJlQ2FjaGVba2V5XTtcbiAgICB9XG4gICAgZm9yIChrZXkgaW4gQmFzZVRleHR1cmVDYWNoZSkge1xuICAgICAgICBkZWxldGUgQmFzZVRleHR1cmVDYWNoZVtrZXldO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgQ2FudmFzIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNpemUgdG8gYmUgdXNlZCBhcyBhIHRhcmdldCBmb3IgcmVuZGVyaW5nIHRvLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqL1xudmFyIENhbnZhc1JlbmRlclRhcmdldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggZm9yIHRoZSBuZXdseSBjcmVhdGVkIGNhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSB0aGUgaGVpZ2h0IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBjYW52YXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb249MV0gLSBUaGUgcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiB0aGUgY2FudmFzXG4gICAgICovXG4gICAgZnVuY3Rpb24gQ2FudmFzUmVuZGVyVGFyZ2V0KHdpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBDYW52YXMgb2JqZWN0IHRoYXQgYmVsb25ncyB0byB0aGlzIENhbnZhc1JlbmRlclRhcmdldC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7SFRNTENhbnZhc0VsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgb2JqZWN0IHJlcHJlc2VudGluZyBhIHR3by1kaW1lbnNpb25hbCByZW5kZXJpbmcgY29udGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbiB8fCBzZXR0aW5ncy5SRVNPTFVUSU9OO1xuICAgICAgICB0aGlzLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBjYW52YXMgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgQ2FudmFzUmVuZGVyVGFyZ2V0IGNsYXNzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBDYW52YXNSZW5kZXJUYXJnZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgY2FudmFzIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIHRoZSBuZXcgd2lkdGggb2YgdGhlIGNhbnZhc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSB0aGUgbmV3IGhlaWdodCBvZiB0aGUgY2FudmFzXG4gICAgICovXG4gICAgQ2FudmFzUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoICogdGhpcy5yZXNvbHV0aW9uO1xuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiB0aGlzLnJlc29sdXRpb247XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGlzIGNhbnZhcy5cbiAgICAgKlxuICAgICAqL1xuICAgIENhbnZhc1JlbmRlclRhcmdldC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENhbnZhc1JlbmRlclRhcmdldC5wcm90b3R5cGUsIFwid2lkdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBjYW52YXMgYnVmZmVyIGluIHBpeGVscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB2YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYW52YXNSZW5kZXJUYXJnZXQucHJvdG90eXBlLCBcImhlaWdodFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjYW52YXMgYnVmZmVyIGluIHBpeGVscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIENhbnZhc1JlbmRlclRhcmdldDtcbn0oKSk7XG5cbi8qKlxuICogVHJpbSB0cmFuc3BhcmVudCBib3JkZXJzIGZyb20gYSBjYW52YXNcbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIHRyaW1DYW52YXNcbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyAtIHRoZSBjYW52YXMgdG8gdHJpbVxuICogQHJldHVybnMge29iamVjdH0gVHJpbSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHRyaW1DYW52YXMoY2FudmFzKSB7XG4gICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcmVteS83ODQ1MDhcbiAgICB2YXIgd2lkdGggPSBjYW52YXMud2lkdGg7XG4gICAgdmFyIGhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIHBpeGVscyA9IGltYWdlRGF0YS5kYXRhO1xuICAgIHZhciBsZW4gPSBwaXhlbHMubGVuZ3RoO1xuICAgIHZhciBib3VuZCA9IHtcbiAgICAgICAgdG9wOiBudWxsLFxuICAgICAgICBsZWZ0OiBudWxsLFxuICAgICAgICByaWdodDogbnVsbCxcbiAgICAgICAgYm90dG9tOiBudWxsLFxuICAgIH07XG4gICAgdmFyIGRhdGEgPSBudWxsO1xuICAgIHZhciBpO1xuICAgIHZhciB4O1xuICAgIHZhciB5O1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBpZiAocGl4ZWxzW2kgKyAzXSAhPT0gMCkge1xuICAgICAgICAgICAgeCA9IChpIC8gNCkgJSB3aWR0aDtcbiAgICAgICAgICAgIHkgPSB+figoaSAvIDQpIC8gd2lkdGgpO1xuICAgICAgICAgICAgaWYgKGJvdW5kLnRvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJvdW5kLnRvcCA9IHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYm91bmQubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJvdW5kLmxlZnQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeCA8IGJvdW5kLmxlZnQpIHtcbiAgICAgICAgICAgICAgICBib3VuZC5sZWZ0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChib3VuZC5yaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJvdW5kLnJpZ2h0ID0geCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChib3VuZC5yaWdodCA8IHgpIHtcbiAgICAgICAgICAgICAgICBib3VuZC5yaWdodCA9IHggKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJvdW5kLmJvdHRvbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJvdW5kLmJvdHRvbSA9IHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChib3VuZC5ib3R0b20gPCB5KSB7XG4gICAgICAgICAgICAgICAgYm91bmQuYm90dG9tID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm91bmQudG9wICE9PSBudWxsKSB7XG4gICAgICAgIHdpZHRoID0gYm91bmQucmlnaHQgLSBib3VuZC5sZWZ0O1xuICAgICAgICBoZWlnaHQgPSBib3VuZC5ib3R0b20gLSBib3VuZC50b3AgKyAxO1xuICAgICAgICBkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoYm91bmQubGVmdCwgYm91bmQudG9wLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xufVxuXG4vKipcbiAqIFJlZ2V4cCBmb3IgZGF0YSBVUkkuXG4gKiBCYXNlZCBvbjoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYWdpbmd3aW5kL2RhdGEtdXJpLXJlZ2V4fVxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudCB7UmVnRXhwfHN0cmluZ30gREFUQV9VUklcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXhhbXBsZSBkYXRhOmltYWdlL3BuZztiYXNlNjRcbiAqL1xudmFyIERBVEFfVVJJID0gL15cXHMqZGF0YTooPzooW1xcdy1dKylcXC8oW1xcdysuLV0rKSk/KD86O2NoYXJzZXQ9KFtcXHctXSspKT8oPzo7KGJhc2U2NCkpPywoLiopL2k7XG5cbi8qKlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBpbnRlcmZhY2UgRGVjb21wb3NlZERhdGFVcmlcbiAqL1xuLyoqXG4gKiB0eXBlLCBlZy4gYGltYWdlYFxuICogQG1lbWJlcm9mIFBJWEkudXRpbHMuRGVjb21wb3NlZERhdGFVcmkjXG4gKiBAbWVtYmVyIHtzdHJpbmd9IG1lZGlhVHlwZVxuICovXG4vKipcbiAqIFN1YiB0eXBlLCBlZy4gYHBuZ2BcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzLkRlY29tcG9zZWREYXRhVXJpI1xuICogQG1lbWJlciB7c3RyaW5nfSBzdWJUeXBlXG4gKi9cbi8qKlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHMuRGVjb21wb3NlZERhdGFVcmkjXG4gKiBAbWVtYmVyIHtzdHJpbmd9IGNoYXJzZXRcbiAqL1xuLyoqXG4gKiBEYXRhIGVuY29kaW5nLCBlZy4gYGJhc2U2NGBcbiAqIEBtZW1iZXJvZiBQSVhJLnV0aWxzLkRlY29tcG9zZWREYXRhVXJpI1xuICogQG1lbWJlciB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG4vKipcbiAqIFRoZSBhY3R1YWwgZGF0YVxuICogQG1lbWJlcm9mIFBJWEkudXRpbHMuRGVjb21wb3NlZERhdGFVcmkjXG4gKiBAbWVtYmVyIHtzdHJpbmd9IGRhdGFcbiAqL1xuLyoqXG4gKiBTcGxpdCBhIGRhdGEgVVJJIGludG8gY29tcG9uZW50cy4gUmV0dXJucyB1bmRlZmluZWQgaWZcbiAqIHBhcmFtZXRlciBgZGF0YVVyaWAgaXMgbm90IGEgdmFsaWQgZGF0YSBVUkkuXG4gKlxuICogQG1lbWJlcm9mIFBJWEkudXRpbHNcbiAqIEBmdW5jdGlvbiBkZWNvbXBvc2VEYXRhVXJpXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YVVyaSAtIHRoZSBkYXRhIFVSSSB0byBjaGVja1xuICogQHJldHVybiB7UElYSS51dGlscy5EZWNvbXBvc2VkRGF0YVVyaXx1bmRlZmluZWR9IFRoZSBkZWNvbXBvc2VkIGRhdGEgdXJpIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBkZWNvbXBvc2VEYXRhVXJpKGRhdGFVcmkpIHtcbiAgICB2YXIgZGF0YVVyaU1hdGNoID0gREFUQV9VUkkuZXhlYyhkYXRhVXJpKTtcbiAgICBpZiAoZGF0YVVyaU1hdGNoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZWRpYVR5cGU6IGRhdGFVcmlNYXRjaFsxXSA/IGRhdGFVcmlNYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3ViVHlwZTogZGF0YVVyaU1hdGNoWzJdID8gZGF0YVVyaU1hdGNoWzJdLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjaGFyc2V0OiBkYXRhVXJpTWF0Y2hbM10gPyBkYXRhVXJpTWF0Y2hbM10udG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVuY29kaW5nOiBkYXRhVXJpTWF0Y2hbNF0gPyBkYXRhVXJpTWF0Y2hbNF0udG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFVcmlNYXRjaFs1XSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxudmFyIHRlbXBBbmNob3I7XG4vKipcbiAqIFNldHMgdGhlIGBjcm9zc09yaWdpbmAgcHJvcGVydHkgZm9yIHRoaXMgcmVzb3VyY2UgYmFzZWQgb24gaWYgdGhlIHVybFxuICogZm9yIHRoaXMgcmVzb3VyY2UgaXMgY3Jvc3Mtb3JpZ2luLiBJZiBjcm9zc09yaWdpbiB3YXMgbWFudWFsbHkgc2V0LCB0aGlzXG4gKiBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuXG4gKiBOaXBwZWQgZnJvbSB0aGUgcmVzb3VyY2UgbG9hZGVyIVxuICpcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIHRvIHRlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gW2xvYz13aW5kb3cubG9jYXRpb25dIC0gVGhlIGxvY2F0aW9uIG9iamVjdCB0byB0ZXN0IGFnYWluc3QuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjcm9zc09yaWdpbiB2YWx1ZSB0byB1c2UgKG9yIGVtcHR5IHN0cmluZyBmb3Igbm9uZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZUNyb3NzT3JpZ2luKHVybCwgbG9jKSB7XG4gICAgaWYgKGxvYyA9PT0gdm9pZCAwKSB7IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsgfVxuICAgIC8vIGRhdGE6IGFuZCBqYXZhc2NyaXB0OiB1cmxzIGFyZSBjb25zaWRlcmVkIHNhbWUtb3JpZ2luXG4gICAgaWYgKHVybC5pbmRleE9mKCdkYXRhOicpID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gZGVmYXVsdCBpcyB3aW5kb3cubG9jYXRpb25cbiAgICBsb2MgPSBsb2MgfHwgd2luZG93LmxvY2F0aW9uO1xuICAgIGlmICghdGVtcEFuY2hvcikge1xuICAgICAgICB0ZW1wQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIH1cbiAgICAvLyBsZXQgdGhlIGJyb3dzZXIgZGV0ZXJtaW5lIHRoZSBmdWxsIGhyZWYgZm9yIHRoZSB1cmwgb2YgdGhpcyByZXNvdXJjZSBhbmQgdGhlblxuICAgIC8vIHBhcnNlIHdpdGggdGhlIG5vZGUgdXJsIGxpYiwgd2UgY2FuJ3QgdXNlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhbmNob3IgZWxlbWVudFxuICAgIC8vIGJlY2F1c2UgdGhleSBkb24ndCB3b3JrIGluIElFOSA6KFxuICAgIHRlbXBBbmNob3IuaHJlZiA9IHVybDtcbiAgICB2YXIgcGFyc2VkVXJsID0gcGFyc2UodGVtcEFuY2hvci5ocmVmKTtcbiAgICB2YXIgc2FtZVBvcnQgPSAoIXBhcnNlZFVybC5wb3J0ICYmIGxvYy5wb3J0ID09PSAnJykgfHwgKHBhcnNlZFVybC5wb3J0ID09PSBsb2MucG9ydCk7XG4gICAgLy8gaWYgY3Jvc3Mgb3JpZ2luXG4gICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZSAhPT0gbG9jLmhvc3RuYW1lIHx8ICFzYW1lUG9ydCB8fCBwYXJzZWRVcmwucHJvdG9jb2wgIT09IGxvYy5wcm90b2NvbCkge1xuICAgICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBnZXQgdGhlIHJlc29sdXRpb24gLyBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgYW4gYXNzZXQgYnkgbG9va2luZyBmb3IgdGhlIHByZWZpeFxuICogdXNlZCBieSBzcHJpdGVzaGVldHMgYW5kIGltYWdlIHVybHNcbiAqXG4gKiBAbWVtYmVyb2YgUElYSS51dGlsc1xuICogQGZ1bmN0aW9uIGdldFJlc29sdXRpb25PZlVybFxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHRoZSBpbWFnZSBwYXRoXG4gKiBAcGFyYW0ge251bWJlcn0gW2RlZmF1bHRWYWx1ZT0xXSAtIHRoZSBkZWZhdWx0VmFsdWUgaWYgbm8gZmlsZW5hbWUgcHJlZml4IGlzIHNldC5cbiAqIEByZXR1cm4ge251bWJlcn0gcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiBhbiBhc3NldFxuICovXG5mdW5jdGlvbiBnZXRSZXNvbHV0aW9uT2ZVcmwodXJsLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9IHNldHRpbmdzLlJFVElOQV9QUkVGSVguZXhlYyh1cmwpO1xuICAgIGlmIChyZXNvbHV0aW9uKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHJlc29sdXRpb25bMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiAxO1xufVxuXG4vKipcbiAqIEdlbmVyYWxpemVkIGNvbnZlbmllbmNlIHV0aWxpdGllcyBmb3IgUElYSS5cbiAqIEBleGFtcGxlXG4gKiAvLyBFeHRlbmQgUElYSSdzIGludGVybmFsIEV2ZW50IEVtaXR0ZXIuXG4gKiBjbGFzcyBNeUVtaXR0ZXIgZXh0ZW5kcyBQSVhJLnV0aWxzLkV2ZW50RW1pdHRlciB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgICBzdXBlcigpO1xuICogICAgICBjb25zb2xlLmxvZyhcIkVtaXR0ZXIgY3JlYXRlZCFcIik7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBHZXQgaW5mbyBvbiBjdXJyZW50IGRldmljZVxuICogY29uc29sZS5sb2coUElYSS51dGlscy5pc01vYmlsZSk7XG4gKlxuICogLy8gQ29udmVydCBoZXggY29sb3IgdG8gc3RyaW5nXG4gKiBjb25zb2xlLmxvZyhQSVhJLnV0aWxzLmhleDJzdHJpbmcoMHhmZjAwZmYpKTsgLy8gcmV0dXJuczogXCIjZmYwMGZmXCJcbiAqIEBuYW1lc3BhY2UgUElYSS51dGlsc1xuICovXG5cbmV4cG9ydCB7IEJhc2VUZXh0dXJlQ2FjaGUsIENhbnZhc1JlbmRlclRhcmdldCwgREFUQV9VUkksIFByb2dyYW1DYWNoZSwgVGV4dHVyZUNhY2hlLCBjbGVhclRleHR1cmVDYWNoZSwgY29ycmVjdEJsZW5kTW9kZSwgY3JlYXRlSW5kaWNlc0ZvclF1YWRzLCBkZWNvbXBvc2VEYXRhVXJpLCBkZXByZWNhdGlvbiwgZGVzdHJveVRleHR1cmVDYWNoZSwgZGV0ZXJtaW5lQ3Jvc3NPcmlnaW4sIGdldEJ1ZmZlclR5cGUsIGdldFJlc29sdXRpb25PZlVybCwgaGV4MnJnYiwgaGV4MnN0cmluZywgaW50ZXJsZWF2ZVR5cGVkQXJyYXlzLCBpc1BvdzIsIGlzV2ViR0xTdXBwb3J0ZWQsIGxvZzIsIG5leHRQb3cyLCBwcmVtdWx0aXBseUJsZW5kTW9kZSwgcHJlbXVsdGlwbHlSZ2JhLCBwcmVtdWx0aXBseVRpbnQsIHByZW11bHRpcGx5VGludFRvUmdiYSwgcmVtb3ZlSXRlbXMsIHJnYjJoZXgsIHNheUhlbGxvLCBzaWduLCBza2lwSGVsbG8sIHN0cmluZzJoZXgsIHRyaW1DYW52YXMsIHVpZCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL21hdGggLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvbWF0aCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbi8qKlxuICogQ29tbW9uIGludGVyZmFjZSBmb3IgcG9pbnRzLiBCb3RoIFBvaW50IGFuZCBPYnNlcnZhYmxlUG9pbnQgaW1wbGVtZW50IGl0XG4gKiBAbWVtYmVyb2YgUElYSVxuICogQGludGVyZmFjZSBJUG9pbnRcbiAqL1xuLyoqXG4gKiBYIGNvb3JkXG4gKiBAbWVtYmVyb2YgUElYSS5JUG9pbnQjXG4gKiBAbWVtYmVyIHtudW1iZXJ9IHhcbiAqL1xuLyoqXG4gKiBZIGNvb3JkXG4gKiBAbWVtYmVyb2YgUElYSS5JUG9pbnQjXG4gKiBAbWVtYmVyIHtudW1iZXJ9IHlcbiAqL1xuLyoqXG4gKiBTZXRzIHRoZSBwb2ludCB0byBhIG5ldyB4IGFuZCB5IHBvc2l0aW9uLlxuICogSWYgeSBpcyBvbWl0dGVkLCBib3RoIHggYW5kIHkgd2lsbCBiZSBzZXQgdG8geC5cbiAqXG4gKiBAbWV0aG9kIHNldFxuICogQG1lbWJlcm9mIFBJWEkuSVBvaW50I1xuICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gcG9zaXRpb24gb2YgdGhlIHBvaW50IG9uIHRoZSB4IGF4aXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbeT14XSAtIHBvc2l0aW9uIG9mIHRoZSBwb2ludCBvbiB0aGUgeSBheGlzXG4gKi9cbi8qKlxuICogQ29waWVzIHggYW5kIHkgZnJvbSB0aGUgZ2l2ZW4gcG9pbnRcbiAqIEBtZXRob2QgY29weUZyb21cbiAqIEBtZW1iZXJvZiBQSVhJLklQb2ludCNcbiAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IHAgLSBUaGUgcG9pbnQgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJucyB7dGhpc30gUmV0dXJucyBpdHNlbGYuXG4gKi9cbi8qKlxuICogQ29waWVzIHggYW5kIHkgaW50byB0aGUgZ2l2ZW4gcG9pbnRcbiAqIEBtZXRob2QgY29weVRvXG4gKiBAbWVtYmVyb2YgUElYSS5JUG9pbnQjXG4gKiBAcGFyYW0ge1BJWEkuSVBvaW50fSBwIC0gVGhlIHBvaW50IHRvIGNvcHkuXG4gKiBAcmV0dXJucyB7UElYSS5JUG9pbnR9IEdpdmVuIHBvaW50IHdpdGggdmFsdWVzIHVwZGF0ZWRcbiAqL1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHBvaW50IGlzIGVxdWFsIHRvIHRoaXMgcG9pbnRcbiAqXG4gKiBAbWV0aG9kIGVxdWFsc1xuICogQG1lbWJlcm9mIFBJWEkuSVBvaW50I1xuICogQHBhcmFtIHtQSVhJLklQb2ludH0gcCAtIFRoZSBwb2ludCB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBvaW50IGVxdWFsIHRvIHRoaXMgcG9pbnRcbiAqL1xuXG4vKipcbiAqIFRoZSBQb2ludCBvYmplY3QgcmVwcmVzZW50cyBhIGxvY2F0aW9uIGluIGEgdHdvLWRpbWVuc2lvbmFsIGNvb3JkaW5hdGUgc3lzdGVtLCB3aGVyZSB4IHJlcHJlc2VudHNcbiAqIHRoZSBob3Jpem9udGFsIGF4aXMgYW5kIHkgcmVwcmVzZW50cyB0aGUgdmVydGljYWwgYXhpcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAaW1wbGVtZW50cyBJUG9pbnRcbiAqL1xudmFyIFBvaW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIHBvc2l0aW9uIG9mIHRoZSBwb2ludCBvbiB0aGUgeCBheGlzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gcG9zaXRpb24gb2YgdGhlIHBvaW50IG9uIHRoZSB5IGF4aXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IDA7IH1cbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0gMDsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhpcyBwb2ludFxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5Qb2ludH0gYSBjb3B5IG9mIHRoZSBwb2ludFxuICAgICAqL1xuICAgIFBvaW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb3BpZXMgeCBhbmQgeSBmcm9tIHRoZSBnaXZlbiBwb2ludFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLklQb2ludH0gcCAtIFRoZSBwb2ludCB0byBjb3B5IGZyb21cbiAgICAgKiBAcmV0dXJucyB7dGhpc30gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgUG9pbnQucHJvdG90eXBlLmNvcHlGcm9tID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdGhpcy5zZXQocC54LCBwLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvcGllcyB4IGFuZCB5IGludG8gdGhlIGdpdmVuIHBvaW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuSVBvaW50fSBwIC0gVGhlIHBvaW50IHRvIGNvcHkuXG4gICAgICogQHJldHVybnMge1BJWEkuSVBvaW50fSBHaXZlbiBwb2ludCB3aXRoIHZhbHVlcyB1cGRhdGVkXG4gICAgICovXG4gICAgUG9pbnQucHJvdG90eXBlLmNvcHlUbyA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHAuc2V0KHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHBvaW50IGlzIGVxdWFsIHRvIHRoaXMgcG9pbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IHAgLSBUaGUgcG9pbnQgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcG9pbnQgZXF1YWwgdG8gdGhpcyBwb2ludFxuICAgICAqL1xuICAgIFBvaW50LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gKHAueCA9PT0gdGhpcy54KSAmJiAocC55ID09PSB0aGlzLnkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9pbnQgdG8gYSBuZXcgeCBhbmQgeSBwb3NpdGlvbi5cbiAgICAgKiBJZiB5IGlzIG9taXR0ZWQsIGJvdGggeCBhbmQgeSB3aWxsIGJlIHNldCB0byB4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gcG9zaXRpb24gb2YgdGhlIHBvaW50IG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBwb3NpdGlvbiBvZiB0aGUgcG9pbnQgb24gdGhlIHkgYXhpc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBQb2ludC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHggPT09IHZvaWQgMCkgeyB4ID0gMDsgfVxuICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSB4OyB9XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIFBvaW50O1xufSgpKTtcblxuLyoqXG4gKiBUaGUgUG9pbnQgb2JqZWN0IHJlcHJlc2VudHMgYSBsb2NhdGlvbiBpbiBhIHR3by1kaW1lbnNpb25hbCBjb29yZGluYXRlIHN5c3RlbSwgd2hlcmUgeCByZXByZXNlbnRzXG4gKiB0aGUgaG9yaXpvbnRhbCBheGlzIGFuZCB5IHJlcHJlc2VudHMgdGhlIHZlcnRpY2FsIGF4aXMuXG4gKlxuICogQW4gT2JzZXJ2YWJsZVBvaW50IGlzIGEgcG9pbnQgdGhhdCB0cmlnZ2VycyBhIGNhbGxiYWNrIHdoZW4gdGhlIHBvaW50J3MgcG9zaXRpb24gaXMgY2hhbmdlZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAaW1wbGVtZW50cyBJUG9pbnRcbiAqL1xudmFyIE9ic2VydmFibGVQb2ludCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiAtIGNhbGxiYWNrIHdoZW4gY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzY29wZSAtIG93bmVyIG9mIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gcG9zaXRpb24gb2YgdGhlIHBvaW50IG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBwb3NpdGlvbiBvZiB0aGUgcG9pbnQgb24gdGhlIHkgYXhpc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVQb2ludChjYiwgc2NvcGUsIHgsIHkpIHtcbiAgICAgICAgaWYgKHggPT09IHZvaWQgMCkgeyB4ID0gMDsgfVxuICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSAwOyB9XG4gICAgICAgIHRoaXMuX3ggPSB4O1xuICAgICAgICB0aGlzLl95ID0geTtcbiAgICAgICAgdGhpcy5jYiA9IGNiO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGlzIHBvaW50LlxuICAgICAqIFRoZSBjYWxsYmFjayBhbmQgc2NvcGUgcGFyYW1zIGNhbiBiZSBvdmVyaWRkZW4gb3RoZXJ3aXNlIHRoZXkgd2lsbCBkZWZhdWx0XG4gICAgICogdG8gdGhlIGNsb25lIG9iamVjdCdzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYj1udWxsXSAtIGNhbGxiYWNrIHdoZW4gY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbc2NvcGU9bnVsbF0gLSBvd25lciBvZiBjYWxsYmFja1xuICAgICAqIEByZXR1cm4ge1BJWEkuT2JzZXJ2YWJsZVBvaW50fSBhIGNvcHkgb2YgdGhlIHBvaW50XG4gICAgICovXG4gICAgT2JzZXJ2YWJsZVBvaW50LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjYiwgc2NvcGUpIHtcbiAgICAgICAgaWYgKGNiID09PSB2b2lkIDApIHsgY2IgPSB0aGlzLmNiOyB9XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gdGhpcy5zY29wZTsgfVxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGVQb2ludChjYiwgc2NvcGUsIHRoaXMuX3gsIHRoaXMuX3kpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9pbnQgdG8gYSBuZXcgeCBhbmQgeSBwb3NpdGlvbi5cbiAgICAgKiBJZiB5IGlzIG9taXR0ZWQsIGJvdGggeCBhbmQgeSB3aWxsIGJlIHNldCB0byB4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gcG9zaXRpb24gb2YgdGhlIHBvaW50IG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9eF0gLSBwb3NpdGlvbiBvZiB0aGUgcG9pbnQgb24gdGhlIHkgYXhpc1xuICAgICAqIEByZXR1cm5zIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBPYnNlcnZhYmxlUG9pbnQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IDA7IH1cbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0geDsgfVxuICAgICAgICBpZiAodGhpcy5feCAhPT0geCB8fCB0aGlzLl95ICE9PSB5KSB7XG4gICAgICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgICAgIHRoaXMuX3kgPSB5O1xuICAgICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMuc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29waWVzIHggYW5kIHkgZnJvbSB0aGUgZ2l2ZW4gcG9pbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IHAgLSBUaGUgcG9pbnQgdG8gY29weSBmcm9tLlxuICAgICAqIEByZXR1cm5zIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBPYnNlcnZhYmxlUG9pbnQucHJvdG90eXBlLmNvcHlGcm9tID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKHRoaXMuX3ggIT09IHAueCB8fCB0aGlzLl95ICE9PSBwLnkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ggPSBwLng7XG4gICAgICAgICAgICB0aGlzLl95ID0gcC55O1xuICAgICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMuc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29waWVzIHggYW5kIHkgaW50byB0aGUgZ2l2ZW4gcG9pbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IHAgLSBUaGUgcG9pbnQgdG8gY29weS5cbiAgICAgKiBAcmV0dXJucyB7UElYSS5JUG9pbnR9IEdpdmVuIHBvaW50IHdpdGggdmFsdWVzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICBPYnNlcnZhYmxlUG9pbnQucHJvdG90eXBlLmNvcHlUbyA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHAuc2V0KHRoaXMuX3gsIHRoaXMuX3kpO1xuICAgICAgICByZXR1cm4gcDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcG9pbnQgaXMgZXF1YWwgdG8gdGhpcyBwb2ludFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLklQb2ludH0gcCAtIFRoZSBwb2ludCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBwb2ludCBlcXVhbCB0byB0aGlzIHBvaW50XG4gICAgICovXG4gICAgT2JzZXJ2YWJsZVBvaW50LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gKHAueCA9PT0gdGhpcy5feCkgJiYgKHAueSA9PT0gdGhpcy5feSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZVBvaW50LnByb3RvdHlwZSwgXCJ4XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheU9iamVjdCBvbiB0aGUgeCBheGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl94O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5feCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnNjb3BlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGVQb2ludC5wcm90b3R5cGUsIFwieVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXlPYmplY3Qgb24gdGhlIHggYXhpcyByZWxhdGl2ZSB0byB0aGUgbG9jYWwgY29vcmRpbmF0ZXMgb2YgdGhlIHBhcmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl95ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy5zY29wZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBPYnNlcnZhYmxlUG9pbnQ7XG59KCkpO1xuXG4vKipcbiAqIFR3byBQaS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAY29uc3RhbnQge251bWJlcn0gUElfMlxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFBJXzIgPSBNYXRoLlBJICogMjtcbi8qKlxuICogQ29udmVyc2lvbiBmYWN0b3IgZm9yIGNvbnZlcnRpbmcgcmFkaWFucyB0byBkZWdyZWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudCB7bnVtYmVyfSBSQURfVE9fREVHXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgUkFEX1RPX0RFRyA9IDE4MCAvIE1hdGguUEk7XG4vKipcbiAqIENvbnZlcnNpb24gZmFjdG9yIGZvciBjb252ZXJ0aW5nIGRlZ3JlZXMgdG8gcmFkaWFucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAY29uc3RhbnQge251bWJlcn0gREVHX1RPX1JBRFxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIERFR19UT19SQUQgPSBNYXRoLlBJIC8gMTgwO1xudmFyIFNIQVBFUztcbihmdW5jdGlvbiAoU0hBUEVTKSB7XG4gICAgU0hBUEVTW1NIQVBFU1tcIlBPTFlcIl0gPSAwXSA9IFwiUE9MWVwiO1xuICAgIFNIQVBFU1tTSEFQRVNbXCJSRUNUXCJdID0gMV0gPSBcIlJFQ1RcIjtcbiAgICBTSEFQRVNbU0hBUEVTW1wiQ0lSQ1wiXSA9IDJdID0gXCJDSVJDXCI7XG4gICAgU0hBUEVTW1NIQVBFU1tcIkVMSVBcIl0gPSAzXSA9IFwiRUxJUFwiO1xuICAgIFNIQVBFU1tTSEFQRVNbXCJSUkVDXCJdID0gNF0gPSBcIlJSRUNcIjtcbn0pKFNIQVBFUyB8fCAoU0hBUEVTID0ge30pKTtcbi8qKlxuICogQ29uc3RhbnRzIHRoYXQgaWRlbnRpZnkgc2hhcGVzLCBtYWlubHkgdG8gcHJldmVudCBgaW5zdGFuY2VvZmAgY2FsbHMuXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbmFtZSBTSEFQRVNcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAdHlwZSB7ZW51bX1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQT0xZIFBvbHlnb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBSRUNUIFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IENJUkMgQ2lyY2xlXG4gKiBAcHJvcGVydHkge251bWJlcn0gRUxJUCBFbGxpcHNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gUlJFQyBSb3VuZGVkIFJlY3RhbmdsZVxuICogQGVudW0ge251bWJlcn1cbiAqL1xuXG4vKipcbiAqIFRoZSBQaXhpSlMgTWF0cml4IGFzIGEgY2xhc3MgbWFrZXMgaXQgYSBsb3QgZmFzdGVyLlxuICpcbiAqIEhlcmUgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBpdDpcbiAqIGBgYGpzXG4gKiB8IGEgfCBjIHwgdHh8XG4gKiB8IGIgfCBkIHwgdHl8XG4gKiB8IDAgfCAwIHwgMSB8XG4gKiBgYGBcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIE1hdHJpeCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2E9MV0gLSB4IHNjYWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtiPTBdIC0geCBza2V3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjPTBdIC0geSBza2V3XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkPTFdIC0geSBzY2FsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdHg9MF0gLSB4IHRyYW5zbGF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt0eT0wXSAtIHkgdHJhbnNsYXRpb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNYXRyaXgoYSwgYiwgYywgZCwgdHgsIHR5KSB7XG4gICAgICAgIGlmIChhID09PSB2b2lkIDApIHsgYSA9IDE7IH1cbiAgICAgICAgaWYgKGIgPT09IHZvaWQgMCkgeyBiID0gMDsgfVxuICAgICAgICBpZiAoYyA9PT0gdm9pZCAwKSB7IGMgPSAwOyB9XG4gICAgICAgIGlmIChkID09PSB2b2lkIDApIHsgZCA9IDE7IH1cbiAgICAgICAgaWYgKHR4ID09PSB2b2lkIDApIHsgdHggPSAwOyB9XG4gICAgICAgIGlmICh0eSA9PT0gdm9pZCAwKSB7IHR5ID0gMDsgfVxuICAgICAgICB0aGlzLmFycmF5ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hID0gYTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iID0gYjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jID0gYztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kID0gZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eCA9IHR4O1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5ID0gdHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBNYXRyaXggb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBhcnJheS4gVGhlIEVsZW1lbnQgdG8gTWF0cml4IG1hcHBpbmcgb3JkZXIgaXMgYXMgZm9sbG93czpcbiAgICAgKlxuICAgICAqIGEgPSBhcnJheVswXVxuICAgICAqIGIgPSBhcnJheVsxXVxuICAgICAqIGMgPSBhcnJheVszXVxuICAgICAqIGQgPSBhcnJheVs0XVxuICAgICAqIHR4ID0gYXJyYXlbMl1cbiAgICAgKiB0eSA9IGFycmF5WzVdXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBhcnJheSAtIFRoZSBhcnJheSB0aGF0IHRoZSBtYXRyaXggd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbS5cbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLmZyb21BcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB0aGlzLmEgPSBhcnJheVswXTtcbiAgICAgICAgdGhpcy5iID0gYXJyYXlbMV07XG4gICAgICAgIHRoaXMuYyA9IGFycmF5WzNdO1xuICAgICAgICB0aGlzLmQgPSBhcnJheVs0XTtcbiAgICAgICAgdGhpcy50eCA9IGFycmF5WzJdO1xuICAgICAgICB0aGlzLnR5ID0gYXJyYXlbNV07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBzZXRzIHRoZSBtYXRyaXggcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNYXRyaXggY29tcG9uZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGIgLSBNYXRyaXggY29tcG9uZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGMgLSBNYXRyaXggY29tcG9uZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGQgLSBNYXRyaXggY29tcG9uZW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHR4IC0gTWF0cml4IGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eSAtIE1hdHJpeCBjb21wb25lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBUaGlzIG1hdHJpeC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgICAgICB0aGlzLmIgPSBiO1xuICAgICAgICB0aGlzLmMgPSBjO1xuICAgICAgICB0aGlzLmQgPSBkO1xuICAgICAgICB0aGlzLnR4ID0gdHg7XG4gICAgICAgIHRoaXMudHkgPSB0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gdGhlIGN1cnJlbnQgTWF0cml4IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIC0gV2hldGhlciB3ZSBuZWVkIHRvIHRyYW5zcG9zZSB0aGUgbWF0cml4IG9yIG5vdFxuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBbb3V0PW5ldyBGbG9hdDMyQXJyYXkoOSldIC0gSWYgcHJvdmlkZWQgdGhlIGFycmF5IHdpbGwgYmUgYXNzaWduZWQgdG8gb3V0XG4gICAgICogQHJldHVybiB7bnVtYmVyW119IHRoZSBuZXdseSBjcmVhdGVkIGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBtYXRyaXhcbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAodHJhbnNwb3NlLCBvdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJyYXkgPSBvdXQgfHwgdGhpcy5hcnJheTtcbiAgICAgICAgaWYgKHRyYW5zcG9zZSkge1xuICAgICAgICAgICAgYXJyYXlbMF0gPSB0aGlzLmE7XG4gICAgICAgICAgICBhcnJheVsxXSA9IHRoaXMuYjtcbiAgICAgICAgICAgIGFycmF5WzJdID0gMDtcbiAgICAgICAgICAgIGFycmF5WzNdID0gdGhpcy5jO1xuICAgICAgICAgICAgYXJyYXlbNF0gPSB0aGlzLmQ7XG4gICAgICAgICAgICBhcnJheVs1XSA9IDA7XG4gICAgICAgICAgICBhcnJheVs2XSA9IHRoaXMudHg7XG4gICAgICAgICAgICBhcnJheVs3XSA9IHRoaXMudHk7XG4gICAgICAgICAgICBhcnJheVs4XSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhcnJheVswXSA9IHRoaXMuYTtcbiAgICAgICAgICAgIGFycmF5WzFdID0gdGhpcy5jO1xuICAgICAgICAgICAgYXJyYXlbMl0gPSB0aGlzLnR4O1xuICAgICAgICAgICAgYXJyYXlbM10gPSB0aGlzLmI7XG4gICAgICAgICAgICBhcnJheVs0XSA9IHRoaXMuZDtcbiAgICAgICAgICAgIGFycmF5WzVdID0gdGhpcy50eTtcbiAgICAgICAgICAgIGFycmF5WzZdID0gMDtcbiAgICAgICAgICAgIGFycmF5WzddID0gMDtcbiAgICAgICAgICAgIGFycmF5WzhdID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYSBuZXcgcG9zaXRpb24gd2l0aCB0aGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiBhcHBsaWVkLlxuICAgICAqIENhbiBiZSB1c2VkIHRvIGdvIGZyb20gYSBjaGlsZCdzIGNvb3JkaW5hdGUgc3BhY2UgdG8gdGhlIHdvcmxkIGNvb3JkaW5hdGUgc3BhY2UuIChlLmcuIHJlbmRlcmluZylcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gcG9zIC0gVGhlIG9yaWdpblxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gW25ld1Bvc10gLSBUaGUgcG9pbnQgdGhhdCB0aGUgbmV3IHBvc2l0aW9uIGlzIGFzc2lnbmVkIHRvIChhbGxvd2VkIHRvIGJlIHNhbWUgYXMgaW5wdXQpXG4gICAgICogQHJldHVybiB7UElYSS5Qb2ludH0gVGhlIG5ldyBwb2ludCwgdHJhbnNmb3JtZWQgdGhyb3VnaCB0aGlzIG1hdHJpeFxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiAocG9zLCBuZXdQb3MpIHtcbiAgICAgICAgbmV3UG9zID0gbmV3UG9zIHx8IG5ldyBQb2ludCgpO1xuICAgICAgICB2YXIgeCA9IHBvcy54O1xuICAgICAgICB2YXIgeSA9IHBvcy55O1xuICAgICAgICBuZXdQb3MueCA9ICh0aGlzLmEgKiB4KSArICh0aGlzLmMgKiB5KSArIHRoaXMudHg7XG4gICAgICAgIG5ld1Bvcy55ID0gKHRoaXMuYiAqIHgpICsgKHRoaXMuZCAqIHkpICsgdGhpcy50eTtcbiAgICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhIG5ldyBwb3NpdGlvbiB3aXRoIHRoZSBpbnZlcnNlIG9mIHRoZSBjdXJyZW50IHRyYW5zZm9ybWF0aW9uIGFwcGxpZWQuXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gZ28gZnJvbSB0aGUgd29ybGQgY29vcmRpbmF0ZSBzcGFjZSB0byBhIGNoaWxkJ3MgY29vcmRpbmF0ZSBzcGFjZS4gKGUuZy4gaW5wdXQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUG9pbnR9IHBvcyAtIFRoZSBvcmlnaW5cbiAgICAgKiBAcGFyYW0ge1BJWEkuUG9pbnR9IFtuZXdQb3NdIC0gVGhlIHBvaW50IHRoYXQgdGhlIG5ldyBwb3NpdGlvbiBpcyBhc3NpZ25lZCB0byAoYWxsb3dlZCB0byBiZSBzYW1lIGFzIGlucHV0KVxuICAgICAqIEByZXR1cm4ge1BJWEkuUG9pbnR9IFRoZSBuZXcgcG9pbnQsIGludmVyc2UtdHJhbnNmb3JtZWQgdGhyb3VnaCB0aGlzIG1hdHJpeFxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuYXBwbHlJbnZlcnNlID0gZnVuY3Rpb24gKHBvcywgbmV3UG9zKSB7XG4gICAgICAgIG5ld1BvcyA9IG5ld1BvcyB8fCBuZXcgUG9pbnQoKTtcbiAgICAgICAgdmFyIGlkID0gMSAvICgodGhpcy5hICogdGhpcy5kKSArICh0aGlzLmMgKiAtdGhpcy5iKSk7XG4gICAgICAgIHZhciB4ID0gcG9zLng7XG4gICAgICAgIHZhciB5ID0gcG9zLnk7XG4gICAgICAgIG5ld1Bvcy54ID0gKHRoaXMuZCAqIGlkICogeCkgKyAoLXRoaXMuYyAqIGlkICogeSkgKyAoKCh0aGlzLnR5ICogdGhpcy5jKSAtICh0aGlzLnR4ICogdGhpcy5kKSkgKiBpZCk7XG4gICAgICAgIG5ld1Bvcy55ID0gKHRoaXMuYSAqIGlkICogeSkgKyAoLXRoaXMuYiAqIGlkICogeCkgKyAoKCgtdGhpcy50eSAqIHRoaXMuYSkgKyAodGhpcy50eCAqIHRoaXMuYikpICogaWQpO1xuICAgICAgICByZXR1cm4gbmV3UG9zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRlcyB0aGUgbWF0cml4IG9uIHRoZSB4IGFuZCB5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG93IG11Y2ggdG8gdHJhbnNsYXRlIHggYnlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBIb3cgbXVjaCB0byB0cmFuc2xhdGUgeSBieVxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBUaGlzIG1hdHJpeC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgdGhpcy50eCArPSB4O1xuICAgICAgICB0aGlzLnR5ICs9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIHNjYWxlIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBtYXRyaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgYW1vdW50IHRvIHNjYWxlIGhvcml6b250YWxseVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSBhbW91bnQgdG8gc2NhbGUgdmVydGljYWxseVxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBUaGlzIG1hdHJpeC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICB0aGlzLmEgKj0geDtcbiAgICAgICAgdGhpcy5kICo9IHk7XG4gICAgICAgIHRoaXMuYyAqPSB4O1xuICAgICAgICB0aGlzLmIgKj0geTtcbiAgICAgICAgdGhpcy50eCAqPSB4O1xuICAgICAgICB0aGlzLnR5ICo9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBtYXRyaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLk1hdHJpeH0gVGhpcyBtYXRyaXguIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICB2YXIgYTEgPSB0aGlzLmE7XG4gICAgICAgIHZhciBjMSA9IHRoaXMuYztcbiAgICAgICAgdmFyIHR4MSA9IHRoaXMudHg7XG4gICAgICAgIHRoaXMuYSA9IChhMSAqIGNvcykgLSAodGhpcy5iICogc2luKTtcbiAgICAgICAgdGhpcy5iID0gKGExICogc2luKSArICh0aGlzLmIgKiBjb3MpO1xuICAgICAgICB0aGlzLmMgPSAoYzEgKiBjb3MpIC0gKHRoaXMuZCAqIHNpbik7XG4gICAgICAgIHRoaXMuZCA9IChjMSAqIHNpbikgKyAodGhpcy5kICogY29zKTtcbiAgICAgICAgdGhpcy50eCA9ICh0eDEgKiBjb3MpIC0gKHRoaXMudHkgKiBzaW4pO1xuICAgICAgICB0aGlzLnR5ID0gKHR4MSAqIHNpbikgKyAodGhpcy50eSAqIGNvcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwZW5kcyB0aGUgZ2l2ZW4gTWF0cml4IHRvIHRoaXMgTWF0cml4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gbWF0cml4IC0gVGhlIG1hdHJpeCB0byBhcHBlbmQuXG4gICAgICogQHJldHVybiB7UElYSS5NYXRyaXh9IFRoaXMgbWF0cml4LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgTWF0cml4LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIHZhciBhMSA9IHRoaXMuYTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5iO1xuICAgICAgICB2YXIgYzEgPSB0aGlzLmM7XG4gICAgICAgIHZhciBkMSA9IHRoaXMuZDtcbiAgICAgICAgdGhpcy5hID0gKG1hdHJpeC5hICogYTEpICsgKG1hdHJpeC5iICogYzEpO1xuICAgICAgICB0aGlzLmIgPSAobWF0cml4LmEgKiBiMSkgKyAobWF0cml4LmIgKiBkMSk7XG4gICAgICAgIHRoaXMuYyA9IChtYXRyaXguYyAqIGExKSArIChtYXRyaXguZCAqIGMxKTtcbiAgICAgICAgdGhpcy5kID0gKG1hdHJpeC5jICogYjEpICsgKG1hdHJpeC5kICogZDEpO1xuICAgICAgICB0aGlzLnR4ID0gKG1hdHJpeC50eCAqIGExKSArIChtYXRyaXgudHkgKiBjMSkgKyB0aGlzLnR4O1xuICAgICAgICB0aGlzLnR5ID0gKG1hdHJpeC50eCAqIGIxKSArIChtYXRyaXgudHkgKiBkMSkgKyB0aGlzLnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hdHJpeCBiYXNlZCBvbiBhbGwgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFBvc2l0aW9uIG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFBvc2l0aW9uIG9uIHRoZSB5IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGl2b3RYIC0gUGl2b3Qgb24gdGhlIHggYXhpc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaXZvdFkgLSBQaXZvdCBvbiB0aGUgeSBheGlzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlWCAtIFNjYWxlIG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NhbGVZIC0gU2NhbGUgb24gdGhlIHkgYXhpc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIFJvdGF0aW9uIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2tld1ggLSBTa2V3IG9uIHRoZSB4IGF4aXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2tld1kgLSBTa2V3IG9uIHRoZSB5IGF4aXNcbiAgICAgKiBAcmV0dXJuIHtQSVhJLk1hdHJpeH0gVGhpcyBtYXRyaXguIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uICh4LCB5LCBwaXZvdFgsIHBpdm90WSwgc2NhbGVYLCBzY2FsZVksIHJvdGF0aW9uLCBza2V3WCwgc2tld1kpIHtcbiAgICAgICAgdGhpcy5hID0gTWF0aC5jb3Mocm90YXRpb24gKyBza2V3WSkgKiBzY2FsZVg7XG4gICAgICAgIHRoaXMuYiA9IE1hdGguc2luKHJvdGF0aW9uICsgc2tld1kpICogc2NhbGVYO1xuICAgICAgICB0aGlzLmMgPSAtTWF0aC5zaW4ocm90YXRpb24gLSBza2V3WCkgKiBzY2FsZVk7XG4gICAgICAgIHRoaXMuZCA9IE1hdGguY29zKHJvdGF0aW9uIC0gc2tld1gpICogc2NhbGVZO1xuICAgICAgICB0aGlzLnR4ID0geCAtICgocGl2b3RYICogdGhpcy5hKSArIChwaXZvdFkgKiB0aGlzLmMpKTtcbiAgICAgICAgdGhpcy50eSA9IHkgLSAoKHBpdm90WCAqIHRoaXMuYikgKyAocGl2b3RZICogdGhpcy5kKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJlcGVuZHMgdGhlIGdpdmVuIE1hdHJpeCB0byB0aGlzIE1hdHJpeC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG1hdHJpeCAtIFRoZSBtYXRyaXggdG8gcHJlcGVuZFxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBUaGlzIG1hdHJpeC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgdmFyIHR4MSA9IHRoaXMudHg7XG4gICAgICAgIGlmIChtYXRyaXguYSAhPT0gMSB8fCBtYXRyaXguYiAhPT0gMCB8fCBtYXRyaXguYyAhPT0gMCB8fCBtYXRyaXguZCAhPT0gMSkge1xuICAgICAgICAgICAgdmFyIGExID0gdGhpcy5hO1xuICAgICAgICAgICAgdmFyIGMxID0gdGhpcy5jO1xuICAgICAgICAgICAgdGhpcy5hID0gKGExICogbWF0cml4LmEpICsgKHRoaXMuYiAqIG1hdHJpeC5jKTtcbiAgICAgICAgICAgIHRoaXMuYiA9IChhMSAqIG1hdHJpeC5iKSArICh0aGlzLmIgKiBtYXRyaXguZCk7XG4gICAgICAgICAgICB0aGlzLmMgPSAoYzEgKiBtYXRyaXguYSkgKyAodGhpcy5kICogbWF0cml4LmMpO1xuICAgICAgICAgICAgdGhpcy5kID0gKGMxICogbWF0cml4LmIpICsgKHRoaXMuZCAqIG1hdHJpeC5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnR4ID0gKHR4MSAqIG1hdHJpeC5hKSArICh0aGlzLnR5ICogbWF0cml4LmMpICsgbWF0cml4LnR4O1xuICAgICAgICB0aGlzLnR5ID0gKHR4MSAqIG1hdHJpeC5iKSArICh0aGlzLnR5ICogbWF0cml4LmQpICsgbWF0cml4LnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlY29tcG9zZXMgdGhlIG1hdHJpeCAoeCwgeSwgc2NhbGVYLCBzY2FsZVksIGFuZCByb3RhdGlvbikgYW5kIHNldHMgdGhlIHByb3BlcnRpZXMgb24gdG8gYSB0cmFuc2Zvcm0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuVHJhbnNmb3JtfSB0cmFuc2Zvcm0gLSBUaGUgdHJhbnNmb3JtIHRvIGFwcGx5IHRoZSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEByZXR1cm4ge1BJWEkuVHJhbnNmb3JtfSBUaGUgdHJhbnNmb3JtIHdpdGggdGhlIG5ld2x5IGFwcGxpZWQgcHJvcGVydGllc1xuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuZGVjb21wb3NlID0gZnVuY3Rpb24gKHRyYW5zZm9ybSkge1xuICAgICAgICAvLyBzb3J0IG91dCByb3RhdGlvbiAvIHNrZXcuLlxuICAgICAgICB2YXIgYSA9IHRoaXMuYTtcbiAgICAgICAgdmFyIGIgPSB0aGlzLmI7XG4gICAgICAgIHZhciBjID0gdGhpcy5jO1xuICAgICAgICB2YXIgZCA9IHRoaXMuZDtcbiAgICAgICAgdmFyIHNrZXdYID0gLU1hdGguYXRhbjIoLWMsIGQpO1xuICAgICAgICB2YXIgc2tld1kgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICAgICAgICB2YXIgZGVsdGEgPSBNYXRoLmFicyhza2V3WCArIHNrZXdZKTtcbiAgICAgICAgaWYgKGRlbHRhIDwgMC4wMDAwMSB8fCBNYXRoLmFicyhQSV8yIC0gZGVsdGEpIDwgMC4wMDAwMSkge1xuICAgICAgICAgICAgdHJhbnNmb3JtLnJvdGF0aW9uID0gc2tld1k7XG4gICAgICAgICAgICB0cmFuc2Zvcm0uc2tldy54ID0gdHJhbnNmb3JtLnNrZXcueSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm0ucm90YXRpb24gPSAwO1xuICAgICAgICAgICAgdHJhbnNmb3JtLnNrZXcueCA9IHNrZXdYO1xuICAgICAgICAgICAgdHJhbnNmb3JtLnNrZXcueSA9IHNrZXdZO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5leHQgc2V0IHNjYWxlXG4gICAgICAgIHRyYW5zZm9ybS5zY2FsZS54ID0gTWF0aC5zcXJ0KChhICogYSkgKyAoYiAqIGIpKTtcbiAgICAgICAgdHJhbnNmb3JtLnNjYWxlLnkgPSBNYXRoLnNxcnQoKGMgKiBjKSArIChkICogZCkpO1xuICAgICAgICAvLyBuZXh0IHNldCBwb3NpdGlvblxuICAgICAgICB0cmFuc2Zvcm0ucG9zaXRpb24ueCA9IHRoaXMudHg7XG4gICAgICAgIHRyYW5zZm9ybS5wb3NpdGlvbi55ID0gdGhpcy50eTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEludmVydHMgdGhpcyBtYXRyaXhcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBUaGlzIG1hdHJpeC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuaW52ZXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYTEgPSB0aGlzLmE7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuYjtcbiAgICAgICAgdmFyIGMxID0gdGhpcy5jO1xuICAgICAgICB2YXIgZDEgPSB0aGlzLmQ7XG4gICAgICAgIHZhciB0eDEgPSB0aGlzLnR4O1xuICAgICAgICB2YXIgbiA9IChhMSAqIGQxKSAtIChiMSAqIGMxKTtcbiAgICAgICAgdGhpcy5hID0gZDEgLyBuO1xuICAgICAgICB0aGlzLmIgPSAtYjEgLyBuO1xuICAgICAgICB0aGlzLmMgPSAtYzEgLyBuO1xuICAgICAgICB0aGlzLmQgPSBhMSAvIG47XG4gICAgICAgIHRoaXMudHggPSAoKGMxICogdGhpcy50eSkgLSAoZDEgKiB0eDEpKSAvIG47XG4gICAgICAgIHRoaXMudHkgPSAtKChhMSAqIHRoaXMudHkpIC0gKGIxICogdHgxKSkgLyBuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGlzIE1hdHJpeCB0byBhbiBpZGVudGl0eSAoZGVmYXVsdCkgbWF0cml4LlxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5NYXRyaXh9IFRoaXMgbWF0cml4LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgTWF0cml4LnByb3RvdHlwZS5pZGVudGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hID0gMTtcbiAgICAgICAgdGhpcy5iID0gMDtcbiAgICAgICAgdGhpcy5jID0gMDtcbiAgICAgICAgdGhpcy5kID0gMTtcbiAgICAgICAgdGhpcy50eCA9IDA7XG4gICAgICAgIHRoaXMudHkgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgTWF0cml4IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BJWEkuTWF0cml4fSBBIGNvcHkgb2YgdGhpcyBtYXRyaXguIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF0cml4ID0gbmV3IE1hdHJpeCgpO1xuICAgICAgICBtYXRyaXguYSA9IHRoaXMuYTtcbiAgICAgICAgbWF0cml4LmIgPSB0aGlzLmI7XG4gICAgICAgIG1hdHJpeC5jID0gdGhpcy5jO1xuICAgICAgICBtYXRyaXguZCA9IHRoaXMuZDtcbiAgICAgICAgbWF0cml4LnR4ID0gdGhpcy50eDtcbiAgICAgICAgbWF0cml4LnR5ID0gdGhpcy50eTtcbiAgICAgICAgcmV0dXJuIG1hdHJpeDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbWF0cml4IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmVzIGluIHRoaXMgbWF0cml4XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBtYXRyaXggLSBUaGUgbWF0cml4IHRvIGNvcHkgdG8uXG4gICAgICogQHJldHVybiB7UElYSS5NYXRyaXh9IFRoZSBtYXRyaXggZ2l2ZW4gaW4gcGFyYW1ldGVyIHdpdGggaXRzIHZhbHVlcyB1cGRhdGVkLlxuICAgICAqL1xuICAgIE1hdHJpeC5wcm90b3R5cGUuY29weVRvID0gZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICBtYXRyaXguYSA9IHRoaXMuYTtcbiAgICAgICAgbWF0cml4LmIgPSB0aGlzLmI7XG4gICAgICAgIG1hdHJpeC5jID0gdGhpcy5jO1xuICAgICAgICBtYXRyaXguZCA9IHRoaXMuZDtcbiAgICAgICAgbWF0cml4LnR4ID0gdGhpcy50eDtcbiAgICAgICAgbWF0cml4LnR5ID0gdGhpcy50eTtcbiAgICAgICAgcmV0dXJuIG1hdHJpeDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIHZhbHVlcyBvZiB0aGUgbWF0cml4IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmVzIGluIGdpdmVuIG1hdHJpeFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gbWF0cml4IC0gVGhlIG1hdHJpeCB0byBjb3B5IGZyb20uXG4gICAgICogQHJldHVybiB7UElYSS5NYXRyaXh9IHRoaXNcbiAgICAgKi9cbiAgICBNYXRyaXgucHJvdG90eXBlLmNvcHlGcm9tID0gZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICB0aGlzLmEgPSBtYXRyaXguYTtcbiAgICAgICAgdGhpcy5iID0gbWF0cml4LmI7XG4gICAgICAgIHRoaXMuYyA9IG1hdHJpeC5jO1xuICAgICAgICB0aGlzLmQgPSBtYXRyaXguZDtcbiAgICAgICAgdGhpcy50eCA9IG1hdHJpeC50eDtcbiAgICAgICAgdGhpcy50eSA9IG1hdHJpeC50eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWF0cml4LCBcIklERU5USVRZXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCAoaWRlbnRpdHkpIG1hdHJpeFxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBjb25zdFxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1hdHJpeH1cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXgoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hdHJpeCwgXCJURU1QX01BVFJJWFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRlbXAgbWF0cml4XG4gICAgICAgICAqXG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICogQGNvbnN0XG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTWF0cml4fVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdHJpeCgpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gTWF0cml4O1xufSgpKTtcblxuLy8gWW91ciBmcmllbmRseSBuZWlnaGJvdXIgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGloZWRyYWxfZ3JvdXBcbi8qXG4gKiBUcmFuc2Zvcm0gbWF0cml4IGZvciBvcGVyYXRpb24gbiBpczpcbiAqIHwgdXggfCB2eCB8XG4gKiB8IHV5IHwgdnkgfFxuICovXG52YXIgdXggPSBbMSwgMSwgMCwgLTEsIC0xLCAtMSwgMCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMSwgMCwgMV07XG52YXIgdXkgPSBbMCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMSwgMCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMV07XG52YXIgdnggPSBbMCwgLTEsIC0xLCAtMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgLTEsIC0xLCAtMV07XG52YXIgdnkgPSBbMSwgMSwgMCwgLTEsIC0xLCAtMSwgMCwgMSwgLTEsIC0xLCAwLCAxLCAxLCAxLCAwLCAtMV07XG4vKipcbiAqIFtDYXlsZXkgVGFibGVde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NheWxleV90YWJsZX1cbiAqIGZvciB0aGUgY29tcG9zaXRpb24gb2YgZWFjaCByb3RhdGlvbiBpbiB0aGUgZGloZWRlcmFsIGdyb3VwIEQ4LlxuICpcbiAqIEB0eXBlIG51bWJlcltdW11cbiAqIEBwcml2YXRlXG4gKi9cbnZhciByb3RhdGlvbkNheWxleSA9IFtdO1xuLyoqXG4gKiBNYXRyaWNlcyBmb3IgZWFjaCBgR0Q4U3ltbWV0cnlgIHJvdGF0aW9uLlxuICpcbiAqIEB0eXBlIE1hdHJpeFtdXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgcm90YXRpb25NYXRyaWNlcyA9IFtdO1xuLypcbiAqIEFsaWFzIGZvciB7QGNvZGUgTWF0aC5zaWdufS5cbiAqL1xudmFyIHNpZ251bSA9IE1hdGguc2lnbjtcbi8qXG4gKiBJbml0aWFsaXplcyBgcm90YXRpb25DYXlsZXlgIGFuZCBgcm90YXRpb25NYXRyaWNlc2AuIEl0IGlzIGNhbGxlZFxuICogb25seSBvbmNlIGJlbG93LlxuICovXG5mdW5jdGlvbiBpbml0KCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICB2YXIgcm93ID0gW107XG4gICAgICAgIHJvdGF0aW9uQ2F5bGV5LnB1c2gocm93KTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgaisrKSB7XG4gICAgICAgICAgICAvKiBNdWx0aXBsaWVzIHJvdGF0aW9uIG1hdHJpY2VzIGkgYW5kIGouICovXG4gICAgICAgICAgICB2YXIgX3V4ID0gc2lnbnVtKCh1eFtpXSAqIHV4W2pdKSArICh2eFtpXSAqIHV5W2pdKSk7XG4gICAgICAgICAgICB2YXIgX3V5ID0gc2lnbnVtKCh1eVtpXSAqIHV4W2pdKSArICh2eVtpXSAqIHV5W2pdKSk7XG4gICAgICAgICAgICB2YXIgX3Z4ID0gc2lnbnVtKCh1eFtpXSAqIHZ4W2pdKSArICh2eFtpXSAqIHZ5W2pdKSk7XG4gICAgICAgICAgICB2YXIgX3Z5ID0gc2lnbnVtKCh1eVtpXSAqIHZ4W2pdKSArICh2eVtpXSAqIHZ5W2pdKSk7XG4gICAgICAgICAgICAvKiBGaW5kcyByb3RhdGlvbiBtYXRyaXggbWF0Y2hpbmcgdGhlIHByb2R1Y3QgYW5kIHB1c2hlcyBpdC4gKi9cbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgMTY7IGsrKykge1xuICAgICAgICAgICAgICAgIGlmICh1eFtrXSA9PT0gX3V4ICYmIHV5W2tdID09PSBfdXlcbiAgICAgICAgICAgICAgICAgICAgJiYgdnhba10gPT09IF92eCAmJiB2eVtrXSA9PT0gX3Z5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKGspO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIHZhciBtYXQgPSBuZXcgTWF0cml4KCk7XG4gICAgICAgIG1hdC5zZXQodXhbaV0sIHV5W2ldLCB2eFtpXSwgdnlbaV0sIDAsIDApO1xuICAgICAgICByb3RhdGlvbk1hdHJpY2VzLnB1c2gobWF0KTtcbiAgICB9XG59XG5pbml0KCk7XG4vKipcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAdHlwZWRlZiB7bnVtYmVyfSBHRDhTeW1tZXRyeVxuICogQHNlZSBQSVhJLmdyb3VwRDhcbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRzIHRoZSBkaWhlZHJhbCBncm91cCBEOCwgd2hpY2ggaXMgc2ltaWxhciB0b1xuICogW2dyb3VwIEQ0XXtAbGluayBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0RpaGVkcmFsR3JvdXBENC5odG1sfTtcbiAqIEQ4IGlzIHRoZSBzYW1lIGJ1dCB3aXRoIGRpYWdvbmFscywgYW5kIGl0IGlzIHVzZWQgZm9yIHRleHR1cmVcbiAqIHJvdGF0aW9ucy5cbiAqXG4gKiBUaGUgZGlyZWN0aW9ucyB0aGUgVS0gYW5kIFYtIGF4ZXMgYWZ0ZXIgcm90YXRpb25cbiAqIG9mIGFuIGFuZ2xlIG9mIGBhOiBHRDhDb25zdGFudGAgYXJlIHRoZSB2ZWN0b3JzIGAodVgoYSksIHVZKGEpKWBcbiAqIGFuZCBgKHZYKGEpLCB2WShhKSlgLiBUaGVzZSBhcmVuJ3QgbmVjZXNzYXJpbHkgdW5pdCB2ZWN0b3JzLlxuICpcbiAqICoqT3JpZ2luOioqPGJyPlxuICogIFRoaXMgaXMgdGhlIHNtYWxsIHBhcnQgb2YgZ2FtZW9mYm9tYnMuY29tIHBvcnRhbCBzeXN0ZW0uIEl0IHdvcmtzLlxuICpcbiAqIEBzZWUgUElYSS5ncm91cEQ4LkVcbiAqIEBzZWUgUElYSS5ncm91cEQ4LlNFXG4gKiBAc2VlIFBJWEkuZ3JvdXBEOC5TXG4gKiBAc2VlIFBJWEkuZ3JvdXBEOC5TV1xuICogQHNlZSBQSVhJLmdyb3VwRDguV1xuICogQHNlZSBQSVhJLmdyb3VwRDguTldcbiAqIEBzZWUgUElYSS5ncm91cEQ4Lk5cbiAqIEBzZWUgUElYSS5ncm91cEQ4Lk5FXG4gKiBAYXV0aG9yIEl2YW4gQGl2YW5wb3BlbHlzaGV2XG4gKiBAbmFtZXNwYWNlIFBJWEkuZ3JvdXBEOFxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIGdyb3VwRDggPSB7XG4gICAgLyoqXG4gICAgICogfCBSb3RhdGlvbiB8IERpcmVjdGlvbiB8XG4gICAgICogfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18XG4gICAgICogfCAwwrAgICAgICAgfCBFYXN0ICAgICAgfFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBjb25zdGFudCB7UElYSS5HRDhTeW1tZXRyeX1cbiAgICAgKi9cbiAgICBFOiAwLFxuICAgIC8qKlxuICAgICAqIHwgUm90YXRpb24gfCBEaXJlY3Rpb24gfFxuICAgICAqIHwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tfFxuICAgICAqIHwgNDXCsOKGuyAgICAgfCBTb3V0aGVhc3QgfFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBjb25zdGFudCB7UElYSS5HRDhTeW1tZXRyeX1cbiAgICAgKi9cbiAgICBTRTogMSxcbiAgICAvKipcbiAgICAgKiB8IFJvdGF0aW9uIHwgRGlyZWN0aW9uIHxcbiAgICAgKiB8LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAgICAgKiB8IDkwwrDihrsgICAgIHwgU291dGggICAgIHxcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgUzogMixcbiAgICAvKipcbiAgICAgKiB8IFJvdGF0aW9uIHwgRGlyZWN0aW9uIHxcbiAgICAgKiB8LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAgICAgKiB8IDEzNcKw4oa7ICAgIHwgU291dGh3ZXN0IHxcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgU1c6IDMsXG4gICAgLyoqXG4gICAgICogfCBSb3RhdGlvbiB8IERpcmVjdGlvbiB8XG4gICAgICogfC0tLS0tLS0tLS18LS0tLS0tLS0tLS18XG4gICAgICogfCAxODDCsCAgICAgfCBXZXN0ICAgICAgfFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBjb25zdGFudCB7UElYSS5HRDhTeW1tZXRyeX1cbiAgICAgKi9cbiAgICBXOiA0LFxuICAgIC8qKlxuICAgICAqIHwgUm90YXRpb24gICAgfCBEaXJlY3Rpb24gICAgfFxuICAgICAqIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfFxuICAgICAqIHwgLTEzNcKwLzIyNcKw4oa7IHwgTm9ydGh3ZXN0ICAgIHxcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgTlc6IDUsXG4gICAgLyoqXG4gICAgICogfCBSb3RhdGlvbiAgICB8IERpcmVjdGlvbiAgICB8XG4gICAgICogfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18XG4gICAgICogfCAtOTDCsC8yNzDCsOKGuyAgfCBOb3J0aCAgICAgICAgfFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBjb25zdGFudCB7UElYSS5HRDhTeW1tZXRyeX1cbiAgICAgKi9cbiAgICBOOiA2LFxuICAgIC8qKlxuICAgICAqIHwgUm90YXRpb24gICAgfCBEaXJlY3Rpb24gICAgfFxuICAgICAqIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfFxuICAgICAqIHwgLTQ1wrAvMzE1wrDihrsgIHwgTm9ydGhlYXN0ICAgIHxcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgTkU6IDcsXG4gICAgLyoqXG4gICAgICogUmVmbGVjdGlvbiBhYm91dCBZLWF4aXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5ncm91cEQ4XG4gICAgICogQGNvbnN0YW50IHtQSVhJLkdEOFN5bW1ldHJ5fVxuICAgICAqL1xuICAgIE1JUlJPUl9WRVJUSUNBTDogOCxcbiAgICAvKipcbiAgICAgKiBSZWZsZWN0aW9uIGFib3V0IHRoZSBtYWluIGRpYWdvbmFsLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBjb25zdGFudCB7UElYSS5HRDhTeW1tZXRyeX1cbiAgICAgKi9cbiAgICBNQUlOX0RJQUdPTkFMOiAxMCxcbiAgICAvKipcbiAgICAgKiBSZWZsZWN0aW9uIGFib3V0IFgtYXhpcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgTUlSUk9SX0hPUklaT05UQUw6IDEyLFxuICAgIC8qKlxuICAgICAqIFJlZmxlY3Rpb24gYWJvdXQgcmV2ZXJzZSBkaWFnb25hbC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAY29uc3RhbnQge1BJWEkuR0Q4U3ltbWV0cnl9XG4gICAgICovXG4gICAgUkVWRVJTRV9ESUFHT05BTDogMTQsXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBwYXJhbSB7UElYSS5HRDhTeW1tZXRyeX0gaW5kIC0gc3ByaXRlIHJvdGF0aW9uIGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IFRoZSBYLWNvbXBvbmVudCBvZiB0aGUgVS1heGlzXG4gICAgICogICAgYWZ0ZXIgcm90YXRpbmcgdGhlIGF4ZXMuXG4gICAgICovXG4gICAgdVg6IGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIHV4W2luZF07IH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBwYXJhbSB7UElYSS5HRDhTeW1tZXRyeX0gaW5kIC0gc3ByaXRlIHJvdGF0aW9uIGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IFRoZSBZLWNvbXBvbmVudCBvZiB0aGUgVS1heGlzXG4gICAgICogICAgYWZ0ZXIgcm90YXRpbmcgdGhlIGF4ZXMuXG4gICAgICovXG4gICAgdVk6IGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIHV5W2luZF07IH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBwYXJhbSB7UElYSS5HRDhTeW1tZXRyeX0gaW5kIC0gc3ByaXRlIHJvdGF0aW9uIGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IFRoZSBYLWNvbXBvbmVudCBvZiB0aGUgVi1heGlzXG4gICAgICogICAgYWZ0ZXIgcm90YXRpbmcgdGhlIGF4ZXMuXG4gICAgICovXG4gICAgdlg6IGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIHZ4W2luZF07IH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBwYXJhbSB7UElYSS5HRDhTeW1tZXRyeX0gaW5kIC0gc3ByaXRlIHJvdGF0aW9uIGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IFRoZSBZLWNvbXBvbmVudCBvZiB0aGUgVi1heGlzXG4gICAgICogICAgYWZ0ZXIgcm90YXRpbmcgdGhlIGF4ZXMuXG4gICAgICovXG4gICAgdlk6IGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIHZ5W2luZF07IH0sXG4gICAgLyoqXG4gICAgICogQG1lbWJlcm9mIFBJWEkuZ3JvdXBEOFxuICAgICAqIEBwYXJhbSB7UElYSS5HRDhTeW1tZXRyeX0gcm90YXRpb24gLSBzeW1tZXRyeSB3aG9zZSBvcHBvc2l0ZVxuICAgICAqICAgaXMgbmVlZGVkLiBPbmx5IHJvdGF0aW9ucyBoYXZlIG9wcG9zaXRlIHN5bW1ldHJpZXMgd2hpbGVcbiAgICAgKiAgIHJlZmxlY3Rpb25zIGRvbid0LlxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IFRoZSBvcHBvc2l0ZSBzeW1tZXRyeSBvZiBgcm90YXRpb25gXG4gICAgICovXG4gICAgaW52OiBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICAgICAgaWYgKHJvdGF0aW9uICYgOCkgLy8gdHJ1ZSBvbmx5IGlmIGJldHdlZW4gOCAmIDE1IChyZWZsZWN0aW9ucylcbiAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByb3RhdGlvbiAmIDE1OyAvLyBvciByb3RhdGlvbiAlIDE2XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgtcm90YXRpb24pICYgNzsgLy8gb3IgKDggLSByb3RhdGlvbikgJSA4XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDb21wb3NlcyB0aGUgdHdvIEQ4IG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBUYWtpbmcgYF5gIGFzIHJlZmxlY3Rpb246XG4gICAgICpcbiAgICAgKiB8ICAgICAgIHwgRT0wIHwgUz0yIHwgVz00IHwgTj02IHwgRV49OCB8IFNePTEwIHwgV149MTIgfCBOXj0xNCB8XG4gICAgICogfC0tLS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgICAqIHwgRT0wICAgfCBFICAgfCBTICAgfCBXICAgfCBOICAgfCBFXiAgIHwgU14gICAgfCBXXiAgICB8IE5eICAgIHxcbiAgICAgKiB8IFM9MiAgIHwgUyAgIHwgVyAgIHwgTiAgIHwgRSAgIHwgU14gICB8IFdeICAgIHwgTl4gICAgfCBFXiAgICB8XG4gICAgICogfCBXPTQgICB8IFcgICB8IE4gICB8IEUgICB8IFMgICB8IFdeICAgfCBOXiAgICB8IEVeICAgIHwgU14gICAgfFxuICAgICAqIHwgTj02ICAgfCBOICAgfCBFICAgfCBTICAgfCBXICAgfCBOXiAgIHwgRV4gICAgfCBTXiAgICB8IFdeICAgIHxcbiAgICAgKiB8IEVePTggIHwgRV4gIHwgTl4gIHwgV14gIHwgU14gIHwgRSAgICB8IE4gICAgIHwgVyAgICAgfCBTICAgICB8XG4gICAgICogfCBTXj0xMCB8IFNeICB8IEVeICB8IE5eICB8IFdeICB8IFMgICAgfCBFICAgICB8IE4gICAgIHwgVyAgICAgfFxuICAgICAqIHwgV149MTIgfCBXXiAgfCBTXiAgfCBFXiAgfCBOXiAgfCBXICAgIHwgUyAgICAgfCBFICAgICB8IE4gICAgIHxcbiAgICAgKiB8IE5ePTE0IHwgTl4gIHwgV14gIHwgU14gIHwgRV4gIHwgTiAgICB8IFcgICAgIHwgUyAgICAgfCBFICAgICB8XG4gICAgICpcbiAgICAgKiBbVGhpcyBpcyBhIENheWxleSB0YWJsZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2F5bGV5X3RhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAcGFyYW0ge1BJWEkuR0Q4U3ltbWV0cnl9IHJvdGF0aW9uU2Vjb25kIC0gU2Vjb25kIG9wZXJhdGlvbiwgd2hpY2hcbiAgICAgKiAgIGlzIHRoZSByb3cgaW4gdGhlIGFib3ZlIGNheWxleSB0YWJsZS5cbiAgICAgKiBAcGFyYW0ge1BJWEkuR0Q4U3ltbWV0cnl9IHJvdGF0aW9uRmlyc3QgLSBGaXJzdCBvcGVyYXRpb24sIHdoaWNoXG4gICAgICogICBpcyB0aGUgY29sdW1uIGluIHRoZSBhYm92ZSBjYXlsZXkgdGFibGUuXG4gICAgICogQHJldHVybiB7UElYSS5HRDhTeW1tZXRyeX0gQ29tcG9zZWQgb3BlcmF0aW9uXG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAocm90YXRpb25TZWNvbmQsIHJvdGF0aW9uRmlyc3QpIHsgcmV0dXJuIChyb3RhdGlvbkNheWxleVtyb3RhdGlvblNlY29uZF1bcm90YXRpb25GaXJzdF0pOyB9LFxuICAgIC8qKlxuICAgICAqIFJldmVyc2Ugb2YgYGFkZGAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5ncm91cEQ4XG4gICAgICogQHBhcmFtIHtQSVhJLkdEOFN5bW1ldHJ5fSByb3RhdGlvblNlY29uZCAtIFNlY29uZCBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0ge1BJWEkuR0Q4U3ltbWV0cnl9IHJvdGF0aW9uRmlyc3QgLSBGaXJzdCBvcGVyYXRpb25cbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdEOFN5bW1ldHJ5fSBSZXN1bHRcbiAgICAgKi9cbiAgICBzdWI6IGZ1bmN0aW9uIChyb3RhdGlvblNlY29uZCwgcm90YXRpb25GaXJzdCkgeyByZXR1cm4gKHJvdGF0aW9uQ2F5bGV5W3JvdGF0aW9uU2Vjb25kXVtncm91cEQ4Lmludihyb3RhdGlvbkZpcnN0KV0pOyB9LFxuICAgIC8qKlxuICAgICAqIEFkZHMgMTgwIGRlZ3JlZXMgdG8gcm90YXRpb24sIHdoaWNoIGlzIGEgY29tbXV0YXRpdmVcbiAgICAgKiBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5ncm91cEQ4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0aW9uIC0gVGhlIG51bWJlciB0byByb3RhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUm90YXRlZCBudW1iZXJcbiAgICAgKi9cbiAgICByb3RhdGUxODA6IGZ1bmN0aW9uIChyb3RhdGlvbikgeyByZXR1cm4gcm90YXRpb24gXiA0OyB9LFxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgcm90YXRpb24gYW5nbGUgaXMgdmVydGljYWwsIGkuZS4gc291dGhcbiAgICAgKiBvciBub3J0aC4gSXQgZG9lc24ndCB3b3JrIGZvciByZWZsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAcGFyYW0ge1BJWEkuR0Q4U3ltbWV0cnl9IHJvdGF0aW9uIC0gVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbFxuICAgICAqL1xuICAgIGlzVmVydGljYWw6IGZ1bmN0aW9uIChyb3RhdGlvbikgeyByZXR1cm4gKHJvdGF0aW9uICYgMykgPT09IDI7IH0sXG4gICAgLyoqXG4gICAgICogQXBwcm94aW1hdGVzIHRoZSB2ZWN0b3IgYFYoZHgsZHkpYCBpbnRvIG9uZSBvZiB0aGVcbiAgICAgKiBlaWdodCBkaXJlY3Rpb25zIHByb3ZpZGVkIGJ5IGBncm91cEQ4YC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHggLSBYLWNvbXBvbmVudCBvZiB0aGUgdmVjdG9yXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR5IC0gWS1jb21wb25lbnQgb2YgdGhlIHZlY3RvclxuICAgICAqIEByZXR1cm4ge1BJWEkuR0Q4U3ltbWV0cnl9IEFwcHJveGltYXRpb24gb2YgdGhlIHZlY3RvciBpbnRvXG4gICAgICogIG9uZSBvZiB0aGUgZWlnaHQgc3ltbWV0cmllcy5cbiAgICAgKi9cbiAgICBieURpcmVjdGlvbjogZnVuY3Rpb24gKGR4LCBkeSkge1xuICAgICAgICBpZiAoTWF0aC5hYnMoZHgpICogMiA8PSBNYXRoLmFicyhkeSkpIHtcbiAgICAgICAgICAgIGlmIChkeSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRDguUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBncm91cEQ4Lk47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoZHkpICogMiA8PSBNYXRoLmFicyhkeCkpIHtcbiAgICAgICAgICAgIGlmIChkeCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBEOC5FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGdyb3VwRDguVztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeSA+IDApIHtcbiAgICAgICAgICAgIGlmIChkeCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBEOC5TRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBncm91cEQ4LlNXO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR4ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwRDguTkU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwRDguTlc7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBIZWxwcyBzcHJpdGUgdG8gY29tcGVuc2F0ZSB0ZXh0dXJlIHBhY2tlciByb3RhdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBQSVhJLmdyb3VwRDhcbiAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBtYXRyaXggLSBzcHJpdGUgd29ybGQgbWF0cml4XG4gICAgICogQHBhcmFtIHtQSVhJLkdEOFN5bW1ldHJ5fSByb3RhdGlvbiAtIFRoZSByb3RhdGlvbiBmYWN0b3IgdG8gdXNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0eCAtIHNwcml0ZSBhbmNob3JpbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdHkgLSBzcHJpdGUgYW5jaG9yaW5nXG4gICAgICovXG4gICAgbWF0cml4QXBwZW5kUm90YXRpb25JbnY6IGZ1bmN0aW9uIChtYXRyaXgsIHJvdGF0aW9uLCB0eCwgdHkpIHtcbiAgICAgICAgaWYgKHR4ID09PSB2b2lkIDApIHsgdHggPSAwOyB9XG4gICAgICAgIGlmICh0eSA9PT0gdm9pZCAwKSB7IHR5ID0gMDsgfVxuICAgICAgICAvLyBQYWNrZXIgdXNlZCBcInJvdGF0aW9uXCIsIHdlIHVzZSBcImludihyb3RhdGlvbilcIlxuICAgICAgICB2YXIgbWF0ID0gcm90YXRpb25NYXRyaWNlc1tncm91cEQ4Lmludihyb3RhdGlvbildO1xuICAgICAgICBtYXQudHggPSB0eDtcbiAgICAgICAgbWF0LnR5ID0gdHk7XG4gICAgICAgIG1hdHJpeC5hcHBlbmQobWF0KTtcbiAgICB9LFxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhhdCB0YWtlcyBjYXJlIGFib3V0IGl0cyB2ZXJzaW9uc1xuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRyYW5zZm9ybSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUcmFuc2Zvcm0oKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgd29ybGQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1hdHJpeH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud29ybGRUcmFuc2Zvcm0gPSBuZXcgTWF0cml4KCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1hdHJpeH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubG9jYWxUcmFuc2Zvcm0gPSBuZXcgTWF0cml4KCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgb2JqZWN0IHJlbGF0aXZlIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk9ic2VydmFibGVQb2ludH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgT2JzZXJ2YWJsZVBvaW50KHRoaXMub25DaGFuZ2UsIHRoaXMsIDAsIDApO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNjYWxlIGZhY3RvciBvZiB0aGUgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk9ic2VydmFibGVQb2ludH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2NhbGUgPSBuZXcgT2JzZXJ2YWJsZVBvaW50KHRoaXMub25DaGFuZ2UsIHRoaXMsIDEsIDEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBpdm90IHBvaW50IG9mIHRoZSBkaXNwbGF5T2JqZWN0IHRoYXQgaXQgcm90YXRlcyBhcm91bmQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5waXZvdCA9IG5ldyBPYnNlcnZhYmxlUG9pbnQodGhpcy5vbkNoYW5nZSwgdGhpcywgMCwgMCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2tldyBhbW91bnQsIG9uIHRoZSB4IGFuZCB5IGF4aXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5za2V3ID0gbmV3IE9ic2VydmFibGVQb2ludCh0aGlzLnVwZGF0ZVNrZXcsIHRoaXMsIDAsIDApO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHJvdGF0aW9uIGFtb3VudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgWC1jb29yZGluYXRlIHZhbHVlIG9mIHRoZSBub3JtYWxpemVkIGxvY2FsIFggYXhpcyxcbiAgICAgICAgICogdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IHdpdGhvdXQgYSBzY2FsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jeCA9IDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgWS1jb29yZGluYXRlIHZhbHVlIG9mIHRoZSBub3JtYWxpemVkIGxvY2FsIFggYXhpcyxcbiAgICAgICAgICogdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IHdpdGhvdXQgYSBzY2FsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zeCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgWC1jb29yZGluYXRlIHZhbHVlIG9mIHRoZSBub3JtYWxpemVkIGxvY2FsIFkgYXhpcyxcbiAgICAgICAgICogdGhlIHNlY29uZCBjb2x1bW4gb2YgdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB3aXRob3V0IGEgc2NhbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fY3kgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFktY29vcmRpbmF0ZSB2YWx1ZSBvZiB0aGUgbm9ybWFsaXplZCBsb2NhbCBZIGF4aXMsXG4gICAgICAgICAqIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggd2l0aG91dCBhIHNjYWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3N5ID0gMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBsb2NhbGx5IHVuaXF1ZSBJRCBvZiB0aGUgbG9jYWwgdHJhbnNmb3JtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2xvY2FsSUQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxvY2FsbHkgdW5pcXVlIElEIG9mIHRoZSBsb2NhbCB0cmFuc2Zvcm1cbiAgICAgICAgICogdXNlZCB0byBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2N1cnJlbnRMb2NhbElEID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBsb2NhbGx5IHVuaXF1ZSBJRCBvZiB0aGUgd29ybGQgdHJhbnNmb3JtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3dvcmxkSUQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxvY2FsbHkgdW5pcXVlIElEIG9mIHRoZSBwYXJlbnQncyB3b3JsZCB0cmFuc2Zvcm1cbiAgICAgICAgICogdXNlZCB0byBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgd29ybGQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3BhcmVudElEID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsSUQrKztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBza2V3IG9yIHRoZSByb3RhdGlvbiBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUudXBkYXRlU2tldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY3ggPSBNYXRoLmNvcyh0aGlzLl9yb3RhdGlvbiArIHRoaXMuc2tldy55KTtcbiAgICAgICAgdGhpcy5fc3ggPSBNYXRoLnNpbih0aGlzLl9yb3RhdGlvbiArIHRoaXMuc2tldy55KTtcbiAgICAgICAgdGhpcy5fY3kgPSAtTWF0aC5zaW4odGhpcy5fcm90YXRpb24gLSB0aGlzLnNrZXcueCk7IC8vIGNvcywgYWRkZWQgUEkvMlxuICAgICAgICB0aGlzLl9zeSA9IE1hdGguY29zKHRoaXMuX3JvdGF0aW9uIC0gdGhpcy5za2V3LngpOyAvLyBzaW4sIGFkZGVkIFBJLzJcbiAgICAgICAgdGhpcy5fbG9jYWxJRCsrO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxuICAgICAqL1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUudXBkYXRlTG9jYWxUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsdCA9IHRoaXMubG9jYWxUcmFuc2Zvcm07XG4gICAgICAgIGlmICh0aGlzLl9sb2NhbElEICE9PSB0aGlzLl9jdXJyZW50TG9jYWxJRCkge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBtYXRyaXggdmFsdWVzIG9mIHRoZSBkaXNwbGF5b2JqZWN0IGJhc2VkIG9uIGl0cyB0cmFuc2Zvcm0gcHJvcGVydGllcy4uXG4gICAgICAgICAgICBsdC5hID0gdGhpcy5fY3ggKiB0aGlzLnNjYWxlLng7XG4gICAgICAgICAgICBsdC5iID0gdGhpcy5fc3ggKiB0aGlzLnNjYWxlLng7XG4gICAgICAgICAgICBsdC5jID0gdGhpcy5fY3kgKiB0aGlzLnNjYWxlLnk7XG4gICAgICAgICAgICBsdC5kID0gdGhpcy5fc3kgKiB0aGlzLnNjYWxlLnk7XG4gICAgICAgICAgICBsdC50eCA9IHRoaXMucG9zaXRpb24ueCAtICgodGhpcy5waXZvdC54ICogbHQuYSkgKyAodGhpcy5waXZvdC55ICogbHQuYykpO1xuICAgICAgICAgICAgbHQudHkgPSB0aGlzLnBvc2l0aW9uLnkgLSAoKHRoaXMucGl2b3QueCAqIGx0LmIpICsgKHRoaXMucGl2b3QueSAqIGx0LmQpKTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMb2NhbElEID0gdGhpcy5fbG9jYWxJRDtcbiAgICAgICAgICAgIC8vIGZvcmNlIGFuIHVwZGF0ZS4uXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnRJRCA9IC0xO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBsb2NhbCBhbmQgdGhlIHdvcmxkIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlRyYW5zZm9ybX0gcGFyZW50VHJhbnNmb3JtIC0gVGhlIHBhcmVudCB0cmFuc2Zvcm1cbiAgICAgKi9cbiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIChwYXJlbnRUcmFuc2Zvcm0pIHtcbiAgICAgICAgdmFyIGx0ID0gdGhpcy5sb2NhbFRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHRoaXMuX2xvY2FsSUQgIT09IHRoaXMuX2N1cnJlbnRMb2NhbElEKSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIG1hdHJpeCB2YWx1ZXMgb2YgdGhlIGRpc3BsYXlvYmplY3QgYmFzZWQgb24gaXRzIHRyYW5zZm9ybSBwcm9wZXJ0aWVzLi5cbiAgICAgICAgICAgIGx0LmEgPSB0aGlzLl9jeCAqIHRoaXMuc2NhbGUueDtcbiAgICAgICAgICAgIGx0LmIgPSB0aGlzLl9zeCAqIHRoaXMuc2NhbGUueDtcbiAgICAgICAgICAgIGx0LmMgPSB0aGlzLl9jeSAqIHRoaXMuc2NhbGUueTtcbiAgICAgICAgICAgIGx0LmQgPSB0aGlzLl9zeSAqIHRoaXMuc2NhbGUueTtcbiAgICAgICAgICAgIGx0LnR4ID0gdGhpcy5wb3NpdGlvbi54IC0gKCh0aGlzLnBpdm90LnggKiBsdC5hKSArICh0aGlzLnBpdm90LnkgKiBsdC5jKSk7XG4gICAgICAgICAgICBsdC50eSA9IHRoaXMucG9zaXRpb24ueSAtICgodGhpcy5waXZvdC54ICogbHQuYikgKyAodGhpcy5waXZvdC55ICogbHQuZCkpO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudExvY2FsSUQgPSB0aGlzLl9sb2NhbElEO1xuICAgICAgICAgICAgLy8gZm9yY2UgYW4gdXBkYXRlLi5cbiAgICAgICAgICAgIHRoaXMuX3BhcmVudElEID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudElEICE9PSBwYXJlbnRUcmFuc2Zvcm0uX3dvcmxkSUQpIHtcbiAgICAgICAgICAgIC8vIGNvbmNhdCB0aGUgcGFyZW50IG1hdHJpeCB3aXRoIHRoZSBvYmplY3RzIHRyYW5zZm9ybS5cbiAgICAgICAgICAgIHZhciBwdCA9IHBhcmVudFRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybTtcbiAgICAgICAgICAgIHZhciB3dCA9IHRoaXMud29ybGRUcmFuc2Zvcm07XG4gICAgICAgICAgICB3dC5hID0gKGx0LmEgKiBwdC5hKSArIChsdC5iICogcHQuYyk7XG4gICAgICAgICAgICB3dC5iID0gKGx0LmEgKiBwdC5iKSArIChsdC5iICogcHQuZCk7XG4gICAgICAgICAgICB3dC5jID0gKGx0LmMgKiBwdC5hKSArIChsdC5kICogcHQuYyk7XG4gICAgICAgICAgICB3dC5kID0gKGx0LmMgKiBwdC5iKSArIChsdC5kICogcHQuZCk7XG4gICAgICAgICAgICB3dC50eCA9IChsdC50eCAqIHB0LmEpICsgKGx0LnR5ICogcHQuYykgKyBwdC50eDtcbiAgICAgICAgICAgIHd0LnR5ID0gKGx0LnR4ICogcHQuYikgKyAobHQudHkgKiBwdC5kKSArIHB0LnR5O1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50SUQgPSBwYXJlbnRUcmFuc2Zvcm0uX3dvcmxkSUQ7XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGlkIG9mIHRoZSB0cmFuc2Zvcm0uLlxuICAgICAgICAgICAgdGhpcy5fd29ybGRJRCsrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWNvbXBvc2VzIGEgbWF0cml4IGFuZCBzZXRzIHRoZSB0cmFuc2Zvcm1zIHByb3BlcnRpZXMgYmFzZWQgb24gaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBtYXRyaXggLSBUaGUgbWF0cml4IHRvIGRlY29tcG9zZVxuICAgICAqL1xuICAgIFRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RnJvbU1hdHJpeCA9IGZ1bmN0aW9uIChtYXRyaXgpIHtcbiAgICAgICAgbWF0cml4LmRlY29tcG9zZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fbG9jYWxJRCsrO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zZm9ybS5wcm90b3R5cGUsIFwicm90YXRpb25cIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHJvdGF0aW9uIG9mIHRoZSBvYmplY3QgaW4gcmFkaWFucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm90YXRpb24gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm90YXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNrZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQSBkZWZhdWx0IChpZGVudGl0eSkgdHJhbnNmb3JtXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGNvbnN0YW50XG4gICAgICogQG1lbWJlciB7UElYSS5UcmFuc2Zvcm19XG4gICAgICovXG4gICAgVHJhbnNmb3JtLklERU5USVRZID0gbmV3IFRyYW5zZm9ybSgpO1xuICAgIHJldHVybiBUcmFuc2Zvcm07XG59KCkpO1xuXG4vKipcbiAqIFNpemUgb2JqZWN0LCBjb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0XG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElTaXplXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBXaWR0aCBjb21wb25lbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgY29tcG9uZW50XG4gKi9cbi8qKlxuICogUmVjdGFuZ2xlIG9iamVjdCBpcyBhbiBhcmVhIGRlZmluZWQgYnkgaXRzIHBvc2l0aW9uLCBhcyBpbmRpY2F0ZWQgYnkgaXRzIHRvcC1sZWZ0IGNvcm5lclxuICogcG9pbnQgKHgsIHkpIGFuZCBieSBpdHMgd2lkdGggYW5kIGl0cyBoZWlnaHQuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgUmVjdGFuZ2xlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0wXSAtIFRoZSBvdmVyYWxsIHdpZHRoIG9mIHRoaXMgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MF0gLSBUaGUgb3ZlcmFsbCBoZWlnaHQgb2YgdGhpcyByZWN0YW5nbGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAoeCA9PT0gdm9pZCAwKSB7IHggPSAwOyB9XG4gICAgICAgIGlmICh5ID09PSB2b2lkIDApIHsgeSA9IDA7IH1cbiAgICAgICAgaWYgKHdpZHRoID09PSB2b2lkIDApIHsgd2lkdGggPSAwOyB9XG4gICAgICAgIGlmIChoZWlnaHQgPT09IHZvaWQgMCkgeyBoZWlnaHQgPSAwOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMueCA9IE51bWJlcih4KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy55ID0gTnVtYmVyKHkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndpZHRoID0gTnVtYmVyKHdpZHRoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBOdW1iZXIoaGVpZ2h0KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIG1haW5seSB1c2VkIHRvIGF2b2lkIGBpbnN0YW5jZW9mYCBjaGVja3NcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5TSEFQRVMuUkVDVFxuICAgICAgICAgKiBAc2VlIFBJWEkuU0hBUEVTXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBTSEFQRVMuUkVDVDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY3RhbmdsZS5wcm90b3R5cGUsIFwibGVmdFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiByZXR1cm5zIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWN0YW5nbGUucHJvdG90eXBlLCBcInJpZ2h0XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJldHVybnMgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjdGFuZ2xlLnByb3RvdHlwZSwgXCJ0b3BcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogcmV0dXJucyB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHJlY3RhbmdsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWN0YW5nbGUucHJvdG90eXBlLCBcImJvdHRvbVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiByZXR1cm5zIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjdGFuZ2xlLCBcIkVNUFRZXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgY29uc3RhbnQgZW1wdHkgcmVjdGFuZ2xlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBjb25zdGFudFxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlJlY3RhbmdsZX1cbiAgICAgICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IEFuIGVtcHR5IHJlY3RhbmdsZVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoaXMgUmVjdGFuZ2xlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gYSBjb3B5IG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKi9cbiAgICBSZWN0YW5nbGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29waWVzIGFub3RoZXIgcmVjdGFuZ2xlIHRvIHRoaXMgb25lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gcmVjdGFuZ2xlIC0gVGhlIHJlY3RhbmdsZSB0byBjb3B5IGZyb20uXG4gICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IFJldHVybnMgaXRzZWxmLlxuICAgICAqL1xuICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuY29weUZyb20gPSBmdW5jdGlvbiAocmVjdGFuZ2xlKSB7XG4gICAgICAgIHRoaXMueCA9IHJlY3RhbmdsZS54O1xuICAgICAgICB0aGlzLnkgPSByZWN0YW5nbGUueTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHJlY3RhbmdsZS53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSByZWN0YW5nbGUuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGlzIHJlY3RhbmdsZSB0byBhbm90aGVyIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IHJlY3RhbmdsZSAtIFRoZSByZWN0YW5nbGUgdG8gY29weSB0by5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gUmV0dXJucyBnaXZlbiBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5jb3B5VG8gPSBmdW5jdGlvbiAocmVjdGFuZ2xlKSB7XG4gICAgICAgIHJlY3RhbmdsZS54ID0gdGhpcy54O1xuICAgICAgICByZWN0YW5nbGUueSA9IHRoaXMueTtcbiAgICAgICAgcmVjdGFuZ2xlLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgcmVjdGFuZ2xlLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gcmVjdGFuZ2xlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgZ2l2ZW4gYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBSZWN0YW5nbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHgveSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoaXMgUmVjdGFuZ2xlXG4gICAgICovXG4gICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGlmICh0aGlzLndpZHRoIDw9IDAgfHwgdGhpcy5oZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID49IHRoaXMueCAmJiB4IDwgdGhpcy54ICsgdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgaWYgKHkgPj0gdGhpcy55ICYmIHkgPCB0aGlzLnkgKyB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhZHMgdGhlIHJlY3RhbmdsZSBtYWtpbmcgaXQgZ3JvdyBpbiBhbGwgZGlyZWN0aW9ucy5cbiAgICAgKiBJZiBwYWRkaW5nWSBpcyBvbWl0dGVkLCBib3RoIHBhZGRpbmdYIGFuZCBwYWRkaW5nWSB3aWxsIGJlIHNldCB0byBwYWRkaW5nWC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFkZGluZ1g9MF0gLSBUaGUgaG9yaXpvbnRhbCBwYWRkaW5nIGFtb3VudC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZGRpbmdZPTBdIC0gVGhlIHZlcnRpY2FsIHBhZGRpbmcgYW1vdW50LlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVjdGFuZ2xlfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBSZWN0YW5nbGUucHJvdG90eXBlLnBhZCA9IGZ1bmN0aW9uIChwYWRkaW5nWCwgcGFkZGluZ1kpIHtcbiAgICAgICAgaWYgKHBhZGRpbmdYID09PSB2b2lkIDApIHsgcGFkZGluZ1ggPSAwOyB9XG4gICAgICAgIGlmIChwYWRkaW5nWSA9PT0gdm9pZCAwKSB7IHBhZGRpbmdZID0gcGFkZGluZ1g7IH1cbiAgICAgICAgdGhpcy54IC09IHBhZGRpbmdYO1xuICAgICAgICB0aGlzLnkgLT0gcGFkZGluZ1k7XG4gICAgICAgIHRoaXMud2lkdGggKz0gcGFkZGluZ1ggKiAyO1xuICAgICAgICB0aGlzLmhlaWdodCArPSBwYWRkaW5nWSAqIDI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRml0cyB0aGlzIHJlY3RhbmdsZSBhcm91bmQgdGhlIHBhc3NlZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSByZWN0YW5nbGUgLSBUaGUgcmVjdGFuZ2xlIHRvIGZpdC5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5maXQgPSBmdW5jdGlvbiAocmVjdGFuZ2xlKSB7XG4gICAgICAgIHZhciB4MSA9IE1hdGgubWF4KHRoaXMueCwgcmVjdGFuZ2xlLngpO1xuICAgICAgICB2YXIgeDIgPSBNYXRoLm1pbih0aGlzLnggKyB0aGlzLndpZHRoLCByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgIHZhciB5MSA9IE1hdGgubWF4KHRoaXMueSwgcmVjdGFuZ2xlLnkpO1xuICAgICAgICB2YXIgeTIgPSBNYXRoLm1pbih0aGlzLnkgKyB0aGlzLmhlaWdodCwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy54ID0geDE7XG4gICAgICAgIHRoaXMud2lkdGggPSBNYXRoLm1heCh4MiAtIHgxLCAwKTtcbiAgICAgICAgdGhpcy55ID0geTE7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoeTIgLSB5MSwgMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5sYXJnZXMgcmVjdGFuZ2xlIHRoYXQgd2F5IGl0cyBjb3JuZXJzIGxpZSBvbiBncmlkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb249MV0gcmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZXBzPTAuMDAxXSBwcmVjaXNpb25cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5jZWlsID0gZnVuY3Rpb24gKHJlc29sdXRpb24sIGVwcykge1xuICAgICAgICBpZiAocmVzb2x1dGlvbiA9PT0gdm9pZCAwKSB7IHJlc29sdXRpb24gPSAxOyB9XG4gICAgICAgIGlmIChlcHMgPT09IHZvaWQgMCkgeyBlcHMgPSAwLjAwMTsgfVxuICAgICAgICB2YXIgeDIgPSBNYXRoLmNlaWwoKHRoaXMueCArIHRoaXMud2lkdGggLSBlcHMpICogcmVzb2x1dGlvbikgLyByZXNvbHV0aW9uO1xuICAgICAgICB2YXIgeTIgPSBNYXRoLmNlaWwoKHRoaXMueSArIHRoaXMuaGVpZ2h0IC0gZXBzKSAqIHJlc29sdXRpb24pIC8gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5mbG9vcigodGhpcy54ICsgZXBzKSAqIHJlc29sdXRpb24pIC8gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5mbG9vcigodGhpcy55ICsgZXBzKSAqIHJlc29sdXRpb24pIC8gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy53aWR0aCA9IHgyIC0gdGhpcy54O1xuICAgICAgICB0aGlzLmhlaWdodCA9IHkyIC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVubGFyZ2VzIHRoaXMgcmVjdGFuZ2xlIHRvIGluY2x1ZGUgdGhlIHBhc3NlZCByZWN0YW5nbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSByZWN0YW5nbGUgLSBUaGUgcmVjdGFuZ2xlIHRvIGluY2x1ZGUuXG4gICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IFJldHVybnMgaXRzZWxmLlxuICAgICAqL1xuICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuZW5sYXJnZSA9IGZ1bmN0aW9uIChyZWN0YW5nbGUpIHtcbiAgICAgICAgdmFyIHgxID0gTWF0aC5taW4odGhpcy54LCByZWN0YW5nbGUueCk7XG4gICAgICAgIHZhciB4MiA9IE1hdGgubWF4KHRoaXMueCArIHRoaXMud2lkdGgsIHJlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoKTtcbiAgICAgICAgdmFyIHkxID0gTWF0aC5taW4odGhpcy55LCByZWN0YW5nbGUueSk7XG4gICAgICAgIHZhciB5MiA9IE1hdGgubWF4KHRoaXMueSArIHRoaXMuaGVpZ2h0LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQpO1xuICAgICAgICB0aGlzLnggPSB4MTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHgyIC0geDE7XG4gICAgICAgIHRoaXMueSA9IHkxO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIFJlY3RhbmdsZTtcbn0oKSk7XG5cbi8qKlxuICogVGhlIENpcmNsZSBvYmplY3QgaXMgdXNlZCB0byBoZWxwIGRyYXcgZ3JhcGhpY3MgYW5kIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGhpdCBhcmVhIGZvciBkaXNwbGF5T2JqZWN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBDaXJjbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoaXMgY2lyY2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoaXMgY2lyY2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gLSBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBDaXJjbGUoeCwgeSwgcmFkaXVzKSB7XG4gICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IDA7IH1cbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0gMDsgfVxuICAgICAgICBpZiAocmFkaXVzID09PSB2b2lkIDApIHsgcmFkaXVzID0gMDsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIG1haW5seSB1c2VkIHRvIGF2b2lkIGBpbnN0YW5jZW9mYCBjaGVja3NcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5TSEFQRVMuQ0lSQ1xuICAgICAgICAgKiBAc2VlIFBJWEkuU0hBUEVTXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBTSEFQRVMuQ0lSQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoaXMgQ2lyY2xlIGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkNpcmNsZX0gYSBjb3B5IG9mIHRoZSBDaXJjbGVcbiAgICAgKi9cbiAgICBDaXJjbGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IENpcmNsZSh0aGlzLngsIHRoaXMueSwgdGhpcy5yYWRpdXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgZ2l2ZW4gYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjaXJjbGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHgveSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoaXMgQ2lyY2xlXG4gICAgICovXG4gICAgQ2lyY2xlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGlmICh0aGlzLnJhZGl1cyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHIyID0gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cztcbiAgICAgICAgdmFyIGR4ID0gKHRoaXMueCAtIHgpO1xuICAgICAgICB2YXIgZHkgPSAodGhpcy55IC0geSk7XG4gICAgICAgIGR4ICo9IGR4O1xuICAgICAgICBkeSAqPSBkeTtcbiAgICAgICAgcmV0dXJuIChkeCArIGR5IDw9IHIyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZnJhbWluZyByZWN0YW5nbGUgb2YgdGhlIGNpcmNsZSBhcyBhIFJlY3RhbmdsZSBvYmplY3RcbiAgICAqXG4gICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gdGhlIGZyYW1pbmcgcmVjdGFuZ2xlXG4gICAgKi9cbiAgICBDaXJjbGUucHJvdG90eXBlLmdldEJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUodGhpcy54IC0gdGhpcy5yYWRpdXMsIHRoaXMueSAtIHRoaXMucmFkaXVzLCB0aGlzLnJhZGl1cyAqIDIsIHRoaXMucmFkaXVzICogMik7XG4gICAgfTtcbiAgICByZXR1cm4gQ2lyY2xlO1xufSgpKTtcblxuLyoqXG4gKiBUaGUgRWxsaXBzZSBvYmplY3QgaXMgdXNlZCB0byBoZWxwIGRyYXcgZ3JhcGhpY3MgYW5kIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGhpdCBhcmVhIGZvciBkaXNwbGF5T2JqZWN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBFbGxpcHNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGlzIGVsbGlwc2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhpcyBlbGxpcHNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoYWxmV2lkdGg9MF0gLSBUaGUgaGFsZiB3aWR0aCBvZiB0aGlzIGVsbGlwc2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hhbGZIZWlnaHQ9MF0gLSBUaGUgaGFsZiBoZWlnaHQgb2YgdGhpcyBlbGxpcHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gRWxsaXBzZSh4LCB5LCBoYWxmV2lkdGgsIGhhbGZIZWlnaHQpIHtcbiAgICAgICAgaWYgKHggPT09IHZvaWQgMCkgeyB4ID0gMDsgfVxuICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSAwOyB9XG4gICAgICAgIGlmIChoYWxmV2lkdGggPT09IHZvaWQgMCkgeyBoYWxmV2lkdGggPSAwOyB9XG4gICAgICAgIGlmIChoYWxmSGVpZ2h0ID09PSB2b2lkIDApIHsgaGFsZkhlaWdodCA9IDA7IH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IGhhbGZXaWR0aDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoYWxmSGVpZ2h0O1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIG9iamVjdCwgbWFpbmx5IHVzZWQgdG8gYXZvaWQgYGluc3RhbmNlb2ZgIGNoZWNrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAgKiBAZGVmYXVsdCBQSVhJLlNIQVBFUy5FTElQXG4gICAgICAgICAqIEBzZWUgUElYSS5TSEFQRVNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IFNIQVBFUy5FTElQO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhpcyBFbGxpcHNlIGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkVsbGlwc2V9IGEgY29weSBvZiB0aGUgZWxsaXBzZVxuICAgICAqL1xuICAgIEVsbGlwc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEVsbGlwc2UodGhpcy54LCB0aGlzLnksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGdpdmVuIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgZWxsaXBzZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byB0ZXN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byB0ZXN0XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgeC95IGNvb3JkcyBhcmUgd2l0aGluIHRoaXMgZWxsaXBzZVxuICAgICAqL1xuICAgIEVsbGlwc2UucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHRoaXMud2lkdGggPD0gMCB8fCB0aGlzLmhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm9ybWFsaXplIHRoZSBjb29yZHMgdG8gYW4gZWxsaXBzZSB3aXRoIGNlbnRlciAwLDBcbiAgICAgICAgdmFyIG5vcm14ID0gKCh4IC0gdGhpcy54KSAvIHRoaXMud2lkdGgpO1xuICAgICAgICB2YXIgbm9ybXkgPSAoKHkgLSB0aGlzLnkpIC8gdGhpcy5oZWlnaHQpO1xuICAgICAgICBub3JteCAqPSBub3JteDtcbiAgICAgICAgbm9ybXkgKj0gbm9ybXk7XG4gICAgICAgIHJldHVybiAobm9ybXggKyBub3JteSA8PSAxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZyYW1pbmcgcmVjdGFuZ2xlIG9mIHRoZSBlbGxpcHNlIGFzIGEgUmVjdGFuZ2xlIG9iamVjdFxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IHRoZSBmcmFtaW5nIHJlY3RhbmdsZVxuICAgICAqL1xuICAgIEVsbGlwc2UucHJvdG90eXBlLmdldEJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUodGhpcy54IC0gdGhpcy53aWR0aCwgdGhpcy55IC0gdGhpcy5oZWlnaHQsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9O1xuICAgIHJldHVybiBFbGxpcHNlO1xufSgpKTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIGRlZmluZSBhIHNoYXBlIHZpYSB1c2VyIGRlZmluZWQgY28tb3JpbmF0ZXMuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgUG9seWdvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BJWEkuUG9pbnRbXXxudW1iZXJbXXxudW1iZXJbXVtdfSBwb2ludHMgLSBUaGlzIGNhbiBiZSBhbiBhcnJheSBvZiBQb2ludHNcbiAgICAgKiAgdGhhdCBmb3JtIHRoZSBwb2x5Z29uLCBhIGZsYXQgYXJyYXkgb2YgbnVtYmVycyB0aGF0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgW3gseSwgeCx5LCAuLi5dLCBvclxuICAgICAqICB0aGUgYXJndW1lbnRzIHBhc3NlZCBjYW4gYmUgYWxsIHRoZSBwb2ludHMgb2YgdGhlIHBvbHlnb24gZS5nLlxuICAgICAqICBgbmV3IFBJWEkuUG9seWdvbihuZXcgUElYSS5Qb2ludCgpLCBuZXcgUElYSS5Qb2ludCgpLCAuLi4pYCwgb3IgdGhlIGFyZ3VtZW50cyBwYXNzZWQgY2FuIGJlIGZsYXRcbiAgICAgKiAgeCx5IHZhbHVlcyBlLmcuIGBuZXcgUG9seWdvbih4LHksIHgseSwgeCx5LCAuLi4pYCB3aGVyZSBgeGAgYW5kIGB5YCBhcmUgTnVtYmVycy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQb2x5Z29uKCkge1xuICAgICAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgdmFyIHBvaW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgcG9pbnRzW19pXSA9IGFyZ3VtZW50cyQxW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBwb2ludHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBhcnJheSBvZiBwb2ludHMsIGNvbnZlcnQgaXQgdG8gYSBmbGF0IGFycmF5IG9mIG51bWJlcnNcbiAgICAgICAgaWYgKHBvaW50c1swXSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgICAgICBwb2ludHMgPSBwb2ludHM7XG4gICAgICAgICAgICB2YXIgcCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwLnB1c2gocG9pbnRzW2ldLngsIHBvaW50c1tpXS55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvaW50cyA9IHA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGFycmF5IG9mIHRoZSBwb2ludHMgb2YgdGhpcyBwb2x5Z29uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcltdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LCBtYWlubHkgdXNlZCB0byBhdm9pZCBgaW5zdGFuY2VvZmAgY2hlY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuU0hBUEVTLlBPTFlcbiAgICAgICAgICogQHNlZSBQSVhJLlNIQVBFU1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gU0hBUEVTLlBPTFk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgZmFsc2VgIGFmdGVyIG1vdmVUbywgYHRydWVgIGFmdGVyIGBjbG9zZVBhdGhgLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgYHRydWVgLlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlU3Ryb2tlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoaXMgcG9seWdvblxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5Qb2x5Z29ufSBhIGNvcHkgb2YgdGhlIHBvbHlnb25cbiAgICAgKi9cbiAgICBQb2x5Z29uLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzLnNsaWNlKCk7XG4gICAgICAgIHZhciBwb2x5Z29uID0gbmV3IFBvbHlnb24ocG9pbnRzKTtcbiAgICAgICAgcG9seWdvbi5jbG9zZVN0cm9rZSA9IHRoaXMuY2xvc2VTdHJva2U7XG4gICAgICAgIHJldHVybiBwb2x5Z29uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBwb2x5Z29uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRlc3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRlc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB4L3kgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGlzIHBvbHlnb25cbiAgICAgKi9cbiAgICBQb2x5Z29uLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIHZhciBpbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgLy8gdXNlIHNvbWUgcmF5Y2FzdGluZyB0byB0ZXN0IGhpdHNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL3BvaW50LWluLXBvbHlnb24vYmxvYi9tYXN0ZXIvaW5kZXguanNcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucG9pbnRzLmxlbmd0aCAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gbGVuZ3RoIC0gMTsgaSA8IGxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICAgICAgdmFyIHhpID0gdGhpcy5wb2ludHNbaSAqIDJdO1xuICAgICAgICAgICAgdmFyIHlpID0gdGhpcy5wb2ludHNbKGkgKiAyKSArIDFdO1xuICAgICAgICAgICAgdmFyIHhqID0gdGhpcy5wb2ludHNbaiAqIDJdO1xuICAgICAgICAgICAgdmFyIHlqID0gdGhpcy5wb2ludHNbKGogKiAyKSArIDFdO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPT0gKHlqID4geSkpICYmICh4IDwgKCh4aiAtIHhpKSAqICgoeSAtIHlpKSAvICh5aiAtIHlpKSkpICsgeGkpO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdCkge1xuICAgICAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9O1xuICAgIHJldHVybiBQb2x5Z29uO1xufSgpKTtcblxuLyoqXG4gKiBUaGUgUm91bmRlZCBSZWN0YW5nbGUgb2JqZWN0IGlzIGFuIGFyZWEgdGhhdCBoYXMgbmljZSByb3VuZGVkIGNvcm5lcnMsIGFzIGluZGljYXRlZCBieSBpdHNcbiAqIHRvcC1sZWZ0IGNvcm5lciBwb2ludCAoeCwgeSkgYW5kIGJ5IGl0cyB3aWR0aCBhbmQgaXRzIGhlaWdodCBhbmQgaXRzIHJhZGl1cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBSb3VuZGVkUmVjdGFuZ2xlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSByb3VuZGVkIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSByb3VuZGVkIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MF0gLSBUaGUgb3ZlcmFsbCB3aWR0aCBvZiB0aGlzIHJvdW5kZWQgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MF0gLSBUaGUgb3ZlcmFsbCBoZWlnaHQgb2YgdGhpcyByb3VuZGVkIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTIwXSAtIENvbnRyb2xzIHRoZSByYWRpdXMgb2YgdGhlIHJvdW5kZWQgY29ybmVyc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJvdW5kZWRSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IDA7IH1cbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0gMDsgfVxuICAgICAgICBpZiAod2lkdGggPT09IHZvaWQgMCkgeyB3aWR0aCA9IDA7IH1cbiAgICAgICAgaWYgKGhlaWdodCA9PT0gdm9pZCAwKSB7IGhlaWdodCA9IDA7IH1cbiAgICAgICAgaWYgKHJhZGl1cyA9PT0gdm9pZCAwKSB7IHJhZGl1cyA9IDIwOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QsIG1haW5seSB1c2VkIHRvIGF2b2lkIGBpbnN0YW5jZW9mYCBjaGVja3NcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5TSEFQRVMuUlJFQ1xuICAgICAgICAgKiBAc2VlIFBJWEkuU0hBUEVTXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBTSEFQRVMuUlJFQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoaXMgUm91bmRlZCBSZWN0YW5nbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1BJWEkuUm91bmRlZFJlY3RhbmdsZX0gYSBjb3B5IG9mIHRoZSByb3VuZGVkIHJlY3RhbmdsZVxuICAgICAqL1xuICAgIFJvdW5kZWRSZWN0YW5nbGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJvdW5kZWRSZWN0YW5nbGUodGhpcy54LCB0aGlzLnksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCB0aGlzLnJhZGl1cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBnaXZlbiBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIFJvdW5kZWQgUmVjdGFuZ2xlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRlc3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRlc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB4L3kgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGlzIFJvdW5kZWQgUmVjdGFuZ2xlXG4gICAgICovXG4gICAgUm91bmRlZFJlY3RhbmdsZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBpZiAodGhpcy53aWR0aCA8PSAwIHx8IHRoaXMuaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCA+PSB0aGlzLnggJiYgeCA8PSB0aGlzLnggKyB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICBpZiAoeSA+PSB0aGlzLnkgJiYgeSA8PSB0aGlzLnkgKyB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGlmICgoeSA+PSB0aGlzLnkgKyB0aGlzLnJhZGl1cyAmJiB5IDw9IHRoaXMueSArIHRoaXMuaGVpZ2h0IC0gdGhpcy5yYWRpdXMpXG4gICAgICAgICAgICAgICAgICAgIHx8ICh4ID49IHRoaXMueCArIHRoaXMucmFkaXVzICYmIHggPD0gdGhpcy54ICsgdGhpcy53aWR0aCAtIHRoaXMucmFkaXVzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGR4ID0geCAtICh0aGlzLnggKyB0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgICAgICAgdmFyIGR5ID0geSAtICh0aGlzLnkgKyB0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGl1czIgPSB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzO1xuICAgICAgICAgICAgICAgIGlmICgoZHggKiBkeCkgKyAoZHkgKiBkeSkgPD0gcmFkaXVzMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZHggPSB4IC0gKHRoaXMueCArIHRoaXMud2lkdGggLSB0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgICAgICAgaWYgKChkeCAqIGR4KSArIChkeSAqIGR5KSA8PSByYWRpdXMyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkeSA9IHkgLSAodGhpcy55ICsgdGhpcy5oZWlnaHQgLSB0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgICAgICAgaWYgKChkeCAqIGR4KSArIChkeSAqIGR5KSA8PSByYWRpdXMyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkeCA9IHggLSAodGhpcy54ICsgdGhpcy5yYWRpdXMpO1xuICAgICAgICAgICAgICAgIGlmICgoZHggKiBkeCkgKyAoZHkgKiBkeSkgPD0gcmFkaXVzMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIFJvdW5kZWRSZWN0YW5nbGU7XG59KCkpO1xuXG4vKipcbiAqIE1hdGggY2xhc3NlcyBhbmQgdXRpbGl0aWVzIG1peGVkIGludG8gUElYSSBuYW1lc3BhY2UuXG4gKlxuICogQGxlbmRzIFBJWElcbiAqL1xuXG5leHBvcnQgeyBDaXJjbGUsIERFR19UT19SQUQsIEVsbGlwc2UsIE1hdHJpeCwgT2JzZXJ2YWJsZVBvaW50LCBQSV8yLCBQb2ludCwgUG9seWdvbiwgUkFEX1RPX0RFRywgUmVjdGFuZ2xlLCBSb3VuZGVkUmVjdGFuZ2xlLCBTSEFQRVMsIFRyYW5zZm9ybSwgZ3JvdXBEOCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0aC5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvZGlzcGxheSAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9kaXNwbGF5IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tICdAcGl4aS9zZXR0aW5ncyc7XG5pbXBvcnQgeyBSZWN0YW5nbGUsIFJBRF9UT19ERUcsIERFR19UT19SQUQsIFRyYW5zZm9ybSB9IGZyb20gJ0BwaXhpL21hdGgnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCByZW1vdmVJdGVtcyB9IGZyb20gJ0BwaXhpL3V0aWxzJztcblxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY29udGFpbmVyIHByb3BlcnR5ICdzb3J0YWJsZUNoaWxkcmVuJy5cbiAqIElmIHNldCB0byB0cnVlLCB0aGUgY29udGFpbmVyIHdpbGwgc29ydCBpdHMgY2hpbGRyZW4gYnkgekluZGV4IHZhbHVlXG4gKiB3aGVuIHVwZGF0ZVRyYW5zZm9ybSgpIGlzIGNhbGxlZCwgb3IgbWFudWFsbHkgaWYgc29ydENoaWxkcmVuKCkgaXMgY2FsbGVkLlxuICpcbiAqIFRoaXMgYWN0dWFsbHkgY2hhbmdlcyB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LCBzbyBzaG91bGQgYmUgdHJlYXRlZFxuICogYXMgYSBiYXNpYyBzb2x1dGlvbiB0aGF0IGlzIG5vdCBwZXJmb3JtYW50IGNvbXBhcmVkIHRvIG90aGVyIHNvbHV0aW9ucyxcbiAqIHN1Y2ggYXMgQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3BpeGlqcy9waXhpLWRpc3BsYXlcbiAqXG4gKiBBbHNvIGJlIGF3YXJlIG9mIHRoYXQgdGhpcyBtYXkgbm90IHdvcmsgbmljZWx5IHdpdGggdGhlIGFkZENoaWxkQXQoKSBmdW5jdGlvbixcbiAqIGFzIHRoZSB6SW5kZXggc29ydGluZyBtYXkgY2F1c2UgdGhlIGNoaWxkIHRvIGF1dG9tYXRpY2FsbHkgc29ydGVkIHRvIGFub3RoZXIgcG9zaXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbmFtZSBTT1JUQUJMRV9DSElMRFJFTlxuICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAqIEB0eXBlIHtib29sZWFufVxuICogQGRlZmF1bHQgZmFsc2VcbiAqL1xuc2V0dGluZ3MuU09SVEFCTEVfQ0hJTERSRU4gPSBmYWxzZTtcblxuLyoqXG4gKiAnQnVpbGRlcicgcGF0dGVybiBmb3IgYm91bmRzIHJlY3RhbmdsZXMuXG4gKlxuICogVGhpcyBjb3VsZCBiZSBjYWxsZWQgYW4gQXhpcy1BbGlnbmVkIEJvdW5kaW5nIEJveC5cbiAqIEl0IGlzIG5vdCBhbiBhY3R1YWwgc2hhcGUuIEl0IGlzIGEgbXV0YWJsZSB0aGluZzsgbm8gJ0VNUFRZJyBvciB0aG9zZSBraW5kIG9mIHByb2JsZW1zLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEJvdW5kcyA9IGZ1bmN0aW9uIEJvdW5kcygpXG57XG4gICAgLyoqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICB0aGlzLm1pblggPSBJbmZpbml0eTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgdGhpcy5taW5ZID0gSW5maW5pdHk7XG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHRoaXMubWF4WCA9IC1JbmZpbml0eTtcblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgdGhpcy5tYXhZID0gLUluZmluaXR5O1xuXG4gICAgdGhpcy5yZWN0ID0gbnVsbDtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGJvdW5kcyBhcmUgZW1wdHkuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbXB0eS5cbiAqL1xuQm91bmRzLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSAoKVxue1xuICAgIHJldHVybiB0aGlzLm1pblggPiB0aGlzLm1heFggfHwgdGhpcy5taW5ZID4gdGhpcy5tYXhZO1xufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIGJvdW5kcyBhbmQgcmVzZXRzLlxuICpcbiAqL1xuQm91bmRzLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpXG57XG4gICAgdGhpcy5taW5YID0gSW5maW5pdHk7XG4gICAgdGhpcy5taW5ZID0gSW5maW5pdHk7XG4gICAgdGhpcy5tYXhYID0gLUluZmluaXR5O1xuICAgIHRoaXMubWF4WSA9IC1JbmZpbml0eTtcbn07XG5cbi8qKlxuICogQ2FuIHJldHVybiBSZWN0YW5nbGUuRU1QVFkgY29uc3RhbnQsIGVpdGhlciBjb25zdHJ1Y3QgbmV3IHJlY3RhbmdsZSwgZWl0aGVyIHVzZSB5b3VyIHJlY3RhbmdsZVxuICogSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIHJldHVybiB0ZW1wUmVjdFxuICpcbiAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IHJlY3QgLSB0ZW1wb3Jhcnkgb2JqZWN0IHdpbGwgYmUgdXNlZCBpZiBBQUJCIGlzIG5vdCBlbXB0eVxuICogQHJldHVybnMge1BJWEkuUmVjdGFuZ2xlfSBBIHJlY3RhbmdsZSBvZiB0aGUgYm91bmRzXG4gKi9cbkJvdW5kcy5wcm90b3R5cGUuZ2V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gZ2V0UmVjdGFuZ2xlIChyZWN0KVxue1xuICAgIGlmICh0aGlzLm1pblggPiB0aGlzLm1heFggfHwgdGhpcy5taW5ZID4gdGhpcy5tYXhZKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZS5FTVBUWTtcbiAgICB9XG5cbiAgICByZWN0ID0gcmVjdCB8fCBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpO1xuXG4gICAgcmVjdC54ID0gdGhpcy5taW5YO1xuICAgIHJlY3QueSA9IHRoaXMubWluWTtcbiAgICByZWN0LndpZHRoID0gdGhpcy5tYXhYIC0gdGhpcy5taW5YO1xuICAgIHJlY3QuaGVpZ2h0ID0gdGhpcy5tYXhZIC0gdGhpcy5taW5ZO1xuXG4gICAgcmV0dXJuIHJlY3Q7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGlubGluZWQgd2hlbiBpdHMgcG9zc2libGUuXG4gKlxuICogQHBhcmFtIHtQSVhJLlBvaW50fSBwb2ludCAtIFRoZSBwb2ludCB0byBhZGQuXG4gKi9cbkJvdW5kcy5wcm90b3R5cGUuYWRkUG9pbnQgPSBmdW5jdGlvbiBhZGRQb2ludCAocG9pbnQpXG57XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBwb2ludC54KTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIHBvaW50LngpO1xuICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgcG9pbnQueSk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBwb2ludC55KTtcbn07XG5cbi8qKlxuICogQWRkcyBhIHF1YWQsIG5vdCB0cmFuc2Zvcm1lZFxuICpcbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSB2ZXJ0aWNlcyAtIFRoZSB2ZXJ0cyB0byBhZGQuXG4gKi9cbkJvdW5kcy5wcm90b3R5cGUuYWRkUXVhZCA9IGZ1bmN0aW9uIGFkZFF1YWQgKHZlcnRpY2VzKVxue1xuICAgIHZhciBtaW5YID0gdGhpcy5taW5YO1xuICAgIHZhciBtaW5ZID0gdGhpcy5taW5ZO1xuICAgIHZhciBtYXhYID0gdGhpcy5tYXhYO1xuICAgIHZhciBtYXhZID0gdGhpcy5tYXhZO1xuXG4gICAgdmFyIHggPSB2ZXJ0aWNlc1swXTtcbiAgICB2YXIgeSA9IHZlcnRpY2VzWzFdO1xuXG4gICAgbWluWCA9IHggPCBtaW5YID8geCA6IG1pblg7XG4gICAgbWluWSA9IHkgPCBtaW5ZID8geSA6IG1pblk7XG4gICAgbWF4WCA9IHggPiBtYXhYID8geCA6IG1heFg7XG4gICAgbWF4WSA9IHkgPiBtYXhZID8geSA6IG1heFk7XG5cbiAgICB4ID0gdmVydGljZXNbMl07XG4gICAgeSA9IHZlcnRpY2VzWzNdO1xuICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgIG1pblkgPSB5IDwgbWluWSA/IHkgOiBtaW5ZO1xuICAgIG1heFggPSB4ID4gbWF4WCA/IHggOiBtYXhYO1xuICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuXG4gICAgeCA9IHZlcnRpY2VzWzRdO1xuICAgIHkgPSB2ZXJ0aWNlc1s1XTtcbiAgICBtaW5YID0geCA8IG1pblggPyB4IDogbWluWDtcbiAgICBtaW5ZID0geSA8IG1pblkgPyB5IDogbWluWTtcbiAgICBtYXhYID0geCA+IG1heFggPyB4IDogbWF4WDtcbiAgICBtYXhZID0geSA+IG1heFkgPyB5IDogbWF4WTtcblxuICAgIHggPSB2ZXJ0aWNlc1s2XTtcbiAgICB5ID0gdmVydGljZXNbN107XG4gICAgbWluWCA9IHggPCBtaW5YID8geCA6IG1pblg7XG4gICAgbWluWSA9IHkgPCBtaW5ZID8geSA6IG1pblk7XG4gICAgbWF4WCA9IHggPiBtYXhYID8geCA6IG1heFg7XG4gICAgbWF4WSA9IHkgPiBtYXhZID8geSA6IG1heFk7XG5cbiAgICB0aGlzLm1pblggPSBtaW5YO1xuICAgIHRoaXMubWluWSA9IG1pblk7XG4gICAgdGhpcy5tYXhYID0gbWF4WDtcbiAgICB0aGlzLm1heFkgPSBtYXhZO1xufTtcblxuLyoqXG4gKiBBZGRzIHNwcml0ZSBmcmFtZSwgdHJhbnNmb3JtZWQuXG4gKlxuICogQHBhcmFtIHtQSVhJLlRyYW5zZm9ybX0gdHJhbnNmb3JtIC0gdHJhbnNmb3JtIHRvIGFwcGx5XG4gKiBAcGFyYW0ge251bWJlcn0geDAgLSBsZWZ0IFggb2YgZnJhbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MCAtIHRvcCBZIG9mIGZyYW1lXG4gKiBAcGFyYW0ge251bWJlcn0geDEgLSByaWdodCBYIG9mIGZyYW1lXG4gKiBAcGFyYW0ge251bWJlcn0geTEgLSBib3R0b20gWSBvZiBmcmFtZVxuICovXG5Cb3VuZHMucHJvdG90eXBlLmFkZEZyYW1lID0gZnVuY3Rpb24gYWRkRnJhbWUgKHRyYW5zZm9ybSwgeDAsIHkwLCB4MSwgeTEpXG57XG4gICAgdGhpcy5hZGRGcmFtZU1hdHJpeCh0cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm0sIHgwLCB5MCwgeDEsIHkxKTtcbn07XG5cbi8qKlxuICogQWRkcyBzcHJpdGUgZnJhbWUsIG11bHRpcGxpZWQgYnkgbWF0cml4XG4gKlxuICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gbWF0cml4IC0gbWF0cml4IHRvIGFwcGx5XG4gKiBAcGFyYW0ge251bWJlcn0geDAgLSBsZWZ0IFggb2YgZnJhbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MCAtIHRvcCBZIG9mIGZyYW1lXG4gKiBAcGFyYW0ge251bWJlcn0geDEgLSByaWdodCBYIG9mIGZyYW1lXG4gKiBAcGFyYW0ge251bWJlcn0geTEgLSBib3R0b20gWSBvZiBmcmFtZVxuICovXG5Cb3VuZHMucHJvdG90eXBlLmFkZEZyYW1lTWF0cml4ID0gZnVuY3Rpb24gYWRkRnJhbWVNYXRyaXggKG1hdHJpeCwgeDAsIHkwLCB4MSwgeTEpXG57XG4gICAgdmFyIGEgPSBtYXRyaXguYTtcbiAgICB2YXIgYiA9IG1hdHJpeC5iO1xuICAgIHZhciBjID0gbWF0cml4LmM7XG4gICAgdmFyIGQgPSBtYXRyaXguZDtcbiAgICB2YXIgdHggPSBtYXRyaXgudHg7XG4gICAgdmFyIHR5ID0gbWF0cml4LnR5O1xuXG4gICAgdmFyIG1pblggPSB0aGlzLm1pblg7XG4gICAgdmFyIG1pblkgPSB0aGlzLm1pblk7XG4gICAgdmFyIG1heFggPSB0aGlzLm1heFg7XG4gICAgdmFyIG1heFkgPSB0aGlzLm1heFk7XG5cbiAgICB2YXIgeCA9IChhICogeDApICsgKGMgKiB5MCkgKyB0eDtcbiAgICB2YXIgeSA9IChiICogeDApICsgKGQgKiB5MCkgKyB0eTtcblxuICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgIG1pblkgPSB5IDwgbWluWSA/IHkgOiBtaW5ZO1xuICAgIG1heFggPSB4ID4gbWF4WCA/IHggOiBtYXhYO1xuICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuXG4gICAgeCA9IChhICogeDEpICsgKGMgKiB5MCkgKyB0eDtcbiAgICB5ID0gKGIgKiB4MSkgKyAoZCAqIHkwKSArIHR5O1xuICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgIG1pblkgPSB5IDwgbWluWSA/IHkgOiBtaW5ZO1xuICAgIG1heFggPSB4ID4gbWF4WCA/IHggOiBtYXhYO1xuICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuXG4gICAgeCA9IChhICogeDApICsgKGMgKiB5MSkgKyB0eDtcbiAgICB5ID0gKGIgKiB4MCkgKyAoZCAqIHkxKSArIHR5O1xuICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgIG1pblkgPSB5IDwgbWluWSA/IHkgOiBtaW5ZO1xuICAgIG1heFggPSB4ID4gbWF4WCA/IHggOiBtYXhYO1xuICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuXG4gICAgeCA9IChhICogeDEpICsgKGMgKiB5MSkgKyB0eDtcbiAgICB5ID0gKGIgKiB4MSkgKyAoZCAqIHkxKSArIHR5O1xuICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgIG1pblkgPSB5IDwgbWluWSA/IHkgOiBtaW5ZO1xuICAgIG1heFggPSB4ID4gbWF4WCA/IHggOiBtYXhYO1xuICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuXG4gICAgdGhpcy5taW5YID0gbWluWDtcbiAgICB0aGlzLm1pblkgPSBtaW5ZO1xuICAgIHRoaXMubWF4WCA9IG1heFg7XG4gICAgdGhpcy5tYXhZID0gbWF4WTtcbn07XG5cbi8qKlxuICogQWRkcyBzY3JlZW4gdmVydGljZXMgZnJvbSBhcnJheVxuICpcbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSB2ZXJ0ZXhEYXRhIC0gY2FsY3VsYXRlZCB2ZXJ0aWNlc1xuICogQHBhcmFtIHtudW1iZXJ9IGJlZ2luT2Zmc2V0IC0gYmVnaW4gb2Zmc2V0XG4gKiBAcGFyYW0ge251bWJlcn0gZW5kT2Zmc2V0IC0gZW5kIG9mZnNldCwgZXhjbHVkZWRcbiAqL1xuQm91bmRzLnByb3RvdHlwZS5hZGRWZXJ0ZXhEYXRhID0gZnVuY3Rpb24gYWRkVmVydGV4RGF0YSAodmVydGV4RGF0YSwgYmVnaW5PZmZzZXQsIGVuZE9mZnNldClcbntcbiAgICB2YXIgbWluWCA9IHRoaXMubWluWDtcbiAgICB2YXIgbWluWSA9IHRoaXMubWluWTtcbiAgICB2YXIgbWF4WCA9IHRoaXMubWF4WDtcbiAgICB2YXIgbWF4WSA9IHRoaXMubWF4WTtcblxuICAgIGZvciAodmFyIGkgPSBiZWdpbk9mZnNldDsgaSA8IGVuZE9mZnNldDsgaSArPSAyKVxuICAgIHtcbiAgICAgICAgdmFyIHggPSB2ZXJ0ZXhEYXRhW2ldO1xuICAgICAgICB2YXIgeSA9IHZlcnRleERhdGFbaSArIDFdO1xuXG4gICAgICAgIG1pblggPSB4IDwgbWluWCA/IHggOiBtaW5YO1xuICAgICAgICBtaW5ZID0geSA8IG1pblkgPyB5IDogbWluWTtcbiAgICAgICAgbWF4WCA9IHggPiBtYXhYID8geCA6IG1heFg7XG4gICAgICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuICAgIH1cblxuICAgIHRoaXMubWluWCA9IG1pblg7XG4gICAgdGhpcy5taW5ZID0gbWluWTtcbiAgICB0aGlzLm1heFggPSBtYXhYO1xuICAgIHRoaXMubWF4WSA9IG1heFk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBhcnJheSBvZiBtZXNoIHZlcnRpY2VzXG4gKlxuICogQHBhcmFtIHtQSVhJLlRyYW5zZm9ybX0gdHJhbnNmb3JtIC0gbWVzaCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fSB2ZXJ0aWNlcyAtIG1lc2ggY29vcmRpbmF0ZXMgaW4gYXJyYXlcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWdpbk9mZnNldCAtIGJlZ2luIG9mZnNldFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZE9mZnNldCAtIGVuZCBvZmZzZXQsIGV4Y2x1ZGVkXG4gKi9cbkJvdW5kcy5wcm90b3R5cGUuYWRkVmVydGljZXMgPSBmdW5jdGlvbiBhZGRWZXJ0aWNlcyAodHJhbnNmb3JtLCB2ZXJ0aWNlcywgYmVnaW5PZmZzZXQsIGVuZE9mZnNldClcbntcbiAgICB0aGlzLmFkZFZlcnRpY2VzTWF0cml4KHRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybSwgdmVydGljZXMsIGJlZ2luT2Zmc2V0LCBlbmRPZmZzZXQpO1xufTtcblxuLyoqXG4gKiBBZGQgYW4gYXJyYXkgb2YgbWVzaCB2ZXJ0aWNlc1xuICpcbiAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG1hdHJpeCAtIG1lc2ggbWF0cml4XG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gdmVydGljZXMgLSBtZXNoIGNvb3JkaW5hdGVzIGluIGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gYmVnaW5PZmZzZXQgLSBiZWdpbiBvZmZzZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRPZmZzZXQgLSBlbmQgb2Zmc2V0LCBleGNsdWRlZFxuICogQHBhcmFtIHtudW1iZXJ9IFtwYWRYXSAtIHggcGFkZGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IFtwYWRZXSAtIHkgcGFkZGluZ1xuICovXG5Cb3VuZHMucHJvdG90eXBlLmFkZFZlcnRpY2VzTWF0cml4ID0gZnVuY3Rpb24gYWRkVmVydGljZXNNYXRyaXggKG1hdHJpeCwgdmVydGljZXMsIGJlZ2luT2Zmc2V0LCBlbmRPZmZzZXQsIHBhZFgsIHBhZFkpXG57XG4gICAgdmFyIGEgPSBtYXRyaXguYTtcbiAgICB2YXIgYiA9IG1hdHJpeC5iO1xuICAgIHZhciBjID0gbWF0cml4LmM7XG4gICAgdmFyIGQgPSBtYXRyaXguZDtcbiAgICB2YXIgdHggPSBtYXRyaXgudHg7XG4gICAgdmFyIHR5ID0gbWF0cml4LnR5O1xuXG4gICAgcGFkWCA9IHBhZFggfHwgMDtcbiAgICBwYWRZID0gcGFkWSB8fCAwO1xuXG4gICAgdmFyIG1pblggPSB0aGlzLm1pblg7XG4gICAgdmFyIG1pblkgPSB0aGlzLm1pblk7XG4gICAgdmFyIG1heFggPSB0aGlzLm1heFg7XG4gICAgdmFyIG1heFkgPSB0aGlzLm1heFk7XG5cbiAgICBmb3IgKHZhciBpID0gYmVnaW5PZmZzZXQ7IGkgPCBlbmRPZmZzZXQ7IGkgKz0gMilcbiAgICB7XG4gICAgICAgIHZhciByYXdYID0gdmVydGljZXNbaV07XG4gICAgICAgIHZhciByYXdZID0gdmVydGljZXNbaSArIDFdO1xuICAgICAgICB2YXIgeCA9IChhICogcmF3WCkgKyAoYyAqIHJhd1kpICsgdHg7XG4gICAgICAgIHZhciB5ID0gKGQgKiByYXdZKSArIChiICogcmF3WCkgKyB0eTtcblxuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHBhZFgpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHBhZFgpO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIHBhZFkpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIHBhZFkpO1xuICAgIH1cblxuICAgIHRoaXMubWluWCA9IG1pblg7XG4gICAgdGhpcy5taW5ZID0gbWluWTtcbiAgICB0aGlzLm1heFggPSBtYXhYO1xuICAgIHRoaXMubWF4WSA9IG1heFk7XG59O1xuXG4vKipcbiAqIEFkZHMgb3RoZXIgQm91bmRzXG4gKlxuICogQHBhcmFtIHtQSVhJLkJvdW5kc30gYm91bmRzIC0gVE9ET1xuICovXG5Cb3VuZHMucHJvdG90eXBlLmFkZEJvdW5kcyA9IGZ1bmN0aW9uIGFkZEJvdW5kcyAoYm91bmRzKVxue1xuICAgIHZhciBtaW5YID0gdGhpcy5taW5YO1xuICAgIHZhciBtaW5ZID0gdGhpcy5taW5ZO1xuICAgIHZhciBtYXhYID0gdGhpcy5tYXhYO1xuICAgIHZhciBtYXhZID0gdGhpcy5tYXhZO1xuXG4gICAgdGhpcy5taW5YID0gYm91bmRzLm1pblggPCBtaW5YID8gYm91bmRzLm1pblggOiBtaW5YO1xuICAgIHRoaXMubWluWSA9IGJvdW5kcy5taW5ZIDwgbWluWSA/IGJvdW5kcy5taW5ZIDogbWluWTtcbiAgICB0aGlzLm1heFggPSBib3VuZHMubWF4WCA+IG1heFggPyBib3VuZHMubWF4WCA6IG1heFg7XG4gICAgdGhpcy5tYXhZID0gYm91bmRzLm1heFkgPiBtYXhZID8gYm91bmRzLm1heFkgOiBtYXhZO1xufTtcblxuLyoqXG4gKiBBZGRzIG90aGVyIEJvdW5kcywgbWFza2VkIHdpdGggQm91bmRzXG4gKlxuICogQHBhcmFtIHtQSVhJLkJvdW5kc30gYm91bmRzIC0gVE9ET1xuICogQHBhcmFtIHtQSVhJLkJvdW5kc30gbWFzayAtIFRPRE9cbiAqL1xuQm91bmRzLnByb3RvdHlwZS5hZGRCb3VuZHNNYXNrID0gZnVuY3Rpb24gYWRkQm91bmRzTWFzayAoYm91bmRzLCBtYXNrKVxue1xuICAgIHZhciBfbWluWCA9IGJvdW5kcy5taW5YID4gbWFzay5taW5YID8gYm91bmRzLm1pblggOiBtYXNrLm1pblg7XG4gICAgdmFyIF9taW5ZID0gYm91bmRzLm1pblkgPiBtYXNrLm1pblkgPyBib3VuZHMubWluWSA6IG1hc2subWluWTtcbiAgICB2YXIgX21heFggPSBib3VuZHMubWF4WCA8IG1hc2subWF4WCA/IGJvdW5kcy5tYXhYIDogbWFzay5tYXhYO1xuICAgIHZhciBfbWF4WSA9IGJvdW5kcy5tYXhZIDwgbWFzay5tYXhZID8gYm91bmRzLm1heFkgOiBtYXNrLm1heFk7XG5cbiAgICBpZiAoX21pblggPD0gX21heFggJiYgX21pblkgPD0gX21heFkpXG4gICAge1xuICAgICAgICB2YXIgbWluWCA9IHRoaXMubWluWDtcbiAgICAgICAgdmFyIG1pblkgPSB0aGlzLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gdGhpcy5tYXhYO1xuICAgICAgICB2YXIgbWF4WSA9IHRoaXMubWF4WTtcblxuICAgICAgICB0aGlzLm1pblggPSBfbWluWCA8IG1pblggPyBfbWluWCA6IG1pblg7XG4gICAgICAgIHRoaXMubWluWSA9IF9taW5ZIDwgbWluWSA/IF9taW5ZIDogbWluWTtcbiAgICAgICAgdGhpcy5tYXhYID0gX21heFggPiBtYXhYID8gX21heFggOiBtYXhYO1xuICAgICAgICB0aGlzLm1heFkgPSBfbWF4WSA+IG1heFkgPyBfbWF4WSA6IG1heFk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRzIG90aGVyIEJvdW5kcywgbXVsdGlwbGllZCBieSBtYXRyaXguIEJvdW5kcyBzaG91bGRuJ3QgYmUgZW1wdHlcbiAqXG4gKiBAcGFyYW0ge1BJWEkuQm91bmRzfSBib3VuZHMgb3RoZXIgYm91bmRzXG4gKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBtYXRyaXggbXVsdGlwbGljYXRvclxuICovXG5Cb3VuZHMucHJvdG90eXBlLmFkZEJvdW5kc01hdHJpeCA9IGZ1bmN0aW9uIGFkZEJvdW5kc01hdHJpeCAoYm91bmRzLCBtYXRyaXgpXG57XG4gICAgdGhpcy5hZGRGcmFtZU1hdHJpeChtYXRyaXgsIGJvdW5kcy5taW5YLCBib3VuZHMubWluWSwgYm91bmRzLm1heFgsIGJvdW5kcy5tYXhZKTtcbn07XG5cbi8qKlxuICogQWRkcyBvdGhlciBCb3VuZHMsIG1hc2tlZCB3aXRoIFJlY3RhbmdsZVxuICpcbiAqIEBwYXJhbSB7UElYSS5Cb3VuZHN9IGJvdW5kcyAtIFRPRE9cbiAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IGFyZWEgLSBUT0RPXG4gKi9cbkJvdW5kcy5wcm90b3R5cGUuYWRkQm91bmRzQXJlYSA9IGZ1bmN0aW9uIGFkZEJvdW5kc0FyZWEgKGJvdW5kcywgYXJlYSlcbntcbiAgICB2YXIgX21pblggPSBib3VuZHMubWluWCA+IGFyZWEueCA/IGJvdW5kcy5taW5YIDogYXJlYS54O1xuICAgIHZhciBfbWluWSA9IGJvdW5kcy5taW5ZID4gYXJlYS55ID8gYm91bmRzLm1pblkgOiBhcmVhLnk7XG4gICAgdmFyIF9tYXhYID0gYm91bmRzLm1heFggPCBhcmVhLnggKyBhcmVhLndpZHRoID8gYm91bmRzLm1heFggOiAoYXJlYS54ICsgYXJlYS53aWR0aCk7XG4gICAgdmFyIF9tYXhZID0gYm91bmRzLm1heFkgPCBhcmVhLnkgKyBhcmVhLmhlaWdodCA/IGJvdW5kcy5tYXhZIDogKGFyZWEueSArIGFyZWEuaGVpZ2h0KTtcblxuICAgIGlmIChfbWluWCA8PSBfbWF4WCAmJiBfbWluWSA8PSBfbWF4WSlcbiAgICB7XG4gICAgICAgIHZhciBtaW5YID0gdGhpcy5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IHRoaXMubWluWTtcbiAgICAgICAgdmFyIG1heFggPSB0aGlzLm1heFg7XG4gICAgICAgIHZhciBtYXhZID0gdGhpcy5tYXhZO1xuXG4gICAgICAgIHRoaXMubWluWCA9IF9taW5YIDwgbWluWCA/IF9taW5YIDogbWluWDtcbiAgICAgICAgdGhpcy5taW5ZID0gX21pblkgPCBtaW5ZID8gX21pblkgOiBtaW5ZO1xuICAgICAgICB0aGlzLm1heFggPSBfbWF4WCA+IG1heFggPyBfbWF4WCA6IG1heFg7XG4gICAgICAgIHRoaXMubWF4WSA9IF9tYXhZID4gbWF4WSA/IF9tYXhZIDogbWF4WTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFBhZHMgYm91bmRzIG9iamVjdCwgbWFraW5nIGl0IGdyb3cgaW4gYWxsIGRpcmVjdGlvbnMuXG4gKiBJZiBwYWRkaW5nWSBpcyBvbWl0dGVkLCBib3RoIHBhZGRpbmdYIGFuZCBwYWRkaW5nWSB3aWxsIGJlIHNldCB0byBwYWRkaW5nWC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3BhZGRpbmdYPTBdIC0gVGhlIGhvcml6b250YWwgcGFkZGluZyBhbW91bnQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3BhZGRpbmdZPTBdIC0gVGhlIHZlcnRpY2FsIHBhZGRpbmcgYW1vdW50LlxuICovXG5Cb3VuZHMucHJvdG90eXBlLnBhZCA9IGZ1bmN0aW9uIHBhZCAocGFkZGluZ1gsIHBhZGRpbmdZKVxue1xuICAgIHBhZGRpbmdYID0gcGFkZGluZ1ggfHwgMDtcbiAgICBwYWRkaW5nWSA9IHBhZGRpbmdZIHx8ICgocGFkZGluZ1kgIT09IDApID8gcGFkZGluZ1ggOiAwKTtcblxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpXG4gICAge1xuICAgICAgICB0aGlzLm1pblggLT0gcGFkZGluZ1g7XG4gICAgICAgIHRoaXMubWF4WCArPSBwYWRkaW5nWDtcbiAgICAgICAgdGhpcy5taW5ZIC09IHBhZGRpbmdZO1xuICAgICAgICB0aGlzLm1heFkgKz0gcGFkZGluZ1k7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRzIHBhZGRlZCBmcmFtZS4gKHgwLCB5MCkgc2hvdWxkIGJlIHN0cmljdGx5IGxlc3MgdGhhbiAoeDEsIHkxKVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MCAtIGxlZnQgWCBvZiBmcmFtZVxuICogQHBhcmFtIHtudW1iZXJ9IHkwIC0gdG9wIFkgb2YgZnJhbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MSAtIHJpZ2h0IFggb2YgZnJhbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MSAtIGJvdHRvbSBZIG9mIGZyYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gcGFkWCAtIHBhZGRpbmcgWFxuICogQHBhcmFtIHtudW1iZXJ9IHBhZFkgLSBwYWRkaW5nIFlcbiAqL1xuQm91bmRzLnByb3RvdHlwZS5hZGRGcmFtZVBhZCA9IGZ1bmN0aW9uIGFkZEZyYW1lUGFkICh4MCwgeTAsIHgxLCB5MSwgcGFkWCwgcGFkWSlcbntcbiAgICB4MCAtPSBwYWRYO1xuICAgIHkwIC09IHBhZFk7XG4gICAgeDEgKz0gcGFkWDtcbiAgICB5MSArPSBwYWRZO1xuXG4gICAgdGhpcy5taW5YID0gdGhpcy5taW5YIDwgeDAgPyB0aGlzLm1pblggOiB4MDtcbiAgICB0aGlzLm1heFggPSB0aGlzLm1heFggPiB4MSA/IHRoaXMubWF4WCA6IHgxO1xuICAgIHRoaXMubWluWSA9IHRoaXMubWluWSA8IHkwID8gdGhpcy5taW5ZIDogeTA7XG4gICAgdGhpcy5tYXhZID0gdGhpcy5tYXhZID4geTEgPyB0aGlzLm1heFkgOiB5MTtcbn07XG5cbi8vIF90ZW1wRGlzcGxheU9iamVjdFBhcmVudCA9IG5ldyBEaXNwbGF5T2JqZWN0KCk7XG5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBvYmplY3RzIHRoYXQgYXJlIHJlbmRlcmVkIG9uIHRoZSBzY3JlZW4uXG4gKlxuICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIGl0cyBvd247IHJhdGhlciBpdCBzaG91bGQgYmUgZXh0ZW5kZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLnV0aWxzLkV2ZW50RW1pdHRlclxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIERpc3BsYXlPYmplY3QgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChFdmVudEVtaXR0ZXIpIHtcbiAgICBmdW5jdGlvbiBEaXNwbGF5T2JqZWN0KClcbiAgICB7XG4gICAgICAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMudGVtcERpc3BsYXlPYmplY3RQYXJlbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gY3JlYXRlIFRyYW5zZm9ybSBmcm9tIGZhY3RvcnlcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdvcmxkIHRyYW5zZm9ybSBhbmQgbG9jYWwgdHJhbnNmb3JtIG9mIHRoaXMgb2JqZWN0LlxuICAgICAgICAgKiBUaGlzIHdpbGwgYmVjb21lIHJlYWQtb25seSBsYXRlciwgcGxlYXNlIGRvIG5vdCBhc3NpZ24gYW55dGhpbmcgdGhlcmUgdW5sZXNzIHlvdSBrbm93IHdoYXQgYXJlIHlvdSBkb2luZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5UcmFuc2Zvcm19XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbHBoYSA9IDE7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBvYmplY3QuIElmIGZhbHNlIHRoZSBvYmplY3Qgd2lsbCBub3QgYmUgZHJhd24sIGFuZFxuICAgICAgICAgKiB0aGUgdXBkYXRlVHJhbnNmb3JtIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogT25seSBhZmZlY3RzIHJlY3Vyc2l2ZSBjYWxscyBmcm9tIHBhcmVudC4gWW91IGNhbiBhc2sgZm9yIGJvdW5kcyBvciBjYWxsIHVwZGF0ZVRyYW5zZm9ybSBtYW51YWxseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbiB0aGlzIG9iamVjdCBiZSByZW5kZXJlZCwgaWYgZmFsc2UgdGhlIG9iamVjdCB3aWxsIG5vdCBiZSBkcmF3biBidXQgdGhlIHVwZGF0ZVRyYW5zZm9ybVxuICAgICAgICAgKiBtZXRob2RzIHdpbGwgc3RpbGwgYmUgY2FsbGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBPbmx5IGFmZmVjdHMgcmVjdXJzaXZlIGNhbGxzIGZyb20gcGFyZW50LiBZb3UgY2FuIGFzayBmb3IgYm91bmRzIG1hbnVhbGx5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZW5kZXJhYmxlID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIHRoaXMgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQ29udGFpbmVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG11bHRpcGxpZWQgYWxwaGEgb2YgdGhlIGRpc3BsYXlPYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndvcmxkQWxwaGEgPSAxO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGljaCBpbmRleCBpbiB0aGUgY2hpbGRyZW4gYXJyYXkgdGhlIGRpc3BsYXkgY29tcG9uZW50IHdhcyBiZWZvcmUgdGhlIHByZXZpb3VzIHpJbmRleCBzb3J0LlxuICAgICAgICAgKiBVc2VkIGJ5IGNvbnRhaW5lcnMgdG8gaGVscCBzb3J0IG9iamVjdHMgd2l0aCB0aGUgc2FtZSB6SW5kZXgsIGJ5IHVzaW5nIHByZXZpb3VzIGFycmF5IGluZGV4IGFzIHRoZSBkZWNpZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2xhc3RTb3J0ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB6SW5kZXggb2YgdGhlIGRpc3BsYXlPYmplY3QuXG4gICAgICAgICAqIEEgaGlnaGVyIHZhbHVlIHdpbGwgbWVhbiBpdCB3aWxsIGJlIHJlbmRlcmVkIG9uIHRvcCBvZiBvdGhlciBkaXNwbGF5T2JqZWN0cyB3aXRoaW4gdGhlIHNhbWUgY29udGFpbmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3pJbmRleCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcmVhIHRoZSBmaWx0ZXIgaXMgYXBwbGllZCB0by4gVGhpcyBpcyB1c2VkIGFzIG1vcmUgb2YgYW4gb3B0aW1pemF0aW9uXG4gICAgICAgICAqIHJhdGhlciB0aGFuIGZpZ3VyaW5nIG91dCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZGlzcGxheU9iamVjdCBlYWNoIGZyYW1lIHlvdSBjYW4gc2V0IHRoaXMgcmVjdGFuZ2xlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBbHNvIHdvcmtzIGFzIGFuIGludGVyYWN0aW9uIG1hc2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIgez9QSVhJLlJlY3RhbmdsZX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsdGVyQXJlYSA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldHMgdGhlIGZpbHRlcnMgZm9yIHRoZSBkaXNwbGF5T2JqZWN0LlxuICAgICAgICAgKiAqIElNUE9SVEFOVDogVGhpcyBpcyBhIFdlYkdMIG9ubHkgZmVhdHVyZSBhbmQgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYW52YXMgcmVuZGVyZXIuXG4gICAgICAgICAqIFRvIHJlbW92ZSBmaWx0ZXJzIHNpbXBseSBzZXQgdGhpcyBwcm9wZXJ0eSB0byBgJ251bGwnYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7P1BJWEkuRmlsdGVyW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbmFibGVkRmlsdGVycyA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBib3VuZHMgb2JqZWN0LCB0aGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgYm91bmRzIG9mIHRoZSBkaXNwbGF5T2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkJvdW5kc31cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYm91bmRzID0gbmV3IEJvdW5kcygpO1xuICAgICAgICB0aGlzLl9ib3VuZHNJRCA9IDA7XG4gICAgICAgIHRoaXMuX2xhc3RCb3VuZHNJRCA9IC0xO1xuICAgICAgICB0aGlzLl9ib3VuZHNSZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9jYWxCb3VuZHNSZWN0ID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG9yaWdpbmFsLCBjYWNoZWQgbWFzayBvZiB0aGUgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkdyYXBoaWNzfFBJWEkuU3ByaXRlfG51bGx9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX21hc2sgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoaXMgRGlzcGxheU9iamVjdCBpcyBhZGRlZCB0byBhIENvbnRhaW5lci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNhZGRlZFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIGFkZGVkIHRvLlxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB0aGlzIERpc3BsYXlPYmplY3QgaXMgcmVtb3ZlZCBmcm9tIGEgQ29udGFpbmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3JlbW92ZWRcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLkNvbnRhaW5lcn0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciByZW1vdmVkIGZyb20uXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGRlc3Ryb3llZCB2aWEgZGVzdHJveSgpLiBJZiB0cnVlLCBpdCBzaG91bGQgbm90IGJlIHVzZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB1c2VkIHRvIGZhc3QgY2hlY2sgaWYgYSBzcHJpdGUgaXMuLiBhIHNwcml0ZSFcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTcHJpdGUgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRG9lcyBhbnkgb3RoZXIgZGlzcGxheU9iamVjdCB1c2UgdGhpcyBvYmplY3QgYXMgYSBtYXNrP1xuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc01hc2sgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIEV2ZW50RW1pdHRlciApIERpc3BsYXlPYmplY3QuX19wcm90b19fID0gRXZlbnRFbWl0dGVyO1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZlbnRFbWl0dGVyICYmIEV2ZW50RW1pdHRlci5wcm90b3R5cGUgKTtcbiAgICBEaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpc3BsYXlPYmplY3Q7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBfdGVtcERpc3BsYXlPYmplY3RQYXJlbnQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0seDogeyBjb25maWd1cmFibGU6IHRydWUgfSx5OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHdvcmxkVHJhbnNmb3JtOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGxvY2FsVHJhbnNmb3JtOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHBvc2l0aW9uOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHNjYWxlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHBpdm90OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHNrZXc6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0scm90YXRpb246IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYW5nbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sekluZGV4OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHdvcmxkVmlzaWJsZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxtYXNrOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQG1lbWJlciB7UElYSS5EaXNwbGF5T2JqZWN0fVxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QubWl4aW4gPSBmdW5jdGlvbiBtaXhpbiAoc291cmNlKVxuICAgIHtcbiAgICAgICAgLy8gaW4gRVM4L0VTMjAxNywgdGhpcyB3b3VsZCBiZSByZWFsbHkgZWFzeTpcbiAgICAgICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcblxuICAgICAgICAvLyBnZXQgYWxsIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IGtleXNcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBwcm9wZXJ0aWVzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IGtleXNbaV07XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcHJvcGVydHkgdXNpbmcgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgLSB0aGlzIHdvcmtzIGZvciBhY2Nlc3NvcnMgYW5kIG5vcm1hbCB2YWx1ZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5fdGVtcERpc3BsYXlPYmplY3RQYXJlbnQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBEaXNwbGF5T2JqZWN0UGFyZW50ID09PSBudWxsKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnRlbXBEaXNwbGF5T2JqZWN0UGFyZW50ID0gbmV3IERpc3BsYXlPYmplY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBEaXNwbGF5T2JqZWN0UGFyZW50O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBvYmplY3QgdHJhbnNmb3JtIGZvciByZW5kZXJpbmcuXG4gICAgICpcbiAgICAgKiBUT0RPIC0gT3B0aW1pemF0aW9uIHBhc3MhXG4gICAgICovXG4gICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtICgpXG4gICAge1xuICAgICAgICB0aGlzLl9ib3VuZHNJRCsrO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZVRyYW5zZm9ybSh0aGlzLnBhcmVudC50cmFuc2Zvcm0pO1xuICAgICAgICAvLyBtdWx0aXBseSB0aGUgYWxwaGFzLi5cbiAgICAgICAgdGhpcy53b3JsZEFscGhhID0gdGhpcy5hbHBoYSAqIHRoaXMucGFyZW50LndvcmxkQWxwaGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIERvZXMgbm90aGluZyBieSBkZWZhdWx0IGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4gYSBwYXJlbnQgY2xhc3MuXG4gICAgICovXG4gICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUuY2FsY3VsYXRlQm91bmRzID0gZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICAvLyBPVkVSV1JJVEU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IHVwZGF0ZXMgdHJhbnNmb3JtIG9mIGFsbCBvYmplY3RzIGZyb20gdGhlIHJvb3QgdG8gdGhpcyBvbmVcbiAgICAgKiBpbnRlcm5hbCBmdW5jdGlvbiBmb3IgdG9Mb2NhbCgpXG4gICAgICovXG4gICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUuX3JlY3Vyc2l2ZVBvc3RVcGRhdGVUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfcmVjdXJzaXZlUG9zdFVwZGF0ZVRyYW5zZm9ybSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVjdXJzaXZlUG9zdFVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlVHJhbnNmb3JtKHRoaXMucGFyZW50LnRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGVUcmFuc2Zvcm0odGhpcy5fdGVtcERpc3BsYXlPYmplY3RQYXJlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZGlzcGxheU9iamVjdCBhcyBhIHJlY3RhbmdsZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwVXBkYXRlXSAtIFNldHRpbmcgdG8gYHRydWVgIHdpbGwgc3RvcCB0aGUgdHJhbnNmb3JtcyBvZiB0aGUgc2NlbmUgZ3JhcGggZnJvbVxuICAgICAqICBiZWluZyB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoZSBjYWxjdWxhdGlvbiByZXR1cm5lZCBNQVkgYmUgb3V0IG9mIGRhdGUgQlVUIHdpbGwgZ2l2ZSB5b3UgYVxuICAgICAqICBuaWNlIHBlcmZvcm1hbmNlIGJvb3N0LlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IFtyZWN0XSAtIE9wdGlvbmFsIHJlY3RhbmdsZSB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBib3VuZHMgY2FsY3VsYXRpb24uXG4gICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IFRoZSByZWN0YW5ndWxhciBib3VuZGluZyBhcmVhLlxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLmdldEJvdW5kcyA9IGZ1bmN0aW9uIGdldEJvdW5kcyAoc2tpcFVwZGF0ZSwgcmVjdClcbiAgICB7XG4gICAgICAgIGlmICghc2tpcFVwZGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMuX3RlbXBEaXNwbGF5T2JqZWN0UGFyZW50O1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY3Vyc2l2ZVBvc3RVcGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kc0lEICE9PSB0aGlzLl9sYXN0Qm91bmRzSUQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQm91bmRzKCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Qm91bmRzSUQgPSB0aGlzLl9ib3VuZHNJRDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9ib3VuZHNSZWN0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JvdW5kc1JlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY3QgPSB0aGlzLl9ib3VuZHNSZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kcy5nZXRSZWN0YW5nbGUocmVjdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgbG9jYWwgYm91bmRzIG9mIHRoZSBkaXNwbGF5T2JqZWN0IGFzIGEgcmVjdGFuZ2xlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IFtyZWN0XSAtIE9wdGlvbmFsIHJlY3RhbmdsZSB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBib3VuZHMgY2FsY3VsYXRpb24uXG4gICAgICogQHJldHVybiB7UElYSS5SZWN0YW5nbGV9IFRoZSByZWN0YW5ndWxhciBib3VuZGluZyBhcmVhLlxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLmdldExvY2FsQm91bmRzID0gZnVuY3Rpb24gZ2V0TG9jYWxCb3VuZHMgKHJlY3QpXG4gICAge1xuICAgICAgICB2YXIgdHJhbnNmb3JtUmVmID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIHZhciBwYXJlbnRSZWYgPSB0aGlzLnBhcmVudDtcblxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy5fdGVtcERpc3BsYXlPYmplY3RQYXJlbnQudHJhbnNmb3JtO1xuXG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9sb2NhbEJvdW5kc1JlY3QpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxCb3VuZHNSZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWN0ID0gdGhpcy5fbG9jYWxCb3VuZHNSZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRzKGZhbHNlLCByZWN0KTtcblxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFJlZjtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1SZWY7XG5cbiAgICAgICAgcmV0dXJuIGJvdW5kcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZ2xvYmFsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IHBvc2l0aW9uIC0gVGhlIHdvcmxkIG9yaWdpbiB0byBjYWxjdWxhdGUgZnJvbS5cbiAgICAgKiBAcGFyYW0ge1BJWEkuSVBvaW50fSBbcG9pbnRdIC0gQSBQb2ludCBvYmplY3QgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlLCBvcHRpb25hbFxuICAgICAqICAob3RoZXJ3aXNlIHdpbGwgY3JlYXRlIGEgbmV3IFBvaW50KS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwVXBkYXRlPWZhbHNlXSAtIFNob3VsZCB3ZSBza2lwIHRoZSB1cGRhdGUgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm4ge1BJWEkuSVBvaW50fSBBIHBvaW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLnRvR2xvYmFsID0gZnVuY3Rpb24gdG9HbG9iYWwgKHBvc2l0aW9uLCBwb2ludCwgc2tpcFVwZGF0ZSlcbiAgICB7XG4gICAgICAgIGlmICggc2tpcFVwZGF0ZSA9PT0gdm9pZCAwICkgc2tpcFVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghc2tpcFVwZGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcmVjdXJzaXZlUG9zdFVwZGF0ZVRyYW5zZm9ybSgpO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBjaGVjayBpcyBmb3IganVzdCBpbiBjYXNlIHRoZSBpdGVtIGlzIGEgcm9vdCBvYmplY3QuXG4gICAgICAgICAgICAvLyBJZiBpdCBpcyB3ZSBuZWVkIHRvIGdpdmUgaXQgYSB0ZW1wb3JhcnkgcGFyZW50IHNvIHRoYXQgZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSB3b3JrcyBjb3JyZWN0bHlcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWFpbmx5IHRvIGF2b2lkIGEgcGFyZW50IGNoZWNrIGluIHRoZSBtYWluIGxvb3AuIEV2ZXJ5IGxpdHRsZSBoZWxwcyBmb3IgcGVyZm9ybWFuY2UgOilcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJlbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLl90ZW1wRGlzcGxheU9iamVjdFBhcmVudDtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5T2JqZWN0VXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgbG90XG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkVHJhbnNmb3JtLmFwcGx5KHBvc2l0aW9uLCBwb2ludCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGxvY2FsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IG9iamVjdCByZWxhdGl2ZSB0byBhbm90aGVyIHBvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLklQb2ludH0gcG9zaXRpb24gLSBUaGUgd29ybGQgb3JpZ2luIHRvIGNhbGN1bGF0ZSBmcm9tLlxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBbZnJvbV0gLSBUaGUgRGlzcGxheU9iamVjdCB0byBjYWxjdWxhdGUgdGhlIGdsb2JhbCBwb3NpdGlvbiBmcm9tLlxuICAgICAqIEBwYXJhbSB7UElYSS5JUG9pbnR9IFtwb2ludF0gLSBBIFBvaW50IG9iamVjdCBpbiB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUsIG9wdGlvbmFsXG4gICAgICogIChvdGhlcndpc2Ugd2lsbCBjcmVhdGUgYSBuZXcgUG9pbnQpLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBVcGRhdGU9ZmFsc2VdIC0gU2hvdWxkIHdlIHNraXAgdGhlIHVwZGF0ZSB0cmFuc2Zvcm1cbiAgICAgKiBAcmV0dXJuIHtQSVhJLklQb2ludH0gQSBwb2ludCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGlzIG9iamVjdFxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLnRvTG9jYWwgPSBmdW5jdGlvbiB0b0xvY2FsIChwb3NpdGlvbiwgZnJvbSwgcG9pbnQsIHNraXBVcGRhdGUpXG4gICAge1xuICAgICAgICBpZiAoZnJvbSlcbiAgICAgICAge1xuICAgICAgICAgICAgcG9zaXRpb24gPSBmcm9tLnRvR2xvYmFsKHBvc2l0aW9uLCBwb2ludCwgc2tpcFVwZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNraXBVcGRhdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY3Vyc2l2ZVBvc3RVcGRhdGVUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgLy8gdGhpcyBwYXJlbnQgY2hlY2sgaXMgZm9yIGp1c3QgaW4gY2FzZSB0aGUgaXRlbSBpcyBhIHJvb3Qgb2JqZWN0LlxuICAgICAgICAgICAgLy8gSWYgaXQgaXMgd2UgbmVlZCB0byBnaXZlIGl0IGEgdGVtcG9yYXJ5IHBhcmVudCBzbyB0aGF0IGRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm0gd29ya3MgY29ycmVjdGx5XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG1haW5seSB0byBhdm9pZCBhIHBhcmVudCBjaGVjayBpbiB0aGUgbWFpbiBsb29wLiBFdmVyeSBsaXR0bGUgaGVscHMgZm9yIHBlcmZvcm1hbmNlIDopXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5fdGVtcERpc3BsYXlPYmplY3RQYXJlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5T2JqZWN0VXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2ltcGx5IGFwcGx5IHRoZSBtYXRyaXguLlxuICAgICAgICByZXR1cm4gdGhpcy53b3JsZFRyYW5zZm9ybS5hcHBseUludmVyc2UocG9zaXRpb24sIHBvaW50KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgb2JqZWN0IHVzaW5nIHRoZSBXZWJHTCByZW5kZXJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXG4gICAgICovXG4gICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChyZW5kZXJlcikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHtcbiAgICAgICAgLy8gT1ZFUldSSVRFO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBhcmVudCBDb250YWluZXIgb2YgdGhpcyBEaXNwbGF5T2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkNvbnRhaW5lcn0gY29udGFpbmVyIC0gVGhlIENvbnRhaW5lciB0byBhZGQgdGhpcyBEaXNwbGF5T2JqZWN0IHRvLlxuICAgICAqIEByZXR1cm4ge1BJWEkuQ29udGFpbmVyfSBUaGUgQ29udGFpbmVyIHRoYXQgdGhpcyBEaXNwbGF5T2JqZWN0IHdhcyBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBEaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbiBzZXRQYXJlbnQgKGNvbnRhaW5lcilcbiAgICB7XG4gICAgICAgIGlmICghY29udGFpbmVyIHx8ICFjb250YWluZXIuYWRkQ2hpbGQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UGFyZW50OiBBcmd1bWVudCBtdXN0IGJlIGEgQ29udGFpbmVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIuYWRkQ2hpbGQodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBwb3NpdGlvbiwgc2NhbGUsIHNrZXcgYW5kIHBpdm90IGF0IG9uY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgWCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSBZIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZVg9MV0gLSBUaGUgWCBzY2FsZSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2NhbGVZPTFdIC0gVGhlIFkgc2NhbGUgdmFsdWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtza2V3WD0wXSAtIFRoZSBYIHNrZXcgdmFsdWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NrZXdZPTBdIC0gVGhlIFkgc2tldyB2YWx1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcGl2b3RYPTBdIC0gVGhlIFggcGl2b3QgdmFsdWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bpdm90WT0wXSAtIFRoZSBZIHBpdm90IHZhbHVlXG4gICAgICogQHJldHVybiB7UElYSS5EaXNwbGF5T2JqZWN0fSBUaGUgRGlzcGxheU9iamVjdCBpbnN0YW5jZVxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIHNldFRyYW5zZm9ybSAoeCwgeSwgc2NhbGVYLCBzY2FsZVksIHJvdGF0aW9uLCBza2V3WCwgc2tld1ksIHBpdm90WCwgcGl2b3RZKVxuICAgIHtcbiAgICAgICAgaWYgKCB4ID09PSB2b2lkIDAgKSB4ID0gMDtcbiAgICAgICAgaWYgKCB5ID09PSB2b2lkIDAgKSB5ID0gMDtcbiAgICAgICAgaWYgKCBzY2FsZVggPT09IHZvaWQgMCApIHNjYWxlWCA9IDE7XG4gICAgICAgIGlmICggc2NhbGVZID09PSB2b2lkIDAgKSBzY2FsZVkgPSAxO1xuICAgICAgICBpZiAoIHJvdGF0aW9uID09PSB2b2lkIDAgKSByb3RhdGlvbiA9IDA7XG4gICAgICAgIGlmICggc2tld1ggPT09IHZvaWQgMCApIHNrZXdYID0gMDtcbiAgICAgICAgaWYgKCBza2V3WSA9PT0gdm9pZCAwICkgc2tld1kgPSAwO1xuICAgICAgICBpZiAoIHBpdm90WCA9PT0gdm9pZCAwICkgcGl2b3RYID0gMDtcbiAgICAgICAgaWYgKCBwaXZvdFkgPT09IHZvaWQgMCApIHBpdm90WSA9IDA7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbi54ID0geDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbi55ID0geTtcbiAgICAgICAgdGhpcy5zY2FsZS54ID0gIXNjYWxlWCA/IDEgOiBzY2FsZVg7XG4gICAgICAgIHRoaXMuc2NhbGUueSA9ICFzY2FsZVkgPyAxIDogc2NhbGVZO1xuICAgICAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgICAgIHRoaXMuc2tldy54ID0gc2tld1g7XG4gICAgICAgIHRoaXMuc2tldy55ID0gc2tld1k7XG4gICAgICAgIHRoaXMucGl2b3QueCA9IHBpdm90WDtcbiAgICAgICAgdGhpcy5waXZvdC55ID0gcGl2b3RZO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBCYXNlIGRlc3Ryb3kgbWV0aG9kIGZvciBnZW5lcmljIGRpc3BsYXkgb2JqZWN0cy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHlcbiAgICAgKiByZW1vdmUgdGhlIGRpc3BsYXkgb2JqZWN0IGZyb20gaXRzIHBhcmVudCBDb250YWluZXIgYXMgd2VsbCBhcyByZW1vdmVcbiAgICAgKiBhbGwgY3VycmVudCBldmVudCBsaXN0ZW5lcnMgYW5kIGludGVybmFsIHJlZmVyZW5jZXMuIERvIG5vdCB1c2UgYSBEaXNwbGF5T2JqZWN0XG4gICAgICogYWZ0ZXIgY2FsbGluZyBgZGVzdHJveSgpYC5cbiAgICAgKlxuICAgICAqL1xuICAgIERpc3BsYXlPYmplY3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRCb3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYXNrID0gbnVsbDtcblxuICAgICAgICB0aGlzLmZpbHRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlckFyZWEgPSBudWxsO1xuICAgICAgICB0aGlzLmhpdEFyZWEgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuaW50ZXJhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGl2ZUNoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5T2JqZWN0IG9uIHRoZSB4IGF4aXMgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBwYXJlbnQuXG4gICAgICogQW4gYWxpYXMgdG8gcG9zaXRpb24ueFxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy54LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMueC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9zaXRpb24ueCA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXlPYmplY3Qgb24gdGhlIHkgYXhpcyByZWxhdGl2ZSB0byB0aGUgbG9jYWwgY29vcmRpbmF0ZXMgb2YgdGhlIHBhcmVudC5cbiAgICAgKiBBbiBhbGlhcyB0byBwb3NpdGlvbi55XG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnkuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uLnk7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy55LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb3NpdGlvbi55ID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdHJhbnNmb3JtIG9mIHRoZSBvYmplY3QgYmFzZWQgb24gd29ybGQgKHBhcmVudCkgZmFjdG9ycy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuTWF0cml4fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53b3JsZFRyYW5zZm9ybS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYW5zZm9ybSBvZiB0aGUgb2JqZWN0IGJhc2VkIG9uIGxvY2FsIGZhY3RvcnM6IHBvc2l0aW9uLCBzY2FsZSwgb3RoZXIgc3R1ZmYuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLk1hdHJpeH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubG9jYWxUcmFuc2Zvcm0uZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhbFRyYW5zZm9ybTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvb3JkaW5hdGUgb2YgdGhlIG9iamVjdCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgY29vcmRpbmF0ZXMgb2YgdGhlIHBhcmVudC5cbiAgICAgKiBBc3NpZ25tZW50IGJ5IHZhbHVlIHNpbmNlIHBpeGktdjQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLklQb2ludH1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucG9zaXRpb24uZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb3NpdGlvbjtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnBvc2l0aW9uLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb3NpdGlvbi5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIG9iamVjdC5cbiAgICAgKiBBc3NpZ25tZW50IGJ5IHZhbHVlIHNpbmNlIHBpeGktdjQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLklQb2ludH1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuc2NhbGUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5zY2FsZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnNjYWxlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5zY2FsZS5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXZvdCBwb2ludCBvZiB0aGUgZGlzcGxheU9iamVjdCB0aGF0IGl0IHJvdGF0ZXMgYXJvdW5kLlxuICAgICAqIEFzc2lnbm1lbnQgYnkgdmFsdWUgc2luY2UgcGl4aS12NC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuSVBvaW50fVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5waXZvdC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdm90O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucGl2b3Quc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnBpdm90LmNvcHlGcm9tKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNrZXcgZmFjdG9yIGZvciB0aGUgb2JqZWN0IGluIHJhZGlhbnMuXG4gICAgICogQXNzaWdubWVudCBieSB2YWx1ZSBzaW5jZSBwaXhpLXY0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5PYnNlcnZhYmxlUG9pbnR9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnNrZXcuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5za2V3O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuc2tldy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uc2tldy5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByb3RhdGlvbiBvZiB0aGUgb2JqZWN0IGluIHJhZGlhbnMuXG4gICAgICogJ3JvdGF0aW9uJyBhbmQgJ2FuZ2xlJyBoYXZlIHRoZSBzYW1lIGVmZmVjdCBvbiBhIGRpc3BsYXkgb2JqZWN0OyByb3RhdGlvbiBpcyBpbiByYWRpYW5zLCBhbmdsZSBpcyBpbiBkZWdyZWVzLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5yb3RhdGlvbi5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJvdGF0aW9uO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucm90YXRpb24uc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJvdGF0aW9uID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbmdsZSBvZiB0aGUgb2JqZWN0IGluIGRlZ3JlZXMuXG4gICAgICogJ3JvdGF0aW9uJyBhbmQgJ2FuZ2xlJyBoYXZlIHRoZSBzYW1lIGVmZmVjdCBvbiBhIGRpc3BsYXkgb2JqZWN0OyByb3RhdGlvbiBpcyBpbiByYWRpYW5zLCBhbmdsZSBpcyBpbiBkZWdyZWVzLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbmdsZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJvdGF0aW9uICogUkFEX1RPX0RFRztcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmFuZ2xlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHZhbHVlICogREVHX1RPX1JBRDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHpJbmRleCBvZiB0aGUgZGlzcGxheU9iamVjdC5cbiAgICAgKiBJZiBhIGNvbnRhaW5lciBoYXMgdGhlIHNvcnRhYmxlQ2hpbGRyZW4gcHJvcGVydHkgc2V0IHRvIHRydWUsIGNoaWxkcmVuIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICAgICAqIHNvcnRlZCBieSB6SW5kZXggdmFsdWU7IGEgaGlnaGVyIHZhbHVlIHdpbGwgbWVhbiBpdCB3aWxsIGJlIG1vdmVkIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgYXJyYXksXG4gICAgICogYW5kIHRodXMgcmVuZGVyZWQgb24gdG9wIG9mIG90aGVyIGRpc3BsYXlPYmplY3RzIHdpdGhpbiB0aGUgc2FtZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnpJbmRleC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pJbmRleDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnpJbmRleC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5fekluZGV4ID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc29ydERpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG9iamVjdCBpcyBnbG9iYWxseSB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMud29ybGRWaXNpYmxlLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXM7XG5cbiAgICAgICAgZG9cbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFpdGVtLnZpc2libGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtID0gaXRlbS5wYXJlbnQ7XG4gICAgICAgIH0gd2hpbGUgKGl0ZW0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbWFzayBmb3IgdGhlIGRpc3BsYXlPYmplY3QuIEEgbWFzayBpcyBhbiBvYmplY3QgdGhhdCBsaW1pdHMgdGhlIHZpc2liaWxpdHkgb2YgYW5cbiAgICAgKiBvYmplY3QgdG8gdGhlIHNoYXBlIG9mIHRoZSBtYXNrIGFwcGxpZWQgdG8gaXQuIEluIFBpeGlKUyBhIHJlZ3VsYXIgbWFzayBtdXN0IGJlIGFcbiAgICAgKiB7QGxpbmsgUElYSS5HcmFwaGljc30gb3IgYSB7QGxpbmsgUElYSS5TcHJpdGV9IG9iamVjdC4gVGhpcyBhbGxvd3MgZm9yIG11Y2ggZmFzdGVyIG1hc2tpbmcgaW4gY2FudmFzIGFzIGl0XG4gICAgICogdXRpbGl0aWVzIHNoYXBlIGNsaXBwaW5nLiBUbyByZW1vdmUgYSBtYXNrLCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBGb3Igc3ByaXRlIG1hc2sgYm90aCBhbHBoYSBhbmQgcmVkIGNoYW5uZWwgYXJlIHVzZWQuIEJsYWNrIG1hc2sgaXMgdGhlIHNhbWUgYXMgdHJhbnNwYXJlbnQgbWFzay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcbiAgICAgKiBncmFwaGljcy5iZWdpbkZpbGwoMHhGRjMzMDApO1xuICAgICAqIGdyYXBoaWNzLmRyYXdSZWN0KDUwLCAyNTAsIDEwMCwgMTAwKTtcbiAgICAgKiBncmFwaGljcy5lbmRGaWxsKCk7XG4gICAgICpcbiAgICAgKiBjb25zdCBzcHJpdGUgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XG4gICAgICogc3ByaXRlLm1hc2sgPSBncmFwaGljcztcbiAgICAgKiBAdG9kbyBBdCB0aGUgbW9tZW50LCBQSVhJLkNhbnZhc1JlbmRlcmVyIGRvZXNuJ3Qgc3VwcG9ydCBQSVhJLlNwcml0ZSBhcyBtYXNrLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5Db250YWluZXJ8UElYSS5NYXNrRGF0YX1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWFzay5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hc2s7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5tYXNrLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fbWFzaylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG1hc2tPYmplY3QgPSB0aGlzLl9tYXNrLm1hc2tPYmplY3QgfHwgdGhpcy5fbWFzaztcblxuICAgICAgICAgICAgbWFza09iamVjdC5yZW5kZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hc2tPYmplY3QuaXNNYXNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXNrID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX21hc2spXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBtYXNrT2JqZWN0JDEgPSB0aGlzLl9tYXNrLm1hc2tPYmplY3QgfHwgdGhpcy5fbWFzaztcblxuICAgICAgICAgICAgbWFza09iamVjdCQxLnJlbmRlcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1hc2tPYmplY3QkMS5pc01hc2sgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBEaXNwbGF5T2JqZWN0LnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gRGlzcGxheU9iamVjdDtcbn0oRXZlbnRFbWl0dGVyKSk7XG5cbi8qKlxuICogRGlzcGxheU9iamVjdCBkZWZhdWx0IHVwZGF0ZVRyYW5zZm9ybSwgZG9lcyBub3QgdXBkYXRlIGNoaWxkcmVuIG9mIGNvbnRhaW5lci5cbiAqIFdpbGwgY3Jhc2ggaWYgdGhlcmUncyBubyBwYXJlbnQgZWxlbWVudC5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICogQGZ1bmN0aW9uIGRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm1cbiAqL1xuRGlzcGxheU9iamVjdC5wcm90b3R5cGUuZGlzcGxheU9iamVjdFVwZGF0ZVRyYW5zZm9ybSA9IERpc3BsYXlPYmplY3QucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybTtcblxuZnVuY3Rpb24gc29ydENoaWxkcmVuKGEsIGIpXG57XG4gICAgaWYgKGEuekluZGV4ID09PSBiLnpJbmRleClcbiAgICB7XG4gICAgICAgIHJldHVybiBhLl9sYXN0U29ydGVkSW5kZXggLSBiLl9sYXN0U29ydGVkSW5kZXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGEuekluZGV4IC0gYi56SW5kZXg7XG59XG5cbi8qKlxuICogQSBDb250YWluZXIgcmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZGlzcGxheSBvYmplY3RzLlxuICpcbiAqIEl0IGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBkaXNwbGF5IG9iamVjdHMgdGhhdCBhY3QgYXMgYSBjb250YWluZXIgZm9yIG90aGVyIG9iamVjdHMgKGxpa2UgU3ByaXRlcykuXG4gKlxuICpgYGBqc1xuICogbGV0IGNvbnRhaW5lciA9IG5ldyBQSVhJLkNvbnRhaW5lcigpO1xuICogY29udGFpbmVyLmFkZENoaWxkKHNwcml0ZSk7XG4gKiBgYGBcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuRGlzcGxheU9iamVjdFxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIENvbnRhaW5lciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKERpc3BsYXlPYmplY3QpIHtcbiAgICBmdW5jdGlvbiBDb250YWluZXIoKVxuICAgIHtcbiAgICAgICAgRGlzcGxheU9iamVjdC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXJyYXkgb2YgY2hpbGRyZW4gb2YgdGhpcyBjb250YWluZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuRGlzcGxheU9iamVjdFtdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBjb250YWluZXIgd2lsbCBzb3J0IGl0cyBjaGlsZHJlbiBieSB6SW5kZXggdmFsdWVcbiAgICAgICAgICogd2hlbiB1cGRhdGVUcmFuc2Zvcm0oKSBpcyBjYWxsZWQsIG9yIG1hbnVhbGx5IGlmIHNvcnRDaGlsZHJlbigpIGlzIGNhbGxlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBhY3R1YWxseSBjaGFuZ2VzIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXksIHNvIHNob3VsZCBiZSB0cmVhdGVkXG4gICAgICAgICAqIGFzIGEgYmFzaWMgc29sdXRpb24gdGhhdCBpcyBub3QgcGVyZm9ybWFudCBjb21wYXJlZCB0byBvdGhlciBzb2x1dGlvbnMsXG4gICAgICAgICAqIHN1Y2ggYXMgQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3BpeGlqcy9waXhpLWRpc3BsYXlcbiAgICAgICAgICpcbiAgICAgICAgICogQWxzbyBiZSBhd2FyZSBvZiB0aGF0IHRoaXMgbWF5IG5vdCB3b3JrIG5pY2VseSB3aXRoIHRoZSBhZGRDaGlsZEF0KCkgZnVuY3Rpb24sXG4gICAgICAgICAqIGFzIHRoZSB6SW5kZXggc29ydGluZyBtYXkgY2F1c2UgdGhlIGNoaWxkIHRvIGF1dG9tYXRpY2FsbHkgc29ydGVkIHRvIGFub3RoZXIgcG9zaXRpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUgUElYSS5zZXR0aW5ncy5TT1JUQUJMRV9DSElMRFJFTlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3J0YWJsZUNoaWxkcmVuID0gc2V0dGluZ3MuU09SVEFCTEVfQ0hJTERSRU47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBjaGlsZHJlbiBiZSBzb3J0ZWQgYnkgekluZGV4IGF0IHRoZSBuZXh0IHVwZGF0ZVRyYW5zZm9ybSBjYWxsLlxuICAgICAgICAgKiBXaWxsIGdldCBhdXRvbWF0aWNhbGx5IHNldCB0byB0cnVlIGlmIGEgbmV3IGNoaWxkIGlzIGFkZGVkLCBvciBpZiBhIGNoaWxkJ3MgekluZGV4IGNoYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvcnREaXJ0eSA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgRGlzcGxheU9iamVjdCBpcyBhZGRlZCB0byB0aGlzIENvbnRhaW5lci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuQ29udGFpbmVyI2NoaWxkQWRkZWRcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGNoaWxkIC0gVGhlIGNoaWxkIGFkZGVkIHRvIHRoZSBDb250YWluZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgdGhhdCBhZGRlZCB0aGUgY2hpbGQuXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjaGlsZHJlbidzIGluZGV4IG9mIHRoZSBhZGRlZCBjaGlsZC5cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBEaXNwbGF5T2JqZWN0IGlzIHJlbW92ZWQgZnJvbSB0aGlzIENvbnRhaW5lci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNyZW1vdmVkRnJvbVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gY2hpbGQgLSBUaGUgY2hpbGQgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWluZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgdGhhdCByZW1vdmVkIHJlbW92ZWQgdGhlIGNoaWxkLlxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgZm9ybWVyIGNoaWxkcmVuJ3MgaW5kZXggb2YgdGhlIHJlbW92ZWQgY2hpbGRcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgaWYgKCBEaXNwbGF5T2JqZWN0ICkgQ29udGFpbmVyLl9fcHJvdG9fXyA9IERpc3BsYXlPYmplY3Q7XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIERpc3BsYXlPYmplY3QgJiYgRGlzcGxheU9iamVjdC5wcm90b3R5cGUgKTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29udGFpbmVyO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgd2lkdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0saGVpZ2h0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkYWJsZSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBieSBDb250YWluZXIgc3ViY2xhc3NlcyB3aGVuZXZlciB0aGUgY2hpbGRyZW4gYXJyYXkgaXMgbW9kaWZpZWRcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLm9uQ2hpbGRyZW5DaGFuZ2UgPSBmdW5jdGlvbiBvbkNoaWxkcmVuQ2hhbmdlICgpXG4gICAge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG9uZSBvciBtb3JlIGNoaWxkcmVuIHRvIHRoZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBNdWx0aXBsZSBpdGVtcyBjYW4gYmUgYWRkZWQgbGlrZSBzbzogYG15Q29udGFpbmVyLmFkZENoaWxkKHRoaW5nT25lLCB0aGluZ1R3bywgdGhpbmdUaHJlZSlgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gey4uLlBJWEkuRGlzcGxheU9iamVjdH0gY2hpbGQgLSBUaGUgRGlzcGxheU9iamVjdChzKSB0byBhZGQgdG8gdGhlIGNvbnRhaW5lclxuICAgICAqIEByZXR1cm4ge1BJWEkuRGlzcGxheU9iamVjdH0gVGhlIGZpcnN0IGNoaWxkIHRoYXQgd2FzIGFkZGVkLlxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiBhZGRDaGlsZCAoY2hpbGQpXG4gICAge1xuICAgICAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUgYXJndW1lbnQgd2UgY2FuIGJ5cGFzcyBsb29waW5nIHRocm91Z2ggdGhlIHRoZW1cbiAgICAgICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA+IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgYXJndW1lbnRzIHByb3BlcnR5IGFuZCBhZGQgYWxsIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyB1c2UgaXQgdGhlIHJpZ2h0IHdheSAoLmxlbmd0aCBhbmQgW2ldKSBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIHN0aWxsIGJlIG9wdGltaXplZCBieSBKUyBydW50aW1lc1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHNMZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkKGFyZ3VtZW50cyQxW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBoYXMgYSBwYXJlbnQgdGhlbiBsZXRzIHJlbW92ZSBpdCBhcyBQaXhpSlMgb2JqZWN0cyBjYW4gb25seSBleGlzdCBpbiBvbmUgcGxhY2VcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2hpbGQucGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuc29ydERpcnR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gZW5zdXJlIGNoaWxkIHRyYW5zZm9ybSB3aWxsIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgICAgICAgY2hpbGQudHJhbnNmb3JtLl9wYXJlbnRJRCA9IC0xO1xuXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXG4gICAgICAgICAgICAvLyBlbnN1cmUgYm91bmRzIHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICB0aGlzLl9ib3VuZHNJRCsrO1xuXG4gICAgICAgICAgICAvLyBUT0RPIC0gbGV0cyBlaXRoZXIgZG8gYWxsIGNhbGxiYWNrcyBvciBhbGwgZXZlbnRzLi4gbm90IGJvdGghXG4gICAgICAgICAgICB0aGlzLm9uQ2hpbGRyZW5DaGFuZ2UodGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY2hpbGRBZGRlZCcsIGNoaWxkLCB0aGlzLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgY2hpbGQuZW1pdCgnYWRkZWQnLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNoaWxkIHRvIHRoZSBjb250YWluZXIgYXQgYSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gY2hpbGQgLSBUaGUgY2hpbGQgdG8gYWRkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IHRvIHBsYWNlIHRoZSBjaGlsZCBpblxuICAgICAqIEByZXR1cm4ge1BJWEkuRGlzcGxheU9iamVjdH0gVGhlIGNoaWxkIHRoYXQgd2FzIGFkZGVkLlxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuYWRkQ2hpbGRBdCA9IGZ1bmN0aW9uIGFkZENoaWxkQXQgKGNoaWxkLCBpbmRleClcbiAgICB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChjaGlsZCArIFwiYWRkQ2hpbGRBdDogVGhlIGluZGV4IFwiICsgaW5kZXggKyBcIiBzdXBwbGllZCBpcyBvdXQgb2YgYm91bmRzIFwiICsgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkLnBhcmVudClcbiAgICAgICAge1xuICAgICAgICAgICAgY2hpbGQucGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHRoaXMuc29ydERpcnR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBlbnN1cmUgY2hpbGQgdHJhbnNmb3JtIHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgIGNoaWxkLnRyYW5zZm9ybS5fcGFyZW50SUQgPSAtMTtcblxuICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgY2hpbGQpO1xuXG4gICAgICAgIC8vIGVuc3VyZSBib3VuZHMgd2lsbCBiZSByZWNhbGN1bGF0ZWRcbiAgICAgICAgdGhpcy5fYm91bmRzSUQrKztcblxuICAgICAgICAvLyBUT0RPIC0gbGV0cyBlaXRoZXIgZG8gYWxsIGNhbGxiYWNrcyBvciBhbGwgZXZlbnRzLi4gbm90IGJvdGghXG4gICAgICAgIHRoaXMub25DaGlsZHJlbkNoYW5nZShpbmRleCk7XG4gICAgICAgIGNoaWxkLmVtaXQoJ2FkZGVkJywgdGhpcyk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hpbGRBZGRlZCcsIGNoaWxkLCB0aGlzLCBpbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTd2FwcyB0aGUgcG9zaXRpb24gb2YgMiBEaXNwbGF5IE9iamVjdHMgd2l0aGluIHRoaXMgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGNoaWxkIC0gRmlyc3QgZGlzcGxheSBvYmplY3QgdG8gc3dhcFxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBjaGlsZDIgLSBTZWNvbmQgZGlzcGxheSBvYmplY3QgdG8gc3dhcFxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuc3dhcENoaWxkcmVuID0gZnVuY3Rpb24gc3dhcENoaWxkcmVuIChjaGlsZCwgY2hpbGQyKVxuICAgIHtcbiAgICAgICAgaWYgKGNoaWxkID09PSBjaGlsZDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRleDEgPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuICAgICAgICB2YXIgaW5kZXgyID0gdGhpcy5nZXRDaGlsZEluZGV4KGNoaWxkMik7XG5cbiAgICAgICAgdGhpcy5jaGlsZHJlbltpbmRleDFdID0gY2hpbGQyO1xuICAgICAgICB0aGlzLmNoaWxkcmVuW2luZGV4Ml0gPSBjaGlsZDtcbiAgICAgICAgdGhpcy5vbkNoaWxkcmVuQ2hhbmdlKGluZGV4MSA8IGluZGV4MiA/IGluZGV4MSA6IGluZGV4Mik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIGEgY2hpbGQgRGlzcGxheU9iamVjdCBpbnN0YW5jZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGNoaWxkIC0gVGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdG8gaWRlbnRpZnlcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgY2hpbGQgZGlzcGxheSBvYmplY3QgdG8gaWRlbnRpZnlcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldENoaWxkSW5kZXggPSBmdW5jdGlvbiBnZXRDaGlsZEluZGV4IChjaGlsZClcbiAgICB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjaGlsZCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VwcGxpZWQgRGlzcGxheU9iamVjdCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIGNhbGxlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiBhbiBleGlzdGluZyBjaGlsZCBpbiB0aGUgZGlzcGxheSBvYmplY3QgY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gY2hpbGQgLSBUaGUgY2hpbGQgRGlzcGxheU9iamVjdCBpbnN0YW5jZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBpbmRleCBudW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgcmVzdWx0aW5nIGluZGV4IG51bWJlciBmb3IgdGhlIGNoaWxkIGRpc3BsYXkgb2JqZWN0XG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5zZXRDaGlsZEluZGV4ID0gZnVuY3Rpb24gc2V0Q2hpbGRJbmRleCAoY2hpbGQsIGluZGV4KVxuICAgIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChcIlRoZSBpbmRleCBcIiArIGluZGV4ICsgXCIgc3VwcGxpZWQgaXMgb3V0IG9mIGJvdW5kcyBcIiArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpO1xuXG4gICAgICAgIHJlbW92ZUl0ZW1zKHRoaXMuY2hpbGRyZW4sIGN1cnJlbnRJbmRleCwgMSk7IC8vIHJlbW92ZSBmcm9tIG9sZCBwb3NpdGlvblxuICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMCwgY2hpbGQpOyAvLyBhZGQgYXQgbmV3IHBvc2l0aW9uXG5cbiAgICAgICAgdGhpcy5vbkNoaWxkcmVuQ2hhbmdlKGluZGV4KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2hpbGQgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IHRvIGdldCB0aGUgY2hpbGQgYXRcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkRpc3BsYXlPYmplY3R9IFRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGFueS5cbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldENoaWxkQXQgPSBmdW5jdGlvbiBnZXRDaGlsZEF0IChpbmRleClcbiAgICB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJnZXRDaGlsZEF0OiBJbmRleCAoXCIgKyBpbmRleCArIFwiKSBkb2VzIG5vdCBleGlzdC5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5baW5kZXhdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG9uZSBvciBtb3JlIGNoaWxkcmVuIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uUElYSS5EaXNwbGF5T2JqZWN0fSBjaGlsZCAtIFRoZSBEaXNwbGF5T2JqZWN0KHMpIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm4ge1BJWEkuRGlzcGxheU9iamVjdH0gVGhlIGZpcnN0IGNoaWxkIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIHJlbW92ZUNoaWxkIChjaGlsZClcbiAgICB7XG4gICAgICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgICAgICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCB3ZSBjYW4gYnlwYXNzIGxvb3BpbmcgdGhyb3VnaCB0aGUgdGhlbVxuICAgICAgICBpZiAoYXJndW1lbnRzTGVuZ3RoID4gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBhcmd1bWVudHMgcHJvcGVydHkgYW5kIGFkZCBhbGwgY2hpbGRyZW5cbiAgICAgICAgICAgIC8vIHVzZSBpdCB0aGUgcmlnaHQgd2F5ICgubGVuZ3RoIGFuZCBbaV0pIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gc3RpbGwgYmUgb3B0aW1pemVkIGJ5IEpTIHJ1bnRpbWVzXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50c0xlbmd0aDsgaSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoYXJndW1lbnRzJDFbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKGNoaWxkKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW5zdXJlIGNoaWxkIHRyYW5zZm9ybSB3aWxsIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgICAgICAgY2hpbGQudHJhbnNmb3JtLl9wYXJlbnRJRCA9IC0xO1xuICAgICAgICAgICAgcmVtb3ZlSXRlbXModGhpcy5jaGlsZHJlbiwgaW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAvLyBlbnN1cmUgYm91bmRzIHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgICAgICB0aGlzLl9ib3VuZHNJRCsrO1xuXG4gICAgICAgICAgICAvLyBUT0RPIC0gbGV0cyBlaXRoZXIgZG8gYWxsIGNhbGxiYWNrcyBvciBhbGwgZXZlbnRzLi4gbm90IGJvdGghXG4gICAgICAgICAgICB0aGlzLm9uQ2hpbGRyZW5DaGFuZ2UoaW5kZXgpO1xuICAgICAgICAgICAgY2hpbGQuZW1pdCgncmVtb3ZlZCcsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjaGlsZFJlbW92ZWQnLCBjaGlsZCwgdGhpcywgaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IHRvIGdldCB0aGUgY2hpbGQgZnJvbVxuICAgICAqIEByZXR1cm4ge1BJWEkuRGlzcGxheU9iamVjdH0gVGhlIGNoaWxkIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZEF0ID0gZnVuY3Rpb24gcmVtb3ZlQ2hpbGRBdCAoaW5kZXgpXG4gICAge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmdldENoaWxkQXQoaW5kZXgpO1xuXG4gICAgICAgIC8vIGVuc3VyZSBjaGlsZCB0cmFuc2Zvcm0gd2lsbCBiZSByZWNhbGN1bGF0ZWQuLlxuICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsO1xuICAgICAgICBjaGlsZC50cmFuc2Zvcm0uX3BhcmVudElEID0gLTE7XG4gICAgICAgIHJlbW92ZUl0ZW1zKHRoaXMuY2hpbGRyZW4sIGluZGV4LCAxKTtcblxuICAgICAgICAvLyBlbnN1cmUgYm91bmRzIHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgIHRoaXMuX2JvdW5kc0lEKys7XG5cbiAgICAgICAgLy8gVE9ETyAtIGxldHMgZWl0aGVyIGRvIGFsbCBjYWxsYmFja3Mgb3IgYWxsIGV2ZW50cy4uIG5vdCBib3RoIVxuICAgICAgICB0aGlzLm9uQ2hpbGRyZW5DaGFuZ2UoaW5kZXgpO1xuICAgICAgICBjaGlsZC5lbWl0KCdyZW1vdmVkJywgdGhpcyk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hpbGRSZW1vdmVkJywgY2hpbGQsIHRoaXMsIGluZGV4KTtcblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGNoaWxkcmVuIGZyb20gdGhpcyBjb250YWluZXIgdGhhdCBhcmUgd2l0aGluIHRoZSBiZWdpbiBhbmQgZW5kIGluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2JlZ2luSW5kZXg9MF0gLSBUaGUgYmVnaW5uaW5nIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kSW5kZXg9dGhpcy5jaGlsZHJlbi5sZW5ndGhdIC0gVGhlIGVuZGluZyBwb3NpdGlvbi4gRGVmYXVsdCB2YWx1ZSBpcyBzaXplIG9mIHRoZSBjb250YWluZXIuXG4gICAgICogQHJldHVybnMge1BJWEkuRGlzcGxheU9iamVjdFtdfSBMaXN0IG9mIHJlbW92ZWQgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLnJlbW92ZUNoaWxkcmVuID0gZnVuY3Rpb24gcmVtb3ZlQ2hpbGRyZW4gKGJlZ2luSW5kZXgsIGVuZEluZGV4KVxuICAgIHtcbiAgICAgICAgaWYgKCBiZWdpbkluZGV4ID09PSB2b2lkIDAgKSBiZWdpbkluZGV4ID0gMDtcblxuICAgICAgICB2YXIgYmVnaW4gPSBiZWdpbkluZGV4O1xuICAgICAgICB2YXIgZW5kID0gdHlwZW9mIGVuZEluZGV4ID09PSAnbnVtYmVyJyA/IGVuZEluZGV4IDogdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIHZhciByYW5nZSA9IGVuZCAtIGJlZ2luO1xuICAgICAgICB2YXIgcmVtb3ZlZDtcblxuICAgICAgICBpZiAocmFuZ2UgPiAwICYmIHJhbmdlIDw9IGVuZClcbiAgICAgICAge1xuICAgICAgICAgICAgcmVtb3ZlZCA9IHRoaXMuY2hpbGRyZW4uc3BsaWNlKGJlZ2luLCByYW5nZSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkW2ldLnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRbaV0udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFtpXS50cmFuc2Zvcm0uX3BhcmVudElEID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9ib3VuZHNJRCsrO1xuXG4gICAgICAgICAgICB0aGlzLm9uQ2hpbGRyZW5DaGFuZ2UoYmVnaW5JbmRleCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHJlbW92ZWQubGVuZ3RoOyArK2kkMSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkW2kkMV0uZW1pdCgncmVtb3ZlZCcsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnY2hpbGRSZW1vdmVkJywgcmVtb3ZlZFtpJDFdLCB0aGlzLCBpJDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYW5nZSA9PT0gMCAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlbW92ZUNoaWxkcmVuOiBudW1lcmljIHZhbHVlcyBhcmUgb3V0c2lkZSB0aGUgYWNjZXB0YWJsZSByYW5nZS4nKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU29ydHMgY2hpbGRyZW4gYnkgekluZGV4LiBQcmV2aW91cyBvcmRlciBpcyBtYW50YWluZWQgZm9yIDIgY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSB6SW5kZXguXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5zb3J0Q2hpbGRyZW4gPSBmdW5jdGlvbiBzb3J0Q2hpbGRyZW4kMSAoKVxuICAgIHtcbiAgICAgICAgdmFyIHNvcnRSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG5cbiAgICAgICAgICAgIGNoaWxkLl9sYXN0U29ydGVkSW5kZXggPSBpO1xuXG4gICAgICAgICAgICBpZiAoIXNvcnRSZXF1aXJlZCAmJiBjaGlsZC56SW5kZXggIT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc29ydFJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3J0UmVxdWlyZWQgJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNvcnQoc29ydENoaWxkcmVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc29ydERpcnR5ID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHRyYW5zZm9ybSBvbiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBjb250YWluZXIgZm9yIHJlbmRlcmluZ1xuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zb3J0YWJsZUNoaWxkcmVuICYmIHRoaXMuc29ydERpcnR5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNvcnRDaGlsZHJlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYm91bmRzSUQrKztcblxuICAgICAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGVUcmFuc2Zvcm0odGhpcy5wYXJlbnQudHJhbnNmb3JtKTtcblxuICAgICAgICAvLyBUT0RPOiBjaGVjayByZW5kZXIgZmxhZ3MsIGhvdyB0byBwcm9jZXNzIHN0dWZmIGhlcmVcbiAgICAgICAgdGhpcy53b3JsZEFscGhhID0gdGhpcy5hbHBoYSAqIHRoaXMucGFyZW50LndvcmxkQWxwaGE7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGo7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkLnZpc2libGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2hpbGQudXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuY2FsY3VsYXRlQm91bmRzID0gZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICB0aGlzLl9ib3VuZHMuY2xlYXIoKTtcblxuICAgICAgICB0aGlzLl9jYWxjdWxhdGVCb3VuZHMoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG5cbiAgICAgICAgICAgIGlmICghY2hpbGQudmlzaWJsZSB8fCAhY2hpbGQucmVuZGVyYWJsZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGQuY2FsY3VsYXRlQm91bmRzKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpbHRlcittYXNrLCBuZWVkIHRvIG1hc2sgYm90aCBzb21laG93XG4gICAgICAgICAgICBpZiAoY2hpbGQuX21hc2spXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIG1hc2tPYmplY3QgPSBjaGlsZC5fbWFzay5tYXNrT2JqZWN0IHx8IGNoaWxkLl9tYXNrO1xuXG4gICAgICAgICAgICAgICAgbWFza09iamVjdC5jYWxjdWxhdGVCb3VuZHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib3VuZHMuYWRkQm91bmRzTWFzayhjaGlsZC5fYm91bmRzLCBtYXNrT2JqZWN0Ll9ib3VuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQuZmlsdGVyQXJlYSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib3VuZHMuYWRkQm91bmRzQXJlYShjaGlsZC5fYm91bmRzLCBjaGlsZC5maWx0ZXJBcmVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib3VuZHMuYWRkQm91bmRzKGNoaWxkLl9ib3VuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdEJvdW5kc0lEID0gdGhpcy5fYm91bmRzSUQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBvYmplY3QuIE92ZXJyaWRlIHRoaXMgdG9cbiAgICAgKiBjYWxjdWxhdGUgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWMgb2JqZWN0IChub3QgaW5jbHVkaW5nIGNoaWxkcmVuKS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLl9jYWxjdWxhdGVCb3VuZHMgPSBmdW5jdGlvbiBfY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICAvLyBGSUxMIElOLy9cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgb2JqZWN0IHVzaW5nIHRoZSBXZWJHTCByZW5kZXJlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIC8vIGlmIHRoZSBvYmplY3QgaXMgbm90IHZpc2libGUgb3IgdGhlIGFscGhhIGlzIDAgdGhlbiBubyBuZWVkIHRvIHJlbmRlciB0aGlzIGVsZW1lbnRcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGUgfHwgdGhpcy53b3JsZEFscGhhIDw9IDAgfHwgIXRoaXMucmVuZGVyYWJsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZG8gYSBxdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBlbGVtZW50IGhhcyBhIG1hc2sgb3IgYSBmaWx0ZXIuXG4gICAgICAgIGlmICh0aGlzLl9tYXNrIHx8ICh0aGlzLmZpbHRlcnMgJiYgdGhpcy5maWx0ZXJzLmxlbmd0aCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQWR2YW5jZWQocmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKHJlbmRlcmVyKTtcblxuICAgICAgICAgICAgLy8gc2ltcGxlIHJlbmRlciBjaGlsZHJlbiFcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBqOyArK2kpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5yZW5kZXIocmVuZGVyZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlciB0aGUgb2JqZWN0IHVzaW5nIHRoZSBXZWJHTCByZW5kZXJlciBhbmQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyQWR2YW5jZWQgPSBmdW5jdGlvbiByZW5kZXJBZHZhbmNlZCAocmVuZGVyZXIpXG4gICAge1xuICAgICAgICByZW5kZXJlci5iYXRjaC5mbHVzaCgpO1xuXG4gICAgICAgIHZhciBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzO1xuICAgICAgICB2YXIgbWFzayA9IHRoaXMuX21hc2s7XG5cbiAgICAgICAgLy8gcHVzaCBmaWx0ZXIgZmlyc3QgYXMgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHN0ZW5jaWwgYnVmZmVyIGlzIGNvcnJlY3QgZm9yIGFueSBtYXNraW5nXG4gICAgICAgIGlmIChmaWx0ZXJzKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWRGaWx0ZXJzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZWRGaWx0ZXJzID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWRGaWx0ZXJzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyc1tpXS5lbmFibGVkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlZEZpbHRlcnMucHVzaChmaWx0ZXJzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkRmlsdGVycy5sZW5ndGgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZmlsdGVyLnB1c2godGhpcywgdGhpcy5fZW5hYmxlZEZpbHRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hc2spXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLm1hc2sucHVzaCh0aGlzLCB0aGlzLl9tYXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGlzIG9iamVjdCB0byB0aGUgYmF0Y2gsIG9ubHkgcmVuZGVyZWQgaWYgaXQgaGFzIGEgdGV4dHVyZS5cbiAgICAgICAgdGhpcy5fcmVuZGVyKHJlbmRlcmVyKTtcblxuICAgICAgICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBjaGlsZHJlbiBhbmQgbWFrZSBzdXJlIHRoZXkgZ2V0IHJlbmRlcmVkXG4gICAgICAgIGZvciAodmFyIGkkMSA9IDAsIGogPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSQxIDwgajsgaSQxKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baSQxXS5yZW5kZXIocmVuZGVyZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVuZGVyZXIuYmF0Y2guZmx1c2goKTtcblxuICAgICAgICBpZiAobWFzaylcbiAgICAgICAge1xuICAgICAgICAgICAgcmVuZGVyZXIubWFzay5wb3AodGhpcywgdGhpcy5fbWFzayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVycyAmJiB0aGlzLl9lbmFibGVkRmlsdGVycyAmJiB0aGlzLl9lbmFibGVkRmlsdGVycy5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmZpbHRlci5wb3AoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUbyBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzdWJjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiBfcmVuZGVyIChyZW5kZXJlcikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHtcbiAgICAgICAgLy8gdGhpcyBpcyB3aGVyZSBjb250ZW50IGl0c2VsZiBnZXRzIHJlbmRlcmVkLi4uXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgYW5kIGxpc3RlbmVycyBhcyB3ZWxsIGFzIHJlbW92ZXMgY2hpbGRyZW4gZnJvbSB0aGUgZGlzcGxheSBsaXN0LlxuICAgICAqIERvIG5vdCB1c2UgYSBDb250YWluZXIgYWZ0ZXIgY2FsbGluZyBgZGVzdHJveWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdHxib29sZWFufSBbb3B0aW9uc10gLSBPcHRpb25zIHBhcmFtZXRlci4gQSBib29sZWFuIHdpbGwgYWN0IGFzIGlmIGFsbCBvcHRpb25zXG4gICAgICogIGhhdmUgYmVlbiBzZXQgdG8gdGhhdCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hpbGRyZW49ZmFsc2VdIC0gaWYgc2V0IHRvIHRydWUsIGFsbCB0aGUgY2hpbGRyZW4gd2lsbCBoYXZlIHRoZWlyIGRlc3Ryb3lcbiAgICAgKiAgbWV0aG9kIGNhbGxlZCBhcyB3ZWxsLiAnb3B0aW9ucycgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhvc2UgY2FsbHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBvcHRpb25zLmNoaWxkcmVuIGlzIHNldCB0byB0cnVlXG4gICAgICogIFNob3VsZCBpdCBkZXN0cm95IHRoZSB0ZXh0dXJlIG9mIHRoZSBjaGlsZCBzcHJpdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhc2VUZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBvcHRpb25zLmNoaWxkcmVuIGlzIHNldCB0byB0cnVlXG4gICAgICogIFNob3VsZCBpdCBkZXN0cm95IHRoZSBiYXNlIHRleHR1cmUgb2YgdGhlIGNoaWxkIHNwcml0ZVxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICBEaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5zb3J0RGlydHkgPSBmYWxzZTtcblxuICAgICAgICB2YXIgZGVzdHJveUNoaWxkcmVuID0gdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMgOiBvcHRpb25zICYmIG9wdGlvbnMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIG9sZENoaWxkcmVuID0gdGhpcy5yZW1vdmVDaGlsZHJlbigwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3lDaGlsZHJlbilcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRDaGlsZHJlbi5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvbGRDaGlsZHJlbltpXS5kZXN0cm95KG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgQ29udGFpbmVyLCBzZXR0aW5nIHRoaXMgd2lsbCBhY3R1YWxseSBtb2RpZnkgdGhlIHNjYWxlIHRvIGFjaGlldmUgdGhlIHZhbHVlIHNldFxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53aWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUueCAqIHRoaXMuZ2V0TG9jYWxCb3VuZHMoKS53aWR0aDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLndpZHRoLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLmdldExvY2FsQm91bmRzKCkud2lkdGg7XG5cbiAgICAgICAgaWYgKHdpZHRoICE9PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlLnggPSB2YWx1ZSAvIHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zY2FsZS54ID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIENvbnRhaW5lciwgc2V0dGluZyB0aGlzIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSBzY2FsZSB0byBhY2hpZXZlIHRoZSB2YWx1ZSBzZXRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZS55ICogdGhpcy5nZXRMb2NhbEJvdW5kcygpLmhlaWdodDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmhlaWdodC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuZ2V0TG9jYWxCb3VuZHMoKS5oZWlnaHQ7XG5cbiAgICAgICAgaWYgKGhlaWdodCAhPT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zY2FsZS55ID0gdmFsdWUgLyBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlLnkgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gdmFsdWU7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBDb250YWluZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBDb250YWluZXI7XG59KERpc3BsYXlPYmplY3QpKTtcblxuLy8gcGVyZm9ybWFuY2UgaW5jcmVhc2UgdG8gYXZvaWQgdXNpbmcgY2FsbC4uICgxMHggZmFzdGVyKVxuQ29udGFpbmVyLnByb3RvdHlwZS5jb250YWluZXJVcGRhdGVUcmFuc2Zvcm0gPSBDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybTtcblxuZXhwb3J0IHsgQm91bmRzLCBDb250YWluZXIsIERpc3BsYXlPYmplY3QgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpc3BsYXkuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL2FjY2Vzc2liaWxpdHkgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvYWNjZXNzaWJpbGl0eSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IGlzTW9iaWxlLCByZW1vdmVJdGVtcyB9IGZyb20gJ0BwaXhpL3V0aWxzJztcbmltcG9ydCB7IERpc3BsYXlPYmplY3QgfSBmcm9tICdAcGl4aS9kaXNwbGF5JztcblxuLyoqXG4gKiBEZWZhdWx0IHByb3BlcnR5IHZhbHVlcyBvZiBhY2Nlc3NpYmxlIG9iamVjdHNcbiAqIHVzZWQgYnkge0BsaW5rIFBJWEkuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcn0uXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBhY2Nlc3NpYmxlVGFyZ2V0XG4gKiBAbWVtYmVyb2YgUElYSS5hY2Nlc3NpYmlsaXR5XG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQGV4YW1wbGVcbiAqICAgICAgZnVuY3Rpb24gTXlPYmplY3QoKSB7fVxuICpcbiAqICAgICAgT2JqZWN0LmFzc2lnbihcbiAqICAgICAgICAgIE15T2JqZWN0LnByb3RvdHlwZSxcbiAqICAgICAgICAgIFBJWEkuYWNjZXNzaWJpbGl0eS5hY2Nlc3NpYmxlVGFyZ2V0XG4gKiAgICAgICk7XG4gKi9cbnZhciBhY2Nlc3NpYmxlVGFyZ2V0ID0ge1xuICAgIC8qKlxuICAgICAqICBGbGFnIGZvciBpZiB0aGUgb2JqZWN0IGlzIGFjY2Vzc2libGUuIElmIHRydWUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgd2lsbCBvdmVybGF5IGFcbiAgICAgKiAgIHNoYWRvdyBkaXYgd2l0aCBhdHRyaWJ1dGVzIHNldFxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICAgICAqL1xuICAgIGFjY2Vzc2libGU6IGZhbHNlLFxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGl0bGUgYXR0cmlidXRlIG9mIHRoZSBzaGFkb3cgZGl2XG4gICAgICogSWYgYWNjZXNzaWJsZVRpdGxlIEFORCBhY2Nlc3NpYmxlSGludCBoYXMgbm90IGJlZW4gdGhpcyB3aWxsIGRlZmF1bHQgdG8gJ2Rpc3BsYXlPYmplY3QgW3RhYkluZGV4XSdcbiAgICAgKlxuICAgICAqIEBtZW1iZXIgez9zdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAgICAgKi9cbiAgICBhY2Nlc3NpYmxlVGl0bGU6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhcmlhLWxhYmVsIGF0dHJpYnV0ZSBvZiB0aGUgc2hhZG93IGRpdlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICovXG4gICAgYWNjZXNzaWJsZUhpbnQ6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0b2RvIE5lZWRzIGRvY3MuXG4gICAgICovXG4gICAgdGFiSW5kZXg6IDAsXG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICogQHRvZG8gTmVlZHMgZG9jcy5cbiAgICAgKi9cbiAgICBfYWNjZXNzaWJsZUFjdGl2ZTogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICogQHRvZG8gTmVlZHMgZG9jcy5cbiAgICAgKi9cbiAgICBfYWNjZXNzaWJsZURpdjogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSB0eXBlIG9mIGRpdiB0aGUgYWNjZXNzaWJsZSBsYXllciBpcy4gU2NyZWVuIHJlYWRlcnMgdHJlYXQgdGhlIGVsZW1lbnQgZGlmZmVyZW50bHlcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhpcyB0eXBlLiBEZWZhdWx0cyB0byBidXR0b24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAgICAgKiBAZGVmYXVsdCAnYnV0dG9uJ1xuICAgICAqL1xuICAgIGFjY2Vzc2libGVUeXBlOiAnYnV0dG9uJyxcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIHBvaW50ZXItZXZlbnRzIHRoZSBhY2Nlc3NpYmxlIGRpdiB3aWxsIHVzZVxuICAgICAqIERlZmF1bHRzIHRvIGF1dG8uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAgICAgKiBAZGVmYXVsdCAnYXV0bydcbiAgICAgKi9cbiAgICBhY2Nlc3NpYmxlUG9pbnRlckV2ZW50czogJ2F1dG8nLFxuXG4gICAgLyoqXG4gICAgICogU2V0dGluZyB0byBmYWxzZSB3aWxsIHByZXZlbnQgYW55IGNoaWxkcmVuIGluc2lkZSB0aGlzIGNvbnRhaW5lciB0b1xuICAgICAqIGJlIGFjY2Vzc2libGUuIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGFjY2Vzc2libGVDaGlsZHJlbjogdHJ1ZSxcbn07XG5cbi8vIGFkZCBzb21lIGV4dHJhIHZhcmlhYmxlcyB0byB0aGUgY29udGFpbmVyLi5cbkRpc3BsYXlPYmplY3QubWl4aW4oYWNjZXNzaWJsZVRhcmdldCk7XG5cbnZhciBLRVlfQ09ERV9UQUIgPSA5O1xuXG52YXIgRElWX1RPVUNIX1NJWkUgPSAxMDA7XG52YXIgRElWX1RPVUNIX1BPU19YID0gMDtcbnZhciBESVZfVE9VQ0hfUE9TX1kgPSAwO1xudmFyIERJVl9UT1VDSF9aSU5ERVggPSAyO1xuXG52YXIgRElWX0hPT0tfU0laRSA9IDE7XG52YXIgRElWX0hPT0tfUE9TX1ggPSAtMTAwMDtcbnZhciBESVZfSE9PS19QT1NfWSA9IC0xMDAwO1xudmFyIERJVl9IT09LX1pJTkRFWCA9IDI7XG5cbi8qKlxuICogVGhlIEFjY2Vzc2liaWxpdHkgbWFuYWdlciByZWNyZWF0ZXMgdGhlIGFiaWxpdHkgdG8gdGFiIGFuZCBoYXZlIGNvbnRlbnQgcmVhZCBieSBzY3JlZW4gcmVhZGVycy5cbiAqIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgYXMgaXQgY2FuIHBvc3NpYmx5IGhlbHAgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIGFjY2VzcyBQaXhpSlMgY29udGVudC5cbiAqXG4gKiBBIERpc3BsYXlPYmplY3QgY2FuIGJlIG1hZGUgYWNjZXNzaWJsZSBqdXN0IGxpa2UgaXQgY2FuIGJlIG1hZGUgaW50ZXJhY3RpdmUuIFRoaXMgbWFuYWdlciB3aWxsIG1hcCB0aGVcbiAqIGV2ZW50cyBhcyBpZiB0aGUgbW91c2Ugd2FzIGJlaW5nIHVzZWQsIG1pbmltaXppbmcgdGhlIGVmZm9ydCByZXF1aXJlZCB0byBpbXBsZW1lbnQuXG4gKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgZGVmYXVsdCwgYW5kIGNhbiBiZSBmb3VuZCBhdCBgcmVuZGVyZXIucGx1Z2lucy5hY2Nlc3NpYmlsaXR5YFxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkuYWNjZXNzaWJpbGl0eVxuICovXG52YXIgQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBmdW5jdGlvbiBBY2Nlc3NpYmlsaXR5TWFuYWdlcihyZW5kZXJlcilcbntcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7P0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5faG9va0RpdiA9IG51bGw7XG4gICAgaWYgKGlzTW9iaWxlLnRhYmxldCB8fCBpc01vYmlsZS5waG9uZSlcbiAgICB7XG4gICAgICAgIHRoaXMuY3JlYXRlVG91Y2hIb29rKCk7XG4gICAgfVxuXG4gICAgLy8gZmlyc3Qgd2UgY3JlYXRlIGEgZGl2IHRoYXQgd2lsbCBzaXQgb3ZlciB0aGUgUGl4aUpTIGVsZW1lbnQuIFRoaXMgaXMgd2hlcmUgdGhlIGRpdiBvdmVybGF5cyB3aWxsIGdvLlxuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGRpdi5zdHlsZS53aWR0aCA9IERJVl9UT1VDSF9TSVpFICsgXCJweFwiO1xuICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBESVZfVE9VQ0hfU0laRSArIFwicHhcIjtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSBESVZfVE9VQ0hfUE9TX1ggKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLmxlZnQgPSBESVZfVE9VQ0hfUE9TX1kgKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLnpJbmRleCA9IERJVl9UT1VDSF9aSU5ERVg7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBkb20gZWxlbWVudCB0aGF0IHdpbGwgc2l0IG92ZXIgdGhlIFBpeGlKUyBlbGVtZW50LiBUaGlzIGlzIHdoZXJlIHRoZSBkaXYgb3ZlcmxheXMgd2lsbCBnby5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgcG9vbCBmb3Igc3RvcmluZyBkaXZzLlxuICAgICAqXG4gICAgICogQHR5cGUgeyp9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnBvb2wgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSB0aWNrIHVzZWQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIG5vIGxvbmdlciBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcklkID0gMDtcblxuICAgIC8qKlxuICAgICAqIFNldHRpbmcgdGhpcyB0byB0cnVlIHdpbGwgdmlzdWFsbHkgc2hvdyB0aGUgZGl2cy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuZGVidWcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZW5kZXJlciB0aGlzIGFjY2Vzc2liaWxpdHkgbWFuYWdlciB3b3JrcyBmb3IuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkFic3RyYWN0UmVuZGVyZXJ9XG4gICAgICovXG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFycmF5IG9mIGN1cnJlbnRseSBhY3RpdmUgYWNjZXNzaWJsZSBpdGVtcy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge0FycmF5PCo+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogcHJlLWJpbmQgdGhlIGZ1bmN0aW9uc1xuICAgICAqXG4gICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fb25LZXlEb3duID0gdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBwcmUtYmluZCB0aGUgZnVuY3Rpb25zXG4gICAgICpcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9vbk1vdXNlTW92ZSA9IHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmlzTW9iaWxlQWNjZXNzaWJpbGl0eSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogY291bnQgdG8gdGhyb3R0bGUgZGl2IHVwZGF0ZXMgb24gYW5kcm9pZCBkZXZpY2VzXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmFuZHJvaWRVcGRhdGVDb3VudCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgZnJlcXVlbmN5IHRvIHVwZGF0ZSB0aGUgZGl2IGVsZW1lbnRzICgpXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmFuZHJvaWRVcGRhdGVGcmVxdWVuY3kgPSA1MDA7IC8vIDJmcHNcblxuICAgIC8vIGxldCBsaXN0ZW4gZm9yIHRhYi4uIG9uY2UgcHJlc3NlZCB3ZSBjYW4gZmlyZSB1cCBhbmQgc2hvdyB0aGUgYWNjZXNzaWJpbGl0eSBsYXllclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHRvdWNoIGhvb2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbkFjY2Vzc2liaWxpdHlNYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGVUb3VjaEhvb2sgPSBmdW5jdGlvbiBjcmVhdGVUb3VjaEhvb2sgKClcbntcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgaG9va0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuXG4gICAgaG9va0Rpdi5zdHlsZS53aWR0aCA9IERJVl9IT09LX1NJWkUgKyBcInB4XCI7XG4gICAgaG9va0Rpdi5zdHlsZS5oZWlnaHQgPSBESVZfSE9PS19TSVpFICsgXCJweFwiO1xuICAgIGhvb2tEaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGhvb2tEaXYuc3R5bGUudG9wID0gRElWX0hPT0tfUE9TX1ggKyBcInB4XCI7XG4gICAgaG9va0Rpdi5zdHlsZS5sZWZ0ID0gRElWX0hPT0tfUE9TX1kgKyBcInB4XCI7XG4gICAgaG9va0Rpdi5zdHlsZS56SW5kZXggPSBESVZfSE9PS19aSU5ERVg7XG4gICAgaG9va0Rpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0ZGMDAwMCc7XG4gICAgaG9va0Rpdi50aXRsZSA9ICdzZWxlY3QgdG8gZW5hYmxlIGFjY2Vzc2FiaWxpdHkgZm9yIHRoaXMgY29udGVudCc7XG5cbiAgICBob29rRGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzJDEuaXNNb2JpbGVBY2Nlc3NpYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcyQxLmFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMkMS5kZXN0cm95VG91Y2hIb29rKCk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvb2tEaXYpO1xuICAgIHRoaXMuX2hvb2tEaXYgPSBob29rRGl2O1xufTtcblxuLyoqXG4gKiBEZXN0cm95cyB0aGUgdG91Y2ggaG9va3MuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3lUb3VjaEhvb2sgPSBmdW5jdGlvbiBkZXN0cm95VG91Y2hIb29rICgpXG57XG4gICAgaWYgKCF0aGlzLl9ob29rRGl2KVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMuX2hvb2tEaXYpO1xuICAgIHRoaXMuX2hvb2tEaXYgPSBudWxsO1xufTtcblxuLyoqXG4gKiBBY3RpdmF0aW5nIHdpbGwgY2F1c2UgdGhlIEFjY2Vzc2liaWxpdHkgbGF5ZXIgdG8gYmUgc2hvd24uXG4gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgdXNlciBwcmVzc2VzIHRoZSB0YWIga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbkFjY2Vzc2liaWxpdHlNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uIGFjdGl2YXRlICgpXG57XG4gICAgaWYgKHRoaXMuaXNBY3RpdmUpXG4gICAge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLm9uKCdwb3N0cmVuZGVyJywgdGhpcy51cGRhdGUsIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMucmVuZGVyZXIudmlldy5wYXJlbnROb2RlKVxuICAgIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci52aWV3LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kaXYpO1xuICAgIH1cbn07XG5cbi8qKlxuICogRGVhY3RpdmF0aW5nIHdpbGwgY2F1c2UgdGhlIEFjY2Vzc2liaWxpdHkgbGF5ZXIgdG8gYmUgaGlkZGVuLlxuICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbkFjY2Vzc2liaWxpdHlNYW5hZ2VyLnByb3RvdHlwZS5kZWFjdGl2YXRlID0gZnVuY3Rpb24gZGVhY3RpdmF0ZSAoKVxue1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSB8fCB0aGlzLmlzTW9iaWxlQWNjZXNzaWJpbGl0eSlcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUsIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLm9mZigncG9zdHJlbmRlcicsIHRoaXMudXBkYXRlKTtcblxuICAgIGlmICh0aGlzLmRpdi5wYXJlbnROb2RlKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRpdik7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiB3aWxsIHJ1biB0aHJvdWdoIHRoZSBzY2VuZSBncmFwaCBhbmQgYWRkIGFueSBuZXcgYWNjZXNzaWJsZSBvYmplY3RzIHRvIHRoZSBET00gbGF5ZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ9IGRpc3BsYXlPYmplY3QgLSBUaGUgRGlzcGxheU9iamVjdCB0byBjaGVjay5cbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZUFjY2Vzc2libGVPYmplY3RzID0gZnVuY3Rpb24gdXBkYXRlQWNjZXNzaWJsZU9iamVjdHMgKGRpc3BsYXlPYmplY3QpXG57XG4gICAgaWYgKCFkaXNwbGF5T2JqZWN0LnZpc2libGUgfHwgIWRpc3BsYXlPYmplY3QuYWNjZXNzaWJsZUNoaWxkcmVuKVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkaXNwbGF5T2JqZWN0LmFjY2Vzc2libGUgJiYgZGlzcGxheU9iamVjdC5pbnRlcmFjdGl2ZSlcbiAgICB7XG4gICAgICAgIGlmICghZGlzcGxheU9iamVjdC5fYWNjZXNzaWJsZUFjdGl2ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChkaXNwbGF5T2JqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BsYXlPYmplY3QucmVuZGVySWQgPSB0aGlzLnJlbmRlcklkO1xuICAgIH1cblxuICAgIHZhciBjaGlsZHJlbiA9IGRpc3BsYXlPYmplY3QuY2hpbGRyZW47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgICAgdGhpcy51cGRhdGVBY2Nlc3NpYmxlT2JqZWN0cyhjaGlsZHJlbltpXSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBCZWZvcmUgZWFjaCByZW5kZXIgdGhpcyBmdW5jdGlvbiB3aWxsIGVuc3VyZSB0aGF0IGFsbCBkaXZzIGFyZSBtYXBwZWQgY29ycmVjdGx5IHRvIHRoZWlyIERpc3BsYXlPYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbkFjY2Vzc2liaWxpdHlNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKClcbntcbiAgICAvKiBPbiBBbmRyb2lkIGRlZmF1bHQgd2ViIGJyb3dzZXIsIHRhYiBvcmRlciBzZWVtcyB0byBiZSBjYWxjdWxhdGVkIGJ5IHBvc2l0aW9uIHJhdGhlciB0aGFuIHRhYkluZGV4LFxuICAgICogIG1vdmluZyBidXR0b25zIGNhbiBjYXVzZSBmb2N1cyB0byBmbGlja2VyIGJldHdlZW4gdHdvIGJ1dHRvbnMgbWFraW5nIGl0IGhhcmQvaW1wb3NzaWJsZSB0byBuYXZpZ2F0ZSxcbiAgICAqICBzbyBJIGFtIGp1c3QgcnVubmluZyB1cGRhdGUgZXZlcnkgaGFsZiBhIHNlY29uZCwgc2VlbXMgdG8gZml4IGl0LlxuICAgICovXG4gICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgaWYgKGlzTW9iaWxlLmFuZHJvaWQuZGV2aWNlICYmIG5vdyA8IHRoaXMuYW5kcm9pZFVwZGF0ZUNvdW50KVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYW5kcm9pZFVwZGF0ZUNvdW50ID0gbm93ICsgdGhpcy5hbmRyb2lkVXBkYXRlRnJlcXVlbmN5O1xuXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyLnJlbmRlcmluZ1RvU2NyZWVuKVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBjaGlsZHJlbi4uLlxuICAgIHRoaXMudXBkYXRlQWNjZXNzaWJsZU9iamVjdHModGhpcy5yZW5kZXJlci5fbGFzdE9iamVjdFJlbmRlcmVkKTtcblxuICAgIHZhciByZWN0ID0gdGhpcy5yZW5kZXJlci52aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgdmFyIHJlc29sdXRpb24gPSB0aGlzLnJlbmRlcmVyLnJlc29sdXRpb247XG5cbiAgICB2YXIgc3ggPSAocmVjdC53aWR0aCAvIHRoaXMucmVuZGVyZXIud2lkdGgpICogcmVzb2x1dGlvbjtcbiAgICB2YXIgc3kgPSAocmVjdC5oZWlnaHQgLyB0aGlzLnJlbmRlcmVyLmhlaWdodCkgKiByZXNvbHV0aW9uO1xuXG4gICAgdmFyIGRpdiA9IHRoaXMuZGl2O1xuXG4gICAgZGl2LnN0eWxlLmxlZnQgPSAocmVjdC5sZWZ0KSArIFwicHhcIjtcbiAgICBkaXYuc3R5bGUudG9wID0gKHJlY3QudG9wKSArIFwicHhcIjtcbiAgICBkaXYuc3R5bGUud2lkdGggPSAodGhpcy5yZW5kZXJlci53aWR0aCkgKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLmhlaWdodCA9ICh0aGlzLnJlbmRlcmVyLmhlaWdodCkgKyBcInB4XCI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuXG4gICAgICAgIGlmIChjaGlsZC5yZW5kZXJJZCAhPT0gdGhpcy5yZW5kZXJJZClcbiAgICAgICAge1xuICAgICAgICAgICAgY2hpbGQuX2FjY2Vzc2libGVBY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmVtb3ZlSXRlbXModGhpcy5jaGlsZHJlbiwgaSwgMSk7XG4gICAgICAgICAgICB0aGlzLmRpdi5yZW1vdmVDaGlsZChjaGlsZC5fYWNjZXNzaWJsZURpdik7XG4gICAgICAgICAgICB0aGlzLnBvb2wucHVzaChjaGlsZC5fYWNjZXNzaWJsZURpdik7XG4gICAgICAgICAgICBjaGlsZC5fYWNjZXNzaWJsZURpdiA9IG51bGw7XG5cbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG1hcCBkaXYgdG8gZGlzcGxheS4uXG4gICAgICAgICAgICBkaXYgPSBjaGlsZC5fYWNjZXNzaWJsZURpdjtcbiAgICAgICAgICAgIHZhciBoaXRBcmVhID0gY2hpbGQuaGl0QXJlYTtcbiAgICAgICAgICAgIHZhciB3dCA9IGNoaWxkLndvcmxkVHJhbnNmb3JtO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQuaGl0QXJlYSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICgod3QudHggKyAoaGl0QXJlYS54ICogd3QuYSkpICogc3gpICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS50b3AgPSAoKHd0LnR5ICsgKGhpdEFyZWEueSAqIHd0LmQpKSAqIHN5KSArIFwicHhcIjtcblxuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9IChoaXRBcmVhLndpZHRoICogd3QuYSAqIHN4KSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gKGhpdEFyZWEuaGVpZ2h0ICogd3QuZCAqIHN5KSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoaXRBcmVhID0gY2hpbGQuZ2V0Qm91bmRzKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNhcEhpdEFyZWEoaGl0QXJlYSk7XG5cbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9IChoaXRBcmVhLnggKiBzeCkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLnRvcCA9IChoaXRBcmVhLnkgKiBzeSkgKyBcInB4XCI7XG5cbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAoaGl0QXJlYS53aWR0aCAqIHN4KSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gKGhpdEFyZWEuaGVpZ2h0ICogc3kpICsgXCJweFwiO1xuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJ1dHRvbiB0aXRsZXMgYW5kIGhpbnRzIGlmIHRoZXkgZXhpc3QgYW5kIHRoZXkndmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmIChkaXYudGl0bGUgIT09IGNoaWxkLmFjY2Vzc2libGVUaXRsZSAmJiBjaGlsZC5hY2Nlc3NpYmxlVGl0bGUgIT09IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkaXYudGl0bGUgPSBjaGlsZC5hY2Nlc3NpYmxlVGl0bGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXYuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykgIT09IGNoaWxkLmFjY2Vzc2libGVIaW50XG4gICAgICAgICAgICAgICAgICAgICYmIGNoaWxkLmFjY2Vzc2libGVIaW50ICE9PSBudWxsKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGNoaWxkLmFjY2Vzc2libGVIaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSB0aXRsZSBvciBpbmRleCBtYXkgaGF2ZSBjaGFuZ2VkLCBpZiBzbyBsZXRzIHVwZGF0ZSBpdCFcbiAgICAgICAgICAgIGlmIChjaGlsZC5hY2Nlc3NpYmxlVGl0bGUgIT09IGRpdi50aXRsZSB8fCBjaGlsZC50YWJJbmRleCAhPT0gZGl2LnRhYkluZGV4KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpdi50aXRsZSA9IGNoaWxkLmFjY2Vzc2libGVUaXRsZTtcbiAgICAgICAgICAgICAgICBkaXYudGFiSW5kZXggPSBjaGlsZC50YWJJbmRleDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgeyB0aGlzLnVwZGF0ZURlYnVnSFRNTChkaXYpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpbmNyZW1lbnQgdGhlIHJlbmRlciBpZC4uXG4gICAgdGhpcy5yZW5kZXJJZCsrO1xufTtcblxuLyoqXG4gKiBwcml2YXRlIGZ1bmN0aW9uIHRoYXQgd2lsbCB2aXN1YWxseSBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZVxuICogYWNjZXNzYWJpbGl0eSBkaXZcbiAqXG4gKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50fSBkaXZcbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZURlYnVnSFRNTCA9IGZ1bmN0aW9uIHVwZGF0ZURlYnVnSFRNTCAoZGl2KVxue1xuICAgIGRpdi5pbm5lckhUTUwgPSBcInR5cGU6IFwiICsgKGRpdi50eXBlKSArIFwiPC9icj4gdGl0bGUgOiBcIiArIChkaXYudGl0bGUpICsgXCI8L2JyPiB0YWJJbmRleDogXCIgKyAoZGl2LnRhYkluZGV4KTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBoaXQgYXJlYSBiYXNlZCBvbiB0aGUgYm91bmRzIG9mIGEgZGlzcGxheSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBoaXRBcmVhIC0gQm91bmRzIG9mIHRoZSBjaGlsZFxuICovXG5BY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm90b3R5cGUuY2FwSGl0QXJlYSA9IGZ1bmN0aW9uIGNhcEhpdEFyZWEgKGhpdEFyZWEpXG57XG4gICAgaWYgKGhpdEFyZWEueCA8IDApXG4gICAge1xuICAgICAgICBoaXRBcmVhLndpZHRoICs9IGhpdEFyZWEueDtcbiAgICAgICAgaGl0QXJlYS54ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoaGl0QXJlYS55IDwgMClcbiAgICB7XG4gICAgICAgIGhpdEFyZWEuaGVpZ2h0ICs9IGhpdEFyZWEueTtcbiAgICAgICAgaGl0QXJlYS55ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoaGl0QXJlYS54ICsgaGl0QXJlYS53aWR0aCA+IHRoaXMucmVuZGVyZXIud2lkdGgpXG4gICAge1xuICAgICAgICBoaXRBcmVhLndpZHRoID0gdGhpcy5yZW5kZXJlci53aWR0aCAtIGhpdEFyZWEueDtcbiAgICB9XG5cbiAgICBpZiAoaGl0QXJlYS55ICsgaGl0QXJlYS5oZWlnaHQgPiB0aGlzLnJlbmRlcmVyLmhlaWdodClcbiAgICB7XG4gICAgICAgIGhpdEFyZWEuaGVpZ2h0ID0gdGhpcy5yZW5kZXJlci5oZWlnaHQgLSBoaXRBcmVhLnk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRzIGEgRGlzcGxheU9iamVjdCB0byB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBkaXNwbGF5T2JqZWN0IC0gVGhlIGNoaWxkIHRvIG1ha2UgYWNjZXNzaWJsZS5cbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQgKGRpc3BsYXlPYmplY3QpXG57XG4gICAgLy90aGlzLmFjdGl2YXRlKCk7XG5cbiAgICB2YXIgZGl2ID0gdGhpcy5wb29sLnBvcCgpO1xuXG4gICAgaWYgKCFkaXYpXG4gICAge1xuICAgICAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgICAgICBkaXYuc3R5bGUud2lkdGggPSBESVZfVE9VQ0hfU0laRSArIFwicHhcIjtcbiAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IERJVl9UT1VDSF9TSVpFICsgXCJweFwiO1xuICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5kZWJ1ZyA/ICdyZ2JhKDI1NSwyNTUsMjU1LDAuNSknIDogJ3RyYW5zcGFyZW50JztcbiAgICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgZGl2LnN0eWxlLnpJbmRleCA9IERJVl9UT1VDSF9aSU5ERVg7XG4gICAgICAgIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdub25lJztcblxuICAgICAgICAvLyBBUklBIGF0dHJpYnV0ZXMgZW5zdXJlIHRoYXQgYnV0dG9uIHRpdGxlIGFuZCBoaW50IHVwZGF0ZXMgYXJlIGFubm91bmNlZCBwcm9wZXJseVxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZScpID4gLTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBkb2Vzbid0IG5lZWQgYXJpYS1saXZlIHRvIHdvcmsgYXMgaW50ZW5kZWQ7IGluIGZhY3QgaXQganVzdCBnZXRzIG1vcmUgY29uZnVzZWQuXG4gICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvcnY6LipHZWNrb1xcLy8pKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBGaXJlRm94IG5lZWRzIHRoaXMgdG8gYW5ub3VuY2Ugb25seSB0aGUgbmV3IGJ1dHRvbiBuYW1lXG4gICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdhcmlhLXJlbGV2YW50JywgJ2FkZGl0aW9ucycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgYnkgSUUsIG90aGVyIGJyb3dzZXJzIGRvbid0IG11Y2ggY2FyZVxuICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnYXJpYS1yZWxldmFudCcsICd0ZXh0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcykpO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcykpO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCB0aGlzLl9vbkZvY3VzT3V0LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8vIHNldCBwb2ludGVyIGV2ZW50c1xuICAgIGRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gZGlzcGxheU9iamVjdC5hY2Nlc3NpYmxlUG9pbnRlckV2ZW50cztcbiAgICAvLyBzZXQgdGhlIHR5cGUsIHRoaXMgZGVmYXVsdHMgdG8gYnV0dG9uIVxuICAgIGRpdi50eXBlID0gZGlzcGxheU9iamVjdC5hY2Nlc3NpYmxlVHlwZTtcblxuICAgIGlmIChkaXNwbGF5T2JqZWN0LmFjY2Vzc2libGVUaXRsZSAmJiBkaXNwbGF5T2JqZWN0LmFjY2Vzc2libGVUaXRsZSAhPT0gbnVsbClcbiAgICB7XG4gICAgICAgIGRpdi50aXRsZSA9IGRpc3BsYXlPYmplY3QuYWNjZXNzaWJsZVRpdGxlO1xuICAgIH1cbiAgICBlbHNlIGlmICghZGlzcGxheU9iamVjdC5hY2Nlc3NpYmxlSGludFxuICAgICAgICAgICAgIHx8IGRpc3BsYXlPYmplY3QuYWNjZXNzaWJsZUhpbnQgPT09IG51bGwpXG4gICAge1xuICAgICAgICBkaXYudGl0bGUgPSBcImRpc3BsYXlPYmplY3QgXCIgKyAoZGlzcGxheU9iamVjdC50YWJJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc3BsYXlPYmplY3QuYWNjZXNzaWJsZUhpbnRcbiAgICAgICAgJiYgZGlzcGxheU9iamVjdC5hY2Nlc3NpYmxlSGludCAhPT0gbnVsbClcbiAgICB7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBkaXNwbGF5T2JqZWN0LmFjY2Vzc2libGVIaW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZWJ1ZykgeyB0aGlzLnVwZGF0ZURlYnVnSFRNTChkaXYpOyB9XG5cbiAgICBkaXNwbGF5T2JqZWN0Ll9hY2Nlc3NpYmxlQWN0aXZlID0gdHJ1ZTtcbiAgICBkaXNwbGF5T2JqZWN0Ll9hY2Nlc3NpYmxlRGl2ID0gZGl2O1xuICAgIGRpdi5kaXNwbGF5T2JqZWN0ID0gZGlzcGxheU9iamVjdDtcblxuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChkaXNwbGF5T2JqZWN0KTtcbiAgICB0aGlzLmRpdi5hcHBlbmRDaGlsZChkaXNwbGF5T2JqZWN0Ll9hY2Nlc3NpYmxlRGl2KTtcbiAgICBkaXNwbGF5T2JqZWN0Ll9hY2Nlc3NpYmxlRGl2LnRhYkluZGV4ID0gZGlzcGxheU9iamVjdC50YWJJbmRleDtcbn07XG5cbi8qKlxuICogTWFwcyB0aGUgZGl2IGJ1dHRvbiBwcmVzcyB0byBwaXhpJ3MgSW50ZXJhY3Rpb25NYW5hZ2VyIChjbGljaylcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlIC0gVGhlIGNsaWNrIGV2ZW50LlxuICovXG5BY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm90b3R5cGUuX29uQ2xpY2sgPSBmdW5jdGlvbiBfb25DbGljayAoZSlcbntcbiAgICB2YXIgaW50ZXJhY3Rpb25NYW5hZ2VyID0gdGhpcy5yZW5kZXJlci5wbHVnaW5zLmludGVyYWN0aW9uO1xuXG4gICAgaW50ZXJhY3Rpb25NYW5hZ2VyLmRpc3BhdGNoRXZlbnQoZS50YXJnZXQuZGlzcGxheU9iamVjdCwgJ2NsaWNrJywgaW50ZXJhY3Rpb25NYW5hZ2VyLmV2ZW50RGF0YSk7XG4gICAgaW50ZXJhY3Rpb25NYW5hZ2VyLmRpc3BhdGNoRXZlbnQoZS50YXJnZXQuZGlzcGxheU9iamVjdCwgJ3BvaW50ZXJ0YXAnLCBpbnRlcmFjdGlvbk1hbmFnZXIuZXZlbnREYXRhKTtcbiAgICBpbnRlcmFjdGlvbk1hbmFnZXIuZGlzcGF0Y2hFdmVudChlLnRhcmdldC5kaXNwbGF5T2JqZWN0LCAndGFwJywgaW50ZXJhY3Rpb25NYW5hZ2VyLmV2ZW50RGF0YSk7XG59O1xuXG4vKipcbiAqIE1hcHMgdGhlIGRpdiBmb2N1cyBldmVudHMgdG8gcGl4aSdzIEludGVyYWN0aW9uTWFuYWdlciAobW91c2VvdmVyKVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0ZvY3VzRXZlbnR9IGUgLSBUaGUgZm9jdXMgZXZlbnQuXG4gKi9cbkFjY2Vzc2liaWxpdHlNYW5hZ2VyLnByb3RvdHlwZS5fb25Gb2N1cyA9IGZ1bmN0aW9uIF9vbkZvY3VzIChlKVxue1xuICAgIGlmICghZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAnb2ZmJykpXG4gICAge1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdhc3NlcnRpdmUnKTtcbiAgICB9XG4gICAgdmFyIGludGVyYWN0aW9uTWFuYWdlciA9IHRoaXMucmVuZGVyZXIucGx1Z2lucy5pbnRlcmFjdGlvbjtcblxuICAgIGludGVyYWN0aW9uTWFuYWdlci5kaXNwYXRjaEV2ZW50KGUudGFyZ2V0LmRpc3BsYXlPYmplY3QsICdtb3VzZW92ZXInLCBpbnRlcmFjdGlvbk1hbmFnZXIuZXZlbnREYXRhKTtcbn07XG5cbi8qKlxuICogTWFwcyB0aGUgZGl2IGZvY3VzIGV2ZW50cyB0byBwaXhpJ3MgSW50ZXJhY3Rpb25NYW5hZ2VyIChtb3VzZW91dClcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGb2N1c0V2ZW50fSBlIC0gVGhlIGZvY3Vzb3V0IGV2ZW50LlxuICovXG5BY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm90b3R5cGUuX29uRm9jdXNPdXQgPSBmdW5jdGlvbiBfb25Gb2N1c091dCAoZSlcbntcbiAgICBpZiAoIWUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ29mZicpKVxuICAgIHtcbiAgICAgICAgZS50YXJnZXQuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gICAgfVxuICAgIHZhciBpbnRlcmFjdGlvbk1hbmFnZXIgPSB0aGlzLnJlbmRlcmVyLnBsdWdpbnMuaW50ZXJhY3Rpb247XG5cbiAgICBpbnRlcmFjdGlvbk1hbmFnZXIuZGlzcGF0Y2hFdmVudChlLnRhcmdldC5kaXNwbGF5T2JqZWN0LCAnbW91c2VvdXQnLCBpbnRlcmFjdGlvbk1hbmFnZXIuZXZlbnREYXRhKTtcbn07XG5cbi8qKlxuICogSXMgY2FsbGVkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUgLSBUaGUga2V5ZG93biBldmVudC5cbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLl9vbktleURvd24gPSBmdW5jdGlvbiBfb25LZXlEb3duIChlKVxue1xuICAgIGlmIChlLmtleUNvZGUgIT09IEtFWV9DT0RFX1RBQilcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2YXRlKCk7XG59O1xuXG4vKipcbiAqIElzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBtb3ZlcyBhY3Jvc3MgdGhlIHJlbmRlcmVyIGVsZW1lbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlIC0gVGhlIG1vdXNlIGV2ZW50LlxuICovXG5BY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm90b3R5cGUuX29uTW91c2VNb3ZlID0gZnVuY3Rpb24gX29uTW91c2VNb3ZlIChlKVxue1xuICAgIGlmIChlLm1vdmVtZW50WCA9PT0gMCAmJiBlLm1vdmVtZW50WSA9PT0gMClcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbn07XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlclxuICpcbiAqL1xuQWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy5kZXN0cm95VG91Y2hIb29rKCk7XG4gICAgdGhpcy5kaXYgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kaXYgPSBudWxsO1xuICAgIH1cblxuICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuXG4gICAgdGhpcy5wb29sID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB0aGlzLnJlbmRlcmVyID0gbnVsbDtcbn07XG5cbi8qKlxuICogVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgYW4gYWNjZXNzaWJpbGl0eSBwbHVnaW4gZm9yIGFsbG93aW5nIGludGVyYWN0aW9uIHZpYSB0aGUga2V5Ym9hcmQuXG4gKlxuICogRG8gbm90IGluc3RhbnRpYXRlIHRoaXMgcGx1Z2luIGRpcmVjdGx5LiBJdCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgYHJlbmRlcmVyLnBsdWdpbnNgIHByb3BlcnR5LlxuICogU2VlIHtAbGluayBQSVhJLkNhbnZhc1JlbmRlcmVyI3BsdWdpbnN9IG9yIHtAbGluayBQSVhJLlJlbmRlcmVyI3BsdWdpbnN9LlxuICogQG5hbWVzcGFjZSBQSVhJLmFjY2Vzc2liaWxpdHlcbiAqL1xuXG5leHBvcnQgeyBBY2Nlc3NpYmlsaXR5TWFuYWdlciwgYWNjZXNzaWJsZVRhcmdldCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNjZXNzaWJpbGl0eS5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvdGlja2VyIC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL3RpY2tlciBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSAnQHBpeGkvc2V0dGluZ3MnO1xuXG4vKipcbiAqIFRhcmdldCBmcmFtZXMgcGVyIG1pbGxpc2Vjb25kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFRBUkdFVF9GUE1TXG4gKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICogQHR5cGUge251bWJlcn1cbiAqIEBkZWZhdWx0IDAuMDZcbiAqL1xuc2V0dGluZ3MuVEFSR0VUX0ZQTVMgPSAwLjA2O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHVwZGF0ZSBwcmlvcml0aWVzIHVzZWQgYnkgaW50ZXJuYWwgUElYSSBjbGFzc2VzIHdoZW4gcmVnaXN0ZXJlZCB3aXRoXG4gKiB0aGUge0BsaW5rIFBJWEkuVGlja2VyfSBvYmplY3QuIEhpZ2hlciBwcmlvcml0eSBpdGVtcyBhcmUgdXBkYXRlZCBmaXJzdCBhbmQgbG93ZXJcbiAqIHByaW9yaXR5IGl0ZW1zLCBzdWNoIGFzIHJlbmRlciwgc2hvdWxkIGdvIGxhdGVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudFxuICogQG5hbWUgVVBEQVRFX1BSSU9SSVRZXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQGVudW0ge251bWJlcn1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlRFUkFDVElPTj01MCBIaWdoZXN0IHByaW9yaXR5LCB1c2VkIGZvciB7QGxpbmsgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXJ9XG4gKiBAcHJvcGVydHkge251bWJlcn0gSElHSD0yNSBIaWdoIHByaW9yaXR5IHVwZGF0aW5nLCB7QGxpbmsgUElYSS5WaWRlb0Jhc2VUZXh0dXJlfSBhbmQge0BsaW5rIFBJWEkuQW5pbWF0ZWRTcHJpdGV9XG4gKiBAcHJvcGVydHkge251bWJlcn0gTk9STUFMPTAgRGVmYXVsdCBwcmlvcml0eSBmb3IgdGlja2VyIGV2ZW50cywgc2VlIHtAbGluayBQSVhJLlRpY2tlciNhZGR9LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IExPVz0tMjUgTG93IHByaW9yaXR5IHVzZWQgZm9yIHtAbGluayBQSVhJLkFwcGxpY2F0aW9ufSByZW5kZXJpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gVVRJTElUWT0tNTAgTG93ZXN0IHByaW9yaXR5IHVzZWQgZm9yIHtAbGluayBQSVhJLnByZXBhcmUuQmFzZVByZXBhcmV9IHV0aWxpdHkuXG4gKi9cbnZhciBVUERBVEVfUFJJT1JJVFk7XG4oZnVuY3Rpb24gKFVQREFURV9QUklPUklUWSkge1xuICAgIFVQREFURV9QUklPUklUWVtVUERBVEVfUFJJT1JJVFlbXCJJTlRFUkFDVElPTlwiXSA9IDUwXSA9IFwiSU5URVJBQ1RJT05cIjtcbiAgICBVUERBVEVfUFJJT1JJVFlbVVBEQVRFX1BSSU9SSVRZW1wiSElHSFwiXSA9IDI1XSA9IFwiSElHSFwiO1xuICAgIFVQREFURV9QUklPUklUWVtVUERBVEVfUFJJT1JJVFlbXCJOT1JNQUxcIl0gPSAwXSA9IFwiTk9STUFMXCI7XG4gICAgVVBEQVRFX1BSSU9SSVRZW1VQREFURV9QUklPUklUWVtcIkxPV1wiXSA9IC0yNV0gPSBcIkxPV1wiO1xuICAgIFVQREFURV9QUklPUklUWVtVUERBVEVfUFJJT1JJVFlbXCJVVElMSVRZXCJdID0gLTUwXSA9IFwiVVRJTElUWVwiO1xufSkoVVBEQVRFX1BSSU9SSVRZIHx8IChVUERBVEVfUFJJT1JJVFkgPSB7fSkpO1xuXG4vKipcbiAqIEludGVybmFsIGNsYXNzIGZvciBoYW5kbGluZyB0aGUgcHJpb3JpdHkgc29ydGluZyBvZiB0aWNrZXIgaGFuZGxlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRpY2tlckxpc3RlbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBhZGRlZCBmb3Igb25lIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9bnVsbF0gLSBUaGUgbGlzdGVuZXIgY29udGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJpb3JpdHk9MF0gLSBUaGUgcHJpb3JpdHkgZm9yIGVtaXR0aW5nXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb25jZT1mYWxzZV0gLSBJZiB0aGUgaGFuZGxlciBzaG91bGQgZmlyZSBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gVGlja2VyTGlzdGVuZXIoZm4sIGNvbnRleHQsIHByaW9yaXR5LCBvbmNlKSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwOyB9XG4gICAgICAgIGlmIChvbmNlID09PSB2b2lkIDApIHsgb25jZSA9IGZhbHNlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYWxsaW5nIHRvIGV4ZWN1dGUuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIgeyp9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGN1cnJlbnQgcHJpb3JpdHkuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoaXMgc2hvdWxkIG9ubHkgZXhlY3V0ZSBvbmNlLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbmNlID0gb25jZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuZXh0IGl0ZW0gaW4gY2hhaW4uXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge1RpY2tlckxpc3RlbmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwcmV2aW91cyBpdGVtIGluIGNoYWluLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtUaWNrZXJMaXN0ZW5lcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogYHRydWVgIGlmIHRoaXMgbGlzdGVuZXIgaGFzIGJlZW4gZGVzdHJveWVkIGFscmVhZHkuXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGxlIGNvbXBhcmUgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiBhIGZ1bmN0aW9uIGFuZCBjb250ZXh0IG1hdGNoLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgYWRkZWQgZm9yIG9uZSB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge2FueX0gW2NvbnRleHRdIC0gVGhlIGxpc3RlbmVyIGNvbnRleHRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGxpc3RlbmVyIG1hdGNoIHRoZSBhcmd1bWVudHNcbiAgICAgKi9cbiAgICBUaWNrZXJMaXN0ZW5lci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAoZm4sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdGhpcy5mbiA9PT0gZm4gJiYgdGhpcy5jb250ZXh0ID09PSBjb250ZXh0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1pdCBieSBjYWxsaW5nIHRoZSBjdXJyZW50IGZ1bmN0aW9uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhVGltZSAtIHRpbWUgc2luY2UgdGhlIGxhc3QgZW1pdC5cbiAgICAgKiBAcmV0dXJuIHtUaWNrZXJMaXN0ZW5lcn0gTmV4dCB0aWNrZXJcbiAgICAgKi9cbiAgICBUaWNrZXJMaXN0ZW5lci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChkZWx0YVRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZm4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZuLmNhbGwodGhpcy5jb250ZXh0LCBkZWx0YVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbihkZWx0YVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZWRpcmVjdCA9IHRoaXMubmV4dDtcbiAgICAgICAgaWYgKHRoaXMub25jZSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvZnQtZGVzdHJveWluZyBzaG91bGQgcmVtb3ZlXG4gICAgICAgIC8vIHRoZSBuZXh0IHJlZmVyZW5jZVxuICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWRpcmVjdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gdGhlIGxpc3QuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1RpY2tlckxpc3RlbmVyfSBwcmV2aW91cyAtIElucHV0IG5vZGUsIHByZXZpb3VzIGxpc3RlbmVyXG4gICAgICovXG4gICAgVGlja2VyTGlzdGVuZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAocHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICBpZiAocHJldmlvdXMubmV4dCkge1xuICAgICAgICAgICAgcHJldmlvdXMubmV4dC5wcmV2aW91cyA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0ID0gcHJldmlvdXMubmV4dDtcbiAgICAgICAgcHJldmlvdXMubmV4dCA9IHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGFuZCBkb24ndCB1c2UgYWZ0ZXIgdGhpcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhcmQgPSBmYWxzZV0gYHRydWVgIHRvIHJlbW92ZSB0aGUgYG5leHRgIHJlZmVyZW5jZSwgdGhpc1xuICAgICAqICAgICAgICBpcyBjb25zaWRlcmVkIGEgaGFyZCBkZXN0cm95LiBTb2Z0IGRlc3Ryb3kgbWFpbnRhaW5zIHRoZSBuZXh0IHJlZmVyZW5jZS5cbiAgICAgKiBAcmV0dXJuIHtUaWNrZXJMaXN0ZW5lcn0gVGhlIGxpc3RlbmVyIHRvIHJlZGlyZWN0IHdoaWxlIGVtaXR0aW5nIG9yIHJlbW92aW5nLlxuICAgICAqL1xuICAgIFRpY2tlckxpc3RlbmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKGhhcmQpIHtcbiAgICAgICAgaWYgKGhhcmQgPT09IHZvaWQgMCkgeyBoYXJkID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IG51bGw7XG4gICAgICAgIC8vIERpc2Nvbm5lY3QsIGhvb2sgdXAgbmV4dCBhbmQgcHJldmlvdXNcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubmV4dCA9IHRoaXMubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uZXh0KSB7XG4gICAgICAgICAgICB0aGlzLm5leHQucHJldmlvdXMgPSB0aGlzLnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBuZXh0IGl0ZW1cbiAgICAgICAgdmFyIHJlZGlyZWN0ID0gdGhpcy5uZXh0O1xuICAgICAgICAvLyBSZW1vdmUgcmVmZXJlbmNlc1xuICAgICAgICB0aGlzLm5leHQgPSBoYXJkID8gbnVsbCA6IHJlZGlyZWN0O1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlZGlyZWN0O1xuICAgIH07XG4gICAgcmV0dXJuIFRpY2tlckxpc3RlbmVyO1xufSgpKTtcblxuLyoqXG4gKiBBIFRpY2tlciBjbGFzcyB0aGF0IHJ1bnMgYW4gdXBkYXRlIGxvb3AgdGhhdCBvdGhlciBvYmplY3RzIGxpc3RlbiB0by5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGNvbXBvc2VkIGFyb3VuZCBsaXN0ZW5lcnMgbWVhbnQgZm9yIGV4ZWN1dGlvbiBvbiB0aGUgbmV4dCByZXF1ZXN0ZWQgYW5pbWF0aW9uIGZyYW1lLlxuICogQW5pbWF0aW9uIGZyYW1lcyBhcmUgcmVxdWVzdGVkIG9ubHkgd2hlbiBuZWNlc3NhcnksIGUuZy4gV2hlbiB0aGUgdGlja2VyIGlzIHN0YXJ0ZWQgYW5kIHRoZSBlbWl0dGVyIGhhcyBsaXN0ZW5lcnMuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgVGlja2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpY2tlcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmaXJzdCBsaXN0ZW5lci4gQWxsIG5ldyBsaXN0ZW5lcnMgYWRkZWQgYXJlIGNoYWluZWQgb24gdGhpcy5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHR5cGUge1RpY2tlckxpc3RlbmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faGVhZCA9IG5ldyBUaWNrZXJMaXN0ZW5lcihudWxsLCBudWxsLCBJbmZpbml0eSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnRlcm5hbCBjdXJyZW50IGZyYW1lIHJlcXVlc3QgSURcbiAgICAgICAgICogQHR5cGUgez9udW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXF1ZXN0SWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgdmFsdWUgbWFuYWdlZCBieSBtaW5GUFMgcHJvcGVydHkgc2V0dGVyIGFuZCBnZXR0ZXIuXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIG1heGltdW0gYWxsb3dlZCBtaWxsaXNlY29uZHMgYmV0d2VlbiB1cGRhdGVzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fbWF4RWxhcHNlZE1TID0gMTAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgdmFsdWUgbWFuYWdlZCBieSBtYXhGUFMgcHJvcGVydHkgc2V0dGVyIGFuZCBnZXR0ZXIuXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIG1pbmltdW0gYWxsb3dlZCBtaWxsaXNlY29uZHMgYmV0d2VlbiB1cGRhdGVzLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fbWluRWxhcHNlZE1TID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgdGlja2VyIHNob3VsZCBpbnZva2UgdGhlIG1ldGhvZFxuICAgICAgICAgKiB7QGxpbmsgUElYSS5UaWNrZXIjc3RhcnR9IGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICogd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRvU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNjYWxhciB0aW1lIHZhbHVlIGZyb20gbGFzdCBmcmFtZSB0byB0aGlzIGZyYW1lLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGNhcHBlZCBieSBzZXR0aW5nIHtAbGluayBQSVhJLlRpY2tlciNtaW5GUFN9XG4gICAgICAgICAqIGFuZCBpcyBzY2FsZWQgd2l0aCB7QGxpbmsgUElYSS5UaWNrZXIjc3BlZWR9LlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNhcCBtYXkgYmUgZXhjZWVkZWQgYnkgc2NhbGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbHRhVGltZSA9IDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY2FsZXIgdGltZSBlbGFwc2VkIGluIG1pbGxpc2Vjb25kcyBmcm9tIGxhc3QgZnJhbWUgdG8gdGhpcyBmcmFtZS5cbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjYXBwZWQgYnkgc2V0dGluZyB7QGxpbmsgUElYSS5UaWNrZXIjbWluRlBTfVxuICAgICAgICAgKiBhbmQgaXMgc2NhbGVkIHdpdGgge0BsaW5rIFBJWEkuVGlja2VyI3NwZWVkfS5cbiAgICAgICAgICogKipOb3RlOioqIFRoZSBjYXAgbWF5IGJlIGV4Y2VlZGVkIGJ5IHNjYWxpbmcuXG4gICAgICAgICAqIElmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBET01IaWdoUmVzVGltZVN0YW1wLFxuICAgICAgICAgKiB0aGlzIHZhbHVlIHdpbGwgaGF2ZSBhIHByZWNpc2lvbiBvZiAxIMK1cy5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gdGFyZ2V0IGZyYW1lIHRpbWVcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxNi42NlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWx0YU1TID0gMSAvIHNldHRpbmdzLlRBUkdFVF9GUE1TO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGltZSBlbGFwc2VkIGluIG1pbGxpc2Vjb25kcyBmcm9tIGxhc3QgZnJhbWUgdG8gdGhpcyBmcmFtZS5cbiAgICAgICAgICogT3Bwb3NlZCB0byB3aGF0IHRoZSBzY2FsYXIge0BsaW5rIFBJWEkuVGlja2VyI2RlbHRhVGltZX1cbiAgICAgICAgICogaXMgYmFzZWQsIHRoaXMgdmFsdWUgaXMgbmVpdGhlciBjYXBwZWQgbm9yIHNjYWxlZC5cbiAgICAgICAgICogSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIERPTUhpZ2hSZXNUaW1lU3RhbXAsXG4gICAgICAgICAqIHRoaXMgdmFsdWUgd2lsbCBoYXZlIGEgcHJlY2lzaW9uIG9mIDEgwrVzLlxuICAgICAgICAgKiBEZWZhdWx0cyB0byB0YXJnZXQgZnJhbWUgdGltZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDE2LjY2XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVsYXBzZWRNUyA9IDEgLyBzZXR0aW5ncy5UQVJHRVRfRlBNUztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBsYXN0IHRpbWUge0BsaW5rIFBJWEkuVGlja2VyI3VwZGF0ZX0gd2FzIGludm9rZWQuXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgYWxzbyByZXNldCBpbnRlcm5hbGx5IG91dHNpZGUgb2YgaW52b2tpbmdcbiAgICAgICAgICogdXBkYXRlLCBidXQgb25seSB3aGVuIGEgbmV3IGFuaW1hdGlvbiBmcmFtZSBpcyByZXF1ZXN0ZWQuXG4gICAgICAgICAqIElmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBET01IaWdoUmVzVGltZVN0YW1wLFxuICAgICAgICAgKiB0aGlzIHZhbHVlIHdpbGwgaGF2ZSBhIHByZWNpc2lvbiBvZiAxIMK1cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmFjdG9yIG9mIGN1cnJlbnQge0BsaW5rIFBJWEkuVGlja2VyI2RlbHRhVGltZX0uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIC8vIFNjYWxlcyB0aWNrZXIuZGVsdGFUaW1lIHRvIHdoYXQgd291bGQgYmVcbiAgICAgICAgICogLy8gdGhlIGVxdWl2YWxlbnQgb2YgYXBwcm94aW1hdGVseSAxMjAgRlBTXG4gICAgICAgICAqIHRpY2tlci5zcGVlZCA9IDI7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zcGVlZCA9IDE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHRpY2tlciBoYXMgYmVlbiBzdGFydGVkLlxuICAgICAgICAgKiBgdHJ1ZWAgaWYge0BsaW5rIFBJWEkuVGlja2VyI3N0YXJ0fSBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICAgICAqIGBmYWxzZWAgaWYge0BsaW5rIFBJWEkuVGlja2VyI3N0b3B9IGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICogV2hpbGUgYGZhbHNlYCwgdGhpcyB2YWx1ZSBtYXkgY2hhbmdlIHRvIGB0cnVlYCBpbiB0aGVcbiAgICAgICAgICogZXZlbnQgb2Yge0BsaW5rIFBJWEkuVGlja2VyI2F1dG9TdGFydH0gYmVpbmcgYHRydWVgXG4gICAgICAgICAqIGFuZCBhIGxpc3RlbmVyIGlzIGFkZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBlbmFibGVkLCBkZWxldGluZyBpcyBkaXNhYmxlZC5cbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3Byb3RlY3RlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGxhc3QgdGltZSBrZXlmcmFtZSB3YXMgZXhlY3V0ZWQuXG4gICAgICAgICAqIE1haW50YWlucyBhIHJlbGF0aXZlbHkgZml4ZWQgaW50ZXJ2YWwgd2l0aCB0aGUgcHJldmlvdXMgdmFsdWUuXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgLTFcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2xhc3RGcmFtZSA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgdGljayBtZXRob2QgYm91bmQgdG8gdGlja2VyIGluc3RhbmNlLlxuICAgICAgICAgKiBUaGlzIGlzIGJlY2F1c2UgaW4gZWFybHkgMjAxNSwgRnVuY3Rpb24uYmluZFxuICAgICAgICAgKiBpcyBzdGlsbCA2MCUgc2xvd2VyIGluIGhpZ2ggcGVyZm9ybWFuY2Ugc2NlbmFyaW9zLlxuICAgICAgICAgKiBBbHNvIHNlcGFyYXRpbmcgZnJhbWUgcmVxdWVzdHMgZnJvbSB1cGRhdGUgbWV0aG9kXG4gICAgICAgICAqIHNvIGxpc3RlbmVycyBtYXkgYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFuZCB3aXRoXG4gICAgICAgICAqIGFueSBhbmltYXRpb24gQVBJLCBqdXN0IGludm9rZSB0aWNrZXIudXBkYXRlKHRpbWUpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRpbWUgc2luY2UgbGFzdCB0aWNrLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdGljayA9IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgICAgICBfdGhpcy5fcmVxdWVzdElkID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChfdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gSW52b2tlIGxpc3RlbmVycyBub3dcbiAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGUodGltZSk7XG4gICAgICAgICAgICAgICAgLy8gTGlzdGVuZXIgc2lkZSBlZmZlY3RzIG1heSBoYXZlIG1vZGlmaWVkIHRpY2tlciBzdGF0ZS5cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuc3RhcnRlZCAmJiBfdGhpcy5fcmVxdWVzdElkID09PSBudWxsICYmIF90aGlzLl9oZWFkLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcXVlc3RJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5fdGljayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25kaXRpb25hbGx5IHJlcXVlc3RzIGEgbmV3IGFuaW1hdGlvbiBmcmFtZS5cbiAgICAgKiBJZiBhIGZyYW1lIGhhcyBub3QgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZCwgYW5kIGlmIHRoZSBpbnRlcm5hbFxuICAgICAqIGVtaXR0ZXIgaGFzIGxpc3RlbmVycywgYSBuZXcgZnJhbWUgaXMgcmVxdWVzdGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBUaWNrZXIucHJvdG90eXBlLl9yZXF1ZXN0SWZOZWVkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0SWQgPT09IG51bGwgJiYgdGhpcy5faGVhZC5uZXh0KSB7XG4gICAgICAgICAgICAvLyBlbnN1cmUgY2FsbGJhY2tzIGdldCBjb3JyZWN0IGRlbHRhXG4gICAgICAgICAgICB0aGlzLmxhc3RUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RnJhbWUgPSB0aGlzLmxhc3RUaW1lO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3RpY2spO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb25kaXRpb25hbGx5IGNhbmNlbHMgYSBwZW5kaW5nIGFuaW1hdGlvbiBmcmFtZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5fY2FuY2VsSWZOZWVkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlcXVlc3RJZCk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb25kaXRpb25hbGx5IHJlcXVlc3RzIGEgbmV3IGFuaW1hdGlvbiBmcmFtZS5cbiAgICAgKiBJZiB0aGUgdGlja2VyIGhhcyBiZWVuIHN0YXJ0ZWQgaXQgY2hlY2tzIGlmIGEgZnJhbWUgaGFzIG5vdCBhbHJlYWR5XG4gICAgICogYmVlbiByZXF1ZXN0ZWQsIGFuZCBpZiB0aGUgaW50ZXJuYWwgZW1pdHRlciBoYXMgbGlzdGVuZXJzLiBJZiB0aGVzZVxuICAgICAqIGNvbmRpdGlvbnMgYXJlIG1ldCwgYSBuZXcgZnJhbWUgaXMgcmVxdWVzdGVkLiBJZiB0aGUgdGlja2VyIGhhcyBub3RcbiAgICAgKiBiZWVuIHN0YXJ0ZWQsIGJ1dCBhdXRvU3RhcnQgaXMgYHRydWVgLCB0aGVuIHRoZSB0aWNrZXIgc3RhcnRzIG5vdyxcbiAgICAgKiBhbmQgY29udGludWVzIHdpdGggdGhlIHByZXZpb3VzIGNvbmRpdGlvbnMgdG8gcmVxdWVzdCBhIG5ldyBmcmFtZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5fc3RhcnRJZlBvc3NpYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SWZOZWVkZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmF1dG9TdGFydCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGhhbmRsZXIgZm9yIHRpY2sgZXZlbnRzLiBDYWxscyBjb250aW51b3VzbHkgdW5sZXNzXG4gICAgICogaXQgaXMgcmVtb3ZlZCBvciB0aGUgdGlja2VyIGlzIHN0b3BwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBhZGRlZCBmb3IgdXBkYXRlc1xuICAgICAqIEBwYXJhbSB7Kn0gW2NvbnRleHRdIC0gVGhlIGxpc3RlbmVyIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByaW9yaXR5PVBJWEkuVVBEQVRFX1BSSU9SSVRZLk5PUk1BTF0gLSBUaGUgcHJpb3JpdHkgZm9yIGVtaXR0aW5nXG4gICAgICogQHJldHVybnMge1BJWEkuVGlja2VyfSBUaGlzIGluc3RhbmNlIG9mIGEgdGlja2VyXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZm4sIGNvbnRleHQsIHByaW9yaXR5KSB7XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdm9pZCAwKSB7IHByaW9yaXR5ID0gVVBEQVRFX1BSSU9SSVRZLk5PUk1BTDsgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIobmV3IFRpY2tlckxpc3RlbmVyKGZuLCBjb250ZXh0LCBwcmlvcml0eSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgaGFuZGxlciBmb3IgdGhlIHRpY2sgZXZlbnQgd2hpY2ggaXMgb25seSBleGVjdXRlIG9uY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBhZGRlZCBmb3Igb25lIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW2NvbnRleHRdIC0gVGhlIGxpc3RlbmVyIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByaW9yaXR5PVBJWEkuVVBEQVRFX1BSSU9SSVRZLk5PUk1BTF0gLSBUaGUgcHJpb3JpdHkgZm9yIGVtaXR0aW5nXG4gICAgICogQHJldHVybnMge1BJWEkuVGlja2VyfSBUaGlzIGluc3RhbmNlIG9mIGEgdGlja2VyXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5hZGRPbmNlID0gZnVuY3Rpb24gKGZuLCBjb250ZXh0LCBwcmlvcml0eSkge1xuICAgICAgICBpZiAocHJpb3JpdHkgPT09IHZvaWQgMCkgeyBwcmlvcml0eSA9IFVQREFURV9QUklPUklUWS5OT1JNQUw7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZExpc3RlbmVyKG5ldyBUaWNrZXJMaXN0ZW5lcihmbiwgY29udGV4dCwgcHJpb3JpdHksIHRydWUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEludGVybmFsbHkgYWRkcyB0aGUgZXZlbnQgaGFuZGxlciBzbyB0aGF0IGl0IGNhbiBiZSBzb3J0ZWQgYnkgcHJpb3JpdHkuXG4gICAgICogUHJpb3JpdHkgYWxsb3dzIGNlcnRhaW4gaGFuZGxlciAodXNlciwgQW5pbWF0ZWRTcHJpdGUsIEludGVyYWN0aW9uKSB0byBiZSBydW5cbiAgICAgKiBiZWZvcmUgdGhlIHJlbmRlcmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtUaWNrZXJMaXN0ZW5lcn0gbGlzdGVuZXIgLSBDdXJyZW50IGxpc3RlbmVyIGJlaW5nIGFkZGVkLlxuICAgICAqIEByZXR1cm5zIHtQSVhJLlRpY2tlcn0gVGhpcyBpbnN0YW5jZSBvZiBhIHRpY2tlclxuICAgICAqL1xuICAgIFRpY2tlci5wcm90b3R5cGUuX2FkZExpc3RlbmVyID0gZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIC8vIEZvciBhdHRhY2hpbmcgdG8gaGVhZFxuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXMuX2hlYWQubmV4dDtcbiAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5faGVhZDtcbiAgICAgICAgLy8gQWRkIHRoZSBmaXJzdCBpdGVtXG4gICAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICAgICAgbGlzdGVuZXIuY29ubmVjdChwcmV2aW91cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBHbyBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IHByaW9yaXR5XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5wcmlvcml0eSA+IGN1cnJlbnQucHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY29ubmVjdChwcmV2aW91cyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdCB5ZXQgY29ubmVjdGVkXG4gICAgICAgICAgICBpZiAoIWxpc3RlbmVyLnByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY29ubmVjdChwcmV2aW91cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnRJZlBvc3NpYmxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbnkgaGFuZGxlcnMgbWF0Y2hpbmcgdGhlIGZ1bmN0aW9uIGFuZCBjb250ZXh0IHBhcmFtZXRlcnMuXG4gICAgICogSWYgbm8gaGFuZGxlcnMgYXJlIGxlZnQgYWZ0ZXIgcmVtb3ZpbmcsIHRoZW4gaXQgY2FuY2VscyB0aGUgYW5pbWF0aW9uIGZyYW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgcmVtb3ZlZFxuICAgICAqIEBwYXJhbSB7Kn0gW2NvbnRleHRdIC0gVGhlIGxpc3RlbmVyIGNvbnRleHQgdG8gYmUgcmVtb3ZlZFxuICAgICAqIEByZXR1cm5zIHtQSVhJLlRpY2tlcn0gVGhpcyBpbnN0YW5jZSBvZiBhIHRpY2tlclxuICAgICAqL1xuICAgIFRpY2tlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGZuLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IHRoaXMuX2hlYWQubmV4dDtcbiAgICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1hdGNoLCBsZXRzIHJlbW92ZSBpdFxuICAgICAgICAgICAgLy8gbm8gYnJlYWsgdG8gZGVsZXRlIGFsbCBwb3NzaWJsZSBtYXRjaGVzXG4gICAgICAgICAgICAvLyBpbmNhc2UgYSBsaXN0ZW5lciB3YXMgYWRkZWQgMisgdGltZXNcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lci5tYXRjaChmbiwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQubmV4dCkge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsSWZOZWVkZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaWNrZXIucHJvdG90eXBlLCBcImNvdW50XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBvbiB0aGlzIHRpY2tlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgb24gdGhpcyB0aWNrZXJcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC5uZXh0KSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgdGlja2VyLiBJZiB0aGUgdGlja2VyIGhhcyBsaXN0ZW5lcnNcbiAgICAgKiBhIG5ldyBhbmltYXRpb24gZnJhbWUgaXMgcmVxdWVzdGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SWZOZWVkZWQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHRpY2tlci4gSWYgdGhlIHRpY2tlciBoYXMgcmVxdWVzdGVkXG4gICAgICogYW4gYW5pbWF0aW9uIGZyYW1lIGl0IGlzIGNhbmNlbGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICovXG4gICAgVGlja2VyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbElmTmVlZGVkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHRpY2tlciBhbmQgZG9uJ3QgdXNlIGFmdGVyIHRoaXMuIENhbGxpbmdcbiAgICAgKiB0aGlzIG1ldGhvZCByZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGludGVybmFsIGV2ZW50cy5cbiAgICAgKi9cbiAgICBUaWNrZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcHJvdGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHRoaXMuX2hlYWQubmV4dDtcbiAgICAgICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIuZGVzdHJveSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2hlYWQuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGFuIHVwZGF0ZS4gQW4gdXBkYXRlIGVudGFpbHMgc2V0dGluZyB0aGVcbiAgICAgKiBjdXJyZW50IHtAbGluayBQSVhJLlRpY2tlciNlbGFwc2VkTVN9LFxuICAgICAqIHRoZSBjdXJyZW50IHtAbGluayBQSVhJLlRpY2tlciNkZWx0YVRpbWV9LFxuICAgICAqIGludm9raW5nIGFsbCBsaXN0ZW5lcnMgd2l0aCBjdXJyZW50IGRlbHRhVGltZSxcbiAgICAgKiBhbmQgdGhlbiBmaW5hbGx5IHNldHRpbmcge0BsaW5rIFBJWEkuVGlja2VyI2xhc3RUaW1lfVxuICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIGN1cnJlbnRUaW1lIHRoYXQgd2FzIHByb3ZpZGVkLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgYW5pbWF0aW9uXG4gICAgICogZnJhbWUgY2FsbGJhY2tzIGlmIHRoZSB0aWNrZXIgaW5zdGFuY2UgaGFzIGJlZW4gc3RhcnRlZFxuICAgICAqIGFuZCBsaXN0ZW5lcnMgYXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjdXJyZW50VGltZT1wZXJmb3JtYW5jZS5ub3coKV0gLSB0aGUgY3VycmVudCB0aW1lIG9mIGV4ZWN1dGlvblxuICAgICAqL1xuICAgIFRpY2tlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGN1cnJlbnRUaW1lKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGltZSA9PT0gdm9pZCAwKSB7IGN1cnJlbnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7IH1cbiAgICAgICAgdmFyIGVsYXBzZWRNUztcbiAgICAgICAgLy8gSWYgdGhlIGRpZmZlcmVuY2UgaW4gdGltZSBpcyB6ZXJvIG9yIG5lZ2F0aXZlLCB3ZSBpZ25vcmUgbW9zdCBvZiB0aGUgd29yayBkb25lIGhlcmUuXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHZhbGlkIGRpZmZlcmVuY2UsIHRoZW4gc2hvdWxkIGJlIG5vIHJlYXNvbiB0byBsZXQgYW55b25lIGtub3cgYWJvdXQgaXQuXG4gICAgICAgIC8vIEEgemVybyBkZWx0YSwgaXMgZXhhY3RseSB0aGF0LCBub3RoaW5nIHNob3VsZCB1cGRhdGUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGluIHRpbWUgY2FuIGJlIG5lZ2F0aXZlLCBhbmQgbm8gdGhpcyBkb2VzIG5vdCBtZWFuIHRpbWUgdHJhdmVsaW5nLlxuICAgICAgICAvLyBUaGlzIGNhbiBiZSB0aGUgcmVzdWx0IG9mIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiB3aGVuIGFuIGFuaW1hdGlvbiBmcmFtZSBpcyByZXF1ZXN0ZWRcbiAgICAgICAgLy8gb24gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgZXZlbnQgbG9vcCwgYW5kIHdoZW4gdGhlIHRpY2tlcidzIHN0YXJ0IG1ldGhvZCBpcyBpbnZva2VkXG4gICAgICAgIC8vICh3aGljaCBpbnZva2VzIHRoZSBpbnRlcm5hbCBfcmVxdWVzdElmTmVlZGVkIG1ldGhvZCkuIElmIGEgZnJhbWUgaXMgcmVxdWVzdGVkIGJlZm9yZVxuICAgICAgICAvLyBfcmVxdWVzdElmTmVlZGVkIGlzIGludm9rZWQsIHRoZW4gdGhlIGNhbGxiYWNrIGZvciB0aGUgYW5pbWF0aW9uIGZyYW1lIHRoZSB0aWNrZXIgcmVxdWVzdHMsXG4gICAgICAgIC8vIGNhbiByZWNlaXZlIGEgdGltZSBhcmd1bWVudCB0aGF0IGNhbiBiZSBsZXNzIHRoYW4gdGhlIGxhc3RUaW1lIHZhbHVlIHRoYXQgd2FzIHNldCB3aXRoaW5cbiAgICAgICAgLy8gX3JlcXVlc3RJZk5lZWRlZC4gVGhpcyBkaWZmZXJlbmNlIGlzIGluIG1pY3Jvc2Vjb25kcywgYnV0IHRoaXMgaXMgZW5vdWdoIHRvIGNhdXNlIHByb2JsZW1zLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNoZWNrIGNvdmVycyB0aGlzIGJyb3dzZXIgZW5naW5lIHRpbWluZyBpc3N1ZSwgYXMgd2VsbCBhcyBpZiBjb25zdW1lcnMgcGFzcyBhbiBpbnZhbGlkXG4gICAgICAgIC8vIGN1cnJlbnRUaW1lIHZhbHVlLiBUaGlzIG1heSBoYXBwZW4gaWYgY29uc3VtZXJzIG9wdC1vdXQgb2YgdGhlIGF1dG9TdGFydCwgYW5kIHVwZGF0ZSB0aGVtc2VsdmVzLlxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiB0aGlzLmxhc3RUaW1lKSB7XG4gICAgICAgICAgICAvLyBTYXZlIHVuY2FwcGVkIGVsYXBzZWRNUyBmb3IgbWVhc3VyZW1lbnRcbiAgICAgICAgICAgIGVsYXBzZWRNUyA9IHRoaXMuZWxhcHNlZE1TID0gY3VycmVudFRpbWUgLSB0aGlzLmxhc3RUaW1lO1xuICAgICAgICAgICAgLy8gY2FwIHRoZSBtaWxsaXNlY29uZHMgZWxhcHNlZCB1c2VkIGZvciBkZWx0YVRpbWVcbiAgICAgICAgICAgIGlmIChlbGFwc2VkTVMgPiB0aGlzLl9tYXhFbGFwc2VkTVMpIHtcbiAgICAgICAgICAgICAgICBlbGFwc2VkTVMgPSB0aGlzLl9tYXhFbGFwc2VkTVM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGFwc2VkTVMgKj0gdGhpcy5zcGVlZDtcbiAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkLCBleGl0IHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICAgIC8vIEdldCByZWFkeSBmb3IgbmV4dCBmcmFtZSBieSBzZXR0aW5nIF9sYXN0RnJhbWUsIGJ1dCBiYXNlZCBvbiBfbWluRWxhcHNlZE1TXG4gICAgICAgICAgICAvLyBhZGp1c3RtZW50IHRvIGVuc3VyZSBhIHJlbGF0aXZlbHkgc3RhYmxlIGludGVydmFsLlxuICAgICAgICAgICAgaWYgKHRoaXMuX21pbkVsYXBzZWRNUykge1xuICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IGN1cnJlbnRUaW1lIC0gdGhpcy5fbGFzdEZyYW1lIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCB0aGlzLl9taW5FbGFwc2VkTVMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0RnJhbWUgPSBjdXJyZW50VGltZSAtIChkZWx0YSAlIHRoaXMuX21pbkVsYXBzZWRNUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlbHRhTVMgPSBlbGFwc2VkTVM7XG4gICAgICAgICAgICB0aGlzLmRlbHRhVGltZSA9IHRoaXMuZGVsdGFNUyAqIHNldHRpbmdzLlRBUkdFVF9GUE1TO1xuICAgICAgICAgICAgLy8gQ2FjaGUgYSBsb2NhbCByZWZlcmVuY2UsIGluLWNhc2UgdGlja2VyIGlzIGRlc3Ryb3llZFxuICAgICAgICAgICAgLy8gZHVyaW5nIHRoZSBlbWl0LCB3ZSBjYW4gc3RpbGwgY2hlY2sgZm9yIGhlYWQubmV4dFxuICAgICAgICAgICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgICAgICAgICAgLy8gSW52b2tlIGxpc3RlbmVycyBhZGRlZCB0byBpbnRlcm5hbCBlbWl0dGVyXG4gICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBoZWFkLm5leHQ7XG4gICAgICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLmVtaXQodGhpcy5kZWx0YVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoZWFkLm5leHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWx0YVRpbWUgPSB0aGlzLmRlbHRhTVMgPSB0aGlzLmVsYXBzZWRNUyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpY2tlci5wcm90b3R5cGUsIFwiRlBTXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmcmFtZXMgcGVyIHNlY29uZCBhdCB3aGljaCB0aGlzIHRpY2tlciBpcyBydW5uaW5nLlxuICAgICAgICAgKiBUaGUgZGVmYXVsdCBpcyBhcHByb3hpbWF0ZWx5IDYwIGluIG1vc3QgbW9kZXJuIGJyb3dzZXJzLlxuICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBkb2VzIG5vdCBmYWN0b3IgaW4gdGhlIHZhbHVlIG9mXG4gICAgICAgICAqIHtAbGluayBQSVhJLlRpY2tlciNzcGVlZH0sIHdoaWNoIGlzIHNwZWNpZmljXG4gICAgICAgICAqIHRvIHNjYWxpbmcge0BsaW5rIFBJWEkuVGlja2VyI2RlbHRhVGltZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAxMDAwIC8gdGhpcy5lbGFwc2VkTVM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaWNrZXIucHJvdG90eXBlLCBcIm1pbkZQU1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYW5hZ2VzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgYWxsb3dlZCB0b1xuICAgICAgICAgKiBlbGFwc2UgYmV0d2VlbiBpbnZva2luZyB7QGxpbmsgUElYSS5UaWNrZXIjdXBkYXRlfS5cbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNhcCB7QGxpbmsgUElYSS5UaWNrZXIjZGVsdGFUaW1lfSxcbiAgICAgICAgICogYnV0IGRvZXMgbm90IGVmZmVjdCB0aGUgbWVhc3VyZWQgdmFsdWUgb2Yge0BsaW5rIFBJWEkuVGlja2VyI0ZQU30uXG4gICAgICAgICAqIFdoZW4gc2V0dGluZyB0aGlzIHByb3BlcnR5IGl0IGlzIGNsYW1wZWQgdG8gYSB2YWx1ZSBiZXR3ZWVuXG4gICAgICAgICAqIGAwYCBhbmQgYFBJWEkuc2V0dGluZ3MuVEFSR0VUX0ZQTVMgKiAxMDAwYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gMTAwMCAvIHRoaXMuX21heEVsYXBzZWRNUztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZnBzKSB7XG4gICAgICAgICAgICAvLyBNaW5pbXVtIG11c3QgYmUgYmVsb3cgdGhlIG1heEZQU1xuICAgICAgICAgICAgdmFyIG1pbkZQUyA9IE1hdGgubWluKHRoaXMubWF4RlBTLCBmcHMpO1xuICAgICAgICAgICAgLy8gTXVzdCBiZSBhdCBsZWFzdCAwLCBidXQgYmVsb3cgMSAvIHNldHRpbmdzLlRBUkdFVF9GUE1TXG4gICAgICAgICAgICB2YXIgbWluRlBNUyA9IE1hdGgubWluKE1hdGgubWF4KDAsIG1pbkZQUykgLyAxMDAwLCBzZXR0aW5ncy5UQVJHRVRfRlBNUyk7XG4gICAgICAgICAgICB0aGlzLl9tYXhFbGFwc2VkTVMgPSAxIC8gbWluRlBNUztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpY2tlci5wcm90b3R5cGUsIFwibWF4RlBTXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hbmFnZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1pbGxpc2Vjb25kcyByZXF1aXJlZCB0b1xuICAgICAgICAgKiBlbGFwc2UgYmV0d2VlbiBpbnZva2luZyB7QGxpbmsgUElYSS5UaWNrZXIjdXBkYXRlfS5cbiAgICAgICAgICogVGhpcyB3aWxsIGVmZmVjdCB0aGUgbWVhc3VyZWQgdmFsdWUgb2Yge0BsaW5rIFBJWEkuVGlja2VyI0ZQU30uXG4gICAgICAgICAqIElmIGl0IGlzIHNldCB0byBgMGAsIHRoZW4gdGhlcmUgaXMgbm8gbGltaXQ7IFBpeGlKUyB3aWxsIHJlbmRlciBhcyBtYW55IGZyYW1lcyBhcyBpdCBjYW4uXG4gICAgICAgICAqIE90aGVyd2lzZSBpdCB3aWxsIGJlIGF0IGxlYXN0IGBtaW5GUFNgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWluRWxhcHNlZE1TKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoMTAwMCAvIHRoaXMuX21pbkVsYXBzZWRNUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZnBzKSB7XG4gICAgICAgICAgICBpZiAoZnBzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRWxhcHNlZE1TID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1heCBtdXN0IGJlIGF0IGxlYXN0IHRoZSBtaW5GUFNcbiAgICAgICAgICAgICAgICB2YXIgbWF4RlBTID0gTWF0aC5tYXgodGhpcy5taW5GUFMsIGZwcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRWxhcHNlZE1TID0gMSAvIChtYXhGUFMgLyAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpY2tlciwgXCJzaGFyZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNoYXJlZCB0aWNrZXIgaW5zdGFuY2UgdXNlZCBieSB7QGxpbmsgUElYSS5BbmltYXRlZFNwcml0ZX0gYW5kIGJ5XG4gICAgICAgICAqIHtAbGluayBQSVhJLlZpZGVvUmVzb3VyY2V9IHRvIHVwZGF0ZSBhbmltYXRpb24gZnJhbWVzIC8gdmlkZW8gdGV4dHVyZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEl0IG1heSBhbHNvIGJlIHVzZWQgYnkge0BsaW5rIFBJWEkuQXBwbGljYXRpb259IGlmIGNyZWF0ZWQgd2l0aCB0aGUgYHNoYXJlZFRpY2tlcmAgb3B0aW9uIHByb3BlcnR5IHNldCB0byB0cnVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgcHJvcGVydHkge0BsaW5rIFBJWEkuVGlja2VyI2F1dG9TdGFydH0gaXMgc2V0IHRvIGB0cnVlYCBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICogUGxlYXNlIGZvbGxvdyB0aGUgZXhhbXBsZXMgZm9yIHVzYWdlLCBpbmNsdWRpbmcgaG93IHRvIG9wdC1vdXQgb2YgYXV0by1zdGFydGluZyB0aGUgc2hhcmVkIHRpY2tlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogbGV0IHRpY2tlciA9IFBJWEkuVGlja2VyLnNoYXJlZDtcbiAgICAgICAgICogLy8gU2V0IHRoaXMgdG8gcHJldmVudCBzdGFydGluZyB0aGlzIHRpY2tlciB3aGVuIGxpc3RlbmVycyBhcmUgYWRkZWQuXG4gICAgICAgICAqIC8vIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIG9ubHkgZm9yIHRoZSBQSVhJLlRpY2tlci5zaGFyZWQgaW5zdGFuY2UuXG4gICAgICAgICAqIHRpY2tlci5hdXRvU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICogLy8gRllJLCBjYWxsIHRoaXMgdG8gZW5zdXJlIHRoZSB0aWNrZXIgaXMgc3RvcHBlZC4gSXQgc2hvdWxkIGJlIHN0b3BwZWRcbiAgICAgICAgICogLy8gaWYgeW91IGhhdmUgbm90IGF0dGVtcHRlZCB0byByZW5kZXIgYW55dGhpbmcgeWV0LlxuICAgICAgICAgKiB0aWNrZXIuc3RvcCgpO1xuICAgICAgICAgKiAvLyBDYWxsIHRoaXMgd2hlbiB5b3UgYXJlIHJlYWR5IGZvciBhIHJ1bm5pbmcgc2hhcmVkIHRpY2tlci5cbiAgICAgICAgICogdGlja2VyLnN0YXJ0KCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIC8vIFlvdSBtYXkgdXNlIHRoZSBzaGFyZWQgdGlja2VyIHRvIHJlbmRlci4uLlxuICAgICAgICAgKiBsZXQgcmVuZGVyZXIgPSBQSVhJLmF1dG9EZXRlY3RSZW5kZXJlcigpO1xuICAgICAgICAgKiBsZXQgc3RhZ2UgPSBuZXcgUElYSS5Db250YWluZXIoKTtcbiAgICAgICAgICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyZW5kZXJlci52aWV3KTtcbiAgICAgICAgICogdGlja2VyLmFkZChmdW5jdGlvbiAodGltZSkge1xuICAgICAgICAgKiAgICAgcmVuZGVyZXIucmVuZGVyKHN0YWdlKTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIC8vIE9yIHlvdSBjYW4ganVzdCB1cGRhdGUgaXQgbWFudWFsbHkuXG4gICAgICAgICAqIHRpY2tlci5hdXRvU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICogdGlja2VyLnN0b3AoKTtcbiAgICAgICAgICogZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XG4gICAgICAgICAqICAgICB0aWNrZXIudXBkYXRlKHRpbWUpO1xuICAgICAgICAgKiAgICAgcmVuZGVyZXIucmVuZGVyKHN0YWdlKTtcbiAgICAgICAgICogICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgICogfVxuICAgICAgICAgKiBhbmltYXRlKHBlcmZvcm1hbmNlLm5vdygpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5UaWNrZXJ9XG4gICAgICAgICAqIEBzdGF0aWNcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFUaWNrZXIuX3NoYXJlZCkge1xuICAgICAgICAgICAgICAgIHZhciBzaGFyZWQgPSBUaWNrZXIuX3NoYXJlZCA9IG5ldyBUaWNrZXIoKTtcbiAgICAgICAgICAgICAgICBzaGFyZWQuYXV0b1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzaGFyZWQuX3Byb3RlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVGlja2VyLl9zaGFyZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaWNrZXIsIFwic3lzdGVtXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzeXN0ZW0gdGlja2VyIGluc3RhbmNlIHVzZWQgYnkge0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyfSBhbmQgYnlcbiAgICAgICAgICoge0BsaW5rIFBJWEkuQmFzZVByZXBhcmV9IGZvciBjb3JlIHRpbWluZyBmdW5jdGlvbmFsaXR5IHRoYXQgc2hvdWxkbid0IHVzdWFsbHkgbmVlZCB0byBiZSBwYXVzZWQsXG4gICAgICAgICAqIHVubGlrZSB0aGUgYHNoYXJlZGAgdGlja2VyIHdoaWNoIGRyaXZlcyB2aXN1YWwgYW5pbWF0aW9ucyBhbmQgcmVuZGVyaW5nIHdoaWNoIG1heSB3YW50IHRvIGJlIHBhdXNlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIHByb3BlcnR5IHtAbGluayBQSVhJLlRpY2tlciNhdXRvU3RhcnR9IGlzIHNldCB0byBgdHJ1ZWAgZm9yIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuVGlja2VyfVxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghVGlja2VyLl9zeXN0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3lzdGVtID0gVGlja2VyLl9zeXN0ZW0gPSBuZXcgVGlja2VyKCk7XG4gICAgICAgICAgICAgICAgc3lzdGVtLmF1dG9TdGFydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3lzdGVtLl9wcm90ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFRpY2tlci5fc3lzdGVtO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gVGlja2VyO1xufSgpKTtcblxuLyoqXG4gKiBNaWRkbGV3YXJlIGZvciBmb3IgQXBwbGljYXRpb24gVGlja2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge1RpY2tlclBsdWdpbn0gZnJvbSAnQHBpeGkvdGlja2VyJztcbiAqIGltcG9ydCB7QXBwbGljYXRpb259IGZyb20gJ0BwaXhpL2FwcCc7XG4gKiBBcHBsaWNhdGlvbi5yZWdpc3RlclBsdWdpbihUaWNrZXJQbHVnaW4pO1xuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRpY2tlclBsdWdpbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaWNrZXJQbHVnaW4oKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHBsdWdpbiB3aXRoIHNjb3BlIG9mIGFwcGxpY2F0aW9uIGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gU2VlIGFwcGxpY2F0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBUaWNrZXJQbHVnaW4uaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIFNldCBkZWZhdWx0XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGF1dG9TdGFydDogdHJ1ZSxcbiAgICAgICAgICAgIHNoYXJlZFRpY2tlcjogZmFsc2UsXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBDcmVhdGUgdGlja2VyIHNldHRlclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RpY2tlcicsIHtcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHRpY2tlcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90aWNrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja2VyLnJlbW92ZSh0aGlzLnJlbmRlciwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tlciA9IHRpY2tlcjtcbiAgICAgICAgICAgICAgICBpZiAodGlja2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tlci5hZGQodGhpcy5yZW5kZXIsIHRoaXMsIFVQREFURV9QUklPUklUWS5MT1cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGlja2VyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHN0b3BwaW5nIHRoZSByZW5kZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZXRob2QgUElYSS5BcHBsaWNhdGlvbiNzdG9wXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5fdGlja2VyLnN0b3AoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3RhcnRpbmcgdGhlIHJlbmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1ldGhvZCBQSVhJLkFwcGxpY2F0aW9uI3N0YXJ0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuX3RpY2tlci5zdGFydCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgcmVmZXJlbmNlIHRvIHRoZSB0aWNrZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtQSVhJLlRpY2tlcn1cbiAgICAgICAgICogQG5hbWUgX3RpY2tlclxuICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5BcHBsaWNhdGlvbiNcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3RpY2tlciA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaWNrZXIgZm9yIGRvaW5nIHJlbmRlciB1cGRhdGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7UElYSS5UaWNrZXJ9XG4gICAgICAgICAqIEBuYW1lIHRpY2tlclxuICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5BcHBsaWNhdGlvbiNcbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5UaWNrZXIuc2hhcmVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpY2tlciA9IG9wdGlvbnMuc2hhcmVkVGlja2VyID8gVGlja2VyLnNoYXJlZCA6IG5ldyBUaWNrZXIoKTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHJlbmRlcmluZ1xuICAgICAgICBpZiAob3B0aW9ucy5hdXRvU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgdGhlIHRpY2tlciwgc2NvcGVkIHRvIGFwcGxpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGlja2VyUGx1Z2luLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWNrZXIpIHtcbiAgICAgICAgICAgIHZhciBvbGRUaWNrZXIgPSB0aGlzLl90aWNrZXI7XG4gICAgICAgICAgICB0aGlzLnRpY2tlciA9IG51bGw7XG4gICAgICAgICAgICBvbGRUaWNrZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGlja2VyUGx1Z2luO1xufSgpKTtcblxuZXhwb3J0IHsgVGlja2VyLCBUaWNrZXJQbHVnaW4sIFVQREFURV9QUklPUklUWSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGlja2VyLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9pbnRlcmFjdGlvbiAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9pbnRlcmFjdGlvbiBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyBUaWNrZXIsIFVQREFURV9QUklPUklUWSB9IGZyb20gJ0BwaXhpL3RpY2tlcic7XG5pbXBvcnQgeyBEaXNwbGF5T2JqZWN0IH0gZnJvbSAnQHBpeGkvZGlzcGxheSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcGl4aS91dGlscyc7XG5cbi8qKlxuICogSG9sZHMgYWxsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYW4gSW50ZXJhY3Rpb24gZXZlbnRcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJLmludGVyYWN0aW9uXG4gKi9cbnZhciBJbnRlcmFjdGlvbkRhdGEgPSBmdW5jdGlvbiBJbnRlcmFjdGlvbkRhdGEoKVxue1xuICAgIC8qKlxuICAgICAqIFRoaXMgcG9pbnQgc3RvcmVzIHRoZSBnbG9iYWwgY29vcmRzIG9mIHdoZXJlIHRoZSB0b3VjaC9tb3VzZSBldmVudCBoYXBwZW5lZFxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5Qb2ludH1cbiAgICAgKi9cbiAgICB0aGlzLmdsb2JhbCA9IG5ldyBQb2ludCgpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRhcmdldCBTcHJpdGUgdGhhdCB3YXMgaW50ZXJhY3RlZCB3aXRoXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlNwcml0ZX1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBhc3NlZCB0byBhbiBldmVudCBoYW5kbGVyLCB0aGlzIHdpbGwgYmUgdGhlIG9yaWdpbmFsIERPTSBFdmVudCB0aGF0IHdhcyBjYXB0dXJlZFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RvdWNoRXZlbnRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnRcbiAgICAgKiBAbWVtYmVyIHtNb3VzZUV2ZW50fFRvdWNoRXZlbnR8UG9pbnRlckV2ZW50fVxuICAgICAqL1xuICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnRlcmFjdGlvblxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaWRlbnRpZmllciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHBvaW50ZXIgZGV2aWNlIHRoYXQgY3JlYXRlZCB0aGUgZXZlbnQgaXMgdGhlIHByaW1hcnkgcG9pbnRlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvaXNQcmltYXJ5XG4gICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pc1ByaW1hcnkgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGljaCBidXR0b24gd2FzIHByZXNzZWQgb24gdGhlIG1vdXNlIG9yIHBvaW50ZXIgZGV2aWNlIHRvIHRyaWdnZXIgdGhlIGV2ZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmJ1dHRvbiA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggYnV0dG9ucyBhcmUgcHJlc3NlZCBvbiB0aGUgbW91c2Ugb3IgcG9pbnRlciBkZXZpY2Ugd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5idXR0b25zID0gMDtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcG9pbnRlcidzIGNvbnRhY3QgYWxvbmcgdGhlIHgtYXhpcywgbWVhc3VyZWQgaW4gQ1NTIHBpeGVscy5cbiAgICAgKiByYWRpdXNYIG9mIFRvdWNoRXZlbnRzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyB2YWx1ZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvd2lkdGhcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMud2lkdGggPSAwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgcG9pbnRlcidzIGNvbnRhY3QgYWxvbmcgdGhlIHktYXhpcywgbWVhc3VyZWQgaW4gQ1NTIHBpeGVscy5cbiAgICAgKiByYWRpdXNZIG9mIFRvdWNoRXZlbnRzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyB2YWx1ZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvaGVpZ2h0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW5nbGUsIGluIGRlZ3JlZXMsIGJldHdlZW4gdGhlIHBvaW50ZXIgZGV2aWNlIGFuZCB0aGUgc2NyZWVuLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1BvaW50ZXJFdmVudC90aWx0WFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy50aWx0WCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW5nbGUsIGluIGRlZ3JlZXMsIGJldHdlZW4gdGhlIHBvaW50ZXIgZGV2aWNlIGFuZCB0aGUgc2NyZWVuLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1BvaW50ZXJFdmVudC90aWx0WVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy50aWx0WSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwb2ludGVyIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvcG9pbnRlclR5cGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMucG9pbnRlclR5cGUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUHJlc3N1cmUgYXBwbGllZCBieSB0aGUgcG9pbnRpbmcgZGV2aWNlIGR1cmluZyB0aGUgZXZlbnQuIEEgVG91Y2gncyBmb3JjZSBwcm9wZXJ0eVxuICAgICAqIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyB2YWx1ZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvcHJlc3N1cmVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMucHJlc3N1cmUgPSAwO1xuXG4gICAgLyoqXG4gICAgICogRnJvbSBUb3VjaEV2ZW50cyAobm90IFBvaW50ZXJFdmVudHMgdHJpZ2dlcmVkIGJ5IHRvdWNoZXMpLCB0aGUgcm90YXRpb25BbmdsZSBvZiB0aGUgVG91Y2guXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVG91Y2gvcm90YXRpb25BbmdsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5yb3RhdGlvbkFuZ2xlID0gMDtcblxuICAgIC8qKlxuICAgICAqIFR3aXN0IG9mIGEgc3R5bHVzIHBvaW50ZXIuXG4gICAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vcG9pbnRlcmV2ZW50cy8jcG9pbnRlcmV2ZW50LWludGVyZmFjZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy50d2lzdCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBCYXJyZWwgcHJlc3N1cmUgb24gYSBzdHlsdXMgcG9pbnRlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9wb2ludGVyZXZlbnRzLyNwb2ludGVyZXZlbnQtaW50ZXJmYWNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnRhbmdlbnRpYWxQcmVzc3VyZSA9IDA7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBwb2ludGVySWQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLyoqXG4gKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHBvaW50ZXIuIEl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgYGlkZW50aWZpZXJgLlxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb2ludGVyRXZlbnQvcG9pbnRlcklkXG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5wb2ludGVySWQuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5pZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgc3BlY2lmaWVkIGRpc3BsYXlPYmplY3QgZm9yIHRoaXMgSW50ZXJhY3Rpb25EYXRhXG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGRpc3BsYXlPYmplY3QgLSBUaGUgRGlzcGxheU9iamVjdCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRoZSBsb2NhbFxuICogIGNvb3JkcyBvZmZcbiAqIEBwYXJhbSB7UElYSS5Qb2ludH0gW3BvaW50XSAtIEEgUG9pbnQgb2JqZWN0IGluIHdoaWNoIHRvIHN0b3JlIHRoZSB2YWx1ZSwgb3B0aW9uYWwgKG90aGVyd2lzZVxuICogIHdpbGwgY3JlYXRlIGEgbmV3IHBvaW50KVxuICogQHBhcmFtIHtQSVhJLlBvaW50fSBbZ2xvYmFsUG9zXSAtIEEgUG9pbnQgb2JqZWN0IGNvbnRhaW5pbmcgeW91ciBjdXN0b20gZ2xvYmFsIGNvb3Jkcywgb3B0aW9uYWxcbiAqICAob3RoZXJ3aXNlIHdpbGwgdXNlIHRoZSBjdXJyZW50IGdsb2JhbCBjb29yZHMpXG4gKiBAcmV0dXJuIHtQSVhJLlBvaW50fSBBIHBvaW50IGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBJbnRlcmFjdGlvbkRhdGEgcG9zaXRpb24gcmVsYXRpdmVcbiAqICB0byB0aGUgRGlzcGxheU9iamVjdFxuICovXG5JbnRlcmFjdGlvbkRhdGEucHJvdG90eXBlLmdldExvY2FsUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRMb2NhbFBvc2l0aW9uIChkaXNwbGF5T2JqZWN0LCBwb2ludCwgZ2xvYmFsUG9zKVxue1xuICAgIHJldHVybiBkaXNwbGF5T2JqZWN0LndvcmxkVHJhbnNmb3JtLmFwcGx5SW52ZXJzZShnbG9iYWxQb3MgfHwgdGhpcy5nbG9iYWwsIHBvaW50KTtcbn07XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgZnJvbSBub3JtYWxpemVkIGV2ZW50IGRhdGEuXG4gKlxuICogQHBhcmFtIHtUb3VjaHxNb3VzZUV2ZW50fFBvaW50ZXJFdmVudH0gZXZlbnQgVGhlIG5vcm1hbGl6ZWQgZXZlbnQgZGF0YVxuICovXG5JbnRlcmFjdGlvbkRhdGEucHJvdG90eXBlLmNvcHlFdmVudCA9IGZ1bmN0aW9uIGNvcHlFdmVudCAoZXZlbnQpXG57XG4gICAgLy8gaXNQcmltYXJ5IHNob3VsZCBvbmx5IGNoYW5nZSBvbiB0b3VjaHN0YXJ0L3BvaW50ZXJkb3duLCBzbyB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZVxuICAgIC8vIGl0IHdpdGggXCJmYWxzZVwiIG9uIGxhdGVyIGV2ZW50cyB3aGVuIG91ciBzaGltIGZvciBpdCBvbiB0b3VjaCBldmVudHMgbWlnaHQgbm90IGJlXG4gICAgLy8gYWNjdXJhdGVcbiAgICBpZiAoZXZlbnQuaXNQcmltYXJ5KVxuICAgIHtcbiAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcbiAgICAvLyBldmVudC5idXR0b25zIGlzIG5vdCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzIChpZS4gU2FmYXJpKSwgYnV0IGl0IGRvZXMgaGF2ZSBhIG5vbi1zdGFuZGFyZFxuICAgIC8vIGV2ZW50LndoaWNoIHByb3BlcnR5IGluc3RlYWQsIHdoaWNoIGNvbnZleXMgdGhlIHNhbWUgaW5mb3JtYXRpb24uXG4gICAgdGhpcy5idXR0b25zID0gTnVtYmVyLmlzSW50ZWdlcihldmVudC5idXR0b25zKSA/IGV2ZW50LmJ1dHRvbnMgOiBldmVudC53aGljaDtcbiAgICB0aGlzLndpZHRoID0gZXZlbnQud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBldmVudC5oZWlnaHQ7XG4gICAgdGhpcy50aWx0WCA9IGV2ZW50LnRpbHRYO1xuICAgIHRoaXMudGlsdFkgPSBldmVudC50aWx0WTtcbiAgICB0aGlzLnBvaW50ZXJUeXBlID0gZXZlbnQucG9pbnRlclR5cGU7XG4gICAgdGhpcy5wcmVzc3VyZSA9IGV2ZW50LnByZXNzdXJlO1xuICAgIHRoaXMucm90YXRpb25BbmdsZSA9IGV2ZW50LnJvdGF0aW9uQW5nbGU7XG4gICAgdGhpcy50d2lzdCA9IGV2ZW50LnR3aXN0IHx8IDA7XG4gICAgdGhpcy50YW5nZW50aWFsUHJlc3N1cmUgPSBldmVudC50YW5nZW50aWFsUHJlc3N1cmUgfHwgMDtcbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBkYXRhIGZvciBwb29saW5nLlxuICovXG5JbnRlcmFjdGlvbkRhdGEucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbntcbiAgICAvLyBpc1ByaW1hcnkgaXMgdGhlIG9ubHkgcHJvcGVydHkgdGhhdCB3ZSByZWFsbHkgbmVlZCB0byByZXNldCAtIGV2ZXJ5dGhpbmcgZWxzZSBpc1xuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb3ZlcndyaXR0ZW5cbiAgICB0aGlzLmlzUHJpbWFyeSA9IGZhbHNlO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVyYWN0aW9uRGF0YS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4vKipcbiAqIEV2ZW50IGNsYXNzIHRoYXQgbWltaWNzIG5hdGl2ZSBET00gZXZlbnRzLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkuaW50ZXJhY3Rpb25cbiAqL1xudmFyIEludGVyYWN0aW9uRXZlbnQgPSBmdW5jdGlvbiBJbnRlcmFjdGlvbkV2ZW50KClcbntcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgZXZlbnQgd2lsbCBjb250aW51ZSBwcm9wYWdhdGluZyBpbiB0aGUgdHJlZS5cbiAgICAgKlxuICAgICAqIFJlbWFpbmluZyBldmVudHMgZm9yIHRoZSB7QGxpbmsgc3RvcHNQcm9wYWdhdGluZ0F0fSBvYmplY3RcbiAgICAgKiB3aWxsIHN0aWxsIGJlIGRpc3BhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXQgd2hpY2ggb2JqZWN0IHRoaXMgZXZlbnQgc3RvcHMgcHJvcGFnYXRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge1BJWEkuRGlzcGxheU9iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnN0b3BzUHJvcGFnYXRpbmdBdCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHdlIGFscmVhZHkgcmVhY2hlZCB0aGUgZWxlbWVudCB3ZSB3YW50IHRvXG4gICAgICogc3RvcCBwcm9wYWdhdGluZyBhdC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGRlbGF5ZWQgZXZlbnRzLFxuICAgICAqIHdoZXJlIHdlIHN0YXJ0IG92ZXIgZGVlcGVyIGluIHRoZSB0cmVlIGFnYWluLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuc3RvcFByb3BhZ2F0aW9uSGludCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9iamVjdCB3aGljaCBjYXVzZWQgdGhpcyBldmVudCB0byBiZSBkaXNwYXRjaGVkLlxuICAgICAqIEZvciBsaXN0ZW5lciBjYWxsYmFjayBzZWUge0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudC5jdXJyZW50VGFyZ2V0fS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuRGlzcGxheU9iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnRhcmdldCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb2JqZWN0IHdob3NlIGV2ZW50IGxpc3RlbmVy4oCZcyBjYWxsYmFjayBpcyBjdXJyZW50bHkgYmVpbmcgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuRGlzcGxheU9iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgZXZlbnRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJhY3Rpb25EYXRhIHJlbGF0ZWQgdG8gdGhpcyBldmVudFxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkRhdGF9XG4gICAgICovXG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbn07XG5cbi8qKlxuICogUHJldmVudHMgZXZlbnQgZnJvbSByZWFjaGluZyBhbnkgb2JqZWN0cyBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG9iamVjdC5cbiAqXG4gKi9cbkludGVyYWN0aW9uRXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbiAoKVxue1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb25IaW50ID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3BzUHJvcGFnYXRpbmdBdCA9IHRoaXMuY3VycmVudFRhcmdldDtcbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBldmVudC5cbiAqL1xuSW50ZXJhY3Rpb25FdmVudC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxue1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcHNQcm9wYWdhdGluZ0F0ID0gbnVsbDtcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbkhpbnQgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcbn07XG5cbi8qKlxuICogRGlzcGxheU9iamVjdHMgd2l0aCB0aGUge0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uaW50ZXJhY3RpdmVUYXJnZXR9IG1peGluIHVzZSB0aGlzIGNsYXNzIHRvIHRyYWNrIGludGVyYWN0aW9uc1xuICpcbiAqIEBjbGFzc1xuICogQHByaXZhdGVcbiAqIEBtZW1iZXJvZiBQSVhJLmludGVyYWN0aW9uXG4gKi9cbnZhciBJbnRlcmFjdGlvblRyYWNraW5nRGF0YSA9IGZ1bmN0aW9uIEludGVyYWN0aW9uVHJhY2tpbmdEYXRhKHBvaW50ZXJJZClcbntcbiAgICB0aGlzLl9wb2ludGVySWQgPSBwb2ludGVySWQ7XG4gICAgdGhpcy5fZmxhZ3MgPSBJbnRlcmFjdGlvblRyYWNraW5nRGF0YS5GTEFHUy5OT05FO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBwb2ludGVySWQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZmxhZ3M6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sbm9uZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxvdmVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHJpZ2h0RG93bjogeyBjb25maWd1cmFibGU6IHRydWUgfSxsZWZ0RG93bjogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vKipcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IGZsYWcgLSBUaGUgaW50ZXJhY3Rpb24gZmxhZyB0byBzZXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0geW4gLSBTaG91bGQgdGhlIGZsYWcgYmUgc2V0IG9yIHVuc2V0XG4gKi9cbkludGVyYWN0aW9uVHJhY2tpbmdEYXRhLnByb3RvdHlwZS5fZG9TZXQgPSBmdW5jdGlvbiBfZG9TZXQgKGZsYWcsIHluKVxue1xuICAgIGlmICh5bilcbiAgICB7XG4gICAgICAgIHRoaXMuX2ZsYWdzID0gdGhpcy5fZmxhZ3MgfCBmbGFnO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICB0aGlzLl9mbGFncyA9IHRoaXMuX2ZsYWdzICYgKH5mbGFnKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFVuaXF1ZSBwb2ludGVyIGlkIG9mIHRoZSBldmVudFxuICpcbiAqIEByZWFkb25seVxuICogQHByaXZhdGVcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzJDEucG9pbnRlcklkLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50ZXJJZDtcbn07XG5cbi8qKlxuICogU3RhdGUgb2YgdGhlIHRyYWNraW5nIGRhdGEsIGV4cHJlc3NlZCBhcyBiaXQgZmxhZ3NcbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1lbWJlciB7bnVtYmVyfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5mbGFncy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9mbGFncztcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycyQxLmZsYWdzLnNldCA9IGZ1bmN0aW9uIChmbGFncykgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgdGhpcy5fZmxhZ3MgPSBmbGFncztcbn07XG5cbi8qKlxuICogSXMgdGhlIHRyYWNrZWQgZXZlbnQgaW5hY3RpdmUgKG5vdCBvdmVyIG9yIGRvd24pP1xuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQxLm5vbmUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fZmxhZ3MgPT09IHRoaXMuY29uc3RydWN0b3IuRkxBR1MuTk9ORTtcbn07XG5cbi8qKlxuICogSXMgdGhlIHRyYWNrZWQgZXZlbnQgb3ZlciB0aGUgRGlzcGxheU9iamVjdD9cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1lbWJlciB7Ym9vbGVhbn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzJDEub3Zlci5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiAodGhpcy5fZmxhZ3MgJiB0aGlzLmNvbnN0cnVjdG9yLkZMQUdTLk9WRVIpICE9PSAwO1xufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDEub3Zlci5zZXQgPSBmdW5jdGlvbiAoeW4pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIHRoaXMuX2RvU2V0KHRoaXMuY29uc3RydWN0b3IuRkxBR1MuT1ZFUiwgeW4pO1xufTtcblxuLyoqXG4gKiBEaWQgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBjb21lIGRvd24gaW4gdGhlIERpc3BsYXlPYmplY3Q/XG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQxLnJpZ2h0RG93bi5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiAodGhpcy5fZmxhZ3MgJiB0aGlzLmNvbnN0cnVjdG9yLkZMQUdTLlJJR0hUX0RPV04pICE9PSAwO1xufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDEucmlnaHREb3duLnNldCA9IGZ1bmN0aW9uICh5bikgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgdGhpcy5fZG9TZXQodGhpcy5jb25zdHJ1Y3Rvci5GTEFHUy5SSUdIVF9ET1dOLCB5bik7XG59O1xuXG4vKipcbiAqIERpZCB0aGUgbGVmdCBtb3VzZSBidXR0b24gY29tZSBkb3duIGluIHRoZSBEaXNwbGF5T2JqZWN0P1xuICpcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyIHtib29sZWFufVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5sZWZ0RG93bi5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiAodGhpcy5fZmxhZ3MgJiB0aGlzLmNvbnN0cnVjdG9yLkZMQUdTLkxFRlRfRE9XTikgIT09IDA7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5sZWZ0RG93bi5zZXQgPSBmdW5jdGlvbiAoeW4pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIHRoaXMuX2RvU2V0KHRoaXMuY29uc3RydWN0b3IuRkxBR1MuTEVGVF9ET1dOLCB5bik7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJhY3Rpb25UcmFja2luZ0RhdGEucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMkMSApO1xuXG5JbnRlcmFjdGlvblRyYWNraW5nRGF0YS5GTEFHUyA9IE9iamVjdC5mcmVlemUoe1xuICAgIE5PTkU6IDAsXG4gICAgT1ZFUjogMSA8PCAwLFxuICAgIExFRlRfRE9XTjogMSA8PCAxLFxuICAgIFJJR0hUX0RPV046IDEgPDwgMixcbn0pO1xuXG4vKipcbiAqIFN0cmF0ZWd5IGhvdyB0byBzZWFyY2ggdGhyb3VnaCBzdGFnZSB0cmVlIGZvciBpbnRlcmFjdGl2ZSBvYmplY3RzXG4gKlxuICogQHByaXZhdGVcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkuaW50ZXJhY3Rpb25cbiAqL1xudmFyIFRyZWVTZWFyY2ggPSBmdW5jdGlvbiBUcmVlU2VhcmNoKClcbntcbiAgICB0aGlzLl90ZW1wUG9pbnQgPSBuZXcgUG9pbnQoKTtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIGZvciBmaW5kSGl0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gZXZlbnQgY29udGFpbmluZyB0aGUgcG9pbnQgdGhhdFxuICogIGlzIHRlc3RlZCBmb3IgY29sbGlzaW9uXG4gKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfFBJWEkuU3ByaXRlfFBJWEkuVGlsaW5nU3ByaXRlfSBkaXNwbGF5T2JqZWN0IC0gdGhlIGRpc3BsYXlPYmplY3RcbiAqICB0aGF0IHdpbGwgYmUgaGl0IHRlc3QgKHJlY3Vyc2l2ZWx5IGNyYXdscyBpdHMgY2hpbGRyZW4pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZnVuY10gLSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGludGVyYWN0aXZlIG9iamVjdC4gVGhlXG4gKiAgaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCBhbmQgaGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbaGl0VGVzdF0gLSB0aGlzIGluZGljYXRlcyBpZiB0aGUgb2JqZWN0cyBpbnNpZGUgc2hvdWxkIGJlIGhpdCB0ZXN0IGFnYWluc3QgdGhlIHBvaW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcmFjdGl2ZV0gLSBXaGV0aGVyIHRoZSBkaXNwbGF5T2JqZWN0IGlzIGludGVyYWN0aXZlXG4gKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIGRpc3BsYXlPYmplY3QgaGl0IHRoZSBwb2ludFxuICovXG5UcmVlU2VhcmNoLnByb3RvdHlwZS5yZWN1cnNpdmVGaW5kSGl0ID0gZnVuY3Rpb24gcmVjdXJzaXZlRmluZEhpdCAoaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCwgZnVuYywgaGl0VGVzdCwgaW50ZXJhY3RpdmUpXG57XG4gICAgaWYgKCFkaXNwbGF5T2JqZWN0IHx8ICFkaXNwbGF5T2JqZWN0LnZpc2libGUpXG4gICAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHBvaW50ID0gaW50ZXJhY3Rpb25FdmVudC5kYXRhLmdsb2JhbDtcblxuICAgIC8vIFRvb2sgYSBsaXR0bGUgd2hpbGUgdG8gcmV3b3JrIHRoaXMgZnVuY3Rpb24gY29ycmVjdGx5ISBCdXQgbm93IGl0IGlzIGRvbmUgYW5kIG5pY2UgYW5kIG9wdGltaXplZCEgXl9eXG4gICAgLy9cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbm93IGxvb3AgdGhyb3VnaCBhbGwgb2JqZWN0cyBhbmQgdGhlbiBvbmx5IGhpdCB0ZXN0IHRoZSBvYmplY3RzIGl0IEhBU1xuICAgIC8vIHRvLCBub3QgYWxsIG9mIHRoZW0uIE1VQ0ggZmFzdGVyLi5cbiAgICAvLyBBbiBvYmplY3Qgd2lsbCBiZSBoaXQgdGVzdCBpZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gICAgLy9cbiAgICAvLyAxOiBJdCBpcyBpbnRlcmFjdGl2ZS5cbiAgICAvLyAyOiBJdCBiZWxvbmdzIHRvIGEgcGFyZW50IHRoYXQgaXMgaW50ZXJhY3RpdmUgQU5EIG9uZSBvZiB0aGUgcGFyZW50cyBjaGlsZHJlbiBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gaGl0LlxuICAgIC8vXG4gICAgLy8gQXMgYW5vdGhlciBsaXR0bGUgb3B0aW1pemF0aW9uIG9uY2UgYW4gaW50ZXJhY3RpdmUgb2JqZWN0IGhhcyBiZWVuIGhpdCB3ZSBjYW4gY2Fycnkgb25cbiAgICAvLyB0aHJvdWdoIHRoZSBzY2VuZWdyYXBoLCBidXQgd2Uga25vdyB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBoaXRzISBTbyB3ZSBjYW4gYXZvaWQgZXh0cmEgaGl0IHRlc3RzXG4gICAgLy8gQSBmaW5hbCBvcHRpbWl6YXRpb24gaXMgdGhhdCBhbiBvYmplY3QgaXMgbm90IGhpdCB0ZXN0IGRpcmVjdGx5IGlmIGEgY2hpbGQgaGFzIGFscmVhZHkgYmVlbiBoaXQuXG5cbiAgICBpbnRlcmFjdGl2ZSA9IGRpc3BsYXlPYmplY3QuaW50ZXJhY3RpdmUgfHwgaW50ZXJhY3RpdmU7XG5cbiAgICB2YXIgaGl0ID0gZmFsc2U7XG4gICAgdmFyIGludGVyYWN0aXZlUGFyZW50ID0gaW50ZXJhY3RpdmU7XG5cbiAgICAvLyBGbGFnIGhlcmUgY2FuIHNldCB0byBmYWxzZSBpZiB0aGUgZXZlbnQgaXMgb3V0c2lkZSB0aGUgcGFyZW50cyBoaXRBcmVhIG9yIG1hc2tcbiAgICB2YXIgaGl0VGVzdENoaWxkcmVuID0gdHJ1ZTtcblxuICAgIC8vIElmIHRoZXJlIGlzIGEgaGl0QXJlYSwgbm8gbmVlZCB0byB0ZXN0IGFnYWluc3QgYW55dGhpbmcgZWxzZSBpZiB0aGUgcG9pbnRlciBpcyBub3Qgd2l0aGluIHRoZSBoaXRBcmVhXG4gICAgLy8gVGhlcmUgaXMgYWxzbyBubyBsb25nZXIgYSBuZWVkIHRvIGhpdFRlc3QgY2hpbGRyZW4uXG4gICAgaWYgKGRpc3BsYXlPYmplY3QuaGl0QXJlYSlcbiAgICB7XG4gICAgICAgIGlmIChoaXRUZXN0KVxuICAgICAgICB7XG4gICAgICAgICAgICBkaXNwbGF5T2JqZWN0LndvcmxkVHJhbnNmb3JtLmFwcGx5SW52ZXJzZShwb2ludCwgdGhpcy5fdGVtcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghZGlzcGxheU9iamVjdC5oaXRBcmVhLmNvbnRhaW5zKHRoaXMuX3RlbXBQb2ludC54LCB0aGlzLl90ZW1wUG9pbnQueSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGl0VGVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhpdFRlc3RDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhpdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJhY3RpdmVQYXJlbnQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgaXMgYSBtYXNrLCBubyBuZWVkIHRvIGhpdFRlc3QgYWdhaW5zdCBhbnl0aGluZyBlbHNlIGlmIHRoZSBwb2ludGVyIGlzIG5vdCB3aXRoaW4gdGhlIG1hc2suXG4gICAgLy8gV2Ugc3RpbGwgd2FudCB0byBoaXRUZXN0Q2hpbGRyZW4sIGhvd2V2ZXIsIHRvIGVuc3VyZSBhIG1vdXNlb3V0IGNhbiBzdGlsbCBiZSBnZW5lcmF0ZWQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BpeGlqcy9waXhpLmpzL2lzc3Vlcy81MTM1XG4gICAgZWxzZSBpZiAoZGlzcGxheU9iamVjdC5fbWFzaylcbiAgICB7XG4gICAgICAgIGlmIChoaXRUZXN0KVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIShkaXNwbGF5T2JqZWN0Ll9tYXNrLmNvbnRhaW5zUG9pbnQgJiYgZGlzcGxheU9iamVjdC5fbWFzay5jb250YWluc1BvaW50KHBvaW50KSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGl0VGVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gKiogRlJFRSBUSVAgKiohIElmIGFuIG9iamVjdCBpcyBub3QgaW50ZXJhY3RpdmUgb3IgaGFzIG5vIGJ1dHRvbnMgaW4gaXRcbiAgICAvLyAoc3VjaCBhcyBhIGdhbWUgc2NlbmUhKSBzZXQgaW50ZXJhY3RpdmVDaGlsZHJlbiB0byBmYWxzZSBmb3IgdGhhdCBkaXNwbGF5T2JqZWN0LlxuICAgIC8vIFRoaXMgd2lsbCBhbGxvdyBQaXhpSlMgdG8gY29tcGxldGVseSBpZ25vcmUgYW5kIGJ5cGFzcyBjaGVja2luZyB0aGUgZGlzcGxheU9iamVjdHMgY2hpbGRyZW4uXG4gICAgaWYgKGhpdFRlc3RDaGlsZHJlbiAmJiBkaXNwbGF5T2JqZWN0LmludGVyYWN0aXZlQ2hpbGRyZW4gJiYgZGlzcGxheU9iamVjdC5jaGlsZHJlbilcbiAgICB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGRpc3BsYXlPYmplY3QuY2hpbGRyZW47XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcblxuICAgICAgICAgICAgLy8gdGltZSB0byBnZXQgcmVjdXJzaXZlLi4gaWYgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBpZiBzb21ldGhpbmcgaXMgaGl0Li5cbiAgICAgICAgICAgIHZhciBjaGlsZEhpdCA9IHRoaXMucmVjdXJzaXZlRmluZEhpdChpbnRlcmFjdGlvbkV2ZW50LCBjaGlsZCwgZnVuYywgaGl0VGVzdCwgaW50ZXJhY3RpdmVQYXJlbnQpO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGRIaXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gaXRzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIGlmIGEgY2hpbGQgaGFzIGxvc3QgaXRzIHBhcmVudC5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGl0IGhhcyBiZWVuIHJlbW92ZWQgd2hpbHN0IGxvb3Bpbmcgc28gaXRzIGJlc3RcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLnBhcmVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHdlIG5vIGxvbmdlciBuZWVkIHRvIGhpdCB0ZXN0IGFueSBtb3JlIG9iamVjdHMgaW4gdGhpcyBjb250YWluZXIgYXMgd2Ugd2VcbiAgICAgICAgICAgICAgICAvLyBub3cga25vdyB0aGUgcGFyZW50IGhhcyBiZWVuIGhpdFxuICAgICAgICAgICAgICAgIGludGVyYWN0aXZlUGFyZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQgaXMgaW50ZXJhY3RpdmUgLCB0aGF0IG1lYW5zIHRoYXQgdGhlIG9iamVjdCBoaXQgd2FzIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJhY3RpdmUgYW5kIG5vdCBqdXN0IHRoZSBjaGlsZCBvZiBhbiBpbnRlcmFjdGl2ZSBvYmplY3QuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBubyBsb25nZXIgbmVlZCB0byBoaXQgdGVzdCBhbnl0aGluZyBlbHNlLiBXZSBzdGlsbCBuZWVkIHRvIHJ1blxuICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggYWxsIG9iamVjdHMsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55IGhpdCB0ZXN0cy5cblxuICAgICAgICAgICAgICAgIGlmIChjaGlsZEhpdClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmFjdGlvbkV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0VGVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gcG9pbnQgcnVubmluZyB0aGlzIGlmIHRoZSBpdGVtIGlzIG5vdCBpbnRlcmFjdGl2ZSBvciBkb2VzIG5vdCBoYXZlIGFuIGludGVyYWN0aXZlIHBhcmVudC5cbiAgICBpZiAoaW50ZXJhY3RpdmUpXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgaGl0IHRlc3RpbmcgKGFzIGluIHdlIGhhdmUgbm8gaGl0IGFueSBvYmplY3RzIHlldClcbiAgICAgICAgLy8gV2UgYWxzbyBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGhpdCB0ZXN0aW5nIGlmIG9uY2Ugb2YgdGhlIGRpc3BsYXlPYmplY3RzIGNoaWxkcmVuXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gaGl0IC0gYnV0IG9ubHkgaWYgaXQgd2FzIGludGVyYWN0aXZlLCBvdGhlcndpc2Ugd2UgbmVlZCB0byBrZWVwXG4gICAgICAgIC8vIGxvb2tpbmcgZm9yIGFuIGludGVyYWN0aXZlIGNoaWxkLCBqdXN0IGluIGNhc2Ugd2UgaGl0IG9uZVxuICAgICAgICBpZiAoaGl0VGVzdCAmJiAhaW50ZXJhY3Rpb25FdmVudC50YXJnZXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgdGVzdGVkIGFnYWluc3QgaGl0QXJlYSBpZiBpdCBpcyBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWRpc3BsYXlPYmplY3QuaGl0QXJlYSAmJiBkaXNwbGF5T2JqZWN0LmNvbnRhaW5zUG9pbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlPYmplY3QuY29udGFpbnNQb2ludChwb2ludCkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBoaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXNwbGF5T2JqZWN0LmludGVyYWN0aXZlKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoaGl0ICYmICFpbnRlcmFjdGlvbkV2ZW50LnRhcmdldClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbkV2ZW50LnRhcmdldCA9IGRpc3BsYXlPYmplY3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5jKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZ1bmMoaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCwgISFoaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhpdDtcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlcyBhIG5lYXQgd2F5IG9mIGNyYXdsaW5nIHRocm91Z2ggdGhlIHNjZW5lIGdyYXBoIGFuZCBydW5uaW5nIGFcbiAqIHNwZWNpZmllZCBmdW5jdGlvbiBvbiBhbGwgaW50ZXJhY3RpdmUgb2JqZWN0cyBpdCBmaW5kcy4gSXQgd2lsbCBhbHNvIHRha2UgY2FyZSBvZiBoaXRcbiAqIHRlc3RpbmcgdGhlIGludGVyYWN0aXZlIG9iamVjdHMgYW5kIHBhc3NlcyB0aGUgaGl0IGFjcm9zcyBpbiB0aGUgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gZXZlbnQgY29udGFpbmluZyB0aGUgcG9pbnQgdGhhdFxuICogIGlzIHRlc3RlZCBmb3IgY29sbGlzaW9uXG4gKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfFBJWEkuU3ByaXRlfFBJWEkuVGlsaW5nU3ByaXRlfSBkaXNwbGF5T2JqZWN0IC0gdGhlIGRpc3BsYXlPYmplY3RcbiAqICB0aGF0IHdpbGwgYmUgaGl0IHRlc3QgKHJlY3Vyc2l2ZWx5IGNyYXdscyBpdHMgY2hpbGRyZW4pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZnVuY10gLSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGludGVyYWN0aXZlIG9iamVjdC4gVGhlXG4gKiAgaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCBhbmQgaGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbaGl0VGVzdF0gLSB0aGlzIGluZGljYXRlcyBpZiB0aGUgb2JqZWN0cyBpbnNpZGUgc2hvdWxkIGJlIGhpdCB0ZXN0IGFnYWluc3QgdGhlIHBvaW50XG4gKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm5zIHRydWUgaWYgdGhlIGRpc3BsYXlPYmplY3QgaGl0IHRoZSBwb2ludFxuICovXG5UcmVlU2VhcmNoLnByb3RvdHlwZS5maW5kSGl0ID0gZnVuY3Rpb24gZmluZEhpdCAoaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCwgZnVuYywgaGl0VGVzdClcbntcbiAgICB0aGlzLnJlY3Vyc2l2ZUZpbmRIaXQoaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdCwgZnVuYywgaGl0VGVzdCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgYSBoaXQgYXJlYS5cbiAqXG4gKiBJdCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZm9sbG93aW5nIGNsYXNzZXM6XG4gKiAtIHtAbGluayBQSVhJLkNpcmNsZX1cbiAqIC0ge0BsaW5rIFBJWEkuRWxsaXBzZX1cbiAqIC0ge0BsaW5rIFBJWEkuUG9seWdvbn1cbiAqIC0ge0BsaW5rIFBJWEkuUm91bmRlZFJlY3RhbmdsZX1cbiAqXG4gKiBAaW50ZXJmYWNlIElIaXRBcmVhXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgZ2l2ZW4gYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcmVhXG4gKlxuICogQG1ldGhvZFxuICogQG5hbWUgY29udGFpbnNcbiAqIEBtZW1iZXJvZiBQSVhJLklIaXRBcmVhI1xuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byB0ZXN0XG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIHRlc3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHgveSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoaXMgYXJlYVxuICovXG5cbi8qKlxuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMgb2YgaW50ZXJhY3RpdmUgb2JqZWN0c1xuICogVXNlZCBieSB7QGxpbmsgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXJ9IHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSBhbGwgRGlzcGxheU9iamVjdHMgdGhlc2UgcHJvcGVydGllc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBpbnRlcmFjdGl2ZVRhcmdldFxuICogQHR5cGUge09iamVjdH1cbiAqIEBtZW1iZXJvZiBQSVhJLmludGVyYWN0aW9uXG4gKiBAZXhhbXBsZVxuICogICAgICBmdW5jdGlvbiBNeU9iamVjdCgpIHt9XG4gKlxuICogICAgICBPYmplY3QuYXNzaWduKFxuICogICAgICAgICAgRGlzcGxheU9iamVjdC5wcm90b3R5cGUsXG4gKiAgICAgICAgICBQSVhJLmludGVyYWN0aW9uLmludGVyYWN0aXZlVGFyZ2V0XG4gKiAgICAgICk7XG4gKi9cbnZhciBpbnRlcmFjdGl2ZVRhcmdldCA9IHtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBpbnRlcmFjdGlvbiBldmVudHMgZm9yIHRoZSBEaXNwbGF5T2JqZWN0LiBUb3VjaCwgcG9pbnRlciBhbmQgbW91c2VcbiAgICAgKiBldmVudHMgd2lsbCBub3QgYmUgZW1pdHRlZCB1bmxlc3MgYGludGVyYWN0aXZlYCBpcyBzZXQgdG8gYHRydWVgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzcHJpdGUgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XG4gICAgICogc3ByaXRlLmludGVyYWN0aXZlID0gdHJ1ZTtcbiAgICAgKiBzcHJpdGUub24oJ3RhcCcsIChldmVudCkgPT4ge1xuICAgICAqICAgIC8vaGFuZGxlIGV2ZW50XG4gICAgICogfSk7XG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICAgICAqL1xuICAgIGludGVyYWN0aXZlOiBmYWxzZSxcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGNoaWxkcmVuIHRvIHRoZSBkaXNwbGF5T2JqZWN0IGNhbiBiZSBjbGlja2VkL3RvdWNoZWRcbiAgICAgKiBTZXR0aW5nIHRoaXMgdG8gZmFsc2UgYWxsb3dzIFBpeGlKUyB0byBieXBhc3MgYSByZWN1cnNpdmUgYGhpdFRlc3RgIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkNvbnRhaW5lciNcbiAgICAgKi9cbiAgICBpbnRlcmFjdGl2ZUNoaWxkcmVuOiB0cnVlLFxuXG4gICAgLyoqXG4gICAgICogSW50ZXJhY3Rpb24gc2hhcGUuIENoaWxkcmVuIHdpbGwgYmUgaGl0IGZpcnN0LCB0aGVuIHRoaXMgc2hhcGUgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqIFNldHRpbmcgdGhpcyB3aWxsIGNhdXNlIHRoaXMgc2hhcGUgdG8gYmUgY2hlY2tlZCBpbiBoaXQgdGVzdHMgcmF0aGVyIHRoYW4gdGhlIGRpc3BsYXlPYmplY3QncyBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNwcml0ZSA9IG5ldyBQSVhJLlNwcml0ZSh0ZXh0dXJlKTtcbiAgICAgKiBzcHJpdGUuaW50ZXJhY3RpdmUgPSB0cnVlO1xuICAgICAqIHNwcml0ZS5oaXRBcmVhID0gbmV3IFBJWEkuUmVjdGFuZ2xlKDAsIDAsIDEwMCwgMTAwKTtcbiAgICAgKiBAbWVtYmVyIHtQSVhJLklIaXRBcmVhfVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICovXG4gICAgaGl0QXJlYTogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIElmIGVuYWJsZWQsIHRoZSBtb3VzZSBjdXJzb3IgdXNlIHRoZSBwb2ludGVyIGJlaGF2aW9yIHdoZW4gaG92ZXJlZCBvdmVyIHRoZSBkaXNwbGF5T2JqZWN0IGlmIGl0IGlzIGludGVyYWN0aXZlXG4gICAgICogU2V0dGluZyB0aGlzIGNoYW5nZXMgdGhlICdjdXJzb3InIHByb3BlcnR5IHRvIGAncG9pbnRlcidgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzcHJpdGUgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XG4gICAgICogc3ByaXRlLmludGVyYWN0aXZlID0gdHJ1ZTtcbiAgICAgKiBzcHJpdGUuYnV0dG9uTW9kZSA9IHRydWU7XG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICAgICAqL1xuICAgIGdldCBidXR0b25Nb2RlKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnNvciA9PT0gJ3BvaW50ZXInO1xuICAgIH0sXG4gICAgc2V0IGJ1dHRvbk1vZGUodmFsdWUpXG4gICAge1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY3Vyc29yID09PSAncG9pbnRlcicpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGRlZmluZXMgd2hhdCBjdXJzb3IgbW9kZSBpcyB1c2VkIHdoZW4gdGhlIG1vdXNlIGN1cnNvclxuICAgICAqIGlzIGhvdmVyZWQgb3ZlciB0aGUgZGlzcGxheU9iamVjdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc3ByaXRlID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xuICAgICAqIHNwcml0ZS5pbnRlcmFjdGl2ZSA9IHRydWU7XG4gICAgICogc3ByaXRlLmN1cnNvciA9ICd3YWl0JztcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0NTUy9jdXJzb3JcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICAgICAqL1xuICAgIGN1cnNvcjogbnVsbCxcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHNldCBvZiBhbGwgYWN0aXZlIHBvaW50ZXJzLCBieSBpZGVudGlmaWVyXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtNYXA8bnVtYmVyLCBJbnRlcmFjdGlvblRyYWNraW5nRGF0YT59XG4gICAgICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCB0cmFja2VkUG9pbnRlcnMoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrZWRQb2ludGVycyA9PT0gdW5kZWZpbmVkKSB7IHRoaXMuX3RyYWNrZWRQb2ludGVycyA9IHt9OyB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrZWRQb2ludGVycztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTWFwIG9mIGFsbCB0cmFja2VkIHBvaW50ZXJzLCBieSBpZGVudGlmaWVyLiBVc2UgdHJhY2tlZFBvaW50ZXJzIHRvIGFjY2Vzcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUge01hcDxudW1iZXIsIEludGVyYWN0aW9uVHJhY2tpbmdEYXRhPn1cbiAgICAgKi9cbiAgICBfdHJhY2tlZFBvaW50ZXJzOiB1bmRlZmluZWQsXG59O1xuXG4vLyBNaXggaW50ZXJhY3RpdmVUYXJnZXQgaW50byBEaXNwbGF5T2JqZWN0LnByb3RvdHlwZSxcbi8vIGFmdGVyIGRlcHJlY2F0aW9uIGhhcyBiZWVuIGhhbmRsZWRcbkRpc3BsYXlPYmplY3QubWl4aW4oaW50ZXJhY3RpdmVUYXJnZXQpO1xuXG52YXIgTU9VU0VfUE9JTlRFUl9JRCA9IDE7XG5cbi8vIGhlbHBlcnMgZm9yIGhpdFRlc3QoKSAtIG9ubHkgdXNlZCBpbnNpZGUgaGl0VGVzdCgpXG52YXIgaGl0VGVzdEV2ZW50ID0ge1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdsb2JhbDogbnVsbCxcbiAgICB9LFxufTtcblxuLyoqXG4gKiBUaGUgaW50ZXJhY3Rpb24gbWFuYWdlciBkZWFscyB3aXRoIG1vdXNlLCB0b3VjaCBhbmQgcG9pbnRlciBldmVudHMuXG4gKlxuICogQW55IERpc3BsYXlPYmplY3QgY2FuIGJlIGludGVyYWN0aXZlIGlmIGl0cyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLlxuICpcbiAqIFRoaXMgbWFuYWdlciBhbHNvIHN1cHBvcnRzIG11bHRpdG91Y2guXG4gKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgZGVmYXVsdCwgYW5kIGNhbiBiZSBmb3VuZCBhdCBgcmVuZGVyZXIucGx1Z2lucy5pbnRlcmFjdGlvbmBcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkudXRpbHMuRXZlbnRFbWl0dGVyXG4gKiBAbWVtYmVyb2YgUElYSS5pbnRlcmFjdGlvblxuICovXG52YXIgSW50ZXJhY3Rpb25NYW5hZ2VyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRXZlbnRFbWl0dGVyKSB7XG4gICAgZnVuY3Rpb24gSW50ZXJhY3Rpb25NYW5hZ2VyKHJlbmRlcmVyLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSByZW5kZXJlciB0aGlzIGludGVyYWN0aW9uIG1hbmFnZXIgd29ya3MgZm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkFic3RyYWN0UmVuZGVyZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBkZWZhdWx0IGJyb3dzZXIgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGJlIHByZXZlbnRlZC5cbiAgICAgICAgICogRG9lcyBub3QgYXBwbHkgdG8gcG9pbnRlciBldmVudHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICAgICAqIHByZXZlbnREZWZhdWx0IG9uIHBvaW50ZXIgZXZlbnRzIHN0b3BzIG1vdXNlIGV2ZW50cyBmcm9tIGZpcmluZ1xuICAgICAgICAgKiBUaHVzLCBmb3IgZXZlcnkgcG9pbnRlciBldmVudCwgdGhlcmUgd2lsbCBhbHdheXMgYmUgZWl0aGVyIGEgbW91c2Ugb2YgdG91Y2ggZXZlbnQgYWxvbmdzaWRlIGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dG9QcmV2ZW50RGVmYXVsdCA9IG9wdGlvbnMuYXV0b1ByZXZlbnREZWZhdWx0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmF1dG9QcmV2ZW50RGVmYXVsdCA6IHRydWU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1heGltdW0gcmVxdWVuY3kgaW4gbWlsbGlzZWNvbmRzIGF0IHdoaWNoIHBvaW50ZXIgb3Zlci9vdXQgc3RhdGVzIHdpbGwgYmUgY2hlY2tlZCBieSB7QGxpbmsgdGlja2VyVXBkYXRlfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkZyZXF1ZW5jeSA9IG9wdGlvbnMuaW50ZXJhY3Rpb25GcmVxdWVuY3kgfHwgMTA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtb3VzZSBkYXRhXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25EYXRhfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb3VzZSA9IG5ldyBJbnRlcmFjdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5tb3VzZS5pZGVudGlmaWVyID0gTU9VU0VfUE9JTlRFUl9JRDtcblxuICAgICAgICAvLyBzZXR0aW5nIHRoZSBtb3VzZSB0byBzdGFydCBvZmYgZmFyIG9mZiBzY3JlZW4gd2lsbCBtZWFuIHRoYXQgbW91c2Ugb3ZlciBkb2VzXG4gICAgICAgIC8vICBub3QgZ2V0IGNhbGxlZCBiZWZvcmUgd2UgZXZlbiBtb3ZlIHRoZSBtb3VzZS5cbiAgICAgICAgdGhpcy5tb3VzZS5nbG9iYWwuc2V0KC05OTk5OTkpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBY3RpdmVseSB0cmFja2VkIEludGVyYWN0aW9uRGF0YVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3QuPG51bWJlcixQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRGF0YT59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGl2ZUludGVyYWN0aW9uRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmFjdGl2ZUludGVyYWN0aW9uRGF0YVtNT1VTRV9QT0lOVEVSX0lEXSA9IHRoaXMubW91c2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBvb2wgb2YgdW51c2VkIEludGVyYWN0aW9uRGF0YVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRGF0YVtdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRhdGFQb29sID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGV2ZW50IGRhdGEgb2JqZWN0IHRvIGhhbmRsZSBhbGwgdGhlIGV2ZW50IHRyYWNraW5nL2Rpc3BhdGNoaW5nXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXZlbnREYXRhID0gbmV3IEludGVyYWN0aW9uRXZlbnQoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIERPTSBlbGVtZW50IHRvIGJpbmQgdG8uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyBpZiBtb3VzZW1vdmUgYW5kIHRvdWNobW92ZSBldmVudHMgYXJlIGZpcmVkIG9ubHkgd2hlbiB0aGUgY3Vyc29yXG4gICAgICAgICAqIGlzIG92ZXIgdGhlIG9iamVjdC5cbiAgICAgICAgICogU2V0dGluZyB0byB0cnVlIHdpbGwgbWFrZSB0aGluZ3Mgd29yayBtb3JlIGluIGxpbmUgd2l0aCBob3cgdGhlIERPTSB2ZXJzaW9uIHdvcmtzLlxuICAgICAgICAgKiBTZXR0aW5nIHRvIGZhbHNlIGNhbiBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIHRoaW5ncyBsaWtlIGRyYWdnaW5nXG4gICAgICAgICAqIEl0IGlzIGN1cnJlbnRseSBzZXQgdG8gZmFsc2UgYXMgdGhpcyBpcyBob3cgUGl4aUpTIHVzZWQgdG8gd29yay4gVGhpcyB3aWxsIGJlIHNldCB0byB0cnVlIGluXG4gICAgICAgICAqIGZ1dHVyZSB2ZXJzaW9ucyBvZiBwaXhpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb3ZlV2hlbkluc2lkZSA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXZlIGV2ZW50cyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBkb20gZWxlbWVudD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldmVudHNBZGRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXMgdGhlIHN5c3RlbSB0aWNrZXIgYmVlbiBhZGRlZD9cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aWNrZXJBZGRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGUgbW91c2UgaG92ZXJpbmcgb3ZlciB0aGUgcmVuZGVyZXI/XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubW91c2VPdmVyUmVuZGVyZXIgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRG9lcyB0aGUgZGV2aWNlIHN1cHBvcnQgdG91Y2ggZXZlbnRzXG4gICAgICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdXBwb3J0c1RvdWNoRXZlbnRzID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEb2VzIHRoZSBkZXZpY2Ugc3VwcG9ydCBwb2ludGVyIGV2ZW50c1xuICAgICAgICAgKiBodHRwczovL3d3dy53My5vcmcvU3VibWlzc2lvbi9wb2ludGVyLWV2ZW50cy9cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1cHBvcnRzUG9pbnRlckV2ZW50cyA9ICEhd2luZG93LlBvaW50ZXJFdmVudDtcblxuICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSBpdCBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGNhbGwgYmluZCBhbGwgdGhlIHRpbWVcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uUG9pbnRlclVwID0gdGhpcy5vblBvaW50ZXJVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyVXAgPSB0aGlzLnByb2Nlc3NQb2ludGVyVXAuYmluZCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uUG9pbnRlckNhbmNlbCA9IHRoaXMub25Qb2ludGVyQ2FuY2VsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJDYW5jZWwgPSB0aGlzLnByb2Nlc3NQb2ludGVyQ2FuY2VsLmJpbmQodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge0Z1bmN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vblBvaW50ZXJEb3duID0gdGhpcy5vblBvaW50ZXJEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJEb3duID0gdGhpcy5wcm9jZXNzUG9pbnRlckRvd24uYmluZCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uUG9pbnRlck1vdmUgPSB0aGlzLm9uUG9pbnRlck1vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUG9pbnRlck1vdmUgPSB0aGlzLnByb2Nlc3NQb2ludGVyTW92ZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25Qb2ludGVyT3V0ID0gdGhpcy5vblBvaW50ZXJPdXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUG9pbnRlck92ZXJPdXQgPSB0aGlzLnByb2Nlc3NQb2ludGVyT3Zlck91dC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25Qb2ludGVyT3ZlciA9IHRoaXMub25Qb2ludGVyT3Zlci5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaWN0aW9uYXJ5IG9mIGhvdyBkaWZmZXJlbnQgY3Vyc29yIG1vZGVzIGFyZSBoYW5kbGVkLiBTdHJpbmdzIGFyZSBoYW5kbGVkIGFzIENTUyBjdXJzb3JcbiAgICAgICAgICogdmFsdWVzLCBvYmplY3RzIGFyZSBoYW5kbGVkIGFzIGRpY3Rpb25hcmllcyBvZiBDU1MgdmFsdWVzIGZvciBpbnRlcmFjdGlvbkRPTUVsZW1lbnQsXG4gICAgICAgICAqIGFuZCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZSBDU1MuXG4gICAgICAgICAqIERlZmF1bHQgQ1NTIGN1cnNvciB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciAnZGVmYXVsdCcgYW5kICdwb2ludGVyJyBtb2Rlcy5cbiAgICAgICAgICogQG1lbWJlciB7T2JqZWN0LjxzdHJpbmcsIE9iamVjdD59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnNvclN0eWxlcyA9IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdpbmhlcml0JyxcbiAgICAgICAgICAgIHBvaW50ZXI6ICdwb2ludGVyJyxcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1vZGUgb2YgdGhlIGN1cnNvciB0aGF0IGlzIGJlaW5nIHVzZWQuXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGlzIGEga2V5IGZyb20gdGhlIGN1cnNvclN0eWxlcyBkaWN0aW9uYXJ5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnJlbnRDdXJzb3JNb2RlID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgY2FjaGVkIGxldC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdXJzb3IgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY3VycmVudCByZXNvbHV0aW9uIC8gZGV2aWNlIHBpeGVsIHJhdGlvLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IDE7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGF5ZWQgcG9pbnRlciBldmVudHMuIFVzZWQgdG8gZ3VhcmFudGVlIGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3Zlci9vdXQgZXZlbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsYXllZEV2ZW50cyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmVlU2VhcmNoIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgdG8gaGl0VGVzdCBzdGFnZSB0cmVlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuaW50ZXJhY3Rpb24uVHJlZVNlYXJjaH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VhcmNoID0gbmV3IFRyZWVTZWFyY2goKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGJ1dHRvbiAodXN1YWxseSBhIG1vdXNlIGxlZnQtYnV0dG9uKSBpcyBwcmVzc2VkIG9uIHRoZSBkaXNwbGF5XG4gICAgICAgICAqIG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI21vdXNlZG93blxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHByZXNzZWRcbiAgICAgICAgICogb24gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcmlnaHRkb3duXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uICh1c3VhbGx5IGEgbW91c2UgbGVmdC1idXR0b24pIGlzIHJlbGVhc2VkIG92ZXIgdGhlIGRpc3BsYXlcbiAgICAgICAgICogb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjbW91c2V1cFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHJlbGVhc2VkXG4gICAgICAgICAqIG92ZXIgdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcmlnaHR1cFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGJ1dHRvbiAodXN1YWxseSBhIG1vdXNlIGxlZnQtYnV0dG9uKSBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCBvblxuICAgICAgICAgKiB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNjbGlja1xuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHByZXNzZWRcbiAgICAgICAgICogYW5kIHJlbGVhc2VkIG9uIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI3JpZ2h0Y2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSBsZWZ0LWJ1dHRvbikgaXMgcmVsZWFzZWQgb3V0c2lkZSB0aGVcbiAgICAgICAgICogZGlzcGxheSBvYmplY3QgdGhhdCBpbml0aWFsbHkgcmVnaXN0ZXJlZCBhXG4gICAgICAgICAqIFttb3VzZWRvd25de0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI2V2ZW50Om1vdXNlZG93bn0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNtb3VzZXVwb3V0c2lkZVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHJlbGVhc2VkXG4gICAgICAgICAqIG91dHNpZGUgdGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgaW5pdGlhbGx5IHJlZ2lzdGVyZWQgYVxuICAgICAgICAgKiBbcmlnaHRkb3duXXtAbGluayBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNldmVudDpyaWdodGRvd259LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcmlnaHR1cG91dHNpZGVcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBtb3ZlZCB3aGlsZSBvdmVyIHRoZSBkaXNwbGF5IG9iamVjdFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjbW91c2Vtb3ZlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgb250byB0aGUgZGlzcGxheSBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI21vdXNlb3ZlclxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIG9mZiB0aGUgZGlzcGxheSBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI21vdXNlb3V0XG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uIGlzIHByZXNzZWQgb24gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcG9pbnRlcmRvd25cbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSBidXR0b24gaXMgcmVsZWFzZWQgb3ZlciB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIE5vdCBhbHdheXMgZmlyZWQgd2hlbiBzb21lIGJ1dHRvbnMgYXJlIGhlbGQgZG93biB3aGlsZSBvdGhlcnMgYXJlIHJlbGVhc2VkLiBJbiB0aG9zZSBjYXNlcyxcbiAgICAgICAgICogdXNlIFttb3VzZWRvd25de0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI2V2ZW50Om1vdXNlZG93bn0gYW5kXG4gICAgICAgICAqIFttb3VzZXVwXXtAbGluayBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNldmVudDptb3VzZXVwfSBpbnN0ZWFkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcG9pbnRlcnVwXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGNhbmNlbHMgYSBwb2ludGVyIGV2ZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNwb2ludGVyY2FuY2VsXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIG9uIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI3BvaW50ZXJ0YXBcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSBidXR0b24gaXMgcmVsZWFzZWQgb3V0c2lkZSB0aGUgZGlzcGxheSBvYmplY3QgdGhhdCBpbml0aWFsbHlcbiAgICAgICAgICogcmVnaXN0ZXJlZCBhIFtwb2ludGVyZG93bl17QGxpbmsgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjZXZlbnQ6cG9pbnRlcmRvd259LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjcG9pbnRlcnVwb3V0c2lkZVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGlzIG1vdmVkIHdoaWxlIG92ZXIgdGhlIGRpc3BsYXkgb2JqZWN0XG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNwb2ludGVybW92ZVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGlzIG1vdmVkIG9udG8gdGhlIGRpc3BsYXkgb2JqZWN0XG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciNwb2ludGVyb3ZlclxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGlzIG1vdmVkIG9mZiB0aGUgZGlzcGxheSBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI3BvaW50ZXJvdXRcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSB0b3VjaCBwb2ludCBpcyBwbGFjZWQgb24gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjdG91Y2hzdGFydFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHRvdWNoIHBvaW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlciN0b3VjaGVuZFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBjYW5jZWxzIGEgdG91Y2hcbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI3RvdWNoY2FuY2VsXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgcGxhY2VkIGFuZCByZW1vdmVkIGZyb20gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjdGFwXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgcmVtb3ZlZCBvdXRzaWRlIG9mIHRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IGluaXRpYWxseVxuICAgICAgICAgKiByZWdpc3RlcmVkIGEgW3RvdWNoc3RhcnRde0BsaW5rIFBJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25NYW5hZ2VyI2V2ZW50OnRvdWNoc3RhcnR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjdG91Y2hlbmRvdXRzaWRlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgbW92ZWQgYWxvbmcgdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbk1hbmFnZXIjdG91Y2htb3ZlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uICh1c3VhbGx5IGEgbW91c2UgbGVmdC1idXR0b24pIGlzIHByZXNzZWQgb24gdGhlIGRpc3BsYXkuXG4gICAgICAgICAqIG9iamVjdC4gRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjbW91c2Vkb3duXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2Ugc2Vjb25kYXJ5IGJ1dHRvbiAodXN1YWxseSBhIG1vdXNlIHJpZ2h0LWJ1dHRvbikgaXMgcHJlc3NlZFxuICAgICAgICAgKiBvbiB0aGUgZGlzcGxheSBvYmplY3QuIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3JpZ2h0ZG93blxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGJ1dHRvbiAodXN1YWxseSBhIG1vdXNlIGxlZnQtYnV0dG9uKSBpcyByZWxlYXNlZCBvdmVyIHRoZSBkaXNwbGF5XG4gICAgICAgICAqIG9iamVjdC4gRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjbW91c2V1cFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHJlbGVhc2VkXG4gICAgICAgICAqIG92ZXIgdGhlIGRpc3BsYXkgb2JqZWN0LiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNyaWdodHVwXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uICh1c3VhbGx5IGEgbW91c2UgbGVmdC1idXR0b24pIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIG9uXG4gICAgICAgICAqIHRoZSBkaXNwbGF5IG9iamVjdC4gRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjY2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSBzZWNvbmRhcnkgYnV0dG9uICh1c3VhbGx5IGEgbW91c2UgcmlnaHQtYnV0dG9uKSBpcyBwcmVzc2VkXG4gICAgICAgICAqIGFuZCByZWxlYXNlZCBvbiB0aGUgZGlzcGxheSBvYmplY3QuIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3JpZ2h0Y2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSBsZWZ0LWJ1dHRvbikgaXMgcmVsZWFzZWQgb3V0c2lkZSB0aGVcbiAgICAgICAgICogZGlzcGxheSBvYmplY3QgdGhhdCBpbml0aWFsbHkgcmVnaXN0ZXJlZCBhXG4gICAgICAgICAqIFttb3VzZWRvd25de0BsaW5rIFBJWEkuRGlzcGxheU9iamVjdCNldmVudDptb3VzZWRvd259LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNtb3VzZXVwb3V0c2lkZVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIHNlY29uZGFyeSBidXR0b24gKHVzdWFsbHkgYSBtb3VzZSByaWdodC1idXR0b24pIGlzIHJlbGVhc2VkXG4gICAgICAgICAqIG91dHNpZGUgdGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgaW5pdGlhbGx5IHJlZ2lzdGVyZWQgYVxuICAgICAgICAgKiBbcmlnaHRkb3duXXtAbGluayBQSVhJLkRpc3BsYXlPYmplY3QjZXZlbnQ6cmlnaHRkb3dufS5cbiAgICAgICAgICogRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjcmlnaHR1cG91dHNpZGVcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGVyIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBtb3ZlZCB3aGlsZSBvdmVyIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICogRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjbW91c2Vtb3ZlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgb250byB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I21vdXNlb3ZlclxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIG9mZiB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I21vdXNlb3V0XG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uIGlzIHByZXNzZWQgb24gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNwb2ludGVyZG93blxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGJ1dHRvbiBpcyByZWxlYXNlZCBvdmVyIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICogRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjcG9pbnRlcnVwXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGNhbmNlbHMgYSBwb2ludGVyIGV2ZW50LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNwb2ludGVyY2FuY2VsXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgYnV0dG9uIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIG9uIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICogRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjcG9pbnRlcnRhcFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHBvaW50ZXIgZGV2aWNlIGJ1dHRvbiBpcyByZWxlYXNlZCBvdXRzaWRlIHRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IGluaXRpYWxseVxuICAgICAgICAgKiByZWdpc3RlcmVkIGEgW3BvaW50ZXJkb3duXXtAbGluayBQSVhJLkRpc3BsYXlPYmplY3QjZXZlbnQ6cG9pbnRlcmRvd259LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCNwb2ludGVydXBvdXRzaWRlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgaXMgbW92ZWQgd2hpbGUgb3ZlciB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3BvaW50ZXJtb3ZlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgaXMgbW92ZWQgb250byB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3BvaW50ZXJvdmVyXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRlciBkZXZpY2UgaXMgbW92ZWQgb2ZmIHRoZSBkaXNwbGF5IG9iamVjdC5cbiAgICAgICAgICogRGlzcGxheU9iamVjdCdzIGBpbnRlcmFjdGl2ZWAgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gYHRydWVgIHRvIGZpcmUgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBQSVhJLkRpc3BsYXlPYmplY3QjcG9pbnRlcm91dFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIHRvdWNoIHBvaW50IGlzIHBsYWNlZCBvbiB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3RvdWNoc3RhcnRcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSB0b3VjaCBwb2ludCBpcyByZW1vdmVkIGZyb20gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCN0b3VjaGVuZFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBjYW5jZWxzIGEgdG91Y2guXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3RvdWNoY2FuY2VsXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBldmVudCAtIEludGVyYWN0aW9uIGV2ZW50XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgcGxhY2VkIGFuZCByZW1vdmVkIGZyb20gdGhlIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCN0YXBcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSB0b3VjaCBwb2ludCBpcyByZW1vdmVkIG91dHNpZGUgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgaW5pdGlhbGx5XG4gICAgICAgICAqIHJlZ2lzdGVyZWQgYSBbdG91Y2hzdGFydF17QGxpbmsgUElYSS5EaXNwbGF5T2JqZWN0I2V2ZW50OnRvdWNoc3RhcnR9LlxuICAgICAgICAgKiBEaXNwbGF5T2JqZWN0J3MgYGludGVyYWN0aXZlYCBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgdG8gZmlyZSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuRGlzcGxheU9iamVjdCN0b3VjaGVuZG91dHNpZGVcbiAgICAgICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGV2ZW50IC0gSW50ZXJhY3Rpb24gZXZlbnRcbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gYSB0b3VjaCBwb2ludCBpcyBtb3ZlZCBhbG9uZyB0aGUgZGlzcGxheSBvYmplY3QuXG4gICAgICAgICAqIERpc3BsYXlPYmplY3QncyBgaW50ZXJhY3RpdmVgIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGB0cnVlYCB0byBmaXJlIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5EaXNwbGF5T2JqZWN0I3RvdWNobW92ZVxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gZXZlbnQgLSBJbnRlcmFjdGlvbiBldmVudFxuICAgICAgICAgKi9cblxuICAgICAgICB0aGlzLl91c2VTeXN0ZW1UaWNrZXIgPSBvcHRpb25zLnVzZVN5c3RlbVRpY2tlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy51c2VTeXN0ZW1UaWNrZXIgOiB0cnVlO1xuXG4gICAgICAgIHRoaXMuc2V0VGFyZ2V0RWxlbWVudCh0aGlzLnJlbmRlcmVyLnZpZXcsIHRoaXMucmVuZGVyZXIucmVzb2x1dGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCBFdmVudEVtaXR0ZXIgKSBJbnRlcmFjdGlvbk1hbmFnZXIuX19wcm90b19fID0gRXZlbnRFbWl0dGVyO1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdmVudEVtaXR0ZXIgJiYgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSApO1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRlcmFjdGlvbk1hbmFnZXI7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyB1c2VTeXN0ZW1UaWNrZXI6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCB0aGUgSW50ZXJhY3Rpb25NYW5hZ2VyIGF1dG9tYXRpY2FsbHkgYWRkIHtAbGluayB0aWNrZXJVcGRhdGV9IHRvIHtAbGluayBQSVhJLlRpY2tlci5zeXN0ZW19LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnVzZVN5c3RlbVRpY2tlci5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVN5c3RlbVRpY2tlcjtcbiAgICB9O1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy51c2VTeXN0ZW1UaWNrZXIuc2V0ID0gZnVuY3Rpb24gKHVzZVN5c3RlbVRpY2tlcilcbiAgICB7XG4gICAgICAgIHRoaXMuX3VzZVN5c3RlbVRpY2tlciA9IHVzZVN5c3RlbVRpY2tlcjtcblxuICAgICAgICBpZiAodXNlU3lzdGVtVGlja2VyKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmFkZFRpY2tlckxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpY2tlckxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGl0IHRlc3RzIGEgcG9pbnQgYWdhaW5zdCB0aGUgZGlzcGxheSB0cmVlLCByZXR1cm5pbmcgdGhlIGZpcnN0IGludGVyYWN0aXZlIG9iamVjdCB0aGF0IGlzIGhpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gZ2xvYmFsUG9pbnQgLSBBIHBvaW50IHRvIGhpdCB0ZXN0IHdpdGgsIGluIGdsb2JhbCBzcGFjZS5cbiAgICAgKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfSBbcm9vdF0gLSBUaGUgcm9vdCBkaXNwbGF5IG9iamVjdCB0byBzdGFydCBmcm9tLiBJZiBvbWl0dGVkLCBkZWZhdWx0c1xuICAgICAqIHRvIHRoZSBsYXN0IHJlbmRlcmVkIHJvb3Qgb2YgdGhlIGFzc29jaWF0ZWQgcmVuZGVyZXIuXG4gICAgICogQHJldHVybiB7UElYSS5EaXNwbGF5T2JqZWN0fSBUaGUgaGl0IGRpc3BsYXkgb2JqZWN0LCBpZiBhbnkuXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5oaXRUZXN0ID0gZnVuY3Rpb24gaGl0VGVzdCAoZ2xvYmFsUG9pbnQsIHJvb3QpXG4gICAge1xuICAgICAgICAvLyBjbGVhciB0aGUgdGFyZ2V0IGZvciBvdXIgaGl0IHRlc3RcbiAgICAgICAgaGl0VGVzdEV2ZW50LnRhcmdldCA9IG51bGw7XG4gICAgICAgIC8vIGFzc2lnbiB0aGUgZ2xvYmFsIHBvaW50XG4gICAgICAgIGhpdFRlc3RFdmVudC5kYXRhLmdsb2JhbCA9IGdsb2JhbFBvaW50O1xuICAgICAgICAvLyBlbnN1cmUgc2FmZXR5IG9mIHRoZSByb290XG4gICAgICAgIGlmICghcm9vdClcbiAgICAgICAge1xuICAgICAgICAgICAgcm9vdCA9IHRoaXMucmVuZGVyZXIuX2xhc3RPYmplY3RSZW5kZXJlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBydW4gdGhlIGhpdCB0ZXN0XG4gICAgICAgIHRoaXMucHJvY2Vzc0ludGVyYWN0aXZlKGhpdFRlc3RFdmVudCwgcm9vdCwgbnVsbCwgdHJ1ZSk7XG4gICAgICAgIC8vIHJldHVybiBvdXIgZm91bmQgb2JqZWN0IC0gaXQnbGwgYmUgbnVsbCBpZiB3ZSBkaWRuJ3QgaGl0IGFueXRoaW5nXG5cbiAgICAgICAgcmV0dXJuIGhpdFRlc3RFdmVudC50YXJnZXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIERPTSBlbGVtZW50IHdoaWNoIHdpbGwgcmVjZWl2ZSBtb3VzZS90b3VjaCBldmVudHMuIFRoaXMgaXMgdXNlZnVsIGZvciB3aGVuIHlvdSBoYXZlXG4gICAgICogb3RoZXIgRE9NIGVsZW1lbnRzIG9uIHRvcCBvZiB0aGUgcmVuZGVyZXJzIENhbnZhcyBlbGVtZW50LiBXaXRoIHRoaXMgeW91J2xsIGJlIGJhbGUgdG8gZGVsZWdhdGVcbiAgICAgKiBhbm90aGVyIERPTSBlbGVtZW50IHRvIHJlY2VpdmUgdGhvc2UgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIHRoZSBET00gZWxlbWVudCB3aGljaCB3aWxsIHJlY2VpdmUgbW91c2UgYW5kIHRvdWNoIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb249MV0gLSBUaGUgcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiB0aGUgbmV3IGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSBjYW52YXMpLlxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2V0VGFyZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIHNldFRhcmdldEVsZW1lbnQgKGVsZW1lbnQsIHJlc29sdXRpb24pXG4gICAge1xuICAgICAgICBpZiAoIHJlc29sdXRpb24gPT09IHZvaWQgMCApIHJlc29sdXRpb24gPSAxO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlVGlja2VyTGlzdGVuZXIoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50cygpO1xuXG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuXG4gICAgICAgIHRoaXMuYWRkRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5hZGRUaWNrZXJMaXN0ZW5lcigpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHRpY2tlciBsaXN0ZW5lclxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLmFkZFRpY2tlckxpc3RlbmVyID0gZnVuY3Rpb24gYWRkVGlja2VyTGlzdGVuZXIgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnRpY2tlckFkZGVkIHx8ICF0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudCB8fCAhdGhpcy5fdXNlU3lzdGVtVGlja2VyKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBUaWNrZXIuc3lzdGVtLmFkZCh0aGlzLnRpY2tlclVwZGF0ZSwgdGhpcywgVVBEQVRFX1BSSU9SSVRZLklOVEVSQUNUSU9OKTtcblxuICAgICAgICB0aGlzLnRpY2tlckFkZGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSB0aWNrZXIgbGlzdGVuZXJcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmVUaWNrZXJMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZVRpY2tlckxpc3RlbmVyICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMudGlja2VyQWRkZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFRpY2tlci5zeXN0ZW0ucmVtb3ZlKHRoaXMudGlja2VyVXBkYXRlLCB0aGlzKTtcblxuICAgICAgICB0aGlzLnRpY2tlckFkZGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhbGwgdGhlIERPTSBldmVudHNcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5hZGRFdmVudHMgPSBmdW5jdGlvbiBhZGRFdmVudHMgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50c0FkZGVkIHx8ICF0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuc3R5bGVbJy1tcy1jb250ZW50LXpvb21pbmcnXSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlWyctbXMtdG91Y2gtYWN0aW9uJ10gPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdXBwb3J0c1BvaW50ZXJFdmVudHMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVzZSBldmVudHMgYXJlIGFkZGVkIGZpcnN0LCBzbyB0aGF0IGlmIHBvaW50ZXIgZXZlbnRzIGFyZSBub3JtYWxpemVkLCB0aGV5IGFyZSBmaXJlZFxuICAgICAgICAgKiBpbiB0aGUgc2FtZSBvcmRlciBhcyBub24tbm9ybWFsaXplZCBldmVudHMuIGllLiBwb2ludGVyIGV2ZW50IDFzdCwgbW91c2UgLyB0b3VjaCAybmRcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzUG9pbnRlckV2ZW50cylcbiAgICAgICAge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vblBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIHBvaW50ZXJvdXQgaXMgZmlyZWQgaW4gYWRkaXRpb24gdG8gcG9pbnRlcnVwIChmb3IgdG91Y2ggZXZlbnRzKSBhbmQgcG9pbnRlcmNhbmNlbFxuICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBoYW5kbGUgdGhvc2UsIHNvIGZvciB0aGUgcHVycG9zZXMgb2Ygd2hhdCB3ZSBkbyBpbiBvblBvaW50ZXJPdXQsIHdlIG9ubHlcbiAgICAgICAgICAgIC8vIGNhcmUgYWJvdXQgdGhlIHBvaW50ZXJsZWF2ZSBldmVudFxuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgdGhpcy5vblBvaW50ZXJPdXQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm92ZXInLCB0aGlzLm9uUG9pbnRlck92ZXIsIHRydWUpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlckNhbmNlbCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Qb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMub25Qb2ludGVyT3V0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMub25Qb2ludGVyT3ZlciwgdHJ1ZSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Qb2ludGVyVXAsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWx3YXlzIGxvb2sgZGlyZWN0bHkgZm9yIHRvdWNoIGV2ZW50cyBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIG9yaWdpbmFsIGRhdGFcbiAgICAgICAgLy8gSW4gYSBmdXR1cmUgdmVyc2lvbiB3ZSBzaG91bGQgY2hhbmdlIHRoaXMgdG8gYmVpbmcganVzdCBhIGZhbGxiYWNrIGFuZCByZWx5IHNvbGVseSBvblxuICAgICAgICAvLyBQb2ludGVyRXZlbnRzIHdoZW5ldmVyIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c1RvdWNoRXZlbnRzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5vblBvaW50ZXJDYW5jZWwsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uUG9pbnRlclVwLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50c0FkZGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgdGhlIERPTSBldmVudHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50cyA9IGZ1bmN0aW9uIHJlbW92ZUV2ZW50cyAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50c0FkZGVkIHx8ICF0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuc3R5bGVbJy1tcy1jb250ZW50LXpvb21pbmcnXSA9ICcnO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuc3R5bGVbJy1tcy10b3VjaC1hY3Rpb24nXSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3VwcG9ydHNQb2ludGVyRXZlbnRzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5zdHlsZVsndG91Y2gtYWN0aW9uJ10gPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzUG9pbnRlckV2ZW50cylcbiAgICAgICAge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vblBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIHRoaXMub25Qb2ludGVyT3V0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJvdmVyJywgdGhpcy5vblBvaW50ZXJPdmVyLCB0cnVlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJDYW5jZWwsIHRydWUpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXAsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Qb2ludGVyTW92ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm9uUG9pbnRlck91dCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLm9uUG9pbnRlck92ZXIsIHRydWUpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUG9pbnRlclVwLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzVG91Y2hFdmVudHMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uUG9pbnRlckRvd24sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uUG9pbnRlckNhbmNlbCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Qb2ludGVyVXAsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmV2ZW50c0FkZGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGludGVyYWN0aXZlIG9iamVjdHMgaWYgYXQgbGVhc3Qge0BsaW5rIGludGVyYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogSW52b2tlZCBieSBhIHRocm90dGxlZCB0aWNrZXIgdXBkYXRlIGZyb20ge0BsaW5rIFBJWEkuVGlja2VyLnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsdGFUaW1lIC0gdGltZSBkZWx0YSBzaW5jZSB0aGUgbGFzdCBjYWxsXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS50aWNrZXJVcGRhdGUgPSBmdW5jdGlvbiB0aWNrZXJVcGRhdGUgKGRlbHRhVGltZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2RlbHRhVGltZSArPSBkZWx0YVRpbWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhVGltZSA8IHRoaXMuaW50ZXJhY3Rpb25GcmVxdWVuY3kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RlbHRhVGltZSA9IDA7XG5cbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgaW50ZXJhY3RpdmUgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmludGVyYWN0aW9uRE9NRWxlbWVudClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgbW92ZSB0aGUgbW91c2UgdGhpcyBjaGVjayBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgdXNpbmcgdGhlIG1vdXNlIG1vdmUhXG4gICAgICAgIGlmICh0aGlzLmRpZE1vdmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZGlkTW92ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG5cbiAgICAgICAgLy8gUmVzZXRzIHRoZSBmbGFnIGFzIHNldCBieSBhIHN0b3BQcm9wYWdhdGlvbiBjYWxsLiBUaGlzIGZsYWcgaXMgdXN1YWxseSByZXNldCBieSBhIHVzZXIgaW50ZXJhY3Rpb24gb2YgYW55IGtpbmQsXG4gICAgICAgIC8vIGJ1dCB0aGVyZSB3YXMgYSBzY2VuYXJpbyBvZiBhIGRpc3BsYXkgb2JqZWN0IG1vdmluZyB1bmRlciBhIHN0YXRpYyBtb3VzZSBjdXJzb3IuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgbW91c2VvdmVyIGFuZCBtb3VzZWV2ZW50cyB3b3VsZCBub3QgcGFzcyB0aGUgZmxhZyB0ZXN0IGluIGRpc3BhdGNoRXZlbnQgZnVuY3Rpb25cbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmFjdGl2ZUludGVyYWN0aW9uRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW50ZXJhY3Rpb25EYXRhLmhhc093blByb3BlcnR5KGspKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBpbnRlcmFjdGlvbkRhdGEgPSB0aGlzLmFjdGl2ZUludGVyYWN0aW9uRGF0YVtrXTtcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlcmFjdGlvbkRhdGEub3JpZ2luYWxFdmVudCAmJiBpbnRlcmFjdGlvbkRhdGEucG9pbnRlclR5cGUgIT09ICd0b3VjaCcpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25FdmVudCA9IHRoaXMuY29uZmlndXJlSW50ZXJhY3Rpb25FdmVudEZvckRPTUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbkRhdGEub3JpZ2luYWxFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uRGF0YVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ludGVyYWN0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25FdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2xhc3RPYmplY3RSZW5kZXJlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJPdmVyT3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q3Vyc29yTW9kZSh0aGlzLmN1cnNvcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY3Vyc29yIG1vZGUsIGhhbmRsaW5nIGFueSBjYWxsYmFja3Mgb3IgQ1NTIHN0eWxlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZSAtIGN1cnNvciBtb2RlLCBhIGtleSBmcm9tIHRoZSBjdXJzb3JTdHlsZXMgZGljdGlvbmFyeVxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuc2V0Q3Vyc29yTW9kZSA9IGZ1bmN0aW9uIHNldEN1cnNvck1vZGUgKG1vZGUpXG4gICAge1xuICAgICAgICBtb2RlID0gbW9kZSB8fCAnZGVmYXVsdCc7XG4gICAgICAgIC8vIGlmIHRoZSBtb2RlIGRpZG4ndCBhY3R1YWxseSBjaGFuZ2UsIGJhaWwgZWFybHlcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEN1cnNvck1vZGUgPT09IG1vZGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRDdXJzb3JNb2RlID0gbW9kZTtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5jdXJzb3JTdHlsZXNbbW9kZV07XG5cbiAgICAgICAgLy8gb25seSBkbyB0aGluZ3MgaWYgdGhlcmUgaXMgYSBjdXJzb3Igc3R5bGUgZm9yIGl0XG4gICAgICAgIGlmIChzdHlsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2Ygc3R5bGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHN0eWxlcyBhcmUgaGFuZGxlZCBhcyBjdXJzb3IgQ1NTXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LnN0eWxlLmN1cnNvciA9IHN0eWxlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyBhcmUganVzdCBjYWxsZWQsIGFuZCBwYXNzZWQgdGhlIGN1cnNvciBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlKG1vZGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBhbiBvYmplY3QsIGFzc3VtZSB0aGF0IGl0IGlzIGEgZGljdGlvbmFyeSBvZiBDU1Mgc3R5bGVzLFxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBpdCB0byB0aGUgaW50ZXJhY3Rpb25ET01FbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZGUgPT09ICdzdHJpbmcnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jdXJzb3JTdHlsZXMsIG1vZGUpKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBpZiBpdCBtb2RlIGlzIGEgc3RyaW5nIChub3QgYSBTeW1ib2wpIGFuZCBjdXJzb3JTdHlsZXMgZG9lc24ndCBoYXZlIGFueSBlbnRyeVxuICAgICAgICAgICAgLy8gZm9yIHRoZSBtb2RlLCB0aGVuIGFzc3VtZSB0aGF0IHRoZSBkZXYgd2FudHMgaXQgdG8gYmUgQ1NTIGZvciB0aGUgY3Vyc29yLlxuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gbW9kZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IHdhcyBpbnRlcmFjdGVkIHdpdGhcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ8UElYSS5TcHJpdGV8UElYSS5UaWxpbmdTcHJpdGV9IGRpc3BsYXlPYmplY3QgLSB0aGUgZGlzcGxheSBvYmplY3QgaW4gcXVlc3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRTdHJpbmcgLSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgKGUuZywgbW91c2Vkb3duKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudERhdGEgLSB0aGUgZXZlbnQgZGF0YSBvYmplY3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQgKGRpc3BsYXlPYmplY3QsIGV2ZW50U3RyaW5nLCBldmVudERhdGEpXG4gICAge1xuICAgICAgICAvLyBFdmVuIGlmIHRoZSBldmVudCB3YXMgc3RvcHBlZCwgYXQgbGVhc3QgZGlzcGF0Y2ggYW55IHJlbWFpbmluZyBldmVudHNcbiAgICAgICAgLy8gZm9yIHRoZSBzYW1lIGRpc3BsYXkgb2JqZWN0LlxuICAgICAgICBpZiAoIWV2ZW50RGF0YS5zdG9wUHJvcGFnYXRpb25IaW50IHx8IGRpc3BsYXlPYmplY3QgPT09IGV2ZW50RGF0YS5zdG9wc1Byb3BhZ2F0aW5nQXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50RGF0YS5jdXJyZW50VGFyZ2V0ID0gZGlzcGxheU9iamVjdDtcbiAgICAgICAgICAgIGV2ZW50RGF0YS50eXBlID0gZXZlbnRTdHJpbmc7XG5cbiAgICAgICAgICAgIGRpc3BsYXlPYmplY3QuZW1pdChldmVudFN0cmluZywgZXZlbnREYXRhKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlPYmplY3RbZXZlbnRTdHJpbmddKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlPYmplY3RbZXZlbnRTdHJpbmddKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHV0cyBhIGV2ZW50IG9uIGEgcXVldWUgdG8gYmUgZGlzcGF0Y2hlZCBsYXRlci4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSBjb3JyZWN0XG4gICAgICogb3JkZXJpbmcgb2Ygb3Zlci9vdXQgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkNvbnRhaW5lcnxQSVhJLlNwcml0ZXxQSVhJLlRpbGluZ1Nwcml0ZX0gZGlzcGxheU9iamVjdCAtIHRoZSBkaXNwbGF5IG9iamVjdCBpbiBxdWVzdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZS5nLCBtb3VzZWRvd24pXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50RGF0YSAtIHRoZSBldmVudCBkYXRhIG9iamVjdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5kZWxheURpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiBkZWxheURpc3BhdGNoRXZlbnQgKGRpc3BsYXlPYmplY3QsIGV2ZW50U3RyaW5nLCBldmVudERhdGEpXG4gICAge1xuICAgICAgICB0aGlzLmRlbGF5ZWRFdmVudHMucHVzaCh7IGRpc3BsYXlPYmplY3Q6IGRpc3BsYXlPYmplY3QsIGV2ZW50U3RyaW5nOiBldmVudFN0cmluZywgZXZlbnREYXRhOiBldmVudERhdGEgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE1hcHMgeCBhbmQgeSBjb29yZHMgZnJvbSBhIERPTSBvYmplY3QgYW5kIG1hcHMgdGhlbSBjb3JyZWN0bHkgdG8gdGhlIFBpeGlKUyB2aWV3LiBUaGVcbiAgICAgKiByZXN1bHRpbmcgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBwb2ludC4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGUgRE9NXG4gICAgICogZWxlbWVudCBjb3VsZCBiZSBzY2FsZWQgYW5kIHBvc2l0aW9uZWQgYW55d2hlcmUgb24gdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1BJWEkuUG9pbnR9IHBvaW50IC0gdGhlIHBvaW50IHRoYXQgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBpblxuICAgICAqIEBwYXJhbSAge251bWJlcn0geCAtIHRoZSB4IGNvb3JkIG9mIHRoZSBwb3NpdGlvbiB0byBtYXBcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IHkgLSB0aGUgeSBjb29yZCBvZiB0aGUgcG9zaXRpb24gdG8gbWFwXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5tYXBQb3NpdGlvblRvUG9pbnQgPSBmdW5jdGlvbiBtYXBQb3NpdGlvblRvUG9pbnQgKHBvaW50LCB4LCB5KVxuICAgIHtcbiAgICAgICAgdmFyIHJlY3Q7XG5cbiAgICAgICAgLy8gSUUgMTEgZml4XG4gICAgICAgIGlmICghdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQucGFyZW50RWxlbWVudClcbiAgICAgICAge1xuICAgICAgICAgICAgcmVjdCA9IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmVjdCA9IHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc29sdXRpb25NdWx0aXBsaWVyID0gMS4wIC8gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIHBvaW50LnggPSAoKHggLSByZWN0LmxlZnQpICogKHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50LndpZHRoIC8gcmVjdC53aWR0aCkpICogcmVzb2x1dGlvbk11bHRpcGxpZXI7XG4gICAgICAgIHBvaW50LnkgPSAoKHkgLSByZWN0LnRvcCkgKiAodGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQuaGVpZ2h0IC8gcmVjdC5oZWlnaHQpKSAqIHJlc29sdXRpb25NdWx0aXBsaWVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVzIGEgbmVhdCB3YXkgb2YgY3Jhd2xpbmcgdGhyb3VnaCB0aGUgc2NlbmUgZ3JhcGggYW5kIHJ1bm5pbmcgYVxuICAgICAqIHNwZWNpZmllZCBmdW5jdGlvbiBvbiBhbGwgaW50ZXJhY3RpdmUgb2JqZWN0cyBpdCBmaW5kcy4gSXQgd2lsbCBhbHNvIHRha2UgY2FyZSBvZiBoaXRcbiAgICAgKiB0ZXN0aW5nIHRoZSBpbnRlcmFjdGl2ZSBvYmplY3RzIGFuZCBwYXNzZXMgdGhlIGhpdCBhY3Jvc3MgaW4gdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gZXZlbnQgY29udGFpbmluZyB0aGUgcG9pbnQgdGhhdFxuICAgICAqICBpcyB0ZXN0ZWQgZm9yIGNvbGxpc2lvblxuICAgICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ8UElYSS5TcHJpdGV8UElYSS5UaWxpbmdTcHJpdGV9IGRpc3BsYXlPYmplY3QgLSB0aGUgZGlzcGxheU9iamVjdFxuICAgICAqICB0aGF0IHdpbGwgYmUgaGl0IHRlc3QgKHJlY3Vyc2l2ZWx5IGNyYXdscyBpdHMgY2hpbGRyZW4pXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2Z1bmNdIC0gdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBpbnRlcmFjdGl2ZSBvYmplY3QuIFRoZVxuICAgICAqICBpbnRlcmFjdGlvbkV2ZW50LCBkaXNwbGF5T2JqZWN0IGFuZCBoaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaGl0VGVzdF0gLSBpbmRpY2F0ZXMgd2hldGhlciB3ZSB3YW50IHRvIGNhbGN1bGF0ZSBoaXRzXG4gICAgICogIG9yIGp1c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCBpbnRlcmFjdGl2ZSBvYmplY3RzXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5wcm9jZXNzSW50ZXJhY3RpdmUgPSBmdW5jdGlvbiBwcm9jZXNzSW50ZXJhY3RpdmUgKGludGVyYWN0aW9uRXZlbnQsIGRpc3BsYXlPYmplY3QsIGZ1bmMsIGhpdFRlc3QpXG4gICAge1xuICAgICAgICB2YXIgaGl0ID0gdGhpcy5zZWFyY2guZmluZEhpdChpbnRlcmFjdGlvbkV2ZW50LCBkaXNwbGF5T2JqZWN0LCBmdW5jLCBoaXRUZXN0KTtcblxuICAgICAgICB2YXIgZGVsYXllZEV2ZW50cyA9IHRoaXMuZGVsYXllZEV2ZW50cztcblxuICAgICAgICBpZiAoIWRlbGF5ZWRFdmVudHMubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gaGl0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9wYWdhdGlvbiBoaW50LCBiZWNhdXNlIHdlIHN0YXJ0IGRlZXBlciBpbiB0aGUgdHJlZSBhZ2Fpbi5cbiAgICAgICAgaW50ZXJhY3Rpb25FdmVudC5zdG9wUHJvcGFnYXRpb25IaW50ID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGRlbGF5ZWRMZW4gPSBkZWxheWVkRXZlbnRzLmxlbmd0aDtcblxuICAgICAgICB0aGlzLmRlbGF5ZWRFdmVudHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGF5ZWRMZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlZiA9IGRlbGF5ZWRFdmVudHNbaV07XG4gICAgICAgICAgICB2YXIgZGlzcGxheU9iamVjdCQxID0gcmVmLmRpc3BsYXlPYmplY3Q7XG4gICAgICAgICAgICB2YXIgZXZlbnRTdHJpbmcgPSByZWYuZXZlbnRTdHJpbmc7XG4gICAgICAgICAgICB2YXIgZXZlbnREYXRhID0gcmVmLmV2ZW50RGF0YTtcblxuICAgICAgICAgICAgLy8gV2hlbiB3ZSByZWFjaCB0aGUgb2JqZWN0IHdlIHdhbnRlZCB0byBzdG9wIHByb3BhZ2F0aW5nIGF0LFxuICAgICAgICAgICAgLy8gc2V0IHRoZSBwcm9wYWdhdGlvbiBoaW50LlxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YS5zdG9wc1Byb3BhZ2F0aW5nQXQgPT09IGRpc3BsYXlPYmplY3QkMSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudERhdGEuc3RvcFByb3BhZ2F0aW9uSGludCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0JDEsIGV2ZW50U3RyaW5nLCBldmVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhpdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgYnV0dG9uIGlzIHByZXNzZWQgZG93biBvbiB0aGUgcmVuZGVyZXIgZWxlbWVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gb3JpZ2luYWxFdmVudCAtIFRoZSBET00gZXZlbnQgb2YgYSBwb2ludGVyIGJ1dHRvbiBiZWluZyBwcmVzc2VkIGRvd25cbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLm9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiBvblBvaW50ZXJEb3duIChvcmlnaW5hbEV2ZW50KVxuICAgIHtcbiAgICAgICAgLy8gaWYgd2Ugc3VwcG9ydCB0b3VjaCBldmVudHMsIHRoZW4gb25seSB1c2UgdGhvc2UgZm9yIHRvdWNoIGV2ZW50cywgbm90IHBvaW50ZXIgZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzVG91Y2hFdmVudHMgJiYgb3JpZ2luYWxFdmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJykgeyByZXR1cm47IH1cblxuICAgICAgICB2YXIgZXZlbnRzID0gdGhpcy5ub3JtYWxpemVUb1BvaW50ZXJEYXRhKG9yaWdpbmFsRXZlbnQpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBObyBuZWVkIHRvIHByZXZlbnQgZGVmYXVsdCBvbiBuYXR1cmFsIHBvaW50ZXIgZXZlbnRzLCBhcyB0aGVyZSBhcmUgbm8gc2lkZSBlZmZlY3RzXG4gICAgICAgICAqIE5vcm1hbGl6ZWQgZXZlbnRzLCBob3dldmVyLCBtYXkgaGF2ZSB0aGUgZG91YmxlIG1vdXNlZG93bi90b3VjaHN0YXJ0IGlzc3VlIG9uIHRoZSBuYXRpdmUgYW5kcm9pZCBicm93c2VyLFxuICAgICAgICAgKiBzbyBzdGlsbCBuZWVkIHRvIGJlIHByZXZlbnRlZC5cbiAgICAgICAgICovXG5cbiAgICAgICAgLy8gR3VhcmFudGVlZCB0aGF0IHRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgb25lIGV2ZW50IGluIGV2ZW50cywgYW5kIGFsbCBldmVudHMgbXVzdCBoYXZlIHRoZSBzYW1lIHBvaW50ZXIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLmF1dG9QcmV2ZW50RGVmYXVsdCAmJiBldmVudHNbMF0uaXNOb3JtYWxpemVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY2FuY2VsYWJsZSA9IG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSB8fCAhKCdjYW5jZWxhYmxlJyBpbiBvcmlnaW5hbEV2ZW50KTtcblxuICAgICAgICAgICAgaWYgKGNhbmNlbGFibGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV2ZW50TGVuID0gZXZlbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGVuOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBldmVudCA9IGV2ZW50c1tpXTtcblxuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uRGF0YSA9IHRoaXMuZ2V0SW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkKGV2ZW50KTtcblxuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uRXZlbnQgPSB0aGlzLmNvbmZpZ3VyZUludGVyYWN0aW9uRXZlbnRGb3JET01FdmVudCh0aGlzLmV2ZW50RGF0YSwgZXZlbnQsIGludGVyYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgIGludGVyYWN0aW9uRXZlbnQuZGF0YS5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcblxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzSW50ZXJhY3RpdmUoaW50ZXJhY3Rpb25FdmVudCwgdGhpcy5yZW5kZXJlci5fbGFzdE9iamVjdFJlbmRlcmVkLCB0aGlzLnByb2Nlc3NQb2ludGVyRG93biwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgncG9pbnRlcmRvd24nLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3RvdWNoc3RhcnQnLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVtaXQgYSBtb3VzZSBldmVudCBmb3IgXCJwZW5cIiBwb2ludGVycywgdGhlIHdheSBhIGJyb3dzZXIgd291bGQgZW1pdCBhIGZhbGxiYWNrIGV2ZW50XG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3BlbicpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGlzUmlnaHRCdXR0b24gPSBldmVudC5idXR0b24gPT09IDI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoaXNSaWdodEJ1dHRvbiA/ICdyaWdodGRvd24nIDogJ21vdXNlZG93bicsIHRoaXMuZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcG9pbnRlciBkb3duIGNoZWNrIGFuZCBkaXNwYXRjaGVzIHRoZSBldmVudCBpZiBuZWVkIGJlXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gVGhlIGludGVyYWN0aW9uIGV2ZW50IHdyYXBwaW5nIHRoZSBET00gZXZlbnRcbiAgICAgKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfFBJWEkuU3ByaXRlfFBJWEkuVGlsaW5nU3ByaXRlfSBkaXNwbGF5T2JqZWN0IC0gVGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgd2FzIHRlc3RlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGl0IC0gdGhlIHJlc3VsdCBvZiB0aGUgaGl0IHRlc3Qgb24gdGhlIGRpc3BsYXkgb2JqZWN0XG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5wcm9jZXNzUG9pbnRlckRvd24gPSBmdW5jdGlvbiBwcm9jZXNzUG9pbnRlckRvd24gKGludGVyYWN0aW9uRXZlbnQsIGRpc3BsYXlPYmplY3QsIGhpdClcbiAgICB7XG4gICAgICAgIHZhciBkYXRhID0gaW50ZXJhY3Rpb25FdmVudC5kYXRhO1xuICAgICAgICB2YXIgaWQgPSBpbnRlcmFjdGlvbkV2ZW50LmRhdGEuaWRlbnRpZmllcjtcblxuICAgICAgICBpZiAoaGl0KVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpc3BsYXlPYmplY3QudHJhY2tlZFBvaW50ZXJzW2lkXSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5T2JqZWN0LnRyYWNrZWRQb2ludGVyc1tpZF0gPSBuZXcgSW50ZXJhY3Rpb25UcmFja2luZ0RhdGEoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsICdwb2ludGVyZG93bicsIGludGVyYWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3RvdWNoc3RhcnQnLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZGF0YS5wb2ludGVyVHlwZSA9PT0gJ3BlbicpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGlzUmlnaHRCdXR0b24gPSBkYXRhLmJ1dHRvbiA9PT0gMjtcblxuICAgICAgICAgICAgICAgIGlmIChpc1JpZ2h0QnV0dG9uKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU9iamVjdC50cmFja2VkUG9pbnRlcnNbaWRdLnJpZ2h0RG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlPYmplY3QudHJhY2tlZFBvaW50ZXJzW2lkXS5sZWZ0RG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsIGlzUmlnaHRCdXR0b24gPyAncmlnaHRkb3duJyA6ICdtb3VzZWRvd24nLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgcG9pbnRlciBidXR0b24gaXMgcmVsZWFzZWQgb24gdGhlIHJlbmRlcmVyIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQb2ludGVyRXZlbnR9IG9yaWdpbmFsRXZlbnQgLSBUaGUgRE9NIGV2ZW50IG9mIGEgcG9pbnRlciBidXR0b24gYmVpbmcgcmVsZWFzZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNhbmNlbGxlZCAtIHRydWUgaWYgdGhlIHBvaW50ZXIgaXMgY2FuY2VsbGVkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIEZ1bmN0aW9uIHBhc3NlZCB0byB7QGxpbmsgcHJvY2Vzc0ludGVyYWN0aXZlfVxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Qb2ludGVyQ29tcGxldGUgPSBmdW5jdGlvbiBvblBvaW50ZXJDb21wbGV0ZSAob3JpZ2luYWxFdmVudCwgY2FuY2VsbGVkLCBmdW5jKVxuICAgIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMubm9ybWFsaXplVG9Qb2ludGVyRGF0YShvcmlnaW5hbEV2ZW50KTtcblxuICAgICAgICB2YXIgZXZlbnRMZW4gPSBldmVudHMubGVuZ3RoO1xuXG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXNuJ3QgdGFyZ2V0aW5nIG91ciBjYW52YXMsIHRoZW4gY29uc2lkZXIgaXQgdG8gYmUgcG9pbnRlcnVwb3V0c2lkZVxuICAgICAgICAvLyBpbiBhbGwgY2FzZXMgKHVubGVzcyBpdCB3YXMgYSBwb2ludGVyY2FuY2VsKVxuICAgICAgICB2YXIgZXZlbnRBcHBlbmQgPSBvcmlnaW5hbEV2ZW50LnRhcmdldCAhPT0gdGhpcy5pbnRlcmFjdGlvbkRPTUVsZW1lbnQgPyAnb3V0c2lkZScgOiAnJztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGVuOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBldmVudCA9IGV2ZW50c1tpXTtcblxuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uRGF0YSA9IHRoaXMuZ2V0SW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkKGV2ZW50KTtcblxuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uRXZlbnQgPSB0aGlzLmNvbmZpZ3VyZUludGVyYWN0aW9uRXZlbnRGb3JET01FdmVudCh0aGlzLmV2ZW50RGF0YSwgZXZlbnQsIGludGVyYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgIGludGVyYWN0aW9uRXZlbnQuZGF0YS5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcblxuICAgICAgICAgICAgLy8gcGVyZm9ybSBoaXQgdGVzdGluZyBmb3IgZXZlbnRzIHRhcmdldGluZyBvdXIgY2FudmFzIG9yIGNhbmNlbCBldmVudHNcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ludGVyYWN0aXZlKGludGVyYWN0aW9uRXZlbnQsIHRoaXMucmVuZGVyZXIuX2xhc3RPYmplY3RSZW5kZXJlZCwgZnVuYywgY2FuY2VsbGVkIHx8ICFldmVudEFwcGVuZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdChjYW5jZWxsZWQgPyAncG9pbnRlcmNhbmNlbCcgOiAoXCJwb2ludGVydXBcIiArIGV2ZW50QXBwZW5kKSwgaW50ZXJhY3Rpb25FdmVudCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3BlbicpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGlzUmlnaHRCdXR0b24gPSBldmVudC5idXR0b24gPT09IDI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoaXNSaWdodEJ1dHRvbiA/IChcInJpZ2h0dXBcIiArIGV2ZW50QXBwZW5kKSA6IChcIm1vdXNldXBcIiArIGV2ZW50QXBwZW5kKSwgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoY2FuY2VsbGVkID8gJ3RvdWNoY2FuY2VsJyA6IChcInRvdWNoZW5kXCIgKyBldmVudEFwcGVuZCksIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUludGVyYWN0aW9uRGF0YUZvclBvaW50ZXJJZChldmVudC5wb2ludGVySWQsIGludGVyYWN0aW9uRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgYnV0dG9uIGlzIGNhbmNlbGxlZFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gZXZlbnQgLSBUaGUgRE9NIGV2ZW50IG9mIGEgcG9pbnRlciBidXR0b24gYmVpbmcgcmVsZWFzZWRcbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLm9uUG9pbnRlckNhbmNlbCA9IGZ1bmN0aW9uIG9uUG9pbnRlckNhbmNlbCAoZXZlbnQpXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBzdXBwb3J0IHRvdWNoIGV2ZW50cywgdGhlbiBvbmx5IHVzZSB0aG9zZSBmb3IgdG91Y2ggZXZlbnRzLCBub3QgcG9pbnRlciBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNUb3VjaEV2ZW50cyAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJykgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLm9uUG9pbnRlckNvbXBsZXRlKGV2ZW50LCB0cnVlLCB0aGlzLnByb2Nlc3NQb2ludGVyQ2FuY2VsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHBvaW50ZXIgY2FuY2VsIGNoZWNrIGFuZCBkaXNwYXRjaGVzIHRoZSBldmVudCBpZiBuZWVkIGJlXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gVGhlIGludGVyYWN0aW9uIGV2ZW50IHdyYXBwaW5nIHRoZSBET00gZXZlbnRcbiAgICAgKiBAcGFyYW0ge1BJWEkuQ29udGFpbmVyfFBJWEkuU3ByaXRlfFBJWEkuVGlsaW5nU3ByaXRlfSBkaXNwbGF5T2JqZWN0IC0gVGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgd2FzIHRlc3RlZFxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUucHJvY2Vzc1BvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiBwcm9jZXNzUG9pbnRlckNhbmNlbCAoaW50ZXJhY3Rpb25FdmVudCwgZGlzcGxheU9iamVjdClcbiAgICB7XG4gICAgICAgIHZhciBkYXRhID0gaW50ZXJhY3Rpb25FdmVudC5kYXRhO1xuXG4gICAgICAgIHZhciBpZCA9IGludGVyYWN0aW9uRXZlbnQuZGF0YS5pZGVudGlmaWVyO1xuXG4gICAgICAgIGlmIChkaXNwbGF5T2JqZWN0LnRyYWNrZWRQb2ludGVyc1tpZF0gIT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVsZXRlIGRpc3BsYXlPYmplY3QudHJhY2tlZFBvaW50ZXJzW2lkXTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0LCAncG9pbnRlcmNhbmNlbCcsIGludGVyYWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3RvdWNoY2FuY2VsJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgYnV0dG9uIGlzIHJlbGVhc2VkIG9uIHRoZSByZW5kZXJlciBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UG9pbnRlckV2ZW50fSBldmVudCAtIFRoZSBET00gZXZlbnQgb2YgYSBwb2ludGVyIGJ1dHRvbiBiZWluZyByZWxlYXNlZFxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Qb2ludGVyVXAgPSBmdW5jdGlvbiBvblBvaW50ZXJVcCAoZXZlbnQpXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBzdXBwb3J0IHRvdWNoIGV2ZW50cywgdGhlbiBvbmx5IHVzZSB0aG9zZSBmb3IgdG91Y2ggZXZlbnRzLCBub3QgcG9pbnRlciBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNUb3VjaEV2ZW50cyAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJykgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLm9uUG9pbnRlckNvbXBsZXRlKGV2ZW50LCBmYWxzZSwgdGhpcy5wcm9jZXNzUG9pbnRlclVwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHBvaW50ZXIgdXAgY2hlY2sgYW5kIGRpc3BhdGNoZXMgdGhlIGV2ZW50IGlmIG5lZWQgYmVcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRXZlbnR9IGludGVyYWN0aW9uRXZlbnQgLSBUaGUgaW50ZXJhY3Rpb24gZXZlbnQgd3JhcHBpbmcgdGhlIERPTSBldmVudFxuICAgICAqIEBwYXJhbSB7UElYSS5Db250YWluZXJ8UElYSS5TcHJpdGV8UElYSS5UaWxpbmdTcHJpdGV9IGRpc3BsYXlPYmplY3QgLSBUaGUgZGlzcGxheSBvYmplY3QgdGhhdCB3YXMgdGVzdGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBoaXQgLSB0aGUgcmVzdWx0IG9mIHRoZSBoaXQgdGVzdCBvbiB0aGUgZGlzcGxheSBvYmplY3RcbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NQb2ludGVyVXAgPSBmdW5jdGlvbiBwcm9jZXNzUG9pbnRlclVwIChpbnRlcmFjdGlvbkV2ZW50LCBkaXNwbGF5T2JqZWN0LCBoaXQpXG4gICAge1xuICAgICAgICB2YXIgZGF0YSA9IGludGVyYWN0aW9uRXZlbnQuZGF0YTtcblxuICAgICAgICB2YXIgaWQgPSBpbnRlcmFjdGlvbkV2ZW50LmRhdGEuaWRlbnRpZmllcjtcblxuICAgICAgICB2YXIgdHJhY2tpbmdEYXRhID0gZGlzcGxheU9iamVjdC50cmFja2VkUG9pbnRlcnNbaWRdO1xuXG4gICAgICAgIHZhciBpc1RvdWNoID0gZGF0YS5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJztcblxuICAgICAgICB2YXIgaXNNb3VzZSA9IChkYXRhLnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8IGRhdGEucG9pbnRlclR5cGUgPT09ICdwZW4nKTtcbiAgICAgICAgLy8gbmVlZCB0byB0cmFjayBtb3VzZSBkb3duIHN0YXR1cyBpbiB0aGUgbW91c2UgYmxvY2sgc28gdGhhdCB3ZSBjYW4gZW1pdFxuICAgICAgICAvLyBldmVudCBpbiBhIGxhdGVyIGJsb2NrXG4gICAgICAgIHZhciBpc01vdXNlVGFwID0gZmFsc2U7XG5cbiAgICAgICAgLy8gTW91c2Ugb25seVxuICAgICAgICBpZiAoaXNNb3VzZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGlzUmlnaHRCdXR0b24gPSBkYXRhLmJ1dHRvbiA9PT0gMjtcblxuICAgICAgICAgICAgdmFyIGZsYWdzID0gSW50ZXJhY3Rpb25UcmFja2luZ0RhdGEuRkxBR1M7XG5cbiAgICAgICAgICAgIHZhciB0ZXN0ID0gaXNSaWdodEJ1dHRvbiA/IGZsYWdzLlJJR0hUX0RPV04gOiBmbGFncy5MRUZUX0RPV047XG5cbiAgICAgICAgICAgIHZhciBpc0Rvd24gPSB0cmFja2luZ0RhdGEgIT09IHVuZGVmaW5lZCAmJiAodHJhY2tpbmdEYXRhLmZsYWdzICYgdGVzdCk7XG5cbiAgICAgICAgICAgIGlmIChoaXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsIGlzUmlnaHRCdXR0b24gPyAncmlnaHR1cCcgOiAnbW91c2V1cCcsIGludGVyYWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzRG93bilcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0LCBpc1JpZ2h0QnV0dG9uID8gJ3JpZ2h0Y2xpY2snIDogJ2NsaWNrJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuIGNvbmZpcm0gdGhhdCB0aGUgbW91c2Vkb3duIGhhcHBlbmVkIG9uIHRoaXMgb2JqZWN0LCBmbGFnIGZvciBsYXRlciBlbWl0IG9mIHBvaW50ZXJ0YXBcbiAgICAgICAgICAgICAgICAgICAgaXNNb3VzZVRhcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNEb3duKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0LCBpc1JpZ2h0QnV0dG9uID8gJ3JpZ2h0dXBvdXRzaWRlJyA6ICdtb3VzZXVwb3V0c2lkZScsIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkb3duIHN0YXRlIG9mIHRoZSB0cmFja2luZyBkYXRhXG4gICAgICAgICAgICBpZiAodHJhY2tpbmdEYXRhKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChpc1JpZ2h0QnV0dG9uKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdEYXRhLnJpZ2h0RG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0cmFja2luZ0RhdGEubGVmdERvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb2ludGVycyBhbmQgVG91Y2hlcywgYW5kIE1vdXNlXG4gICAgICAgIGlmIChoaXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0LCAncG9pbnRlcnVwJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICBpZiAoaXNUb3VjaCkgeyB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3RvdWNoZW5kJywgaW50ZXJhY3Rpb25FdmVudCk7IH1cblxuICAgICAgICAgICAgaWYgKHRyYWNraW5nRGF0YSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBlbWl0IHBvaW50ZXJ0YXAgaWYgbm90IGEgbW91c2UsIG9yIGlmIHRoZSBtb3VzZSBibG9jayBkZWNpZGVkIGl0IHdhcyBhIHRhcFxuICAgICAgICAgICAgICAgIGlmICghaXNNb3VzZSB8fCBpc01vdXNlVGFwKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsICdwb2ludGVydGFwJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc1RvdWNoKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsICd0YXAnLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG91Y2hlcyBhcmUgbm8gbG9uZ2VyIG92ZXIgKGlmIHRoZXkgZXZlciB3ZXJlKSB3aGVuIHdlIGdldCB0aGUgdG91Y2hlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHdlIGRvbid0IGtlZXAgcHJldGVuZGluZyB0aGF0IHRoZXkgYXJlXG4gICAgICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5vdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYWNraW5nRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsICdwb2ludGVydXBvdXRzaWRlJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICBpZiAoaXNUb3VjaCkgeyB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3RvdWNoZW5kb3V0c2lkZScsIGludGVyYWN0aW9uRXZlbnQpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSByZW1vdmUgdGhlIHRyYWNraW5nIGRhdGEgaWYgdGhlcmUgaXMgbm8gb3Zlci9kb3duIHN0YXRlIHN0aWxsIGFzc29jaWF0ZWQgd2l0aCBpdFxuICAgICAgICBpZiAodHJhY2tpbmdEYXRhICYmIHRyYWNraW5nRGF0YS5ub25lKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWxldGUgZGlzcGxheU9iamVjdC50cmFja2VkUG9pbnRlcnNbaWRdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIElzIGNhbGxlZCB3aGVuIHRoZSBwb2ludGVyIG1vdmVzIGFjcm9zcyB0aGUgcmVuZGVyZXIgZWxlbWVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gb3JpZ2luYWxFdmVudCAtIFRoZSBET00gZXZlbnQgb2YgYSBwb2ludGVyIG1vdmluZ1xuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUub25Qb2ludGVyTW92ZSA9IGZ1bmN0aW9uIG9uUG9pbnRlck1vdmUgKG9yaWdpbmFsRXZlbnQpXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBzdXBwb3J0IHRvdWNoIGV2ZW50cywgdGhlbiBvbmx5IHVzZSB0aG9zZSBmb3IgdG91Y2ggZXZlbnRzLCBub3QgcG9pbnRlciBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNUb3VjaEV2ZW50cyAmJiBvcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLm5vcm1hbGl6ZVRvUG9pbnRlckRhdGEob3JpZ2luYWxFdmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50c1swXS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBldmVudHNbMF0ucG9pbnRlclR5cGUgPT09ICdwZW4nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmRpZE1vdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXZlbnRMZW4gPSBldmVudHMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2ldO1xuXG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25EYXRhID0gdGhpcy5nZXRJbnRlcmFjdGlvbkRhdGFGb3JQb2ludGVySWQoZXZlbnQpO1xuXG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25FdmVudCA9IHRoaXMuY29uZmlndXJlSW50ZXJhY3Rpb25FdmVudEZvckRPTUV2ZW50KHRoaXMuZXZlbnREYXRhLCBldmVudCwgaW50ZXJhY3Rpb25EYXRhKTtcblxuICAgICAgICAgICAgaW50ZXJhY3Rpb25FdmVudC5kYXRhLm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NJbnRlcmFjdGl2ZShpbnRlcmFjdGlvbkV2ZW50LCB0aGlzLnJlbmRlcmVyLl9sYXN0T2JqZWN0UmVuZGVyZWQsIHRoaXMucHJvY2Vzc1BvaW50ZXJNb3ZlLCB0cnVlKTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdwb2ludGVybW92ZScsIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICAgICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7IHRoaXMuZW1pdCgndG91Y2htb3ZlJywgaW50ZXJhY3Rpb25FdmVudCk7IH1cbiAgICAgICAgICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3BlbicpIHsgdGhpcy5lbWl0KCdtb3VzZW1vdmUnLCBpbnRlcmFjdGlvbkV2ZW50KTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50c1swXS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3JNb2RlKHRoaXMuY3Vyc29yKTtcblxuICAgICAgICAgICAgLy8gVE9ETyBCVUcgZm9yIHBhcmVudHMgaW50ZXJhY3RpdmUgb2JqZWN0IChib3JkZXIgb3JkZXIgaXNzdWUpXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHBvaW50ZXIgbW92ZSBjaGVjayBhbmQgZGlzcGF0Y2hlcyB0aGUgZXZlbnQgaWYgbmVlZCBiZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gaW50ZXJhY3Rpb25FdmVudCAtIFRoZSBpbnRlcmFjdGlvbiBldmVudCB3cmFwcGluZyB0aGUgRE9NIGV2ZW50XG4gICAgICogQHBhcmFtIHtQSVhJLkNvbnRhaW5lcnxQSVhJLlNwcml0ZXxQSVhJLlRpbGluZ1Nwcml0ZX0gZGlzcGxheU9iamVjdCAtIFRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IHdhcyB0ZXN0ZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpdCAtIHRoZSByZXN1bHQgb2YgdGhlIGhpdCB0ZXN0IG9uIHRoZSBkaXNwbGF5IG9iamVjdFxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUucHJvY2Vzc1BvaW50ZXJNb3ZlID0gZnVuY3Rpb24gcHJvY2Vzc1BvaW50ZXJNb3ZlIChpbnRlcmFjdGlvbkV2ZW50LCBkaXNwbGF5T2JqZWN0LCBoaXQpXG4gICAge1xuICAgICAgICB2YXIgZGF0YSA9IGludGVyYWN0aW9uRXZlbnQuZGF0YTtcblxuICAgICAgICB2YXIgaXNUb3VjaCA9IGRhdGEucG9pbnRlclR5cGUgPT09ICd0b3VjaCc7XG5cbiAgICAgICAgdmFyIGlzTW91c2UgPSAoZGF0YS5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fCBkYXRhLnBvaW50ZXJUeXBlID09PSAncGVuJyk7XG5cbiAgICAgICAgaWYgKGlzTW91c2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJPdmVyT3V0KGludGVyYWN0aW9uRXZlbnQsIGRpc3BsYXlPYmplY3QsIGhpdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubW92ZVdoZW5JbnNpZGUgfHwgaGl0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3BvaW50ZXJtb3ZlJywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICBpZiAoaXNUb3VjaCkgeyB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3RvdWNobW92ZScsIGludGVyYWN0aW9uRXZlbnQpOyB9XG4gICAgICAgICAgICBpZiAoaXNNb3VzZSkgeyB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ21vdXNlbW92ZScsIGludGVyYWN0aW9uRXZlbnQpOyB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92ZWQgb3V0IG9mIHRoZSByZW5kZXJlciBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UG9pbnRlckV2ZW50fSBvcmlnaW5hbEV2ZW50IC0gVGhlIERPTSBldmVudCBvZiBhIHBvaW50ZXIgYmVpbmcgbW92ZWQgb3V0XG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5vblBvaW50ZXJPdXQgPSBmdW5jdGlvbiBvblBvaW50ZXJPdXQgKG9yaWdpbmFsRXZlbnQpXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBzdXBwb3J0IHRvdWNoIGV2ZW50cywgdGhlbiBvbmx5IHVzZSB0aG9zZSBmb3IgdG91Y2ggZXZlbnRzLCBub3QgcG9pbnRlciBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNUb3VjaEV2ZW50cyAmJiBvcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLm5vcm1hbGl6ZVRvUG9pbnRlckRhdGEob3JpZ2luYWxFdmVudCk7XG5cbiAgICAgICAgLy8gT25seSBtb3VzZSBhbmQgcG9pbnRlciBjYW4gY2FsbCBvblBvaW50ZXJPdXQsIHNvIGV2ZW50cyB3aWxsIGFsd2F5cyBiZSBsZW5ndGggMVxuICAgICAgICB2YXIgZXZlbnQgPSBldmVudHNbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSAnbW91c2UnKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlT3ZlclJlbmRlcmVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvck1vZGUobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50ZXJhY3Rpb25EYXRhID0gdGhpcy5nZXRJbnRlcmFjdGlvbkRhdGFGb3JQb2ludGVySWQoZXZlbnQpO1xuXG4gICAgICAgIHZhciBpbnRlcmFjdGlvbkV2ZW50ID0gdGhpcy5jb25maWd1cmVJbnRlcmFjdGlvbkV2ZW50Rm9yRE9NRXZlbnQodGhpcy5ldmVudERhdGEsIGV2ZW50LCBpbnRlcmFjdGlvbkRhdGEpO1xuXG4gICAgICAgIGludGVyYWN0aW9uRXZlbnQuZGF0YS5vcmlnaW5hbEV2ZW50ID0gZXZlbnQ7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzSW50ZXJhY3RpdmUoaW50ZXJhY3Rpb25FdmVudCwgdGhpcy5yZW5kZXJlci5fbGFzdE9iamVjdFJlbmRlcmVkLCB0aGlzLnByb2Nlc3NQb2ludGVyT3Zlck91dCwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgncG9pbnRlcm91dCcsIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICdwZW4nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ21vdXNlb3V0JywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB3ZSBjYW4gZ2V0IHRvdWNobGVhdmUgZXZlbnRzIGFmdGVyIHRvdWNoZW5kLCBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gaW50cm9kdWNlIG1lbW9yeSBsZWFrc1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlSW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkKGludGVyYWN0aW9uRGF0YS5pZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcG9pbnRlciBvdmVyL291dCBjaGVjayBhbmQgZGlzcGF0Y2hlcyB0aGUgZXZlbnQgaWYgbmVlZCBiZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gaW50ZXJhY3Rpb25FdmVudCAtIFRoZSBpbnRlcmFjdGlvbiBldmVudCB3cmFwcGluZyB0aGUgRE9NIGV2ZW50XG4gICAgICogQHBhcmFtIHtQSVhJLkNvbnRhaW5lcnxQSVhJLlNwcml0ZXxQSVhJLlRpbGluZ1Nwcml0ZX0gZGlzcGxheU9iamVjdCAtIFRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IHdhcyB0ZXN0ZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhpdCAtIHRoZSByZXN1bHQgb2YgdGhlIGhpdCB0ZXN0IG9uIHRoZSBkaXNwbGF5IG9iamVjdFxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUucHJvY2Vzc1BvaW50ZXJPdmVyT3V0ID0gZnVuY3Rpb24gcHJvY2Vzc1BvaW50ZXJPdmVyT3V0IChpbnRlcmFjdGlvbkV2ZW50LCBkaXNwbGF5T2JqZWN0LCBoaXQpXG4gICAge1xuICAgICAgICB2YXIgZGF0YSA9IGludGVyYWN0aW9uRXZlbnQuZGF0YTtcblxuICAgICAgICB2YXIgaWQgPSBpbnRlcmFjdGlvbkV2ZW50LmRhdGEuaWRlbnRpZmllcjtcblxuICAgICAgICB2YXIgaXNNb3VzZSA9IChkYXRhLnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8IGRhdGEucG9pbnRlclR5cGUgPT09ICdwZW4nKTtcblxuICAgICAgICB2YXIgdHJhY2tpbmdEYXRhID0gZGlzcGxheU9iamVjdC50cmFja2VkUG9pbnRlcnNbaWRdO1xuXG4gICAgICAgIC8vIGlmIHdlIGp1c3QgbW91c2VkIG92ZXIgdGhlIGRpc3BsYXkgb2JqZWN0LCB0aGVuIHdlIG5lZWQgdG8gdHJhY2sgdGhhdCBzdGF0ZVxuICAgICAgICBpZiAoaGl0ICYmICF0cmFja2luZ0RhdGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRyYWNraW5nRGF0YSA9IGRpc3BsYXlPYmplY3QudHJhY2tlZFBvaW50ZXJzW2lkXSA9IG5ldyBJbnRlcmFjdGlvblRyYWNraW5nRGF0YShpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhY2tpbmdEYXRhID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKGhpdCAmJiB0aGlzLm1vdXNlT3ZlclJlbmRlcmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRyYWNraW5nRGF0YS5vdmVyKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYWNraW5nRGF0YS5vdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5RGlzcGF0Y2hFdmVudChkaXNwbGF5T2JqZWN0LCAncG9pbnRlcm92ZXInLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNNb3VzZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlEaXNwYXRjaEV2ZW50KGRpc3BsYXlPYmplY3QsICdtb3VzZW92ZXInLCBpbnRlcmFjdGlvbkV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG9ubHkgY2hhbmdlIHRoZSBjdXJzb3IgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2hhbmdlZCAoYnkgc29tZXRoaW5nIGRlZXBlciBpbiB0aGVcbiAgICAgICAgICAgIC8vIGRpc3BsYXkgdHJlZSlcbiAgICAgICAgICAgIGlmIChpc01vdXNlICYmIHRoaXMuY3Vyc29yID09PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gZGlzcGxheU9iamVjdC5jdXJzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhY2tpbmdEYXRhLm92ZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRyYWNraW5nRGF0YS5vdmVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ3BvaW50ZXJvdXQnLCB0aGlzLmV2ZW50RGF0YSk7XG4gICAgICAgICAgICBpZiAoaXNNb3VzZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZGlzcGxheU9iamVjdCwgJ21vdXNlb3V0JywgaW50ZXJhY3Rpb25FdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBtb3VzZSBkb3duIGluZm9ybWF0aW9uIGZvciB0aGUgcG9pbnRlciwgdGhlbiBpdCBpcyBzYWZlIHRvIGRlbGV0ZVxuICAgICAgICAgICAgaWYgKHRyYWNraW5nRGF0YS5ub25lKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkaXNwbGF5T2JqZWN0LnRyYWNrZWRQb2ludGVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbW92ZWQgaW50byB0aGUgcmVuZGVyZXIgZWxlbWVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gb3JpZ2luYWxFdmVudCAtIFRoZSBET00gZXZlbnQgb2YgYSBwb2ludGVyIGJ1dHRvbiBiZWluZyBtb3ZlZCBpbnRvIHRoZSByZW5kZXJlciB2aWV3XG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5vblBvaW50ZXJPdmVyID0gZnVuY3Rpb24gb25Qb2ludGVyT3ZlciAob3JpZ2luYWxFdmVudClcbiAgICB7XG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLm5vcm1hbGl6ZVRvUG9pbnRlckRhdGEob3JpZ2luYWxFdmVudCk7XG5cbiAgICAgICAgLy8gT25seSBtb3VzZSBhbmQgcG9pbnRlciBjYW4gY2FsbCBvblBvaW50ZXJPdmVyLCBzbyBldmVudHMgd2lsbCBhbHdheXMgYmUgbGVuZ3RoIDFcbiAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzWzBdO1xuXG4gICAgICAgIHZhciBpbnRlcmFjdGlvbkRhdGEgPSB0aGlzLmdldEludGVyYWN0aW9uRGF0YUZvclBvaW50ZXJJZChldmVudCk7XG5cbiAgICAgICAgdmFyIGludGVyYWN0aW9uRXZlbnQgPSB0aGlzLmNvbmZpZ3VyZUludGVyYWN0aW9uRXZlbnRGb3JET01FdmVudCh0aGlzLmV2ZW50RGF0YSwgZXZlbnQsIGludGVyYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgaW50ZXJhY3Rpb25FdmVudC5kYXRhLm9yaWdpbmFsRXZlbnQgPSBldmVudDtcblxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICdtb3VzZScpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubW91c2VPdmVyUmVuZGVyZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdwb2ludGVyb3ZlcicsIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICdwZW4nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ21vdXNlb3ZlcicsIGludGVyYWN0aW9uRXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCBJbnRlcmFjdGlvbkRhdGEgZm9yIGEgZ2l2ZW4gcG9pbnRlcklkLiBTdG9yZSB0aGF0IGRhdGEgYXMgd2VsbFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gZXZlbnQgLSBOb3JtYWxpemVkIHBvaW50ZXIgZXZlbnQsIG91dHB1dCBmcm9tIG5vcm1hbGl6ZVRvUG9pbnRlckRhdGFcbiAgICAgKiBAcmV0dXJuIHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uRGF0YX0gLSBJbnRlcmFjdGlvbiBkYXRhIGZvciB0aGUgZ2l2ZW4gcG9pbnRlciBpZGVudGlmaWVyXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5nZXRJbnRlcmFjdGlvbkRhdGFGb3JQb2ludGVySWQgPSBmdW5jdGlvbiBnZXRJbnRlcmFjdGlvbkRhdGFGb3JQb2ludGVySWQgKGV2ZW50KVxuICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IGV2ZW50LnBvaW50ZXJJZDtcblxuICAgICAgICB2YXIgaW50ZXJhY3Rpb25EYXRhO1xuXG4gICAgICAgIGlmIChwb2ludGVySWQgPT09IE1PVVNFX1BPSU5URVJfSUQgfHwgZXZlbnQucG9pbnRlclR5cGUgPT09ICdtb3VzZScpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uRGF0YSA9IHRoaXMubW91c2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY3RpdmVJbnRlcmFjdGlvbkRhdGFbcG9pbnRlcklkXSlcbiAgICAgICAge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25EYXRhID0gdGhpcy5hY3RpdmVJbnRlcmFjdGlvbkRhdGFbcG9pbnRlcklkXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uRGF0YSA9IHRoaXMuaW50ZXJhY3Rpb25EYXRhUG9vbC5wb3AoKSB8fCBuZXcgSW50ZXJhY3Rpb25EYXRhKCk7XG4gICAgICAgICAgICBpbnRlcmFjdGlvbkRhdGEuaWRlbnRpZmllciA9IHBvaW50ZXJJZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSW50ZXJhY3Rpb25EYXRhW3BvaW50ZXJJZF0gPSBpbnRlcmFjdGlvbkRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29weSBwcm9wZXJ0aWVzIGZyb20gdGhlIGV2ZW50LCBzbyB0aGF0IHdlIGNhbiBtYWtlIHN1cmUgdGhhdCB0b3VjaC9wb2ludGVyIHNwZWNpZmljXG4gICAgICAgIC8vIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAgICAgIGludGVyYWN0aW9uRGF0YS5jb3B5RXZlbnQoZXZlbnQpO1xuXG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbkRhdGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB1bnVzZWQgSW50ZXJhY3Rpb25EYXRhIHRvIHRoZSBwb29sLCBmb3IgYSBnaXZlbiBwb2ludGVySWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvaW50ZXJJZCAtIElkZW50aWZpZXIgZnJvbSBhIHBvaW50ZXIgZXZlbnRcbiAgICAgKi9cbiAgICBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLnJlbGVhc2VJbnRlcmFjdGlvbkRhdGFGb3JQb2ludGVySWQgPSBmdW5jdGlvbiByZWxlYXNlSW50ZXJhY3Rpb25EYXRhRm9yUG9pbnRlcklkIChwb2ludGVySWQpXG4gICAge1xuICAgICAgICB2YXIgaW50ZXJhY3Rpb25EYXRhID0gdGhpcy5hY3RpdmVJbnRlcmFjdGlvbkRhdGFbcG9pbnRlcklkXTtcblxuICAgICAgICBpZiAoaW50ZXJhY3Rpb25EYXRhKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hY3RpdmVJbnRlcmFjdGlvbkRhdGFbcG9pbnRlcklkXTtcbiAgICAgICAgICAgIGludGVyYWN0aW9uRGF0YS5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbkRhdGFQb29sLnB1c2goaW50ZXJhY3Rpb25EYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYW4gSW50ZXJhY3Rpb25FdmVudCB0byB3cmFwIGEgRE9NIFBvaW50ZXJFdmVudCBhbmQgSW50ZXJhY3Rpb25EYXRhXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5pbnRlcmFjdGlvbi5JbnRlcmFjdGlvbkV2ZW50fSBpbnRlcmFjdGlvbkV2ZW50IC0gVGhlIGV2ZW50IHRvIGJlIGNvbmZpZ3VyZWRcbiAgICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gcG9pbnRlckV2ZW50IC0gVGhlIERPTSBldmVudCB0aGF0IHdpbGwgYmUgcGFpcmVkIHdpdGggdGhlIEludGVyYWN0aW9uRXZlbnRcbiAgICAgKiBAcGFyYW0ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25EYXRhfSBpbnRlcmFjdGlvbkRhdGEgLSBUaGUgSW50ZXJhY3Rpb25EYXRhIHRoYXQgd2lsbCBiZSBwYWlyZWRcbiAgICAgKiAgICAgICAgd2l0aCB0aGUgSW50ZXJhY3Rpb25FdmVudFxuICAgICAqIEByZXR1cm4ge1BJWEkuaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25FdmVudH0gdGhlIGludGVyYWN0aW9uIGV2ZW50IHRoYXQgd2FzIHBhc3NlZCBpblxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuY29uZmlndXJlSW50ZXJhY3Rpb25FdmVudEZvckRPTUV2ZW50ID0gZnVuY3Rpb24gY29uZmlndXJlSW50ZXJhY3Rpb25FdmVudEZvckRPTUV2ZW50IChpbnRlcmFjdGlvbkV2ZW50LCBwb2ludGVyRXZlbnQsIGludGVyYWN0aW9uRGF0YSlcbiAgICB7XG4gICAgICAgIGludGVyYWN0aW9uRXZlbnQuZGF0YSA9IGludGVyYWN0aW9uRGF0YTtcblxuICAgICAgICB0aGlzLm1hcFBvc2l0aW9uVG9Qb2ludChpbnRlcmFjdGlvbkRhdGEuZ2xvYmFsLCBwb2ludGVyRXZlbnQuY2xpZW50WCwgcG9pbnRlckV2ZW50LmNsaWVudFkpO1xuXG4gICAgICAgIC8vIE5vdCByZWFsbHkgc3VyZSB3aHkgdGhpcyBpcyBoYXBwZW5pbmcsIGJ1dCBpdCdzIGhvdyBhIHByZXZpb3VzIHZlcnNpb24gaGFuZGxlZCB0aGluZ3NcbiAgICAgICAgaWYgKHBvaW50ZXJFdmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJylcbiAgICAgICAge1xuICAgICAgICAgICAgcG9pbnRlckV2ZW50Lmdsb2JhbFggPSBpbnRlcmFjdGlvbkRhdGEuZ2xvYmFsLng7XG4gICAgICAgICAgICBwb2ludGVyRXZlbnQuZ2xvYmFsWSA9IGludGVyYWN0aW9uRGF0YS5nbG9iYWwueTtcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVyYWN0aW9uRGF0YS5vcmlnaW5hbEV2ZW50ID0gcG9pbnRlckV2ZW50O1xuICAgICAgICBpbnRlcmFjdGlvbkV2ZW50LnJlc2V0KCk7XG5cbiAgICAgICAgcmV0dXJuIGludGVyYWN0aW9uRXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0IGNvbnRhaW5zIGFsbCBkYXRhIHRoYXQgYSByZWd1bGFyIHBvaW50ZXIgZXZlbnQgd291bGQgaGF2ZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR8TW91c2VFdmVudHxQb2ludGVyRXZlbnR9IGV2ZW50IC0gVGhlIG9yaWdpbmFsIGV2ZW50IGRhdGEgZnJvbSBhIHRvdWNoIG9yIG1vdXNlIGV2ZW50XG4gICAgICogQHJldHVybiB7UG9pbnRlckV2ZW50W119IEFuIGFycmF5IGNvbnRhaW5pbmcgYSBzaW5nbGUgbm9ybWFsaXplZCBwb2ludGVyIGV2ZW50LCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXJcbiAgICAgKiAgb3IgbW91c2UgZXZlbnQsIG9yIGEgbXVsdGlwbGUgbm9ybWFsaXplZCBwb2ludGVyIGV2ZW50cyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY2hhbmdlZCB0b3VjaGVzXG4gICAgICovXG4gICAgSW50ZXJhY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5ub3JtYWxpemVUb1BvaW50ZXJEYXRhID0gZnVuY3Rpb24gbm9ybWFsaXplVG9Qb2ludGVyRGF0YSAoZXZlbnQpXG4gICAge1xuICAgICAgICB2YXIgbm9ybWFsaXplZEV2ZW50cyA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzVG91Y2hFdmVudHMgJiYgZXZlbnQgaW5zdGFuY2VvZiBUb3VjaEV2ZW50KVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGkgPSBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkgPCBsaTsgaSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3VjaC5idXR0b24gPT09ICd1bmRlZmluZWQnKSB7IHRvdWNoLmJ1dHRvbiA9IGV2ZW50LnRvdWNoZXMubGVuZ3RoID8gMSA6IDA7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLmJ1dHRvbnMgPT09ICd1bmRlZmluZWQnKSB7IHRvdWNoLmJ1dHRvbnMgPSBldmVudC50b3VjaGVzLmxlbmd0aCA/IDEgOiAwOyB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3VjaC5pc1ByaW1hcnkgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2guaXNQcmltYXJ5ID0gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgJiYgZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLndpZHRoID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC53aWR0aCA9IHRvdWNoLnJhZGl1c1ggfHwgMTsgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG91Y2guaGVpZ2h0ID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC5oZWlnaHQgPSB0b3VjaC5yYWRpdXNZIHx8IDE7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnRpbHRYID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC50aWx0WCA9IDA7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnRpbHRZID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC50aWx0WSA9IDA7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnBvaW50ZXJUeXBlID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC5wb2ludGVyVHlwZSA9ICd0b3VjaCc7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnBvaW50ZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHsgdG91Y2gucG9pbnRlcklkID0gdG91Y2guaWRlbnRpZmllciB8fCAwOyB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3VjaC5wcmVzc3VyZSA9PT0gJ3VuZGVmaW5lZCcpIHsgdG91Y2gucHJlc3N1cmUgPSB0b3VjaC5mb3JjZSB8fCAwLjU7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnR3aXN0ID09PSAndW5kZWZpbmVkJykgeyB0b3VjaC50d2lzdCA9IDA7IH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdWNoLnRhbmdlbnRpYWxQcmVzc3VyZSA9PT0gJ3VuZGVmaW5lZCcpIHsgdG91Y2gudGFuZ2VudGlhbFByZXNzdXJlID0gMDsgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGVzZSwgYXMgbGF5ZXJYL1kgaXMgbm90IGEgc3RhbmRhcmQsIGlzIGRlcHJlY2F0ZWQsIGhhcyB1bmV2ZW5cbiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0LCBhbmQgdGhlIGZpbGwgaW5zIGFyZSBub3QgcXVpdGUgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXRYL1kgbWlnaHQgYmUgb2theSwgYnV0IGlzIG5vdCB0aGUgc2FtZSBhcyBjbGllbnRYL1kgd2hlbiB0aGUgY2FudmFzJ3MgdG9wXG4gICAgICAgICAgICAgICAgLy8gbGVmdCBpcyBub3QgMCwwIG9uIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3VjaC5sYXllclggPT09ICd1bmRlZmluZWQnKSB7IHRvdWNoLmxheWVyWCA9IHRvdWNoLm9mZnNldFggPSB0b3VjaC5jbGllbnRYOyB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b3VjaC5sYXllclkgPT09ICd1bmRlZmluZWQnKSB7IHRvdWNoLmxheWVyWSA9IHRvdWNoLm9mZnNldFkgPSB0b3VjaC5jbGllbnRZOyB9XG5cbiAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSB0b3VjaCBhcyBub3JtYWxpemVkLCBqdXN0IHNvIHRoYXQgd2Uga25vdyB3ZSBkaWQgaXRcbiAgICAgICAgICAgICAgICB0b3VjaC5pc05vcm1hbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEV2ZW50cy5wdXNoKHRvdWNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBhcmVudGx5IFBvaW50ZXJFdmVudCBzdWJjbGFzc2VzIE1vdXNlRXZlbnQsIHNvIHlheVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQgJiYgKCF0aGlzLnN1cHBvcnRzUG9pbnRlckV2ZW50cyB8fCAhKGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LlBvaW50ZXJFdmVudCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmlzUHJpbWFyeSA9PT0gJ3VuZGVmaW5lZCcpIHsgZXZlbnQuaXNQcmltYXJ5ID0gdHJ1ZTsgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC53aWR0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZXZlbnQud2lkdGggPSAxOyB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHsgZXZlbnQuaGVpZ2h0ID0gMTsgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC50aWx0WCA9PT0gJ3VuZGVmaW5lZCcpIHsgZXZlbnQudGlsdFggPSAwOyB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnRpbHRZID09PSAndW5kZWZpbmVkJykgeyBldmVudC50aWx0WSA9IDA7IH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQucG9pbnRlclR5cGUgPT09ICd1bmRlZmluZWQnKSB7IGV2ZW50LnBvaW50ZXJUeXBlID0gJ21vdXNlJzsgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC5wb2ludGVySWQgPT09ICd1bmRlZmluZWQnKSB7IGV2ZW50LnBvaW50ZXJJZCA9IE1PVVNFX1BPSU5URVJfSUQ7IH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQucHJlc3N1cmUgPT09ICd1bmRlZmluZWQnKSB7IGV2ZW50LnByZXNzdXJlID0gMC41OyB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnR3aXN0ID09PSAndW5kZWZpbmVkJykgeyBldmVudC50d2lzdCA9IDA7IH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQudGFuZ2VudGlhbFByZXNzdXJlID09PSAndW5kZWZpbmVkJykgeyBldmVudC50YW5nZW50aWFsUHJlc3N1cmUgPSAwOyB9XG5cbiAgICAgICAgICAgIC8vIG1hcmsgdGhlIG1vdXNlIGV2ZW50IGFzIG5vcm1hbGl6ZWQsIGp1c3Qgc28gdGhhdCB3ZSBrbm93IHdlIGRpZCBpdFxuICAgICAgICAgICAgZXZlbnQuaXNOb3JtYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgbm9ybWFsaXplZEV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRFdmVudHMucHVzaChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEV2ZW50cztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIGludGVyYWN0aW9uIG1hbmFnZXJcbiAgICAgKlxuICAgICAqL1xuICAgIEludGVyYWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRzKCk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVUaWNrZXJMaXN0ZW5lcigpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5tb3VzZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5ldmVudERhdGEgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25ET01FbGVtZW50ID0gbnVsbDtcblxuICAgICAgICB0aGlzLm9uUG9pbnRlckRvd24gPSBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyRG93biA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vblBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJVcCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vblBvaW50ZXJDYW5jZWwgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyQ2FuY2VsID0gbnVsbDtcblxuICAgICAgICB0aGlzLm9uUG9pbnRlck1vdmUgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyTW92ZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vblBvaW50ZXJPdXQgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyT3Zlck91dCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5vblBvaW50ZXJPdmVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRlcmFjdGlvbk1hbmFnZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBJbnRlcmFjdGlvbk1hbmFnZXI7XG59KEV2ZW50RW1pdHRlcikpO1xuXG4vKipcbiAqIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGEgcmVuZGVyZXIgcGx1Z2luIGZvciBoYW5kbGluZyBtb3VzZSwgcG9pbnRlciwgYW5kIHRvdWNoIGV2ZW50cy5cbiAqXG4gKiBEbyBub3QgaW5zdGFudGlhdGUgdGhpcyBwbHVnaW4gZGlyZWN0bHkuIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBgcmVuZGVyZXIucGx1Z2luc2AgcHJvcGVydHkuXG4gKiBTZWUge0BsaW5rIFBJWEkuQ2FudmFzUmVuZGVyZXIjcGx1Z2luc30gb3Ige0BsaW5rIFBJWEkuUmVuZGVyZXIjcGx1Z2luc30uXG4gKiBAbmFtZXNwYWNlIFBJWEkuaW50ZXJhY3Rpb25cbiAqL1xuXG5leHBvcnQgeyBJbnRlcmFjdGlvbkRhdGEsIEludGVyYWN0aW9uRXZlbnQsIEludGVyYWN0aW9uTWFuYWdlciwgSW50ZXJhY3Rpb25UcmFja2luZ0RhdGEsIGludGVyYWN0aXZlVGFyZ2V0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmFjdGlvbi5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvcnVubmVyIC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL3J1bm5lciBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbi8qKlxuICogQSBSdW5uZXIgaXMgYSBoaWdobHkgcGVyZm9ybWFudCBhbmQgc2ltcGxlIGFsdGVybmF0aXZlIHRvIHNpZ25hbHMuIEJlc3QgdXNlZCBpbiBzaXR1YXRpb25zXG4gKiB3aGVyZSBldmVudHMgYXJlIGRpc3BhdGNoZWQgdG8gbWFueSBvYmplY3RzIGF0IGhpZ2ggZnJlcXVlbmN5IChzYXkgZXZlcnkgZnJhbWUhKVxuICpcbiAqXG4gKiBsaWtlIGEgc2lnbmFsLi5cbiAqIGBgYFxuICogaW1wb3J0IHsgUnVubmVyIH0gZnJvbSAnQHBpeGkvcnVubmVyJztcbiAqXG4gKiBjb25zdCBteU9iamVjdCA9IHtcbiAqICAgICBsb2FkZWQ6IG5ldyBSdW5uZXIoJ2xvYWRlZCcpXG4gKiB9XG4gKlxuICogY29uc3QgbGlzdGVuZXIgPSB7XG4gKiAgICAgbG9hZGVkOiBmdW5jdGlvbigpe1xuICogICAgICAgICAvLyB0aGluXG4gKiAgICAgfVxuICogfVxuICpcbiAqIG15T2JqZWN0LnVwZGF0ZS5hZGQobGlzdGVuZXIpO1xuICpcbiAqIG15T2JqZWN0LmxvYWRlZC5lbWl0KCk7XG4gKiBgYGBcbiAqXG4gKiBPciBmb3IgaGFuZGxpbmcgY2FsbGluZyB0aGUgc2FtZSBmdW5jdGlvbiBvbiBtYW55IGl0ZW1zXG4gKiBgYGBcbiAqIGltcG9ydCB7IFJ1bm5lciB9IGZyb20gJ0BwaXhpL3J1bm5lcic7XG4gKlxuICogY29uc3QgbXlHYW1lID0ge1xuICogICAgIHVwZGF0ZTogbmV3IFJ1bm5lcigndXBkYXRlJylcbiAqIH1cbiAqXG4gKiBjb25zdCBnYW1lT2JqZWN0ID0ge1xuICogICAgIHVwZGF0ZTogZnVuY3Rpb24odGltZSl7XG4gKiAgICAgICAgIC8vIHVwZGF0ZSBteSBnYW1leSBzdGF0ZVxuICogICAgIH1cbiAqIH1cbiAqXG4gKiBteUdhbWUudXBkYXRlLmFkZChnYW1lT2JqZWN0MSk7XG4gKlxuICogbXlHYW1lLnVwZGF0ZS5lbWl0KHRpbWUpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmdW5jdGlvbiBuYW1lIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBvbiB0aGUgbGlzdGVuZXJzIGFkZGVkIHRvIHRoaXMgUnVubmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJ1bm5lcihuYW1lKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuX2FsaWFzQ291bnQgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaC9Ccm9hZGNhc3QgUnVubmVyIHRvIGFsbCBsaXN0ZW5lcnMgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gZWFjaCBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1BJWEkuUnVubmVyfVxuICAgICAqL1xuICAgIFJ1bm5lci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heCBhcmd1bWVudHMgcmVhY2hlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIG5hbWUgPSBfYS5uYW1lLCBpdGVtcyA9IF9hLml0ZW1zO1xuICAgICAgICB0aGlzLl9hbGlhc0NvdW50Kys7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaXRlbXNbaV1bbmFtZV0oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbXMgPT09IHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsaWFzQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFJ1bm5lci5wcm90b3R5cGUuZW5zdXJlTm9uQWxpYXNlZEl0ZW1zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fYWxpYXNDb3VudCA+IDAgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGlhc0NvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byB0aGUgUnVubmVyXG4gICAgICpcbiAgICAgKiBSdW5uZXJzIGRvIG5vdCBuZWVkIHRvIGhhdmUgc2NvcGUgb3IgZnVuY3Rpb25zIHBhc3NlZCB0byB0aGVtLlxuICAgICAqIEFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRvIHBhc3MgdGhlIGxpc3RlbmluZyBvYmplY3QgYW5kIGVuc3VyZSB0aGF0IGl0IGhhcyBjb250YWlucyBhIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWVcbiAgICAgKiBhcyB0aGUgbmFtZSBwcm92aWRlZCB0byB0aGUgUnVubmVyIHdoZW4gaXQgd2FzIGNyZWF0ZWQuXG4gICAgICpcbiAgICAgKiBFZyBBIGxpc3RlbmVyIHBhc3NlZCB0byB0aGlzIFJ1bm5lciB3aWxsIHJlcXVpcmUgYSAnY29tcGxldGUnIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogaW1wb3J0IHsgUnVubmVyIH0gZnJvbSAnQHBpeGkvcnVubmVyJztcbiAgICAgKlxuICAgICAqIGNvbnN0IGNvbXBsZXRlID0gbmV3IFJ1bm5lcignY29tcGxldGUnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBzY29wZSB1c2VkIHdpbGwgYmUgdGhlIG9iamVjdCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSAtIFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIGxpc3RlbmluZy5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJ1bm5lcn1cbiAgICAgKi9cbiAgICBSdW5uZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtW3RoaXMuX25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZU5vbkFsaWFzZWRJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBzaW5nbGUgbGlzdGVuZXIgZnJvbSB0aGUgZGlzcGF0Y2ggcXVldWUuXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gLSBUaGUgbGlzdGVuciB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJ1bm5lcn1cbiAgICAgKi9cbiAgICBSdW5uZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVOb25BbGlhc2VkSXRlbXMoKTtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeSBpbiB0aGUgUnVubmVyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gLSBUaGUgbGlzdGVuZXIgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBjaGVjay5cbiAgICAgKi9cbiAgICBSdW5uZXIucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSAhPT0gLTE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGxpc3RlbmVycyBmcm9tIHRoZSBSdW5uZXJcbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJ1bm5lcn1cbiAgICAgKi9cbiAgICBSdW5uZXIucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVOb25BbGlhc2VkSXRlbXMoKTtcbiAgICAgICAgdGhpcy5pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgcmVmZXJlbmNlcywgZG9uJ3QgdXNlIGFmdGVyIHRoaXMuXG4gICAgICovXG4gICAgUnVubmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUFsbCgpO1xuICAgICAgICB0aGlzLml0ZW1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG51bGw7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUnVubmVyLnByb3RvdHlwZSwgXCJlbXB0eVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgdHJ1ZWAgaWYgdGhlcmUgYXJlIG5vIHRoaXMgUnVubmVyIGNvbnRhaW5zIG5vIGxpc3RlbmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID09PSAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUnVubmVyLnByb3RvdHlwZSwgXCJuYW1lXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBydW5uZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUnVubmVyO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJ1bm5lci5wcm90b3R5cGUsIHtcbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgYGVtaXRgXG4gICAgICogQG1lbWJlcm9mIFBJWEkuUnVubmVyI1xuICAgICAqIEBtZXRob2QgZGlzcGF0Y2hcbiAgICAgKiBAc2VlIFBJWEkuUnVubmVyI2VtaXRcbiAgICAgKi9cbiAgICBkaXNwYXRjaDogeyB2YWx1ZTogUnVubmVyLnByb3RvdHlwZS5lbWl0IH0sXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIGBlbWl0YFxuICAgICAqIEBtZW1iZXJvZiBQSVhJLlJ1bm5lciNcbiAgICAgKiBAbWV0aG9kIHJ1blxuICAgICAqIEBzZWUgUElYSS5SdW5uZXIjZW1pdFxuICAgICAqL1xuICAgIHJ1bjogeyB2YWx1ZTogUnVubmVyLnByb3RvdHlwZS5lbWl0IH0sXG59KTtcblxuZXhwb3J0IHsgUnVubmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ydW5uZXIuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL2NvcmUgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvY29yZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFJ1bm5lciB9IGZyb20gJ0BwaXhpL3J1bm5lcic7XG5pbXBvcnQgeyBkZXRlcm1pbmVDcm9zc09yaWdpbiwgaXNQb3cyLCBCYXNlVGV4dHVyZUNhY2hlLCBUZXh0dXJlQ2FjaGUsIHVpZCwgRXZlbnRFbWl0dGVyLCBnZXRSZXNvbHV0aW9uT2ZVcmwsIG5leHRQb3cyLCBpc01vYmlsZSwgUHJvZ3JhbUNhY2hlLCByZW1vdmVJdGVtcywgaGV4MnN0cmluZywgaGV4MnJnYiwgZGVwcmVjYXRpb24sIGlzV2ViR0xTdXBwb3J0ZWQsIHNheUhlbGxvLCBwcmVtdWx0aXBseUJsZW5kTW9kZSwgbG9nMiwgcHJlbXVsdGlwbHlUaW50IH0gZnJvbSAnQHBpeGkvdXRpbHMnO1xuaW1wb3J0IHsgQUxQSEFfTU9ERVMsIFNDQUxFX01PREVTLCBGT1JNQVRTLCBUWVBFUywgVEFSR0VUUywgRFJBV19NT0RFUywgRU5WLCBNQVNLX1RZUEVTLCBQUkVDSVNJT04sIEJMRU5EX01PREVTLCBHQ19NT0RFUywgTUlQTUFQX01PREVTLCBXUkFQX01PREVTLCBSRU5ERVJFUl9UWVBFIH0gZnJvbSAnQHBpeGkvY29uc3RhbnRzJztcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSAnQHBpeGkvc2V0dGluZ3MnO1xuaW1wb3J0IHsgVGlja2VyIH0gZnJvbSAnQHBpeGkvdGlja2VyJztcbmltcG9ydCB7IGdyb3VwRDgsIFJlY3RhbmdsZSwgUG9pbnQsIE1hdHJpeCB9IGZyb20gJ0BwaXhpL21hdGgnO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnQHBpeGkvZGlzcGxheSc7XG5cbi8qKlxuICogQmFzZSByZXNvdXJjZSBjbGFzcyBmb3IgdGV4dHVyZXMgdGhhdCBtYW5hZ2VzIHZhbGlkYXRpb24gYW5kIHVwbG9hZGluZywgZGVwZW5kaW5nIG9uIGl0cyB0eXBlLlxuICpcbiAqIFVwbG9hZGluZyBvZiBhIGJhc2UgdGV4dHVyZSB0byB0aGUgR1BVIGlzIHJlcXVpcmVkLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkucmVzb3VyY2VzXG4gKi9cbnZhciBSZXNvdXJjZSA9IGZ1bmN0aW9uIFJlc291cmNlKHdpZHRoLCBoZWlnaHQpXG57XG4gICAgaWYgKCB3aWR0aCA9PT0gdm9pZCAwICkgd2lkdGggPSAwO1xuICAgIGlmICggaGVpZ2h0ID09PSB2b2lkIDAgKSBoZWlnaHQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgd2lkdGggb2YgdGhlIHJlc291cmNlXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgaGVpZ2h0IG9mIHRoZSByZXNvdXJjZVxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogSWYgcmVzb3VyY2UgaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgcmVzb3VyY2UgaXMgY3JlYXRlZCBieSBCYXNlVGV4dHVyZVxuICAgICAqIHVzZWZ1bCBmb3IgZG9pbmcgY2xlYW51cCB3aXRoIEJhc2VUZXh0dXJlIGRlc3Ryb3lcbiAgICAgKiBhbmQgbm90IGNsZWFuaW5nIHVwIHJlc291cmNlcyB0aGF0IHdlcmUgY3JlYXRlZFxuICAgICAqIGV4dGVybmFsbHkuXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgdGhpcy5pbnRlcm5hbCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogTWluaS1ydW5uZXIgZm9yIGhhbmRsaW5nIHJlc2l6ZSBldmVudHNcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1J1bm5lcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMub25SZXNpemUgPSBuZXcgUnVubmVyKCdzZXRSZWFsU2l6ZScsIDIpO1xuXG4gICAgLyoqXG4gICAgICogTWluaS1ydW5uZXIgZm9yIGhhbmRsaW5nIHVwZGF0ZSBldmVudHNcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1J1bm5lcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMub25VcGRhdGUgPSBuZXcgUnVubmVyKCd1cGRhdGUnKTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbnRlcm5hbCBlcnJvcnMsIHN1Y2ggYXMgbG9hZGluZyBlcnJvcnNcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1J1bm5lcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMub25FcnJvciA9IG5ldyBSdW5uZXIoJ29uRXJyb3InLCAxKTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHZhbGlkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vKipcbiAqIEJpbmQgdG8gYSBwYXJlbnQgQmFzZVRleHR1cmVcbiAqXG4gKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gUGFyZW50IHRleHR1cmVcbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiBiaW5kIChiYXNlVGV4dHVyZSlcbntcbiAgICB0aGlzLm9uUmVzaXplLmFkZChiYXNlVGV4dHVyZSk7XG4gICAgdGhpcy5vblVwZGF0ZS5hZGQoYmFzZVRleHR1cmUpO1xuICAgIHRoaXMub25FcnJvci5hZGQoYmFzZVRleHR1cmUpO1xuXG4gICAgLy8gQ2FsbCBhIHJlc2l6ZSBpbW1lZGlhdGUgaWYgd2UgYWxyZWFkeVxuICAgIC8vIGhhdmUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHJlc291cmNlXG4gICAgaWYgKHRoaXMuX3dpZHRoIHx8IHRoaXMuX2hlaWdodClcbiAgICB7XG4gICAgICAgIHRoaXMub25SZXNpemUucnVuKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVW5iaW5kIHRvIGEgcGFyZW50IEJhc2VUZXh0dXJlXG4gKlxuICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfSBiYXNlVGV4dHVyZSAtIFBhcmVudCB0ZXh0dXJlXG4gKi9cblJlc291cmNlLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbiB1bmJpbmQgKGJhc2VUZXh0dXJlKVxue1xuICAgIHRoaXMub25SZXNpemUucmVtb3ZlKGJhc2VUZXh0dXJlKTtcbiAgICB0aGlzLm9uVXBkYXRlLnJlbW92ZShiYXNlVGV4dHVyZSk7XG4gICAgdGhpcy5vbkVycm9yLnJlbW92ZShiYXNlVGV4dHVyZSk7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgYSByZXNpemUgZXZlbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCBYIGRpbWVuc2lvblxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBZIGRpbWVuc2lvblxuICovXG5SZXNvdXJjZS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplICh3aWR0aCwgaGVpZ2h0KVxue1xuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5fd2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLl9oZWlnaHQpXG4gICAge1xuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMub25SZXNpemUucnVuKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbn07XG5cbi8qKlxuICogSGFzIGJlZW4gdmFsaWRhdGVkXG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy52YWxpZC5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiAhIXRoaXMuX3dpZHRoICYmICEhdGhpcy5faGVpZ2h0O1xufTtcblxuLyoqXG4gKiBIYXMgYmVlbiB1cGRhdGVkIHRyaWdnZXIgZXZlbnRcbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKVxue1xuICAgIGlmICghdGhpcy5kZXN0cm95ZWQpXG4gICAge1xuICAgICAgICB0aGlzLm9uVXBkYXRlLnJ1bigpO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBzdGFydCBwcmVsb2FkaW5nIGEgcmVzb3VyY2VcbiAqIG9yIGRvIGFueSBvdGhlciBwcmVwYXJlIHN0ZXAuXG4gKiBAcHJvdGVjdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBIYW5kbGUgdGhlIHZhbGlkYXRlIGV2ZW50XG4gKi9cblJlc291cmNlLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gbG9hZCAoKVxue1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG5cbi8qKlxuICogVGhlIHdpZHRoIG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKiBAcmVhZG9ubHlcbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLndpZHRoLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xufTtcblxuLyoqXG4gKiBUaGUgaGVpZ2h0IG9mIHRoZSByZXNvdXJjZS5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKiBAcmVhZG9ubHlcbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmhlaWdodC5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG59O1xuXG4vKipcbiAqIFVwbG9hZHMgdGhlIHRleHR1cmUgb3IgcmV0dXJucyBmYWxzZSBpZiBpdCBjYW50IGZvciBzb21lIHJlYXNvbi4gT3ZlcnJpZGUgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0geWVhaCwgcmVuZGVyZXIhXG4gKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gdGhlIHRleHR1cmVcbiAqIEBwYXJhbSB7UElYSS5HTFRleHR1cmV9IGdsVGV4dHVyZSAtIHRleHR1cmUgaW5zdGFuY2UgZm9yIHRoaXMgd2ViZ2wgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaXMgc3VjY2Vzc1xuICovXG5SZXNvdXJjZS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gdXBsb2FkIChyZW5kZXJlciwgYmFzZVRleHR1cmUsIGdsVGV4dHVyZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xue1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzdHlsZSwgb3B0aW9uYWwgdG8gb3ZlcnJpZGVcbiAqXG4gKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0geWVhaCwgcmVuZGVyZXIhXG4gKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gdGhlIHRleHR1cmVcbiAqIEBwYXJhbSB7UElYSS5HTFRleHR1cmV9IGdsVGV4dHVyZSAtIHRleHR1cmUgaW5zdGFuY2UgZm9yIHRoaXMgd2ViZ2wgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpcyBzdWNjZXNzXG4gKi9cblJlc291cmNlLnByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uIHN0eWxlIChyZW5kZXJlciwgYmFzZVRleHR1cmUsIGdsVGV4dHVyZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xue1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQ2xlYW4gdXAgYW55dGhpbmcsIHRoaXMgaGFwcGVucyB3aGVuIGRlc3Ryb3lpbmcgaXMgcmVhZHkuXG4gKlxuICogQHByb3RlY3RlZFxuICovXG5SZXNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UgKClcbntcbiAgICAvLyBvdmVycmlkZVxufTtcblxuLyoqXG4gKiBDYWxsIHdoZW4gZGVzdHJveWluZyByZXNvdXJjZSwgdW5iaW5kIGFueSBCYXNlVGV4dHVyZSBvYmplY3RcbiAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhcyByZWZlcmVuY2UgY291bnRzIGFyZSBtYWludGFpbmVkXG4gKiBpbnRlcm5hbGx5LlxuICovXG5SZXNvdXJjZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbntcbiAgICBpZiAoIXRoaXMuZGVzdHJveWVkKVxuICAgIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5vbkVycm9yLnJlbW92ZUFsbCgpO1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9uUmVzaXplLnJlbW92ZUFsbCgpO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gbnVsbDtcbiAgICAgICAgdGhpcy5vblVwZGF0ZS5yZW1vdmVBbGwoKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZSA9IG51bGw7XG4gICAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFJlc291cmNlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbi8qKlxuICogQmFzZSBmb3IgYWxsIHRoZSBpbWFnZS9jYW52YXMgcmVzb3VyY2VzXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkucmVzb3VyY2VzLlJlc291cmNlXG4gKiBAbWVtYmVyb2YgUElYSS5yZXNvdXJjZXNcbiAqL1xudmFyIEJhc2VJbWFnZVJlc291cmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUmVzb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBCYXNlSW1hZ2VSZXNvdXJjZShzb3VyY2UpXG4gICAge1xuICAgICAgICB2YXIgd2lkdGggPSBzb3VyY2UubmF0dXJhbFdpZHRoIHx8IHNvdXJjZS52aWRlb1dpZHRoIHx8IHNvdXJjZS53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IHNvdXJjZS5uYXR1cmFsSGVpZ2h0IHx8IHNvdXJjZS52aWRlb0hlaWdodCB8fCBzb3VyY2UuaGVpZ2h0O1xuXG4gICAgICAgIFJlc291cmNlLmNhbGwodGhpcywgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzb3VyY2UgZWxlbWVudFxuICAgICAgICAgKiBAbWVtYmVyIHtIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR8U1ZHRWxlbWVudH1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIGB0cnVlYCwgd2lsbCBmb3JjZSBgdGV4SW1hZ2UyRGAgb3ZlciBgdGV4U3ViSW1hZ2UyRGAgZm9yIHVwbG9hZGluZy5cbiAgICAgICAgICogQ2VydGFpbiB0eXBlcyBvZiBtZWRpYSAoZS5nLiB2aWRlbykgdXNpbmcgYHRleEltYWdlMkRgIGlzIG1vcmUgcGVyZm9ybWFudC5cbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9TdWJJbWFnZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICggUmVzb3VyY2UgKSBCYXNlSW1hZ2VSZXNvdXJjZS5fX3Byb3RvX18gPSBSZXNvdXJjZTtcbiAgICBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSZXNvdXJjZSAmJiBSZXNvdXJjZS5wcm90b3R5cGUgKTtcbiAgICBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCYXNlSW1hZ2VSZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFNldCBjcm9zcyBvcmlnaW4gYmFzZWQgZGV0ZWN0aW5nIHRoZSB1cmwgYW5kIHRoZSBjcm9zc29yaWdpblxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhcHBseSBjcm9zc09yaWdpblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBVUkwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBbY3Jvc3NvcmlnaW49dHJ1ZV0gLSBDcm9zcyBvcmlnaW4gdmFsdWUgdG8gdXNlXG4gICAgICovXG4gICAgQmFzZUltYWdlUmVzb3VyY2UuY3Jvc3NPcmlnaW4gPSBmdW5jdGlvbiBjcm9zc09yaWdpbiAoZWxlbWVudCwgdXJsLCBjcm9zc29yaWdpbilcbiAgICB7XG4gICAgICAgIGlmIChjcm9zc29yaWdpbiA9PT0gdW5kZWZpbmVkICYmIHVybC5pbmRleE9mKCdkYXRhOicpICE9PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBlbGVtZW50LmNyb3NzT3JpZ2luID0gZGV0ZXJtaW5lQ3Jvc3NPcmlnaW4odXJsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcm9zc29yaWdpbiAhPT0gZmFsc2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY3Jvc3NPcmlnaW4gPSB0eXBlb2YgY3Jvc3NvcmlnaW4gPT09ICdzdHJpbmcnID8gY3Jvc3NvcmlnaW4gOiAnYW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgdGhlIHRleHR1cmUgdG8gdGhlIEdQVS5cbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIFVwbG9hZCB0byB0aGUgcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIFJlZmVyZW5jZSB0byBwYXJlbnQgdGV4dHVyZVxuICAgICAqIEBwYXJhbSB7UElYSS5HTFRleHR1cmV9IGdsVGV4dHVyZVxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MVmlkZW9FbGVtZW50fFNWR0VsZW1lbnR9IFtzb3VyY2VdIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpcyBzdWNjZXNzXG4gICAgICovXG4gICAgQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uIHVwbG9hZCAocmVuZGVyZXIsIGJhc2VUZXh0dXJlLCBnbFRleHR1cmUsIHNvdXJjZSlcbiAgICB7XG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuICAgICAgICB2YXIgd2lkdGggPSBiYXNlVGV4dHVyZS5yZWFsV2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBiYXNlVGV4dHVyZS5yZWFsSGVpZ2h0O1xuXG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZSB8fCB0aGlzLnNvdXJjZTtcblxuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGJhc2VUZXh0dXJlLmFscGhhTW9kZSA9PT0gQUxQSEFfTU9ERVMuVU5QQUNLKTtcblxuICAgICAgICBpZiAoIXRoaXMubm9TdWJJbWFnZVxuICAgICAgICAgICAgJiYgYmFzZVRleHR1cmUudGFyZ2V0ID09PSBnbC5URVhUVVJFXzJEXG4gICAgICAgICAgICAmJiBnbFRleHR1cmUud2lkdGggPT09IHdpZHRoXG4gICAgICAgICAgICAmJiBnbFRleHR1cmUuaGVpZ2h0ID09PSBoZWlnaHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFzZVRleHR1cmUuZm9ybWF0LCBiYXNlVGV4dHVyZS50eXBlLCBzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZ2xUZXh0dXJlLndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICBnbFRleHR1cmUuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGJhc2VUZXh0dXJlLnRhcmdldCwgMCwgYmFzZVRleHR1cmUuZm9ybWF0LCBiYXNlVGV4dHVyZS5mb3JtYXQsIGJhc2VUZXh0dXJlLnR5cGUsIHNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHNvdXJjZSB3aWR0aC9oZWlnaHQgd2FzIGNoYW5nZWQsIHJlc2l6ZSBjYW4gY2F1c2UgZXh0cmEgYmFzZVRleHR1cmUgdXBkYXRlLlxuICAgICAqIFRyaWdnZXJzIG9uZSB1cGRhdGUgaW4gYW55IGNhc2UuXG4gICAgICovXG4gICAgQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2lkdGggPSB0aGlzLnNvdXJjZS5uYXR1cmFsV2lkdGggfHwgdGhpcy5zb3VyY2UudmlkZW9XaWR0aCB8fCB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuc291cmNlLm5hdHVyYWxIZWlnaHQgfHwgdGhpcy5zb3VyY2UudmlkZW9IZWlnaHQgfHwgdGhpcy5zb3VyY2UuaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGlzIEJhc2VJbWFnZVJlc291cmNlXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfSBbZnJvbVRleHR1cmVdIE9wdGlvbmFsIGJhc2UgdGV4dHVyZVxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IERlc3Ryb3kgd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UgKClcbiAgICB7XG4gICAgICAgIHRoaXMuc291cmNlID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEJhc2VJbWFnZVJlc291cmNlO1xufShSZXNvdXJjZSkpO1xuXG4vKipcbiAqIFJlc291cmNlIHR5cGUgZm9yIEhUTUxJbWFnZUVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkucmVzb3VyY2VzLkJhc2VJbWFnZVJlc291cmNlXG4gKiBAbWVtYmVyb2YgUElYSS5yZXNvdXJjZXNcbiAqL1xudmFyIEltYWdlUmVzb3VyY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChCYXNlSW1hZ2VSZXNvdXJjZSkge1xuICAgIGZ1bmN0aW9uIEltYWdlUmVzb3VyY2Uoc291cmNlLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcblxuICAgICAgICAgICAgQmFzZUltYWdlUmVzb3VyY2UuY3Jvc3NPcmlnaW4oaW1hZ2VFbGVtZW50LCBzb3VyY2UsIG9wdGlvbnMuY3Jvc3NvcmlnaW4pO1xuXG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc3JjID0gc291cmNlO1xuICAgICAgICAgICAgc291cmNlID0gaW1hZ2VFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgQmFzZUltYWdlUmVzb3VyY2UuY2FsbCh0aGlzLCBzb3VyY2UpO1xuXG4gICAgICAgIC8vIEZpcmVGb3ggNjgsIGFuZCBwb3NzaWJseSBvdGhlciB2ZXJzaW9ucywgc2VlbXMgbGlrZSBzZXR0aW5nIHRoZSBIVE1MSW1hZ2VFbGVtZW50I3dpZHRoIGFuZCAjaGVpZ2h0XG4gICAgICAgIC8vIHRvIG5vbi16ZXJvIHZhbHVlcyBiZWZvcmUgaXRzIGxvYWRpbmcgY29tcGxldGVzIGlmIGltYWdlcyBhcmUgaW4gYSBjYWNoZS5cbiAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGlzLCBuZWVkIHRvIHNldCB0aGUgYF93aWR0aGAgYW5kIHRoZSBgX2hlaWdodGAgdG8gemVybyB0byBhdm9pZCB1cGxvYWRpbmcgaW5jb21wbGV0ZSBpbWFnZXMuXG4gICAgICAgIC8vIFBsZWFzZSByZWZlciB0byB0aGUgaXNzdWUgIzU5NjggKGh0dHBzOi8vZ2l0aHViLmNvbS9waXhpanMvcGl4aS5qcy9pc3N1ZXMvNTk2OCkuXG4gICAgICAgIGlmICghc291cmNlLmNvbXBsZXRlICYmICEhdGhpcy5fd2lkdGggJiYgISF0aGlzLl9oZWlnaHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVVJMIG9mIHRoZSBpbWFnZSBzb3VyY2VcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cmwgPSBzb3VyY2Uuc3JjO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIHByb2Nlc3MgaXMgY29tcGxldGVkXG4gICAgICAgICAqIEBtZW1iZXIge1Byb21pc2U8dm9pZD59XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9wcm9jZXNzID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlIGltYWdlIHNob3VsZCBiZSBkaXNwb3NlZCBhZnRlciB1cGxvYWRcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJlc2VydmVCaXRtYXAgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgY2FwYWJsZSwgY29udmVydCB0aGUgaW1hZ2UgdXNpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgQVBJXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuc2V0dGluZ3MuQ1JFQVRFX0lNQUdFX0JJVE1BUFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jcmVhdGVCaXRtYXAgPSAob3B0aW9ucy5jcmVhdGVCaXRtYXAgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBvcHRpb25zLmNyZWF0ZUJpdG1hcCA6IHNldHRpbmdzLkNSRUFURV9JTUFHRV9CSVRNQVApICYmICEhd2luZG93LmNyZWF0ZUltYWdlQml0bWFwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb250cm9scyB0ZXh0dXJlIGFscGhhTW9kZSBmaWVsZFxuICAgICAgICAgKiBDb3BpZXMgZnJvbSBvcHRpb25zXG4gICAgICAgICAqIERlZmF1bHQgaXMgYG51bGxgLCBjb3BpZXMgb3B0aW9uIGZyb20gYmFzZVRleHR1cmVcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5BTFBIQV9NT0RFU3xudWxsfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWxwaGFNb2RlID0gdHlwZW9mIG9wdGlvbnMuYWxwaGFNb2RlID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuYWxwaGFNb2RlIDogbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHRyaWdnZXJzIGRlcHJlY2F0aW9uXG4gICAgICAgICAgICB0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBvcHRpb25zLnByZW11bHRpcGx5QWxwaGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIEltYWdlQml0bWFwIGVsZW1lbnQgY3JlYXRlZCBmb3IgSFRNTEltYWdlRWxlbWVudFxuICAgICAgICAgKiBAbWVtYmVyIHtJbWFnZUJpdG1hcH1cbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iaXRtYXAgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9taXNlIHdoZW4gbG9hZGluZ1xuICAgICAgICAgKiBAbWVtYmVyIHtQcm9taXNlPHZvaWQ+fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9sb2FkID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdXRvTG9hZCAhPT0gZmFsc2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBCYXNlSW1hZ2VSZXNvdXJjZSApIEltYWdlUmVzb3VyY2UuX19wcm90b19fID0gQmFzZUltYWdlUmVzb3VyY2U7XG4gICAgSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCYXNlSW1hZ2VSZXNvdXJjZSAmJiBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUgKTtcbiAgICBJbWFnZVJlc291cmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltYWdlUmVzb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGEgcHJvbWlzZSB3aGVuIGltYWdlIHdpbGwgYmUgbG9hZGVkIGFuZCBwcm9jZXNzZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NyZWF0ZUJpdG1hcD10cnVlXSB3aGV0aGVyIHByb2Nlc3MgaW1hZ2UgaW50byBiaXRtYXBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBJbWFnZVJlc291cmNlLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gbG9hZCAoY3JlYXRlQml0bWFwKVxuICAgIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNyZWF0ZUJpdG1hcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJpdG1hcCA9IGNyZWF0ZUJpdG1hcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB0aGlzJDEudXJsID0gdGhpcyQxLnNvdXJjZS5zcmM7XG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcyQxO1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHJlZi5zb3VyY2U7XG5cbiAgICAgICAgICAgIHZhciBjb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMkMS5kZXN0cm95ZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvdXJjZS5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHNvdXJjZS5vbmVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHRoaXMkMS5yZXNpemUoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzJDEuX2xvYWQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMkMS5jcmVhdGVCaXRtYXApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMkMS5wcm9jZXNzKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMkMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jb21wbGV0ZSAmJiBzb3VyY2Uuc3JjKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNvdXJjZS5vbmxvYWQgPSBjb21wbGV0ZWQ7XG4gICAgICAgICAgICAgICAgc291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWRzIFByb21pc2UgZnJlZXppbmcgd2hlbiByZXNvdXJjZSBicm9rZW5cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLm9uRXJyb3IuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHdlIG5lZWQgdG8gY29udmVydCBpbWFnZSBpbnRvIEJpdG1hcEltYWdlLlxuICAgICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHJlYWwgcHJvbWlzZSBpcyBjYWNoZWQgaW5zaWRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IGNhY2hlZCBwcm9taXNlIHRvIGZpbGwgdGhhdCBiaXRtYXBcbiAgICAgKi9cbiAgICBJbWFnZVJlc291cmNlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyAoKVxuICAgIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3MgIT09IG51bGwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmJpdG1hcCAhPT0gbnVsbCB8fCAhd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJvY2VzcyA9IHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCh0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIDAsIDAsIHRoaXMuc291cmNlLndpZHRoLCB0aGlzLnNvdXJjZS5oZWlnaHQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlbXVsdGlwbHlBbHBoYTogdGhpcy5wcmVtdWx0aXBseUFscGhhID09PSBBTFBIQV9NT0RFUy5VTlBBQ0sgPyAncHJlbXVsdGlwbHknIDogJ25vbmUnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaXRtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcyQxLmRlc3Ryb3llZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzJDEuYml0bWFwID0gYml0bWFwO1xuICAgICAgICAgICAgICAgIHRoaXMkMS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzJDEuX3Byb2Nlc3MgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzJDEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3M7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgaW1hZ2UgcmVzb3VyY2UgdG8gR1BVLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFJlbmRlcmVyIHRvIHVwbG9hZCB0b1xuICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBCYXNlVGV4dHVyZSBmb3IgdGhpcyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSB7UElYSS5HTFRleHR1cmV9IGdsVGV4dHVyZSAtIEdMVGV4dHVyZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpcyBzdWNjZXNzXG4gICAgICovXG4gICAgSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gdXBsb2FkIChyZW5kZXJlciwgYmFzZVRleHR1cmUsIGdsVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbHBoYU1vZGUgPT09ICdudW1iZXInKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBiaXRtYXAgc3RvcmVzIHVucGFjayBwcmVtdWx0aXBseSBmbGFnLCB3ZSBkb250IGhhdmUgdG8gbm90aWZ5IHRleEltYWdlMkQgYWJvdXQgaXRcblxuICAgICAgICAgICAgYmFzZVRleHR1cmUuYWxwaGFNb2RlID0gdGhpcy5hbHBoYU1vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY3JlYXRlQml0bWFwKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlLnVwbG9hZC5jYWxsKHRoaXMsIHJlbmRlcmVyLCBiYXNlVGV4dHVyZSwgZ2xUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYml0bWFwKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB5ZWFoLCBpZ25vcmUgdGhlIG91dHB1dFxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYml0bWFwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEJhc2VJbWFnZVJlc291cmNlLnByb3RvdHlwZS51cGxvYWQuY2FsbCh0aGlzLCByZW5kZXJlciwgYmFzZVRleHR1cmUsIGdsVGV4dHVyZSwgdGhpcy5iaXRtYXApO1xuXG4gICAgICAgIGlmICghdGhpcy5wcmVzZXJ2ZUJpdG1hcClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gY2hlY2tzIGlmIHRoZXJlIGFyZSBvdGhlciByZW5kZXJlcnMgdGhhdCBwb3NzaWJseSBuZWVkIHRoaXMgYml0bWFwXG5cbiAgICAgICAgICAgIHZhciBmbGFnID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGJhc2VUZXh0dXJlLl9nbFRleHR1cmVzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlclRleCA9IGJhc2VUZXh0dXJlLl9nbFRleHR1cmVzW2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAob3RoZXJUZXggIT09IGdsVGV4dHVyZSAmJiBvdGhlclRleC5kaXJ0eUlkICE9PSBiYXNlVGV4dHVyZS5kaXJ0eUlkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmbGFnKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJpdG1hcC5jbG9zZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYml0bWFwLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5iaXRtYXAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dHVyZVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIEltYWdlUmVzb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlICgpXG4gICAge1xuICAgICAgICB0aGlzLnNvdXJjZS5vbmxvYWQgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZS5vbmVycm9yID0gbnVsbDtcblxuICAgICAgICBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmJpdG1hcClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iaXRtYXAuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuYml0bWFwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcm9jZXNzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9hZCA9IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiBJbWFnZVJlc291cmNlO1xufShCYXNlSW1hZ2VSZXNvdXJjZSkpO1xuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgaW5zdGFsbGVkIHJlc291cmNlIHR5cGVzLCBjbGFzcyBtdXN0IGV4dGVuZCB7QGxpbmsgUElYSS5yZXNvdXJjZXMuUmVzb3VyY2V9LlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIEN1c3RvbVJlc291cmNlIGV4dGVuZHMgUElYSS5yZXNvdXJjZXMuUmVzb3VyY2Uge1xuICogICAvLyBNVVNUIGhhdmUgc291cmNlLCBvcHRpb25zIGNvbnN0cnVjdG9yIHNpZ25hdHVyZVxuICogICAvLyBmb3IgYXV0by1kZXRlY3RlZCByZXNvdXJjZXMgdG8gYmUgY3JlYXRlZC5cbiAqICAgY29uc3RydWN0b3Ioc291cmNlLCBvcHRpb25zKSB7XG4gKiAgICAgc3VwZXIoKTtcbiAqICAgfVxuICogICB1cGxvYWQocmVuZGVyZXIsIGJhc2VUZXh0dXJlLCBnbFRleHR1cmUpIHtcbiAqICAgICAvLyB1cGxvYWQgd2l0aCBHTFxuICogICAgIHJldHVybiB0cnVlO1xuICogICB9XG4gKiAgIC8vIHVzZWQgdG8gYXV0by1kZXRlY3QgcmVzb3VyY2VcbiAqICAgc3RhdGljIHRlc3Qoc291cmNlLCBleHRlbnNpb24pIHtcbiAqICAgICByZXR1cm4gZXh0ZW5zaW9uID09PSAneHl6J3x8IHNvdXJjZSBpbnN0YW5jZW9mIFNvbWVDbGFzcztcbiAqICAgfVxuICogfVxuICogLy8gSW5zdGFsbCB0aGUgbmV3IHJlc291cmNlIHR5cGVcbiAqIFBJWEkucmVzb3VyY2VzLklOU1RBTExFRC5wdXNoKEN1c3RvbVJlc291cmNlKTtcbiAqXG4gKiBAbmFtZSBQSVhJLnJlc291cmNlcy5JTlNUQUxMRURcbiAqIEB0eXBlIHtBcnJheTwqPn1cbiAqIEBzdGF0aWNcbiAqIEByZWFkb25seVxuICovXG52YXIgSU5TVEFMTEVEID0gW107XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVzb3VyY2UgZWxlbWVudCBmcm9tIGEgc2luZ2xlIHNvdXJjZSBlbGVtZW50LiBUaGlzXG4gKiBhdXRvLWRldGVjdHMgd2hpY2ggdHlwZSBvZiByZXNvdXJjZSB0byBjcmVhdGUuIEFsbCByZXNvdXJjZXMgdGhhdFxuICogYXJlIGF1dG8tZGV0ZWN0YWJsZSBtdXN0IGhhdmUgYSBzdGF0aWMgYHRlc3RgIG1ldGhvZCBhbmQgYSBjb25zdHJ1Y3RvclxuICogd2l0aCB0aGUgYXJndW1lbnRzIGAoc291cmNlLCBvcHRpb25zPylgLiBDdXJyZW50bHksIHRoZSBzdXBwb3J0ZWRcbiAqIHJlc291cmNlcyBmb3IgYXV0by1kZXRlY3Rpb24gaW5jbHVkZTpcbiAqICAtIHtAbGluayBQSVhJLnJlc291cmNlcy5JbWFnZVJlc291cmNlfVxuICogIC0ge0BsaW5rIFBJWEkucmVzb3VyY2VzLkNhbnZhc1Jlc291cmNlfVxuICogIC0ge0BsaW5rIFBJWEkucmVzb3VyY2VzLlZpZGVvUmVzb3VyY2V9XG4gKiAgLSB7QGxpbmsgUElYSS5yZXNvdXJjZXMuU1ZHUmVzb3VyY2V9XG4gKiAgLSB7QGxpbmsgUElYSS5yZXNvdXJjZXMuQnVmZmVyUmVzb3VyY2V9XG4gKiBAc3RhdGljXG4gKiBAZnVuY3Rpb24gUElYSS5yZXNvdXJjZXMuYXV0b0RldGVjdFJlc291cmNlXG4gKiBAcGFyYW0ge3N0cmluZ3wqfSBzb3VyY2UgLSBSZXNvdXJjZSBzb3VyY2UsIHRoaXMgY2FuIGJlIHRoZSBVUkwgdG8gdGhlIHJlc291cmNlLFxuICogICAgICAgIGEgdHlwZWQtYXJyYXkgKGZvciBCdWZmZXJSZXNvdXJjZSksIEhUTUxWaWRlb0VsZW1lbnQsIFNWRyBkYXRhLXVyaVxuICogICAgICAgIG9yIGFueSBvdGhlciByZXNvdXJjZSB0aGF0IGNhbiBiZSBhdXRvLWRldGVjdGVkLiBJZiBub3QgcmVzb3VyY2UgaXNcbiAqICAgICAgICBkZXRlY3RlZCwgaXQncyBhc3N1bWVkIHRvIGJlIGFuIEltYWdlUmVzb3VyY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gUGFzcy10aHJvdWdoIG9wdGlvbnMgdG8gdXNlIGZvciBSZXNvdXJjZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoXSAtIFdpZHRoIG9mIEJ1ZmZlclJlc291cmNlIG9yIFNWRyByYXN0ZXJpemF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuaGVpZ2h0XSAtIEhlaWdodCBvZiBCdWZmZXJSZXNvdXJjZSBvciBTVkcgcmFzdGVyaXphdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdXRvTG9hZD10cnVlXSAtIEltYWdlLCBTVkcgYW5kIFZpZGVvIGZsYWcgdG8gc3RhcnQgbG9hZGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjYWxlPTFdIC0gU1ZHIHNvdXJjZSBzY2FsZS4gT3ZlcnJpZGRlbiBieSB3aWR0aCwgaGVpZ2h0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNyZWF0ZUJpdG1hcD1QSVhJLnNldHRpbmdzLkNSRUFURV9JTUFHRV9CSVRNQVBdIC0gSW1hZ2Ugb3B0aW9uIHRvIGNyZWF0ZSBCaXRtYXAgb2JqZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNyb3Nzb3JpZ2luPXRydWVdIC0gSW1hZ2UgYW5kIFZpZGVvIG9wdGlvbiB0byBzZXQgY3Jvc3NPcmlnaW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b1BsYXk9dHJ1ZV0gLSBWaWRlbyBvcHRpb24gdG8gc3RhcnQgcGxheWluZyB2aWRlbyBpbW1lZGlhdGVseVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnVwZGF0ZUZQUz0wXSAtIFZpZGVvIG9wdGlvbiB0byB1cGRhdGUgaG93IG1hbnkgdGltZXMgYSBzZWNvbmQgdGhlXG4gKiAgICAgICAgdGV4dHVyZSBzaG91bGQgYmUgdXBkYXRlZCBmcm9tIHRoZSB2aWRlby4gTGVhdmUgYXQgMCB0byB1cGRhdGUgYXQgZXZlcnkgcmVuZGVyXG4gKiBAcmV0dXJuIHtQSVhJLnJlc291cmNlcy5SZXNvdXJjZX0gVGhlIGNyZWF0ZWQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGF1dG9EZXRlY3RSZXNvdXJjZShzb3VyY2UsIG9wdGlvbnMpXG57XG4gICAgaWYgKCFzb3VyY2UpXG4gICAge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgZXh0ZW5zaW9uID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpXG4gICAge1xuICAgICAgICAvLyBzZWFyY2ggZm9yIGZpbGUgZXh0ZW5zaW9uOiBwZXJpb2QsIDMtNCBjaGFycywgdGhlbiA/LCAjIG9yIEVPTFxuICAgICAgICB2YXIgcmVzdWx0ID0gKC9cXC4oXFx3ezMsNH0pKD86JHxcXD98IykvaSkuZXhlYyhzb3VyY2UpO1xuXG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IHJlc3VsdFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IElOU1RBTExFRC5sZW5ndGggLSAxOyBpID49IDA7IC0taSlcbiAgICB7XG4gICAgICAgIHZhciBSZXNvdXJjZVBsdWdpbiA9IElOU1RBTExFRFtpXTtcblxuICAgICAgICBpZiAoUmVzb3VyY2VQbHVnaW4udGVzdCAmJiBSZXNvdXJjZVBsdWdpbi50ZXN0KHNvdXJjZSwgZXh0ZW5zaW9uKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVBsdWdpbihzb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hlbiBpbiBkb3VidDogcHJvYmFibHkgYW4gaW1hZ2VcbiAgICAvLyBtaWdodCBiZSBhcHByb3ByaWF0ZSB0byB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gbnVsbFxuICAgIHJldHVybiBuZXcgSW1hZ2VSZXNvdXJjZShzb3VyY2UsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgU2hhcmVkQXJyYXlCdWZmZXJcbiAqL1xuXG4vKipcbiAqIEJ1ZmZlciByZXNvdXJjZSB3aXRoIGRhdGEgb2YgdHlwZWQgYXJyYXkuXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkucmVzb3VyY2VzLlJlc291cmNlXG4gKiBAbWVtYmVyb2YgUElYSS5yZXNvdXJjZXNcbiAqL1xudmFyIEJ1ZmZlclJlc291cmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUmVzb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBCdWZmZXJSZXNvdXJjZShzb3VyY2UsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdmFyIHdpZHRoID0gcmVmLndpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVmLmhlaWdodDtcblxuICAgICAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyUmVzb3VyY2Ugd2lkdGggb3IgaGVpZ2h0IGludmFsaWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlc291cmNlLmNhbGwodGhpcywgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNvdXJjZSBhcnJheVxuICAgICAgICAgKiBDYW5ub3QgYmUgQ2xhbXBlZFVpbnQ4QXJyYXkgYmVjYXVzZSBpdCBjYW50IGJlIHVwbG9hZGVkIHRvIFdlYkdMXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge0Zsb2F0MzJBcnJheXxVaW50OEFycmF5fFVpbnQzMkFycmF5fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYXRhID0gc291cmNlO1xuICAgIH1cblxuICAgIGlmICggUmVzb3VyY2UgKSBCdWZmZXJSZXNvdXJjZS5fX3Byb3RvX18gPSBSZXNvdXJjZTtcbiAgICBCdWZmZXJSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSZXNvdXJjZSAmJiBSZXNvdXJjZS5wcm90b3R5cGUgKTtcbiAgICBCdWZmZXJSZXNvdXJjZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCdWZmZXJSZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgdGV4dHVyZSB0byB0aGUgR1BVLlxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgVXBsb2FkIHRvIHRoZSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgUmVmZXJlbmNlIHRvIHBhcmVudCB0ZXh0dXJlXG4gICAgICogQHBhcmFtIHtQSVhJLkdMVGV4dHVyZX0gZ2xUZXh0dXJlIGdsVGV4dHVyZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlzIHN1Y2Nlc3NcbiAgICAgKi9cbiAgICBCdWZmZXJSZXNvdXJjZS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gdXBsb2FkIChyZW5kZXJlciwgYmFzZVRleHR1cmUsIGdsVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgYmFzZVRleHR1cmUuYWxwaGFNb2RlID09PSBBTFBIQV9NT0RFUy5VTlBBQ0spO1xuXG4gICAgICAgIGlmIChnbFRleHR1cmUud2lkdGggPT09IGJhc2VUZXh0dXJlLndpZHRoICYmIGdsVGV4dHVyZS5oZWlnaHQgPT09IGJhc2VUZXh0dXJlLmhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgICAgICAgICAgICBiYXNlVGV4dHVyZS50YXJnZXQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUud2lkdGgsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGJhc2VUZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICAgICAgICBiYXNlVGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsVGV4dHVyZS53aWR0aCA9IGJhc2VUZXh0dXJlLndpZHRoO1xuICAgICAgICAgICAgZ2xUZXh0dXJlLmhlaWdodCA9IGJhc2VUZXh0dXJlLmhlaWdodDtcblxuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgICAgICBiYXNlVGV4dHVyZS50YXJnZXQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBnbFRleHR1cmUuaW50ZXJuYWxGb3JtYXQsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUud2lkdGgsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgICAgICAgIGdsVGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IGFuZCBkb24ndCB1c2UgYWZ0ZXIgdGhpc1xuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIEJ1ZmZlclJlc291cmNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBhdXRvLWRldGVjdCB0aGUgdHlwZSBvZiByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0geyp9IHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIDxjYW52YXM+XG4gICAgICovXG4gICAgQnVmZmVyUmVzb3VyY2UudGVzdCA9IGZ1bmN0aW9uIHRlc3QgKHNvdXJjZSlcbiAgICB7XG4gICAgICAgIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXlcbiAgICAgICAgICAgIHx8IHNvdXJjZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICAgIHx8IHNvdXJjZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5O1xuICAgIH07XG5cbiAgICByZXR1cm4gQnVmZmVyUmVzb3VyY2U7XG59KFJlc291cmNlKSk7XG5cbnZhciBkZWZhdWx0QnVmZmVyT3B0aW9ucyA9IHtcbiAgICBzY2FsZU1vZGU6IFNDQUxFX01PREVTLk5FQVJFU1QsXG4gICAgZm9ybWF0OiBGT1JNQVRTLlJHQkEsXG4gICAgYWxwaGFNb2RlOiBBTFBIQV9NT0RFUy5OUE0sXG59O1xuXG4vKipcbiAqIEEgVGV4dHVyZSBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgcmVwcmVzZW50cyBhbiBpbWFnZS5cbiAqIEFsbCB0ZXh0dXJlcyBoYXZlIGEgYmFzZSB0ZXh0dXJlLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlLlxuICogVGhlcmVmb3JlIHlvdSBjYW4gaGF2ZSBtYW55IHRleHR1cmVzIGFsbCB1c2luZyBhIHNpbmdsZSBCYXNlVGV4dHVyZVxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS51dGlscy5FdmVudEVtaXR0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAcGFyYW0ge1BJWEkucmVzb3VyY2VzLlJlc291cmNlfHN0cmluZ3xIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR9IFtyZXNvdXJjZT1udWxsXVxuICogICAgICAgIFRoZSBjdXJyZW50IHJlc291cmNlIHRvIHVzZSwgZm9yIHRoaW5ncyB0aGF0IGFyZW4ndCBSZXNvdXJjZSBvYmplY3RzLCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICAgICAgIGludG8gYSBSZXNvdXJjZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDb2xsZWN0aW9uIG9mIG9wdGlvbnNcbiAqIEBwYXJhbSB7UElYSS5NSVBNQVBfTU9ERVN9IFtvcHRpb25zLm1pcG1hcD1QSVhJLnNldHRpbmdzLk1JUE1BUF9URVhUVVJFU10gLSBJZiBtaXBtYXBwaW5nIGlzIGVuYWJsZWQgZm9yIHRleHR1cmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbmlzb3Ryb3BpY0xldmVsPVBJWEkuc2V0dGluZ3MuQU5JU09UUk9QSUNfTEVWRUxdIC0gQW5pc290cm9waWMgZmlsdGVyaW5nIGxldmVsIG9mIHRleHR1cmVcbiAqIEBwYXJhbSB7UElYSS5XUkFQX01PREVTfSBbb3B0aW9ucy53cmFwTW9kZT1QSVhJLnNldHRpbmdzLldSQVBfTU9ERV0gLSBXcmFwIG1vZGUgZm9yIHRleHR1cmVzXG4gKiBAcGFyYW0ge1BJWEkuU0NBTEVfTU9ERVN9IFtvcHRpb25zLnNjYWxlTW9kZT1QSVhJLnNldHRpbmdzLlNDQUxFX01PREVdIC0gRGVmYXVsdCBzY2FsZSBtb2RlLCBsaW5lYXIsIG5lYXJlc3RcbiAqIEBwYXJhbSB7UElYSS5GT1JNQVRTfSBbb3B0aW9ucy5mb3JtYXQ9UElYSS5GT1JNQVRTLlJHQkFdIC0gR0wgZm9ybWF0IHR5cGVcbiAqIEBwYXJhbSB7UElYSS5UWVBFU30gW29wdGlvbnMudHlwZT1QSVhJLlRZUEVTLlVOU0lHTkVEX0JZVEVdIC0gR0wgZGF0YSB0eXBlXG4gKiBAcGFyYW0ge1BJWEkuVEFSR0VUU30gW29wdGlvbnMudGFyZ2V0PVBJWEkuVEFSR0VUUy5URVhUVVJFXzJEXSAtIEdMIHRleHR1cmUgdGFyZ2V0XG4gKiBAcGFyYW0ge1BJWEkuQUxQSEFfTU9ERVN9IFtvcHRpb25zLmFscGhhTW9kZT1QSVhJLkFMUEhBX01PREVTLlVOUEFDS10gLSBQcmUgbXVsdGlwbHkgdGhlIGltYWdlIGFscGhhXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMud2lkdGg9MF0gLSBXaWR0aCBvZiB0aGUgdGV4dHVyZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodD0wXSAtIEhlaWdodCBvZiB0aGUgdGV4dHVyZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25dIC0gUmVzb2x1dGlvbiBvZiB0aGUgYmFzZSB0ZXh0dXJlXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMucmVzb3VyY2VPcHRpb25zXSAtIE9wdGlvbmFsIHJlc291cmNlIG9wdGlvbnMsXG4gKiAgICAgICAgc2VlIHtAbGluayBQSVhJLnJlc291cmNlcy5hdXRvRGV0ZWN0UmVzb3VyY2UgYXV0b0RldGVjdFJlc291cmNlfVxuICovXG52YXIgQmFzZVRleHR1cmUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChFdmVudEVtaXR0ZXIpIHtcbiAgICBmdW5jdGlvbiBCYXNlVGV4dHVyZShyZXNvdXJjZSwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIGlmICggcmVzb3VyY2UgPT09IHZvaWQgMCApIHJlc291cmNlID0gbnVsbDtcbiAgICAgICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0gbnVsbDtcblxuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB2YXIgYWxwaGFNb2RlID0gb3B0aW9ucy5hbHBoYU1vZGU7XG4gICAgICAgIHZhciBtaXBtYXAgPSBvcHRpb25zLm1pcG1hcDtcbiAgICAgICAgdmFyIGFuaXNvdHJvcGljTGV2ZWwgPSBvcHRpb25zLmFuaXNvdHJvcGljTGV2ZWw7XG4gICAgICAgIHZhciBzY2FsZU1vZGUgPSBvcHRpb25zLnNjYWxlTW9kZTtcbiAgICAgICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0O1xuICAgICAgICB2YXIgd3JhcE1vZGUgPSBvcHRpb25zLndyYXBNb2RlO1xuICAgICAgICB2YXIgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQ7XG4gICAgICAgIHZhciB0eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQ7XG4gICAgICAgIHZhciByZXNvbHV0aW9uID0gb3B0aW9ucy5yZXNvbHV0aW9uO1xuICAgICAgICB2YXIgcmVzb3VyY2VPcHRpb25zID0gb3B0aW9ucy5yZXNvdXJjZU9wdGlvbnM7XG5cbiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzb3VyY2UgdG8gYSBSZXNvdXJjZSBvYmplY3RcbiAgICAgICAgaWYgKHJlc291cmNlICYmICEocmVzb3VyY2UgaW5zdGFuY2VvZiBSZXNvdXJjZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gYXV0b0RldGVjdFJlc291cmNlKHJlc291cmNlLCByZXNvdXJjZU9wdGlvbnMpO1xuICAgICAgICAgICAgcmVzb3VyY2UuaW50ZXJuYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgYmFzZSB0ZXh0dXJlIHNldCB3aGVuIHRoZSBpbWFnZSBoYXMgbG9hZGVkXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggfHwgMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgYmFzZSB0ZXh0dXJlIHNldCB3aGVuIHRoZSBpbWFnZSBoYXMgbG9hZGVkXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodCB8fCAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuc2V0dGluZ3MuUkVTT0xVVElPTlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbiB8fCBzZXR0aW5ncy5SRVNPTFVUSU9OO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaXBtYXAgbW9kZSBvZiB0aGUgdGV4dHVyZSwgYWZmZWN0cyBkb3duc2NhbGVkIGltYWdlc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1JUE1BUF9NT0RFU31cbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5zZXR0aW5ncy5NSVBNQVBfVEVYVFVSRVNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWlwbWFwID0gbWlwbWFwICE9PSB1bmRlZmluZWQgPyBtaXBtYXAgOiBzZXR0aW5ncy5NSVBNQVBfVEVYVFVSRVM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuaXNvdHJvcGljIGZpbHRlcmluZyBsZXZlbCBvZiB0ZXh0dXJlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5zZXR0aW5ncy5BTklTT1RST1BJQ19MRVZFTFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbmlzb3Ryb3BpY0xldmVsID0gYW5pc290cm9waWNMZXZlbCAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9waWNMZXZlbCA6IHNldHRpbmdzLkFOSVNPVFJPUElDX0xFVkVMO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgdGhlIHRleHR1cmUgd3JhcHNcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwTW9kZSA9IHdyYXBNb2RlIHx8IHNldHRpbmdzLldSQVBfTU9ERTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNjYWxlIG1vZGUgdG8gYXBwbHkgd2hlbiBzY2FsaW5nIHRoaXMgdGV4dHVyZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlNDQUxFX01PREVTfVxuICAgICAgICAgKiBAZGVmYXVsdCBQSVhJLnNldHRpbmdzLlNDQUxFX01PREVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2NhbGVNb2RlID0gc2NhbGVNb2RlICE9PSB1bmRlZmluZWQgPyBzY2FsZU1vZGUgOiBzZXR0aW5ncy5TQ0FMRV9NT0RFO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuRk9STUFUU31cbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5GT1JNQVRTLlJHQkFcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0IHx8IEZPUk1BVFMuUkdCQTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgcmVzb3VyY2UgZGF0YVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlRZUEVTfVxuICAgICAgICAgKiBAZGVmYXVsdCBQSVhJLlRZUEVTLlVOU0lHTkVEX0JZVEVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgVFlQRVMuVU5TSUdORURfQllURTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRhcmdldCB0eXBlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuVEFSR0VUU31cbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5UQVJHRVRTLlRFWFRVUkVfMkRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0IHx8IFRBUkdFVFMuVEVYVFVSRV8yRDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSG93IHRvIHRyZWF0IHByZW11bHRpcGxpZWQgYWxwaGEsIHNlZSB7QGxpbmsgUElYSS5BTFBIQV9NT0RFU30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQUxQSEFfTU9ERVN9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuQUxQSEFfTU9ERVMuVU5QQUNLXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFscGhhTW9kZSA9IGFscGhhTW9kZSAhPT0gdW5kZWZpbmVkID8gYWxwaGFNb2RlIDogQUxQSEFfTU9ERVMuVU5QQUNLO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnByZW11bHRpcGx5QWxwaGEgIT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gdHJpZ2dlcnMgZGVwcmVjYXRpb25cbiAgICAgICAgICAgIHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IG9wdGlvbnMucHJlbXVsdGlwbHlBbHBoYTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHbG9iYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgQmFzZVRleHR1cmVcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVpZCA9IHVpZCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIGJ5IGF1dG9tYXRpYyB0ZXh0dXJlIEdhcmJhZ2UgQ29sbGVjdGlvbiwgc3RvcmVzIGxhc3QgR0MgdGljayB3aGVuIGl0IHdhcyBib3VuZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG91Y2hlZCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0ZXh0dXJlIGlzIGEgcG93ZXIgb2YgdHdvLCB0cnkgdG8gdXNlIHBvd2VyIG9mIHR3byB0ZXh0dXJlcyBhcyBtdWNoXG4gICAgICAgICAqIGFzIHlvdSBjYW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUG93ZXJPZlR3byA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yZWZyZXNoUE9UKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtYXAgb2YgcmVuZGVyIGNvbnRleHQgdGV4dHVyZXMgd2hlcmUgdGhpcyBpcyBib3VuZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9nbFRleHR1cmVzID0ge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgYnkgVGV4dHVyZVN5c3RlbSB0byBvbmx5IHVwZGF0ZSB0ZXh0dXJlIHRvIHRoZSBHUFUgd2hlbiBuZWVkZWQuXG4gICAgICAgICAqIFBsZWFzZSBjYWxsIGB1cGRhdGUoKWAgdG8gaW5jcmVtZW50IGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXJ0eUlkID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCBieSBUZXh0dXJlU3lzdGVtIHRvIG9ubHkgdXBkYXRlIHRleHR1cmUgc3R5bGUgd2hlbiBuZWVkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXJ0eVN0eWxlSWQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50bHkgZGVmYXVsdCBjYWNoZSBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZUlkID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2VuZXJhbGx5IHNwZWFraW5nIG1lYW5zIHdoZW4gcmVzb3VyY2UgaXMgbG9hZGVkLlxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsaWQgPSB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNvbGxlY3Rpb24gb2YgYWx0ZXJuYXRpdmUgY2FjaGUgaWRzLCBzaW5jZSBzb21lIEJhc2VUZXh0dXJlc1xuICAgICAgICAgKiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIElELCBzaG9ydCBuYW1lIGFuZCBsb25nZXIgZnVsbCBVUkxcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7QXJyYXk8c3RyaW5nPn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRleHR1cmVDYWNoZUlkcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGFnIGlmIEJhc2VUZXh0dXJlIGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcmVzb3VyY2UgdXNlZCBieSB0aGlzIEJhc2VUZXh0dXJlLCB0aGVyZSBjYW4gb25seVxuICAgICAgICAgKiBiZSBvbmUgcmVzb3VyY2UgcGVyIEJhc2VUZXh0dXJlLCBidXQgdGV4dHVyZXMgY2FuIHNoYXJlXG4gICAgICAgICAqIHJlc291cmNlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5yZXNvdXJjZXMuUmVzb3VyY2V9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE51bWJlciBvZiB0aGUgdGV4dHVyZSBiYXRjaCwgdXNlZCBieSBtdWx0aS10ZXh0dXJlIHJlbmRlcmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9iYXRjaEVuYWJsZWQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2NhdGlvbiBpbnNpZGUgdGV4dHVyZSBiYXRjaCwgdXNlZCBieSBtdWx0aS10ZXh0dXJlIHJlbmRlcmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9iYXRjaExvY2F0aW9uID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiBhIG5vdC1pbW1lZGlhdGVseS1hdmFpbGFibGUgc291cmNlIGZpbmlzaGVzIGxvYWRpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQGV2ZW50IFBJWEkuQmFzZVRleHR1cmUjbG9hZGVkXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBSZXNvdXJjZSBsb2FkZWQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIGEgbm90LWltbWVkaWF0ZWx5LWF2YWlsYWJsZSBzb3VyY2UgZmFpbHMgdG8gbG9hZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAZXZlbnQgUElYSS5CYXNlVGV4dHVyZSNlcnJvclxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gUmVzb3VyY2UgZXJyb3JlZC5cbiAgICAgICAgICogQHBhcmFtIHtFcnJvckV2ZW50fSBldmVudCAtIExvYWQgZXJyb3IgZXZlbnQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIEJhc2VUZXh0dXJlIGlzIHVwZGF0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQGV2ZW50IFBJWEkuQmFzZVRleHR1cmUjbG9hZGVkXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBSZXNvdXJjZSBsb2FkZWQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIEJhc2VUZXh0dXJlIGlzIHVwZGF0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQGV2ZW50IFBJWEkuQmFzZVRleHR1cmUjdXBkYXRlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBJbnN0YW5jZSBvZiB0ZXh0dXJlIGJlaW5nIHVwZGF0ZWQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIEJhc2VUZXh0dXJlIGlzIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAZXZlbnQgUElYSS5CYXNlVGV4dHVyZSNkaXNwb3NlXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBJbnN0YW5jZSBvZiB0ZXh0dXJlIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgICAgICovXG5cbiAgICAgICAgLy8gU2V0IHRoZSByZXNvdXJjZVxuICAgICAgICB0aGlzLnNldFJlc291cmNlKHJlc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoIEV2ZW50RW1pdHRlciApIEJhc2VUZXh0dXJlLl9fcHJvdG9fXyA9IEV2ZW50RW1pdHRlcjtcbiAgICBCYXNlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdmVudEVtaXR0ZXIgJiYgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSApO1xuICAgIEJhc2VUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJhc2VUZXh0dXJlO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgcmVhbFdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHJlYWxIZWlnaHQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIFBpeGVsIHdpZHRoIG9mIHRoZSBzb3VyY2Ugb2YgdGhpcyB0ZXh0dXJlXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJlYWxXaWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgodGhpcy53aWR0aCAqIHRoaXMucmVzb2x1dGlvbikgLSAxZS00KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUGl4ZWwgaGVpZ2h0IG9mIHRoZSBzb3VyY2Ugb2YgdGhpcyB0ZXh0dXJlXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJlYWxIZWlnaHQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKHRoaXMuaGVpZ2h0ICogdGhpcy5yZXNvbHV0aW9uKSAtIDFlLTQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHN0eWxlIG9wdGlvbnMgb2YgQmFzZVRleHR1cmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5TQ0FMRV9NT0RFU30gW3NjYWxlTW9kZV0gLSBQaXhpIHNjYWxlbW9kZVxuICAgICAqIEBwYXJhbSB7UElYSS5NSVBNQVBfTU9ERVN9IFttaXBtYXBdIC0gZW5hYmxlIG1pcG1hcHNcbiAgICAgKiBAcmV0dXJucyB7UElYSS5CYXNlVGV4dHVyZX0gdGhpc1xuICAgICAqL1xuICAgIEJhc2VUZXh0dXJlLnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uIHNldFN0eWxlIChzY2FsZU1vZGUsIG1pcG1hcClcbiAgICB7XG4gICAgICAgIHZhciBkaXJ0eTtcblxuICAgICAgICBpZiAoc2NhbGVNb2RlICE9PSB1bmRlZmluZWQgJiYgc2NhbGVNb2RlICE9PSB0aGlzLnNjYWxlTW9kZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zY2FsZU1vZGUgPSBzY2FsZU1vZGU7XG4gICAgICAgICAgICBkaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlwbWFwICE9PSB1bmRlZmluZWQgJiYgbWlwbWFwICE9PSB0aGlzLm1pcG1hcClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5taXBtYXAgPSBtaXBtYXA7XG4gICAgICAgICAgICBkaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlydHkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZGlydHlTdHlsZUlkKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB3L2gvcmVzb2x1dGlvbi4gVGV4dHVyZSBiZWNvbWVzIHZhbGlkIGlmIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGdyZWF0ZXIgdGhhbiB6ZXJvLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFZpc3VhbCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgVmlzdWFsIGhlaWdodFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzb2x1dGlvbl0gT3B0aW9uYWxseSBzZXQgcmVzb2x1dGlvblxuICAgICAqIEByZXR1cm5zIHtQSVhJLkJhc2VUZXh0dXJlfSB0aGlzXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbiBzZXRTaXplICh3aWR0aCwgaGVpZ2h0LCByZXNvbHV0aW9uKVxuICAgIHtcbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbiB8fCB0aGlzLnJlc29sdXRpb247XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hQT1QoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyByZWFsIHNpemUgb2YgYmFzZVRleHR1cmUsIHByZXNlcnZlcyBjdXJyZW50IHJlc29sdXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVhbFdpZHRoIEZ1bGwgcmVuZGVyZWQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVhbEhlaWdodCBGdWxsIHJlbmRlcmVkIGhlaWdodFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzb2x1dGlvbl0gT3B0aW9uYWxseSBzZXQgcmVzb2x1dGlvblxuICAgICAqIEByZXR1cm5zIHtQSVhJLkJhc2VUZXh0dXJlfSB0aGlzXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUucHJvdG90eXBlLnNldFJlYWxTaXplID0gZnVuY3Rpb24gc2V0UmVhbFNpemUgKHJlYWxXaWR0aCwgcmVhbEhlaWdodCwgcmVzb2x1dGlvbilcbiAgICB7XG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb24gfHwgdGhpcy5yZXNvbHV0aW9uO1xuICAgICAgICB0aGlzLndpZHRoID0gcmVhbFdpZHRoIC8gdGhpcy5yZXNvbHV0aW9uO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHJlYWxIZWlnaHQgLyB0aGlzLnJlc29sdXRpb247XG4gICAgICAgIHRoaXMuX3JlZnJlc2hQT1QoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaCBjaGVjayBmb3IgaXNQb3dlck9mVHdvIHRleHR1cmUgYmFzZWQgb24gc2l6ZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBCYXNlVGV4dHVyZS5wcm90b3R5cGUuX3JlZnJlc2hQT1QgPSBmdW5jdGlvbiBfcmVmcmVzaFBPVCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5pc1Bvd2VyT2ZUd28gPSBpc1BvdzIodGhpcy5yZWFsV2lkdGgpICYmIGlzUG93Mih0aGlzLnJlYWxIZWlnaHQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHJlc29sdXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzb2x1dGlvbl0gcmVzXG4gICAgICogQHJldHVybnMge1BJWEkuQmFzZVRleHR1cmV9IHRoaXNcbiAgICAgKi9cbiAgICBCYXNlVGV4dHVyZS5wcm90b3R5cGUuc2V0UmVzb2x1dGlvbiA9IGZ1bmN0aW9uIHNldFJlc29sdXRpb24gKHJlc29sdXRpb24pXG4gICAge1xuICAgICAgICB2YXIgb2xkUmVzb2x1dGlvbiA9IHRoaXMucmVzb2x1dGlvbjtcblxuICAgICAgICBpZiAob2xkUmVzb2x1dGlvbiA9PT0gcmVzb2x1dGlvbilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbGlkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy53aWR0aCAqIG9sZFJlc29sdXRpb24gLyByZXNvbHV0aW9uO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmhlaWdodCAqIG9sZFJlc29sdXRpb24gLyByZXNvbHV0aW9uO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1cGRhdGUnLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlZnJlc2hQT1QoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVzb3VyY2UgaWYgaXQgd2Fzbid0IHNldC4gVGhyb3dzIGVycm9yIGlmIHJlc291cmNlIGFscmVhZHkgcHJlc2VudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLnJlc291cmNlcy5SZXNvdXJjZX0gcmVzb3VyY2UgLSB0aGF0IGlzIG1hbmFnaW5nIHRoaXMgQmFzZVRleHR1cmVcbiAgICAgKiBAcmV0dXJucyB7UElYSS5CYXNlVGV4dHVyZX0gdGhpc1xuICAgICAqL1xuICAgIEJhc2VUZXh0dXJlLnByb3RvdHlwZS5zZXRSZXNvdXJjZSA9IGZ1bmN0aW9uIHNldFJlc291cmNlIChyZXNvdXJjZSlcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlID09PSByZXNvdXJjZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNvdXJjZSBjYW4gYmUgc2V0IG9ubHkgb25jZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb3VyY2UuYmluZCh0aGlzKTtcblxuICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludmFsaWRhdGVzIHRoZSBvYmplY3QuIFRleHR1cmUgYmVjb21lcyB2YWxpZCBpZiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBncmVhdGVyIHRoYW4gemVyby5cbiAgICAgKi9cbiAgICBCYXNlVGV4dHVyZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpZHRoID4gMCAmJiB0aGlzLmhlaWdodCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdsb2FkZWQnLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3VwZGF0ZScsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eUlkKys7XG4gICAgICAgICAgICB0aGlzLmRpcnR5U3R5bGVJZCsrO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1cGRhdGUnLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggcmVzb3VyY2VzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvckV2ZW50fSBldmVudCAtIEVycm9yIGV2ZW50IGVtaXR0ZWQuXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUucHJvdG90eXBlLm9uRXJyb3IgPSBmdW5jdGlvbiBvbkVycm9yIChldmVudClcbiAgICB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBldmVudCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgYmFzZSB0ZXh0dXJlLlxuICAgICAqIFRoZSBtZXRob2Qgc3RvcHMgaWYgcmVzb3VyY2UgZG9lc24ndCB3YW50IHRoaXMgdGV4dHVyZSB0byBiZSBkZXN0cm95ZWQuXG4gICAgICogUmVtb3ZlcyB0ZXh0dXJlIGZyb20gYWxsIGNhY2hlcy5cbiAgICAgKi9cbiAgICBCYXNlVGV4dHVyZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIC8vIHJlbW92ZSBhbmQgZGVzdHJveSB0aGUgcmVzb3VyY2VcbiAgICAgICAgaWYgKHRoaXMucmVzb3VyY2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2UudW5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgLy8gb25seSBkZXN0cm95IHJlc291cmNlZCBjcmVhdGVkIGludGVybmFsbHlcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlLmludGVybmFsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2UuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZUlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWxldGUgQmFzZVRleHR1cmVDYWNoZVt0aGlzLmNhY2hlSWRdO1xuICAgICAgICAgICAgZGVsZXRlIFRleHR1cmVDYWNoZVt0aGlzLmNhY2hlSWRdO1xuXG4gICAgICAgICAgICB0aGlzLmNhY2hlSWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSBsZXQgdGhlIFdlYkdMIHJlbmRlcmVyIGtub3cuLlxuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcblxuICAgICAgICBCYXNlVGV4dHVyZS5yZW1vdmVGcm9tQ2FjaGUodGhpcyk7XG4gICAgICAgIHRoaXMudGV4dHVyZUNhY2hlSWRzID0gbnVsbDtcblxuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZyZWVzIHRoZSB0ZXh0dXJlIGZyb20gV2ViR0wgbWVtb3J5IHdpdGhvdXQgZGVzdHJveWluZyB0aGlzIHRleHR1cmUgb2JqZWN0LlxuICAgICAqIFRoaXMgbWVhbnMgeW91IGNhbiBzdGlsbCB1c2UgdGhlIHRleHR1cmUgbGF0ZXIgd2hpY2ggd2lsbCB1cGxvYWQgaXQgdG8gR1BVXG4gICAgICogbWVtb3J5IGFnYWluLlxuICAgICAqXG4gICAgICogQGZpcmVzIFBJWEkuQmFzZVRleHR1cmUjZGlzcG9zZVxuICAgICAqL1xuICAgIEJhc2VUZXh0dXJlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNwb3NlJywgdGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBiYXNlIHRleHR1cmUgYmFzZWQgb24gdGhlIHNvdXJjZSB5b3UgcHJvdmlkZS5cbiAgICAgKiBUaGUgc291cmNlIGNhbiBiZSAtIGltYWdlIHVybCwgaW1hZ2UgZWxlbWVudCwgY2FudmFzIGVsZW1lbnQuIElmIHRoZVxuICAgICAqIHNvdXJjZSBpcyBhbiBpbWFnZSB1cmwgb3IgYW4gaW1hZ2UgZWxlbWVudCBhbmQgbm90IGluIHRoZSBiYXNlIHRleHR1cmVcbiAgICAgKiBjYWNoZSwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxTVkdFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR9IHNvdXJjZSAtIFRoZVxuICAgICAqICAgICAgICBzb3VyY2UgdG8gY3JlYXRlIGJhc2UgdGV4dHVyZSBmcm9tLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gU2VlIHtAbGluayBQSVhJLkJhc2VUZXh0dXJlfSdzIGNvbnN0cnVjdG9yIGZvciBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0cmljdF0gRW5mb3JjZSBzdHJpY3QtbW9kZSwgc2VlIHtAbGluayBQSVhJLnNldHRpbmdzLlNUUklDVF9URVhUVVJFX0NBQ0hFfS5cbiAgICAgKiBAcmV0dXJucyB7UElYSS5CYXNlVGV4dHVyZX0gVGhlIG5ldyBiYXNlIHRleHR1cmUuXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUuZnJvbSA9IGZ1bmN0aW9uIGZyb20gKHNvdXJjZSwgb3B0aW9ucywgc3RyaWN0KVxuICAgIHtcbiAgICAgICAgaWYgKCBzdHJpY3QgPT09IHZvaWQgMCApIHN0cmljdCA9IHNldHRpbmdzLlNUUklDVF9URVhUVVJFX0NBQ0hFO1xuXG4gICAgICAgIHZhciBpc0ZyYW1lID0gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBjYWNoZUlkID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNGcmFtZSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2FjaGVJZCA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghc291cmNlLl9waXhpSWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlLl9waXhpSWQgPSBcInBpeGlpZF9cIiArICh1aWQoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhY2hlSWQgPSBzb3VyY2UuX3BpeGlJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiYXNlVGV4dHVyZSA9IEJhc2VUZXh0dXJlQ2FjaGVbY2FjaGVJZF07XG5cbiAgICAgICAgLy8gU3RyaWN0LW1vZGUgcmVqZWN0cyBpbnZhbGlkIGNhY2hlSWRzXG4gICAgICAgIGlmIChpc0ZyYW1lICYmIHN0cmljdCAmJiAhYmFzZVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJUaGUgY2FjaGVJZCBcXFwiXCIgKyBjYWNoZUlkICsgXCJcXFwiIGRvZXMgbm90IGV4aXN0IGluIEJhc2VUZXh0dXJlQ2FjaGUuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYmFzZVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJhc2VUZXh0dXJlID0gbmV3IEJhc2VUZXh0dXJlKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBiYXNlVGV4dHVyZS5jYWNoZUlkID0gY2FjaGVJZDtcbiAgICAgICAgICAgIEJhc2VUZXh0dXJlLmFkZFRvQ2FjaGUoYmFzZVRleHR1cmUsIGNhY2hlSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJhc2VUZXh0dXJlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQmFzZVRleHR1cmUgd2l0aCBhIEJ1ZmZlclJlc291cmNlIGZyb20gYSBGbG9hdDMyQXJyYXkuXG4gICAgICogUkdCQSB2YWx1ZXMgYXJlIGZsb2F0cyBmcm9tIDAgdG8gMS5cbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtGbG9hdDMyQXJyYXl8VWludDhBcnJheX0gYnVmZmVyIFRoZSBvcHRpb25hbCBhcnJheSB0byB1c2UsIGlmIG5vIGRhdGFcbiAgICAgKiAgICAgICAgaXMgcHJvdmlkZWQsIGEgbmV3IEZsb2F0MzJBcnJheSBpcyBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFdpZHRoIG9mIHRoZSByZXNvdXJjZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHJlc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBTZWUge0BsaW5rIFBJWEkuQmFzZVRleHR1cmV9J3MgY29uc3RydWN0b3IgZm9yIG9wdGlvbnMuXG4gICAgICogQHJldHVybiB7UElYSS5CYXNlVGV4dHVyZX0gVGhlIHJlc3VsdGluZyBuZXcgQmFzZVRleHR1cmVcbiAgICAgKi9cbiAgICBCYXNlVGV4dHVyZS5mcm9tQnVmZmVyID0gZnVuY3Rpb24gZnJvbUJ1ZmZlciAoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyIHx8IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcblxuICAgICAgICB2YXIgcmVzb3VyY2UgPSBuZXcgQnVmZmVyUmVzb3VyY2UoYnVmZmVyLCB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSk7XG4gICAgICAgIHZhciB0eXBlID0gYnVmZmVyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gVFlQRVMuRkxPQVQgOiBUWVBFUy5VTlNJR05FRF9CWVRFO1xuXG4gICAgICAgIHJldHVybiBuZXcgQmFzZVRleHR1cmUocmVzb3VyY2UsIE9iamVjdC5hc3NpZ24oZGVmYXVsdEJ1ZmZlck9wdGlvbnMsIG9wdGlvbnMgfHwgeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB0eXBlOiB0eXBlIH0pKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIEJhc2VUZXh0dXJlIHRvIHRoZSBnbG9iYWwgQmFzZVRleHR1cmVDYWNoZS4gVGhpcyBjYWNoZSBpcyBzaGFyZWQgYWNyb3NzIHRoZSB3aG9sZSBQSVhJIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gVGhlIEJhc2VUZXh0dXJlIHRvIGFkZCB0byB0aGUgY2FjaGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIHRoYXQgdGhlIEJhc2VUZXh0dXJlIHdpbGwgYmUgc3RvcmVkIGFnYWluc3QuXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUuYWRkVG9DYWNoZSA9IGZ1bmN0aW9uIGFkZFRvQ2FjaGUgKGJhc2VUZXh0dXJlLCBpZClcbiAgICB7XG4gICAgICAgIGlmIChpZClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGJhc2VUZXh0dXJlLnRleHR1cmVDYWNoZUlkcy5pbmRleE9mKGlkKSA9PT0gLTEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUudGV4dHVyZUNhY2hlSWRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQmFzZVRleHR1cmVDYWNoZVtpZF0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oKFwiQmFzZVRleHR1cmUgYWRkZWQgdG8gdGhlIGNhY2hlIHdpdGggYW4gaWQgW1wiICsgaWQgKyBcIl0gdGhhdCBhbHJlYWR5IGhhZCBhbiBlbnRyeVwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJhc2VUZXh0dXJlQ2FjaGVbaWRdID0gYmFzZVRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgQmFzZVRleHR1cmUgZnJvbSB0aGUgZ2xvYmFsIEJhc2VUZXh0dXJlQ2FjaGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UElYSS5CYXNlVGV4dHVyZX0gYmFzZVRleHR1cmUgLSBpZCBvZiBhIEJhc2VUZXh0dXJlIHRvIGJlIHJlbW92ZWQsIG9yIGEgQmFzZVRleHR1cmUgaW5zdGFuY2UgaXRzZWxmLlxuICAgICAqIEByZXR1cm4ge1BJWEkuQmFzZVRleHR1cmV8bnVsbH0gVGhlIEJhc2VUZXh0dXJlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUucmVtb3ZlRnJvbUNhY2hlID0gZnVuY3Rpb24gcmVtb3ZlRnJvbUNhY2hlIChiYXNlVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVRleHR1cmUgPT09ICdzdHJpbmcnKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYmFzZVRleHR1cmVGcm9tQ2FjaGUgPSBCYXNlVGV4dHVyZUNhY2hlW2Jhc2VUZXh0dXJlXTtcblxuICAgICAgICAgICAgaWYgKGJhc2VUZXh0dXJlRnJvbUNhY2hlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGJhc2VUZXh0dXJlRnJvbUNhY2hlLnRleHR1cmVDYWNoZUlkcy5pbmRleE9mKGJhc2VUZXh0dXJlKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZVRleHR1cmVGcm9tQ2FjaGUudGV4dHVyZUNhY2hlSWRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIEJhc2VUZXh0dXJlQ2FjaGVbYmFzZVRleHR1cmVdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VUZXh0dXJlRnJvbUNhY2hlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhc2VUZXh0dXJlICYmIGJhc2VUZXh0dXJlLnRleHR1cmVDYWNoZUlkcylcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlVGV4dHVyZS50ZXh0dXJlQ2FjaGVJZHMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIEJhc2VUZXh0dXJlQ2FjaGVbYmFzZVRleHR1cmUudGV4dHVyZUNhY2hlSWRzW2ldXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmFzZVRleHR1cmUudGV4dHVyZUNhY2hlSWRzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgICAgIHJldHVybiBiYXNlVGV4dHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQmFzZVRleHR1cmUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBCYXNlVGV4dHVyZTtcbn0oRXZlbnRFbWl0dGVyKSk7XG5cbi8qKlxuICogR2xvYmFsIG51bWJlciBvZiB0aGUgdGV4dHVyZSBiYXRjaCwgdXNlZCBieSBtdWx0aS10ZXh0dXJlIHJlbmRlcmVyc1xuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xuQmFzZVRleHR1cmUuX2dsb2JhbEJhdGNoID0gMDtcblxuLyoqXG4gKiBBIHJlc291cmNlIHRoYXQgY29udGFpbnMgYSBudW1iZXIgb2Ygc291cmNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkucmVzb3VyY2VzLlJlc291cmNlXG4gKiBAbWVtYmVyb2YgUElYSS5yZXNvdXJjZXNcbiAqIEBwYXJhbSB7bnVtYmVyfEFycmF5PCo+fSBzb3VyY2UgLSBOdW1iZXIgb2YgaXRlbXMgaW4gYXJyYXkgb3IgdGhlIGNvbGxlY3Rpb25cbiAqICAgICAgICBvZiBpbWFnZSBVUkxzIHRvIHVzZS4gQ2FuIGFsc28gYmUgcmVzb3VyY2VzLCBpbWFnZSBlbGVtZW50cywgY2FudmFzLCBldGMuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgdG8gYXBwbHkgdG8ge0BsaW5rIFBJWEkucmVzb3VyY2VzLmF1dG9EZXRlY3RSZXNvdXJjZX1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy53aWR0aF0gLSBXaWR0aCBvZiB0aGUgcmVzb3VyY2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5oZWlnaHRdIC0gSGVpZ2h0IG9mIHRoZSByZXNvdXJjZVxuICovXG52YXIgQXJyYXlSZXNvdXJjZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFJlc291cmNlKSB7XG4gICAgZnVuY3Rpb24gQXJyYXlSZXNvdXJjZShzb3VyY2UsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB2YXIgdXJscztcbiAgICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKVxuICAgICAgICB7XG4gICAgICAgICAgICB1cmxzID0gc291cmNlO1xuICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlc291cmNlLmNhbGwodGhpcywgb3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb2xsZWN0aW9uIG9mIHJlc291cmNlcy5cbiAgICAgICAgICogQG1lbWJlciB7QXJyYXk8UElYSS5CYXNlVGV4dHVyZT59XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXJ0eSBJRHMgZm9yIGVhY2ggcGFydFxuICAgICAgICAgKiBAbWVtYmVyIHtBcnJheTxudW1iZXI+fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXRlbURpcnR5SWRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcnRUZXh0dXJlID0gbmV3IEJhc2VUZXh0dXJlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChwYXJ0VGV4dHVyZSk7XG4gICAgICAgICAgICB0aGlzLml0ZW1EaXJ0eUlkcy5wdXNoKC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYXJyYXlcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9taXNlIHdoZW4gbG9hZGluZ1xuICAgICAgICAgKiBAbWVtYmVyIHtQcm9taXNlfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9sb2FkID0gbnVsbDtcblxuICAgICAgICBpZiAodXJscylcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGVuZ3RoOyBpJDErKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJlc291cmNlQXQoYXV0b0RldGVjdFJlc291cmNlKHVybHNbaSQxXSwgb3B0aW9ucyksIGkkMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIFJlc291cmNlICkgQXJyYXlSZXNvdXJjZS5fX3Byb3RvX18gPSBSZXNvdXJjZTtcbiAgICBBcnJheVJlc291cmNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJlc291cmNlICYmIFJlc291cmNlLnByb3RvdHlwZSApO1xuICAgIEFycmF5UmVzb3VyY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyYXlSZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhpcyBCYXNlSW1hZ2VSZXNvdXJjZVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIEFycmF5UmVzb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlICgpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXRlbURpcnR5SWRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbG9hZCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBhIHJlc291cmNlIGJ5IElEXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkucmVzb3VyY2VzLlJlc291cmNlfSByZXNvdXJjZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFplcm8tYmFzZWQgaW5kZXggb2YgcmVzb3VyY2UgdG8gc2V0XG4gICAgICogQHJldHVybiB7UElYSS5yZXNvdXJjZXMuQXJyYXlSZXNvdXJjZX0gSW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgQXJyYXlSZXNvdXJjZS5wcm90b3R5cGUuYWRkUmVzb3VyY2VBdCA9IGZ1bmN0aW9uIGFkZFJlc291cmNlQXQgKHJlc291cmNlLCBpbmRleClcbiAgICB7XG4gICAgICAgIHZhciBiYXNlVGV4dHVyZSA9IHRoaXMuaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmICghYmFzZVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgaXMgb3V0IG9mIGJvdW5kc1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmhlcml0IHRoZSBmaXJzdCByZXNvdXJjZSBkaW1lbnNpb25zXG4gICAgICAgIGlmIChyZXNvdXJjZS52YWxpZCAmJiAhdGhpcy52YWxpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5yZXNpemUocmVzb3VyY2Uud2lkdGgsIHJlc291cmNlLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1zW2luZGV4XS5zZXRSZXNvdXJjZShyZXNvdXJjZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgcGFyZW50IGJhc2UgdGV4dHVyZVxuICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmV9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgQXJyYXlSZXNvdXJjZS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQgKGJhc2VUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmJpbmQuY2FsbCh0aGlzLCBiYXNlVGV4dHVyZSk7XG5cbiAgICAgICAgYmFzZVRleHR1cmUudGFyZ2V0ID0gVEFSR0VUUy5URVhUVVJFXzJEX0FSUkFZO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5vbigndXBkYXRlJywgYmFzZVRleHR1cmUudXBkYXRlLCBiYXNlVGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5zZXQgdGhlIHBhcmVudCBiYXNlIHRleHR1cmVcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkJhc2VUZXh0dXJlfVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIEFycmF5UmVzb3VyY2UucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uIHVuYmluZCAoYmFzZVRleHR1cmUpXG4gICAge1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUudW5iaW5kLmNhbGwodGhpcywgYmFzZVRleHR1cmUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1tpXS5vZmYoJ3VwZGF0ZScsIGJhc2VUZXh0dXJlLnVwZGF0ZSwgYmFzZVRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgYWxsIHRoZSByZXNvdXJjZXMgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBXaGVuIGxvYWQgaXMgcmVzb2x2ZWRcbiAgICAgKi9cbiAgICBBcnJheVJlc291cmNlLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gbG9hZCAoKVxuICAgIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc291cmNlcyA9IHRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLnJlc291cmNlOyB9KTtcblxuICAgICAgICAvLyBUT0RPOiBhbHNvIGltcGxlbWVudCBsb2FkIHBhcnQtYnktcGFydCBzdHJhdGVneVxuICAgICAgICB2YXIgcHJvbWlzZXMgPSByZXNvdXJjZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLmxvYWQoKTsgfSk7XG5cbiAgICAgICAgdGhpcy5fbG9hZCA9IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSByZXNvdXJjZXNbMF07XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gcmVmLndpZHRoO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSByZWYuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgdGhpcyQxLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyQxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgcmVzb3VyY2VzIHRvIHRoZSBHUFUuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gdGV4dHVyZVxuICAgICAqIEBwYXJhbSB7UElYSS5HTFRleHR1cmV9IGdsVGV4dHVyZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRleHR1cmUgd2FzIHVwbG9hZGVkXG4gICAgICovXG4gICAgQXJyYXlSZXNvdXJjZS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gdXBsb2FkIChyZW5kZXJlciwgdGV4dHVyZSwgZ2xUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBsZW5ndGggPSByZWYubGVuZ3RoO1xuICAgICAgICB2YXIgaXRlbURpcnR5SWRzID0gcmVmLml0ZW1EaXJ0eUlkcztcbiAgICAgICAgdmFyIGl0ZW1zID0gcmVmLml0ZW1zO1xuICAgICAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcblxuICAgICAgICBpZiAoZ2xUZXh0dXJlLmRpcnR5SWQgPCAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTNEKFxuICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkRfQVJSQVksXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICAgICAgICB0aGlzLl93aWR0aCxcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWlnaHQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGV4dHVyZS5mb3JtYXQsXG4gICAgICAgICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuXG4gICAgICAgICAgICBpZiAoaXRlbURpcnR5SWRzW2ldIDwgaXRlbS5kaXJ0eUlkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGl0ZW1EaXJ0eUlkc1tpXSA9IGl0ZW0uZGlydHlJZDtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWxpZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlM0QoXG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5URVhUVVJFXzJEX0FSUkFZLFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHhvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHlvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGksIC8vIHpvZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVzb3VyY2Uud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnJlc291cmNlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVzb3VyY2Uuc291cmNlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHJldHVybiBBcnJheVJlc291cmNlO1xufShSZXNvdXJjZSkpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgT2Zmc2NyZWVuQ2FudmFzXG4gKi9cblxuLyoqXG4gKiBSZXNvdXJjZSB0eXBlIGZvciBIVE1MQ2FudmFzRWxlbWVudC5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5yZXNvdXJjZXMuQmFzZUltYWdlUmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlc1xuICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gc291cmNlIC0gQ2FudmFzIGVsZW1lbnQgdG8gdXNlXG4gKi9cbnZhciBDYW52YXNSZXNvdXJjZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJhc2VJbWFnZVJlc291cmNlKSB7XG4gICAgZnVuY3Rpb24gQ2FudmFzUmVzb3VyY2UgKCkge1xuICAgICAgICBCYXNlSW1hZ2VSZXNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmICggQmFzZUltYWdlUmVzb3VyY2UgKSBDYW52YXNSZXNvdXJjZS5fX3Byb3RvX18gPSBCYXNlSW1hZ2VSZXNvdXJjZTtcbiAgICBDYW52YXNSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCYXNlSW1hZ2VSZXNvdXJjZSAmJiBCYXNlSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUgKTtcbiAgICBDYW52YXNSZXNvdXJjZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW52YXNSZXNvdXJjZTtcblxuICAgIENhbnZhc1Jlc291cmNlLnRlc3QgPSBmdW5jdGlvbiB0ZXN0IChzb3VyY2UpXG4gICAge1xuICAgICAgICB2YXIgT2Zmc2NyZWVuQ2FudmFzID0gd2luZG93Lk9mZnNjcmVlbkNhbnZhcztcblxuICAgICAgICAvLyBDaGVjayBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCB5ZXQgc3VwcG9ydCBPZmZzY3JlZW5DYW52YXNcbiAgICAgICAgaWYgKE9mZnNjcmVlbkNhbnZhcyAmJiBzb3VyY2UgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIH07XG5cbiAgICByZXR1cm4gQ2FudmFzUmVzb3VyY2U7XG59KEJhc2VJbWFnZVJlc291cmNlKSk7XG5cbi8qKlxuICogUmVzb3VyY2UgZm9yIGEgQ3ViZVRleHR1cmUgd2hpY2ggY29udGFpbnMgc2l4IHJlc291cmNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkucmVzb3VyY2VzLkFycmF5UmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmd8UElYSS5yZXNvdXJjZXMuUmVzb3VyY2U+fSBbc291cmNlXSBDb2xsZWN0aW9uIG9mIFVSTHMgb3IgcmVzb3VyY2VzXG4gKiAgICAgICAgdG8gdXNlIGFzIHRoZSBzaWRlcyBvZiB0aGUgY3ViZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBJbWFnZVJlc291cmNlIG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy53aWR0aF0gLSBXaWR0aCBvZiByZXNvdXJjZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodF0gLSBIZWlnaHQgb2YgcmVzb3VyY2VcbiAqL1xudmFyIEN1YmVSZXNvdXJjZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEFycmF5UmVzb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBDdWJlUmVzb3VyY2Uoc291cmNlLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgQXJyYXlSZXNvdXJjZS5jYWxsKHRoaXMsIHNvdXJjZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9PSBDdWJlUmVzb3VyY2UuU0lERVMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJJbnZhbGlkIGxlbmd0aC4gR290IFwiICsgKHRoaXMubGVuZ3RoKSArIFwiLCBleHBlY3RlZCA2XCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ3ViZVJlc291cmNlLlNJREVTOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0udGFyZ2V0ID0gVEFSR0VUUy5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0xvYWQgIT09IGZhbHNlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICggQXJyYXlSZXNvdXJjZSApIEN1YmVSZXNvdXJjZS5fX3Byb3RvX18gPSBBcnJheVJlc291cmNlO1xuICAgIEN1YmVSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBcnJheVJlc291cmNlICYmIEFycmF5UmVzb3VyY2UucHJvdG90eXBlICk7XG4gICAgQ3ViZVJlc291cmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVSZXNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBiaW5kaW5nXG4gICAgICpcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gcGFyZW50IGJhc2UgdGV4dHVyZVxuICAgICAqL1xuICAgIEN1YmVSZXNvdXJjZS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQgKGJhc2VUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgQXJyYXlSZXNvdXJjZS5wcm90b3R5cGUuYmluZC5jYWxsKHRoaXMsIGJhc2VUZXh0dXJlKTtcblxuICAgICAgICBiYXNlVGV4dHVyZS50YXJnZXQgPSBUQVJHRVRTLlRFWFRVUkVfQ1VCRV9NQVA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCB0aGUgcmVzb3VyY2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlzIHN1Y2Nlc3NcbiAgICAgKi9cbiAgICBDdWJlUmVzb3VyY2UucHJvdG90eXBlLnVwbG9hZCA9IGZ1bmN0aW9uIHVwbG9hZCAocmVuZGVyZXIsIGJhc2VUZXh0dXJlLCBnbFRleHR1cmUpXG4gICAge1xuICAgICAgICB2YXIgZGlydHkgPSB0aGlzLml0ZW1EaXJ0eUlkcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEN1YmVSZXNvdXJjZS5TSURFUzsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc2lkZSA9IHRoaXMuaXRlbXNbaV07XG5cbiAgICAgICAgICAgIGlmIChkaXJ0eVtpXSA8IHNpZGUuZGlydHlJZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXJ0eVtpXSA9IHNpZGUuZGlydHlJZDtcbiAgICAgICAgICAgICAgICBpZiAoc2lkZS52YWxpZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNpZGUucmVzb3VyY2UudXBsb2FkKHJlbmRlcmVyLCBzaWRlLCBnbFRleHR1cmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICByZXR1cm4gQ3ViZVJlc291cmNlO1xufShBcnJheVJlc291cmNlKSk7XG5cbi8qKlxuICogTnVtYmVyIG9mIHRleHR1cmUgc2lkZXMgdG8gc3RvcmUgZm9yIEN1YmVSZXNvdXJjZXNcbiAqXG4gKiBAbmFtZSBQSVhJLnJlc291cmNlcy5DdWJlUmVzb3VyY2UuU0lERVNcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqIEBkZWZhdWx0IDZcbiAqL1xuQ3ViZVJlc291cmNlLlNJREVTID0gNjtcblxuLyoqXG4gKiBSZXNvdXJjZSB0eXBlIGZvciBTVkcgZWxlbWVudHMgYW5kIGdyYXBoaWNzLlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLnJlc291cmNlcy5CYXNlSW1hZ2VSZXNvdXJjZVxuICogQG1lbWJlcm9mIFBJWEkucmVzb3VyY2VzXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQmFzZTY0IGVuY29kZWQgU1ZHIGVsZW1lbnQgb3IgVVJMIGZvciBTVkcgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHRvIHVzZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjYWxlPTFdIFNjYWxlIHRvIGFwcGx5IHRvIFNWRy4gT3ZlcnJpZGRlbiBieS4uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoXSBSYXN0ZXJpemUgU1ZHIHRoaXMgd2lkZS4gQXNwZWN0IHJhdGlvIHByZXNlcnZlZCBpZiBoZWlnaHQgbm90IHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5oZWlnaHRdIFJhc3Rlcml6ZSBTVkcgdGhpcyBoaWdoLiBBc3BlY3QgcmF0aW8gcHJlc2VydmVkIGlmIHdpZHRoIG5vdCBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF1dG9Mb2FkPXRydWVdIFN0YXJ0IGxvYWRpbmcgcmlnaHQgYXdheS5cbiAqL1xudmFyIFNWR1Jlc291cmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmFzZUltYWdlUmVzb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBTVkdSZXNvdXJjZShzb3VyY2UsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBCYXNlSW1hZ2VSZXNvdXJjZS5jYWxsKHRoaXMsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpKTtcbiAgICAgICAgdGhpcy5fd2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCYXNlNjQgZW5jb2RlZCBTVkcgZWxlbWVudCBvciBVUkwgZm9yIFNWRyBmaWxlXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN2ZyA9IHNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBzY2FsZSB0byBhcHBseSB3aGVuIHJhc3Rlcml6aW5nIG9uIGxvYWRcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2NhbGUgPSBvcHRpb25zLnNjYWxlIHx8IDE7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgd2lkdGggb3ZlcnJpZGUgZm9yIHJhc3Rlcml6YXRpb24gb24gbG9hZFxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fb3ZlcnJpZGVXaWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgaGVpZ2h0IG92ZXJyaWRlIGZvciByYXN0ZXJpemF0aW9uIG9uIGxvYWRcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX292ZXJyaWRlSGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgd2hlbiBjb21wbGV0ZWx5IGxvYWRlZFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtmdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3Jlc29sdmUgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcm9zcyBvcmlnaW4gdmFsdWUgdG8gdXNlXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW58c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fY3Jvc3NvcmlnaW4gPSBvcHRpb25zLmNyb3Nzb3JpZ2luO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9taXNlIHdoZW4gbG9hZGluZ1xuICAgICAgICAgKiBAbWVtYmVyIHtQcm9taXNlPHZvaWQ+fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9sb2FkID0gbnVsbDtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdXRvTG9hZCAhPT0gZmFsc2UpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBCYXNlSW1hZ2VSZXNvdXJjZSApIFNWR1Jlc291cmNlLl9fcHJvdG9fXyA9IEJhc2VJbWFnZVJlc291cmNlO1xuICAgIFNWR1Jlc291cmNlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJhc2VJbWFnZVJlc291cmNlICYmIEJhc2VJbWFnZVJlc291cmNlLnByb3RvdHlwZSApO1xuICAgIFNWR1Jlc291cmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNWR1Jlc291cmNlO1xuXG4gICAgU1ZHUmVzb3VyY2UucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiBsb2FkICgpXG4gICAge1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fbG9hZClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhpcyB1bnRpbCBhZnRlciBsb2FkIGlzIGZpbmlzaGVkXG4gICAgICAgICAgICB0aGlzJDEuX3Jlc29sdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcyQxLnJlc2l6ZSh0aGlzJDEuc291cmNlLndpZHRoLCB0aGlzJDEuc291cmNlLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzJDEpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQ29udmVydCBTVkcgaW5saW5lIHN0cmluZyB0byBkYXRhLXVyaVxuICAgICAgICAgICAgaWYgKCgvXlxcPHN2Zy8pLnRlc3QodGhpcyQxLnN2Zy50cmltKCkpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICghYnRvYSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBicm93c2VyIGRvZXNuXFwndCBzdXBwb3J0IGJhc2U2NCBjb252ZXJzaW9ucy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcyQxLnN2ZyA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxcIiArIChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh0aGlzJDEuc3ZnKSkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcyQxLl9sb2FkU3ZnKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhbiBTVkcgaW1hZ2UgZnJvbSBgaW1hZ2VVcmxgIG9yIGBkYXRhIFVSTGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFNWR1Jlc291cmNlLnByb3RvdHlwZS5fbG9hZFN2ZyA9IGZ1bmN0aW9uIF9sb2FkU3ZnICgpXG4gICAge1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICB2YXIgdGVtcEltYWdlID0gbmV3IEltYWdlKCk7XG5cbiAgICAgICAgQmFzZUltYWdlUmVzb3VyY2UuY3Jvc3NPcmlnaW4odGVtcEltYWdlLCB0aGlzLnN2ZywgdGhpcy5fY3Jvc3NvcmlnaW4pO1xuICAgICAgICB0ZW1wSW1hZ2Uuc3JjID0gdGhpcy5zdmc7XG5cbiAgICAgICAgdGVtcEltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyQxLl9yZXNvbHZlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGVtcEltYWdlLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcyQxLm9uRXJyb3IucnVuKGV2ZW50KTtcbiAgICAgICAgfTtcblxuICAgICAgICB0ZW1wSW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzJDEuX3Jlc29sdmUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3ZnV2lkdGggPSB0ZW1wSW1hZ2Uud2lkdGg7XG4gICAgICAgICAgICB2YXIgc3ZnSGVpZ2h0ID0gdGVtcEltYWdlLmhlaWdodDtcblxuICAgICAgICAgICAgaWYgKCFzdmdXaWR0aCB8fCAhc3ZnSGVpZ2h0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFNWRyBpbWFnZSBtdXN0IGhhdmUgd2lkdGggYW5kIGhlaWdodCBkZWZpbmVkIChpbiBwaXhlbHMpLCBjYW52YXMgQVBJIG5lZWRzIHRoZW0uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCByZW5kZXIgc2l6ZVxuICAgICAgICAgICAgdmFyIHdpZHRoID0gc3ZnV2lkdGggKiB0aGlzJDEuc2NhbGU7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc3ZnSGVpZ2h0ICogdGhpcyQxLnNjYWxlO1xuXG4gICAgICAgICAgICBpZiAodGhpcyQxLl9vdmVycmlkZVdpZHRoIHx8IHRoaXMkMS5fb3ZlcnJpZGVIZWlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzJDEuX292ZXJyaWRlV2lkdGggfHwgdGhpcyQxLl9vdmVycmlkZUhlaWdodCAvIHN2Z0hlaWdodCAqIHN2Z1dpZHRoO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMkMS5fb3ZlcnJpZGVIZWlnaHQgfHwgdGhpcyQxLl9vdmVycmlkZVdpZHRoIC8gc3ZnV2lkdGggKiBzdmdIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBjYW52YXMgZWxlbWVudFxuICAgICAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMkMS5zb3VyY2U7XG5cbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIGNhbnZhcy5fcGl4aUlkID0gXCJjYW52YXNfXCIgKyAodWlkKCkpO1xuXG4gICAgICAgICAgICAvLyBEcmF3IHRoZSBTdmcgdG8gdGhlIGNhbnZhc1xuICAgICAgICAgICAgY2FudmFzXG4gICAgICAgICAgICAgICAgLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgICAgICAgICAuZHJhd0ltYWdlKHRlbXBJbWFnZSwgMCwgMCwgc3ZnV2lkdGgsIHN2Z0hlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICAgIHRoaXMkMS5fcmVzb2x2ZSgpO1xuICAgICAgICAgICAgdGhpcyQxLl9yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0IHNpemUgZnJvbSBhbiBzdmcgc3RyaW5nIHVzaW5nIHJlZ2V4cC5cbiAgICAgKlxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ZnU3RyaW5nIC0gYSBzZXJpYWxpemVkIHN2ZyBlbGVtZW50XG4gICAgICogQHJldHVybiB7UElYSS5JU2l6ZX0gaW1hZ2UgZXh0ZW5zaW9uXG4gICAgICovXG4gICAgU1ZHUmVzb3VyY2UuZ2V0U2l6ZSA9IGZ1bmN0aW9uIGdldFNpemUgKHN2Z1N0cmluZylcbiAgICB7XG4gICAgICAgIHZhciBzaXplTWF0Y2ggPSBTVkdSZXNvdXJjZS5TVkdfU0laRS5leGVjKHN2Z1N0cmluZyk7XG4gICAgICAgIHZhciBzaXplID0ge307XG5cbiAgICAgICAgaWYgKHNpemVNYXRjaClcbiAgICAgICAge1xuICAgICAgICAgICAgc2l6ZVtzaXplTWF0Y2hbMV1dID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHNpemVNYXRjaFszXSkpO1xuICAgICAgICAgICAgc2l6ZVtzaXplTWF0Y2hbNV1dID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHNpemVNYXRjaFs3XSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dHVyZVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIFNWR1Jlc291cmNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSAoKVxuICAgIHtcbiAgICAgICAgQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2Nyb3Nzb3JpZ2luID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBhdXRvLWRldGVjdCB0aGUgdHlwZSBvZiByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0geyp9IHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbiAtIFRoZSBleHRlbnNpb24gb2Ygc291cmNlLCBpZiBzZXRcbiAgICAgKi9cbiAgICBTVkdSZXNvdXJjZS50ZXN0ID0gZnVuY3Rpb24gdGVzdCAoc291cmNlLCBleHRlbnNpb24pXG4gICAge1xuICAgICAgICAvLyB1cmwgZmlsZSBleHRlbnNpb24gaXMgU1ZHXG4gICAgICAgIHJldHVybiBleHRlbnNpb24gPT09ICdzdmcnXG4gICAgICAgICAgICAvLyBzb3VyY2UgaXMgU1ZHIGRhdGEtdXJpXG4gICAgICAgICAgICB8fCAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgc291cmNlLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQnKSA9PT0gMClcbiAgICAgICAgICAgIC8vIHNvdXJjZSBpcyBTVkcgaW5saW5lXG4gICAgICAgICAgICB8fCAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgc291cmNlLmluZGV4T2YoJzxzdmcnKSA9PT0gMCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTVkdSZXNvdXJjZTtcbn0oQmFzZUltYWdlUmVzb3VyY2UpKTtcblxuLyoqXG4gKiBSZWdFeHAgZm9yIFNWRyBzaXplLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudCB7UmVnRXhwfHN0cmluZ30gU1ZHX1NJWkVcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlcy5TVkdSZXNvdXJjZVxuICogQGV4YW1wbGUgJmx0O3N2ZyB3aWR0aD1cIjEwMFwiIGhlaWdodD1cIjEwMFwiJmd0OyZsdDsvc3ZnJmd0O1xuICovXG5TVkdSZXNvdXJjZS5TVkdfU0laRSA9IC88c3ZnW14+XSooPzpcXHMod2lkdGh8aGVpZ2h0KT0oJ3xcIikoXFxkKig/OlxcLlxcZCspPykoPzpweCk/KCd8XCIpKVtePl0qKD86XFxzKHdpZHRofGhlaWdodCk9KCd8XCIpKFxcZCooPzpcXC5cXGQrKT8pKD86cHgpPygnfFwiKSlbXj5dKj4vaTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cbi8qKlxuICogUmVzb3VyY2UgdHlwZSBmb3IgSFRNTFZpZGVvRWxlbWVudC5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5yZXNvdXJjZXMuQmFzZUltYWdlUmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlc1xuICogQHBhcmFtIHtIVE1MVmlkZW9FbGVtZW50fG9iamVjdHxzdHJpbmd8QXJyYXk8c3RyaW5nfG9iamVjdD59IHNvdXJjZSAtIFZpZGVvIGVsZW1lbnQgdG8gdXNlLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgdG8gdXNlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF1dG9Mb2FkPXRydWVdIC0gU3RhcnQgbG9hZGluZyB0aGUgdmlkZW8gaW1tZWRpYXRlbHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b1BsYXk9dHJ1ZV0gLSBTdGFydCBwbGF5aW5nIHZpZGVvIGltbWVkaWF0ZWx5XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudXBkYXRlRlBTPTBdIC0gSG93IG1hbnkgdGltZXMgYSBzZWNvbmQgdG8gdXBkYXRlIHRoZSB0ZXh0dXJlIGZyb20gdGhlIHZpZGVvLlxuICogTGVhdmUgYXQgMCB0byB1cGRhdGUgYXQgZXZlcnkgcmVuZGVyLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jcm9zc29yaWdpbj10cnVlXSAtIExvYWQgaW1hZ2UgdXNpbmcgY3Jvc3Mgb3JpZ2luXG4gKi9cbnZhciBWaWRlb1Jlc291cmNlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmFzZUltYWdlUmVzb3VyY2UpIHtcbiAgICBmdW5jdGlvbiBWaWRlb1Jlc291cmNlKHNvdXJjZSwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcblxuICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3BpeGlqcy9waXhpLmpzL2lzc3Vlcy81OTk2XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuc2V0QXR0cmlidXRlKCdwcmVsb2FkJywgJ2F1dG8nKTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dlYmtpdC1wbGF5c2lubGluZScsICcnKTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlID0gW3NvdXJjZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJhc2VJbWFnZVJlc291cmNlLmNyb3NzT3JpZ2luKHZpZGVvRWxlbWVudCwgKHNvdXJjZVswXS5zcmMgfHwgc291cmNlWzBdKSwgb3B0aW9ucy5jcm9zc29yaWdpbik7XG5cbiAgICAgICAgICAgIC8vIGFycmF5IG9mIG9iamVjdHMgb3Igc3RyaW5nc1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTtcblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSBzb3VyY2VbaV07XG4gICAgICAgICAgICAgICAgdmFyIHNyYyA9IHJlZi5zcmM7XG4gICAgICAgICAgICAgICAgdmFyIG1pbWUgPSByZWYubWltZTtcblxuICAgICAgICAgICAgICAgIHNyYyA9IHNyYyB8fCBzb3VyY2VbaV07XG5cbiAgICAgICAgICAgICAgICB2YXIgYmFzZVNyYyA9IHNyYy5zcGxpdCgnPycpLnNoaWZ0KCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgZXh0ID0gYmFzZVNyYy5zdWJzdHIoYmFzZVNyYy5sYXN0SW5kZXhPZignLicpICsgMSk7XG5cbiAgICAgICAgICAgICAgICBtaW1lID0gbWltZSB8fCAoXCJ2aWRlby9cIiArIGV4dCk7XG5cbiAgICAgICAgICAgICAgICBzb3VyY2VFbGVtZW50LnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICBzb3VyY2VFbGVtZW50LnR5cGUgPSBtaW1lO1xuXG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFwcGVuZENoaWxkKHNvdXJjZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgc291cmNlXG4gICAgICAgICAgICBzb3VyY2UgPSB2aWRlb0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBCYXNlSW1hZ2VSZXNvdXJjZS5jYWxsKHRoaXMsIHNvdXJjZSk7XG5cbiAgICAgICAgdGhpcy5ub1N1YkltYWdlID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogYHRydWVgIHRvIHVzZSBQSVhJLlRpY2tlci5zaGFyZWQgdG8gYXV0byB1cGRhdGUgdGhlIGJhc2UgdGV4dHVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2F1dG9VcGRhdGUgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gUElYSS5UaWNrZXIuc2hhcmVkIHRvIGF1dG8gdXBkYXRlIHRoZSBiYXNlIHRleHR1cmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faXNDb25uZWN0ZWRUb1RpY2tlciA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUZQUyA9IG9wdGlvbnMudXBkYXRlRlBTIHx8IDA7XG4gICAgICAgIHRoaXMuX21zVG9OZXh0VXBkYXRlID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgcGxheSB2aWRlb3MgdXNlZCBieSB0aGlzIHRleHR1cmUgb25jZVxuICAgICAgICAgKiB0aGV5IGFyZSBsb2FkZWQuIElmIGZhbHNlLCBpdCB3aWxsIG5vdCBtb2RpZnkgdGhlIHBsYXlpbmcgc3RhdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0b1BsYXkgPSBvcHRpb25zLmF1dG9QbGF5ICE9PSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvbWlzZSB3aGVuIGxvYWRpbmdcbiAgICAgICAgICogQG1lbWJlciB7UHJvbWlzZTx2b2lkPn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fbG9hZCA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGxiYWNrIHdoZW4gY29tcGxldGVkIHdpdGggbG9hZC5cbiAgICAgICAgICogQG1lbWJlciB7ZnVuY3Rpb259XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXNvbHZlID0gbnVsbDtcblxuICAgICAgICAvLyBCaW5kIGZvciBsaXN0ZW5lcnNcbiAgICAgICAgdGhpcy5fb25DYW5QbGF5ID0gdGhpcy5fb25DYW5QbGF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0xvYWQgIT09IGZhbHNlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICggQmFzZUltYWdlUmVzb3VyY2UgKSBWaWRlb1Jlc291cmNlLl9fcHJvdG9fXyA9IEJhc2VJbWFnZVJlc291cmNlO1xuICAgIFZpZGVvUmVzb3VyY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQmFzZUltYWdlUmVzb3VyY2UgJiYgQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlICk7XG4gICAgVmlkZW9SZXNvdXJjZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWaWRlb1Jlc291cmNlO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgYXV0b1VwZGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSx1cGRhdGVGUFM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgdXBkYXRpbmcgb2YgdGhlIHRleHR1cmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsdGFUaW1lPTBdIC0gdGltZSBkZWx0YSBzaW5jZSBsYXN0IHRpY2tcbiAgICAgKi9cbiAgICBWaWRlb1Jlc291cmNlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKGRlbHRhVGltZSlcbiAgICB7XG4gICAgICAgIGlmICggZGVsdGFUaW1lID09PSB2b2lkIDAgKSBkZWx0YVRpbWUgPSAwO1xuXG4gICAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIGlmIHZpZGVvIGhhcyBoYWQgaXRzIHBsYXliYWNrUmF0ZSBjaGFuZ2VkXG4gICAgICAgICAgICB2YXIgZWxhcHNlZE1TID0gVGlja2VyLnNoYXJlZC5lbGFwc2VkTVMgKiB0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGU7XG5cbiAgICAgICAgICAgIHRoaXMuX21zVG9OZXh0VXBkYXRlID0gTWF0aC5mbG9vcih0aGlzLl9tc1RvTmV4dFVwZGF0ZSAtIGVsYXBzZWRNUyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3VwZGF0ZUZQUyB8fCB0aGlzLl9tc1RvTmV4dFVwZGF0ZSA8PSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEJhc2VJbWFnZVJlc291cmNlLnByb3RvdHlwZS51cGRhdGUuY2FsbCh0aGlzLCBkZWx0YVRpbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21zVG9OZXh0VXBkYXRlID0gdGhpcy5fdXBkYXRlRlBTID8gTWF0aC5mbG9vcigxMDAwIC8gdGhpcy5fdXBkYXRlRlBTKSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU3RhcnQgcHJlbG9hZGluZyB0aGUgdmlkZW8gcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gSGFuZGxlIHRoZSB2YWxpZGF0ZSBldmVudFxuICAgICAqL1xuICAgIFZpZGVvUmVzb3VyY2UucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiBsb2FkICgpXG4gICAge1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5fbG9hZClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zb3VyY2U7XG5cbiAgICAgICAgaWYgKChzb3VyY2UucmVhZHlTdGF0ZSA9PT0gc291cmNlLkhBVkVfRU5PVUdIX0RBVEEgfHwgc291cmNlLnJlYWR5U3RhdGUgPT09IHNvdXJjZS5IQVZFX0ZVVFVSRV9EQVRBKVxuICAgICAgICAgICAgJiYgc291cmNlLndpZHRoICYmIHNvdXJjZS5oZWlnaHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZS5jb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMuX29uUGxheVN0YXJ0LmJpbmQodGhpcykpO1xuICAgICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCB0aGlzLl9vblBsYXlTdG9wLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGlmICghdGhpcy5faXNTb3VyY2VSZWFkeSgpKVxuICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIHRoaXMuX29uQ2FuUGxheSk7XG4gICAgICAgICAgICBzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheXRocm91Z2gnLCB0aGlzLl9vbkNhblBsYXkpO1xuICAgICAgICAgICAgc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fb25FcnJvciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9vbkNhblBsYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMkMS52YWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMkMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcyQxLl9yZXNvbHZlID0gcmVzb2x2ZTtcblxuICAgICAgICAgICAgICAgIHNvdXJjZS5sb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdmlkZW8gZXJyb3IgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBWaWRlb1Jlc291cmNlLnByb3RvdHlwZS5fb25FcnJvciA9IGZ1bmN0aW9uIF9vbkVycm9yICgpXG4gICAge1xuICAgICAgICB0aGlzLnNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX29uRXJyb3IsIHRydWUpO1xuICAgICAgICB0aGlzLm9uRXJyb3IucnVuKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBpcyBwbGF5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHBsYXlpbmcuXG4gICAgICovXG4gICAgVmlkZW9SZXNvdXJjZS5wcm90b3R5cGUuX2lzU291cmNlUGxheWluZyA9IGZ1bmN0aW9uIF9pc1NvdXJjZVBsYXlpbmcgKClcbiAgICB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcblxuICAgICAgICByZXR1cm4gKHNvdXJjZS5jdXJyZW50VGltZSA+IDAgJiYgc291cmNlLnBhdXNlZCA9PT0gZmFsc2UgJiYgc291cmNlLmVuZGVkID09PSBmYWxzZSAmJiBzb3VyY2UucmVhZHlTdGF0ZSA+IDIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgc291cmNlIGlzIHJlYWR5IGZvciBwbGF5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHJlYWR5LlxuICAgICAqL1xuICAgIFZpZGVvUmVzb3VyY2UucHJvdG90eXBlLl9pc1NvdXJjZVJlYWR5ID0gZnVuY3Rpb24gX2lzU291cmNlUmVhZHkgKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5yZWFkeVN0YXRlID09PSAzIHx8IHRoaXMuc291cmNlLnJlYWR5U3RhdGUgPT09IDQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIHVwZGF0ZSBsb29wIHdoZW4gdGhlIHZpZGVvIGlzIHJlYWR5IHRvIHBsYXlcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVmlkZW9SZXNvdXJjZS5wcm90b3R5cGUuX29uUGxheVN0YXJ0ID0gZnVuY3Rpb24gX29uUGxheVN0YXJ0ICgpXG4gICAge1xuICAgICAgICAvLyBKdXN0IGluIGNhc2UgdGhlIHZpZGVvIGhhcyBub3QgcmVjZWl2ZWQgaXRzIGNhbiBwbGF5IGV2ZW4geWV0Li5cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9vbkNhblBsYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGUgJiYgIXRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIFRpY2tlci5zaGFyZWQuYWRkKHRoaXMudXBkYXRlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwYXVzZSBldmVudCBpcyB0cmlnZ2VyZWQsIHN0b3BzIHRoZSB1cGRhdGUgbG9vcFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBWaWRlb1Jlc291cmNlLnByb3RvdHlwZS5fb25QbGF5U3RvcCA9IGZ1bmN0aW9uIF9vblBsYXlTdG9wICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWRUb1RpY2tlcilcbiAgICAgICAge1xuICAgICAgICAgICAgVGlja2VyLnNoYXJlZC5yZW1vdmUodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5faXNDb25uZWN0ZWRUb1RpY2tlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHZpZGVvIGlzIGxvYWRlZCBhbmQgcmVhZHkgdG8gcGxheVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBWaWRlb1Jlc291cmNlLnByb3RvdHlwZS5fb25DYW5QbGF5ID0gZnVuY3Rpb24gX29uQ2FuUGxheSAoKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBzb3VyY2UgPSByZWYuc291cmNlO1xuXG4gICAgICAgIHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgdGhpcy5fb25DYW5QbGF5KTtcbiAgICAgICAgc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXl0aHJvdWdoJywgdGhpcy5fb25DYW5QbGF5KTtcblxuICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLnZhbGlkO1xuXG4gICAgICAgIHRoaXMucmVzaXplKHNvdXJjZS52aWRlb1dpZHRoLCBzb3VyY2UudmlkZW9IZWlnaHQpO1xuXG4gICAgICAgIC8vIHByZXZlbnQgbXVsdGlwbGUgbG9hZGVkIGRpc3BhdGNoZXMuLlxuICAgICAgICBpZiAoIXZhbGlkICYmIHRoaXMuX3Jlc29sdmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc1NvdXJjZVBsYXlpbmcoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fb25QbGF5U3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmF1dG9QbGF5KVxuICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2UucGxheSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dHVyZVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIFZpZGVvUmVzb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWRUb1RpY2tlcilcbiAgICAgICAge1xuICAgICAgICAgICAgVGlja2VyLnNoYXJlZC5yZW1vdmUodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc291cmNlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX29uRXJyb3IsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlLnNyYyA9ICcnO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIEJhc2VJbWFnZVJlc291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCB0aGUgYmFzZSB0ZXh0dXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlIGl0c2VsZiwgc2V0IHRvIHRydWUgYnkgZGVmYXVsdFxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYXV0b1VwZGF0ZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9VcGRhdGU7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hdXRvVXBkYXRlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX2F1dG9VcGRhdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9VcGRhdGUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9hdXRvVXBkYXRlICYmIHRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgVGlja2VyLnNoYXJlZC5yZW1vdmUodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2F1dG9VcGRhdGUgJiYgIXRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIgJiYgdGhpcy5faXNTb3VyY2VQbGF5aW5nKCkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgVGlja2VyLnNoYXJlZC5hZGQodGhpcy51cGRhdGUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkVG9UaWNrZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IHRpbWVzIGEgc2Vjb25kIHRvIHVwZGF0ZSB0aGUgdGV4dHVyZSBmcm9tIHRoZSB2aWRlby4gTGVhdmUgYXQgMCB0byB1cGRhdGUgYXQgZXZlcnkgcmVuZGVyLlxuICAgICAqIEEgbG93ZXIgZnBzIGNhbiBoZWxwIHBlcmZvcm1hbmNlLCBhcyB1cGRhdGluZyB0aGUgdGV4dHVyZSBhdCA2MGZwcyBvbiBhIDMwcHMgdmlkZW8gbWF5IG5vdCBiZSBlZmZpY2llbnQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnVwZGF0ZUZQUy5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZQUztcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnVwZGF0ZUZQUy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl91cGRhdGVGUFMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZQUyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gYXV0by1kZXRlY3QgdGhlIHR5cGUgb2YgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHsqfSBzb3VyY2UgLSBUaGUgc291cmNlIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb24gLSBUaGUgZXh0ZW5zaW9uIG9mIHNvdXJjZSwgaWYgc2V0XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHZpZGVvIHNvdXJjZVxuICAgICAqL1xuICAgIFZpZGVvUmVzb3VyY2UudGVzdCA9IGZ1bmN0aW9uIHRlc3QgKHNvdXJjZSwgZXh0ZW5zaW9uKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KVxuICAgICAgICAgICAgfHwgVmlkZW9SZXNvdXJjZS5UWVBFUy5pbmRleE9mKGV4dGVuc2lvbikgPiAtMTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZpZGVvUmVzb3VyY2UucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBWaWRlb1Jlc291cmNlO1xufShCYXNlSW1hZ2VSZXNvdXJjZSkpO1xuXG4vKipcbiAqIExpc3Qgb2YgY29tbW9uIHZpZGVvIGZpbGUgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgVmlkZW9SZXNvdXJjZS5cbiAqIEBjb25zdGFudFxuICogQG1lbWJlciB7QXJyYXk8c3RyaW5nPn1cbiAqIEBzdGF0aWNcbiAqIEByZWFkb25seVxuICovXG5WaWRlb1Jlc291cmNlLlRZUEVTID0gWydtcDQnLCAnbTR2JywgJ3dlYm0nLCAnb2dnJywgJ29ndicsICdoMjY0JywgJ2F2aScsICdtb3YnXTtcblxuLyoqXG4gKiBSZXNvdXJjZSB0eXBlIGZvciBJbWFnZUJpdG1hcC5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5yZXNvdXJjZXMuQmFzZUltYWdlUmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlc1xuICogQHBhcmFtIHtJbWFnZUJpdG1hcH0gc291cmNlIC0gSW1hZ2UgZWxlbWVudCB0byB1c2VcbiAqL1xudmFyIEltYWdlQml0bWFwUmVzb3VyY2UgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChCYXNlSW1hZ2VSZXNvdXJjZSkge1xuICAgIGZ1bmN0aW9uIEltYWdlQml0bWFwUmVzb3VyY2UgKCkge1xuICAgICAgICBCYXNlSW1hZ2VSZXNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmICggQmFzZUltYWdlUmVzb3VyY2UgKSBJbWFnZUJpdG1hcFJlc291cmNlLl9fcHJvdG9fXyA9IEJhc2VJbWFnZVJlc291cmNlO1xuICAgIEltYWdlQml0bWFwUmVzb3VyY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQmFzZUltYWdlUmVzb3VyY2UgJiYgQmFzZUltYWdlUmVzb3VyY2UucHJvdG90eXBlICk7XG4gICAgSW1hZ2VCaXRtYXBSZXNvdXJjZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbWFnZUJpdG1hcFJlc291cmNlO1xuXG4gICAgSW1hZ2VCaXRtYXBSZXNvdXJjZS50ZXN0ID0gZnVuY3Rpb24gdGVzdCAoc291cmNlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuICEhd2luZG93LmNyZWF0ZUltYWdlQml0bWFwICYmIHNvdXJjZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwO1xuICAgIH07XG5cbiAgICByZXR1cm4gSW1hZ2VCaXRtYXBSZXNvdXJjZTtcbn0oQmFzZUltYWdlUmVzb3VyY2UpKTtcblxuSU5TVEFMTEVELnB1c2goXG4gICAgSW1hZ2VSZXNvdXJjZSxcbiAgICBJbWFnZUJpdG1hcFJlc291cmNlLFxuICAgIENhbnZhc1Jlc291cmNlLFxuICAgIFZpZGVvUmVzb3VyY2UsXG4gICAgU1ZHUmVzb3VyY2UsXG4gICAgQnVmZmVyUmVzb3VyY2UsXG4gICAgQ3ViZVJlc291cmNlLFxuICAgIEFycmF5UmVzb3VyY2Vcbik7XG5cbnZhciBpbmRleCA9ICh7XG4gICAgSU5TVEFMTEVEOiBJTlNUQUxMRUQsXG4gICAgYXV0b0RldGVjdFJlc291cmNlOiBhdXRvRGV0ZWN0UmVzb3VyY2UsXG4gICAgQXJyYXlSZXNvdXJjZTogQXJyYXlSZXNvdXJjZSxcbiAgICBCdWZmZXJSZXNvdXJjZTogQnVmZmVyUmVzb3VyY2UsXG4gICAgQ2FudmFzUmVzb3VyY2U6IENhbnZhc1Jlc291cmNlLFxuICAgIEN1YmVSZXNvdXJjZTogQ3ViZVJlc291cmNlLFxuICAgIEltYWdlUmVzb3VyY2U6IEltYWdlUmVzb3VyY2UsXG4gICAgSW1hZ2VCaXRtYXBSZXNvdXJjZTogSW1hZ2VCaXRtYXBSZXNvdXJjZSxcbiAgICBTVkdSZXNvdXJjZTogU1ZHUmVzb3VyY2UsXG4gICAgVmlkZW9SZXNvdXJjZTogVmlkZW9SZXNvdXJjZSxcbiAgICBSZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgQmFzZUltYWdlUmVzb3VyY2U6IEJhc2VJbWFnZVJlc291cmNlXG59KTtcblxuLyoqXG4gKiBTeXN0ZW0gaXMgYSBiYXNlIGNsYXNzIHVzZWQgZm9yIGV4dGVuZGluZyBzeXN0ZW1zIHVzZWQgYnkgdGhlIHtAbGluayBQSVhJLlJlbmRlcmVyfVxuICpcbiAqIEBzZWUgUElYSS5SZW5kZXJlciNhZGRTeXN0ZW1cbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFN5c3RlbSA9IGZ1bmN0aW9uIFN5c3RlbShyZW5kZXJlcilcbntcbiAgICAvKipcbiAgICAgKiBUaGUgcmVuZGVyZXIgdGhpcyBtYW5hZ2VyIHdvcmtzIGZvci5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuUmVuZGVyZXJ9XG4gICAgICovXG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xufTtcblxuLyoqXG4gKiBHZW5lcmljIGRlc3Ryb3kgbWV0aG9kcyB0byBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzdWJjbGFzc1xuICovXG5TeXN0ZW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy5yZW5kZXJlciA9IG51bGw7XG59O1xuXG4vKipcbiAqIFJlc291cmNlIHR5cGUgZm9yIERlcHRoVGV4dHVyZS5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5yZXNvdXJjZXMuQnVmZmVyUmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJLnJlc291cmNlc1xuICovXG52YXIgRGVwdGhSZXNvdXJjZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJ1ZmZlclJlc291cmNlKSB7XG4gICAgZnVuY3Rpb24gRGVwdGhSZXNvdXJjZSAoKSB7XG4gICAgICAgIEJ1ZmZlclJlc291cmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKCBCdWZmZXJSZXNvdXJjZSApIERlcHRoUmVzb3VyY2UuX19wcm90b19fID0gQnVmZmVyUmVzb3VyY2U7XG4gICAgRGVwdGhSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJSZXNvdXJjZSAmJiBCdWZmZXJSZXNvdXJjZS5wcm90b3R5cGUgKTtcbiAgICBEZXB0aFJlc291cmNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoUmVzb3VyY2U7XG5cbiAgICBEZXB0aFJlc291cmNlLnByb3RvdHlwZS51cGxvYWQgPSBmdW5jdGlvbiB1cGxvYWQgKHJlbmRlcmVyLCBiYXNlVGV4dHVyZSwgZ2xUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBiYXNlVGV4dHVyZS5hbHBoYU1vZGUgPT09IEFMUEhBX01PREVTLlVOUEFDSyk7XG5cbiAgICAgICAgaWYgKGdsVGV4dHVyZS53aWR0aCA9PT0gYmFzZVRleHR1cmUud2lkdGggJiYgZ2xUZXh0dXJlLmhlaWdodCA9PT0gYmFzZVRleHR1cmUuaGVpZ2h0KVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICAgIGJhc2VUZXh0dXJlLnRhcmdldCxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBiYXNlVGV4dHVyZS53aWR0aCxcbiAgICAgICAgICAgICAgICBiYXNlVGV4dHVyZS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgICAgICAgIGJhc2VUZXh0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZ2xUZXh0dXJlLndpZHRoID0gYmFzZVRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICBnbFRleHR1cmUuaGVpZ2h0ID0gYmFzZVRleHR1cmUuaGVpZ2h0O1xuXG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICAgICAgICAgIGJhc2VUZXh0dXJlLnRhcmdldCxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIC8vICBnbC5ERVBUSF9DT01QT05FTlQxNiBOZWVkZWQgZm9yIGRlcHRoIHRvIHJlbmRlciBwcm9wZXJseSBpbiB3ZWJnbDIuMFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmNvbnRleHQud2ViR0xWZXJzaW9uID09PSAxID8gZ2wuREVQVEhfQ09NUE9ORU5UIDogZ2wuREVQVEhfQ09NUE9ORU5UMTYsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUud2lkdGgsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgYmFzZVRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgICAgICAgIGJhc2VUZXh0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHJldHVybiBEZXB0aFJlc291cmNlO1xufShCdWZmZXJSZXNvdXJjZSkpO1xuXG4vKipcbiAqIEZyYW1lIGJ1ZmZlciB1c2VkIGJ5IHRoZSBCYXNlUmVuZGVyVGV4dHVyZVxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEZyYW1lYnVmZmVyID0gZnVuY3Rpb24gRnJhbWVidWZmZXIod2lkdGgsIGhlaWdodClcbntcbiAgICB0aGlzLndpZHRoID0gTWF0aC5jZWlsKHdpZHRoIHx8IDEwMCk7XG4gICAgdGhpcy5oZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0IHx8IDEwMCk7XG5cbiAgICB0aGlzLnN0ZW5jaWwgPSBmYWxzZTtcbiAgICB0aGlzLmRlcHRoID0gZmFsc2U7XG5cbiAgICB0aGlzLmRpcnR5SWQgPSAwO1xuICAgIHRoaXMuZGlydHlGb3JtYXQgPSAwO1xuICAgIHRoaXMuZGlydHlTaXplID0gMDtcblxuICAgIHRoaXMuZGVwdGhUZXh0dXJlID0gbnVsbDtcbiAgICB0aGlzLmNvbG9yVGV4dHVyZXMgPSBbXTtcblxuICAgIHRoaXMuZ2xGcmFtZWJ1ZmZlcnMgPSB7fTtcblxuICAgIHRoaXMuZGlzcG9zZVJ1bm5lciA9IG5ldyBSdW5uZXIoJ2Rpc3Bvc2VGcmFtZWJ1ZmZlcicsIDIpO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBjb2xvclRleHR1cmU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIGNvbG9yVGV4dHVyZS5cbiAqXG4gKiBAbWVtYmVyIHtQSVhJLlRleHR1cmVbXX1cbiAqIEByZWFkb25seVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5jb2xvclRleHR1cmUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5jb2xvclRleHR1cmVzWzBdO1xufTtcblxuLyoqXG4gKiBBZGQgdGV4dHVyZSB0byB0aGUgY29sb3JUZXh0dXJlIGFycmF5XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXSAtIEluZGV4IG9mIHRoZSBhcnJheSB0byBhZGQgdGhlIHRleHR1cmUgdG9cbiAqIEBwYXJhbSB7UElYSS5UZXh0dXJlfSBbdGV4dHVyZV0gLSBUZXh0dXJlIHRvIGFkZCB0byB0aGUgYXJyYXlcbiAqL1xuRnJhbWVidWZmZXIucHJvdG90eXBlLmFkZENvbG9yVGV4dHVyZSA9IGZ1bmN0aW9uIGFkZENvbG9yVGV4dHVyZSAoaW5kZXgsIHRleHR1cmUpXG57XG4gICAgICAgIGlmICggaW5kZXggPT09IHZvaWQgMCApIGluZGV4ID0gMDtcblxuICAgIC8vIFRPRE8gYWRkIHNvbWUgdmFsaWRhdGlvbiB0byB0aGUgdGV4dHVyZSAtIHNhbWUgd2lkdGggLyBoZWlnaHQgZXRjP1xuICAgIHRoaXMuY29sb3JUZXh0dXJlc1tpbmRleF0gPSB0ZXh0dXJlIHx8IG5ldyBCYXNlVGV4dHVyZShudWxsLCB7XG4gICAgICAgIHNjYWxlTW9kZTogU0NBTEVfTU9ERVMuTkVBUkVTVCxcbiAgICAgICAgcmVzb2x1dGlvbjogMSxcbiAgICAgICAgbWlwbWFwOiBmYWxzZSxcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcnR5SWQrKztcbiAgICB0aGlzLmRpcnR5Rm9ybWF0Kys7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgZGVwdGggdGV4dHVyZSB0byB0aGUgZnJhbWUgYnVmZmVyXG4gKlxuICogQHBhcmFtIHtQSVhJLlRleHR1cmV9IFt0ZXh0dXJlXSAtIFRleHR1cmUgdG8gYWRkXG4gKi9cbkZyYW1lYnVmZmVyLnByb3RvdHlwZS5hZGREZXB0aFRleHR1cmUgPSBmdW5jdGlvbiBhZGREZXB0aFRleHR1cmUgKHRleHR1cmUpXG57XG4gICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuICAgIHRoaXMuZGVwdGhUZXh0dXJlID0gdGV4dHVyZSB8fCBuZXcgQmFzZVRleHR1cmUobmV3IERlcHRoUmVzb3VyY2UobnVsbCwgeyB3aWR0aDogdGhpcy53aWR0aCwgaGVpZ2h0OiB0aGlzLmhlaWdodCB9KSwge1xuICAgICAgICBzY2FsZU1vZGU6IFNDQUxFX01PREVTLk5FQVJFU1QsXG4gICAgICAgIHJlc29sdXRpb246IDEsXG4gICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgICBtaXBtYXA6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6IEZPUk1BVFMuREVQVEhfQ09NUE9ORU5ULFxuICAgICAgICB0eXBlOiBUWVBFUy5VTlNJR05FRF9TSE9SVCxcbiAgICB9KTtcblxuICAgIHRoaXMuZGlydHlJZCsrO1xuICAgIHRoaXMuZGlydHlGb3JtYXQrKztcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbmFibGUgZGVwdGggb24gdGhlIGZyYW1lIGJ1ZmZlclxuICovXG5GcmFtZWJ1ZmZlci5wcm90b3R5cGUuZW5hYmxlRGVwdGggPSBmdW5jdGlvbiBlbmFibGVEZXB0aCAoKVxue1xuICAgIHRoaXMuZGVwdGggPSB0cnVlO1xuXG4gICAgdGhpcy5kaXJ0eUlkKys7XG4gICAgdGhpcy5kaXJ0eUZvcm1hdCsrO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVuYWJsZSBzdGVuY2lsIG9uIHRoZSBmcmFtZSBidWZmZXJcbiAqL1xuRnJhbWVidWZmZXIucHJvdG90eXBlLmVuYWJsZVN0ZW5jaWwgPSBmdW5jdGlvbiBlbmFibGVTdGVuY2lsICgpXG57XG4gICAgdGhpcy5zdGVuY2lsID0gdHJ1ZTtcblxuICAgIHRoaXMuZGlydHlJZCsrO1xuICAgIHRoaXMuZGlydHlGb3JtYXQrKztcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXNpemUgdGhlIGZyYW1lIGJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFdpZHRoIG9mIHRoZSBmcmFtZSBidWZmZXIgdG8gcmVzaXplIHRvXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBmcmFtZSBidWZmZXIgdG8gcmVzaXplIHRvXG4gKi9cbkZyYW1lYnVmZmVyLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiByZXNpemUgKHdpZHRoLCBoZWlnaHQpXG57XG4gICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGgpO1xuICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuXG4gICAgaWYgKHdpZHRoID09PSB0aGlzLndpZHRoICYmIGhlaWdodCA9PT0gdGhpcy5oZWlnaHQpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICB0aGlzLmRpcnR5SWQrKztcbiAgICB0aGlzLmRpcnR5U2l6ZSsrO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbG9yVGV4dHVyZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuY29sb3JUZXh0dXJlc1tpXTtcbiAgICAgICAgdmFyIHJlc29sdXRpb24gPSB0ZXh0dXJlLnJlc29sdXRpb247XG5cbiAgICAgICAgLy8gdGFrZSBpbnRvIGFjb3VudCB0aGUgZmFjdCB0aGUgdGV4dHVyZSBtYXkgaGF2ZSBhIGRpZmZlcmVudCByZXNvbHV0aW9uLi5cbiAgICAgICAgdGV4dHVyZS5zZXRTaXplKHdpZHRoIC8gcmVzb2x1dGlvbiwgaGVpZ2h0IC8gcmVzb2x1dGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwdGhUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgdmFyIHJlc29sdXRpb24kMSA9IHRoaXMuZGVwdGhUZXh0dXJlLnJlc29sdXRpb247XG5cbiAgICAgICAgdGhpcy5kZXB0aFRleHR1cmUuc2V0U2l6ZSh3aWR0aCAvIHJlc29sdXRpb24kMSwgaGVpZ2h0IC8gcmVzb2x1dGlvbiQxKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGRpc3Bvc2VzIFdlYkdMIHJlc291cmNlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhpcyBnZW9tZXRyeVxuICovXG5GcmFtZWJ1ZmZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UgKClcbntcbiAgICB0aGlzLmRpc3Bvc2VSdW5uZXIucnVuKHRoaXMsIGZhbHNlKTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBGcmFtZWJ1ZmZlci5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyQxICk7XG5cbi8qKlxuICogQSBCYXNlUmVuZGVyVGV4dHVyZSBpcyBhIHNwZWNpYWwgdGV4dHVyZSB0aGF0IGFsbG93cyBhbnkgUGl4aUpTIGRpc3BsYXkgb2JqZWN0IHRvIGJlIHJlbmRlcmVkIHRvIGl0LlxuICpcbiAqIF9fSGludF9fOiBBbGwgRGlzcGxheU9iamVjdHMgKGkuZS4gU3ByaXRlcykgdGhhdCByZW5kZXIgdG8gYSBCYXNlUmVuZGVyVGV4dHVyZSBzaG91bGQgYmUgcHJlbG9hZGVkXG4gKiBvdGhlcndpc2UgYmxhY2sgcmVjdGFuZ2xlcyB3aWxsIGJlIGRyYXduIGluc3RlYWQuXG4gKlxuICogQSBCYXNlUmVuZGVyVGV4dHVyZSB0YWtlcyBhIHNuYXBzaG90IG9mIGFueSBEaXNwbGF5IE9iamVjdCBnaXZlbiB0byBpdHMgcmVuZGVyIG1ldGhvZC4gVGhlIHBvc2l0aW9uXG4gKiBhbmQgcm90YXRpb24gb2YgdGhlIGdpdmVuIERpc3BsYXkgT2JqZWN0cyBpcyBpZ25vcmVkLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogbGV0IHJlbmRlcmVyID0gUElYSS5hdXRvRGV0ZWN0UmVuZGVyZXIoKTtcbiAqIGxldCBiYXNlUmVuZGVyVGV4dHVyZSA9IG5ldyBQSVhJLkJhc2VSZW5kZXJUZXh0dXJlKHsgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfSk7XG4gKiBsZXQgcmVuZGVyVGV4dHVyZSA9IG5ldyBQSVhJLlJlbmRlclRleHR1cmUoYmFzZVJlbmRlclRleHR1cmUpO1xuICogbGV0IHNwcml0ZSA9IFBJWEkuU3ByaXRlLmZyb20oXCJzcGluT2JqXzAxLnBuZ1wiKTtcbiAqXG4gKiBzcHJpdGUucG9zaXRpb24ueCA9IDgwMC8yO1xuICogc3ByaXRlLnBvc2l0aW9uLnkgPSA2MDAvMjtcbiAqIHNwcml0ZS5hbmNob3IueCA9IDAuNTtcbiAqIHNwcml0ZS5hbmNob3IueSA9IDAuNTtcbiAqXG4gKiByZW5kZXJlci5yZW5kZXIoc3ByaXRlLCByZW5kZXJUZXh0dXJlKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBTcHJpdGUgaW4gdGhpcyBjYXNlIHdpbGwgYmUgcmVuZGVyZWQgdXNpbmcgaXRzIGxvY2FsIHRyYW5zZm9ybS4gVG8gcmVuZGVyIHRoaXMgc3ByaXRlIGF0IDAsMFxuICogeW91IGNhbiBjbGVhciB0aGUgdHJhbnNmb3JtXG4gKlxuICogYGBganNcbiAqXG4gKiBzcHJpdGUuc2V0VHJhbnNmb3JtKClcbiAqXG4gKiBsZXQgYmFzZVJlbmRlclRleHR1cmUgPSBuZXcgUElYSS5CYXNlUmVuZGVyVGV4dHVyZSh7IHdpZHRoOiAxMDAsIGhlaWdodDogMTAwIH0pO1xuICogbGV0IHJlbmRlclRleHR1cmUgPSBuZXcgUElYSS5SZW5kZXJUZXh0dXJlKGJhc2VSZW5kZXJUZXh0dXJlKTtcbiAqXG4gKiByZW5kZXJlci5yZW5kZXIoc3ByaXRlLCByZW5kZXJUZXh0dXJlKTsgIC8vIFJlbmRlcnMgdG8gY2VudGVyIG9mIFJlbmRlclRleHR1cmVcbiAqIGBgYFxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5CYXNlVGV4dHVyZVxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEJhc2VSZW5kZXJUZXh0dXJlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmFzZVRleHR1cmUpIHtcbiAgICBmdW5jdGlvbiBCYXNlUmVuZGVyVGV4dHVyZShvcHRpb25zKVxuICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJylcbiAgICAgICAge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIHNpZ25hdHVyZVxuICAgICAgICAgICAgdmFyIHdpZHRoJDEgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICB2YXIgaGVpZ2h0JDEgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB2YXIgc2NhbGVNb2RlID0gYXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgdmFyIHJlc29sdXRpb24gPSBhcmd1bWVudHNbM107XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSB7IHdpZHRoOiB3aWR0aCQxLCBoZWlnaHQ6IGhlaWdodCQxLCBzY2FsZU1vZGU6IHNjYWxlTW9kZSwgcmVzb2x1dGlvbjogcmVzb2x1dGlvbiB9O1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgICAgICAgfVxuXG4gICAgICAgIEJhc2VUZXh0dXJlLmNhbGwodGhpcywgbnVsbCwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlZiA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciB3aWR0aCA9IHJlZi53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IHJlZi5oZWlnaHQ7XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICAgIHRoaXMubWlwbWFwID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwod2lkdGgpIHx8IDEwMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KSB8fCAxMDA7XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgY2FudmFzIHJlbmRlciB0YXJnZXQgKHdlIG9ubHkgbmVlZCBvbmUgYXMgdGhpcyBjYW4gYmUgc2hhcmVkIGFjcm9zcyByZW5kZXJlcnMpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fY2FudmFzUmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSBbMCwgMCwgMCwgMF07XG5cbiAgICAgICAgdGhpcy5mcmFtZWJ1ZmZlciA9IG5ldyBGcmFtZWJ1ZmZlcih0aGlzLndpZHRoICogdGhpcy5yZXNvbHV0aW9uLCB0aGlzLmhlaWdodCAqIHRoaXMucmVzb2x1dGlvbilcbiAgICAgICAgICAgIC5hZGRDb2xvclRleHR1cmUoMCwgdGhpcyk7XG5cbiAgICAgICAgLy8gVE9ETyAtIGNvdWxkIHRoaXMgYmUgYWRkZWQgdGhlIHN5c3RlbXM/XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHN0ZW5jaWwgbWFza3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTWFza0RhdGFbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFza1N0YWNrID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIGZpbHRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge09iamVjdFtdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXJTdGFjayA9IFt7fV07XG4gICAgfVxuXG4gICAgaWYgKCBCYXNlVGV4dHVyZSApIEJhc2VSZW5kZXJUZXh0dXJlLl9fcHJvdG9fXyA9IEJhc2VUZXh0dXJlO1xuICAgIEJhc2VSZW5kZXJUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJhc2VUZXh0dXJlICYmIEJhc2VUZXh0dXJlLnByb3RvdHlwZSApO1xuICAgIEJhc2VSZW5kZXJUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJhc2VSZW5kZXJUZXh0dXJlO1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgQmFzZVJlbmRlclRleHR1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggdG8gcmVzaXplIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IHRvIHJlc2l6ZSB0by5cbiAgICAgKi9cbiAgICBCYXNlUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplICh3aWR0aCwgaGVpZ2h0KVxuICAgIHtcbiAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGgpO1xuICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5mcmFtZWJ1ZmZlci5yZXNpemUod2lkdGggKiB0aGlzLnJlc29sdXRpb24sIGhlaWdodCAqIHRoaXMucmVzb2x1dGlvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZyZWVzIHRoZSB0ZXh0dXJlIGFuZCBmcmFtZWJ1ZmZlciBmcm9tIFdlYkdMIG1lbW9yeSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhpcyB0ZXh0dXJlIG9iamVjdC5cbiAgICAgKiBUaGlzIG1lYW5zIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSB0ZXh0dXJlIGxhdGVyIHdoaWNoIHdpbGwgdXBsb2FkIGl0IHRvIEdQVVxuICAgICAqIG1lbW9yeSBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIEBmaXJlcyBQSVhJLkJhc2VUZXh0dXJlI2Rpc3Bvc2VcbiAgICAgKi9cbiAgICBCYXNlUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZnJhbWVidWZmZXIuZGlzcG9zZSgpO1xuXG4gICAgICAgIEJhc2VUZXh0dXJlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dHVyZS5cbiAgICAgKlxuICAgICAqL1xuICAgIEJhc2VSZW5kZXJUZXh0dXJlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgQmFzZVRleHR1cmUucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzLCB0cnVlKTtcblxuICAgICAgICB0aGlzLmZyYW1lYnVmZmVyID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEJhc2VSZW5kZXJUZXh0dXJlO1xufShCYXNlVGV4dHVyZSkpO1xuXG4vKipcbiAqIFN0b3JlcyBhIHRleHR1cmUncyBmcmFtZSBpbiBVViBjb29yZGluYXRlcywgaW5cbiAqIHdoaWNoIGV2ZXJ5dGhpbmcgbGllcyBpbiB0aGUgcmVjdGFuZ2xlIGBbKDAsMCksICgxLDApLFxuICogKDEsMSksICgwLDEpXWAuXG4gKlxuICogfCBDb3JuZXIgICAgICAgfCBDb29yZGluYXRlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiAqIHwgVG9wLUxlZnQgICAgIHwgYCh4MCx5MClgICAgfFxuICogfCBUb3AtUmlnaHQgICAgfCBgKHgxLHkxKWAgICB8XG4gKiB8IEJvdHRvbS1SaWdodCB8IGAoeDIseTIpYCAgIHxcbiAqIHwgQm90dG9tLUxlZnQgIHwgYCh4Myx5MylgICAgfFxuICpcbiAqIEBjbGFzc1xuICogQHByb3RlY3RlZFxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRleHR1cmVVdnMgPSBmdW5jdGlvbiBUZXh0dXJlVXZzKClcbntcbiAgICAvKipcbiAgICAgKiBYLWNvbXBvbmVudCBvZiB0b3AtbGVmdCBjb3JuZXIgYCh4MCx5MClgLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueDAgPSAwO1xuXG4gICAgLyoqXG4gICAgICogWS1jb21wb25lbnQgb2YgdG9wLWxlZnQgY29ybmVyIGAoeDAseTApYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnkwID0gMDtcblxuICAgIC8qKlxuICAgICAqIFgtY29tcG9uZW50IG9mIHRvcC1yaWdodCBjb3JuZXIgYCh4MSx5MSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueDEgPSAxO1xuXG4gICAgLyoqXG4gICAgICogWS1jb21wb25lbnQgb2YgdG9wLXJpZ2h0IGNvcm5lciBgKHgxLHkxKWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy55MSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBYLWNvbXBvbmVudCBvZiBib3R0b20tcmlnaHQgY29ybmVyIGAoeDIseTIpYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLngyID0gMTtcblxuICAgIC8qKlxuICAgICAqIFktY29tcG9uZW50IG9mIGJvdHRvbS1yaWdodCBjb3JuZXIgYCh4Mix5MilgLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueTIgPSAxO1xuXG4gICAgLyoqXG4gICAgICogWC1jb21wb25lbnQgb2YgYm90dG9tLWxlZnQgY29ybmVyIGAoeDMseTMpYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLngzID0gMDtcblxuICAgIC8qKlxuICAgICAqIFktY29tcG9uZW50IG9mIGJvdHRvbS1yaWdodCBjb3JuZXIgYCh4Myx5MylgLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMueTMgPSAxO1xuXG4gICAgdGhpcy51dnNGbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSg4KTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdGV4dHVyZSBVdnMgYmFzZWQgb24gdGhlIGdpdmVuIGZyYW1lIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IGZyYW1lIC0gVGhlIGZyYW1lIG9mIHRoZSB0ZXh0dXJlXG4gKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBiYXNlRnJhbWUgLSBUaGUgYmFzZSBmcmFtZSBvZiB0aGUgdGV4dHVyZVxuICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0ZSAtIFJvdGF0aW9uIG9mIGZyYW1lLCBzZWUge0BsaW5rIFBJWEkuZ3JvdXBEOH1cbiAqL1xuVGV4dHVyZVV2cy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChmcmFtZSwgYmFzZUZyYW1lLCByb3RhdGUpXG57XG4gICAgdmFyIHR3ID0gYmFzZUZyYW1lLndpZHRoO1xuICAgIHZhciB0aCA9IGJhc2VGcmFtZS5oZWlnaHQ7XG5cbiAgICBpZiAocm90YXRlKVxuICAgIHtcbiAgICAgICAgLy8gd2lkdGggYW5kIGhlaWdodCBkaXYgMiBkaXYgYmFzZUZyYW1lIHNpemVcbiAgICAgICAgdmFyIHcyID0gZnJhbWUud2lkdGggLyAyIC8gdHc7XG4gICAgICAgIHZhciBoMiA9IGZyYW1lLmhlaWdodCAvIDIgLyB0aDtcblxuICAgICAgICAvLyBjb29yZGluYXRlcyBvZiBjZW50ZXJcbiAgICAgICAgdmFyIGNYID0gKGZyYW1lLnggLyB0dykgKyB3MjtcbiAgICAgICAgdmFyIGNZID0gKGZyYW1lLnkgLyB0aCkgKyBoMjtcblxuICAgICAgICByb3RhdGUgPSBncm91cEQ4LmFkZChyb3RhdGUsIGdyb3VwRDguTlcpOyAvLyBOVyBpcyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgICAgdGhpcy54MCA9IGNYICsgKHcyICogZ3JvdXBEOC51WChyb3RhdGUpKTtcbiAgICAgICAgdGhpcy55MCA9IGNZICsgKGgyICogZ3JvdXBEOC51WShyb3RhdGUpKTtcblxuICAgICAgICByb3RhdGUgPSBncm91cEQ4LmFkZChyb3RhdGUsIDIpOyAvLyByb3RhdGUgOTAgZGVncmVlcyBjbG9ja3dpc2VcbiAgICAgICAgdGhpcy54MSA9IGNYICsgKHcyICogZ3JvdXBEOC51WChyb3RhdGUpKTtcbiAgICAgICAgdGhpcy55MSA9IGNZICsgKGgyICogZ3JvdXBEOC51WShyb3RhdGUpKTtcblxuICAgICAgICByb3RhdGUgPSBncm91cEQ4LmFkZChyb3RhdGUsIDIpO1xuICAgICAgICB0aGlzLngyID0gY1ggKyAodzIgKiBncm91cEQ4LnVYKHJvdGF0ZSkpO1xuICAgICAgICB0aGlzLnkyID0gY1kgKyAoaDIgKiBncm91cEQ4LnVZKHJvdGF0ZSkpO1xuXG4gICAgICAgIHJvdGF0ZSA9IGdyb3VwRDguYWRkKHJvdGF0ZSwgMik7XG4gICAgICAgIHRoaXMueDMgPSBjWCArICh3MiAqIGdyb3VwRDgudVgocm90YXRlKSk7XG4gICAgICAgIHRoaXMueTMgPSBjWSArIChoMiAqIGdyb3VwRDgudVkocm90YXRlKSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHRoaXMueDAgPSBmcmFtZS54IC8gdHc7XG4gICAgICAgIHRoaXMueTAgPSBmcmFtZS55IC8gdGg7XG5cbiAgICAgICAgdGhpcy54MSA9IChmcmFtZS54ICsgZnJhbWUud2lkdGgpIC8gdHc7XG4gICAgICAgIHRoaXMueTEgPSBmcmFtZS55IC8gdGg7XG5cbiAgICAgICAgdGhpcy54MiA9IChmcmFtZS54ICsgZnJhbWUud2lkdGgpIC8gdHc7XG4gICAgICAgIHRoaXMueTIgPSAoZnJhbWUueSArIGZyYW1lLmhlaWdodCkgLyB0aDtcblxuICAgICAgICB0aGlzLngzID0gZnJhbWUueCAvIHR3O1xuICAgICAgICB0aGlzLnkzID0gKGZyYW1lLnkgKyBmcmFtZS5oZWlnaHQpIC8gdGg7XG4gICAgfVxuXG4gICAgdGhpcy51dnNGbG9hdDMyWzBdID0gdGhpcy54MDtcbiAgICB0aGlzLnV2c0Zsb2F0MzJbMV0gPSB0aGlzLnkwO1xuICAgIHRoaXMudXZzRmxvYXQzMlsyXSA9IHRoaXMueDE7XG4gICAgdGhpcy51dnNGbG9hdDMyWzNdID0gdGhpcy55MTtcbiAgICB0aGlzLnV2c0Zsb2F0MzJbNF0gPSB0aGlzLngyO1xuICAgIHRoaXMudXZzRmxvYXQzMls1XSA9IHRoaXMueTI7XG4gICAgdGhpcy51dnNGbG9hdDMyWzZdID0gdGhpcy54MztcbiAgICB0aGlzLnV2c0Zsb2F0MzJbN10gPSB0aGlzLnkzO1xufTtcblxudmFyIERFRkFVTFRfVVZTID0gbmV3IFRleHR1cmVVdnMoKTtcblxuLyoqXG4gKiBBIHRleHR1cmUgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHJlcHJlc2VudHMgYW4gaW1hZ2Ugb3IgcGFydCBvZiBhbiBpbWFnZS5cbiAqXG4gKiBJdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIGRpc3BsYXkgbGlzdCBkaXJlY3RseTsgaW5zdGVhZCB1c2UgaXQgYXMgdGhlIHRleHR1cmUgZm9yIGEgU3ByaXRlLlxuICogSWYgbm8gZnJhbWUgaXMgcHJvdmlkZWQgZm9yIGEgdGV4dHVyZSwgdGhlbiB0aGUgd2hvbGUgaW1hZ2UgaXMgdXNlZC5cbiAqXG4gKiBZb3UgY2FuIGRpcmVjdGx5IGNyZWF0ZSBhIHRleHR1cmUgZnJvbSBhbiBpbWFnZSBhbmQgdGhlbiByZXVzZSBpdCBtdWx0aXBsZSB0aW1lcyBsaWtlIHRoaXMgOlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgdGV4dHVyZSA9IFBJWEkuVGV4dHVyZS5mcm9tKCdhc3NldHMvaW1hZ2UucG5nJyk7XG4gKiBsZXQgc3ByaXRlMSA9IG5ldyBQSVhJLlNwcml0ZSh0ZXh0dXJlKTtcbiAqIGxldCBzcHJpdGUyID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xuICogYGBgXG4gKlxuICogSWYgeW91IGRpZG50IHBhc3MgdGhlIHRleHR1cmUgZnJhbWUgdG8gY29uc3RydWN0b3IsIGl0IGVuYWJsZXMgYG5vRnJhbWVgIG1vZGU6XG4gKiBpdCBzdWJzY3JpYmVzIG9uIGJhc2VUZXh0dXJlIGV2ZW50cywgaXQgYXV0b21hdGljYWxseSByZXNpemVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgYmFzZVRleHR1cmUuXG4gKlxuICogVGV4dHVyZXMgbWFkZSBmcm9tIFNWR3MsIGxvYWRlZCBvciBub3QsIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlsZSBmaW5pc2hlcyBwcm9jZXNzaW5nLlxuICogWW91IGNhbiBjaGVjayBmb3IgdGhpcyBieSBjaGVja2luZyB0aGUgc3ByaXRlJ3MgX3RleHR1cmVJRCBwcm9wZXJ0eS5cbiAqIGBgYGpzXG4gKiB2YXIgdGV4dHVyZSA9IFBJWEkuVGV4dHVyZS5mcm9tKCdhc3NldHMvaW1hZ2Uuc3ZnJyk7XG4gKiB2YXIgc3ByaXRlMSA9IG5ldyBQSVhJLlNwcml0ZSh0ZXh0dXJlKTtcbiAqIC8vc3ByaXRlMS5fdGV4dHVyZUlEIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIGlmIHRoZSB0ZXh0dXJlIGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSBTVkcgZmlsZVxuICogYGBgXG4gKiBZb3UgY2FuIHVzZSBhIHRpY2tlciBvciByQUYgdG8gZW5zdXJlIHlvdXIgc3ByaXRlcyBsb2FkIHRoZSBmaW5pc2hlZCB0ZXh0dXJlcyBhZnRlciBwcm9jZXNzaW5nLiBTZWUgaXNzdWUgIzMwNjguXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLnV0aWxzLkV2ZW50RW1pdHRlclxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRleHR1cmUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChFdmVudEVtaXR0ZXIpIHtcbiAgICBmdW5jdGlvbiBUZXh0dXJlKGJhc2VUZXh0dXJlLCBmcmFtZSwgb3JpZywgdHJpbSwgcm90YXRlLCBhbmNob3IpXG4gICAge1xuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRG9lcyB0aGlzIFRleHR1cmUgaGF2ZSBhbnkgZnJhbWUgZGF0YSBhc3NpZ25lZCB0byBpdD9cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBtb2RlIGlzIGVuYWJsZWQgYXV0b21hdGljYWxseSBpZiBubyBmcmFtZSB3YXMgcGFzc2VkIGluc2lkZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICpcbiAgICAgICAgICogSW4gdGhpcyBtb2RlIHRleHR1cmUgaXMgc3Vic2NyaWJlZCB0byBiYXNlVGV4dHVyZSBldmVudHMsIGFuZCBmaXJlcyBgdXBkYXRlYCBvbiBhbnkgY2hhbmdlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBCZXdhcmUsIGFmdGVyIGxvYWRpbmcgb3IgcmVzaXplIG9mIGJhc2VUZXh0dXJlIGV2ZW50IGNhbiBmaXJlZCB0d28gdGltZXMhXG4gICAgICAgICAqIElmIHlvdSB3YW50IG1vcmUgY29udHJvbCwgc3Vic2NyaWJlIG9uIGJhc2VUZXh0dXJlIGl0c2VsZi5cbiAgICAgICAgICpcbiAgICAgICAgICogYGBganNcbiAgICAgICAgICogdGV4dHVyZS5vbigndXBkYXRlJywgKCkgPT4ge30pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQW55IGFzc2lnbm1lbnQgb2YgYGZyYW1lYCBzd2l0Y2hlcyBvZmYgYG5vRnJhbWVgIG1vZGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vRnJhbWUgPSBmYWxzZTtcblxuICAgICAgICBpZiAoIWZyYW1lKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5vRnJhbWUgPSB0cnVlO1xuICAgICAgICAgICAgZnJhbWUgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhc2VUZXh0dXJlIGluc3RhbmNlb2YgVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgYmFzZVRleHR1cmUgPSBiYXNlVGV4dHVyZS5iYXNlVGV4dHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYmFzZSB0ZXh0dXJlIHRoYXQgdGhpcyB0ZXh0dXJlIHVzZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJhc2VUZXh0dXJlID0gYmFzZVRleHR1cmU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIGFyZWEgb2YgdGhlIEJhc2VUZXh0dXJlIGltYWdlIHRvIGFjdHVhbGx5IGNvcHkgdG8gdGhlIENhbnZhcyAvIFdlYkdMIHdoZW4gcmVuZGVyaW5nLFxuICAgICAgICAgKiBpcnJlc3BlY3RpdmUgb2YgdGhlIGFjdHVhbCBmcmFtZSBzaXplIG9yIHBsYWNlbWVudCAod2hpY2ggY2FuIGJlIGluZmx1ZW5jZWQgYnkgdHJpbW1lZCB0ZXh0dXJlIGF0bGFzZXMpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZnJhbWUgPSBmcmFtZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB0aGUgdHJpbW1lZCBhcmVhIG9mIG9yaWdpbmFsIHRleHR1cmUsIGJlZm9yZSBpdCB3YXMgcHV0IGluIGF0bGFzXG4gICAgICAgICAqIFBsZWFzZSBjYWxsIGB1cGRhdGVVdnMoKWAgYWZ0ZXIgeW91IGNoYW5nZSBjb29yZGluYXRlcyBvZiBgdHJpbWAgbWFudWFsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmltID0gdHJpbTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyB3aWxsIGxldCB0aGUgcmVuZGVyZXIga25vdyBpZiB0aGUgdGV4dHVyZSBpcyB2YWxpZC4gSWYgaXQncyBub3QgdGhlbiBpdCBjYW5ub3QgYmUgcmVuZGVyZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgd2lsbCBsZXQgYSByZW5kZXJlciBrbm93IHRoYXQgYSB0ZXh0dXJlIGhhcyBiZWVuIHVwZGF0ZWQgKHVzZWQgbWFpbmx5IGZvciBXZWJHTCB1diB1cGRhdGVzKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXF1aXJlc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgV2ViR0wgVVYgZGF0YSBjYWNoZS4gQ2FuIGJlIHVzZWQgYXMgcXVhZCBVVlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlRleHR1cmVVdnN9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3V2cyA9IERFRkFVTFRfVVZTO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZhdWx0IFRleHR1cmVNYXRyaXggaW5zdGFuY2UgZm9yIHRoaXMgdGV4dHVyZVxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoYXQgb2JqZWN0IGlzIG5vdCBjcmVhdGVkIGJlY2F1c2UgaXRzIGhlYXZ5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuVGV4dHVyZU1hdHJpeH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXZNYXRyaXggPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGlzIHRoZSBhcmVhIG9mIG9yaWdpbmFsIHRleHR1cmUsIGJlZm9yZSBpdCB3YXMgcHV0IGluIGF0bGFzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcmlnID0gb3JpZyB8fCBmcmFtZTsvLyBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpO1xuXG4gICAgICAgIHRoaXMuX3JvdGF0ZSA9IE51bWJlcihyb3RhdGUgfHwgMCk7XG5cbiAgICAgICAgaWYgKHJvdGF0ZSA9PT0gdHJ1ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBvbGQgdGV4dHVyZXBhY2tlciBsZWdhY3ksIHNvbWUgZ2FtZXMvbGlicmFyaWVzIGFyZSBwYXNzaW5nIFwidHJ1ZVwiIGZvciByb3RhdGVkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLl9yb3RhdGUgPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3JvdGF0ZSAlIDIgIT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdCB0byB1c2UgZGlhbW9uZC1zaGFwZWQgVVZzLiBJZiB5b3UgYXJlIHN1cmUsIHNldCByb3RhdGlvbiBtYW51YWxseScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuY2hvciBwb2ludCB0aGF0IGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBzcHJpdGUgaXMgY3JlYXRlZCB3aXRoIHRoaXMgdGV4dHVyZS5cbiAgICAgICAgICogQ2hhbmdpbmcgdGhlIGBkZWZhdWx0QW5jaG9yYCBhdCBhIGxhdGVyIHBvaW50IG9mIHRpbWUgd2lsbCBub3QgdXBkYXRlIFNwcml0ZSdzIGFuY2hvciBwb2ludC5cbiAgICAgICAgICogQG1lbWJlciB7UElYSS5Qb2ludH1cbiAgICAgICAgICogQGRlZmF1bHQgezAsMH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVmYXVsdEFuY2hvciA9IGFuY2hvciA/IG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpIDogbmV3IFBvaW50KDAsIDApO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgSUQgaXMgb2JzZXJ2ZWQgYnkgc3ByaXRlcyBhbmQgVGV4dHVyZU1hdHJpeCBpbnN0YW5jZXMuXG4gICAgICAgICAqIENhbGwgdXBkYXRlVXZzKCkgdG8gaW5jcmVtZW50IGl0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG5cbiAgICAgICAgdGhpcy5fdXBkYXRlSUQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaWRzIHVuZGVyIHdoaWNoIHRoaXMgVGV4dHVyZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgdGV4dHVyZSBjYWNoZS4gVGhpcyBpc1xuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHNldCBhcyBsb25nIGFzIFRleHR1cmUuYWRkVG9DYWNoZSBpcyB1c2VkLCBidXQgbWF5IG5vdCBiZSBzZXQgaWYgYVxuICAgICAgICAgKiBUZXh0dXJlIGlzIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSBUZXh0dXJlQ2FjaGUgYXJyYXkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge3N0cmluZ1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50ZXh0dXJlQ2FjaGVJZHMgPSBbXTtcblxuICAgICAgICBpZiAoIWJhc2VUZXh0dXJlLnZhbGlkKVxuICAgICAgICB7XG4gICAgICAgICAgICBiYXNlVGV4dHVyZS5vbmNlKCdsb2FkZWQnLCB0aGlzLm9uQmFzZVRleHR1cmVVcGRhdGVkLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm5vRnJhbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGZyYW1lIHdlIHNob3VsZCBtb25pdG9yIGZvciBhbnkgYmFzZSB0ZXh0dXJlIGNoYW5nZXMuLlxuICAgICAgICAgICAgaWYgKGJhc2VUZXh0dXJlLnZhbGlkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMub25CYXNlVGV4dHVyZVVwZGF0ZWQoYmFzZVRleHR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubm9GcmFtZSlcbiAgICAgICAge1xuICAgICAgICAgICAgYmFzZVRleHR1cmUub24oJ3VwZGF0ZScsIHRoaXMub25CYXNlVGV4dHVyZVVwZGF0ZWQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCBFdmVudEVtaXR0ZXIgKSBUZXh0dXJlLl9fcHJvdG9fXyA9IEV2ZW50RW1pdHRlcjtcbiAgICBUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2ZW50RW1pdHRlciAmJiBFdmVudEVtaXR0ZXIucHJvdG90eXBlICk7XG4gICAgVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0dXJlO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgcmVzb2x1dGlvbjogeyBjb25maWd1cmFibGU6IHRydWUgfSxmcmFtZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxyb3RhdGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sd2lkdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0saGVpZ2h0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoaXMgdGV4dHVyZSBvbiB0aGUgZ3B1LlxuICAgICAqXG4gICAgICogQ2FsbHMgdGhlIFRleHR1cmVSZXNvdXJjZSB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgYWRqdXN0ZWQgYGZyYW1lYCBtYW51YWxseSwgcGxlYXNlIGNhbGwgYHVwZGF0ZVV2cygpYCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICovXG4gICAgVGV4dHVyZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5iYXNlVGV4dHVyZS5yZXNvdXJjZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iYXNlVGV4dHVyZS5yZXNvdXJjZS51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYmFzZSB0ZXh0dXJlIGlzIHVwZGF0ZWRcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IGJhc2VUZXh0dXJlIC0gVGhlIGJhc2UgdGV4dHVyZS5cbiAgICAgKi9cbiAgICBUZXh0dXJlLnByb3RvdHlwZS5vbkJhc2VUZXh0dXJlVXBkYXRlZCA9IGZ1bmN0aW9uIG9uQmFzZVRleHR1cmVVcGRhdGVkIChiYXNlVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLm5vRnJhbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlVGV4dHVyZS52YWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLndpZHRoID0gYmFzZVRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZS5oZWlnaHQgPSBiYXNlVGV4dHVyZS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXZzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPIHRoaXMgY29kZSBsb29rcyBjb25mdXNpbmcuLiBib28gdG8gYWJ1c2luZyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIVxuICAgICAgICAgICAgLy8gaWYgdXNlciBnYXZlIHVzIGZyYW1lIHRoYXQgaGFzIGJpZ2dlciBzaXplIHRoYW4gcmVzaXplZCB0ZXh0dXJlIGl0IGNhbiBiZSBhIHByb2JsZW1cbiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSB0aGlzLl9mcmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgndXBkYXRlJywgdGhpcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dHVyZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveUJhc2U9ZmFsc2VdIFdoZXRoZXIgdG8gZGVzdHJveSB0aGUgYmFzZSB0ZXh0dXJlIGFzIHdlbGxcbiAgICAgKi9cbiAgICBUZXh0dXJlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoZGVzdHJveUJhc2UpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5iYXNlVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGRlc3Ryb3lCYXNlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzLmJhc2VUZXh0dXJlO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IHJlZi5yZXNvdXJjZTtcblxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGV4dHVyZSBpZiBpdCBleGlzdHMgaW4gdGhlIHRleHR1cmUgY2FjaGUuLlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgb25seSBuZWVkcyB0byBiZSByZW1vdmVkIGlmIHRoZSBiYXNlIHRleHR1cmUgaXMgYWN0dWFsbHkgZGVzdHJveWVkIHRvby4uXG4gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICYmIFRleHR1cmVDYWNoZVtyZXNvdXJjZS51cmxdKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS5yZW1vdmVGcm9tQ2FjaGUocmVzb3VyY2UudXJsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5iYXNlVGV4dHVyZS5vZmYoJ2xvYWRlZCcsIHRoaXMub25CYXNlVGV4dHVyZVVwZGF0ZWQsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5iYXNlVGV4dHVyZS5vZmYoJ3VwZGF0ZScsIHRoaXMub25CYXNlVGV4dHVyZVVwZGF0ZWQsIHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLmJhc2VUZXh0dXJlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZyYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXZzID0gbnVsbDtcbiAgICAgICAgdGhpcy50cmltID0gbnVsbDtcbiAgICAgICAgdGhpcy5vcmlnID0gbnVsbDtcblxuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgVGV4dHVyZS5yZW1vdmVGcm9tQ2FjaGUodGhpcyk7XG4gICAgICAgIHRoaXMudGV4dHVyZUNhY2hlSWRzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0ZXh0dXJlIG9iamVjdCB0aGF0IGFjdHMgdGhlIHNhbWUgYXMgdGhpcyBvbmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLlRleHR1cmV9IFRoZSBuZXcgdGV4dHVyZVxuICAgICAqL1xuICAgIFRleHR1cmUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKClcbiAgICB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dHVyZSh0aGlzLmJhc2VUZXh0dXJlLFxuICAgICAgICAgICAgdGhpcy5mcmFtZS5jbG9uZSgpLFxuICAgICAgICAgICAgdGhpcy5vcmlnLmNsb25lKCksXG4gICAgICAgICAgICB0aGlzLnRyaW0gJiYgdGhpcy50cmltLmNsb25lKCksXG4gICAgICAgICAgICB0aGlzLnJvdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEFuY2hvclxuICAgICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBXZWJHTCBVViBjYWNoZS4gVXNlIGl0IGFmdGVyIHlvdSBjaGFuZ2UgYGZyYW1lYCBvciBgdHJpbWAgb2YgdGhlIHRleHR1cmUuXG4gICAgICogQ2FsbCBpdCBhZnRlciBjaGFuZ2luZyB0aGUgZnJhbWVcbiAgICAgKi9cbiAgICBUZXh0dXJlLnByb3RvdHlwZS51cGRhdGVVdnMgPSBmdW5jdGlvbiB1cGRhdGVVdnMgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl91dnMgPT09IERFRkFVTFRfVVZTKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91dnMgPSBuZXcgVGV4dHVyZVV2cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXZzLnNldCh0aGlzLl9mcmFtZSwgdGhpcy5iYXNlVGV4dHVyZSwgdGhpcy5yb3RhdGUpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUlEKys7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgVGV4dHVyZSBiYXNlZCBvbiB0aGUgc291cmNlIHlvdSBwcm92aWRlLlxuICAgICAqIFRoZSBzb3VyY2UgY2FuIGJlIC0gZnJhbWUgaWQsIGltYWdlIHVybCwgdmlkZW8gdXJsLCBjYW52YXMgZWxlbWVudCwgdmlkZW8gZWxlbWVudCwgYmFzZSB0ZXh0dXJlXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxIVE1MVmlkZW9FbGVtZW50fFBJWEkuQmFzZVRleHR1cmV9IHNvdXJjZVxuICAgICAqICAgICAgICBTb3VyY2UgdG8gY3JlYXRlIHRleHR1cmUgZnJvbVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gU2VlIHtAbGluayBQSVhJLkJhc2VUZXh0dXJlfSdzIGNvbnN0cnVjdG9yIGZvciBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0cmljdF0gRW5mb3JjZSBzdHJpY3QtbW9kZSwgc2VlIHtAbGluayBQSVhJLnNldHRpbmdzLlNUUklDVF9URVhUVVJFX0NBQ0hFfS5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlRleHR1cmV9IFRoZSBuZXdseSBjcmVhdGVkIHRleHR1cmVcbiAgICAgKi9cbiAgICBUZXh0dXJlLmZyb20gPSBmdW5jdGlvbiBmcm9tIChzb3VyY2UsIG9wdGlvbnMsIHN0cmljdClcbiAgICB7XG4gICAgICAgIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoIHN0cmljdCA9PT0gdm9pZCAwICkgc3RyaWN0ID0gc2V0dGluZ3MuU1RSSUNUX1RFWFRVUkVfQ0FDSEU7XG5cbiAgICAgICAgdmFyIGlzRnJhbWUgPSB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJztcbiAgICAgICAgdmFyIGNhY2hlSWQgPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0ZyYW1lKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWNoZUlkID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UuX3BpeGlJZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UuX3BpeGlJZCA9IFwicGl4aWlkX1wiICsgKHVpZCgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FjaGVJZCA9IHNvdXJjZS5fcGl4aUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlQ2FjaGVbY2FjaGVJZF07XG5cbiAgICAgICAgLy8gU3RyaWN0LW1vZGUgcmVqZWN0cyBpbnZhbGlkIGNhY2hlSWRzXG4gICAgICAgIGlmIChpc0ZyYW1lICYmIHN0cmljdCAmJiAhdGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChcIlRoZSBjYWNoZUlkIFxcXCJcIiArIGNhY2hlSWQgKyBcIlxcXCIgZG9lcyBub3QgZXhpc3QgaW4gVGV4dHVyZUNhY2hlLlwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXNvbHV0aW9uKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVzb2x1dGlvbiA9IGdldFJlc29sdXRpb25PZlVybChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmUobmV3IEJhc2VUZXh0dXJlKHNvdXJjZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgdGV4dHVyZS5iYXNlVGV4dHVyZS5jYWNoZUlkID0gY2FjaGVJZDtcblxuICAgICAgICAgICAgQmFzZVRleHR1cmUuYWRkVG9DYWNoZSh0ZXh0dXJlLmJhc2VUZXh0dXJlLCBjYWNoZUlkKTtcbiAgICAgICAgICAgIFRleHR1cmUuYWRkVG9DYWNoZSh0ZXh0dXJlLCBjYWNoZUlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldHMgYXNzdW1lIGl0cyBhIGJhc2UgdGV4dHVyZSFcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBUZXh0dXJlIHdpdGggYSBCdWZmZXJSZXNvdXJjZSBmcm9tIGEgRmxvYXQzMkFycmF5LlxuICAgICAqIFJHQkEgdmFsdWVzIGFyZSBmbG9hdHMgZnJvbSAwIHRvIDEuXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fFVpbnQ4QXJyYXl9IGJ1ZmZlciBUaGUgb3B0aW9uYWwgYXJyYXkgdG8gdXNlLCBpZiBubyBkYXRhXG4gICAgICogICAgICAgIGlzIHByb3ZpZGVkLCBhIG5ldyBGbG9hdDMyQXJyYXkgaXMgY3JlYXRlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBXaWR0aCBvZiB0aGUgcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSByZXNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gU2VlIHtAbGluayBQSVhJLkJhc2VUZXh0dXJlfSdzIGNvbnN0cnVjdG9yIGZvciBvcHRpb25zLlxuICAgICAqIEByZXR1cm4ge1BJWEkuVGV4dHVyZX0gVGhlIHJlc3VsdGluZyBuZXcgQmFzZVRleHR1cmVcbiAgICAgKi9cbiAgICBUZXh0dXJlLmZyb21CdWZmZXIgPSBmdW5jdGlvbiBmcm9tQnVmZmVyIChidWZmZXIsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IFRleHR1cmUoQmFzZVRleHR1cmUuZnJvbUJ1ZmZlcihidWZmZXIsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgdGV4dHVyZSBmcm9tIGEgc291cmNlIGFuZCBhZGQgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudH0gc291cmNlIC0gVGhlIGlucHV0IHNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaW1hZ2VVcmwgLSBGaWxlIG5hbWUgb2YgdGV4dHVyZSwgZm9yIGNhY2hlIGFuZCByZXNvbHZpbmcgcmVzb2x1dGlvbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gSHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgdGhlIHRleHR1cmUgY2FjaGUuIElmIG5vIG5hbWUgaXNcbiAgICAgKiAgICAgICAgc3BlY2lmaWVkLCBvbmx5IGBpbWFnZVVybGAgd2lsbCBiZSB1c2VkIGFzIHRoZSBjYWNoZSBJRC5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlRleHR1cmV9IE91dHB1dCB0ZXh0dXJlXG4gICAgICovXG4gICAgVGV4dHVyZS5mcm9tTG9hZGVyID0gZnVuY3Rpb24gZnJvbUxvYWRlciAoc291cmNlLCBpbWFnZVVybCwgbmFtZSlcbiAgICB7XG4gICAgICAgIHZhciByZXNvdXJjZSA9IG5ldyBJbWFnZVJlc291cmNlKHNvdXJjZSk7XG5cbiAgICAgICAgcmVzb3VyY2UudXJsID0gaW1hZ2VVcmw7XG5cbiAgICAgICAgdmFyIGJhc2VUZXh0dXJlID0gbmV3IEJhc2VUZXh0dXJlKHJlc291cmNlLCB7XG4gICAgICAgICAgICBzY2FsZU1vZGU6IHNldHRpbmdzLlNDQUxFX01PREUsXG4gICAgICAgICAgICByZXNvbHV0aW9uOiBnZXRSZXNvbHV0aW9uT2ZVcmwoaW1hZ2VVcmwpLFxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKGJhc2VUZXh0dXJlKTtcblxuICAgICAgICAvLyBObyBuYW1lLCB1c2UgaW1hZ2VVcmwgaW5zdGVhZFxuICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUgPSBpbWFnZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldHMgYWxzbyBhZGQgdGhlIGZyYW1lIHRvIHBpeGkncyBnbG9iYWwgY2FjaGUgZm9yICdmcm9tTG9hZGVyJyBmdW5jdGlvblxuICAgICAgICBCYXNlVGV4dHVyZS5hZGRUb0NhY2hlKHRleHR1cmUuYmFzZVRleHR1cmUsIG5hbWUpO1xuICAgICAgICBUZXh0dXJlLmFkZFRvQ2FjaGUodGV4dHVyZSwgbmFtZSk7XG5cbiAgICAgICAgLy8gYWxzbyBhZGQgcmVmZXJlbmNlcyBieSB1cmwgaWYgdGhleSBhcmUgZGlmZmVyZW50LlxuICAgICAgICBpZiAobmFtZSAhPT0gaW1hZ2VVcmwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIEJhc2VUZXh0dXJlLmFkZFRvQ2FjaGUodGV4dHVyZS5iYXNlVGV4dHVyZSwgaW1hZ2VVcmwpO1xuICAgICAgICAgICAgVGV4dHVyZS5hZGRUb0NhY2hlKHRleHR1cmUsIGltYWdlVXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgVGV4dHVyZSB0byB0aGUgZ2xvYmFsIFRleHR1cmVDYWNoZS4gVGhpcyBjYWNoZSBpcyBzaGFyZWQgYWNyb3NzIHRoZSB3aG9sZSBQSVhJIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge1BJWEkuVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBUZXh0dXJlIHRvIGFkZCB0byB0aGUgY2FjaGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVGhlIGlkIHRoYXQgdGhlIFRleHR1cmUgd2lsbCBiZSBzdG9yZWQgYWdhaW5zdC5cbiAgICAgKi9cbiAgICBUZXh0dXJlLmFkZFRvQ2FjaGUgPSBmdW5jdGlvbiBhZGRUb0NhY2hlICh0ZXh0dXJlLCBpZClcbiAgICB7XG4gICAgICAgIGlmIChpZClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRleHR1cmUudGV4dHVyZUNhY2hlSWRzLmluZGV4T2YoaWQpID09PSAtMSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlLnRleHR1cmVDYWNoZUlkcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFRleHR1cmVDYWNoZVtpZF0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oKFwiVGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgd2l0aCBhbiBpZCBbXCIgKyBpZCArIFwiXSB0aGF0IGFscmVhZHkgaGFkIGFuIGVudHJ5XCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVGV4dHVyZUNhY2hlW2lkXSA9IHRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgVGV4dHVyZSBmcm9tIHRoZSBnbG9iYWwgVGV4dHVyZUNhY2hlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfFBJWEkuVGV4dHVyZX0gdGV4dHVyZSAtIGlkIG9mIGEgVGV4dHVyZSB0byBiZSByZW1vdmVkLCBvciBhIFRleHR1cmUgaW5zdGFuY2UgaXRzZWxmXG4gICAgICogQHJldHVybiB7UElYSS5UZXh0dXJlfG51bGx9IFRoZSBUZXh0dXJlIHRoYXQgd2FzIHJlbW92ZWRcbiAgICAgKi9cbiAgICBUZXh0dXJlLnJlbW92ZUZyb21DYWNoZSA9IGZ1bmN0aW9uIHJlbW92ZUZyb21DYWNoZSAodGV4dHVyZSlcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dHVyZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0ZXh0dXJlRnJvbUNhY2hlID0gVGV4dHVyZUNhY2hlW3RleHR1cmVdO1xuXG4gICAgICAgICAgICBpZiAodGV4dHVyZUZyb21DYWNoZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0ZXh0dXJlRnJvbUNhY2hlLnRleHR1cmVDYWNoZUlkcy5pbmRleE9mKHRleHR1cmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlRnJvbUNhY2hlLnRleHR1cmVDYWNoZUlkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBUZXh0dXJlQ2FjaGVbdGV4dHVyZV07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dHVyZUZyb21DYWNoZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0ZXh0dXJlICYmIHRleHR1cmUudGV4dHVyZUNhY2hlSWRzKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHR1cmUudGV4dHVyZUNhY2hlSWRzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGV4dHVyZSBtYXRjaGVzIHRoZSBvbmUgYmVpbmcgcGFzc2VkIGluIGJlZm9yZSBkZWxldGluZyBpdCBmcm9tIHRoZSBjYWNoZS5cbiAgICAgICAgICAgICAgICBpZiAoVGV4dHVyZUNhY2hlW3RleHR1cmUudGV4dHVyZUNhY2hlSWRzW2ldXSA9PT0gdGV4dHVyZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBUZXh0dXJlQ2FjaGVbdGV4dHVyZS50ZXh0dXJlQ2FjaGVJZHNbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGV4dHVyZS50ZXh0dXJlQ2FjaGVJZHMubGVuZ3RoID0gMDtcblxuICAgICAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyByZXNvbHV0aW9uIG9mIGJhc2VUZXh0dXJlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJlc29sdXRpb24uZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VUZXh0dXJlLnJlc29sdXRpb247XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmcmFtZSBzcGVjaWZpZXMgdGhlIHJlZ2lvbiBvZiB0aGUgYmFzZSB0ZXh0dXJlIHRoYXQgdGhpcyB0ZXh0dXJlIHVzZXMuXG4gICAgICogUGxlYXNlIGNhbGwgYHVwZGF0ZVV2cygpYCBhZnRlciB5b3UgY2hhbmdlIGNvb3JkaW5hdGVzIG9mIGBmcmFtZWAgbWFudWFsbHkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlJlY3RhbmdsZX1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuZnJhbWUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmZyYW1lLnNldCA9IGZ1bmN0aW9uIChmcmFtZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLl9mcmFtZSA9IGZyYW1lO1xuXG4gICAgICAgIHRoaXMubm9GcmFtZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciB4ID0gZnJhbWUueDtcbiAgICAgICAgdmFyIHkgPSBmcmFtZS55O1xuICAgICAgICB2YXIgd2lkdGggPSBmcmFtZS53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IGZyYW1lLmhlaWdodDtcbiAgICAgICAgdmFyIHhOb3RGaXQgPSB4ICsgd2lkdGggPiB0aGlzLmJhc2VUZXh0dXJlLndpZHRoO1xuICAgICAgICB2YXIgeU5vdEZpdCA9IHkgKyBoZWlnaHQgPiB0aGlzLmJhc2VUZXh0dXJlLmhlaWdodDtcblxuICAgICAgICBpZiAoeE5vdEZpdCB8fCB5Tm90Rml0KVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0geE5vdEZpdCAmJiB5Tm90Rml0ID8gJ2FuZCcgOiAnb3InO1xuICAgICAgICAgICAgdmFyIGVycm9yWCA9IFwiWDogXCIgKyB4ICsgXCIgKyBcIiArIHdpZHRoICsgXCIgPSBcIiArICh4ICsgd2lkdGgpICsgXCIgPiBcIiArICh0aGlzLmJhc2VUZXh0dXJlLndpZHRoKTtcbiAgICAgICAgICAgIHZhciBlcnJvclkgPSBcIlk6IFwiICsgeSArIFwiICsgXCIgKyBoZWlnaHQgKyBcIiA9IFwiICsgKHkgKyBoZWlnaHQpICsgXCIgPiBcIiArICh0aGlzLmJhc2VUZXh0dXJlLmhlaWdodCk7XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dHVyZSBFcnJvcjogZnJhbWUgZG9lcyBub3QgZml0IGluc2lkZSB0aGUgYmFzZSBUZXh0dXJlIGRpbWVuc2lvbnM6ICdcbiAgICAgICAgICAgICAgICArIGVycm9yWCArIFwiIFwiICsgcmVsYXRpb25zaGlwICsgXCIgXCIgKyBlcnJvclkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWxpZCA9IHdpZHRoICYmIGhlaWdodCAmJiB0aGlzLmJhc2VUZXh0dXJlLnZhbGlkO1xuXG4gICAgICAgIGlmICghdGhpcy50cmltICYmICF0aGlzLnJvdGF0ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5vcmlnID0gZnJhbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52YWxpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVdnMoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dHVyZSBpcyByb3RhdGVkIGluc2lkZSB0aGUgYXRsYXNcbiAgICAgKiBzZXQgdG8gMiB0byBjb21wZW5zYXRlIGZvciB0ZXh0dXJlIHBhY2tlciByb3RhdGlvblxuICAgICAqIHNldCB0byA2IHRvIGNvbXBlbnNhdGUgZm9yIHNwaW5lIHBhY2tlciByb3RhdGlvblxuICAgICAqIGNhbiBiZSB1c2VkIHRvIHJvdGF0ZSBvciBtaXJyb3Igc3ByaXRlc1xuICAgICAqIFNlZSB7QGxpbmsgUElYSS5ncm91cEQ4fSBmb3IgZXhwbGFuYXRpb25cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucm90YXRlLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRlO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucm90YXRlLnNldCA9IGZ1bmN0aW9uIChyb3RhdGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5fcm90YXRlID0gcm90YXRlO1xuICAgICAgICBpZiAodGhpcy52YWxpZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVdnMoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIFRleHR1cmUgaW4gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53aWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZy53aWR0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgVGV4dHVyZSBpbiBwaXhlbHMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmhlaWdodC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZy5oZWlnaHQ7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBUZXh0dXJlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gVGV4dHVyZTtcbn0oRXZlbnRFbWl0dGVyKSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVdoaXRlVGV4dHVyZSgpXG57XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgY2FudmFzLndpZHRoID0gMTY7XG4gICAgY2FudmFzLmhlaWdodCA9IDE2O1xuXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcbiAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIDE2LCAxNik7XG5cbiAgICByZXR1cm4gbmV3IFRleHR1cmUobmV3IEJhc2VUZXh0dXJlKG5ldyBDYW52YXNSZXNvdXJjZShjYW52YXMpKSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFsbEhhbmRsZXJzKHRleClcbntcbiAgICB0ZXguZGVzdHJveSA9IGZ1bmN0aW9uIF9lbXB0eURlc3Ryb3koKSB7IC8qIGVtcHR5ICovIH07XG4gICAgdGV4Lm9uID0gZnVuY3Rpb24gX2VtcHR5T24oKSB7IC8qIGVtcHR5ICovIH07XG4gICAgdGV4Lm9uY2UgPSBmdW5jdGlvbiBfZW1wdHlPbmNlKCkgeyAvKiBlbXB0eSAqLyB9O1xuICAgIHRleC5lbWl0ID0gZnVuY3Rpb24gX2VtcHR5RW1pdCgpIHsgLyogZW1wdHkgKi8gfTtcbn1cblxuLyoqXG4gKiBBbiBlbXB0eSB0ZXh0dXJlLCB1c2VkIG9mdGVuIHRvIG5vdCBoYXZlIHRvIGNyZWF0ZSBtdWx0aXBsZSBlbXB0eSB0ZXh0dXJlcy5cbiAqIENhbiBub3QgYmUgZGVzdHJveWVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudFxuICogQG1lbWJlciB7UElYSS5UZXh0dXJlfVxuICovXG5UZXh0dXJlLkVNUFRZID0gbmV3IFRleHR1cmUobmV3IEJhc2VUZXh0dXJlKCkpO1xucmVtb3ZlQWxsSGFuZGxlcnMoVGV4dHVyZS5FTVBUWSk7XG5yZW1vdmVBbGxIYW5kbGVycyhUZXh0dXJlLkVNUFRZLmJhc2VUZXh0dXJlKTtcblxuLyoqXG4gKiBBIHdoaXRlIHRleHR1cmUgb2YgMTZ4MTYgc2l6ZSwgdXNlZCBmb3IgZ3JhcGhpY3MgYW5kIG90aGVyIHRoaW5nc1xuICogQ2FuIG5vdCBiZSBkZXN0cm95ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyIHtQSVhJLlRleHR1cmV9XG4gKi9cblRleHR1cmUuV0hJVEUgPSBjcmVhdGVXaGl0ZVRleHR1cmUoKTtcbnJlbW92ZUFsbEhhbmRsZXJzKFRleHR1cmUuV0hJVEUpO1xucmVtb3ZlQWxsSGFuZGxlcnMoVGV4dHVyZS5XSElURS5iYXNlVGV4dHVyZSk7XG5cbi8qKlxuICogQSBSZW5kZXJUZXh0dXJlIGlzIGEgc3BlY2lhbCB0ZXh0dXJlIHRoYXQgYWxsb3dzIGFueSBQaXhpSlMgZGlzcGxheSBvYmplY3QgdG8gYmUgcmVuZGVyZWQgdG8gaXQuXG4gKlxuICogX19IaW50X186IEFsbCBEaXNwbGF5T2JqZWN0cyAoaS5lLiBTcHJpdGVzKSB0aGF0IHJlbmRlciB0byBhIFJlbmRlclRleHR1cmUgc2hvdWxkIGJlIHByZWxvYWRlZFxuICogb3RoZXJ3aXNlIGJsYWNrIHJlY3RhbmdsZXMgd2lsbCBiZSBkcmF3biBpbnN0ZWFkLlxuICpcbiAqIF9fSGludC0yX186IFRoZSBhY3R1YWwgbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBoYXBwZW4gb24gZmlyc3QgcmVuZGVyLlxuICogWW91IHNob3VsZG4ndCBjcmVhdGUgcmVuZGVyVGV4dHVyZXMgZWFjaCBmcmFtZSBqdXN0IHRvIGRlbGV0ZSB0aGVtIGFmdGVyLCB0cnkgdG8gcmV1c2UgdGhlbS5cbiAqXG4gKiBBIFJlbmRlclRleHR1cmUgdGFrZXMgYSBzbmFwc2hvdCBvZiBhbnkgRGlzcGxheSBPYmplY3QgZ2l2ZW4gdG8gaXRzIHJlbmRlciBtZXRob2QuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgcmVuZGVyZXIgPSBQSVhJLmF1dG9EZXRlY3RSZW5kZXJlcigpO1xuICogbGV0IHJlbmRlclRleHR1cmUgPSBQSVhJLlJlbmRlclRleHR1cmUuY3JlYXRlKHsgd2lkdGg6IDgwMCwgaGVpZ2h0OiA2MDAgfSk7XG4gKiBsZXQgc3ByaXRlID0gUElYSS5TcHJpdGUuZnJvbShcInNwaW5PYmpfMDEucG5nXCIpO1xuICpcbiAqIHNwcml0ZS5wb3NpdGlvbi54ID0gODAwLzI7XG4gKiBzcHJpdGUucG9zaXRpb24ueSA9IDYwMC8yO1xuICogc3ByaXRlLmFuY2hvci54ID0gMC41O1xuICogc3ByaXRlLmFuY2hvci55ID0gMC41O1xuICpcbiAqIHJlbmRlcmVyLnJlbmRlcihzcHJpdGUsIHJlbmRlclRleHR1cmUpO1xuICogYGBgXG4gKlxuICogVGhlIFNwcml0ZSBpbiB0aGlzIGNhc2Ugd2lsbCBiZSByZW5kZXJlZCB1c2luZyBpdHMgbG9jYWwgdHJhbnNmb3JtLiBUbyByZW5kZXIgdGhpcyBzcHJpdGUgYXQgMCwwXG4gKiB5b3UgY2FuIGNsZWFyIHRoZSB0cmFuc2Zvcm1cbiAqXG4gKiBgYGBqc1xuICpcbiAqIHNwcml0ZS5zZXRUcmFuc2Zvcm0oKVxuICpcbiAqIGxldCByZW5kZXJUZXh0dXJlID0gbmV3IFBJWEkuUmVuZGVyVGV4dHVyZS5jcmVhdGUoMTAwLCAxMDApO1xuICpcbiAqIHJlbmRlcmVyLnJlbmRlcihzcHJpdGUsIHJlbmRlclRleHR1cmUpOyAgLy8gUmVuZGVycyB0byBjZW50ZXIgb2YgUmVuZGVyVGV4dHVyZVxuICogYGBgXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlRleHR1cmVcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBSZW5kZXJUZXh0dXJlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoVGV4dHVyZSkge1xuICAgIGZ1bmN0aW9uIFJlbmRlclRleHR1cmUoYmFzZVJlbmRlclRleHR1cmUsIGZyYW1lKVxuICAgIHtcbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgbGVnYWN5Li5cbiAgICAgICAgdmFyIF9sZWdhY3lSZW5kZXJlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKCEoYmFzZVJlbmRlclRleHR1cmUgaW5zdGFuY2VvZiBCYXNlUmVuZGVyVGV4dHVyZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIHByZWZlci1yZXN0LXBhcmFtcywgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgIHZhciBzY2FsZU1vZGUgPSBhcmd1bWVudHNbM107XG4gICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGFyZ3VtZW50c1s0XTtcblxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbiBvbGQgcmVuZGVyIHRleHR1cmUuLlxuICAgICAgICAgICAgY29uc29sZS53YXJuKChcIlBsZWFzZSB1c2UgUmVuZGVyVGV4dHVyZS5jcmVhdGUoXCIgKyB3aWR0aCArIFwiLCBcIiArIGhlaWdodCArIFwiKSBpbnN0ZWFkIG9mIHRoZSBjdG9yIGRpcmVjdGx5LlwiKSk7XG4gICAgICAgICAgICBfbGVnYWN5UmVuZGVyZXIgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcywgbm8tY29uc29sZSAqL1xuXG4gICAgICAgICAgICBmcmFtZSA9IG51bGw7XG4gICAgICAgICAgICBiYXNlUmVuZGVyVGV4dHVyZSA9IG5ldyBCYXNlUmVuZGVyVGV4dHVyZSh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHNjYWxlTW9kZTogc2NhbGVNb2RlLFxuICAgICAgICAgICAgICAgIHJlc29sdXRpb246IHJlc29sdXRpb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYmFzZSB0ZXh0dXJlIG9iamVjdCB0aGF0IHRoaXMgdGV4dHVyZSB1c2VzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmV9XG4gICAgICAgICAqL1xuICAgICAgICBUZXh0dXJlLmNhbGwodGhpcywgYmFzZVJlbmRlclRleHR1cmUsIGZyYW1lKTtcblxuICAgICAgICB0aGlzLmxlZ2FjeVJlbmRlcmVyID0gX2xlZ2FjeVJlbmRlcmVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHdpbGwgbGV0IHRoZSByZW5kZXJlciBrbm93IGlmIHRoZSB0ZXh0dXJlIGlzIHZhbGlkLiBJZiBpdCdzIG5vdCB0aGVuIGl0IGNhbm5vdCBiZSByZW5kZXJlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZXMgYHNvdXJjZUZyYW1lYCB3aGVuIHRoaXMgdGV4dHVyZSBpcyBpbnNpZGUgY3VycmVudCBmaWx0ZXIgc3RhY2suXG4gICAgICAgICAqIFlvdSBjYW4gcmVhZCBpdCBpbnNpZGUgZmlsdGVycy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXJGcmFtZSA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBrZXkgZm9yIHBvb2xlZCB0ZXh0dXJlIG9mIEZpbHRlclN5c3RlbVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlsdGVyUG9vbEtleSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVdnMoKTtcbiAgICB9XG5cbiAgICBpZiAoIFRleHR1cmUgKSBSZW5kZXJUZXh0dXJlLl9fcHJvdG9fXyA9IFRleHR1cmU7XG4gICAgUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlICYmIFRleHR1cmUucHJvdG90eXBlICk7XG4gICAgUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZW5kZXJUZXh0dXJlO1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgUmVuZGVyVGV4dHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCB0byByZXNpemUgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgdG8gcmVzaXplIHRvLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2l6ZUJhc2VUZXh0dXJlPXRydWVdIC0gU2hvdWxkIHRoZSBiYXNlVGV4dHVyZS53aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBiZSByZXNpemVkIGFzIHdlbGw/XG4gICAgICovXG4gICAgUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplICh3aWR0aCwgaGVpZ2h0LCByZXNpemVCYXNlVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIGlmICggcmVzaXplQmFzZVRleHR1cmUgPT09IHZvaWQgMCApIHJlc2l6ZUJhc2VUZXh0dXJlID0gdHJ1ZTtcblxuICAgICAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCk7XG4gICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuXG4gICAgICAgIC8vIFRPRE8gLSBjb3VsZCBiZSBub3QgcmVxdWlyZWQuLlxuICAgICAgICB0aGlzLnZhbGlkID0gKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTtcblxuICAgICAgICB0aGlzLl9mcmFtZS53aWR0aCA9IHRoaXMub3JpZy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLl9mcmFtZS5oZWlnaHQgPSB0aGlzLm9yaWcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIGlmIChyZXNpemVCYXNlVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iYXNlVGV4dHVyZS5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVV2cygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSByZXNvbHV0aW9uIG9mIGJhc2VUZXh0dXJlLCBidXQgZG9lcyBub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNpemUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFRoZSBuZXcgcmVzb2x1dGlvbiB0byBhcHBseSB0byBSZW5kZXJUZXh0dXJlXG4gICAgICovXG4gICAgUmVuZGVyVGV4dHVyZS5wcm90b3R5cGUuc2V0UmVzb2x1dGlvbiA9IGZ1bmN0aW9uIHNldFJlc29sdXRpb24gKHJlc29sdXRpb24pXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgdmFyIGJhc2VUZXh0dXJlID0gcmVmLmJhc2VUZXh0dXJlO1xuXG4gICAgICAgIGlmIChiYXNlVGV4dHVyZS5yZXNvbHV0aW9uID09PSByZXNvbHV0aW9uKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBiYXNlVGV4dHVyZS5zZXRSZXNvbHV0aW9uKHJlc29sdXRpb24pO1xuICAgICAgICB0aGlzLnJlc2l6ZShiYXNlVGV4dHVyZS53aWR0aCwgYmFzZVRleHR1cmUuaGVpZ2h0LCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEEgc2hvcnQgaGFuZCB3YXkgb2YgY3JlYXRpbmcgYSByZW5kZXIgdGV4dHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoPTEwMF0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0ZXh0dXJlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodD0xMDBdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2NhbGVNb2RlPVBJWEkuc2V0dGluZ3MuU0NBTEVfTU9ERV0gLSBTZWUge0BsaW5rIFBJWEkuU0NBTEVfTU9ERVN9IGZvciBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvbj0xXSAtIFRoZSByZXNvbHV0aW9uIC8gZGV2aWNlIHBpeGVsIHJhdGlvIG9mIHRoZSB0ZXh0dXJlIGJlaW5nIGdlbmVyYXRlZFxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVuZGVyVGV4dHVyZX0gVGhlIG5ldyByZW5kZXIgdGV4dHVyZVxuICAgICAqL1xuICAgIFJlbmRlclRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlIChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgLy8gZmFsbGJhY2ssIG9sZC1zdHlsZTogY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHNjYWxlTW9kZSwgcmVzb2x1dGlvbilcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJylcbiAgICAgICAge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGhlaWdodDogYXJndW1lbnRzWzFdLFxuICAgICAgICAgICAgICAgIHNjYWxlTW9kZTogYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgICAgIHJlc29sdXRpb246IGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHByZWZlci1yZXN0LXBhcmFtcyAqL1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSZW5kZXJUZXh0dXJlKG5ldyBCYXNlUmVuZGVyVGV4dHVyZShvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBSZW5kZXJUZXh0dXJlO1xufShUZXh0dXJlKSk7XG5cbi8qKlxuICogRXhwZXJpbWVudGFsIVxuICpcbiAqIFRleHR1cmUgcG9vbCwgdXNlZCBieSBGaWx0ZXJTeXN0ZW0gYW5kIHBsdWdpbnNcbiAqIFN0b3JlcyBjb2xsZWN0aW9uIG9mIHRlbXBvcmFyeSBwb3cyIG9yIHNjcmVlbi1zaXplZCByZW5kZXJUZXh0dXJlc1xuICpcbiAqIElmIHlvdSB1c2UgY3VzdG9tIFJlbmRlclRleHR1cmVQb29sIGZvciB5b3VyIGZpbHRlcnMsIHlvdSBjYW4gdXNlIG1ldGhvZHNcbiAqIGBnZXRGaWx0ZXJUZXh0dXJlYCBhbmQgYHJldHVybkZpbHRlclRleHR1cmVgIHNhbWUgYXMgaW5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBSZW5kZXJUZXh0dXJlUG9vbCA9IGZ1bmN0aW9uIFJlbmRlclRleHR1cmVQb29sKHRleHR1cmVPcHRpb25zKVxue1xuICAgIHRoaXMudGV4dHVyZVBvb2wgPSB7fTtcbiAgICB0aGlzLnRleHR1cmVPcHRpb25zID0gdGV4dHVyZU9wdGlvbnMgfHwge307XG4gICAgLyoqXG4gICAgICogQWxsb3cgcmVuZGVyVGV4dHVyZXMgb2YgdGhlIHNhbWUgc2l6ZSBhcyBzY3JlZW4sIG5vdCBqdXN0IHBvdzJcbiAgICAgKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgc2V0cyB0byB0cnVlIGFmdGVyIGBzZXRTY3JlZW5TaXplYFxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHRoaXMuZW5hYmxlRnVsbFNjcmVlbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcGl4ZWxzV2lkdGggPSAwO1xuICAgIHRoaXMuX3BpeGVsc0hlaWdodCA9IDA7XG59O1xuXG4vKipcbiAqIGNyZWF0ZXMgb2YgdGV4dHVyZSB3aXRoIHBhcmFtcyB0aGF0IHdlcmUgc3BlY2lmaWVkIGluIHBvb2wgY29uc3RydWN0b3JcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhbFdpZHRoIHdpZHRoIG9mIHRleHR1cmUgaW4gcGl4ZWxzXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhbEhlaWdodCBoZWlnaHQgb2YgdGV4dHVyZSBpbiBwaXhlbHNcbiAqIEByZXR1cm5zIHtSZW5kZXJUZXh0dXJlfVxuICovXG5SZW5kZXJUZXh0dXJlUG9vbC5wcm90b3R5cGUuY3JlYXRlVGV4dHVyZSA9IGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUgKHJlYWxXaWR0aCwgcmVhbEhlaWdodClcbntcbiAgICB2YXIgYmFzZVJlbmRlclRleHR1cmUgPSBuZXcgQmFzZVJlbmRlclRleHR1cmUoT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHdpZHRoOiByZWFsV2lkdGgsXG4gICAgICAgIGhlaWdodDogcmVhbEhlaWdodCxcbiAgICAgICAgcmVzb2x1dGlvbjogMSxcbiAgICB9LCB0aGlzLnRleHR1cmVPcHRpb25zKSk7XG5cbiAgICByZXR1cm4gbmV3IFJlbmRlclRleHR1cmUoYmFzZVJlbmRlclRleHR1cmUpO1xufTtcblxuLyoqXG4gKiBHZXRzIGEgUG93ZXItb2YtVHdvIHJlbmRlciB0ZXh0dXJlIG9yIGZ1bGxTY3JlZW4gdGV4dHVyZVxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5XaWR0aCAtIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoZSByZW5kZXIgdGV4dHVyZSBpbiByZWFsIHBpeGVscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5IZWlnaHQgLSBUaGUgbWluaW11bSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0ZXh0dXJlIGluIHJlYWwgcGl4ZWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtyZXNvbHV0aW9uPTFdIC0gVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0ZXh0dXJlLlxuICogQHJldHVybiB7UElYSS5SZW5kZXJUZXh0dXJlfSBUaGUgbmV3IHJlbmRlciB0ZXh0dXJlLlxuICovXG5SZW5kZXJUZXh0dXJlUG9vbC5wcm90b3R5cGUuZ2V0T3B0aW1hbFRleHR1cmUgPSBmdW5jdGlvbiBnZXRPcHRpbWFsVGV4dHVyZSAobWluV2lkdGgsIG1pbkhlaWdodCwgcmVzb2x1dGlvbilcbntcbiAgICAgICAgaWYgKCByZXNvbHV0aW9uID09PSB2b2lkIDAgKSByZXNvbHV0aW9uID0gMTtcblxuICAgIHZhciBrZXkgPSBSZW5kZXJUZXh0dXJlUG9vbC5TQ1JFRU5fS0VZO1xuXG4gICAgbWluV2lkdGggKj0gcmVzb2x1dGlvbjtcbiAgICBtaW5IZWlnaHQgKj0gcmVzb2x1dGlvbjtcblxuICAgIGlmICghdGhpcy5lbmFibGVGdWxsU2NyZWVuIHx8IG1pbldpZHRoICE9PSB0aGlzLl9waXhlbHNXaWR0aCB8fCBtaW5IZWlnaHQgIT09IHRoaXMuX3BpeGVsc0hlaWdodClcbiAgICB7XG4gICAgICAgIG1pbldpZHRoID0gbmV4dFBvdzIobWluV2lkdGgpO1xuICAgICAgICBtaW5IZWlnaHQgPSBuZXh0UG93MihtaW5IZWlnaHQpO1xuICAgICAgICBrZXkgPSAoKG1pbldpZHRoICYgMHhGRkZGKSA8PCAxNikgfCAobWluSGVpZ2h0ICYgMHhGRkZGKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGV4dHVyZVBvb2xba2V5XSlcbiAgICB7XG4gICAgICAgIHRoaXMudGV4dHVyZVBvb2xba2V5XSA9IFtdO1xuICAgIH1cblxuICAgIHZhciByZW5kZXJUZXh0dXJlID0gdGhpcy50ZXh0dXJlUG9vbFtrZXldLnBvcCgpO1xuXG4gICAgaWYgKCFyZW5kZXJUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgcmVuZGVyVGV4dHVyZSA9IHRoaXMuY3JlYXRlVGV4dHVyZShtaW5XaWR0aCwgbWluSGVpZ2h0KTtcbiAgICB9XG5cbiAgICByZW5kZXJUZXh0dXJlLmZpbHRlclBvb2xLZXkgPSBrZXk7XG4gICAgcmVuZGVyVGV4dHVyZS5zZXRSZXNvbHV0aW9uKHJlc29sdXRpb24pO1xuXG4gICAgcmV0dXJuIHJlbmRlclRleHR1cmU7XG59O1xuXG4vKipcbiAqIEdldHMgZXh0cmEgdGV4dHVyZSBvZiB0aGUgc2FtZSBzaXplIGFzIGlucHV0IHJlbmRlclRleHR1cmVcbiAqXG4gKiBgZ2V0RmlsdGVyVGV4dHVyZShpbnB1dCwgMC41KWAgb3IgYGdldEZpbHRlclRleHR1cmUoMC41LCBpbnB1dClgXG4gKlxuICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IGlucHV0IHJlbmRlclRleHR1cmUgZnJvbSB3aGljaCBzaXplIGFuZCByZXNvbHV0aW9uIHdpbGwgYmUgY29waWVkXG4gKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb25dIG92ZXJyaWRlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlclRleHR1cmVcbiAqICBJdCBvdmVycmlkZXMsIGl0IGRvZXMgbm90IG11bHRpcGx5XG4gKiBAcmV0dXJucyB7UElYSS5SZW5kZXJUZXh0dXJlfVxuICovXG5SZW5kZXJUZXh0dXJlUG9vbC5wcm90b3R5cGUuZ2V0RmlsdGVyVGV4dHVyZSA9IGZ1bmN0aW9uIGdldEZpbHRlclRleHR1cmUgKGlucHV0LCByZXNvbHV0aW9uKVxue1xuICAgIHZhciBmaWx0ZXJUZXh0dXJlID0gdGhpcy5nZXRPcHRpbWFsVGV4dHVyZShpbnB1dC53aWR0aCwgaW5wdXQuaGVpZ2h0LCByZXNvbHV0aW9uIHx8IGlucHV0LnJlc29sdXRpb24pO1xuXG4gICAgZmlsdGVyVGV4dHVyZS5maWx0ZXJGcmFtZSA9IGlucHV0LmZpbHRlckZyYW1lO1xuXG4gICAgcmV0dXJuIGZpbHRlclRleHR1cmU7XG59O1xuXG4vKipcbiAqIFBsYWNlIGEgcmVuZGVyIHRleHR1cmUgYmFjayBpbnRvIHRoZSBwb29sLlxuICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IHJlbmRlclRleHR1cmUgLSBUaGUgcmVuZGVyVGV4dHVyZSB0byBmcmVlXG4gKi9cblJlbmRlclRleHR1cmVQb29sLnByb3RvdHlwZS5yZXR1cm5UZXh0dXJlID0gZnVuY3Rpb24gcmV0dXJuVGV4dHVyZSAocmVuZGVyVGV4dHVyZSlcbntcbiAgICB2YXIga2V5ID0gcmVuZGVyVGV4dHVyZS5maWx0ZXJQb29sS2V5O1xuXG4gICAgcmVuZGVyVGV4dHVyZS5maWx0ZXJGcmFtZSA9IG51bGw7XG4gICAgdGhpcy50ZXh0dXJlUG9vbFtrZXldLnB1c2gocmVuZGVyVGV4dHVyZSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciByZXR1cm5UZXh0dXJlLCB0byBiZSBjb21wbGlhbnQgd2l0aCBGaWx0ZXJTeXN0ZW0gaW50ZXJmYWNlXG4gKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gcmVuZGVyVGV4dHVyZSAtIFRoZSByZW5kZXJUZXh0dXJlIHRvIGZyZWVcbiAqL1xuUmVuZGVyVGV4dHVyZVBvb2wucHJvdG90eXBlLnJldHVybkZpbHRlclRleHR1cmUgPSBmdW5jdGlvbiByZXR1cm5GaWx0ZXJUZXh0dXJlIChyZW5kZXJUZXh0dXJlKVxue1xuICAgIHRoaXMucmV0dXJuVGV4dHVyZShyZW5kZXJUZXh0dXJlKTtcbn07XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBwb29sXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveVRleHR1cmVzPXRydWVdIGRlc3Ryb3kgYWxsIHN0b3JlZCB0ZXh0dXJlc1xuICovXG5SZW5kZXJUZXh0dXJlUG9vbC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoZGVzdHJveVRleHR1cmVzKVxue1xuICAgIGRlc3Ryb3lUZXh0dXJlcyA9IGRlc3Ryb3lUZXh0dXJlcyAhPT0gZmFsc2U7XG4gICAgaWYgKGRlc3Ryb3lUZXh0dXJlcylcbiAgICB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy50ZXh0dXJlUG9vbClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlUG9vbFtpXTtcblxuICAgICAgICAgICAgaWYgKHRleHR1cmVzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGV4dHVyZXMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlc1tqXS5kZXN0cm95KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGV4dHVyZVBvb2wgPSB7fTtcbn07XG5cbi8qKlxuICogSWYgc2NyZWVuIHNpemUgd2FzIGNoYW5nZWQsIGRyb3BzIGFsbCBzY3JlZW4tc2l6ZWQgdGV4dHVyZXMsXG4gKiBzZXRzIG5ldyBzY3JlZW4gc2l6ZSwgc2V0cyBgZW5hYmxlRnVsbFNjcmVlbmAgdG8gdHJ1ZVxuICpcbiAqIFNpemUgaXMgbWVhc3VyZWQgaW4gcGl4ZWxzLCBgcmVuZGVyZXIudmlld2AgY2FuIGJlIHBhc3NlZCBoZXJlLCBub3QgYHJlbmRlcmVyLnNjcmVlbmBcbiAqXG4gKiBAcGFyYW0ge1BJWEkuSVNpemV9IHNpemUgLSBJbml0aWFsIHNpemUgb2Ygc2NyZWVuXG4gKi9cblJlbmRlclRleHR1cmVQb29sLnByb3RvdHlwZS5zZXRTY3JlZW5TaXplID0gZnVuY3Rpb24gc2V0U2NyZWVuU2l6ZSAoc2l6ZSlcbntcbiAgICBpZiAoc2l6ZS53aWR0aCA9PT0gdGhpcy5fcGl4ZWxzV2lkdGhcbiAgICAgICAgJiYgc2l6ZS5oZWlnaHQgPT09IHRoaXMuX3BpeGVsc0hlaWdodClcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2NyZWVuS2V5ID0gUmVuZGVyVGV4dHVyZVBvb2wuU0NSRUVOX0tFWTtcbiAgICB2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVQb29sW3NjcmVlbktleV07XG5cbiAgICB0aGlzLmVuYWJsZUZ1bGxTY3JlZW4gPSBzaXplLndpZHRoID4gMCAmJiBzaXplLmhlaWdodCA+IDA7XG5cbiAgICBpZiAodGV4dHVyZXMpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRleHR1cmVzLmxlbmd0aDsgaisrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0dXJlc1tqXS5kZXN0cm95KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMudGV4dHVyZVBvb2xbc2NyZWVuS2V5XSA9IFtdO1xuXG4gICAgdGhpcy5fcGl4ZWxzV2lkdGggPSBzaXplLndpZHRoO1xuICAgIHRoaXMuX3BpeGVsc0hlaWdodCA9IHNpemUuaGVpZ2h0O1xufTtcblxuLyoqXG4gKiBLZXkgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIGZ1bGxzY3JlZW4gcmVuZGVyVGV4dHVyZXMgaW4gYSBwb29sXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0IHtzdHJpbmd9XG4gKi9cblJlbmRlclRleHR1cmVQb29sLlNDUkVFTl9LRVkgPSAnc2NyZWVuJztcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgYXR0cmlidXRlIHN0cnVjdHVyZSByZXF1aXJlZCB0byByZW5kZXIgZ2VvbWV0cnkuXG4gKlxuICogVGhpcyBkb2VzIG5vdCBjb250YWluIHRoZSBhY3R1YWwgZGF0YSwgYnV0IGluc3RlYWQgaGFzIGEgYnVmZmVyIGlkIHRoYXQgbWFwcyB0byBhIHtAbGluayBQSVhJLkJ1ZmZlcn1cbiAqIFRoaXMgY2FuIGluY2x1ZGUgYW55dGhpbmcgZnJvbSBwb3NpdGlvbnMsIHV2cywgbm9ybWFscywgY29sb3JzIGV0Yy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBBdHRyaWJ1dGUgPSBmdW5jdGlvbiBBdHRyaWJ1dGUoYnVmZmVyLCBzaXplLCBub3JtYWxpemVkLCB0eXBlLCBzdHJpZGUsIHN0YXJ0LCBpbnN0YW5jZSlcbntcbiAgICBpZiAoIG5vcm1hbGl6ZWQgPT09IHZvaWQgMCApIG5vcm1hbGl6ZWQgPSBmYWxzZTtcbiAgICBpZiAoIHR5cGUgPT09IHZvaWQgMCApIHR5cGUgPSA1MTI2O1xuXG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zdHJpZGUgPSBzdHJpZGU7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbn07XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIEF0dHJpYnV0ZS5cbiAqL1xuQXR0cmlidXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxue1xuICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBBdHRyaWJ1dGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkXG4gKlxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IGJ1ZmZlciAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdGhhdCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGxvb2sgZm9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NpemU9MF0gdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYgeW91IGhhdmUgMiBmbG9hdHMgcGVyIHZlcnRleCAoZWcgcG9zaXRpb24geCBhbmQgeSkgdGhpcyB3b3VsZCBiZSAyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSBzaG91bGQgdGhlIGRhdGEgYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbc3RhcnQ9MF0gSG93IGZhciBpbnRvIHRoZSBhcnJheSB0byBzdGFydCByZWFkaW5nIHZhbHVlcyAodXNlZCBmb3IgaW50ZXJsZWF2aW5nIGRhdGEpXG4gKiBAcGFyYW0ge051bWJlcn0gW3R5cGU9UElYSS5UWVBFUy5GTE9BVF0gd2hhdCB0eXBlIG9mIG51bWJlciBpcyB0aGUgYXR0cmlidXRlLiBDaGVjayB7QGxpbmsgUElYSS5UWVBFU30gdG8gc2VlIHRoZSBvbmVzIGF2YWlsYWJsZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzdHJpZGU9MF0gSG93IGZhciBhcGFydCAoaW4gZmxvYXRzKSB0aGUgc3RhcnQgb2YgZWFjaCB2YWx1ZSBpcy4gKHVzZWQgZm9yIGludGVybGVhdmluZyBkYXRhKVxuICpcbiAqIEByZXR1cm5zIHtQSVhJLkF0dHJpYnV0ZX0gQSBuZXcge0BsaW5rIFBJWEkuQXR0cmlidXRlfSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWRcbiAqL1xuQXR0cmlidXRlLmZyb20gPSBmdW5jdGlvbiBmcm9tIChidWZmZXIsIHNpemUsIG5vcm1hbGl6ZWQsIHR5cGUsIHN0cmlkZSlcbntcbiAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZShidWZmZXIsIHNpemUsIG5vcm1hbGl6ZWQsIHR5cGUsIHN0cmlkZSk7XG59O1xuXG52YXIgVUlEID0gMDtcbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIGRhdGEgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhbmQgdXBsb2FkZWQgYnkgV2ViR0xcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBCdWZmZXIgPSBmdW5jdGlvbiBCdWZmZXIoZGF0YSwgX3N0YXRpYywgaW5kZXgpXG57XG4gICAgaWYgKCBfc3RhdGljID09PSB2b2lkIDAgKSBfc3RhdGljID0gdHJ1ZTtcbiAgICBpZiAoIGluZGV4ID09PSB2b2lkIDAgKSBpbmRleCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwgYXMgYSB0eXBlZCBhcnJheVxuICAgICAqXG4gICAgICogQG1lbWJlciB7QXJyYXlCdWZmZXJ8IFNoYXJlZEFycmF5QnVmZmVyfEFycmF5QnVmZmVyVmlld31cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IG5ldyBGbG9hdDMyQXJyYXkoMSk7XG5cbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiByZW5kZXJlciBJRHMgdG8gd2ViZ2wgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge29iamVjdDxudW1iZXIsIEdMQnVmZmVyPn1cbiAgICAgKi9cbiAgICB0aGlzLl9nbEJ1ZmZlcnMgPSB7fTtcblxuICAgIHRoaXMuX3VwZGF0ZUlEID0gMDtcblxuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblxuICAgIHRoaXMuc3RhdGljID0gX3N0YXRpYztcblxuICAgIHRoaXMuaWQgPSBVSUQrKztcblxuICAgIHRoaXMuZGlzcG9zZVJ1bm5lciA9IG5ldyBSdW5uZXIoJ2Rpc3Bvc2VCdWZmZXInLCAyKTtcbn07XG5cbi8vIFRPRE8gY291bGQgZXhwbG9yZSBmbGFnZ2luZyBvbmx5IGEgcGFydGlhbCB1cGxvYWQ/XG4vKipcbiAqIGZsYWdzIHRoaXMgYnVmZmVyIGFzIHJlcXVpcmluZyBhbiB1cGxvYWQgdG8gdGhlIEdQVVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcnxTaGFyZWRBcnJheUJ1ZmZlcnxBcnJheUJ1ZmZlclZpZXd9IFtkYXRhXSB0aGUgZGF0YSB0byB1cGRhdGUgaW4gdGhlIGJ1ZmZlci5cbiAqL1xuQnVmZmVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKGRhdGEpXG57XG4gICAgdGhpcy5kYXRhID0gZGF0YSB8fCB0aGlzLmRhdGE7XG4gICAgdGhpcy5fdXBkYXRlSUQrKztcbn07XG5cbi8qKlxuICogZGlzcG9zZXMgV2ViR0wgcmVzb3VyY2VzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGlzIGdlb21ldHJ5XG4gKi9cbkJ1ZmZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UgKClcbntcbiAgICB0aGlzLmRpc3Bvc2VSdW5uZXIucnVuKHRoaXMsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIGJ1ZmZlclxuICovXG5CdWZmZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy5kaXNwb3NlKCk7XG5cbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgYnVmZmVyIGJhc2VkIG9uIGFuIGFycmF5IG9yIFR5cGVkQXJyYXlcbiAqXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyVmlldyB8IG51bWJlcltdfSBkYXRhIHRoZSBUeXBlZEFycmF5IHRoYXQgdGhlIGJ1ZmZlciB3aWxsIHN0b3JlLiBJZiB0aGlzIGlzIGEgcmVndWxhciBBcnJheSBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIEZsb2F0MzJBcnJheS5cbiAqIEByZXR1cm4ge1BJWEkuQnVmZmVyfSBBIG5ldyBCdWZmZXIgYmFzZWQgb24gdGhlIGRhdGEgcHJvdmlkZWQuXG4gKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gZnJvbSAoZGF0YSlcbntcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5KVxuICAgIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoZGF0YSk7XG59O1xuXG5mdW5jdGlvbiBnZXRCdWZmZXJUeXBlKGFycmF5KVxue1xuICAgIGlmIChhcnJheS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gNClcbiAgICB7XG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuICdGbG9hdDMyQXJyYXknO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiAnVWludDMyQXJyYXknO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICdJbnQzMkFycmF5JztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJyYXkuQllURVNfUEVSX0VMRU1FTlQgPT09IDIpXG4gICAge1xuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuICdVaW50MTZBcnJheSc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXJyYXkuQllURVNfUEVSX0VMRU1FTlQgPT09IDEpXG4gICAge1xuICAgICAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gJ1VpbnQ4QXJyYXknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETyBtYXAgb3V0IHRoZSByZXN0IG9mIHRoZSBhcnJheSBlbGVtZW50cyFcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LXNob3J0aGFuZCAqL1xudmFyIG1hcCA9IHtcbiAgICBGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICBVaW50MzJBcnJheTogVWludDMyQXJyYXksXG4gICAgSW50MzJBcnJheTogSW50MzJBcnJheSxcbiAgICBVaW50OEFycmF5OiBVaW50OEFycmF5LFxufTtcblxuZnVuY3Rpb24gaW50ZXJsZWF2ZVR5cGVkQXJyYXlzKGFycmF5cywgc2l6ZXMpXG57XG4gICAgdmFyIG91dFNpemUgPSAwO1xuICAgIHZhciBzdHJpZGUgPSAwO1xuICAgIHZhciB2aWV3cyA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICBzdHJpZGUgKz0gc2l6ZXNbaV07XG4gICAgICAgIG91dFNpemUgKz0gYXJyYXlzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKG91dFNpemUgKiA0KTtcblxuICAgIHZhciBvdXQgPSBudWxsO1xuICAgIHZhciBsaXR0bGVPZmZzZXQgPSAwO1xuXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgYXJyYXlzLmxlbmd0aDsgaSQxKyspXG4gICAge1xuICAgICAgICB2YXIgc2l6ZSA9IHNpemVzW2kkMV07XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpJDFdO1xuXG4gICAgICAgIHZhciB0eXBlID0gZ2V0QnVmZmVyVHlwZShhcnJheSk7XG5cbiAgICAgICAgaWYgKCF2aWV3c1t0eXBlXSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmlld3NbdHlwZV0gPSBuZXcgbWFwW3R5cGVdKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBvdXQgPSB2aWV3c1t0eXBlXTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5Lmxlbmd0aDsgaisrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaW5kZXhTdGFydCA9ICgoaiAvIHNpemUgfCAwKSAqIHN0cmlkZSkgKyBsaXR0bGVPZmZzZXQ7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBqICUgc2l6ZTtcblxuICAgICAgICAgICAgb3V0W2luZGV4U3RhcnQgKyBpbmRleF0gPSBhcnJheVtqXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpdHRsZU9mZnNldCArPSBzaXplO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlcik7XG59XG5cbnZhciBieXRlU2l6ZU1hcCA9IHsgNTEyNjogNCwgNTEyMzogMiwgNTEyMTogMSB9O1xudmFyIFVJRCQxID0gMDtcblxuLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LXNob3J0aGFuZCAqL1xudmFyIG1hcCQxID0ge1xuICAgIEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuICAgIFVpbnQzMkFycmF5OiBVaW50MzJBcnJheSxcbiAgICBJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuICAgIFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG4gICAgVWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxufTtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIFRoZSBHZW9tZXRyeSByZXByZXNlbnRzIGEgbW9kZWwuIEl0IGNvbnNpc3RzIG9mIHR3byBjb21wb25lbnRzOlxuICogLSBHZW9tZXRyeVN0eWxlIC0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgc3VjaCBhcyB0aGUgYXR0cmlidXRlcyBsYXlvdXRcbiAqIC0gR2VvbWV0cnlEYXRhIC0gdGhlIGRhdGEgb2YgdGhlIG1vZGVsIC0gdGhpcyBjb25zaXN0cyBvZiBidWZmZXJzLlxuICogVGhpcyBjYW4gaW5jbHVkZSBhbnl0aGluZyBmcm9tIHBvc2l0aW9ucywgdXZzLCBub3JtYWxzLCBjb2xvcnMgZXRjLlxuICpcbiAqIEdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkIHdpdGhvdXQgcGFzc2luZyBpbiBhIHN0eWxlIG9yIGRhdGEgaWYgcmVxdWlyZWQgKHRoYXRzIGhvdyBJIHByZWZlciEpXG4gKlxuICogYGBganNcbiAqIGxldCBnZW9tZXRyeSA9IG5ldyBQSVhJLkdlb21ldHJ5KCk7XG4gKlxuICogZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCdwb3NpdGlvbnMnLCBbMCwgMCwgMTAwLCAwLCAxMDAsIDEwMCwgMCwgMTAwXSwgMik7XG4gKiBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3V2cycsIFswLDAsMSwwLDEsMSwwLDFdLDIpXG4gKiBnZW9tZXRyeS5hZGRJbmRleChbMCwxLDIsMSwzLDJdKVxuICpcbiAqIGBgYFxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgR2VvbWV0cnkgPSBmdW5jdGlvbiBHZW9tZXRyeShidWZmZXJzLCBhdHRyaWJ1dGVzKVxue1xuICAgIGlmICggYnVmZmVycyA9PT0gdm9pZCAwICkgYnVmZmVycyA9IFtdO1xuICAgIGlmICggYXR0cmlidXRlcyA9PT0gdm9pZCAwICkgYXR0cmlidXRlcyA9IHt9O1xuXG4gICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcblxuICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBudWxsO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblxuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIHJlbmRlcmVyIElEcyB0byB3ZWJnbCBWQU9zXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmdsVmVydGV4QXJyYXlPYmplY3RzID0ge307XG5cbiAgICB0aGlzLmlkID0gVUlEJDErKztcblxuICAgIHRoaXMuaW5zdGFuY2VkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5zdGFuY2VzIGluIHRoaXMgZ2VvbWV0cnksIHBhc3MgaXQgdG8gYEdlb21ldHJ5U3lzdGVtLmRyYXcoKWBcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMVxuICAgICAqL1xuICAgIHRoaXMuaW5zdGFuY2VDb3VudCA9IDE7XG5cbiAgICB0aGlzLmRpc3Bvc2VSdW5uZXIgPSBuZXcgUnVubmVyKCdkaXNwb3NlR2VvbWV0cnknLCAyKTtcblxuICAgIC8qKlxuICAgICAqIENvdW50IG9mIGV4aXN0aW5nIChub3QgZGVzdHJveWVkKSBtZXNoZXMgdGhhdCByZWZlcmVuY2UgdGhpcyBnZW9tZXRyeVxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJlZkNvdW50ID0gMDtcbn07XG5cbi8qKlxuKlxuKiBBZGRzIGFuIGF0dHJpYnV0ZSB0byB0aGUgZ2VvbWV0cnlcbipcbiogQHBhcmFtIHtTdHJpbmd9IGlkIC0gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAobWF0Y2hpbmcgdXAgdG8gYSBzaGFkZXIpXG4qIEBwYXJhbSB7UElYSS5CdWZmZXJ8bnVtYmVyW119IFtidWZmZXJdIHRoZSBidWZmZXIgdGhhdCBob2xkcyB0aGUgZGF0YSBvZiB0aGUgYXR0cmlidXRlIC4gWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gQXJyYXkgYW5kIGEgYnVmZmVyIHdpbGwgYmUgY3JlYXRlZCBmcm9tIGl0LlxuKiBAcGFyYW0ge051bWJlcn0gW3NpemU9MF0gdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZS4gSWYgeW91IGhhdmUgMiBmbG9hdHMgcGVyIHZlcnRleCAoZWcgcG9zaXRpb24geCBhbmQgeSkgdGhpcyB3b3VsZCBiZSAyXG4qIEBwYXJhbSB7Qm9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIHNob3VsZCB0aGUgZGF0YSBiZSBub3JtYWxpemVkLlxuKiBAcGFyYW0ge051bWJlcn0gW3R5cGU9UElYSS5UWVBFUy5GTE9BVF0gd2hhdCB0eXBlIG9mIG51bWJlciBpcyB0aGUgYXR0cmlidXRlLiBDaGVjayB7UElYSS5UWVBFU30gdG8gc2VlIHRoZSBvbmVzIGF2YWlsYWJsZVxuKiBAcGFyYW0ge051bWJlcn0gW3N0cmlkZT0wXSBIb3cgZmFyIGFwYXJ0IChpbiBmbG9hdHMpIHRoZSBzdGFydCBvZiBlYWNoIHZhbHVlIGlzLiAodXNlZCBmb3IgaW50ZXJsZWF2aW5nIGRhdGEpXG4qIEBwYXJhbSB7TnVtYmVyfSBbc3RhcnQ9MF0gSG93IGZhciBpbnRvIHRoZSBhcnJheSB0byBzdGFydCByZWFkaW5nIHZhbHVlcyAodXNlZCBmb3IgaW50ZXJsZWF2aW5nIGRhdGEpXG4qXG4qIEByZXR1cm4ge1BJWEkuR2VvbWV0cnl9IHJldHVybnMgc2VsZiwgdXNlZnVsIGZvciBjaGFpbmluZy5cbiovXG5HZW9tZXRyeS5wcm90b3R5cGUuYWRkQXR0cmlidXRlID0gZnVuY3Rpb24gYWRkQXR0cmlidXRlIChpZCwgYnVmZmVyLCBzaXplLCBub3JtYWxpemVkLCB0eXBlLCBzdHJpZGUsIHN0YXJ0LCBpbnN0YW5jZSlcbntcbiAgICAgICAgaWYgKCBub3JtYWxpemVkID09PSB2b2lkIDAgKSBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgICAgIGlmICggaW5zdGFuY2UgPT09IHZvaWQgMCApIGluc3RhbmNlID0gZmFsc2U7XG5cbiAgICBpZiAoIWJ1ZmZlcilcbiAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcGFzcyBhIGJ1ZmZlciB3aGVuIGNyZWF0aW5nIGFuIGF0dHJpYnV0ZScpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgYSBidWZmZXIhXG4gICAgaWYgKCFidWZmZXIuZGF0YSlcbiAgICB7XG4gICAgICAgIC8vIGl0cyBhbiBhcnJheSFcbiAgICAgICAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgICB7XG4gICAgICAgICAgICBidWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBidWZmZXIgPSBuZXcgQnVmZmVyKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdmFyIGlkcyA9IGlkLnNwbGl0KCd8Jyk7XG5cbiAgICBpZiAoaWRzLmxlbmd0aCA+IDEpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5hZGRBdHRyaWJ1dGUoaWRzW2ldLCBidWZmZXIsIHNpemUsIG5vcm1hbGl6ZWQsIHR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlckluZGV4ID0gdGhpcy5idWZmZXJzLmluZGV4T2YoYnVmZmVyKTtcblxuICAgIGlmIChidWZmZXJJbmRleCA9PT0gLTEpXG4gICAge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgICBidWZmZXJJbmRleCA9IHRoaXMuYnVmZmVycy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHRoaXMuYXR0cmlidXRlc1tpZF0gPSBuZXcgQXR0cmlidXRlKGJ1ZmZlckluZGV4LCBzaXplLCBub3JtYWxpemVkLCB0eXBlLCBzdHJpZGUsIHN0YXJ0LCBpbnN0YW5jZSk7XG5cbiAgICAvLyBhc3N1bWluZyB0aGF0IGlmIHRoZXJlIGlzIGluc3RhbmNlZCBkYXRhIHRoZW4gdGhpcyB3aWxsIGJlIGRyYXduIHdpdGggaW5zdGFuY2luZyFcbiAgICB0aGlzLmluc3RhbmNlZCA9IHRoaXMuaW5zdGFuY2VkIHx8IGluc3RhbmNlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgcmVxdWlyZWRcbiAqIEByZXR1cm4ge1BJWEkuQXR0cmlidXRlfSB0aGUgYXR0cmlidXRlIHJlcXVlc3RlZC5cbiAqL1xuR2VvbWV0cnkucHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoaWQpXG57XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1tpZF07XG59O1xuXG4vKipcbiAqIHJldHVybnMgdGhlIHJlcXVlc3RlZCBidWZmZXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgIHRoZSBuYW1lIG9mIHRoZSBidWZmZXIgcmVxdWlyZWRcbiAqIEByZXR1cm4ge1BJWEkuQnVmZmVyfSB0aGUgYnVmZmVyIHJlcXVlc3RlZC5cbiAqL1xuR2VvbWV0cnkucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlciAoaWQpXG57XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyc1t0aGlzLmdldEF0dHJpYnV0ZShpZCkuYnVmZmVyXTtcbn07XG5cbi8qKlxuKlxuKiBBZGRzIGFuIGluZGV4IGJ1ZmZlciB0byB0aGUgZ2VvbWV0cnlcbiogVGhlIGluZGV4IGJ1ZmZlciBjb250YWlucyBpbnRlZ2VycywgdGhyZWUgZm9yIGVhY2ggdHJpYW5nbGUgaW4gdGhlIGdlb21ldHJ5LCB3aGljaCByZWZlcmVuY2UgdGhlIHZhcmlvdXMgYXR0cmlidXRlIGJ1ZmZlcnMgKHBvc2l0aW9uLCBjb2xvdXIsIFVWIGNvb3JkaW5hdGVzLCBvdGhlciBVViBjb29yZGluYXRlcywgbm9ybWFsLCDigKYpLiBUaGVyZSBpcyBvbmx5IE9ORSBpbmRleCBidWZmZXIuXG4qXG4qIEBwYXJhbSB7UElYSS5CdWZmZXJ8bnVtYmVyW119IFtidWZmZXJdIHRoZSBidWZmZXIgdGhhdCBob2xkcyB0aGUgZGF0YSBvZiB0aGUgaW5kZXggYnVmZmVyLiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBBcnJheSBhbmQgYSBidWZmZXIgd2lsbCBiZSBjcmVhdGVkIGZyb20gaXQuXG4qIEByZXR1cm4ge1BJWEkuR2VvbWV0cnl9IHJldHVybnMgc2VsZiwgdXNlZnVsIGZvciBjaGFpbmluZy5cbiovXG5HZW9tZXRyeS5wcm90b3R5cGUuYWRkSW5kZXggPSBmdW5jdGlvbiBhZGRJbmRleCAoYnVmZmVyKVxue1xuICAgIGlmICghYnVmZmVyLmRhdGEpXG4gICAge1xuICAgICAgICAvLyBpdHMgYW4gYXJyYXkhXG4gICAgICAgIGlmIChidWZmZXIgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAge1xuICAgICAgICAgICAgYnVmZmVyID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBidWZmZXIgPSBuZXcgQnVmZmVyKGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgYnVmZmVyLmluZGV4ID0gdHJ1ZTtcbiAgICB0aGlzLmluZGV4QnVmZmVyID0gYnVmZmVyO1xuXG4gICAgaWYgKHRoaXMuYnVmZmVycy5pbmRleE9mKGJ1ZmZlcikgPT09IC0xKVxuICAgIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogcmV0dXJucyB0aGUgaW5kZXggYnVmZmVyXG4gKlxuICogQHJldHVybiB7UElYSS5CdWZmZXJ9IHRoZSBpbmRleCBidWZmZXIuXG4gKi9cbkdlb21ldHJ5LnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uIGdldEluZGV4ICgpXG57XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhCdWZmZXI7XG59O1xuXG4vKipcbiAqIHRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIHN0cnVjdHVyZSBzbyB0aGF0IGFsbCBjdXJyZW50IGF0dHJpYnV0ZXMgYmVjb21lIGludGVybGVhdmVkIGludG8gYSBzaW5nbGUgYnVmZmVyXG4gKiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91ciBtb2RlbCByZW1haW5zIHN0YXRpYyBhcyBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgYm9vc3RcbiAqXG4gKiBAcmV0dXJuIHtQSVhJLkdlb21ldHJ5fSByZXR1cm5zIHNlbGYsIHVzZWZ1bCBmb3IgY2hhaW5pbmcuXG4gKi9cbkdlb21ldHJ5LnByb3RvdHlwZS5pbnRlcmxlYXZlID0gZnVuY3Rpb24gaW50ZXJsZWF2ZSAoKVxue1xuICAgIC8vIGEgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBidWZmZXJzIGFyZSBhbHJlYWR5IGludGVybGVhdmVkLi5cbiAgICBpZiAodGhpcy5idWZmZXJzLmxlbmd0aCA9PT0gMSB8fCAodGhpcy5idWZmZXJzLmxlbmd0aCA9PT0gMiAmJiB0aGlzLmluZGV4QnVmZmVyKSkgeyByZXR1cm4gdGhpczsgfVxuXG4gICAgLy8gYXNzdW1lIGFscmVhZHkgdGhhdCBubyBidWZmZXJzIGFyZSBpbnRlcmxlYXZlZFxuICAgIHZhciBhcnJheXMgPSBbXTtcbiAgICB2YXIgc2l6ZXMgPSBbXTtcbiAgICB2YXIgaW50ZXJsZWF2ZWRCdWZmZXIgPSBuZXcgQnVmZmVyKCk7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgaW4gdGhpcy5hdHRyaWJ1dGVzKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlc1tpXTtcblxuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXJzW2F0dHJpYnV0ZS5idWZmZXJdO1xuXG4gICAgICAgIGFycmF5cy5wdXNoKGJ1ZmZlci5kYXRhKTtcblxuICAgICAgICBzaXplcy5wdXNoKChhdHRyaWJ1dGUuc2l6ZSAqIGJ5dGVTaXplTWFwW2F0dHJpYnV0ZS50eXBlXSkgLyA0KTtcblxuICAgICAgICBhdHRyaWJ1dGUuYnVmZmVyID0gMDtcbiAgICB9XG5cbiAgICBpbnRlcmxlYXZlZEJ1ZmZlci5kYXRhID0gaW50ZXJsZWF2ZVR5cGVkQXJyYXlzKGFycmF5cywgc2l6ZXMpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYnVmZmVycy5sZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcnNbaV0gIT09IHRoaXMuaW5kZXhCdWZmZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyc1tpXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlcnMgPSBbaW50ZXJsZWF2ZWRCdWZmZXJdO1xuXG4gICAgaWYgKHRoaXMuaW5kZXhCdWZmZXIpXG4gICAge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMucHVzaCh0aGlzLmluZGV4QnVmZmVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbkdlb21ldHJ5LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24gZ2V0U2l6ZSAoKVxue1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5hdHRyaWJ1dGVzKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlc1tpXTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyc1thdHRyaWJ1dGUuYnVmZmVyXTtcblxuICAgICAgICByZXR1cm4gYnVmZmVyLmRhdGEubGVuZ3RoIC8gKChhdHRyaWJ1dGUuc3RyaWRlIC8gNCkgfHwgYXR0cmlidXRlLnNpemUpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xufTtcblxuLyoqXG4gKiBkaXNwb3NlcyBXZWJHTCByZXNvdXJjZXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoaXMgZ2VvbWV0cnlcbiAqL1xuR2VvbWV0cnkucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlICgpXG57XG4gICAgdGhpcy5kaXNwb3NlUnVubmVyLnJ1bih0aGlzLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBnZW9tZXRyeS5cbiAqL1xuR2VvbWV0cnkucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy5kaXNwb3NlKCk7XG5cbiAgICB0aGlzLmJ1ZmZlcnMgPSBudWxsO1xuICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IG51bGw7XG59O1xuXG4vKipcbiAqIHJldHVybnMgYSBjbG9uZSBvZiB0aGUgZ2VvbWV0cnlcbiAqXG4gKiBAcmV0dXJucyB7UElYSS5HZW9tZXRyeX0gYSBuZXcgY2xvbmUgb2YgdGhpcyBnZW9tZXRyeVxuICovXG5HZW9tZXRyeS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKVxue1xuICAgIHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlcnMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICBnZW9tZXRyeS5idWZmZXJzW2ldID0gbmV3IEJ1ZmZlcih0aGlzLmJ1ZmZlcnNbaV0uZGF0YS5zbGljZSgpKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpJDEgaW4gdGhpcy5hdHRyaWJ1dGVzKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYiA9IHRoaXMuYXR0cmlidXRlc1tpJDFdO1xuXG4gICAgICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXNbaSQxXSA9IG5ldyBBdHRyaWJ1dGUoXG4gICAgICAgICAgICBhdHRyaWIuYnVmZmVyLFxuICAgICAgICAgICAgYXR0cmliLnNpemUsXG4gICAgICAgICAgICBhdHRyaWIubm9ybWFsaXplZCxcbiAgICAgICAgICAgIGF0dHJpYi50eXBlLFxuICAgICAgICAgICAgYXR0cmliLnN0cmlkZSxcbiAgICAgICAgICAgIGF0dHJpYi5zdGFydCxcbiAgICAgICAgICAgIGF0dHJpYi5pbnN0YW5jZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluZGV4QnVmZmVyKVxuICAgIHtcbiAgICAgICAgZ2VvbWV0cnkuaW5kZXhCdWZmZXIgPSBnZW9tZXRyeS5idWZmZXJzW3RoaXMuYnVmZmVycy5pbmRleE9mKHRoaXMuaW5kZXhCdWZmZXIpXTtcbiAgICAgICAgZ2VvbWV0cnkuaW5kZXhCdWZmZXIuaW5kZXggPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBnZW9tZXRyeTtcbn07XG5cbi8qKlxuICogbWVyZ2VzIGFuIGFycmF5IG9mIGdlb21ldHJpZXMgaW50byBhIG5ldyBzaW5nbGUgb25lXG4gKiBnZW9tZXRyeSBhdHRyaWJ1dGUgc3R5bGVzIG11c3QgbWF0Y2ggZm9yIHRoaXMgb3BlcmF0aW9uIHRvIHdvcmtcbiAqXG4gKiBAcGFyYW0ge1BJWEkuR2VvbWV0cnlbXX0gZ2VvbWV0cmllcyBhcnJheSBvZiBnZW9tZXRyaWVzIHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7UElYSS5HZW9tZXRyeX0gc2hpbnkgbmV3IGdlb21ldHJ5IVxuICovXG5HZW9tZXRyeS5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlIChnZW9tZXRyaWVzKVxue1xuICAgIC8vIHRvZG8gYWRkIGEgZ2VvbWV0cnkgY2hlY2shXG4gICAgLy8gYWxzbyBhIHNpemUgY2hlY2suLiBjYW50IGJlIHRvbyBiaWchXVxuXG4gICAgdmFyIGdlb21ldHJ5T3V0ID0gbmV3IEdlb21ldHJ5KCk7XG5cbiAgICB2YXIgYXJyYXlzID0gW107XG4gICAgdmFyIHNpemVzID0gW107XG4gICAgdmFyIG9mZnNldHMgPSBbXTtcblxuICAgIHZhciBnZW9tZXRyeTtcblxuICAgIC8vIHBhc3Mgb25lLi4gZ2V0IHNpemVzLi5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJpZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICBnZW9tZXRyeSA9IGdlb21ldHJpZXNbaV07XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tZXRyeS5idWZmZXJzLmxlbmd0aDsgaisrKVxuICAgICAgICB7XG4gICAgICAgICAgICBzaXplc1tqXSA9IHNpemVzW2pdIHx8IDA7XG4gICAgICAgICAgICBzaXplc1tqXSArPSBnZW9tZXRyeS5idWZmZXJzW2pdLmRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgb2Zmc2V0c1tqXSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBidWlsZCB0aGUgY29ycmVjdCBzaXplIGFycmF5cy4uXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgZ2VvbWV0cnkuYnVmZmVycy5sZW5ndGg7IGkkMSsrKVxuICAgIHtcbiAgICAgICAgLy8gVE9ETyB0eXBlcyFcbiAgICAgICAgYXJyYXlzW2kkMV0gPSBuZXcgbWFwJDFbZ2V0QnVmZmVyVHlwZShnZW9tZXRyeS5idWZmZXJzW2kkMV0uZGF0YSldKHNpemVzW2kkMV0pO1xuICAgICAgICBnZW9tZXRyeU91dC5idWZmZXJzW2kkMV0gPSBuZXcgQnVmZmVyKGFycmF5c1tpJDFdKTtcbiAgICB9XG5cbiAgICAvLyBwYXNzIHRvIHNldCBkYXRhLi5cbiAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBnZW9tZXRyaWVzLmxlbmd0aDsgaSQyKyspXG4gICAge1xuICAgICAgICBnZW9tZXRyeSA9IGdlb21ldHJpZXNbaSQyXTtcblxuICAgICAgICBmb3IgKHZhciBqJDEgPSAwOyBqJDEgPCBnZW9tZXRyeS5idWZmZXJzLmxlbmd0aDsgaiQxKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGFycmF5c1tqJDFdLnNldChnZW9tZXRyeS5idWZmZXJzW2okMV0uZGF0YSwgb2Zmc2V0c1tqJDFdKTtcbiAgICAgICAgICAgIG9mZnNldHNbaiQxXSArPSBnZW9tZXRyeS5idWZmZXJzW2okMV0uZGF0YS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW9tZXRyeU91dC5hdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuICAgIGlmIChnZW9tZXRyeS5pbmRleEJ1ZmZlcilcbiAgICB7XG4gICAgICAgIGdlb21ldHJ5T3V0LmluZGV4QnVmZmVyID0gZ2VvbWV0cnlPdXQuYnVmZmVyc1tnZW9tZXRyeS5idWZmZXJzLmluZGV4T2YoZ2VvbWV0cnkuaW5kZXhCdWZmZXIpXTtcbiAgICAgICAgZ2VvbWV0cnlPdXQuaW5kZXhCdWZmZXIuaW5kZXggPSB0cnVlO1xuXG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgc3RyaWRlID0gMDtcbiAgICAgICAgdmFyIG9mZnNldDIgPSAwO1xuICAgICAgICB2YXIgYnVmZmVySW5kZXhUb0NvdW50ID0gMDtcblxuICAgICAgICAvLyBnZXQgYSBidWZmZXJcbiAgICAgICAgZm9yICh2YXIgaSQzID0gMDsgaSQzIDwgZ2VvbWV0cnkuYnVmZmVycy5sZW5ndGg7IGkkMysrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZ2VvbWV0cnkuYnVmZmVyc1tpJDNdICE9PSBnZW9tZXRyeS5pbmRleEJ1ZmZlcilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBidWZmZXJJbmRleFRvQ291bnQgPSBpJDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWd1cmUgb3V0IHRoZSBzdHJpZGUgb2Ygb25lIGJ1ZmZlci4uXG4gICAgICAgIGZvciAodmFyIGkkNCBpbiBnZW9tZXRyeS5hdHRyaWJ1dGVzKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlc1tpJDRdO1xuXG4gICAgICAgICAgICBpZiAoKGF0dHJpYnV0ZS5idWZmZXIgfCAwKSA9PT0gYnVmZmVySW5kZXhUb0NvdW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0cmlkZSArPSAoKGF0dHJpYnV0ZS5zaXplICogYnl0ZVNpemVNYXBbYXR0cmlidXRlLnR5cGVdKSAvIDQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGltZSB0byBvZmYgc2V0IGFsbCBpbmRleGVzLi5cbiAgICAgICAgZm9yICh2YXIgaSQ1ID0gMDsgaSQ1IDwgZ2VvbWV0cmllcy5sZW5ndGg7IGkkNSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaW5kZXhCdWZmZXJEYXRhID0gZ2VvbWV0cmllc1tpJDVdLmluZGV4QnVmZmVyLmRhdGE7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGokMiA9IDA7IGokMiA8IGluZGV4QnVmZmVyRGF0YS5sZW5ndGg7IGokMisrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5T3V0LmluZGV4QnVmZmVyLmRhdGFbaiQyICsgb2Zmc2V0Ml0gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvZmZzZXQgKz0gZ2VvbWV0cnkuYnVmZmVyc1tidWZmZXJJbmRleFRvQ291bnRdLmRhdGEubGVuZ3RoIC8gKHN0cmlkZSk7XG4gICAgICAgICAgICBvZmZzZXQyICs9IGluZGV4QnVmZmVyRGF0YS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2VvbWV0cnlPdXQ7XG59O1xuXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgYSBxdWFkXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgUXVhZCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEdlb21ldHJ5KSB7XG4gICAgZnVuY3Rpb24gUXVhZCgpXG4gICAge1xuICAgICAgICBHZW9tZXRyeS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCdhVmVydGV4UG9zaXRpb24nLCBbXG4gICAgICAgICAgICAwLCAwLFxuICAgICAgICAgICAgMSwgMCxcbiAgICAgICAgICAgIDEsIDEsXG4gICAgICAgICAgICAwLCAxIF0pXG4gICAgICAgICAgICAuYWRkSW5kZXgoWzAsIDEsIDMsIDJdKTtcbiAgICB9XG5cbiAgICBpZiAoIEdlb21ldHJ5ICkgUXVhZC5fX3Byb3RvX18gPSBHZW9tZXRyeTtcbiAgICBRdWFkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5ICYmIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuICAgIFF1YWQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZDtcblxuICAgIHJldHVybiBRdWFkO1xufShHZW9tZXRyeSkpO1xuXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgYSBxdWFkIHdpdGggdXZzIGxpa2UgaW4gdjRcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXh0ZW5kcyBQSVhJLkdlb21ldHJ5XG4gKi9cbnZhciBRdWFkVXYgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChHZW9tZXRyeSkge1xuICAgIGZ1bmN0aW9uIFF1YWRVdigpXG4gICAge1xuICAgICAgICBHZW9tZXRyeS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBhcnJheSBvZiB2ZXJ0aWNlc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtGbG9hdDMyQXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAgICAgICAtMSwgLTEsXG4gICAgICAgICAgICAxLCAtMSxcbiAgICAgICAgICAgIDEsIDEsXG4gICAgICAgICAgICAtMSwgMSBdKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFV2cyBvZiB0aGUgcXVhZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtGbG9hdDMyQXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAgICAgMCwgMCxcbiAgICAgICAgICAgIDEsIDAsXG4gICAgICAgICAgICAxLCAxLFxuICAgICAgICAgICAgMCwgMSBdKTtcblxuICAgICAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy52ZXJ0aWNlcyk7XG4gICAgICAgIHRoaXMudXZCdWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMudXZzKTtcblxuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSgnYVZlcnRleFBvc2l0aW9uJywgdGhpcy52ZXJ0ZXhCdWZmZXIpXG4gICAgICAgICAgICAuYWRkQXR0cmlidXRlKCdhVGV4dHVyZUNvb3JkJywgdGhpcy51dkJ1ZmZlcilcbiAgICAgICAgICAgIC5hZGRJbmRleChbMCwgMSwgMiwgMCwgMiwgM10pO1xuICAgIH1cblxuICAgIGlmICggR2VvbWV0cnkgKSBRdWFkVXYuX19wcm90b19fID0gR2VvbWV0cnk7XG4gICAgUXVhZFV2LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5ICYmIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuICAgIFF1YWRVdi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkVXY7XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIHR3byBSZWN0YW5nbGUgdG8gdGhlIHF1YWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSB0YXJnZXRUZXh0dXJlRnJhbWUgLSB0aGUgZmlyc3QgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gZGVzdGluYXRpb25GcmFtZSAtIHRoZSBzZWNvbmQgcmVjdGFuZ2xlXG4gICAgICogQHJldHVybiB7UElYSS5RdWFkfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBRdWFkVXYucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAodGFyZ2V0VGV4dHVyZUZyYW1lLCBkZXN0aW5hdGlvbkZyYW1lKVxuICAgIHtcbiAgICAgICAgdmFyIHggPSAwOyAvLyBkZXN0aW5hdGlvbkZyYW1lLnggLyB0YXJnZXRUZXh0dXJlRnJhbWUud2lkdGg7XG4gICAgICAgIHZhciB5ID0gMDsgLy8gZGVzdGluYXRpb25GcmFtZS55IC8gdGFyZ2V0VGV4dHVyZUZyYW1lLmhlaWdodDtcblxuICAgICAgICB0aGlzLnV2c1swXSA9IHg7XG4gICAgICAgIHRoaXMudXZzWzFdID0geTtcblxuICAgICAgICB0aGlzLnV2c1syXSA9IHggKyAoZGVzdGluYXRpb25GcmFtZS53aWR0aCAvIHRhcmdldFRleHR1cmVGcmFtZS53aWR0aCk7XG4gICAgICAgIHRoaXMudXZzWzNdID0geTtcblxuICAgICAgICB0aGlzLnV2c1s0XSA9IHggKyAoZGVzdGluYXRpb25GcmFtZS53aWR0aCAvIHRhcmdldFRleHR1cmVGcmFtZS53aWR0aCk7XG4gICAgICAgIHRoaXMudXZzWzVdID0geSArIChkZXN0aW5hdGlvbkZyYW1lLmhlaWdodCAvIHRhcmdldFRleHR1cmVGcmFtZS5oZWlnaHQpO1xuXG4gICAgICAgIHRoaXMudXZzWzZdID0geDtcbiAgICAgICAgdGhpcy51dnNbN10gPSB5ICsgKGRlc3RpbmF0aW9uRnJhbWUuaGVpZ2h0IC8gdGFyZ2V0VGV4dHVyZUZyYW1lLmhlaWdodCk7XG5cbiAgICAgICAgeCA9IGRlc3RpbmF0aW9uRnJhbWUueDtcbiAgICAgICAgeSA9IGRlc3RpbmF0aW9uRnJhbWUueTtcblxuICAgICAgICB0aGlzLnZlcnRpY2VzWzBdID0geDtcbiAgICAgICAgdGhpcy52ZXJ0aWNlc1sxXSA9IHk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNlc1syXSA9IHggKyBkZXN0aW5hdGlvbkZyYW1lLndpZHRoO1xuICAgICAgICB0aGlzLnZlcnRpY2VzWzNdID0geTtcblxuICAgICAgICB0aGlzLnZlcnRpY2VzWzRdID0geCArIGRlc3RpbmF0aW9uRnJhbWUud2lkdGg7XG4gICAgICAgIHRoaXMudmVydGljZXNbNV0gPSB5ICsgZGVzdGluYXRpb25GcmFtZS5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNlc1s2XSA9IHg7XG4gICAgICAgIHRoaXMudmVydGljZXNbN10gPSB5ICsgZGVzdGluYXRpb25GcmFtZS5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGxlZ2FjeSB1cGxvYWQgbWV0aG9kLCBqdXN0IG1hcmtzIGJ1ZmZlcnMgZGlydHlcbiAgICAgKiBAcmV0dXJucyB7UElYSS5RdWFkVXZ9IFJldHVybnMgaXRzZWxmLlxuICAgICAqL1xuICAgIFF1YWRVdi5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudmVydGV4QnVmZmVyLl91cGRhdGVJRCsrO1xuICAgICAgICB0aGlzLnV2QnVmZmVyLl91cGRhdGVJRCsrO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICByZXR1cm4gUXVhZFV2O1xufShHZW9tZXRyeSkpO1xuXG52YXIgVUlEJDIgPSAwO1xuXG4vKipcbiAqIFVuaWZvcm0gZ3JvdXAgaG9sZHMgdW5pZm9ybSBtYXAgYW5kIHNvbWUgSUQncyBmb3Igd29ya1xuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFVuaWZvcm1Hcm91cCA9IGZ1bmN0aW9uIFVuaWZvcm1Hcm91cCh1bmlmb3JtcywgX3N0YXRpYylcbntcbiAgICAvKipcbiAgICAgKiB1bmlmb3JtIHZhbHVlc1xuICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnVuaWZvcm1zID0gdW5pZm9ybXM7XG5cbiAgICAvKipcbiAgICAgKiBJdHMgYSBncm91cCBhbmQgbm90IGEgc2luZ2xlIHVuaWZvcm1zXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgdGhpcy5ncm91cCA9IHRydWU7XG5cbiAgICAvLyBsZXRzIGdlbmVyYXRlIHRoaXMgd2hlbiB0aGUgc2hhZGVyID9cbiAgICB0aGlzLnN5bmNVbmlmb3JtcyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogZGlydHkgdmVyc2lvblxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXJ0eUlkID0gMDtcblxuICAgIC8qKlxuICAgICAqIHVuaXF1ZSBpZFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IFVJRCQyKys7XG5cbiAgICAvKipcbiAgICAgKiBVbmlmb3JtcyB3b250IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb25cbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuc3RhdGljID0gISFfc3RhdGljO1xufTtcblxuVW5pZm9ybUdyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKClcbntcbiAgICB0aGlzLmRpcnR5SWQrKztcbn07XG5cblVuaWZvcm1Hcm91cC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChuYW1lLCB1bmlmb3JtcywgX3N0YXRpYylcbntcbiAgICB0aGlzLnVuaWZvcm1zW25hbWVdID0gbmV3IFVuaWZvcm1Hcm91cCh1bmlmb3JtcywgX3N0YXRpYyk7XG59O1xuXG5Vbmlmb3JtR3JvdXAuZnJvbSA9IGZ1bmN0aW9uIGZyb20gKHVuaWZvcm1zLCBfc3RhdGljKVxue1xuICAgIHJldHVybiBuZXcgVW5pZm9ybUdyb3VwKHVuaWZvcm1zLCBfc3RhdGljKTtcbn07XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIGZpbHRlciBzdGF0ZXMuXG4gKlxuICogQGNsYXNzXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgRmlsdGVyU3RhdGUgPSBmdW5jdGlvbiBGaWx0ZXJTdGF0ZSgpXG57XG4gICAgdGhpcy5yZW5kZXJUZXh0dXJlID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRhcmdldCBvZiB0aGUgZmlsdGVyc1xuICAgICAqIFdlIHN0b3JlIGZvciBjYXNlIHdoZW4gY3VzdG9tIGZpbHRlciB3YW50cyB0byBrbm93IHRoZSBlbGVtZW50IGl0IHdhcyBhcHBsaWVkIG9uXG4gICAgICogQG1lbWJlciB7UElYSS5EaXNwbGF5T2JqZWN0fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy50YXJnZXQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGF0aWJpbGl0eSB3aXRoIFBpeGlKUyB2NCBmaWx0ZXJzXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sZWdhY3kgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFJlc29sdXRpb24gb2YgZmlsdGVyc1xuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnJlc29sdXRpb24gPSAxO1xuXG4gICAgLy8gbmV4dCB0aHJlZSBmaWVsZHMgYXJlIGNyZWF0ZWQgb25seSBmb3Igcm9vdFxuICAgIC8vIHJlLWFzc2lnbmVkIGZvciBldmVyeXRoaW5nIGVsc2VcblxuICAgIC8qKlxuICAgICAqIFNvdXJjZSBmcmFtZVxuICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5zb3VyY2VGcmFtZSA9IG5ldyBSZWN0YW5nbGUoKTtcblxuICAgIC8qKlxuICAgICAqIERlc3RpbmF0aW9uIGZyYW1lXG4gICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmRlc3RpbmF0aW9uRnJhbWUgPSBuZXcgUmVjdGFuZ2xlKCk7XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0aW9uIG9mIGZpbHRlcnNcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkZpbHRlcltdfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5maWx0ZXJzID0gW107XG59O1xuXG4vKipcbiAqIGNsZWFycyB0aGUgc3RhdGVcbiAqIEBwcml2YXRlXG4gKi9cbkZpbHRlclN0YXRlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpXG57XG4gICAgdGhpcy50YXJnZXQgPSBudWxsO1xuICAgIHRoaXMuZmlsdGVycyA9IG51bGw7XG4gICAgdGhpcy5yZW5kZXJUZXh0dXJlID0gbnVsbDtcbn07XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIHRoZSBmaWx0ZXJzLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkuc3lzdGVtc1xuICogQGV4dGVuZHMgUElYSS5TeXN0ZW1cbiAqL1xudmFyIEZpbHRlclN5c3RlbSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFN5c3RlbSkge1xuICAgIGZ1bmN0aW9uIEZpbHRlclN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgRmlsdGVyU3lzdGVtXG4gICAgICAgICAqIEBtZW1iZXIge09iamVjdFtdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclN0YWNrID0gW3t9XTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogc3RvcmVzIGEgYnVuY2ggb2YgUE8yIHRleHR1cmVzIHVzZWQgZm9yIGZpbHRlcmluZ1xuICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRleHR1cmVQb29sID0gbmV3IFJlbmRlclRleHR1cmVQb29sKCk7XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlUG9vbC5zZXRTY3JlZW5TaXplKHJlbmRlcmVyLnZpZXcpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHBvb2wgZm9yIHN0b3JpbmcgZmlsdGVyIHN0YXRlcywgc2F2ZSB1cyBjcmVhdGluZyBuZXcgb25lcyBlYWNoIHRpY2tcbiAgICAgICAgICogQG1lbWJlciB7T2JqZWN0W119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXRlUG9vbCA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHZlcnkgc2ltcGxlIGdlb21ldHJ5IHVzZWQgd2hlbiBkcmF3aW5nIGEgZmlsdGVyIGVmZmVjdCB0byB0aGUgc2NyZWVuXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUXVhZH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucXVhZCA9IG5ldyBRdWFkKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1YWQgVVZzXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUXVhZFV2fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5xdWFkVXYgPSBuZXcgUXVhZFV2KCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRlbXBvcmFyeSByZWN0IGZvciBtYXRoc1xuICAgICAgICAgKiBAdHlwZSB7UElYSS5SZWN0YW5nbGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRlbXBSZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBY3RpdmUgc3RhdGVcbiAgICAgICAgICogQG1lbWJlciB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY3RpdmVTdGF0ZSA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHVuaWZvcm0gZ3JvdXAgaXMgYXR0YWNoZWQgdG8gZmlsdGVyIHVuaWZvcm1zIHdoZW4gdXNlZFxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlVuaWZvcm1Hcm91cH1cbiAgICAgICAgICogQHByb3BlcnR5IHtQSVhJLlJlY3RhbmdsZX0gb3V0cHV0RnJhbWVcbiAgICAgICAgICogQHByb3BlcnR5IHtGbG9hdDMyQXJyYXl9IGlucHV0U2l6ZVxuICAgICAgICAgKiBAcHJvcGVydHkge0Zsb2F0MzJBcnJheX0gaW5wdXRQaXhlbFxuICAgICAgICAgKiBAcHJvcGVydHkge0Zsb2F0MzJBcnJheX0gaW5wdXRDbGFtcFxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcmVzb2x1dGlvblxuICAgICAgICAgKiBAcHJvcGVydHkge0Zsb2F0MzJBcnJheX0gZmlsdGVyQXJlYVxuICAgICAgICAgKiBAcHJvcGVydHkge0Zsb2FkMzJBcnJheX0gZmlsdGVyQ2xhbXBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2xvYmFsVW5pZm9ybXMgPSBuZXcgVW5pZm9ybUdyb3VwKHtcbiAgICAgICAgICAgIG91dHB1dEZyYW1lOiB0aGlzLnRlbXBSZWN0LFxuICAgICAgICAgICAgaW5wdXRTaXplOiBuZXcgRmxvYXQzMkFycmF5KDQpLFxuICAgICAgICAgICAgaW5wdXRQaXhlbDogbmV3IEZsb2F0MzJBcnJheSg0KSxcbiAgICAgICAgICAgIGlucHV0Q2xhbXA6IG5ldyBGbG9hdDMyQXJyYXkoNCksXG4gICAgICAgICAgICByZXNvbHV0aW9uOiAxLFxuXG4gICAgICAgICAgICAvLyBsZWdhY3kgdmFyaWFibGVzXG4gICAgICAgICAgICBmaWx0ZXJBcmVhOiBuZXcgRmxvYXQzMkFycmF5KDQpLFxuICAgICAgICAgICAgZmlsdGVyQ2xhbXA6IG5ldyBGbG9hdDMyQXJyYXkoNCksXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRvIGNsZWFyIG91dHB1dCByZW5kZXJUZXh0dXJlIGluIEFVVE8vQkxJVCBtb2RlLiBTZWUge0BsaW5rIFBJWEkuQ0xFQVJfTU9ERVN9XG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZvcmNlQ2xlYXIgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogT2xkIHBhZGRpbmcgYmVoYXZpb3IgaXMgdG8gdXNlIHRoZSBtYXggYW1vdW50IGluc3RlYWQgb2Ygc3VtIHBhZGRpbmcuXG4gICAgICAgICAqIFVzZSB0aGlzIGZsYWcgaWYgeW91IG5lZWQgdGhlIG9sZCBiZWhhdmlvci5cbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXNlTWF4UGFkZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgRmlsdGVyU3lzdGVtLl9fcHJvdG9fXyA9IFN5c3RlbTtcbiAgICBGaWx0ZXJTeXN0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU3lzdGVtICYmIFN5c3RlbS5wcm90b3R5cGUgKTtcbiAgICBGaWx0ZXJTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmlsdGVyU3lzdGVtO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBmaWx0ZXIgdG8gdGhlIFN5c3RlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9mIHRoZSBmaWx0ZXIgdG8gcmVuZGVyLlxuICAgICAqIEBwYXJhbSB7UElYSS5GaWx0ZXJbXX0gZmlsdGVycyAtIFRoZSBmaWx0ZXJzIHRvIGFwcGx5LlxuICAgICAqL1xuICAgIEZpbHRlclN5c3RlbS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKHRhcmdldCwgZmlsdGVycylcbiAgICB7XG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciBmaWx0ZXJTdGFjayA9IHRoaXMuZGVmYXVsdEZpbHRlclN0YWNrO1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlUG9vbC5wb3AoKSB8fCBuZXcgRmlsdGVyU3RhdGUoKTtcblxuICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IGZpbHRlcnNbMF0ucmVzb2x1dGlvbjtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBmaWx0ZXJzWzBdLnBhZGRpbmc7XG4gICAgICAgIHZhciBhdXRvRml0ID0gZmlsdGVyc1swXS5hdXRvRml0O1xuICAgICAgICB2YXIgbGVnYWN5ID0gZmlsdGVyc1swXS5sZWdhY3k7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gIGZpbHRlcnNbaV07XG5cbiAgICAgICAgICAgIC8vIGxldHMgdXNlIHRoZSBsb3dlc3QgcmVzb2x1dGlvbi4uXG4gICAgICAgICAgICByZXNvbHV0aW9uID0gTWF0aC5taW4ocmVzb2x1dGlvbiwgZmlsdGVyLnJlc29sdXRpb24pO1xuICAgICAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgcGFkZGluZyByZXF1aXJlZCBmb3IgZmlsdGVyc1xuICAgICAgICAgICAgcGFkZGluZyA9IHRoaXMudXNlTWF4UGFkZGluZ1xuICAgICAgICAgICAgICAgIC8vIG9sZCBiZWhhdmlvcjogdXNlIGxhcmdlc3QgYW1vdW50IG9mIHBhZGRpbmchXG4gICAgICAgICAgICAgICAgPyBNYXRoLm1heChwYWRkaW5nLCBmaWx0ZXIucGFkZGluZylcbiAgICAgICAgICAgICAgICAvLyBuZXcgYmVoYXZpb3I6IHN1bSB0aGUgcGFkZGluZ1xuICAgICAgICAgICAgICAgIDogcGFkZGluZyArIGZpbHRlci5wYWRkaW5nO1xuICAgICAgICAgICAgLy8gb25seSBhdXRvIGZpdCBpZiBhbGwgZmlsdGVycyBhcmUgYXV0b2ZpdFxuICAgICAgICAgICAgYXV0b0ZpdCA9IGF1dG9GaXQgfHwgZmlsdGVyLmF1dG9GaXQ7XG5cbiAgICAgICAgICAgIGxlZ2FjeSA9IGxlZ2FjeSB8fCBmaWx0ZXIubGVnYWN5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlclN0YWNrLmxlbmd0aCA9PT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVyU3RhY2tbMF0ucmVuZGVyVGV4dHVyZSA9IHJlbmRlcmVyLnJlbmRlclRleHR1cmUuY3VycmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbHRlclN0YWNrLnB1c2goc3RhdGUpO1xuXG4gICAgICAgIHN0YXRlLnJlc29sdXRpb24gPSByZXNvbHV0aW9uO1xuXG4gICAgICAgIHN0YXRlLmxlZ2FjeSA9IGxlZ2FjeTtcblxuICAgICAgICBzdGF0ZS50YXJnZXQgPSB0YXJnZXQ7XG5cbiAgICAgICAgc3RhdGUuc291cmNlRnJhbWUuY29weUZyb20odGFyZ2V0LmZpbHRlckFyZWEgfHwgdGFyZ2V0LmdldEJvdW5kcyh0cnVlKSk7XG5cbiAgICAgICAgc3RhdGUuc291cmNlRnJhbWUucGFkKHBhZGRpbmcpO1xuICAgICAgICBpZiAoYXV0b0ZpdClcbiAgICAgICAge1xuICAgICAgICAgICAgc3RhdGUuc291cmNlRnJhbWUuZml0KHRoaXMucmVuZGVyZXIucmVuZGVyVGV4dHVyZS5zb3VyY2VGcmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb3VuZCB0byB3aG9sZSBudW1iZXIgYmFzZWQgb24gcmVzb2x1dGlvblxuICAgICAgICBzdGF0ZS5zb3VyY2VGcmFtZS5jZWlsKHJlc29sdXRpb24pO1xuXG4gICAgICAgIHN0YXRlLnJlbmRlclRleHR1cmUgPSB0aGlzLmdldE9wdGltYWxGaWx0ZXJUZXh0dXJlKHN0YXRlLnNvdXJjZUZyYW1lLndpZHRoLCBzdGF0ZS5zb3VyY2VGcmFtZS5oZWlnaHQsIHJlc29sdXRpb24pO1xuICAgICAgICBzdGF0ZS5maWx0ZXJzID0gZmlsdGVycztcblxuICAgICAgICBzdGF0ZS5kZXN0aW5hdGlvbkZyYW1lLndpZHRoID0gc3RhdGUucmVuZGVyVGV4dHVyZS53aWR0aDtcbiAgICAgICAgc3RhdGUuZGVzdGluYXRpb25GcmFtZS5oZWlnaHQgPSBzdGF0ZS5yZW5kZXJUZXh0dXJlLmhlaWdodDtcblxuICAgICAgICBzdGF0ZS5yZW5kZXJUZXh0dXJlLmZpbHRlckZyYW1lID0gc3RhdGUuc291cmNlRnJhbWU7XG5cbiAgICAgICAgcmVuZGVyZXIucmVuZGVyVGV4dHVyZS5iaW5kKHN0YXRlLnJlbmRlclRleHR1cmUsIHN0YXRlLnNvdXJjZUZyYW1lKTsvLyAvLCBzdGF0ZS5kZXN0aW5hdGlvbkZyYW1lKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyVGV4dHVyZS5jbGVhcigpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQb3BzIG9mZiB0aGUgZmlsdGVyIGFuZCBhcHBsaWVzIGl0LlxuICAgICAqXG4gICAgICovXG4gICAgRmlsdGVyU3lzdGVtLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiBwb3AgKClcbiAgICB7XG4gICAgICAgIHZhciBmaWx0ZXJTdGFjayA9IHRoaXMuZGVmYXVsdEZpbHRlclN0YWNrO1xuICAgICAgICB2YXIgc3RhdGUgPSBmaWx0ZXJTdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIGZpbHRlcnMgPSBzdGF0ZS5maWx0ZXJzO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlU3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICB2YXIgZ2xvYmFsVW5pZm9ybXMgPSB0aGlzLmdsb2JhbFVuaWZvcm1zLnVuaWZvcm1zO1xuXG4gICAgICAgIGdsb2JhbFVuaWZvcm1zLm91dHB1dEZyYW1lID0gc3RhdGUuc291cmNlRnJhbWU7XG4gICAgICAgIGdsb2JhbFVuaWZvcm1zLnJlc29sdXRpb24gPSBzdGF0ZS5yZXNvbHV0aW9uO1xuXG4gICAgICAgIHZhciBpbnB1dFNpemUgPSBnbG9iYWxVbmlmb3Jtcy5pbnB1dFNpemU7XG4gICAgICAgIHZhciBpbnB1dFBpeGVsID0gZ2xvYmFsVW5pZm9ybXMuaW5wdXRQaXhlbDtcbiAgICAgICAgdmFyIGlucHV0Q2xhbXAgPSBnbG9iYWxVbmlmb3Jtcy5pbnB1dENsYW1wO1xuXG4gICAgICAgIGlucHV0U2l6ZVswXSA9IHN0YXRlLmRlc3RpbmF0aW9uRnJhbWUud2lkdGg7XG4gICAgICAgIGlucHV0U2l6ZVsxXSA9IHN0YXRlLmRlc3RpbmF0aW9uRnJhbWUuaGVpZ2h0O1xuICAgICAgICBpbnB1dFNpemVbMl0gPSAxLjAgLyBpbnB1dFNpemVbMF07XG4gICAgICAgIGlucHV0U2l6ZVszXSA9IDEuMCAvIGlucHV0U2l6ZVsxXTtcblxuICAgICAgICBpbnB1dFBpeGVsWzBdID0gaW5wdXRTaXplWzBdICogc3RhdGUucmVzb2x1dGlvbjtcbiAgICAgICAgaW5wdXRQaXhlbFsxXSA9IGlucHV0U2l6ZVsxXSAqIHN0YXRlLnJlc29sdXRpb247XG4gICAgICAgIGlucHV0UGl4ZWxbMl0gPSAxLjAgLyBpbnB1dFBpeGVsWzBdO1xuICAgICAgICBpbnB1dFBpeGVsWzNdID0gMS4wIC8gaW5wdXRQaXhlbFsxXTtcblxuICAgICAgICBpbnB1dENsYW1wWzBdID0gMC41ICogaW5wdXRQaXhlbFsyXTtcbiAgICAgICAgaW5wdXRDbGFtcFsxXSA9IDAuNSAqIGlucHV0UGl4ZWxbM107XG4gICAgICAgIGlucHV0Q2xhbXBbMl0gPSAoc3RhdGUuc291cmNlRnJhbWUud2lkdGggKiBpbnB1dFNpemVbMl0pIC0gKDAuNSAqIGlucHV0UGl4ZWxbMl0pO1xuICAgICAgICBpbnB1dENsYW1wWzNdID0gKHN0YXRlLnNvdXJjZUZyYW1lLmhlaWdodCAqIGlucHV0U2l6ZVszXSkgLSAoMC41ICogaW5wdXRQaXhlbFszXSk7XG5cbiAgICAgICAgLy8gb25seSB1cGRhdGUgdGhlIHJlY3QgaWYgaXRzIGxlZ2FjeS4uXG4gICAgICAgIGlmIChzdGF0ZS5sZWdhY3kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJBcmVhID0gZ2xvYmFsVW5pZm9ybXMuZmlsdGVyQXJlYTtcblxuICAgICAgICAgICAgZmlsdGVyQXJlYVswXSA9IHN0YXRlLmRlc3RpbmF0aW9uRnJhbWUud2lkdGg7XG4gICAgICAgICAgICBmaWx0ZXJBcmVhWzFdID0gc3RhdGUuZGVzdGluYXRpb25GcmFtZS5oZWlnaHQ7XG4gICAgICAgICAgICBmaWx0ZXJBcmVhWzJdID0gc3RhdGUuc291cmNlRnJhbWUueDtcbiAgICAgICAgICAgIGZpbHRlckFyZWFbM10gPSBzdGF0ZS5zb3VyY2VGcmFtZS55O1xuXG4gICAgICAgICAgICBnbG9iYWxVbmlmb3Jtcy5maWx0ZXJDbGFtcCA9IGdsb2JhbFVuaWZvcm1zLmlucHV0Q2xhbXA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsb2JhbFVuaWZvcm1zLnVwZGF0ZSgpO1xuXG4gICAgICAgIHZhciBsYXN0U3RhdGUgPSBmaWx0ZXJTdGFja1tmaWx0ZXJTdGFjay5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZpbHRlcnNbMF0uYXBwbHkodGhpcywgc3RhdGUucmVuZGVyVGV4dHVyZSwgbGFzdFN0YXRlLnJlbmRlclRleHR1cmUsIGZhbHNlLCBzdGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMucmV0dXJuRmlsdGVyVGV4dHVyZShzdGF0ZS5yZW5kZXJUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBmbGlwID0gc3RhdGUucmVuZGVyVGV4dHVyZTtcbiAgICAgICAgICAgIHZhciBmbG9wID0gdGhpcy5nZXRPcHRpbWFsRmlsdGVyVGV4dHVyZShcbiAgICAgICAgICAgICAgICBmbGlwLndpZHRoLFxuICAgICAgICAgICAgICAgIGZsaXAuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHN0YXRlLnJlc29sdXRpb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZsb3AuZmlsdGVyRnJhbWUgPSBmbGlwLmZpbHRlckZyYW1lO1xuXG4gICAgICAgICAgICB2YXIgaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aCAtIDE7ICsraSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzW2ldLmFwcGx5KHRoaXMsIGZsaXAsIGZsb3AsIHRydWUsIHN0YXRlKTtcblxuICAgICAgICAgICAgICAgIHZhciB0ID0gZmxpcDtcblxuICAgICAgICAgICAgICAgIGZsaXAgPSBmbG9wO1xuICAgICAgICAgICAgICAgIGZsb3AgPSB0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWx0ZXJzW2ldLmFwcGx5KHRoaXMsIGZsaXAsIGxhc3RTdGF0ZS5yZW5kZXJUZXh0dXJlLCBmYWxzZSwgc3RhdGUpO1xuXG4gICAgICAgICAgICB0aGlzLnJldHVybkZpbHRlclRleHR1cmUoZmxpcCk7XG4gICAgICAgICAgICB0aGlzLnJldHVybkZpbHRlclRleHR1cmUoZmxvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5jbGVhcigpO1xuICAgICAgICB0aGlzLnN0YXRlUG9vbC5wdXNoKHN0YXRlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYSBmaWx0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRmlsdGVyfSBmaWx0ZXIgLSBUaGUgZmlsdGVyIHRvIGRyYXcuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IGlucHV0IC0gVGhlIGlucHV0IHJlbmRlciB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IG91dHB1dCAtIFRoZSB0YXJnZXQgdG8gb3V0cHV0IHRvLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xlYXIgLSBTaG91bGQgdGhlIG91dHB1dCBiZSBjbGVhcmVkIGJlZm9yZSByZW5kZXJpbmcgdG8gaXRcbiAgICAgKi9cbiAgICBGaWx0ZXJTeXN0ZW0ucHJvdG90eXBlLmFwcGx5RmlsdGVyID0gZnVuY3Rpb24gYXBwbHlGaWx0ZXIgKGZpbHRlciwgaW5wdXQsIG91dHB1dCwgY2xlYXIpXG4gICAge1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgICAgIHJlbmRlcmVyLnJlbmRlclRleHR1cmUuYmluZChvdXRwdXQsIG91dHB1dCA/IG91dHB1dC5maWx0ZXJGcmFtZSA6IG51bGwpO1xuXG4gICAgICAgIGlmIChjbGVhcilcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyVGV4dHVyZS5jbGVhcigpO1xuICAgICAgICAgICAgLy8gZ2wuZW5hYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdGhlIHVuaWZvcm1zLi5cbiAgICAgICAgZmlsdGVyLnVuaWZvcm1zLnVTYW1wbGVyID0gaW5wdXQ7XG4gICAgICAgIGZpbHRlci51bmlmb3Jtcy5maWx0ZXJHbG9iYWxzID0gdGhpcy5nbG9iYWxVbmlmb3JtcztcblxuICAgICAgICAvLyBUT0RPIG1ha2UgaXQgc28gdGhhdCB0aGUgb3JkZXIgb2YgdGhpcyBkb2VzIG5vdCBtYXR0ZXIuLlxuICAgICAgICAvLyBiZWNhdXNlIGl0IGRvZXMgYXQgdGhlIG1vbWVudCBjb3Mgb2YgZ2xvYmFsIHVuaWZvcm1zLlxuICAgICAgICAvLyB0aGV5IG5lZWQgdG8gZ2V0IHJlc3luY2VkXG5cbiAgICAgICAgcmVuZGVyZXIuc3RhdGUuc2V0KGZpbHRlci5zdGF0ZSk7XG4gICAgICAgIHJlbmRlcmVyLnNoYWRlci5iaW5kKGZpbHRlcik7XG5cbiAgICAgICAgaWYgKGZpbHRlci5sZWdhY3kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucXVhZFV2Lm1hcChpbnB1dC5fZnJhbWUsIGlucHV0LmZpbHRlckZyYW1lKTtcblxuICAgICAgICAgICAgcmVuZGVyZXIuZ2VvbWV0cnkuYmluZCh0aGlzLnF1YWRVdik7XG4gICAgICAgICAgICByZW5kZXJlci5nZW9tZXRyeS5kcmF3KERSQVdfTU9ERVMuVFJJQU5HTEVTKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmJpbmQodGhpcy5xdWFkKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmRyYXcoRFJBV19NT0RFUy5UUklBTkdMRV9TVFJJUCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgX2lucHV0IG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXNfIHRvIHRoaXMgbWF0cml4IHRvIGdldCBfc3ByaXRlIHRleHR1cmUgbm9ybWFsaXplZCBjb29yZGluYXRlc18uXG4gICAgICpcbiAgICAgKiBVc2UgYG91dHB1dE1hdHJpeCAqIHZUZXh0dXJlQ29vcmRgIGluIHRoZSBzaGFkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBvdXRwdXRNYXRyaXggLSBUaGUgbWF0cml4IHRvIG91dHB1dCB0by5cbiAgICAgKiBAcGFyYW0ge1BJWEkuU3ByaXRlfSBzcHJpdGUgLSBUaGUgc3ByaXRlIHRvIG1hcCB0by5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLk1hdHJpeH0gVGhlIG1hcHBlZCBtYXRyaXguXG4gICAgICovXG4gICAgRmlsdGVyU3lzdGVtLnByb3RvdHlwZS5jYWxjdWxhdGVTcHJpdGVNYXRyaXggPSBmdW5jdGlvbiBjYWxjdWxhdGVTcHJpdGVNYXRyaXggKG91dHB1dE1hdHJpeCwgc3ByaXRlKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMuYWN0aXZlU3RhdGU7XG4gICAgICAgIHZhciBzb3VyY2VGcmFtZSA9IHJlZi5zb3VyY2VGcmFtZTtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uRnJhbWUgPSByZWYuZGVzdGluYXRpb25GcmFtZTtcbiAgICAgICAgdmFyIHJlZiQxID0gc3ByaXRlLl90ZXh0dXJlO1xuICAgICAgICB2YXIgb3JpZyA9IHJlZiQxLm9yaWc7XG4gICAgICAgIHZhciBtYXBwZWRNYXRyaXggPSBvdXRwdXRNYXRyaXguc2V0KGRlc3RpbmF0aW9uRnJhbWUud2lkdGgsIDAsIDAsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkZyYW1lLmhlaWdodCwgc291cmNlRnJhbWUueCwgc291cmNlRnJhbWUueSk7XG4gICAgICAgIHZhciB3b3JsZFRyYW5zZm9ybSA9IHNwcml0ZS53b3JsZFRyYW5zZm9ybS5jb3B5VG8oTWF0cml4LlRFTVBfTUFUUklYKTtcblxuICAgICAgICB3b3JsZFRyYW5zZm9ybS5pbnZlcnQoKTtcbiAgICAgICAgbWFwcGVkTWF0cml4LnByZXBlbmQod29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICBtYXBwZWRNYXRyaXguc2NhbGUoMS4wIC8gb3JpZy53aWR0aCwgMS4wIC8gb3JpZy5oZWlnaHQpO1xuICAgICAgICBtYXBwZWRNYXRyaXgudHJhbnNsYXRlKHNwcml0ZS5hbmNob3IueCwgc3ByaXRlLmFuY2hvci55KTtcblxuICAgICAgICByZXR1cm4gbWFwcGVkTWF0cml4O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGlzIEZpbHRlciBTeXN0ZW0uXG4gICAgICovXG4gICAgRmlsdGVyU3lzdGVtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgLy8gVGhvc2UgdGV4dHVyZXMgaGFzIHRvIGJlIGRlc3Ryb3llZCBieSBSZW5kZXJUZXh0dXJlU3lzdGVtIG9yIEZyYW1lYnVmZmVyU3lzdGVtXG4gICAgICAgIHRoaXMudGV4dHVyZVBvb2wuY2xlYXIoZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgUG93ZXItb2YtVHdvIHJlbmRlciB0ZXh0dXJlIG9yIGZ1bGxTY3JlZW4gdGV4dHVyZVxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5XaWR0aCAtIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoZSByZW5kZXIgdGV4dHVyZSBpbiByZWFsIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluSGVpZ2h0IC0gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGV4dHVyZSBpbiByZWFsIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Jlc29sdXRpb249MV0gLSBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRleHR1cmUuXG4gICAgICogQHJldHVybiB7UElYSS5SZW5kZXJUZXh0dXJlfSBUaGUgbmV3IHJlbmRlciB0ZXh0dXJlLlxuICAgICAqL1xuICAgIEZpbHRlclN5c3RlbS5wcm90b3R5cGUuZ2V0T3B0aW1hbEZpbHRlclRleHR1cmUgPSBmdW5jdGlvbiBnZXRPcHRpbWFsRmlsdGVyVGV4dHVyZSAobWluV2lkdGgsIG1pbkhlaWdodCwgcmVzb2x1dGlvbilcbiAgICB7XG4gICAgICAgIGlmICggcmVzb2x1dGlvbiA9PT0gdm9pZCAwICkgcmVzb2x1dGlvbiA9IDE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZVBvb2wuZ2V0T3B0aW1hbFRleHR1cmUobWluV2lkdGgsIG1pbkhlaWdodCwgcmVzb2x1dGlvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgZXh0cmEgcmVuZGVyIHRleHR1cmUgdG8gdXNlIGluc2lkZSBjdXJyZW50IGZpbHRlclxuICAgICAqIFRvIGJlIGNvbXBsaWFudCB3aXRoIG9sZGVyIGZpbHRlcnMsIHlvdSBjYW4gdXNlIHBhcmFtcyBpbiBhbnkgb3JkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJUZXh0dXJlfSBbaW5wdXRdIHJlbmRlclRleHR1cmUgZnJvbSB3aGljaCBzaXplIGFuZCByZXNvbHV0aW9uIHdpbGwgYmUgY29waWVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyZXNvbHV0aW9uXSBvdmVycmlkZSByZXNvbHV0aW9uIG9mIHRoZSByZW5kZXJUZXh0dXJlXG4gICAgICogQHJldHVybnMge1BJWEkuUmVuZGVyVGV4dHVyZX1cbiAgICAgKi9cbiAgICBGaWx0ZXJTeXN0ZW0ucHJvdG90eXBlLmdldEZpbHRlclRleHR1cmUgPSBmdW5jdGlvbiBnZXRGaWx0ZXJUZXh0dXJlIChpbnB1dCwgcmVzb2x1dGlvbilcbiAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc3dhcCA9IGlucHV0O1xuXG4gICAgICAgICAgICBpbnB1dCA9IHJlc29sdXRpb247XG4gICAgICAgICAgICByZXNvbHV0aW9uID0gc3dhcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gaW5wdXQgfHwgdGhpcy5hY3RpdmVTdGF0ZS5yZW5kZXJUZXh0dXJlO1xuXG4gICAgICAgIHZhciBmaWx0ZXJUZXh0dXJlID0gdGhpcy50ZXh0dXJlUG9vbC5nZXRPcHRpbWFsVGV4dHVyZShpbnB1dC53aWR0aCwgaW5wdXQuaGVpZ2h0LCByZXNvbHV0aW9uIHx8IGlucHV0LnJlc29sdXRpb24pO1xuXG4gICAgICAgIGZpbHRlclRleHR1cmUuZmlsdGVyRnJhbWUgPSBpbnB1dC5maWx0ZXJGcmFtZTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyVGV4dHVyZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRnJlZXMgYSByZW5kZXIgdGV4dHVyZSBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gcmVuZGVyVGV4dHVyZSAtIFRoZSByZW5kZXJUYXJnZXQgdG8gZnJlZVxuICAgICAqL1xuICAgIEZpbHRlclN5c3RlbS5wcm90b3R5cGUucmV0dXJuRmlsdGVyVGV4dHVyZSA9IGZ1bmN0aW9uIHJldHVybkZpbHRlclRleHR1cmUgKHJlbmRlclRleHR1cmUpXG4gICAge1xuICAgICAgICB0aGlzLnRleHR1cmVQb29sLnJldHVyblRleHR1cmUocmVuZGVyVGV4dHVyZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtcHRpZXMgdGhlIHRleHR1cmUgcG9vbC5cbiAgICAgKi9cbiAgICBGaWx0ZXJTeXN0ZW0ucHJvdG90eXBlLmVtcHR5UG9vbCA9IGZ1bmN0aW9uIGVtcHR5UG9vbCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlUG9vbC5jbGVhcih0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogY2FsbHMgYHRleHR1cmVQb29sLnJlc2l6ZSgpYCwgYWZmZWN0cyBmdWxsU2NyZWVuIHJlbmRlclRleHR1cmVzXG4gICAgICovXG4gICAgRmlsdGVyU3lzdGVtLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiByZXNpemUgKClcbiAgICB7XG4gICAgICAgIHRoaXMudGV4dHVyZVBvb2wuc2V0U2NyZWVuU2l6ZSh0aGlzLnJlbmRlcmVyLnZpZXcpO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmlsdGVyU3lzdGVtO1xufShTeXN0ZW0pKTtcblxuLyoqXG4gKiBCYXNlIGZvciBhIGNvbW1vbiBvYmplY3QgcmVuZGVyZXIgdGhhdCBjYW4gYmUgdXNlZCBhcyBhXG4gKiBzeXN0ZW0gcmVuZGVyZXIgcGx1Z2luLlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5TeXN0ZW1cbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBPYmplY3RSZW5kZXJlciA9IGZ1bmN0aW9uIE9iamVjdFJlbmRlcmVyKHJlbmRlcmVyKVxue1xuICAgIC8qKlxuICAgICAqIFRoZSByZW5kZXJlciB0aGlzIG1hbmFnZXIgd29ya3MgZm9yLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5SZW5kZXJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG59O1xuXG4vKipcbiAqIFN0dWIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW1wdHkgdGhlIGN1cnJlbnRcbiAqIGJhdGNoIGJ5IHJlbmRlcmluZyBvYmplY3RzIG5vdy5cbiAqL1xuT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gZmx1c2ggKClcbntcbiAgICAvLyBmbHVzaCFcbn07XG5cbi8qKlxuICogR2VuZXJpYyBkZXN0cnVjdGlvbiBtZXRob2QgdGhhdCBmcmVlcyBhbGwgcmVzb3VyY2VzLiBUaGlzXG4gKiBzaG91bGQgYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMuXG4gKi9cbk9iamVjdFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxue1xuICAgIHRoaXMucmVuZGVyZXIgPSBudWxsO1xufTtcblxuLyoqXG4gKiBTdHViIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGFueSBzdGF0ZSByZXF1aXJlZCBiZWZvcmVcbiAqIHJlbmRlcmluZyBzdGFydHMuIEl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBgcHJlcmVuZGVyYFxuICogc2lnbmFsLCB3aGljaCBvY2N1cnMgZXZlcnkgZnJhbWUsIGluIHRoYXQgaXQgaXMgY2FsbGVkXG4gKiB3aGVuZXZlciBhbiBvYmplY3QgcmVxdWVzdHMgX3RoaXNfIHJlbmRlcmVyIHNwZWNpZmljYWxseS5cbiAqL1xuT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gc3RhcnQgKClcbntcbiAgICAvLyBzZXQgdGhlIHNoYWRlci4uXG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSByZW5kZXJlci4gSXQgc2hvdWxkIGZyZWUgdXAgYW55IHN0YXRlIGFuZFxuICogYmVjb21lIGRvcm1hbnQuXG4gKi9cbk9iamVjdFJlbmRlcmVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gc3RvcCAoKVxue1xuICAgIHRoaXMuZmx1c2goKTtcbn07XG5cbi8qKlxuICogS2VlcHMgdGhlIG9iamVjdCB0byByZW5kZXIuIEl0IGRvZXNuJ3QgaGF2ZSB0byBiZVxuICogcmVuZGVyZWQgaW1tZWRpYXRlbHkuXG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gcmVuZGVyLlxuICovXG5PYmplY3RSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChvYmplY3QpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbntcbiAgICAvLyByZW5kZXIgdGhlIG9iamVjdFxufTtcblxuLyoqXG4gKiBTeXN0ZW0gcGx1Z2luIHRvIHRoZSByZW5kZXJlciB0byBtYW5hZ2UgYmF0Y2hpbmcuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlN5c3RlbVxuICogQG1lbWJlcm9mIFBJWEkuc3lzdGVtc1xuICovXG52YXIgQmF0Y2hTeXN0ZW0gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTeXN0ZW0pIHtcbiAgICBmdW5jdGlvbiBCYXRjaFN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZW1wdHkgcmVuZGVyZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuT2JqZWN0UmVuZGVyZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVtcHR5UmVuZGVyZXIgPSBuZXcgT2JqZWN0UmVuZGVyZXIocmVuZGVyZXIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBPYmplY3RSZW5kZXJlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5PYmplY3RSZW5kZXJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudFJlbmRlcmVyID0gdGhpcy5lbXB0eVJlbmRlcmVyO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgQmF0Y2hTeXN0ZW0uX19wcm90b19fID0gU3lzdGVtO1xuICAgIEJhdGNoU3lzdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFN5c3RlbSAmJiBTeXN0ZW0ucHJvdG90eXBlICk7XG4gICAgQmF0Y2hTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmF0Y2hTeXN0ZW07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IHJlbmRlcmVyIHRvIHRoZSBvbmUgZ2l2ZW4gaW4gcGFyYW1ldGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuT2JqZWN0UmVuZGVyZXJ9IG9iamVjdFJlbmRlcmVyIC0gVGhlIG9iamVjdCByZW5kZXJlciB0byB1c2UuXG4gICAgICovXG4gICAgQmF0Y2hTeXN0ZW0ucHJvdG90eXBlLnNldE9iamVjdFJlbmRlcmVyID0gZnVuY3Rpb24gc2V0T2JqZWN0UmVuZGVyZXIgKG9iamVjdFJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlbmRlcmVyID09PSBvYmplY3RSZW5kZXJlcilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50UmVuZGVyZXIuc3RvcCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRSZW5kZXJlciA9IG9iamVjdFJlbmRlcmVyO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJlbmRlcmVyLnN0YXJ0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpZiB5b3Ugd2lzaCB0byBkbyBzb21lIGN1c3RvbSByZW5kZXJpbmdcbiAgICAgKiBJdCB3aWxsIGJhc2ljYWxseSByZW5kZXIgYW55dGhpbmcgdGhhdCBtYXkgYmUgYmF0Y2hlZCB1cCBzdWNoIGFzIHNwcml0ZXNcbiAgICAgKi9cbiAgICBCYXRjaFN5c3RlbS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiBmbHVzaCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5zZXRPYmplY3RSZW5kZXJlcih0aGlzLmVtcHR5UmVuZGVyZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgc3lzdGVtIHRvIGFuIGVtcHR5IHJlbmRlcmVyXG4gICAgICovXG4gICAgQmF0Y2hTeXN0ZW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbiAgICB7XG4gICAgICAgIHRoaXMuc2V0T2JqZWN0UmVuZGVyZXIodGhpcy5lbXB0eVJlbmRlcmVyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZHkgZnVuY3Rpb24gZm9yIGJhdGNoIHJlbmRlcmVyczogY29waWVzIGJvdW5kIHRleHR1cmVzIGluIGZpcnN0IG1heFRleHR1cmVzIGxvY2F0aW9ucyB0byBhcnJheVxuICAgICAqIHNldHMgYWN0dWFsIF9iYXRjaExvY2F0aW9uIGZvciB0aGVtXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXJyXG4gICAgICogQHBhcmFtIG1heFRleHR1cmVzXG4gICAgICovXG4gICAgQmF0Y2hTeXN0ZW0ucHJvdG90eXBlLmNvcHlCb3VuZFRleHR1cmVzID0gZnVuY3Rpb24gY29weUJvdW5kVGV4dHVyZXMgKGFyciwgbWF4VGV4dHVyZXMpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5yZW5kZXJlci50ZXh0dXJlO1xuICAgICAgICB2YXIgYm91bmRUZXh0dXJlcyA9IHJlZi5ib3VuZFRleHR1cmVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBtYXhUZXh0dXJlcyAtIDE7IGkgPj0gMDsgLS1pKVxuICAgICAgICB7XG4gICAgICAgICAgICBhcnJbaV0gPSBib3VuZFRleHR1cmVzW2ldIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAoYXJyW2ldKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFycltpXS5fYmF0Y2hMb2NhdGlvbiA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBiYXRjaCBsb2NhdGlvbnMgdG8gdGV4dHVyZXMgaW4gYXJyYXkgYmFzZWQgb24gYm91bmRUZXh0dXJlcyBzdGF0ZS5cbiAgICAgKiBBbGwgdGV4dHVyZXMgaW4gdGV4QXJyYXkgc2hvdWxkIGhhdmUgYF9iYXRjaEVuYWJsZWQgPSBfYmF0Y2hJZGAsXG4gICAgICogYW5kIHRoZWlyIGNvdW50IHNob3VsZCBiZSBsZXNzIHRoYW4gYG1heFRleHR1cmVzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5CYXRjaFRleHR1cmVBcnJheX0gdGV4QXJyYXkgdGV4dHVyZXMgdG8gYm91bmRcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmVbXX0gYm91bmRUZXh0dXJlcyBjdXJyZW50IHN0YXRlIG9mIGJvdW5kIHRleHR1cmVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJhdGNoSWQgbWFya2VyIGZvciBfYmF0Y2hFbmFibGVkIHBhcmFtIG9mIHRleHR1cmVzIGluIHRleEFycmF5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heFRleHR1cmVzIG51bWJlciBvZiB0ZXh0dXJlIGxvY2F0aW9ucyB0byBtYW5pcHVsYXRlXG4gICAgICovXG4gICAgQmF0Y2hTeXN0ZW0ucHJvdG90eXBlLmJvdW5kQXJyYXkgPSBmdW5jdGlvbiBib3VuZEFycmF5ICh0ZXhBcnJheSwgYm91bmRUZXh0dXJlcywgYmF0Y2hJZCwgbWF4VGV4dHVyZXMpXG4gICAge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0ZXhBcnJheS5lbGVtZW50cztcbiAgICAgICAgdmFyIGlkcyA9IHRleEFycmF5LmlkcztcbiAgICAgICAgdmFyIGNvdW50ID0gdGV4QXJyYXkuY291bnQ7XG4gICAgICAgIHZhciBqID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0ZXggPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgIHZhciBsb2MgPSB0ZXguX2JhdGNoTG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2MgPj0gMCAmJiBsb2MgPCBtYXhUZXh0dXJlc1xuICAgICAgICAgICAgICAgICYmIGJvdW5kVGV4dHVyZXNbbG9jXSA9PT0gdGV4KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkc1tpXSA9IGxvYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGogPCBtYXhUZXh0dXJlcylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmQgPSBib3VuZFRleHR1cmVzW2pdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kICYmIGJvdW5kLl9iYXRjaEVuYWJsZWQgPT09IGJhdGNoSWRcbiAgICAgICAgICAgICAgICAgICAgJiYgYm91bmQuX2JhdGNoTG9jYXRpb24gPT09IGopXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBqKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlkc1tpXSA9IGo7XG4gICAgICAgICAgICAgICAgdGV4Ll9iYXRjaExvY2F0aW9uID0gajtcbiAgICAgICAgICAgICAgICBib3VuZFRleHR1cmVzW2pdID0gdGV4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBCYXRjaFN5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbi8qKlxuICogVGhlIG1heGltdW0gc3VwcG9ydCBmb3IgdXNpbmcgV2ViR0wuIElmIGEgZGV2aWNlIGRvZXMgbm90XG4gKiBzdXBwb3J0IFdlYkdMIHZlcnNpb24sIGZvciBpbnN0YW5jZSBXZWJHTCAyLCBpdCB3aWxsIHN0aWxsXG4gKiBhdHRlbXB0IHRvIGZhbGxiYWNrIHN1cHBvcnQgdG8gV2ViR0wgMS4gSWYgeW91IHdhbnQgdG9cbiAqIGV4cGxpY2l0bHkgcmVtb3ZlIGZlYXR1cmUgc3VwcG9ydCB0byB0YXJnZXQgYSBtb3JlIHN0YWJsZVxuICogYmFzZWxpbmUsIHByZWZlciBhIGxvd2VyIGVudmlyb25tZW50LlxuICpcbiAqIER1ZSB0byB7QGxpbmsgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTM0ODIzfGJ1ZyBpbiBjaHJvbWl1bX1cbiAqIHdlIGRpc2FibGUgd2ViZ2wyIGJ5IGRlZmF1bHQgZm9yIGFsbCBub24tYXBwbGUgbW9iaWxlIGRldmljZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG5hbWUgUFJFRkVSX0VOVlxuICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZGVmYXVsdCBQSVhJLkVOVi5XRUJHTDJcbiAqL1xuc2V0dGluZ3MuUFJFRkVSX0VOViA9IGlzTW9iaWxlLmFueSA/IEVOVi5XRUJHTCA6IEVOVi5XRUJHTDI7XG5cbi8qKlxuICogSWYgc2V0IHRvIGB0cnVlYCwgVGV4dHVyZXMgYW5kIEJhc2VUZXh0dXJlIG9iamVjdHMgc3RvcmVkXG4gKiBpbiB0aGUgY2FjaGVzICh7QGxpbmsgUElYSS51dGlscy5UZXh0dXJlQ2FjaGUgVGV4dHVyZUNhY2hlfSBhbmRcbiAqIHtAbGluayBQSVhJLnV0aWxzLkJhc2VUZXh0dXJlQ2FjaGUgQmFzZVRleHR1cmVDYWNoZX0pIGNhbiAqb25seSogYmVcbiAqIHVzZWQgd2hlbiBjYWxsaW5nIHtAbGluayBQSVhJLlRleHR1cmUuZnJvbSBUZXh0dXJlLmZyb219IG9yXG4gKiB7QGxpbmsgUElYSS5CYXNlVGV4dHVyZS5mcm9tIEJhc2VUZXh0dXJlLmZyb219LlxuICogT3RoZXJ3aXNlLCB0aGVzZSBgZnJvbWAgY2FsbHMgdGhyb3cgYW4gZXhjZXB0aW9uLiBVc2luZyB0aGlzIHByb3BlcnR5XG4gKiBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGVuZm9yY2UgcHJlbG9hZGluZyBhbGwgYXNzZXRzIHdpdGhcbiAqIHtAbGluayBQSVhJLkxvYWRlciBMb2FkZXJ9LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBuYW1lIFNUUklDVF9URVhUVVJFX0NBQ0hFXG4gKiBAbWVtYmVyb2YgUElYSS5zZXR0aW5nc1xuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5zZXR0aW5ncy5TVFJJQ1RfVEVYVFVSRV9DQUNIRSA9IGZhbHNlO1xuXG52YXIgQ09OVEVYVF9VSUQgPSAwO1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSB0aGUgY29udGV4dC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBDb250ZXh0U3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gQ29udGV4dFN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRWl0aGVyIDEgb3IgMiB0byByZWZsZWN0IHRoZSBXZWJHTCB2ZXJzaW9uIGJlaW5nIHVzZWRcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2ViR0xWZXJzaW9uID0gMTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0ZW5zaW9ucyBiZWluZyB1c2VkXG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7V0VCR0xfZHJhd19idWZmZXJzfSBkcmF3QnVmZmVycyAtIFdlYkdMIHYxIGV4dGVuc2lvblxuICAgICAgICAgKiBAcHJvcGVydHkge1dFQkdMX2RlcHRoX3RleHR1cmV9IGRlcHRoVGV4dHVyZSAtIFdlYkdMIHYxIGV4dGVuc2lvblxuICAgICAgICAgKiBAcHJvcGVydHkge09FU190ZXh0dXJlX2Zsb2F0fSBmbG9hdFRleHR1cmUgLSBXZWJHTCB2MSBleHRlbnNpb25cbiAgICAgICAgICogQHByb3BlcnR5IHtXRUJHTF9sb3NlX2NvbnRleHR9IGxvc2VDb250ZXh0IC0gV2ViR0wgdjEgZXh0ZW5zaW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T0VTX3ZlcnRleF9hcnJheV9vYmplY3R9IHZlcnRleEFycmF5T2JqZWN0IC0gV2ViR0wgdjEgZXh0ZW5zaW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljfSBhbmlzb3Ryb3BpY0ZpbHRlcmluZyAtIFdlYkdMIHYxIGFuZCB2MiBleHRlbnNpb25cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHt9O1xuXG4gICAgICAgIC8vIEJpbmQgZnVuY3Rpb25zXG4gICAgICAgIHRoaXMuaGFuZGxlQ29udGV4dExvc3QgPSB0aGlzLmhhbmRsZUNvbnRleHRMb3N0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29udGV4dFJlc3RvcmVkID0gdGhpcy5oYW5kbGVDb250ZXh0UmVzdG9yZWQuYmluZCh0aGlzKTtcblxuICAgICAgICByZW5kZXJlci52aWV3LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dGxvc3QnLCB0aGlzLmhhbmRsZUNvbnRleHRMb3N0LCBmYWxzZSk7XG4gICAgICAgIHJlbmRlcmVyLnZpZXcuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCB0aGlzLmhhbmRsZUNvbnRleHRSZXN0b3JlZCwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgQ29udGV4dFN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgQ29udGV4dFN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTeXN0ZW0gJiYgU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIENvbnRleHRTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29udGV4dFN5c3RlbTtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGlzTG9zdDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5pc0xvc3QuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiAoIXRoaXMuZ2wgfHwgdGhpcy5nbC5pc0NvbnRleHRMb3N0KCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGNvbnRleHQgY2hhbmdlIGV2ZW50XG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIG5ldyB3ZWJnbCBjb250ZXh0XG4gICAgICovXG4gICAgQ29udGV4dFN5c3RlbS5wcm90b3R5cGUuY29udGV4dENoYW5nZSA9IGZ1bmN0aW9uIGNvbnRleHRDaGFuZ2UgKGdsKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuQ09OVEVYVF9VSUQgPSBDT05URVhUX1VJRCsrO1xuXG4gICAgICAgIC8vIHJlc3RvcmUgYSBjb250ZXh0IGlmIGl0IHdhcyBwcmV2aW91c2x5IGxvc3RcbiAgICAgICAgaWYgKGdsLmlzQ29udGV4dExvc3QoKSAmJiBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpLnJlc3RvcmVDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dFxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCAtIFdlYkdMIGNvbnRleHRcbiAgICAgKi9cbiAgICBDb250ZXh0U3lzdGVtLnByb3RvdHlwZS5pbml0RnJvbUNvbnRleHQgPSBmdW5jdGlvbiBpbml0RnJvbUNvbnRleHQgKGdsKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ29udGV4dChnbCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5DT05URVhUX1VJRCA9IENPTlRFWFRfVUlEKys7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucnVubmVycy5jb250ZXh0Q2hhbmdlLnJ1bihnbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgZnJvbSBjb250ZXh0IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MQ2FudmFzRWxlbWVudC9nZXRDb250ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBjb250ZXh0IGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBDb250ZXh0U3lzdGVtLnByb3RvdHlwZS5pbml0RnJvbU9wdGlvbnMgPSBmdW5jdGlvbiBpbml0RnJvbU9wdGlvbnMgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmNyZWF0ZUNvbnRleHQodGhpcy5yZW5kZXJlci52aWV3LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmluaXRGcm9tQ29udGV4dChnbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgYSBXZWJHTCBDb250ZXh0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FudmFzIHtIVE1MQ2FudmFzRWxlbWVudH0gdGhlIGNhbnZhcyBlbGVtZW50IHRoYXQgd2Ugd2lsbCBnZXQgdGhlIGNvbnRleHQgZnJvbVxuICAgICAqIEBwYXJhbSBvcHRpb25zIHtvYmplY3R9IEFuIG9wdGlvbnMgb2JqZWN0IHRoYXQgZ2V0cyBwYXNzZWQgaW4gdG8gdGhlIGNhbnZhcyBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNvbnRleHQgYXR0cmlidXRlc1xuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL0hUTUxDYW52YXNFbGVtZW50L2dldENvbnRleHRcbiAgICAgKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IHRoZSBXZWJHTCBjb250ZXh0XG4gICAgICovXG4gICAgQ29udGV4dFN5c3RlbS5wcm90b3R5cGUuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQgKGNhbnZhcywgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIHZhciBnbDtcblxuICAgICAgICBpZiAoc2V0dGluZ3MuUFJFRkVSX0VOViA+PSBFTlYuV0VCR0wyKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbDInLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnbClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy53ZWJHTFZlcnNpb24gPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy53ZWJHTFZlcnNpb24gPSAxO1xuXG4gICAgICAgICAgICBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdGlvbnMpXG4gICAgICAgICAgICB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghZ2wpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gZmFpbCwgbm90IGFibGUgdG8gZ2V0IGEgY29udGV4dFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViR0wuIFRyeSB1c2luZyB0aGUgY2FudmFzIHJlbmRlcmVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG5cbiAgICAgICAgdGhpcy5nZXRFeHRlbnNpb25zKCk7XG5cbiAgICAgICAgcmV0dXJuIGdsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBdXRvLXBvcHVsYXRlIHRoZSBleHRlbnNpb25zXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgQ29udGV4dFN5c3RlbS5wcm90b3R5cGUuZ2V0RXh0ZW5zaW9ucyA9IGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMgKClcbiAgICB7XG4gICAgICAgIC8vIHRpbWUgdG8gc2V0IHVwIGRlZmF1bHQgZXh0ZW5zaW9ucyB0aGF0IFBpeGkgdXNlcy5cbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICBpZiAodGhpcy53ZWJHTFZlcnNpb24gPT09IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5leHRlbnNpb25zLCB7XG4gICAgICAgICAgICAgICAgZHJhd0J1ZmZlcnM6IGdsLmdldEV4dGVuc2lvbignV0VCR0xfZHJhd19idWZmZXJzJyksXG4gICAgICAgICAgICAgICAgZGVwdGhUZXh0dXJlOiBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2RlcHRoX3RleHR1cmUnKSxcbiAgICAgICAgICAgICAgICBsb3NlQ29udGV4dDogZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKSxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhBcnJheU9iamVjdDogZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpXG4gICAgICAgICAgICAgICAgICAgIHx8IGdsLmdldEV4dGVuc2lvbignTU9aX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0JylcbiAgICAgICAgICAgICAgICAgICAgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJLSVRfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKSxcbiAgICAgICAgICAgICAgICBhbmlzb3Ryb3BpY0ZpbHRlcmluZzogZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSxcbiAgICAgICAgICAgICAgICB1aW50MzJFbGVtZW50SW5kZXg6IGdsLmdldEV4dGVuc2lvbignT0VTX2VsZW1lbnRfaW5kZXhfdWludCcpLFxuICAgICAgICAgICAgICAgIC8vIEZsb2F0cyBhbmQgaGFsZi1mbG9hdHNcbiAgICAgICAgICAgICAgICBmbG9hdFRleHR1cmU6IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfZmxvYXQnKSxcbiAgICAgICAgICAgICAgICBmbG9hdFRleHR1cmVMaW5lYXI6IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyksXG4gICAgICAgICAgICAgICAgdGV4dHVyZUhhbGZGbG9hdDogZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyksXG4gICAgICAgICAgICAgICAgdGV4dHVyZUhhbGZGbG9hdExpbmVhcjogZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy53ZWJHTFZlcnNpb24gPT09IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5leHRlbnNpb25zLCB7XG4gICAgICAgICAgICAgICAgYW5pc290cm9waWNGaWx0ZXJpbmc6IGdsLmdldEV4dGVuc2lvbignRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyksXG4gICAgICAgICAgICAgICAgLy8gRmxvYXRzIGFuZCBoYWxmLWZsb2F0c1xuICAgICAgICAgICAgICAgIGNvbG9yQnVmZmVyRmxvYXQ6IGdsLmdldEV4dGVuc2lvbignRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcpLFxuICAgICAgICAgICAgICAgIGZsb2F0VGV4dHVyZUxpbmVhcjogZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgYSBsb3N0IHdlYmdsIGNvbnRleHRcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1dlYkdMQ29udGV4dEV2ZW50fSBldmVudCAtIFRoZSBjb250ZXh0IGxvc3QgZXZlbnQuXG4gICAgICovXG4gICAgQ29udGV4dFN5c3RlbS5wcm90b3R5cGUuaGFuZGxlQ29udGV4dExvc3QgPSBmdW5jdGlvbiBoYW5kbGVDb250ZXh0TG9zdCAoZXZlbnQpXG4gICAge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcmVzdG9yZWQgd2ViZ2wgY29udGV4dFxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIENvbnRleHRTeXN0ZW0ucHJvdG90eXBlLmhhbmRsZUNvbnRleHRSZXN0b3JlZCA9IGZ1bmN0aW9uIGhhbmRsZUNvbnRleHRSZXN0b3JlZCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5ydW5uZXJzLmNvbnRleHRDaGFuZ2UucnVuKHRoaXMuZ2wpO1xuICAgIH07XG5cbiAgICBDb250ZXh0U3lzdGVtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLnJlbmRlcmVyLnZpZXc7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyc1xuICAgICAgICB2aWV3LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dGxvc3QnLCB0aGlzLmhhbmRsZUNvbnRleHRMb3N0KTtcbiAgICAgICAgdmlldy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIHRoaXMuaGFuZGxlQ29udGV4dFJlc3RvcmVkKTtcblxuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaW9ucy5sb3NlQ29udGV4dClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb25zLmxvc2VDb250ZXh0Lmxvc2VDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBwb3N0LXJlbmRlciBydW5uZXIgZXZlbnRcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBDb250ZXh0U3lzdGVtLnByb3RvdHlwZS5wb3N0cmVuZGVyID0gZnVuY3Rpb24gcG9zdHJlbmRlciAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIucmVuZGVyaW5nVG9TY3JlZW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBjb250ZXh0XG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIC0gUmVuZGVyIGNvbnRleHRcbiAgICAgKi9cbiAgICBDb250ZXh0U3lzdGVtLnByb3RvdHlwZS52YWxpZGF0ZUNvbnRleHQgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHQgKGdsKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBnbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG4gICAgICAgIC8vIHRoaXMgaXMgZ29pbmcgdG8gYmUgZmFpcmx5IHNpbXBsZSBmb3Igbm93Li4gYnV0IGF0IGxlYXN0IHdlIGhhdmUgcm9vbSB0byBncm93IVxuICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuc3RlbmNpbClcbiAgICAgICAge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3ZpZGVkIFdlYkdMIGNvbnRleHQgZG9lcyBub3QgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLCBtYXNrcyBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHknKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG4gICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQ29udGV4dFN5c3RlbS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIENvbnRleHRTeXN0ZW07XG59KFN5c3RlbSkpO1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSBmcmFtZWJ1ZmZlcnMuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlN5c3RlbVxuICogQG1lbWJlcm9mIFBJWEkuc3lzdGVtc1xuICovXG52YXIgRnJhbWVidWZmZXJTeXN0ZW0gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTeXN0ZW0pIHtcbiAgICBmdW5jdGlvbiBGcmFtZWJ1ZmZlclN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIG1hbmFnZWQgZnJhbWVidWZmZXJzXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuRnJhbWVidWZmZXJbXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hbmFnZWRGcmFtZWJ1ZmZlcnMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRnJhbWVidWZmZXIgdmFsdWUgdGhhdCBzaG93cyB0aGF0IHdlIGRvbid0IGtub3cgd2hhdCBpcyBib3VuZFxuICAgICAgICAgKiBAbWVtYmVyIHtGcmFtZWJ1ZmZlcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVua25vd25GcmFtZWJ1ZmZlciA9IG5ldyBGcmFtZWJ1ZmZlcigxMCwgMTApO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgRnJhbWVidWZmZXJTeXN0ZW0uX19wcm90b19fID0gU3lzdGVtO1xuICAgIEZyYW1lYnVmZmVyU3lzdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFN5c3RlbSAmJiBTeXN0ZW0ucHJvdG90eXBlICk7XG4gICAgRnJhbWVidWZmZXJTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRnJhbWVidWZmZXJTeXN0ZW07XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBzaXplOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSByZW5kZXJlciBjb250ZXh0IGFuZCBuZWNlc3NhcnkgYnVmZmVycy5cbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUuY29udGV4dENoYW5nZSA9IGZ1bmN0aW9uIGNvbnRleHRDaGFuZ2UgKClcbiAgICB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2wgPSB0aGlzLnJlbmRlcmVyLmdsO1xuXG4gICAgICAgIHRoaXMuQ09OVEVYVF9VSUQgPSB0aGlzLnJlbmRlcmVyLkNPTlRFWFRfVUlEO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnVua25vd25GcmFtZWJ1ZmZlcjtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBSZWN0YW5nbGUoKTtcbiAgICAgICAgdGhpcy5oYXNNUlQgPSB0cnVlO1xuICAgICAgICB0aGlzLndyaXRlRGVwdGhUZXh0dXJlID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmRpc3Bvc2VBbGwodHJ1ZSk7XG5cbiAgICAgICAgLy8gd2ViZ2wyXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmNvbnRleHQud2ViR0xWZXJzaW9uID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB3ZWJnbCAxIVxuICAgICAgICAgICAgdmFyIG5hdGl2ZURyYXdCdWZmZXJzRXh0ZW5zaW9uID0gdGhpcy5yZW5kZXJlci5jb250ZXh0LmV4dGVuc2lvbnMuZHJhd0J1ZmZlcnM7XG4gICAgICAgICAgICB2YXIgbmF0aXZlRGVwdGhUZXh0dXJlRXh0ZW5zaW9uID0gdGhpcy5yZW5kZXJlci5jb250ZXh0LmV4dGVuc2lvbnMuZGVwdGhUZXh0dXJlO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuUFJFRkVSX0VOViA9PT0gRU5WLldFQkdMX0xFR0FDWSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYXRpdmVEcmF3QnVmZmVyc0V4dGVuc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgbmF0aXZlRGVwdGhUZXh0dXJlRXh0ZW5zaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hdGl2ZURyYXdCdWZmZXJzRXh0ZW5zaW9uKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdsLmRyYXdCdWZmZXJzID0gZnVuY3Rpb24gKGFjdGl2ZVRleHR1cmVzKSB7IHJldHVybiBuYXRpdmVEcmF3QnVmZmVyc0V4dGVuc2lvbi5kcmF3QnVmZmVyc1dFQkdMKGFjdGl2ZVRleHR1cmVzKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01SVCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLmRyYXdCdWZmZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbmF0aXZlRGVwdGhUZXh0dXJlRXh0ZW5zaW9uKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVEZXB0aFRleHR1cmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBCaW5kIGEgZnJhbWVidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5GcmFtZWJ1ZmZlcn0gZnJhbWVidWZmZXJcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBbZnJhbWVdIGZyYW1lLCBkZWZhdWx0IGlzIGZyYW1lYnVmZmVyIHNpemVcbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQgKGZyYW1lYnVmZmVyLCBmcmFtZSlcbiAgICB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG5cbiAgICAgICAgaWYgKGZyYW1lYnVmZmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPIGNhY2hpbmcgbGF5ZXIhXG5cbiAgICAgICAgICAgIHZhciBmYm8gPSBmcmFtZWJ1ZmZlci5nbEZyYW1lYnVmZmVyc1t0aGlzLkNPTlRFWFRfVUlEXSB8fCB0aGlzLmluaXRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IGZyYW1lYnVmZmVyKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IGZyYW1lYnVmZmVyO1xuICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZmJvLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbGwgdGV4dHVyZXMgYXJlIHVuYm91bmQuLlxuXG4gICAgICAgICAgICAvLyBub3cgY2hlY2sgZm9yIHVwZGF0ZXMuLi5cbiAgICAgICAgICAgIGlmIChmYm8uZGlydHlJZCAhPT0gZnJhbWVidWZmZXIuZGlydHlJZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmYm8uZGlydHlJZCA9IGZyYW1lYnVmZmVyLmRpcnR5SWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmJvLmRpcnR5Rm9ybWF0ICE9PSBmcmFtZWJ1ZmZlci5kaXJ0eUZvcm1hdClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGZiby5kaXJ0eUZvcm1hdCA9IGZyYW1lYnVmZmVyLmRpcnR5Rm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmJvLmRpcnR5U2l6ZSAhPT0gZnJhbWVidWZmZXIuZGlydHlTaXplKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZmJvLmRpcnR5U2l6ZSA9IGZyYW1lYnVmZmVyLmRpcnR5U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYW1lYnVmZmVyLmNvbG9yVGV4dHVyZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lYnVmZmVyLmNvbG9yVGV4dHVyZXNbaV0udGV4dHVyZVBhcnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnRleHR1cmUudW5iaW5kKGZyYW1lYnVmZmVyLmNvbG9yVGV4dHVyZXNbaV0udGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIudGV4dHVyZS51bmJpbmQoZnJhbWVidWZmZXIuY29sb3JUZXh0dXJlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJhbWVidWZmZXIuZGVwdGhUZXh0dXJlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIudGV4dHVyZS51bmJpbmQoZnJhbWVidWZmZXIuZGVwdGhUZXh0dXJlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZyYW1lKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld3BvcnQoZnJhbWUueCwgZnJhbWUueSwgZnJhbWUud2lkdGgsIGZyYW1lLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWaWV3cG9ydCgwLCAwLCBmcmFtZWJ1ZmZlci53aWR0aCwgZnJhbWVidWZmZXIuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJhbWUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWaWV3cG9ydChmcmFtZS54LCBmcmFtZS55LCBmcmFtZS53aWR0aCwgZnJhbWUuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdwb3J0KDAsIDAsIHRoaXMucmVuZGVyZXIud2lkdGgsIHRoaXMucmVuZGVyZXIuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFdlYkdMUmVuZGVyaW5nQ29udGV4dCdzIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggLSBYIHBvc2l0aW9uIG9mIHZpZXdwb3J0XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBZIHBvc2l0aW9uIG9mIHZpZXdwb3J0XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gV2lkdGggb2Ygdmlld3BvcnRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIHZpZXdwb3J0XG4gICAgICovXG4gICAgRnJhbWVidWZmZXJTeXN0ZW0ucHJvdG90eXBlLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24gc2V0Vmlld3BvcnQgKHgsIHksIHdpZHRoLCBoZWlnaHQpXG4gICAge1xuICAgICAgICB2YXIgdiA9IHRoaXMudmlld3BvcnQ7XG5cbiAgICAgICAgaWYgKHYud2lkdGggIT09IHdpZHRoIHx8IHYuaGVpZ2h0ICE9PSBoZWlnaHQgfHwgdi54ICE9PSB4IHx8IHYueSAhPT0geSlcbiAgICAgICAge1xuICAgICAgICAgICAgdi54ID0geDtcbiAgICAgICAgICAgIHYueSA9IHk7XG4gICAgICAgICAgICB2LndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICB2LmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAgICAgdGhpcy5nbC52aWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgd2lkdGggYW5kIGhlaWdodC4gUmV0dXJucyBvYmplY3Qgd2l0aCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtvYmplY3R9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnNpemUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE8gc3RvcmUgdGVtcFxuICAgICAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMuY3VycmVudC53aWR0aCwgaGVpZ2h0OiB0aGlzLmN1cnJlbnQuaGVpZ2h0IH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB3aWR0aDogdGhpcy5yZW5kZXJlci53aWR0aCwgaGVpZ2h0OiB0aGlzLnJlbmRlcmVyLmhlaWdodCB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY29sb3Igb2YgdGhlIGNvbnRleHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByIC0gUmVkIHZhbHVlIGZyb20gMCB0byAxXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGcgLSBHcmVlbiB2YWx1ZSBmcm9tIDAgdG8gMVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBiIC0gQmx1ZSB2YWx1ZSBmcm9tIDAgdG8gMVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIC0gQWxwaGEgdmFsdWUgZnJvbSAwIHRvIDFcbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAociwgZywgYiwgYSlcbiAgICB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG5cbiAgICAgICAgLy8gVE9ETyBjbGVhciBjb2xvciBjYW4gYmUgc2V0IG9ubHkgb25lIHJpZ2h0P1xuICAgICAgICBnbC5jbGVhckNvbG9yKHIsIGcsIGIsIGEpO1xuICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgZnJhbWVidWZmZXJcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1BJWEkuRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyXG4gICAgICovXG4gICAgRnJhbWVidWZmZXJTeXN0ZW0ucHJvdG90eXBlLmluaXRGcmFtZWJ1ZmZlciA9IGZ1bmN0aW9uIGluaXRGcmFtZWJ1ZmZlciAoZnJhbWVidWZmZXIpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgdmFyIGdsID0gcmVmLmdsO1xuXG4gICAgICAgIC8vIFRPRE8gLSBtYWtlIHRoaXMgYSBjbGFzcz9cbiAgICAgICAgdmFyIGZibyA9IHtcbiAgICAgICAgICAgIGZyYW1lYnVmZmVyOiBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpLFxuICAgICAgICAgICAgc3RlbmNpbDogbnVsbCxcbiAgICAgICAgICAgIGRpcnR5SWQ6IDAsXG4gICAgICAgICAgICBkaXJ0eUZvcm1hdDogMCxcbiAgICAgICAgICAgIGRpcnR5U2l6ZTogMCxcbiAgICAgICAgfTtcblxuICAgICAgICBmcmFtZWJ1ZmZlci5nbEZyYW1lYnVmZmVyc1t0aGlzLkNPTlRFWFRfVUlEXSA9IGZibztcblxuICAgICAgICB0aGlzLm1hbmFnZWRGcmFtZWJ1ZmZlcnMucHVzaChmcmFtZWJ1ZmZlcik7XG4gICAgICAgIGZyYW1lYnVmZmVyLmRpc3Bvc2VSdW5uZXIuYWRkKHRoaXMpO1xuXG4gICAgICAgIHJldHVybiBmYm87XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgZnJhbWVidWZmZXJcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1BJWEkuRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyXG4gICAgICovXG4gICAgRnJhbWVidWZmZXJTeXN0ZW0ucHJvdG90eXBlLnJlc2l6ZUZyYW1lYnVmZmVyID0gZnVuY3Rpb24gcmVzaXplRnJhbWVidWZmZXIgKGZyYW1lYnVmZmVyKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICB2YXIgZmJvID0gZnJhbWVidWZmZXIuZ2xGcmFtZWJ1ZmZlcnNbdGhpcy5DT05URVhUX1VJRF07XG5cbiAgICAgICAgaWYgKGZiby5zdGVuY2lsKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgZmJvLnN0ZW5jaWwpO1xuICAgICAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIGdsLkRFUFRIX1NURU5DSUwsIGZyYW1lYnVmZmVyLndpZHRoLCBmcmFtZWJ1ZmZlci5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbG9yVGV4dHVyZXMgPSBmcmFtZWJ1ZmZlci5jb2xvclRleHR1cmVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JUZXh0dXJlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci50ZXh0dXJlLmJpbmQoY29sb3JUZXh0dXJlc1tpXSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhbWVidWZmZXIuZGVwdGhUZXh0dXJlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnRleHR1cmUuYmluZChmcmFtZWJ1ZmZlci5kZXB0aFRleHR1cmUsIDApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgZnJhbWVidWZmZXJcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1BJWEkuRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyXG4gICAgICovXG4gICAgRnJhbWVidWZmZXJTeXN0ZW0ucHJvdG90eXBlLnVwZGF0ZUZyYW1lYnVmZmVyID0gZnVuY3Rpb24gdXBkYXRlRnJhbWVidWZmZXIgKGZyYW1lYnVmZmVyKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICB2YXIgZmJvID0gZnJhbWVidWZmZXIuZ2xGcmFtZWJ1ZmZlcnNbdGhpcy5DT05URVhUX1VJRF07XG5cbiAgICAgICAgLy8gYmluZCB0aGUgY29sb3IgdGV4dHVyZVxuICAgICAgICB2YXIgY29sb3JUZXh0dXJlcyA9IGZyYW1lYnVmZmVyLmNvbG9yVGV4dHVyZXM7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gY29sb3JUZXh0dXJlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKCFnbC5kcmF3QnVmZmVycylcbiAgICAgICAge1xuICAgICAgICAgICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWN0aXZlVGV4dHVyZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gZnJhbWVidWZmZXIuY29sb3JUZXh0dXJlc1tpXTtcblxuICAgICAgICAgICAgaWYgKHRleHR1cmUudGV4dHVyZVBhcnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci50ZXh0dXJlLmJpbmQodGV4dHVyZS50ZXh0dXJlLCAwKTtcblxuICAgICAgICAgICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLFxuICAgICAgICAgICAgICAgICAgICBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksXG4gICAgICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCArIHRleHR1cmUuc2lkZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS50ZXh0dXJlLl9nbFRleHR1cmVzW3RoaXMuQ09OVEVYVF9VSURdLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIudGV4dHVyZS5iaW5kKHRleHR1cmUsIDApO1xuXG4gICAgICAgICAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsXG4gICAgICAgICAgICAgICAgICAgIGdsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSxcbiAgICAgICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5fZ2xUZXh0dXJlc1t0aGlzLkNPTlRFWFRfVUlEXS50ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWN0aXZlVGV4dHVyZXMucHVzaChnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGl2ZVRleHR1cmVzLmxlbmd0aCA+IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsLmRyYXdCdWZmZXJzKGFjdGl2ZVRleHR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFtZWJ1ZmZlci5kZXB0aFRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB3cml0ZURlcHRoVGV4dHVyZSA9IHRoaXMud3JpdGVEZXB0aFRleHR1cmU7XG5cbiAgICAgICAgICAgIGlmICh3cml0ZURlcHRoVGV4dHVyZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVwdGhUZXh0dXJlID0gZnJhbWVidWZmZXIuZGVwdGhUZXh0dXJlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci50ZXh0dXJlLmJpbmQoZGVwdGhUZXh0dXJlLCAwKTtcblxuICAgICAgICAgICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLFxuICAgICAgICAgICAgICAgICAgICBnbC5ERVBUSF9BVFRBQ0hNRU5ULFxuICAgICAgICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELFxuICAgICAgICAgICAgICAgICAgICBkZXB0aFRleHR1cmUuX2dsVGV4dHVyZXNbdGhpcy5DT05URVhUX1VJRF0udGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZiby5zdGVuY2lsICYmIChmcmFtZWJ1ZmZlci5zdGVuY2lsIHx8IGZyYW1lYnVmZmVyLmRlcHRoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZmJvLnN0ZW5jaWwgPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblxuICAgICAgICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihnbC5SRU5ERVJCVUZGRVIsIGZiby5zdGVuY2lsKTtcblxuICAgICAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIGdsLkRFUFRIX1NURU5DSUwsIGZyYW1lYnVmZmVyLndpZHRoLCBmcmFtZWJ1ZmZlci5oZWlnaHQpO1xuICAgICAgICAgICAgLy8gVE9ETy4uIHRoaXMgaXMgZGVwdGggQU5EIHN0ZW5jaWw/XG4gICAgICAgICAgICBpZiAoIWZyYW1lYnVmZmVyLmRlcHRoVGV4dHVyZSlcbiAgICAgICAgICAgIHsgLy8geW91IGNhbid0IGhhdmUgYm90aCwgc28gb25lIHNob3VsZCB0YWtlIHByaW9yaXR5IGlmIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBnbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBnbC5SRU5ERVJCVUZGRVIsIGZiby5zdGVuY2lsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyBmcmFtZWJ1ZmZlclxuICAgICAqIEBwYXJhbSB7UElYSS5GcmFtZWJ1ZmZlcn0gZnJhbWVidWZmZXIgZnJhbWVidWZmZXIgdGhhdCBoYXMgdG8gYmUgZGlzcG9zZWQgb2ZcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0TG9zdD1mYWxzZV0gSWYgY29udGV4dCB3YXMgbG9zdCwgd2Ugc3VwcHJlc3MgYWxsIGRlbGV0ZSBmdW5jdGlvbiBjYWxsc1xuICAgICAqL1xuICAgIEZyYW1lYnVmZmVyU3lzdGVtLnByb3RvdHlwZS5kaXNwb3NlRnJhbWVidWZmZXIgPSBmdW5jdGlvbiBkaXNwb3NlRnJhbWVidWZmZXIgKGZyYW1lYnVmZmVyLCBjb250ZXh0TG9zdClcbiAgICB7XG4gICAgICAgIHZhciBmYm8gPSBmcmFtZWJ1ZmZlci5nbEZyYW1lYnVmZmVyc1t0aGlzLkNPTlRFWFRfVUlEXTtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICBpZiAoIWZibylcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGZyYW1lYnVmZmVyLmdsRnJhbWVidWZmZXJzW3RoaXMuQ09OVEVYVF9VSURdO1xuXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMubWFuYWdlZEZyYW1lYnVmZmVycy5pbmRleE9mKGZyYW1lYnVmZmVyKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VkRnJhbWVidWZmZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFtZWJ1ZmZlci5kaXNwb3NlUnVubmVyLnJlbW92ZSh0aGlzKTtcblxuICAgICAgICBpZiAoIWNvbnRleHRMb3N0KVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmYm8uZnJhbWVidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGZiby5zdGVuY2lsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihmYm8uc3RlbmNpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYWxsIGZyYW1lYnVmZmVycywgYnV0IG5vdCB0ZXh0dXJlcyBib3VuZCB0byB0aGVtXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY29udGV4dExvc3Q9ZmFsc2VdIElmIGNvbnRleHQgd2FzIGxvc3QsIHdlIHN1cHByZXNzIGFsbCBkZWxldGUgZnVuY3Rpb24gY2FsbHNcbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUuZGlzcG9zZUFsbCA9IGZ1bmN0aW9uIGRpc3Bvc2VBbGwgKGNvbnRleHRMb3N0KVxuICAgIHtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLm1hbmFnZWRGcmFtZWJ1ZmZlcnM7XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VkRnJhbWVidWZmZXJzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VGcmFtZWJ1ZmZlcihsaXN0W2ldLCBjb250ZXh0TG9zdCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRm9yY2luZyBjcmVhdGlvbiBvZiBzdGVuY2lsIGJ1ZmZlciBmb3IgY3VycmVudCBmcmFtZWJ1ZmZlciwgaWYgaXQgd2Fzbid0IGRvbmUgYmVmb3JlLlxuICAgICAqIFVzZWQgYnkgTWFza1N5c3RlbSwgd2hlbiBpdHMgdGltZSB0byB1c2Ugc3RlbmNpbCBtYXNrIGZvciBHcmFwaGljcyBlbGVtZW50LlxuICAgICAqXG4gICAgICogSXRzIGFuIGFsdGVybmF0aXZlIGZvciBwdWJsaWMgbGF6eSBgZnJhbWVidWZmZXIuZW5hYmxlU3RlbmNpbGAsIGluIGNhc2Ugd2UgbmVlZCBzdGVuY2lsIHdpdGhvdXQgcmViaW5kLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUuZm9yY2VTdGVuY2lsID0gZnVuY3Rpb24gZm9yY2VTdGVuY2lsICgpXG4gICAge1xuICAgICAgICB2YXIgZnJhbWVidWZmZXIgPSB0aGlzLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKCFmcmFtZWJ1ZmZlcilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZibyA9IGZyYW1lYnVmZmVyLmdsRnJhbWVidWZmZXJzW3RoaXMuQ09OVEVYVF9VSURdO1xuXG4gICAgICAgIGlmICghZmJvIHx8IGZiby5zdGVuY2lsKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVidWZmZXIuZW5hYmxlU3RlbmNpbCgpO1xuXG4gICAgICAgIHZhciB3ID0gZnJhbWVidWZmZXIud2lkdGg7XG4gICAgICAgIHZhciBoID0gZnJhbWVidWZmZXIuaGVpZ2h0O1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgICB2YXIgc3RlbmNpbCA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXG4gICAgICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCBzdGVuY2lsKTtcbiAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIGdsLkRFUFRIX1NURU5DSUwsIHcsIGgpO1xuXG4gICAgICAgIGZiby5zdGVuY2lsID0gc3RlbmNpbDtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgZ2wuUkVOREVSQlVGRkVSLCBzdGVuY2lsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogcmVzZXRzIGZyYW1lYnVmZmVyIHN0b3JlZCBzdGF0ZSwgYmluZHMgc2NyZWVuIGZyYW1lYnVmZmVyXG4gICAgICpcbiAgICAgKiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSByZW5kZXJUZXh0dXJlIHJlc2V0KClcbiAgICAgKi9cbiAgICBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy51bmtub3duRnJhbWVidWZmZXI7XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBGcmFtZWJ1ZmZlclN5c3RlbS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIEZyYW1lYnVmZmVyU3lzdGVtO1xufShTeXN0ZW0pKTtcblxudmFyIEdMQnVmZmVyID0gZnVuY3Rpb24gR0xCdWZmZXIoYnVmZmVyKVxue1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgIHRoaXMudXBkYXRlSUQgPSAtMTtcbiAgICB0aGlzLmJ5dGVMZW5ndGggPSAtMTtcbiAgICB0aGlzLnJlZkNvdW50ID0gMDtcbn07XG5cbnZhciBieXRlU2l6ZU1hcCQxID0geyA1MTI2OiA0LCA1MTIzOiAyLCA1MTIxOiAxIH07XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIGdlb21ldHJ5LlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5TeXN0ZW1cbiAqIEBtZW1iZXJvZiBQSVhJLnN5c3RlbXNcbiAqL1xudmFyIEdlb21ldHJ5U3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gR2VvbWV0cnlTeXN0ZW0ocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBTeXN0ZW0uY2FsbCh0aGlzLCByZW5kZXJlcik7XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlR2VvbWV0cnkgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVWYW8gPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgdHJ1ZWAgaWYgd2UgaGFzIGAqX3ZlcnRleF9hcnJheV9vYmplY3RgIGV4dGVuc2lvblxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaGFzVmFvID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogYHRydWVgIGlmIGhhcyBgQU5HTEVfaW5zdGFuY2VkX2FycmF5c2AgZXh0ZW5zaW9uXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNJbnN0YW5jZSA9IHRydWU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGB0cnVlYCBpZiBzdXBwb3J0IGBnbC5VTlNJR05FRF9JTlRgIGluIGBnbC5kcmF3RWxlbWVudHNgIG9yIGBnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWRgXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYW5Vc2VVSW50MzJFbGVtZW50SW5kZXggPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBjYWNoZSBvZiBjdXJyZW50bHkgYm91bmQgYnVmZmVyLFxuICAgICAgICAgKiBjb250YWlucyBvbmx5IHR3byBtZW1iZXJzIHdpdGgga2V5cyBBUlJBWV9CVUZGRVIgYW5kIEVMRU1FTlRfQVJSQVlfQlVGRkVSXG4gICAgICAgICAqIEBtZW1iZXIge09iamVjdC48bnVtYmVyLCBQSVhJLkJ1ZmZlcj59XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ib3VuZEJ1ZmZlcnMgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGUgZm9yIGFsbCBnZW9tZXRyaWVzIGJ5IGlkLCB1c2VkIGluIGNhc2UgcmVuZGVyZXIgZ2V0cyBkZXN0cm95ZWQgb3IgZm9yIHByb2ZpbGluZ1xuICAgICAgICAgKiBAbWVtYmVyIHtvYmplY3R9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYW5hZ2VkR2VvbWV0cmllcyA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZSBmb3IgYWxsIGJ1ZmZlcnMgYnkgaWQsIHVzZWQgaW4gY2FzZSByZW5kZXJlciBnZXRzIGRlc3Ryb3llZCBvciBmb3IgcHJvZmlsaW5nXG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hbmFnZWRCdWZmZXJzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCBTeXN0ZW0gKSBHZW9tZXRyeVN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgR2VvbWV0cnlTeXN0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU3lzdGVtICYmIFN5c3RlbS5wcm90b3R5cGUgKTtcbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW9tZXRyeVN5c3RlbTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIHJlbmRlcmVyIGNvbnRleHQgYW5kIG5lY2Vzc2FyeSBidWZmZXJzLlxuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS5jb250ZXh0Q2hhbmdlID0gZnVuY3Rpb24gY29udGV4dENoYW5nZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlQWxsKHRydWUpO1xuXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2wgPSB0aGlzLnJlbmRlcmVyLmdsO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMucmVuZGVyZXIuY29udGV4dDtcblxuICAgICAgICB0aGlzLkNPTlRFWFRfVUlEID0gdGhpcy5yZW5kZXJlci5DT05URVhUX1VJRDtcblxuICAgICAgICAvLyB3ZWJnbDJcbiAgICAgICAgaWYgKCFnbC5jcmVhdGVWZXJ0ZXhBcnJheSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gd2ViZ2wgMSFcbiAgICAgICAgICAgIHZhciBuYXRpdmVWYW9FeHRlbnNpb24gPSB0aGlzLnJlbmRlcmVyLmNvbnRleHQuZXh0ZW5zaW9ucy52ZXJ0ZXhBcnJheU9iamVjdDtcblxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLlBSRUZFUl9FTlYgPT09IEVOVi5XRUJHTF9MRUdBQ1kpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmF0aXZlVmFvRXh0ZW5zaW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5hdGl2ZVZhb0V4dGVuc2lvbilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnbC5jcmVhdGVWZXJ0ZXhBcnJheSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZVZhb0V4dGVuc2lvbi5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpOyB9O1xuXG4gICAgICAgICAgICAgICAgZ2wuYmluZFZlcnRleEFycmF5ID0gZnVuY3Rpb24gKHZhbykgeyByZXR1cm4gbmF0aXZlVmFvRXh0ZW5zaW9uLmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8pOyB9O1xuXG4gICAgICAgICAgICAgICAgZ2wuZGVsZXRlVmVydGV4QXJyYXkgPSBmdW5jdGlvbiAodmFvKSB7IHJldHVybiBuYXRpdmVWYW9FeHRlbnNpb24uZGVsZXRlVmVydGV4QXJyYXlPRVModmFvKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZhbyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsLmNyZWF0ZVZlcnRleEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVZlcnRleEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWdsLnZlcnRleEF0dHJpYkRpdmlzb3IpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZUV4dCA9IGdsLmdldEV4dGVuc2lvbignQU5HTEVfaW5zdGFuY2VkX2FycmF5cycpO1xuXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VFeHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliRGl2aXNvciA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBpbnN0YW5jZUV4dC52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoYSwgYik7IH07XG5cbiAgICAgICAgICAgICAgICBnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSkgeyByZXR1cm4gaW5zdGFuY2VFeHQuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoYSwgYiwgYywgZCwgZSk7IH07XG5cbiAgICAgICAgICAgICAgICBnbC5kcmF3QXJyYXlzSW5zdGFuY2VkID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGluc3RhbmNlRXh0LmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRShhLCBiLCBjLCBkKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0luc3RhbmNlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhblVzZVVJbnQzMkVsZW1lbnRJbmRleCA9IGNvbnRleHQud2ViR0xWZXJzaW9uID09PSAyIHx8ICEhY29udGV4dC5leHRlbnNpb25zLnVpbnQzMkVsZW1lbnRJbmRleDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQmluZHMgZ2VvbWV0cnkgc28gdGhhdCBpcyBjYW4gYmUgZHJhd24uIENyZWF0aW5nIGEgVmFvIGlmIHJlcXVpcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuR2VvbWV0cnl9IGdlb21ldHJ5IGluc3RhbmNlIG9mIGdlb21ldHJ5IHRvIGJpbmRcbiAgICAgKiBAcGFyYW0ge1BJWEkuU2hhZGVyfSBbc2hhZGVyXSBpbnN0YW5jZSBvZiBzaGFkZXIgdG8gdXNlIHZhbyBmb3JcbiAgICAgKi9cbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQgKGdlb21ldHJ5LCBzaGFkZXIpXG4gICAge1xuICAgICAgICBzaGFkZXIgPSBzaGFkZXIgfHwgdGhpcy5yZW5kZXJlci5zaGFkZXIuc2hhZGVyO1xuXG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG5cbiAgICAgICAgLy8gbm90IHN1cmUgdGhlIGJlc3Qgd2F5IHRvIGFkZHJlc3MgdGhpcy4uXG4gICAgICAgIC8vIGN1cnJlbnRseSBkaWZmZXJlbnQgc2hhZGVycyByZXF1aXJlIGRpZmZlcmVudCBWQU9zIGZvciB0aGUgc2FtZSBnZW9tZXRyeVxuICAgICAgICAvLyBTdGlsbCBtdWxsaW5nIG92ZXIgdGhlIGJlc3Qgd2F5IHRvIHNvbHZlIHRoaXMgb25lLi5cbiAgICAgICAgLy8gd2lsbCBsaWtlbHkgbmVlZCB0byBtb2RpZnkgdGhlIHNoYWRlciBhdHRyaWJ1dGUgbG9jYXRpb25zIGF0IHJ1biB0aW1lIVxuICAgICAgICB2YXIgdmFvcyA9IGdlb21ldHJ5LmdsVmVydGV4QXJyYXlPYmplY3RzW3RoaXMuQ09OVEVYVF9VSURdO1xuXG4gICAgICAgIGlmICghdmFvcylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VkR2VvbWV0cmllc1tnZW9tZXRyeS5pZF0gPSBnZW9tZXRyeTtcbiAgICAgICAgICAgIGdlb21ldHJ5LmRpc3Bvc2VSdW5uZXIuYWRkKHRoaXMpO1xuICAgICAgICAgICAgZ2VvbWV0cnkuZ2xWZXJ0ZXhBcnJheU9iamVjdHNbdGhpcy5DT05URVhUX1VJRF0gPSB2YW9zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFvID0gdmFvc1tzaGFkZXIucHJvZ3JhbS5pZF0gfHwgdGhpcy5pbml0R2VvbWV0cnlWYW8oZ2VvbWV0cnksIHNoYWRlci5wcm9ncmFtKTtcblxuICAgICAgICB0aGlzLl9hY3RpdmVHZW9tZXRyeSA9IGdlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVWYW8gIT09IHZhbylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmFvID0gdmFvO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYW8pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZ2wuYmluZFZlcnRleEFycmF5KHZhbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVZhbyhnZW9tZXRyeSwgc2hhZGVyLnByb2dyYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyAtIG9wdGltaXNlIGxhdGVyIVxuICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGxvb3AgdGhyb3VnaCBpZiBub3RoaW5nIGNoYW5nZWQhXG4gICAgICAgIC8vIG1heWJlIGxvb2sgdG8gYWRkIGFuICdhdXRvdXBkYXRlJyB0byBnZW9tZXRyeT9cbiAgICAgICAgdGhpcy51cGRhdGVCdWZmZXJzKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGFuZCB1bmJpbmQgYW55IGFjdGl2ZSBWQU8gYW5kIGdlb21ldHJ5XG4gICAgICovXG4gICAgR2VvbWV0cnlTeXN0ZW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbiAgICB7XG4gICAgICAgIHRoaXMudW5iaW5kKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBidWZmZXJzXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS51cGRhdGVCdWZmZXJzID0gZnVuY3Rpb24gdXBkYXRlQnVmZmVycyAoKVxuICAgIHtcbiAgICAgICAgdmFyIGdlb21ldHJ5ID0gdGhpcy5fYWN0aXZlR2VvbWV0cnk7XG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5idWZmZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYnVmZmVyID0gZ2VvbWV0cnkuYnVmZmVyc1tpXTtcblxuICAgICAgICAgICAgdmFyIGdsQnVmZmVyID0gYnVmZmVyLl9nbEJ1ZmZlcnNbdGhpcy5DT05URVhUX1VJRF07XG5cbiAgICAgICAgICAgIGlmIChidWZmZXIuX3VwZGF0ZUlEICE9PSBnbEJ1ZmZlci51cGRhdGVJRClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnbEJ1ZmZlci51cGRhdGVJRCA9IGJ1ZmZlci5fdXBkYXRlSUQ7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIGNhbiBjYWNoZSB0aGlzIG9uIGJ1ZmZlciEgbWF5YmUgYWRkZWQgYSBnZXR0ZXIgLyBzZXR0ZXI/XG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBidWZmZXIuaW5kZXggPyBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiA6IGdsLkFSUkFZX0JVRkZFUjtcblxuICAgICAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBjb3VsZCBjaGFuZ2UgaWYgdGhlIFZBTyBjaGFuZ2VzLi4uXG4gICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjb21lIHVwIHdpdGggYSBiZXR0ZXIgd2F5IHRvIGNhY2hlLi5cbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5ib3VuZEJ1ZmZlcnNbdHlwZV0gIT09IGdsQnVmZmVyKVxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmJvdW5kQnVmZmVyc1t0eXBlXSA9IGdsQnVmZmVyO1xuICAgICAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIodHlwZSwgZ2xCdWZmZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9ib3VuZEJ1ZmZlciA9IGdsQnVmZmVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKGdsQnVmZmVyLmJ5dGVMZW5ndGggPj0gYnVmZmVyLmRhdGEuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBpcyBhbHdheXMgemVybyBmb3Igbm93IVxuICAgICAgICAgICAgICAgICAgICBnbC5idWZmZXJTdWJEYXRhKHR5cGUsIDAsIGJ1ZmZlci5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyYXdUeXBlID0gYnVmZmVyLnN0YXRpYyA/IGdsLlNUQVRJQ19EUkFXIDogZ2wuRFlOQU1JQ19EUkFXO1xuXG4gICAgICAgICAgICAgICAgICAgIGdsQnVmZmVyLmJ5dGVMZW5ndGggPSBidWZmZXIuZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBnbC5idWZmZXJEYXRhKHR5cGUsIGJ1ZmZlci5kYXRhLCBkcmF3VHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGNvbXBhYmlsaXR5IGJldHdlZW4gYSBnZW9tZXRyeSBhbmQgYSBwcm9ncmFtXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5HZW9tZXRyeX0gZ2VvbWV0cnkgLSBHZW9tZXRyeSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UElYSS5Qcm9ncmFtfSBwcm9ncmFtIC0gUHJvZ3JhbSBpbnN0YW5jZVxuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS5jaGVja0NvbXBhdGliaWxpdHkgPSBmdW5jdGlvbiBjaGVja0NvbXBhdGliaWxpdHkgKGdlb21ldHJ5LCBwcm9ncmFtKVxuICAgIHtcbiAgICAgICAgLy8gZ2VvbWV0cnkgbXVzdCBoYXZlIGF0IGxlYXN0IGFsbCB0aGUgYXR0cmlidXRlcyB0aGF0IHRoZSBzaGFkZXIgcmVxdWlyZXMuXG4gICAgICAgIHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgICB2YXIgc2hhZGVyQXR0cmlidXRlcyA9IHByb2dyYW0uYXR0cmlidXRlRGF0YTtcblxuICAgICAgICBmb3IgKHZhciBqIGluIHNoYWRlckF0dHJpYnV0ZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZ2VvbWV0cnlBdHRyaWJ1dGVzW2pdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJzaGFkZXIgYW5kIGdlb21ldHJ5IGluY29tcGF0aWJsZSwgZ2VvbWV0cnkgbWlzc2luZyB0aGUgXFxcIlwiICsgaiArIFwiXFxcIiBhdHRyaWJ1dGVcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgZ2VvbWV0cnkgYW5kIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIHVuaXF1ZSBzaWduYXR1cmUgZm9yIHRoZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuR2VvbWV0cnl9IGdlb21ldHJ5IHRvIGdldCBzaWduYXR1cmUgZnJvbVxuICAgICAqIEBwYXJhbSB7UElYSS5Qcm9ncmFtfSBwcm9ncmFtIHRvIHRlc3QgZ2VvbWV0cnkgYWdhaW5zdFxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFVuaXF1ZSBzaWduYXR1cmUgb2YgdGhlIGdlb21ldHJ5IGFuZCBwcm9ncmFtXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS5nZXRTaWduYXR1cmUgPSBmdW5jdGlvbiBnZXRTaWduYXR1cmUgKGdlb21ldHJ5LCBwcm9ncmFtKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgICB2YXIgc2hhZGVyQXR0cmlidXRlcyA9IHByb2dyYW0uYXR0cmlidXRlRGF0YTtcblxuICAgICAgICB2YXIgc3RyaW5ncyA9IFsnZycsIGdlb21ldHJ5LmlkXTtcblxuICAgICAgICBmb3IgKHZhciBpIGluIGF0dHJpYnMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChzaGFkZXJBdHRyaWJ1dGVzW2ldKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJy0nKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvciBnZXRzIFZhbyB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgZ2VvbWV0cnkgYW5kIHN0b3JlcyBpdCBvbiB0aGUgZ2VvbWV0cnkuXG4gICAgICogSWYgdmFvIGlzIGNyZWF0ZWQsIGl0IGlzIGJvdW5kIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLkdlb21ldHJ5fSBnZW9tZXRyeSAtIEluc3RhbmNlIG9mIGdlb21ldHJ5IHRvIHRvIGdlbmVyYXRlIFZhbyBmb3JcbiAgICAgKiBAcGFyYW0ge1BJWEkuUHJvZ3JhbX0gcHJvZ3JhbSAtIEluc3RhbmNlIG9mIHByb2dyYW1cbiAgICAgKi9cbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuaW5pdEdlb21ldHJ5VmFvID0gZnVuY3Rpb24gaW5pdEdlb21ldHJ5VmFvIChnZW9tZXRyeSwgcHJvZ3JhbSlcbiAgICB7XG4gICAgICAgIHRoaXMuY2hlY2tDb21wYXRpYmlsaXR5KGdlb21ldHJ5LCBwcm9ncmFtKTtcblxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgICB2YXIgQ09OVEVYVF9VSUQgPSB0aGlzLkNPTlRFWFRfVUlEO1xuXG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLmdldFNpZ25hdHVyZShnZW9tZXRyeSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgdmFyIHZhb09iamVjdEhhc2ggPSBnZW9tZXRyeS5nbFZlcnRleEFycmF5T2JqZWN0c1t0aGlzLkNPTlRFWFRfVUlEXTtcblxuICAgICAgICB2YXIgdmFvID0gdmFvT2JqZWN0SGFzaFtzaWduYXR1cmVdO1xuXG4gICAgICAgIGlmICh2YW8pXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBnaXZlIHVzIGVhc3kgYWNjZXNzIHRvIHRoZSB2YW9cbiAgICAgICAgICAgIHZhb09iamVjdEhhc2hbcHJvZ3JhbS5pZF0gPSB2YW87XG5cbiAgICAgICAgICAgIHJldHVybiB2YW87XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYnVmZmVycyA9IGdlb21ldHJ5LmJ1ZmZlcnM7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcbiAgICAgICAgdmFyIHRlbXBTdHJpZGUgPSB7fTtcbiAgICAgICAgdmFyIHRlbXBTdGFydCA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGogaW4gYnVmZmVycylcbiAgICAgICAge1xuICAgICAgICAgICAgdGVtcFN0cmlkZVtqXSA9IDA7XG4gICAgICAgICAgICB0ZW1wU3RhcnRbal0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaiQxIGluIGF0dHJpYnV0ZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlc1tqJDFdLnNpemUgJiYgcHJvZ3JhbS5hdHRyaWJ1dGVEYXRhW2okMV0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tqJDFdLnNpemUgPSBwcm9ncmFtLmF0dHJpYnV0ZURhdGFbaiQxXS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWF0dHJpYnV0ZXNbaiQxXS5zaXplKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigoXCJQSVhJIEdlb21ldHJ5IGF0dHJpYnV0ZSAnXCIgKyBqJDEgKyBcIicgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobGlrZWx5IHRoZSBib3VuZCBzaGFkZXIgZG9lcyBub3QgaGF2ZSB0aGUgYXR0cmlidXRlKVwiKSk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlbXBTdHJpZGVbYXR0cmlidXRlc1tqJDFdLmJ1ZmZlcl0gKz0gYXR0cmlidXRlc1tqJDFdLnNpemUgKiBieXRlU2l6ZU1hcCQxW2F0dHJpYnV0ZXNbaiQxXS50eXBlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGokMiBpbiBhdHRyaWJ1dGVzKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1tqJDJdO1xuICAgICAgICAgICAgdmFyIGF0dHJpYlNpemUgPSBhdHRyaWJ1dGUuc2l6ZTtcblxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5zdHJpZGUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodGVtcFN0cmlkZVthdHRyaWJ1dGUuYnVmZmVyXSA9PT0gYXR0cmliU2l6ZSAqIGJ5dGVTaXplTWFwJDFbYXR0cmlidXRlLnR5cGVdKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnN0cmlkZSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zdHJpZGUgPSB0ZW1wU3RyaWRlW2F0dHJpYnV0ZS5idWZmZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5zdGFydCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zdGFydCA9IHRlbXBTdGFydFthdHRyaWJ1dGUuYnVmZmVyXTtcblxuICAgICAgICAgICAgICAgIHRlbXBTdGFydFthdHRyaWJ1dGUuYnVmZmVyXSArPSBhdHRyaWJTaXplICogYnl0ZVNpemVNYXAkMVthdHRyaWJ1dGUudHlwZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YW8gPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpO1xuXG4gICAgICAgIGdsLmJpbmRWZXJ0ZXhBcnJheSh2YW8pO1xuXG4gICAgICAgIC8vIGZpcnN0IHVwZGF0ZSAtIGFuZCBjcmVhdGUgdGhlIGJ1ZmZlcnMhXG4gICAgICAgIC8vIG9ubHkgY3JlYXRlIGEgZ2wgYnVmZmVyIGlmIGl0IGFjdHVhbGx5IGdldHNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc1tpXTtcblxuICAgICAgICAgICAgaWYgKCFidWZmZXIuX2dsQnVmZmVyc1tDT05URVhUX1VJRF0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYnVmZmVyLl9nbEJ1ZmZlcnNbQ09OVEVYVF9VSURdID0gbmV3IEdMQnVmZmVyKGdsLmNyZWF0ZUJ1ZmZlcigpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZWRCdWZmZXJzW2J1ZmZlci5pZF0gPSBidWZmZXI7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmRpc3Bvc2VSdW5uZXIuYWRkKHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBidWZmZXIuX2dsQnVmZmVyc1tDT05URVhUX1VJRF0ucmVmQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8gLSBtYXliZSBtYWtlIHRoaXMgYSBkYXRhIG9iamVjdD9cbiAgICAgICAgLy8gbGV0cyB3YWl0IHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGZpcnN0IVxuXG4gICAgICAgIHRoaXMuYWN0aXZhdGVWYW8oZ2VvbWV0cnksIHByb2dyYW0pO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZVZhbyA9IHZhbztcblxuICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGNhY2hlIVxuICAgICAgICB2YW9PYmplY3RIYXNoW3Byb2dyYW0uaWRdID0gdmFvO1xuICAgICAgICB2YW9PYmplY3RIYXNoW3NpZ25hdHVyZV0gPSB2YW87XG5cbiAgICAgICAgcmV0dXJuIHZhbztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgYnVmZmVyXG4gICAgICogQHBhcmFtIHtQSVhJLkJ1ZmZlcn0gYnVmZmVyIGJ1ZmZlciB3aXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0TG9zdD1mYWxzZV0gSWYgY29udGV4dCB3YXMgbG9zdCwgd2Ugc3VwcHJlc3MgZGVsZXRlVmVydGV4QXJyYXlcbiAgICAgKi9cbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuZGlzcG9zZUJ1ZmZlciA9IGZ1bmN0aW9uIGRpc3Bvc2VCdWZmZXIgKGJ1ZmZlciwgY29udGV4dExvc3QpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMubWFuYWdlZEJ1ZmZlcnNbYnVmZmVyLmlkXSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMubWFuYWdlZEJ1ZmZlcnNbYnVmZmVyLmlkXTtcblxuICAgICAgICB2YXIgZ2xCdWZmZXIgPSBidWZmZXIuX2dsQnVmZmVyc1t0aGlzLkNPTlRFWFRfVUlEXTtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICBidWZmZXIuZGlzcG9zZVJ1bm5lci5yZW1vdmUodGhpcyk7XG5cbiAgICAgICAgaWYgKCFnbEJ1ZmZlcilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250ZXh0TG9zdClcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKGdsQnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgYnVmZmVyLl9nbEJ1ZmZlcnNbdGhpcy5DT05URVhUX1VJRF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIGdlb21ldHJ5XG4gICAgICogQHBhcmFtIHtQSVhJLkdlb21ldHJ5fSBnZW9tZXRyeSBHZW9tZXRyeSB3aXRoIGJ1ZmZlcnMuIE9ubHkgVkFPIHdpbGwgYmUgZGlzcG9zZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0TG9zdD1mYWxzZV0gSWYgY29udGV4dCB3YXMgbG9zdCwgd2Ugc3VwcHJlc3MgZGVsZXRlVmVydGV4QXJyYXlcbiAgICAgKi9cbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuZGlzcG9zZUdlb21ldHJ5ID0gZnVuY3Rpb24gZGlzcG9zZUdlb21ldHJ5IChnZW9tZXRyeSwgY29udGV4dExvc3QpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMubWFuYWdlZEdlb21ldHJpZXNbZ2VvbWV0cnkuaWRdKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy5tYW5hZ2VkR2VvbWV0cmllc1tnZW9tZXRyeS5pZF07XG5cbiAgICAgICAgdmFyIHZhb3MgPSBnZW9tZXRyeS5nbFZlcnRleEFycmF5T2JqZWN0c1t0aGlzLkNPTlRFWFRfVUlEXTtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdmFyIGJ1ZmZlcnMgPSBnZW9tZXRyeS5idWZmZXJzO1xuXG4gICAgICAgIGdlb21ldHJ5LmRpc3Bvc2VSdW5uZXIucmVtb3ZlKHRoaXMpO1xuXG4gICAgICAgIGlmICghdmFvcylcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYnVmID0gYnVmZmVyc1tpXS5fZ2xCdWZmZXJzW3RoaXMuQ09OVEVYVF9VSURdO1xuXG4gICAgICAgICAgICBidWYucmVmQ291bnQtLTtcbiAgICAgICAgICAgIGlmIChidWYucmVmQ291bnQgPT09IDAgJiYgIWNvbnRleHRMb3N0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZUJ1ZmZlcihidWZmZXJzW2ldLCBjb250ZXh0TG9zdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnRleHRMb3N0KVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKHZhciB2YW9JZCBpbiB2YW9zKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBvbmx5IHNpZ25hdHVyZXMsIGV2ZXJ5dGhpbmcgZWxzZSBhcmUgY29waWVzXG4gICAgICAgICAgICAgICAgaWYgKHZhb0lkWzBdID09PSAnZycpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFvID0gdmFvc1t2YW9JZF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVZhbyA9PT0gdmFvKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuYmluZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVZlcnRleEFycmF5KHZhbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGdlb21ldHJ5LmdsVmVydGV4QXJyYXlPYmplY3RzW3RoaXMuQ09OVEVYVF9VSURdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBkaXNwb3NlIGFsbCBXZWJHTCByZXNvdXJjZXMgb2YgYWxsIG1hbmFnZWQgZ2VvbWV0cmllcyBhbmQgYnVmZmVyc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbnRleHRMb3N0PWZhbHNlXSBJZiBjb250ZXh0IHdhcyBsb3N0LCB3ZSBzdXBwcmVzcyBgZ2wuZGVsZXRlYCBjYWxsc1xuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS5kaXNwb3NlQWxsID0gZnVuY3Rpb24gZGlzcG9zZUFsbCAoY29udGV4dExvc3QpXG4gICAge1xuICAgICAgICB2YXIgYWxsID0gT2JqZWN0LmtleXModGhpcy5tYW5hZ2VkR2VvbWV0cmllcyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUdlb21ldHJ5KHRoaXMubWFuYWdlZEdlb21ldHJpZXNbYWxsW2ldXSwgY29udGV4dExvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGFsbCA9IE9iamVjdC5rZXlzKHRoaXMubWFuYWdlZEJ1ZmZlcnMpO1xuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBhbGwubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQnVmZmVyKHRoaXMubWFuYWdlZEJ1ZmZlcnNbYWxsW2kkMV1dLCBjb250ZXh0TG9zdCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgdmVydGV4IGFycmF5IG9iamVjdFxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5HZW9tZXRyeX0gZ2VvbWV0cnkgLSBHZW9tZXRyeSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7UElYSS5Qcm9ncmFtfSBwcm9ncmFtIC0gU2hhZGVyIHByb2dyYW0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBHZW9tZXRyeVN5c3RlbS5wcm90b3R5cGUuYWN0aXZhdGVWYW8gPSBmdW5jdGlvbiBhY3RpdmF0ZVZhbyAoZ2VvbWV0cnksIHByb2dyYW0pXG4gICAge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgICB2YXIgQ09OVEVYVF9VSUQgPSB0aGlzLkNPTlRFWFRfVUlEO1xuICAgICAgICB2YXIgYnVmZmVycyA9IGdlb21ldHJ5LmJ1ZmZlcnM7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuICAgICAgICBpZiAoZ2VvbWV0cnkuaW5kZXhCdWZmZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVwZGF0ZSB0aGUgaW5kZXggYnVmZmVyIGlmIHdlIGhhdmUgb25lLi5cbiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGdlb21ldHJ5LmluZGV4QnVmZmVyLl9nbEJ1ZmZlcnNbQ09OVEVYVF9VSURdLmJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFzdEJ1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgLy8gYWRkIGEgbmV3IG9uZSFcbiAgICAgICAgZm9yICh2YXIgaiBpbiBhdHRyaWJ1dGVzKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBidWZmZXJzW2F0dHJpYnV0ZS5idWZmZXJdO1xuICAgICAgICAgICAgdmFyIGdsQnVmZmVyID0gYnVmZmVyLl9nbEJ1ZmZlcnNbQ09OVEVYVF9VSURdO1xuXG4gICAgICAgICAgICBpZiAocHJvZ3JhbS5hdHRyaWJ1dGVEYXRhW2pdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0QnVmZmVyICE9PSBnbEJ1ZmZlcilcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBnbEJ1ZmZlci5idWZmZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxhc3RCdWZmZXIgPSBnbEJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZURhdGFbal0ubG9jYXRpb247XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIGludHJvZHVjZSBzdGF0ZSBhZ2FpblxuICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBvcHRpbWlzZSB0aGlzIGZvciBvbGRlciBkZXZpY2VzIHRoYXQgaGF2ZSBubyBWQU9zXG4gICAgICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS50eXBlIHx8IGdsLkZMT0FULFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUubm9ybWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnN0cmlkZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnN0YXJ0KTtcblxuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGNhbGN1bGF0ZSBpbnN0YW5jZSBjb3VudCBiYXNlZCBvZiB0aGlzLi4uXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0luc3RhbmNlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKGxvY2F0aW9uLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2VvbWV0cnkgZXJyb3IsIEdQVSBJbnN0YW5jaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IHRoZSBnZW9tZXRyeVxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHR5cGUgLSB0aGUgdHlwZSBwcmltaXRpdmUgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtzaXplXSAtIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3N0YXJ0XSAtIFN0YXJ0aW5nIGluZGV4XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbnN0YW5jZUNvdW50XSAtIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIHRoZSBzZXQgb2YgZWxlbWVudHMgdG8gZXhlY3V0ZVxuICAgICAqL1xuICAgIEdlb21ldHJ5U3lzdGVtLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gZHJhdyAodHlwZSwgc2l6ZSwgc3RhcnQsIGluc3RhbmNlQ291bnQpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgdmFyIGdsID0gcmVmLmdsO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLl9hY3RpdmVHZW9tZXRyeTtcblxuICAgICAgICAvLyBUT0RPLi4gdGhpcyBzaG91bGQgbm90IGNoYW5nZSBzbyBtYXliZSBjYWNoZSB0aGUgZnVuY3Rpb24/XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LmluZGV4QnVmZmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYnl0ZVNpemUgPSBnZW9tZXRyeS5pbmRleEJ1ZmZlci5kYXRhLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgdmFyIGdsVHlwZSA9IGJ5dGVTaXplID09PSAyID8gZ2wuVU5TSUdORURfU0hPUlQgOiBnbC5VTlNJR05FRF9JTlQ7XG5cbiAgICAgICAgICAgIGlmIChieXRlU2l6ZSA9PT0gMiB8fCAoYnl0ZVNpemUgPT09IDQgJiYgdGhpcy5jYW5Vc2VVSW50MzJFbGVtZW50SW5kZXgpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeS5pbnN0YW5jZWQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgICAgICAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0eXBlLCBzaXplIHx8IGdlb21ldHJ5LmluZGV4QnVmZmVyLmRhdGEubGVuZ3RoLCBnbFR5cGUsIChzdGFydCB8fCAwKSAqIGJ5dGVTaXplLCBpbnN0YW5jZUNvdW50IHx8IDEpO1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuICAgICAgICAgICAgICAgICAgICBnbC5kcmF3RWxlbWVudHModHlwZSwgc2l6ZSB8fCBnZW9tZXRyeS5pbmRleEJ1ZmZlci5kYXRhLmxlbmd0aCwgZ2xUeXBlLCAoc3RhcnQgfHwgMCkgKiBieXRlU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3Vuc3VwcG9ydGVkIGluZGV4IGJ1ZmZlciB0eXBlOiB1aW50MzInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS5pbnN0YW5jZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE8gbmVlZCBhIGJldHRlciB3YXkgdG8gY2FsY3VsYXRlIHNpemUuLlxuICAgICAgICAgICAgZ2wuZHJhd0FycmF5c0luc3RhbmNlZCh0eXBlLCBzdGFydCwgc2l6ZSB8fCBnZW9tZXRyeS5nZXRTaXplKCksIGluc3RhbmNlQ291bnQgfHwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKHR5cGUsIHN0YXJ0LCBzaXplIHx8IGdlb21ldHJ5LmdldFNpemUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5iaW5kL3Jlc2V0IGV2ZXJ5dGhpbmdcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgR2VvbWV0cnlTeXN0ZW0ucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uIHVuYmluZCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbC5iaW5kVmVydGV4QXJyYXkobnVsbCk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVZhbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUdlb21ldHJ5ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEdlb21ldHJ5U3lzdGVtO1xufShTeXN0ZW0pKTtcblxuLyoqXG4gKiBDb21wb25lbnQgZm9yIG1hc2tlZCBlbGVtZW50c1xuICpcbiAqIEhvbGRzIG1hc2sgbW9kZSBhbmQgdGVtcG9yYXJ5IGRhdGEgYWJvdXQgY3VycmVudCBtYXNrXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgTWFza0RhdGEgPSBmdW5jdGlvbiBNYXNrRGF0YShtYXNrT2JqZWN0KVxue1xuICAgIC8qKlxuICAgICAqIE1hc2sgdHlwZVxuICAgICAqIEBtZW1iZXIge1BJWEkuTUFTS19UWVBFU31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBNQVNLX1RZUEVTLk5PTkU7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHdlIGtub3cgdGhlIG1hc2sgdHlwZSBiZWZvcmVoYW5kXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgdGhpcy5hdXRvRGV0ZWN0ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdoaWNoIGVsZW1lbnQgd2UgdXNlIHRvIG1hc2tcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkRpc3BsYXlPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5tYXNrT2JqZWN0ID0gbWFza09iamVjdCB8fCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBpdCBiZWxvbmdzIHRvIE1hc2tTeXN0ZW0gcG9vbFxuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5wb29sZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBvZiB0aGUgdHlwZVxuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pc01hc2tEYXRhID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFN0ZW5jaWwgY291bnRlciBhYm92ZSB0aGUgbWFzayBpbiBzdGFja1xuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3N0ZW5jaWxDb3VudGVyID0gMDtcbiAgICAvKipcbiAgICAgKiBTY2lzc29yIGNvdW50ZXIgYWJvdmUgdGhlIG1hc2sgaW4gc3RhY2tcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9zY2lzc29yQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTY2lzc29yIG9wZXJhdGlvbiBhYm92ZSB0aGUgbWFzayBpbiBzdGFjay5cbiAgICAgKiBOdWxsIGlmIF9zY2lzc29yQ291bnRlciBpcyB6ZXJvLCByZWN0YW5nbGUgaW5zdGFuY2UgaWYgcG9zaXRpdmUuXG4gICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICovXG4gICAgdGhpcy5fc2Npc3NvclJlY3QgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGFyZ2V0ZWQgZWxlbWVudC4gVGVtcG9yYXJ5IHZhcmlhYmxlIHNldCBieSBNYXNrU3lzdGVtXG4gICAgICogQG1lbWJlciB7UElYSS5EaXNwbGF5T2JqZWN0fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fdGFyZ2V0ID0gbnVsbDtcbn07XG5cbi8qKlxuICogcmVzZXRzIHRoZSBtYXNrIGRhdGEgYWZ0ZXIgcG9wTWFzaygpXG4gKi9cbk1hc2tEYXRhLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0ICgpXG57XG4gICAgaWYgKHRoaXMucG9vbGVkKVxuICAgIHtcbiAgICAgICAgdGhpcy5tYXNrT2JqZWN0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLnR5cGUgPSBNQVNLX1RZUEVTLk5PTkU7XG5cbiAgICAgICAgdGhpcy5hdXRvRGV0ZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl90YXJnZXQgPSBudWxsO1xufTtcblxuLyoqXG4gKiBjb3BpZXMgY291bnRlcnMgZnJvbSBtYXNrRGF0YSBhYm92ZSwgY2FsbGVkIGZyb20gcHVzaE1hc2soKVxuICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhfG51bGx9IG1hc2tBYm92ZVxuICovXG5NYXNrRGF0YS5wcm90b3R5cGUuY29weUNvdW50ZXJzT3JSZXNldCA9IGZ1bmN0aW9uIGNvcHlDb3VudGVyc09yUmVzZXQgKG1hc2tBYm92ZSlcbntcbiAgICBpZiAobWFza0Fib3ZlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3RlbmNpbENvdW50ZXIgPSBtYXNrQWJvdmUuX3N0ZW5jaWxDb3VudGVyO1xuICAgICAgICB0aGlzLl9zY2lzc29yQ291bnRlciA9IG1hc2tBYm92ZS5fc2Npc3NvckNvdW50ZXI7XG4gICAgICAgIHRoaXMuX3NjaXNzb3JSZWN0ID0gbWFza0Fib3ZlLl9zY2lzc29yUmVjdDtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3RlbmNpbENvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zY2lzc29yQ291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NjaXNzb3JSZWN0ID0gbnVsbDtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBtZXRob2QgY29tcGlsZVByb2dyYW1cbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgUElYSS5nbENvcmUuc2hhZGVyXG4gKiBAcGFyYW0gZ2wge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gVGhlIGN1cnJlbnQgV2ViR0wgY29udGV4dCB7V2ViR0xQcm9ncmFtfVxuICogQHBhcmFtIHZlcnRleFNyYyB7c3RyaW5nfHN0cmluZ1tdfSBUaGUgdmVydGV4IHNoYWRlciBzb3VyY2UgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBmcmFnbWVudFNyYyB7c3RyaW5nfHN0cmluZ1tdfSBUaGUgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIGF0dHJpYnV0ZUxvY2F0aW9ucyB7T2JqZWN0fSBBbiBhdHRyaWJ1dGUgbG9jYXRpb24gbWFwIHRoYXQgbGV0cyB5b3UgbWFudWFsbHkgc2V0IHRoZSBhdHRyaWJ1dGUgbG9jYXRpb25zXG4gKiBAcmV0dXJuIHtXZWJHTFByb2dyYW19IHRoZSBzaGFkZXIgcHJvZ3JhbVxuICovXG5mdW5jdGlvbiBjb21waWxlUHJvZ3JhbShnbCwgdmVydGV4U3JjLCBmcmFnbWVudFNyYywgYXR0cmlidXRlTG9jYXRpb25zKVxue1xuICAgIHZhciBnbFZlcnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTcmMpO1xuICAgIHZhciBnbEZyYWdTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U3JjKTtcblxuICAgIHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGdsVmVydFNoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGdsRnJhZ1NoYWRlcik7XG5cbiAgICAvLyBvcHRpb25hbGx5LCBzZXQgdGhlIGF0dHJpYnV0ZXMgbWFudWFsbHkgZm9yIHRoZSBwcm9ncmFtIHJhdGhlciB0aGFuIGxldHRpbmcgV2ViR0wgZGVjaWRlLi5cbiAgICBpZiAoYXR0cmlidXRlTG9jYXRpb25zKVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBhdHRyaWJ1dGVMb2NhdGlvbnMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGVMb2NhdGlvbnNbaV0sIGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICAvLyBpZiBsaW5raW5nIGZhaWxzLCB0aGVuIGxvZyBhbmQgY2xlYW51cFxuICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpXG4gICAge1xuICAgICAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihnbFZlcnRTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSlcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHZlcnRleFNyYyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGdsLmdldFNoYWRlckluZm9Mb2coZ2xWZXJ0U2hhZGVyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihnbEZyYWdTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSlcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGZyYWdtZW50U3JjKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ2wuZ2V0U2hhZGVySW5mb0xvZyhnbEZyYWdTaGFkZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BpeGkuanMgRXJyb3I6IENvdWxkIG5vdCBpbml0aWFsaXplIHNoYWRlci4nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2wuVkFMSURBVEVfU1RBVFVTJywgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignZ2wuZ2V0RXJyb3IoKScsIGdsLmdldEVycm9yKCkpO1xuXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgcHJvZ3JhbSBpbmZvIGxvZywgbG9nIGl0XG4gICAgICAgIGlmIChnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSAhPT0gJycpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUGl4aS5qcyBXYXJuaW5nOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgcHJvZ3JhbSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2xlYW4gdXAgc29tZSBzaGFkZXJzXG4gICAgZ2wuZGVsZXRlU2hhZGVyKGdsVmVydFNoYWRlcik7XG4gICAgZ2wuZGVsZXRlU2hhZGVyKGdsRnJhZ1NoYWRlcik7XG5cbiAgICByZXR1cm4gcHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGdsIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IFRoZSBjdXJyZW50IFdlYkdMIGNvbnRleHQge1dlYkdMUHJvZ3JhbX1cbiAqIEBwYXJhbSB0eXBlIHtOdW1iZXJ9IHRoZSB0eXBlLCBjYW4gYmUgZWl0aGVyIFZFUlRFWF9TSEFERVIgb3IgRlJBR01FTlRfU0hBREVSXG4gKiBAcGFyYW0gdmVydGV4U3JjIHtzdHJpbmd8c3RyaW5nW119IFRoZSB2ZXJ0ZXggc2hhZGVyIHNvdXJjZSBhcyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHJldHVybiB7V2ViR0xTaGFkZXJ9IHRoZSBzaGFkZXJcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgdHlwZSwgc3JjKVxue1xuICAgIHZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSk7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzcmMpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIHJldHVybiBzaGFkZXI7XG59XG5cbi8qKlxuICogQG1ldGhvZCBkZWZhdWx0VmFsdWVcbiAqIEBtZW1iZXJvZiBQSVhJLmdsQ29yZS5zaGFkZXJcbiAqIEBwYXJhbSB0eXBlIHtTdHJpbmd9IFR5cGUgb2YgdmFsdWVcbiAqIEBwYXJhbSBzaXplIHtOdW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0VmFsdWUodHlwZSwgc2l6ZSlcbntcbiAgICBzd2l0Y2ggKHR5cGUpXG4gICAge1xuICAgICAgICBjYXNlICdmbG9hdCc6XG4gICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICBjYXNlICd2ZWMyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDIgKiBzaXplKTtcblxuICAgICAgICBjYXNlICd2ZWMzJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDMgKiBzaXplKTtcblxuICAgICAgICBjYXNlICd2ZWM0JzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KDQgKiBzaXplKTtcblxuICAgICAgICBjYXNlICdpbnQnOlxuICAgICAgICBjYXNlICdzYW1wbGVyMkQnOlxuICAgICAgICBjYXNlICdzYW1wbGVyMkRBcnJheSc6XG4gICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICBjYXNlICdpdmVjMic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoMiAqIHNpemUpO1xuXG4gICAgICAgIGNhc2UgJ2l2ZWMzJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheSgzICogc2l6ZSk7XG5cbiAgICAgICAgY2FzZSAnaXZlYzQnOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KDQgKiBzaXplKTtcblxuICAgICAgICBjYXNlICdib29sJzpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjYXNlICdidmVjMic6XG5cbiAgICAgICAgICAgIHJldHVybiBib29sZWFuQXJyYXkoMiAqIHNpemUpO1xuXG4gICAgICAgIGNhc2UgJ2J2ZWMzJzpcbiAgICAgICAgICAgIHJldHVybiBib29sZWFuQXJyYXkoMyAqIHNpemUpO1xuXG4gICAgICAgIGNhc2UgJ2J2ZWM0JzpcbiAgICAgICAgICAgIHJldHVybiBib29sZWFuQXJyYXkoNCAqIHNpemUpO1xuXG4gICAgICAgIGNhc2UgJ21hdDInOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoWzEsIDAsXG4gICAgICAgICAgICAgICAgMCwgMV0pO1xuXG4gICAgICAgIGNhc2UgJ21hdDMnOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoWzEsIDAsIDAsXG4gICAgICAgICAgICAgICAgMCwgMSwgMCxcbiAgICAgICAgICAgICAgICAwLCAwLCAxXSk7XG5cbiAgICAgICAgY2FzZSAnbWF0NCc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCxcbiAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLFxuICAgICAgICAgICAgICAgIDAsIDAsIDEsIDAsXG4gICAgICAgICAgICAgICAgMCwgMCwgMCwgMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBib29sZWFuQXJyYXkoc2l6ZSlcbntcbiAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkoc2l6ZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgIHtcbiAgICAgICAgYXJyYXlbaV0gPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbnZhciB1bmtub3duQ29udGV4dCA9IHt9O1xudmFyIGNvbnRleHQgPSB1bmtub3duQ29udGV4dDtcblxuLyoqXG4gKiByZXR1cm5zIGEgbGl0dGxlIFdlYkdMIGNvbnRleHQgdG8gdXNlIGZvciBwcm9ncmFtIGluc3BlY3Rpb24uXG4gKlxuICogQHN0YXRpY1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGEgZ2wgY29udGV4dCB0byB0ZXN0IHdpdGhcbiAqL1xuZnVuY3Rpb24gZ2V0VGVzdENvbnRleHQoKVxue1xuICAgIGlmIChjb250ZXh0ID09PSB1bmtub3duQ29udGV4dCB8fCAoY29udGV4dCAmJiBjb250ZXh0LmlzQ29udGV4dExvc3QoKSkpXG4gICAge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICAgICAgdmFyIGdsO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5QUkVGRVJfRU5WID49IEVOVi5XRUJHTDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicsIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZ2wpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywge30pXG4gICAgICAgICAgICB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywge30pO1xuXG4gICAgICAgICAgICBpZiAoIWdsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGZhaWwsIG5vdCBhYmxlIHRvIGdldCBhIGNvbnRleHRcbiAgICAgICAgICAgICAgICBnbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIHNoYWRlciB0ZXN0aW5nLi5cbiAgICAgICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2RyYXdfYnVmZmVycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dCA9IGdsO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xufVxuXG52YXIgbWF4RnJhZ21lbnRQcmVjaXNpb247XG5cbmZ1bmN0aW9uIGdldE1heEZyYWdtZW50UHJlY2lzaW9uKClcbntcbiAgICBpZiAoIW1heEZyYWdtZW50UHJlY2lzaW9uKVxuICAgIHtcbiAgICAgICAgbWF4RnJhZ21lbnRQcmVjaXNpb24gPSBQUkVDSVNJT04uTUVESVVNO1xuICAgICAgICB2YXIgZ2wgPSBnZXRUZXN0Q29udGV4dCgpO1xuXG4gICAgICAgIGlmIChnbClcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgc2hhZGVyRnJhZ21lbnQgPSBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUKTtcblxuICAgICAgICAgICAgICAgIG1heEZyYWdtZW50UHJlY2lzaW9uID0gc2hhZGVyRnJhZ21lbnQucHJlY2lzaW9uID8gUFJFQ0lTSU9OLkhJR0ggOiBQUkVDSVNJT04uTUVESVVNO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heEZyYWdtZW50UHJlY2lzaW9uO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGZsb2F0IHByZWNpc2lvbiBvbiB0aGUgc2hhZGVyLCBlbnN1cmluZyB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSByZXF1ZXN0IHByZWNpc2lvbi5cbiAqIElmIHRoZSBwcmVjaXNpb24gaXMgYWxyZWFkeSBwcmVzZW50LCBpdCBqdXN0IGVuc3VyZXMgdGhhdCB0aGUgZGV2aWNlIGlzIGFibGUgdG8gaGFuZGxlIGl0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNoYWRlciBzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRQcmVjaXNpb24gLSBUaGUgcmVxdWVzdCBmbG9hdCBwcmVjaXNpb24gb2YgdGhlIHNoYWRlci4gT3B0aW9ucyBhcmUgJ2xvd3AnLCAnbWVkaXVtcCcgb3IgJ2hpZ2hwJy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXhTdXBwb3J0ZWRQcmVjaXNpb24gLSBUaGUgbWF4aW11bSBwcmVjaXNpb24gdGhlIHNoYWRlciBzdXBwb3J0cy5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IG1vZGlmaWVkIHNoYWRlciBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gc2V0UHJlY2lzaW9uKHNyYywgcmVxdWVzdGVkUHJlY2lzaW9uLCBtYXhTdXBwb3J0ZWRQcmVjaXNpb24pXG57XG4gICAgaWYgKHNyYy5zdWJzdHJpbmcoMCwgOSkgIT09ICdwcmVjaXNpb24nKVxuICAgIHtcbiAgICAgICAgLy8gbm8gcHJlY2lzaW9uIHN1cHBsaWVkLCBzbyBQaXhpSlMgd2lsbCBhZGQgdGhlIHJlcXVlc3RlZCBsZXZlbC5cbiAgICAgICAgdmFyIHByZWNpc2lvbiA9IHJlcXVlc3RlZFByZWNpc2lvbjtcblxuICAgICAgICAvLyBJZiBoaWdocCBpcyByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQsIGRvd25ncmFkZSBwcmVjaXNpb24gdG8gYSBsZXZlbCBhbGwgZGV2aWNlcyBzdXBwb3J0LlxuICAgICAgICBpZiAocmVxdWVzdGVkUHJlY2lzaW9uID09PSBQUkVDSVNJT04uSElHSCAmJiBtYXhTdXBwb3J0ZWRQcmVjaXNpb24gIT09IFBSRUNJU0lPTi5ISUdIKVxuICAgICAgICB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSBQUkVDSVNJT04uTUVESVVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcInByZWNpc2lvbiBcIiArIHByZWNpc2lvbiArIFwiIGZsb2F0O1xcblwiICsgc3JjKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWF4U3VwcG9ydGVkUHJlY2lzaW9uICE9PSBQUkVDSVNJT04uSElHSCAmJiBzcmMuc3Vic3RyaW5nKDAsIDE1KSA9PT0gJ3ByZWNpc2lvbiBoaWdocCcpXG4gICAge1xuICAgICAgICAvLyBwcmVjaXNpb24gd2FzIHN1cHBsaWVkLCBidXQgYXQgYSBsZXZlbCB0aGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0LCBzbyBkb3duZ3JhZGluZyB0byBtZWRpdW1wLlxuICAgICAgICByZXR1cm4gc3JjLnJlcGxhY2UoJ3ByZWNpc2lvbiBoaWdocCcsICdwcmVjaXNpb24gbWVkaXVtcCcpO1xuICAgIH1cblxuICAgIHJldHVybiBzcmM7XG59XG5cbnZhciBHTFNMX1RPX1NJWkUgPSB7XG4gICAgZmxvYXQ6ICAgIDEsXG4gICAgdmVjMjogICAgIDIsXG4gICAgdmVjMzogICAgIDMsXG4gICAgdmVjNDogICAgIDQsXG5cbiAgICBpbnQ6ICAgICAgMSxcbiAgICBpdmVjMjogICAgMixcbiAgICBpdmVjMzogICAgMyxcbiAgICBpdmVjNDogICAgNCxcblxuICAgIGJvb2w6ICAgICAxLFxuICAgIGJ2ZWMyOiAgICAyLFxuICAgIGJ2ZWMzOiAgICAzLFxuICAgIGJ2ZWM0OiAgICA0LFxuXG4gICAgbWF0MjogICAgIDQsXG4gICAgbWF0MzogICAgIDksXG4gICAgbWF0NDogICAgIDE2LFxuXG4gICAgc2FtcGxlcjJEOiAgMSxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBtZXRob2QgbWFwU2l6ZVxuICogQG1lbWJlcm9mIFBJWEkuZ2xDb3JlLnNoYWRlclxuICogQHBhcmFtIHR5cGUge1N0cmluZ31cbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gbWFwU2l6ZSh0eXBlKVxue1xuICAgIHJldHVybiBHTFNMX1RPX1NJWkVbdHlwZV07XG59XG5cbnZhciBHTF9UQUJMRSA9IG51bGw7XG5cbnZhciBHTF9UT19HTFNMX1RZUEVTID0ge1xuICAgIEZMT0FUOiAgICAgICAnZmxvYXQnLFxuICAgIEZMT0FUX1ZFQzI6ICAndmVjMicsXG4gICAgRkxPQVRfVkVDMzogICd2ZWMzJyxcbiAgICBGTE9BVF9WRUM0OiAgJ3ZlYzQnLFxuXG4gICAgSU5UOiAgICAgICAgICdpbnQnLFxuICAgIElOVF9WRUMyOiAgICAnaXZlYzInLFxuICAgIElOVF9WRUMzOiAgICAnaXZlYzMnLFxuICAgIElOVF9WRUM0OiAgICAnaXZlYzQnLFxuXG4gICAgQk9PTDogICAgICAgICdib29sJyxcbiAgICBCT09MX1ZFQzI6ICAgJ2J2ZWMyJyxcbiAgICBCT09MX1ZFQzM6ICAgJ2J2ZWMzJyxcbiAgICBCT09MX1ZFQzQ6ICAgJ2J2ZWM0JyxcblxuICAgIEZMT0FUX01BVDI6ICAnbWF0MicsXG4gICAgRkxPQVRfTUFUMzogICdtYXQzJyxcbiAgICBGTE9BVF9NQVQ0OiAgJ21hdDQnLFxuXG4gICAgU0FNUExFUl8yRDogICdzYW1wbGVyMkQnLFxuICAgIFNBTVBMRVJfQ1VCRTogICdzYW1wbGVyQ3ViZScsXG4gICAgU0FNUExFUl8yRF9BUlJBWTogICdzYW1wbGVyMkRBcnJheScsXG59O1xuXG5mdW5jdGlvbiBtYXBUeXBlKGdsLCB0eXBlKVxue1xuICAgIGlmICghR0xfVEFCTEUpXG4gICAge1xuICAgICAgICB2YXIgdHlwZU5hbWVzID0gT2JqZWN0LmtleXMoR0xfVE9fR0xTTF9UWVBFUyk7XG5cbiAgICAgICAgR0xfVEFCTEUgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVOYW1lcy5sZW5ndGg7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRuID0gdHlwZU5hbWVzW2ldO1xuXG4gICAgICAgICAgICBHTF9UQUJMRVtnbFt0bl1dID0gR0xfVE9fR0xTTF9UWVBFU1t0bl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gR0xfVEFCTEVbdHlwZV07XG59XG5cbi8vIGN2ID0gQ2FjaGVkVmFsdWVcbi8vIHYgPSB2YWx1ZVxuLy8gdWQgPSB1bmlmb3JtRGF0YVxuLy8gdXYgPSB1bmlmb3JtVmFsdWVcbi8vIGwgPSBsb2NhdGlvblxudmFyIEdMU0xfVE9fU0lOR0xFX1NFVFRFUlNfQ0FDSEVEID0ge1xuXG4gICAgZmxvYXQ6IFwiXFxuICAgIGlmKGN2ICE9PSB2KVxcbiAgICB7XFxuICAgICAgICBjdi52ID0gdjtcXG4gICAgICAgIGdsLnVuaWZvcm0xZihsb2NhdGlvbiwgdilcXG4gICAgfVwiLFxuXG4gICAgdmVjMjogXCJcXG4gICAgaWYoY3ZbMF0gIT09IHZbMF0gfHwgY3ZbMV0gIT09IHZbMV0pXFxuICAgIHtcXG4gICAgICAgIGN2WzBdID0gdlswXTtcXG4gICAgICAgIGN2WzFdID0gdlsxXTtcXG4gICAgICAgIGdsLnVuaWZvcm0yZihsb2NhdGlvbiwgdlswXSwgdlsxXSlcXG4gICAgfVwiLFxuXG4gICAgdmVjMzogXCJcXG4gICAgaWYoY3ZbMF0gIT09IHZbMF0gfHwgY3ZbMV0gIT09IHZbMV0gfHwgY3ZbMl0gIT09IHZbMl0pXFxuICAgIHtcXG4gICAgICAgIGN2WzBdID0gdlswXTtcXG4gICAgICAgIGN2WzFdID0gdlsxXTtcXG4gICAgICAgIGN2WzJdID0gdlsyXTtcXG5cXG4gICAgICAgIGdsLnVuaWZvcm0zZihsb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSlcXG4gICAgfVwiLFxuXG4gICAgdmVjNDogICAgICdnbC51bmlmb3JtNGYobG9jYXRpb24sIHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pJyxcblxuICAgIGludDogICAgICAnZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2KScsXG4gICAgaXZlYzI6ICAgICdnbC51bmlmb3JtMmkobG9jYXRpb24sIHZbMF0sIHZbMV0pJyxcbiAgICBpdmVjMzogICAgJ2dsLnVuaWZvcm0zaShsb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSknLFxuICAgIGl2ZWM0OiAgICAnZ2wudW5pZm9ybTRpKGxvY2F0aW9uLCB2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKScsXG5cbiAgICBib29sOiAgICAgJ2dsLnVuaWZvcm0xaShsb2NhdGlvbiwgdiknLFxuICAgIGJ2ZWMyOiAgICAnZ2wudW5pZm9ybTJpKGxvY2F0aW9uLCB2WzBdLCB2WzFdKScsXG4gICAgYnZlYzM6ICAgICdnbC51bmlmb3JtM2kobG9jYXRpb24sIHZbMF0sIHZbMV0sIHZbMl0pJyxcbiAgICBidmVjNDogICAgJ2dsLnVuaWZvcm00aShsb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSknLFxuXG4gICAgbWF0MjogICAgICdnbC51bmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBmYWxzZSwgdiknLFxuICAgIG1hdDM6ICAgICAnZ2wudW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgZmFsc2UsIHYpJyxcbiAgICBtYXQ0OiAgICAgJ2dsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCB2KScsXG5cbiAgICBzYW1wbGVyMkQ6ICAgICAgJ2dsLnVuaWZvcm0xaShsb2NhdGlvbiwgdiknLFxuICAgIHNhbXBsZXJDdWJlOiAgICAnZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2KScsXG4gICAgc2FtcGxlcjJEQXJyYXk6ICdnbC51bmlmb3JtMWkobG9jYXRpb24sIHYpJyxcbn07XG5cbnZhciBHTFNMX1RPX0FSUkFZX1NFVFRFUlMgPSB7XG5cbiAgICBmbG9hdDogICAgXCJnbC51bmlmb3JtMWZ2KGxvY2F0aW9uLCB2KVwiLFxuXG4gICAgdmVjMjogICAgIFwiZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdilcIixcbiAgICB2ZWMzOiAgICAgXCJnbC51bmlmb3JtM2Z2KGxvY2F0aW9uLCB2KVwiLFxuICAgIHZlYzQ6ICAgICAnZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdiknLFxuXG4gICAgbWF0NDogICAgICdnbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdiknLFxuICAgIG1hdDM6ICAgICAnZ2wudW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgZmFsc2UsIHYpJyxcbiAgICBtYXQyOiAgICAgJ2dsLnVuaWZvcm1NYXRyaXgyZnYobG9jYXRpb24sIGZhbHNlLCB2KScsXG5cbiAgICBpbnQ6ICAgICAgJ2dsLnVuaWZvcm0xaXYobG9jYXRpb24sIHYpJyxcbiAgICBpdmVjMjogICAgJ2dsLnVuaWZvcm0yaXYobG9jYXRpb24sIHYpJyxcbiAgICBpdmVjMzogICAgJ2dsLnVuaWZvcm0zaXYobG9jYXRpb24sIHYpJyxcbiAgICBpdmVjNDogICAgJ2dsLnVuaWZvcm00aXYobG9jYXRpb24sIHYpJyxcblxuICAgIGJvb2w6ICAgICAnZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdiknLFxuICAgIGJ2ZWMyOiAgICAnZ2wudW5pZm9ybTJpdihsb2NhdGlvbiwgdiknLFxuICAgIGJ2ZWMzOiAgICAnZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdiknLFxuICAgIGJ2ZWM0OiAgICAnZ2wudW5pZm9ybTRpdihsb2NhdGlvbiwgdiknLFxuXG4gICAgc2FtcGxlcjJEOiAgICAgICdnbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2KScsXG4gICAgc2FtcGxlckN1YmU6ICAgICdnbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2KScsXG4gICAgc2FtcGxlcjJEQXJyYXk6ICdnbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2KScsXG59O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaWZvcm1zU3luYyhncm91cCwgdW5pZm9ybURhdGEpXG57XG4gICAgdmFyIGZ1bmMgPSBcInZhciB2ID0gbnVsbDtcXG4gICAgdmFyIGN2ID0gbnVsbFxcbiAgICB2YXIgdCA9IDA7XFxuICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsXFxuICAgIFwiO1xuXG4gICAgZm9yICh2YXIgaSBpbiBncm91cC51bmlmb3JtcylcbiAgICB7XG4gICAgICAgIHZhciBkYXRhID0gdW5pZm9ybURhdGFbaV07XG5cbiAgICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAudW5pZm9ybXNbaV0uZ3JvdXApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnVuYyArPSBcIlxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2hhZGVyLnN5bmNVbmlmb3JtR3JvdXAodXYuXCIgKyBpICsgXCIsIHN5bmNEYXRhKTtcXG4gICAgICAgICAgICAgICAgXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyAmJiB1bmlmb3JtRGF0YVtpXS52YWx1ZSAhPT0gMCA8LS0gZG8gd2Ugc3RpbGwgbmVlZCB0aGlzP1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnZmxvYXQnICYmIGRhdGEuc2l6ZSA9PT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgZnVuYyArPSBcIlxcbiAgICAgICAgICAgIGlmKHV2LlwiICsgaSArIFwiICE9PSB1ZC5cIiArIGkgKyBcIi52YWx1ZSlcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgIHVkLlwiICsgaSArIFwiLnZhbHVlID0gdXYuXCIgKyBpICsgXCJcXG4gICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmKHVkLlwiICsgaSArIFwiLmxvY2F0aW9uLCB1di5cIiArIGkgKyBcIilcXG4gICAgICAgICAgICB9XFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuICAgICAgICBlbHNlIGlmICgoZGF0YS50eXBlID09PSAnc2FtcGxlcjJEJyB8fCBkYXRhLnR5cGUgPT09ICdzYW1wbGVyQ3ViZScgfHwgZGF0YS50eXBlID09PSAnc2FtcGxlcjJEQXJyYXknKSAmJiBkYXRhLnNpemUgPT09IDEgJiYgIWRhdGEuaXNBcnJheSlcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuICAgICAgICB7XG4gICAgICAgICAgICBmdW5jICs9IFwiXFxuXFxuICAgICAgICAgICAgdCA9IHN5bmNEYXRhLnRleHR1cmVDb3VudCsrO1xcblxcbiAgICAgICAgICAgIHJlbmRlcmVyLnRleHR1cmUuYmluZCh1di5cIiArIGkgKyBcIiwgdCk7XFxuICAgICAgICAgICAgXFxuICAgICAgICAgICAgaWYodWQuXCIgKyBpICsgXCIudmFsdWUgIT09IHQpXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICB1ZC5cIiArIGkgKyBcIi52YWx1ZSA9IHQ7XFxuICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaSh1ZC5cIiArIGkgKyBcIi5sb2NhdGlvbiwgdCk7XFxuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cXG4gICAgICAgICAgICB9XFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWF0MycgJiYgZGF0YS5zaXplID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAudW5pZm9ybXNbaV0uYSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gYW5kIHNvbWUgc21hcnQgY2FjaGluZyBkaXJ0eSBpZHMgaGVyZSFcbiAgICAgICAgICAgICAgICBmdW5jICs9IFwiXFxuICAgICAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXgzZnYodWQuXCIgKyBpICsgXCIubG9jYXRpb24sIGZhbHNlLCB1di5cIiArIGkgKyBcIi50b0FycmF5KHRydWUpKTtcXG4gICAgICAgICAgICAgICAgXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnVuYyArPSBcIlxcbiAgICAgICAgICAgICAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHVkLlwiICsgaSArIFwiLmxvY2F0aW9uLCBmYWxzZSwgdXYuXCIgKyBpICsgXCIpO1xcbiAgICAgICAgICAgICAgICBcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd2ZWMyJyAmJiBkYXRhLnNpemUgPT09IDEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE8gLSBkbyB3ZSBuZWVkIGJvdGggaGVyZT9cbiAgICAgICAgICAgIC8vIG1heWJlIHdlIGNhbiBnZXQgYXdheSB3aXRoIG9ubHkgdXNpbmcgcG9pbnRzP1xuICAgICAgICAgICAgaWYgKGdyb3VwLnVuaWZvcm1zW2ldLnggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmdW5jICs9IFwiXFxuICAgICAgICAgICAgICAgIGN2ID0gdWQuXCIgKyBpICsgXCIudmFsdWU7XFxuICAgICAgICAgICAgICAgIHYgPSB1di5cIiArIGkgKyBcIjtcXG5cXG4gICAgICAgICAgICAgICAgaWYoY3ZbMF0gIT09IHYueCB8fCBjdlsxXSAhPT0gdi55KVxcbiAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICBjdlswXSA9IHYueDtcXG4gICAgICAgICAgICAgICAgICAgIGN2WzFdID0gdi55O1xcbiAgICAgICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHVkLlwiICsgaSArIFwiLmxvY2F0aW9uLCB2LngsIHYueSk7XFxuICAgICAgICAgICAgICAgIH1cXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmdW5jICs9IFwiXFxuICAgICAgICAgICAgICAgIGN2ID0gdWQuXCIgKyBpICsgXCIudmFsdWU7XFxuICAgICAgICAgICAgICAgIHYgPSB1di5cIiArIGkgKyBcIjtcXG5cXG4gICAgICAgICAgICAgICAgaWYoY3ZbMF0gIT09IHZbMF0gfHwgY3ZbMV0gIT09IHZbMV0pXFxuICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgIGN2WzBdID0gdlswXTtcXG4gICAgICAgICAgICAgICAgICAgIGN2WzFdID0gdlsxXTtcXG4gICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih1ZC5cIiArIGkgKyBcIi5sb2NhdGlvbiwgdlswXSwgdlsxXSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAndmVjNCcgJiYgZGF0YS5zaXplID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPIC0gZG8gd2UgbmVlZCBib3RoIGhlcmU/XG4gICAgICAgICAgICAvLyBtYXliZSB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBvbmx5IHVzaW5nIHBvaW50cz9cbiAgICAgICAgICAgIGlmIChncm91cC51bmlmb3Jtc1tpXS53aWR0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZ1bmMgKz0gXCJcXG4gICAgICAgICAgICAgICAgY3YgPSB1ZC5cIiArIGkgKyBcIi52YWx1ZTtcXG4gICAgICAgICAgICAgICAgdiA9IHV2LlwiICsgaSArIFwiO1xcblxcbiAgICAgICAgICAgICAgICBpZihjdlswXSAhPT0gdi54IHx8IGN2WzFdICE9PSB2LnkgfHwgY3ZbMl0gIT09IHYud2lkdGggfHwgY3ZbM10gIT09IHYuaGVpZ2h0KVxcbiAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICBjdlswXSA9IHYueDtcXG4gICAgICAgICAgICAgICAgICAgIGN2WzFdID0gdi55O1xcbiAgICAgICAgICAgICAgICAgICAgY3ZbMl0gPSB2LndpZHRoO1xcbiAgICAgICAgICAgICAgICAgICAgY3ZbM10gPSB2LmhlaWdodDtcXG4gICAgICAgICAgICAgICAgICAgIGdsLnVuaWZvcm00Zih1ZC5cIiArIGkgKyBcIi5sb2NhdGlvbiwgdi54LCB2LnksIHYud2lkdGgsIHYuaGVpZ2h0KVxcbiAgICAgICAgICAgICAgICB9XFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnVuYyArPSBcIlxcbiAgICAgICAgICAgICAgICBjdiA9IHVkLlwiICsgaSArIFwiLnZhbHVlO1xcbiAgICAgICAgICAgICAgICB2ID0gdXYuXCIgKyBpICsgXCI7XFxuXFxuICAgICAgICAgICAgICAgIGlmKGN2WzBdICE9PSB2WzBdIHx8IGN2WzFdICE9PSB2WzFdIHx8IGN2WzJdICE9PSB2WzJdIHx8IGN2WzNdICE9PSB2WzNdKVxcbiAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICBjdlswXSA9IHZbMF07XFxuICAgICAgICAgICAgICAgICAgICBjdlsxXSA9IHZbMV07XFxuICAgICAgICAgICAgICAgICAgICBjdlsyXSA9IHZbMl07XFxuICAgICAgICAgICAgICAgICAgICBjdlszXSA9IHZbM107XFxuXFxuICAgICAgICAgICAgICAgICAgICBnbC51bmlmb3JtNGYodWQuXCIgKyBpICsgXCIubG9jYXRpb24sIHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVUeXBlID0gKGRhdGEuc2l6ZSA9PT0gMSkgPyBHTFNMX1RPX1NJTkdMRV9TRVRURVJTX0NBQ0hFRCA6IEdMU0xfVE9fQVJSQVlfU0VUVEVSUztcblxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlID0gIHRlbXBsYXRlVHlwZVtkYXRhLnR5cGVdLnJlcGxhY2UoJ2xvY2F0aW9uJywgKFwidWQuXCIgKyBpICsgXCIubG9jYXRpb25cIikpO1xuXG4gICAgICAgICAgICBmdW5jICs9IFwiXFxuICAgICAgICAgICAgY3YgPSB1ZC5cIiArIGkgKyBcIi52YWx1ZTtcXG4gICAgICAgICAgICB2ID0gdXYuXCIgKyBpICsgXCI7XFxuICAgICAgICAgICAgXCIgKyB0ZW1wbGF0ZSArIFwiO1xcblwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhlIGludHJvZHVjdGlvbiBvZiBzeW5jRGF0YSBpcyB0byBzb2x2ZSBhbiBpc3N1ZSB3aGVyZSB0ZXh0dXJlcyBpbiB1bmlmb3JtIGdyb3VwcyBhcmUgbm90IHNldCBjb3JyZWN0bHlcbiAgICAgKiB0aGUgdGV4dHVyZSBjb3VudCB3YXMgYWx3YXlzIHN0YXJ0aW5nIGZyb20gMCBpbiBlYWNoIGdyb3VwLiBUaGlzIG5lZWRzIHRvIGluY3JlbWVudCBlYWNoIHRpbWUgYSB0ZXh0dXJlIGlzIHVzZWRcbiAgICAgKiBubyBtYXR0ZXIgd2hpY2ggZ3JvdXAgaXMgYmVpbmcgdXNlZFxuICAgICAqXG4gICAgICovXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbigndWQnLCAndXYnLCAncmVuZGVyZXInLCAnc3luY0RhdGEnLCBmdW5jKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctZnVuY1xufVxuXG52YXIgZnJhZ1RlbXBsYXRlID0gW1xuICAgICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsnLFxuICAgICd2b2lkIG1haW4odm9pZCl7JyxcbiAgICAnZmxvYXQgdGVzdCA9IDAuMTsnLFxuICAgICclZm9ybG9vcCUnLFxuICAgICdnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7JyxcbiAgICAnfScgXS5qb2luKCdcXG4nKTtcblxuZnVuY3Rpb24gY2hlY2tNYXhJZlN0YXRlbWVudHNJblNoYWRlcihtYXhJZnMsIGdsKVxue1xuICAgIGlmIChtYXhJZnMgPT09IDApXG4gICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgb2YgYDBgIHBhc3NlZCB0byBgY2hlY2tNYXhJZlN0YXRlbWVudHNJblNoYWRlcmAnKTtcbiAgICB9XG5cbiAgICB2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURFUik7XG5cbiAgICB3aGlsZSAodHJ1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB7XG4gICAgICAgIHZhciBmcmFnbWVudFNyYyA9IGZyYWdUZW1wbGF0ZS5yZXBsYWNlKC8lZm9ybG9vcCUvZ2ksIGdlbmVyYXRlSWZUZXN0U3JjKG1heElmcykpO1xuXG4gICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIGZyYWdtZW50U3JjKTtcbiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKVxuICAgICAgICB7XG4gICAgICAgICAgICBtYXhJZnMgPSAobWF4SWZzIC8gMikgfCAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gdmFsaWQhXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXhJZnM7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlSWZUZXN0U3JjKG1heElmcylcbntcbiAgICB2YXIgc3JjID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1heElmczsgKytpKVxuICAgIHtcbiAgICAgICAgaWYgKGkgPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBzcmMgKz0gJ1xcbmVsc2UgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpIDwgbWF4SWZzIC0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgc3JjICs9IFwiaWYodGVzdCA9PSBcIiArIGkgKyBcIi4wKXt9XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3JjO1xufVxuXG4vLyBDYWNoZSB0aGUgcmVzdWx0IHRvIHByZXZlbnQgcnVubmluZyB0aGlzIG92ZXIgYW5kIG92ZXJcbnZhciB1bnNhZmVFdmFsO1xuXG4vKipcbiAqIE5vdCBhbGwgcGxhdGZvcm1zIGFsbG93IHRvIGdlbmVyYXRlIGZ1bmN0aW9uIGNvZGUgKGUuZy4sIGBuZXcgRnVuY3Rpb25gKS5cbiAqIHRoaXMgcHJvdmlkZXMgdGhlIHBsYXRmb3JtLWxldmVsIGRldGVjdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHVuc2FmZUV2YWxTdXBwb3J0ZWQoKVxue1xuICAgIGlmICh0eXBlb2YgdW5zYWZlRXZhbCA9PT0gJ2Jvb2xlYW4nKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHVuc2FmZUV2YWw7XG4gICAgfVxuXG4gICAgdHJ5XG4gICAge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyAqL1xuICAgICAgICB2YXIgZnVuYyA9IG5ldyBGdW5jdGlvbigncGFyYW0xJywgJ3BhcmFtMicsICdwYXJhbTMnLCAncmV0dXJuIHBhcmFtMVtwYXJhbTJdID09PSBwYXJhbTM7Jyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3LWZ1bmMgKi9cblxuICAgICAgICB1bnNhZmVFdmFsID0gZnVuYyh7IGE6ICdiJyB9LCAnYScsICdiJykgPT09IHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKVxuICAgIHtcbiAgICAgICAgdW5zYWZlRXZhbCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB1bnNhZmVFdmFsO1xufVxuXG52YXIgZGVmYXVsdEZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcXG5cXG52b2lkIG1haW4odm9pZCl7XFxuICAgZ2xfRnJhZ0NvbG9yICo9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XFxufVwiO1xuXG52YXIgZGVmYXVsdFZlcnRleCA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XFxuXFxudW5pZm9ybSBtYXQzIHByb2plY3Rpb25NYXRyaXg7XFxuXFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxuXFxudm9pZCBtYWluKHZvaWQpe1xcbiAgIGdsX1Bvc2l0aW9uID0gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uLCAxLjApKS54eSwgMC4wLCAxLjApO1xcbiAgIHZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1xcbn1cXG5cIjtcblxuLy8gaW1wb3J0ICogYXMgZnJvbSAnLi4vc3lzdGVtcy9zaGFkZXIvc2hhZGVyJztcblxudmFyIFVJRCQzID0gMDtcblxudmFyIG5hbWVDYWNoZSA9IHt9O1xuXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgYSBzaGFkZXIgcHJvZ3JhbS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBQcm9ncmFtID0gZnVuY3Rpb24gUHJvZ3JhbSh2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjLCBuYW1lKVxue1xuICAgIGlmICggbmFtZSA9PT0gdm9pZCAwICkgbmFtZSA9ICdwaXhpLXNoYWRlcic7XG5cbiAgICB0aGlzLmlkID0gVUlEJDMrKztcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJ0ZXggc2hhZGVyLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudmVydGV4U3JjID0gdmVydGV4U3JjIHx8IFByb2dyYW0uZGVmYXVsdFZlcnRleFNyYztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmcmFnbWVudCBzaGFkZXIuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5mcmFnbWVudFNyYyA9IGZyYWdtZW50U3JjIHx8IFByb2dyYW0uZGVmYXVsdEZyYWdtZW50U3JjO1xuXG4gICAgdGhpcy52ZXJ0ZXhTcmMgPSB0aGlzLnZlcnRleFNyYy50cmltKCk7XG4gICAgdGhpcy5mcmFnbWVudFNyYyA9IHRoaXMuZnJhZ21lbnRTcmMudHJpbSgpO1xuXG4gICAgaWYgKHRoaXMudmVydGV4U3JjLnN1YnN0cmluZygwLCA4KSAhPT0gJyN2ZXJzaW9uJylcbiAgICB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgICAgICBpZiAobmFtZUNhY2hlW25hbWVdKVxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lQ2FjaGVbbmFtZV0rKztcbiAgICAgICAgICAgIG5hbWUgKz0gXCItXCIgKyAobmFtZUNhY2hlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWVDYWNoZVtuYW1lXSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleFNyYyA9IFwiI2RlZmluZSBTSEFERVJfTkFNRSBcIiArIG5hbWUgKyBcIlxcblwiICsgKHRoaXMudmVydGV4U3JjKTtcbiAgICAgICAgdGhpcy5mcmFnbWVudFNyYyA9IFwiI2RlZmluZSBTSEFERVJfTkFNRSBcIiArIG5hbWUgKyBcIlxcblwiICsgKHRoaXMuZnJhZ21lbnRTcmMpO1xuXG4gICAgICAgIHRoaXMudmVydGV4U3JjID0gc2V0UHJlY2lzaW9uKHRoaXMudmVydGV4U3JjLCBzZXR0aW5ncy5QUkVDSVNJT05fVkVSVEVYLCBQUkVDSVNJT04uSElHSCk7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRTcmMgPSBzZXRQcmVjaXNpb24odGhpcy5mcmFnbWVudFNyYywgc2V0dGluZ3MuUFJFQ0lTSU9OX0ZSQUdNRU5ULCBnZXRNYXhGcmFnbWVudFByZWNpc2lvbigpKTtcbiAgICB9XG5cbiAgICAvLyBjdXJyZW50bHkgdGhpcyBkb2VzIG5vdCBleHRyYWN0IHN0cnVjdHMgb25seSBkZWZhdWx0IHR5cGVzXG4gICAgdGhpcy5leHRyYWN0RGF0YSh0aGlzLnZlcnRleFNyYywgdGhpcy5mcmFnbWVudFNyYyk7XG5cbiAgICAvLyB0aGlzIGlzIHdoZXJlIHdlIHN0b3JlIHNoYWRlciByZWZlcmVuY2VzLi5cbiAgICB0aGlzLmdsUHJvZ3JhbXMgPSB7fTtcblxuICAgIHRoaXMuc3luY1VuaWZvcm1zID0gbnVsbDtcbn07XG5cbnZhciBzdGF0aWNBY2Nlc3NvcnMgPSB7IGRlZmF1bHRWZXJ0ZXhTcmM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVmYXVsdEZyYWdtZW50U3JjOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGRhdGEgZm9yIGEgYnV5IGNyZWF0aW5nIGEgc21hbGwgdGVzdCBwcm9ncmFtXG4gKiBvciByZWFkaW5nIHRoZSBzcmMgZGlyZWN0bHkuXG4gKiBAcHJvdGVjdGVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt2ZXJ0ZXhTcmNdIC0gVGhlIHNvdXJjZSBvZiB0aGUgdmVydGV4IHNoYWRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhZ21lbnRTcmNdIC0gVGhlIHNvdXJjZSBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLlxuICovXG5Qcm9ncmFtLnByb3RvdHlwZS5leHRyYWN0RGF0YSA9IGZ1bmN0aW9uIGV4dHJhY3REYXRhICh2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjKVxue1xuICAgIHZhciBnbCA9IGdldFRlc3RDb250ZXh0KCk7XG5cbiAgICBpZiAoZ2wpXG4gICAge1xuICAgICAgICB2YXIgcHJvZ3JhbSA9IGNvbXBpbGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjKTtcblxuICAgICAgICB0aGlzLmF0dHJpYnV0ZURhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZURhdGEocHJvZ3JhbSwgZ2wpO1xuICAgICAgICB0aGlzLnVuaWZvcm1EYXRhID0gdGhpcy5nZXRVbmlmb3JtRGF0YShwcm9ncmFtLCBnbCk7XG5cbiAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgdGhpcy51bmlmb3JtRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZURhdGEgPSB7fTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHJldHVybnMgdGhlIGF0dHJpYnV0ZSBkYXRhIGZyb20gdGhlIHByb2dyYW1cbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtXZWJHTFByb2dyYW19IFtwcm9ncmFtXSAtIHRoZSBXZWJHTCBwcm9ncmFtXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gW2dsXSAtIHRoZSBXZWJHTCBjb250ZXh0XG4gKlxuICogQHJldHVybnMge29iamVjdH0gdGhlIGF0dHJpYnV0ZSBkYXRhIGZvciB0aGlzIHByb2dyYW1cbiAqL1xuUHJvZ3JhbS5wcm90b3R5cGUuZ2V0QXR0cmlidXRlRGF0YSA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZURhdGEgKHByb2dyYW0sIGdsKVxue1xuICAgIHZhciBhdHRyaWJ1dGVzID0ge307XG4gICAgdmFyIGF0dHJpYnV0ZXNBcnJheSA9IFtdO1xuXG4gICAgdmFyIHRvdGFsQXR0cmlidXRlcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEF0dHJpYnV0ZXM7IGkrKylcbiAgICB7XG4gICAgICAgIHZhciBhdHRyaWJEYXRhID0gZ2wuZ2V0QWN0aXZlQXR0cmliKHByb2dyYW0sIGkpO1xuICAgICAgICB2YXIgdHlwZSA9IG1hcFR5cGUoZ2wsIGF0dHJpYkRhdGEudHlwZSk7XG5cbiAgICAgICAgLyplc2xpbnQtZGlzYWJsZSAqL1xuICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBhdHRyaWJEYXRhLm5hbWUsXG4gICAgICAgICAgICBzaXplOiBtYXBTaXplKHR5cGUpLFxuICAgICAgICAgICAgbG9jYXRpb246IDAsXG4gICAgICAgIH07XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cblxuICAgICAgICBhdHRyaWJ1dGVzW2F0dHJpYkRhdGEubmFtZV0gPSBkYXRhO1xuICAgICAgICBhdHRyaWJ1dGVzQXJyYXkucHVzaChkYXRhKTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzQXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGEubmFtZSA+IGIubmFtZSkgPyAxIDogLTE7IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbmZ1c2luZy1hcnJvd1xuXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgYXR0cmlidXRlc0FycmF5Lmxlbmd0aDsgaSQxKyspXG4gICAge1xuICAgICAgICBhdHRyaWJ1dGVzQXJyYXlbaSQxXS5sb2NhdGlvbiA9IGkkMTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbn07XG5cbi8qKlxuICogcmV0dXJucyB0aGUgdW5pZm9ybSBkYXRhIGZyb20gdGhlIHByb2dyYW1cbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHt3ZWJHTC1wcm9ncmFtfSBbcHJvZ3JhbV0gLSB0aGUgd2ViZ2wgcHJvZ3JhbVxuICogQHBhcmFtIHtjb250ZXh0fSBbZ2xdIC0gdGhlIFdlYkdMIGNvbnRleHRcbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB0aGUgdW5pZm9ybSBkYXRhIGZvciB0aGlzIHByb2dyYW1cbiAqL1xuUHJvZ3JhbS5wcm90b3R5cGUuZ2V0VW5pZm9ybURhdGEgPSBmdW5jdGlvbiBnZXRVbmlmb3JtRGF0YSAocHJvZ3JhbSwgZ2wpXG57XG4gICAgdmFyIHVuaWZvcm1zID0ge307XG5cbiAgICB2YXIgdG90YWxVbmlmb3JtcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TKTtcblxuICAgIC8vIFRPRE8gZXhwb3NlIHRoaXMgYXMgYSBwcm9wP1xuICAgIC8vIGNvbnN0IG1hc2tSZWdleCA9IG5ldyBSZWdFeHAoJ14ocHJvamVjdGlvbk1hdHJpeHx1U2FtcGxlcnx0cmFuc2xhdGlvbk1hdHJpeCkkJyk7XG4gICAgLy8gY29uc3QgbWFza1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXihwcm9qZWN0aW9uTWF0cml4fHVTYW1wbGVyfHRyYW5zbGF0aW9uTWF0cml4KSQnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWxVbmlmb3JtczsgaSsrKVxuICAgIHtcbiAgICAgICAgdmFyIHVuaWZvcm1EYXRhID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKTtcbiAgICAgICAgdmFyIG5hbWUgPSB1bmlmb3JtRGF0YS5uYW1lLnJlcGxhY2UoL1xcWy4qP1xcXS8sICcnKTtcblxuICAgICAgICB2YXIgaXNBcnJheSA9IHVuaWZvcm1EYXRhLm5hbWUubWF0Y2goL1xcWy4qP1xcXS8sICcnKTtcbiAgICAgICAgdmFyIHR5cGUgPSBtYXBUeXBlKGdsLCB1bmlmb3JtRGF0YS50eXBlKTtcblxuICAgICAgICAvKmVzbGludC1kaXNhYmxlICovXG4gICAgICAgIHVuaWZvcm1zW25hbWVdID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHNpemU6IHVuaWZvcm1EYXRhLnNpemUsXG4gICAgICAgICAgICBpc0FycmF5OmlzQXJyYXksXG4gICAgICAgICAgICB2YWx1ZTogZGVmYXVsdFZhbHVlKHR5cGUsIHVuaWZvcm1EYXRhLnNpemUpLFxuICAgICAgICB9O1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaWZvcm1zO1xufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB2ZXJ0ZXggc2hhZGVyIHNvdXJjZVxuICpcbiAqIEBzdGF0aWNcbiAqIEBjb25zdGFudFxuICogQG1lbWJlciB7c3RyaW5nfVxuICovXG5zdGF0aWNBY2Nlc3NvcnMuZGVmYXVsdFZlcnRleFNyYy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiBkZWZhdWx0VmVydGV4O1xufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBmcmFnbWVudCBzaGFkZXIgc291cmNlXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyIHtzdHJpbmd9XG4gKi9cbnN0YXRpY0FjY2Vzc29ycy5kZWZhdWx0RnJhZ21lbnRTcmMuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gZGVmYXVsdEZyYWdtZW50O1xufTtcblxuLyoqXG4gKiBBIHNob3J0IGhhbmQgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcHJvZ3JhbSBiYXNlZCBvZiBhIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyXG4gKiB0aGlzIG1ldGhvZCB3aWxsIGFsc28gY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgY2FjaGVkIHByb2dyYW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt2ZXJ0ZXhTcmNdIC0gVGhlIHNvdXJjZSBvZiB0aGUgdmVydGV4IHNoYWRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZnJhZ21lbnRTcmNdIC0gVGhlIHNvdXJjZSBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPXBpeGktc2hhZGVyXSAtIE5hbWUgZm9yIHNoYWRlclxuICpcbiAqIEByZXR1cm5zIHtQSVhJLlByb2dyYW19IGFuIHNoaW55IG5ldyBQaXhpIHNoYWRlciFcbiAqL1xuUHJvZ3JhbS5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmVydGV4U3JjLCBmcmFnbWVudFNyYywgbmFtZSlcbntcbiAgICB2YXIga2V5ID0gdmVydGV4U3JjICsgZnJhZ21lbnRTcmM7XG5cbiAgICB2YXIgcHJvZ3JhbSA9IFByb2dyYW1DYWNoZVtrZXldO1xuXG4gICAgaWYgKCFwcm9ncmFtKVxuICAgIHtcbiAgICAgICAgUHJvZ3JhbUNhY2hlW2tleV0gPSBwcm9ncmFtID0gbmV3IFByb2dyYW0odmVydGV4U3JjLCBmcmFnbWVudFNyYywgbmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggUHJvZ3JhbSwgc3RhdGljQWNjZXNzb3JzICk7XG5cbi8qKlxuICogQSBoZWxwZXIgY2xhc3MgZm9yIHNoYWRlcnNcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBTaGFkZXIgPSBmdW5jdGlvbiBTaGFkZXIocHJvZ3JhbSwgdW5pZm9ybXMpXG57XG4gICAgLyoqXG4gICAgICogUHJvZ3JhbSB0aGF0IHRoZSBzaGFkZXIgdXNlc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5Qcm9ncmFtfVxuICAgICAqL1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cbiAgICAvLyBsZXRzIHNlZSB3aGF0cyBiZWVuIHBhc3NlZCBpblxuICAgIC8vIHVuaWZvcm1zIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gYSB1bmlmb3JtIGdyb3VwXG4gICAgaWYgKHVuaWZvcm1zKVxuICAgIHtcbiAgICAgICAgaWYgKHVuaWZvcm1zIGluc3RhbmNlb2YgVW5pZm9ybUdyb3VwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1Hcm91cCA9IHVuaWZvcm1zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51bmlmb3JtR3JvdXAgPSBuZXcgVW5pZm9ybUdyb3VwKHVuaWZvcm1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICB0aGlzLnVuaWZvcm1Hcm91cCA9IG5ldyBVbmlmb3JtR3JvdXAoe30pO1xuICAgIH1cblxuICAgIC8vIHRpbWUgdG8gYnVpbGQgc29tZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIVxuICAgIC8vIEkgZ3Vlc3MgZG93biB0aGUgbGluZSB0aGlzIGNvdWxkIHNvcnQgb2YgZ2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gbGlzdCByYXRoZXIgdGhhbiB1c2UgZGlydHkgaWRzP1xuICAgIC8vIGRvZXMgdGhlIHRyaWNrIGZvciBub3cgdGhvdWdoIVxuICAgIGZvciAodmFyIGkgaW4gcHJvZ3JhbS51bmlmb3JtRGF0YSlcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1Hcm91cC51bmlmb3Jtc1tpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1Hcm91cC51bmlmb3Jtc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy51bmlmb3JtR3JvdXAudW5pZm9ybXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQyID0geyB1bmlmb3JtczogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vLyBUT0RPIG1vdmUgdG8gc2hhZGVyIHN5c3RlbS4uXG5TaGFkZXIucHJvdG90eXBlLmNoZWNrVW5pZm9ybUV4aXN0cyA9IGZ1bmN0aW9uIGNoZWNrVW5pZm9ybUV4aXN0cyAobmFtZSwgZ3JvdXApXG57XG4gICAgaWYgKGdyb3VwLnVuaWZvcm1zW25hbWVdKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSBpbiBncm91cC51bmlmb3JtcylcbiAgICB7XG4gICAgICAgIHZhciB1bmlmb3JtID0gZ3JvdXAudW5pZm9ybXNbaV07XG5cbiAgICAgICAgaWYgKHVuaWZvcm0uZ3JvdXApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrVW5pZm9ybUV4aXN0cyhuYW1lLCB1bmlmb3JtKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cblNoYWRlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbntcbiAgICAvLyB1c2FnZSBjb3VudCBvbiBwcm9ncmFtcz9cbiAgICAvLyByZW1vdmUgaWYgbm90IHVzZWQhXG4gICAgdGhpcy51bmlmb3JtR3JvdXAgPSBudWxsO1xufTtcblxuLyoqXG4gKiBTaGFkZXIgdW5pZm9ybSB2YWx1ZXMsIHNob3J0Y3V0IGZvciBgdW5pZm9ybUdyb3VwLnVuaWZvcm1zYFxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyIHtvYmplY3R9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQyLnVuaWZvcm1zLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMudW5pZm9ybUdyb3VwLnVuaWZvcm1zO1xufTtcblxuLyoqXG4gKiBBIHNob3J0IGhhbmQgZnVuY3Rpb24gdG8gY3JlYXRlIGEgc2hhZGVyIGJhc2VkIG9mIGEgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ZlcnRleFNyY10gLSBUaGUgc291cmNlIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmcmFnbWVudFNyY10gLSBUaGUgc291cmNlIG9mIHRoZSBmcmFnbWVudCBzaGFkZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gW3VuaWZvcm1zXSAtIEN1c3RvbSB1bmlmb3JtcyB0byB1c2UgdG8gYXVnbWVudCB0aGUgYnVpbHQtaW4gb25lcy5cbiAqXG4gKiBAcmV0dXJucyB7UElYSS5TaGFkZXJ9IGFuIHNoaW55IG5ldyBQaXhpIHNoYWRlciFcbiAqL1xuU2hhZGVyLmZyb20gPSBmdW5jdGlvbiBmcm9tICh2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjLCB1bmlmb3JtcylcbntcbiAgICB2YXIgcHJvZ3JhbSA9IFByb2dyYW0uZnJvbSh2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjKTtcblxuICAgIHJldHVybiBuZXcgU2hhZGVyKHByb2dyYW0sIHVuaWZvcm1zKTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMkMiApO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBCTEVORCA9IDA7XG52YXIgT0ZGU0VUID0gMTtcbnZhciBDVUxMSU5HID0gMjtcbnZhciBERVBUSF9URVNUID0gMztcbnZhciBXSU5ESU5HID0gNDtcblxuLyoqXG4gKiBUaGlzIGlzIGEgV2ViR0wgc3RhdGUsIGFuZCBpcyBpcyBwYXNzZWQgVGhlIFdlYkdMIFN0YXRlTWFuYWdlci5cbiAqXG4gKiBFYWNoIG1lc2ggcmVuZGVyZWQgbWF5IHJlcXVpcmUgV2ViR0wgdG8gYmUgaW4gYSBkaWZmZXJlbnQgc3RhdGUuXG4gKiBGb3IgZXhhbXBsZSB5b3UgbWF5IHdhbnQgZGlmZmVyZW50IGJsZW5kIG1vZGUgb3IgdG8gZW5hYmxlIHBvbHlnb24gb2Zmc2V0c1xuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFN0YXRlID0gZnVuY3Rpb24gU3RhdGUoKVxue1xuICAgIHRoaXMuZGF0YSA9IDA7XG5cbiAgICB0aGlzLmJsZW5kTW9kZSA9IEJMRU5EX01PREVTLk5PUk1BTDtcbiAgICB0aGlzLnBvbHlnb25PZmZzZXQgPSAwO1xuXG4gICAgdGhpcy5ibGVuZCA9IHRydWU7XG4gICAgLy8gIHRoaXMuZGVwdGhUZXN0ID0gdHJ1ZTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMkMyA9IHsgYmxlbmQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sb2Zmc2V0czogeyBjb25maWd1cmFibGU6IHRydWUgfSxjdWxsaW5nOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGRlcHRoVGVzdDogeyBjb25maWd1cmFibGU6IHRydWUgfSxjbG9ja3dpc2VGcm9udEZhY2U6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYmxlbmRNb2RlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHBvbHlnb25PZmZzZXQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLyoqXG4gKiBBY3RpdmF0ZXMgYmxlbmRpbmcgb2YgdGhlIGNvbXB1dGVkIGZyYWdtZW50IGNvbG9yIHZhbHVlc1xuICpcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQzLmJsZW5kLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YSAmICgxIDw8IEJMRU5EKSk7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5ibGVuZC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICghISh0aGlzLmRhdGEgJiAoMSA8PCBCTEVORCkpICE9PSB2YWx1ZSlcbiAgICB7XG4gICAgICAgIHRoaXMuZGF0YSBePSAoMSA8PCBCTEVORCk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBY3RpdmF0ZXMgYWRkaW5nIGFuIG9mZnNldCB0byBkZXB0aCB2YWx1ZXMgb2YgcG9seWdvbidzIGZyYWdtZW50c1xuICpcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5vZmZzZXRzLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YSAmICgxIDw8IE9GRlNFVCkpO1xufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDMub2Zmc2V0cy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICghISh0aGlzLmRhdGEgJiAoMSA8PCBPRkZTRVQpKSAhPT0gdmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLmRhdGEgXj0gKDEgPDwgT0ZGU0VUKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyBjdWxsaW5nIG9mIHBvbHlnb25zLlxuICpcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5jdWxsaW5nLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuICEhKHRoaXMuZGF0YSAmICgxIDw8IENVTExJTkcpKTtcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycyQzLmN1bGxpbmcuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAoISEodGhpcy5kYXRhICYgKDEgPDwgQ1VMTElORykpICE9PSB2YWx1ZSlcbiAgICB7XG4gICAgICAgIHRoaXMuZGF0YSBePSAoMSA8PCBDVUxMSU5HKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyBkZXB0aCBjb21wYXJpc29ucyBhbmQgdXBkYXRlcyB0byB0aGUgZGVwdGggYnVmZmVyLlxuICpcbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5kZXB0aFRlc3QuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gISEodGhpcy5kYXRhICYgKDEgPDwgREVQVEhfVEVTVCkpO1xufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDMuZGVwdGhUZXN0LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKCEhKHRoaXMuZGF0YSAmICgxIDw8IERFUFRIX1RFU1QpKSAhPT0gdmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLmRhdGEgXj0gKDEgPDwgREVQVEhfVEVTVCk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgZnJvbnQgb3IgYmFjay1mYWNpbmcgcG9seWdvbnMgY2FuIGJlIGN1bGxlZC5cbiAqIEBtZW1iZXIge2Jvb2xlYW59XG4gKiBAZGVmYXVsdCBmYWxzZVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5jbG9ja3dpc2VGcm9udEZhY2UuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gISEodGhpcy5kYXRhICYgKDEgPDwgV0lORElORykpO1xufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDMuY2xvY2t3aXNlRnJvbnRGYWNlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKCEhKHRoaXMuZGF0YSAmICgxIDw8IFdJTkRJTkcpKSAhPT0gdmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLmRhdGEgXj0gKDEgPDwgV0lORElORyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgYmxlbmQgbW9kZSB0byBiZSBhcHBsaWVkIHdoZW4gdGhpcyBzdGF0ZSBpcyBzZXQuIEFwcGx5IGEgdmFsdWUgb2YgYFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMYCB0byByZXNldCB0aGUgYmxlbmQgbW9kZS5cbiAqIFNldHRpbmcgdGhpcyBtb2RlIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gTk9fQkxFTkQgd2lsbCBhdXRvbWF0aWNhbGx5IHN3aXRjaCBibGVuZGluZyBvbi5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKiBAZGVmYXVsdCBQSVhJLkJMRU5EX01PREVTLk5PUk1BTFxuICogQHNlZSBQSVhJLkJMRU5EX01PREVTXG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQzLmJsZW5kTW9kZS5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9ibGVuZE1vZGU7XG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMy5ibGVuZE1vZGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICB0aGlzLmJsZW5kID0gKHZhbHVlICE9PSBCTEVORF9NT0RFUy5OT05FKTtcbiAgICB0aGlzLl9ibGVuZE1vZGUgPSB2YWx1ZTtcbn07XG5cbi8qKlxuICogVGhlIHBvbHlnb24gb2Zmc2V0LiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwIHdpbGwgYXV0b21hdGljYWxseSBlbmFibGUgcG9seWdvbiBvZmZzZXQgZmlsbC5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKiBAZGVmYXVsdCAwXG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQzLnBvbHlnb25PZmZzZXQuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fcG9seWdvbk9mZnNldDtcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycyQzLnBvbHlnb25PZmZzZXQuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICB0aGlzLm9mZnNldHMgPSAhIXZhbHVlO1xuICAgIHRoaXMuX3BvbHlnb25PZmZzZXQgPSB2YWx1ZTtcbn07XG5cblN0YXRlLmZvcjJkID0gZnVuY3Rpb24gZm9yMmQgKClcbntcbiAgICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUoKTtcblxuICAgIHN0YXRlLmRlcHRoVGVzdCA9IGZhbHNlO1xuICAgIHN0YXRlLmJsZW5kID0gdHJ1ZTtcblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTdGF0ZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyQzICk7XG5cbnZhciBkZWZhdWx0VmVydGV4JDEgPSBcImF0dHJpYnV0ZSB2ZWMyIGFWZXJ0ZXhQb3NpdGlvbjtcXG5cXG51bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDtcXG5cXG52YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcXG5cXG51bmlmb3JtIHZlYzQgaW5wdXRTaXplO1xcbnVuaWZvcm0gdmVjNCBvdXRwdXRGcmFtZTtcXG5cXG52ZWM0IGZpbHRlclZlcnRleFBvc2l0aW9uKCB2b2lkIClcXG57XFxuICAgIHZlYzIgcG9zaXRpb24gPSBhVmVydGV4UG9zaXRpb24gKiBtYXgob3V0cHV0RnJhbWUuencsIHZlYzIoMC4pKSArIG91dHB1dEZyYW1lLnh5O1xcblxcbiAgICByZXR1cm4gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxufVxcblxcbnZlYzIgZmlsdGVyVGV4dHVyZUNvb3JkKCB2b2lkIClcXG57XFxuICAgIHJldHVybiBhVmVydGV4UG9zaXRpb24gKiAob3V0cHV0RnJhbWUuencgKiBpbnB1dFNpemUuencpO1xcbn1cXG5cXG52b2lkIG1haW4odm9pZClcXG57XFxuICAgIGdsX1Bvc2l0aW9uID0gZmlsdGVyVmVydGV4UG9zaXRpb24oKTtcXG4gICAgdlRleHR1cmVDb29yZCA9IGZpbHRlclRleHR1cmVDb29yZCgpO1xcbn1cXG5cIjtcblxudmFyIGRlZmF1bHRGcmFnbWVudCQxID0gXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcXG5cXG52b2lkIG1haW4odm9pZCl7XFxuICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKTtcXG59XFxuXCI7XG5cbi8qKlxuICogRmlsdGVyIGlzIGEgc3BlY2lhbCB0eXBlIG9mIFdlYkdMIHNoYWRlciB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHNjcmVlbi5cbiAqXG4gKiB7QGxpbmsgaHR0cDovL3BpeGlqcy5pby9leGFtcGxlcy8jL2ZpbHRlcnMvYmx1ci1maWx0ZXIuanMgRXhhbXBsZX0gb2YgdGhlXG4gKiB7QGxpbmsgUElYSS5maWx0ZXJzLkJsdXJGaWx0ZXIgQmx1ckZpbHRlcn0uXG4gKlxuICogIyMjIFVzYWdlXG4gKiBGaWx0ZXJzIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBEaXNwbGF5T2JqZWN0IG9yIENvbnRhaW5lci5cbiAqIFBpeGlKUycgYEZpbHRlclN5c3RlbWAgcmVuZGVycyB0aGUgY29udGFpbmVyIGludG8gdGVtcG9yYXJ5IEZyYW1lYnVmZmVyLFxuICogdGhlbiBmaWx0ZXIgcmVuZGVycyBpdCB0byB0aGUgc2NyZWVuLlxuICogTXVsdGlwbGUgZmlsdGVycyBjYW4gYmUgYWRkZWQgdG8gdGhlIGBmaWx0ZXJzYCBhcnJheSBwcm9wZXJ0eSBhbmQgc3RhY2tlZCBvbiBlYWNoIG90aGVyLlxuICpcbiAqIGBgYFxuICogY29uc3QgZmlsdGVyID0gbmV3IFBJWEkuRmlsdGVyKG15U2hhZGVyVmVydCwgbXlTaGFkZXJGcmFnLCB7IG15VW5pZm9ybTogMC41IH0pO1xuICogY29uc3QgY29udGFpbmVyID0gbmV3IFBJWEkuQ29udGFpbmVyKCk7XG4gKiBjb250YWluZXIuZmlsdGVycyA9IFtmaWx0ZXJdO1xuICogYGBgXG4gKlxuICogIyMjIFByZXZpb3VzIFZlcnNpb24gRGlmZmVyZW5jZXNcbiAqXG4gKiBJbiBQaXhpSlMgKip2MyoqLCBhIGZpbHRlciB3YXMgYWx3YXlzIGFwcGxpZWQgdG8gX3dob2xlIHNjcmVlbl8uXG4gKlxuICogSW4gUGl4aUpTICoqdjQqKiwgYSBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgX29ubHkgcGFydCBvZiB0aGUgc2NyZWVuXy5cbiAqIERldmVsb3BlcnMgaGFkIHRvIGNyZWF0ZSBhIHNldCBvZiB1bmlmb3JtcyB0byBkZWFsIHdpdGggY29vcmRpbmF0ZXMuXG4gKlxuICogSW4gUGl4aUpTICoqdjUqKiBjb21iaW5lcyBfYm90aCBhcHByb2FjaGVzXy5cbiAqIERldmVsb3BlcnMgY2FuIHVzZSBub3JtYWwgY29vcmRpbmF0ZXMgb2YgdjMgYW5kIHRoZW4gYWxsb3cgZmlsdGVyIHRvIHVzZSBwYXJ0aWFsIEZyYW1lYnVmZmVycyxcbiAqIGJyaW5naW5nIHRob3NlIGV4dHJhIHVuaWZvcm1zIGludG8gYWNjb3VudC5cbiAqXG4gKiBBbHNvIGJlIGF3YXJlIHRoYXQgd2UgaGF2ZSBjaGFuZ2VkIGRlZmF1bHQgdmVydGV4IHNoYWRlciwgcGxlYXNlIGNvbnN1bHRcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcGl4aWpzL3BpeGkuanMvd2lraS92NS1DcmVhdGluZy1maWx0ZXJzIFdpa2l9LlxuICpcbiAqICMjIyBCdWlsdC1pbiBVbmlmb3Jtc1xuICpcbiAqIFBpeGlKUyB2aWV3cG9ydCB1c2VzIHNjcmVlbiAoQ1NTKSBjb29yZGluYXRlcywgYCgwLCAwLCByZW5kZXJlci5zY3JlZW4ud2lkdGgsIHJlbmRlcmVyLnNjcmVlbi5oZWlnaHQpYCxcbiAqIGFuZCBgcHJvamVjdGlvbk1hdHJpeGAgdW5pZm9ybSBtYXBzIGl0IHRvIHRoZSBnbCB2aWV3cG9ydC5cbiAqXG4gKiAqKnVTYW1wbGVyKipcbiAqXG4gKiBUaGUgbW9zdCBpbXBvcnRhbnQgdW5pZm9ybSBpcyB0aGUgaW5wdXQgdGV4dHVyZSB0aGF0IGNvbnRhaW5lciB3YXMgcmVuZGVyZWQgaW50by5cbiAqIF9JbXBvcnRhbnQgbm90ZTogYXMgd2l0aCBhbGwgRnJhbWVidWZmZXJzIGluIFBpeGlKUywgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGFyZVxuICogcHJlbXVsdGlwbGllZCBieSBhbHBoYS5fXG4gKlxuICogQnkgZGVmYXVsdCwgaW5wdXQgbm9ybWFsaXplZCBjb29yZGluYXRlcyBhcmUgcGFzc2VkIHRvIGZyYWdtZW50IHNoYWRlciB3aXRoIGB2VGV4dHVyZUNvb3JkYC5cbiAqIFVzZSBpdCB0byBzYW1wbGUgdGhlIGlucHV0LlxuICpcbiAqIGBgYFxuICogY29uc3QgZnJhZ21lbnQgPSBgXG4gKiB2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcbiAqIHVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xuICogdm9pZCBtYWluKHZvaWQpXG4gKiB7XG4gKiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpO1xuICogfVxuICogYDtcbiAqXG4gKiBjb25zdCBteUZpbHRlciA9IG5ldyBQSVhJLkZpbHRlcihudWxsLCBmcmFnbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGZpbHRlciBpcyBqdXN0IG9uZSB1bmlmb3JtIGxlc3MgdGhhbiB7QGxpbmsgUElYSS5maWx0ZXJzLkFscGhhRmlsdGVyIEFscGhhRmlsdGVyfS5cbiAqXG4gKiAqKm91dHB1dEZyYW1lKipcbiAqXG4gKiBUaGUgYG91dHB1dEZyYW1lYCBob2xkcyB0aGUgcmVjdGFuZ2xlIHdoZXJlIGZpbHRlciBpcyBhcHBsaWVkIGluIHNjcmVlbiAoQ1NTKSBjb29yZGluYXRlcy5cbiAqIEl0J3MgdGhlIHNhbWUgYXMgYHJlbmRlcmVyLnNjcmVlbmAgZm9yIGEgZnVsbHNjcmVlbiBmaWx0ZXIuXG4gKiBPbmx5IGEgcGFydCBvZiAgYG91dHB1dEZyYW1lLnp3YCBzaXplIG9mIHRlbXBvcmFyeSBGcmFtZWJ1ZmZlciBpcyB1c2VkLFxuICogYCgwLCAwLCBvdXRwdXRGcmFtZS53aWR0aCwgb3V0cHV0RnJhbWUuaGVpZ2h0KWAsXG4gKlxuICogRmlsdGVycyB1c2VzIHRoaXMgcXVhZCB0byBub3JtYWxpemVkICgwLTEpIHNwYWNlLCBpdHMgcGFzc2VkIGludG8gYGFWZXJ0ZXhQb3NpdGlvbmAgYXR0cmlidXRlLlxuICogVG8gY2FsY3VsYXRlIHZlcnRleCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UgdXNpbmcgbm9ybWFsaXplZCAoMC0xKSBzcGFjZTpcbiAqXG4gKiBgYGBcbiAqIHZlYzQgZmlsdGVyVmVydGV4UG9zaXRpb24oIHZvaWQgKVxuICoge1xuICogICAgIHZlYzIgcG9zaXRpb24gPSBhVmVydGV4UG9zaXRpb24gKiBtYXgob3V0cHV0RnJhbWUuencsIHZlYzIoMC4pKSArIG91dHB1dEZyYW1lLnh5O1xuICogICAgIHJldHVybiB2ZWM0KChwcm9qZWN0aW9uTWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHksIDAuMCwgMS4wKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICoqaW5wdXRTaXplKipcbiAqXG4gKiBUZW1wb3JhcnkgZnJhbWVidWZmZXIgaXMgZGlmZmVyZW50LCBpdCBjYW4gYmUgZWl0aGVyIHRoZSBzaXplIG9mIHNjcmVlbiwgZWl0aGVyIHBvd2VyLW9mLXR3by5cbiAqIFRoZSBgaW5wdXRTaXplLnh5YCBhcmUgc2l6ZSBvZiB0ZW1wb3JhcnkgZnJhbWVidWZmZXIgdGhhdCBob2xkcyBpbnB1dC5cbiAqIFRoZSBgaW5wdXRTaXplLnp3YCBpcyBpbnZlcnRlZCwgaXQncyBhIHNob3J0Y3V0IHRvIGV2YWRlIGRpdmlzaW9uIGluc2lkZSB0aGUgc2hhZGVyLlxuICpcbiAqIFNldCBgaW5wdXRTaXplLnh5ID0gb3V0cHV0RnJhbWUuendgIGZvciBhIGZ1bGxzY3JlZW4gZmlsdGVyLlxuICpcbiAqIFRvIGNhbGN1bGF0ZSBpbnB1dCBub3JtYWxpemVkIGNvb3JkaW5hdGUsIHlvdSBoYXZlIHRvIG1hcCBpdCB0byBmaWx0ZXIgbm9ybWFsaXplZCBzcGFjZS5cbiAqIE11bHRpcGx5IGJ5IGBvdXRwdXRGcmFtZS56d2AgdG8gZ2V0IGlucHV0IGNvb3JkaW5hdGUuXG4gKiBEaXZpZGUgYnkgYGlucHV0U2l6ZS54eWAgdG8gZ2V0IGlucHV0IG5vcm1hbGl6ZWQgY29vcmRpbmF0ZS5cbiAqXG4gKiBgYGBcbiAqIHZlYzIgZmlsdGVyVGV4dHVyZUNvb3JkKCB2b2lkIClcbiAqIHtcbiAqICAgICByZXR1cm4gYVZlcnRleFBvc2l0aW9uICogKG91dHB1dEZyYW1lLnp3ICogaW5wdXRTaXplLnp3KTsgLy8gc2FtZSBhcyAvaW5wdXRTaXplLnh5XG4gKiB9XG4gKiBgYGBcbiAqICoqcmVzb2x1dGlvbioqXG4gKlxuICogVGhlIGByZXNvbHV0aW9uYCBpcyB0aGUgcmF0aW8gb2Ygc2NyZWVuIChDU1MpIHBpeGVscyB0byByZWFsIHBpeGVscy5cbiAqXG4gKiAqKmlucHV0UGl4ZWwqKlxuICpcbiAqIGBpbnB1dFBpeGVsLnh5YCBpcyB0aGUgc2l6ZSBvZiBmcmFtZWJ1ZmZlciBpbiByZWFsIHBpeGVscywgc2FtZSBhcyBgaW5wdXRTaXplLnh5ICogcmVzb2x1dGlvbmBcbiAqIGBpbnB1dFBpeGVsLnp3YCBpcyBpbnZlcnRlZCBgaW5wdXRQaXhlbC54eWAuXG4gKlxuICogSXQncyBoYW5keSBmb3IgZmlsdGVycyB0aGF0IHVzZSBuZWlnaGJvdXIgcGl4ZWxzLCBsaWtlIHtAbGluayBQSVhJLmZpbHRlcnMuRlhBQUZpbHRlciBGWEFBRmlsdGVyfS5cbiAqXG4gKiAqKmlucHV0Q2xhbXAqKlxuICpcbiAqIElmIHlvdSB0cnkgdG8gZ2V0IGluZm8gZnJvbSBvdXRzaWRlIG9mIHVzZWQgcGFydCBvZiBGcmFtZWJ1ZmZlciAtIHlvdSdsbCBnZXQgdW5kZWZpbmVkIGJlaGF2aW91ci5cbiAqIEZvciBkaXNwbGFjZW1lbnRzLCBjb29yZGluYXRlcyBoYXMgdG8gYmUgY2xhbXBlZC5cbiAqXG4gKiBUaGUgYGlucHV0Q2xhbXAueHlgIGlzIGxlZnQtdG9wIHBpeGVsIGNlbnRlciwgeW91IG1heSBpZ25vcmUgaXQsIGJlY2F1c2Ugd2UgdXNlIGxlZnQtdG9wIHBhcnQgb2YgRnJhbWVidWZmZXJcbiAqIGBpbnB1dENsYW1wLnp3YCBpcyBib3R0b20tcmlnaHQgcGl4ZWwgY2VudGVyLlxuICpcbiAqIGBgYFxuICogdmVjNCBjb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgY2xhbXAobW9kaWZpZ2VkVGV4dHVyZUNvb3JkLCBpbnB1dENsYW1wLnh5LCBpbnB1dENsYW1wLnp3KSlcbiAqIGBgYFxuICogT1JcbiAqIGBgYFxuICogdmVjNCBjb2xvciA9IHRleHR1cmUyRCh1U2FtcGxlciwgbWluKG1vZGlmaWdlZFRleHR1cmVDb29yZCwgaW5wdXRDbGFtcC56dykpXG4gKiBgYGBcbiAqXG4gKiAjIyMgQWRkaXRpb25hbCBJbmZvcm1hdGlvblxuICpcbiAqIENvbXBsZXRlIGRvY3VtZW50YXRpb24gb24gRmlsdGVyIHVzYWdlIGlzIGxvY2F0ZWQgaW4gdGhlXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3BpeGlqcy9waXhpLmpzL3dpa2kvdjUtQ3JlYXRpbmctZmlsdGVycyBXaWtpfS5cbiAqXG4gKiBTaW5jZSBQaXhpSlMgb25seSBoYWQgYSBoYW5kZnVsIG9mIGJ1aWx0LWluIGZpbHRlcnMsIGFkZGl0aW9uYWwgZmlsdGVycyBjYW4gYmUgZG93bmxvYWRlZFxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waXhpanMvcGl4aS1maWx0ZXJzIGhlcmV9IGZyb20gdGhlIFBpeGlKUyBGaWx0ZXJzIHJlcG9zaXRvcnkuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQGV4dGVuZHMgUElYSS5TaGFkZXJcbiAqL1xudmFyIEZpbHRlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFNoYWRlcikge1xuICAgIGZ1bmN0aW9uIEZpbHRlcih2ZXJ0ZXhTcmMsIGZyYWdtZW50U3JjLCB1bmlmb3JtcylcbiAgICB7XG4gICAgICAgIHZhciBwcm9ncmFtID0gUHJvZ3JhbS5mcm9tKHZlcnRleFNyYyB8fCBGaWx0ZXIuZGVmYXVsdFZlcnRleFNyYyxcbiAgICAgICAgICAgIGZyYWdtZW50U3JjIHx8IEZpbHRlci5kZWZhdWx0RnJhZ21lbnRTcmMpO1xuXG4gICAgICAgIFNoYWRlci5jYWxsKHRoaXMsIHByb2dyYW0sIHVuaWZvcm1zKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBhZGRpbmcgb2YgdGhlIGZpbHRlci4gU29tZSBmaWx0ZXJzIHJlcXVpcmUgZXh0cmEgc3BhY2UgdG8gYnJlYXRoIHN1Y2ggYXMgYSBibHVyLlxuICAgICAgICAgKiBJbmNyZWFzaW5nIHRoaXMgd2lsbCBhZGQgZXh0cmEgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgYm91bmRzIG9mIHRoZSBvYmplY3QgdGhhdCB0aGVcbiAgICAgICAgICogZmlsdGVyIGlzIGFwcGxpZWQgdG8uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFkZGluZyA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBmaWx0ZXIuIFNldHRpbmcgdGhpcyB0byBiZSBsb3dlciB3aWxsIGxvd2VyIHRoZSBxdWFsaXR5IGJ1dFxuICAgICAgICAgKiBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpbHRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gc2V0dGluZ3MuRklMVEVSX1JFU09MVVRJT047XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGVuYWJsZWQgaXMgdHJ1ZSB0aGUgZmlsdGVyIGlzIGFwcGxpZWQsIGlmIGZhbHNlIGl0IHdpbGwgbm90LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgZW5hYmxlZCwgUGl4aUpTIHdpbGwgZml0IHRoZSBmaWx0ZXIgYXJlYSBpbnRvIGJvdW5kYXJpZXMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICAgICAgICogU3dpdGNoIGl0IG9mZiBpZiBpdCBkb2VzIG5vdCB3b3JrIGZvciBzcGVjaWZpYyBzaGFkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dG9GaXQgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMZWdhY3kgZmlsdGVycyB1c2UgcG9zaXRpb24gYW5kIHV2cyBmcm9tIGF0dHJpYnV0ZXNcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxlZ2FjeSA9ICEhdGhpcy5wcm9ncmFtLmF0dHJpYnV0ZURhdGEuYVRleHR1cmVDb29yZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFdlYkdMIHN0YXRlIHRoZSBmaWx0ZXIgcmVxdWlyZXMgdG8gcmVuZGVyXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU3RhdGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCBTaGFkZXIgKSBGaWx0ZXIuX19wcm90b19fID0gU2hhZGVyO1xuICAgIEZpbHRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXIgJiYgU2hhZGVyLnByb3RvdHlwZSApO1xuICAgIEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGaWx0ZXI7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBibGVuZE1vZGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcbiAgICB2YXIgc3RhdGljQWNjZXNzb3JzID0geyBkZWZhdWx0VmVydGV4U3JjOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGRlZmF1bHRGcmFnbWVudFNyYzogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuc3lzdGVtcy5GaWx0ZXJTeXN0ZW19IGZpbHRlck1hbmFnZXIgLSBUaGUgcmVuZGVyZXIgdG8gcmV0cmlldmUgdGhlIGZpbHRlciBmcm9tXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IGlucHV0IC0gVGhlIGlucHV0IHJlbmRlciB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IG91dHB1dCAtIFRoZSB0YXJnZXQgdG8gb3V0cHV0IHRvLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xlYXIgLSBTaG91bGQgdGhlIG91dHB1dCBiZSBjbGVhcmVkIGJlZm9yZSByZW5kZXJpbmcgdG8gaXRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW2N1cnJlbnRTdGF0ZV0gLSBJdCdzIGN1cnJlbnQgc3RhdGUgb2YgZmlsdGVyLlxuICAgICAqICAgICAgICBUaGVyZSBhcmUgc29tZSB1c2VmdWwgcHJvcGVydGllcyBpbiB0aGUgY3VycmVudFN0YXRlIDpcbiAgICAgKiAgICAgICAgdGFyZ2V0LCBmaWx0ZXJzLCBzb3VyY2VGcmFtZSwgZGVzdGluYXRpb25GcmFtZSwgcmVuZGVyVGFyZ2V0LCByZXNvbHV0aW9uXG4gICAgICovXG4gICAgRmlsdGVyLnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uIGFwcGx5IChmaWx0ZXJNYW5hZ2VyLCBpbnB1dCwgb3V0cHV0LCBjbGVhciwgY3VycmVudFN0YXRlKVxuICAgIHtcbiAgICAgICAgLy8gZG8gYXMgeW91IHBsZWFzZSFcblxuICAgICAgICBmaWx0ZXJNYW5hZ2VyLmFwcGx5RmlsdGVyKHRoaXMsIGlucHV0LCBvdXRwdXQsIGNsZWFyLCBjdXJyZW50U3RhdGUpO1xuXG4gICAgICAgIC8vIG9yIGp1c3QgZG8gYSByZWd1bGFyIHJlbmRlci4uXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJsZW5kbW9kZSBvZiB0aGUgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgUElYSS5CTEVORF9NT0RFUy5OT1JNQUxcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmxlbmRNb2RlLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5ibGVuZE1vZGU7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibGVuZE1vZGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMuc3RhdGUuYmxlbmRNb2RlID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IHZlcnRleCBzaGFkZXIgc291cmNlXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAY29uc3RhbnRcbiAgICAgKi9cbiAgICBzdGF0aWNBY2Nlc3NvcnMuZGVmYXVsdFZlcnRleFNyYy5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWZXJ0ZXgkMTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQGNvbnN0YW50XG4gICAgICovXG4gICAgc3RhdGljQWNjZXNzb3JzLmRlZmF1bHRGcmFnbWVudFNyYy5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRGcmFnbWVudCQxO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggRmlsdGVyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEZpbHRlciwgc3RhdGljQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gRmlsdGVyO1xufShTaGFkZXIpKTtcblxuLyoqXG4gKiBVc2VkIGZvciBjYWNoaW5nIHNoYWRlciBJRHNcbiAqXG4gKiBAc3RhdGljXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3RlY3RlZFxuICovXG5GaWx0ZXIuU09VUkNFX0tFWV9NQVAgPSB7fTtcblxudmFyIHZlcnRleCA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XFxuXFxudW5pZm9ybSBtYXQzIHByb2plY3Rpb25NYXRyaXg7XFxudW5pZm9ybSBtYXQzIG90aGVyTWF0cml4O1xcblxcbnZhcnlpbmcgdmVjMiB2TWFza0Nvb3JkO1xcbnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnZvaWQgbWFpbih2b2lkKVxcbntcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KChwcm9qZWN0aW9uTWF0cml4ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxuXFxuICAgIHZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1xcbiAgICB2TWFza0Nvb3JkID0gKCBvdGhlck1hdHJpeCAqIHZlYzMoIGFUZXh0dXJlQ29vcmQsIDEuMCkgICkueHk7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMiB2TWFza0Nvb3JkO1xcbnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xcbnVuaWZvcm0gc2FtcGxlcjJEIG1hc2s7XFxudW5pZm9ybSBmbG9hdCBhbHBoYTtcXG51bmlmb3JtIGZsb2F0IG5wbUFscGhhO1xcbnVuaWZvcm0gdmVjNCBtYXNrQ2xhbXA7XFxuXFxudm9pZCBtYWluKHZvaWQpXFxue1xcbiAgICBmbG9hdCBjbGlwID0gc3RlcCgzLjUsXFxuICAgICAgICBzdGVwKG1hc2tDbGFtcC54LCB2TWFza0Nvb3JkLngpICtcXG4gICAgICAgIHN0ZXAobWFza0NsYW1wLnksIHZNYXNrQ29vcmQueSkgK1xcbiAgICAgICAgc3RlcCh2TWFza0Nvb3JkLngsIG1hc2tDbGFtcC56KSArXFxuICAgICAgICBzdGVwKHZNYXNrQ29vcmQueSwgbWFza0NsYW1wLncpKTtcXG5cXG4gICAgdmVjNCBvcmlnaW5hbCA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XFxuICAgIHZlYzQgbWFza3kgPSB0ZXh0dXJlMkQobWFzaywgdk1hc2tDb29yZCk7XFxuICAgIGZsb2F0IGFscGhhTXVsID0gMS4wIC0gbnBtQWxwaGEgKiAoMS4wIC0gbWFza3kuYSk7XFxuXFxuICAgIG9yaWdpbmFsICo9IChhbHBoYU11bCAqIG1hc2t5LnIgKiBhbHBoYSAqIGNsaXApO1xcblxcbiAgICBnbF9GcmFnQ29sb3IgPSBvcmlnaW5hbDtcXG59XFxuXCI7XG5cbnZhciB0ZW1wTWF0ID0gbmV3IE1hdHJpeCgpO1xuXG4vKipcbiAqIENsYXNzIGNvbnRyb2xzIHV2IG1hcHBpbmcgZnJvbSBUZXh0dXJlIG5vcm1hbCBzcGFjZSB0byBCYXNlVGV4dHVyZSBub3JtYWwgc3BhY2UuXG4gKlxuICogVGFrZXMgYHRyaW1gIGFuZCBgcm90YXRlYCBpbnRvIGFjY291bnQuIE1heSBjb250YWluIGNsYW1wIHNldHRpbmdzIGZvciBNZXNoZXMgYW5kIFRpbGluZ1Nwcml0ZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBUZXh0dXJlIGB1dk1hdHJpeGAgZmllbGQsIG9yIHNlcGFyYXRlbHksIHlvdSBjYW4gdXNlIGRpZmZlcmVudCBjbGFtcCBzZXR0aW5ncyBvbiB0aGUgc2FtZSB0ZXh0dXJlLlxuICogSWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIHRleHR1cmUgcmVnaW9uIG9mIGNlcnRhaW4gZmVhdHVyZSBvciBmaWx0ZXIsIHRoYXQncyB3aGF0IHlvdSdyZSBsb29raW5nIGZvci5cbiAqXG4gKiBUYWtlcyB0cmFjayBvZiBUZXh0dXJlIGNoYW5nZXMgdGhyb3VnaCBgX2xhc3RUZXh0dXJlSURgIHByaXZhdGUgZmllbGQuXG4gKiBVc2UgYHVwZGF0ZSgpYCBtZXRob2QgY2FsbCB0byB0cmFjayBpdCBmcm9tIG91dHNpZGUuXG4gKlxuICogQHNlZSBQSVhJLlRleHR1cmVcbiAqIEBzZWUgUElYSS5NZXNoXG4gKiBAc2VlIFBJWEkuVGlsaW5nU3ByaXRlXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBUZXh0dXJlTWF0cml4ID0gZnVuY3Rpb24gVGV4dHVyZU1hdHJpeCh0ZXh0dXJlLCBjbGFtcE1hcmdpbilcbntcbiAgICB0aGlzLl90ZXh0dXJlID0gdGV4dHVyZTtcblxuICAgIC8qKlxuICAgICAqIE1hdHJpeCBvcGVyYXRpb24gdGhhdCBjb252ZXJ0cyB0ZXh0dXJlIHJlZ2lvbiBjb29yZHMgdG8gdGV4dHVyZSBjb29yZHNcbiAgICAgKiBAbWVtYmVyIHtQSVhJLk1hdHJpeH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLm1hcENvb3JkID0gbmV3IE1hdHJpeCgpO1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXAgcmVnaW9uIGZvciBub3JtYWxpemVkIGNvb3JkcywgbGVmdC10b3AgcGl4ZWwgY2VudGVyIGluIHh5ICwgYm90dG9tLXJpZ2h0IGluIHp3LlxuICAgICAqIENhbGN1bGF0ZWQgYmFzZWQgb24gY2xhbXBPZmZzZXQuXG4gICAgICogQG1lbWJlciB7RmxvYXQzMkFycmF5fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMudUNsYW1wRnJhbWUgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplZCBjbGFtcCBvZmZzZXQuXG4gICAgICogQ2FsY3VsYXRlZCBiYXNlZCBvbiBjbGFtcE9mZnNldC5cbiAgICAgKiBAbWVtYmVyIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy51Q2xhbXBPZmZzZXQgPSBuZXcgRmxvYXQzMkFycmF5KDIpO1xuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIFRleHR1cmUgZnJhbWUgY2hhbmdlc1xuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgdGhpcy5fdXBkYXRlSUQgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgZnJhbWUgY2xhbXBpbmdcbiAgICAgKiBXb3JrcyB3aXRoIFRpbGluZ1Nwcml0ZSBhbmQgTWVzaFxuICAgICAqIENoYW5nZSB0byAxLjUgaWYgeW91IHRleHR1cmUgaGFzIHJlcGVhdGVkIHJpZ2h0IGFuZCBib3R0b20gbGluZXMsIHRoYXQgbGVhZHMgdG8gc21vb3RoZXIgYm9yZGVyc1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmNsYW1wT2Zmc2V0ID0gMDtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgZnJhbWUgY2xhbXBpbmdcbiAgICAgKiBXb3JrcyB3aXRoIFRpbGluZ1Nwcml0ZSBhbmQgTWVzaFxuICAgICAqIENoYW5nZSB0byAtMC41IHRvIGFkZCBhIHBpeGVsIHRvIHRoZSBlZGdlLCByZWNvbW1lbmRlZCBmb3IgdHJhbnNwYXJlbnQgdHJpbW1lZCB0ZXh0dXJlcyBpbiBhdGxhc1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgMC41XG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuY2xhbXBNYXJnaW4gPSAodHlwZW9mIGNsYW1wTWFyZ2luID09PSAndW5kZWZpbmVkJykgPyAwLjUgOiBjbGFtcE1hcmdpbjtcblxuICAgIC8qKlxuICAgICAqIElmIHRleHR1cmUgc2l6ZSBpcyB0aGUgc2FtZSBhcyBiYXNlVGV4dHVyZVxuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLmlzU2ltcGxlID0gZmFsc2U7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzJDQgPSB7IHRleHR1cmU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLyoqXG4gKiB0ZXh0dXJlIHByb3BlcnR5XG4gKiBAbWVtYmVyIHtQSVhJLlRleHR1cmV9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQ0LnRleHR1cmUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fdGV4dHVyZTtcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycyQ0LnRleHR1cmUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICB0aGlzLl90ZXh0dXJlID0gdmFsdWU7XG4gICAgdGhpcy5fdXBkYXRlSUQgPSAtMTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB1dnMgYXJyYXkgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gdXZzIG1lc2ggdXZzXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gW291dD11dnNdIG91dHB1dFxuICogQHJldHVybnMge0Zsb2F0MzJBcnJheX0gb3V0cHV0XG4gKi9cblRleHR1cmVNYXRyaXgucHJvdG90eXBlLm11bHRpcGx5VXZzID0gZnVuY3Rpb24gbXVsdGlwbHlVdnMgKHV2cywgb3V0KVxue1xuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZClcbiAgICB7XG4gICAgICAgIG91dCA9IHV2cztcbiAgICB9XG5cbiAgICB2YXIgbWF0ID0gdGhpcy5tYXBDb29yZDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXZzLmxlbmd0aDsgaSArPSAyKVxuICAgIHtcbiAgICAgICAgdmFyIHggPSB1dnNbaV07XG4gICAgICAgIHZhciB5ID0gdXZzW2kgKyAxXTtcblxuICAgICAgICBvdXRbaV0gPSAoeCAqIG1hdC5hKSArICh5ICogbWF0LmMpICsgbWF0LnR4O1xuICAgICAgICBvdXRbaSArIDFdID0gKHggKiBtYXQuYikgKyAoeSAqIG1hdC5kKSArIG1hdC50eTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiB1cGRhdGVzIG1hdHJpY2VzIGlmIHRleHR1cmUgd2FzIGNoYW5nZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlVXBkYXRlPWZhbHNlXSBpZiB0cnVlLCBtYXRyaWNlcyB3aWxsIGJlIHVwZGF0ZWQgYW55IGNhc2VcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIG9yIG5vdCBpdCB3YXMgdXBkYXRlZFxuICovXG5UZXh0dXJlTWF0cml4LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKGZvcmNlVXBkYXRlKVxue1xuICAgIHZhciB0ZXggPSB0aGlzLl90ZXh0dXJlO1xuXG4gICAgaWYgKCF0ZXggfHwgIXRleC52YWxpZClcbiAgICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWZvcmNlVXBkYXRlXG4gICAgICAgICYmIHRoaXMuX3VwZGF0ZUlEID09PSB0ZXguX3VwZGF0ZUlEKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUlEID0gdGV4Ll91cGRhdGVJRDtcblxuICAgIHZhciB1dnMgPSB0ZXguX3V2cztcblxuICAgIHRoaXMubWFwQ29vcmQuc2V0KHV2cy54MSAtIHV2cy54MCwgdXZzLnkxIC0gdXZzLnkwLCB1dnMueDMgLSB1dnMueDAsIHV2cy55MyAtIHV2cy55MCwgdXZzLngwLCB1dnMueTApO1xuXG4gICAgdmFyIG9yaWcgPSB0ZXgub3JpZztcbiAgICB2YXIgdHJpbSA9IHRleC50cmltO1xuXG4gICAgaWYgKHRyaW0pXG4gICAge1xuICAgICAgICB0ZW1wTWF0LnNldChvcmlnLndpZHRoIC8gdHJpbS53aWR0aCwgMCwgMCwgb3JpZy5oZWlnaHQgLyB0cmltLmhlaWdodCxcbiAgICAgICAgICAgIC10cmltLnggLyB0cmltLndpZHRoLCAtdHJpbS55IC8gdHJpbS5oZWlnaHQpO1xuICAgICAgICB0aGlzLm1hcENvb3JkLmFwcGVuZCh0ZW1wTWF0KTtcbiAgICB9XG5cbiAgICB2YXIgdGV4QmFzZSA9IHRleC5iYXNlVGV4dHVyZTtcbiAgICB2YXIgZnJhbWUgPSB0aGlzLnVDbGFtcEZyYW1lO1xuICAgIHZhciBtYXJnaW4gPSB0aGlzLmNsYW1wTWFyZ2luIC8gdGV4QmFzZS5yZXNvbHV0aW9uO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLmNsYW1wT2Zmc2V0O1xuXG4gICAgZnJhbWVbMF0gPSAodGV4Ll9mcmFtZS54ICsgbWFyZ2luICsgb2Zmc2V0KSAvIHRleEJhc2Uud2lkdGg7XG4gICAgZnJhbWVbMV0gPSAodGV4Ll9mcmFtZS55ICsgbWFyZ2luICsgb2Zmc2V0KSAvIHRleEJhc2UuaGVpZ2h0O1xuICAgIGZyYW1lWzJdID0gKHRleC5fZnJhbWUueCArIHRleC5fZnJhbWUud2lkdGggLSBtYXJnaW4gKyBvZmZzZXQpIC8gdGV4QmFzZS53aWR0aDtcbiAgICBmcmFtZVszXSA9ICh0ZXguX2ZyYW1lLnkgKyB0ZXguX2ZyYW1lLmhlaWdodCAtIG1hcmdpbiArIG9mZnNldCkgLyB0ZXhCYXNlLmhlaWdodDtcbiAgICB0aGlzLnVDbGFtcE9mZnNldFswXSA9IG9mZnNldCAvIHRleEJhc2UucmVhbFdpZHRoO1xuICAgIHRoaXMudUNsYW1wT2Zmc2V0WzFdID0gb2Zmc2V0IC8gdGV4QmFzZS5yZWFsSGVpZ2h0O1xuXG4gICAgdGhpcy5pc1NpbXBsZSA9IHRleC5fZnJhbWUud2lkdGggPT09IHRleEJhc2Uud2lkdGhcbiAgICAgICAgJiYgdGV4Ll9mcmFtZS5oZWlnaHQgPT09IHRleEJhc2UuaGVpZ2h0XG4gICAgICAgICYmIHRleC5yb3RhdGUgPT09IDA7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBUZXh0dXJlTWF0cml4LnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzJDQgKTtcblxuLyoqXG4gKiBUaGlzIGhhbmRsZXMgYSBTcHJpdGUgYWN0aW5nIGFzIGEgbWFzaywgYXMgb3Bwb3NlZCB0byBhIEdyYXBoaWMuXG4gKlxuICogV2ViR0wgb25seS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuRmlsdGVyXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgU3ByaXRlTWFza0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEZpbHRlcikge1xuICAgIGZ1bmN0aW9uIFNwcml0ZU1hc2tGaWx0ZXIoc3ByaXRlKVxuICAgIHtcbiAgICAgICAgdmFyIG1hc2tNYXRyaXggPSBuZXcgTWF0cml4KCk7XG5cbiAgICAgICAgRmlsdGVyLmNhbGwodGhpcywgdmVydGV4LCBmcmFnbWVudCk7XG5cbiAgICAgICAgc3ByaXRlLnJlbmRlcmFibGUgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3ByaXRlIG1hc2tcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5TcHJpdGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hc2tTcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hc2sgbWF0cml4XG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTWF0cml4fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXNrTWF0cml4ID0gbWFza01hdHJpeDtcbiAgICB9XG5cbiAgICBpZiAoIEZpbHRlciApIFNwcml0ZU1hc2tGaWx0ZXIuX19wcm90b19fID0gRmlsdGVyO1xuICAgIFNwcml0ZU1hc2tGaWx0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRmlsdGVyICYmIEZpbHRlci5wcm90b3R5cGUgKTtcbiAgICBTcHJpdGVNYXNrRmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwcml0ZU1hc2tGaWx0ZXI7XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBmaWx0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5zeXN0ZW1zLkZpbHRlclN5c3RlbX0gZmlsdGVyTWFuYWdlciAtIFRoZSByZW5kZXJlciB0byByZXRyaWV2ZSB0aGUgZmlsdGVyIGZyb21cbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gaW5wdXQgLSBUaGUgaW5wdXQgcmVuZGVyIHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gb3V0cHV0IC0gVGhlIHRhcmdldCB0byBvdXRwdXQgdG8uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjbGVhciAtIFNob3VsZCB0aGUgb3V0cHV0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbmRlcmluZyB0byBpdC5cbiAgICAgKi9cbiAgICBTcHJpdGVNYXNrRmlsdGVyLnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uIGFwcGx5IChmaWx0ZXJNYW5hZ2VyLCBpbnB1dCwgb3V0cHV0LCBjbGVhcilcbiAgICB7XG4gICAgICAgIHZhciBtYXNrU3ByaXRlID0gdGhpcy5tYXNrU3ByaXRlO1xuICAgICAgICB2YXIgdGV4ID0gdGhpcy5tYXNrU3ByaXRlLnRleHR1cmU7XG5cbiAgICAgICAgaWYgKCF0ZXgudmFsaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRleC50cmFuc2Zvcm0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG1hcmdpbiA9IDAuMCwgbGV0IGl0IGJsZWVkIGEgYml0LCBzaGFkZXIgY29kZSBiZWNvbWVzIGVhc2llclxuICAgICAgICAgICAgLy8gYXNzdW1pbmcgdGhhdCBhdGxhcyB0ZXh0dXJlcyB3ZXJlIG1hZGUgd2l0aCAxLXBpeGVsIHBhZGRpbmdcbiAgICAgICAgICAgIHRleC50cmFuc2Zvcm0gPSBuZXcgVGV4dHVyZU1hdHJpeCh0ZXgsIDAuMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGV4LnRyYW5zZm9ybS51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnVuaWZvcm1zLm5wbUFscGhhID0gdGV4LmJhc2VUZXh0dXJlLmFscGhhTW9kZSA/IDAuMCA6IDEuMDtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5tYXNrID0gdGV4O1xuICAgICAgICAvLyBnZXQgX25vcm1hbGl6ZWQgc3ByaXRlIHRleHR1cmUgY29vcmRzXyBhbmQgY29udmVydCB0aGVtIHRvIF9ub3JtYWxpemVkIGF0bGFzIHRleHR1cmUgY29vcmRzXyB3aXRoIGBwcmVwZW5kYFxuICAgICAgICB0aGlzLnVuaWZvcm1zLm90aGVyTWF0cml4ID0gZmlsdGVyTWFuYWdlci5jYWxjdWxhdGVTcHJpdGVNYXRyaXgodGhpcy5tYXNrTWF0cml4LCBtYXNrU3ByaXRlKVxuICAgICAgICAgICAgLnByZXBlbmQodGV4LnRyYW5zZm9ybS5tYXBDb29yZCk7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuYWxwaGEgPSBtYXNrU3ByaXRlLndvcmxkQWxwaGE7XG4gICAgICAgIHRoaXMudW5pZm9ybXMubWFza0NsYW1wID0gdGV4LnRyYW5zZm9ybS51Q2xhbXBGcmFtZTtcblxuICAgICAgICBmaWx0ZXJNYW5hZ2VyLmFwcGx5RmlsdGVyKHRoaXMsIGlucHV0LCBvdXRwdXQsIGNsZWFyKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNwcml0ZU1hc2tGaWx0ZXI7XG59KEZpbHRlcikpO1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSBtYXNrcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBNYXNrU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gTWFza1N5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGFyZ2V0IHRvIG1hc2tcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5EaXNwbGF5T2JqZWN0fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2Npc3NvclJlbmRlclRhcmdldCA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBzY2lzc29yXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmFibGVTY2lzc29yID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBvb2wgb2YgdXNlZCBzcHJpdGUgbWFzayBmaWx0ZXJzXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU3ByaXRlTWFza0ZpbHRlcltdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWxwaGFNYXNrUG9vbCA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb29sIG9mIG1hc2sgZGF0YVxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1hc2tEYXRhW119XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXNrRGF0YVBvb2wgPSBbXTtcblxuICAgICAgICB0aGlzLm1hc2tTdGFjayA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGluZGV4IG9mIGFscGhhIG1hc2sgcG9vbFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFscGhhTWFza0luZGV4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIFN5c3RlbSApIE1hc2tTeXN0ZW0uX19wcm90b19fID0gU3lzdGVtO1xuICAgIE1hc2tTeXN0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU3lzdGVtICYmIFN5c3RlbS5wcm90b3R5cGUgKTtcbiAgICBNYXNrU3lzdGVtLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1hc2tTeXN0ZW07XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBtYXNrIHN0YWNrIHRoYXQgaXMgdXNlZCBieSB0aGlzIFN5c3RlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5NYXNrRGF0YVtdfSBtYXNrU3RhY2sgLSBUaGUgbWFzayBzdGFja1xuICAgICAqL1xuICAgIE1hc2tTeXN0ZW0ucHJvdG90eXBlLnNldE1hc2tTdGFjayA9IGZ1bmN0aW9uIHNldE1hc2tTdGFjayAobWFza1N0YWNrKVxuICAgIHtcbiAgICAgICAgdGhpcy5tYXNrU3RhY2sgPSBtYXNrU3RhY2s7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2Npc3Nvci5zZXRNYXNrU3RhY2sobWFza1N0YWNrKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zdGVuY2lsLnNldE1hc2tTdGFjayhtYXNrU3RhY2spO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBNYXNrIGFuZCBhZGRzIGl0IHRvIHRoZSBjdXJyZW50IGZpbHRlciBzdGFjay5cbiAgICAgKiBSZW5kZXJlciBiYXRjaCBtdXN0IGJlIGZsdXNoZWQgYmVmb3JlaGFuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSB0YXJnZXQgLSBEaXNwbGF5IE9iamVjdCB0byBwdXNoIHRoZSBtYXNrIHRvXG4gICAgICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhfFBJWEkuU3ByaXRlfFBJWEkuR3JhcGhpY3N8UElYSS5EaXNwbGF5T2JqZWN0fSBtYXNrRGF0YSAtIFRoZSBtYXNraW5nIGRhdGEuXG4gICAgICovXG4gICAgTWFza1N5c3RlbS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKHRhcmdldCwgbWFza0RhdGEpXG4gICAge1xuICAgICAgICBpZiAoIW1hc2tEYXRhLmlzTWFza0RhdGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBkID0gdGhpcy5tYXNrRGF0YVBvb2wucG9wKCkgfHwgbmV3IE1hc2tEYXRhKCk7XG5cbiAgICAgICAgICAgIGQucG9vbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGQubWFza09iamVjdCA9IG1hc2tEYXRhO1xuICAgICAgICAgICAgbWFza0RhdGEgPSBkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hc2tEYXRhLmF1dG9EZXRlY3QpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZGV0ZWN0KG1hc2tEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tEYXRhLmNvcHlDb3VudGVyc09yUmVzZXQodGhpcy5tYXNrU3RhY2tbdGhpcy5tYXNrU3RhY2subGVuZ3RoIC0gMV0pO1xuICAgICAgICBtYXNrRGF0YS5fdGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgICAgIHN3aXRjaCAobWFza0RhdGEudHlwZSlcbiAgICAgICAge1xuICAgICAgICAgICAgY2FzZSBNQVNLX1RZUEVTLlNDSVNTT1I6XG4gICAgICAgICAgICAgICAgdGhpcy5tYXNrU3RhY2sucHVzaChtYXNrRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zY2lzc29yLnB1c2gobWFza0RhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNQVNLX1RZUEVTLlNURU5DSUw6XG4gICAgICAgICAgICAgICAgdGhpcy5tYXNrU3RhY2sucHVzaChtYXNrRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zdGVuY2lsLnB1c2gobWFza0RhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNQVNLX1RZUEVTLlNQUklURTpcbiAgICAgICAgICAgICAgICBtYXNrRGF0YS5jb3B5Q291bnRlcnNPclJlc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNwcml0ZU1hc2sobWFza0RhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFza1N0YWNrLnB1c2gobWFza0RhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXN0IG1hc2sgZnJvbSB0aGUgbWFzayBzdGFjayBhbmQgZG9lc24ndCByZXR1cm4gaXQuXG4gICAgICogUmVuZGVyZXIgYmF0Y2ggbXVzdCBiZSBmbHVzaGVkIGJlZm9yZWhhbmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gdGFyZ2V0IC0gRGlzcGxheSBPYmplY3QgdG8gcG9wIHRoZSBtYXNrIGZyb21cbiAgICAgKi9cbiAgICBNYXNrU3lzdGVtLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiBwb3AgKHRhcmdldClcbiAgICB7XG4gICAgICAgIHZhciBtYXNrRGF0YSA9IHRoaXMubWFza1N0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmICghbWFza0RhdGEgfHwgbWFza0RhdGEuX3RhcmdldCAhPT0gdGFyZ2V0KVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBhZGQgYW4gYXNzZXJ0IHdoZW4gd2UgaGF2ZSBpdFxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG1hc2tEYXRhLnR5cGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhc2UgTUFTS19UWVBFUy5TQ0lTU09SOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2Npc3Nvci5wb3AoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTUFTS19UWVBFUy5TVEVOQ0lMOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc3RlbmNpbC5wb3AobWFza0RhdGEubWFza09iamVjdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE1BU0tfVFlQRVMuU1BSSVRFOlxuICAgICAgICAgICAgICAgIHRoaXMucG9wU3ByaXRlTWFzaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tEYXRhLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKG1hc2tEYXRhLnBvb2xlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5tYXNrRGF0YVBvb2wucHVzaChtYXNrRGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0eXBlIG9mIE1hc2tEYXRhIGJhc2VkIG9uIGl0cyBtYXNrT2JqZWN0XG4gICAgICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhfSBtYXNrRGF0YVxuICAgICAqL1xuICAgIE1hc2tTeXN0ZW0ucHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uIGRldGVjdCAobWFza0RhdGEpXG4gICAge1xuICAgICAgICB2YXIgbWFza09iamVjdCA9IG1hc2tEYXRhLm1hc2tPYmplY3Q7XG5cbiAgICAgICAgaWYgKG1hc2tPYmplY3QuaXNTcHJpdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG1hc2tEYXRhLnR5cGUgPSBNQVNLX1RZUEVTLlNQUklURTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG1hc2tEYXRhLnR5cGUgPSBNQVNLX1RZUEVTLlNURU5DSUw7XG4gICAgICAgIC8vIGRldGVjdCBzY2lzc29yIGluIGdyYXBoaWNzXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVNjaXNzb3JcbiAgICAgICAgICAgICYmIG1hc2tPYmplY3QuaXNGYXN0UmVjdFxuICAgICAgICAgICAgJiYgbWFza09iamVjdC5pc0Zhc3RSZWN0KCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSBtYXNrT2JqZWN0LndvcmxkVHJhbnNmb3JtO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoZSBjaGVjayB0byB0aGUgbWF0cml4IGl0c2VsZlxuICAgICAgICAgICAgLy8gd2UgYXJlIGNoZWNraW5nIHRoYXQgaXRzIG9ydGhvZ29uYWwgYW5kIHggcm90YXRpb24gaXMgMCA5MCAxODAgb3IgMjcwXG5cbiAgICAgICAgICAgIHZhciByb3RYID0gTWF0aC5hdGFuMihtYXRyaXguYiwgbWF0cml4LmEpO1xuICAgICAgICAgICAgdmFyIHJvdFhZID0gTWF0aC5hdGFuMihtYXRyaXguZCwgbWF0cml4LmMpO1xuXG4gICAgICAgICAgICAvLyB1c2UgdGhlIG5lYXJlc3QgZGVncmVlIHRvIDAuMDFcbiAgICAgICAgICAgIHJvdFggPSBNYXRoLnJvdW5kKHJvdFggKiAoMTgwIC8gTWF0aC5QSSkgKiAxMDApO1xuICAgICAgICAgICAgcm90WFkgPSBNYXRoLnJvdW5kKHJvdFhZICogKDE4MCAvIE1hdGguUEkpICogMTAwKSAtIHJvdFg7XG5cbiAgICAgICAgICAgIHJvdFggPSAoKHJvdFggJSA5MDAwKSArIDkwMDApICUgOTAwMDtcbiAgICAgICAgICAgIHJvdFhZID0gKChyb3RYWSAlIDE4MDAwKSArIDE4MDAwKSAlIDE4MDAwO1xuXG4gICAgICAgICAgICBpZiAocm90WCA9PT0gMCAmJiByb3RYWSA9PT0gOTAwMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXNrRGF0YS50eXBlID0gTUFTS19UWVBFUy5TQ0lTU09SO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIE1hc2sgYW5kIGFkZHMgaXQgdG8gdGhlIGN1cnJlbnQgZmlsdGVyIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhfSBtYXNrRGF0YSAtIFNwcml0ZSB0byBiZSB1c2VkIGFzIHRoZSBtYXNrXG4gICAgICovXG4gICAgTWFza1N5c3RlbS5wcm90b3R5cGUucHVzaFNwcml0ZU1hc2sgPSBmdW5jdGlvbiBwdXNoU3ByaXRlTWFzayAobWFza0RhdGEpXG4gICAge1xuICAgICAgICB2YXIgbWFza09iamVjdCA9IG1hc2tEYXRhLm1hc2tPYmplY3Q7XG4gICAgICAgIHZhciB0YXJnZXQgPSBtYXNrRGF0YS5fdGFyZ2V0O1xuICAgICAgICB2YXIgYWxwaGFNYXNrRmlsdGVyID0gdGhpcy5hbHBoYU1hc2tQb29sW3RoaXMuYWxwaGFNYXNrSW5kZXhdO1xuXG4gICAgICAgIGlmICghYWxwaGFNYXNrRmlsdGVyKVxuICAgICAgICB7XG4gICAgICAgICAgICBhbHBoYU1hc2tGaWx0ZXIgPSB0aGlzLmFscGhhTWFza1Bvb2xbdGhpcy5hbHBoYU1hc2tJbmRleF0gPSBbbmV3IFNwcml0ZU1hc2tGaWx0ZXIobWFza09iamVjdCldO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxwaGFNYXNrRmlsdGVyWzBdLnJlc29sdXRpb24gPSB0aGlzLnJlbmRlcmVyLnJlc29sdXRpb247XG4gICAgICAgIGFscGhhTWFza0ZpbHRlclswXS5tYXNrU3ByaXRlID0gbWFza09iamVjdDtcblxuICAgICAgICB2YXIgc3Rhc2hGaWx0ZXJBcmVhID0gdGFyZ2V0LmZpbHRlckFyZWE7XG5cbiAgICAgICAgdGFyZ2V0LmZpbHRlckFyZWEgPSBtYXNrT2JqZWN0LmdldEJvdW5kcyh0cnVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5maWx0ZXIucHVzaCh0YXJnZXQsIGFscGhhTWFza0ZpbHRlcik7XG4gICAgICAgIHRhcmdldC5maWx0ZXJBcmVhID0gc3Rhc2hGaWx0ZXJBcmVhO1xuXG4gICAgICAgIHRoaXMuYWxwaGFNYXNrSW5kZXgrKztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGFzdCBmaWx0ZXIgZnJvbSB0aGUgZmlsdGVyIHN0YWNrIGFuZCBkb2Vzbid0IHJldHVybiBpdC5cbiAgICAgKi9cbiAgICBNYXNrU3lzdGVtLnByb3RvdHlwZS5wb3BTcHJpdGVNYXNrID0gZnVuY3Rpb24gcG9wU3ByaXRlTWFzayAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5maWx0ZXIucG9wKCk7XG4gICAgICAgIHRoaXMuYWxwaGFNYXNrSW5kZXgtLTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIE1hc2tTeXN0ZW07XG59KFN5c3RlbSkpO1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSBtYXNrcyBvZiBjZXJ0YWluIHR5cGVcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBBYnN0cmFjdE1hc2tTeXN0ZW0gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTeXN0ZW0pIHtcbiAgICBmdW5jdGlvbiBBYnN0cmFjdE1hc2tTeXN0ZW0ocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBTeXN0ZW0uY2FsbCh0aGlzLCByZW5kZXJlcik7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtYXNrIHN0YWNrXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTWFza0RhdGFbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFza1N0YWNrID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0YW50IGZvciBnbC5lbmFibGVcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nbENvbnN0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIFN5c3RlbSApIEFic3RyYWN0TWFza1N5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgQWJzdHJhY3RNYXNrU3lzdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFN5c3RlbSAmJiBTeXN0ZW0ucHJvdG90eXBlICk7XG4gICAgQWJzdHJhY3RNYXNrU3lzdGVtLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFic3RyYWN0TWFza1N5c3RlbTtcblxuICAgIC8qKlxuICAgICAqIGdldHMgY291bnQgb2YgbWFza3Mgb2YgY2VydGFpbiB0eXBlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBBYnN0cmFjdE1hc2tTeXN0ZW0ucHJvdG90eXBlLmdldFN0YWNrTGVuZ3RoID0gZnVuY3Rpb24gZ2V0U3RhY2tMZW5ndGggKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hc2tTdGFjay5sZW5ndGg7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIG1hc2sgc3RhY2sgdGhhdCBpcyB1c2VkIGJ5IHRoaXMgU3lzdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhW119IG1hc2tTdGFjayAtIFRoZSBtYXNrIHN0YWNrXG4gICAgICovXG4gICAgQWJzdHJhY3RNYXNrU3lzdGVtLnByb3RvdHlwZS5zZXRNYXNrU3RhY2sgPSBmdW5jdGlvbiBzZXRNYXNrU3RhY2sgKG1hc2tTdGFjaylcbiAgICB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG4gICAgICAgIHZhciBjdXJTdGFja0xlbiA9IHRoaXMuZ2V0U3RhY2tMZW5ndGgoKTtcblxuICAgICAgICB0aGlzLm1hc2tTdGFjayA9IG1hc2tTdGFjaztcblxuICAgICAgICB2YXIgbmV3U3RhY2tMZW4gPSB0aGlzLmdldFN0YWNrTGVuZ3RoKCk7XG5cbiAgICAgICAgaWYgKG5ld1N0YWNrTGVuICE9PSBjdXJTdGFja0xlbilcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuID09PSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdsLmRpc2FibGUodGhpcy5nbENvbnN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUodGhpcy5nbENvbnN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VDdXJyZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0dXAgcmVuZGVyZXIgdG8gdXNlIHRoZSBjdXJyZW50IG1hc2sgZGF0YS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEFic3RyYWN0TWFza1N5c3RlbS5wcm90b3R5cGUuX3VzZUN1cnJlbnQgPSBmdW5jdGlvbiBfdXNlQ3VycmVudCAoKVxuICAgIHtcbiAgICAgICAgLy8gT1ZFUldSSVRFO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgbWFzayBzdGFjay5cbiAgICAgKlxuICAgICAqL1xuICAgIEFic3RyYWN0TWFza1N5c3RlbS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbiAgICB7XG4gICAgICAgIFN5c3RlbS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMubWFza1N0YWNrID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEFic3RyYWN0TWFza1N5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIHNjaXNzb3IgcmVjdHMgKHVzZWQgZm9yIG1hc2tzKS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBTY2lzc29yU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQWJzdHJhY3RNYXNrU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gU2Npc3NvclN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIEFic3RyYWN0TWFza1N5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLmdsQ29uc3QgPSBXZWJHTFJlbmRlcmluZ0NvbnRleHQuU0NJU1NPUl9URVNUO1xuICAgIH1cblxuICAgIGlmICggQWJzdHJhY3RNYXNrU3lzdGVtICkgU2Npc3NvclN5c3RlbS5fX3Byb3RvX18gPSBBYnN0cmFjdE1hc2tTeXN0ZW07XG4gICAgU2Npc3NvclN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBYnN0cmFjdE1hc2tTeXN0ZW0gJiYgQWJzdHJhY3RNYXNrU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFNjaXNzb3JTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2Npc3NvclN5c3RlbTtcblxuICAgIFNjaXNzb3JTeXN0ZW0ucHJvdG90eXBlLmdldFN0YWNrTGVuZ3RoID0gZnVuY3Rpb24gZ2V0U3RhY2tMZW5ndGggKClcbiAgICB7XG4gICAgICAgIHZhciBtYXNrRGF0YSA9IHRoaXMubWFza1N0YWNrW3RoaXMubWFza1N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGlmIChtYXNrRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tEYXRhLl9zY2lzc29yQ291bnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBNYXNrIGFuZCBhZGRzIGl0IHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgc3RhY2suIEBhbHZpblxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLk1hc2tEYXRhfSBtYXNrRGF0YSAtIFRoZSBtYXNrIGRhdGFcbiAgICAgKi9cbiAgICBTY2lzc29yU3lzdGVtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAobWFza0RhdGEpXG4gICAge1xuICAgICAgICB2YXIgbWFza09iamVjdCA9IG1hc2tEYXRhLm1hc2tPYmplY3Q7XG5cbiAgICAgICAgbWFza09iamVjdC5yZW5kZXJhYmxlID0gdHJ1ZTtcblxuICAgICAgICB2YXIgcHJldkRhdGEgPSBtYXNrRGF0YS5fc2Npc3NvclJlY3Q7XG4gICAgICAgIHZhciBib3VuZHMgPSBtYXNrT2JqZWN0LmdldEJvdW5kcyh0cnVlKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICBtYXNrT2JqZWN0LnJlbmRlcmFibGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHJldkRhdGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJvdW5kcy5maXQocHJldkRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXNrRGF0YS5fc2Npc3NvckNvdW50ZXIrKztcbiAgICAgICAgbWFza0RhdGEuX3NjaXNzb3JSZWN0ID0gYm91bmRzO1xuICAgICAgICB0aGlzLl91c2VDdXJyZW50KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBvcHMgc2Npc3NvciBtYXNrLiBNYXNrRGF0YSBpcyBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdGFja1xuICAgICAqL1xuICAgIFNjaXNzb3JTeXN0ZW0ucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uIHBvcCAoKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICBpZiAodGhpcy5nZXRTdGFja0xlbmd0aCgpID4gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdXNlQ3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIHJlbmRlcmVyIHRvIHVzZSB0aGUgY3VycmVudCBzY2lzc29yIGRhdGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTY2lzc29yU3lzdGVtLnByb3RvdHlwZS5fdXNlQ3VycmVudCA9IGZ1bmN0aW9uIF91c2VDdXJyZW50ICgpXG4gICAge1xuICAgICAgICB2YXIgcmVjdCA9IHRoaXMubWFza1N0YWNrW3RoaXMubWFza1N0YWNrLmxlbmd0aCAtIDFdLl9zY2lzc29yUmVjdDtcbiAgICAgICAgdmFyIHJ0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJUZXh0dXJlLmN1cnJlbnQ7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLnJlbmRlcmVyLnByb2plY3Rpb247XG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSByZWYudHJhbnNmb3JtO1xuICAgICAgICB2YXIgc291cmNlRnJhbWUgPSByZWYuc291cmNlRnJhbWU7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbkZyYW1lID0gcmVmLmRlc3RpbmF0aW9uRnJhbWU7XG4gICAgICAgIHZhciByZXNvbHV0aW9uID0gcnQgPyBydC5yZXNvbHV0aW9uIDogdGhpcy5yZW5kZXJlci5yZXNvbHV0aW9uO1xuICAgICAgICB2YXIgeCA9ICgocmVjdC54IC0gc291cmNlRnJhbWUueCkgKiByZXNvbHV0aW9uKSArIGRlc3RpbmF0aW9uRnJhbWUueDtcbiAgICAgICAgdmFyIHkgPSAoKHJlY3QueSAtIHNvdXJjZUZyYW1lLnkpICogcmVzb2x1dGlvbikgKyBkZXN0aW5hdGlvbkZyYW1lLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IHJlY3Qud2lkdGggKiByZXNvbHV0aW9uO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiByZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHggKz0gdHJhbnNmb3JtLnR4ICogcmVzb2x1dGlvbjtcbiAgICAgICAgICAgIHkgKz0gdHJhbnNmb3JtLnR5ICogcmVzb2x1dGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ0KVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBmbGlwWS4gSW4gZnV0dXJlIHdlJ2xsIGhhdmUgaXQgb3ZlciByZW5kZXJUZXh0dXJlcyBhcyBhbiBvcHRpb25cbiAgICAgICAgICAgIHkgPSB0aGlzLnJlbmRlcmVyLmhlaWdodCAtIGhlaWdodCAtIHk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcmVyLmdsLnNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTY2lzc29yU3lzdGVtO1xufShBYnN0cmFjdE1hc2tTeXN0ZW0pKTtcblxuLyoqXG4gKiBTeXN0ZW0gcGx1Z2luIHRvIHRoZSByZW5kZXJlciB0byBtYW5hZ2Ugc3RlbmNpbHMgKHVzZWQgZm9yIG1hc2tzKS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBTdGVuY2lsU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQWJzdHJhY3RNYXNrU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gU3RlbmNpbFN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIEFic3RyYWN0TWFza1N5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLmdsQ29uc3QgPSBXZWJHTFJlbmRlcmluZ0NvbnRleHQuU1RFTkNJTF9URVNUO1xuICAgIH1cblxuICAgIGlmICggQWJzdHJhY3RNYXNrU3lzdGVtICkgU3RlbmNpbFN5c3RlbS5fX3Byb3RvX18gPSBBYnN0cmFjdE1hc2tTeXN0ZW07XG4gICAgU3RlbmNpbFN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBYnN0cmFjdE1hc2tTeXN0ZW0gJiYgQWJzdHJhY3RNYXNrU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFN0ZW5jaWxTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3RlbmNpbFN5c3RlbTtcblxuICAgIFN0ZW5jaWxTeXN0ZW0ucHJvdG90eXBlLmdldFN0YWNrTGVuZ3RoID0gZnVuY3Rpb24gZ2V0U3RhY2tMZW5ndGggKClcbiAgICB7XG4gICAgICAgIHZhciBtYXNrRGF0YSA9IHRoaXMubWFza1N0YWNrW3RoaXMubWFza1N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGlmIChtYXNrRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hc2tEYXRhLl9zdGVuY2lsQ291bnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBNYXNrIGFuZCBhZGRzIGl0IHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuTWFza0RhdGF9IG1hc2tEYXRhIC0gVGhlIG1hc2sgZGF0YVxuICAgICAqL1xuICAgIFN0ZW5jaWxTeXN0ZW0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChtYXNrRGF0YSlcbiAgICB7XG4gICAgICAgIHZhciBtYXNrT2JqZWN0ID0gbWFza0RhdGEubWFza09iamVjdDtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcbiAgICAgICAgdmFyIHByZXZNYXNrQ291bnQgPSBtYXNrRGF0YS5fc3RlbmNpbENvdW50ZXI7XG5cbiAgICAgICAgaWYgKHByZXZNYXNrQ291bnQgPT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGZvcmNlIHVzZSBzdGVuY2lsIHRleHR1cmUgaW4gY3VycmVudCBmcmFtZWJ1ZmZlclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5mcmFtZWJ1ZmZlci5mb3JjZVN0ZW5jaWwoKTtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFza0RhdGEuX3N0ZW5jaWxDb3VudGVyKys7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2Ugc3RlbmNpbCB2YWx1ZSB3aGVyZSB0aGUgbmV3IG1hc2sgb3ZlcmxhcHMgd2l0aCB0aGUgb2xkIG9uZXMuXG4gICAgICAgIGdsLmNvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCBwcmV2TWFza0NvdW50LCB0aGlzLl9nZXRCaXR3aXNlTWFzaygpKTtcbiAgICAgICAgZ2wuc3RlbmNpbE9wKGdsLktFRVAsIGdsLktFRVAsIGdsLklOQ1IpO1xuXG4gICAgICAgIG1hc2tPYmplY3QucmVuZGVyYWJsZSA9IHRydWU7XG4gICAgICAgIG1hc2tPYmplY3QucmVuZGVyKHRoaXMucmVuZGVyZXIpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmJhdGNoLmZsdXNoKCk7XG4gICAgICAgIG1hc2tPYmplY3QucmVuZGVyYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3VzZUN1cnJlbnQoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUG9wcyBzdGVuY2lsIG1hc2suIE1hc2tEYXRhIGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN0YWNrXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gbWFza09iamVjdCAtIG9iamVjdCBvZiBwb3BwZWQgbWFzayBkYXRhXG4gICAgICovXG4gICAgU3RlbmNpbFN5c3RlbS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gcG9wIChtYXNrT2JqZWN0KVxuICAgIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5yZW5kZXJlci5nbDtcblxuICAgICAgICBpZiAodGhpcy5nZXRTdGFja0xlbmd0aCgpID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB0aGUgc3RhY2sgaXMgZW1wdHkhXG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuICAgICAgICAgICAgZ2wuY2xlYXJTdGVuY2lsKDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2Ugc3RlbmNpbCB2YWx1ZSB3aGVyZSB0aGUgcG9wcGVkIG1hc2sgb3ZlcmxhcHMgd2l0aCB0aGUgb3RoZXIgb25lc1xuICAgICAgICAgICAgZ2wuY29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5ERUNSKTtcblxuICAgICAgICAgICAgbWFza09iamVjdC5yZW5kZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hc2tPYmplY3QucmVuZGVyKHRoaXMucmVuZGVyZXIpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5iYXRjaC5mbHVzaCgpO1xuICAgICAgICAgICAgbWFza09iamVjdC5yZW5kZXJhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuX3VzZUN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCByZW5kZXJlciB0byB1c2UgdGhlIGN1cnJlbnQgc3RlbmNpbCBkYXRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU3RlbmNpbFN5c3RlbS5wcm90b3R5cGUuX3VzZUN1cnJlbnQgPSBmdW5jdGlvbiBfdXNlQ3VycmVudCAoKVxuICAgIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5yZW5kZXJlci5nbDtcblxuICAgICAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCB0aGlzLmdldFN0YWNrTGVuZ3RoKCksIHRoaXMuX2dldEJpdHdpc2VNYXNrKCkpO1xuICAgICAgICBnbC5zdGVuY2lsT3AoZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbGwgMXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBhY2l0dmUgc3RlbmNpbCBtYXNrcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGJpdHdpc2UgbWFzay5cbiAgICAgKi9cbiAgICBTdGVuY2lsU3lzdGVtLnByb3RvdHlwZS5fZ2V0Qml0d2lzZU1hc2sgPSBmdW5jdGlvbiBfZ2V0Qml0d2lzZU1hc2sgKClcbiAgICB7XG4gICAgICAgIHJldHVybiAoMSA8PCB0aGlzLmdldFN0YWNrTGVuZ3RoKCkpIC0gMTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFN0ZW5jaWxTeXN0ZW07XG59KEFic3RyYWN0TWFza1N5c3RlbSkpO1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSB0aGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlN5c3RlbVxuICogQG1lbWJlcm9mIFBJWEkuc3lzdGVtc1xuICovXG5cbnZhciBQcm9qZWN0aW9uU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gUHJvamVjdGlvblN5c3RlbShyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIFN5c3RlbS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVzdGluYXRpb24gZnJhbWVcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbkZyYW1lID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU291cmNlIGZyYW1lXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc291cmNlRnJhbWUgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZhdWx0IGRlc3RpbmF0aW9uIGZyYW1lXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVmYXVsdEZyYW1lID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvamVjdCBtYXRyaXhcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5NYXRyaXh9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRyYW5zZm9ybSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAqIGlmIG51bGwsIG5vdGhpbmcgd2lsbCBiZSBhcHBsaWVkXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTWF0cml4fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgUHJvamVjdGlvblN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgUHJvamVjdGlvblN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTeXN0ZW0gJiYgU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFByb2plY3Rpb25TeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHJvamVjdGlvblN5c3RlbTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbWF0cml4IGJhc2VkIG9uIGEgcHJvamVjdGlvbiBmcmFtZSAod2hpY2ggaXMgYSByZWN0YW5nbGUpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBkZXN0aW5hdGlvbkZyYW1lIC0gVGhlIGRlc3RpbmF0aW9uIGZyYW1lLlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IHNvdXJjZUZyYW1lIC0gVGhlIHNvdXJjZSBmcmFtZS5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gcmVzb2x1dGlvbiAtIFJlc29sdXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJvb3QgLSBJZiBpcyByb290XG4gICAgICovXG4gICAgUHJvamVjdGlvblN5c3RlbS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChkZXN0aW5hdGlvbkZyYW1lLCBzb3VyY2VGcmFtZSwgcmVzb2x1dGlvbiwgcm9vdClcbiAgICB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb25GcmFtZSA9IGRlc3RpbmF0aW9uRnJhbWUgfHwgdGhpcy5kZXN0aW5hdGlvbkZyYW1lIHx8IHRoaXMuZGVmYXVsdEZyYW1lO1xuICAgICAgICB0aGlzLnNvdXJjZUZyYW1lID0gc291cmNlRnJhbWUgfHwgdGhpcy5zb3VyY2VGcmFtZSB8fCBkZXN0aW5hdGlvbkZyYW1lO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUHJvamVjdGlvbih0aGlzLmRlc3RpbmF0aW9uRnJhbWUsIHRoaXMuc291cmNlRnJhbWUsIHJlc29sdXRpb24sIHJvb3QpO1xuXG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4LmFwcGVuZCh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVuZGVyZXIgPSAgdGhpcy5yZW5kZXJlcjtcblxuICAgICAgICByZW5kZXJlci5nbG9iYWxVbmlmb3Jtcy51bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4ID0gdGhpcy5wcm9qZWN0aW9uTWF0cml4O1xuICAgICAgICByZW5kZXJlci5nbG9iYWxVbmlmb3Jtcy51cGRhdGUoKTtcblxuICAgICAgICAvLyB0aGlzIHdpbGwgd29yayBmb3Igbm93XG4gICAgICAgIC8vIGJ1dCB3b3VsZCBiZSBzd2VldCB0byBzdGljayBhbmQgZXZlbiBvbiB0aGUgZ2xvYmFsIHVuaWZvcm1zLi5cbiAgICAgICAgaWYgKHJlbmRlcmVyLnNoYWRlci5zaGFkZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNoYWRlci5zeW5jVW5pZm9ybUdyb3VwKHJlbmRlcmVyLnNoYWRlci5zaGFkZXIudW5pZm9ybXMuZ2xvYmFscyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtYXRyaXggYmFzZWQgb24gYSBwcm9qZWN0aW9uIGZyYW1lICh3aGljaCBpcyBhIHJlY3RhbmdsZSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IGRlc3RpbmF0aW9uRnJhbWUgLSBUaGUgZGVzdGluYXRpb24gZnJhbWUuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gc291cmNlRnJhbWUgLSBUaGUgc291cmNlIGZyYW1lLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByZXNvbHV0aW9uIC0gUmVzb2x1dGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcm9vdCAtIElmIGlzIHJvb3RcbiAgICAgKi9cbiAgICBQcm9qZWN0aW9uU3lzdGVtLnByb3RvdHlwZS5jYWxjdWxhdGVQcm9qZWN0aW9uID0gZnVuY3Rpb24gY2FsY3VsYXRlUHJvamVjdGlvbiAoZGVzdGluYXRpb25GcmFtZSwgc291cmNlRnJhbWUsIHJlc29sdXRpb24sIHJvb3QpXG4gICAge1xuICAgICAgICB2YXIgcG0gPSB0aGlzLnByb2plY3Rpb25NYXRyaXg7XG5cbiAgICAgICAgLy8gSSBkb24ndCB0aGluayB3ZSB3aWxsIG5lZWQgdGhpcyBsaW5lLi5cbiAgICAgICAgLy8gcG0uaWRlbnRpdHkoKTtcblxuICAgICAgICBpZiAoIXJvb3QpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBtLmEgPSAoMSAvIGRlc3RpbmF0aW9uRnJhbWUud2lkdGggKiAyKSAqIHJlc29sdXRpb247XG4gICAgICAgICAgICBwbS5kID0gKDEgLyBkZXN0aW5hdGlvbkZyYW1lLmhlaWdodCAqIDIpICogcmVzb2x1dGlvbjtcblxuICAgICAgICAgICAgcG0udHggPSAtMSAtIChzb3VyY2VGcmFtZS54ICogcG0uYSk7XG4gICAgICAgICAgICBwbS50eSA9IC0xIC0gKHNvdXJjZUZyYW1lLnkgKiBwbS5kKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBtLmEgPSAoMSAvIGRlc3RpbmF0aW9uRnJhbWUud2lkdGggKiAyKSAqIHJlc29sdXRpb247XG4gICAgICAgICAgICBwbS5kID0gKC0xIC8gZGVzdGluYXRpb25GcmFtZS5oZWlnaHQgKiAyKSAqIHJlc29sdXRpb247XG5cbiAgICAgICAgICAgIHBtLnR4ID0gLTEgLSAoc291cmNlRnJhbWUueCAqIHBtLmEpO1xuICAgICAgICAgICAgcG0udHkgPSAxIC0gKHNvdXJjZUZyYW1lLnkgKiBwbS5kKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0IHRvIHRoZSBnaXZlbiBtYXRyaXhcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKi9cbiAgICBQcm9qZWN0aW9uU3lzdGVtLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBzZXRUcmFuc2Zvcm0gKCkvLyBtYXRyaXgpXG4gICAge1xuICAgICAgICAvLyB0aGlzLl9hY3RpdmVSZW5kZXJUYXJnZXQudHJhbnNmb3JtID0gbWF0cml4O1xuICAgIH07XG5cbiAgICByZXR1cm4gUHJvamVjdGlvblN5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbnZhciB0ZW1wUmVjdCA9IG5ldyBSZWN0YW5nbGUoKTtcblxuLyoqXG4gKiBTeXN0ZW0gcGx1Z2luIHRvIHRoZSByZW5kZXJlciB0byBtYW5hZ2UgcmVuZGVyIHRleHR1cmVzLlxuICpcbiAqIFNob3VsZCBiZSBhZGRlZCBhZnRlciBGcmFtZWJ1ZmZlclN5c3RlbVxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5TeXN0ZW1cbiAqIEBtZW1iZXJvZiBQSVhJLnN5c3RlbXNcbiAqL1xuXG52YXIgUmVuZGVyVGV4dHVyZVN5c3RlbSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFN5c3RlbSkge1xuICAgIGZ1bmN0aW9uIFJlbmRlclRleHR1cmVTeXN0ZW0ocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBTeXN0ZW0uY2FsbCh0aGlzLCByZW5kZXJlcik7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjbGVhciBiYWNrZ3JvdW5kIGNvbG9yIGFzIHJnYmFcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IgPSByZW5kZXJlci5fYmFja2dyb3VuZENvbG9yUmdiYTtcblxuICAgICAgICAvLyBUT0RPIG1vdmUgdGhpcyBwcm9wZXJ0eSBzb21ld2hlcmUgZWxzZSFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgbWFza3MgZm9yIHRoZSBTdGVuY2lsU3lzdGVtXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuR3JhcGhpY3NbXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlZmF1bHRNYXNrU3RhY2sgPSBbXTtcblxuICAgICAgICAvLyBlbXB0eSByZW5kZXIgdGV4dHVyZT9cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbmRlciB0ZXh0dXJlXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuUmVuZGVyVGV4dHVyZX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTb3VyY2UgZnJhbWVcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2VGcmFtZSA9IG5ldyBSZWN0YW5nbGUoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVzdGluYXRpb24gZnJhbWVcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbkZyYW1lID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgUmVuZGVyVGV4dHVyZVN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgUmVuZGVyVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTeXN0ZW0gJiYgU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFJlbmRlclRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVuZGVyVGV4dHVyZVN5c3RlbTtcblxuICAgIC8qKlxuICAgICAqIEJpbmQgdGhlIGN1cnJlbnQgcmVuZGVyIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gW3JlbmRlclRleHR1cmVdIC0gUmVuZGVyVGV4dHVyZSB0byBiaW5kLCBieSBkZWZhdWx0IGl0cyBgbnVsbGAsIHRoZSBzY3JlZW5cbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBbc291cmNlRnJhbWVdIC0gcGFydCBvZiBzY3JlZW4gdGhhdCBpcyBtYXBwZWQgdG8gdGhlIHJlbmRlclRleHR1cmVcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVjdGFuZ2xlfSBbZGVzdGluYXRpb25GcmFtZV0gLSBwYXJ0IG9mIHJlbmRlclRleHR1cmUsIGJ5IGRlZmF1bHQgaXQgaGFzIHRoZSBzYW1lIHNpemUgYXMgc291cmNlRnJhbWVcbiAgICAgKi9cbiAgICBSZW5kZXJUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCAocmVuZGVyVGV4dHVyZSwgc291cmNlRnJhbWUsIGRlc3RpbmF0aW9uRnJhbWUpXG4gICAge1xuICAgICAgICBpZiAoIHJlbmRlclRleHR1cmUgPT09IHZvaWQgMCApIHJlbmRlclRleHR1cmUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3VycmVudCA9IHJlbmRlclRleHR1cmU7XG5cbiAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcblxuICAgICAgICB2YXIgcmVzb2x1dGlvbjtcblxuICAgICAgICBpZiAocmVuZGVyVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGJhc2VUZXh0dXJlID0gcmVuZGVyVGV4dHVyZS5iYXNlVGV4dHVyZTtcblxuICAgICAgICAgICAgcmVzb2x1dGlvbiA9IGJhc2VUZXh0dXJlLnJlc29sdXRpb247XG5cbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25GcmFtZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW1wUmVjdC53aWR0aCA9IGJhc2VUZXh0dXJlLnJlYWxXaWR0aDtcbiAgICAgICAgICAgICAgICB0ZW1wUmVjdC5oZWlnaHQgPSBiYXNlVGV4dHVyZS5yZWFsSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZSA9IHRlbXBSZWN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNvdXJjZUZyYW1lKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNvdXJjZUZyYW1lID0gZGVzdGluYXRpb25GcmFtZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5mcmFtZWJ1ZmZlci5iaW5kKGJhc2VUZXh0dXJlLmZyYW1lYnVmZmVyLCBkZXN0aW5hdGlvbkZyYW1lKTtcblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5wcm9qZWN0aW9uLnVwZGF0ZShkZXN0aW5hdGlvbkZyYW1lLCBzb3VyY2VGcmFtZSwgcmVzb2x1dGlvbiwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5tYXNrLnNldE1hc2tTdGFjayhiYXNlVGV4dHVyZS5tYXNrU3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHRoaXMucmVuZGVyZXIucmVzb2x1dGlvbjtcblxuICAgICAgICAgICAgLy8gVE9ETyB0aGVzZSB2YWxpZGF0aW9uIGNoZWNrcyBoYXBwZW4gZGVlcGVyIGRvd24uLlxuICAgICAgICAgICAgLy8gdGhpbmcgdGhleSBjYW4gYmUgYXZvaWRlZC4uXG4gICAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uRnJhbWUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGVtcFJlY3Qud2lkdGggPSByZW5kZXJlci53aWR0aDtcbiAgICAgICAgICAgICAgICB0ZW1wUmVjdC5oZWlnaHQgPSByZW5kZXJlci5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkZyYW1lID0gdGVtcFJlY3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc291cmNlRnJhbWUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlRnJhbWUgPSBkZXN0aW5hdGlvbkZyYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJlci5mcmFtZWJ1ZmZlci5iaW5kKG51bGwsIGRlc3RpbmF0aW9uRnJhbWUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIHN0b3JlIHRoaXMuLlxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5wcm9qZWN0aW9uLnVwZGF0ZShkZXN0aW5hdGlvbkZyYW1lLCBzb3VyY2VGcmFtZSwgcmVzb2x1dGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLm1hc2suc2V0TWFza1N0YWNrKHRoaXMuZGVmYXVsdE1hc2tTdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvdXJjZUZyYW1lLmNvcHlGcm9tKHNvdXJjZUZyYW1lKTtcblxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uRnJhbWUueCA9IGRlc3RpbmF0aW9uRnJhbWUueCAvIHJlc29sdXRpb247XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb25GcmFtZS55ID0gZGVzdGluYXRpb25GcmFtZS55IC8gcmVzb2x1dGlvbjtcblxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uRnJhbWUud2lkdGggPSBkZXN0aW5hdGlvbkZyYW1lLndpZHRoIC8gcmVzb2x1dGlvbjtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbkZyYW1lLmhlaWdodCA9IGRlc3RpbmF0aW9uRnJhbWUuaGVpZ2h0IC8gcmVzb2x1dGlvbjtcblxuICAgICAgICBpZiAoc291cmNlRnJhbWUgPT09IGRlc3RpbmF0aW9uRnJhbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlRnJhbWUuY29weUZyb20odGhpcy5kZXN0aW5hdGlvbkZyYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFcmFzZXMgdGhlIHJlbmRlciB0ZXh0dXJlIGFuZCBmaWxscyB0aGUgZHJhd2luZyBhcmVhIHdpdGggYSBjb2xvdXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IFtjbGVhckNvbG9yXSAtIFRoZSBjb2xvciBhcyByZ2JhLCBkZWZhdWx0IHRvIHVzZSB0aGUgcmVuZGVyZXIgYmFja2dyb3VuZENvbG9yXG4gICAgICogQHJldHVybiB7UElYSS5SZW5kZXJlcn0gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgUmVuZGVyVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoY2xlYXJDb2xvcilcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNsZWFyQ29sb3IgPSBjbGVhckNvbG9yIHx8IHRoaXMuY3VycmVudC5iYXNlVGV4dHVyZS5jbGVhckNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY2xlYXJDb2xvciA9IGNsZWFyQ29sb3IgfHwgdGhpcy5jbGVhckNvbG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5mcmFtZWJ1ZmZlci5jbGVhcihjbGVhckNvbG9yWzBdLCBjbGVhckNvbG9yWzFdLCBjbGVhckNvbG9yWzJdLCBjbGVhckNvbG9yWzNdKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplICgpLy8gc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodClcbiAgICB7XG4gICAgICAgIC8vIHJlc2l6ZSB0aGUgcm9vdCBvbmx5IVxuICAgICAgICB0aGlzLmJpbmQobnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyByZW5kZXJUZXh0dXJlIHN0YXRlXG4gICAgICovXG4gICAgUmVuZGVyVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5iaW5kKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUmVuZGVyVGV4dHVyZVN5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRvIGNyZWF0ZSBhIFdlYkdMIFByb2dyYW1cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBHTFByb2dyYW0gPSBmdW5jdGlvbiBHTFByb2dyYW0ocHJvZ3JhbSwgdW5pZm9ybURhdGEpXG57XG4gICAgLyoqXG4gICAgICogVGhlIHNoYWRlciBwcm9ncmFtXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtXZWJHTFByb2dyYW19XG4gICAgICovXG4gICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcblxuICAgIC8qKlxuICAgICAqIGhvbGRzIHRoZSB1bmlmb3JtIGRhdGEgd2hpY2ggY29udGFpbnMgdW5pZm9ybSBsb2NhdGlvbnNcbiAgICAgKiBhbmQgY3VycmVudCB1bmlmb3JtIHZhbHVlcyB1c2VkIGZvciBjYWNoaW5nIGFuZCBwcmV2ZW50aW5nIHVubmVlZGVkIEdQVSBjb21tYW5kc1xuICAgICAqIEBtZW1iZXIge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLnVuaWZvcm1EYXRhID0gdW5pZm9ybURhdGE7XG5cbiAgICAvKipcbiAgICAgKiB1bmlmb3JtR3JvdXBzIGhvbGRzIHRoZSB2YXJpb3VzIHVwbG9hZCBmdW5jdGlvbnMgZm9yIHRoZSBzaGFkZXIuIEVhY2ggdW5pZm9ybSBncm91cFxuICAgICAqIGFuZCBwcm9ncmFtIGhhdmUgYSB1bmlxdWUgdXBsb2FkIGZ1bmN0aW9uIGdlbmVyYXRlZC5cbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy51bmlmb3JtR3JvdXBzID0ge307XG59O1xuXG4vKipcbiAqIERlc3Ryb3lzIHRoaXMgcHJvZ3JhbVxuICovXG5HTFByb2dyYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy51bmlmb3JtRGF0YSA9IG51bGw7XG4gICAgdGhpcy51bmlmb3JtR3JvdXBzID0gbnVsbDtcbiAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xufTtcblxudmFyIFVJRCQ0ID0gMDtcbi8vIGRlZnVhbHQgc3luYyBkYXRhIHNvIHdlIGRvbid0IGNyZWF0ZSBhIG5ldyBvbmUgZWFjaCB0aW1lIVxudmFyIGRlZmF1bHRTeW5jRGF0YSA9IHsgdGV4dHVyZUNvdW50OiAwIH07XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIHNoYWRlcnMuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKiBAZXh0ZW5kcyBQSVhJLlN5c3RlbVxuICovXG52YXIgU2hhZGVyU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gU2hhZGVyU3lzdGVtKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgU3lzdGVtLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2sgdGhhdCB0aGlzIGVudmlyb25tZW50IHN1cHBvcnQgYG5ldyBGdW5jdGlvbmBcbiAgICAgICAgdGhpcy5zeXN0ZW1DaGVjaygpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY3VycmVudCBXZWJHTCByZW5kZXJpbmcgY29udGV4dFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdsID0gbnVsbDtcblxuICAgICAgICB0aGlzLnNoYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhY2hlIHRvIGhvbGRzIHRoZSBnZW5lcmF0ZWQgZnVuY3Rpb25zLiBTdG9yZWQgYWdhaW5zdCBVbmlmb3JtT2JqZWN0cyB1bmlxdWUgc2lnbmF0dXJlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlID0ge307XG5cbiAgICAgICAgdGhpcy5pZCA9IFVJRCQ0Kys7XG4gICAgfVxuXG4gICAgaWYgKCBTeXN0ZW0gKSBTaGFkZXJTeXN0ZW0uX19wcm90b19fID0gU3lzdGVtO1xuICAgIFNoYWRlclN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTeXN0ZW0gJiYgU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFNoYWRlclN5c3RlbS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJTeXN0ZW07XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZWFibGUgZnVuY3Rpb24gYnkgYEBwaXhpL3Vuc2FmZS1ldmFsYCB0byBzaWxlbmNlXG4gICAgICogdGhyb3dpbmcgYW4gZXJyb3IgaWYgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHVuc2FmZS1ldmFscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2hhZGVyU3lzdGVtLnByb3RvdHlwZS5zeXN0ZW1DaGVjayA9IGZ1bmN0aW9uIHN5c3RlbUNoZWNrICgpXG4gICAge1xuICAgICAgICBpZiAoIXVuc2FmZUV2YWxTdXBwb3J0ZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IGFsbG93IHVuc2FmZS1ldmFsLCAnXG4gICAgICAgICAgICAgICAgKyAncGxlYXNlIHVzZSBAcGl4aS91bnNhZmUtZXZhbCBtb2R1bGUgdG8gZW5hYmxlIHN1cHBvcnQuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgU2hhZGVyU3lzdGVtLnByb3RvdHlwZS5jb250ZXh0Q2hhbmdlID0gZnVuY3Rpb24gY29udGV4dENoYW5nZSAoZ2wpXG4gICAge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgY3VycmVudCBzaGFkZXIgdG8gdGhlIG9uZSBnaXZlbiBpbiBwYXJhbWV0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5TaGFkZXJ9IHNoYWRlciAtIHRoZSBuZXcgc2hhZGVyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkb250U3luYyAtIGZhbHNlIGlmIHRoZSBzaGFkZXIgc2hvdWxkIGF1dG9tYXRpY2FsbHkgc3luYyBpdHMgdW5pZm9ybXMuXG4gICAgICogQHJldHVybnMge1BJWEkuR0xQcm9ncmFtfSB0aGUgZ2xQcm9ncmFtIHRoYXQgYmVsb25ncyB0byB0aGUgc2hhZGVyLlxuICAgICAqL1xuICAgIFNoYWRlclN5c3RlbS5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uIGJpbmQgKHNoYWRlciwgZG9udFN5bmMpXG4gICAge1xuICAgICAgICBzaGFkZXIudW5pZm9ybXMuZ2xvYmFscyA9IHRoaXMucmVuZGVyZXIuZ2xvYmFsVW5pZm9ybXM7XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBzaGFkZXIucHJvZ3JhbTtcbiAgICAgICAgdmFyIGdsUHJvZ3JhbSA9IHByb2dyYW0uZ2xQcm9ncmFtc1t0aGlzLnJlbmRlcmVyLkNPTlRFWFRfVUlEXSB8fCB0aGlzLmdlbmVyYXRlU2hhZGVyKHNoYWRlcik7XG5cbiAgICAgICAgdGhpcy5zaGFkZXIgPSBzaGFkZXI7XG5cbiAgICAgICAgLy8gVE9ETyAtIHNvbWUgY3VycmVudCBQaXhpIHBsdWdpbnMgYnlwYXNzIHRoaXMuLiBzbyBpdCBub3Qgc2FmZSB0byB1c2UgeWV0Li5cbiAgICAgICAgaWYgKHRoaXMucHJvZ3JhbSAhPT0gcHJvZ3JhbSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShnbFByb2dyYW0ucHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRvbnRTeW5jKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZWZhdWx0U3luY0RhdGEudGV4dHVyZUNvdW50ID0gMDtcblxuICAgICAgICAgICAgdGhpcy5zeW5jVW5pZm9ybUdyb3VwKHNoYWRlci51bmlmb3JtR3JvdXAsIGRlZmF1bHRTeW5jRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xQcm9ncmFtO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSB1bmlmb3JtcyB2YWx1ZXMgdG8gdGhlIGN1cnJlbnRseSBib3VuZCBzaGFkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdW5pZm9ybXMgLSB0aGUgdW5pZm9ybXMgdmFsdWVzIHRoYXQgYmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBzaGFkZXJcbiAgICAgKi9cbiAgICBTaGFkZXJTeXN0ZW0ucHJvdG90eXBlLnNldFVuaWZvcm1zID0gZnVuY3Rpb24gc2V0VW5pZm9ybXMgKHVuaWZvcm1zKVxuICAgIHtcbiAgICAgICAgdmFyIHNoYWRlciA9IHRoaXMuc2hhZGVyLnByb2dyYW07XG4gICAgICAgIHZhciBnbFByb2dyYW0gPSBzaGFkZXIuZ2xQcm9ncmFtc1t0aGlzLnJlbmRlcmVyLkNPTlRFWFRfVUlEXTtcblxuICAgICAgICBzaGFkZXIuc3luY1VuaWZvcm1zKGdsUHJvZ3JhbS51bmlmb3JtRGF0YSwgdW5pZm9ybXMsIHRoaXMucmVuZGVyZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIHN5bmNzIHVuaWZvcm1zIG9uIHRoZSBncm91cFxuICAgICAqIEBwYXJhbSB7Kn0gZ3JvdXAgdGhlIHVuaWZvcm0gZ3JvdXAgdG8gc3luY1xuICAgICAqIEBwYXJhbSB7Kn0gc3luY0RhdGEgdGhpcyBpcyBkYXRhIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBzeW5jIGZ1bmN0aW9uIGFuZCBhbnkgbmVzdGVkIHN5bmMgZnVuY3Rpb25zXG4gICAgICovXG4gICAgU2hhZGVyU3lzdGVtLnByb3RvdHlwZS5zeW5jVW5pZm9ybUdyb3VwID0gZnVuY3Rpb24gc3luY1VuaWZvcm1Hcm91cCAoZ3JvdXAsIHN5bmNEYXRhKVxuICAgIHtcbiAgICAgICAgdmFyIGdsUHJvZ3JhbSA9IHRoaXMuZ2V0Z2xQcm9ncmFtKCk7XG5cbiAgICAgICAgaWYgKCFncm91cC5zdGF0aWMgfHwgZ3JvdXAuZGlydHlJZCAhPT0gZ2xQcm9ncmFtLnVuaWZvcm1Hcm91cHNbZ3JvdXAuaWRdKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbFByb2dyYW0udW5pZm9ybUdyb3Vwc1tncm91cC5pZF0gPSBncm91cC5kaXJ0eUlkO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNVbmlmb3Jtcyhncm91cCwgZ2xQcm9ncmFtLCBzeW5jRGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVhYmxlIGJ5IHRoZSBAcGl4aS91bnNhZmUtZXZhbCBwYWNrYWdlIHRvIHVzZSBzdGF0aWNcbiAgICAgKiBzeW5jVW5mb3JtcyBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTaGFkZXJTeXN0ZW0ucHJvdG90eXBlLnN5bmNVbmlmb3JtcyA9IGZ1bmN0aW9uIHN5bmNVbmlmb3JtcyAoZ3JvdXAsIGdsUHJvZ3JhbSwgc3luY0RhdGEpXG4gICAge1xuICAgICAgICB2YXIgc3luY0Z1bmMgPSBncm91cC5zeW5jVW5pZm9ybXNbdGhpcy5zaGFkZXIucHJvZ3JhbS5pZF0gfHwgdGhpcy5jcmVhdGVTeW5jR3JvdXBzKGdyb3VwKTtcblxuICAgICAgICBzeW5jRnVuYyhnbFByb2dyYW0udW5pZm9ybURhdGEsIGdyb3VwLnVuaWZvcm1zLCB0aGlzLnJlbmRlcmVyLCBzeW5jRGF0YSk7XG4gICAgfTtcblxuICAgIFNoYWRlclN5c3RlbS5wcm90b3R5cGUuY3JlYXRlU3luY0dyb3VwcyA9IGZ1bmN0aW9uIGNyZWF0ZVN5bmNHcm91cHMgKGdyb3VwKVxuICAgIHtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5nZXRTaWduYXR1cmUoZ3JvdXAsIHRoaXMuc2hhZGVyLnByb2dyYW0udW5pZm9ybURhdGEpO1xuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVtpZF0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbaWRdID0gZ2VuZXJhdGVVbmlmb3Jtc1N5bmMoZ3JvdXAsIHRoaXMuc2hhZGVyLnByb2dyYW0udW5pZm9ybURhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAuc3luY1VuaWZvcm1zW3RoaXMuc2hhZGVyLnByb2dyYW0uaWRdID0gdGhpcy5jYWNoZVtpZF07XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwLnN5bmNVbmlmb3Jtc1t0aGlzLnNoYWRlci5wcm9ncmFtLmlkXTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSB1bmlmb3JtIGdyb3VwIGFuZCBkYXRhIGFuZCBnZW5lcmF0ZXMgYSB1bmlxdWUgc2lnbmF0dXJlIGZvciB0aGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlVuaWZvcm1Hcm91cH0gZ3JvdXAgdGhlIHVuaWZvcm0gZ3JvdXAgdG8gZ2V0IHNpZ25hdHVyZSBvZlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1bmlmb3JtRGF0YSB1bmlmb3JtIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSB0aGUgc2hhZGVyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gVW5pcXVlIHNpZ25hdHVyZSBvZiB0aGUgdW5pZm9ybSBncm91cFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU2hhZGVyU3lzdGVtLnByb3RvdHlwZS5nZXRTaWduYXR1cmUgPSBmdW5jdGlvbiBnZXRTaWduYXR1cmUgKGdyb3VwLCB1bmlmb3JtRGF0YSlcbiAgICB7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IGdyb3VwLnVuaWZvcm1zO1xuXG4gICAgICAgIHZhciBzdHJpbmdzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiB1bmlmb3JtcylcbiAgICAgICAge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKGkpO1xuXG4gICAgICAgICAgICBpZiAodW5pZm9ybURhdGFbaV0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RyaW5ncy5wdXNoKHVuaWZvcm1EYXRhW2ldLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignLScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIEdMU2hhZGUgcm9mIHRoZSBjdXJyZW50bHkgYm91bmQgc2hhZGVyLlxuICAgICAqIFRoaXMgY2FuIGJlIGhhbmR5IGZvciB3aGVuIHlvdSB0byBoYXZlIGEgbGl0dGxlIG1vcmUgY29udHJvbCBvdmVyIHRoZSBzZXR0aW5nIG9mIHlvdXIgdW5pZm9ybXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdMUHJvZ3JhbX0gdGhlIGdsUHJvZ3JhbSBmb3IgdGhlIGN1cnJlbnRseSBib3VuZCBTaGFkZXIgZm9yIHRoaXMgY29udGV4dFxuICAgICAqL1xuICAgIFNoYWRlclN5c3RlbS5wcm90b3R5cGUuZ2V0Z2xQcm9ncmFtID0gZnVuY3Rpb24gZ2V0Z2xQcm9ncmFtICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRlci5wcm9ncmFtLmdsUHJvZ3JhbXNbdGhpcy5yZW5kZXJlci5DT05URVhUX1VJRF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgZ2xQcm9ncmFtIHZlcnNpb24gb2YgdGhlIFNoYWRlciBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLlNoYWRlcn0gc2hhZGVyIHRoZSBzaGFkZXIgdGhhdCB0aGUgZ2xQcm9ncmFtIHdpbGwgYmUgYmFzZWQgb24uXG4gICAgICogQHJldHVybiB7UElYSS5HTFByb2dyYW19IEEgc2hpbnkgbmV3IGdsUHJvZ3JhbSFcbiAgICAgKi9cbiAgICBTaGFkZXJTeXN0ZW0ucHJvdG90eXBlLmdlbmVyYXRlU2hhZGVyID0gZnVuY3Rpb24gZ2VuZXJhdGVTaGFkZXIgKHNoYWRlcilcbiAgICB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBzaGFkZXIucHJvZ3JhbTtcblxuICAgICAgICB2YXIgYXR0cmliTWFwID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBwcm9ncmFtLmF0dHJpYnV0ZURhdGEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF0dHJpYk1hcFtpXSA9IHByb2dyYW0uYXR0cmlidXRlRGF0YVtpXS5sb2NhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaGFkZXJQcm9ncmFtID0gY29tcGlsZVByb2dyYW0oZ2wsIHByb2dyYW0udmVydGV4U3JjLCBwcm9ncmFtLmZyYWdtZW50U3JjLCBhdHRyaWJNYXApO1xuICAgICAgICB2YXIgdW5pZm9ybURhdGEgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpJDEgaW4gcHJvZ3JhbS51bmlmb3JtRGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBwcm9ncmFtLnVuaWZvcm1EYXRhW2kkMV07XG5cbiAgICAgICAgICAgIHVuaWZvcm1EYXRhW2kkMV0gPSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb246IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihzaGFkZXJQcm9ncmFtLCBpJDEpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUoZGF0YS50eXBlLCBkYXRhLnNpemUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnbFByb2dyYW0gPSBuZXcgR0xQcm9ncmFtKHNoYWRlclByb2dyYW0sIHVuaWZvcm1EYXRhKTtcblxuICAgICAgICBwcm9ncmFtLmdsUHJvZ3JhbXNbdGhpcy5yZW5kZXJlci5DT05URVhUX1VJRF0gPSBnbFByb2dyYW07XG5cbiAgICAgICAgcmV0dXJuIGdsUHJvZ3JhbTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIFNoYWRlclN5c3RlbSBzdGF0ZSwgZG9lcyBub3QgYWZmZWN0IFdlYkdMIHN0YXRlXG4gICAgICovXG4gICAgU2hhZGVyU3lzdGVtLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0ICgpXG4gICAge1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnNoYWRlciA9IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgU3lzdGVtIGFuZCByZW1vdmVzIGFsbCBpdHMgdGV4dHVyZXNcbiAgICAgKi9cbiAgICBTaGFkZXJTeXN0ZW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBkZXN0cm95IG1ldGhvZCBmb3IgU2hhZGVyU3lzdGVtXG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFNoYWRlclN5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbi8qKlxuICogTWFwcyBnbCBibGVuZCBjb21iaW5hdGlvbnMgdG8gV2ViR0wuXG4gKlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBmdW5jdGlvbiBtYXBXZWJHTEJsZW5kTW9kZXNUb1BpeGlcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgLSBUaGUgcmVuZGVyaW5nIGNvbnRleHQuXG4gKiBAcGFyYW0ge251bWJlcltdW119IFthcnJheT1bXV0gLSBUaGUgYXJyYXkgdG8gb3V0cHV0IGludG8uXG4gKiBAcmV0dXJuIHtudW1iZXJbXVtdfSBNYXBwZWQgbW9kZXMuXG4gKi9cbmZ1bmN0aW9uIG1hcFdlYkdMQmxlbmRNb2Rlc1RvUGl4aShnbCwgYXJyYXkpXG57XG4gICAgaWYgKCBhcnJheSA9PT0gdm9pZCAwICkgYXJyYXkgPSBbXTtcblxuICAgIC8vIFRPRE8gLSBwcmVtdWx0aXBseSBhbHBoYSB3b3VsZCBiZSBkaWZmZXJlbnQuXG4gICAgLy8gYWRkIGEgYm9vbGVhbiBmb3IgdGhhdCFcbiAgICBhcnJheVtCTEVORF9NT0RFUy5OT1JNQUxdID0gW2dsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQV07XG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuQUREXSA9IFtnbC5PTkUsIGdsLk9ORV07XG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuTVVMVElQTFldID0gW2dsLkRTVF9DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5TQ1JFRU5dID0gW2dsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5PVkVSTEFZXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkRBUktFTl0gPSBbZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5MSUdIVEVOXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkNPTE9SX0RPREdFXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkNPTE9SX0JVUk5dID0gW2dsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQV07XG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuSEFSRF9MSUdIVF0gPSBbZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5TT0ZUX0xJR0hUXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkRJRkZFUkVOQ0VdID0gW2dsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQV07XG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuRVhDTFVTSU9OXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkhVRV0gPSBbZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5TQVRVUkFUSU9OXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkNPTE9SXSA9IFtnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkxVTUlOT1NJVFldID0gW2dsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQV07XG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuTk9ORV0gPSBbMCwgMF07XG5cbiAgICAvLyBub3QtcHJlbXVsdGlwbGllZCBibGVuZCBtb2Rlc1xuICAgIGFycmF5W0JMRU5EX01PREVTLk5PUk1BTF9OUE1dID0gW2dsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5BRERfTlBNXSA9IFtnbC5TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkVdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLlNDUkVFTl9OUE1dID0gW2dsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcblxuICAgIC8vIGNvbXBvc2l0ZSBvcGVyYXRpb25zXG4gICAgYXJyYXlbQkxFTkRfTU9ERVMuU1JDX0lOXSA9IFtnbC5EU1RfQUxQSEEsIGdsLlpFUk9dO1xuICAgIGFycmF5W0JMRU5EX01PREVTLlNSQ19PVVRdID0gW2dsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLlpFUk9dO1xuICAgIGFycmF5W0JMRU5EX01PREVTLlNSQ19BVE9QXSA9IFtnbC5EU1RfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkRTVF9PVkVSXSA9IFtnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLCBnbC5PTkVdO1xuICAgIGFycmF5W0JMRU5EX01PREVTLkRTVF9JTl0gPSBbZ2wuWkVSTywgZ2wuU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5EU1RfT1VUXSA9IFtnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5EU1RfQVRPUF0gPSBbZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgZ2wuU1JDX0FMUEhBXTtcbiAgICBhcnJheVtCTEVORF9NT0RFUy5YT1JdID0gW2dsLk9ORV9NSU5VU19EU1RfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdO1xuXG4gICAgLy8gU1VCVFJBQ1QgZnJvbSBmbGFzaFxuICAgIGFycmF5W0JMRU5EX01PREVTLlNVQlRSQUNUXSA9IFtnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVCwgZ2wuRlVOQ19BRERdO1xuXG4gICAgcmV0dXJuIGFycmF5O1xufVxuXG52YXIgQkxFTkQkMSA9IDA7XG52YXIgT0ZGU0VUJDEgPSAxO1xudmFyIENVTExJTkckMSA9IDI7XG52YXIgREVQVEhfVEVTVCQxID0gMztcbnZhciBXSU5ESU5HJDEgPSA0O1xuXG4vKipcbiAqIFN5c3RlbSBwbHVnaW4gdG8gdGhlIHJlbmRlcmVyIHRvIG1hbmFnZSBXZWJHTCBzdGF0ZSBtYWNoaW5lcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuU3lzdGVtXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKi9cbnZhciBTdGF0ZVN5c3RlbSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFN5c3RlbSkge1xuICAgIGZ1bmN0aW9uIFN0YXRlU3lzdGVtKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgU3lzdGVtLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHTCBjb250ZXh0XG4gICAgICAgICAqIEBtZW1iZXIge1dlYkdMUmVuZGVyaW5nQ29udGV4dH1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdsID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3RhdGUgSURcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGVJZCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBvbHlnb24gb2Zmc2V0XG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBvbHlnb25PZmZzZXQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCbGVuZCBtb2RlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgUElYSS5CTEVORF9NT0RFUy5OT05FXG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSBCTEVORF9NT0RFUy5OT05FO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIGN1cnJlbnQgYmxlbmQgZXF1YXRpb24gaXMgZGlmZmVyZW50XG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2JsZW5kRXEgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29sbGVjdGlvbiBvZiBjYWxsc1xuICAgICAgICAgKiBAbWVtYmVyIHtmdW5jdGlvbltdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFwID0gW107XG5cbiAgICAgICAgLy8gbWFwIGZ1bmN0aW9ucyBmb3Igd2hlbiB3ZSBzZXQgc3RhdGUuLlxuICAgICAgICB0aGlzLm1hcFtCTEVORCQxXSA9IHRoaXMuc2V0QmxlbmQ7XG4gICAgICAgIHRoaXMubWFwW09GRlNFVCQxXSA9IHRoaXMuc2V0T2Zmc2V0O1xuICAgICAgICB0aGlzLm1hcFtDVUxMSU5HJDFdID0gdGhpcy5zZXRDdWxsRmFjZTtcbiAgICAgICAgdGhpcy5tYXBbREVQVEhfVEVTVCQxXSA9IHRoaXMuc2V0RGVwdGhUZXN0O1xuICAgICAgICB0aGlzLm1hcFtXSU5ESU5HJDFdID0gdGhpcy5zZXRGcm9udEZhY2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbGxlY3Rpb24gb2YgY2hlY2sgY2FsbHNcbiAgICAgICAgICogQG1lbWJlciB7ZnVuY3Rpb25bXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoZWNrcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZhdWx0IFdlYkdMIFN0YXRlXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU3RhdGV9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0U3RhdGUgPSBuZXcgU3RhdGUoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U3RhdGUuYmxlbmQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRTdGF0ZS5kZXB0aCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCBTeXN0ZW0gKSBTdGF0ZVN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgU3RhdGVTeXN0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU3lzdGVtICYmIFN5c3RlbS5wcm90b3R5cGUgKTtcbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdGF0ZVN5c3RlbTtcblxuICAgIFN0YXRlU3lzdGVtLnByb3RvdHlwZS5jb250ZXh0Q2hhbmdlID0gZnVuY3Rpb24gY29udGV4dENoYW5nZSAoZ2wpXG4gICAge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG5cbiAgICAgICAgdGhpcy5ibGVuZE1vZGVzID0gbWFwV2ViR0xCbGVuZE1vZGVzVG9QaXhpKGdsKTtcblxuICAgICAgICB0aGlzLnNldCh0aGlzLmRlZmF1bHRTdGF0ZSk7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIHNldC5cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChzdGF0ZSlcbiAgICB7XG4gICAgICAgIHN0YXRlID0gc3RhdGUgfHwgdGhpcy5kZWZhdWx0U3RhdGU7XG5cbiAgICAgICAgLy8gVE9ETyBtYXliZSB0byBhbiBvYmplY3QgY2hlY2s/ICggdGhpcy5zdGF0ZSA9PT0gc3RhdGUgKT9cbiAgICAgICAgaWYgKHRoaXMuc3RhdGVJZCAhPT0gc3RhdGUuZGF0YSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLnN0YXRlSWQgXiBzdGF0ZS5kYXRhO1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAgICAgICAvLyBvcmRlciBmcm9tIGxlYXN0IHRvIG1vc3QgY29tbW9uXG4gICAgICAgICAgICB3aGlsZSAoZGlmZilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZiAmIDEpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSBjaGFuZ2UhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwW2ldLmNhbGwodGhpcywgISEoc3RhdGUuZGF0YSAmICgxIDw8IGkpKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGlmZiA9IGRpZmYgPj4gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdGVJZCA9IHN0YXRlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiYXNlZCBvbiB0aGUgYWJvdmUgc2V0dGluZ3Mgd2UgY2hlY2sgZm9yIHNwZWNpZmljIG1vZGVzLi5cbiAgICAgICAgLy8gZm9yIGV4YW1wbGUgaWYgYmxlbmQgaXMgYWN0aXZlIHdlIGNoZWNrIGFuZCBzZXQgdGhlIGJsZW5kIG1vZGVzXG4gICAgICAgIC8vIG9yIG9mIHBvbHlnb24gb2Zmc2V0IGlzIGFjdGl2ZSB3ZSBjaGVjayB0aGUgcG9seSBkZXB0aC5cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGhpcy5jaGVja3MubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5jaGVja3NbaSQxXSh0aGlzLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUsIHdoZW4gcHJldmlvdXMgc3RhdGUgaXMgdW5rbm93blxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSBzdGF0ZSAtIFRoZSBzdGF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuZm9yY2VTdGF0ZSA9IGZ1bmN0aW9uIGZvcmNlU3RhdGUgKHN0YXRlKVxuICAgIHtcbiAgICAgICAgc3RhdGUgPSBzdGF0ZSB8fCB0aGlzLmRlZmF1bHRTdGF0ZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hcC5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5tYXBbaV0uY2FsbCh0aGlzLCAhIShzdGF0ZS5kYXRhICYgKDEgPDwgaSkpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aGlzLmNoZWNrcy5sZW5ndGg7IGkkMSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrc1tpJDFdKHRoaXMsIHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGVJZCA9IHN0YXRlLmRhdGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZWQgYmxlbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVHVybiBvbiBvciBvZmYgd2ViZ2wgYmxlbmRpbmcuXG4gICAgICovXG4gICAgU3RhdGVTeXN0ZW0ucHJvdG90eXBlLnNldEJsZW5kID0gZnVuY3Rpb24gc2V0QmxlbmQgKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGVjayhTdGF0ZVN5c3RlbS5jaGVja0JsZW5kTW9kZSwgdmFsdWUpO1xuXG4gICAgICAgIHRoaXMuZ2xbdmFsdWUgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10odGhpcy5nbC5CTEVORCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZSBwb2x5Z29uIG9mZnNldCBmaWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVHVybiBvbiBvciBvZmYgd2ViZ2wgcG9seWdvbiBvZmZzZXQgdGVzdGluZy5cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuc2V0T2Zmc2V0ID0gZnVuY3Rpb24gc2V0T2Zmc2V0ICh2YWx1ZSlcbiAgICB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hlY2soU3RhdGVTeXN0ZW0uY2hlY2tQb2x5Z29uT2Zmc2V0LCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5nbFt2YWx1ZSA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXSh0aGlzLmdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVwdGggdGVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUdXJuIG9uIG9yIG9mZiB3ZWJnbCBkZXB0aCB0ZXN0aW5nLlxuICAgICAqL1xuICAgIFN0YXRlU3lzdGVtLnByb3RvdHlwZS5zZXREZXB0aFRlc3QgPSBmdW5jdGlvbiBzZXREZXB0aFRlc3QgKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbFt2YWx1ZSA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXSh0aGlzLmdsLkRFUFRIX1RFU1QpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgY3VsbCBmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFR1cm4gb24gb3Igb2ZmIHdlYmdsIGN1bGwgZmFjZS5cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuc2V0Q3VsbEZhY2UgPSBmdW5jdGlvbiBzZXRDdWxsRmFjZSAodmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLmdsW3ZhbHVlID8gJ2VuYWJsZScgOiAnZGlzYWJsZSddKHRoaXMuZ2wuQ1VMTF9GQUNFKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2wgZnJvbnQgZmFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSB0cnVlIGlzIGNsb2Nrd2lzZSBhbmQgZmFsc2UgaXMgY291bnRlci1jbG9ja3dpc2VcbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuc2V0RnJvbnRGYWNlID0gZnVuY3Rpb24gc2V0RnJvbnRGYWNlICh2YWx1ZSlcbiAgICB7XG4gICAgICAgIHRoaXMuZ2wuZnJvbnRGYWNlKHRoaXMuZ2xbdmFsdWUgPyAnQ1cnIDogJ0NDVyddKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmxlbmQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBibGVuZCBtb2RlIHRvIHNldCB0by5cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUuc2V0QmxlbmRNb2RlID0gZnVuY3Rpb24gc2V0QmxlbmRNb2RlICh2YWx1ZSlcbiAgICB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5ibGVuZE1vZGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmxlbmRNb2RlID0gdmFsdWU7XG5cbiAgICAgICAgdmFyIG1vZGUgPSB0aGlzLmJsZW5kTW9kZXNbdmFsdWVdO1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIGlmIChtb2RlLmxlbmd0aCA9PT0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKG1vZGVbMF0sIG1vZGVbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUobW9kZVswXSwgbW9kZVsxXSwgbW9kZVsyXSwgbW9kZVszXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGUubGVuZ3RoID09PSA2KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ibGVuZEVxID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlWzRdLCBtb2RlWzVdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9ibGVuZEVxKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9ibGVuZEVxID0gZmFsc2U7XG4gICAgICAgICAgICBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb2x5Z29uIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIHRoZSBwb2x5Z29uIG9mZnNldFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsZSAtIHRoZSBwb2x5Z29uIG9mZnNldCBzY2FsZVxuICAgICAqL1xuICAgIFN0YXRlU3lzdGVtLnByb3RvdHlwZS5zZXRQb2x5Z29uT2Zmc2V0ID0gZnVuY3Rpb24gc2V0UG9seWdvbk9mZnNldCAodmFsdWUsIHNjYWxlKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbC5wb2x5Z29uT2Zmc2V0KHZhbHVlLCBzY2FsZSk7XG4gICAgfTtcblxuICAgIC8vIHVzZWRcbiAgICAvKipcbiAgICAgKiBSZXNldHMgYWxsIHRoZSBsb2dpYyBhbmQgZGlzYWJsZXMgdGhlIHZhb3NcbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLmZvcmNlU3RhdGUoMCk7XG5cbiAgICAgICAgdGhpcy5fYmxlbmRFcSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmxlbmRNb2RlID0gLTE7XG4gICAgICAgIHRoaXMuc2V0QmxlbmRNb2RlKDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjaGVja3MgdG8gc2VlIHdoaWNoIHVwZGF0ZXMgc2hvdWxkIGJlIGNoZWNrZWQgYmFzZWQgb24gd2hpY2ggc2V0dGluZ3MgaGF2ZSBiZWVuIGFjdGl2YXRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYmxlbmQgaXMgZW5hYmxlZCB0aGVuIHdlIHNob3VsZCBjaGVjayB0aGUgYmxlbmQgbW9kZXMgZWFjaCB0aW1lIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkXG4gICAgICogb3IgaWYgcG9seWdvbiBmaWxsIGlzIGFjdGl2YXRlZCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHBvbHlnb24gb2Zmc2V0IGNoYW5nZXMuXG4gICAgICogVGhlIGlkZWEgaXMgdGhhdCB3ZSBvbmx5IGNoZWNrIHdoYXQgd2UgaGF2ZSB0b28uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jICB0aGUgY2hlY2tpbmcgZnVuY3Rpb24gdG8gYWRkIG9yIHJlbW92ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgIHNob3VsZCB0aGUgY2hlY2sgZnVuY3Rpb24gYmUgYWRkZWQgb3IgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5wcm90b3R5cGUudXBkYXRlQ2hlY2sgPSBmdW5jdGlvbiB1cGRhdGVDaGVjayAoZnVuYywgdmFsdWUpXG4gICAge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNoZWNrcy5pbmRleE9mKGZ1bmMpO1xuXG4gICAgICAgIGlmICh2YWx1ZSAmJiBpbmRleCA9PT0gLTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tzLnB1c2goZnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXZhbHVlICYmIGluZGV4ICE9PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5jaGVja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIHByaXZhdGUgbGl0dGxlIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3ZSBjYWxsIHRvIGNoZWNrIHRoZSBibGVuZCBtb2RlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLlN0YXRlU3lzdGVtfSBTeXN0ZW0gIHRoZSBTeXN0ZW0gdG8gcGVyZm9ybSB0aGUgc3RhdGUgY2hlY2sgb25cbiAgICAgKiBAcGFyYW0ge1BJWEkuU3RhdGV9IHN0YXRlICB0aGUgc3RhdGUgdGhhdCB0aGUgYmxlbmRNb2RlIHdpbGwgcHVsbGVkIGZyb21cbiAgICAgKi9cbiAgICBTdGF0ZVN5c3RlbS5jaGVja0JsZW5kTW9kZSA9IGZ1bmN0aW9uIGNoZWNrQmxlbmRNb2RlIChzeXN0ZW0sIHN0YXRlKVxuICAgIHtcbiAgICAgICAgc3lzdGVtLnNldEJsZW5kTW9kZShzdGF0ZS5ibGVuZE1vZGUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIHByaXZhdGUgbGl0dGxlIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3ZSBjYWxsIHRvIGNoZWNrIHRoZSBwb2x5Z29uIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5TdGF0ZVN5c3RlbX0gU3lzdGVtICB0aGUgU3lzdGVtIHRvIHBlcmZvcm0gdGhlIHN0YXRlIGNoZWNrIG9uXG4gICAgICogQHBhcmFtIHtQSVhJLlN0YXRlfSBzdGF0ZSAgdGhlIHN0YXRlIHRoYXQgdGhlIGJsZW5kTW9kZSB3aWxsIHB1bGxlZCBmcm9tXG4gICAgICovXG4gICAgU3RhdGVTeXN0ZW0uY2hlY2tQb2x5Z29uT2Zmc2V0ID0gZnVuY3Rpb24gY2hlY2tQb2x5Z29uT2Zmc2V0IChzeXN0ZW0sIHN0YXRlKVxuICAgIHtcbiAgICAgICAgc3lzdGVtLnNldFBvbHlnb25PZmZzZXQoc3RhdGUucG9seWdvbk9mZnNldCwgMCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTdGF0ZVN5c3RlbTtcbn0oU3lzdGVtKSk7XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIHRleHR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIHRoZSBHUFUsXG4gKiBlbnN1cmluZyB0aGF0IGl0IGRvZXMgbm90IGdldCBjbG9nZ2VkIHVwIHdpdGggdGV4dHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGJlaW5nIHVzZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSS5zeXN0ZW1zXG4gKiBAZXh0ZW5kcyBQSVhJLlN5c3RlbVxuICovXG52YXIgVGV4dHVyZUdDU3lzdGVtID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU3lzdGVtKSB7XG4gICAgZnVuY3Rpb24gVGV4dHVyZUdDU3lzdGVtKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgU3lzdGVtLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3VudFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGNvdW50XG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXhpbXVtIGlkbGUgdGltZSwgaW4gc2Vjb25kc1xuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBzZWUgUElYSS5zZXR0aW5ncy5HQ19NQVhfSURMRVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXhJZGxlID0gc2V0dGluZ3MuR0NfTUFYX0lETEU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGl0ZW0gdG8gY2hlY2tcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAc2VlIFBJWEkuc2V0dGluZ3MuR0NfTUFYX0NIRUNLX0NPVU5UXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoZWNrQ291bnRNYXggPSBzZXR0aW5ncy5HQ19NQVhfQ0hFQ0tfQ09VTlQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgZ2FyYWJhZ2UgY29sbGVjdGlvbiBtb2RlXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuR0NfTU9ERVN9XG4gICAgICAgICAqIEBzZWUgUElYSS5zZXR0aW5ncy5HQ19NT0RFXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vZGUgPSBzZXR0aW5ncy5HQ19NT0RFO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgVGV4dHVyZUdDU3lzdGVtLl9fcHJvdG9fXyA9IFN5c3RlbTtcbiAgICBUZXh0dXJlR0NTeXN0ZW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU3lzdGVtICYmIFN5c3RlbS5wcm90b3R5cGUgKTtcbiAgICBUZXh0dXJlR0NTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dHVyZUdDU3lzdGVtO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHRvIHNlZSB3aGVuIHRoZSBsYXN0IHRpbWUgYSB0ZXh0dXJlIHdhcyB1c2VkXG4gICAgICogaWYgdGhlIHRleHR1cmUgaGFzIG5vdCBiZWVuIHVzZWQgZm9yIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBHUFVcbiAgICAgKi9cbiAgICBUZXh0dXJlR0NTeXN0ZW0ucHJvdG90eXBlLnBvc3RyZW5kZXIgPSBmdW5jdGlvbiBwb3N0cmVuZGVyICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZXIucmVuZGVyaW5nVG9TY3JlZW4pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY291bnQrKztcblxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBHQ19NT0RFUy5NQU5VQUwpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tDb3VudCsrO1xuXG4gICAgICAgIGlmICh0aGlzLmNoZWNrQ291bnQgPiB0aGlzLmNoZWNrQ291bnRNYXgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHRvIHNlZSB3aGVuIHRoZSBsYXN0IHRpbWUgYSB0ZXh0dXJlIHdhcyB1c2VkXG4gICAgICogaWYgdGhlIHRleHR1cmUgaGFzIG5vdCBiZWVuIHVzZWQgZm9yIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBHUFVcbiAgICAgKi9cbiAgICBUZXh0dXJlR0NTeXN0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKVxuICAgIHtcbiAgICAgICAgdmFyIHRtID0gdGhpcy5yZW5kZXJlci50ZXh0dXJlO1xuICAgICAgICB2YXIgbWFuYWdlZFRleHR1cmVzID0gIHRtLm1hbmFnZWRUZXh0dXJlcztcbiAgICAgICAgdmFyIHdhc1JlbW92ZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hbmFnZWRUZXh0dXJlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBtYW5hZ2VkVGV4dHVyZXNbaV07XG5cbiAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydHMgbm9uIGdlbmVyYXRlZCB0ZXh0dXJlcyBhdCB0aGUgbW9tZW50IVxuICAgICAgICAgICAgaWYgKCF0ZXh0dXJlLmZyYW1lYnVmZmVyICYmIHRoaXMuY291bnQgLSB0ZXh0dXJlLnRvdWNoZWQgPiB0aGlzLm1heElkbGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG0uZGVzdHJveVRleHR1cmUodGV4dHVyZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbWFuYWdlZFRleHR1cmVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB3YXNSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3YXNSZW1vdmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaiA9IDA7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IG1hbmFnZWRUZXh0dXJlcy5sZW5ndGg7IGkkMSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VkVGV4dHVyZXNbaSQxXSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRUZXh0dXJlc1tqKytdID0gbWFuYWdlZFRleHR1cmVzW2kkMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYW5hZ2VkVGV4dHVyZXMubGVuZ3RoID0gajtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgdGV4dHVyZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgZGlzcGxheU9iamVjdCBhbmQgaXRzIGNoaWxkcmVuIGZyb20gdGhlIEdQVVxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGRpc3BsYXlPYmplY3QgLSB0aGUgZGlzcGxheU9iamVjdCB0byByZW1vdmUgdGhlIHRleHR1cmVzIGZyb20uXG4gICAgICovXG4gICAgVGV4dHVyZUdDU3lzdGVtLnByb3RvdHlwZS51bmxvYWQgPSBmdW5jdGlvbiB1bmxvYWQgKGRpc3BsYXlPYmplY3QpXG4gICAge1xuICAgICAgICB2YXIgdG0gPSB0aGlzLnJlbmRlcmVyLnRleHR1cmVTeXN0ZW07XG5cbiAgICAgICAgLy8gb25seSBkZXN0cm95IG5vbiBnZW5lcmF0ZWQgdGV4dHVyZXNcbiAgICAgICAgaWYgKGRpc3BsYXlPYmplY3QuX3RleHR1cmUgJiYgZGlzcGxheU9iamVjdC5fdGV4dHVyZS5fZ2xSZW5kZXJUYXJnZXRzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0bS5kZXN0cm95VGV4dHVyZShkaXNwbGF5T2JqZWN0Ll90ZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSBkaXNwbGF5T2JqZWN0LmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVubG9hZChkaXNwbGF5T2JqZWN0LmNoaWxkcmVuW2ldKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gVGV4dHVyZUdDU3lzdGVtO1xufShTeXN0ZW0pKTtcblxuLyoqXG4gKiBJbnRlcm5hbCB0ZXh0dXJlIGZvciBXZWJHTCBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBHTFRleHR1cmUgPSBmdW5jdGlvbiBHTFRleHR1cmUodGV4dHVyZSlcbntcbiAgICAvKipcbiAgICAgKiBUaGUgV2ViR0wgdGV4dHVyZVxuICAgICAqIEBtZW1iZXIge1dlYkdMVGV4dHVyZX1cbiAgICAgKi9cbiAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xuXG4gICAgLyoqXG4gICAgICogV2lkdGggb2YgdGV4dHVyZSB0aGF0IHdhcyB1c2VkIGluIHRleEltYWdlMkRcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy53aWR0aCA9IC0xO1xuXG4gICAgLyoqXG4gICAgICogSGVpZ2h0IG9mIHRleHR1cmUgdGhhdCB3YXMgdXNlZCBpbiB0ZXhJbWFnZTJEXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaGVpZ2h0ID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIGNvbnRlbnRzIGRpcnR5IGZsYWdcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXJ0eUlkID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBUZXh0dXJlIHN0eWxlIGRpcnR5IGZsYWdcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXJ0eVN0eWxlSWQgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgbWlwIGxldmVscyBoYXMgdG8gYmUgZ2VuZXJhdGVkXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLm1pcG1hcCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV3JhcE1vZGUgY29waWVkIGZyb20gYmFzZVRleHR1cmVcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy53cmFwTW9kZSA9IDMzMDcxO1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBjb3BpZWQgZnJvbSBiYXNlVGV4dHVyZVxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSA2NDA4O1xuXG4gICAgLyoqXG4gICAgICogVHlwZSBjb3BpZWQgZnJvbSBiYXNlVGV4dHVyZVxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmludGVybmFsRm9ybWF0ID0gNTEyMTtcbn07XG5cbi8qKlxuICogU3lzdGVtIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIgdG8gbWFuYWdlIHRleHR1cmVzLlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5TeXN0ZW1cbiAqIEBtZW1iZXJvZiBQSVhJLnN5c3RlbXNcbiAqL1xudmFyIFRleHR1cmVTeXN0ZW0gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTeXN0ZW0pIHtcbiAgICBmdW5jdGlvbiBUZXh0dXJlU3lzdGVtKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgU3lzdGVtLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgIC8vIFRPRE8gc2V0IHRvIG1heCB0ZXh0dXJlcy4uLlxuICAgICAgICAvKipcbiAgICAgICAgICogQm91bmQgdGV4dHVyZXNcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5CYXNlVGV4dHVyZVtdfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYm91bmRUZXh0dXJlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudCBsb2NhdGlvblxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSAtMTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiBtYW5hZ2VkIHRleHR1cmVzXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmVbXX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hbmFnZWRUZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaWQgc29tZW9uZSB0ZW1wZXIgd2l0aCB0ZXh0dXJlcyBzdGF0ZT8gV2UnbGwgb3ZlcndyaXRlIHRoZW0gd2hlbiB3ZSBuZWVkIHRvIHVuYmluZCBzb21ldGhpbmcuXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl91bmtub3duQm91bmRUZXh0dXJlcyA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCYXNlVGV4dHVyZSB2YWx1ZSB0aGF0IHNob3dzIHRoYXQgd2UgZG9uJ3Qga25vdyB3aGF0IGlzIGJvdW5kXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmV9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51bmtub3duVGV4dHVyZSA9IG5ldyBCYXNlVGV4dHVyZSgpO1xuICAgIH1cblxuICAgIGlmICggU3lzdGVtICkgVGV4dHVyZVN5c3RlbS5fX3Byb3RvX18gPSBTeXN0ZW07XG4gICAgVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTeXN0ZW0gJiYgU3lzdGVtLnByb3RvdHlwZSApO1xuICAgIFRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dHVyZVN5c3RlbTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIHJlbmRlcmVyIGNvbnRleHQgYW5kIG5lY2Vzc2FyeSBidWZmZXJzLlxuICAgICAqL1xuICAgIFRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLmNvbnRleHRDaGFuZ2UgPSBmdW5jdGlvbiBjb250ZXh0Q2hhbmdlICgpXG4gICAge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsID0gdGhpcy5yZW5kZXJlci5nbDtcblxuICAgICAgICB0aGlzLkNPTlRFWFRfVUlEID0gdGhpcy5yZW5kZXJlci5DT05URVhUX1VJRDtcblxuICAgICAgICB0aGlzLndlYkdMVmVyc2lvbiA9IHRoaXMucmVuZGVyZXIuY29udGV4dC53ZWJHTFZlcnNpb247XG5cbiAgICAgICAgdmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcblxuICAgICAgICB0aGlzLmJvdW5kVGV4dHVyZXMubGVuZ3RoID0gbWF4VGV4dHVyZXM7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhUZXh0dXJlczsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kVGV4dHVyZXNbaV0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBtb3ZlIHRoaXMuLiB0byBhIG5pY2UgbWFrZSBlbXB0eSB0ZXh0dXJlcyBjbGFzcy4uXG4gICAgICAgIHRoaXMuZW1wdHlUZXh0dXJlcyA9IHt9O1xuXG4gICAgICAgIHZhciBlbXB0eVRleHR1cmUyRCA9IG5ldyBHTFRleHR1cmUoZ2wuY3JlYXRlVGV4dHVyZSgpKTtcblxuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBlbXB0eVRleHR1cmUyRC50ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheSg0KSk7XG5cbiAgICAgICAgdGhpcy5lbXB0eVRleHR1cmVzW2dsLlRFWFRVUkVfMkRdID0gZW1wdHlUZXh0dXJlMkQ7XG4gICAgICAgIHRoaXMuZW1wdHlUZXh0dXJlc1tnbC5URVhUVVJFX0NVQkVfTUFQXSA9IG5ldyBHTFRleHR1cmUoZ2wuY3JlYXRlVGV4dHVyZSgpKTtcblxuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFX0NVQkVfTUFQLCB0aGlzLmVtcHR5VGV4dHVyZXNbZ2wuVEVYVFVSRV9DVUJFX01BUF0udGV4dHVyZSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgNjsgaSQxKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSQxLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCB0aGlzLmJvdW5kVGV4dHVyZXMubGVuZ3RoOyBpJDIrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iaW5kKG51bGwsIGkkMik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQmluZCBhIHRleHR1cmUgdG8gYSBzcGVjaWZpYyBsb2NhdGlvblxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gdW5iaW5kIHNvbWV0aGluZywgcGxlYXNlIHVzZSBgdW5iaW5kKHRleHR1cmUpYCBpbnN0ZWFkIG9mIGBiaW5kKG51bGwsIHRleHR1cmVMb2NhdGlvbilgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuVGV4dHVyZXxQSVhJLkJhc2VUZXh0dXJlfSB0ZXh0dXJlIC0gVGV4dHVyZSB0byBiaW5kXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb2NhdGlvbj0wXSAtIExvY2F0aW9uIHRvIGJpbmQgYXRcbiAgICAgKi9cbiAgICBUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gYmluZCAodGV4dHVyZSwgbG9jYXRpb24pXG4gICAge1xuICAgICAgICBpZiAoIGxvY2F0aW9uID09PSB2b2lkIDAgKSBsb2NhdGlvbiA9IDA7XG5cbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICBpZiAodGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGV4dHVyZSA9IHRleHR1cmUuYmFzZVRleHR1cmUgfHwgdGV4dHVyZTtcblxuICAgICAgICAgICAgaWYgKHRleHR1cmUudmFsaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZS50b3VjaGVkID0gdGhpcy5yZW5kZXJlci50ZXh0dXJlR0MuY291bnQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2xUZXh0dXJlID0gdGV4dHVyZS5fZ2xUZXh0dXJlc1t0aGlzLkNPTlRFWFRfVUlEXSB8fCB0aGlzLmluaXRUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRUZXh0dXJlc1tsb2NhdGlvbl0gIT09IHRleHR1cmUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TG9jYXRpb24gIT09IGxvY2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZSh0ZXh0dXJlLnRhcmdldCwgZ2xUZXh0dXJlLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChnbFRleHR1cmUuZGlydHlJZCAhPT0gdGV4dHVyZS5kaXJ0eUlkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uICE9PSBsb2NhdGlvbilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUZXh0dXJlKHRleHR1cmUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYm91bmRUZXh0dXJlc1tsb2NhdGlvbl0gPSB0ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uICE9PSBsb2NhdGlvbilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTAgKyBsb2NhdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMuZW1wdHlUZXh0dXJlc1tnbC5URVhUVVJFXzJEXS50ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRUZXh0dXJlc1tsb2NhdGlvbl0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0ZXh0dXJlIGxvY2F0aW9uIGFuZCBib3VuZCB0ZXh0dXJlc1xuICAgICAqXG4gICAgICogQWN0dWFsIGBiaW5kKG51bGwsIGkpYCBjYWxscyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBuZXh0IGB1bmJpbmQoKWAgY2FsbFxuICAgICAqL1xuICAgIFRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3Vua25vd25Cb3VuZFRleHR1cmVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYm91bmRUZXh0dXJlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5ib3VuZFRleHR1cmVzW2ldID0gdGhpcy51bmtub3duVGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmQgYSB0ZXh0dXJlXG4gICAgICogQHBhcmFtIHtQSVhJLlRleHR1cmV8UElYSS5CYXNlVGV4dHVyZX0gdGV4dHVyZSAtIFRleHR1cmUgdG8gYmluZFxuICAgICAqL1xuICAgIFRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLnVuYmluZCA9IGZ1bmN0aW9uIHVuYmluZCAodGV4dHVyZSlcbiAgICB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgZ2wgPSByZWYuZ2w7XG4gICAgICAgIHZhciBib3VuZFRleHR1cmVzID0gcmVmLmJvdW5kVGV4dHVyZXM7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Vua25vd25Cb3VuZFRleHR1cmVzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl91bmtub3duQm91bmRUZXh0dXJlcyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gc29tZW9uZSBjaGFuZ2VkIHdlYkdMIHN0YXRlLFxuICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBiZSBzdXJlIHRoYXQgb3VyIHRleHR1cmUgZG9lcyBub3QgYXBwZWFyIGluIG11bHRpLXRleHR1cmUgcmVuZGVyZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRUZXh0dXJlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoYm91bmRUZXh0dXJlc1tpXSA9PT0gdGhpcy51bmtub3duVGV4dHVyZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZChudWxsLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBib3VuZFRleHR1cmVzLmxlbmd0aDsgaSQxKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChib3VuZFRleHR1cmVzW2kkMV0gPT09IHRleHR1cmUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uICE9PSBpJDEpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgaSQxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYXRpb24gPSBpJDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy5lbXB0eVRleHR1cmVzW3RleHR1cmUudGFyZ2V0XS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICBib3VuZFRleHR1cmVzW2kkMV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSB0ZXh0dXJlXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5CYXNlVGV4dHVyZX0gdGV4dHVyZSAtIFRleHR1cmUgdG8gaW5pdGlhbGl6ZVxuICAgICAqL1xuICAgIFRleHR1cmVTeXN0ZW0ucHJvdG90eXBlLmluaXRUZXh0dXJlID0gZnVuY3Rpb24gaW5pdFRleHR1cmUgKHRleHR1cmUpXG4gICAge1xuICAgICAgICB2YXIgZ2xUZXh0dXJlID0gbmV3IEdMVGV4dHVyZSh0aGlzLmdsLmNyZWF0ZVRleHR1cmUoKSk7XG5cbiAgICAgICAgLy8gZ3VhcmFudGVlIGFuIHVwZGF0ZS4uXG4gICAgICAgIGdsVGV4dHVyZS5kaXJ0eUlkID0gLTE7XG5cbiAgICAgICAgdGV4dHVyZS5fZ2xUZXh0dXJlc1t0aGlzLkNPTlRFWFRfVUlEXSA9IGdsVGV4dHVyZTtcblxuICAgICAgICB0aGlzLm1hbmFnZWRUZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICB0ZXh0dXJlLm9uKCdkaXNwb3NlJywgdGhpcy5kZXN0cm95VGV4dHVyZSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGdsVGV4dHVyZTtcbiAgICB9O1xuXG4gICAgVGV4dHVyZVN5c3RlbS5wcm90b3R5cGUuaW5pdFRleHR1cmVUeXBlID0gZnVuY3Rpb24gaW5pdFRleHR1cmVUeXBlICh0ZXh0dXJlLCBnbFRleHR1cmUpXG4gICAge1xuICAgICAgICBnbFRleHR1cmUuaW50ZXJuYWxGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcbiAgICAgICAgZ2xUZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XG4gICAgICAgIGlmICh0aGlzLndlYkdMVmVyc2lvbiAhPT0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnbCA9IHRoaXMucmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgaWYgKHRleHR1cmUudHlwZSA9PT0gZ2wuRkxPQVRcbiAgICAgICAgICAgICYmIHRleHR1cmUuZm9ybWF0ID09PSBnbC5SR0JBKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbFRleHR1cmUuaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJGO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoYXQncyBXZWJHTDEgSEFMRl9GTE9BVF9PRVNcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBjb252ZXJ0IGl0IHRvIFdlYkdMIEhBTEZfRkxPQVRcbiAgICAgICAgaWYgKHRleHR1cmUudHlwZSA9PT0gVFlQRVMuSEFMRl9GTE9BVClcbiAgICAgICAge1xuICAgICAgICAgICAgZ2xUZXh0dXJlLnR5cGUgPSBnbC5IQUxGX0ZMT0FUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnbFRleHR1cmUudHlwZSA9PT0gZ2wuSEFMRl9GTE9BVFxuICAgICAgICAgICAgJiYgdGV4dHVyZS5mb3JtYXQgPT09IGdsLlJHQkEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsVGV4dHVyZS5pbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkExNkY7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGEgdGV4dHVyZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmFzZVRleHR1cmV9IHRleHR1cmUgLSBUZXh0dXJlIHRvIGluaXRpYWxpemVcbiAgICAgKi9cbiAgICBUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlID0gZnVuY3Rpb24gdXBkYXRlVGV4dHVyZSAodGV4dHVyZSlcbiAgICB7XG4gICAgICAgIHZhciBnbFRleHR1cmUgPSB0ZXh0dXJlLl9nbFRleHR1cmVzW3RoaXMuQ09OVEVYVF9VSURdO1xuXG4gICAgICAgIGlmICghZ2xUZXh0dXJlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgICAgIHRoaXMuaW5pdFRleHR1cmVUeXBlKHRleHR1cmUsIGdsVGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKHRleHR1cmUucmVzb3VyY2UgJiYgdGV4dHVyZS5yZXNvdXJjZS51cGxvYWQocmVuZGVyZXIsIHRleHR1cmUsIGdsVGV4dHVyZSkpXG4gICAgICAgIDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0LCByZW5kZXJUZXh0dXJlLWxpa2UgbG9naWNcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRleHR1cmUucmVhbFdpZHRoO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRleHR1cmUucmVhbEhlaWdodDtcbiAgICAgICAgICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgICAgICAgICBpZiAoZ2xUZXh0dXJlLndpZHRoICE9PSB3aWR0aFxuICAgICAgICAgICAgICAgIHx8IGdsVGV4dHVyZS5oZWlnaHQgIT09IGhlaWdodFxuICAgICAgICAgICAgICAgIHx8IGdsVGV4dHVyZS5kaXJ0eUlkIDwgMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnbFRleHR1cmUud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgICAgICBnbFRleHR1cmUuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRCh0ZXh0dXJlLnRhcmdldCwgMCxcbiAgICAgICAgICAgICAgICAgICAgZ2xUZXh0dXJlLmludGVybmFsRm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICAgICAgICAgICAgZ2xUZXh0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGV0cyBvbmx5IHVwZGF0ZSB3aGF0IGNoYW5nZXMuLlxuICAgICAgICBpZiAodGV4dHVyZS5kaXJ0eVN0eWxlSWQgIT09IGdsVGV4dHVyZS5kaXJ0eVN0eWxlSWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGV4dHVyZVN0eWxlKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGdsVGV4dHVyZS5kaXJ0eUlkID0gdGV4dHVyZS5kaXJ0eUlkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIHRoZSB0ZXh0dXJlIGZyb20gV2ViR0xcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfFBJWEkuVGV4dHVyZX0gdGV4dHVyZSAtIHRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3lcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwUmVtb3ZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2tpcCByZW1vdmluZyB0aGUgdGV4dHVyZSBmcm9tIHRoZSBUZXh0dXJlTWFuYWdlci5cbiAgICAgKi9cbiAgICBUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS5kZXN0cm95VGV4dHVyZSA9IGZ1bmN0aW9uIGRlc3Ryb3lUZXh0dXJlICh0ZXh0dXJlLCBza2lwUmVtb3ZlKVxuICAgIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcblxuICAgICAgICB0ZXh0dXJlID0gdGV4dHVyZS5iYXNlVGV4dHVyZSB8fCB0ZXh0dXJlO1xuXG4gICAgICAgIGlmICh0ZXh0dXJlLl9nbFRleHR1cmVzW3RoaXMuQ09OVEVYVF9VSURdKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZCh0ZXh0dXJlKTtcblxuICAgICAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlLl9nbFRleHR1cmVzW3RoaXMuQ09OVEVYVF9VSURdLnRleHR1cmUpO1xuICAgICAgICAgICAgdGV4dHVyZS5vZmYoJ2Rpc3Bvc2UnLCB0aGlzLmRlc3Ryb3lUZXh0dXJlLCB0aGlzKTtcblxuICAgICAgICAgICAgZGVsZXRlIHRleHR1cmUuX2dsVGV4dHVyZXNbdGhpcy5DT05URVhUX1VJRF07XG5cbiAgICAgICAgICAgIGlmICghc2tpcFJlbW92ZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMubWFuYWdlZFRleHR1cmVzLmluZGV4T2YodGV4dHVyZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVJdGVtcyh0aGlzLm1hbmFnZWRUZXh0dXJlcywgaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0ZXh0dXJlIHN0eWxlIHN1Y2ggYXMgbWlwbWFwIGZsYWdcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfSB0ZXh0dXJlIC0gVGV4dHVyZSB0byB1cGRhdGVcbiAgICAgKi9cbiAgICBUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS51cGRhdGVUZXh0dXJlU3R5bGUgPSBmdW5jdGlvbiB1cGRhdGVUZXh0dXJlU3R5bGUgKHRleHR1cmUpXG4gICAge1xuICAgICAgICB2YXIgZ2xUZXh0dXJlID0gdGV4dHVyZS5fZ2xUZXh0dXJlc1t0aGlzLkNPTlRFWFRfVUlEXTtcblxuICAgICAgICBpZiAoIWdsVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0ZXh0dXJlLm1pcG1hcCA9PT0gTUlQTUFQX01PREVTLlBPVzIgfHwgdGhpcy53ZWJHTFZlcnNpb24gIT09IDIpICYmICF0ZXh0dXJlLmlzUG93ZXJPZlR3bylcbiAgICAgICAge1xuICAgICAgICAgICAgZ2xUZXh0dXJlLm1pcG1hcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBnbFRleHR1cmUubWlwbWFwID0gdGV4dHVyZS5taXBtYXAgPj0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndlYkdMVmVyc2lvbiAhPT0gMiAmJiAhdGV4dHVyZS5pc1Bvd2VyT2ZUd28pXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsVGV4dHVyZS53cmFwTW9kZSA9IFdSQVBfTU9ERVMuQ0xBTVA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBnbFRleHR1cmUud3JhcE1vZGUgPSB0ZXh0dXJlLndyYXBNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleHR1cmUucmVzb3VyY2UgJiYgdGV4dHVyZS5yZXNvdXJjZS5zdHlsZSh0aGlzLnJlbmRlcmVyLCB0ZXh0dXJlLCBnbFRleHR1cmUpKVxuICAgICAgICA7XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zZXRTdHlsZSh0ZXh0dXJlLCBnbFRleHR1cmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2xUZXh0dXJlLmRpcnR5U3R5bGVJZCA9IHRleHR1cmUuZGlydHlTdHlsZUlkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc3R5bGUgZm9yIHRleHR1cmVcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfSB0ZXh0dXJlIC0gVGV4dHVyZSB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuR0xUZXh0dXJlfSBnbFRleHR1cmVcbiAgICAgKi9cbiAgICBUZXh0dXJlU3lzdGVtLnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uIHNldFN0eWxlICh0ZXh0dXJlLCBnbFRleHR1cmUpXG4gICAge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIGlmIChnbFRleHR1cmUubWlwbWFwKVxuICAgICAgICB7XG4gICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcCh0ZXh0dXJlLnRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKHRleHR1cmUudGFyZ2V0LCBnbC5URVhUVVJFX1dSQVBfUywgZ2xUZXh0dXJlLndyYXBNb2RlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaSh0ZXh0dXJlLnRhcmdldCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsVGV4dHVyZS53cmFwTW9kZSk7XG5cbiAgICAgICAgaWYgKGdsVGV4dHVyZS5taXBtYXApXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkodGV4dHVyZS50YXJnZXQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGV4dHVyZS5zY2FsZU1vZGUgPT09IFNDQUxFX01PREVTLkxJTkVBUiA/IGdsLkxJTkVBUl9NSVBNQVBfTElORUFSIDogZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbiAgICAgICAgICAgIHZhciBhbmlzb3Ryb3BpY0V4dCA9IHRoaXMucmVuZGVyZXIuY29udGV4dC5leHRlbnNpb25zLmFuaXNvdHJvcGljRmlsdGVyaW5nO1xuXG4gICAgICAgICAgICBpZiAoYW5pc290cm9waWNFeHQgJiYgdGV4dHVyZS5hbmlzb3Ryb3BpY0xldmVsID4gMCAmJiB0ZXh0dXJlLnNjYWxlTW9kZSA9PT0gU0NBTEVfTU9ERVMuTElORUFSKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBsZXZlbCA9IE1hdGgubWluKHRleHR1cmUuYW5pc290cm9waWNMZXZlbCwgZ2wuZ2V0UGFyYW1ldGVyKGFuaXNvdHJvcGljRXh0Lk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCkpO1xuXG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyZih0ZXh0dXJlLnRhcmdldCwgYW5pc290cm9waWNFeHQuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIGxldmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkodGV4dHVyZS50YXJnZXQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGV4dHVyZS5zY2FsZU1vZGUgPT09IFNDQUxFX01PREVTLkxJTkVBUiA/IGdsLkxJTkVBUiA6IGdsLk5FQVJFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaSh0ZXh0dXJlLnRhcmdldCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0ZXh0dXJlLnNjYWxlTW9kZSA9PT0gU0NBTEVfTU9ERVMuTElORUFSID8gZ2wuTElORUFSIDogZ2wuTkVBUkVTVCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUZXh0dXJlU3lzdGVtO1xufShTeXN0ZW0pKTtcblxuLyoqXG4gKiBTeXN0ZW1zIGFyZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMgdG8gdGhlIFJlbmRlcmVyIHBpcGVsaW5lLlxuICogQG5hbWVzcGFjZSBQSVhJLnN5c3RlbXNcbiAqL1xuXG52YXIgc3lzdGVtcyA9ICh7XG4gICAgRmlsdGVyU3lzdGVtOiBGaWx0ZXJTeXN0ZW0sXG4gICAgQmF0Y2hTeXN0ZW06IEJhdGNoU3lzdGVtLFxuICAgIENvbnRleHRTeXN0ZW06IENvbnRleHRTeXN0ZW0sXG4gICAgRnJhbWVidWZmZXJTeXN0ZW06IEZyYW1lYnVmZmVyU3lzdGVtLFxuICAgIEdlb21ldHJ5U3lzdGVtOiBHZW9tZXRyeVN5c3RlbSxcbiAgICBNYXNrU3lzdGVtOiBNYXNrU3lzdGVtLFxuICAgIFNjaXNzb3JTeXN0ZW06IFNjaXNzb3JTeXN0ZW0sXG4gICAgU3RlbmNpbFN5c3RlbTogU3RlbmNpbFN5c3RlbSxcbiAgICBQcm9qZWN0aW9uU3lzdGVtOiBQcm9qZWN0aW9uU3lzdGVtLFxuICAgIFJlbmRlclRleHR1cmVTeXN0ZW06IFJlbmRlclRleHR1cmVTeXN0ZW0sXG4gICAgU2hhZGVyU3lzdGVtOiBTaGFkZXJTeXN0ZW0sXG4gICAgU3RhdGVTeXN0ZW06IFN0YXRlU3lzdGVtLFxuICAgIFRleHR1cmVHQ1N5c3RlbTogVGV4dHVyZUdDU3lzdGVtLFxuICAgIFRleHR1cmVTeXN0ZW06IFRleHR1cmVTeXN0ZW1cbn0pO1xuXG52YXIgdGVtcE1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcblxuLyoqXG4gKiBUaGUgQWJzdHJhY3RSZW5kZXJlciBpcyB0aGUgYmFzZSBmb3IgYSBQaXhpSlMgUmVuZGVyZXIuIEl0IGlzIGV4dGVuZGVkIGJ5IHRoZSB7QGxpbmsgUElYSS5DYW52YXNSZW5kZXJlcn1cbiAqIGFuZCB7QGxpbmsgUElYSS5SZW5kZXJlcn0gd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBhIFBpeGlKUyBzY2VuZS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS51dGlscy5FdmVudEVtaXR0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBBYnN0cmFjdFJlbmRlcmVyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRXZlbnRFbWl0dGVyKSB7XG4gICAgZnVuY3Rpb24gQWJzdHJhY3RSZW5kZXJlcihzeXN0ZW0sIG9wdGlvbnMpXG4gICAge1xuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgcmVuZGVyIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNldHRpbmdzLlJFTkRFUl9PUFRJT05TLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBEZXByZWNhdGlvbiBub3RpY2UgZm9yIHJlbmRlcmVyIHJvdW5kUGl4ZWxzIG9wdGlvblxuICAgICAgICBpZiAob3B0aW9ucy5yb3VuZFBpeGVscylcbiAgICAgICAge1xuICAgICAgICAgICAgc2V0dGluZ3MuUk9VTkRfUElYRUxTID0gb3B0aW9ucy5yb3VuZFBpeGVscztcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjAuMCcsICdSZW5kZXJlciByb3VuZFBpeGVscyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBQSVhJLnNldHRpbmdzLlJPVU5EX1BJWEVMUycsIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzdXBwbGllZCBjb25zdHJ1Y3RvciBvcHRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuUkVOREVSRVJfVFlQRS5VTktOT1dOXG4gICAgICAgICAqIEBzZWUgUElYSS5SRU5ERVJFUl9UWVBFXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBSRU5ERVJFUl9UWVBFLlVOS05PV047XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1lYXN1cmVtZW50cyBvZiB0aGUgc2NyZWVuLiAoMCwgMCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEl0cyBzYWZlIHRvIHVzZSBhcyBmaWx0ZXJBcmVhIG9yIGhpdEFyZWEgZm9yIHRoZSB3aG9sZSBzdGFnZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5SZWN0YW5nbGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNjcmVlbiA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgb3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY2FudmFzIGVsZW1lbnQgdGhhdCBldmVyeXRoaW5nIGlzIGRyYXduIHRvLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtIVE1MQ2FudmFzRWxlbWVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmlldyA9IG9wdGlvbnMudmlldyB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHJlc29sdXRpb24gLyBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgdGhlIHJlbmRlcmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IG9wdGlvbnMucmVzb2x1dGlvbiB8fCBzZXR0aW5ncy5SRVNPTFVUSU9OO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSByZW5kZXIgdmlldyBpcyB0cmFuc3BhcmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhbnNwYXJlbnQgPSBvcHRpb25zLnRyYW5zcGFyZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIENTUyBkaW1lbnNpb25zIG9mIGNhbnZhcyB2aWV3IHNob3VsZCBiZSByZXNpemVkIHRvIHNjcmVlbiBkaW1lbnNpb25zIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dG9EZW5zaXR5ID0gb3B0aW9ucy5hdXRvRGVuc2l0eSB8fCBvcHRpb25zLmF1dG9SZXNpemUgfHwgZmFsc2U7XG4gICAgICAgIC8vIGF1dG9SZXNpemUgaXMgZGVwcmVjYXRlZCwgcHJvdmlkZXMgZmFsbGJhY2sgc3VwcG9ydFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHByZXNlcnZlRHJhd2luZ0J1ZmZlciBmbGFnIGFmZmVjdHMgd2hldGhlciBvciBub3QgdGhlIGNvbnRlbnRzIG9mXG4gICAgICAgICAqIHRoZSBzdGVuY2lsIGJ1ZmZlciBpcyByZXRhaW5lZCBhZnRlciByZW5kZXJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IG9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHNldHMgaWYgdGhlIENhbnZhc1JlbmRlcmVyIHdpbGwgY2xlYXIgdGhlIGNhbnZhcyBvciBub3QgYmVmb3JlIHRoZSBuZXcgcmVuZGVyIHBhc3MuXG4gICAgICAgICAqIElmIHRoZSBzY2VuZSBpcyBOT1QgdHJhbnNwYXJlbnQgUGl4aUpTIHdpbGwgdXNlIGEgY2FudmFzIHNpemVkIGZpbGxSZWN0IG9wZXJhdGlvbiBldmVyeVxuICAgICAgICAgKiBmcmFtZSB0byBzZXQgdGhlIGNhbnZhcyBiYWNrZ3JvdW5kIGNvbG9yLiBJZiB0aGUgc2NlbmUgaXMgdHJhbnNwYXJlbnQgUGl4aUpTIHdpbGwgdXNlIGNsZWFyUmVjdFxuICAgICAgICAgKiB0byBjbGVhciB0aGUgY2FudmFzIGV2ZXJ5IGZyYW1lLiBEaXNhYmxlIHRoaXMgYnkgc2V0dGluZyB0aGlzIHRvIGZhbHNlLiBGb3IgZXhhbXBsZSwgaWZcbiAgICAgICAgICogeW91ciBnYW1lIGhhcyBhIGNhbnZhcyBmaWxsaW5nIGJhY2tncm91bmQgaW1hZ2UgeW91IG9mdGVuIGRvbid0IG5lZWQgdGhpcyBzZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsZWFyQmVmb3JlUmVuZGVyID0gb3B0aW9ucy5jbGVhckJlZm9yZVJlbmRlcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGJhY2tncm91bmQgY29sb3IgYXMgYSBudW1iZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gMHgwMDAwMDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIGFuIFtSLCBHLCBCXSBhcnJheS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyW119XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvclJnYmEgPSBbMCwgMCwgMCwgMF07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIGFzIGEgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvclN0cmluZyA9ICcjMDAwMDAwJztcblxuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8IHRoaXMuX2JhY2tncm91bmRDb2xvcjsgLy8gcnVuIGJnIGNvbG9yIHNldHRlclxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIHRlbXBvcmFyeSBkaXNwbGF5IG9iamVjdCB1c2VkIGFzIHRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnRseSBiZWluZyByZW5kZXJlZCBpdGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkRpc3BsYXlPYmplY3R9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3RlbXBEaXNwbGF5T2JqZWN0UGFyZW50ID0gbmV3IENvbnRhaW5lcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbGFzdCByb290IG9iamVjdCB0aGF0IHRoZSByZW5kZXJlciB0cmllZCB0byByZW5kZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuRGlzcGxheU9iamVjdH1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fbGFzdE9iamVjdFJlbmRlcmVkID0gdGhpcy5fdGVtcERpc3BsYXlPYmplY3RQYXJlbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbGxlY3Rpb24gb2YgcGx1Z2lucy5cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICggRXZlbnRFbWl0dGVyICkgQWJzdHJhY3RSZW5kZXJlci5fX3Byb3RvX18gPSBFdmVudEVtaXR0ZXI7XG4gICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdmVudEVtaXR0ZXIgJiYgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSApO1xuICAgIEFic3RyYWN0UmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQWJzdHJhY3RSZW5kZXJlcjtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSxiYWNrZ3JvdW5kQ29sb3I6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHN0YXRpY01hcCAtIFRoZSBkaWN0aW9uYXJ5IG9mIHN0YXRpY2FsbHkgc2F2ZWQgcGx1Z2lucy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFJlbmRlcmVyLnByb3RvdHlwZS5pbml0UGx1Z2lucyA9IGZ1bmN0aW9uIGluaXRQbHVnaW5zIChzdGF0aWNNYXApXG4gICAge1xuICAgICAgICBmb3IgKHZhciBvIGluIHN0YXRpY01hcClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zW29dID0gbmV3IChzdGF0aWNNYXBbb10pKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNhbWUgYXMgdmlldy53aWR0aCwgYWN0dWFsIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIGNhbnZhcyBieSBob3Jpem9udGFsLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBkZWZhdWx0IDgwMFxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53aWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy53aWR0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2FtZSBhcyB2aWV3LmhlaWdodCwgYWN0dWFsIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIGNhbnZhcyBieSB2ZXJ0aWNhbC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAZGVmYXVsdCA2MDBcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmhlaWdodDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgc2NyZWVuIGFuZCBjYW52YXMgdG8gdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIENhbnZhcyBkaW1lbnNpb25zIGFyZSBtdWx0aXBsaWVkIGJ5IHJlc29sdXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NyZWVuV2lkdGggLSBUaGUgbmV3IHdpZHRoIG9mIHRoZSBzY3JlZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjcmVlbkhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplIChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KVxuICAgIHtcbiAgICAgICAgdGhpcy5zY3JlZW4ud2lkdGggPSBzY3JlZW5XaWR0aDtcbiAgICAgICAgdGhpcy5zY3JlZW4uaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0O1xuXG4gICAgICAgIHRoaXMudmlldy53aWR0aCA9IHNjcmVlbldpZHRoICogdGhpcy5yZXNvbHV0aW9uO1xuICAgICAgICB0aGlzLnZpZXcuaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0ICogdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9EZW5zaXR5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc3R5bGUud2lkdGggPSBzY3JlZW5XaWR0aCArIFwicHhcIjtcbiAgICAgICAgICAgIHRoaXMudmlldy5zdHlsZS5oZWlnaHQgPSBzY3JlZW5IZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXNlZnVsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHRleHR1cmUgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUgc3ByaXRlc1xuICAgICAqIFRoaXMgY2FuIGJlIHF1aXRlIHVzZWZ1bCBpZiB5b3VyIGRpc3BsYXlPYmplY3QgaXMgY29tcGxpY2F0ZWQgYW5kIG5lZWRzIHRvIGJlIHJldXNlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBkaXNwbGF5T2JqZWN0IC0gVGhlIGRpc3BsYXlPYmplY3QgdGhlIG9iamVjdCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tLlxuICAgICAqIEBwYXJhbSB7UElYSS5TQ0FMRV9NT0RFU30gc2NhbGVNb2RlIC0gVGhlIHNjYWxlIG1vZGUgb2YgdGhlIHRleHR1cmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJlc29sdXRpb24gLSBUaGUgcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiB0aGUgdGV4dHVyZSBiZWluZyBnZW5lcmF0ZWQuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gW3JlZ2lvbl0gLSBUaGUgcmVnaW9uIG9mIHRoZSBkaXNwbGF5T2JqZWN0LCB0aGF0IHNoYWxsIGJlIHJlbmRlcmVkLFxuICAgICAqICAgICAgICBpZiBubyByZWdpb24gaXMgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgbG9jYWwgYm91bmRzIG9mIHRoZSBkaXNwbGF5T2JqZWN0LlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVuZGVyVGV4dHVyZX0gQSB0ZXh0dXJlIG9mIHRoZSBncmFwaGljcyBvYmplY3QuXG4gICAgICovXG4gICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUuZ2VuZXJhdGVUZXh0dXJlID0gZnVuY3Rpb24gZ2VuZXJhdGVUZXh0dXJlIChkaXNwbGF5T2JqZWN0LCBzY2FsZU1vZGUsIHJlc29sdXRpb24sIHJlZ2lvbilcbiAgICB7XG4gICAgICAgIHJlZ2lvbiA9IHJlZ2lvbiB8fCBkaXNwbGF5T2JqZWN0LmdldExvY2FsQm91bmRzKCk7XG5cbiAgICAgICAgLy8gbWluaW11bSB0ZXh0dXJlIHNpemUgaXMgMXgxLCAweDAgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpZiAocmVnaW9uLndpZHRoID09PSAwKSB7IHJlZ2lvbi53aWR0aCA9IDE7IH1cbiAgICAgICAgaWYgKHJlZ2lvbi5oZWlnaHQgPT09IDApIHsgcmVnaW9uLmhlaWdodCA9IDE7IH1cblxuICAgICAgICB2YXIgcmVuZGVyVGV4dHVyZSA9IFJlbmRlclRleHR1cmUuY3JlYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpZHRoOiByZWdpb24ud2lkdGggfCAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVnaW9uLmhlaWdodCB8IDAsXG4gICAgICAgICAgICAgICAgc2NhbGVNb2RlOiBzY2FsZU1vZGUsXG4gICAgICAgICAgICAgICAgcmVzb2x1dGlvbjogcmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRlbXBNYXRyaXgudHggPSAtcmVnaW9uLng7XG4gICAgICAgIHRlbXBNYXRyaXgudHkgPSAtcmVnaW9uLnk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoZGlzcGxheU9iamVjdCwgcmVuZGVyVGV4dHVyZSwgZmFsc2UsIHRlbXBNYXRyaXgsICEhZGlzcGxheU9iamVjdC5wYXJlbnQpO1xuXG4gICAgICAgIHJldHVybiByZW5kZXJUZXh0dXJlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgcmVuZGVyZXIgYW5kIG9wdGlvbmFsbHkgcmVtb3ZlcyB0aGUgQ2FudmFzIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmVtb3ZlVmlldz1mYWxzZV0gLSBSZW1vdmVzIHRoZSBDYW52YXMgZWxlbWVudCBmcm9tIHRoZSBET00uXG4gICAgICovXG4gICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKHJlbW92ZVZpZXcpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBvIGluIHRoaXMucGx1Z2lucylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zW29dLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tvXSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVtb3ZlVmlldyAmJiB0aGlzLnZpZXcucGFyZW50Tm9kZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52aWV3LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy52aWV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGx1Z2lucyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy50eXBlID0gUkVOREVSRVJfVFlQRS5VTktOT1dOO1xuXG4gICAgICAgIHRoaXMudmlldyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zY3JlZW4gPSBudWxsO1xuXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IDA7XG5cbiAgICAgICAgdGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYXV0b0RlbnNpdHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmJsZW5kTW9kZXMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbGVhckJlZm9yZVJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IDA7XG4gICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvclJnYmEgPSBudWxsO1xuICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kQ29sb3JTdHJpbmcgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3RlbXBEaXNwbGF5T2JqZWN0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFzdE9iamVjdFJlbmRlcmVkID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhY2tncm91bmQgY29sb3IgdG8gZmlsbCBpZiBub3QgdHJhbnNwYXJlbnRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmFja2dyb3VuZENvbG9yLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmFja2dyb3VuZENvbG9yLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbG9yU3RyaW5nID0gaGV4MnN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGhleDJyZ2IodmFsdWUsIHRoaXMuX2JhY2tncm91bmRDb2xvclJnYmEpO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIEFic3RyYWN0UmVuZGVyZXI7XG59KEV2ZW50RW1pdHRlcikpO1xuXG4vKipcbiAqIFRoZSBSZW5kZXJlciBkcmF3cyB0aGUgc2NlbmUgYW5kIGFsbCBpdHMgY29udGVudCBvbnRvIGEgV2ViR0wgZW5hYmxlZCBjYW52YXMuXG4gKlxuICogVGhpcyByZW5kZXJlciBzaG91bGQgYmUgdXNlZCBmb3IgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IFdlYkdMLlxuICpcbiAqIFRoaXMgcmVuZGVyZXIgd29ya3MgYnkgYXV0b21hdGljYWxseSBtYW5hZ2luZyBXZWJHTEJhdGNoZXNtLCBzbyBubyBuZWVkIGZvciBTcHJpdGUgQmF0Y2hlcyBvciBTcHJpdGUgQ2xvdWRzLlxuICogRG9uJ3QgZm9yZ2V0IHRvIGFkZCB0aGUgdmlldyB0byB5b3VyIERPTSBvciB5b3Ugd2lsbCBub3Qgc2VlIGFueXRoaW5nIVxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqIEBleHRlbmRzIFBJWEkuQWJzdHJhY3RSZW5kZXJlclxuICovXG52YXIgUmVuZGVyZXIgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChBYnN0cmFjdFJlbmRlcmVyKSB7XG4gICAgZnVuY3Rpb24gUmVuZGVyZXIob3B0aW9ucylcbiAgICB7XG4gICAgICAgIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIEFic3RyYWN0UmVuZGVyZXIuY2FsbCh0aGlzLCAnV2ViR0wnLCBvcHRpb25zKTtcblxuICAgICAgICAvLyB0aGUgb3B0aW9ucyB3aWxsIGhhdmUgYmVlbiBtb2RpZmllZCBoZXJlIGluIHRoZSBzdXBlciBjb25zdHJ1Y3RvciB3aXRoIHBpeGkncyBkZWZhdWx0IHNldHRpbmdzLi5cbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhpcyByZW5kZXJlciBhcyBhIHN0YW5kYXJkaXplZCBjb25zdFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBzZWUgUElYSS5SRU5ERVJFUl9UWVBFXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBSRU5ERVJFUl9UWVBFLldFQkdMO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXZWJHTCBjb250ZXh0LCBzZXQgYnkgdGhlIGNvbnRleHRTeXN0ZW0gKHRoaXMuY29udGV4dClcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBtZW1iZXIge1dlYkdMUmVuZGVyaW5nQ29udGV4dH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuQ09OVEVYVF9VSUQgPSAwO1xuXG4gICAgICAgIC8vIFRPRE8gbGVnYWN5IVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnRlcm5hbCBzaWduYWwgaW5zdGFuY2VzIG9mICoqcnVubmVyKiosIHRoZXNlXG4gICAgICAgICAqIGFyZSBhc3NpZ25lZCB0byBlYWNoIHN5c3RlbSBjcmVhdGVkLlxuICAgICAgICAgKiBAc2VlIFBJWEkuUnVubmVyXG4gICAgICAgICAqIEBuYW1lIFBJWEkuUmVuZGVyZXIjcnVubmVyc1xuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQHByb3BlcnR5IHtQSVhJLlJ1bm5lcn0gZGVzdHJveSAtIERlc3Ryb3kgcnVubmVyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UElYSS5SdW5uZXJ9IGNvbnRleHRDaGFuZ2UgLSBDb250ZXh0IGNoYW5nZSBydW5uZXJcbiAgICAgICAgICogQHByb3BlcnR5IHtQSVhJLlJ1bm5lcn0gcmVzZXQgLSBSZXNldCBydW5uZXJcbiAgICAgICAgICogQHByb3BlcnR5IHtQSVhJLlJ1bm5lcn0gdXBkYXRlIC0gVXBkYXRlIHJ1bm5lclxuICAgICAgICAgKiBAcHJvcGVydHkge1BJWEkuUnVubmVyfSBwb3N0cmVuZGVyIC0gUG9zdC1yZW5kZXIgcnVubmVyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UElYSS5SdW5uZXJ9IHByZXJlbmRlciAtIFByZS1yZW5kZXIgcnVubmVyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UElYSS5SdW5uZXJ9IHJlc2l6ZSAtIFJlc2l6ZSBydW5uZXJcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucnVubmVycyA9IHtcbiAgICAgICAgICAgIGRlc3Ryb3k6IG5ldyBSdW5uZXIoJ2Rlc3Ryb3knKSxcbiAgICAgICAgICAgIGNvbnRleHRDaGFuZ2U6IG5ldyBSdW5uZXIoJ2NvbnRleHRDaGFuZ2UnLCAxKSxcbiAgICAgICAgICAgIHJlc2V0OiBuZXcgUnVubmVyKCdyZXNldCcpLFxuICAgICAgICAgICAgdXBkYXRlOiBuZXcgUnVubmVyKCd1cGRhdGUnKSxcbiAgICAgICAgICAgIHBvc3RyZW5kZXI6IG5ldyBSdW5uZXIoJ3Bvc3RyZW5kZXInKSxcbiAgICAgICAgICAgIHByZXJlbmRlcjogbmV3IFJ1bm5lcigncHJlcmVuZGVyJyksXG4gICAgICAgICAgICByZXNpemU6IG5ldyBSdW5uZXIoJ3Jlc2l6ZScsIDIpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHbG9iYWwgdW5pZm9ybXNcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5Vbmlmb3JtR3JvdXB9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdsb2JhbFVuaWZvcm1zID0gbmV3IFVuaWZvcm1Hcm91cCh7XG4gICAgICAgICAgICBwcm9qZWN0aW9uTWF0cml4OiBuZXcgTWF0cml4KCksXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXNrIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLnN5c3RlbXMuTWFza1N5c3RlbX0gbWFza1xuICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5SZW5kZXJlciNcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZFN5c3RlbShNYXNrU3lzdGVtLCAnbWFzaycpXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENvbnRleHQgc3lzdGVtIGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLnN5c3RlbXMuQ29udGV4dFN5c3RlbX0gY29udGV4dFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShDb250ZXh0U3lzdGVtLCAnY29udGV4dCcpXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFN0YXRlIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlN0YXRlU3lzdGVtfSBzdGF0ZVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShTdGF0ZVN5c3RlbSwgJ3N0YXRlJylcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogU2hhZGVyIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlNoYWRlclN5c3RlbX0gc2hhZGVyXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5SZW5kZXJlciNcbiAgICAgICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAuYWRkU3lzdGVtKFNoYWRlclN5c3RlbSwgJ3NoYWRlcicpXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRleHR1cmUgc3lzdGVtIGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLnN5c3RlbXMuVGV4dHVyZVN5c3RlbX0gdGV4dHVyZVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShUZXh0dXJlU3lzdGVtLCAndGV4dHVyZScpXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdlb21ldHJ5IHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLkdlb21ldHJ5U3lzdGVtfSBnZW9tZXRyeVxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShHZW9tZXRyeVN5c3RlbSwgJ2dlb21ldHJ5JylcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRnJhbWVidWZmZXIgc3lzdGVtIGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLnN5c3RlbXMuRnJhbWVidWZmZXJTeXN0ZW19IGZyYW1lYnVmZmVyXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5SZW5kZXJlciNcbiAgICAgICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAuYWRkU3lzdGVtKEZyYW1lYnVmZmVyU3lzdGVtLCAnZnJhbWVidWZmZXInKVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBTY2lzc29yIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlNjaXNzb3JTeXN0ZW19IHNjaXNzb3JcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBQSVhJLlJlbmRlcmVyI1xuICAgICAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC5hZGRTeXN0ZW0oU2Npc3NvclN5c3RlbSwgJ3NjaXNzb3InKVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBTdGVuY2lsIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlN0ZW5jaWxTeXN0ZW19IHN0ZW5jaWxcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBQSVhJLlJlbmRlcmVyI1xuICAgICAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC5hZGRTeXN0ZW0oU3RlbmNpbFN5c3RlbSwgJ3N0ZW5jaWwnKVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBQcm9qZWN0aW9uIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlByb2plY3Rpb25TeXN0ZW19IHByb2plY3Rpb25cbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBQSVhJLlJlbmRlcmVyI1xuICAgICAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC5hZGRTeXN0ZW0oUHJvamVjdGlvblN5c3RlbSwgJ3Byb2plY3Rpb24nKVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUZXh0dXJlIGdhcmJhZ2UgY29sbGVjdG9yIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlRleHR1cmVHQ1N5c3RlbX0gdGV4dHVyZUdDXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS5SZW5kZXJlciNcbiAgICAgICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAuYWRkU3lzdGVtKFRleHR1cmVHQ1N5c3RlbSwgJ3RleHR1cmVHQycpXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpbHRlciBzeXN0ZW0gaW5zdGFuY2VcbiAgICAgICAgICAgICAqIEBtZW1iZXIge1BJWEkuc3lzdGVtcy5GaWx0ZXJTeXN0ZW19IGZpbHRlclxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShGaWx0ZXJTeXN0ZW0sICdmaWx0ZXInKVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZW5kZXJUZXh0dXJlIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLlJlbmRlclRleHR1cmVTeXN0ZW19IHJlbmRlclRleHR1cmVcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBQSVhJLlJlbmRlcmVyI1xuICAgICAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC5hZGRTeXN0ZW0oUmVuZGVyVGV4dHVyZVN5c3RlbSwgJ3JlbmRlclRleHR1cmUnKVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEJhdGNoIHN5c3RlbSBpbnN0YW5jZVxuICAgICAgICAgICAgICogQG1lbWJlciB7UElYSS5zeXN0ZW1zLkJhdGNoU3lzdGVtfSBiYXRjaFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuUmVuZGVyZXIjXG4gICAgICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLmFkZFN5c3RlbShCYXRjaFN5c3RlbSwgJ2JhdGNoJyk7XG5cbiAgICAgICAgdGhpcy5pbml0UGx1Z2lucyhSZW5kZXJlci5fX3BsdWdpbnMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgb3B0aW9ucyBwYXNzZWQgaW4gdG8gY3JlYXRlIGEgbmV3IFdlYkdMIGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAob3B0aW9ucy5jb250ZXh0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5pdEZyb21Db250ZXh0KG9wdGlvbnMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5pdEZyb21PcHRpb25zKHtcbiAgICAgICAgICAgICAgICBhbHBoYTogdGhpcy50cmFuc3BhcmVudCxcbiAgICAgICAgICAgICAgICBhbnRpYWxpYXM6IG9wdGlvbnMuYW50aWFsaWFzLFxuICAgICAgICAgICAgICAgIHByZW11bHRpcGxpZWRBbHBoYTogdGhpcy50cmFuc3BhcmVudCAmJiB0aGlzLnRyYW5zcGFyZW50ICE9PSAnbm90TXVsdGlwbGllZCcsXG4gICAgICAgICAgICAgICAgc3RlbmNpbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IG9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyLFxuICAgICAgICAgICAgICAgIHBvd2VyUHJlZmVyZW5jZTogdGhpcy5vcHRpb25zLnBvd2VyUHJlZmVyZW5jZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgaWYgd2UgYXJlIHJlbmRlcmluZyB0byB0aGUgc2NyZWVuIHZzIHJlbmRlclRleHR1cmVcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVuZGVyaW5nVG9TY3JlZW4gPSB0cnVlO1xuXG4gICAgICAgIHNheUhlbGxvKHRoaXMuY29udGV4dC53ZWJHTFZlcnNpb24gPT09IDIgPyAnV2ViR0wgMicgOiAnV2ViR0wgMScpO1xuXG4gICAgICAgIHRoaXMucmVzaXplKHRoaXMub3B0aW9ucy53aWR0aCwgdGhpcy5vcHRpb25zLmhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKCBBYnN0cmFjdFJlbmRlcmVyICkgUmVuZGVyZXIuX19wcm90b19fID0gQWJzdHJhY3RSZW5kZXJlcjtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBYnN0cmFjdFJlbmRlcmVyICYmIEFic3RyYWN0UmVuZGVyZXIucHJvdG90eXBlICk7XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVuZGVyZXI7XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBuZXcgc3lzdGVtIHRvIHRoZSByZW5kZXJlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDbGFzc1JlZiAtIENsYXNzIHJlZmVyZW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBQcm9wZXJ0eSBuYW1lIGZvciBzeXN0ZW0sIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiAgICAgICAgd2lsbCB1c2UgYSBzdGF0aWMgYG5hbWVgIHByb3BlcnR5IG9uIHRoZSBjbGFzcyBpdHNlbGYuIFRoaXNcbiAgICAgKiAgICAgICAgbmFtZSB3aWxsIGJlIGFzc2lnbmVkIGFzIHMgcHJvcGVydHkgb24gdGhlIFJlbmRlcmVyIHNvIG1ha2VcbiAgICAgKiAgICAgICAgc3VyZSBpdCBkb2Vzbid0IGNvbGxpZGUgd2l0aCBwcm9wZXJ0aWVzIG9uIFJlbmRlcmVyLlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVuZGVyZXJ9IFJldHVybiBpbnN0YW5jZSBvZiByZW5kZXJlclxuICAgICAqL1xuICAgIFJlbmRlcmVyLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIGlmIChpc1dlYkdMU3VwcG9ydGVkKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVuZGVyZXIob3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIHVuc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciwgdXNlIFwicGl4aS5qcy1sZWdhY3lcIiBmb3IgZmFsbGJhY2sgY2FudmFzMmQgc3VwcG9ydC4nKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmFkZFN5c3RlbSA9IGZ1bmN0aW9uIGFkZFN5c3RlbSAoQ2xhc3NSZWYsIG5hbWUpXG4gICAge1xuICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUgPSBDbGFzc1JlZi5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN5c3RlbSA9IG5ldyBDbGFzc1JlZih0aGlzKTtcblxuICAgICAgICBpZiAodGhpc1tuYW1lXSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChcIldob29wcyEgVGhlIG5hbWUgXFxcIlwiICsgbmFtZSArIFwiXFxcIiBpcyBhbHJlYWR5IGluIHVzZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW25hbWVdID0gc3lzdGVtO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5ydW5uZXJzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lcnNbaV0uYWRkKHN5c3RlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgYWZ0ZXIgcmVuZGVyaW5nIGZpbmlzaGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgUElYSS5SZW5kZXJlciNwb3N0cmVuZGVyXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCBiZWZvcmUgcmVuZGVyaW5nIHN0YXJ0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuUmVuZGVyZXIjcHJlcmVuZGVyXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBXZWJHTCBjb250ZXh0IGlzIHNldC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IFBJWEkuUmVuZGVyZXIjY29udGV4dFxuICAgICAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgLSBXZWJHTCBjb250ZXh0LlxuICAgICAgICAgKi9cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIGl0cyBXZWJHTCB2aWV3XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gZGlzcGxheU9iamVjdCAtIFRoZSBvYmplY3QgdG8gYmUgcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IFtyZW5kZXJUZXh0dXJlXSAtIFRoZSByZW5kZXIgdGV4dHVyZSB0byByZW5kZXIgdG8uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2xlYXI9dHJ1ZV0gLSBTaG91bGQgdGhlIGNhbnZhcyBiZSBjbGVhcmVkIGJlZm9yZSB0aGUgbmV3IHJlbmRlci5cbiAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBbdHJhbnNmb3JtXSAtIEEgdHJhbnNmb3JtIHRvIGFwcGx5IHRvIHRoZSByZW5kZXIgdGV4dHVyZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBVcGRhdGVUcmFuc2Zvcm09ZmFsc2VdIC0gU2hvdWxkIHdlIHNraXAgdGhlIHVwZGF0ZSB0cmFuc2Zvcm0gcGFzcz9cbiAgICAgKi9cbiAgICBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChkaXNwbGF5T2JqZWN0LCByZW5kZXJUZXh0dXJlLCBjbGVhciwgdHJhbnNmb3JtLCBza2lwVXBkYXRlVHJhbnNmb3JtKVxuICAgIHtcbiAgICAgICAgLy8gY2FuIGJlIGhhbmR5IHRvIGtub3chXG4gICAgICAgIHRoaXMucmVuZGVyaW5nVG9TY3JlZW4gPSAhcmVuZGVyVGV4dHVyZTtcblxuICAgICAgICB0aGlzLnJ1bm5lcnMucHJlcmVuZGVyLnJ1bigpO1xuICAgICAgICB0aGlzLmVtaXQoJ3ByZXJlbmRlcicpO1xuXG4gICAgICAgIC8vIGFwcGx5IGEgdHJhbnNmb3JtIGF0IGEgR1BVIGxldmVsXG4gICAgICAgIHRoaXMucHJvamVjdGlvbi50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gbm8gcG9pbnQgcmVuZGVyaW5nIGlmIG91ciBjb250ZXh0IGhhcyBiZWVuIGJsb3duIHVwIVxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmlzTG9zdClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZW5kZXJUZXh0dXJlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0T2JqZWN0UmVuZGVyZWQgPSBkaXNwbGF5T2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFza2lwVXBkYXRlVHJhbnNmb3JtKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNjZW5lIGdyYXBoXG4gICAgICAgICAgICB2YXIgY2FjaGVQYXJlbnQgPSBkaXNwbGF5T2JqZWN0LnBhcmVudDtcblxuICAgICAgICAgICAgZGlzcGxheU9iamVjdC5wYXJlbnQgPSB0aGlzLl90ZW1wRGlzcGxheU9iamVjdFBhcmVudDtcbiAgICAgICAgICAgIGRpc3BsYXlPYmplY3QudXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICBkaXNwbGF5T2JqZWN0LnBhcmVudCA9IGNhY2hlUGFyZW50O1xuICAgICAgICAgICAgLy8gZGlzcGxheU9iamVjdC5oaXRBcmVhID0gLy9UT0RPIGFkZCBhIHRlbXAgaGl0IGFyZWFcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyVGV4dHVyZS5iaW5kKHJlbmRlclRleHR1cmUpO1xuICAgICAgICB0aGlzLmJhdGNoLmN1cnJlbnRSZW5kZXJlci5zdGFydCgpO1xuXG4gICAgICAgIGlmIChjbGVhciAhPT0gdW5kZWZpbmVkID8gY2xlYXIgOiB0aGlzLmNsZWFyQmVmb3JlUmVuZGVyKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclRleHR1cmUuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BsYXlPYmplY3QucmVuZGVyKHRoaXMpO1xuXG4gICAgICAgIC8vIGFwcGx5IHRyYW5zZm9ybS4uXG4gICAgICAgIHRoaXMuYmF0Y2guY3VycmVudFJlbmRlcmVyLmZsdXNoKCk7XG5cbiAgICAgICAgaWYgKHJlbmRlclRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlclRleHR1cmUuYmFzZVRleHR1cmUudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJ1bm5lcnMucG9zdHJlbmRlci5ydW4oKTtcblxuICAgICAgICAvLyByZXNldCB0cmFuc2Zvcm0gYWZ0ZXIgcmVuZGVyXG4gICAgICAgIHRoaXMucHJvamVjdGlvbi50cmFuc2Zvcm0gPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZW1pdCgncG9zdHJlbmRlcicpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBXZWJHTCB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY3JlZW5XaWR0aCAtIFRoZSBuZXcgd2lkdGggb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2NyZWVuSGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgb2YgdGhlIHNjcmVlbi5cbiAgICAgKi9cbiAgICBSZW5kZXJlci5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gcmVzaXplIChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KVxuICAgIHtcbiAgICAgICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUucmVzaXplLmNhbGwodGhpcywgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5ydW5uZXJzLnJlc2l6ZS5ydW4oc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgV2ViR0wgc3RhdGUgc28geW91IGNhbiByZW5kZXIgdGhpbmdzIGhvd2V2ZXIgeW91IGZhbmN5IVxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5SZW5kZXJlcn0gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbiAgICB7XG4gICAgICAgIHRoaXMucnVubmVycy5yZXNldC5ydW4oKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGZyYW1lIGJ1ZmZlclxuICAgICAqL1xuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpXG4gICAge1xuICAgICAgICB0aGlzLmZyYW1lYnVmZmVyLmJpbmQoKTtcbiAgICAgICAgdGhpcy5mcmFtZWJ1ZmZlci5jbGVhcigpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgcmVuZGVyZXIgKGV2ZW50IGxpc3RlbmVycywgc3ByaXRlYmF0Y2gsIGV0Yy4uLilcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlbW92ZVZpZXc9ZmFsc2VdIC0gUmVtb3ZlcyB0aGUgQ2FudmFzIGVsZW1lbnQgZnJvbSB0aGUgRE9NLlxuICAgICAqICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9waXhpanMvcGl4aS5qcy9pc3N1ZXMvMjIzM1xuICAgICAqL1xuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAocmVtb3ZlVmlldylcbiAgICB7XG4gICAgICAgIHRoaXMucnVubmVycy5kZXN0cm95LnJ1bigpO1xuXG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5ydW5uZXJzKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lcnNbcl0uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsbCBiYXNlIGRlc3Ryb3lcbiAgICAgICAgQWJzdHJhY3RSZW5kZXJlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMsIHJlbW92ZVZpZXcpO1xuXG4gICAgICAgIC8vIFRPRE8gbnVsbGlmeSBhbGwgdGhlIG1hbmFnZXJzLi5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgaW5zdGFsbGVkIHBsdWdpbnMuIFRoZXNlIGFyZSBpbmNsdWRlZCBieSBkZWZhdWx0IGluIFBJWEksIGJ1dCBjYW4gYmUgZXhjbHVkZWRcbiAgICAgKiBieSBjcmVhdGluZyBhIGN1c3RvbSBidWlsZC4gQ29uc3VsdCB0aGUgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIGN1c3RvbVxuICAgICAqIGJ1aWxkcyBhbmQgZXhjbHVkaW5nIHBsdWdpbnMuXG4gICAgICogQG5hbWUgUElYSS5SZW5kZXJlciNwbHVnaW5zXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAcHJvcGVydHkge1BJWEkuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcn0gYWNjZXNzaWJpbGl0eSBTdXBwb3J0IHRhYmJpbmcgaW50ZXJhY3RpdmUgZWxlbWVudHMuXG4gICAgICogQHByb3BlcnR5IHtQSVhJLkV4dHJhY3R9IGV4dHJhY3QgRXh0cmFjdCBpbWFnZSBkYXRhIGZyb20gcmVuZGVyZXIuXG4gICAgICogQHByb3BlcnR5IHtQSVhJLmludGVyYWN0aW9uLkludGVyYWN0aW9uTWFuYWdlcn0gaW50ZXJhY3Rpb24gSGFuZGxlcyBtb3VzZSwgdG91Y2ggYW5kIHBvaW50ZXIgZXZlbnRzLlxuICAgICAqIEBwcm9wZXJ0eSB7UElYSS5QcmVwYXJlfSBwcmVwYXJlIFByZS1yZW5kZXIgZGlzcGxheSBvYmplY3RzLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHBsdWdpbiB0byB0aGUgcmVuZGVyZXIuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN0b3IgLSBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gb3IgY2xhc3MgZm9yIHRoZSBwbHVnaW4uXG4gICAgICovXG4gICAgUmVuZGVyZXIucmVnaXN0ZXJQbHVnaW4gPSBmdW5jdGlvbiByZWdpc3RlclBsdWdpbiAocGx1Z2luTmFtZSwgY3RvcilcbiAgICB7XG4gICAgICAgIFJlbmRlcmVyLl9fcGx1Z2lucyA9IFJlbmRlcmVyLl9fcGx1Z2lucyB8fCB7fTtcbiAgICAgICAgUmVuZGVyZXIuX19wbHVnaW5zW3BsdWdpbk5hbWVdID0gY3RvcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFJlbmRlcmVyO1xufShBYnN0cmFjdFJlbmRlcmVyKSk7XG5cbi8qKlxuICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGljaCByZW5kZXJlciB5b3Ugc2hvdWxkIGJlIHVzaW5nLlxuICogV2ViR0wgaXMgdGhlIHByZWZlcnJlZCByZW5kZXJlciBhcyBpdCBpcyBhIGxvdCBmYXN0ZXIuIElmIFdlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgYnlcbiAqIHRoZSBicm93c2VyIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGNhbnZhcyByZW5kZXJlclxuICpcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZnVuY3Rpb24gYXV0b0RldGVjdFJlbmRlcmVyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbmFsIHJlbmRlcmVyIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy53aWR0aD04MDBdIC0gdGhlIHdpZHRoIG9mIHRoZSByZW5kZXJlcnMgdmlld1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodD02MDBdIC0gdGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyZXJzIHZpZXdcbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IFtvcHRpb25zLnZpZXddIC0gdGhlIGNhbnZhcyB0byB1c2UgYXMgYSB2aWV3LCBvcHRpb25hbFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFuc3BhcmVudD1mYWxzZV0gLSBJZiB0aGUgcmVuZGVyIHZpZXcgaXMgdHJhbnNwYXJlbnQsIGRlZmF1bHQgZmFsc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b0RlbnNpdHk9ZmFsc2VdIC0gUmVzaXplcyByZW5kZXJlciB2aWV3IGluIENTUyBwaXhlbHMgdG8gYWxsb3cgZm9yXG4gKiAgIHJlc29sdXRpb25zIG90aGVyIHRoYW4gMVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hbnRpYWxpYXM9ZmFsc2VdIC0gc2V0cyBhbnRpYWxpYXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSAtIGVuYWJsZXMgZHJhd2luZyBidWZmZXIgcHJlc2VydmF0aW9uLCBlbmFibGUgdGhpcyBpZiB5b3VcbiAqICBuZWVkIHRvIGNhbGwgdG9EYXRhVXJsIG9uIHRoZSB3ZWJnbCBjb250ZXh0XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmFja2dyb3VuZENvbG9yPTB4MDAwMDAwXSAtIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSByZW5kZXJlZCBhcmVhXG4gKiAgKHNob3duIGlmIG5vdCB0cmFuc3BhcmVudCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsZWFyQmVmb3JlUmVuZGVyPXRydWVdIC0gVGhpcyBzZXRzIGlmIHRoZSByZW5kZXJlciB3aWxsIGNsZWFyIHRoZSBjYW52YXMgb3JcbiAqICAgbm90IGJlZm9yZSB0aGUgbmV3IHJlbmRlciBwYXNzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb249MV0gLSBUaGUgcmVzb2x1dGlvbiAvIGRldmljZSBwaXhlbCByYXRpbyBvZiB0aGUgcmVuZGVyZXIsIHJldGluYSB3b3VsZCBiZSAyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlQ2FudmFzPWZhbHNlXSAtIHByZXZlbnRzIHNlbGVjdGlvbiBvZiBXZWJHTCByZW5kZXJlciwgZXZlbiBpZiBzdWNoIGlzIHByZXNlbnQsIHRoaXNcbiAqICAgb3B0aW9uIG9ubHkgaXMgYXZhaWxhYmxlIHdoZW4gdXNpbmcgKipwaXhpLmpzLWxlZ2FjeSoqIG9yICoqQHBpeGkvY2FudmFzLXJlbmRlcmVyKiogbW9kdWxlcywgb3RoZXJ3aXNlXG4gKiAgIGl0IGlzIGlnbm9yZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlRlhBQT1mYWxzZV0gLSBmb3JjZXMgRlhBQSBhbnRpYWxpYXNpbmcgdG8gYmUgdXNlZCBvdmVyIG5hdGl2ZS5cbiAqICBGWEFBIGlzIGZhc3RlciwgYnV0IG1heSBub3QgYWx3YXlzIGxvb2sgYXMgZ3JlYXQgKip3ZWJnbCBvbmx5KipcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wb3dlclByZWZlcmVuY2VdIC0gUGFyYW1ldGVyIHBhc3NlZCB0byB3ZWJnbCBjb250ZXh0LCBzZXQgdG8gXCJoaWdoLXBlcmZvcm1hbmNlXCJcbiAqICBmb3IgZGV2aWNlcyB3aXRoIGR1YWwgZ3JhcGhpY3MgY2FyZCAqKndlYmdsIG9ubHkqKlxuICogQHJldHVybiB7UElYSS5SZW5kZXJlcnxQSVhJLkNhbnZhc1JlbmRlcmVyfSBSZXR1cm5zIFdlYkdMIHJlbmRlcmVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIENhbnZhc1JlbmRlcmVyXG4gKi9cbmZ1bmN0aW9uIGF1dG9EZXRlY3RSZW5kZXJlcihvcHRpb25zKVxue1xuICAgIHJldHVybiBSZW5kZXJlci5jcmVhdGUob3B0aW9ucyk7XG59XG5cbnZhciBfZGVmYXVsdCA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XFxuXFxudW5pZm9ybSBtYXQzIHByb2plY3Rpb25NYXRyaXg7XFxuXFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxuXFxudm9pZCBtYWluKHZvaWQpXFxue1xcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoKHByb2plY3Rpb25NYXRyaXggKiB2ZWMzKGFWZXJ0ZXhQb3NpdGlvbiwgMS4wKSkueHksIDAuMCwgMS4wKTtcXG4gICAgdlRleHR1cmVDb29yZCA9IGFUZXh0dXJlQ29vcmQ7XFxufVwiO1xuXG52YXIgZGVmYXVsdEZpbHRlciA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcblxcbnVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4O1xcblxcbnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnVuaWZvcm0gdmVjNCBpbnB1dFNpemU7XFxudW5pZm9ybSB2ZWM0IG91dHB1dEZyYW1lO1xcblxcbnZlYzQgZmlsdGVyVmVydGV4UG9zaXRpb24oIHZvaWQgKVxcbntcXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFWZXJ0ZXhQb3NpdGlvbiAqIG1heChvdXRwdXRGcmFtZS56dywgdmVjMigwLikpICsgb3V0cHV0RnJhbWUueHk7XFxuXFxuICAgIHJldHVybiB2ZWM0KChwcm9qZWN0aW9uTWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHksIDAuMCwgMS4wKTtcXG59XFxuXFxudmVjMiBmaWx0ZXJUZXh0dXJlQ29vcmQoIHZvaWQgKVxcbntcXG4gICAgcmV0dXJuIGFWZXJ0ZXhQb3NpdGlvbiAqIChvdXRwdXRGcmFtZS56dyAqIGlucHV0U2l6ZS56dyk7XFxufVxcblxcbnZvaWQgbWFpbih2b2lkKVxcbntcXG4gICAgZ2xfUG9zaXRpb24gPSBmaWx0ZXJWZXJ0ZXhQb3NpdGlvbigpO1xcbiAgICB2VGV4dHVyZUNvb3JkID0gZmlsdGVyVGV4dHVyZUNvb3JkKCk7XFxufVxcblwiO1xuXG4vKipcbiAqIEEgVGV4dHVyZSB0aGF0IGRlcGVuZHMgb24gc2l4IG90aGVyIHJlc291cmNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuQmFzZVRleHR1cmVcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBDdWJlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJhc2VUZXh0dXJlKSB7XG4gICAgZnVuY3Rpb24gQ3ViZVRleHR1cmUgKCkge1xuICAgICAgICBCYXNlVGV4dHVyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmICggQmFzZVRleHR1cmUgKSBDdWJlVGV4dHVyZS5fX3Byb3RvX18gPSBCYXNlVGV4dHVyZTtcbiAgICBDdWJlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCYXNlVGV4dHVyZSAmJiBCYXNlVGV4dHVyZS5wcm90b3R5cGUgKTtcbiAgICBDdWJlVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlVGV4dHVyZTtcblxuICAgIEN1YmVUZXh0dXJlLmZyb20gPSBmdW5jdGlvbiBmcm9tIChyZXNvdXJjZXMsIG9wdGlvbnMpXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IEN1YmVUZXh0dXJlKG5ldyBDdWJlUmVzb3VyY2UocmVzb3VyY2VzLCBvcHRpb25zKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBDdWJlVGV4dHVyZTtcbn0oQmFzZVRleHR1cmUpKTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBiYXRjaGVyIHRvIGRyYXcgYmF0Y2hlcy5cbiAqIEVhY2ggb25lIG9mIHRoZXNlIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkcmF3IGEgYm91bmQgZ2VvbWV0cnkuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgQmF0Y2hEcmF3Q2FsbCA9IGZ1bmN0aW9uIEJhdGNoRHJhd0NhbGwoKVxue1xuICAgIHRoaXMudGV4QXJyYXkgPSBudWxsO1xuICAgIHRoaXMuYmxlbmQgPSAwO1xuICAgIHRoaXMudHlwZSA9IERSQVdfTU9ERVMuVFJJQU5HTEVTO1xuXG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5zaXplID0gMDtcblxuICAgIC8qKlxuICAgICAqIGRhdGEgZm9yIHVuaWZvcm1zIG9yIGN1c3RvbSB3ZWJnbCBzdGF0ZVxuICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBiYXRjaGVyIHRvIGJ1aWxkIHRleHR1cmUgYmF0Y2hlcy5cbiAqIEhvbGRzIGxpc3Qgb2YgdGV4dHVyZXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgbG9jYXRpb25zLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEJhdGNoVGV4dHVyZUFycmF5ID0gZnVuY3Rpb24gQmF0Y2hUZXh0dXJlQXJyYXkoKVxue1xuICAgIC8qKlxuICAgICAqIGluc2lkZSB0ZXh0dXJlcyBhcnJheVxuICAgICAqIEBtZW1iZXIge1BJWEkuQmFzZVRleHR1cmVbXX1cbiAgICAgKi9cbiAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgLyoqXG4gICAgICogUmVzcGVjdGl2ZSBsb2NhdGlvbnMgZm9yIHRleHR1cmVzXG4gICAgICogQG1lbWJlciB7bnVtYmVyW119XG4gICAgICovXG4gICAgdGhpcy5pZHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBudW1iZXIgb2YgZmlsbGVkIGVsZW1lbnRzXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuY291bnQgPSAwO1xufTtcblxuQmF0Y2hUZXh0dXJlQXJyYXkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKClcbntcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkrKylcbiAgICB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvdW50ID0gMDtcbn07XG5cbi8qKlxuICogRmxleGlibGUgd3JhcHBlciBhcm91bmQgYEFycmF5QnVmZmVyYCB0aGF0IGFsc28gcHJvdmlkZXNcbiAqIHR5cGVkIGFycmF5IHZpZXdzIG9uIGRlbWFuZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBWaWV3YWJsZUJ1ZmZlciA9IGZ1bmN0aW9uIFZpZXdhYmxlQnVmZmVyKHNpemUpXG57XG4gICAgLyoqXG4gICAgICogVW5kZXJseWluZyBgQXJyYXlCdWZmZXJgIHRoYXQgaG9sZHMgYWxsIHRoZSBkYXRhXG4gICAgICogYW5kIGlzIG9mIGNhcGFjaXR5IGBzaXplYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge0FycmF5QnVmZmVyfVxuICAgICAqL1xuICAgIHRoaXMucmF3QmluYXJ5RGF0YSA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcblxuICAgIC8qKlxuICAgICAqIFZpZXcgb24gdGhlIHJhdyBiaW5hcnkgZGF0YSBhcyBhIGBVaW50MzJBcnJheWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtVaW50MzJBcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLnVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkodGhpcy5yYXdCaW5hcnlEYXRhKTtcblxuICAgIC8qKlxuICAgICAqIFZpZXcgb24gdGhlIHJhdyBiaW5hcnkgZGF0YSBhcyBhIGBGbG9hdDMyQXJyYXlgLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7RmxvYXQzMkFycmF5fVxuICAgICAqL1xuICAgIHRoaXMuZmxvYXQzMlZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMucmF3QmluYXJ5RGF0YSk7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzJDUgPSB7IGludDhWaWV3OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHVpbnQ4VmlldzogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbnQxNlZpZXc6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdWludDE2VmlldzogeyBjb25maWd1cmFibGU6IHRydWUgfSxpbnQzMlZpZXc6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLyoqXG4gKiBWaWV3IG9uIHRoZSByYXcgYmluYXJ5IGRhdGEgYXMgYSBgSW50OEFycmF5YC5cbiAqXG4gKiBAbWVtYmVyIHtJbnQ4QXJyYXl9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQ1LmludDhWaWV3LmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgaWYgKCF0aGlzLl9pbnQ4VmlldylcbiAgICB7XG4gICAgICAgIHRoaXMuX2ludDhWaWV3ID0gbmV3IEludDhBcnJheSh0aGlzLnJhd0JpbmFyeURhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbnQ4Vmlldztcbn07XG5cbi8qKlxuICogVmlldyBvbiB0aGUgcmF3IGJpbmFyeSBkYXRhIGFzIGEgYFVpbnQ4QXJyYXlgLlxuICpcbiAqIEBtZW1iZXIge1VpbnQ4QXJyYXl9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQ1LnVpbnQ4Vmlldy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIGlmICghdGhpcy5fdWludDhWaWV3KVxuICAgIHtcbiAgICAgICAgdGhpcy5fdWludDhWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5yYXdCaW5hcnlEYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdWludDhWaWV3O1xufTtcblxuLyoqXG4gKiBWaWV3IG9uIHRoZSByYXcgYmluYXJ5IGRhdGEgYXMgYSBgSW50MTZBcnJheWAuXG4gKlxuICogQG1lbWJlciB7SW50MTZBcnJheX1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzJDUuaW50MTZWaWV3LmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgaWYgKCF0aGlzLl9pbnQxNlZpZXcpXG4gICAge1xuICAgICAgICB0aGlzLl9pbnQxNlZpZXcgPSBuZXcgSW50MTZBcnJheSh0aGlzLnJhd0JpbmFyeURhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbnQxNlZpZXc7XG59O1xuXG4vKipcbiAqIFZpZXcgb24gdGhlIHJhdyBiaW5hcnkgZGF0YSBhcyBhIGBVaW50MTZBcnJheWAuXG4gKlxuICogQG1lbWJlciB7VWludDE2QXJyYXl9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycyQ1LnVpbnQxNlZpZXcuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICBpZiAoIXRoaXMuX3VpbnQxNlZpZXcpXG4gICAge1xuICAgICAgICB0aGlzLl91aW50MTZWaWV3ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMucmF3QmluYXJ5RGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3VpbnQxNlZpZXc7XG59O1xuXG4vKipcbiAqIFZpZXcgb24gdGhlIHJhdyBiaW5hcnkgZGF0YSBhcyBhIGBJbnQzMkFycmF5YC5cbiAqXG4gKiBAbWVtYmVyIHtJbnQzMkFycmF5fVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMkNS5pbnQzMlZpZXcuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICBpZiAoIXRoaXMuX2ludDMyVmlldylcbiAgICB7XG4gICAgICAgIHRoaXMuX2ludDMyVmlldyA9IG5ldyBJbnQzMkFycmF5KHRoaXMucmF3QmluYXJ5RGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ludDMyVmlldztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlldyBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIE9uZSBvZiBgaW50OGAsIGB1aW50OGAsIGBpbnQxNmAsXG4gKmB1aW50MTZgLCBgaW50MzJgLCBgdWludDMyYCwgYW5kIGBmbG9hdDMyYC5cbiAqIEByZXR1cm4ge29iamVjdH0gdHlwZWQgYXJyYXkgb2YgZ2l2ZW4gdHlwZVxuICovXG5WaWV3YWJsZUJ1ZmZlci5wcm90b3R5cGUudmlldyA9IGZ1bmN0aW9uIHZpZXcgKHR5cGUpXG57XG4gICAgcmV0dXJuIHRoaXNbKHR5cGUgKyBcIlZpZXdcIildO1xufTtcblxuLyoqXG4gKiBEZXN0cm95cyBhbGwgYnVmZmVyIHJlZmVyZW5jZXMuIERvIG5vdCB1c2UgYWZ0ZXIgY2FsbGluZ1xuICogdGhpcy5cbiAqL1xuVmlld2FibGVCdWZmZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy5yYXdCaW5hcnlEYXRhID0gbnVsbDtcbiAgICB0aGlzLl9pbnQ4VmlldyA9IG51bGw7XG4gICAgdGhpcy5fdWludDhWaWV3ID0gbnVsbDtcbiAgICB0aGlzLl9pbnQxNlZpZXcgPSBudWxsO1xuICAgIHRoaXMuX3VpbnQxNlZpZXcgPSBudWxsO1xuICAgIHRoaXMuX2ludDMyVmlldyA9IG51bGw7XG4gICAgdGhpcy51aW50MzJWaWV3ID0gbnVsbDtcbiAgICB0aGlzLmZsb2F0MzJWaWV3ID0gbnVsbDtcbn07XG5cblZpZXdhYmxlQnVmZmVyLnNpemVPZiA9IGZ1bmN0aW9uIHNpemVPZiAodHlwZSlcbntcbiAgICBzd2l0Y2ggKHR5cGUpXG4gICAge1xuICAgICAgICBjYXNlICdpbnQ4JzpcbiAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIGNhc2UgJ2ludDE2JzpcbiAgICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgIGNhc2UgJ3VpbnQzMic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0MzInOlxuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKHR5cGUgKyBcIiBpc24ndCBhIHZhbGlkIHZpZXcgdHlwZVwiKSk7XG4gICAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZpZXdhYmxlQnVmZmVyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzJDUgKTtcblxuLyoqXG4gKiBSZW5kZXJlciBkZWRpY2F0ZWQgdG8gZHJhd2luZyBhbmQgYmF0Y2hpbmcgc3ByaXRlcy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJhdGNoIHJlbmRlcmVyLiBJdCBidWZmZXJzIG9iamVjdHNcbiAqIHdpdGggdGV4dHVyZS1iYXNlZCBnZW9tZXRyaWVzIGFuZCByZW5kZXJzIHRoZW0gaW5cbiAqIGJhdGNoZXMuIEl0IHVwbG9hZHMgbXVsdGlwbGUgdGV4dHVyZXMgdG8gdGhlIEdQVSB0b1xuICogcmVkdWNlIHRvIHRoZSBudW1iZXIgb2YgZHJhdyBjYWxscy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwcm90ZWN0ZWRcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXh0ZW5kcyBQSVhJLk9iamVjdFJlbmRlcmVyXG4gKi9cbnZhciBBYnN0cmFjdEJhdGNoUmVuZGVyZXIgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChPYmplY3RSZW5kZXJlcikge1xuICAgIGZ1bmN0aW9uIEFic3RyYWN0QmF0Y2hSZW5kZXJlcihyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIE9iamVjdFJlbmRlcmVyLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaGFkZXIgdGhhdCBjYW5cbiAgICAgICAgICogY29sb3IgZWFjaCB2ZXJ0ZXggYmFzZWQgb24gYSBgYVRleHR1cmVJZGBcbiAgICAgICAgICogYXR0cmlidXRlIHRoYXQgcG9pbnRzIHRvIGFuIHRleHR1cmUgaW4gYHVTYW1wbGVyYC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyBlbmFibGVzIHRoZSBvYmplY3RzIHdpdGggZGlmZmVyZW50IHRleHR1cmVzXG4gICAgICAgICAqIHRvIGJlIGRyYXduIGluIHRoZSBzYW1lIGRyYXcgY2FsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogWW91IGNhbiBjdXN0b21pemUgeW91ciBzaGFkZXIgYnkgY3JlYXRpbmcgeW91clxuICAgICAgICAgKiBjdXN0b20gc2hhZGVyIGdlbmVyYXRvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5CYXRjaFNoYWRlckdlbmVyYXRvcn1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaGFkZXJHZW5lcmF0b3IgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBnZW9tZXRyeSBvZiBvYmplY3RzXG4gICAgICAgICAqIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGJhdGNoZWQgd2l0aCB0aGlzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtvYmplY3R9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuQmF0Y2hHZW9tZXRyeVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlb21ldHJ5Q2xhc3MgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaXplIG9mIGRhdGEgYmVpbmcgYnVmZmVyZWQgcGVyIHZlcnRleCBpbiB0aGVcbiAgICAgICAgICogYXR0cmlidXRlIGJ1ZmZlcnMgKGluIGZsb2F0cykuIEJ5IGRlZmF1bHQsIHRoZVxuICAgICAgICAgKiBiYXRjaC1yZW5kZXJlciBwbHVnaW4gdXNlcyA2OlxuICAgICAgICAgKlxuICAgICAgICAgKiB8IGFWZXJ0ZXhQb3NpdGlvbiB8IDIgfFxuICAgICAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS18LS0tfFxuICAgICAgICAgKiB8IGFUZXh0dXJlQ29vcmRzICB8IDIgfFxuICAgICAgICAgKiB8IGFDb2xvciAgICAgICAgICB8IDEgfFxuICAgICAgICAgKiB8IGFUZXh0dXJlSWQgICAgICB8IDEgfFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52ZXJ0ZXhTaXplID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFdlYkdMIHN0YXRlIGluIHdoaWNoIHRoaXMgcmVuZGVyZXIgd2lsbCB3b3JrLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlN0YXRlfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5mb3IyZCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcmFibGUgb2JqZWN0cyBiZWZvcmUgYSBmbHVzaFxuICAgICAgICAgKiBvY2N1cnMgYXV0b21hdGljYWxseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCBzZXR0aW5ncy5TUFJJVEVfQkFUQ0hfU0laRSAqIDRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IHNldHRpbmdzLlNQUklURV9CQVRDSF9TSVpFICogNDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVG90YWwgY291bnQgb2YgYWxsIHZlcnRpY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnRseVxuICAgICAgICAgKiBidWZmZXJlZCBvYmplY3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl92ZXJ0ZXhDb3VudCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRvdGFsIGNvdW50IG9mIGFsbCBpbmRpY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnRseVxuICAgICAgICAgKiBidWZmZXJlZCBvYmplY3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9pbmRleENvdW50ID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIG9mIG9iamVjdHMgdGhhdCBhcmUgeWV0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkRpc3BsYXlPYmplY3RbXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2J1ZmZlcmVkRWxlbWVudHMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGF0YSBmb3IgdGV4dHVyZSBiYXRjaCBidWlsZGVyLCBoZWxwcyB0byBzYXZlIGEgYml0IG9mIENQVSBvbiBhIHBhc3NcbiAgICAgICAgICogQHR5cGUge1BJWEkuQmFzZVRleHR1cmVbXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2J1ZmZlcmVkVGV4dHVyZXMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlIGJ1ZmZlcmVkIGFuZCBhcmVcbiAgICAgICAgICogd2FpdGluZyB0byBiZSBmbHVzaGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBzaGFkZXIgaXMgZ2VuZXJhdGVkIGJ5IGB0aGlzLnNoYWRlckdlbmVyYXRvcmAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEl0IGlzIGdlbmVyYXRlZCBzcGVjaWZpY2FsbHkgdG8gaGFuZGxlIHRoZSByZXF1aXJlZFxuICAgICAgICAgKiBudW1iZXIgb2YgdGV4dHVyZXMgYmVpbmcgYmF0Y2hlZCB0b2dldGhlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5TaGFkZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3NoYWRlciA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBvb2wgb2YgYHRoaXMuZ2VvbWV0cnlDbGFzc2AgZ2VvbWV0cnkgb2JqZWN0c1xuICAgICAgICAgKiB0aGF0IHN0b3JlIGJ1ZmZlcnMuIFRoZXkgYXJlIHVzZWQgdG8gcGFzcyBkYXRhXG4gICAgICAgICAqIHRvIHRoZSBzaGFkZXIgb24gZWFjaCBkcmF3IGNhbGwuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZXNlIGFyZSBuZXZlciByZS1hbGxvY2F0ZWQgYWdhaW4sIHVubGVzcyBhXG4gICAgICAgICAqIGNvbnRleHQgY2hhbmdlIG9jY3VyczsgaG93ZXZlciwgdGhlIHBvb2wgbWF5XG4gICAgICAgICAqIGJlIGV4cGFuZGVkIGlmIHJlcXVpcmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkdlb21ldHJ5W119XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBzZWUgUElYSS5BYnN0cmFjdEJhdGNoUmVuZGVyZXIuY29udGV4dENoYW5nZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcGFja2VkR2VvbWV0cmllcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTaXplIG9mIGB0aGlzLl9wYWNrZWRHZW9tZXRyaWVzYC4gSXQgY2FuIGJlIGV4cGFuZGVkXG4gICAgICAgICAqIGlmIG1vcmUgdGhhbiBgdGhpcy5fcGFja2VkR2VvbWV0cnlQb29sU2l6ZWAgZmx1c2hlc1xuICAgICAgICAgKiBvY2N1ciBpbiBhIHNpbmdsZSBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcGFja2VkR2VvbWV0cnlQb29sU2l6ZSA9IDI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZmx1c2ggbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGluIGEgc2luZ2xlXG4gICAgICAgICAqIGZyYW1lLiBPbiBpT1MgZGV2aWNlcyBvciB3aGVuXG4gICAgICAgICAqIGBzZXR0aW5ncy5DQU5fVVBMT0FEX1NBTUVfQlVGRkVSYCBpcyBmYWxzZSwgdGhlXG4gICAgICAgICAqIGJhdGNoIHJlbmRlcmVyIGRvZXMgbm90IHVwbG9hZCBkYXRhIHRvIHRoZSBzYW1lXG4gICAgICAgICAqIGBXZWJHTEJ1ZmZlcmAgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIGluZGV4IGludG8gYHBhY2tlZEdlb21ldHJpZXNgIHRoYXQgcG9pbnRzIHRvXG4gICAgICAgICAqIGdlb21ldHJ5IGhvbGRpbmcgdGhlIG1vc3QgcmVjZW50IGJ1ZmZlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2ZsdXNoSWQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb29sIG9mIGBWaWV3YWJsZUJ1ZmZlcmAgb2JqZWN0cyB0aGF0IGFyZSBzb3J0ZWQgaW5cbiAgICAgICAgICogb3JkZXIgb2YgaW5jcmVhc2luZyBzaXplLiBUaGUgZmx1c2ggbWV0aG9kIHVzZXNcbiAgICAgICAgICogdGhlIGJ1ZmZlciB3aXRoIHRoZSBsZWFzdCBzaXplIGFib3ZlIHRoZSBhbW91bnRcbiAgICAgICAgICogaXQgcmVxdWlyZXMuIFRoZXNlIGFyZSB1c2VkIGZvciBwYXNzaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBmaXJzdCBidWZmZXIgaGFzIGEgc2l6ZSBvZiA4OyBlYWNoIHN1YnNlcXVlbnRcbiAgICAgICAgICogYnVmZmVyIGhhcyBkb3VibGUgY2FwYWNpdHkgb2YgaXRzIHByZXZpb3VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlZpZXdhYmxlQnVmZmVyW119XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBzZWUgUElYSS5BYnN0cmFjdEJhdGNoUmVuZGVyZXIjZ2V0QXR0cmlidXRlQnVmZmVyXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9hQnVmZmVycyA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQb29sIG9mIGBVaW50MTZBcnJheWAgb2JqZWN0cyB0aGF0IGFyZSBzb3J0ZWQgaW5cbiAgICAgICAgICogb3JkZXIgb2YgaW5jcmVhc2luZyBzaXplLiBUaGUgZmx1c2ggbWV0aG9kIHVzZXNcbiAgICAgICAgICogdGhlIGJ1ZmZlciB3aXRoIHRoZSBsZWFzdCBzaXplIGFib3ZlIHRoZSBhbW91bnRcbiAgICAgICAgICogaXQgcmVxdWlyZXMuIFRoZXNlIGFyZSB1c2VkIGZvciBwYXNzaW5nIGluZGljZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBmaXJzdCBidWZmZXIgaGFzIGEgc2l6ZSBvZiAxMjsgZWFjaCBzdWJzZXF1ZW50XG4gICAgICAgICAqIGJ1ZmZlciBoYXMgZG91YmxlIGNhcGFjaXR5IG9mIGl0cyBwcmV2aW91cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7VWludDE2QXJyYXlbXX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQHNlZSBQSVhJLkFic3RyYWN0QmF0Y2hSZW5kZXJlciNnZXRJbmRleEJ1ZmZlclxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faUJ1ZmZlcnMgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgdGV4dHVyZXMgdGhhdCBjYW4gYmUgdXBsb2FkZWQgdG9cbiAgICAgICAgICogdGhlIEdQVSB1bmRlciB0aGUgY3VycmVudCBjb250ZXh0LiBJdCBpcyBpbml0aWFsaXplZFxuICAgICAgICAgKiBwcm9wZXJseSBpbiBgdGhpcy5jb250ZXh0Q2hhbmdlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAc2VlIFBJWEkuQWJzdHJhY3RCYXRjaFJlbmRlcmVyI2NvbnRleHRDaGFuZ2VcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLk1BWF9URVhUVVJFUyA9IDE7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5vbigncHJlcmVuZGVyJywgdGhpcy5vblByZXJlbmRlciwgdGhpcyk7XG4gICAgICAgIHJlbmRlcmVyLnJ1bm5lcnMuY29udGV4dENoYW5nZS5hZGQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5fZGNJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2FJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2lJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZUJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2luZGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGVtcEJvdW5kVGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIE9iamVjdFJlbmRlcmVyICkgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLl9fcHJvdG9fXyA9IE9iamVjdFJlbmRlcmVyO1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3RSZW5kZXJlciAmJiBPYmplY3RSZW5kZXJlci5wcm90b3R5cGUgKTtcbiAgICBBYnN0cmFjdEJhdGNoUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQWJzdHJhY3RCYXRjaFJlbmRlcmVyO1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgYGNvbnRleHRDaGFuZ2VgIHNpZ25hbC5cbiAgICAgKlxuICAgICAqIEl0IGNhbGN1bGF0ZXMgYHRoaXMuTUFYX1RFWFRVUkVTYCBhbmQgYWxsb2NhdGluZyB0aGVcbiAgICAgKiBwYWNrZWQtZ2VvbWV0cnkgb2JqZWN0IHBvb2wuXG4gICAgICovXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS5jb250ZXh0Q2hhbmdlID0gZnVuY3Rpb24gY29udGV4dENoYW5nZSAoKVxuICAgIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5yZW5kZXJlci5nbDtcblxuICAgICAgICBpZiAoc2V0dGluZ3MuUFJFRkVSX0VOViA9PT0gRU5WLldFQkdMX0xFR0FDWSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5NQVhfVEVYVFVSRVMgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc3RlcCAxOiBmaXJzdCBjaGVjayBtYXggdGV4dHVyZXMgdGhlIEdQVSBjYW4gaGFuZGxlLlxuICAgICAgICAgICAgdGhpcy5NQVhfVEVYVFVSRVMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLlNQUklURV9NQVhfVEVYVFVSRVMpO1xuXG4gICAgICAgICAgICAvLyBzdGVwIDI6IGNoZWNrIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpZiBzdGF0ZW1lbnRzIHRoZSBzaGFkZXIgY2FuIGhhdmUgdG9vLi5cbiAgICAgICAgICAgIHRoaXMuTUFYX1RFWFRVUkVTID0gY2hlY2tNYXhJZlN0YXRlbWVudHNJblNoYWRlcihcbiAgICAgICAgICAgICAgICB0aGlzLk1BWF9URVhUVVJFUywgZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hhZGVyID0gdGhpcy5zaGFkZXJHZW5lcmF0b3IuZ2VuZXJhdGVTaGFkZXIodGhpcy5NQVhfVEVYVFVSRVMpO1xuXG4gICAgICAgIC8vIHdlIHVzZSB0aGUgc2Vjb25kIHNoYWRlciBhcyB0aGUgZmlyc3Qgb25lIGRlcGVuZGluZyBvbiB5b3VyIGJyb3dzZXJcbiAgICAgICAgLy8gbWF5IG9taXQgYVRleHR1cmVJZCBhcyBpdCBpcyBub3QgdXNlZCBieSB0aGUgc2hhZGVyIHNvIGlzIG9wdGltaXplZCBvdXQuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcGFja2VkR2VvbWV0cnlQb29sU2l6ZTsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgICAgICAgICB0aGlzLl9wYWNrZWRHZW9tZXRyaWVzW2ldID0gbmV3ICh0aGlzLmdlb21ldHJ5Q2xhc3MpKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRGbHVzaEJ1ZmZlcnMoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTWFrZXMgc3VyZSB0aGF0IHN0YXRpYyBhbmQgZHluYW1pYyBmbHVzaCBwb29sZWQgb2JqZWN0cyBoYXZlIGNvcnJlY3QgZGltZW5zaW9uc1xuICAgICAqL1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUuaW5pdEZsdXNoQnVmZmVycyA9IGZ1bmN0aW9uIGluaXRGbHVzaEJ1ZmZlcnMgKClcbiAgICB7XG4gICAgICAgIHZhciBfZHJhd0NhbGxQb29sID0gQWJzdHJhY3RCYXRjaFJlbmRlcmVyLl9kcmF3Q2FsbFBvb2w7XG4gICAgICAgIHZhciBfdGV4dHVyZUFycmF5UG9vbCA9IEFic3RyYWN0QmF0Y2hSZW5kZXJlci5fdGV4dHVyZUFycmF5UG9vbDtcbiAgICAgICAgLy8gbWF4IGRyYXcgY2FsbHNcbiAgICAgICAgdmFyIE1BWF9TUFJJVEVTID0gdGhpcy5zaXplIC8gNDtcbiAgICAgICAgLy8gbWF4IHRleHR1cmUgYXJyYXlzXG4gICAgICAgIHZhciBNQVhfVEEgPSBNYXRoLmZsb29yKE1BWF9TUFJJVEVTIC8gdGhpcy5NQVhfVEVYVFVSRVMpICsgMTtcblxuICAgICAgICB3aGlsZSAoX2RyYXdDYWxsUG9vbC5sZW5ndGggPCBNQVhfU1BSSVRFUylcbiAgICAgICAge1xuICAgICAgICAgICAgX2RyYXdDYWxsUG9vbC5wdXNoKG5ldyBCYXRjaERyYXdDYWxsKCkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChfdGV4dHVyZUFycmF5UG9vbC5sZW5ndGggPCBNQVhfVEEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIF90ZXh0dXJlQXJyYXlQb29sLnB1c2gobmV3IEJhdGNoVGV4dHVyZUFycmF5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5NQVhfVEVYVFVSRVM7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdGVtcEJvdW5kVGV4dHVyZXNbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGBwcmVyZW5kZXJgIHNpZ25hbC5cbiAgICAgKlxuICAgICAqIEl0IGVuc3VyZXMgdGhhdCBmbHVzaGVzIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGdlb21ldHJ5XG4gICAgICogb2JqZWN0IGFnYWluLlxuICAgICAqL1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUub25QcmVyZW5kZXIgPSBmdW5jdGlvbiBvblByZXJlbmRlciAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZmx1c2hJZCA9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEJ1ZmZlcnMgdGhlIFwiYmF0Y2hhYmxlXCIgb2JqZWN0LiBJdCBuZWVkIG5vdCBiZSByZW5kZXJlZFxuICAgICAqIGltbWVkaWF0ZWx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGVsZW1lbnQgLSB0aGUgZWxlbWVudCB0byByZW5kZXIgd2hlblxuICAgICAqICAgIHVzaW5nIHRoaXMgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBBYnN0cmFjdEJhdGNoUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlciAoZWxlbWVudClcbiAgICB7XG4gICAgICAgIGlmICghZWxlbWVudC5fdGV4dHVyZS52YWxpZClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZlcnRleENvdW50ICsgKGVsZW1lbnQudmVydGV4RGF0YS5sZW5ndGggLyAyKSA+IHRoaXMuc2l6ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmVydGV4Q291bnQgKz0gZWxlbWVudC52ZXJ0ZXhEYXRhLmxlbmd0aCAvIDI7XG4gICAgICAgIHRoaXMuX2luZGV4Q291bnQgKz0gZWxlbWVudC5pbmRpY2VzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fYnVmZmVyZWRUZXh0dXJlc1t0aGlzLl9idWZmZXJTaXplXSA9IGVsZW1lbnQuX3RleHR1cmUuYmFzZVRleHR1cmU7XG4gICAgICAgIHRoaXMuX2J1ZmZlcmVkRWxlbWVudHNbdGhpcy5fYnVmZmVyU2l6ZSsrXSA9IGVsZW1lbnQ7XG4gICAgfTtcblxuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUuYnVpbGRUZXh0dXJlc0FuZERyYXdDYWxscyA9IGZ1bmN0aW9uIGJ1aWxkVGV4dHVyZXNBbmREcmF3Q2FsbHMgKClcbiAgICB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICB2YXIgdGV4dHVyZXMgPSByZWYuX2J1ZmZlcmVkVGV4dHVyZXM7XG4gICAgICAgIHZhciBNQVhfVEVYVFVSRVMgPSByZWYuTUFYX1RFWFRVUkVTO1xuICAgICAgICB2YXIgdGV4dHVyZUFycmF5cyA9IEFic3RyYWN0QmF0Y2hSZW5kZXJlci5fdGV4dHVyZUFycmF5UG9vbDtcbiAgICAgICAgdmFyIGJhdGNoID0gdGhpcy5yZW5kZXJlci5iYXRjaDtcbiAgICAgICAgdmFyIGJvdW5kVGV4dHVyZXMgPSB0aGlzLl90ZW1wQm91bmRUZXh0dXJlcztcbiAgICAgICAgdmFyIHRvdWNoID0gdGhpcy5yZW5kZXJlci50ZXh0dXJlR0MuY291bnQ7XG5cbiAgICAgICAgdmFyIFRJQ0sgPSArK0Jhc2VUZXh0dXJlLl9nbG9iYWxCYXRjaDtcbiAgICAgICAgdmFyIGNvdW50VGV4QXJyYXlzID0gMDtcbiAgICAgICAgdmFyIHRleEFycmF5ID0gdGV4dHVyZUFycmF5c1swXTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gMDtcblxuICAgICAgICBiYXRjaC5jb3B5Qm91bmRUZXh0dXJlcyhib3VuZFRleHR1cmVzLCBNQVhfVEVYVFVSRVMpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fYnVmZmVyU2l6ZTsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdGV4ID0gdGV4dHVyZXNbaV07XG5cbiAgICAgICAgICAgIHRleHR1cmVzW2ldID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0ZXguX2JhdGNoRW5hYmxlZCA9PT0gVElDSylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleEFycmF5LmNvdW50ID49IE1BWF9URVhUVVJFUylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiYXRjaC5ib3VuZEFycmF5KHRleEFycmF5LCBib3VuZFRleHR1cmVzLCBUSUNLLCBNQVhfVEVYVFVSRVMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGREcmF3Q2FsbHModGV4QXJyYXksIHN0YXJ0LCBpKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgdGV4QXJyYXkgPSB0ZXh0dXJlQXJyYXlzWysrY291bnRUZXhBcnJheXNdO1xuICAgICAgICAgICAgICAgICsrVElDSztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGV4Ll9iYXRjaEVuYWJsZWQgPSBUSUNLO1xuICAgICAgICAgICAgdGV4LnRvdWNoZWQgPSB0b3VjaDtcbiAgICAgICAgICAgIHRleEFycmF5LmVsZW1lbnRzW3RleEFycmF5LmNvdW50KytdID0gdGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleEFycmF5LmNvdW50ID4gMClcbiAgICAgICAge1xuICAgICAgICAgICAgYmF0Y2guYm91bmRBcnJheSh0ZXhBcnJheSwgYm91bmRUZXh0dXJlcywgVElDSywgTUFYX1RFWFRVUkVTKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGREcmF3Q2FsbHModGV4QXJyYXksIHN0YXJ0LCB0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgICAgICsrY291bnRUZXhBcnJheXM7XG4gICAgICAgICAgICArK1RJQ0s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbi11cFxuXG4gICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGJvdW5kVGV4dHVyZXMubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgYm91bmRUZXh0dXJlc1tpJDFdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBCYXNlVGV4dHVyZS5fZ2xvYmFsQmF0Y2ggPSBUSUNLO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0aW5nIGRyYXdjYWxscyBmb3IgcmVuZGVyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmF0Y2hUZXh0dXJlQXJyYXl9IHRleEFycmF5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZpbmlzaFxuICAgICAqL1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUuYnVpbGREcmF3Q2FsbHMgPSBmdW5jdGlvbiBidWlsZERyYXdDYWxscyAodGV4QXJyYXksIHN0YXJ0LCBmaW5pc2gpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gcmVmLl9idWZmZXJlZEVsZW1lbnRzO1xuICAgICAgICB2YXIgX2F0dHJpYnV0ZUJ1ZmZlciA9IHJlZi5fYXR0cmlidXRlQnVmZmVyO1xuICAgICAgICB2YXIgX2luZGV4QnVmZmVyID0gcmVmLl9pbmRleEJ1ZmZlcjtcbiAgICAgICAgdmFyIHZlcnRleFNpemUgPSByZWYudmVydGV4U2l6ZTtcbiAgICAgICAgdmFyIGRyYXdDYWxscyA9IEFic3RyYWN0QmF0Y2hSZW5kZXJlci5fZHJhd0NhbGxQb29sO1xuXG4gICAgICAgIHZhciBkY0luZGV4ID0gdGhpcy5fZGNJbmRleDtcbiAgICAgICAgdmFyIGFJbmRleCA9IHRoaXMuX2FJbmRleDtcbiAgICAgICAgdmFyIGlJbmRleCA9IHRoaXMuX2lJbmRleDtcblxuICAgICAgICB2YXIgZHJhd0NhbGwgPSBkcmF3Q2FsbHNbZGNJbmRleF07XG5cbiAgICAgICAgZHJhd0NhbGwuc3RhcnQgPSB0aGlzLl9pSW5kZXg7XG4gICAgICAgIGRyYXdDYWxsLnRleEFycmF5ID0gdGV4QXJyYXk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZmluaXNoOyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzcHJpdGUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgIHZhciB0ZXggPSBzcHJpdGUuX3RleHR1cmUuYmFzZVRleHR1cmU7XG4gICAgICAgICAgICB2YXIgc3ByaXRlQmxlbmRNb2RlID0gcHJlbXVsdGlwbHlCbGVuZE1vZGVbXG4gICAgICAgICAgICAgICAgdGV4LmFscGhhTW9kZSA/IDEgOiAwXVtzcHJpdGUuYmxlbmRNb2RlXTtcblxuICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQgPCBpICYmIGRyYXdDYWxsLmJsZW5kICE9PSBzcHJpdGVCbGVuZE1vZGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZHJhd0NhbGwuc2l6ZSA9IGlJbmRleCAtIGRyYXdDYWxsLnN0YXJ0O1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTtcbiAgICAgICAgICAgICAgICBkcmF3Q2FsbCA9IGRyYXdDYWxsc1srK2RjSW5kZXhdO1xuICAgICAgICAgICAgICAgIGRyYXdDYWxsLnRleEFycmF5ID0gdGV4QXJyYXk7XG4gICAgICAgICAgICAgICAgZHJhd0NhbGwuc3RhcnQgPSBpSW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGFja0ludGVybGVhdmVkR2VvbWV0cnkoc3ByaXRlLCBfYXR0cmlidXRlQnVmZmVyLCBfaW5kZXhCdWZmZXIsIGFJbmRleCwgaUluZGV4KTtcbiAgICAgICAgICAgIGFJbmRleCArPSBzcHJpdGUudmVydGV4RGF0YS5sZW5ndGggLyAyICogdmVydGV4U2l6ZTtcbiAgICAgICAgICAgIGlJbmRleCArPSBzcHJpdGUuaW5kaWNlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGRyYXdDYWxsLmJsZW5kID0gc3ByaXRlQmxlbmRNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0IDwgZmluaXNoKVxuICAgICAgICB7XG4gICAgICAgICAgICBkcmF3Q2FsbC5zaXplID0gaUluZGV4IC0gZHJhd0NhbGwuc3RhcnQ7XG4gICAgICAgICAgICArK2RjSW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kY0luZGV4ID0gZGNJbmRleDtcbiAgICAgICAgdGhpcy5fYUluZGV4ID0gYUluZGV4O1xuICAgICAgICB0aGlzLl9pSW5kZXggPSBpSW5kZXg7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEJpbmQgdGV4dHVyZXMgZm9yIGN1cnJlbnQgcmVuZGVyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuQmF0Y2hUZXh0dXJlQXJyYXl9IHRleEFycmF5XG4gICAgICovXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS5iaW5kQW5kQ2xlYXJUZXhBcnJheSA9IGZ1bmN0aW9uIGJpbmRBbmRDbGVhclRleEFycmF5ICh0ZXhBcnJheSlcbiAgICB7XG4gICAgICAgIHZhciB0ZXh0dXJlU3lzdGVtID0gdGhpcy5yZW5kZXJlci50ZXh0dXJlO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGV4QXJyYXkuY291bnQ7IGorKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGV4dHVyZVN5c3RlbS5iaW5kKHRleEFycmF5LmVsZW1lbnRzW2pdLCB0ZXhBcnJheS5pZHNbal0pO1xuICAgICAgICAgICAgdGV4QXJyYXkuZWxlbWVudHNbal0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRleEFycmF5LmNvdW50ID0gMDtcbiAgICB9O1xuXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS51cGRhdGVHZW9tZXRyeSA9IGZ1bmN0aW9uIHVwZGF0ZUdlb21ldHJ5ICgpXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgdmFyIHBhY2tlZEdlb21ldHJpZXMgPSByZWYuX3BhY2tlZEdlb21ldHJpZXM7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVCdWZmZXIgPSByZWYuX2F0dHJpYnV0ZUJ1ZmZlcjtcbiAgICAgICAgdmFyIGluZGV4QnVmZmVyID0gcmVmLl9pbmRleEJ1ZmZlcjtcblxuICAgICAgICBpZiAoIXNldHRpbmdzLkNBTl9VUExPQURfU0FNRV9CVUZGRVIpXG4gICAgICAgIHsgLyogVXN1YWxseSBvbiBpT1MgZGV2aWNlcywgd2hlcmUgdGhlIGJyb3dzZXIgZG9lc24ndFxuICAgICAgICAgICAgbGlrZSB1cGxvYWRzIHRvIHRoZSBzYW1lIGJ1ZmZlciBpbiBhIHNpbmdsZSBmcmFtZS4gKi9cbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWNrZWRHZW9tZXRyeVBvb2xTaXplIDw9IHRoaXMuX2ZsdXNoSWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFja2VkR2VvbWV0cnlQb29sU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHBhY2tlZEdlb21ldHJpZXNbdGhpcy5fZmx1c2hJZF0gPSBuZXcgKHRoaXMuZ2VvbWV0cnlDbGFzcykoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFja2VkR2VvbWV0cmllc1t0aGlzLl9mbHVzaElkXS5fYnVmZmVyLnVwZGF0ZShhdHRyaWJ1dGVCdWZmZXIucmF3QmluYXJ5RGF0YSk7XG4gICAgICAgICAgICBwYWNrZWRHZW9tZXRyaWVzW3RoaXMuX2ZsdXNoSWRdLl9pbmRleEJ1ZmZlci51cGRhdGUoaW5kZXhCdWZmZXIpO1xuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmdlb21ldHJ5LmJpbmQocGFja2VkR2VvbWV0cmllc1t0aGlzLl9mbHVzaElkXSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmdlb21ldHJ5LnVwZGF0ZUJ1ZmZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoSWQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGxldHMgdXNlIHRoZSBmYXN0ZXIgb3B0aW9uLCBhbHdheXMgdXNlIGJ1ZmZlciBudW1iZXIgMFxuICAgICAgICAgICAgcGFja2VkR2VvbWV0cmllc1t0aGlzLl9mbHVzaElkXS5fYnVmZmVyLnVwZGF0ZShhdHRyaWJ1dGVCdWZmZXIucmF3QmluYXJ5RGF0YSk7XG4gICAgICAgICAgICBwYWNrZWRHZW9tZXRyaWVzW3RoaXMuX2ZsdXNoSWRdLl9pbmRleEJ1ZmZlci51cGRhdGUoaW5kZXhCdWZmZXIpO1xuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmdlb21ldHJ5LnVwZGF0ZUJ1ZmZlcnMoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBYnN0cmFjdEJhdGNoUmVuZGVyZXIucHJvdG90eXBlLmRyYXdCYXRjaGVzID0gZnVuY3Rpb24gZHJhd0JhdGNoZXMgKClcbiAgICB7XG4gICAgICAgIHZhciBkY0NvdW50ID0gdGhpcy5fZGNJbmRleDtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciBnbCA9IHJlZi5nbDtcbiAgICAgICAgdmFyIHN0YXRlU3lzdGVtID0gcmVmLnN0YXRlO1xuICAgICAgICB2YXIgZHJhd0NhbGxzID0gQWJzdHJhY3RCYXRjaFJlbmRlcmVyLl9kcmF3Q2FsbFBvb2w7XG5cbiAgICAgICAgdmFyIGN1clRleEFycmF5ID0gbnVsbDtcblxuICAgICAgICAvLyBVcGxvYWQgdGV4dHVyZXMgYW5kIGRvIHRoZSBkcmF3IGNhbGxzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGNDb3VudDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVmJDEgPSBkcmF3Q2FsbHNbaV07XG4gICAgICAgICAgICB2YXIgdGV4QXJyYXkgPSByZWYkMS50ZXhBcnJheTtcbiAgICAgICAgICAgIHZhciB0eXBlID0gcmVmJDEudHlwZTtcbiAgICAgICAgICAgIHZhciBzaXplID0gcmVmJDEuc2l6ZTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHJlZiQxLnN0YXJ0O1xuICAgICAgICAgICAgdmFyIGJsZW5kID0gcmVmJDEuYmxlbmQ7XG5cbiAgICAgICAgICAgIGlmIChjdXJUZXhBcnJheSAhPT0gdGV4QXJyYXkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY3VyVGV4QXJyYXkgPSB0ZXhBcnJheTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRBbmRDbGVhclRleEFycmF5KHRleEFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5ibGVuZE1vZGUgPSBibGVuZDtcbiAgICAgICAgICAgIHN0YXRlU3lzdGVtLnNldCh0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyh0eXBlLCBzaXplLCBnbC5VTlNJR05FRF9TSE9SVCwgc3RhcnQgKiAyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjb250ZW50IF9ub3dfIGFuZCBlbXB0aWVzIHRoZSBjdXJyZW50IGJhdGNoLlxuICAgICAqL1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiBmbHVzaCAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZlcnRleENvdW50ID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVCdWZmZXIgPSB0aGlzLmdldEF0dHJpYnV0ZUJ1ZmZlcih0aGlzLl92ZXJ0ZXhDb3VudCk7XG4gICAgICAgIHRoaXMuX2luZGV4QnVmZmVyID0gdGhpcy5nZXRJbmRleEJ1ZmZlcih0aGlzLl9pbmRleENvdW50KTtcbiAgICAgICAgdGhpcy5fYUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5faUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fZGNJbmRleCA9IDA7XG5cbiAgICAgICAgdGhpcy5idWlsZFRleHR1cmVzQW5kRHJhd0NhbGxzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR2VvbWV0cnkoKTtcbiAgICAgICAgdGhpcy5kcmF3QmF0Y2hlcygpO1xuXG4gICAgICAgIC8vIHJlc2V0IGVsZW1lbnRzIGJ1ZmZlciBmb3IgdGhlIG5leHQgZmx1c2hcbiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3ZlcnRleENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5faW5kZXhDb3VudCA9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIG5ldyBzcHJpdGUgYmF0Y2guXG4gICAgICovXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0ICgpXG4gICAge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnN0YXRlLnNldCh0aGlzLnN0YXRlKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRlci5iaW5kKHRoaXMuX3NoYWRlcik7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLkNBTl9VUExPQURfU0FNRV9CVUZGRVIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGJpbmQgYnVmZmVyICMwLCB3ZSBkb24ndCBuZWVkIG90aGVyc1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5nZW9tZXRyeS5iaW5kKHRoaXMuX3BhY2tlZEdlb21ldHJpZXNbdGhpcy5fZmx1c2hJZF0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN0b3BzIGFuZCBmbHVzaGVzIHRoZSBjdXJyZW50IGJhdGNoLlxuICAgICAqL1xuICAgIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uIHN0b3AgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhpcyBgQWJzdHJhY3RCYXRjaFJlbmRlcmVyYC4gSXQgY2Fubm90IGJlIHVzZWQgYWdhaW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9wYWNrZWRHZW9tZXRyeVBvb2xTaXplOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWNrZWRHZW9tZXRyaWVzW2ldKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhY2tlZEdlb21ldHJpZXNbaV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5vZmYoJ3ByZXJlbmRlcicsIHRoaXMub25QcmVyZW5kZXIsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2FCdWZmZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5faUJ1ZmZlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYWNrZWRHZW9tZXRyaWVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXR0cmlidXRlQnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW5kZXhCdWZmZXIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl9zaGFkZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3NoYWRlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9zaGFkZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhbiBhdHRyaWJ1dGUgYnVmZmVyIGZyb20gYHRoaXMuX2FCdWZmZXJzYCB0aGF0XG4gICAgICogY2FuIGhvbGQgYXRsZWFzdCBgc2l6ZWAgZmxvYXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBtaW5pbXVtIGNhcGFjaXR5IHJlcXVpcmVkXG4gICAgICogQHJldHVybiB7Vmlld2FibGVCdWZmZXJ9IC0gYnVmZmVyIHRoYW4gY2FuIGhvbGQgYXRsZWFzdCBgc2l6ZWAgZmxvYXRzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBBYnN0cmFjdEJhdGNoUmVuZGVyZXIucHJvdG90eXBlLmdldEF0dHJpYnV0ZUJ1ZmZlciA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZUJ1ZmZlciAoc2l6ZSlcbiAgICB7XG4gICAgICAgIC8vIDggdmVydGljZXMgaXMgZW5vdWdoIGZvciAyIHF1YWRzXG4gICAgICAgIHZhciByb3VuZGVkUDIgPSBuZXh0UG93MihNYXRoLmNlaWwoc2l6ZSAvIDgpKTtcbiAgICAgICAgdmFyIHJvdW5kZWRTaXplSW5kZXggPSBsb2cyKHJvdW5kZWRQMik7XG4gICAgICAgIHZhciByb3VuZGVkU2l6ZSA9IHJvdW5kZWRQMiAqIDg7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FCdWZmZXJzLmxlbmd0aCA8PSByb3VuZGVkU2l6ZUluZGV4KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9pQnVmZmVycy5sZW5ndGggPSByb3VuZGVkU2l6ZUluZGV4ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9hQnVmZmVyc1tyb3VuZGVkU2l6ZV07XG5cbiAgICAgICAgaWYgKCFidWZmZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2FCdWZmZXJzW3JvdW5kZWRTaXplXSA9IGJ1ZmZlciA9IG5ldyBWaWV3YWJsZUJ1ZmZlcihyb3VuZGVkU2l6ZSAqIHRoaXMudmVydGV4U2l6ZSAqIDQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBhbiBpbmRleCBidWZmZXIgZnJvbSBgdGhpcy5faUJ1ZmZlcnNgIHRoYXQgY2FuXG4gICAgICogaGFzIGF0bGVhc3QgYHNpemVgIGNhcGFjaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBtaW5pbXVtIHJlcXVpcmVkIGNhcGFjaXR5XG4gICAgICogQHJldHVybiB7VWludDE2QXJyYXl9IC0gYnVmZmVyIHRoYXQgY2FuIGZpdCBgc2l6ZWBcbiAgICAgKiAgICBpbmRpY2VzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLnByb3RvdHlwZS5nZXRJbmRleEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEluZGV4QnVmZmVyIChzaXplKVxuICAgIHtcbiAgICAgICAgLy8gMTIgaW5kaWNlcyBpcyBlbm91Z2ggZm9yIDIgcXVhZHNcbiAgICAgICAgdmFyIHJvdW5kZWRQMiA9IG5leHRQb3cyKE1hdGguY2VpbChzaXplIC8gMTIpKTtcbiAgICAgICAgdmFyIHJvdW5kZWRTaXplSW5kZXggPSBsb2cyKHJvdW5kZWRQMik7XG4gICAgICAgIHZhciByb3VuZGVkU2l6ZSA9IHJvdW5kZWRQMiAqIDEyO1xuXG4gICAgICAgIGlmICh0aGlzLl9pQnVmZmVycy5sZW5ndGggPD0gcm91bmRlZFNpemVJbmRleClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5faUJ1ZmZlcnMubGVuZ3RoID0gcm91bmRlZFNpemVJbmRleCArIDE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5faUJ1ZmZlcnNbcm91bmRlZFNpemVJbmRleF07XG5cbiAgICAgICAgaWYgKCFidWZmZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2lCdWZmZXJzW3JvdW5kZWRTaXplSW5kZXhdID0gYnVmZmVyID0gbmV3IFVpbnQxNkFycmF5KHJvdW5kZWRTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIHRoZSBmb3VyIGJhdGNoaW5nIHBhcmFtZXRlcnMgb2YgYGVsZW1lbnRgLCBpbnRlcmxlYXZlc1xuICAgICAqIGFuZCBwdXNoZXMgdGhlbSBpbnRvIHRoZSBiYXRjaGluZyBhdHRyaWJ1dGUvaW5kZXggYnVmZmVycyBnaXZlbi5cbiAgICAgKlxuICAgICAqIEl0IHVzZXMgdGhlc2UgcHJvcGVydGllczogYHZlcnRleERhdGFgIGB1dnNgLCBgdGV4dHVyZUlkYCBhbmRcbiAgICAgKiBgaW5kaWNpZXNgLiBJdCBhbHNvIHVzZXMgdGhlIFwidGludFwiIG9mIHRoZSBiYXNlLXRleHR1cmUsIGlmXG4gICAgICogcHJlc2VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5TcHJpdGV9IGVsZW1lbnQgLSBlbGVtZW50IGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtQSVhJLlZpZXdhYmxlQnVmZmVyfSBhdHRyaWJ1dGVCdWZmZXIgLSBhdHRyaWJ1dGUgYnVmZmVyLlxuICAgICAqIEBwYXJhbSB7VWludDE2QXJyYXl9IGluZGV4QnVmZmVyIC0gaW5kZXggYnVmZmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFJbmRleCAtIG51bWJlciBvZiBmbG9hdHMgYWxyZWFkeSBpbiB0aGUgYXR0cmlidXRlIGJ1ZmZlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpSW5kZXggLSBudW1iZXIgb2YgaW5kaWNlcyBhbHJlYWR5IGluIGBpbmRleEJ1ZmZlcmBcbiAgICAgKi9cbiAgICBBYnN0cmFjdEJhdGNoUmVuZGVyZXIucHJvdG90eXBlLnBhY2tJbnRlcmxlYXZlZEdlb21ldHJ5ID0gZnVuY3Rpb24gcGFja0ludGVybGVhdmVkR2VvbWV0cnkgKGVsZW1lbnQsIGF0dHJpYnV0ZUJ1ZmZlciwgaW5kZXhCdWZmZXIsIGFJbmRleCwgaUluZGV4KVxuICAgIHtcbiAgICAgICAgdmFyIHVpbnQzMlZpZXcgPSBhdHRyaWJ1dGVCdWZmZXIudWludDMyVmlldztcbiAgICAgICAgdmFyIGZsb2F0MzJWaWV3ID0gYXR0cmlidXRlQnVmZmVyLmZsb2F0MzJWaWV3O1xuXG4gICAgICAgIHZhciBwYWNrZWRWZXJ0aWNlcyA9IGFJbmRleCAvIHRoaXMudmVydGV4U2l6ZTtcbiAgICAgICAgdmFyIHV2cyA9IGVsZW1lbnQudXZzO1xuICAgICAgICB2YXIgaW5kaWNpZXMgPSBlbGVtZW50LmluZGljZXM7XG4gICAgICAgIHZhciB2ZXJ0ZXhEYXRhID0gZWxlbWVudC52ZXJ0ZXhEYXRhO1xuICAgICAgICB2YXIgdGV4dHVyZUlkID0gZWxlbWVudC5fdGV4dHVyZS5iYXNlVGV4dHVyZS5fYmF0Y2hMb2NhdGlvbjtcblxuICAgICAgICB2YXIgYWxwaGEgPSBNYXRoLm1pbihlbGVtZW50LndvcmxkQWxwaGEsIDEuMCk7XG4gICAgICAgIHZhciBhcmdiID0gKGFscGhhIDwgMS4wXG4gICAgICAgICAgICAmJiBlbGVtZW50Ll90ZXh0dXJlLmJhc2VUZXh0dXJlLmFscGhhTW9kZSlcbiAgICAgICAgICAgID8gcHJlbXVsdGlwbHlUaW50KGVsZW1lbnQuX3RpbnRSR0IsIGFscGhhKVxuICAgICAgICAgICAgOiBlbGVtZW50Ll90aW50UkdCICsgKGFscGhhICogMjU1IDw8IDI0KTtcblxuICAgICAgICAvLyBsZXRzIG5vdCB3b3JyeSBhYm91dCB0aW50ISBmb3Igbm93Li5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhEYXRhLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICB7XG4gICAgICAgICAgICBmbG9hdDMyVmlld1thSW5kZXgrK10gPSB2ZXJ0ZXhEYXRhW2ldO1xuICAgICAgICAgICAgZmxvYXQzMlZpZXdbYUluZGV4KytdID0gdmVydGV4RGF0YVtpICsgMV07XG4gICAgICAgICAgICBmbG9hdDMyVmlld1thSW5kZXgrK10gPSB1dnNbaV07XG4gICAgICAgICAgICBmbG9hdDMyVmlld1thSW5kZXgrK10gPSB1dnNbaSArIDFdO1xuICAgICAgICAgICAgdWludDMyVmlld1thSW5kZXgrK10gPSBhcmdiO1xuICAgICAgICAgICAgZmxvYXQzMlZpZXdbYUluZGV4KytdID0gdGV4dHVyZUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgaW5kaWNpZXMubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXJbaUluZGV4KytdID0gcGFja2VkVmVydGljZXMgKyBpbmRpY2llc1tpJDFdO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBBYnN0cmFjdEJhdGNoUmVuZGVyZXI7XG59KE9iamVjdFJlbmRlcmVyKSk7XG5cbi8qKlxuICogUG9vbCBvZiBgQmF0Y2hEcmF3Q2FsbGAgb2JqZWN0cyB0aGF0IGBmbHVzaGAgdXNlZFxuICogdG8gY3JlYXRlIFwiYmF0Y2hlc1wiIG9mIHRoZSBvYmplY3RzIGJlaW5nIHJlbmRlcmVkLlxuICpcbiAqIFRoZXNlIGFyZSBuZXZlciByZS1hbGxvY2F0ZWQgYWdhaW4uXG4gKiBTaGFyZWQgYmV0d2VlbiBhbGwgYmF0Y2ggcmVuZGVyZXJzIGJlY2F1c2UgaXQgY2FuIGJlIG9ubHkgb25lIFwiZmx1c2hcIiB3b3JraW5nIGF0IHRoZSBtb21lbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlciB7UElYSS5CYXRjaERyYXdDYWxsW119XG4gKi9cbkFic3RyYWN0QmF0Y2hSZW5kZXJlci5fZHJhd0NhbGxQb29sID0gW107XG5cbi8qKlxuICogUG9vbCBvZiBgQmF0Y2hEcmF3Q2FsbGAgb2JqZWN0cyB0aGF0IGBmbHVzaGAgdXNlZFxuICogdG8gY3JlYXRlIFwiYmF0Y2hlc1wiIG9mIHRoZSBvYmplY3RzIGJlaW5nIHJlbmRlcmVkLlxuICpcbiAqIFRoZXNlIGFyZSBuZXZlciByZS1hbGxvY2F0ZWQgYWdhaW4uXG4gKiBTaGFyZWQgYmV0d2VlbiBhbGwgYmF0Y2ggcmVuZGVyZXJzIGJlY2F1c2UgaXQgY2FuIGJlIG9ubHkgb25lIFwiZmx1c2hcIiB3b3JraW5nIGF0IHRoZSBtb21lbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlciB7UElYSS5CYXRjaFRleHR1cmVBcnJheVtdfVxuICovXG5BYnN0cmFjdEJhdGNoUmVuZGVyZXIuX3RleHR1cmVBcnJheVBvb2wgPSBbXTtcblxuLyoqXG4gKiBIZWxwZXIgdGhhdCBnZW5lcmF0ZXMgYmF0Y2hpbmcgbXVsdGktdGV4dHVyZSBzaGFkZXIuIFVzZSBpdCB3aXRoIHlvdXIgbmV3IEJhdGNoUmVuZGVyZXJcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBCYXRjaFNoYWRlckdlbmVyYXRvciA9IGZ1bmN0aW9uIEJhdGNoU2hhZGVyR2VuZXJhdG9yKHZlcnRleFNyYywgZnJhZ1RlbXBsYXRlKVxue1xuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdmVydGV4IHNoYWRlciBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy52ZXJ0ZXhTcmMgPSB2ZXJ0ZXhTcmM7XG5cbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGZyYWdlbWVudCBzaGFkZXIgdGVtcGxhdGUuIE11c3QgY29udGFpbiBcIiVjb3VudCVcIiBhbmQgXCIlZm9ybG9vcCVcIi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmZyYWdUZW1wbGF0ZSA9IGZyYWdUZW1wbGF0ZTtcblxuICAgIHRoaXMucHJvZ3JhbUNhY2hlID0ge307XG4gICAgdGhpcy5kZWZhdWx0R3JvdXBDYWNoZSA9IHt9O1xuXG4gICAgaWYgKGZyYWdUZW1wbGF0ZS5pbmRleE9mKCclY291bnQlJykgPCAwKVxuICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGcmFnbWVudCB0ZW1wbGF0ZSBtdXN0IGNvbnRhaW4gXCIlY291bnQlXCIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGZyYWdUZW1wbGF0ZS5pbmRleE9mKCclZm9ybG9vcCUnKSA8IDApXG4gICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZyYWdtZW50IHRlbXBsYXRlIG11c3QgY29udGFpbiBcIiVmb3Jsb29wJVwiLicpO1xuICAgIH1cbn07XG5cbkJhdGNoU2hhZGVyR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVNoYWRlciA9IGZ1bmN0aW9uIGdlbmVyYXRlU2hhZGVyIChtYXhUZXh0dXJlcylcbntcbiAgICBpZiAoIXRoaXMucHJvZ3JhbUNhY2hlW21heFRleHR1cmVzXSlcbiAgICB7XG4gICAgICAgIHZhciBzYW1wbGVWYWx1ZXMgPSBuZXcgSW50MzJBcnJheShtYXhUZXh0dXJlcyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhUZXh0dXJlczsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBzYW1wbGVWYWx1ZXNbaV0gPSBpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0R3JvdXBDYWNoZVttYXhUZXh0dXJlc10gPSBVbmlmb3JtR3JvdXAuZnJvbSh7IHVTYW1wbGVyczogc2FtcGxlVmFsdWVzIH0sIHRydWUpO1xuXG4gICAgICAgIHZhciBmcmFnbWVudFNyYyA9IHRoaXMuZnJhZ1RlbXBsYXRlO1xuXG4gICAgICAgIGZyYWdtZW50U3JjID0gZnJhZ21lbnRTcmMucmVwbGFjZSgvJWNvdW50JS9naSwgKFwiXCIgKyBtYXhUZXh0dXJlcykpO1xuICAgICAgICBmcmFnbWVudFNyYyA9IGZyYWdtZW50U3JjLnJlcGxhY2UoLyVmb3Jsb29wJS9naSwgdGhpcy5nZW5lcmF0ZVNhbXBsZVNyYyhtYXhUZXh0dXJlcykpO1xuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNhY2hlW21heFRleHR1cmVzXSA9IG5ldyBQcm9ncmFtKHRoaXMudmVydGV4U3JjLCBmcmFnbWVudFNyYyk7XG4gICAgfVxuXG4gICAgdmFyIHVuaWZvcm1zID0ge1xuICAgICAgICB0aW50OiBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxLCAxXSksXG4gICAgICAgIHRyYW5zbGF0aW9uTWF0cml4OiBuZXcgTWF0cml4KCksXG4gICAgICAgIGRlZmF1bHQ6IHRoaXMuZGVmYXVsdEdyb3VwQ2FjaGVbbWF4VGV4dHVyZXNdLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFNoYWRlcih0aGlzLnByb2dyYW1DYWNoZVttYXhUZXh0dXJlc10sIHVuaWZvcm1zKTtcbn07XG5cbkJhdGNoU2hhZGVyR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVNhbXBsZVNyYyA9IGZ1bmN0aW9uIGdlbmVyYXRlU2FtcGxlU3JjIChtYXhUZXh0dXJlcylcbntcbiAgICB2YXIgc3JjID0gJyc7XG5cbiAgICBzcmMgKz0gJ1xcbic7XG4gICAgc3JjICs9ICdcXG4nO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhUZXh0dXJlczsgaSsrKVxuICAgIHtcbiAgICAgICAgaWYgKGkgPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBzcmMgKz0gJ1xcbmVsc2UgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpIDwgbWF4VGV4dHVyZXMgLSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICBzcmMgKz0gXCJpZih2VGV4dHVyZUlkIDwgXCIgKyBpICsgXCIuNSlcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNyYyArPSAnXFxueyc7XG4gICAgICAgIHNyYyArPSBcIlxcblxcdGNvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyc1tcIiArIGkgKyBcIl0sIHZUZXh0dXJlQ29vcmQpO1wiO1xuICAgICAgICBzcmMgKz0gJ1xcbn0nO1xuICAgIH1cblxuICAgIHNyYyArPSAnXFxuJztcbiAgICBzcmMgKz0gJ1xcbic7XG5cbiAgICByZXR1cm4gc3JjO1xufTtcblxuLyoqXG4gKiBHZW9tZXRyeSB1c2VkIHRvIGJhdGNoIHN0YW5kYXJkIFBJWEkgY29udGVudCAoZS5nLiBNZXNoLCBTcHJpdGUsIEdyYXBoaWNzIG9iamVjdHMpLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEJhdGNoR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChHZW9tZXRyeSkge1xuICAgIGZ1bmN0aW9uIEJhdGNoR2VvbWV0cnkoX3N0YXRpYylcbiAgICB7XG4gICAgICAgIGlmICggX3N0YXRpYyA9PT0gdm9pZCAwICkgX3N0YXRpYyA9IGZhbHNlO1xuXG4gICAgICAgIEdlb21ldHJ5LmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ1ZmZlciB1c2VkIGZvciBwb3NpdGlvbiwgY29sb3IsIHRleHR1cmUgSURzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuQnVmZmVyfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9idWZmZXIgPSBuZXcgQnVmZmVyKG51bGwsIF9zdGF0aWMsIGZhbHNlKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5kZXggYnVmZmVyIGRhdGFcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5CdWZmZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2luZGV4QnVmZmVyID0gbmV3IEJ1ZmZlcihudWxsLCBfc3RhdGljLCB0cnVlKTtcblxuICAgICAgICB0aGlzLmFkZEF0dHJpYnV0ZSgnYVZlcnRleFBvc2l0aW9uJywgdGhpcy5fYnVmZmVyLCAyLCBmYWxzZSwgVFlQRVMuRkxPQVQpXG4gICAgICAgICAgICAuYWRkQXR0cmlidXRlKCdhVGV4dHVyZUNvb3JkJywgdGhpcy5fYnVmZmVyLCAyLCBmYWxzZSwgVFlQRVMuRkxPQVQpXG4gICAgICAgICAgICAuYWRkQXR0cmlidXRlKCdhQ29sb3InLCB0aGlzLl9idWZmZXIsIDQsIHRydWUsIFRZUEVTLlVOU0lHTkVEX0JZVEUpXG4gICAgICAgICAgICAuYWRkQXR0cmlidXRlKCdhVGV4dHVyZUlkJywgdGhpcy5fYnVmZmVyLCAxLCB0cnVlLCBUWVBFUy5GTE9BVClcbiAgICAgICAgICAgIC5hZGRJbmRleCh0aGlzLl9pbmRleEJ1ZmZlcik7XG4gICAgfVxuXG4gICAgaWYgKCBHZW9tZXRyeSApIEJhdGNoR2VvbWV0cnkuX19wcm90b19fID0gR2VvbWV0cnk7XG4gICAgQmF0Y2hHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeSAmJiBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbiAgICBCYXRjaEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJhdGNoR2VvbWV0cnk7XG5cbiAgICByZXR1cm4gQmF0Y2hHZW9tZXRyeTtcbn0oR2VvbWV0cnkpKTtcblxudmFyIGRlZmF1bHRWZXJ0ZXgkMiA9IFwicHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbmF0dHJpYnV0ZSB2ZWMyIGFWZXJ0ZXhQb3NpdGlvbjtcXG5hdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1xcbmF0dHJpYnV0ZSB2ZWM0IGFDb2xvcjtcXG5hdHRyaWJ1dGUgZmxvYXQgYVRleHR1cmVJZDtcXG5cXG51bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDMgdHJhbnNsYXRpb25NYXRyaXg7XFxudW5pZm9ybSB2ZWM0IHRpbnQ7XFxuXFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxudmFyeWluZyB2ZWM0IHZDb2xvcjtcXG52YXJ5aW5nIGZsb2F0IHZUZXh0dXJlSWQ7XFxuXFxudm9pZCBtYWluKHZvaWQpe1xcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoKHByb2plY3Rpb25NYXRyaXggKiB0cmFuc2xhdGlvbk1hdHJpeCAqIHZlYzMoYVZlcnRleFBvc2l0aW9uLCAxLjApKS54eSwgMC4wLCAxLjApO1xcblxcbiAgICB2VGV4dHVyZUNvb3JkID0gYVRleHR1cmVDb29yZDtcXG4gICAgdlRleHR1cmVJZCA9IGFUZXh0dXJlSWQ7XFxuICAgIHZDb2xvciA9IGFDb2xvciAqIHRpbnQ7XFxufVxcblwiO1xuXG52YXIgZGVmYXVsdEZyYWdtZW50JDIgPSBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcbnZhcnlpbmcgdmVjNCB2Q29sb3I7XFxudmFyeWluZyBmbG9hdCB2VGV4dHVyZUlkO1xcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyc1slY291bnQlXTtcXG5cXG52b2lkIG1haW4odm9pZCl7XFxuICAgIHZlYzQgY29sb3I7XFxuICAgICVmb3Jsb29wJVxcbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvciAqIHZDb2xvcjtcXG59XFxuXCI7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG52YXIgQmF0Y2hQbHVnaW5GYWN0b3J5ID0gZnVuY3Rpb24gQmF0Y2hQbHVnaW5GYWN0b3J5ICgpIHt9O1xuXG52YXIgc3RhdGljQWNjZXNzb3JzJDEgPSB7IGRlZmF1bHRWZXJ0ZXhTcmM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVmYXVsdEZyYWdtZW50VGVtcGxhdGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuQmF0Y2hQbHVnaW5GYWN0b3J5LmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZSAob3B0aW9ucylcbntcbiAgICB2YXIgcmVmID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHZlcnRleDogZGVmYXVsdFZlcnRleCQyLFxuICAgICAgICBmcmFnbWVudDogZGVmYXVsdEZyYWdtZW50JDIsXG4gICAgICAgIGdlb21ldHJ5Q2xhc3M6IEJhdGNoR2VvbWV0cnksXG4gICAgICAgIHZlcnRleFNpemU6IDYsXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIHZhciB2ZXJ0ZXggPSByZWYudmVydGV4O1xuICAgICAgICB2YXIgZnJhZ21lbnQgPSByZWYuZnJhZ21lbnQ7XG4gICAgICAgIHZhciB2ZXJ0ZXhTaXplID0gcmVmLnZlcnRleFNpemU7XG4gICAgICAgIHZhciBnZW9tZXRyeUNsYXNzID0gcmVmLmdlb21ldHJ5Q2xhc3M7XG5cbiAgICByZXR1cm4gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQWJzdHJhY3RCYXRjaFJlbmRlcmVyKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBCYXRjaFBsdWdpbihyZW5kZXJlcilcbiAgICAgICAge1xuICAgICAgICAgICAgQWJzdHJhY3RCYXRjaFJlbmRlcmVyLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuXG4gICAgICAgICAgICB0aGlzLnNoYWRlckdlbmVyYXRvciA9IG5ldyBCYXRjaFNoYWRlckdlbmVyYXRvcih2ZXJ0ZXgsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlDbGFzcyA9IGdlb21ldHJ5Q2xhc3M7XG4gICAgICAgICAgICB0aGlzLnZlcnRleFNpemUgPSB2ZXJ0ZXhTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICggQWJzdHJhY3RCYXRjaFJlbmRlcmVyICkgQmF0Y2hQbHVnaW4uX19wcm90b19fID0gQWJzdHJhY3RCYXRjaFJlbmRlcmVyO1xuICAgICAgICAgICAgQmF0Y2hQbHVnaW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQWJzdHJhY3RCYXRjaFJlbmRlcmVyICYmIEFic3RyYWN0QmF0Y2hSZW5kZXJlci5wcm90b3R5cGUgKTtcbiAgICAgICAgICAgIEJhdGNoUGx1Z2luLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJhdGNoUGx1Z2luO1xuXG4gICAgICAgICAgICByZXR1cm4gQmF0Y2hQbHVnaW47XG4gICAgICAgIH0oQWJzdHJhY3RCYXRjaFJlbmRlcmVyKSk7XG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHZlcnRleCBzaGFkZXIgc291cmNlXG4gKlxuICogQHN0YXRpY1xuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdGFudFxuICovXG5zdGF0aWNBY2Nlc3NvcnMkMS5kZWZhdWx0VmVydGV4U3JjLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIGRlZmF1bHRWZXJ0ZXgkMjtcbn07XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZVxuICpcbiAqIEBzdGF0aWNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAY29uc3RhbnRcbiAqL1xuc3RhdGljQWNjZXNzb3JzJDEuZGVmYXVsdEZyYWdtZW50VGVtcGxhdGUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gZGVmYXVsdEZyYWdtZW50JDI7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQmF0Y2hQbHVnaW5GYWN0b3J5LCBzdGF0aWNBY2Nlc3NvcnMkMSApO1xuXG4vLyBTZXR1cCB0aGUgZGVmYXVsdCBCYXRjaFJlbmRlcmVyIHBsdWdpbiwgdGhpcyBpcyB3aGF0XG4vLyB3ZSdsbCBhY3R1YWxseSBleHBvcnQgYXQgdGhlIHJvb3QgbGV2ZWxcbnZhciBCYXRjaFJlbmRlcmVyID0gQmF0Y2hQbHVnaW5GYWN0b3J5LmNyZWF0ZSgpO1xuXG5leHBvcnQgeyBBYnN0cmFjdEJhdGNoUmVuZGVyZXIsIEFic3RyYWN0UmVuZGVyZXIsIEF0dHJpYnV0ZSwgQmFzZVJlbmRlclRleHR1cmUsIEJhc2VUZXh0dXJlLCBCYXRjaERyYXdDYWxsLCBCYXRjaEdlb21ldHJ5LCBCYXRjaFBsdWdpbkZhY3RvcnksIEJhdGNoUmVuZGVyZXIsIEJhdGNoU2hhZGVyR2VuZXJhdG9yLCBCYXRjaFRleHR1cmVBcnJheSwgQnVmZmVyLCBDdWJlVGV4dHVyZSwgRmlsdGVyLCBGcmFtZWJ1ZmZlciwgR0xQcm9ncmFtLCBHTFRleHR1cmUsIEdlb21ldHJ5LCBNYXNrRGF0YSwgT2JqZWN0UmVuZGVyZXIsIFByb2dyYW0sIFF1YWQsIFF1YWRVdiwgUmVuZGVyVGV4dHVyZSwgUmVuZGVyVGV4dHVyZVBvb2wsIFJlbmRlcmVyLCBTaGFkZXIsIFNwcml0ZU1hc2tGaWx0ZXIsIFN0YXRlLCBTeXN0ZW0sIFRleHR1cmUsIFRleHR1cmVNYXRyaXgsIFRleHR1cmVVdnMsIFVuaWZvcm1Hcm91cCwgVmlld2FibGVCdWZmZXIsIGF1dG9EZXRlY3RSZW5kZXJlciwgY2hlY2tNYXhJZlN0YXRlbWVudHNJblNoYWRlciwgZGVmYXVsdEZpbHRlciBhcyBkZWZhdWx0RmlsdGVyVmVydGV4LCBfZGVmYXVsdCBhcyBkZWZhdWx0VmVydGV4LCBpbmRleCBhcyByZXNvdXJjZXMsIHN5c3RlbXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL2FwcCAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9hcHAgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tICdAcGl4aS9kaXNwbGF5JztcbmltcG9ydCB7IGF1dG9EZXRlY3RSZW5kZXJlciB9IGZyb20gJ0BwaXhpL2NvcmUnO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGNsYXNzIHRvIGNyZWF0ZSBhIG5ldyBQSVhJIGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgYXV0b21hdGljYWxseSBjcmVhdGVzIHRoZSByZW5kZXJlciwgdGlja2VyIGFuZCByb290IGNvbnRhaW5lci5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIHRoZSBhcHBsaWNhdGlvblxuICogY29uc3QgYXBwID0gbmV3IFBJWEkuQXBwbGljYXRpb24oKTtcbiAqXG4gKiAvLyBBZGQgdGhlIHZpZXcgdG8gdGhlIERPTVxuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHAudmlldyk7XG4gKlxuICogLy8gZXgsIGFkZCBkaXNwbGF5IG9iamVjdHNcbiAqIGFwcC5zdGFnZS5hZGRDaGlsZChQSVhJLlNwcml0ZS5mcm9tKCdzb21ldGhpbmcucG5nJykpO1xuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEFwcGxpY2F0aW9uID0gZnVuY3Rpb24gQXBwbGljYXRpb24ob3B0aW9ucylcbntcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIC8vIFRoZSBkZWZhdWx0IG9wdGlvbnNcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIGZvcmNlQ2FudmFzOiBmYWxzZSxcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIFdlYkdMIHJlbmRlcmVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIENhbnZhc1JlbmRlcmVyLlxuICAgICAqIEBtZW1iZXIge1BJWEkuUmVuZGVyZXJ8UElYSS5DYW52YXNSZW5kZXJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyID0gYXV0b0RldGVjdFJlbmRlcmVyKG9wdGlvbnMpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvb3QgZGlzcGxheSBjb250YWluZXIgdGhhdCdzIHJlbmRlcmVkLlxuICAgICAqIEBtZW1iZXIge1BJWEkuQ29udGFpbmVyfVxuICAgICAqL1xuICAgIHRoaXMuc3RhZ2UgPSBuZXcgQ29udGFpbmVyKCk7XG5cbiAgICAvLyBpbnN0YWxsIHBsdWdpbnMgaGVyZVxuICAgIEFwcGxpY2F0aW9uLl9wbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgICBwbHVnaW4uaW5pdC5jYWxsKHRoaXMkMSwgb3B0aW9ucyk7XG4gICAgfSk7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyB2aWV3OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHNjcmVlbjogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbWlkZGxld2FyZSBwbHVnaW4gZm9yIHRoZSBhcHBsaWNhdGlvblxuICogQHN0YXRpY1xuICogQHBhcmFtIHtQSVhJLkFwcGxpY2F0aW9uLlBsdWdpbn0gcGx1Z2luIC0gUGx1Z2luIGJlaW5nIGluc3RhbGxlZFxuICovXG5BcHBsaWNhdGlvbi5yZWdpc3RlclBsdWdpbiA9IGZ1bmN0aW9uIHJlZ2lzdGVyUGx1Z2luIChwbHVnaW4pXG57XG4gICAgQXBwbGljYXRpb24uX3BsdWdpbnMucHVzaChwbHVnaW4pO1xufTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIGN1cnJlbnQgc3RhZ2UuXG4gKi9cbkFwcGxpY2F0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIgKClcbntcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnN0YWdlKTtcbn07XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlcidzIGNhbnZhcyBlbGVtZW50LlxuICogQG1lbWJlciB7SFRNTENhbnZhc0VsZW1lbnR9XG4gKiBAcmVhZG9ubHlcbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLnZpZXcuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci52aWV3O1xufTtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyJ3Mgc2NyZWVuIHJlY3RhbmdsZS4gSXRzIHNhZmUgdG8gdXNlIGFzIGBmaWx0ZXJBcmVhYCBvciBgaGl0QXJlYWAgZm9yIHRoZSB3aG9sZSBzY3JlZW4uXG4gKiBAbWVtYmVyIHtQSVhJLlJlY3RhbmdsZX1cbiAqIEByZWFkb25seVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuc2NyZWVuLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuc2NyZWVuO1xufTtcblxuLyoqXG4gKiBEZXN0cm95IGFuZCBkb24ndCB1c2UgYWZ0ZXIgdGhpcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbW92ZVZpZXc9ZmFsc2VdIEF1dG9tYXRpY2FsbHkgcmVtb3ZlIGNhbnZhcyBmcm9tIERPTS5cbiAqIEBwYXJhbSB7b2JqZWN0fGJvb2xlYW59IFtzdGFnZU9wdGlvbnNdIC0gT3B0aW9ucyBwYXJhbWV0ZXIuIEEgYm9vbGVhbiB3aWxsIGFjdCBhcyBpZiBhbGwgb3B0aW9uc1xuICogIGhhdmUgYmVlbiBzZXQgdG8gdGhhdCB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFufSBbc3RhZ2VPcHRpb25zLmNoaWxkcmVuPWZhbHNlXSAtIGlmIHNldCB0byB0cnVlLCBhbGwgdGhlIGNoaWxkcmVuIHdpbGwgaGF2ZSB0aGVpciBkZXN0cm95XG4gKiAgbWV0aG9kIGNhbGxlZCBhcyB3ZWxsLiAnc3RhZ2VPcHRpb25zJyB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aG9zZSBjYWxscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0YWdlT3B0aW9ucy50ZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBzdGFnZU9wdGlvbnMuY2hpbGRyZW4gaXMgc2V0XG4gKiAgdG8gdHJ1ZS4gU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIHRleHR1cmUgb2YgdGhlIGNoaWxkIHNwcml0ZVxuICogQHBhcmFtIHtib29sZWFufSBbc3RhZ2VPcHRpb25zLmJhc2VUZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBzdGFnZU9wdGlvbnMuY2hpbGRyZW4gaXMgc2V0XG4gKiAgdG8gdHJ1ZS4gU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIGJhc2UgdGV4dHVyZSBvZiB0aGUgY2hpbGQgc3ByaXRlXG4gKi9cbkFwcGxpY2F0aW9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAocmVtb3ZlVmlldywgc3RhZ2VPcHRpb25zKVxue1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIC8vIERlc3Ryb3kgcGx1Z2lucyBpbiB0aGUgb3Bwb3NpdGUgb3JkZXJcbiAgICAvLyB3aGljaCB0aGV5IHdlcmUgY29uc3RydWN0ZWRcbiAgICB2YXIgcGx1Z2lucyA9IEFwcGxpY2F0aW9uLl9wbHVnaW5zLnNsaWNlKDApO1xuXG4gICAgcGx1Z2lucy5yZXZlcnNlKCk7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcGx1Z2luLmRlc3Ryb3kuY2FsbCh0aGlzJDEpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdGFnZS5kZXN0cm95KHN0YWdlT3B0aW9ucyk7XG4gICAgdGhpcy5zdGFnZSA9IG51bGw7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmRlc3Ryb3kocmVtb3ZlVmlldyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IG51bGw7XG5cbiAgICB0aGlzLl9vcHRpb25zID0gbnVsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBBcHBsaWNhdGlvbi5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4vKipcbiAqIEBtZW1iZXJvZiBQSVhJLkFwcGxpY2F0aW9uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbHVnaW5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGluaXQgLSBDYWxsZWQgd2hlbiBBcHBsaWNhdGlvbiBpcyBjb25zdHJ1Y3RlZCwgc2NvcGVkIHRvIEFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogIFBhc3NlcyBpbiBgb3B0aW9uc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQsIHdoaWNoIGFyZSBBcHBsaWNhdGlvbiBjb25zdHJ1Y3RvciBvcHRpb25zLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZGVzdHJveSAtIENhbGxlZCB3aGVuIGRlc3Ryb3lpbmcgQXBwbGljYXRpb24sIHNjb3BlZCB0byBBcHBsaWNhdGlvbiBpbnN0YW5jZVxuICovXG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBpbnN0YWxsZWQgcGx1Z2lucy5cbiAqIEBzdGF0aWNcbiAqIEBwcml2YXRlXG4gKiBAdHlwZSB7UElYSS5BcHBsaWNhdGlvbi5QbHVnaW5bXX1cbiAqL1xuQXBwbGljYXRpb24uX3BsdWdpbnMgPSBbXTtcblxuLyoqXG4gKiBNaWRkbGV3YXJlIGZvciBmb3IgQXBwbGljYXRpb24ncyByZXNpemUgZnVuY3Rpb25hbGl0eVxuICogQHByaXZhdGVcbiAqIEBjbGFzc1xuICovXG52YXIgUmVzaXplUGx1Z2luID0gZnVuY3Rpb24gUmVzaXplUGx1Z2luICgpIHt9O1xuXG5SZXNpemVQbHVnaW4uaW5pdCA9IGZ1bmN0aW9uIGluaXQgKG9wdGlvbnMpXG57XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQgb3Igd2luZG93IHRvIHJlc2l6ZSB0aGUgYXBwbGljYXRpb24gdG8uXG4gICAgICogQHR5cGUge1dpbmRvd3xIVE1MRWxlbWVudH1cbiAgICAgKiBAbmFtZSByZXNpemVUb1xuICAgICAqIEBtZW1iZXJvZiBQSVhJLkFwcGxpY2F0aW9uI1xuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmVzaXplVG8nLFxuICAgICAgICB7XG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChkb20pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVUbyA9IGRvbTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXNpemVUbztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSWYgYHJlc2l6ZVRvYCBpcyBzZXQsIGNhbGxpbmcgdGhpcyBmdW5jdGlvblxuICAgICAqIHdpbGwgcmVzaXplIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoYXQgZWxlbWVudC5cbiAgICAgKiBAbWV0aG9kIFBJWEkuQXBwbGljYXRpb24jcmVzaXplXG4gICAgICovXG4gICAgdGhpcy5yZXNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzJDEuX3Jlc2l6ZVRvKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBSZXNpemUgdG8gdGhlIHdpbmRvd1xuICAgICAgICAgICAgaWYgKHRoaXMkMS5fcmVzaXplVG8gPT09IHdpbmRvdylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzJDEucmVuZGVyZXIucmVzaXplKFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlc2l6ZSB0byBvdGhlciBIVE1MIGVudGl0aWVzXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcyQxLnJlbmRlcmVyLnJlc2l6ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLl9yZXNpemVUby5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLl9yZXNpemVUby5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIE9uIHJlc2l6ZVxuICAgIHRoaXMuX3Jlc2l6ZVRvID0gbnVsbDtcbiAgICB0aGlzLnJlc2l6ZVRvID0gb3B0aW9ucy5yZXNpemVUbyB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBDbGVhbiB1cCB0aGUgdGlja2VyLCBzY29wZWQgdG8gYXBwbGljYXRpb25cbiAqIEBzdGF0aWNcbiAqIEBwcml2YXRlXG4gKi9cblJlc2l6ZVBsdWdpbi5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxue1xuICAgIHRoaXMucmVzaXplVG8gPSBudWxsO1xuICAgIHRoaXMucmVzaXplID0gbnVsbDtcbn07XG5cbkFwcGxpY2F0aW9uLnJlZ2lzdGVyUGx1Z2luKFJlc2l6ZVBsdWdpbik7XG5cbmV4cG9ydCB7IEFwcGxpY2F0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL2V4dHJhY3QgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvZXh0cmFjdCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFJlbmRlclRleHR1cmUgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IENhbnZhc1JlbmRlclRhcmdldCB9IGZyb20gJ0BwaXhpL3V0aWxzJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJ0BwaXhpL21hdGgnO1xuXG52YXIgVEVNUF9SRUNUID0gbmV3IFJlY3RhbmdsZSgpO1xudmFyIEJZVEVTX1BFUl9QSVhFTCA9IDQ7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyByZW5kZXJlci1zcGVjaWZpYyBwbHVnaW5zIGZvciBleHBvcnRpbmcgY29udGVudCBmcm9tIGEgcmVuZGVyZXIuXG4gKiBGb3IgaW5zdGFuY2UsIHRoZXNlIHBsdWdpbnMgY2FuIGJlIHVzZWQgZm9yIHNhdmluZyBhbiBJbWFnZSwgQ2FudmFzIGVsZW1lbnQgb3IgZm9yIGV4cG9ydGluZyB0aGUgcmF3IGltYWdlIGRhdGEgKHBpeGVscykuXG4gKlxuICogRG8gbm90IGluc3RhbnRpYXRlIHRoZXNlIHBsdWdpbnMgZGlyZWN0bHkuIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBgcmVuZGVyZXIucGx1Z2luc2AgcHJvcGVydHkuXG4gKiBTZWUge0BsaW5rIFBJWEkuQ2FudmFzUmVuZGVyZXIjcGx1Z2luc30gb3Ige0BsaW5rIFBJWEkuUmVuZGVyZXIjcGx1Z2luc30uXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IGFwcCAod2lsbCBhdXRvLWFkZCBleHRyYWN0IHBsdWdpbiB0byByZW5kZXJlcilcbiAqIGNvbnN0IGFwcCA9IG5ldyBQSVhJLkFwcGxpY2F0aW9uKCk7XG4gKlxuICogLy8gRHJhdyBhIHJlZCBjaXJjbGVcbiAqIGNvbnN0IGdyYXBoaWNzID0gbmV3IFBJWEkuR3JhcGhpY3MoKVxuICogICAgIC5iZWdpbkZpbGwoMHhGRjAwMDApXG4gKiAgICAgLmRyYXdDaXJjbGUoMCwgMCwgNTApO1xuICpcbiAqIC8vIFJlbmRlciB0aGUgZ3JhcGhpY3MgYXMgYW4gSFRNTEltYWdlRWxlbWVudFxuICogY29uc3QgaW1hZ2UgPSBhcHAucmVuZGVyZXIucGx1Z2lucy5leHRyYWN0LmltYWdlKGdyYXBoaWNzKTtcbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1hZ2UpO1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgRXh0cmFjdCA9IGZ1bmN0aW9uIEV4dHJhY3QocmVuZGVyZXIpXG57XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyBmb3IgZXh0cmFjdGluZyBkYXRhIChpbWFnZSwgcGl4ZWxzLCBldGMuKSBmcm9tIGEgZGlzcGxheSBvYmplY3Qgb3IgcmVuZGVyIHRleHR1cmVcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuRXh0cmFjdH0gZXh0cmFjdFxuICAgICAqIEBtZW1iZXJvZiBQSVhJLlJlbmRlcmVyI1xuICAgICAqIEBzZWUgUElYSS5FeHRyYWN0XG4gICAgICovXG4gICAgcmVuZGVyZXIuZXh0cmFjdCA9IHRoaXM7XG59O1xuXG4vKipcbiAqIFdpbGwgcmV0dXJuIGEgSFRNTCBJbWFnZSBvZiB0aGUgdGFyZ2V0XG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R8UElYSS5SZW5kZXJUZXh0dXJlfSB0YXJnZXQgLSBBIGRpc3BsYXlPYmplY3Qgb3IgcmVuZGVyVGV4dHVyZVxuICogIHRvIGNvbnZlcnQuIElmIGxlZnQgZW1wdHkgd2lsbCB1c2UgdGhlIG1haW4gcmVuZGVyZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZm9ybWF0XSAtIEltYWdlIGZvcm1hdCwgZS5nLiBcImltYWdlL2pwZWdcIiBvciBcImltYWdlL3dlYnBcIi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcXVhbGl0eV0gLSBKUEVHIG9yIFdlYnAgY29tcHJlc3Npb24gZnJvbSAwIHRvIDEuIERlZmF1bHQgaXMgMC45Mi5cbiAqIEByZXR1cm4ge0hUTUxJbWFnZUVsZW1lbnR9IEhUTUwgSW1hZ2Ugb2YgdGhlIHRhcmdldFxuICovXG5FeHRyYWN0LnByb3RvdHlwZS5pbWFnZSA9IGZ1bmN0aW9uIGltYWdlICh0YXJnZXQsIGZvcm1hdCwgcXVhbGl0eSlcbntcbiAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGltYWdlLnNyYyA9IHRoaXMuYmFzZTY0KHRhcmdldCwgZm9ybWF0LCBxdWFsaXR5KTtcblxuICAgIHJldHVybiBpbWFnZTtcbn07XG5cbi8qKlxuICogV2lsbCByZXR1cm4gYSBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvZiB0aGlzIHRhcmdldC4gSXQgd29ya3MgYnkgY2FsbGluZ1xuICogIGBFeHRyYWN0LmdldENhbnZhc2AgYW5kIHRoZW4gcnVubmluZyB0b0RhdGFVUkwgb24gdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdHxQSVhJLlJlbmRlclRleHR1cmV9IHRhcmdldCAtIEEgZGlzcGxheU9iamVjdCBvciByZW5kZXJUZXh0dXJlXG4gKiAgdG8gY29udmVydC4gSWYgbGVmdCBlbXB0eSB3aWxsIHVzZSB0aGUgbWFpbiByZW5kZXJlclxuICogQHBhcmFtIHtzdHJpbmd9IFtmb3JtYXRdIC0gSW1hZ2UgZm9ybWF0LCBlLmcuIFwiaW1hZ2UvanBlZ1wiIG9yIFwiaW1hZ2Uvd2VicFwiLlxuICogQHBhcmFtIHtudW1iZXJ9IFtxdWFsaXR5XSAtIEpQRUcgb3IgV2VicCBjb21wcmVzc2lvbiBmcm9tIDAgdG8gMS4gRGVmYXVsdCBpcyAwLjkyLlxuICogQHJldHVybiB7c3RyaW5nfSBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvZiB0aGUgdGV4dHVyZS5cbiAqL1xuRXh0cmFjdC5wcm90b3R5cGUuYmFzZTY0ID0gZnVuY3Rpb24gYmFzZTY0ICh0YXJnZXQsIGZvcm1hdCwgcXVhbGl0eSlcbntcbiAgICByZXR1cm4gdGhpcy5jYW52YXModGFyZ2V0KS50b0RhdGFVUkwoZm9ybWF0LCBxdWFsaXR5KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENhbnZhcyBlbGVtZW50LCByZW5kZXJzIHRoaXMgdGFyZ2V0IHRvIGl0IGFuZCB0aGVuIHJldHVybnMgaXQuXG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R8UElYSS5SZW5kZXJUZXh0dXJlfSB0YXJnZXQgLSBBIGRpc3BsYXlPYmplY3Qgb3IgcmVuZGVyVGV4dHVyZVxuICogIHRvIGNvbnZlcnQuIElmIGxlZnQgZW1wdHkgd2lsbCB1c2UgdGhlIG1haW4gcmVuZGVyZXJcbiAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fSBBIENhbnZhcyBlbGVtZW50IHdpdGggdGhlIHRleHR1cmUgcmVuZGVyZWQgb24uXG4gKi9cbkV4dHJhY3QucHJvdG90eXBlLmNhbnZhcyA9IGZ1bmN0aW9uIGNhbnZhcyAodGFyZ2V0KVxue1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgdmFyIHJlc29sdXRpb247XG4gICAgdmFyIGZyYW1lO1xuICAgIHZhciBmbGlwWSA9IGZhbHNlO1xuICAgIHZhciByZW5kZXJUZXh0dXJlO1xuICAgIHZhciBnZW5lcmF0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0YXJnZXQpXG4gICAge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUmVuZGVyVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVuZGVyVGV4dHVyZSA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlclRleHR1cmUgPSB0aGlzLnJlbmRlcmVyLmdlbmVyYXRlVGV4dHVyZSh0YXJnZXQpO1xuICAgICAgICAgICAgZ2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXJUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgcmVzb2x1dGlvbiA9IHJlbmRlclRleHR1cmUuYmFzZVRleHR1cmUucmVzb2x1dGlvbjtcbiAgICAgICAgZnJhbWUgPSByZW5kZXJUZXh0dXJlLmZyYW1lO1xuICAgICAgICBmbGlwWSA9IGZhbHNlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXJUZXh0dXJlLmJpbmQocmVuZGVyVGV4dHVyZSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHJlc29sdXRpb24gPSB0aGlzLnJlbmRlcmVyLnJlc29sdXRpb247XG5cbiAgICAgICAgZmxpcFkgPSB0cnVlO1xuXG4gICAgICAgIGZyYW1lID0gVEVNUF9SRUNUO1xuICAgICAgICBmcmFtZS53aWR0aCA9IHRoaXMucmVuZGVyZXIud2lkdGg7XG4gICAgICAgIGZyYW1lLmhlaWdodCA9IHRoaXMucmVuZGVyZXIuaGVpZ2h0O1xuXG4gICAgICAgIHJlbmRlcmVyLnJlbmRlclRleHR1cmUuYmluZChudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSBNYXRoLmZsb29yKChmcmFtZS53aWR0aCAqIHJlc29sdXRpb24pICsgMWUtNCk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGguZmxvb3IoKGZyYW1lLmhlaWdodCAqIHJlc29sdXRpb24pICsgMWUtNCk7XG5cbiAgICB2YXIgY2FudmFzQnVmZmVyID0gbmV3IENhbnZhc1JlbmRlclRhcmdldCh3aWR0aCwgaGVpZ2h0LCAxKTtcblxuICAgIHZhciB3ZWJnbFBpeGVscyA9IG5ldyBVaW50OEFycmF5KEJZVEVTX1BFUl9QSVhFTCAqIHdpZHRoICogaGVpZ2h0KTtcblxuICAgIC8vIHJlYWQgcGl4ZWxzIHRvIHRoZSBhcnJheVxuICAgIHZhciBnbCA9IHJlbmRlcmVyLmdsO1xuXG4gICAgZ2wucmVhZFBpeGVscyhcbiAgICAgICAgZnJhbWUueCAqIHJlc29sdXRpb24sXG4gICAgICAgIGZyYW1lLnkgKiByZXNvbHV0aW9uLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBnbC5SR0JBLFxuICAgICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICB3ZWJnbFBpeGVsc1xuICAgICk7XG5cbiAgICAvLyBhZGQgdGhlIHBpeGVscyB0byB0aGUgY2FudmFzXG4gICAgdmFyIGNhbnZhc0RhdGEgPSBjYW52YXNCdWZmZXIuY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBFeHRyYWN0LmFycmF5UG9zdERpdmlkZSh3ZWJnbFBpeGVscywgY2FudmFzRGF0YS5kYXRhKTtcblxuICAgIGNhbnZhc0J1ZmZlci5jb250ZXh0LnB1dEltYWdlRGF0YShjYW52YXNEYXRhLCAwLCAwKTtcblxuICAgIC8vIHB1bGxpbmcgcGl4ZWxzXG4gICAgaWYgKGZsaXBZKVxuICAgIHtcbiAgICAgICAgdmFyIHRhcmdldCQxID0gbmV3IENhbnZhc1JlbmRlclRhcmdldChjYW52YXNCdWZmZXIud2lkdGgsIGNhbnZhc0J1ZmZlci5oZWlnaHQsIDEpO1xuXG4gICAgICAgIHRhcmdldCQxLmNvbnRleHQuc2NhbGUoMSwgLTEpO1xuXG4gICAgICAgIC8vIHdlIGNhbid0IHJlbmRlciB0byBpdHNlbGYgYmVjYXVzZSB3ZSBzaG91bGQgYmUgZW1wdHkgYmVmb3JlIHJlbmRlci5cbiAgICAgICAgdGFyZ2V0JDEuY29udGV4dC5kcmF3SW1hZ2UoY2FudmFzQnVmZmVyLmNhbnZhcywgMCwgLWhlaWdodCk7XG5cbiAgICAgICAgY2FudmFzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgY2FudmFzQnVmZmVyID0gdGFyZ2V0JDE7XG4gICAgfVxuXG4gICAgaWYgKGdlbmVyYXRlZClcbiAgICB7XG4gICAgICAgIHJlbmRlclRleHR1cmUuZGVzdHJveSh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBzZW5kIHRoZSBjYW52YXMgYmFjay4uXG4gICAgcmV0dXJuIGNhbnZhc0J1ZmZlci5jYW52YXM7XG59O1xuXG4vKipcbiAqIFdpbGwgcmV0dXJuIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBpeGVsIGRhdGEgb2YgdGhlIGVudGlyZSB0ZXh0dXJlIGluIFJHQkFcbiAqIG9yZGVyLCB3aXRoIGludGVnZXIgdmFsdWVzIGJldHdlZW4gMCBhbmQgMjU1IChpbmNsdWRlZCkuXG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R8UElYSS5SZW5kZXJUZXh0dXJlfSB0YXJnZXQgLSBBIGRpc3BsYXlPYmplY3Qgb3IgcmVuZGVyVGV4dHVyZVxuICogIHRvIGNvbnZlcnQuIElmIGxlZnQgZW1wdHkgd2lsbCB1c2UgdGhlIG1haW4gcmVuZGVyZXJcbiAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9IE9uZS1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIHRoZSBwaXhlbCBkYXRhIG9mIHRoZSBlbnRpcmUgdGV4dHVyZVxuICovXG5FeHRyYWN0LnByb3RvdHlwZS5waXhlbHMgPSBmdW5jdGlvbiBwaXhlbHMgKHRhcmdldClcbntcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgIHZhciByZXNvbHV0aW9uO1xuICAgIHZhciBmcmFtZTtcbiAgICB2YXIgcmVuZGVyVGV4dHVyZTtcbiAgICB2YXIgZ2VuZXJhdGVkID0gZmFsc2U7XG5cbiAgICBpZiAodGFyZ2V0KVxuICAgIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJlbmRlclRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlbmRlclRleHR1cmUgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICByZW5kZXJUZXh0dXJlID0gdGhpcy5yZW5kZXJlci5nZW5lcmF0ZVRleHR1cmUodGFyZ2V0KTtcbiAgICAgICAgICAgIGdlbmVyYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIHJlc29sdXRpb24gPSByZW5kZXJUZXh0dXJlLmJhc2VUZXh0dXJlLnJlc29sdXRpb247XG4gICAgICAgIGZyYW1lID0gcmVuZGVyVGV4dHVyZS5mcmFtZTtcblxuICAgICAgICAvLyBiaW5kIHRoZSBidWZmZXJcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyVGV4dHVyZS5iaW5kKHJlbmRlclRleHR1cmUpO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICByZXNvbHV0aW9uID0gcmVuZGVyZXIucmVzb2x1dGlvbjtcblxuICAgICAgICBmcmFtZSA9IFRFTVBfUkVDVDtcbiAgICAgICAgZnJhbWUud2lkdGggPSByZW5kZXJlci53aWR0aDtcbiAgICAgICAgZnJhbWUuaGVpZ2h0ID0gcmVuZGVyZXIuaGVpZ2h0O1xuXG4gICAgICAgIHJlbmRlcmVyLnJlbmRlclRleHR1cmUuYmluZChudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgd2lkdGggPSBmcmFtZS53aWR0aCAqIHJlc29sdXRpb247XG4gICAgdmFyIGhlaWdodCA9IGZyYW1lLmhlaWdodCAqIHJlc29sdXRpb247XG5cbiAgICB2YXIgd2ViZ2xQaXhlbHMgPSBuZXcgVWludDhBcnJheShCWVRFU19QRVJfUElYRUwgKiB3aWR0aCAqIGhlaWdodCk7XG5cbiAgICAvLyByZWFkIHBpeGVscyB0byB0aGUgYXJyYXlcbiAgICB2YXIgZ2wgPSByZW5kZXJlci5nbDtcblxuICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgIGZyYW1lLnggKiByZXNvbHV0aW9uLFxuICAgICAgICBmcmFtZS55ICogcmVzb2x1dGlvbixcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgZ2wuUkdCQSxcbiAgICAgICAgZ2wuVU5TSUdORURfQllURSxcbiAgICAgICAgd2ViZ2xQaXhlbHNcbiAgICApO1xuXG4gICAgaWYgKGdlbmVyYXRlZClcbiAgICB7XG4gICAgICAgIHJlbmRlclRleHR1cmUuZGVzdHJveSh0cnVlKTtcbiAgICB9XG5cbiAgICBFeHRyYWN0LmFycmF5UG9zdERpdmlkZSh3ZWJnbFBpeGVscywgd2ViZ2xQaXhlbHMpO1xuXG4gICAgcmV0dXJuIHdlYmdsUGl4ZWxzO1xufTtcblxuLyoqXG4gKiBEZXN0cm95cyB0aGUgZXh0cmFjdFxuICpcbiAqL1xuRXh0cmFjdC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbntcbiAgICB0aGlzLnJlbmRlcmVyLmV4dHJhY3QgPSBudWxsO1xuICAgIHRoaXMucmVuZGVyZXIgPSBudWxsO1xufTtcblxuLyoqXG4gKiBUYWtlcyBwcmVtdWx0aXBsaWVkIHBpeGVsIGRhdGEgYW5kIHByb2R1Y2VzIHJlZ3VsYXIgcGl4ZWwgZGF0YVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gcGl4ZWxzIHtudW1iZXJbXSB8IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheX0gYXJyYXkgb2YgcGl4ZWwgZGF0YVxuICogQHBhcmFtIG91dCB7bnVtYmVyW10gfCBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IG91dHB1dCBhcnJheVxuICovXG5FeHRyYWN0LmFycmF5UG9zdERpdmlkZSA9IGZ1bmN0aW9uIGFycmF5UG9zdERpdmlkZSAocGl4ZWxzLCBvdXQpXG57XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IDQpXG4gICAge1xuICAgICAgICB2YXIgYWxwaGEgPSBvdXRbaSArIDNdID0gcGl4ZWxzW2kgKyAzXTtcblxuICAgICAgICBpZiAoYWxwaGEgIT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIG91dFtpXSA9IE1hdGgucm91bmQoTWF0aC5taW4ocGl4ZWxzW2ldICogMjU1LjAgLyBhbHBoYSwgMjU1LjApKTtcbiAgICAgICAgICAgIG91dFtpICsgMV0gPSBNYXRoLnJvdW5kKE1hdGgubWluKHBpeGVsc1tpICsgMV0gKiAyNTUuMCAvIGFscGhhLCAyNTUuMCkpO1xuICAgICAgICAgICAgb3V0W2kgKyAyXSA9IE1hdGgucm91bmQoTWF0aC5taW4ocGl4ZWxzW2kgKyAyXSAqIDI1NS4wIC8gYWxwaGEsIDI1NS4wKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBvdXRbaV0gPSBwaXhlbHNbaV07XG4gICAgICAgICAgICBvdXRbaSArIDFdID0gcGl4ZWxzW2kgKyAxXTtcbiAgICAgICAgICAgIG91dFtpICsgMl0gPSBwaXhlbHNbaSArIDJdO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IHsgRXh0cmFjdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0cmFjdC5lcy5qcy5tYXBcbiIsIi8qIVxuICogcmVzb3VyY2UtbG9hZGVyIC0gdjMuMC4xXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGl4aWpzL3BpeGktc291bmRcbiAqIENvbXBpbGVkIFR1ZSwgMDIgSnVsIDIwMTkgMTQ6MDY6MTggVVRDXG4gKlxuICogcmVzb3VyY2UtbG9hZGVyIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuaW1wb3J0IHBhcnNlVXJpIGZyb20gJ3BhcnNlLXVyaSc7XG5pbXBvcnQgU2lnbmFsIGZyb20gJ21pbmktc2lnbmFscyc7XG5cbi8qKlxuICogU21hbGxlciB2ZXJzaW9uIG9mIHRoZSBhc3luYyBsaWJyYXJ5IGNvbnN0cnVjdHMuXG4gKlxuICogQG5hbWVzcGFjZSBhc3luY1xuICovXG5cbi8qKlxuICogTm9vcCBmdW5jdGlvblxuICpcbiAqIEBpZ25vcmVcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIGFzeW5jXG4gKi9cbmZ1bmN0aW9uIF9ub29wKCkge31cbi8qIGVtcHR5ICovXG5cbi8qKlxuICogSXRlcmF0ZXMgYW4gYXJyYXkgaW4gc2VyaWVzLlxuICpcbiAqIEBtZW1iZXJvZiBhc3luY1xuICogQGZ1bmN0aW9uIGVhY2hTZXJpZXNcbiAqIEBwYXJhbSB7QXJyYXkuPCo+fSBhcnJheSAtIEFycmF5IHRvIGl0ZXJhdGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRvciAtIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZWxlbWVudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRvbmUsIG9yIG9uIGVycm9yLlxuICogQHBhcmFtIHtib29sZWFufSBbZGVmZXJOZXh0PWZhbHNlXSAtIEJyZWFrIHN5bmNocm9ub3VzIGVhY2ggbG9vcCBieSBjYWxsaW5nIG5leHQgd2l0aCBhIHNldFRpbWVvdXQgb2YgMS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGVhY2hTZXJpZXMoYXJyYXksIGl0ZXJhdG9yLCBjYWxsYmFjaywgZGVmZXJOZXh0KSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aDtcblxuICAoZnVuY3Rpb24gbmV4dChlcnIpIHtcbiAgICBpZiAoZXJyIHx8IGkgPT09IGxlbikge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGVmZXJOZXh0KSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaSsrXSwgbmV4dCk7XG4gICAgICB9LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0b3IoYXJyYXlbaSsrXSwgbmV4dCk7XG4gICAgfVxuICB9KSgpO1xufVxuLyoqXG4gKiBFbnN1cmVzIGEgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25jZS5cbiAqXG4gKiBAaWdub3JlXG4gKiBAbWVtYmVyb2YgYXN5bmNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIHdyYXBwaW5nIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIG9ubHlPbmNlKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgICBpZiAoZm4gPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIHZhciBjYWxsRm4gPSBmbjtcbiAgICBmbiA9IG51bGw7XG4gICAgY2FsbEZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4vKipcbiAqIEFzeW5jIHF1ZXVlIGltcGxlbWVudGF0aW9uLFxuICpcbiAqIEBtZW1iZXJvZiBhc3luY1xuICogQGZ1bmN0aW9uIHF1ZXVlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB3b3JrZXIgLSBUaGUgd29ya2VyIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdGFzay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25jdXJyZW5jeSAtIEhvdyBtYW55IHdvcmtlcnMgdG8gcnVuIGluIHBhcnJhbGxlbC5cbiAqIEByZXR1cm4geyp9IFRoZSBhc3luYyBxdWV1ZSBvYmplY3QuXG4gKi9cblxuXG5mdW5jdGlvbiBxdWV1ZSh3b3JrZXIsIGNvbmN1cnJlbmN5KSB7XG4gIGlmIChjb25jdXJyZW5jeSA9PSBudWxsKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIGNvbmN1cnJlbmN5ID0gMTtcbiAgfSBlbHNlIGlmIChjb25jdXJyZW5jeSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29uY3VycmVuY3kgbXVzdCBub3QgYmUgemVybycpO1xuICB9XG5cbiAgdmFyIHdvcmtlcnMgPSAwO1xuICB2YXIgcSA9IHtcbiAgICBfdGFza3M6IFtdLFxuICAgIGNvbmN1cnJlbmN5OiBjb25jdXJyZW5jeSxcbiAgICBzYXR1cmF0ZWQ6IF9ub29wLFxuICAgIHVuc2F0dXJhdGVkOiBfbm9vcCxcbiAgICBidWZmZXI6IGNvbmN1cnJlbmN5IC8gNCxcbiAgICBlbXB0eTogX25vb3AsXG4gICAgZHJhaW46IF9ub29wLFxuICAgIGVycm9yOiBfbm9vcCxcbiAgICBzdGFydGVkOiBmYWxzZSxcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2goZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgIF9pbnNlcnQoZGF0YSwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIGtpbGw6IGZ1bmN0aW9uIGtpbGwoKSB7XG4gICAgICB3b3JrZXJzID0gMDtcbiAgICAgIHEuZHJhaW4gPSBfbm9vcDtcbiAgICAgIHEuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgcS5fdGFza3MgPSBbXTtcbiAgICB9LFxuICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIHVuc2hpZnQoZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgIF9pbnNlcnQoZGF0YSwgdHJ1ZSwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgcHJvY2VzczogZnVuY3Rpb24gcHJvY2VzcygpIHtcbiAgICAgIHdoaWxlICghcS5wYXVzZWQgJiYgd29ya2VycyA8IHEuY29uY3VycmVuY3kgJiYgcS5fdGFza3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0YXNrID0gcS5fdGFza3Muc2hpZnQoKTtcblxuICAgICAgICBpZiAocS5fdGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcS5lbXB0eSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2VycyArPSAxO1xuXG4gICAgICAgIGlmICh3b3JrZXJzID09PSBxLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgcS5zYXR1cmF0ZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdvcmtlcih0YXNrLmRhdGEsIG9ubHlPbmNlKF9uZXh0KHRhc2spKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZW5ndGg6IGZ1bmN0aW9uIGxlbmd0aCgpIHtcbiAgICAgIHJldHVybiBxLl90YXNrcy5sZW5ndGg7XG4gICAgfSxcbiAgICBydW5uaW5nOiBmdW5jdGlvbiBydW5uaW5nKCkge1xuICAgICAgcmV0dXJuIHdvcmtlcnM7XG4gICAgfSxcbiAgICBpZGxlOiBmdW5jdGlvbiBpZGxlKCkge1xuICAgICAgcmV0dXJuIHEuX3Rhc2tzLmxlbmd0aCArIHdvcmtlcnMgPT09IDA7XG4gICAgfSxcbiAgICBwYXVzZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICBpZiAocS5wYXVzZWQgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxLnBhdXNlZCA9IHRydWU7XG4gICAgfSxcbiAgICByZXN1bWU6IGZ1bmN0aW9uIHJlc3VtZSgpIHtcbiAgICAgIGlmIChxLnBhdXNlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBxLnBhdXNlZCA9IGZhbHNlOyAvLyBOZWVkIHRvIGNhbGwgcS5wcm9jZXNzIG9uY2UgcGVyIGNvbmN1cnJlbnRcbiAgICAgIC8vIHdvcmtlciB0byBwcmVzZXJ2ZSBmdWxsIGNvbmN1cnJlbmN5IGFmdGVyIHBhdXNlXG5cbiAgICAgIGZvciAodmFyIHcgPSAxOyB3IDw9IHEuY29uY3VycmVuY3k7IHcrKykge1xuICAgICAgICBxLnByb2Nlc3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gX2luc2VydChkYXRhLCBpbnNlcnRBdEZyb250LCBjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXNrIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHEuc3RhcnRlZCA9IHRydWU7XG5cbiAgICBpZiAoZGF0YSA9PSBudWxsICYmIHEuaWRsZSgpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgICAvLyBjYWxsIGRyYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyB0YXNrc1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBxLmRyYWluKCk7XG4gICAgICB9LCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBfbm9vcFxuICAgIH07XG5cbiAgICBpZiAoaW5zZXJ0QXRGcm9udCkge1xuICAgICAgcS5fdGFza3MudW5zaGlmdChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcS5fdGFza3MucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBxLnByb2Nlc3MoKTtcbiAgICB9LCAxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9uZXh0KHRhc2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdvcmtlcnMgLT0gMTtcbiAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkodGFzaywgYXJndW1lbnRzKTtcblxuICAgICAgaWYgKGFyZ3VtZW50c1swXSAhPSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICAgICAgcS5lcnJvcihhcmd1bWVudHNbMF0sIHRhc2suZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrZXJzIDw9IHEuY29uY3VycmVuY3kgLSBxLmJ1ZmZlcikge1xuICAgICAgICBxLnVuc2F0dXJhdGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChxLmlkbGUoKSkge1xuICAgICAgICBxLmRyYWluKCk7XG4gICAgICB9XG5cbiAgICAgIHEucHJvY2VzcygpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcTtcbn1cblxudmFyIGFzeW5jID0gKHtcbiAgICBlYWNoU2VyaWVzOiBlYWNoU2VyaWVzLFxuICAgIHF1ZXVlOiBxdWV1ZVxufSk7XG5cbi8vIGEgc2ltcGxlIGluLW1lbW9yeSBjYWNoZSBmb3IgcmVzb3VyY2VzXG52YXIgY2FjaGUgPSB7fTtcbi8qKlxuICogQSBzaW1wbGUgaW4tbWVtb3J5IGNhY2hlIGZvciByZXNvdXJjZS5cbiAqXG4gKiBAbWVtYmVyb2YgbWlkZGxld2FyZVxuICogQGZ1bmN0aW9uIGNhY2hpbmdcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBMb2FkZXIsIG1pZGRsZXdhcmUgfSBmcm9tICdyZXNvdXJjZS1sb2FkZXInO1xuICogY29uc3QgbG9hZGVyID0gbmV3IExvYWRlcigpO1xuICogbG9hZGVyLnVzZShtaWRkbGV3YXJlLmNhY2hpbmcpO1xuICogQHBhcmFtIHtSZXNvdXJjZX0gcmVzb3VyY2UgLSBDdXJyZW50IFJlc291cmNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gQ2FsbGJhY2sgd2hlbiBjb21wbGV0ZVxuICovXG5cbmZ1bmN0aW9uIGNhY2hpbmcocmVzb3VyY2UsIG5leHQpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICAvLyBpZiBjYWNoZWQsIHRoZW4gc2V0IGRhdGEgYW5kIGNvbXBsZXRlIHRoZSByZXNvdXJjZVxuICBpZiAoY2FjaGVbcmVzb3VyY2UudXJsXSkge1xuICAgIHJlc291cmNlLmRhdGEgPSBjYWNoZVtyZXNvdXJjZS51cmxdO1xuICAgIHJlc291cmNlLmNvbXBsZXRlKCk7IC8vIG1hcmtzIHJlc291cmNlIGxvYWQgY29tcGxldGUgYW5kIHN0b3BzIHByb2Nlc3NpbmcgYmVmb3JlIG1pZGRsZXdhcmVzXG4gIH0gLy8gaWYgbm90IGNhY2hlZCwgd2FpdCBmb3IgY29tcGxldGUgYW5kIHN0b3JlIGl0IGluIHRoZSBjYWNoZS5cbiAgZWxzZSB7XG4gICAgICByZXNvdXJjZS5vbkNvbXBsZXRlLm9uY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2FjaGVbX3RoaXMudXJsXSA9IF90aGlzLmRhdGE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgbmV4dCgpO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciB1c2VYZHIgPSAhISh3aW5kb3cuWERvbWFpblJlcXVlc3QgJiYgISgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkpO1xudmFyIHRlbXBBbmNob3IgPSBudWxsOyAvLyBzb21lIHN0YXR1cyBjb25zdGFudHNcblxudmFyIFNUQVRVU19OT05FID0gMDtcbnZhciBTVEFUVVNfT0sgPSAyMDA7XG52YXIgU1RBVFVTX0VNUFRZID0gMjA0O1xudmFyIFNUQVRVU19JRV9CVUdfRU1QVFkgPSAxMjIzO1xudmFyIFNUQVRVU19UWVBFX09LID0gMjsgLy8gbm9vcFxuXG5mdW5jdGlvbiBfbm9vcCQxKCkge31cbi8qIGVtcHR5ICovXG5cbi8qKlxuICogTWFuYWdlcyB0aGUgc3RhdGUgYW5kIGxvYWRpbmcgb2YgYSByZXNvdXJjZSBhbmQgYWxsIGNoaWxkIHJlc291cmNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuXG5cbnZhciBSZXNvdXJjZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsb2FkIHR5cGUgdG8gYmUgdXNlZCBmb3IgYSBzcGVjaWZpYyBleHRlbnNpb24uXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dG5hbWUgLSBUaGUgZXh0ZW5zaW9uIHRvIHNldCB0aGUgdHlwZSBmb3IsIGUuZy4gXCJwbmdcIiBvciBcImZudFwiXG4gICAqIEBwYXJhbSB7UmVzb3VyY2UuTE9BRF9UWVBFfSBsb2FkVHlwZSAtIFRoZSBsb2FkIHR5cGUgdG8gc2V0IGl0IHRvLlxuICAgKi9cbiAgUmVzb3VyY2Uuc2V0RXh0ZW5zaW9uTG9hZFR5cGUgPSBmdW5jdGlvbiBzZXRFeHRlbnNpb25Mb2FkVHlwZShleHRuYW1lLCBsb2FkVHlwZSkge1xuICAgIHNldEV4dE1hcChSZXNvdXJjZS5fbG9hZFR5cGVNYXAsIGV4dG5hbWUsIGxvYWRUeXBlKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgbG9hZCB0eXBlIHRvIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHRuYW1lIC0gVGhlIGV4dGVuc2lvbiB0byBzZXQgdGhlIHR5cGUgZm9yLCBlLmcuIFwicG5nXCIgb3IgXCJmbnRcIlxuICAgKiBAcGFyYW0ge1Jlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFfSB4aHJUeXBlIC0gVGhlIHhociB0eXBlIHRvIHNldCBpdCB0by5cbiAgICovXG4gIDtcblxuICBSZXNvdXJjZS5zZXRFeHRlbnNpb25YaHJUeXBlID0gZnVuY3Rpb24gc2V0RXh0ZW5zaW9uWGhyVHlwZShleHRuYW1lLCB4aHJUeXBlKSB7XG4gICAgc2V0RXh0TWFwKFJlc291cmNlLl94aHJUeXBlTWFwLCBleHRuYW1lLCB4aHJUeXBlKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IHVybCAtIFRoZSB1cmwgZm9yIHRoaXMgcmVzb3VyY2UsIGZvciBhdWRpby92aWRlbyBsb2FkcyB5b3UgY2FuIHBhc3NcbiAgICogICAgICBhbiBhcnJheSBvZiBzb3VyY2VzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbb3B0aW9ucy5jcm9zc09yaWdpbl0gLSBJcyB0aGlzIHJlcXVlc3QgY3Jvc3Mtb3JpZ2luPyBEZWZhdWx0IGlzIHRvXG4gICAqICAgICAgZGV0ZXJtaW5lIGF1dG9tYXRpY2FsbHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0PTBdIC0gQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGxvYWQuIElmIHRoZSBsb2FkIHRha2VzXG4gICAqICAgICAgbG9uZ2VyIHRoYW4gdGhpcyB0aW1lIGl0IGlzIGNhbmNlbGxlZCBhbmQgdGhlIGxvYWQgaXMgY29uc2lkZXJlZCBhIGZhaWx1cmUuIElmIHRoaXMgdmFsdWUgaXNcbiAgICogICAgICBzZXQgdG8gYDBgIHRoZW4gdGhlcmUgaXMgbm8gZXhwbGljaXQgdGltZW91dC5cbiAgICogQHBhcmFtIHtSZXNvdXJjZS5MT0FEX1RZUEV9IFtvcHRpb25zLmxvYWRUeXBlPVJlc291cmNlLkxPQURfVFlQRS5YSFJdIC0gSG93IHNob3VsZCB0aGlzIHJlc291cmNlXG4gICAqICAgICAgYmUgbG9hZGVkP1xuICAgKiBAcGFyYW0ge1Jlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFfSBbb3B0aW9ucy54aHJUeXBlPVJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkRFRkFVTFRdIC0gSG93XG4gICAqICAgICAgc2hvdWxkIHRoZSBkYXRhIGJlaW5nIGxvYWRlZCBiZSBpbnRlcnByZXRlZCB3aGVuIHVzaW5nIFhIUj9cbiAgICogQHBhcmFtIHtSZXNvdXJjZS5JTWV0YWRhdGF9IFtvcHRpb25zLm1ldGFkYXRhXSAtIEV4dHJhIGNvbmZpZ3VyYXRpb24gZm9yIG1pZGRsZXdhcmUgYW5kIHRoZSBSZXNvdXJjZSBvYmplY3QuXG4gICAqL1xuICA7XG5cbiAgZnVuY3Rpb24gUmVzb3VyY2UobmFtZSwgdXJsLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIG5hbWUgYW5kIHVybCBhcmUgcmVxdWlyZWQgZm9yIGNvbnN0cnVjdGluZyBhIHJlc291cmNlLicpO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBmbGFncyBvZiB0aGlzIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG5cbiAgICB0aGlzLl9mbGFncyA9IDA7IC8vIHNldCBkYXRhIHVybCBmbGFnLCBuZWVkcyB0byBiZSBzZXQgZWFybHkgZm9yIHNvbWUgX2RldGVybWluZVggY2hlY2tzIHRvIHdvcmsuXG5cbiAgICB0aGlzLl9zZXRGbGFnKFJlc291cmNlLlNUQVRVU19GTEFHUy5EQVRBX1VSTCwgdXJsLmluZGV4T2YoJ2RhdGE6JykgPT09IDApO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG5cblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLyoqXG4gICAgICogVGhlIHVybCB1c2VkIHRvIGxvYWQgdGhpcyByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKi9cblxuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlbnNpb24gdXNlZCB0byBsb2FkIHRoaXMgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG5cbiAgICB0aGlzLmV4dGVuc2lvbiA9IHRoaXMuX2dldEV4dGVuc2lvbigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIHRoYXQgd2FzIGxvYWRlZCBieSB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHthbnl9XG4gICAgICovXG5cbiAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIElzIHRoaXMgcmVxdWVzdCBjcm9zcy1vcmlnaW4/IElmIHVuc2V0LCBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG5cbiAgICB0aGlzLmNyb3NzT3JpZ2luID0gb3B0aW9ucy5jcm9zc09yaWdpbiA9PT0gdHJ1ZSA/ICdhbm9ueW1vdXMnIDogb3B0aW9ucy5jcm9zc09yaWdpbjtcbiAgICAvKipcbiAgICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbG9hZC4gSWYgdGhlIGxvYWQgdGFrZXMgbG9uZ2VyIHRoYW4gdGhpcyB0aW1lXG4gICAgICogaXQgaXMgY2FuY2VsbGVkIGFuZCB0aGUgbG9hZCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gYDBgXG4gICAgICogdGhlbiB0aGVyZSBpcyBubyBleHBsaWNpdCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCBvZiBsb2FkaW5nIHRvIHVzZSBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1Jlc291cmNlLkxPQURfVFlQRX1cbiAgICAgKi9cblxuICAgIHRoaXMubG9hZFR5cGUgPSBvcHRpb25zLmxvYWRUeXBlIHx8IHRoaXMuX2RldGVybWluZUxvYWRUeXBlKCk7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgdXNlZCB0byBsb2FkIHRoZSByZXNvdXJjZSB2aWEgWEhSLiBJZiB1bnNldCwgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqL1xuXG4gICAgdGhpcy54aHJUeXBlID0gb3B0aW9ucy54aHJUeXBlO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIGluZm8gZm9yIG1pZGRsZXdhcmUsIGFuZCBjb250cm9sbGluZyBzcGVjaWZpY3MgYWJvdXQgaG93IHRoZSByZXNvdXJjZSBsb2Fkcy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpZiB5b3UgcGFzcyBpbiBhIGBsb2FkRWxlbWVudGAsIHRoZSBSZXNvdXJjZSBjbGFzcyB0YWtlcyBvd25lcnNoaXAgb2YgaXQuXG4gICAgICogTWVhbmluZyBpdCB3aWxsIG1vZGlmeSBpdCBhcyBpdCBzZWVzIGZpdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1Jlc291cmNlLklNZXRhZGF0YX1cbiAgICAgKi9cblxuICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhIHx8IHt9O1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciB0aGF0IG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtFcnJvcn1cbiAgICAgKi9cblxuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBYSFIgb2JqZWN0IHRoYXQgd2FzIHVzZWQgdG8gbG9hZCB0aGlzIHJlc291cmNlLiBUaGlzIGlzIG9ubHkgc2V0XG4gICAgICogd2hlbiBgbG9hZFR5cGVgIGlzIGBSZXNvdXJjZS5MT0FEX1RZUEUuWEhSYC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBtZW1iZXIge1hNTEh0dHBSZXF1ZXN0fVxuICAgICAqL1xuXG4gICAgdGhpcy54aHIgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGlsZCByZXNvdXJjZXMgdGhpcyByZXNvdXJjZSBvd25zLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQG1lbWJlciB7UmVzb3VyY2VbXX1cbiAgICAgKi9cblxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBtZW1iZXIge1Jlc291cmNlLlRZUEV9XG4gICAgICovXG5cbiAgICB0aGlzLnR5cGUgPSBSZXNvdXJjZS5UWVBFLlVOS05PV047XG4gICAgLyoqXG4gICAgICogVGhlIHByb2dyZXNzIGNodW5rIG93bmVkIGJ5IHRoaXMgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG5cbiAgICB0aGlzLnByb2dyZXNzQ2h1bmsgPSAwO1xuICAgIC8qKlxuICAgICAqIFRoZSBgZGVxdWV1ZWAgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIGEgc3RvcmFnZSBwbGFjZSBmb3IgdGhlIGFzeW5jIHF1ZXVlIGRlcXVldWUgbWV0aG9kXG4gICAgICogdXNlZCBwcml2YXRlbHkgYnkgdGhlIGxvYWRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7ZnVuY3Rpb259XG4gICAgICovXG5cbiAgICB0aGlzLl9kZXF1ZXVlID0gX25vb3AkMTtcbiAgICAvKipcbiAgICAgKiBVc2VkIGEgc3RvcmFnZSBwbGFjZSBmb3IgdGhlIG9uIGxvYWQgYmluZGluZyB1c2VkIHByaXZhdGVseSBieSB0aGUgbG9hZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyIHtmdW5jdGlvbn1cbiAgICAgKi9cblxuICAgIHRoaXMuX29uTG9hZEJpbmRpbmcgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lciBmb3IgZWxlbWVudCBsb2FkcyB0byBjaGVjayBpZiB0aGV5IHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cblxuICAgIHRoaXMuX2VsZW1lbnRUaW1lciA9IDA7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb21wbGV0ZWAgZnVuY3Rpb24gYm91bmQgdG8gdGhpcyByZXNvdXJjZSdzIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge2Z1bmN0aW9ufVxuICAgICAqL1xuXG4gICAgdGhpcy5fYm91bmRDb21wbGV0ZSA9IHRoaXMuY29tcGxldGUuYmluZCh0aGlzKTtcbiAgICAvKipcbiAgICAgKiBUaGUgYF9vbkVycm9yYCBmdW5jdGlvbiBib3VuZCB0byB0aGlzIHJlc291cmNlJ3MgY29udGV4dC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7ZnVuY3Rpb259XG4gICAgICovXG5cbiAgICB0aGlzLl9ib3VuZE9uRXJyb3IgPSB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyk7XG4gICAgLyoqXG4gICAgICogVGhlIGBfb25Qcm9ncmVzc2AgZnVuY3Rpb24gYm91bmQgdG8gdGhpcyByZXNvdXJjZSdzIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge2Z1bmN0aW9ufVxuICAgICAqL1xuXG4gICAgdGhpcy5fYm91bmRPblByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgIC8qKlxuICAgICAqIFRoZSBgX29uVGltZW91dGAgZnVuY3Rpb24gYm91bmQgdG8gdGhpcyByZXNvdXJjZSdzIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBtZW1iZXIge2Z1bmN0aW9ufVxuICAgICAqL1xuXG4gICAgdGhpcy5fYm91bmRPblRpbWVvdXQgPSB0aGlzLl9vblRpbWVvdXQuYmluZCh0aGlzKTsgLy8geGhyIGNhbGxiYWNrc1xuXG4gICAgdGhpcy5fYm91bmRYaHJPbkVycm9yID0gdGhpcy5feGhyT25FcnJvci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2JvdW5kWGhyT25UaW1lb3V0ID0gdGhpcy5feGhyT25UaW1lb3V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYm91bmRYaHJPbkFib3J0ID0gdGhpcy5feGhyT25BYm9ydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2JvdW5kWGhyT25Mb2FkID0gdGhpcy5feGhyT25Mb2FkLmJpbmQodGhpcyk7XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlZCB3aGVuIHRoZSByZXNvdXJjZSBiZWluZ3MgdG8gbG9hZC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBsb29rcyBsaWtlIHtAbGluayBSZXNvdXJjZS5PblN0YXJ0U2lnbmFsfS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1NpZ25hbDxSZXNvdXJjZS5PblN0YXJ0U2lnbmFsPn1cbiAgICAgKi9cblxuICAgIHRoaXMub25TdGFydCA9IG5ldyBTaWduYWwoKTtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIGVhY2ggdGltZSBwcm9ncmVzcyBvZiB0aGlzIHJlc291cmNlIGxvYWQgdXBkYXRlcy5cbiAgICAgKiBOb3QgYWxsIHJlc291cmNlcyB0eXBlcyBhbmQgbG9hZGVyIHN5c3RlbXMgY2FuIHN1cHBvcnQgdGhpcyBldmVudFxuICAgICAqIHNvIHNvbWV0aW1lcyBpdCBtYXkgbm90IGJlIGF2YWlsYWJsZS4gSWYgdGhlIHJlc291cmNlXG4gICAgICogaXMgYmVpbmcgbG9hZGVkIG9uIGEgbW9kZXJuIGJyb3dzZXIsIHVzaW5nIFhIUiwgYW5kIHRoZSByZW1vdGUgc2VydmVyXG4gICAgICogcHJvcGVybHkgc2V0cyBDb250ZW50LUxlbmd0aCBoZWFkZXJzLCB0aGVuIHRoaXMgd2lsbCBiZSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBUaGUgY2FsbGJhY2sgbG9va3MgbGlrZSB7QGxpbmsgUmVzb3VyY2UuT25Qcm9ncmVzc1NpZ25hbH0uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtTaWduYWw8UmVzb3VyY2UuT25Qcm9ncmVzc1NpZ25hbD59XG4gICAgICovXG5cbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBuZXcgU2lnbmFsKCk7XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2hlZCBvbmNlIHRoaXMgcmVzb3VyY2UgaGFzIGxvYWRlZCwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGl0IHdpbGxcbiAgICAgKiBiZSBpbiB0aGUgYGVycm9yYCBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBsb29rcyBsaWtlIHtAbGluayBSZXNvdXJjZS5PbkNvbXBsZXRlU2lnbmFsfS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1NpZ25hbDxSZXNvdXJjZS5PbkNvbXBsZXRlU2lnbmFsPn1cbiAgICAgKi9cblxuICAgIHRoaXMub25Db21wbGV0ZSA9IG5ldyBTaWduYWwoKTtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIGFmdGVyIHRoaXMgcmVzb3VyY2UgaGFzIGhhZCBhbGwgdGhlICphZnRlciogbWlkZGxld2FyZSBydW4gb24gaXQuXG4gICAgICpcbiAgICAgKiBUaGUgY2FsbGJhY2sgbG9va3MgbGlrZSB7QGxpbmsgUmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtTaWduYWw8UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbD59XG4gICAgICovXG5cbiAgICB0aGlzLm9uQWZ0ZXJNaWRkbGV3YXJlID0gbmV3IFNpZ25hbCgpO1xuICB9XG4gIC8qKlxuICAgKiBXaGVuIHRoZSByZXNvdXJjZSBzdGFydHMgdG8gbG9hZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIFJlc291cmNlXG4gICAqIEBjYWxsYmFjayBPblN0YXJ0U2lnbmFsXG4gICAqIEBwYXJhbSB7UmVzb3VyY2V9IHJlc291cmNlIC0gVGhlIHJlc291cmNlIHRoYXQgdGhlIGV2ZW50IGhhcHBlbmVkIG9uLlxuICAgKi9cblxuICAvKipcbiAgICogV2hlbiB0aGUgcmVzb3VyY2UgcmVwb3J0cyBsb2FkaW5nIHByb2dyZXNzLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUmVzb3VyY2VcbiAgICogQGNhbGxiYWNrIE9uUHJvZ3Jlc3NTaWduYWxcbiAgICogQHBhcmFtIHtSZXNvdXJjZX0gcmVzb3VyY2UgLSBUaGUgcmVzb3VyY2UgdGhhdCB0aGUgZXZlbnQgaGFwcGVuZWQgb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwZXJjZW50YWdlIC0gVGhlIHByb2dyZXNzIG9mIHRoZSBsb2FkIGluIHRoZSByYW5nZSBbMCwgMV0uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSByZXNvdXJjZSBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgUmVzb3VyY2VcbiAgICogQGNhbGxiYWNrIE9uQ29tcGxldGVTaWduYWxcbiAgICogQHBhcmFtIHtSZXNvdXJjZX0gcmVzb3VyY2UgLSBUaGUgcmVzb3VyY2UgdGhhdCB0aGUgZXZlbnQgaGFwcGVuZWQgb24uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWVtYmVyb2YgUmVzb3VyY2VcbiAgICogQHR5cGVkZWYge29iamVjdH0gSU1ldGFkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEltYWdlRWxlbWVudHxIVE1MQXVkaW9FbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR9IFtsb2FkRWxlbWVudD1udWxsXSAtIFRoZVxuICAgKiAgICAgIGVsZW1lbnQgdG8gdXNlIGZvciBsb2FkaW5nLCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFNvdXJjZT1mYWxzZV0gLSBTa2lwcyBhZGRpbmcgc291cmNlKHMpIHRvIHRoZSBsb2FkIGVsZW1lbnQuIFRoaXNcbiAgICogICAgICBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcGFzcyBpbiBhIGBsb2FkRWxlbWVudGAgdGhhdCB5b3UgYWxyZWFkeSBhZGRlZCBsb2FkIHNvdXJjZXMgdG8uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfHN0cmluZ1tdfSBbbWltZVR5cGVdIC0gVGhlIG1pbWUgdHlwZSB0byB1c2UgZm9yIHRoZSBzb3VyY2UgZWxlbWVudFxuICAgKiAgICAgIG9mIGEgdmlkZW8vYXVkaW8gZWxtZW50LiBJZiB0aGUgdXJscyBhcmUgYW4gYXJyYXksIHlvdSBjYW4gcGFzcyB0aGlzIGFzIGFuIGFycmF5IGFzIHdlbGxcbiAgICogICAgICB3aGVyZSBlYWNoIGluZGV4IGlzIHRoZSBtaW1lIHR5cGUgdG8gdXNlIGZvciB0aGUgY29ycmVzcG9uZGluZyB1cmwgaW5kZXguXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgd2hldGhlciBvciBub3QgdGhpcyB1cmwgaXMgYSBkYXRhIHVybC5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFJlc291cmNlLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogTWFya3MgdGhlIHJlc291cmNlIGFzIGNvbXBsZXRlLlxuICAgKlxuICAgKi9cbiAgX3Byb3RvLmNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgdGhpcy5fY2xlYXJFdmVudHMoKTtcblxuICAgIHRoaXMuX2ZpbmlzaCgpO1xuICB9XG4gIC8qKlxuICAgKiBBYm9ydHMgdGhlIGxvYWRpbmcgb2YgdGhpcyByZXNvdXJjZSwgd2l0aCBhbiBvcHRpb25hbCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIHVzZSBmb3IgdGhlIGVycm9yXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFib3J0ID0gZnVuY3Rpb24gYWJvcnQobWVzc2FnZSkge1xuICAgIC8vIGFib3J0IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGlnbm9yZSBzdWJzZXF1ZW50IGNhbGxzLlxuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzdG9yZSBlcnJvclxuXG5cbiAgICB0aGlzLmVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpOyAvLyBjbGVhciBldmVudHMgYmVmb3JlIGNhbGxpbmcgYWJvcnRzXG5cbiAgICB0aGlzLl9jbGVhckV2ZW50cygpOyAvLyBhYm9ydCB0aGUgYWN0dWFsIGxvYWRpbmdcblxuXG4gICAgaWYgKHRoaXMueGhyKSB7XG4gICAgICB0aGlzLnhoci5hYm9ydCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy54ZHIpIHtcbiAgICAgIHRoaXMueGRyLmFib3J0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIC8vIHNpbmdsZSBzb3VyY2VcbiAgICAgIGlmICh0aGlzLmRhdGEuc3JjKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zcmMgPSBSZXNvdXJjZS5FTVBUWV9HSUY7XG4gICAgICB9IC8vIG11bHRpLXNvdXJjZVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKHRoaXMuZGF0YS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEucmVtb3ZlQ2hpbGQodGhpcy5kYXRhLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gLy8gZG9uZSBub3cuXG5cblxuICAgIHRoaXMuX2ZpbmlzaCgpO1xuICB9XG4gIC8qKlxuICAgKiBLaWNrcyBvZmYgbG9hZGluZyBvZiB0aGlzIHJlc291cmNlLiBUaGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NiXSAtIE9wdGlvbmFsIGNhbGxiYWNrIHRvIGNhbGwgb25jZSB0aGUgcmVzb3VyY2UgaXMgbG9hZGVkLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5sb2FkID0gZnVuY3Rpb24gbG9hZChjYikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5pc0xvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlKSB7XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKF90aGlzKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGNiKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUub25jZShjYik7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RmxhZyhSZXNvdXJjZS5TVEFUVVNfRkxBR1MuTE9BRElORywgdHJ1ZSk7XG5cbiAgICB0aGlzLm9uU3RhcnQuZGlzcGF0Y2godGhpcyk7IC8vIGlmIHVuc2V0LCBkZXRlcm1pbmUgdGhlIHZhbHVlXG5cbiAgICBpZiAodGhpcy5jcm9zc09yaWdpbiA9PT0gZmFsc2UgfHwgdHlwZW9mIHRoaXMuY3Jvc3NPcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmNyb3NzT3JpZ2luID0gdGhpcy5fZGV0ZXJtaW5lQ3Jvc3NPcmlnaW4odGhpcy51cmwpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5sb2FkVHlwZSkge1xuICAgICAgY2FzZSBSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0U6XG4gICAgICAgIHRoaXMudHlwZSA9IFJlc291cmNlLlRZUEUuSU1BR0U7XG5cbiAgICAgICAgdGhpcy5fbG9hZEVsZW1lbnQoJ2ltYWdlJyk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVzb3VyY2UuTE9BRF9UWVBFLkFVRElPOlxuICAgICAgICB0aGlzLnR5cGUgPSBSZXNvdXJjZS5UWVBFLkFVRElPO1xuXG4gICAgICAgIHRoaXMuX2xvYWRTb3VyY2VFbGVtZW50KCdhdWRpbycpO1xuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlc291cmNlLkxPQURfVFlQRS5WSURFTzpcbiAgICAgICAgdGhpcy50eXBlID0gUmVzb3VyY2UuVFlQRS5WSURFTztcblxuICAgICAgICB0aGlzLl9sb2FkU291cmNlRWxlbWVudCgndmlkZW8nKTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZXNvdXJjZS5MT0FEX1RZUEUuWEhSOlxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodXNlWGRyICYmIHRoaXMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgICAgICB0aGlzLl9sb2FkWGRyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFhocigpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGZsYWcgaXMgc2V0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZmxhZyAtIFRoZSBmbGFnIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBmbGFnIGlzIHNldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uX2hhc0ZsYWcgPSBmdW5jdGlvbiBfaGFzRmxhZyhmbGFnKSB7XG4gICAgcmV0dXJuICh0aGlzLl9mbGFncyAmIGZsYWcpICE9PSAwO1xuICB9XG4gIC8qKlxuICAgKiAoVW4pU2V0cyB0aGUgZmxhZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZsYWcgLSBUaGUgZmxhZyB0byAodW4pc2V0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gV2hldGhlciB0byBzZXQgb3IgKHVuKXNldCB0aGUgZmxhZy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uX3NldEZsYWcgPSBmdW5jdGlvbiBfc2V0RmxhZyhmbGFnLCB2YWx1ZSkge1xuICAgIHRoaXMuX2ZsYWdzID0gdmFsdWUgPyB0aGlzLl9mbGFncyB8IGZsYWcgOiB0aGlzLl9mbGFncyAmIH5mbGFnO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRoZSBldmVudHMgZnJvbSB0aGUgdW5kZXJseWluZyBsb2FkaW5nIHNvdXJjZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX2NsZWFyRXZlbnRzID0gZnVuY3Rpb24gX2NsZWFyRXZlbnRzKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9lbGVtZW50VGltZXIpO1xuXG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgdGhpcy5kYXRhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fYm91bmRPbkVycm9yLCBmYWxzZSk7XG4gICAgICB0aGlzLmRhdGEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMuX2JvdW5kQ29tcGxldGUsIGZhbHNlKTtcbiAgICAgIHRoaXMuZGF0YS5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMuX2JvdW5kT25Qcm9ncmVzcywgZmFsc2UpO1xuICAgICAgdGhpcy5kYXRhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXl0aHJvdWdoJywgdGhpcy5fYm91bmRDb21wbGV0ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnhocikge1xuICAgICAgaWYgKHRoaXMueGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy54aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9ib3VuZFhock9uRXJyb3IsIGZhbHNlKTtcbiAgICAgICAgdGhpcy54aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZW91dCcsIHRoaXMuX2JvdW5kWGhyT25UaW1lb3V0LCBmYWxzZSk7XG4gICAgICAgIHRoaXMueGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5fYm91bmRYaHJPbkFib3J0LCBmYWxzZSk7XG4gICAgICAgIHRoaXMueGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5fYm91bmRPblByb2dyZXNzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMueGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9ib3VuZFhock9uTG9hZCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy54aHIub25lcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMueGhyLm9udGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMueGhyLm9ucHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB0aGlzLnhoci5vbmxvYWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRmluYWxpemVzIHRoZSBsb2FkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fZmluaXNoID0gZnVuY3Rpb24gX2ZpbmlzaCgpIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBsZXRlIGNhbGxlZCBhZ2FpbiBmb3IgYW4gYWxyZWFkeSBjb21wbGV0ZWQgcmVzb3VyY2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RmxhZyhSZXNvdXJjZS5TVEFUVVNfRkxBR1MuQ09NUExFVEUsIHRydWUpO1xuXG4gICAgdGhpcy5fc2V0RmxhZyhSZXNvdXJjZS5TVEFUVVNfRkxBR1MuTE9BRElORywgZmFsc2UpO1xuXG4gICAgdGhpcy5vbkNvbXBsZXRlLmRpc3BhdGNoKHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkcyB0aGlzIHJlc291cmNlcyB1c2luZyBhbiBlbGVtZW50IHRoYXQgaGFzIGEgc2luZ2xlIHNvdXJjZSxcbiAgICogbGlrZSBhbiBIVE1MSW1hZ2VFbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fbG9hZEVsZW1lbnQgPSBmdW5jdGlvbiBfbG9hZEVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0aGlzLm1ldGFkYXRhLmxvYWRFbGVtZW50KSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm1ldGFkYXRhLmxvYWRFbGVtZW50O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ltYWdlJyAmJiB0eXBlb2Ygd2luZG93LkltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5kYXRhID0gbmV3IEltYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHRoaXMuZGF0YS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLnNraXBTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YS5zcmMgPSB0aGlzLnVybDtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9ib3VuZE9uRXJyb3IsIGZhbHNlKTtcbiAgICB0aGlzLmRhdGEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMuX2JvdW5kQ29tcGxldGUsIGZhbHNlKTtcbiAgICB0aGlzLmRhdGEuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzLl9ib3VuZE9uUHJvZ3Jlc3MsIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRUaW1lciA9IHNldFRpbWVvdXQodGhpcy5fYm91bmRPblRpbWVvdXQsIHRoaXMudGltZW91dCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBMb2FkcyB0aGlzIHJlc291cmNlcyB1c2luZyBhbiBlbGVtZW50IHRoYXQgaGFzIG11bHRpcGxlIHNvdXJjZXMsXG4gICAqIGxpa2UgYW4gSFRNTEF1ZGlvRWxlbWVudCBvciBIVE1MVmlkZW9FbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fbG9hZFNvdXJjZUVsZW1lbnQgPSBmdW5jdGlvbiBfbG9hZFNvdXJjZUVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0aGlzLm1ldGFkYXRhLmxvYWRFbGVtZW50KSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm1ldGFkYXRhLmxvYWRFbGVtZW50O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F1ZGlvJyAmJiB0eXBlb2Ygd2luZG93LkF1ZGlvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5kYXRhID0gbmV3IEF1ZGlvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5hYm9ydChcIlVuc3VwcG9ydGVkIGVsZW1lbnQ6IFwiICsgdHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHRoaXMuZGF0YS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLnNraXBTb3VyY2UpIHtcbiAgICAgIC8vIHN1cHBvcnQgZm9yIENvY29vbkpTIENhbnZhcysgcnVudGltZSwgbGFja3MgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJylcbiAgICAgIGlmIChuYXZpZ2F0b3IuaXNDb2Nvb25KUykge1xuICAgICAgICB0aGlzLmRhdGEuc3JjID0gQXJyYXkuaXNBcnJheSh0aGlzLnVybCkgPyB0aGlzLnVybFswXSA6IHRoaXMudXJsO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudXJsKSkge1xuICAgICAgICB2YXIgbWltZVR5cGVzID0gdGhpcy5tZXRhZGF0YS5taW1lVHlwZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudXJsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNvdXJjZSh0eXBlLCB0aGlzLnVybFtpXSwgQXJyYXkuaXNBcnJheShtaW1lVHlwZXMpID8gbWltZVR5cGVzW2ldIDogbWltZVR5cGVzKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfbWltZVR5cGVzID0gdGhpcy5tZXRhZGF0YS5taW1lVHlwZTtcbiAgICAgICAgdGhpcy5kYXRhLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNvdXJjZSh0eXBlLCB0aGlzLnVybCwgQXJyYXkuaXNBcnJheShfbWltZVR5cGVzKSA/IF9taW1lVHlwZXNbMF0gOiBfbWltZVR5cGVzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fYm91bmRPbkVycm9yLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9ib3VuZENvbXBsZXRlLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5fYm91bmRPblByb2dyZXNzLCBmYWxzZSk7XG4gICAgdGhpcy5kYXRhLmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXl0aHJvdWdoJywgdGhpcy5fYm91bmRDb21wbGV0ZSwgZmFsc2UpO1xuICAgIHRoaXMuZGF0YS5sb2FkKCk7XG5cbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICB0aGlzLl9lbGVtZW50VGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX2JvdW5kT25UaW1lb3V0LCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTG9hZHMgdGhpcyByZXNvdXJjZXMgdXNpbmcgYW4gWE1MSHR0cFJlcXVlc3QuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9sb2FkWGhyID0gZnVuY3Rpb24gX2xvYWRYaHIoKSB7XG4gICAgLy8gaWYgdW5zZXQsIGRldGVybWluZSB0aGUgdmFsdWVcbiAgICBpZiAodHlwZW9mIHRoaXMueGhyVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMueGhyVHlwZSA9IHRoaXMuX2RldGVybWluZVhoclR5cGUoKTtcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gdGhpcy54aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgLy8gc2V0IHRoZSByZXF1ZXN0IHR5cGUgYW5kIHVybFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHRoaXMudXJsLCB0cnVlKTtcbiAgICB4aHIudGltZW91dCA9IHRoaXMudGltZW91dDsgLy8gbG9hZCBqc29uIGFzIHRleHQgYW5kIHBhcnNlIGl0IG91cnNlbHZlcy4gV2UgZG8gdGhpcyBiZWNhdXNlIHNvbWUgYnJvd3NlcnNcbiAgICAvLyAqY291Z2gqIHNhZmFyaSAqY291Z2gqIGNhbid0IGRlYWwgd2l0aCBpdC5cblxuICAgIGlmICh0aGlzLnhoclR5cGUgPT09IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkpTT04gfHwgdGhpcy54aHJUeXBlID09PSBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCkge1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLlRFWFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLnhoclR5cGU7XG4gICAgfVxuXG4gICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fYm91bmRYaHJPbkVycm9yLCBmYWxzZSk7XG4gICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWVvdXQnLCB0aGlzLl9ib3VuZFhock9uVGltZW91dCwgZmFsc2UpO1xuICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMuX2JvdW5kWGhyT25BYm9ydCwgZmFsc2UpO1xuICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMuX2JvdW5kT25Qcm9ncmVzcywgZmFsc2UpO1xuICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpcy5fYm91bmRYaHJPbkxvYWQsIGZhbHNlKTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkcyB0aGlzIHJlc291cmNlcyB1c2luZyBhbiBYRG9tYWluUmVxdWVzdC4gVGhpcyBpcyBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IElFOSAoZ3Jvc3MpLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fbG9hZFhkciA9IGZ1bmN0aW9uIF9sb2FkWGRyKCkge1xuICAgIC8vIGlmIHVuc2V0LCBkZXRlcm1pbmUgdGhlIHZhbHVlXG4gICAgaWYgKHR5cGVvZiB0aGlzLnhoclR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnhoclR5cGUgPSB0aGlzLl9kZXRlcm1pbmVYaHJUeXBlKCk7XG4gICAgfVxuXG4gICAgdmFyIHhkciA9IHRoaXMueGhyID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAvLyBYRG9tYWluUmVxdWVzdCBoYXMgYSBmZXcgcXVpcmtzLiBPY2Nhc2lvbmFsbHkgaXQgd2lsbCBhYm9ydCByZXF1ZXN0c1xuICAgIC8vIEEgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gbWFrZSBzdXJlIEFMTCBjYWxsYmFja3MgYXJlIHNldCBldmVuIGlmIG5vdCB1c2VkXG4gICAgLy8gTW9yZSBpbmZvIGhlcmU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTU3ODY5NjYveGRvbWFpbnJlcXVlc3QtYWJvcnRzLXBvc3Qtb24taWUtOVxuXG4gICAgeGRyLnRpbWVvdXQgPSB0aGlzLnRpbWVvdXQgfHwgNTAwMDsgLy8gWERSIG5lZWRzIGEgdGltZW91dCB2YWx1ZSBvciBpdCBicmVha3MgaW4gSUU5XG5cbiAgICB4ZHIub25lcnJvciA9IHRoaXMuX2JvdW5kWGhyT25FcnJvcjtcbiAgICB4ZHIub250aW1lb3V0ID0gdGhpcy5fYm91bmRYaHJPblRpbWVvdXQ7XG4gICAgeGRyLm9ucHJvZ3Jlc3MgPSB0aGlzLl9ib3VuZE9uUHJvZ3Jlc3M7XG4gICAgeGRyLm9ubG9hZCA9IHRoaXMuX2JvdW5kWGhyT25Mb2FkO1xuICAgIHhkci5vcGVuKCdHRVQnLCB0aGlzLnVybCwgdHJ1ZSk7IC8vIE5vdGU6IFRoZSB4ZHIuc2VuZCgpIGNhbGwgaXMgd3JhcHBlZCBpbiBhIHRpbWVvdXQgdG8gcHJldmVudCBhblxuICAgIC8vIGlzc3VlIHdpdGggdGhlIGludGVyZmFjZSB3aGVyZSBzb21lIHJlcXVlc3RzIGFyZSBsb3N0IGlmIG11bHRpcGxlXG4gICAgLy8gWERvbWFpblJlcXVlc3RzIGFyZSBiZWluZyBzZW50IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgLy8gU29tZSBpbmZvIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9waG90b25zdG9ybS9waGFzZXIvaXNzdWVzLzEyNDhcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHhkci5zZW5kKCk7XG4gICAgfSwgMSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzb3VyY2UgdXNlZCBpbiBsb2FkaW5nIHZpYSBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBlbGVtZW50IHR5cGUgKHZpZGVvIG9yIGF1ZGlvKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBzb3VyY2UgVVJMIHRvIGxvYWQgZnJvbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttaW1lXSAtIFRoZSBtaW1lIHR5cGUgb2YgdGhlIHZpZGVvXG4gICAqIEByZXR1cm4ge0hUTUxTb3VyY2VFbGVtZW50fSBUaGUgc291cmNlIGVsZW1lbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9jcmVhdGVTb3VyY2UgPSBmdW5jdGlvbiBfY3JlYXRlU291cmNlKHR5cGUsIHVybCwgbWltZSkge1xuICAgIGlmICghbWltZSkge1xuICAgICAgbWltZSA9IHR5cGUgKyBcIi9cIiArIHRoaXMuX2dldEV4dGVuc2lvbih1cmwpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTtcbiAgICBzb3VyY2Uuc3JjID0gdXJsO1xuICAgIHNvdXJjZS50eXBlID0gbWltZTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsZWQgaWYgYSBsb2FkIGVycm9ycyBvdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGVycm9yIGV2ZW50IGZyb20gdGhlIGVsZW1lbnQgdGhhdCBlbWl0cyBpdC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX29uRXJyb3IgPSBmdW5jdGlvbiBfb25FcnJvcihldmVudCkge1xuICAgIHRoaXMuYWJvcnQoXCJGYWlsZWQgdG8gbG9hZCBlbGVtZW50IHVzaW5nOiBcIiArIGV2ZW50LnRhcmdldC5ub2RlTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGxlZCBpZiBhIGxvYWQgcHJvZ3Jlc3MgZXZlbnQgZmlyZXMgZm9yIGFuIGVsZW1lbnQgb3IgeGhyL3hkci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdFByb2dyZXNzRXZlbnR8RXZlbnR9IGV2ZW50IC0gUHJvZ3Jlc3MgZXZlbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9vblByb2dyZXNzID0gZnVuY3Rpb24gX29uUHJvZ3Jlc3MoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgICAgdGhpcy5vblByb2dyZXNzLmRpc3BhdGNoKHRoaXMsIGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGxlZCBpZiBhIHRpbWVvdXQgZXZlbnQgZmlyZXMgZm9yIGFuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9vblRpbWVvdXQgPSBmdW5jdGlvbiBfb25UaW1lb3V0KCkge1xuICAgIHRoaXMuYWJvcnQoXCJMb2FkIHRpbWVkIG91dC5cIik7XG4gIH1cbiAgLyoqXG4gICAqIENhbGxlZCBpZiBhbiBlcnJvciBldmVudCBmaXJlcyBmb3IgeGhyL3hkci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX3hock9uRXJyb3IgPSBmdW5jdGlvbiBfeGhyT25FcnJvcigpIHtcbiAgICB2YXIgeGhyID0gdGhpcy54aHI7XG4gICAgdGhpcy5hYm9ydChyZXFUeXBlKHhocikgKyBcIiBSZXF1ZXN0IGZhaWxlZC4gU3RhdHVzOiBcIiArIHhoci5zdGF0dXMgKyBcIiwgdGV4dDogXFxcIlwiICsgeGhyLnN0YXR1c1RleHQgKyBcIlxcXCJcIik7XG4gIH1cbiAgLyoqXG4gICAqIENhbGxlZCBpZiBhbiBlcnJvciBldmVudCBmaXJlcyBmb3IgeGhyL3hkci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX3hock9uVGltZW91dCA9IGZ1bmN0aW9uIF94aHJPblRpbWVvdXQoKSB7XG4gICAgdmFyIHhociA9IHRoaXMueGhyO1xuICAgIHRoaXMuYWJvcnQocmVxVHlwZSh4aHIpICsgXCIgUmVxdWVzdCB0aW1lZCBvdXQuXCIpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsZWQgaWYgYW4gYWJvcnQgZXZlbnQgZmlyZXMgZm9yIHhoci94ZHIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl94aHJPbkFib3J0ID0gZnVuY3Rpb24gX3hock9uQWJvcnQoKSB7XG4gICAgdmFyIHhociA9IHRoaXMueGhyO1xuICAgIHRoaXMuYWJvcnQocmVxVHlwZSh4aHIpICsgXCIgUmVxdWVzdCB3YXMgYWJvcnRlZCBieSB0aGUgdXNlci5cIik7XG4gIH1cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRhdGEgc3VjY2Vzc2Z1bGx5IGxvYWRzIGZyb20gYW4geGhyL3hkciByZXF1ZXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0TG9hZEV2ZW50fEV2ZW50fSBldmVudCAtIExvYWQgZXZlbnRcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX3hock9uTG9hZCA9IGZ1bmN0aW9uIF94aHJPbkxvYWQoKSB7XG4gICAgdmFyIHhociA9IHRoaXMueGhyO1xuICAgIHZhciB0ZXh0ID0gJyc7XG4gICAgdmFyIHN0YXR1cyA9IHR5cGVvZiB4aHIuc3RhdHVzID09PSAndW5kZWZpbmVkJyA/IFNUQVRVU19PSyA6IHhoci5zdGF0dXM7IC8vIFhEUiBoYXMgbm8gYC5zdGF0dXNgLCBhc3N1bWUgMjAwLlxuICAgIC8vIHJlc3BvbnNlVGV4dCBpcyBhY2Nlc3NpYmxlIG9ubHkgaWYgcmVzcG9uc2VUeXBlIGlzICcnIG9yICd0ZXh0JyBhbmQgb24gb2xkZXIgYnJvd3NlcnNcblxuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSAnJyB8fCB4aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgdHlwZW9mIHhoci5yZXNwb25zZVR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDtcbiAgICB9IC8vIHN0YXR1cyBjYW4gYmUgMCB3aGVuIHVzaW5nIHRoZSBgZmlsZTovL2AgcHJvdG9jb2wgc28gd2UgYWxzbyBjaGVjayBpZiBhIHJlc3BvbnNlIGlzIHNldC5cbiAgICAvLyBJZiBpdCBoYXMgYSByZXNwb25zZSwgd2UgYXNzdW1lIDIwMDsgb3RoZXJ3aXNlIGEgMCBzdGF0dXMgY29kZSB3aXRoIG5vIGNvbnRlbnRzIGlzIGFuIGFib3J0ZWQgcmVxdWVzdC5cblxuXG4gICAgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX05PTkUgJiYgKHRleHQubGVuZ3RoID4gMCB8fCB4aHIucmVzcG9uc2VUeXBlID09PSBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5CVUZGRVIpKSB7XG4gICAgICBzdGF0dXMgPSBTVEFUVVNfT0s7XG4gICAgfSAvLyBoYW5kbGUgSUU5IGJ1ZzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDA0Njk3Mi9tc2llLXJldHVybnMtc3RhdHVzLWNvZGUtb2YtMTIyMy1mb3ItYWpheC1yZXF1ZXN0XG4gICAgZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVNfSUVfQlVHX0VNUFRZKSB7XG4gICAgICAgIHN0YXR1cyA9IFNUQVRVU19FTVBUWTtcbiAgICAgIH1cblxuICAgIHZhciBzdGF0dXNUeXBlID0gc3RhdHVzIC8gMTAwIHwgMDtcblxuICAgIGlmIChzdGF0dXNUeXBlID09PSBTVEFUVVNfVFlQRV9PSykge1xuICAgICAgLy8gaWYgdGV4dCwganVzdCByZXR1cm4gaXRcbiAgICAgIGlmICh0aGlzLnhoclR5cGUgPT09IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLlRFWFQpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gUmVzb3VyY2UuVFlQRS5URVhUO1xuICAgICAgfSAvLyBpZiBqc29uLCBwYXJzZSBpbnRvIGpzb24gb2JqZWN0XG4gICAgICBlbHNlIGlmICh0aGlzLnhoclR5cGUgPT09IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkpTT04pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IFJlc291cmNlLlRZUEUuSlNPTjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KFwiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIGxvYWRlZCBqc29uOiBcIiArIGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBpZiB4bWwsIHBhcnNlIGludG8gYW4geG1sIGRvY3VtZW50IG9yIGRpdiBlbGVtZW50XG4gICAgICAgIGVsc2UgaWYgKHRoaXMueGhyVHlwZSA9PT0gUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuRE9DVU1FTlQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICh3aW5kb3cuRE9NUGFyc2VyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbXBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBkb21wYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBkaXY7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBSZXNvdXJjZS5UWVBFLlhNTDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hYm9ydChcIkVycm9yIHRyeWluZyB0byBwYXJzZSBsb2FkZWQgeG1sOiBcIiArIGUpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBvdGhlciB0eXBlcyBqdXN0IHJldHVybiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhID0geGhyLnJlc3BvbnNlIHx8IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWJvcnQoXCJbXCIgKyB4aHIuc3RhdHVzICsgXCJdIFwiICsgeGhyLnN0YXR1c1RleHQgKyBcIjogXCIgKyB4aHIucmVzcG9uc2VVUkwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGUoKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgYGNyb3NzT3JpZ2luYCBwcm9wZXJ0eSBmb3IgdGhpcyByZXNvdXJjZSBiYXNlZCBvbiBpZiB0aGUgdXJsXG4gICAqIGZvciB0aGlzIHJlc291cmNlIGlzIGNyb3NzLW9yaWdpbi4gSWYgY3Jvc3NPcmlnaW4gd2FzIG1hbnVhbGx5IHNldCwgdGhpc1xuICAgKiBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIHRvIHRlc3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbbG9jPXdpbmRvdy5sb2NhdGlvbl0gLSBUaGUgbG9jYXRpb24gb2JqZWN0IHRvIHRlc3QgYWdhaW5zdC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY3Jvc3NPcmlnaW4gdmFsdWUgdG8gdXNlIChvciBlbXB0eSBzdHJpbmcgZm9yIG5vbmUpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fZGV0ZXJtaW5lQ3Jvc3NPcmlnaW4gPSBmdW5jdGlvbiBfZGV0ZXJtaW5lQ3Jvc3NPcmlnaW4odXJsLCBsb2MpIHtcbiAgICAvLyBkYXRhOiBhbmQgamF2YXNjcmlwdDogdXJscyBhcmUgY29uc2lkZXJlZCBzYW1lLW9yaWdpblxuICAgIGlmICh1cmwuaW5kZXhPZignZGF0YTonKSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gQSBzYW5kYm94ZWQgaWZyYW1lIHdpdGhvdXQgdGhlICdhbGxvdy1zYW1lLW9yaWdpbicgYXR0cmlidXRlIHdpbGwgaGF2ZSBhIHNwZWNpYWxcbiAgICAvLyBvcmlnaW4gZGVzaWduZWQgbm90IHRvIG1hdGNoIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sIGFuZCB3aWxsIGFsd2F5cyByZXF1aXJlXG4gICAgLy8gY3Jvc3NPcmlnaW4gcmVxdWVzdHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBsb2NhdGlvbiBtYXRjaGVzLlxuXG5cbiAgICBpZiAod2luZG93Lm9yaWdpbiAhPT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgcmV0dXJuICdhbm9ueW1vdXMnO1xuICAgIH0gLy8gZGVmYXVsdCBpcyB3aW5kb3cubG9jYXRpb25cblxuXG4gICAgbG9jID0gbG9jIHx8IHdpbmRvdy5sb2NhdGlvbjtcblxuICAgIGlmICghdGVtcEFuY2hvcikge1xuICAgICAgdGVtcEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB9IC8vIGxldCB0aGUgYnJvd3NlciBkZXRlcm1pbmUgdGhlIGZ1bGwgaHJlZiBmb3IgdGhlIHVybCBvZiB0aGlzIHJlc291cmNlIGFuZCB0aGVuXG4gICAgLy8gcGFyc2Ugd2l0aCB0aGUgbm9kZSB1cmwgbGliLCB3ZSBjYW4ndCB1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFuY2hvciBlbGVtZW50XG4gICAgLy8gYmVjYXVzZSB0aGV5IGRvbid0IHdvcmsgaW4gSUU5IDooXG5cblxuICAgIHRlbXBBbmNob3IuaHJlZiA9IHVybDtcbiAgICB1cmwgPSBwYXJzZVVyaSh0ZW1wQW5jaG9yLmhyZWYsIHtcbiAgICAgIHN0cmljdE1vZGU6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgc2FtZVBvcnQgPSAhdXJsLnBvcnQgJiYgbG9jLnBvcnQgPT09ICcnIHx8IHVybC5wb3J0ID09PSBsb2MucG9ydDtcbiAgICB2YXIgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2wgPyB1cmwucHJvdG9jb2wgKyBcIjpcIiA6ICcnOyAvLyBpZiBjcm9zcyBvcmlnaW5cblxuICAgIGlmICh1cmwuaG9zdCAhPT0gbG9jLmhvc3RuYW1lIHx8ICFzYW1lUG9ydCB8fCBwcm90b2NvbCAhPT0gbG9jLnByb3RvY29sKSB7XG4gICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSByZXNwb25zZVR5cGUgb2YgYW4gWEhSIHJlcXVlc3QgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGVcbiAgICogcmVzb3VyY2UgYmVpbmcgbG9hZGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRX0gVGhlIHJlc3BvbnNlVHlwZSB0byB1c2UuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9kZXRlcm1pbmVYaHJUeXBlID0gZnVuY3Rpb24gX2RldGVybWluZVhoclR5cGUoKSB7XG4gICAgcmV0dXJuIFJlc291cmNlLl94aHJUeXBlTWFwW3RoaXMuZXh0ZW5zaW9uXSB8fCBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5URVhUO1xuICB9XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBsb2FkVHlwZSBvZiBhIHJlc291cmNlIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlXG4gICAqIHJlc291cmNlIGJlaW5nIGxvYWRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybiB7UmVzb3VyY2UuTE9BRF9UWVBFfSBUaGUgbG9hZFR5cGUgdG8gdXNlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fZGV0ZXJtaW5lTG9hZFR5cGUgPSBmdW5jdGlvbiBfZGV0ZXJtaW5lTG9hZFR5cGUoKSB7XG4gICAgcmV0dXJuIFJlc291cmNlLl9sb2FkVHlwZU1hcFt0aGlzLmV4dGVuc2lvbl0gfHwgUmVzb3VyY2UuTE9BRF9UWVBFLlhIUjtcbiAgfVxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGV4dGVuc2lvbiAoc2FucyAnLicpIG9mIHRoZSBmaWxlIGJlaW5nIGxvYWRlZCBieSB0aGUgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGV4dGVuc2lvbi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uX2dldEV4dGVuc2lvbiA9IGZ1bmN0aW9uIF9nZXRFeHRlbnNpb24oKSB7XG4gICAgdmFyIHVybCA9IHRoaXMudXJsO1xuICAgIHZhciBleHQgPSAnJztcblxuICAgIGlmICh0aGlzLmlzRGF0YVVybCkge1xuICAgICAgdmFyIHNsYXNoSW5kZXggPSB1cmwuaW5kZXhPZignLycpO1xuICAgICAgZXh0ID0gdXJsLnN1YnN0cmluZyhzbGFzaEluZGV4ICsgMSwgdXJsLmluZGV4T2YoJzsnLCBzbGFzaEluZGV4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIHZhciBoYXNoU3RhcnQgPSB1cmwuaW5kZXhPZignIycpO1xuICAgICAgdmFyIGluZGV4ID0gTWF0aC5taW4ocXVlcnlTdGFydCA+IC0xID8gcXVlcnlTdGFydCA6IHVybC5sZW5ndGgsIGhhc2hTdGFydCA+IC0xID8gaGFzaFN0YXJ0IDogdXJsLmxlbmd0aCk7XG4gICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgIGV4dCA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG1pbWUgdHlwZSBvZiBhbiBYSFIgcmVxdWVzdCBiYXNlZCBvbiB0aGUgcmVzcG9uc2VUeXBlIG9mXG4gICAqIHJlc291cmNlIGJlaW5nIGxvYWRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRX0gdHlwZSAtIFRoZSB0eXBlIHRvIGdldCBhIG1pbWUgdHlwZSBmb3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1pbWUgdHlwZSB0byB1c2UuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9nZXRNaW1lRnJvbVhoclR5cGUgPSBmdW5jdGlvbiBfZ2V0TWltZUZyb21YaHJUeXBlKHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuQlVGRkVSOlxuICAgICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LWJpbmFyeSc7XG5cbiAgICAgIGNhc2UgUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuQkxPQjpcbiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi9ibG9iJztcblxuICAgICAgY2FzZSBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVDpcbiAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi94bWwnO1xuXG4gICAgICBjYXNlIFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkpTT046XG4gICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgIGNhc2UgUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuREVGQVVMVDpcbiAgICAgIGNhc2UgUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuVEVYVDpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJztcbiAgICB9XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFJlc291cmNlLCBbe1xuICAgIGtleTogXCJpc0RhdGFVcmxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYXNGbGFnKFJlc291cmNlLlNUQVRVU19GTEFHUy5EQVRBX1VSTCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlcyBpZiB0aGlzIHJlc291cmNlIGhhcyBmaW5pc2hlZCBsb2FkaW5nLiBJcyB0cnVlIHdoZW4gdGhlIHJlc291cmNlIGhhcyBjb21wbGV0ZWx5XG4gICAgICogbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzQ29tcGxldGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYXNGbGFnKFJlc291cmNlLlNUQVRVU19GTEFHUy5DT01QTEVURSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc2NyaWJlcyBpZiB0aGlzIHJlc291cmNlIGlzIGN1cnJlbnRseSBsb2FkaW5nLiBJcyB0cnVlIHdoZW4gdGhlIHJlc291cmNlIHN0YXJ0cyBsb2FkaW5nLFxuICAgICAqIGFuZCBpcyBmYWxzZSBhZ2FpbiB3aGVuIGNvbXBsZXRlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzTG9hZGluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoUmVzb3VyY2UuU1RBVFVTX0ZMQUdTLkxPQURJTkcpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXNvdXJjZTtcbn0oKTtcbi8qKlxuICogVGhlIHR5cGVzIG9mIHJlc291cmNlcyBhIHJlc291cmNlIGNvdWxkIHJlcHJlc2VudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cblxuXG5SZXNvdXJjZS5TVEFUVVNfRkxBR1MgPSB7XG4gIE5PTkU6IDAsXG4gIERBVEFfVVJMOiAxIDw8IDAsXG4gIENPTVBMRVRFOiAxIDw8IDEsXG4gIExPQURJTkc6IDEgPDwgMlxufTtcbi8qKlxuICogVGhlIHR5cGVzIG9mIHJlc291cmNlcyBhIHJlc291cmNlIGNvdWxkIHJlcHJlc2VudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cblxuUmVzb3VyY2UuVFlQRSA9IHtcbiAgVU5LTk9XTjogMCxcbiAgSlNPTjogMSxcbiAgWE1MOiAyLFxuICBJTUFHRTogMyxcbiAgQVVESU86IDQsXG4gIFZJREVPOiA1LFxuICBURVhUOiA2XG59O1xuLyoqXG4gKiBUaGUgdHlwZXMgb2YgbG9hZGluZyBhIHJlc291cmNlIGNhbiB1c2UuXG4gKlxuICogQHN0YXRpY1xuICogQHJlYWRvbmx5XG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG5cblJlc291cmNlLkxPQURfVFlQRSA9IHtcbiAgLyoqIFVzZXMgWE1MSHR0cFJlcXVlc3QgdG8gbG9hZCB0aGUgcmVzb3VyY2UuICovXG4gIFhIUjogMSxcblxuICAvKiogVXNlcyBhbiBgSW1hZ2VgIG9iamVjdCB0byBsb2FkIHRoZSByZXNvdXJjZS4gKi9cbiAgSU1BR0U6IDIsXG5cbiAgLyoqIFVzZXMgYW4gYEF1ZGlvYCBvYmplY3QgdG8gbG9hZCB0aGUgcmVzb3VyY2UuICovXG4gIEFVRElPOiAzLFxuXG4gIC8qKiBVc2VzIGEgYFZpZGVvYCBvYmplY3QgdG8gbG9hZCB0aGUgcmVzb3VyY2UuICovXG4gIFZJREVPOiA0XG59O1xuLyoqXG4gKiBUaGUgWEhSIHJlYWR5IHN0YXRlcywgdXNlZCBpbnRlcm5hbGx5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEByZWFkb25seVxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuXG5SZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRSA9IHtcbiAgLyoqIHN0cmluZyAqL1xuICBERUZBVUxUOiAndGV4dCcsXG5cbiAgLyoqIEFycmF5QnVmZmVyICovXG4gIEJVRkZFUjogJ2FycmF5YnVmZmVyJyxcblxuICAvKiogQmxvYiAqL1xuICBCTE9COiAnYmxvYicsXG5cbiAgLyoqIERvY3VtZW50ICovXG4gIERPQ1VNRU5UOiAnZG9jdW1lbnQnLFxuXG4gIC8qKiBPYmplY3QgKi9cbiAgSlNPTjogJ2pzb24nLFxuXG4gIC8qKiBTdHJpbmcgKi9cbiAgVEVYVDogJ3RleHQnXG59O1xuUmVzb3VyY2UuX2xvYWRUeXBlTWFwID0ge1xuICAvLyBpbWFnZXNcbiAgZ2lmOiBSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0UsXG4gIHBuZzogUmVzb3VyY2UuTE9BRF9UWVBFLklNQUdFLFxuICBibXA6IFJlc291cmNlLkxPQURfVFlQRS5JTUFHRSxcbiAganBnOiBSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0UsXG4gIGpwZWc6IFJlc291cmNlLkxPQURfVFlQRS5JTUFHRSxcbiAgdGlmOiBSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0UsXG4gIHRpZmY6IFJlc291cmNlLkxPQURfVFlQRS5JTUFHRSxcbiAgd2VicDogUmVzb3VyY2UuTE9BRF9UWVBFLklNQUdFLFxuICB0Z2E6IFJlc291cmNlLkxPQURfVFlQRS5JTUFHRSxcbiAgc3ZnOiBSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0UsXG4gICdzdmcreG1sJzogUmVzb3VyY2UuTE9BRF9UWVBFLklNQUdFLFxuICAvLyBmb3IgU1ZHIGRhdGEgdXJsc1xuICAvLyBhdWRpb1xuICBtcDM6IFJlc291cmNlLkxPQURfVFlQRS5BVURJTyxcbiAgb2dnOiBSZXNvdXJjZS5MT0FEX1RZUEUuQVVESU8sXG4gIHdhdjogUmVzb3VyY2UuTE9BRF9UWVBFLkFVRElPLFxuICAvLyB2aWRlb3NcbiAgbXA0OiBSZXNvdXJjZS5MT0FEX1RZUEUuVklERU8sXG4gIHdlYm06IFJlc291cmNlLkxPQURfVFlQRS5WSURFT1xufTtcblJlc291cmNlLl94aHJUeXBlTWFwID0ge1xuICAvLyB4bWxcbiAgeGh0bWw6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkRPQ1VNRU5ULFxuICBodG1sOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCxcbiAgaHRtOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCxcbiAgeG1sOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCxcbiAgdG14OiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCxcbiAgc3ZnOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ET0NVTUVOVCxcbiAgLy8gVGhpcyB3YXMgYWRkZWQgdG8gaGFuZGxlIFRpbGVkIFRpbGVzZXQgWE1MLCBidXQgLnRzeCBpcyBhbHNvIGEgVHlwZVNjcmlwdCBSZWFjdCBDb21wb25lbnQuXG4gIC8vIFNpbmNlIGl0IGlzIHdheSBsZXNzIGxpa2VseSBmb3IgcGVvcGxlIHRvIGJlIGxvYWRpbmcgVHlwZVNjcmlwdCBmaWxlcyBpbnN0ZWFkIG9mIFRpbGVkIGZpbGVzLFxuICAvLyB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBmaW5lLlxuICB0c3g6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkRPQ1VNRU5ULFxuICAvLyBpbWFnZXNcbiAgZ2lmOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5CTE9CLFxuICBwbmc6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkJMT0IsXG4gIGJtcDogUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuQkxPQixcbiAganBnOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5CTE9CLFxuICBqcGVnOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5CTE9CLFxuICB0aWY6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkJMT0IsXG4gIHRpZmY6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkJMT0IsXG4gIHdlYnA6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkJMT0IsXG4gIHRnYTogUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuQkxPQixcbiAgLy8ganNvblxuICBqc29uOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5KU09OLFxuICAvLyB0ZXh0XG4gIHRleHQ6IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLlRFWFQsXG4gIHR4dDogUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuVEVYVCxcbiAgLy8gZm9udHNcbiAgdHRmOiBSZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5CVUZGRVIsXG4gIG90ZjogUmVzb3VyY2UuWEhSX1JFU1BPTlNFX1RZUEUuQlVGRkVSXG59OyAvLyBXZSBjYW4ndCBzZXQgdGhlIGBzcmNgIGF0dHJpYnV0ZSB0byBlbXB0eSBzdHJpbmcsIHNvIG9uIGFib3J0IHdlIHNldCBpdCB0byB0aGlzIDFweCB0cmFuc3BhcmVudCBnaWZcblxuUmVzb3VyY2UuRU1QVFlfR0lGID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQVAvLy93QUFBQ0g1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlDUkFFQU93PT0nO1xuLyoqXG4gKiBRdWljayBoZWxwZXIgdG8gc2V0IGEgdmFsdWUgb24gb25lIG9mIHRoZSBleHRlbnNpb24gbWFwcy4gRW5zdXJlcyB0aGVyZSBpcyBub1xuICogZG90IGF0IHRoZSBzdGFydCBvZiB0aGUgZXh0ZW5zaW9uLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBtYXAgLSBUaGUgbWFwIHRvIHNldCBvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRuYW1lIC0gVGhlIGV4dGVuc2lvbiAob3Iga2V5KSB0byBzZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAqL1xuXG5mdW5jdGlvbiBzZXRFeHRNYXAobWFwLCBleHRuYW1lLCB2YWwpIHtcbiAgaWYgKGV4dG5hbWUgJiYgZXh0bmFtZS5pbmRleE9mKCcuJykgPT09IDApIHtcbiAgICBleHRuYW1lID0gZXh0bmFtZS5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICBpZiAoIWV4dG5hbWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBtYXBbZXh0bmFtZV0gPSB2YWw7XG59XG4vKipcbiAqIFF1aWNrIGhlbHBlciB0byBnZXQgc3RyaW5nIHhociB0eXBlLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R8WERvbWFpblJlcXVlc3R9IHhociAtIFRoZSByZXF1ZXN0IHRvIGNoZWNrLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHJlcVR5cGUoeGhyKSB7XG4gIHJldHVybiB4aHIudG9TdHJpbmcoKS5yZXBsYWNlKCdvYmplY3QgJywgJycpO1xufVxuXG52YXIgX2tleVN0ciA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4vKipcbiAqIEVuY29kZXMgYmluYXJ5IGludG8gYmFzZTY0LlxuICpcbiAqIEBmdW5jdGlvbiBlbmNvZGVCaW5hcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBUaGUgaW5wdXQgZGF0YSB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBiYXNlNjQgc3RyaW5nXG4gKi9cblxuZnVuY3Rpb24gZW5jb2RlQmluYXJ5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSAnJztcbiAgdmFyIGlueCA9IDA7XG5cbiAgd2hpbGUgKGlueCA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIEZpbGwgYnl0ZSBidWZmZXIgYXJyYXlcbiAgICB2YXIgYnl0ZWJ1ZmZlciA9IFswLCAwLCAwXTtcbiAgICB2YXIgZW5jb2RlZENoYXJJbmRleGVzID0gWzAsIDAsIDAsIDBdO1xuXG4gICAgZm9yICh2YXIgam54ID0gMDsgam54IDwgYnl0ZWJ1ZmZlci5sZW5ndGg7ICsram54KSB7XG4gICAgICBpZiAoaW54IDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIC8vIHRocm93IGF3YXkgaGlnaC1vcmRlciBieXRlLCBhcyBkb2N1bWVudGVkIGF0OlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9Fbi9Vc2luZ19YTUxIdHRwUmVxdWVzdCNIYW5kbGluZ19iaW5hcnlfZGF0YVxuICAgICAgICBieXRlYnVmZmVyW2pueF0gPSBpbnB1dC5jaGFyQ29kZUF0KGlueCsrKSAmIDB4ZmY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieXRlYnVmZmVyW2pueF0gPSAwO1xuICAgICAgfVxuICAgIH0gLy8gR2V0IGVhY2ggZW5jb2RlZCBjaGFyYWN0ZXIsIDYgYml0cyBhdCBhIHRpbWVcbiAgICAvLyBpbmRleCAxOiBmaXJzdCA2IGJpdHNcblxuXG4gICAgZW5jb2RlZENoYXJJbmRleGVzWzBdID0gYnl0ZWJ1ZmZlclswXSA+PiAyOyAvLyBpbmRleCAyOiBzZWNvbmQgNiBiaXRzICgyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgZnJvbSBpbnB1dCBieXRlIDEgKyA0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBmcm9tIGJ5dGUgMilcblxuICAgIGVuY29kZWRDaGFySW5kZXhlc1sxXSA9IChieXRlYnVmZmVyWzBdICYgMHgzKSA8PCA0IHwgYnl0ZWJ1ZmZlclsxXSA+PiA0OyAvLyBpbmRleCAzOiB0aGlyZCA2IGJpdHMgKDQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBmcm9tIGlucHV0IGJ5dGUgMiArIDIgbW9zdCBzaWduaWZpY2FudCBiaXRzIGZyb20gYnl0ZSAzKVxuXG4gICAgZW5jb2RlZENoYXJJbmRleGVzWzJdID0gKGJ5dGVidWZmZXJbMV0gJiAweDBmKSA8PCAyIHwgYnl0ZWJ1ZmZlclsyXSA+PiA2OyAvLyBpbmRleCAzOiBmb3J0aCA2IGJpdHMgKDYgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBmcm9tIGlucHV0IGJ5dGUgMylcblxuICAgIGVuY29kZWRDaGFySW5kZXhlc1szXSA9IGJ5dGVidWZmZXJbMl0gJiAweDNmOyAvLyBEZXRlcm1pbmUgd2hldGhlciBwYWRkaW5nIGhhcHBlbmVkLCBhbmQgYWRqdXN0IGFjY29yZGluZ2x5XG5cbiAgICB2YXIgcGFkZGluZ0J5dGVzID0gaW54IC0gKGlucHV0Lmxlbmd0aCAtIDEpO1xuXG4gICAgc3dpdGNoIChwYWRkaW5nQnl0ZXMpIHtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gU2V0IGxhc3QgMiBjaGFyYWN0ZXJzIHRvIHBhZGRpbmcgY2hhclxuICAgICAgICBlbmNvZGVkQ2hhckluZGV4ZXNbM10gPSA2NDtcbiAgICAgICAgZW5jb2RlZENoYXJJbmRleGVzWzJdID0gNjQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8vIFNldCBsYXN0IGNoYXJhY3RlciB0byBwYWRkaW5nIGNoYXJcbiAgICAgICAgZW5jb2RlZENoYXJJbmRleGVzWzNdID0gNjQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICAgIC8vIE5vIHBhZGRpbmcgLSBwcm9jZWVkXG4gICAgfSAvLyBOb3cgd2Ugd2lsbCBncmFiIGVhY2ggYXBwcm9wcmlhdGUgY2hhcmFjdGVyIG91dCBvZiBvdXIga2V5c3RyaW5nXG4gICAgLy8gYmFzZWQgb24gb3VyIGluZGV4IGFycmF5IGFuZCBhcHBlbmQgaXQgdG8gdGhlIG91dHB1dCBzdHJpbmdcblxuXG4gICAgZm9yICh2YXIgX2pueCA9IDA7IF9qbnggPCBlbmNvZGVkQ2hhckluZGV4ZXMubGVuZ3RoOyArK19qbngpIHtcbiAgICAgIG91dHB1dCArPSBfa2V5U3RyLmNoYXJBdChlbmNvZGVkQ2hhckluZGV4ZXNbX2pueF0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbnZhciBVcmwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XG4vKipcbiAqIEEgbWlkZGxld2FyZSBmb3IgdHJhbnNmb3JtaW5nIFhIUiBsb2FkZWQgQmxvYnMgaW50byBtb3JlIHVzZWZ1bCBvYmplY3RzXG4gKlxuICogQG1lbWJlcm9mIG1pZGRsZXdhcmVcbiAqIEBmdW5jdGlvbiBwYXJzaW5nXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgTG9hZGVyLCBtaWRkbGV3YXJlIH0gZnJvbSAncmVzb3VyY2UtbG9hZGVyJztcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBMb2FkZXIoKTtcbiAqIGxvYWRlci51c2UobWlkZGxld2FyZS5wYXJzaW5nKTtcbiAqIEBwYXJhbSB7UmVzb3VyY2V9IHJlc291cmNlIC0gQ3VycmVudCBSZXNvdXJjZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbmV4dCAtIENhbGxiYWNrIHdoZW4gY29tcGxldGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzaW5nKHJlc291cmNlLCBuZXh0KSB7XG4gIGlmICghcmVzb3VyY2UuZGF0YSkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH0gLy8gaWYgdGhpcyB3YXMgYW4gWEhSIGxvYWQgb2YgYSBibG9iXG5cblxuICBpZiAocmVzb3VyY2UueGhyICYmIHJlc291cmNlLnhoclR5cGUgPT09IFJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkJMT0IpIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBibG9iIHN1cHBvcnQgd2UgcHJvYmFibHkgZ290IGEgYmluYXJ5IHN0cmluZyBiYWNrXG4gICAgaWYgKCF3aW5kb3cuQmxvYiB8fCB0eXBlb2YgcmVzb3VyY2UuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciB0eXBlID0gcmVzb3VyY2UueGhyLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKTsgLy8gdGhpcyBpcyBhbiBpbWFnZSwgY29udmVydCB0aGUgYmluYXJ5IHN0cmluZyBpbnRvIGEgZGF0YSB1cmxcblxuICAgICAgaWYgKHR5cGUgJiYgdHlwZS5pbmRleE9mKCdpbWFnZScpID09PSAwKSB7XG4gICAgICAgIHJlc291cmNlLmRhdGEgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgcmVzb3VyY2UuZGF0YS5zcmMgPSBcImRhdGE6XCIgKyB0eXBlICsgXCI7YmFzZTY0LFwiICsgZW5jb2RlQmluYXJ5KHJlc291cmNlLnhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICByZXNvdXJjZS50eXBlID0gUmVzb3VyY2UuVFlQRS5JTUFHRTsgLy8gd2FpdCB1bnRpbCB0aGUgaW1hZ2UgbG9hZHMgYW5kIHRoZW4gY2FsbGJhY2tcblxuICAgICAgICByZXNvdXJjZS5kYXRhLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXNvdXJjZS5kYXRhLm9ubG9hZCA9IG51bGw7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9OyAvLyBuZXh0IHdpbGwgYmUgY2FsbGVkIG9uIGxvYWRcblxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IC8vIGlmIGNvbnRlbnQgdHlwZSBzYXlzIHRoaXMgaXMgYW4gaW1hZ2UsIHRoZW4gd2Ugc2hvdWxkIHRyYW5zZm9ybSB0aGUgYmxvYiBpbnRvIGFuIEltYWdlIG9iamVjdFxuICAgIGVsc2UgaWYgKHJlc291cmNlLmRhdGEudHlwZS5pbmRleE9mKCdpbWFnZScpID09PSAwKSB7XG4gICAgICAgIHZhciBzcmMgPSBVcmwuY3JlYXRlT2JqZWN0VVJMKHJlc291cmNlLmRhdGEpO1xuICAgICAgICByZXNvdXJjZS5ibG9iID0gcmVzb3VyY2UuZGF0YTtcbiAgICAgICAgcmVzb3VyY2UuZGF0YSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICByZXNvdXJjZS5kYXRhLnNyYyA9IHNyYztcbiAgICAgICAgcmVzb3VyY2UudHlwZSA9IFJlc291cmNlLlRZUEUuSU1BR0U7IC8vIGNsZWFudXAgdGhlIG5vIGxvbmdlciB1c2VkIGJsb2IgYWZ0ZXIgdGhlIGltYWdlIGxvYWRzXG4gICAgICAgIC8vIFRPRE86IElzIHRoaXMgY29ycmVjdD8gV2lsbCB0aGUgaW1hZ2UgYmUgaW52YWxpZCBhZnRlciByZXZva2luZz9cblxuICAgICAgICByZXNvdXJjZS5kYXRhLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBVcmwucmV2b2tlT2JqZWN0VVJMKHNyYyk7XG4gICAgICAgICAgcmVzb3VyY2UuZGF0YS5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfTsgLy8gbmV4dCB3aWxsIGJlIGNhbGxlZCBvbiBsb2FkLlxuXG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG5cbiAgbmV4dCgpO1xufVxuXG4vKipcbiAqIEBuYW1lc3BhY2UgbWlkZGxld2FyZVxuICovXG5cbnZhciBpbmRleCA9ICh7XG4gICAgY2FjaGluZzogY2FjaGluZyxcbiAgICBwYXJzaW5nOiBwYXJzaW5nXG59KTtcblxudmFyIE1BWF9QUk9HUkVTUyA9IDEwMDtcbnZhciByZ3hFeHRyYWN0VXJsSGFzaCA9IC8oI1tcXHctXSspPyQvO1xuLyoqXG4gKiBNYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgbG9hZGluZyBvZiBtdWx0aXBsZSByZXNvdXJjZXMgdG8gbG9hZC5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuXG52YXIgTG9hZGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVVybD0nJ10gLSBUaGUgYmFzZSB1cmwgZm9yIGFsbCByZXNvdXJjZXMgbG9hZGVkIGJ5IHRoaXMgbG9hZGVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2NvbmN1cnJlbmN5PTEwXSAtIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGxvYWQgY29uY3VycmVudGx5LlxuICAgKi9cbiAgZnVuY3Rpb24gTG9hZGVyKGJhc2VVcmwsIGNvbmN1cnJlbmN5KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChiYXNlVXJsID09PSB2b2lkIDApIHtcbiAgICAgIGJhc2VVcmwgPSAnJztcbiAgICB9XG5cbiAgICBpZiAoY29uY3VycmVuY3kgPT09IHZvaWQgMCkge1xuICAgICAgY29uY3VycmVuY3kgPSAxMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSB1cmwgZm9yIGFsbCByZXNvdXJjZXMgbG9hZGVkIGJ5IHRoaXMgbG9hZGVyLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2dyZXNzIHBlcmNlbnQgb2YgdGhlIGxvYWRlciBnb2luZyB0aHJvdWdoIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG5cbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAvKipcbiAgICAgKiBMb2FkaW5nIHN0YXRlIG9mIHRoZSBsb2FkZXIsIHRydWUgaWYgaXQgaXMgY3VycmVudGx5IGxvYWRpbmcgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQSBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gZXZlcnkgVVJMIGFkZGVkIHRvIHRoZSBsb2FkZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIHNob3VsZCBiZSBhIHZhbGlkIHF1ZXJ5IHN0cmluZyAqd2l0aG91dCogdGhlIHF1ZXN0aW9uLW1hcmsgKGA/YCkuIFRoZSBsb2FkZXIgd2lsbFxuICAgICAqIGFsc28gKm5vdCogZXNjYXBlIHZhbHVlcyBmb3IgeW91LiBNYWtlIHN1cmUgdG8gZXNjYXBlIHlvdXIgcGFyYW1ldGVycyB3aXRoXG4gICAgICogW2BlbmNvZGVVUklDb21wb25lbnRgXShodHRwczovL21kbi5pby9lbmNvZGVVUklDb21wb25lbnQpIGJlZm9yZSBhc3NpZ25pbmcgdGhpcyBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbG9hZGVyID0gbmV3IExvYWRlcigpO1xuICAgICAqXG4gICAgICogbG9hZGVyLmRlZmF1bHRRdWVyeVN0cmluZyA9ICd1c2VyPW1lJnBhc3N3b3JkPXNlY3JldCc7XG4gICAgICpcbiAgICAgKiAvLyBUaGlzIHdpbGwgcmVxdWVzdCAnaW1hZ2UucG5nP3VzZXI9bWUmcGFzc3dvcmQ9c2VjcmV0J1xuICAgICAqIGxvYWRlci5hZGQoJ2ltYWdlLnBuZycpLmxvYWQoKTtcbiAgICAgKlxuICAgICAqIGxvYWRlci5yZXNldCgpO1xuICAgICAqXG4gICAgICogLy8gVGhpcyB3aWxsIHJlcXVlc3QgJ2ltYWdlLnBuZz92PTEmdXNlcj1tZSZwYXNzd29yZD1zZWNyZXQnXG4gICAgICogbG9hZGVyLmFkZCgnaWFtZ2UucG5nP3Y9MScpLmxvYWQoKTtcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAqL1xuXG4gICAgdGhpcy5kZWZhdWx0UXVlcnlTdHJpbmcgPSAnJztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxld2FyZSB0byBydW4gYmVmb3JlIGxvYWRpbmcgZWFjaCByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7ZnVuY3Rpb25bXX1cbiAgICAgKi9cblxuICAgIHRoaXMuX2JlZm9yZU1pZGRsZXdhcmUgPSBbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxld2FyZSB0byBydW4gYWZ0ZXIgbG9hZGluZyBlYWNoIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyIHtmdW5jdGlvbltdfVxuICAgICAqL1xuXG4gICAgdGhpcy5fYWZ0ZXJNaWRkbGV3YXJlID0gW107XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyB0aGUgcmVzb3VyY2VzIHdlIGFyZSBjdXJyZW50bHkgY29tcGxldGluZyBwYXJzaW5nIGZvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7UmVzb3VyY2VbXX1cbiAgICAgKi9cblxuICAgIHRoaXMuX3Jlc291cmNlc1BhcnNpbmcgPSBbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgYF9sb2FkUmVzb3VyY2VgIGZ1bmN0aW9uIGJvdW5kIHdpdGggdGhpcyBvYmplY3QgY29udGV4dC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7ZnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtSZXNvdXJjZX0gciAtIFRoZSByZXNvdXJjZSB0byBsb2FkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZCAtIFRoZSBkZXF1ZXVlIGZ1bmN0aW9uXG4gICAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgICAqL1xuXG4gICAgdGhpcy5fYm91bmRMb2FkUmVzb3VyY2UgPSBmdW5jdGlvbiAociwgZCkge1xuICAgICAgcmV0dXJuIF90aGlzLl9sb2FkUmVzb3VyY2UociwgZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVzb3VyY2VzIHdhaXRpbmcgdG8gYmUgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbWVtYmVyIHtSZXNvdXJjZVtdfVxuICAgICAqL1xuXG5cbiAgICB0aGlzLl9xdWV1ZSA9IHF1ZXVlKHRoaXMuX2JvdW5kTG9hZFJlc291cmNlLCBjb25jdXJyZW5jeSk7XG5cbiAgICB0aGlzLl9xdWV1ZS5wYXVzZSgpO1xuICAgIC8qKlxuICAgICAqIEFsbCB0aGUgcmVzb3VyY2VzIGZvciB0aGlzIGxvYWRlciBrZXllZCBieSBuYW1lLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7b2JqZWN0PHN0cmluZywgUmVzb3VyY2U+fVxuICAgICAqL1xuXG5cbiAgICB0aGlzLnJlc291cmNlcyA9IHt9O1xuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZWQgb25jZSBwZXIgbG9hZGVkIG9yIGVycm9yZWQgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBUaGUgY2FsbGJhY2sgbG9va3MgbGlrZSB7QGxpbmsgTG9hZGVyLk9uUHJvZ3Jlc3NTaWduYWx9LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7U2lnbmFsPExvYWRlci5PblByb2dyZXNzU2lnbmFsPn1cbiAgICAgKi9cblxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG5ldyBTaWduYWwoKTtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIG9uY2UgcGVyIGVycm9yZWQgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBUaGUgY2FsbGJhY2sgbG9va3MgbGlrZSB7QGxpbmsgTG9hZGVyLk9uRXJyb3JTaWduYWx9LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7U2lnbmFsPExvYWRlci5PbkVycm9yU2lnbmFsPn1cbiAgICAgKi9cblxuICAgIHRoaXMub25FcnJvciA9IG5ldyBTaWduYWwoKTtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVkIG9uY2UgcGVyIGxvYWRlZCByZXNvdXJjZS5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBsb29rcyBsaWtlIHtAbGluayBMb2FkZXIuT25Mb2FkU2lnbmFsfS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1NpZ25hbDxMb2FkZXIuT25Mb2FkU2lnbmFsPn1cbiAgICAgKi9cblxuICAgIHRoaXMub25Mb2FkID0gbmV3IFNpZ25hbCgpO1xuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZWQgd2hlbiB0aGUgbG9hZGVyIGJlZ2lucyB0byBwcm9jZXNzIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBsb29rcyBsaWtlIHtAbGluayBMb2FkZXIuT25TdGFydFNpZ25hbH0uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtTaWduYWw8TG9hZGVyLk9uU3RhcnRTaWduYWw+fVxuICAgICAqL1xuXG4gICAgdGhpcy5vblN0YXJ0ID0gbmV3IFNpZ25hbCgpO1xuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZWQgd2hlbiB0aGUgcXVldWVkIHJlc291cmNlcyBhbGwgbG9hZC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBsb29rcyBsaWtlIHtAbGluayBMb2FkZXIuT25Db21wbGV0ZVNpZ25hbH0uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtTaWduYWw8TG9hZGVyLk9uQ29tcGxldGVTaWduYWw+fVxuICAgICAqL1xuXG4gICAgdGhpcy5vbkNvbXBsZXRlID0gbmV3IFNpZ25hbCgpOyAvLyBBZGQgZGVmYXVsdCBiZWZvcmUgbWlkZGxld2FyZVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBMb2FkZXIuX2RlZmF1bHRCZWZvcmVNaWRkbGV3YXJlLmxlbmd0aDsgKytpKSB7XG4gICAgICB0aGlzLnByZShMb2FkZXIuX2RlZmF1bHRCZWZvcmVNaWRkbGV3YXJlW2ldKTtcbiAgICB9IC8vIEFkZCBkZWZhdWx0IGFmdGVyIG1pZGRsZXdhcmVcblxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IExvYWRlci5fZGVmYXVsdEFmdGVyTWlkZGxld2FyZS5sZW5ndGg7ICsrX2kpIHtcbiAgICAgIHRoaXMudXNlKExvYWRlci5fZGVmYXVsdEFmdGVyTWlkZGxld2FyZVtfaV0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogV2hlbiB0aGUgcHJvZ3Jlc3MgY2hhbmdlcyB0aGUgbG9hZGVyIGFuZCByZXNvdXJjZSBhcmUgZGlzYXB0Y2hlZC5cbiAgICpcbiAgICogQG1lbWJlcm9mIExvYWRlclxuICAgKiBAY2FsbGJhY2sgT25Qcm9ncmVzc1NpZ25hbFxuICAgKiBAcGFyYW0ge0xvYWRlcn0gbG9hZGVyIC0gVGhlIGxvYWRlciB0aGUgcHJvZ3Jlc3MgaXMgYWR2YW5jaW5nIG9uLlxuICAgKiBAcGFyYW0ge1Jlc291cmNlfSByZXNvdXJjZSAtIFRoZSByZXNvdXJjZSB0aGF0IGhhcyBjb21wbGV0ZWQgb3IgZmFpbGVkIHRvIGNhdXNlIHRoZSBwcm9ncmVzcyB0byBhZHZhbmNlLlxuICAgKi9cblxuICAvKipcbiAgICogV2hlbiBhbiBlcnJvciBvY2N1cnJzIHRoZSBsb2FkZXIgYW5kIHJlc291cmNlIGFyZSBkaXNhcHRjaGVkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgTG9hZGVyXG4gICAqIEBjYWxsYmFjayBPbkVycm9yU2lnbmFsXG4gICAqIEBwYXJhbSB7TG9hZGVyfSBsb2FkZXIgLSBUaGUgbG9hZGVyIHRoZSBlcnJvciBoYXBwZW5lZCBpbi5cbiAgICogQHBhcmFtIHtSZXNvdXJjZX0gcmVzb3VyY2UgLSBUaGUgcmVzb3VyY2UgdGhhdCBjYXVzZWQgdGhlIGVycm9yLlxuICAgKi9cblxuICAvKipcbiAgICogV2hlbiBhIGxvYWQgY29tcGxldGVzIHRoZSBsb2FkZXIgYW5kIHJlc291cmNlIGFyZSBkaXNhcHRjaGVkLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgTG9hZGVyXG4gICAqIEBjYWxsYmFjayBPbkxvYWRTaWduYWxcbiAgICogQHBhcmFtIHtMb2FkZXJ9IGxvYWRlciAtIFRoZSBsb2FkZXIgdGhhdCBsYW9kZWQgdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge1Jlc291cmNlfSByZXNvdXJjZSAtIFRoZSByZXNvdXJjZSB0aGF0IGhhcyBjb21wbGV0ZWQgbG9hZGluZy5cbiAgICovXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGxvYWRlciBzdGFydHMgbG9hZGluZyByZXNvdXJjZXMgaXQgZGlzcGF0Y2hlcyB0aGlzIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAbWVtYmVyb2YgTG9hZGVyXG4gICAqIEBjYWxsYmFjayBPblN0YXJ0U2lnbmFsXG4gICAqIEBwYXJhbSB7TG9hZGVyfSBsb2FkZXIgLSBUaGUgbG9hZGVyIHRoYXQgaGFzIHN0YXJ0ZWQgbG9hZGluZyByZXNvdXJjZXMuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBsb2FkZXIgY29tcGxldGVzIGxvYWRpbmcgcmVzb3VyY2VzIGl0IGRpc3BhdGNoZXMgdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQG1lbWJlcm9mIExvYWRlclxuICAgKiBAY2FsbGJhY2sgT25Db21wbGV0ZVNpZ25hbFxuICAgKiBAcGFyYW0ge0xvYWRlcn0gbG9hZGVyIC0gVGhlIGxvYWRlciB0aGF0IGhhcyBmaW5pc2hlZCBsb2FkaW5nIHJlc291cmNlcy5cbiAgICovXG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIGEgY2FsbCB0byBgLmFkZCgpYC5cbiAgICpcbiAgICogQHNlZSBMb2FkZXIjYWRkXG4gICAqXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IElBZGRPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZCwgaWYgbm90IHBhc3NlZCB0aGUgdXJsIGlzIHVzZWQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBba2V5XSAtIEFsaWFzIGZvciBgbmFtZWAuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXJsXSAtIFRoZSB1cmwgZm9yIHRoaXMgcmVzb3VyY2UsIHJlbGF0aXZlIHRvIHRoZSBiYXNlVXJsIG9mIHRoaXMgbG9hZGVyLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xib29sZWFufSBbY3Jvc3NPcmlnaW5dIC0gSXMgdGhpcyByZXF1ZXN0IGNyb3NzLW9yaWdpbj8gRGVmYXVsdCBpcyB0b1xuICAgKiAgICAgIGRldGVybWluZSBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXQ9MF0gLSBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbG9hZC4gSWYgdGhlIGxvYWQgdGFrZXNcbiAgICogICAgICBsb25nZXIgdGhhbiB0aGlzIHRpbWUgaXQgaXMgY2FuY2VsbGVkIGFuZCB0aGUgbG9hZCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4gSWYgdGhpcyB2YWx1ZSBpc1xuICAgKiAgICAgIHNldCB0byBgMGAgdGhlbiB0aGVyZSBpcyBubyBleHBsaWNpdCB0aW1lb3V0LlxuICAgKiBAcHJvcGVydHkge1Jlc291cmNlLkxPQURfVFlQRX0gW2xvYWRUeXBlPVJlc291cmNlLkxPQURfVFlQRS5YSFJdIC0gSG93IHNob3VsZCB0aGlzIHJlc291cmNlXG4gICAqICAgICAgYmUgbG9hZGVkP1xuICAgKiBAcHJvcGVydHkge1Jlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFfSBbeGhyVHlwZT1SZXNvdXJjZS5YSFJfUkVTUE9OU0VfVFlQRS5ERUZBVUxUXSAtIEhvd1xuICAgKiAgICAgIHNob3VsZCB0aGUgZGF0YSBiZWluZyBsb2FkZWQgYmUgaW50ZXJwcmV0ZWQgd2hlbiB1c2luZyBYSFI/XG4gICAqIEBwcm9wZXJ0eSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW29uQ29tcGxldGVdIC0gQ2FsbGJhY2sgdG8gYWRkIGFuIGFuIG9uQ29tcGxldGUgc2lnbmFsIGlzdGVuZXIuXG4gICAqIEBwcm9wZXJ0eSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NhbGxiYWNrXSAtIEFsaWFzIGZvciBgb25Db21wbGV0ZWAuXG4gICAqIEBwcm9wZXJ0eSB7UmVzb3VyY2UuSU1ldGFkYXRhfSBbbWV0YWRhdGFdIC0gRXh0cmEgY29uZmlndXJhdGlvbiBmb3IgbWlkZGxld2FyZSBhbmQgdGhlIFJlc291cmNlIG9iamVjdC5cbiAgICovXG5cbiAgLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1qc2RvYyx2YWxpZC1qc2RvYyAqL1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2UgKG9yIG11bHRpcGxlIHJlc291cmNlcykgdG8gdGhlIGxvYWRlciBxdWV1ZS5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBjYW4gdGFrZSBhIHdpZGUgdmFyaWV0eSBvZiBkaWZmZXJlbnQgcGFyYW1ldGVycy4gVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBhbHdheXNcbiAgICogcmVxdWlyZWQgdGhlIHVybCB0byBsb2FkLiBBbGwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGxvYWRlclxuICAgKiAgICAgLy8gbm9ybWFsIHBhcmFtIHN5bnRheFxuICAgKiAgICAgLmFkZCgna2V5JywgJ2h0dHA6Ly8uLi4nLCBmdW5jdGlvbiAoKSB7fSlcbiAgICogICAgIC5hZGQoJ2h0dHA6Ly8uLi4nLCBmdW5jdGlvbiAoKSB7fSlcbiAgICogICAgIC5hZGQoJ2h0dHA6Ly8uLi4nKVxuICAgKlxuICAgKiAgICAgLy8gb2JqZWN0IHN5bnRheFxuICAgKiAgICAgLmFkZCh7XG4gICAqICAgICAgICAgbmFtZTogJ2tleTInLFxuICAgKiAgICAgICAgIHVybDogJ2h0dHA6Ly8uLi4nXG4gICAqICAgICB9LCBmdW5jdGlvbiAoKSB7fSlcbiAgICogICAgIC5hZGQoe1xuICAgKiAgICAgICAgIHVybDogJ2h0dHA6Ly8uLi4nXG4gICAqICAgICB9LCBmdW5jdGlvbiAoKSB7fSlcbiAgICogICAgIC5hZGQoe1xuICAgKiAgICAgICAgIG5hbWU6ICdrZXkzJyxcbiAgICogICAgICAgICB1cmw6ICdodHRwOi8vLi4uJ1xuICAgKiAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICB9KVxuICAgKiAgICAgLmFkZCh7XG4gICAqICAgICAgICAgdXJsOiAnaHR0cHM6Ly8uLi4nLFxuICAgKiAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uICgpIHt9LFxuICAgKiAgICAgICAgIGNyb3NzT3JpZ2luOiB0cnVlXG4gICAqICAgICB9KVxuICAgKlxuICAgKiAgICAgLy8geW91IGNhbiBhbHNvIHBhc3MgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvciB1cmxzIG9yIGJvdGhcbiAgICogICAgIC5hZGQoW1xuICAgKiAgICAgICAgIHsgbmFtZTogJ2tleTQnLCB1cmw6ICdodHRwOi8vLi4uJywgb25Db21wbGV0ZTogZnVuY3Rpb24gKCkge30gfSxcbiAgICogICAgICAgICB7IHVybDogJ2h0dHA6Ly8uLi4nLCBvbkNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7fSB9LFxuICAgKiAgICAgICAgICdodHRwOi8vLi4uJ1xuICAgKiAgICAgXSlcbiAgICpcbiAgICogICAgIC8vIGFuZCB5b3UgY2FuIHVzZSBib3RoIHBhcmFtcyBhbmQgb3B0aW9uc1xuICAgKiAgICAgLmFkZCgna2V5JywgJ2h0dHA6Ly8uLi4nLCB7IGNyb3NzT3JpZ2luOiB0cnVlIH0sIGZ1bmN0aW9uICgpIHt9KVxuICAgKiAgICAgLmFkZCgnaHR0cDovLy4uLicsIHsgY3Jvc3NPcmlnaW46IHRydWUgfSwgZnVuY3Rpb24gKCkge30pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGZ1bmN0aW9uXG4gICAqIEB2YXJpYXRpb24gMVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHVybCBmb3IgdGhpcyByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGJhc2VVcmwgb2YgdGhpcyBsb2FkZXIuXG4gICAqIEBwYXJhbSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIHNwZWNpZmljIHJlc291cmNlIGNvbXBsZXRlcyBsb2FkaW5nLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICovXG5cbiAgLyoqXG4gICogQGZ1bmN0aW9uXG4gICogQHZhcmlhdGlvbiAyXG4gICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC5cbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHVybCBmb3IgdGhpcyByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGJhc2VVcmwgb2YgdGhpcyBsb2FkZXIuXG4gICogQHBhcmFtIHtJQWRkT3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBsb2FkLlxuICAqIEBwYXJhbSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIHNwZWNpZmljIHJlc291cmNlIGNvbXBsZXRlcyBsb2FkaW5nLlxuICAqIEByZXR1cm4ge3RoaXN9IFJldHVybnMgaXRzZWxmLlxuICAqL1xuXG4gIC8qKlxuICAqIEBmdW5jdGlvblxuICAqIEB2YXJpYXRpb24gM1xuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIGZvciB0aGlzIHJlc291cmNlLCByZWxhdGl2ZSB0byB0aGUgYmFzZVVybCBvZiB0aGlzIGxvYWRlci5cbiAgKiBAcGFyYW0ge1Jlc291cmNlLk9uQ29tcGxldGVTaWduYWx9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhpcyBzcGVjaWZpYyByZXNvdXJjZSBjb21wbGV0ZXMgbG9hZGluZy5cbiAgKiBAcmV0dXJuIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgKi9cblxuICAvKipcbiAgKiBAZnVuY3Rpb25cbiAgKiBAdmFyaWF0aW9uIDRcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHVybCBmb3IgdGhpcyByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGJhc2VVcmwgb2YgdGhpcyBsb2FkZXIuXG4gICogQHBhcmFtIHtJQWRkT3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBsb2FkLlxuICAqIEBwYXJhbSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIHNwZWNpZmljIHJlc291cmNlIGNvbXBsZXRlcyBsb2FkaW5nLlxuICAqIEByZXR1cm4ge3RoaXN9IFJldHVybnMgaXRzZWxmLlxuICAqL1xuXG4gIC8qKlxuICAqIEBmdW5jdGlvblxuICAqIEB2YXJpYXRpb24gNVxuICAqIEBwYXJhbSB7SUFkZE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGxvYWQuIFRoaXMgb2JqZWN0IG11c3QgY29udGFpbiBhIGB1cmxgIHByb3BlcnR5LlxuICAqIEBwYXJhbSB7UmVzb3VyY2UuT25Db21wbGV0ZVNpZ25hbH0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGlzIHNwZWNpZmljIHJlc291cmNlIGNvbXBsZXRlcyBsb2FkaW5nLlxuICAqIEByZXR1cm4ge3RoaXN9IFJldHVybnMgaXRzZWxmLlxuICAqL1xuXG4gIC8qKlxuICAqIEBmdW5jdGlvblxuICAqIEB2YXJpYXRpb24gNlxuICAqIEBwYXJhbSB7QXJyYXk8SUFkZE9wdGlvbnN8c3RyaW5nPn0gcmVzb3VyY2VzIC0gQW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGxvYWQsIHdoZXJlIGVhY2ggaXNcbiAgKiAgICAgIGVpdGhlciBhbiBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBvciBhIHN0cmluZyB1cmwuIElmIHlvdSBwYXNzIGFuIG9iamVjdCwgaXQgbXVzdCBjb250YWluIGEgYHVybGAgcHJvcGVydHkuXG4gICogQHBhcmFtIHtSZXNvdXJjZS5PbkNvbXBsZXRlU2lnbmFsfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoaXMgc3BlY2lmaWMgcmVzb3VyY2UgY29tcGxldGVzIGxvYWRpbmcuXG4gICogQHJldHVybiB7dGhpc30gUmV0dXJucyBpdHNlbGYuXG4gICovXG5cblxuICB2YXIgX3Byb3RvID0gTG9hZGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkID0gZnVuY3Rpb24gYWRkKG5hbWUsIHVybCwgb3B0aW9ucywgY2IpIHtcbiAgICAvLyBzcGVjaWFsIGNhc2Ugb2YgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvciB1cmxzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLmFkZChuYW1lW2ldKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSAvLyBpZiBhbiBvYmplY3QgaXMgcGFzc2VkIGluc3RlYWQgb2YgcGFyYW1zXG5cblxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNiID0gdXJsIHx8IG5hbWUuY2FsbGJhY2sgfHwgbmFtZS5vbkNvbXBsZXRlO1xuICAgICAgb3B0aW9ucyA9IG5hbWU7XG4gICAgICB1cmwgPSBuYW1lLnVybDtcbiAgICAgIG5hbWUgPSBuYW1lLm5hbWUgfHwgbmFtZS5rZXkgfHwgbmFtZS51cmw7XG4gICAgfSAvLyBjYXNlIHdoZXJlIG5vIG5hbWUgaXMgcGFzc2VkIHNoaWZ0IGFsbCBhcmdzIG92ZXIgYnkgb25lLlxuXG5cbiAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNiID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB1cmw7XG4gICAgICB1cmwgPSBuYW1lO1xuICAgIH0gLy8gbm93IHRoYXQgd2Ugc2hpZnRlZCBtYWtlIHN1cmUgd2UgaGF2ZSBhIHByb3BlciB1cmwuXG5cblxuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1cmwgcGFzc2VkIHRvIGFkZCByZXNvdXJjZSB0byBsb2FkZXIuJyk7XG4gICAgfSAvLyBvcHRpb25zIGFyZSBvcHRpb25hbCBzbyBwZW9wbGUgbWlnaHQgcGFzcyBhIGZ1bmN0aW9uIGFuZCBubyBvcHRpb25zXG5cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgfSAvLyBpZiBsb2FkaW5nIGFscmVhZHkgeW91IGNhbiBvbmx5IGFkZCByZXNvdXJjZXMgdGhhdCBoYXZlIGEgcGFyZW50LlxuXG5cbiAgICBpZiAodGhpcy5sb2FkaW5nICYmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5wYXJlbnRSZXNvdXJjZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCByZXNvdXJjZXMgd2hpbGUgdGhlIGxvYWRlciBpcyBydW5uaW5nLicpO1xuICAgIH0gLy8gY2hlY2sgaWYgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMuXG5cblxuICAgIGlmICh0aGlzLnJlc291cmNlc1tuYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgbmFtZWQgXFxcIlwiICsgbmFtZSArIFwiXFxcIiBhbHJlYWR5IGV4aXN0cy5cIik7XG4gICAgfSAvLyBhZGQgYmFzZSB1cmwgaWYgdGhpcyBpc24ndCBhbiBhYnNvbHV0ZSB1cmxcblxuXG4gICAgdXJsID0gdGhpcy5fcHJlcGFyZVVybCh1cmwpOyAvLyBjcmVhdGUgdGhlIHN0b3JlIHRoZSByZXNvdXJjZVxuXG4gICAgdGhpcy5yZXNvdXJjZXNbbmFtZV0gPSBuZXcgUmVzb3VyY2UobmFtZSwgdXJsLCBvcHRpb25zKTtcblxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VzW25hbWVdLm9uQWZ0ZXJNaWRkbGV3YXJlLm9uY2UoY2IpO1xuICAgIH0gLy8gaWYgYWN0aXZlbHkgbG9hZGluZywgbWFrZSBzdXJlIHRvIGFkanVzdCBwcm9ncmVzcyBjaHVua3MgZm9yIHRoYXQgcGFyZW50IGFuZCBpdHMgY2hpbGRyZW5cblxuXG4gICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgICAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50UmVzb3VyY2U7XG4gICAgICB2YXIgaW5jb21wbGV0ZUNoaWxkcmVuID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGg7ICsrX2kyKSB7XG4gICAgICAgIGlmICghcGFyZW50LmNoaWxkcmVuW19pMl0uaXNDb21wbGV0ZSkge1xuICAgICAgICAgIGluY29tcGxldGVDaGlsZHJlbi5wdXNoKHBhcmVudC5jaGlsZHJlbltfaTJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZnVsbENodW5rID0gcGFyZW50LnByb2dyZXNzQ2h1bmsgKiAoaW5jb21wbGV0ZUNoaWxkcmVuLmxlbmd0aCArIDEpOyAvLyArMSBmb3IgcGFyZW50XG5cbiAgICAgIHZhciBlYWNoQ2h1bmsgPSBmdWxsQ2h1bmsgLyAoaW5jb21wbGV0ZUNoaWxkcmVuLmxlbmd0aCArIDIpOyAvLyArMiBmb3IgcGFyZW50ICYgbmV3IGNoaWxkXG5cbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMucmVzb3VyY2VzW25hbWVdKTtcbiAgICAgIHBhcmVudC5wcm9ncmVzc0NodW5rID0gZWFjaENodW5rO1xuXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBpbmNvbXBsZXRlQ2hpbGRyZW4ubGVuZ3RoOyArK19pMykge1xuICAgICAgICBpbmNvbXBsZXRlQ2hpbGRyZW5bX2kzXS5wcm9ncmVzc0NodW5rID0gZWFjaENodW5rO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc291cmNlc1tuYW1lXS5wcm9ncmVzc0NodW5rID0gZWFjaENodW5rO1xuICAgIH0gLy8gYWRkIHRoZSByZXNvdXJjZSB0byB0aGUgcXVldWVcblxuXG4gICAgdGhpcy5fcXVldWUucHVzaCh0aGlzLnJlc291cmNlc1tuYW1lXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIHJlcXVpcmUtanNkb2MsdmFsaWQtanNkb2MgKi9cblxuICAvKipcbiAgICogU2V0cyB1cCBhIG1pZGRsZXdhcmUgZnVuY3Rpb24gdGhhdCB3aWxsIHJ1biAqYmVmb3JlKiB0aGVcbiAgICogcmVzb3VyY2UgaXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBtaWRkbGV3YXJlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucHJlID0gZnVuY3Rpb24gcHJlKGZuKSB7XG4gICAgdGhpcy5fYmVmb3JlTWlkZGxld2FyZS5wdXNoKGZuKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIHVwIGEgbWlkZGxld2FyZSBmdW5jdGlvbiB0aGF0IHdpbGwgcnVuICphZnRlciogdGhlXG4gICAqIHJlc291cmNlIGlzIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgbWlkZGxld2FyZSBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7dGhpc30gUmV0dXJucyBpdHNlbGYuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICAgIHRoaXMuX2FmdGVyTWlkZGxld2FyZS5wdXNoKGZuKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHF1ZXVlIG9mIHRoZSBsb2FkZXIgdG8gcHJlcGFyZSBmb3IgYSBuZXcgbG9hZC5cbiAgICpcbiAgICogQHJldHVybiB7dGhpc30gUmV0dXJucyBpdHNlbGYuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLl9xdWV1ZS5raWxsKCk7XG5cbiAgICB0aGlzLl9xdWV1ZS5wYXVzZSgpOyAvLyBhYm9ydCBhbGwgcmVzb3VyY2UgbG9hZHNcblxuXG4gICAgZm9yICh2YXIgayBpbiB0aGlzLnJlc291cmNlcykge1xuICAgICAgdmFyIHJlcyA9IHRoaXMucmVzb3VyY2VzW2tdO1xuXG4gICAgICBpZiAocmVzLl9vbkxvYWRCaW5kaW5nKSB7XG4gICAgICAgIHJlcy5fb25Mb2FkQmluZGluZy5kZXRhY2goKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmVzLmFib3J0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZXMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogU3RhcnRzIGxvYWRpbmcgdGhlIHF1ZXVlZCByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYl0gLSBPcHRpb25hbCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgYm91bmQgdG8gdGhlIGBjb21wbGV0ZWAgZXZlbnQuXG4gICAqIEByZXR1cm4ge3RoaXN9IFJldHVybnMgaXRzZWxmLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5sb2FkID0gZnVuY3Rpb24gbG9hZChjYikge1xuICAgIC8vIHJlZ2lzdGVyIGNvbXBsZXRlIGNhbGxiYWNrIGlmIHRoZXkgcGFzcyBvbmVcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUub25jZShjYik7XG4gICAgfSAvLyBpZiB0aGUgcXVldWUgaGFzIGFscmVhZHkgc3RhcnRlZCB3ZSBhcmUgZG9uZSBoZXJlXG5cblxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9xdWV1ZS5pZGxlKCkpIHtcbiAgICAgIHRoaXMuX29uU3RhcnQoKTtcblxuICAgICAgdGhpcy5fb25Db21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkaXN0cmlidXRlIHByb2dyZXNzIGNodW5rc1xuICAgICAgdmFyIG51bVRhc2tzID0gdGhpcy5fcXVldWUuX3Rhc2tzLmxlbmd0aDtcbiAgICAgIHZhciBjaHVuayA9IE1BWF9QUk9HUkVTUyAvIG51bVRhc2tzO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3F1ZXVlLl90YXNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9xdWV1ZS5fdGFza3NbaV0uZGF0YS5wcm9ncmVzc0NodW5rID0gY2h1bms7XG4gICAgICB9IC8vIG5vdGlmeSB3ZSBhcmUgc3RhcnRpbmdcblxuXG4gICAgICB0aGlzLl9vblN0YXJ0KCk7IC8vIHN0YXJ0IGxvYWRpbmdcblxuXG4gICAgICB0aGlzLl9xdWV1ZS5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gbG9hZCBjb25jdXJyZW50bHkuXG4gICAqXG4gICAqIEBtZW1iZXIge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUHJlcGFyZXMgYSB1cmwgZm9yIHVzYWdlIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgdXJsIHRvIHByZXBhcmUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByZXBhcmVkIHVybC5cbiAgICovXG4gIF9wcm90by5fcHJlcGFyZVVybCA9IGZ1bmN0aW9uIF9wcmVwYXJlVXJsKHVybCkge1xuICAgIHZhciBwYXJzZWRVcmwgPSBwYXJzZVVyaSh1cmwsIHtcbiAgICAgIHN0cmljdE1vZGU6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgcmVzdWx0OyAvLyBhYnNvbHV0ZSB1cmwsIGp1c3QgdXNlIGl0IGFzIGlzLlxuXG4gICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCB8fCAhcGFyc2VkVXJsLnBhdGggfHwgdXJsLmluZGV4T2YoJy8vJykgPT09IDApIHtcbiAgICAgIHJlc3VsdCA9IHVybDtcbiAgICB9IC8vIGlmIGJhc2VVcmwgZG9lc24ndCBlbmQgaW4gc2xhc2ggYW5kIHVybCBkb2Vzbid0IHN0YXJ0IHdpdGggc2xhc2gsIHRoZW4gYWRkIGEgc2xhc2ggaW5iZXR3ZWVuXG4gICAgZWxzZSBpZiAodGhpcy5iYXNlVXJsLmxlbmd0aCAmJiB0aGlzLmJhc2VVcmwubGFzdEluZGV4T2YoJy8nKSAhPT0gdGhpcy5iYXNlVXJsLmxlbmd0aCAtIDEgJiYgdXJsLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuYmFzZVVybCArIFwiL1wiICsgdXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5iYXNlVXJsICsgdXJsO1xuICAgICAgfSAvLyBpZiB3ZSBuZWVkIHRvIGFkZCBhIGRlZmF1bHQgcXVlcnlzdHJpbmcsIHRoZXJlIGlzIGEgYml0IG1vcmUgd29ya1xuXG5cbiAgICBpZiAodGhpcy5kZWZhdWx0UXVlcnlTdHJpbmcpIHtcbiAgICAgIHZhciBoYXNoID0gcmd4RXh0cmFjdFVybEhhc2guZXhlYyhyZXN1bHQpWzBdO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gaGFzaC5sZW5ndGgpO1xuXG4gICAgICBpZiAocmVzdWx0LmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcbiAgICAgICAgcmVzdWx0ICs9IFwiJlwiICsgdGhpcy5kZWZhdWx0UXVlcnlTdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gXCI/XCIgKyB0aGlzLmRlZmF1bHRRdWVyeVN0cmluZztcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IGhhc2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogTG9hZHMgYSBzaW5nbGUgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVzb3VyY2V9IHJlc291cmNlIC0gVGhlIHJlc291cmNlIHRvIGxvYWQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlcXVldWUgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHdlIG5lZWQgdG8gZGVxdWV1ZSB0aGlzIGl0ZW0uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9sb2FkUmVzb3VyY2UgPSBmdW5jdGlvbiBfbG9hZFJlc291cmNlKHJlc291cmNlLCBkZXF1ZXVlKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXNvdXJjZS5fZGVxdWV1ZSA9IGRlcXVldWU7IC8vIHJ1biBiZWZvcmUgbWlkZGxld2FyZVxuXG4gICAgZWFjaFNlcmllcyh0aGlzLl9iZWZvcmVNaWRkbGV3YXJlLCBmdW5jdGlvbiAoZm4sIG5leHQpIHtcbiAgICAgIGZuLmNhbGwoX3RoaXMyLCByZXNvdXJjZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBpZiB0aGUgYmVmb3JlIG1pZGRsZXdhcmUgbWFya3MgdGhlIHJlc291cmNlIGFzIGNvbXBsZXRlLFxuICAgICAgICAvLyBicmVhayBhbmQgZG9uJ3QgcHJvY2VzcyBhbnkgbW9yZSBiZWZvcmUgbWlkZGxld2FyZVxuICAgICAgICBuZXh0KHJlc291cmNlLmlzQ29tcGxldGUgPyB7fSA6IG51bGwpO1xuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHJlc291cmNlLmlzQ29tcGxldGUpIHtcbiAgICAgICAgX3RoaXMyLl9vbkxvYWQocmVzb3VyY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb3VyY2UuX29uTG9hZEJpbmRpbmcgPSByZXNvdXJjZS5vbkNvbXBsZXRlLm9uY2UoX3RoaXMyLl9vbkxvYWQsIF90aGlzMik7XG4gICAgICAgIHJlc291cmNlLmxvYWQoKTtcbiAgICAgIH1cbiAgICB9LCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgbG9hZGluZyBoYXMgc3RhcnRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIDtcblxuICBfcHJvdG8uX29uU3RhcnQgPSBmdW5jdGlvbiBfb25TdGFydCgpIHtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMub25TdGFydC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgZWFjaCByZXNvdXJjZSBoYXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fb25Db21wbGV0ZSA9IGZ1bmN0aW9uIF9vbkNvbXBsZXRlKCkge1xuICAgIHRoaXMucHJvZ3Jlc3MgPSBNQVhfUFJPR1JFU1M7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5vbkNvbXBsZXRlLmRpc3BhdGNoKHRoaXMsIHRoaXMucmVzb3VyY2VzKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbGVkIGVhY2ggdGltZSBhIHJlc291cmNlcyBpcyBsb2FkZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVzb3VyY2V9IHJlc291cmNlIC0gVGhlIHJlc291cmNlIHRoYXQgd2FzIGxvYWRlZFxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5fb25Mb2FkID0gZnVuY3Rpb24gX29uTG9hZChyZXNvdXJjZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmVzb3VyY2UuX29uTG9hZEJpbmRpbmcgPSBudWxsOyAvLyByZW1vdmUgdGhpcyByZXNvdXJjZSBmcm9tIHRoZSBhc3luYyBxdWV1ZSwgYW5kIGFkZCBpdCB0byBvdXIgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgcGFyc2VkXG5cbiAgICB0aGlzLl9yZXNvdXJjZXNQYXJzaW5nLnB1c2gocmVzb3VyY2UpO1xuXG4gICAgcmVzb3VyY2UuX2RlcXVldWUoKTsgLy8gcnVuIGFsbCB0aGUgYWZ0ZXIgbWlkZGxld2FyZSBmb3IgdGhpcyByZXNvdXJjZVxuXG5cbiAgICBlYWNoU2VyaWVzKHRoaXMuX2FmdGVyTWlkZGxld2FyZSwgZnVuY3Rpb24gKGZuLCBuZXh0KSB7XG4gICAgICBmbi5jYWxsKF90aGlzMywgcmVzb3VyY2UsIG5leHQpO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc291cmNlLm9uQWZ0ZXJNaWRkbGV3YXJlLmRpc3BhdGNoKHJlc291cmNlKTtcbiAgICAgIF90aGlzMy5wcm9ncmVzcyA9IE1hdGgubWluKE1BWF9QUk9HUkVTUywgX3RoaXMzLnByb2dyZXNzICsgcmVzb3VyY2UucHJvZ3Jlc3NDaHVuayk7XG5cbiAgICAgIF90aGlzMy5vblByb2dyZXNzLmRpc3BhdGNoKF90aGlzMywgcmVzb3VyY2UpO1xuXG4gICAgICBpZiAocmVzb3VyY2UuZXJyb3IpIHtcbiAgICAgICAgX3RoaXMzLm9uRXJyb3IuZGlzcGF0Y2gocmVzb3VyY2UuZXJyb3IsIF90aGlzMywgcmVzb3VyY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMzLm9uTG9hZC5kaXNwYXRjaChfdGhpczMsIHJlc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMzLl9yZXNvdXJjZXNQYXJzaW5nLnNwbGljZShfdGhpczMuX3Jlc291cmNlc1BhcnNpbmcuaW5kZXhPZihyZXNvdXJjZSksIDEpOyAvLyBkbyBjb21wbGV0aW9uIGNoZWNrXG5cblxuICAgICAgaWYgKF90aGlzMy5fcXVldWUuaWRsZSgpICYmIF90aGlzMy5fcmVzb3VyY2VzUGFyc2luZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgX3RoaXMzLl9vbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSwgdHJ1ZSk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKExvYWRlciwgW3tcbiAgICBrZXk6IFwiY29uY3VycmVuY3lcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9xdWV1ZS5jb25jdXJyZW5jeTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGNvbmN1cnJlbmN5KSB7XG4gICAgICB0aGlzLl9xdWV1ZS5jb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb2FkZXI7XG59KCk7XG4vKipcbiAqIEEgZGVmYXVsdCBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIHJ1biBiZWZvcmUgbG9hZGluZyBlYWNoIHJlc291cmNlLlxuICogRWFjaCBvZiB0aGVzZSBtaWRkbGV3YXJlcyBhcmUgYWRkZWQgdG8gYW55IG5ldyBMb2FkZXIgaW5zdGFuY2VzIHdoZW4gdGhleSBhcmUgY3JlYXRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG1lbWJlciB7ZnVuY3Rpb25bXX1cbiAqL1xuXG5cbkxvYWRlci5fZGVmYXVsdEJlZm9yZU1pZGRsZXdhcmUgPSBbXTtcbi8qKlxuICogQSBkZWZhdWx0IGFycmF5IG9mIG1pZGRsZXdhcmUgdG8gcnVuIGFmdGVyIGxvYWRpbmcgZWFjaCByZXNvdXJjZS5cbiAqIEVhY2ggb2YgdGhlc2UgbWlkZGxld2FyZXMgYXJlIGFkZGVkIHRvIGFueSBuZXcgTG9hZGVyIGluc3RhbmNlcyB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBtZW1iZXIge2Z1bmN0aW9uW119XG4gKi9cblxuTG9hZGVyLl9kZWZhdWx0QWZ0ZXJNaWRkbGV3YXJlID0gW107XG4vKipcbiAqIFNldHMgdXAgYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIHRoYXQgd2lsbCBydW4gKmJlZm9yZSogdGhlXG4gKiByZXNvdXJjZSBpcyBsb2FkZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgbWlkZGxld2FyZSBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAqIEByZXR1cm4ge0xvYWRlcn0gUmV0dXJucyBpdHNlbGYuXG4gKi9cblxuTG9hZGVyLnByZSA9IGZ1bmN0aW9uIExvYWRlclByZVN0YXRpYyhmbikge1xuICBMb2FkZXIuX2RlZmF1bHRCZWZvcmVNaWRkbGV3YXJlLnB1c2goZm4pO1xuXG4gIHJldHVybiBMb2FkZXI7XG59O1xuLyoqXG4gKiBTZXRzIHVwIGEgbWlkZGxld2FyZSBmdW5jdGlvbiB0aGF0IHdpbGwgcnVuICphZnRlciogdGhlXG4gKiByZXNvdXJjZSBpcyBsb2FkZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgbWlkZGxld2FyZSBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAqIEByZXR1cm4ge0xvYWRlcn0gUmV0dXJucyBpdHNlbGYuXG4gKi9cblxuXG5Mb2FkZXIudXNlID0gZnVuY3Rpb24gTG9hZGVyVXNlU3RhdGljKGZuKSB7XG4gIExvYWRlci5fZGVmYXVsdEFmdGVyTWlkZGxld2FyZS5wdXNoKGZuKTtcblxuICByZXR1cm4gTG9hZGVyO1xufTtcblxuZXhwb3J0IHsgTG9hZGVyLCBSZXNvdXJjZSwgYXN5bmMsIGVuY29kZUJpbmFyeSwgaW5kZXggYXMgbWlkZGxld2FyZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzb3VyY2UtbG9hZGVyLmVzbS5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvbG9hZGVycyAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9sb2FkZXJzIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgUmVzb3VyY2UsIExvYWRlciBhcyBMb2FkZXIkMSwgbWlkZGxld2FyZSB9IGZyb20gJ3Jlc291cmNlLWxvYWRlcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcGl4aS91dGlscyc7XG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5cbi8qKlxuICogTG9hZGVyIHBsdWdpbiBmb3IgaGFuZGxpbmcgVGV4dHVyZSByZXNvdXJjZXMuXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAaW1wbGVtZW50cyBQSVhJLklMb2FkZXJQbHVnaW5cbiAqL1xudmFyIFRleHR1cmVMb2FkZXIgPSBmdW5jdGlvbiBUZXh0dXJlTG9hZGVyICgpIHt9O1xuXG5UZXh0dXJlTG9hZGVyLnVzZSA9IGZ1bmN0aW9uIHVzZSAocmVzb3VyY2UsIG5leHQpXG57XG4gICAgLy8gY3JlYXRlIGEgbmV3IHRleHR1cmUgaWYgdGhlIGRhdGEgaXMgYW4gSW1hZ2Ugb2JqZWN0XG4gICAgaWYgKHJlc291cmNlLmRhdGEgJiYgcmVzb3VyY2UudHlwZSA9PT0gUmVzb3VyY2UuVFlQRS5JTUFHRSlcbiAgICB7XG4gICAgICAgIHJlc291cmNlLnRleHR1cmUgPSBUZXh0dXJlLmZyb21Mb2FkZXIoXG4gICAgICAgICAgICByZXNvdXJjZS5kYXRhLFxuICAgICAgICAgICAgcmVzb3VyY2UudXJsLFxuICAgICAgICAgICAgcmVzb3VyY2UubmFtZVxuICAgICAgICApO1xuICAgIH1cbiAgICBuZXh0KCk7XG59O1xuXG4vKipcbiAqIFRoZSBuZXcgbG9hZGVyLCBleHRlbmRzIFJlc291cmNlIExvYWRlciBieSBDaGFkIEVuZ2xlcjogaHR0cHM6Ly9naXRodWIuY29tL2VuZ2xlcmNqL3Jlc291cmNlLWxvYWRlclxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBsb2FkZXIgPSBQSVhJLkxvYWRlci5zaGFyZWQ7IC8vIFBpeGlKUyBleHBvc2VzIGEgcHJlbWFkZSBpbnN0YW5jZSBmb3IgeW91IHRvIHVzZS5cbiAqIC8vb3JcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBQSVhJLkxvYWRlcigpOyAvLyB5b3UgY2FuIGFsc28gY3JlYXRlIHlvdXIgb3duIGlmIHlvdSB3YW50XG4gKlxuICogY29uc3Qgc3ByaXRlcyA9IHt9O1xuICpcbiAqIC8vIENoYWluYWJsZSBgYWRkYCB0byBlbnF1ZXVlIGEgcmVzb3VyY2VcbiAqIGxvYWRlci5hZGQoJ2J1bm55JywgJ2RhdGEvYnVubnkucG5nJylcbiAqICAgICAgIC5hZGQoJ3NwYWNlc2hpcCcsICdhc3NldHMvc3ByaXRlc2hlZXQuanNvbicpO1xuICogbG9hZGVyLmFkZCgnc2NvcmVGb250JywgJ2Fzc2V0cy9zY29yZS5mbnQnKTtcbiAqXG4gKiAvLyBDaGFpbmFibGUgYHByZWAgdG8gYWRkIGEgbWlkZGxld2FyZSB0aGF0IHJ1bnMgZm9yIGVhY2ggcmVzb3VyY2UsICpiZWZvcmUqIGxvYWRpbmcgdGhhdCByZXNvdXJjZS5cbiAqIC8vIFRoaXMgaXMgdXNlZnVsIHRvIGltcGxlbWVudCBjdXN0b20gY2FjaGluZyBtb2R1bGVzICh1c2luZyBmaWxlc3lzdGVtLCBpbmRleGVkZGIsIG1lbW9yeSwgZXRjKS5cbiAqIGxvYWRlci5wcmUoY2FjaGluZ01pZGRsZXdhcmUpO1xuICpcbiAqIC8vIENoYWluYWJsZSBgdXNlYCB0byBhZGQgYSBtaWRkbGV3YXJlIHRoYXQgcnVucyBmb3IgZWFjaCByZXNvdXJjZSwgKmFmdGVyKiBsb2FkaW5nIHRoYXQgcmVzb3VyY2UuXG4gKiAvLyBUaGlzIGlzIHVzZWZ1bCB0byBpbXBsZW1lbnQgY3VzdG9tIHBhcnNpbmcgbW9kdWxlcyAobGlrZSBzcHJpdGVzaGVldCBwYXJzZXJzLCBzcGluZSBwYXJzZXIsIGV0YykuXG4gKiBsb2FkZXIudXNlKHBhcnNpbmdNaWRkbGV3YXJlKTtcbiAqXG4gKiAvLyBUaGUgYGxvYWRgIG1ldGhvZCBsb2FkcyB0aGUgcXVldWUgb2YgcmVzb3VyY2VzLCBhbmQgY2FsbHMgdGhlIHBhc3NlZCBpbiBjYWxsYmFjayBjYWxsZWQgb25jZSBhbGxcbiAqIC8vIHJlc291cmNlcyBoYXZlIGxvYWRlZC5cbiAqIGxvYWRlci5sb2FkKChsb2FkZXIsIHJlc291cmNlcykgPT4ge1xuICogICAgIC8vIHJlc291cmNlcyBpcyBhbiBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgbG9hZGVkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHJlc291cmNlIG9iamVjdC5cbiAqICAgICAvLyBUaGV5IGhhdmUgYSBjb3VwbGUgZGVmYXVsdCBwcm9wZXJ0aWVzOlxuICogICAgIC8vIC0gYHVybGA6IFRoZSBVUkwgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGxvYWRlZCBmcm9tXG4gKiAgICAgLy8gLSBgZXJyb3JgOiBUaGUgZXJyb3IgdGhhdCBoYXBwZW5lZCB3aGVuIHRyeWluZyB0byBsb2FkIChpZiBhbnkpXG4gKiAgICAgLy8gLSBgZGF0YWA6IFRoZSByYXcgZGF0YSB0aGF0IHdhcyBsb2FkZWRcbiAqICAgICAvLyBhbHNvIG1heSBjb250YWluIG90aGVyIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIG1pZGRsZXdhcmUgdGhhdCBydW5zLlxuICogICAgIHNwcml0ZXMuYnVubnkgPSBuZXcgUElYSS5UaWxpbmdTcHJpdGUocmVzb3VyY2VzLmJ1bm55LnRleHR1cmUpO1xuICogICAgIHNwcml0ZXMuc3BhY2VzaGlwID0gbmV3IFBJWEkuVGlsaW5nU3ByaXRlKHJlc291cmNlcy5zcGFjZXNoaXAudGV4dHVyZSk7XG4gKiAgICAgc3ByaXRlcy5zY29yZUZvbnQgPSBuZXcgUElYSS5UaWxpbmdTcHJpdGUocmVzb3VyY2VzLnNjb3JlRm9udC50ZXh0dXJlKTtcbiAqIH0pO1xuICpcbiAqIC8vIHRocm91Z2hvdXQgdGhlIHByb2Nlc3MgbXVsdGlwbGUgc2lnbmFscyBjYW4gYmUgZGlzcGF0Y2hlZC5cbiAqIGxvYWRlci5vblByb2dyZXNzLmFkZCgoKSA9PiB7fSk7IC8vIGNhbGxlZCBvbmNlIHBlciBsb2FkZWQvZXJyb3JlZCBmaWxlXG4gKiBsb2FkZXIub25FcnJvci5hZGQoKCkgPT4ge30pOyAvLyBjYWxsZWQgb25jZSBwZXIgZXJyb3JlZCBmaWxlXG4gKiBsb2FkZXIub25Mb2FkLmFkZCgoKSA9PiB7fSk7IC8vIGNhbGxlZCBvbmNlIHBlciBsb2FkZWQgZmlsZVxuICogbG9hZGVyLm9uQ29tcGxldGUuYWRkKCgpID0+IHt9KTsgLy8gY2FsbGVkIG9uY2Ugd2hlbiB0aGUgcXVldWVkIHJlc291cmNlcyBhbGwgbG9hZC5cbiAqIGBgYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZ2xlcmNqL3Jlc291cmNlLWxvYWRlclxuICpcbiAqIEBjbGFzcyBMb2FkZXJcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VVcmw9JyddIC0gVGhlIGJhc2UgdXJsIGZvciBhbGwgcmVzb3VyY2VzIGxvYWRlZCBieSB0aGlzIGxvYWRlci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uY3VycmVuY3k9MTBdIC0gVGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gbG9hZCBjb25jdXJyZW50bHkuXG4gKi9cbnZhciBMb2FkZXIgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChSZXNvdXJjZUxvYWRlcikge1xuICAgIGZ1bmN0aW9uIExvYWRlcihiYXNlVXJsLCBjb25jdXJyZW5jeSlcbiAgICB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIFJlc291cmNlTG9hZGVyLmNhbGwodGhpcywgYmFzZVVybCwgY29uY3VycmVuY3kpO1xuICAgICAgICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IExvYWRlci5fcGx1Z2lucy5sZW5ndGg7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBsdWdpbiA9IExvYWRlci5fcGx1Z2luc1tpXTtcbiAgICAgICAgICAgIHZhciBwcmUgPSBwbHVnaW4ucHJlO1xuICAgICAgICAgICAgdmFyIHVzZSA9IHBsdWdpbi51c2U7XG5cbiAgICAgICAgICAgIGlmIChwcmUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmUocHJlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVzZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZSh1c2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcGF0IGxheWVyLCB0cmFuc2xhdGUgdGhlIG5ldyB2MiBzaWduYWxzIGludG8gb2xkIHYxIGV2ZW50cy5cbiAgICAgICAgdGhpcy5vblN0YXJ0LmFkZChmdW5jdGlvbiAobCkgeyByZXR1cm4gdGhpcyQxLmVtaXQoJ3N0YXJ0JywgbCk7IH0pO1xuICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MuYWRkKGZ1bmN0aW9uIChsLCByKSB7IHJldHVybiB0aGlzJDEuZW1pdCgncHJvZ3Jlc3MnLCBsLCByKTsgfSk7XG4gICAgICAgIHRoaXMub25FcnJvci5hZGQoZnVuY3Rpb24gKGUsIGwsIHIpIHsgcmV0dXJuIHRoaXMkMS5lbWl0KCdlcnJvcicsIGUsIGwsIHIpOyB9KTtcbiAgICAgICAgdGhpcy5vbkxvYWQuYWRkKGZ1bmN0aW9uIChsLCByKSB7IHJldHVybiB0aGlzJDEuZW1pdCgnbG9hZCcsIGwsIHIpOyB9KTtcbiAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbiAobCwgcikgeyByZXR1cm4gdGhpcyQxLmVtaXQoJ2NvbXBsZXRlJywgbCwgcik7IH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGlzIGxvYWRlciBjYW5ub3QgYmUgZGVzdHJveWVkLlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcHJvdGVjdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCBSZXNvdXJjZUxvYWRlciApIExvYWRlci5fX3Byb3RvX18gPSBSZXNvdXJjZUxvYWRlcjtcbiAgICBMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUmVzb3VyY2VMb2FkZXIgJiYgUmVzb3VyY2VMb2FkZXIucHJvdG90eXBlICk7XG4gICAgTG9hZGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExvYWRlcjtcblxuICAgIHZhciBzdGF0aWNBY2Nlc3NvcnMgPSB7IHNoYXJlZDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgbG9hZGVyLCByZW1vdmVzIHJlZmVyZW5jZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBMb2FkZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuX3Byb3RlY3RlZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBIHByZW1hZGUgaW5zdGFuY2Ugb2YgdGhlIGxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgcmVzb3VyY2VzLlxuICAgICAqIEBuYW1lIHNoYXJlZFxuICAgICAqIEB0eXBlIHtQSVhJLkxvYWRlcn1cbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIFBJWEkuTG9hZGVyXG4gICAgICovXG4gICAgc3RhdGljQWNjZXNzb3JzLnNoYXJlZC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgdmFyIHNoYXJlZCA9IExvYWRlci5fc2hhcmVkO1xuXG4gICAgICAgIGlmICghc2hhcmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBzaGFyZWQgPSBuZXcgTG9hZGVyKCk7XG4gICAgICAgICAgICBzaGFyZWQuX3Byb3RlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBMb2FkZXIuX3NoYXJlZCA9IHNoYXJlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFyZWQ7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMb2FkZXIsIHN0YXRpY0FjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIExvYWRlcjtcbn0oTG9hZGVyJDEpKTtcblxuLy8gQ29weSBFRTMgcHJvdG90eXBlIChtaXhpbilcbk9iamVjdC5hc3NpZ24oTG9hZGVyLnByb3RvdHlwZSwgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSk7XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBhbGwgaW5zdGFsbGVkIGB1c2VgIG1pZGRsZXdhcmUgZm9yIExvYWRlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyIHtBcnJheTxQSVhJLklMb2FkZXJQbHVnaW4+fSBfcGx1Z2luc1xuICogQG1lbWJlcm9mIFBJWEkuTG9hZGVyXG4gKiBAcHJpdmF0ZVxuICovXG5Mb2FkZXIuX3BsdWdpbnMgPSBbXTtcblxuLyoqXG4gKiBBZGRzIGEgTG9hZGVyIHBsdWdpbiBmb3IgdGhlIGdsb2JhbCBzaGFyZWQgbG9hZGVyIGFuZCBhbGxcbiAqIG5ldyBMb2FkZXIgaW5zdGFuY2VzIGNyZWF0ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1ldGhvZCByZWdpc3RlclBsdWdpblxuICogQG1lbWJlcm9mIFBJWEkuTG9hZGVyXG4gKiBAcGFyYW0ge1BJWEkuSUxvYWRlclBsdWdpbn0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBhZGRcbiAqIEByZXR1cm4ge1BJWEkuTG9hZGVyfSBSZWZlcmVuY2UgdG8gUElYSS5Mb2FkZXIgZm9yIGNoYWluaW5nXG4gKi9cbkxvYWRlci5yZWdpc3RlclBsdWdpbiA9IGZ1bmN0aW9uIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbilcbntcbiAgICBMb2FkZXIuX3BsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgaWYgKHBsdWdpbi5hZGQpXG4gICAge1xuICAgICAgICBwbHVnaW4uYWRkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIExvYWRlcjtcbn07XG5cbi8vIHBhcnNlIGFueSBibG9iIGludG8gbW9yZSB1c2FibGUgb2JqZWN0cyAoZS5nLiBJbWFnZSlcbkxvYWRlci5yZWdpc3RlclBsdWdpbih7IHVzZTogbWlkZGxld2FyZS5wYXJzaW5nIH0pO1xuXG4vLyBwYXJzZSBhbnkgSW1hZ2Ugb2JqZWN0cyBpbnRvIHRleHR1cmVzXG5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4oVGV4dHVyZUxvYWRlcik7XG5cbi8qKlxuICogUGx1Z2luIHRvIGJlIGluc3RhbGxlZCBmb3IgaGFuZGxpbmcgc3BlY2lmaWMgTG9hZGVyIHJlc291cmNlcy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQHR5cGVkZWYgSUxvYWRlclBsdWdpblxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gW2FkZF0gLSBGdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZSBhZnRlciByZWdpc3RlcmluZyBwbHVnaW4uXG4gKiBAcHJvcGVydHkge1BJWEkuTG9hZGVyLmxvYWRlck1pZGRsZXdhcmV9IFtwcmVdIC0gTWlkZGxld2FyZSBmdW5jdGlvbiB0byBydW4gYmVmb3JlIGxvYWQsIHRoZVxuICogICAgICAgICAgIGFyZ3VtZW50cyBmb3IgdGhpcyBhcmUgYChyZXNvdXJjZSwgbmV4dClgXG4gKiBAcHJvcGVydHkge1BJWEkuTG9hZGVyLmxvYWRlck1pZGRsZXdhcmV9IFt1c2VdIC0gTWlkZGxld2FyZSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbG9hZCwgdGhlXG4gKiAgICAgICAgICAgYXJndW1lbnRzIGZvciB0aGlzIGFyZSBgKHJlc291cmNlLCBuZXh0KWBcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBQSVhJLkxvYWRlclxuICogQGNhbGxiYWNrIGxvYWRlck1pZGRsZXdhcmVcbiAqIEBwYXJhbSB7UElYSS5Mb2FkZXJSZXNvdXJjZX0gcmVzb3VyY2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHRcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBQSVhJLkxvYWRlciNcbiAqIEBtZW1iZXIge29iamVjdH0gb25TdGFydFxuICovXG5cbi8qKlxuICogQG1lbWJlcm9mIFBJWEkuTG9hZGVyI1xuICogQG1lbWJlciB7b2JqZWN0fSBvblByb2dyZXNzXG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgUElYSS5Mb2FkZXIjXG4gKiBAbWVtYmVyIHtvYmplY3R9IG9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEBtZW1iZXJvZiBQSVhJLkxvYWRlciNcbiAqIEBtZW1iZXIge29iamVjdH0gb25Mb2FkXG4gKi9cblxuLyoqXG4gKiBAbWVtYmVyb2YgUElYSS5Mb2FkZXIjXG4gKiBAbWVtYmVyIHtvYmplY3R9IG9uQ29tcGxldGVcbiAqL1xuXG4vKipcbiAqIEFwcGxpY2F0aW9uIHBsdWdpbiBmb3Igc3VwcG9ydGluZyBsb2FkZXIgb3B0aW9uLiBJbnN0YWxsaW5nIHRoZSBMb2FkZXJQbHVnaW5cbiAqIGlzIG5vdCBuZWNlc3NhcnkgaWYgdXNpbmcgKipwaXhpLmpzKiogb3IgKipwaXhpLmpzLWxlZ2FjeSoqLlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7QXBwTG9hZGVyUGx1Z2lufSBmcm9tICdAcGl4aS9sb2FkZXJzJztcbiAqIGltcG9ydCB7QXBwbGljYXRpb259IGZyb20gJ0BwaXhpL2FwcCc7XG4gKiBBcHBsaWNhdGlvbi5yZWdpc3RlclBsdWdpbihBcHBMb2FkZXJQbHVnaW4pO1xuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgQXBwTG9hZGVyUGx1Z2luID0gZnVuY3Rpb24gQXBwTG9hZGVyUGx1Z2luICgpIHt9O1xuXG5BcHBMb2FkZXJQbHVnaW4uaW5pdCA9IGZ1bmN0aW9uIGluaXQgKG9wdGlvbnMpXG57XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBzaGFyZWRMb2FkZXI6IGZhbHNlLFxuICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgLyoqXG4gICAgICogTG9hZGVyIGluc3RhbmNlIHRvIGhlbHAgd2l0aCBhc3NldCBsb2FkaW5nLlxuICAgICAqIEBuYW1lIFBJWEkuQXBwbGljYXRpb24jbG9hZGVyXG4gICAgICogQHR5cGUge1BJWEkuTG9hZGVyfVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMubG9hZGVyID0gb3B0aW9ucy5zaGFyZWRMb2FkZXIgPyBMb2FkZXIuc2hhcmVkIDogbmV3IExvYWRlcigpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBkZXN0cm95ZWRcbiAqIEBwcml2YXRlXG4gKi9cbkFwcExvYWRlclBsdWdpbi5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxue1xuICAgIGlmICh0aGlzLmxvYWRlcilcbiAgICB7XG4gICAgICAgIHRoaXMubG9hZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvICoqe0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmdsZXJjai9yZXNvdXJjZS1sb2FkZXJcbiAqIHJlc291cmNlLWxvYWRlcn0qKidzIFJlc291cmNlIGNsYXNzLlxuICogQHNlZSBodHRwOi8vZW5nbGVyY2ouZ2l0aHViLmlvL3Jlc291cmNlLWxvYWRlci9SZXNvdXJjZS5odG1sXG4gKiBAY2xhc3MgTG9hZGVyUmVzb3VyY2VcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBMb2FkZXJSZXNvdXJjZSA9IFJlc291cmNlO1xuXG5leHBvcnQgeyBBcHBMb2FkZXJQbHVnaW4sIExvYWRlciwgTG9hZGVyUmVzb3VyY2UsIFRleHR1cmVMb2FkZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvYWRlcnMuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL3BhcnRpY2xlcyAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9wYXJ0aWNsZXMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBCTEVORF9NT0RFUywgVFlQRVMgfSBmcm9tICdAcGl4aS9jb25zdGFudHMnO1xuaW1wb3J0IHsgaGV4MnJnYiwgY3JlYXRlSW5kaWNlc0ZvclF1YWRzLCBjb3JyZWN0QmxlbmRNb2RlLCBwcmVtdWx0aXBseVJnYmEsIHByZW11bHRpcGx5VGludCB9IGZyb20gJ0BwaXhpL3V0aWxzJztcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuaW1wb3J0IHsgR2VvbWV0cnksIEJ1ZmZlciwgT2JqZWN0UmVuZGVyZXIsIFNoYWRlciwgU3RhdGUgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IE1hdHJpeCB9IGZyb20gJ0BwaXhpL21hdGgnO1xuXG4vKipcbiAqIFRoZSBQYXJ0aWNsZUNvbnRhaW5lciBjbGFzcyBpcyBhIHJlYWxseSBmYXN0IHZlcnNpb24gb2YgdGhlIENvbnRhaW5lciBidWlsdCBzb2xlbHkgZm9yIHNwZWVkLFxuICogc28gdXNlIHdoZW4geW91IG5lZWQgYSBsb3Qgb2Ygc3ByaXRlcyBvciBwYXJ0aWNsZXMuXG4gKlxuICogVGhlIHRyYWRlb2ZmIG9mIHRoZSBQYXJ0aWNsZUNvbnRhaW5lciBpcyB0aGF0IG1vc3QgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eSB3aWxsIG5vdCB3b3JrLlxuICogUGFydGljbGVDb250YWluZXIgaW1wbGVtZW50cyB0aGUgYmFzaWMgb2JqZWN0IHRyYW5zZm9ybSAocG9zaXRpb24sIHNjYWxlLCByb3RhdGlvbilcbiAqIGFuZCBzb21lIGFkdmFuY2VkIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aW50IChhcyBvZiB2NC41LjYpLlxuICpcbiAqIE90aGVyIG1vcmUgYWR2YW5jZWQgZnVuY3Rpb25hbGl0eSBsaWtlIG1hc2tpbmcsIGNoaWxkcmVuLCBmaWx0ZXJzLCBldGMgd2lsbCBub3Qgd29yayBvbiBzcHJpdGVzIGluIHRoaXMgYmF0Y2guXG4gKlxuICogSXQncyBleHRyZW1lbHkgZWFzeSB0byB1c2U6XG4gKiBgYGBqc1xuICogbGV0IGNvbnRhaW5lciA9IG5ldyBQYXJ0aWNsZUNvbnRhaW5lcigpO1xuICpcbiAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwOyArK2kpXG4gKiB7XG4gKiAgICAgbGV0IHNwcml0ZSA9IFBJWEkuU3ByaXRlLmZyb20oXCJteUltYWdlLnBuZ1wiKTtcbiAqICAgICBjb250YWluZXIuYWRkQ2hpbGQoc3ByaXRlKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEFuZCBoZXJlIHlvdSBoYXZlIGEgaHVuZHJlZCBzcHJpdGVzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBhdCB0aGUgc3BlZWQgb2YgbGlnaHQuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLkNvbnRhaW5lclxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFBhcnRpY2xlQ29udGFpbmVyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ29udGFpbmVyKSB7XG4gICAgZnVuY3Rpb24gUGFydGljbGVDb250YWluZXIobWF4U2l6ZSwgcHJvcGVydGllcywgYmF0Y2hTaXplLCBhdXRvUmVzaXplKVxuICAgIHtcbiAgICAgICAgaWYgKCBtYXhTaXplID09PSB2b2lkIDAgKSBtYXhTaXplID0gMTUwMDtcbiAgICAgICAgaWYgKCBiYXRjaFNpemUgPT09IHZvaWQgMCApIGJhdGNoU2l6ZSA9IDE2Mzg0O1xuICAgICAgICBpZiAoIGF1dG9SZXNpemUgPT09IHZvaWQgMCApIGF1dG9SZXNpemUgPSBmYWxzZTtcblxuICAgICAgICBDb250YWluZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBNYWtpbmcgc3VyZSB0aGUgYmF0Y2ggc2l6ZSBpcyB2YWxpZFxuICAgICAgICAvLyA2NTUzNSBpcyBtYXggdmVydGV4IGluZGV4IGluIHRoZSBpbmRleCBidWZmZXIgKHNlZSBQYXJ0aWNsZVJlbmRlcmVyKVxuICAgICAgICAvLyBzbyBtYXggbnVtYmVyIG9mIHBhcnRpY2xlcyBpcyA2NTUzNiAvIDQgPSAxNjM4NFxuICAgICAgICB2YXIgbWF4QmF0Y2hTaXplID0gMTYzODQ7XG5cbiAgICAgICAgaWYgKGJhdGNoU2l6ZSA+IG1heEJhdGNoU2l6ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgYmF0Y2hTaXplID0gbWF4QmF0Y2hTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBwcm9wZXJ0aWVzIHRvIGJlIGR5bmFtaWMgKHRydWUpIC8gc3RhdGljIChmYWxzZSlcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbltdfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IFtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX21heFNpemUgPSBtYXhTaXplO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9iYXRjaFNpemUgPSBiYXRjaFNpemU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge0FycmF5PFBJWEkuQnVmZmVyPn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBmb3IgZXZlcnkgYmF0Y2ggc3RvcmVzIF91cGRhdGVJRCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGNoYW5nZSBpbiB0aGF0IGJhdGNoXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcltdfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYnVmZmVyVXBkYXRlSURzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHdoZW4gY2hpbGQgaW5zZXJ0ZWQsIHJlbW92ZWQgb3IgY2hhbmdlcyBwb3NpdGlvbiB0aGlzIG51bWJlciBnb2VzIHVwXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcltdfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdXBkYXRlSUQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnRlcmFjdGl2ZUNoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBibGVuZCBtb2RlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNwcml0ZS4gQXBwbHkgYSB2YWx1ZSBvZiBgUElYSS5CTEVORF9NT0RFUy5OT1JNQUxgXG4gICAgICAgICAqIHRvIHJlc2V0IHRoZSBibGVuZCBtb2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMXG4gICAgICAgICAqIEBzZWUgUElYSS5CTEVORF9NT0RFU1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSBCTEVORF9NT0RFUy5OT1JNQUw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRydWUsIGNvbnRhaW5lciBhbGxvY2F0ZXMgbW9yZSBiYXRjaGVzIGluIGNhc2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBgbWF4U2l6ZWAgcGFydGljbGVzLlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRvUmVzaXplID0gYXV0b1Jlc2l6ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdHJ1ZSBQaXhpSlMgd2lsbCBNYXRoLmZsb29yKCkgeC95IHZhbHVlcyB3aGVuIHJlbmRlcmluZywgc3RvcHBpbmcgcGl4ZWwgaW50ZXJwb2xhdGlvbi5cbiAgICAgICAgICogQWR2YW50YWdlcyBjYW4gaW5jbHVkZSBzaGFycGVyIGltYWdlIHF1YWxpdHkgKGxpa2UgdGV4dCkgYW5kIGZhc3RlciByZW5kZXJpbmcgb24gY2FudmFzLlxuICAgICAgICAgKiBUaGUgbWFpbiBkaXNhZHZhbnRhZ2UgaXMgbW92ZW1lbnQgb2Ygb2JqZWN0cyBtYXkgYXBwZWFyIGxlc3Mgc21vb3RoLlxuICAgICAgICAgKiBEZWZhdWx0IHRvIHRydWUgaGVyZSBhcyBwZXJmb3JtYW5jZSBpcyB1c3VhbGx5IHRoZSBwcmlvcml0eSBmb3IgcGFydGljbGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJvdW5kUGl4ZWxzID0gdHJ1ZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGNoaWxkcmVuLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5CYXNlVGV4dHVyZX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmFzZVRleHR1cmUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRpbnQgYXBwbGllZCB0byB0aGUgY29udGFpbmVyLlxuICAgICAgICAgKiBUaGlzIGlzIGEgaGV4IHZhbHVlLiBBIHZhbHVlIG9mIDB4RkZGRkZGIHdpbGwgcmVtb3ZlIGFueSB0aW50IGVmZmVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAweEZGRkZGRlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdGludCA9IDA7XG4gICAgICAgIHRoaXMudGludFJnYiA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgICAgIHRoaXMudGludCA9IDB4RkZGRkZGO1xuICAgIH1cblxuICAgIGlmICggQ29udGFpbmVyICkgUGFydGljbGVDb250YWluZXIuX19wcm90b19fID0gQ29udGFpbmVyO1xuICAgIFBhcnRpY2xlQ29udGFpbmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbnRhaW5lciAmJiBDb250YWluZXIucHJvdG90eXBlICk7XG4gICAgUGFydGljbGVDb250YWluZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFydGljbGVDb250YWluZXI7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyB0aW50OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcml2YXRlIHByb3BlcnRpZXMgYXJyYXkgdG8gZHluYW1pYyAvIHN0YXRpYyBiYXNlZCBvbiB0aGUgcGFzc2VkIHByb3BlcnRpZXMgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcGVydGllcyAtIFRoZSBwcm9wZXJ0aWVzIHRvIGJlIHVwbG9hZGVkXG4gICAgICovXG4gICAgUGFydGljbGVDb250YWluZXIucHJvdG90eXBlLnNldFByb3BlcnRpZXMgPSBmdW5jdGlvbiBzZXRQcm9wZXJ0aWVzIChwcm9wZXJ0aWVzKVxuICAgIHtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbMF0gPSAndmVydGljZXMnIGluIHByb3BlcnRpZXMgfHwgJ3NjYWxlJyBpbiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgPyAhIXByb3BlcnRpZXMudmVydGljZXMgfHwgISFwcm9wZXJ0aWVzLnNjYWxlIDogdGhpcy5fcHJvcGVydGllc1swXTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXNbMV0gPSAncG9zaXRpb24nIGluIHByb3BlcnRpZXMgPyAhIXByb3BlcnRpZXMucG9zaXRpb24gOiB0aGlzLl9wcm9wZXJ0aWVzWzFdO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1syXSA9ICdyb3RhdGlvbicgaW4gcHJvcGVydGllcyA/ICEhcHJvcGVydGllcy5yb3RhdGlvbiA6IHRoaXMuX3Byb3BlcnRpZXNbMl07XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzWzNdID0gJ3V2cycgaW4gcHJvcGVydGllcyA/ICEhcHJvcGVydGllcy51dnMgOiB0aGlzLl9wcm9wZXJ0aWVzWzNdO1xuICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc1s0XSA9ICd0aW50JyBpbiBwcm9wZXJ0aWVzIHx8ICdhbHBoYScgaW4gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgID8gISFwcm9wZXJ0aWVzLnRpbnQgfHwgISFwcm9wZXJ0aWVzLmFscGhhIDogdGhpcy5fcHJvcGVydGllc1s0XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBvYmplY3QgdHJhbnNmb3JtIGZvciByZW5kZXJpbmdcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgUGFydGljbGVDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIHVwZGF0ZVRyYW5zZm9ybSAoKVxuICAgIHtcbiAgICAgICAgLy8gVE9ETyBkb24ndCBuZWVkIHRvIVxuICAgICAgICB0aGlzLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgICAgLy8gIFBJWEkuQ29udGFpbmVyLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm0uY2FsbCggdGhpcyApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGludCBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIuIFRoaXMgaXMgYSBoZXggdmFsdWUuXG4gICAgICogQSB2YWx1ZSBvZiAweEZGRkZGRiB3aWxsIHJlbW92ZSBhbnkgdGludCBlZmZlY3QuXG4gICAgICoqIElNUE9SVEFOVDogVGhpcyBpcyBhIFdlYkdMIG9ubHkgZmVhdHVyZSBhbmQgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYW52YXMgcmVuZGVyZXIuXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDB4RkZGRkZGXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW50O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGludC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5fdGludCA9IHZhbHVlO1xuICAgICAgICBoZXgycmdiKHZhbHVlLCB0aGlzLnRpbnRSZ2IpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjb250YWluZXIgdXNpbmcgdGhlIFdlYkdMIHJlbmRlcmVyXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgd2ViZ2wgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBQYXJ0aWNsZUNvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIGlmICghdGhpcy52aXNpYmxlIHx8IHRoaXMud29ybGRBbHBoYSA8PSAwIHx8ICF0aGlzLmNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5yZW5kZXJhYmxlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYmFzZVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRleHR1cmUgPSB0aGlzLmNoaWxkcmVuWzBdLl90ZXh0dXJlLmJhc2VUZXh0dXJlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2VUZXh0dXJlLnZhbGlkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZVRleHR1cmUub25jZSgndXBkYXRlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLm9uQ2hpbGRyZW5DaGFuZ2UoMCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVuZGVyZXIuYmF0Y2guc2V0T2JqZWN0UmVuZGVyZXIocmVuZGVyZXIucGx1Z2lucy5wYXJ0aWNsZSk7XG4gICAgICAgIHJlbmRlcmVyLnBsdWdpbnMucGFydGljbGUucmVuZGVyKHRoaXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZsYWcgdGhhdCBzdGF0aWMgZGF0YSBzaG91bGQgYmUgdXBkYXRlZCB0byB0cnVlXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzbWFsbGVzdENoaWxkSW5kZXggLSBUaGUgc21hbGxlc3QgY2hpbGQgaW5kZXhcbiAgICAgKi9cbiAgICBQYXJ0aWNsZUNvbnRhaW5lci5wcm90b3R5cGUub25DaGlsZHJlbkNoYW5nZSA9IGZ1bmN0aW9uIG9uQ2hpbGRyZW5DaGFuZ2UgKHNtYWxsZXN0Q2hpbGRJbmRleClcbiAgICB7XG4gICAgICAgIHZhciBidWZmZXJJbmRleCA9IE1hdGguZmxvb3Ioc21hbGxlc3RDaGlsZEluZGV4IC8gdGhpcy5fYmF0Y2hTaXplKTtcblxuICAgICAgICB3aGlsZSAodGhpcy5fYnVmZmVyVXBkYXRlSURzLmxlbmd0aCA8IGJ1ZmZlckluZGV4KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXJVcGRhdGVJRHMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9idWZmZXJVcGRhdGVJRHNbYnVmZmVySW5kZXhdID0gKyt0aGlzLl91cGRhdGVJRDtcbiAgICB9O1xuXG4gICAgUGFydGljbGVDb250YWluZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiBkaXNwb3NlICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fYnVmZmVycylcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9idWZmZXJzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlcnNbaV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9idWZmZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdHxib29sZWFufSBbb3B0aW9uc10gLSBPcHRpb25zIHBhcmFtZXRlci4gQSBib29sZWFuIHdpbGwgYWN0IGFzIGlmIGFsbCBvcHRpb25zXG4gICAgICogIGhhdmUgYmVlbiBzZXQgdG8gdGhhdCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hpbGRyZW49ZmFsc2VdIC0gaWYgc2V0IHRvIHRydWUsIGFsbCB0aGUgY2hpbGRyZW4gd2lsbCBoYXZlIHRoZWlyXG4gICAgICogIGRlc3Ryb3kgbWV0aG9kIGNhbGxlZCBhcyB3ZWxsLiAnb3B0aW9ucycgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhvc2UgY2FsbHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBvcHRpb25zLmNoaWxkcmVuIGlzIHNldCB0byB0cnVlXG4gICAgICogIFNob3VsZCBpdCBkZXN0cm95IHRoZSB0ZXh0dXJlIG9mIHRoZSBjaGlsZCBzcHJpdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhc2VUZXh0dXJlPWZhbHNlXSAtIE9ubHkgdXNlZCBmb3IgY2hpbGQgU3ByaXRlcyBpZiBvcHRpb25zLmNoaWxkcmVuIGlzIHNldCB0byB0cnVlXG4gICAgICogIFNob3VsZCBpdCBkZXN0cm95IHRoZSBiYXNlIHRleHR1cmUgb2YgdGhlIGNoaWxkIHNwcml0ZVxuICAgICAqL1xuICAgIFBhcnRpY2xlQ29udGFpbmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIENvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuXG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9idWZmZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYnVmZmVyVXBkYXRlSURzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFBhcnRpY2xlQ29udGFpbmVyLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gUGFydGljbGVDb250YWluZXI7XG59KENvbnRhaW5lcikpO1xuXG4vKipcbiAqIEBhdXRob3IgTWF0IEdyb3Zlc1xuICpcbiAqIEJpZyB0aGFua3MgdG8gdGhlIHZlcnkgY2xldmVyIE1hdHQgRGVzTGF1cmllcnMgPG1hdHRkZXNsPiBodHRwczovL2dpdGh1Yi5jb20vbWF0dGRlc2wvXG4gKiBmb3IgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIFBpeGlKUyB2ZXJzaW9uIVxuICogQWxzbyBhIHRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYmNoZXZhbGllciBmb3IgdHdlYWtpbmcgdGhlIHRpbnQgYW5kIGFscGhhIHNvIHRoYXRcbiAqIHRoZXkgbm93IHNoYXJlIDQgYnl0ZXMgb24gdGhlIHZlcnRleCBidWZmZXJcbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IExpYkdEWCdzIFBhcnRpY2xlQnVmZmVyOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2xpYmdkeC9saWJnZHgvYmxvYi9tYXN0ZXIvZ2R4L3NyYy9jb20vYmFkbG9naWMvZ2R4L2dyYXBoaWNzL2cyZC9QYXJ0aWNsZUJ1ZmZlci5qYXZhXG4gKi9cblxuLyoqXG4gKiBUaGUgcGFydGljbGUgYnVmZmVyIG1hbmFnZXMgdGhlIHN0YXRpYyBhbmQgZHluYW1pYyBidWZmZXJzIGZvciBhIHBhcnRpY2xlIGNvbnRhaW5lci5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgUGFydGljbGVCdWZmZXIgPSBmdW5jdGlvbiBQYXJ0aWNsZUJ1ZmZlcihwcm9wZXJ0aWVzLCBkeW5hbWljUHJvcGVydHlGbGFncywgc2l6ZSlcbntcbiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cbiAgICB0aGlzLmluZGV4QnVmZmVyID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGFydGljbGVzIHRoZSBidWZmZXIgY2FuIGhvbGRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgZHluYW1pYy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7b2JqZWN0W119XG4gICAgICovXG4gICAgdGhpcy5keW5hbWljUHJvcGVydGllcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHN0YXRpYy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG1lbWJlciB7b2JqZWN0W119XG4gICAgICovXG4gICAgdGhpcy5zdGF0aWNQcm9wZXJ0aWVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyArK2kpXG4gICAge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuXG4gICAgICAgIC8vIE1ha2UgY29weSBvZiBwcm9wZXJ0aWVzIG9iamVjdCBzbyB0aGF0IHdoZW4gd2UgZWRpdCB0aGUgb2Zmc2V0IGl0IGRvZXNuJ3RcbiAgICAgICAgLy8gY2hhbmdlIGFsbCBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIG9iamVjdCBsaXRlcmFsXG4gICAgICAgIHByb3BlcnR5ID0ge1xuICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogcHJvcGVydHkuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgIHNpemU6IHByb3BlcnR5LnNpemUsXG4gICAgICAgICAgICB1cGxvYWRGdW5jdGlvbjogcHJvcGVydHkudXBsb2FkRnVuY3Rpb24sXG4gICAgICAgICAgICB0eXBlOiBwcm9wZXJ0eS50eXBlIHx8IFRZUEVTLkZMT0FULFxuICAgICAgICAgICAgb2Zmc2V0OiBwcm9wZXJ0eS5vZmZzZXQsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGR5bmFtaWNQcm9wZXJ0eUZsYWdzW2ldKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zdGF0aWNQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0aWNTdHJpZGUgPSAwO1xuICAgIHRoaXMuc3RhdGljQnVmZmVyID0gbnVsbDtcbiAgICB0aGlzLnN0YXRpY0RhdGEgPSBudWxsO1xuICAgIHRoaXMuc3RhdGljRGF0YVVpbnQzMiA9IG51bGw7XG5cbiAgICB0aGlzLmR5bmFtaWNTdHJpZGUgPSAwO1xuICAgIHRoaXMuZHluYW1pY0J1ZmZlciA9IG51bGw7XG4gICAgdGhpcy5keW5hbWljRGF0YSA9IG51bGw7XG4gICAgdGhpcy5keW5hbWljRGF0YVVpbnQzMiA9IG51bGw7XG5cbiAgICB0aGlzLl91cGRhdGVJRCA9IDA7XG5cbiAgICB0aGlzLmluaXRCdWZmZXJzKCk7XG59O1xuXG4vKipcbiAqIFNldHMgdXAgdGhlIHJlbmRlcmVyIGNvbnRleHQgYW5kIG5lY2Vzc2FyeSBidWZmZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblBhcnRpY2xlQnVmZmVyLnByb3RvdHlwZS5pbml0QnVmZmVycyA9IGZ1bmN0aW9uIGluaXRCdWZmZXJzICgpXG57XG4gICAgdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuICAgIHZhciBkeW5hbWljT2Zmc2V0ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEhvbGRzIHRoZSBpbmRpY2VzIG9mIHRoZSBnZW9tZXRyeSAocXVhZHMpIHRvIGRyYXdcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1VpbnQxNkFycmF5fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbmRleEJ1ZmZlciA9IG5ldyBCdWZmZXIoY3JlYXRlSW5kaWNlc0ZvclF1YWRzKHRoaXMuc2l6ZSksIHRydWUsIHRydWUpO1xuICAgIGdlb21ldHJ5LmFkZEluZGV4KHRoaXMuaW5kZXhCdWZmZXIpO1xuXG4gICAgdGhpcy5keW5hbWljU3RyaWRlID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5keW5hbWljUHJvcGVydGllcy5sZW5ndGg7ICsraSlcbiAgICB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuZHluYW1pY1Byb3BlcnRpZXNbaV07XG5cbiAgICAgICAgcHJvcGVydHkub2Zmc2V0ID0gZHluYW1pY09mZnNldDtcbiAgICAgICAgZHluYW1pY09mZnNldCArPSBwcm9wZXJ0eS5zaXplO1xuICAgICAgICB0aGlzLmR5bmFtaWNTdHJpZGUgKz0gcHJvcGVydHkuc2l6ZTtcbiAgICB9XG5cbiAgICB2YXIgZHluQnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuc2l6ZSAqIHRoaXMuZHluYW1pY1N0cmlkZSAqIDQgKiA0KTtcblxuICAgIHRoaXMuZHluYW1pY0RhdGEgPSBuZXcgRmxvYXQzMkFycmF5KGR5bkJ1ZmZlcik7XG4gICAgdGhpcy5keW5hbWljRGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShkeW5CdWZmZXIpO1xuICAgIHRoaXMuZHluYW1pY0J1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5keW5hbWljRGF0YSwgZmFsc2UsIGZhbHNlKTtcblxuICAgIC8vIHN0YXRpYyAvL1xuICAgIHZhciBzdGF0aWNPZmZzZXQgPSAwO1xuXG4gICAgdGhpcy5zdGF0aWNTdHJpZGUgPSAwO1xuXG4gICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdGhpcy5zdGF0aWNQcm9wZXJ0aWVzLmxlbmd0aDsgKytpJDEpXG4gICAge1xuICAgICAgICB2YXIgcHJvcGVydHkkMSA9IHRoaXMuc3RhdGljUHJvcGVydGllc1tpJDFdO1xuXG4gICAgICAgIHByb3BlcnR5JDEub2Zmc2V0ID0gc3RhdGljT2Zmc2V0O1xuICAgICAgICBzdGF0aWNPZmZzZXQgKz0gcHJvcGVydHkkMS5zaXplO1xuICAgICAgICB0aGlzLnN0YXRpY1N0cmlkZSArPSBwcm9wZXJ0eSQxLnNpemU7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5zaXplICogdGhpcy5zdGF0aWNTdHJpZGUgKiA0ICogNCk7XG5cbiAgICB0aGlzLnN0YXRpY0RhdGEgPSBuZXcgRmxvYXQzMkFycmF5KHN0YXRCdWZmZXIpO1xuICAgIHRoaXMuc3RhdGljRGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShzdGF0QnVmZmVyKTtcbiAgICB0aGlzLnN0YXRpY0J1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5zdGF0aWNEYXRhLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCB0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzLmxlbmd0aDsgKytpJDIpXG4gICAge1xuICAgICAgICB2YXIgcHJvcGVydHkkMiA9IHRoaXMuZHluYW1pY1Byb3BlcnRpZXNbaSQyXTtcblxuICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBwcm9wZXJ0eSQyLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNCdWZmZXIsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgcHJvcGVydHkkMi50eXBlID09PSBUWVBFUy5VTlNJR05FRF9CWVRFLFxuICAgICAgICAgICAgcHJvcGVydHkkMi50eXBlLFxuICAgICAgICAgICAgdGhpcy5keW5hbWljU3RyaWRlICogNCxcbiAgICAgICAgICAgIHByb3BlcnR5JDIub2Zmc2V0ICogNFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IHRoaXMuc3RhdGljUHJvcGVydGllcy5sZW5ndGg7ICsraSQzKVxuICAgIHtcbiAgICAgICAgdmFyIHByb3BlcnR5JDMgPSB0aGlzLnN0YXRpY1Byb3BlcnRpZXNbaSQzXTtcblxuICAgICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBwcm9wZXJ0eSQzLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICB0aGlzLnN0YXRpY0J1ZmZlcixcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBwcm9wZXJ0eSQzLnR5cGUgPT09IFRZUEVTLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgICAgICBwcm9wZXJ0eSQzLnR5cGUsXG4gICAgICAgICAgICB0aGlzLnN0YXRpY1N0cmlkZSAqIDQsXG4gICAgICAgICAgICBwcm9wZXJ0eSQzLm9mZnNldCAqIDRcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFVwbG9hZHMgdGhlIGR5bmFtaWMgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3RbXX0gY2hpbGRyZW4gLSBUaGUgY2hpbGRyZW4gdG8gdXBsb2FkLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggLSBUaGUgaW5kZXggdG8gc3RhcnQgYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IC0gVGhlIG51bWJlciB0byB1cGxvYWQuXG4gKi9cblBhcnRpY2xlQnVmZmVyLnByb3RvdHlwZS51cGxvYWREeW5hbWljID0gZnVuY3Rpb24gdXBsb2FkRHluYW1pYyAoY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudClcbntcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHluYW1pY1Byb3BlcnRpZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzW2ldO1xuXG4gICAgICAgIHByb3BlcnR5LnVwbG9hZEZ1bmN0aW9uKGNoaWxkcmVuLCBzdGFydEluZGV4LCBhbW91bnQsXG4gICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSBUWVBFUy5VTlNJR05FRF9CWVRFID8gdGhpcy5keW5hbWljRGF0YVVpbnQzMiA6IHRoaXMuZHluYW1pY0RhdGEsXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNTdHJpZGUsIHByb3BlcnR5Lm9mZnNldCk7XG4gICAgfVxuXG4gICAgdGhpcy5keW5hbWljQnVmZmVyLl91cGRhdGVJRCsrO1xufTtcblxuLyoqXG4gKiBVcGxvYWRzIHRoZSBzdGF0aWMgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3RbXX0gY2hpbGRyZW4gLSBUaGUgY2hpbGRyZW4gdG8gdXBsb2FkLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggLSBUaGUgaW5kZXggdG8gc3RhcnQgYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IC0gVGhlIG51bWJlciB0byB1cGxvYWQuXG4gKi9cblBhcnRpY2xlQnVmZmVyLnByb3RvdHlwZS51cGxvYWRTdGF0aWMgPSBmdW5jdGlvbiB1cGxvYWRTdGF0aWMgKGNoaWxkcmVuLCBzdGFydEluZGV4LCBhbW91bnQpXG57XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0YXRpY1Byb3BlcnRpZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnN0YXRpY1Byb3BlcnRpZXNbaV07XG5cbiAgICAgICAgcHJvcGVydHkudXBsb2FkRnVuY3Rpb24oY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudCxcbiAgICAgICAgICAgIHByb3BlcnR5LnR5cGUgPT09IFRZUEVTLlVOU0lHTkVEX0JZVEUgPyB0aGlzLnN0YXRpY0RhdGFVaW50MzIgOiB0aGlzLnN0YXRpY0RhdGEsXG4gICAgICAgICAgICB0aGlzLnN0YXRpY1N0cmlkZSwgcHJvcGVydHkub2Zmc2V0KTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRpY0J1ZmZlci5fdXBkYXRlSUQrKztcbn07XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIFBhcnRpY2xlQnVmZmVyLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblBhcnRpY2xlQnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxue1xuICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBudWxsO1xuXG4gICAgdGhpcy5keW5hbWljUHJvcGVydGllcyA9IG51bGw7XG4gICAgLy8gdGhpcy5keW5hbWljQnVmZmVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmR5bmFtaWNCdWZmZXIgPSBudWxsO1xuICAgIHRoaXMuZHluYW1pY0RhdGEgPSBudWxsO1xuICAgIHRoaXMuZHluYW1pY0RhdGFVaW50MzIgPSBudWxsO1xuXG4gICAgdGhpcy5zdGF0aWNQcm9wZXJ0aWVzID0gbnVsbDtcbiAgICAvLyB0aGlzLnN0YXRpY0J1ZmZlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zdGF0aWNCdWZmZXIgPSBudWxsO1xuICAgIHRoaXMuc3RhdGljRGF0YSA9IG51bGw7XG4gICAgdGhpcy5zdGF0aWNEYXRhVWludDMyID0gbnVsbDtcbiAgICAvLyBhbGwgYnVmZmVycyBhcmUgZGVzdHJveWVkIGluc2lkZSBnZW9tZXRyeVxuICAgIHRoaXMuZ2VvbWV0cnkuZGVzdHJveSgpO1xufTtcblxudmFyIHZlcnRleCA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIGFUZXh0dXJlQ29vcmQ7XFxuYXR0cmlidXRlIHZlYzQgYUNvbG9yO1xcblxcbmF0dHJpYnV0ZSB2ZWMyIGFQb3NpdGlvbkNvb3JkO1xcbmF0dHJpYnV0ZSBmbG9hdCBhUm90YXRpb247XFxuXFxudW5pZm9ybSBtYXQzIHRyYW5zbGF0aW9uTWF0cml4O1xcbnVuaWZvcm0gdmVjNCB1Q29sb3I7XFxuXFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxudmFyeWluZyB2ZWM0IHZDb2xvcjtcXG5cXG52b2lkIG1haW4odm9pZCl7XFxuICAgIGZsb2F0IHggPSAoYVZlcnRleFBvc2l0aW9uLngpICogY29zKGFSb3RhdGlvbikgLSAoYVZlcnRleFBvc2l0aW9uLnkpICogc2luKGFSb3RhdGlvbik7XFxuICAgIGZsb2F0IHkgPSAoYVZlcnRleFBvc2l0aW9uLngpICogc2luKGFSb3RhdGlvbikgKyAoYVZlcnRleFBvc2l0aW9uLnkpICogY29zKGFSb3RhdGlvbik7XFxuXFxuICAgIHZlYzIgdiA9IHZlYzIoeCwgeSk7XFxuICAgIHYgPSB2ICsgYVBvc2l0aW9uQ29vcmQ7XFxuXFxuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgodHJhbnNsYXRpb25NYXRyaXggKiB2ZWMzKHYsIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxuXFxuICAgIHZUZXh0dXJlQ29vcmQgPSBhVGV4dHVyZUNvb3JkO1xcbiAgICB2Q29sb3IgPSBhQ29sb3IgKiB1Q29sb3I7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcbnZhcnlpbmcgdmVjNCB2Q29sb3I7XFxuXFxudW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XFxuXFxudm9pZCBtYWluKHZvaWQpe1xcbiAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKSAqIHZDb2xvcjtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XFxufVwiO1xuXG4vKipcbiAqIEBhdXRob3IgTWF0IEdyb3Zlc1xuICpcbiAqIEJpZyB0aGFua3MgdG8gdGhlIHZlcnkgY2xldmVyIE1hdHQgRGVzTGF1cmllcnMgPG1hdHRkZXNsPiBodHRwczovL2dpdGh1Yi5jb20vbWF0dGRlc2wvXG4gKiBmb3IgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIFBpeGlKUyB2ZXJzaW9uIVxuICogQWxzbyBhIHRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vYmNoZXZhbGllciBmb3IgdHdlYWtpbmcgdGhlIHRpbnQgYW5kIGFscGhhIHNvIHRoYXQgdGhleSBub3dcbiAqIHNoYXJlIDQgYnl0ZXMgb24gdGhlIHZlcnRleCBidWZmZXJcbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IExpYkdEWCdzIFBhcnRpY2xlUmVuZGVyZXI6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vbGliZ2R4L2xpYmdkeC9ibG9iL21hc3Rlci9nZHgvc3JjL2NvbS9iYWRsb2dpYy9nZHgvZ3JhcGhpY3MvZzJkL1BhcnRpY2xlUmVuZGVyZXIuamF2YVxuICovXG5cbi8qKlxuICogUmVuZGVyZXIgZm9yIFBhcnRpY2xlcyB0aGF0IGlzIGRlc2lnbmVyIGZvciBzcGVlZCBvdmVyIGZlYXR1cmUgc2V0LlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFBhcnRpY2xlUmVuZGVyZXIgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChPYmplY3RSZW5kZXJlcikge1xuICAgIGZ1bmN0aW9uIFBhcnRpY2xlUmVuZGVyZXIocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBPYmplY3RSZW5kZXJlci5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICAvLyA2NTUzNSBpcyBtYXggdmVydGV4IGluZGV4IGluIHRoZSBpbmRleCBidWZmZXIgKHNlZSBQYXJ0aWNsZVJlbmRlcmVyKVxuICAgICAgICAvLyBzbyBtYXggbnVtYmVyIG9mIHBhcnRpY2xlcyBpcyA2NTUzNiAvIDQgPSAxNjM4NFxuICAgICAgICAvLyBhbmQgbWF4IG51bWJlciBvZiBlbGVtZW50IGluIHRoZSBpbmRleCBidWZmZXIgaXMgMTYzODQgKiA2ID0gOTgzMDRcbiAgICAgICAgLy8gQ3JlYXRpbmcgYSBmdWxsIGluZGV4IGJ1ZmZlciwgb3ZlcmhlYWQgaXMgOTgzMDQgKiAyID0gMTk2S29cbiAgICAgICAgLy8gbGV0IG51bUluZGljZXMgPSA5ODMwNDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRlZmF1bHQgc2hhZGVyIHRoYXQgaXMgdXNlZCBpZiBhIHNwcml0ZSBkb2Vzbid0IGhhdmUgYSBtb3JlIHNwZWNpZmljIG9uZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5TaGFkZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNoYWRlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbnVsbDtcblxuICAgICAgICB0aGlzLnRlbXBNYXRyaXggPSBuZXcgTWF0cml4KCk7XG5cbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgLy8gdmVydGljZXNEYXRhXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogJ2FWZXJ0ZXhQb3NpdGlvbicsXG4gICAgICAgICAgICAgICAgc2l6ZTogMixcbiAgICAgICAgICAgICAgICB1cGxvYWRGdW5jdGlvbjogdGhpcy51cGxvYWRWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gcG9zaXRpb25EYXRhXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogJ2FQb3NpdGlvbkNvb3JkJyxcbiAgICAgICAgICAgICAgICBzaXplOiAyLFxuICAgICAgICAgICAgICAgIHVwbG9hZEZ1bmN0aW9uOiB0aGlzLnVwbG9hZFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyByb3RhdGlvbkRhdGFcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiAnYVJvdGF0aW9uJyxcbiAgICAgICAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgICAgICAgIHVwbG9hZEZ1bmN0aW9uOiB0aGlzLnVwbG9hZFJvdGF0aW9uLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB1dnNEYXRhXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogJ2FUZXh0dXJlQ29vcmQnLFxuICAgICAgICAgICAgICAgIHNpemU6IDIsXG4gICAgICAgICAgICAgICAgdXBsb2FkRnVuY3Rpb246IHRoaXMudXBsb2FkVXZzLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB0aW50RGF0YVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6ICdhQ29sb3InLFxuICAgICAgICAgICAgICAgIHNpemU6IDEsXG4gICAgICAgICAgICAgICAgdHlwZTogVFlQRVMuVU5TSUdORURfQllURSxcbiAgICAgICAgICAgICAgICB1cGxvYWRGdW5jdGlvbjogdGhpcy51cGxvYWRUaW50LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIH0gXTtcblxuICAgICAgICB0aGlzLnNoYWRlciA9IFNoYWRlci5mcm9tKHZlcnRleCwgZnJhZ21lbnQsIHt9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFdlYkdMIHN0YXRlIGluIHdoaWNoIHRoaXMgcmVuZGVyZXIgd2lsbCB3b3JrLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlN0YXRlfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5mb3IyZCgpO1xuICAgIH1cblxuICAgIGlmICggT2JqZWN0UmVuZGVyZXIgKSBQYXJ0aWNsZVJlbmRlcmVyLl9fcHJvdG9fXyA9IE9iamVjdFJlbmRlcmVyO1xuICAgIFBhcnRpY2xlUmVuZGVyZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0UmVuZGVyZXIgJiYgT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlICk7XG4gICAgUGFydGljbGVSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJ0aWNsZVJlbmRlcmVyO1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgcGFydGljbGUgY29udGFpbmVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5QYXJ0aWNsZUNvbnRhaW5lcn0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciB0byByZW5kZXIgdXNpbmcgdGhpcyBQYXJ0aWNsZVJlbmRlcmVyXG4gICAgICovXG4gICAgUGFydGljbGVSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyIChjb250YWluZXIpXG4gICAge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBjb250YWluZXIuY2hpbGRyZW47XG4gICAgICAgIHZhciBtYXhTaXplID0gY29udGFpbmVyLl9tYXhTaXplO1xuICAgICAgICB2YXIgYmF0Y2hTaXplID0gY29udGFpbmVyLl9iYXRjaFNpemU7XG4gICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIHZhciB0b3RhbENoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0b3RhbENoaWxkcmVuID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG90YWxDaGlsZHJlbiA+IG1heFNpemUgJiYgIWNvbnRhaW5lci5hdXRvUmVzaXplKVxuICAgICAgICB7XG4gICAgICAgICAgICB0b3RhbENoaWxkcmVuID0gbWF4U2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBidWZmZXJzID0gY29udGFpbmVyLl9idWZmZXJzO1xuXG4gICAgICAgIGlmICghYnVmZmVycylcbiAgICAgICAge1xuICAgICAgICAgICAgYnVmZmVycyA9IGNvbnRhaW5lci5fYnVmZmVycyA9IHRoaXMuZ2VuZXJhdGVCdWZmZXJzKGNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmFzZVRleHR1cmUgPSBjaGlsZHJlblswXS5fdGV4dHVyZS5iYXNlVGV4dHVyZTtcblxuICAgICAgICAvLyBpZiB0aGUgdXZzIGhhdmUgbm90IHVwZGF0ZWQgdGhlbiBubyBwb2ludCByZW5kZXJpbmcganVzdCB5ZXQhXG4gICAgICAgIHRoaXMuc3RhdGUuYmxlbmRNb2RlID0gY29ycmVjdEJsZW5kTW9kZShjb250YWluZXIuYmxlbmRNb2RlLCBiYXNlVGV4dHVyZS5hbHBoYU1vZGUpO1xuICAgICAgICByZW5kZXJlci5zdGF0ZS5zZXQodGhpcy5zdGF0ZSk7XG5cbiAgICAgICAgdmFyIGdsID0gcmVuZGVyZXIuZ2w7XG5cbiAgICAgICAgdmFyIG0gPSBjb250YWluZXIud29ybGRUcmFuc2Zvcm0uY29weVRvKHRoaXMudGVtcE1hdHJpeCk7XG5cbiAgICAgICAgbS5wcmVwZW5kKHJlbmRlcmVyLmdsb2JhbFVuaWZvcm1zLnVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXgpO1xuXG4gICAgICAgIHRoaXMuc2hhZGVyLnVuaWZvcm1zLnRyYW5zbGF0aW9uTWF0cml4ID0gbS50b0FycmF5KHRydWUpO1xuXG4gICAgICAgIHRoaXMuc2hhZGVyLnVuaWZvcm1zLnVDb2xvciA9IHByZW11bHRpcGx5UmdiYShjb250YWluZXIudGludFJnYixcbiAgICAgICAgICAgIGNvbnRhaW5lci53b3JsZEFscGhhLCB0aGlzLnNoYWRlci51bmlmb3Jtcy51Q29sb3IsIGJhc2VUZXh0dXJlLmFscGhhTW9kZSk7XG5cbiAgICAgICAgdGhpcy5zaGFkZXIudW5pZm9ybXMudVNhbXBsZXIgPSBiYXNlVGV4dHVyZTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRlci5iaW5kKHRoaXMuc2hhZGVyKTtcblxuICAgICAgICB2YXIgdXBkYXRlU3RhdGljID0gZmFsc2U7XG5cbiAgICAgICAgLy8gbm93IGxldHMgdXBsb2FkIGFuZCByZW5kZXIgdGhlIGJ1ZmZlcnMuLlxuICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCB0b3RhbENoaWxkcmVuOyBpICs9IGJhdGNoU2l6ZSwgaiArPSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYW1vdW50ID0gKHRvdGFsQ2hpbGRyZW4gLSBpKTtcblxuICAgICAgICAgICAgaWYgKGFtb3VudCA+IGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbW91bnQgPSBiYXRjaFNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChqID49IGJ1ZmZlcnMubGVuZ3RoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaCh0aGlzLl9nZW5lcmF0ZU9uZU1vcmVCdWZmZXIoY29udGFpbmVyKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBidWZmZXJzW2pdO1xuXG4gICAgICAgICAgICAvLyB3ZSBhbHdheXMgdXBsb2FkIHRoZSBkeW5hbWljXG4gICAgICAgICAgICBidWZmZXIudXBsb2FkRHluYW1pYyhjaGlsZHJlbiwgaSwgYW1vdW50KTtcblxuICAgICAgICAgICAgdmFyIGJpZCA9IGNvbnRhaW5lci5fYnVmZmVyVXBkYXRlSURzW2pdIHx8IDA7XG5cbiAgICAgICAgICAgIHVwZGF0ZVN0YXRpYyA9IHVwZGF0ZVN0YXRpYyB8fCAoYnVmZmVyLl91cGRhdGVJRCA8IGJpZCk7XG4gICAgICAgICAgICAvLyB3ZSBvbmx5IHVwbG9hZCB0aGUgc3RhdGljIGNvbnRlbnQgd2hlbiB3ZSBoYXZlIHRvIVxuICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRpYylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBidWZmZXIuX3VwZGF0ZUlEID0gY29udGFpbmVyLl91cGRhdGVJRDtcbiAgICAgICAgICAgICAgICBidWZmZXIudXBsb2FkU3RhdGljKGNoaWxkcmVuLCBpLCBhbW91bnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiaW5kIHRoZSBidWZmZXJcbiAgICAgICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmJpbmQoYnVmZmVyLmdlb21ldHJ5KTtcbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIGFtb3VudCAqIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9uZSBwYXJ0aWNsZSBidWZmZXIgZm9yIGVhY2ggY2hpbGQgaW4gdGhlIGNvbnRhaW5lciB3ZSB3YW50IHRvIHJlbmRlciBhbmQgdXBkYXRlcyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUGFydGljbGVDb250YWluZXJ9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgdG8gcmVuZGVyIHVzaW5nIHRoaXMgUGFydGljbGVSZW5kZXJlclxuICAgICAqIEByZXR1cm4ge1BJWEkuUGFydGljbGVCdWZmZXJbXX0gVGhlIGJ1ZmZlcnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIFBhcnRpY2xlUmVuZGVyZXIucHJvdG90eXBlLmdlbmVyYXRlQnVmZmVycyA9IGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVycyAoY29udGFpbmVyKVxuICAgIHtcbiAgICAgICAgdmFyIGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdmFyIHNpemUgPSBjb250YWluZXIuX21heFNpemU7XG4gICAgICAgIHZhciBiYXRjaFNpemUgPSBjb250YWluZXIuX2JhdGNoU2l6ZTtcbiAgICAgICAgdmFyIGR5bmFtaWNQcm9wZXJ0eUZsYWdzID0gY29udGFpbmVyLl9wcm9wZXJ0aWVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBiYXRjaFNpemUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChuZXcgUGFydGljbGVCdWZmZXIodGhpcy5wcm9wZXJ0aWVzLCBkeW5hbWljUHJvcGVydHlGbGFncywgYmF0Y2hTaXplKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnVmZmVycztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBvbmUgbW9yZSBwYXJ0aWNsZSBidWZmZXIsIGJlY2F1c2UgY29udGFpbmVyIGhhcyBhdXRvUmVzaXplIGZlYXR1cmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5QYXJ0aWNsZUNvbnRhaW5lcn0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciB0byByZW5kZXIgdXNpbmcgdGhpcyBQYXJ0aWNsZVJlbmRlcmVyXG4gICAgICogQHJldHVybiB7UElYSS5QYXJ0aWNsZUJ1ZmZlcn0gZ2VuZXJhdGVkIGJ1ZmZlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgUGFydGljbGVSZW5kZXJlci5wcm90b3R5cGUuX2dlbmVyYXRlT25lTW9yZUJ1ZmZlciA9IGZ1bmN0aW9uIF9nZW5lcmF0ZU9uZU1vcmVCdWZmZXIgKGNvbnRhaW5lcilcbiAgICB7XG4gICAgICAgIHZhciBiYXRjaFNpemUgPSBjb250YWluZXIuX2JhdGNoU2l6ZTtcbiAgICAgICAgdmFyIGR5bmFtaWNQcm9wZXJ0eUZsYWdzID0gY29udGFpbmVyLl9wcm9wZXJ0aWVzO1xuXG4gICAgICAgIHJldHVybiBuZXcgUGFydGljbGVCdWZmZXIodGhpcy5wcm9wZXJ0aWVzLCBkeW5hbWljUHJvcGVydHlGbGFncywgYmF0Y2hTaXplKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgdmVydGljZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdFtdfSBjaGlsZHJlbiAtIHRoZSBhcnJheSBvZiBkaXNwbGF5IG9iamVjdHMgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggLSB0aGUgaW5kZXggdG8gc3RhcnQgZnJvbSBpbiB0aGUgY2hpbGRyZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBjaGlsZHJlbiB0aGF0IHdpbGwgaGF2ZSB0aGVpciB2ZXJ0aWNlcyB1cGxvYWRlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IC0gVGhlIHZlcnRpY2VzIHRvIHVwbG9hZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gU3RyaWRlIHRvIHVzZSBmb3IgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBPZmZzZXQgdG8gc3RhcnQgYXQuXG4gICAgICovXG4gICAgUGFydGljbGVSZW5kZXJlci5wcm90b3R5cGUudXBsb2FkVmVydGljZXMgPSBmdW5jdGlvbiB1cGxvYWRWZXJ0aWNlcyAoY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudCwgYXJyYXksIHN0cmlkZSwgb2Zmc2V0KVxuICAgIHtcbiAgICAgICAgdmFyIHcwID0gMDtcbiAgICAgICAgdmFyIHcxID0gMDtcbiAgICAgICAgdmFyIGgwID0gMDtcbiAgICAgICAgdmFyIGgxID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFtb3VudDsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc3ByaXRlID0gY2hpbGRyZW5bc3RhcnRJbmRleCArIGldO1xuICAgICAgICAgICAgdmFyIHRleHR1cmUgPSBzcHJpdGUuX3RleHR1cmU7XG4gICAgICAgICAgICB2YXIgc3ggPSBzcHJpdGUuc2NhbGUueDtcbiAgICAgICAgICAgIHZhciBzeSA9IHNwcml0ZS5zY2FsZS55O1xuICAgICAgICAgICAgdmFyIHRyaW0gPSB0ZXh0dXJlLnRyaW07XG4gICAgICAgICAgICB2YXIgb3JpZyA9IHRleHR1cmUub3JpZztcblxuICAgICAgICAgICAgaWYgKHRyaW0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNwcml0ZSBpcyB0cmltbWVkIGFuZCBpcyBub3QgYSB0aWxpbmdzcHJpdGUgdGhlbiB3ZSBuZWVkIHRvIGFkZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBzcGFjZSBiZWZvcmUgdHJhbnNmb3JtaW5nIHRoZSBzcHJpdGUgY29vcmRzLi5cbiAgICAgICAgICAgICAgICB3MSA9IHRyaW0ueCAtIChzcHJpdGUuYW5jaG9yLnggKiBvcmlnLndpZHRoKTtcbiAgICAgICAgICAgICAgICB3MCA9IHcxICsgdHJpbS53aWR0aDtcblxuICAgICAgICAgICAgICAgIGgxID0gdHJpbS55IC0gKHNwcml0ZS5hbmNob3IueSAqIG9yaWcuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBoMCA9IGgxICsgdHJpbS5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdzAgPSAob3JpZy53aWR0aCkgKiAoMSAtIHNwcml0ZS5hbmNob3IueCk7XG4gICAgICAgICAgICAgICAgdzEgPSAob3JpZy53aWR0aCkgKiAtc3ByaXRlLmFuY2hvci54O1xuXG4gICAgICAgICAgICAgICAgaDAgPSBvcmlnLmhlaWdodCAqICgxIC0gc3ByaXRlLmFuY2hvci55KTtcbiAgICAgICAgICAgICAgICBoMSA9IG9yaWcuaGVpZ2h0ICogLXNwcml0ZS5hbmNob3IueTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0XSA9IHcxICogc3g7XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IGgxICogc3k7XG5cbiAgICAgICAgICAgIGFycmF5W29mZnNldCArIHN0cmlkZV0gPSB3MCAqIHN4O1xuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlICsgMV0gPSBoMSAqIHN5O1xuXG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMildID0gdzAgKiBzeDtcbiAgICAgICAgICAgIGFycmF5W29mZnNldCArIChzdHJpZGUgKiAyKSArIDFdID0gaDAgKiBzeTtcblxuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpXSA9IHcxICogc3g7XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMykgKyAxXSA9IGgwICogc3k7XG5cbiAgICAgICAgICAgIG9mZnNldCArPSBzdHJpZGUgKiA0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3RbXX0gY2hpbGRyZW4gLSB0aGUgYXJyYXkgb2YgZGlzcGxheSBvYmplY3RzIHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4IC0gdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20gaW4gdGhlIGNoaWxkcmVuIGFycmF5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGhhdmUgdGhlaXIgcG9zaXRpb25zIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gYXJyYXkgLSBUaGUgdmVydGljZXMgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBTdHJpZGUgdG8gdXNlIGZvciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIE9mZnNldCB0byBzdGFydCBhdC5cbiAgICAgKi9cbiAgICBQYXJ0aWNsZVJlbmRlcmVyLnByb3RvdHlwZS51cGxvYWRQb3NpdGlvbiA9IGZ1bmN0aW9uIHVwbG9hZFBvc2l0aW9uIChjaGlsZHJlbiwgc3RhcnRJbmRleCwgYW1vdW50LCBhcnJheSwgc3RyaWRlLCBvZmZzZXQpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFtb3VudDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgc3ByaXRlUG9zaXRpb24gPSBjaGlsZHJlbltzdGFydEluZGV4ICsgaV0ucG9zaXRpb247XG5cbiAgICAgICAgICAgIGFycmF5W29mZnNldF0gPSBzcHJpdGVQb3NpdGlvbi54O1xuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSBzcHJpdGVQb3NpdGlvbi55O1xuXG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyBzdHJpZGVdID0gc3ByaXRlUG9zaXRpb24ueDtcbiAgICAgICAgICAgIGFycmF5W29mZnNldCArIHN0cmlkZSArIDFdID0gc3ByaXRlUG9zaXRpb24ueTtcblxuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDIpXSA9IHNwcml0ZVBvc2l0aW9uLng7XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMikgKyAxXSA9IHNwcml0ZVBvc2l0aW9uLnk7XG5cbiAgICAgICAgICAgIGFycmF5W29mZnNldCArIChzdHJpZGUgKiAzKV0gPSBzcHJpdGVQb3NpdGlvbi54O1xuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpICsgMV0gPSBzcHJpdGVQb3NpdGlvbi55O1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RyaWRlICogNDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSByb3RpYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdFtdfSBjaGlsZHJlbiAtIHRoZSBhcnJheSBvZiBkaXNwbGF5IG9iamVjdHMgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggLSB0aGUgaW5kZXggdG8gc3RhcnQgZnJvbSBpbiB0aGUgY2hpbGRyZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBjaGlsZHJlbiB0aGF0IHdpbGwgaGF2ZSB0aGVpciByb3RhdGlvbiB1cGxvYWRlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IC0gVGhlIHZlcnRpY2VzIHRvIHVwbG9hZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gU3RyaWRlIHRvIHVzZSBmb3IgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBPZmZzZXQgdG8gc3RhcnQgYXQuXG4gICAgICovXG4gICAgUGFydGljbGVSZW5kZXJlci5wcm90b3R5cGUudXBsb2FkUm90YXRpb24gPSBmdW5jdGlvbiB1cGxvYWRSb3RhdGlvbiAoY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudCwgYXJyYXksIHN0cmlkZSwgb2Zmc2V0KVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbW91bnQ7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHNwcml0ZVJvdGF0aW9uID0gY2hpbGRyZW5bc3RhcnRJbmRleCArIGldLnJvdGF0aW9uO1xuXG4gICAgICAgICAgICBhcnJheVtvZmZzZXRdID0gc3ByaXRlUm90YXRpb247XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyBzdHJpZGVdID0gc3ByaXRlUm90YXRpb247XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMildID0gc3ByaXRlUm90YXRpb247XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMyldID0gc3ByaXRlUm90YXRpb247XG5cbiAgICAgICAgICAgIG9mZnNldCArPSBzdHJpZGUgKiA0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIFV2c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3RbXX0gY2hpbGRyZW4gLSB0aGUgYXJyYXkgb2YgZGlzcGxheSBvYmplY3RzIHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4IC0gdGhlIGluZGV4IHRvIHN0YXJ0IGZyb20gaW4gdGhlIGNoaWxkcmVuIGFycmF5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGhhdmUgdGhlaXIgcm90YXRpb24gdXBsb2FkZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBhcnJheSAtIFRoZSB2ZXJ0aWNlcyB0byB1cGxvYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0cmlkZSAtIFN0cmlkZSB0byB1c2UgZm9yIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gT2Zmc2V0IHRvIHN0YXJ0IGF0LlxuICAgICAqL1xuICAgIFBhcnRpY2xlUmVuZGVyZXIucHJvdG90eXBlLnVwbG9hZFV2cyA9IGZ1bmN0aW9uIHVwbG9hZFV2cyAoY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudCwgYXJyYXksIHN0cmlkZSwgb2Zmc2V0KVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbW91bnQ7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRleHR1cmVVdnMgPSBjaGlsZHJlbltzdGFydEluZGV4ICsgaV0uX3RleHR1cmUuX3V2cztcblxuICAgICAgICAgICAgaWYgKHRleHR1cmVVdnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0XSA9IHRleHR1cmVVdnMueDA7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSB0ZXh0dXJlVXZzLnkwO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlXSA9IHRleHR1cmVVdnMueDE7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlICsgMV0gPSB0ZXh0dXJlVXZzLnkxO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDIpXSA9IHRleHR1cmVVdnMueDI7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDIpICsgMV0gPSB0ZXh0dXJlVXZzLnkyO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpXSA9IHRleHR1cmVVdnMueDM7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpICsgMV0gPSB0ZXh0dXJlVXZzLnkzO1xuXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN0cmlkZSAqIDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyB5b3Uga25vdyB0aGlzIGNhbiBiZSBlYXNpZXIhXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0XSA9IDA7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSAwO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlXSA9IDA7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlICsgMV0gPSAwO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDIpXSA9IDA7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDIpICsgMV0gPSAwO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpXSA9IDA7XG4gICAgICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgKHN0cmlkZSAqIDMpICsgMV0gPSAwO1xuXG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN0cmlkZSAqIDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgdGludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0W119IGNoaWxkcmVuIC0gdGhlIGFycmF5IG9mIGRpc3BsYXkgb2JqZWN0cyB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRJbmRleCAtIHRoZSBpbmRleCB0byBzdGFydCBmcm9tIGluIHRoZSBjaGlsZHJlbiBhcnJheVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIGNoaWxkcmVuIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHJvdGF0aW9uIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gYXJyYXkgLSBUaGUgdmVydGljZXMgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBTdHJpZGUgdG8gdXNlIGZvciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIE9mZnNldCB0byBzdGFydCBhdC5cbiAgICAgKi9cbiAgICBQYXJ0aWNsZVJlbmRlcmVyLnByb3RvdHlwZS51cGxvYWRUaW50ID0gZnVuY3Rpb24gdXBsb2FkVGludCAoY2hpbGRyZW4sIHN0YXJ0SW5kZXgsIGFtb3VudCwgYXJyYXksIHN0cmlkZSwgb2Zmc2V0KVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbW91bnQ7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHNwcml0ZSA9IGNoaWxkcmVuW3N0YXJ0SW5kZXggKyBpXTtcbiAgICAgICAgICAgIHZhciBwcmVtdWx0aXBsaWVkID0gc3ByaXRlLl90ZXh0dXJlLmJhc2VUZXh0dXJlLmFscGhhTW9kZSA+IDA7XG4gICAgICAgICAgICB2YXIgYWxwaGEgPSBzcHJpdGUuYWxwaGE7XG4gICAgICAgICAgICAvLyB3ZSBkb250IGNhbGwgZXh0cmEgZnVuY3Rpb24gaWYgYWxwaGEgaXMgMS4wLCB0aGF0J3MgZmFzdGVyXG4gICAgICAgICAgICB2YXIgYXJnYiA9IGFscGhhIDwgMS4wICYmIHByZW11bHRpcGxpZWQgPyBwcmVtdWx0aXBseVRpbnQoc3ByaXRlLl90aW50UkdCLCBhbHBoYSlcbiAgICAgICAgICAgICAgICA6IHNwcml0ZS5fdGludFJHQiArIChhbHBoYSAqIDI1NSA8PCAyNCk7XG5cbiAgICAgICAgICAgIGFycmF5W29mZnNldF0gPSBhcmdiO1xuICAgICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgc3RyaWRlXSA9IGFyZ2I7XG4gICAgICAgICAgICBhcnJheVtvZmZzZXQgKyAoc3RyaWRlICogMildID0gYXJnYjtcbiAgICAgICAgICAgIGFycmF5W29mZnNldCArIChzdHJpZGUgKiAzKV0gPSBhcmdiO1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RyaWRlICogNDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgUGFydGljbGVSZW5kZXJlci5cbiAgICAgKi9cbiAgICBQYXJ0aWNsZVJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAoKVxuICAgIHtcbiAgICAgICAgT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5zaGFkZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGVtcE1hdHJpeCA9IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiBQYXJ0aWNsZVJlbmRlcmVyO1xufShPYmplY3RSZW5kZXJlcikpO1xuXG5leHBvcnQgeyBQYXJ0aWNsZUNvbnRhaW5lciwgUGFydGljbGVSZW5kZXJlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFydGljbGVzLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9ncmFwaGljcyAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9ncmFwaGljcyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFRleHR1cmUsIEJhc2VUZXh0dXJlLCBCYXRjaERyYXdDYWxsLCBCYXRjaFRleHR1cmVBcnJheSwgQmF0Y2hHZW9tZXRyeSwgVW5pZm9ybUdyb3VwLCBTaGFkZXIsIFN0YXRlIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5pbXBvcnQgeyBTSEFQRVMsIFBvaW50LCBQb2x5Z29uLCBQSV8yLCBNYXRyaXgsIFJlY3RhbmdsZSwgUm91bmRlZFJlY3RhbmdsZSwgQ2lyY2xlLCBFbGxpcHNlIH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyBlYXJjdXQsIGhleDJyZ2IsIHByZW11bHRpcGx5VGludCwgZGVwcmVjYXRpb24gfSBmcm9tICdAcGl4aS91dGlscyc7XG5pbXBvcnQgeyBXUkFQX01PREVTLCBEUkFXX01PREVTLCBCTEVORF9NT0RFUyB9IGZyb20gJ0BwaXhpL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCb3VuZHMsIENvbnRhaW5lciB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuXG4vKipcbiAqIEdyYXBoaWNzIGN1cnZlcyByZXNvbHV0aW9uIHNldHRpbmdzLiBJZiBgYWRhcHRpdmVgIGZsYWcgaXMgc2V0IHRvIGB0cnVlYCxcbiAqIHRoZSByZXNvbHV0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGN1cnZlJ3MgbGVuZ3RoIHRvIGVuc3VyZSBiZXR0ZXIgdmlzdWFsIHF1YWxpdHkuXG4gKiBBZGFwdGl2ZSBkcmF3IHdvcmtzIHdpdGggYGJlemllckN1cnZlVG9gIGFuZCBgcXVhZHJhdGljQ3VydmVUb2AuXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyb2YgUElYSVxuICogQG5hbWUgR1JBUEhJQ1NfQ1VSVkVTXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3BlcnR5IHtib29sZWFufSBhZGFwdGl2ZT1mYWxzZSAtIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgcmVzb2x1dGlvbiBzaG91bGQgYmUgYWRhcHRpdmVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhMZW5ndGg9MTAgLSBtYXhpbWFsIGxlbmd0aCBvZiBhIHNpbmdsZSBzZWdtZW50IG9mIHRoZSBjdXJ2ZSAoaWYgYWRhcHRpdmUgPSBmYWxzZSwgaWdub3JlZClcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW5TZWdtZW50cz04IC0gbWluaW1hbCBudW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhlIGN1cnZlIChpZiBhZGFwdGl2ZSA9IGZhbHNlLCBpZ25vcmVkKVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFNlZ21lbnRzPTIwNDggLSBtYXhpbWFsIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgY3VydmUgKGlmIGFkYXB0aXZlID0gZmFsc2UsIGlnbm9yZWQpXG4gKi9cbnZhciBHUkFQSElDU19DVVJWRVMgPSB7XG4gICAgYWRhcHRpdmU6IHRydWUsXG4gICAgbWF4TGVuZ3RoOiAxMCxcbiAgICBtaW5TZWdtZW50czogOCxcbiAgICBtYXhTZWdtZW50czogMjA0OCxcbiAgICBfc2VnbWVudHNDb3VudDogZnVuY3Rpb24gX3NlZ21lbnRzQ291bnQobGVuZ3RoLCBkZWZhdWx0U2VnbWVudHMpXG4gICAge1xuICAgICAgICBpZiAoIGRlZmF1bHRTZWdtZW50cyA9PT0gdm9pZCAwICkgZGVmYXVsdFNlZ21lbnRzID0gMjA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFkYXB0aXZlIHx8ICFsZW5ndGggfHwgaXNOYU4obGVuZ3RoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTZWdtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBNYXRoLmNlaWwobGVuZ3RoIC8gdGhpcy5tYXhMZW5ndGgpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgPCB0aGlzLm1pblNlZ21lbnRzKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1pblNlZ21lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCA+IHRoaXMubWF4U2VnbWVudHMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF4U2VnbWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG59O1xuXG4vKipcbiAqIEZpbGwgc3R5bGUgb2JqZWN0IGZvciBHcmFwaGljcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBGaWxsU3R5bGUgPSBmdW5jdGlvbiBGaWxsU3R5bGUoKVxue1xuICAgIHRoaXMucmVzZXQoKTtcbn07XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJuIHtQSVhJLkZpbGxTdHlsZX1cbiAqL1xuRmlsbFN0eWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpXG57XG4gICAgdmFyIG9iaiA9IG5ldyBGaWxsU3R5bGUoKTtcblxuICAgIG9iai5jb2xvciA9IHRoaXMuY29sb3I7XG4gICAgb2JqLmFscGhhID0gdGhpcy5hbHBoYTtcbiAgICBvYmoudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICBvYmoubWF0cml4ID0gdGhpcy5tYXRyaXg7XG4gICAgb2JqLnZpc2libGUgPSB0aGlzLnZpc2libGU7XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBSZXNldFxuICovXG5GaWxsU3R5bGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbntcbiAgICAvKipcbiAgICAgKiBUaGUgaGV4IGNvbG9yIHZhbHVlIHVzZWQgd2hlbiBjb2xvcmluZyB0aGUgR3JhcGhpY3Mgb2JqZWN0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICB0aGlzLmNvbG9yID0gMHhGRkZGRkY7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxwaGEgdmFsdWUgdXNlZCB3aGVuIGZpbGxpbmcgdGhlIEdyYXBoaWNzIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICovXG4gICAgdGhpcy5hbHBoYSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dHVyZSB0byBiZSB1c2VkIGZvciB0aGUgZmlsbC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgdGhpcy50ZXh0dXJlID0gVGV4dHVyZS5XSElURTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2Zvcm0gYXBscGllZCB0byB0aGUgdGV4dHVyZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgdGhpcy5tYXRyaXggPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGN1cnJlbnQgZmlsbCBpcyB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXN0cm95IGFuZCBkb24ndCB1c2UgYWZ0ZXIgdGhpc1xuICovXG5GaWxsU3R5bGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIHBvbHlnb24gdG8gZHJhd1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuV2ViR0xHcmFwaGljc0RhdGF9IGdyYXBoaWNzRGF0YSAtIFRoZSBncmFwaGljcyBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gd2ViR0xEYXRhIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBXZWJHTC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhpcyBzaGFwZVxuICogQHBhcmFtIHtvYmplY3R9IHdlYkdMRGF0YU5hdGl2ZUxpbmVzIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBXZWJHTC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgbmF0aXZlTGluZXNcbiAqL1xudmFyIGJ1aWxkUG9seSA9IHtcblxuICAgIGJ1aWxkOiBmdW5jdGlvbiBidWlsZChncmFwaGljc0RhdGEpXG4gICAge1xuICAgICAgICBncmFwaGljc0RhdGEucG9pbnRzID0gZ3JhcGhpY3NEYXRhLnNoYXBlLnBvaW50cy5zbGljZSgpO1xuICAgIH0sXG5cbiAgICB0cmlhbmd1bGF0ZTogZnVuY3Rpb24gdHJpYW5ndWxhdGUoZ3JhcGhpY3NEYXRhLCBncmFwaGljc0dlb21ldHJ5KVxuICAgIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IGdyYXBoaWNzRGF0YS5wb2ludHM7XG4gICAgICAgIHZhciBob2xlcyA9IGdyYXBoaWNzRGF0YS5ob2xlcztcbiAgICAgICAgdmFyIHZlcnRzID0gZ3JhcGhpY3NHZW9tZXRyeS5wb2ludHM7XG4gICAgICAgIHZhciBpbmRpY2VzID0gZ3JhcGhpY3NHZW9tZXRyeS5pbmRpY2VzO1xuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID49IDYpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBob2xlQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgaG9sZXMuLlxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBob2xlID0gaG9sZXNbaV07XG5cbiAgICAgICAgICAgICAgICBob2xlQXJyYXkucHVzaChwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgcG9pbnRzID0gcG9pbnRzLmNvbmNhdChob2xlLnBvaW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNvcnQgY29sb3JcbiAgICAgICAgICAgIHZhciB0cmlhbmdsZXMgPSBlYXJjdXQocG9pbnRzLCBob2xlQXJyYXksIDIpO1xuXG4gICAgICAgICAgICBpZiAoIXRyaWFuZ2xlcylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2ZXJ0UG9zID0gdmVydHMubGVuZ3RoIC8gMjtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSQxICs9IDMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKHRyaWFuZ2xlc1tpJDFdICsgdmVydFBvcyk7XG4gICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKHRyaWFuZ2xlc1tpJDEgKyAxXSArIHZlcnRQb3MpO1xuICAgICAgICAgICAgICAgIGluZGljZXMucHVzaCh0cmlhbmdsZXNbaSQxICsgMl0gKyB2ZXJ0UG9zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgcG9pbnRzLmxlbmd0aDsgaSQyKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmVydHMucHVzaChwb2ludHNbaSQyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufTtcblxuLyoqXG4gKiBCdWlsZHMgYSBjaXJjbGUgdG8gZHJhd1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuV2ViR0xHcmFwaGljc0RhdGF9IGdyYXBoaWNzRGF0YSAtIFRoZSBncmFwaGljcyBvYmplY3QgdG8gZHJhd1xuICogQHBhcmFtIHtvYmplY3R9IHdlYkdMRGF0YSAtIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgV2ViR0wtc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoaXMgc2hhcGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB3ZWJHTERhdGFOYXRpdmVMaW5lcyAtIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgV2ViR0wtc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gY3JlYXRlIG5hdGl2ZUxpbmVzXG4gKi9cbnZhciBidWlsZENpcmNsZSA9IHtcblxuICAgIGJ1aWxkOiBmdW5jdGlvbiBidWlsZChncmFwaGljc0RhdGEpXG4gICAge1xuICAgICAgICAvLyBuZWVkIHRvIGNvbnZlcnQgcG9pbnRzIHRvIGEgbmljZSByZWd1bGFyIGRhdGFcbiAgICAgICAgdmFyIGNpcmNsZURhdGEgPSBncmFwaGljc0RhdGEuc2hhcGU7XG4gICAgICAgIHZhciBwb2ludHMgPSBncmFwaGljc0RhdGEucG9pbnRzO1xuICAgICAgICB2YXIgeCA9IGNpcmNsZURhdGEueDtcbiAgICAgICAgdmFyIHkgPSBjaXJjbGVEYXRhLnk7XG4gICAgICAgIHZhciB3aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodDtcblxuICAgICAgICBwb2ludHMubGVuZ3RoID0gMDtcblxuICAgICAgICAvLyBUT0RPIC0gYml0IGhhY2t5Pz9cbiAgICAgICAgaWYgKGdyYXBoaWNzRGF0YS50eXBlID09PSBTSEFQRVMuQ0lSQylcbiAgICAgICAge1xuICAgICAgICAgICAgd2lkdGggPSBjaXJjbGVEYXRhLnJhZGl1cztcbiAgICAgICAgICAgIGhlaWdodCA9IGNpcmNsZURhdGEucmFkaXVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgd2lkdGggPSBjaXJjbGVEYXRhLndpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gY2lyY2xlRGF0YS5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdG90YWxTZWdzID0gTWF0aC5mbG9vcigzMCAqIE1hdGguc3FydChjaXJjbGVEYXRhLnJhZGl1cykpXG4gICAgICAgICAgICB8fCBNYXRoLmZsb29yKDE1ICogTWF0aC5zcXJ0KGNpcmNsZURhdGEud2lkdGggKyBjaXJjbGVEYXRhLmhlaWdodCkpO1xuXG4gICAgICAgIHRvdGFsU2VncyAvPSAyLjM7XG5cbiAgICAgICAgdmFyIHNlZyA9IChNYXRoLlBJICogMikgLyB0b3RhbFNlZ3M7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbFNlZ3MgLSAwLjU7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goXG4gICAgICAgICAgICAgICAgeCArIChNYXRoLnNpbigtc2VnICogaSkgKiB3aWR0aCksXG4gICAgICAgICAgICAgICAgeSArIChNYXRoLmNvcygtc2VnICogaSkgKiBoZWlnaHQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnRzLnB1c2gocG9pbnRzWzBdLCBwb2ludHNbMV0pO1xuICAgIH0sXG5cbiAgICB0cmlhbmd1bGF0ZTogZnVuY3Rpb24gdHJpYW5ndWxhdGUoZ3JhcGhpY3NEYXRhLCBncmFwaGljc0dlb21ldHJ5KVxuICAgIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IGdyYXBoaWNzRGF0YS5wb2ludHM7XG4gICAgICAgIHZhciB2ZXJ0cyA9IGdyYXBoaWNzR2VvbWV0cnkucG9pbnRzO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IGdyYXBoaWNzR2VvbWV0cnkuaW5kaWNlcztcblxuICAgICAgICB2YXIgdmVydFBvcyA9IHZlcnRzLmxlbmd0aCAvIDI7XG4gICAgICAgIHZhciBjZW50ZXIgPSB2ZXJ0UG9zO1xuXG4gICAgICAgIHZhciBjaXJjbGUgPSBncmFwaGljc0RhdGEuc2hhcGU7XG4gICAgICAgIHZhciBtYXRyaXggPSBncmFwaGljc0RhdGEubWF0cml4O1xuICAgICAgICB2YXIgeCA9IGNpcmNsZS54O1xuICAgICAgICB2YXIgeSA9IGNpcmNsZS55O1xuXG4gICAgICAgIC8vIFB1c2ggY2VudGVyIChzcGVjaWFsIHBvaW50KVxuICAgICAgICB2ZXJ0cy5wdXNoKFxuICAgICAgICAgICAgZ3JhcGhpY3NEYXRhLm1hdHJpeCA/IChtYXRyaXguYSAqIHgpICsgKG1hdHJpeC5jICogeSkgKyBtYXRyaXgudHggOiB4LFxuICAgICAgICAgICAgZ3JhcGhpY3NEYXRhLm1hdHJpeCA/IChtYXRyaXguYiAqIHgpICsgKG1hdHJpeC5kICogeSkgKyBtYXRyaXgudHkgOiB5KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgdmVydHMucHVzaChwb2ludHNbaV0sIHBvaW50c1tpICsgMV0pO1xuXG4gICAgICAgICAgICAvLyBhZGQgc29tZSB1dnNcbiAgICAgICAgICAgIGluZGljZXMucHVzaCh2ZXJ0UG9zKyssIGNlbnRlciwgdmVydFBvcyk7XG4gICAgICAgIH1cbiAgICB9LFxufTtcblxuLyoqXG4gKiBCdWlsZHMgYSByZWN0YW5nbGUgdG8gZHJhd1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuV2ViR0xHcmFwaGljc0RhdGF9IGdyYXBoaWNzRGF0YSAtIFRoZSBncmFwaGljcyBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gd2ViR0xEYXRhIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBXZWJHTC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhpcyBzaGFwZVxuICogQHBhcmFtIHtvYmplY3R9IHdlYkdMRGF0YU5hdGl2ZUxpbmVzIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBXZWJHTC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgbmF0aXZlTGluZXNcbiAqL1xudmFyIGJ1aWxkUmVjdGFuZ2xlID0ge1xuXG4gICAgYnVpbGQ6IGZ1bmN0aW9uIGJ1aWxkKGdyYXBoaWNzRGF0YSlcbiAgICB7XG4gICAgICAgIC8vIC0tLSAvL1xuICAgICAgICAvLyBuZWVkIHRvIGNvbnZlcnQgcG9pbnRzIHRvIGEgbmljZSByZWd1bGFyIGRhdGFcbiAgICAgICAgLy9cbiAgICAgICAgdmFyIHJlY3REYXRhID0gZ3JhcGhpY3NEYXRhLnNoYXBlO1xuICAgICAgICB2YXIgeCA9IHJlY3REYXRhLng7XG4gICAgICAgIHZhciB5ID0gcmVjdERhdGEueTtcbiAgICAgICAgdmFyIHdpZHRoID0gcmVjdERhdGEud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSByZWN0RGF0YS5oZWlnaHQ7XG5cbiAgICAgICAgdmFyIHBvaW50cyA9IGdyYXBoaWNzRGF0YS5wb2ludHM7XG5cbiAgICAgICAgcG9pbnRzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgcG9pbnRzLnB1c2goeCwgeSxcbiAgICAgICAgICAgIHggKyB3aWR0aCwgeSxcbiAgICAgICAgICAgIHggKyB3aWR0aCwgeSArIGhlaWdodCxcbiAgICAgICAgICAgIHgsIHkgKyBoZWlnaHQpO1xuICAgIH0sXG5cbiAgICB0cmlhbmd1bGF0ZTogZnVuY3Rpb24gdHJpYW5ndWxhdGUoZ3JhcGhpY3NEYXRhLCBncmFwaGljc0dlb21ldHJ5KVxuICAgIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IGdyYXBoaWNzRGF0YS5wb2ludHM7XG4gICAgICAgIHZhciB2ZXJ0cyA9IGdyYXBoaWNzR2VvbWV0cnkucG9pbnRzO1xuXG4gICAgICAgIHZhciB2ZXJ0UG9zID0gdmVydHMubGVuZ3RoIC8gMjtcblxuICAgICAgICB2ZXJ0cy5wdXNoKHBvaW50c1swXSwgcG9pbnRzWzFdLFxuICAgICAgICAgICAgcG9pbnRzWzJdLCBwb2ludHNbM10sXG4gICAgICAgICAgICBwb2ludHNbNl0sIHBvaW50c1s3XSxcbiAgICAgICAgICAgIHBvaW50c1s0XSwgcG9pbnRzWzVdKTtcblxuICAgICAgICBncmFwaGljc0dlb21ldHJ5LmluZGljZXMucHVzaCh2ZXJ0UG9zLCB2ZXJ0UG9zICsgMSwgdmVydFBvcyArIDIsXG4gICAgICAgICAgICB2ZXJ0UG9zICsgMSwgdmVydFBvcyArIDIsIHZlcnRQb3MgKyAzKTtcbiAgICB9LFxufTtcblxuLyoqXG4gKiBCdWlsZHMgYSByb3VuZGVkIHJlY3RhbmdsZSB0byBkcmF3XG4gKlxuICogSWdub3JlZCBmcm9tIGRvY3Mgc2luY2UgaXQgaXMgbm90IGRpcmVjdGx5IGV4cG9zZWQuXG4gKlxuICogQGlnbm9yZVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5XZWJHTEdyYXBoaWNzRGF0YX0gZ3JhcGhpY3NEYXRhIC0gVGhlIGdyYXBoaWNzIG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSB3ZWJHTERhdGEgLSBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIFdlYkdMLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGlzIHNoYXBlXG4gKiBAcGFyYW0ge29iamVjdH0gd2ViR0xEYXRhTmF0aXZlTGluZXMgLSBhbiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIFdlYkdMLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBuYXRpdmVMaW5lc1xuICovXG52YXIgYnVpbGRSb3VuZGVkUmVjdGFuZ2xlID0ge1xuXG4gICAgYnVpbGQ6IGZ1bmN0aW9uIGJ1aWxkKGdyYXBoaWNzRGF0YSlcbiAgICB7XG4gICAgICAgIHZhciBycmVjdERhdGEgPSBncmFwaGljc0RhdGEuc2hhcGU7XG4gICAgICAgIHZhciBwb2ludHMgPSBncmFwaGljc0RhdGEucG9pbnRzO1xuICAgICAgICB2YXIgeCA9IHJyZWN0RGF0YS54O1xuICAgICAgICB2YXIgeSA9IHJyZWN0RGF0YS55O1xuICAgICAgICB2YXIgd2lkdGggPSBycmVjdERhdGEud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBycmVjdERhdGEuaGVpZ2h0O1xuXG4gICAgICAgIC8vIERvbid0IGFsbG93IG5lZ2F0aXZlIHJhZGl1cyBvciBncmVhdGVyIHRoYW4gaGFsZiB0aGUgc21hbGxlc3Qgd2lkdGhcbiAgICAgICAgdmFyIHJhZGl1cyA9IE1hdGgubWF4KDAsIE1hdGgubWluKHJyZWN0RGF0YS5yYWRpdXMsIE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMikpO1xuXG4gICAgICAgIHBvaW50cy5sZW5ndGggPSAwO1xuXG4gICAgICAgIC8vIE5vIHJhZGl1cywgZG8gYSBzaW1wbGUgcmVjdGFuZ2xlXG4gICAgICAgIGlmICghcmFkaXVzKVxuICAgICAgICB7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh4LCB5LFxuICAgICAgICAgICAgICAgIHggKyB3aWR0aCwgeSxcbiAgICAgICAgICAgICAgICB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsXG4gICAgICAgICAgICAgICAgeCwgeSArIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBxdWFkcmF0aWNCZXppZXJDdXJ2ZSh4LCB5ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICAgICAgeCArIHJhZGl1cywgeSxcbiAgICAgICAgICAgICAgICBwb2ludHMpO1xuICAgICAgICAgICAgcXVhZHJhdGljQmV6aWVyQ3VydmUoeCArIHdpZHRoIC0gcmFkaXVzLFxuICAgICAgICAgICAgICAgIHksIHggKyB3aWR0aCwgeSxcbiAgICAgICAgICAgICAgICB4ICsgd2lkdGgsIHkgKyByYWRpdXMsXG4gICAgICAgICAgICAgICAgcG9pbnRzKTtcbiAgICAgICAgICAgIHF1YWRyYXRpY0JlemllckN1cnZlKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsXG4gICAgICAgICAgICAgICAgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHBvaW50cyk7XG4gICAgICAgICAgICBxdWFkcmF0aWNCZXppZXJDdXJ2ZSh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHgsIHkgKyBoZWlnaHQsXG4gICAgICAgICAgICAgICAgeCwgeSArIGhlaWdodCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICBwb2ludHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcyB0aW55IG51bWJlciBkZWFscyB3aXRoIHRoZSBpc3N1ZSB0aGF0IG9jY3VycyB3aGVuIHBvaW50cyBvdmVybGFwIGFuZCBlYXJjdXQgZmFpbHMgdG8gdHJpYW5ndWxhdGUgdGhlIGl0ZW0uXG4gICAgICAgIC8vIFRPRE8gLSBmaXggdGhpcyBwcm9wZXJseSwgdGhpcyBpcyBub3QgdmVyeSBlbGVnYW50Li4gYnV0IGl0IHdvcmtzIGZvciBub3cuXG4gICAgfSxcblxuICAgIHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiB0cmlhbmd1bGF0ZShncmFwaGljc0RhdGEsIGdyYXBoaWNzR2VvbWV0cnkpXG4gICAge1xuICAgICAgICB2YXIgcG9pbnRzID0gZ3JhcGhpY3NEYXRhLnBvaW50cztcblxuICAgICAgICB2YXIgdmVydHMgPSBncmFwaGljc0dlb21ldHJ5LnBvaW50cztcbiAgICAgICAgdmFyIGluZGljZXMgPSBncmFwaGljc0dlb21ldHJ5LmluZGljZXM7XG5cbiAgICAgICAgdmFyIHZlY1BvcyA9IHZlcnRzLmxlbmd0aCAvIDI7XG5cbiAgICAgICAgdmFyIHRyaWFuZ2xlcyA9IGVhcmN1dChwb2ludHMsIG51bGwsIDIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdHJpYW5nbGVzLmxlbmd0aDsgaSA8IGo7IGkgKz0gMylcbiAgICAgICAge1xuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKHRyaWFuZ2xlc1tpXSArIHZlY1Bvcyk7XG4gICAgICAgICAgICAvLyAgICAgaW5kaWNlcy5wdXNoKHRyaWFuZ2xlc1tpXSArIHZlY1Bvcyk7XG4gICAgICAgICAgICBpbmRpY2VzLnB1c2godHJpYW5nbGVzW2kgKyAxXSArIHZlY1Bvcyk7XG4gICAgICAgICAgICAvLyAgIGluZGljZXMucHVzaCh0cmlhbmdsZXNbaSArIDJdICsgdmVjUG9zKTtcbiAgICAgICAgICAgIGluZGljZXMucHVzaCh0cmlhbmdsZXNbaSArIDJdICsgdmVjUG9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkkMSA9IDAsIGokMSA9IHBvaW50cy5sZW5ndGg7IGkkMSA8IGokMTsgaSQxKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZlcnRzLnB1c2gocG9pbnRzW2kkMV0sIHBvaW50c1srK2kkMV0pO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGEgc2luZ2xlIHBvaW50IGZvciBhIHF1YWRyYXRpYyBiZXppZXIgY3VydmUuXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgcXVhZHJhdGljQmV6aWVyQ3VydmUuXG4gKiBJZ25vcmVkIGZyb20gZG9jcyBzaW5jZSBpdCBpcyBub3QgZGlyZWN0bHkgZXhwb3NlZC5cbiAqXG4gKiBAaWdub3JlXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4xIC0gZmlyc3QgbnVtYmVyXG4gKiBAcGFyYW0ge251bWJlcn0gbjIgLSBzZWNvbmQgbnVtYmVyXG4gKiBAcGFyYW0ge251bWJlcn0gcGVyYyAtIHBlcmNlbnRhZ2VcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIHJlc3VsdFxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0UHQobjEsIG4yLCBwZXJjKVxue1xuICAgIHZhciBkaWZmID0gbjIgLSBuMTtcblxuICAgIHJldHVybiBuMSArIChkaWZmICogcGVyYyk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBwb2ludHMgZm9yIGEgcXVhZHJhdGljIGJlemllciBjdXJ2ZS4gKGhlbHBlciBmdW5jdGlvbi4uKVxuICogQmFzZWQgb246IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NTA5Ny9ob3ctZG8taS1pbXBsZW1lbnQtYS1iZXppZXItY3VydmUtaW4tY1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbVggLSBPcmlnaW4gcG9pbnQgeFxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21ZIC0gT3JpZ2luIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcFggLSBDb250cm9sIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcFkgLSBDb250cm9sIHBvaW50IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b1ggLSBEZXN0aW5hdGlvbiBwb2ludCB4XG4gKiBAcGFyYW0ge251bWJlcn0gdG9ZIC0gRGVzdGluYXRpb24gcG9pbnQgeVxuICogQHBhcmFtIHtudW1iZXJbXX0gW291dD1bXV0gLSBUaGUgb3V0cHV0IGFycmF5IHRvIGFkZCBwb2ludHMgaW50by4gSWYgbm90IHBhc3NlZCwgYSBuZXcgYXJyYXkgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm4ge251bWJlcltdfSBhbiBhcnJheSBvZiBwb2ludHNcbiAqL1xuZnVuY3Rpb24gcXVhZHJhdGljQmV6aWVyQ3VydmUoZnJvbVgsIGZyb21ZLCBjcFgsIGNwWSwgdG9YLCB0b1ksIG91dClcbntcbiAgICBpZiAoIG91dCA9PT0gdm9pZCAwICkgb3V0ID0gW107XG5cbiAgICB2YXIgbiA9IDIwO1xuICAgIHZhciBwb2ludHMgPSBvdXQ7XG5cbiAgICB2YXIgeGEgPSAwO1xuICAgIHZhciB5YSA9IDA7XG4gICAgdmFyIHhiID0gMDtcbiAgICB2YXIgeWIgPSAwO1xuICAgIHZhciB4ID0gMDtcbiAgICB2YXIgeSA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPD0gbjsgKytpKVxuICAgIHtcbiAgICAgICAgaiA9IGkgLyBuO1xuXG4gICAgICAgIC8vIFRoZSBHcmVlbiBMaW5lXG4gICAgICAgIHhhID0gZ2V0UHQoZnJvbVgsIGNwWCwgaik7XG4gICAgICAgIHlhID0gZ2V0UHQoZnJvbVksIGNwWSwgaik7XG4gICAgICAgIHhiID0gZ2V0UHQoY3BYLCB0b1gsIGopO1xuICAgICAgICB5YiA9IGdldFB0KGNwWSwgdG9ZLCBqKTtcblxuICAgICAgICAvLyBUaGUgQmxhY2sgRG90XG4gICAgICAgIHggPSBnZXRQdCh4YSwgeGIsIGopO1xuICAgICAgICB5ID0gZ2V0UHQoeWEsIHliLCBqKTtcblxuICAgICAgICBwb2ludHMucHVzaCh4LCB5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxpbmUgdG8gZHJhd1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuR3JhcGhpY3NEYXRhfSBncmFwaGljc0RhdGEgLSBUaGUgZ3JhcGhpY3Mgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllc1xuICogQHBhcmFtIHtQSVhJLkdyYXBoaWNzR2VvbWV0cnl9IGdyYXBoaWNzR2VvbWV0cnkgLSBHZW9tZXRyeSB3aGVyZSB0byBhcHBlbmQgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGluZShncmFwaGljc0RhdGEsIGdyYXBoaWNzR2VvbWV0cnkpXG57XG4gICAgaWYgKGdyYXBoaWNzRGF0YS5saW5lU3R5bGUubmF0aXZlKVxuICAgIHtcbiAgICAgICAgYnVpbGROYXRpdmVMaW5lKGdyYXBoaWNzRGF0YSwgZ3JhcGhpY3NHZW9tZXRyeSk7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGJ1aWxkTm9uTmF0aXZlTGluZShncmFwaGljc0RhdGEsIGdyYXBoaWNzR2VvbWV0cnkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsaW5lIHRvIGRyYXcgdXNpbmcgdGhlIHBvbHlnb24gbWV0aG9kLlxuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuR3JhcGhpY3NEYXRhfSBncmFwaGljc0RhdGEgLSBUaGUgZ3JhcGhpY3Mgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllc1xuICogQHBhcmFtIHtQSVhJLkdyYXBoaWNzR2VvbWV0cnl9IGdyYXBoaWNzR2VvbWV0cnkgLSBHZW9tZXRyeSB3aGVyZSB0byBhcHBlbmQgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTm9uTmF0aXZlTGluZShncmFwaGljc0RhdGEsIGdyYXBoaWNzR2VvbWV0cnkpXG57XG4gICAgdmFyIHNoYXBlID0gZ3JhcGhpY3NEYXRhLnNoYXBlO1xuICAgIHZhciBwb2ludHMgPSBncmFwaGljc0RhdGEucG9pbnRzIHx8IHNoYXBlLnBvaW50cy5zbGljZSgpO1xuICAgIHZhciBlcHMgPSBncmFwaGljc0dlb21ldHJ5LmNsb3NlUG9pbnRFcHM7XG5cbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMClcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaWYgdGhlIGxpbmUgd2lkdGggaXMgYW4gb2RkIG51bWJlciBhZGQgMC41IHRvIGFsaWduIHRvIGEgd2hvbGUgcGl4ZWxcbiAgICAvLyBjb21tZW50aW5nIHRoaXMgb3V0IGZpeGVzICM3MTEgYW5kICMxNjIwXG4gICAgLy8gaWYgKGdyYXBoaWNzRGF0YS5saW5lV2lkdGglMilcbiAgICAvLyB7XG4gICAgLy8gICAgIGZvciAoaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAgIHBvaW50c1tpXSArPSAwLjU7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICB2YXIgc3R5bGUgPSBncmFwaGljc0RhdGEubGluZVN0eWxlO1xuXG4gICAgLy8gZ2V0IGZpcnN0IGFuZCBsYXN0IHBvaW50Li4gZmlndXJlIG91dCB0aGUgbWlkZGxlIVxuICAgIHZhciBmaXJzdFBvaW50ID0gbmV3IFBvaW50KHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICB2YXIgbGFzdFBvaW50ID0gbmV3IFBvaW50KHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0pO1xuICAgIHZhciBjbG9zZWRTaGFwZSA9IHNoYXBlLnR5cGUgIT09IFNIQVBFUy5QT0xZIHx8IHNoYXBlLmNsb3NlU3Ryb2tlO1xuICAgIHZhciBjbG9zZWRQYXRoID0gTWF0aC5hYnMoZmlyc3RQb2ludC54IC0gbGFzdFBvaW50LngpIDwgZXBzXG4gICAgICAgICYmIE1hdGguYWJzKGZpcnN0UG9pbnQueSAtIGxhc3RQb2ludC55KSA8IGVwcztcblxuICAgIC8vIGlmIHRoZSBmaXJzdCBwb2ludCBpcyB0aGUgbGFzdCBwb2ludCAtIGdvbm5hIGhhdmUgaXNzdWVzIDopXG4gICAgaWYgKGNsb3NlZFNoYXBlKVxuICAgIHtcbiAgICAgICAgLy8gbmVlZCB0byBjbG9uZSBhcyB3ZSBhcmUgZ29pbmcgdG8gc2xpZ2h0bHkgbW9kaWZ5IHRoZSBzaGFwZS4uXG4gICAgICAgIHBvaW50cyA9IHBvaW50cy5zbGljZSgpO1xuXG4gICAgICAgIGlmIChjbG9zZWRQYXRoKVxuICAgICAgICB7XG4gICAgICAgICAgICBwb2ludHMucG9wKCk7XG4gICAgICAgICAgICBwb2ludHMucG9wKCk7XG4gICAgICAgICAgICBsYXN0UG9pbnQuc2V0KHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pZFBvaW50WCA9IGxhc3RQb2ludC54ICsgKChmaXJzdFBvaW50LnggLSBsYXN0UG9pbnQueCkgKiAwLjUpO1xuICAgICAgICB2YXIgbWlkUG9pbnRZID0gbGFzdFBvaW50LnkgKyAoKGZpcnN0UG9pbnQueSAtIGxhc3RQb2ludC55KSAqIDAuNSk7XG5cbiAgICAgICAgcG9pbnRzLnVuc2hpZnQobWlkUG9pbnRYLCBtaWRQb2ludFkpO1xuICAgICAgICBwb2ludHMucHVzaChtaWRQb2ludFgsIG1pZFBvaW50WSk7XG4gICAgfVxuXG4gICAgdmFyIHZlcnRzID0gZ3JhcGhpY3NHZW9tZXRyeS5wb2ludHM7XG4gICAgdmFyIGxlbmd0aCA9IHBvaW50cy5sZW5ndGggLyAyO1xuICAgIHZhciBpbmRleENvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICB2YXIgaW5kZXhTdGFydCA9IHZlcnRzLmxlbmd0aCAvIDI7XG5cbiAgICAvLyBEUkFXIHRoZSBMaW5lXG4gICAgdmFyIHdpZHRoID0gc3R5bGUud2lkdGggLyAyO1xuXG4gICAgLy8gc29ydCBjb2xvclxuICAgIHZhciBwMXggPSBwb2ludHNbMF07XG4gICAgdmFyIHAxeSA9IHBvaW50c1sxXTtcbiAgICB2YXIgcDJ4ID0gcG9pbnRzWzJdO1xuICAgIHZhciBwMnkgPSBwb2ludHNbM107XG4gICAgdmFyIHAzeCA9IDA7XG4gICAgdmFyIHAzeSA9IDA7XG5cbiAgICB2YXIgcGVycHggPSAtKHAxeSAtIHAyeSk7XG4gICAgdmFyIHBlcnB5ID0gcDF4IC0gcDJ4O1xuICAgIHZhciBwZXJwMnggPSAwO1xuICAgIHZhciBwZXJwMnkgPSAwO1xuICAgIHZhciBwZXJwM3ggPSAwO1xuICAgIHZhciBwZXJwM3kgPSAwO1xuXG4gICAgdmFyIGRpc3QgPSBNYXRoLnNxcnQoKHBlcnB4ICogcGVycHgpICsgKHBlcnB5ICogcGVycHkpKTtcblxuICAgIHBlcnB4IC89IGRpc3Q7XG4gICAgcGVycHkgLz0gZGlzdDtcbiAgICBwZXJweCAqPSB3aWR0aDtcbiAgICBwZXJweSAqPSB3aWR0aDtcblxuICAgIHZhciByYXRpbyA9IHN0eWxlLmFsaWdubWVudDsvLyAwLjU7XG4gICAgdmFyIHIxID0gKDEgLSByYXRpbykgKiAyO1xuICAgIHZhciByMiA9IHJhdGlvICogMjtcblxuICAgIC8vIHN0YXJ0XG4gICAgdmVydHMucHVzaChcbiAgICAgICAgcDF4IC0gKHBlcnB4ICogcjEpLFxuICAgICAgICBwMXkgLSAocGVycHkgKiByMSkpO1xuXG4gICAgdmVydHMucHVzaChcbiAgICAgICAgcDF4ICsgKHBlcnB4ICogcjIpLFxuICAgICAgICBwMXkgKyAocGVycHkgKiByMikpO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW5ndGggLSAxOyArK2kpXG4gICAge1xuICAgICAgICBwMXggPSBwb2ludHNbKGkgLSAxKSAqIDJdO1xuICAgICAgICBwMXkgPSBwb2ludHNbKChpIC0gMSkgKiAyKSArIDFdO1xuXG4gICAgICAgIHAyeCA9IHBvaW50c1tpICogMl07XG4gICAgICAgIHAyeSA9IHBvaW50c1soaSAqIDIpICsgMV07XG5cbiAgICAgICAgcDN4ID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgICAgcDN5ID0gcG9pbnRzWygoaSArIDEpICogMikgKyAxXTtcblxuICAgICAgICBwZXJweCA9IC0ocDF5IC0gcDJ5KTtcbiAgICAgICAgcGVycHkgPSBwMXggLSBwMng7XG5cbiAgICAgICAgZGlzdCA9IE1hdGguc3FydCgocGVycHggKiBwZXJweCkgKyAocGVycHkgKiBwZXJweSkpO1xuICAgICAgICBwZXJweCAvPSBkaXN0O1xuICAgICAgICBwZXJweSAvPSBkaXN0O1xuICAgICAgICBwZXJweCAqPSB3aWR0aDtcbiAgICAgICAgcGVycHkgKj0gd2lkdGg7XG5cbiAgICAgICAgcGVycDJ4ID0gLShwMnkgLSBwM3kpO1xuICAgICAgICBwZXJwMnkgPSBwMnggLSBwM3g7XG5cbiAgICAgICAgZGlzdCA9IE1hdGguc3FydCgocGVycDJ4ICogcGVycDJ4KSArIChwZXJwMnkgKiBwZXJwMnkpKTtcbiAgICAgICAgcGVycDJ4IC89IGRpc3Q7XG4gICAgICAgIHBlcnAyeSAvPSBkaXN0O1xuICAgICAgICBwZXJwMnggKj0gd2lkdGg7XG4gICAgICAgIHBlcnAyeSAqPSB3aWR0aDtcblxuICAgICAgICB2YXIgYTEgPSAoLXBlcnB5ICsgcDF5KSAtICgtcGVycHkgKyBwMnkpO1xuICAgICAgICB2YXIgYjEgPSAoLXBlcnB4ICsgcDJ4KSAtICgtcGVycHggKyBwMXgpO1xuICAgICAgICB2YXIgYzEgPSAoKC1wZXJweCArIHAxeCkgKiAoLXBlcnB5ICsgcDJ5KSkgLSAoKC1wZXJweCArIHAyeCkgKiAoLXBlcnB5ICsgcDF5KSk7XG4gICAgICAgIHZhciBhMiA9ICgtcGVycDJ5ICsgcDN5KSAtICgtcGVycDJ5ICsgcDJ5KTtcbiAgICAgICAgdmFyIGIyID0gKC1wZXJwMnggKyBwMngpIC0gKC1wZXJwMnggKyBwM3gpO1xuICAgICAgICB2YXIgYzIgPSAoKC1wZXJwMnggKyBwM3gpICogKC1wZXJwMnkgKyBwMnkpKSAtICgoLXBlcnAyeCArIHAyeCkgKiAoLXBlcnAyeSArIHAzeSkpO1xuXG4gICAgICAgIHZhciBkZW5vbSA9IChhMSAqIGIyKSAtIChhMiAqIGIxKTtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoZGVub20pIDwgMC4xKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZW5vbSArPSAxMC4xO1xuICAgICAgICAgICAgdmVydHMucHVzaChcbiAgICAgICAgICAgICAgICBwMnggLSAocGVycHggKiByMSksXG4gICAgICAgICAgICAgICAgcDJ5IC0gKHBlcnB5ICogcjEpKTtcblxuICAgICAgICAgICAgdmVydHMucHVzaChcbiAgICAgICAgICAgICAgICBwMnggKyAocGVycHggKiByMiksXG4gICAgICAgICAgICAgICAgcDJ5ICsgKHBlcnB5ICogcjIpKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHggPSAoKGIxICogYzIpIC0gKGIyICogYzEpKSAvIGRlbm9tO1xuICAgICAgICB2YXIgcHkgPSAoKGEyICogYzEpIC0gKGExICogYzIpKSAvIGRlbm9tO1xuICAgICAgICB2YXIgcGRpc3QgPSAoKHB4IC0gcDJ4KSAqIChweCAtIHAyeCkpICsgKChweSAtIHAyeSkgKiAocHkgLSBwMnkpKTtcblxuICAgICAgICBpZiAocGRpc3QgPiAoMTk2ICogd2lkdGggKiB3aWR0aCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBlcnAzeCA9IHBlcnB4IC0gcGVycDJ4O1xuICAgICAgICAgICAgcGVycDN5ID0gcGVycHkgLSBwZXJwMnk7XG5cbiAgICAgICAgICAgIGRpc3QgPSBNYXRoLnNxcnQoKHBlcnAzeCAqIHBlcnAzeCkgKyAocGVycDN5ICogcGVycDN5KSk7XG4gICAgICAgICAgICBwZXJwM3ggLz0gZGlzdDtcbiAgICAgICAgICAgIHBlcnAzeSAvPSBkaXN0O1xuICAgICAgICAgICAgcGVycDN4ICo9IHdpZHRoO1xuICAgICAgICAgICAgcGVycDN5ICo9IHdpZHRoO1xuXG4gICAgICAgICAgICB2ZXJ0cy5wdXNoKHAyeCAtIChwZXJwM3ggKiByMSksIHAyeSAtIChwZXJwM3kgKiByMSkpO1xuXG4gICAgICAgICAgICB2ZXJ0cy5wdXNoKHAyeCArIChwZXJwM3ggKiByMiksIHAyeSArIChwZXJwM3kgKiByMikpO1xuXG4gICAgICAgICAgICB2ZXJ0cy5wdXNoKHAyeCAtIChwZXJwM3ggKiByMiAqIHIxKSwgcDJ5IC0gKHBlcnAzeSAqIHIxKSk7XG5cbiAgICAgICAgICAgIGluZGV4Q291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZlcnRzLnB1c2gocDJ4ICsgKChweCAtIHAyeCkgKiByMSksIHAyeSArICgocHkgLSBwMnkpICogcjEpKTtcblxuICAgICAgICAgICAgdmVydHMucHVzaChwMnggLSAoKHB4IC0gcDJ4KSAqIHIyKSwgcDJ5IC0gKChweSAtIHAyeSkgKiByMikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcDF4ID0gcG9pbnRzWyhsZW5ndGggLSAyKSAqIDJdO1xuICAgIHAxeSA9IHBvaW50c1soKGxlbmd0aCAtIDIpICogMikgKyAxXTtcblxuICAgIHAyeCA9IHBvaW50c1sobGVuZ3RoIC0gMSkgKiAyXTtcbiAgICBwMnkgPSBwb2ludHNbKChsZW5ndGggLSAxKSAqIDIpICsgMV07XG5cbiAgICBwZXJweCA9IC0ocDF5IC0gcDJ5KTtcbiAgICBwZXJweSA9IHAxeCAtIHAyeDtcblxuICAgIGRpc3QgPSBNYXRoLnNxcnQoKHBlcnB4ICogcGVycHgpICsgKHBlcnB5ICogcGVycHkpKTtcbiAgICBwZXJweCAvPSBkaXN0O1xuICAgIHBlcnB5IC89IGRpc3Q7XG4gICAgcGVycHggKj0gd2lkdGg7XG4gICAgcGVycHkgKj0gd2lkdGg7XG5cbiAgICB2ZXJ0cy5wdXNoKHAyeCAtIChwZXJweCAqIHIxKSwgcDJ5IC0gKHBlcnB5ICogcjEpKTtcblxuICAgIHZlcnRzLnB1c2gocDJ4ICsgKHBlcnB4ICogcjIpLCBwMnkgKyAocGVycHkgKiByMikpO1xuXG4gICAgdmFyIGluZGljZXMgPSBncmFwaGljc0dlb21ldHJ5LmluZGljZXM7XG5cbiAgICAvLyBpbmRpY2VzLnB1c2goaW5kZXhTdGFydCk7XG5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBpbmRleENvdW50IC0gMjsgKytpJDEpXG4gICAge1xuICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXhTdGFydCwgaW5kZXhTdGFydCArIDEsIGluZGV4U3RhcnQgKyAyKTtcblxuICAgICAgICBpbmRleFN0YXJ0Kys7XG4gICAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxpbmUgdG8gZHJhdyB1c2luZyB0aGUgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUykgbWV0aG9kXG4gKlxuICogSWdub3JlZCBmcm9tIGRvY3Mgc2luY2UgaXQgaXMgbm90IGRpcmVjdGx5IGV4cG9zZWQuXG4gKlxuICogQGlnbm9yZVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5HcmFwaGljc0RhdGF9IGdyYXBoaWNzRGF0YSAtIFRoZSBncmFwaGljcyBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge1BJWEkuR3JhcGhpY3NHZW9tZXRyeX0gZ3JhcGhpY3NHZW9tZXRyeSAtIEdlb21ldHJ5IHdoZXJlIHRvIGFwcGVuZCBvdXRwdXRcbiAqL1xuZnVuY3Rpb24gYnVpbGROYXRpdmVMaW5lKGdyYXBoaWNzRGF0YSwgZ3JhcGhpY3NHZW9tZXRyeSlcbntcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB2YXIgc2hhcGUgPSBncmFwaGljc0RhdGEuc2hhcGU7XG4gICAgdmFyIHBvaW50cyA9IGdyYXBoaWNzRGF0YS5wb2ludHMgfHwgc2hhcGUucG9pbnRzO1xuICAgIHZhciBjbG9zZWRTaGFwZSA9IHNoYXBlLnR5cGUgIT09IFNIQVBFUy5QT0xZIHx8IHNoYXBlLmNsb3NlU3Ryb2tlO1xuXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgdmVydHMgPSBncmFwaGljc0dlb21ldHJ5LnBvaW50cztcbiAgICB2YXIgaW5kaWNlcyA9IGdyYXBoaWNzR2VvbWV0cnkuaW5kaWNlcztcbiAgICB2YXIgbGVuZ3RoID0gcG9pbnRzLmxlbmd0aCAvIDI7XG5cbiAgICB2YXIgc3RhcnRJbmRleCA9IHZlcnRzLmxlbmd0aCAvIDI7XG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7XG5cbiAgICB2ZXJ0cy5wdXNoKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcblxuICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICAgIHZlcnRzLnB1c2gocG9pbnRzW2kgKiAyXSwgcG9pbnRzWyhpICogMikgKyAxXSk7XG4gICAgICAgIGluZGljZXMucHVzaChjdXJyZW50SW5kZXgsIGN1cnJlbnRJbmRleCArIDEpO1xuXG4gICAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgIH1cblxuICAgIGlmIChjbG9zZWRTaGFwZSlcbiAgICB7XG4gICAgICAgIGluZGljZXMucHVzaChjdXJyZW50SW5kZXgsIHN0YXJ0SW5kZXgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21wbGV4IHBvbHlnb24gdG8gZHJhd1xuICpcbiAqIElnbm9yZWQgZnJvbSBkb2NzIHNpbmNlIGl0IGlzIG5vdCBkaXJlY3RseSBleHBvc2VkLlxuICpcbiAqIEBpZ25vcmVcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuR3JhcGhpY3N9IGdyYXBoaWNzRGF0YSAtIFRoZSBncmFwaGljcyBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge29iamVjdH0gd2ViR0xEYXRhIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBXZWJHTC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhpcyBzaGFwZVxuICovXG5mdW5jdGlvbiBidWlsZENvbXBsZXhQb2x5KGdyYXBoaWNzRGF0YSwgd2ViR0xEYXRhKVxue1xuICAgIC8vIFRPRE8gLSBubyBuZWVkIHRvIGNvcHkgdGhpcyBhcyBpdCBnZXRzIHR1cm5lZCBpbnRvIGEgRmxvYXQzMkFycmF5IGFueXdheXMuLlxuICAgIHZhciBwb2ludHMgPSBncmFwaGljc0RhdGEucG9pbnRzLnNsaWNlKCk7XG5cbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDYpXG4gICAge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZ2V0IGZpcnN0IGFuZCBsYXN0IHBvaW50Li4gZmlndXJlIG91dCB0aGUgbWlkZGxlIVxuICAgIHZhciBpbmRpY2VzID0gd2ViR0xEYXRhLmluZGljZXM7XG5cbiAgICB3ZWJHTERhdGEucG9pbnRzID0gcG9pbnRzO1xuICAgIHdlYkdMRGF0YS5hbHBoYSA9IGdyYXBoaWNzRGF0YS5maWxsQWxwaGE7XG4gICAgd2ViR0xEYXRhLmNvbG9yID0gaGV4MnJnYihncmFwaGljc0RhdGEuZmlsbENvbG9yKTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgYm91bmRzLi5cbiAgICB2YXIgbWluWCA9IEluZmluaXR5O1xuICAgIHZhciBtYXhYID0gLUluZmluaXR5O1xuXG4gICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4WSA9IC1JbmZpbml0eTtcblxuICAgIHZhciB4ID0gMDtcbiAgICB2YXIgeSA9IDA7XG5cbiAgICAvLyBnZXQgc2l6ZS4uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDIpXG4gICAge1xuICAgICAgICB4ID0gcG9pbnRzW2ldO1xuICAgICAgICB5ID0gcG9pbnRzW2kgKyAxXTtcblxuICAgICAgICBtaW5YID0geCA8IG1pblggPyB4IDogbWluWDtcbiAgICAgICAgbWF4WCA9IHggPiBtYXhYID8geCA6IG1heFg7XG5cbiAgICAgICAgbWluWSA9IHkgPCBtaW5ZID8geSA6IG1pblk7XG4gICAgICAgIG1heFkgPSB5ID4gbWF4WSA/IHkgOiBtYXhZO1xuICAgIH1cblxuICAgIC8vIGFkZCBhIHF1YWQgdG8gdGhlIGVuZCBjb3MgdGhlcmUgaXMgbm8gcG9pbnQgbWFraW5nIGFub3RoZXIgYnVmZmVyIVxuICAgIHBvaW50cy5wdXNoKG1pblgsIG1pblksXG4gICAgICAgIG1heFgsIG1pblksXG4gICAgICAgIG1heFgsIG1heFksXG4gICAgICAgIG1pblgsIG1heFkpO1xuXG4gICAgLy8gcHVzaCBhIHF1YWQgb250byB0aGUgZW5kLi5cblxuICAgIC8vIFRPRE8gLSB0aGlzIGFpbid0IG5lZWRlZCFcbiAgICB2YXIgbGVuZ3RoID0gcG9pbnRzLmxlbmd0aCAvIDI7XG5cbiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBsZW5ndGg7IGkkMSsrKVxuICAgIHtcbiAgICAgICAgaW5kaWNlcy5wdXNoKGkkMSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSBhbmQgdGhlbiBkcmF3cyBpdC5cbiAqXG4gKiBJZ25vcmVkIGZyb20gZG9jcyBzaW5jZSBpdCBpcyBub3QgZGlyZWN0bHkgZXhwb3NlZC5cbiAqXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbVggLSBTdGFydGluZyBwb2ludCB4XG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbVkgLSBTdGFydGluZyBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcn0gY3BYIC0gQ29udHJvbCBwb2ludCB4XG4gKiBAcGFyYW0ge251bWJlcn0gY3BZIC0gQ29udHJvbCBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcn0gY3BYMiAtIFNlY29uZCBDb250cm9sIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcFkyIC0gU2Vjb25kIENvbnRyb2wgcG9pbnQgeVxuICogQHBhcmFtIHtudW1iZXJ9IHRvWCAtIERlc3RpbmF0aW9uIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b1kgLSBEZXN0aW5hdGlvbiBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcn0gbiAtIE51bWJlciBvZiBzZWdtZW50cyBhcHByb3hpbWF0aW5nIHRoZSBiZXppZXIgY3VydmVcbiAqIEBwYXJhbSB7bnVtYmVyW119IFtwYXRoPVtdXSAtIFBhdGggYXJyYXkgdG8gcHVzaCBwb2ludHMgaW50b1xuICogQHJldHVybiB7bnVtYmVyW119IEFycmF5IG9mIHBvaW50cyBvZiB0aGUgY3VydmVcbiAqL1xuZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyhmcm9tWCwgZnJvbVksIGNwWCwgY3BZLCBjcFgyLCBjcFkyLCB0b1gsIHRvWSwgbiwgcGF0aClcbntcbiAgICBpZiAoIHBhdGggPT09IHZvaWQgMCApIHBhdGggPSBbXTtcblxuICAgIHZhciBkdCA9IDA7XG4gICAgdmFyIGR0MiA9IDA7XG4gICAgdmFyIGR0MyA9IDA7XG4gICAgdmFyIHQyID0gMDtcbiAgICB2YXIgdDMgPSAwO1xuXG4gICAgcGF0aC5wdXNoKGZyb21YLCBmcm9tWSk7XG5cbiAgICBmb3IgKHZhciBpID0gMSwgaiA9IDA7IGkgPD0gbjsgKytpKVxuICAgIHtcbiAgICAgICAgaiA9IGkgLyBuO1xuXG4gICAgICAgIGR0ID0gKDEgLSBqKTtcbiAgICAgICAgZHQyID0gZHQgKiBkdDtcbiAgICAgICAgZHQzID0gZHQyICogZHQ7XG5cbiAgICAgICAgdDIgPSBqICogajtcbiAgICAgICAgdDMgPSB0MiAqIGo7XG5cbiAgICAgICAgcGF0aC5wdXNoKFxuICAgICAgICAgICAgKGR0MyAqIGZyb21YKSArICgzICogZHQyICogaiAqIGNwWCkgKyAoMyAqIGR0ICogdDIgKiBjcFgyKSArICh0MyAqIHRvWCksXG4gICAgICAgICAgICAoZHQzICogZnJvbVkpICsgKDMgKiBkdDIgKiBqICogY3BZKSArICgzICogZHQgKiB0MiAqIGNwWTIpICsgKHQzICogdG9ZKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xufVxuXG4vKipcbiAqIERyYXcgYSBzdGFyIHNoYXBlIHdpdGggYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBwb2ludHMuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlBvbHlnb25cbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIENlbnRlciBYIHBvc2l0aW9uIG9mIHRoZSBzdGFyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIENlbnRlciBZIHBvc2l0aW9uIG9mIHRoZSBzdGFyXG4gKiBAcGFyYW0ge251bWJlcn0gcG9pbnRzIC0gVGhlIG51bWJlciBvZiBwb2ludHMgb2YgdGhlIHN0YXIsIG11c3QgYmUgPiAxXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIG91dGVyIHJhZGl1cyBvZiB0aGUgc3RhclxuICogQHBhcmFtIHtudW1iZXJ9IFtpbm5lclJhZGl1c10gLSBUaGUgaW5uZXIgcmFkaXVzIGJldHdlZW4gcG9pbnRzLCBkZWZhdWx0IGhhbGYgYHJhZGl1c2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcm90YXRpb249MF0gLSBUaGUgcm90YXRpb24gb2YgdGhlIHN0YXIgaW4gcmFkaWFucywgd2hlcmUgMCBpcyB2ZXJ0aWNhbFxuICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICovXG52YXIgU3RhciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFBvbHlnb24pIHtcbiAgICBmdW5jdGlvbiBTdGFyKHgsIHksIHBvaW50cywgcmFkaXVzLCBpbm5lclJhZGl1cywgcm90YXRpb24pXG4gICAge1xuICAgICAgICBpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IHJhZGl1cyAvIDI7XG5cbiAgICAgICAgdmFyIHN0YXJ0QW5nbGUgPSAoLTEgKiBNYXRoLlBJIC8gMikgKyByb3RhdGlvbjtcbiAgICAgICAgdmFyIGxlbiA9IHBvaW50cyAqIDI7XG4gICAgICAgIHZhciBkZWx0YSA9IFBJXzIgLyBsZW47XG4gICAgICAgIHZhciBwb2x5Z29uID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHIgPSBpICUgMiA/IGlubmVyUmFkaXVzIDogcmFkaXVzO1xuICAgICAgICAgICAgdmFyIGFuZ2xlID0gKGkgKiBkZWx0YSkgKyBzdGFydEFuZ2xlO1xuXG4gICAgICAgICAgICBwb2x5Z29uLnB1c2goXG4gICAgICAgICAgICAgICAgeCArIChyICogTWF0aC5jb3MoYW5nbGUpKSxcbiAgICAgICAgICAgICAgICB5ICsgKHIgKiBNYXRoLnNpbihhbmdsZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgUG9seWdvbi5jYWxsKHRoaXMsIHBvbHlnb24pO1xuICAgIH1cblxuICAgIGlmICggUG9seWdvbiApIFN0YXIuX19wcm90b19fID0gUG9seWdvbjtcbiAgICBTdGFyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHlnb24gJiYgUG9seWdvbi5wcm90b3R5cGUgKTtcbiAgICBTdGFyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN0YXI7XG5cbiAgICByZXR1cm4gU3Rhcjtcbn0oUG9seWdvbikpO1xuXG4vKipcbiAqIFV0aWxpdGllcyBmb3IgYXJjIGN1cnZlc1xuICogQGNsYXNzXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgQXJjVXRpbHMgPSBmdW5jdGlvbiBBcmNVdGlscyAoKSB7fTtcblxuQXJjVXRpbHMuY3VydmVUbyA9IGZ1bmN0aW9uIGN1cnZlVG8gKHgxLCB5MSwgeDIsIHkyLCByYWRpdXMsIHBvaW50cylcbntcbiAgICB2YXIgZnJvbVggPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdO1xuICAgIHZhciBmcm9tWSA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICB2YXIgYTEgPSBmcm9tWSAtIHkxO1xuICAgIHZhciBiMSA9IGZyb21YIC0geDE7XG4gICAgdmFyIGEyID0geTIgLSB5MTtcbiAgICB2YXIgYjIgPSB4MiAtIHgxO1xuICAgIHZhciBtbSA9IE1hdGguYWJzKChhMSAqIGIyKSAtIChiMSAqIGEyKSk7XG5cbiAgICBpZiAobW0gPCAxLjBlLTggfHwgcmFkaXVzID09PSAwKVxuICAgIHtcbiAgICAgICAgaWYgKHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0gIT09IHgxIHx8IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0gIT09IHkxKVxuICAgICAgICB7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh4MSwgeTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGRkID0gKGExICogYTEpICsgKGIxICogYjEpO1xuICAgIHZhciBjYyA9IChhMiAqIGEyKSArIChiMiAqIGIyKTtcbiAgICB2YXIgdHQgPSAoYTEgKiBhMikgKyAoYjEgKiBiMik7XG4gICAgdmFyIGsxID0gcmFkaXVzICogTWF0aC5zcXJ0KGRkKSAvIG1tO1xuICAgIHZhciBrMiA9IHJhZGl1cyAqIE1hdGguc3FydChjYykgLyBtbTtcbiAgICB2YXIgajEgPSBrMSAqIHR0IC8gZGQ7XG4gICAgdmFyIGoyID0gazIgKiB0dCAvIGNjO1xuICAgIHZhciBjeCA9IChrMSAqIGIyKSArIChrMiAqIGIxKTtcbiAgICB2YXIgY3kgPSAoazEgKiBhMikgKyAoazIgKiBhMSk7XG4gICAgdmFyIHB4ID0gYjEgKiAoazIgKyBqMSk7XG4gICAgdmFyIHB5ID0gYTEgKiAoazIgKyBqMSk7XG4gICAgdmFyIHF4ID0gYjIgKiAoazEgKyBqMik7XG4gICAgdmFyIHF5ID0gYTIgKiAoazEgKyBqMik7XG4gICAgdmFyIHN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKHB5IC0gY3ksIHB4IC0gY3gpO1xuICAgIHZhciBlbmRBbmdsZSA9IE1hdGguYXRhbjIocXkgLSBjeSwgcXggLSBjeCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjeDogKGN4ICsgeDEpLFxuICAgICAgICBjeTogKGN5ICsgeTEpLFxuICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgc3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcbiAgICAgICAgZW5kQW5nbGU6IGVuZEFuZ2xlLFxuICAgICAgICBhbnRpY2xvY2t3aXNlOiAoYjEgKiBhMiA+IGIyICogYTEpLFxuICAgIH07XG59O1xuXG4vKipcbiAqIFRoZSBhcmMgbWV0aG9kIGNyZWF0ZXMgYW4gYXJjL2N1cnZlICh1c2VkIHRvIGNyZWF0ZSBjaXJjbGVzLCBvciBwYXJ0cyBvZiBjaXJjbGVzKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0WCAtIFN0YXJ0IHggbG9jYXRpb24gb2YgYXJjXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRZIC0gU3RhcnQgeSBsb2NhdGlvbiBvZiBhcmNcbiAqIEBwYXJhbSB7bnVtYmVyfSBjeCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlXG4gKiBAcGFyYW0ge251bWJlcn0gY3kgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0QW5nbGUgLSBUaGUgc3RhcnRpbmcgYW5nbGUsIGluIHJhZGlhbnMgKDAgaXMgYXQgdGhlIDMgbydjbG9jayBwb3NpdGlvblxuICogIG9mIHRoZSBhcmMncyBjaXJjbGUpXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kQW5nbGUgLSBUaGUgZW5kaW5nIGFuZ2xlLCBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFudGljbG9ja3dpc2UgLSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZHJhd2luZyBzaG91bGQgYmVcbiAqICBjb3VudGVyLWNsb2Nrd2lzZSBvciBjbG9ja3dpc2UuIEZhbHNlIGlzIGRlZmF1bHQsIGFuZCBpbmRpY2F0ZXMgY2xvY2t3aXNlLCB3aGlsZSB0cnVlXG4gKiAgaW5kaWNhdGVzIGNvdW50ZXItY2xvY2t3aXNlLlxuICogQHBhcmFtIHtudW1iZXJ9IG4gLSBOdW1iZXIgb2Ygc2VnbWVudHNcbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50cyAtIENvbGxlY3Rpb24gb2YgcG9pbnRzIHRvIGFkZCB0b1xuICovXG5BcmNVdGlscy5hcmMgPSBmdW5jdGlvbiBhcmMgKHN0YXJ0WCwgc3RhcnRZLCBjeCwgY3ksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGFudGljbG9ja3dpc2UsIHBvaW50cylcbntcbiAgICB2YXIgc3dlZXAgPSBlbmRBbmdsZSAtIHN0YXJ0QW5nbGU7XG4gICAgdmFyIG4gPSBHUkFQSElDU19DVVJWRVMuX3NlZ21lbnRzQ291bnQoXG4gICAgICAgIE1hdGguYWJzKHN3ZWVwKSAqIHJhZGl1cyxcbiAgICAgICAgTWF0aC5jZWlsKE1hdGguYWJzKHN3ZWVwKSAvIFBJXzIpICogNDBcbiAgICApO1xuXG4gICAgdmFyIHRoZXRhID0gKHN3ZWVwKSAvIChuICogMik7XG4gICAgdmFyIHRoZXRhMiA9IHRoZXRhICogMjtcbiAgICB2YXIgY1RoZXRhID0gTWF0aC5jb3ModGhldGEpO1xuICAgIHZhciBzVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgdmFyIHNlZ01pbnVzID0gbiAtIDE7XG4gICAgdmFyIHJlbWFpbmRlciA9IChzZWdNaW51cyAlIDEpIC8gc2VnTWludXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzZWdNaW51czsgKytpKVxuICAgIHtcbiAgICAgICAgdmFyIHJlYWwgPSBpICsgKHJlbWFpbmRlciAqIGkpO1xuICAgICAgICB2YXIgYW5nbGUgPSAoKHRoZXRhKSArIHN0YXJ0QW5nbGUgKyAodGhldGEyICogcmVhbCkpO1xuICAgICAgICB2YXIgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgdmFyIHMgPSAtTWF0aC5zaW4oYW5nbGUpO1xuXG4gICAgICAgIHBvaW50cy5wdXNoKFxuICAgICAgICAgICAgKCgoY1RoZXRhICogYykgKyAoc1RoZXRhICogcykpICogcmFkaXVzKSArIGN4LFxuICAgICAgICAgICAgKCgoY1RoZXRhICogLXMpICsgKHNUaGV0YSAqIGMpKSAqIHJhZGl1cykgKyBjeVxuICAgICAgICApO1xuICAgIH1cbn07XG5cbi8qKlxuICogVXRpbGl0aWVzIGZvciBiZXppZXIgY3VydmVzXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBCZXppZXJVdGlscyA9IGZ1bmN0aW9uIEJlemllclV0aWxzICgpIHt9O1xuXG5CZXppZXJVdGlscy5jdXJ2ZUxlbmd0aCA9IGZ1bmN0aW9uIGN1cnZlTGVuZ3RoIChmcm9tWCwgZnJvbVksIGNwWCwgY3BZLCBjcFgyLCBjcFkyLCB0b1gsIHRvWSlcbntcbiAgICB2YXIgbiA9IDEwO1xuICAgIHZhciByZXN1bHQgPSAwLjA7XG4gICAgdmFyIHQgPSAwLjA7XG4gICAgdmFyIHQyID0gMC4wO1xuICAgIHZhciB0MyA9IDAuMDtcbiAgICB2YXIgbnQgPSAwLjA7XG4gICAgdmFyIG50MiA9IDAuMDtcbiAgICB2YXIgbnQzID0gMC4wO1xuICAgIHZhciB4ID0gMC4wO1xuICAgIHZhciB5ID0gMC4wO1xuICAgIHZhciBkeCA9IDAuMDtcbiAgICB2YXIgZHkgPSAwLjA7XG4gICAgdmFyIHByZXZYID0gZnJvbVg7XG4gICAgdmFyIHByZXZZID0gZnJvbVk7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBuOyArK2kpXG4gICAge1xuICAgICAgICB0ID0gaSAvIG47XG4gICAgICAgIHQyID0gdCAqIHQ7XG4gICAgICAgIHQzID0gdDIgKiB0O1xuICAgICAgICBudCA9ICgxLjAgLSB0KTtcbiAgICAgICAgbnQyID0gbnQgKiBudDtcbiAgICAgICAgbnQzID0gbnQyICogbnQ7XG5cbiAgICAgICAgeCA9IChudDMgKiBmcm9tWCkgKyAoMy4wICogbnQyICogdCAqIGNwWCkgKyAoMy4wICogbnQgKiB0MiAqIGNwWDIpICsgKHQzICogdG9YKTtcbiAgICAgICAgeSA9IChudDMgKiBmcm9tWSkgKyAoMy4wICogbnQyICogdCAqIGNwWSkgKyAoMyAqIG50ICogdDIgKiBjcFkyKSArICh0MyAqIHRvWSk7XG4gICAgICAgIGR4ID0gcHJldlggLSB4O1xuICAgICAgICBkeSA9IHByZXZZIC0geTtcbiAgICAgICAgcHJldlggPSB4O1xuICAgICAgICBwcmV2WSA9IHk7XG5cbiAgICAgICAgcmVzdWx0ICs9IE1hdGguc3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSBhbmQgdGhlbiBkcmF3cyBpdC5cbiAqXG4gKiBJZ25vcmVkIGZyb20gZG9jcyBzaW5jZSBpdCBpcyBub3QgZGlyZWN0bHkgZXhwb3NlZC5cbiAqXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge251bWJlcn0gY3BYIC0gQ29udHJvbCBwb2ludCB4XG4gKiBAcGFyYW0ge251bWJlcn0gY3BZIC0gQ29udHJvbCBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcn0gY3BYMiAtIFNlY29uZCBDb250cm9sIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcFkyIC0gU2Vjb25kIENvbnRyb2wgcG9pbnQgeVxuICogQHBhcmFtIHtudW1iZXJ9IHRvWCAtIERlc3RpbmF0aW9uIHBvaW50IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b1kgLSBEZXN0aW5hdGlvbiBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcltdfSBwb2ludHMgLSBQYXRoIGFycmF5IHRvIHB1c2ggcG9pbnRzIGludG9cbiAqL1xuQmV6aWVyVXRpbHMuY3VydmVUbyA9IGZ1bmN0aW9uIGN1cnZlVG8gKGNwWCwgY3BZLCBjcFgyLCBjcFkyLCB0b1gsIHRvWSwgcG9pbnRzKVxue1xuICAgIHZhciBmcm9tWCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl07XG4gICAgdmFyIGZyb21ZID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcblxuICAgIHBvaW50cy5sZW5ndGggLT0gMjtcblxuICAgIHZhciBuID0gR1JBUEhJQ1NfQ1VSVkVTLl9zZWdtZW50c0NvdW50KFxuICAgICAgICBCZXppZXJVdGlscy5jdXJ2ZUxlbmd0aChmcm9tWCwgZnJvbVksIGNwWCwgY3BZLCBjcFgyLCBjcFkyLCB0b1gsIHRvWSlcbiAgICApO1xuXG4gICAgdmFyIGR0ID0gMDtcbiAgICB2YXIgZHQyID0gMDtcbiAgICB2YXIgZHQzID0gMDtcbiAgICB2YXIgdDIgPSAwO1xuICAgIHZhciB0MyA9IDA7XG5cbiAgICBwb2ludHMucHVzaChmcm9tWCwgZnJvbVkpO1xuXG4gICAgZm9yICh2YXIgaSA9IDEsIGogPSAwOyBpIDw9IG47ICsraSlcbiAgICB7XG4gICAgICAgIGogPSBpIC8gbjtcblxuICAgICAgICBkdCA9ICgxIC0gaik7XG4gICAgICAgIGR0MiA9IGR0ICogZHQ7XG4gICAgICAgIGR0MyA9IGR0MiAqIGR0O1xuXG4gICAgICAgIHQyID0gaiAqIGo7XG4gICAgICAgIHQzID0gdDIgKiBqO1xuXG4gICAgICAgIHBvaW50cy5wdXNoKFxuICAgICAgICAgICAgKGR0MyAqIGZyb21YKSArICgzICogZHQyICogaiAqIGNwWCkgKyAoMyAqIGR0ICogdDIgKiBjcFgyKSArICh0MyAqIHRvWCksXG4gICAgICAgICAgICAoZHQzICogZnJvbVkpICsgKDMgKiBkdDIgKiBqICogY3BZKSArICgzICogZHQgKiB0MiAqIGNwWTIpICsgKHQzICogdG9ZKVxuICAgICAgICApO1xuICAgIH1cbn07XG5cbi8qKlxuICogVXRpbGl0aWVzIGZvciBxdWFkcmF0aWMgY3VydmVzXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBRdWFkcmF0aWNVdGlscyA9IGZ1bmN0aW9uIFF1YWRyYXRpY1V0aWxzICgpIHt9O1xuXG5RdWFkcmF0aWNVdGlscy5jdXJ2ZUxlbmd0aCA9IGZ1bmN0aW9uIGN1cnZlTGVuZ3RoIChmcm9tWCwgZnJvbVksIGNwWCwgY3BZLCB0b1gsIHRvWSlcbntcbiAgICB2YXIgYXggPSBmcm9tWCAtICgyLjAgKiBjcFgpICsgdG9YO1xuICAgIHZhciBheSA9IGZyb21ZIC0gKDIuMCAqIGNwWSkgKyB0b1k7XG4gICAgdmFyIGJ4ID0gKDIuMCAqIGNwWCkgLSAoMi4wICogZnJvbVgpO1xuICAgIHZhciBieSA9ICgyLjAgKiBjcFkpIC0gKDIuMCAqIGZyb21ZKTtcbiAgICB2YXIgYSA9IDQuMCAqICgoYXggKiBheCkgKyAoYXkgKiBheSkpO1xuICAgIHZhciBiID0gNC4wICogKChheCAqIGJ4KSArIChheSAqIGJ5KSk7XG4gICAgdmFyIGMgPSAoYnggKiBieCkgKyAoYnkgKiBieSk7XG5cbiAgICB2YXIgcyA9IDIuMCAqIE1hdGguc3FydChhICsgYiArIGMpO1xuICAgIHZhciBhMiA9IE1hdGguc3FydChhKTtcbiAgICB2YXIgYTMyID0gMi4wICogYSAqIGEyO1xuICAgIHZhciBjMiA9IDIuMCAqIE1hdGguc3FydChjKTtcbiAgICB2YXIgYmEgPSBiIC8gYTI7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICAoYTMyICogcylcbiAgICAgICAgICAgICsgKGEyICogYiAqIChzIC0gYzIpKVxuICAgICAgICAgICAgKyAoXG4gICAgICAgICAgICAgICAgKCg0LjAgKiBjICogYSkgLSAoYiAqIGIpKVxuICAgICAgICAgICAgICAgKiBNYXRoLmxvZygoKDIuMCAqIGEyKSArIGJhICsgcykgLyAoYmEgKyBjMikpXG4gICAgICAgICAgICApXG4gICAgKSAvICg0LjAgKiBhMzIpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHBvaW50cyBmb3IgYSBxdWFkcmF0aWMgYmV6aWVyIGN1cnZlIGFuZCB0aGVuIGRyYXdzIGl0LlxuICogQmFzZWQgb246IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NTA5Ny9ob3ctZG8taS1pbXBsZW1lbnQtYS1iZXppZXItY3VydmUtaW4tY1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gY3BYIC0gQ29udHJvbCBwb2ludCB4XG4gKiBAcGFyYW0ge251bWJlcn0gY3BZIC0gQ29udHJvbCBwb2ludCB5XG4gKiBAcGFyYW0ge251bWJlcn0gdG9YIC0gRGVzdGluYXRpb24gcG9pbnQgeFxuICogQHBhcmFtIHtudW1iZXJ9IHRvWSAtIERlc3RpbmF0aW9uIHBvaW50IHlcbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50cyAtIFBvaW50cyB0byBhZGQgc2VnbWVudHMgdG8uXG4gKi9cblF1YWRyYXRpY1V0aWxzLmN1cnZlVG8gPSBmdW5jdGlvbiBjdXJ2ZVRvIChjcFgsIGNwWSwgdG9YLCB0b1ksIHBvaW50cylcbntcbiAgICB2YXIgZnJvbVggPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdO1xuICAgIHZhciBmcm9tWSA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICB2YXIgbiA9IEdSQVBISUNTX0NVUlZFUy5fc2VnbWVudHNDb3VudChcbiAgICAgICAgUXVhZHJhdGljVXRpbHMuY3VydmVMZW5ndGgoZnJvbVgsIGZyb21ZLCBjcFgsIGNwWSwgdG9YLCB0b1kpXG4gICAgKTtcblxuICAgIHZhciB4YSA9IDA7XG4gICAgdmFyIHlhID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG47ICsraSlcbiAgICB7XG4gICAgICAgIHZhciBqID0gaSAvIG47XG5cbiAgICAgICAgeGEgPSBmcm9tWCArICgoY3BYIC0gZnJvbVgpICogaik7XG4gICAgICAgIHlhID0gZnJvbVkgKyAoKGNwWSAtIGZyb21ZKSAqIGopO1xuXG4gICAgICAgIHBvaW50cy5wdXNoKHhhICsgKCgoY3BYICsgKCh0b1ggLSBjcFgpICogaikpIC0geGEpICogaiksXG4gICAgICAgICAgICB5YSArICgoKGNwWSArICgodG9ZIC0gY3BZKSAqIGopKSAtIHlhKSAqIGopKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEEgc3RydWN0dXJlIHRvIGhvbGQgaW50ZXJpbSBiYXRjaCBvYmplY3RzIGZvciBHcmFwaGljcy5cbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWEkuZ3JhcGhpY3NVdGlsc1xuICovXG52YXIgQmF0Y2hQYXJ0ID0gZnVuY3Rpb24gQmF0Y2hQYXJ0KClcbntcbiAgICB0aGlzLnJlc2V0KCk7XG59O1xuXG4vKipcbiAqIEJlZ2luIGJhdGNoIHBhcnRcbiAqXG4gKiBAcGFyYW0ge1BJWEkuRmlsbFN0eWxlIHwgUElYSS5MaW5lU3R5bGV9IHN0eWxlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IGF0dHJpYlN0YXJ0XG4gKi9cbkJhdGNoUGFydC5wcm90b3R5cGUuYmVnaW4gPSBmdW5jdGlvbiBiZWdpbiAoc3R5bGUsIHN0YXJ0SW5kZXgsIGF0dHJpYlN0YXJ0KVxue1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0SW5kZXg7XG4gICAgdGhpcy5hdHRyaWJTdGFydCA9IGF0dHJpYlN0YXJ0O1xufTtcblxuLyoqXG4gKiBFbmQgYmF0Y2ggcGFydFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZEF0dHJpYlxuICovXG5CYXRjaFBhcnQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZCAoZW5kSW5kZXgsIGVuZEF0dHJpYilcbntcbiAgICB0aGlzLmF0dHJpYlNpemUgPSBlbmRBdHRyaWIgLSB0aGlzLmF0dHJpYlN0YXJ0O1xuICAgIHRoaXMuc2l6ZSA9IGVuZEluZGV4IC0gdGhpcy5zdGFydDtcbn07XG5cbkJhdGNoUGFydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxue1xuICAgIHRoaXMuc3R5bGUgPSBudWxsO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5hdHRyaWJTdGFydCA9IDA7XG4gICAgdGhpcy5hdHRyaWJTaXplID0gMDtcbn07XG5cbi8qKlxuICogR2VuZXJhbGl6ZWQgY29udmVuaWVuY2UgdXRpbGl0aWVzIGZvciBHcmFwaGljcy5cbiAqXG4gKiBAbmFtZXNwYWNlIFBJWEkuZ3JhcGhpY3NVdGlsc1xuICovXG5cbi8qKlxuICogTWFwIG9mIGZpbGwgY29tbWFuZHMgZm9yIGVhY2ggc2hhcGUgdHlwZS5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5ncmFwaGljc1V0aWxzXG4gKiBAbWVtYmVyIHtPYmplY3R9XG4gKi9cbnZhciBGSUxMX0NPTU1BTkRTID0ge307XG5GSUxMX0NPTU1BTkRTW1NIQVBFUy5QT0xZXSA9IGJ1aWxkUG9seTtcbkZJTExfQ09NTUFORFNbU0hBUEVTLkNJUkNdID0gYnVpbGRDaXJjbGU7XG5GSUxMX0NPTU1BTkRTW1NIQVBFUy5FTElQXSA9IGJ1aWxkQ2lyY2xlO1xuRklMTF9DT01NQU5EU1tTSEFQRVMuUkVDVF0gPSBidWlsZFJlY3RhbmdsZTtcbkZJTExfQ09NTUFORFNbU0hBUEVTLlJSRUNdID0gYnVpbGRSb3VuZGVkUmVjdGFuZ2xlO1xuXG4vKipcbiAqIEJhdGNoIHBvb2wsIHN0b3JlcyB1bnVzZWQgYmF0Y2hlcyBmb3IgcHJldmVudGluZyBhbGxvY2F0aW9ucy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5ncmFwaGljc1V0aWxzXG4gKiBAdHlwZSB7QXJyYXk8UElYSS5ncmFwaGljc1V0aWxzLkJhdGNoUGFydD59XG4gKi9cbnZhciBCQVRDSF9QT09MID0gW107XG5cbi8qKlxuICogRHJhdyBjYWxsIHBvb2wsIHN0b3JlcyB1bnVzZWQgZHJhdyBjYWxscyBmb3IgcHJldmVudGluZyBhbGxvY2F0aW9ucy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5ncmFwaGljc1V0aWxzXG4gKiBAdHlwZSB7QXJyYXk8UElYSS5CYXRjaERyYXdDYWxsPn1cbiAqL1xudmFyIERSQVdfQ0FMTF9QT09MID0gW107XG5cbnZhciBpbmRleCA9ICh7XG4gICAgYnVpbGRQb2x5OiBidWlsZFBvbHksXG4gICAgYnVpbGRDaXJjbGU6IGJ1aWxkQ2lyY2xlLFxuICAgIGJ1aWxkUmVjdGFuZ2xlOiBidWlsZFJlY3RhbmdsZSxcbiAgICBidWlsZFJvdW5kZWRSZWN0YW5nbGU6IGJ1aWxkUm91bmRlZFJlY3RhbmdsZSxcbiAgICBGSUxMX0NPTU1BTkRTOiBGSUxMX0NPTU1BTkRTLFxuICAgIEJBVENIX1BPT0w6IEJBVENIX1BPT0wsXG4gICAgRFJBV19DQUxMX1BPT0w6IERSQVdfQ0FMTF9QT09MLFxuICAgIGJ1aWxkTGluZTogYnVpbGRMaW5lLFxuICAgIGJ1aWxkQ29tcGxleFBvbHk6IGJ1aWxkQ29tcGxleFBvbHksXG4gICAgYmV6aWVyQ3VydmVUbzogYmV6aWVyQ3VydmVUbyxcbiAgICBTdGFyOiBTdGFyLFxuICAgIEFyY1V0aWxzOiBBcmNVdGlscyxcbiAgICBCZXppZXJVdGlsczogQmV6aWVyVXRpbHMsXG4gICAgUXVhZHJhdGljVXRpbHM6IFF1YWRyYXRpY1V0aWxzLFxuICAgIEJhdGNoUGFydDogQmF0Y2hQYXJ0XG59KTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIGNvbnRhaW4gZGF0YSB1c2VmdWwgZm9yIEdyYXBoaWNzIG9iamVjdHNcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBHcmFwaGljc0RhdGEgPSBmdW5jdGlvbiBHcmFwaGljc0RhdGEoc2hhcGUsIGZpbGxTdHlsZSwgbGluZVN0eWxlLCBtYXRyaXgpXG57XG4gICAgaWYgKCBmaWxsU3R5bGUgPT09IHZvaWQgMCApIGZpbGxTdHlsZSA9IG51bGw7XG4gICAgaWYgKCBsaW5lU3R5bGUgPT09IHZvaWQgMCApIGxpbmVTdHlsZSA9IG51bGw7XG4gICAgaWYgKCBtYXRyaXggPT09IHZvaWQgMCApIG1hdHJpeCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2hhcGUgb2JqZWN0IHRvIGRyYXcuXG4gICAgICogQG1lbWJlciB7UElYSS5DaXJjbGV8UElYSS5FbGxpcHNlfFBJWEkuUG9seWdvbnxQSVhJLlJlY3RhbmdsZXxQSVhJLlJvdW5kZWRSZWN0YW5nbGV9XG4gICAgICovXG4gICAgdGhpcy5zaGFwZSA9IHNoYXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0eWxlIG9mIHRoZSBsaW5lLlxuICAgICAqIEBtZW1iZXIge1BJWEkuTGluZVN0eWxlfVxuICAgICAqL1xuICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0eWxlIG9mIHRoZSBmaWxsLlxuICAgICAqIEBtZW1iZXIge1BJWEkuRmlsbFN0eWxlfVxuICAgICAqL1xuICAgIHRoaXMuZmlsbFN0eWxlID0gZmlsbFN0eWxlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXguXG4gICAgICogQG1lbWJlciB7UElYSS5NYXRyaXh9XG4gICAgICovXG4gICAgdGhpcy5tYXRyaXggPSBtYXRyaXg7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgc2hhcGUsIHNlZSB0aGUgQ29uc3QuU2hhcGVzIGZpbGUgZm9yIGFsbCB0aGUgZXhpc3RpbmcgdHlwZXMsXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHNoYXBlLnR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29sbGVjdGlvbiBvZiBwb2ludHMuXG4gICAgICogQG1lbWJlciB7bnVtYmVyW119XG4gICAgICovXG4gICAgdGhpcy5wb2ludHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIGhvbGVzLlxuICAgICAqIEBtZW1iZXIge1BJWEkuR3JhcGhpY3NEYXRhW119XG4gICAgICovXG4gICAgdGhpcy5ob2xlcyA9IFtdO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEdyYXBoaWNzRGF0YSBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhpcyBvbmUuXG4gKlxuICogQHJldHVybiB7UElYSS5HcmFwaGljc0RhdGF9IENsb25lZCBHcmFwaGljc0RhdGEgb2JqZWN0XG4gKi9cbkdyYXBoaWNzRGF0YS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKVxue1xuICAgIHJldHVybiBuZXcgR3JhcGhpY3NEYXRhKFxuICAgICAgICB0aGlzLnNoYXBlLFxuICAgICAgICB0aGlzLmZpbGxTdHlsZSxcbiAgICAgICAgdGhpcy5saW5lU3R5bGUsXG4gICAgICAgIHRoaXMubWF0cml4XG4gICAgKTtcbn07XG5cbi8qKlxuICogRGVzdHJveXMgdGhlIEdyYXBoaWNzIGRhdGEuXG4gKi9cbkdyYXBoaWNzRGF0YS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKClcbntcbiAgICB0aGlzLnNoYXBlID0gbnVsbDtcbiAgICB0aGlzLmhvbGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5ob2xlcyA9IG51bGw7XG4gICAgdGhpcy5wb2ludHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBvaW50cyA9IG51bGw7XG4gICAgdGhpcy5saW5lU3R5bGUgPSBudWxsO1xuICAgIHRoaXMuZmlsbFN0eWxlID0gbnVsbDtcbn07XG5cbnZhciB0bXBQb2ludCA9IG5ldyBQb2ludCgpO1xudmFyIHRtcEJvdW5kcyA9IG5ldyBCb3VuZHMoKTtcblxuLyoqXG4gKiBUaGUgR3JhcGhpY3MgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB1c2VkIHRvIGRyYXcgcHJpbWl0aXZlIHNoYXBlcyBzdWNoIGFzIGxpbmVzLCBjaXJjbGVzIGFuZFxuICogcmVjdGFuZ2xlcyB0byB0aGUgZGlzcGxheSwgYW5kIHRvIGNvbG9yIGFuZCBmaWxsIHRoZW0uXG4gKlxuICogR3JhcGhpY3NHZW9tZXRyeSBpcyBkZXNpZ25lZCB0byBub3QgYmUgY29udGludWFsbHkgdXBkYXRpbmcgdGhlIGdlb21ldHJ5IHNpbmNlIGl0J3MgZXhwZW5zaXZlXG4gKiB0byByZS10ZXNzZWxhdGUgdXNpbmcgKiplYXJjdXQqKi4gQ29uc2lkZXIgdXNpbmcge0BsaW5rIFBJWEkuTWVzaH0gZm9yIHRoaXMgdXNlLWNhc2UsIGl0J3MgbXVjaCBmYXN0ZXIuXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLkJhdGNoR2VvbWV0cnlcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBHcmFwaGljc0dlb21ldHJ5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmF0Y2hHZW9tZXRyeSkge1xuICAgIGZ1bmN0aW9uIEdyYXBoaWNzR2VvbWV0cnkoKVxuICAgIHtcbiAgICAgICAgQmF0Y2hHZW9tZXRyeS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBhcnJheSBvZiBwb2ludHMgdG8gZHJhdywgMiBudW1iZXJzIHBlciBwb2ludFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJbXX1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb2ludHMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNvbGxlY3Rpb24gb2YgY29sb3JzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcltdfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbG9ycyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgVVZzIGNvbGxlY3Rpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyW119XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXZzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBpbmRpY2VzIG9mIHRoZSB2ZXJ0aWNlc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJbXX1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRpY2VzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdGV4dHVyZSBJRHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcltdfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRleHR1cmVJZHMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNvbGxlY3Rpb24gb2YgZHJhd24gc2hhcGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkdyYXBoaWNzRGF0YVtdfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdyYXBoaWNzRGF0YSA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGRldGVjdCBpZiB0aGUgZ3JhcGhpY3Mgb2JqZWN0IGhhcyBjaGFuZ2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlydHkgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCYXRjaGVzIG5lZWQgdG8gcmVnZW5lcmF0ZWQgaWYgdGhlIGdlb21ldHJ5IGlzIHVwZGF0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXRjaERpcnR5ID0gLTE7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhlIGNhY2hlIGlzIGRpcnR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGVEaXJ0eSA9IC0xO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGRldGVjdCBpZiB3ZSBjbGVhcmVkIHRoZSBncmFwaGljc0RhdGEuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsZWFyRGlydHkgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGN1cnJlbnQgZHJhdyBjYWxscyBkcml2ZWQgZnJvbSB0aGUgYmF0Y2hlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7b2JqZWN0W119XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZHJhd0NhbGxzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEludGVybWVkaWF0ZSBhYnN0cmFjdCBmb3JtYXQgc2VudCB0byBiYXRjaCBzeXN0ZW0uXG4gICAgICAgICAqIENhbiBiZSBjb252ZXJ0ZWQgdG8gZHJhd0NhbGxzIG9yIHRvIGJhdGNoYWJsZSBvYmplY3RzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLmdyYXBoaWNzVXRpbHMuQmF0Y2hQYXJ0W119XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmF0Y2hlcyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRleCBvZiB0aGUgbGFzdCBiYXRjaGVkIHNoYXBlIGluIHRoZSBzdGFjayBvZiBjYWxscy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNoYXBlSW5kZXggPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZWQgYm91bmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkJvdW5kc31cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYm91bmRzID0gbmV3IEJvdW5kcygpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYm91bmRzIGRpcnR5IGZsYWcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ib3VuZHNEaXJ0eSA9IC0xO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYWRkaW5nIHRvIGFkZCB0byB0aGUgYm91bmRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYm91bmRzUGFkZGluZyA9IDA7XG5cbiAgICAgICAgdGhpcy5iYXRjaGFibGUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmluZGljZXNVaW50MTYgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudXZzRmxvYXQzMiA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltYWwgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMgdGhhdCBhcmUgY29uc2lkZXJlZCBkaWZmZXJlbnQuXG4gICAgICAgICAqIEFmZmVjdHMgbGluZSB0ZXNzZWxhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZVBvaW50RXBzID0gMWUtNDtcbiAgICB9XG5cbiAgICBpZiAoIEJhdGNoR2VvbWV0cnkgKSBHcmFwaGljc0dlb21ldHJ5Ll9fcHJvdG9fXyA9IEJhdGNoR2VvbWV0cnk7XG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCYXRjaEdlb21ldHJ5ICYmIEJhdGNoR2VvbWV0cnkucHJvdG90eXBlICk7XG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHcmFwaGljc0dlb21ldHJ5O1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgYm91bmRzOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYm91bmRzIG9mIHRoZSBncmFwaGljIGdlb21ldHJ5LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5Cb3VuZHN9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmJvdW5kcy5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuYm91bmRzRGlydHkgIT09IHRoaXMuZGlydHkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzRGlydHkgPSB0aGlzLmRpcnR5O1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVCb3VuZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9ib3VuZHM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGwgaWYgeW91IGNoYW5nZWQgZ3JhcGhpY3NEYXRhIG1hbnVhbGx5LlxuICAgICAqIEVtcHRpZXMgYWxsIGJhdGNoIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuYm91bmRzRGlydHkgPSAtMTtcbiAgICAgICAgdGhpcy5kaXJ0eSsrO1xuICAgICAgICB0aGlzLmJhdGNoRGlydHkrKztcbiAgICAgICAgdGhpcy5zaGFwZUluZGV4ID0gMDtcblxuICAgICAgICB0aGlzLnBvaW50cy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmNvbG9ycy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnV2cy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmluZGljZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy50ZXh0dXJlSWRzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYXdDYWxscy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kcmF3Q2FsbHNbaV0udGV4dHVyZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIERSQVdfQ0FMTF9QT09MLnB1c2godGhpcy5kcmF3Q2FsbHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kcmF3Q2FsbHMubGVuZ3RoID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aGlzLmJhdGNoZXMubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGJhdGNoUGFydCA9IHRoaXMuYmF0Y2hlc1tpJDFdO1xuXG4gICAgICAgICAgICBiYXRjaFBhcnQucmVzZXQoKTtcbiAgICAgICAgICAgIEJBVENIX1BPT0wucHVzaChiYXRjaFBhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZ3JhcGhpY3MgdGhhdCB3ZXJlIGRyYXduIHRvIHRoaXMgR3JhcGhpY3Mgb2JqZWN0LCBhbmQgcmVzZXRzIGZpbGwgYW5kIGxpbmUgc3R5bGUgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzR2VvbWV0cnl9IFRoaXMgR3JhcGhpY3NHZW9tZXRyeSBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGggPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEaXJ0eSsrO1xuICAgICAgICAgICAgdGhpcy5ncmFwaGljc0RhdGEubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEcmF3cyB0aGUgZ2l2ZW4gc2hhcGUgdG8gdGhpcyBHcmFwaGljcyBvYmplY3QuIENhbiBiZSBhbnkgb2YgQ2lyY2xlLCBSZWN0YW5nbGUsIEVsbGlwc2UsIExpbmUgb3IgUG9seWdvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5DaXJjbGV8UElYSS5FbGxpcHNlfFBJWEkuUG9seWdvbnxQSVhJLlJlY3RhbmdsZXxQSVhJLlJvdW5kZWRSZWN0YW5nbGV9IHNoYXBlIC0gVGhlIHNoYXBlIG9iamVjdCB0byBkcmF3LlxuICAgICAqIEBwYXJhbSB7UElYSS5GaWxsU3R5bGV9IGZpbGxTdHlsZSAtIERlZmluZXMgc3R5bGUgb2YgdGhlIGZpbGwuXG4gICAgICogQHBhcmFtIHtQSVhJLkxpbmVTdHlsZX0gbGluZVN0eWxlIC0gRGVmaW5lcyBzdHlsZSBvZiB0aGUgbGluZXMuXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gbWF0cml4IC0gVHJhbnNmb3JtIGFwcGxpZWQgdG8gdGhlIHBvaW50cyBvZiB0aGUgc2hhcGUuXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc0dlb21ldHJ5fSBSZXR1cm5zIGdlb21ldHJ5IGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5kcmF3U2hhcGUgPSBmdW5jdGlvbiBkcmF3U2hhcGUgKHNoYXBlLCBmaWxsU3R5bGUsIGxpbmVTdHlsZSwgbWF0cml4KVxuICAgIHtcbiAgICAgICAgdmFyIGRhdGEgPSBuZXcgR3JhcGhpY3NEYXRhKHNoYXBlLCBmaWxsU3R5bGUsIGxpbmVTdHlsZSwgbWF0cml4KTtcblxuICAgICAgICB0aGlzLmdyYXBoaWNzRGF0YS5wdXNoKGRhdGEpO1xuICAgICAgICB0aGlzLmRpcnR5Kys7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERyYXdzIHRoZSBnaXZlbiBzaGFwZSB0byB0aGlzIEdyYXBoaWNzIG9iamVjdC4gQ2FuIGJlIGFueSBvZiBDaXJjbGUsIFJlY3RhbmdsZSwgRWxsaXBzZSwgTGluZSBvciBQb2x5Z29uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkNpcmNsZXxQSVhJLkVsbGlwc2V8UElYSS5Qb2x5Z29ufFBJWEkuUmVjdGFuZ2xlfFBJWEkuUm91bmRlZFJlY3RhbmdsZX0gc2hhcGUgLSBUaGUgc2hhcGUgb2JqZWN0IHRvIGRyYXcuXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gbWF0cml4IC0gVHJhbnNmb3JtIGFwcGxpZWQgdG8gdGhlIHBvaW50cyBvZiB0aGUgc2hhcGUuXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc0dlb21ldHJ5fSBSZXR1cm5zIGdlb21ldHJ5IGZvciBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5kcmF3SG9sZSA9IGZ1bmN0aW9uIGRyYXdIb2xlIChzaGFwZSwgbWF0cml4KVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGEgPSBuZXcgR3JhcGhpY3NEYXRhKHNoYXBlLCBudWxsLCBudWxsLCBtYXRyaXgpO1xuXG4gICAgICAgIHZhciBsYXN0U2hhcGUgPSB0aGlzLmdyYXBoaWNzRGF0YVt0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGggLSAxXTtcblxuICAgICAgICBkYXRhLmxpbmVTdHlsZSA9IGxhc3RTaGFwZS5saW5lU3R5bGU7XG5cbiAgICAgICAgbGFzdFNoYXBlLmhvbGVzLnB1c2goZGF0YSk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSsrO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgR3JhcGhpY3Mgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R8Ym9vbGVhbn0gW29wdGlvbnNdIC0gT3B0aW9ucyBwYXJhbWV0ZXIuIEEgYm9vbGVhbiB3aWxsIGFjdCBhcyBpZiBhbGxcbiAgICAgKiAgb3B0aW9ucyBoYXZlIGJlZW4gc2V0IHRvIHRoYXQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoaWxkcmVuPWZhbHNlXSAtIGlmIHNldCB0byB0cnVlLCBhbGwgdGhlIGNoaWxkcmVuIHdpbGwgaGF2ZVxuICAgICAqICB0aGVpciBkZXN0cm95IG1ldGhvZCBjYWxsZWQgYXMgd2VsbC4gJ29wdGlvbnMnIHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRob3NlIGNhbGxzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGV4dHVyZT1mYWxzZV0gLSBPbmx5IHVzZWQgZm9yIGNoaWxkIFNwcml0ZXMgaWYgb3B0aW9ucy5jaGlsZHJlbiBpcyBzZXQgdG8gdHJ1ZVxuICAgICAqICBTaG91bGQgaXQgZGVzdHJveSB0aGUgdGV4dHVyZSBvZiB0aGUgY2hpbGQgc3ByaXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5iYXNlVGV4dHVyZT1mYWxzZV0gLSBPbmx5IHVzZWQgZm9yIGNoaWxkIFNwcml0ZXMgaWYgb3B0aW9ucy5jaGlsZHJlbiBpcyBzZXQgdG8gdHJ1ZVxuICAgICAqICBTaG91bGQgaXQgZGVzdHJveSB0aGUgYmFzZSB0ZXh0dXJlIG9mIHRoZSBjaGlsZCBzcHJpdGVcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIEJhdGNoR2VvbWV0cnkucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBkZXN0cm95IGVhY2ggb2YgdGhlIEdyYXBoaWNzRGF0YSBvYmplY3RzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ncmFwaGljc0RhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ3JhcGhpY3NEYXRhW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9pbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMucG9pbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2xvcnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5jb2xvcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnV2cy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnV2cyA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3NEYXRhLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3NEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmF3Q2FsbHMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5kcmF3Q2FsbHMgPSBudWxsO1xuICAgICAgICB0aGlzLmJhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5iYXRjaGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYm91bmRzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgcG9pbnQgaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGdlb21ldHJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlBvaW50fSBwb2ludCAtIFBvaW50IHRvIGNoZWNrIGlmIGl0J3MgY29udGFpbmVkLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9pbnQgaXMgY29udGFpbmVkIHdpdGhpbiBnZW9tZXRyeS5cbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5jb250YWluc1BvaW50ID0gZnVuY3Rpb24gY29udGFpbnNQb2ludCAocG9pbnQpXG4gICAge1xuICAgICAgICB2YXIgZ3JhcGhpY3NEYXRhID0gdGhpcy5ncmFwaGljc0RhdGE7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaGljc0RhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZ3JhcGhpY3NEYXRhW2ldO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGEuZmlsbFN0eWxlLnZpc2libGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG9ubHkgZGVhbCB3aXRoIGZpbGxzLi5cbiAgICAgICAgICAgIGlmIChkYXRhLnNoYXBlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1hdHJpeClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWF0cml4LmFwcGx5SW52ZXJzZShwb2ludCwgdG1wUG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0bXBQb2ludC5jb3B5RnJvbShwb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc2hhcGUuY29udGFpbnModG1wUG9pbnQueCwgdG1wUG9pbnQueSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGl0SG9sZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmhvbGVzKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBkYXRhLmhvbGVzLmxlbmd0aDsgaSQxKyspXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGUgPSBkYXRhLmhvbGVzW2kkMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9sZS5zaGFwZS5jb250YWlucyh0bXBQb2ludC54LCB0bXBQb2ludC55KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdEhvbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhpdEhvbGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgaW50ZXJtZWRpYXRlIGJhdGNoIGRhdGEuIEVpdGhlciBnZXRzIGNvbnZlcnRlZCB0byBkcmF3Q2FsbHNcbiAgICAgKiBvciB1c2VkIHRvIGNvbnZlcnQgdG8gYmF0Y2ggb2JqZWN0cyBkaXJlY3RseSBieSB0aGUgR3JhcGhpY3Mgb2JqZWN0LlxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLnVwZGF0ZUJhdGNoZXMgPSBmdW5jdGlvbiB1cGRhdGVCYXRjaGVzICgpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuZ3JhcGhpY3NEYXRhLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5iYXRjaGFibGUgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVCYXRjaGluZygpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhY2hlRGlydHkgPSB0aGlzLmRpcnR5O1xuXG4gICAgICAgIHZhciB1dnMgPSB0aGlzLnV2cztcbiAgICAgICAgdmFyIGdyYXBoaWNzRGF0YSA9IHRoaXMuZ3JhcGhpY3NEYXRhO1xuXG4gICAgICAgIHZhciBiYXRjaFBhcnQgPSBudWxsO1xuXG4gICAgICAgIHZhciBjdXJyZW50U3R5bGUgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmJhdGNoZXMubGVuZ3RoID4gMClcbiAgICAgICAge1xuICAgICAgICAgICAgYmF0Y2hQYXJ0ID0gdGhpcy5iYXRjaGVzW3RoaXMuYmF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGN1cnJlbnRTdHlsZSA9IGJhdGNoUGFydC5zdHlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnNoYXBlSW5kZXg7IGkgPCBncmFwaGljc0RhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc2hhcGVJbmRleCsrO1xuXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGdyYXBoaWNzRGF0YVtpXTtcbiAgICAgICAgICAgIHZhciBmaWxsU3R5bGUgPSBkYXRhLmZpbGxTdHlsZTtcbiAgICAgICAgICAgIHZhciBsaW5lU3R5bGUgPSBkYXRhLmxpbmVTdHlsZTtcbiAgICAgICAgICAgIHZhciBjb21tYW5kID0gRklMTF9DT01NQU5EU1tkYXRhLnR5cGVdO1xuXG4gICAgICAgICAgICAvLyBidWlsZCBvdXQgdGhlIHNoYXBlcyBwb2ludHMuLlxuICAgICAgICAgICAgY29tbWFuZC5idWlsZChkYXRhKTtcblxuICAgICAgICAgICAgaWYgKGRhdGEubWF0cml4KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtUG9pbnRzKGRhdGEucG9pbnRzLCBkYXRhLm1hdHJpeCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMjsgaisrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IChqID09PSAwKSA/IGZpbGxTdHlsZSA6IGxpbmVTdHlsZTtcblxuICAgICAgICAgICAgICAgIGlmICghc3R5bGUudmlzaWJsZSkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG5leHRUZXh0dXJlID0gc3R5bGUudGV4dHVyZS5iYXNlVGV4dHVyZTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGljZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJJbmRleCA9IHRoaXMucG9pbnRzLmxlbmd0aCAvIDI7XG5cbiAgICAgICAgICAgICAgICBuZXh0VGV4dHVyZS53cmFwTW9kZSA9IFdSQVBfTU9ERVMuUkVQRUFUO1xuXG4gICAgICAgICAgICAgICAgaWYgKGogPT09IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGaWxsKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5lKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBzaXplID0gKHRoaXMucG9pbnRzLmxlbmd0aCAvIDIpIC0gYXR0cmliSW5kZXg7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgIC8vIGNsb3NlIGJhdGNoIGlmIHN0eWxlIGlzIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGlmIChiYXRjaFBhcnQgJiYgIXRoaXMuX2NvbXBhcmVTdHlsZXMoY3VycmVudFN0eWxlLCBzdHlsZSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBiYXRjaFBhcnQuZW5kKGluZGV4LCBhdHRyaWJJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGJhdGNoUGFydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNwYXduIG5ldyBiYXRjaCBpZiBpdHMgZmlyc3QgYmF0Y2ggb3IgcHJldmlvdXMgd2FzIGNsb3NlZFxuICAgICAgICAgICAgICAgIGlmICghYmF0Y2hQYXJ0KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hQYXJ0ID0gQkFUQ0hfUE9PTC5wb3AoKSB8fCBuZXcgQmF0Y2hQYXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJhdGNoUGFydC5iZWdpbihzdHlsZSwgaW5kZXgsIGF0dHJpYkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXRjaGVzLnB1c2goYmF0Y2hQYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0eWxlID0gc3R5bGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRVdnModGhpcy5wb2ludHMsIHV2cywgc3R5bGUudGV4dHVyZSwgYXR0cmliSW5kZXgsIHNpemUsIHN0eWxlLm1hdHJpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmF0Y2hQYXJ0KVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgaW5kZXgkMSA9IHRoaXMuaW5kaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgYXR0cmliID0gdGhpcy5wb2ludHMubGVuZ3RoIC8gMjtcblxuICAgICAgICAgICAgYmF0Y2hQYXJ0LmVuZChpbmRleCQxLCBhdHRyaWIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hlcy5sZW5ndGggPT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBubyB2aXNpYmxlIHN0eWxlcyBpbiBHcmFwaGljc0RhdGFcbiAgICAgICAgICAgIC8vIGl0cyBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgd2FudHMgR3JhcGhpY3MganVzdCBmb3IgdGhlIGJvdW5kc1xuICAgICAgICAgICAgdGhpcy5iYXRjaGFibGUgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluZGljZXNVaW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzKTtcblxuICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyBhIGNvbnN0Li5cbiAgICAgICAgdGhpcy5iYXRjaGFibGUgPSB0aGlzLmlzQmF0Y2hhYmxlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hhYmxlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnBhY2tCYXRjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRHJhd0NhbGxzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWZmaW5pdHkgY2hlY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5GaWxsU3R5bGUgfCBQSVhJLkxpbmVTdHlsZX0gc3R5bGVBXG4gICAgICogQHBhcmFtIHtQSVhJLkZpbGxTdHlsZSB8IFBJWEkuTGluZVN0eWxlfSBzdHlsZUJcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5fY29tcGFyZVN0eWxlcyA9IGZ1bmN0aW9uIF9jb21wYXJlU3R5bGVzIChzdHlsZUEsIHN0eWxlQilcbiAgICB7XG4gICAgICAgIGlmICghc3R5bGVBIHx8ICFzdHlsZUIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHlsZUEudGV4dHVyZS5iYXNlVGV4dHVyZSAhPT0gc3R5bGVCLnRleHR1cmUuYmFzZVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHlsZUEuY29sb3IgKyBzdHlsZUEuYWxwaGEgIT09IHN0eWxlQi5jb2xvciArIHN0eWxlQi5hbHBoYSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEhc3R5bGVBLm5hdGl2ZSAhPT0gISFzdHlsZUIubmF0aXZlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdCBnZW9tZXRyeSBmb3IgYmF0Y2hpbmcgcHJvY2Vzcy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS52YWxpZGF0ZUJhdGNoaW5nID0gZnVuY3Rpb24gdmFsaWRhdGVCYXRjaGluZyAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT09IHRoaXMuY2FjaGVEaXJ0eSB8fCAhdGhpcy5ncmFwaGljc0RhdGEubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuZ3JhcGhpY3NEYXRhLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdyYXBoaWNzRGF0YVtpXTtcbiAgICAgICAgICAgIHZhciBmaWxsID0gZGF0YS5maWxsU3R5bGU7XG4gICAgICAgICAgICB2YXIgbGluZSA9IGRhdGEubGluZVN0eWxlO1xuXG4gICAgICAgICAgICBpZiAoZmlsbCAmJiAhZmlsbC50ZXh0dXJlLmJhc2VUZXh0dXJlLnZhbGlkKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgaWYgKGxpbmUgJiYgIWxpbmUudGV4dHVyZS5iYXNlVGV4dHVyZS52YWxpZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPZmZzZXQgdGhlIGluZGljZXMgc28gdGhhdCBpdCB3b3JrcyB3aXRoIHRoZSBiYXRjaGVyLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLnBhY2tCYXRjaGVzID0gZnVuY3Rpb24gcGFja0JhdGNoZXMgKClcbiAgICB7XG4gICAgICAgIHRoaXMuYmF0Y2hEaXJ0eSsrO1xuICAgICAgICB0aGlzLnV2c0Zsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKTtcblxuICAgICAgICB2YXIgYmF0Y2hlcyA9IHRoaXMuYmF0Y2hlcztcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGJhdGNoZXMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYmF0Y2ggPSBiYXRjaGVzW2ldO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJhdGNoLnNpemU7IGorKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBiYXRjaC5zdGFydCArIGo7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGljZXNVaW50MTZbaW5kZXhdID0gdGhpcy5pbmRpY2VzVWludDE2W2luZGV4XSAtIGJhdGNoLmF0dHJpYlN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhpcyBncmFwaGljcyBnZW9tZXRyeSBjYW4gYmUgYmF0Y2hlZC5cbiAgICAgKiBDdXJyZW50bHkgaXQgbmVlZHMgdG8gYmUgc21hbGwgZW5vdWdoIGFuZCBub3QgY29udGFpbiBhbnkgbmF0aXZlIGxpbmVzLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLmlzQmF0Y2hhYmxlID0gZnVuY3Rpb24gaXNCYXRjaGFibGUgKClcbiAgICB7XG4gICAgICAgIHZhciBiYXRjaGVzID0gdGhpcy5iYXRjaGVzO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmF0Y2hlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKGJhdGNoZXNbaV0uc3R5bGUubmF0aXZlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAodGhpcy5wb2ludHMubGVuZ3RoIDwgR3JhcGhpY3NHZW9tZXRyeS5CQVRDSEFCTEVfU0laRSAqIDIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBpbnRlcm1lZGlhdGUgYmF0Y2hlcyBkYXRhIHRvIGRyYXdDYWxscy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5idWlsZERyYXdDYWxscyA9IGZ1bmN0aW9uIGJ1aWxkRHJhd0NhbGxzICgpXG4gICAge1xuICAgICAgICB2YXIgVElDSyA9ICsrQmFzZVRleHR1cmUuX2dsb2JhbEJhdGNoO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmF3Q2FsbHMubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd0NhbGxzW2ldLnRleHR1cmVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBEUkFXX0NBTExfUE9PTC5wdXNoKHRoaXMuZHJhd0NhbGxzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhd0NhbGxzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdmFyIGNvbG9ycyA9IHRoaXMuY29sb3JzO1xuICAgICAgICB2YXIgdGV4dHVyZUlkcyA9IHRoaXMudGV4dHVyZUlkcztcblxuICAgICAgICB2YXIgY3VycmVudEdyb3VwID0gIERSQVdfQ0FMTF9QT09MLnBvcCgpO1xuXG4gICAgICAgIGlmICghY3VycmVudEdyb3VwKVxuICAgICAgICB7XG4gICAgICAgICAgICBjdXJyZW50R3JvdXAgPSBuZXcgQmF0Y2hEcmF3Q2FsbCgpO1xuICAgICAgICAgICAgY3VycmVudEdyb3VwLnRleHR1cmVzID0gbmV3IEJhdGNoVGV4dHVyZUFycmF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEdyb3VwLnRleHR1cmVzLmNvdW50ID0gMDtcbiAgICAgICAgY3VycmVudEdyb3VwLnN0YXJ0ID0gMDtcbiAgICAgICAgY3VycmVudEdyb3VwLnNpemUgPSAwO1xuICAgICAgICBjdXJyZW50R3JvdXAudHlwZSA9IERSQVdfTU9ERVMuVFJJQU5HTEVTO1xuXG4gICAgICAgIHZhciB0ZXh0dXJlQ291bnQgPSAwO1xuICAgICAgICB2YXIgY3VycmVudFRleHR1cmUgPSBudWxsO1xuICAgICAgICB2YXIgdGV4dHVyZUlkID0gMDtcbiAgICAgICAgdmFyIG5hdGl2ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgZHJhd01vZGUgPSBEUkFXX01PREVTLlRSSUFOR0xFUztcblxuICAgICAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgICAgIHRoaXMuZHJhd0NhbGxzLnB1c2goY3VycmVudEdyb3VwKTtcblxuICAgICAgICAvLyBUT0RPIC0gdGhpcyBjYW4gYmUgc2ltcGxpZmllZFxuICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aGlzLmJhdGNoZXMubGVuZ3RoOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmJhdGNoZXNbaSQxXTtcblxuICAgICAgICAgICAgLy8gVE9ETyBhZGQgc29tZSBmdWxsIG9uIE1BWF9URVhUVVJFIENPREUuLlxuICAgICAgICAgICAgdmFyIE1BWF9URVhUVVJFUyA9IDg7XG5cbiAgICAgICAgICAgIHZhciBzdHlsZSA9IGRhdGEuc3R5bGU7XG5cbiAgICAgICAgICAgIHZhciBuZXh0VGV4dHVyZSA9IHN0eWxlLnRleHR1cmUuYmFzZVRleHR1cmU7XG5cbiAgICAgICAgICAgIGlmIChuYXRpdmUgIT09ICEhc3R5bGUubmF0aXZlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hdGl2ZSA9ICEhc3R5bGUubmF0aXZlO1xuICAgICAgICAgICAgICAgIGRyYXdNb2RlID0gbmF0aXZlID8gRFJBV19NT0RFUy5MSU5FUyA6IERSQVdfTU9ERVMuVFJJQU5HTEVTO1xuXG4gICAgICAgICAgICAgICAgLy8gZm9yY2UgdGhlIGJhdGNoIHRvIGJyZWFrIVxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0dXJlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlQ291bnQgPSBNQVhfVEVYVFVSRVM7XG4gICAgICAgICAgICAgICAgVElDSysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFRleHR1cmUgIT09IG5leHRUZXh0dXJlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0dXJlID0gbmV4dFRleHR1cmU7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV4dFRleHR1cmUuX2JhdGNoRW5hYmxlZCAhPT0gVElDSylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlQ291bnQgPT09IE1BWF9URVhUVVJFUylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgVElDSysrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlQ291bnQgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEdyb3VwLnNpemUgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cCA9IERSQVdfQ0FMTF9QT09MLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudEdyb3VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwID0gbmV3IEJhdGNoRHJhd0NhbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLnRleHR1cmVzID0gbmV3IEJhdGNoVGV4dHVyZUFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0NhbGxzLnB1c2goY3VycmVudEdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLnN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAuc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAudGV4dHVyZXMuY291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwLnR5cGUgPSBkcmF3TW9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gYWRkIHRoaXMgdG8gdGhlIHJlbmRlciBwYXJ0Li5cbiAgICAgICAgICAgICAgICAgICAgbmV4dFRleHR1cmUudG91Y2hlZCA9IDE7Ly8gdG91Y2g7XG4gICAgICAgICAgICAgICAgICAgIG5leHRUZXh0dXJlLl9iYXRjaEVuYWJsZWQgPSBUSUNLO1xuICAgICAgICAgICAgICAgICAgICBuZXh0VGV4dHVyZS5fYmF0Y2hMb2NhdGlvbiA9IHRleHR1cmVDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRleHR1cmUud3JhcE1vZGUgPSAxMDQ5NztcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXAudGV4dHVyZXMuZWxlbWVudHNbY3VycmVudEdyb3VwLnRleHR1cmVzLmNvdW50KytdID0gbmV4dFRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVDb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudEdyb3VwLnNpemUgKz0gZGF0YS5zaXplO1xuICAgICAgICAgICAgaW5kZXggKz0gZGF0YS5zaXplO1xuXG4gICAgICAgICAgICB0ZXh0dXJlSWQgPSBuZXh0VGV4dHVyZS5fYmF0Y2hMb2NhdGlvbjtcblxuICAgICAgICAgICAgdGhpcy5hZGRDb2xvcnMoY29sb3JzLCBzdHlsZS5jb2xvciwgc3R5bGUuYWxwaGEsIGRhdGEuYXR0cmliU2l6ZSk7XG4gICAgICAgICAgICB0aGlzLmFkZFRleHR1cmVJZHModGV4dHVyZUlkcywgdGV4dHVyZUlkLCBkYXRhLmF0dHJpYlNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgQmFzZVRleHR1cmUuX2dsb2JhbEJhdGNoID0gVElDSztcblxuICAgICAgICAvLyB1cGxvYWQuLlxuICAgICAgICAvLyBtZXJnZSBmb3Igbm93IVxuICAgICAgICB0aGlzLnBhY2tBdHRyaWJ1dGVzKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBhY2tzIGF0dHJpYnV0ZXMgdG8gc2luZ2xlIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5wYWNrQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHBhY2tBdHRyaWJ1dGVzICgpXG4gICAge1xuICAgICAgICB2YXIgdmVydHMgPSB0aGlzLnBvaW50cztcbiAgICAgICAgdmFyIHV2cyA9IHRoaXMudXZzO1xuICAgICAgICB2YXIgY29sb3JzID0gdGhpcy5jb2xvcnM7XG4gICAgICAgIHZhciB0ZXh0dXJlSWRzID0gdGhpcy50ZXh0dXJlSWRzO1xuXG4gICAgICAgIC8vIHZlcnRzIGFyZSAyIHBvc2l0aW9ucy4uIHNvIHdlICogYnkgMyBhcyB0aGVyZSBhcmUgNiBwcm9wZXJ0aWVzLi4gdGhlbiA0IGNvcyBpdHMgYnl0ZXNcbiAgICAgICAgdmFyIGdsUG9pbnRzID0gbmV3IEFycmF5QnVmZmVyKHZlcnRzLmxlbmd0aCAqIDMgKiA0KTtcbiAgICAgICAgdmFyIGYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoZ2xQb2ludHMpO1xuICAgICAgICB2YXIgdTMyID0gbmV3IFVpbnQzMkFycmF5KGdsUG9pbnRzKTtcblxuICAgICAgICB2YXIgcCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0cy5sZW5ndGggLyAyOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGYzMltwKytdID0gdmVydHNbaSAqIDJdO1xuICAgICAgICAgICAgZjMyW3ArK10gPSB2ZXJ0c1soaSAqIDIpICsgMV07XG5cbiAgICAgICAgICAgIGYzMltwKytdID0gdXZzW2kgKiAyXTtcbiAgICAgICAgICAgIGYzMltwKytdID0gdXZzWyhpICogMikgKyAxXTtcblxuICAgICAgICAgICAgdTMyW3ArK10gPSBjb2xvcnNbaV07XG5cbiAgICAgICAgICAgIGYzMltwKytdID0gdGV4dHVyZUlkc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2J1ZmZlci51cGRhdGUoZ2xQb2ludHMpO1xuICAgICAgICB0aGlzLl9pbmRleEJ1ZmZlci51cGRhdGUodGhpcy5pbmRpY2VzVWludDE2KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBmaWxsIHBhcnQgb2YgR3JhcGhpY3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuR3JhcGhpY3NEYXRhfSBkYXRhXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLnByb2Nlc3NGaWxsID0gZnVuY3Rpb24gcHJvY2Vzc0ZpbGwgKGRhdGEpXG4gICAge1xuICAgICAgICBpZiAoZGF0YS5ob2xlcy5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0hvbGVzKGRhdGEuaG9sZXMpO1xuXG4gICAgICAgICAgICBidWlsZFBvbHkudHJpYW5ndWxhdGUoZGF0YSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgY29tbWFuZCA9IEZJTExfQ09NTUFORFNbZGF0YS50eXBlXTtcblxuICAgICAgICAgICAgY29tbWFuZC50cmlhbmd1bGF0ZShkYXRhLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGxpbmUgcGFydCBvZiBHcmFwaGljcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5HcmFwaGljc0RhdGF9IGRhdGFcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUucHJvY2Vzc0xpbmUgPSBmdW5jdGlvbiBwcm9jZXNzTGluZSAoZGF0YSlcbiAgICB7XG4gICAgICAgIGJ1aWxkTGluZShkYXRhLCB0aGlzKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuaG9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJ1aWxkTGluZShkYXRhLmhvbGVzW2ldLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBob2xlcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLkdyYXBoaWNzRGF0YVtdfSBob2xlcyAtIEhvbGVzIHRvIHJlbmRlclxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS5wcm9jZXNzSG9sZXMgPSBmdW5jdGlvbiBwcm9jZXNzSG9sZXMgKGhvbGVzKVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGhvbGUgPSBob2xlc1tpXTtcbiAgICAgICAgICAgIHZhciBjb21tYW5kID0gRklMTF9DT01NQU5EU1tob2xlLnR5cGVdO1xuXG4gICAgICAgICAgICBjb21tYW5kLmJ1aWxkKGhvbGUpO1xuXG4gICAgICAgICAgICBpZiAoaG9sZS5tYXRyaXgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Qb2ludHMoaG9sZS5wb2ludHMsIGhvbGUubWF0cml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGxvY2FsIGJvdW5kcyBvZiB0aGUgb2JqZWN0LiBFeHBlbnNpdmUgdG8gdXNlIHBlcmZvcm1hbmNlLXdpc2UuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUuY2FsY3VsYXRlQm91bmRzID0gZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fYm91bmRzO1xuICAgICAgICB2YXIgc2VxdWVuY2VCb3VuZHMgPSB0bXBCb3VuZHM7XG4gICAgICAgIHZhciBjdXJNYXRyaXggPSBNYXRyaXguSURFTlRJVFk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRzLmNsZWFyKCk7XG4gICAgICAgIHNlcXVlbmNlQm91bmRzLmNsZWFyKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdyYXBoaWNzRGF0YS5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdyYXBoaWNzRGF0YVtpXTtcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IGRhdGEuc2hhcGU7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgICAgIHZhciBsaW5lU3R5bGUgPSBkYXRhLmxpbmVTdHlsZTtcbiAgICAgICAgICAgIHZhciBuZXh0TWF0cml4ID0gZGF0YS5tYXRyaXggfHwgTWF0cml4LklERU5USVRZO1xuICAgICAgICAgICAgdmFyIGxpbmVXaWR0aCA9IDAuMDtcblxuICAgICAgICAgICAgaWYgKGxpbmVTdHlsZSAmJiBsaW5lU3R5bGUudmlzaWJsZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgYWxpZ25tZW50ID0gbGluZVN0eWxlLmFsaWdubWVudDtcblxuICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IGxpbmVTdHlsZS53aWR0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBTSEFQRVMuUE9MWSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IGxpbmVXaWR0aCAqICgwLjUgKyBNYXRoLmFicygwLjUgLSBhbGlnbm1lbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVdpZHRoID0gbGluZVdpZHRoICogTWF0aC5tYXgoMCwgYWxpZ25tZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJNYXRyaXggIT09IG5leHRNYXRyaXgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZUJvdW5kcy5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBib3VuZHMuYWRkQm91bmRzTWF0cml4KHNlcXVlbmNlQm91bmRzLCBjdXJNYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUJvdW5kcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJNYXRyaXggPSBuZXh0TWF0cml4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gU0hBUEVTLlJFQ1QgfHwgdHlwZSA9PT0gU0hBUEVTLlJSRUMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VCb3VuZHMuYWRkRnJhbWVQYWQoc2hhcGUueCwgc2hhcGUueSwgc2hhcGUueCArIHNoYXBlLndpZHRoLCBzaGFwZS55ICsgc2hhcGUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBsaW5lV2lkdGgsIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSBTSEFQRVMuQ0lSQylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUJvdW5kcy5hZGRGcmFtZVBhZChzaGFwZS54LCBzaGFwZS55LCBzaGFwZS54LCBzaGFwZS55LFxuICAgICAgICAgICAgICAgICAgICBzaGFwZS5yYWRpdXMgKyBsaW5lV2lkdGgsIHNoYXBlLnJhZGl1cyArIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSBTSEFQRVMuRUxJUClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUJvdW5kcy5hZGRGcmFtZVBhZChzaGFwZS54LCBzaGFwZS55LCBzaGFwZS54LCBzaGFwZS55LFxuICAgICAgICAgICAgICAgICAgICBzaGFwZS53aWR0aCArIGxpbmVXaWR0aCwgc2hhcGUuaGVpZ2h0ICsgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBhZGRpbmcgZGlyZWN0bHkgdG8gdGhlIGJvdW5kc1xuICAgICAgICAgICAgICAgIGJvdW5kcy5hZGRWZXJ0aWNlc01hdHJpeChjdXJNYXRyaXgsIHNoYXBlLnBvaW50cywgMCwgc2hhcGUucG9pbnRzLmxlbmd0aCwgbGluZVdpZHRoLCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXF1ZW5jZUJvdW5kcy5pc0VtcHR5KCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJvdW5kcy5hZGRCb3VuZHNNYXRyaXgoc2VxdWVuY2VCb3VuZHMsIGN1ck1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBib3VuZHMucGFkKHRoaXMuYm91bmRzUGFkZGluZywgdGhpcy5ib3VuZHNQYWRkaW5nKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIHBvaW50cyB1c2luZyBtYXRyaXguXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gcG9pbnRzIC0gUG9pbnRzIHRvIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG1hdHJpeCAtIFRyYW5zZm9ybSBtYXRyaXhcbiAgICAgKi9cbiAgICBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZS50cmFuc2Zvcm1Qb2ludHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludHMgKHBvaW50cywgbWF0cml4KVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgeCA9IHBvaW50c1soaSAqIDIpXTtcbiAgICAgICAgICAgIHZhciB5ID0gcG9pbnRzWyhpICogMikgKyAxXTtcblxuICAgICAgICAgICAgcG9pbnRzWyhpICogMildID0gKG1hdHJpeC5hICogeCkgKyAobWF0cml4LmMgKiB5KSArIG1hdHJpeC50eDtcbiAgICAgICAgICAgIHBvaW50c1soaSAqIDIpICsgMV0gPSAobWF0cml4LmIgKiB4KSArIChtYXRyaXguZCAqIHkpICsgbWF0cml4LnR5O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBjb2xvcnMuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gY29sb3JzIC0gTGlzdCBvZiBjb2xvcnMgdG8gYWRkIHRvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbG9yIC0gQ29sb3IgdG8gYWRkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gQWxwaGEgdG8gdXNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBOdW1iZXIgb2YgY29sb3JzIHRvIGFkZFxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLmFkZENvbG9ycyA9IGZ1bmN0aW9uIGFkZENvbG9ycyAoY29sb3JzLCBjb2xvciwgYWxwaGEsIHNpemUpXG4gICAge1xuICAgICAgICAvLyBUT0RPIHVzZSB0aGUgcHJlbXVsdGlwbHkgYml0cyBJdmFuIGFkZGVkXG4gICAgICAgIHZhciByZ2IgPSAoY29sb3IgPj4gMTYpICsgKGNvbG9yICYgMHhmZjAwKSArICgoY29sb3IgJiAweGZmKSA8PCAxNik7XG5cbiAgICAgICAgdmFyIHJnYmEgPSAgcHJlbXVsdGlwbHlUaW50KHJnYiwgYWxwaGEpO1xuXG4gICAgICAgIHdoaWxlIChzaXplLS0gPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xvcnMucHVzaChyZ2JhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGV4dHVyZSBpZCB0aGF0IHRoZSBzaGFkZXIvZnJhZ21lbnQgd2FudHMgdG8gdXNlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHRleHR1cmVJZHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLmFkZFRleHR1cmVJZHMgPSBmdW5jdGlvbiBhZGRUZXh0dXJlSWRzICh0ZXh0dXJlSWRzLCBpZCwgc2l6ZSlcbiAgICB7XG4gICAgICAgIHdoaWxlIChzaXplLS0gPiAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0dXJlSWRzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgVVZzIGZvciBhIHNoYXBlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHZlcnRzIC0gVmVydGljZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSB1dnMgLSBVVnNcbiAgICAgKiBAcGFyYW0ge1BJWEkuVGV4dHVyZX0gdGV4dHVyZSAtIFJlZmVyZW5jZSB0byBUZXh0dXJlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggYnVmZmVyIHN0YXJ0IGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIHNpemUvbGVuZ3RoIGZvciBpbmRleCBidWZmZXIuXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gW21hdHJpeF0gLSBPcHRpb25hbCB0cmFuc2Zvcm0gZm9yIGFsbCBwb2ludHMuXG4gICAgICovXG4gICAgR3JhcGhpY3NHZW9tZXRyeS5wcm90b3R5cGUuYWRkVXZzID0gZnVuY3Rpb24gYWRkVXZzICh2ZXJ0cywgdXZzLCB0ZXh0dXJlLCBzdGFydCwgc2l6ZSwgbWF0cml4KVxuICAgIHtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIHV2c1N0YXJ0ID0gdXZzLmxlbmd0aDtcbiAgICAgICAgdmFyIGZyYW1lID0gdGV4dHVyZS5mcmFtZTtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgeCA9IHZlcnRzWyhzdGFydCArIGluZGV4KSAqIDJdO1xuICAgICAgICAgICAgdmFyIHkgPSB2ZXJ0c1soKHN0YXJ0ICsgaW5kZXgpICogMikgKyAxXTtcblxuICAgICAgICAgICAgaWYgKG1hdHJpeClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgbnggPSAobWF0cml4LmEgKiB4KSArIChtYXRyaXguYyAqIHkpICsgbWF0cml4LnR4O1xuXG4gICAgICAgICAgICAgICAgeSA9IChtYXRyaXguYiAqIHgpICsgKG1hdHJpeC5kICogeSkgKyBtYXRyaXgudHk7XG4gICAgICAgICAgICAgICAgeCA9IG54O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICB1dnMucHVzaCh4IC8gZnJhbWUud2lkdGgsIHkgLyBmcmFtZS5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJhc2VUZXh0dXJlID0gdGV4dHVyZS5iYXNlVGV4dHVyZTtcblxuICAgICAgICBpZiAoZnJhbWUud2lkdGggPCBiYXNlVGV4dHVyZS53aWR0aFxuICAgICAgICAgICAgfHwgZnJhbWUuaGVpZ2h0IDwgYmFzZVRleHR1cmUuaGVpZ2h0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmFkanVzdFV2cyh1dnMsIHRleHR1cmUsIHV2c1N0YXJ0LCBzaXplKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNb2RpZnkgdXZzIGFycmF5IGFjY29yZGluZyB0byBwb3NpdGlvbiBvZiB0ZXh0dXJlIHJlZ2lvblxuICAgICAqIERvZXMgbm90IHdvcmsgd2l0aCByb3RhdGVkIG9yIHRyaW1tZWQgdGV4dHVyZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHV2cyBhcnJheVxuICAgICAqIEBwYXJhbSB7UElYSS5UZXh0dXJlfSB0ZXh0dXJlIHJlZ2lvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBzdGFydGluZyBpbmRleCBmb3IgdXZzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgaG93IG1hbnkgcG9pbnRzIHRvIGFkanVzdFxuICAgICAqL1xuICAgIEdyYXBoaWNzR2VvbWV0cnkucHJvdG90eXBlLmFkanVzdFV2cyA9IGZ1bmN0aW9uIGFkanVzdFV2cyAodXZzLCB0ZXh0dXJlLCBzdGFydCwgc2l6ZSlcbiAgICB7XG4gICAgICAgIHZhciBiYXNlVGV4dHVyZSA9IHRleHR1cmUuYmFzZVRleHR1cmU7XG4gICAgICAgIHZhciBlcHMgPSAxZS02O1xuICAgICAgICB2YXIgZmluaXNoID0gc3RhcnQgKyAoc2l6ZSAqIDIpO1xuICAgICAgICB2YXIgZnJhbWUgPSB0ZXh0dXJlLmZyYW1lO1xuICAgICAgICB2YXIgc2NhbGVYID0gZnJhbWUud2lkdGggLyBiYXNlVGV4dHVyZS53aWR0aDtcbiAgICAgICAgdmFyIHNjYWxlWSA9IGZyYW1lLmhlaWdodCAvIGJhc2VUZXh0dXJlLmhlaWdodDtcbiAgICAgICAgdmFyIG9mZnNldFggPSBmcmFtZS54IC8gZnJhbWUud2lkdGg7XG4gICAgICAgIHZhciBvZmZzZXRZID0gZnJhbWUueSAvIGZyYW1lLmhlaWdodDtcbiAgICAgICAgdmFyIG1pblggPSBNYXRoLmZsb29yKHV2c1tzdGFydF0gKyBlcHMpO1xuICAgICAgICB2YXIgbWluWSA9IE1hdGguZmxvb3IodXZzW3N0YXJ0ICsgMV0gKyBlcHMpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydCArIDI7IGkgPCBmaW5pc2g7IGkgKz0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIE1hdGguZmxvb3IodXZzW2ldICsgZXBzKSk7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgTWF0aC5mbG9vcih1dnNbaSArIDFdICsgZXBzKSk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0WCAtPSBtaW5YO1xuICAgICAgICBvZmZzZXRZIC09IG1pblk7XG4gICAgICAgIGZvciAodmFyIGkkMSA9IHN0YXJ0OyBpJDEgPCBmaW5pc2g7IGkkMSArPSAyKVxuICAgICAgICB7XG4gICAgICAgICAgICB1dnNbaSQxXSA9ICh1dnNbaSQxXSArIG9mZnNldFgpICogc2NhbGVYO1xuICAgICAgICAgICAgdXZzW2kkMSArIDFdID0gKHV2c1tpJDEgKyAxXSArIG9mZnNldFkpICogc2NhbGVZO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBHcmFwaGljc0dlb21ldHJ5LnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gR3JhcGhpY3NHZW9tZXRyeTtcbn0oQmF0Y2hHZW9tZXRyeSkpO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgdG8gY29uc2lkZXIgYW4gb2JqZWN0IFwiYmF0Y2hhYmxlXCIsXG4gKiBhYmxlIHRvIGJlIGJhdGNoZWQgYnkgdGhlIHJlbmRlcmVyJ3MgYmF0Y2ggc3lzdGVtLlxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLkdyYXBoaWNzR2VvbWV0cnlcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXIge251bWJlcn0gQkFUQ0hBQkxFX1NJWkVcbiAqIEBkZWZhdWx0IDEwMFxuICovXG5HcmFwaGljc0dlb21ldHJ5LkJBVENIQUJMRV9TSVpFID0gMTAwO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxpbmUgc3R5bGUgZm9yIEdyYXBoaWNzLlxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5GaWxsU3R5bGVcbiAqL1xudmFyIExpbmVTdHlsZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEZpbGxTdHlsZSkge1xuICAgIGZ1bmN0aW9uIExpbmVTdHlsZSAoKSB7XG4gICAgICAgIEZpbGxTdHlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmICggRmlsbFN0eWxlICkgTGluZVN0eWxlLl9fcHJvdG9fXyA9IEZpbGxTdHlsZTtcbiAgICBMaW5lU3R5bGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRmlsbFN0eWxlICYmIEZpbGxTdHlsZS5wcm90b3R5cGUgKTtcbiAgICBMaW5lU3R5bGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZVN0eWxlO1xuXG4gICAgTGluZVN0eWxlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpXG4gICAge1xuICAgICAgICB2YXIgb2JqID0gbmV3IExpbmVTdHlsZSgpO1xuXG4gICAgICAgIG9iai5jb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICAgIG9iai5hbHBoYSA9IHRoaXMuYWxwaGE7XG4gICAgICAgIG9iai50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICBvYmoubWF0cml4ID0gdGhpcy5tYXRyaXg7XG4gICAgICAgIG9iai52aXNpYmxlID0gdGhpcy52aXNpYmxlO1xuICAgICAgICBvYmoud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICBvYmouYWxpZ25tZW50ID0gdGhpcy5hbGlnbm1lbnQ7XG4gICAgICAgIG9iai5uYXRpdmUgPSB0aGlzLm5hdGl2ZTtcblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIGxpbmUgc3R5bGUgdG8gZGVmYXVsdC5cbiAgICAgKi9cbiAgICBMaW5lU3R5bGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbiAgICB7XG4gICAgICAgIEZpbGxTdHlsZS5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IGxpbmUgc3R5bGUgY29sb3JcbiAgICAgICAgdGhpcy5jb2xvciA9IDB4MDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHdpZHRoICh0aGlja25lc3MpIG9mIGFueSBsaW5lcyBkcmF3bi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFsaWdubWVudCBvZiBhbnkgbGluZXMgZHJhd24gKDAuNSA9IG1pZGRsZSwgMSA9IG91dGVyLCAwID0gaW5uZXIpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDAuNVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hbGlnbm1lbnQgPSAwLjU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRydWUgdGhlIGxpbmVzIHdpbGwgYmUgZHJhdyB1c2luZyBMSU5FUyBpbnN0ZWFkIG9mIFRSSUFOR0xFX1NUUklQXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gTGluZVN0eWxlO1xufShGaWxsU3R5bGUpKTtcblxudmFyIHRlbXAgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xuXG4vLyBhIGRlZmF1bHQgc2hhZGVycyBtYXAgdXNlZCBieSBncmFwaGljcy4uXG52YXIgREVGQVVMVF9TSEFERVJTID0ge307XG5cbi8qKlxuICogVGhlIEdyYXBoaWNzIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdXNlZCB0byBkcmF3IHByaW1pdGl2ZSBzaGFwZXMgc3VjaCBhcyBsaW5lcywgY2lyY2xlcyBhbmRcbiAqIHJlY3RhbmdsZXMgdG8gdGhlIGRpc3BsYXksIGFuZCB0byBjb2xvciBhbmQgZmlsbCB0aGVtLlxuICpcbiAqIE5vdGUgdGhhdCBiZWNhdXNlIEdyYXBoaWNzIGNhbiBzaGFyZSBhIEdyYXBoaWNzR2VvbWV0cnkgd2l0aCBvdGhlciBpbnN0YW5jZXMsXG4gKiBpdCBpcyBuZWNlc3NhcnkgdG8gY2FsbCBgZGVzdHJveSgpYCB0byBwcm9wZXJseSBkZXJlZmVyZW5jZSB0aGUgdW5kZXJseWluZ1xuICogR3JhcGhpY3NHZW9tZXRyeSBhbmQgYXZvaWQgYSBtZW1vcnkgbGVhay4gQWx0ZXJuYXRpdmVseSwga2VlcCB1c2luZyB0aGUgc2FtZVxuICogR3JhcGhpY3MgaW5zdGFuY2UgYW5kIGNhbGwgYGNsZWFyKClgIGJldHdlZW4gcmVkcmF3cy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuQ29udGFpbmVyXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgR3JhcGhpY3MgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChDb250YWluZXIpIHtcbiAgICBmdW5jdGlvbiBHcmFwaGljcyhnZW9tZXRyeSlcbiAgICB7XG4gICAgICAgIGlmICggZ2VvbWV0cnkgPT09IHZvaWQgMCApIGdlb21ldHJ5ID0gbnVsbDtcblxuICAgICAgICBDb250YWluZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluY2x1ZGVzIHZlcnRleCBwb3NpdGlvbnMsIGZhY2UgaW5kaWNlcywgbm9ybWFscywgY29sb3JzLCBVVnMsIGFuZFxuICAgICAgICAgKiBjdXN0b20gYXR0cmlidXRlcyB3aXRoaW4gYnVmZmVycywgcmVkdWNpbmcgdGhlIGNvc3Qgb2YgcGFzc2luZyBhbGxcbiAgICAgICAgICogdGhpcyBkYXRhIHRvIHRoZSBHUFUuIENhbiBiZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBNZXNoIG9yIEdyYXBoaWNzIG9iamVjdHMuXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuR3JhcGhpY3NHZW9tZXRyeX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgfHwgbmV3IEdyYXBoaWNzR2VvbWV0cnkoKTtcblxuICAgICAgICB0aGlzLmdlb21ldHJ5LnJlZkNvdW50Kys7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlcHJlc2VudHMgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycyB0aGF0IHByb2Nlc3NlcyB0aGUgZ2VvbWV0cnkgYW5kIHJ1bnMgb24gdGhlIEdQVS5cbiAgICAgICAgICogQ2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIEdyYXBoaWNzIG9iamVjdHMuXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU2hhZGVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaGFkZXIgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXByZXNlbnRzIHRoZSBXZWJHTCBzdGF0ZSB0aGUgR3JhcGhpY3MgcmVxdWlyZWQgdG8gcmVuZGVyLCBleGNsdWRlcyBzaGFkZXIgYW5kIGdlb21ldHJ5LiBFLmcuLFxuICAgICAgICAgKiBibGVuZCBtb2RlLCBjdWxsaW5nLCBkZXB0aCB0ZXN0aW5nLCBkaXJlY3Rpb24gb2YgcmVuZGVyaW5nIHRyaWFuZ2xlcywgYmFja2ZhY2UsIGV0Yy5cbiAgICAgICAgICogQG1lbWJlciB7UElYSS5TdGF0ZX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5mb3IyZCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGZpbGwgc3R5bGVcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5GaWxsU3R5bGV9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2ZpbGxTdHlsZSA9IG5ldyBGaWxsU3R5bGUoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudCBsaW5lIHN0eWxlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuTGluZVN0eWxlfVxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9saW5lU3R5bGUgPSBuZXcgTGluZVN0eWxlKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgc2hhcGUgdHJhbnNmb3JtIG1hdHJpeC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5NYXRyaXh9XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX21hdHJpeCA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgaG9sZSBtb2RlIGlzIGVuYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2hvbGVNb2RlID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgcGF0aFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlBvbHlnb259XG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGNhY2hlQXNCaXRtYXAgaXMgc2V0IHRvIHRydWUgdGhlIGdyYXBoaWNzIG9iamVjdCB3aWxsIGJlIHJlbmRlcmVkIGFzIGlmIGl0IHdhcyBhIHNwcml0ZS5cbiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91ciBncmFwaGljcyBlbGVtZW50IGRvZXMgbm90IGNoYW5nZSBvZnRlbiwgYXMgaXQgd2lsbCBzcGVlZCB1cCB0aGUgcmVuZGVyaW5nXG4gICAgICAgICAqIG9mIHRoZSBvYmplY3QgaW4gZXhjaGFuZ2UgZm9yIHRha2luZyB1cCB0ZXh0dXJlIG1lbW9yeS4gSXQgaXMgYWxzbyB1c2VmdWwgaWYgeW91IG5lZWQgdGhlIGdyYXBoaWNzXG4gICAgICAgICAqIG9iamVjdCB0byBiZSBhbnRpLWFsaWFzZWQsIGJlY2F1c2UgaXQgd2lsbCBiZSByZW5kZXJlZCB1c2luZyBjYW52YXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGlmXG4gICAgICAgICAqIHlvdSBhcmUgY29uc3RhbnRseSByZWRyYXdpbmcgdGhlIGdyYXBoaWNzIGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIGNhY2hlQXNCaXRtYXBcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQG1lbWJlcm9mIFBJWEkuR3JhcGhpY3MjXG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbGxlY3Rpb25zIG9mIGJhdGNoZXMhIFRoZXNlIGNhbiBiZSBkcmF3biBieSB0aGUgcmVuZGVyZXIgYmF0Y2ggc3lzdGVtLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdFtdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXRjaGVzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBkaXJ0eSBmb3IgbGltaXRpbmcgY2FsY3VsYXRpbmcgdGludHMgZm9yIGJhdGNoZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAtMVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXRjaFRpbnQgPSAtMTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29weSBvZiB0aGUgb2JqZWN0IHZlcnRleCBkYXRhLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICAqIEBtZW1iZXIge0Zsb2F0MzJBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmVydGV4RGF0YSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtSUQgPSAtMTtcbiAgICAgICAgdGhpcy5iYXRjaERpcnR5ID0gLTE7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbmRlcmVyIHBsdWdpbiBmb3IgYmF0Y2hpbmdcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnYmF0Y2gnXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsdWdpbk5hbWUgPSAnYmF0Y2gnO1xuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0XG4gICAgICAgIHRoaXMudGludCA9IDB4RkZGRkZGO1xuICAgICAgICB0aGlzLmJsZW5kTW9kZSA9IEJMRU5EX01PREVTLk5PUk1BTDtcbiAgICB9XG5cbiAgICBpZiAoIENvbnRhaW5lciApIEdyYXBoaWNzLl9fcHJvdG9fXyA9IENvbnRhaW5lcjtcbiAgICBHcmFwaGljcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb250YWluZXIgJiYgQ29udGFpbmVyLnByb3RvdHlwZSApO1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyYXBoaWNzO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgYmxlbmRNb2RlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRpbnQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZmlsbDogeyBjb25maWd1cmFibGU6IHRydWUgfSxsaW5lOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEdyYXBoaWNzIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGlzIG9uZS5cbiAgICAgKiBOb3RlIHRoYXQgdGhlIG9ubHkgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBhcmUgY2xvbmVkLCBub3QgaXRzIHRyYW5zZm9ybSAocG9zaXRpb24sc2NhbGUsZXRjKVxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gQSBjbG9uZSBvZiB0aGUgZ3JhcGhpY3Mgb2JqZWN0XG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZmluaXNoUG9seSgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgR3JhcGhpY3ModGhpcy5nZW9tZXRyeSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBibGVuZCBtb2RlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGdyYXBoaWMgc2hhcGUuIEFwcGx5IGEgdmFsdWUgb2ZcbiAgICAgKiBgUElYSS5CTEVORF9NT0RFUy5OT1JNQUxgIHRvIHJlc2V0IHRoZSBibGVuZCBtb2RlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMO1xuICAgICAqIEBzZWUgUElYSS5CTEVORF9NT0RFU1xuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibGVuZE1vZGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5ibGVuZE1vZGUgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmJsZW5kTW9kZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYmxlbmRNb2RlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGludCBhcHBsaWVkIHRvIHRoZSBncmFwaGljIHNoYXBlLiBUaGlzIGlzIGEgaGV4IHZhbHVlLiBBIHZhbHVlIG9mXG4gICAgICogMHhGRkZGRkYgd2lsbCByZW1vdmUgYW55IHRpbnQgZWZmZWN0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDB4RkZGRkZGXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW50O1xuICAgIH07XG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fdGludCA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBmaWxsIHN0eWxlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5GaWxsU3R5bGV9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmZpbGwuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxsU3R5bGU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGxpbmUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkxpbmVTdHlsZX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubGluZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVTdHlsZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBsaW5lIHN0eWxlIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gR3JhcGhpY3MgbWV0aG9kcyBzdWNoIGFzIHRoZSBsaW5lVG8oKVxuICAgICAqIG1ldGhvZCBvciB0aGUgZHJhd0NpcmNsZSgpIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBtZXRob2QgUElYSS5HcmFwaGljcyNsaW5lU3R5bGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTBdIC0gd2lkdGggb2YgdGhlIGxpbmUgdG8gZHJhdywgd2lsbCB1cGRhdGUgdGhlIG9iamVjdHMgc3RvcmVkIHN0eWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb2xvcj0weDBdIC0gY29sb3Igb2YgdGhlIGxpbmUgdG8gZHJhdywgd2lsbCB1cGRhdGUgdGhlIG9iamVjdHMgc3RvcmVkIHN0eWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYT0xXSAtIGFscGhhIG9mIHRoZSBsaW5lIHRvIGRyYXcsIHdpbGwgdXBkYXRlIHRoZSBvYmplY3RzIHN0b3JlZCBzdHlsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYWxpZ25tZW50PTAuNV0gLSBhbGlnbm1lbnQgb2YgdGhlIGxpbmUgdG8gZHJhdywgKDAgPSBpbm5lciwgMC41ID0gbWlkZGxlLCAxID0gb3V0dGVyKVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25hdGl2ZT1mYWxzZV0gLSBJZiB0cnVlIHRoZSBsaW5lcyB3aWxsIGJlIGRyYXcgdXNpbmcgTElORVMgaW5zdGVhZCBvZiBUUklBTkdMRV9TVFJJUFxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGxpbmUgc3R5bGUgdXNlZCBmb3Igc3Vic2VxdWVudCBjYWxscyB0byBHcmFwaGljcyBtZXRob2RzIHN1Y2ggYXMgdGhlIGxpbmVUbygpXG4gICAgICogbWV0aG9kIG9yIHRoZSBkcmF3Q2lyY2xlKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIExpbmUgc3R5bGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy53aWR0aD0wXSAtIHdpZHRoIG9mIHRoZSBsaW5lIHRvIGRyYXcsIHdpbGwgdXBkYXRlIHRoZSBvYmplY3RzIHN0b3JlZCBzdHlsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb2xvcj0weDBdIC0gY29sb3Igb2YgdGhlIGxpbmUgdG8gZHJhdywgd2lsbCB1cGRhdGUgdGhlIG9iamVjdHMgc3RvcmVkIHN0eWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmFscGhhPTFdIC0gYWxwaGEgb2YgdGhlIGxpbmUgdG8gZHJhdywgd2lsbCB1cGRhdGUgdGhlIG9iamVjdHMgc3RvcmVkIHN0eWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmFsaWdubWVudD0wLjVdIC0gYWxpZ25tZW50IG9mIHRoZSBsaW5lIHRvIGRyYXcsICgwID0gaW5uZXIsIDAuNSA9IG1pZGRsZSwgMSA9IG91dHRlcilcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5hdGl2ZT1mYWxzZV0gLSBJZiB0cnVlIHRoZSBsaW5lcyB3aWxsIGJlIGRyYXcgdXNpbmcgTElORVMgaW5zdGVhZCBvZiBUUklBTkdMRV9TVFJJUFxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUubGluZVN0eWxlID0gZnVuY3Rpb24gbGluZVN0eWxlIChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgLy8gU3VwcG9ydCBub24tb2JqZWN0IHBhcmFtczogKHdpZHRoLCBjb2xvciwgYWxwaGEsIGFsaWdubWVudCwgbmF0aXZlKVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogYXJnc1swXSB8fCAwLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBhcmdzWzFdIHx8IDB4MCxcbiAgICAgICAgICAgICAgICBhbHBoYTogYXJnc1syXSAhPT0gdW5kZWZpbmVkID8gYXJnc1syXSA6IDEsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBhcmdzWzNdICE9PSB1bmRlZmluZWQgPyBhcmdzWzNdIDogMC41LFxuICAgICAgICAgICAgICAgIG5hdGl2ZTogISFhcmdzWzRdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVUZXh0dXJlU3R5bGUob3B0aW9ucyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExpa2UgbGluZSBzdHlsZSBidXQgc3VwcG9ydCB0ZXh0dXJlIGZvciBsaW5lIGZpbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gQ29sbGVjdGlvbiBvZiBvcHRpb25zIGZvciBzZXR0aW5nIGxpbmUgc3R5bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoPTBdIC0gd2lkdGggb2YgdGhlIGxpbmUgdG8gZHJhdywgd2lsbCB1cGRhdGUgdGhlIG9iamVjdHMgc3RvcmVkIHN0eWxlXG4gICAgICogQHBhcmFtIHtQSVhJLlRleHR1cmV9IFtvcHRpb25zLnRleHR1cmU9UElYSS5UZXh0dXJlLldISVRFXSAtIFRleHR1cmUgdG8gdXNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNvbG9yPTB4MF0gLSBjb2xvciBvZiB0aGUgbGluZSB0byBkcmF3LCB3aWxsIHVwZGF0ZSB0aGUgb2JqZWN0cyBzdG9yZWQgc3R5bGUuXG4gICAgICogIERlZmF1bHQgMHhGRkZGRkYgaWYgdGV4dHVyZSBwcmVzZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbHBoYT0xXSAtIGFscGhhIG9mIHRoZSBsaW5lIHRvIGRyYXcsIHdpbGwgdXBkYXRlIHRoZSBvYmplY3RzIHN0b3JlZCBzdHlsZVxuICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IFtvcHRpb25zLm1hdHJpeD1udWxsXSBUZXh0dXJlIG1hdHJpeCB0byB0cmFuc2Zvcm0gdGV4dHVyZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbGlnbm1lbnQ9MC41XSAtIGFsaWdubWVudCBvZiB0aGUgbGluZSB0byBkcmF3LCAoMCA9IGlubmVyLCAwLjUgPSBtaWRkbGUsIDEgPSBvdXR0ZXIpXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5uYXRpdmU9ZmFsc2VdIC0gSWYgdHJ1ZSB0aGUgbGluZXMgd2lsbCBiZSBkcmF3IHVzaW5nIExJTkVTIGluc3RlYWQgb2YgVFJJQU5HTEVfU1RSSVBcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBUaGlzIEdyYXBoaWNzIG9iamVjdC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmxpbmVUZXh0dXJlU3R5bGUgPSBmdW5jdGlvbiBsaW5lVGV4dHVyZVN0eWxlIChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHBhcmFtczogKHdpZHRoLCB0ZXh0dXJlLFxuICAgICAgICAvLyBjb2xvciwgYWxwaGEsIG1hdHJpeCwgYWxpZ25tZW50LCBuYXRpdmUpXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKCd2NS4yLjAnLCAnUGxlYXNlIHVzZSBvYmplY3QtYmFzZWQgb3B0aW9ucyBmb3IgR3JhcGhpY3MjbGluZVRleHR1cmVTdHlsZScpO1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICB2YXIgdGV4dHVyZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgIHZhciBhbHBoYSA9IGFyZ3VtZW50c1szXTtcbiAgICAgICAgICAgIHZhciBtYXRyaXggPSBhcmd1bWVudHNbNF07XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50ID0gYXJndW1lbnRzWzVdO1xuICAgICAgICAgICAgdmFyIG5hdGl2ZSA9IGFyZ3VtZW50c1s2XTtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IHsgd2lkdGg6IHdpZHRoLCB0ZXh0dXJlOiB0ZXh0dXJlLCBjb2xvcjogY29sb3IsIGFscGhhOiBhbHBoYSwgbWF0cml4OiBtYXRyaXgsIGFsaWdubWVudDogYWxpZ25tZW50LCBuYXRpdmU6IG5hdGl2ZSB9O1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIGtleXNcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gb3B0aW9uc1trZXldID09PSB1bmRlZmluZWQgJiYgZGVsZXRlIG9wdGlvbnNba2V5XTsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBkZWZhdWx0c1xuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIHRleHR1cmU6IFRleHR1cmUuV0hJVEUsXG4gICAgICAgICAgICBjb2xvcjogKG9wdGlvbnMgJiYgb3B0aW9ucy50ZXh0dXJlKSA/IDB4RkZGRkZGIDogMHgwLFxuICAgICAgICAgICAgYWxwaGE6IDEsXG4gICAgICAgICAgICBtYXRyaXg6IG51bGwsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IDAuNSxcbiAgICAgICAgICAgIG5hdGl2ZTogZmFsc2UsXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9seSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZpc2libGUgPSBvcHRpb25zLndpZHRoID4gMCAmJiBvcHRpb25zLmFscGhhID4gMDtcblxuICAgICAgICBpZiAoIXZpc2libGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2xpbmVTdHlsZS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF0cml4KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWF0cml4ID0gb3B0aW9ucy5tYXRyaXguY2xvbmUoKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hdHJpeC5pbnZlcnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9saW5lU3R5bGUsIHsgdmlzaWJsZTogdmlzaWJsZSB9LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBhIHBvbHlnb24gb2JqZWN0IGludGVybmFsbHlcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLnN0YXJ0UG9seSA9IGZ1bmN0aW9uIHN0YXJ0UG9seSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmN1cnJlbnRQYXRoLnBvaW50cztcbiAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLmN1cnJlbnRQYXRoLnBvaW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChsZW4gPiAyKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NoYXBlKHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBuZXcgUG9seWdvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGguY2xvc2VTdHJva2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnBvaW50cy5wdXNoKHBvaW50c1tsZW4gLSAyXSwgcG9pbnRzW2xlbiAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBuZXcgUG9seWdvbigpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aC5jbG9zZVN0cm9rZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbmlzaCB0aGUgcG9seWdvbiBvYmplY3QuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5maW5pc2hQb2x5ID0gZnVuY3Rpb24gZmluaXNoUG9seSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLnBvaW50cy5sZW5ndGggPiAyKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NoYXBlKHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGgucG9pbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiB0byB4LCB5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSB0aGUgWCBjb29yZGluYXRlIHRvIG1vdmUgdG9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIHRoZSBZIGNvb3JkaW5hdGUgdG8gbW92ZSB0b1xuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUubW92ZVRvID0gZnVuY3Rpb24gbW92ZVRvICh4LCB5KVxuICAgIHtcbiAgICAgICAgdGhpcy5zdGFydFBvbHkoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGF0aC5wb2ludHNbMF0gPSB4O1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnBvaW50c1sxXSA9IHk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERyYXdzIGEgbGluZSB1c2luZyB0aGUgY3VycmVudCBsaW5lIHN0eWxlIGZyb20gdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiB0byAoeCwgeSk7XG4gICAgICogVGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiBpcyB0aGVuIHNldCB0byAoeCwgeSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIHRoZSBYIGNvb3JkaW5hdGUgdG8gZHJhdyB0b1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gdGhlIFkgY29vcmRpbmF0ZSB0byBkcmF3IHRvXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5saW5lVG8gPSBmdW5jdGlvbiBsaW5lVG8gKHgsIHkpXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFBhdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubW92ZVRvKDAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXMuLlxuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5jdXJyZW50UGF0aC5wb2ludHM7XG4gICAgICAgIHZhciBmcm9tWCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl07XG4gICAgICAgIHZhciBmcm9tWSA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgaWYgKGZyb21YICE9PSB4IHx8IGZyb21ZICE9PSB5KVxuICAgICAgICB7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh4LCB5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBjdXJ2ZVxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXVxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5faW5pdEN1cnZlID0gZnVuY3Rpb24gX2luaXRDdXJ2ZSAoeCwgeSlcbiAgICB7XG4gICAgICAgIGlmICggeCA9PT0gdm9pZCAwICkgeCA9IDA7XG4gICAgICAgIGlmICggeSA9PT0gdm9pZCAwICkgeSA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLnBvaW50cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aC5wb2ludHMgPSBbeCwgeV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm1vdmVUbyh4LCB5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHBvaW50cyBmb3IgYSBxdWFkcmF0aWMgYmV6aWVyIGN1cnZlIGFuZCB0aGVuIGRyYXdzIGl0LlxuICAgICAqIEJhc2VkIG9uOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODUwOTcvaG93LWRvLWktaW1wbGVtZW50LWEtYmV6aWVyLWN1cnZlLWluLWNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjcFggLSBDb250cm9sIHBvaW50IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3BZIC0gQ29udHJvbCBwb2ludCB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvWCAtIERlc3RpbmF0aW9uIHBvaW50IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG9ZIC0gRGVzdGluYXRpb24gcG9pbnQgeVxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUucXVhZHJhdGljQ3VydmVUbyA9IGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8gKGNwWCwgY3BZLCB0b1gsIHRvWSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2luaXRDdXJ2ZSgpO1xuXG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmN1cnJlbnRQYXRoLnBvaW50cztcblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5tb3ZlVG8oMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBRdWFkcmF0aWNVdGlscy5jdXJ2ZVRvKGNwWCwgY3BZLCB0b1gsIHRvWSwgcG9pbnRzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBwb2ludHMgZm9yIGEgYmV6aWVyIGN1cnZlIGFuZCB0aGVuIGRyYXdzIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNwWCAtIENvbnRyb2wgcG9pbnQgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjcFkgLSBDb250cm9sIHBvaW50IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3BYMiAtIFNlY29uZCBDb250cm9sIHBvaW50IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3BZMiAtIFNlY29uZCBDb250cm9sIHBvaW50IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG9YIC0gRGVzdGluYXRpb24gcG9pbnQgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b1kgLSBEZXN0aW5hdGlvbiBwb2ludCB5XG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvID0gZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyAoY3BYLCBjcFksIGNwWDIsIGNwWTIsIHRvWCwgdG9ZKVxuICAgIHtcbiAgICAgICAgdGhpcy5faW5pdEN1cnZlKCk7XG5cbiAgICAgICAgQmV6aWVyVXRpbHMuY3VydmVUbyhjcFgsIGNwWSwgY3BYMiwgY3BZMiwgdG9YLCB0b1ksIHRoaXMuY3VycmVudFBhdGgucG9pbnRzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFyY1RvKCkgbWV0aG9kIGNyZWF0ZXMgYW4gYXJjL2N1cnZlIGJldHdlZW4gdHdvIHRhbmdlbnRzIG9uIHRoZSBjYW52YXMuXG4gICAgICpcbiAgICAgKiBcImJvcnJvd2VkXCIgZnJvbSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Z4Y2FudmFzLyAtIHRoYW5rcyBnb29nbGUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEgLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCB0YW5nZW50IHBvaW50IG9mIHRoZSBhcmNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTEgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCB0YW5nZW50IHBvaW50IG9mIHRoZSBhcmNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIgLSBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBlbmQgb2YgdGhlIGFyY1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MiAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBvZiB0aGUgYXJjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGFyY1xuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuYXJjVG8gPSBmdW5jdGlvbiBhcmNUbyAoeDEsIHkxLCB4MiwgeTIsIHJhZGl1cylcbiAgICB7XG4gICAgICAgIHRoaXMuX2luaXRDdXJ2ZSh4MSwgeTEpO1xuXG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmN1cnJlbnRQYXRoLnBvaW50cztcblxuICAgICAgICB2YXIgcmVzdWx0ID0gQXJjVXRpbHMuY3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgcmFkaXVzLCBwb2ludHMpO1xuXG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjeCA9IHJlc3VsdC5jeDtcbiAgICAgICAgICAgIHZhciBjeSA9IHJlc3VsdC5jeTtcbiAgICAgICAgICAgIHZhciByYWRpdXMkMSA9IHJlc3VsdC5yYWRpdXM7XG4gICAgICAgICAgICB2YXIgc3RhcnRBbmdsZSA9IHJlc3VsdC5zdGFydEFuZ2xlO1xuICAgICAgICAgICAgdmFyIGVuZEFuZ2xlID0gcmVzdWx0LmVuZEFuZ2xlO1xuICAgICAgICAgICAgdmFyIGFudGljbG9ja3dpc2UgPSByZXN1bHQuYW50aWNsb2Nrd2lzZTtcblxuICAgICAgICAgICAgdGhpcy5hcmMoY3gsIGN5LCByYWRpdXMkMSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGFudGljbG9ja3dpc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhcmMgbWV0aG9kIGNyZWF0ZXMgYW4gYXJjL2N1cnZlICh1c2VkIHRvIGNyZWF0ZSBjaXJjbGVzLCBvciBwYXJ0cyBvZiBjaXJjbGVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjeCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGN5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0QW5nbGUgLSBUaGUgc3RhcnRpbmcgYW5nbGUsIGluIHJhZGlhbnMgKDAgaXMgYXQgdGhlIDMgbydjbG9jayBwb3NpdGlvblxuICAgICAqICBvZiB0aGUgYXJjJ3MgY2lyY2xlKVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRBbmdsZSAtIFRoZSBlbmRpbmcgYW5nbGUsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbnRpY2xvY2t3aXNlPWZhbHNlXSAtIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBkcmF3aW5nIHNob3VsZCBiZVxuICAgICAqICBjb3VudGVyLWNsb2Nrd2lzZSBvciBjbG9ja3dpc2UuIEZhbHNlIGlzIGRlZmF1bHQsIGFuZCBpbmRpY2F0ZXMgY2xvY2t3aXNlLCB3aGlsZSB0cnVlXG4gICAgICogIGluZGljYXRlcyBjb3VudGVyLWNsb2Nrd2lzZS5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBUaGlzIEdyYXBoaWNzIG9iamVjdC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmFyYyA9IGZ1bmN0aW9uIGFyYyAoY3gsIGN5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBhbnRpY2xvY2t3aXNlKVxuICAgIHtcbiAgICAgICAgaWYgKCBhbnRpY2xvY2t3aXNlID09PSB2b2lkIDAgKSBhbnRpY2xvY2t3aXNlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHN0YXJ0QW5nbGUgPT09IGVuZEFuZ2xlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYW50aWNsb2Nrd2lzZSAmJiBlbmRBbmdsZSA8PSBzdGFydEFuZ2xlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlbmRBbmdsZSArPSBQSV8yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFudGljbG9ja3dpc2UgJiYgc3RhcnRBbmdsZSA8PSBlbmRBbmdsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgc3RhcnRBbmdsZSArPSBQSV8yO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN3ZWVwID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlO1xuXG4gICAgICAgIGlmIChzd2VlcCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRYID0gY3ggKyAoTWF0aC5jb3Moc3RhcnRBbmdsZSkgKiByYWRpdXMpO1xuICAgICAgICB2YXIgc3RhcnRZID0gY3kgKyAoTWF0aC5zaW4oc3RhcnRBbmdsZSkgKiByYWRpdXMpO1xuICAgICAgICB2YXIgZXBzID0gdGhpcy5nZW9tZXRyeS5jbG9zZVBvaW50RXBzO1xuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50UGF0aCBleGlzdHMsIHRha2UgaXRzIHBvaW50cy4gT3RoZXJ3aXNlIGNhbGwgYG1vdmVUb2AgdG8gc3RhcnQgYSBwYXRoLlxuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5jdXJyZW50UGF0aCA/IHRoaXMuY3VycmVudFBhdGgucG9pbnRzIDogbnVsbDtcblxuICAgICAgICBpZiAocG9pbnRzKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBtYWtlIGEgYmV0dGVyIGZpeC5cblxuICAgICAgICAgICAgLy8gV2UgY2hlY2sgaG93IGZhciBvdXIgc3RhcnQgaXMgZnJvbSB0aGUgbGFzdCBleGlzdGluZyBwb2ludFxuICAgICAgICAgICAgdmFyIHhEaWZmID0gTWF0aC5hYnMocG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSAtIHN0YXJ0WCk7XG4gICAgICAgICAgICB2YXIgeURpZmYgPSBNYXRoLmFicyhwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdIC0gc3RhcnRZKTtcblxuICAgICAgICAgICAgaWYgKHhEaWZmIDwgZXBzICYmIHlEaWZmIDwgZXBzKVxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHN0YXJ0WCwgc3RhcnRZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubW92ZVRvKHN0YXJ0WCwgc3RhcnRZKTtcbiAgICAgICAgICAgIHBvaW50cyA9IHRoaXMuY3VycmVudFBhdGgucG9pbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgQXJjVXRpbHMuYXJjKHN0YXJ0WCwgc3RhcnRZLCBjeCwgY3ksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGFudGljbG9ja3dpc2UsIHBvaW50cyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIHNpbXBsZSBvbmUtY29sb3IgZmlsbCB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIgR3JhcGhpY3MgbWV0aG9kc1xuICAgICAqIChzdWNoIGFzIGxpbmVUbygpIG9yIGRyYXdDaXJjbGUoKSkgdXNlIHdoZW4gZHJhd2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29sb3I9MF0gLSB0aGUgY29sb3Igb2YgdGhlIGZpbGxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gdGhlIGFscGhhIG9mIHRoZSBmaWxsXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5iZWdpbkZpbGwgPSBmdW5jdGlvbiBiZWdpbkZpbGwgKGNvbG9yLCBhbHBoYSlcbiAgICB7XG4gICAgICAgIGlmICggY29sb3IgPT09IHZvaWQgMCApIGNvbG9yID0gMDtcbiAgICAgICAgaWYgKCBhbHBoYSA9PT0gdm9pZCAwICkgYWxwaGEgPSAxO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJlZ2luVGV4dHVyZUZpbGwoeyB0ZXh0dXJlOiBUZXh0dXJlLldISVRFLCBjb2xvcjogY29sb3IsIGFscGhhOiBhbHBoYSB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQmVnaW4gdGhlIHRleHR1cmUgZmlsbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9iamVjdCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtQSVhJLlRleHR1cmV9IFtvcHRpb25zLnRleHR1cmU9UElYSS5UZXh0dXJlLldISVRFXSAtIFRleHR1cmUgdG8gZmlsbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb2xvcj0weGZmZmZmZl0gLSBCYWNrZ3JvdW5kIHRvIGZpbGwgYmVoaW5kIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYWxwaGE9MV0gLSBBbHBoYSBvZiBmaWxsXG4gICAgICogQHBhcmFtIHtQSVhJLk1hdHJpeH0gW29wdGlvbnMubWF0cml4PW51bGxdIC0gVHJhbnNmb3JtIG1hdHJpeFxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuYmVnaW5UZXh0dXJlRmlsbCA9IGZ1bmN0aW9uIGJlZ2luVGV4dHVyZUZpbGwgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcGFyYW1zOiAodGV4dHVyZSwgY29sb3IsIGFscGhhLCBtYXRyaXgpXG4gICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgVGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24oJ3Y1LjIuMCcsICdQbGVhc2UgdXNlIG9iamVjdC1iYXNlZCBvcHRpb25zIGZvciBHcmFwaGljcyNiZWdpblRleHR1cmVGaWxsJyk7XG5cbiAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgdmFyIGFscGhhID0gYXJndW1lbnRzWzJdO1xuICAgICAgICAgICAgdmFyIG1hdHJpeCA9IGFyZ3VtZW50c1szXTtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IHsgdGV4dHVyZTogdGV4dHVyZSwgY29sb3I6IGNvbG9yLCBhbHBoYTogYWxwaGEsIG1hdHJpeDogbWF0cml4IH07XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB1bmRlZmluZWQga2V5c1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBvcHRpb25zW2tleV0gPT09IHVuZGVmaW5lZCAmJiBkZWxldGUgb3B0aW9uc1trZXldOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGRlZmF1bHRzXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHRleHR1cmU6IFRleHR1cmUuV0hJVEUsXG4gICAgICAgICAgICBjb2xvcjogMHhGRkZGRkYsXG4gICAgICAgICAgICBhbHBoYTogMSxcbiAgICAgICAgICAgIG1hdHJpeDogbnVsbCxcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2x5KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmlzaWJsZSA9IG9wdGlvbnMuYWxwaGEgPiAwO1xuXG4gICAgICAgIGlmICghdmlzaWJsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZmlsbFN0eWxlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYXRyaXgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXRyaXggPSBvcHRpb25zLm1hdHJpeC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWF0cml4LmludmVydCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2ZpbGxTdHlsZSwgeyB2aXNpYmxlOiB2aXNpYmxlIH0sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYSBmaWxsIHRvIHRoZSBsaW5lcyBhbmQgc2hhcGVzIHRoYXQgd2VyZSBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHRoZSBiZWdpbkZpbGwoKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBUaGlzIEdyYXBoaWNzIG9iamVjdC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmVuZEZpbGwgPSBmdW5jdGlvbiBlbmRGaWxsICgpXG4gICAge1xuICAgICAgICB0aGlzLmZpbmlzaFBvbHkoKTtcblxuICAgICAgICB0aGlzLl9maWxsU3R5bGUucmVzZXQoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYSByZWN0YW5nbGUgc2hhcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkIG9mIHRoZSB0b3AtbGVmdCBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgWSBjb29yZCBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuZHJhd1JlY3QgPSBmdW5jdGlvbiBkcmF3UmVjdCAoeCwgeSwgd2lkdGgsIGhlaWdodClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTaGFwZShuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIHJlY3RhbmdsZSBzaGFwZSB3aXRoIHJvdW5kZWQvYmV2ZWxlZCBjb3JuZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZCBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmQgb2YgdGhlIHRvcC1sZWZ0IG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gUmFkaXVzIG9mIHRoZSByZWN0YW5nbGUgY29ybmVyc1xuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuZHJhd1JvdW5kZWRSZWN0ID0gZnVuY3Rpb24gZHJhd1JvdW5kZWRSZWN0ICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5kcmF3U2hhcGUobmV3IFJvdW5kZWRSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERyYXdzIGEgY2lyY2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5kcmF3Q2lyY2xlID0gZnVuY3Rpb24gZHJhd0NpcmNsZSAoeCwgeSwgcmFkaXVzKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1NoYXBlKG5ldyBDaXJjbGUoeCwgeSwgcmFkaXVzKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERyYXdzIGFuIGVsbGlwc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIGhhbGYgd2lkdGggb2YgdGhlIGVsbGlwc2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhhbGYgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIGRyYXdFbGxpcHNlICh4LCB5LCB3aWR0aCwgaGVpZ2h0KVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1NoYXBlKG5ldyBFbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhd3MgYSBwb2x5Z29uIHVzaW5nIHRoZSBnaXZlbiBwYXRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJbXXxQSVhJLlBvaW50W118UElYSS5Qb2x5Z29ufSBwYXRoIC0gVGhlIHBhdGggZGF0YSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcG9seWdvbi5cbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBUaGlzIEdyYXBoaWNzIG9iamVjdC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmRyYXdQb2x5Z29uID0gZnVuY3Rpb24gZHJhd1BvbHlnb24gKHBhdGgpXG4gICAge1xuICAgICAgICB2YXIgYXJndW1lbnRzJDEgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgLy8gcHJldmVudHMgYW4gYXJndW1lbnQgYXNzaWdubWVudCBkZW9wdFxuICAgICAgICAvLyBzZWUgc2VjdGlvbiAzLjE6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvd2lraS9PcHRpbWl6YXRpb24ta2lsbGVycyMzLW1hbmFnaW5nLWFyZ3VtZW50c1xuICAgICAgICB2YXIgcG9pbnRzID0gcGF0aDtcblxuICAgICAgICB2YXIgY2xvc2VTdHJva2UgPSB0cnVlOy8vICEhdGhpcy5fZmlsbFN0eWxlO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaGFzIHBvaW50cy4uXG4gICAgICAgIGlmIChwb2ludHMucG9pbnRzKVxuICAgICAgICB7XG4gICAgICAgICAgICBjbG9zZVN0cm9rZSA9IHBvaW50cy5jbG9zZVN0cm9rZTtcbiAgICAgICAgICAgIHBvaW50cyA9IHBvaW50cy5wb2ludHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gcHJldmVudHMgYW4gYXJndW1lbnQgbGVhayBkZW9wdFxuICAgICAgICAgICAgLy8gc2VlIHNlY3Rpb24gMy4yOiBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2JsdWViaXJkL3dpa2kvT3B0aW1pemF0aW9uLWtpbGxlcnMjMy1tYW5hZ2luZy1hcmd1bWVudHNcbiAgICAgICAgICAgIHBvaW50cyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcG9pbnRzW2ldID0gYXJndW1lbnRzJDFbaV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hhcGUgPSBuZXcgUG9seWdvbihwb2ludHMpO1xuXG4gICAgICAgIHNoYXBlLmNsb3NlU3Ryb2tlID0gY2xvc2VTdHJva2U7XG5cbiAgICAgICAgdGhpcy5kcmF3U2hhcGUoc2hhcGUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBEcmF3IGFueSBzaGFwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5DaXJjbGV8UElYSS5FbGxpcHNlfFBJWEkuUG9seWdvbnxQSVhJLlJlY3RhbmdsZXxQSVhJLlJvdW5kZWRSZWN0YW5nbGV9IHNoYXBlIC0gU2hhcGUgdG8gZHJhd1xuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFRoaXMgR3JhcGhpY3Mgb2JqZWN0LiBHb29kIGZvciBjaGFpbmluZyBtZXRob2QgY2FsbHNcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlIChzaGFwZSlcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5faG9sZU1vZGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnkuZHJhd1NoYXBlKFxuICAgICAgICAgICAgICAgIHNoYXBlLFxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGxTdHlsZS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVTdHlsZS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuX21hdHJpeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnkuZHJhd0hvbGUoc2hhcGUsIHRoaXMuX21hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRHJhdyBhIHN0YXIgc2hhcGUgd2l0aCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHBvaW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gQ2VudGVyIFggcG9zaXRpb24gb2YgdGhlIHN0YXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIENlbnRlciBZIHBvc2l0aW9uIG9mIHRoZSBzdGFyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvaW50cyAtIFRoZSBudW1iZXIgb2YgcG9pbnRzIG9mIHRoZSBzdGFyLCBtdXN0IGJlID4gMVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgb3V0ZXIgcmFkaXVzIG9mIHRoZSBzdGFyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtpbm5lclJhZGl1c10gLSBUaGUgaW5uZXIgcmFkaXVzIGJldHdlZW4gcG9pbnRzLCBkZWZhdWx0IGhhbGYgYHJhZGl1c2BcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIG9mIHRoZSBzdGFyIGluIHJhZGlhbnMsIHdoZXJlIDAgaXMgdmVydGljYWxcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBUaGlzIEdyYXBoaWNzIG9iamVjdC4gR29vZCBmb3IgY2hhaW5pbmcgbWV0aG9kIGNhbGxzXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmRyYXdTdGFyID0gZnVuY3Rpb24gZHJhd1N0YXIgKHgsIHksIHBvaW50cywgcmFkaXVzLCBpbm5lclJhZGl1cywgcm90YXRpb24pXG4gICAge1xuICAgICAgICBpZiAoIHJvdGF0aW9uID09PSB2b2lkIDAgKSByb3RhdGlvbiA9IDA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1BvbHlnb24obmV3IFN0YXIoeCwgeSwgcG9pbnRzLCByYWRpdXMsIGlubmVyUmFkaXVzLCByb3RhdGlvbikpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGdyYXBoaWNzIHRoYXQgd2VyZSBkcmF3biB0byB0aGlzIEdyYXBoaWNzIG9iamVjdCwgYW5kIHJlc2V0cyBmaWxsIGFuZCBsaW5lIHN0eWxlIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gVGhpcyBHcmFwaGljcyBvYmplY3QuIEdvb2QgZm9yIGNoYWluaW5nIG1ldGhvZCBjYWxsc1xuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyICgpXG4gICAge1xuICAgICAgICB0aGlzLmdlb21ldHJ5LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2xpbmVTdHlsZS5yZXNldCgpO1xuICAgICAgICB0aGlzLl9maWxsU3R5bGUucmVzZXQoKTtcblxuICAgICAgICB0aGlzLl9tYXRyaXggPSBudWxsO1xuICAgICAgICB0aGlzLl9ob2xlTW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiBncmFwaGljcyBjb25zaXN0cyBvZiBvbmUgcmVjdGFuZ2xlLCBhbmQgdGh1cywgY2FuIGJlIGRyYXduIGxpa2UgYSBTcHJpdGUgYW5kXG4gICAgICogbWFza2VkIHdpdGggZ2wuc2Npc3Nvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9ubHkgMSByZWN0LlxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5pc0Zhc3RSZWN0ID0gZnVuY3Rpb24gaXNGYXN0UmVjdCAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkuZ3JhcGhpY3NEYXRhLmxlbmd0aCA9PT0gMVxuICAgICAgICAmJiB0aGlzLmdlb21ldHJ5LmdyYXBoaWNzRGF0YVswXS5zaGFwZS50eXBlID09PSBTSEFQRVMuUkVDVFxuICAgICAgICAmJiAhdGhpcy5nZW9tZXRyeS5ncmFwaGljc0RhdGFbMF0ubGluZVdpZHRoO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdXNpbmcgdGhlIFdlYkdMIHJlbmRlcmVyXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gX3JlbmRlciAocmVuZGVyZXIpXG4gICAge1xuICAgICAgICB0aGlzLmZpbmlzaFBvbHkoKTtcblxuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG4gICAgICAgIC8vIGJhdGNoIHBhcnQuLlxuICAgICAgICAvLyBiYXRjaCBpdCFcbiAgICAgICAgZ2VvbWV0cnkudXBkYXRlQmF0Y2hlcygpO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS5iYXRjaGFibGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhdGNoRGlydHkgIT09IGdlb21ldHJ5LmJhdGNoRGlydHkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wdWxhdGVCYXRjaGVzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlckJhdGNoZWQocmVuZGVyZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gbm8gYmF0Y2hpbmcuLi5cbiAgICAgICAgICAgIHJlbmRlcmVyLmJhdGNoLmZsdXNoKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlckRpcmVjdChyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUG9wdWxhdGluZyBiYXRjaGVzIGZvciByZW5kZXJpbmdcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuX3BvcHVsYXRlQmF0Y2hlcyA9IGZ1bmN0aW9uIF9wb3B1bGF0ZUJhdGNoZXMgKClcbiAgICB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG4gICAgICAgIHZhciBibGVuZE1vZGUgPSB0aGlzLmJsZW5kTW9kZTtcblxuICAgICAgICB0aGlzLmJhdGNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYXRjaFRpbnQgPSAtMTtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtSUQgPSAtMTtcbiAgICAgICAgdGhpcy5iYXRjaERpcnR5ID0gZ2VvbWV0cnkuYmF0Y2hEaXJ0eTtcblxuICAgICAgICB0aGlzLnZlcnRleERhdGEgPSBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LnBvaW50cyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBnZW9tZXRyeS5iYXRjaGVzLmxlbmd0aDsgaSA8IGw7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGdJID0gZ2VvbWV0cnkuYmF0Y2hlc1tpXTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IGdJLnN0eWxlLmNvbG9yO1xuICAgICAgICAgICAgdmFyIHZlcnRleERhdGEgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMudmVydGV4RGF0YS5idWZmZXIsXG4gICAgICAgICAgICAgICAgZ0kuYXR0cmliU3RhcnQgKiA0ICogMixcbiAgICAgICAgICAgICAgICBnSS5hdHRyaWJTaXplICogMik7XG5cbiAgICAgICAgICAgIHZhciB1dnMgPSBuZXcgRmxvYXQzMkFycmF5KGdlb21ldHJ5LnV2c0Zsb2F0MzIuYnVmZmVyLFxuICAgICAgICAgICAgICAgIGdJLmF0dHJpYlN0YXJ0ICogNCAqIDIsXG4gICAgICAgICAgICAgICAgZ0kuYXR0cmliU2l6ZSAqIDIpO1xuXG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShnZW9tZXRyeS5pbmRpY2VzVWludDE2LmJ1ZmZlcixcbiAgICAgICAgICAgICAgICBnSS5zdGFydCAqIDIsXG4gICAgICAgICAgICAgICAgZ0kuc2l6ZSk7XG5cbiAgICAgICAgICAgIHZhciBiYXRjaCA9IHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhOiB2ZXJ0ZXhEYXRhLFxuICAgICAgICAgICAgICAgIGJsZW5kTW9kZTogYmxlbmRNb2RlLFxuICAgICAgICAgICAgICAgIGluZGljZXM6IGluZGljZXMsXG4gICAgICAgICAgICAgICAgdXZzOiB1dnMsXG4gICAgICAgICAgICAgICAgX2JhdGNoUkdCOiBoZXgycmdiKGNvbG9yKSxcbiAgICAgICAgICAgICAgICBfdGludFJHQjogY29sb3IsXG4gICAgICAgICAgICAgICAgX3RleHR1cmU6IGdJLnN0eWxlLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgYWxwaGE6IGdJLnN0eWxlLmFscGhhLFxuICAgICAgICAgICAgICAgIHdvcmxkQWxwaGE6IDEgfTtcblxuICAgICAgICAgICAgdGhpcy5iYXRjaGVzW2ldID0gYmF0Y2g7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgYmF0Y2hlcyB1c2luZyB0aGUgQmF0aGVkUmVuZGVyZXIgcGx1Z2luXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5fcmVuZGVyQmF0Y2hlZCA9IGZ1bmN0aW9uIF9yZW5kZXJCYXRjaGVkIChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIGlmICghdGhpcy5iYXRjaGVzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVuZGVyZXIuYmF0Y2guc2V0T2JqZWN0UmVuZGVyZXIocmVuZGVyZXIucGx1Z2luc1t0aGlzLnBsdWdpbk5hbWVdKTtcblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVZlcnRpY2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVGludHMoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuYmF0Y2hlcy5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBiYXRjaCA9IHRoaXMuYmF0Y2hlc1tpXTtcblxuICAgICAgICAgICAgYmF0Y2gud29ybGRBbHBoYSA9IHRoaXMud29ybGRBbHBoYSAqIGJhdGNoLmFscGhhO1xuXG4gICAgICAgICAgICByZW5kZXJlci5wbHVnaW5zW3RoaXMucGx1Z2luTmFtZV0ucmVuZGVyKGJhdGNoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBncmFwaGljcyBkaXJlY3RcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLl9yZW5kZXJEaXJlY3QgPSBmdW5jdGlvbiBfcmVuZGVyRGlyZWN0IChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIHZhciBzaGFkZXIgPSB0aGlzLl9yZXNvbHZlRGlyZWN0U2hhZGVyKHJlbmRlcmVyKTtcblxuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuICAgICAgICB2YXIgdGludCA9IHRoaXMudGludDtcbiAgICAgICAgdmFyIHdvcmxkQWxwaGEgPSB0aGlzLndvcmxkQWxwaGE7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IHNoYWRlci51bmlmb3JtcztcbiAgICAgICAgdmFyIGRyYXdDYWxscyA9IGdlb21ldHJ5LmRyYXdDYWxscztcblxuICAgICAgICAvLyBsZXRzIHNldCB0aGUgdHJhbnNmb21yXG4gICAgICAgIHVuaWZvcm1zLnRyYW5zbGF0aW9uTWF0cml4ID0gdGhpcy50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm07XG5cbiAgICAgICAgLy8gYW5kIHRoZW4gbGV0cyBzZXQgdGhlIHRpbnQuLlxuICAgICAgICB1bmlmb3Jtcy50aW50WzBdID0gKCgodGludCA+PiAxNikgJiAweEZGKSAvIDI1NSkgKiB3b3JsZEFscGhhO1xuICAgICAgICB1bmlmb3Jtcy50aW50WzFdID0gKCgodGludCA+PiA4KSAmIDB4RkYpIC8gMjU1KSAqIHdvcmxkQWxwaGE7XG4gICAgICAgIHVuaWZvcm1zLnRpbnRbMl0gPSAoKHRpbnQgJiAweEZGKSAvIDI1NSkgKiB3b3JsZEFscGhhO1xuICAgICAgICB1bmlmb3Jtcy50aW50WzNdID0gd29ybGRBbHBoYTtcblxuICAgICAgICAvLyB0aGUgZmlyc3QgZHJhdyBjYWxsLCB3ZSBjYW4gc2V0IHRoZSB1bmlmb3JtcyBvZiB0aGUgc2hhZGVyIGRpcmVjdGx5IGhlcmUuXG5cbiAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHdlIGNhbiB0YWNrIGFkdmFudGFnZSBvZiB0aGUgc3luYyBmdW5jdGlvbiBvZiBwaXhpIVxuICAgICAgICAvLyBiaW5kIGFuZCBzeW5jIHVuaWZvcm1zLi5cbiAgICAgICAgLy8gdGhlcmUgaXMgYSB3YXkgdG8gb3B0aW1pc2UgdGhpcy4uXG4gICAgICAgIHJlbmRlcmVyLnNoYWRlci5iaW5kKHNoYWRlcik7XG4gICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmJpbmQoZ2VvbWV0cnksIHNoYWRlcik7XG5cbiAgICAgICAgLy8gc2V0IHN0YXRlLi5cbiAgICAgICAgcmVuZGVyZXIuc3RhdGUuc2V0KHRoaXMuc3RhdGUpO1xuXG4gICAgICAgIC8vIHRoZW4gcmVuZGVyIHRoZSByZXN0IG9mIHRoZW0uLi5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBkcmF3Q2FsbHMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJEcmF3Q2FsbERpcmVjdChyZW5kZXJlciwgZ2VvbWV0cnkuZHJhd0NhbGxzW2ldKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHNwZWNpZmljIERyYXdDYWxsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtQSVhJLkJhdGNoRHJhd0NhbGx9IGRyYXdDYWxsXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLl9yZW5kZXJEcmF3Q2FsbERpcmVjdCA9IGZ1bmN0aW9uIF9yZW5kZXJEcmF3Q2FsbERpcmVjdCAocmVuZGVyZXIsIGRyYXdDYWxsKVxuICAgIHtcbiAgICAgICAgdmFyIHRleHR1cmVzID0gZHJhd0NhbGwudGV4dHVyZXM7XG4gICAgICAgIHZhciB0eXBlID0gZHJhd0NhbGwudHlwZTtcbiAgICAgICAgdmFyIHNpemUgPSBkcmF3Q2FsbC5zaXplO1xuICAgICAgICB2YXIgc3RhcnQgPSBkcmF3Q2FsbC5zdGFydDtcbiAgICAgICAgdmFyIGdyb3VwVGV4dHVyZUNvdW50ID0gdGV4dHVyZXMuY291bnQ7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cFRleHR1cmVDb3VudDsgaisrKVxuICAgICAgICB7XG4gICAgICAgICAgICByZW5kZXJlci50ZXh0dXJlLmJpbmQodGV4dHVyZXMuZWxlbWVudHNbal0sIGopO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVuZGVyZXIuZ2VvbWV0cnkuZHJhdyh0eXBlLCBzaXplLCBzdGFydCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHNoYWRlciBmb3IgZGlyZWN0IHJlbmRlcmluZ1xuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuX3Jlc29sdmVEaXJlY3RTaGFkZXIgPSBmdW5jdGlvbiBfcmVzb2x2ZURpcmVjdFNoYWRlciAocmVuZGVyZXIpXG4gICAge1xuICAgICAgICB2YXIgc2hhZGVyID0gdGhpcy5zaGFkZXI7XG5cbiAgICAgICAgdmFyIHBsdWdpbk5hbWUgPSB0aGlzLnBsdWdpbk5hbWU7XG5cbiAgICAgICAgaWYgKCFzaGFkZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHNoYWRlciBoZXJlLCB3ZSBjYW4gdXNlIHRoZSBkZWZhdWx0IHNoYWRlci5cbiAgICAgICAgICAgIC8vIGFuZCB0aGF0IG9ubHkgZ2V0cyBjcmVhdGVkIGlmIHdlIGFjdHVhbGx5IG5lZWQgaXQuLlxuICAgICAgICAgICAgLy8gYnV0IG1heSBiZSBtb3JlIHRoYW4gb25lIHBsdWdpbnMgZm9yIGdyYXBoaWNzXG4gICAgICAgICAgICBpZiAoIURFRkFVTFRfU0hBREVSU1twbHVnaW5OYW1lXSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgc2FtcGxlVmFsdWVzID0gbmV3IEludDMyQXJyYXkoMTYpO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlVmFsdWVzW2ldID0gaTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdW5pZm9ybXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbnQ6IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDEsIDFdKSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25NYXRyaXg6IG5ldyBNYXRyaXgoKSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogVW5pZm9ybUdyb3VwLmZyb20oeyB1U2FtcGxlcnM6IHNhbXBsZVZhbHVlcyB9LCB0cnVlKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdmFyIHByb2dyYW0gPSByZW5kZXJlci5wbHVnaW5zW3BsdWdpbk5hbWVdLl9zaGFkZXIucHJvZ3JhbTtcblxuICAgICAgICAgICAgICAgIERFRkFVTFRfU0hBREVSU1twbHVnaW5OYW1lXSA9IG5ldyBTaGFkZXIocHJvZ3JhbSwgdW5pZm9ybXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaGFkZXIgPSBERUZBVUxUX1NIQURFUlNbcGx1Z2luTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hhZGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvdW5kcyBvZiB0aGUgZ3JhcGhpYyBzaGFwZSBhcyBhIHJlY3RhbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuX2NhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIF9jYWxjdWxhdGVCb3VuZHMgKClcbiAgICB7XG4gICAgICAgIHRoaXMuZmluaXNoUG9seSgpO1xuXG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cbiAgICAgICAgLy8gc2tpcHBpbmcgd2hlbiBncmFwaGljcyBpcyBlbXB0eSwgbGlrZSBhIGNvbnRhaW5lclxuICAgICAgICBpZiAoIWdlb21ldHJ5LmdyYXBoaWNzRGF0YS5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWYgPSBnZW9tZXRyeS5ib3VuZHM7XG4gICAgICAgIHZhciBtaW5YID0gcmVmLm1pblg7XG4gICAgICAgIHZhciBtaW5ZID0gcmVmLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gcmVmLm1heFg7XG4gICAgICAgIHZhciBtYXhZID0gcmVmLm1heFk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRzLmFkZEZyYW1lKHRoaXMudHJhbnNmb3JtLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgYSBwb2ludCBpcyBpbnNpZGUgdGhpcyBncmFwaGljcyBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gcG9pbnQgLSB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQgb2YgdGhlIHRlc3RcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuY29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQgKHBvaW50KVxuICAgIHtcbiAgICAgICAgdGhpcy53b3JsZFRyYW5zZm9ybS5hcHBseUludmVyc2UocG9pbnQsIEdyYXBoaWNzLl9URU1QX1BPSU5UKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZW9tZXRyeS5jb250YWluc1BvaW50KEdyYXBoaWNzLl9URU1QX1BPSU5UKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWF0ZSB0aGUgdGludCBieSBhcHBseWluZyB0aW4gdG8gYmF0Y2hlcyB1c2luZyBHcmFwaGljcyB0aW50LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuY2FsY3VsYXRlVGludHMgPSBmdW5jdGlvbiBjYWxjdWxhdGVUaW50cyAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hUaW50ICE9PSB0aGlzLnRpbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYmF0Y2hUaW50ID0gdGhpcy50aW50O1xuXG4gICAgICAgICAgICB2YXIgdGludFJHQiA9IGhleDJyZ2IodGhpcy50aW50LCB0ZW1wKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJhdGNoZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGJhdGNoID0gdGhpcy5iYXRjaGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgdmFyIGJhdGNoVGludCA9IGJhdGNoLl9iYXRjaFJHQjtcblxuICAgICAgICAgICAgICAgIHZhciByID0gKHRpbnRSR0JbMF0gKiBiYXRjaFRpbnRbMF0pICogMjU1O1xuICAgICAgICAgICAgICAgIHZhciBnID0gKHRpbnRSR0JbMV0gKiBiYXRjaFRpbnRbMV0pICogMjU1O1xuICAgICAgICAgICAgICAgIHZhciBiID0gKHRpbnRSR0JbMl0gKiBiYXRjaFRpbnRbMl0pICogMjU1O1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBJdmFuLCBjYW4gdGhpcyBiZSBkb25lIGluIG9uZSBnbz9cbiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSAociA8PCAxNikgKyAoZyA8PCA4KSArIChiIHwgMCk7XG5cbiAgICAgICAgICAgICAgICBiYXRjaC5fdGludFJHQiA9IChjb2xvciA+PiAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKGNvbG9yICYgMHhmZjAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGNvbG9yICYgMHhmZikgPDwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIElmIHRoZXJlJ3MgYSB0cmFuc2Zvcm0gdXBkYXRlIG9yIGEgY2hhbmdlIHRvIHRoZSBzaGFwZSBvZiB0aGVcbiAgICAgKiBnZW9tZXRyeSwgcmVjYWN1bGF0ZSB0aGUgdmVydGljZXMuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5jYWxjdWxhdGVWZXJ0aWNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVZlcnRpY2VzICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtSUQgPT09IHRoaXMudHJhbnNmb3JtLl93b3JsZElEKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1JRCA9IHRoaXMudHJhbnNmb3JtLl93b3JsZElEO1xuXG4gICAgICAgIHZhciB3dCA9IHRoaXMudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtO1xuICAgICAgICB2YXIgYSA9IHd0LmE7XG4gICAgICAgIHZhciBiID0gd3QuYjtcbiAgICAgICAgdmFyIGMgPSB3dC5jO1xuICAgICAgICB2YXIgZCA9IHd0LmQ7XG4gICAgICAgIHZhciB0eCA9IHd0LnR4O1xuICAgICAgICB2YXIgdHkgPSB3dC50eTtcblxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZ2VvbWV0cnkucG9pbnRzOy8vIGJhdGNoLnZlcnRleERhdGFPcmlnaW5hbDtcbiAgICAgICAgdmFyIHZlcnRleERhdGEgPSB0aGlzLnZlcnRleERhdGE7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHZhciB5ID0gZGF0YVtpICsgMV07XG5cbiAgICAgICAgICAgIHZlcnRleERhdGFbY291bnQrK10gPSAoYSAqIHgpICsgKGMgKiB5KSArIHR4O1xuICAgICAgICAgICAgdmVydGV4RGF0YVtjb3VudCsrXSA9IChkICogeSkgKyAoYiAqIHgpICsgdHk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHBhdGguXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLkdyYXBoaWNzfSBSZXR1cm5zIGl0c2VsZi5cbiAgICAgKi9cbiAgICBHcmFwaGljcy5wcm90b3R5cGUuY2xvc2VQYXRoID0gZnVuY3Rpb24gY2xvc2VQYXRoICgpXG4gICAge1xuICAgICAgICB2YXIgY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuXG4gICAgICAgIGlmIChjdXJyZW50UGF0aClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBhZGQgZXh0cmEgcG9pbnQgaW4gdGhlIGVuZCBiZWNhdXNlIGJ1aWxkTGluZSB3aWxsIHRha2UgY2FyZSBvZiB0aGF0XG4gICAgICAgICAgICBjdXJyZW50UGF0aC5jbG9zZVN0cm9rZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgYSBtYXRyaXggdG8gdGhlIHBvc2l0aW9uYWwgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG1hdHJpeCAtIE1hdHJpeCB0byB1c2UgZm9yIHRyYW5zZm9ybSBjdXJyZW50IHNoYXBlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuR3JhcGhpY3N9IFJldHVybnMgaXRzZWxmLlxuICAgICAqL1xuICAgIEdyYXBoaWNzLnByb3RvdHlwZS5zZXRNYXRyaXggPSBmdW5jdGlvbiBzZXRNYXRyaXggKG1hdHJpeClcbiAgICB7XG4gICAgICAgIHRoaXMuX21hdHJpeCA9IG1hdHJpeDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQmVnaW4gYWRkaW5nIGhvbGVzIHRvIHRoZSBsYXN0IGRyYXcgc2hhcGVcbiAgICAgKiBJTVBPUlRBTlQ6IGhvbGVzIG11c3QgYmUgZnVsbHkgaW5zaWRlIGEgc2hhcGUgdG8gd29ya1xuICAgICAqIEFsc28gd2VpcmRuZXNzIGVuc3VlcyBpZiBob2xlcyBvdmVybGFwIVxuICAgICAqIEVsbGlwc2VzLCBDaXJjbGVzLCBSZWN0YW5nbGVzIGFuZCBSb3VuZGVkIFJlY3RhbmdsZXMgY2Fubm90IGJlIGhvbGVzIG9yIGhvc3QgZm9yIGhvbGVzIGluIENhbnZhc1JlbmRlcmVyLFxuICAgICAqIHBsZWFzZSB1c2UgYG1vdmVUb2AgYGxpbmVUb2AsIGBxdWFkcmF0aWNDdXJ2ZVRvYCBpZiB5b3UgcmVseSBvbiBwaXhpLWxlZ2FjeSBidW5kbGUuXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmJlZ2luSG9sZSA9IGZ1bmN0aW9uIGJlZ2luSG9sZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5maW5pc2hQb2x5KCk7XG4gICAgICAgIHRoaXMuX2hvbGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW5kIGFkZGluZyBob2xlcyB0byB0aGUgbGFzdCBkcmF3IHNoYXBlXG4gICAgICogQHJldHVybiB7UElYSS5HcmFwaGljc30gUmV0dXJucyBpdHNlbGYuXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmVuZEhvbGUgPSBmdW5jdGlvbiBlbmRIb2xlICgpXG4gICAge1xuICAgICAgICB0aGlzLmZpbmlzaFBvbHkoKTtcbiAgICAgICAgdGhpcy5faG9sZU1vZGUgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIEdyYXBoaWNzIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fGJvb2xlYW59IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFyYW1ldGVyLiBBIGJvb2xlYW4gd2lsbCBhY3QgYXMgaWYgYWxsXG4gICAgICogIG9wdGlvbnMgaGF2ZSBiZWVuIHNldCB0byB0aGF0IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGlsZHJlbj1mYWxzZV0gLSBpZiBzZXQgdG8gdHJ1ZSwgYWxsIHRoZSBjaGlsZHJlbiB3aWxsIGhhdmVcbiAgICAgKiAgdGhlaXIgZGVzdHJveSBtZXRob2QgY2FsbGVkIGFzIHdlbGwuICdvcHRpb25zJyB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aG9zZSBjYWxscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHR1cmU9ZmFsc2VdIC0gT25seSB1c2VkIGZvciBjaGlsZCBTcHJpdGVzIGlmIG9wdGlvbnMuY2hpbGRyZW4gaXMgc2V0IHRvIHRydWVcbiAgICAgKiAgU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIHRleHR1cmUgb2YgdGhlIGNoaWxkIHNwcml0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYmFzZVRleHR1cmU9ZmFsc2VdIC0gT25seSB1c2VkIGZvciBjaGlsZCBTcHJpdGVzIGlmIG9wdGlvbnMuY2hpbGRyZW4gaXMgc2V0IHRvIHRydWVcbiAgICAgKiAgU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIGJhc2UgdGV4dHVyZSBvZiB0aGUgY2hpbGQgc3ByaXRlXG4gICAgICovXG4gICAgR3JhcGhpY3MucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95IChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgQ29udGFpbmVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5nZW9tZXRyeS5yZWZDb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5nZW9tZXRyeS5yZWZDb3VudCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXRyaXggPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGluZVN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fbGluZVN0eWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmlsbFN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fZmlsbFN0eWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5nZW9tZXRyeSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2hhZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuYmF0Y2hlcyA9IG51bGw7XG5cbiAgICAgICAgQ29udGFpbmVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBHcmFwaGljcy5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIEdyYXBoaWNzO1xufShDb250YWluZXIpKTtcblxuLyoqXG4gKiBUZW1wb3JhcnkgcG9pbnQgdG8gdXNlIGZvciBjb250YWluc1BvaW50XG4gKlxuICogQHN0YXRpY1xuICogQHByaXZhdGVcbiAqIEBtZW1iZXIge1BJWEkuUG9pbnR9XG4gKi9cbkdyYXBoaWNzLl9URU1QX1BPSU5UID0gbmV3IFBvaW50KCk7XG5cbmV4cG9ydCB7IEZpbGxTdHlsZSwgR1JBUEhJQ1NfQ1VSVkVTLCBHcmFwaGljcywgR3JhcGhpY3NEYXRhLCBHcmFwaGljc0dlb21ldHJ5LCBMaW5lU3R5bGUsIGluZGV4IGFzIGdyYXBoaWNzVXRpbHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYXBoaWNzLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9zcHJpdGUgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvc3ByaXRlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgUG9pbnQsIFJlY3RhbmdsZSwgT2JzZXJ2YWJsZVBvaW50IH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyBzaWduIH0gZnJvbSAnQHBpeGkvdXRpbHMnO1xuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJ0BwaXhpL2NvcmUnO1xuaW1wb3J0IHsgQkxFTkRfTU9ERVMgfSBmcm9tICdAcGl4aS9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnQHBpeGkvZGlzcGxheSc7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gJ0BwaXhpL3NldHRpbmdzJztcblxudmFyIHRlbXBQb2ludCA9IG5ldyBQb2ludCgpO1xudmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoWzAsIDEsIDIsIDAsIDIsIDNdKTtcblxuLyoqXG4gKiBUaGUgU3ByaXRlIG9iamVjdCBpcyB0aGUgYmFzZSBmb3IgYWxsIHRleHR1cmVkIG9iamVjdHMgdGhhdCBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlblxuKlxuICogQSBzcHJpdGUgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhbiBpbWFnZSBsaWtlIHRoaXM6XG4gKlxuICogYGBganNcbiAqIGxldCBzcHJpdGUgPSBQSVhJLlNwcml0ZS5mcm9tKCdhc3NldHMvaW1hZ2UucG5nJyk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGNyZWF0ZSBzcHJpdGVzIGlzIHVzaW5nIGEge0BsaW5rIFBJWEkuU3ByaXRlc2hlZXR9LFxuICogYXMgc3dhcHBpbmcgYmFzZSB0ZXh0dXJlcyB3aGVuIHJlbmRlcmluZyB0byB0aGUgc2NyZWVuIGlzIGluZWZmaWNpZW50LlxuICpcbiAqIGBgYGpzXG4gKiBQSVhJLkxvYWRlci5zaGFyZWQuYWRkKFwiYXNzZXRzL3Nwcml0ZXNoZWV0Lmpzb25cIikubG9hZChzZXR1cCk7XG4gKlxuICogZnVuY3Rpb24gc2V0dXAoKSB7XG4gKiAgIGxldCBzaGVldCA9IFBJWEkuTG9hZGVyLnNoYXJlZC5yZXNvdXJjZXNbXCJhc3NldHMvc3ByaXRlc2hlZXQuanNvblwiXS5zcHJpdGVzaGVldDtcbiAqICAgbGV0IHNwcml0ZSA9IG5ldyBQSVhJLlNwcml0ZShzaGVldC50ZXh0dXJlc1tcImltYWdlLnBuZ1wiXSk7XG4gKiAgIC4uLlxuICogfVxuICogYGBgXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLkNvbnRhaW5lclxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFNwcml0ZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbnRhaW5lcikge1xuICAgIGZ1bmN0aW9uIFNwcml0ZSh0ZXh0dXJlKVxuICAgIHtcbiAgICAgICAgQ29udGFpbmVyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhbmNob3IgcG9pbnQgZGVmaW5lcyB0aGUgbm9ybWFsaXplZCBjb29yZGluYXRlc1xuICAgICAgICAgKiBpbiB0aGUgdGV4dHVyZSB0aGF0IG1hcCB0byB0aGUgcG9zaXRpb24gb2YgdGhpc1xuICAgICAgICAgKiBzcHJpdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYCgwLDApYCAob3IgYHRleHR1cmUuZGVmYXVsdEFuY2hvcmBcbiAgICAgICAgICogaWYgeW91IGhhdmUgbW9kaWZpZWQgdGhhdCksIHdoaWNoIG1lYW5zIHRoZSBwb3NpdGlvblxuICAgICAgICAgKiBgKHgseSlgIG9mIHRoaXMgYFNwcml0ZWAgd2lsbCBiZSB0aGUgdG9wLWxlZnQgY29ybmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlOiBVcGRhdGluZyBgdGV4dHVyZS5kZWZhdWx0QW5jaG9yYCBhZnRlclxuICAgICAgICAgKiBjb25zdHJ1Y3RpbmcgYSBgU3ByaXRlYCBkb2VzIF9ub3RfIHVwZGF0ZSBpdHMgYW5jaG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmNvY29zMmQteC5vcmcvY29jb3MyZC14L2VuL3Nwcml0ZXMvbWFuaXB1bGF0aW9uLmh0bWx9XG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZWZhdWx0IGB0ZXh0dXJlLmRlZmF1bHRBbmNob3JgXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYW5jaG9yID0gbmV3IE9ic2VydmFibGVQb2ludChcbiAgICAgICAgICAgIHRoaXMuX29uQW5jaG9yVXBkYXRlLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICh0ZXh0dXJlID8gdGV4dHVyZS5kZWZhdWx0QW5jaG9yLnggOiAwKSxcbiAgICAgICAgICAgICh0ZXh0dXJlID8gdGV4dHVyZS5kZWZhdWx0QW5jaG9yLnkgOiAwKVxuICAgICAgICApO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGV4dHVyZSB0aGF0IHRoZSBzcHJpdGUgaXMgdXNpbmdcbiAgICAgICAgICpcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5UZXh0dXJlfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdGV4dHVyZSA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgc3ByaXRlICh0aGlzIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIHRleHR1cmUpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3dpZHRoID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgc3ByaXRlICh0aGlzIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIHRleHR1cmUpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW50IGFwcGxpZWQgdG8gdGhlIHNwcml0ZS4gVGhpcyBpcyBhIGhleCB2YWx1ZS4gQSB2YWx1ZSBvZiAweEZGRkZGRiB3aWxsIHJlbW92ZSBhbnkgdGludCBlZmZlY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMHhGRkZGRkZcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3RpbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl90aW50UkdCID0gbnVsbDtcbiAgICAgICAgdGhpcy50aW50ID0gMHhGRkZGRkY7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBibGVuZCBtb2RlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNwcml0ZS4gQXBwbHkgYSB2YWx1ZSBvZiBgUElYSS5CTEVORF9NT0RFUy5OT1JNQUxgIHRvIHJlc2V0IHRoZSBibGVuZCBtb2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMXG4gICAgICAgICAqIEBzZWUgUElYSS5CTEVORF9NT0RFU1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibGVuZE1vZGUgPSBCTEVORF9NT0RFUy5OT1JNQUw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzaGFkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBzcHJpdGUuIFNldCB0byBudWxsIHRvIHJlbW92ZSBhIGN1cnJlbnQgc2hhZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkZpbHRlcnxQSVhJLlNoYWRlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2hhZGVyID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGVkIHRpbnQgdmFsdWUgc28gd2UgY2FuIHRlbGwgd2hlbiB0aGUgdGludCBpcyBjaGFuZ2VkLlxuICAgICAgICAgKiBWYWx1ZSBpcyB1c2VkIGZvciAyZCBDYW52YXNSZW5kZXJlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDB4RkZGRkZGXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jYWNoZWRUaW50ID0gMHhGRkZGRkY7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgdXZzIGRhdGEgb2YgdGhlIHNwcml0ZSwgYXNzaWduZWQgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgICAgKiBhcyB0aGUgdmVydGV4RGF0YSBpbiBjYWxjdWxhdGVWZXJ0aWNlcygpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge0Zsb2F0MzJBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXZzID0gbnVsbDtcblxuICAgICAgICAvLyBjYWxsIHRleHR1cmUgc2V0dGVyXG4gICAgICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmUgfHwgVGV4dHVyZS5FTVBUWTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRoZSB2ZXJ0ZXggZGF0YSBvZiB0aGUgc3ByaXRlIChiYXNpY2FsbHkgYSBxdWFkKVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAbWVtYmVyIHtGbG9hdDMyQXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZlcnRleERhdGEgPSBuZXcgRmxvYXQzMkFycmF5KDgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgdGhlIG9iamVjdCBJRiBpdCBpcyBhIHRyaW1tZWQgc3ByaXRlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge0Zsb2F0MzJBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmVydGV4VHJpbW1lZERhdGEgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybUlEID0gLTE7XG4gICAgICAgIHRoaXMuX3RleHR1cmVJRCA9IC0xO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVRyaW1tZWRJRCA9IC0xO1xuICAgICAgICB0aGlzLl90ZXh0dXJlVHJpbW1lZElEID0gLTE7XG5cbiAgICAgICAgLy8gQmF0Y2hhYmxlIHN0dWZmLi5cbiAgICAgICAgLy8gVE9ETyBjb3VsZCBtYWtlIHRoaXMgYSBtaXhpbj9cbiAgICAgICAgdGhpcy5pbmRpY2VzID0gaW5kaWNlcztcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGx1Z2luIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbmRlcmluZyB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAqIEFsbG93cyB0byBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBwcm9jZXNzIHdpdGhvdXQgb3ZlcnJpZGluZyAnX3JlbmRlcicgJiAnX3JlbmRlckNhbnZhcycgbWV0aG9kcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnYmF0Y2gnXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsdWdpbk5hbWUgPSAnYmF0Y2gnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB1c2VkIHRvIGZhc3QgY2hlY2sgaWYgYSBzcHJpdGUgaXMuLiBhIHNwcml0ZSFcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTcHJpdGUgPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnRlcm5hbCByb3VuZFBpeGVscyBmaWVsZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcm91bmRQaXhlbHMgPSBzZXR0aW5ncy5ST1VORF9QSVhFTFM7XG4gICAgfVxuXG4gICAgaWYgKCBDb250YWluZXIgKSBTcHJpdGUuX19wcm90b19fID0gQ29udGFpbmVyO1xuICAgIFNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb250YWluZXIgJiYgQ29udGFpbmVyLnByb3RvdHlwZSApO1xuICAgIFNwcml0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcHJpdGU7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyByb3VuZFBpeGVsczogeyBjb25maWd1cmFibGU6IHRydWUgfSx3aWR0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSxoZWlnaHQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYW5jaG9yOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRpbnQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdGV4dHVyZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgdGV4dHVyZSBpcyB1cGRhdGVkLCB0aGlzIGV2ZW50IHdpbGwgZmlyZSB0byB1cGRhdGUgdGhlIHNjYWxlIGFuZCBmcmFtZVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLl9vblRleHR1cmVVcGRhdGUgPSBmdW5jdGlvbiBfb25UZXh0dXJlVXBkYXRlICgpXG4gICAge1xuICAgICAgICB0aGlzLl90ZXh0dXJlSUQgPSAtMTtcbiAgICAgICAgdGhpcy5fdGV4dHVyZVRyaW1tZWRJRCA9IC0xO1xuICAgICAgICB0aGlzLl9jYWNoZWRUaW50ID0gMHhGRkZGRkY7XG5cbiAgICAgICAgLy8gc28gaWYgX3dpZHRoIGlzIDAgdGhlbiB3aWR0aCB3YXMgbm90IHNldC4uXG4gICAgICAgIGlmICh0aGlzLl93aWR0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5zY2FsZS54ID0gc2lnbih0aGlzLnNjYWxlLngpICogdGhpcy5fd2lkdGggLyB0aGlzLl90ZXh0dXJlLm9yaWcud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGVpZ2h0KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlLnkgPSBzaWduKHRoaXMuc2NhbGUueSkgKiB0aGlzLl9oZWlnaHQgLyB0aGlzLl90ZXh0dXJlLm9yaWcuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBhbmNob3IgcG9zaXRpb24gdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgU3ByaXRlLnByb3RvdHlwZS5fb25BbmNob3JVcGRhdGUgPSBmdW5jdGlvbiBfb25BbmNob3JVcGRhdGUgKClcbiAgICB7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybUlEID0gLTE7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVRyaW1tZWRJRCA9IC0xO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGVzIHdvcmxkVHJhbnNmb3JtICogdmVydGljZXMsIHN0b3JlIGl0IGluIHZlcnRleERhdGFcbiAgICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLmNhbGN1bGF0ZVZlcnRpY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlVmVydGljZXMgKClcbiAgICB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5fdGV4dHVyZTtcblxuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtSUQgPT09IHRoaXMudHJhbnNmb3JtLl93b3JsZElEICYmIHRoaXMuX3RleHR1cmVJRCA9PT0gdGV4dHVyZS5fdXBkYXRlSUQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0ZXh0dXJlIFVWIGhlcmUsIGJlY2F1c2UgYmFzZSB0ZXh0dXJlIGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgY2FsbGluZyBgX29uVGV4dHVyZVVwZGF0ZWBcbiAgICAgICAgaWYgKHRoaXMuX3RleHR1cmVJRCAhPT0gdGV4dHVyZS5fdXBkYXRlSUQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudXZzID0gdGhpcy5fdGV4dHVyZS5fdXZzLnV2c0Zsb2F0MzI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1JRCA9IHRoaXMudHJhbnNmb3JtLl93b3JsZElEO1xuICAgICAgICB0aGlzLl90ZXh0dXJlSUQgPSB0ZXh0dXJlLl91cGRhdGVJRDtcblxuICAgICAgICAvLyBzZXQgdGhlIHZlcnRleCBkYXRhXG5cbiAgICAgICAgdmFyIHd0ID0gdGhpcy50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm07XG4gICAgICAgIHZhciBhID0gd3QuYTtcbiAgICAgICAgdmFyIGIgPSB3dC5iO1xuICAgICAgICB2YXIgYyA9IHd0LmM7XG4gICAgICAgIHZhciBkID0gd3QuZDtcbiAgICAgICAgdmFyIHR4ID0gd3QudHg7XG4gICAgICAgIHZhciB0eSA9IHd0LnR5O1xuICAgICAgICB2YXIgdmVydGV4RGF0YSA9IHRoaXMudmVydGV4RGF0YTtcbiAgICAgICAgdmFyIHRyaW0gPSB0ZXh0dXJlLnRyaW07XG4gICAgICAgIHZhciBvcmlnID0gdGV4dHVyZS5vcmlnO1xuICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5fYW5jaG9yO1xuXG4gICAgICAgIHZhciB3MCA9IDA7XG4gICAgICAgIHZhciB3MSA9IDA7XG4gICAgICAgIHZhciBoMCA9IDA7XG4gICAgICAgIHZhciBoMSA9IDA7XG5cbiAgICAgICAgaWYgKHRyaW0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBzcHJpdGUgaXMgdHJpbW1lZCBhbmQgaXMgbm90IGEgdGlsaW5nc3ByaXRlIHRoZW4gd2UgbmVlZCB0byBhZGQgdGhlIGV4dHJhXG4gICAgICAgICAgICAvLyBzcGFjZSBiZWZvcmUgdHJhbnNmb3JtaW5nIHRoZSBzcHJpdGUgY29vcmRzLlxuICAgICAgICAgICAgdzEgPSB0cmltLnggLSAoYW5jaG9yLl94ICogb3JpZy53aWR0aCk7XG4gICAgICAgICAgICB3MCA9IHcxICsgdHJpbS53aWR0aDtcblxuICAgICAgICAgICAgaDEgPSB0cmltLnkgLSAoYW5jaG9yLl95ICogb3JpZy5oZWlnaHQpO1xuICAgICAgICAgICAgaDAgPSBoMSArIHRyaW0uaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdzEgPSAtYW5jaG9yLl94ICogb3JpZy53aWR0aDtcbiAgICAgICAgICAgIHcwID0gdzEgKyBvcmlnLndpZHRoO1xuXG4gICAgICAgICAgICBoMSA9IC1hbmNob3IuX3kgKiBvcmlnLmhlaWdodDtcbiAgICAgICAgICAgIGgwID0gaDEgKyBvcmlnLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHh5XG4gICAgICAgIHZlcnRleERhdGFbMF0gPSAoYSAqIHcxKSArIChjICogaDEpICsgdHg7XG4gICAgICAgIHZlcnRleERhdGFbMV0gPSAoZCAqIGgxKSArIChiICogdzEpICsgdHk7XG5cbiAgICAgICAgLy8geHlcbiAgICAgICAgdmVydGV4RGF0YVsyXSA9IChhICogdzApICsgKGMgKiBoMSkgKyB0eDtcbiAgICAgICAgdmVydGV4RGF0YVszXSA9IChkICogaDEpICsgKGIgKiB3MCkgKyB0eTtcblxuICAgICAgICAvLyB4eVxuICAgICAgICB2ZXJ0ZXhEYXRhWzRdID0gKGEgKiB3MCkgKyAoYyAqIGgwKSArIHR4O1xuICAgICAgICB2ZXJ0ZXhEYXRhWzVdID0gKGQgKiBoMCkgKyAoYiAqIHcwKSArIHR5O1xuXG4gICAgICAgIC8vIHh5XG4gICAgICAgIHZlcnRleERhdGFbNl0gPSAoYSAqIHcxKSArIChjICogaDApICsgdHg7XG4gICAgICAgIHZlcnRleERhdGFbN10gPSAoZCAqIGgwKSArIChiICogdzEpICsgdHk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JvdW5kUGl4ZWxzKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVzb2x1dGlvbiA9IHNldHRpbmdzLlJFU09MVVRJT047XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGV4RGF0YS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhEYXRhW2ldID0gTWF0aC5yb3VuZCgodmVydGV4RGF0YVtpXSAqIHJlc29sdXRpb24gfCAwKSAvIHJlc29sdXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIGNhbGN1bGF0ZXMgd29ybGRUcmFuc2Zvcm0gKiB2ZXJ0aWNlcyBmb3IgYSBub24gdGV4dHVyZSB3aXRoIGEgdHJpbS4gc3RvcmUgaXQgaW4gdmVydGV4VHJpbW1lZERhdGFcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHRydWUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHRyaW1tZWQgdGV4dHVyZSBpcyByZXNwZWN0ZWRcbiAgICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLmNhbGN1bGF0ZVRyaW1tZWRWZXJ0aWNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVRyaW1tZWRWZXJ0aWNlcyAoKVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLnZlcnRleFRyaW1tZWREYXRhKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleFRyaW1tZWREYXRhID0gbmV3IEZsb2F0MzJBcnJheSg4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90cmFuc2Zvcm1UcmltbWVkSUQgPT09IHRoaXMudHJhbnNmb3JtLl93b3JsZElEICYmIHRoaXMuX3RleHR1cmVUcmltbWVkSUQgPT09IHRoaXMuX3RleHR1cmUuX3VwZGF0ZUlEKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1UcmltbWVkSUQgPSB0aGlzLnRyYW5zZm9ybS5fd29ybGRJRDtcbiAgICAgICAgdGhpcy5fdGV4dHVyZVRyaW1tZWRJRCA9IHRoaXMuX3RleHR1cmUuX3VwZGF0ZUlEO1xuXG4gICAgICAgIC8vIGxldHMgZG8gc29tZSBzcGVjaWFsIHRyaW0gY29kZSFcbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLl90ZXh0dXJlO1xuICAgICAgICB2YXIgdmVydGV4RGF0YSA9IHRoaXMudmVydGV4VHJpbW1lZERhdGE7XG4gICAgICAgIHZhciBvcmlnID0gdGV4dHVyZS5vcmlnO1xuICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5fYW5jaG9yO1xuXG4gICAgICAgIC8vIGxldHMgY2FsY3VsYXRlIHRoZSBuZXcgdW50cmltbWVkIGJvdW5kcy4uXG4gICAgICAgIHZhciB3dCA9IHRoaXMudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtO1xuICAgICAgICB2YXIgYSA9IHd0LmE7XG4gICAgICAgIHZhciBiID0gd3QuYjtcbiAgICAgICAgdmFyIGMgPSB3dC5jO1xuICAgICAgICB2YXIgZCA9IHd0LmQ7XG4gICAgICAgIHZhciB0eCA9IHd0LnR4O1xuICAgICAgICB2YXIgdHkgPSB3dC50eTtcblxuICAgICAgICB2YXIgdzEgPSAtYW5jaG9yLl94ICogb3JpZy53aWR0aDtcbiAgICAgICAgdmFyIHcwID0gdzEgKyBvcmlnLndpZHRoO1xuXG4gICAgICAgIHZhciBoMSA9IC1hbmNob3IuX3kgKiBvcmlnLmhlaWdodDtcbiAgICAgICAgdmFyIGgwID0gaDEgKyBvcmlnLmhlaWdodDtcblxuICAgICAgICAvLyB4eVxuICAgICAgICB2ZXJ0ZXhEYXRhWzBdID0gKGEgKiB3MSkgKyAoYyAqIGgxKSArIHR4O1xuICAgICAgICB2ZXJ0ZXhEYXRhWzFdID0gKGQgKiBoMSkgKyAoYiAqIHcxKSArIHR5O1xuXG4gICAgICAgIC8vIHh5XG4gICAgICAgIHZlcnRleERhdGFbMl0gPSAoYSAqIHcwKSArIChjICogaDEpICsgdHg7XG4gICAgICAgIHZlcnRleERhdGFbM10gPSAoZCAqIGgxKSArIChiICogdzApICsgdHk7XG5cbiAgICAgICAgLy8geHlcbiAgICAgICAgdmVydGV4RGF0YVs0XSA9IChhICogdzApICsgKGMgKiBoMCkgKyB0eDtcbiAgICAgICAgdmVydGV4RGF0YVs1XSA9IChkICogaDApICsgKGIgKiB3MCkgKyB0eTtcblxuICAgICAgICAvLyB4eVxuICAgICAgICB2ZXJ0ZXhEYXRhWzZdID0gKGEgKiB3MSkgKyAoYyAqIGgwKSArIHR4O1xuICAgICAgICB2ZXJ0ZXhEYXRhWzddID0gKGQgKiBoMCkgKyAoYiAqIHcxKSArIHR5O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqXG4gICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdXNpbmcgdGhlIFdlYkdMIHJlbmRlcmVyXG4gICAgKlxuICAgICogQHByb3RlY3RlZFxuICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSB3ZWJnbCByZW5kZXJlciB0byB1c2UuXG4gICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLl9yZW5kZXIgPSBmdW5jdGlvbiBfcmVuZGVyIChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVmVydGljZXMoKTtcblxuICAgICAgICByZW5kZXJlci5iYXRjaC5zZXRPYmplY3RSZW5kZXJlcihyZW5kZXJlci5wbHVnaW5zW3RoaXMucGx1Z2luTmFtZV0pO1xuICAgICAgICByZW5kZXJlci5wbHVnaW5zW3RoaXMucGx1Z2luTmFtZV0ucmVuZGVyKHRoaXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBib3VuZHMgb2YgdGhlIHNwcml0ZS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLl9jYWxjdWxhdGVCb3VuZHMgPSBmdW5jdGlvbiBfY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICB2YXIgdHJpbSA9IHRoaXMuX3RleHR1cmUudHJpbTtcbiAgICAgICAgdmFyIG9yaWcgPSB0aGlzLl90ZXh0dXJlLm9yaWc7XG5cbiAgICAgICAgLy8gRmlyc3QgbGV0cyBjaGVjayB0byBzZWUgaWYgdGhlIGN1cnJlbnQgdGV4dHVyZSBoYXMgYSB0cmltLi5cbiAgICAgICAgaWYgKCF0cmltIHx8ICh0cmltLndpZHRoID09PSBvcmlnLndpZHRoICYmIHRyaW0uaGVpZ2h0ID09PSBvcmlnLmhlaWdodCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIG5vIHRyaW0hIGxldHMgdXNlIHRoZSB1c3VhbCBjYWxjdWxhdGlvbnMuLlxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVWZXJ0aWNlcygpO1xuICAgICAgICAgICAgdGhpcy5fYm91bmRzLmFkZFF1YWQodGhpcy52ZXJ0ZXhEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGxldHMgY2FsY3VsYXRlIGEgc3BlY2lhbCB0cmltbWVkIGJvdW5kcy4uLlxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUcmltbWVkVmVydGljZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5hZGRRdWFkKHRoaXMudmVydGV4VHJpbW1lZERhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvY2FsIGJvdW5kcyBvZiB0aGUgc3ByaXRlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5SZWN0YW5nbGV9IFtyZWN0XSAtIFRoZSBvdXRwdXQgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVjdGFuZ2xlfSBUaGUgYm91bmRzLlxuICAgICAqL1xuICAgIFNwcml0ZS5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHMgPSBmdW5jdGlvbiBnZXRMb2NhbEJvdW5kcyAocmVjdClcbiAgICB7XG4gICAgICAgIC8vIHdlIGNhbiBkbyBhIGZhc3QgbG9jYWwgYm91bmRzIGlmIHRoZSBzcHJpdGUgaGFzIG5vIGNoaWxkcmVuIVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5taW5YID0gdGhpcy5fdGV4dHVyZS5vcmlnLndpZHRoICogLXRoaXMuX2FuY2hvci5feDtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5taW5ZID0gdGhpcy5fdGV4dHVyZS5vcmlnLmhlaWdodCAqIC10aGlzLl9hbmNob3IuX3k7XG4gICAgICAgICAgICB0aGlzLl9ib3VuZHMubWF4WCA9IHRoaXMuX3RleHR1cmUub3JpZy53aWR0aCAqICgxIC0gdGhpcy5fYW5jaG9yLl94KTtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5tYXhZID0gdGhpcy5fdGV4dHVyZS5vcmlnLmhlaWdodCAqICgxIC0gdGhpcy5fYW5jaG9yLl95KTtcblxuICAgICAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbG9jYWxCb3VuZHNSZWN0KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxCb3VuZHNSZWN0ID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlY3QgPSB0aGlzLl9sb2NhbEJvdW5kc1JlY3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ib3VuZHMuZ2V0UmVjdGFuZ2xlKHJlY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHMuY2FsbCh0aGlzLCByZWN0KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgYSBwb2ludCBpcyBpbnNpZGUgdGhpcyBzcHJpdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gcG9pbnQgLSB0aGUgcG9pbnQgdG8gdGVzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQgb2YgdGhlIHRlc3RcbiAgICAgKi9cbiAgICBTcHJpdGUucHJvdG90eXBlLmNvbnRhaW5zUG9pbnQgPSBmdW5jdGlvbiBjb250YWluc1BvaW50IChwb2ludClcbiAgICB7XG4gICAgICAgIHRoaXMud29ybGRUcmFuc2Zvcm0uYXBwbHlJbnZlcnNlKHBvaW50LCB0ZW1wUG9pbnQpO1xuXG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3RleHR1cmUub3JpZy53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuX3RleHR1cmUub3JpZy5oZWlnaHQ7XG4gICAgICAgIHZhciB4MSA9IC13aWR0aCAqIHRoaXMuYW5jaG9yLng7XG4gICAgICAgIHZhciB5MSA9IDA7XG5cbiAgICAgICAgaWYgKHRlbXBQb2ludC54ID49IHgxICYmIHRlbXBQb2ludC54IDwgeDEgKyB3aWR0aClcbiAgICAgICAge1xuICAgICAgICAgICAgeTEgPSAtaGVpZ2h0ICogdGhpcy5hbmNob3IueTtcblxuICAgICAgICAgICAgaWYgKHRlbXBQb2ludC55ID49IHkxICYmIHRlbXBQb2ludC55IDwgeTEgKyBoZWlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgc3ByaXRlIGFuZCBvcHRpb25hbGx5IGl0cyB0ZXh0dXJlIGFuZCBjaGlsZHJlblxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R8Ym9vbGVhbn0gW29wdGlvbnNdIC0gT3B0aW9ucyBwYXJhbWV0ZXIuIEEgYm9vbGVhbiB3aWxsIGFjdCBhcyBpZiBhbGwgb3B0aW9uc1xuICAgICAqICBoYXZlIGJlZW4gc2V0IHRvIHRoYXQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoaWxkcmVuPWZhbHNlXSAtIGlmIHNldCB0byB0cnVlLCBhbGwgdGhlIGNoaWxkcmVuIHdpbGwgaGF2ZSB0aGVpciBkZXN0cm95XG4gICAgICogICAgICBtZXRob2QgY2FsbGVkIGFzIHdlbGwuICdvcHRpb25zJyB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aG9zZSBjYWxscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHR1cmU9ZmFsc2VdIC0gU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIGN1cnJlbnQgdGV4dHVyZSBvZiB0aGUgc3ByaXRlIGFzIHdlbGxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhc2VUZXh0dXJlPWZhbHNlXSAtIFNob3VsZCBpdCBkZXN0cm95IHRoZSBiYXNlIHRleHR1cmUgb2YgdGhlIHNwcml0ZSBhcyB3ZWxsXG4gICAgICovXG4gICAgU3ByaXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIENvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX3RleHR1cmUub2ZmKCd1cGRhdGUnLCB0aGlzLl9vblRleHR1cmVVcGRhdGUsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2FuY2hvciA9IG51bGw7XG5cbiAgICAgICAgdmFyIGRlc3Ryb3lUZXh0dXJlID0gdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMgOiBvcHRpb25zICYmIG9wdGlvbnMudGV4dHVyZTtcblxuICAgICAgICBpZiAoZGVzdHJveVRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBkZXN0cm95QmFzZVRleHR1cmUgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucyA6IG9wdGlvbnMgJiYgb3B0aW9ucy5iYXNlVGV4dHVyZTtcblxuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZS5kZXN0cm95KCEhZGVzdHJveUJhc2VUZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RleHR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLnNoYWRlciA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIHNvbWUgaGVscGVyIGZ1bmN0aW9ucy4uXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IHNwcml0ZSBiYXNlZCBvbiB0aGUgc291cmNlIHlvdSBwcm92aWRlLlxuICAgICAqIFRoZSBzb3VyY2UgY2FuIGJlIC0gZnJhbWUgaWQsIGltYWdlIHVybCwgdmlkZW8gdXJsLCBjYW52YXMgZWxlbWVudCwgdmlkZW8gZWxlbWVudCwgYmFzZSB0ZXh0dXJlXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UElYSS5UZXh0dXJlfEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR9IHNvdXJjZSBTb3VyY2UgdG8gY3JlYXRlIHRleHR1cmUgZnJvbVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gU2VlIHtAbGluayBQSVhJLkJhc2VUZXh0dXJlfSdzIGNvbnN0cnVjdG9yIGZvciBvcHRpb25zLlxuICAgICAqIEByZXR1cm4ge1BJWEkuU3ByaXRlfSBUaGUgbmV3bHkgY3JlYXRlZCBzcHJpdGVcbiAgICAgKi9cbiAgICBTcHJpdGUuZnJvbSA9IGZ1bmN0aW9uIGZyb20gKHNvdXJjZSwgb3B0aW9ucylcbiAgICB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gKHNvdXJjZSBpbnN0YW5jZW9mIFRleHR1cmUpXG4gICAgICAgICAgICA/IHNvdXJjZVxuICAgICAgICAgICAgOiBUZXh0dXJlLmZyb20oc291cmNlLCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNwcml0ZSh0ZXh0dXJlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSBQaXhpSlMgd2lsbCBNYXRoLmZsb29yKCkgeC95IHZhbHVlcyB3aGVuIHJlbmRlcmluZywgc3RvcHBpbmcgcGl4ZWwgaW50ZXJwb2xhdGlvbi5cbiAgICAgKiBBZHZhbnRhZ2VzIGNhbiBpbmNsdWRlIHNoYXJwZXIgaW1hZ2UgcXVhbGl0eSAobGlrZSB0ZXh0KSBhbmQgZmFzdGVyIHJlbmRlcmluZyBvbiBjYW52YXMuXG4gICAgICogVGhlIG1haW4gZGlzYWR2YW50YWdlIGlzIG1vdmVtZW50IG9mIG9iamVjdHMgbWF5IGFwcGVhciBsZXNzIHNtb290aC5cbiAgICAgKiBUbyBzZXQgdGhlIGdsb2JhbCBkZWZhdWx0LCBjaGFuZ2Uge0BsaW5rIFBJWEkuc2V0dGluZ3MuUk9VTkRfUElYRUxTfVxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5yb3VuZFBpeGVscy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fcm91bmRQaXhlbHMgIT09IHZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm1JRCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JvdW5kUGl4ZWxzID0gdmFsdWU7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5yb3VuZFBpeGVscy5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdW5kUGl4ZWxzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHNwcml0ZSwgc2V0dGluZyB0aGlzIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSBzY2FsZSB0byBhY2hpZXZlIHRoZSB2YWx1ZSBzZXRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMud2lkdGguZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnNjYWxlLngpICogdGhpcy5fdGV4dHVyZS5vcmlnLndpZHRoO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMud2lkdGguc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHZhciBzID0gc2lnbih0aGlzLnNjYWxlLngpIHx8IDE7XG5cbiAgICAgICAgdGhpcy5zY2FsZS54ID0gcyAqIHZhbHVlIC8gdGhpcy5fdGV4dHVyZS5vcmlnLndpZHRoO1xuICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBzcHJpdGUsIHNldHRpbmcgdGhpcyB3aWxsIGFjdHVhbGx5IG1vZGlmeSB0aGUgc2NhbGUgdG8gYWNoaWV2ZSB0aGUgdmFsdWUgc2V0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmhlaWdodC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuc2NhbGUueSkgKiB0aGlzLl90ZXh0dXJlLm9yaWcuaGVpZ2h0O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB2YXIgcyA9IHNpZ24odGhpcy5zY2FsZS55KSB8fCAxO1xuXG4gICAgICAgIHRoaXMuc2NhbGUueSA9IHMgKiB2YWx1ZSAvIHRoaXMuX3RleHR1cmUub3JpZy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYW5jaG9yIHNldHMgdGhlIG9yaWdpbiBwb2ludCBvZiB0aGUgdGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUge0BsaW5rIFBJWEkuVGV4dHVyZXxUZXh0dXJlfVxuICAgICAqIGFuZCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgaXMgYCgwLDApYCwgdGhpcyBtZWFucyB0aGUgdGV4dCdzIG9yaWdpbiBpcyB0aGUgdG9wIGxlZnQuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoZSBhbmNob3IgdG8gYCgwLjUsMC41KWAgbWVhbnMgdGhlIHRleHQncyBvcmlnaW4gaXMgY2VudGVyZWQuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoZSBhbmNob3IgdG8gYCgxLDEpYCB3b3VsZCBtZWFuIHRoZSB0ZXh0J3Mgb3JpZ2luIHBvaW50IHdpbGwgYmUgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgcGFzcyBvbmx5IHNpbmdsZSBwYXJhbWV0ZXIsIGl0IHdpbGwgc2V0IGJvdGggeCBhbmQgeSB0byB0aGUgc2FtZSB2YWx1ZSBhcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc3ByaXRlID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xuICAgICAqIHNwcml0ZS5hbmNob3Iuc2V0KDAuNSk7IC8vIFRoaXMgd2lsbCBzZXQgdGhlIG9yaWdpbiB0byBjZW50ZXIuICgwLjUpIGlzIHNhbWUgYXMgKDAuNSwgMC41KS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbmNob3IuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbmNob3I7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbmNob3Iuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMuX2FuY2hvci5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0aW50IGFwcGxpZWQgdG8gdGhlIHNwcml0ZS4gVGhpcyBpcyBhIGhleCB2YWx1ZS5cbiAgICAgKiBBIHZhbHVlIG9mIDB4RkZGRkZGIHdpbGwgcmVtb3ZlIGFueSB0aW50IGVmZmVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAweEZGRkZGRlxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aW50LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGludDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMuX3RpbnQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdGludFJHQiA9ICh2YWx1ZSA+PiAxNikgKyAodmFsdWUgJiAweGZmMDApICsgKCh2YWx1ZSAmIDB4ZmYpIDw8IDE2KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRleHR1cmUgdGhhdCB0aGUgc3ByaXRlIGlzIHVzaW5nXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlRleHR1cmV9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRleHR1cmUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0dXJlO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dHVyZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHR1cmUgPT09IHZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZS5vZmYoJ3VwZGF0ZScsIHRoaXMuX29uVGV4dHVyZVVwZGF0ZSwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlID0gdmFsdWUgfHwgVGV4dHVyZS5FTVBUWTtcbiAgICAgICAgdGhpcy5fY2FjaGVkVGludCA9IDB4RkZGRkZGO1xuXG4gICAgICAgIHRoaXMuX3RleHR1cmVJRCA9IC0xO1xuICAgICAgICB0aGlzLl90ZXh0dXJlVHJpbW1lZElEID0gLTE7XG5cbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGV4dHVyZSB0byBsb2FkXG4gICAgICAgICAgICBpZiAodmFsdWUuYmFzZVRleHR1cmUudmFsaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25UZXh0dXJlVXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWUub25jZSgndXBkYXRlJywgdGhpcy5fb25UZXh0dXJlVXBkYXRlLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3ByaXRlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gU3ByaXRlO1xufShDb250YWluZXIpKTtcblxuZXhwb3J0IHsgU3ByaXRlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcHJpdGUuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL3RleHQgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvdGV4dCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFNwcml0ZSB9IGZyb20gJ0BwaXhpL3Nwcml0ZSc7XG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gJ0BwaXhpL3NldHRpbmdzJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJ0BwaXhpL21hdGgnO1xuaW1wb3J0IHsgaGV4MnN0cmluZywgaGV4MnJnYiwgc3RyaW5nMmhleCwgdHJpbUNhbnZhcywgc2lnbiB9IGZyb20gJ0BwaXhpL3V0aWxzJztcblxuLyoqXG4gKiBDb25zdGFudHMgdGhhdCBkZWZpbmUgdGhlIHR5cGUgb2YgZ3JhZGllbnQgb24gdGV4dC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIFRFWFRfR1JBRElFTlRcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAdHlwZSB7b2JqZWN0fVxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTkVBUl9WRVJUSUNBTCBWZXJ0aWNhbCBncmFkaWVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTkVBUl9IT1JJWk9OVEFMIExpbmVhciBncmFkaWVudFxuICovXG52YXIgVEVYVF9HUkFESUVOVCA9IHtcbiAgICBMSU5FQVJfVkVSVElDQUw6IDAsXG4gICAgTElORUFSX0hPUklaT05UQUw6IDEsXG59O1xuXG4vLyBkaXNhYmxpbmcgZXNsaW50IGZvciBub3csIGdvaW5nIHRvIHJld3JpdGUgdGhpcyBpbiB2NVxuXG52YXIgZGVmYXVsdFN0eWxlID0ge1xuICAgIGFsaWduOiAnbGVmdCcsXG4gICAgYnJlYWtXb3JkczogZmFsc2UsXG4gICAgZHJvcFNoYWRvdzogZmFsc2UsXG4gICAgZHJvcFNoYWRvd0FscGhhOiAxLFxuICAgIGRyb3BTaGFkb3dBbmdsZTogTWF0aC5QSSAvIDYsXG4gICAgZHJvcFNoYWRvd0JsdXI6IDAsXG4gICAgZHJvcFNoYWRvd0NvbG9yOiAnYmxhY2snLFxuICAgIGRyb3BTaGFkb3dEaXN0YW5jZTogNSxcbiAgICBmaWxsOiAnYmxhY2snLFxuICAgIGZpbGxHcmFkaWVudFR5cGU6IFRFWFRfR1JBRElFTlQuTElORUFSX1ZFUlRJQ0FMLFxuICAgIGZpbGxHcmFkaWVudFN0b3BzOiBbXSxcbiAgICBmb250RmFtaWx5OiAnQXJpYWwnLFxuICAgIGZvbnRTaXplOiAyNixcbiAgICBmb250U3R5bGU6ICdub3JtYWwnLFxuICAgIGZvbnRWYXJpYW50OiAnbm9ybWFsJyxcbiAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICBsZXR0ZXJTcGFjaW5nOiAwLFxuICAgIGxpbmVIZWlnaHQ6IDAsXG4gICAgbGluZUpvaW46ICdtaXRlcicsXG4gICAgbWl0ZXJMaW1pdDogMTAsXG4gICAgcGFkZGluZzogMCxcbiAgICBzdHJva2U6ICdibGFjaycsXG4gICAgc3Ryb2tlVGhpY2tuZXNzOiAwLFxuICAgIHRleHRCYXNlbGluZTogJ2FscGhhYmV0aWMnLFxuICAgIHRyaW06IGZhbHNlLFxuICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgIHdvcmRXcmFwOiBmYWxzZSxcbiAgICB3b3JkV3JhcFdpZHRoOiAxMDAsXG4gICAgbGVhZGluZzogMCxcbn07XG5cbnZhciBnZW5lcmljRm9udEZhbWlsaWVzID0gW1xuICAgICdzZXJpZicsXG4gICAgJ3NhbnMtc2VyaWYnLFxuICAgICdtb25vc3BhY2UnLFxuICAgICdjdXJzaXZlJyxcbiAgICAnZmFudGFzeScsXG4gICAgJ3N5c3RlbS11aScgXTtcblxuLyoqXG4gKiBBIFRleHRTdHlsZSBPYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gdG8gZGVjb3JhdGUgYSBUZXh0IG9iamVjdHMuXG4gKlxuICogQW4gaW5zdGFuY2UgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIFRleHQgb2JqZWN0czsgdGhlbiBjaGFuZ2luZyB0aGUgc3R5bGUgd2lsbCB1cGRhdGUgYWxsIHRleHQgb2JqZWN0cyB1c2luZyBpdC5cbiAqXG4gKiBBIHRvb2wgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSB0ZXh0IHN0eWxlIFtoZXJlXShodHRwczovL3BpeGlqcy5pby9waXhpLXRleHQtc3R5bGUpLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRleHRTdHlsZSA9IGZ1bmN0aW9uIFRleHRTdHlsZShzdHlsZSlcbntcbiAgICB0aGlzLnN0eWxlSUQgPSAwO1xuXG4gICAgdGhpcy5yZXNldCgpO1xuXG4gICAgZGVlcENvcHlQcm9wZXJ0aWVzKHRoaXMsIHN0eWxlLCBzdHlsZSk7XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBhbGlnbjogeyBjb25maWd1cmFibGU6IHRydWUgfSxicmVha1dvcmRzOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGRyb3BTaGFkb3c6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZHJvcFNoYWRvd0FscGhhOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGRyb3BTaGFkb3dBbmdsZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxkcm9wU2hhZG93Qmx1cjogeyBjb25maWd1cmFibGU6IHRydWUgfSxkcm9wU2hhZG93Q29sb3I6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZHJvcFNoYWRvd0Rpc3RhbmNlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGZpbGw6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZmlsbEdyYWRpZW50VHlwZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxmaWxsR3JhZGllbnRTdG9wczogeyBjb25maWd1cmFibGU6IHRydWUgfSxmb250RmFtaWx5OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGZvbnRTaXplOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGZvbnRTdHlsZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxmb250VmFyaWFudDogeyBjb25maWd1cmFibGU6IHRydWUgfSxmb250V2VpZ2h0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGxldHRlclNwYWNpbmc6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sbGluZUhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSxsZWFkaW5nOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGxpbmVKb2luOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG1pdGVyTGltaXQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0scGFkZGluZzogeyBjb25maWd1cmFibGU6IHRydWUgfSxzdHJva2U6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sc3Ryb2tlVGhpY2tuZXNzOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRleHRCYXNlbGluZTogeyBjb25maWd1cmFibGU6IHRydWUgfSx0cmltOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHdoaXRlU3BhY2U6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sd29yZFdyYXA6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sd29yZFdyYXBXaWR0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVGV4dFN0eWxlIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGlzIG9uZS5cbiAqIE5vdGUgdGhhdCB0aGUgb25seSB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGFyZSBjbG9uZWQuXG4gKlxuICogQHJldHVybiB7UElYSS5UZXh0U3R5bGV9IE5ldyBjbG9uZWQgVGV4dFN0eWxlIG9iamVjdFxuICovXG5UZXh0U3R5bGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKClcbntcbiAgICB2YXIgY2xvbmVkUHJvcGVydGllcyA9IHt9O1xuXG4gICAgZGVlcENvcHlQcm9wZXJ0aWVzKGNsb25lZFByb3BlcnRpZXMsIHRoaXMsIGRlZmF1bHRTdHlsZSk7XG5cbiAgICByZXR1cm4gbmV3IFRleHRTdHlsZShjbG9uZWRQcm9wZXJ0aWVzKTtcbn07XG5cbi8qKlxuICogUmVzZXRzIGFsbCBwcm9wZXJ0aWVzIHRvIHRoZSBkZWZhdWx0cyBzcGVjaWZpZWQgaW4gVGV4dFN0eWxlLnByb3RvdHlwZS5fZGVmYXVsdFxuICovXG5UZXh0U3R5bGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKClcbntcbiAgICBkZWVwQ29weVByb3BlcnRpZXModGhpcywgZGVmYXVsdFN0eWxlLCBkZWZhdWx0U3R5bGUpO1xufTtcblxuLyoqXG4gKiBBbGlnbm1lbnQgZm9yIG11bHRpbGluZSB0ZXh0ICgnbGVmdCcsICdjZW50ZXInIG9yICdyaWdodCcpLCBkb2VzIG5vdCBhZmZlY3Qgc2luZ2xlIGxpbmUgdGV4dFxuICpcbiAqIEBtZW1iZXIge3N0cmluZ31cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmFsaWduLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2FsaWduO1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5hbGlnbi5zZXQgPSBmdW5jdGlvbiAoYWxpZ24pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9hbGlnbiAhPT0gYWxpZ24pXG4gICAge1xuICAgICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIEluZGljYXRlcyBpZiBsaW5lcyBjYW4gYmUgd3JhcHBlZCB3aXRoaW4gd29yZHMsIGl0IG5lZWRzIHdvcmRXcmFwIHRvIGJlIHNldCB0byB0cnVlXG4gKlxuICogQG1lbWJlciB7Ym9vbGVhbn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmJyZWFrV29yZHMuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fYnJlYWtXb3Jkcztcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuYnJlYWtXb3Jkcy5zZXQgPSBmdW5jdGlvbiAoYnJlYWtXb3JkcykgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX2JyZWFrV29yZHMgIT09IGJyZWFrV29yZHMpXG4gICAge1xuICAgICAgICB0aGlzLl9icmVha1dvcmRzID0gYnJlYWtXb3JkcztcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgYSBkcm9wIHNoYWRvdyBmb3IgdGhlIHRleHRcbiAqXG4gKiBAbWVtYmVyIHtib29sZWFufVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuZHJvcFNoYWRvdy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9kcm9wU2hhZG93O1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5kcm9wU2hhZG93LnNldCA9IGZ1bmN0aW9uIChkcm9wU2hhZG93KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5fZHJvcFNoYWRvdyAhPT0gZHJvcFNoYWRvdylcbiAgICB7XG4gICAgICAgIHRoaXMuX2Ryb3BTaGFkb3cgPSBkcm9wU2hhZG93O1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIFNldCBhbHBoYSBmb3IgdGhlIGRyb3Agc2hhZG93XG4gKlxuICogQG1lbWJlciB7bnVtYmVyfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuZHJvcFNoYWRvd0FscGhhLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2Ryb3BTaGFkb3dBbHBoYTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZHJvcFNoYWRvd0FscGhhLnNldCA9IGZ1bmN0aW9uIChkcm9wU2hhZG93QWxwaGEpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9kcm9wU2hhZG93QWxwaGEgIT09IGRyb3BTaGFkb3dBbHBoYSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2Ryb3BTaGFkb3dBbHBoYSA9IGRyb3BTaGFkb3dBbHBoYTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBTZXQgYSBhbmdsZSBvZiB0aGUgZHJvcCBzaGFkb3dcbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5kcm9wU2hhZG93QW5nbGUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fZHJvcFNoYWRvd0FuZ2xlO1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5kcm9wU2hhZG93QW5nbGUuc2V0ID0gZnVuY3Rpb24gKGRyb3BTaGFkb3dBbmdsZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX2Ryb3BTaGFkb3dBbmdsZSAhPT0gZHJvcFNoYWRvd0FuZ2xlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZHJvcFNoYWRvd0FuZ2xlID0gZHJvcFNoYWRvd0FuZ2xlO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIFNldCBhIHNoYWRvdyBibHVyIHJhZGl1c1xuICpcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmRyb3BTaGFkb3dCbHVyLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2Ryb3BTaGFkb3dCbHVyO1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5kcm9wU2hhZG93Qmx1ci5zZXQgPSBmdW5jdGlvbiAoZHJvcFNoYWRvd0JsdXIpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9kcm9wU2hhZG93Qmx1ciAhPT0gZHJvcFNoYWRvd0JsdXIpXG4gICAge1xuICAgICAgICB0aGlzLl9kcm9wU2hhZG93Qmx1ciA9IGRyb3BTaGFkb3dCbHVyO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIEEgZmlsbCBzdHlsZSB0byBiZSB1c2VkIG9uIHRoZSBkcm9wc2hhZG93IGUuZyAncmVkJywgJyMwMEZGMDAnXG4gKlxuICogQG1lbWJlciB7c3RyaW5nfG51bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmRyb3BTaGFkb3dDb2xvci5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9kcm9wU2hhZG93Q29sb3I7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLmRyb3BTaGFkb3dDb2xvci5zZXQgPSBmdW5jdGlvbiAoZHJvcFNoYWRvd0NvbG9yKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICB2YXIgb3V0cHV0Q29sb3IgPSBnZXRDb2xvcihkcm9wU2hhZG93Q29sb3IpO1xuICAgIGlmICh0aGlzLl9kcm9wU2hhZG93Q29sb3IgIT09IG91dHB1dENvbG9yKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZHJvcFNoYWRvd0NvbG9yID0gb3V0cHV0Q29sb3I7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogU2V0IGEgZGlzdGFuY2Ugb2YgdGhlIGRyb3Agc2hhZG93XG4gKlxuICogQG1lbWJlciB7bnVtYmVyfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuZHJvcFNoYWRvd0Rpc3RhbmNlLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2Ryb3BTaGFkb3dEaXN0YW5jZTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZHJvcFNoYWRvd0Rpc3RhbmNlLnNldCA9IGZ1bmN0aW9uIChkcm9wU2hhZG93RGlzdGFuY2UpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9kcm9wU2hhZG93RGlzdGFuY2UgIT09IGRyb3BTaGFkb3dEaXN0YW5jZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2Ryb3BTaGFkb3dEaXN0YW5jZSA9IGRyb3BTaGFkb3dEaXN0YW5jZTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBIGNhbnZhcyBmaWxsc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gdGhlIHRleHQgZS5nICdyZWQnLCAnIzAwRkYwMCcuXG4gKiBDYW4gYmUgYW4gYXJyYXkgdG8gY3JlYXRlIGEgZ3JhZGllbnQgZWcgWycjMDAwMDAwJywnI0ZGRkZGRiddXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9maWxsU3R5bGV8TUROfVxuICpcbiAqIEBtZW1iZXIge3N0cmluZ3xzdHJpbmdbXXxudW1iZXJ8bnVtYmVyW118Q2FudmFzR3JhZGllbnR8Q2FudmFzUGF0dGVybn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmZpbGwuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fZmlsbDtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZmlsbC5zZXQgPSBmdW5jdGlvbiAoZmlsbCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgdmFyIG91dHB1dENvbG9yID0gZ2V0Q29sb3IoZmlsbCk7XG4gICAgaWYgKHRoaXMuX2ZpbGwgIT09IG91dHB1dENvbG9yKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZmlsbCA9IG91dHB1dENvbG9yO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIElmIGZpbGwgaXMgYW4gYXJyYXkgb2YgY29sb3VycyB0byBjcmVhdGUgYSBncmFkaWVudCwgdGhpcyBjYW4gY2hhbmdlIHRoZSB0eXBlL2RpcmVjdGlvbiBvZiB0aGUgZ3JhZGllbnQuXG4gKiBTZWUge0BsaW5rIFBJWEkuVEVYVF9HUkFESUVOVH1cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5maWxsR3JhZGllbnRUeXBlLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxHcmFkaWVudFR5cGU7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLmZpbGxHcmFkaWVudFR5cGUuc2V0ID0gZnVuY3Rpb24gKGZpbGxHcmFkaWVudFR5cGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9maWxsR3JhZGllbnRUeXBlICE9PSBmaWxsR3JhZGllbnRUeXBlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZmlsbEdyYWRpZW50VHlwZSA9IGZpbGxHcmFkaWVudFR5cGU7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogSWYgZmlsbCBpcyBhbiBhcnJheSBvZiBjb2xvdXJzIHRvIGNyZWF0ZSBhIGdyYWRpZW50LCB0aGlzIGFycmF5IGNhbiBzZXQgdGhlIHN0b3AgcG9pbnRzXG4gKiAobnVtYmVycyBiZXR3ZWVuIDAgYW5kIDEpIGZvciB0aGUgY29sb3IsIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGV2ZW5seSBzcGFjaW5nIHRoZW0uXG4gKlxuICogQG1lbWJlciB7bnVtYmVyW119XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5maWxsR3JhZGllbnRTdG9wcy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9maWxsR3JhZGllbnRTdG9wcztcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZmlsbEdyYWRpZW50U3RvcHMuc2V0ID0gZnVuY3Rpb24gKGZpbGxHcmFkaWVudFN0b3BzKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAoIWFyZUFycmF5c0VxdWFsKHRoaXMuX2ZpbGxHcmFkaWVudFN0b3BzLGZpbGxHcmFkaWVudFN0b3BzKSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2ZpbGxHcmFkaWVudFN0b3BzID0gZmlsbEdyYWRpZW50U3RvcHM7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhlIGZvbnQgZmFtaWx5XG4gKlxuICogQG1lbWJlciB7c3RyaW5nfHN0cmluZ1tdfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9udEZhbWlseS5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9mb250RmFtaWx5O1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mb250RmFtaWx5LnNldCA9IGZ1bmN0aW9uIChmb250RmFtaWx5KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5mb250RmFtaWx5ICE9PSBmb250RmFtaWx5KVxuICAgIHtcbiAgICAgICAgdGhpcy5fZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhlIGZvbnQgc2l6ZVxuICogKGFzIGEgbnVtYmVyIGl0IGNvbnZlcnRzIHRvIHB4LCBidXQgYXMgYSBzdHJpbmcsIGVxdWl2YWxlbnRzIGFyZSAnMjZweCcsJzIwcHQnLCcxNjAlJyBvciAnMS42ZW0nKVxuICpcbiAqIEBtZW1iZXIge251bWJlcnxzdHJpbmd9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5mb250U2l6ZS5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9udFNpemUuc2V0ID0gZnVuY3Rpb24gKGZvbnRTaXplKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5fZm9udFNpemUgIT09IGZvbnRTaXplKVxuICAgIHtcbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgZm9udCBzdHlsZVxuICogKCdub3JtYWwnLCAnaXRhbGljJyBvciAnb2JsaXF1ZScpXG4gKlxuICogQG1lbWJlciB7c3RyaW5nfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9udFN0eWxlLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2ZvbnRTdHlsZTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9udFN0eWxlLnNldCA9IGZ1bmN0aW9uIChmb250U3R5bGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9mb250U3R5bGUgIT09IGZvbnRTdHlsZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgZm9udCB2YXJpYW50XG4gKiAoJ25vcm1hbCcgb3IgJ3NtYWxsLWNhcHMnKVxuICpcbiAqIEBtZW1iZXIge3N0cmluZ31cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmZvbnRWYXJpYW50LmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2ZvbnRWYXJpYW50O1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy5mb250VmFyaWFudC5zZXQgPSBmdW5jdGlvbiAoZm9udFZhcmlhbnQpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9mb250VmFyaWFudCAhPT0gZm9udFZhcmlhbnQpXG4gICAge1xuICAgICAgICB0aGlzLl9mb250VmFyaWFudCA9IGZvbnRWYXJpYW50O1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIFRoZSBmb250IHdlaWdodFxuICogKCdub3JtYWwnLCAnYm9sZCcsICdib2xkZXInLCAnbGlnaHRlcicgYW5kICcxMDAnLCAnMjAwJywgJzMwMCcsICc0MDAnLCAnNTAwJywgJzYwMCcsICc3MDAnLCA4MDAnIG9yICc5MDAnKVxuICpcbiAqIEBtZW1iZXIge3N0cmluZ31cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmZvbnRXZWlnaHQuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fZm9udFdlaWdodDtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMuZm9udFdlaWdodC5zZXQgPSBmdW5jdGlvbiAoZm9udFdlaWdodCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX2ZvbnRXZWlnaHQgIT09IGZvbnRXZWlnaHQpXG4gICAge1xuICAgICAgICB0aGlzLl9mb250V2VpZ2h0ID0gZm9udFdlaWdodDtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIHNwYWNpbmcgYmV0d2VlbiBsZXR0ZXJzLCBkZWZhdWx0IGlzIDBcbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5sZXR0ZXJTcGFjaW5nLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX2xldHRlclNwYWNpbmc7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLmxldHRlclNwYWNpbmcuc2V0ID0gZnVuY3Rpb24gKGxldHRlclNwYWNpbmcpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9sZXR0ZXJTcGFjaW5nICE9PSBsZXR0ZXJTcGFjaW5nKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmc7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhlIGxpbmUgaGVpZ2h0LCBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRpY2FsIHNwYWNlIHRoYXQgYSBsZXR0ZXIgdXNlc1xuICpcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmxpbmVIZWlnaHQuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fbGluZUhlaWdodDtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMubGluZUhlaWdodC5zZXQgPSBmdW5jdGlvbiAobGluZUhlaWdodCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX2xpbmVIZWlnaHQgIT09IGxpbmVIZWlnaHQpXG4gICAge1xuICAgICAgICB0aGlzLl9saW5lSGVpZ2h0ID0gbGluZUhlaWdodDtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgc3BhY2UgYmV0d2VlbiBsaW5lc1xuICpcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmxlYWRpbmcuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fbGVhZGluZztcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMubGVhZGluZy5zZXQgPSBmdW5jdGlvbiAobGVhZGluZykgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX2xlYWRpbmcgIT09IGxlYWRpbmcpXG4gICAge1xuICAgICAgICB0aGlzLl9sZWFkaW5nID0gbGVhZGluZztcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgbGluZUpvaW4gcHJvcGVydHkgc2V0cyB0aGUgdHlwZSBvZiBjb3JuZXIgY3JlYXRlZCwgaXQgY2FuIHJlc29sdmUgc3Bpa2VkIHRleHQgaXNzdWVzLlxuICogRGVmYXVsdCBpcyAnbWl0ZXInIChjcmVhdGVzIGEgc2hhcnAgY29ybmVyKS5cbiAqXG4gKiBAbWVtYmVyIHtzdHJpbmd9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5saW5lSm9pbi5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9saW5lSm9pbjtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMubGluZUpvaW4uc2V0ID0gZnVuY3Rpb24gKGxpbmVKb2luKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5fbGluZUpvaW4gIT09IGxpbmVKb2luKVxuICAgIHtcbiAgICAgICAgdGhpcy5fbGluZUpvaW4gPSBsaW5lSm9pbjtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgbWl0ZXIgbGltaXQgdG8gdXNlIHdoZW4gdXNpbmcgdGhlICdtaXRlcicgbGluZUpvaW4gbW9kZVxuICogVGhpcyBjYW4gcmVkdWNlIG9yIGluY3JlYXNlIHRoZSBzcGlraW5lc3Mgb2YgcmVuZGVyZWQgdGV4dC5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5taXRlckxpbWl0LmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX21pdGVyTGltaXQ7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLm1pdGVyTGltaXQuc2V0ID0gZnVuY3Rpb24gKG1pdGVyTGltaXQpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9taXRlckxpbWl0ICE9PSBtaXRlckxpbWl0KVxuICAgIHtcbiAgICAgICAgdGhpcy5fbWl0ZXJMaW1pdCA9IG1pdGVyTGltaXQ7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogT2NjYXNpb25hbGx5IHNvbWUgZm9udHMgYXJlIGNyb3BwZWQuIEFkZGluZyBzb21lIHBhZGRpbmcgd2lsbCBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmdcbiAqIGJ5IGFkZGluZyBwYWRkaW5nIHRvIGFsbCBzaWRlcyBvZiB0aGUgdGV4dC5cbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5wYWRkaW5nLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3BhZGRpbmc7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLnBhZGRpbmcuc2V0ID0gZnVuY3Rpb24gKHBhZGRpbmcpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl9wYWRkaW5nICE9PSBwYWRkaW5nKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmc7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogQSBjYW52YXMgZmlsbHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHRoZSB0ZXh0IHN0cm9rZVxuICogZS5nICdibHVlJywgJyNGQ0ZGMDAnXG4gKlxuICogQG1lbWJlciB7c3RyaW5nfG51bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLnN0cm9rZS5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9zdHJva2U7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLnN0cm9rZS5zZXQgPSBmdW5jdGlvbiAoc3Ryb2tlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICB2YXIgb3V0cHV0Q29sb3IgPSBnZXRDb2xvcihzdHJva2UpO1xuICAgIGlmICh0aGlzLl9zdHJva2UgIT09IG91dHB1dENvbG9yKVxuICAgIHtcbiAgICAgICAgdGhpcy5fc3Ryb2tlID0gb3V0cHV0Q29sb3I7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHN0cm9rZS5cbiAqIERlZmF1bHQgaXMgMCAobm8gc3Ryb2tlKVxuICpcbiAqIEBtZW1iZXIge251bWJlcn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLnN0cm9rZVRoaWNrbmVzcy5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl9zdHJva2VUaGlja25lc3M7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLnN0cm9rZVRoaWNrbmVzcy5zZXQgPSBmdW5jdGlvbiAoc3Ryb2tlVGhpY2tuZXNzKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5fc3Ryb2tlVGhpY2tuZXNzICE9PSBzdHJva2VUaGlja25lc3MpXG4gICAge1xuICAgICAgICB0aGlzLl9zdHJva2VUaGlja25lc3MgPSBzdHJva2VUaGlja25lc3M7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhlIGJhc2VsaW5lIG9mIHRoZSB0ZXh0IHRoYXQgaXMgcmVuZGVyZWQuXG4gKlxuICogQG1lbWJlciB7c3RyaW5nfVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMudGV4dEJhc2VsaW5lLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3RleHRCYXNlbGluZTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMudGV4dEJhc2VsaW5lLnNldCA9IGZ1bmN0aW9uICh0ZXh0QmFzZWxpbmUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl90ZXh0QmFzZWxpbmUgIT09IHRleHRCYXNlbGluZSlcbiAgICB7XG4gICAgICAgIHRoaXMuX3RleHRCYXNlbGluZSA9IHRleHRCYXNlbGluZTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUcmltIHRyYW5zcGFyZW50IGJvcmRlcnNcbiAqXG4gKiBAbWVtYmVyIHtib29sZWFufVxuICovXG5wcm90b3R5cGVBY2Nlc3NvcnMudHJpbS5nZXQgPSBmdW5jdGlvbiAoKVxue1xuICAgIHJldHVybiB0aGlzLl90cmltO1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy50cmltLnNldCA9IGZ1bmN0aW9uICh0cmltKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbntcbiAgICBpZiAodGhpcy5fdHJpbSAhPT0gdHJpbSlcbiAgICB7XG4gICAgICAgIHRoaXMuX3RyaW0gPSB0cmltO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIEhvdyBuZXdsaW5lcyBhbmQgc3BhY2VzIHNob3VsZCBiZSBoYW5kbGVkLlxuICogRGVmYXVsdCBpcyAncHJlJyAocHJlc2VydmUsIHByZXNlcnZlKS5cbiAqXG4gKiAgdmFsdWUgICB8IE5ldyBsaW5lcyB8ICAgU3BhY2VzXG4gKiAgLS0tICAgICB8IC0tLSAgICAgICB8ICAgLS0tXG4gKiAnbm9ybWFsJyB8IENvbGxhcHNlICB8ICAgQ29sbGFwc2VcbiAqICdwcmUnICAgIHwgUHJlc2VydmUgIHwgICBQcmVzZXJ2ZVxuICogJ3ByZS1saW5lJyAgIHwgUHJlc2VydmUgIHwgICBDb2xsYXBzZVxuICpcbiAqIEBtZW1iZXIge3N0cmluZ31cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLndoaXRlU3BhY2UuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gdGhpcy5fd2hpdGVTcGFjZTtcbn07XG5wcm90b3R5cGVBY2Nlc3NvcnMud2hpdGVTcGFjZS5zZXQgPSBmdW5jdGlvbiAod2hpdGVTcGFjZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG57XG4gICAgaWYgKHRoaXMuX3doaXRlU3BhY2UgIT09IHdoaXRlU3BhY2UpXG4gICAge1xuICAgICAgICB0aGlzLl93aGl0ZVNwYWNlID0gd2hpdGVTcGFjZTtcbiAgICAgICAgdGhpcy5zdHlsZUlEKys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgaWYgd29yZCB3cmFwIHNob3VsZCBiZSB1c2VkXG4gKlxuICogQG1lbWJlciB7Ym9vbGVhbn1cbiAqL1xucHJvdG90eXBlQWNjZXNzb3JzLndvcmRXcmFwLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRXcmFwO1xufTtcbnByb3RvdHlwZUFjY2Vzc29ycy53b3JkV3JhcC5zZXQgPSBmdW5jdGlvbiAod29yZFdyYXApIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl93b3JkV3JhcCAhPT0gd29yZFdyYXApXG4gICAge1xuICAgICAgICB0aGlzLl93b3JkV3JhcCA9IHdvcmRXcmFwO1xuICAgICAgICB0aGlzLnN0eWxlSUQrKztcbiAgICB9XG59O1xuXG4vKipcbiAqIFRoZSB3aWR0aCBhdCB3aGljaCB0ZXh0IHdpbGwgd3JhcCwgaXQgbmVlZHMgd29yZFdyYXAgdG8gYmUgc2V0IHRvIHRydWVcbiAqXG4gKiBAbWVtYmVyIHtudW1iZXJ9XG4gKi9cbnByb3RvdHlwZUFjY2Vzc29ycy53b3JkV3JhcFdpZHRoLmdldCA9IGZ1bmN0aW9uICgpXG57XG4gICAgcmV0dXJuIHRoaXMuX3dvcmRXcmFwV2lkdGg7XG59O1xucHJvdG90eXBlQWNjZXNzb3JzLndvcmRXcmFwV2lkdGguc2V0ID0gZnVuY3Rpb24gKHdvcmRXcmFwV2lkdGgpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xue1xuICAgIGlmICh0aGlzLl93b3JkV3JhcFdpZHRoICE9PSB3b3JkV3JhcFdpZHRoKVxuICAgIHtcbiAgICAgICAgdGhpcy5fd29yZFdyYXBXaWR0aCA9IHdvcmRXcmFwV2lkdGg7XG4gICAgICAgIHRoaXMuc3R5bGVJRCsrO1xuICAgIH1cbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZm9udCBzdHlsZSBzdHJpbmcgdG8gdXNlIGZvciBgVGV4dE1ldHJpY3MubWVhc3VyZUZvbnQoKWAuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBGb250IHN0eWxlIHN0cmluZywgZm9yIHBhc3NpbmcgdG8gYFRleHRNZXRyaWNzLm1lYXN1cmVGb250KClgXG4gKi9cblRleHRTdHlsZS5wcm90b3R5cGUudG9Gb250U3RyaW5nID0gZnVuY3Rpb24gdG9Gb250U3RyaW5nICgpXG57XG4gICAgLy8gYnVpbGQgY2FudmFzIGFwaSBmb250IHNldHRpbmcgZnJvbSBpbmRpdmlkdWFsIGNvbXBvbmVudHMuIENvbnZlcnQgYSBudW1lcmljIHRoaXMuZm9udFNpemUgdG8gcHhcbiAgICB2YXIgZm9udFNpemVTdHJpbmcgPSAodHlwZW9mIHRoaXMuZm9udFNpemUgPT09ICdudW1iZXInKSA/ICgodGhpcy5mb250U2l6ZSkgKyBcInB4XCIpIDogdGhpcy5mb250U2l6ZTtcblxuICAgIC8vIENsZWFuLXVwIGZvbnRGYW1pbHkgcHJvcGVydHkgYnkgcXVvdGluZyBlYWNoIGZvbnQgbmFtZVxuICAgIC8vIHRoaXMgd2lsbCBzdXBwb3J0IGZvbnQgbmFtZXMgd2l0aCBzcGFjZXNcbiAgICB2YXIgZm9udEZhbWlsaWVzID0gdGhpcy5mb250RmFtaWx5O1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZm9udEZhbWlseSkpXG4gICAge1xuICAgICAgICBmb250RmFtaWxpZXMgPSB0aGlzLmZvbnRGYW1pbHkuc3BsaXQoJywnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gZm9udEZhbWlsaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgIHtcbiAgICAgICAgLy8gVHJpbSBhbnkgZXh0cmEgd2hpdGUtc3BhY2VcbiAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBmb250RmFtaWxpZXNbaV0udHJpbSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGZvbnQgYWxyZWFkeSBjb250YWlucyBzdHJpbmdzXG4gICAgICAgIGlmICghKC8oW1xcXCJcXCddKVteXFwnXFxcIl0rXFwxLykudGVzdChmb250RmFtaWx5KSAmJiBnZW5lcmljRm9udEZhbWlsaWVzLmluZGV4T2YoZm9udEZhbWlseSkgPCAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb250RmFtaWx5ID0gXCJcXFwiXCIgKyBmb250RmFtaWx5ICsgXCJcXFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZm9udEZhbWlsaWVzW2ldID0gZm9udEZhbWlseTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCh0aGlzLmZvbnRTdHlsZSkgKyBcIiBcIiArICh0aGlzLmZvbnRWYXJpYW50KSArIFwiIFwiICsgKHRoaXMuZm9udFdlaWdodCkgKyBcIiBcIiArIGZvbnRTaXplU3RyaW5nICsgXCIgXCIgKyAoZm9udEZhbWlsaWVzLmpvaW4oJywnKSkpO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFRleHRTdHlsZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBoZXhhZGVjaW1hbCBjb2xvcnMgdG8gc3RyaW5ncywgYW5kIHNpbXBseSByZXR1cm4gdGhlIGNvbG9yIGlmIGl0J3MgYSBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ8bnVtYmVyW119IGNvbG9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xvciBhcyBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0U2luZ2xlQ29sb3IoY29sb3IpXG57XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ251bWJlcicpXG4gICAge1xuICAgICAgICByZXR1cm4gaGV4MnN0cmluZyhjb2xvcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnIClcbiAgICB7XG4gICAgICAgIGlmICggY29sb3IuaW5kZXhPZignMHgnKSA9PT0gMCApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbG9yID0gY29sb3IucmVwbGFjZSgnMHgnLCAnIycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9yO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBoZXhhZGVjaW1hbCBjb2xvcnMgdG8gc3RyaW5ncywgYW5kIHNpbXBseSByZXR1cm4gdGhlIGNvbG9yIGlmIGl0J3MgYSBzdHJpbmcuXG4gKiBUaGlzIHZlcnNpb24gY2FuIGFsc28gY29udmVydCBhcnJheSBvZiBjb2xvcnNcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcnxudW1iZXJbXX0gY29sb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbG9yIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBnZXRDb2xvcihjb2xvcilcbntcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGdldFNpbmdsZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvci5sZW5ndGg7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgY29sb3JbaV0gPSBnZXRTaW5nbGVDb2xvcihjb2xvcltpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgfVxufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBoZXhhZGVjaW1hbCBjb2xvcnMgdG8gc3RyaW5ncywgYW5kIHNpbXBseSByZXR1cm4gdGhlIGNvbG9yIGlmIGl0J3MgYSBzdHJpbmcuXG4gKiBUaGlzIHZlcnNpb24gY2FuIGFsc28gY29udmVydCBhcnJheSBvZiBjb2xvcnNcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheTEgRmlyc3QgYXJyYXkgdG8gY29tcGFyZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkyIFNlY29uZCBhcnJheSB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtib29sZWFufSBEbyB0aGUgYXJyYXlzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzIGluIHRoZSBzYW1lIG9yZGVyXG4gKi9cbmZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGFycmF5MSwgYXJyYXkyKVxue1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheTEpIHx8ICFBcnJheS5pc0FycmF5KGFycmF5MikpXG4gICAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGFycmF5MS5sZW5ndGggIT09IGFycmF5Mi5sZW5ndGgpXG4gICAge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyArK2kpXG4gICAge1xuICAgICAgICBpZiAoYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgb2JqZWN0IHByb3BlcnRpZXMgYXJlIGNvcGllZCBieSB2YWx1ZSwgYW5kIG5vdCBieSByZWZlcmVuY2VcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRhcmdldCBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGludG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdCBmb3IgdGhlIHByb3BlcnRpZXMgdG8gY29weVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5T2JqIE9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgbmFtZXMgd2Ugd2FudCB0byBsb29wIG92ZXJcbiAqL1xuZnVuY3Rpb24gZGVlcENvcHlQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlLCBwcm9wZXJ0eU9iaikge1xuICAgIGZvciAodmFyIHByb3AgaW4gcHJvcGVydHlPYmopIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW3Byb3BdKSkge1xuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdLnNsaWNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogVGhlIFRleHRNZXRyaWNzIG9iamVjdCByZXByZXNlbnRzIHRoZSBtZWFzdXJlbWVudCBvZiBhIGJsb2NrIG9mIHRleHQgd2l0aCBhIHNwZWNpZmllZCBzdHlsZS5cbiAqXG4gKiBgYGBqc1xuICogbGV0IHN0eWxlID0gbmV3IFBJWEkuVGV4dFN0eWxlKHtmb250RmFtaWx5IDogJ0FyaWFsJywgZm9udFNpemU6IDI0LCBmaWxsIDogMHhmZjEwMTAsIGFsaWduIDogJ2NlbnRlcid9KVxuICogbGV0IHRleHRNZXRyaWNzID0gUElYSS5UZXh0TWV0cmljcy5tZWFzdXJlVGV4dCgnWW91ciB0ZXh0Jywgc3R5bGUpXG4gKiBgYGBcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBUZXh0TWV0cmljcyA9IGZ1bmN0aW9uIFRleHRNZXRyaWNzKHRleHQsIHN0eWxlLCB3aWR0aCwgaGVpZ2h0LCBsaW5lcywgbGluZVdpZHRocywgbGluZUhlaWdodCwgbWF4TGluZVdpZHRoLCBmb250UHJvcGVydGllcylcbntcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0aGF0IHdhcyBtZWFzdXJlZFxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3R5bGUgdGhhdCB3YXMgbWVhc3VyZWRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuVGV4dFN0eWxlfVxuICAgICAqL1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZWFzdXJlZCB3aWR0aCBvZiB0aGUgdGV4dFxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtZWFzdXJlZCBoZWlnaHQgb2YgdGhlIHRleHRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxpbmVzIG9mIHRoZSB0ZXh0IGJyb2tlbiBieSBuZXcgbGluZXMgYW5kIHdyYXBwaW5nIGlzIHNwZWNpZmllZCBpbiBzdHlsZVxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nW119XG4gICAgICovXG4gICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdGhlIGxpbmUgd2lkdGhzIGZvciBlYWNoIGxpbmUgbWF0Y2hlZCB0byBgbGluZXNgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJbXX1cbiAgICAgKi9cbiAgICB0aGlzLmxpbmVXaWR0aHMgPSBsaW5lV2lkdGhzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1lYXN1cmVkIGxpbmUgaGVpZ2h0IGZvciB0aGlzIHN0eWxlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGxpbmUgd2lkdGggZm9yIGFsbCBtZWFzdXJlZCBsaW5lc1xuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMubWF4TGluZVdpZHRoID0gbWF4TGluZVdpZHRoO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZvbnQgcHJvcGVydGllcyBvYmplY3QgZnJvbSBUZXh0TWV0cmljcy5tZWFzdXJlRm9udFxuICAgICAqXG4gICAgICogQG1lbWJlciB7UElYSS5JRm9udE1ldHJpY3N9XG4gICAgICovXG4gICAgdGhpcy5mb250UHJvcGVydGllcyA9IGZvbnRQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBNZWFzdXJlcyB0aGUgc3VwcGxpZWQgc3RyaW5nIG9mIHRleHQgYW5kIHJldHVybnMgYSBSZWN0YW5nbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgdGV4dCB0byBtZWFzdXJlLlxuICogQHBhcmFtIHtQSVhJLlRleHRTdHlsZX0gc3R5bGUgLSB0aGUgdGV4dCBzdHlsZSB0byB1c2UgZm9yIG1lYXN1cmluZ1xuICogQHBhcmFtIHtib29sZWFufSBbd29yZFdyYXBdIC0gb3B0aW9uYWwgb3ZlcnJpZGUgZm9yIGlmIHdvcmQtd3JhcCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdGV4dC5cbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IFtjYW52YXNdIC0gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgY2FudmFzIHRvIHVzZSBmb3IgbWVhc3VyaW5nLlxuICogQHJldHVybiB7UElYSS5UZXh0TWV0cmljc30gbWVhc3VyZWQgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdGV4dC5cbiAqL1xuVGV4dE1ldHJpY3MubWVhc3VyZVRleHQgPSBmdW5jdGlvbiBtZWFzdXJlVGV4dCAodGV4dCwgc3R5bGUsIHdvcmRXcmFwLCBjYW52YXMpXG57XG4gICAgICAgIGlmICggY2FudmFzID09PSB2b2lkIDAgKSBjYW52YXMgPSBUZXh0TWV0cmljcy5fY2FudmFzO1xuXG4gICAgd29yZFdyYXAgPSAod29yZFdyYXAgPT09IHVuZGVmaW5lZCB8fCB3b3JkV3JhcCA9PT0gbnVsbCkgPyBzdHlsZS53b3JkV3JhcCA6IHdvcmRXcmFwO1xuICAgIHZhciBmb250ID0gc3R5bGUudG9Gb250U3RyaW5nKCk7XG4gICAgdmFyIGZvbnRQcm9wZXJ0aWVzID0gVGV4dE1ldHJpY3MubWVhc3VyZUZvbnQoZm9udCk7XG5cbiAgICAvLyBmYWxsYmFjayBpbiBjYXNlIFVBIGRpc2FsbG93IGNhbnZhcyBkYXRhIGV4dHJhY3Rpb25cbiAgICAvLyAodG9EYXRhVVJJLCBnZXRJbWFnZURhdGEgZnVuY3Rpb25zKVxuICAgIGlmIChmb250UHJvcGVydGllcy5mb250U2l6ZSA9PT0gMClcbiAgICB7XG4gICAgICAgIGZvbnRQcm9wZXJ0aWVzLmZvbnRTaXplID0gc3R5bGUuZm9udFNpemU7XG4gICAgICAgIGZvbnRQcm9wZXJ0aWVzLmFzY2VudCA9IHN0eWxlLmZvbnRTaXplO1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICBjb250ZXh0LmZvbnQgPSBmb250O1xuXG4gICAgdmFyIG91dHB1dFRleHQgPSB3b3JkV3JhcCA/IFRleHRNZXRyaWNzLndvcmRXcmFwKHRleHQsIHN0eWxlLCBjYW52YXMpIDogdGV4dDtcbiAgICB2YXIgbGluZXMgPSBvdXRwdXRUZXh0LnNwbGl0KC8oPzpcXHJcXG58XFxyfFxcbikvKTtcbiAgICB2YXIgbGluZVdpZHRocyA9IG5ldyBBcnJheShsaW5lcy5sZW5ndGgpO1xuICAgIHZhciBtYXhMaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICAgIHZhciBsaW5lV2lkdGggPSBjb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmVzW2ldKS53aWR0aCArICgobGluZXNbaV0ubGVuZ3RoIC0gMSkgKiBzdHlsZS5sZXR0ZXJTcGFjaW5nKTtcblxuICAgICAgICBsaW5lV2lkdGhzW2ldID0gbGluZVdpZHRoO1xuICAgICAgICBtYXhMaW5lV2lkdGggPSBNYXRoLm1heChtYXhMaW5lV2lkdGgsIGxpbmVXaWR0aCk7XG4gICAgfVxuICAgIHZhciB3aWR0aCA9IG1heExpbmVXaWR0aCArIHN0eWxlLnN0cm9rZVRoaWNrbmVzcztcblxuICAgIGlmIChzdHlsZS5kcm9wU2hhZG93KVxuICAgIHtcbiAgICAgICAgd2lkdGggKz0gc3R5bGUuZHJvcFNoYWRvd0Rpc3RhbmNlO1xuICAgIH1cblxuICAgIHZhciBsaW5lSGVpZ2h0ID0gc3R5bGUubGluZUhlaWdodCB8fCBmb250UHJvcGVydGllcy5mb250U2l6ZSArIHN0eWxlLnN0cm9rZVRoaWNrbmVzcztcbiAgICB2YXIgaGVpZ2h0ID0gTWF0aC5tYXgobGluZUhlaWdodCwgZm9udFByb3BlcnRpZXMuZm9udFNpemUgKyBzdHlsZS5zdHJva2VUaGlja25lc3MpXG4gICAgICAgICsgKChsaW5lcy5sZW5ndGggLSAxKSAqIChsaW5lSGVpZ2h0ICsgc3R5bGUubGVhZGluZykpO1xuXG4gICAgaWYgKHN0eWxlLmRyb3BTaGFkb3cpXG4gICAge1xuICAgICAgICBoZWlnaHQgKz0gc3R5bGUuZHJvcFNoYWRvd0Rpc3RhbmNlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGV4dE1ldHJpY3MoXG4gICAgICAgIHRleHQsXG4gICAgICAgIHN0eWxlLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBsaW5lcyxcbiAgICAgICAgbGluZVdpZHRocyxcbiAgICAgICAgbGluZUhlaWdodCArIHN0eWxlLmxlYWRpbmcsXG4gICAgICAgIG1heExpbmVXaWR0aCxcbiAgICAgICAgZm9udFByb3BlcnRpZXNcbiAgICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIG5ld2xpbmVzIHRvIGEgc3RyaW5nIHRvIGhhdmUgaXQgb3B0aW1hbGx5IGZpdCBpbnRvIHRoZSBob3Jpem9udGFsXG4gKiBib3VuZHMgc2V0IGJ5IHRoZSBUZXh0IG9iamVjdCdzIHdvcmRXcmFwV2lkdGggcHJvcGVydHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gU3RyaW5nIHRvIGFwcGx5IHdvcmQgd3JhcHBpbmcgdG9cbiAqIEBwYXJhbSB7UElYSS5UZXh0U3R5bGV9IHN0eWxlIC0gdGhlIHN0eWxlIHRvIHVzZSB3aGVuIHdyYXBwaW5nXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBbY2FudmFzXSAtIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGNhbnZhcyB0byB1c2UgZm9yIG1lYXN1cmluZy5cbiAqIEByZXR1cm4ge3N0cmluZ30gTmV3IHN0cmluZyB3aXRoIG5ldyBsaW5lcyBhcHBsaWVkIHdoZXJlIHJlcXVpcmVkXG4gKi9cblRleHRNZXRyaWNzLndvcmRXcmFwID0gZnVuY3Rpb24gd29yZFdyYXAgKHRleHQsIHN0eWxlLCBjYW52YXMpXG57XG4gICAgICAgIGlmICggY2FudmFzID09PSB2b2lkIDAgKSBjYW52YXMgPSBUZXh0TWV0cmljcy5fY2FudmFzO1xuXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIHZhciB3aWR0aCA9IDA7XG4gICAgdmFyIGxpbmUgPSAnJztcbiAgICB2YXIgbGluZXMgPSAnJztcblxuICAgIHZhciBjYWNoZSA9IHt9O1xuICAgIHZhciBsZXR0ZXJTcGFjaW5nID0gc3R5bGUubGV0dGVyU3BhY2luZztcbiAgICAgICAgdmFyIHdoaXRlU3BhY2UgPSBzdHlsZS53aGl0ZVNwYWNlO1xuXG4gICAgLy8gSG93IHRvIGhhbmRsZSB3aGl0ZXNwYWNlc1xuICAgIHZhciBjb2xsYXBzZVNwYWNlcyA9IFRleHRNZXRyaWNzLmNvbGxhcHNlU3BhY2VzKHdoaXRlU3BhY2UpO1xuICAgIHZhciBjb2xsYXBzZU5ld2xpbmVzID0gVGV4dE1ldHJpY3MuY29sbGFwc2VOZXdsaW5lcyh3aGl0ZVNwYWNlKTtcblxuICAgIC8vIHdoZXRoZXIgb3Igbm90IHNwYWNlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBsaW5lc1xuICAgIHZhciBjYW5QcmVwZW5kU3BhY2VzID0gIWNvbGxhcHNlU3BhY2VzO1xuXG4gICAgLy8gVGhlcmUgaXMgbGV0dGVyU3BhY2luZyBhZnRlciBldmVyeSBjaGFyIGV4Y2VwdCB0aGUgbGFzdCBvbmVcbiAgICAvLyB0X2hfaV9zXycgJ19pX3NfJyAnX2Ffbl8nICdfZV94X2FfbV9wX2xfZV8nICdfIVxuICAgIC8vIHNvIGZvciBjb252ZW5pZW5jZSB0aGUgYWJvdmUgbmVlZHMgdG8gYmUgY29tcGFyZWQgdG8gd2lkdGggKyAxIGV4dHJhIGxldHRlclNwYWNlXG4gICAgLy8gdF9oX2lfc18nICdfaV9zXycgJ19hX25fJyAnX2VfeF9hX21fcF9sX2VfJyAnXyFfXG4gICAgLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG4gICAgLy8gQW5kIHRoZW4gdGhlIGZpbmFsIHNwYWNlIGlzIHNpbXBseSBubyBhcHBlbmRlZCB0byBlYWNoIGxpbmVcbiAgICB2YXIgd29yZFdyYXBXaWR0aCA9IHN0eWxlLndvcmRXcmFwV2lkdGggKyBsZXR0ZXJTcGFjaW5nO1xuXG4gICAgLy8gYnJlYWsgdGV4dCBpbnRvIHdvcmRzLCBzcGFjZXMgYW5kIG5ld2xpbmUgY2hhcnNcbiAgICB2YXIgdG9rZW5zID0gVGV4dE1ldHJpY3MudG9rZW5pemUodGV4dCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKylcbiAgICB7XG4gICAgICAgIC8vIGdldCB0aGUgd29yZCwgc3BhY2Ugb3IgbmV3bGluZUNoYXJcbiAgICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXG4gICAgICAgIC8vIGlmIHdvcmQgaXMgYSBuZXcgbGluZVxuICAgICAgICBpZiAoVGV4dE1ldHJpY3MuaXNOZXdsaW5lKHRva2VuKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8ga2VlcCB0aGUgbmV3IGxpbmVcbiAgICAgICAgICAgIGlmICghY29sbGFwc2VOZXdsaW5lcylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsaW5lcyArPSBUZXh0TWV0cmljcy5hZGRMaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgIGNhblByZXBlbmRTcGFjZXMgPSAhY29sbGFwc2VTcGFjZXM7XG4gICAgICAgICAgICAgICAgbGluZSA9ICcnO1xuICAgICAgICAgICAgICAgIHdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgd2Ugc2hvdWxkIGNvbGxhcHNlIG5ldyBsaW5lc1xuICAgICAgICAgICAgLy8gd2Ugc2ltcGx5IGNvbnZlcnQgaXQgaW50byBhIHNwYWNlXG4gICAgICAgICAgICB0b2tlbiA9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNob3VsZCBjb2xsYXBzZSByZXBlYXRlZCB3aGl0ZXNwYWNlc1xuICAgICAgICBpZiAoY29sbGFwc2VTcGFjZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGJvdGggdGhpcyBhbmQgdGhlIGxhc3QgdG9rZW5zIGZvciBzcGFjZXNcbiAgICAgICAgICAgIHZhciBjdXJySXNCcmVha2luZ1NwYWNlID0gVGV4dE1ldHJpY3MuaXNCcmVha2luZ1NwYWNlKHRva2VuKTtcbiAgICAgICAgICAgIHZhciBsYXN0SXNCcmVha2luZ1NwYWNlID0gVGV4dE1ldHJpY3MuaXNCcmVha2luZ1NwYWNlKGxpbmVbbGluZS5sZW5ndGggLSAxXSk7XG5cbiAgICAgICAgICAgIGlmIChjdXJySXNCcmVha2luZ1NwYWNlICYmIGxhc3RJc0JyZWFraW5nU3BhY2UpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgd29yZCB3aWR0aCBmcm9tIGNhY2hlIGlmIHBvc3NpYmxlXG4gICAgICAgIHZhciB0b2tlbldpZHRoID0gVGV4dE1ldHJpY3MuZ2V0RnJvbUNhY2hlKHRva2VuLCBsZXR0ZXJTcGFjaW5nLCBjYWNoZSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gd29yZCBpcyBsb25nZXIgdGhhbiBkZXNpcmVkIGJvdW5kc1xuICAgICAgICBpZiAodG9rZW5XaWR0aCA+IHdvcmRXcmFwV2lkdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZVxuICAgICAgICAgICAgaWYgKGxpbmUgIT09ICcnKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG5ld2xpbmVzIGZvciBvdmVyZmxvdyB3b3Jkc1xuICAgICAgICAgICAgICAgIGxpbmVzICs9IFRleHRNZXRyaWNzLmFkZExpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9ICcnO1xuICAgICAgICAgICAgICAgIHdpZHRoID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYnJlYWsgbGFyZ2Ugd29yZCBvdmVyIG11bHRpcGxlIGxpbmVzXG4gICAgICAgICAgICBpZiAoVGV4dE1ldHJpY3MuY2FuQnJlYWtXb3Jkcyh0b2tlbiwgc3R5bGUuYnJlYWtXb3JkcykpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gYnJlYWsgd29yZCBpbnRvIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVycyA9IFRleHRNZXRyaWNzLndvcmRXcmFwU3BsaXQodG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgLy8gbG9vcCB0aGUgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhcmFjdGVycy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGFyID0gY2hhcmFjdGVyc1tqXTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IDE7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdG9rZW5cblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyc1tqICsga10pXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IGNoYXJhY3RlcnNbaiArIGtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDaGFyID0gY2hhcltjaGFyLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IHNwbGl0IGNoYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRNZXRyaWNzLmNhbkJyZWFrQ2hhcnMobGFzdENoYXIsIG5leHRDaGFyLCB0b2tlbiwgaiwgc3R5bGUuYnJlYWtXb3JkcykpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tYmluZSBjaGFycyAmIG1vdmUgZm9yd2FyZCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICs9IG5leHRDaGFyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBqICs9IGNoYXIubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVyV2lkdGggPSBUZXh0TWV0cmljcy5nZXRGcm9tQ2FjaGUoY2hhciwgbGV0dGVyU3BhY2luZywgY2FjaGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJXaWR0aCArIHdpZHRoID4gd29yZFdyYXBXaWR0aClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgKz0gVGV4dE1ldHJpY3MuYWRkTGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhblByZXBlbmRTcGFjZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggKz0gY2hhcmFjdGVyV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBydW4gd29yZCBvdXQgb2YgdGhlIGJvdW5kc1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSB3b3JkcyBpbiB0aGlzIGxpbmUgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGZpbmlzaCB0aGF0IGxpbmUgYW5kIHN0YXJ0IGEgbmV3IG9uZVxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsaW5lcyArPSBUZXh0TWV0cmljcy5hZGRMaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0VG9rZW4gPSBpID09PSB0b2tlbnMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgIC8vIGdpdmUgaXQgaXRzIG93biBsaW5lIGlmIGl0J3Mgbm90IHRoZSBlbmRcbiAgICAgICAgICAgICAgICBsaW5lcyArPSBUZXh0TWV0cmljcy5hZGRMaW5lKHRva2VuLCAhaXNMYXN0VG9rZW4pO1xuICAgICAgICAgICAgICAgIGNhblByZXBlbmRTcGFjZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsaW5lID0gJyc7XG4gICAgICAgICAgICAgICAgd2lkdGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gd29yZCBjb3VsZCBmaXRcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyB3b3JkIHdvbid0IGZpdCBiZWNhdXNlIG9mIGV4aXN0aW5nIHdvcmRzXG4gICAgICAgICAgICAvLyBzdGFydCBhIG5ldyBsaW5lXG4gICAgICAgICAgICBpZiAodG9rZW5XaWR0aCArIHdpZHRoID4gd29yZFdyYXBXaWR0aClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYSBzcGFjZSB3ZSBkb24ndCB3YW50IGl0XG4gICAgICAgICAgICAgICAgY2FuUHJlcGVuZFNwYWNlcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgbmV3IGxpbmVcbiAgICAgICAgICAgICAgICBsaW5lcyArPSBUZXh0TWV0cmljcy5hZGRMaW5lKGxpbmUpO1xuXG4gICAgICAgICAgICAgICAgLy8gc3RhcnQgYSBuZXcgbGluZVxuICAgICAgICAgICAgICAgIGxpbmUgPSAnJztcbiAgICAgICAgICAgICAgICB3aWR0aCA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGRvbid0IGFkZCBzcGFjZXMgdG8gdGhlIGJlZ2lubmluZyBvZiBsaW5lc1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMCB8fCAhVGV4dE1ldHJpY3MuaXNCcmVha2luZ1NwYWNlKHRva2VuKSB8fCBjYW5QcmVwZW5kU3BhY2VzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgd29yZCB0byB0aGUgY3VycmVudCBsaW5lXG4gICAgICAgICAgICAgICAgbGluZSArPSB0b2tlbjtcblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB3aWR0aCBjb3VudGVyXG4gICAgICAgICAgICAgICAgd2lkdGggKz0gdG9rZW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpbmVzICs9IFRleHRNZXRyaWNzLmFkZExpbmUobGluZSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuLyoqXG4gKiBDb252aWVuaWVuY2UgZnVuY3Rpb24gZm9yIGxvZ2dpbmcgZWFjaCBsaW5lIGFkZGVkIGR1cmluZyB0aGUgd29yZFdyYXBcbiAqIG1ldGhvZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgbGluZSAgICAtIFRoZSBsaW5lIG9mIHRleHQgdG8gYWRkXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbmV3TGluZSAtIEFkZCBuZXcgbGluZSBjaGFyYWN0ZXIgdG8gZW5kXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgQSBmb3JtYXR0ZWQgbGluZVxuICovXG5UZXh0TWV0cmljcy5hZGRMaW5lID0gZnVuY3Rpb24gYWRkTGluZSAobGluZSwgbmV3TGluZSlcbntcbiAgICAgICAgaWYgKCBuZXdMaW5lID09PSB2b2lkIDAgKSBuZXdMaW5lID0gdHJ1ZTtcblxuICAgIGxpbmUgPSBUZXh0TWV0cmljcy50cmltUmlnaHQobGluZSk7XG5cbiAgICBsaW5lID0gKG5ld0xpbmUpID8gKGxpbmUgKyBcIlxcblwiKSA6IGxpbmU7XG5cbiAgICByZXR1cm4gbGluZTtcbn07XG5cbi8qKlxuICogR2V0cyAmIHNldHMgdGhlIHdpZHRocyBvZiBjYWxjdWxhdGVkIGNoYXJhY3RlcnMgaW4gYSBjYWNoZSBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgICBrZXkgICAgICAgIFRoZSBrZXlcbiAqIEBwYXJhbSAge251bWJlcn0gICAgICAgICAgICAgICAgbGV0dGVyU3BhY2luZyAgVGhlIGxldHRlciBzcGFjaW5nXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgICAgICAgICAgICAgIGNhY2hlICAgICAgVGhlIGNhY2hlXG4gKiBAcGFyYW0gIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9ICBjb250ZXh0ICAgIFRoZSBjYW52YXMgY29udGV4dFxuICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgICAgICBUaGUgZnJvbSBjYWNoZS5cbiAqL1xuVGV4dE1ldHJpY3MuZ2V0RnJvbUNhY2hlID0gZnVuY3Rpb24gZ2V0RnJvbUNhY2hlIChrZXksIGxldHRlclNwYWNpbmcsIGNhY2hlLCBjb250ZXh0KVxue1xuICAgIHZhciB3aWR0aCA9IGNhY2hlW2tleV07XG5cbiAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZClcbiAgICB7XG4gICAgICAgIHZhciBzcGFjaW5nID0gKChrZXkubGVuZ3RoKSAqIGxldHRlclNwYWNpbmcpO1xuXG4gICAgICAgIHdpZHRoID0gY29udGV4dC5tZWFzdXJlVGV4dChrZXkpLndpZHRoICsgc3BhY2luZztcbiAgICAgICAgY2FjaGVba2V5XSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiB3aWR0aDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHNob3VsZCBjb2xsYXBzZSBicmVha2luZyBzcGFjZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSAgIHdoaXRlU3BhY2UgIFRoZSBUZXh0U3R5bGUgcHJvcGVydHkgd2hpdGVTcGFjZVxuICogQHJldHVybiB7Ym9vbGVhbn0gIHNob3VsZCBjb2xsYXBzZVxuICovXG5UZXh0TWV0cmljcy5jb2xsYXBzZVNwYWNlcyA9IGZ1bmN0aW9uIGNvbGxhcHNlU3BhY2VzICh3aGl0ZVNwYWNlKVxue1xuICAgIHJldHVybiAod2hpdGVTcGFjZSA9PT0gJ25vcm1hbCcgfHwgd2hpdGVTcGFjZSA9PT0gJ3ByZS1saW5lJyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB3ZSBzaG91bGQgY29sbGFwc2UgbmV3TGluZSBjaGFyc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgd2hpdGVTcGFjZSAgVGhlIHdoaXRlIHNwYWNlXG4gKiBAcmV0dXJuIHtib29sZWFufSAgc2hvdWxkIGNvbGxhcHNlXG4gKi9cblRleHRNZXRyaWNzLmNvbGxhcHNlTmV3bGluZXMgPSBmdW5jdGlvbiBjb2xsYXBzZU5ld2xpbmVzICh3aGl0ZVNwYWNlKVxue1xuICAgIHJldHVybiAod2hpdGVTcGFjZSA9PT0gJ25vcm1hbCcpO1xufTtcblxuLyoqXG4gKiB0cmltcyBicmVha2luZyB3aGl0ZXNwYWNlcyBmcm9tIHN0cmluZ1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0ZXh0ICBUaGUgdGV4dFxuICogQHJldHVybiB7c3RyaW5nfSAgdHJpbW1lZCBzdHJpbmdcbiAqL1xuVGV4dE1ldHJpY3MudHJpbVJpZ2h0ID0gZnVuY3Rpb24gdHJpbVJpZ2h0ICh0ZXh0KVxue1xuICAgIGlmICh0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycpXG4gICAge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IHRleHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAge1xuICAgICAgICB2YXIgY2hhciA9IHRleHRbaV07XG5cbiAgICAgICAgaWYgKCFUZXh0TWV0cmljcy5pc0JyZWFraW5nU3BhY2UoY2hhcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXh0O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGNoYXIgaXMgYSBuZXdsaW5lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBjaGFyICBUaGUgY2hhcmFjdGVyXG4gKiBAcmV0dXJuIHtib29sZWFufSAgVHJ1ZSBpZiBuZXdsaW5lLCBGYWxzZSBvdGhlcndpc2UuXG4gKi9cblRleHRNZXRyaWNzLmlzTmV3bGluZSA9IGZ1bmN0aW9uIGlzTmV3bGluZSAoY2hhcilcbntcbiAgICBpZiAodHlwZW9mIGNoYXIgIT09ICdzdHJpbmcnKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAoVGV4dE1ldHJpY3MuX25ld2xpbmVzLmluZGV4T2YoY2hhci5jaGFyQ29kZUF0KDApKSA+PSAwKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBjaGFyIGlzIGEgYnJlYWtpbmcgd2hpdGVzcGFjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7c3RyaW5nfSAgY2hhciAgVGhlIGNoYXJhY3RlclxuICogQHJldHVybiB7Ym9vbGVhbn0gIFRydWUgaWYgd2hpdGVzcGFjZSwgRmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5UZXh0TWV0cmljcy5pc0JyZWFraW5nU3BhY2UgPSBmdW5jdGlvbiBpc0JyZWFraW5nU3BhY2UgKGNoYXIpXG57XG4gICAgaWYgKHR5cGVvZiBjaGFyICE9PSAnc3RyaW5nJylcbiAgICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFRleHRNZXRyaWNzLl9icmVha2luZ1NwYWNlcy5pbmRleE9mKGNoYXIuY2hhckNvZGVBdCgwKSkgPj0gMCk7XG59O1xuXG4vKipcbiAqIFNwbGl0cyBhIHN0cmluZyBpbnRvIHdvcmRzLCBicmVha2luZy1zcGFjZXMgYW5kIG5ld0xpbmUgY2hhcmFjdGVyc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0ZXh0ICAgVGhlIHRleHRcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSAgQSB0b2tlbml6ZWQgYXJyYXlcbiAqL1xuVGV4dE1ldHJpY3MudG9rZW5pemUgPSBmdW5jdGlvbiB0b2tlbml6ZSAodGV4dClcbntcbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIHRva2VuID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgY2hhciA9IHRleHRbaV07XG5cbiAgICAgICAgaWYgKFRleHRNZXRyaWNzLmlzQnJlYWtpbmdTcGFjZShjaGFyKSB8fCBUZXh0TWV0cmljcy5pc05ld2xpbmUoY2hhcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gJycpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIHRva2VuID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRva2Vucy5wdXNoKGNoYXIpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRva2VuICs9IGNoYXI7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuICE9PSAnJylcbiAgICB7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zO1xufTtcblxuLyoqXG4gKiBPdmVycmlkYWJsZSBoZWxwZXIgbWV0aG9kIHVzZWQgaW50ZXJuYWxseSBieSBUZXh0TWV0cmljcywgZXhwb3NlZCB0byBhbGxvdyBjdXN0b21pemluZyB0aGUgY2xhc3MncyBiZWhhdmlvci5cbiAqXG4gKiBJdCBhbGxvd3Mgb25lIHRvIGN1c3RvbWlzZSB3aGljaCB3b3JkcyBzaG91bGQgYnJlYWtcbiAqIEV4YW1wbGVzIGFyZSBpZiB0aGUgdG9rZW4gaXMgQ0pLIG9yIG51bWJlcnMuXG4gKiBJdCBtdXN0IHJldHVybiBhIGJvb2xlYW4uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgdG9rZW4gICBUaGUgdG9rZW5cbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBicmVha1dvcmRzICBUaGUgc3R5bGUgYXR0ciBicmVhayB3b3Jkc1xuICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciB0byBicmVhayB3b3JkIG9yIG5vdFxuICovXG5UZXh0TWV0cmljcy5jYW5CcmVha1dvcmRzID0gZnVuY3Rpb24gY2FuQnJlYWtXb3JkcyAodG9rZW4sIGJyZWFrV29yZHMpXG57XG4gICAgcmV0dXJuIGJyZWFrV29yZHM7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRhYmxlIGhlbHBlciBtZXRob2QgdXNlZCBpbnRlcm5hbGx5IGJ5IFRleHRNZXRyaWNzLCBleHBvc2VkIHRvIGFsbG93IGN1c3RvbWl6aW5nIHRoZSBjbGFzcydzIGJlaGF2aW9yLlxuICpcbiAqIEl0IGFsbG93cyBvbmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYWlyIG9mIGNoYXJhY3RlcnNcbiAqIHNob3VsZCBiZSBicm9rZW4gYnkgbmV3bGluZXNcbiAqIEZvciBleGFtcGxlIGNlcnRhaW4gY2hhcmFjdGVycyBpbiBDSksgbGFuZ3Mgb3IgbnVtYmVycy5cbiAqIEl0IG11c3QgcmV0dXJuIGEgYm9vbGVhbi5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBjaGFyICBUaGUgY2hhcmFjdGVyXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBuZXh0Q2hhciAgVGhlIG5leHQgY2hhcmFjdGVyXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0b2tlbiBUaGUgdG9rZW4vd29yZCB0aGUgY2hhcmFjdGVycyBhcmUgZnJvbVxuICogQHBhcmFtICB7bnVtYmVyfSAgaW5kZXggVGhlIGluZGV4IGluIHRoZSB0b2tlbiBvZiB0aGUgY2hhclxuICogQHBhcmFtICB7Ym9vbGVhbn0gIGJyZWFrV29yZHMgIFRoZSBzdHlsZSBhdHRyIGJyZWFrIHdvcmRzXG4gKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIHRvIGJyZWFrIHdvcmQgb3Igbm90XG4gKi9cblRleHRNZXRyaWNzLmNhbkJyZWFrQ2hhcnMgPSBmdW5jdGlvbiBjYW5CcmVha0NoYXJzIChjaGFyLCBuZXh0Q2hhciwgdG9rZW4sIGluZGV4LCBicmVha1dvcmRzKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG57XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIE92ZXJyaWRhYmxlIGhlbHBlciBtZXRob2QgdXNlZCBpbnRlcm5hbGx5IGJ5IFRleHRNZXRyaWNzLCBleHBvc2VkIHRvIGFsbG93IGN1c3RvbWl6aW5nIHRoZSBjbGFzcydzIGJlaGF2aW9yLlxuICpcbiAqIEl0IGlzIGNhbGxlZCB3aGVuIGEgdG9rZW4gKHVzdWFsbHkgYSB3b3JkKSBoYXMgdG8gYmUgc3BsaXQgaW50byBzZXBhcmF0ZSBwaWVjZXNcbiAqIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgcG9pbnQgdG8gYnJlYWsgYSB3b3JkLlxuICogSXQgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgY2hhcmFjdGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29ycmVjdGx5IHNwbGl0cyBlbW9qaXMsIGVnIFwi8J+kqvCfpKpcIiB3aWxsIHJlc3VsdCBpbiB0d28gZWxlbWVudCBhcnJheSwgZWFjaCB3aXRoIG9uZSBlbW9qaS5cbiAqIFRleHRNZXRyaWNzLndvcmRXcmFwU3BsaXQgPSAodG9rZW4pID0+IFsuLi50b2tlbl07XG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgdG9rZW4gVGhlIHRva2VuIHRvIHNwbGl0XG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gVGhlIGNoYXJhY3RlcnMgb2YgdGhlIHRva2VuXG4gKi9cblRleHRNZXRyaWNzLndvcmRXcmFwU3BsaXQgPSBmdW5jdGlvbiB3b3JkV3JhcFNwbGl0ICh0b2tlbilcbntcbiAgICByZXR1cm4gdG9rZW4uc3BsaXQoJycpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhc2NlbnQsIGRlc2NlbnQgYW5kIGZvbnRTaXplIG9mIGEgZ2l2ZW4gZm9udC1zdHlsZVxuICpcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb250IC0gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3R5bGUgb2YgdGhlIGZvbnRcbiAqIEByZXR1cm4ge1BJWEkuSUZvbnRNZXRyaWNzfSBGb250IHByb3BlcnRpZXMgb2JqZWN0XG4gKi9cblRleHRNZXRyaWNzLm1lYXN1cmVGb250ID0gZnVuY3Rpb24gbWVhc3VyZUZvbnQgKGZvbnQpXG57XG4gICAgLy8gYXMgdGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgcHJlcGFyaW5nIGFzc2V0cywgZG9uJ3QgcmVjYWxjdWxhdGUgdGhpbmdzIGlmIHdlIGRvbid0IG5lZWQgdG9cbiAgICBpZiAoVGV4dE1ldHJpY3MuX2ZvbnRzW2ZvbnRdKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIFRleHRNZXRyaWNzLl9mb250c1tmb250XTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydGllcyA9IHt9O1xuXG4gICAgdmFyIGNhbnZhcyA9IFRleHRNZXRyaWNzLl9jYW52YXM7XG4gICAgdmFyIGNvbnRleHQgPSBUZXh0TWV0cmljcy5fY29udGV4dDtcblxuICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG5cbiAgICB2YXIgbWV0cmljc1N0cmluZyA9IFRleHRNZXRyaWNzLk1FVFJJQ1NfU1RSSU5HICsgVGV4dE1ldHJpY3MuQkFTRUxJTkVfU1lNQk9MO1xuICAgIHZhciB3aWR0aCA9IE1hdGguY2VpbChjb250ZXh0Lm1lYXN1cmVUZXh0KG1ldHJpY3NTdHJpbmcpLndpZHRoKTtcbiAgICB2YXIgYmFzZWxpbmUgPSBNYXRoLmNlaWwoY29udGV4dC5tZWFzdXJlVGV4dChUZXh0TWV0cmljcy5CQVNFTElORV9TWU1CT0wpLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gMiAqIGJhc2VsaW5lO1xuXG4gICAgYmFzZWxpbmUgPSBiYXNlbGluZSAqIFRleHRNZXRyaWNzLkJBU0VMSU5FX01VTFRJUExJRVIgfCAwO1xuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyNmMDAnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBjb250ZXh0LmZvbnQgPSBmb250O1xuXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSAnIzAwMCc7XG4gICAgY29udGV4dC5maWxsVGV4dChtZXRyaWNzU3RyaW5nLCAwLCBiYXNlbGluZSk7XG5cbiAgICB2YXIgaW1hZ2VkYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YTtcbiAgICB2YXIgcGl4ZWxzID0gaW1hZ2VkYXRhLmxlbmd0aDtcbiAgICB2YXIgbGluZSA9IHdpZHRoICogNDtcblxuICAgIHZhciBpID0gMDtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgc3RvcCA9IGZhbHNlO1xuXG4gICAgLy8gYXNjZW50LiBzY2FuIGZyb20gdG9wIHRvIGJvdHRvbSB1bnRpbCB3ZSBmaW5kIGEgbm9uIHJlZCBwaXhlbFxuICAgIGZvciAoaSA9IDA7IGkgPCBiYXNlbGluZTsgKytpKVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lOyBqICs9IDQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChpbWFnZWRhdGFbaWR4ICsgal0gIT09IDI1NSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0b3ApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkeCArPSBsaW5lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wZXJ0aWVzLmFzY2VudCA9IGJhc2VsaW5lIC0gaTtcblxuICAgIGlkeCA9IHBpeGVscyAtIGxpbmU7XG4gICAgc3RvcCA9IGZhbHNlO1xuXG4gICAgLy8gZGVzY2VudC4gc2NhbiBmcm9tIGJvdHRvbSB0byB0b3AgdW50aWwgd2UgZmluZCBhIG5vbiByZWQgcGl4ZWxcbiAgICBmb3IgKGkgPSBoZWlnaHQ7IGkgPiBiYXNlbGluZTsgLS1pKVxuICAgIHtcbiAgICAgICAgZm9yICh2YXIgaiQxID0gMDsgaiQxIDwgbGluZTsgaiQxICs9IDQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmIChpbWFnZWRhdGFbaWR4ICsgaiQxXSAhPT0gMjU1KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdG9wKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZHggLT0gbGluZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvcGVydGllcy5kZXNjZW50ID0gaSAtIGJhc2VsaW5lO1xuICAgIHByb3BlcnRpZXMuZm9udFNpemUgPSBwcm9wZXJ0aWVzLmFzY2VudCArIHByb3BlcnRpZXMuZGVzY2VudDtcblxuICAgIFRleHRNZXRyaWNzLl9mb250c1tmb250XSA9IHByb3BlcnRpZXM7XG5cbiAgICByZXR1cm4gcHJvcGVydGllcztcbn07XG5cbi8qKlxuICogQ2xlYXIgZm9udCBtZXRyaWNzIGluIG1ldHJpY3MgY2FjaGUuXG4gKlxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IFtmb250XSAtIGZvbnQgbmFtZS4gSWYgZm9udCBuYW1lIG5vdCBzZXQgdGhlbiBjbGVhciBjYWNoZSBmb3IgYWxsIGZvbnRzLlxuICovXG5UZXh0TWV0cmljcy5jbGVhck1ldHJpY3MgPSBmdW5jdGlvbiBjbGVhck1ldHJpY3MgKGZvbnQpXG57XG4gICAgICAgIGlmICggZm9udCA9PT0gdm9pZCAwICkgZm9udCA9ICcnO1xuXG4gICAgaWYgKGZvbnQpXG4gICAge1xuICAgICAgICBkZWxldGUgVGV4dE1ldHJpY3MuX2ZvbnRzW2ZvbnRdO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICBUZXh0TWV0cmljcy5fZm9udHMgPSB7fTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEludGVybmFsIHJldHVybiBvYmplY3QgZm9yIHtAbGluayBQSVhJLlRleHRNZXRyaWNzLm1lYXN1cmVGb250IGBUZXh0TWV0cmljcy5tZWFzdXJlRm9udGB9LlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZvbnRNZXRyaWNzXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXNjZW50IC0gVGhlIGFzY2VudCBkaXN0YW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlc2NlbnQgLSBUaGUgZGVzY2VudCBkaXN0YW5jZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZvbnRTaXplIC0gRm9udCBzaXplIGZyb20gYXNjZW50IHRvIGRlc2NlbnRcbiAqIEBtZW1iZXJvZiBQSVhJLlRleHRNZXRyaWNzXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjYW52YXMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeVxuICAgIHtcbiAgICAgICAgLy8gT2Zmc2NyZWVuQ2FudmFzMkQgbWVhc3VyZVRleHQgY2FuIGJlIHVwIHRvIDQwJSBmYXN0ZXIuXG4gICAgICAgIHZhciBjID0gbmV3IE9mZnNjcmVlbkNhbnZhcygwLCAwKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBjLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5tZWFzdXJlVGV4dClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgfVxuICAgIGNhdGNoIChleClcbiAgICB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB9XG59KSgpO1xuXG5jYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTA7XG5cbi8qKlxuICogQ2FjaGVkIGNhbnZhcyBlbGVtZW50IGZvciBtZWFzdXJpbmcgdGV4dFxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLlRleHRNZXRyaWNzXG4gKiBAdHlwZSB7SFRNTENhbnZhc0VsZW1lbnR9XG4gKiBAcHJpdmF0ZVxuICovXG5UZXh0TWV0cmljcy5fY2FudmFzID0gY2FudmFzO1xuXG4vKipcbiAqIENhY2hlIGZvciBjb250ZXh0IHRvIHVzZS5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5UZXh0TWV0cmljc1xuICogQHR5cGUge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH1cbiAqIEBwcml2YXRlXG4gKi9cblRleHRNZXRyaWNzLl9jb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbi8qKlxuICogQ2FjaGUgb2Yge0BzZWUgUElYSS5UZXh0TWV0cmljcy5Gb250TWV0cmljc30gb2JqZWN0cy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5UZXh0TWV0cmljc1xuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblRleHRNZXRyaWNzLl9mb250cyA9IHt9O1xuXG4vKipcbiAqIFN0cmluZyB1c2VkIGZvciBjYWxjdWxhdGUgZm9udCBtZXRyaWNzLlxuICogVGhlc2UgY2hhcmFjdGVycyBhcmUgYWxsIHRhbGwgdG8gaGVscCBjYWxjdWxhdGUgdGhlIGhlaWdodCByZXF1aXJlZCBmb3IgdGV4dC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyb2YgUElYSS5UZXh0TWV0cmljc1xuICogQG5hbWUgTUVUUklDU19TVFJJTkdcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAZGVmYXVsdCB8w4lxw4VcbiAqL1xuVGV4dE1ldHJpY3MuTUVUUklDU19TVFJJTkcgPSAnfMOJccOFJztcblxuLyoqXG4gKiBCYXNlbGluZSBzeW1ib2wgZm9yIGNhbGN1bGF0ZSBmb250IG1ldHJpY3MuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIFBJWEkuVGV4dE1ldHJpY3NcbiAqIEBuYW1lIEJBU0VMSU5FX1NZTUJPTFxuICogQHR5cGUge3N0cmluZ31cbiAqIEBkZWZhdWx0IE1cbiAqL1xuVGV4dE1ldHJpY3MuQkFTRUxJTkVfU1lNQk9MID0gJ00nO1xuXG4vKipcbiAqIEJhc2VsaW5lIG11bHRpcGxpZXIgZm9yIGNhbGN1bGF0ZSBmb250IG1ldHJpY3MuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIFBJWEkuVGV4dE1ldHJpY3NcbiAqIEBuYW1lIEJBU0VMSU5FX01VTFRJUExJRVJcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAZGVmYXVsdCAxLjRcbiAqL1xuVGV4dE1ldHJpY3MuQkFTRUxJTkVfTVVMVElQTElFUiA9IDEuNDtcblxuLyoqXG4gKiBDYWNoZSBvZiBuZXcgbGluZSBjaGFycy5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSS5UZXh0TWV0cmljc1xuICogQHR5cGUge251bWJlcltdfVxuICogQHByaXZhdGVcbiAqL1xuVGV4dE1ldHJpY3MuX25ld2xpbmVzID0gW1xuICAgIDB4MDAwQSwgLy8gbGluZSBmZWVkXG4gICAgMHgwMDBEIF07XG5cbi8qKlxuICogQ2FjaGUgb2YgYnJlYWtpbmcgc3BhY2VzLlxuICpcbiAqIEBtZW1iZXJvZiBQSVhJLlRleHRNZXRyaWNzXG4gKiBAdHlwZSB7bnVtYmVyW119XG4gKiBAcHJpdmF0ZVxuICovXG5UZXh0TWV0cmljcy5fYnJlYWtpbmdTcGFjZXMgPSBbXG4gICAgMHgwMDA5LCAvLyBjaGFyYWN0ZXIgdGFidWxhdGlvblxuICAgIDB4MDAyMCwgLy8gc3BhY2VcbiAgICAweDIwMDAsIC8vIGVuIHF1YWRcbiAgICAweDIwMDEsIC8vIGVtIHF1YWRcbiAgICAweDIwMDIsIC8vIGVuIHNwYWNlXG4gICAgMHgyMDAzLCAvLyBlbSBzcGFjZVxuICAgIDB4MjAwNCwgLy8gdGhyZWUtcGVyLWVtIHNwYWNlXG4gICAgMHgyMDA1LCAvLyBmb3VyLXBlci1lbSBzcGFjZVxuICAgIDB4MjAwNiwgLy8gc2l4LXBlci1lbSBzcGFjZVxuICAgIDB4MjAwOCwgLy8gcHVuY3R1YXRpb24gc3BhY2VcbiAgICAweDIwMDksIC8vIHRoaW4gc3BhY2VcbiAgICAweDIwMEEsIC8vIGhhaXIgc3BhY2VcbiAgICAweDIwNUYsIC8vIG1lZGl1bSBtYXRoZW1hdGljYWwgc3BhY2VcbiAgICAweDMwMDAgXTtcblxuLyoqXG4gKiBBIG51bWJlciwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIG51bWJlci5cbiAqXG4gKiBAbWVtYmVyb2YgUElYSVxuICogQHR5cGVkZWYgSUZvbnRNZXRyaWNzXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXNjZW50IC0gRm9udCBhc2NlbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZXNjZW50IC0gRm9udCBkZXNjZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gZm9udFNpemUgLSBGb250IHNpemVcbiAqL1xuXG4vKiBlc2xpbnQgbWF4LWRlcHRoOiBbMiwgOF0gKi9cblxudmFyIGRlZmF1bHREZXN0cm95T3B0aW9ucyA9IHtcbiAgICB0ZXh0dXJlOiB0cnVlLFxuICAgIGNoaWxkcmVuOiBmYWxzZSxcbiAgICBiYXNlVGV4dHVyZTogdHJ1ZSxcbn07XG5cbi8qKlxuICogQSBUZXh0IE9iamVjdCB3aWxsIGNyZWF0ZSBhIGxpbmUgb3IgbXVsdGlwbGUgbGluZXMgb2YgdGV4dC5cbiAqXG4gKiBUaGUgdGV4dCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBbQ2FudmFzIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc19BUEkpLlxuICpcbiAqIFRoZSBwcmltYXJ5IGFkdmFudGFnZSBvZiB0aGlzIGNsYXNzIG92ZXIgQml0bWFwVGV4dCBpcyB0aGF0IHlvdSBoYXZlIGdyZWF0IGNvbnRyb2wgb3ZlciB0aGUgc3R5bGUgb2YgdGhlIG5leHQsXG4gKiB3aGljaCB5b3UgY2FuIGNoYW5nZSBhdCBydW50aW1lLlxuICpcbiAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZXMgaXMgdGhhdCBlYWNoIHBpZWNlIG9mIHRleHQgaGFzIGl0J3Mgb3duIHRleHR1cmUsIHdoaWNoIGNhbiB1c2UgbW9yZSBtZW1vcnkuXG4gKiBXaGVuIHRleHQgY2hhbmdlcywgdGhpcyB0ZXh0dXJlIGhhcyB0byBiZSByZS1nZW5lcmF0ZWQgYW5kIHJlLXVwbG9hZGVkIHRvIHRoZSBHUFUsIHRha2luZyB1cCB0aW1lLlxuICpcbiAqIFRvIHNwbGl0IGEgbGluZSB5b3UgY2FuIHVzZSAnXFxuJyBpbiB5b3VyIHRleHQgc3RyaW5nLCBvciwgb24gdGhlIGBzdHlsZWAgb2JqZWN0LFxuICogY2hhbmdlIGl0cyBgd29yZFdyYXBgIHByb3BlcnR5IHRvIHRydWUgYW5kIGFuZCBnaXZlIHRoZSBgd29yZFdyYXBXaWR0aGAgcHJvcGVydHkgYSB2YWx1ZS5cbiAqXG4gKiBBIFRleHQgY2FuIGJlIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIHN0cmluZyBhbmQgYSBzdHlsZSBvYmplY3QsXG4gKiB3aGljaCBjYW4gYmUgZ2VuZXJhdGVkIFtoZXJlXShodHRwczovL3BpeGlqcy5pby9waXhpLXRleHQtc3R5bGUpLlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgdGV4dCA9IG5ldyBQSVhJLlRleHQoJ1RoaXMgaXMgYSBQaXhpSlMgdGV4dCcse2ZvbnRGYW1pbHkgOiAnQXJpYWwnLCBmb250U2l6ZTogMjQsIGZpbGwgOiAweGZmMTAxMCwgYWxpZ24gOiAnY2VudGVyJ30pO1xuICogYGBgXG4gKlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBQSVhJLlNwcml0ZVxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRleHQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTcHJpdGUpIHtcbiAgICBmdW5jdGlvbiBUZXh0KHRleHQsIHN0eWxlLCBjYW52YXMpXG4gICAge1xuICAgICAgICB2YXIgb3duQ2FudmFzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFjYW52YXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgb3duQ2FudmFzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDM7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAzO1xuXG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS5mcm9tKGNhbnZhcyk7XG5cbiAgICAgICAgdGV4dHVyZS5vcmlnID0gbmV3IFJlY3RhbmdsZSgpO1xuICAgICAgICB0ZXh0dXJlLnRyaW0gPSBuZXcgUmVjdGFuZ2xlKCk7XG5cbiAgICAgICAgU3ByaXRlLmNhbGwodGhpcywgdGV4dHVyZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEtlZXAgdHJhY2sgaWYgdGhpcyBUZXh0IG9iamVjdCBjcmVhdGVkIGl0J3Mgb3duIGNhbnZhc1xuICAgICAgICAgKiBlbGVtZW50IChgdHJ1ZWApIG9yIHVzZXMgdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50IChgZmFsc2VgKS5cbiAgICAgICAgICogVXNlZCB0byB3b3JrYXJvdW5kIGEgR0MgaXNzdWVzIHdpdGggU2FmYXJpIDwgMTMgd2hlblxuICAgICAgICAgKiBkZXN0cm95aW5nIFRleHQuIFNlZSBgZGVzdHJveWAgZm9yIG1vcmUgaW5mby5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX293bkNhbnZhcyA9IG93bkNhbnZhcztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhbnZhcyBlbGVtZW50IHRoYXQgZXZlcnl0aGluZyBpcyBkcmF3biB0b1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtIVE1MQ2FudmFzRWxlbWVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY2FudmFzIDJkIGNvbnRleHQgdGhhdCBldmVyeXRoaW5nIGlzIGRyYXduIHdpdGhcbiAgICAgICAgICogQG1lbWJlciB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHJlc29sdXRpb24gLyBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgdGhlIGNhbnZhcy5cbiAgICAgICAgICogVGhpcyBpcyBzZXQgdG8gYXV0b21hdGljYWxseSBtYXRjaCB0aGUgcmVuZGVyZXIgcmVzb2x1dGlvbiBieSBkZWZhdWx0LCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyBtYW51YWxseS5cbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXNvbHV0aW9uID0gc2V0dGluZ3MuUkVTT0xVVElPTjtcbiAgICAgICAgdGhpcy5fYXV0b1Jlc29sdXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcml2YXRlIHRyYWNrZXIgZm9yIHRoZSBjdXJyZW50IHRleHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3RleHQgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcml2YXRlIHRyYWNrZXIgZm9yIHRoZSBjdXJyZW50IHN0eWxlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtvYmplY3R9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdHlsZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcml2YXRlIGxpc3RlbmVyIHRvIHRyYWNrIHN0eWxlIGNoYW5nZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge0Z1bmN0aW9ufVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3R5bGVMaXN0ZW5lciA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByaXZhdGUgdHJhY2tlciBmb3IgdGhlIGN1cnJlbnQgZm9udC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZm9udCA9ICcnO1xuXG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcblxuICAgICAgICB0aGlzLmxvY2FsU3R5bGVJRCA9IC0xO1xuICAgIH1cblxuICAgIGlmICggU3ByaXRlICkgVGV4dC5fX3Byb3RvX18gPSBTcHJpdGU7XG4gICAgVGV4dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTcHJpdGUgJiYgU3ByaXRlLnByb3RvdHlwZSApO1xuICAgIFRleHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dDtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSxzdHlsZTogeyBjb25maWd1cmFibGU6IHRydWUgfSx0ZXh0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHJlc29sdXRpb246IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGV4dCBhbmQgdXBkYXRlcyBpdCB3aGVuIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXNwZWN0RGlydHkgLSBXaGV0aGVyIHRvIGFib3J0IHVwZGF0aW5nIHRoZSB0ZXh0IGlmIHRoZSBUZXh0IGlzbid0IGRpcnR5IGFuZCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICAgICAqL1xuICAgIFRleHQucHJvdG90eXBlLnVwZGF0ZVRleHQgPSBmdW5jdGlvbiB1cGRhdGVUZXh0IChyZXNwZWN0RGlydHkpXG4gICAge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLl9zdHlsZTtcblxuICAgICAgICAvLyBjaGVjayBpZiBzdHlsZSBoYXMgY2hhbmdlZC4uXG4gICAgICAgIGlmICh0aGlzLmxvY2FsU3R5bGVJRCAhPT0gc3R5bGUuc3R5bGVJRClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3R5bGVJRCA9IHN0eWxlLnN0eWxlSUQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZGlydHkgJiYgcmVzcGVjdERpcnR5KVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mb250ID0gdGhpcy5fc3R5bGUudG9Gb250U3RyaW5nKCk7XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIHZhciBtZWFzdXJlZCA9IFRleHRNZXRyaWNzLm1lYXN1cmVUZXh0KHRoaXMuX3RleHQgfHwgJyAnLCB0aGlzLl9zdHlsZSwgdGhpcy5fc3R5bGUud29yZFdyYXAsIHRoaXMuY2FudmFzKTtcbiAgICAgICAgdmFyIHdpZHRoID0gbWVhc3VyZWQud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBtZWFzdXJlZC5oZWlnaHQ7XG4gICAgICAgIHZhciBsaW5lcyA9IG1lYXN1cmVkLmxpbmVzO1xuICAgICAgICB2YXIgbGluZUhlaWdodCA9IG1lYXN1cmVkLmxpbmVIZWlnaHQ7XG4gICAgICAgIHZhciBsaW5lV2lkdGhzID0gbWVhc3VyZWQubGluZVdpZHRocztcbiAgICAgICAgdmFyIG1heExpbmVXaWR0aCA9IG1lYXN1cmVkLm1heExpbmVXaWR0aDtcbiAgICAgICAgdmFyIGZvbnRQcm9wZXJ0aWVzID0gbWVhc3VyZWQuZm9udFByb3BlcnRpZXM7XG5cbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSBNYXRoLmNlaWwoKE1hdGgubWF4KDEsIHdpZHRoKSArIChzdHlsZS5wYWRkaW5nICogMikpICogdGhpcy5fcmVzb2x1dGlvbik7XG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IE1hdGguY2VpbCgoTWF0aC5tYXgoMSwgaGVpZ2h0KSArIChzdHlsZS5wYWRkaW5nICogMikpICogdGhpcy5fcmVzb2x1dGlvbik7XG5cbiAgICAgICAgY29udGV4dC5zY2FsZSh0aGlzLl9yZXNvbHV0aW9uLCB0aGlzLl9yZXNvbHV0aW9uKTtcblxuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcblxuICAgICAgICBjb250ZXh0LmZvbnQgPSB0aGlzLl9mb250O1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHN0eWxlLnN0cm9rZVRoaWNrbmVzcztcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSBzdHlsZS50ZXh0QmFzZWxpbmU7XG4gICAgICAgIGNvbnRleHQubGluZUpvaW4gPSBzdHlsZS5saW5lSm9pbjtcbiAgICAgICAgY29udGV4dC5taXRlckxpbWl0ID0gc3R5bGUubWl0ZXJMaW1pdDtcblxuICAgICAgICB2YXIgbGluZVBvc2l0aW9uWDtcbiAgICAgICAgdmFyIGxpbmVQb3NpdGlvblk7XG5cbiAgICAgICAgLy8gcmVxdWlyZSAyIHBhc3NlcyBpZiBhIHNoYWRvdzsgdGhlIGZpcnN0IHRvIGRyYXcgdGhlIGRyb3Agc2hhZG93LCB0aGUgc2Vjb25kIHRvIGRyYXcgdGhlIHRleHRcbiAgICAgICAgdmFyIHBhc3Nlc0NvdW50ID0gc3R5bGUuZHJvcFNoYWRvdyA/IDIgOiAxO1xuXG4gICAgICAgIC8vIEZvciB2NCwgd2UgZHJldyB0ZXh0IGF0IHRoZSBjb2xvdXJzIG9mIHRoZSBkcm9wIHNoYWRvdyB1bmRlcm5lYXRoIHRoZSBub3JtYWwgdGV4dC4gVGhpcyBnYXZlIHRoZSBjb3JyZWN0IHpJbmRleCxcbiAgICAgICAgLy8gYnV0IGZlYXR1cmVzIHN1Y2ggYXMgYWxwaGEgYW5kIHNoYWRvd2JsdXIgZGlkIG5vdCBsb29rIHJpZ2h0IGF0IGFsbCwgc2luY2Ugd2Ugd2VyZSB1c2luZyBhY3R1YWwgdGV4dCBhcyBhIHNoYWRvdy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRm9yIHY1LjAuMCwgd2UgbW92ZWQgb3ZlciB0byBqdXN0IHVzZSB0aGUgY2FudmFzIEFQSSBmb3IgZHJvcCBzaGFkb3dzLCB3aGljaCBtYWRlIHRoZW0gbG9vayBtdWNoIG5pY2VyIGFuZCBtb3JlXG4gICAgICAgIC8vIHZpc3VhbGx5IHBsZWFzZSwgYnV0IG5vdyBiZWNhdXNlIHRoZSBzdHJva2UgaXMgZHJhd24gYW5kIHRoZW4gdGhlIGZpbGwsIGRyb3Agc2hhZG93cyB3b3VsZCBhcHBlYXIgb24gYm90aCB0aGUgZmlsbFxuICAgICAgICAvLyBhbmQgdGhlIHN0cm9rZTsgYW5kIGZpbGwgZHJvcCBzaGFkb3dzIHdvdWxkIGFwcGVhciBvdmVyIHRoZSB0b3Agb2YgdGhlIHN0cm9rZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRm9yIHY1LjEuMSwgdGhlIG5ldyByb3V0ZSBpcyB0byByZXZlcnQgdG8gdjQgc3R5bGUgb2YgZHJhd2luZyB0ZXh0IGZpcnN0IHRvIGdldCB0aGUgZHJvcCBzaGFkb3dzIHVuZGVybmVhdGggbm9ybWFsXG4gICAgICAgIC8vIHRleHQsIGJ1dCBpbnN0ZWFkIGRyYXdpbmcgdGV4dCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiwgd2UnbGwgZHJhdyBpdCBvZmYgc2NyZWVuICgtcGFkZGluZ1kpLCBhbmQgdGhlbiBhZGp1c3QgdGhlXG4gICAgICAgIC8vIGRyb3Agc2hhZG93IHNvIG9ubHkgdGhhdCBhcHBlYXJzIG9uIHNjcmVlbiAoK3BhZGRpbmdZKS4gTm93IHdlJ2xsIGhhdmUgdGhlIGNvcnJlY3QgZHJhdyBvcmRlciBvZiB0aGUgc2hhZG93XG4gICAgICAgIC8vIGJlbmVhdGggdGhlIHRleHQsIHdoaWxzdCBhbHNvIGhhdmluZyB0aGUgcHJvcGVyIHRleHQgc2hhZG93IHN0eWxpbmcuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFzc2VzQ291bnQ7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGlzU2hhZG93UGFzcyA9IHN0eWxlLmRyb3BTaGFkb3cgJiYgaSA9PT0gMDtcbiAgICAgICAgICAgIHZhciBkc09mZnNldFRleHQgPSBpc1NoYWRvd1Bhc3MgPyBoZWlnaHQgKiAyIDogMDsgLy8gd2Ugb25seSB3YW50IHRoZSBkcm9wIHNoYWRvdywgc28gcHV0IHRleHQgd2F5IG9mZi1zY3JlZW5cbiAgICAgICAgICAgIHZhciBkc09mZnNldFNoYWRvdyA9IGRzT2Zmc2V0VGV4dCAqIHRoaXMucmVzb2x1dGlvbjtcblxuICAgICAgICAgICAgaWYgKGlzU2hhZG93UGFzcylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBPbiBTYWZhcmksIHRleHQgd2l0aCBncmFkaWVudCBhbmQgZHJvcCBzaGFkb3dzIHRvZ2V0aGVyIGRvIG5vdCBwb3NpdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2NhbGUgb2YgdGhlIGNhbnZhcyBpcyBub3QgMTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NzY4OVxuICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSdsbCBzZXQgdGhlIHN0eWxlcyB0byBiZSBhIHBsYWluIGJsYWNrIHdoaWxzdCBnZW5lcmF0aW5nIHRoaXMgZHJvcCBzaGFkb3dcbiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdibGFjayc7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdibGFjayc7XG5cbiAgICAgICAgICAgICAgICB2YXIgZHJvcFNoYWRvd0NvbG9yID0gc3R5bGUuZHJvcFNoYWRvd0NvbG9yO1xuICAgICAgICAgICAgICAgIHZhciByZ2IgPSBoZXgycmdiKHR5cGVvZiBkcm9wU2hhZG93Q29sb3IgPT09ICdudW1iZXInID8gZHJvcFNoYWRvd0NvbG9yIDogc3RyaW5nMmhleChkcm9wU2hhZG93Q29sb3IpKTtcblxuICAgICAgICAgICAgICAgIGNvbnRleHQuc2hhZG93Q29sb3IgPSBcInJnYmEoXCIgKyAocmdiWzBdICogMjU1KSArIFwiLFwiICsgKHJnYlsxXSAqIDI1NSkgKyBcIixcIiArIChyZ2JbMl0gKiAyNTUpICsgXCIsXCIgKyAoc3R5bGUuZHJvcFNoYWRvd0FscGhhKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc2hhZG93Qmx1ciA9IHN0eWxlLmRyb3BTaGFkb3dCbHVyO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc2hhZG93T2Zmc2V0WCA9IE1hdGguY29zKHN0eWxlLmRyb3BTaGFkb3dBbmdsZSkgKiBzdHlsZS5kcm9wU2hhZG93RGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zaGFkb3dPZmZzZXRZID0gKE1hdGguc2luKHN0eWxlLmRyb3BTaGFkb3dBbmdsZSkgKiBzdHlsZS5kcm9wU2hhZG93RGlzdGFuY2UpICsgZHNPZmZzZXRTaGFkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGNhbnZhcyB0ZXh0IHN0eWxlc1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5fZ2VuZXJhdGVGaWxsU3R5bGUoc3R5bGUsIGxpbmVzLCBtZWFzdXJlZCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuJ3QgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgZm9yIGdldHRlciBhbmQgc2V0dGVyLiBUaGUgZ2V0dGVyIHNob3VsZG4ndCBoYXZlIHRoZSBudW1iZXIgdHlwZSBhc1xuICAgICAgICAgICAgICAgIC8vICAgICAgIHRoZSBzZXR0ZXIgY29udmVydHMgdG8gc3RyaW5nLiBTZWUgdGhpcyB0aHJlYWQgZm9yIG1vcmUgZGV0YWlsczpcbiAgICAgICAgICAgICAgICAvLyAgICAgICBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzI1MjFcbiAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3R5bGUuc3Ryb2tlO1xuXG4gICAgICAgICAgICAgICAgY29udGV4dC5zaGFkb3dDb2xvciA9IDA7XG4gICAgICAgICAgICAgICAgY29udGV4dC5zaGFkb3dCbHVyID0gMDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNoYWRvd09mZnNldFggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc2hhZG93T2Zmc2V0WSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGRyYXcgbGluZXMgbGluZSBieSBsaW5lXG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBsaW5lcy5sZW5ndGg7IGkkMSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxpbmVQb3NpdGlvblggPSBzdHlsZS5zdHJva2VUaGlja25lc3MgLyAyO1xuICAgICAgICAgICAgICAgIGxpbmVQb3NpdGlvblkgPSAoKHN0eWxlLnN0cm9rZVRoaWNrbmVzcyAvIDIpICsgKGkkMSAqIGxpbmVIZWlnaHQpKSArIGZvbnRQcm9wZXJ0aWVzLmFzY2VudDtcblxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5hbGlnbiA9PT0gJ3JpZ2h0JylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVQb3NpdGlvblggKz0gbWF4TGluZVdpZHRoIC0gbGluZVdpZHRoc1tpJDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZS5hbGlnbiA9PT0gJ2NlbnRlcicpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb25YICs9IChtYXhMaW5lV2lkdGggLSBsaW5lV2lkdGhzW2kkMV0pIC8gMjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc3Ryb2tlICYmIHN0eWxlLnN0cm9rZVRoaWNrbmVzcylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0xldHRlclNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpJDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uWCArIHN0eWxlLnBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb25ZICsgc3R5bGUucGFkZGluZyAtIGRzT2Zmc2V0VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuZmlsbClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0xldHRlclNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpJDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uWCArIHN0eWxlLnBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb25ZICsgc3R5bGUucGFkZGluZyAtIGRzT2Zmc2V0VGV4dFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGV4dHVyZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXIgdGhlIHRleHQgd2l0aCBsZXR0ZXItc3BhY2luZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IHRvIGRyYXdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIEhvcml6b250YWwgcG9zaXRpb24gdG8gZHJhdyB0aGUgdGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVmVydGljYWwgcG9zaXRpb24gdG8gZHJhdyB0aGUgdGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3Ryb2tlPWZhbHNlXSAtIElzIHRoaXMgZHJhd2luZyBmb3IgdGhlIG91dHNpZGUgc3Ryb2tlIG9mIHRoZVxuICAgICAqICB0ZXh0PyBJZiBub3QsIGl0J3MgZm9yIHRoZSBpbnNpZGUgZmlsbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGV4dC5wcm90b3R5cGUuZHJhd0xldHRlclNwYWNpbmcgPSBmdW5jdGlvbiBkcmF3TGV0dGVyU3BhY2luZyAodGV4dCwgeCwgeSwgaXNTdHJva2UpXG4gICAge1xuICAgICAgICBpZiAoIGlzU3Ryb2tlID09PSB2b2lkIDAgKSBpc1N0cm9rZSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBzdHlsZSA9IHRoaXMuX3N0eWxlO1xuXG4gICAgICAgIC8vIGxldHRlclNwYWNpbmcgb2YgMCBtZWFucyBub3JtYWxcbiAgICAgICAgdmFyIGxldHRlclNwYWNpbmcgPSBzdHlsZS5sZXR0ZXJTcGFjaW5nO1xuXG4gICAgICAgIGlmIChsZXR0ZXJTcGFjaW5nID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoaXNTdHJva2UpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVRleHQodGV4dCwgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHRleHQsIHgsIHkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3VycmVudFBvc2l0aW9uID0geDtcblxuICAgICAgICAvLyBVc2luZyBBcnJheS5mcm9tIGNvcnJlY3RseSBzcGxpdHMgY2hhcmFjdGVycyB3aGlsc3Qga2VlcGluZyBlbW9qaSB0b2dldGhlci5cbiAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIElFIGFzIGl0IHJlcXVpcmVzIEVTNiwgc28gcmVndWxhciB0ZXh0IHNwbGl0dGluZyBvY2N1cnMuXG4gICAgICAgIC8vIFRoaXMgYWxzbyBkb2Vzbid0IGFjY291bnQgZm9yIGVtb2ppIHRoYXQgYXJlIG11bHRpcGxlIGVtb2ppIHB1dCB0b2dldGhlciB0byBtYWtlIHNvbWV0aGluZyBlbHNlLlxuICAgICAgICAvLyBIYW5kbGluZyBhbGwgb2YgdGhpcyB3b3VsZCByZXF1aXJlIGEgYmlnIGxpYnJhcnkgaXRzZWxmLlxuICAgICAgICAvLyBodHRwczovL21lZGl1bS5jb20vQGdpbHRheWFyL2l0ZXJhdGluZy1vdmVyLWVtb2ppLWNoYXJhY3RlcnMtdGhlLWVzNi13YXktZjA2ZTQ1ODk1MTZcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL29ybGluZy9ncmFwaGVtZS1zcGxpdHRlclxuICAgICAgICB2YXIgc3RyaW5nQXJyYXkgPSBBcnJheS5mcm9tID8gQXJyYXkuZnJvbSh0ZXh0KSA6IHRleHQuc3BsaXQoJycpO1xuICAgICAgICB2YXIgcHJldmlvdXNXaWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcbiAgICAgICAgdmFyIGN1cnJlbnRXaWR0aCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7ICsraSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRDaGFyID0gc3RyaW5nQXJyYXlbaV07XG5cbiAgICAgICAgICAgIGlmIChpc1N0cm9rZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChjdXJyZW50Q2hhciwgY3VycmVudFBvc2l0aW9uLCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsbFRleHQoY3VycmVudENoYXIsIGN1cnJlbnRQb3NpdGlvbiwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50V2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQodGV4dC5zdWJzdHJpbmcoaSArIDEpKS53aWR0aDtcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiArPSBwcmV2aW91c1dpZHRoIC0gY3VycmVudFdpZHRoICsgbGV0dGVyU3BhY2luZztcbiAgICAgICAgICAgIHByZXZpb3VzV2lkdGggPSBjdXJyZW50V2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0ZXh0dXJlIHNpemUgYmFzZWQgb24gY2FudmFzIHNpemVcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGV4dC5wcm90b3R5cGUudXBkYXRlVGV4dHVyZSA9IGZ1bmN0aW9uIHVwZGF0ZVRleHR1cmUgKClcbiAgICB7XG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcblxuICAgICAgICBpZiAodGhpcy5fc3R5bGUudHJpbSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRyaW1tZWQgPSB0cmltQ2FudmFzKGNhbnZhcyk7XG5cbiAgICAgICAgICAgIGlmICh0cmltbWVkLmRhdGEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gdHJpbW1lZC53aWR0aDtcbiAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdHJpbW1lZC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YSh0cmltbWVkLmRhdGEsIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHR1cmUgPSB0aGlzLl90ZXh0dXJlO1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLl9zdHlsZTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBzdHlsZS50cmltID8gMCA6IHN0eWxlLnBhZGRpbmc7XG4gICAgICAgIHZhciBiYXNlVGV4dHVyZSA9IHRleHR1cmUuYmFzZVRleHR1cmU7XG5cbiAgICAgICAgdGV4dHVyZS50cmltLndpZHRoID0gdGV4dHVyZS5fZnJhbWUud2lkdGggPSBNYXRoLmNlaWwoY2FudmFzLndpZHRoIC8gdGhpcy5fcmVzb2x1dGlvbik7XG4gICAgICAgIHRleHR1cmUudHJpbS5oZWlnaHQgPSB0ZXh0dXJlLl9mcmFtZS5oZWlnaHQgPSBNYXRoLmNlaWwoY2FudmFzLmhlaWdodCAvIHRoaXMuX3Jlc29sdXRpb24pO1xuICAgICAgICB0ZXh0dXJlLnRyaW0ueCA9IC1wYWRkaW5nO1xuICAgICAgICB0ZXh0dXJlLnRyaW0ueSA9IC1wYWRkaW5nO1xuXG4gICAgICAgIHRleHR1cmUub3JpZy53aWR0aCA9IHRleHR1cmUuX2ZyYW1lLndpZHRoIC0gKHBhZGRpbmcgKiAyKTtcbiAgICAgICAgdGV4dHVyZS5vcmlnLmhlaWdodCA9IHRleHR1cmUuX2ZyYW1lLmhlaWdodCAtIChwYWRkaW5nICogMik7XG5cbiAgICAgICAgLy8gY2FsbCBzcHJpdGUgb25UZXh0dXJlVXBkYXRlIHRvIHVwZGF0ZSBzY2FsZSBpZiBfd2lkdGggb3IgX2hlaWdodCB3ZXJlIHNldFxuICAgICAgICB0aGlzLl9vblRleHR1cmVVcGRhdGUoKTtcblxuICAgICAgICBiYXNlVGV4dHVyZS5zZXRSZWFsU2l6ZShjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQsIHRoaXMuX3Jlc29sdXRpb24pO1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgb2JqZWN0IHVzaW5nIHRoZSBXZWJHTCByZW5kZXJlclxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyXG4gICAgICovXG4gICAgVGV4dC5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uIF9yZW5kZXIgKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9SZXNvbHV0aW9uICYmIHRoaXMuX3Jlc29sdXRpb24gIT09IHJlbmRlcmVyLnJlc29sdXRpb24pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdXRpb24gPSByZW5kZXJlci5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRleHQodHJ1ZSk7XG5cbiAgICAgICAgU3ByaXRlLnByb3RvdHlwZS5fcmVuZGVyLmNhbGwodGhpcywgcmVuZGVyZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb2NhbCBib3VuZHMgb2YgdGhlIHRleHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBvdXRwdXQgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVjdGFuZ2xlfSBUaGUgYm91bmRzLlxuICAgICAqL1xuICAgIFRleHQucHJvdG90eXBlLmdldExvY2FsQm91bmRzID0gZnVuY3Rpb24gZ2V0TG9jYWxCb3VuZHMgKHJlY3QpXG4gICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHQodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIFNwcml0ZS5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHMuY2FsbCh0aGlzLCByZWN0KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogY2FsY3VsYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBUZXh0IGFzIGEgcmVjdGFuZ2xlLiBUaGUgYm91bmRzIGNhbGN1bGF0aW9uIHRha2VzIHRoZSB3b3JsZFRyYW5zZm9ybSBpbnRvIGFjY291bnQuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIFRleHQucHJvdG90eXBlLl9jYWxjdWxhdGVCb3VuZHMgPSBmdW5jdGlvbiBfY2FsY3VsYXRlQm91bmRzICgpXG4gICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVmVydGljZXMoKTtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IGRvbmUgdGhpcyBvbiBUSElTIGZyYW1lLlxuICAgICAgICB0aGlzLl9ib3VuZHMuYWRkUXVhZCh0aGlzLnZlcnRleERhdGEpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gYmUgY2FsbGVkIHVwb24gYSBUZXh0U3R5bGUgY2hhbmdlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGV4dC5wcm90b3R5cGUuX29uU3R5bGVDaGFuZ2UgPSBmdW5jdGlvbiBfb25TdHlsZUNoYW5nZSAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgZmlsbCBzdHlsZS4gQ2FuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBncmFkaWVudCBiYXNlZCBvbiB0aGUgZmlsbCBzdHlsZSBiZWluZyBhbiBhcnJheVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc3R5bGUgLSBUaGUgc3R5bGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gbGluZXMgLSBUaGUgbGluZXMgb2YgdGV4dC5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfENhbnZhc0dyYWRpZW50fSBUaGUgZmlsbCBzdHlsZVxuICAgICAqL1xuICAgIFRleHQucHJvdG90eXBlLl9nZW5lcmF0ZUZpbGxTdHlsZSA9IGZ1bmN0aW9uIF9nZW5lcmF0ZUZpbGxTdHlsZSAoc3R5bGUsIGxpbmVzLCBtZXRyaWNzKVxuICAgIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0eWxlLmZpbGwpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGUuZmlsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHlsZS5maWxsLmxlbmd0aCA9PT0gMSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmZpbGxbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgZ3JhZGllbnQgd2lsbCBiZSBldmVubHkgc3BhY2VkIG91dCBhY2NvcmRpbmcgdG8gaG93IGxhcmdlIHRoZSBhcnJheSBpcy5cbiAgICAgICAgLy8gWycjRkYwMDAwJywgJyMwMEZGMDAnLCAnIzAwMDBGRiddIHdvdWxkIGNyZWF0ZWQgc3RvcHMgYXQgMC4yNSwgMC41IGFuZCAwLjc1XG4gICAgICAgIHZhciBncmFkaWVudDtcblxuICAgICAgICAvLyBhIGRyb3BzaGFkb3cgd2lsbCBlbmxhcmdlIHRoZSBjYW52YXMgYW5kIHJlc3VsdCBpbiB0aGUgZ3JhZGllbnQgYmVpbmdcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHdpdGggdGhlIGluY29ycmVjdCBkaW1lbnNpb25zXG4gICAgICAgIHZhciBkcm9wU2hhZG93Q29ycmVjdGlvbiA9IChzdHlsZS5kcm9wU2hhZG93KSA/IHN0eWxlLmRyb3BTaGFkb3dEaXN0YW5jZSA6IDA7XG5cbiAgICAgICAgLy8gc2hvdWxkIGFsc28gdGFrZSBwYWRkaW5nIGludG8gYWNjb3VudCwgcGFkZGluZyBjYW4gb2Zmc2V0IHRoZSBncmFkaWVudFxuICAgICAgICB2YXIgcGFkZGluZyA9IHN0eWxlLnBhZGRpbmcgfHwgMDtcblxuICAgICAgICB2YXIgd2lkdGggPSBNYXRoLmNlaWwodGhpcy5jYW52YXMud2lkdGggLyB0aGlzLl9yZXNvbHV0aW9uKSAtIGRyb3BTaGFkb3dDb3JyZWN0aW9uIC0gKHBhZGRpbmcgKiAyKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguY2VpbCh0aGlzLmNhbnZhcy5oZWlnaHQgLyB0aGlzLl9yZXNvbHV0aW9uKSAtIGRyb3BTaGFkb3dDb3JyZWN0aW9uIC0gKHBhZGRpbmcgKiAyKTtcblxuICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgc3R5bGUgc2V0dGluZ3MsIHNvIHdlIGNhbiBtYW5pcHVsYXRlIHRoZW0gbGF0ZXJcbiAgICAgICAgdmFyIGZpbGwgPSBzdHlsZS5maWxsLnNsaWNlKCk7XG4gICAgICAgIHZhciBmaWxsR3JhZGllbnRTdG9wcyA9IHN0eWxlLmZpbGxHcmFkaWVudFN0b3BzLnNsaWNlKCk7XG5cbiAgICAgICAgLy8gd2FudGluZyB0byBldmVubHkgZGlzdHJpYnV0ZSB0aGUgZmlsbHMuIFNvIGFuIGFycmF5IG9mIDQgY29sb3VycyBzaG91bGQgZ2l2ZSBmaWxscyBvZiAwLjI1LCAwLjUgYW5kIDAuNzVcbiAgICAgICAgaWYgKCFmaWxsR3JhZGllbnRTdG9wcy5sZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBsZW5ndGhQbHVzMSA9IGZpbGwubGVuZ3RoICsgMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW5ndGhQbHVzMTsgKytpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGxHcmFkaWVudFN0b3BzLnB1c2goaSAvIGxlbmd0aFBsdXMxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3AgdGhlIGJsZWVkaW5nIG9mIHRoZSBsYXN0IGdyYWRpZW50IG9uIHRoZSBsaW5lIGFib3ZlIHRvIHRoZSB0b3AgZ3JhZGllbnQgb2YgdGhlIHRoaXMgbGluZVxuICAgICAgICAvLyBieSBoYXJkIGRlZmluaW5nIHRoZSBmaXJzdCBncmFkaWVudCBjb2xvdXIgYXQgcG9pbnQgMCwgYW5kIGxhc3QgZ3JhZGllbnQgY29sb3VyIGF0IHBvaW50IDFcbiAgICAgICAgZmlsbC51bnNoaWZ0KHN0eWxlLmZpbGxbMF0pO1xuICAgICAgICBmaWxsR3JhZGllbnRTdG9wcy51bnNoaWZ0KDApO1xuXG4gICAgICAgIGZpbGwucHVzaChzdHlsZS5maWxsW3N0eWxlLmZpbGwubGVuZ3RoIC0gMV0pO1xuICAgICAgICBmaWxsR3JhZGllbnRTdG9wcy5wdXNoKDEpO1xuXG4gICAgICAgIGlmIChzdHlsZS5maWxsR3JhZGllbnRUeXBlID09PSBURVhUX0dSQURJRU5ULkxJTkVBUl9WRVJUSUNBTClcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGdyYWRpZW50IGF0IHRoZSB0b3AgY2VudGVyIG9mIHRoZSBjYW52YXMsIGFuZCBlbmQgYXQgdGhlIGJvdHRvbSBtaWRkbGUgb2YgdGhlIGNhbnZhc1xuICAgICAgICAgICAgZ3JhZGllbnQgPSB0aGlzLmNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQod2lkdGggLyAyLCBwYWRkaW5nLCB3aWR0aCAvIDIsIGhlaWdodCArIHBhZGRpbmcpO1xuXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlcGVhdCB0aGUgZ3JhZGllbnQgc28gdGhhdCBlYWNoIGluZGl2aWR1YWwgbGluZSBvZiB0ZXh0IGhhcyB0aGUgc2FtZSB2ZXJ0aWNhbCBncmFkaWVudCBlZmZlY3RcbiAgICAgICAgICAgIC8vIFsnI0ZGMDAwMCcsICcjMDBGRjAwJywgJyMwMDAwRkYnXSBvdmVyIDIgbGluZXMgd291bGQgY3JlYXRlIHN0b3BzIGF0IDAuMTI1LCAwLjI1LCAwLjM3NSwgMC42MjUsIDAuNzUsIDAuODc1XG5cbiAgICAgICAgICAgIC8vIFRoZXJlJ3MgcG90ZW50aWFsIGZvciBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaXNzdWVzIGF0IHRoZSBzZWFtcyBiZXR3ZWVuIGdyYWRpZW50IHJlcGVhdHMuXG4gICAgICAgICAgICAvLyBUaGUgbG9vcCBiZWxvdyBnZW5lcmF0ZXMgdGhlIHN0b3BzIGluIG9yZGVyLCBzbyB0cmFjayB0aGUgbGFzdCBnZW5lcmF0ZWQgb25lIHRvIHByZXZlbnRcbiAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBmcm9tIG1ha2luZyB1cyBnbyB0aGUgdGVlbmllc3QgYml0IGJhY2t3YXJkcywgcmVzdWx0aW5nIGluXG4gICAgICAgICAgICAvLyB0aGUgZmlyc3QgYW5kIGxhc3QgY29sb3JzIGdldHRpbmcgc3dhcHBlZC5cbiAgICAgICAgICAgIHZhciBsYXN0SXRlcmF0aW9uU3RvcCA9IDA7XG5cbiAgICAgICAgICAgIC8vIEFjdHVhbCBoZWlnaHQgb2YgdGhlIHRleHQgaXRzZWxmLCBub3QgY291bnRpbmcgc3BhY2luZyBmb3IgbGluZUhlaWdodC9sZWFkaW5nL2Ryb3BTaGFkb3cgZXRjXG4gICAgICAgICAgICB2YXIgdGV4dEhlaWdodCA9IG1ldHJpY3MuZm9udFByb3BlcnRpZXMuZm9udFNpemUgKyBzdHlsZS5zdHJva2VUaGlja25lc3M7XG5cbiAgICAgICAgICAgIC8vIHRleHRIZWlnaHQsIGJ1dCBhcyBhIDAtMSBzaXplIGluIGdsb2JhbCBncmFkaWVudCBzdG9wIHNwYWNlXG4gICAgICAgICAgICB2YXIgZ3JhZFN0b3BMaW5lSGVpZ2h0ID0gdGV4dEhlaWdodCAvIGhlaWdodDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGluZXMubGVuZ3RoOyBpJDErKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpc0xpbmVUb3AgPSBtZXRyaWNzLmxpbmVIZWlnaHQgKiBpJDE7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZpbGwubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyAwLTEgc3RvcCBwb2ludCBmb3IgdGhlIGN1cnJlbnQgbGluZSwgbXVsdGlwbGllZCB0byBnbG9iYWwgc3BhY2UgYWZ0ZXJ3YXJkc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZVN0b3AgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsbEdyYWRpZW50U3RvcHNbal0gPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RvcCA9IGZpbGxHcmFkaWVudFN0b3BzW2pdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0b3AgPSBqIC8gZmlsbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgZ2xvYmFsU3RvcCA9ICh0aGlzTGluZVRvcCAvIGhlaWdodCkgKyAobGluZVN0b3AgKiBncmFkU3RvcExpbmVIZWlnaHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY29sb3Igc3RvcCBnZW5lcmF0aW9uIGdvaW5nIGJhY2t3YXJkcyBmcm9tIGZsb2F0aW5nIHBvaW50IGltcHJlY2lzaW9uXG4gICAgICAgICAgICAgICAgICAgIHZhciBjbGFtcGVkU3RvcCA9IE1hdGgubWF4KGxhc3RJdGVyYXRpb25TdG9wLCBnbG9iYWxTdG9wKTtcblxuICAgICAgICAgICAgICAgICAgICBjbGFtcGVkU3RvcCA9IE1hdGgubWluKGNsYW1wZWRTdG9wLCAxKTsgLy8gQ2FwIGF0IDEgYXMgd2VsbCBmb3Igc2FmZXR5J3Mgc2FrZSB0byBhdm9pZCBhIHBvc3NpYmxlIHRocm93LlxuICAgICAgICAgICAgICAgICAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoY2xhbXBlZFN0b3AsIGZpbGxbal0pO1xuICAgICAgICAgICAgICAgICAgICBsYXN0SXRlcmF0aW9uU3RvcCA9IGNsYW1wZWRTdG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBncmFkaWVudCBhdCB0aGUgY2VudGVyIGxlZnQgb2YgdGhlIGNhbnZhcywgYW5kIGVuZCBhdCB0aGUgY2VudGVyIHJpZ2h0IG9mIHRoZSBjYW52YXNcbiAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5jb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KHBhZGRpbmcsIGhlaWdodCAvIDIsIHdpZHRoICsgcGFkZGluZywgaGVpZ2h0IC8gMik7XG5cbiAgICAgICAgICAgIC8vIGNhbiBqdXN0IGV2ZW5seSBzcGFjZSBvdXQgdGhlIGdyYWRpZW50cyBpbiB0aGlzIGNhc2UsIGFzIG11bHRpcGxlIGxpbmVzIG1ha2VzIG5vIGRpZmZlcmVuY2VcbiAgICAgICAgICAgIC8vIHRvIGFuIGV2ZW4gbGVmdCB0byByaWdodCBncmFkaWVudFxuICAgICAgICAgICAgdmFyIHRvdGFsSXRlcmF0aW9ucyA9IGZpbGwubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50SXRlcmF0aW9uID0gMTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgZmlsbC5sZW5ndGg7IGkkMisrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBzdG9wID0gKHZvaWQgMCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGxHcmFkaWVudFN0b3BzW2kkMl0gPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcCA9IGZpbGxHcmFkaWVudFN0b3BzW2kkMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3AgPSBjdXJyZW50SXRlcmF0aW9uIC8gdG90YWxJdGVyYXRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBncmFkaWVudC5hZGRDb2xvclN0b3Aoc3RvcCwgZmlsbFtpJDJdKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50SXRlcmF0aW9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ3JhZGllbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgdGV4dCBvYmplY3QuXG4gICAgICogTm90ZSogVW5saWtlIGEgU3ByaXRlLCBhIFRleHQgb2JqZWN0IHdpbGwgYXV0b21hdGljYWxseSBkZXN0cm95IGl0cyBiYXNlVGV4dHVyZSBhbmQgdGV4dHVyZSBhc1xuICAgICAqIHRoZSBtYWpvcml0eSBvZiB0aGUgdGltZSB0aGUgdGV4dHVyZSB3aWxsIG5vdCBiZSBzaGFyZWQgd2l0aCBhbnkgb3RoZXIgU3ByaXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fGJvb2xlYW59IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFyYW1ldGVyLiBBIGJvb2xlYW4gd2lsbCBhY3QgYXMgaWYgYWxsIG9wdGlvbnNcbiAgICAgKiAgaGF2ZSBiZWVuIHNldCB0byB0aGF0IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGlsZHJlbj1mYWxzZV0gLSBpZiBzZXQgdG8gdHJ1ZSwgYWxsIHRoZSBjaGlsZHJlbiB3aWxsIGhhdmUgdGhlaXJcbiAgICAgKiAgZGVzdHJveSBtZXRob2QgY2FsbGVkIGFzIHdlbGwuICdvcHRpb25zJyB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aG9zZSBjYWxscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHR1cmU9dHJ1ZV0gLSBTaG91bGQgaXQgZGVzdHJveSB0aGUgY3VycmVudCB0ZXh0dXJlIG9mIHRoZSBzcHJpdGUgYXMgd2VsbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYmFzZVRleHR1cmU9dHJ1ZV0gLSBTaG91bGQgaXQgZGVzdHJveSB0aGUgYmFzZSB0ZXh0dXJlIG9mIHRoZSBzcHJpdGUgYXMgd2VsbFxuICAgICAqL1xuICAgIFRleHQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95IChvcHRpb25zKVxuICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpXG4gICAgICAgIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7IGNoaWxkcmVuOiBvcHRpb25zIH07XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdERlc3Ryb3lPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBTcHJpdGUucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBzZXQgY2FudmFzIHdpZHRoIGFuZCBoZWlnaHQgdG8gMCB0byB3b3JrYXJvdW5kIG1lbW9yeSBsZWFrIGluIFNhZmFyaSA8IDEzXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUyNTMyNjE0L3RvdGFsLWNhbnZhcy1tZW1vcnktdXNlLWV4Y2VlZHMtdGhlLW1heGltdW0tbGltaXQtc2FmYXJpLTEyXG4gICAgICAgIGlmICh0aGlzLl9vd25DYW52YXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLndpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGhlIGNvbnRleHQgYW5kIGNhbnZhcy4uIGRvbnQgd2FudCB0aGlzIGhhbmdpbmcgYXJvdW5kIGluIG1lbW9yeSFcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBUZXh0LCBzZXR0aW5nIHRoaXMgd2lsbCBhY3R1YWxseSBtb2RpZnkgdGhlIHNjYWxlIHRvIGFjaGlldmUgdGhlIHZhbHVlIHNldFxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53aWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgdGhpcy51cGRhdGVUZXh0KHRydWUpO1xuXG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnNjYWxlLngpICogdGhpcy5fdGV4dHVyZS5vcmlnLndpZHRoO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMud2lkdGguc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMudXBkYXRlVGV4dCh0cnVlKTtcblxuICAgICAgICB2YXIgcyA9IHNpZ24odGhpcy5zY2FsZS54KSB8fCAxO1xuXG4gICAgICAgIHRoaXMuc2NhbGUueCA9IHMgKiB2YWx1ZSAvIHRoaXMuX3RleHR1cmUub3JpZy53aWR0aDtcbiAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgVGV4dCwgc2V0dGluZyB0aGlzIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSBzY2FsZSB0byBhY2hpZXZlIHRoZSB2YWx1ZSBzZXRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHQodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuc2NhbGUueSkgKiB0aGlzLl90ZXh0dXJlLm9yaWcuaGVpZ2h0O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHQodHJ1ZSk7XG5cbiAgICAgICAgdmFyIHMgPSBzaWduKHRoaXMuc2NhbGUueSkgfHwgMTtcblxuICAgICAgICB0aGlzLnNjYWxlLnkgPSBzICogdmFsdWUgLyB0aGlzLl90ZXh0dXJlLm9yaWcuaGVpZ2h0O1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzdHlsZSBvZiB0aGUgdGV4dC4gU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyBvbiB0aGUgc3R5bGVcbiAgICAgKiBvYmplY3QgYW5kIG1hcmsgdGhlIHRleHQgYXMgZGlydHkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtvYmplY3R8UElYSS5UZXh0U3R5bGV9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnN0eWxlLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGU7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5zdHlsZS5zZXQgPSBmdW5jdGlvbiAoc3R5bGUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgc3R5bGUgPSBzdHlsZSB8fCB7fTtcblxuICAgICAgICBpZiAoc3R5bGUgaW5zdGFuY2VvZiBUZXh0U3R5bGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlID0gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZSA9IG5ldyBUZXh0U3R5bGUoc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2NhbFN0eWxlSUQgPSAtMTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29weSBmb3IgdGhlIHRleHQgb2JqZWN0LiBUbyBzcGxpdCBhIGxpbmUgeW91IGNhbiB1c2UgJ1xcbicuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRleHQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dC5zZXQgPSBmdW5jdGlvbiAodGV4dCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0ZXh0ID0gU3RyaW5nKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiB0ZXh0KTtcblxuICAgICAgICBpZiAodGhpcy5fdGV4dCA9PT0gdGV4dClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlc29sdXRpb24gLyBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgdGhlIGNhbnZhcy5cbiAgICAgKiBUaGlzIGlzIHNldCB0byBhdXRvbWF0aWNhbGx5IG1hdGNoIHRoZSByZW5kZXJlciByZXNvbHV0aW9uIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIG1hbnVhbGx5LlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJlc29sdXRpb24uZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvbHV0aW9uO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucmVzb2x1dGlvbi5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5fYXV0b1Jlc29sdXRpb24gPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5fcmVzb2x1dGlvbiA9PT0gdmFsdWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc29sdXRpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBUZXh0LnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gVGV4dDtcbn0oU3ByaXRlKSk7XG5cbmV4cG9ydCB7IFRFWFRfR1JBRElFTlQsIFRleHQsIFRleHRNZXRyaWNzLCBUZXh0U3R5bGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL3ByZXBhcmUgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvcHJlcGFyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSAnQHBpeGkvc2V0dGluZ3MnO1xuaW1wb3J0IHsgVGV4dHVyZSwgQmFzZVRleHR1cmUgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IEdyYXBoaWNzIH0gZnJvbSAnQHBpeGkvZ3JhcGhpY3MnO1xuaW1wb3J0IHsgVGlja2VyLCBVUERBVEVfUFJJT1JJVFkgfSBmcm9tICdAcGl4aS90aWNrZXInO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnQHBpeGkvZGlzcGxheSc7XG5pbXBvcnQgeyBUZXh0LCBUZXh0U3R5bGUsIFRleHRNZXRyaWNzIH0gZnJvbSAnQHBpeGkvdGV4dCc7XG5cbi8qKlxuICogRGVmYXVsdCBudW1iZXIgb2YgdXBsb2FkcyBwZXIgZnJhbWUgdXNpbmcgcHJlcGFyZSBwbHVnaW4uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlcm9mIFBJWEkuc2V0dGluZ3NcbiAqIEBuYW1lIFVQTE9BRFNfUEVSX0ZSQU1FXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGRlZmF1bHQgNFxuICovXG5zZXR0aW5ncy5VUExPQURTX1BFUl9GUkFNRSA9IDQ7XG5cbi8qKlxuICogQ291bnRMaW1pdGVyIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhbmRsZWQgYnkgYSB7QGxpbmsgUElYSS5CYXNlUHJlcGFyZX0gdG8gYSBzcGVjaWZpZWRcbiAqIG51bWJlciBvZiBpdGVtcyBwZXIgZnJhbWUuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgQ291bnRMaW1pdGVyID0gZnVuY3Rpb24gQ291bnRMaW1pdGVyKG1heEl0ZW1zUGVyRnJhbWUpXG57XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHByZXBhcmVkIGVhY2ggZnJhbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubWF4SXRlbXNQZXJGcmFtZSA9IG1heEl0ZW1zUGVyRnJhbWU7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBwcmVwYXJlZCBpbiB0aGUgY3VycmVudCBmcmFtZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pdGVtc0xlZnQgPSAwO1xufTtcblxuLyoqXG4gKiBSZXNldHMgYW55IGNvdW50aW5nIHByb3BlcnRpZXMgdG8gc3RhcnQgZnJlc2ggb24gYSBuZXcgZnJhbWUuXG4gKi9cbkNvdW50TGltaXRlci5wcm90b3R5cGUuYmVnaW5GcmFtZSA9IGZ1bmN0aW9uIGJlZ2luRnJhbWUgKClcbntcbiAgICB0aGlzLml0ZW1zTGVmdCA9IHRoaXMubWF4SXRlbXNQZXJGcmFtZTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRvIHNlZSBpZiBhbm90aGVyIGl0ZW0gY2FuIGJlIHVwbG9hZGVkLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBpdGVtLlxuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgdGhlIGl0ZW0gaXMgYWxsb3dlZCB0byBiZSB1cGxvYWRlZC5cbiAqL1xuQ291bnRMaW1pdGVyLnByb3RvdHlwZS5hbGxvd2VkVG9VcGxvYWQgPSBmdW5jdGlvbiBhbGxvd2VkVG9VcGxvYWQgKClcbntcbiAgICByZXR1cm4gdGhpcy5pdGVtc0xlZnQtLSA+IDA7XG59O1xuXG4vKipcbiAqIFRoZSBwcmVwYXJlIG1hbmFnZXIgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byB1cGxvYWQgY29udGVudCB0byB0aGUgR1BVLlxuICpcbiAqIEJhc2VQcmVwYXJlIGhhbmRsZXMgYmFzaWMgcXVldWluZyBmdW5jdGlvbmFsaXR5IGFuZCBpcyBleHRlbmRlZCBieVxuICoge0BsaW5rIFBJWEkuUHJlcGFyZX0gYW5kIHtAbGluayBQSVhJLkNhbnZhc1ByZXBhcmV9XG4gKiB0byBwcm92aWRlIHByZXBhcmF0aW9uIGNhcGFiaWxpdGllcyBzcGVjaWZpYyB0byB0aGVpciByZXNwZWN0aXZlIHJlbmRlcmVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc3ByaXRlXG4gKiBjb25zdCBzcHJpdGUgPSBQSVhJLlNwcml0ZS5mcm9tKCdzb21ldGhpbmcucG5nJyk7XG4gKlxuICogLy8gTG9hZCBvYmplY3QgaW50byBHUFVcbiAqIGFwcC5yZW5kZXJlci5wbHVnaW5zLnByZXBhcmUudXBsb2FkKHNwcml0ZSwgKCkgPT4ge1xuICpcbiAqICAgICAvL1RleHR1cmUocykgaGFzIGJlZW4gdXBsb2FkZWQgdG8gR1BVXG4gKiAgICAgYXBwLnN0YWdlLmFkZENoaWxkKHNwcml0ZSk7XG4gKlxuICogfSlcbiAqXG4gKiBAYWJzdHJhY3RcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIEJhc2VQcmVwYXJlID0gZnVuY3Rpb24gQmFzZVByZXBhcmUocmVuZGVyZXIpXG57XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGltaXRlciB0byBiZSB1c2VkIHRvIGNvbnRyb2wgaG93IHF1aWNrbHkgaXRlbXMgYXJlIHByZXBhcmVkLlxuICAgICAqIEB0eXBlIHtQSVhJLkNvdW50TGltaXRlcnxQSVhJLlRpbWVMaW1pdGVyfVxuICAgICAqL1xuICAgIHRoaXMubGltaXRlciA9IG5ldyBDb3VudExpbWl0ZXIoc2V0dGluZ3MuVVBMT0FEU19QRVJfRlJBTUUpO1xuXG4gICAgLyoqXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cbiAgICAgKiBAdHlwZSB7UElYSS5BYnN0cmFjdFJlbmRlcmVyfVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSByZWFsIGRpZmZlcmVuY2UgYmV0d2VlbiBDYW52YXNQcmVwYXJlIGFuZCBQcmVwYXJlIGlzIHdoYXQgdGhleSBwYXNzXG4gICAgICogdG8gdXBsb2FkIGhvb2tzLiBUaGF0IGRpZmZlcmVudCBwYXJhbWV0ZXIgaXMgc3RvcmVkIGhlcmUuXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgdGhpcy51cGxvYWRIb29rSGVscGVyID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgaXRlbXMgdG8gdXBsb2FkcyBhdCBvbmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTwqPn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucXVldWUgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBob29rcyBmb3IgZmluZGluZyBhc3NldHMuXG4gICAgICogQHR5cGUge0FycmF5PEZ1bmN0aW9uPn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuYWRkSG9va3MgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBob29rcyBmb3IgcHJvY2Vzc2luZyBhc3NldHMuXG4gICAgICogQHR5cGUge0FycmF5PEZ1bmN0aW9uPn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudXBsb2FkSG9va3MgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGNhbGwgYWZ0ZXIgY29tcGxldGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxGdW5jdGlvbj59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmNvbXBsZXRlcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogSWYgcHJlcGFyZSBpcyB0aWNraW5nIChydW5uaW5nKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudGlja2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogJ2JvdW5kJyBjYWxsIGZvciBwcmVwYXJlSXRlbXMoKS5cbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmRlbGF5ZWRUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB1bmxpa2VseSwgYnV0IGluIGNhc2Ugd2Ugd2VyZSBkZXN0cm95ZWQgYmV0d2VlbiB0aWNrKCkgYW5kIGRlbGF5ZWRUaWNrKClcbiAgICAgICAgaWYgKCF0aGlzJDEucXVldWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzJDEucHJlcGFyZUl0ZW1zKCk7XG4gICAgfTtcblxuICAgIC8vIGhvb2tzIHRvIGZpbmQgdGhlIGNvcnJlY3QgdGV4dHVyZVxuICAgIHRoaXMucmVnaXN0ZXJGaW5kSG9vayhmaW5kVGV4dCk7XG4gICAgdGhpcy5yZWdpc3RlckZpbmRIb29rKGZpbmRUZXh0U3R5bGUpO1xuICAgIHRoaXMucmVnaXN0ZXJGaW5kSG9vayhmaW5kTXVsdGlwbGVCYXNlVGV4dHVyZXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGaW5kSG9vayhmaW5kQmFzZVRleHR1cmUpO1xuICAgIHRoaXMucmVnaXN0ZXJGaW5kSG9vayhmaW5kVGV4dHVyZSk7XG5cbiAgICAvLyB1cGxvYWQgaG9va3NcbiAgICB0aGlzLnJlZ2lzdGVyVXBsb2FkSG9vayhkcmF3VGV4dCk7XG4gICAgdGhpcy5yZWdpc3RlclVwbG9hZEhvb2soY2FsY3VsYXRlVGV4dFN0eWxlKTtcbn07XG5cbi8qKlxuICogVXBsb2FkIGFsbCB0aGUgdGV4dHVyZXMgYW5kIGdyYXBoaWNzIHRvIHRoZSBHUFUuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxQSVhJLkRpc3BsYXlPYmplY3R8UElYSS5Db250YWluZXJ8UElYSS5CYXNlVGV4dHVyZXxQSVhJLlRleHR1cmV8UElYSS5HcmFwaGljc3xQSVhJLlRleHR9IGl0ZW0gLVxuICogICAgRWl0aGVyIHRoZSBjb250YWluZXIgb3IgZGlzcGxheSBvYmplY3QgdG8gc2VhcmNoIGZvciBpdGVtcyB0byB1cGxvYWQsIHRoZSBpdGVtcyB0byB1cGxvYWQgdGhlbXNlbHZlcyxcbiAqICAgIG9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgaWYgaXRlbXMgaGF2ZSBiZWVuIGFkZGVkIHVzaW5nIGBwcmVwYXJlLmFkZGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZG9uZV0gLSBPcHRpb25hbCBjYWxsYmFjayB3aGVuIGFsbCBxdWV1ZWQgdXBsb2FkcyBoYXZlIGNvbXBsZXRlZFxuICovXG5CYXNlUHJlcGFyZS5wcm90b3R5cGUudXBsb2FkID0gZnVuY3Rpb24gdXBsb2FkIChpdGVtLCBkb25lKVxue1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJylcbiAgICB7XG4gICAgICAgIGRvbmUgPSBpdGVtO1xuICAgICAgICBpdGVtID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGRpc3BsYXkgb2JqZWN0LCBzZWFyY2ggZm9yIGl0ZW1zXG4gICAgLy8gdGhhdCB3ZSBjb3VsZCB1cGxvYWRcbiAgICBpZiAoaXRlbSlcbiAgICB7XG4gICAgICAgIHRoaXMuYWRkKGl0ZW0pO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgaXRlbXMgZm9yIHVwbG9hZCBmcm9tIHRoZSBkaXNwbGF5XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoKVxuICAgIHtcbiAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGxldGVzLnB1c2goZG9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGlja2luZylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50aWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIFRpY2tlci5zeXN0ZW0uYWRkT25jZSh0aGlzLnRpY2ssIHRoaXMsIFVQREFURV9QUklPUklUWS5VVElMSVRZKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkb25lKVxuICAgIHtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbn07XG5cbi8qKlxuICogSGFuZGxlIHRpY2sgdXBkYXRlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuQmFzZVByZXBhcmUucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiB0aWNrICgpXG57XG4gICAgc2V0VGltZW91dCh0aGlzLmRlbGF5ZWRUaWNrLCAwKTtcbn07XG5cbi8qKlxuICogQWN0dWFsbHkgcHJlcGFyZSBpdGVtcy4gVGhpcyBpcyBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIHRpY2sgYmVjYXVzZSBpdCB3aWxsIHRha2UgYSB3aGlsZVxuICogYW5kIHdlIGRvIE5PVCB3YW50IHRvIGJsb2NrIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBmcmFtZSBmcm9tIHJlbmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5CYXNlUHJlcGFyZS5wcm90b3R5cGUucHJlcGFyZUl0ZW1zID0gZnVuY3Rpb24gcHJlcGFyZUl0ZW1zICgpXG57XG4gICAgdGhpcy5saW1pdGVyLmJlZ2luRnJhbWUoKTtcbiAgICAvLyBVcGxvYWQgdGhlIGdyYXBoaWNzXG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoICYmIHRoaXMubGltaXRlci5hbGxvd2VkVG9VcGxvYWQoKSlcbiAgICB7XG4gICAgICAgIHZhciBpdGVtID0gdGhpcy5xdWV1ZVswXTtcbiAgICAgICAgdmFyIHVwbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgIWl0ZW0uX2Rlc3Ryb3llZClcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMudXBsb2FkSG9va3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXBsb2FkSG9va3NbaV0odGhpcy51cGxvYWRIb29rSGVscGVyLCBpdGVtKSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVwbG9hZGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSdyZSBmaW5pc2hlZFxuICAgIGlmICghdGhpcy5xdWV1ZS5sZW5ndGgpXG4gICAge1xuICAgICAgICB0aGlzLnRpY2tpbmcgPSBmYWxzZTtcblxuICAgICAgICB2YXIgY29tcGxldGVzID0gdGhpcy5jb21wbGV0ZXMuc2xpY2UoMCk7XG5cbiAgICAgICAgdGhpcy5jb21wbGV0ZXMubGVuZ3RoID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpJDEgPSAwLCBsZW4kMSA9IGNvbXBsZXRlcy5sZW5ndGg7IGkkMSA8IGxlbiQxOyBpJDErKylcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGVzW2kkMV0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IGZpbmlzaGVkLCBvbiB0aGUgbmV4dCByQUYgZG8gdGhpcyBhZ2FpblxuICAgICAgICBUaWNrZXIuc3lzdGVtLmFkZE9uY2UodGhpcy50aWNrLCB0aGlzLCBVUERBVEVfUFJJT1JJVFkuVVRJTElUWSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBBZGRzIGhvb2tzIGZvciBmaW5kaW5nIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFkZEhvb2sgLSBGdW5jdGlvbiBjYWxsIHRoYXQgdGFrZXMgdHdvIHBhcmFtZXRlcnM6IGBpdGVtOiosIHF1ZXVlOkFycmF5YFxuICogICAgICBmdW5jdGlvbiBtdXN0IHJldHVybiBgdHJ1ZWAgaWYgaXQgd2FzIGFibGUgdG8gYWRkIGl0ZW0gdG8gdGhlIHF1ZXVlLlxuICogQHJldHVybiB7dGhpc30gSW5zdGFuY2Ugb2YgcGx1Z2luIGZvciBjaGFpbmluZy5cbiAqL1xuQmFzZVByZXBhcmUucHJvdG90eXBlLnJlZ2lzdGVyRmluZEhvb2sgPSBmdW5jdGlvbiByZWdpc3RlckZpbmRIb29rIChhZGRIb29rKVxue1xuICAgIGlmIChhZGRIb29rKVxuICAgIHtcbiAgICAgICAgdGhpcy5hZGRIb29rcy5wdXNoKGFkZEhvb2spO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGhvb2tzIGZvciB1cGxvYWRpbmcgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBsb2FkSG9vayAtIEZ1bmN0aW9uIGNhbGwgdGhhdCB0YWtlcyB0d28gcGFyYW1ldGVyczogYHByZXBhcmU6Q2FudmFzUHJlcGFyZSwgaXRlbToqYCBhbmRcbiAqICAgICAgZnVuY3Rpb24gbXVzdCByZXR1cm4gYHRydWVgIGlmIGl0IHdhcyBhYmxlIHRvIGhhbmRsZSB1cGxvYWQgb2YgaXRlbS5cbiAqIEByZXR1cm4ge3RoaXN9IEluc3RhbmNlIG9mIHBsdWdpbiBmb3IgY2hhaW5pbmcuXG4gKi9cbkJhc2VQcmVwYXJlLnByb3RvdHlwZS5yZWdpc3RlclVwbG9hZEhvb2sgPSBmdW5jdGlvbiByZWdpc3RlclVwbG9hZEhvb2sgKHVwbG9hZEhvb2spXG57XG4gICAgaWYgKHVwbG9hZEhvb2spXG4gICAge1xuICAgICAgICB0aGlzLnVwbG9hZEhvb2tzLnB1c2godXBsb2FkSG9vayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIE1hbnVhbGx5IGFkZCBhbiBpdGVtIHRvIHRoZSB1cGxvYWRpbmcgcXVldWUuXG4gKlxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R8UElYSS5Db250YWluZXJ8UElYSS5CYXNlVGV4dHVyZXxQSVhJLlRleHR1cmV8UElYSS5HcmFwaGljc3xQSVhJLlRleHR8Kn0gaXRlbSAtIE9iamVjdCB0b1xuICogICAgYWRkIHRvIHRoZSBxdWV1ZVxuICogQHJldHVybiB7dGhpc30gSW5zdGFuY2Ugb2YgcGx1Z2luIGZvciBjaGFpbmluZy5cbiAqL1xuQmFzZVByZXBhcmUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoaXRlbSlcbntcbiAgICAvLyBBZGQgYWRkaXRpb25hbCBob29rcyBmb3IgZmluZGluZyBlbGVtZW50cyBvbiBzcGVjaWFsXG4gICAgLy8gdHlwZXMgb2Ygb2JqZWN0cyB0aGF0XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuYWRkSG9va3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspXG4gICAge1xuICAgICAgICBpZiAodGhpcy5hZGRIb29rc1tpXShpdGVtLCB0aGlzLnF1ZXVlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgY2hpbGRyZW4gcmVjdXJzaXZlbHlcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRhaW5lcilcbiAgICB7XG4gICAgICAgIGZvciAodmFyIGkkMSA9IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSQxID49IDA7IGkkMS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmFkZChpdGVtLmNoaWxkcmVuW2kkMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBwbHVnaW4sIGRvbid0IHVzZSBhZnRlciB0aGlzLlxuICpcbiAqL1xuQmFzZVByZXBhcmUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95ICgpXG57XG4gICAgaWYgKHRoaXMudGlja2luZylcbiAgICB7XG4gICAgICAgIFRpY2tlci5zeXN0ZW0ucmVtb3ZlKHRoaXMudGljaywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudGlja2luZyA9IGZhbHNlO1xuICAgIHRoaXMuYWRkSG9va3MgPSBudWxsO1xuICAgIHRoaXMudXBsb2FkSG9va3MgPSBudWxsO1xuICAgIHRoaXMucmVuZGVyZXIgPSBudWxsO1xuICAgIHRoaXMuY29tcGxldGVzID0gbnVsbDtcbiAgICB0aGlzLnF1ZXVlID0gbnVsbDtcbiAgICB0aGlzLmxpbWl0ZXIgPSBudWxsO1xuICAgIHRoaXMudXBsb2FkSG9va0hlbHBlciA9IG51bGw7XG59O1xuXG4vKipcbiAqIEJ1aWx0LWluIGhvb2sgdG8gZmluZCBtdWx0aXBsZSB0ZXh0dXJlcyBmcm9tIG9iamVjdHMgbGlrZSBBbmltYXRlZFNwcml0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBpdGVtIC0gRGlzcGxheSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7QXJyYXk8Kj59IHF1ZXVlIC0gQ29sbGVjdGlvbiBvZiBpdGVtcyB0byB1cGxvYWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIGEgUElYSS5UZXh0dXJlIG9iamVjdCB3YXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNdWx0aXBsZUJhc2VUZXh0dXJlcyhpdGVtLCBxdWV1ZSlcbntcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAvLyBPYmplY3RzIHdpdGggbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoaXRlbSAmJiBpdGVtLl90ZXh0dXJlcyAmJiBpdGVtLl90ZXh0dXJlcy5sZW5ndGgpXG4gICAge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW0uX3RleHR1cmVzLmxlbmd0aDsgaSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoaXRlbS5fdGV4dHVyZXNbaV0gaW5zdGFuY2VvZiBUZXh0dXJlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBiYXNlVGV4dHVyZSA9IGl0ZW0uX3RleHR1cmVzW2ldLmJhc2VUZXh0dXJlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmluZGV4T2YoYmFzZVRleHR1cmUpID09PSAtMSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goYmFzZVRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbHQtaW4gaG9vayB0byBmaW5kIEJhc2VUZXh0dXJlcyBmcm9tIFRleHR1cmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5UZXh0dXJlfSBpdGVtIC0gRGlzcGxheSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7QXJyYXk8Kj59IHF1ZXVlIC0gQ29sbGVjdGlvbiBvZiBpdGVtcyB0byB1cGxvYWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIGEgUElYSS5UZXh0dXJlIG9iamVjdCB3YXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRCYXNlVGV4dHVyZShpdGVtLCBxdWV1ZSlcbntcbiAgICBpZiAoaXRlbS5iYXNlVGV4dHVyZSBpbnN0YW5jZW9mIEJhc2VUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBpdGVtLmJhc2VUZXh0dXJlO1xuXG4gICAgICAgIGlmIChxdWV1ZS5pbmRleE9mKHRleHR1cmUpID09PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgcXVldWUucHVzaCh0ZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBCdWlsdC1pbiBob29rIHRvIGZpbmQgdGV4dHVyZXMgZnJvbSBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuRGlzcGxheU9iamVjdH0gaXRlbSAtIERpc3BsYXkgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcGFyYW0ge0FycmF5PCo+fSBxdWV1ZSAtIENvbGxlY3Rpb24gb2YgaXRlbXMgdG8gdXBsb2FkXG4gKiBAcmV0dXJuIHtib29sZWFufSBpZiBhIFBJWEkuVGV4dHVyZSBvYmplY3Qgd2FzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBmaW5kVGV4dHVyZShpdGVtLCBxdWV1ZSlcbntcbiAgICBpZiAoaXRlbS5fdGV4dHVyZSAmJiBpdGVtLl90ZXh0dXJlIGluc3RhbmNlb2YgVGV4dHVyZSlcbiAgICB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gaXRlbS5fdGV4dHVyZS5iYXNlVGV4dHVyZTtcblxuICAgICAgICBpZiAocXVldWUuaW5kZXhPZih0ZXh0dXJlKSA9PT0gLTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQnVpbHQtaW4gaG9vayB0byBkcmF3IFBJWEkuVGV4dCB0byBpdHMgdGV4dHVyZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfFBJWEkuQ2FudmFzUHJlcGFyZX0gaGVscGVyIC0gTm90IHVzZWQgYnkgdGhpcyB1cGxvYWQgaGFuZGxlclxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGl0ZW0gLSBJdGVtIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBJZiBpdGVtIHdhcyB1cGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gZHJhd1RleHQoaGVscGVyLCBpdGVtKVxue1xuICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVGV4dClcbiAgICB7XG4gICAgICAgIC8vIHVwZGF0aW5nIHRleHQgd2lsbCByZXR1cm4gZWFybHkgaWYgaXQgaXMgbm90IGRpcnR5XG4gICAgICAgIGl0ZW0udXBkYXRlVGV4dCh0cnVlKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQnVpbHQtaW4gaG9vayB0byBjYWxjdWxhdGUgYSB0ZXh0IHN0eWxlIGZvciBhIFBJWEkuVGV4dCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcnxQSVhJLkNhbnZhc1ByZXBhcmV9IGhlbHBlciAtIE5vdCB1c2VkIGJ5IHRoaXMgdXBsb2FkIGhhbmRsZXJcbiAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBpdGVtIC0gSXRlbSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgaXRlbSB3YXMgdXBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRleHRTdHlsZShoZWxwZXIsIGl0ZW0pXG57XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZXh0U3R5bGUpXG4gICAge1xuICAgICAgICB2YXIgZm9udCA9IGl0ZW0udG9Gb250U3RyaW5nKCk7XG5cbiAgICAgICAgVGV4dE1ldHJpY3MubWVhc3VyZUZvbnQoZm9udCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIGhvb2sgdG8gZmluZCBUZXh0IG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBpdGVtIC0gRGlzcGxheSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7QXJyYXk8Kj59IHF1ZXVlIC0gQ29sbGVjdGlvbiBvZiBpdGVtcyB0byB1cGxvYWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIGEgUElYSS5UZXh0IG9iamVjdCB3YXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRUZXh0KGl0ZW0sIHF1ZXVlKVxue1xuICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVGV4dClcbiAgICB7XG4gICAgICAgIC8vIHB1c2ggdGhlIHRleHQgc3R5bGUgdG8gcHJlcGFyZSBpdCAtIHRoaXMgY2FuIGJlIHJlYWxseSBleHBlbnNpdmVcbiAgICAgICAgaWYgKHF1ZXVlLmluZGV4T2YoaXRlbS5zdHlsZSkgPT09IC0xKVxuICAgICAgICB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGl0ZW0uc3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFsc28gcHVzaCB0aGUgdGV4dCBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gcmVuZGVyIGl0ICh0byBjYW52YXMvdGV4dHVyZSkgaWYgbmVlZGVkXG4gICAgICAgIGlmIChxdWV1ZS5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbHNvIHB1c2ggdGhlIFRleHQncyB0ZXh0dXJlIGZvciB1cGxvYWQgdG8gR1BVXG4gICAgICAgIHZhciB0ZXh0dXJlID0gaXRlbS5fdGV4dHVyZS5iYXNlVGV4dHVyZTtcblxuICAgICAgICBpZiAocXVldWUuaW5kZXhPZih0ZXh0dXJlKSA9PT0gLTEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQnVpbHQtaW4gaG9vayB0byBmaW5kIFRleHRTdHlsZSBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1BJWEkuVGV4dFN0eWxlfSBpdGVtIC0gRGlzcGxheSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7QXJyYXk8Kj59IHF1ZXVlIC0gQ29sbGVjdGlvbiBvZiBpdGVtcyB0byB1cGxvYWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIGEgUElYSS5UZXh0U3R5bGUgb2JqZWN0IHdhcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gZmluZFRleHRTdHlsZShpdGVtLCBxdWV1ZSlcbntcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRleHRTdHlsZSlcbiAgICB7XG4gICAgICAgIGlmIChxdWV1ZS5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgcXVldWUucHVzaChpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgcHJlcGFyZSBwbHVnaW4gcHJvdmlkZXMgcmVuZGVyZXItc3BlY2lmaWMgcGx1Z2lucyBmb3IgcHJlLXJlbmRlcmluZyBEaXNwbGF5T2JqZWN0cy4gVGhlc2UgcGx1Z2lucyBhcmUgdXNlZnVsIGZvclxuICogYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIGFuZCB1cGxvYWRpbmcgdG8gdGhlIEdQVSBhc3NldHMsIHRleHR1cmVzLCBncmFwaGljcyB3YWl0aW5nIHRvIGJlIGRpc3BsYXllZC5cbiAqXG4gKiBEbyBub3QgaW5zdGFudGlhdGUgdGhpcyBwbHVnaW4gZGlyZWN0bHkuIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBgcmVuZGVyZXIucGx1Z2luc2AgcHJvcGVydHkuXG4gKiBTZWUge0BsaW5rIFBJWEkuQ2FudmFzUmVuZGVyZXIjcGx1Z2luc30gb3Ige0BsaW5rIFBJWEkuUmVuZGVyZXIjcGx1Z2luc30uXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uXG4gKiBjb25zdCBhcHAgPSBuZXcgUElYSS5BcHBsaWNhdGlvbigpO1xuICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcHAudmlldyk7XG4gKlxuICogLy8gRG9uJ3Qgc3RhcnQgcmVuZGVyaW5nIHJpZ2h0IGF3YXlcbiAqIGFwcC5zdG9wKCk7XG4gKlxuICogLy8gY3JlYXRlIGEgZGlzcGxheSBvYmplY3RcbiAqIGNvbnN0IHJlY3QgPSBuZXcgUElYSS5HcmFwaGljcygpXG4gKiAgICAgLmJlZ2luRmlsbCgweDAwZmYwMClcbiAqICAgICAuZHJhd1JlY3QoNDAsIDQwLCAyMDAsIDIwMCk7XG4gKlxuICogLy8gQWRkIHRvIHRoZSBzdGFnZVxuICogYXBwLnN0YWdlLmFkZENoaWxkKHJlY3QpO1xuICpcbiAqIC8vIERvbid0IHN0YXJ0IHJlbmRlcmluZyB1bnRpbCB0aGUgZ3JhcGhpYyBpcyB1cGxvYWRlZCB0byB0aGUgR1BVXG4gKiBhcHAucmVuZGVyZXIucGx1Z2lucy5wcmVwYXJlLnVwbG9hZChhcHAuc3RhZ2UsICgpID0+IHtcbiAqICAgICBhcHAuc3RhcnQoKTtcbiAqIH0pO1xuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5CYXNlUHJlcGFyZVxuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFByZXBhcmUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChCYXNlUHJlcGFyZSkge1xuICAgIGZ1bmN0aW9uIFByZXBhcmUocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBCYXNlUHJlcGFyZS5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICB0aGlzLnVwbG9hZEhvb2tIZWxwZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlcyBhbmQgZ3JhcGhpY3MgdG8gdXBsb2FkXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGaW5kSG9vayhmaW5kR3JhcGhpY3MpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVXBsb2FkSG9vayh1cGxvYWRCYXNlVGV4dHVyZXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVXBsb2FkSG9vayh1cGxvYWRHcmFwaGljcyk7XG4gICAgfVxuXG4gICAgaWYgKCBCYXNlUHJlcGFyZSApIFByZXBhcmUuX19wcm90b19fID0gQmFzZVByZXBhcmU7XG4gICAgUHJlcGFyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCYXNlUHJlcGFyZSAmJiBCYXNlUHJlcGFyZS5wcm90b3R5cGUgKTtcbiAgICBQcmVwYXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFByZXBhcmU7XG5cbiAgICByZXR1cm4gUHJlcGFyZTtcbn0oQmFzZVByZXBhcmUpKTtcbi8qKlxuICogQnVpbHQtaW4gaG9vayB0byB1cGxvYWQgUElYSS5UZXh0dXJlIG9iamVjdHMgdG8gdGhlIEdQVS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIGluc3RhbmNlIG9mIHRoZSB3ZWJnbCByZW5kZXJlclxuICogQHBhcmFtIHtQSVhJLkJhc2VUZXh0dXJlfSBpdGVtIC0gSXRlbSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgaXRlbSB3YXMgdXBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIHVwbG9hZEJhc2VUZXh0dXJlcyhyZW5kZXJlciwgaXRlbSlcbntcbiAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgLy8gaWYgdGhlIHRleHR1cmUgYWxyZWFkeSBoYXMgYSBHTCB0ZXh0dXJlLCB0aGVuIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIHByZXBhcmVkIG9yIHJlbmRlcmVkXG4gICAgICAgIC8vIGJlZm9yZSBub3cuIElmIHRoZSB0ZXh0dXJlIGNoYW5nZWQsIHRoZW4gdGhlIGNoYW5nZXIgc2hvdWxkIGJlIGNhbGxpbmcgdGV4dHVyZS51cGRhdGUoKSB3aGljaFxuICAgICAgICAvLyByZXVwbG9hZHMgdGhlIHRleHR1cmUgd2l0aG91dCBuZWVkIGZvciBwcmVwYXJpbmcgaXQgYWdhaW5cbiAgICAgICAgaWYgKCFpdGVtLl9nbFRleHR1cmVzW3JlbmRlcmVyLkNPTlRFWFRfVUlEXSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVuZGVyZXIudGV4dHVyZS5iaW5kKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWx0LWluIGhvb2sgdG8gdXBsb2FkIFBJWEkuR3JhcGhpY3MgdG8gdGhlIEdQVS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIGluc3RhbmNlIG9mIHRoZSB3ZWJnbCByZW5kZXJlclxuICogQHBhcmFtIHtQSVhJLkRpc3BsYXlPYmplY3R9IGl0ZW0gLSBJdGVtIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBJZiBpdGVtIHdhcyB1cGxvYWRlZC5cbiAqL1xuZnVuY3Rpb24gdXBsb2FkR3JhcGhpY3MocmVuZGVyZXIsIGl0ZW0pXG57XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIEdyYXBoaWNzKSlcbiAgICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZ2VvbWV0cnkgPSBpdGVtLmdlb21ldHJ5O1xuXG4gICAgLy8gdXBkYXRlIGRpcnR5IGdyYXBoaWNzIHRvIGdldCBiYXRjaGVzXG4gICAgaXRlbS5maW5pc2hQb2x5KCk7XG4gICAgZ2VvbWV0cnkudXBkYXRlQmF0Y2hlcygpO1xuXG4gICAgdmFyIGJhdGNoZXMgPSBnZW9tZXRyeS5iYXRjaGVzO1xuXG4gICAgLy8gdXBsb2FkIGFsbCB0ZXh0dXJlcyBmb3VuZCBpbiBzdHlsZXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhdGNoZXMubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgcmVmID0gYmF0Y2hlc1tpXS5zdHlsZTtcbiAgICAgICAgdmFyIHRleHR1cmUgPSByZWYudGV4dHVyZTtcblxuICAgICAgICBpZiAodGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdXBsb2FkQmFzZVRleHR1cmVzKHJlbmRlcmVyLCB0ZXh0dXJlLmJhc2VUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIGl0cyBub3QgYmF0Y2hhYmxlIC0gdXBkYXRlIHZhbyBmb3IgcGFydGljdWxhciBzaGFkZXJcbiAgICBpZiAoIWdlb21ldHJ5LmJhdGNoYWJsZSlcbiAgICB7XG4gICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmJpbmQoZ2VvbWV0cnksIGl0ZW0uX3Jlc29sdmVEaXJlY3RTaGFkZXIocmVuZGVyZXIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsdC1pbiBob29rIHRvIGZpbmQgZ3JhcGhpY3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7UElYSS5EaXNwbGF5T2JqZWN0fSBpdGVtIC0gRGlzcGxheSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSB7QXJyYXk8Kj59IHF1ZXVlIC0gQ29sbGVjdGlvbiBvZiBpdGVtcyB0byB1cGxvYWRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIGEgUElYSS5HcmFwaGljcyBvYmplY3Qgd2FzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBmaW5kR3JhcGhpY3MoaXRlbSwgcXVldWUpXG57XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHcmFwaGljcylcbiAgICB7XG4gICAgICAgIHF1ZXVlLnB1c2goaXRlbSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRpbWVMaW1pdGVyIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGhhbmRsZWQgYnkgYSB7QGxpbmsgUElYSS5CYXNlUHJlcGFyZX0gdG8gYSBzcGVjaWZpZWRcbiAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcGVyIGZyYW1lLlxuICpcbiAqIEBjbGFzc1xuICogQG1lbWJlcm9mIFBJWElcbiAqL1xudmFyIFRpbWVMaW1pdGVyID0gZnVuY3Rpb24gVGltZUxpbWl0ZXIobWF4TWlsbGlzZWNvbmRzKVxue1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG1pbGxpc2Vjb25kcyB0aGF0IGNhbiBiZSBzcGVudCBwcmVwYXJpbmcgaXRlbXMgZWFjaCBmcmFtZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5tYXhNaWxsaXNlY29uZHMgPSBtYXhNaWxsaXNlY29uZHM7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgZnJhbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZnJhbWVTdGFydCA9IDA7XG59O1xuXG4vKipcbiAqIFJlc2V0cyBhbnkgY291bnRpbmcgcHJvcGVydGllcyB0byBzdGFydCBmcmVzaCBvbiBhIG5ldyBmcmFtZS5cbiAqL1xuVGltZUxpbWl0ZXIucHJvdG90eXBlLmJlZ2luRnJhbWUgPSBmdW5jdGlvbiBiZWdpbkZyYW1lICgpXG57XG4gICAgdGhpcy5mcmFtZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRvIHNlZSBpZiBhbm90aGVyIGl0ZW0gY2FuIGJlIHVwbG9hZGVkLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBpdGVtLlxuICogQHJldHVybiB7Ym9vbGVhbn0gSWYgdGhlIGl0ZW0gaXMgYWxsb3dlZCB0byBiZSB1cGxvYWRlZC5cbiAqL1xuVGltZUxpbWl0ZXIucHJvdG90eXBlLmFsbG93ZWRUb1VwbG9hZCA9IGZ1bmN0aW9uIGFsbG93ZWRUb1VwbG9hZCAoKVxue1xuICAgIHJldHVybiBEYXRlLm5vdygpIC0gdGhpcy5mcmFtZVN0YXJ0IDwgdGhpcy5tYXhNaWxsaXNlY29uZHM7XG59O1xuXG5leHBvcnQgeyBCYXNlUHJlcGFyZSwgQ291bnRMaW1pdGVyLCBQcmVwYXJlLCBUaW1lTGltaXRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJlcGFyZS5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvc3ByaXRlc2hlZXQgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvc3ByaXRlc2hlZXQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICdAcGl4aS9tYXRoJztcbmltcG9ydCB7IFRleHR1cmUsIEJhc2VUZXh0dXJlIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5pbXBvcnQgeyBnZXRSZXNvbHV0aW9uT2ZVcmwsIHVybCB9IGZyb20gJ0BwaXhpL3V0aWxzJztcbmltcG9ydCB7IExvYWRlclJlc291cmNlIH0gZnJvbSAnQHBpeGkvbG9hZGVycyc7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBmb3IgbWFpbnRhaW5pbmcgcmVmZXJlbmNlIHRvIGEgY29sbGVjdGlvblxuICogb2YgVGV4dHVyZXMgb24gYSBzaW5nbGUgU3ByaXRlc2hlZXQuXG4gKlxuICogVG8gYWNjZXNzIGEgc3ByaXRlIHNoZWV0IGZyb20geW91ciBjb2RlIHBhc3MgaXRzIEpTT04gZGF0YSBmaWxlIHRvIFBpeGkncyBsb2FkZXI6XG4gKlxuICogYGBganNcbiAqIFBJWEkuTG9hZGVyLnNoYXJlZC5hZGQoXCJpbWFnZXMvc3ByaXRlc2hlZXQuanNvblwiKS5sb2FkKHNldHVwKTtcbiAqXG4gKiBmdW5jdGlvbiBzZXR1cCgpIHtcbiAqICAgbGV0IHNoZWV0ID0gUElYSS5Mb2FkZXIuc2hhcmVkLnJlc291cmNlc1tcImltYWdlcy9zcHJpdGVzaGVldC5qc29uXCJdLnNwcml0ZXNoZWV0O1xuICogICAuLi5cbiAqIH1cbiAqIGBgYFxuICogV2l0aCB0aGUgYHNoZWV0LnRleHR1cmVzYCB5b3UgY2FuIGNyZWF0ZSBTcHJpdGUgb2JqZWN0cyxgc2hlZXQuYW5pbWF0aW9uc2AgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIEFuaW1hdGVkU3ByaXRlLlxuICpcbiAqIFNwcml0ZSBzaGVldHMgY2FuIGJlIHBhY2tlZCB1c2luZyB0b29scyBsaWtlIHtAbGluayBodHRwczovL2NvZGVhbmR3ZWIuY29tL3RleHR1cmVwYWNrZXJ8VGV4dHVyZVBhY2tlcn0sXG4gKiB7QGxpbmsgaHR0cHM6Ly9yZW5kZXJoanMubmV0L3Nob2Vib3gvfFNob2Vib3h9IG9yIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20va3J6eXN6dG9mLW8vc3ByaXRlc2hlZXQuanN8U3ByaXRlc2hlZXQuanN9LlxuICogRGVmYXVsdCBhbmNob3IgcG9pbnRzIChzZWUge0BsaW5rIFBJWEkuVGV4dHVyZSNkZWZhdWx0QW5jaG9yfSkgYW5kIGdyb3VwaW5nIG9mIGFuaW1hdGlvbiBzcHJpdGVzIGFyZSBjdXJyZW50bHkgb25seVxuICogc3VwcG9ydGVkIGJ5IFRleHR1cmVQYWNrZXIuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgU3ByaXRlc2hlZXQgPSBmdW5jdGlvbiBTcHJpdGVzaGVldCh0ZXh0dXJlLCBkYXRhLCByZXNvbHV0aW9uRmlsZW5hbWUpXG57XG4gICAgaWYgKCByZXNvbHV0aW9uRmlsZW5hbWUgPT09IHZvaWQgMCApIHJlc29sdXRpb25GaWxlbmFtZSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gb3JpZ2luYWwgc291cmNlIGltYWdlIGZyb20gdGhlIExvYWRlci4gVGhpcyByZWZlcmVuY2UgaXMgcmV0YWluZWQgc28gd2VcbiAgICAgKiBjYW4gZGVzdHJveSB0aGUgVGV4dHVyZSBsYXRlciBvbi4gSXQgaXMgbmV2ZXIgdXNlZCBpbnRlcm5hbGx5LlxuICAgICAqIEB0eXBlIHtQSVhJLlRleHR1cmV9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl90ZXh0dXJlID0gdGV4dHVyZSBpbnN0YW5jZW9mIFRleHR1cmUgPyB0ZXh0dXJlIDogbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byB0aHMgc291cmNlIHRleHR1cmUuXG4gICAgICogQHR5cGUge1BJWEkuQmFzZVRleHR1cmV9XG4gICAgICovXG4gICAgdGhpcy5iYXNlVGV4dHVyZSA9IHRleHR1cmUgaW5zdGFuY2VvZiBCYXNlVGV4dHVyZSA/IHRleHR1cmUgOiB0aGlzLl90ZXh0dXJlLmJhc2VUZXh0dXJlO1xuXG4gICAgLyoqXG4gICAgICogQSBtYXAgY29udGFpbmluZyBhbGwgdGV4dHVyZXMgb2YgdGhlIHNwcml0ZSBzaGVldC5cbiAgICAgKiBDYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB7QGxpbmsgUElYSS5TcHJpdGV8U3ByaXRlfTpcbiAgICAgKiBgYGBqc1xuICAgICAqIG5ldyBQSVhJLlNwcml0ZShzaGVldC50ZXh0dXJlc1tcImltYWdlLnBuZ1wiXSk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlciB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEEgbWFwIGNvbnRhaW5pbmcgdGhlIHRleHR1cmVzIGZvciBlYWNoIGFuaW1hdGlvbi5cbiAgICAgKiBDYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4ge0BsaW5rIFBJWEkuQW5pbWF0ZWRTcHJpdGV8QW5pbWF0ZWRTcHJpdGV9OlxuICAgICAqIGBgYGpzXG4gICAgICogbmV3IFBJWEkuQW5pbWF0ZWRTcHJpdGUoc2hlZXQuYW5pbWF0aW9uc1tcImFuaW1fbmFtZVwiXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5hbmltYXRpb25zID0ge307XG5cbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIEpTT04gZGF0YS5cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgc3ByaXRlc2hlZXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLl91cGRhdGVSZXNvbHV0aW9uKFxuICAgICAgICByZXNvbHV0aW9uRmlsZW5hbWVcbiAgICAgICAgfHwgKHRoaXMuYmFzZVRleHR1cmUucmVzb3VyY2UgPyB0aGlzLmJhc2VUZXh0dXJlLnJlc291cmNlLnVybCA6IG51bGwpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIE1hcCBvZiBzcHJpdGVzaGVldCBmcmFtZXMuXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYW1lcyA9IHRoaXMuZGF0YS5mcmFtZXM7XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0aW9uIG9mIGZyYW1lIG5hbWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYW1lS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2ZyYW1lcyk7XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhdGNoIGluZGV4IGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fYmF0Y2hJbmRleCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB3aGVuIHBhcnNlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG59O1xuXG52YXIgc3RhdGljQWNjZXNzb3JzID0geyBCQVRDSF9TSVpFOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHJlc29sdXRpb24gZnJvbSB0aGUgZmlsZW5hbWUgb3IgZmFsbGJhY2tcbiAqIHRvIHRoZSBtZXRhLnNjYWxlIGZpZWxkIG9mIHRoZSBKU09OIGRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvbHV0aW9uRmlsZW5hbWUgLSBUaGUgZmlsZW5hbWUgdG8gdXNlIGZvciByZXNvbHZpbmdcbiAqICAgIHRoZSBkZWZhdWx0IHJlc29sdXRpb24uXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJlc29sdXRpb24gdG8gdXNlIGZvciBzcHJpdGVzaGVldC5cbiAqL1xuc3RhdGljQWNjZXNzb3JzLkJBVENIX1NJWkUuZ2V0ID0gZnVuY3Rpb24gKClcbntcbiAgICByZXR1cm4gMTAwMDtcbn07XG5cblNwcml0ZXNoZWV0LnByb3RvdHlwZS5fdXBkYXRlUmVzb2x1dGlvbiA9IGZ1bmN0aW9uIF91cGRhdGVSZXNvbHV0aW9uIChyZXNvbHV0aW9uRmlsZW5hbWUpXG57XG4gICAgdmFyIHNjYWxlID0gdGhpcy5kYXRhLm1ldGEuc2NhbGU7XG5cbiAgICAvLyBVc2UgYSBkZWZhdWx0VmFsdWUgb2YgYG51bGxgIHRvIGNoZWNrIGlmIGEgdXJsLWJhc2VkIHJlc29sdXRpb24gaXMgc2V0XG4gICAgdmFyIHJlc29sdXRpb24gPSBnZXRSZXNvbHV0aW9uT2ZVcmwocmVzb2x1dGlvbkZpbGVuYW1lLCBudWxsKTtcblxuICAgIC8vIE5vIHJlc29sdXRpb24gZm91bmQgdmlhIFVSTFxuICAgIGlmIChyZXNvbHV0aW9uID09PSBudWxsKVxuICAgIHtcbiAgICAgICAgLy8gVXNlIHRoZSBzY2FsZSB2YWx1ZSBvciBkZWZhdWx0IHRvIDFcbiAgICAgICAgcmVzb2x1dGlvbiA9IHNjYWxlICE9PSB1bmRlZmluZWQgPyBwYXJzZUZsb2F0KHNjYWxlKSA6IDE7XG4gICAgfVxuXG4gICAgLy8gRm9yIG5vbi0xIHJlc29sdXRpb25zLCB1cGRhdGUgYmFzZVRleHR1cmVcbiAgICBpZiAocmVzb2x1dGlvbiAhPT0gMSlcbiAgICB7XG4gICAgICAgIHRoaXMuYmFzZVRleHR1cmUuc2V0UmVzb2x1dGlvbihyZXNvbHV0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x1dGlvbjtcbn07XG5cbi8qKlxuICogUGFyc2VyIHNwcml0ZXNoZWV0IGZyb20gbG9hZGVkIGRhdGEuIFRoaXMgaXMgZG9uZSBhc3luY2hyb25vdXNseVxuICogdG8gcHJldmVudCBjcmVhdGluZyB0b28gbWFueSBUZXh0dXJlIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgd2hlbiBjb21wbGV0ZSByZXR1cm5zXG4gKiAgICBhIG1hcCBvZiB0aGUgVGV4dHVyZXMgZm9yIHRoaXMgc3ByaXRlc2hlZXQuXG4gKi9cblNwcml0ZXNoZWV0LnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlIChjYWxsYmFjaylcbntcbiAgICB0aGlzLl9iYXRjaEluZGV4ID0gMDtcbiAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgaWYgKHRoaXMuX2ZyYW1lS2V5cy5sZW5ndGggPD0gU3ByaXRlc2hlZXQuQkFUQ0hfU0laRSlcbiAgICB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NGcmFtZXMoMCk7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NBbmltYXRpb25zKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgdGhpcy5fbmV4dEJhdGNoKCk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBQcm9jZXNzIGEgYmF0Y2ggb2YgZnJhbWVzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbml0aWFsRnJhbWVJbmRleCAtIFRoZSBpbmRleCBvZiBmcmFtZSB0byBzdGFydC5cbiAqL1xuU3ByaXRlc2hlZXQucHJvdG90eXBlLl9wcm9jZXNzRnJhbWVzID0gZnVuY3Rpb24gX3Byb2Nlc3NGcmFtZXMgKGluaXRpYWxGcmFtZUluZGV4KVxue1xuICAgIHZhciBmcmFtZUluZGV4ID0gaW5pdGlhbEZyYW1lSW5kZXg7XG4gICAgdmFyIG1heEZyYW1lcyA9IFNwcml0ZXNoZWV0LkJBVENIX1NJWkU7XG5cbiAgICB3aGlsZSAoZnJhbWVJbmRleCAtIGluaXRpYWxGcmFtZUluZGV4IDwgbWF4RnJhbWVzICYmIGZyYW1lSW5kZXggPCB0aGlzLl9mcmFtZUtleXMubGVuZ3RoKVxuICAgIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9mcmFtZUtleXNbZnJhbWVJbmRleF07XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5fZnJhbWVzW2ldO1xuICAgICAgICB2YXIgcmVjdCA9IGRhdGEuZnJhbWU7XG5cbiAgICAgICAgaWYgKHJlY3QpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBmcmFtZSA9IG51bGw7XG4gICAgICAgICAgICB2YXIgdHJpbSA9IG51bGw7XG4gICAgICAgICAgICB2YXIgc291cmNlU2l6ZSA9IGRhdGEudHJpbW1lZCAhPT0gZmFsc2UgJiYgZGF0YS5zb3VyY2VTaXplXG4gICAgICAgICAgICAgICAgPyBkYXRhLnNvdXJjZVNpemUgOiBkYXRhLmZyYW1lO1xuXG4gICAgICAgICAgICB2YXIgb3JpZyA9IG5ldyBSZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc291cmNlU2l6ZS53KSAvIHRoaXMucmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHNvdXJjZVNpemUuaCkgLyB0aGlzLnJlc29sdXRpb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnJvdGF0ZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnJhbWUgPSBuZXcgUmVjdGFuZ2xlKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHJlY3QueCkgLyB0aGlzLnJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVjdC55KSAvIHRoaXMucmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZWN0LmgpIC8gdGhpcy5yZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHJlY3QudykgLyB0aGlzLnJlc29sdXRpb25cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IFJlY3RhbmdsZShcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZWN0LngpIC8gdGhpcy5yZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHJlY3QueSkgLyB0aGlzLnJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVjdC53KSAvIHRoaXMucmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZWN0LmgpIC8gdGhpcy5yZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gIENoZWNrIHRvIHNlZSBpZiB0aGUgc3ByaXRlIGlzIHRyaW1tZWRcbiAgICAgICAgICAgIGlmIChkYXRhLnRyaW1tZWQgIT09IGZhbHNlICYmIGRhdGEuc3ByaXRlU291cmNlU2l6ZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmltID0gbmV3IFJlY3RhbmdsZShcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkYXRhLnNwcml0ZVNvdXJjZVNpemUueCkgLyB0aGlzLnJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZGF0YS5zcHJpdGVTb3VyY2VTaXplLnkpIC8gdGhpcy5yZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHJlY3QudykgLyB0aGlzLnJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVjdC5oKSAvIHRoaXMucmVzb2x1dGlvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXNbaV0gPSBuZXcgVGV4dHVyZShcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VUZXh0dXJlLFxuICAgICAgICAgICAgICAgIGZyYW1lLFxuICAgICAgICAgICAgICAgIG9yaWcsXG4gICAgICAgICAgICAgICAgdHJpbSxcbiAgICAgICAgICAgICAgICBkYXRhLnJvdGF0ZWQgPyAyIDogMCxcbiAgICAgICAgICAgICAgICBkYXRhLmFuY2hvclxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gbGV0cyBhbHNvIGFkZCB0aGUgZnJhbWUgdG8gcGl4aSdzIGdsb2JhbCBjYWNoZSBmb3IgJ2Zyb20nIGFuZCAnZnJvbUxvYWRlcicgZnVuY3Rpb25zXG4gICAgICAgICAgICBUZXh0dXJlLmFkZFRvQ2FjaGUodGhpcy50ZXh0dXJlc1tpXSwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFtZUluZGV4Kys7XG4gICAgfVxufTtcblxuLyoqXG4gKiBQYXJzZSBhbmltYXRpb25zIGNvbmZpZ1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblNwcml0ZXNoZWV0LnByb3RvdHlwZS5fcHJvY2Vzc0FuaW1hdGlvbnMgPSBmdW5jdGlvbiBfcHJvY2Vzc0FuaW1hdGlvbnMgKClcbntcbiAgICB2YXIgYW5pbWF0aW9ucyA9IHRoaXMuZGF0YS5hbmltYXRpb25zIHx8IHt9O1xuXG4gICAgZm9yICh2YXIgYW5pbU5hbWUgaW4gYW5pbWF0aW9ucylcbiAgICB7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9uc1thbmltTmFtZV0gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zW2FuaW1OYW1lXS5sZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGZyYW1lTmFtZSA9IGFuaW1hdGlvbnNbYW5pbU5hbWVdW2ldO1xuXG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbnNbYW5pbU5hbWVdLnB1c2godGhpcy50ZXh0dXJlc1tmcmFtZU5hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogVGhlIHBhcnNlIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuU3ByaXRlc2hlZXQucHJvdG90eXBlLl9wYXJzZUNvbXBsZXRlID0gZnVuY3Rpb24gX3BhcnNlQ29tcGxldGUgKClcbntcbiAgICB2YXIgY2FsbGJhY2sgPSB0aGlzLl9jYWxsYmFjaztcblxuICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9iYXRjaEluZGV4ID0gMDtcbiAgICBjYWxsYmFjay5jYWxsKHRoaXMsIHRoaXMudGV4dHVyZXMpO1xufTtcblxuLyoqXG4gKiBCZWdpbiB0aGUgbmV4dCBiYXRjaCBvZiB0ZXh0dXJlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5TcHJpdGVzaGVldC5wcm90b3R5cGUuX25leHRCYXRjaCA9IGZ1bmN0aW9uIF9uZXh0QmF0Y2ggKClcbntcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLl9wcm9jZXNzRnJhbWVzKHRoaXMuX2JhdGNoSW5kZXggKiBTcHJpdGVzaGVldC5CQVRDSF9TSVpFKTtcbiAgICB0aGlzLl9iYXRjaEluZGV4Kys7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzJDEuX2JhdGNoSW5kZXggKiBTcHJpdGVzaGVldC5CQVRDSF9TSVpFIDwgdGhpcyQxLl9mcmFtZUtleXMubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzJDEuX25leHRCYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcyQxLl9wcm9jZXNzQW5pbWF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcyQxLl9wYXJzZUNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9LCAwKTtcbn07XG5cbi8qKlxuICogRGVzdHJveSBTcHJpdGVzaGVldCBhbmQgZG9uJ3QgdXNlIGFmdGVyIHRoaXMuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBbZGVzdHJveUJhc2U9ZmFsc2VdIFdoZXRoZXIgdG8gZGVzdHJveSB0aGUgYmFzZSB0ZXh0dXJlIGFzIHdlbGxcbiAqL1xuU3ByaXRlc2hlZXQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95IChkZXN0cm95QmFzZSlcbntcbiAgICAgICAgaWYgKCBkZXN0cm95QmFzZSA9PT0gdm9pZCAwICkgZGVzdHJveUJhc2UgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgaW4gdGhpcy50ZXh0dXJlcylcbiAgICB7XG4gICAgICAgIHRoaXMudGV4dHVyZXNbaV0uZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLl9mcmFtZXMgPSBudWxsO1xuICAgIHRoaXMuX2ZyYW1lS2V5cyA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnRleHR1cmVzID0gbnVsbDtcbiAgICBpZiAoZGVzdHJveUJhc2UpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fdGV4dHVyZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fdGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXNlVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuX3RleHR1cmUgPSBudWxsO1xuICAgIHRoaXMuYmFzZVRleHR1cmUgPSBudWxsO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNwcml0ZXNoZWV0LCBzdGF0aWNBY2Nlc3NvcnMgKTtcblxuLyoqXG4gKiB7QGxpbmsgUElYSS5Mb2FkZXIgTG9hZGVyfSBtaWRkbGV3YXJlIGZvciBsb2FkaW5nIHRleHR1cmUgYXRsYXNlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhcbiAqIFRleHR1cmVQYWNrZXIgb3Igc2ltaWxhciBKU09OLWJhc2VkIHNwcml0ZXNoZWV0LlxuICpcbiAqIFRoaXMgbWlkZGxld2FyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBUZXh0dXJlIHJlc291cmNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAaW1wbGVtZW50cyBQSVhJLklMb2FkZXJQbHVnaW5cbiAqL1xudmFyIFNwcml0ZXNoZWV0TG9hZGVyID0gZnVuY3Rpb24gU3ByaXRlc2hlZXRMb2FkZXIgKCkge307XG5cblNwcml0ZXNoZWV0TG9hZGVyLnVzZSA9IGZ1bmN0aW9uIHVzZSAocmVzb3VyY2UsIG5leHQpXG57XG4gICAgdmFyIGltYWdlUmVzb3VyY2VOYW1lID0gKHJlc291cmNlLm5hbWUpICsgXCJfaW1hZ2VcIjtcblxuICAgIC8vIHNraXAgaWYgbm8gZGF0YSwgaXRzIG5vdCBqc29uLCBpdCBpc24ndCBzcHJpdGVzaGVldCBkYXRhLCBvciB0aGUgaW1hZ2UgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAoIXJlc291cmNlLmRhdGFcbiAgICAgICAgfHwgcmVzb3VyY2UudHlwZSAhPT0gTG9hZGVyUmVzb3VyY2UuVFlQRS5KU09OXG4gICAgICAgIHx8ICFyZXNvdXJjZS5kYXRhLmZyYW1lc1xuICAgICAgICB8fCB0aGlzLnJlc291cmNlc1tpbWFnZVJlc291cmNlTmFtZV1cbiAgICApXG4gICAge1xuICAgICAgICBuZXh0KCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsb2FkT3B0aW9ucyA9IHtcbiAgICAgICAgY3Jvc3NPcmlnaW46IHJlc291cmNlLmNyb3NzT3JpZ2luLFxuICAgICAgICBtZXRhZGF0YTogcmVzb3VyY2UubWV0YWRhdGEuaW1hZ2VNZXRhZGF0YSxcbiAgICAgICAgcGFyZW50UmVzb3VyY2U6IHJlc291cmNlLFxuICAgIH07XG5cbiAgICB2YXIgcmVzb3VyY2VQYXRoID0gU3ByaXRlc2hlZXRMb2FkZXIuZ2V0UmVzb3VyY2VQYXRoKHJlc291cmNlLCB0aGlzLmJhc2VVcmwpO1xuXG4gICAgLy8gbG9hZCB0aGUgaW1hZ2UgZm9yIHRoaXMgc2hlZXRcbiAgICB0aGlzLmFkZChpbWFnZVJlc291cmNlTmFtZSwgcmVzb3VyY2VQYXRoLCBsb2FkT3B0aW9ucywgZnVuY3Rpb24gb25JbWFnZUxvYWQocmVzKVxuICAgIHtcbiAgICAgICAgaWYgKHJlcy5lcnJvcilcbiAgICAgICAge1xuICAgICAgICAgICAgbmV4dChyZXMuZXJyb3IpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3ByaXRlc2hlZXQgPSBuZXcgU3ByaXRlc2hlZXQoXG4gICAgICAgICAgICByZXMudGV4dHVyZSxcbiAgICAgICAgICAgIHJlc291cmNlLmRhdGEsXG4gICAgICAgICAgICByZXNvdXJjZS51cmxcbiAgICAgICAgKTtcblxuICAgICAgICBzcHJpdGVzaGVldC5wYXJzZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXNvdXJjZS5zcHJpdGVzaGVldCA9IHNwcml0ZXNoZWV0O1xuICAgICAgICAgICAgcmVzb3VyY2UudGV4dHVyZXMgPSBzcHJpdGVzaGVldC50ZXh0dXJlcztcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgc3ByaXRlc2hlZXRzIHJvb3QgcGF0aFxuICogQHBhcmFtIHtQSVhJLkxvYWRlclJlc291cmNlfSByZXNvdXJjZSAtIFJlc291cmNlIHRvIGNoZWNrIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVXJsIC0gQmFzZSByb290IHVybFxuICovXG5TcHJpdGVzaGVldExvYWRlci5nZXRSZXNvdXJjZVBhdGggPSBmdW5jdGlvbiBnZXRSZXNvdXJjZVBhdGggKHJlc291cmNlLCBiYXNlVXJsKVxue1xuICAgIC8vIFByZXBlbmQgdXJsIHBhdGggdW5sZXNzIHRoZSByZXNvdXJjZSBpbWFnZSBpcyBhIGRhdGEgdXJsXG4gICAgaWYgKHJlc291cmNlLmlzRGF0YVVybClcbiAgICB7XG4gICAgICAgIHJldHVybiByZXNvdXJjZS5kYXRhLm1ldGEuaW1hZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybC5yZXNvbHZlKHJlc291cmNlLnVybC5yZXBsYWNlKGJhc2VVcmwsICcnKSwgcmVzb3VyY2UuZGF0YS5tZXRhLmltYWdlKTtcbn07XG5cbmV4cG9ydCB7IFNwcml0ZXNoZWV0LCBTcHJpdGVzaGVldExvYWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ByaXRlc2hlZXQuZXMuanMubWFwXG4iLCIvKiFcbiAqIEBwaXhpL3Nwcml0ZS10aWxpbmcgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogQHBpeGkvc3ByaXRlLXRpbGluZyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFRleHR1cmUsIFRleHR1cmVNYXRyaXgsIE9iamVjdFJlbmRlcmVyLCBTaGFkZXIsIFF1YWRVdiwgU3RhdGUgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IFBvaW50LCBSZWN0YW5nbGUsIFRyYW5zZm9ybSwgTWF0cml4IH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyBUZXh0dXJlQ2FjaGUsIHByZW11bHRpcGx5VGludFRvUmdiYSwgY29ycmVjdEJsZW5kTW9kZSB9IGZyb20gJ0BwaXhpL3V0aWxzJztcbmltcG9ydCB7IFNwcml0ZSB9IGZyb20gJ0BwaXhpL3Nwcml0ZSc7XG5pbXBvcnQgeyBXUkFQX01PREVTIH0gZnJvbSAnQHBpeGkvY29uc3RhbnRzJztcblxudmFyIHRlbXBQb2ludCA9IG5ldyBQb2ludCgpO1xuXG4vKipcbiAqIEEgdGlsaW5nIHNwcml0ZSBpcyBhIGZhc3Qgd2F5IG9mIHJlbmRlcmluZyBhIHRpbGluZyBpbWFnZVxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5TcHJpdGVcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBUaWxpbmdTcHJpdGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChTcHJpdGUpIHtcbiAgICBmdW5jdGlvbiBUaWxpbmdTcHJpdGUodGV4dHVyZSwgd2lkdGgsIGhlaWdodClcbiAgICB7XG4gICAgICAgIGlmICggd2lkdGggPT09IHZvaWQgMCApIHdpZHRoID0gMTAwO1xuICAgICAgICBpZiAoIGhlaWdodCA9PT0gdm9pZCAwICkgaGVpZ2h0ID0gMTAwO1xuXG4gICAgICAgIFNwcml0ZS5jYWxsKHRoaXMsIHRleHR1cmUpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaWxlIHRyYW5zZm9ybVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlRyYW5zZm9ybX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGlsZVRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oKTtcblxuICAgICAgICAvLyAvLy8gcHJpdmF0ZVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgd2l0aCBvZiB0aGUgdGlsaW5nIHNwcml0ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0aWxpbmcgc3ByaXRlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FudmFzIHBhdHRlcm5cbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge0NhbnZhc1BhdHRlcm59XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jYW52YXNQYXR0ZXJuID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogbWF0cml4IHRoYXQgaXMgYXBwbGllZCB0byBVViB0byBnZXQgdGhlIGNvb3JkcyBpbiBUZXh0dXJlIG5vcm1hbGl6ZWQgc3BhY2UgdG8gY29vcmRzIGluIEJhc2VUZXh0dXJlIHNwYWNlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuVGV4dHVyZU1hdHJpeH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXZNYXRyaXggPSB0ZXh0dXJlLnV2TWF0cml4IHx8IG5ldyBUZXh0dXJlTWF0cml4KHRleHR1cmUpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbHVnaW4gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcmVuZGVyaW5nIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICogQWxsb3dzIHRvIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIHByb2Nlc3Mgd2l0aG91dCBvdmVycmlkaW5nICdfcmVuZGVyJyBtZXRob2QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge3N0cmluZ31cbiAgICAgICAgICogQGRlZmF1bHQgJ3RpbGluZ1Nwcml0ZSdcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGx1Z2luTmFtZSA9ICd0aWxpbmdTcHJpdGUnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBhbmNob3IgYWZmZWN0cyB1dnNcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXZSZXNwZWN0QW5jaG9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCBTcHJpdGUgKSBUaWxpbmdTcHJpdGUuX19wcm90b19fID0gU3ByaXRlO1xuICAgIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTcHJpdGUgJiYgU3ByaXRlLnByb3RvdHlwZSApO1xuICAgIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUaWxpbmdTcHJpdGU7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBjbGFtcE1hcmdpbjogeyBjb25maWd1cmFibGU6IHRydWUgfSx0aWxlU2NhbGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdGlsZVBvc2l0aW9uOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgZnJhbWUgY2xhbXBpbmcgaW4gY29ycmVzcG9uZGluZyB0ZXh0dXJlVHJhbnNmb3JtLCBzaG9ydGN1dFxuICAgICAqIENoYW5nZSB0byAtMC41IHRvIGFkZCBhIHBpeGVsIHRvIHRoZSBlZGdlLCByZWNvbW1lbmRlZCBmb3IgdHJhbnNwYXJlbnQgdHJpbW1lZCB0ZXh0dXJlcyBpbiBhdGxhc1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgMC41XG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5jbGFtcE1hcmdpbi5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXZNYXRyaXguY2xhbXBNYXJnaW47XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5jbGFtcE1hcmdpbi5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy51dk1hdHJpeC5jbGFtcE1hcmdpbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLnV2TWF0cml4LnVwZGF0ZSh0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjYWxpbmcgb2YgdGhlIGltYWdlIHRoYXQgaXMgYmVpbmcgdGlsZWRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aWxlU2NhbGUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVUcmFuc2Zvcm0uc2NhbGU7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aWxlU2NhbGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMudGlsZVRyYW5zZm9ybS5zY2FsZS5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGltYWdlIHRoYXQgaXMgYmVpbmcgdGlsZWRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aWxlUG9zaXRpb24uZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVUcmFuc2Zvcm0ucG9zaXRpb247XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aWxlUG9zaXRpb24uc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMudGlsZVRyYW5zZm9ybS5wb3NpdGlvbi5jb3B5RnJvbSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgVGlsaW5nU3ByaXRlLnByb3RvdHlwZS5fb25UZXh0dXJlVXBkYXRlID0gZnVuY3Rpb24gX29uVGV4dHVyZVVwZGF0ZSAoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMudXZNYXRyaXgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudXZNYXRyaXgudGV4dHVyZSA9IHRoaXMuX3RleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGVkVGludCA9IDB4RkZGRkZGO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdXNpbmcgdGhlIFdlYkdMIHJlbmRlcmVyXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlclxuICAgICAqL1xuICAgIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uIF9yZW5kZXIgKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgLy8gdHdlYWsgb3VyIHRleHR1cmUgdGVtcG9yYXJpbHkuLlxuICAgICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuX3RleHR1cmU7XG5cbiAgICAgICAgaWYgKCF0ZXh0dXJlIHx8ICF0ZXh0dXJlLnZhbGlkKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVUcmFuc2Zvcm0udXBkYXRlTG9jYWxUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy51dk1hdHJpeC51cGRhdGUoKTtcblxuICAgICAgICByZW5kZXJlci5iYXRjaC5zZXRPYmplY3RSZW5kZXJlcihyZW5kZXJlci5wbHVnaW5zW3RoaXMucGx1Z2luTmFtZV0pO1xuICAgICAgICByZW5kZXJlci5wbHVnaW5zW3RoaXMucGx1Z2luTmFtZV0ucmVuZGVyKHRoaXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBib3VuZHMgb2YgdGhlIHRpbGluZyBzcHJpdGUuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgVGlsaW5nU3ByaXRlLnByb3RvdHlwZS5fY2FsY3VsYXRlQm91bmRzID0gZnVuY3Rpb24gX2NhbGN1bGF0ZUJvdW5kcyAoKVxuICAgIHtcbiAgICAgICAgdmFyIG1pblggPSB0aGlzLl93aWR0aCAqIC10aGlzLl9hbmNob3IuX3g7XG4gICAgICAgIHZhciBtaW5ZID0gdGhpcy5faGVpZ2h0ICogLXRoaXMuX2FuY2hvci5feTtcbiAgICAgICAgdmFyIG1heFggPSB0aGlzLl93aWR0aCAqICgxIC0gdGhpcy5fYW5jaG9yLl94KTtcbiAgICAgICAgdmFyIG1heFkgPSB0aGlzLl9oZWlnaHQgKiAoMSAtIHRoaXMuX2FuY2hvci5feSk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRzLmFkZEZyYW1lKHRoaXMudHJhbnNmb3JtLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG9jYWwgYm91bmRzIG9mIHRoZSBzcHJpdGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlJlY3RhbmdsZX0gcmVjdCAtIFRoZSBvdXRwdXQgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm4ge1BJWEkuUmVjdGFuZ2xlfSBUaGUgYm91bmRzLlxuICAgICAqL1xuICAgIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHMgPSBmdW5jdGlvbiBnZXRMb2NhbEJvdW5kcyAocmVjdClcbiAgICB7XG4gICAgICAgIC8vIHdlIGNhbiBkbyBhIGZhc3QgbG9jYWwgYm91bmRzIGlmIHRoZSBzcHJpdGUgaGFzIG5vIGNoaWxkcmVuIVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5taW5YID0gdGhpcy5fd2lkdGggKiAtdGhpcy5fYW5jaG9yLl94O1xuICAgICAgICAgICAgdGhpcy5fYm91bmRzLm1pblkgPSB0aGlzLl9oZWlnaHQgKiAtdGhpcy5fYW5jaG9yLl95O1xuICAgICAgICAgICAgdGhpcy5fYm91bmRzLm1heFggPSB0aGlzLl93aWR0aCAqICgxIC0gdGhpcy5fYW5jaG9yLl94KTtcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kcy5tYXhZID0gdGhpcy5faGVpZ2h0ICogKDEgLSB0aGlzLl9hbmNob3IuX3kpO1xuXG4gICAgICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9sb2NhbEJvdW5kc1JlY3QpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbEJvdW5kc1JlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVjdCA9IHRoaXMuX2xvY2FsQm91bmRzUmVjdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvdW5kcy5nZXRSZWN0YW5nbGUocmVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU3ByaXRlLnByb3RvdHlwZS5nZXRMb2NhbEJvdW5kcy5jYWxsKHRoaXMsIHJlY3QpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBwb2ludCBpcyBpbnNpZGUgdGhpcyB0aWxpbmcgc3ByaXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLlBvaW50fSBwb2ludCAtIHRoZSBwb2ludCB0byBjaGVja1xuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBzcHJpdGUgY29udGFpbnMgdGhlIHBvaW50LlxuICAgICAqL1xuICAgIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUuY29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQgKHBvaW50KVxuICAgIHtcbiAgICAgICAgdGhpcy53b3JsZFRyYW5zZm9ybS5hcHBseUludmVyc2UocG9pbnQsIHRlbXBQb2ludCk7XG5cbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5fd2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLl9oZWlnaHQ7XG4gICAgICAgIHZhciB4MSA9IC13aWR0aCAqIHRoaXMuYW5jaG9yLl94O1xuXG4gICAgICAgIGlmICh0ZW1wUG9pbnQueCA+PSB4MSAmJiB0ZW1wUG9pbnQueCA8IHgxICsgd2lkdGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB5MSA9IC1oZWlnaHQgKiB0aGlzLmFuY2hvci5feTtcblxuICAgICAgICAgICAgaWYgKHRlbXBQb2ludC55ID49IHkxICYmIHRlbXBQb2ludC55IDwgeTEgKyBoZWlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgc3ByaXRlIGFuZCBvcHRpb25hbGx5IGl0cyB0ZXh0dXJlIGFuZCBjaGlsZHJlblxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R8Ym9vbGVhbn0gW29wdGlvbnNdIC0gT3B0aW9ucyBwYXJhbWV0ZXIuIEEgYm9vbGVhbiB3aWxsIGFjdCBhcyBpZiBhbGwgb3B0aW9uc1xuICAgICAqICBoYXZlIGJlZW4gc2V0IHRvIHRoYXQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoaWxkcmVuPWZhbHNlXSAtIGlmIHNldCB0byB0cnVlLCBhbGwgdGhlIGNoaWxkcmVuIHdpbGwgaGF2ZSB0aGVpciBkZXN0cm95XG4gICAgICogICAgICBtZXRob2QgY2FsbGVkIGFzIHdlbGwuICdvcHRpb25zJyB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aG9zZSBjYWxscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHR1cmU9ZmFsc2VdIC0gU2hvdWxkIGl0IGRlc3Ryb3kgdGhlIGN1cnJlbnQgdGV4dHVyZSBvZiB0aGUgc3ByaXRlIGFzIHdlbGxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmJhc2VUZXh0dXJlPWZhbHNlXSAtIFNob3VsZCBpdCBkZXN0cm95IHRoZSBiYXNlIHRleHR1cmUgb2YgdGhlIHNwcml0ZSBhcyB3ZWxsXG4gICAgICovXG4gICAgVGlsaW5nU3ByaXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSAob3B0aW9ucylcbiAgICB7XG4gICAgICAgIFNwcml0ZS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMudGlsZVRyYW5zZm9ybSA9IG51bGw7XG4gICAgICAgIHRoaXMudXZNYXRyaXggPSBudWxsO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IHRpbGluZyBzcHJpdGUgYmFzZWQgb24gdGhlIHNvdXJjZSB5b3UgcHJvdmlkZS5cbiAgICAgKiBUaGUgc291cmNlIGNhbiBiZSAtIGZyYW1lIGlkLCBpbWFnZSB1cmwsIHZpZGVvIHVybCwgY2FudmFzIGVsZW1lbnQsIHZpZGVvIGVsZW1lbnQsIGJhc2UgdGV4dHVyZVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfFBJWEkuVGV4dHVyZXxIVE1MQ2FudmFzRWxlbWVudHxIVE1MVmlkZW9FbGVtZW50fSBzb3VyY2UgLSBTb3VyY2UgdG8gY3JlYXRlIHRleHR1cmUgZnJvbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIHRoZSB3aWR0aCBvZiB0aGUgdGlsaW5nIHNwcml0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSB0aGUgaGVpZ2h0IG9mIHRoZSB0aWxpbmcgc3ByaXRlXG4gICAgICogQHJldHVybiB7UElYSS5UaWxpbmdTcHJpdGV9IFRoZSBuZXdseSBjcmVhdGVkIHRleHR1cmVcbiAgICAgKi9cbiAgICBUaWxpbmdTcHJpdGUuZnJvbSA9IGZ1bmN0aW9uIGZyb20gKHNvdXJjZSwgd2lkdGgsIGhlaWdodClcbiAgICB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsaW5nU3ByaXRlKFRleHR1cmUuZnJvbShzb3VyY2UpLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIHRpbGluZyBzcHJpdGUgdGhhdCB3aWxsIHVzZSBhIHRleHR1cmUgZnJvbSB0aGUgVGV4dHVyZUNhY2hlIGJhc2VkIG9uIHRoZSBmcmFtZUlkXG4gICAgICogVGhlIGZyYW1lIGlkcyBhcmUgY3JlYXRlZCB3aGVuIGEgVGV4dHVyZSBwYWNrZXIgZmlsZSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJhbWVJZCAtIFRoZSBmcmFtZSBJZCBvZiB0aGUgdGV4dHVyZSBpbiB0aGUgY2FjaGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIHRpbGluZyBzcHJpdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gdGhlIGhlaWdodCBvZiB0aGUgdGlsaW5nIHNwcml0ZVxuICAgICAqIEByZXR1cm4ge1BJWEkuVGlsaW5nU3ByaXRlfSBBIG5ldyBUaWxpbmdTcHJpdGUgdXNpbmcgYSB0ZXh0dXJlIGZyb20gdGhlIHRleHR1cmUgY2FjaGUgbWF0Y2hpbmcgdGhlIGZyYW1lSWRcbiAgICAgKi9cbiAgICBUaWxpbmdTcHJpdGUuZnJvbUZyYW1lID0gZnVuY3Rpb24gZnJvbUZyYW1lIChmcmFtZUlkLCB3aWR0aCwgaGVpZ2h0KVxuICAgIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlQ2FjaGVbZnJhbWVJZF07XG5cbiAgICAgICAgaWYgKCF0ZXh0dXJlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKFwiVGhlIGZyYW1lSWQgXFxcIlwiICsgZnJhbWVJZCArIFwiXFxcIiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgdGV4dHVyZSBjYWNoZSBcIiArICh0aGlzKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUaWxpbmdTcHJpdGUodGV4dHVyZSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBzcHJpdGUgdGhhdCB3aWxsIGNvbnRhaW4gYSB0ZXh0dXJlIGJhc2VkIG9uIGFuIGltYWdlIHVybFxuICAgICAqIElmIHRoZSBpbWFnZSBpcyBub3QgaW4gdGhlIHRleHR1cmUgY2FjaGUgaXQgd2lsbCBiZSBsb2FkZWRcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VJZCAtIFRoZSBpbWFnZSB1cmwgb2YgdGhlIHRleHR1cmVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIHRpbGluZyBzcHJpdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gdGhlIGhlaWdodCBvZiB0aGUgdGlsaW5nIHNwcml0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBTZWUge0BsaW5rIFBJWEkuQmFzZVRleHR1cmV9J3MgY29uc3RydWN0b3IgZm9yIG9wdGlvbnMuXG4gICAgICogQHJldHVybiB7UElYSS5UaWxpbmdTcHJpdGV9IEEgbmV3IFRpbGluZ1Nwcml0ZSB1c2luZyBhIHRleHR1cmUgZnJvbSB0aGUgdGV4dHVyZSBjYWNoZSBtYXRjaGluZyB0aGUgaW1hZ2UgaWRcbiAgICAgKi9cbiAgICBUaWxpbmdTcHJpdGUuZnJvbUltYWdlID0gZnVuY3Rpb24gZnJvbUltYWdlIChpbWFnZUlkLCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgc3VwcG9ydCBmb3IgY3Jvc3NvcmlnaW4sIHNjYWxlTW9kZSBwYXJhbWV0ZXJzXG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JylcbiAgICAgICAge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBzY2FsZU1vZGU6IGFyZ3VtZW50c1s0XSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgY3Jvc3NvcmlnaW46IGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVGlsaW5nU3ByaXRlKFRleHR1cmUuZnJvbShpbWFnZUlkLCBvcHRpb25zKSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgc3ByaXRlLCBzZXR0aW5nIHRoaXMgd2lsbCBhY3R1YWxseSBtb2RpZnkgdGhlIHNjYWxlIHRvIGFjaGlldmUgdGhlIHZhbHVlIHNldFxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy53aWR0aC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMud2lkdGguc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICB7XG4gICAgICAgIHRoaXMuX3dpZHRoID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIFRpbGluZ1Nwcml0ZSwgc2V0dGluZyB0aGlzIHdpbGwgYWN0dWFsbHkgbW9kaWZ5IHRoZSBzY2FsZSB0byBhY2hpZXZlIHRoZSB2YWx1ZSBzZXRcbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuaGVpZ2h0LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFRpbGluZ1Nwcml0ZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIFRpbGluZ1Nwcml0ZTtcbn0oU3ByaXRlKSk7XG5cbnZhciB2ZXJ0ZXggPSBcImF0dHJpYnV0ZSB2ZWMyIGFWZXJ0ZXhQb3NpdGlvbjtcXG5hdHRyaWJ1dGUgdmVjMiBhVGV4dHVyZUNvb3JkO1xcblxcbnVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0MyB0cmFuc2xhdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDMgdVRyYW5zZm9ybTtcXG5cXG52YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcXG5cXG52b2lkIG1haW4odm9pZClcXG57XFxuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHRyYW5zbGF0aW9uTWF0cml4ICogdmVjMyhhVmVydGV4UG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxuXFxuICAgIHZUZXh0dXJlQ29vcmQgPSAodVRyYW5zZm9ybSAqIHZlYzMoYVRleHR1cmVDb29yZCwgMS4wKSkueHk7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xcbnVuaWZvcm0gdmVjNCB1Q29sb3I7XFxudW5pZm9ybSBtYXQzIHVNYXBDb29yZDtcXG51bmlmb3JtIHZlYzQgdUNsYW1wRnJhbWU7XFxudW5pZm9ybSB2ZWMyIHVDbGFtcE9mZnNldDtcXG5cXG52b2lkIG1haW4odm9pZClcXG57XFxuICAgIHZlYzIgY29vcmQgPSB2VGV4dHVyZUNvb3JkIC0gZmxvb3IodlRleHR1cmVDb29yZCAtIHVDbGFtcE9mZnNldCk7XFxuICAgIGNvb3JkID0gKHVNYXBDb29yZCAqIHZlYzMoY29vcmQsIDEuMCkpLnh5O1xcbiAgICBjb29yZCA9IGNsYW1wKGNvb3JkLCB1Q2xhbXBGcmFtZS54eSwgdUNsYW1wRnJhbWUuencpO1xcblxcbiAgICB2ZWM0IHRleFNhbXBsZSA9IHRleHR1cmUyRCh1U2FtcGxlciwgY29vcmQpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSB0ZXhTYW1wbGUgKiB1Q29sb3I7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnRTaW1wbGUgPSBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVTYW1wbGVyO1xcbnVuaWZvcm0gdmVjNCB1Q29sb3I7XFxuXFxudm9pZCBtYWluKHZvaWQpXFxue1xcbiAgICB2ZWM0IHNhbXBsZSA9IHRleHR1cmUyRCh1U2FtcGxlciwgdlRleHR1cmVDb29yZCk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHNhbXBsZSAqIHVDb2xvcjtcXG59XFxuXCI7XG5cbnZhciB0ZW1wTWF0ID0gbmV3IE1hdHJpeCgpO1xuXG4vKipcbiAqIFdlYkdMIHJlbmRlcmVyIHBsdWdpbiBmb3IgdGlsaW5nIHNwcml0ZXNcbiAqXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXh0ZW5kcyBQSVhJLk9iamVjdFJlbmRlcmVyXG4gKi9cbnZhciBUaWxpbmdTcHJpdGVSZW5kZXJlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKE9iamVjdFJlbmRlcmVyKSB7XG4gICAgZnVuY3Rpb24gVGlsaW5nU3ByaXRlUmVuZGVyZXIocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBPYmplY3RSZW5kZXJlci5jYWxsKHRoaXMsIHJlbmRlcmVyKTtcblxuICAgICAgICB2YXIgdW5pZm9ybXMgPSB7IGdsb2JhbHM6IHRoaXMucmVuZGVyZXIuZ2xvYmFsVW5pZm9ybXMgfTtcblxuICAgICAgICB0aGlzLnNoYWRlciA9IFNoYWRlci5mcm9tKHZlcnRleCwgZnJhZ21lbnQsIHVuaWZvcm1zKTtcblxuICAgICAgICB0aGlzLnNpbXBsZVNoYWRlciA9IFNoYWRlci5mcm9tKHZlcnRleCwgZnJhZ21lbnRTaW1wbGUsIHVuaWZvcm1zKTtcblxuICAgICAgICB0aGlzLnF1YWQgPSBuZXcgUXVhZFV2KCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBXZWJHTCBzdGF0ZSBpbiB3aGljaCB0aGlzIHJlbmRlcmVyIHdpbGwgd29yay5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5TdGF0ZX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuZm9yMmQoKTtcbiAgICB9XG5cbiAgICBpZiAoIE9iamVjdFJlbmRlcmVyICkgVGlsaW5nU3ByaXRlUmVuZGVyZXIuX19wcm90b19fID0gT2JqZWN0UmVuZGVyZXI7XG4gICAgVGlsaW5nU3ByaXRlUmVuZGVyZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0UmVuZGVyZXIgJiYgT2JqZWN0UmVuZGVyZXIucHJvdG90eXBlICk7XG4gICAgVGlsaW5nU3ByaXRlUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGlsaW5nU3ByaXRlUmVuZGVyZXI7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5UaWxpbmdTcHJpdGV9IHRzIHRpbGluZ1Nwcml0ZSB0byBiZSByZW5kZXJlZFxuICAgICAqL1xuICAgIFRpbGluZ1Nwcml0ZVJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIgKHRzKVxuICAgIHtcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgICAgdmFyIHF1YWQgPSB0aGlzLnF1YWQ7XG5cbiAgICAgICAgdmFyIHZlcnRpY2VzID0gcXVhZC52ZXJ0aWNlcztcblxuICAgICAgICB2ZXJ0aWNlc1swXSA9IHZlcnRpY2VzWzZdID0gKHRzLl93aWR0aCkgKiAtdHMuYW5jaG9yLng7XG4gICAgICAgIHZlcnRpY2VzWzFdID0gdmVydGljZXNbM10gPSB0cy5faGVpZ2h0ICogLXRzLmFuY2hvci55O1xuXG4gICAgICAgIHZlcnRpY2VzWzJdID0gdmVydGljZXNbNF0gPSAodHMuX3dpZHRoKSAqICgxLjAgLSB0cy5hbmNob3IueCk7XG4gICAgICAgIHZlcnRpY2VzWzVdID0gdmVydGljZXNbN10gPSB0cy5faGVpZ2h0ICogKDEuMCAtIHRzLmFuY2hvci55KTtcblxuICAgICAgICBpZiAodHMudXZSZXNwZWN0QW5jaG9yKVxuICAgICAgICB7XG4gICAgICAgICAgICB2ZXJ0aWNlcyA9IHF1YWQudXZzO1xuXG4gICAgICAgICAgICB2ZXJ0aWNlc1swXSA9IHZlcnRpY2VzWzZdID0gLXRzLmFuY2hvci54O1xuICAgICAgICAgICAgdmVydGljZXNbMV0gPSB2ZXJ0aWNlc1szXSA9IC10cy5hbmNob3IueTtcblxuICAgICAgICAgICAgdmVydGljZXNbMl0gPSB2ZXJ0aWNlc1s0XSA9IDEuMCAtIHRzLmFuY2hvci54O1xuICAgICAgICAgICAgdmVydGljZXNbNV0gPSB2ZXJ0aWNlc1s3XSA9IDEuMCAtIHRzLmFuY2hvci55O1xuICAgICAgICB9XG5cbiAgICAgICAgcXVhZC5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgdmFyIHRleCA9IHRzLl90ZXh0dXJlO1xuICAgICAgICB2YXIgYmFzZVRleCA9IHRleC5iYXNlVGV4dHVyZTtcbiAgICAgICAgdmFyIGx0ID0gdHMudGlsZVRyYW5zZm9ybS5sb2NhbFRyYW5zZm9ybTtcbiAgICAgICAgdmFyIHV2ID0gdHMudXZNYXRyaXg7XG4gICAgICAgIHZhciBpc1NpbXBsZSA9IGJhc2VUZXguaXNQb3dlck9mVHdvXG4gICAgICAgICAgICAmJiB0ZXguZnJhbWUud2lkdGggPT09IGJhc2VUZXgud2lkdGggJiYgdGV4LmZyYW1lLmhlaWdodCA9PT0gYmFzZVRleC5oZWlnaHQ7XG5cbiAgICAgICAgLy8gYXV0bywgZm9yY2UgcmVwZWF0IHdyYXBNb2RlIGZvciBiaWcgdGlsaW5nIHRleHR1cmVzXG4gICAgICAgIGlmIChpc1NpbXBsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFiYXNlVGV4Ll9nbFRleHR1cmVzW3JlbmRlcmVyLkNPTlRFWFRfVUlEXSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVRleC53cmFwTW9kZSA9PT0gV1JBUF9NT0RFUy5DTEFNUClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VUZXgud3JhcE1vZGUgPSBXUkFQX01PREVTLlJFUEVBVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaXNTaW1wbGUgPSBiYXNlVGV4LndyYXBNb2RlICE9PSBXUkFQX01PREVTLkNMQU1QO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNoYWRlciA9IGlzU2ltcGxlID8gdGhpcy5zaW1wbGVTaGFkZXIgOiB0aGlzLnNoYWRlcjtcblxuICAgICAgICB2YXIgdyA9IHRleC53aWR0aDtcbiAgICAgICAgdmFyIGggPSB0ZXguaGVpZ2h0O1xuICAgICAgICB2YXIgVyA9IHRzLl93aWR0aDtcbiAgICAgICAgdmFyIEggPSB0cy5faGVpZ2h0O1xuXG4gICAgICAgIHRlbXBNYXQuc2V0KGx0LmEgKiB3IC8gVyxcbiAgICAgICAgICAgIGx0LmIgKiB3IC8gSCxcbiAgICAgICAgICAgIGx0LmMgKiBoIC8gVyxcbiAgICAgICAgICAgIGx0LmQgKiBoIC8gSCxcbiAgICAgICAgICAgIGx0LnR4IC8gVyxcbiAgICAgICAgICAgIGx0LnR5IC8gSCk7XG5cbiAgICAgICAgLy8gdGhhdCBwYXJ0IGlzIHRoZSBzYW1lIGFzIGFib3ZlOlxuICAgICAgICAvLyB0ZW1wTWF0LmlkZW50aXR5KCk7XG4gICAgICAgIC8vIHRlbXBNYXQuc2NhbGUodGV4LndpZHRoLCB0ZXguaGVpZ2h0KTtcbiAgICAgICAgLy8gdGVtcE1hdC5wcmVwZW5kKGx0KTtcbiAgICAgICAgLy8gdGVtcE1hdC5zY2FsZSgxLjAgLyB0cy5fd2lkdGgsIDEuMCAvIHRzLl9oZWlnaHQpO1xuXG4gICAgICAgIHRlbXBNYXQuaW52ZXJ0KCk7XG4gICAgICAgIGlmIChpc1NpbXBsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGVtcE1hdC5wcmVwZW5kKHV2Lm1hcENvb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNoYWRlci51bmlmb3Jtcy51TWFwQ29vcmQgPSB1di5tYXBDb29yZC50b0FycmF5KHRydWUpO1xuICAgICAgICAgICAgc2hhZGVyLnVuaWZvcm1zLnVDbGFtcEZyYW1lID0gdXYudUNsYW1wRnJhbWU7XG4gICAgICAgICAgICBzaGFkZXIudW5pZm9ybXMudUNsYW1wT2Zmc2V0ID0gdXYudUNsYW1wT2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgc2hhZGVyLnVuaWZvcm1zLnVUcmFuc2Zvcm0gPSB0ZW1wTWF0LnRvQXJyYXkodHJ1ZSk7XG4gICAgICAgIHNoYWRlci51bmlmb3Jtcy51Q29sb3IgPSBwcmVtdWx0aXBseVRpbnRUb1JnYmEodHMudGludCwgdHMud29ybGRBbHBoYSxcbiAgICAgICAgICAgIHNoYWRlci51bmlmb3Jtcy51Q29sb3IsIGJhc2VUZXguYWxwaGFNb2RlKTtcbiAgICAgICAgc2hhZGVyLnVuaWZvcm1zLnRyYW5zbGF0aW9uTWF0cml4ID0gdHMudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtLnRvQXJyYXkodHJ1ZSk7XG4gICAgICAgIHNoYWRlci51bmlmb3Jtcy51U2FtcGxlciA9IHRleDtcblxuICAgICAgICByZW5kZXJlci5zaGFkZXIuYmluZChzaGFkZXIpO1xuICAgICAgICByZW5kZXJlci5nZW9tZXRyeS5iaW5kKHF1YWQpOy8vICwgcmVuZGVyZXIuc2hhZGVyLmdldEdMU2hhZGVyKCkpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUuYmxlbmRNb2RlID0gY29ycmVjdEJsZW5kTW9kZSh0cy5ibGVuZE1vZGUsIGJhc2VUZXguYWxwaGFNb2RlKTtcbiAgICAgICAgcmVuZGVyZXIuc3RhdGUuc2V0KHRoaXMuc3RhdGUpO1xuICAgICAgICByZW5kZXJlci5nZW9tZXRyeS5kcmF3KHRoaXMucmVuZGVyZXIuZ2wuVFJJQU5HTEVTLCA2LCAwKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFRpbGluZ1Nwcml0ZVJlbmRlcmVyO1xufShPYmplY3RSZW5kZXJlcikpO1xuXG5leHBvcnQgeyBUaWxpbmdTcHJpdGUsIFRpbGluZ1Nwcml0ZVJlbmRlcmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcHJpdGUtdGlsaW5nLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS90ZXh0LWJpdG1hcCAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS90ZXh0LWJpdG1hcCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuaW1wb3J0IHsgUG9pbnQsIFJlY3RhbmdsZSwgT2JzZXJ2YWJsZVBvaW50IH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gJ0BwaXhpL3NldHRpbmdzJztcbmltcG9ydCB7IFNwcml0ZSB9IGZyb20gJ0BwaXhpL3Nwcml0ZSc7XG5pbXBvcnQgeyByZW1vdmVJdGVtcywgZ2V0UmVzb2x1dGlvbk9mVXJsIH0gZnJvbSAnQHBpeGkvdXRpbHMnO1xuaW1wb3J0IHsgTG9hZGVyUmVzb3VyY2UgfSBmcm9tICdAcGl4aS9sb2FkZXJzJztcblxuLyoqXG4gKiBBIEJpdG1hcFRleHQgb2JqZWN0IHdpbGwgY3JlYXRlIGEgbGluZSBvciBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0IHVzaW5nIGJpdG1hcCBmb250LlxuICpcbiAqIFRoZSBwcmltYXJ5IGFkdmFudGFnZSBvZiB0aGlzIGNsYXNzIG92ZXIgVGV4dCBpcyB0aGF0IGFsbCBvZiB5b3VyIHRleHR1cmVzIGFyZSBwcmUtZ2VuZXJhdGVkIGFuZCBsb2FkaW5nLFxuICogbWVhbmluZyB0aGF0IHJlbmRlcmluZyBpcyBmYXN0LCBhbmQgY2hhbmdpbmcgdGV4dCBoYXMgbm8gcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLlxuICpcbiAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBpcyB0aGF0IHlvdSBuZWVkIHRvIHByZWxvYWQgdGhlIGJpdG1hcCBmb250IGFzc2V0cywgYW5kIHRodXMgdGhlIHN0eWxpbmcgaXMgc2V0IGluIHN0b25lLlxuICogU3VwcG9ydGluZyBjaGFyYWN0ZXIgc2V0cyBvdGhlciB0aGFuIGxhdGluLCBzdWNoIGFzIENKSyBsYW5ndWFnZXMsIG1heSBiZSBpbXByYWN0aWNhbCBkdWUgdG8gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLlxuICpcbiAqIFRvIHNwbGl0IGEgbGluZSB5b3UgY2FuIHVzZSAnXFxuJywgJ1xccicgb3IgJ1xcclxcbicgaW4geW91ciBzdHJpbmcuXG4gKlxuICogWW91IGNhbiBnZW5lcmF0ZSB0aGUgZm50IGZpbGVzIHVzaW5nXG4gKiBodHRwOi8vd3d3LmFuZ2VsY29kZS5jb20vcHJvZHVjdHMvYm1mb250LyBmb3IgV2luZG93cyBvclxuICogaHR0cDovL3d3dy5ibWdseXBoLmNvbS8gZm9yIE1hYy5cbiAqXG4gKiBBIEJpdG1hcFRleHQgY2FuIG9ubHkgYmUgY3JlYXRlZCB3aGVuIHRoZSBmb250IGlzIGxvYWRlZC5cbiAqXG4gKiBgYGBqc1xuICogLy8gaW4gdGhpcyBjYXNlIHRoZSBmb250IGlzIGluIGEgZmlsZSBjYWxsZWQgJ2Rlc3lyZWwuZm50J1xuICogbGV0IGJpdG1hcFRleHQgPSBuZXcgUElYSS5CaXRtYXBUZXh0KFwidGV4dCB1c2luZyBhIGZhbmN5IGZvbnQhXCIsIHtmb250OiBcIjM1cHggRGVzeXJlbFwiLCBhbGlnbjogXCJyaWdodFwifSk7XG4gKiBgYGBcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFBJWEkuQ29udGFpbmVyXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgQml0bWFwVGV4dCA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENvbnRhaW5lcikge1xuICAgIGZ1bmN0aW9uIEJpdG1hcFRleHQodGV4dCwgc3R5bGUpXG4gICAge1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICAgICAgaWYgKCBzdHlsZSA9PT0gdm9pZCAwICkgc3R5bGUgPSB7fTtcblxuICAgICAgICBDb250YWluZXIuY2FsbCh0aGlzKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUHJpdmF0ZSB0cmFja2VyIGZvciB0aGUgd2lkdGggb2YgdGhlIG92ZXJhbGwgdGV4dFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl90ZXh0V2lkdGggPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcml2YXRlIHRyYWNrZXIgZm9yIHRoZSBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgdGV4dFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl90ZXh0SGVpZ2h0ID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUHJpdmF0ZSB0cmFja2VyIGZvciB0aGUgbGV0dGVyIHNwcml0ZSBwb29sLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlNwcml0ZVtdfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZ2x5cGhzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByaXZhdGUgdHJhY2tlciBmb3IgdGhlIGN1cnJlbnQgc3R5bGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2ZvbnQgPSB7XG4gICAgICAgICAgICB0aW50OiBzdHlsZS50aW50ICE9PSB1bmRlZmluZWQgPyBzdHlsZS50aW50IDogMHhGRkZGRkYsXG4gICAgICAgICAgICBhbGlnbjogc3R5bGUuYWxpZ24gfHwgJ2xlZnQnLFxuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByaXZhdGUgdHJhY2tlciBmb3IgdGhlIGN1cnJlbnQgZm9udC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7b2JqZWN0fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb250ID0gc3R5bGUuZm9udDsgLy8gcnVuIGZvbnQgc2V0dGVyXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByaXZhdGUgdHJhY2tlciBmb3IgdGhlIGN1cnJlbnQgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBtYXggd2lkdGggb2YgdGhpcyBiaXRtYXAgdGV4dCBpbiBwaXhlbHMuIElmIHRoZSB0ZXh0IHByb3ZpZGVkIGlzIGxvbmdlciB0aGFuIHRoZVxuICAgICAgICAgKiB2YWx1ZSBwcm92aWRlZCwgbGluZSBicmVha3Mgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoZSBsYXN0IHdoaXRlc3BhY2UuXG4gICAgICAgICAqIERpc2FibGUgYnkgc2V0dGluZyB2YWx1ZSB0byAwXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX21heFdpZHRoID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG1heCBsaW5lIGhlaWdodC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0cnlpbmcgdG8gdXNlIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIFRleHQsXG4gICAgICAgICAqIGllOiB3aGVuIHRyeWluZyB0byB2ZXJ0aWNhbGx5IGFsaWduLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9tYXhMaW5lSGVpZ2h0ID0gMDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGV0dGVyIHNwYWNpbmcuIFRoaXMgaXMgdXNlZnVsIGZvciBzZXR0aW5nIHRoZSBzcGFjZSBiZXR3ZWVuIGNoYXJhY3RlcnMuXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2xldHRlclNwYWNpbmcgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUZXh0IGFuY2hvci4gcmVhZC1vbmx5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuT2JzZXJ2YWJsZVBvaW50fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fYW5jaG9yID0gbmV3IE9ic2VydmFibGVQb2ludChmdW5jdGlvbiAoKSB7IHRoaXMkMS5kaXJ0eSA9IHRydWU7IH0sIHRoaXMsIDAsIDApO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlydHkgc3RhdGUgb2YgdGhpcyBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRydWUgUGl4aUpTIHdpbGwgTWF0aC5mbG9vcigpIHgveSB2YWx1ZXMgd2hlbiByZW5kZXJpbmcsIHN0b3BwaW5nIHBpeGVsIGludGVycG9sYXRpb24uXG4gICAgICAgICAqIEFkdmFudGFnZXMgY2FuIGluY2x1ZGUgc2hhcnBlciBpbWFnZSBxdWFsaXR5IChsaWtlIHRleHQpIGFuZCBmYXN0ZXIgcmVuZGVyaW5nIG9uIGNhbnZhcy5cbiAgICAgICAgICogVGhlIG1haW4gZGlzYWR2YW50YWdlIGlzIG1vdmVtZW50IG9mIG9iamVjdHMgbWF5IGFwcGVhciBsZXNzIHNtb290aC5cbiAgICAgICAgICogVG8gc2V0IHRoZSBnbG9iYWwgZGVmYXVsdCwgY2hhbmdlIHtAbGluayBQSVhJLnNldHRpbmdzLlJPVU5EX1BJWEVMU31cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucm91bmRQaXhlbHMgPSBzZXR0aW5ncy5ST1VORF9QSVhFTFM7XG5cbiAgICAgICAgdGhpcy51cGRhdGVUZXh0KCk7XG4gICAgfVxuXG4gICAgaWYgKCBDb250YWluZXIgKSBCaXRtYXBUZXh0Ll9fcHJvdG9fXyA9IENvbnRhaW5lcjtcbiAgICBCaXRtYXBUZXh0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENvbnRhaW5lciAmJiBDb250YWluZXIucHJvdG90eXBlICk7XG4gICAgQml0bWFwVGV4dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaXRtYXBUZXh0O1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgdGludDogeyBjb25maWd1cmFibGU6IHRydWUgfSxhbGlnbjogeyBjb25maWd1cmFibGU6IHRydWUgfSxhbmNob3I6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZm9udDogeyBjb25maWd1cmFibGU6IHRydWUgfSx0ZXh0OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG1heFdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG1heExpbmVIZWlnaHQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdGV4dFdpZHRoOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGxldHRlclNwYWNpbmc6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdGV4dEhlaWdodDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0ZXh0IGFuZCB1cGRhdGVzIGl0IHdoZW4gbmVlZGVkXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEJpdG1hcFRleHQucHJvdG90eXBlLnVwZGF0ZVRleHQgPSBmdW5jdGlvbiB1cGRhdGVUZXh0ICgpXG4gICAge1xuICAgICAgICB2YXIgZGF0YSA9IEJpdG1hcFRleHQuZm9udHNbdGhpcy5fZm9udC5uYW1lXTtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5fZm9udC5zaXplIC8gZGF0YS5zaXplO1xuICAgICAgICB2YXIgcG9zID0gbmV3IFBvaW50KCk7XG4gICAgICAgIHZhciBjaGFycyA9IFtdO1xuICAgICAgICB2YXIgbGluZVdpZHRocyA9IFtdO1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMuX3RleHQucmVwbGFjZSgvKD86XFxyXFxufFxccikvZywgJ1xcbicpIHx8ICcgJztcbiAgICAgICAgdmFyIHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgdmFyIG1heFdpZHRoID0gdGhpcy5fbWF4V2lkdGggKiBkYXRhLnNpemUgLyB0aGlzLl9mb250LnNpemU7XG5cbiAgICAgICAgdmFyIHByZXZDaGFyQ29kZSA9IG51bGw7XG4gICAgICAgIHZhciBsYXN0TGluZVdpZHRoID0gMDtcbiAgICAgICAgdmFyIG1heExpbmVXaWR0aCA9IDA7XG4gICAgICAgIHZhciBsaW5lID0gMDtcbiAgICAgICAgdmFyIGxhc3RCcmVha1BvcyA9IC0xO1xuICAgICAgICB2YXIgbGFzdEJyZWFrV2lkdGggPSAwO1xuICAgICAgICB2YXIgc3BhY2VzUmVtb3ZlZCA9IDA7XG4gICAgICAgIHZhciBtYXhMaW5lSGVpZ2h0ID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRMZW5ndGg7IGkrKylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgdmFyIGNoYXIgPSB0ZXh0LmNoYXJBdChpKTtcblxuICAgICAgICAgICAgaWYgKCgvKD86XFxzKS8pLnRlc3QoY2hhcikpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFzdEJyZWFrUG9zID0gaTtcbiAgICAgICAgICAgICAgICBsYXN0QnJlYWtXaWR0aCA9IGxhc3RMaW5lV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjaGFyID09PSAnXFxyJyB8fCBjaGFyID09PSAnXFxuJylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGhzLnB1c2gobGFzdExpbmVXaWR0aCk7XG4gICAgICAgICAgICAgICAgbWF4TGluZVdpZHRoID0gTWF0aC5tYXgobWF4TGluZVdpZHRoLCBsYXN0TGluZVdpZHRoKTtcbiAgICAgICAgICAgICAgICArK2xpbmU7XG4gICAgICAgICAgICAgICAgKytzcGFjZXNSZW1vdmVkO1xuXG4gICAgICAgICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgICAgICAgIHBvcy55ICs9IGRhdGEubGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgY2hhckRhdGEgPSBkYXRhLmNoYXJzW2NoYXJDb2RlXTtcblxuICAgICAgICAgICAgaWYgKCFjaGFyRGF0YSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZDaGFyQ29kZSAmJiBjaGFyRGF0YS5rZXJuaW5nW3ByZXZDaGFyQ29kZV0pXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gY2hhckRhdGEua2VybmluZ1twcmV2Q2hhckNvZGVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjaGFycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjaGFyRGF0YS50ZXh0dXJlLFxuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICAgICAgY2hhckNvZGU6IGNoYXJDb2RlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgUG9pbnQocG9zLnggKyBjaGFyRGF0YS54T2Zmc2V0ICsgKHRoaXMuX2xldHRlclNwYWNpbmcgLyAyKSwgcG9zLnkgKyBjaGFyRGF0YS55T2Zmc2V0KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcG9zLnggKz0gY2hhckRhdGEueEFkdmFuY2UgKyB0aGlzLl9sZXR0ZXJTcGFjaW5nO1xuICAgICAgICAgICAgbGFzdExpbmVXaWR0aCA9IHBvcy54O1xuICAgICAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIChjaGFyRGF0YS55T2Zmc2V0ICsgY2hhckRhdGEudGV4dHVyZS5oZWlnaHQpKTtcbiAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IGNoYXJDb2RlO1xuXG4gICAgICAgICAgICBpZiAobGFzdEJyZWFrUG9zICE9PSAtMSAmJiBtYXhXaWR0aCA+IDAgJiYgcG9zLnggPiBtYXhXaWR0aClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICArK3NwYWNlc1JlbW92ZWQ7XG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbXMoY2hhcnMsIDEgKyBsYXN0QnJlYWtQb3MgLSBzcGFjZXNSZW1vdmVkLCAxICsgaSAtIGxhc3RCcmVha1Bvcyk7XG4gICAgICAgICAgICAgICAgaSA9IGxhc3RCcmVha1BvcztcbiAgICAgICAgICAgICAgICBsYXN0QnJlYWtQb3MgPSAtMTtcblxuICAgICAgICAgICAgICAgIGxpbmVXaWR0aHMucHVzaChsYXN0QnJlYWtXaWR0aCk7XG4gICAgICAgICAgICAgICAgbWF4TGluZVdpZHRoID0gTWF0aC5tYXgobWF4TGluZVdpZHRoLCBsYXN0QnJlYWtXaWR0aCk7XG4gICAgICAgICAgICAgICAgbGluZSsrO1xuXG4gICAgICAgICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgICAgICAgIHBvcy55ICs9IGRhdGEubGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxhc3RDaGFyID0gdGV4dC5jaGFyQXQodGV4dC5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAobGFzdENoYXIgIT09ICdcXHInICYmIGxhc3RDaGFyICE9PSAnXFxuJylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCgvKD86XFxzKS8pLnRlc3QobGFzdENoYXIpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lV2lkdGggPSBsYXN0QnJlYWtXaWR0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZVdpZHRocy5wdXNoKGxhc3RMaW5lV2lkdGgpO1xuICAgICAgICAgICAgbWF4TGluZVdpZHRoID0gTWF0aC5tYXgobWF4TGluZVdpZHRoLCBsYXN0TGluZVdpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsaW5lQWxpZ25PZmZzZXRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDw9IGxpbmU7IGkkMSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgYWxpZ25PZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZm9udC5hbGlnbiA9PT0gJ3JpZ2h0JylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGlnbk9mZnNldCA9IG1heExpbmVXaWR0aCAtIGxpbmVXaWR0aHNbaSQxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2ZvbnQuYWxpZ24gPT09ICdjZW50ZXInKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsaWduT2Zmc2V0ID0gKG1heExpbmVXaWR0aCAtIGxpbmVXaWR0aHNbaSQxXSkgLyAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lQWxpZ25PZmZzZXRzLnB1c2goYWxpZ25PZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxlbkNoYXJzID0gY2hhcnMubGVuZ3RoO1xuICAgICAgICB2YXIgdGludCA9IHRoaXMudGludDtcblxuICAgICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBsZW5DaGFyczsgaSQyKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5fZ2x5cGhzW2kkMl07IC8vIGdldCB0aGUgbmV4dCBnbHlwaCBzcHJpdGVcblxuICAgICAgICAgICAgaWYgKGMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYy50ZXh0dXJlID0gY2hhcnNbaSQyXS50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGMgPSBuZXcgU3ByaXRlKGNoYXJzW2kkMl0udGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgYy5yb3VuZFBpeGVscyA9IHRoaXMucm91bmRQaXhlbHM7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2x5cGhzLnB1c2goYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGMucG9zaXRpb24ueCA9IChjaGFyc1tpJDJdLnBvc2l0aW9uLnggKyBsaW5lQWxpZ25PZmZzZXRzW2NoYXJzW2kkMl0ubGluZV0pICogc2NhbGU7XG4gICAgICAgICAgICBjLnBvc2l0aW9uLnkgPSBjaGFyc1tpJDJdLnBvc2l0aW9uLnkgKiBzY2FsZTtcbiAgICAgICAgICAgIGMuc2NhbGUueCA9IGMuc2NhbGUueSA9IHNjYWxlO1xuICAgICAgICAgICAgYy50aW50ID0gdGludDtcblxuICAgICAgICAgICAgaWYgKCFjLnBhcmVudClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIHVubmVjZXNzYXJ5IGNoaWxkcmVuLlxuICAgICAgICBmb3IgKHZhciBpJDMgPSBsZW5DaGFyczsgaSQzIDwgdGhpcy5fZ2x5cGhzLmxlbmd0aDsgKytpJDMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5fZ2x5cGhzW2kkM10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGV4dFdpZHRoID0gbWF4TGluZVdpZHRoICogc2NhbGU7XG4gICAgICAgIHRoaXMuX3RleHRIZWlnaHQgPSAocG9zLnkgKyBkYXRhLmxpbmVIZWlnaHQpICogc2NhbGU7XG5cbiAgICAgICAgLy8gYXBwbHkgYW5jaG9yXG4gICAgICAgIGlmICh0aGlzLmFuY2hvci54ICE9PSAwIHx8IHRoaXMuYW5jaG9yLnkgIT09IDApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkkNCA9IDA7IGkkNCA8IGxlbkNoYXJzOyBpJDQrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nbHlwaHNbaSQ0XS54IC09IHRoaXMuX3RleHRXaWR0aCAqIHRoaXMuYW5jaG9yLng7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2x5cGhzW2kkNF0ueSAtPSB0aGlzLl90ZXh0SGVpZ2h0ICogdGhpcy5hbmNob3IueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXhMaW5lSGVpZ2h0ID0gbWF4TGluZUhlaWdodCAqIHNjYWxlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSB0cmFuc2Zvcm0gb2YgdGhpcyBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgQml0bWFwVGV4dC5wcm90b3R5cGUudXBkYXRlVHJhbnNmb3JtID0gZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtICgpXG4gICAge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyVXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0ZXh0IGJlZm9yZSBjYWxsaW5nIHBhcmVudCdzIGdldExvY2FsQm91bmRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtQSVhJLlJlY3RhbmdsZX0gVGhlIHJlY3Rhbmd1bGFyIGJvdW5kaW5nIGFyZWFcbiAgICAgKi9cbiAgICBCaXRtYXBUZXh0LnByb3RvdHlwZS5nZXRMb2NhbEJvdW5kcyA9IGZ1bmN0aW9uIGdldExvY2FsQm91bmRzICgpXG4gICAge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0TG9jYWxCb3VuZHMuY2FsbCh0aGlzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0ZXh0IHdoZW4gbmVlZGVkXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEJpdG1hcFRleHQucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRleHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGludCBvZiB0aGUgQml0bWFwVGV4dCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250LnRpbnQ7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aW50LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLl9mb250LnRpbnQgPSAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+PSAwKSA/IHZhbHVlIDogMHhGRkZGRkY7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbGlnbm1lbnQgb2YgdGhlIEJpdG1hcFRleHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqIEBkZWZhdWx0ICdsZWZ0J1xuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbGlnbi5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnQuYWxpZ247XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbGlnbi5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5fZm9udC5hbGlnbiA9IHZhbHVlIHx8ICdsZWZ0JztcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFuY2hvciBzZXRzIHRoZSBvcmlnaW4gcG9pbnQgb2YgdGhlIHRleHQuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBgKDAsMClgLCB0aGlzIG1lYW5zIHRoZSB0ZXh0J3Mgb3JpZ2luIGlzIHRoZSB0b3AgbGVmdC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhlIGFuY2hvciB0byBgKDAuNSwwLjUpYCBtZWFucyB0aGUgdGV4dCdzIG9yaWdpbiBpcyBjZW50ZXJlZC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhlIGFuY2hvciB0byBgKDEsMSlgIHdvdWxkIG1lYW4gdGhlIHRleHQncyBvcmlnaW4gcG9pbnQgd2lsbCBiZSB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lci5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuUG9pbnQgfCBudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmFuY2hvci5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FuY2hvcjtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmFuY2hvci5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX2FuY2hvci5zZXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fYW5jaG9yLmNvcHlGcm9tKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udCBkZXNjcmlwdG9yIG9mIHRoZSBCaXRtYXBUZXh0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge29iamVjdH1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuZm9udC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnQ7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5mb250LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICAgICAgICB0aGlzLl9mb250Lm5hbWUgPSB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlLnNsaWNlKDEpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvbnQuc2l6ZSA9IHZhbHVlLmxlbmd0aCA+PSAyID8gcGFyc2VJbnQodmFsdWVbMF0sIDEwKSA6IEJpdG1hcFRleHQuZm9udHNbdGhpcy5fZm9udC5uYW1lXS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fZm9udC5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgICAgICAgIHRoaXMuX2ZvbnQuc2l6ZSA9IHR5cGVvZiB2YWx1ZS5zaXplID09PSAnbnVtYmVyJyA/IHZhbHVlLnNpemUgOiBwYXJzZUludCh2YWx1ZS5zaXplLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgb2YgdGhlIEJpdG1hcFRleHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50ZXh0LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRleHQuc2V0ID0gZnVuY3Rpb24gKHRleHQpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGV4dCA9IFN0cmluZyh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCA/ICcnIDogdGV4dCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RleHQgPT09IHRleHQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXggd2lkdGggb2YgdGhpcyBiaXRtYXAgdGV4dCBpbiBwaXhlbHMuIElmIHRoZSB0ZXh0IHByb3ZpZGVkIGlzIGxvbmdlciB0aGFuIHRoZVxuICAgICAqIHZhbHVlIHByb3ZpZGVkLCBsaW5lIGJyZWFrcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhlIGxhc3Qgd2hpdGVzcGFjZS5cbiAgICAgKiBEaXNhYmxlIGJ5IHNldHRpbmcgdGhlIHZhbHVlIHRvIDAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLm1heFdpZHRoLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4V2lkdGg7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5tYXhXaWR0aC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX21heFdpZHRoID09PSB2YWx1ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heFdpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbmUgaGVpZ2h0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRyeWluZyB0byB1c2UgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgVGV4dCxcbiAgICAgKiBpLmUuIHdoZW4gdHJ5aW5nIHRvIHZlcnRpY2FsbHkgYWxpZ24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLm1heExpbmVIZWlnaHQuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGluZUhlaWdodDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBvdmVyYWxsIHRleHQsIGRpZmZlcmVudCBmcm9tIGZvbnRTaXplLFxuICAgICAqIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlIHN0eWxlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dFdpZHRoLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHRXaWR0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBzcGFjZSBiZXR3ZWVuIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmxldHRlclNwYWNpbmcuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXR0ZXJTcGFjaW5nO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubGV0dGVyU3BhY2luZy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX2xldHRlclNwYWNpbmcgIT09IHZhbHVlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9sZXR0ZXJTcGFjaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvdmVyYWxsIHRleHQsIGRpZmZlcmVudCBmcm9tIGZvbnRTaXplLFxuICAgICAqIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlIHN0eWxlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dEhlaWdodC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0SGVpZ2h0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGJpdG1hcCBmb250IHdpdGggZGF0YSBhbmQgYSB0ZXh0dXJlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7WE1MRG9jdW1lbnR9IHhtbCAtIFRoZSBYTUwgZG9jdW1lbnQgZGF0YS5cbiAgICAgKiBAcGFyYW0ge09iamVjdC48c3RyaW5nLCBQSVhJLlRleHR1cmU+fFBJWEkuVGV4dHVyZXxQSVhJLlRleHR1cmVbXX0gdGV4dHVyZXMgLSBMaXN0IG9mIHRleHR1cmVzIGZvciBlYWNoIHBhZ2UuXG4gICAgICogIElmIHByb3ZpZGluZyBhbiBvYmplY3QsIHRoZSBrZXkgaXMgdGhlIGA8cGFnZT5gIGVsZW1lbnQncyBgZmlsZWAgYXR0cmlidXRlIGluIHRoZSBGTlQgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3VsdCBmb250IG9iamVjdCB3aXRoIGZvbnQsIHNpemUsIGxpbmVIZWlnaHQgYW5kIGNoYXIgZmllbGRzLlxuICAgICAqL1xuICAgIEJpdG1hcFRleHQucmVnaXN0ZXJGb250ID0gZnVuY3Rpb24gcmVnaXN0ZXJGb250ICh4bWwsIHRleHR1cmVzKVxuICAgIHtcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgdmFyIGluZm8gPSB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2luZm8nKVswXTtcbiAgICAgICAgdmFyIGNvbW1vbiA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29tbW9uJylbMF07XG4gICAgICAgIHZhciBwYWdlcyA9IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgncGFnZScpO1xuICAgICAgICB2YXIgcmVzID0gZ2V0UmVzb2x1dGlvbk9mVXJsKHBhZ2VzWzBdLmdldEF0dHJpYnV0ZSgnZmlsZScpKTtcbiAgICAgICAgdmFyIHBhZ2VzVGV4dHVyZXMgPSB7fTtcblxuICAgICAgICBkYXRhLmZvbnQgPSBpbmZvLmdldEF0dHJpYnV0ZSgnZmFjZScpO1xuICAgICAgICBkYXRhLnNpemUgPSBwYXJzZUludChpbmZvLmdldEF0dHJpYnV0ZSgnc2l6ZScpLCAxMCk7XG4gICAgICAgIGRhdGEubGluZUhlaWdodCA9IHBhcnNlSW50KGNvbW1vbi5nZXRBdHRyaWJ1dGUoJ2xpbmVIZWlnaHQnKSwgMTApIC8gcmVzO1xuICAgICAgICBkYXRhLmNoYXJzID0ge307XG5cbiAgICAgICAgLy8gU2luZ2xlIHRleHR1cmUsIGNvbnZlcnQgdG8gbGlzdFxuICAgICAgICBpZiAodGV4dHVyZXMgaW5zdGFuY2VvZiBUZXh0dXJlKVxuICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0dXJlcyA9IFt0ZXh0dXJlc107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBpbnB1dCBUZXh0dXJlLCBUZXh0dXJlcyBvciBvYmplY3RcbiAgICAgICAgLy8gaW50byBhIHBhZ2UgVGV4dHVyZSBsb29rdXAgYnkgXCJpZFwiXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHBhZ2VzW2ldLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIHZhciBmaWxlID0gcGFnZXNbaV0uZ2V0QXR0cmlidXRlKCdmaWxlJyk7XG5cbiAgICAgICAgICAgIHBhZ2VzVGV4dHVyZXNbaWRdID0gdGV4dHVyZXMgaW5zdGFuY2VvZiBBcnJheSA/IHRleHR1cmVzW2ldIDogdGV4dHVyZXNbZmlsZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBsZXR0ZXJzXG4gICAgICAgIHZhciBsZXR0ZXJzID0geG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjaGFyJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGV0dGVycy5sZW5ndGg7IGkkMSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbGV0dGVyID0gbGV0dGVyc1tpJDFdO1xuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gcGFyc2VJbnQobGV0dGVyLmdldEF0dHJpYnV0ZSgnaWQnKSwgMTApO1xuICAgICAgICAgICAgdmFyIHBhZ2UgPSBsZXR0ZXIuZ2V0QXR0cmlidXRlKCdwYWdlJykgfHwgMDtcbiAgICAgICAgICAgIHZhciB0ZXh0dXJlUmVjdCA9IG5ldyBSZWN0YW5nbGUoXG4gICAgICAgICAgICAgICAgKHBhcnNlSW50KGxldHRlci5nZXRBdHRyaWJ1dGUoJ3gnKSwgMTApIC8gcmVzKSArIChwYWdlc1RleHR1cmVzW3BhZ2VdLmZyYW1lLnggLyByZXMpLFxuICAgICAgICAgICAgICAgIChwYXJzZUludChsZXR0ZXIuZ2V0QXR0cmlidXRlKCd5JyksIDEwKSAvIHJlcykgKyAocGFnZXNUZXh0dXJlc1twYWdlXS5mcmFtZS55IC8gcmVzKSxcbiAgICAgICAgICAgICAgICBwYXJzZUludChsZXR0ZXIuZ2V0QXR0cmlidXRlKCd3aWR0aCcpLCAxMCkgLyByZXMsXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQobGV0dGVyLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JyksIDEwKSAvIHJlc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGF0YS5jaGFyc1tjaGFyQ29kZV0gPSB7XG4gICAgICAgICAgICAgICAgeE9mZnNldDogcGFyc2VJbnQobGV0dGVyLmdldEF0dHJpYnV0ZSgneG9mZnNldCcpLCAxMCkgLyByZXMsXG4gICAgICAgICAgICAgICAgeU9mZnNldDogcGFyc2VJbnQobGV0dGVyLmdldEF0dHJpYnV0ZSgneW9mZnNldCcpLCAxMCkgLyByZXMsXG4gICAgICAgICAgICAgICAgeEFkdmFuY2U6IHBhcnNlSW50KGxldHRlci5nZXRBdHRyaWJ1dGUoJ3hhZHZhbmNlJyksIDEwKSAvIHJlcyxcbiAgICAgICAgICAgICAgICBrZXJuaW5nOiB7fSxcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBuZXcgVGV4dHVyZShwYWdlc1RleHR1cmVzW3BhZ2VdLmJhc2VUZXh0dXJlLCB0ZXh0dXJlUmVjdCksXG4gICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBrZXJuaW5nc1xuICAgICAgICB2YXIga2VybmluZ3MgPSB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2tlcm5pbmcnKTtcblxuICAgICAgICBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBrZXJuaW5ncy5sZW5ndGg7IGkkMisrKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIga2VybmluZyA9IGtlcm5pbmdzW2kkMl07XG4gICAgICAgICAgICB2YXIgZmlyc3QgPSBwYXJzZUludChrZXJuaW5nLmdldEF0dHJpYnV0ZSgnZmlyc3QnKSwgMTApIC8gcmVzO1xuICAgICAgICAgICAgdmFyIHNlY29uZCA9IHBhcnNlSW50KGtlcm5pbmcuZ2V0QXR0cmlidXRlKCdzZWNvbmQnKSwgMTApIC8gcmVzO1xuICAgICAgICAgICAgdmFyIGFtb3VudCA9IHBhcnNlSW50KGtlcm5pbmcuZ2V0QXR0cmlidXRlKCdhbW91bnQnKSwgMTApIC8gcmVzO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5jaGFyc1tzZWNvbmRdKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGEuY2hhcnNbc2Vjb25kXS5rZXJuaW5nW2ZpcnN0XSA9IGFtb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEknbSBsZWF2aW5nIHRoaXMgYXMgYSB0ZW1wb3JhcnkgZml4IHNvIHdlIGNhbiB0ZXN0IHRoZSBiaXRtYXAgZm9udHMgaW4gdjNcbiAgICAgICAgLy8gYnV0IGl0J3MgdmVyeSBsaWtlbHkgdG8gY2hhbmdlXG4gICAgICAgIEJpdG1hcFRleHQuZm9udHNbZGF0YS5mb250XSA9IGRhdGE7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCaXRtYXBUZXh0LnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gQml0bWFwVGV4dDtcbn0oQ29udGFpbmVyKSk7XG5cbkJpdG1hcFRleHQuZm9udHMgPSB7fTtcblxuLyoqXG4gKiB7QGxpbmsgUElYSS5Mb2FkZXIgTG9hZGVyfSBtaWRkbGV3YXJlIGZvciBsb2FkaW5nXG4gKiBiaXRtYXAtYmFzZWQgZm9udHMgc3VpdGFibGUgZm9yIHVzaW5nIHdpdGgge0BsaW5rIFBJWEkuQml0bWFwVGV4dH0uXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAaW1wbGVtZW50cyBQSVhJLklMb2FkZXJQbHVnaW5cbiAqL1xudmFyIEJpdG1hcEZvbnRMb2FkZXIgPSBmdW5jdGlvbiBCaXRtYXBGb250TG9hZGVyICgpIHt9O1xuXG5CaXRtYXBGb250TG9hZGVyLnBhcnNlID0gZnVuY3Rpb24gcGFyc2UgKHJlc291cmNlLCB0ZXh0dXJlKVxue1xuICAgIHJlc291cmNlLmJpdG1hcEZvbnQgPSBCaXRtYXBUZXh0LnJlZ2lzdGVyRm9udChyZXNvdXJjZS5kYXRhLCB0ZXh0dXJlKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQuXG4gKlxuICogQHNlZSBQSVhJLkxvYWRlci5yZWdpc3RlclBsdWdpblxuICovXG5CaXRtYXBGb250TG9hZGVyLmFkZCA9IGZ1bmN0aW9uIGFkZCAoKVxue1xuICAgIExvYWRlclJlc291cmNlLnNldEV4dGVuc2lvblhoclR5cGUoJ2ZudCcsIExvYWRlclJlc291cmNlLlhIUl9SRVNQT05TRV9UWVBFLkRPQ1VNRU5UKTtcbn07XG5cbi8qKlxuICogUmVwbGFjZW1lbnQgZm9yIE5vZGVKUydzIHBhdGguZGlybmFtZVxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUGF0aCB0byBnZXQgZGlyZWN0b3J5IGZvclxuICovXG5CaXRtYXBGb250TG9hZGVyLmRpcm5hbWUgPSBmdW5jdGlvbiBkaXJuYW1lICh1cmwpXG57XG4gICAgdmFyIGRpciA9IHVybFxuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAnLycpIC8vIGNvbnZlcnQgd2luZG93cyBub3RhdGlvbiB0byBVTklYIG5vdGF0aW9uLCBVUkwtc2FmZSBiZWNhdXNlIGl0J3MgYSBmb3JiaWRkZW4gY2hhcmFjdGVyXG4gICAgICAgIC5yZXBsYWNlKC9cXC8kLywgJycpIC8vIHJlcGxhY2UgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgLnJlcGxhY2UoL1xcL1teXFwvXSokLywgJycpOyAvLyByZW1vdmUgZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdFxuXG4gICAgLy8gRmlsZSByZXF1ZXN0IGlzIHJlbGF0aXZlLCB1c2UgY3VycmVudCBkaXJlY3RvcnlcbiAgICBpZiAoZGlyID09PSB1cmwpXG4gICAge1xuICAgICAgICByZXR1cm4gJy4nO1xuICAgIH1cbiAgICAvLyBTdGFydGVkIHdpdGggYSBzbGFzaFxuICAgIGVsc2UgaWYgKGRpciA9PT0gJycpXG4gICAge1xuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH1cblxuICAgIHJldHVybiBkaXI7XG59O1xuXG4vKipcbiAqIENhbGxlZCBhZnRlciBhIHJlc291cmNlIGlzIGxvYWRlZC5cbiAqIEBzZWUgUElYSS5Mb2FkZXIubG9hZGVyTWlkZGxld2FyZVxuICogQHBhcmFtIHtQSVhJLkxvYWRlclJlc291cmNlfSByZXNvdXJjZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbmV4dFxuICovXG5CaXRtYXBGb250TG9hZGVyLnVzZSA9IGZ1bmN0aW9uIHVzZSAocmVzb3VyY2UsIG5leHQpXG57XG4gICAgLy8gc2tpcCBpZiBubyBkYXRhIG9yIG5vdCB4bWwgZGF0YVxuICAgIGlmICghcmVzb3VyY2UuZGF0YSB8fCByZXNvdXJjZS50eXBlICE9PSBMb2FkZXJSZXNvdXJjZS5UWVBFLlhNTClcbiAgICB7XG4gICAgICAgIG5leHQoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2tpcCBpZiBub3QgYml0bWFwIGZvbnQgZGF0YSwgdXNpbmcgc29tZSBzaWxseSBkdWNrLXR5cGluZ1xuICAgIGlmIChyZXNvdXJjZS5kYXRhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYWdlJykubGVuZ3RoID09PSAwXG4gICAgICAgIHx8IHJlc291cmNlLmRhdGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2luZm8nKS5sZW5ndGggPT09IDBcbiAgICAgICAgfHwgcmVzb3VyY2UuZGF0YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5mbycpWzBdLmdldEF0dHJpYnV0ZSgnZmFjZScpID09PSBudWxsXG4gICAgKVxuICAgIHtcbiAgICAgICAgbmV4dCgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgeG1sVXJsID0gIXJlc291cmNlLmlzRGF0YVVybCA/IEJpdG1hcEZvbnRMb2FkZXIuZGlybmFtZShyZXNvdXJjZS51cmwpIDogJyc7XG5cbiAgICBpZiAocmVzb3VyY2UuaXNEYXRhVXJsKVxuICAgIHtcbiAgICAgICAgaWYgKHhtbFVybCA9PT0gJy4nKVxuICAgICAgICB7XG4gICAgICAgICAgICB4bWxVcmwgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJhc2VVcmwgJiYgeG1sVXJsKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBpZiBiYXNldXJsIGhhcyBhIHRyYWlsaW5nIHNsYXNoIHRoZW4gYWRkIG9uZSB0byB4bWxVcmwgc28gdGhlIHJlcGxhY2Ugd29ya3MgYmVsb3dcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VVcmwuY2hhckF0KHRoaXMuYmFzZVVybC5sZW5ndGggLSAxKSA9PT0gJy8nKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHhtbFVybCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYmFzZVVybCBmcm9tIHhtbFVybFxuICAgIHhtbFVybCA9IHhtbFVybC5yZXBsYWNlKHRoaXMuYmFzZVVybCwgJycpO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgYW4geG1sVXJsIG5vdywgaXQgbmVlZHMgYSB0cmFpbGluZyBzbGFzaC4gRW5zdXJlIHRoYXQgaXQgZG9lcyBpZiB0aGUgc3RyaW5nIGlzbid0IGVtcHR5LlxuICAgIGlmICh4bWxVcmwgJiYgeG1sVXJsLmNoYXJBdCh4bWxVcmwubGVuZ3RoIC0gMSkgIT09ICcvJylcbiAgICB7XG4gICAgICAgIHhtbFVybCArPSAnLyc7XG4gICAgfVxuXG4gICAgdmFyIHBhZ2VzID0gcmVzb3VyY2UuZGF0YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgncGFnZScpO1xuICAgIHZhciB0ZXh0dXJlcyA9IHt9O1xuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlZCwgd2hlbiB0aGUgbnVtYmVyIG9mIHRleHR1cmVzXG4gICAgLy8gbG9hZCBpcyB0aGUgc2FtZSBudW1iZXIgYXMgcmVmZXJlbmNlcyBpbiB0aGUgZm50IGZpbGVcbiAgICB2YXIgY29tcGxldGVkID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgdGV4dHVyZXNbcGFnZS5tZXRhZGF0YS5wYWdlRmlsZV0gPSBwYWdlLnRleHR1cmU7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRleHR1cmVzKS5sZW5ndGggPT09IHBhZ2VzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgQml0bWFwRm9udExvYWRlci5wYXJzZShyZXNvdXJjZSwgdGV4dHVyZXMpO1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyArK2kpXG4gICAge1xuICAgICAgICB2YXIgcGFnZUZpbGUgPSBwYWdlc1tpXS5nZXRBdHRyaWJ1dGUoJ2ZpbGUnKTtcbiAgICAgICAgdmFyIHVybCA9IHhtbFVybCArIHBhZ2VGaWxlO1xuICAgICAgICB2YXIgZXhpc3RzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaW5jYXNlIHRoZSBpbWFnZSBpcyBsb2FkZWQgb3V0c2lkZVxuICAgICAgICAvLyB1c2luZyB0aGUgc2FtZSBsb2FkZXIsIHJlc291cmNlIHdpbGwgYmUgYXZhaWxhYmxlXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5yZXNvdXJjZXMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBiaXRtYXBSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICBpZiAoYml0bWFwUmVzb3VyY2UudXJsID09PSB1cmwpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYml0bWFwUmVzb3VyY2UubWV0YWRhdGEucGFnZUZpbGUgPSBwYWdlRmlsZTtcbiAgICAgICAgICAgICAgICBpZiAoYml0bWFwUmVzb3VyY2UudGV4dHVyZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZChiaXRtYXBSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpdG1hcFJlc291cmNlLm9uQWZ0ZXJNaWRkbGV3YXJlLmFkZChjb21wbGV0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGlzdHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGV4dHVyZSBpcyBub3QgbG9hZGVkLCB3ZSdsbCBhdHRlbXB0IHRvIGFkZFxuICAgICAgICAvLyBpdCB0byB0aGUgbG9hZCBhbmQgYWRkIHRoZSB0ZXh0dXJlIHRvIHRoZSBsaXN0XG4gICAgICAgIGlmICghZXhpc3RzKVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBTdGFuZGFyZCBsb2FkaW5nIG9wdGlvbnMgZm9yIGltYWdlc1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY3Jvc3NPcmlnaW46IHJlc291cmNlLmNyb3NzT3JpZ2luLFxuICAgICAgICAgICAgICAgIGxvYWRUeXBlOiBMb2FkZXJSZXNvdXJjZS5MT0FEX1RZUEUuSU1BR0UsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgIHsgcGFnZUZpbGU6IHBhZ2VGaWxlIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLm1ldGFkYXRhLmltYWdlTWV0YWRhdGFcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHBhcmVudFJlc291cmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuYWRkKHVybCwgb3B0aW9ucywgY29tcGxldGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCB7IEJpdG1hcEZvbnRMb2FkZXIsIEJpdG1hcFRleHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQtYml0bWFwLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9maWx0ZXItYmx1ciAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9maWx0ZXItYmx1ciBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJ0BwaXhpL2NvcmUnO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tICdAcGl4aS9zZXR0aW5ncyc7XG5cbnZhciB2ZXJ0VGVtcGxhdGUgPSBcIlxcbiAgICBhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XFxuXFxuICAgIHVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4O1xcblxcbiAgICB1bmlmb3JtIGZsb2F0IHN0cmVuZ3RoO1xcblxcbiAgICB2YXJ5aW5nIHZlYzIgdkJsdXJUZXhDb29yZHNbJXNpemUlXTtcXG5cXG4gICAgdW5pZm9ybSB2ZWM0IGlucHV0U2l6ZTtcXG4gICAgdW5pZm9ybSB2ZWM0IG91dHB1dEZyYW1lO1xcblxcbiAgICB2ZWM0IGZpbHRlclZlcnRleFBvc2l0aW9uKCB2b2lkIClcXG4gICAge1xcbiAgICAgICAgdmVjMiBwb3NpdGlvbiA9IGFWZXJ0ZXhQb3NpdGlvbiAqIG1heChvdXRwdXRGcmFtZS56dywgdmVjMigwLikpICsgb3V0cHV0RnJhbWUueHk7XFxuXFxuICAgICAgICByZXR1cm4gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxuICAgIH1cXG5cXG4gICAgdmVjMiBmaWx0ZXJUZXh0dXJlQ29vcmQoIHZvaWQgKVxcbiAgICB7XFxuICAgICAgICByZXR1cm4gYVZlcnRleFBvc2l0aW9uICogKG91dHB1dEZyYW1lLnp3ICogaW5wdXRTaXplLnp3KTtcXG4gICAgfVxcblxcbiAgICB2b2lkIG1haW4odm9pZClcXG4gICAge1xcbiAgICAgICAgZ2xfUG9zaXRpb24gPSBmaWx0ZXJWZXJ0ZXhQb3NpdGlvbigpO1xcblxcbiAgICAgICAgdmVjMiB0ZXh0dXJlQ29vcmQgPSBmaWx0ZXJUZXh0dXJlQ29vcmQoKTtcXG4gICAgICAgICVibHVyJVxcbiAgICB9XCI7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQmx1clZlcnRTb3VyY2Uoa2VybmVsU2l6ZSwgeClcbntcbiAgICB2YXIgaGFsZkxlbmd0aCA9IE1hdGguY2VpbChrZXJuZWxTaXplIC8gMik7XG5cbiAgICB2YXIgdmVydFNvdXJjZSA9IHZlcnRUZW1wbGF0ZTtcblxuICAgIHZhciBibHVyTG9vcCA9ICcnO1xuICAgIHZhciB0ZW1wbGF0ZTtcbiAgICAvLyBsZXQgdmFsdWU7XG5cbiAgICBpZiAoeClcbiAgICB7XG4gICAgICAgIHRlbXBsYXRlID0gJ3ZCbHVyVGV4Q29vcmRzWyVpbmRleCVdID0gIHRleHR1cmVDb29yZCArIHZlYzIoJXNhbXBsZUluZGV4JSAqIHN0cmVuZ3RoLCAwLjApOyc7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHRlbXBsYXRlID0gJ3ZCbHVyVGV4Q29vcmRzWyVpbmRleCVdID0gIHRleHR1cmVDb29yZCArIHZlYzIoMC4wLCAlc2FtcGxlSW5kZXglICogc3RyZW5ndGgpOyc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXJuZWxTaXplOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgYmx1ciA9IHRlbXBsYXRlLnJlcGxhY2UoJyVpbmRleCUnLCBpKTtcblxuICAgICAgICAvLyB2YWx1ZSA9IGk7XG5cbiAgICAgICAgLy8gaWYoaSA+PSBoYWxmTGVuZ3RoKVxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgICB2YWx1ZSA9IGtlcm5lbFNpemUgLSBpIC0gMTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGJsdXIgPSBibHVyLnJlcGxhY2UoJyVzYW1wbGVJbmRleCUnLCAoKGkgLSAoaGFsZkxlbmd0aCAtIDEpKSArIFwiLjBcIikpO1xuXG4gICAgICAgIGJsdXJMb29wICs9IGJsdXI7XG4gICAgICAgIGJsdXJMb29wICs9ICdcXG4nO1xuICAgIH1cblxuICAgIHZlcnRTb3VyY2UgPSB2ZXJ0U291cmNlLnJlcGxhY2UoJyVibHVyJScsIGJsdXJMb29wKTtcbiAgICB2ZXJ0U291cmNlID0gdmVydFNvdXJjZS5yZXBsYWNlKCclc2l6ZSUnLCBrZXJuZWxTaXplKTtcblxuICAgIHJldHVybiB2ZXJ0U291cmNlO1xufVxuXG52YXIgR0FVU1NJQU5fVkFMVUVTID0ge1xuICAgIDU6IFswLjE1MzM4OCwgMC4yMjE0NjEsIDAuMjUwMzAxXSxcbiAgICA3OiBbMC4wNzEzMDMsIDAuMTMxNTE0LCAwLjE4OTg3OSwgMC4yMTQ2MDddLFxuICAgIDk6IFswLjAyODUzMiwgMC4wNjcyMzQsIDAuMTI0MDA5LCAwLjE3OTA0NCwgMC4yMDIzNl0sXG4gICAgMTE6IFswLjAwOTMsIDAuMDI4MDAyLCAwLjA2NTk4NCwgMC4xMjE3MDMsIDAuMTc1NzEzLCAwLjE5ODU5Nl0sXG4gICAgMTM6IFswLjAwMjQwNiwgMC4wMDkyNTUsIDAuMDI3ODY3LCAwLjA2NTY2NiwgMC4xMjExMTcsIDAuMTc0ODY4LCAwLjE5NzY0MV0sXG4gICAgMTU6IFswLjAwMDQ4OSwgMC4wMDI0MDMsIDAuMDA5MjQ2LCAwLjAyNzg0LCAwLjA2NTYwMiwgMC4xMjA5OTksIDAuMTc0Njk3LCAwLjE5NzQ0OF0sXG59O1xuXG52YXIgZnJhZ1RlbXBsYXRlID0gW1xuICAgICd2YXJ5aW5nIHZlYzIgdkJsdXJUZXhDb29yZHNbJXNpemUlXTsnLFxuICAgICd1bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjsnLFxuXG4gICAgJ3ZvaWQgbWFpbih2b2lkKScsXG4gICAgJ3snLFxuICAgICcgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjApOycsXG4gICAgJyAgICAlYmx1ciUnLFxuICAgICd9JyBdLmpvaW4oJ1xcbicpO1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUJsdXJGcmFnU291cmNlKGtlcm5lbFNpemUpXG57XG4gICAgdmFyIGtlcm5lbCA9IEdBVVNTSUFOX1ZBTFVFU1trZXJuZWxTaXplXTtcbiAgICB2YXIgaGFsZkxlbmd0aCA9IGtlcm5lbC5sZW5ndGg7XG5cbiAgICB2YXIgZnJhZ1NvdXJjZSA9IGZyYWdUZW1wbGF0ZTtcblxuICAgIHZhciBibHVyTG9vcCA9ICcnO1xuICAgIHZhciB0ZW1wbGF0ZSA9ICdnbF9GcmFnQ29sb3IgKz0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2Qmx1clRleENvb3Jkc1slaW5kZXglXSkgKiAldmFsdWUlOyc7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXJuZWxTaXplOyBpKyspXG4gICAge1xuICAgICAgICB2YXIgYmx1ciA9IHRlbXBsYXRlLnJlcGxhY2UoJyVpbmRleCUnLCBpKTtcblxuICAgICAgICB2YWx1ZSA9IGk7XG5cbiAgICAgICAgaWYgKGkgPj0gaGFsZkxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWUgPSBrZXJuZWxTaXplIC0gaSAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBibHVyID0gYmx1ci5yZXBsYWNlKCcldmFsdWUlJywga2VybmVsW3ZhbHVlXSk7XG5cbiAgICAgICAgYmx1ckxvb3AgKz0gYmx1cjtcbiAgICAgICAgYmx1ckxvb3AgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgZnJhZ1NvdXJjZSA9IGZyYWdTb3VyY2UucmVwbGFjZSgnJWJsdXIlJywgYmx1ckxvb3ApO1xuICAgIGZyYWdTb3VyY2UgPSBmcmFnU291cmNlLnJlcGxhY2UoJyVzaXplJScsIGtlcm5lbFNpemUpO1xuXG4gICAgcmV0dXJuIGZyYWdTb3VyY2U7XG59XG5cbi8qKlxuICogVGhlIEJsdXJGaWx0ZXJQYXNzIGFwcGxpZXMgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIEdhdXNzaWFuIGJsdXIgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5GaWx0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJLmZpbHRlcnNcbiAqL1xudmFyIEJsdXJGaWx0ZXJQYXNzID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRmlsdGVyKSB7XG4gICAgZnVuY3Rpb24gQmx1ckZpbHRlclBhc3MoaG9yaXpvbnRhbCwgc3RyZW5ndGgsIHF1YWxpdHksIHJlc29sdXRpb24sIGtlcm5lbFNpemUpXG4gICAge1xuICAgICAgICBrZXJuZWxTaXplID0ga2VybmVsU2l6ZSB8fCA1O1xuICAgICAgICB2YXIgdmVydFNyYyA9IGdlbmVyYXRlQmx1clZlcnRTb3VyY2Uoa2VybmVsU2l6ZSwgaG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBmcmFnU3JjID0gZ2VuZXJhdGVCbHVyRnJhZ1NvdXJjZShrZXJuZWxTaXplKTtcblxuICAgICAgICBGaWx0ZXIuY2FsbChcbiAgICAgICAgICAgIC8vIHZlcnRleCBzaGFkZXJcbiAgICAgICAgICAgIHRoaXMsIHZlcnRTcmMsXG4gICAgICAgICAgICAvLyBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgICAgIGZyYWdTcmNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhvcml6b250YWwgPSBob3Jpem9udGFsO1xuXG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHJlc29sdXRpb24gfHwgc2V0dGluZ3MuUkVTT0xVVElPTjtcblxuICAgICAgICB0aGlzLl9xdWFsaXR5ID0gMDtcblxuICAgICAgICB0aGlzLnF1YWxpdHkgPSBxdWFsaXR5IHx8IDQ7XG5cbiAgICAgICAgdGhpcy5ibHVyID0gc3RyZW5ndGggfHwgODtcbiAgICB9XG5cbiAgICBpZiAoIEZpbHRlciApIEJsdXJGaWx0ZXJQYXNzLl9fcHJvdG9fXyA9IEZpbHRlcjtcbiAgICBCbHVyRmlsdGVyUGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBGaWx0ZXIgJiYgRmlsdGVyLnByb3RvdHlwZSApO1xuICAgIEJsdXJGaWx0ZXJQYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJsdXJGaWx0ZXJQYXNzO1xuXG4gICAgdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgYmx1cjogeyBjb25maWd1cmFibGU6IHRydWUgfSxxdWFsaXR5OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbiAgICBCbHVyRmlsdGVyUGFzcy5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiBhcHBseSAoZmlsdGVyTWFuYWdlciwgaW5wdXQsIG91dHB1dCwgY2xlYXIpXG4gICAge1xuICAgICAgICBpZiAob3V0cHV0KVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5ob3Jpem9udGFsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybXMuc3RyZW5ndGggPSAoMSAvIG91dHB1dC53aWR0aCkgKiAob3V0cHV0LndpZHRoIC8gaW5wdXQud2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybXMuc3RyZW5ndGggPSAoMSAvIG91dHB1dC5oZWlnaHQpICogKG91dHB1dC5oZWlnaHQgLyBpbnB1dC5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMuaG9yaXpvbnRhbCkgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybXMuc3RyZW5ndGggPSAoMSAvIGZpbHRlck1hbmFnZXIucmVuZGVyZXIud2lkdGgpICogKGZpbHRlck1hbmFnZXIucmVuZGVyZXIud2lkdGggLyBpbnB1dC53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmb3Jtcy5zdHJlbmd0aCA9ICgxIC8gZmlsdGVyTWFuYWdlci5yZW5kZXJlci5oZWlnaHQpICogKGZpbHRlck1hbmFnZXIucmVuZGVyZXIuaGVpZ2h0IC8gaW5wdXQuaGVpZ2h0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2NyZWVuIHNwYWNlIVxuICAgICAgICB0aGlzLnVuaWZvcm1zLnN0cmVuZ3RoICo9IHRoaXMuc3RyZW5ndGg7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuc3RyZW5ndGggLz0gdGhpcy5wYXNzZXM7XG5cbiAgICAgICAgaWYgKHRoaXMucGFzc2VzID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICBmaWx0ZXJNYW5hZ2VyLmFwcGx5RmlsdGVyKHRoaXMsIGlucHV0LCBvdXRwdXQsIGNsZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBmaWx0ZXJNYW5hZ2VyLmdldEZpbHRlclRleHR1cmUoKTtcbiAgICAgICAgICAgIHZhciByZW5kZXJlciA9IGZpbHRlck1hbmFnZXIucmVuZGVyZXI7XG5cbiAgICAgICAgICAgIHZhciBmbGlwID0gaW5wdXQ7XG4gICAgICAgICAgICB2YXIgZmxvcCA9IHJlbmRlclRhcmdldDtcblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5ibGVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgZmlsdGVyTWFuYWdlci5hcHBseUZpbHRlcih0aGlzLCBmbGlwLCBmbG9wLCB0cnVlKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnBhc3NlcyAtIDE7IGkrKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5yZW5kZXJUZXh0dXJlLmJpbmQoZmxpcCwgZmxpcC5maWx0ZXJGcmFtZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm1zLnVTYW1wbGVyID0gZmxvcDtcblxuICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gZmxvcDtcblxuICAgICAgICAgICAgICAgIGZsb3AgPSBmbGlwO1xuICAgICAgICAgICAgICAgIGZsaXAgPSB0ZW1wO1xuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuc2hhZGVyLmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZ2VvbWV0cnkuZHJhdyg1KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5ibGVuZCA9IHRydWU7XG4gICAgICAgICAgICBmaWx0ZXJNYW5hZ2VyLmFwcGx5RmlsdGVyKHRoaXMsIGZsb3AsIG91dHB1dCwgY2xlYXIpO1xuICAgICAgICAgICAgZmlsdGVyTWFuYWdlci5yZXR1cm5GaWx0ZXJUZXh0dXJlKHJlbmRlclRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIG9mIGJvdGggdGhlIGJsdXIuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMTZcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmx1ci5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZW5ndGg7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibHVyLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSAxICsgKE1hdGguYWJzKHZhbHVlKSAqIDIpO1xuICAgICAgICB0aGlzLnN0cmVuZ3RoID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHF1YWxpdHkgb2YgdGhlIGJsdXIgYnkgbW9kaWZ5aW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzLiBNb3JlIHBhc3NlcyBtZWFucyBoaWdoZXJcbiAgICAgKiBxdWFpbGl0eSBibHVyaW5nIGJ1dCB0aGUgbG93ZXIgdGhlIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDRcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMucXVhbGl0eS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1YWxpdHk7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5xdWFsaXR5LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLl9xdWFsaXR5ID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGFzc2VzID0gdmFsdWU7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCbHVyRmlsdGVyUGFzcy5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIEJsdXJGaWx0ZXJQYXNzO1xufShGaWx0ZXIpKTtcblxuLyoqXG4gKiBUaGUgQmx1ckZpbHRlciBhcHBsaWVzIGEgR2F1c3NpYW4gYmx1ciB0byBhbiBvYmplY3QuXG4gKlxuICogVGhlIHN0cmVuZ3RoIG9mIHRoZSBibHVyIGNhbiBiZSBzZXQgZm9yIHRoZSB4LWF4aXMgYW5kIHktYXhpcyBzZXBhcmF0ZWx5LlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5GaWx0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJLmZpbHRlcnNcbiAqL1xudmFyIEJsdXJGaWx0ZXIgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChGaWx0ZXIpIHtcbiAgICBmdW5jdGlvbiBCbHVyRmlsdGVyKHN0cmVuZ3RoLCBxdWFsaXR5LCByZXNvbHV0aW9uLCBrZXJuZWxTaXplKVxuICAgIHtcbiAgICAgICAgRmlsdGVyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdGhpcy5ibHVyWEZpbHRlciA9IG5ldyBCbHVyRmlsdGVyUGFzcyh0cnVlLCBzdHJlbmd0aCwgcXVhbGl0eSwgcmVzb2x1dGlvbiwga2VybmVsU2l6ZSk7XG4gICAgICAgIHRoaXMuYmx1cllGaWx0ZXIgPSBuZXcgQmx1ckZpbHRlclBhc3MoZmFsc2UsIHN0cmVuZ3RoLCBxdWFsaXR5LCByZXNvbHV0aW9uLCBrZXJuZWxTaXplKTtcblxuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uIHx8IHNldHRpbmdzLlJFU09MVVRJT047XG4gICAgICAgIHRoaXMucXVhbGl0eSA9IHF1YWxpdHkgfHwgNDtcbiAgICAgICAgdGhpcy5ibHVyID0gc3RyZW5ndGggfHwgODtcblxuICAgICAgICB0aGlzLnJlcGVhdEVkZ2VQaXhlbHMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIEZpbHRlciApIEJsdXJGaWx0ZXIuX19wcm90b19fID0gRmlsdGVyO1xuICAgIEJsdXJGaWx0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRmlsdGVyICYmIEZpbHRlci5wcm90b3R5cGUgKTtcbiAgICBCbHVyRmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJsdXJGaWx0ZXI7XG5cbiAgICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBibHVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHF1YWxpdHk6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYmx1clg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYmx1clk6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYmxlbmRNb2RlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHJlcGVhdEVkZ2VQaXhlbHM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGZpbHRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5zeXN0ZW1zLkZpbHRlclN5c3RlbX0gZmlsdGVyTWFuYWdlciAtIFRoZSBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJUZXh0dXJlfSBpbnB1dCAtIFRoZSBpbnB1dCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IG91dHB1dCAtIFRoZSBvdXRwdXQgdGFyZ2V0LlxuICAgICAqL1xuICAgIEJsdXJGaWx0ZXIucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gYXBwbHkgKGZpbHRlck1hbmFnZXIsIGlucHV0LCBvdXRwdXQsIGNsZWFyKVxuICAgIHtcbiAgICAgICAgdmFyIHhTdHJlbmd0aCA9IE1hdGguYWJzKHRoaXMuYmx1clhGaWx0ZXIuc3RyZW5ndGgpO1xuICAgICAgICB2YXIgeVN0cmVuZ3RoID0gTWF0aC5hYnModGhpcy5ibHVyWUZpbHRlci5zdHJlbmd0aCk7XG5cbiAgICAgICAgaWYgKHhTdHJlbmd0aCAmJiB5U3RyZW5ndGgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBmaWx0ZXJNYW5hZ2VyLmdldEZpbHRlclRleHR1cmUoKTtcblxuICAgICAgICAgICAgdGhpcy5ibHVyWEZpbHRlci5hcHBseShmaWx0ZXJNYW5hZ2VyLCBpbnB1dCwgcmVuZGVyVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYmx1cllGaWx0ZXIuYXBwbHkoZmlsdGVyTWFuYWdlciwgcmVuZGVyVGFyZ2V0LCBvdXRwdXQsIGNsZWFyKTtcblxuICAgICAgICAgICAgZmlsdGVyTWFuYWdlci5yZXR1cm5GaWx0ZXJUZXh0dXJlKHJlbmRlclRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoeVN0cmVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmJsdXJZRmlsdGVyLmFwcGx5KGZpbHRlck1hbmFnZXIsIGlucHV0LCBvdXRwdXQsIGNsZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuYmx1clhGaWx0ZXIuYXBwbHkoZmlsdGVyTWFuYWdlciwgaW5wdXQsIG91dHB1dCwgY2xlYXIpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEJsdXJGaWx0ZXIucHJvdG90eXBlLnVwZGF0ZVBhZGRpbmcgPSBmdW5jdGlvbiB1cGRhdGVQYWRkaW5nICgpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5fcmVwZWF0RWRnZVBpeGVscylcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IE1hdGgubWF4KE1hdGguYWJzKHRoaXMuYmx1clhGaWx0ZXIuc3RyZW5ndGgpLCBNYXRoLmFicyh0aGlzLmJsdXJZRmlsdGVyLnN0cmVuZ3RoKSkgKiAyO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIG9mIGJvdGggdGhlIGJsdXJYIGFuZCBibHVyWSBwcm9wZXJ0aWVzIHNpbXVsdGFuZW91c2x5XG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMlxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibHVyLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5ibHVyWEZpbHRlci5ibHVyO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmx1ci5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5ibHVyWEZpbHRlci5ibHVyID0gdGhpcy5ibHVyWUZpbHRlci5ibHVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlUGFkZGluZygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGFzc2VzIGZvciBibHVyLiBNb3JlIHBhc3NlcyBtZWFucyBoaWdoZXIgcXVhaWxpdHkgYmx1cmluZy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnF1YWxpdHkuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsdXJYRmlsdGVyLnF1YWxpdHk7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5xdWFsaXR5LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLmJsdXJYRmlsdGVyLnF1YWxpdHkgPSB0aGlzLmJsdXJZRmlsdGVyLnF1YWxpdHkgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RyZW5ndGggb2YgdGhlIGJsdXJYIHByb3BlcnR5XG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMlxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibHVyWC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmx1clhGaWx0ZXIuYmx1cjtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmJsdXJYLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLmJsdXJYRmlsdGVyLmJsdXIgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVQYWRkaW5nKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cmVuZ3RoIG9mIHRoZSBibHVyWSBwcm9wZXJ0eVxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDJcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmx1clkuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsdXJZRmlsdGVyLmJsdXI7XG4gICAgfTtcblxuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibHVyWS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIHtcbiAgICAgICAgdGhpcy5ibHVyWUZpbHRlci5ibHVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlUGFkZGluZygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBibGVuZG1vZGUgb2YgdGhlIGZpbHRlclxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmJsZW5kTW9kZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmx1cllGaWx0ZXIuYmxlbmRNb2RlO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYmxlbmRNb2RlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLmJsdXJZRmlsdGVyLmJsZW5kTW9kZSA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGUgZWRnZSBvZiB0aGUgdGFyZ2V0IHdpbGwgYmUgY2xhbXBlZFxuICAgICAqXG4gICAgICogQG1lbWJlciB7Ym9vbH1cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5yZXBlYXRFZGdlUGl4ZWxzLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwZWF0RWRnZVBpeGVscztcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJlcGVhdEVkZ2VQaXhlbHMuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5fcmVwZWF0RWRnZVBpeGVscyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZGRpbmcoKTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJsdXJGaWx0ZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBCbHVyRmlsdGVyO1xufShGaWx0ZXIpKTtcblxuZXhwb3J0IHsgQmx1ckZpbHRlciwgQmx1ckZpbHRlclBhc3MgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbHRlci1ibHVyLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9maWx0ZXItY29sb3ItbWF0cml4IC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL2ZpbHRlci1jb2xvci1tYXRyaXggaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBGaWx0ZXIsIGRlZmF1bHRGaWx0ZXJWZXJ0ZXggfSBmcm9tICdAcGl4aS9jb3JlJztcblxudmFyIGZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVDb29yZDtcXG51bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcXG51bmlmb3JtIGZsb2F0IG1bMjBdO1xcbnVuaWZvcm0gZmxvYXQgdUFscGhhO1xcblxcbnZvaWQgbWFpbih2b2lkKVxcbntcXG4gICAgdmVjNCBjID0gdGV4dHVyZTJEKHVTYW1wbGVyLCB2VGV4dHVyZUNvb3JkKTtcXG5cXG4gICAgaWYgKHVBbHBoYSA9PSAwLjApIHtcXG4gICAgICAgIGdsX0ZyYWdDb2xvciA9IGM7XFxuICAgICAgICByZXR1cm47XFxuICAgIH1cXG5cXG4gICAgLy8gVW4tcHJlbXVsdGlwbHkgYWxwaGEgYmVmb3JlIGFwcGx5aW5nIHRoZSBjb2xvciBtYXRyaXguIFNlZSBpc3N1ZSAjMzUzOS5cXG4gICAgaWYgKGMuYSA+IDAuMCkge1xcbiAgICAgIGMucmdiIC89IGMuYTtcXG4gICAgfVxcblxcbiAgICB2ZWM0IHJlc3VsdDtcXG5cXG4gICAgcmVzdWx0LnIgPSAobVswXSAqIGMucik7XFxuICAgICAgICByZXN1bHQuciArPSAobVsxXSAqIGMuZyk7XFxuICAgICAgICByZXN1bHQuciArPSAobVsyXSAqIGMuYik7XFxuICAgICAgICByZXN1bHQuciArPSAobVszXSAqIGMuYSk7XFxuICAgICAgICByZXN1bHQuciArPSBtWzRdO1xcblxcbiAgICByZXN1bHQuZyA9IChtWzVdICogYy5yKTtcXG4gICAgICAgIHJlc3VsdC5nICs9IChtWzZdICogYy5nKTtcXG4gICAgICAgIHJlc3VsdC5nICs9IChtWzddICogYy5iKTtcXG4gICAgICAgIHJlc3VsdC5nICs9IChtWzhdICogYy5hKTtcXG4gICAgICAgIHJlc3VsdC5nICs9IG1bOV07XFxuXFxuICAgIHJlc3VsdC5iID0gKG1bMTBdICogYy5yKTtcXG4gICAgICAgcmVzdWx0LmIgKz0gKG1bMTFdICogYy5nKTtcXG4gICAgICAgcmVzdWx0LmIgKz0gKG1bMTJdICogYy5iKTtcXG4gICAgICAgcmVzdWx0LmIgKz0gKG1bMTNdICogYy5hKTtcXG4gICAgICAgcmVzdWx0LmIgKz0gbVsxNF07XFxuXFxuICAgIHJlc3VsdC5hID0gKG1bMTVdICogYy5yKTtcXG4gICAgICAgcmVzdWx0LmEgKz0gKG1bMTZdICogYy5nKTtcXG4gICAgICAgcmVzdWx0LmEgKz0gKG1bMTddICogYy5iKTtcXG4gICAgICAgcmVzdWx0LmEgKz0gKG1bMThdICogYy5hKTtcXG4gICAgICAgcmVzdWx0LmEgKz0gbVsxOV07XFxuXFxuICAgIHZlYzMgcmdiID0gbWl4KGMucmdiLCByZXN1bHQucmdiLCB1QWxwaGEpO1xcblxcbiAgICAvLyBQcmVtdWx0aXBseSBhbHBoYSBhZ2Fpbi5cXG4gICAgcmdiICo9IHJlc3VsdC5hO1xcblxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHJnYiwgcmVzdWx0LmEpO1xcbn1cXG5cIjtcblxuLyoqXG4gKiBUaGUgQ29sb3JNYXRyaXhGaWx0ZXIgY2xhc3MgbGV0cyB5b3UgYXBwbHkgYSA1eDQgbWF0cml4IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBSR0JBXG4gKiBjb2xvciBhbmQgYWxwaGEgdmFsdWVzIG9mIGV2ZXJ5IHBpeGVsIG9uIHlvdXIgZGlzcGxheU9iamVjdCB0byBwcm9kdWNlIGEgcmVzdWx0XG4gKiB3aXRoIGEgbmV3IHNldCBvZiBSR0JBIGNvbG9yIGFuZCBhbHBoYSB2YWx1ZXMuIEl0J3MgcHJldHR5IHBvd2VyZnVsIVxuICpcbiAqIGBgYGpzXG4gKiAgbGV0IGNvbG9yTWF0cml4ID0gbmV3IFBJWEkuZmlsdGVycy5Db2xvck1hdHJpeEZpbHRlcigpO1xuICogIGNvbnRhaW5lci5maWx0ZXJzID0gW2NvbG9yTWF0cml4XTtcbiAqICBjb2xvck1hdHJpeC5jb250cmFzdCgyKTtcbiAqIGBgYFxuICogQGF1dGhvciBDbMOpbWVudCBDaGVuZWJhdWx0IDxjbGVtZW50QGdvb2Rib3lkaWdpdGFsLmNvbT5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5GaWx0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJLmZpbHRlcnNcbiAqL1xudmFyIENvbG9yTWF0cml4RmlsdGVyID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRmlsdGVyKSB7XG4gICAgZnVuY3Rpb24gQ29sb3JNYXRyaXhGaWx0ZXIoKVxuICAgIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge1xuICAgICAgICAgICAgbTogbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLCAwLFxuICAgICAgICAgICAgICAgIDAsIDAsIDEsIDAsIDAsXG4gICAgICAgICAgICAgICAgMCwgMCwgMCwgMSwgMF0pLFxuICAgICAgICAgICAgdUFscGhhOiAxLFxuICAgICAgICB9O1xuXG4gICAgICAgIEZpbHRlci5jYWxsKHRoaXMsIGRlZmF1bHRGaWx0ZXJWZXJ0ZXgsIGZyYWdtZW50LCB1bmlmb3Jtcyk7XG5cbiAgICAgICAgdGhpcy5hbHBoYSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKCBGaWx0ZXIgKSBDb2xvck1hdHJpeEZpbHRlci5fX3Byb3RvX18gPSBGaWx0ZXI7XG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRmlsdGVyICYmIEZpbHRlci5wcm90b3R5cGUgKTtcbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb2xvck1hdHJpeEZpbHRlcjtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IG1hdHJpeDogeyBjb25maWd1cmFibGU6IHRydWUgfSxhbHBoYTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBjdXJyZW50IG1hdHJpeCBhbmQgc2V0IHRoZSBuZXcgb25lXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBtYXRyaXggLSA1eDQgbWF0cml4XG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLl9sb2FkTWF0cml4ID0gZnVuY3Rpb24gX2xvYWRNYXRyaXggKG1hdHJpeCwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICBpZiAoIG11bHRpcGx5ID09PSB2b2lkIDAgKSBtdWx0aXBseSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBuZXdNYXRyaXggPSBtYXRyaXg7XG5cbiAgICAgICAgaWYgKG11bHRpcGx5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9tdWx0aXBseShuZXdNYXRyaXgsIHRoaXMudW5pZm9ybXMubSwgbWF0cml4KTtcbiAgICAgICAgICAgIG5ld01hdHJpeCA9IHRoaXMuX2NvbG9yTWF0cml4KG5ld01hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdGhlIG5ldyBtYXRyaXhcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5tID0gbmV3TWF0cml4O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBsaWVzIHR3byBtYXQ1J3NcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gb3V0IC0gNXg0IG1hdHJpeCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGEgLSA1eDQgbWF0cml4IHRoZSBmaXJzdCBvcGVyYW5kXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gYiAtIDV4NCBtYXRyaXggdGhlIHNlY29uZCBvcGVyYW5kXG4gICAgICogQHJldHVybnMge251bWJlcltdfSA1eDQgbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLl9tdWx0aXBseSA9IGZ1bmN0aW9uIF9tdWx0aXBseSAob3V0LCBhLCBiKVxuICAgIHtcbiAgICAgICAgLy8gUmVkIENoYW5uZWxcbiAgICAgICAgb3V0WzBdID0gKGFbMF0gKiBiWzBdKSArIChhWzFdICogYls1XSkgKyAoYVsyXSAqIGJbMTBdKSArIChhWzNdICogYlsxNV0pO1xuICAgICAgICBvdXRbMV0gPSAoYVswXSAqIGJbMV0pICsgKGFbMV0gKiBiWzZdKSArIChhWzJdICogYlsxMV0pICsgKGFbM10gKiBiWzE2XSk7XG4gICAgICAgIG91dFsyXSA9IChhWzBdICogYlsyXSkgKyAoYVsxXSAqIGJbN10pICsgKGFbMl0gKiBiWzEyXSkgKyAoYVszXSAqIGJbMTddKTtcbiAgICAgICAgb3V0WzNdID0gKGFbMF0gKiBiWzNdKSArIChhWzFdICogYls4XSkgKyAoYVsyXSAqIGJbMTNdKSArIChhWzNdICogYlsxOF0pO1xuICAgICAgICBvdXRbNF0gPSAoYVswXSAqIGJbNF0pICsgKGFbMV0gKiBiWzldKSArIChhWzJdICogYlsxNF0pICsgKGFbM10gKiBiWzE5XSkgKyBhWzRdO1xuXG4gICAgICAgIC8vIEdyZWVuIENoYW5uZWxcbiAgICAgICAgb3V0WzVdID0gKGFbNV0gKiBiWzBdKSArIChhWzZdICogYls1XSkgKyAoYVs3XSAqIGJbMTBdKSArIChhWzhdICogYlsxNV0pO1xuICAgICAgICBvdXRbNl0gPSAoYVs1XSAqIGJbMV0pICsgKGFbNl0gKiBiWzZdKSArIChhWzddICogYlsxMV0pICsgKGFbOF0gKiBiWzE2XSk7XG4gICAgICAgIG91dFs3XSA9IChhWzVdICogYlsyXSkgKyAoYVs2XSAqIGJbN10pICsgKGFbN10gKiBiWzEyXSkgKyAoYVs4XSAqIGJbMTddKTtcbiAgICAgICAgb3V0WzhdID0gKGFbNV0gKiBiWzNdKSArIChhWzZdICogYls4XSkgKyAoYVs3XSAqIGJbMTNdKSArIChhWzhdICogYlsxOF0pO1xuICAgICAgICBvdXRbOV0gPSAoYVs1XSAqIGJbNF0pICsgKGFbNl0gKiBiWzldKSArIChhWzddICogYlsxNF0pICsgKGFbOF0gKiBiWzE5XSkgKyBhWzldO1xuXG4gICAgICAgIC8vIEJsdWUgQ2hhbm5lbFxuICAgICAgICBvdXRbMTBdID0gKGFbMTBdICogYlswXSkgKyAoYVsxMV0gKiBiWzVdKSArIChhWzEyXSAqIGJbMTBdKSArIChhWzEzXSAqIGJbMTVdKTtcbiAgICAgICAgb3V0WzExXSA9IChhWzEwXSAqIGJbMV0pICsgKGFbMTFdICogYls2XSkgKyAoYVsxMl0gKiBiWzExXSkgKyAoYVsxM10gKiBiWzE2XSk7XG4gICAgICAgIG91dFsxMl0gPSAoYVsxMF0gKiBiWzJdKSArIChhWzExXSAqIGJbN10pICsgKGFbMTJdICogYlsxMl0pICsgKGFbMTNdICogYlsxN10pO1xuICAgICAgICBvdXRbMTNdID0gKGFbMTBdICogYlszXSkgKyAoYVsxMV0gKiBiWzhdKSArIChhWzEyXSAqIGJbMTNdKSArIChhWzEzXSAqIGJbMThdKTtcbiAgICAgICAgb3V0WzE0XSA9IChhWzEwXSAqIGJbNF0pICsgKGFbMTFdICogYls5XSkgKyAoYVsxMl0gKiBiWzE0XSkgKyAoYVsxM10gKiBiWzE5XSkgKyBhWzE0XTtcblxuICAgICAgICAvLyBBbHBoYSBDaGFubmVsXG4gICAgICAgIG91dFsxNV0gPSAoYVsxNV0gKiBiWzBdKSArIChhWzE2XSAqIGJbNV0pICsgKGFbMTddICogYlsxMF0pICsgKGFbMThdICogYlsxNV0pO1xuICAgICAgICBvdXRbMTZdID0gKGFbMTVdICogYlsxXSkgKyAoYVsxNl0gKiBiWzZdKSArIChhWzE3XSAqIGJbMTFdKSArIChhWzE4XSAqIGJbMTZdKTtcbiAgICAgICAgb3V0WzE3XSA9IChhWzE1XSAqIGJbMl0pICsgKGFbMTZdICogYls3XSkgKyAoYVsxN10gKiBiWzEyXSkgKyAoYVsxOF0gKiBiWzE3XSk7XG4gICAgICAgIG91dFsxOF0gPSAoYVsxNV0gKiBiWzNdKSArIChhWzE2XSAqIGJbOF0pICsgKGFbMTddICogYlsxM10pICsgKGFbMThdICogYlsxOF0pO1xuICAgICAgICBvdXRbMTldID0gKGFbMTVdICogYls0XSkgKyAoYVsxNl0gKiBiWzldKSArIChhWzE3XSAqIGJbMTRdKSArIChhWzE4XSAqIGJbMTldKSArIGFbMTldO1xuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIEZsb2F0MzIgQXJyYXkgYW5kIG5vcm1hbGl6ZSB0aGUgb2Zmc2V0IGNvbXBvbmVudCB0byAwLTFcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gbWF0cml4IC0gNXg0IG1hdHJpeFxuICAgICAqIEByZXR1cm4ge251bWJlcltdfSA1eDQgbWF0cml4IHdpdGggYWxsIHZhbHVlcyBiZXR3ZWVuIDAtMVxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5fY29sb3JNYXRyaXggPSBmdW5jdGlvbiBfY29sb3JNYXRyaXggKG1hdHJpeClcbiAgICB7XG4gICAgICAgIC8vIENyZWF0ZSBhIEZsb2F0MzIgQXJyYXkgYW5kIG5vcm1hbGl6ZSB0aGUgb2Zmc2V0IGNvbXBvbmVudCB0byAwLTFcbiAgICAgICAgdmFyIG0gPSBuZXcgRmxvYXQzMkFycmF5KG1hdHJpeCk7XG5cbiAgICAgICAgbVs0XSAvPSAyNTU7XG4gICAgICAgIG1bOV0gLz0gMjU1O1xuICAgICAgICBtWzE0XSAvPSAyNTU7XG4gICAgICAgIG1bMTldIC89IDI1NTtcblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRqdXN0cyBicmlnaHRuZXNzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYiAtIHZhbHVlIG9mIHRoZSBicmlndGhuZXNzICgwLTEsIHdoZXJlIDAgaXMgYmxhY2spXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLmJyaWdodG5lc3MgPSBmdW5jdGlvbiBicmlnaHRuZXNzIChiLCBtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICBiLCAwLCAwLCAwLCAwLFxuICAgICAgICAgICAgMCwgYiwgMCwgMCwgMCxcbiAgICAgICAgICAgIDAsIDAsIGIsIDAsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXRyaWNlcyBpbiBncmV5IHNjYWxlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlIC0gdmFsdWUgb2YgdGhlIGdyZXkgKDAtMSwgd2hlcmUgMCBpcyBibGFjaylcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuZ3JleXNjYWxlID0gZnVuY3Rpb24gZ3JleXNjYWxlIChzY2FsZSwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgc2NhbGUsIHNjYWxlLCBzY2FsZSwgMCwgMCxcbiAgICAgICAgICAgIHNjYWxlLCBzY2FsZSwgc2NhbGUsIDAsIDAsXG4gICAgICAgICAgICBzY2FsZSwgc2NhbGUsIHNjYWxlLCAwLCAwLFxuICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCBdO1xuXG4gICAgICAgIHRoaXMuX2xvYWRNYXRyaXgobWF0cml4LCBtdWx0aXBseSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgYmxhY2sgYW5kIHdoaXRlIG1hdHJpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuYmxhY2tBbmRXaGl0ZSA9IGZ1bmN0aW9uIGJsYWNrQW5kV2hpdGUgKG11bHRpcGx5KVxuICAgIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IFtcbiAgICAgICAgICAgIDAuMywgMC42LCAwLjEsIDAsIDAsXG4gICAgICAgICAgICAwLjMsIDAuNiwgMC4xLCAwLCAwLFxuICAgICAgICAgICAgMC4zLCAwLjYsIDAuMSwgMCwgMCxcbiAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgbXVsdGlwbHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGh1ZSBwcm9wZXJ0eSBvZiB0aGUgY29sb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIGluIGRlZ3JlZXNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuaHVlID0gZnVuY3Rpb24gaHVlIChyb3RhdGlvbiwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICByb3RhdGlvbiA9IChyb3RhdGlvbiB8fCAwKSAvIDE4MCAqIE1hdGguUEk7XG5cbiAgICAgICAgdmFyIGNvc1IgPSBNYXRoLmNvcyhyb3RhdGlvbik7XG4gICAgICAgIHZhciBzaW5SID0gTWF0aC5zaW4ocm90YXRpb24pO1xuICAgICAgICB2YXIgc3FydCA9IE1hdGguc3FydDtcblxuICAgICAgICAvKiBhIGdvb2QgYXBwcm94aW1hdGlvbiBmb3IgaHVlIHJvdGF0aW9uXG4gICAgICAgICBUaGlzIG1hdHJpeCBpcyBmYXIgYmV0dGVyIHRoYW4gdGhlIHZlcnNpb25zIHdpdGggbWFnaWMgbHVtaW5hbmNlIGNvbnN0YW50c1xuICAgICAgICAgZm9ybWVybHkgdXNlZCBoZXJlLCBidXQgYWxzbyB1c2VkIGluIHRoZSBzdGFybGluZyBmcmFtZXdvcmsgKGZsYXNoKSBhbmQga25vd24gZnJvbSB0aGlzXG4gICAgICAgICBvbGQgcGFydCBvZiB0aGUgaW50ZXJuZXQ6IHF1YXNpbW9uZG8uY29tL2FyY2hpdmVzLzAwMDU2NS5waHBcblxuICAgICAgICAgVGhpcyBuZXcgbWF0cml4IGlzIGJhc2VkIG9uIHJnYiBjdWJlIHJvdGF0aW9uIGluIHNwYWNlLiBMb29rIGhlcmUgZm9yIGEgbW9yZSBkZXNjcmlwdGl2ZVxuICAgICAgICAgaW1wbGVtZW50YXRpb24gYXMgYSBzaGFkZXIgbm90IGEgZ2VuZXJhbCBtYXRyaXg6XG4gICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvZ2xmeC5qcy9ibG9iLzU4ODQxYzIzOTE5YmQ1OTc4N2VmZmMwMzMzYTQ4OTdiNDM4MzU0MTIvc3JjL2ZpbHRlcnMvYWRqdXN0L2h1ZXNhdHVyYXRpb24uanNcblxuICAgICAgICAgVGhpcyBpcyB0aGUgc291cmNlIGZvciB0aGUgY29kZTpcbiAgICAgICAgIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg1MDc4ODUvc2hpZnQtaHVlLW9mLWFuLXJnYi1jb2xvci84NTEwNzUxIzg1MTA3NTFcbiAgICAgICAgICovXG5cbiAgICAgICAgdmFyIHcgPSAxIC8gMztcbiAgICAgICAgdmFyIHNxclcgPSBzcXJ0KHcpOyAvLyB3ZWlnaHQgaXNcblxuICAgICAgICB2YXIgYTAwID0gY29zUiArICgoMS4wIC0gY29zUikgKiB3KTtcbiAgICAgICAgdmFyIGEwMSA9ICh3ICogKDEuMCAtIGNvc1IpKSAtIChzcXJXICogc2luUik7XG4gICAgICAgIHZhciBhMDIgPSAodyAqICgxLjAgLSBjb3NSKSkgKyAoc3FyVyAqIHNpblIpO1xuXG4gICAgICAgIHZhciBhMTAgPSAodyAqICgxLjAgLSBjb3NSKSkgKyAoc3FyVyAqIHNpblIpO1xuICAgICAgICB2YXIgYTExID0gY29zUiArICh3ICogKDEuMCAtIGNvc1IpKTtcbiAgICAgICAgdmFyIGExMiA9ICh3ICogKDEuMCAtIGNvc1IpKSAtIChzcXJXICogc2luUik7XG5cbiAgICAgICAgdmFyIGEyMCA9ICh3ICogKDEuMCAtIGNvc1IpKSAtIChzcXJXICogc2luUik7XG4gICAgICAgIHZhciBhMjEgPSAodyAqICgxLjAgLSBjb3NSKSkgKyAoc3FyVyAqIHNpblIpO1xuICAgICAgICB2YXIgYTIyID0gY29zUiArICh3ICogKDEuMCAtIGNvc1IpKTtcblxuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgYTAwLCBhMDEsIGEwMiwgMCwgMCxcbiAgICAgICAgICAgIGExMCwgYTExLCBhMTIsIDAsIDAsXG4gICAgICAgICAgICBhMjAsIGEyMSwgYTIyLCAwLCAwLFxuICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCBdO1xuXG4gICAgICAgIHRoaXMuX2xvYWRNYXRyaXgobWF0cml4LCBtdWx0aXBseSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY29udHJhc3QgbWF0cml4LCBpbmNyZWFzZSB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGRhcmsgYW5kIGJyaWdodFxuICAgICAqIEluY3JlYXNlIGNvbnRyYXN0IDogc2hhZG93cyBkYXJrZXIgYW5kIGhpZ2hsaWdodHMgYnJpZ2h0ZXJcbiAgICAgKiBEZWNyZWFzZSBjb250cmFzdCA6IGJyaW5nIHRoZSBzaGFkb3dzIHVwIGFuZCB0aGUgaGlnaGxpZ2h0cyBkb3duXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IC0gdmFsdWUgb2YgdGhlIGNvbnRyYXN0ICgwLTEpXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLmNvbnRyYXN0ID0gZnVuY3Rpb24gY29udHJhc3QgKGFtb3VudCwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICB2YXIgdiA9IChhbW91bnQgfHwgMCkgKyAxO1xuICAgICAgICB2YXIgbyA9IC0wLjUgKiAodiAtIDEpO1xuXG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICB2LCAwLCAwLCAwLCBvLFxuICAgICAgICAgICAgMCwgdiwgMCwgMCwgbyxcbiAgICAgICAgICAgIDAsIDAsIHYsIDAsIG8sXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzYXR1cmF0aW9uIG1hdHJpeCwgaW5jcmVhc2UgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBjb2xvcnNcbiAgICAgKiBJbmNyZWFzZSBzYXR1cmF0aW9uIDogaW5jcmVhc2UgY29udHJhc3QsIGJyaWdodG5lc3MsIGFuZCBzaGFycG5lc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgLSBUaGUgc2F0dXJhdGlvbiBhbW91bnQgKDAtMSlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuc2F0dXJhdGUgPSBmdW5jdGlvbiBzYXR1cmF0ZSAoYW1vdW50LCBtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIGlmICggYW1vdW50ID09PSB2b2lkIDAgKSBhbW91bnQgPSAwO1xuXG4gICAgICAgIHZhciB4ID0gKGFtb3VudCAqIDIgLyAzKSArIDE7XG4gICAgICAgIHZhciB5ID0gKCh4IC0gMSkgKiAtMC41KTtcblxuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgeCwgeSwgeSwgMCwgMCxcbiAgICAgICAgICAgIHksIHgsIHksIDAsIDAsXG4gICAgICAgICAgICB5LCB5LCB4LCAwLCAwLFxuICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCBdO1xuXG4gICAgICAgIHRoaXMuX2xvYWRNYXRyaXgobWF0cml4LCBtdWx0aXBseSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERlc2F0dXJhdGUgaW1hZ2UgKHJlbW92ZSBjb2xvcilcbiAgICAgKlxuICAgICAqIENhbGwgdGhlIHNhdHVyYXRlIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUuZGVzYXR1cmF0ZSA9IGZ1bmN0aW9uIGRlc2F0dXJhdGUgKCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHtcbiAgICAgICAgdGhpcy5zYXR1cmF0ZSgtMSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5lZ2F0aXZlIGltYWdlIChpbnZlcnNlIG9mIGNsYXNzaWMgcmdiIG1hdHJpeClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5uZWdhdGl2ZSA9IGZ1bmN0aW9uIG5lZ2F0aXZlIChtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAtMSwgMCwgMCwgMSwgMCxcbiAgICAgICAgICAgIDAsIC0xLCAwLCAxLCAwLFxuICAgICAgICAgICAgMCwgMCwgLTEsIDEsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2VwaWEgaW1hZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5zZXBpYSA9IGZ1bmN0aW9uIHNlcGlhIChtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAwLjM5MywgMC43Njg5OTk5LCAwLjE4ODk5OTk5LCAwLCAwLFxuICAgICAgICAgICAgMC4zNDksIDAuNjg1OTk5OSwgMC4xNjc5OTk5OSwgMCwgMCxcbiAgICAgICAgICAgIDAuMjcyLCAwLjUzMzk5OTksIDAuMTMwOTk5OTksIDAsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29sb3IgbW90aW9uIHBpY3R1cmUgcHJvY2VzcyBpbnZlbnRlZCBpbiAxOTE2ICh0aGFua3MgRG9taW5pYyBTemFibGV3c2tpKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLnRlY2huaWNvbG9yID0gZnVuY3Rpb24gdGVjaG5pY29sb3IgKG11bHRpcGx5KVxuICAgIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IFtcbiAgICAgICAgICAgIDEuOTEyNTI3Nzg5MTQ1NjA4MywgLTAuODU0NTM0NDk3Njk1MTY0NSwgLTAuMDkxNTU1MDg0ODI3NTU1ODUsIDAsIDExLjc5MzYwMzQzNDM3NzMzNyxcbiAgICAgICAgICAgIC0wLjMwODc4MzMzODU5MjgwOTcsIDEuNzY1ODkwODU1NTQ1ODQyOCwgLTAuMTA2MDE3NDMwNzQ3MjIyNDUsIDAsIC03MC4zNTIwNTE2MTQ2MTM5OCxcbiAgICAgICAgICAgIC0wLjIzMTEwMzM3NzU0ODYxNiwgLTAuNzUwMTg5OTE5NzQ0MDIxMiwgMS44NDc1OTc4MTYxMDgxODksIDAsIDMwLjk1MDk0MDg2OTQ5MTEzOCxcbiAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgbXVsdGlwbHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQb2xhcm9pZCBmaWx0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5wb2xhcm9pZCA9IGZ1bmN0aW9uIHBvbGFyb2lkIChtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAxLjQzOCwgLTAuMDYyLCAtMC4wNjIsIDAsIDAsXG4gICAgICAgICAgICAtMC4xMjIsIDEuMzc4LCAtMC4xMjIsIDAsIDAsXG4gICAgICAgICAgICAtMC4wMTYsIC0wLjAxNiwgMS40ODMsIDAsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIHdobyB0cmFuc2Zvcm1zIDogUmVkIC0+IEJsdWUgYW5kIEJsdWUgLT4gUmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUudG9CR1IgPSBmdW5jdGlvbiB0b0JHUiAobXVsdGlwbHkpXG4gICAge1xuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgMCwgMCwgMSwgMCwgMCxcbiAgICAgICAgICAgIDAsIDEsIDAsIDAsIDAsXG4gICAgICAgICAgICAxLCAwLCAwLCAwLCAwLFxuICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCBdO1xuXG4gICAgICAgIHRoaXMuX2xvYWRNYXRyaXgobWF0cml4LCBtdWx0aXBseSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbG9yIHJldmVyc2FsIGZpbG0gaW50cm9kdWNlZCBieSBFYXN0bWFuIEtvZGFrIGluIDE5MzUuICh0aGFua3MgRG9taW5pYyBTemFibGV3c2tpKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLmtvZGFjaHJvbWUgPSBmdW5jdGlvbiBrb2RhY2hyb21lIChtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAxLjEyODU1ODIzOTY1OTM1MjUsIC0wLjM5NjczODIyODM2MDEzNDgsIC0wLjAzOTkyNTU5MTcyOTIxNzkzLCAwLCA2My43Mjk1ODc2MjE5NjUwMixcbiAgICAgICAgICAgIC0wLjE2NDA0MzM5OTYyMjQ0NjE2LCAxLjA4MzUyNTE1NjYyOTEzMDQsIC0wLjA1NDk4ODA1MTE1NjMzMTMyLCAwLCAyNC43MzI0MDc4OTY3MDYyMDMsXG4gICAgICAgICAgICAtMC4xNjc4NjAxMDcwNjE1NTc2MywgLTAuNTYwMzQxNjI3NzY5NTI0OCwgMS42MDE0ODUwNzYxOTY0OTQzLCAwLCAzNS42Mjk4MjgwNzQ2MDk0NixcbiAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgbXVsdGlwbHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBCcm93biBkZWxpY2lvdXMgYnJvd25pIGZpbHRlciAodGhhbmtzIERvbWluaWMgU3phYmxld3NraSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5icm93bmkgPSBmdW5jdGlvbiBicm93bmkgKG11bHRpcGx5KVxuICAgIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IFtcbiAgICAgICAgICAgIDAuNTk5NzAyMzQ5ODE1OTcxNSwgMC4zNDU1MzI0MzA0ODM5MTI2MywgLTAuMjcwODI5ODY3NDUzODA0MiwgMCwgNDcuNDMxOTI4NTU2MDA4NzMsXG4gICAgICAgICAgICAtMC4wMzc3MDMyNDk4Mzc3ODMxNTcsIDAuODYwOTU3NzU4Nzk5MjY0MSwgMC4xNTA1OTU1MjM4ODQ1OTkxMywgMCwgLTM2Ljk2ODQxNDk4MzE5MTI3LFxuICAgICAgICAgICAgMC4yNDExMzYzNTEyODE1MzMzNSwgLTAuMDc0NDEwMzc5MDg0MjI0OTIsIDAuNDQ5NzIxODIwNjQ4NzcxNTMsIDAsIC03LjU2MjA3NTI3NzU5MTI4MyxcbiAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgbXVsdGlwbHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWaW50YWdlIGZpbHRlciAodGhhbmtzIERvbWluaWMgU3phYmxld3NraSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS52aW50YWdlID0gZnVuY3Rpb24gdmludGFnZSAobXVsdGlwbHkpXG4gICAge1xuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgMC42Mjc5MzQ1NjM1NjA1OTk0LCAwLjMyMDIxODM0MjA4MTkzNjcsIC0wLjAzOTY1NDA4MjExMzEyNDUzLCAwLCA5LjY1MTI4NTgzNTI5NDEyMyxcbiAgICAgICAgICAgIDAuMDI1NzgzOTc3MDQ4MDg4NjgsIDAuNjQ0MTE4ODY0NDM3NDc3MSwgMC4wMzI1OTEyNzYxNjE0OTI5NCwgMCwgNy40NjI4MjkxNzY0NzA1OTEsXG4gICAgICAgICAgICAwLjA0NjYwNTU1NTY3ODI3MTksIC0wLjA4NTEyMzI5ODcyNDc4OTEsIDAuNTI0MTY0ODAxODcwMDQ2NSwgMCwgNS4xNTkxOTA1ODgyMzUyOTYsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQgaXQgZG9lcywga2luZCBvZiBncmFkaWVudCBtYXAsIGJ1dCBmdW5ueSB0byBwbGF5IHdpdGghXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVzYXR1cmF0aW9uIC0gVG9uZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvbmVkIC0gVG9uZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxpZ2h0Q29sb3IgLSBUb25lIHZhbHVlcywgZXhhbXBsZTogYDB4RkZFNTgwYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXJrQ29sb3IgLSBUb25lIHZhbHVlcywgZXhhbXBsZTogYDB4RkZFNTgwYFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbHkgLSBpZiB0cnVlLCBjdXJyZW50IG1hdHJpeCBhbmQgbWF0cml4IGFyZSBtdWx0aXBsaWVkLiBJZiBmYWxzZSxcbiAgICAgKiAganVzdCBzZXQgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggQHBhcmFtIG1hdHJpeFxuICAgICAqL1xuICAgIENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5jb2xvclRvbmUgPSBmdW5jdGlvbiBjb2xvclRvbmUgKGRlc2F0dXJhdGlvbiwgdG9uZWQsIGxpZ2h0Q29sb3IsIGRhcmtDb2xvciwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICBkZXNhdHVyYXRpb24gPSBkZXNhdHVyYXRpb24gfHwgMC4yO1xuICAgICAgICB0b25lZCA9IHRvbmVkIHx8IDAuMTU7XG4gICAgICAgIGxpZ2h0Q29sb3IgPSBsaWdodENvbG9yIHx8IDB4RkZFNTgwO1xuICAgICAgICBkYXJrQ29sb3IgPSBkYXJrQ29sb3IgfHwgMHgzMzgwMDA7XG5cbiAgICAgICAgdmFyIGxSID0gKChsaWdodENvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1O1xuICAgICAgICB2YXIgbEcgPSAoKGxpZ2h0Q29sb3IgPj4gOCkgJiAweEZGKSAvIDI1NTtcbiAgICAgICAgdmFyIGxCID0gKGxpZ2h0Q29sb3IgJiAweEZGKSAvIDI1NTtcblxuICAgICAgICB2YXIgZFIgPSAoKGRhcmtDb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NTtcbiAgICAgICAgdmFyIGRHID0gKChkYXJrQ29sb3IgPj4gOCkgJiAweEZGKSAvIDI1NTtcbiAgICAgICAgdmFyIGRCID0gKGRhcmtDb2xvciAmIDB4RkYpIC8gMjU1O1xuXG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAwLjMsIDAuNTksIDAuMTEsIDAsIDAsXG4gICAgICAgICAgICBsUiwgbEcsIGxCLCBkZXNhdHVyYXRpb24sIDAsXG4gICAgICAgICAgICBkUiwgZEcsIGRCLCB0b25lZCwgMCxcbiAgICAgICAgICAgIGxSIC0gZFIsIGxHIC0gZEcsIGxCIC0gZEIsIDAsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgbXVsdGlwbHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOaWdodCBlZmZlY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbnNpdHkgLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBuaWdodCBlZmZlY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLm5pZ2h0ID0gZnVuY3Rpb24gbmlnaHQgKGludGVuc2l0eSwgbXVsdGlwbHkpXG4gICAge1xuICAgICAgICBpbnRlbnNpdHkgPSBpbnRlbnNpdHkgfHwgMC4xO1xuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgaW50ZW5zaXR5ICogKC0yLjApLCAtaW50ZW5zaXR5LCAwLCAwLCAwLFxuICAgICAgICAgICAgLWludGVuc2l0eSwgMCwgaW50ZW5zaXR5LCAwLCAwLFxuICAgICAgICAgICAgMCwgaW50ZW5zaXR5LCBpbnRlbnNpdHkgKiAyLjAsIDAsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlZGF0b3IgZWZmZWN0XG4gICAgICpcbiAgICAgKiBFcmFzZSB0aGUgY3VycmVudCBtYXRyaXggYnkgc2V0dGluZyBhIG5ldyBpbmRlcGVudCBvbmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgLSBob3cgbXVjaCB0aGUgcHJlZGF0b3IgZmVlbHMgaGlzIGZ1dHVyZSB2aWN0aW1cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGx5IC0gaWYgdHJ1ZSwgY3VycmVudCBtYXRyaXggYW5kIG1hdHJpeCBhcmUgbXVsdGlwbGllZC4gSWYgZmFsc2UsXG4gICAgICogIGp1c3Qgc2V0IHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIEBwYXJhbSBtYXRyaXhcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUucHJlZGF0b3IgPSBmdW5jdGlvbiBwcmVkYXRvciAoYW1vdW50LCBtdWx0aXBseSlcbiAgICB7XG4gICAgICAgIHZhciBtYXRyaXggPSBbXG4gICAgICAgICAgICAvLyByb3cgMVxuICAgICAgICAgICAgMTEuMjI0MTMwNjMwNDkzMTY0ICogYW1vdW50LFxuICAgICAgICAgICAgLTQuNzk0NDg2OTk5NTExNzE5ICogYW1vdW50LFxuICAgICAgICAgICAgLTIuODc0NjExODU0NTUzMjIyNyAqIGFtb3VudCxcbiAgICAgICAgICAgIDAgKiBhbW91bnQsXG4gICAgICAgICAgICAwLjQwMzQyNDM4MjIwOTc3NzgzICogYW1vdW50LFxuICAgICAgICAgICAgLy8gcm93IDJcbiAgICAgICAgICAgIC0zLjYzMzA2OTc1MzY0Njg1MDYgKiBhbW91bnQsXG4gICAgICAgICAgICA5LjE5MzE1NzE5NjA0NDkyMiAqIGFtb3VudCxcbiAgICAgICAgICAgIC0yLjk1MTgxMDgzNjc5MTk5MiAqIGFtb3VudCxcbiAgICAgICAgICAgIDAgKiBhbW91bnQsXG4gICAgICAgICAgICAtMS4zMTYxMzUwNDg4NjYyNzIgKiBhbW91bnQsXG4gICAgICAgICAgICAvLyByb3cgM1xuICAgICAgICAgICAgLTMuMjE4NDE5NzkwMjY3OTQ0MyAqIGFtb3VudCxcbiAgICAgICAgICAgIC00LjIzNzUwMzA1MTc1NzgxMjUgKiBhbW91bnQsXG4gICAgICAgICAgICA3LjQ3NjQ0ODA1OTA4MjAzMSAqIGFtb3VudCxcbiAgICAgICAgICAgIDAgKiBhbW91bnQsXG4gICAgICAgICAgICAwLjgwNDQ0NTkyMjM3NDcyNTMgKiBhbW91bnQsXG4gICAgICAgICAgICAvLyByb3cgNFxuICAgICAgICAgICAgMCwgMCwgMCwgMSwgMCBdO1xuXG4gICAgICAgIHRoaXMuX2xvYWRNYXRyaXgobWF0cml4LCBtdWx0aXBseSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExTRCBlZmZlY3RcbiAgICAgKlxuICAgICAqIE11bHRpcGx5IHRoZSBjdXJyZW50IG1hdHJpeFxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aXBseSAtIGlmIHRydWUsIGN1cnJlbnQgbWF0cml4IGFuZCBtYXRyaXggYXJlIG11bHRpcGxpZWQuIElmIGZhbHNlLFxuICAgICAqICBqdXN0IHNldCB0aGUgY3VycmVudCBtYXRyaXggd2l0aCBAcGFyYW0gbWF0cml4XG4gICAgICovXG4gICAgQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLmxzZCA9IGZ1bmN0aW9uIGxzZCAobXVsdGlwbHkpXG4gICAge1xuICAgICAgICB2YXIgbWF0cml4ID0gW1xuICAgICAgICAgICAgMiwgLTAuNCwgMC41LCAwLCAwLFxuICAgICAgICAgICAgLTAuNSwgMiwgLTAuNCwgMCwgMCxcbiAgICAgICAgICAgIC0wLjQsIC0wLjUsIDMsIDAsIDAsXG4gICAgICAgICAgICAwLCAwLCAwLCAxLCAwIF07XG5cbiAgICAgICAgdGhpcy5fbG9hZE1hdHJpeChtYXRyaXgsIG11bHRpcGx5KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXJhc2UgdGhlIGN1cnJlbnQgbWF0cml4IGJ5IHNldHRpbmcgdGhlIGRlZmF1bHQgb25lXG4gICAgICpcbiAgICAgKi9cbiAgICBDb2xvck1hdHJpeEZpbHRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCAoKVxuICAgIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IFtcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsXG4gICAgICAgICAgICAwLCAxLCAwLCAwLCAwLFxuICAgICAgICAgICAgMCwgMCwgMSwgMCwgMCxcbiAgICAgICAgICAgIDAsIDAsIDAsIDEsIDAgXTtcblxuICAgICAgICB0aGlzLl9sb2FkTWF0cml4KG1hdHJpeCwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF0cml4IG9mIHRoZSBjb2xvciBtYXRyaXggZmlsdGVyXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtudW1iZXJbXX1cbiAgICAgKiBAZGVmYXVsdCBbMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMF1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWF0cml4LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5tO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWF0cml4LnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLm0gPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wYWNpdHkgdmFsdWUgdG8gdXNlIHdoZW4gbWl4aW5nIHRoZSBvcmlnaW5hbCBhbmQgcmVzdWx0YW50IGNvbG9ycy5cbiAgICAgKlxuICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIDAsIHRoZSBvcmlnaW5hbCBjb2xvciBpcyB1c2VkIHdpdGhvdXQgbW9kaWZpY2F0aW9uLlxuICAgICAqIFdoZW4gdGhlIHZhbHVlIGlzIDEsIHRoZSByZXN1bHQgY29sb3IgaXMgdXNlZC5cbiAgICAgKiBXaGVuIGluIHRoZSByYW5nZSAoMCwgMSkgdGhlIGNvbG9yIGlzIGludGVycG9sYXRlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBhbmQgcmVzdWx0IGJ5IHRoaXMgYW1vdW50LlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMuYWxwaGEuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuaWZvcm1zLnVBbHBoYTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmFscGhhLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLnVBbHBoYSA9IHZhbHVlO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBDb2xvck1hdHJpeEZpbHRlcjtcbn0oRmlsdGVyKSk7XG5cbi8vIEFtZXJpY2FuaXplZCBhbGlhc1xuQ29sb3JNYXRyaXhGaWx0ZXIucHJvdG90eXBlLmdyYXlzY2FsZSA9IENvbG9yTWF0cml4RmlsdGVyLnByb3RvdHlwZS5ncmV5c2NhbGU7XG5cbmV4cG9ydCB7IENvbG9yTWF0cml4RmlsdGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWx0ZXItY29sb3ItbWF0cml4LmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9maWx0ZXItZGlzcGxhY2VtZW50IC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL2ZpbHRlci1kaXNwbGFjZW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IE1hdHJpeCwgUG9pbnQgfSBmcm9tICdAcGl4aS9tYXRoJztcblxudmFyIHZlcnRleCA9IFwiYXR0cmlidXRlIHZlYzIgYVZlcnRleFBvc2l0aW9uO1xcblxcbnVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0MyBmaWx0ZXJNYXRyaXg7XFxuXFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxudmFyeWluZyB2ZWMyIHZGaWx0ZXJDb29yZDtcXG5cXG51bmlmb3JtIHZlYzQgaW5wdXRTaXplO1xcbnVuaWZvcm0gdmVjNCBvdXRwdXRGcmFtZTtcXG5cXG52ZWM0IGZpbHRlclZlcnRleFBvc2l0aW9uKCB2b2lkIClcXG57XFxuICAgIHZlYzIgcG9zaXRpb24gPSBhVmVydGV4UG9zaXRpb24gKiBtYXgob3V0cHV0RnJhbWUuencsIHZlYzIoMC4pKSArIG91dHB1dEZyYW1lLnh5O1xcblxcbiAgICByZXR1cm4gdmVjNCgocHJvamVjdGlvbk1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEuMCkpLnh5LCAwLjAsIDEuMCk7XFxufVxcblxcbnZlYzIgZmlsdGVyVGV4dHVyZUNvb3JkKCB2b2lkIClcXG57XFxuICAgIHJldHVybiBhVmVydGV4UG9zaXRpb24gKiAob3V0cHV0RnJhbWUuencgKiBpbnB1dFNpemUuencpO1xcbn1cXG5cXG52b2lkIG1haW4odm9pZClcXG57XFxuXFx0Z2xfUG9zaXRpb24gPSBmaWx0ZXJWZXJ0ZXhQb3NpdGlvbigpO1xcblxcdHZUZXh0dXJlQ29vcmQgPSBmaWx0ZXJUZXh0dXJlQ29vcmQoKTtcXG5cXHR2RmlsdGVyQ29vcmQgPSAoIGZpbHRlck1hdHJpeCAqIHZlYzMoIHZUZXh0dXJlQ29vcmQsIDEuMCkgICkueHk7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMiB2RmlsdGVyQ29vcmQ7XFxudmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XFxuXFxudW5pZm9ybSB2ZWMyIHNjYWxlO1xcbnVuaWZvcm0gbWF0MiByb3RhdGlvbjtcXG51bmlmb3JtIHNhbXBsZXIyRCB1U2FtcGxlcjtcXG51bmlmb3JtIHNhbXBsZXIyRCBtYXBTYW1wbGVyO1xcblxcbnVuaWZvcm0gaGlnaHAgdmVjNCBpbnB1dFNpemU7XFxudW5pZm9ybSB2ZWM0IGlucHV0Q2xhbXA7XFxuXFxudm9pZCBtYWluKHZvaWQpXFxue1xcbiAgdmVjNCBtYXAgPSAgdGV4dHVyZTJEKG1hcFNhbXBsZXIsIHZGaWx0ZXJDb29yZCk7XFxuXFxuICBtYXAgLT0gMC41O1xcbiAgbWFwLnh5ID0gc2NhbGUgKiBpbnB1dFNpemUuencgKiAocm90YXRpb24gKiBtYXAueHkpO1xcblxcbiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVTYW1wbGVyLCBjbGFtcCh2ZWMyKHZUZXh0dXJlQ29vcmQueCArIG1hcC54LCB2VGV4dHVyZUNvb3JkLnkgKyBtYXAueSksIGlucHV0Q2xhbXAueHksIGlucHV0Q2xhbXAuencpKTtcXG59XFxuXCI7XG5cbi8qKlxuICogVGhlIERpc3BsYWNlbWVudEZpbHRlciBjbGFzcyB1c2VzIHRoZSBwaXhlbCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHR1cmVcbiAqIChjYWxsZWQgdGhlIGRpc3BsYWNlbWVudCBtYXApIHRvIHBlcmZvcm0gYSBkaXNwbGFjZW1lbnQgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFlvdSBjYW4gdXNlIHRoaXMgZmlsdGVyIHRvIGFwcGx5IGFsbCBtYW5vciBvZiBjcmF6eSB3YXJwaW5nIGVmZmVjdHMuXG4gKiBDdXJyZW50bHkgdGhlIGByYCBwcm9wZXJ0eSBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkIHRvIG9mZnNldCB0aGUgYHhgXG4gKiBhbmQgdGhlIGBnYCBwcm9wZXJ0eSBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkIHRvIG9mZnNldCB0aGUgYHlgLlxuICpcbiAqIFRoZSB3YXkgaXQgd29ya3MgaXMgaXQgdXNlcyB0aGUgdmFsdWVzIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwIHRvIGxvb2sgdXAgdGhlXG4gKiBjb3JyZWN0IHBpeGVscyB0byBvdXRwdXQuIFRoaXMgbWVhbnMgaXQncyBub3QgdGVjaG5pY2FsbHkgbW92aW5nIHRoZSBvcmlnaW5hbC5cbiAqIEluc3RlYWQsIGl0J3Mgc3RhcnRpbmcgYXQgdGhlIG91dHB1dCBhbmQgYXNraW5nIFwid2hpY2ggcGl4ZWwgZnJvbSB0aGUgb3JpZ2luYWwgZ29lcyBoZXJlXCIuXG4gKiBGb3IgZXhhbXBsZSwgaWYgYSBkaXNwbGFjZW1lbnQgbWFwIHBpeGVsIGhhcyBgcmVkID0gMWAgYW5kIHRoZSBmaWx0ZXIgc2NhbGUgaXMgYDIwYCxcbiAqIHRoaXMgZmlsdGVyIHdpbGwgb3V0cHV0IHRoZSBwaXhlbCBhcHByb3hpbWF0ZWx5IDIwIHBpeGVscyB0byB0aGUgcmlnaHQgb2YgdGhlIG9yaWdpbmFsLlxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5GaWx0ZXJcbiAqIEBtZW1iZXJvZiBQSVhJLmZpbHRlcnNcbiAqL1xudmFyIERpc3BsYWNlbWVudEZpbHRlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEZpbHRlcikge1xuICAgIGZ1bmN0aW9uIERpc3BsYWNlbWVudEZpbHRlcihzcHJpdGUsIHNjYWxlKVxuICAgIHtcbiAgICAgICAgdmFyIG1hc2tNYXRyaXggPSBuZXcgTWF0cml4KCk7XG5cbiAgICAgICAgc3ByaXRlLnJlbmRlcmFibGUgPSBmYWxzZTtcblxuICAgICAgICBGaWx0ZXIuY2FsbCh0aGlzLCB2ZXJ0ZXgsIGZyYWdtZW50LCB7XG4gICAgICAgICAgICBtYXBTYW1wbGVyOiBzcHJpdGUuX3RleHR1cmUsXG4gICAgICAgICAgICBmaWx0ZXJNYXRyaXg6IG1hc2tNYXRyaXgsXG4gICAgICAgICAgICBzY2FsZTogeyB4OiAxLCB5OiAxIH0sXG4gICAgICAgICAgICByb3RhdGlvbjogbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMV0pLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1hc2tTcHJpdGUgPSBzcHJpdGU7XG4gICAgICAgIHRoaXMubWFza01hdHJpeCA9IG1hc2tNYXRyaXg7XG5cbiAgICAgICAgaWYgKHNjYWxlID09PSBudWxsIHx8IHNjYWxlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNjYWxlID0gMjA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogc2NhbGVYLCBzY2FsZVkgZm9yIGRpc3BsYWNlbWVudHNcbiAgICAgICAgICogQG1lbWJlciB7UElYSS5Qb2ludH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2NhbGUgPSBuZXcgUG9pbnQoc2NhbGUsIHNjYWxlKTtcbiAgICB9XG5cbiAgICBpZiAoIEZpbHRlciApIERpc3BsYWNlbWVudEZpbHRlci5fX3Byb3RvX18gPSBGaWx0ZXI7XG4gICAgRGlzcGxhY2VtZW50RmlsdGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEZpbHRlciAmJiBGaWx0ZXIucHJvdG90eXBlICk7XG4gICAgRGlzcGxhY2VtZW50RmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpc3BsYWNlbWVudEZpbHRlcjtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IG1hcDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgZmlsdGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtfSBmaWx0ZXJNYW5hZ2VyIC0gVGhlIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlclRleHR1cmV9IGlucHV0IC0gVGhlIGlucHV0IHRhcmdldC5cbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyVGV4dHVyZX0gb3V0cHV0IC0gVGhlIG91dHB1dCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjbGVhciAtIFNob3VsZCB0aGUgb3V0cHV0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbmRlcmluZyB0byBpdC5cbiAgICAgKi9cbiAgICBEaXNwbGFjZW1lbnRGaWx0ZXIucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gYXBwbHkgKGZpbHRlck1hbmFnZXIsIGlucHV0LCBvdXRwdXQsIGNsZWFyKVxuICAgIHtcbiAgICAgICAgLy8gZmlsbCBtYXNrTWF0cml4IHdpdGggX25vcm1hbGl6ZWQgc3ByaXRlIHRleHR1cmUgY29vcmRzX1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmZpbHRlck1hdHJpeCA9IGZpbHRlck1hbmFnZXIuY2FsY3VsYXRlU3ByaXRlTWF0cml4KHRoaXMubWFza01hdHJpeCwgdGhpcy5tYXNrU3ByaXRlKTtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5zY2FsZS54ID0gdGhpcy5zY2FsZS54O1xuICAgICAgICB0aGlzLnVuaWZvcm1zLnNjYWxlLnkgPSB0aGlzLnNjYWxlLnk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCByb3RhdGlvbiBmcm9tIHdvcmxkIHRyYW5zZm9ybVxuICAgICAgICB2YXIgd3QgPSB0aGlzLm1hc2tTcHJpdGUudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtO1xuICAgICAgICB2YXIgbGVuWCA9IE1hdGguc3FydCgod3QuYSAqIHd0LmEpICsgKHd0LmIgKiB3dC5iKSk7XG4gICAgICAgIHZhciBsZW5ZID0gTWF0aC5zcXJ0KCh3dC5jICogd3QuYykgKyAod3QuZCAqIHd0LmQpKTtcblxuICAgICAgICBpZiAobGVuWCAhPT0gMCAmJiBsZW5ZICE9PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1zLnJvdGF0aW9uWzBdID0gd3QuYSAvIGxlblg7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1zLnJvdGF0aW9uWzFdID0gd3QuYiAvIGxlblg7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1zLnJvdGF0aW9uWzJdID0gd3QuYyAvIGxlblk7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm1zLnJvdGF0aW9uWzNdID0gd3QuZCAvIGxlblk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkcmF3IHRoZSBmaWx0ZXIuLi5cbiAgICAgICAgZmlsdGVyTWFuYWdlci5hcHBseUZpbHRlcih0aGlzLCBpbnB1dCwgb3V0cHV0LCBjbGVhcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0dXJlIHVzZWQgZm9yIHRoZSBkaXNwbGFjZW1lbnQgbWFwLiBNdXN0IGJlIHBvd2VyIG9mIDIgc2l6ZWQgdGV4dHVyZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge1BJWEkuVGV4dHVyZX1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWFwLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5tYXBTYW1wbGVyO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWFwLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLm1hcFNhbXBsZXIgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIERpc3BsYWNlbWVudEZpbHRlci5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG4gICAgcmV0dXJuIERpc3BsYWNlbWVudEZpbHRlcjtcbn0oRmlsdGVyKSk7XG5cbmV4cG9ydCB7IERpc3BsYWNlbWVudEZpbHRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsdGVyLWRpc3BsYWNlbWVudC5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvbWl4aW4tY2FjaGUtYXMtYml0bWFwIC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL21peGluLWNhY2hlLWFzLWJpdG1hcCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IFJlbmRlclRleHR1cmUsIEJhc2VUZXh0dXJlLCBUZXh0dXJlIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5pbXBvcnQgeyBTcHJpdGUgfSBmcm9tICdAcGl4aS9zcHJpdGUnO1xuaW1wb3J0IHsgRGlzcGxheU9iamVjdCB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuaW1wb3J0IHsgTWF0cml4IH0gZnJvbSAnQHBpeGkvbWF0aCc7XG5pbXBvcnQgeyB1aWQgfSBmcm9tICdAcGl4aS91dGlscyc7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gJ0BwaXhpL3NldHRpbmdzJztcblxudmFyIF90ZW1wTWF0cml4ID0gbmV3IE1hdHJpeCgpO1xuXG5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5fY2FjaGVBc0JpdG1hcCA9IGZhbHNlO1xuRGlzcGxheU9iamVjdC5wcm90b3R5cGUuX2NhY2hlRGF0YSA9IGZhbHNlO1xuXG4vLyBmaWd1cmVkIHRoZXJlcyBubyBwb2ludCBhZGRpbmcgQUxMIHRoZSBleHRyYSB2YXJpYWJsZXMgdG8gcHJvdG90eXBlLlxuLy8gdGhpcyBtb2RlbCBjYW4gaG9sZCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBvbiBkZW1hbmQgYXNcbi8vIG1vc3Qgb2JqZWN0cyBhcmUgbm90IGNhY2hlZCBhcyBiaXRtYXBzLlxuLyoqXG4gKiBAY2xhc3NcbiAqIEBpZ25vcmVcbiAqL1xudmFyIENhY2hlRGF0YSA9IGZ1bmN0aW9uIENhY2hlRGF0YSgpXG57XG4gICAgdGhpcy50ZXh0dXJlQ2FjaGVJZCA9IG51bGw7XG5cbiAgICB0aGlzLm9yaWdpbmFsUmVuZGVyID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpbmFsUmVuZGVyQ2FudmFzID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpbmFsQ2FsY3VsYXRlQm91bmRzID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpbmFsR2V0TG9jYWxCb3VuZHMgPSBudWxsO1xuXG4gICAgdGhpcy5vcmlnaW5hbFVwZGF0ZVRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5hbEhpdFRlc3QgPSBudWxsO1xuICAgIHRoaXMub3JpZ2luYWxEZXN0cm95ID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpbmFsTWFzayA9IG51bGw7XG4gICAgdGhpcy5vcmlnaW5hbEZpbHRlckFyZWEgPSBudWxsO1xuICAgIHRoaXMuc3ByaXRlID0gbnVsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERpc3BsYXlPYmplY3QucHJvdG90eXBlLCB7XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGlzIGRpc3BsYXkgb2JqZWN0IHRvIGJlIGNhY2hlZCBhcyBhIGJpdG1hcC5cbiAgICAgKiBUaGlzIGJhc2ljYWxseSB0YWtlcyBhIHNuYXAgc2hvdCBvZiB0aGUgZGlzcGxheSBvYmplY3QgYXMgaXQgaXMgYXQgdGhhdCBtb21lbnQuIEl0IGNhblxuICAgICAqIHByb3ZpZGUgYSBwZXJmb3JtYW5jZSBiZW5lZml0IGZvciBjb21wbGV4IHN0YXRpYyBkaXNwbGF5T2JqZWN0cy5cbiAgICAgKiBUbyByZW1vdmUgc2ltcGx5IHNldCB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWBcbiAgICAgKlxuICAgICAqIElNUE9SVEFOVCBHT1RDSEEgLSBNYWtlIHN1cmUgdGhhdCBhbGwgeW91ciB0ZXh0dXJlcyBhcmUgcHJlbG9hZGVkIEJFRk9SRSBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gdHJ1ZVxuICAgICAqIGFzIGl0IHdpbGwgdGFrZSBhIHNuYXBzaG90IG9mIHdoYXQgaXMgY3VycmVudGx5IHRoZXJlLiBJZiB0aGUgdGV4dHVyZXMgaGF2ZSBub3QgbG9hZGVkIHRoZW4gdGhleSB3aWxsIG5vdCBhcHBlYXIuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gICAgICovXG4gICAgY2FjaGVBc0JpdG1hcDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUFzQml0bWFwO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlQXNCaXRtYXAgPT09IHZhbHVlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2FjaGVBc0JpdG1hcCA9IHZhbHVlO1xuXG4gICAgICAgICAgICB2YXIgZGF0YTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVEYXRhKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVEYXRhID0gbmV3IENhY2hlRGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9jYWNoZURhdGE7XG5cbiAgICAgICAgICAgICAgICBkYXRhLm9yaWdpbmFsUmVuZGVyID0gdGhpcy5yZW5kZXI7XG4gICAgICAgICAgICAgICAgZGF0YS5vcmlnaW5hbFJlbmRlckNhbnZhcyA9IHRoaXMucmVuZGVyQ2FudmFzO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5vcmlnaW5hbFVwZGF0ZVRyYW5zZm9ybSA9IHRoaXMudXBkYXRlVHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgIGRhdGEub3JpZ2luYWxDYWxjdWxhdGVCb3VuZHMgPSB0aGlzLmNhbGN1bGF0ZUJvdW5kcztcbiAgICAgICAgICAgICAgICBkYXRhLm9yaWdpbmFsR2V0TG9jYWxCb3VuZHMgPSB0aGlzLmdldExvY2FsQm91bmRzO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5vcmlnaW5hbERlc3Ryb3kgPSB0aGlzLmRlc3Ryb3k7XG5cbiAgICAgICAgICAgICAgICBkYXRhLm9yaWdpbmFsQ29udGFpbnNQb2ludCA9IHRoaXMuY29udGFpbnNQb2ludDtcblxuICAgICAgICAgICAgICAgIGRhdGEub3JpZ2luYWxNYXNrID0gdGhpcy5fbWFzaztcbiAgICAgICAgICAgICAgICBkYXRhLm9yaWdpbmFsRmlsdGVyQXJlYSA9IHRoaXMuZmlsdGVyQXJlYTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyID0gdGhpcy5fcmVuZGVyQ2FjaGVkO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FudmFzID0gdGhpcy5fcmVuZGVyQ2FjaGVkQ2FudmFzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95ID0gdGhpcy5fY2FjaGVBc0JpdG1hcERlc3Ryb3k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2NhY2hlRGF0YTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNwcml0ZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lDYWNoZWREaXNwbGF5T2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIgPSBkYXRhLm9yaWdpbmFsUmVuZGVyO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FudmFzID0gZGF0YS5vcmlnaW5hbFJlbmRlckNhbnZhcztcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUJvdW5kcyA9IGRhdGEub3JpZ2luYWxDYWxjdWxhdGVCb3VuZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRMb2NhbEJvdW5kcyA9IGRhdGEub3JpZ2luYWxHZXRMb2NhbEJvdW5kcztcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IGRhdGEub3JpZ2luYWxEZXN0cm95O1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUcmFuc2Zvcm0gPSBkYXRhLm9yaWdpbmFsVXBkYXRlVHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbnNQb2ludCA9IGRhdGEub3JpZ2luYWxDb250YWluc1BvaW50O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFzayA9IGRhdGEub3JpZ2luYWxNYXNrO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQXJlYSA9IGRhdGEub3JpZ2luYWxGaWx0ZXJBcmVhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBSZW5kZXJzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHNwcml0ZSB3aXRoIFdlYkdMXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBfcmVuZGVyQ2FjaGVkXG4gKiBAbWVtYmVyb2YgUElYSS5EaXNwbGF5T2JqZWN0I1xuICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIHRoZSBXZWJHTCByZW5kZXJlclxuICovXG5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5fcmVuZGVyQ2FjaGVkID0gZnVuY3Rpb24gX3JlbmRlckNhY2hlZChyZW5kZXJlcilcbntcbiAgICBpZiAoIXRoaXMudmlzaWJsZSB8fCB0aGlzLndvcmxkQWxwaGEgPD0gMCB8fCAhdGhpcy5yZW5kZXJhYmxlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2luaXRDYWNoZWREaXNwbGF5T2JqZWN0KHJlbmRlcmVyKTtcblxuICAgIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUudHJhbnNmb3JtLl93b3JsZElEID0gdGhpcy50cmFuc2Zvcm0uX3dvcmxkSUQ7XG4gICAgdGhpcy5fY2FjaGVEYXRhLnNwcml0ZS53b3JsZEFscGhhID0gdGhpcy53b3JsZEFscGhhO1xuICAgIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUuX3JlbmRlcihyZW5kZXJlcik7XG59O1xuXG4vKipcbiAqIFByZXBhcmVzIHRoZSBXZWJHTCByZW5kZXJlciB0byBjYWNoZSB0aGUgc3ByaXRlXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBfaW5pdENhY2hlZERpc3BsYXlPYmplY3RcbiAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0gdGhlIFdlYkdMIHJlbmRlcmVyXG4gKi9cbkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9pbml0Q2FjaGVkRGlzcGxheU9iamVjdCA9IGZ1bmN0aW9uIF9pbml0Q2FjaGVkRGlzcGxheU9iamVjdChyZW5kZXJlcilcbntcbiAgICBpZiAodGhpcy5fY2FjaGVEYXRhICYmIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUpXG4gICAge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIGFscGhhIGlzIHNldCB0byAxIG90aGVyd2lzZSBpdCB3aWxsIGdldCByZW5kZXJlZCBhcyBpbnZpc2libGUhXG4gICAgdmFyIGNhY2hlQWxwaGEgPSB0aGlzLmFscGhhO1xuXG4gICAgdGhpcy5hbHBoYSA9IDE7XG5cbiAgICAvLyBmaXJzdCB3ZSBmbHVzaCBhbnl0aGluZyBsZWZ0IGluIHRoZSByZW5kZXJlciAob3RoZXJ3aXNlIGl0IHdvdWxkIGdldCByZW5kZXJlZCB0byB0aGUgY2FjaGVkIHRleHR1cmUpXG4gICAgcmVuZGVyZXIuYmF0Y2guZmx1c2goKTtcbiAgICAvLyB0aGlzLmZpbHRlcnM9IFtdO1xuXG4gICAgLy8gbmV4dCB3ZSBmaW5kIHRoZSBkaW1lbnNpb25zIG9mIHRoZSB1bnRyYW5zZm9ybWVkIG9iamVjdFxuICAgIC8vIHRoaXMgZnVuY3Rpb24gYWxzbyBjYWxscyB1cGRhdGV0cmFuc2Zvcm0gb24gYWxsIGl0cyBjaGlsZHJlbiBhcyBwYXJ0IG9mIHRoZSBtZWFzdXJpbmcuXG4gICAgLy8gVGhpcyBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgdHJhbnNmb3JtIGFnYWluIGluIHRoaXMgZnVuY3Rpb25cbiAgICAvLyBUT0RPIHBhc3MgYW4gb2JqZWN0IHRvIGNsb25lIHRvbz8gc2F2ZXMgaGF2aW5nIHRvIGNyZWF0ZSBhIG5ldyBvbmUgZWFjaCB0aW1lIVxuICAgIHZhciBib3VuZHMgPSB0aGlzLmdldExvY2FsQm91bmRzKCkuY2xvbmUoKTtcblxuICAgIC8vIGFkZCBzb21lIHBhZGRpbmchXG4gICAgaWYgKHRoaXMuZmlsdGVycylcbiAgICB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5maWx0ZXJzWzBdLnBhZGRpbmc7XG5cbiAgICAgICAgYm91bmRzLnBhZChwYWRkaW5nKTtcbiAgICB9XG5cbiAgICBib3VuZHMuY2VpbChzZXR0aW5ncy5SRVNPTFVUSU9OKTtcblxuICAgIC8vIGZvciBub3cgd2UgY2FjaGUgdGhlIGN1cnJlbnQgcmVuZGVyVGFyZ2V0IHRoYXQgdGhlIFdlYkdMIHJlbmRlcmVyIGlzIGN1cnJlbnRseSB1c2luZy5cbiAgICAvLyB0aGlzIGNvdWxkIGJlIG1vcmUgZWxlZ2FudC4uXG4gICAgdmFyIGNhY2hlZFJlbmRlclRleHR1cmUgPSByZW5kZXJlci5yZW5kZXJUZXh0dXJlLmN1cnJlbnQ7XG4gICAgdmFyIGNhY2hlZFNvdXJjZUZyYW1lID0gcmVuZGVyZXIucmVuZGVyVGV4dHVyZS5zb3VyY2VGcmFtZS5jbG9uZSgpO1xuICAgIHZhciBjYWNoZWRQcm9qZWN0aW9uVHJhbnNmb3JtID0gcmVuZGVyZXIucHJvamVjdGlvbi50cmFuc2Zvcm07XG5cbiAgICAvLyBXZSBhbHNvIHN0b3JlIHRoZSBmaWx0ZXIgc3RhY2sgLSBJIHdpbGwgZGVmaW5pdGVseSBsb29rIHRvIGNoYW5nZSBob3cgdGhpcyB3b3JrcyBhIGxpdHRsZSBsYXRlciBkb3duIHRoZSBsaW5lLlxuICAgIC8vIGNvbnN0IHN0YWNrID0gcmVuZGVyZXIuZmlsdGVyTWFuYWdlci5maWx0ZXJTdGFjaztcblxuICAgIC8vIHRoaXMgcmVuZGVyVGV4dHVyZSB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIGNhY2hlZCBEaXNwbGF5T2JqZWN0XG4gICAgdmFyIHJlbmRlclRleHR1cmUgPSBSZW5kZXJUZXh0dXJlLmNyZWF0ZShib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpO1xuXG4gICAgdmFyIHRleHR1cmVDYWNoZUlkID0gXCJjYWNoZUFzQml0bWFwX1wiICsgKHVpZCgpKTtcblxuICAgIHRoaXMuX2NhY2hlRGF0YS50ZXh0dXJlQ2FjaGVJZCA9IHRleHR1cmVDYWNoZUlkO1xuXG4gICAgQmFzZVRleHR1cmUuYWRkVG9DYWNoZShyZW5kZXJUZXh0dXJlLmJhc2VUZXh0dXJlLCB0ZXh0dXJlQ2FjaGVJZCk7XG4gICAgVGV4dHVyZS5hZGRUb0NhY2hlKHJlbmRlclRleHR1cmUsIHRleHR1cmVDYWNoZUlkKTtcblxuICAgIC8vIG5lZWQgdG8gc2V0IC8vXG4gICAgdmFyIG0gPSBfdGVtcE1hdHJpeDtcblxuICAgIG0udHggPSAtYm91bmRzLng7XG4gICAgbS50eSA9IC1ib3VuZHMueTtcblxuICAgIC8vIHJlc2V0XG4gICAgdGhpcy50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm0uaWRlbnRpdHkoKTtcblxuICAgIC8vIHNldCBhbGwgcHJvcGVydGllcyB0byB0aGVyZSBvcmlnaW5hbCBzbyB3ZSBjYW4gcmVuZGVyIHRvIGEgdGV4dHVyZVxuICAgIHRoaXMucmVuZGVyID0gdGhpcy5fY2FjaGVEYXRhLm9yaWdpbmFsUmVuZGVyO1xuXG4gICAgcmVuZGVyZXIucmVuZGVyKHRoaXMsIHJlbmRlclRleHR1cmUsIHRydWUsIG0sIHRydWUpO1xuXG4gICAgLy8gbm93IHJlc3RvcmUgdGhlIHN0YXRlIGJlIHNldHRpbmcgdGhlIG5ldyBwcm9wZXJ0aWVzXG4gICAgcmVuZGVyZXIucHJvamVjdGlvbi50cmFuc2Zvcm0gPSBjYWNoZWRQcm9qZWN0aW9uVHJhbnNmb3JtO1xuICAgIHJlbmRlcmVyLnJlbmRlclRleHR1cmUuYmluZChjYWNoZWRSZW5kZXJUZXh0dXJlLCBjYWNoZWRTb3VyY2VGcmFtZSk7XG5cbiAgICAvLyByZW5kZXJlci5maWx0ZXJNYW5hZ2VyLmZpbHRlclN0YWNrID0gc3RhY2s7XG5cbiAgICB0aGlzLnJlbmRlciA9IHRoaXMuX3JlbmRlckNhY2hlZDtcbiAgICAvLyB0aGUgcmVzdCBpcyB0aGUgc2FtZSBhcyBmb3IgQ2FudmFzXG4gICAgdGhpcy51cGRhdGVUcmFuc2Zvcm0gPSB0aGlzLmRpc3BsYXlPYmplY3RVcGRhdGVUcmFuc2Zvcm07XG4gICAgdGhpcy5jYWxjdWxhdGVCb3VuZHMgPSB0aGlzLl9jYWxjdWxhdGVDYWNoZWRCb3VuZHM7XG4gICAgdGhpcy5nZXRMb2NhbEJvdW5kcyA9IHRoaXMuX2dldENhY2hlZExvY2FsQm91bmRzO1xuXG4gICAgdGhpcy5fbWFzayA9IG51bGw7XG4gICAgdGhpcy5maWx0ZXJBcmVhID0gbnVsbDtcblxuICAgIC8vIGNyZWF0ZSBvdXIgY2FjaGVkIHNwcml0ZVxuICAgIHZhciBjYWNoZWRTcHJpdGUgPSBuZXcgU3ByaXRlKHJlbmRlclRleHR1cmUpO1xuXG4gICAgY2FjaGVkU3ByaXRlLnRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtO1xuICAgIGNhY2hlZFNwcml0ZS5hbmNob3IueCA9IC0oYm91bmRzLnggLyBib3VuZHMud2lkdGgpO1xuICAgIGNhY2hlZFNwcml0ZS5hbmNob3IueSA9IC0oYm91bmRzLnkgLyBib3VuZHMuaGVpZ2h0KTtcbiAgICBjYWNoZWRTcHJpdGUuYWxwaGEgPSBjYWNoZUFscGhhO1xuICAgIGNhY2hlZFNwcml0ZS5fYm91bmRzID0gdGhpcy5fYm91bmRzO1xuXG4gICAgdGhpcy5fY2FjaGVEYXRhLnNwcml0ZSA9IGNhY2hlZFNwcml0ZTtcblxuICAgIHRoaXMudHJhbnNmb3JtLl9wYXJlbnRJRCA9IC0xO1xuICAgIC8vIHJlc3RvcmUgdGhlIHRyYW5zZm9ybSBvZiB0aGUgY2FjaGVkIHNwcml0ZSB0byBhdm9pZCB0aGUgbmFzdHkgZmxpY2tlci4uXG4gICAgaWYgKCF0aGlzLnBhcmVudClcbiAgICB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcmVuZGVyZXIuX3RlbXBEaXNwbGF5T2JqZWN0UGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIHRoaXMudXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgfVxuXG4gICAgLy8gbWFwIHRoZSBoaXQgdGVzdC4uXG4gICAgdGhpcy5jb250YWluc1BvaW50ID0gY2FjaGVkU3ByaXRlLmNvbnRhaW5zUG9pbnQuYmluZChjYWNoZWRTcHJpdGUpO1xufTtcblxuLyoqXG4gKiBSZW5kZXJzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIHNwcml0ZSB3aXRoIGNhbnZhc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gX3JlbmRlckNhY2hlZENhbnZhc1xuICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSB0aGUgV2ViR0wgcmVuZGVyZXJcbiAqL1xuRGlzcGxheU9iamVjdC5wcm90b3R5cGUuX3JlbmRlckNhY2hlZENhbnZhcyA9IGZ1bmN0aW9uIF9yZW5kZXJDYWNoZWRDYW52YXMocmVuZGVyZXIpXG57XG4gICAgaWYgKCF0aGlzLnZpc2libGUgfHwgdGhpcy53b3JsZEFscGhhIDw9IDAgfHwgIXRoaXMucmVuZGVyYWJsZSlcbiAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9pbml0Q2FjaGVkRGlzcGxheU9iamVjdENhbnZhcyhyZW5kZXJlcik7XG5cbiAgICB0aGlzLl9jYWNoZURhdGEuc3ByaXRlLndvcmxkQWxwaGEgPSB0aGlzLndvcmxkQWxwaGE7XG4gICAgdGhpcy5fY2FjaGVEYXRhLnNwcml0ZS5fcmVuZGVyQ2FudmFzKHJlbmRlcmVyKTtcbn07XG5cbi8vIFRPRE8gdGhpcyBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIFdlYkdMIHZlcnNpb24uLiB3aWxsIG5lZWQgdG8gZG8gYSBsaXR0bGUgdHdlYWtpbmcgZmlyc3QgdGhvdWdoLi5cbi8qKlxuICogUHJlcGFyZXMgdGhlIENhbnZhcyByZW5kZXJlciB0byBjYWNoZSB0aGUgc3ByaXRlXG4gKlxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBfaW5pdENhY2hlZERpc3BsYXlPYmplY3RDYW52YXNcbiAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIC0gdGhlIFdlYkdMIHJlbmRlcmVyXG4gKi9cbkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9pbml0Q2FjaGVkRGlzcGxheU9iamVjdENhbnZhcyA9IGZ1bmN0aW9uIF9pbml0Q2FjaGVkRGlzcGxheU9iamVjdENhbnZhcyhyZW5kZXJlcilcbntcbiAgICBpZiAodGhpcy5fY2FjaGVEYXRhICYmIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUpXG4gICAge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZ2V0IGJvdW5kcyBhY3R1YWxseSB0cmFuc2Zvcm1zIHRoZSBvYmplY3QgZm9yIHVzIGFscmVhZHkhXG4gICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0TG9jYWxCb3VuZHMoKTtcblxuICAgIHZhciBjYWNoZUFscGhhID0gdGhpcy5hbHBoYTtcblxuICAgIHRoaXMuYWxwaGEgPSAxO1xuXG4gICAgdmFyIGNhY2hlZFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmNvbnRleHQ7XG4gICAgdmFyIGNhY2hlZFByb2plY3Rpb25UcmFuc2Zvcm0gPSByZW5kZXJlci5fcHJvalRyYW5zZm9ybTtcblxuICAgIGJvdW5kcy5jZWlsKHNldHRpbmdzLlJFU09MVVRJT04pO1xuXG4gICAgdmFyIHJlbmRlclRleHR1cmUgPSBSZW5kZXJUZXh0dXJlLmNyZWF0ZShib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpO1xuXG4gICAgdmFyIHRleHR1cmVDYWNoZUlkID0gXCJjYWNoZUFzQml0bWFwX1wiICsgKHVpZCgpKTtcblxuICAgIHRoaXMuX2NhY2hlRGF0YS50ZXh0dXJlQ2FjaGVJZCA9IHRleHR1cmVDYWNoZUlkO1xuXG4gICAgQmFzZVRleHR1cmUuYWRkVG9DYWNoZShyZW5kZXJUZXh0dXJlLmJhc2VUZXh0dXJlLCB0ZXh0dXJlQ2FjaGVJZCk7XG4gICAgVGV4dHVyZS5hZGRUb0NhY2hlKHJlbmRlclRleHR1cmUsIHRleHR1cmVDYWNoZUlkKTtcblxuICAgIC8vIG5lZWQgdG8gc2V0IC8vXG4gICAgdmFyIG0gPSBfdGVtcE1hdHJpeDtcblxuICAgIHRoaXMudHJhbnNmb3JtLmxvY2FsVHJhbnNmb3JtLmNvcHlUbyhtKTtcbiAgICBtLmludmVydCgpO1xuXG4gICAgbS50eCAtPSBib3VuZHMueDtcbiAgICBtLnR5IC09IGJvdW5kcy55O1xuXG4gICAgLy8gbS5hcHBlbmQodGhpcy50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm0uKVxuICAgIC8vIHNldCBhbGwgcHJvcGVydGllcyB0byB0aGVyZSBvcmlnaW5hbCBzbyB3ZSBjYW4gcmVuZGVyIHRvIGEgdGV4dHVyZVxuICAgIHRoaXMucmVuZGVyQ2FudmFzID0gdGhpcy5fY2FjaGVEYXRhLm9yaWdpbmFsUmVuZGVyQ2FudmFzO1xuXG4gICAgcmVuZGVyZXIucmVuZGVyKHRoaXMsIHJlbmRlclRleHR1cmUsIHRydWUsIG0sIGZhbHNlKTtcbiAgICAvLyBub3cgcmVzdG9yZSB0aGUgc3RhdGUgYmUgc2V0dGluZyB0aGUgbmV3IHByb3BlcnRpZXNcbiAgICByZW5kZXJlci5jb250ZXh0ID0gY2FjaGVkUmVuZGVyVGFyZ2V0O1xuICAgIHJlbmRlcmVyLl9wcm9qVHJhbnNmb3JtID0gY2FjaGVkUHJvamVjdGlvblRyYW5zZm9ybTtcblxuICAgIHRoaXMucmVuZGVyQ2FudmFzID0gdGhpcy5fcmVuZGVyQ2FjaGVkQ2FudmFzO1xuICAgIC8vIHRoZSByZXN0IGlzIHRoZSBzYW1lIGFzIGZvciBXZWJHTFxuICAgIHRoaXMudXBkYXRlVHJhbnNmb3JtID0gdGhpcy5kaXNwbGF5T2JqZWN0VXBkYXRlVHJhbnNmb3JtO1xuICAgIHRoaXMuY2FsY3VsYXRlQm91bmRzID0gdGhpcy5fY2FsY3VsYXRlQ2FjaGVkQm91bmRzO1xuICAgIHRoaXMuZ2V0TG9jYWxCb3VuZHMgPSB0aGlzLl9nZXRDYWNoZWRMb2NhbEJvdW5kcztcblxuICAgIHRoaXMuX21hc2sgPSBudWxsO1xuICAgIHRoaXMuZmlsdGVyQXJlYSA9IG51bGw7XG5cbiAgICAvLyBjcmVhdGUgb3VyIGNhY2hlZCBzcHJpdGVcbiAgICB2YXIgY2FjaGVkU3ByaXRlID0gbmV3IFNwcml0ZShyZW5kZXJUZXh0dXJlKTtcblxuICAgIGNhY2hlZFNwcml0ZS50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybTtcbiAgICBjYWNoZWRTcHJpdGUuYW5jaG9yLnggPSAtKGJvdW5kcy54IC8gYm91bmRzLndpZHRoKTtcbiAgICBjYWNoZWRTcHJpdGUuYW5jaG9yLnkgPSAtKGJvdW5kcy55IC8gYm91bmRzLmhlaWdodCk7XG4gICAgY2FjaGVkU3ByaXRlLmFscGhhID0gY2FjaGVBbHBoYTtcbiAgICBjYWNoZWRTcHJpdGUuX2JvdW5kcyA9IHRoaXMuX2JvdW5kcztcblxuICAgIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUgPSBjYWNoZWRTcHJpdGU7XG5cbiAgICB0aGlzLnRyYW5zZm9ybS5fcGFyZW50SUQgPSAtMTtcbiAgICAvLyByZXN0b3JlIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIGNhY2hlZCBzcHJpdGUgdG8gYXZvaWQgdGhlIG5hc3R5IGZsaWNrZXIuLlxuICAgIGlmICghdGhpcy5wYXJlbnQpXG4gICAge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHJlbmRlcmVyLl90ZW1wRGlzcGxheU9iamVjdFBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAge1xuICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgIH1cblxuICAgIC8vIG1hcCB0aGUgaGl0IHRlc3QuLlxuICAgIHRoaXMuY29udGFpbnNQb2ludCA9IGNhY2hlZFNwcml0ZS5jb250YWluc1BvaW50LmJpbmQoY2FjaGVkU3ByaXRlKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBjYWNoZWQgc3ByaXRlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuRGlzcGxheU9iamVjdC5wcm90b3R5cGUuX2NhbGN1bGF0ZUNhY2hlZEJvdW5kcyA9IGZ1bmN0aW9uIF9jYWxjdWxhdGVDYWNoZWRCb3VuZHMoKVxue1xuICAgIHRoaXMuX2JvdW5kcy5jbGVhcigpO1xuICAgIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUudHJhbnNmb3JtLl93b3JsZElEID0gdGhpcy50cmFuc2Zvcm0uX3dvcmxkSUQ7XG4gICAgdGhpcy5fY2FjaGVEYXRhLnNwcml0ZS5fY2FsY3VsYXRlQm91bmRzKCk7XG4gICAgdGhpcy5fbGFzdEJvdW5kc0lEID0gdGhpcy5fYm91bmRzSUQ7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgY2FjaGVkIHNwcml0ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7UmVjdGFuZ2xlfSBUaGUgbG9jYWwgYm91bmRzLlxuICovXG5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5fZ2V0Q2FjaGVkTG9jYWxCb3VuZHMgPSBmdW5jdGlvbiBfZ2V0Q2FjaGVkTG9jYWxCb3VuZHMoKVxue1xuICAgIHJldHVybiB0aGlzLl9jYWNoZURhdGEuc3ByaXRlLmdldExvY2FsQm91bmRzKCk7XG59O1xuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBjYWNoZWQgc3ByaXRlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbkRpc3BsYXlPYmplY3QucHJvdG90eXBlLl9kZXN0cm95Q2FjaGVkRGlzcGxheU9iamVjdCA9IGZ1bmN0aW9uIF9kZXN0cm95Q2FjaGVkRGlzcGxheU9iamVjdCgpXG57XG4gICAgdGhpcy5fY2FjaGVEYXRhLnNwcml0ZS5fdGV4dHVyZS5kZXN0cm95KHRydWUpO1xuICAgIHRoaXMuX2NhY2hlRGF0YS5zcHJpdGUgPSBudWxsO1xuXG4gICAgQmFzZVRleHR1cmUucmVtb3ZlRnJvbUNhY2hlKHRoaXMuX2NhY2hlRGF0YS50ZXh0dXJlQ2FjaGVJZCk7XG4gICAgVGV4dHVyZS5yZW1vdmVGcm9tQ2FjaGUodGhpcy5fY2FjaGVEYXRhLnRleHR1cmVDYWNoZUlkKTtcblxuICAgIHRoaXMuX2NhY2hlRGF0YS50ZXh0dXJlQ2FjaGVJZCA9IG51bGw7XG59O1xuXG4vKipcbiAqIERlc3Ryb3lzIHRoZSBjYWNoZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge29iamVjdHxib29sZWFufSBbb3B0aW9uc10gLSBPcHRpb25zIHBhcmFtZXRlci4gQSBib29sZWFuIHdpbGwgYWN0IGFzIGlmIGFsbCBvcHRpb25zXG4gKiAgaGF2ZSBiZWVuIHNldCB0byB0aGF0IHZhbHVlLlxuICogIFVzZWQgd2hlbiBkZXN0cm95aW5nIGNvbnRhaW5lcnMsIHNlZSB0aGUgQ29udGFpbmVyLmRlc3Ryb3kgbWV0aG9kLlxuICovXG5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5fY2FjaGVBc0JpdG1hcERlc3Ryb3kgPSBmdW5jdGlvbiBfY2FjaGVBc0JpdG1hcERlc3Ryb3kob3B0aW9ucylcbntcbiAgICB0aGlzLmNhY2hlQXNCaXRtYXAgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3kob3B0aW9ucyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWl4aW4tY2FjaGUtYXMtYml0bWFwLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9taXhpbi1nZXQtY2hpbGQtYnktbmFtZSAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9taXhpbi1nZXQtY2hpbGQtYnktbmFtZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCB7IERpc3BsYXlPYmplY3QsIENvbnRhaW5lciB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuXG4vKipcbiAqIFRoZSBpbnN0YW5jZSBuYW1lIG9mIHRoZSBvYmplY3QuXG4gKlxuICogQG1lbWJlcm9mIFBJWEkuRGlzcGxheU9iamVjdCNcbiAqIEBtZW1iZXIge3N0cmluZ30gbmFtZVxuICovXG5EaXNwbGF5T2JqZWN0LnByb3RvdHlwZS5uYW1lID0gbnVsbDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXNwbGF5IG9iamVjdCBpbiB0aGUgY29udGFpbmVyLlxuICpcbiAqIEBtZXRob2QgZ2V0Q2hpbGRCeU5hbWVcbiAqIEBtZW1iZXJvZiBQSVhJLkNvbnRhaW5lciNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gSW5zdGFuY2UgbmFtZS5cbiAqIEByZXR1cm4ge1BJWEkuRGlzcGxheU9iamVjdH0gVGhlIGNoaWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICovXG5Db250YWluZXIucHJvdG90eXBlLmdldENoaWxkQnlOYW1lID0gZnVuY3Rpb24gZ2V0Q2hpbGRCeU5hbWUobmFtZSlcbntcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXS5uYW1lID09PSBuYW1lKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1peGluLWdldC1jaGlsZC1ieS1uYW1lLmVzLmpzLm1hcFxuIiwiLyohXG4gKiBAcGl4aS9taXhpbi1nZXQtZ2xvYmFsLXBvc2l0aW9uIC0gdjUuMi4zXG4gKiBDb21waWxlZCBGcmksIDI0IEFwciAyMDIwIDAwOjU1OjIyIFVUQ1xuICpcbiAqIEBwaXhpL21peGluLWdldC1nbG9iYWwtcG9zaXRpb24gaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICovXG5pbXBvcnQgeyBEaXNwbGF5T2JqZWN0IH0gZnJvbSAnQHBpeGkvZGlzcGxheSc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJ0BwaXhpL21hdGgnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheU9iamVjdC4gRG9lcyBub3QgZGVwZW5kIG9uIG9iamVjdCBzY2FsZSwgcm90YXRpb24gYW5kIHBpdm90LlxuICpcbiAqIEBtZXRob2QgZ2V0R2xvYmFsUG9zaXRpb25cbiAqIEBtZW1iZXJvZiBQSVhJLkRpc3BsYXlPYmplY3QjXG4gKiBAcGFyYW0ge1BJWEkuUG9pbnR9IFtwb2ludD1uZXcgUElYSS5Qb2ludCgpXSAtIFRoZSBwb2ludCB0byB3cml0ZSB0aGUgZ2xvYmFsIHZhbHVlIHRvLlxuICogQHBhcmFtIHtib29sZWFufSBbc2tpcFVwZGF0ZT1mYWxzZV0gLSBTZXR0aW5nIHRvIHRydWUgd2lsbCBzdG9wIHRoZSB0cmFuc2Zvcm1zIG9mIHRoZSBzY2VuZSBncmFwaCBmcm9tXG4gKiAgYmVpbmcgdXBkYXRlZC4gVGhpcyBtZWFucyB0aGUgY2FsY3VsYXRpb24gcmV0dXJuZWQgTUFZIGJlIG91dCBvZiBkYXRlIEJVVCB3aWxsIGdpdmUgeW91IGFcbiAqICBuaWNlIHBlcmZvcm1hbmNlIGJvb3N0LlxuICogQHJldHVybiB7UElYSS5Qb2ludH0gVGhlIHVwZGF0ZWQgcG9pbnQuXG4gKi9cbkRpc3BsYXlPYmplY3QucHJvdG90eXBlLmdldEdsb2JhbFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0R2xvYmFsUG9zaXRpb24ocG9pbnQsIHNraXBVcGRhdGUpXG57XG4gICAgaWYgKCBwb2ludCA9PT0gdm9pZCAwICkgcG9pbnQgPSBuZXcgUG9pbnQoKTtcbiAgICBpZiAoIHNraXBVcGRhdGUgPT09IHZvaWQgMCApIHNraXBVcGRhdGUgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhcmVudClcbiAgICB7XG4gICAgICAgIHRoaXMucGFyZW50LnRvR2xvYmFsKHRoaXMucG9zaXRpb24sIHBvaW50LCBza2lwVXBkYXRlKTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgcG9pbnQueCA9IHRoaXMucG9zaXRpb24ueDtcbiAgICAgICAgcG9pbnQueSA9IHRoaXMucG9zaXRpb24ueTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnQ7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWl4aW4tZ2V0LWdsb2JhbC1wb3NpdGlvbi5lcy5qcy5tYXBcbiIsIi8qIVxuICogQHBpeGkvbWVzaCAtIHY1LjIuM1xuICogQ29tcGlsZWQgRnJpLCAyNCBBcHIgMjAyMCAwMDo1NToyMiBVVENcbiAqXG4gKiBAcGl4aS9tZXNoIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgU3RhdGUsIFNoYWRlciwgUHJvZ3JhbSwgVGV4dHVyZU1hdHJpeCwgR2VvbWV0cnksIEJ1ZmZlciB9IGZyb20gJ0BwaXhpL2NvcmUnO1xuaW1wb3J0IHsgUG9pbnQsIFBvbHlnb24sIE1hdHJpeCB9IGZyb20gJ0BwaXhpL21hdGgnO1xuaW1wb3J0IHsgRFJBV19NT0RFUywgQkxFTkRfTU9ERVMsIFRZUEVTIH0gZnJvbSAnQHBpeGkvY29uc3RhbnRzJztcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ0BwaXhpL2Rpc3BsYXknO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tICdAcGl4aS9zZXR0aW5ncyc7XG5pbXBvcnQgeyBwcmVtdWx0aXBseVRpbnRUb1JnYmEgfSBmcm9tICdAcGl4aS91dGlscyc7XG5cbi8qKlxuICogQ2xhc3MgY29udHJvbHMgY2FjaGUgZm9yIFVWIG1hcHBpbmcgZnJvbSBUZXh0dXJlIG5vcm1hbCBzcGFjZSB0byBCYXNlVGV4dHVyZSBub3JtYWwgc3BhY2UuXG4gKlxuICogQGNsYXNzXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG52YXIgTWVzaEJhdGNoVXZzID0gZnVuY3Rpb24gTWVzaEJhdGNoVXZzKHV2QnVmZmVyLCB1dk1hdHJpeClcbntcbiAgICAvKipcbiAgICAgKiBCdWZmZXIgd2l0aCBub3JtYWxpemVkIFVWJ3NcbiAgICAgKiBAbWVtYmVyIHtQSVhJLkJ1ZmZlcn1cbiAgICAgKi9cbiAgICB0aGlzLnV2QnVmZmVyID0gdXZCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBNYXRlcmlhbCBVViBtYXRyaXhcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlRleHR1cmVNYXRyaXh9XG4gICAgICovXG4gICAgdGhpcy51dk1hdHJpeCA9IHV2TWF0cml4O1xuXG4gICAgLyoqXG4gICAgICogVVYgQnVmZmVyIGRhdGFcbiAgICAgKiBAbWVtYmVyIHtGbG9hdDMyQXJyYXl9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5kYXRhID0gbnVsbDtcblxuICAgIHRoaXMuX2J1ZmZlclVwZGF0ZUlkID0gLTE7XG5cbiAgICB0aGlzLl90ZXh0dXJlVXBkYXRlSWQgPSAtMTtcblxuICAgIHRoaXMuX3VwZGF0ZUlEID0gMDtcbn07XG5cbi8qKlxuICogdXBkYXRlc1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VVcGRhdGUgLSBmb3JjZSB0aGUgdXBkYXRlXG4gKi9cbk1lc2hCYXRjaFV2cy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChmb3JjZVVwZGF0ZSlcbntcbiAgICBpZiAoIWZvcmNlVXBkYXRlXG4gICAgICAgICYmIHRoaXMuX2J1ZmZlclVwZGF0ZUlkID09PSB0aGlzLnV2QnVmZmVyLl91cGRhdGVJRFxuICAgICAgICAmJiB0aGlzLl90ZXh0dXJlVXBkYXRlSWQgPT09IHRoaXMudXZNYXRyaXguX3VwZGF0ZUlEKVxuICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2J1ZmZlclVwZGF0ZUlkID0gdGhpcy51dkJ1ZmZlci5fdXBkYXRlSUQ7XG4gICAgdGhpcy5fdGV4dHVyZVVwZGF0ZUlkID0gdGhpcy51dk1hdHJpeC5fdXBkYXRlSUQ7XG5cbiAgICB2YXIgZGF0YSA9IHRoaXMudXZCdWZmZXIuZGF0YTtcblxuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YS5sZW5ndGggIT09IGRhdGEubGVuZ3RoKVxuICAgIHtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IEZsb2F0MzJBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdGhpcy51dk1hdHJpeC5tdWx0aXBseVV2cyhkYXRhLCB0aGlzLmRhdGEpO1xuXG4gICAgdGhpcy5fdXBkYXRlSUQrKztcbn07XG5cbnZhciB0ZW1wUG9pbnQgPSBuZXcgUG9pbnQoKTtcbnZhciB0ZW1wUG9seWdvbiA9IG5ldyBQb2x5Z29uKCk7XG5cbi8qKlxuICogQmFzZSBtZXNoIGNsYXNzLlxuICpcbiAqIFRoaXMgY2xhc3MgZW1wb3dlcnMgeW91IHRvIGhhdmUgbWF4aW11bSBmbGV4aWJpbGl0eSB0byByZW5kZXIgYW55IGtpbmQgb2YgV2ViR0wgdmlzdWFscyB5b3UgY2FuIHRoaW5rIG9mLlxuICogVGhpcyBjbGFzcyBhc3N1bWVzIGEgY2VydGFpbiBsZXZlbCBvZiBXZWJHTCBrbm93bGVkZ2UuXG4gKiBJZiB5b3Uga25vdyBhIGJpdCB0aGlzIHNob3VsZCBhYnN0cmFjdCBlbm91Z2ggYXdheSB0byBtYWtlIHlvdSBsaWZlIGVhc2llciFcbiAqXG4gKiBQcmV0dHkgbXVjaCBBTEwgV2ViR0wgY2FuIGJlIGJyb2tlbiBkb3duIGludG8gdGhlIGZvbGxvd2luZzpcbiAqIC0gR2VvbWV0cnkgLSBUaGUgc3RydWN0dXJlIGFuZCBkYXRhIGZvciB0aGUgbWVzaC4gVGhpcyBjYW4gaW5jbHVkZSBhbnl0aGluZyBmcm9tIHBvc2l0aW9ucywgdXZzLCBub3JtYWxzLCBjb2xvcnMgZXRjLi5cbiAqIC0gU2hhZGVyIC0gVGhpcyBpcyB0aGUgc2hhZGVyIHRoYXQgUGl4aUpTIHdpbGwgcmVuZGVyIHRoZSBnZW9tZXRyeSB3aXRoIChhdHRyaWJ1dGVzIGluIHRoZSBzaGFkZXIgbXVzdCBtYXRjaCB0aGUgZ2VvbWV0cnkpXG4gKiAtIFN0YXRlIC0gVGhpcyBpcyB0aGUgc3RhdGUgb2YgV2ViR0wgcmVxdWlyZWQgdG8gcmVuZGVyIHRoZSBtZXNoLlxuICpcbiAqIFRocm91Z2ggYSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgZWxlbWVudHMgeW91IGNhbiByZW5kZXIgYW55dGhpbmcgeW91IHdhbnQsIDJEIG9yIDNEIVxuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgUElYSS5Db250YWluZXJcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbnZhciBNZXNoID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ29udGFpbmVyKSB7XG4gICAgZnVuY3Rpb24gTWVzaChnZW9tZXRyeSwgc2hhZGVyLCBzdGF0ZSwgZHJhd01vZGUpLy8gdmVydGljZXMsIHV2cywgaW5kaWNlcywgZHJhd01vZGUpXG4gICAge1xuICAgICAgICBpZiAoIGRyYXdNb2RlID09PSB2b2lkIDAgKSBkcmF3TW9kZSA9IERSQVdfTU9ERVMuVFJJQU5HTEVTO1xuXG4gICAgICAgIENvbnRhaW5lci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmNsdWRlcyB2ZXJ0ZXggcG9zaXRpb25zLCBmYWNlIGluZGljZXMsIG5vcm1hbHMsIGNvbG9ycywgVVZzLCBhbmRcbiAgICAgICAgICogY3VzdG9tIGF0dHJpYnV0ZXMgd2l0aGluIGJ1ZmZlcnMsIHJlZHVjaW5nIHRoZSBjb3N0IG9mIHBhc3NpbmcgYWxsXG4gICAgICAgICAqIHRoaXMgZGF0YSB0byB0aGUgR1BVLiBDYW4gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgTWVzaCBvYmplY3RzLlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLkdlb21ldHJ5fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblxuICAgICAgICBnZW9tZXRyeS5yZWZDb3VudCsrO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXByZXNlbnRzIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMgdGhhdCBwcm9jZXNzZXMgdGhlIGdlb21ldHJ5IGFuZCBydW5zIG9uIHRoZSBHUFUuXG4gICAgICAgICAqIENhbiBiZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBNZXNoIG9iamVjdHMuXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU2hhZGVyfFBJWEkuTWVzaE1hdGVyaWFsfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaGFkZXIgPSBzaGFkZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlcHJlc2VudHMgdGhlIFdlYkdMIHN0YXRlIHRoZSBNZXNoIHJlcXVpcmVkIHRvIHJlbmRlciwgZXhjbHVkZXMgc2hhZGVyIGFuZCBnZW9tZXRyeS4gRS5nLixcbiAgICAgICAgICogYmxlbmQgbW9kZSwgY3VsbGluZywgZGVwdGggdGVzdGluZywgZGlyZWN0aW9uIG9mIHJlbmRlcmluZyB0cmlhbmdsZXMsIGJhY2tmYWNlLCBldGMuXG4gICAgICAgICAqIEBtZW1iZXIge1BJWEkuU3RhdGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgU3RhdGUuZm9yMmQoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHdheSB0aGUgTWVzaCBzaG91bGQgYmUgZHJhd24sIGNhbiBiZSBhbnkgb2YgdGhlIHtAbGluayBQSVhJLkRSQVdfTU9ERVN9IGNvbnN0YW50cy5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAgICAgKiBAc2VlIFBJWEkuRFJBV19NT0RFU1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kcmF3TW9kZSA9IGRyYXdNb2RlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBpY2FsbHkgdGhlIGluZGV4IG9mIHRoZSBJbmRleEJ1ZmZlciB3aGVyZSB0byBzdGFydCBkcmF3aW5nLlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgbXVjaCBvZiB0aGUgZ2VvbWV0cnkgdG8gZHJhdywgYnkgZGVmYXVsdCBgMGAgcmVuZGVycyBldmVyeXRoaW5nLlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZWFzZSBhcmUgdXNlZCBhcyBlYXN5IGFjY2VzcyBmb3IgYmF0Y2hpbmdcbiAgICAgICAgICogQG1lbWJlciB7RmxvYXQzMkFycmF5fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51dnMgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGVhc2UgYXJlIHVzZWQgYXMgZWFzeSBhY2Nlc3MgZm9yIGJhdGNoaW5nXG4gICAgICAgICAqIEBtZW1iZXIge1VpbnQxNkFycmF5fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRpY2VzID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhpcyBpcyB0aGUgY2FjaGluZyBsYXllciB1c2VkIGJ5IHRoZSBiYXRjaGVyXG4gICAgICAgICAqIEBtZW1iZXIge0Zsb2F0MzJBcnJheX1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudmVydGV4RGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGdlb21ldHJ5IGlzIGNoYW5nZWQgdXNlZCB0byBkZWNpZGUgdG8gcmUtdHJhbnNmb3JtXG4gICAgICAgICAqIHRoZSB2ZXJ0ZXhEYXRhLlxuICAgICAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZlcnRleERpcnR5ID0gMDtcblxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1JRCA9IC0xO1xuXG4gICAgICAgIC8vIEluaGVyaXRlZCBmcm9tIERpc3BsYXlNb2RlLCBzZXQgZGVmYXVsdHNcbiAgICAgICAgdGhpcy50aW50ID0gMHhGRkZGRkY7XG4gICAgICAgIHRoaXMuYmxlbmRNb2RlID0gQkxFTkRfTU9ERVMuTk9STUFMO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnRlcm5hbCByb3VuZFBpeGVscyBmaWVsZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcm91bmRQaXhlbHMgPSBzZXR0aW5ncy5ST1VORF9QSVhFTFM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJhdGNoZWQgVVYncyBhcmUgY2FjaGVkIGZvciBhdGxhcyB0ZXh0dXJlc1xuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLk1lc2hCYXRjaFV2c31cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmF0Y2hVdnMgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICggQ29udGFpbmVyICkgTWVzaC5fX3Byb3RvX18gPSBDb250YWluZXI7XG4gICAgTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb250YWluZXIgJiYgQ29udGFpbmVyLnByb3RvdHlwZSApO1xuICAgIE1lc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaDtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHV2QnVmZmVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHZlcnRpY2VzQnVmZmVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LG1hdGVyaWFsOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGJsZW5kTW9kZTogeyBjb25maWd1cmFibGU6IHRydWUgfSxyb3VuZFBpeGVsczogeyBjb25maWd1cmFibGU6IHRydWUgfSx0aW50OiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRleHR1cmU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIFRvIGNoYW5nZSBtZXNoIHV2J3MsIGNoYW5nZSBpdHMgdXZCdWZmZXIgZGF0YSBhbmQgaW5jcmVtZW50IGl0cyBfdXBkYXRlSUQuXG4gICAgICogQG1lbWJlciB7UElYSS5CdWZmZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnV2QnVmZmVyLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9tZXRyeS5idWZmZXJzWzFdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUbyBjaGFuZ2UgbWVzaCB2ZXJ0aWNlcywgY2hhbmdlIGl0cyB1dkJ1ZmZlciBkYXRhIGFuZCBpbmNyZW1lbnQgaXRzIF91cGRhdGVJRC5cbiAgICAgKiBJbmNyZW1lbnRpbmcgX3VwZGF0ZUlEIGlzIG9wdGlvbmFsIGJlY2F1c2UgbW9zdCBvZiBNZXNoIG9iamVjdHMgZG8gaXQgYW55d2F5LlxuICAgICAqIEBtZW1iZXIge1BJWEkuQnVmZmVyfVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy52ZXJ0aWNlc0J1ZmZlci5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkuYnVmZmVyc1swXTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBQSVhJLk1lc2gjc2hhZGVyfS5cbiAgICAgKiBAbWVtYmVyIHtQSVhJLlNoYWRlcnxQSVhJLk1lc2hNYXRlcmlhbH1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMubWF0ZXJpYWwuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5zaGFkZXIgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLm1hdGVyaWFsLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBibGVuZCBtb2RlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIE1lc2guIEFwcGx5IGEgdmFsdWUgb2ZcbiAgICAgKiBgUElYSS5CTEVORF9NT0RFUy5OT1JNQUxgIHRvIHJlc2V0IHRoZSBibGVuZCBtb2RlLlxuICAgICAqXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqIEBkZWZhdWx0IFBJWEkuQkxFTkRfTU9ERVMuTk9STUFMO1xuICAgICAqIEBzZWUgUElYSS5CTEVORF9NT0RFU1xuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5ibGVuZE1vZGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5ibGVuZE1vZGUgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmJsZW5kTW9kZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYmxlbmRNb2RlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIFBpeGlKUyB3aWxsIE1hdGguZmxvb3IoKSB4L3kgdmFsdWVzIHdoZW4gcmVuZGVyaW5nLCBzdG9wcGluZyBwaXhlbCBpbnRlcnBvbGF0aW9uLlxuICAgICAqIEFkdmFudGFnZXMgY2FuIGluY2x1ZGUgc2hhcnBlciBpbWFnZSBxdWFsaXR5IChsaWtlIHRleHQpIGFuZCBmYXN0ZXIgcmVuZGVyaW5nIG9uIGNhbnZhcy5cbiAgICAgKiBUaGUgbWFpbiBkaXNhZHZhbnRhZ2UgaXMgbW92ZW1lbnQgb2Ygb2JqZWN0cyBtYXkgYXBwZWFyIGxlc3Mgc21vb3RoLlxuICAgICAqIFRvIHNldCB0aGUgZ2xvYmFsIGRlZmF1bHQsIGNoYW5nZSB7QGxpbmsgUElYSS5zZXR0aW5ncy5ST1VORF9QSVhFTFN9XG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtib29sZWFufVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJvdW5kUGl4ZWxzLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSlcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9yb3VuZFBpeGVscyAhPT0gdmFsdWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybUlEID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm91bmRQaXhlbHMgPSB2YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnJvdW5kUGl4ZWxzLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91bmRQaXhlbHM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtdWx0aXBseSB0aW50IGFwcGxpZWQgdG8gdGhlIE1lc2guIFRoaXMgaXMgYSBoZXggdmFsdWUuIEEgdmFsdWUgb2ZcbiAgICAgKiBgMHhGRkZGRkZgIHdpbGwgcmVtb3ZlIGFueSB0aW50IGVmZmVjdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgKiBAZGVmYXVsdCAweEZGRkZGRlxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aW50LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5zaGFkZXIudGludDtcbiAgICB9O1xuXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRpbnQuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKVxuICAgIHtcbiAgICAgICAgdGhpcy5zaGFkZXIudGludCA9IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dHVyZSB0aGF0IHRoZSBNZXNoIHVzZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlRleHR1cmV9XG4gICAgICovXG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLnRleHR1cmUuZ2V0ID0gZnVuY3Rpb24gKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYWRlci50ZXh0dXJlO1xuICAgIH07XG5cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dHVyZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpXG4gICAge1xuICAgICAgICB0aGlzLnNoYWRlci50ZXh0dXJlID0gdmFsdWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIHJlbmRlcmVyIGRyYXcuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBJbnN0YW5jZSB0byByZW5kZXJlci5cbiAgICAgKi9cbiAgICBNZXNoLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gX3JlbmRlciAocmVuZGVyZXIpXG4gICAge1xuICAgICAgICAvLyBzZXQgcHJvcGVydGllcyBmb3IgYmF0Y2hpbmcuLlxuICAgICAgICAvLyBUT0RPIGNvdWxkIHVzZSBhIGRpZmZlcmVudCB3YXkgdG8gZ3JhYiB2ZXJ0cz9cbiAgICAgICAgdmFyIHZlcnRpY2VzID0gdGhpcy5nZW9tZXRyeS5idWZmZXJzWzBdLmRhdGE7XG5cbiAgICAgICAgLy8gVE9ETyBiZW5jaG1hcmsgY2hlY2sgZm9yIGF0dHJpYnV0ZSBzaXplLi5cbiAgICAgICAgaWYgKHRoaXMuc2hhZGVyLmJhdGNoYWJsZSAmJiB0aGlzLmRyYXdNb2RlID09PSBEUkFXX01PREVTLlRSSUFOR0xFUyAmJiB2ZXJ0aWNlcy5sZW5ndGggPCBNZXNoLkJBVENIQUJMRV9TSVpFICogMilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVG9CYXRjaChyZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJEZWZhdWx0KHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBub24tYmF0Y2hpbmcgd2F5IG9mIHJlbmRlcmluZy5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciAtIEluc3RhbmNlIHRvIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIE1lc2gucHJvdG90eXBlLl9yZW5kZXJEZWZhdWx0ID0gZnVuY3Rpb24gX3JlbmRlckRlZmF1bHQgKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgdmFyIHNoYWRlciA9IHRoaXMuc2hhZGVyO1xuXG4gICAgICAgIHNoYWRlci5hbHBoYSA9IHRoaXMud29ybGRBbHBoYTtcbiAgICAgICAgaWYgKHNoYWRlci51cGRhdGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHNoYWRlci51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbmRlcmVyLmJhdGNoLmZsdXNoKCk7XG5cbiAgICAgICAgaWYgKHNoYWRlci5wcm9ncmFtLnVuaWZvcm1EYXRhLnRyYW5zbGF0aW9uTWF0cml4KVxuICAgICAgICB7XG4gICAgICAgICAgICBzaGFkZXIudW5pZm9ybXMudHJhbnNsYXRpb25NYXRyaXggPSB0aGlzLnRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybS50b0FycmF5KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmluZCBhbmQgc3luYyB1bmlmb3Jtcy4uXG4gICAgICAgIHJlbmRlcmVyLnNoYWRlci5iaW5kKHNoYWRlcik7XG5cbiAgICAgICAgLy8gc2V0IHN0YXRlLi5cbiAgICAgICAgcmVuZGVyZXIuc3RhdGUuc2V0KHRoaXMuc3RhdGUpO1xuXG4gICAgICAgIC8vIGJpbmQgdGhlIGdlb21ldHJ5Li4uXG4gICAgICAgIHJlbmRlcmVyLmdlb21ldHJ5LmJpbmQodGhpcy5nZW9tZXRyeSwgc2hhZGVyKTtcblxuICAgICAgICAvLyB0aGVuIHJlbmRlciBpdFxuICAgICAgICByZW5kZXJlci5nZW9tZXRyeS5kcmF3KHRoaXMuZHJhd01vZGUsIHRoaXMuc2l6ZSwgdGhpcy5zdGFydCwgdGhpcy5nZW9tZXRyeS5pbnN0YW5jZUNvdW50KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVuZGVyaW5nIGJ5IHVzaW5nIHRoZSBCYXRjaCBzeXN0ZW0uXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgLSBJbnN0YW5jZSB0byByZW5kZXJlci5cbiAgICAgKi9cbiAgICBNZXNoLnByb3RvdHlwZS5fcmVuZGVyVG9CYXRjaCA9IGZ1bmN0aW9uIF9yZW5kZXJUb0JhdGNoIChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2hhZGVyLnV2TWF0cml4KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnNoYWRlci51dk1hdHJpeC51cGRhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVXZzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgcHJvcGVydGllcyBmb3IgYmF0Y2hpbmcuLlxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVZlcnRpY2VzKCk7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4QnVmZmVyLmRhdGE7XG4gICAgICAgIHRoaXMuX3RpbnRSR0IgPSB0aGlzLnNoYWRlci5fdGludFJHQjtcbiAgICAgICAgdGhpcy5fdGV4dHVyZSA9IHRoaXMuc2hhZGVyLnRleHR1cmU7XG5cbiAgICAgICAgdmFyIHBsdWdpbk5hbWUgPSB0aGlzLm1hdGVyaWFsLnBsdWdpbk5hbWU7XG5cbiAgICAgICAgcmVuZGVyZXIuYmF0Y2guc2V0T2JqZWN0UmVuZGVyZXIocmVuZGVyZXIucGx1Z2luc1twbHVnaW5OYW1lXSk7XG4gICAgICAgIHJlbmRlcmVyLnBsdWdpbnNbcGx1Z2luTmFtZV0ucmVuZGVyKHRoaXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHZlcnRleERhdGEgZmllbGQgYmFzZWQgb24gdHJhbnNmb3JtIGFuZCB2ZXJ0aWNlc1xuICAgICAqL1xuICAgIE1lc2gucHJvdG90eXBlLmNhbGN1bGF0ZVZlcnRpY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlVmVydGljZXMgKClcbiAgICB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG4gICAgICAgIHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LmJ1ZmZlcnNbMF0uZGF0YTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudmVydGV4RGlydHlJZCA9PT0gdGhpcy52ZXJ0ZXhEaXJ0eSAmJiB0aGlzLl90cmFuc2Zvcm1JRCA9PT0gdGhpcy50cmFuc2Zvcm0uX3dvcmxkSUQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybUlEID0gdGhpcy50cmFuc2Zvcm0uX3dvcmxkSUQ7XG5cbiAgICAgICAgaWYgKHRoaXMudmVydGV4RGF0YS5sZW5ndGggIT09IHZlcnRpY2VzLmxlbmd0aClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhEYXRhID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHd0ID0gdGhpcy50cmFuc2Zvcm0ud29ybGRUcmFuc2Zvcm07XG4gICAgICAgIHZhciBhID0gd3QuYTtcbiAgICAgICAgdmFyIGIgPSB3dC5iO1xuICAgICAgICB2YXIgYyA9IHd0LmM7XG4gICAgICAgIHZhciBkID0gd3QuZDtcbiAgICAgICAgdmFyIHR4ID0gd3QudHg7XG4gICAgICAgIHZhciB0eSA9IHd0LnR5O1xuXG4gICAgICAgIHZhciB2ZXJ0ZXhEYXRhID0gdGhpcy52ZXJ0ZXhEYXRhO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGV4RGF0YS5sZW5ndGggLyAyOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciB4ID0gdmVydGljZXNbKGkgKiAyKV07XG4gICAgICAgICAgICB2YXIgeSA9IHZlcnRpY2VzWyhpICogMikgKyAxXTtcblxuICAgICAgICAgICAgdmVydGV4RGF0YVsoaSAqIDIpXSA9IChhICogeCkgKyAoYyAqIHkpICsgdHg7XG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhWyhpICogMikgKyAxXSA9IChiICogeCkgKyAoZCAqIHkpICsgdHk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcm91bmRQaXhlbHMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZXNvbHV0aW9uID0gc2V0dGluZ3MuUkVTT0xVVElPTjtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgdmVydGV4RGF0YS5sZW5ndGg7ICsraSQxKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZlcnRleERhdGFbaSQxXSA9IE1hdGgucm91bmQoKHZlcnRleERhdGFbaSQxXSAqIHJlc29sdXRpb24gfCAwKSAvIHJlc29sdXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhEaXJ0eSA9IGdlb21ldHJ5LnZlcnRleERpcnR5SWQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdXYgZmllbGQgYmFzZWQgb24gZnJvbSBnZW9tZXRyeSB1didzIG9yIGJhdGNoVXZzXG4gICAgICovXG4gICAgTWVzaC5wcm90b3R5cGUuY2FsY3VsYXRlVXZzID0gZnVuY3Rpb24gY2FsY3VsYXRlVXZzICgpXG4gICAge1xuICAgICAgICB2YXIgZ2VvbVV2cyA9IHRoaXMuZ2VvbWV0cnkuYnVmZmVyc1sxXTtcblxuICAgICAgICBpZiAoIXRoaXMuc2hhZGVyLnV2TWF0cml4LmlzU2ltcGxlKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYmF0Y2hVdnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXRjaFV2cyA9IG5ldyBNZXNoQmF0Y2hVdnMoZ2VvbVV2cywgdGhpcy5zaGFkZXIudXZNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYXRjaFV2cy51cGRhdGUoKTtcbiAgICAgICAgICAgIHRoaXMudXZzID0gdGhpcy5iYXRjaFV2cy5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51dnMgPSBnZW9tVXZzLmRhdGE7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBtZXNoIGFzIGEgcmVjdGFuZ2xlLiBUaGUgYm91bmRzIGNhbGN1bGF0aW9uIHRha2VzIHRoZSB3b3JsZFRyYW5zZm9ybSBpbnRvIGFjY291bnQuXG4gICAgICogdGhlcmUgbXVzdCBiZSBhIGFWZXJ0ZXhQb3NpdGlvbiBhdHRyaWJ1dGUgcHJlc2VudCBpbiB0aGUgZ2VvbWV0cnkgZm9yIGJvdW5kcyB0byBiZSBjYWxjdWxhdGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBNZXNoLnByb3RvdHlwZS5fY2FsY3VsYXRlQm91bmRzID0gZnVuY3Rpb24gX2NhbGN1bGF0ZUJvdW5kcyAoKVxuICAgIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVWZXJ0aWNlcygpO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kcy5hZGRWZXJ0ZXhEYXRhKHRoaXMudmVydGV4RGF0YSwgMCwgdGhpcy52ZXJ0ZXhEYXRhLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIGEgcG9pbnQgaXMgaW5zaWRlIHRoaXMgbWVzaC4gV29ya3Mgb25seSBmb3IgUElYSS5EUkFXX01PREVTLlRSSUFOR0xFUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UElYSS5Qb2ludH0gcG9pbnQgdGhlIHBvaW50IHRvIHRlc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0XG4gICAgICovXG4gICAgTWVzaC5wcm90b3R5cGUuY29udGFpbnNQb2ludCA9IGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQgKHBvaW50KVxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldEJvdW5kcygpLmNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndvcmxkVHJhbnNmb3JtLmFwcGx5SW52ZXJzZShwb2ludCwgdGVtcFBvaW50KTtcblxuICAgICAgICB2YXIgdmVydGljZXMgPSB0aGlzLmdlb21ldHJ5LmdldEJ1ZmZlcignYVZlcnRleFBvc2l0aW9uJykuZGF0YTtcblxuICAgICAgICB2YXIgcG9pbnRzID0gdGVtcFBvbHlnb24ucG9pbnRzO1xuICAgICAgICB2YXIgaW5kaWNlcyA9ICB0aGlzLmdlb21ldHJ5LmdldEluZGV4KCkuZGF0YTtcbiAgICAgICAgdmFyIGxlbiA9IGluZGljZXMubGVuZ3RoO1xuICAgICAgICB2YXIgc3RlcCA9IHRoaXMuZHJhd01vZGUgPT09IDQgPyAzIDogMTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSArIDIgPCBsZW47IGkgKz0gc3RlcClcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIGluZDAgPSBpbmRpY2VzW2ldICogMjtcbiAgICAgICAgICAgIHZhciBpbmQxID0gaW5kaWNlc1tpICsgMV0gKiAyO1xuICAgICAgICAgICAgdmFyIGluZDIgPSBpbmRpY2VzW2kgKyAyXSAqIDI7XG5cbiAgICAgICAgICAgIHBvaW50c1swXSA9IHZlcnRpY2VzW2luZDBdO1xuICAgICAgICAgICAgcG9pbnRzWzFdID0gdmVydGljZXNbaW5kMCArIDFdO1xuICAgICAgICAgICAgcG9pbnRzWzJdID0gdmVydGljZXNbaW5kMV07XG4gICAgICAgICAgICBwb2ludHNbM10gPSB2ZXJ0aWNlc1tpbmQxICsgMV07XG4gICAgICAgICAgICBwb2ludHNbNF0gPSB2ZXJ0aWNlc1tpbmQyXTtcbiAgICAgICAgICAgIHBvaW50c1s1XSA9IHZlcnRpY2VzW2luZDIgKyAxXTtcblxuICAgICAgICAgICAgaWYgKHRlbXBQb2x5Z29uLmNvbnRhaW5zKHRlbXBQb2ludC54LCB0ZW1wUG9pbnQueSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgTWVzaCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdHxib29sZWFufSBbb3B0aW9uc10gLSBPcHRpb25zIHBhcmFtZXRlci4gQSBib29sZWFuIHdpbGwgYWN0IGFzIGlmIGFsbFxuICAgICAqICBvcHRpb25zIGhhdmUgYmVlbiBzZXQgdG8gdGhhdCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hpbGRyZW49ZmFsc2VdIC0gaWYgc2V0IHRvIHRydWUsIGFsbCB0aGUgY2hpbGRyZW4gd2lsbCBoYXZlXG4gICAgICogIHRoZWlyIGRlc3Ryb3kgbWV0aG9kIGNhbGxlZCBhcyB3ZWxsLiAnb3B0aW9ucycgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhvc2UgY2FsbHMuXG4gICAgICovXG4gICAgTWVzaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIGRlc3Ryb3kgKG9wdGlvbnMpXG4gICAge1xuICAgICAgICBDb250YWluZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmdlb21ldHJ5LnJlZkNvdW50LS07XG4gICAgICAgIGlmICh0aGlzLmdlb21ldHJ5LnJlZkNvdW50ID09PSAwKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsO1xuICAgICAgICB0aGlzLnNoYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLnV2cyA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IG51bGw7XG4gICAgICAgIHRoaXMudmVydGV4RGF0YSA9IG51bGw7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgICByZXR1cm4gTWVzaDtcbn0oQ29udGFpbmVyKSk7XG5cbi8qKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGNvbnNpZGVyIGJhdGNoYWJsZS4gR2VuZXJhbGx5LCB0aGUgY29tcGxleGl0eVxuICogb2YgdGhlIGdlb21ldHJ5LlxuICogQG1lbWJlcm9mIFBJWEkuTWVzaFxuICogQHN0YXRpY1xuICogQG1lbWJlciB7bnVtYmVyfSBCQVRDSEFCTEVfU0laRVxuICovXG5NZXNoLkJBVENIQUJMRV9TSVpFID0gMTAwO1xuXG52YXIgdmVydGV4ID0gXCJhdHRyaWJ1dGUgdmVjMiBhVmVydGV4UG9zaXRpb247XFxuYXR0cmlidXRlIHZlYzIgYVRleHR1cmVDb29yZDtcXG5cXG51bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDMgdHJhbnNsYXRpb25NYXRyaXg7XFxudW5pZm9ybSBtYXQzIHVUZXh0dXJlTWF0cml4O1xcblxcbnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcblxcbnZvaWQgbWFpbih2b2lkKVxcbntcXG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KChwcm9qZWN0aW9uTWF0cml4ICogdHJhbnNsYXRpb25NYXRyaXggKiB2ZWMzKGFWZXJ0ZXhQb3NpdGlvbiwgMS4wKSkueHksIDAuMCwgMS4wKTtcXG5cXG4gICAgdlRleHR1cmVDb29yZCA9ICh1VGV4dHVyZU1hdHJpeCAqIHZlYzMoYVRleHR1cmVDb29yZCwgMS4wKSkueHk7XFxufVxcblwiO1xuXG52YXIgZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xcbnVuaWZvcm0gdmVjNCB1Q29sb3I7XFxuXFxudW5pZm9ybSBzYW1wbGVyMkQgdVNhbXBsZXI7XFxuXFxudm9pZCBtYWluKHZvaWQpXFxue1xcbiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodVNhbXBsZXIsIHZUZXh0dXJlQ29vcmQpICogdUNvbG9yO1xcbn1cXG5cIjtcblxuLyoqXG4gKiBTbGlnaHRseSBvcGluaW9uYXRlZCBkZWZhdWx0IHNoYWRlciBmb3IgUGl4aUpTIDJEIG9iamVjdHMuXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXh0ZW5kcyBQSVhJLlNoYWRlclxuICovXG52YXIgTWVzaE1hdGVyaWFsID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoU2hhZGVyKSB7XG4gICAgZnVuY3Rpb24gTWVzaE1hdGVyaWFsKHVTYW1wbGVyLCBvcHRpb25zKVxuICAgIHtcbiAgICAgICAgdmFyIHVuaWZvcm1zID0ge1xuICAgICAgICAgICAgdVNhbXBsZXI6IHVTYW1wbGVyLFxuICAgICAgICAgICAgYWxwaGE6IDEsXG4gICAgICAgICAgICB1VGV4dHVyZU1hdHJpeDogTWF0cml4LklERU5USVRZLFxuICAgICAgICAgICAgdUNvbG9yOiBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxLCAxXSksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIHRpbnQ6IDB4RkZGRkZGLFxuICAgICAgICAgICAgYWxwaGE6IDEsXG4gICAgICAgICAgICBwbHVnaW5OYW1lOiAnYmF0Y2gnLFxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAob3B0aW9ucy51bmlmb3JtcylcbiAgICAgICAge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1bmlmb3Jtcywgb3B0aW9ucy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBTaGFkZXIuY2FsbCh0aGlzLCBvcHRpb25zLnByb2dyYW0gfHwgUHJvZ3JhbS5mcm9tKHZlcnRleCwgZnJhZ21lbnQpLCB1bmlmb3Jtcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9ubHkgZG8gdXBkYXRlIGlmIHRpbnQgb3IgYWxwaGEgY2hhbmdlcy5cbiAgICAgICAgICogQG1lbWJlciB7Ym9vbGVhbn1cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NvbG9yRGlydHkgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGV4dHVyZU1hdHJpeCBpbnN0YW5jZSBmb3IgdGhpcyBNZXNoLCB1c2VkIHRvIHRyYWNrIFRleHR1cmUgY2hhbmdlc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyIHtQSVhJLlRleHR1cmVNYXRyaXh9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51dk1hdHJpeCA9IG5ldyBUZXh0dXJlTWF0cml4KHVTYW1wbGVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogYHRydWVgIGlmIHNoYWRlciBjYW4gYmUgYmF0Y2ggd2l0aCB0aGUgcmVuZGVyZXIncyBiYXRjaCBzeXN0ZW0uXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmF0Y2hhYmxlID0gb3B0aW9ucy5wcm9ncmFtID09PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbmRlcmVyIHBsdWdpbiBmb3IgYmF0Y2hpbmdcbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlciB7c3RyaW5nfVxuICAgICAgICAgKiBAZGVmYXVsdCAnYmF0Y2gnXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsdWdpbk5hbWUgPSBvcHRpb25zLnBsdWdpbk5hbWU7XG5cbiAgICAgICAgdGhpcy50aW50ID0gb3B0aW9ucy50aW50O1xuICAgICAgICB0aGlzLmFscGhhID0gb3B0aW9ucy5hbHBoYTtcbiAgICB9XG5cbiAgICBpZiAoIFNoYWRlciApIE1lc2hNYXRlcmlhbC5fX3Byb3RvX18gPSBTaGFkZXI7XG4gICAgTWVzaE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlciAmJiBTaGFkZXIucHJvdG90eXBlICk7XG4gICAgTWVzaE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hNYXRlcmlhbDtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHRleHR1cmU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxwaGE6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sdGludDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gICAgLyoqXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSB0ZXh0dXJlIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqIEBtZW1iZXIge1BJWEkuVGV4dHVyZX1cbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dHVyZS5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pZm9ybXMudVNhbXBsZXI7XG4gICAgfTtcbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGV4dHVyZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpXG4gICAge1xuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcy51U2FtcGxlciAhPT0gdmFsdWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybXMudVNhbXBsZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudXZNYXRyaXgudGV4dHVyZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZ2V0cyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgb2JqZWN0IHVzaW5nIHRoaXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAxXG4gICAgICogQG1lbWJlciB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy5hbHBoYS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpXG4gICAge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRoaXMuX2FscGhhKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMuX2FscGhhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NvbG9yRGlydHkgPSB0cnVlO1xuICAgIH07XG4gICAgcHJvdG90eXBlQWNjZXNzb3JzLmFscGhhLmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRpbnQgZm9yIHRoZSBtYXRlcmlhbC5cbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQGRlZmF1bHQgMHhGRkZGRkZcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudGludC5zZXQgPSBmdW5jdGlvbiAodmFsdWUpXG4gICAge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRoaXMuX3RpbnQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5fdGludCA9IHZhbHVlO1xuICAgICAgICB0aGlzLl90aW50UkdCID0gKHZhbHVlID4+IDE2KSArICh2YWx1ZSAmIDB4ZmYwMCkgKyAoKHZhbHVlICYgMHhmZikgPDwgMTYpO1xuICAgICAgICB0aGlzLl9jb2xvckRpcnR5ID0gdHJ1ZTtcbiAgICB9O1xuICAgIHByb3RvdHlwZUFjY2Vzc29ycy50aW50LmdldCA9IGZ1bmN0aW9uICgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGludDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgTWVzaC4gSW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9tXG4gICAgICogTWVzaE1hdGVyaWFsIG9iamVjdHMuXG4gICAgICovXG4gICAgTWVzaE1hdGVyaWFsLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLl9jb2xvckRpcnR5KVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLl9jb2xvckRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgYmFzZVRleHR1cmUgPSB0aGlzLnRleHR1cmUuYmFzZVRleHR1cmU7XG5cbiAgICAgICAgICAgIHByZW11bHRpcGx5VGludFRvUmdiYSh0aGlzLl90aW50LCB0aGlzLl9hbHBoYSwgdGhpcy51bmlmb3Jtcy51Q29sb3IsIGJhc2VUZXh0dXJlLmFscGhhTW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXZNYXRyaXgudXBkYXRlKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybXMudVRleHR1cmVNYXRyaXggPSB0aGlzLnV2TWF0cml4Lm1hcENvb3JkO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoTWF0ZXJpYWwucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBNZXNoTWF0ZXJpYWw7XG59KFNoYWRlcikpO1xuXG4vKipcbiAqIFN0YW5kYXJkIDJEIGdlb21ldHJ5IHVzZWQgaW4gUGl4aUpTLlxuICpcbiAqIEdlb21ldHJ5IGNhbiBiZSBkZWZpbmVkIHdpdGhvdXQgcGFzc2luZyBpbiBhIHN0eWxlIG9yIGRhdGEgaWYgcmVxdWlyZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFBJWEkuR2VvbWV0cnkoKTtcbiAqXG4gKiBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3Bvc2l0aW9ucycsIFswLCAwLCAxMDAsIDAsIDEwMCwgMTAwLCAwLCAxMDBdLCAyKTtcbiAqIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgndXZzJywgWzAsMCwxLDAsMSwxLDAsMV0sIDIpO1xuICogZ2VvbWV0cnkuYWRkSW5kZXgoWzAsMSwyLDEsMywyXSk7XG4gKlxuICogYGBgXG4gKiBAY2xhc3NcbiAqIEBtZW1iZXJvZiBQSVhJXG4gKiBAZXh0ZW5kcyBQSVhJLkdlb21ldHJ5XG4gKi9cbnZhciBNZXNoR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChHZW9tZXRyeSkge1xuICAgIGZ1bmN0aW9uIE1lc2hHZW9tZXRyeSh2ZXJ0aWNlcywgdXZzLCBpbmRleClcbiAgICB7XG4gICAgICAgIEdlb21ldHJ5LmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIHZlcnRpY2VzQnVmZmVyID0gbmV3IEJ1ZmZlcih2ZXJ0aWNlcyk7XG4gICAgICAgIHZhciB1dnNCdWZmZXIgPSBuZXcgQnVmZmVyKHV2cywgdHJ1ZSk7XG4gICAgICAgIHZhciBpbmRleEJ1ZmZlciA9IG5ldyBCdWZmZXIoaW5kZXgsIHRydWUsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuYWRkQXR0cmlidXRlKCdhVmVydGV4UG9zaXRpb24nLCB2ZXJ0aWNlc0J1ZmZlciwgMiwgZmFsc2UsIFRZUEVTLkZMT0FUKVxuICAgICAgICAgICAgLmFkZEF0dHJpYnV0ZSgnYVRleHR1cmVDb29yZCcsIHV2c0J1ZmZlciwgMiwgZmFsc2UsIFRZUEVTLkZMT0FUKVxuICAgICAgICAgICAgLmFkZEluZGV4KGluZGV4QnVmZmVyKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGlydHkgZmxhZyB0byBsaW1pdCB1cGRhdGUgY2FsbHMgb24gTWVzaC4gRm9yIGV4YW1wbGUsXG4gICAgICAgICAqIGxpbWl0aW5nIHVwZGF0ZXMgb24gYSBzaW5nbGUgTWVzaCBpbnN0YW5jZSB3aXRoIGEgc2hhcmVkIEdlb21ldHJ5XG4gICAgICAgICAqIHdpdGhpbiB0aGUgcmVuZGVyIGxvb3AuXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqIEBtZW1iZXIge251bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgLTFcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3VwZGF0ZUlkID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCBHZW9tZXRyeSApIE1lc2hHZW9tZXRyeS5fX3Byb3RvX18gPSBHZW9tZXRyeTtcbiAgICBNZXNoR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkgJiYgR2VvbWV0cnkucHJvdG90eXBlICk7XG4gICAgTWVzaEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hHZW9tZXRyeTtcblxuICAgIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IHZlcnRleERpcnR5SWQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICAgIC8qKlxuICAgICAqIElmIHRoZSB2ZXJ0ZXggcG9zaXRpb24gaXMgdXBkYXRlZC5cbiAgICAgKiBAbWVtYmVyIHtudW1iZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcm90b3R5cGVBY2Nlc3NvcnMudmVydGV4RGlydHlJZC5nZXQgPSBmdW5jdGlvbiAoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyc1swXS5fdXBkYXRlSUQ7XG4gICAgfTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoR2VvbWV0cnkucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICAgIHJldHVybiBNZXNoR2VvbWV0cnk7XG59KEdlb21ldHJ5KSk7XG5cbmV4cG9ydCB7IE1lc2gsIE1lc2hCYXRjaFV2cywgTWVzaEdlb21ldHJ5LCBNZXNoTWF0ZXJpYWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc2guZXMuanMubWFwXG4iLCIvKiFcbiAqIHBpeGkuanMgLSB2NS4yLjNcbiAqIENvbXBpbGVkIEZyaSwgMjQgQXByIDIwMjAgMDA6NTU6MjIgVVRDXG4gKlxuICogcGl4aS5qcyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cbmltcG9ydCAnQHBpeGkvcG9seWZpbGwnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eU1hbmFnZXIgfSBmcm9tICdAcGl4aS9hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCAqIGFzIGFjY2Vzc2liaWxpdHkgZnJvbSAnQHBpeGkvYWNjZXNzaWJpbGl0eSc7XG5leHBvcnQgeyBhY2Nlc3NpYmlsaXR5IH07XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1hbmFnZXIgfSBmcm9tICdAcGl4aS9pbnRlcmFjdGlvbic7XG5pbXBvcnQgKiBhcyBpbnRlcmFjdGlvbiBmcm9tICdAcGl4aS9pbnRlcmFjdGlvbic7XG5leHBvcnQgeyBpbnRlcmFjdGlvbiB9O1xuaW1wb3J0IHsgZGVwcmVjYXRpb24gfSBmcm9tICdAcGl4aS91dGlscyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdAcGl4aS91dGlscyc7XG5leHBvcnQgeyB1dGlscyB9O1xuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICdAcGl4aS9hcHAnO1xuZXhwb3J0ICogZnJvbSAnQHBpeGkvYXBwJztcbmltcG9ydCB7IFJlbmRlcmVyLCBCYXRjaFJlbmRlcmVyIH0gZnJvbSAnQHBpeGkvY29yZSc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9jb3JlJztcbmltcG9ydCB7IEV4dHJhY3QgfSBmcm9tICdAcGl4aS9leHRyYWN0JztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL2V4dHJhY3QnO1xuaW1wb3J0IHsgTG9hZGVyLCBBcHBMb2FkZXJQbHVnaW4gfSBmcm9tICdAcGl4aS9sb2FkZXJzJztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL2xvYWRlcnMnO1xuaW1wb3J0IHsgUGFydGljbGVSZW5kZXJlciB9IGZyb20gJ0BwaXhpL3BhcnRpY2xlcyc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9wYXJ0aWNsZXMnO1xuaW1wb3J0IHsgUHJlcGFyZSB9IGZyb20gJ0BwaXhpL3ByZXBhcmUnO1xuZXhwb3J0ICogZnJvbSAnQHBpeGkvcHJlcGFyZSc7XG5pbXBvcnQgeyBTcHJpdGVzaGVldExvYWRlciB9IGZyb20gJ0BwaXhpL3Nwcml0ZXNoZWV0JztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL3Nwcml0ZXNoZWV0JztcbmltcG9ydCB7IFRpbGluZ1Nwcml0ZVJlbmRlcmVyIH0gZnJvbSAnQHBpeGkvc3ByaXRlLXRpbGluZyc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9zcHJpdGUtdGlsaW5nJztcbmltcG9ydCB7IEJpdG1hcEZvbnRMb2FkZXIgfSBmcm9tICdAcGl4aS90ZXh0LWJpdG1hcCc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS90ZXh0LWJpdG1hcCc7XG5pbXBvcnQgeyBUaWNrZXJQbHVnaW4gfSBmcm9tICdAcGl4aS90aWNrZXInO1xuZXhwb3J0ICogZnJvbSAnQHBpeGkvdGlja2VyJztcbmltcG9ydCB7IEFscGhhRmlsdGVyIH0gZnJvbSAnQHBpeGkvZmlsdGVyLWFscGhhJztcbmltcG9ydCB7IEJsdXJGaWx0ZXIsIEJsdXJGaWx0ZXJQYXNzIH0gZnJvbSAnQHBpeGkvZmlsdGVyLWJsdXInO1xuaW1wb3J0IHsgQ29sb3JNYXRyaXhGaWx0ZXIgfSBmcm9tICdAcGl4aS9maWx0ZXItY29sb3ItbWF0cml4JztcbmltcG9ydCB7IERpc3BsYWNlbWVudEZpbHRlciB9IGZyb20gJ0BwaXhpL2ZpbHRlci1kaXNwbGFjZW1lbnQnO1xuaW1wb3J0IHsgRlhBQUZpbHRlciB9IGZyb20gJ0BwaXhpL2ZpbHRlci1meGFhJztcbmltcG9ydCB7IE5vaXNlRmlsdGVyIH0gZnJvbSAnQHBpeGkvZmlsdGVyLW5vaXNlJztcbmltcG9ydCAnQHBpeGkvbWl4aW4tY2FjaGUtYXMtYml0bWFwJztcbmltcG9ydCAnQHBpeGkvbWl4aW4tZ2V0LWNoaWxkLWJ5LW5hbWUnO1xuaW1wb3J0ICdAcGl4aS9taXhpbi1nZXQtZ2xvYmFsLXBvc2l0aW9uJztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9kaXNwbGF5JztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL2dyYXBoaWNzJztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL21hdGgnO1xuZXhwb3J0ICogZnJvbSAnQHBpeGkvbWVzaCc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9tZXNoLWV4dHJhcyc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS9ydW5uZXInO1xuZXhwb3J0ICogZnJvbSAnQHBpeGkvc3ByaXRlJztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL3Nwcml0ZS1hbmltYXRlZCc7XG5leHBvcnQgKiBmcm9tICdAcGl4aS90ZXh0JztcbmV4cG9ydCAqIGZyb20gJ0BwaXhpL3NldHRpbmdzJztcblxudmFyIHY1ID0gJzUuMC4wJztcblxuLyoqXG4gKiBEZXByZWNhdGlvbnMgKGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcykgYXJlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCBmb3IgYnJvd3NlciBidW5kbGVzXG4gKiBpbiB0aGUgVU1EIG1vZHVsZSBmb3JtYXQuIElmIHVzaW5nIFdlYnBhY2sgb3IgUm9sbHVwLCB5b3UnbGwgbmVlZCB0byBhcHBseSB0aGVzZVxuICogZGVwcmVjYXRpb25zIG1hbnVhbGx5IGJ5IGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4gKiBAZXhhbXBsZVxuICogaW1wb3J0ICogYXMgUElYSSBmcm9tICdwaXhpLmpzJztcbiAqIFBJWEkudXNlRGVwcmVjYXRlZCgpOyAvLyBNVVNUIGJlIGJvdW5kIHRvIG5hbWVzcGFjZVxuICogQG1lbWJlcm9mIFBJWElcbiAqIEBmdW5jdGlvbiB1c2VEZXByZWNhdGVkXG4gKi9cbmZ1bmN0aW9uIHVzZURlcHJlY2F0ZWQoKVxue1xuICAgIHZhciBQSVhJID0gdGhpcztcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBJWEksIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjb25zdGFudCB7UmVnRXhwfHN0cmluZ30gU1ZHX1NJWkVcbiAgICAgICAgICogQG1lbWJlcm9mIFBJWElcbiAgICAgICAgICogQHNlZSBQSVhJLnJlc291cmNlcy5TVkdSZXNvdXJjZS5TVkdfU0laRVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgU1ZHX1NJWkU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkudXRpbHMuU1ZHX1NJWkUgcHJvcGVydHkgaGFzIG1vdmVkIHRvIFBJWEkucmVzb3VyY2VzLlNWR1Jlc291cmNlLlNWR19TSVpFJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5TVkdSZXNvdXJjZS5TVkdfU0laRTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLlRyYW5zZm9ybVN0YXRpY1xuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAc2VlIFBJWEkuVHJhbnNmb3JtXG4gICAgICAgICAqL1xuICAgICAgICBUcmFuc2Zvcm1TdGF0aWM6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuVHJhbnNmb3JtU3RhdGljIGNsYXNzIGhhcyBiZWVuIHJlbW92ZWQsIHVzZSBQSVhJLlRyYW5zZm9ybScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkuVHJhbnNmb3JtO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkuVHJhbnNmb3JtQmFzZVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAc2VlIFBJWEkuVHJhbnNmb3JtXG4gICAgICAgICAqL1xuICAgICAgICBUcmFuc2Zvcm1CYXNlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLlRyYW5zZm9ybUJhc2UgY2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCwgdXNlIFBJWEkuVHJhbnNmb3JtJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5UcmFuc2Zvcm07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25zdGFudHMgdGhhdCBzcGVjaWZ5IHRoZSB0cmFuc2Zvcm0gdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKiBAY29uc3RhbnRcbiAgICAgICAgICogQG5hbWUgVFJBTlNGT1JNX01PREVcbiAgICAgICAgICogQG1lbWJlcm9mIFBJWElcbiAgICAgICAgICogQGVudW0ge251bWJlcn1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFNUQVRJQ1xuICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gRFlOQU1JQ1xuICAgICAgICAgKi9cbiAgICAgICAgVFJBTlNGT1JNX01PREU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuVFJBTlNGT1JNX01PREUgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgU1RBVElDOiAwLCBEWU5BTUlDOiAxIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5XZWJHTFJlbmRlcmVyXG4gICAgICAgICAqIEBzZWUgUElYSS5SZW5kZXJlclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgV2ViR0xSZW5kZXJlcjoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5XZWJHTFJlbmRlcmVyIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlJlbmRlcmVyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5SZW5kZXJlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLkNhbnZhc1JlbmRlclRhcmdldFxuICAgICAgICAgKiBAc2VlIFBJWEkudXRpbHMuQ2FudmFzUmVuZGVyVGFyZ2V0XG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBDYW52YXNSZW5kZXJUYXJnZXQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuQ2FudmFzUmVuZGVyVGFyZ2V0IGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLnV0aWxzLkNhbnZhc1JlbmRlclRhcmdldCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkudXRpbHMuQ2FudmFzUmVuZGVyVGFyZ2V0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlcm9mIFBJWElcbiAgICAgICAgICogQG5hbWUgbG9hZGVyXG4gICAgICAgICAqIEB0eXBlIHtQSVhJLkxvYWRlcn1cbiAgICAgICAgICogQHNlZSBQSVhJLkxvYWRlci5zaGFyZWRcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIGxvYWRlcjoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5sb2FkZXIgaW5zdGFuY2UgaGFzIG1vdmVkIHRvIFBJWEkuTG9hZGVyLnNoYXJlZCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkuTG9hZGVyLnNoYXJlZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLkZpbHRlck1hbmFnZXJcbiAgICAgICAgICogQHNlZSBQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBGaWx0ZXJNYW5hZ2VyOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkZpbHRlck1hbmFnZXIgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuc3lzdGVtcy5GaWx0ZXJTeXN0ZW0nKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWVzcGFjZSBQSVhJLkNhbnZhc1RpbnRlclxuICAgICAgICAgKiBAc2VlIFBJWEkuY2FudmFzVXRpbHNcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjBcbiAgICAgICAgICovXG4gICAgICAgIENhbnZhc1RpbnRlcjoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMCcsICdQSVhJLkNhbnZhc1RpbnRlciBuYW1lc3BhY2UgaGFzIG1vdmVkIHRvIFBJWEkuY2FudmFzVXRpbHMnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLmNhbnZhc1V0aWxzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWVzcGFjZSBQSVhJLkdyb3VwRDhcbiAgICAgICAgICogQHNlZSBQSVhJLmdyb3VwRDhcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjBcbiAgICAgICAgICovXG4gICAgICAgIEdyb3VwRDg6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbignNS4yLjAnLCAnUElYSS5Hcm91cEQ4IG5hbWVzcGFjZSBoYXMgbW92ZWQgdG8gUElYSS5ncm91cEQ4Jyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5ncm91cEQ4O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2UgUElYSS5wcmVwYXJlXG4gICAgICogQHNlZSBQSVhJXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjFcbiAgICAgKi9cbiAgICBQSVhJLnByZXBhcmUgPSB7fTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBJWEkucHJlcGFyZSwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkucHJlcGFyZS5CYXNlUHJlcGFyZVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjIuMVxuICAgICAgICAgKiBAc2VlIFBJWEkuQmFzZVByZXBhcmVcbiAgICAgICAgICovXG4gICAgICAgIEJhc2VQcmVwYXJlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24oJzUuMi4xJywgJ1BJWEkucHJlcGFyZS5CYXNlUHJlcGFyZSBtb3ZlZCB0byBQSVhJLkJhc2VQcmVwYXJlJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5CYXNlUHJlcGFyZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5wcmVwYXJlLlByZXBhcmVcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjFcbiAgICAgICAgICogQHNlZSBQSVhJLlByZXBhcmVcbiAgICAgICAgICovXG4gICAgICAgIFByZXBhcmU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbignNS4yLjEnLCAnUElYSS5wcmVwYXJlLlByZXBhcmUgbW92ZWQgdG8gUElYSS5QcmVwYXJlJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5QcmVwYXJlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLnByZXBhcmUuQ2FudmFzUHJlcGFyZVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjIuMVxuICAgICAgICAgKiBAc2VlIFBJWEkuQ2FudmFzUHJlcGFyZVxuICAgICAgICAgKi9cbiAgICAgICAgQ2FudmFzUHJlcGFyZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMScsICdQSVhJLnByZXBhcmUuQ2FudmFzUHJlcGFyZSBtb3ZlZCB0byBQSVhJLkNhbnZhc1ByZXBhcmUnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLkNhbnZhc1ByZXBhcmU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWVzcGFjZSBQSVhJLmV4dHJhY3RcbiAgICAgKiBAc2VlIFBJWElcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjIuMVxuICAgICAqL1xuICAgIFBJWEkuZXh0cmFjdCA9IHt9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS5leHRyYWN0LCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5leHRyYWN0LkV4dHJhY3RcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjFcbiAgICAgICAgICogQHNlZSBQSVhJLkV4dHJhY3RcbiAgICAgICAgICovXG4gICAgICAgIEV4dHJhY3Q6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbignNS4yLjEnLCAnUElYSS5leHRyYWN0LkV4dHJhY3QgbW92ZWQgdG8gUElYSS5FeHRyYWN0Jyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5FeHRyYWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLmV4dHJhY3QuQ2FudmFzRXh0cmFjdFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjIuMVxuICAgICAgICAgKiBAc2VlIFBJWEkuQ2FudmFzRXh0cmFjdFxuICAgICAgICAgKi9cbiAgICAgICAgQ2FudmFzRXh0cmFjdDoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMScsICdQSVhJLmV4dHJhY3QuQ2FudmFzRXh0cmFjdCBtb3ZlZCB0byBQSVhJLkNhbnZhc0V4dHJhY3QnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLkNhbnZhc0V4dHJhY3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBuYW1lc3BhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gQWxsIGNsYXNzZXMgcHJldmlvdXMgbmVzdGVkXG4gICAgICogdW5kZXIgdGhpcyBuYW1lc3BhY2UgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSB0b3AtbGV2ZWwgYFBJWElgIG9iamVjdC5cbiAgICAgKiBAbmFtZXNwYWNlIFBJWEkuZXh0cmFzXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKi9cbiAgICBQSVhJLmV4dHJhcyA9IHt9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS5leHRyYXMsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLmV4dHJhcy5UaWxpbmdTcHJpdGVcbiAgICAgICAgICogQHNlZSBQSVhJLlRpbGluZ1Nwcml0ZVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgVGlsaW5nU3ByaXRlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLmV4dHJhcy5UaWxpbmdTcHJpdGUgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuVGlsaW5nU3ByaXRlJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5UaWxpbmdTcHJpdGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkuZXh0cmFzLlRpbGluZ1Nwcml0ZVJlbmRlcmVyXG4gICAgICAgICAqIEBzZWUgUElYSS5UaWxpbmdTcHJpdGVSZW5kZXJlclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgVGlsaW5nU3ByaXRlUmVuZGVyZXI6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuZXh0cmFzLlRpbGluZ1Nwcml0ZVJlbmRlcmVyIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlRpbGluZ1Nwcml0ZVJlbmRlcmVyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5UaWxpbmdTcHJpdGVSZW5kZXJlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5leHRyYXMuQW5pbWF0ZWRTcHJpdGVcbiAgICAgICAgICogQHNlZSBQSVhJLkFuaW1hdGVkU3ByaXRlXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRlZFNwcml0ZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5leHRyYXMuQW5pbWF0ZWRTcHJpdGUgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuQW5pbWF0ZWRTcHJpdGUnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLkFuaW1hdGVkU3ByaXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLmV4dHJhcy5CaXRtYXBUZXh0XG4gICAgICAgICAqIEBzZWUgUElYSS5CaXRtYXBUZXh0XG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBCaXRtYXBUZXh0OiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLmV4dHJhcy5CaXRtYXBUZXh0IGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLkJpdG1hcFRleHQnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLkJpdG1hcFRleHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS51dGlscywge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uIFBJWEkudXRpbHMuZ2V0U3ZnU2l6ZVxuICAgICAgICAgKiBAc2VlIFBJWEkucmVzb3VyY2VzLlNWR1Jlc291cmNlLmdldFNpemVcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIGdldFN2Z1NpemU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkudXRpbHMuZ2V0U3ZnU2l6ZSBmdW5jdGlvbiBoYXMgbW92ZWQgdG8gUElYSS5yZXNvdXJjZXMuU1ZHUmVzb3VyY2UuZ2V0U2l6ZScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkuU1ZHUmVzb3VyY2UuZ2V0U2l6ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBbGwgY2xhc3NlcyBvbiB0aGlzIG5hbWVzcGFjZSBoYXZlIG1vdmVkIHRvIHRoZSBoaWdoLWxldmVsIGBQSVhJYCBvYmplY3QuXG4gICAgICogQG5hbWVzcGFjZSBQSVhJLm1lc2hcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqL1xuICAgIFBJWEkubWVzaCA9IHt9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS5tZXNoLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5tZXNoLk1lc2hcbiAgICAgICAgICogQHNlZSBQSVhJLlNpbXBsZU1lc2hcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIE1lc2g6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkubWVzaC5NZXNoIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlNpbXBsZU1lc2gnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLlNpbXBsZU1lc2g7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkubWVzaC5OaW5lU2xpY2VQbGFuZVxuICAgICAgICAgKiBAc2VlIFBJWEkuTmluZVNsaWNlUGxhbmVcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIE5pbmVTbGljZVBsYW5lOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLm1lc2guTmluZVNsaWNlUGxhbmUgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuTmluZVNsaWNlUGxhbmUnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLk5pbmVTbGljZVBsYW5lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLm1lc2guUGxhbmVcbiAgICAgICAgICogQHNlZSBQSVhJLlNpbXBsZVBsYW5lXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBQbGFuZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5tZXNoLlBsYW5lIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlNpbXBsZVBsYW5lJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5TaW1wbGVQbGFuZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5tZXNoLlJvcGVcbiAgICAgICAgICogQHNlZSBQSVhJLlNpbXBsZVJvcGVcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIFJvcGU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkubWVzaC5Sb3BlIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlNpbXBsZVJvcGUnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLlNpbXBsZVJvcGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkubWVzaC5SYXdNZXNoXG4gICAgICAgICAqIEBzZWUgUElYSS5NZXNoXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBSYXdNZXNoOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLm1lc2guUmF3TWVzaCBjbGFzcyBoYXMgbW92ZWQgdG8gUElYSS5NZXNoJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5NZXNoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLm1lc2guQ2FudmFzTWVzaFJlbmRlcmVyXG4gICAgICAgICAqIEBzZWUgUElYSS5DYW52YXNNZXNoUmVuZGVyZXJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIENhbnZhc01lc2hSZW5kZXJlcjoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5tZXNoLkNhbnZhc01lc2hSZW5kZXJlciBjbGFzcyBoYXMgbW92ZWQgdG8gUElYSS5DYW52YXNNZXNoUmVuZGVyZXInKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLkNhbnZhc01lc2hSZW5kZXJlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5tZXNoLk1lc2hSZW5kZXJlclxuICAgICAgICAgKiBAc2VlIFBJWEkuTWVzaFJlbmRlcmVyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBNZXNoUmVuZGVyZXI6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkubWVzaC5NZXNoUmVuZGVyZXIgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuTWVzaFJlbmRlcmVyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5NZXNoUmVuZGVyZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBuYW1lc3BhY2UgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRlbXMgaGF2ZSBiZWVuIG1vdmVkIHRvXG4gICAgICogdGhlIHRvcC1sZXZlbCBgUElYSWAgb2JqZWN0LlxuICAgICAqIEBuYW1lc3BhY2UgUElYSS5wYXJ0aWNsZXNcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqL1xuICAgIFBJWEkucGFydGljbGVzID0ge307XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQSVhJLnBhcnRpY2xlcywge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkucGFydGljbGVzLlBhcnRpY2xlQ29udGFpbmVyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqIEBzZWUgUElYSS5QYXJ0aWNsZUNvbnRhaW5lclxuICAgICAgICAgKi9cbiAgICAgICAgUGFydGljbGVDb250YWluZXI6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkucGFydGljbGVzLlBhcnRpY2xlQ29udGFpbmVyIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLlBhcnRpY2xlQ29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5QYXJ0aWNsZUNvbnRhaW5lcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2xhc3MgUElYSS5wYXJ0aWNsZXMuUGFydGljbGVSZW5kZXJlclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAc2VlIFBJWEkuUGFydGljbGVSZW5kZXJlclxuICAgICAgICAgKi9cbiAgICAgICAgUGFydGljbGVSZW5kZXJlcjoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5wYXJ0aWNsZXMuUGFydGljbGVSZW5kZXJlciBjbGFzcyBoYXMgbW92ZWQgdG8gUElYSS5QYXJ0aWNsZVJlbmRlcmVyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5QYXJ0aWNsZVJlbmRlcmVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbmFtZXNwYWNlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0ZW1zIGhhdmUgYmVlbiBtb3ZlZCB0b1xuICAgICAqIHRoZSB0b3AtbGV2ZWwgYFBJWElgIG9iamVjdC5cbiAgICAgKiBAbmFtZXNwYWNlIFBJWEkudGlja2VyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKi9cbiAgICBQSVhJLnRpY2tlciA9IHt9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS50aWNrZXIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLnRpY2tlci5UaWNrZXJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHNlZSBQSVhJLlRpY2tlclxuICAgICAgICAgKi9cbiAgICAgICAgVGlja2VyOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLnRpY2tlci5UaWNrZXIgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuVGlja2VyJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5UaWNrZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUElYSS50aWNrZXIuc2hhcmVkXG4gICAgICAgICAqIEB0eXBlIHtQSVhJLlRpY2tlcn1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHNlZSBQSVhJLlRpY2tlci5zaGFyZWRcbiAgICAgICAgICovXG4gICAgICAgIHNoYXJlZDoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS50aWNrZXIuc2hhcmVkIGluc3RhbmNlIGhhcyBtb3ZlZCB0byBQSVhJLlRpY2tlci5zaGFyZWQnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLlRpY2tlci5zaGFyZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWxsIGNsYXNzZXMgb24gdGhpcyBuYW1lc3BhY2UgaGF2ZSBtb3ZlZCB0byB0aGUgaGlnaC1sZXZlbCBgUElYSWAgb2JqZWN0LlxuICAgICAqIEBuYW1lc3BhY2UgUElYSS5sb2FkZXJzXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKi9cbiAgICBQSVhJLmxvYWRlcnMgPSB7fTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBJWEkubG9hZGVycywge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGNsYXNzIFBJWEkubG9hZGVycy5Mb2FkZXJcbiAgICAgICAgICogQHNlZSBQSVhJLkxvYWRlclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgTG9hZGVyOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLmxvYWRlcnMuTG9hZGVyIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLkxvYWRlcicpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkuTG9hZGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjbGFzcyBQSVhJLmxvYWRlcnMuUmVzb3VyY2VcbiAgICAgICAgICogQHNlZSBQSVhJLkxvYWRlclJlc291cmNlXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5sb2FkZXJzLlJlc291cmNlIGNsYXNzIGhhcyBtb3ZlZCB0byBQSVhJLkxvYWRlclJlc291cmNlJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5Mb2FkZXJSZXNvdXJjZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb24gUElYSS5sb2FkZXJzLmJpdG1hcEZvbnRQYXJzZXJcbiAgICAgICAgICogQHNlZSBQSVhJLkJpdG1hcEZvbnRMb2FkZXIudXNlXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBiaXRtYXBGb250UGFyc2VyOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLmxvYWRlcnMuYml0bWFwRm9udFBhcnNlciBmdW5jdGlvbiBoYXMgbW92ZWQgdG8gUElYSS5CaXRtYXBGb250TG9hZGVyLnVzZScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBJWEkuQml0bWFwRm9udExvYWRlci51c2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQGZ1bmN0aW9uIFBJWEkubG9hZGVycy5wYXJzZUJpdG1hcEZvbnREYXRhXG4gICAgICAgICAqIEBzZWUgUElYSS5CaXRtYXBGb250TG9hZGVyLnBhcnNlXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBwYXJzZUJpdG1hcEZvbnREYXRhOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLmxvYWRlcnMucGFyc2VCaXRtYXBGb250RGF0YSBmdW5jdGlvbiBoYXMgbW92ZWQgdG8gUElYSS5CaXRtYXBGb250TG9hZGVyLnBhcnNlJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5CaXRtYXBGb250TG9hZGVyLnBhcnNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBmdW5jdGlvbiBQSVhJLmxvYWRlcnMuc3ByaXRlc2hlZXRQYXJzZXJcbiAgICAgICAgICogQHNlZSBQSVhJLlNwcml0ZXNoZWV0TG9hZGVyLnVzZVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgc3ByaXRlc2hlZXRQYXJzZXI6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkubG9hZGVycy5zcHJpdGVzaGVldFBhcnNlciBmdW5jdGlvbiBoYXMgbW92ZWQgdG8gUElYSS5TcHJpdGVzaGVldExvYWRlci51c2UnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQSVhJLlNwcml0ZXNoZWV0TG9hZGVyLnVzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZnVuY3Rpb24gUElYSS5sb2FkZXJzLmdldFJlc291cmNlUGF0aFxuICAgICAgICAgKiBAc2VlIFBJWEkuU3ByaXRlc2hlZXRMb2FkZXIuZ2V0UmVzb3VyY2VQYXRoXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBnZXRSZXNvdXJjZVBhdGg6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkubG9hZGVycy5nZXRSZXNvdXJjZVBhdGggcHJvcGVydHkgaGFzIG1vdmVkIHRvIFBJWEkuU3ByaXRlc2hlZXRMb2FkZXIuZ2V0UmVzb3VyY2VQYXRoJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUElYSS5TcHJpdGVzaGVldExvYWRlci5nZXRSZXNvdXJjZVBhdGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIFBJWEkubG9hZGVycy5Mb2FkZXIuYWRkUGl4aU1pZGRsZXdhcmVcbiAgICAgKiBAc2VlIFBJWEkuTG9hZGVyLnJlZ2lzdGVyUGx1Z2luXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtaWRkbGV3YXJlXG4gICAgICovXG4gICAgUElYSS5Mb2FkZXIuYWRkUGl4aU1pZGRsZXdhcmUgPSBmdW5jdGlvbiBhZGRQaXhpTWlkZGxld2FyZShtaWRkbGV3YXJlKVxuICAgIHtcbiAgICAgICAgZGVwcmVjYXRpb24odjUsXG4gICAgICAgICAgICAnUElYSS5sb2FkZXJzLkxvYWRlci5hZGRQaXhpTWlkZGxld2FyZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgUElYSS5sb2FkZXJzLkxvYWRlci5yZWdpc3RlclBsdWdpbidcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gUElYSS5sb2FkZXJzLkxvYWRlci5yZWdpc3RlclBsdWdpbih7IHVzZTogbWlkZGxld2FyZSgpIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgUElYSS5leHRyYWN0LldlYkdMRXh0cmFjdFxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQHNlZSBQSVhJLkV4dHJhY3RcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUElYSS5leHRyYWN0LCAnV2ViR0xFeHRyYWN0Jywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5leHRyYWN0LldlYkdMRXh0cmFjdCBtZXRob2QgaGFzIG1vdmVkIHRvIFBJWEkuRXh0cmFjdCcpO1xuXG4gICAgICAgICAgICByZXR1cm4gUElYSS5FeHRyYWN0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGNsYXNzIFBJWEkucHJlcGFyZS5XZWJHTFByZXBhcmVcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5QcmVwYXJlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBJWEkucHJlcGFyZSwgJ1dlYkdMUHJlcGFyZScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkucHJlcGFyZS5XZWJHTFByZXBhcmUgY2xhc3MgaGFzIG1vdmVkIHRvIFBJWEkuUHJlcGFyZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gUElYSS5QcmVwYXJlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBQSVhJLkNvbnRhaW5lciNfcmVuZGVyV2ViR0xcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQHNlZSBQSVhJLkNvbnRhaW5lciNyZW5kZXJcbiAgICAgKiBAcGFyYW0ge1BJWEkuUmVuZGVyZXJ9IHJlbmRlcmVyIEluc3RhbmNlIG9mIHJlbmRlcmVyXG4gICAgICovXG4gICAgUElYSS5Db250YWluZXIucHJvdG90eXBlLl9yZW5kZXJXZWJHTCA9IGZ1bmN0aW9uIF9yZW5kZXJXZWJHTChyZW5kZXJlcilcbiAgICB7XG4gICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5Db250YWluZXIuX3JlbmRlcldlYkdMIG1ldGhvZCBoYXMgbW92ZWQgdG8gUElYSS5Db250YWluZXIuX3JlbmRlcicpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlcihyZW5kZXJlcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgUElYSS5Db250YWluZXIjcmVuZGVyV2ViR0xcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5Db250YWluZXIjcmVuZGVyXG4gICAgICogQHBhcmFtIHtQSVhJLlJlbmRlcmVyfSByZW5kZXJlciBJbnN0YW5jZSBvZiByZW5kZXJlclxuICAgICAqL1xuICAgIFBJWEkuQ29udGFpbmVyLnByb3RvdHlwZS5yZW5kZXJXZWJHTCA9IGZ1bmN0aW9uIHJlbmRlcldlYkdMKHJlbmRlcmVyKVxuICAgIHtcbiAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkNvbnRhaW5lci5yZW5kZXJXZWJHTCBtZXRob2QgaGFzIG1vdmVkIHRvIFBJWEkuQ29udGFpbmVyLnJlbmRlcicpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyKHJlbmRlcmVyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBQSVhJLkRpc3BsYXlPYmplY3QjcmVuZGVyV2ViR0xcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5EaXNwbGF5T2JqZWN0I3JlbmRlclxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgSW5zdGFuY2Ugb2YgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBQSVhJLkRpc3BsYXlPYmplY3QucHJvdG90eXBlLnJlbmRlcldlYkdMID0gZnVuY3Rpb24gcmVuZGVyV2ViR0wocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuRGlzcGxheU9iamVjdC5yZW5kZXJXZWJHTCBtZXRob2QgaGFzIG1vdmVkIHRvIFBJWEkuRGlzcGxheU9iamVjdC5yZW5kZXInKTtcblxuICAgICAgICB0aGlzLnJlbmRlcihyZW5kZXJlcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgUElYSS5Db250YWluZXIjcmVuZGVyQWR2YW5jZWRXZWJHTFxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQHNlZSBQSVhJLkNvbnRhaW5lciNyZW5kZXJBZHZhbmNlZFxuICAgICAqIEBwYXJhbSB7UElYSS5SZW5kZXJlcn0gcmVuZGVyZXIgSW5zdGFuY2Ugb2YgcmVuZGVyZXJcbiAgICAgKi9cbiAgICBQSVhJLkNvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyQWR2YW5jZWRXZWJHTCA9IGZ1bmN0aW9uIHJlbmRlckFkdmFuY2VkV2ViR0wocmVuZGVyZXIpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuQ29udGFpbmVyLnJlbmRlckFkdmFuY2VkV2ViR0wgbWV0aG9kIGhhcyBtb3ZlZCB0byBQSVhJLkNvbnRhaW5lci5yZW5kZXJBZHZhbmNlZCcpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyQWR2YW5jZWQocmVuZGVyZXIpO1xuICAgIH07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQSVhJLnNldHRpbmdzLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZhdWx0IHRyYW5zZm9ybSB0eXBlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc3RhdGljXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqIEBtZW1iZXJvZiBQSVhJLnNldHRpbmdzXG4gICAgICAgICAqIEB0eXBlIHtQSVhJLlRSQU5TRk9STV9NT0RFfVxuICAgICAgICAgKiBAZGVmYXVsdCBQSVhJLlRSQU5TRk9STV9NT0RFLlNUQVRJQ1xuICAgICAgICAgKi9cbiAgICAgICAgVFJBTlNGT1JNX01PREU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuc2V0dGluZ3MuVFJBTlNGT1JNX01PREUgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5zZXR0aW5ncy5UUkFOU0ZPUk1fTU9ERSBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgdmFyIEJhc2VUZXh0dXJlID0gUElYSS5CYXNlVGV4dHVyZTtcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgbG9hZFNvdXJjZVxuICAgICAqIEBtZW1iZXJvZiBQSVhJLkJhc2VUZXh0dXJlI1xuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUucHJvdG90eXBlLmxvYWRTb3VyY2UgPSBmdW5jdGlvbiBsb2FkU291cmNlKGltYWdlKVxuICAgIHtcbiAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkJhc2VUZXh0dXJlLmxvYWRTb3VyY2UgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQnKTtcblxuICAgICAgICB2YXIgcmVzb3VyY2UgPSBQSVhJLnJlc291cmNlcy5hdXRvRGV0ZWN0UmVzb3VyY2UoaW1hZ2UpO1xuXG4gICAgICAgIHJlc291cmNlLmludGVybmFsID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnNldFJlc291cmNlKHJlc291cmNlKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGJhc2VUZXh0dXJlSWREZXByZWNhdGlvbiA9IGZhbHNlO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmFzZVRleHR1cmUucHJvdG90eXBlLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQSVhJLkJhc2VUZXh0dXJlI2hhc0xvYWRlZFxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBzZWUgUElYSS5CYXNlVGV4dHVyZSN2YWxpZFxuICAgICAgICAgKi9cbiAgICAgICAgaGFzTG9hZGVkOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkJhc2VUZXh0dXJlLmhhc0xvYWRlZCBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkLCB1c2UgUElYSS5CYXNlVGV4dHVyZS52YWxpZCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUElYSS5CYXNlVGV4dHVyZSNpbWFnZVVybFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAc2VlIFBJWEkucmVzb3VyY2UuSW1hZ2VSZXNvdXJjZSN1cmxcbiAgICAgICAgICovXG4gICAgICAgIGltYWdlVXJsOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkJhc2VUZXh0dXJlLmltYWdlVXJsIHByb3BlcnR5IGhhcyBiZWVuIHJlbW92ZWQsIHVzZSBQSVhJLkJhc2VUZXh0dXJlLnJlc291cmNlLnVybCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2UgJiYgdGhpcy5yZXNvdXJjZS51cmw7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChpbWFnZVVybClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuQmFzZVRleHR1cmUuaW1hZ2VVcmwgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCwgdXNlIFBJWEkuQmFzZVRleHR1cmUucmVzb3VyY2UudXJsJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2UudXJsID0gaW1hZ2VVcmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBJWEkuQmFzZVRleHR1cmUjc291cmNlXG4gICAgICAgICAqIEB0eXBlIHtIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR8U1ZHRWxlbWVudH1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBzZWUgUElYSS5yZXNvdXJjZXMuQmFzZUltYWdlUmVzb3VyY2Ujc291cmNlXG4gICAgICAgICAqL1xuICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuQmFzZVRleHR1cmUuc291cmNlIHByb3BlcnR5IGhhcyBiZWVuIG1vdmVkLCB1c2UgYFBJWEkuQmFzZVRleHR1cmUucmVzb3VyY2Uuc291cmNlYCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2UgJiYgdGhpcy5yZXNvdXJjZS5zb3VyY2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoc291cmNlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5CYXNlVGV4dHVyZS5zb3VyY2UgcHJvcGVydHkgaGFzIGJlZW4gbW92ZWQsIHVzZSBgUElYSS5CYXNlVGV4dHVyZS5yZXNvdXJjZS5zb3VyY2VgICdcbiAgICAgICAgICAgICAgICAgICAgKyAnaWYgeW91IHdhbnQgdG8gc2V0IEhUTUxDYW52YXNFbGVtZW50LiBPdGhlcndpc2UsIGNyZWF0ZSBuZXcgQmFzZVRleHR1cmUuJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2Uuc291cmNlID0gc291cmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBJWEkuQmFzZVRleHR1cmUjcHJlbXVsdGlwbHlBbHBoYVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjBcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBzZWUgUElYSS5CYXNlVGV4dHVyZSNhbHBoYU1vZGVcbiAgICAgICAgICovXG4gICAgICAgIHByZW11bHRpcGx5QWxwaGE6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbignNS4yLjAnLCAnUElYSS5CYXNlVGV4dHVyZS5wcmVtdWx0aXBseUFscGhhIHByb3BlcnR5IGhhcyBiZWVuIGNoYW5nZWQgdG8gYGFscGhhTW9kZWAnXG4gICAgICAgICAgICAgICAgICAgICsgJywgc2VlIGBQSVhJLkFMUEhBX01PREVTYCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxwaGFNb2RlICE9PSAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMCcsICdQSVhJLkJhc2VUZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgcHJvcGVydHkgaGFzIGJlZW4gY2hhbmdlZCB0byBgYWxwaGFNb2RlYCdcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBzZWUgYFBJWEkuQUxQSEFfTU9ERVNgJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFscGhhTW9kZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQmF0Y2ggbG9jYWwgZmllbGQsIHN0b3JlcyBjdXJyZW50IHRleHR1cmUgbG9jYXRpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgUElYSS5CYXNlVGV4dHVyZSNfaWRcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjBcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICogQHNlZSBQSVhJLkJhc2VUZXh0dXJlI19iYXRjaExvY2F0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAoIWJhc2VUZXh0dXJlSWREZXByZWNhdGlvbilcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vICNwb3BlbHlzaGV2OiBUaGF0IHByb3BlcnR5IHdhcyBhIGhvdCBwbGFjZSwgSSBkb24ndCB3YW50IHRvIGNhbGwgZGVwcmVjYXRpb24gbWV0aG9kIG9uIGl0IGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMCcsICdQSVhJLkJhc2VUZXh0dXJlLl9pZCBiYXRjaCBsb2NhbCBmaWVsZCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBfYmF0Y2hMb2NhdGlvbmAnKTtcbiAgICAgICAgICAgICAgICAgICAgYmFzZVRleHR1cmVJZERlcHJlY2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmF0Y2hMb2NhdGlvbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYXRjaExvY2F0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tSW1hZ2VcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIFBJWEkuQmFzZVRleHR1cmVcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5CYXNlVGV4dHVyZS5mcm9tXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUuZnJvbUltYWdlID0gZnVuY3Rpb24gZnJvbUltYWdlKGNhbnZhcywgY3Jvc3NvcmlnaW4sIHNjYWxlTW9kZSwgc2NhbGUpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuQmFzZVRleHR1cmUuZnJvbUltYWdlIG1ldGhvZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIFBJWEkuQmFzZVRleHR1cmUuZnJvbScpO1xuXG4gICAgICAgIHZhciByZXNvdXJjZU9wdGlvbnMgPSB7IHNjYWxlOiBzY2FsZSwgY3Jvc3NvcmlnaW46IGNyb3Nzb3JpZ2luIH07XG5cbiAgICAgICAgcmV0dXJuIEJhc2VUZXh0dXJlLmZyb20oY2FudmFzLCB7IHNjYWxlTW9kZTogc2NhbGVNb2RlLCByZXNvdXJjZU9wdGlvbnM6IHJlc291cmNlT3B0aW9ucyB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tQ2FudmFzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJvZiBQSVhJLkJhc2VUZXh0dXJlXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAc2VlIFBJWEkuQmFzZVRleHR1cmUuZnJvbVxuICAgICAqL1xuICAgIEJhc2VUZXh0dXJlLmZyb21DYW52YXMgPSBmdW5jdGlvbiBmcm9tQ2FudmFzKGNhbnZhcywgc2NhbGVNb2RlKVxuICAgIHtcbiAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkJhc2VUZXh0dXJlLmZyb21DYW52YXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggUElYSS5CYXNlVGV4dHVyZS5mcm9tJyk7XG5cbiAgICAgICAgcmV0dXJuIEJhc2VUZXh0dXJlLmZyb20oY2FudmFzLCB7IHNjYWxlTW9kZTogc2NhbGVNb2RlIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGZyb21TVkdcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlcm9mIFBJWEkuQmFzZVRleHR1cmVcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5CYXNlVGV4dHVyZS5mcm9tXG4gICAgICovXG4gICAgQmFzZVRleHR1cmUuZnJvbVNWRyA9IGZ1bmN0aW9uIGZyb21TVkcoY2FudmFzLCBjcm9zc29yaWdpbiwgc2NhbGVNb2RlLCBzY2FsZSlcbiAgICB7XG4gICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5CYXNlVGV4dHVyZS5mcm9tU1ZHIG1ldGhvZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIFBJWEkuQmFzZVRleHR1cmUuZnJvbScpO1xuXG4gICAgICAgIHZhciByZXNvdXJjZU9wdGlvbnMgPSB7IHNjYWxlOiBzY2FsZSwgY3Jvc3NvcmlnaW46IGNyb3Nzb3JpZ2luIH07XG5cbiAgICAgICAgcmV0dXJuIEJhc2VUZXh0dXJlLmZyb20oY2FudmFzLCB7IHNjYWxlTW9kZTogc2NhbGVNb2RlLCByZXNvdXJjZU9wdGlvbnM6IHJlc291cmNlT3B0aW9ucyB9KTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUElYSS5yZXNvdXJjZXMuSW1hZ2VSZXNvdXJjZS5wcm90b3R5cGUsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBJWEkucmVzb3VyY2VzLkltYWdlUmVzb3VyY2UjcHJlbXVsdGlwbHlBbHBoYVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4yLjBcbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqIEBzZWUgUElYSS5yZXNvdXJjZXMuSW1hZ2VSZXNvdXJjZSNhbHBoYU1vZGVcbiAgICAgICAgICovXG4gICAgICAgIHByZW11bHRpcGx5QWxwaGE6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbignNS4yLjAnLCAnUElYSS5yZXNvdXJjZXMuSW1hZ2VSZXNvdXJjZS5wcmVtdWx0aXBseUFscGhhIHByb3BlcnR5ICdcbiAgICAgICAgICAgICAgICAgICAgKyAnaGFzIGJlZW4gY2hhbmdlZCB0byBgYWxwaGFNb2RlYCwgc2VlIGBQSVhJLkFMUEhBX01PREVTYCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxwaGFNb2RlICE9PSAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uKCc1LjIuMCcsICdQSVhJLnJlc291cmNlcy5JbWFnZVJlc291cmNlLnByZW11bHRpcGx5QWxwaGEgcHJvcGVydHkgJ1xuICAgICAgICAgICAgICAgICAgICArICdoYXMgYmVlbiBjaGFuZ2VkIHRvIGBhbHBoYU1vZGVgLCBzZWUgYFBJWEkuQUxQSEFfTU9ERVNgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbHBoYU1vZGUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgUElYSS5Qb2ludCNjb3B5XG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAc2VlIFBJWEkuUG9pbnQjY29weUZyb21cbiAgICAgKi9cbiAgICBQSVhJLlBvaW50LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weShwKVxuICAgIHtcbiAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLlBvaW50LmNvcHkgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggUElYSS5Qb2ludC5jb3B5RnJvbScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvcHlGcm9tKHApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIFBJWEkuT2JzZXJ2YWJsZVBvaW50I2NvcHlcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5PYnNlcnZhYmxlUG9pbnQjY29weUZyb21cbiAgICAgKi9cbiAgICBQSVhJLk9ic2VydmFibGVQb2ludC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkocClcbiAgICB7XG4gICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5PYnNlcnZhYmxlUG9pbnQuY29weSBtZXRob2QgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBQSVhJLk9ic2VydmFibGVQb2ludC5jb3B5RnJvbScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvcHlGcm9tKHApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIFBJWEkuUmVjdGFuZ2xlI2NvcHlcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5SZWN0YW5nbGUjY29weUZyb21cbiAgICAgKi9cbiAgICBQSVhJLlJlY3RhbmdsZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkocClcbiAgICB7XG4gICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5SZWN0YW5nbGUuY29weSBtZXRob2QgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBQSVhJLlJlY3RhbmdsZS5jb3B5RnJvbScpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvcHlGcm9tKHApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIFBJWEkuTWF0cml4I2NvcHlcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBzZWUgUElYSS5NYXRyaXgjY29weVRvXG4gICAgICovXG4gICAgUElYSS5NYXRyaXgucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5KHApXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuTWF0cml4LmNvcHkgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggUElYSS5NYXRyaXguY29weVRvJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29weVRvKHApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIFBJWEkuc3lzdGVtcy5TdGF0ZVN5c3RlbSNzZXRTdGF0ZVxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMS4wXG4gICAgICogQHNlZSBQSVhJLnN5c3RlbXMuU3RhdGVTeXN0ZW0jc2V0XG4gICAgICovXG4gICAgUElYSS5zeXN0ZW1zLlN0YXRlU3lzdGVtLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIHNldFN0YXRlKHMpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbigndjUuMS4wJywgJ1N0YXRlU3lzdGVtLnNldFN0YXRlIGhhcyBiZWVuIHJlbmFtZWQgdG8gU3RhdGVTeXN0ZW0uc2V0Jyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KHMpO1xuICAgIH07XG5cbiAgICBPYmplY3QuYXNzaWduKFBJWEkuc3lzdGVtcy5GaWx0ZXJTeXN0ZW0ucHJvdG90eXBlLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWV0aG9kIFBJWEkuRmlsdGVyTWFuYWdlciNnZXRSZW5kZXJUYXJnZXRcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHNlZSBQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtI2dldEZpbHRlclRleHR1cmVcbiAgICAgICAgICovXG4gICAgICAgIGdldFJlbmRlclRhcmdldDogZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0KGNsZWFyLCByZXNvbHV0aW9uKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZXByZWNhdGlvbih2NSxcbiAgICAgICAgICAgICAgICAnUElYSS5GaWx0ZXJNYW5hZ2VyLmdldFJlbmRlclRhcmdldCBtZXRob2QgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtI2dldEZpbHRlclRleHR1cmUnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJUZXh0dXJlKHJlc29sdXRpb24pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWV0aG9kIFBJWEkuRmlsdGVyTWFuYWdlciNyZXR1cm5SZW5kZXJUYXJnZXRcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICogQHNlZSBQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtI3JldHVybkZpbHRlclRleHR1cmVcbiAgICAgICAgICovXG4gICAgICAgIHJldHVyblJlbmRlclRhcmdldDogZnVuY3Rpb24gcmV0dXJuUmVuZGVyVGFyZ2V0KHJlbmRlclRleHR1cmUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LFxuICAgICAgICAgICAgICAgICdQSVhJLkZpbHRlck1hbmFnZXIucmV0dXJuUmVuZGVyVGFyZ2V0IG1ldGhvZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoICdcbiAgICAgICAgICAgICAgICArICdQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtLnJldHVybkZpbHRlclRleHR1cmUnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnJldHVybkZpbHRlclRleHR1cmUocmVuZGVyVGV4dHVyZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZXRob2QgUElYSS5zeXN0ZW1zLkZpbHRlclN5c3RlbSNjYWxjdWxhdGVTY3JlZW5TcGFjZU1hdHJpeFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAcGFyYW0ge1BJWEkuTWF0cml4fSBvdXRwdXRNYXRyaXggLSB0aGUgbWF0cml4IHRvIG91dHB1dCB0by5cbiAgICAgICAgICogQHJldHVybiB7UElYSS5NYXRyaXh9IFRoZSBtYXBwZWQgbWF0cml4LlxuICAgICAgICAgKi9cbiAgICAgICAgY2FsY3VsYXRlU2NyZWVuU3BhY2VNYXRyaXg6IGZ1bmN0aW9uIGNhbGN1bGF0ZVNjcmVlblNwYWNlTWF0cml4KG91dHB1dE1hdHJpeClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLnN5c3RlbXMuRmlsdGVyU3lzdGVtLmNhbGN1bGF0ZVNjcmVlblNwYWNlTWF0cml4IG1ldGhvZCBpcyByZW1vdmVkLCAnXG4gICAgICAgICAgICAgICAgKyAndXNlIGAodlRleHR1cmVDb29yZCAqIGlucHV0U2l6ZS54eSkgKyBvdXRwdXRGcmFtZS54eWAgaW5zdGVhZCcpO1xuXG4gICAgICAgICAgICB2YXIgbWFwcGVkTWF0cml4ID0gb3V0cHV0TWF0cml4LmlkZW50aXR5KCk7XG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5hY3RpdmVTdGF0ZTtcbiAgICAgICAgICAgIHZhciBzb3VyY2VGcmFtZSA9IHJlZi5zb3VyY2VGcmFtZTtcbiAgICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkZyYW1lID0gcmVmLmRlc3RpbmF0aW9uRnJhbWU7XG5cbiAgICAgICAgICAgIG1hcHBlZE1hdHJpeC50cmFuc2xhdGUoc291cmNlRnJhbWUueCAvIGRlc3RpbmF0aW9uRnJhbWUud2lkdGgsIHNvdXJjZUZyYW1lLnkgLyBkZXN0aW5hdGlvbkZyYW1lLmhlaWdodCk7XG4gICAgICAgICAgICBtYXBwZWRNYXRyaXguc2NhbGUoZGVzdGluYXRpb25GcmFtZS53aWR0aCwgZGVzdGluYXRpb25GcmFtZS5oZWlnaHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gbWFwcGVkTWF0cml4O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWV0aG9kIFBJWEkuc3lzdGVtcy5GaWx0ZXJTeXN0ZW0jY2FsY3VsYXRlTm9ybWFsaXplZFNjcmVlblNwYWNlTWF0cml4XG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqIEBwYXJhbSB7UElYSS5NYXRyaXh9IG91dHB1dE1hdHJpeCAtIFRoZSBtYXRyaXggdG8gb3V0cHV0IHRvLlxuICAgICAgICAgKiBAcmV0dXJuIHtQSVhJLk1hdHJpeH0gVGhlIG1hcHBlZCBtYXRyaXguXG4gICAgICAgICAqL1xuICAgICAgICBjYWxjdWxhdGVOb3JtYWxpemVkU2NyZWVuU3BhY2VNYXRyaXg6IGZ1bmN0aW9uIGNhbGN1bGF0ZU5vcm1hbGl6ZWRTY3JlZW5TcGFjZU1hdHJpeChvdXRwdXRNYXRyaXgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5zeXN0ZW1zLkZpbHRlck1hbmFnZXIuY2FsY3VsYXRlTm9ybWFsaXplZFNjcmVlblNwYWNlTWF0cml4IG1ldGhvZCBpcyByZW1vdmVkLCAnXG4gICAgICAgICAgICAgICAgKyAndXNlIGAoKHZUZXh0dXJlQ29vcmQgKiBpbnB1dFNpemUueHkpICsgb3V0cHV0RnJhbWUueHkpIC8gb3V0cHV0RnJhbWUuendgIGluc3RlYWQuJyk7XG5cbiAgICAgICAgICAgIHZhciByZWYgPSB0aGlzLmFjdGl2ZVN0YXRlO1xuICAgICAgICAgICAgdmFyIHNvdXJjZUZyYW1lID0gcmVmLnNvdXJjZUZyYW1lO1xuICAgICAgICAgICAgdmFyIGRlc3RpbmF0aW9uRnJhbWUgPSByZWYuZGVzdGluYXRpb25GcmFtZTtcbiAgICAgICAgICAgIHZhciBtYXBwZWRNYXRyaXggPSBvdXRwdXRNYXRyaXguaWRlbnRpdHkoKTtcblxuICAgICAgICAgICAgbWFwcGVkTWF0cml4LnRyYW5zbGF0ZShzb3VyY2VGcmFtZS54IC8gZGVzdGluYXRpb25GcmFtZS53aWR0aCwgc291cmNlRnJhbWUueSAvIGRlc3RpbmF0aW9uRnJhbWUuaGVpZ2h0KTtcblxuICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZVNjYWxlWCA9IChkZXN0aW5hdGlvbkZyYW1lLndpZHRoIC8gc291cmNlRnJhbWUud2lkdGgpO1xuICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZVNjYWxlWSA9IChkZXN0aW5hdGlvbkZyYW1lLmhlaWdodCAvIHNvdXJjZUZyYW1lLmhlaWdodCk7XG5cbiAgICAgICAgICAgIG1hcHBlZE1hdHJpeC5zY2FsZSh0cmFuc2xhdGVTY2FsZVgsIHRyYW5zbGF0ZVNjYWxlWSk7XG5cbiAgICAgICAgICAgIHJldHVybiBtYXBwZWRNYXRyaXg7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhQSVhJLlJlbmRlclRleHR1cmUucHJvdG90eXBlLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQSVhJLlJlbmRlclRleHR1cmUjc291cmNlRnJhbWVcbiAgICAgICAgICogQHR5cGUge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHNvdXJjZUZyYW1lOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLlJlbmRlclRleHR1cmUuc291cmNlRnJhbWUgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRnJhbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUElYSS5SZW5kZXJUZXh0dXJlI3NpemVcbiAgICAgICAgICogQHR5cGUge1BJWEkuUmVjdGFuZ2xlfVxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHNpemU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkuUmVuZGVyVGV4dHVyZS5zaXplIHByb3BlcnR5IGhhcyBiZWVuIHJlbW92ZWQnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgQmx1clhGaWx0ZXJcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5maWx0ZXJzXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAc2VlIFBJWEkuZmlsdGVycy5CbHVyRmlsdGVyUGFzc1xuICAgICAqL1xuICAgIHZhciBCbHVyWEZpbHRlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKHN1cGVyY2xhc3MpIHtcbiAgICAgICAgZnVuY3Rpb24gQmx1clhGaWx0ZXIoc3RyZW5ndGgsIHF1YWxpdHksIHJlc29sdXRpb24sIGtlcm5lbFNpemUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5maWx0ZXJzLkJsdXJYRmlsdGVyIGNsYXNzIGlzIGRlcHJlY2F0ZWQsIHVzZSBQSVhJLmZpbHRlcnMuQmx1ckZpbHRlclBhc3MnKTtcblxuICAgICAgICAgICAgc3VwZXJjbGFzcy5jYWxsKHRoaXMsIHRydWUsIHN0cmVuZ3RoLCBxdWFsaXR5LCByZXNvbHV0aW9uLCBrZXJuZWxTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggc3VwZXJjbGFzcyApIEJsdXJYRmlsdGVyLl9fcHJvdG9fXyA9IHN1cGVyY2xhc3M7XG4gICAgICAgIEJsdXJYRmlsdGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIHN1cGVyY2xhc3MgJiYgc3VwZXJjbGFzcy5wcm90b3R5cGUgKTtcbiAgICAgICAgQmx1clhGaWx0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmx1clhGaWx0ZXI7XG5cbiAgICAgICAgcmV0dXJuIEJsdXJYRmlsdGVyO1xuICAgIH0oUElYSS5maWx0ZXJzLkJsdXJGaWx0ZXJQYXNzKSk7XG5cbiAgICAvKipcbiAgICAgKiBAY2xhc3MgQmx1cllGaWx0ZXJcbiAgICAgKiBAbWVtYmVyb2YgUElYSS5maWx0ZXJzXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAc2VlIFBJWEkuZmlsdGVycy5CbHVyRmlsdGVyUGFzc1xuICAgICAqL1xuICAgIHZhciBCbHVyWUZpbHRlciA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKHN1cGVyY2xhc3MpIHtcbiAgICAgICAgZnVuY3Rpb24gQmx1cllGaWx0ZXIoc3RyZW5ndGgsIHF1YWxpdHksIHJlc29sdXRpb24sIGtlcm5lbFNpemUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5maWx0ZXJzLkJsdXJZRmlsdGVyIGNsYXNzIGlzIGRlcHJlY2F0ZWQsIHVzZSBQSVhJLmZpbHRlcnMuQmx1ckZpbHRlclBhc3MnKTtcblxuICAgICAgICAgICAgc3VwZXJjbGFzcy5jYWxsKHRoaXMsIGZhbHNlLCBzdHJlbmd0aCwgcXVhbGl0eSwgcmVzb2x1dGlvbiwga2VybmVsU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHN1cGVyY2xhc3MgKSBCbHVyWUZpbHRlci5fX3Byb3RvX18gPSBzdXBlcmNsYXNzO1xuICAgICAgICBCbHVyWUZpbHRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBzdXBlcmNsYXNzICYmIHN1cGVyY2xhc3MucHJvdG90eXBlICk7XG4gICAgICAgIEJsdXJZRmlsdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJsdXJZRmlsdGVyO1xuXG4gICAgICAgIHJldHVybiBCbHVyWUZpbHRlcjtcbiAgICB9KFBJWEkuZmlsdGVycy5CbHVyRmlsdGVyUGFzcykpO1xuXG4gICAgT2JqZWN0LmFzc2lnbihQSVhJLmZpbHRlcnMsIHtcbiAgICAgICAgQmx1clhGaWx0ZXI6IEJsdXJYRmlsdGVyLFxuICAgICAgICBCbHVyWUZpbHRlcjogQmx1cllGaWx0ZXIsXG4gICAgfSk7XG5cbiAgICB2YXIgU3ByaXRlID0gUElYSS5TcHJpdGU7XG4gICAgdmFyIFRleHR1cmUgPSBQSVhJLlRleHR1cmU7XG4gICAgdmFyIEdyYXBoaWNzID0gUElYSS5HcmFwaGljcztcblxuICAgIC8vIFN1cHBvcnQgZm9yIHBpeGkuanMtbGVnYWN5IGJpZnVyY2F0aW9uXG4gICAgLy8gZ2l2ZSB1c2VycyBhIGZyaWVuZGx5IGFzc2lzdCB0byB1c2UgbGVnYWN5XG4gICAgaWYgKCFHcmFwaGljcy5wcm90b3R5cGUuZ2VuZXJhdGVDYW52YXNUZXh0dXJlKVxuICAgIHtcbiAgICAgICAgR3JhcGhpY3MucHJvdG90eXBlLmdlbmVyYXRlQ2FudmFzVGV4dHVyZSA9IGZ1bmN0aW9uIGdlbmVyYXRlQ2FudmFzVGV4dHVyZSgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5HcmFwaGljcy5nZW5lcmF0ZUNhbnZhc1RleHR1cmUgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIFwicGl4aS5qcy1sZWdhY3lcIicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1lbWJlciB7UElYSS5HcmFwaGljc30gUElYSS5HcmFwaGljcyNncmFwaGljc0RhdGFcbiAgICAgKiBAc2VlIFBJWEkuR3JhcGhpY3MjZ2VvbWV0cnlcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUElYSS5HcmFwaGljcy5wcm90b3R5cGUsICdncmFwaGljc0RhdGEnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkdyYXBoaWNzLmdyYXBoaWNzRGF0YSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB1c2UgUElYSS5HcmFwaGljcy5nZW9tZXRyeS5ncmFwaGljc0RhdGEnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkuZ3JhcGhpY3NEYXRhO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAbWVtYmVyIHtQSVhJLlBvaW50W119IFBJWEkuU2ltcGxlUm9wZSNwb2ludHNcbiAgICAgKiBAc2VlIFBJWEkuTWVzaCNnZW9tZXRyeVxuICAgICAqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQSVhJLlNpbXBsZVJvcGUucHJvdG90eXBlLCAncG9pbnRzJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5TaW1wbGVSb3BlLnBvaW50cyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCAnXG4gICAgICAgICAgICAgICAgKyAndXNlIFBJWEkuU2ltcGxlUm9wZS5nZW9tZXRyeS5wb2ludHMnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnkucG9pbnRzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLlNpbXBsZVJvcGUucG9pbnRzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsICdcbiAgICAgICAgICAgICAgICArICd1c2UgUElYSS5TaW1wbGVSb3BlLmdlb21ldHJ5LnBvaW50cycpO1xuXG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5LnBvaW50cyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gVXNlIHRoZXNlIHRvIGRlcHJlY2F0ZSBhbGwgdGhlIFNwcml0ZSBmcm9tKiBtZXRob2RzXG4gICAgZnVuY3Rpb24gc3ByaXRlRnJvbShuYW1lLCBzb3VyY2UsIGNyb3Nzb3JpZ2luLCBzY2FsZU1vZGUpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgKFwiUElYSS5TcHJpdGUuXCIgKyBuYW1lICsgXCIgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBQSVhJLlNwcml0ZS5mcm9tXCIpKTtcblxuICAgICAgICByZXR1cm4gU3ByaXRlLmZyb20oc291cmNlLCB7XG4gICAgICAgICAgICByZXNvdXJjZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBzY2FsZTogc2NhbGVNb2RlLFxuICAgICAgICAgICAgICAgIGNyb3Nzb3JpZ2luOiBjcm9zc29yaWdpbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQHNlZSBQSVhJLlNwcml0ZS5mcm9tXG4gICAgICogQG1ldGhvZCBQSVhJLlNwcml0ZS5mcm9tSW1hZ2VcbiAgICAgKiBAcmV0dXJuIHtQSVhJLlNwcml0ZX1cbiAgICAgKi9cbiAgICBTcHJpdGUuZnJvbUltYWdlID0gc3ByaXRlRnJvbS5iaW5kKG51bGwsICdmcm9tSW1hZ2UnKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlNwcml0ZS5mcm9tU1ZHXG4gICAgICogQHNlZSBQSVhJLlNwcml0ZS5mcm9tXG4gICAgICogQHJldHVybiB7UElYSS5TcHJpdGV9XG4gICAgICovXG4gICAgU3ByaXRlLmZyb21TVkcgPSBzcHJpdGVGcm9tLmJpbmQobnVsbCwgJ2Zyb21TVkcnKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlNwcml0ZS5mcm9tQ2FudmFzXG4gICAgICogQHNlZSBQSVhJLlNwcml0ZS5mcm9tXG4gICAgICogQHJldHVybiB7UElYSS5TcHJpdGV9XG4gICAgICovXG4gICAgU3ByaXRlLmZyb21DYW52YXMgPSBzcHJpdGVGcm9tLmJpbmQobnVsbCwgJ2Zyb21DYW52YXMnKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlNwcml0ZS5mcm9tVmlkZW9cbiAgICAgKiBAc2VlIFBJWEkuU3ByaXRlLmZyb21cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlNwcml0ZX1cbiAgICAgKi9cbiAgICBTcHJpdGUuZnJvbVZpZGVvID0gc3ByaXRlRnJvbS5iaW5kKG51bGwsICdmcm9tVmlkZW8nKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlNwcml0ZS5mcm9tRnJhbWVcbiAgICAgKiBAc2VlIFBJWEkuU3ByaXRlLmZyb21cbiAgICAgKiBAcmV0dXJuIHtQSVhJLlNwcml0ZX1cbiAgICAgKi9cbiAgICBTcHJpdGUuZnJvbUZyYW1lID0gc3ByaXRlRnJvbS5iaW5kKG51bGwsICdmcm9tRnJhbWUnKTtcblxuICAgIC8vIFVzZSB0aGVzZSB0byBkZXByZWNhdGUgYWxsIHRoZSBUZXh0dXJlIGZyb20qIG1ldGhvZHNcbiAgICBmdW5jdGlvbiB0ZXh0dXJlRnJvbShuYW1lLCBzb3VyY2UsIGNyb3Nzb3JpZ2luLCBzY2FsZU1vZGUpXG4gICAge1xuICAgICAgICBkZXByZWNhdGlvbih2NSwgKFwiUElYSS5UZXh0dXJlLlwiICsgbmFtZSArIFwiIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgUElYSS5UZXh0dXJlLmZyb21cIikpO1xuXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmZyb20oc291cmNlLCB7XG4gICAgICAgICAgICByZXNvdXJjZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBzY2FsZTogc2NhbGVNb2RlLFxuICAgICAgICAgICAgICAgIGNyb3Nzb3JpZ2luOiBjcm9zc29yaWdpbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlRleHR1cmUuZnJvbUltYWdlXG4gICAgICogQHNlZSBQSVhJLlRleHR1cmUuZnJvbVxuICAgICAqIEByZXR1cm4ge1BJWEkuVGV4dHVyZX1cbiAgICAgKi9cbiAgICBUZXh0dXJlLmZyb21JbWFnZSA9IHRleHR1cmVGcm9tLmJpbmQobnVsbCwgJ2Zyb21JbWFnZScpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAbWV0aG9kIFBJWEkuVGV4dHVyZS5mcm9tU1ZHXG4gICAgICogQHNlZSBQSVhJLlRleHR1cmUuZnJvbVxuICAgICAqIEByZXR1cm4ge1BJWEkuVGV4dHVyZX1cbiAgICAgKi9cbiAgICBUZXh0dXJlLmZyb21TVkcgPSB0ZXh0dXJlRnJvbS5iaW5kKG51bGwsICdmcm9tU1ZHJyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBtZXRob2QgUElYSS5UZXh0dXJlLmZyb21DYW52YXNcbiAgICAgKiBAc2VlIFBJWEkuVGV4dHVyZS5mcm9tXG4gICAgICogQHJldHVybiB7UElYSS5UZXh0dXJlfVxuICAgICAqL1xuICAgIFRleHR1cmUuZnJvbUNhbnZhcyA9IHRleHR1cmVGcm9tLmJpbmQobnVsbCwgJ2Zyb21DYW52YXMnKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICogQG1ldGhvZCBQSVhJLlRleHR1cmUuZnJvbVZpZGVvXG4gICAgICogQHNlZSBQSVhJLlRleHR1cmUuZnJvbVxuICAgICAqIEByZXR1cm4ge1BJWEkuVGV4dHVyZX1cbiAgICAgKi9cbiAgICBUZXh0dXJlLmZyb21WaWRlbyA9IHRleHR1cmVGcm9tLmJpbmQobnVsbCwgJ2Zyb21WaWRlbycpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAbWV0aG9kIFBJWEkuVGV4dHVyZS5mcm9tRnJhbWVcbiAgICAgKiBAc2VlIFBJWEkuVGV4dHVyZS5mcm9tXG4gICAgICogQHJldHVybiB7UElYSS5UZXh0dXJlfVxuICAgICAqL1xuICAgIFRleHR1cmUuZnJvbUZyYW1lID0gdGV4dHVyZUZyb20uYmluZChudWxsLCAnZnJvbUZyYW1lJyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IFBJWEkuQWJzdHJhY3RSZW5kZXJlciNhdXRvUmVzaXplXG4gICAgICogQHNlZSBQSVhJLkFic3RyYWN0UmVuZGVyZXIjYXV0b0RlbnNpdHlcbiAgICAgKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUElYSS5BYnN0cmFjdFJlbmRlcmVyLnByb3RvdHlwZSwgJ2F1dG9SZXNpemUnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLkFic3RyYWN0UmVuZGVyZXIuYXV0b1Jlc2l6ZSBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCAnXG4gICAgICAgICAgICAgICAgKyAndXNlIFBJWEkuQWJzdHJhY3RSZW5kZXJlci5hdXRvRGVuc2l0eScpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdXRvRGVuc2l0eTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uKHY1LCAnUElYSS5BYnN0cmFjdFJlbmRlcmVyLmF1dG9SZXNpemUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCwgJ1xuICAgICAgICAgICAgICAgICsgJ3VzZSBQSVhJLkFic3RyYWN0UmVuZGVyZXIuYXV0b0RlbnNpdHknKTtcblxuICAgICAgICAgICAgdGhpcy5hdXRvRGVuc2l0eSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgKiBAbWVtYmVyIHtQSVhJLnN5c3RlbXMuVGV4dHVyZVN5c3RlbX0gUElYSS5SZW5kZXJlciN0ZXh0dXJlTWFuYWdlclxuICAgICAqIEBzZWUgUElYSS5SZW5kZXJlciN0ZXh0dXJlXG4gICAgICovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBJWEkuUmVuZGVyZXIucHJvdG90eXBlLCAndGV4dHVyZU1hbmFnZXInLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLlJlbmRlcmVyLnRleHR1cmVNYW5hZ2VyIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIHVzZSBQSVhJLlJlbmRlcmVyLnRleHR1cmUnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lc3BhY2UgUElYSS51dGlscy5taXhpbnNcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAqL1xuICAgIFBJWEkudXRpbHMubWl4aW5zID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlcm9mIFBJWEkudXRpbHMubWl4aW5zXG4gICAgICAgICAqIEBmdW5jdGlvbiBtaXhpblxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA1LjAuMFxuICAgICAgICAgKi9cbiAgICAgICAgbWl4aW46IGZ1bmN0aW9uIG1peGluKClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLnV0aWxzLm1peGlucy5taXhpbiBmdW5jdGlvbiBpcyBubyBsb25nZXIgYXZhaWxhYmxlJyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbWVtYmVyb2YgUElYSS51dGlscy5taXhpbnNcbiAgICAgICAgICogQGZ1bmN0aW9uIGRlbGF5TWl4aW5cbiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgNS4wLjBcbiAgICAgICAgICovXG4gICAgICAgIGRlbGF5TWl4aW46IGZ1bmN0aW9uIGRlbGF5TWl4aW4oKVxuICAgICAgICB7XG4gICAgICAgICAgICBkZXByZWNhdGlvbih2NSwgJ1BJWEkudXRpbHMubWl4aW5zLmRlbGF5TWl4aW4gZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZScpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQG1lbWJlcm9mIFBJWEkudXRpbHMubWl4aW5zXG4gICAgICAgICAqIEBmdW5jdGlvbiBwZXJmb3JtTWl4aW5zXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDUuMC4wXG4gICAgICAgICAqL1xuICAgICAgICBwZXJmb3JtTWl4aW5zOiBmdW5jdGlvbiBwZXJmb3JtTWl4aW5zKClcbiAgICAgICAge1xuICAgICAgICAgICAgZGVwcmVjYXRpb24odjUsICdQSVhJLnV0aWxzLm1peGlucy5wZXJmb3JtTWl4aW5zIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUnKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBJbnN0YWxsIHJlbmRlcmVyIHBsdWdpbnNcblJlbmRlcmVyLnJlZ2lzdGVyUGx1Z2luKCdhY2Nlc3NpYmlsaXR5JywgQWNjZXNzaWJpbGl0eU1hbmFnZXIpO1xuUmVuZGVyZXIucmVnaXN0ZXJQbHVnaW4oJ2V4dHJhY3QnLCBFeHRyYWN0KTtcblJlbmRlcmVyLnJlZ2lzdGVyUGx1Z2luKCdpbnRlcmFjdGlvbicsIEludGVyYWN0aW9uTWFuYWdlcik7XG5SZW5kZXJlci5yZWdpc3RlclBsdWdpbigncGFydGljbGUnLCBQYXJ0aWNsZVJlbmRlcmVyKTtcblJlbmRlcmVyLnJlZ2lzdGVyUGx1Z2luKCdwcmVwYXJlJywgUHJlcGFyZSk7XG5SZW5kZXJlci5yZWdpc3RlclBsdWdpbignYmF0Y2gnLCBCYXRjaFJlbmRlcmVyKTtcblJlbmRlcmVyLnJlZ2lzdGVyUGx1Z2luKCd0aWxpbmdTcHJpdGUnLCBUaWxpbmdTcHJpdGVSZW5kZXJlcik7XG5cbkxvYWRlci5yZWdpc3RlclBsdWdpbihCaXRtYXBGb250TG9hZGVyKTtcbkxvYWRlci5yZWdpc3RlclBsdWdpbihTcHJpdGVzaGVldExvYWRlcik7XG5cbkFwcGxpY2F0aW9uLnJlZ2lzdGVyUGx1Z2luKFRpY2tlclBsdWdpbik7XG5BcHBsaWNhdGlvbi5yZWdpc3RlclBsdWdpbihBcHBMb2FkZXJQbHVnaW4pO1xuXG4vKipcbiAqIFN0cmluZyBvZiB0aGUgY3VycmVudCBQSVhJIHZlcnNpb24uXG4gKlxuICogQHN0YXRpY1xuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyb2YgUElYSVxuICogQG5hbWUgVkVSU0lPTlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xudmFyIFZFUlNJT04gPSAnNS4yLjMnO1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgUElYSVxuICovXG5cbi8qKlxuICogVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgV2ViR0wtb25seSBkaXNwbGF5IGZpbHRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZFxuICogdG8gRGlzcGxheU9iamVjdHMgdXNpbmcgdGhlIHtAbGluayBQSVhJLkRpc3BsYXlPYmplY3QjZmlsdGVycyBmaWx0ZXJzfSBwcm9wZXJ0eS5cbiAqXG4gKiBTaW5jZSBQaXhpSlMgb25seSBoYWQgYSBoYW5kZnVsIG9mIGJ1aWx0LWluIGZpbHRlcnMsIGFkZGl0aW9uYWwgZmlsdGVyc1xuICogY2FuIGJlIGRvd25sb2FkZWQge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9waXhpanMvcGl4aS1maWx0ZXJzIGhlcmV9IGZyb20gdGhlXG4gKiBQaXhpSlMgRmlsdGVycyByZXBvc2l0b3J5LlxuICpcbiAqIEFsbCBmaWx0ZXJzIG11c3QgZXh0ZW5kIHtAbGluayBQSVhJLkZpbHRlcn0uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyBhcHBsaWNhdGlvblxuICogY29uc3QgYXBwID0gbmV3IFBJWEkuQXBwbGljYXRpb24oKTtcbiAqXG4gKiAvLyBEcmF3IGEgZ3JlZW4gcmVjdGFuZ2xlXG4gKiBjb25zdCByZWN0ID0gbmV3IFBJWEkuR3JhcGhpY3MoKVxuICogICAgIC5iZWdpbkZpbGwoMHgwMGZmMDApXG4gKiAgICAgLmRyYXdSZWN0KDQwLCA0MCwgMjAwLCAyMDApO1xuICpcbiAqIC8vIEFkZCBhIGJsdXIgZmlsdGVyXG4gKiByZWN0LmZpbHRlcnMgPSBbbmV3IFBJWEkuZmlsdGVycy5CbHVyRmlsdGVyKCldO1xuICpcbiAqIC8vIERpc3BsYXkgcmVjdGFuZ2xlXG4gKiBhcHAuc3RhZ2UuYWRkQ2hpbGQocmVjdCk7XG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGFwcC52aWV3KTtcbiAqIEBuYW1lc3BhY2UgUElYSS5maWx0ZXJzXG4gKi9cbnZhciBmaWx0ZXJzID0ge1xuICAgIEFscGhhRmlsdGVyOiBBbHBoYUZpbHRlcixcbiAgICBCbHVyRmlsdGVyOiBCbHVyRmlsdGVyLFxuICAgIEJsdXJGaWx0ZXJQYXNzOiBCbHVyRmlsdGVyUGFzcyxcbiAgICBDb2xvck1hdHJpeEZpbHRlcjogQ29sb3JNYXRyaXhGaWx0ZXIsXG4gICAgRGlzcGxhY2VtZW50RmlsdGVyOiBEaXNwbGFjZW1lbnRGaWx0ZXIsXG4gICAgRlhBQUZpbHRlcjogRlhBQUZpbHRlcixcbiAgICBOb2lzZUZpbHRlcjogTm9pc2VGaWx0ZXIsXG59O1xuXG5leHBvcnQgeyBWRVJTSU9OLCBmaWx0ZXJzLCB1c2VEZXByZWNhdGVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1waXhpLmVzLmpzLm1hcFxuIiwiaW1wb3J0ICdjb3JlLWpzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFBoYXNlciBmcm9tICdwaGFzZXInXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSdcbmltcG9ydCAqIGFzIFBJWEkgZnJvbSAncGl4aS5qcydcblxuWydhZi5qcycsICdhci1kei5qcycsICdhci1rdy5qcycsICdhci1seS5qcycsICdhci1tYS5qcycsICdhci1zYS5qcycsJ2FyLXRuLmpzJywgJ2FyLmpzJyxcbiAnYXouanMnLCAnYmUuanMnLCAnYmcuanMnLCAnYm0uanMnLCAnYm4uanMnLCAnYm8uanMnLCAnYnIuanMnLCdicy5qcycsICdjYS5qcycsICdjcy5qcycsXG4gJ2N2LmpzJywgJ2N5LmpzJywgJ2RhLmpzJywgJ2RlLWF0LmpzJywgJ2RlLWNoLmpzJywgJ2RlLmpzJywgJ2R2LmpzJywgJ2VsLmpzJywgJ2VuLWF1LmpzJyxcbiAnZW4tY2EuanMnLCAnZW4tZ2IuanMnLCAnZW4taWUuanMnLCAnZW4taWwuanMnLCAnZW4tbnouanMnLCdlbi1TRy5qcycsICdlby5qcycsICdlcy1kby5qcycsXG4gJ2VzLXVzLmpzJywgJ2VzLmpzJywgJ2V0LmpzJywgJ2V1LmpzJywgJ2ZhLmpzJywgJ2ZpLmpzJywgJ2ZvLmpzJywgJ2ZyLWNhLmpzJywgJ2ZyLWNoLmpzJyxcbiAnZnIuanMnLCAnZnkuanMnLCAnZ2EuanMnLCAnZ2QuanMnLCAnZ2wuanMnLCAnZ29tLWxhdG4uanMnLCAnZ3UuanMnLCAnaGUuanMnLCAnaGkuanMnLFxuICdoci5qcycsICdodS5qcycsICdoeS1hbS5qcycsICdpZC5qcycsICdpcy5qcycsICdpdC1jaC5qcycsICdpdC5qcycsICdqYS5qcycsICdqdi5qcycsXG4gJ2thLmpzJywgJ2trLmpzJywgJ2ttLmpzJywgJ2tuLmpzJywgJ2tvLmpzJywgJ2t1LmpzJywgJ2t5LmpzJywgJ2xiLmpzJywgJ2xvLmpzJywgJ2x0LmpzJyxcbiAnbHYuanMnLCAnbWUuanMnLCAnbWkuanMnLCAnbWsuanMnLCAnbWwuanMnLCAnbW4uanMnLCAnbXIuanMnLCAnbXMtbXkuanMnLCAnbXMuanMnLCAnbXQuanMnLFxuICdteS5qcycsICduYi5qcycsICduZS5qcycsICdubC1iZS5qcycsICdubC5qcycsICdubi5qcycsJ3BhLWluLmpzJywgJ3BsLmpzJywgJ3B0LWJyLmpzJyxcbiAncHQuanMnLCAncm8uanMnLCAncnUuanMnLCAnc2QuanMnLCAnc2UuanMnLCAnc2kuanMnLCAnc2suanMnLCAnc2wuanMnLCAnc3EuanMnLFxuICdzci1jeXJsLmpzJywgJ3NyLmpzJywgJ3NzLmpzJywgJ3N2LmpzJywgJ3N3LmpzJywgJ3RhLmpzJywgJ3RlLmpzJywgJ3RldC5qcycsICd0Zy5qcycsXG4gJ3RoLmpzJywgJ3RsLXBoLmpzJywgJ3RsaC5qcycsICd0ci5qcycsICd0emwuanMnLCAndHptLWxhdG4uanMnLCAndHptLmpzJywgJ3VnLWNuLmpzJyxcbiAndWsuanMnLCAndXIuanMnLCAndXotbGF0bi5qcycsICd1ei5qcycsICd2aS5qcycsICd4LXBzZXVkby5qcycsICd5by5qcycsICd6aC1jbi5qcycsXG4gJ3poLWhrLmpzJywgJ3poLXR3LmpzJ10uZm9yRWFjaChsb2NhbGUgPT4ge1xuICAgIHJlcXVpcmUoYG1vbWVudC9sb2NhbGUvJHtsb2NhbGV9YCk7XG4gIH0pXG5cbm1vbWVudCgpLmZvcm1hdCgnTU1NTSBEbyBZWVlZLCBoOm1tOnNzIGEnKTtcblxuXy5jYXBpdGFsaXplKCdoZWxsbyDwn4yNJyk7XG5cbiQudHJpbSgnIPCfmK4gJyk7XG5cbm5ldyBQaGFzZXIuR2FtZSgpO1xuXG5uZXcgVEhSRUUuU2NlbmUoKTtcblxubmV3IFBJWEkuQXBwbGljYXRpb24oKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=

Callers 1

tFunction · 0.85

Calls 4

rFunction · 0.85
tFunction · 0.85
EPFunction · 0.85
sFunction · 0.85

Tested by

no test coverage detected